swig-4.0.2/0000755000175000017500000000000013667507562012365 5ustar williamwilliamswig-4.0.2/INSTALL0000644000175000017500000002200513667507523013412 0ustar williamwilliamBasic Installation ================== These are generic installation instructions. 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 only 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. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. 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. 4. Type `make install' to install the programs and any data files and documentation. 5. 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. 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 variables by setting them in the environment. You can do that on the command line like this: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Environment 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 must use a version of `make' that supports the `VPATH' variable, such as 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 `..'. If you have to use a `make' that does not support the `VPATH' variable, you have 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. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' 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. 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'. Optional Features ================= 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. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it cannot guess the host 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 host type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option 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'. In this case, you should also specify the build platform with `--build=TYPE', because, in this case, it may not be possible to guess the build platform (it sometimes involves compiling and running simple test programs, and this can't be done if the compiler is a cross compiler). 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. Environment 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 will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--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. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. swig-4.0.2/Source/0000755000175000017500000000000013667507560013623 5ustar williamwilliamswig-4.0.2/Source/Preprocessor/0000755000175000017500000000000013667507523016310 5ustar williamwilliamswig-4.0.2/Source/Preprocessor/expr.c0000644000175000017500000003111113667507523017427 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * expr.c * * Integer arithmetic expression evaluator used to handle expressions * encountered during preprocessing. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "preprocessor.h" static Scanner *scan = 0; typedef struct { int op; long value; String *svalue; } exprval; #define EXPR_TOP 1 #define EXPR_VALUE 2 #define EXPR_OP 3 #define EXPR_GROUP 4 #define EXPR_UMINUS 100 static exprval stack[256]; /* Parsing stack */ static int sp = 0; /* Stack pointer */ static int prec[256]; /* Precedence rules */ static int expr_init = 0; /* Initialization flag */ static const char *errmsg = 0; /* Parsing error */ /* Initialize the precedence table for various operators. Low values have higher precedence */ static void init_precedence() { prec[SWIG_TOKEN_NOT] = 10; prec[EXPR_UMINUS] = 10; prec[SWIG_TOKEN_STAR] = 20; prec[SWIG_TOKEN_SLASH] = 20; prec[SWIG_TOKEN_PERCENT] = 20; prec[SWIG_TOKEN_PLUS] = 30; prec[SWIG_TOKEN_MINUS] = 30; prec[SWIG_TOKEN_LSHIFT] = 40; prec[SWIG_TOKEN_RSHIFT] = 40; prec[SWIG_TOKEN_AND] = 50; prec[SWIG_TOKEN_XOR] = 60; prec[SWIG_TOKEN_OR] = 70; prec[SWIG_TOKEN_EQUALTO] = 80; prec[SWIG_TOKEN_NOTEQUAL] = 80; prec[SWIG_TOKEN_LESSTHAN] = 80; prec[SWIG_TOKEN_GREATERTHAN] = 80; prec[SWIG_TOKEN_LTEQUAL] = 80; prec[SWIG_TOKEN_GTEQUAL] = 80; prec[SWIG_TOKEN_LNOT] = 90; prec[SWIG_TOKEN_LAND] = 100; prec[SWIG_TOKEN_LOR] = 110; expr_init = 1; } #define UNARY_OP(token) (((token) == SWIG_TOKEN_NOT) || \ ((token) == SWIG_TOKEN_LNOT) || \ ((token) == EXPR_UMINUS)) /* Reduce a single operator on the stack */ /* return 0 on failure, 1 on success */ static int reduce_op() { long op_token = stack[sp - 1].value; assert(sp > 0); assert(stack[sp - 1].op == EXPR_OP); /* do some basic checking first: */ if (stack[sp].op != EXPR_VALUE) { errmsg = "Right-hand side is not value"; return 0; } if (UNARY_OP(op_token)) { if (stack[sp].svalue) { errmsg = "Syntax error: attempt to apply unary operator to string"; return 0; } } else { /* binary operator: */ if (sp == 1) { /* top of stack: don't attempt to use sp-2! */ errmsg = "Missing left-hand side for binary operator"; return 0; } if (stack[sp].op != EXPR_VALUE) { errmsg = "Left-hand side of binary operator is not a value"; return 0; } if ((!stack[sp - 2].svalue) != (!stack[sp].svalue)) { errmsg = "Can't mix strings and integers in expression"; return 0; } } if (stack[sp].svalue) { /* A binary string expression */ switch (stack[sp - 1].value) { case SWIG_TOKEN_EQUALTO: stack[sp - 2].value = (Strcmp(stack[sp - 2].svalue, stack[sp].svalue) == 0); Delete(stack[sp - 2].svalue); Delete(stack[sp].svalue); sp -= 2; break; case SWIG_TOKEN_NOTEQUAL: stack[sp - 2].value = (Strcmp(stack[sp - 2].svalue, stack[sp].svalue) != 0); Delete(stack[sp - 2].svalue); Delete(stack[sp].svalue); sp -= 2; break; default: errmsg = "Syntax error: bad binary operator for strings"; return 0; break; } } else { switch (op_token) { case SWIG_TOKEN_STAR: stack[sp - 2].value = stack[sp - 2].value * stack[sp].value; sp -= 2; break; case SWIG_TOKEN_EQUALTO: stack[sp - 2].value = stack[sp - 2].value == stack[sp].value; sp -= 2; break; case SWIG_TOKEN_NOTEQUAL: stack[sp - 2].value = stack[sp - 2].value != stack[sp].value; sp -= 2; break; case SWIG_TOKEN_PLUS: stack[sp - 2].value = stack[sp - 2].value + stack[sp].value; sp -= 2; break; case SWIG_TOKEN_MINUS: stack[sp - 2].value = stack[sp - 2].value - stack[sp].value; sp -= 2; break; case SWIG_TOKEN_AND: stack[sp - 2].value = stack[sp - 2].value & stack[sp].value; sp -= 2; break; case SWIG_TOKEN_LAND: stack[sp - 2].value = stack[sp - 2].value && stack[sp].value; sp -= 2; break; case SWIG_TOKEN_OR: stack[sp - 2].value = stack[sp - 2].value | stack[sp].value; sp -= 2; break; case SWIG_TOKEN_LOR: stack[sp - 2].value = stack[sp - 2].value || stack[sp].value; sp -= 2; break; case SWIG_TOKEN_XOR: stack[sp - 2].value = stack[sp - 2].value ^ stack[sp].value; sp -= 2; break; case SWIG_TOKEN_LESSTHAN: stack[sp - 2].value = stack[sp - 2].value < stack[sp].value; sp -= 2; break; case SWIG_TOKEN_GREATERTHAN: stack[sp - 2].value = stack[sp - 2].value > stack[sp].value; sp -= 2; break; case SWIG_TOKEN_LTEQUAL: stack[sp - 2].value = stack[sp - 2].value <= stack[sp].value; sp -= 2; break; case SWIG_TOKEN_GTEQUAL: stack[sp - 2].value = stack[sp - 2].value >= stack[sp].value; sp -= 2; break; case SWIG_TOKEN_NOT: stack[sp - 1].value = ~stack[sp].value; sp--; break; case SWIG_TOKEN_LNOT: stack[sp - 1].value = !stack[sp].value; sp--; break; case EXPR_UMINUS: stack[sp - 1].value = -stack[sp].value; sp--; break; case SWIG_TOKEN_SLASH: if (stack[sp].value != 0) { stack[sp - 2].value = stack[sp - 2].value / stack[sp].value; sp -= 2; } else { errmsg = "Division by zero in expression"; return 0; } break; case SWIG_TOKEN_PERCENT: if (stack[sp].value != 0) { stack[sp - 2].value = stack[sp - 2].value % stack[sp].value; sp -= 2; } else { errmsg = "Modulo by zero in expression"; return 0; } break; case SWIG_TOKEN_LSHIFT: stack[sp - 2].value = stack[sp - 2].value << stack[sp].value; sp -= 2; break; case SWIG_TOKEN_RSHIFT: stack[sp - 2].value = stack[sp - 2].value >> stack[sp].value; sp -= 2; break; default: errmsg = "Syntax error: bad operator"; return 0; break; } } stack[sp].op = EXPR_VALUE; stack[sp].svalue = 0; /* ensure it's not a string! */ return 1; } /* ----------------------------------------------------------------------------- * Preprocessor_expr_init() * * Initialize the expression evaluator * ----------------------------------------------------------------------------- */ void Preprocessor_expr_init(void) { if (!expr_init) init_precedence(); if (!scan) scan = NewScanner(); } void Preprocessor_expr_delete(void) { DelScanner(scan); } /* ----------------------------------------------------------------------------- * Tokenizer * ----------------------------------------------------------------------------- */ static int expr_token(Scanner * s) { int t; while (1) { t = Scanner_token(s); if (!((t == SWIG_TOKEN_BACKSLASH) || (t == SWIG_TOKEN_ENDLINE) || (t == SWIG_TOKEN_COMMENT))) break; } return t; } /* ----------------------------------------------------------------------------- * Preprocessor_expr() * * Evaluates an arithmetic expression. Returns the result and sets an error code. * ----------------------------------------------------------------------------- */ int Preprocessor_expr(DOH *s, int *error) { int token = 0; int op = 0; sp = 0; assert(s); assert(scan); Seek(s, 0, SEEK_SET); /* Printf(stdout,"evaluating : '%s'\n", s); */ *error = 0; Scanner_clear(scan); Scanner_push(scan, s); /* Put initial state onto the stack */ stack[sp].op = EXPR_TOP; stack[sp].value = 0; while (1) { /* Look at the top of the stack */ switch (stack[sp].op) { case EXPR_TOP: /* An expression. Can be a number or another expression enclosed in parens */ token = expr_token(scan); if (!token) { errmsg = "Expected an expression"; *error = 1; return 0; } if ((token == SWIG_TOKEN_INT) || (token == SWIG_TOKEN_UINT) || (token == SWIG_TOKEN_LONG) || (token == SWIG_TOKEN_ULONG)) { /* A number. Reduce EXPR_TOP to an EXPR_VALUE */ char *c = Char(Scanner_text(scan)); stack[sp].value = (long) strtol(c, 0, 0); stack[sp].svalue = 0; /* stack[sp].value = (long) atol(Char(Scanner_text(scan))); */ stack[sp].op = EXPR_VALUE; } else if (token == SWIG_TOKEN_PLUS) { } else if ((token == SWIG_TOKEN_MINUS) || (token == SWIG_TOKEN_LNOT) || (token == SWIG_TOKEN_NOT)) { if (token == SWIG_TOKEN_MINUS) token = EXPR_UMINUS; stack[sp].value = token; stack[sp++].op = EXPR_OP; stack[sp].op = EXPR_TOP; stack[sp].svalue = 0; } else if (token == SWIG_TOKEN_LPAREN) { stack[sp++].op = EXPR_GROUP; stack[sp].op = EXPR_TOP; stack[sp].value = 0; stack[sp].svalue = 0; } else if (token == SWIG_TOKEN_ENDLINE) { } else if (token == SWIG_TOKEN_STRING) { stack[sp].svalue = NewString(Scanner_text(scan)); stack[sp].op = EXPR_VALUE; } else if (token == SWIG_TOKEN_ID) { stack[sp].value = 0; stack[sp].svalue = 0; stack[sp].op = EXPR_VALUE; } else if ((token == SWIG_TOKEN_FLOAT) || (token == SWIG_TOKEN_DOUBLE)) { errmsg = "Floating point constant in preprocessor expression"; *error = 1; return 0; } else goto syntax_error; break; case EXPR_VALUE: /* A value is on the stack. We may reduce or evaluate depending on what the next token is */ token = expr_token(scan); if (!token) { /* End of input. Might have to reduce if an operator is on stack */ while (sp > 0) { if (stack[sp - 1].op == EXPR_OP) { if (!reduce_op()) goto reduce_error; } else if (stack[sp - 1].op == EXPR_GROUP) { errmsg = "Missing \')\'"; *error = 1; return 0; } else goto syntax_error; } return stack[sp].value; } /* Token must be an operator */ switch (token) { case SWIG_TOKEN_STAR: case SWIG_TOKEN_EQUALTO: case SWIG_TOKEN_NOTEQUAL: case SWIG_TOKEN_PLUS: case SWIG_TOKEN_MINUS: case SWIG_TOKEN_AND: case SWIG_TOKEN_LAND: case SWIG_TOKEN_OR: case SWIG_TOKEN_LOR: case SWIG_TOKEN_XOR: case SWIG_TOKEN_LESSTHAN: case SWIG_TOKEN_GREATERTHAN: case SWIG_TOKEN_LTEQUAL: case SWIG_TOKEN_GTEQUAL: case SWIG_TOKEN_SLASH: case SWIG_TOKEN_PERCENT: case SWIG_TOKEN_LSHIFT: case SWIG_TOKEN_RSHIFT: if ((sp == 0) || (stack[sp - 1].op == EXPR_GROUP)) { /* No possibility of reduce. Push operator and expression */ sp++; stack[sp].op = EXPR_OP; stack[sp].value = token; sp++; stack[sp].op = EXPR_TOP; stack[sp].value = 0; } else { if (stack[sp - 1].op != EXPR_OP) goto syntax_error_expected_operator; op = stack[sp - 1].value; /* Previous operator */ /* Now, depending on the precedence relationship between the last operator and the current we will reduce or push */ if (prec[op] <= prec[token]) { /* Reduce the previous operator */ if (!reduce_op()) goto reduce_error; } sp++; stack[sp].op = EXPR_OP; stack[sp].value = token; sp++; stack[sp].op = EXPR_TOP; stack[sp].value = 0; } break; case SWIG_TOKEN_RPAREN: if (sp == 0) goto extra_rparen; /* Might have to reduce operators first */ while ((sp > 0) && (stack[sp - 1].op == EXPR_OP)) { if (!reduce_op()) goto reduce_error; } if ((sp == 0) || (stack[sp - 1].op != EXPR_GROUP)) goto extra_rparen; stack[sp - 1].op = EXPR_VALUE; stack[sp - 1].value = stack[sp].value; sp--; break; default: goto syntax_error_expected_operator; break; } break; default: fprintf(stderr, "Internal error in expression evaluator.\n"); abort(); } } syntax_error: errmsg = "Syntax error"; *error = 1; return 0; syntax_error_expected_operator: errmsg = "Syntax error: expected operator"; *error = 1; return 0; reduce_error: /* errmsg has been set by reduce_op */ *error = 1; return 0; extra_rparen: errmsg = "Extra \')\'"; *error = 1; return 0; } /* ----------------------------------------------------------------------------- * Preprocessor_expr_error() * * Return error message set by the evaluator (if any) * ----------------------------------------------------------------------------- */ const char *Preprocessor_expr_error() { return errmsg; } swig-4.0.2/Source/Preprocessor/preprocessor.h0000644000175000017500000000273313667507523021214 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * preprocessor.h * * SWIG preprocessor module. * ----------------------------------------------------------------------------- */ #ifndef SWIG_PREPROCESSOR_H_ #define SWIG_PREPROCESSOR_H_ #include "swigwarn.h" #ifdef __cplusplus extern "C" { #endif extern int Preprocessor_expr(String *s, int *error); extern const char *Preprocessor_expr_error(void); extern Hash *Preprocessor_define(const_String_or_char_ptr str, int swigmacro); extern void Preprocessor_undef(const_String_or_char_ptr name); extern void Preprocessor_init(void); extern void Preprocessor_delete(void); extern String *Preprocessor_parse(String *s); extern void Preprocessor_include_all(int); extern void Preprocessor_import_all(int); extern void Preprocessor_ignore_missing(int); extern void Preprocessor_error_as_warning(int); extern List *Preprocessor_depend(void); extern void Preprocessor_expr_init(void); extern void Preprocessor_expr_delete(void); #ifdef __cplusplus } #endif #endif swig-4.0.2/Source/Preprocessor/cpp.c0000644000175000017500000015063113667507523017244 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * cpp.c * * An implementation of a C preprocessor plus some support for additional * SWIG directives. * * - SWIG directives such as %include, %extern, and %import are handled * - A new macro %define ... %enddef can be used for multiline macros * - No preprocessing is performed in %{ ... %} blocks * - Lines beginning with %# are stripped down to #... and passed through. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "preprocessor.h" #include static Hash *cpp = 0; /* C preprocessor data */ static int include_all = 0; /* Follow all includes */ static int ignore_missing = 0; static int import_all = 0; /* Follow all includes, but as %import statements */ static int imported_depth = 0; /* Depth of %imported files */ static int single_include = 1; /* Only include each file once */ static Hash *included_files = 0; static List *dependencies = 0; static Scanner *id_scan = 0; static int error_as_warning = 0; /* Understand the cpp #error directive as a special #warning */ static int expand_defined_operator = 0; static int macro_level = 0; static int macro_start_line = 0; static const String * macro_start_file = 0; /* Test a character to see if it starts an identifier */ #define isidentifier(c) ((isalpha(c)) || (c == '_') || (c == '$')) /* Test a character to see if it valid in an identifier (after the first letter) */ #define isidchar(c) ((isalnum(c)) || (c == '_') || (c == '$')) static DOH *Preprocessor_replace(DOH *); /* Skip whitespace */ static void skip_whitespace(String *s, String *out) { int c; while ((c = Getc(s)) != EOF) { if (!isspace(c)) { Ungetc(c, s); break; } else if (out) Putc(c, out); } } /* Skip to a specified character taking line breaks into account */ static int skip_tochar(String *s, int ch, String *out) { int c; while ((c = Getc(s)) != EOF) { if (out) Putc(c, out); if (c == ch) break; if (c == '\\') { c = Getc(s); if ((c != EOF) && (out)) Putc(c, out); } } if (c == EOF) return -1; return 0; } static void copy_location(const DOH *s1, DOH *s2) { Setfile(s2, Getfile((DOH *) s1)); Setline(s2, Getline((DOH *) s1)); } static String *cpp_include(const_String_or_char_ptr fn, int sysfile) { String *s = sysfile ? Swig_include_sys(fn) : Swig_include(fn); if (s && single_include) { String *file = Getfile(s); if (Getattr(included_files, file)) { Delete(s); return 0; } Setattr(included_files, file, file); } if (!s) { if (ignore_missing) { Swig_warning(WARN_PP_MISSING_FILE, Getfile(fn), Getline(fn), "Unable to find '%s'\n", fn); } else { Swig_error(Getfile(fn), Getline(fn), "Unable to find '%s'\n", fn); } } else { String *lf; Seek(s, 0, SEEK_SET); if (!dependencies) { dependencies = NewList(); } lf = Copy(Swig_last_file()); Append(dependencies, lf); Delete(lf); } return s; } static int is_digits(const String *str) { const char *s = Char(str); int isdigits = (*s != 0); while (*s) { if (!isdigit(*s)) { isdigits = 0; break; } s++; } return isdigits; } List *Preprocessor_depend(void) { return dependencies; } /* ----------------------------------------------------------------------------- * void Preprocessor_cpp_init() - Initialize the preprocessor * ----------------------------------------------------------------------------- */ static String *kpp_args = 0; static String *kpp_define = 0; static String *kpp_defined = 0; static String *kpp_elif = 0; static String *kpp_else = 0; static String *kpp_endif = 0; static String *kpp_expanded = 0; static String *kpp_if = 0; static String *kpp_ifdef = 0; static String *kpp_ifndef = 0; static String *kpp_name = 0; static String *kpp_swigmacro = 0; static String *kpp_symbols = 0; static String *kpp_undef = 0; static String *kpp_value = 0; static String *kpp_varargs = 0; static String *kpp_error = 0; static String *kpp_warning = 0; static String *kpp_line = 0; static String *kpp_include = 0; static String *kpp_pragma = 0; static String *kpp_level = 0; static String *kpp_dline = 0; static String *kpp_ddefine = 0; static String *kpp_dinclude = 0; static String *kpp_dimport = 0; static String *kpp_dbeginfile = 0; static String *kpp_dextern = 0; static String *kpp_LINE = 0; static String *kpp_FILE = 0; static String *kpp_hash_if = 0; static String *kpp_hash_elif = 0; void Preprocessor_init(void) { Hash *s; kpp_args = NewString("args"); kpp_define = NewString("define"); kpp_defined = NewString("defined"); kpp_else = NewString("else"); kpp_elif = NewString("elif"); kpp_endif = NewString("endif"); kpp_expanded = NewString("*expanded*"); kpp_if = NewString("if"); kpp_ifdef = NewString("ifdef"); kpp_ifndef = NewString("ifndef"); kpp_name = NewString("name"); kpp_swigmacro = NewString("swigmacro"); kpp_symbols = NewString("symbols"); kpp_undef = NewString("undef"); kpp_value = NewString("value"); kpp_error = NewString("error"); kpp_warning = NewString("warning"); kpp_pragma = NewString("pragma"); kpp_level = NewString("level"); kpp_line = NewString("line"); kpp_include = NewString("include"); kpp_varargs = NewString("varargs"); kpp_dinclude = NewString("%include"); kpp_dimport = NewString("%import"); kpp_dbeginfile = NewString("%beginfile"); kpp_dextern = NewString("%extern"); kpp_ddefine = NewString("%define"); kpp_dline = NewString("%line"); kpp_LINE = NewString("__LINE__"); kpp_FILE = NewString("__FILE__"); kpp_hash_if = NewString("#if"); kpp_hash_elif = NewString("#elif"); cpp = NewHash(); s = NewHash(); Setattr(cpp, kpp_symbols, s); Delete(s); Preprocessor_expr_init(); /* Initialize the expression evaluator */ included_files = NewHash(); id_scan = NewScanner(); } void Preprocessor_delete(void) { Delete(kpp_args); Delete(kpp_define); Delete(kpp_defined); Delete(kpp_else); Delete(kpp_elif); Delete(kpp_endif); Delete(kpp_expanded); Delete(kpp_if); Delete(kpp_ifdef); Delete(kpp_ifndef); Delete(kpp_name); Delete(kpp_swigmacro); Delete(kpp_symbols); Delete(kpp_undef); Delete(kpp_value); Delete(kpp_error); Delete(kpp_warning); Delete(kpp_pragma); Delete(kpp_level); Delete(kpp_line); Delete(kpp_include); Delete(kpp_varargs); Delete(kpp_dinclude); Delete(kpp_dimport); Delete(kpp_dbeginfile); Delete(kpp_dextern); Delete(kpp_ddefine); Delete(kpp_dline); Delete(kpp_LINE); Delete(kpp_FILE); Delete(kpp_hash_if); Delete(kpp_hash_elif); Delete(cpp); Delete(included_files); Preprocessor_expr_delete(); DelScanner(id_scan); Delete(dependencies); Delete(Swig_add_directory(0)); } /* ----------------------------------------------------------------------------- * void Preprocessor_include_all() - Instruct preprocessor to include all files * ----------------------------------------------------------------------------- */ void Preprocessor_include_all(int a) { include_all = a; } void Preprocessor_import_all(int a) { import_all = a; } void Preprocessor_ignore_missing(int a) { ignore_missing = a; } void Preprocessor_error_as_warning(int a) { error_as_warning = a; } /* ----------------------------------------------------------------------------- * Preprocessor_define() * * Defines a new C preprocessor symbol. swigmacro specifies whether or not the macro has * SWIG macro semantics. * ----------------------------------------------------------------------------- */ String *Macro_vararg_name(const_String_or_char_ptr str, const_String_or_char_ptr line) { String *argname; String *varargname; char *s, *dots; argname = Copy(str); s = Char(argname); dots = strchr(s, '.'); if (!dots) { Delete(argname); return NULL; } if (strcmp(dots, "...") != 0) { Swig_error(Getfile(line), Getline(line), "Illegal macro argument name '%s'\n", str); Delete(argname); return NULL; } if (dots == s) { varargname = NewString("__VA_ARGS__"); } else { *dots = '\0'; varargname = NewString(s); } Delete(argname); return varargname; } Hash *Preprocessor_define(const_String_or_char_ptr _str, int swigmacro) { String *macroname = 0, *argstr = 0, *macrovalue = 0, *file = 0, *s = 0; Hash *macro = 0, *symbols = 0, *m1; List *arglist = 0; int c, line; int varargs = 0; String *str; assert(cpp); assert(_str); /* First make sure that string is actually a string */ if (DohCheck(_str)) { s = Copy(_str); copy_location(_str, s); str = s; } else { str = NewString((char *) _str); } Seek(str, 0, SEEK_SET); line = Getline(str); file = Getfile(str); /* Skip over any leading whitespace */ skip_whitespace(str, 0); /* Now look for a macro name */ macroname = NewStringEmpty(); copy_location(str, macroname); while ((c = Getc(str)) != EOF) { if (c == '(') { argstr = NewStringEmpty(); copy_location(str, argstr); /* It is a macro. Go extract its argument string */ while ((c = Getc(str)) != EOF) { if (c == ')') break; else Putc(c, argstr); } if (c != ')') { Swig_error(Getfile(argstr), Getline(argstr), "Missing \')\' in macro parameters\n"); goto macro_error; } break; } else if (isidchar(c) || (c == '%')) { Putc(c, macroname); } else if (isspace(c)) { break; } else if (c == '\\') { c = Getc(str); if (c != '\n') { Ungetc(c, str); Ungetc('\\', str); break; } } else { Ungetc(c, str); break; } } if (!swigmacro) skip_whitespace(str, 0); macrovalue = NewStringEmpty(); copy_location(str, macrovalue); while ((c = Getc(str)) != EOF) { Putc(c, macrovalue); } /* If there are any macro arguments, convert into a list */ if (argstr) { String *argname, *varargname; arglist = NewList(); Seek(argstr, 0, SEEK_SET); argname = NewStringEmpty(); while ((c = Getc(argstr)) != EOF) { if (c == ',') { varargname = Macro_vararg_name(argname, argstr); if (varargname) { Delete(varargname); Swig_error(Getfile(argstr), Getline(argstr), "Variable length macro argument must be last parameter\n"); } else { Append(arglist, argname); } Delete(argname); argname = NewStringEmpty(); } else if (isidchar(c) || (c == '.')) { Putc(c, argname); } else if (!(isspace(c) || (c == '\\'))) { Delete(argname); Swig_error(Getfile(argstr), Getline(argstr), "Illegal character in macro argument name\n"); goto macro_error; } } if (Len(argname)) { /* Check for varargs */ varargname = Macro_vararg_name(argname, argstr); if (varargname) { Append(arglist, varargname); Delete(varargname); varargs = 1; } else { Append(arglist, argname); } } Delete(argname); } if (!swigmacro) { Replace(macrovalue, "\\\n", " ", DOH_REPLACE_NOQUOTE); } /* Look for special # substitutions. We only consider # that appears outside of quotes and comments */ { int state = 0; char *cc = Char(macrovalue); while (*cc) { switch (state) { case 0: if (*cc == '#') *cc = '\001'; else if (*cc == '/') state = 10; else if (*cc == '\'') state = 20; else if (*cc == '\"') state = 30; break; case 10: if (*cc == '*') state = 11; else if (*cc == '/') state = 15; else { state = 0; cc--; } break; case 11: if (*cc == '*') state = 12; break; case 12: if (*cc == '/') state = 0; else if (*cc != '*') state = 11; break; case 15: if (*cc == '\n') state = 0; break; case 20: if (*cc == '\'') state = 0; if (*cc == '\\') state = 21; break; case 21: state = 20; break; case 30: if (*cc == '\"') state = 0; if (*cc == '\\') state = 31; break; case 31: state = 30; break; default: break; } cc++; } } /* Get rid of whitespace surrounding # */ /* Replace(macrovalue,"#","\001",DOH_REPLACE_NOQUOTE); */ while (strstr(Char(macrovalue), "\001 ")) { Replace(macrovalue, "\001 ", "\001", DOH_REPLACE_ANY); } while (strstr(Char(macrovalue), " \001")) { Replace(macrovalue, " \001", "\001", DOH_REPLACE_ANY); } /* Replace '##' with a special token */ Replace(macrovalue, "\001\001", "\002", DOH_REPLACE_ANY); /* Replace '#@' with a special token */ Replace(macrovalue, "\001@", "\004", DOH_REPLACE_ANY); /* Replace '##@' with a special token */ Replace(macrovalue, "\002@", "\005", DOH_REPLACE_ANY); /* Go create the macro */ macro = NewHash(); Setattr(macro, kpp_name, macroname); if (arglist) { Setattr(macro, kpp_args, arglist); Delete(arglist); if (varargs) { Setattr(macro, kpp_varargs, "1"); } } Setattr(macro, kpp_value, macrovalue); Setline(macro, line); Setfile(macro, file); if (swigmacro) { Setattr(macro, kpp_swigmacro, "1"); } symbols = Getattr(cpp, kpp_symbols); if ((m1 = Getattr(symbols, macroname))) { if (!Checkattr(m1, kpp_value, macrovalue)) { Swig_error(Getfile(macroname), Getline(macroname), "Macro '%s' redefined,\n", macroname); Swig_error(Getfile(m1), Getline(m1), "previous definition of '%s'.\n", macroname); goto macro_error; } } else { Setattr(symbols, macroname, macro); Delete(macro); } Delete(macroname); Delete(macrovalue); Delete(str); Delete(argstr); return macro; macro_error: Delete(str); Delete(argstr); Delete(arglist); Delete(macroname); Delete(macrovalue); return 0; } /* ----------------------------------------------------------------------------- * Preprocessor_undef() * * Undefines a macro. * ----------------------------------------------------------------------------- */ void Preprocessor_undef(const_String_or_char_ptr str) { Hash *symbols; assert(cpp); symbols = Getattr(cpp, kpp_symbols); Delattr(symbols, str); } /* ----------------------------------------------------------------------------- * find_args() * * Isolates macro arguments and returns them in a list. For each argument, * leading and trailing whitespace is stripped (ala K&R, pg. 230). * ----------------------------------------------------------------------------- */ static List *find_args(String *s, int ismacro, String *macro_name) { List *args; String *str; int c, level; long pos; /* Create a new list */ args = NewList(); copy_location(s, args); /* First look for a '(' */ pos = Tell(s); skip_whitespace(s, 0); /* Now see if the next character is a '(' */ c = Getc(s); if (c != '(') { /* Not a macro, bail out now! */ assert(pos != -1); (void)Seek(s, pos, SEEK_SET); Delete(args); return 0; } c = Getc(s); /* Okay. This appears to be a macro so we will start isolating arguments */ while (c != EOF) { if (isspace(c)) { skip_whitespace(s, 0); /* Skip leading whitespace */ c = Getc(s); } str = NewStringEmpty(); copy_location(s, str); level = 0; while (c != EOF) { if (c == '\"') { Putc(c, str); skip_tochar(s, '\"', str); c = Getc(s); continue; } else if (c == '\'') { Putc(c, str); skip_tochar(s, '\'', str); c = Getc(s); continue; } else if (c == '/') { /* Ensure comments are ignored by eating up the characters */ c = Getc(s); /* Handle / * ... * / type comments (multi-line) */ if (c == '*') { while ((c = Getc(s)) != EOF) { if (c == '*') { c = Getc(s); if (c == '/' || c == EOF) break; } } c = Getc(s); continue; } /* Handle // ... type comments (single-line) */ if (c == '/') { while ((c = Getc(s)) != EOF) { if (c == '\n') { break; } } c = Getc(s); continue; } /* ensure char is available in the stream as this was not a comment*/ Ungetc(c, s); c = '/'; } if ((c == ',') && (level == 0)) break; if ((c == ')') && (level == 0)) break; Putc(c, str); if (c == '(') level++; if (c == ')') level--; c = Getc(s); } if (level > 0) { goto unterm; } Chop(str); Append(args, str); Delete(str); if (c == ')') return args; c = Getc(s); } unterm: if (ismacro) Swig_error(Getfile(args), Getline(args), "Unterminated call invoking macro '%s'\n", macro_name); else Swig_error(Getfile(args), Getline(args), "Unterminated call to '%s'\n", macro_name); return args; } /* ----------------------------------------------------------------------------- * DOH *get_filename() * * Read a filename from str. A filename can be enclosed in quotes, angle brackets, * or bare. * ----------------------------------------------------------------------------- */ static String *get_filename(String *str, int *sysfile) { String *fn; int c; fn = NewStringEmpty(); copy_location(str, fn); c = Getc(str); *sysfile = 0; if (c == '\"') { while (((c = Getc(str)) != EOF) && (c != '\"')) Putc(c, fn); } else if (c == '<') { *sysfile = 1; while (((c = Getc(str)) != EOF) && (c != '>')) Putc(c, fn); } else { String *preprocessed_str; Putc(c, fn); while (((c = Getc(str)) != EOF) && (!isspace(c))) Putc(c, fn); if (isspace(c)) Ungetc(c, str); preprocessed_str = Preprocessor_replace(fn); Seek(preprocessed_str, 0, SEEK_SET); Delete(fn); fn = NewStringEmpty(); copy_location(preprocessed_str, fn); c = Getc(preprocessed_str); if (c == '\"') { while (((c = Getc(preprocessed_str)) != EOF) && (c != '\"')) Putc(c, fn); } else if (c == '<') { *sysfile = 1; while (((c = Getc(preprocessed_str)) != EOF) && (c != '>')) Putc(c, fn); } else { fn = Copy(preprocessed_str); } Delete(preprocessed_str); } Swig_filename_unescape(fn); Swig_filename_correct(fn); Seek(fn, 0, SEEK_SET); return fn; } static String *get_options(String *str) { int c; c = Getc(str); if (c == '(') { String *opt; int level = 1; opt = NewString("("); while (((c = Getc(str)) != EOF)) { Putc(c, opt); if (c == ')') { level--; if (!level) return opt; } if (c == '(') level++; } Delete(opt); return 0; } else { Ungetc(c, str); return 0; } } /* ----------------------------------------------------------------------------- * expand_macro() * * Perform macro expansion and return a new string. Returns NULL if some sort * of error occurred. * name - name of the macro * args - arguments passed to the macro * line_file - only used for line/file name when reporting errors * ----------------------------------------------------------------------------- */ static String *expand_macro(String *name, List *args, String *line_file) { String *ns; DOH *symbols, *macro, *margs, *mvalue, *temp, *tempa, *e; int i, l; int isvarargs = 0; symbols = Getattr(cpp, kpp_symbols); if (!symbols) return 0; /* See if the name is actually defined */ macro = Getattr(symbols, name); if (!macro) return 0; if (macro_level == 0) { /* Store the start of the macro should the macro contain __LINE__ and __FILE__ for expansion */ macro_start_line = Getline(args ? args : line_file); macro_start_file = Getfile(args ? args : line_file); } macro_level++; if (Getattr(macro, kpp_expanded)) { ns = NewStringEmpty(); Append(ns, name); if (args) { int lenargs = Len(args); if (lenargs) Putc('(', ns); for (i = 0; i < lenargs; i++) { Append(ns, Getitem(args, i)); if (i < (lenargs - 1)) Putc(',', ns); } if (i) Putc(')', ns); } macro_level--; return ns; } /* Get macro arguments and value */ mvalue = Getattr(macro, kpp_value); assert(mvalue); margs = Getattr(macro, kpp_args); if (args && Getattr(macro, kpp_varargs)) { isvarargs = 1; /* Variable length argument macro. We need to collect all of the extra arguments into a single argument */ if (Len(args) >= (Len(margs) - 1)) { int i; int vi, na; String *vararg = NewStringEmpty(); vi = Len(margs) - 1; na = Len(args); for (i = vi; i < na; i++) { Append(vararg, Getitem(args, i)); if ((i + 1) < na) { Append(vararg, ","); } } /* Remove arguments */ for (i = vi; i < na; i++) { Delitem(args, vi); } Append(args, vararg); Delete(vararg); } } if (args && margs && Len(margs) == 0 && Len(args) == 1 && Len(Getitem(args, 0)) == 0) { /* FOO() can invoke a macro defined as FOO(X) as well as one defined FOO(). * * Handle this by removing the only argument if it's empty and the macro * expects no arguments. * * We don't need to worry about varargs here - a varargs macro will always have * Len(margs) >= 1, since the varargs are put in the final macro argument. */ Delitem(args, 0); } /* If there are arguments, see if they match what we were given */ if (args && (!margs || Len(margs) != Len(args))) { if (margs && Len(margs) > (1 + isvarargs)) Swig_error(macro_start_file, macro_start_line, "Macro '%s' expects %d arguments\n", name, Len(margs) - isvarargs); else if (margs && Len(margs) == (1 + isvarargs)) Swig_error(macro_start_file, macro_start_line, "Macro '%s' expects 1 argument\n", name); else Swig_error(macro_start_file, macro_start_line, "Macro '%s' expects no arguments\n", name); macro_level--; return 0; } /* If the macro expects arguments, but none were supplied, we leave it in place */ if (!args && margs) { macro_level--; return NewString(name); } /* Copy the macro value */ ns = Copy(mvalue); copy_location(mvalue, ns); /* Tag the macro as being expanded. This is to avoid recursion in macro expansion */ temp = NewStringEmpty(); tempa = NewStringEmpty(); if (args && margs) { l = Len(margs); for (i = 0; i < l; i++) { DOH *arg, *aname; String *reparg; arg = Getitem(args, i); /* Get an argument value */ reparg = Preprocessor_replace(arg); aname = Getitem(margs, i); /* Get macro argument name */ if (strstr(Char(ns), "\001")) { /* Try to replace a quoted version of the argument */ Clear(temp); Clear(tempa); Printf(temp, "\001%s", aname); Printf(tempa, "\"%s\"", arg); Replace(ns, temp, tempa, DOH_REPLACE_ID_END); } if (strstr(Char(ns), "\002")) { /* Look for concatenation tokens */ Clear(temp); Clear(tempa); Printf(temp, "\002%s", aname); Append(tempa, "\002\003"); Replace(ns, temp, tempa, DOH_REPLACE_ID_END); Clear(temp); Clear(tempa); Printf(temp, "%s\002", aname); Append(tempa, "\003\002"); Replace(ns, temp, tempa, DOH_REPLACE_ID_BEGIN); } /* Non-standard macro expansion. The value `x` is replaced by a quoted version of the argument except that if the argument is already quoted nothing happens */ if (strchr(Char(ns), '`')) { String *rep; char *c; Clear(temp); Printf(temp, "`%s`", aname); c = Char(arg); if (*c == '\"') { rep = arg; } else { Clear(tempa); Printf(tempa, "\"%s\"", arg); rep = tempa; } Replace(ns, temp, rep, DOH_REPLACE_ANY); } /* Non-standard mangle expansions. The #@Name is replaced by mangle_arg(Name). */ if (strstr(Char(ns), "\004")) { String *marg = Swig_string_mangle(arg); Clear(temp); Printf(temp, "\004%s", aname); Replace(ns, temp, marg, DOH_REPLACE_ID_END); Delete(marg); } if (strstr(Char(ns), "\005")) { String *marg = Swig_string_mangle(arg); Clear(temp); Clear(tempa); Printf(temp, "\005%s", aname); Printf(tempa, "\"%s\"", marg); Replace(ns, temp, tempa, DOH_REPLACE_ID_END); Delete(marg); } if (isvarargs && i == l - 1 && Len(arg) == 0) { /* Zero length varargs macro argument. We search for commas that might appear before and nuke them */ char *a, *s, *t, *name; int namelen; s = Char(ns); name = Char(aname); namelen = Len(aname); a = strstr(s, name); while (a) { char ca = a[namelen]; if (!isidchar((int) ca)) { /* Matched the entire vararg name, not just a prefix */ if (a > s) { t = a - 1; if (*t == '\002') { t--; while (t >= s) { if (isspace((int) *t)) t--; else if (*t == ',') { *t = ' '; } else break; } } } } a = strstr(a + namelen, name); } } /* Replace(ns, aname, arg, DOH_REPLACE_ID); */ Replace(ns, aname, reparg, DOH_REPLACE_ID); /* Replace expanded args */ Replace(ns, "\003", arg, DOH_REPLACE_ANY); /* Replace unexpanded arg */ Delete(reparg); } } Replace(ns, "\002", "", DOH_REPLACE_ANY); /* Get rid of concatenation tokens */ Replace(ns, "\001", "#", DOH_REPLACE_ANY); /* Put # back (non-standard C) */ Replace(ns, "\004", "#@", DOH_REPLACE_ANY); /* Put # back (non-standard C) */ /* Expand this macro even further */ Setattr(macro, kpp_expanded, "1"); e = Preprocessor_replace(ns); Delattr(macro, kpp_expanded); Delete(ns); if (Getattr(macro, kpp_swigmacro)) { String *g; String *f = NewStringEmpty(); Seek(e, 0, SEEK_SET); copy_location(macro, e); g = Preprocessor_parse(e); #if 0 /* Drop the macro in place, but with a marker around it */ Printf(f, "/*@%s,%d,%s@*/%s/*@@*/", Getfile(macro), Getline(macro), name, g); #else /* Use simplified around markers to properly count lines in cscanner.c */ if (strchr(Char(g), '\n')) { Printf(f, "/*@SWIG:%s,%d,%s@*/%s/*@SWIG@*/", Getfile(macro), Getline(macro), name, g); #if 0 Printf(f, "/*@SWIG:%s@*/%s/*@SWIG@*/", name, g); #endif } else { Append(f, g); } #endif Delete(g); Delete(e); e = f; } macro_level--; Delete(temp); Delete(tempa); return e; } /* ----------------------------------------------------------------------------- * DOH *Preprocessor_replace(DOH *s) * * Performs a macro substitution on a string s. Returns a new string with * substitutions applied. This function works by walking down s and looking * for identifiers. When found, a check is made to see if they are macros * which are then expanded. * ----------------------------------------------------------------------------- */ /* #define SWIG_PUT_BUFF */ static DOH *Preprocessor_replace(DOH *s) { DOH *ns, *symbols, *m; int c, i, state = 0; String *id = NewStringEmpty(); assert(cpp); symbols = Getattr(cpp, kpp_symbols); ns = NewStringEmpty(); copy_location(s, ns); Seek(s, 0, SEEK_SET); /* Try to locate identifiers in s and replace them with macro replacements */ while ((c = Getc(s)) != EOF) { switch (state) { case 0: if (isidentifier(c)) { Clear(id); Putc(c, id); state = 4; } else if (c == '%') { Clear(id); Putc(c, id); state = 2; } else if (c == '#') { Clear(id); Putc(c, id); state = 4; } else if (c == '\"') { Putc(c, ns); skip_tochar(s, '\"', ns); } else if (c == '\'') { Putc(c, ns); skip_tochar(s, '\'', ns); } else if (c == '/') { Putc(c, ns); state = 10; } else if (c == '\\') { Putc(c, ns); c = Getc(s); if (c == '\n') { Putc(c, ns); } else { Ungetc(c, s); } } else if (c == '\n') { Putc(c, ns); expand_defined_operator = 0; } else { Putc(c, ns); } break; case 2: /* Found '%#' */ if (c == '#') { Putc(c, id); state = 4; } else { Ungetc(c, s); state = 4; } break; case 4: /* An identifier */ if (isidchar(c)) { Putc(c, id); state = 4; } else { /* We found the end of a valid identifier */ Ungetc(c, s); /* See if this is the special "defined" operator */ if (Equal(kpp_defined, id)) { if (expand_defined_operator) { int lenargs = 0; DOH *args = 0; /* See whether or not a parenthesis has been used */ skip_whitespace(s, 0); c = Getc(s); if (c == '(') { Ungetc(c, s); args = find_args(s, 0, kpp_defined); } else if (isidchar(c)) { DOH *arg = NewStringEmpty(); args = NewList(); Putc(c, arg); while (((c = Getc(s)) != EOF)) { if (!isidchar(c)) { Ungetc(c, s); break; } Putc(c, arg); } if (Len(arg)) Append(args, arg); Delete(arg); } else { Seek(s, -1, SEEK_CUR); } lenargs = Len(args); if ((!args) || (!lenargs)) { /* This is not a defined() operator. */ Append(ns, id); state = 0; break; } for (i = 0; i < lenargs; i++) { DOH *o = Getitem(args, i); if (!Getattr(symbols, o)) { break; } } if (i < lenargs) Putc('0', ns); else Putc('1', ns); Delete(args); } else { Append(ns, id); } state = 0; break; } else if (Equal(kpp_LINE, id)) { Printf(ns, "%d", macro_level > 0 ? macro_start_line : Getline(s)); state = 0; break; } else if (Equal(kpp_FILE, id)) { String *fn = Copy(macro_level > 0 ? macro_start_file : Getfile(s)); Replaceall(fn, "\\", "\\\\"); Printf(ns, "\"%s\"", fn); Delete(fn); state = 0; break; } else if (Equal(kpp_hash_if, id) || Equal(kpp_hash_elif, id)) { expand_defined_operator = 1; Append(ns, id); /* } else if (Equal("%#if", id) || Equal("%#ifdef", id)) { Swig_warning(998, Getfile(s), Getline(s), "Found: %s preprocessor directive.\n", id); Append(ns, id); } else if (Equal("#ifdef", id) || Equal("#ifndef", id)) { Swig_warning(998, Getfile(s), Getline(s), "The %s preprocessor directive does not work in macros, try #if instead.\n", id); Append(ns, id); */ } else if ((m = Getattr(symbols, id))) { /* See if the macro is defined in the preprocessor symbol table */ DOH *args = 0; DOH *e; int macro_additional_lines = 0; /* See if the macro expects arguments */ if (Getattr(m, kpp_args)) { /* Yep. We need to go find the arguments and do a substitution */ int line = Getline(s); args = find_args(s, 1, id); macro_additional_lines = Getline(s) - line; assert(macro_additional_lines >= 0); } else { args = 0; } e = expand_macro(id, args, s); if (e) { Append(ns, e); } while (macro_additional_lines--) { Putc('\n', ns); } Delete(e); Delete(args); } else { Append(ns, id); } state = 0; } break; case 10: if (c == '/') state = 11; else if (c == '*') state = 12; else { Ungetc(c, s); state = 0; break; } Putc(c, ns); break; case 11: /* in C++ comment */ Putc(c, ns); if (c == '\n') { expand_defined_operator = 0; state = 0; } break; case 12: /* in C comment */ Putc(c, ns); if (c == '*') state = 13; break; case 13: Putc(c, ns); if (c == '/') state = 0; else if (c != '*') state = 12; break; default: state = 0; break; } } /* Identifier at the end */ if (state == 2 || state == 4) { /* See if this is the special "defined" operator */ if (Equal(kpp_defined, id)) { Swig_error(Getfile(s), Getline(s), "No arguments given to defined()\n"); } else if (Equal(kpp_LINE, id)) { Printf(ns, "%d", macro_level > 0 ? macro_start_line : Getline(s)); } else if (Equal(kpp_FILE, id)) { String *fn = Copy(macro_level > 0 ? macro_start_file : Getfile(s)); Replaceall(fn, "\\", "\\\\"); Printf(ns, "\"%s\"", fn); Delete(fn); } else if (Getattr(symbols, id)) { DOH *e; /* Yes. There is a macro here */ /* See if the macro expects arguments */ e = expand_macro(id, 0, s); if (e) Append(ns, e); Delete(e); } else { Append(ns, id); } } Delete(id); return ns; } /* ----------------------------------------------------------------------------- * int checkpp_id(DOH *s) * * Checks the string s to see if it contains any unresolved identifiers. This * function contains the heuristic that determines whether or not a macro * definition passes through the preprocessor as a constant declaration. * ----------------------------------------------------------------------------- */ static int checkpp_id(DOH *s) { int c; int hastok = 0; Scanner *scan = id_scan; Seek(s, 0, SEEK_SET); Scanner_clear(scan); s = Copy(s); Seek(s, SEEK_SET, 0); Scanner_push(scan, s); while ((c = Scanner_token(scan))) { hastok = 1; if ((c == SWIG_TOKEN_ID) || (c == SWIG_TOKEN_LBRACE) || (c == SWIG_TOKEN_RBRACE)) return 1; } if (!hastok) return 1; return 0; } /* addline(). Utility function for adding lines to a chunk */ static void addline(DOH *s1, DOH *s2, int allow) { if (allow) { Append(s1, s2); } else { char *c = Char(s2); while (*c) { if (*c == '\n') Putc('\n', s1); c++; } } } static void add_chunk(DOH *ns, DOH *chunk, int allow) { DOH *echunk; Seek(chunk, 0, SEEK_SET); if (allow) { echunk = Preprocessor_replace(chunk); addline(ns, echunk, allow); Delete(echunk); } else { addline(ns, chunk, 0); } Clear(chunk); } /* push/pop_imported(): helper functions for defining and undefining SWIGIMPORTED (when %importing a file). */ static void push_imported() { if (imported_depth == 0) { Preprocessor_define("SWIGIMPORTED 1", 0); } ++imported_depth; } static void pop_imported() { --imported_depth; if (imported_depth == 0) { Preprocessor_undef("SWIGIMPORTED"); } } /* ----------------------------------------------------------------------------- * Preprocessor_parse() * * Parses the string s. Returns a new string containing the preprocessed version. * * Parsing rules : * 1. Lines starting with # are C preprocessor directives * 2. Macro expansion inside strings is not allowed * 3. All code inside false conditionals is changed to blank lines * 4. Code in %{, %} is not parsed because it may need to be * included inline (with all preprocessor directives included). * ----------------------------------------------------------------------------- */ String *Preprocessor_parse(String *s) { String *ns; /* New string containing the preprocessed text */ String *chunk, *decl; Hash *symbols; String *id = 0, *value = 0, *comment = 0; int i, state, e, c; int start_line = 0; int allow = 1; int level = 0; int dlevel = 0; int filelevel = 0; int mask = 0; int start_level = 0; int cpp_lines = 0; int cond_lines[256]; /* Blow away all carriage returns */ Replace(s, "\015", "", DOH_REPLACE_ANY); ns = NewStringEmpty(); /* Return result */ decl = NewStringEmpty(); id = NewStringEmpty(); value = NewStringEmpty(); comment = NewStringEmpty(); chunk = NewStringEmpty(); copy_location(s, chunk); copy_location(s, ns); symbols = Getattr(cpp, kpp_symbols); state = 0; while ((c = Getc(s)) != EOF) { switch (state) { case 0: /* Initial state - in first column */ /* Look for C preprocessor directives. Otherwise, go directly to state 1 */ if (c == '#') { copy_location(s, chunk); add_chunk(ns, chunk, allow); cpp_lines = 1; state = 40; } else if (isspace(c)) { Putc(c, chunk); skip_whitespace(s, chunk); } else { state = 1; Ungetc(c, s); } break; case 1: /* Non-preprocessor directive */ /* Look for SWIG directives */ if (c == '%') { state = 100; break; } Putc(c, chunk); if (c == '\n') state = 0; else if (c == '\"') { start_line = Getline(s); if (skip_tochar(s, '\"', chunk) < 0) { Swig_error(Getfile(s), start_line, "Unterminated string constant\n"); } } else if (c == '\'') { start_line = Getline(s); if (skip_tochar(s, '\'', chunk) < 0) { Swig_error(Getfile(s), start_line, "Unterminated character constant\n"); } } else if (c == '/') state = 30; /* Comment */ break; case 30: /* Possibly a comment string of some sort */ start_line = Getline(s); Putc(c, chunk); if (c == '/') state = 31; else if (c == '*') state = 32; else state = 1; break; case 31: Putc(c, chunk); if (c == '\n') state = 0; break; case 32: Putc(c, chunk); if (c == '*') state = 33; break; case 33: Putc(c, chunk); if (c == '/') state = 1; else if (c != '*') state = 32; break; case 40: /* Start of a C preprocessor directive */ if (c == '\n') { Putc('\n', chunk); state = 0; } else if (isspace(c)) { state = 40; } else { /* Got the start of a preprocessor directive */ Ungetc(c, s); Clear(id); copy_location(s, id); state = 41; } break; case 41: /* Build up the name of the preprocessor directive */ if ((isspace(c) || (!isidchar(c)))) { Clear(value); Clear(comment); if (c == '\n') { Ungetc(c, s); state = 50; } else { state = 42; if (!isspace(c)) { Ungetc(c, s); } } copy_location(s, value); break; } Putc(c, id); break; case 42: /* Strip any leading space after the preprocessor directive (before preprocessor value) */ if (isspace(c)) { if (c == '\n') { Ungetc(c, s); state = 50; } break; } state = 43; /* FALL THRU */ case 43: /* Get preprocessor value */ if (c == '\n') { Ungetc(c, s); state = 50; } else if (c == '/') { state = 45; } else if (c == '\"') { Putc(c, value); skip_tochar(s, '\"', value); } else if (c == '\'') { Putc(c, value); skip_tochar(s, '\'', value); } else { Putc(c, value); if (c == '\\') state = 44; } break; case 44: if (c == '\n') { Putc(c, value); cpp_lines++; } else { Ungetc(c, s); } state = 43; break; /* States 45-48 are used to remove, but retain comments from macro values. The comments will be placed in the output in an alternative form */ case 45: if (c == '/') state = 46; else if (c == '*') state = 47; else if (c == '\n') { Putc('/', value); Ungetc(c, s); state = 50; } else { Putc('/', value); Putc(c, value); state = 43; } break; case 46: /* in C++ comment */ if (c == '\n') { Ungetc(c, s); state = 50; } else Putc(c, comment); break; case 47: /* in C comment */ if (c == '*') state = 48; else Putc(c, comment); break; case 48: if (c == '/') state = 43; else if (c == '*') Putc(c, comment); else { Putc('*', comment); Putc(c, comment); state = 47; } break; case 50: /* Check for various preprocessor directives */ Chop(value); if (Equal(id, kpp_define)) { if (allow) { DOH *m, *v, *v1; Seek(value, 0, SEEK_SET); m = Preprocessor_define(value, 0); if ((m) && !(Getattr(m, kpp_args))) { v = Copy(Getattr(m, kpp_value)); copy_location(m, v); if (Len(v)) { Swig_error_silent(1); v1 = Preprocessor_replace(v); Swig_error_silent(0); /* Printf(stdout,"checking '%s'\n", v1); */ if (!checkpp_id(v1)) { if (Len(comment) == 0) Printf(ns, "%%constant %s = %s;\n", Getattr(m, kpp_name), v1); else Printf(ns, "%%constant %s = %s; /*%s*/\n", Getattr(m, kpp_name), v1, comment); cpp_lines--; } Delete(v1); } Delete(v); } } } else if (Equal(id, kpp_undef)) { if (allow) Preprocessor_undef(value); } else if (Equal(id, kpp_ifdef)) { cond_lines[level] = Getline(id); level++; if (allow) { start_level = level; if (Len(value) > 0) { /* See if the identifier is in the hash table */ if (!Getattr(symbols, value)) allow = 0; } else { Swig_error(Getfile(s), Getline(id), "Missing identifier for #ifdef.\n"); allow = 0; } mask = 1; } } else if (Equal(id, kpp_ifndef)) { cond_lines[level] = Getline(id); level++; if (allow) { start_level = level; if (Len(value) > 0) { /* See if the identifier is in the hash table */ if (Getattr(symbols, value)) allow = 0; } else { Swig_error(Getfile(s), Getline(id), "Missing identifier for #ifndef.\n"); allow = 0; } mask = 1; } } else if (Equal(id, kpp_else)) { if (level <= 0) { Swig_error(Getfile(s), Getline(id), "Misplaced #else.\n"); } else { cond_lines[level - 1] = Getline(id); if (Len(value) != 0) Swig_warning(WARN_PP_UNEXPECTED_TOKENS, Getfile(s), Getline(id), "Unexpected tokens after #else directive.\n"); if (allow) { allow = 0; mask = 0; } else if (level == start_level) { allow = 1 * mask; } } } else if (Equal(id, kpp_endif)) { level--; if (level < 0) { Swig_error(Getfile(id), Getline(id), "Extraneous #endif.\n"); level = 0; } else { if (level < start_level) { if (Len(value) != 0) Swig_warning(WARN_PP_UNEXPECTED_TOKENS, Getfile(s), Getline(id), "Unexpected tokens after #endif directive.\n"); allow = 1; start_level--; } } } else if (Equal(id, kpp_if)) { cond_lines[level] = Getline(id); level++; if (allow) { int val; String *sval; expand_defined_operator = 1; sval = Preprocessor_replace(value); start_level = level; Seek(sval, 0, SEEK_SET); /* Printf(stdout,"Evaluating '%s'\n", sval); */ if (Len(sval) > 0) { val = Preprocessor_expr(sval, &e); if (e) { const char *msg = Preprocessor_expr_error(); Seek(value, 0, SEEK_SET); Swig_warning(WARN_PP_EVALUATION, Getfile(value), Getline(value), "Could not evaluate expression '%s'\n", value); if (msg) Swig_warning(WARN_PP_EVALUATION, Getfile(value), Getline(value), "Error: '%s'\n", msg); allow = 0; } else { if (val == 0) allow = 0; } } else { Swig_error(Getfile(s), Getline(id), "Missing expression for #if.\n"); allow = 0; } expand_defined_operator = 0; mask = 1; } } else if (Equal(id, kpp_elif)) { if (level == 0) { Swig_error(Getfile(s), Getline(id), "Misplaced #elif.\n"); } else { cond_lines[level - 1] = Getline(id); if (allow) { allow = 0; mask = 0; } else if (level == start_level) { int val; String *sval; expand_defined_operator = 1; sval = Preprocessor_replace(value); Seek(sval, 0, SEEK_SET); if (Len(sval) > 0) { val = Preprocessor_expr(sval, &e); if (e) { const char *msg = Preprocessor_expr_error(); Seek(value, 0, SEEK_SET); Swig_warning(WARN_PP_EVALUATION, Getfile(value), Getline(value), "Could not evaluate expression '%s'\n", value); if (msg) Swig_warning(WARN_PP_EVALUATION, Getfile(value), Getline(value), "Error: '%s'\n", msg); allow = 0; } else { if (val) allow = 1 * mask; else allow = 0; } } else { Swig_error(Getfile(s), Getline(id), "Missing expression for #elif.\n"); allow = 0; } expand_defined_operator = 0; } } } else if (Equal(id, kpp_warning)) { if (allow) { Swig_warning(WARN_PP_CPP_WARNING, Getfile(s), Getline(id), "CPP #warning, \"%s\".\n", value); } } else if (Equal(id, kpp_error)) { if (allow) { if (error_as_warning) { Swig_warning(WARN_PP_CPP_ERROR, Getfile(s), Getline(id), "CPP #error \"%s\".\n", value); } else { Swig_error(Getfile(s), Getline(id), "CPP #error \"%s\". Use the -cpperraswarn option to continue swig processing.\n", value); } } } else if (Equal(id, kpp_line)) { } else if (Equal(id, kpp_include)) { if (((include_all) || (import_all)) && (allow)) { String *s1, *s2, *fn; String *dirname; int sysfile = 0; if (include_all && import_all) { Swig_warning(WARN_PP_INCLUDEALL_IMPORTALL, Getfile(s), Getline(id), "Both includeall and importall are defined: using includeall.\n"); import_all = 0; } Seek(value, 0, SEEK_SET); fn = get_filename(value, &sysfile); s1 = cpp_include(fn, sysfile); if (s1) { if (include_all) Printf(ns, "%%includefile \"%s\" %%beginfile\n", Swig_filename_escape(Swig_last_file())); else if (import_all) { Printf(ns, "%%importfile \"%s\" %%beginfile\n", Swig_filename_escape(Swig_last_file())); push_imported(); } /* See if the filename has a directory component */ dirname = Swig_file_dirname(Swig_last_file()); if (sysfile || !Len(dirname)) { Delete(dirname); dirname = 0; } if (dirname) { int len = Len(dirname); Delslice(dirname, len - 1, len); /* Kill trailing directory delimiter */ Swig_push_directory(dirname); } s2 = Preprocessor_parse(s1); addline(ns, s2, allow); Append(ns, "%endoffile"); if (dirname) { Swig_pop_directory(); } if (import_all) { pop_imported(); } Delete(s2); Delete(dirname); Delete(s1); } Delete(fn); } } else if (Equal(id, kpp_pragma)) { if (Strncmp(value, "SWIG ", 5) == 0) { char *c = Char(value) + 5; while (*c && (isspace((int) *c))) c++; if (*c) { if (strncmp(c, "nowarn=", 7) == 0) { String *val = NewString(c + 7); String *nowarn = Preprocessor_replace(val); Swig_warnfilter(nowarn, 1); Delete(nowarn); Delete(val); } else if (strncmp(c, "cpperraswarn=", 13) == 0) { error_as_warning = atoi(c + 13); } else { Swig_error(Getfile(s), Getline(id), "Unknown SWIG pragma: %s\n", c); } } } } else if (Equal(id, kpp_level)) { Swig_error(Getfile(s), Getline(id), "cpp debug: level = %d, startlevel = %d\n", level, start_level); } else if (Equal(id, "")) { /* Null directive */ } else if (is_digits(id)) { /* A gcc linemarker of the form '# linenum filename flags' (resulting from running gcc -E) */ } else { /* Ignore unknown preprocessor directives which are inside an inactive * conditional (github issue #394). */ if (allow) Swig_error(Getfile(s), Getline(id), "Unknown SWIG preprocessor directive: %s (if this is a block of target language code, delimit it with %%{ and %%})\n", id); } for (i = 0; i < cpp_lines; i++) Putc('\n', ns); state = 0; break; /* SWIG directives */ case 100: /* %{,%} block */ if (c == '{') { start_line = Getline(s); copy_location(s, chunk); add_chunk(ns, chunk, allow); Putc('%', chunk); Putc(c, chunk); state = 105; } /* %#cpp - an embedded C preprocessor directive (we strip off the %) */ else if (c == '#') { add_chunk(ns, chunk, allow); Putc(c, chunk); state = 107; } else if (isidentifier(c)) { Clear(decl); Putc('%', decl); Putc(c, decl); state = 110; } else { Putc('%', chunk); Putc(c, chunk); state = 1; } break; case 105: Putc(c, chunk); if (c == '%') state = 106; break; case 106: Putc(c, chunk); if (c == '}') { state = 1; addline(ns, chunk, allow); Clear(chunk); copy_location(s, chunk); } else { state = 105; } break; case 107: Putc(c, chunk); if (c == '\n') { addline(ns, chunk, allow); Clear(chunk); state = 0; } else if (c == '\\') { state = 108; } break; case 108: Putc(c, chunk); state = 107; break; case 110: if (!isidchar(c)) { Ungetc(c, s); /* Look for common SWIG directives */ if (Equal(decl, kpp_dinclude) || Equal(decl, kpp_dimport) || Equal(decl, kpp_dextern)) { /* Got some kind of file inclusion directive, eg: %import(option1="value1") "filename" */ if (allow) { DOH *s1, *s2, *fn, *opt; String *options_whitespace = NewStringEmpty(); String *filename_whitespace = NewStringEmpty(); int sysfile = 0; if (Equal(decl, kpp_dextern)) { Swig_warning(WARN_DEPRECATED_EXTERN, Getfile(s), Getline(s), "%%extern is deprecated. Use %%import instead.\n"); Clear(decl); Append(decl, "%%import"); } skip_whitespace(s, options_whitespace); opt = get_options(s); skip_whitespace(s, filename_whitespace); fn = get_filename(s, &sysfile); s1 = cpp_include(fn, sysfile); if (s1) { String *dirname; copy_location(s, chunk); add_chunk(ns, chunk, allow); Printf(ns, "%sfile%s%s%s\"%s\" %%beginfile\n", decl, options_whitespace, opt, filename_whitespace, Swig_filename_escape(Swig_last_file())); if (Equal(decl, kpp_dimport)) { push_imported(); } dirname = Swig_file_dirname(Swig_last_file()); if (sysfile || !Len(dirname)) { Delete(dirname); dirname = 0; } if (dirname) { int len = Len(dirname); Delslice(dirname, len - 1, len); /* Kill trailing directory delimiter */ Swig_push_directory(dirname); } s2 = Preprocessor_parse(s1); if (dirname) { Swig_pop_directory(); } if (Equal(decl, kpp_dimport)) { pop_imported(); } addline(ns, s2, allow); Append(ns, "%endoffile"); Delete(s2); Delete(dirname); Delete(s1); } Delete(fn); Delete(filename_whitespace); Delete(options_whitespace); } state = 1; } else if (Equal(decl, kpp_dbeginfile)) { /* Got an internal directive marking the beginning of an included file: %beginfile ... %endoffile */ filelevel++; start_line = Getline(s); copy_location(s, chunk); add_chunk(ns, chunk, allow); Append(chunk, decl); state = 120; } else if (Equal(decl, kpp_dline)) { /* Got a line directive */ state = 1; } else if (Equal(decl, kpp_ddefine)) { /* Got a define directive */ dlevel++; copy_location(s, chunk); add_chunk(ns, chunk, allow); Clear(value); copy_location(s, value); state = 150; } else { Append(chunk, decl); state = 1; } } else { Putc(c, decl); } break; /* Searching for the end of a %beginfile block */ case 120: Putc(c, chunk); if (c == '%') { const char *bf = "beginfile"; const char *ef = "endoffile"; char statement[10]; int i = 0; for (i = 0; i < 9;) { c = Getc(s); Putc(c, chunk); statement[i++] = (char)c; if (strncmp(statement, bf, i) && strncmp(statement, ef, i)) break; } c = Getc(s); Ungetc(c, s); if ((i == 9) && (isspace(c))) { if (strncmp(statement, bf, i) == 0) { ++filelevel; } else if (strncmp(statement, ef, i) == 0) { --filelevel; if (!filelevel) { /* Reached end of included file */ addline(ns, chunk, allow); Clear(chunk); copy_location(s, chunk); state = 1; } } } } break; /* Searching for the end of a %define statement */ case 150: Putc(c, value); if (c == '%') { const char *ed = "enddef"; const char *df = "define"; char statement[7]; int i = 0; for (i = 0; i < 6;) { c = Getc(s); Putc(c, value); statement[i++] = (char)c; if (strncmp(statement, ed, i) && strncmp(statement, df, i)) break; } c = Getc(s); Ungetc(c, s); if ((i == 6) && (isspace(c))) { if (strncmp(statement, df, i) == 0) { ++dlevel; } else { if (strncmp(statement, ed, i) == 0) { --dlevel; if (!dlevel) { /* Got the macro */ for (i = 0; i < 7; i++) { Delitem(value, DOH_END); } if (allow) { Seek(value, 0, SEEK_SET); Preprocessor_define(value, 1); } addline(ns, value, 0); state = 0; } } } } } break; default: Printf(stderr, "cpp: Invalid parser state %d\n", state); abort(); break; } } while (level > 0) { Swig_error(Getfile(s), cond_lines[level - 1], "Missing #endif for conditional starting here\n"); level--; } if (state == 120) { Swig_error(Getfile(s), start_line, "Missing %%endoffile for file inclusion block starting here\n"); } if (state == 150) { Seek(value, 0, SEEK_SET); Swig_error(Getfile(s), Getline(value), "Missing %%enddef for macro starting here\n", Getline(value)); } if ((state >= 105) && (state < 107)) { Swig_error(Getfile(s), start_line, "Unterminated %%{ ... %%} block\n"); } if ((state >= 30) && (state < 40)) { Swig_error(Getfile(s), start_line, "Unterminated comment\n"); } copy_location(s, chunk); add_chunk(ns, chunk, allow); /* DelScope(scp); */ Delete(decl); Delete(id); Delete(value); Delete(comment); Delete(chunk); return ns; } swig-4.0.2/Source/Makefile.in0000644000175000017500000012543213667507560015677 0ustar williamwilliam# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = eswig$(EXEEXT) subdir = Source ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/Tools/config/ac_compile_warnings.m4 \ $(top_srcdir)/Tools/config/ac_define_dir.m4 \ $(top_srcdir)/Tools/config/ax_boost_base.m4 \ $(top_srcdir)/Tools/config/ax_compare_version.m4 \ $(top_srcdir)/Tools/config/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/Tools/config/ax_path_generic.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/Source/Include/swigconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp am_eswig_OBJECTS = CParse/cscanner.$(OBJEXT) CParse/parser.$(OBJEXT) \ CParse/templ.$(OBJEXT) CParse/util.$(OBJEXT) \ DOH/base.$(OBJEXT) DOH/file.$(OBJEXT) DOH/fio.$(OBJEXT) \ DOH/hash.$(OBJEXT) DOH/list.$(OBJEXT) DOH/memory.$(OBJEXT) \ DOH/string.$(OBJEXT) DOH/void.$(OBJEXT) \ Doxygen/doxyentity.$(OBJEXT) Doxygen/doxyparser.$(OBJEXT) \ Doxygen/doxytranslator.$(OBJEXT) Doxygen/javadoc.$(OBJEXT) \ Doxygen/pydoc.$(OBJEXT) Modules/allocate.$(OBJEXT) \ Modules/browser.$(OBJEXT) Modules/contract.$(OBJEXT) \ Modules/csharp.$(OBJEXT) Modules/d.$(OBJEXT) \ Modules/directors.$(OBJEXT) Modules/emit.$(OBJEXT) \ Modules/go.$(OBJEXT) Modules/guile.$(OBJEXT) \ Modules/interface.$(OBJEXT) Modules/java.$(OBJEXT) \ Modules/javascript.$(OBJEXT) Modules/lang.$(OBJEXT) \ Modules/lua.$(OBJEXT) Modules/main.$(OBJEXT) \ Modules/mzscheme.$(OBJEXT) Modules/nested.$(OBJEXT) \ Modules/ocaml.$(OBJEXT) Modules/octave.$(OBJEXT) \ Modules/overload.$(OBJEXT) Modules/perl5.$(OBJEXT) \ Modules/php.$(OBJEXT) Modules/python.$(OBJEXT) \ Modules/r.$(OBJEXT) Modules/ruby.$(OBJEXT) \ Modules/scilab.$(OBJEXT) Modules/swigmain.$(OBJEXT) \ Modules/tcl8.$(OBJEXT) Modules/typepass.$(OBJEXT) \ Modules/utils.$(OBJEXT) Modules/xml.$(OBJEXT) \ Preprocessor/cpp.$(OBJEXT) Preprocessor/expr.$(OBJEXT) \ Swig/cwrap.$(OBJEXT) Swig/deprecate.$(OBJEXT) \ Swig/error.$(OBJEXT) Swig/extend.$(OBJEXT) \ Swig/fragment.$(OBJEXT) Swig/getopt.$(OBJEXT) \ Swig/include.$(OBJEXT) Swig/misc.$(OBJEXT) \ Swig/naming.$(OBJEXT) Swig/parms.$(OBJEXT) \ Swig/scanner.$(OBJEXT) Swig/stype.$(OBJEXT) \ Swig/symbol.$(OBJEXT) Swig/tree.$(OBJEXT) \ Swig/typemap.$(OBJEXT) Swig/typeobj.$(OBJEXT) \ Swig/typesys.$(OBJEXT) Swig/wrapfunc.$(OBJEXT) eswig_OBJECTS = $(am_eswig_OBJECTS) eswig_DEPENDENCIES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = depcomp = $(SHELL) $(top_srcdir)/Tools/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f 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_CC_1 = CCLD = $(CC) 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_CCLD_1 = CXXCOMPILE = $(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_CXX_1 = CXXLD = $(CXX) AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ -e s/c++$$/h++/ -e s/c$$/h/ YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) AM_V_YACC = $(am__v_YACC_@AM_V@) am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) am__v_YACC_0 = @echo " YACC " $@; am__v_YACC_1 = YLWRAP = $(top_srcdir)/Tools/config/ylwrap SOURCES = $(eswig_SOURCES) DIST_SOURCES = $(eswig_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/Tools/config/depcomp \ $(top_srcdir)/Tools/config/ylwrap CParse/parser.c \ CParse/parser.h README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADB = @ADB@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANDROID = @ANDROID@ ANT = @ANT@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_LDFLAGS = @BOOST_LDFLAGS@ CAMLP4 = @CAMLP4@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CCSHARED = @CCSHARED@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSHARPCFLAGS = @CSHARPCFLAGS@ CSHARPCILINTERPRETER = @CSHARPCILINTERPRETER@ CSHARPCILINTERPRETER_FLAGS = @CSHARPCILINTERPRETER_FLAGS@ CSHARPCOMPILER = @CSHARPCOMPILER@ CSHARPCONVERTPATH = @CSHARPCONVERTPATH@ CSHARPDYNAMICLINKING = @CSHARPDYNAMICLINKING@ CSHARPLIBRARYPREFIX = @CSHARPLIBRARYPREFIX@ CSHARPSO = @CSHARPSO@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CXXSHARED = @CXXSHARED@ CYGPATH_W = @CYGPATH_W@ D1COMPILER = @D1COMPILER@ D2COMPILER = @D2COMPILER@ DDEFAULTVERSION = @DDEFAULTVERSION@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLIBPREFIX = @DLIBPREFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_CCACHE = @ENABLE_CCACHE@ EXEEXT = @EXEEXT@ EXTRA_CLEAN = @EXTRA_CLEAN@ GCCGO = @GCCGO@ GCCGOOPT = @GCCGOOPT@ GO = @GO@ GO1 = @GO1@ GO12 = @GO12@ GO13 = @GO13@ GO15 = @GO15@ GOC = @GOC@ GOGCC = @GOGCC@ GOOPT = @GOOPT@ GOVERSIONOPTION = @GOVERSIONOPTION@ GREP = @GREP@ GUILE = @GUILE@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_CONFIG = @GUILE_CONFIG@ GUILE_LIBS = @GUILE_LIBS@ GUILE_SO = @GUILE_SO@ HAVE_CXX11_COMPILER = @HAVE_CXX11_COMPILER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JAVA = @JAVA@ JAVAC = @JAVAC@ JAVACFLAGS = @JAVACFLAGS@ JAVACXXSHARED = @JAVACXXSHARED@ JAVADYNAMICLINKING = @JAVADYNAMICLINKING@ JAVAFLAGS = @JAVAFLAGS@ JAVAINC = @JAVAINC@ JAVALDSHARED = @JAVALDSHARED@ JAVALIBRARYPREFIX = @JAVALIBRARYPREFIX@ JAVASO = @JAVASO@ JAVA_CLASSPATH_SEP = @JAVA_CLASSPATH_SEP@ JAVA_SKIP_DOXYGEN_TEST_CASES = @JAVA_SKIP_DOXYGEN_TEST_CASES@ JSCENABLED = @JSCENABLED@ JSCOREDYNAMICLINKING = @JSCOREDYNAMICLINKING@ JSCOREINC = @JSCOREINC@ JSCOREVERSION = @JSCOREVERSION@ JSINTERPRETERCXX = @JSINTERPRETERCXX@ JSINTERPRETERLINKFLAGS = @JSINTERPRETERLINKFLAGS@ JSV8DYNAMICLINKING = @JSV8DYNAMICLINKING@ JSV8ENABLED = @JSV8ENABLED@ JSV8INC = @JSV8INC@ LDFLAGS = @LDFLAGS@ LDSHARED = @LDSHARED@ LIBC = @LIBC@ LIBCRYPT = @LIBCRYPT@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LINKFORSHARED = @LINKFORSHARED@ LTLIBOBJS = @LTLIBOBJS@ LUABIN = @LUABIN@ LUADYNAMICLINKING = @LUADYNAMICLINKING@ LUAFLAGS = @LUAFLAGS@ LUALINK = @LUALINK@ LUA_SO = @LUA_SO@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MZC = @MZC@ MZDYNOBJ = @MZDYNOBJ@ MZSCHEME = @MZSCHEME@ MZSCHEME_SO = @MZSCHEME_SO@ NDKBUILD = @NDKBUILD@ NODEGYP = @NODEGYP@ NODEJS = @NODEJS@ OBJEXT = @OBJEXT@ OCAMLC = @OCAMLC@ OCAMLDLGEN = @OCAMLDLGEN@ OCAMLFIND = @OCAMLFIND@ OCAMLMKTOP = @OCAMLMKTOP@ OCTAVE = @OCTAVE@ OCTAVE_CPPFLAGS = @OCTAVE_CPPFLAGS@ OCTAVE_CXXFLAGS = @OCTAVE_CXXFLAGS@ OCTAVE_LDFLAGS = @OCTAVE_LDFLAGS@ OCTAVE_SO = @OCTAVE_SO@ 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@ PCHINCLUDEARG = @PCHINCLUDEARG@ PCHINCLUDEEXT = @PCHINCLUDEEXT@ PCHSUPPORT = @PCHSUPPORT@ PCRE_CFLAGS = @PCRE_CFLAGS@ PCRE_CONFIG = @PCRE_CONFIG@ PCRE_LIBS = @PCRE_LIBS@ PERL = @PERL@ PERL5CCCDLFLAGS = @PERL5CCCDLFLAGS@ PERL5CCDLFLAGS = @PERL5CCDLFLAGS@ PERL5CCFLAGS = @PERL5CCFLAGS@ PERL5DYNAMICLINKING = @PERL5DYNAMICLINKING@ PERL5EXT = @PERL5EXT@ PERL5LDFLAGS = @PERL5LDFLAGS@ PERL5LIB = @PERL5LIB@ PHP = @PHP@ PHPINC = @PHPINC@ PHP_SO = @PHP_SO@ PKGCONFIG = @PKGCONFIG@ PLATCFLAGS = @PLATCFLAGS@ PLATCXXFLAGS = @PLATCXXFLAGS@ PY2TO3 = @PY2TO3@ PY3CONFIG = @PY3CONFIG@ PY3INCLUDE = @PY3INCLUDE@ PY3LIB = @PY3LIB@ PY3LINK = @PY3LINK@ PYCODESTYLE = @PYCODESTYLE@ PYINCLUDE = @PYINCLUDE@ PYLIB = @PYLIB@ PYLINK = @PYLINK@ PYTHON = @PYTHON@ PYTHON3 = @PYTHON3@ PYTHON3DYNAMICLINKING = @PYTHON3DYNAMICLINKING@ PYTHONDYNAMICLINKING = @PYTHONDYNAMICLINKING@ PYTHON_SO = @PYTHON_SO@ RBIN = @RBIN@ ROOT_DIR = @ROOT_DIR@ RPATH = @RPATH@ RUBY = @RUBY@ RUBYCCDLFLAGS = @RUBYCCDLFLAGS@ RUBYDYNAMICLINKING = @RUBYDYNAMICLINKING@ RUBYINCLUDE = @RUBYINCLUDE@ RUBYLIB = @RUBYLIB@ RUBYLINK = @RUBYLINK@ RUBYSO = @RUBYSO@ SCILAB = @SCILAB@ SCILABINCLUDE = @SCILABINCLUDE@ SCILABOPT = @SCILABOPT@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SKIP_ANDROID = @SKIP_ANDROID@ SKIP_CSHARP = @SKIP_CSHARP@ SKIP_D = @SKIP_D@ SKIP_GO = @SKIP_GO@ SKIP_GUILE = @SKIP_GUILE@ SKIP_JAVA = @SKIP_JAVA@ SKIP_JAVASCRIPT = @SKIP_JAVASCRIPT@ SKIP_LUA = @SKIP_LUA@ SKIP_MZSCHEME = @SKIP_MZSCHEME@ SKIP_OCAML = @SKIP_OCAML@ SKIP_OCTAVE = @SKIP_OCTAVE@ SKIP_PERL5 = @SKIP_PERL5@ SKIP_PHP = @SKIP_PHP@ SKIP_PYTHON = @SKIP_PYTHON@ SKIP_PYTHON3 = @SKIP_PYTHON3@ SKIP_R = @SKIP_R@ SKIP_RUBY = @SKIP_RUBY@ SKIP_SCILAB = @SKIP_SCILAB@ SKIP_TCL = @SKIP_TCL@ SO = @SO@ STRIP = @STRIP@ SWIGLIBS = @SWIGLIBS@ SWIG_LIB = @SWIG_LIB@ SWIG_LIB_INSTALL = @SWIG_LIB_INSTALL@ SWIG_LIB_PREINST = @SWIG_LIB_PREINST@ SWIG_LIB_SET = @SWIG_LIB_SET@ SWILL = @SWILL@ TCLCXXSHARED = @TCLCXXSHARED@ TCLDYNAMICLINKING = @TCLDYNAMICLINKING@ TCLINCLUDE = @TCLINCLUDE@ TCLLDSHARED = @TCLLDSHARED@ TCLLIB = @TCLLIB@ TCL_SO = @TCL_SO@ TRYLINKINGWITHCXX = @TRYLINKINGWITHCXX@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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@ runstatedir = @runstatedir@ 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@ # subdir-objects generates object files using the directory structure of the source files. AUTOMAKE_OPTIONS = foreign nostdinc subdir-objects 1.7.2 SOURCE_DIR = $(top_srcdir)/Source BUILD_SOURCE_DIR = $(top_builddir)/Source SWIG_CXX_DEFS = @SWILL@ AM_CPPFLAGS = -I$(BUILD_SOURCE_DIR)/Include \ -I$(BUILD_SOURCE_DIR)/CParse \ -I$(SOURCE_DIR)/Include \ -I$(SOURCE_DIR)/DOH \ -I$(SOURCE_DIR)/CParse \ -I$(SOURCE_DIR)/Doxygen \ -I$(SOURCE_DIR)/Preprocessor \ -I$(SOURCE_DIR)/Swig \ -I$(SOURCE_DIR)/Modules AM_CXXFLAGS = $(SWIG_CXX_DEFS) AM_YFLAGS = -d BUILT_SOURCES = CParse/parser.h eswig_SOURCES = CParse/cscanner.c \ CParse/parser.y \ CParse/templ.c \ CParse/util.c \ DOH/base.c \ DOH/file.c \ DOH/fio.c \ DOH/hash.c \ DOH/list.c \ DOH/memory.c \ DOH/string.c \ DOH/void.c \ Doxygen/doxyentity.cxx \ Doxygen/doxyentity.h \ Doxygen/doxyparser.cxx \ Doxygen/doxyparser.h \ Doxygen/doxytranslator.cxx \ Doxygen/doxytranslator.h \ Doxygen/javadoc.cxx \ Doxygen/javadoc.h \ Doxygen/pydoc.cxx \ Doxygen/pydoc.h \ Modules/allocate.cxx \ Modules/browser.cxx \ Modules/contract.cxx \ Modules/csharp.cxx \ Modules/d.cxx \ Modules/directors.cxx \ Modules/emit.cxx \ Modules/go.cxx \ Modules/guile.cxx \ Modules/interface.cxx \ Modules/java.cxx \ Modules/javascript.cxx \ Modules/lang.cxx \ Modules/lua.cxx \ Modules/main.cxx \ Modules/mzscheme.cxx \ Modules/nested.cxx \ Modules/ocaml.cxx \ Modules/octave.cxx \ Modules/overload.cxx \ Modules/perl5.cxx \ Modules/php.cxx \ Modules/python.cxx \ Modules/r.cxx \ Modules/ruby.cxx \ Modules/scilab.cxx \ Modules/swigmain.cxx \ Modules/tcl8.cxx \ Modules/typepass.cxx \ Modules/utils.cxx \ Modules/xml.cxx \ Preprocessor/cpp.c \ Preprocessor/expr.c \ Swig/cwrap.c \ Swig/deprecate.c \ Swig/error.c \ Swig/extend.c \ Swig/fragment.c \ Swig/getopt.c \ Swig/include.c \ Swig/misc.c \ Swig/naming.c \ Swig/parms.c \ Swig/scanner.c \ Swig/stype.c \ Swig/symbol.c \ Swig/tree.c \ Swig/typemap.c \ Swig/typeobj.c \ Swig/typesys.c \ Swig/wrapfunc.c eswig_LDADD = @SWIGLIBS@ # Override the link stage to avoid using Libtool CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ # Beautify the code. # Note that this works well on C code, but does some odd joining of lines for C++ code. # Compiling with -DNDEBUG and no optimisations will allow one to do a binary diff of the # swig executable as a way of checking before and after the 'beautifying'. # Single files can be beautified with the beautify-file target, eg: 'make beautify-file INDENTFILE=chosenfile.c' SWIGTYPEDEFS = -T bool -T File -T DohObjInfo -T Parm -T Language -T List -T TargetLanguageModule -T Typetab -T ModuleFactory -T ErrorMessageFormat -T Symtab -T Hash -T Scanner -T String -T DohBase -T Node -T String_or_char -T SwigType -T Dispatcher -T Wrapper -T DohStringMethods -T DohFileMethods -T DohListMethods -T DohHashMethods -T DOH -T DohIterator -T ParmList -T FILE -T HashNode -T DOHObj_or_char -T DOHFile -T DOHString -T DOHString_or_char -T UpcallData INDENTBAKSDIR = ../IndentBaks all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .cxx .o .obj .y $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Source/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Source/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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 \ ; 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) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(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: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) CParse/$(am__dirstamp): @$(MKDIR_P) CParse @: > CParse/$(am__dirstamp) CParse/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) CParse/$(DEPDIR) @: > CParse/$(DEPDIR)/$(am__dirstamp) CParse/cscanner.$(OBJEXT): CParse/$(am__dirstamp) \ CParse/$(DEPDIR)/$(am__dirstamp) CParse/parser.h: CParse/parser.c @if test ! -f $@; then rm -f CParse/parser.c; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) CParse/parser.c; else :; fi CParse/parser.$(OBJEXT): CParse/$(am__dirstamp) \ CParse/$(DEPDIR)/$(am__dirstamp) CParse/templ.$(OBJEXT): CParse/$(am__dirstamp) \ CParse/$(DEPDIR)/$(am__dirstamp) CParse/util.$(OBJEXT): CParse/$(am__dirstamp) \ CParse/$(DEPDIR)/$(am__dirstamp) DOH/$(am__dirstamp): @$(MKDIR_P) DOH @: > DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) DOH/$(DEPDIR) @: > DOH/$(DEPDIR)/$(am__dirstamp) DOH/base.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/file.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/fio.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/hash.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/list.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/memory.$(OBJEXT): DOH/$(am__dirstamp) \ DOH/$(DEPDIR)/$(am__dirstamp) DOH/string.$(OBJEXT): DOH/$(am__dirstamp) \ DOH/$(DEPDIR)/$(am__dirstamp) DOH/void.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) Doxygen/$(am__dirstamp): @$(MKDIR_P) Doxygen @: > Doxygen/$(am__dirstamp) Doxygen/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) Doxygen/$(DEPDIR) @: > Doxygen/$(DEPDIR)/$(am__dirstamp) Doxygen/doxyentity.$(OBJEXT): Doxygen/$(am__dirstamp) \ Doxygen/$(DEPDIR)/$(am__dirstamp) Doxygen/doxyparser.$(OBJEXT): Doxygen/$(am__dirstamp) \ Doxygen/$(DEPDIR)/$(am__dirstamp) Doxygen/doxytranslator.$(OBJEXT): Doxygen/$(am__dirstamp) \ Doxygen/$(DEPDIR)/$(am__dirstamp) Doxygen/javadoc.$(OBJEXT): Doxygen/$(am__dirstamp) \ Doxygen/$(DEPDIR)/$(am__dirstamp) Doxygen/pydoc.$(OBJEXT): Doxygen/$(am__dirstamp) \ Doxygen/$(DEPDIR)/$(am__dirstamp) Modules/$(am__dirstamp): @$(MKDIR_P) Modules @: > Modules/$(am__dirstamp) Modules/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) Modules/$(DEPDIR) @: > Modules/$(DEPDIR)/$(am__dirstamp) Modules/allocate.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/browser.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/contract.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/csharp.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/d.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/directors.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/emit.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/go.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/guile.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/interface.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/java.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/javascript.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/lang.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/lua.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/main.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/mzscheme.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/nested.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/ocaml.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/octave.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/overload.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/perl5.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/php.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/python.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/r.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/ruby.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/scilab.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/swigmain.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/tcl8.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/typepass.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/utils.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/xml.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Preprocessor/$(am__dirstamp): @$(MKDIR_P) Preprocessor @: > Preprocessor/$(am__dirstamp) Preprocessor/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) Preprocessor/$(DEPDIR) @: > Preprocessor/$(DEPDIR)/$(am__dirstamp) Preprocessor/cpp.$(OBJEXT): Preprocessor/$(am__dirstamp) \ Preprocessor/$(DEPDIR)/$(am__dirstamp) Preprocessor/expr.$(OBJEXT): Preprocessor/$(am__dirstamp) \ Preprocessor/$(DEPDIR)/$(am__dirstamp) Swig/$(am__dirstamp): @$(MKDIR_P) Swig @: > Swig/$(am__dirstamp) Swig/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) Swig/$(DEPDIR) @: > Swig/$(DEPDIR)/$(am__dirstamp) Swig/cwrap.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/deprecate.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/error.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/extend.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/fragment.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/getopt.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/include.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/misc.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/naming.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/parms.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/scanner.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/stype.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/symbol.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/tree.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/typemap.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/typeobj.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/typesys.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/wrapfunc.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) eswig$(EXEEXT): $(eswig_OBJECTS) $(eswig_DEPENDENCIES) $(EXTRA_eswig_DEPENDENCIES) @rm -f eswig$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(eswig_OBJECTS) $(eswig_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f CParse/*.$(OBJEXT) -rm -f DOH/*.$(OBJEXT) -rm -f Doxygen/*.$(OBJEXT) -rm -f Modules/*.$(OBJEXT) -rm -f Preprocessor/*.$(OBJEXT) -rm -f Swig/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@CParse/$(DEPDIR)/cscanner.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@CParse/$(DEPDIR)/parser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@CParse/$(DEPDIR)/templ.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@CParse/$(DEPDIR)/util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/base.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/file.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/fio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/hash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/list.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/memory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/string.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/void.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Doxygen/$(DEPDIR)/doxyentity.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Doxygen/$(DEPDIR)/doxyparser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Doxygen/$(DEPDIR)/doxytranslator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Doxygen/$(DEPDIR)/javadoc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Doxygen/$(DEPDIR)/pydoc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/allocate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/browser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/contract.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/csharp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/directors.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/emit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/go.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/guile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/java.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/javascript.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/lang.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/lua.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/mzscheme.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/nested.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/ocaml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/octave.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/overload.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/perl5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/php.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/python.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/r.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/ruby.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/scilab.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/swigmain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/tcl8.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/typepass.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/utils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/xml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Preprocessor/$(DEPDIR)/cpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Preprocessor/$(DEPDIR)/expr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/cwrap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/deprecate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/error.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/extend.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/fragment.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/getopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/include.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/misc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/naming.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/parms.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/scanner.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/stype.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/symbol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/tree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/typemap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/typeobj.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/typesys.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/wrapfunc.Po@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) '$<'` .cxx.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 $@ $< .cxx.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) '$<'` .y.c: $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @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 check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) all-local installdirs: for dir in "$(DESTDIR)$(bindir)"; 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: 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 CParse/$(DEPDIR)/$(am__dirstamp) -rm -f CParse/$(am__dirstamp) -rm -f DOH/$(DEPDIR)/$(am__dirstamp) -rm -f DOH/$(am__dirstamp) -rm -f Doxygen/$(DEPDIR)/$(am__dirstamp) -rm -f Doxygen/$(am__dirstamp) -rm -f Modules/$(DEPDIR)/$(am__dirstamp) -rm -f Modules/$(am__dirstamp) -rm -f Preprocessor/$(DEPDIR)/$(am__dirstamp) -rm -f Preprocessor/$(am__dirstamp) -rm -f Swig/$(DEPDIR)/$(am__dirstamp) -rm -f Swig/$(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." -rm -f CParse/parser.c -rm -f CParse/parser.h -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -rf CParse/$(DEPDIR) DOH/$(DEPDIR) Doxygen/$(DEPDIR) Modules/$(DEPDIR) Preprocessor/$(DEPDIR) Swig/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-local distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS 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 -rf CParse/$(DEPDIR) DOH/$(DEPDIR) Doxygen/$(DEPDIR) Modules/$(DEPDIR) Preprocessor/$(DEPDIR) Swig/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ clean-binPROGRAMS clean-generic clean-local cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-local distclean-tags distdir 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-info install-info-am 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 pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS .PRECIOUS: Makefile # The executable is copied to the root directory for installation and running the test-suite. # This occurs on each invocation of make and is a step towards providing support for multiple # build directories. all-local: eswig@EXEEXT@ cp -f $(top_builddir)/Source/eswig@EXEEXT@ $(top_builddir)/swig@EXEEXT@ clean-local: rm -f $(top_builddir)/swig@EXEEXT@ rm -f core @EXTRA_CLEAN@ distclean-local: rm -f $(top_builddir)/Source/Include/swigconfig.h rm -f $(top_builddir)/Source/Include/stamp-h1 beautify: rm -rf $(INDENTBAKSDIR) mkdir $(INDENTBAKSDIR) mkdir $(INDENTBAKSDIR)/CParse mkdir $(INDENTBAKSDIR)/DOH mkdir $(INDENTBAKSDIR)/Modules mkdir $(INDENTBAKSDIR)/Preprocessor mkdir $(INDENTBAKSDIR)/Swig mkdir $(INDENTBAKSDIR)/Include (csources=`find . -name "*.c"` && \ hsources=`find . -name "*.h"` && \ cxxsources=`find . -name "*.cxx"` && \ for file in $$csources $$hsources $$cxxsources; do \ $(MAKE) beautify-file INDENTFILE=$$file; \ done; ) beautify-file: test -e $(INDENTBAKSDIR) || (echo $(INDENTBAKSDIR) directory does not exist && exit 1;) test -n "$(INDENTFILE)" || (echo INDENTFILE not defined && exit 1;) test -e $(INDENTFILE) || (echo File does not exist: $(INDENTFILE) && exit 1;) cp $(INDENTFILE) $(INDENTBAKSDIR)/$(INDENTFILE); indent -kr --honour-newlines --line-length160 --indent-level2 --braces-on-func-def-line --leave-optional-blank-lines $(SWIGTYPEDEFS) $(INDENTFILE) -o $(INDENTFILE).tmp; cat $(INDENTFILE).tmp | sed -e 's/const const /const /' > $(INDENTFILE); rm $(INDENTFILE).tmp; # 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: swig-4.0.2/Source/Swig/0000755000175000017500000000000013667507523014533 5ustar williamwilliamswig-4.0.2/Source/Swig/typeobj.c0000644000175000017500000010250513667507523016356 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * typeobj.c * * This file provides functions for constructing, manipulating, and testing * type objects. Type objects are merely the raw low-level representation * of C++ types. They do not incorporate high-level type system features * like typedef, namespaces, etc. * ----------------------------------------------------------------------------- */ #include "swig.h" #include #include /* ----------------------------------------------------------------------------- * Synopsis * * This file provides a collection of low-level functions for constructing and * manipulating C++ data types. In SWIG, C++ datatypes are encoded as simple * text strings. This representation is compact, easy to debug, and easy to read. * * General idea: * * Types are represented by a base type (e.g., "int") and a collection of * type operators applied to the base (e.g., pointers, arrays, etc...). * * Encoding: * * Types are encoded as strings of type constructors such as follows: * * String Encoding C Example * --------------- --------- * p.p.int int ** * a(300).a(400).int int [300][400] * p.q(const).char char const * * * All type constructors are denoted by a trailing '.': * * 'p.' = Pointer (*) * 'r.' = Reference or ref-qualifier (&) * 'z.' = Rvalue reference or ref-qualifier (&&) * 'a(n).' = Array of size n [n] * 'f(..,..).' = Function with arguments (args) * 'q(str).' = Qualifier, such as const or volatile (cv-qualifier) * 'm(cls).' = Pointer to member (cls::*) * * The complete type representation for varargs is: * 'v(...)' * * The encoding follows the order that you might describe a type in words. * For example "p.a(200).int" is "A pointer to array of int's" and * "p.q(const).char" is "a pointer to a const char". * * This representation of types is fairly convenient because ordinary string * operations can be used for type manipulation. For example, a type could be * formed by combining two strings such as the following: * * "p.p." + "a(400).int" = "p.p.a(400).int" * * For C++, typenames may be parameterized using <(...)>. Here are some * examples: * * String Encoding C++ Example * --------------- ------------ * p.vector<(int)> vector * * r.foo<(int,p.double)> foo & * * Contents of this file: * * Most of this functions in this file pertain to the low-level manipulation * of type objects. There are constructor functions like this: * * SwigType_add_pointer() * SwigType_add_reference() * SwigType_add_rvalue_reference() * SwigType_add_array() * * These are used to build new types. There are also functions to undo these * operations. For example: * * SwigType_del_pointer() * SwigType_del_reference() * SwigType_del_rvalue_reference() * SwigType_del_array() * * In addition, there are query functions * * SwigType_ispointer() * SwigType_isreference() * SwigType_isrvalue_reference() * SwigType_isarray() * * Finally, there are some data extraction functions that can be used to * extract array dimensions, template arguments, and so forth. * * It is very important for developers to realize that the functions in this * module do *NOT* incorporate higher-level type system features like typedef. * For example, you could have C code like this: * * typedef int *intptr; * * In this case, a SwigType of type 'intptr' will be treated as a simple type and * functions like SwigType_ispointer() will evaluate as false. It is strongly * advised that developers use the TypeSys_* interface to check types in a more * reliable manner. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * NewSwigType() * * Constructs a new type object. Eventually, it would be nice for this function * to accept an initial value in the form a C/C++ abstract type (currently unimplemented). * ----------------------------------------------------------------------------- */ #ifdef NEW SwigType *NewSwigType(const_String_or_char_ptr initial) { return NewString(initial); } #endif /* The next few functions are utility functions used in the construction and management of types */ /* ----------------------------------------------------------------------------- * static element_size() * * This utility function finds the size of a single type element in a type string. * Type elements are always delimited by periods, but may be nested with * parentheses. A nested element is always handled as a single item. * * Returns the integer size of the element (which can be used to extract a * substring, to chop the element off, or for other purposes). * ----------------------------------------------------------------------------- */ static int element_size(char *c) { int nparen; char *s = c; while (*c) { if (*c == '.') { c++; return (int) (c - s); } else if (*c == '(') { nparen = 1; c++; while (*c) { if (*c == '(') nparen++; if (*c == ')') { nparen--; if (nparen == 0) break; } c++; } } if (*c) c++; } return (int) (c - s); } /* ----------------------------------------------------------------------------- * SwigType_del_element() * * Deletes one type element from the type. * ----------------------------------------------------------------------------- */ SwigType *SwigType_del_element(SwigType *t) { int sz = element_size(Char(t)); Delslice(t, 0, sz); return t; } /* ----------------------------------------------------------------------------- * SwigType_pop() * * Pop one type element off the type. * For example: * t in: q(const).p.Integer * t out: p.Integer * result: q(const). * ----------------------------------------------------------------------------- */ SwigType *SwigType_pop(SwigType *t) { SwigType *result; char *c; int sz; c = Char(t); if (!*c) return 0; sz = element_size(c); result = NewStringWithSize(c, sz); Delslice(t, 0, sz); c = Char(t); if (*c == '.') { Delitem(t, 0); } return result; } /* ----------------------------------------------------------------------------- * SwigType_parm() * * Returns the parameter of an operator as a string * ----------------------------------------------------------------------------- */ String *SwigType_parm(const SwigType *t) { char *start, *c; int nparens = 0; c = Char(t); while (*c && (*c != '(') && (*c != '.')) c++; if (!*c || (*c == '.')) return 0; c++; start = c; while (*c) { if (*c == ')') { if (nparens == 0) break; nparens--; } else if (*c == '(') { nparens++; } c++; } return NewStringWithSize(start, (int) (c - start)); } /* ----------------------------------------------------------------------------- * SwigType_split() * * Splits a type into its component parts and returns a list of string. * ----------------------------------------------------------------------------- */ List *SwigType_split(const SwigType *t) { String *item; List *list; char *c; int len; c = Char(t); list = NewList(); while (*c) { len = element_size(c); item = NewStringWithSize(c, len); Append(list, item); Delete(item); c = c + len; if (*c == '.') c++; } return list; } /* ----------------------------------------------------------------------------- * SwigType_parmlist() * * Splits a comma separated list of parameters into its component parts * The input is expected to contain the parameter list within () brackets * Returns 0 if no argument list in the input, ie there are no round brackets () * Returns an empty List if there are no parameters in the () brackets * For example: * * Foo(std::string,p.f().Bar<(int,double)>) * * returns 2 elements in the list: * std::string * p.f().Bar<(int,double)> * ----------------------------------------------------------------------------- */ List *SwigType_parmlist(const String *p) { String *item = 0; List *list; char *c; char *itemstart; int size; assert(p); c = Char(p); while (*c && (*c != '(') && (*c != '.')) c++; if (!*c) return 0; assert(*c != '.'); /* p is expected to contain sub elements of a type */ c++; list = NewList(); itemstart = c; while (*c) { if (*c == ',') { size = (int) (c - itemstart); item = NewStringWithSize(itemstart, size); Append(list, item); Delete(item); itemstart = c + 1; } else if (*c == '(') { int nparens = 1; c++; while (*c) { if (*c == '(') nparens++; if (*c == ')') { nparens--; if (nparens == 0) break; } c++; } } else if (*c == ')') { break; } if (*c) c++; } size = (int) (c - itemstart); if (size > 0) { item = NewStringWithSize(itemstart, size); Append(list, item); } Delete(item); return list; } /* ----------------------------------------------------------------------------- * Pointers * * SwigType_add_pointer() * SwigType_del_pointer() * SwigType_ispointer() * * Add, remove, and test if a type is a pointer. The deletion and query * functions take into account qualifiers (if any). * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_pointer(SwigType *t) { Insert(t, 0, "p."); return t; } SwigType *SwigType_del_pointer(SwigType *t) { char *c, *s; c = Char(t); s = c; /* Skip qualifiers, if any */ if (strncmp(c, "q(", 2) == 0) { c = strchr(c, '.'); assert(c); c++; } if (strncmp(c, "p.", 2)) { printf("Fatal error. SwigType_del_pointer applied to non-pointer.\n"); abort(); } Delslice(t, 0, (int)((c - s) + 2)); return t; } int SwigType_ispointer(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); /* Skip qualifiers, if any */ if (strncmp(c, "q(", 2) == 0) { c = strchr(c, '.'); if (!c) return 0; c++; } if (strncmp(c, "p.", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * References * * SwigType_add_reference() * SwigType_del_reference() * SwigType_isreference() * * Add, remove, and test if a type is a reference. The deletion and query * functions take into account qualifiers (if any). * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_reference(SwigType *t) { Insert(t, 0, "r."); return t; } SwigType *SwigType_del_reference(SwigType *t) { char *c = Char(t); int check = strncmp(c, "r.", 2); assert(check == 0); Delslice(t, 0, 2); return t; } int SwigType_isreference(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "r.", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Rvalue References * * SwigType_add_rvalue_reference() * SwigType_del_rvalue_reference() * SwigType_isrvalue_reference() * * Add, remove, and test if a type is a rvalue reference. The deletion and query * functions take into account qualifiers (if any). * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_rvalue_reference(SwigType *t) { Insert(t, 0, "z."); return t; } SwigType *SwigType_del_rvalue_reference(SwigType *t) { char *c = Char(t); int check = strncmp(c, "z.", 2); assert(check == 0); Delslice(t, 0, 2); return t; } int SwigType_isrvalue_reference(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "z.", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Qualifiers * * SwigType_add_qualifier() * SwigType_del_qualifier() * SwigType_is_qualifier() * * Adds type qualifiers like "const" and "volatile". When multiple qualifiers * are added to a type, they are combined together into a single qualifier. * Repeated qualifications have no effect. Moreover, the order of qualifications * is alphabetical---meaning that "const volatile" and "volatile const" are * stored in exactly the same way as "q(const volatile)". * 'qual' can be a list of multiple qualifiers in any order, separated by spaces. * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_qualifier(SwigType *t, const_String_or_char_ptr qual) { List *qlist; String *allq, *newq; int i, sz; const char *cqprev = 0; const char *c = Char(t); const char *cqual = Char(qual); /* if 't' has no qualifiers and 'qual' is a single qualifier, simply add it */ if ((strncmp(c, "q(", 2) != 0) && (strstr(cqual, " ") == 0)) { String *temp = NewStringf("q(%s).", cqual); Insert(t, 0, temp); Delete(temp); return t; } /* create string of all qualifiers */ if (strncmp(c, "q(", 2) == 0) { allq = SwigType_parm(t); Append(allq, " "); SwigType_del_element(t); /* delete old qualifier list from 't' */ } else { allq = NewStringEmpty(); } Append(allq, qual); /* create list of all qualifiers from string */ qlist = Split(allq, ' ', INT_MAX); Delete(allq); /* sort in alphabetical order */ SortList(qlist, Strcmp); /* create new qualifier string from unique elements of list */ sz = Len(qlist); newq = NewString("q("); for (i = 0; i < sz; ++i) { String *q = Getitem(qlist, i); const char *cq = Char(q); if (cqprev == 0 || strcmp(cqprev, cq) != 0) { if (i > 0) { Append(newq, " "); } Append(newq, q); cqprev = cq; } } Append(newq, ")."); Delete(qlist); /* replace qualifier string with new one */ Insert(t, 0, newq); Delete(newq); return t; } SwigType *SwigType_del_qualifier(SwigType *t) { char *c = Char(t); int check = strncmp(c, "q(", 2); assert(check == 0); Delslice(t, 0, element_size(c)); return t; } int SwigType_isqualifier(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "q(", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Function Pointers * ----------------------------------------------------------------------------- */ int SwigType_isfunctionpointer(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "p.f(", 4) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * SwigType_functionpointer_decompose * * Decompose the function pointer into the parameter list and the return type * t - input and on completion contains the return type * returns the function's parameters * ----------------------------------------------------------------------------- */ SwigType *SwigType_functionpointer_decompose(SwigType *t) { String *p; assert(SwigType_isfunctionpointer(t)); p = SwigType_pop(t); Delete(p); p = SwigType_pop(t); return p; } /* ----------------------------------------------------------------------------- * Member Pointers * * SwigType_add_memberpointer() * SwigType_del_memberpointer() * SwigType_ismemberpointer() * * Add, remove, and test for C++ pointer to members. * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_memberpointer(SwigType *t, const_String_or_char_ptr name) { String *temp = NewStringf("m(%s).", name); Insert(t, 0, temp); Delete(temp); return t; } SwigType *SwigType_del_memberpointer(SwigType *t) { char *c = Char(t); int check = strncmp(c, "m(", 2); assert(check == 0); Delslice(t, 0, element_size(c)); return t; } int SwigType_ismemberpointer(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "m(", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Arrays * * SwigType_add_array() * SwigType_del_array() * SwigType_isarray() * * Utility functions: * * SwigType_array_ndim() - Calculate number of array dimensions. * SwigType_array_getdim() - Get array dimension * SwigType_array_setdim() - Set array dimension * SwigType_array_type() - Return array type * SwigType_pop_arrays() - Remove all arrays * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_array(SwigType *t, const_String_or_char_ptr size) { String *temp = NewString("a("); Append(temp, size); Append(temp, ")."); Insert(t, 0, temp); Delete(temp); return t; } SwigType *SwigType_del_array(SwigType *t) { char *c = Char(t); int check = strncmp(c, "a(", 2); assert(check == 0); Delslice(t, 0, element_size(c)); return t; } int SwigType_isarray(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "a(", 2) == 0) { return 1; } return 0; } /* * SwigType_prefix_is_simple_1D_array * * Determine if the type is a 1D array type that is treated as a pointer within SWIG * eg Foo[], Foo[3] return true, but Foo[3][3], Foo*[], Foo*[3], Foo**[] return false */ int SwigType_prefix_is_simple_1D_array(const SwigType *t) { char *c = Char(t); if (c && (strncmp(c, "a(", 2) == 0)) { c = strchr(c, '.'); if (c) return (*(++c) == 0); } return 0; } /* Remove all arrays */ SwigType *SwigType_pop_arrays(SwigType *t) { String *ta; assert(SwigType_isarray(t)); ta = NewStringEmpty(); while (SwigType_isarray(t)) { SwigType *td = SwigType_pop(t); Append(ta, td); Delete(td); } return ta; } /* Return number of array dimensions */ int SwigType_array_ndim(const SwigType *t) { int ndim = 0; char *c = Char(t); while (c && (strncmp(c, "a(", 2) == 0)) { c = strchr(c, '.'); if (c) { c++; ndim++; } } return ndim; } /* Get nth array dimension */ String *SwigType_array_getdim(const SwigType *t, int n) { char *c = Char(t); while (c && (strncmp(c, "a(", 2) == 0) && (n > 0)) { c = strchr(c, '.'); if (c) { c++; n--; } } if (n == 0) { String *dim = SwigType_parm(c); if (SwigType_istemplate(dim)) { String *ndim = SwigType_namestr(dim); Delete(dim); dim = ndim; } return dim; } return 0; } /* Replace nth array dimension */ void SwigType_array_setdim(SwigType *t, int n, const_String_or_char_ptr rep) { String *result = 0; char temp; char *start; char *c = Char(t); start = c; if (strncmp(c, "a(", 2)) abort(); while (c && (strncmp(c, "a(", 2) == 0) && (n > 0)) { c = strchr(c, '.'); if (c) { c++; n--; } } if (n == 0) { temp = *c; *c = 0; result = NewString(start); Printf(result, "a(%s)", rep); *c = temp; c = strchr(c, '.'); Append(result, c); } Clear(t); Append(t, result); Delete(result); } /* Return base type of an array */ SwigType *SwigType_array_type(const SwigType *ty) { SwigType *t; t = Copy(ty); while (SwigType_isarray(t)) { Delete(SwigType_pop(t)); } return t; } /* ----------------------------------------------------------------------------- * Functions * * SwigType_add_function() * SwigType_isfunction() * SwigType_pop_function() * * Add, remove, and test for function types. * ----------------------------------------------------------------------------- */ /* Returns the function type, t, constructed from the parameters, parms */ SwigType *SwigType_add_function(SwigType *t, ParmList *parms) { String *pstr; Parm *p; Insert(t, 0, ")."); pstr = NewString("f("); for (p = parms; p; p = nextSibling(p)) { if (p != parms) Putc(',', pstr); Append(pstr, Getattr(p, "type")); } Insert(t, 0, pstr); Delete(pstr); return t; } /* ----------------------------------------------------------------------------- * SwigType_pop_function() * * Pop and return the function from the input type leaving the function's return * type, if any. * For example: * t in: q(const).f().p. * t out: p. * result: q(const).f(). * ----------------------------------------------------------------------------- */ SwigType *SwigType_pop_function(SwigType *t) { SwigType *f = 0; SwigType *g = 0; char *c = Char(t); if (strncmp(c, "r.", 2) == 0 || strncmp(c, "z.", 2) == 0) { /* Remove ref-qualifier */ f = SwigType_pop(t); c = Char(t); } if (strncmp(c, "q(", 2) == 0) { /* Remove cv-qualifier */ String *qual = SwigType_pop(t); if (f) { SwigType_push(qual, f); Delete(f); } f = qual; c = Char(t); } if (strncmp(c, "f(", 2)) { printf("Fatal error. SwigType_pop_function applied to non-function.\n"); abort(); } g = SwigType_pop(t); if (f) SwigType_push(g, f); Delete(f); return g; } /* ----------------------------------------------------------------------------- * SwigType_pop_function_qualifiers() * * Pop and return the function qualifiers from the input type leaving the rest of * function declaration. Returns NULL if no qualifiers. * For example: * t in: r.q(const).f().p. * t out: f().p. * result: r.q(const) * ----------------------------------------------------------------------------- */ SwigType *SwigType_pop_function_qualifiers(SwigType *t) { SwigType *qualifiers = 0; char *c = Char(t); if (strncmp(c, "r.", 2) == 0 || strncmp(c, "z.", 2) == 0) { /* Remove ref-qualifier */ String *qual = SwigType_pop(t); qualifiers = qual; c = Char(t); } if (strncmp(c, "q(", 2) == 0) { /* Remove cv-qualifier */ String *qual = SwigType_pop(t); if (qualifiers) { SwigType_push(qual, qualifiers); Delete(qualifiers); } qualifiers = qual; } assert(Strncmp(t, "f(", 2) == 0); return qualifiers; } int SwigType_isfunction(const SwigType *t) { char *c; if (!t) { return 0; } c = Char(t); if (strncmp(c, "r.", 2) == 0 || strncmp(c, "z.", 2) == 0) { /* Might be a function with a ref-qualifier, skip over */ c += 2; if (!*c) return 0; } if (strncmp(c, "q(", 2) == 0) { /* Might be a function with a cv-qualifier, skip over */ c = strchr(c, '.'); if (c) c++; else return 0; } if (strncmp(c, "f(", 2) == 0) { return 1; } return 0; } /* Create a list of parameters from the type t, using the file_line_node Node for * file and line numbering for the parameters */ ParmList *SwigType_function_parms(const SwigType *t, Node *file_line_node) { List *l = SwigType_parmlist(t); Hash *p, *pp = 0, *firstp = 0; Iterator o; for (o = First(l); o.item; o = Next(o)) { p = file_line_node ? NewParm(o.item, 0, file_line_node) : NewParmWithoutFileLineInfo(o.item, 0); if (!firstp) firstp = p; if (pp) { set_nextSibling(pp, p); Delete(p); } pp = p; } Delete(l); return firstp; } int SwigType_isvarargs(const SwigType *t) { if (Strcmp(t, "v(...)") == 0) return 1; return 0; } /* ----------------------------------------------------------------------------- * Templates * * SwigType_add_template() * * Template handling. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * SwigType_add_template() * * Adds a template to a type. This template is encoded in the SWIG type * mechanism and produces a string like this: * * vector ----> "vector<(p.int)>" * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_template(SwigType *t, ParmList *parms) { Parm *p; Append(t, "<("); for (p = parms; p; p = nextSibling(p)) { String *v; if (Getattr(p, "default")) continue; if (p != parms) Append(t, ","); v = Getattr(p, "value"); if (v) { Append(t, v); } else { Append(t, Getattr(p, "type")); } } Append(t, ")>"); return t; } /* ----------------------------------------------------------------------------- * SwigType_templateprefix() * * Returns the prefix before the first template definition. * Returns the type unmodified if not a template. * For example: * * Foo<(p.int)>::bar => Foo * r.q(const).Foo<(p.int)>::bar => r.q(const).Foo * Foo => Foo * ----------------------------------------------------------------------------- */ String *SwigType_templateprefix(const SwigType *t) { const char *s = Char(t); const char *c = strstr(s, "<("); return c ? NewStringWithSize(s, (int)(c - s)) : NewString(s); } /* ----------------------------------------------------------------------------- * SwigType_templatesuffix() * * Returns text after a template substitution. Used to handle scope names * for example: * * Foo<(p.int)>::bar * * returns "::bar" * ----------------------------------------------------------------------------- */ String *SwigType_templatesuffix(const SwigType *t) { const char *c; c = Char(t); while (*c) { if ((*c == '<') && (*(c + 1) == '(')) { int nest = 1; c++; while (*c && nest) { if (*c == '<') nest++; if (*c == '>') nest--; c++; } return NewString(c); } c++; } return NewStringEmpty(); } /* ----------------------------------------------------------------------------- * SwigType_istemplate_templateprefix() * * Combines SwigType_istemplate and SwigType_templateprefix efficiently into one function. * Returns the prefix before the first template definition. * Returns NULL if not a template. * For example: * * Foo<(p.int)>::bar => Foo * r.q(const).Foo<(p.int)>::bar => r.q(const).Foo * Foo => NULL * ----------------------------------------------------------------------------- */ String *SwigType_istemplate_templateprefix(const SwigType *t) { const char *s = Char(t); const char *c = strstr(s, "<("); return c ? NewStringWithSize(s, (int)(c - s)) : 0; } /* ----------------------------------------------------------------------------- * SwigType_istemplate_only_templateprefix() * * Similar to SwigType_istemplate_templateprefix() but only returns the template * prefix if the type is just the template and not a subtype/symbol within the template. * Returns NULL if not a template or is a template with a symbol within the template. * For example: * * Foo<(p.int)> => Foo * Foo<(p.int)>::bar => NULL * r.q(const).Foo<(p.int)> => r.q(const).Foo * r.q(const).Foo<(p.int)>::bar => NULL * Foo => NULL * ----------------------------------------------------------------------------- */ String *SwigType_istemplate_only_templateprefix(const SwigType *t) { int len = Len(t); const char *s = Char(t); if (len >= 4 && strcmp(s + len - 2, ")>") == 0) { const char *c = strstr(s, "<("); return c ? NewStringWithSize(s, (int)(c - s)) : 0; } else { return 0; } } /* ----------------------------------------------------------------------------- * SwigType_templateargs() * * Returns the template arguments * For example: * * Foo<(p.int)>::bar * * returns "<(p.int)>" * ----------------------------------------------------------------------------- */ String *SwigType_templateargs(const SwigType *t) { const char *c; const char *start; c = Char(t); while (*c) { if ((*c == '<') && (*(c + 1) == '(')) { int nest = 1; start = c; c++; while (*c && nest) { if (*c == '<') nest++; if (*c == '>') nest--; c++; } return NewStringWithSize(start, (int)(c - start)); } c++; } return 0; } /* ----------------------------------------------------------------------------- * SwigType_istemplate() * * Tests a type to see if it includes template parameters * ----------------------------------------------------------------------------- */ int SwigType_istemplate(const SwigType *t) { char *ct = Char(t); ct = strstr(ct, "<("); if (ct && (strstr(ct + 2, ")>"))) return 1; return 0; } /* ----------------------------------------------------------------------------- * SwigType_base() * * This function returns the base of a type. For example, if you have a * type "p.p.int", the function would return "int". * ----------------------------------------------------------------------------- */ SwigType *SwigType_base(const SwigType *t) { char *c; char *lastop = 0; c = Char(t); lastop = c; /* Search for the last type constructor separator '.' */ while (*c) { if (*c == '.') { if (*(c + 1)) { lastop = c + 1; } c++; continue; } if (*c == '<') { /* Skip over template---it's part of the base name */ int ntemp = 1; c++; while ((*c) && (ntemp > 0)) { if (*c == '>') ntemp--; else if (*c == '<') ntemp++; c++; } if (ntemp) break; continue; } if (*c == '(') { /* Skip over params */ int nparen = 1; c++; while ((*c) && (nparen > 0)) { if (*c == '(') nparen++; else if (*c == ')') nparen--; c++; } if (nparen) break; continue; } c++; } return NewString(lastop); } /* ----------------------------------------------------------------------------- * SwigType_prefix() * * Returns the prefix of a datatype. For example, the prefix of the * type "p.p.int" is "p.p.". * ----------------------------------------------------------------------------- */ String *SwigType_prefix(const SwigType *t) { char *c, *d; String *r = 0; c = Char(t); d = c + strlen(c); /* Check for a type constructor */ if ((d > c) && (*(d - 1) == '.')) d--; while (d > c) { d--; if (*d == '>') { int nest = 1; d--; while ((d > c) && (nest)) { if (*d == '>') nest++; if (*d == '<') nest--; d--; } } if (*d == ')') { /* Skip over params */ int nparen = 1; d--; while ((d > c) && (nparen)) { if (*d == ')') nparen++; if (*d == '(') nparen--; d--; } } if (*d == '.') { char t = *(d + 1); *(d + 1) = 0; r = NewString(c); *(d + 1) = t; return r; } } return NewStringEmpty(); } /* ----------------------------------------------------------------------------- * SwigType_strip_qualifiers() * * Strip all qualifiers from a type and return a new type * ----------------------------------------------------------------------------- */ SwigType *SwigType_strip_qualifiers(const SwigType *t) { static Hash *memoize_stripped = 0; SwigType *r; List *l; Iterator ei; if (!memoize_stripped) memoize_stripped = NewHash(); r = Getattr(memoize_stripped, t); if (r) return Copy(r); l = SwigType_split(t); r = NewStringEmpty(); for (ei = First(l); ei.item; ei = Next(ei)) { if (SwigType_isqualifier(ei.item)) continue; Append(r, ei.item); } Delete(l); { String *key, *value; key = Copy(t); value = Copy(r); Setattr(memoize_stripped, key, value); Delete(key); Delete(value); } return r; } /* ----------------------------------------------------------------------------- * SwigType_strip_single_qualifier() * * If the type contains a qualifier, strip one qualifier and return a new type. * The left most qualifier is stripped first (when viewed as C source code) but * this is the equivalent to the right most qualifier using SwigType notation. * Example: * r.q(const).p.q(const).int => r.q(const).p.int * r.q(const).p.int => r.p.int * r.p.int => r.p.int * ----------------------------------------------------------------------------- */ SwigType *SwigType_strip_single_qualifier(const SwigType *t) { static Hash *memoize_stripped = 0; SwigType *r = 0; List *l; int numitems; if (!memoize_stripped) memoize_stripped = NewHash(); r = Getattr(memoize_stripped, t); if (r) return Copy(r); l = SwigType_split(t); numitems = Len(l); if (numitems >= 2) { int item; /* iterate backwards from last but one item */ for (item = numitems - 2; item >= 0; --item) { String *subtype = Getitem(l, item); if (SwigType_isqualifier(subtype)) { Iterator it; Delitem(l, item); r = NewStringEmpty(); for (it = First(l); it.item; it = Next(it)) { Append(r, it.item); } break; } } } if (!r) r = Copy(t); Delete(l); { String *key, *value; key = Copy(t); value = Copy(r); Setattr(memoize_stripped, key, value); Delete(key); Delete(value); } return r; } swig-4.0.2/Source/Swig/typesys.c0000644000175000017500000017776313667507523016444 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * typesys.c * * SWIG type system management. These functions are used to manage * the C++ type system including typenames, typedef, type scopes, * inheritance, and namespaces. Generation of support code for the * run-time type checker is also handled here. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" /* ----------------------------------------------------------------------------- * Synopsis * * The purpose of this module is to manage type names and scoping issues related * to the C++ type system. The primary use is tracking typenames through typedef * and inheritance. * * New typenames are introduced by typedef, class, and enum declarations. * Each type is declared in a scope. This is either the global scope, a * class, or a namespace. For example: * * typedef int A; // Typename A, in global scope * namespace Foo { * typedef int A; // Typename A, in scope Foo:: * } * class Bar { // Typename Bar, in global scope * typedef int A; // Typename A, in scope Bar:: * } * * To manage scopes, the type system is constructed as a tree of hash tables. Each * hash table contains the following attributes: * * "name" - Scope name * "qname" - Fully qualified typename * "typetab" - Type table containing typenames and typedef information * For a given key in the typetab table, the value is a fully * qualified name if not pointing to itself. * "symtab" - Hash table of symbols defined in a scope * "inherit" - List of inherited scopes * "parent" - Parent scope * * The contents of these tables can be viewed for debugging using the -debug-typedef * option which calls SwigType_print_scope(). * * Typedef information is stored in the "typetab" hash table. For example, * if you have these declarations: * * typedef int A; * typedef A B; * typedef B *C; * * typetab in scope '' contains: * "A" : "int" * "B" : "A" * "C" : "p.B" * * To resolve a type back to its root type, one repeatedly expands on the type base. * For example: * * C *[40] ---> a(40).p.C (string type representation, see stype.c) * ---> a(40).p.p.B (C --> p.B) * ---> a(40).p.p.A (B --> A) * ---> a(40).p.p.int (A --> int) * * * Using declarations are stored in the "typetab" hash table. For example, * * namespace NN { * struct SS {}; * } * namespace N { * struct S {}; * using NN::SS; * } * using N::S; * * typetab in scope '' contains: * "S" : "N::S" * * and typetab in scope 'N' contains: * "SS" : "NN::SS" * "S" : "S" * * * For inheritance, SWIG tries to resolve types back to the base class. For instance, if * you have this: * * class Foo { * public: * typedef int Integer; * }; * struct Bar : public Foo { * void blah(Integer x); * }; * * In this case typetab in scope '' contains: * "Foo" : "Foo" * "Bar" : "Bar" * and scope 'Foo' contains: * "Integer" : "int" * and scope 'Bar' inherits from 'Foo' but is empty (observe that blah is not a scope or typedef) * * The argument type of Bar::blah will be set to Foo::Integer. * * * The scope-inheritance mechanism is used to manage C++ using directives. * * namespace XX { * class CC {}; * } * namespace X { * class C {}; * using namespace XX; * } * using namespace X; * * typetab in scope '' inherits from 'X' * typetab in scope 'X' inherits from 'XX' and contains: * "C" : "C" * typetab in scope 'XX' contains: * "CC" : "CC" * * * The scope-inheritance mechanism is used to manage C++ namespace aliases. * For example, if you have this: * * namespace Foo { * typedef int Integer; * } * * namespace F = Foo; * * In this case, F is defined as a scope that "inherits" from Foo. Internally, * F will merely be an empty scope that points to Foo. SWIG will never * place new type information into a namespace alias---attempts to do so * will generate a warning message (in the parser) and will place information into * Foo instead. * *----------------------------------------------------------------------------- */ static Typetab *current_scope = 0; /* Current type scope */ static Hash *current_typetab = 0; /* Current type table */ static Hash *current_symtab = 0; /* Current symbol table */ static Typetab *global_scope = 0; /* The global scope */ static Hash *scopes = 0; /* Hash table containing fully qualified scopes */ /* Performance optimization */ #define SWIG_TYPEDEF_RESOLVE_CACHE static Hash *typedef_resolve_cache = 0; static Hash *typedef_all_cache = 0; static Hash *typedef_qualified_cache = 0; static Typetab *SwigType_find_scope(Typetab *s, const SwigType *nameprefix); /* common attribute keys, to avoid calling find_key all the times */ /* Enable this one if your language fully support SwigValueWrapper. Leaving at '0' keeps the old swig behavior, which is not always safe, but is well known. Setting at '1' activates the new scheme, which is always safe but it requires all the typemaps to be ready for that. */ static int value_wrapper_mode = 0; int Swig_value_wrapper_mode(int mode) { value_wrapper_mode = mode; return mode; } static void flush_cache() { typedef_resolve_cache = 0; typedef_all_cache = 0; typedef_qualified_cache = 0; } /* Initialize the scoping system */ void SwigType_typesystem_init() { if (global_scope) Delete(global_scope); if (scopes) Delete(scopes); current_scope = NewHash(); global_scope = current_scope; Setattr(current_scope, "name", ""); /* No name for global scope */ current_typetab = NewHash(); Setattr(current_scope, "typetab", current_typetab); current_symtab = 0; scopes = NewHash(); Setattr(scopes, "", current_scope); } /* ----------------------------------------------------------------------------- * SwigType_typedef() * * Defines a new typedef in the current scope. Returns -1 if the type name is * already defined. * ----------------------------------------------------------------------------- */ int SwigType_typedef(const SwigType *type, const_String_or_char_ptr name) { /* Printf(stdout, "typedef %s %s\n", type, name); */ if (Getattr(current_typetab, name)) return -1; /* Already defined */ if (Strcmp(type, name) == 0) { /* Can't typedef a name to itself */ return 0; } /* Check if 'type' is already a scope. If so, we create an alias in the type system for it. This is needed to make strange nested scoping problems work correctly. */ { Typetab *t = SwigType_find_scope(current_scope, type); if (t) { SwigType_new_scope(name); SwigType_inherit_scope(t); SwigType_pop_scope(); } } Setattr(current_typetab, name, type); flush_cache(); return 0; } /* ----------------------------------------------------------------------------- * SwigType_typedef_class() * * Defines a class in the current scope. * ----------------------------------------------------------------------------- */ int SwigType_typedef_class(const_String_or_char_ptr name) { String *cname; /* Printf(stdout,"class : '%s'\n", name); */ if (Getattr(current_typetab, name)) return -1; /* Already defined */ cname = NewString(name); Setmeta(cname, "class", "1"); Setattr(current_typetab, cname, cname); Delete(cname); flush_cache(); return 0; } /* ----------------------------------------------------------------------------- * SwigType_scope_name() * * Returns the qualified scope name of a type table * ----------------------------------------------------------------------------- */ String *SwigType_scope_name(Typetab *ttab) { String *qname = NewString(Getattr(ttab, "name")); ttab = Getattr(ttab, "parent"); while (ttab) { String *pname = Getattr(ttab, "name"); if (Len(pname)) { Insert(qname, 0, "::"); Insert(qname, 0, pname); } ttab = Getattr(ttab, "parent"); } return qname; } /* ----------------------------------------------------------------------------- * SwigType_new_scope() * * Creates a new scope * ----------------------------------------------------------------------------- */ void SwigType_new_scope(const_String_or_char_ptr name) { Typetab *s; Hash *ttab; String *qname; if (!name) { name = ""; } s = NewHash(); Setattr(s, "name", name); Setattr(s, "parent", current_scope); ttab = NewHash(); Setattr(s, "typetab", ttab); /* Build fully qualified name */ qname = SwigType_scope_name(s); #if 1 { /* TODO: only do with templates? What happens with non-templates with code below? */ String *stripped_qname; stripped_qname = SwigType_remove_global_scope_prefix(qname); /* Use fully qualified name for hash key without unary scope prefix, qname may contain unary scope */ Setattr(scopes, stripped_qname, s); Setattr(s, "qname", qname); /* Printf(stdout, "SwigType_new_scope stripped %s %s\n", qname, stripped_qname); */ Delete(stripped_qname); } #else Printf(stdout, "SwigType_new_scope %s\n", qname); Setattr(scopes, qname, s); Setattr(s, "qname", qname); #endif Delete(qname); current_scope = s; current_typetab = ttab; current_symtab = 0; flush_cache(); } /* ----------------------------------------------------------------------------- * SwigType_inherit_scope() * * Makes the current scope inherit from another scope. This is used for both * C++ class inheritance, namespaces, and namespace aliases. * ----------------------------------------------------------------------------- */ void SwigType_inherit_scope(Typetab *scope) { List *inherits; int i, len; inherits = Getattr(current_scope, "inherit"); if (!inherits) { inherits = NewList(); Setattr(current_scope, "inherit", inherits); Delete(inherits); } assert(scope != current_scope); len = Len(inherits); for (i = 0; i < len; i++) { Node *n = Getitem(inherits, i); if (n == scope) return; } Append(inherits, scope); } /* ----------------------------------------------------------------------------- * SwigType_scope_alias() * * Creates a scope-alias. * ----------------------------------------------------------------------------- */ void SwigType_scope_alias(String *aliasname, Typetab *ttab) { String *q; /* Printf(stdout,"alias: '%s' '%p'\n", aliasname, ttab); */ q = SwigType_scope_name(current_scope); if (Len(q)) { Append(q, "::"); } Append(q, aliasname); Setattr(scopes, q, ttab); flush_cache(); } /* ----------------------------------------------------------------------------- * SwigType_using_scope() * * Import another scope into this scope. * ----------------------------------------------------------------------------- */ void SwigType_using_scope(Typetab *scope) { SwigType_inherit_scope(scope); { List *ulist; int i, len; ulist = Getattr(current_scope, "using"); if (!ulist) { ulist = NewList(); Setattr(current_scope, "using", ulist); Delete(ulist); } assert(scope != current_scope); len = Len(ulist); for (i = 0; i < len; i++) { Typetab *n = Getitem(ulist, i); if (n == scope) return; } Append(ulist, scope); } flush_cache(); } /* ----------------------------------------------------------------------------- * SwigType_pop_scope() * * Pop off the last scope and perform a merge operation. Returns the hash * table for the scope that was popped off. * ----------------------------------------------------------------------------- */ Typetab *SwigType_pop_scope() { Typetab *t, *old = current_scope; t = Getattr(current_scope, "parent"); if (!t) t = global_scope; current_scope = t; current_typetab = Getattr(t, "typetab"); current_symtab = Getattr(t, "symtab"); flush_cache(); return old; } /* ----------------------------------------------------------------------------- * SwigType_set_scope() * * Set the scope. Returns the old scope. * ----------------------------------------------------------------------------- */ Typetab *SwigType_set_scope(Typetab *t) { Typetab *old = current_scope; if (!t) t = global_scope; current_scope = t; current_typetab = Getattr(t, "typetab"); current_symtab = Getattr(t, "symtab"); flush_cache(); return old; } /* ----------------------------------------------------------------------------- * SwigType_attach_symtab() * * Attaches a symbol table to a type scope * ----------------------------------------------------------------------------- */ void SwigType_attach_symtab(Symtab *sym) { Setattr(current_scope, "symtab", sym); current_symtab = sym; } /* ----------------------------------------------------------------------------- * SwigType_print_scope() * * Debugging function for printing out current scope * ----------------------------------------------------------------------------- */ void SwigType_print_scope(void) { Hash *ttab; Iterator i, j; Printf(stdout, "SCOPES start =======================================\n"); for (i = First(scopes); i.key; i = Next(i)) { Printf(stdout, "-------------------------------------------------------------\n"); ttab = Getattr(i.item, "typetab"); Printf(stdout, "Type scope '%s' (%p)\n", i.key, i.item); { List *inherit = Getattr(i.item, "inherit"); if (inherit) { Iterator j; for (j = First(inherit); j.item; j = Next(j)) { Printf(stdout, " Inherits from '%s' (%p)\n", Getattr(j.item, "qname"), j.item); } } } for (j = First(ttab); j.key; j = Next(j)) { Printf(stdout, "%40s -> %s\n", j.key, j.item); } } Printf(stdout, "SCOPES finish =======================================\n"); } static Typetab *SwigType_find_scope(Typetab *s, const SwigType *nameprefix) { Typetab *ss; Typetab *s_orig = s; String *nnameprefix = 0; static int check_parent = 1; int is_template = 0; if (Getmark(s)) return 0; Setmark(s, 1); is_template = SwigType_istemplate(nameprefix); if (is_template) { nnameprefix = SwigType_typedef_resolve_all(nameprefix); nameprefix = nnameprefix; } ss = s; while (ss) { String *full; String *qname = Getattr(ss, "qname"); if (qname) { full = NewStringf("%s::%s", qname, nameprefix); } else { full = NewString(nameprefix); } s = Getattr(scopes, full); if (!s && is_template) { /* try look up scope with all the unary scope operators within the template parameter list removed */ SwigType *full_stripped = SwigType_remove_global_scope_prefix(full); s = Getattr(scopes, full_stripped); Delete(full_stripped); } Delete(full); if (s) { if (nnameprefix) Delete(nnameprefix); Setmark(s_orig, 0); return s; } if (!s) { /* Check inheritance */ List *inherit; inherit = Getattr(ss, "using"); if (inherit) { Typetab *ttab; int i, len; len = Len(inherit); for (i = 0; i < len; i++) { int oldcp = check_parent; ttab = Getitem(inherit, i); check_parent = 0; s = SwigType_find_scope(ttab, nameprefix); check_parent = oldcp; if (s) { if (nnameprefix) Delete(nnameprefix); Setmark(s_orig, 0); return s; } } } } if (!check_parent) break; ss = Getattr(ss, "parent"); } if (nnameprefix) Delete(nnameprefix); Setmark(s_orig, 0); return 0; } /* ----------------------------------------------------------------------------- * typedef_resolve() * * Resolves a typedef and returns a new type string. Returns 0 if there is no * typedef mapping. base is a name without qualification. * Internal function. * ----------------------------------------------------------------------------- */ static Typetab *resolved_scope = 0; /* Internal function */ static SwigType *_typedef_resolve(Typetab *s, String *base, int look_parent) { Hash *ttab; SwigType *type = 0; List *inherit; Typetab *parent; /* if (!s) return 0; *//* now is checked below */ /* Printf(stdout,"Typetab %s : %s\n", Getattr(s,"name"), base); */ if (!Getmark(s)) { Setmark(s, 1); ttab = Getattr(s, "typetab"); type = Getattr(ttab, base); if (type) { resolved_scope = s; Setmark(s, 0); } else { /* Hmmm. Not found in my scope. It could be in an inherited scope */ inherit = Getattr(s, "inherit"); if (inherit) { int i, len; len = Len(inherit); for (i = 0; i < len; i++) { type = _typedef_resolve(Getitem(inherit, i), base, 0); if (type) { Setmark(s, 0); break; } } } if (!type) { /* Hmmm. Not found in my scope. check parent */ if (look_parent) { parent = Getattr(s, "parent"); type = parent ? _typedef_resolve(parent, base, 1) : 0; } } Setmark(s, 0); } } return type; } /* ----------------------------------------------------------------------------- * template_parameters_resolve() * * For use with templates only. Attempts to resolve one template parameter. * * If one of the template parameters can be resolved, the type is returned with * just the one parameter resolved and the remaining parameters left as is. * If none of the template parameters can be resolved, zero is returned. * ----------------------------------------------------------------------------- */ static String *template_parameters_resolve(const String *base) { List *tparms; String *suffix; String *type; int i, sz; int rep = 0; type = SwigType_templateprefix(base); suffix = SwigType_templatesuffix(base); Append(type, "<("); tparms = SwigType_parmlist(base); sz = Len(tparms); for (i = 0; i < sz; i++) { SwigType *tpr; SwigType *tp = Getitem(tparms, i); if (!rep) { tpr = SwigType_typedef_resolve(tp); } else { tpr = 0; } if (tpr) { Append(type, tpr); Delete(tpr); rep = 1; } else { Append(type, tp); } if ((i + 1) < sz) Append(type, ","); } if (rep) { Append(type, ")>"); Append(type, suffix); } else { Delete(type); type = 0; } Delete(suffix); Delete(tparms); return type; } static SwigType *typedef_resolve(Typetab *s, String *base) { return _typedef_resolve(s, base, 1); } /* ----------------------------------------------------------------------------- * SwigType_typedef_resolve() * * Given a type declaration, this function looks to reduce/resolve the type via a * typedef (including via C++ using declarations). * * If it is able to find a typedef, the resolved type is returned. If no typedef * is found NULL is returned. The type name is resolved in the current scope. * The type returned is not always fully qualified for the global scope, it is * valid for use in the current scope. If the current scope is global scope, a * fully qualified type should be returned. * * Some additional notes are in Doc/Manual/Extending.html. * ----------------------------------------------------------------------------- */ /* #define SWIG_DEBUG */ SwigType *SwigType_typedef_resolve(const SwigType *t) { String *base; String *type = 0; String *r = 0; Typetab *s; Hash *ttab; String *namebase = 0; String *nameprefix = 0, *rnameprefix = 0; int newtype = 0; resolved_scope = 0; #ifdef SWIG_TYPEDEF_RESOLVE_CACHE if (!typedef_resolve_cache) { typedef_resolve_cache = NewHash(); } r = Getattr(typedef_resolve_cache, t); if (r) { resolved_scope = Getmeta(r, "scope"); return Copy(r); } #endif base = SwigType_base(t); #ifdef SWIG_DEBUG Printf(stdout, "base = '%s' t='%s'\n", base, t); #endif if (SwigType_issimple(base)) { s = current_scope; ttab = current_typetab; if (strncmp(Char(base), "::", 2) == 0) { s = global_scope; ttab = Getattr(s, "typetab"); Delitem(base, 0); Delitem(base, 0); } /* Do a quick check in the local scope */ type = Getattr(ttab, base); if (type) { resolved_scope = s; } if (!type) { /* Didn't find in this scope. We need to do a little more searching */ if (Swig_scopename_check(base)) { /* A qualified name. */ Swig_scopename_split(base, &nameprefix, &namebase); #ifdef SWIG_DEBUG Printf(stdout, "nameprefix = '%s'\n", nameprefix); #endif if (nameprefix) { rnameprefix = SwigType_typedef_resolve(nameprefix); if(rnameprefix != NULL) { #ifdef SWIG_DEBUG Printf(stdout, "nameprefix '%s' is a typedef to '%s'\n", nameprefix, rnameprefix); #endif type = Copy(namebase); Insert(type, 0, "::"); Insert(type, 0, rnameprefix); if (strncmp(Char(type), "::", 2) == 0) { Delitem(type, 0); Delitem(type, 0); } newtype = 1; } else { /* Name had a prefix on it. See if we can locate the proper scope for it */ String *rnameprefix = template_parameters_resolve(nameprefix); nameprefix = rnameprefix ? Copy(rnameprefix) : nameprefix; Delete(rnameprefix); s = SwigType_find_scope(s, nameprefix); /* Couldn't locate a scope for the type. */ if (!s) { Delete(base); Delete(namebase); Delete(nameprefix); r = 0; goto return_result; } /* Try to locate the name starting in the scope */ #ifdef SWIG_DEBUG Printf(stdout, "namebase = '%s'\n", namebase); #endif type = typedef_resolve(s, namebase); if (type && resolved_scope) { /* we need to look for the resolved type, this will also fix the resolved_scope if 'type' and 'namebase' are declared in different scopes */ String *rtype = 0; rtype = typedef_resolve(resolved_scope, type); if (rtype) type = rtype; } #ifdef SWIG_DEBUG Printf(stdout, "%s type = '%s'\n", Getattr(s, "name"), type); #endif if ((type) && (!Swig_scopename_check(type)) && resolved_scope) { Typetab *rtab = resolved_scope; String *qname = Getattr(resolved_scope, "qname"); /* If qualified *and* the typename is defined from the resolved scope, we qualify */ if ((qname) && typedef_resolve(resolved_scope, type)) { type = Copy(type); Insert(type, 0, "::"); Insert(type, 0, qname); #ifdef SWIG_DEBUG Printf(stdout, "qual %s \n", type); #endif newtype = 1; } resolved_scope = rtab; } } } else { /* Name is unqualified. */ type = typedef_resolve(s, base); } } else { /* Name is unqualified. */ type = typedef_resolve(s, base); } } if (!type && SwigType_istemplate(base)) { String *tprefix = SwigType_templateprefix(base); String *rtprefix = SwigType_typedef_resolve(tprefix); /* We're looking for a using declaration on the template prefix to resolve the template prefix * in another scope. Using declaration do not have template parameters. */ if (rtprefix && !SwigType_istemplate(rtprefix)) { String *tsuffix = SwigType_templatesuffix(base); String *targs = SwigType_templateargs(base); type = NewString(rtprefix); newtype = 1; Append(type, targs); Append(type, tsuffix); Delete(targs); Delete(tsuffix); Delete(rtprefix); } Delete(tprefix); } if (type && (Equal(base, type))) { if (newtype) Delete(type); Delete(base); Delete(namebase); Delete(nameprefix); r = 0; goto return_result; } /* If the type is a template, and no typedef was found, we need to check the template arguments one by one to see if they can be resolved. */ if (!type && SwigType_istemplate(base)) { newtype = 1; type = template_parameters_resolve(base); } Delete(namebase); Delete(nameprefix); } else { if (SwigType_isfunction(base)) { List *parms; int i, sz; int rep = 0; type = NewString("f("); newtype = 1; parms = SwigType_parmlist(base); sz = Len(parms); for (i = 0; i < sz; i++) { SwigType *tpr; SwigType *tp = Getitem(parms, i); if (!rep) { tpr = SwigType_typedef_resolve(tp); } else { tpr = 0; } if (tpr) { Append(type, tpr); Delete(tpr); rep = 1; } else { Append(type, tp); } if ((i + 1) < sz) Append(type, ","); } Append(type, ")."); Delete(parms); if (!rep) { Delete(type); type = 0; } } else if (SwigType_ismemberpointer(base)) { String *rt; String *mtype = SwigType_parm(base); rt = SwigType_typedef_resolve(mtype); if (rt) { type = NewStringf("m(%s).", rt); newtype = 1; Delete(rt); } Delete(mtype); } else { type = 0; } } r = SwigType_prefix(t); if (!type) { if (r && Len(r)) { char *cr = Char(r); if ((strstr(cr, "f(") || (strstr(cr, "m(")))) { SwigType *rt = SwigType_typedef_resolve(r); if (rt) { Delete(r); Append(rt, base); Delete(base); r = rt; goto return_result; } } } Delete(r); Delete(base); r = 0; goto return_result; } Delete(base); /* If 'type' is an array, then the right-most qualifier in 'r' should be added to 'type' after the array qualifier, so that given a(7).q(volatile).double myarray // typedef volatile double[7] myarray; the type q(const).myarray // const myarray becomes a(7).q(const volatile).double // const volatile double[7] and NOT q(const).a(7).q(volatile).double // non-sensical type */ if (r && Len(r) && SwigType_isarray(type)) { List *r_elem; String *r_qual; int r_sz; r_elem = SwigType_split(r); r_sz = Len(r_elem); r_qual = Getitem(r_elem, r_sz-1); if (SwigType_isqualifier(r_qual)) { String *new_r; String *new_type; List *type_elem; String *type_qual; String *r_qual_arg; int i, type_sz; type_elem = SwigType_split(type); type_sz = Len(type_elem); for (i = 0; i < type_sz; ++i) { String *e = Getitem(type_elem, i); if (!SwigType_isarray(e)) break; } type_qual = Copy(Getitem(type_elem, i)); r_qual_arg = SwigType_parm(r_qual); SwigType_add_qualifier(type_qual, r_qual_arg); Delete(r_qual_arg); Setitem(type_elem, i, type_qual); new_r = NewStringEmpty(); for (i = 0; i < r_sz-1; ++i) { Append(new_r, Getitem(r_elem, i)); } new_type = NewStringEmpty(); for (i = 0; i < type_sz; ++i) { Append(new_type, Getitem(type_elem, i)); } #ifdef SWIG_DEBUG Printf(stdout, "r+type='%s%s' new_r+new_type='%s%s'\n", r, type, new_r, new_type); #endif Delete(r); r = new_r; newtype = 1; type = new_type; Delete(type_elem); } Delete(r_elem); } Append(r, type); if (newtype) { Delete(type); } return_result: #ifdef SWIG_TYPEDEF_RESOLVE_CACHE { String *key = NewString(t); if (r) { SwigType *r1; Setattr(typedef_resolve_cache, key, r); Setmeta(r, "scope", resolved_scope); r1 = Copy(r); Delete(r); r = r1; } Delete(key); } #endif return r; } /* ----------------------------------------------------------------------------- * SwigType_typedef_resolve_all() * * Fully resolve a type down to its most basic datatype * ----------------------------------------------------------------------------- */ SwigType *SwigType_typedef_resolve_all(const SwigType *t) { SwigType *n; SwigType *r; int count = 0; /* Check to see if the typedef resolve has been done before by checking the cache */ if (!typedef_all_cache) { typedef_all_cache = NewHash(); } r = Getattr(typedef_all_cache, t); if (r) { return Copy(r); } #ifdef SWIG_DEBUG Printf(stdout, "SwigType_typedef_resolve_all start ... %s\n", t); #endif /* Recursively resolve the typedef */ r = NewString(t); while ((n = SwigType_typedef_resolve(r))) { Delete(r); r = n; if (++count >= 512) { Swig_error(Getfile(t), Getline(t), "Recursive typedef detected resolving '%s' to '%s' to '%s' and so on...\n", SwigType_str(t, 0), SwigType_str(SwigType_typedef_resolve(t), 0), SwigType_str(SwigType_typedef_resolve(SwigType_typedef_resolve(t)), 0)); break; } } /* Add the typedef to the cache for next time it is looked up */ { String *key; SwigType *rr = Copy(r); key = NewString(t); Setattr(typedef_all_cache, key, rr); Delete(key); Delete(rr); } #ifdef SWIG_DEBUG Printf(stdout, "SwigType_typedef_resolve_all end === %s => %s\n", t, r); #endif return r; } /* ----------------------------------------------------------------------------- * SwigType_typedef_qualified() * * Given a type declaration, this function tries to fully qualify it so that the * resulting type can be used in the global scope. The type name is resolved in * the current scope. * * It provides a fully qualified name, not necessarily a fully expanded name. * When a using declaration or using directive is found the type may not be fully * expanded, but it will be resolved and fully qualified for use in the global scope. * * This function is for looking up scopes to qualify a type. It does not resolve * C typedefs, it just qualifies them. See SwigType_typedef_resolve for resolving. * * If the unary scope operator (::) is used as a prefix to the type to denote global * scope, it is left in place. * ----------------------------------------------------------------------------- */ SwigType *SwigType_typedef_qualified(const SwigType *t) { List *elements; String *result; int i, len; if (!typedef_qualified_cache) typedef_qualified_cache = NewHash(); result = Getattr(typedef_qualified_cache, t); if (result) { String *rc = Copy(result); return rc; } result = NewStringEmpty(); elements = SwigType_split(t); len = Len(elements); for (i = 0; i < len; i++) { String *ty = 0; String *e = Getitem(elements, i); if (SwigType_issimple(e)) { if (!SwigType_istemplate(e)) { String *isenum = 0; if (SwigType_isenum(e)) { isenum = NewString("enum "); ty = NewString(Char(e) + 5); e = ty; } resolved_scope = 0; if (typedef_resolve(current_scope, e) && resolved_scope) { /* resolved_scope contains the scope that actually resolved the symbol */ String *qname = Getattr(resolved_scope, "qname"); if (qname) { Insert(e, 0, "::"); Insert(e, 0, qname); } } else { if (Swig_scopename_check(e)) { String *qlast; String *qname; Swig_scopename_split(e, &qname, &qlast); if (qname) { String *tqname = SwigType_typedef_qualified(qname); Clear(e); Printf(e, "%s::%s", tqname, qlast); Delete(qname); Delete(tqname); } Delete(qlast); /* Automatic template instantiation might go here??? */ } else { /* It's a bare name. It's entirely possible, that the name is part of a namespace. We'll check this by unrolling out of the current scope */ Typetab *cs = current_scope; if (cs) { Typetab *found_scope = SwigType_find_scope(cs, e); if (found_scope) { String *qs = SwigType_scope_name(found_scope); Clear(e); Append(e, qs); Delete(qs); } } } } if (isenum) { Insert(e, 0, isenum); Delete(isenum); } } else { /* Template. We need to qualify template parameters as well as the template itself */ String *tprefix, *qprefix; String *tsuffix; Iterator pi; Parm *p; List *parms; ty = Swig_symbol_template_deftype(e, current_symtab); e = ty; parms = SwigType_parmlist(e); tprefix = SwigType_templateprefix(e); tsuffix = SwigType_templatesuffix(e); qprefix = SwigType_typedef_qualified(tprefix); Append(qprefix, "<("); pi = First(parms); while ((p = pi.item)) { String *qt = SwigType_typedef_qualified(p); if (Equal(qt, p)) { /* && (!Swig_scopename_check(qt))) */ /* No change in value. It is entirely possible that the parameter is an integer value. If there is a symbol table associated with this scope, we're going to check for this */ if (current_symtab) { Node *lastnode = 0; String *value = Copy(p); while (1) { Node *n = Swig_symbol_clookup(value, current_symtab); if (n == lastnode) break; lastnode = n; if (n) { char *ntype = Char(nodeType(n)); if (strcmp(ntype, "enumitem") == 0) { /* An enum item. Generate a fully qualified name */ String *qn = Swig_symbol_qualified(n); if (Len(qn)) { Append(qn, "::"); Append(qn, Getattr(n, "name")); Delete(value); value = qn; continue; } else { Delete(qn); break; } } else if ((strcmp(ntype, "cdecl") == 0) && (Getattr(n, "value"))) { Delete(value); value = Copy(Getattr(n, "value")); continue; } } break; } Append(qprefix, value); Delete(value); } else { Append(qprefix, p); } } else { Append(qprefix, qt); } Delete(qt); pi = Next(pi); if (pi.item) { Append(qprefix, ","); } } Append(qprefix, ")>"); Append(qprefix, tsuffix); Delete(tsuffix); Clear(e); Append(e, qprefix); Delete(tprefix); Delete(qprefix); Delete(parms); } Append(result, e); Delete(ty); } else if (SwigType_isfunction(e)) { List *parms = SwigType_parmlist(e); String *s = NewString("f("); Iterator pi; pi = First(parms); while (pi.item) { String *pq = SwigType_typedef_qualified(pi.item); Append(s, pq); Delete(pq); pi = Next(pi); if (pi.item) { Append(s, ","); } } Append(s, ")."); Append(result, s); Delete(s); Delete(parms); } else if (SwigType_isarray(e)) { String *ndim; String *dim = SwigType_parm(e); ndim = Swig_symbol_string_qualify(dim, 0); Printf(result, "a(%s).", ndim); Delete(dim); Delete(ndim); } else { Append(result, e); } } Delete(elements); { String *key, *cresult; key = NewString(t); cresult = NewString(result); Setattr(typedef_qualified_cache, key, cresult); Delete(key); Delete(cresult); } return result; } /* ----------------------------------------------------------------------------- * SwigType_istypedef() * * Checks a typename to see if it is a typedef. * ----------------------------------------------------------------------------- */ int SwigType_istypedef(const SwigType *t) { String *type; type = SwigType_typedef_resolve(t); if (type) { Delete(type); return 1; } else { return 0; } } /* ----------------------------------------------------------------------------- * SwigType_typedef_using() * * Processes a 'using' declaration to import types from one scope into another. * Name is a qualified name like A::B. * ----------------------------------------------------------------------------- */ int SwigType_typedef_using(const_String_or_char_ptr name) { String *base; String *td; String *prefix; Typetab *s; Typetab *tt = 0; String *defined_name = 0; /* Printf(stdout, "using %s\n", name); */ if (!Swig_scopename_check(name)) return -1; /* Not properly qualified */ base = Swig_scopename_last(name); /* See if the base is already defined in this scope */ if (Getattr(current_typetab, base)) { Delete(base); return -1; } /* See if the using name is a scope */ /* tt = SwigType_find_scope(current_scope,name); Printf(stdout,"tt = %p, name = '%s'\n", tt, name); */ /* We set up a typedef B --> A::B */ Setattr(current_typetab, base, name); /* Find the scope name where the symbol is defined */ td = SwigType_typedef_resolve(name); /* Printf(stdout,"td = '%s' %p\n", td, resolved_scope); */ if (resolved_scope) { defined_name = Getattr(resolved_scope, "qname"); if (defined_name) { defined_name = Copy(defined_name); Append(defined_name, "::"); Append(defined_name, base); /* Printf(stdout,"defined_name = '%s'\n", defined_name); */ tt = SwigType_find_scope(current_scope, defined_name); } } if (td) Delete(td); /* Figure out the scope the using directive refers to */ { prefix = Swig_scopename_prefix(name); if (prefix) { s = SwigType_find_scope(current_scope, prefix); if (s) { Hash *ttab = Getattr(s, "typetab"); if (!Getattr(ttab, base) && defined_name) { Setattr(ttab, base, defined_name); } } } } if (tt) { /* Using directive had its own scope. We need to create a new scope for it */ SwigType_new_scope(base); SwigType_inherit_scope(tt); SwigType_pop_scope(); } if (defined_name) Delete(defined_name); Delete(prefix); Delete(base); return 0; } /* ----------------------------------------------------------------------------- * SwigType_isclass() * * Determines if a type defines a class or not. A class is defined by * its type-table entry maps to itself. Note: a pointer to a class is not * a class. * ----------------------------------------------------------------------------- */ int SwigType_isclass(const SwigType *t) { SwigType *qty, *qtys; int isclass = 0; qty = SwigType_typedef_resolve_all(t); qtys = SwigType_strip_qualifiers(qty); if (SwigType_issimple(qtys)) { String *td = SwigType_typedef_resolve(qtys); if (td) { Delete(td); } if (resolved_scope) { isclass = 1; } /* Hmmm. Not a class. If a template, it might be uninstantiated */ if (!isclass) { String *tp = SwigType_istemplate_templateprefix(qtys); if (tp && Strcmp(tp, t) != 0) { isclass = SwigType_isclass(tp); } Delete(tp); } } Delete(qty); Delete(qtys); return isclass; } /* ----------------------------------------------------------------------------- * SwigType_type() * * Returns an integer code describing the datatype. This is only used for * compatibility with SWIG1.1 language modules and is likely to go away once * everything is based on typemaps. * ----------------------------------------------------------------------------- */ int SwigType_type(const SwigType *t) { char *c; /* Check for the obvious stuff */ c = Char(t); if (strncmp(c, "p.", 2) == 0) { if (SwigType_type(c + 2) == T_CHAR) return T_STRING; else if (SwigType_type(c + 2) == T_WCHAR) return T_WSTRING; else return T_POINTER; } if (strncmp(c, "a(", 2) == 0) return T_ARRAY; if (strncmp(c, "r.", 2) == 0) return T_REFERENCE; if (strncmp(c, "z.", 2) == 0) return T_RVALUE_REFERENCE; if (strncmp(c, "m(", 2) == 0) return T_MPOINTER; if (strncmp(c, "q(", 2) == 0) { while (*c && (*c != '.')) c++; if (*c) return SwigType_type(c + 1); return T_ERROR; } if (strncmp(c, "f(", 2) == 0) return T_FUNCTION; /* Look for basic types */ if (strcmp(c, "int") == 0) return T_INT; if (strcmp(c, "long") == 0) return T_LONG; if (strcmp(c, "short") == 0) return T_SHORT; if (strcmp(c, "unsigned") == 0) return T_UINT; if (strcmp(c, "unsigned short") == 0) return T_USHORT; if (strcmp(c, "unsigned long") == 0) return T_ULONG; if (strcmp(c, "unsigned int") == 0) return T_UINT; if (strcmp(c, "char") == 0) return T_CHAR; if (strcmp(c, "signed char") == 0) return T_SCHAR; if (strcmp(c, "unsigned char") == 0) return T_UCHAR; if (strcmp(c, "wchar_t") == 0) return T_WCHAR; if (strcmp(c, "float") == 0) return T_FLOAT; if (strcmp(c, "double") == 0) return T_DOUBLE; if (strcmp(c, "long double") == 0) return T_LONGDOUBLE; if (!cparse_cplusplus && (strcmp(c, "float complex") == 0)) return T_FLTCPLX; if (!cparse_cplusplus && (strcmp(c, "double complex") == 0)) return T_DBLCPLX; if (!cparse_cplusplus && (strcmp(c, "complex") == 0)) return T_COMPLEX; if (strcmp(c, "void") == 0) return T_VOID; if (strcmp(c, "bool") == 0) return T_BOOL; if (strcmp(c, "long long") == 0) return T_LONGLONG; if (strcmp(c, "unsigned long long") == 0) return T_ULONGLONG; if (strncmp(c, "enum ", 5) == 0) return T_INT; if (strcmp(c, "auto") == 0) return T_AUTO; if (strcmp(c, "v(...)") == 0) return T_VARARGS; /* Hmmm. Unknown type */ if (SwigType_istypedef(t)) { int r; SwigType *nt = SwigType_typedef_resolve(t); r = SwigType_type(nt); Delete(nt); return r; } return T_USER; } /* ----------------------------------------------------------------------------- * SwigType_alttype() * * Returns the alternative value type needed in C++ for class value * types. When swig is not sure about using a plain $ltype value, * since the class doesn't have a default constructor, or it can't be * assigned, you will get back 'SwigValueWrapper'. * * This is the default behavior unless: * * 1.- swig detects a default_constructor and 'setallocate:default_constructor' * attribute. * * 2.- swig doesn't mark 'type' as non-assignable. * * 3.- the user specifies that the value wrapper is not needed by using * %feature("novaluewrapper") like so: * * %feature("novaluewrapper") MyOpaqueClass; * class MyOpaqueClass; * * The user can also force the use of the value wrapper with * %feature("valuewrapper"). * ----------------------------------------------------------------------------- */ SwigType *SwigType_alttype(const SwigType *t, int local_tmap) { Node *n; SwigType *w = 0; int use_wrapper = 0; SwigType *td = 0; if (!cparse_cplusplus) return 0; if (value_wrapper_mode == 0) { /* old partial use of SwigValueTypes, it can fail for opaque types */ if (local_tmap) return 0; if (SwigType_isclass(t)) { SwigType *ftd = SwigType_typedef_resolve_all(t); td = SwigType_strip_qualifiers(ftd); Delete(ftd); n = Swig_symbol_clookup(td, 0); if (n) { if (GetFlag(n, "feature:valuewrapper")) { use_wrapper = 1; } else { if (Checkattr(n, "nodeType", "class") && (!Getattr(n, "allocate:default_constructor") || (Getattr(n, "allocate:noassign")))) { use_wrapper = !GetFlag(n, "feature:novaluewrapper") || GetFlag(n, "feature:nodefault"); } } } else { if (SwigType_issimple(td) && SwigType_istemplate(td)) { use_wrapper = 1; } } } } else { /* safe use of SwigValueTypes, it can fail with some typemaps */ SwigType *ftd = SwigType_typedef_resolve_all(t); td = SwigType_strip_qualifiers(ftd); Delete(ftd); if (SwigType_type(td) == T_USER) { use_wrapper = 1; n = Swig_symbol_clookup(td, 0); if (n) { if ((Checkattr(n, "nodeType", "class") && !Getattr(n, "allocate:noassign") && (Getattr(n, "allocate:default_constructor"))) || (GetFlag(n, "feature:novaluewrapper"))) { use_wrapper = GetFlag(n, "feature:valuewrapper"); } } } } if (use_wrapper) { /* Need a space before the type in case it starts "::" (since the <: * token is a digraph for [ in C++. Also need a space after the * type in case it ends with ">" since then we form the token ">>". */ w = NewStringf("SwigValueWrapper< %s >", td); } Delete(td); return w; } /* ---------------------------------------------------------------------------- * * * * WARNING * * * *** * *** * Don't even think about modifying anything below this line unless you *** * are completely on top of *EVERY* subtle aspect of the C++ type system *** * and you are prepared to suffer endless hours of agony trying to *** * debug the SWIG run-time type checker after you break it. *** * ------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * SwigType_remember() * * This function "remembers" a datatype that was used during wrapper code generation * so that a type-checking table can be generated later on. It is up to the language * modules to actually call this function--it is not done automatically. * * Type tracking is managed through two separate hash tables. The hash 'r_mangled' * is mapping between mangled type names (used in the target language) and * fully-resolved C datatypes used in the source input. The second hash 'r_resolved' * is the inverse mapping that maps fully-resolved C datatypes to all of the mangled * names in the scripting languages. For example, consider the following set of * typedef declarations: * * typedef double Real; * typedef double Float; * typedef double Point[3]; * * Now, suppose that the types 'double *', 'Real *', 'Float *', 'double[3]', and * 'Point' were used in an interface file and "remembered" using this function. * The hash tables would look like this: * * r_mangled { * _p_double : [ p.double, a(3).double ] * _p_Real : [ p.double ] * _p_Float : [ p.double ] * _Point : [ a(3).double ] * * r_resolved { * p.double : [ _p_double, _p_Real, _p_Float ] * a(3).double : [ _p_double, _Point ] * } * * Together these two hash tables can be used to determine type-equivalency between * mangled typenames. To do this, we view the two hash tables as a large graph and * compute the transitive closure. * ----------------------------------------------------------------------------- */ static Hash *r_mangled = 0; /* Hash mapping mangled types to fully resolved types */ static Hash *r_resolved = 0; /* Hash mapping resolved types to mangled types */ static Hash *r_ltype = 0; /* Hash mapping mangled names to their local c type */ static Hash *r_clientdata = 0; /* Hash mapping resolved types to client data */ static Hash *r_mangleddata = 0; /* Hash mapping mangled types to client data */ static Hash *r_remembered = 0; /* Hash of types we remembered already */ static void (*r_tracefunc) (const SwigType *t, String *mangled, String *clientdata) = 0; void SwigType_remember_mangleddata(String *mangled, const_String_or_char_ptr clientdata) { if (!r_mangleddata) { r_mangleddata = NewHash(); } Setattr(r_mangleddata, mangled, clientdata); } void SwigType_remember_clientdata(const SwigType *t, const_String_or_char_ptr clientdata) { String *mt; SwigType *lt; Hash *h; SwigType *fr; SwigType *qr; String *tkey; String *cd; Hash *lthash; if (!r_mangled) { r_mangled = NewHash(); r_resolved = NewHash(); r_ltype = NewHash(); r_clientdata = NewHash(); r_remembered = NewHash(); } { String *last; last = Getattr(r_remembered, t); if (last && (Cmp(last, clientdata) == 0)) return; } tkey = Copy(t); cd = clientdata ? NewString(clientdata) : NewStringEmpty(); Setattr(r_remembered, tkey, cd); Delete(tkey); Delete(cd); mt = SwigType_manglestr(t); /* Create mangled string */ if (r_tracefunc) { (*r_tracefunc) (t, mt, (String *) clientdata); } if (SwigType_istypedef(t)) { lt = Copy(t); } else { lt = SwigType_ltype(t); } lthash = Getattr(r_ltype, mt); if (!lthash) { lthash = NewHash(); Setattr(r_ltype, mt, lthash); } Setattr(lthash, lt, "1"); Delete(lt); fr = SwigType_typedef_resolve_all(t); /* Create fully resolved type */ qr = SwigType_typedef_qualified(fr); Delete(fr); /* Added to deal with possible table bug */ fr = SwigType_strip_qualifiers(qr); Delete(qr); /*Printf(stdout,"t = '%s'\n", t); Printf(stdout,"fr= '%s'\n\n", fr); */ if (t) { char *ct = Char(t); if (strchr(ct, '<') && !(strstr(ct, "<("))) { Printf(stdout, "Bad template type passed to SwigType_remember: %s\n", t); assert(0); } } h = Getattr(r_mangled, mt); if (!h) { h = NewHash(); Setattr(r_mangled, mt, h); Delete(h); } Setattr(h, fr, mt); h = Getattr(r_resolved, fr); if (!h) { h = NewHash(); Setattr(r_resolved, fr, h); Delete(h); } Setattr(h, mt, fr); if (clientdata) { String *cd = Getattr(r_clientdata, fr); if (cd) { if (Strcmp(clientdata, cd) != 0) { Printf(stderr, "*** Internal error. Inconsistent clientdata for type '%s'\n", SwigType_str(fr, 0)); Printf(stderr, "*** '%s' != '%s'\n", clientdata, cd); assert(0); } } else { String *cstr = NewString(clientdata); Setattr(r_clientdata, fr, cstr); Delete(cstr); } } /* If the remembered type is a reference, we also remember the pointer version. This is to prevent odd problems with mixing pointers and references--especially when different functions are using different typenames (via typedef). */ if (SwigType_isreference(t)) { SwigType *tt = Copy(t); SwigType_del_reference(tt); SwigType_add_pointer(tt); SwigType_remember_clientdata(tt, clientdata); } else if (SwigType_isrvalue_reference(t)) { SwigType *tt = Copy(t); SwigType_del_rvalue_reference(tt); SwigType_add_pointer(tt); SwigType_remember_clientdata(tt, clientdata); } } void SwigType_remember(const SwigType *ty) { SwigType_remember_clientdata(ty, 0); } void (*SwigType_remember_trace(void (*tf) (const SwigType *, String *, String *))) (const SwigType *, String *, String *) { void (*o) (const SwigType *, String *, String *) = r_tracefunc; r_tracefunc = tf; return o; } /* ----------------------------------------------------------------------------- * SwigType_equivalent_mangle() * * Return a list of all of the mangled typenames that are equivalent to another * mangled name. This works as follows: For each fully qualified C datatype * in the r_mangled hash entry, we collect all of the mangled names from the * r_resolved hash and combine them together in a list (removing duplicate entries). * ----------------------------------------------------------------------------- */ List *SwigType_equivalent_mangle(String *ms, Hash *checked, Hash *found) { List *l; Hash *h; Hash *ch; Hash *mh; if (found) { h = found; } else { h = NewHash(); } if (checked) { ch = checked; } else { ch = NewHash(); } if (Getattr(ch, ms)) goto check_exit; /* Already checked this type */ Setattr(h, ms, "1"); Setattr(ch, ms, "1"); mh = Getattr(r_mangled, ms); if (mh) { Iterator ki; ki = First(mh); while (ki.key) { Hash *rh; if (Getattr(ch, ki.key)) { ki = Next(ki); continue; } Setattr(ch, ki.key, "1"); rh = Getattr(r_resolved, ki.key); if (rh) { Iterator rk; rk = First(rh); while (rk.key) { Setattr(h, rk.key, "1"); SwigType_equivalent_mangle(rk.key, ch, h); rk = Next(rk); } } ki = Next(ki); } } check_exit: if (!found) { l = Keys(h); Delete(h); Delete(ch); return l; } else { return 0; } } /* ----------------------------------------------------------------------------- * SwigType_clientdata_collect() * * Returns the clientdata field for a mangled type-string. * ----------------------------------------------------------------------------- */ static String *SwigType_clientdata_collect(String *ms) { Hash *mh; String *clientdata = 0; if (r_mangleddata) { clientdata = Getattr(r_mangleddata, ms); if (clientdata) return clientdata; } mh = Getattr(r_mangled, ms); if (mh) { Iterator ki; ki = First(mh); while (ki.key) { clientdata = Getattr(r_clientdata, ki.key); if (clientdata) break; ki = Next(ki); } } return clientdata; } /* ----------------------------------------------------------------------------- * SwigType_inherit() * * Record information about inheritance. We keep a hash table that keeps * a mapping between base classes and all of the classes that are derived * from them. * * subclass is a hash that maps base-classes to all of the classes derived from them. * * derived - name of derived class * base - name of base class * cast - additional casting code when casting from derived to base * conversioncode - if set, overrides the default code in the function when casting * from derived to base * ----------------------------------------------------------------------------- */ static Hash *subclass = 0; static Hash *conversions = 0; void SwigType_inherit(String *derived, String *base, String *cast, String *conversioncode) { Hash *h; String *dd = 0; String *bb = 0; if (!subclass) subclass = NewHash(); /* Printf(stdout,"'%s' --> '%s' '%s'\n", derived, base, cast); */ if (SwigType_istemplate(derived)) { String *ty = SwigType_typedef_resolve_all(derived); dd = SwigType_typedef_qualified(ty); derived = dd; Delete(ty); } if (SwigType_istemplate(base)) { String *ty = SwigType_typedef_resolve_all(base); bb = SwigType_typedef_qualified(ty); base = bb; Delete(ty); } /* Printf(stdout,"'%s' --> '%s' '%s'\n", derived, base, cast); */ h = Getattr(subclass, base); if (!h) { h = NewHash(); Setattr(subclass, base, h); Delete(h); } if (!Getattr(h, derived)) { Hash *c = NewHash(); if (cast) Setattr(c, "cast", cast); if (conversioncode) Setattr(c, "convcode", conversioncode); Setattr(h, derived, c); Delete(c); } Delete(dd); Delete(bb); } /* ----------------------------------------------------------------------------- * SwigType_issubtype() * * Determines if a t1 is a subtype of t2, ie, is t1 derived from t2 * ----------------------------------------------------------------------------- */ int SwigType_issubtype(const SwigType *t1, const SwigType *t2) { SwigType *ft1, *ft2; String *b1, *b2; Hash *h; int r = 0; if (!subclass) return 0; ft1 = SwigType_typedef_resolve_all(t1); ft2 = SwigType_typedef_resolve_all(t2); b1 = SwigType_base(ft1); b2 = SwigType_base(ft2); h = Getattr(subclass, b2); if (h) { if (Getattr(h, b1)) { r = 1; } } Delete(ft1); Delete(ft2); Delete(b1); Delete(b2); /* Printf(stdout, "issubtype(%s,%s) --> %d\n", t1, t2, r); */ return r; } /* ----------------------------------------------------------------------------- * SwigType_inherit_equiv() * * Modify the type table to handle C++ inheritance * ----------------------------------------------------------------------------- */ void SwigType_inherit_equiv(File *out) { String *ckey; String *prefix, *base; String *mprefix, *mkey; Hash *sub; Hash *rh; List *rlist; Iterator rk, bk, ck; if (!conversions) conversions = NewHash(); if (!subclass) subclass = NewHash(); rk = First(r_resolved); while (rk.key) { /* rkey is a fully qualified type. We strip all of the type constructors off of it just to get the base */ base = SwigType_base(rk.key); /* Check to see whether the base is recorded in the subclass table */ sub = Getattr(subclass, base); Delete(base); if (!sub) { rk = Next(rk); continue; } /* This type has subclasses. We now need to walk through these subtypes and generate pointer conversion functions */ rh = Getattr(r_resolved, rk.key); rlist = NewList(); for (ck = First(rh); ck.key; ck = Next(ck)) { Append(rlist, ck.key); } /* Printf(stdout,"rk.key = '%s'\n", rk.key); Printf(stdout,"rh = %p '%s'\n", rh,rh); */ bk = First(sub); while (bk.key) { prefix = SwigType_prefix(rk.key); Append(prefix, bk.key); /* Printf(stdout,"set %p = '%s' : '%s'\n", rh, SwigType_manglestr(prefix),prefix); */ mprefix = SwigType_manglestr(prefix); Setattr(rh, mprefix, prefix); mkey = SwigType_manglestr(rk.key); ckey = NewStringf("%s+%s", mprefix, mkey); if (!Getattr(conversions, ckey)) { String *convname = NewStringf("%sTo%s", mprefix, mkey); String *lkey = SwigType_lstr(rk.key, 0); String *lprefix = SwigType_lstr(prefix, 0); Hash *subhash = Getattr(sub, bk.key); String *convcode = Getattr(subhash, "convcode"); if (convcode) { char *newmemoryused = Strstr(convcode, "newmemory"); /* see if newmemory parameter is used in order to avoid unused parameter warnings */ String *fn = Copy(convcode); Replaceall(fn, "$from", "x"); Printf(out, "static void *%s(void *x, int *%s) {", convname, newmemoryused ? "newmemory" : "SWIGUNUSEDPARM(newmemory)"); Printf(out, "%s", fn); } else { String *cast = Getattr(subhash, "cast"); Printf(out, "static void *%s(void *x, int *SWIGUNUSEDPARM(newmemory)) {", convname); Printf(out, "\n return (void *)((%s) ", lkey); if (cast) Printf(out, "%s", cast); Printf(out, " ((%s) x));\n", lprefix); } Printf(out, "}\n"); Setattr(conversions, ckey, convname); Delete(ckey); Delete(lkey); Delete(lprefix); /* This inserts conversions for typedefs */ { Hash *r = Getattr(r_resolved, prefix); if (r) { Iterator rrk; rrk = First(r); while (rrk.key) { Iterator rlk; String *rkeymangle; /* Make sure this name equivalence is not due to inheritance */ if (Cmp(prefix, Getattr(r, rrk.key)) == 0) { rkeymangle = Copy(mkey); ckey = NewStringf("%s+%s", rrk.key, rkeymangle); if (!Getattr(conversions, ckey)) { Setattr(conversions, ckey, convname); } Delete(ckey); for (rlk = First(rlist); rlk.item; rlk = Next(rlk)) { ckey = NewStringf("%s+%s", rrk.key, rlk.item); Setattr(conversions, ckey, convname); Delete(ckey); } Delete(rkeymangle); /* This is needed to pick up other alternative names for the same type. Needed to make templates work */ Setattr(rh, rrk.key, rrk.item); } rrk = Next(rrk); } } } Delete(convname); } Delete(prefix); Delete(mprefix); Delete(mkey); bk = Next(bk); } rk = Next(rk); Delete(rlist); } } /* Helper function to sort the mangled list */ static int SwigType_compare_mangled(const DOH *a, const DOH *b) { return strcmp((char *) Data(a), (char *) Data(b)); } /* ----------------------------------------------------------------------------- * SwigType_get_sorted_mangled_list() * * Returns the sorted list of mangled type names that should be exported into the * wrapper file. * ----------------------------------------------------------------------------- */ List *SwigType_get_sorted_mangled_list() { List *l = Keys(r_mangled); SortList(l, SwigType_compare_mangled); return l; } /* ----------------------------------------------------------------------------- * SwigType_type_table() * * Generate the type-table for the type-checker. * ----------------------------------------------------------------------------- */ void SwigType_emit_type_table(File *f_forward, File *f_table) { Iterator ki; String *types, *table, *cast, *cast_init, *cast_temp; Hash *imported_types; List *mangled_list; List *table_list = NewList(); int i = 0; if (!r_mangled) { r_mangled = NewHash(); r_resolved = NewHash(); } Printf(f_table, "\n/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */\n\n"); SwigType_inherit_equiv(f_table); /*#define DEBUG 1*/ #ifdef DEBUG Printf(stdout, "---r_mangled---\n"); Printf(stdout, "%s\n", r_mangled); Printf(stdout, "---r_resolved---\n"); Printf(stdout, "%s\n", r_resolved); Printf(stdout, "---r_ltype---\n"); Printf(stdout, "%s\n", r_ltype); Printf(stdout, "---subclass---\n"); Printf(stdout, "%s\n", subclass); Printf(stdout, "---conversions---\n"); Printf(stdout, "%s\n", conversions); Printf(stdout, "---r_clientdata---\n"); Printf(stdout, "%s\n", r_clientdata); #endif table = NewStringEmpty(); types = NewStringEmpty(); cast = NewStringEmpty(); cast_init = NewStringEmpty(); imported_types = NewHash(); Printf(table, "static swig_type_info *swig_type_initial[] = {\n"); Printf(cast_init, "static swig_cast_info *swig_cast_initial[] = {\n"); Printf(f_forward, "\n/* -------- TYPES TABLE (BEGIN) -------- */\n\n"); mangled_list = SwigType_get_sorted_mangled_list(); for (ki = First(mangled_list); ki.item; ki = Next(ki)) { List *el; Iterator ei; SwigType *lt; SwigType *rt = 0; String *nt; String *ln; String *rn; const String *cd; Hash *lthash; Iterator ltiter; Hash *nthash; cast_temp = NewStringEmpty(); Printv(types, "static swig_type_info _swigt_", ki.item, " = {", NIL); Append(table_list, ki.item); Printf(cast_temp, "static swig_cast_info _swigc_%s[] = {", ki.item); i++; cd = SwigType_clientdata_collect(ki.item); if (!cd) cd = "0"; lthash = Getattr(r_ltype, ki.item); nt = 0; nthash = NewHash(); ltiter = First(lthash); while (ltiter.key) { lt = ltiter.key; rt = SwigType_typedef_resolve_all(lt); /* we save the original type and the fully resolved version */ ln = SwigType_lstr(lt, 0); rn = SwigType_lstr(rt, 0); if (Equal(ln, rn)) { Setattr(nthash, ln, "1"); } else { Setattr(nthash, rn, "1"); Setattr(nthash, ln, "1"); } if (SwigType_istemplate(rt)) { String *dt = Swig_symbol_template_deftype(rt, 0); String *dn = SwigType_lstr(dt, 0); if (!Equal(dn, rn) && !Equal(dn, ln)) { Setattr(nthash, dn, "1"); } Delete(dt); Delete(dn); } ltiter = Next(ltiter); } /* now build nt */ ltiter = First(nthash); nt = 0; while (ltiter.key) { if (nt) { Printf(nt, "|%s", ltiter.key); } else { nt = NewString(ltiter.key); } ltiter = Next(ltiter); } Delete(nthash); Printf(types, "\"%s\", \"%s\", 0, 0, (void*)%s, 0};\n", ki.item, nt, cd); el = SwigType_equivalent_mangle(ki.item, 0, 0); for (ei = First(el); ei.item; ei = Next(ei)) { String *ckey; String *conv; ckey = NewStringf("%s+%s", ei.item, ki.item); conv = Getattr(conversions, ckey); if (conv) { Printf(cast_temp, " {&_swigt_%s, %s, 0, 0},", ei.item, conv); } else { Printf(cast_temp, " {&_swigt_%s, 0, 0, 0},", ei.item); } Delete(ckey); if (!Getattr(r_mangled, ei.item) && !Getattr(imported_types, ei.item)) { Printf(types, "static swig_type_info _swigt_%s = {\"%s\", 0, 0, 0, 0, 0};\n", ei.item, ei.item); Append(table_list, ei.item); Printf(cast, "static swig_cast_info _swigc_%s[] = {{&_swigt_%s, 0, 0, 0},{0, 0, 0, 0}};\n", ei.item, ei.item); i++; Setattr(imported_types, ei.item, "1"); } } Delete(el); Printf(cast, "%s{0, 0, 0, 0}};\n", cast_temp); Delete(cast_temp); Delete(nt); Delete(rt); } /* print the tables in the proper order */ SortList(table_list, SwigType_compare_mangled); i = 0; for (ki = First(table_list); ki.item; ki = Next(ki)) { Printf(f_forward, "#define SWIGTYPE%s swig_types[%d]\n", ki.item, i++); Printf(table, " &_swigt_%s,\n", ki.item); Printf(cast_init, " _swigc_%s,\n", ki.item); } if (i == 0) { /* empty arrays are not allowed by ISO C */ Printf(table, " NULL\n"); Printf(cast_init, " NULL\n"); } Delete(table_list); Delete(mangled_list); Printf(table, "};\n"); Printf(cast_init, "};\n"); Printf(f_table, "%s\n", types); Printf(f_table, "%s\n", table); Printf(f_table, "%s\n", cast); Printf(f_table, "%s\n", cast_init); Printf(f_table, "\n/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */\n\n"); Printf(f_forward, "static swig_type_info *swig_types[%d];\n", i + 1); Printf(f_forward, "static swig_module_info swig_module = {swig_types, %d, 0, 0, 0, 0};\n", i); Printf(f_forward, "#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)\n"); Printf(f_forward, "#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)\n"); Printf(f_forward, "\n/* -------- TYPES TABLE (END) -------- */\n\n"); Delete(types); Delete(table); Delete(cast); Delete(cast_init); Delete(imported_types); } swig-4.0.2/Source/Swig/symbol.c0000644000175000017500000017565413667507523016226 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * symbol.c * * This file implements the SWIG symbol table. See details below. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "swigwarn.h" #include /* #define SWIG_DEBUG*/ /* ----------------------------------------------------------------------------- * Synopsis * * This module provides symbol table management for all of SWIG. In previous * releases, the management of symbols was rather haphazard. This module tries * to correct that. * * All symbols are associated with simple identifiers. For example, here are some * declarations that generate symbol table entries: * * decl symbol * -------------- ------------ * void foo(int); foo * int x; x * typedef int *blah; blah * * Associated with each symbol is a Hash table that can contain any set of * attributes that make sense for that object. For example: * * typedef int *blah; ----> "name" : 'blah' * "type" : 'int' * "decl" : 'p.' * "storage" : 'typedef' * * In some cases, the symbol table needs to manage overloaded entries. For instance, * overloaded functions. In this case, a linked list is built. The "sym:nextSibling" * attribute is reserved to hold a link to the next entry. For example: * * int foo(int); --> "name" : "foo" "name" : "foo" * int foo(int,double); "type" : "int" "type" : "int" * "decl" : "f(int)." "decl" : "f(int,double)." * ... ... * "sym:nextSibling" : --------> "sym:nextSibling": --------> ... * * When more than one symbol has the same name, the symbol declarator is * used to detect duplicates. For example, in the above case, foo(int) and * foo(int,double) are different because their "decl" attribute is different. * However, if a third declaration "foo(int)" was made, it would generate a * conflict (due to having a declarator that matches a previous entry). * * Structures and classes: * * C/C++ symbol tables are normally managed in a few different spaces. The * most visible namespace is reserved for functions, variables, typedef, enum values * and such. In C, a separate tag-space is reserved for 'struct name', 'class name', * and 'union name' declarations. In SWIG, a single namespace is used for everything * this means that certain incompatibilities will arise with some C programs. For instance: * * struct Foo { * ... * } * * int Foo(); // Error. Name clash. Works in C though * * Due to the unified namespace for structures, special handling is performed for * the following: * * typedef struct Foo { * * } Foo; * * In this case, the symbol table contains an entry for the structure itself. The * typedef is left out of the symbol table. * * Target language vs C: * * The symbol tables are normally managed *in the namespace of the target language*. * This means that name-collisions can be resolved using %rename and related * directives. A quirk of this is that sometimes the symbol tables need to * be used for C type resolution as well. To handle this, each symbol table * also has a C-symbol table lurking behind the scenes. This is used to locate * symbols in the C namespace. However, this symbol table is not used for error * reporting nor is it used for anything else during code generation. * * Symbol table structure: * * Symbol tables themselves are a special kind of node that is organized just like * a normal parse tree node. Symbol tables are organized in a tree that can be * traversed using the SWIG-DOM API. The following attributes names are reserved. * * name -- Name of the scope defined by the symbol table (if any) * This name is the C-scope name and is not affected by * %renaming operations * symtab -- Hash table mapping identifiers to nodes. * csymtab -- Hash table mapping C identifiers to nodes. * * Reserved attributes on symbol objects: * * When a symbol is placed in the symbol table, the following attributes * are set: * * sym:name -- Symbol name * sym:nextSibling -- Next symbol (if overloaded) * sym:previousSibling -- Previous symbol (if overloaded) * sym:symtab -- Symbol table object holding the symbol * sym:overloaded -- Set to the first symbol if overloaded * * These names are modeled after XML namespaces. In particular, every attribute * pertaining to symbol table management is prefaced by the "sym:" prefix. * * An example dump of the parse tree showing symbol table entries for the * following code should clarify this: * * namespace OuterNamespace { * namespace InnerNamespace { * class Class { * }; * struct Struct { * int Var; * }; * } * } * * +++ namespace ---------------------------------------- * | sym:name - "OuterNamespace" * | symtab - 0xa064bf0 * | sym:symtab - 0xa041690 * | sym:overname - "__SWIG_0" * * +++ namespace ---------------------------------------- * | sym:name - "InnerNamespace" * | symtab - 0xa064cc0 * | sym:symtab - 0xa064bf0 * | sym:overname - "__SWIG_0" * * +++ class ---------------------------------------- * | sym:name - "Class" * | symtab - 0xa064d80 * | sym:symtab - 0xa064cc0 * | sym:overname - "__SWIG_0" * | * +++ class ---------------------------------------- * | sym:name - "Struct" * | symtab - 0xa064f00 * | sym:symtab - 0xa064cc0 * | sym:overname - "__SWIG_0" * * +++ cdecl ---------------------------------------- * | sym:name - "Var" * | sym:symtab - 0xa064f00 * | sym:overname - "__SWIG_0" * | * * * Each class and namespace has its own scope and thus a new symbol table (sym) * is created. The sym attribute is only set for the first entry in the symbol * table. The sym:symtab entry points to the symbol table in which the symbol * exists, so for example, Struct is in the scope OuterNamespace::InnerNamespace * so sym:symtab points to this symbol table (0xa064cc0). * * ----------------------------------------------------------------------------- */ static Hash *current = 0; /* The current symbol table hash */ static Hash *ccurrent = 0; /* The current c symbol table hash */ static Hash *current_symtab = 0; /* Current symbol table node */ static Hash *symtabs = 0; /* Hash of all symbol tables by fully-qualified name */ static Hash *global_scope = 0; /* Global scope */ static int use_inherit = 1; /* common attribute keys, to avoid calling find_key all the times */ /* ----------------------------------------------------------------------------- * Swig_symbol_print_tables() * * Debug display of symbol tables * ----------------------------------------------------------------------------- */ void Swig_symbol_print_tables(Symtab *symtab) { if (!symtab) symtab = current_symtab; Printf(stdout, "SYMBOL TABLES start =======================================\n"); Swig_print_tree(symtab); Printf(stdout, "SYMBOL TABLES finish =======================================\n"); } /* ----------------------------------------------------------------------------- * Swig_symbol_print_tables_summary() * * Debug summary display of all symbol tables by fully-qualified name * ----------------------------------------------------------------------------- */ void Swig_symbol_print_tables_summary(void) { Printf(stdout, "SYMBOL TABLES SUMMARY start =======================================\n"); Swig_print_node(symtabs); Printf(stdout, "SYMBOL TABLES SUMMARY finish =======================================\n"); } /* ----------------------------------------------------------------------------- * symbol_print_symbols() * ----------------------------------------------------------------------------- */ static void symbol_print_symbols(const char *symboltabletype, const char *nextSibling) { Node *table = symtabs; Iterator ki = First(table); int show_pointers = 0; while (ki.key) { String *k = ki.key; Printf(stdout, "===================================================\n"); Printf(stdout, "%s -\n", k); { Symtab *symtab = Getattr(Getattr(table, k), symboltabletype); Iterator it = First(symtab); while (it.key) { String *symname = it.key; Printf(stdout, " %s (%s)", symname, nodeType(it.item)); if (show_pointers) Printf(stdout, " %p", it.item); Printf(stdout, "\n"); { Node *sibling = Getattr(it.item, nextSibling); while (sibling) { Printf(stdout, " %s (%s)", symname, nodeType(sibling)); if (show_pointers) Printf(stdout, " %p", sibling); Printf(stdout, "\n"); sibling = Getattr(sibling, nextSibling); } } it = Next(it); } } ki = Next(ki); } } /* ----------------------------------------------------------------------------- * Swig_symbol_print_symbols() * * Debug display of all the target language symbols * ----------------------------------------------------------------------------- */ void Swig_symbol_print_symbols(void) { Printf(stdout, "SYMBOLS start =======================================\n"); symbol_print_symbols("symtab", "sym:nextSibling"); Printf(stdout, "SYMBOLS finish =======================================\n"); } /* ----------------------------------------------------------------------------- * Swig_symbol_print_csymbols() * * Debug display of all the C symbols * ----------------------------------------------------------------------------- */ void Swig_symbol_print_csymbols(void) { Printf(stdout, "CSYMBOLS start =======================================\n"); symbol_print_symbols("csymtab", "csym:nextSibling"); Printf(stdout, "CSYMBOLS finish =======================================\n"); } /* ----------------------------------------------------------------------------- * Swig_symbol_init() * * Create a new symbol table object * ----------------------------------------------------------------------------- */ void Swig_symbol_init(void) { current = NewHash(); current_symtab = NewHash(); ccurrent = NewHash(); set_nodeType(current_symtab, "symboltable"); Setattr(current_symtab, "symtab", current); Delete(current); Setattr(current_symtab, "csymtab", ccurrent); Delete(ccurrent); /* Set the global scope */ symtabs = NewHash(); Setattr(symtabs, "", current_symtab); Delete(current_symtab); global_scope = current_symtab; } /* ----------------------------------------------------------------------------- * Swig_symbol_setscopename() * * Set the C scopename of the current symbol table. * ----------------------------------------------------------------------------- */ void Swig_symbol_setscopename(const_String_or_char_ptr name) { String *qname; /* assert(!Getattr(current_symtab,"name")); */ Setattr(current_symtab, "name", name); /* Set nested scope in parent */ qname = Swig_symbol_qualifiedscopename(current_symtab); /* Save a reference to this scope */ Setattr(symtabs, qname, current_symtab); Delete(qname); } /* ----------------------------------------------------------------------------- * Swig_symbol_getscopename() * * Get the C scopename of the current symbol table * ----------------------------------------------------------------------------- */ String *Swig_symbol_getscopename(void) { return Getattr(current_symtab, "name"); } /* ----------------------------------------------------------------------------- * Swig_symbol_getscope() * * Given a fully qualified C scopename, this function returns a symbol table * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_getscope(const_String_or_char_ptr name) { if (!symtabs) return 0; if (Equal("::", (const_String_or_char_ptr ) name)) name = ""; return Getattr(symtabs, name); } /* ----------------------------------------------------------------------------- * Swig_symbol_qualifiedscopename() * * Get the fully qualified C scopename of a symbol table. Note, this only pertains * to the C/C++ scope name. It is not affected by renaming. * ----------------------------------------------------------------------------- */ String *Swig_symbol_qualifiedscopename(Symtab *symtab) { String *result = 0; Hash *parent; String *name; if (!symtab) symtab = current_symtab; parent = Getattr(symtab, "parentNode"); if (parent) { result = Swig_symbol_qualifiedscopename(parent); } name = Getattr(symtab, "name"); if (name) { if (!result) { result = NewStringEmpty(); } if (Len(result)) { Printv(result, "::", name, NIL); } else { Append(result, name); } } return result; } /* ----------------------------------------------------------------------------- * Swig_symbol_qualified_language_scopename() * * Get the fully qualified C scopename of a symbol table but using a language * specific separator for the scopenames. Basically the same as * Swig_symbol_qualifiedscopename() but using the different separator. * ----------------------------------------------------------------------------- */ String *Swig_symbol_qualified_language_scopename(Symtab *n) { /* TODO: fix for %rename to work */ String *result = Swig_symbol_qualifiedscopename(n); Replaceall(result, "::", NSPACE_SEPARATOR); return result; } /* ----------------------------------------------------------------------------- * Swig_symbol_newscope() * * Create a new scope. Returns the newly created scope. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_newscope(void) { Hash *n; Hash *hsyms, *h; hsyms = NewHash(); h = NewHash(); set_nodeType(h, "symboltable"); Setattr(h, "symtab", hsyms); Delete(hsyms); set_parentNode(h, current_symtab); n = lastChild(current_symtab); if (!n) { set_firstChild(current_symtab, h); } else { set_nextSibling(n, h); Delete(h); } set_lastChild(current_symtab, h); current = hsyms; ccurrent = NewHash(); Setattr(h, "csymtab", ccurrent); Delete(ccurrent); current_symtab = h; return h; } /* ----------------------------------------------------------------------------- * Swig_symbol_setscope() * * Set the current scope. Returns the previous current scope. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_setscope(Symtab *sym) { Symtab *ret = current_symtab; current_symtab = sym; current = Getattr(sym, "symtab"); assert(current); ccurrent = Getattr(sym, "csymtab"); assert(ccurrent); return ret; } /* ----------------------------------------------------------------------------- * Swig_symbol_popscope() * * Pop out of the current scope. Returns the popped scope and sets the * scope to the parent scope. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_popscope(void) { Hash *h = current_symtab; current_symtab = Getattr(current_symtab, "parentNode"); assert(current_symtab); current = Getattr(current_symtab, "symtab"); assert(current); ccurrent = Getattr(current_symtab, "csymtab"); assert(ccurrent); return h; } /* ----------------------------------------------------------------------------- * Swig_symbol_global_scope() * * Return the symbol table for the global scope. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_global_scope(void) { return global_scope; } /* ----------------------------------------------------------------------------- * Swig_symbol_current() * * Return the current symbol table. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_current(void) { return current_symtab; } /* ----------------------------------------------------------------------------- * Swig_symbol_alias() * * Makes an alias for a symbol in the global symbol table. * Primarily for namespace aliases such as 'namespace X = Y;'. * ----------------------------------------------------------------------------- */ void Swig_symbol_alias(const_String_or_char_ptr aliasname, Symtab *s) { String *qname = Swig_symbol_qualifiedscopename(current_symtab); if (qname) { Printf(qname, "::%s", aliasname); } else { qname = NewString(aliasname); } if (!Getattr(symtabs, qname)) { Setattr(symtabs, qname, s); } Delete(qname); } /* ----------------------------------------------------------------------------- * Swig_symbol_inherit() * * Inherit symbols from another scope. Primarily for C++ inheritance and * for using directives, such as 'using namespace X;' * but not for using declarations, such as 'using A;'. * ----------------------------------------------------------------------------- */ void Swig_symbol_inherit(Symtab *s) { int i, ilen; List *inherit = Getattr(current_symtab, "inherit"); if (!inherit) { inherit = NewList(); Setattr(current_symtab, "inherit", inherit); Delete(inherit); } if (s == current_symtab) { Swig_warning(WARN_PARSE_REC_INHERITANCE, Getfile(s), Getline(s), "Recursive scope inheritance of '%s'.\n", Getattr(s, "name")); return; } assert(s != current_symtab); ilen = Len(inherit); for (i = 0; i < ilen; i++) { Node *n = Getitem(inherit, i); if (n == s) return; /* Already inherited */ } Append(inherit, s); } /* ----------------------------------------------------------------------------- * Swig_symbol_cadd() * * Adds a node to the C symbol table only. * ----------------------------------------------------------------------------- */ void Swig_symbol_cadd(const_String_or_char_ptr name, Node *n) { Node *append = 0; Node *cn; /* There are a few options for weak symbols. A "weak" symbol is any symbol that can be replaced by another symbol in the C symbol table. An example would be a forward class declaration. A forward class sits in the symbol table until a real class declaration comes along. Certain symbols are marked as "sym:typename". These are important symbols related to the C++ type-system and take precedence in the C symbol table. An example might be code like this: template T foo(T x); int foo(int); In this case, the template is marked with "sym:typename" so that it stays in the C symbol table (so that it can be expanded using %template). */ if (!name) return; if (SwigType_istemplate(name)) { String *cname = NewString(name); String *dname = Swig_symbol_template_deftype(cname, 0); if (!Equal(dname, name)) { Swig_symbol_cadd(dname, n); } Delete(dname); Delete(cname); } #ifdef SWIG_DEBUG Printf(stderr, "symbol_cadd %s %p\n", name, n); #endif cn = Getattr(ccurrent, name); if (cn && (Getattr(cn, "sym:typename"))) { /* The node in the C symbol table is a typename. Do nothing */ /* We might append the symbol at the end */ append = n; } else if (cn && (Getattr(cn, "sym:weak"))) { /* The node in the symbol table is weak. Replace it */ if (checkAttribute(cn, "nodeType", "template") && checkAttribute(cn, "templatetype", "classforward")) { /* The node is a template classforward declaration, and the default template parameters here take precedence. */ ParmList *pc = Getattr(cn, "templateparms"); ParmList *pn = Getattr(n, "templateparms"); #ifdef SWIG_DEBUG Printf(stderr, "found template classforward %s\n", Getattr(cn, "name")); #endif while (pc && pn) { String *value = Getattr(pc, "value"); if (value) { #ifdef SWIG_DEBUG Printf(stderr, "add default template value %s %s\n", Getattr(pc, "name"), value); #endif Setattr(pn, "value", value); } pc = nextSibling(pc); pn = nextSibling(pn); } Setattr(n, "templateparms", Getattr(cn, "templateparms")); } Setattr(ccurrent, name, n); } else if (cn && (Getattr(n, "sym:weak"))) { /* The node being added is weak. Don't worry about it */ } else if (cn && (Getattr(n, "sym:typename"))) { /* The node being added is a typename. We definitely add it */ Setattr(ccurrent, name, n); append = cn; } else if (cn && (Checkattr(cn, "nodeType", "templateparm"))) { Swig_error(Getfile(n), Getline(n), "Declaration of '%s' shadows template parameter,\n", name); Swig_error(Getfile(cn), Getline(cn), "previous template parameter declaration '%s'.\n", name); return; } else if (cn) { append = n; } else if (!cn) { /* No conflict. Add the symbol */ Setattr(ccurrent, name, n); } /* Multiple entries in the C symbol table. We append to the symbol table */ if (append) { Node *fn, *pn = 0; cn = Getattr(ccurrent, name); fn = cn; while (fn) { pn = fn; if (fn == append) { /* already added. Bail */ return; } fn = Getattr(fn, "csym:nextSibling"); } if (pn) { Setattr(pn, "csym:nextSibling", append); } } /* Special typedef handling. When a typedef node is added to the symbol table, we might have to add a type alias. This would occur if the typedef mapped to another scope in the system. For example: class Foo { }; typedef Foo OtherFoo; In this case, OtherFoo becomes an alias for Foo. */ { Node *td = n; while (td && Checkattr(td, "nodeType", "cdecl") && Checkattr(td, "storage", "typedef")) { SwigType *type; Node *td1; type = Copy(Getattr(td, "type")); SwigType_push(type, Getattr(td, "decl")); td1 = Swig_symbol_clookup(type, 0); /* Fix pathetic case #1214313: class Foo { }; typedef Foo FooBar; class CBaz { public: typedef FooBar Foo; }; ie, when Foo -> FooBar -> Foo, jump one scope up when possible. */ if (td1 && Checkattr(td1, "storage", "typedef")) { String *st = Getattr(td1, "type"); String *sn = Getattr(td, "name"); if (st && sn && Equal(st, sn)) { Symtab *sc = Getattr(current_symtab, "parentNode"); if (sc) td1 = Swig_symbol_clookup(type, sc); } } Delete(type); if (td1 == td) break; td = td1; if (td) { Symtab *st = Getattr(td, "symtab"); if (st) { Swig_symbol_alias(Getattr(n, "name"), st); break; } } } } } /* ----------------------------------------------------------------------------- * Swig_symbol_add() * * Adds a node to the symbol table. Returns the node itself if successfully * added. Otherwise, it returns the symbol table entry of the conflicting node. * * Also places the symbol in a behind-the-scenes C symbol table. This is needed * for namespace support, type resolution, and other issues. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_add(const_String_or_char_ptr symname, Node *n) { Hash *c, *cl = 0; SwigType *decl, *ndecl; String *cstorage, *nstorage; int nt = 0, ct = 0; int pn = 0; int u1 = 0, u2 = 0; String *name, *overname; /* See if the node has a name. If so, we place in the C symbol table for this scope. We don't worry about overloading here---the primary purpose of this is to record information for type/name resolution for later. Conflicts in C namespaces are errors, but these will be caught by the C++ compiler when compiling the wrapper code */ /* There are a few options for weak symbols. A "weak" symbol is any symbol that can be replaced by another symbol in the C symbol table. An example would be a forward class declaration. A forward class sits in the symbol table until a real class declaration comes along. Certain symbols are marked as "sym:typename". These are important symbols related to the C++ type-system and take precedence in the C symbol table. An example might be code like this: template T foo(T x); int foo(int); In this case, the template is marked with "sym:typename" so that it stays in the C symbol table (so that it can be expanded using %template). */ name = Getattr(n, "name"); if (name && Len(name)) { Swig_symbol_cadd(name, n); } /* No symbol name defined. We return. */ if (!symname) { Setattr(n, "sym:symtab", current_symtab); return n; } /* If node is ignored. We don't proceed any further */ if (GetFlag(n, "feature:ignore")) return n; /* See if the symbol already exists in the table */ c = Getattr(current, symname); /* Check for a weak symbol. A weak symbol is allowed to be in the symbol table, but is silently overwritten by other symbols. An example would be a forward class declaration. For instance: class Foo; In this case, "Foo" sits in the symbol table. However, the definition of Foo would replace the entry if it appeared later. */ if (c && Getattr(c, "sym:weak")) { c = 0; } if (c) { /* There is a symbol table conflict. There are a few cases to consider here: (1) A conflict between a class/enum and a typedef declaration is okay. In this case, the symbol table entry is set to the class/enum declaration itself, not the typedef. (2) A conflict between namespaces is okay--namespaces are open (3) Otherwise, overloading is only allowed for functions (4) This special case is okay: a class template instantiated with same name as the template's name */ /* Check for namespaces */ String *ntype = Getattr(n, "nodeType"); if ((Equal(ntype, Getattr(c, "nodeType"))) && ((Equal(ntype, "namespace")))) { Node *cl, *pcl = 0; cl = c; while (cl) { pcl = cl; cl = Getattr(cl, "sym:nextSibling"); } Setattr(pcl, "sym:nextSibling", n); Setattr(n, "sym:symtab", current_symtab); Setattr(n, "sym:name", symname); Setattr(n, "sym:previousSibling", pcl); return n; } /* Special case: class template instantiated with same name as the template's name eg: %template(X) X; */ if (Equal(nodeType(c), "template")) { String *nt1 = Getattr(c, "templatetype"); String *nt2 = nodeType(n); if (Equal(nt1, "class") && Equal(nt1, nt2)) { if (Getattr(n, "template")) { /* Finally check that another %template with same name doesn't already exist */ if (!Getattr(c, "sym:nextSibling")) { Setattr(c, "sym:nextSibling", n); Setattr(n, "sym:symtab", current_symtab); Setattr(n, "sym:name", symname); Setattr(n, "sym:previousSibling", c); return n; } } } } if (Getattr(n, "allows_typedef")) nt = 1; if (Getattr(c, "allows_typedef")) ct = 1; if (nt || ct) { Node *td, *other; String *s; /* At least one of the nodes allows typedef overloading. Make sure that both don't--this would be a conflict */ if (nt && ct) return c; /* Figure out which node allows the typedef */ if (nt) { td = n; other = c; } else { td = c; other = n; } /* Make sure the other node is a typedef */ s = Getattr(other, "storage"); if (!s || (!Equal(s, "typedef"))) return c; /* No. This is a conflict */ /* Hmmm. This appears to be okay. Make sure the symbol table refers to the allow_type node */ if (td != c) { Setattr(current, symname, td); Setattr(td, "sym:symtab", current_symtab); Setattr(td, "sym:name", symname); } return n; } decl = Getattr(c, "decl"); ndecl = Getattr(n, "decl"); { String *nt1, *nt2; nt1 = Getattr(n, "nodeType"); if (Equal(nt1, "template")) nt1 = Getattr(n, "templatetype"); nt2 = Getattr(c, "nodeType"); if (Equal(nt2, "template")) nt2 = Getattr(c, "templatetype"); if (Equal(nt1, "using")) u1 = 1; if (Equal(nt2, "using")) u2 = 1; if ((!Equal(nt1, nt2)) && !(u1 || u2)) return c; } if (!(u1 || u2)) { if ((!SwigType_isfunction(decl)) || (!SwigType_isfunction(ndecl))) { /* Symbol table conflict */ return c; } } /* Hmmm. Declarator seems to indicate that this is a function */ /* Look at storage class to see if compatible */ cstorage = Getattr(c, "storage"); nstorage = Getattr(n, "storage"); /* If either one is declared as typedef, forget it. We're hosed */ if (Cmp(cstorage, "typedef") == 0) { return c; } if (Cmp(nstorage, "typedef") == 0) { return c; } /* Okay. Walk down the list of symbols and see if we get a declarator match */ { String *nt = Getattr(n, "nodeType"); int n_template = Equal(nt, "template") && Checkattr(n, "templatetype", "cdecl"); int n_plain_cdecl = Equal(nt, "cdecl"); Node *cn = c; pn = 0; while (cn) { decl = Getattr(cn, "decl"); if (!(u1 || u2)) { if (Cmp(ndecl, decl) == 0) { /* Declarator conflict */ /* Now check we don't have a non-templated function overloaded by a templated function with same params, * eg void foo(); template void foo(); */ String *cnt = Getattr(cn, "nodeType"); int cn_template = Equal(cnt, "template") && Checkattr(cn, "templatetype", "cdecl"); int cn_plain_cdecl = Equal(cnt, "cdecl"); if (!((n_template && cn_plain_cdecl) || (cn_template && n_plain_cdecl))) { /* found a conflict */ return cn; } } } cl = cn; cn = Getattr(cn, "sym:nextSibling"); pn++; } } /* Well, we made it this far. Guess we can drop the symbol in place */ Setattr(n, "sym:symtab", current_symtab); Setattr(n, "sym:name", symname); /* Printf(stdout,"%s %p\n", Getattr(n,"sym:overname"), current_symtab); */ assert(!Getattr(n, "sym:overname")); overname = NewStringf("__SWIG_%d", pn); Setattr(n, "sym:overname", overname); /*Printf(stdout,"%s %s %s\n", symname, Getattr(n,"decl"), Getattr(n,"sym:overname")); */ Setattr(cl, "sym:nextSibling", n); Setattr(n, "sym:previousSibling", cl); Setattr(cl, "sym:overloaded", c); Setattr(n, "sym:overloaded", c); Delete(overname); return n; } /* No conflict. Just add it */ Setattr(n, "sym:symtab", current_symtab); Setattr(n, "sym:name", symname); /* Printf(stdout,"%s\n", Getattr(n,"sym:overname")); */ overname = NewStringf("__SWIG_%d", pn); Setattr(n, "sym:overname", overname); Delete(overname); /* Printf(stdout,"%s %s %s\n", symname, Getattr(n,"decl"), Getattr(n,"sym:overname")); */ Setattr(current, symname, n); return n; } /* ----------------------------------------------------------------------------- * symbol_lookup() * * Internal function to handle fully qualified symbol table lookups. This * works from the symbol table supplied in symtab and unwinds its way out * towards the global scope. * * This function operates in the C namespace, not the target namespace. * * The check function is an optional callback that can be used to verify a particular * symbol match. This is only used in some of the more exotic parts of SWIG. For instance, * verifying that a class hierarchy implements all pure virtual methods. * ----------------------------------------------------------------------------- */ static Node *_symbol_lookup(const String *name, Symtab *symtab, int (*check) (Node *n)) { Node *n; List *inherit; Hash *sym = Getattr(symtab, "csymtab"); if (Getmark(symtab)) return 0; Setmark(symtab, 1); n = Getattr(sym, name); #ifdef SWIG_DEBUG Printf(stderr, "symbol_look %s %p %p %s\n", name, n, symtab, Getattr(symtab, "name")); #endif if (n) { /* if a check-function is defined. Call it to determine a match */ if (check) { int c = check(n); if (c == 1) { Setmark(symtab, 0); return n; } if (c < 0) { /* Terminate the search right away */ Setmark(symtab, 0); return 0; } } else { Setmark(symtab, 0); return n; } } if (!n && SwigType_istemplate(name)) { String *dname = 0; Setmark(symtab, 0); dname = Swig_symbol_template_deftype(name, symtab); if (!Equal(dname, name)) { n = _symbol_lookup(dname, symtab, check); } Delete(dname); if (n) return n; Setmark(symtab, 1); } inherit = Getattr(symtab, "inherit"); if (inherit && use_inherit) { int i, len; len = Len(inherit); for (i = 0; i < len; i++) { n = _symbol_lookup(name, Getitem(inherit, i), check); if (n) { Setmark(symtab, 0); return n; } } } Setmark(symtab, 0); return 0; } static Node *symbol_lookup(const_String_or_char_ptr name, Symtab *symtab, int (*check) (Node *n)) { Node *n = 0; if (DohCheck(name)) { n = _symbol_lookup(name, symtab, check); } else { String *sname = NewString(name); n = _symbol_lookup(sname, symtab, check); Delete(sname); } return n; } /* ----------------------------------------------------------------------------- * symbol_lookup_qualified() * ----------------------------------------------------------------------------- */ static Node *symbol_lookup_qualified(const_String_or_char_ptr name, Symtab *symtab, const String *prefix, int local, int (*checkfunc) (Node *n)) { /* This is a little funky, we search by fully qualified names */ if (!symtab) return 0; if (!prefix) { Node *n; String *bname = 0; String *prefix = 0; Swig_scopename_split(name, &prefix, &bname); n = symbol_lookup_qualified(bname, symtab, prefix, local, checkfunc); Delete(bname); Delete(prefix); return n; } else { Symtab *st; Node *n = 0; /* Make qualified name of current scope */ String *qalloc = 0; String *qname = Swig_symbol_qualifiedscopename(symtab); const String *cqname; if (qname) { if (Len(qname)) { if (prefix && Len(prefix)) { Printv(qname, "::", prefix, NIL); } } else { Append(qname, prefix); } qalloc = qname; cqname = qname; } else { cqname = prefix; } st = Getattr(symtabs, cqname); /* Found a scope match */ if (st) { if (!name) { if (qalloc) Delete(qalloc); return st; } n = symbol_lookup(name, st, checkfunc); } if (qalloc) Delete(qalloc); if (!n) { if (!local) { Node *pn = Getattr(symtab, "parentNode"); if (pn) n = symbol_lookup_qualified(name, pn, prefix, local, checkfunc); /* Check inherited scopes */ if (!n) { List *inherit = Getattr(symtab, "inherit"); if (inherit && use_inherit) { int i, len; len = Len(inherit); for (i = 0; i < len; i++) { Node *prefix_node = symbol_lookup(prefix, Getitem(inherit, i), checkfunc); if (prefix_node) { Node *prefix_symtab = Getattr(prefix_node, "symtab"); if (prefix_symtab) { n = symbol_lookup(name, prefix_symtab, checkfunc); break; } } } } } } else { n = 0; } } return n; } } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup() * * Look up a symbol in the symbol table. This uses the C name, not scripting * names. Note: If we come across a using declaration, we follow it to * to get the real node. Any using directives are also followed (but this is * implemented in symbol_lookup()). * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup(const_String_or_char_ptr name, Symtab *n) { Hash *hsym = 0; Node *s = 0; if (!n) { hsym = current_symtab; } else { if (!Checkattr(n, "nodeType", "symboltable")) { n = Getattr(n, "sym:symtab"); } assert(n); if (n) { hsym = n; } } if (Swig_scopename_check(name)) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) { String *nname = NewString(cname + 2); if (Swig_scopename_check(nname)) { s = symbol_lookup_qualified(nname, global_scope, 0, 0, 0); } else { s = symbol_lookup(nname, global_scope, 0); } Delete(nname); } else { String *prefix = Swig_scopename_prefix(name); if (prefix) { s = symbol_lookup_qualified(name, hsym, 0, 0, 0); Delete(prefix); if (!s) { return 0; } } } } if (!s) { while (hsym) { s = symbol_lookup(name, hsym, 0); if (s) break; hsym = Getattr(hsym, "parentNode"); if (!hsym) break; } } if (!s) { return 0; } /* Check if s is a 'using' node */ while (s && Checkattr(s, "nodeType", "using")) { String *uname = Getattr(s, "uname"); Symtab *un = Getattr(s, "sym:symtab"); Node *ss = (!Equal(name, uname) || (un != n)) ? Swig_symbol_clookup(uname, un) : 0; /* avoid infinity loop */ if (!ss) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(s), Getline(s), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(s, "uname"))); } s = ss; } return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup_check() * * This function is identical to Swig_symbol_clookup() except that it * accepts a callback function that is invoked to determine a symbol match. * The purpose of this function is to support complicated algorithms that need * to examine multiple definitions of the same symbol that might appear in an * inheritance hierarchy. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup_check(const_String_or_char_ptr name, Symtab *n, int (*checkfunc) (Node *n)) { Hash *hsym = 0; Node *s = 0; if (!n) { hsym = current_symtab; } else { if (!Checkattr(n, "nodeType", "symboltable")) { n = Getattr(n, "sym:symtab"); } assert(n); if (n) { hsym = n; } } if (Swig_scopename_check(name)) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) { String *nname = NewString(cname + 2); if (Swig_scopename_check(nname)) { s = symbol_lookup_qualified(nname, global_scope, 0, 0, checkfunc); } else { s = symbol_lookup(nname, global_scope, checkfunc); } Delete(nname); } else { String *prefix = Swig_scopename_prefix(name); if (prefix) { s = symbol_lookup_qualified(name, hsym, 0, 0, checkfunc); Delete(prefix); if (!s) { return 0; } } } } if (!s) { while (hsym) { s = symbol_lookup(name, hsym, checkfunc); if (s) break; hsym = Getattr(hsym, "parentNode"); if (!hsym) break; } } if (!s) { return 0; } /* Check if s is a 'using' node */ while (s && Checkattr(s, "nodeType", "using")) { Node *ss; ss = Swig_symbol_clookup(Getattr(s, "uname"), Getattr(s, "sym:symtab")); if (!ss && !checkfunc) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(s), Getline(s), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(s, "uname"))); } s = ss; } return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup_local() * * Same as Swig_symbol_clookup but parent nodes are not searched, that is, just * this symbol table is searched. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup_local(const_String_or_char_ptr name, Symtab *n) { Hash *hsym; Node *s = 0; if (!n) { hsym = current_symtab; } else { if (!Checkattr(n, "nodeType", "symboltable")) { n = Getattr(n, "sym:symtab"); } assert(n); hsym = n; } if (Swig_scopename_check(name)) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) { String *nname = NewString(cname + 2); if (Swig_scopename_check(nname)) { s = symbol_lookup_qualified(nname, global_scope, 0, 0, 0); } else { s = symbol_lookup(nname, global_scope, 0); } Delete(nname); } else { s = symbol_lookup_qualified(name, hsym, 0, 0, 0); } } if (!s) { s = symbol_lookup(name, hsym, 0); } if (!s) return 0; /* Check if s is a 'using' node */ while (s && Checkattr(s, "nodeType", "using")) { Node *ss = Swig_symbol_clookup_local(Getattr(s, "uname"), Getattr(s, "sym:symtab")); if (!ss) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(s), Getline(s), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(s, "uname"))); } s = ss; } return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup_local_check() * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup_local_check(const_String_or_char_ptr name, Symtab *n, int (*checkfunc) (Node *)) { Hash *hsym; Node *s = 0; if (!n) { hsym = current_symtab; } else { if (!Checkattr(n, "nodeType", "symboltable")) { n = Getattr(n, "sym:symtab"); } assert(n); hsym = n; } if (Swig_scopename_check(name)) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) { String *nname = NewString(cname + 2); if (Swig_scopename_check(nname)) { s = symbol_lookup_qualified(nname, global_scope, 0, 0, checkfunc); } else { s = symbol_lookup(nname, global_scope, checkfunc); } Delete(nname); } else { s = symbol_lookup_qualified(name, hsym, 0, 0, checkfunc); } } if (!s) { s = symbol_lookup(name, hsym, checkfunc); } if (!s) return 0; /* Check if s is a 'using' node */ while (s && Checkattr(s, "nodeType", "using")) { Node *ss = Swig_symbol_clookup_local_check(Getattr(s, "uname"), Getattr(s, "sym:symtab"), checkfunc); if (!ss && !checkfunc) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(s), Getline(s), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(s, "uname"))); } s = ss; } return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup_no_inherit() * * Symbol lookup like Swig_symbol_clookup but does not follow using declarations. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup_no_inherit(const_String_or_char_ptr name, Symtab *n) { Node *s = 0; assert(use_inherit==1); use_inherit = 0; s = Swig_symbol_clookup(name, n); use_inherit = 1; return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_cscope() * * Look up a scope name. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_cscope(const_String_or_char_ptr name, Symtab *symtab) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) return symbol_lookup_qualified(0, global_scope, name, 0, 0); return symbol_lookup_qualified(0, symtab, name, 0, 0); } /* ----------------------------------------------------------------------------- * Swig_symbol_remove() * * Remove a symbol. If the symbol is an overloaded function and the symbol removed * is not the last in the list of overloaded functions, then the overloaded * names (sym:overname attribute) are changed to start from zero, eg __SWIG_0. * ----------------------------------------------------------------------------- */ void Swig_symbol_remove(Node *n) { Symtab *symtab; String *symname; String *overname; Node *symprev; Node *symnext; Node *fixovername = 0; symtab = Getattr(n, "sym:symtab"); /* Get symbol table object */ symtab = Getattr(symtab, "symtab"); /* Get actual hash table of symbols */ symname = Getattr(n, "sym:name"); symprev = Getattr(n, "sym:previousSibling"); symnext = Getattr(n, "sym:nextSibling"); /* If previous symbol, just fix the links */ if (symprev) { if (symnext) { Setattr(symprev, "sym:nextSibling", symnext); fixovername = symprev; /* fix as symbol to remove is somewhere in the middle of the linked list */ } else { Delattr(symprev, "sym:nextSibling"); } } else { /* If no previous symbol, see if there is a next symbol */ if (symnext) { Setattr(symtab, symname, symnext); fixovername = symnext; /* fix as symbol to remove is at head of linked list */ } else { if (symname) Delattr(symtab, symname); } } if (symnext) { if (symprev) { Setattr(symnext, "sym:previousSibling", symprev); } else { Delattr(symnext, "sym:previousSibling"); } } Delattr(n, "sym:symtab"); Delattr(n, "sym:previousSibling"); Delattr(n, "sym:nextSibling"); Delattr(n, "csym:nextSibling"); Delattr(n, "sym:overname"); Delattr(n, "csym:previousSibling"); Delattr(n, "sym:overloaded"); n = 0; if (fixovername) { Node *nn = fixovername; Node *head = fixovername; int pn = 0; /* find head of linked list */ while (nn) { head = nn; nn = Getattr(nn, "sym:previousSibling"); } /* adjust all the sym:overname strings to start from 0 and increment by one */ nn = head; while (nn) { assert(Getattr(nn, "sym:overname")); Delattr(nn, "sym:overname"); overname = NewStringf("__SWIG_%d", pn); Setattr(nn, "sym:overname", overname); Delete(overname); pn++; nn = Getattr(nn, "sym:nextSibling"); } } } /* ----------------------------------------------------------------------------- * Swig_symbol_qualified() * * Return the qualified name of a symbol * ----------------------------------------------------------------------------- */ String *Swig_symbol_qualified(Node *n) { Hash *symtab; if (Checkattr(n, "nodeType", "symboltable")) { symtab = n; } else { symtab = Getattr(n, "sym:symtab"); } if (!symtab) return NewStringEmpty(); #ifdef SWIG_DEBUG Printf(stderr, "symbol_qscope %s %p %s\n", Getattr(n, "name"), symtab, Getattr(symtab, "name")); #endif return Swig_symbol_qualifiedscopename(symtab); } /* ----------------------------------------------------------------------------- * Swig_symbol_isoverloaded() * * Check if a symbol is overloaded. Returns the first symbol if so. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_isoverloaded(Node *n) { return Getattr(n, "sym:overloaded"); } /* ----------------------------------------------------------------------------- * symbol_template_qualify() * * Internal function to create a fully qualified type name for templates * ----------------------------------------------------------------------------- */ /* This cache produces problems with OSS, don't active it */ /* #define SWIG_TEMPLATE_QUALIFY_CACHE */ static SwigType *symbol_template_qualify(const SwigType *e, Symtab *st) { String *tprefix, *tsuffix; SwigType *qprefix; List *targs; Node *tempn; Symtab *tscope; Iterator ti; #ifdef SWIG_TEMPLATE_QUALIFY_CACHE static Hash *qualify_cache = 0; String *scopetype = st ? NewStringf("%s::%s", Getattr(st, "name"), e) : NewStringf("%s::%s", Swig_symbol_getscopename(), e); if (!qualify_cache) { qualify_cache = NewHash(); } if (scopetype) { String *cres = Getattr(qualify_cache, scopetype); if (cres) { Delete(scopetype); return Copy(cres); } } #endif tprefix = SwigType_templateprefix(e); tsuffix = SwigType_templatesuffix(e); qprefix = Swig_symbol_type_qualify(tprefix, st); targs = SwigType_parmlist(e); tempn = Swig_symbol_clookup_local(tprefix, st); tscope = tempn ? Getattr(tempn, "sym:symtab") : 0; Append(qprefix, "<("); for (ti = First(targs); ti.item;) { String *vparm; String *qparm = Swig_symbol_type_qualify(ti.item, st); if (tscope && (tscope != st)) { String *ty = Swig_symbol_type_qualify(qparm, tscope); Delete(qparm); qparm = ty; } vparm = Swig_symbol_template_param_eval(qparm, st); Append(qprefix, vparm); ti = Next(ti); if (ti.item) { Putc(',', qprefix); } Delete(qparm); Delete(vparm); } Append(qprefix, ")>"); Append(qprefix, tsuffix); Delete(tprefix); Delete(tsuffix); Delete(targs); #ifdef SWIG_DEBUG Printf(stderr, "symbol_temp_qual %s %s\n", e, qprefix); #endif #ifdef SWIG_TEMPLATE_QUALIFY_CACHE Setattr(qualify_cache, scopetype, qprefix); Delete(scopetype); #endif return qprefix; } static int symbol_no_constructor(Node *n) { return !Checkattr(n, "nodeType", "constructor"); } /* ----------------------------------------------------------------------------- * Swig_symbol_type_qualify() * * Create a fully qualified type name * Note: Does not resolve a constructor if passed in as the 'type'. * ----------------------------------------------------------------------------- */ SwigType *Swig_symbol_type_qualify(const SwigType *t, Symtab *st) { List *elements; String *result = NewStringEmpty(); int i, len; char *c = Char(t); if (strncmp(c, "::", 2) == 0) { Append(result, t); return result; } elements = SwigType_split(t); len = Len(elements); for (i = 0; i < len; i++) { String *e = Getitem(elements, i); if (SwigType_issimple(e)) { /* Note: the unary scope operator (::) is being removed from the template parameters here. */ Node *n = Swig_symbol_clookup_check(e, st, symbol_no_constructor); if (n) { String *name = Getattr(n, "name"); Clear(e); Append(e, name); #ifdef SWIG_DEBUG Printf(stderr, "symbol_qual_ei %d %s %s %p\n", i, name, e, st); #endif if (!Swig_scopename_check(name)) { String *qname = Swig_symbol_qualified(n); if (qname && Len(qname)) { Insert(e, 0, "::"); Insert(e, 0, qname); } #ifdef SWIG_DEBUG Printf(stderr, "symbol_qual_sc %d %s %s %p\n", i, qname, e, st); #endif Delete(qname); } } else if (SwigType_istemplate(e)) { SwigType *ty = symbol_template_qualify(e, st); Clear(e); Append(e, ty); Delete(ty); } if (strncmp(Char(e), "::", 2) == 0) { Delitem(e, 0); Delitem(e, 0); } Append(result, e); } else if (SwigType_isfunction(e)) { List *parms = SwigType_parmlist(e); String *s = NewString("f("); Iterator pi = First(parms); while (pi.item) { String *pf = Swig_symbol_type_qualify(pi.item, st); Append(s, pf); pi = Next(pi); if (pi.item) { Append(s, ","); } Delete(pf); } Append(s, ")."); Append(result, s); Delete(parms); Delete(s); } else { Append(result, e); } } Delete(elements); #ifdef SWIG_DEBUG Printf(stderr, "symbol_qualify %s %s %p %s\n", t, result, st, st ? Getattr(st, "name") : 0); #endif return result; } /* ----------------------------------------------------------------------------- * Swig_symbol_template_reduce() * Resolves template parameter types * For example: * typedef int Int; * typedef Int Integer; * with input: * Foo<(Int,Integer)> * returns: * Foo<(int,int)> * ----------------------------------------------------------------------------- */ static SwigType *Swig_symbol_template_reduce(SwigType *qt, Symtab *ntab) { Parm *p; String *templateargs = SwigType_templateargs(qt); List *parms = SwigType_parmlist(templateargs); Iterator pi = First(parms); String *tprefix = SwigType_templateprefix(qt); String *tsuffix = SwigType_templatesuffix(qt); String *qprefix = SwigType_typedef_qualified(tprefix); Append(qprefix, "<("); while ((p = pi.item)) { String *np; String *tp = Swig_symbol_typedef_reduce(p, ntab); String *qp = Swig_symbol_type_qualify(tp, ntab); Node *n = Swig_symbol_clookup(qp, ntab); if (n) { String *qual = Swig_symbol_qualified(n); np = Copy(Getattr(n, "name")); Delete(tp); tp = np; if (qual && Len(qual)) { Insert(np, 0, "::"); Insert(np, 0, qual); } Delete(qual); } else { np = qp; } Append(qprefix, np); pi = Next(pi); if (pi.item) { Append(qprefix, ","); } Delete(qp); Delete(tp); } Append(qprefix, ")>"); Append(qprefix, tsuffix); Delete(parms); Delete(tprefix); Delete(tsuffix); Delete(templateargs); return qprefix; } /* ----------------------------------------------------------------------------- * Swig_symbol_typedef_reduce() * * Chase a typedef through symbol tables looking for a match. * ----------------------------------------------------------------------------- */ SwigType *Swig_symbol_typedef_reduce(const SwigType *ty, Symtab *tab) { SwigType *prefix, *base; Node *n; String *nt; base = SwigType_base(ty); prefix = SwigType_prefix(ty); n = Swig_symbol_clookup(base, tab); if (!n) { if (SwigType_istemplate(ty)) { SwigType *qt = Swig_symbol_template_reduce(base, tab); Append(prefix, qt); Delete(qt); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (a) %s %s\n", ty, prefix); #endif Delete(base); return prefix; } else { Delete(prefix); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (b) %s %s\n", ty, ty); #endif return Copy(ty); } } nt = Getattr(n, "nodeType"); if (Equal(nt, "using")) { String *uname = Getattr(n, "uname"); if (uname) { n = Swig_symbol_clookup(base, Getattr(n, "sym:symtab")); if (!n) { Delete(base); Delete(prefix); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (c) %s %s\n", ty, ty); #endif return Copy(ty); } } } if (Equal(nt, "cdecl")) { String *storage = Getattr(n, "storage"); if (storage && (Equal(storage, "typedef"))) { SwigType *decl; SwigType *rt; SwigType *qt; Symtab *ntab; SwigType *nt = Copy(Getattr(n, "type")); /* Fix for case 'typedef struct Hello hello;' */ { const char *dclass[3] = { "struct ", "union ", "class " }; int i; char *c = Char(nt); for (i = 0; i < 3; i++) { if (strstr(c, dclass[i]) == c) { Replace(nt, dclass[i], "", DOH_REPLACE_FIRST); } } } decl = Getattr(n, "decl"); if (decl) { SwigType_push(nt, decl); } SwigType_push(nt, prefix); Delete(base); Delete(prefix); ntab = Getattr(n, "sym:symtab"); rt = Swig_symbol_typedef_reduce(nt, ntab); qt = Swig_symbol_type_qualify(rt, ntab); if (SwigType_istemplate(qt)) { SwigType *qtr = Swig_symbol_template_reduce(qt, ntab); Delete(qt); qt = qtr; } Delete(nt); Delete(rt); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (d) %s %s\n", qt, ty); #endif return qt; } } Delete(base); Delete(prefix); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (e) %s %s\n", ty, ty); #endif return Copy(ty); } /* ----------------------------------------------------------------------------- * Swig_symbol_string_qualify() * * This function takes a string and looks for identifiers. Identifiers are * then qualified according to scope rules. This function is used in a number * of settings including expression evaluation, scoping of conversion operators, * and so forth. * ----------------------------------------------------------------------------- */ String *Swig_symbol_string_qualify(String *s, Symtab *st) { int have_id = 0; String *id = NewStringEmpty(); String *r = NewStringEmpty(); char *c = Char(s); int first_char = 1; while (*c) { if (isalpha((int) *c) || (*c == '_') || (*c == ':') || (*c == '~' && first_char) || (isdigit((int) *c) && !first_char)) { Putc(*c, id); have_id = 1; } else { if (have_id) { String *qid = Swig_symbol_type_qualify(id, st); Append(r, qid); Clear(id); Delete(qid); have_id = 0; } Putc(*c, r); } first_char = (*c == ':'); c++; } if (have_id) { String *qid = Swig_symbol_type_qualify(id, st); Append(r, qid); Delete(qid); } Delete(id); return r; } /* ----------------------------------------------------------------------------- * Swig_symbol_template_defargs() * * Apply default arg from generic template default args * Returns a parameter list which contains missing default arguments (if any) * Note side effects: parms will also contain the extra parameters in its list * (but only if non-zero). * ----------------------------------------------------------------------------- */ ParmList *Swig_symbol_template_defargs(Parm *parms, Parm *targs, Symtab *tscope, Symtab *tsdecl) { ParmList *expandedparms = parms; if (Len(parms) < Len(targs)) { Parm *lp = parms; Parm *p = lp; Parm *tp = targs; while (p && tp) { p = nextSibling(p); tp = nextSibling(tp); if (p) lp = p; } while (tp) { String *value = Getattr(tp, "value"); if (value) { Parm *cp; Parm *ta = targs; Parm *p = parms; SwigType *nt = Swig_symbol_string_qualify(value, tsdecl); SwigType *ntq = 0; #ifdef SWIG_DEBUG Printf(stderr, "value %s %s %s\n", value, nt, tsdecl ? Getattr(tsdecl, "name") : tsdecl); #endif while (p && ta) { String *name = Getattr(ta, "name"); String *pvalue = Getattr(p, "value"); String *value = pvalue ? pvalue : Getattr(p, "type"); String *ttq = Swig_symbol_type_qualify(value, tscope); /* value = SwigType_typedef_resolve_all(value); */ Replaceid(nt, name, ttq); p = nextSibling(p); ta = nextSibling(ta); Delete(ttq); } ntq = Swig_symbol_type_qualify(nt, tsdecl); if (SwigType_istemplate(ntq)) { String *ty = Swig_symbol_template_deftype(ntq, tscope); Delete(ntq); ntq = ty; } cp = NewParmWithoutFileLineInfo(ntq, 0); if (lp) { set_nextSibling(lp, cp); Delete(cp); } else { expandedparms = cp; } lp = cp; tp = nextSibling(tp); Delete(nt); Delete(ntq); } else { tp = 0; } } } return expandedparms; } /* ----------------------------------------------------------------------------- * Swig_symbol_template_deftype() * * Apply default args to generic template type * ----------------------------------------------------------------------------- */ #define SWIG_TEMPLATE_DEFTYPE_CACHE SwigType *Swig_symbol_template_deftype(const SwigType *type, Symtab *tscope) { String *result = NewStringEmpty(); List *elements = SwigType_split(type); int len = Len(elements); int i; #ifdef SWIG_TEMPLATE_DEFTYPE_CACHE static Hash *s_cache = 0; Hash *scope_cache; /* The lookup depends on the current scope and potential namespace qualification. Looking up x in namespace y is not the same as looking up x::y in outer scope. -> we use a 2-level hash: first scope and then symbol. */ String *scope_name = tscope ? Swig_symbol_qualifiedscopename(tscope) : Swig_symbol_qualifiedscopename(current_symtab); String *type_name = tscope ? NewStringf("%s::%s", Getattr(tscope, "name"), type) : NewStringf("%s::%s", Swig_symbol_getscopename(), type); if (!scope_name) scope_name = NewString("::"); if (!s_cache) { s_cache = NewHash(); } scope_cache = Getattr(s_cache, scope_name); if (scope_cache) { String *cres = Getattr(scope_cache, type_name); if (cres) { Append(result, cres); #ifdef SWIG_DEBUG Printf(stderr, "cached deftype %s(%s) -> %s\n", type, scope_name, result); #endif Delete(type_name); Delete(scope_name); return result; } } else { scope_cache = NewHash(); Setattr(s_cache, scope_name, scope_cache); Delete(scope_name); } #endif #ifdef SWIG_DEBUG Printf(stderr, "finding deftype %s\n", type); #endif for (i = 0; i < len; i++) { String *e = Getitem(elements, i); if (SwigType_isfunction(e)) { String *s = NewString("f("); List *parms = SwigType_parmlist(e); Iterator pi = First(parms); while (pi.item) { String *pf = SwigType_istemplate(e) ? Swig_symbol_template_deftype(pi.item, tscope) : Swig_symbol_type_qualify(pi.item, tscope); Append(s, pf); pi = Next(pi); if (pi.item) { Append(s, ","); } Delete(pf); } Append(s, ")."); Append(result, s); Delete(s); Delete(parms); } else if (SwigType_istemplate(e)) { String *prefix = SwigType_prefix(e); String *base = SwigType_base(e); String *tprefix = SwigType_templateprefix(base); String *targs = SwigType_templateargs(base); String *tsuffix = SwigType_templatesuffix(base); ParmList *tparms = SwigType_function_parms(targs, 0); Node *tempn = Swig_symbol_clookup_local(tprefix, tscope); if (!tempn && tsuffix && Len(tsuffix)) { tempn = Swig_symbol_clookup(tprefix, 0); } #ifdef SWIG_DEBUG Printf(stderr, "deftype type %s %s %d\n", e, tprefix, (long) tempn); #endif if (tempn) { ParmList *tnargs = Getattr(tempn, "templateparms"); ParmList *expandedparms; Parm *p; Symtab *tsdecl = Getattr(tempn, "sym:symtab"); #ifdef SWIG_DEBUG Printf(stderr, "deftype type %s %s %s\n", tprefix, targs, tsuffix); #endif Append(tprefix, "<("); expandedparms = Swig_symbol_template_defargs(tparms, tnargs, tscope, tsdecl); p = expandedparms; tscope = tsdecl; while (p) { SwigType *ptype = Getattr(p, "type"); SwigType *ttr = ptype ? ptype : Getattr(p, "value"); SwigType *ttf = Swig_symbol_type_qualify(ttr, tscope); SwigType *ttq = Swig_symbol_template_param_eval(ttf, tscope); #ifdef SWIG_DEBUG Printf(stderr, "arg type %s\n", ttq); #endif if (SwigType_istemplate(ttq)) { SwigType *ttd = Swig_symbol_template_deftype(ttq, tscope); Delete(ttq); ttq = ttd; #ifdef SWIG_DEBUG Printf(stderr, "arg deftype %s\n", ttq); #endif } Append(tprefix, ttq); p = nextSibling(p); if (p) Putc(',', tprefix); Delete(ttf); Delete(ttq); } Append(tprefix, ")>"); Append(tprefix, tsuffix); Append(prefix, tprefix); #ifdef SWIG_DEBUG Printf(stderr, "deftype %s %s \n", type, tprefix); #endif Append(result, prefix); } else { Append(result, e); } Delete(prefix); Delete(base); Delete(tprefix); Delete(tsuffix); Delete(targs); Delete(tparms); } else { Append(result, e); } } Delete(elements); #ifdef SWIG_TEMPLATE_DEFTYPE_CACHE Setattr(scope_cache, type_name, result); Delete(type_name); #endif return result; } SwigType *Swig_symbol_template_param_eval(const SwigType *p, Symtab *symtab) { String *value = Copy(p); Node *lastnode = 0; while (1) { Node *n = Swig_symbol_clookup(value, symtab); if (n == lastnode) break; lastnode = n; if (n) { String *nt = Getattr(n, "nodeType"); if (Equal(nt, "enumitem")) { /* An enum item. Generate a fully qualified name */ String *qn = Swig_symbol_qualified(n); if (qn && Len(qn)) { Append(qn, "::"); Append(qn, Getattr(n, "name")); Delete(value); value = qn; continue; } else { Delete(qn); break; } } else if ((Equal(nt, "cdecl"))) { String *nv = Getattr(n, "value"); if (nv) { Delete(value); value = Copy(nv); continue; } } } break; } return value; } swig-4.0.2/Source/Swig/naming.c0000644000175000017500000014501713667507523016160 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * naming.c * * Functions for generating various kinds of names during code generation. * * Swig_name_register is used to register a format string for generating names. * The format string makes use of the following format specifiers: * * %c - class name is substituted * %f - function name is substituted * %m - member name is substituted * %n - namespace is substituted * %v - variable name is substituted * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" #include /* Hash table containing naming data */ static Hash *naming_hash = 0; #if 0 #define SWIG_DEBUG #endif /* ----------------------------------------------------------------------------- * Swig_name_register() * * Register a new naming format. * ----------------------------------------------------------------------------- */ void Swig_name_register(const_String_or_char_ptr method, const_String_or_char_ptr format) { if (!naming_hash) naming_hash = NewHash(); Setattr(naming_hash, method, format); } void Swig_name_unregister(const_String_or_char_ptr method) { if (naming_hash) { Delattr(naming_hash, method); } } /* Return naming format for the specified method or the default format if none was explicitly registered */ static String* get_naming_format_for(const char *method, const char *def_format) { String* f = naming_hash ? Getattr(naming_hash, method) : NULL; return f ? Copy(f) : NewString(def_format); } static int name_mangle(String *r) { char *c; int special; special = 0; Replaceall(r, "::", "_"); c = Char(r); while (*c) { if (!isalnum((int) *c) && (*c != '_')) { special = 1; switch (*c) { case '+': *c = 'a'; break; case '-': *c = 's'; break; case '*': *c = 'm'; break; case '/': *c = 'd'; break; case '<': *c = 'l'; break; case '>': *c = 'g'; break; case '=': *c = 'e'; break; case ',': *c = 'c'; break; case '(': *c = 'p'; break; case ')': *c = 'P'; break; case '[': *c = 'b'; break; case ']': *c = 'B'; break; case '^': *c = 'x'; break; case '&': *c = 'A'; break; case '|': *c = 'o'; break; case '~': *c = 'n'; break; case '!': *c = 'N'; break; case '%': *c = 'M'; break; case '.': *c = 'f'; break; case '?': *c = 'q'; break; default: *c = '_'; break; } } c++; } if (special) Append(r, "___"); return special; } /* ----------------------------------------------------------------------------- * replace_nspace() * * Mangles in the namespace from nspace by replacing %n in name if nspace feature required. * ----------------------------------------------------------------------------- */ static void replace_nspace(String *name, const_String_or_char_ptr nspace) { if (nspace) { String *namspace = NewStringf("%s_", nspace); Replaceall(namspace, NSPACE_SEPARATOR, "_"); Replace(name, "%n", namspace, DOH_REPLACE_ANY); Delete(namspace); } else { Replace(name, "%n", "", DOH_REPLACE_ANY); } } /* ----------------------------------------------------------------------------- * Swig_name_mangle() * * Converts all of the non-identifier characters of a string to underscores. * ----------------------------------------------------------------------------- */ String *Swig_name_mangle(const_String_or_char_ptr s) { #if 0 String *r = NewString(s); name_mangle(r); return r; #else return Swig_string_mangle(s); #endif } /* ----------------------------------------------------------------------------- * Swig_name_wrapper() * * Returns the name of a wrapper function. * ----------------------------------------------------------------------------- */ String *Swig_name_wrapper(const_String_or_char_ptr fname) { String *r = get_naming_format_for("wrapper", "_wrap_%f"); Replace(r, "%f", fname, DOH_REPLACE_ANY); name_mangle(r); return r; } /* ----------------------------------------------------------------------------- * Swig_name_member() * * Returns the name of a class method. * ----------------------------------------------------------------------------- */ String *Swig_name_member(const_String_or_char_ptr nspace, const_String_or_char_ptr classname, const_String_or_char_ptr membername) { String *r; String *rclassname; char *cname; rclassname = SwigType_namestr(classname); r = get_naming_format_for("member", "%n%c_%m"); cname = Char(rclassname); if ((strncmp(cname, "struct ", 7) == 0) || ((strncmp(cname, "class ", 6) == 0)) || ((strncmp(cname, "union ", 6) == 0))) { cname = strchr(cname, ' ') + 1; } replace_nspace(r, nspace); Replace(r, "%c", cname, DOH_REPLACE_ANY); Replace(r, "%m", membername, DOH_REPLACE_ANY); /* name_mangle(r); */ Delete(rclassname); return r; } /* ----------------------------------------------------------------------------- * Swig_name_get() * * Returns the name of the accessor function used to get a variable. * ----------------------------------------------------------------------------- */ String *Swig_name_get(const_String_or_char_ptr nspace, const_String_or_char_ptr vname) { String *r = get_naming_format_for("get", "%n%v_get"); #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_get: '%s'\n", vname); #endif replace_nspace(r, nspace); Replace(r, "%v", vname, DOH_REPLACE_ANY); /* name_mangle(r); */ return r; } /* ----------------------------------------------------------------------------- * Swig_name_set() * * Returns the name of the accessor function used to set a variable. * ----------------------------------------------------------------------------- */ String *Swig_name_set(const_String_or_char_ptr nspace, const_String_or_char_ptr vname) { String *r = get_naming_format_for("set", "%n%v_set"); replace_nspace(r, nspace); Replace(r, "%v", vname, DOH_REPLACE_ANY); /* name_mangle(r); */ return r; } /* Common implementation of all Swig_name_() functions below. */ static String *make_full_name_for(const char *method, const char *def_format, const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { String *r; String *rclassname; char *cname; rclassname = SwigType_namestr(classname); r = get_naming_format_for(method, def_format); cname = Char(rclassname); if ((strncmp(cname, "struct ", 7) == 0) || ((strncmp(cname, "class ", 6) == 0)) || ((strncmp(cname, "union ", 6) == 0))) { cname = strchr(cname, ' ') + 1; } replace_nspace(r, nspace); Replace(r, "%c", cname, DOH_REPLACE_ANY); Delete(rclassname); return r; } /* ----------------------------------------------------------------------------- * Swig_name_construct() * * Returns the name of the accessor function used to create an object. * ----------------------------------------------------------------------------- */ String *Swig_name_construct(const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { return make_full_name_for("construct", "new_%n%c", nspace, classname); } /* ----------------------------------------------------------------------------- * Swig_name_copyconstructor() * * Returns the name of the accessor function used to copy an object. * ----------------------------------------------------------------------------- */ String *Swig_name_copyconstructor(const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { return make_full_name_for("copy", "copy_%n%c", nspace, classname); } /* ----------------------------------------------------------------------------- * Swig_name_destroy() * * Returns the name of the accessor function used to destroy an object. * ----------------------------------------------------------------------------- */ String *Swig_name_destroy(const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { return make_full_name_for("destroy", "delete_%n%c", nspace, classname); } /* ----------------------------------------------------------------------------- * Swig_name_disown() * * Returns the name of the accessor function used to disown an object. * ----------------------------------------------------------------------------- */ String *Swig_name_disown(const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { return make_full_name_for("disown", "disown_%n%c", nspace, classname); } /* ----------------------------------------------------------------------------- * Swig_name_object_set() * * Sets an object associated with a name and optional declarators. * ----------------------------------------------------------------------------- */ void Swig_name_object_set(Hash *namehash, String *name, SwigType *decl, DOH *object) { DOH *n; #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_object_set: '%s', '%s'\n", name, decl); #endif n = Getattr(namehash, name); if (!n) { n = NewHash(); Setattr(namehash, name, n); Delete(n); } /* Add an object based on the declarator value */ if (!decl) { Setattr(n, "start", object); } else { SwigType *cd = Copy(decl); Setattr(n, cd, object); Delete(cd); } } /* ----------------------------------------------------------------------------- * Swig_name_object_get() * * Return an object associated with an optional class prefix, name, and * declarator. This function operates according to name matching rules * described for the %rename directive in the SWIG manual. * ----------------------------------------------------------------------------- */ static DOH *get_object(Hash *n, String *decl) { DOH *rn = 0; if (!n) return 0; if (decl) { rn = Getattr(n, decl); } else { rn = Getattr(n, "start"); } return rn; } static DOH *name_object_get(Hash *namehash, String *tname, SwigType *decl, SwigType *ncdecl) { DOH *rn = 0; Hash *n = Getattr(namehash, tname); if (n) { rn = get_object(n, decl); if ((!rn) && ncdecl) rn = get_object(n, ncdecl); if (!rn) rn = get_object(n, 0); } return rn; } DOH *Swig_name_object_get(Hash *namehash, String *prefix, String *name, SwigType *decl) { String *tname = NewStringEmpty(); DOH *rn = 0; char *ncdecl = 0; if (!namehash) return 0; /* DB: This removed to more tightly control feature/name matching */ /* if ((decl) && (SwigType_isqualifier(decl))) { ncdecl = strchr(Char(decl),'.'); ncdecl++; } */ #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_object_get: '%s' '%s', '%s'\n", prefix, name, decl); #endif /* Perform a class-based lookup (if class prefix supplied) */ if (prefix) { if (Len(prefix)) { Printf(tname, "%s::%s", prefix, name); rn = name_object_get(namehash, tname, decl, ncdecl); if (!rn) { String *cls = Swig_scopename_last(prefix); if (!Equal(cls, prefix)) { Clear(tname); Printf(tname, "*::%s::%s", cls, name); rn = name_object_get(namehash, tname, decl, ncdecl); } Delete(cls); } /* Lookup a name within a templated-based class */ if (!rn) { String *t_name = SwigType_istemplate_templateprefix(prefix); if (t_name) { Clear(tname); Printf(tname, "%s::%s", t_name, name); rn = name_object_get(namehash, tname, decl, ncdecl); Delete(t_name); } } /* Lookup a template-based name within a class */ if (!rn) { String *t_name = SwigType_istemplate_templateprefix(name); if (t_name) rn = Swig_name_object_get(namehash, prefix, t_name, decl); Delete(t_name); } } /* A wildcard-based class lookup */ if (!rn) { Clear(tname); Printf(tname, "*::%s", name); rn = name_object_get(namehash, tname, decl, ncdecl); } } else { /* Lookup in the global namespace only */ Clear(tname); Printf(tname, "::%s", name); rn = name_object_get(namehash, tname, decl, ncdecl); } /* Catch-all */ if (!rn) { rn = name_object_get(namehash, name, decl, ncdecl); } if (!rn && Swig_scopename_check(name)) { String *nprefix = 0; String *nlast = 0; Swig_scopename_split(name, &nprefix, &nlast); rn = name_object_get(namehash, nlast, decl, ncdecl); Delete(nlast); Delete(nprefix); } Delete(tname); #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_object_get: found %d\n", rn ? 1 : 0); #endif return rn; } /* ----------------------------------------------------------------------------- * Swig_name_object_inherit() * * Implements name-based inheritance scheme. * ----------------------------------------------------------------------------- */ void Swig_name_object_inherit(Hash *namehash, String *base, String *derived) { Iterator ki; Hash *derh; String *bprefix; String *dprefix; char *cbprefix; int plen; if (!namehash) return; /* Temporary hash holding all the entries we add while we iterate over namehash itself as we can't modify the latter while iterating over it. */ derh = NULL; bprefix = NewStringf("%s::", base); dprefix = NewStringf("%s::", derived); cbprefix = Char(bprefix); plen = (int)strlen(cbprefix); for (ki = First(namehash); ki.key; ki = Next(ki)) { char *k = Char(ki.key); if (strncmp(k, cbprefix, plen) == 0) { /* Copy, adjusting name, this element to the derived hash. */ Iterator oi; String *nkey = NewStringf("%s%s", dprefix, k + plen); Hash *n = ki.item; Hash *newh; /* Don't overwrite an existing value for the derived class, if any. */ newh = Getattr(namehash, nkey); if (!newh) { if (!derh) derh = NewHash(); newh = NewHash(); Setattr(derh, nkey, newh); Delete(newh); } for (oi = First(n); oi.key; oi = Next(oi)) { if (!Getattr(newh, oi.key)) { String *ci = Copy(oi.item); Setattr(newh, oi.key, ci); Delete(ci); } } Delete(nkey); } } /* Merge the contents of derived hash into the main hash. */ if (derh) { for (ki = First(derh); ki.key; ki = Next(ki)) { Setattr(namehash, ki.key, ki.item); } } Delete(bprefix); Delete(dprefix); Delete(derh); } /* ----------------------------------------------------------------------------- * merge_features() * * Given a hash, this function merges the features in the hash into the node. * ----------------------------------------------------------------------------- */ static void merge_features(Hash *features, Node *n) { Iterator ki; if (!features) return; for (ki = First(features); ki.key; ki = Next(ki)) { String *ci = Copy(ki.item); Setattr(n, ki.key, ci); Delete(ci); } } /* ----------------------------------------------------------------------------- * Swig_features_get() * * Attaches any features in the features hash to the node that matches * the declaration, decl. * ----------------------------------------------------------------------------- */ static void features_get(Hash *features, const String *tname, SwigType *decl, SwigType *ncdecl, Node *node) { Node *n = Getattr(features, tname); #ifdef SWIG_DEBUG Printf(stdout, " features_get: %s\n", tname); #endif if (n) { merge_features(get_object(n, 0), node); if (ncdecl) merge_features(get_object(n, ncdecl), node); merge_features(get_object(n, decl), node); } } void Swig_features_get(Hash *features, String *prefix, String *name, SwigType *decl, Node *node) { char *ncdecl = 0; String *rdecl = 0; String *rname = 0; if (!features) return; /* MM: This removed to more tightly control feature/name matching */ /* if ((decl) && (SwigType_isqualifier(decl))) { ncdecl = strchr(Char(decl),'.'); ncdecl++; } */ /* very specific hack for template constructors/destructors */ if (name && SwigType_istemplate(name)) { String *nodetype = nodeType(node); if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) { String *nprefix = 0; String *nlast = 0; String *tprefix; Swig_scopename_split(name, &nprefix, &nlast); tprefix = SwigType_templateprefix(nlast); Delete(nlast); if (Len(nprefix)) { Append(nprefix, "::"); Append(nprefix, tprefix); Delete(tprefix); rname = nprefix; } else { rname = tprefix; Delete(nprefix); } rdecl = Copy(decl); Replaceall(rdecl, name, rname); decl = rdecl; name = rname; } } #ifdef SWIG_DEBUG Printf(stdout, "Swig_features_get: '%s' '%s' '%s'\n", prefix, name, decl); #endif /* Global features */ features_get(features, "", 0, 0, node); if (name) { String *tname = NewStringEmpty(); /* add features for 'root' template */ String *dname = SwigType_istemplate_templateprefix(name); if (dname) { features_get(features, dname, decl, ncdecl, node); } /* Catch-all */ features_get(features, name, decl, ncdecl, node); /* Perform a class-based lookup (if class prefix supplied) */ if (prefix) { /* A class-generic feature */ if (Len(prefix)) { Printf(tname, "%s::", prefix); features_get(features, tname, decl, ncdecl, node); } /* A wildcard-based class lookup */ Clear(tname); Printf(tname, "*::%s", name); features_get(features, tname, decl, ncdecl, node); /* A specific class lookup */ if (Len(prefix)) { /* A template-based class lookup */ String *tprefix = SwigType_istemplate_templateprefix(prefix); if (tprefix) { Clear(tname); Printf(tname, "%s::%s", tprefix, name); features_get(features, tname, decl, ncdecl, node); } Clear(tname); Printf(tname, "%s::%s", prefix, name); features_get(features, tname, decl, ncdecl, node); Delete(tprefix); } } else { /* Lookup in the global namespace only */ Clear(tname); Printf(tname, "::%s", name); features_get(features, tname, decl, ncdecl, node); } Delete(tname); Delete(dname); } if (name && SwigType_istemplate(name)) { /* add features for complete template type */ String *dname = Swig_symbol_template_deftype(name, 0); if (!Equal(dname, name)) { Swig_features_get(features, prefix, dname, decl, node); } Delete(dname); } if (rname) Delete(rname); if (rdecl) Delete(rdecl); } /* ----------------------------------------------------------------------------- * Swig_feature_set() * * Sets a feature name and value. Also sets optional feature attributes as * passed in by featureattribs. Optional feature attributes are given a full name * concatenating the feature name plus ':' plus the attribute name. * ----------------------------------------------------------------------------- */ void Swig_feature_set(Hash *features, const_String_or_char_ptr name, SwigType *decl, const_String_or_char_ptr featurename, const_String_or_char_ptr value, Hash *featureattribs) { Hash *n; Hash *fhash; #ifdef SWIG_DEBUG Printf(stdout, "Swig_feature_set: '%s' '%s' '%s' '%s'\n", name, decl, featurename, value); #endif n = Getattr(features, name); if (!n) { n = NewHash(); Setattr(features, name, n); Delete(n); } if (!decl) { fhash = Getattr(n, "start"); if (!fhash) { fhash = NewHash(); Setattr(n, "start", fhash); Delete(fhash); } } else { fhash = Getattr(n, decl); if (!fhash) { String *cdecl_ = Copy(decl); fhash = NewHash(); Setattr(n, cdecl_, fhash); Delete(cdecl_); Delete(fhash); } } if (value) { Setattr(fhash, featurename, value); } else { Delattr(fhash, featurename); } { /* Add in the optional feature attributes */ Hash *attribs = featureattribs; while (attribs) { String *attribname = Getattr(attribs, "name"); String *featureattribname = NewStringf("%s:%s", featurename, attribname); if (value) { String *attribvalue = Getattr(attribs, "value"); Setattr(fhash, featureattribname, attribvalue); } else { Delattr(fhash, featureattribname); } attribs = nextSibling(attribs); Delete(featureattribname); } } if (name && SwigType_istemplate(name)) { String *dname = Swig_symbol_template_deftype(name, 0); if (Strcmp(dname, name)) { Swig_feature_set(features, dname, decl, featurename, value, featureattribs); } Delete(dname); } } /* ----------------------------------------------------------------------------- * The rename/namewarn engine * * Code below was in parser.y for a while * ----------------------------------------------------------------------------- */ static Hash *namewarn_hash = 0; static Hash *name_namewarn_hash() { if (!namewarn_hash) namewarn_hash = NewHash(); return namewarn_hash; } static Hash *rename_hash = 0; static Hash *name_rename_hash() { if (!rename_hash) rename_hash = NewHash(); return rename_hash; } static List *namewarn_list = 0; static List *name_namewarn_list() { if (!namewarn_list) namewarn_list = NewList(); return namewarn_list; } static List *rename_list = 0; static List *name_rename_list() { if (!rename_list) rename_list = NewList(); return rename_list; } /* ----------------------------------------------------------------------------- * int need_name_warning(Node *n) * * Detects if a node needs name warnings * * ----------------------------------------------------------------------------- */ static int need_name_warning(Node *n) { int need = 1; /* We don't use name warnings for: - class forwards, no symbol is generated at the target language. - template declarations, only for real instances using %template(name). - typedefs, have no effect at the target language. - using declarations and using directives, have no effect at the target language. */ if (checkAttribute(n, "nodeType", "classforward")) { need = 0; } else if (checkAttribute(n, "nodeType", "using")) { need = 0; } else if (checkAttribute(n, "storage", "typedef")) { need = 0; } else if (Getattr(n, "hidden")) { need = 0; } else if (Getattr(n, "ignore")) { need = 0; } else if (Getattr(n, "templatetype")) { need = 0; } else if (GetFlag(n, "parsing_template_declaration")) { need = 0; } return need; } /* ----------------------------------------------------------------------------- * int Swig_need_redefined_warn() * * Detects when a redefined object needs a warning * * ----------------------------------------------------------------------------- */ static int nodes_are_equivalent(Node *a, Node *b, int a_inclass) { /* they must have the same type */ String *ta = nodeType(a); String *tb = nodeType(b); if (!Equal(ta, tb)) { if (!(Equal(ta, "using") && Equal(tb, "cdecl"))) { return 0; } } if (Cmp(ta, "cdecl") == 0) { /* both cdecl case */ /* typedef */ String *a_storage = Getattr(a, "storage"); String *b_storage = Getattr(b, "storage"); if ((Cmp(a_storage, "typedef") == 0) || (Cmp(b_storage, "typedef") == 0)) { if (Cmp(a_storage, b_storage) == 0) { String *a_type = (Getattr(a, "type")); String *b_type = (Getattr(b, "type")); if (Cmp(a_type, b_type) == 0) return 1; } return 0; } /* static functions */ if (Swig_storage_isstatic(a) || Swig_storage_isstatic(b)) { if (Cmp(a_storage, b_storage) != 0) return 0; } /* friend methods */ if (!a_inclass || (Cmp(a_storage, "friend") == 0)) { /* check declaration */ String *a_decl = (Getattr(a, "decl")); String *b_decl = (Getattr(b, "decl")); if (Cmp(a_decl, b_decl) == 0) { /* check return type */ String *a_type = (Getattr(a, "type")); String *b_type = (Getattr(b, "type")); if (Cmp(a_type, b_type) == 0) { /* check parameters */ Parm *ap = (Getattr(a, "parms")); Parm *bp = (Getattr(b, "parms")); while (ap && bp) { SwigType *at = Getattr(ap, "type"); SwigType *bt = Getattr(bp, "type"); if (Cmp(at, bt) != 0) return 0; ap = nextSibling(ap); bp = nextSibling(bp); } if (ap || bp) { return 0; } else { Node *a_template = Getattr(a, "template"); Node *b_template = Getattr(b, "template"); /* Not equivalent if one is a template instantiation (via %template) and the other is a non-templated function */ if ((a_template && !b_template) || (!a_template && b_template)) return 0; } return 1; } } } } else if (Equal(ta, "using")) { /* using and cdecl case */ String *b_storage = Getattr(b, "storage"); if (Equal(b_storage, "typedef")) { String *a_name = Getattr(a, "name"); String *b_name = Getattr(b, "name"); if (Equal(a_name, b_name)) return 1; } } else { /* both %constant case */ String *a_storage = Getattr(a, "storage"); String *b_storage = Getattr(b, "storage"); if ((Cmp(a_storage, "%constant") == 0) || (Cmp(b_storage, "%constant") == 0)) { if (Cmp(a_storage, b_storage) == 0) { String *a_type = (Getattr(a, "type")); String *b_type = (Getattr(b, "type")); if ((Cmp(a_type, b_type) == 0) && (Cmp(Getattr(a, "value"), Getattr(b, "value")) == 0)) return 1; } return 0; } if (Equal(ta, "template") && Equal(tb, "template")) { if (Cmp(a_storage, "friend") == 0 || Cmp(b_storage, "friend") == 0) return 1; } } return 0; } int Swig_need_redefined_warn(Node *a, Node *b, int InClass) { String *a_name = Getattr(a, "name"); String *b_name = Getattr(b, "name"); String *a_symname = Getattr(a, "sym:name"); String *b_symname = Getattr(b, "sym:name"); /* always send a warning if a 'rename' is involved */ if ((a_symname && !Equal(a_symname, a_name)) || (b_symname && !Equal(b_symname, b_name))) { if (!Equal(a_name, b_name)) { return 1; } } return !nodes_are_equivalent(a, b, InClass); } /* ----------------------------------------------------------------------------- * int Swig_need_protected(Node* n) * * Detects when we need to fully register the protected member. * This is basically any protected members when the allprotected mode is set. * Otherwise we take just the protected virtual methods and non-static methods * (potentially virtual methods) as well as constructors/destructors. * Also any "using" statements in a class may potentially be virtual. * ----------------------------------------------------------------------------- */ int Swig_need_protected(Node *n) { String *nodetype = nodeType(n); if (checkAttribute(n, "access", "protected")) { if ((Equal(nodetype, "cdecl"))) { if (Swig_director_mode() && Swig_director_protected_mode() && Swig_all_protected_mode()) { return 1; } if (SwigType_isfunction(Getattr(n, "decl"))) { String *storage = Getattr(n, "storage"); /* The function is declared virtual, or it has no storage. This eliminates typedef, static etc. */ return !storage || Equal(storage, "virtual"); } } else if (Equal(nodetype, "constructor") || Equal(nodetype, "destructor")) { return 1; } else if (Equal(nodetype, "using") && !Getattr(n, "namespace")) { return 1; } } return 0; } /* ----------------------------------------------------------------------------- * void name_nameobj_add() * * Add nameobj (rename/namewarn) * * ----------------------------------------------------------------------------- */ static List *make_attrlist(const char *ckey) { List *list = NewList(); const char *cattr = strchr(ckey, '$'); if (cattr) { String *nattr; const char *rattr = strchr(++cattr, '$'); while (rattr) { nattr = NewStringWithSize(cattr, (int)(rattr - cattr)); Append(list, nattr); Delete(nattr); cattr = rattr + 1; rattr = strchr(cattr, '$'); } nattr = NewString(cattr); Append(list, nattr); Delete(nattr); } else { Append(list, "nodeType"); } return list; } static void name_object_attach_keys(const char *keys[], Hash *nameobj) { Node *kw = nextSibling(nameobj); List *matchlist = 0; while (kw) { Node *next = nextSibling(kw); String *kname = Getattr(kw, "name"); char *ckey = kname ? Char(kname) : 0; if (ckey) { const char **rkey; int isnotmatch = 0; int isregexmatch = 0; if ((strncmp(ckey, "match", 5) == 0) || (isnotmatch = (strncmp(ckey, "notmatch", 8) == 0)) || (isregexmatch = (strncmp(ckey, "regexmatch", 10) == 0)) || (isnotmatch = isregexmatch = (strncmp(ckey, "notregexmatch", 13) == 0))) { Hash *mi = NewHash(); List *attrlist = make_attrlist(ckey); if (!matchlist) matchlist = NewList(); Setattr(mi, "value", Getattr(kw, "value")); Setattr(mi, "attrlist", attrlist); if (isnotmatch) SetFlag(mi, "notmatch"); if (isregexmatch) SetFlag(mi, "regexmatch"); Delete(attrlist); Append(matchlist, mi); Delete(mi); removeNode(kw); } else { for (rkey = keys; *rkey != 0; ++rkey) { if (strcmp(ckey, *rkey) == 0) { Setattr(nameobj, *rkey, Getattr(kw, "value")); removeNode(kw); } } } } kw = next; } if (matchlist) { Setattr(nameobj, "matchlist", matchlist); Delete(matchlist); } } static void name_nameobj_add(Hash *name_hash, List *name_list, String *prefix, String *name, SwigType *decl, Hash *nameobj) { String *nname = 0; if (name && Len(name)) { String *target_fmt = Getattr(nameobj, "targetfmt"); nname = prefix ? NewStringf("%s::%s", prefix, name) : NewString(name); if (target_fmt) { String *tmp = NewStringf(target_fmt, nname); Delete(nname); nname = tmp; } } if (!nname || !Len(nname) || Getattr(nameobj, "fullname") || /* any of these options trigger a 'list' nameobj */ Getattr(nameobj, "sourcefmt") || Getattr(nameobj, "matchlist") || Getattr(nameobj, "regextarget")) { if (decl) Setattr(nameobj, "decl", decl); if (nname && Len(nname)) Setattr(nameobj, "targetname", nname); /* put the new nameobj at the beginning of the list, such that the last inserted rule take precedence */ Insert(name_list, 0, nameobj); } else { /* here we add an old 'hash' nameobj, simple and fast */ Swig_name_object_set(name_hash, nname, decl, nameobj); } Delete(nname); } /* ----------------------------------------------------------------------------- * int name_match_nameobj() * * Apply and check the nameobj's math list to the node * * ----------------------------------------------------------------------------- */ static DOH *get_lattr(Node *n, List *lattr) { DOH *res = 0; int ilen = Len(lattr); int i; for (i = 0; n && (i < ilen); ++i) { String *nattr = Getitem(lattr, i); res = Getattr(n, nattr); #ifdef SWIG_DEBUG if (!res) { Printf(stdout, "missing %s %s %s\n", nattr, Getattr(n, "name"), Getattr(n, "member")); } else { Printf(stdout, "lattr %d %s %s\n", i, nattr, DohIsString(res) ? res : Getattr(res, "name")); } #endif n = res; } return res; } #ifdef HAVE_PCRE #include static int name_regexmatch_value(Node *n, String *pattern, String *s) { pcre *compiled_pat; const char *err; int errpos; int rc; compiled_pat = pcre_compile(Char(pattern), 0, &err, &errpos, NULL); if (!compiled_pat) { Swig_error("SWIG", Getline(n), "Invalid regex \"%s\": compilation failed at %d: %s\n", Char(pattern), errpos, err); SWIG_exit(EXIT_FAILURE); } rc = pcre_exec(compiled_pat, NULL, Char(s), Len(s), 0, 0, NULL, 0); pcre_free(compiled_pat); if (rc == PCRE_ERROR_NOMATCH) return 0; if (rc < 0 ) { Swig_error("SWIG", Getline(n), "Matching \"%s\" against regex \"%s\" failed: %d\n", Char(s), Char(pattern), rc); SWIG_exit(EXIT_FAILURE); } return 1; } #else /* !HAVE_PCRE */ static int name_regexmatch_value(Node *n, String *pattern, String *s) { (void)pattern; (void)s; Swig_error("SWIG", Getline(n), "PCRE regex matching is not available in this SWIG build.\n"); SWIG_exit(EXIT_FAILURE); } #endif /* HAVE_PCRE/!HAVE_PCRE */ static int name_match_value(String *mvalue, String *value) { #if defined(SWIG_USE_SIMPLE_MATCHOR) int match = 0; char *cvalue = Char(value); char *cmvalue = Char(mvalue); char *sep = strchr(cmvalue, '|'); while (sep && !match) { match = strncmp(cvalue, cmvalue, sep - cmvalue) == 0; #ifdef SWIG_DEBUG Printf(stdout, "match_value: %s %s %d\n", cvalue, cmvalue, match); #endif cmvalue = sep + 1; sep = strchr(cmvalue, '|'); } if (!match) { match = strcmp(cvalue, cmvalue) == 0; #ifdef SWIG_DEBUG Printf(stdout, "match_value: %s %s %d\n", cvalue, cmvalue, match); #endif } return match; #else return Equal(mvalue, value); #endif } static int name_match_nameobj(Hash *rn, Node *n) { int match = 1; List *matchlist = Getattr(rn, "matchlist"); #ifdef SWIG_DEBUG Printf(stdout, "name_match_nameobj: %s\n", Getattr(n, "name")); #endif if (matchlist) { int ilen = Len(matchlist); int i; for (i = 0; match && (i < ilen); ++i) { Node *mi = Getitem(matchlist, i); List *lattr = Getattr(mi, "attrlist"); String *nval = get_lattr(n, lattr); int notmatch = GetFlag(mi, "notmatch"); int regexmatch = GetFlag(mi, "regexmatch"); match = 0; if (nval) { String *kwval = Getattr(mi, "value"); match = regexmatch ? name_regexmatch_value(n, kwval, nval) : name_match_value(kwval, nval); #ifdef SWIG_DEBUG Printf(stdout, "val %s %s %d %d \n", nval, kwval, match, ilen); #endif } if (notmatch) match = !match; } } #ifdef SWIG_DEBUG Printf(stdout, "name_match_nameobj: %d\n", match); #endif return match; } /* ----------------------------------------------------------------------------- * Hash *name_nameobj_lget() * * Get a nameobj (rename/namewarn) from the list of filters * * ----------------------------------------------------------------------------- */ static Hash *name_nameobj_lget(List *namelist, Node *n, String *prefix, String *name, String *decl) { Hash *res = 0; if (namelist) { int len = Len(namelist); int i; int match = 0; for (i = 0; !match && (i < len); i++) { Hash *rn = Getitem(namelist, i); String *rdecl = Getattr(rn, "decl"); if (rdecl && (!decl || !Equal(rdecl, decl))) { continue; } else if (name_match_nameobj(rn, n)) { String *tname = Getattr(rn, "targetname"); if (tname) { String *sfmt = Getattr(rn, "sourcefmt"); String *sname = 0; int fullname = GetFlag(rn, "fullname"); int regextarget = GetFlag(rn, "regextarget"); if (sfmt) { if (fullname && prefix) { String *pname = NewStringf("%s::%s", prefix, name); sname = NewStringf(sfmt, pname); Delete(pname); } else { sname = NewStringf(sfmt, name); } } else { if (fullname && prefix) { sname = NewStringf("%s::%s", prefix, name); } else { sname = name; DohIncref(name); } } match = regextarget ? name_regexmatch_value(n, tname, sname) : name_match_value(tname, sname); Delete(sname); } else { /* Applying the renaming rule may fail if it contains a %(regex)s expression that doesn't match the given name. */ String *sname = NewStringf(Getattr(rn, "name"), name); if (sname) { if (Len(sname)) match = 1; Delete(sname); } } } if (match) { res = rn; break; } } } return res; } /* ----------------------------------------------------------------------------- * Swig_name_namewarn_add * * Add a namewarn objects * * ----------------------------------------------------------------------------- */ void Swig_name_namewarn_add(String *prefix, String *name, SwigType *decl, Hash *namewrn) { const char *namewrn_keys[] = { "rename", "error", "fullname", "sourcefmt", "targetfmt", 0 }; name_object_attach_keys(namewrn_keys, namewrn); name_nameobj_add(name_namewarn_hash(), name_namewarn_list(), prefix, name, decl, namewrn); } /* ----------------------------------------------------------------------------- * Hash *name_namewarn_get() * * Return the namewarn object, if there is one. * * ----------------------------------------------------------------------------- */ static Hash *name_namewarn_get(Node *n, String *prefix, String *name, SwigType *decl) { if (!namewarn_hash && !namewarn_list) return 0; if (n) { /* Return in the obvious cases */ if (!name || !need_name_warning(n)) { return 0; } else { String *access = Getattr(n, "access"); int is_public = !access || Equal(access, "public"); if (!is_public && !Swig_need_protected(n)) { return 0; } } } if (name) { /* Check to see if the name is in the hash */ Hash *wrn = Swig_name_object_get(name_namewarn_hash(), prefix, name, decl); if (wrn && !name_match_nameobj(wrn, n)) wrn = 0; if (!wrn) { wrn = name_nameobj_lget(name_namewarn_list(), n, prefix, name, decl); } if (wrn && Getattr(wrn, "error")) { if (n) { Swig_error(Getfile(n), Getline(n), "%s\n", Getattr(wrn, "name")); } else { Swig_error(cparse_file, cparse_line, "%s\n", Getattr(wrn, "name")); } } return wrn; } else { return 0; } } /* ----------------------------------------------------------------------------- * String *Swig_name_warning() * * Return the name warning, if there is one. * * ----------------------------------------------------------------------------- */ String *Swig_name_warning(Node *n, String *prefix, String *name, SwigType *decl) { Hash *wrn = name_namewarn_get(n, prefix, name, decl); return (name && wrn) ? Getattr(wrn, "name") : 0; } /* ----------------------------------------------------------------------------- * Swig_name_rename_add() * * Manage the rename objects * * ----------------------------------------------------------------------------- */ static void single_rename_add(String *prefix, String *name, SwigType *decl, Hash *newname) { name_nameobj_add(name_rename_hash(), name_rename_list(), prefix, name, decl, newname); } /* Add a new rename. Works much like new_feature including default argument handling. */ void Swig_name_rename_add(String *prefix, String *name, SwigType *decl, Hash *newname, ParmList *declaratorparms) { ParmList *declparms = declaratorparms; const char *rename_keys[] = { "fullname", "sourcefmt", "targetfmt", "continue", "regextarget", 0 }; name_object_attach_keys(rename_keys, newname); /* Add the name */ single_rename_add(prefix, name, decl, newname); /* Add extra names if there are default parameters in the parameter list */ if (decl) { int constqualifier = SwigType_isconst(decl); while (declparms) { if (ParmList_has_defaultargs(declparms)) { /* Create a parameter list for the new rename by copying all but the last (defaulted) parameter */ ParmList *newparms = CopyParmListMax(declparms,ParmList_len(declparms)-1); /* Create new declaration - with the last parameter removed */ SwigType *newdecl = Copy(decl); Delete(SwigType_pop_function(newdecl)); /* remove the old parameter list from newdecl */ SwigType_add_function(newdecl, newparms); if (constqualifier) SwigType_add_qualifier(newdecl, "const"); single_rename_add(prefix, name, newdecl, newname); declparms = newparms; Delete(newdecl); } else { declparms = 0; } } } } /* Create a name for the given node applying rename/namewarn if needed */ static String *apply_rename(Node* n, String *newname, int fullname, String *prefix, String *name) { String *result = 0; if (newname && Len(newname)) { if (Strcmp(newname, "$ignore") == 0) { /* $ignore doesn't apply to parameters and while it's rare to explicitly write %ignore directives for them they could be caught by a wildcard ignore using regex match, just ignore the attempt to ignore them in this case */ if (!Equal(nodeType(n), "parm")) result = Copy(newname); } else { char *cnewname = Char(newname); if (cnewname) { int destructor = name && (*(Char(name)) == '~'); String *fmt = newname; /* use name as a fmt, but avoid C++ "%" and "%=" operators */ if (Len(newname) > 1 && strchr(cnewname, '%') && !(strcmp(cnewname, "%=") == 0)) { if (fullname && prefix) { result = NewStringf(fmt, prefix, name); } else { result = NewStringf(fmt, name); } } else { result = Copy(newname); } if (destructor && result && (*(Char(result)) != '~')) { Insert(result, 0, "~"); } } } } return result; } /* ----------------------------------------------------------------------------- * String *Swig_name_make() * * Make a name after applying all the rename/namewarn objects * * ----------------------------------------------------------------------------- */ String *Swig_name_make(Node *n, String *prefix, const_String_or_char_ptr cname, SwigType *decl, String *oldname) { String *nname = 0; String *result = 0; String *name = NewString(cname); Hash *wrn = 0; String *rdecl = 0; String *rname = 0; /* very specific hack for template constructors/destructors */ #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_make: looking for %s %s %s %s\n", prefix, name, decl, oldname); #endif if (name && n && SwigType_istemplate(name)) { String *nodetype = nodeType(n); if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) { String *nprefix = 0; String *nlast = 0; String *tprefix; Swig_scopename_split(name, &nprefix, &nlast); tprefix = SwigType_templateprefix(nlast); Delete(nlast); if (Len(nprefix)) { Append(nprefix, "::"); Append(nprefix, tprefix); Delete(tprefix); rname = nprefix; } else { rname = tprefix; Delete(nprefix); } rdecl = Copy(decl); Replaceall(rdecl, name, rname); #ifdef SWIG_DEBUG Printf(stdout, "SWIG_name_make: use new name %s %s : %s %s\n", name, decl, rname, rdecl); #endif decl = rdecl; Delete(name); name = rname; } } if (rename_hash || rename_list || namewarn_hash || namewarn_list) { Hash *rn = Swig_name_object_get(name_rename_hash(), prefix, name, decl); if (!rn || !name_match_nameobj(rn, n)) { rn = name_nameobj_lget(name_rename_list(), n, prefix, name, decl); if (rn) { String *sfmt = Getattr(rn, "sourcefmt"); int fullname = GetFlag(rn, "fullname"); if (fullname && prefix) { String *sname = NewStringf("%s::%s", prefix, name); Delete(name); name = sname; prefix = 0; } if (sfmt) { String *sname = NewStringf(sfmt, name); Delete(name); name = sname; } } } if (rn) { String *newname = Getattr(rn, "name"); int fullname = GetFlag(rn, "fullname"); result = apply_rename(n, newname, fullname, prefix, name); } if (result && !Equal(result, name)) { /* operators in C++ allow aliases, we look for them */ char *cresult = Char(result); if (cresult && (strncmp(cresult, "operator ", 9) == 0)) { String *nresult = Swig_name_make(n, prefix, result, decl, oldname); if (!Equal(nresult, result)) { Delete(result); result = nresult; } else { Delete(nresult); } } } nname = result ? result : name; wrn = name_namewarn_get(n, prefix, nname, decl); if (wrn) { String *rename = Getattr(wrn, "rename"); if (rename) { String *msg = Getattr(wrn, "name"); int fullname = GetFlag(wrn, "fullname"); if (result) Delete(result); result = apply_rename(n, rename, fullname, prefix, name); if ((msg) && (Len(msg))) { if (!Getmeta(nname, "already_warned")) { if (n) { /* Parameter renaming is not fully implemented. Mainly because there is no C/C++ syntax to * for %rename to fully qualify a function's parameter name from outside the function. Hence it * is not possible to implemented targetted warning suppression on one parameter in one function. */ int suppress_parameter_rename_warning = Equal(nodeType(n), "parm"); if (!suppress_parameter_rename_warning) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0, Getfile(n), Getline(n), "%s\n", msg); SWIG_WARN_NODE_END(n); } } else { Swig_warning(0, Getfile(name), Getline(name), "%s\n", msg); } Setmeta(nname, "already_warned", "1"); } } } } } if (!result || !Len(result)) { if (result) Delete(result); if (oldname) { result = NewString(oldname); } else { result = NewString(cname); } } Delete(name); #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_make: result '%s' '%s'\n", cname, result); #endif return result; } /* ----------------------------------------------------------------------------- * void Swig_name_inherit() * * Inherit namewarn, rename, and feature objects * * ----------------------------------------------------------------------------- */ void Swig_name_inherit(String *base, String *derived) { /* Printf(stdout,"base = '%s', derived = '%s'\n", base, derived); */ Swig_name_object_inherit(name_rename_hash(), base, derived); Swig_name_object_inherit(name_namewarn_hash(), base, derived); Swig_name_object_inherit(Swig_cparse_features(), base, derived); } /* ----------------------------------------------------------------------------- * Swig_inherit_base_symbols() * ----------------------------------------------------------------------------- */ void Swig_inherit_base_symbols(List *bases) { if (bases) { Iterator s; for (s = First(bases); s.item; s = Next(s)) { Symtab *st = Getattr(s.item, "symtab"); if (st) { Setfile(st, Getfile(s.item)); Setline(st, Getline(s.item)); Swig_symbol_inherit(st); } } Delete(bases); } } /* ----------------------------------------------------------------------------- * Swig_make_inherit_list() * ----------------------------------------------------------------------------- */ List *Swig_make_inherit_list(String *clsname, List *names, String *Namespaceprefix) { int i, ilen; String *derived; List *bases = NewList(); if (Namespaceprefix) derived = NewStringf("%s::%s", Namespaceprefix, clsname); else derived = NewString(clsname); ilen = Len(names); for (i = 0; i < ilen; i++) { String *base; String *n = Getitem(names, i); /* Try to figure out where this symbol is */ Node *s = Swig_symbol_clookup(n, 0); if (s) { while (s && (Strcmp(nodeType(s), "class") != 0)) { /* Not a class. Could be a typedef though. */ String *storage = Getattr(s, "storage"); if (storage && (Strcmp(storage, "typedef") == 0)) { String *nn = Getattr(s, "type"); s = Swig_symbol_clookup(nn, Getattr(s, "sym:symtab")); } else { break; } } if (s && ((Strcmp(nodeType(s), "class") == 0) || (Strcmp(nodeType(s), "template") == 0))) { String *q = Swig_symbol_qualified(s); Append(bases, s); if (q) { base = NewStringf("%s::%s", q, Getattr(s, "name")); Delete(q); } else { base = NewString(Getattr(s, "name")); } } else { base = NewString(n); } } else { base = NewString(n); } if (base) { Swig_name_inherit(base, derived); Delete(base); } } return bases; } /* ----------------------------------------------------------------------------- * void Swig_name_str() * * Return a stringified version of a C/C++ symbol from a node. * The node passed in is expected to be a function, constructor, destructor or * variable. Some example return values: * "MyNameSpace::MyTemplate::~MyTemplate" * "MyNameSpace::ABC::ABC" * "MyNameSpace::ABC::constmethod" * "MyNameSpace::ABC::variablename" * * ----------------------------------------------------------------------------- */ String *Swig_name_str(Node *n) { String *qname; String *qualifier = Swig_symbol_qualified(n); String *name = Swig_scopename_last(Getattr(n, "name")); if (qualifier) qualifier = SwigType_namestr(qualifier); /* Very specific hack for template constructors/destructors */ if (SwigType_istemplate(name)) { String *nodetype = nodeType(n); if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) { String *nprefix = 0; String *nlast = 0; String *tprefix; Swig_scopename_split(name, &nprefix, &nlast); tprefix = SwigType_templateprefix(nlast); Delete(nlast); Delete(nprefix); Delete(name); name = tprefix; } } qname = NewString(""); if (qualifier && Len(qualifier) > 0) Printf(qname, "%s::", qualifier); Printf(qname, "%s", SwigType_str(name, 0)); Delete(name); Delete(qualifier); return qname; } /* ----------------------------------------------------------------------------- * void Swig_name_decl() * * Return a stringified version of a C/C++ declaration without the return type. * The node passed in is expected to be a function, constructor, destructor or * variable. Some example return values: * "MyNameSpace::MyTemplate::~MyTemplate()" * "MyNameSpace::ABC::ABC(int,double)" * "MyNameSpace::ABC::constmethod(int) const" * "MyNameSpace::ABC::refqualifiermethod(int) const &" * "MyNameSpace::ABC::variablename" * * ----------------------------------------------------------------------------- */ String *Swig_name_decl(Node *n) { String *qname; String *decl; qname = Swig_name_str(n); decl = NewStringf("%s", qname); if (!checkAttribute(n, "kind", "variable")) { String *d = Getattr(n, "decl"); Printv(decl, "(", ParmList_errorstr(Getattr(n, "parms")), ")", NIL); if (SwigType_isfunction(d)) { SwigType *decl_temp = Copy(d); SwigType *qualifiers = SwigType_pop_function_qualifiers(decl_temp); if (qualifiers) { String *qualifiers_string = SwigType_str(qualifiers, 0); Printv(decl, " ", qualifiers_string, NIL); Delete(qualifiers_string); } Delete(decl_temp); } } Delete(qname); return decl; } /* ----------------------------------------------------------------------------- * void Swig_name_fulldecl() * * Return a stringified version of a C/C++ declaration including the return type. * The node passed in is expected to be a function, constructor or destructor. * Some example return values: * "MyNameSpace::MyTemplate::~MyTemplate()" * "MyNameSpace::ABC::ABC(int,double)" * "int * MyNameSpace::ABC::constmethod(int) const" * * ----------------------------------------------------------------------------- */ String *Swig_name_fulldecl(Node *n) { String *decl = Swig_name_decl(n); String *type = Getattr(n, "type"); String *nodetype = nodeType(n); String *fulldecl; /* add on the return type */ if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) { fulldecl = decl; } else { String *t = SwigType_str(type, 0); fulldecl = NewStringf("%s %s", t, decl); Delete(decl); Delete(t); } return fulldecl; } swig-4.0.2/Source/Swig/getopt.c0000644000175000017500000000675613667507523016217 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * getopt.c * * Handles the parsing of command line options. This is particularly nasty * compared to other utilities given that command line options can potentially * be read by many different modules within SWIG. Thus, in order to make sure * there are no unrecognized options, each module is required to "mark" * the options that it uses. Afterwards, we can make a quick scan to make * sure there are no unmarked options. * * TODO: * Should have cleaner error handling in general. * ----------------------------------------------------------------------------- */ #include "swig.h" static char **args; static int numargs; static int *marked; /* ----------------------------------------------------------------------------- * Swig_init_args() * * Initialize the argument list handler. * ----------------------------------------------------------------------------- */ void Swig_init_args(int argc, char **argv) { int i; assert(argc > 0); assert(argv); numargs = argc; args = argv; marked = (int *) malloc(numargs * sizeof(int)); for (i = 0; i < argc; i++) { marked[i] = 0; } marked[0] = 1; } /* ----------------------------------------------------------------------------- * Swig_mark_arg() * * Marks an argument as being parsed. * ----------------------------------------------------------------------------- */ void Swig_mark_arg(int n) { assert(marked); assert((n >= 0) && (n < numargs)); marked[n] = 1; } /* ----------------------------------------------------------------------------- * Swig_check_marked() * * Checks to see if argument has been picked up. * ----------------------------------------------------------------------------- */ int Swig_check_marked(int n) { assert((n >= 0) && (n < numargs)); return marked[n]; } /* ----------------------------------------------------------------------------- * Swig_check_options() * * Checkers for unprocessed command line options and errors. * ----------------------------------------------------------------------------- */ void Swig_check_options(int check_input) { int error = 0; int i; int max = check_input ? numargs - 1 : numargs; assert(marked); for (i = 1; i < max; i++) { if (!marked[i]) { Printf(stderr, "swig error : Unrecognized option %s\n", args[i]); error = 1; } } if (error) { Printf(stderr, "Use 'swig -help' for available options.\n"); SWIG_exit(EXIT_FAILURE); } if (check_input && marked[numargs - 1]) { Printf(stderr, "Must specify an input file. Use -help for available options.\n"); SWIG_exit(EXIT_FAILURE); } } /* ----------------------------------------------------------------------------- * Swig_arg_error() * * Generates a generic error message and exits. * ----------------------------------------------------------------------------- */ void Swig_arg_error(void) { Printf(stderr, "SWIG : Unable to parse command line options.\n"); Printf(stderr, "Use 'swig -help' for available options.\n"); SWIG_exit(EXIT_FAILURE); } swig-4.0.2/Source/Swig/misc.c0000644000175000017500000012135613667507523015642 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * misc.c * * Miscellaneous functions that don't really fit anywhere else. * ----------------------------------------------------------------------------- */ #include "swig.h" #include #include #include #include #include #ifdef _WIN32 #include #ifndef S_ISDIR #define S_ISDIR(mode) (((mode) & S_IFDIR) == S_IFDIR) #endif #endif static char *fake_version = 0; /* ----------------------------------------------------------------------------- * Swig_copy_string() * * Duplicate a NULL-terminate string given as a char *. * ----------------------------------------------------------------------------- */ char *Swig_copy_string(const char *s) { char *c = 0; if (s) { c = (char *) malloc(strlen(s) + 1); strcpy(c, s); } return c; } /* ----------------------------------------------------------------------------- * Swig_set_fakeversion() * * Version string override * ----------------------------------------------------------------------------- */ void Swig_set_fakeversion(const char *version) { fake_version = Swig_copy_string(version); } /* ----------------------------------------------------------------------------- * Swig_package_version() * * Return the package string containing the version number * ----------------------------------------------------------------------------- */ const char *Swig_package_version(void) { return fake_version ? fake_version : PACKAGE_VERSION; } /* ----------------------------------------------------------------------------- * Swig_banner() * * Emits the SWIG identifying banner for the C/C++ wrapper file. * ----------------------------------------------------------------------------- */ void Swig_banner(File *f) { Printf(f, "/* ----------------------------------------------------------------------------\n\ * This file was automatically generated by SWIG (http://www.swig.org).\n\ * Version %s\n\ *\n\ * This file is not intended to be easily readable and contains a number of\n\ * coding conventions designed to improve portability and efficiency. Do not make\n\ * changes to this file unless you know what you are doing--modify the SWIG\n\ * interface file instead.\n", Swig_package_version()); /* String too long for ISO compliance */ Printf(f, " * ----------------------------------------------------------------------------- */\n"); } /* ----------------------------------------------------------------------------- * Swig_banner_target_lang() * * Emits a SWIG identifying banner in the target language * ----------------------------------------------------------------------------- */ void Swig_banner_target_lang(File *f, const_String_or_char_ptr commentchar) { Printf(f, "%s This file was automatically generated by SWIG (http://www.swig.org).\n", commentchar); Printf(f, "%s Version %s\n", commentchar, Swig_package_version()); Printf(f, "%s\n", commentchar); Printf(f, "%s Do not make changes to this file unless you know what you are doing--modify\n", commentchar); Printf(f, "%s the SWIG interface file instead.\n", commentchar); } /* ----------------------------------------------------------------------------- * Swig_strip_c_comments() * * Return a new string with C comments stripped from the input string. NULL is * returned if there aren't any comments. * ----------------------------------------------------------------------------- */ String *Swig_strip_c_comments(const String *s) { const char *c = Char(s); const char *comment_begin = 0; const char *comment_end = 0; String *stripped = 0; while (*c) { if (!comment_begin && *c == '/') { ++c; if (!*c) break; if (*c == '*') comment_begin = c-1; } else if (comment_begin && !comment_end && *c == '*') { ++c; if (*c == '/') { comment_end = c; break; } } ++c; } if (comment_begin && comment_end) { int size = (int)(comment_begin - Char(s)); String *stripmore = 0; stripped = NewStringWithSize(s, size); Printv(stripped, comment_end + 1, NIL); do { stripmore = Swig_strip_c_comments(stripped); if (stripmore) { Delete(stripped); stripped = stripmore; } } while (stripmore); } return stripped; } /* ----------------------------------------------------------------------------- * is_directory() * ----------------------------------------------------------------------------- */ static int is_directory(String *directory) { int last = Len(directory) - 1; int statres; struct stat st; char *dir = Char(directory); if (dir[last] == SWIG_FILE_DELIMITER[0]) { /* remove trailing slash - can cause S_ISDIR to fail on Windows, at least */ dir[last] = 0; statres = stat(dir, &st); dir[last] = SWIG_FILE_DELIMITER[0]; } else { statres = stat(dir, &st); } return (statres == 0 && S_ISDIR(st.st_mode)); } /* ----------------------------------------------------------------------------- * Swig_new_subdirectory() * * Create the subdirectory only if the basedirectory already exists as a directory. * basedirectory can be empty to indicate current directory but not NULL. * ----------------------------------------------------------------------------- */ String *Swig_new_subdirectory(String *basedirectory, String *subdirectory) { String *error = 0; int current_directory = Len(basedirectory) == 0; if (current_directory || is_directory(basedirectory)) { Iterator it; String *dir = NewString(basedirectory); List *subdirs = Split(subdirectory, SWIG_FILE_DELIMITER[0], INT_MAX); for (it = First(subdirs); it.item; it = Next(it)) { int result; String *subdirectory = it.item; Printf(dir, "%s", subdirectory); #ifdef _WIN32 result = _mkdir(Char(dir)); #else result = mkdir(Char(dir), 0777); #endif if (result != 0 && errno != EEXIST) { error = NewStringf("Cannot create directory %s: %s", dir, strerror(errno)); break; } if (!is_directory(dir)) { error = NewStringf("Cannot create directory %s: it may already exist but not be a directory", dir); break; } Printf(dir, SWIG_FILE_DELIMITER); } } else { error = NewStringf("Cannot create subdirectory %s under the base directory %s. Either the base does not exist as a directory or it is not readable.", subdirectory, basedirectory); } return error; } /* ----------------------------------------------------------------------------- * Swig_filename_correct() * * Corrects filename paths by removing duplicate delimiters and on non-unix * systems use the correct delimiter across the whole name. * ----------------------------------------------------------------------------- */ void Swig_filename_correct(String *filename) { int network_path = 0; if (Len(filename) >= 2) { const char *fname = Char(filename); if (fname[0] == '\\' && fname[1] == '\\') network_path = 1; if (fname[0] == '/' && fname[1] == '/') network_path = 1; } #if defined(_WIN32) || defined(MACSWIG) /* accept Unix path separator on non-Unix systems */ Replaceall(filename, "/", SWIG_FILE_DELIMITER); #endif #if defined(__CYGWIN__) /* accept Windows path separator in addition to Unix path separator */ Replaceall(filename, "\\", SWIG_FILE_DELIMITER); #endif /* remove all duplicate file name delimiters */ while (Replaceall(filename, SWIG_FILE_DELIMITER SWIG_FILE_DELIMITER, SWIG_FILE_DELIMITER)) { } /* Network paths can start with a double slash on Windows - unremove the duplicate slash we just removed */ if (network_path) Insert(filename, 0, SWIG_FILE_DELIMITER); } /* ----------------------------------------------------------------------------- * Swig_filename_escape() * * Escapes backslashes in filename - for Windows * ----------------------------------------------------------------------------- */ String *Swig_filename_escape(String *filename) { String *adjusted_filename = Copy(filename); Swig_filename_correct(adjusted_filename); #if defined(_WIN32) /* Note not on Cygwin else filename is displayed with double '/' */ Replaceall(adjusted_filename, "\\", "\\\\"); #endif return adjusted_filename; } /* ----------------------------------------------------------------------------- * Swig_filename_escape() * * Escapes spaces in filename - for Makefiles * ----------------------------------------------------------------------------- */ String *Swig_filename_escape_space(String *filename) { String *adjusted_filename = Copy(filename); Swig_filename_correct(adjusted_filename); Replaceall(adjusted_filename, " ", "\\ "); return adjusted_filename; } /* ----------------------------------------------------------------------------- * Swig_filename_unescape() * * Remove double backslash escaping in filename - for Windows * ----------------------------------------------------------------------------- */ void Swig_filename_unescape(String *filename) { (void)filename; #if defined(_WIN32) Replaceall(filename, "\\\\", "\\"); #endif } /* ----------------------------------------------------------------------------- * Swig_storage_isextern() * * Determine if the storage class specifier is extern (but not externc) * ----------------------------------------------------------------------------- */ int Swig_storage_isextern(Node *n) { const String *storage = Getattr(n, "storage"); return storage ? Strcmp(storage, "extern") == 0 || Strncmp(storage, "extern ", 7) == 0 : 0; } /* ----------------------------------------------------------------------------- * Swig_storage_isexternc() * * Determine if the storage class specifier is externc (but not plain extern) * ----------------------------------------------------------------------------- */ int Swig_storage_isexternc(Node *n) { const String *storage = Getattr(n, "storage"); return storage ? Strcmp(storage, "externc") == 0 || Strncmp(storage, "externc ", 8) == 0 : 0; } /* ----------------------------------------------------------------------------- * Swig_storage_isstatic_custom() * * Determine if the storage class specifier is static * ----------------------------------------------------------------------------- */ int Swig_storage_isstatic_custom(Node *n, const_String_or_char_ptr storage_name) { const String *storage = Getattr(n, storage_name); return storage ? Strncmp(storage, "static", 6) == 0 : 0; } /* ----------------------------------------------------------------------------- * Swig_storage_isstatic() * * Determine if the storage class specifier is static * ----------------------------------------------------------------------------- */ int Swig_storage_isstatic(Node *n) { return Swig_storage_isstatic_custom(n, "storage"); } /* ----------------------------------------------------------------------------- * Swig_string_escape() * * Takes a string object and produces a string with escape codes added to it. * Octal escaping is used. * ----------------------------------------------------------------------------- */ String *Swig_string_escape(String *s) { String *ns; int c; ns = NewStringEmpty(); while ((c = Getc(s)) != EOF) { if (c == '\n') { Printf(ns, "\\n"); } else if (c == '\r') { Printf(ns, "\\r"); } else if (c == '\t') { Printf(ns, "\\t"); } else if (c == '\\') { Printf(ns, "\\\\"); } else if (c == '\'') { Printf(ns, "\\'"); } else if (c == '\"') { Printf(ns, "\\\""); } else if (c == ' ') { Putc(c, ns); } else if (!isgraph(c)) { if (c < 0) c += UCHAR_MAX + 1; Printf(ns, "\\%o", c); } else { Putc(c, ns); } } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_hexescape() * * Takes a string object and produces a string with escape codes added to it. * Hex escaping is used. * ----------------------------------------------------------------------------- */ String *Swig_string_hexescape(String *s) { String *ns; int c; ns = NewStringEmpty(); while ((c = Getc(s)) != EOF) { if (c == '\n') { Printf(ns, "\\n"); } else if (c == '\r') { Printf(ns, "\\r"); } else if (c == '\t') { Printf(ns, "\\t"); } else if (c == '\\') { Printf(ns, "\\\\"); } else if (c == '\'') { Printf(ns, "\\'"); } else if (c == '\"') { Printf(ns, "\\\""); } else if (c == ' ') { Putc(c, ns); } else if (!isgraph(c)) { if (c < 0) c += UCHAR_MAX + 1; Printf(ns, "\\x%X", c); } else { Putc(c, ns); } } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_upper() * * Takes a string object and returns a copy that is uppercase * ----------------------------------------------------------------------------- */ String *Swig_string_upper(String *s) { String *ns; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { Putc(toupper(c), ns); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_lower() * * Takes a string object and returns a copy that is lowercase * ----------------------------------------------------------------------------- */ String *Swig_string_lower(String *s) { String *ns; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { Putc(tolower(c), ns); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_title() * * Takes a string object and returns a copy that is lowercase with first letter * capitalized * ----------------------------------------------------------------------------- */ String *Swig_string_title(String *s) { String *ns; int first = 1; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { Putc(first ? toupper(c) : tolower(c), ns); first = 0; } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_ccase() * * Takes a string object and returns a copy that is lowercase with the first * letter capitalized and the one following '_', which are removed. * * camel_case -> CamelCase * camelCase -> CamelCase * ----------------------------------------------------------------------------- */ String *Swig_string_ccase(String *s) { String *ns; int first = 1; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { if (c == '_') { first = 1; continue; } Putc(first ? toupper(c) : c, ns); first = 0; } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_lccase() * * Takes a string object and returns a copy with the character after * each '_' capitalised, and the '_' removed. The first character is * also forced to lowercase. * * camel_case -> camelCase * CamelCase -> camelCase * ----------------------------------------------------------------------------- */ String *Swig_string_lccase(String *s) { String *ns; int first = 1; int after_underscore = 0; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { if (c == '_') { after_underscore = 1; continue; } if (first) { Putc(tolower(c), ns); first = 0; } else { Putc(after_underscore ? toupper(c) : c, ns); } after_underscore = 0; } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_ucase() * * This is the reverse case of ccase, ie * * CamelCase -> camel_case * get2D -> get_2d * asFloat2 -> as_float2 * ----------------------------------------------------------------------------- */ String *Swig_string_ucase(String *s) { String *ns; int c; int lastC = 0; int nextC = 0; int underscore = 0; ns = NewStringEmpty(); /* We insert a underscore when: 1. Lower case char followed by upper case char getFoo > get_foo; getFOo > get_foo; GETFOO > getfoo 2. Number preceded by char and not end of string get2D > get_2d; get22D > get_22d; GET2D > get_2d but: asFloat2 > as_float2 */ Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { nextC = Getc(s); Ungetc(nextC, s); if (isdigit(c) && isalpha(lastC) && nextC != EOF) underscore = 1; else if (isupper(c) && isalpha(lastC) && !isupper(lastC)) underscore = 1; lastC = c; if (underscore) { Putc('_', ns); underscore = 0; } Putc(tolower(c), ns); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_first_upper() * * Make the first character in the string uppercase, leave all the * rest the same. This is used by the Ruby module to provide backwards * compatibility with the old way of naming classes and constants. For * more info see the Ruby documentation. * * firstUpper -> FirstUpper * ----------------------------------------------------------------------------- */ String *Swig_string_first_upper(String *s) { String *ns = NewStringEmpty(); char *cs = Char(s); if (cs && cs[0] != 0) { Putc(toupper((int)cs[0]), ns); Append(ns, cs + 1); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_first_lower() * * Make the first character in the string lowercase, leave all the * rest the same. This is used by the Ruby module to provide backwards * compatibility with the old way of naming classes and constants. For * more info see the Ruby documentation. * * firstLower -> FirstLower * ----------------------------------------------------------------------------- */ String *Swig_string_first_lower(String *s) { String *ns = NewStringEmpty(); char *cs = Char(s); if (cs && cs[0] != 0) { Putc(tolower((int)cs[0]), ns); Append(ns, cs + 1); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_schemify() * * Replace underscores with dashes, to make identifiers look nice to Schemers. * * under_scores -> under-scores * ----------------------------------------------------------------------------- */ String *Swig_string_schemify(String *s) { String *ns = NewString(s); Replaceall(ns, "_", "-"); return ns; } /* ----------------------------------------------------------------------------- * Swig_string_typecode() * * Takes a string with possible type-escapes in it and replaces them with * real C datatypes. * ----------------------------------------------------------------------------- */ String *Swig_string_typecode(String *s) { String *ns; int c; String *tc; ns = NewStringEmpty(); while ((c = Getc(s)) != EOF) { if (c == '`') { String *str = 0; tc = NewStringEmpty(); while ((c = Getc(s)) != EOF) { if (c == '`') break; Putc(c, tc); } str = SwigType_str(tc, 0); Append(ns, str); Delete(str); } else { Putc(c, ns); if (c == '\'') { while ((c = Getc(s)) != EOF) { Putc(c, ns); if (c == '\'') break; if (c == '\\') { c = Getc(s); Putc(c, ns); } } } else if (c == '\"') { while ((c = Getc(s)) != EOF) { Putc(c, ns); if (c == '\"') break; if (c == '\\') { c = Getc(s); Putc(c, ns); } } } } } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_mangle() * * Take a string and mangle it by stripping all non-valid C identifier * characters. * * This routine skips unnecessary blank spaces, therefore mangling * 'char *' and 'char*', 'std::pair' and * 'std::pair', produce the same result. * * However, note that 'long long' and 'long_long' produce different * mangled strings. * * The mangling method still is not 'perfect', for example std::pair and * std_pair return the same mangling. This is just a little better * than before, but it seems to be enough for most of the purposes. * * Having a perfect mangling will break some examples and code which * assume, for example, that A::get_value will be mangled as * A_get_value. * ----------------------------------------------------------------------------- */ String *Swig_string_mangle(const String *s) { #if 0 /* old mangling, not suitable for using in macros */ String *t = Copy(s); char *c = Char(t); while (*c) { if (!isalnum(*c)) *c = '_'; c++; } return t; #else String *result = NewStringEmpty(); int space = 0; int state = 0; char *pc, *cb; String *b = Copy(s); if (SwigType_istemplate(b)) { String *st = Swig_symbol_template_deftype(b, 0); String *sq = Swig_symbol_type_qualify(st, 0); String *t = SwigType_namestr(sq); Delete(st); Delete(sq); Delete(b); b = t; } pc = cb = Char(b); while (*pc) { char c = *pc; if (isalnum((int) c) || (c == '_')) { state = 1; if (space && (space == state)) { Append(result, "_SS_"); } space = 0; Printf(result, "%c", (int) c); } else { if (isspace((int) c)) { space = state; ++pc; continue; } else { state = 3; space = 0; } switch (c) { case '.': if ((cb != pc) && (*(pc - 1) == 'p')) { Append(result, "_"); ++pc; continue; } else { c = 'f'; } break; case ':': if (*(pc + 1) == ':') { Append(result, "_"); ++pc; ++pc; continue; } break; case '*': c = 'm'; break; case '&': c = 'A'; break; case '<': c = 'l'; break; case '>': c = 'g'; break; case '=': c = 'e'; break; case ',': c = 'c'; break; case '(': c = 'p'; break; case ')': c = 'P'; break; case '[': c = 'b'; break; case ']': c = 'B'; break; case '^': c = 'x'; break; case '|': c = 'o'; break; case '~': c = 'n'; break; case '!': c = 'N'; break; case '%': c = 'M'; break; case '?': c = 'q'; break; case '+': c = 'a'; break; case '-': c = 's'; break; case '/': c = 'd'; break; default: break; } if (isalpha((int) c)) { Printf(result, "_S%c_", (int) c); } else { Printf(result, "_S%02X_", (int) c); } } ++pc; } Delete(b); return result; #endif } String *Swig_string_emangle(String *s) { return Swig_string_mangle(s); } /* ----------------------------------------------------------------------------- * Swig_scopename_split() * * Take a qualified name like "A::B::C" and splits off the last name. * In this case, returns "C" as last and "A::B" as prefix. * Always returns non NULL for last, but prefix may be NULL if there is no prefix. * ----------------------------------------------------------------------------- */ void Swig_scopename_split(const String *s, String **rprefix, String **rlast) { char *tmp = Char(s); char *c = tmp; char *cc = c; char *co = 0; if (!strstr(c, "::")) { *rprefix = 0; *rlast = Copy(s); } co = strstr(cc, "operator "); if (co) { if (co == cc) { *rprefix = 0; *rlast = Copy(s); return; } else { *rprefix = NewStringWithSize(cc, (int)(co - cc - 2)); *rlast = NewString(co); return; } } while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { cc = c; c += 2; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } if (cc != tmp) { *rprefix = NewStringWithSize(tmp, (int)(cc - tmp)); *rlast = NewString(cc + 2); return; } else { *rprefix = 0; *rlast = Copy(s); } } /* ----------------------------------------------------------------------------- * Swig_scopename_prefix() * * Take a qualified name like "A::B::C" and return the scope name. * In this case, "A::B". Returns NULL if there is no base. * ----------------------------------------------------------------------------- */ String *Swig_scopename_prefix(const String *s) { char *tmp = Char(s); char *c = tmp; char *cc = c; char *co = 0; if (!strstr(c, "::")) return 0; co = strstr(cc, "operator "); if (co) { if (co == cc) { return 0; } else { String *prefix = NewStringWithSize(cc, (int)(co - cc - 2)); return prefix; } } while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { cc = c; c += 2; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } if (cc != tmp) { return NewStringWithSize(tmp, (int)(cc - tmp)); } else { return 0; } } /* ----------------------------------------------------------------------------- * Swig_scopename_last() * * Take a qualified name like "A::B::C" and returns the last. In this * case, "C". * ----------------------------------------------------------------------------- */ String *Swig_scopename_last(const String *s) { char *tmp = Char(s); char *c = tmp; char *cc = c; char *co = 0; if (!strstr(c, "::")) return NewString(s); co = strstr(cc, "operator "); if (co) { return NewString(co); } while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { c += 2; cc = c; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } return NewString(cc); } /* ----------------------------------------------------------------------------- * Swig_scopename_first() * * Take a qualified name like "A::B::C" and returns the first scope name. * In this case, "A". Returns NULL if there is no base. * ----------------------------------------------------------------------------- */ String *Swig_scopename_first(const String *s) { char *tmp = Char(s); char *c = tmp; char *co = 0; if (!strstr(c, "::")) return 0; co = strstr(c, "operator "); if (co) { if (co == c) { return 0; } } else { co = c + Len(s); } while (*c && (c != co)) { if ((*c == ':') && (*(c + 1) == ':')) { break; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } if (*c && (c != tmp)) { return NewStringWithSize(tmp, (int)(c - tmp)); } else { return 0; } } /* ----------------------------------------------------------------------------- * Swig_scopename_suffix() * * Take a qualified name like "A::B::C" and returns the suffix. * In this case, "B::C". Returns NULL if there is no suffix. * ----------------------------------------------------------------------------- */ String *Swig_scopename_suffix(const String *s) { char *tmp = Char(s); char *c = tmp; char *co = 0; if (!strstr(c, "::")) return 0; co = strstr(c, "operator "); if (co) { if (co == c) return 0; } while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { break; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } if (*c && (c != tmp)) { return NewString(c + 2); } else { return 0; } } /* ----------------------------------------------------------------------------- * Swig_scopename_tolist() * * Take a qualified scope name like "A::B::C" and convert it to a list. * In this case, return a list of 3 elements "A", "B", "C". * Returns an empty list if the input is empty. * ----------------------------------------------------------------------------- */ List *Swig_scopename_tolist(const String *s) { List *scopes = NewList(); String *name = Len(s) == 0 ? 0 : NewString(s); while (name) { String *last = 0; String *prefix = 0; Swig_scopename_split(name, &prefix, &last); Insert(scopes, 0, last); Delete(last); Delete(name); name = prefix; } Delete(name); return scopes; } /* ----------------------------------------------------------------------------- * Swig_scopename_check() * * Checks to see if a name is qualified with a scope name, examples: * foo -> 0 * ::foo -> 1 * foo::bar -> 1 * foo< ::bar > -> 0 * ----------------------------------------------------------------------------- */ int Swig_scopename_check(const String *s) { char *c = Char(s); char *co = strstr(c, "operator "); if (co) { if (co == c) return 0; } if (!strstr(c, "::")) return 0; while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { return 1; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } return 0; } /* ----------------------------------------------------------------------------- * Swig_string_command() * * Executes a external command via popen with the string as a command * line parameter. For example: * * Printf(stderr,"%(command:sed 's/[a-z]/\U\\1/' <<<)s","hello") -> Hello * ----------------------------------------------------------------------------- */ #if defined(_MSC_VER) # define popen _popen # define pclose _pclose # if !defined(HAVE_POPEN) # define HAVE_POPEN 1 # endif #else # if !defined(_WIN32) /* These Posix functions are not ISO C and so are not always defined in stdio.h */ extern FILE *popen(const char *command, const char *type); extern int pclose(FILE *stream); # endif #endif String *Swig_string_command(String *s) { String *res = NewStringEmpty(); #if defined(HAVE_POPEN) if (Len(s)) { char *command = Char(s); FILE *fp = popen(command, "r"); if (fp) { char buffer[1025]; while (fscanf(fp, "%1024s", buffer) != EOF) { Append(res, buffer); } pclose(fp); } else { Swig_error("SWIG", Getline(s), "Command encoder fails attempting '%s'.\n", s); SWIG_exit(EXIT_FAILURE); } } #endif return res; } /* ----------------------------------------------------------------------------- * Swig_string_strip() * * Strip given prefix from identifiers * * Printf(stderr,"%(strip:[wx])s","wxHello") -> Hello * ----------------------------------------------------------------------------- */ String *Swig_string_strip(String *s) { String *ns; if (!Len(s)) { ns = NewString(s); } else { const char *cs = Char(s); const char *ce = Strchr(cs, ']'); if (*cs != '[' || !ce) { ns = NewString(s); } else { String *fmt = NewStringf("%%.%ds", ce-cs-1); String *prefix = NewStringf(fmt, cs+1); if (0 == Strncmp(ce+1, prefix, Len(prefix))) { ns = NewString(ce+1+Len(prefix)); } else { ns = NewString(ce+1); } } } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_rstrip() * * Strip given suffix from identifiers * * Printf(stderr,"%(rstrip:[Cls])s","HelloCls") -> Hello * ----------------------------------------------------------------------------- */ String *Swig_string_rstrip(String *s) { String *ns; int len = Len(s); if (!len) { ns = NewString(s); } else { const char *cs = Char(s); const char *ce = Strchr(cs, ']'); if (*cs != '[' || !ce) { ns = NewString(s); } else { String *fmt = NewStringf("%%.%ds", ce-cs-1); String *suffix = NewStringf(fmt, cs+1); int suffix_len = Len(suffix); if (0 == Strncmp(cs+len-suffix_len, suffix, suffix_len)) { int copy_len = len-suffix_len-(int)(ce+1-cs); ns = NewStringWithSize(ce+1, copy_len); } else { ns = NewString(ce+1); } } } return ns; } /* ----------------------------------------------------------------------------- * Swig_offset_string() * * Insert number tabs before each new line in s * ----------------------------------------------------------------------------- */ void Swig_offset_string(String *s, int number) { char *res, *p, *end, *start; /* count a number of lines in s */ int lines = 1; int len = Len(s); if (len == 0) return; start = strchr(Char(s), '\n'); while (start) { ++lines; start = strchr(start + 1, '\n'); } /* do not count pending new line */ if ((Char(s))[len-1] == '\n') --lines; /* allocate a temporary storage for a padded string */ res = (char*)malloc(len + lines * number * 2 + 1); res[len + lines * number * 2] = 0; /* copy lines to res, prepending tabs to each line */ p = res; /* output pointer */ start = Char(s); /* start of a current line */ end = strchr(start, '\n'); /* end of a current line */ while (end) { memset(p, ' ', number*2); p += number*2; memcpy(p, start, end - start + 1); p += end - start + 1; start = end + 1; end = strchr(start, '\n'); } /* process the last line */ if (*start) { memset(p, ' ', number*2); p += number*2; strcpy(p, start); } /* replace 's' contents with 'res' */ Clear(s); Append(s, res); free(res); } #ifdef HAVE_PCRE #include static int split_regex_pattern_subst(String *s, String **pattern, String **subst, const char **input) { const char *pats, *pate; const char *subs, *sube; /* Locate the search pattern */ const char *p = Char(s); if (*p++ != '/') goto err_out; pats = p; p = strchr(p, '/'); if (!p) goto err_out; pate = p; /* Locate the substitution string */ subs = ++p; p = strchr(p, '/'); if (!p) goto err_out; sube = p; *pattern = NewStringWithSize(pats, (int)(pate - pats)); *subst = NewStringWithSize(subs, (int)(sube - subs)); *input = p + 1; return 1; err_out: Swig_error("SWIG", Getline(s), "Invalid regex substitution: '%s'.\n", s); SWIG_exit(EXIT_FAILURE); return 0; } /* This function copies len characters from src to dst, possibly applying case conversions to them: if convertCase is 1, to upper case and if it is -1, to lower * case. If convertNextOnly is 1, only a single character is converted (and convertCase is reset), otherwise all of them are. */ static void copy_with_maybe_case_conversion(String *dst, const char *src, int len, int *convertCase, int convertNextOnly) { /* Deal with the trivial cases first. */ if (!len) return; if (!*convertCase) { Write(dst, src, len); return; } /* If we must convert only the first character, do it and write the rest at once. */ if (convertNextOnly) { int src_char = *src; Putc(*convertCase == 1 ? toupper(src_char) : tolower(src_char), dst); *convertCase = 0; if (len > 1) { Write(dst, src + 1, len - 1); } } else { /* We need to convert all characters. */ int i; for (i = 0; i < len; i++, src++) { int src_char = *src; Putc(*convertCase == 1 ? toupper(src_char) : tolower(src_char), dst); } } } String *replace_captures(int num_captures, const char *input, String *subst, int captures[], String *pattern, String *s) { int convertCase = 0, convertNextOnly = 0; String *result = NewStringEmpty(); const char *p = Char(subst); while (*p) { /* Copy part without substitutions */ const char *q = strchr(p, '\\'); if (!q) { copy_with_maybe_case_conversion(result, p, (int)strlen(p), &convertCase, convertNextOnly); break; } copy_with_maybe_case_conversion(result, p, (int)(q - p), &convertCase, convertNextOnly); p = q + 1; /* Handle substitution */ if (*p == '\0') { Putc('\\', result); } else if (isdigit((unsigned char)*p)) { int group = *p++ - '0'; if (group < num_captures) { int l = captures[group*2], r = captures[group*2 + 1]; if (l != -1) { copy_with_maybe_case_conversion(result, input + l, r - l, &convertCase, convertNextOnly); } } else { Swig_error("SWIG", Getline(s), "PCRE capture replacement failed while matching \"%s\" using \"%s\" - request for group %d is greater than the number of captures %d.\n", Char(pattern), input, group, num_captures-1); } } else { /* Handle Perl-like case conversion escapes. */ switch (*p) { case 'u': convertCase = 1; convertNextOnly = 1; break; case 'U': convertCase = 1; convertNextOnly = 0; break; case 'l': convertCase = -1; convertNextOnly = 1; break; case 'L': convertCase = -1; convertNextOnly = 0; break; case 'E': convertCase = 0; break; default: Swig_error("SWIG", Getline(s), "Unrecognized escape character '%c' in the replacement string \"%s\".\n", *p, Char(subst)); } p++; } } return result; } /* ----------------------------------------------------------------------------- * Swig_string_regex() * * Executes a regular expression substitution. For example: * * Printf(stderr,"gsl%(regex:/GSL_(.*)_/\\1/)s", "GSL_Hello_") -> gslHello * ----------------------------------------------------------------------------- */ String *Swig_string_regex(String *s) { const int pcre_options = 0; String *res = 0; pcre *compiled_pat = 0; const char *pcre_error, *input; int pcre_errorpos; String *pattern = 0, *subst = 0; int captures[30]; if (split_regex_pattern_subst(s, &pattern, &subst, &input)) { int rc; compiled_pat = pcre_compile( Char(pattern), pcre_options, &pcre_error, &pcre_errorpos, NULL); if (!compiled_pat) { Swig_error("SWIG", Getline(s), "PCRE compilation failed: '%s' in '%s':%i.\n", pcre_error, Char(pattern), pcre_errorpos); SWIG_exit(EXIT_FAILURE); } rc = pcre_exec(compiled_pat, NULL, input, (int)strlen(input), 0, 0, captures, 30); if (rc >= 0) { res = replace_captures(rc, input, subst, captures, pattern, s); } else if (rc != PCRE_ERROR_NOMATCH) { Swig_error("SWIG", Getline(s), "PCRE execution failed: error %d while matching \"%s\" using \"%s\".\n", rc, Char(pattern), input); SWIG_exit(EXIT_FAILURE); } } DohDelete(pattern); DohDelete(subst); pcre_free(compiled_pat); return res ? res : NewStringEmpty(); } String *Swig_pcre_version(void) { return NewStringf("PCRE Version: %s", pcre_version()); } #else String *Swig_string_regex(String *s) { Swig_error("SWIG", Getline(s), "PCRE regex support not enabled in this SWIG build.\n"); SWIG_exit(EXIT_FAILURE); return 0; } String *Swig_pcre_version(void) { return NewStringf("PCRE not used"); } #endif /* ------------------------------------------------------------ * Swig_is_generated_overload() * Check if the function is an automatically generated * overload created because a method has default parameters. * ------------------------------------------------------------ */ int Swig_is_generated_overload(Node *n) { Node *base_method = Getattr(n, "sym:overloaded"); Node *default_args = Getattr(n, "defaultargs"); return ((base_method != NULL) && (default_args != NULL) && (base_method == default_args)); } /* ----------------------------------------------------------------------------- * Swig_init() * * Initialize the SWIG core * ----------------------------------------------------------------------------- */ void Swig_init() { /* Set some useful string encoding methods */ DohEncoding("escape", Swig_string_escape); DohEncoding("hexescape", Swig_string_hexescape); DohEncoding("upper", Swig_string_upper); DohEncoding("lower", Swig_string_lower); DohEncoding("title", Swig_string_title); DohEncoding("ctitle", Swig_string_ccase); DohEncoding("lctitle", Swig_string_lccase); DohEncoding("utitle", Swig_string_ucase); DohEncoding("typecode", Swig_string_typecode); DohEncoding("mangle", Swig_string_emangle); DohEncoding("command", Swig_string_command); DohEncoding("schemify", Swig_string_schemify); DohEncoding("strip", Swig_string_strip); DohEncoding("rstrip", Swig_string_rstrip); DohEncoding("regex", Swig_string_regex); /* aliases for the case encoders */ DohEncoding("uppercase", Swig_string_upper); DohEncoding("lowercase", Swig_string_lower); DohEncoding("camelcase", Swig_string_ccase); DohEncoding("lowercamelcase", Swig_string_lccase); DohEncoding("undercase", Swig_string_ucase); DohEncoding("firstuppercase", Swig_string_first_upper); DohEncoding("firstlowercase", Swig_string_first_lower); /* Initialize typemaps */ Swig_typemap_init(); /* Initialize symbol table */ Swig_symbol_init(); /* Initialize type system */ SwigType_typesystem_init(); /* Initialize template system */ SwigType_template_init(); } swig-4.0.2/Source/Swig/swig.h0000644000175000017500000005232613667507523015665 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swig.h * * Header file for the SWIG core. * ----------------------------------------------------------------------------- */ #ifndef SWIGCORE_H_ #define SWIGCORE_H_ #ifndef MACSWIG #include "swigconfig.h" #endif #include #include #include #include #ifdef __cplusplus extern "C" { #endif #include "doh.h" /* Status codes */ #define SWIG_OK 1 #define SWIG_ERROR 0 #define SWIG_NOWRAP 0 /* Global macros */ #define NSPACE_SEPARATOR "." /* Namespace separator for the nspace feature - this should be changed to a target language configurable variable */ #define NSPACE_TODO 0 /* Languages that still need to implement and test the nspace feature use this */ /* Short names for common data types */ typedef DOH String; typedef DOH Hash; typedef DOH List; typedef DOH String_or_char; typedef DOH File; typedef DOH Parm; typedef DOH ParmList; typedef DOH Node; typedef DOH Symtab; typedef DOH Typetab; typedef DOH SwigType; /* --- Legacy DataType interface. These type codes are provided solely for backwards compatibility with older modules --- */ /* --- The ordering of type values is used to determine type-promotion in the parser. Do not change */ /* Numeric types */ #define T_BOOL 1 #define T_SCHAR 2 #define T_UCHAR 3 #define T_SHORT 4 #define T_USHORT 5 #define T_ENUM 6 #define T_INT 7 #define T_UINT 8 #define T_LONG 9 #define T_ULONG 10 #define T_LONGLONG 11 #define T_ULONGLONG 12 #define T_FLOAT 20 #define T_DOUBLE 21 #define T_LONGDOUBLE 22 #define T_FLTCPLX 23 #define T_DBLCPLX 24 #define T_NUMERIC 25 #define T_AUTO 26 #define T_COMPLEX T_DBLCPLX /* non-numeric */ #define T_CHAR 29 #define T_WCHAR 30 #define T_USER 31 #define T_VOID 32 #define T_STRING 33 #define T_POINTER 34 #define T_REFERENCE 35 #define T_ARRAY 36 #define T_FUNCTION 37 #define T_MPOINTER 38 #define T_VARARGS 39 #define T_RVALUE_REFERENCE 40 #define T_WSTRING 41 #define T_SYMBOL 98 #define T_ERROR 99 /* --- File interface --- */ #include "swigfile.h" /* --- Command line parsing --- */ #include "swigopt.h" /* --- Scanner Interface --- */ #include "swigscan.h" /* --- Functions for manipulating the string-based type encoding --- */ extern SwigType *NewSwigType(int typecode); extern SwigType *SwigType_del_element(SwigType *t); extern SwigType *SwigType_add_pointer(SwigType *t); extern SwigType *SwigType_add_memberpointer(SwigType *t, const_String_or_char_ptr qual); extern SwigType *SwigType_del_memberpointer(SwigType *t); extern SwigType *SwigType_del_pointer(SwigType *t); extern SwigType *SwigType_add_array(SwigType *t, const_String_or_char_ptr size); extern SwigType *SwigType_del_array(SwigType *t); extern SwigType *SwigType_pop_arrays(SwigType *t); extern SwigType *SwigType_add_reference(SwigType *t); extern SwigType *SwigType_del_reference(SwigType *t); extern SwigType *SwigType_add_rvalue_reference(SwigType *t); extern SwigType *SwigType_del_rvalue_reference(SwigType *t); extern SwigType *SwigType_add_qualifier(SwigType *t, const_String_or_char_ptr qual); extern SwigType *SwigType_del_qualifier(SwigType *t); extern SwigType *SwigType_add_function(SwigType *t, ParmList *parms); extern SwigType *SwigType_add_template(SwigType *t, ParmList *parms); extern SwigType *SwigType_pop_function(SwigType *t); extern SwigType *SwigType_pop_function_qualifiers(SwigType *t); extern ParmList *SwigType_function_parms(const SwigType *t, Node *file_line_node); extern List *SwigType_split(const SwigType *t); extern String *SwigType_pop(SwigType *t); extern void SwigType_push(SwigType *t, String *s); extern List *SwigType_parmlist(const SwigType *p); extern String *SwigType_parm(const SwigType *p); extern String *SwigType_str(const SwigType *s, const_String_or_char_ptr id); extern String *SwigType_lstr(const SwigType *s, const_String_or_char_ptr id); extern String *SwigType_rcaststr(const SwigType *s, const_String_or_char_ptr id); extern String *SwigType_lcaststr(const SwigType *s, const_String_or_char_ptr id); extern String *SwigType_manglestr(const SwigType *t); extern SwigType *SwigType_ltype(const SwigType *t); extern int SwigType_ispointer(const SwigType *t); extern int SwigType_ispointer_return(const SwigType *t); extern int SwigType_isfunctionpointer(const SwigType *t); extern int SwigType_ismemberpointer(const SwigType *t); extern int SwigType_isreference(const SwigType *t); extern int SwigType_isreference_return(const SwigType *t); extern int SwigType_isrvalue_reference(const SwigType *t); extern int SwigType_isarray(const SwigType *t); extern int SwigType_prefix_is_simple_1D_array(const SwigType *t); extern int SwigType_isfunction(const SwigType *t); extern int SwigType_isqualifier(const SwigType *t); extern int SwigType_isconst(const SwigType *t); extern int SwigType_issimple(const SwigType *t); extern int SwigType_ismutable(const SwigType *t); extern int SwigType_isvarargs(const SwigType *t); extern int SwigType_istemplate(const SwigType *t); extern int SwigType_isenum(const SwigType *t); extern int SwigType_check_decl(const SwigType *t, const_String_or_char_ptr decl); extern SwigType *SwigType_strip_qualifiers(const SwigType *t); extern SwigType *SwigType_strip_single_qualifier(const SwigType *t); extern SwigType *SwigType_functionpointer_decompose(SwigType *t); extern String *SwigType_base(const SwigType *t); extern String *SwigType_namestr(const SwigType *t); extern String *SwigType_templateprefix(const SwigType *t); extern String *SwigType_templatesuffix(const SwigType *t); extern String *SwigType_istemplate_templateprefix(const SwigType *t); extern String *SwigType_istemplate_only_templateprefix(const SwigType *t); extern String *SwigType_templateargs(const SwigType *t); extern String *SwigType_prefix(const SwigType *t); extern int SwigType_array_ndim(const SwigType *t); extern String *SwigType_array_getdim(const SwigType *t, int n); extern void SwigType_array_setdim(SwigType *t, int n, const_String_or_char_ptr rep); extern SwigType *SwigType_array_type(const SwigType *t); extern SwigType *SwigType_default_create(const SwigType *ty); extern SwigType *SwigType_default_deduce(const SwigType *t); extern void SwigType_typename_replace(SwigType *t, String *pat, String *rep); extern SwigType *SwigType_remove_global_scope_prefix(const SwigType *t); extern SwigType *SwigType_alttype(const SwigType *t, int ltmap); /* --- Type-system management --- */ extern void SwigType_typesystem_init(void); extern int SwigType_typedef(const SwigType *type, const_String_or_char_ptr name); extern int SwigType_typedef_class(const_String_or_char_ptr name); extern int SwigType_typedef_using(const_String_or_char_ptr qname); extern void SwigType_inherit(String *subclass, String *baseclass, String *cast, String *conversioncode); extern int SwigType_issubtype(const SwigType *subtype, const SwigType *basetype); extern void SwigType_scope_alias(String *aliasname, Typetab *t); extern void SwigType_using_scope(Typetab *t); extern void SwigType_new_scope(const_String_or_char_ptr name); extern void SwigType_inherit_scope(Typetab *scope); extern Typetab *SwigType_pop_scope(void); extern Typetab *SwigType_set_scope(Typetab *h); extern void SwigType_print_scope(void); extern SwigType *SwigType_typedef_resolve(const SwigType *t); extern SwigType *SwigType_typedef_resolve_all(const SwigType *t); extern SwigType *SwigType_typedef_qualified(const SwigType *t); extern int SwigType_istypedef(const SwigType *t); extern int SwigType_isclass(const SwigType *t); extern void SwigType_attach_symtab(Symtab *syms); extern void SwigType_remember(const SwigType *t); extern void SwigType_remember_clientdata(const SwigType *t, const_String_or_char_ptr clientdata); extern void SwigType_remember_mangleddata(String *mangled, const_String_or_char_ptr clientdata); extern void (*SwigType_remember_trace(void (*tf) (const SwigType *, String *, String *))) (const SwigType *, String *, String *); extern void SwigType_emit_type_table(File *f_headers, File *f_table); extern int SwigType_type(const SwigType *t); /* --- Symbol table module --- */ extern void Swig_symbol_print_tables(Symtab *symtab); extern void Swig_symbol_print_tables_summary(void); extern void Swig_symbol_print_symbols(void); extern void Swig_symbol_print_csymbols(void); extern void Swig_symbol_init(void); extern void Swig_symbol_setscopename(const_String_or_char_ptr name); extern String *Swig_symbol_getscopename(void); extern String *Swig_symbol_qualifiedscopename(Symtab *symtab); extern String *Swig_symbol_qualified_language_scopename(Symtab *symtab); extern Symtab *Swig_symbol_newscope(void); extern Symtab *Swig_symbol_setscope(Symtab *); extern Symtab *Swig_symbol_getscope(const_String_or_char_ptr symname); extern Symtab *Swig_symbol_global_scope(void); extern Symtab *Swig_symbol_current(void); extern Symtab *Swig_symbol_popscope(void); extern Node *Swig_symbol_add(const_String_or_char_ptr symname, Node *node); extern void Swig_symbol_cadd(const_String_or_char_ptr symname, Node *node); extern Node *Swig_symbol_clookup(const_String_or_char_ptr symname, Symtab *tab); extern Node *Swig_symbol_clookup_check(const_String_or_char_ptr symname, Symtab *tab, int (*check) (Node *)); extern Node *Swig_symbol_clookup_no_inherit(const_String_or_char_ptr name, Symtab *n); extern Symtab *Swig_symbol_cscope(const_String_or_char_ptr symname, Symtab *tab); extern Node *Swig_symbol_clookup_local(const_String_or_char_ptr symname, Symtab *tab); extern Node *Swig_symbol_clookup_local_check(const_String_or_char_ptr symname, Symtab *tab, int (*check) (Node *)); extern String *Swig_symbol_qualified(Node *node); extern Node *Swig_symbol_isoverloaded(Node *node); extern void Swig_symbol_remove(Node *node); extern void Swig_symbol_alias(const_String_or_char_ptr aliasname, Symtab *tab); extern void Swig_symbol_inherit(Symtab *tab); extern SwigType *Swig_symbol_type_qualify(const SwigType *ty, Symtab *tab); extern String *Swig_symbol_string_qualify(String *s, Symtab *tab); extern SwigType *Swig_symbol_typedef_reduce(const SwigType *ty, Symtab *tab); extern ParmList *Swig_symbol_template_defargs(Parm *parms, Parm *targs, Symtab *tscope, Symtab *tsdecl); extern SwigType *Swig_symbol_template_deftype(const SwigType *type, Symtab *tscope); extern SwigType *Swig_symbol_template_param_eval(const SwigType *p, Symtab *symtab); /* --- Parameters and Parameter Lists --- */ #include "swigparm.h" extern String *ParmList_errorstr(ParmList *); extern int ParmList_is_compactdefargs(ParmList *p); /* --- Parse tree support --- */ #include "swigtree.h" /* -- Wrapper function Object */ #include "swigwrap.h" /* --- Naming functions --- */ extern void Swig_name_register(const_String_or_char_ptr method, const_String_or_char_ptr format); extern void Swig_name_unregister(const_String_or_char_ptr method); extern String *Swig_name_mangle(const_String_or_char_ptr s); extern String *Swig_name_wrapper(const_String_or_char_ptr fname); extern String *Swig_name_member(const_String_or_char_ptr nspace, const_String_or_char_ptr classname, const_String_or_char_ptr membername); extern String *Swig_name_get(const_String_or_char_ptr nspace, const_String_or_char_ptr vname); extern String *Swig_name_set(const_String_or_char_ptr nspace, const_String_or_char_ptr vname); extern String *Swig_name_construct(const_String_or_char_ptr nspace, const_String_or_char_ptr classname); extern String *Swig_name_copyconstructor(const_String_or_char_ptr nspace, const_String_or_char_ptr classname); extern String *Swig_name_destroy(const_String_or_char_ptr nspace, const_String_or_char_ptr classname); extern String *Swig_name_disown(const_String_or_char_ptr nspace, const_String_or_char_ptr classname); extern void Swig_naming_init(void); extern void Swig_name_namewarn_add(String *prefix, String *name, SwigType *decl, Hash *namewrn); extern void Swig_name_rename_add(String *prefix, String *name, SwigType *decl, Hash *namewrn, ParmList *declaratorparms); extern void Swig_name_inherit(String *base, String *derived); extern List *Swig_make_inherit_list(String *clsname, List *names, String *Namespaceprefix); extern void Swig_inherit_base_symbols(List *bases); extern int Swig_need_protected(Node *n); extern int Swig_need_redefined_warn(Node *a, Node *b, int InClass); extern String *Swig_name_make(Node *n, String *prefix, const_String_or_char_ptr cname, SwigType *decl, String *oldname); extern String *Swig_name_warning(Node *n, String *prefix, String *name, SwigType *decl); extern String *Swig_name_str(Node *n); extern String *Swig_name_decl(Node *n); extern String *Swig_name_fulldecl(Node *n); /* --- parameterized rename functions --- */ extern void Swig_name_object_set(Hash *namehash, String *name, SwigType *decl, DOH *object); extern DOH *Swig_name_object_get(Hash *namehash, String *prefix, String *name, SwigType *decl); extern void Swig_name_object_inherit(Hash *namehash, String *base, String *derived); extern void Swig_features_get(Hash *features, String *prefix, String *name, SwigType *decl, Node *n); extern void Swig_feature_set(Hash *features, const_String_or_char_ptr name, SwigType *decl, const_String_or_char_ptr featurename, const_String_or_char_ptr value, Hash *featureattribs); /* --- Misc --- */ extern char *Swig_copy_string(const char *c); extern void Swig_set_fakeversion(const char *version); extern const char *Swig_package_version(void); extern void Swig_banner(File *f); extern void Swig_banner_target_lang(File *f, const_String_or_char_ptr commentchar); extern String *Swig_strip_c_comments(const String *s); extern String *Swig_new_subdirectory(String *basedirectory, String *subdirectory); extern void Swig_filename_correct(String *filename); extern String *Swig_filename_escape(String *filename); extern String *Swig_filename_escape_space(String *filename); extern void Swig_filename_unescape(String *filename); extern int Swig_storage_isextern(Node *n); extern int Swig_storage_isexternc(Node *n); extern int Swig_storage_isstatic_custom(Node *n, const_String_or_char_ptr storage); extern int Swig_storage_isstatic(Node *n); extern String *Swig_string_escape(String *s); extern String *Swig_string_mangle(const String *s); extern void Swig_scopename_split(const String *s, String **prefix, String **last); extern String *Swig_scopename_prefix(const String *s); extern String *Swig_scopename_last(const String *s); extern String *Swig_scopename_first(const String *s); extern String *Swig_scopename_suffix(const String *s); extern List *Swig_scopename_tolist(const String *s); extern int Swig_scopename_check(const String *s); extern String *Swig_string_lower(String *s); extern String *Swig_string_upper(String *s); extern String *Swig_string_title(String *s); extern void Swig_offset_string(String *s, int number); extern String *Swig_pcre_version(void); extern void Swig_init(void); extern int Swig_value_wrapper_mode(int mode); extern int Swig_is_generated_overload(Node *n); typedef enum { EMF_STANDARD, EMF_MICROSOFT } ErrorMessageFormat; extern void Swig_warning(int num, const_String_or_char_ptr filename, int line, const char *fmt, ...); extern void Swig_error(const_String_or_char_ptr filename, int line, const char *fmt, ...); extern int Swig_error_count(void); extern void Swig_error_silent(int s); extern void Swig_warnfilter(const_String_or_char_ptr wlist, int val); extern void Swig_warnall(void); extern int Swig_warn_count(void); extern void Swig_error_msg_format(ErrorMessageFormat format); extern void Swig_diagnostic(const_String_or_char_ptr filename, int line, const char *fmt, ...); extern String *Swig_stringify_with_location(DOH *object); /* --- C Wrappers --- */ extern void Swig_cresult_name_set(const char *new_name); extern const char *Swig_cresult_name(void); extern String *Swig_cparm_name(Parm *p, int i); extern String *Swig_wrapped_var_type(SwigType *t, int varcref); extern int Swig_cargs(Wrapper *w, ParmList *l); extern String *Swig_cresult(SwigType *t, const_String_or_char_ptr name, const_String_or_char_ptr decl); extern String *Swig_cfunction_call(const_String_or_char_ptr name, ParmList *parms); extern String *Swig_cconstructor_call(const_String_or_char_ptr name); extern String *Swig_cppconstructor_call(const_String_or_char_ptr name, ParmList *parms); extern String *Swig_unref_call(Node *n); extern String *Swig_ref_call(Node *n, const String *lname); extern String *Swig_cdestructor_call(Node *n); extern String *Swig_cppdestructor_call(Node *n); extern String *Swig_cmemberset_call(const_String_or_char_ptr name, SwigType *type, String *self, int varcref); extern String *Swig_cmemberget_call(const_String_or_char_ptr name, SwigType *t, String *self, int varcref); extern int Swig_add_extension_code(Node *n, const String *function_name, ParmList *parms, SwigType *return_type, const String *code, int cplusplus, const String *self); extern void Swig_replace_special_variables(Node *n, Node *parentnode, String *code); /* --- Transformations --- */ extern int Swig_MethodToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, int flags, SwigType *director_type, int is_director); extern int Swig_ConstructorToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, String *none_comparison, String *director_ctor, int cplus, int flags, String *directorname); extern int Swig_DestructorToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, int cplus, int flags); extern int Swig_MembersetToFunction(Node *n, String *classname, int flags); extern int Swig_MembergetToFunction(Node *n, String *classname, int flags); extern int Swig_VargetToFunction(Node *n, int flags); extern int Swig_VarsetToFunction(Node *n, int flags); #define CWRAP_EXTEND 0x01 #define CWRAP_SMART_POINTER 0x02 #define CWRAP_NATURAL_VAR 0x04 #define CWRAP_DIRECTOR_ONE_CALL 0x08 #define CWRAP_DIRECTOR_TWO_CALLS 0x10 #define CWRAP_ALL_PROTECTED_ACCESS 0x20 #define CWRAP_SMART_POINTER_OVERLOAD 0x40 /* --- Director Helpers --- */ extern Node *Swig_methodclass(Node *n); extern int Swig_directorclass(Node *n); extern Node *Swig_directormap(Node *n, String *type); /* --- Legacy Typemap API (somewhat simplified, ha!) --- */ extern void Swig_typemap_init(void); extern void Swig_typemap_register(const_String_or_char_ptr tmap_method, ParmList *pattern, const_String_or_char_ptr code, ParmList *locals, ParmList *kwargs); extern int Swig_typemap_copy(const_String_or_char_ptr tmap_method, ParmList *srcpattern, ParmList *pattern); extern void Swig_typemap_clear(const_String_or_char_ptr tmap_method, ParmList *pattern); extern int Swig_typemap_apply(ParmList *srcpat, ParmList *destpat); extern void Swig_typemap_clear_apply(ParmList *pattern); extern void Swig_typemap_replace_embedded_typemap(String *s, Node *file_line_node); extern void Swig_typemap_debug(void); extern void Swig_typemap_search_debug_set(void); extern void Swig_typemap_used_debug_set(void); extern void Swig_typemap_register_debug_set(void); extern String *Swig_typemap_lookup(const_String_or_char_ptr tmap_method, Node *n, const_String_or_char_ptr lname, Wrapper *f); extern String *Swig_typemap_lookup_out(const_String_or_char_ptr tmap_method, Node *n, const_String_or_char_ptr lname, Wrapper *f, String *actioncode); extern void Swig_typemap_attach_parms(const_String_or_char_ptr tmap_method, ParmList *parms, Wrapper *f); /* --- Code fragment support --- */ extern void Swig_fragment_register(Node *fragment); extern void Swig_fragment_emit(String *name); extern void Swig_fragment_clear(String *section); /* --- Extension support --- */ extern Hash *Swig_extend_hash(void); extern void Swig_extend_merge(Node *cls, Node *am); extern void Swig_extend_append_previous(Node *cls, Node *am); extern void Swig_extend_unused_check(void); /* hacks defined in C++ ! */ extern int Swig_director_mode(void); extern int Swig_director_protected_mode(void); extern int Swig_all_protected_mode(void); extern void Wrapper_director_mode_set(int); extern void Wrapper_director_protected_mode_set(int); extern void Wrapper_all_protected_mode_set(int); extern void Language_replace_special_variables(String *method, String *tm, Parm *parm); extern void Swig_print(DOH *object, int count); extern void Swig_print_with_location(DOH *object, int count); extern void SWIG_exit(int exit_code); /* -- template init -- */ extern void SwigType_template_init(void); #ifdef __cplusplus } #endif #endif swig-4.0.2/Source/Swig/swigscan.h0000644000175000017500000001321713667507523016526 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigscan.h * * C/C++ scanner. * ----------------------------------------------------------------------------- */ typedef struct Scanner Scanner; extern Scanner *NewScanner(void); extern void DelScanner(Scanner *); extern void Scanner_clear(Scanner *); extern void Scanner_push(Scanner *, String *); extern void Scanner_pushtoken(Scanner *, int, const_String_or_char_ptr value); extern int Scanner_token(Scanner *); extern String *Scanner_text(Scanner *); extern void Scanner_skip_line(Scanner *); extern int Scanner_skip_balanced(Scanner *, int startchar, int endchar); extern String *Scanner_get_raw_text_balanced(Scanner *, int startchar, int endchar); extern void Scanner_set_location(Scanner *, String *file, int line); extern String *Scanner_file(Scanner *); extern int Scanner_line(Scanner *); extern int Scanner_start_line(Scanner *); extern void Scanner_idstart(Scanner *, const char *idchar); extern String *Scanner_errmsg(Scanner *); extern int Scanner_errline(Scanner *); extern int Scanner_isoperator(int tokval); extern void Scanner_locator(Scanner *, String *loc); /* Note: Tokens in range 100+ are for C/C++ operators */ #define SWIG_MAXTOKENS 200 #define SWIG_TOKEN_LPAREN 1 /* ( */ #define SWIG_TOKEN_RPAREN 2 /* ) */ #define SWIG_TOKEN_SEMI 3 /* ; */ #define SWIG_TOKEN_LBRACE 4 /* { */ #define SWIG_TOKEN_RBRACE 5 /* } */ #define SWIG_TOKEN_LBRACKET 6 /* [ */ #define SWIG_TOKEN_RBRACKET 7 /* ] */ #define SWIG_TOKEN_BACKSLASH 8 /* \ */ #define SWIG_TOKEN_ENDLINE 9 /* \n */ #define SWIG_TOKEN_STRING 10 /* "str" */ #define SWIG_TOKEN_POUND 11 /* # */ #define SWIG_TOKEN_COLON 12 /* : */ #define SWIG_TOKEN_DCOLON 13 /* :: */ #define SWIG_TOKEN_DCOLONSTAR 14 /* ::* */ #define SWIG_TOKEN_ID 15 /* identifier */ #define SWIG_TOKEN_FLOAT 16 /* 3.1415F */ #define SWIG_TOKEN_DOUBLE 17 /* 3.1415 */ #define SWIG_TOKEN_INT 18 /* 314 */ #define SWIG_TOKEN_UINT 19 /* 314U */ #define SWIG_TOKEN_LONG 20 /* 314L */ #define SWIG_TOKEN_ULONG 21 /* 314UL */ #define SWIG_TOKEN_CHAR 22 /* 'charconst' */ #define SWIG_TOKEN_PERIOD 23 /* . */ #define SWIG_TOKEN_AT 24 /* @ */ #define SWIG_TOKEN_DOLLAR 25 /* $ */ #define SWIG_TOKEN_CODEBLOCK 26 /* %{ ... %} ... */ #define SWIG_TOKEN_RSTRING 27 /* `charconst` */ #define SWIG_TOKEN_LONGLONG 28 /* 314LL */ #define SWIG_TOKEN_ULONGLONG 29 /* 314ULL */ #define SWIG_TOKEN_QUESTION 30 /* ? */ #define SWIG_TOKEN_COMMENT 31 /* C or C++ comment */ #define SWIG_TOKEN_BOOL 32 /* true or false */ #define SWIG_TOKEN_WSTRING 33 /* L"str" */ #define SWIG_TOKEN_WCHAR 34 /* L'c' */ #define SWIG_TOKEN_ILLEGAL 99 #define SWIG_TOKEN_ERROR -1 #define SWIG_TOKEN_COMMA 101 /* , */ #define SWIG_TOKEN_STAR 102 /* * */ #define SWIG_TOKEN_TIMES 102 /* * */ #define SWIG_TOKEN_EQUAL 103 /* = */ #define SWIG_TOKEN_EQUALTO 104 /* == */ #define SWIG_TOKEN_NOTEQUAL 105 /* != */ #define SWIG_TOKEN_PLUS 106 /* + */ #define SWIG_TOKEN_MINUS 107 /* - */ #define SWIG_TOKEN_AND 108 /* & */ #define SWIG_TOKEN_LAND 109 /* && */ #define SWIG_TOKEN_OR 110 /* | */ #define SWIG_TOKEN_LOR 111 /* || */ #define SWIG_TOKEN_XOR 112 /* ^ */ #define SWIG_TOKEN_LESSTHAN 113 /* < */ #define SWIG_TOKEN_GREATERTHAN 114 /* > */ #define SWIG_TOKEN_LTEQUAL 115 /* <= */ #define SWIG_TOKEN_GTEQUAL 116 /* >= */ #define SWIG_TOKEN_NOT 117 /* ~ */ #define SWIG_TOKEN_LNOT 118 /* ! */ #define SWIG_TOKEN_SLASH 119 /* / */ #define SWIG_TOKEN_DIVIDE 119 /* / */ #define SWIG_TOKEN_PERCENT 120 /* % */ #define SWIG_TOKEN_MODULO 120 /* % */ #define SWIG_TOKEN_LSHIFT 121 /* << */ #define SWIG_TOKEN_RSHIFT 122 /* >> */ #define SWIG_TOKEN_PLUSPLUS 123 /* ++ */ #define SWIG_TOKEN_MINUSMINUS 124 /* -- */ #define SWIG_TOKEN_PLUSEQUAL 125 /* += */ #define SWIG_TOKEN_MINUSEQUAL 126 /* -= */ #define SWIG_TOKEN_TIMESEQUAL 127 /* *= */ #define SWIG_TOKEN_DIVEQUAL 128 /* /= */ #define SWIG_TOKEN_ANDEQUAL 129 /* &= */ #define SWIG_TOKEN_OREQUAL 130 /* |= */ #define SWIG_TOKEN_XOREQUAL 131 /* ^= */ #define SWIG_TOKEN_LSEQUAL 132 /* <<= */ #define SWIG_TOKEN_RSEQUAL 133 /* >>= */ #define SWIG_TOKEN_MODEQUAL 134 /* %= */ #define SWIG_TOKEN_ARROW 135 /* -> */ #define SWIG_TOKEN_ARROWSTAR 136 /* ->* */ swig-4.0.2/Source/Swig/swigwrap.h0000644000175000017500000000277413667507523016561 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigwrap.h * * Functions related to wrapper objects. * ----------------------------------------------------------------------------- */ typedef struct Wrapper { Hash *localh; String *def; String *locals; String *code; } Wrapper; extern Wrapper *NewWrapper(void); extern void DelWrapper(Wrapper *w); extern void Wrapper_compact_print_mode_set(int flag); extern void Wrapper_pretty_print(String *str, File *f); extern void Wrapper_compact_print(String *str, File *f); extern void Wrapper_print(Wrapper *w, File *f); extern int Wrapper_add_local(Wrapper *w, const_String_or_char_ptr name, const_String_or_char_ptr decl); extern int Wrapper_add_localv(Wrapper *w, const_String_or_char_ptr name, ...); extern int Wrapper_check_local(Wrapper *w, const_String_or_char_ptr name); extern char *Wrapper_new_local(Wrapper *w, const_String_or_char_ptr name, const_String_or_char_ptr decl); extern char *Wrapper_new_localv(Wrapper *w, const_String_or_char_ptr name, ...); swig-4.0.2/Source/Swig/parms.c0000644000175000017500000001700313667507523016022 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * parms.c * * Parameter list class. * ----------------------------------------------------------------------------- */ #include "swig.h" /* ------------------------------------------------------------------------ * NewParm() * * Create a new parameter from datatype 'type' and name 'name' copying * the file and line number from the Node from_node. * ------------------------------------------------------------------------ */ Parm *NewParm(SwigType *type, const_String_or_char_ptr name, Node *from_node) { Parm *p = NewParmWithoutFileLineInfo(type, name); Setfile(p, Getfile(from_node)); Setline(p, Getline(from_node)); return p; } /* ------------------------------------------------------------------------ * NewParmWithoutFileLineInfo() * * Create a new parameter from datatype 'type' and name 'name' without any * file / line numbering information. * ------------------------------------------------------------------------ */ Parm *NewParmWithoutFileLineInfo(SwigType *type, const_String_or_char_ptr name) { Parm *p = NewHash(); set_nodeType(p, "parm"); if (type) { SwigType *ntype = Copy(type); Setattr(p, "type", ntype); Delete(ntype); } Setattr(p, "name", name); return p; } /* ------------------------------------------------------------------------ * NewParmNode() * * Create a new parameter from datatype 'type' and name and symbol table as * well as file and line number from the 'from_node'. * The resulting Parm will be similar to a Node used for typemap lookups. * ------------------------------------------------------------------------ */ Parm *NewParmNode(SwigType *type, Node *from_node) { Parm *p = NewParm(type, Getattr(from_node, "name"), from_node); Setattr(p, "sym:symtab", Getattr(from_node, "sym:symtab")); return p; } /* ------------------------------------------------------------------------ * CopyParm() * ------------------------------------------------------------------------ */ Parm *CopyParm(Parm *p) { Parm *np = NewHash(); Iterator ki; for (ki = First(p); ki.key; ki = Next(ki)) { if (DohIsString(ki.item)) { DOH *c = Copy(ki.item); Setattr(np,ki.key,c); Delete(c); } } Setfile(np, Getfile(p)); Setline(np, Getline(p)); return np; } /* ------------------------------------------------------------------ * CopyParmListMax() * CopyParmList() * ------------------------------------------------------------------ */ ParmList *CopyParmListMax(ParmList *p, int count) { Parm *np; Parm *pp = 0; Parm *fp = 0; if (!p) return 0; while (p) { if (count == 0) break; np = CopyParm(p); if (pp) { set_nextSibling(pp, np); Delete(np); } else { fp = np; } pp = np; p = nextSibling(p); count--; } return fp; } ParmList *CopyParmList(ParmList *p) { return CopyParmListMax(p,-1); } /* ----------------------------------------------------------------------------- * int ParmList_numrequired(). Return number of required arguments * ----------------------------------------------------------------------------- */ int ParmList_numrequired(ParmList *p) { int i = 0; while (p) { SwigType *t = Getattr(p, "type"); String *value = Getattr(p, "value"); if (value) return i; if (!(SwigType_type(t) == T_VOID)) i++; else break; p = nextSibling(p); } return i; } /* ----------------------------------------------------------------------------- * int ParmList_len() * ----------------------------------------------------------------------------- */ int ParmList_len(ParmList *p) { int i = 0; while (p) { i++; p = nextSibling(p); } return i; } /* --------------------------------------------------------------------- * get_empty_type() * ---------------------------------------------------------------------- */ static SwigType *get_empty_type() { return NewStringEmpty(); } /* --------------------------------------------------------------------- * ParmList_str() * * Generates a string of parameters * ---------------------------------------------------------------------- */ String *ParmList_str(ParmList *p) { String *out = NewStringEmpty(); while (p) { String *type = Getattr(p, "type"); String *pstr = SwigType_str(type ? type : get_empty_type(), Getattr(p, "name")); Append(out, pstr); p = nextSibling(p); if (p) { Append(out, ","); } Delete(pstr); } return out; } /* --------------------------------------------------------------------- * ParmList_str_defaultargs() * * Generates a string of parameters including default arguments * ---------------------------------------------------------------------- */ String *ParmList_str_defaultargs(ParmList *p) { String *out = NewStringEmpty(); while (p) { String *value = Getattr(p, "value"); String *type = Getattr(p, "type"); String *pstr = SwigType_str(type ? type : get_empty_type(), Getattr(p, "name")); Append(out, pstr); if (value) { Printf(out, "=%s", value); } p = nextSibling(p); if (p) { Append(out, ","); } Delete(pstr); } return out; } /* ----------------------------------------------------------------------------- * ParmList_str_multibrackets() * * Generates a string of parameters including default arguments adding brackets * if more than one parameter * ----------------------------------------------------------------------------- */ String *ParmList_str_multibrackets(ParmList *p) { String *out; String *parm_str = ParmList_str_defaultargs(p); if (ParmList_len(p) > 1) out = NewStringf("(%s)", parm_str); else out = NewStringf("%s", parm_str); Delete(parm_str); return out; } /* --------------------------------------------------------------------- * ParmList_protostr() * * Generate a prototype string. * ---------------------------------------------------------------------- */ String *ParmList_protostr(ParmList *p) { String *out = NewStringEmpty(); while (p) { String *type = Getattr(p, "type"); String *pstr = SwigType_str(type ? type : get_empty_type(), 0); Append(out, pstr); p = nextSibling(p); if (p) { Append(out, ","); } Delete(pstr); } return out; } /* --------------------------------------------------------------------- * ParmList_has_defaultargs() * * Returns 1 if the parameter list passed in is has one or more default * arguments. Otherwise returns 0. * ---------------------------------------------------------------------- */ int ParmList_has_defaultargs(ParmList *p) { while (p) { if (Getattr(p, "value")) { return 1; } p = nextSibling(p); } return 0; } /* --------------------------------------------------------------------- * ParmList_has_varargs() * * Returns 1 if the parameter list passed in has varargs. * Otherwise returns 0. * ---------------------------------------------------------------------- */ int ParmList_has_varargs(ParmList *p) { Parm *lp = 0; while (p) { lp = p; p = nextSibling(p); } return lp ? SwigType_isvarargs(Getattr(lp, "type")) : 0; } swig-4.0.2/Source/Swig/typemap.c0000644000175000017500000020142413667507523016361 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * typemap.c * * A somewhat generalized implementation of SWIG1.1 typemaps. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" #include #if 0 #define SWIG_DEBUG #endif static int typemap_search_debug = 0; static int typemaps_used_debug = 0; static int typemap_register_debug = 0; static int in_typemap_search_multi = 0; static void replace_embedded_typemap(String *s, ParmList *parm_sublist, Wrapper *f, Node *file_line_node); /* ----------------------------------------------------------------------------- * Typemaps are stored in a collection of nested hash tables. Something like * this: * * [ type ] * +-------- [ name ] * +-------- [ name ] * * Each hash table [ type ] or [ name ] then contains references to the * different typemap methods. These are referenced by names such as * "tmap:in", "tmap:out", "tmap:argout", and so forth. * * The object corresponding to a specific typemap method has the following attributes: * * "type" - Typemap type * "pname" - Parameter name * "code" - Typemap code * "source" - Source directive (%apply or %typemap) for the typemap * "locals" - Local variables (if any) * "kwargs" - Typemap attributes * * Example for a typemap method named "in": * %typemap(in, warning="987:my warning", noblock=1) int &my_int (int tmp) "$1 = $input;" * * "type" - r.int * "pname" - my_int * "code" - $1 = $input; * "source" - typemap(in) int &my_int * "locals" - int tmp * "kwargs" - warning="987:my typemap warning", foo=123 * * ----------------------------------------------------------------------------- */ static Hash *typemaps; /* ----------------------------------------------------------------------------- * typemap_identifier_fix() * * Create a type that can be used as a hash key lookup independent of the various * ways a template parameter list can be defined. This is achieved by fully * resolving the template parameters. * * This is a copy and modification of feature_identifier_fix in parser.y. * ----------------------------------------------------------------------------- */ static SwigType *typemap_identifier_fix(const SwigType *s) { String *tp = SwigType_istemplate_templateprefix(s); if (tp) { String *ts, *ta, *tq, *tr; ts = SwigType_templatesuffix(s); ta = SwigType_templateargs(s); tq = Swig_symbol_type_qualify(ta, 0); tr = SwigType_typedef_resolve_all(ta); Append(tp,tr); Append(tp,ts); Delete(ts); Delete(ta); Delete(tq); Delete(tr); return tp; } else { return NewString(s); } } static Hash *get_typemap(const SwigType *type) { Hash *tm = 0; SwigType *dtype = 0; SwigType *hashtype; if (SwigType_istemplate(type)) { SwigType *rty = typemap_identifier_fix(type); String *ty = Swig_symbol_template_deftype(rty, 0); dtype = Swig_symbol_type_qualify(ty, 0); type = dtype; Delete(ty); } /* remove unary scope operator (::) prefix indicating global scope for looking up in the hashmap */ hashtype = SwigType_remove_global_scope_prefix(type); tm = Getattr(typemaps, hashtype); Delete(dtype); Delete(hashtype); return tm; } static void set_typemap(const SwigType *type, Hash **tmhash) { SwigType *hashtype = 0; Hash *new_tm = 0; assert(*tmhash == 0); if (SwigType_istemplate(type)) { SwigType *rty = typemap_identifier_fix(type); String *ty = Swig_symbol_template_deftype(rty, 0); String *tyq = Swig_symbol_type_qualify(ty, 0); hashtype = SwigType_remove_global_scope_prefix(tyq); *tmhash = Getattr(typemaps, hashtype); Delete(rty); Delete(tyq); Delete(ty); } else { hashtype = SwigType_remove_global_scope_prefix(type); } if (!*tmhash) { /* this type has not been seen before even after resolving template parameter types */ new_tm = NewHash(); *tmhash = new_tm; } /* note that the unary scope operator (::) prefix indicating global scope has been removed from the type */ Setattr(typemaps, hashtype, *tmhash); Delete(hashtype); Delete(new_tm); } /* ----------------------------------------------------------------------------- * Swig_typemap_init() * * Initialize the typemap system * ----------------------------------------------------------------------------- */ void Swig_typemap_init() { typemaps = NewHash(); } static String *typemap_method_name(const_String_or_char_ptr tmap_method) { static Hash *names = 0; String *s; /* Due to "interesting" object-identity semantics of DOH, we have to make sure that we only intern strings without object identity into the hash table. (typemap_attach_kwargs calls typemap_method_name several times with the "same" String *tmap_method (i.e., same object identity) but differing string values.) Most other callers work around this by using char* rather than String *. -- mkoeppe, Jun 17, 2003 */ const char *method_without_object_identity = Char(tmap_method); if (!names) names = NewHash(); s = Getattr(names, method_without_object_identity); if (s) return s; s = NewStringf("tmap:%s", tmap_method); Setattr(names, method_without_object_identity, s); Delete(s); return s; } /* ----------------------------------------------------------------------------- * typemap_register() * * Internal implementation for Swig_typemap_register() * ----------------------------------------------------------------------------- */ static void typemap_register(const_String_or_char_ptr tmap_method, ParmList *parms, const_String_or_char_ptr code, ParmList *locals, ParmList *kwargs, String *source_directive) { Hash *tm; Hash *tm1; Hash *tm2; Parm *np; String *tm_method; SwigType *type; String *pname; if (!parms) return; if (typemap_register_debug) { Printf(stdout, "Registering - %s\n", tmap_method); Swig_print_node(parms); } tm_method = typemap_method_name(tmap_method); /* Register the first type in the parameter list */ type = Getattr(parms, "type"); pname = Getattr(parms, "name"); /* See if this type has been seen before */ tm = get_typemap(type); if (!tm) { set_typemap(type, &tm); } if (pname) { /* See if parameter has been seen before */ tm1 = Getattr(tm, pname); if (!tm1) { tm1 = NewHash(); Setattr(tm, pname, tm1); Delete(tm1); } tm = tm1; } /* Now see if this typemap method has been seen before */ tm2 = Getattr(tm, tm_method); if (!tm2) { tm2 = NewHash(); Setattr(tm, tm_method, tm2); Delete(tm2); } /* For a multi-argument typemap, the typemap code and information is really only stored in the last argument. However, to make this work, we perform a really neat trick using the typemap method name. For example, consider this typemap %typemap(in) (int foo, int *bar, char *blah[]) { ... } To store it, we look at typemaps for the following: typemap method type-name ---------------------------------------------- "in" int foo "in-int+foo:" int *bar "in-int+foo:-p.int+bar: char *blah[] Notice how the typemap method name expands to encode information about previous arguments. */ np = nextSibling(parms); if (np) { /* Make an entirely new typemap method key */ String *multi_tmap_method = NewStringf("%s-%s+%s:", tmap_method, type, pname); /* Now reregister on the remaining arguments */ typemap_register(multi_tmap_method, np, code, locals, kwargs, source_directive); Delete(multi_tmap_method); } else { ParmList *clocals = CopyParmList(locals); ParmList *ckwargs = CopyParmList(kwargs); Setfile(tm2, Getfile(code)); Setline(tm2, Getline(code)); Setattr(tm2, "code", code); Setattr(tm2, "type", type); Setattr(tm2, "source", source_directive); if (pname) { Setattr(tm2, "pname", pname); } Setattr(tm2, "locals", clocals); Setattr(tm2, "kwargs", ckwargs); Delete(clocals); Delete(ckwargs); } } /* ----------------------------------------------------------------------------- * Swig_typemap_register() * * Add a new, possibly multi-argument, typemap * ----------------------------------------------------------------------------- */ void Swig_typemap_register(const_String_or_char_ptr tmap_method, ParmList *parms, const_String_or_char_ptr code, ParmList *locals, ParmList *kwargs) { String *parms_str = ParmList_str_multibrackets(parms); String *source_directive = NewStringf("typemap(%s) %s", tmap_method, parms_str); typemap_register(tmap_method, parms, code, locals, kwargs, source_directive); Delete(source_directive); Delete(parms_str); } /* ----------------------------------------------------------------------------- * typemap_get() * * Retrieve typemap information. * ----------------------------------------------------------------------------- */ static Hash *typemap_get(SwigType *type, const_String_or_char_ptr name) { Hash *tm, *tm1; tm = get_typemap(type); if (!tm) { return 0; } if ((name) && Len(name)) { tm1 = Getattr(tm, name); return tm1; } return tm; } /* ----------------------------------------------------------------------------- * Swig_typemap_copy() * * Copy a typemap * ----------------------------------------------------------------------------- */ int Swig_typemap_copy(const_String_or_char_ptr tmap_method, ParmList *srcparms, ParmList *parms) { Hash *tm = 0; String *tm_method; Parm *p; String *pname; SwigType *ptype; String *tm_methods, *multi_tmap_method; if (ParmList_len(parms) != ParmList_len(srcparms)) return -1; tm_method = typemap_method_name(tmap_method); p = srcparms; tm_methods = NewString(tm_method); while (p) { ptype = Getattr(p, "type"); pname = Getattr(p, "name"); /* Lookup the type */ tm = typemap_get(ptype, pname); if (!tm) break; tm = Getattr(tm, tm_methods); if (!tm) break; /* Got a match. Look for next typemap */ multi_tmap_method = NewStringf("%s-%s+%s:", tm_methods, ptype, pname); Delete(tm_methods); tm_methods = multi_tmap_method; p = nextSibling(p); } Delete(tm_methods); if (!p && tm) { /* Got some kind of match */ String *parms_str = ParmList_str_multibrackets(parms); String *srcparms_str = ParmList_str_multibrackets(srcparms); String *source_directive = NewStringf("typemap(%s) %s = %s", tmap_method, parms_str, srcparms_str); typemap_register(tmap_method, parms, Getattr(tm, "code"), Getattr(tm, "locals"), Getattr(tm, "kwargs"), source_directive); Delete(source_directive); Delete(srcparms_str); Delete(parms_str); return 0; } /* Not found */ return -1; } /* ----------------------------------------------------------------------------- * Swig_typemap_clear() * * Delete a multi-argument typemap * ----------------------------------------------------------------------------- */ void Swig_typemap_clear(const_String_or_char_ptr tmap_method, ParmList *parms) { SwigType *type; String *name; Parm *p; String *multi_tmap_method; Hash *tm = 0; /* This might not work */ multi_tmap_method = NewString(tmap_method); p = parms; while (p) { type = Getattr(p, "type"); name = Getattr(p, "name"); tm = typemap_get(type, name); if (!tm) return; p = nextSibling(p); if (p) Printf(multi_tmap_method, "-%s+%s:", type, name); } if (tm) { tm = Getattr(tm, typemap_method_name(multi_tmap_method)); if (tm) { Delattr(tm, "code"); Delattr(tm, "locals"); Delattr(tm, "kwargs"); } } Delete(multi_tmap_method); } /* ----------------------------------------------------------------------------- * Swig_typemap_apply() * * Multi-argument %apply directive. This is pretty horrible so I sure hope * it works. * ----------------------------------------------------------------------------- */ static int count_args(String *s) { /* Count up number of arguments */ int na = 0; char *c = Char(s); while (*c) { if (*c == '+') na++; c++; } return na; } int Swig_typemap_apply(ParmList *src, ParmList *dest) { String *ssig, *dsig; Parm *p, *np, *lastp, *dp, *lastdp = 0; int narg = 0; SwigType *type = 0, *name; Hash *tm, *sm; int match = 0; /* Printf(stdout,"apply : %s --> %s\n", ParmList_str(src), ParmList_str(dest)); */ /* Create type signature of source */ ssig = NewStringEmpty(); dsig = NewStringEmpty(); p = src; dp = dest; lastp = 0; while (p) { lastp = p; lastdp = dp; np = nextSibling(p); if (np) { Printf(ssig, "-%s+%s:", Getattr(p, "type"), Getattr(p, "name")); Printf(dsig, "-%s+%s:", Getattr(dp, "type"), Getattr(dp, "name")); narg++; } p = np; dp = nextSibling(dp); } /* make sure a typemap node exists for the last destination node */ type = Getattr(lastdp, "type"); tm = get_typemap(type); if (!tm) { set_typemap(type, &tm); } name = Getattr(lastdp, "name"); if (name) { Hash *tm1 = Getattr(tm, name); if (!tm1) { tm1 = NewHash(); Setattr(tm, NewString(name), tm1); Delete(tm1); } tm = tm1; } /* This is a little nasty. We need to go searching for all possible typemaps in the source and apply them to the target */ type = Getattr(lastp, "type"); name = Getattr(lastp, "name"); /* See if there is a matching typemap in this scope */ sm = typemap_get(type, name); /* if there is not matching, look for a typemap in the original typedef, if any, like in: typedef unsigned long size_t; ... %apply(size_t) {my_size}; ==> %apply(unsigned long) {my_size}; */ if (!sm) { SwigType *ntype = SwigType_typedef_resolve(type); if (ntype && (Cmp(ntype, type) != 0)) { sm = typemap_get(ntype, name); } Delete(ntype); } if (sm) { /* Got a typemap. Need to only merge attributes for methods that match our signature */ Iterator ki; match = 1; for (ki = First(sm); ki.key; ki = Next(ki)) { /* Check for a signature match with the source signature */ if ((count_args(ki.key) == narg) && (Strstr(ki.key, ssig))) { String *oldm; /* A typemap we have to copy */ String *nkey = Copy(ki.key); Replace(nkey, ssig, dsig, DOH_REPLACE_ANY); /* Make sure the typemap doesn't already exist in the target map */ oldm = Getattr(tm, nkey); if (!oldm || (!Getattr(tm, "code"))) { String *code; ParmList *locals; ParmList *kwargs; Hash *sm1 = ki.item; code = Getattr(sm1, "code"); locals = Getattr(sm1, "locals"); kwargs = Getattr(sm1, "kwargs"); if (code) { String *src_str = ParmList_str_multibrackets(src); String *dest_str = ParmList_str_multibrackets(dest); String *source_directive = NewStringf("apply %s { %s }", src_str, dest_str); Replace(nkey, dsig, "", DOH_REPLACE_ANY); Replace(nkey, "tmap:", "", DOH_REPLACE_ANY); typemap_register(nkey, dest, code, locals, kwargs, source_directive); Delete(source_directive); Delete(dest_str); Delete(src_str); } } Delete(nkey); } } } Delete(ssig); Delete(dsig); return match; } /* ----------------------------------------------------------------------------- * Swig_typemap_clear_apply() * * %clear directive. Clears all typemaps for a type (in the current scope only). * ----------------------------------------------------------------------------- */ /* Multi-argument %clear directive */ void Swig_typemap_clear_apply(Parm *parms) { String *tsig; Parm *p, *np, *lastp; int narg = 0; Hash *tm; String *name; /* Create a type signature of the parameters */ tsig = NewStringEmpty(); p = parms; lastp = 0; while (p) { lastp = p; np = nextSibling(p); if (np) { Printf(tsig, "-%s+%s:", Getattr(p, "type"), Getattr(p, "name")); narg++; } p = np; } tm = get_typemap(Getattr(lastp, "type")); if (!tm) { Delete(tsig); return; } name = Getattr(lastp, "name"); if (name) { tm = Getattr(tm, name); } if (tm) { /* Clear typemaps that match our signature */ Iterator ki, ki2; char *ctsig = Char(tsig); for (ki = First(tm); ki.key; ki = Next(ki)) { char *ckey = Char(ki.key); if (strncmp(ckey, "tmap:", 5) == 0) { int na = count_args(ki.key); if ((na == narg) && strstr(ckey, ctsig)) { Hash *h = ki.item; for (ki2 = First(h); ki2.key; ki2 = Next(ki2)) { Delattr(h, ki2.key); } } } } } Delete(tsig); } /* Internal function to strip array dimensions. */ static SwigType *strip_arrays(SwigType *type) { SwigType *t; int ndim; int i; t = Copy(type); ndim = SwigType_array_ndim(t); for (i = 0; i < ndim; i++) { SwigType_array_setdim(t, i, "ANY"); } return t; } static void debug_search_result_display(Node *tm) { if (tm) Printf(stdout, " Using: %%%s\n", Getattr(tm, "source")); else Printf(stdout, " None found\n"); } /* ----------------------------------------------------------------------------- * typemap_search_helper() * * Helper function for typemap_search to see if there is a type match in the typemap * tm. A match is sought in this order: * %typemap(tm_method) ctype cqualifiedname * %typemap(tm_method) ctype cname * %typemap(tm_method) ctype * ----------------------------------------------------------------------------- */ static Hash *typemap_search_helper(int debug_display, Hash *tm, const String *tm_method, SwigType *ctype, const String *cqualifiedname, const String *cname, Hash **backup) { Hash *result = 0; Hash *tm1; if (debug_display && cqualifiedname) Printf(stdout, " Looking for: %s\n", SwigType_str(ctype, cqualifiedname)); if (tm && cqualifiedname) { tm1 = Getattr(tm, cqualifiedname); if (tm1) { result = Getattr(tm1, tm_method); /* See if there is a type - qualified name match */ if (result && Getattr(result, "code")) goto ret_result; if (result) *backup = result; } } if (debug_display && cname) Printf(stdout, " Looking for: %s\n", SwigType_str(ctype, cname)); if (tm && cname) { tm1 = Getattr(tm, cname); if (tm1) { result = Getattr(tm1, tm_method); /* See if there is a type - name match */ if (result && Getattr(result, "code")) goto ret_result; if (result) *backup = result; } } if (debug_display) Printf(stdout, " Looking for: %s\n", SwigType_str(ctype, 0)); if (tm) { result = Getattr(tm, tm_method); /* See if there is simply a type without name match */ if (result && Getattr(result, "code")) goto ret_result; if (result) *backup = result; } ret_result: return result; } /* ----------------------------------------------------------------------------- * typemap_search() * * Search for a typemap match. This is where the typemap pattern matching rules * are implemented... tries to find the most specific typemap that includes a * 'code' attribute. * ----------------------------------------------------------------------------- */ static Hash *typemap_search(const_String_or_char_ptr tmap_method, SwigType *type, const_String_or_char_ptr name, const_String_or_char_ptr qualifiedname, SwigType **matchtype, Node *node) { Hash *result = 0; Hash *tm; Hash *backup = 0; SwigType *primitive = 0; SwigType *ctype = 0; SwigType *ctype_unstripped = 0; int isarray; const String *cname = 0; const String *cqualifiedname = 0; String *tm_method = typemap_method_name(tmap_method); int debug_display = (in_typemap_search_multi == 0) && typemap_search_debug; if ((name) && Len(name)) cname = name; if ((qualifiedname) && Len(qualifiedname)) cqualifiedname = qualifiedname; if (debug_display) { String *typestr = SwigType_str(type, cqualifiedname ? cqualifiedname : cname); Swig_diagnostic(Getfile(node), Getline(node), "Searching for a suitable '%s' typemap for: %s\n", tmap_method, typestr); Delete(typestr); } ctype = Copy(type); ctype_unstripped = Copy(ctype); while (ctype) { /* Try to get an exact type-match */ tm = get_typemap(ctype); result = typemap_search_helper(debug_display, tm, tm_method, ctype, cqualifiedname, cname, &backup); if (result && Getattr(result, "code")) goto ret_result; { /* Look for the type reduced to just the template prefix - for templated types without the template parameter list being specified */ SwigType *template_prefix = SwigType_istemplate_only_templateprefix(ctype); if (template_prefix) { tm = get_typemap(template_prefix); result = typemap_search_helper(debug_display, tm, tm_method, template_prefix, cqualifiedname, cname, &backup); Delete(template_prefix); if (result && Getattr(result, "code")) goto ret_result; } } /* look for [ANY] arrays */ isarray = SwigType_isarray(ctype); if (isarray) { /* If working with arrays, strip away all of the dimensions and replace with "ANY". See if that generates a match */ SwigType *noarrays = strip_arrays(ctype); tm = get_typemap(noarrays); result = typemap_search_helper(debug_display, tm, tm_method, noarrays, cqualifiedname, cname, &backup); Delete(noarrays); if (result && Getattr(result, "code")) goto ret_result; } /* No match so far - try with a qualifier stripped (strip one qualifier at a time until none remain) * The order of stripping in SwigType_strip_single_qualifier is used to provide some sort of consistency * with the default (SWIGTYPE) typemap matching rules for the first qualifier to be stripped. */ { SwigType *oldctype = ctype; ctype = SwigType_strip_single_qualifier(oldctype); if (!Equal(ctype, oldctype)) { Delete(oldctype); continue; } Delete(oldctype); } /* Once all qualifiers are stripped try resolve a typedef */ { SwigType *oldctype = ctype; ctype = SwigType_typedef_resolve(ctype_unstripped); Delete(oldctype); Delete(ctype_unstripped); ctype_unstripped = Copy(ctype); } } /* Hmmm. Well, no match seems to be found at all. See if there is some kind of default (SWIGTYPE) mapping */ primitive = SwigType_default_create(type); while (primitive) { tm = get_typemap(primitive); result = typemap_search_helper(debug_display, tm, tm_method, primitive, cqualifiedname, cname, &backup); if (result && Getattr(result, "code")) goto ret_result; { SwigType *nprim = SwigType_default_deduce(primitive); Delete(primitive); primitive = nprim; } } if (ctype != type) { Delete(ctype); ctype = 0; } result = backup; ret_result: Delete(primitive); if (matchtype) *matchtype = Copy(ctype); Delete(ctype); Delete(ctype_unstripped); return result; } /* ----------------------------------------------------------------------------- * typemap_search_multi() * * Search for a multi-argument typemap. * ----------------------------------------------------------------------------- */ static Hash *typemap_search_multi(const_String_or_char_ptr tmap_method, ParmList *parms, int *nmatch) { SwigType *type; SwigType *mtype = 0; String *name; String *multi_tmap_method; Hash *tm; Hash *tm1 = 0; if (!parms) { *nmatch = 0; return 0; } type = Getattr(parms, "type"); name = Getattr(parms, "name"); /* Try to find a match on the first type */ tm = typemap_search(tmap_method, type, name, 0, &mtype, parms); if (tm) { if (mtype && SwigType_isarray(mtype)) { Setattr(parms, "tmap:match", mtype); } Delete(mtype); multi_tmap_method = NewStringf("%s-%s+%s:", tmap_method, type, name); in_typemap_search_multi++; tm1 = typemap_search_multi(multi_tmap_method, nextSibling(parms), nmatch); in_typemap_search_multi--; if (tm1) tm = tm1; if (Getattr(tm, "code")) { *(nmatch) = *nmatch + 1; if (typemap_search_debug && tm1 && (in_typemap_search_multi == 0)) { Printf(stdout, " Multi-argument typemap found...\n"); } } else { tm = 0; } Delete(multi_tmap_method); } if (typemap_search_debug && (in_typemap_search_multi == 0)) debug_search_result_display(tm); if (typemaps_used_debug && (in_typemap_search_multi == 0) && tm) { String *typestr = SwigType_str(type, name); Swig_diagnostic(Getfile(parms), Getline(parms), "Typemap for %s (%s) : %%%s\n", typestr, tmap_method, Getattr(tm, "source")); assert(Getfile(parms) && Len(Getfile(parms)) > 0); /* Missing file and line numbering information */ Delete(typestr); } return tm; } /* ----------------------------------------------------------------------------- * typemap_replace_vars() * * Replaces typemap variables on a string. index is the $n variable. * type and pname are the type and parameter name. * ----------------------------------------------------------------------------- */ static void replace_local_types(ParmList *p, const String *name, const String *rep) { SwigType *t; while (p) { t = Getattr(p, "type"); Replace(t, name, rep, DOH_REPLACE_ANY); p = nextSibling(p); } } static int check_locals(ParmList *p, const char *s) { while (p) { char *c = GetChar(p, "type"); if (strstr(c, s)) return 1; p = nextSibling(p); } return 0; } static int typemap_replace_vars(String *s, ParmList *locals, SwigType *type, SwigType *rtype, String *pname, String *lname, int index) { char var[512]; char *varname; SwigType *ftype; int bare_substitution_count = 0; Replaceall(s, "$typemap", "$TYPEMAP"); /* workaround for $type substitution below */ ftype = SwigType_typedef_resolve_all(type); if (!pname) pname = lname; { Parm *p; int rep = 0; p = locals; while (p) { if (Strchr(Getattr(p, "type"), '$')) rep = 1; p = nextSibling(p); } if (!rep) locals = 0; } sprintf(var, "$%d_", index); varname = &var[strlen(var)]; /* If the original datatype was an array. We're going to go through and substitute its array dimensions */ if (SwigType_isarray(type) || SwigType_isarray(ftype)) { String *size; int ndim; int i; if (SwigType_array_ndim(type) != SwigType_array_ndim(ftype)) type = ftype; ndim = SwigType_array_ndim(type); size = NewStringEmpty(); for (i = 0; i < ndim; i++) { String *dim = SwigType_array_getdim(type, i); if (index == 1) { char t[32]; sprintf(t, "$dim%d", i); Replace(s, t, dim, DOH_REPLACE_ANY); replace_local_types(locals, t, dim); } sprintf(varname, "dim%d", i); Replace(s, var, dim, DOH_REPLACE_ANY); replace_local_types(locals, var, dim); if (Len(size)) Putc('*', size); Append(size, dim); Delete(dim); } sprintf(varname, "size"); Replace(s, var, size, DOH_REPLACE_ANY); replace_local_types(locals, var, size); Delete(size); } /* Parameter name substitution */ if (index == 1) { Replace(s, "$parmname", pname, DOH_REPLACE_ANY); } strcpy(varname, "name"); Replace(s, var, pname, DOH_REPLACE_ANY); /* Type-related stuff */ { SwigType *star_type, *amp_type, *base_type, *lex_type; SwigType *ltype, *star_ltype, *amp_ltype; String *mangle, *star_mangle, *amp_mangle, *base_mangle, *base_name, *base_type_str; String *descriptor, *star_descriptor, *amp_descriptor; String *ts; char *sc; sc = Char(s); if (strstr(sc, "type") || check_locals(locals, "type")) { /* Given type : $type */ ts = SwigType_str(type, 0); if (index == 1) { Replace(s, "$type", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$type", type); } strcpy(varname, "type"); Replace(s, var, ts, DOH_REPLACE_ANY); replace_local_types(locals, var, type); Delete(ts); sc = Char(s); } if (strstr(sc, "ltype") || check_locals(locals, "ltype")) { /* Local type: $ltype */ ltype = SwigType_ltype(type); ts = SwigType_str(ltype, 0); if (index == 1) { Replace(s, "$ltype", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$ltype", ltype); } strcpy(varname, "ltype"); Replace(s, var, ts, DOH_REPLACE_ANY); replace_local_types(locals, var, ltype); Delete(ts); Delete(ltype); sc = Char(s); } if (strstr(sc, "mangle") || strstr(sc, "descriptor")) { /* Mangled type */ mangle = SwigType_manglestr(type); if (index == 1) Replace(s, "$mangle", mangle, DOH_REPLACE_ANY); strcpy(varname, "mangle"); Replace(s, var, mangle, DOH_REPLACE_ANY); descriptor = NewStringf("SWIGTYPE%s", mangle); if (index == 1) if (Replace(s, "$descriptor", descriptor, DOH_REPLACE_ANY)) SwigType_remember(type); strcpy(varname, "descriptor"); if (Replace(s, var, descriptor, DOH_REPLACE_ANY)) SwigType_remember(type); Delete(descriptor); Delete(mangle); } /* One pointer level removed */ /* This creates variables of the form $*n_type $*n_ltype */ if (SwigType_ispointer(ftype) || (SwigType_isarray(ftype)) || (SwigType_isreference(ftype)) || (SwigType_isrvalue_reference(ftype))) { if (!(SwigType_isarray(type) || SwigType_ispointer(type) || SwigType_isreference(type) || SwigType_isrvalue_reference(type))) { star_type = Copy(ftype); } else { star_type = Copy(type); } if (!(SwigType_isreference(star_type) || SwigType_isrvalue_reference(star_type))) { if (SwigType_isarray(star_type)) { SwigType_del_element(star_type); } else { SwigType_del_pointer(star_type); } ts = SwigType_str(star_type, 0); if (index == 1) { Replace(s, "$*type", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$*type", star_type); } sprintf(varname, "$*%d_type", index); Replace(s, varname, ts, DOH_REPLACE_ANY); replace_local_types(locals, varname, star_type); Delete(ts); } else { SwigType_del_element(star_type); } star_ltype = SwigType_ltype(star_type); ts = SwigType_str(star_ltype, 0); if (index == 1) { Replace(s, "$*ltype", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$*ltype", star_ltype); } sprintf(varname, "$*%d_ltype", index); Replace(s, varname, ts, DOH_REPLACE_ANY); replace_local_types(locals, varname, star_ltype); Delete(ts); Delete(star_ltype); star_mangle = SwigType_manglestr(star_type); if (index == 1) Replace(s, "$*mangle", star_mangle, DOH_REPLACE_ANY); sprintf(varname, "$*%d_mangle", index); Replace(s, varname, star_mangle, DOH_REPLACE_ANY); star_descriptor = NewStringf("SWIGTYPE%s", star_mangle); if (index == 1) if (Replace(s, "$*descriptor", star_descriptor, DOH_REPLACE_ANY)) SwigType_remember(star_type); sprintf(varname, "$*%d_descriptor", index); if (Replace(s, varname, star_descriptor, DOH_REPLACE_ANY)) SwigType_remember(star_type); Delete(star_descriptor); Delete(star_mangle); Delete(star_type); } else { /* TODO: Signal error if one of the $* substitutions is requested */ } /* One pointer level added */ amp_type = Copy(type); SwigType_add_pointer(amp_type); ts = SwigType_str(amp_type, 0); if (index == 1) { Replace(s, "$&type", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$&type", amp_type); } sprintf(varname, "$&%d_type", index); Replace(s, varname, ts, DOH_REPLACE_ANY); replace_local_types(locals, varname, amp_type); Delete(ts); amp_ltype = SwigType_ltype(type); SwigType_add_pointer(amp_ltype); ts = SwigType_str(amp_ltype, 0); if (index == 1) { Replace(s, "$<ype", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$<ype", amp_ltype); } sprintf(varname, "$&%d_ltype", index); Replace(s, varname, ts, DOH_REPLACE_ANY); replace_local_types(locals, varname, amp_ltype); Delete(ts); Delete(amp_ltype); amp_mangle = SwigType_manglestr(amp_type); if (index == 1) Replace(s, "$&mangle", amp_mangle, DOH_REPLACE_ANY); sprintf(varname, "$&%d_mangle", index); Replace(s, varname, amp_mangle, DOH_REPLACE_ANY); amp_descriptor = NewStringf("SWIGTYPE%s", amp_mangle); if (index == 1) if (Replace(s, "$&descriptor", amp_descriptor, DOH_REPLACE_ANY)) SwigType_remember(amp_type); sprintf(varname, "$&%d_descriptor", index); if (Replace(s, varname, amp_descriptor, DOH_REPLACE_ANY)) SwigType_remember(amp_type); Delete(amp_descriptor); Delete(amp_mangle); Delete(amp_type); /* Base type */ if (SwigType_isarray(type)) { base_type = Copy(type); Delete(SwigType_pop_arrays(base_type)); } else { base_type = SwigType_base(type); } base_type_str = SwigType_str(base_type, 0); base_name = SwigType_namestr(base_type_str); if (index == 1) { Replace(s, "$basetype", base_name, DOH_REPLACE_ANY); replace_local_types(locals, "$basetype", base_name); } strcpy(varname, "basetype"); Replace(s, var, base_type_str, DOH_REPLACE_ANY); replace_local_types(locals, var, base_name); base_mangle = SwigType_manglestr(base_type); if (index == 1) Replace(s, "$basemangle", base_mangle, DOH_REPLACE_ANY); strcpy(varname, "basemangle"); Replace(s, var, base_mangle, DOH_REPLACE_ANY); Delete(base_mangle); Delete(base_name); Delete(base_type_str); Delete(base_type); lex_type = SwigType_base(rtype); if (index == 1) Replace(s, "$lextype", lex_type, DOH_REPLACE_ANY); strcpy(varname, "lextype"); Replace(s, var, lex_type, DOH_REPLACE_ANY); Delete(lex_type); } /* Replace any $n. with (&n)-> */ { char temp[64]; sprintf(var, "$%d.", index); sprintf(temp, "(&$%d)->", index); Replace(s, var, temp, DOH_REPLACE_ANY); } /* Replace the bare $n variable */ sprintf(var, "$%d", index); bare_substitution_count = Replace(s, var, lname, DOH_REPLACE_NUMBER_END); Delete(ftype); return bare_substitution_count; } /* ------------------------------------------------------------------------ * static typemap_locals() * * Takes a string, a parameter list and a wrapper function argument and * creates the local variables. * ------------------------------------------------------------------------ */ static void typemap_locals(String *s, ParmList *l, Wrapper *f, int argnum) { Parm *p; char *new_name; p = l; while (p) { SwigType *pt = Getattr(p, "type"); SwigType *at = SwigType_alttype(pt, 1); String *pn = Getattr(p, "name"); String *value = Getattr(p, "value"); if (at) pt = at; if (pn) { if (Len(pn) > 0) { String *str; int isglobal = 0; str = NewStringEmpty(); if (strncmp(Char(pn), "_global_", 8) == 0) { isglobal = 1; } /* If the user gave us $type as the name of the local variable, we'll use the passed datatype instead */ if ((argnum >= 0) && (!isglobal)) { Printf(str, "%s%d", pn, argnum); } else { Append(str, pn); } if (isglobal && Wrapper_check_local(f, str)) { p = nextSibling(p); Delete(str); if (at) Delete(at); continue; } if (value) { String *pstr = SwigType_str(pt, str); new_name = Wrapper_new_localv(f, str, pstr, "=", value, NIL); Delete(pstr); } else { String *pstr = SwigType_str(pt, str); new_name = Wrapper_new_localv(f, str, pstr, NIL); Delete(pstr); } if (!isglobal) { /* Substitute */ Replace(s, pn, new_name, DOH_REPLACE_ID | DOH_REPLACE_NOQUOTE); } Delete(str); } } p = nextSibling(p); if (at) Delete(at); } } /* ----------------------------------------------------------------------------- * typemap_warn() * * If any warning message is attached to this parameter's "tmap::warning" * attribute, return the warning message (special variables will need expanding * before displaying the warning). * ----------------------------------------------------------------------------- */ static String *typemap_warn(const_String_or_char_ptr tmap_method, Parm *p) { String *temp = NewStringf("%s:warning", tmap_method); String *w = Getattr(p, typemap_method_name(temp)); Delete(temp); return w ? Copy(w) : 0; } /* ----------------------------------------------------------------------------- * Swig_typemap_lookup() * * Attach one or more typemaps to a node and optionally generate the typemap contents * into the wrapper. * * Looks for a typemap matching the given type and name and attaches the typemap code * and any typemap attributes to the provided node. * * The node should contain the "type" and "name" attributes for the typemap match on. * input. The typemap code and typemap attribute values are attached onto the node * prefixed with "tmap:". For example with tmap_method="in", the typemap code can be retrieved * with a call to Getattr(node, "tmap:in") (this is also the string returned) and the * "noblock" attribute can be retrieved with a call to Getattr(node, "tmap:in:noblock"). * * tmap_method - typemap method, eg "in", "out", "newfree" * node - the node to attach the typemap and typemap attributes to * lname - name of variable to substitute $1, $2 etc for * f - wrapper code to generate into if non null * actioncode - code to generate into f before the out typemap code, unless * the optimal attribute is set in the out typemap in which case * $1 in the out typemap will be replaced by the code in actioncode. * ----------------------------------------------------------------------------- */ static String *Swig_typemap_lookup_impl(const_String_or_char_ptr tmap_method, Node *node, const_String_or_char_ptr lname, Wrapper *f, String *actioncode) { SwigType *type; SwigType *mtype = 0; String *pname; String *qpname = 0; String *noscope_pname = 0; Hash *tm = 0; String *s = 0; String *sdef = 0; String *warning = 0; ParmList *locals; ParmList *kw; char temp[256]; String *symname; String *cname = 0; String *clname = 0; char *cmethod = Char(tmap_method); int optimal_attribute = 0; int optimal_substitution = 0; int delete_optimal_attribute = 0; int num_substitutions = 0; SwigType *matchtype = 0; type = Getattr(node, "type"); if (!type) return sdef; /* Special hook (hack!). Check for the 'ref' feature and add code it contains to any 'newfree' typemap code. * We could choose to put this hook into a number of different typemaps, not necessarily 'newfree'... * Rather confusingly 'newfree' is used to release memory and the 'ref' feature is used to add in memory references - yuck! */ if (Cmp(tmap_method, "newfree") == 0) { String *base = SwigType_base(type); Node *typenode = Swig_symbol_clookup(base, 0); if (typenode) sdef = Swig_ref_call(typenode, lname); Delete(base); } pname = Getattr(node, "name"); noscope_pname = Copy(pname); if (pname && Getattr(node, "sym:symtab")) { /* Add on a qualified name search for any symbol in the symbol table, for example: * struct Foo { * int *foo(int bar) -> Foo::foo * }; * Note that if node is a parameter (Parm *) then there will be no symbol table attached to the Parm *. */ String *qsn; if (Swig_scopename_check(pname)) { /* sometimes pname is qualified, so we remove all the scope for the lookup */ Delete(noscope_pname); noscope_pname = Swig_scopename_last(pname); /* Printf(stdout, "Removed scope: %s => %s\n", pname, noscope_pname); */ } qsn = Swig_symbol_qualified(node); if (qsn && Len(qsn)) { qpname = NewStringf("%s::%s", qsn, noscope_pname); Delete(qsn); } } tm = typemap_search(tmap_method, type, noscope_pname, qpname, &mtype, node); if (typemap_search_debug) debug_search_result_display(tm); if (typemaps_used_debug && tm) { String *typestr = SwigType_str(type, qpname ? qpname : pname); Swig_diagnostic(Getfile(node), Getline(node), "Typemap for %s (%s) : %%%s\n", typestr, tmap_method, Getattr(tm, "source")); assert(Getfile(node) && Len(Getfile(node)) > 0); /* Missing file and line numbering information */ Delete(typestr); } Delete(qpname); qpname = 0; Delete(noscope_pname); noscope_pname = 0; if (!tm) return sdef; s = Getattr(tm, "code"); if (!s) return sdef; /* Empty typemap. No match */ if (Cmp(s, "pass") == 0) return sdef; s = Copy(s); /* Make a local copy of the typemap code */ /* Look in the "out" typemap for the "optimal" attribute */ if (Cmp(cmethod, "out") == 0) { kw = Getattr(tm, "kwargs"); while (kw) { if (Cmp(Getattr(kw, "name"), "optimal") == 0) { optimal_attribute = GetFlag(kw, "value"); break; } kw = nextSibling(kw); } } if (optimal_attribute) { /* Note: "out" typemap is the only typemap that will have the "optimal" attribute set. * If f and actioncode are NULL, then the caller is just looking to attach the "out" attributes * ie, not use the typemap code, otherwise both f and actioncode must be non null. */ if (actioncode) { const String *result_equals = NewStringf("%s = ", Swig_cresult_name()); clname = Copy(actioncode); /* check that the code in the typemap can be used in this optimal way. * The code should be in the form "result = ...;\n". We need to extract * the "..." part. This may not be possible for various reasons, eg * code added by %exception. This optimal code generation is bit of a * hack and circumvents the normal requirement for a temporary variable * to hold the result returned from a wrapped function call. */ if (Strncmp(clname, result_equals, 9) == 0) { int numreplacements = Replace(clname, result_equals, "", DOH_REPLACE_ID_BEGIN); if (numreplacements == 1) { numreplacements = Replace(clname, ";\n", "", DOH_REPLACE_ID_END); if (numreplacements == 1) { if (Strchr(clname, ';') == 0) { lname = clname; actioncode = 0; optimal_substitution = 1; } } } } if (!optimal_substitution) { Swig_warning(WARN_TYPEMAP_OUT_OPTIMAL_IGNORED, Getfile(node), Getline(node), "Method %s usage of the optimal attribute ignored\n", Swig_name_decl(node)); Swig_warning(WARN_TYPEMAP_OUT_OPTIMAL_IGNORED, Getfile(s), Getline(s), "in the out typemap as the following cannot be used to generate optimal code: %s\n", clname); delete_optimal_attribute = 1; } } else { assert(!f); } } if (actioncode) { assert(f); Append(f->code, actioncode); } /* emit local variables declared in typemap, eg emit declarations for aa and bb in: * %typemap(in) foo (int aa, int bb) "..." */ locals = Getattr(tm, "locals"); if (locals) locals = CopyParmList(locals); if (pname) { if (SwigType_istemplate(pname)) { cname = SwigType_namestr(pname); pname = cname; } } if (SwigType_istemplate((char *) lname)) { clname = SwigType_namestr((char *) lname); lname = clname; } matchtype = mtype && SwigType_isarray(mtype) ? mtype : type; num_substitutions = typemap_replace_vars(s, locals, matchtype, type, pname, (char *) lname, 1); if (optimal_substitution && num_substitutions > 1) { Swig_warning(WARN_TYPEMAP_OUT_OPTIMAL_MULTIPLE, Getfile(node), Getline(node), "Multiple calls to %s might be generated due to\n", Swig_name_decl(node)); Swig_warning(WARN_TYPEMAP_OUT_OPTIMAL_MULTIPLE, Getfile(s), Getline(s), "optimal attribute usage in the out typemap.\n"); } if (locals && f) { typemap_locals(s, locals, f, -1); } { ParmList *parm_sublist = NewParmWithoutFileLineInfo(type, pname); Setattr(parm_sublist, "lname", lname); replace_embedded_typemap(s, parm_sublist, f, tm); Delete(parm_sublist); } /* Attach kwargs - ie the typemap attributes */ kw = Getattr(tm, "kwargs"); while (kw) { String *value = Copy(Getattr(kw, "value")); String *kwtype = Getattr(kw, "type"); char *ckwname = Char(Getattr(kw, "name")); { /* Expand special variables in typemap attributes. */ SwigType *ptype = Getattr(node, "type"); String *pname = Getattr(node, "name"); SwigType *mtype = Getattr(node, "tmap:match"); SwigType *matchtype = mtype ? mtype : ptype; ParmList *parm_sublist; typemap_replace_vars(value, NULL, matchtype, ptype, pname, (char *)lname, 1); /* Expand special variable macros (embedded typemaps) in typemap attributes. */ parm_sublist = NewParmWithoutFileLineInfo(ptype, pname); Setattr(parm_sublist, "lname", lname); replace_embedded_typemap(value, parm_sublist, NULL, tm); Delete(parm_sublist); } if (kwtype) { String *mangle = Swig_string_mangle(kwtype); Append(value, mangle); Delete(mangle); } sprintf(temp, "%s:%s", cmethod, ckwname); Setattr(node, typemap_method_name(temp), value); Delete(value); kw = nextSibling(kw); } if (delete_optimal_attribute) Delattr(node, "tmap:out:optimal"); Replace(s, "$name", pname, DOH_REPLACE_ANY); symname = Getattr(node, "sym:name"); if (symname) Replace(s, "$symname", symname, DOH_REPLACE_ANY); Setattr(node, typemap_method_name(tmap_method), s); if (locals) { sprintf(temp, "%s:locals", cmethod); Setattr(node, typemap_method_name(temp), locals); Delete(locals); } if (Checkattr(tm, "type", "SWIGTYPE")) { sprintf(temp, "%s:SWIGTYPE", cmethod); Setattr(node, typemap_method_name(temp), "1"); } /* Print warnings, if any */ warning = typemap_warn(cmethod, node); if (warning) { typemap_replace_vars(warning, 0, matchtype, type, pname, (char *) lname, 1); Replace(warning, "$name", pname, DOH_REPLACE_ANY); if (symname) Replace(warning, "$symname", symname, DOH_REPLACE_ANY); Swig_warning(0, Getfile(node), Getline(node), "%s\n", warning); Delete(warning); } /* Look for code fragments */ { String *fragment; sprintf(temp, "%s:fragment", cmethod); fragment = Getattr(node, typemap_method_name(temp)); if (fragment) { String *fname = Copy(fragment); Setfile(fname, Getfile(node)); Setline(fname, Getline(node)); Swig_fragment_emit(fname); Delete(fname); } } Delete(cname); Delete(clname); Delete(mtype); if (sdef) { /* put 'ref' and 'newfree' codes together */ String *p = NewStringf("%s\n%s", sdef, s); Delete(s); Delete(sdef); s = p; } Delete(actioncode); return s; } String *Swig_typemap_lookup_out(const_String_or_char_ptr tmap_method, Node *node, const_String_or_char_ptr lname, Wrapper *f, String *actioncode) { assert(actioncode); assert(Cmp(tmap_method, "out") == 0); return Swig_typemap_lookup_impl(tmap_method, node, lname, f, actioncode); } String *Swig_typemap_lookup(const_String_or_char_ptr tmap_method, Node *node, const_String_or_char_ptr lname, Wrapper *f) { return Swig_typemap_lookup_impl(tmap_method, node, lname, f, 0); } /* ----------------------------------------------------------------------------- * typemap_attach_kwargs() * * If this hash (tm) contains a linked list of parameters under its "kwargs" * attribute, add keys for each of those named keyword arguments to this * parameter for later use. * For example, attach the typemap attributes to firstp (first parameter in parameter list): * %typemap(in, foo="xyz") ... * A new attribute called "tmap:in:foo" with value "xyz" is attached to firstp. * Also expands special variables and special variable macros in the typemap attributes. * ----------------------------------------------------------------------------- */ static void typemap_attach_kwargs(Hash *tm, const_String_or_char_ptr tmap_method, Parm *firstp, int nmatch) { String *temp = NewStringEmpty(); Parm *kw = Getattr(tm, "kwargs"); while (kw) { String *value = Copy(Getattr(kw, "value")); String *type = Getattr(kw, "type"); int i; Parm *p = firstp; /* Expand special variables */ for (i = 0; i < nmatch; i++) { SwigType *type = Getattr(p, "type"); String *pname = Getattr(p, "name"); String *lname = Getattr(p, "lname"); SwigType *mtype = Getattr(p, "tmap:match"); SwigType *matchtype = mtype ? mtype : type; typemap_replace_vars(value, NULL, matchtype, type, pname, lname, i + 1); p = nextSibling(p); } /* Expand special variable macros (embedded typemaps). * Special variable are expanded first above as they might be used in the special variable macros. * For example: $typemap(imtype, $2_type). */ p = firstp; for (i = 0; i < nmatch; i++) { SwigType *type = Getattr(p, "type"); String *pname = Getattr(p, "name"); String *lname = Getattr(p, "lname"); ParmList *parm_sublist = NewParmWithoutFileLineInfo(type, pname); Setattr(parm_sublist, "lname", lname); replace_embedded_typemap(value, parm_sublist, NULL, tm); p = nextSibling(p); } if (type) { Hash *v = NewHash(); Setattr(v, "type", type); Setattr(v, "value", value); Delete(value); value = v; } Clear(temp); Printf(temp, "%s:%s", tmap_method, Getattr(kw, "name")); Setattr(firstp, typemap_method_name(temp), value); Delete(value); kw = nextSibling(kw); } Clear(temp); Printf(temp, "%s:match_type", tmap_method); Setattr(firstp, typemap_method_name(temp), Getattr(tm, "type")); Delete(temp); } static void typemap_emit_code_fragments(const_String_or_char_ptr tmap_method, Parm *p) { String *temp = NewStringf("%s:fragment", tmap_method); String *f = Getattr(p, typemap_method_name(temp)); if (f) { String *fname = Copy(f); Setfile(fname, Getfile(p)); Setline(fname, Getline(p)); Swig_fragment_emit(fname); Delete(fname); } Delete(temp); } static String *typemap_get_option(Hash *tm, const_String_or_char_ptr name) { Parm *kw = Getattr(tm, "kwargs"); while (kw) { String *kname = Getattr(kw, "name"); if (Equal(kname, name)) { return Getattr(kw, "value"); } kw = nextSibling(kw); } return 0; } /* ----------------------------------------------------------------------------- * Swig_typemap_attach_parms() * * Given a parameter list, this function attaches all of the typemaps and typemap * attributes to the parameter for each type in the parameter list. * * This function basically provides the typemap code and typemap attribute values as * attributes on each parameter prefixed with "tmap:". For example with tmap_method="in", the typemap * code can be retrieved for the first parameter with a call to Getattr(parm, "tmap:in") * and the "numinputs" attribute can be retrieved with a call to Getattr(parm, "tmap:in:numinputs"). * * tmap_method - typemap method, eg "in", "out", "newfree" * parms - parameter list to attach each typemap and all typemap attributes * f - wrapper code to generate into if non null * ----------------------------------------------------------------------------- */ void Swig_typemap_attach_parms(const_String_or_char_ptr tmap_method, ParmList *parms, Wrapper *f) { Parm *p, *firstp; Hash *tm; int nmatch = 0; int i; String *s; String *warning = 0; ParmList *locals; int argnum = 0; char temp[256]; char *cmethod = Char(tmap_method); String *kwmatch = 0; p = parms; #ifdef SWIG_DEBUG Printf(stdout, "Swig_typemap_attach_parms: %s\n", tmap_method); #endif while (p) { argnum++; nmatch = 0; #ifdef SWIG_DEBUG Printf(stdout, "parms: %s %s %s\n", tmap_method, Getattr(p, "name"), Getattr(p, "type")); #endif tm = typemap_search_multi(tmap_method, p, &nmatch); #ifdef SWIG_DEBUG if (tm) Printf(stdout, "found: %s\n", tm); #endif if (!tm) { p = nextSibling(p); continue; } /* Check if the typemap requires to match the type of another typemap, for example: %typemap(in) SWIGTYPE * (int var) {...} %typemap(freearg,match="in") SWIGTYPE * {if (var$argnum) ...} here, the freearg typemap requires the "in" typemap to match, or the 'var$argnum' variable will not exist. */ kwmatch = typemap_get_option(tm, "match"); if (kwmatch) { String *tmname = NewStringf("tmap:%s", kwmatch); String *tmin = Getattr(p, tmname); Delete(tmname); #ifdef SWIG_DEBUG if (tm) Printf(stdout, "matching: %s\n", kwmatch); #endif if (tmin) { String *tmninp = NewStringf("tmap:%s:numinputs", kwmatch); String *ninp = Getattr(p, tmninp); Delete(tmninp); if (ninp && Equal(ninp, "0")) { p = nextSibling(p); continue; } else { SwigType *typetm = Getattr(tm, "type"); String *temp = NewStringf("tmap:%s:match_type", kwmatch); SwigType *typein = Getattr(p, temp); Delete(temp); if (!Equal(typein, typetm)) { p = nextSibling(p); continue; } else { int nnmatch; Hash *tmapin = typemap_search_multi(kwmatch, p, &nnmatch); String *tmname = Getattr(tm, "pname"); String *tnname = Getattr(tmapin, "pname"); if (!(tmname && tnname && Equal(tmname, tnname)) && !(!tmname && !tnname)) { p = nextSibling(p); continue; } } } } else { p = nextSibling(p); continue; } } s = Getattr(tm, "code"); if (!s) { p = nextSibling(p); continue; } #ifdef SWIG_DEBUG if (s) Printf(stdout, "code: %s\n", s); #endif /* Empty typemap. No match */ if (Cmp(s, "pass") == 0) { p = nextSibling(p); continue; } s = Copy(s); locals = Getattr(tm, "locals"); if (locals) locals = CopyParmList(locals); firstp = p; #ifdef SWIG_DEBUG Printf(stdout, "nmatch: %d\n", nmatch); #endif for (i = 0; i < nmatch; i++) { SwigType *type = Getattr(p, "type"); String *pname = Getattr(p, "name"); String *lname = Getattr(p, "lname"); SwigType *mtype = Getattr(p, "tmap:match"); SwigType *matchtype = mtype ? mtype : type; typemap_replace_vars(s, locals, matchtype, type, pname, lname, i + 1); if (mtype) Delattr(p, "tmap:match"); if (Checkattr(tm, "type", "SWIGTYPE")) { sprintf(temp, "%s:SWIGTYPE", cmethod); Setattr(p, typemap_method_name(temp), "1"); } p = nextSibling(p); } if (locals && f) { typemap_locals(s, locals, f, argnum); } replace_embedded_typemap(s, firstp, f, tm); /* Attach attributes to object */ #ifdef SWIG_DEBUG Printf(stdout, "attach: %s %s %s\n", Getattr(firstp, "name"), typemap_method_name(tmap_method), s); #endif Setattr(firstp, typemap_method_name(tmap_method), s); /* Code object */ if (locals) { sprintf(temp, "%s:locals", cmethod); Setattr(firstp, typemap_method_name(temp), locals); Delete(locals); } /* Attach a link to the next parameter. Needed for multimaps */ sprintf(temp, "%s:next", cmethod); Setattr(firstp, typemap_method_name(temp), p); /* Attach kwargs */ typemap_attach_kwargs(tm, tmap_method, firstp, nmatch); /* Replace the argument number */ sprintf(temp, "%d", argnum); Replace(s, "$argnum", temp, DOH_REPLACE_ANY); /* Print warnings, if any */ warning = typemap_warn(tmap_method, firstp); if (warning) { SwigType *type = Getattr(firstp, "type"); String *pname = Getattr(firstp, "name"); String *lname = Getattr(firstp, "lname"); SwigType *mtype = Getattr(firstp, "tmap:match"); SwigType *matchtype = mtype ? mtype : type; typemap_replace_vars(warning, 0, matchtype, type, pname, lname, 1); Replace(warning, "$argnum", temp, DOH_REPLACE_ANY); Swig_warning(0, Getfile(firstp), Getline(firstp), "%s\n", warning); Delete(warning); } /* Look for code fragments */ typemap_emit_code_fragments(tmap_method, firstp); /* increase argnum to consider numinputs */ argnum += nmatch - 1; Delete(s); #ifdef SWIG_DEBUG Printf(stdout, "res: %s %s %s\n", Getattr(firstp, "name"), typemap_method_name(tmap_method), Getattr(firstp, typemap_method_name(tmap_method))); #endif } #ifdef SWIG_DEBUG Printf(stdout, "Swig_typemap_attach_parms: end\n"); #endif } /* Splits the arguments of an embedded typemap */ static List *split_embedded_typemap(String *s) { List *args = 0; char *c, *start; int level = 0; int angle_level = 0; int leading = 1; args = NewList(); c = strchr(Char(s), '('); assert(c); c++; start = c; while (*c) { if (*c == '\"') { c++; while (*c) { if (*c == '\\') { c++; } else { if (*c == '\"') break; } c++; } } if ((level == 0) && angle_level == 0 && ((*c == ',') || (*c == ')'))) { String *tmp = NewStringWithSize(start, (int)(c - start)); Append(args, tmp); Delete(tmp); start = c + 1; leading = 1; if (*c == ')') break; c++; continue; } if (*c == '(') level++; if (*c == ')') level--; if (*c == '<') angle_level++; if (*c == '>') angle_level--; if (isspace((int) *c) && leading) start++; if (!isspace((int) *c)) leading = 0; c++; } return args; } /* ----------------------------------------------------------------------------- * Swig_typemap_replace_embedded_typemap() * * For special variable macro $typemap(...) expansion outside of typemaps. * Only limited usage works as most typemap special variables ($1, $input etc) * are not expanded correctly outside of typemaps. * ----------------------------------------------------------------------------- */ void Swig_typemap_replace_embedded_typemap(String *s, Node *file_line_node) { Setfile(s, Getfile(file_line_node)); Setline(s, Getline(file_line_node)); Replaceall(s, "$typemap", "$TYPEMAP"); replace_embedded_typemap(s, 0, 0, file_line_node); } /* ----------------------------------------------------------------------------- * replace_embedded_typemap() * * This function replaces the special variable macro $typemap(...) with typemap * code. The general form of $typemap is as follows: * * $typemap(method, typelist, var1=value, var2=value, ...) * * where varx parameters are optional and undocumented; they were used in an earlier version of $typemap. * A search is made using the typemap matching rules of form: * * %typemap(method) typelist {...} * * and if found will substitute in the typemap contents, making appropriate variable replacements. * * For example: * $typemap(in, int) # simple usage matching %typemap(in) int { ... } * $typemap(in, int b) # simple usage matching %typemap(in) int b { ... } or above %typemap * $typemap(in, (Foo a, int b)) # multi-argument typemap matching %typemap(in) (Foo a, int b) {...} * ----------------------------------------------------------------------------- */ static void replace_embedded_typemap(String *s, ParmList *parm_sublist, Wrapper *f, Node *file_line_node) { char *start = 0; while ((start = strstr(Char(s), "$TYPEMAP("))) { /* note $typemap capitalisation to $TYPEMAP hack */ /* Gather the parameters */ char *end = 0, *c; int level = 0; String *dollar_typemap; int syntax_error = 1; c = start; while (*c) { if (*c == '(') level++; if (*c == ')') { level--; if (level == 0) { end = c + 1; break; } } c++; } if (end) { dollar_typemap = NewStringWithSize(start, (int)((end - start))); syntax_error = 0; } else { dollar_typemap = NewStringWithSize(start, (int)((c - start))); } if (!syntax_error) { List *l; String *tmap_method; Hash *vars; syntax_error = 1; /* Split apart each parameter in $typemap(...) */ l = split_embedded_typemap(dollar_typemap); if (Len(l) >= 2) { ParmList *to_match_parms; tmap_method = Getitem(l, 0); /* the second parameter might contain multiple sub-parameters for multi-argument * typemap matching, so split these parameters apart */ to_match_parms = Swig_cparse_parms(Getitem(l, 1), file_line_node); if (to_match_parms) { Parm *p = to_match_parms; Parm *sub_p = parm_sublist; String *empty_string = NewStringEmpty(); String *lname = empty_string; while (p) { if (sub_p) { lname = Getattr(sub_p, "lname"); sub_p = nextSibling(sub_p); } Setattr(p, "lname", lname); p = nextSibling(p); } Delete(empty_string); } /* process optional extra parameters - the variable replacements (undocumented) */ vars = NewHash(); { int i, ilen; ilen = Len(l); for (i = 2; i < ilen; i++) { String *parm = Getitem(l, i); char *eq = strchr(Char(parm), '='); char *c = Char(parm); if (eq && (eq - c > 0)) { String *name = NewStringWithSize(c, (int)(eq - c)); String *value = NewString(eq + 1); Insert(name, 0, "$"); Setattr(vars, name, value); } else { to_match_parms = 0; /* error - variable replacement parameters must be of form varname=value */ } } } /* Perform a typemap search */ if (to_match_parms) { static int already_substituting = 0; String *tm; String *attr; int match = 0; #ifdef SWIG_DEBUG Printf(stdout, "Swig_typemap_attach_parms: embedded\n"); #endif if (already_substituting < 10) { already_substituting++; if ((in_typemap_search_multi == 0) && typemap_search_debug) { String *dtypemap = NewString(dollar_typemap); Replaceall(dtypemap, "$TYPEMAP", "$typemap"); Printf(stdout, " Containing: %s\n", dtypemap); Delete(dtypemap); } Swig_typemap_attach_parms(tmap_method, to_match_parms, f); already_substituting--; /* Look for the typemap code */ attr = NewStringf("tmap:%s", tmap_method); tm = Getattr(to_match_parms, attr); if (tm) { Printf(attr, "%s", ":next"); /* fail if multi-argument lookup requested in $typemap(...) and the lookup failed */ if (!Getattr(to_match_parms, attr)) { /* Replace parameter variables */ Iterator ki; for (ki = First(vars); ki.key; ki = Next(ki)) { Replace(tm, ki.key, ki.item, DOH_REPLACE_ANY); } /* offer the target language module the chance to make special variable substitutions */ Language_replace_special_variables(tmap_method, tm, to_match_parms); /* finish up - do the substitution */ Replace(s, dollar_typemap, tm, DOH_REPLACE_ANY); Delete(tm); match = 1; } } if (!match) { String *dtypemap = NewString(dollar_typemap); Replaceall(dtypemap, "$TYPEMAP", "$typemap"); Swig_error(Getfile(s), Getline(s), "No typemap found for %s\n", dtypemap); Delete(dtypemap); } Delete(attr); } else { /* Simple recursive call check to prevent infinite recursion - this strategy only allows a limited * number of calls by a embedded typemaps to other embedded typemaps though */ String *dtypemap = NewString(dollar_typemap); Replaceall(dtypemap, "$TYPEMAP", "$typemap"); Swig_error(Getfile(s), Getline(s), "Likely recursive $typemap calls containing %s. Use -debug-tmsearch to debug.\n", dtypemap); Delete(dtypemap); } syntax_error = 0; } Delete(vars); } Delete(l); } if (syntax_error) { String *dtypemap = NewString(dollar_typemap); Replaceall(dtypemap, "$TYPEMAP", "$typemap"); Swig_error(Getfile(s), Getline(s), "Syntax error in: %s\n", dtypemap); Delete(dtypemap); } Replace(s, dollar_typemap, "", DOH_REPLACE_ANY); Delete(dollar_typemap); } } /* ----------------------------------------------------------------------------- * Swig_typemap_debug() * * Display all typemaps * ----------------------------------------------------------------------------- */ void Swig_typemap_debug() { int nesting_level = 2; Printf(stdout, "---[ typemaps ]--------------------------------------------------------------\n"); Swig_print(typemaps, nesting_level); Printf(stdout, "-----------------------------------------------------------------------------\n"); } /* ----------------------------------------------------------------------------- * Swig_typemap_search_debug_set() * * Turn on typemap searching debug display * ----------------------------------------------------------------------------- */ void Swig_typemap_search_debug_set(void) { typemap_search_debug = 1; } /* ----------------------------------------------------------------------------- * Swig_typemap_used_debug_set() * * Turn on typemaps used debug display * ----------------------------------------------------------------------------- */ void Swig_typemap_used_debug_set(void) { typemaps_used_debug = 1; } /* ----------------------------------------------------------------------------- * Swig_typemap_register_debug_set() * * Turn on typemaps used debug display * ----------------------------------------------------------------------------- */ void Swig_typemap_register_debug_set(void) { typemap_register_debug = 1; } swig-4.0.2/Source/Swig/include.c0000644000175000017500000002616613667507523016335 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * include.c * * The functions in this file are used to manage files in the SWIG library. * General purpose functions for opening, including, and retrieving pathnames * are provided. * ----------------------------------------------------------------------------- */ #include "swig.h" static List *directories = 0; /* List of include directories */ static String *lastpath = 0; /* Last file that was included */ static List *pdirectories = 0; /* List of pushed directories */ static int dopush = 1; /* Whether to push directories */ static int file_debug = 0; /* This functions determine whether to push/pop dirs in the preprocessor */ void Swig_set_push_dir(int push) { dopush = push; } int Swig_get_push_dir(void) { return dopush; } /* ----------------------------------------------------------------------------- * Swig_add_directory() * * Adds a directory to the SWIG search path. * ----------------------------------------------------------------------------- */ List *Swig_add_directory(const_String_or_char_ptr dirname) { String *adirname; if (!directories) directories = NewList(); assert(directories); if (dirname) { adirname = NewString(dirname); Append(directories,adirname); Delete(adirname); } return directories; } /* ----------------------------------------------------------------------------- * Swig_push_directory() * * Inserts a directory at the front of the SWIG search path. This is used by * the preprocessor to grab files in the same directory as other included files. * ----------------------------------------------------------------------------- */ void Swig_push_directory(const_String_or_char_ptr dirname) { String *pdirname; if (!Swig_get_push_dir()) return; if (!pdirectories) pdirectories = NewList(); assert(pdirectories); pdirname = NewString(dirname); assert(pdirname); Insert(pdirectories,0,pdirname); Delete(pdirname); } /* ----------------------------------------------------------------------------- * Swig_pop_directory() * * Pops a directory off the front of the SWIG search path. This is used by * the preprocessor. * ----------------------------------------------------------------------------- */ void Swig_pop_directory(void) { if (!Swig_get_push_dir()) return; if (!pdirectories) return; Delitem(pdirectories, 0); } /* ----------------------------------------------------------------------------- * Swig_last_file() * * Returns the full pathname of the last file opened. * ----------------------------------------------------------------------------- */ String *Swig_last_file(void) { assert(lastpath); return lastpath; } /* ----------------------------------------------------------------------------- * Swig_search_path_any() * * Returns a list of the current search paths. * ----------------------------------------------------------------------------- */ static List *Swig_search_path_any(int syspath) { String *filename; List *slist; int i, ilen; slist = NewList(); assert(slist); filename = NewStringEmpty(); assert(filename); #ifdef MACSWIG Printf(filename, "%s", SWIG_FILE_DELIMITER); #else Printf(filename, ".%s", SWIG_FILE_DELIMITER); #endif Append(slist, filename); Delete(filename); /* If there are any pushed directories. Add them first */ if (pdirectories) { ilen = Len(pdirectories); for (i = 0; i < ilen; i++) { filename = NewString(Getitem(pdirectories,i)); Append(filename,SWIG_FILE_DELIMITER); Append(slist,filename); Delete(filename); } } /* Add system directories next */ ilen = Len(directories); for (i = 0; i < ilen; i++) { filename = NewString(Getitem(directories,i)); Append(filename,SWIG_FILE_DELIMITER); if (syspath) { /* If doing a system include, put the system directories first */ Insert(slist,i,filename); } else { /* Otherwise, just put the system directories after the pushed directories (if any) */ Append(slist,filename); } Delete(filename); } return slist; } List *Swig_search_path() { return Swig_search_path_any(0); } /* ----------------------------------------------------------------------------- * Swig_open() * * open a file, optionally looking for it in the include path. Returns an open * FILE * on success. * ----------------------------------------------------------------------------- */ static FILE *Swig_open_file(const_String_or_char_ptr name, int sysfile, int use_include_path) { FILE *f; String *filename; List *spath = 0; char *cname; int i, ilen, nbytes; char bom[3]; if (!directories) directories = NewList(); assert(directories); cname = Char(name); filename = NewString(cname); assert(filename); if (file_debug) { Printf(stdout, " Open: %s\n", filename); } f = fopen(Char(filename), "r"); if (!f && use_include_path) { spath = Swig_search_path_any(sysfile); ilen = Len(spath); for (i = 0; i < ilen; i++) { Clear(filename); Printf(filename, "%s%s", Getitem(spath, i), cname); f = fopen(Char(filename), "r"); if (f) break; } Delete(spath); } if (f) { Delete(lastpath); lastpath = filename; /* Skip the UTF-8 BOM if it's present */ nbytes = (int)fread(bom, 1, 3, f); if (nbytes == 3 && bom[0] == (char)0xEF && bom[1] == (char)0xBB && bom[2] == (char)0xBF) { /* skip */ } else { fseek(f, 0, SEEK_SET); } } return f; } /* Open a file - searching the include paths to find it */ FILE *Swig_include_open(const_String_or_char_ptr name) { return Swig_open_file(name, 0, 1); } /* Open a file - does not use include paths to find it */ FILE *Swig_open(const_String_or_char_ptr name) { return Swig_open_file(name, 0, 0); } /* ----------------------------------------------------------------------------- * Swig_read_file() * * Reads data from an open FILE * and returns it as a string. * ----------------------------------------------------------------------------- */ String *Swig_read_file(FILE *f) { int len; char buffer[4096]; String *str = NewStringEmpty(); assert(str); while (fgets(buffer, 4095, f)) { Append(str, buffer); } len = Len(str); /* Add a newline if not present on last line -- the preprocessor seems to * rely on \n and not EOF terminating lines */ if (len) { char *cstr = Char(str); if (cstr[len - 1] != '\n') { Append(str, "\n"); } } return str; } /* ----------------------------------------------------------------------------- * Swig_include() * * Opens a file and returns it as a string. * ----------------------------------------------------------------------------- */ static String *Swig_include_any(const_String_or_char_ptr name, int sysfile) { FILE *f; String *str; String *file; f = Swig_open_file(name, sysfile, 1); if (!f) return 0; str = Swig_read_file(f); fclose(f); Seek(str, 0, SEEK_SET); file = Copy(Swig_last_file()); Setfile(str, file); Delete(file); Setline(str, 1); return str; } String *Swig_include(const_String_or_char_ptr name) { return Swig_include_any(name, 0); } String *Swig_include_sys(const_String_or_char_ptr name) { return Swig_include_any(name, 1); } /* ----------------------------------------------------------------------------- * Swig_insert_file() * * Copies the contents of a file into another file * ----------------------------------------------------------------------------- */ int Swig_insert_file(const_String_or_char_ptr filename, File *outfile) { char buffer[4096]; int nbytes; FILE *f = Swig_include_open(filename); if (!f) return -1; while ((nbytes = Read(f, buffer, 4096)) > 0) { Write(outfile, buffer, nbytes); } fclose(f); return 0; } /* ----------------------------------------------------------------------------- * Swig_register_filebyname() * * Register a "named" file with the core. Named files can become targets * for %insert directives and other SWIG operations. This function takes * the place of the f_header, f_wrapper, f_init, and other global variables * in SWIG1.1 * ----------------------------------------------------------------------------- */ static Hash *named_files = 0; void Swig_register_filebyname(const_String_or_char_ptr filename, File *outfile) { if (!named_files) named_files = NewHash(); Setattr(named_files, filename, outfile); } /* ----------------------------------------------------------------------------- * Swig_filebyname() * * Get a named file * ----------------------------------------------------------------------------- */ File *Swig_filebyname(const_String_or_char_ptr filename) { if (!named_files) return 0; return Getattr(named_files, filename); } /* ----------------------------------------------------------------------------- * Swig_file_extension() * * Returns the extension of a file * ----------------------------------------------------------------------------- */ String *Swig_file_extension(const_String_or_char_ptr filename) { String *name = Swig_file_filename(filename); const char *c = strrchr(Char(name), '.'); String *extension = c ? NewString(c) : NewString(""); Delete(name); return extension; } /* ----------------------------------------------------------------------------- * Swig_file_basename() * * Returns the filename with the extension removed. * ----------------------------------------------------------------------------- */ String *Swig_file_basename(const_String_or_char_ptr filename) { String *extension = Swig_file_extension(filename); String *basename = NewStringWithSize(filename, Len(filename) - Len(extension)); Delete(extension); return basename; } /* ----------------------------------------------------------------------------- * Swig_file_filename() * * Return the file name with any leading path stripped off * ----------------------------------------------------------------------------- */ String *Swig_file_filename(const_String_or_char_ptr filename) { const char *delim = SWIG_FILE_DELIMITER; const char *c = strrchr(Char(filename), *delim); return c ? NewString(c + 1) : NewString(filename); } /* ----------------------------------------------------------------------------- * Swig_file_dirname() * * Return the name of the directory associated with a file * ----------------------------------------------------------------------------- */ String *Swig_file_dirname(const_String_or_char_ptr filename) { const char *delim = SWIG_FILE_DELIMITER; const char *c = strrchr(Char(filename), *delim); return c ? NewStringWithSize(filename, (int)(c - Char(filename) + 1)) : NewString(""); } /* * Swig_file_debug() */ void Swig_file_debug_set() { file_debug = 1; } swig-4.0.2/Source/Swig/swigtree.h0000644000175000017500000000450213667507523016536 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigtree.h * * These functions are used to access and manipulate the SWIG parse tree. * The structure of this tree is modeled directly after XML-DOM. The attribute * and function names are meant to be similar. * ----------------------------------------------------------------------------- */ /* Macros to traverse the DOM tree */ #define nodeType(x) Getattr(x,"nodeType") #define parentNode(x) Getattr(x,"parentNode") #define previousSibling(x) Getattr(x,"previousSibling") #define nextSibling(x) Getattr(x,"nextSibling") #define firstChild(x) Getattr(x,"firstChild") #define lastChild(x) Getattr(x,"lastChild") /* Macros to set up the DOM tree (mostly used by the parser) */ #define set_nodeType(x,v) Setattr(x,"nodeType",v) #define set_parentNode(x,v) Setattr(x,"parentNode",v) #define set_previousSibling(x,v) Setattr(x,"previousSibling",v) #define set_nextSibling(x,v) Setattr(x,"nextSibling",v) #define set_firstChild(x,v) Setattr(x,"firstChild",v) #define set_lastChild(x,v) Setattr(x,"lastChild",v) /* Utility functions */ extern int checkAttribute(Node *obj, const_String_or_char_ptr name, const_String_or_char_ptr value); extern void appendChild(Node *node, Node *child); extern void prependChild(Node *node, Node *child); extern void removeNode(Node *node); extern Node *copyNode(Node *node); extern void appendSibling(Node *node, Node *child); /* Node restoration/restore functions */ extern void Swig_require(const char *ns, Node *node, ...); extern void Swig_save(const char *ns, Node *node, ...); extern void Swig_restore(Node *node); /* Debugging of parse trees */ extern void Swig_print_tags(File *obj, Node *root); extern void Swig_print_tree(Node *obj); extern void Swig_print_node(Node *obj); swig-4.0.2/Source/Swig/error.c0000644000175000017500000002410213667507523016027 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * error.c * * Error handling functions. These are used to issue warnings and * error messages. * ----------------------------------------------------------------------------- */ #include "swig.h" #include #include /* ----------------------------------------------------------------------------- * Commentary on the warning filter. * * The warning filter is a string of numbers prefaced by (-) or (+) to * indicate whether or not a warning message is displayed. For example: * * "-304-201-140+210+201" * * The filter string is scanned left to right and the first occurrence * of a warning number is used to determine printing behavior. * * The same number may appear more than once in the string. For example, in the * above string, "201" appears twice. This simply means that warning 201 * was disabled after it was previously enabled. This may only be temporary * setting--the first number may be removed later in which case the warning * is reenabled. * ----------------------------------------------------------------------------- */ #if defined(_WIN32) # define DEFAULT_ERROR_MSG_FORMAT EMF_MICROSOFT #else # define DEFAULT_ERROR_MSG_FORMAT EMF_STANDARD #endif static ErrorMessageFormat msg_format = DEFAULT_ERROR_MSG_FORMAT; static int silence = 0; /* Silent operation */ static String *filter = 0; /* Warning filter */ static int warnall = 0; static int nwarning = 0; static int nerrors = 0; static int init_fmt = 0; static char wrn_wnum_fmt[64]; static char wrn_nnum_fmt[64]; static char err_line_fmt[64]; static char err_eof_fmt[64]; static char diag_line_fmt[64]; static char diag_eof_fmt[64]; static String *format_filename(const_String_or_char_ptr filename); /* ----------------------------------------------------------------------------- * Swig_warning() * * Issue a warning message on stderr. * ----------------------------------------------------------------------------- */ void Swig_warning(int wnum, const_String_or_char_ptr filename, int line, const char *fmt, ...) { String *out; char *msg; int wrn = 1; va_list ap; if (silence) return; if (!init_fmt) Swig_error_msg_format(DEFAULT_ERROR_MSG_FORMAT); va_start(ap, fmt); out = NewStringEmpty(); vPrintf(out, fmt, ap); msg = Char(out); if (isdigit((unsigned char) *msg)) { unsigned long result = strtoul(msg, &msg, 10); if (msg != Char(out)) { msg++; wnum = result; } } /* Check in the warning filter */ if (filter) { char temp[32]; char *c; char *f = Char(filter); sprintf(temp, "%d", wnum); while (*f != '\0' && (c = strstr(f, temp))) { if (*(c - 1) == '-') { wrn = 0; /* Warning disabled */ break; } if (*(c - 1) == '+') { wrn = 1; /* Warning enabled */ break; } f += strlen(temp); } } if (warnall || wrn) { String *formatted_filename = format_filename(filename); String *full_message = NewString(""); if (wnum) { Printf(full_message, wrn_wnum_fmt, formatted_filename, line, wnum); } else { Printf(full_message, wrn_nnum_fmt, formatted_filename, line); } Printf(full_message, "%s", msg); Printv(stderr, full_message, NIL); nwarning++; Delete(full_message); Delete(formatted_filename); } Delete(out); va_end(ap); } /* ----------------------------------------------------------------------------- * Swig_error() * * Issue an error message on stderr. * ----------------------------------------------------------------------------- */ void Swig_error(const_String_or_char_ptr filename, int line, const char *fmt, ...) { va_list ap; String *formatted_filename = NULL; String *full_message = NULL; if (silence) return; if (!init_fmt) Swig_error_msg_format(DEFAULT_ERROR_MSG_FORMAT); va_start(ap, fmt); formatted_filename = format_filename(filename); full_message = NewString(""); if (line > 0) { Printf(full_message, err_line_fmt, formatted_filename, line); } else { Printf(full_message, err_eof_fmt, formatted_filename); } vPrintf(full_message, fmt, ap); Printv(stderr, full_message, NIL); va_end(ap); nerrors++; Delete(full_message); Delete(formatted_filename); } /* ----------------------------------------------------------------------------- * Swig_error_count() * * Returns number of errors received. * ----------------------------------------------------------------------------- */ int Swig_error_count(void) { return nerrors; } /* ----------------------------------------------------------------------------- * Swig_error_silent() * * Set silent flag * ----------------------------------------------------------------------------- */ void Swig_error_silent(int s) { silence = s; } /* ----------------------------------------------------------------------------- * Swig_warnfilter() * * Takes a comma separate list of warning numbers and puts in the filter. * ----------------------------------------------------------------------------- */ void Swig_warnfilter(const_String_or_char_ptr wlist, int add) { char *c; char *cw; String *s; if (!filter) filter = NewStringEmpty(); s = NewString(""); Clear(s); cw = Char(wlist); while (*cw != '\0') { if (*cw != ' ') { Putc(*cw, s); } ++cw; } c = Char(s); c = strtok(c, ", "); while (c) { if (isdigit((int) *c) || (*c == '+') || (*c == '-')) { /* Even if c is a digit, the rest of the string might not be, eg in the case of typemap * warnings (a bit odd really), eg: %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK_MSG) */ if (add) { Insert(filter, 0, c); if (isdigit((int) *c)) { Insert(filter, 0, "-"); } } else { char *temp = (char *)malloc(sizeof(char)*strlen(c) + 2); if (isdigit((int) *c)) { sprintf(temp, "-%s", c); } else { strcpy(temp, c); } Replace(filter, temp, "", DOH_REPLACE_FIRST); free(temp); } } c = strtok(NULL, ", "); } Delete(s); } void Swig_warnall(void) { warnall = 1; } /* ----------------------------------------------------------------------------- * Swig_warn_count() * * Return the number of warnings * ----------------------------------------------------------------------------- */ int Swig_warn_count(void) { return nwarning; } /* ----------------------------------------------------------------------------- * Swig_error_msg_format() * * Set the type of error/warning message display * ----------------------------------------------------------------------------- */ void Swig_error_msg_format(ErrorMessageFormat format) { const char *error = "Error"; const char *warning = "Warning"; const char *fmt_eof = 0; const char *fmt_line = 0; /* here 'format' could be directly a string instead of an enum, but by now a switch is used to translated into one. */ switch (format) { case EMF_MICROSOFT: fmt_line = "%s(%d) "; fmt_eof = "%s(999999) "; /* Is there a special character for EOF? Just use a large number. */ break; case EMF_STANDARD: default: fmt_line = "%s:%d"; fmt_eof = "%s:EOF"; } sprintf(wrn_wnum_fmt, "%s: %s %%d: ", fmt_line, warning); sprintf(wrn_nnum_fmt, "%s: %s: ", fmt_line, warning); sprintf(err_line_fmt, "%s: %s: ", fmt_line, error); sprintf(err_eof_fmt, "%s: %s: ", fmt_eof, error); sprintf(diag_line_fmt, "%s: ", fmt_line); sprintf(diag_eof_fmt, "%s: ", fmt_eof); msg_format = format; init_fmt = 1; } /* ----------------------------------------------------------------------------- * format_filename() * * Remove double backslashes in Windows filename paths for display * ----------------------------------------------------------------------------- */ static String *format_filename(const_String_or_char_ptr filename) { String *formatted_filename = NewString(filename); #if defined(_WIN32) Replaceall(formatted_filename, "\\\\", "\\"); #endif return formatted_filename; } /* ----------------------------------------------------------------------------- * Swig_stringify_with_location() * * Return a string representation of any DOH object with line and file location * information in the appropriate error message format. The string representation * is enclosed within [] brackets after the line and file information. * ----------------------------------------------------------------------------- */ String *Swig_stringify_with_location(DOH *object) { String *str = NewStringEmpty(); if (!init_fmt) Swig_error_msg_format(DEFAULT_ERROR_MSG_FORMAT); if (object) { int line = Getline(object); String *formatted_filename = format_filename(Getfile(object)); if (line > 0) { Printf(str, diag_line_fmt, formatted_filename, line); } else { Printf(str, diag_eof_fmt, formatted_filename); } if (Len(object) == 0) { Printf(str, "[EMPTY]"); } else { Printf(str, "[%s]", object); } Delete(formatted_filename); } else { Printf(str, "[NULL]"); } return str; } /* ----------------------------------------------------------------------------- * Swig_diagnostic() * * Issue a diagnostic message on stdout. * ----------------------------------------------------------------------------- */ void Swig_diagnostic(const_String_or_char_ptr filename, int line, const char *fmt, ...) { va_list ap; String *formatted_filename = NULL; if (!init_fmt) Swig_error_msg_format(DEFAULT_ERROR_MSG_FORMAT); va_start(ap, fmt); formatted_filename = format_filename(filename); if (line > 0) { Printf(stdout, diag_line_fmt, formatted_filename, line); } else { Printf(stdout, diag_eof_fmt, formatted_filename); } vPrintf(stdout, fmt, ap); va_end(ap); Delete(formatted_filename); } swig-4.0.2/Source/Swig/swigopt.h0000644000175000017500000000156713667507523016411 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigopt.h * * Header file for the SWIG command line processing functions * ----------------------------------------------------------------------------- */ extern void Swig_init_args(int argc, char **argv); extern void Swig_mark_arg(int n); extern int Swig_check_marked(int n); extern void Swig_check_options(int check_input); extern void Swig_arg_error(void); swig-4.0.2/Source/Swig/fragment.c0000644000175000017500000001273013667507523016505 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * fragment.c * * This file manages named code fragments. Code fragments are typically * used to hold helper-code that may or may not be included in the wrapper * file (depending on what features are actually used in the interface). * * By using fragments, it's possible to greatly reduce the amount of * wrapper code and to generate cleaner wrapper files. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "swigwarn.h" #include "cparse.h" static Hash *fragments = 0; static Hash *looking_fragments = 0; static int debug = 0; /* ----------------------------------------------------------------------------- * Swig_fragment_register() * * Add a fragment. Use the original Node*, so, if something needs to be * changed, lang.cxx doesn't nedd to be touched again. * ----------------------------------------------------------------------------- */ void Swig_fragment_register(Node *fragment) { if (Getattr(fragment, "emitonly")) { Swig_fragment_emit(fragment); return; } else { String *name = Copy(Getattr(fragment, "value")); String *type = Getattr(fragment, "type"); if (type) { SwigType *rtype = SwigType_typedef_resolve_all(type); String *mangle = Swig_string_mangle(type); Append(name, mangle); Delete(mangle); Delete(rtype); if (debug) Printf(stdout, "register fragment %s %s\n", name, type); } if (!fragments) { fragments = NewHash(); } if (!Getattr(fragments, name)) { String *section = Copy(Getattr(fragment, "section")); String *ccode = Copy(Getattr(fragment, "code")); Hash *kwargs = Getattr(fragment, "kwargs"); Setmeta(ccode, "section", section); if (kwargs) { Setmeta(ccode, "kwargs", kwargs); } Setfile(ccode, Getfile(fragment)); Setline(ccode, Getline(fragment)); /* Replace $descriptor() macros */ Swig_cparse_replace_descriptor(ccode); Setattr(fragments, name, ccode); if (debug) Printf(stdout, "registering fragment %s %s\n", name, section); Delete(section); Delete(ccode); } Delete(name); } } /* ----------------------------------------------------------------------------- * Swig_fragment_emit() * * Emit a fragment * ----------------------------------------------------------------------------- */ static char *char_index(char *str, char c) { while (*str && (c != *str)) ++str; return (c == *str) ? str : 0; } void Swig_fragment_emit(Node *n) { String *code; char *pc, *tok; String *t; String *mangle = 0; String *name = 0; String *type = 0; name = Getattr(n, "value"); if (!name) { name = n; } if (!fragments) { Swig_warning(WARN_FRAGMENT_NOT_FOUND, Getfile(n), Getline(n), "Fragment '%s' not found.\n", name); return; } type = Getattr(n, "type"); if (type) { mangle = Swig_string_mangle(type); } if (debug) Printf(stdout, "looking fragment %s %s\n", name, type); t = Copy(name); tok = Char(t); pc = char_index(tok, ','); if (pc) *pc = 0; while (tok) { String *name = NewString(tok); if (mangle) Append(name, mangle); if (looking_fragments && Getattr(looking_fragments, name)) { return; } code = Getattr(fragments, name); if (debug) Printf(stdout, "looking subfragment %s\n", name); if (code && (Strcmp(code, "ignore") != 0)) { String *section = Getmeta(code, "section"); Hash *nn = Getmeta(code, "kwargs"); if (!looking_fragments) looking_fragments = NewHash(); Setattr(looking_fragments, name, "1"); while (nn) { if (Equal(Getattr(nn, "name"), "fragment")) { if (debug) Printf(stdout, "emitting fragment %s %s\n", nn, type); Setfile(nn, Getfile(n)); Setline(nn, Getline(n)); Swig_fragment_emit(nn); } nn = nextSibling(nn); } if (section) { File *f = Swig_filebyname(section); if (!f) { Swig_error(Getfile(code), Getline(code), "Bad section '%s' in %%fragment declaration for code fragment '%s'\n", section, name); } else { if (debug) Printf(stdout, "emitting subfragment %s %s\n", name, section); if (debug) Printf(f, "/* begin fragment %s */\n", name); Printf(f, "%s\n", code); if (debug) Printf(f, "/* end fragment %s */\n\n", name); Setattr(fragments, name, "ignore"); Delattr(looking_fragments, name); } } } else if (!code && type) { SwigType *rtype = SwigType_typedef_resolve_all(type); if (!Equal(type, rtype)) { String *name = Copy(Getattr(n, "value")); String *mangle = Swig_string_mangle(type); Append(name, mangle); Setfile(name, Getfile(n)); Setline(name, Getline(n)); Swig_fragment_emit(name); Delete(mangle); Delete(name); } Delete(rtype); } if (!code) { Swig_warning(WARN_FRAGMENT_NOT_FOUND, Getfile(n), Getline(n), "Fragment '%s' not found.\n", name); } tok = pc ? pc + 1 : 0; if (tok) { pc = char_index(tok, ','); if (pc) *pc = 0; } Delete(name); } Delete(t); } swig-4.0.2/Source/Swig/scanner.c0000644000175000017500000013125213667507523016334 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * scanner.c * * This file implements a general purpose C/C++ compatible lexical scanner. * This scanner isn't intended to be plugged directly into a parser built * with yacc. Rather, it contains a lot of generic code that could be used * to easily construct yacc-compatible scanners. * ----------------------------------------------------------------------------- */ #include "swig.h" #include extern String *cparse_file; extern int cparse_line; extern int cparse_cplusplus; extern int cparse_start_line; struct Scanner { String *text; /* Current token value */ List *scanobjs; /* Objects being scanned */ String *str; /* Current object being scanned */ char *idstart; /* Optional identifier start characters */ int nexttoken; /* Next token to be returned */ int start_line; /* Starting line of certain declarations */ int line; int yylen; /* Length of text pushed into text */ String *file; String *error; /* Last error message (if any) */ int error_line; /* Error line number */ int freeze_line; /* Suspend line number updates */ List *brackets; /* Current level of < > brackets on each level */ }; typedef struct Locator { String *filename; int line_number; struct Locator *next; } Locator; static int follow_locators = 0; static void brackets_push(Scanner *); static void brackets_clear(Scanner *); /* ----------------------------------------------------------------------------- * NewScanner() * * Create a new scanner object * ----------------------------------------------------------------------------- */ Scanner *NewScanner(void) { Scanner *s; s = (Scanner *) malloc(sizeof(Scanner)); s->line = 1; s->file = 0; s->nexttoken = -1; s->start_line = 1; s->yylen = 0; s->idstart = NULL; s->scanobjs = NewList(); s->text = NewStringEmpty(); s->str = 0; s->error = 0; s->error_line = 0; s->freeze_line = 0; s->brackets = NewList(); brackets_push(s); return s; } /* ----------------------------------------------------------------------------- * DelScanner() * * Delete a scanner object. * ----------------------------------------------------------------------------- */ void DelScanner(Scanner *s) { assert(s); Delete(s->scanobjs); Delete(s->brackets); Delete(s->text); Delete(s->file); Delete(s->error); Delete(s->str); free(s->idstart); free(s); } /* ----------------------------------------------------------------------------- * Scanner_clear() * * Clear the contents of a scanner object. * ----------------------------------------------------------------------------- */ void Scanner_clear(Scanner *s) { assert(s); Delete(s->str); Clear(s->text); Clear(s->scanobjs); brackets_clear(s); Delete(s->error); s->str = 0; s->error = 0; s->line = 1; s->nexttoken = -1; s->start_line = 0; s->yylen = 0; /* Should these be cleared too? s->idstart; s->file; s->error_line; s->freeze_line; */ } /* ----------------------------------------------------------------------------- * Scanner_push() * * Push some new text into the scanner. The scanner will start parsing this text * immediately before returning to the old text. * ----------------------------------------------------------------------------- */ void Scanner_push(Scanner *s, String *txt) { assert(s && txt); Push(s->scanobjs, txt); if (s->str) { Setline(s->str,s->line); Delete(s->str); } s->str = txt; DohIncref(s->str); s->line = Getline(txt); } /* ----------------------------------------------------------------------------- * Scanner_pushtoken() * * Push a token into the scanner. This token will be returned on the next * call to Scanner_token(). * ----------------------------------------------------------------------------- */ void Scanner_pushtoken(Scanner *s, int nt, const_String_or_char_ptr val) { assert(s); assert((nt >= 0) && (nt < SWIG_MAXTOKENS)); s->nexttoken = nt; if ( Char(val) != Char(s->text) ) { Clear(s->text); Append(s->text,val); } } /* ----------------------------------------------------------------------------- * Scanner_set_location() * * Set the file and line number location of the scanner. * ----------------------------------------------------------------------------- */ void Scanner_set_location(Scanner *s, String *file, int line) { Setline(s->str, line); Setfile(s->str, file); s->line = line; } /* ----------------------------------------------------------------------------- * Scanner_file() * * Get the current file. * ----------------------------------------------------------------------------- */ String *Scanner_file(Scanner *s) { return Getfile(s->str); } /* ----------------------------------------------------------------------------- * Scanner_line() * * Get the current line number * ----------------------------------------------------------------------------- */ int Scanner_line(Scanner *s) { return s->line; } /* ----------------------------------------------------------------------------- * Scanner_start_line() * * Get the line number on which the current token starts * ----------------------------------------------------------------------------- */ int Scanner_start_line(Scanner *s) { return s->start_line; } /* ----------------------------------------------------------------------------- * Scanner_idstart() * * Change the set of additional characters that can be used to start an identifier. * ----------------------------------------------------------------------------- */ void Scanner_idstart(Scanner *s, const char *id) { free(s->idstart); s->idstart = Swig_copy_string(id); } /* ----------------------------------------------------------------------------- * nextchar() * * Returns the next character from the scanner or 0 if end of the string. * ----------------------------------------------------------------------------- */ static char nextchar(Scanner *s) { int nc; if (!s->str) return 0; while ((nc = Getc(s->str)) == EOF) { Delete(s->str); s->str = 0; Delitem(s->scanobjs, 0); if (Len(s->scanobjs) == 0) return 0; s->str = Getitem(s->scanobjs, 0); s->line = Getline(s->str); DohIncref(s->str); } if ((nc == '\n') && (!s->freeze_line)) s->line++; Putc(nc,s->text); return (char)nc; } /* ----------------------------------------------------------------------------- * set_error() * * Sets error information on the scanner. * ----------------------------------------------------------------------------- */ static void set_error(Scanner *s, int line, const_String_or_char_ptr msg) { s->error_line = line; s->error = NewString(msg); } /* ----------------------------------------------------------------------------- * Scanner_errmsg() * Scanner_errline() * * Returns error information (if any) * ----------------------------------------------------------------------------- */ String *Scanner_errmsg(Scanner *s) { return s->error; } int Scanner_errline(Scanner *s) { return s->error_line; } /* ----------------------------------------------------------------------------- * freeze_line() * * Freezes the current line number. * ----------------------------------------------------------------------------- */ static void freeze_line(Scanner *s, int val) { s->freeze_line = val; } /* ----------------------------------------------------------------------------- * brackets_count() * * Returns the number of brackets at the current depth. * A syntax error with unbalanced ) brackets will result in a NULL pointer return. * ----------------------------------------------------------------------------- */ static int *brackets_count(Scanner *s) { int *count; if (Len(s->brackets) > 0) count = (int *)Data(Getitem(s->brackets, 0)); else count = 0; return count; } /* ----------------------------------------------------------------------------- * brackets_clear() * * Resets the current depth and clears all brackets. * Usually called at the end of statements; * ----------------------------------------------------------------------------- */ static void brackets_clear(Scanner *s) { Clear(s->brackets); brackets_push(s); /* base bracket count should always be created */ } /* ----------------------------------------------------------------------------- * brackets_increment() * * Increases the number of brackets at the current depth. * Usually called when a single '<' is found. * ----------------------------------------------------------------------------- */ static void brackets_increment(Scanner *s) { int *count = brackets_count(s); if (count) (*count)++; } /* ----------------------------------------------------------------------------- * brackets_decrement() * * Decreases the number of brackets at the current depth. * Usually called when a single '>' is found. * ----------------------------------------------------------------------------- */ static void brackets_decrement(Scanner *s) { int *count = brackets_count(s); if (count) (*count)--; } /* ----------------------------------------------------------------------------- * brackets_reset() * * Sets the number of '<' brackets back to zero. Called at the point where * it is no longer possible to have a matching closing >> pair for a template. * ----------------------------------------------------------------------------- */ static void brackets_reset(Scanner *s) { int *count = brackets_count(s); if (count) *count = 0; } /* ----------------------------------------------------------------------------- * brackets_push() * * Increases the depth of brackets. * Usually called when '(' is found. * ----------------------------------------------------------------------------- */ static void brackets_push(Scanner *s) { int *newInt = (int *)malloc(sizeof(int)); *newInt = 0; Push(s->brackets, NewVoid(newInt, free)); } /* ----------------------------------------------------------------------------- * brackets_pop() * * Decreases the depth of brackets. * Usually called when ')' is found. * ----------------------------------------------------------------------------- */ static void brackets_pop(Scanner *s) { if (Len(s->brackets) > 0) /* protect against unbalanced ')' brackets */ Delitem(s->brackets, 0); } /* ----------------------------------------------------------------------------- * brackets_allow_shift() * * Return 1 to allow shift (>>), or 0 if (>>) should be split into (> >). * This is for C++11 template syntax for closing templates. * ----------------------------------------------------------------------------- */ static int brackets_allow_shift(Scanner *s) { int *count = brackets_count(s); return !count || (*count <= 0); } /* ----------------------------------------------------------------------------- * retract() * * Retract n characters * ----------------------------------------------------------------------------- */ static void retract(Scanner *s, int n) { int i, l; char *str; str = Char(s->text); l = Len(s->text); assert(n <= l); for (i = 0; i < n; i++) { if (str[l - 1] == '\n') { if (!s->freeze_line) s->line--; } (void)Seek(s->str, -1, SEEK_CUR); Delitem(s->text, DOH_END); } } /* ----------------------------------------------------------------------------- * get_escape() * * Get escape sequence. Called when a backslash is found in a string * ----------------------------------------------------------------------------- */ static void get_escape(Scanner *s) { int result = 0; int state = 0; int c; while (1) { c = nextchar(s); if (c == 0) break; switch (state) { case 0: if (c == 'n') { Delitem(s->text, DOH_END); Append(s->text,"\n"); return; } if (c == 'r') { Delitem(s->text, DOH_END); Append(s->text,"\r"); return; } if (c == 't') { Delitem(s->text, DOH_END); Append(s->text,"\t"); return; } if (c == 'a') { Delitem(s->text, DOH_END); Append(s->text,"\a"); return; } if (c == 'b') { Delitem(s->text, DOH_END); Append(s->text,"\b"); return; } if (c == 'f') { Delitem(s->text, DOH_END); Append(s->text,"\f"); return; } if (c == '\\') { Delitem(s->text, DOH_END); Append(s->text,"\\"); return; } if (c == 'v') { Delitem(s->text, DOH_END); Append(s->text,"\v"); return; } if (c == 'e') { Delitem(s->text, DOH_END); Append(s->text,"\033"); return; } if (c == '\'') { Delitem(s->text, DOH_END); Append(s->text,"\'"); return; } if (c == '\"') { Delitem(s->text, DOH_END); Append(s->text,"\""); return; } if (c == '\n') { Delitem(s->text, DOH_END); return; } if (isdigit(c)) { state = 10; result = (c - '0'); Delitem(s->text, DOH_END); } else if (c == 'x') { state = 20; Delitem(s->text, DOH_END); } else { char tmp[3]; tmp[0] = '\\'; tmp[1] = (char)c; tmp[2] = 0; Delitem(s->text, DOH_END); Append(s->text, tmp); return; } break; case 10: if (!isdigit(c)) { retract(s,1); Putc((char)result,s->text); return; } result = (result << 3) + (c - '0'); Delitem(s->text, DOH_END); break; case 20: if (!isxdigit(c)) { retract(s,1); Putc((char)result, s->text); return; } if (isdigit(c)) result = (result << 4) + (c - '0'); else result = (result << 4) + (10 + tolower(c) - 'a'); Delitem(s->text, DOH_END); break; } } return; } /* ----------------------------------------------------------------------------- * look() * * Return the raw value of the next token. * ----------------------------------------------------------------------------- */ static int look(Scanner *s) { int state = 0; int c = 0; String *str_delimiter = 0; Clear(s->text); s->start_line = s->line; Setfile(s->text, Getfile(s->str)); while (1) { switch (state) { case 0: if ((c = nextchar(s)) == 0) return (0); /* Process delimiters */ if (c == '\n') { return SWIG_TOKEN_ENDLINE; } else if (!isspace(c)) { retract(s, 1); state = 1000; Clear(s->text); Setline(s->text, s->line); Setfile(s->text, Getfile(s->str)); } break; case 1000: if ((c = nextchar(s)) == 0) return (0); if (c == '%') state = 4; /* Possibly a SWIG directive */ /* Look for possible identifiers or unicode/delimiter strings */ else if ((isalpha(c)) || (c == '_') || (s->idstart && strchr(s->idstart, c))) { state = 7; } /* Look for single character symbols */ else if (c == '(') { brackets_push(s); return SWIG_TOKEN_LPAREN; } else if (c == ')') { brackets_pop(s); return SWIG_TOKEN_RPAREN; } else if (c == ';') { brackets_clear(s); return SWIG_TOKEN_SEMI; } else if (c == ',') return SWIG_TOKEN_COMMA; else if (c == '*') state = 220; else if (c == '}') return SWIG_TOKEN_RBRACE; else if (c == '{') { brackets_reset(s); return SWIG_TOKEN_LBRACE; } else if (c == '=') state = 33; else if (c == '+') state = 200; else if (c == '-') state = 210; else if (c == '&') state = 31; else if (c == '|') state = 32; else if (c == '^') state = 230; else if (c == '<') state = 60; else if (c == '>') state = 61; else if (c == '~') return SWIG_TOKEN_NOT; else if (c == '!') state = 3; else if (c == '\\') return SWIG_TOKEN_BACKSLASH; else if (c == '[') return SWIG_TOKEN_LBRACKET; else if (c == ']') return SWIG_TOKEN_RBRACKET; else if (c == '@') return SWIG_TOKEN_AT; else if (c == '$') state = 75; else if (c == '#') return SWIG_TOKEN_POUND; else if (c == '?') return SWIG_TOKEN_QUESTION; /* Look for multi-character sequences */ else if (c == '/') { state = 1; /* Comment (maybe) */ s->start_line = s->line; } else if (c == ':') state = 5; /* maybe double colon */ else if (c == '0') state = 83; /* An octal or hex value */ else if (c == '\"') { state = 2; /* A string constant */ s->start_line = s->line; Clear(s->text); } else if (c == '\'') { s->start_line = s->line; Clear(s->text); state = 9; /* A character constant */ } else if (c == '`') { s->start_line = s->line; Clear(s->text); state = 900; } else if (c == '.') state = 100; /* Maybe a number, maybe just a period */ else if (isdigit(c)) state = 8; /* A numerical value */ else state = 99; /* An error */ break; case 1: /* Comment block */ if ((c = nextchar(s)) == 0) return (0); if (c == '/') { state = 10; /* C++ style comment */ Clear(s->text); Setline(s->text, Getline(s->str)); Setfile(s->text, Getfile(s->str)); Append(s->text, "//"); } else if (c == '*') { state = 11; /* C style comment */ Clear(s->text); Setline(s->text, Getline(s->str)); Setfile(s->text, Getfile(s->str)); Append(s->text, "/*"); } else if (c == '=') { return SWIG_TOKEN_DIVEQUAL; } else { retract(s, 1); return SWIG_TOKEN_SLASH; } break; case 10: /* C++ style comment */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated comment\n"); return SWIG_TOKEN_ERROR; } if (c == '\n') { retract(s,1); return SWIG_TOKEN_COMMENT; } else { state = 10; } break; case 11: /* C style comment block */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated comment\n"); return SWIG_TOKEN_ERROR; } if (c == '*') { state = 12; } else { state = 11; } break; case 12: /* Still in C style comment */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated comment\n"); return SWIG_TOKEN_ERROR; } if (c == '*') { state = 12; } else if (c == '/') { return SWIG_TOKEN_COMMENT; } else { state = 11; } break; case 2: /* Processing a string */ if (!str_delimiter) { state=20; break; } if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated string\n"); return SWIG_TOKEN_ERROR; } else if (c == '(') { state = 20; } else { char temp[2] = { 0, 0 }; temp[0] = c; Append( str_delimiter, temp ); } break; case 20: /* Inside the string */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated string\n"); return SWIG_TOKEN_ERROR; } if (!str_delimiter) { /* Ordinary string: "value" */ if (c == '\"') { Delitem(s->text, DOH_END); return SWIG_TOKEN_STRING; } else if (c == '\\') { Delitem(s->text, DOH_END); get_escape(s); } } else { /* Custom delimiter string: R"XXXX(value)XXXX" */ if (c==')') { int i=0; String *end_delimiter = NewStringEmpty(); while ((c = nextchar(s)) != 0 && c!='\"') { char temp[2] = { 0, 0 }; temp[0] = c; Append( end_delimiter, temp ); i++; } if (Strcmp( str_delimiter, end_delimiter )==0) { int len = Len(s->text); Delslice(s->text, len - 2 - Len(str_delimiter), len); /* Delete ending )XXXX" */ Delslice(s->text, 0, Len(str_delimiter) + 1); /* Delete starting XXXX( */ Delete( end_delimiter ); /* Correct end delimiter )XXXX" occurred */ Delete( str_delimiter ); str_delimiter = 0; return SWIG_TOKEN_STRING; } else { /* Incorrect end delimiter occurred */ if (c == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated raw string, started with R\"%s( is not terminated by )%s\"\n", str_delimiter, str_delimiter); return SWIG_TOKEN_ERROR; } retract( s, i ); Delete( end_delimiter ); } } } break; case 3: /* Maybe a not equals */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_LNOT; else if (c == '=') return SWIG_TOKEN_NOTEQUAL; else { retract(s, 1); return SWIG_TOKEN_LNOT; } break; case 31: /* AND or Logical AND or ANDEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_AND; else if (c == '&') return SWIG_TOKEN_LAND; else if (c == '=') return SWIG_TOKEN_ANDEQUAL; else { retract(s, 1); return SWIG_TOKEN_AND; } break; case 32: /* OR or Logical OR */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_OR; else if (c == '|') return SWIG_TOKEN_LOR; else if (c == '=') return SWIG_TOKEN_OREQUAL; else { retract(s, 1); return SWIG_TOKEN_OR; } break; case 33: /* EQUAL or EQUALTO */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_EQUAL; else if (c == '=') return SWIG_TOKEN_EQUALTO; else { retract(s, 1); return SWIG_TOKEN_EQUAL; } break; case 4: /* A wrapper generator directive (maybe) */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_PERCENT; if (c == '{') { state = 40; /* Include block */ Clear(s->text); Setline(s->text, Getline(s->str)); Setfile(s->text, Getfile(s->str)); s->start_line = s->line; } else if (s->idstart && strchr(s->idstart, '%') && ((isalpha(c)) || (c == '_'))) { state = 7; } else if (c == '=') { return SWIG_TOKEN_MODEQUAL; } else if (c == '}') { Swig_error(cparse_file, cparse_line, "Syntax error. Extraneous '%%}'\n"); SWIG_exit(EXIT_FAILURE); } else { retract(s, 1); return SWIG_TOKEN_PERCENT; } break; case 40: /* Process an include block */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated block\n"); return SWIG_TOKEN_ERROR; } if (c == '%') state = 41; break; case 41: /* Still processing include block */ if ((c = nextchar(s)) == 0) { set_error(s,s->start_line,"Unterminated code block"); return 0; } if (c == '}') { Delitem(s->text, DOH_END); Delitem(s->text, DOH_END); Seek(s->text,0,SEEK_SET); return SWIG_TOKEN_CODEBLOCK; } else { state = 40; } break; case 5: /* Maybe a double colon */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_COLON; if (c == ':') state = 50; else { retract(s, 1); return SWIG_TOKEN_COLON; } break; case 50: /* DCOLON, DCOLONSTAR */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_DCOLON; else if (c == '*') return SWIG_TOKEN_DCOLONSTAR; else { retract(s, 1); return SWIG_TOKEN_DCOLON; } break; case 60: /* shift operators */ if ((c = nextchar(s)) == 0) { brackets_increment(s); return SWIG_TOKEN_LESSTHAN; } if (c == '<') state = 240; else if (c == '=') return SWIG_TOKEN_LTEQUAL; else { retract(s, 1); brackets_increment(s); return SWIG_TOKEN_LESSTHAN; } break; case 61: if ((c = nextchar(s)) == 0) { brackets_decrement(s); return SWIG_TOKEN_GREATERTHAN; } if (c == '>' && brackets_allow_shift(s)) state = 250; else if (c == '=') return SWIG_TOKEN_GTEQUAL; else { retract(s, 1); brackets_decrement(s); return SWIG_TOKEN_GREATERTHAN; } break; case 7: /* Identifier or true/false or unicode/custom delimiter string */ if (c == 'R') { /* Possibly CUSTOM DELIMITER string */ state = 72; break; } else if (c == 'L') { /* Probably identifier but may be a wide string literal */ state = 77; break; } else if (c != 'u' && c != 'U') { /* Definitely an identifier */ state = 70; break; } if ((c = nextchar(s)) == 0) { state = 76; } else if (c == '\"') { /* Definitely u, U or L string */ retract(s, 1); state = 1000; } else if (c == '\'') { /* Definitely u, U or L char */ retract(s, 1); state = 77; } else if (c == 'R') { /* Possibly CUSTOM DELIMITER u, U, L string */ state = 73; } else if (c == '8') { /* Possibly u8 string/char */ state = 71; } else { retract(s, 1); /* Definitely an identifier */ state = 70; } break; case 70: /* Identifier */ if ((c = nextchar(s)) == 0) state = 76; else if (isalnum(c) || (c == '_') || (c == '$')) { state = 70; } else { retract(s, 1); state = 76; } break; case 71: /* Possibly u8 string/char */ if ((c = nextchar(s)) == 0) { state = 76; } else if (c=='\"') { retract(s, 1); /* Definitely u8 string */ state = 1000; } else if (c=='\'') { retract(s, 1); /* Definitely u8 char */ state = 77; } else if (c=='R') { state = 74; /* Possibly CUSTOM DELIMITER u8 string */ } else { retract(s, 2); /* Definitely an identifier. Retract 8" */ state = 70; } break; case 72: /* Possibly CUSTOM DELIMITER string */ case 73: case 74: if ((c = nextchar(s)) == 0) { state = 76; } else if (c=='\"') { retract(s, 1); /* Definitely custom delimiter u, U or L string */ str_delimiter = NewStringEmpty(); state = 1000; } else { if (state==72) { retract(s, 1); /* Definitely an identifier. Retract ? */ } else if (state==73) { retract(s, 2); /* Definitely an identifier. Retract R? */ } else if (state==74) { retract(s, 3); /* Definitely an identifier. Retract 8R? */ } state = 70; } break; case 75: /* Special identifier $ */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_DOLLAR; if (isalnum(c) || (c == '_') || (c == '*') || (c == '&')) { state = 70; } else { retract(s,1); if (Len(s->text) == 1) return SWIG_TOKEN_DOLLAR; state = 76; } break; case 76: /* Identifier or true/false */ if (cparse_cplusplus) { if (Strcmp(s->text, "true") == 0) return SWIG_TOKEN_BOOL; else if (Strcmp(s->text, "false") == 0) return SWIG_TOKEN_BOOL; } return SWIG_TOKEN_ID; break; case 77: /*identifier or wide string literal*/ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_ID; else if (c == '\"') { s->start_line = s->line; Clear(s->text); state = 78; } else if (c == '\'') { s->start_line = s->line; Clear(s->text); state = 79; } else if (isalnum(c) || (c == '_') || (c == '$')) state = 7; else { retract(s, 1); return SWIG_TOKEN_ID; } break; case 78: /* Processing a wide string literal*/ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated wide string\n"); return SWIG_TOKEN_ERROR; } if (c == '\"') { Delitem(s->text, DOH_END); return SWIG_TOKEN_WSTRING; } else if (c == '\\') { if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated wide string\n"); return SWIG_TOKEN_ERROR; } } break; case 79: /* Processing a wide char literal */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated wide character constant\n"); return SWIG_TOKEN_ERROR; } if (c == '\'') { Delitem(s->text, DOH_END); return (SWIG_TOKEN_WCHAR); } else if (c == '\\') { if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated wide character literal\n"); return SWIG_TOKEN_ERROR; } } break; case 8: /* A numerical digit */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if (c == '.') { state = 81; } else if ((c == 'e') || (c == 'E')) { state = 82; } else if ((c == 'f') || (c == 'F')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_FLOAT; } else if (isdigit(c)) { state = 8; } else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 81: /* A floating pointer number of some sort */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_DOUBLE; if (isdigit(c)) state = 81; else if ((c == 'e') || (c == 'E')) state = 820; else if ((c == 'f') || (c == 'F')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_FLOAT; } else if ((c == 'l') || (c == 'L')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_DOUBLE; } else { retract(s, 1); return (SWIG_TOKEN_DOUBLE); } break; case 82: if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Exponent does not have any digits\n"); return SWIG_TOKEN_ERROR; } if ((isdigit(c)) || (c == '-') || (c == '+')) state = 86; else { retract(s, 2); Swig_error(cparse_file, cparse_start_line, "Exponent does not have any digits\n"); return SWIG_TOKEN_ERROR; } break; case 820: /* Like case 82, but we've seen a decimal point. */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Exponent does not have any digits\n"); return SWIG_TOKEN_ERROR; } if ((isdigit(c)) || (c == '-') || (c == '+')) state = 86; else { retract(s, 2); Swig_error(cparse_file, cparse_start_line, "Exponent does not have any digits\n"); return SWIG_TOKEN_ERROR; } break; case 83: /* Might be a hexadecimal or octal number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if (isdigit(c)) state = 84; else if ((c == 'e') || (c == 'E')) state = 82; else if ((c == 'x') || (c == 'X')) state = 85; else if ((c == 'b') || (c == 'B')) state = 850; else if (c == '.') state = 81; else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 84: /* This is an octal number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if (isdigit(c)) state = 84; else if (c == '.') state = 81; else if ((c == 'e') || (c == 'E')) state = 82; else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 85: /* This is an hex number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if (isxdigit(c)) state = 85; else if (c == '.') /* hexadecimal float */ state = 860; else if ((c == 'p') || (c == 'P')) /* hexadecimal float */ state = 820; else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 850: /* This is a binary number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if ((c == '0') || (c == '1')) state = 850; else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 860: /* hexadecimal float */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Hexadecimal floating literals require an exponent\n"); return SWIG_TOKEN_ERROR; } if (isxdigit(c)) state = 860; else if ((c == 'p') || (c == 'P')) state = 820; else { retract(s, 2); Swig_error(cparse_file, cparse_start_line, "Hexadecimal floating literals require an exponent\n"); return SWIG_TOKEN_ERROR; } break; case 86: /* Rest of floating point number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_DOUBLE; if (isdigit(c)) state = 86; else if ((c == 'f') || (c == 'F')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_FLOAT; } else if ((c == 'l') || (c == 'L')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_DOUBLE; } else { retract(s, 1); return SWIG_TOKEN_DOUBLE; } break; case 87: /* A long integer of some sort */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_LONG; if ((c == 'u') || (c == 'U')) { return SWIG_TOKEN_ULONG; } else if ((c == 'l') || (c == 'L')) { state = 870; } else { retract(s, 1); return SWIG_TOKEN_LONG; } break; /* A long long integer */ case 870: if ((c = nextchar(s)) == 0) return SWIG_TOKEN_LONGLONG; if ((c == 'u') || (c == 'U')) { return SWIG_TOKEN_ULONGLONG; } else { retract(s, 1); return SWIG_TOKEN_LONGLONG; } /* An unsigned number */ case 88: if ((c = nextchar(s)) == 0) return SWIG_TOKEN_UINT; if ((c == 'l') || (c == 'L')) { state = 880; } else { retract(s, 1); return SWIG_TOKEN_UINT; } break; /* Possibly an unsigned long long or unsigned long */ case 880: if ((c = nextchar(s)) == 0) return SWIG_TOKEN_ULONG; if ((c == 'l') || (c == 'L')) return SWIG_TOKEN_ULONGLONG; else { retract(s, 1); return SWIG_TOKEN_ULONG; } /* A character constant */ case 9: if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated character constant\n"); return SWIG_TOKEN_ERROR; } if (c == '\'') { Delitem(s->text, DOH_END); return (SWIG_TOKEN_CHAR); } else if (c == '\\') { Delitem(s->text, DOH_END); get_escape(s); } break; /* A period or maybe a floating point number */ case 100: if ((c = nextchar(s)) == 0) return (0); if (isdigit(c)) state = 81; else { retract(s, 1); return SWIG_TOKEN_PERIOD; } break; case 200: /* PLUS, PLUSPLUS, PLUSEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_PLUS; else if (c == '+') return SWIG_TOKEN_PLUSPLUS; else if (c == '=') return SWIG_TOKEN_PLUSEQUAL; else { retract(s, 1); return SWIG_TOKEN_PLUS; } break; case 210: /* MINUS, MINUSMINUS, MINUSEQUAL, ARROW */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_MINUS; else if (c == '-') return SWIG_TOKEN_MINUSMINUS; else if (c == '=') return SWIG_TOKEN_MINUSEQUAL; else if (c == '>') state = 211; else { retract(s, 1); return SWIG_TOKEN_MINUS; } break; case 211: /* ARROW, ARROWSTAR */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_ARROW; else if (c == '*') return SWIG_TOKEN_ARROWSTAR; else { retract(s, 1); return SWIG_TOKEN_ARROW; } break; case 220: /* STAR, TIMESEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_STAR; else if (c == '=') return SWIG_TOKEN_TIMESEQUAL; else { retract(s, 1); return SWIG_TOKEN_STAR; } break; case 230: /* XOR, XOREQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_XOR; else if (c == '=') return SWIG_TOKEN_XOREQUAL; else { retract(s, 1); return SWIG_TOKEN_XOR; } break; case 240: /* LSHIFT, LSEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_LSHIFT; else if (c == '=') return SWIG_TOKEN_LSEQUAL; else { retract(s, 1); return SWIG_TOKEN_LSHIFT; } break; case 250: /* RSHIFT, RSEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_RSHIFT; else if (c == '=') return SWIG_TOKEN_RSEQUAL; else { retract(s, 1); return SWIG_TOKEN_RSHIFT; } break; /* An illegal character */ /* Reverse string */ case 900: if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated character constant\n"); return SWIG_TOKEN_ERROR; } if (c == '`') { Delitem(s->text, DOH_END); return (SWIG_TOKEN_RSTRING); } break; default: return SWIG_TOKEN_ILLEGAL; } } } /* ----------------------------------------------------------------------------- * Scanner_token() * * Real entry point to return the next token. Returns 0 if at end of input. * ----------------------------------------------------------------------------- */ int Scanner_token(Scanner *s) { int t; Delete(s->error); if (s->nexttoken >= 0) { t = s->nexttoken; s->nexttoken = -1; return t; } s->start_line = 0; t = look(s); if (!s->start_line) { Setline(s->text,s->line); } else { Setline(s->text,s->start_line); } return t; } /* ----------------------------------------------------------------------------- * Scanner_text() * * Return the lexene associated with the last returned token. * ----------------------------------------------------------------------------- */ String *Scanner_text(Scanner *s) { return s->text; } /* ----------------------------------------------------------------------------- * Scanner_skip_line() * * Skips to the end of a line * ----------------------------------------------------------------------------- */ void Scanner_skip_line(Scanner *s) { char c; int done = 0; Clear(s->text); Setfile(s->text, Getfile(s->str)); Setline(s->text, s->line); while (!done) { if ((c = nextchar(s)) == 0) return; if (c == '\\') { nextchar(s); } else if (c == '\n') { done = 1; } } return; } /* ----------------------------------------------------------------------------- * Scanner_skip_balanced() * * Skips a piece of code enclosed in begin/end symbols such as '{...}' or * (...). Ignores symbols inside comments or strings. * ----------------------------------------------------------------------------- */ int Scanner_skip_balanced(Scanner *s, int startchar, int endchar) { char c; int num_levels = 1; int state = 0; char temp[2] = { 0, 0 }; String *locator = 0; temp[0] = (char) startchar; Clear(s->text); Setfile(s->text, Getfile(s->str)); Setline(s->text, s->line); Append(s->text, temp); while (num_levels > 0) { if ((c = nextchar(s)) == 0) { Delete(locator); return -1; } switch (state) { case 0: if (c == startchar) num_levels++; else if (c == endchar) num_levels--; else if (c == '/') state = 10; else if (c == '\"') state = 20; else if (c == '\'') state = 30; break; case 10: if (c == '/') state = 11; else if (c == '*') state = 12; else if (c == startchar) { state = 0; num_levels++; } else state = 0; break; case 11: if (c == '\n') state = 0; else state = 11; break; case 12: /* first character inside C comment */ if (c == '*') state = 14; else if (c == '@') state = 40; else state = 13; break; case 13: if (c == '*') state = 14; break; case 14: /* possible end of C comment */ if (c == '*') state = 14; else if (c == '/') state = 0; else state = 13; break; case 20: if (c == '\"') state = 0; else if (c == '\\') state = 21; break; case 21: state = 20; break; case 30: if (c == '\'') state = 0; else if (c == '\\') state = 31; break; case 31: state = 30; break; /* 40-45 SWIG locator checks - a C comment with contents starting: @SWIG */ case 40: state = (c == 'S') ? 41 : (c == '*') ? 14 : 13; break; case 41: state = (c == 'W') ? 42 : (c == '*') ? 14 : 13; break; case 42: state = (c == 'I') ? 43 : (c == '*') ? 14 : 13; break; case 43: state = (c == 'G') ? 44 : (c == '*') ? 14 : 13; if (c == 'G') { Delete(locator); locator = NewString("/*@SWIG"); } break; case 44: if (c == '*') state = 45; Putc(c, locator); break; case 45: /* end of SWIG locator in C comment */ if (c == '/') { state = 0; Putc(c, locator); Scanner_locator(s, locator); } else { /* malformed locator */ state = (c == '*') ? 14 : 13; } break; default: break; } } Delete(locator); return 0; } /* ----------------------------------------------------------------------------- * Scanner_get_raw_text_balanced() * * Returns raw text between 2 braces, does not change scanner state in any way * ----------------------------------------------------------------------------- */ String *Scanner_get_raw_text_balanced(Scanner *s, int startchar, int endchar) { String *result = 0; char c; int old_line = s->line; String *old_text = Copy(s->text); long position = Tell(s->str); int num_levels = 1; int state = 0; char temp[2] = { 0, 0 }; temp[0] = (char) startchar; Clear(s->text); Setfile(s->text, Getfile(s->str)); Setline(s->text, s->line); Append(s->text, temp); while (num_levels > 0) { if ((c = nextchar(s)) == 0) { Clear(s->text); Append(s->text, old_text); Delete(old_text); s->line = old_line; return 0; } switch (state) { case 0: if (c == startchar) num_levels++; else if (c == endchar) num_levels--; else if (c == '/') state = 10; else if (c == '\"') state = 20; else if (c == '\'') state = 30; break; case 10: if (c == '/') state = 11; else if (c == '*') state = 12; else if (c == startchar) { state = 0; num_levels++; } else state = 0; break; case 11: if (c == '\n') state = 0; else state = 11; break; case 12: /* first character inside C comment */ if (c == '*') state = 14; else state = 13; break; case 13: if (c == '*') state = 14; break; case 14: /* possible end of C comment */ if (c == '*') state = 14; else if (c == '/') state = 0; else state = 13; break; case 20: if (c == '\"') state = 0; else if (c == '\\') state = 21; break; case 21: state = 20; break; case 30: if (c == '\'') state = 0; else if (c == '\\') state = 31; break; case 31: state = 30; break; default: break; } } Seek(s->str, position, SEEK_SET); result = Copy(s->text); Clear(s->text); Append(s->text, old_text); Delete(old_text); s->line = old_line; return result; } /* ----------------------------------------------------------------------------- * Scanner_isoperator() * * Returns 0 or 1 depending on whether or not a token corresponds to a C/C++ * operator. * ----------------------------------------------------------------------------- */ int Scanner_isoperator(int tokval) { if (tokval >= 100) return 1; return 0; } /* ---------------------------------------------------------------------- * locator() * * Support for locator strings. These are strings of the form * @SWIG:filename,line,id@ emitted by the SWIG preprocessor. They * are primarily used for macro line number reporting. * We just use the locator to mark when to activate/deactivate linecounting. * ---------------------------------------------------------------------- */ void Scanner_locator(Scanner *s, String *loc) { static Locator *locs = 0; static int expanding_macro = 0; if (!follow_locators) { if (Equal(loc, "/*@SWIG@*/")) { /* End locator. */ if (expanding_macro) --expanding_macro; } else { /* Begin locator. */ ++expanding_macro; } /* Freeze line number processing in Scanner */ freeze_line(s,expanding_macro); } else { int c; Locator *l; (void)Seek(loc, 7, SEEK_SET); c = Getc(loc); if (c == '@') { /* Empty locator. We pop the last location off */ if (locs) { Scanner_set_location(s, locs->filename, locs->line_number); cparse_file = locs->filename; cparse_line = locs->line_number; l = locs->next; free(locs); locs = l; } return; } /* We're going to push a new location */ l = (Locator *) malloc(sizeof(Locator)); l->filename = cparse_file; l->line_number = cparse_line; l->next = locs; locs = l; /* Now, parse the new location out of the locator string */ { String *fn = NewStringEmpty(); /* Putc(c, fn); */ while ((c = Getc(loc)) != EOF) { if ((c == '@') || (c == ',')) break; Putc(c, fn); } cparse_file = Swig_copy_string(Char(fn)); Clear(fn); cparse_line = 1; /* Get the line number */ while ((c = Getc(loc)) != EOF) { if ((c == '@') || (c == ',')) break; Putc(c, fn); } cparse_line = atoi(Char(fn)); Clear(fn); /* Get the rest of it */ while ((c = Getc(loc)) != EOF) { if (c == '@') break; Putc(c, fn); } /* Swig_diagnostic(cparse_file, cparse_line, "Scanner_set_location\n"); */ Scanner_set_location(s, cparse_file, cparse_line); Delete(fn); } } } void Swig_cparse_follow_locators(int v) { follow_locators = v; } swig-4.0.2/Source/Swig/tree.c0000644000175000017500000002466013667507523015646 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * tree.c * * This file provides some general purpose functions for manipulating * parse trees. * ----------------------------------------------------------------------------- */ #include "swig.h" #include #include /* ----------------------------------------------------------------------------- * Swig_print_tags() * * Dump the tag structure of a parse tree to standard output * ----------------------------------------------------------------------------- */ void Swig_print_tags(DOH *obj, DOH *root) { DOH *croot, *newroot; DOH *cobj; if (!root) croot = NewStringEmpty(); else croot = root; while (obj) { Swig_diagnostic(Getfile(obj), Getline(obj), "%s . %s\n", croot, nodeType(obj)); cobj = firstChild(obj); if (cobj) { newroot = NewStringf("%s . %s", croot, nodeType(obj)); Swig_print_tags(cobj, newroot); Delete(newroot); } obj = nextSibling(obj); } if (!root) Delete(croot); } static int indent_level = 0; static void print_indent(int l) { int i; for (i = 0; i < indent_level; i++) { fputc(' ', stdout); } if (l) { fputc('|', stdout); fputc(' ', stdout); } } /* ----------------------------------------------------------------------------- * Swig_print_node(Node *n) * ----------------------------------------------------------------------------- */ void Swig_print_node(Node *obj) { Iterator ki; Node *cobj; print_indent(0); Printf(stdout, "+++ %s - %p ----------------------------------------\n", nodeType(obj), obj); ki = First(obj); while (ki.key) { String *k = ki.key; if ((Cmp(k, "nodeType") == 0) || (Cmp(k, "firstChild") == 0) || (Cmp(k, "lastChild") == 0) || (Cmp(k, "parentNode") == 0) || (Cmp(k, "nextSibling") == 0) || (Cmp(k, "previousSibling") == 0) || (*(Char(k)) == '$')) { /* Do nothing */ } else if (Cmp(k, "kwargs") == 0 || Cmp(k, "parms") == 0 || Cmp(k, "wrap:parms") == 0 || Cmp(k, "pattern") == 0 || Cmp(k, "templateparms") == 0 || Cmp(k, "throws") == 0) { print_indent(2); /* Differentiate parameter lists by displaying within single quotes */ Printf(stdout, "%-12s - \'%s\'\n", k, ParmList_str_defaultargs(Getattr(obj, k))); } else { DOH *o; const char *trunc = ""; print_indent(2); if (DohIsString(Getattr(obj, k))) { o = Str(Getattr(obj, k)); if (Len(o) > 80) { trunc = "..."; } Printf(stdout, "%-12s - \"%(escape)-0.80s%s\"\n", k, o, trunc); Delete(o); } else { Printf(stdout, "%-12s - %p\n", k, Getattr(obj, k)); } } ki = Next(ki); } cobj = firstChild(obj); if (cobj) { indent_level += 6; Printf(stdout, "\n"); Swig_print_tree(cobj); indent_level -= 6; } else { print_indent(1); Printf(stdout, "\n"); } } /* ----------------------------------------------------------------------------- * Swig_print_tree() * * Dump the tree structure of a parse tree to standard output * ----------------------------------------------------------------------------- */ void Swig_print_tree(DOH *obj) { while (obj) { Swig_print_node(obj); obj = nextSibling(obj); } } /* ----------------------------------------------------------------------------- * appendChild() * * Appends a new child to a node * ----------------------------------------------------------------------------- */ void appendChild(Node *node, Node *chd) { Node *lc; if (!chd) return; lc = lastChild(node); if (!lc) { set_firstChild(node, chd); } else { set_nextSibling(lc, chd); set_previousSibling(chd, lc); } while (chd) { lc = chd; set_parentNode(chd, node); chd = nextSibling(chd); } set_lastChild(node, lc); } /* ----------------------------------------------------------------------------- * prependChild() * * Prepends a new child to a node * ----------------------------------------------------------------------------- */ void prependChild(Node *node, Node *chd) { Node *fc; if (!chd) return; fc = firstChild(node); if (fc) { set_nextSibling(chd, fc); set_previousSibling(fc, chd); } set_firstChild(node, chd); while (chd) { set_parentNode(chd, node); chd = nextSibling(chd); } } void appendSibling(Node *node, Node *chd) { Node *parent; Node *lc = node; while (nextSibling(lc)) lc = nextSibling(lc); set_nextSibling(lc, chd); set_previousSibling(chd, lc); parent = parentNode(node); if (parent) { while (chd) { lc = chd; set_parentNode(chd, parent); chd = nextSibling(chd); } set_lastChild(parent, lc); } } /* ----------------------------------------------------------------------------- * removeNode() * * Removes a node from the parse tree. Detaches it from its parent's child list. * ----------------------------------------------------------------------------- */ void removeNode(Node *n) { Node *parent; Node *prev; Node *next; parent = parentNode(n); if (!parent) return; prev = previousSibling(n); next = nextSibling(n); if (prev) { set_nextSibling(prev, next); } else { if (parent) { set_firstChild(parent, next); } } if (next) { set_previousSibling(next, prev); } else { if (parent) { set_lastChild(parent, prev); } } /* Delete attributes */ Delattr(n,"parentNode"); Delattr(n,"nextSibling"); Delattr(n,"prevSibling"); } /* ----------------------------------------------------------------------------- * copyNode() * * Copies a node, but only copies simple attributes (no lists, hashes). * ----------------------------------------------------------------------------- */ Node *copyNode(Node *n) { Iterator ki; Node *c = NewHash(); for (ki = First(n); ki.key; ki = Next(ki)) { if (DohIsString(ki.item)) { Setattr(c, ki.key, Copy(ki.item)); } } Setfile(c, Getfile(n)); Setline(c, Getline(n)); return c; } /* ----------------------------------------------------------------------------- * checkAttribute() * ----------------------------------------------------------------------------- */ int checkAttribute(Node *n, const_String_or_char_ptr name, const_String_or_char_ptr value) { String *v = Getattr(n, name); return v ? Equal(v, value) : 0; } /* ----------------------------------------------------------------------------- * Swig_require() * ns - namespace for the view name for saving any attributes under * n - node * ... - list of attribute names of type char* * This method checks that the attribute names exist in the node n and asserts if * not. Assert will only occur unless the attribute is optional. An attribute is * optional if it is prefixed by ?, eg "?value". If the attribute name is prefixed * by * or ?, eg "*value" then a copy of the attribute is saved. The saved * attributes will be restored on a subsequent call to Swig_restore(). All the * saved attributes are saved in the view namespace (prefixed by ns). * This function can be called more than once with different namespaces. * ----------------------------------------------------------------------------- */ void Swig_require(const char *ns, Node *n, ...) { va_list ap; char *name; DOH *obj; va_start(ap, n); name = va_arg(ap, char *); while (name) { int newref = 0; int opt = 0; if (*name == '*') { newref = 1; name++; } else if (*name == '?') { newref = 1; opt = 1; name++; } obj = Getattr(n, name); if (!opt && !obj) { Swig_error(Getfile(n), Getline(n), "Fatal error (Swig_require). Missing attribute '%s' in node '%s'.\n", name, nodeType(n)); assert(obj); } if (!obj) obj = DohNone; if (newref) { /* Save a copy of the attribute */ Setattr(n, NewStringf("%s:%s", ns, name), obj); } name = va_arg(ap, char *); } va_end(ap); /* Save the view */ { String *view = Getattr(n, "view"); if (view) { if (Strcmp(view, ns) != 0) { Setattr(n, NewStringf("%s:view", ns), view); Setattr(n, "view", NewString(ns)); } } else { Setattr(n, "view", NewString(ns)); } } } /* ----------------------------------------------------------------------------- * Swig_save() * Same as Swig_require(), but all attribute names are optional and all attributes * are saved, ie behaves as if all the attribute names were prefixed by ?. * ----------------------------------------------------------------------------- */ void Swig_save(const char *ns, Node *n, ...) { va_list ap; char *name; DOH *obj; va_start(ap, n); name = va_arg(ap, char *); while (name) { if (*name == '*') { name++; } else if (*name == '?') { name++; } obj = Getattr(n, name); if (!obj) obj = DohNone; /* Save a copy of the attribute */ if (Setattr(n, NewStringf("%s:%s", ns, name), obj)) { Printf(stderr, "Swig_save('%s','%s'): Warning, attribute '%s' was already saved.\n", ns, nodeType(n), name); } name = va_arg(ap, char *); } va_end(ap); /* Save the view */ { String *view = Getattr(n, "view"); if (view) { if (Strcmp(view, ns) != 0) { Setattr(n, NewStringf("%s:view", ns), view); Setattr(n, "view", NewString(ns)); } } else { Setattr(n, "view", NewString(ns)); } } } /* ----------------------------------------------------------------------------- * Swig_restore() * Restores attributes saved by a previous call to Swig_require() or Swig_save(). * ----------------------------------------------------------------------------- */ void Swig_restore(Node *n) { String *temp; int len; List *l; String *ns; Iterator ki; ns = Getattr(n, "view"); assert(ns); l = NewList(); temp = NewStringf("%s:", ns); len = Len(temp); for (ki = First(n); ki.key; ki = Next(ki)) { if (Strncmp(temp, ki.key, len) == 0) { Append(l, ki.key); } } for (ki = First(l); ki.item; ki = Next(ki)) { DOH *obj = Getattr(n, ki.item); Setattr(n, Char(ki.item) + len, obj); Delattr(n, ki.item); } Delete(l); Delete(temp); } swig-4.0.2/Source/Swig/cwrap.c0000644000175000017500000014342313667507523016022 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * cwrap.c * * This file defines a variety of wrapping rules for C/C++ handling including * the naming of local variables, calling conventions, and so forth. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" static const char *cresult_variable_name = "result"; static Parm *nonvoid_parms(Parm *p) { if (p) { SwigType *t = Getattr(p, "type"); if (SwigType_type(t) == T_VOID) return 0; } return p; } /* ----------------------------------------------------------------------------- * Swig_cresult_name_set() * * Change the name of the variable used to hold the return value from C/C++ wrapper functions * from the default "result". * ----------------------------------------------------------------------------- */ void Swig_cresult_name_set(const char *new_name) { cresult_variable_name = new_name; } /* ----------------------------------------------------------------------------- * Swig_cresult_name() * * Get the name of the variable used to hold the return value from C/C++ wrapper functions * ----------------------------------------------------------------------------- */ const char *Swig_cresult_name(void) { return cresult_variable_name; } /* ----------------------------------------------------------------------------- * Swig_cparm_name() * * Generates a name for the ith argument in an argument list * ----------------------------------------------------------------------------- */ String *Swig_cparm_name(Parm *p, int i) { String *name = NewStringf("arg%d", i + 1); if (p) { Setattr(p, "lname", name); } return name; } /* ----------------------------------------------------------------------------- * Swig_clocal() * * Creates a string that declares a C local variable type. Converts references * and user defined types to pointers. * ----------------------------------------------------------------------------- */ static String *Swig_clocal(SwigType *t, const_String_or_char_ptr name, const_String_or_char_ptr value) { String *decl; decl = NewStringEmpty(); switch (SwigType_type(t)) { case T_REFERENCE: if (value) { String *lstrname = SwigType_lstr(t, name); String *lstr = SwigType_lstr(t, 0); Printf(decl, "%s = (%s) &%s_defvalue", lstrname, lstr, name); Delete(lstrname); Delete(lstr); } else { String *lstrname = SwigType_lstr(t, name); Printf(decl, "%s = 0", lstrname); Delete(lstrname); } break; case T_RVALUE_REFERENCE: if (value) { String *lstrname = SwigType_lstr(t, name); String *lstr = SwigType_lstr(t, 0); Printf(decl, "%s = (%s) &%s_defrvalue", lstrname, lstr, name); Delete(lstrname); Delete(lstr); } else { String *lstrname = SwigType_lstr(t, name); Printf(decl, "%s = 0", lstrname); Delete(lstrname); } break; case T_VOID: break; case T_VARARGS: Printf(decl, "void *%s = 0", name); break; default: if (value) { String *lcaststr = SwigType_lcaststr(t, value); String *lstr = SwigType_lstr(t, 0); String *lstrn = SwigType_lstr(t, name); Printf(decl, "%s = (%s) %s", lstrn, lstr, lcaststr); Delete(lcaststr); Delete(lstr); Delete(lstrn); } else { String *lstrname = SwigType_lstr(t, name); Append(decl, lstrname); Delete(lstrname); } } return decl; } /* ----------------------------------------------------------------------------- * Swig_wrapped_var_convert() * * Converts a member variable for use in the get and set wrapper methods. * This function only converts user defined types to pointers. * ----------------------------------------------------------------------------- */ String *Swig_wrapped_var_type(SwigType *t, int varcref) { SwigType *ty; if (!Strstr(t, "enum $unnamed")) { ty = Copy(t); } else { /* Change the type for unnamed enum instance variables */ ty = NewString("int"); } if (SwigType_isclass(t)) { if (varcref) { if (cparse_cplusplus) { if (!SwigType_isconst(ty)) SwigType_add_qualifier(ty, "const"); SwigType_add_reference(ty); } else { return Copy(ty); } } else { SwigType_add_pointer(ty); } } return ty; } String *Swig_wrapped_member_var_type(SwigType *t, int varcref) { SwigType *ty; if (!Strstr(t, "enum $unnamed")) { ty = Copy(t); } else { /* Change the type for unnamed enum instance variables */ ty = NewString("int"); } if (SwigType_isclass(t)) { if (varcref) { if (cparse_cplusplus) { if (!SwigType_isconst(ty)) SwigType_add_qualifier(ty, "const"); SwigType_add_reference(ty); } else { return Copy(ty); } } else { SwigType_add_pointer(ty); } } return ty; } static String *Swig_wrapped_var_deref(SwigType *t, const_String_or_char_ptr name, int varcref) { if (SwigType_isclass(t)) { if (varcref) { if (cparse_cplusplus) { return NewStringf("*%s", name); } else { return NewStringf("%s", name); } } else { return NewStringf("*%s", name); } } else { return SwigType_rcaststr(t, name); } } static String *Swig_wrapped_var_assign(SwigType *t, const_String_or_char_ptr name, int varcref) { if (SwigType_isclass(t)) { if (varcref) { return NewStringf("%s", name); } else { return NewStringf("&%s", name); } } else { return SwigType_lcaststr(t, name); } } /* ----------------------------------------------------------------------------- * Swig_cargs() * * Emit all of the local variables for a list of parameters. Returns the * number of parameters. * Default values for the local variables are only emitted if the compact default * argument behaviour is required. * ----------------------------------------------------------------------------- */ int Swig_cargs(Wrapper *w, ParmList *p) { int i = 0; int compactdefargs = ParmList_is_compactdefargs(p); while (p != 0) { String *lname = Swig_cparm_name(p, i); SwigType *pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { String *local = 0; String *type = Getattr(p, "type"); /* default values only emitted if in compact default args mode */ String *pvalue = (compactdefargs) ? Getattr(p, "value") : 0; /* When using compactdefaultargs, the code generated initialises a variable via a constructor call that accepts the * default value as a parameter. The default constructor is not called and therefore SwigValueWrapper is not needed. */ SwigType *altty = pvalue ? 0 : SwigType_alttype(type, 0); int tycode = SwigType_type(type); if (tycode == T_REFERENCE) { if (pvalue) { SwigType *tvalue; String *defname, *defvalue, *rvalue, *qvalue; rvalue = SwigType_typedef_resolve_all(pvalue); qvalue = SwigType_typedef_qualified(rvalue); defname = NewStringf("%s_defvalue", lname); tvalue = Copy(type); SwigType_del_reference(tvalue); tycode = SwigType_type(tvalue); if (tycode != T_USER) { /* plain primitive type, we copy the def value */ String *lstr = SwigType_lstr(tvalue, defname); defvalue = NewStringf("%s = %s", lstr, qvalue); Delete(lstr); } else { /* user type, we copy the reference value */ String *str = SwigType_str(type, defname); defvalue = NewStringf("%s = %s", str, qvalue); Delete(str); } Wrapper_add_localv(w, defname, defvalue, NIL); Delete(tvalue); Delete(rvalue); Delete(qvalue); Delete(defname); Delete(defvalue); } } else if (tycode == T_RVALUE_REFERENCE) { if (pvalue) { SwigType *tvalue; String *defname, *defvalue, *rvalue, *qvalue; rvalue = SwigType_typedef_resolve_all(pvalue); qvalue = SwigType_typedef_qualified(rvalue); defname = NewStringf("%s_defrvalue", lname); tvalue = Copy(type); SwigType_del_rvalue_reference(tvalue); tycode = SwigType_type(tvalue); if (tycode != T_USER) { /* plain primitive type, we copy the def value */ String *lstr = SwigType_lstr(tvalue, defname); defvalue = NewStringf("%s = %s", lstr, qvalue); Delete(lstr); } else { /* user type, we copy the reference value */ String *str = SwigType_str(type, defname); defvalue = NewStringf("%s = %s", str, qvalue); Delete(str); } Wrapper_add_localv(w, defname, defvalue, NIL); Delete(tvalue); Delete(rvalue); Delete(qvalue); Delete(defname); Delete(defvalue); } } else if (!pvalue && ((tycode == T_POINTER) || (tycode == T_STRING) || (tycode == T_WSTRING))) { pvalue = (String *) "0"; } if (!altty) { local = Swig_clocal(pt, lname, pvalue); } else { local = Swig_clocal(altty, lname, pvalue); Delete(altty); } Wrapper_add_localv(w, lname, local, NIL); Delete(local); i++; } Delete(lname); p = nextSibling(p); } return (i); } /* ----------------------------------------------------------------------------- * Swig_cresult() * * This function generates the C code needed to set the result of a C * function call. * ----------------------------------------------------------------------------- */ String *Swig_cresult(SwigType *t, const_String_or_char_ptr name, const_String_or_char_ptr decl) { String *fcall; fcall = NewStringEmpty(); switch (SwigType_type(t)) { case T_VOID: break; case T_REFERENCE: { String *lstr = SwigType_lstr(t, 0); Printf(fcall, "%s = (%s) &", name, lstr); Delete(lstr); } break; case T_RVALUE_REFERENCE: { String *const_lvalue_str; String *lstr = SwigType_lstr(t, 0); SwigType *tt = Copy(t); SwigType_del_rvalue_reference(tt); SwigType_add_qualifier(tt, "const"); SwigType_add_reference(tt); const_lvalue_str = SwigType_rcaststr(tt, 0); Printf(fcall, "%s = (%s) &%s", name, lstr, const_lvalue_str); Delete(const_lvalue_str); Delete(tt); Delete(lstr); } break; case T_USER: Printf(fcall, "%s = ", name); break; default: /* Normal return value */ { String *lstr = SwigType_lstr(t, 0); Printf(fcall, "%s = (%s)", name, lstr); Delete(lstr); } break; } /* Now print out function call */ Append(fcall, decl); /* A sick hack */ { char *c = Char(decl) + Len(decl) - 1; if (!((*c == ';') || (*c == '}'))) Append(fcall, ";"); } return fcall; } /* ----------------------------------------------------------------------------- * Swig_cfunction_call() * * Creates a string that calls a C function using the local variable rules * defined above. * * name(arg0, arg1, arg2, ... argn) * * ----------------------------------------------------------------------------- */ String *Swig_cfunction_call(const_String_or_char_ptr name, ParmList *parms) { String *func; int i = 0; int comma = 0; Parm *p = parms; String *nname; func = NewStringEmpty(); nname = SwigType_namestr(name); /* SWIGTEMPLATEDISAMBIGUATOR is compiler dependent (swiglabels.swg), - SUN Studio 9 requires 'template', - gcc-3.4 forbids the use of 'template'. the rest seems not caring very much, */ if (SwigType_istemplate(name)) { String *prefix = Swig_scopename_prefix(nname); if (!prefix || Len(prefix) == 0) { Printf(func, "%s(", nname); } else { String *last = Swig_scopename_last(nname); Printf(func, "%s::SWIGTEMPLATEDISAMBIGUATOR %s(", prefix, last); Delete(last); } Delete(prefix); } else { Printf(func, "%s(", nname); } Delete(nname); while (p) { SwigType *pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { SwigType *rpt = SwigType_typedef_resolve_all(pt); String *pname = Swig_cparm_name(p, i); String *rcaststr = SwigType_rcaststr(rpt, pname); if (comma) { Printv(func, ",", rcaststr, NIL); } else { Append(func, rcaststr); } Delete(rpt); Delete(pname); Delete(rcaststr); comma = 1; i++; } p = nextSibling(p); } Append(func, ")"); return func; } /* ----------------------------------------------------------------------------- * Swig_cmethod_call() * * Generates a string that calls a C++ method from a list of parameters. * * arg0->name(arg1, arg2, arg3, ..., argn) * * self is an argument that defines how to handle the first argument. Normally, * it should be set to "this->". With C++ proxy classes enabled, it could be * set to "(*this)->" or some similar sequence. * ----------------------------------------------------------------------------- */ static String *Swig_cmethod_call(const_String_or_char_ptr name, ParmList *parms, const_String_or_char_ptr self, String *explicit_qualifier, SwigType *director_type) { String *func, *nname; int i = 0; Parm *p = parms; SwigType *pt; int comma = 0; func = NewStringEmpty(); if (!p) return func; if (!self) self = "(this)->"; Append(func, self); if (SwigType_istemplate(name) && (strncmp(Char(name), "operator ", 9) == 0)) { /* fix for template + operators and compilers like gcc 3.3.5 */ String *tprefix = SwigType_templateprefix(name); nname = tprefix; } else { nname = SwigType_namestr(name); } if (director_type) { const char *pname = "darg"; String *rcaststr = SwigType_rcaststr(director_type, pname); Replaceall(func, "this", rcaststr); Delete(rcaststr); } else { pt = Getattr(p, "type"); /* If the method is invoked through a dereferenced pointer, we don't add any casts (needed for smart pointers). Otherwise, we cast to the appropriate type */ if (Strstr(func, "*this")) { String *pname = Swig_cparm_name(p, 0); Replaceall(func, "this", pname); Delete(pname); } else { String *pname = Swig_cparm_name(p, 0); String *rcaststr = SwigType_rcaststr(pt, pname); Replaceall(func, "this", rcaststr); Delete(rcaststr); Delete(pname); } /* SWIGTEMPLATEDESIMBUAGATOR is compiler dependent (swiglabels.swg), - SUN Studio 9 requires 'template', - gcc-3.4 forbids the use of 'template' (correctly implementing the ISO C++ standard) the others don't seem to care, */ if (SwigType_istemplate(name)) Printf(func, "SWIGTEMPLATEDISAMBIGUATOR "); if (explicit_qualifier) { Printv(func, explicit_qualifier, "::", NIL); } } Printf(func, "%s(", nname); i++; p = nextSibling(p); while (p) { pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { String *pname = Swig_cparm_name(p, i); String *rcaststr = SwigType_rcaststr(pt, pname); if (comma) Append(func, ","); Append(func, rcaststr); Delete(rcaststr); Delete(pname); comma = 1; i++; } p = nextSibling(p); } Append(func, ")"); Delete(nname); return func; } /* ----------------------------------------------------------------------------- * Swig_cconstructor_call() * * Creates a string that calls a C constructor function. * * calloc(1,sizeof(name)); * ----------------------------------------------------------------------------- */ String *Swig_cconstructor_call(const_String_or_char_ptr name) { DOH *func; func = NewStringEmpty(); Printf(func, "calloc(1, sizeof(%s))", name); return func; } /* ----------------------------------------------------------------------------- * Swig_cppconstructor_call() * * Creates a string that calls a C function using the local variable rules * defined above. * * name(arg0, arg1, arg2, ... argn) * * ----------------------------------------------------------------------------- */ String *Swig_cppconstructor_base_call(const_String_or_char_ptr name, ParmList *parms, int skip_self) { String *func; String *nname; int i = 0; int comma = 0; Parm *p = parms; SwigType *pt; if (skip_self) { if (p) p = nextSibling(p); i++; } nname = SwigType_namestr(name); func = NewStringEmpty(); Printf(func, "new %s(", nname); while (p) { pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { String *rcaststr = 0; String *pname = 0; if (comma) Append(func, ","); if (!Getattr(p, "arg:byname")) { pname = Swig_cparm_name(p, i); i++; } else { pname = Getattr(p, "value"); if (pname) pname = Copy(pname); else pname = Copy(Getattr(p, "name")); } rcaststr = SwigType_rcaststr(pt, pname); Append(func, rcaststr); Delete(rcaststr); comma = 1; Delete(pname); } p = nextSibling(p); } Append(func, ")"); Delete(nname); return func; } String *Swig_cppconstructor_call(const_String_or_char_ptr name, ParmList *parms) { return Swig_cppconstructor_base_call(name, parms, 0); } String *Swig_cppconstructor_nodirector_call(const_String_or_char_ptr name, ParmList *parms) { return Swig_cppconstructor_base_call(name, parms, 1); } String *Swig_cppconstructor_director_call(const_String_or_char_ptr name, ParmList *parms) { return Swig_cppconstructor_base_call(name, parms, 0); } /* ----------------------------------------------------------------------------- * recursive_flag_search() * * This function searches for the class attribute 'attr' in the class * 'n' or recursively in its bases. * * If you define SWIG_FAST_REC_SEARCH, the method will set the found * 'attr' in the target class 'n'. If not, the method will set the * 'noattr' one. This prevents of having to navigate the entire * hierarchy tree everytime, so, it is an O(1) method... or something * like that. However, it populates all the parsed classes with the * 'attr' and/or 'noattr' attributes. * * If you undefine the SWIG_FAST_REC_SEARCH no attribute will be set * while searching. This could be slower for large projects with very * large hierarchy trees... or maybe not. But it will be cleaner. * * Maybe later a swig option can be added to switch at runtime. * * ----------------------------------------------------------------------------- */ /* #define SWIG_FAST_REC_SEARCH 1 */ static String *recursive_flag_search(Node *n, const String *attr, const String *noattr) { String *f = 0; n = Swig_methodclass(n); if (GetFlag(n, noattr)) { return 0; } f = GetFlagAttr(n, attr); if (f) { return f; } else { List *bl = Getattr(n, "bases"); if (bl) { Iterator bi; for (bi = First(bl); bi.item; bi = Next(bi)) { f = recursive_flag_search(bi.item, attr, noattr); if (f) { #ifdef SWIG_FAST_REC_SEARCH SetFlagAttr(n, attr, f); #endif return f; } } } } #ifdef SWIG_FAST_REC_SEARCH SetFlag(n, noattr); #endif return 0; } /* ----------------------------------------------------------------------------- * Swig_unref_call() * * Find the "feature:unref" call, if any. * ----------------------------------------------------------------------------- */ String *Swig_unref_call(Node *n) { String *unref = recursive_flag_search(n, "feature:unref", "feature:nounref"); if (unref) { String *pname = Swig_cparm_name(0, 0); unref = NewString(unref); Replaceall(unref, "$this", pname); Replaceall(unref, "$self", pname); Delete(pname); } return unref; } /* ----------------------------------------------------------------------------- * Swig_ref_call() * * Find the "feature:ref" call, if any. * ----------------------------------------------------------------------------- */ String *Swig_ref_call(Node *n, const String *lname) { String *ref = recursive_flag_search(n, "feature:ref", "feature:noref"); if (ref) { ref = NewString(ref); Replaceall(ref, "$this", lname); Replaceall(ref, "$self", lname); } return ref; } /* ----------------------------------------------------------------------------- * Swig_cdestructor_call() * * Creates a string that calls a C destructor function. * * free((char *) arg0); * ----------------------------------------------------------------------------- */ String *Swig_cdestructor_call(Node *n) { Node *cn = Swig_methodclass(n); String *unref = Swig_unref_call(cn); if (unref) { return unref; } else { String *pname = Swig_cparm_name(0, 0); String *call = NewStringf("free((char *) %s);", pname); Delete(pname); return call; } } /* ----------------------------------------------------------------------------- * Swig_cppdestructor_call() * * Creates a string that calls a C destructor function. * * delete arg1; * ----------------------------------------------------------------------------- */ String *Swig_cppdestructor_call(Node *n) { Node *cn = Swig_methodclass(n); String *unref = Swig_unref_call(cn); if (unref) { return unref; } else { String *pname = Swig_cparm_name(0, 0); String *call = NewStringf("delete %s;", pname); Delete(pname); return call; } } /* ----------------------------------------------------------------------------- * Swig_cmemberset_call() * * Generates a string that sets the name of a member in a C++ class or C struct. * * arg0->name = arg1 * * ----------------------------------------------------------------------------- */ String *Swig_cmemberset_call(const_String_or_char_ptr name, SwigType *type, String *self, int varcref) { String *func; String *pname0 = Swig_cparm_name(0, 0); String *pname1 = Swig_cparm_name(0, 1); func = NewStringEmpty(); if (!self) self = NewString("(this)->"); else self = NewString(self); Replaceall(self, "this", pname0); if (SwigType_type(type) != T_ARRAY) { if (!Strstr(type, "enum $unnamed")) { String *dref = Swig_wrapped_var_deref(type, pname1, varcref); int extra_cast = 0; if (cparse_cplusplusout) { /* Required for C nested structs compiled as C++ as a duplicate of the nested struct is put into the global namespace. * We could improve this by adding the extra casts just for nested structs rather than all structs. */ String *base = SwigType_base(type); extra_cast = SwigType_isclass(base); Delete(base); } if (extra_cast) { String *lstr; SwigType *ptype = Copy(type); SwigType_add_pointer(ptype); lstr = SwigType_lstr(ptype, 0); Printf(func, "if (%s) *(%s)&%s%s = %s", pname0, lstr, self, name, dref); Delete(lstr); Delete(ptype); } else { Printf(func, "if (%s) %s%s = %s", pname0, self, name, dref); } Delete(dref); } else { Printf(func, "if (%s && sizeof(int) == sizeof(%s%s)) *(int*)(void*)&(%s%s) = %s", pname0, self, name, self, name, pname1); } } Delete(self); Delete(pname0); Delete(pname1); return (func); } /* ----------------------------------------------------------------------------- * Swig_cmemberget_call() * * Generates a string that sets the name of a member in a C++ class or C struct. * * arg0->name * * ----------------------------------------------------------------------------- */ String *Swig_cmemberget_call(const_String_or_char_ptr name, SwigType *t, String *self, int varcref) { String *func; String *call; String *pname0 = Swig_cparm_name(0, 0); if (!self) self = NewString("(this)->"); else self = NewString(self); Replaceall(self, "this", pname0); func = NewStringEmpty(); call = Swig_wrapped_var_assign(t, "", varcref); Printf(func, "%s (%s%s)", call, self, name); Delete(self); Delete(call); Delete(pname0); return func; } /* ----------------------------------------------------------------------------- * Swig_replace_special_variables() * * Replaces special variables with a value from the supplied node * ----------------------------------------------------------------------------- */ void Swig_replace_special_variables(Node *n, Node *parentnode, String *code) { Node *parentclass = parentnode; String *overloaded = Getattr(n, "sym:overloaded"); Replaceall(code, "$name", Getattr(n, "name")); Replaceall(code, "$symname", Getattr(n, "sym:name")); Replaceall(code, "$wrapname", Getattr(n, "wrap:name")); Replaceall(code, "$overname", overloaded ? Char(Getattr(n, "sym:overname")) : ""); if (Strstr(code, "$decl")) { String *decl = Swig_name_decl(n); Replaceall(code, "$decl", decl); Delete(decl); } if (Strstr(code, "$fulldecl")) { String *fulldecl = Swig_name_fulldecl(n); Replaceall(code, "$fulldecl", fulldecl); Delete(fulldecl); } if (parentclass && !Equal(nodeType(parentclass), "class")) parentclass = 0; if (Strstr(code, "$parentclasssymname")) { String *parentclasssymname = 0; if (parentclass) parentclasssymname = Getattr(parentclass, "sym:name"); Replaceall(code, "$parentclasssymname", parentclasssymname ? parentclasssymname : ""); } if (Strstr(code, "$parentclassname")) { String *parentclassname = 0; if (parentclass) parentclassname = Getattr(parentclass, "name"); Replaceall(code, "$parentclassname", parentclassname ? SwigType_str(parentclassname, "") : ""); } } /* ----------------------------------------------------------------------------- * extension_code() * * Generates an extension function (a function defined in %extend) * * return_type function_name(parms) code * * ----------------------------------------------------------------------------- */ static String *extension_code(Node *n, const String *function_name, ParmList *parms, SwigType *return_type, const String *code, int cplusplus, const String *self) { String *parms_str = cplusplus ? ParmList_str_defaultargs(parms) : ParmList_str(parms); String *sig = NewStringf("%s(%s)", function_name, (cplusplus || Len(parms_str)) ? parms_str : "void"); String *rt_sig = SwigType_str(return_type, sig); String *body = NewStringf("SWIGINTERN %s", rt_sig); Printv(body, code, "\n", NIL); if (Strstr(body, "$")) { Swig_replace_special_variables(n, parentNode(parentNode(n)), body); if (self) Replaceall(body, "$self", self); } Delete(parms_str); Delete(sig); Delete(rt_sig); return body; } /* ----------------------------------------------------------------------------- * Swig_add_extension_code() * * Generates an extension function (a function defined in %extend) and * adds it to the "wrap:code" attribute of a node * * See also extension_code() * * ----------------------------------------------------------------------------- */ int Swig_add_extension_code(Node *n, const String *function_name, ParmList *parms, SwigType *return_type, const String *code, int cplusplus, const String *self) { String *body = extension_code(n, function_name, parms, return_type, code, cplusplus, self); Setattr(n, "wrap:code", body); Delete(body); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_MethodToFunction(Node *n) * * Converts a C++ method node to a function accessor function. * ----------------------------------------------------------------------------- */ int Swig_MethodToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, int flags, SwigType *director_type, int is_director) { String *name; ParmList *parms; SwigType *type; Parm *p; String *self = 0; int is_smart_pointer_overload = 0; String *qualifier = Getattr(n, "qualifier"); String *directorScope = NewString(nspace); Replace(directorScope, NSPACE_SEPARATOR, "_", DOH_REPLACE_ANY); /* If smart pointer without const overload or mutable method, change self dereferencing */ if (flags & CWRAP_SMART_POINTER) { if (flags & CWRAP_SMART_POINTER_OVERLOAD) { if (qualifier && strncmp(Char(qualifier), "q(const)", 8) == 0) { self = NewString("(*(this))->"); is_smart_pointer_overload = 1; } else if (Swig_storage_isstatic(n)) { String *cname = Getattr(n, "extendsmartclassname") ? Getattr(n, "extendsmartclassname") : classname; String *ctname = SwigType_namestr(cname); self = NewStringf("(*(%s const *)this)->", ctname); is_smart_pointer_overload = 1; Delete(ctname); } else { self = NewString("(*this)->"); } } else { self = NewString("(*this)->"); } } /* If node is a member template expansion, we don't allow added code */ if (Getattr(n, "templatetype")) flags &= ~(CWRAP_EXTEND); name = Getattr(n, "name"); parms = CopyParmList(nonvoid_parms(Getattr(n, "parms"))); type = NewString(classname); if (qualifier) { SwigType_push(type, qualifier); } SwigType_add_pointer(type); p = NewParm(type, "self", n); Setattr(p, "self", "1"); Setattr(p, "hidden","1"); /* Disable the 'this' ownership in 'self' to manage inplace operations like: A& A::operator+=(int i) { ...; return *this;} Here the 'self' parameter ownership needs to be disabled since there could be two objects sharing the same 'this' pointer: the input and the result one. And worse, the pointer could be deleted in one of the objects (input), leaving the other (output) with just a seg. fault to happen. To avoid the previous problem, use %feature("self:disown") *::operator+=; %feature("new") *::operator+=; These two lines just transfer the ownership of the 'this' pointer from the input to the output wrapping object. This happens in python, but may also happen in other target languages. */ if (GetFlag(n, "feature:self:disown")) { Setattr(p, "wrap:disown", "1"); } set_nextSibling(p, parms); Delete(type); /* Generate action code for the access */ if (!(flags & CWRAP_EXTEND)) { String *explicit_qualifier = 0; String *call = 0; String *cres = 0; String *explicitcall_name = 0; int pure_virtual = !(Cmp(Getattr(n, "storage"), "virtual")) && !(Cmp(Getattr(n, "value"), "0")); /* Call the explicit method rather than allow for a polymorphic call */ if ((flags & CWRAP_DIRECTOR_TWO_CALLS) || (flags & CWRAP_DIRECTOR_ONE_CALL)) { String *access = Getattr(n, "access"); if (access && (Cmp(access, "protected") == 0)) { /* If protected access (can only be if a director method) then call the extra public accessor method (language module must provide this) */ String *explicit_qualifier_tmp = SwigType_namestr(Getattr(Getattr(parentNode(n), "typescope"), "qname")); explicitcall_name = NewStringf("%sSwigPublic", name); if (Len(directorScope) > 0) explicit_qualifier = NewStringf("SwigDirector_%s_%s", directorScope, explicit_qualifier_tmp); else explicit_qualifier = NewStringf("SwigDirector_%s", explicit_qualifier_tmp); Delete(explicit_qualifier_tmp); } else { explicit_qualifier = SwigType_namestr(Getattr(Getattr(parentNode(n), "typescope"), "qname")); } } if (!self && SwigType_isrvalue_reference(Getattr(n, "refqualifier"))) { String *memory_header = NewString(""); Setfile(memory_header, Getfile(n)); Setline(memory_header, Getline(n)); Swig_fragment_emit(memory_header); self = NewString("std::move(*this)."); Delete(memory_header); } call = Swig_cmethod_call(explicitcall_name ? explicitcall_name : name, p, self, explicit_qualifier, director_type); cres = Swig_cresult(Getattr(n, "type"), Swig_cresult_name(), call); if (pure_virtual && is_director && (flags & CWRAP_DIRECTOR_TWO_CALLS)) { String *qualifier = SwigType_namestr(Getattr(Getattr(parentNode(n), "typescope"), "qname")); Delete(cres); cres = NewStringf("Swig::DirectorPureVirtualException::raise(\"%s::%s\");", qualifier, name); Delete(qualifier); } if (flags & CWRAP_DIRECTOR_TWO_CALLS) { /* Create two method calls, one to call the explicit method, the other a normal polymorphic function call */ String *cres_both_calls = NewStringf(""); String *call_extra = Swig_cmethod_call(name, p, self, 0, director_type); String *cres_extra = Swig_cresult(Getattr(n, "type"), Swig_cresult_name(), call_extra); Printv(cres_both_calls, "if (upcall) {\n", cres, "\n", "} else {", cres_extra, "\n}", NIL); Setattr(n, "wrap:action", cres_both_calls); Delete(cres_extra); Delete(call_extra); Delete(cres_both_calls); } else { Setattr(n, "wrap:action", cres); } Delete(explicitcall_name); Delete(call); Delete(cres); Delete(explicit_qualifier); } else { /* Methods with default arguments are wrapped with additional methods for each default argument, * however, only one extra %extend method is generated. */ String *defaultargs = Getattr(n, "defaultargs"); String *code = Getattr(n, "code"); String *cname = Getattr(n, "extendsmartclassname") ? Getattr(n, "extendsmartclassname") : classname; String *membername = Swig_name_member(nspace, cname, name); String *mangled = Swig_name_mangle(membername); int is_smart_pointer = flags & CWRAP_SMART_POINTER; type = Getattr(n, "type"); /* Check if the method is overloaded. If so, and it has code attached, we append an extra suffix to avoid a name-clash in the generated wrappers. This allows overloaded methods to be defined in C. */ if (Getattr(n, "sym:overloaded") && code) { Append(mangled, Getattr(defaultargs ? defaultargs : n, "sym:overname")); } /* See if there is any code that we need to emit */ if (!defaultargs && code && !is_smart_pointer) { Swig_add_extension_code(n, mangled, p, type, code, cparse_cplusplus, "self"); } if (is_smart_pointer) { int i = 0; Parm *pp = p; String *func = NewStringf("%s(", mangled); String *cres; if (!Swig_storage_isstatic(n)) { String *pname = Swig_cparm_name(pp, i); String *ctname = SwigType_namestr(cname); String *fadd = 0; if (is_smart_pointer_overload) { String *nclassname = SwigType_namestr(classname); fadd = NewStringf("(%s const *)((%s const *)%s)->operator ->()", ctname, nclassname, pname); Delete(nclassname); } else { fadd = NewStringf("(%s*)(%s)->operator ->()", ctname, pname); } Append(func, fadd); Delete(ctname); Delete(fadd); Delete(pname); pp = nextSibling(pp); if (pp) Append(func, ","); } else { pp = nextSibling(pp); } ++i; while (pp) { SwigType *pt = Getattr(pp, "type"); if ((SwigType_type(pt) != T_VOID)) { String *pname = Swig_cparm_name(pp, i++); String *rcaststr = SwigType_rcaststr(pt, pname); Append(func, rcaststr); Delete(rcaststr); Delete(pname); pp = nextSibling(pp); if (pp) Append(func, ","); } } Append(func, ")"); cres = Swig_cresult(Getattr(n, "type"), Swig_cresult_name(), func); Setattr(n, "wrap:action", cres); Delete(cres); } else { String *call = Swig_cfunction_call(mangled, p); String *cres = Swig_cresult(Getattr(n, "type"), Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } Delete(membername); Delete(mangled); } Setattr(n, "parms", p); Delete(p); Delete(self); Delete(parms); Delete(directorScope); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_methodclass() * * This function returns the class node for a given method or class. * ----------------------------------------------------------------------------- */ Node *Swig_methodclass(Node *n) { Node *nodetype = nodeType(n); if (Cmp(nodetype, "class") == 0) return n; return GetFlag(n, "feature:extend") ? parentNode(parentNode(n)) : parentNode(n); } int Swig_directorclass(Node *n) { Node *classNode = Swig_methodclass(n); assert(classNode != 0); return (Getattr(classNode, "vtable") != 0); } Node *Swig_directormap(Node *module, String *type) { int is_void = !Cmp(type, "void"); if (!is_void && module) { /* ?? follow the inheritance hierarchy? */ String *base = SwigType_base(type); Node *directormap = Getattr(module, "wrap:directormap"); if (directormap) return Getattr(directormap, base); } return 0; } /* ----------------------------------------------------------------------------- * Swig_ConstructorToFunction() * * This function creates a C wrapper for a C constructor function. * ----------------------------------------------------------------------------- */ int Swig_ConstructorToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, String *none_comparison, String *director_ctor, int cplus, int flags, String *directorname) { Parm *p; ParmList *directorparms; SwigType *type; int use_director = Swig_directorclass(n); ParmList *parms = CopyParmList(nonvoid_parms(Getattr(n, "parms"))); /* Prepend the list of prefix_args (if any) */ Parm *prefix_args = Getattr(n, "director:prefix_args"); if (prefix_args != NIL) { Parm *p2, *p3; directorparms = CopyParmList(prefix_args); for (p = directorparms; nextSibling(p); p = nextSibling(p)); for (p2 = parms; p2; p2 = nextSibling(p2)) { p3 = CopyParm(p2); set_nextSibling(p, p3); Delete(p3); p = p3; } } else directorparms = parms; type = NewString(classname); SwigType_add_pointer(type); if (flags & CWRAP_EXTEND) { /* Constructors with default arguments are wrapped with additional constructor methods for each default argument, * however, only one extra %extend method is generated. */ String *call; String *cres; String *defaultargs = Getattr(n, "defaultargs"); String *code = Getattr(n, "code"); String *membername = Swig_name_construct(nspace, classname); String *mangled = Swig_name_mangle(membername); /* Check if the constructor is overloaded. If so, and it has code attached, we append an extra suffix to avoid a name-clash in the generated wrappers. This allows overloaded constructors to be defined in C. */ if (Getattr(n, "sym:overloaded") && code) { Append(mangled, Getattr(defaultargs ? defaultargs : n, "sym:overname")); } /* See if there is any code that we need to emit */ if (!defaultargs && code) { Swig_add_extension_code(n, mangled, parms, type, code, cparse_cplusplus, "self"); } call = Swig_cfunction_call(mangled, parms); cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); Delete(membername); Delete(mangled); } else { if (cplus) { /* if a C++ director class exists, create it rather than the original class */ if (use_director) { Node *parent = Swig_methodclass(n); int abstract = Getattr(parent, "abstracts") != 0; String *action = NewStringEmpty(); String *tmp_none_comparison = Copy(none_comparison); String *director_call; String *nodirector_call; Replaceall(tmp_none_comparison, "$arg", "arg1"); director_call = Swig_cppconstructor_director_call(directorname, directorparms); nodirector_call = Swig_cppconstructor_nodirector_call(classname, parms); if (abstract) { /* whether or not the abstract class has been subclassed in python, * create a director instance (there's no way to create a normal * instance). if any of the pure virtual methods haven't been * implemented in the target language, calls to those methods will * generate Swig::DirectorPureVirtualException exceptions. */ String *cres = Swig_cresult(type, Swig_cresult_name(), director_call); Append(action, cres); Delete(cres); } else { /* (scottm): The code for creating a new director is now a string template that gets passed in via the director_ctor argument. $comparison : an 'if' comparison from none_comparison $director_new: Call new for director class $nondirector_new: Call new for non-director class */ String *cres; Append(action, director_ctor); Replaceall(action, "$comparison", tmp_none_comparison); cres = Swig_cresult(type, Swig_cresult_name(), director_call); Replaceall(action, "$director_new", cres); Delete(cres); cres = Swig_cresult(type, Swig_cresult_name(), nodirector_call); Replaceall(action, "$nondirector_new", cres); Delete(cres); } Setattr(n, "wrap:action", action); Delete(tmp_none_comparison); Delete(action); } else { String *call = Swig_cppconstructor_call(classname, parms); String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); } } else { String *call = Swig_cconstructor_call(classname); String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); } } Setattr(n, "type", type); Setattr(n, "parms", parms); Delete(type); if (directorparms != parms) Delete(directorparms); Delete(parms); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_DestructorToFunction() * * This function creates a C wrapper for a destructor function. * ----------------------------------------------------------------------------- */ int Swig_DestructorToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, int cplus, int flags) { SwigType *type; Parm *p; type = NewString(classname); SwigType_add_pointer(type); p = NewParm(type, "self", n); Setattr(p, "self", "1"); Setattr(p, "hidden", "1"); Setattr(p, "wrap:disown", "1"); Delete(type); type = NewString("void"); if (flags & CWRAP_EXTEND) { String *cres; String *call; String *membername, *mangled, *code; membername = Swig_name_destroy(nspace, classname); mangled = Swig_name_mangle(membername); code = Getattr(n, "code"); if (code) { Swig_add_extension_code(n, mangled, p, type, code, cparse_cplusplus, "self"); } call = Swig_cfunction_call(mangled, p); cres = NewStringf("%s;", call); Setattr(n, "wrap:action", cres); Delete(membername); Delete(mangled); Delete(call); Delete(cres); } else { if (cplus) { String *call = Swig_cppdestructor_call(n); String *cres = NewStringf("%s", call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } else { String *call = Swig_cdestructor_call(n); String *cres = NewStringf("%s", call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } } Setattr(n, "type", type); Setattr(n, "parms", p); Delete(type); Delete(p); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_MembersetToFunction() * * This function creates a C wrapper for setting a structure member. * ----------------------------------------------------------------------------- */ int Swig_MembersetToFunction(Node *n, String *classname, int flags) { String *name; ParmList *parms; Parm *p; SwigType *t; SwigType *ty; SwigType *type; SwigType *void_type = NewString("void"); String *self = 0; int varcref = flags & CWRAP_NATURAL_VAR; if (flags & CWRAP_SMART_POINTER) { self = NewString("(*this)->"); } if (flags & CWRAP_ALL_PROTECTED_ACCESS) { self = NewStringf("darg->"); } name = Getattr(n, "name"); type = Getattr(n, "type"); t = NewString(classname); SwigType_add_pointer(t); parms = NewParm(t, "self", n); Setattr(parms, "self", "1"); Setattr(parms, "hidden","1"); Delete(t); ty = Swig_wrapped_member_var_type(type, varcref); p = NewParm(ty, name, n); Setattr(parms, "hidden", "1"); set_nextSibling(parms, p); /* If the type is a pointer or reference. We mark it with a special wrap:disown attribute */ if (SwigType_check_decl(type, "p.")) { Setattr(p, "wrap:disown", "1"); } Delete(p); if (flags & CWRAP_EXTEND) { String *call; String *cres; String *code = Getattr(n, "code"); String *sname = Swig_name_set(0, name); String *membername = Swig_name_member(0, classname, sname); String *mangled = Swig_name_mangle(membername); if (code) { /* I don't think this ever gets run - WSF */ Swig_add_extension_code(n, mangled, parms, void_type, code, cparse_cplusplus, "self"); } call = Swig_cfunction_call(mangled, parms); cres = NewStringf("%s;", call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); Delete(mangled); Delete(membername); Delete(sname); } else { String *call = Swig_cmemberset_call(name, type, self, varcref); String *cres = NewStringf("%s;", call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } Setattr(n, "type", void_type); Setattr(n, "parms", parms); Delete(parms); Delete(ty); Delete(void_type); Delete(self); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_MembergetToFunction() * * This function creates a C wrapper for getting a structure member. * ----------------------------------------------------------------------------- */ int Swig_MembergetToFunction(Node *n, String *classname, int flags) { String *name; ParmList *parms; SwigType *t; SwigType *ty; SwigType *type; String *self = 0; int varcref = flags & CWRAP_NATURAL_VAR; if (flags & CWRAP_SMART_POINTER) { if (Swig_storage_isstatic(n)) { Node *sn = Getattr(n, "cplus:staticbase"); String *base = Getattr(sn, "name"); self = NewStringf("%s::", base); } else if (flags & CWRAP_SMART_POINTER_OVERLOAD) { String *nclassname = SwigType_namestr(classname); self = NewStringf("(*(%s const *)this)->", nclassname); Delete(nclassname); } else { self = NewString("(*this)->"); } } if (flags & CWRAP_ALL_PROTECTED_ACCESS) { self = NewStringf("darg->"); } name = Getattr(n, "name"); type = Getattr(n, "type"); t = NewString(classname); SwigType_add_pointer(t); parms = NewParm(t, "self", n); Setattr(parms, "self", "1"); Setattr(parms, "hidden","1"); Delete(t); ty = Swig_wrapped_member_var_type(type, varcref); if (flags & CWRAP_EXTEND) { String *call; String *cres; String *code = Getattr(n, "code"); String *gname = Swig_name_get(0, name); String *membername = Swig_name_member(0, classname, gname); String *mangled = Swig_name_mangle(membername); if (code) { /* I don't think this ever gets run - WSF */ Swig_add_extension_code(n, mangled, parms, ty, code, cparse_cplusplus, "self"); } call = Swig_cfunction_call(mangled, parms); cres = Swig_cresult(ty, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); Delete(mangled); Delete(membername); Delete(gname); } else { String *call = Swig_cmemberget_call(name, type, self, varcref); String *cres = Swig_cresult(ty, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } Setattr(n, "type", ty); Setattr(n, "parms", parms); Delete(parms); Delete(ty); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_VarsetToFunction() * * This function creates a C wrapper for setting a global variable or static member * variable. * ----------------------------------------------------------------------------- */ int Swig_VarsetToFunction(Node *n, int flags) { String *name, *nname; ParmList *parms; SwigType *type, *ty; int varcref = flags & CWRAP_NATURAL_VAR; name = Getattr(n, "name"); type = Getattr(n, "type"); nname = SwigType_namestr(name); ty = Swig_wrapped_var_type(type, varcref); parms = NewParm(ty, name, n); if (flags & CWRAP_EXTEND) { String *sname = Swig_name_set(0, name); String *mangled = Swig_name_mangle(sname); String *call = Swig_cfunction_call(mangled, parms); String *cres = NewStringf("%s;", call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); Delete(mangled); Delete(sname); } else { if (!Strstr(type, "enum $unnamed")) { String *pname = Swig_cparm_name(0, 0); String *dref = Swig_wrapped_var_deref(type, pname, varcref); String *call = NewStringf("%s = %s;", nname, dref); Setattr(n, "wrap:action", call); Delete(call); Delete(dref); Delete(pname); } else { String *pname = Swig_cparm_name(0, 0); String *call = NewStringf("if (sizeof(int) == sizeof(%s)) *(int*)(void*)&(%s) = %s;", nname, nname, pname); Setattr(n, "wrap:action", call); Delete(pname); Delete(call); } } Setattr(n, "type", "void"); Setattr(n, "parms", parms); Delete(parms); Delete(ty); Delete(nname); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_VargetToFunction() * * This function creates a C wrapper for getting a global variable or static member * variable. * ----------------------------------------------------------------------------- */ int Swig_VargetToFunction(Node *n, int flags) { String *cres, *call; String *name; SwigType *type; SwigType *ty = 0; int varcref = flags & CWRAP_NATURAL_VAR; name = Getattr(n, "name"); type = Getattr(n, "type"); ty = Swig_wrapped_var_type(type, varcref); if (flags & CWRAP_EXTEND) { String *sname = Swig_name_get(0, name); String *mangled = Swig_name_mangle(sname); call = Swig_cfunction_call(mangled, 0); cres = Swig_cresult(ty, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(mangled); Delete(sname); } else { String *nname = 0; if (Equal(nodeType(n), "constant")) { String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); nname = NewStringf("(%s)", value); } else { nname = SwigType_namestr(name); } call = Swig_wrapped_var_assign(type, nname, varcref); cres = Swig_cresult(ty, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(nname); } Setattr(n, "type", ty); Delattr(n, "parms"); Delete(cres); Delete(call); Delete(ty); return SWIG_OK; } swig-4.0.2/Source/Swig/deprecate.c0000644000175000017500000000753213667507523016642 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * deprecate.c * * The functions in this file are SWIG core functions that are deprecated * or which do not fit in nicely with everything else. Generally this means * that the function and/or API needs to be changed in some future release. * ----------------------------------------------------------------------------- */ #include "swig.h" /* --------------------------------------------------------------------- * ParmList_is_compactdefargs() * * Returns 1 if the parameter list passed in is marked for compact argument * handling (by the "compactdefargs" attribute). Otherwise returns 0. * ---------------------------------------------------------------------- */ /* Discussion: "compactdefargs" is a property set by the Parser to indicate special handling of default arguments. This property seems to be something that is associated with functions and methods rather than low-level ParmList objects. Therefore, I don't like the fact that this special purpose feature is bolted onto the side of ParmList objects. Proposed solution: 1. "compactdefargs" should be a feature set on function/method nodes instead of ParmList objects. For example, if you have a function, you would check the function node to see if the parameters are to be handled in this way. Difficulties: 1. This is used by functions in cwrap.c and emit.cxx, none of which are passed information about the function/method node. We might have to change the API of those functions to make this work correctly. For example: int emit_num_required(ParmList *parms) might become int emit_num_required(ParmList *parms, int compactargs) */ int ParmList_is_compactdefargs(ParmList *p) { int compactdefargs = 0; if (p) { compactdefargs = Getattr(p, "compactdefargs") ? 1 : 0; /* The "compactdefargs" attribute should only be set on the first parameter in the list. * However, sometimes an extra parameter is inserted at the beginning of the parameter list, * so we check the 2nd parameter too. */ if (!compactdefargs) { Parm *nextparm = nextSibling(p); compactdefargs = (nextparm && Getattr(nextparm, "compactdefargs")) ? 1 : 0; } } return compactdefargs; } /* --------------------------------------------------------------------- * ParmList_errorstr() * * Generate a prototype string suitable for use in error/warning messages. * Similar to ParmList_protostr() but is also aware of hidden parameters. * ---------------------------------------------------------------------- */ /* Discussion. This function is used to generate error messages, but take into account that there might be a hidden parameter. Although this involves parameter lists, it really isn't a core feature of swigparm.h or parms.c. This is because the "hidden" attribute of parameters is added elsewhere (cwrap.c). For now, this function is placed here because it doesn't really seem to fit in with the parms.c interface. */ String *ParmList_errorstr(ParmList *p) { String *out = NewStringEmpty(); while (p) { if (Getattr(p,"hidden")) { p = nextSibling(p); } else { String *pstr = SwigType_str(Getattr(p, "type"), 0); Append(out, pstr); p = nextSibling(p); if (p) { Append(out, ","); } Delete(pstr); } } return out; } swig-4.0.2/Source/Swig/wrapfunc.c0000644000175000017500000003100213667507523016520 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * wrapfunc.c * * This file defines a object for creating wrapper functions. Primarily * this is used for convenience since it allows pieces of a wrapper function * to be created in a piecemeal manner. * ----------------------------------------------------------------------------- */ #include "swig.h" #include static int Compact_mode = 0; /* set to 0 on default */ static int Max_line_size = 128; /* ----------------------------------------------------------------------------- * NewWrapper() * * Create a new wrapper function object. * ----------------------------------------------------------------------------- */ Wrapper *NewWrapper(void) { Wrapper *w; w = (Wrapper *) malloc(sizeof(Wrapper)); w->localh = NewHash(); w->locals = NewStringEmpty(); w->code = NewStringEmpty(); w->def = NewStringEmpty(); return w; } /* ----------------------------------------------------------------------------- * DelWrapper() * * Delete a wrapper function object. * ----------------------------------------------------------------------------- */ void DelWrapper(Wrapper *w) { Delete(w->localh); Delete(w->locals); Delete(w->code); Delete(w->def); free(w); } /* ----------------------------------------------------------------------------- * Wrapper_compact_print_mode_set() * * Set compact_mode. * ----------------------------------------------------------------------------- */ void Wrapper_compact_print_mode_set(int flag) { Compact_mode = flag; } /* ----------------------------------------------------------------------------- * Wrapper_pretty_print() * * Formats a wrapper function and fixes up the indentation. * ----------------------------------------------------------------------------- */ void Wrapper_pretty_print(String *str, File *f) { String *ts; int level = 0; int c, i; int empty = 1; int indent = 2; int plevel = 0; int label = 0; ts = NewStringEmpty(); Seek(str, 0, SEEK_SET); while ((c = Getc(str)) != EOF) { if (c == '\"') { Putc(c, ts); while ((c = Getc(str)) != EOF) { if (c == '\\') { Putc(c, ts); c = Getc(str); } Putc(c, ts); if (c == '\"') break; } empty = 0; } else if (c == '\'') { Putc(c, ts); while ((c = Getc(str)) != EOF) { if (c == '\\') { Putc(c, ts); c = Getc(str); } Putc(c, ts); if (c == '\'') break; } empty = 0; } else if (c == ':') { Putc(c, ts); if ((c = Getc(str)) == '\n') { if (!empty && !strchr(Char(ts), '?')) label = 1; } Ungetc(c, str); } else if (c == '(') { Putc(c, ts); plevel += indent; empty = 0; } else if (c == ')') { Putc(c, ts); plevel -= indent; empty = 0; } else if (c == '{') { Putc(c, ts); Putc('\n', ts); for (i = 0; i < level; i++) Putc(' ', f); Printf(f, "%s", ts); Clear(ts); level += indent; while ((c = Getc(str)) != EOF) { if (!isspace(c)) { Ungetc(c, str); break; } } empty = 0; } else if (c == '}') { if (!empty) { Putc('\n', ts); for (i = 0; i < level; i++) Putc(' ', f); Printf(f, "%s", ts); Clear(ts); } level -= indent; Putc(c, ts); empty = 0; } else if (c == '\n') { Putc(c, ts); empty = 0; if (!empty) { int slevel = level; if (label && (slevel >= indent)) slevel -= indent; if ((Char(ts))[0] != '#') { for (i = 0; i < slevel; i++) Putc(' ', f); } Printf(f, "%s", ts); for (i = 0; i < plevel; i++) Putc(' ', f); } Clear(ts); label = 0; empty = 1; } else if (c == '/') { empty = 0; Putc(c, ts); c = Getc(str); if (c != EOF) { Putc(c, ts); if (c == '/') { /* C++ comment */ while ((c = Getc(str)) != EOF) { if (c == '\n') { Ungetc(c, str); break; } Putc(c, ts); } } else if (c == '*') { /* C comment */ int endstar = 0; while ((c = Getc(str)) != EOF) { if (endstar && c == '/') { /* end of C comment */ Putc(c, ts); break; } endstar = (c == '*'); Putc(c, ts); if (c == '\n') { /* multi-line C comment. Could be improved slightly. */ for (i = 0; i < level; i++) Putc(' ', ts); } } } } } else { if (!empty || !isspace(c)) { Putc(c, ts); empty = 0; } } } if (!empty) Printf(f, "%s", ts); Delete(ts); Printf(f, "\n"); } /* ----------------------------------------------------------------------------- * Wrapper_compact_print() * * Formats a wrapper function and fixes up the indentation. * Print out in compact format, with Compact enabled. * ----------------------------------------------------------------------------- */ void Wrapper_compact_print(String *str, File *f) { String *ts, *tf; /*temp string & temp file */ int level = 0; int c, i; int empty = 1; int indent = 2; ts = NewStringEmpty(); tf = NewStringEmpty(); Seek(str, 0, SEEK_SET); while ((c = Getc(str)) != EOF) { if (c == '\"') { /* string 1 */ empty = 0; Putc(c, ts); while ((c = Getc(str)) != EOF) { if (c == '\\') { Putc(c, ts); c = Getc(str); } Putc(c, ts); if (c == '\"') break; } } else if (c == '\'') { /* string 2 */ empty = 0; Putc(c, ts); while ((c = Getc(str)) != EOF) { if (c == '\\') { Putc(c, ts); c = Getc(str); } Putc(c, ts); if (c == '\'') break; } } else if (c == '{') { /* start of {...} */ empty = 0; Putc(c, ts); if (Len(tf) == 0) { for (i = 0; i < level; i++) Putc(' ', tf); } else if ((Len(tf) + Len(ts)) < Max_line_size) { Putc(' ', tf); } else { Putc('\n', tf); Printf(f, "%s", tf); Clear(tf); for (i = 0; i < level; i++) Putc(' ', tf); } Append(tf, ts); Clear(ts); level += indent; while ((c = Getc(str)) != EOF) { if (!isspace(c)) { Ungetc(c, str); break; } } } else if (c == '}') { /* end of {...} */ empty = 0; if (Len(tf) == 0) { for (i = 0; i < level; i++) Putc(' ', tf); } else if ((Len(tf) + Len(ts)) < Max_line_size) { Putc(' ', tf); } else { Putc('\n', tf); Printf(f, "%s", tf); Clear(tf); for (i = 0; i < level; i++) Putc(' ', tf); } Append(tf, ts); Putc(c, tf); Clear(ts); level -= indent; } else if (c == '\n') { /* line end */ while ((c = Getc(str)) != EOF) { if (!isspace(c)) break; } if (c == '#') { Putc('\n', ts); } else if (c == '}') { Putc(' ', ts); } else if ((c != EOF) || (Len(ts) != 0)) { if (Len(tf) == 0) { for (i = 0; i < level; i++) Putc(' ', tf); } else if ((Len(tf) + Len(ts)) < Max_line_size) { Putc(' ', tf); } else { Putc('\n', tf); Printf(f, "%s", tf); Clear(tf); for (i = 0; i < level; i++) Putc(' ', tf); } Append(tf, ts); Clear(ts); } Ungetc(c, str); empty = 1; } else if (c == '/') { /* comment */ empty = 0; c = Getc(str); if (c != EOF) { if (c == '/') { /* C++ comment */ while ((c = Getc(str)) != EOF) { if (c == '\n') { Ungetc(c, str); break; } } } else if (c == '*') { /* C comment */ int endstar = 0; while ((c = Getc(str)) != EOF) { if (endstar && c == '/') { /* end of C comment */ break; } endstar = (c == '*'); } } else { Putc('/', ts); Putc(c, ts); } } } else if (c == '#') { /* Preprocessor line */ Putc('#', ts); while ((c = Getc(str)) != EOF) { Putc(c, ts); if (c == '\\') { /* Continued line of the same PP */ c = Getc(str); if (c == '\n') Putc(c, ts); else Ungetc(c, str); } else if (c == '\n') break; } if (!empty) { Append(tf, "\n"); } Append(tf, ts); Printf(f, "%s", tf); Clear(tf); Clear(ts); for (i = 0; i < level; i++) Putc(' ', tf); empty = 1; } else { if (!empty || !isspace(c)) { Putc(c, ts); empty = 0; } } } if (!empty) { Append(tf, ts); } if (Len(tf) != 0) Printf(f, "%s", tf); Delete(ts); Delete(tf); Printf(f, "\n"); } /* ----------------------------------------------------------------------------- * Wrapper_print() * * Print out a wrapper function. Does pretty or compact printing as well. * ----------------------------------------------------------------------------- */ void Wrapper_print(Wrapper *w, File *f) { String *str; str = NewStringEmpty(); Printf(str, "%s\n", w->def); Printf(str, "%s\n", w->locals); Printf(str, "%s\n", w->code); if (Compact_mode == 1) Wrapper_compact_print(str, f); else Wrapper_pretty_print(str, f); Delete(str); } /* ----------------------------------------------------------------------------- * Wrapper_add_local() * * Adds a new local variable declaration to a function. Returns -1 if already * present (which may or may not be okay to the caller). * ----------------------------------------------------------------------------- */ int Wrapper_add_local(Wrapper *w, const_String_or_char_ptr name, const_String_or_char_ptr decl) { /* See if the local has already been declared */ if (Getattr(w->localh, name)) { return -1; } Setattr(w->localh, name, decl); Printf(w->locals, "%s;\n", decl); return 0; } /* ----------------------------------------------------------------------------- * Wrapper_add_localv() * * Same as add_local(), but allows a NULL terminated list of strings to be * used as a replacement for decl. This saves the caller the trouble of having * to manually construct the 'decl' string before calling. * ----------------------------------------------------------------------------- */ int Wrapper_add_localv(Wrapper *w, const_String_or_char_ptr name, ...) { va_list ap; int ret; String *decl; DOH *obj; decl = NewStringEmpty(); va_start(ap, name); obj = va_arg(ap, void *); while (obj) { Append(decl, obj); Putc(' ', decl); obj = va_arg(ap, void *); } va_end(ap); ret = Wrapper_add_local(w, name, decl); Delete(decl); return ret; } /* ----------------------------------------------------------------------------- * Wrapper_check_local() * * Check to see if a local name has already been declared * ----------------------------------------------------------------------------- */ int Wrapper_check_local(Wrapper *w, const_String_or_char_ptr name) { if (Getattr(w->localh, name)) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Wrapper_new_local() * * Adds a new local variable with a guarantee that a unique local name will be * used. Returns the name that was actually selected. * ----------------------------------------------------------------------------- */ char *Wrapper_new_local(Wrapper *w, const_String_or_char_ptr name, const_String_or_char_ptr decl) { int i; String *nname = NewString(name); String *ndecl = NewString(decl); char *ret; i = 0; while (Wrapper_check_local(w, nname)) { Clear(nname); Printf(nname, "%s%d", name, i); i++; } Replace(ndecl, name, nname, DOH_REPLACE_ID); Setattr(w->localh, nname, ndecl); Printf(w->locals, "%s;\n", ndecl); ret = Char(nname); Delete(nname); Delete(ndecl); return ret; /* Note: nname should still exists in the w->localh hash */ } /* ----------------------------------------------------------------------------- * Wrapper_new_localv() * * Same as add_local(), but allows a NULL terminated list of strings to be * used as a replacement for decl. This saves the caller the trouble of having * to manually construct the 'decl' string before calling. * ----------------------------------------------------------------------------- */ char *Wrapper_new_localv(Wrapper *w, const_String_or_char_ptr name, ...) { va_list ap; char *ret; String *decl; DOH *obj; decl = NewStringEmpty(); va_start(ap, name); obj = va_arg(ap, void *); while (obj) { Append(decl, obj); Putc(' ', decl); obj = va_arg(ap, void *); } va_end(ap); ret = Wrapper_new_local(w, name, decl); Delete(decl); return ret; } swig-4.0.2/Source/Swig/swigfile.h0000644000175000017500000000400613667507523016515 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigfile.h * * File handling functions in the SWIG core * ----------------------------------------------------------------------------- */ extern List *Swig_add_directory(const_String_or_char_ptr dirname); extern void Swig_push_directory(const_String_or_char_ptr dirname); extern void Swig_pop_directory(void); extern String *Swig_last_file(void); extern List *Swig_search_path(void); extern FILE *Swig_include_open(const_String_or_char_ptr name); extern FILE *Swig_open(const_String_or_char_ptr name); extern String *Swig_read_file(FILE *f); extern String *Swig_include(const_String_or_char_ptr name); extern String *Swig_include_sys(const_String_or_char_ptr name); extern int Swig_insert_file(const_String_or_char_ptr name, File *outfile); extern void Swig_set_push_dir(int dopush); extern int Swig_get_push_dir(void); extern void Swig_register_filebyname(const_String_or_char_ptr filename, File *outfile); extern File *Swig_filebyname(const_String_or_char_ptr filename); extern String *Swig_file_extension(const_String_or_char_ptr filename); extern String *Swig_file_basename(const_String_or_char_ptr filename); extern String *Swig_file_filename(const_String_or_char_ptr filename); extern String *Swig_file_dirname(const_String_or_char_ptr filename); extern void Swig_file_debug_set(); /* Delimiter used in accessing files and directories */ #if defined(MACSWIG) # define SWIG_FILE_DELIMITER ":" #elif defined(_WIN32) # define SWIG_FILE_DELIMITER "\\" #else # define SWIG_FILE_DELIMITER "/" #endif swig-4.0.2/Source/Swig/extend.c0000644000175000017500000001127613667507523016175 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * extend.c * * Extensions support (%extend) * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" static Hash *extendhash = 0; /* Hash table of added methods */ /* ----------------------------------------------------------------------------- * Swig_extend_hash() * * Access the extend hash * ----------------------------------------------------------------------------- */ Hash *Swig_extend_hash(void) { if (!extendhash) extendhash = NewHash(); return extendhash; } /* ----------------------------------------------------------------------------- * Swig_extend_merge() * * Extension merge. This function is used to handle the %extend directive * when it appears before a class definition. To handle this, the %extend * actually needs to take precedence. Therefore, we will selectively nuke symbols * from the current symbol table, replacing them with the added methods. * ----------------------------------------------------------------------------- */ void Swig_extend_merge(Node *cls, Node *am) { Node *n; Node *csym; n = firstChild(am); while (n) { String *symname; if (Strcmp(nodeType(n),"constructor") == 0) { symname = Getattr(n,"sym:name"); if (symname) { if (Strcmp(symname,Getattr(n,"name")) == 0) { /* If the name and the sym:name of a constructor are the same, then it hasn't been renamed. However---the name of the class itself might have been renamed so we need to do a consistency check here */ if (Getattr(cls,"sym:name")) { Setattr(n,"sym:name", Getattr(cls,"sym:name")); } } } } symname = Getattr(n,"sym:name"); DohIncref(symname); if ((symname) && (!Getattr(n,"error"))) { /* Remove node from its symbol table */ Swig_symbol_remove(n); csym = Swig_symbol_add(symname,n); if (csym != n) { /* Conflict with previous definition. Nuke previous definition */ String *e = NewStringEmpty(); String *en = NewStringEmpty(); String *ec = NewStringEmpty(); Printf(ec,"Identifier '%s' redefined by %%extend (ignored),",symname); Printf(en,"%%extend definition of '%s'.",symname); SWIG_WARN_NODE_BEGIN(n); Swig_warning(WARN_PARSE_REDEFINED,Getfile(csym),Getline(csym),"%s\n",ec); Swig_warning(WARN_PARSE_REDEFINED,Getfile(n),Getline(n),"%s\n",en); SWIG_WARN_NODE_END(n); Printf(e,"%s:%d:%s\n%s:%d:%s\n",Getfile(csym),Getline(csym),ec, Getfile(n),Getline(n),en); Setattr(csym,"error",e); Delete(e); Delete(en); Delete(ec); Swig_symbol_remove(csym); /* Remove class definition */ Swig_symbol_add(symname,n); /* Insert extend definition */ } } n = nextSibling(n); } } /* ----------------------------------------------------------------------------- * Swig_extend_append_previous() * ----------------------------------------------------------------------------- */ void Swig_extend_append_previous(Node *cls, Node *am) { Node *n, *ne; Node *pe = 0; Node *ae = 0; if (!am) return; n = firstChild(am); while (n) { ne = nextSibling(n); set_nextSibling(n,0); /* typemaps and fragments need to be prepended */ if (((Cmp(nodeType(n),"typemap") == 0) || (Cmp(nodeType(n),"fragment") == 0))) { if (!pe) pe = Swig_cparse_new_node("extend"); appendChild(pe, n); } else { if (!ae) ae = Swig_cparse_new_node("extend"); appendChild(ae, n); } n = ne; } if (pe) prependChild(cls,pe); if (ae) appendChild(cls,ae); } /* ----------------------------------------------------------------------------- * Swig_extend_unused_check() * * Check for unused %extend. Special case, don't report unused * extensions for templates * ----------------------------------------------------------------------------- */ void Swig_extend_unused_check(void) { Iterator ki; if (!extendhash) return; for (ki = First(extendhash); ki.key; ki = Next(ki)) { if (!Strchr(ki.key,'<')) { SWIG_WARN_NODE_BEGIN(ki.item); Swig_warning(WARN_PARSE_EXTEND_UNDEF,Getfile(ki.item), Getline(ki.item), "%%extend defined for an undeclared class %s.\n", SwigType_namestr(ki.key)); SWIG_WARN_NODE_END(ki.item); } } } swig-4.0.2/Source/Swig/swigparm.h0000644000175000017500000000305413667507523016537 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigparm.h * * Functions related to the handling of function/method parameters and * parameter lists. * ----------------------------------------------------------------------------- */ /* Individual parameters */ extern Parm *NewParm(SwigType *type, const_String_or_char_ptr name, Node *from_node); extern Parm *NewParmWithoutFileLineInfo(SwigType *type, const_String_or_char_ptr name); extern Parm *NewParmNode(SwigType *type, Node *from_node); extern Parm *CopyParm(Parm *p); /* Parameter lists */ extern ParmList *CopyParmList(ParmList *); extern ParmList *CopyParmListMax(ParmList *, int count); extern int ParmList_len(ParmList *); extern int ParmList_numrequired(ParmList *); extern int ParmList_has_defaultargs(ParmList *p); extern int ParmList_has_varargs(ParmList *p); /* Output functions */ extern String *ParmList_str(ParmList *); extern String *ParmList_str_defaultargs(ParmList *); extern String *ParmList_str_multibrackets(ParmList *); extern String *ParmList_protostr(ParmList *); swig-4.0.2/Source/Swig/stype.c0000644000175000017500000011363213667507523016051 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * stype.c * * This file provides general support for datatypes that are encoded in * the form of simple strings. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" #include /* ----------------------------------------------------------------------------- * Synopsis * * The purpose of this module is to provide a general purpose type representation * based on simple text strings. * * General idea: * * Types are represented by a base type (e.g., "int") and a collection of * type operators applied to the base (e.g., pointers, arrays, etc...). * * Encoding: * * Types are encoded as strings of type constructors such as follows: * * String Encoding C Example * --------------- --------- * p.p.int int ** * a(300).a(400).int int [300][400] * p.q(const).char char const * * * All type constructors are denoted by a trailing '.': * * 'p.' = Pointer (*) * 'r.' = Reference (&) * 'z.' = Rvalue reference (&&) * 'a(n).' = Array of size n [n] * 'f(..,..).' = Function with arguments (args) * 'q(str).' = Qualifier, such as const or volatile (cv-qualifier) * 'm(cls).' = Pointer to member (cls::*) * * The encoding follows the order that you might describe a type in words. * For example "p.a(200).int" is "A pointer to array of int's" and * "p.q(const).char" is "a pointer to a const char". * * This representation of types is fairly convenient because ordinary string * operations can be used for type manipulation. For example, a type could be * formed by combining two strings such as the following: * * "p.p." + "a(400).int" = "p.p.a(400).int" * * Similarly, one could strip a 'const' declaration from a type doing something * like this: * * Replace(t,"q(const).","",DOH_REPLACE_ANY) * * More examples: * * String Encoding C++ Example * --------------- ----------- * p.f(bool).r.q(const).long const long & (*)(bool) * m(Funcs).q(const).f(bool).long long (Funcs::*)(bool) const * r.q(const).m(Funcs).f(int).long long (Funcs::*const &)(int) * m(Funcs).z.q(const).f(bool).long long (Funcs::*)(bool) const && * * Function decl examples: * * f(bool). long a(bool); * r.f(bool). long b(bool) &; * z.f(bool). long c(bool) &&; * z.q(const).f(bool). long d(bool) const &&; * * For the most part, this module tries to minimize the use of special * characters (*, [, <, etc...) in its type encoding. One reason for this * is that SWIG might be extended to encode data in formats such as XML * where you might want to do this: * * * p.p.int * ... * * * Or alternatively, * * blah * * In either case, it's probably best to avoid characters such as '&', '*', or '<'. * * Why not use C syntax? Well, C syntax is fairly complicated to parse * and not particularly easy to manipulate---especially for adding, deleting and * composing type constructors. The string representation presented here makes * this pretty easy. * * Why not use a bunch of nested data structures? Are you kidding? How * would that be easier to use than a few simple string operations? * ----------------------------------------------------------------------------- */ SwigType *NewSwigType(int t) { switch (t) { case T_BOOL: return NewString("bool"); break; case T_INT: return NewString("int"); break; case T_UINT: return NewString("unsigned int"); break; case T_SHORT: return NewString("short"); break; case T_USHORT: return NewString("unsigned short"); break; case T_LONG: return NewString("long"); break; case T_ULONG: return NewString("unsigned long"); break; case T_FLOAT: return NewString("float"); break; case T_DOUBLE: return NewString("double"); break; case T_COMPLEX: return NewString("complex"); break; case T_CHAR: return NewString("char"); break; case T_SCHAR: return NewString("signed char"); break; case T_UCHAR: return NewString("unsigned char"); break; case T_STRING: { SwigType *t = NewString("char"); SwigType_add_qualifier(t, "const"); SwigType_add_pointer(t); return t; break; } case T_WCHAR: return NewString("wchar_t"); break; case T_WSTRING: { SwigType *t = NewString("wchar_t"); SwigType_add_pointer(t); return t; break; } case T_LONGLONG: return NewString("long long"); break; case T_ULONGLONG: return NewString("unsigned long long"); break; case T_VOID: return NewString("void"); break; case T_AUTO: return NewString("auto"); break; default: break; } return NewStringEmpty(); } /* ----------------------------------------------------------------------------- * SwigType_push() * * Push a type constructor onto the type * ----------------------------------------------------------------------------- */ void SwigType_push(SwigType *t, String *cons) { if (!cons) return; if (!Len(cons)) return; if (Len(t)) { char *c = Char(cons); if (c[strlen(c) - 1] != '.') Insert(t, 0, "."); } Insert(t, 0, cons); } /* ----------------------------------------------------------------------------- * SwigType_ispointer_return() * * Testing functions for querying a raw datatype * ----------------------------------------------------------------------------- */ int SwigType_ispointer_return(const SwigType *t) { char *c; int idx; if (!t) return 0; c = Char(t); idx = (int)strlen(c) - 4; if (idx >= 0) { return (strcmp(c + idx, ").p.") == 0); } return 0; } int SwigType_isreference_return(const SwigType *t) { char *c; int idx; if (!t) return 0; c = Char(t); idx = (int)strlen(c) - 4; if (idx >= 0) { return (strcmp(c + idx, ").r.") == 0); } return 0; } int SwigType_isconst(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "q(", 2) == 0) { String *q = SwigType_parm(t); if (strstr(Char(q), "const")) { Delete(q); return 1; } Delete(q); } /* Hmmm. Might be const through a typedef */ if (SwigType_issimple(t)) { int ret; SwigType *td = SwigType_typedef_resolve(t); if (td) { ret = SwigType_isconst(td); Delete(td); return ret; } } return 0; } int SwigType_ismutable(const SwigType *t) { int r; SwigType *qt = SwigType_typedef_resolve_all(t); if (SwigType_isreference(qt) || SwigType_isrvalue_reference(qt) || SwigType_isarray(qt)) { Delete(SwigType_pop(qt)); } r = SwigType_isconst(qt); Delete(qt); return r ? 0 : 1; } int SwigType_isenum(const SwigType *t) { char *c = Char(t); if (!t) return 0; if (strncmp(c, "enum ", 5) == 0) { return 1; } return 0; } int SwigType_issimple(const SwigType *t) { char *c = Char(t); if (!t) return 0; while (*c) { if (*c == '<') { int nest = 1; c++; while (*c && nest) { if (*c == '<') nest++; if (*c == '>') nest--; c++; } c--; } if (*c == '.') return 0; c++; } return 1; } /* ----------------------------------------------------------------------------- * SwigType_default_create() * * Create the default type for this datatype. This takes a type and strips it * down to a generic form first by resolving all typedefs. * * Rules: * Pointers: p.SWIGTYPE * References: r.SWIGTYPE * Arrays no dimension: a().SWIGTYPE * Arrays with dimension: a(ANY).SWIGTYPE * Member pointer: m(CLASS).SWIGTYPE * Function pointer: f(ANY).SWIGTYPE * Enums: enum SWIGTYPE * Types: SWIGTYPE * * Examples (also see SwigType_default_deduce): * * int [2][4] * a(2).a(4).int * a(ANY).a(ANY).SWIGTYPE * * struct A {}; * typedef A *Aptr; * Aptr const & * r.q(const).Aptr * r.q(const).p.SWIGTYPE * * enum E {e1, e2}; * enum E const & * r.q(const).enum E * r.q(const).enum SWIGTYPE * ----------------------------------------------------------------------------- */ SwigType *SwigType_default_create(const SwigType *ty) { SwigType *r = 0; List *l; Iterator it; int numitems; if (!SwigType_isvarargs(ty)) { SwigType *t = SwigType_typedef_resolve_all(ty); r = NewStringEmpty(); l = SwigType_split(t); numitems = Len(l); if (numitems >= 1) { String *last_subtype = Getitem(l, numitems-1); if (SwigType_isenum(last_subtype)) Setitem(l, numitems-1, NewString("enum SWIGTYPE")); else Setitem(l, numitems-1, NewString("SWIGTYPE")); } for (it = First(l); it.item; it = Next(it)) { String *subtype = it.item; if (SwigType_isarray(subtype)) { if (Equal(subtype, "a().")) Append(r, NewString("a().")); else Append(r, NewString("a(ANY).")); } else if (SwigType_isfunction(subtype)) { Append(r, NewString("f(ANY).SWIGTYPE")); break; } else if (SwigType_ismemberpointer(subtype)) { Append(r, NewString("m(CLASS).SWIGTYPE")); break; } else { Append(r, subtype); } } Delete(l); Delete(t); } return r; } /* ----------------------------------------------------------------------------- * SwigType_default_deduce() * * This function implements type deduction used in the typemap matching rules * and is very close to the type deduction used in partial template class * specialization matching in that the most specialized type is always chosen. * SWIGTYPE is used as the generic type. The basic idea is to repeatedly call * this function to find a deduced type until nothing matches. * * The type t must have already been converted to the default type via a call to * SwigType_default_create() before calling this function. * * Example deductions (matching the examples described in SwigType_default_create), * where the most specialized matches are highest in the list: * * a(ANY).a(ANY).SWIGTYPE * a(ANY).a().SWIGTYPE * a(ANY).p.SWIGTYPE * a(ANY).SWIGTYPE * a().SWIGTYPE * p.SWIGTYPE * SWIGTYPE * * r.q(const).p.SWIGTYPE * r.q(const).SWIGTYPE * r.SWIGTYPE * SWIGTYPE * * r.q(const).enum SWIGTYPE * r.enum SWIGTYPE * r.SWIGTYPE * SWIGTYPE * ----------------------------------------------------------------------------- */ SwigType *SwigType_default_deduce(const SwigType *t) { SwigType *r = NewStringEmpty(); List *l; Iterator it; int numitems; l = SwigType_split(t); numitems = Len(l); if (numitems >= 1) { String *last_subtype = Getitem(l, numitems-1); int is_enum = SwigType_isenum(last_subtype); if (numitems >=2 ) { String *subtype = Getitem(l, numitems-2); /* last but one */ if (SwigType_isarray(subtype)) { if (is_enum) { /* enum deduction, enum SWIGTYPE => SWIGTYPE */ Setitem(l, numitems-1, NewString("SWIGTYPE")); } else { /* array deduction, a(ANY). => a(). => p. */ String *deduced_subtype = 0; if (Strcmp(subtype, "a().") == 0) { deduced_subtype = NewString("p."); } else if (Strcmp(subtype, "a(ANY).") == 0) { deduced_subtype = NewString("a()."); } else { assert(0); } Setitem(l, numitems-2, deduced_subtype); } } else if (SwigType_ismemberpointer(subtype)) { /* member pointer deduction, m(CLASS). => p. */ Setitem(l, numitems-2, NewString("p.")); } else if (is_enum && !SwigType_isqualifier(subtype)) { /* enum deduction, enum SWIGTYPE => SWIGTYPE */ Setitem(l, numitems-1, NewString("SWIGTYPE")); } else { /* simple type deduction, eg, r.p.p. => r.p. */ /* also function pointers eg, p.f(ANY). => p. */ Delitem(l, numitems-2); } } else { if (is_enum) { /* enum deduction, enum SWIGTYPE => SWIGTYPE */ Setitem(l, numitems-1, NewString("SWIGTYPE")); } else { /* delete the only item, we are done with deduction */ Delitem(l, 0); } } } else { assert(0); } for (it = First(l); it.item; it = Next(it)) { Append(r, it.item); } if (Len(r) == 0) { Delete(r); r = 0; } Delete(l); return r; } /* ----------------------------------------------------------------------------- * SwigType_namestr() * * Returns a string of the base type. Takes care of template expansions * ----------------------------------------------------------------------------- */ String *SwigType_namestr(const SwigType *t) { String *r; String *suffix; List *p; int i, sz; char *d = Char(t); char *c = strstr(d, "<("); if (!c || !strstr(c + 2, ")>")) return NewString(t); r = NewStringWithSize(d, (int)(c - d)); if (*(c - 1) == '<') Putc(' ', r); Putc('<', r); p = SwigType_parmlist(c + 1); sz = Len(p); for (i = 0; i < sz; i++) { String *str = SwigType_str(Getitem(p, i), 0); /* Avoid creating a <: token, which is the same as [ in C++ - put a space after '<'. */ if (i == 0 && Len(str)) Putc(' ', r); Append(r, str); if ((i + 1) < sz) Putc(',', r); Delete(str); } Putc(' ', r); Putc('>', r); suffix = SwigType_templatesuffix(t); if (Len(suffix) > 0) { String *suffix_namestr = SwigType_namestr(suffix); Append(r, suffix_namestr); Delete(suffix_namestr); } else { Append(r, suffix); } Delete(suffix); Delete(p); return r; } /* ----------------------------------------------------------------------------- * SwigType_str() * * Create a C string representation of a datatype. * ----------------------------------------------------------------------------- */ String *SwigType_str(const SwigType *s, const_String_or_char_ptr id) { String *result; String *element = 0; String *nextelement; String *forwardelement; SwigType *member_function_qualifiers = 0; List *elements; int nelements, i; if (id) { /* stringify the id expanding templates, for example when the id is a fully qualified templated class name */ String *id_str = NewString(id); /* unfortunate copy due to current const limitations */ result = SwigType_str(id_str, 0); Delete(id_str); } else { result = NewStringEmpty(); } elements = SwigType_split(s); nelements = Len(elements); if (nelements > 0) { element = Getitem(elements, 0); } /* Now, walk the type list and start emitting */ for (i = 0; i < nelements; i++) { if (i < (nelements - 1)) { nextelement = Getitem(elements, i + 1); forwardelement = nextelement; if (SwigType_isqualifier(nextelement)) { if (i < (nelements - 2)) forwardelement = Getitem(elements, i + 2); } } else { nextelement = 0; forwardelement = 0; } if (SwigType_isqualifier(element)) { if (!member_function_qualifiers) { DOH *q = 0; q = SwigType_parm(element); Insert(result, 0, " "); Insert(result, 0, q); Delete(q); } } else if (SwigType_ispointer(element)) { Insert(result, 0, "*"); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } } else if (SwigType_ismemberpointer(element)) { String *q; q = SwigType_parm(element); Insert(result, 0, "::*"); Insert(result, 0, q); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } { String *next3elements = NewStringEmpty(); int j; for (j = i + 1; j < i + 4 && j < nelements; j++) { Append(next3elements, Getitem(elements, j)); } if (SwigType_isfunction(next3elements)) member_function_qualifiers = SwigType_pop_function_qualifiers(next3elements); Delete(next3elements); } Delete(q); } else if (SwigType_isreference(element)) { if (!member_function_qualifiers) Insert(result, 0, "&"); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } } else if (SwigType_isrvalue_reference(element)) { if (!member_function_qualifiers) Insert(result, 0, "&&"); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } } else if (SwigType_isarray(element)) { DOH *size; Append(result, "["); size = SwigType_parm(element); Append(result, size); Append(result, "]"); Delete(size); } else if (SwigType_isfunction(element)) { DOH *parms, *p; int j, plen; Append(result, "("); parms = SwigType_parmlist(element); plen = Len(parms); for (j = 0; j < plen; j++) { p = SwigType_str(Getitem(parms, j), 0); Append(result, p); if (j < (plen - 1)) Append(result, ","); } Append(result, ")"); if (member_function_qualifiers) { String *p = SwigType_str(member_function_qualifiers, 0); Append(result, " "); Append(result, p); Delete(p); Delete(member_function_qualifiers); member_function_qualifiers = 0; } Delete(parms); } else { if (strcmp(Char(element), "v(...)") == 0) { Insert(result, 0, "..."); } else { String *bs = SwigType_namestr(element); Insert(result, 0, " "); Insert(result, 0, bs); Delete(bs); } } element = nextelement; } Delete(elements); Chop(result); return result; } /* ----------------------------------------------------------------------------- * SwigType_ltype(const SwigType *ty) * * Create a locally assignable type * ----------------------------------------------------------------------------- */ SwigType *SwigType_ltype(const SwigType *s) { String *result; String *element; SwigType *td, *tc = 0; List *elements; int nelements, i; int firstarray = 1; int notypeconv = 0; int ignore_member_function_qualifiers = 0; result = NewStringEmpty(); tc = Copy(s); /* Nuke all leading qualifiers */ while (SwigType_isqualifier(tc)) { Delete(SwigType_pop(tc)); } if (SwigType_issimple(tc)) { /* Resolve any typedef definitions */ SwigType *tt = Copy(tc); td = 0; while ((td = SwigType_typedef_resolve(tt))) { if (td && (SwigType_isconst(td) || SwigType_isarray(td) || SwigType_isreference(td) || SwigType_isrvalue_reference(td))) { /* We need to use the typedef type */ Delete(tt); break; } else if (td) { Delete(tt); tt = td; } } if (td) { Delete(tc); tc = td; } } elements = SwigType_split(tc); nelements = Len(elements); /* Now, walk the type list and start emitting */ for (i = 0; i < nelements; i++) { element = Getitem(elements, i); /* when we see a function, we need to preserve the following types */ if (SwigType_isfunction(element)) { notypeconv = 1; ignore_member_function_qualifiers = 0; } if (ignore_member_function_qualifiers) { /* cv-qualifiers and ref-qualifiers up until the f() element have already been added */ } else if (SwigType_isqualifier(element)) { /* swallow cv-qualifiers */ } else if (SwigType_ispointer(element)) { Append(result, element); firstarray = 0; } else if (SwigType_ismemberpointer(element)) { Append(result, element); { String *next3elements = NewStringEmpty(); int j; for (j = i + 1; j < i + 4 && j < nelements; j++) { Append(next3elements, Getitem(elements, j)); } if (SwigType_isfunction(next3elements)) { SwigType *member_function_qualifiers = SwigType_pop_function_qualifiers(next3elements); /* compilers won't let us cast from a member function without qualifiers to one with qualifiers, so the qualifiers are kept in the ltype */ if (member_function_qualifiers) Append(result, member_function_qualifiers); Delete(member_function_qualifiers); ignore_member_function_qualifiers = 1; } Delete(next3elements); } firstarray = 0; } else if (SwigType_isreference(element)) { if (notypeconv) { Append(result, element); } else { Append(result, "p."); } firstarray = 0; } else if (SwigType_isrvalue_reference(element)) { if (notypeconv) { Append(result, element); } else { Append(result, "p."); } firstarray = 0; } else if (SwigType_isarray(element) && firstarray) { if (notypeconv) { Append(result, element); } else { Append(result, "p."); } firstarray = 0; } else if (SwigType_isenum(element)) { int anonymous_enum = (Cmp(element, "enum ") == 0); if (notypeconv || !anonymous_enum) { Append(result, element); } else { Append(result, "int"); } } else { Append(result, element); } } Delete(elements); Delete(tc); return result; } /* ----------------------------------------------------------------------------- * SwigType_lstr() * * Produces a type-string that is suitable as a lvalue in an expression. * That is, a type that can be freely assigned a value without violating * any C assignment rules. * * - Qualifiers such as 'const' and 'volatile' are stripped. * Except for member function cv-qualifiers and ref-qualifiers. * - Arrays are converted into a *single* pointer (i.e., * double [][] becomes double *). * - References are converted into a pointer. * - Typedef names that refer to read-only types will be replaced * with an equivalent assignable version. * -------------------------------------------------------------------- */ String *SwigType_lstr(const SwigType *s, const_String_or_char_ptr id) { String *result; SwigType *tc; tc = SwigType_ltype(s); result = SwigType_str(tc, id); Delete(tc); return result; } /* ----------------------------------------------------------------------------- * SwigType_rcaststr() * * Produces a casting string that maps the type returned by lstr() to the real * datatype printed by str(). * ----------------------------------------------------------------------------- */ String *SwigType_rcaststr(const SwigType *s, const_String_or_char_ptr name) { String *result, *cast; String *element = 0; String *nextelement; String *forwardelement; String *member_function_qualifiers = 0; SwigType *td, *tc = 0; const SwigType *rs; List *elements; int nelements, i; int clear = 1; int firstarray = 1; int isreference = 0; int isfunction = 0; result = NewStringEmpty(); if (SwigType_isconst(s)) { tc = Copy(s); Delete(SwigType_pop(tc)); if (SwigType_ismemberpointer(tc)) rs = s; else rs = tc; } else { rs = s; } if ((SwigType_isconst(rs) || SwigType_isarray(rs) || SwigType_isreference(rs) || SwigType_isrvalue_reference(rs))) { td = 0; } else { td = SwigType_typedef_resolve(rs); } if (td) { if ((SwigType_isconst(td) || SwigType_isarray(td) || SwigType_isreference(td) || SwigType_isrvalue_reference(td))) { elements = SwigType_split(td); } else { elements = SwigType_split(rs); } Delete(td); } else { elements = SwigType_split(rs); } nelements = Len(elements); if (nelements > 0) { element = Getitem(elements, 0); } /* Now, walk the type list and start emitting */ for (i = 0; i < nelements; i++) { if (i < (nelements - 1)) { nextelement = Getitem(elements, i + 1); forwardelement = nextelement; if (SwigType_isqualifier(nextelement)) { if (i < (nelements - 2)) forwardelement = Getitem(elements, i + 2); } } else { nextelement = 0; forwardelement = 0; } if (SwigType_isqualifier(element)) { if (!member_function_qualifiers) { DOH *q = 0; q = SwigType_parm(element); Insert(result, 0, " "); Insert(result, 0, q); Delete(q); clear = 0; } } else if (SwigType_ispointer(element)) { Insert(result, 0, "*"); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } firstarray = 0; } else if (SwigType_ismemberpointer(element)) { String *q; Insert(result, 0, "::*"); q = SwigType_parm(element); Insert(result, 0, q); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } { String *next3elements = NewStringEmpty(); int j; for (j = i + 1; j < i + 4 && j < nelements; j++) { Append(next3elements, Getitem(elements, j)); } if (SwigType_isfunction(next3elements)) member_function_qualifiers = SwigType_pop_function_qualifiers(next3elements); Delete(next3elements); } firstarray = 0; Delete(q); } else if (SwigType_isreference(element)) { if (!member_function_qualifiers) { Insert(result, 0, "&"); if (!isfunction) isreference = 1; } if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } } else if (SwigType_isrvalue_reference(element)) { if (!member_function_qualifiers) { Insert(result, 0, "&&"); if (!isfunction) isreference = 1; } if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } clear = 0; } else if (SwigType_isarray(element)) { DOH *size; if (firstarray && !isreference) { Append(result, "(*)"); firstarray = 0; } else { Append(result, "["); size = SwigType_parm(element); Append(result, size); Append(result, "]"); Delete(size); clear = 0; } } else if (SwigType_isfunction(element)) { DOH *parms, *p; int j, plen; Append(result, "("); parms = SwigType_parmlist(element); plen = Len(parms); for (j = 0; j < plen; j++) { p = SwigType_str(Getitem(parms, j), 0); Append(result, p); Delete(p); if (j < (plen - 1)) Append(result, ","); } Append(result, ")"); Delete(parms); if (member_function_qualifiers) { String *p = SwigType_str(member_function_qualifiers, 0); Append(result, " "); Append(result, p); Delete(p); Delete(member_function_qualifiers); member_function_qualifiers = 0; clear = 0; } isfunction = 1; } else { String *bs = SwigType_namestr(element); Insert(result, 0, " "); Insert(result, 0, bs); Delete(bs); } element = nextelement; } Delete(elements); if (clear) { cast = NewStringEmpty(); } else { cast = NewStringf("(%s)", result); } if (name) { if (isreference) { Append(cast, "*"); } Append(cast, name); } Delete(result); Delete(tc); return cast; } /* ----------------------------------------------------------------------------- * SwigType_lcaststr() * * Casts a variable from the real type to the local datatype. * ----------------------------------------------------------------------------- */ String *SwigType_lcaststr(const SwigType *s, const_String_or_char_ptr name) { String *result; result = NewStringEmpty(); if (SwigType_isarray(s)) { String *lstr = SwigType_lstr(s, 0); Printf(result, "(%s)%s", lstr, name); Delete(lstr); } else if (SwigType_isreference(s)) { String *str = SwigType_str(s, 0); Printf(result, "(%s)", str); Delete(str); if (name) Append(result, name); } else if (SwigType_isrvalue_reference(s)) { String *str = SwigType_str(s, 0); Printf(result, "(%s)", str); Delete(str); if (name) Append(result, name); } else if (SwigType_isqualifier(s)) { String *lstr = SwigType_lstr(s, 0); Printf(result, "(%s)%s", lstr, name); Delete(lstr); } else { if (name) Append(result, name); } return result; } #if 0 /* Alternative implementation for manglestr_default. Mangling is similar to the original except for a few subtle differences for example in templates: namespace foo { template class bar {}; typedef int Integer; void test2(bar *x); } Mangling is more consistent and changes from _p_foo__barT_int_p_t to _p_foo__barT_p_int_t. */ static void mangle_stringcopy(String *destination, const char *source, int count) { while (count-- > 0) { char newc = '_'; if (!(*source == '.' || *source == ':' || *source == ' ')) newc = *source; /* TODO: occasionally '*' or numerics need converting to '_', eg in array dimensions and template expressions */ Putc(newc, destination); source++; } } static void mangle_subtype(String *mangled, SwigType *s); /* ----------------------------------------------------------------------------- * mangle_namestr() * * Mangles a type taking care of template expansions. Similar to SwigType_namestr(). * The type may include a trailing '.', for example "p." * ----------------------------------------------------------------------------- */ static void mangle_namestr(String *mangled, SwigType *t) { int length = Len(t); if (SwigType_isqualifier(t)) { Append(mangled, "q_"); mangle_stringcopy(mangled, Char(t)+2, length-4); Append(mangled, "__"); } else if (SwigType_ismemberpointer(t)) { Append(mangled, "m_"); mangle_stringcopy(mangled, Char(t)+2, length-4); Append(mangled, "__"); } else if (SwigType_isarray(t)) { Append(mangled, "a_"); mangle_stringcopy(mangled, Char(t)+2, length-4); Append(mangled, "__"); } else if (SwigType_isfunction(t)) { List *p = SwigType_parmlist(t); int sz = Len(p); int i; Append(mangled, "f_"); for (i = 0; i < sz; i++) { mangle_subtype(mangled, Getitem(p, i)); Putc('_', mangled); } Append(mangled, (sz > 0) ? "_" : "__"); } else if (SwigType_isvarargs(t)) { Append(mangled, "___"); } else { char *d = Char(t); char *c = strstr(d, "<("); if (!c || !strstr(c + 2, ")>")) { /* not a template type */ mangle_stringcopy(mangled, Char(t), Len(t)); } else { /* a template type */ String *suffix; List *p; int i, sz; mangle_stringcopy(mangled, d, c-d); Putc('T', mangled); Putc('_', mangled); p = SwigType_parmlist(c + 1); sz = Len(p); for (i = 0; i < sz; i++) { mangle_subtype(mangled, Getitem(p, i)); Putc('_', mangled); } Putc('t', mangled); suffix = SwigType_templatesuffix(t); if (Len(suffix) > 0) { mangle_namestr(mangled, suffix); } else { Append(mangled, suffix); } Delete(suffix); Delete(p); } } } static void mangle_subtype(String *mangled, SwigType *s) { List *elements; int nelements, i; assert(s); elements = SwigType_split(s); nelements = Len(elements); for (i = 0; i < nelements; i++) { SwigType *element = Getitem(elements, i); mangle_namestr(mangled, element); } Delete(elements); } static String *manglestr_default(const SwigType *s) { String *mangled = NewString("_"); SwigType *sr = SwigType_typedef_resolve_all(s); SwigType *sq = SwigType_typedef_qualified(sr); SwigType *ss = SwigType_remove_global_scope_prefix(sq); SwigType *type = ss; SwigType *lt; if (SwigType_istemplate(ss)) { SwigType *ty = Swig_symbol_template_deftype(ss, 0); Delete(ss); ss = ty; type = ss; } lt = SwigType_ltype(type); Replace(lt, "struct ", "", DOH_REPLACE_ANY); Replace(lt, "class ", "", DOH_REPLACE_ANY); Replace(lt, "union ", "", DOH_REPLACE_ANY); Replace(lt, "enum ", "", DOH_REPLACE_ANY); mangle_subtype(mangled, lt); Delete(ss); Delete(sq); Delete(sr); return mangled; } #else static String *manglestr_default(const SwigType *s) { char *c; String *result = 0; String *base = 0; SwigType *lt; SwigType *sr = SwigType_typedef_resolve_all(s); SwigType *sq = SwigType_typedef_qualified(sr); SwigType *ss = SwigType_remove_global_scope_prefix(sq); SwigType *type = ss; if (SwigType_istemplate(ss)) { SwigType *ty = Swig_symbol_template_deftype(ss, 0); Delete(ss); ss = ty; type = ss; } lt = SwigType_ltype(type); result = SwigType_prefix(lt); base = SwigType_base(lt); c = Char(result); while (*c) { if (!isalnum((int) *c)) *c = '_'; c++; } if (SwigType_istemplate(base)) { String *b = SwigType_namestr(base); Delete(base); base = b; } Replace(base, "struct ", "", DOH_REPLACE_ANY); /* This might be problematic */ Replace(base, "class ", "", DOH_REPLACE_ANY); Replace(base, "union ", "", DOH_REPLACE_ANY); Replace(base, "enum ", "", DOH_REPLACE_ANY); c = Char(base); while (*c) { if (*c == '<') *c = 'T'; else if (*c == '>') *c = 't'; else if (*c == '*') *c = 'p'; else if (*c == '[') *c = 'a'; else if (*c == ']') *c = 'A'; else if (*c == '&') *c = 'R'; else if (*c == '(') *c = 'f'; else if (*c == ')') *c = 'F'; else if (!isalnum((int) *c)) *c = '_'; c++; } Append(result, base); Insert(result, 0, "_"); Delete(lt); Delete(base); Delete(ss); Delete(sq); Delete(sr); return result; } #endif String *SwigType_manglestr(const SwigType *s) { #if 0 /* Debugging checks to ensure a proper SwigType is passed in and not a stringified type */ String *angle = Strstr(s, "<"); if (angle && Strncmp(angle, "<(", 2) != 0) Printf(stderr, "SwigType_manglestr error: %s\n", s); else if (Strstr(s, "*") || Strstr(s, "&") || Strstr(s, "[")) Printf(stderr, "SwigType_manglestr error: %s\n", s); #endif return manglestr_default(s); } /* ----------------------------------------------------------------------------- * SwigType_typename_replace() * * Replaces a typename in a type with something else. Needed for templates. * ----------------------------------------------------------------------------- */ void SwigType_typename_replace(SwigType *t, String *pat, String *rep) { String *nt; int i, ilen; List *elem; if (!Strstr(t, pat)) return; if (Equal(t, pat)) { Replace(t, pat, rep, DOH_REPLACE_ANY); return; } nt = NewStringEmpty(); elem = SwigType_split(t); ilen = Len(elem); for (i = 0; i < ilen; i++) { String *e = Getitem(elem, i); if (SwigType_issimple(e)) { if (Equal(e, pat)) { /* Replaces a type of the form 'pat' with 'rep' */ Replace(e, pat, rep, DOH_REPLACE_ANY); } else if (SwigType_istemplate(e)) { /* Replaces a type of the form 'pat' with 'rep' */ if (Equal(e, pat)) { String *repbase = SwigType_templateprefix(rep); Replace(e, pat, repbase, DOH_REPLACE_ID | DOH_REPLACE_FIRST); Delete(repbase); } { String *tsuffix; List *tparms = SwigType_parmlist(e); int j, jlen; String *nt = SwigType_templateprefix(e); Append(nt, "<("); jlen = Len(tparms); for (j = 0; j < jlen; j++) { SwigType_typename_replace(Getitem(tparms, j), pat, rep); Append(nt, Getitem(tparms, j)); if (j < (jlen - 1)) Putc(',', nt); } tsuffix = SwigType_templatesuffix(e); SwigType_typename_replace(tsuffix, pat, rep); Printf(nt, ")>%s", tsuffix); Delete(tsuffix); Clear(e); Append(e, nt); Delete(nt); Delete(tparms); } } else if (Swig_scopename_check(e)) { String *first = 0; String *rest = 0; Swig_scopename_split(e, &first, &rest); /* Swig_scopename_split doesn't handle :: prefix very well ... could do with a rework */ if (Strncmp(rest, "::", 2) == 0) { String *tmp = NewString(Char(rest) + 2); Clear(rest); Printv(rest, tmp, NIL); Delete(tmp); assert(!first); } Clear(e); if (first) SwigType_typename_replace(first, pat, rep); SwigType_typename_replace(rest, pat, rep); Printv(e, first ? first : "", "::", rest, NIL); Delete(first); Delete(rest); } } else if (SwigType_isfunction(e)) { int j, jlen; List *fparms = SwigType_parmlist(e); Clear(e); Append(e, "f("); jlen = Len(fparms); for (j = 0; j < jlen; j++) { SwigType_typename_replace(Getitem(fparms, j), pat, rep); Append(e, Getitem(fparms, j)); if (j < (jlen - 1)) Putc(',', e); } Append(e, ")."); Delete(fparms); } else if (SwigType_isarray(e)) { Replace(e, pat, rep, DOH_REPLACE_ID); } Append(nt, e); } Clear(t); Append(t, nt); Delete(nt); Delete(elem); } /* ----------------------------------------------------------------------------- * SwigType_remove_global_scope_prefix() * * Removes the unary scope operator (::) prefix indicating global scope in all * components of the type * ----------------------------------------------------------------------------- */ SwigType *SwigType_remove_global_scope_prefix(const SwigType *t) { SwigType *result; const char *type = Char(t); if (strncmp(type, "::", 2) == 0) type += 2; result = NewString(type); Replaceall(result, ".::", "."); Replaceall(result, "(::", "("); Replaceall(result, "enum ::", "enum "); return result; } /* ----------------------------------------------------------------------------- * SwigType_check_decl() * * Checks type declarators for a match * ----------------------------------------------------------------------------- */ int SwigType_check_decl(const SwigType *ty, const SwigType *decl) { SwigType *t, *t1, *t2; int r; t = SwigType_typedef_resolve_all(ty); t1 = SwigType_strip_qualifiers(t); t2 = SwigType_prefix(t1); r = Equal(t2, decl); Delete(t); Delete(t1); Delete(t2); return r == 1; } swig-4.0.2/Source/Modules/0000755000175000017500000000000013667507523015232 5ustar williamwilliamswig-4.0.2/Source/Modules/octave.cxx0000644000175000017500000014444513667507523017253 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * octave.cxx * * Octave language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" static String *global_name = 0; static String *op_prefix = 0; static const char *usage = "\ Octave Options (available with -octave)\n\ -globals - Set used to access C global variables [default: 'cvar']\n\ Use '.' to load C global variables into module namespace\n\ -opprefix - Prefix for global operator functions [default: 'op_']\n\ \n"; class OCTAVE:public Language { private: File *f_begin; File *f_runtime; File *f_header; File *f_doc; File *f_wrappers; File *f_init; File *f_initbeforefunc; File *f_directors; File *f_directors_h; String *s_global_tab; String *s_members_tab; String *class_name; int have_constructor; int have_destructor; String *constructor_name; Hash *docs; void Octave_begin_function(Node *n, File *f, const_String_or_char_ptr cname, const_String_or_char_ptr wname, bool dld) { if (dld) { String *tname = texinfo_name(n, "std::string()"); Printf(f, "SWIG_DEFUN( %s, %s, %s ) {", cname, wname, tname); } else { Printf(f, "static octave_value_list %s (const octave_value_list& args, int nargout) {", wname); } } public: OCTAVE(): f_begin(0), f_runtime(0), f_header(0), f_doc(0), f_wrappers(0), f_init(0), f_initbeforefunc(0), f_directors(0), f_directors_h(0), s_global_tab(0), s_members_tab(0), class_name(0), have_constructor(0), have_destructor(0), constructor_name(0), docs(0) { /* Add code to manage protected constructors and directors */ director_prot_ctor_code = NewString(""); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " error(\"accessing abstract class or protected constructor\"); \n", " SWIG_fail;\n", "}\n", NIL); enable_cplus_runtime_mode(); allow_overloading(); director_multiple_inheritance = 1; director_language = 1; docs = NewHash(); } virtual void main(int argc, char *argv[]) { for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } else if (strcmp(argv[i], "-globals") == 0) { if (argv[i + 1]) { global_name = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-opprefix") == 0) { if (argv[i + 1]) { op_prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-cppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is now always on.\n", argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is no longer supported.\n", argv[i]); Swig_mark_arg(i); SWIG_exit(EXIT_FAILURE); } } } if (!global_name) global_name = NewString("cvar"); if (!op_prefix) op_prefix = NewString("op_"); SWIG_library_directory("octave"); Preprocessor_define("SWIGOCTAVE 1", 0); SWIG_config_file("octave.swg"); SWIG_typemap_lang("octave"); allow_overloading(); // Octave API is C++, so output must be C++ compatible even when wrapping C code if (!cparse_cplusplus) Swig_cparse_cplusplusout(1); } virtual int top(Node *n) { { Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options) { int dirprot = 0; if (Getattr(options, "dirprot")) { dirprot = 1; } if (Getattr(options, "nodirprot")) { dirprot = 0; } if (Getattr(options, "directors")) { allow_directors(); if (dirprot) allow_dirprot(); } } } } String *module = Getattr(n, "name"); String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_header = NewString(""); f_doc = NewString(""); f_wrappers = NewString(""); f_init = NewString(""); f_initbeforefunc = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); s_global_tab = NewString(""); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("header", f_header); Swig_register_filebyname("doc", f_doc); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("init", f_init); Swig_register_filebyname("initbeforefunc", f_initbeforefunc); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGOCTAVE\n#define SWIGOCTAVE\n#endif\n\n"); Printf(f_runtime, "#define SWIG_name_d \"%s\"\n", module); Printf(f_runtime, "#define SWIG_name %s\n", module); Printf(f_runtime, "\n"); Printf(f_runtime, "#define SWIG_global_name \"%s\"\n", global_name); Printf(f_runtime, "#define SWIG_op_prefix \"%s\"\n", op_prefix); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); Swig_banner(f_directors_h); if (dirprot_mode()) { // Printf(f_directors_h, "#include \n"); // Printf(f_directors_h, "#include \n\n"); } } Printf(f_runtime, "\n"); Printf(s_global_tab, "\nstatic const struct swig_octave_member swig_globals[] = {\n"); Printf(f_init, "static bool SWIG_init_user(octave_swig_type* module_ns)\n{\n"); if (!CPlusPlus) Printf(f_header,"extern \"C\" {\n"); Language::top(n); if (!CPlusPlus) Printf(f_header,"}\n"); if (Len(docs)) emit_doc_texinfo(); if (directorsEnabled()) { Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } Printf(f_init, "return true;\n}\n"); Printf(s_global_tab, "{0,0,0,0,0,0}\n};\n"); Printv(f_wrappers, s_global_tab, NIL); SwigType_emit_type_table(f_runtime, f_wrappers); Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_doc, f_begin); if (directorsEnabled()) { Dump(f_directors_h, f_begin); Dump(f_directors, f_begin); } Dump(f_wrappers, f_begin); Dump(f_initbeforefunc, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(s_global_tab); Delete(f_initbeforefunc); Delete(f_init); Delete(f_wrappers); Delete(f_doc); Delete(f_header); Delete(f_directors); Delete(f_directors_h); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } String *texinfo_escape(String *_s) { const char* s=(const char*)Data(_s); while (*s&&(*s=='\t'||*s=='\r'||*s=='\n'||*s==' ')) ++s; String *r = NewString(""); for (int j=0;s[j];++j) { if (s[j] == '\n') { Append(r, "\\n\\\n"); } else if (s[j] == '\r') { Append(r, "\\r"); } else if (s[j] == '\t') { Append(r, "\\t"); } else if (s[j] == '\\') { Append(r, "\\\\"); } else if (s[j] == '\'') { Append(r, "\\\'"); } else if (s[j] == '\"') { Append(r, "\\\""); } else Putc(s[j], r); } return r; } void emit_doc_texinfo() { for (Iterator it = First(docs); it.key; it = Next(it)) { String *wrap_name = it.key; String *synopsis = Getattr(it.item, "synopsis"); String *decl_info = Getattr(it.item, "decl_info"); String *cdecl_info = Getattr(it.item, "cdecl_info"); String *args_info = Getattr(it.item, "args_info"); String *doc_str = NewString(""); Printv(doc_str, synopsis, decl_info, cdecl_info, args_info, NIL); String *escaped_doc_str = texinfo_escape(doc_str); if (Len(doc_str)>0) { Printf(f_doc,"static const char* %s_texinfo = ",wrap_name); Printf(f_doc,"\"-*- texinfo -*-\\n\\\n%s", escaped_doc_str); if (Len(decl_info)) Printf(f_doc,"\\n\\\n@end deftypefn"); Printf(f_doc,"\";\n"); } Delete(escaped_doc_str); Delete(doc_str); Delete(wrap_name); } Printf(f_doc,"\n"); } bool is_empty_doc_node(Node* n) { if (!n) return true; String *synopsis = Getattr(n, "synopsis"); String *decl_info = Getattr(n, "decl_info"); String *cdecl_info = Getattr(n, "cdecl_info"); String *args_info = Getattr(n, "args_info"); return !Len(synopsis) && !Len(decl_info) && !Len(cdecl_info) && !Len(args_info); } String *texinfo_name(Node* n, const char* defval = "0") { String *tname = NewString(""); String *iname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(iname); Node* d = Getattr(docs, wname); if (is_empty_doc_node(d)) Printf(tname, defval); else Printf(tname, "%s_texinfo", wname); return tname; } void process_autodoc(Node *n) { String *iname = Getattr(n, "sym:name"); String *name = Getattr(n, "name"); String *wname = Swig_name_wrapper(iname); String *str = Getattr(n, "feature:docstring"); bool autodoc_enabled = !Cmp(Getattr(n, "feature:autodoc"), "1"); Node* d = Getattr(docs, wname); if (!d) { d = NewHash(); Setattr(d, "synopsis", NewString("")); Setattr(d, "decl_info", NewString("")); Setattr(d, "cdecl_info", NewString("")); Setattr(d, "args_info", NewString("")); Setattr(docs, wname, d); } String *synopsis = Getattr(d, "synopsis"); String *decl_info = Getattr(d, "decl_info"); // String *cdecl_info = Getattr(d, "cdecl_info"); String *args_info = Getattr(d, "args_info"); // * couldn't we just emit the docs here? if (autodoc_enabled) { String *decl_str = NewString(""); String *args_str = NewString(""); make_autodocParmList(n, decl_str, args_str); Append(decl_info, "@deftypefn {Loadable Function} "); SwigType *type = Getattr(n, "type"); if (type && Strcmp(type, "void")) { Node *nn = classLookup(Getattr(n, "type")); String *type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); Append(decl_info, "@var{retval} = "); Printf(args_str, "%s@var{retval} is of type %s. ", args_str, type_str); Delete(type_str); } Append(decl_info, name); Append(decl_info, " ("); Append(decl_info, decl_str); Append(decl_info, ")\n"); Append(args_info, args_str); Delete(decl_str); Delete(args_str); } if (str && Len(str) > 0) { // strip off {} if necessary char *t = Char(str); if (*t == '{') { Delitem(str, 0); Delitem(str, DOH_END); } // emit into synopsis section Append(synopsis, str); } } virtual int importDirective(Node *n) { String *modname = Getattr(n, "module"); if (modname) Printf(f_init, "if (!SWIG_Octave_LoadModule(\"%s\")) return false;\n", modname); return Language::importDirective(n); } const char *get_implicitconv_flag(Node *n) { int conv = 0; if (n && GetFlag(n, "feature:implicitconv")) { conv = 1; } return conv ? "SWIG_POINTER_IMPLICIT_CONV" : "0"; } /* ----------------------------------------------------------------------------- * addMissingParameterNames() * For functions that have not had nameless parameters set in the Language class. * * Inputs: * plist - entire parameter list * arg_offset - argument number for first parameter * Side effects: * The "lname" attribute in each parameter in plist will be contain a parameter name * ----------------------------------------------------------------------------- */ void addMissingParameterNames(Node* n, ParmList *plist, int arg_offset) { Parm *p = plist; int i = arg_offset; while (p) { if (!Getattr(p, "lname")) { String *name = makeParameterName(n, p, i); Setattr(p, "lname", name); Delete(name); } i++; p = nextSibling(p); } } void make_autodocParmList(Node *n, String *decl_str, String *args_str) { String *pdocs = 0; ParmList *plist = CopyParmList(Getattr(n, "parms")); Parm *p; Parm *pnext; int arg_num = is_wrapping_class() ? 1 : 0; addMissingParameterNames(n, plist, arg_num); // for $1_name substitutions done in Swig_typemap_attach_parms Swig_typemap_attach_parms("in", plist, 0); Swig_typemap_attach_parms("doc", plist, 0); for (p = plist; p; p = pnext, arg_num++) { String *tm = Getattr(p, "tmap:in"); if (tm) { pnext = Getattr(p, "tmap:in:next"); if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } } else { pnext = nextSibling(p); } String *name = 0; String *type = 0; String *value = 0; String *pdoc = Getattr(p, "tmap:doc"); if (pdoc) { name = Getattr(p, "tmap:doc:name"); type = Getattr(p, "tmap:doc:type"); value = Getattr(p, "tmap:doc:value"); } String *made_name = 0; if (!name) { name = made_name = makeParameterName(n, p, arg_num); } type = type ? type : Getattr(p, "type"); value = value ? value : Getattr(p, "value"); if (SwigType_isvarargs(type)) break; String *tex_name = NewString(""); if (name) Printf(tex_name, "@var{%s}", name); else Printf(tex_name, "@var{?}"); if (Len(decl_str)) Append(decl_str, ", "); Append(decl_str, tex_name); if (value) { String *new_value = convertValue(value, Getattr(p, "type")); if (new_value) { value = new_value; } else { Node *lookup = Swig_symbol_clookup(value, 0); if (lookup) value = Getattr(lookup, "sym:name"); } Printf(decl_str, " = %s", value); } Node *nn = classLookup(Getattr(p, "type")); String *type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); Printf(args_str, "%s is of type %s. ", tex_name, type_str); Delete(type_str); Delete(tex_name); Delete(made_name); } if (pdocs) Setattr(n, "feature:pdocs", pdocs); Delete(plist); } /* ------------------------------------------------------------ * convertValue() * Check if string v can be an Octave value literal, * (eg. number or string), or translate it to an Octave literal. * ------------------------------------------------------------ */ String *convertValue(String *v, SwigType *t) { if (v && Len(v) > 0) { char fc = (Char(v))[0]; if (('0' <= fc && fc <= '9') || '\'' == fc || '"' == fc) { /* number or string (or maybe NULL pointer) */ if (SwigType_ispointer(t) && Strcmp(v, "0") == 0) return NewString("None"); else return v; } if (Strcmp(v, "NULL") == 0 || Strcmp(v, "nullptr") == 0) return SwigType_ispointer(t) ? NewString("nil") : NewString("0"); if (Strcmp(v, "true") == 0 || Strcmp(v, "TRUE") == 0) return NewString("true"); if (Strcmp(v, "false") == 0 || Strcmp(v, "FALSE") == 0) return NewString("false"); } return 0; } virtual int functionWrapper(Node *n) { Parm *p; String *tm; int j; String *nodeType = Getattr(n, "nodeType"); int constructor = (!Cmp(nodeType, "constructor")); int destructor = (!Cmp(nodeType, "destructor")); String *storage = Getattr(n, "storage"); bool overloaded = !!Getattr(n, "sym:overloaded"); bool last_overload = overloaded && !Getattr(n, "sym:nextSibling"); String *iname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(iname); String *overname = Copy(wname); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); if (!overloaded && !addSymbol(iname, n)) return SWIG_ERROR; if (overloaded) Append(overname, Getattr(n, "sym:overname")); if (!overloaded || last_overload) process_autodoc(n); Wrapper *f = NewWrapper(); Octave_begin_function(n, f->def, iname, overname, !overloaded); // Start default try block to execute // cleanup code if exception is thrown Printf(f->code, "try {\n"); emit_parameter_variables(l, f); emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); int num_arguments = emit_num_arguments(l); int num_required = emit_num_required(l); int varargs = emit_isvarargs(l); char source[64]; Printf(f->code, "if (!SWIG_check_num_args(\"%s\",args.length(),%i,%i,%i)) " "{\n SWIG_fail;\n }\n", iname, num_arguments, num_required, varargs); if (constructor && num_arguments == 1 && num_required == 1) { if (Cmp(storage, "explicit") == 0) { Node *parent = Swig_methodclass(n); if (GetFlag(parent, "feature:implicitconv")) { String *desc = NewStringf("SWIGTYPE%s", SwigType_manglestr(Getattr(n, "type"))); Printf(f->code, "if (SWIG_CheckImplicit(%s)) SWIG_fail;\n", desc); Delete(desc); } } } for (j = 0, p = l; j < num_arguments; ++j) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *tm = Getattr(p, "tmap:in"); if (tm) { if (!tm || checkAttribute(p, "tmap:in:numinputs", "0")) { p = nextSibling(p); continue; } sprintf(source, "args(%d)", j); Setattr(p, "emit:input", source); Replaceall(tm, "$source", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Replaceall(tm, "$target", Getattr(p, "lname")); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } if (Getattr(p, "tmap:in:implicitconv")) { const char *convflag = "0"; if (!Getattr(p, "hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } Replaceall(tm, "$implicitconv", convflag); Setattr(p, "implicitconv", convflag); } String *getargs = NewString(""); if (j >= num_required) Printf(getargs, "if (%dcode, getargs, "\n", NIL); Delete(getargs); p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } // Check for trailing varargs if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$input", "varargs"); Printv(f->code, tm, "\n", NIL); } } // Insert constraint checking code for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } // Insert cleanup code String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { if (Getattr(p, "tmap:freearg:implicitconv")) { const char *convflag = "0"; if (!Getattr(p, "hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } if (strcmp(convflag, "0") == 0) { tm = 0; } } if (tm && (Len(tm) != 0)) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } // Insert argument output code String *outarg = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "_outp"); Replaceall(tm, "$result", "_outp"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } int director_method = is_member_director(n) && !is_smart_pointer() && !destructor; if (director_method) { Wrapper_add_local(f, "upcall", "bool upcall = false"); Append(f->code, "upcall = !!dynamic_cast(arg1);\n"); } Setattr(n, "wrap:name", overname); Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); Wrapper_add_local(f, "_out", "octave_value_list _out"); Wrapper_add_local(f, "_outp", "octave_value_list *_outp=&_out"); Wrapper_add_local(f, "_outv", "octave_value _outv"); // Return the function value if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "_outv"); Replaceall(tm, "$result", "_outv"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printf(f->code, "%s\n", tm); Printf(f->code, "if (_outv.is_defined()) _outp = " "SWIG_Octave_AppendOutput(_outp, _outv);\n"); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), iname); } emit_return_variable(n, d, f); Printv(f->code, outarg, NIL); Printv(f->code, cleanup, NIL); if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$result", "_outv"); Printf(f->code, "%s\n", tm); Delete(tm); } Printf(f->code, "return _out;\n"); // Execute cleanup code if branched to fail: label Printf(f->code, "fail:\n"); Printv(f->code, cleanup, NIL); Printf(f->code, "return octave_value_list();\n"); // Execute cleanup code if exception was thrown Printf(f->code, "}\n"); Printf(f->code, "catch(...) {\n"); Printv(f->code, cleanup, NIL); Printf(f->code, "throw;\n"); Printf(f->code, "}\n"); // End wrapper function Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); Wrapper_print(f, f_wrappers); DelWrapper(f); if (last_overload) dispatchFunction(n); if (!overloaded || last_overload) { String *tname = texinfo_name(n); Printf(s_global_tab, "{\"%s\",%s,0,0,2,%s},\n", iname, wname, tname); Delete(tname); } Delete(overname); Delete(wname); Delete(cleanup); Delete(outarg); return SWIG_OK; } void dispatchFunction(Node *n) { Wrapper *f = NewWrapper(); String *iname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(iname); int maxargs; String *dispatch = Swig_overload_dispatch(n, "return %s(args, nargout);", &maxargs); String *tmp = NewString(""); Octave_begin_function(n, f->def, iname, wname, true); Wrapper_add_local(f, "argc", "int argc = args.length()"); Printf(tmp, "octave_value_ref argv[%d]={", maxargs); for (int j = 0; j < maxargs; ++j) Printf(tmp, "%soctave_value_ref(args,%d)", j ? "," : " ", j); Printf(tmp, "}"); Wrapper_add_local(f, "argv", tmp); Printv(f->code, dispatch, "\n", NIL); Printf(f->code, "error(\"No matching function for overload\");\n", iname); Printf(f->code, "return octave_value_list();\n"); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); Delete(tmp); DelWrapper(f); Delete(dispatch); Delete(wname); } virtual int variableWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); if (!addSymbol(iname, n)) return SWIG_ERROR; String *tm; Wrapper *getf = NewWrapper(); Wrapper *setf = NewWrapper(); String *getname = Swig_name_get(NSPACE_TODO, iname); String *setname = Swig_name_set(NSPACE_TODO, iname); String *getwname = Swig_name_wrapper(getname); String *setwname = Swig_name_wrapper(setname); Octave_begin_function(n, setf->def, setname, setwname, true); Printf(setf->code, "if (!SWIG_check_num_args(\"%s_set\",args.length(),1,1,0)) return octave_value_list();", iname); if (is_assignable(n)) { Setattr(n, "wrap:name", setname); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "args(0)"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "args(0)"); if (Getattr(n, "tmap:varin:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); } emit_action_code(n, setf->code, tm); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); } Append(setf->code, "return octave_value_list();\n"); Append(setf->code, "fail:\n"); Append(setf->code, "return octave_value_list();\n"); } else { Printf(setf->code, "return octave_set_immutable(args,nargout);"); } Append(setf->code, "}\n"); Wrapper_print(setf, f_wrappers); Setattr(n, "wrap:name", getname); int addfail = 0; Octave_begin_function(n, getf->def, getname, getwname, true); Wrapper_add_local(getf, "obj", "octave_value obj"); if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "obj"); Replaceall(tm, "$result", "obj"); addfail = emit_action_code(n, getf->code, tm); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Append(getf->code, "return obj;\n"); if (addfail) { Append(getf->code, "fail:\n"); Append(getf->code, "return octave_value_list();\n"); } Append(getf->code, "}\n"); Wrapper_print(getf, f_wrappers); Printf(s_global_tab, "{\"%s\",0,%s,%s,2,0},\n", iname, getwname, setwname); Delete(getwname); Delete(setwname); DelWrapper(setf); DelWrapper(getf); return SWIG_OK; } virtual int constantWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *cppvalue = Getattr(n, "cppvalue"); String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); String *str = SwigType_str(type, wname); Printf(f_header, "static %s = %s;\n", str, value); Delete(str); value = wname; } if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", cppvalue ? cppvalue : value); Replaceall(tm, "$nsname", iname); Printf(f_init, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } return SWIG_OK; } virtual int nativeWrapper(Node *n) { return Language::nativeWrapper(n); } virtual int enumDeclaration(Node *n) { return Language::enumDeclaration(n); } virtual int enumvalueDeclaration(Node *n) { return Language::enumvalueDeclaration(n); } virtual int classDeclaration(Node *n) { return Language::classDeclaration(n); } virtual int classHandler(Node *n) { have_constructor = 0; have_destructor = 0; constructor_name = 0; class_name = Getattr(n, "sym:name"); if (!addSymbol(class_name, n)) return SWIG_ERROR; // This is a bug, due to the fact that swig_type -> octave_class mapping // is 1-to-n. static Hash *emitted = NewHash(); String *mangled_classname = Swig_name_mangle(Getattr(n, "name")); if (Getattr(emitted, mangled_classname)) { Delete(mangled_classname); return SWIG_NOWRAP; } Setattr(emitted, mangled_classname, "1"); Delete(mangled_classname); assert(!s_members_tab); s_members_tab = NewString(""); Printv(s_members_tab, "static swig_octave_member swig_", class_name, "_members[] = {\n", NIL); Language::classHandler(n); SwigType *t = Copy(Getattr(n, "name")); SwigType_add_pointer(t); // Replace storing a pointer to underlying class with a smart pointer (intended for use with non-intrusive smart pointers) SwigType *smart = Swig_cparse_smartptr(n); String *wrap_class = NewStringf("&_wrap_class_%s", class_name); if (smart) { SwigType_add_pointer(smart); SwigType_remember_clientdata(smart, wrap_class); } //String *wrap_class = NewStringf("&_wrap_class_%s", class_name); SwigType_remember_clientdata(t, wrap_class); int use_director = Swig_directorclass(n); if (use_director) { String *nspace = Getattr(n, "sym:nspace"); String *cname = Swig_name_disown(nspace, class_name); String *wcname = Swig_name_wrapper(cname); String *cnameshdw = NewStringf("%s_shadow", cname); String *wcnameshdw = Swig_name_wrapper(cnameshdw); Octave_begin_function(n, f_wrappers, cnameshdw, wcnameshdw, true); Printf(f_wrappers, " if (args.length()!=1) {\n"); Printf(f_wrappers, " error(\"disown takes no arguments\");\n"); Printf(f_wrappers, " return octave_value_list();\n"); Printf(f_wrappers, " }\n"); Printf(f_wrappers, " %s (args, nargout);\n", wcname); Printf(f_wrappers, " return args;\n"); Printf(f_wrappers, "}\n"); Printf(s_members_tab, "{\"__disown\",%s,0,0,0,0},\n", wcnameshdw); Delete(wcname); Delete(cname); Delete(wcnameshdw); Delete(cnameshdw); } Printf(s_members_tab, "{0,0,0,0,0,0}\n};\n"); Printv(f_wrappers, s_members_tab, NIL); String *base_class_names = NewString(""); String *base_class = NewString(""); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; int index = 0; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "name"); if ((!bname) || GetFlag(b.item, "feature:ignore") || (!Getattr(b.item, "module"))) { b = Next(b); continue; } String *bname_mangled = SwigType_manglestr(SwigType_add_pointer(Copy(bname))); Printf(base_class_names, "\"%s\",", bname_mangled); Printf(base_class, "0,"); b = Next(b); index++; Delete(bname_mangled); } } Printv(f_wrappers, "static const char *swig_", class_name, "_base_names[] = {", base_class_names, "0};\n", NIL); Printv(f_wrappers, "static const swig_type_info *swig_", class_name, "_base[] = {", base_class, "0};\n", NIL); Printv(f_wrappers, "static swig_octave_class _wrap_class_", class_name, " = {\"", class_name, "\", &SWIGTYPE", SwigType_manglestr(t), ",", NIL); Printv(f_wrappers, Swig_directorclass(n) ? "1," : "0,", NIL); if (have_constructor) { String *nspace = Getattr(n, "sym:nspace"); String *cname = Swig_name_construct(nspace, constructor_name); String *wcname = Swig_name_wrapper(cname); String *tname = texinfo_name(n); Printf(f_wrappers, "%s,%s,", wcname, tname); Delete(tname); Delete(wcname); Delete(cname); } else Printv(f_wrappers, "0,0,", NIL); if (have_destructor) { String *nspace = Getattr(n, "sym:nspace"); String *cname = Swig_name_destroy(nspace, class_name); String *wcname = Swig_name_wrapper(cname); Printf(f_wrappers, "%s,", wcname); Delete(wcname); Delete(cname); } else Printv(f_wrappers, "0", ",", NIL); Printf(f_wrappers, "swig_%s_members,swig_%s_base_names,swig_%s_base };\n\n", class_name, class_name, class_name); Delete(base_class); Delete(base_class_names); Delete(smart); Delete(t); Delete(s_members_tab); s_members_tab = 0; class_name = 0; return SWIG_OK; } virtual int memberfunctionHandler(Node *n) { Language::memberfunctionHandler(n); assert(s_members_tab); assert(class_name); String *name = Getattr(n, "name"); String *iname = GetChar(n, "sym:name"); String *realname = iname ? iname : name; String *wname = Getattr(n, "wrap:name"); assert(wname); if (!Getattr(n, "sym:nextSibling")) { String *tname = texinfo_name(n); String *rname = Copy(wname); bool overloaded = !!Getattr(n, "sym:overloaded"); if (overloaded) Delslice(rname, Len(rname) - Len(Getattr(n, "sym:overname")), DOH_END); Printf(s_members_tab, "{\"%s\",%s,0,0,0,%s},\n", realname, rname, tname); Delete(rname); Delete(tname); } return SWIG_OK; } virtual int membervariableHandler(Node *n) { Setattr(n, "feature:autodoc", "0"); Language::membervariableHandler(n); assert(s_members_tab); assert(class_name); String *symname = Getattr(n, "sym:name"); String *getname = Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)); String *setname = Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)); String *getwname = Swig_name_wrapper(getname); String *setwname = GetFlag(n, "feature:immutable") ? NewString("octave_set_immutable") : Swig_name_wrapper(setname); assert(s_members_tab); Printf(s_members_tab, "{\"%s\",0,%s,%s,0,0},\n", symname, getwname, setwname); Delete(getname); Delete(setname); Delete(getwname); Delete(setwname); return SWIG_OK; } virtual int constructorHandler(Node *n) { have_constructor = 1; if (!constructor_name) constructor_name = NewString(Getattr(n, "sym:name")); int use_director = Swig_directorclass(n); if (use_director) { Parm *parms = Getattr(n, "parms"); Parm *self; String *name = NewString("self"); String *type = NewString("void"); SwigType_add_pointer(type); self = NewParm(type, name, n); Delete(type); Delete(name); Setattr(self, "lname", "self_obj"); if (parms) set_nextSibling(self, parms); Setattr(n, "parms", self); Setattr(n, "wrap:self", "1"); Setattr(n, "hidden", "1"); Delete(self); } return Language::constructorHandler(n); } virtual int destructorHandler(Node *n) { have_destructor = 1; return Language::destructorHandler(n); } virtual int staticmemberfunctionHandler(Node *n) { Language::staticmemberfunctionHandler(n); assert(s_members_tab); assert(class_name); String *name = Getattr(n, "name"); String *iname = GetChar(n, "sym:name"); String *realname = iname ? iname : name; String *wname = Getattr(n, "wrap:name"); assert(wname); if (!Getattr(n, "sym:nextSibling")) { String *tname = texinfo_name(n); String *rname = Copy(wname); bool overloaded = !!Getattr(n, "sym:overloaded"); if (overloaded) Delslice(rname, Len(rname) - Len(Getattr(n, "sym:overname")), DOH_END); Printf(s_members_tab, "{\"%s\",%s,0,0,1,%s},\n", realname, rname, tname); Delete(rname); Delete(tname); } return SWIG_OK; } virtual int memberconstantHandler(Node *n) { return Language::memberconstantHandler(n); } virtual int staticmembervariableHandler(Node *n) { Setattr(n, "feature:autodoc", "0"); Language::staticmembervariableHandler(n); if (!GetFlag(n, "wrappedasconstant")) { assert(s_members_tab); assert(class_name); String *symname = Getattr(n, "sym:name"); String *getname = Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)); String *setname = Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)); String *getwname = Swig_name_wrapper(getname); String *setwname = GetFlag(n, "feature:immutable") ? NewString("octave_set_immutable") : Swig_name_wrapper(setname); assert(s_members_tab); Printf(s_members_tab, "{\"%s\",0,%s,%s,1,0},\n", symname, getwname, setwname); Delete(getname); Delete(setname); Delete(getwname); Delete(setwname); } return SWIG_OK; } int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n"); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } int classDirectorEnd(Node *n) { Printf(f_directors_h, "};\n\n"); return Language::classDirectorEnd(n); } int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); // insert self parameter Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("void"); SwigType_add_pointer(type); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { // constructor { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s," "\nSwig::Director(static_cast<%s*>(this)) { \n", classname, target, call, basetype); Append(w->def, "}\n"); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } // constructor header { String *target = Swig_method_decl(0, decl, classname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(classname); Delete(supername); Delete(parms); return Language::classDirectorConstructor(n); } int classDirectorDefaultConstructor(Node *n) { String *classname = Swig_class_name(n); { Wrapper *w = NewWrapper(); Printf(w->def, "SwigDirector_%s::SwigDirector_%s(void* self) :" "\nSwig::Director((octave_swig_type*)self,static_cast<%s*>(this)) { \n", classname, classname, classname); Append(w->def, "}\n"); Wrapper_print(w, f_directors); DelWrapper(w); } Printf(f_directors_h, " SwigDirector_%s(octave_swig_type* self);\n", classname); Delete(classname); return Language::classDirectorDefaultConstructor(n); } int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *returntype = Getattr(n, "type"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } // determine if the method returns a pointer is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); // virtual method definition String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); // header declaration target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); // declare method return value // if the return value is a reference or const reference, a specialized typemap must // handle it, including declaration of c_result ($result). if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { // attach typemaps to arguments (C/C++ -> Octave) String *parse_args = NewString(""); Swig_director_parms_fixup(l); Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("directorargout", l, w); Parm *p; int outputs = 0; if (!is_void) outputs++; // build argument list and type conversion string p = l; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); Wrapper_add_local(w, "tmpv", "octave_value tmpv"); if ((tm = Getattr(p, "tmap:directorin")) != 0) { String *parse = Getattr(p, "tmap:directorin:parse"); if (!parse) { Setattr(p, "emit:directorinput", "tmpv"); Replaceall(tm, "$input", "tmpv"); Replaceall(tm, "$owner", "0"); Printv(wrap_args, tm, "\n", NIL); Printf(wrap_args, "args.append(tmpv);\n"); Putc('O', parse_args); } else { Append(parse_args, parse); Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); if (Len(tm) == 0) Append(tm, pname); } p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } p = nextSibling(p); } String *method_name = Getattr(n, "sym:name"); Printv(w->code, wrap_args, NIL); // emit method invocation Wrapper_add_local(w, "args", "octave_value_list args"); Wrapper_add_local(w, "out", "octave_value_list out"); Wrapper_add_local(w, "idx", "std::list idx"); Printf(w->code, "idx.push_back(octave_value_list(\"%s\"));\n", method_name); Printf(w->code, "idx.push_back(args);\n"); Printf(w->code, "out=swig_get_self()->subsref(\".(\",idx,%d);\n", outputs); String *cleanup = NewString(""); String *outarg = NewString(""); idx = 0; // marshal return value if (!is_void) { Printf(w->code, "if (out.length()<%d) {\n", outputs); Printf(w->code, "Swig::DirectorTypeMismatchException::raise(\"Octave " "method %s.%s failed to return the required number " "of arguments.\");\n", classname, method_name); Printf(w->code, "}\n"); tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { char temp[24]; sprintf(temp, "out(%d)", idx); Replaceall(tm, "$input", temp); // Replaceall(tm, "$argnum", temp); Replaceall(tm, "$disown", Getattr(n, "wrap:disown") ? "SWIG_POINTER_DISOWN" : "0"); if (Getattr(n, "tmap:directorout:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } idx++; // marshal outputs for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { char temp[24]; sprintf(temp, "out(%d)", idx); Replaceall(tm, "$result", temp); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(parse_args); Delete(cleanup); Delete(outarg); } if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } // emit the director method if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } // clean up Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } String *runtimeCode() { String *s = NewString(""); String *srun = Swig_include_sys("octrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'octrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigoctaverun.h"); } }; extern "C" Language *swig_octave(void) { return new OCTAVE(); } swig-4.0.2/Source/Modules/swigmod.h0000644000175000017500000003677013667507523017071 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigmod.h * * Main header file for SWIG modules. * ----------------------------------------------------------------------------- */ #ifndef SWIG_SWIGMOD_H_ #define SWIG_SWIGMOD_H_ #include "swig.h" #include "preprocessor.h" #include "swigwarn.h" #define NOT_VIRTUAL 0 #define PLAIN_VIRTUAL 1 #define PURE_VIRTUAL 2 extern String *input_file; extern int line_number; extern int start_line; extern int CPlusPlus; // C++ mode extern int Extend; // Extend mode extern int Verbose; extern int IsVirtual; extern int ImportMode; extern int NoExcept; // -no_except option extern int Abstract; // abstract base class extern int SmartPointer; // smart pointer methods being emitted extern int SwigRuntime; /* Overload "argc" and "argv" */ extern String *argv_template_string; extern String *argc_template_string; /* Miscellaneous stuff */ #define tab2 " " #define tab4 " " #define tab8 " " class Dispatcher { public: Dispatcher ():cplus_mode(PUBLIC) { } virtual ~ Dispatcher () { } virtual int emit_one(Node *n); virtual int emit_children(Node *n); virtual int defaultHandler(Node *n); /* Top of the parse tree */ virtual int top(Node *n) = 0; /* SWIG directives */ virtual int applyDirective(Node *n); virtual int clearDirective(Node *n); virtual int constantDirective(Node *n); virtual int extendDirective(Node *n); virtual int fragmentDirective(Node *n); virtual int importDirective(Node *n); virtual int includeDirective(Node *n); virtual int insertDirective(Node *n); virtual int moduleDirective(Node *n); virtual int nativeDirective(Node *n); virtual int pragmaDirective(Node *n); virtual int typemapDirective(Node *n); virtual int typemapitemDirective(Node *n); virtual int typemapcopyDirective(Node *n); virtual int typesDirective(Node *n); /* C/C++ parsing */ virtual int cDeclaration(Node *n); virtual int externDeclaration(Node *n); virtual int enumDeclaration(Node *n); virtual int enumvalueDeclaration(Node *n); virtual int enumforwardDeclaration(Node *n); virtual int classDeclaration(Node *n); virtual int classforwardDeclaration(Node *n); virtual int constructorDeclaration(Node *n); virtual int destructorDeclaration(Node *n); virtual int accessDeclaration(Node *n); virtual int usingDeclaration(Node *n); virtual int namespaceDeclaration(Node *n); virtual int templateDeclaration(Node *n); virtual int lambdaDeclaration(Node *n); enum AccessMode { PUBLIC, PRIVATE, PROTECTED }; protected: AccessMode cplus_mode; }; /* ---------------------------------------------------------------------------- * class language: * * This class defines the functions that need to be supported by the * scripting language being used. The translator calls these virtual * functions to output different types of code for different languages. * ------------------------------------------------------------------------- */ class Language:public Dispatcher { public: Language(); virtual ~Language(); virtual int emit_one(Node *n); String *directorClassName(Node *n); /* Parse command line options */ virtual void main(int argc, char *argv[]); /* Top of the parse tree */ virtual int top(Node *n); /* SWIG directives */ virtual int applyDirective(Node *n); virtual int clearDirective(Node *n); virtual int constantDirective(Node *n); virtual int extendDirective(Node *n); virtual int fragmentDirective(Node *n); virtual int importDirective(Node *n); virtual int includeDirective(Node *n); virtual int insertDirective(Node *n); virtual int moduleDirective(Node *n); virtual int nativeDirective(Node *n); virtual int pragmaDirective(Node *n); virtual int typemapDirective(Node *n); virtual int typemapcopyDirective(Node *n); virtual int typesDirective(Node *n); /* C/C++ parsing */ virtual int cDeclaration(Node *n); virtual int externDeclaration(Node *n); virtual int enumDeclaration(Node *n); virtual int enumvalueDeclaration(Node *n); virtual int enumforwardDeclaration(Node *n); virtual int classDeclaration(Node *n); virtual int classforwardDeclaration(Node *n); virtual int constructorDeclaration(Node *n); virtual int destructorDeclaration(Node *n); virtual int accessDeclaration(Node *n); virtual int namespaceDeclaration(Node *n); virtual int usingDeclaration(Node *n); /* Function handlers */ virtual int functionHandler(Node *n); virtual int globalfunctionHandler(Node *n); virtual int memberfunctionHandler(Node *n); virtual int staticmemberfunctionHandler(Node *n); virtual int callbackfunctionHandler(Node *n); /* Variable handlers */ virtual int variableHandler(Node *n); virtual int globalvariableHandler(Node *n); virtual int membervariableHandler(Node *n); virtual int staticmembervariableHandler(Node *n); /* C++ handlers */ virtual int memberconstantHandler(Node *n); virtual int constructorHandler(Node *n); virtual int copyconstructorHandler(Node *n); virtual int destructorHandler(Node *n); virtual int classHandler(Node *n); /* Miscellaneous */ virtual int typedefHandler(Node *n); /* Low-level code generation */ virtual int constantWrapper(Node *n); virtual int variableWrapper(Node *n); virtual int functionWrapper(Node *n); virtual int nativeWrapper(Node *n); /* C++ director class generation */ virtual int classDirector(Node *n); virtual int classDirectorInit(Node *n); virtual int classDirectorEnd(Node *n); virtual int unrollVirtualMethods(Node *n, Node *parent, List *vm, int default_director, int &virtual_destructor, int protectedbase = 0); virtual int classDirectorConstructor(Node *n); virtual int classDirectorDefaultConstructor(Node *n); virtual int classDirectorMethod(Node *n, Node *parent, String *super); virtual int classDirectorConstructors(Node *n); virtual int classDirectorDestructor(Node *n); virtual int classDirectorMethods(Node *n); virtual int classDirectorDisown(Node *n); /* Miscellaneous */ virtual int validIdentifier(String *s); /* valid identifier? */ virtual int addSymbol(const String *s, const Node *n, const_String_or_char_ptr scope = ""); /* Add symbol */ virtual int addInterfaceSymbol(const String *interface_name, Node *n, const_String_or_char_ptr scope = ""); virtual void dumpSymbols(); virtual Node *symbolLookup(const String *s, const_String_or_char_ptr scope = ""); /* Symbol lookup */ virtual Hash* symbolAddScope(const_String_or_char_ptr scope); virtual Hash* symbolScopeLookup(const_String_or_char_ptr scope); virtual Hash* symbolScopePseudoSymbolLookup(const_String_or_char_ptr scope); static Node *classLookup(const SwigType *s); /* Class lookup */ static Node *enumLookup(SwigType *s); /* Enum lookup */ virtual int abstractClassTest(Node *n); /* Is class really abstract? */ virtual int is_assignable(Node *n); /* Is variable assignable? */ virtual String *runtimeCode(); /* returns the language specific runtime code */ virtual String *defaultExternalRuntimeFilename(); /* the default filename for the external runtime */ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm); /* Language specific special variable substitutions for $typemap() */ /* Runtime is C++ based, so extern "C" header section */ void enable_cplus_runtime_mode(); /* Returns the cplus_runtime mode */ int cplus_runtime_mode(); /* Allow director related code generation */ void allow_directors(int val = 1); /* Return true if directors are enabled */ int directorsEnabled() const; /* Allow director protected members related code generation */ void allow_dirprot(int val = 1); /* Allow all protected members code generation (for directors) */ void allow_allprotected(int val = 0); /* Returns the dirprot mode */ int dirprot_mode() const; /* Check if the non public constructor is needed (for directors) */ int need_nonpublic_ctor(Node *n); /* Check if the non public member is needed (for directors) */ int need_nonpublic_member(Node *n); /* Set none comparison string */ void setSubclassInstanceCheck(String *s); /* Set overload variable templates argc and argv */ void setOverloadResolutionTemplates(String *argc, String *argv); /* Language instance is a singleton - get instance */ static Language* instance(); protected: /* Allow multiple-input typemaps */ void allow_multiple_input(int val = 1); /* Allow overloaded functions */ void allow_overloading(int val = 1); /* Wrapping class query */ int is_wrapping_class() const; /* Return the node for the current class */ Node *getCurrentClass() const; /* Return C++ mode */ int getCPlusMode() const; /* Return the namespace for the class/enum - the nspace feature */ String *getNSpace() const; /* Return the real name of the current class */ String *getClassName() const; /* Return the classes hash */ Hash *getClassHash() const; /* Return the current class prefix */ String *getClassPrefix() const; /* Return the current enum class prefix */ String *getEnumClassPrefix() const; /* Fully qualified type name to use */ String *getClassType() const; /* Return true if the current method is part of a smart-pointer */ int is_smart_pointer() const; /* Return the name to use for the given parameter. */ virtual String *makeParameterName(Node *n, Parm *p, int arg_num, bool setter = false) const; /* Some language modules require additional wrappers for virtual methods not declared in sub-classes */ virtual bool extraDirectorProtectedCPPMethodsRequired() const; public: enum NestedClassSupport { NCS_None, // Target language does not have an equivalent to nested classes NCS_Full, // Target language does have an equivalent to nested classes and is fully implemented NCS_Unknown // Target language may or may not have an equivalent to nested classes. If it does, it has not been implemented yet. }; /* Does target language support nested classes? Default is NCS_Unknown. If NCS_Unknown is returned, then the nested classes will be ignored unless %feature "flatnested" is applied to them, in which case they will appear in global space. If the target language does not support the notion of class nesting, the language module should return NCS_None from this function, and the nested classes will be moved to the global scope (like implicit global %feature "flatnested"). */ virtual NestedClassSupport nestedClassesSupport() const; /* Returns true if the target language supports key word arguments (kwargs) */ virtual bool kwargsSupport() const; protected: /* Identifies if a protected members that are generated when the allprotected option is used. This does not include protected virtual methods as they are turned on with the dirprot option. */ bool isNonVirtualProtectedAccess(Node *n) const; /* Identify if a wrapped global or member variable n should use the naturalvar feature */ int use_naturalvar_mode(Node *n) const; /* Director subclass comparison test */ String *none_comparison; /* Director constructor "template" code */ String *director_ctor_code; /* Director 'protected' constructor "template" code */ String *director_prot_ctor_code; /* Director allows multiple inheritance */ int director_multiple_inheritance; /* Director language module */ int director_language; /* Used to translate Doxygen comments to target documentation format */ class DoxygenTranslator *doxygenTranslator; private: Hash *symtabs; /* symbol tables */ int overloading; int multiinput; int cplus_runtime; int directors; static Language *this_; }; extern "C" { void SWIG_typemap_lang(const char *); typedef Language *(*ModuleFactory) (void); } enum Status {Disabled, Experimental, Supported}; struct TargetLanguageModule { const char *name; ModuleFactory fac; const char *help; Status status; }; int SWIG_main(int argc, char *argv[], const TargetLanguageModule *tlm); void emit_parameter_variables(ParmList *l, Wrapper *f); void emit_return_variable(Node *n, SwigType *rt, Wrapper *f); void SWIG_config_file(const_String_or_char_ptr ); const String *SWIG_output_directory(); void SWIG_config_cppext(const char *ext); void Swig_print_xml(Node *obj, String *filename); /* get the list of generated files */ List *SWIG_output_files(); void SWIG_library_directory(const char *); int emit_num_arguments(ParmList *); int emit_num_required(ParmList *); int emit_isvarargs(ParmList *p); bool emit_isvarargs_function(Node *n); void emit_attach_parmmaps(ParmList *, Wrapper *f); void emit_mark_varargs(ParmList *l); String *emit_action(Node *n); int emit_action_code(Node *n, String *wrappercode, String *action); void Swig_overload_check(Node *n); String *Swig_overload_dispatch(Node *n, const_String_or_char_ptr fmt, int *, const_String_or_char_ptr fmt_fastdispatch = 0); String *Swig_overload_dispatch_cast(Node *n, const_String_or_char_ptr fmt, int *); List *Swig_overload_rank(Node *n, bool script_lang_wrapping); SwigType *cplus_value_type(SwigType *t); /* directors.cxx start */ String *Swig_csuperclass_call(String *base, String *method, ParmList *l); String *Swig_class_declaration(Node *n, String *name); String *Swig_class_name(Node *n); String *Swig_method_call(const_String_or_char_ptr name, ParmList *parms); String *Swig_method_decl(SwigType *return_base_type, SwigType *decl, const_String_or_char_ptr id, List *args, int default_args); String *Swig_director_declaration(Node *n); void Swig_director_emit_dynamic_cast(Node *n, Wrapper *f); void Swig_director_parms_fixup(ParmList *parms); /* directors.cxx end */ /* Utilities */ int is_public(Node *n); int is_private(Node *n); int is_protected(Node *n); int is_member_director(Node *parentnode, Node *member); int is_member_director(Node *member); int is_non_virtual_protected_access(Node *n); /* Check if the non-virtual protected members are required (for directors) */ void Wrapper_virtual_elimination_mode_set(int); void Wrapper_fast_dispatch_mode_set(int); void Wrapper_cast_dispatch_mode_set(int); void Wrapper_naturalvar_mode_set(int); void clean_overloaded(Node *n); extern "C" { const char *Swig_to_string(DOH *object, int count = -1); const char *Swig_to_string_with_location(DOH *object, int count = -1); void Swig_print(DOH *object, int count = -1); void Swig_print_with_location(DOH *object, int count = -1); } /* Contracts */ void Swig_contracts(Node *n); void Swig_contract_mode_set(int flag); int Swig_contract_mode_get(); /* Browser */ void Swig_browser(Node *n, int); void Swig_default_allocators(Node *n); void Swig_process_types(Node *n); /* Nested classes */ void Swig_nested_process_classes(Node *n); void Swig_nested_name_unnamed_c_structs(Node *n); /* Interface feature */ void Swig_interface_feature_enable(); void Swig_interface_propagate_methods(Node *n); /* Miscellaneous */ template class save_value { T _value; T& _value_ptr; save_value(const save_value&); save_value& operator=(const save_value&); public: save_value(T& value) : _value(value), _value_ptr(value) {} save_value(T& value, T new_val) : _value(value), _value_ptr(value) { value = new_val; } ~save_value() { _value_ptr = _value; } }; #endif swig-4.0.2/Source/Modules/contract.cxx0000644000175000017500000002357313667507523017605 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * contract.cxx * * Support for Wrap by Contract in SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" /* Contract structure. This holds rules about the different kinds of contract sections and their combination rules */ struct contract { const char *section; const char *combiner; }; /* Contract rules. This table defines what contract sections are recognized as well as how contracts are to combined via inheritance */ static contract Rules[] = { {"require:", "&&"}, {"ensure:", "||"}, {NULL, NULL} }; /* ---------------------------------------------------------------------------- * class Contracts: * * This class defines the functions that need to be used in * "wrap by contract" module. * ------------------------------------------------------------------------- */ class Contracts:public Dispatcher { String *make_expression(String *s, Node *n); void substitute_parms(String *s, ParmList *p, int method); public: Hash *ContractSplit(Node *n); int emit_contract(Node *n, int method); int cDeclaration(Node *n); int constructorDeclaration(Node *n); int externDeclaration(Node *n); int extendDirective(Node *n); int importDirective(Node *n); int includeDirective(Node *n); int namespaceDeclaration(Node *n); int classDeclaration(Node *n); virtual int top(Node *n); }; static int Contract_Mode = 0; /* contract option */ static int InClass = 0; /* Parsing C++ or not */ static int InConstructor = 0; static Node *CurrentClass = 0; /* Set the contract mode, default is 0 (not open) */ /* Normally set in main.cxx, when get the "-contracts" option */ void Swig_contract_mode_set(int flag) { Contract_Mode = flag; } /* Get the contract mode */ int Swig_contract_mode_get() { return Contract_Mode; } /* Apply contracts */ void Swig_contracts(Node *n) { Contracts *a = new Contracts; a->top(n); delete a; } /* Split the whole contract into preassertion, postassertion and others */ Hash *Contracts::ContractSplit(Node *n) { String *contract = Getattr(n, "feature:contract"); Hash *result; if (!contract) return NULL; result = NewHash(); String *current_section = NewString(""); const char *current_section_name = Rules[0].section; List *l = SplitLines(contract); Iterator i; for (i = First(l); i.item; i = Next(i)) { int found = 0; if (Strchr(i.item, '{')) continue; if (Strchr(i.item, '}')) continue; for (int j = 0; Rules[j].section; j++) { if (Strstr(i.item, Rules[j].section)) { if (Len(current_section)) { Setattr(result, current_section_name, current_section); current_section = Getattr(result, Rules[j].section); if (!current_section) current_section = NewString(""); } current_section_name = Rules[j].section; found = 1; break; } } if (!found) Append(current_section, i.item); } if (Len(current_section)) Setattr(result, current_section_name, current_section); return result; } /* This function looks in base classes and collects contracts found */ void inherit_contracts(Node *c, Node *n, Hash *contracts, Hash *messages) { Node *b, *temp; String *name, *type, *local_decl, *base_decl; List *bases; int found = 0; bases = Getattr(c, "bases"); if (!bases) return; name = Getattr(n, "name"); type = Getattr(n, "type"); local_decl = Getattr(n, "decl"); if (local_decl) { local_decl = SwigType_typedef_resolve_all(local_decl); } else { return; } /* Width first search */ for (int i = 0; i < Len(bases); i++) { b = Getitem(bases, i); temp = firstChild(b); while (temp) { base_decl = Getattr(temp, "decl"); if (base_decl) { base_decl = SwigType_typedef_resolve_all(base_decl); if ((checkAttribute(temp, "storage", "virtual")) && (checkAttribute(temp, "name", name)) && (checkAttribute(temp, "type", type)) && (!Strcmp(local_decl, base_decl))) { /* Yes, match found. */ Hash *icontracts = Getattr(temp, "contract:rules"); Hash *imessages = Getattr(temp, "contract:messages"); found = 1; if (icontracts && imessages) { /* Add inherited contracts and messages to the contract rules above */ int j = 0; for (j = 0; Rules[j].section; j++) { String *t = Getattr(contracts, Rules[j].section); String *s = Getattr(icontracts, Rules[j].section); if (s) { if (t) { Insert(t, 0, "("); Printf(t, ") %s (%s)", Rules[j].combiner, s); String *m = Getattr(messages, Rules[j].section); Printf(m, " %s [%s from %s]", Rules[j].combiner, Getattr(imessages, Rules[j].section), Getattr(b, "name")); } else { Setattr(contracts, Rules[j].section, NewString(s)); Setattr(messages, Rules[j].section, NewStringf("[%s from %s]", Getattr(imessages, Rules[j].section), Getattr(b, "name"))); } } } } } Delete(base_decl); } temp = nextSibling(temp); } } Delete(local_decl); if (!found) { for (int j = 0; j < Len(bases); j++) { b = Getitem(bases, j); inherit_contracts(b, n, contracts, messages); } } } /* This function cleans up the assertion string by removing some extraneous characters. Splitting the assertion into pieces */ String *Contracts::make_expression(String *s, Node *n) { String *str_assert, *expr = 0; List *list_assert; str_assert = NewString(s); /* Omit all useless characters and split by ; */ Replaceall(str_assert, "\n", ""); Replaceall(str_assert, "{", ""); Replaceall(str_assert, "}", ""); Replace(str_assert, " ", "", DOH_REPLACE_ANY | DOH_REPLACE_NOQUOTE); Replace(str_assert, "\t", "", DOH_REPLACE_ANY | DOH_REPLACE_NOQUOTE); list_assert = Split(str_assert, ';', -1); Delete(str_assert); /* build up new assertion */ str_assert = NewString(""); Iterator ei; for (ei = First(list_assert); ei.item; ei = Next(ei)) { expr = ei.item; if (Len(expr)) { Replaceid(expr, Getattr(n, "name"), Swig_cresult_name()); if (Len(str_assert)) Append(str_assert, "&&"); Printf(str_assert, "(%s)", expr); } } Delete(list_assert); return str_assert; } /* This function substitutes parameter names for argument names in the contract specification. Note: it is assumed that the wrapper code uses arg1 for self and arg2..argn for arguments. */ void Contracts::substitute_parms(String *s, ParmList *p, int method) { int argnum = 1; char argname[32]; if (method) { Replaceid(s, "$self", "arg1"); argnum++; } while (p) { sprintf(argname, "arg%d", argnum); String *name = Getattr(p, "name"); if (name) { Replaceid(s, name, argname); } argnum++; p = nextSibling(p); } } int Contracts::emit_contract(Node *n, int method) { Hash *contracts; Hash *messages; String *c; ParmList *cparms; if (!Getattr(n, "feature:contract")) return SWIG_ERROR; /* Get contract parameters */ cparms = Getmeta(Getattr(n, "feature:contract"), "parms"); /* Split contract into preassert & postassert */ contracts = ContractSplit(n); if (!contracts) return SWIG_ERROR; /* This messages hash is used to hold the error messages that will be displayed on failed contract. */ messages = NewHash(); /* Take the different contract expressions and clean them up a bit */ Iterator i; for (i = First(contracts); i.item; i = Next(i)) { String *e = make_expression(i.item, n); substitute_parms(e, cparms, method); Setattr(contracts, i.key, e); /* Make a string containing error messages */ Setattr(messages, i.key, NewString(e)); } /* If we're in a class. We need to inherit other assertions. */ if (InClass) { inherit_contracts(CurrentClass, n, contracts, messages); } /* Save information */ Setattr(n, "contract:rules", contracts); Setattr(n, "contract:messages", messages); /* Okay. Generate the contract runtime code. */ if ((c = Getattr(contracts, "require:"))) { Setattr(n, "contract:preassert", NewStringf("SWIG_contract_assert(%s, \"Contract violation: require: %s\");\n", c, Getattr(messages, "require:"))); } if ((c = Getattr(contracts, "ensure:"))) { Setattr(n, "contract:postassert", NewStringf("SWIG_contract_assert(%s, \"Contract violation: ensure: %s\");\n", c, Getattr(messages, "ensure:"))); } return SWIG_OK; } int Contracts::cDeclaration(Node *n) { int ret = SWIG_OK; String *decl = Getattr(n, "decl"); /* Not a function. Don't even bother with it (for now) */ if (!SwigType_isfunction(decl)) return SWIG_OK; if (Getattr(n, "feature:contract")) ret = emit_contract(n, InClass && !Swig_storage_isstatic(n)); return ret; } int Contracts::constructorDeclaration(Node *n) { int ret = SWIG_OK; InConstructor = 1; if (Getattr(n, "feature:contract")) ret = emit_contract(n, 0); InConstructor = 0; return ret; } int Contracts::externDeclaration(Node *n) { return emit_children(n); } int Contracts::extendDirective(Node *n) { return emit_children(n); } int Contracts::importDirective(Node *n) { return emit_children(n); } int Contracts::includeDirective(Node *n) { return emit_children(n); } int Contracts::namespaceDeclaration(Node *n) { return emit_children(n); } int Contracts::classDeclaration(Node *n) { int ret = SWIG_OK; int oldInClass = InClass; Node *oldClass = CurrentClass; InClass = 1; CurrentClass = n; emit_children(n); InClass = oldInClass; CurrentClass = oldClass; return ret; } int Contracts::top(Node *n) { emit_children(n); return SWIG_OK; } swig-4.0.2/Source/Modules/pike.cxx0000644000175000017500000006470313667507523016720 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * pike.cxx * * Pike language module for SWIG. * ----------------------------------------------------------------------------- */ /* * Notes: * * - The current approach used for "out" typemaps is inconsistent with * how "out" typemaps are handled by other language modules. Instead * of converting the C/C++ type ($1) to a Pike object type (e.g. a * struct svalue), we're just calling the appropriate push_XXX * (e.g. push_int) to push the return value onto the stack. * * - Pike classes can't have static member functions or data, so we need * to find some other appropriate mapping for C++ static member functions * and data. * * - Pike doesn't seem to provide any default way to print the memory * address, etc. for extension objects. Should we do something here? * */ #include "swigmod.h" #include // for isalnum() static const char *usage = "\ Pike Options (available with -pike)\n\ [no additional options]\n\ \n"; class PIKE:public Language { private: File *f_begin; File *f_runtime; File *f_header; File *f_wrappers; File *f_init; File *f_classInit; String *PrefixPlusUnderscore; int current; // Wrap modes enum { NO_CPP, MEMBER_FUNC, CONSTRUCTOR, DESTRUCTOR, MEMBER_VAR, CLASS_CONST, STATIC_FUNC, STATIC_VAR }; public: /* --------------------------------------------------------------------- * PIKE() * * Initialize member data * --------------------------------------------------------------------- */ PIKE() { f_begin = 0; f_runtime = 0; f_header = 0; f_wrappers = 0; f_init = 0; f_classInit = 0; PrefixPlusUnderscore = 0; current = NO_CPP; } /* --------------------------------------------------------------------- * main() * * Parse command line options and initializes variables. * --------------------------------------------------------------------- */ virtual void main(int argc, char *argv[]) { /* Set location of SWIG library */ SWIG_library_directory("pike"); /* Look for certain command line options */ for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } } } /* Add a symbol to the parser for conditional compilation */ Preprocessor_define("SWIGPIKE 1", 0); /* Set language-specific configuration file */ SWIG_config_file("pike.swg"); /* Set typemap language */ SWIG_typemap_lang("pike"); /* Enable overloaded methods support */ allow_overloading(); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { /* Get the module name */ String *module = Getattr(n, "name"); /* Get the output file name */ String *outfile = Getattr(n, "outfile"); /* Open the output file */ f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_classInit = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("classInit", f_classInit); /* Standard stuff for the SWIG runtime section */ Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGPIKE\n#define SWIGPIKE\n#endif\n\n"); Printf(f_header, "#define SWIG_init pike_module_init\n"); Printf(f_header, "#define SWIG_name \"%s\"\n\n", module); /* Change naming scheme for constructors and destructors */ Swig_name_register("construct", "%n%c_create"); Swig_name_register("destroy", "%n%c_destroy"); /* Current wrap type */ current = NO_CPP; /* Emit code for children */ Language::top(n); /* Close the initialization function */ Printf(f_init, "}\n"); SwigType_emit_type_table(f_runtime, f_wrappers); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_classInit); Delete(f_runtime); Delete(f_begin); /* Done */ return SWIG_OK; } /* ------------------------------------------------------------ * validIdentifier() * ------------------------------------------------------------ */ virtual int validIdentifier(String *s) { char *c = Char(s); const char *c0 = c; const char *c1 = c0 + 1; while (*c) { if (*c == '`' && c == c0) { c++; continue; } if ((*c == '+' || *c == '-' || *c == '*' || *c == '/') && c == c1) { c++; continue; } if (!(isalnum(*c) || (*c == '_'))) return 0; c++; } return 1; } /* ------------------------------------------------------------ * importDirective() * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { String *modname = Getattr(n, "module"); if (modname) { Printf(f_init, "pike_require(\"%s\");\n", modname); } return Language::importDirective(n); } /* ------------------------------------------------------------ * strip() * * For names that begin with the current class prefix plus an * underscore (e.g. "Foo_enum_test"), return the base function * name (i.e. "enum_test"). * ------------------------------------------------------------ */ String *strip(const DOHconst_String_or_char_ptr name) { String *s = Copy(name); if (Strncmp(name, PrefixPlusUnderscore, Len(PrefixPlusUnderscore)) != 0) { return s; } Replaceall(s, PrefixPlusUnderscore, ""); return s; } /* ------------------------------------------------------------ * add_method() * ------------------------------------------------------------ */ void add_method(const DOHconst_String_or_char_ptr name, const DOHconst_String_or_char_ptr function, const DOHconst_String_or_char_ptr description) { String *rename = NULL; switch (current) { case NO_CPP: rename = NewString(name); Printf(f_init, "ADD_FUNCTION(\"%s\", %s, tFunc(%s), 0);\n", rename, function, description); break; case STATIC_FUNC: case STATIC_VAR: rename = NewString(name); Printf(f_init, "ADD_FUNCTION(\"%s\", %s, tFunc(%s), 0);\n", rename, function, description); break; case CONSTRUCTOR: case DESTRUCTOR: case MEMBER_FUNC: case MEMBER_VAR: rename = strip(name); Printf(f_classInit, "ADD_FUNCTION(\"%s\", %s, tFunc(%s), 0);\n", rename, function, description); break; case CLASS_CONST: // shouldn't have gotten here for CLASS_CONST nodes default: // what is this? assert(false); } Delete(rename); } /* --------------------------------------------------------------------- * functionWrapper() * * Create a function declaration and register it with the interpreter. * --------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; String *tm; int i; String *overname = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } Wrapper *f = NewWrapper(); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ int num_arguments = emit_num_arguments(l); int varargs = emit_isvarargs(l); /* Which input argument to start with? */ int start = (current == MEMBER_FUNC || current == MEMBER_VAR || current == DESTRUCTOR) ? 1 : 0; /* Offset to skip over the attribute name */ // int offset = (current == MEMBER_VAR) ? 1 : 0; int offset = 0; String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); Printv(f->def, "static void ", wname, "(INT32 args) {", NIL); /* Generate code for argument marshalling */ String *description = NewString(""); char source[64]; for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); if (i < start) { String *lstr = SwigType_lstr(pt, 0); Printf(f->code, "%s = (%s) THIS;\n", ln, lstr); Delete(lstr); } else { /* Look for an input typemap */ sprintf(source, "Pike_sp[%d-args]", i - start + offset); if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printf(f->code, "%s\n", tm); String *pikedesc = Getattr(p, "tmap:in:pikedesc"); if (pikedesc) { Printv(description, pikedesc, " ", NIL); } p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } p = nextSibling(p); } /* Check for trailing varargs */ if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$input", "varargs"); Printv(f->code, tm, "\n", NIL); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ String *outarg = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* Emit the function call */ String *actioncode = emit_action(n); /* Clear the return stack */ Printf(actioncode, "pop_n_elems(args);\n"); /* Return the function value */ if (current == CONSTRUCTOR) { Printv(actioncode, "THIS = (void *) ", Swig_cresult_name(), ";\n", NIL); Printv(description, ", tVoid", NIL); } else if (current == DESTRUCTOR) { Printv(description, ", tVoid", NIL); } else { Printv(description, ", ", NIL); if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { actioncode = 0; Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "1"); } else { Replaceall(tm, "$owner", "0"); } String *pikedesc = Getattr(n, "tmap:out:pikedesc"); if (pikedesc) { Printv(description, pikedesc, NIL); } Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } } if (actioncode) { Append(f->code, actioncode); Delete(actioncode); } emit_return_variable(n, d, f); /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } /* Close the function */ Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Replaceall(f->code, "$result", "resultobj"); /* Dump the function out */ Wrapper_print(f, f_wrappers); /* Now register the function with the interpreter. */ if (!Getattr(n, "sym:overloaded")) { add_method(iname, wname, description); } else { if (!Getattr(n, "sym:nextSibling")) { dispatchFunction(n); } } Delete(cleanup); Delete(outarg); Delete(description); Delete(wname); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * dispatchFunction() * * Emit overloading dispatch function * ------------------------------------------------------------ */ void dispatchFunction(Node *n) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewString(""); String *dispatch = Swig_overload_dispatch(n, "%s(args); return;", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); Printf(f->def, "static void %s(INT32 args) {", wname); Wrapper_add_local(f, "argc", "INT32 argc"); Printf(tmp, "struct svalue argv[%d]", maxargs); Wrapper_add_local(f, "argv", tmp); Wrapper_add_local(f, "ii", "INT32 ii"); Printf(f->code, "argc = args;\n"); Printf(f->code, "for (ii = 0; (ii < argc) && (ii < %d); ii++) {\n", maxargs); Printf(f->code, "argv[ii] = Pike_sp[ii-args];\n"); Printf(f->code, "}\n"); Replaceall(dispatch, "$args", "self, args"); Printv(f->code, dispatch, "\n", NIL); Printf(f->code, "Pike_error(\"No matching function for overloaded '%s'.\");\n", symname); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); String *description = NewString(""); Printf(description, "tAny,"); if (current == CONSTRUCTOR || current == DESTRUCTOR) { Printf(description, " tVoid"); } else { String *pd = Getattr(n, "tmap:out:pikedesc"); if (pd) Printf(description, " %s", pd); } add_method(symname, wname, description); Delete(description); DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { return Language::variableWrapper(n); } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { Swig_require("constantWrapper", n, "*sym:name", "type", "value", NIL); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); if (SwigType_type(type) == T_MPOINTER) { /* Special hook for member pointer */ String *wname = Swig_name_wrapper(symname); Printf(f_header, "static %s = %s;\n", SwigType_str(type, wname), value); value = wname; } else if (SwigType_type(type) == T_CHAR && is_enum_item) { type = NewSwigType(T_INT); Setattr(n, "type", type); } /* Perform constant typemap substitution */ String *tm = Swig_typemap_lookup("constant", n, value, 0); if (tm) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", symname); Replaceall(tm, "$symname", symname); Replaceall(tm, "$value", value); Printf(f_init, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value %s = %s\n", SwigType_str(type, 0), value); } Swig_restore(n); return SWIG_OK; } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { // return Language::nativeWrapper(n); String *name = Getattr(n, "sym:name"); String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n)) return SWIG_ERROR; add_method(name, wrapname, 0); return SWIG_OK; } /* ------------------------------------------------------------ * enumDeclaration() * ------------------------------------------------------------ */ virtual int enumDeclaration(Node *n) { return Language::enumDeclaration(n); } /* ------------------------------------------------------------ * enumvalueDeclaration() * ------------------------------------------------------------ */ virtual int enumvalueDeclaration(Node *n) { return Language::enumvalueDeclaration(n); } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { return Language::classDeclaration(n); } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { String *symname = Getattr(n, "sym:name"); if (!addSymbol(symname, n)) return SWIG_ERROR; PrefixPlusUnderscore = NewStringf("%s_", getClassPrefix()); Printf(f_classInit, "start_new_program();\n"); /* Handle inheritance */ List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist) > 0) { Iterator base = First(baselist); while (base.item) { String *basename = Getattr(base.item, "name"); SwigType *basetype = NewString(basename); SwigType_add_pointer(basetype); SwigType_remember(basetype); String *basemangle = SwigType_manglestr(basetype); Printf(f_classInit, "low_inherit((struct program *) SWIGTYPE%s->clientdata, 0, 0, 0, 0, 0);\n", basemangle); Delete(basemangle); Delete(basetype); base = Next(base); } } else { Printf(f_classInit, "ADD_STORAGE(swig_object_wrapper);\n"); } Language::classHandler(n); /* Accessors for member variables */ /* List *membervariables = Getattr(n,"membervariables"); if (membervariables && Len(membervariables) > 0) { membervariableAccessors(membervariables); } */ /* Done, close the class and dump its definition to the init function */ Printf(f_classInit, "add_program_constant(\"%s\", pr = end_program(), 0);\n", symname); Dump(f_classInit, f_init); Clear(f_classInit); SwigType *tt = NewString(symname); SwigType_add_pointer(tt); SwigType_remember(tt); String *tm = SwigType_manglestr(tt); Printf(f_init, "SWIG_TypeClientData(SWIGTYPE%s, (void *) pr);\n", tm); Delete(tm); Delete(tt); Delete(PrefixPlusUnderscore); PrefixPlusUnderscore = 0; return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * * Method for adding C++ member function * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { current = MEMBER_FUNC; Language::memberfunctionHandler(n); current = NO_CPP; return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * * Method for adding C++ member constructor * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { current = CONSTRUCTOR; Language::constructorHandler(n); current = NO_CPP; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { current = DESTRUCTOR; Language::destructorHandler(n); current = NO_CPP; return SWIG_OK; } /* ------------------------------------------------------------ * membervariableAccessors() * ------------------------------------------------------------ */ void membervariableAccessors(List *membervariables) { String *name; Iterator i; bool need_setter; String *funcname; /* If at least one of them is mutable, we need a setter */ need_setter = false; i = First(membervariables); while (i.item) { if (!GetFlag(i.item, "feature:immutable")) { need_setter = true; break; } i = Next(i); } /* Create a function to set the values of the (mutable) variables */ if (need_setter) { Wrapper *wrapper = NewWrapper(); String *setter = Swig_name_member(NSPACE_TODO, getClassPrefix(), "`->="); String *wname = Swig_name_wrapper(setter); Printv(wrapper->def, "static void ", wname, "(INT32 args) {", NIL); Printf(wrapper->locals, "char *name = (char *) STR0(Pike_sp[0-args].u.string);\n"); i = First(membervariables); while (i.item) { if (!GetFlag(i.item, "feature:immutable")) { name = Getattr(i.item, "name"); funcname = Swig_name_wrapper(Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, getClassPrefix(), name))); Printf(wrapper->code, "if (!strcmp(name, \"%s\")) {\n", name); Printf(wrapper->code, "%s(args);\n", funcname); Printf(wrapper->code, "return;\n"); Printf(wrapper->code, "}\n"); Delete(funcname); } i = Next(i); } /* Close the function */ Printf(wrapper->code, "pop_n_elems(args);\n"); Printf(wrapper->code, "}\n"); /* Dump wrapper code to the output file */ Wrapper_print(wrapper, f_wrappers); /* Register it with Pike */ String *description = NewString("tStr tFloat, tVoid"); add_method("`->=", wname, description); Delete(description); /* Clean up */ Delete(wname); Delete(setter); DelWrapper(wrapper); } /* Create a function to get the values of the (mutable) variables */ Wrapper *wrapper = NewWrapper(); String *getter = Swig_name_member(NSPACE_TODO, getClassPrefix(), "`->"); String *wname = Swig_name_wrapper(getter); Printv(wrapper->def, "static void ", wname, "(INT32 args) {", NIL); Printf(wrapper->locals, "char *name = (char *) STR0(Pike_sp[0-args].u.string);\n"); i = First(membervariables); while (i.item) { name = Getattr(i.item, "name"); funcname = Swig_name_wrapper(Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, getClassPrefix(), name))); Printf(wrapper->code, "if (!strcmp(name, \"%s\")) {\n", name); Printf(wrapper->code, "%s(args);\n", funcname); Printf(wrapper->code, "return;\n"); Printf(wrapper->code, "}\n"); Delete(funcname); i = Next(i); } /* Close the function */ Printf(wrapper->code, "pop_n_elems(args);\n"); Printf(wrapper->code, "}\n"); /* Dump wrapper code to the output file */ Wrapper_print(wrapper, f_wrappers); /* Register it with Pike */ String *description = NewString("tStr, tMix"); add_method("`->", wname, description); Delete(description); /* Clean up */ Delete(wname); Delete(getter); DelWrapper(wrapper); } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { List *membervariables = Getattr(getCurrentClass(), "membervariables"); if (!membervariables) { membervariables = NewList(); Setattr(getCurrentClass(), "membervariables", membervariables); } Append(membervariables, n); current = MEMBER_VAR; Language::membervariableHandler(n); current = NO_CPP; return SWIG_OK; } /* ----------------------------------------------------------------------- * staticmemberfunctionHandler() * * Wrap a static C++ function * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { current = STATIC_FUNC; Language::staticmemberfunctionHandler(n); current = NO_CPP; return SWIG_OK; } /* ------------------------------------------------------------ * memberconstantHandler() * * Create a C++ constant * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { current = CLASS_CONST; constantWrapper(n); current = NO_CPP; return SWIG_OK; } /* --------------------------------------------------------------------- * staticmembervariableHandler() * --------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { current = STATIC_VAR; Language::staticmembervariableHandler(n); current = NO_CPP; return SWIG_OK; } }; /* ----------------------------------------------------------------------------- * swig_pike() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_pike() { return new PIKE(); } extern "C" Language *swig_pike(void) { return new_swig_pike(); } swig-4.0.2/Source/Modules/overload.cxx0000644000175000017500000007035613667507523017604 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * overload.cxx * * This file is used to analyze overloaded functions and methods. * It looks at signatures and tries to gather information for * building a dispatch function. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #define MAX_OVERLOAD 4096 /* Overload "argc" and "argv" */ String *argv_template_string; String *argc_template_string; struct Overloaded { Node *n; /* Node */ int argc; /* Argument count */ ParmList *parms; /* Parameters used for overload check */ int error; /* Ambiguity error */ bool implicitconv_function; /* For ordering implicitconv functions*/ }; static int fast_dispatch_mode = 0; static int cast_dispatch_mode = 0; /* Set fast_dispatch_mode */ void Wrapper_fast_dispatch_mode_set(int flag) { fast_dispatch_mode = flag; } void Wrapper_cast_dispatch_mode_set(int flag) { cast_dispatch_mode = flag; } /* ----------------------------------------------------------------------------- * mark_implicitconv_function() * * Mark function if it contains an implicitconv type in the parameter list * ----------------------------------------------------------------------------- */ static void mark_implicitconv_function(Overloaded& onode) { Parm *parms = onode.parms; if (parms) { bool is_implicitconv_function = false; Parm *p = parms; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } if (GetFlag(p, "implicitconv")) { is_implicitconv_function = true; break; } p = nextSibling(p); } if (is_implicitconv_function) onode.implicitconv_function = true; } } /* ----------------------------------------------------------------------------- * Swig_overload_rank() * * This function takes an overloaded declaration and creates a list that ranks * all overloaded methods in an order that can be used to generate a dispatch * function. * Slight difference in the way this function is used by scripting languages and * statically typed languages. The script languages call this method via * Swig_overload_dispatch() - where wrappers for all overloaded methods are generated, * however sometimes the code can never be executed. The non-scripting languages * call this method via Swig_overload_check() for each overloaded method in order * to determine whether or not the method should be wrapped. Note the slight * difference when overloading methods that differ by const only. The * scripting languages will ignore the const method, whereas the non-scripting * languages ignore the first method parsed. * ----------------------------------------------------------------------------- */ List *Swig_overload_rank(Node *n, bool script_lang_wrapping) { Overloaded nodes[MAX_OVERLOAD]; int nnodes = 0; Node *o = Getattr(n, "sym:overloaded"); Node *c; if (!o) return 0; c = o; while (c) { if (Getattr(c, "error")) { c = Getattr(c, "sym:nextSibling"); continue; } /* if (SmartPointer && Getattr(c,"cplus:staticbase")) { c = Getattr(c,"sym:nextSibling"); continue; } */ /* Make a list of all the declarations (methods) that are overloaded with * this one particular method name */ if (Getattr(c, "wrap:name")) { assert(nnodes < MAX_OVERLOAD); nodes[nnodes].n = c; nodes[nnodes].parms = Getattr(c, "wrap:parms"); nodes[nnodes].argc = emit_num_required(nodes[nnodes].parms); nodes[nnodes].error = 0; nodes[nnodes].implicitconv_function = false; mark_implicitconv_function(nodes[nnodes]); nnodes++; } c = Getattr(c, "sym:nextSibling"); } /* Sort the declarations by required argument count */ { int i, j; for (i = 0; i < nnodes; i++) { for (j = i + 1; j < nnodes; j++) { if (nodes[i].argc > nodes[j].argc) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } } } } /* Sort the declarations by argument types */ { int i, j; for (i = 0; i < nnodes - 1; i++) { if (nodes[i].argc == nodes[i + 1].argc) { for (j = i + 1; (j < nnodes) && (nodes[j].argc == nodes[i].argc); j++) { Parm *p1 = nodes[i].parms; Parm *p2 = nodes[j].parms; int differ = 0; int num_checked = 0; while (p1 && p2 && (num_checked < nodes[i].argc)) { // Printf(stdout,"p1 = '%s', p2 = '%s'\n", Getattr(p1,"type"), Getattr(p2,"type")); if (checkAttribute(p1, "tmap:in:numinputs", "0")) { p1 = Getattr(p1, "tmap:in:next"); continue; } if (checkAttribute(p2, "tmap:in:numinputs", "0")) { p2 = Getattr(p2, "tmap:in:next"); continue; } String *t1 = Getattr(p1, "tmap:typecheck:precedence"); String *t2 = Getattr(p2, "tmap:typecheck:precedence"); if ((!t1) && (!nodes[i].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[i].n), Getline(nodes[i].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[i].n), SwigType_str(Getattr(p1, "type"), 0)); nodes[i].error = 1; } else if ((!t2) && (!nodes[j].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[j].n), SwigType_str(Getattr(p2, "type"), 0)); nodes[j].error = 1; } if (t1 && t2) { int t1v, t2v; t1v = atoi(Char(t1)); t2v = atoi(Char(t2)); differ = t1v - t2v; } else if (!t1 && t2) differ = 1; else if (t1 && !t2) differ = -1; else if (!t1 && !t2) differ = -1; num_checked++; if (differ > 0) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; break; } else if ((differ == 0) && (Strcmp(t1, "0") == 0)) { t1 = Getattr(p1, "equivtype"); t1 = t1 ? t1 : Getattr(p1, "ltype"); if (!t1) { t1 = SwigType_ltype(Getattr(p1, "type")); if (Getattr(p1, "tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t1); } Setattr(p1, "ltype", t1); } t2 = Getattr(p2, "equivtype"); t2 = t2 ? t2 : Getattr(p2, "ltype"); if (!t2) { t2 = SwigType_ltype(Getattr(p2, "type")); if (Getattr(p2, "tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t2); } Setattr(p2, "ltype", t2); } /* Need subtype check here. If t2 is a subtype of t1, then we need to change the order */ if (SwigType_issubtype(t2, t1)) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } if (Strcmp(t1, t2) != 0) { differ = 1; break; } } else if (differ) { break; } if (Getattr(p1, "tmap:in:next")) { p1 = Getattr(p1, "tmap:in:next"); } else { p1 = nextSibling(p1); } if (Getattr(p2, "tmap:in:next")) { p2 = Getattr(p2, "tmap:in:next"); } else { p2 = nextSibling(p2); } } if (!differ) { /* See if declarations differ by const only */ String *decl1 = Getattr(nodes[i].n, "decl"); String *decl2 = Getattr(nodes[j].n, "decl"); if (decl1 && decl2) { /* Remove ref-qualifiers. Note that rvalue ref-qualifiers are already ignored and * it is illegal to overload a function with and without ref-qualifiers. So with * all the combinations of ref-qualifiers and cv-qualifiers, we just detect * the cv-qualifier (const) overloading. */ String *d1 = Copy(decl1); String *d2 = Copy(decl2); if (SwigType_isreference(d1) || SwigType_isrvalue_reference(d1)) { Delete(SwigType_pop(d1)); } if (SwigType_isreference(d2) || SwigType_isrvalue_reference(d2)) { Delete(SwigType_pop(d2)); } String *dq1 = Copy(d1); String *dq2 = Copy(d2); if (SwigType_isconst(d1)) { Delete(SwigType_pop(dq1)); } if (SwigType_isconst(d2)) { Delete(SwigType_pop(dq2)); } if (Strcmp(dq1, dq2) == 0) { if (SwigType_isconst(d1) && !SwigType_isconst(d2)) { if (script_lang_wrapping) { // Swap nodes so that the const method gets ignored (shadowed by the non-const method) Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } else if (!SwigType_isconst(d1) && SwigType_isconst(d2)) { differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } } Delete(dq1); Delete(dq2); } } if (!differ) { if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s effectively ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[i].n), Getline(nodes[i].n), "as it is shadowed by %s.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } nodes[j].error = 1; } } } } } } List *result = NewList(); { int i; int argc_changed_index = -1; for (i = 0; i < nnodes; i++) { if (nodes[i].error) Setattr(nodes[i].n, "overload:ignore", "1"); Append(result, nodes[i].n); // Printf(stdout,"[ %d ] %d %s\n", i, nodes[i].implicitconv_function, ParmList_errorstr(nodes[i].parms)); // Swig_print_node(nodes[i].n); if (i == nnodes-1 || nodes[i].argc != nodes[i+1].argc) { if (argc_changed_index+2 < nnodes && (nodes[argc_changed_index+1].argc == nodes[argc_changed_index+2].argc)) { // Add additional implicitconv functions in same order as already ranked. // Consider overloaded functions by argument count... only add additional implicitconv functions if // the number of functions with the same arg count > 1, ie, only if overloaded by same argument count. int j; for (j = argc_changed_index + 1; j <= i; j++) { if (nodes[j].implicitconv_function) { SetFlag(nodes[j].n, "implicitconvtypecheckoff"); Append(result, nodes[j].n); // Printf(stdout,"[ %d ] %d + %s\n", j, nodes[j].implicitconv_function, ParmList_errorstr(nodes[j].parms)); // Swig_print_node(nodes[j].n); } } } argc_changed_index = i; } } } return result; } // /* ----------------------------------------------------------------------------- // * print_typecheck() // * ----------------------------------------------------------------------------- */ static bool print_typecheck(String *f, int j, Parm *pj, bool implicitconvtypecheckoff) { char tmp[256]; sprintf(tmp, Char(argv_template_string), j); String *tm = Getattr(pj, "tmap:typecheck"); if (tm) { tm = Copy(tm); Replaceid(tm, Getattr(pj, "lname"), "_v"); String *conv = Getattr(pj, "implicitconv"); if (conv && !implicitconvtypecheckoff) { Replaceall(tm, "$implicitconv", conv); } else { Replaceall(tm, "$implicitconv", "0"); } Replaceall(tm, "$input", tmp); Printv(f, tm, "\n", NIL); Delete(tm); return true; } else return false; } /* ----------------------------------------------------------------------------- * ReplaceFormat() * ----------------------------------------------------------------------------- */ static String *ReplaceFormat(const_String_or_char_ptr fmt, int j) { String *lfmt = NewString(fmt); char buf[50]; sprintf(buf, "%d", j); Replaceall(lfmt, "$numargs", buf); int i; String *commaargs = NewString(""); for (i = 0; i < j; i++) { Printv(commaargs, ", ", NIL); Printf(commaargs, Char(argv_template_string), i); } Replaceall(lfmt, "$commaargs", commaargs); return lfmt; } /* ----------------------------------------------------------------------------- * Swig_overload_dispatch() * * Generate a dispatch function. argc is assumed to hold the argument count. * argv is the argument vector. * * Note that for C++ class member functions, Swig_overload_dispatch() assumes * that argc includes the "self" argument and that the first element of argv[] * is the "self" argument. So for a member function: * * Foo::bar(int x, int y, int z); * * the argc should be 4 (not 3!) and the first element of argv[] would be * the appropriate scripting language reference to "self". For regular * functions (and static class functions) the argc and argv only include * the regular function arguments. * ----------------------------------------------------------------------------- */ /* Cast dispatch mechanism. */ String *Swig_overload_dispatch_cast(Node *n, const_String_or_char_ptr fmt, int *maxargs) { int i, j; *maxargs = 1; String *f = NewString(""); String *sw = NewString(""); Printf(f, "{\n"); Printf(f, "unsigned long _index = 0;\n"); Printf(f, "SWIG_TypeRank _rank = 0; \n"); /* Get a list of methods ranked by precedence values and argument count */ List *dispatch = Swig_overload_rank(n, true); int nfunc = Len(dispatch); /* Loop over the functions */ bool emitcheck = true; for (i = 0; i < nfunc; i++) { int fn = 0; Node *ni = Getitem(dispatch, i); Parm *pi = Getattr(ni, "wrap:parms"); bool implicitconvtypecheckoff = GetFlag(ni, "implicitconvtypecheckoff") != 0; int num_required = emit_num_required(pi); int num_arguments = emit_num_arguments(pi); if (num_arguments > *maxargs) *maxargs = num_arguments; if (num_required == num_arguments) { Printf(f, "if (%s == %d) {\n", argc_template_string, num_required); } else { Printf(f, "if ((%s >= %d) && (%s <= %d)) {\n", argc_template_string, num_required, argc_template_string, num_arguments); } Printf(f, "SWIG_TypeRank _ranki = 0;\n"); Printf(f, "SWIG_TypeRank _rankm = 0;\n"); if (num_arguments) Printf(f, "SWIG_TypeRank _pi = 1;\n"); /* create a list with the wrappers that collide with the current one based on argument number */ List *coll = NewList(); for (int k = i + 1; k < nfunc; k++) { Node *nk = Getitem(dispatch, k); Parm *pk = Getattr(nk, "wrap:parms"); int nrk = emit_num_required(pk); int nak = emit_num_arguments(pk); if ((nrk >= num_required && nrk <= num_arguments) || (nak >= num_required && nak <= num_arguments) || (nrk <= num_required && nak >= num_arguments)) Append(coll, nk); } // printf("overload: %s coll=%d\n", Char(Getattr(n, "sym:name")), Len(coll)); int num_braces = 0; bool test = (num_arguments > 0); if (test) { int need_v = 1; j = 0; Parm *pj = pi; while (pj) { if (checkAttribute(pj, "tmap:in:numinputs", "0")) { pj = Getattr(pj, "tmap:in:next"); continue; } String *tm = Getattr(pj, "tmap:typecheck"); if (tm) { tm = Copy(tm); /* normalise for comparison later */ Replaceid(tm, Getattr(pj, "lname"), "_v"); /* if all the wrappers have the same type check on this argument we can optimize it out */ for (int k = 0; k < Len(coll) && !emitcheck; k++) { Node *nk = Getitem(coll, k); Parm *pk = Getattr(nk, "wrap:parms"); int nak = emit_num_arguments(pk); if (nak <= j) continue; int l = 0; Parm *pl = pk; /* finds arg j on the collider wrapper */ while (pl && l <= j) { if (checkAttribute(pl, "tmap:in:numinputs", "0")) { pl = Getattr(pl, "tmap:in:next"); continue; } if (l == j) { /* we are at arg j, so we compare the tmaps now */ String *tml = Getattr(pl, "tmap:typecheck"); /* normalise it before comparing */ if (tml) Replaceid(tml, Getattr(pl, "lname"), "_v"); if (!tml || Cmp(tm, tml)) emitcheck = true; //printf("tmap: %s[%d] (%d) => %s\n\n", // Char(Getattr(nk, "sym:name")), // l, emitcheck, tml?Char(tml):0); } Parm *pl1 = Getattr(pl, "tmap:in:next"); if (pl1) pl = pl1; else pl = nextSibling(pl); l++; } } if (emitcheck) { if (need_v) { Printf(f, "int _v = 0;\n"); need_v = 0; } if (j >= num_required) { Printf(f, "if (%s > %d) {\n", argc_template_string, j); num_braces++; } String *tmp = NewStringf(argv_template_string, j); String *conv = Getattr(pj, "implicitconv"); if (conv && !implicitconvtypecheckoff) { Replaceall(tm, "$implicitconv", conv); } else { Replaceall(tm, "$implicitconv", "0"); } Replaceall(tm, "$input", tmp); Printv(f, "{\n", tm, "}\n", NIL); Delete(tm); fn = i + 1; Printf(f, "if (!_v) goto check_%d;\n", fn); Printf(f, "_ranki += _v*_pi;\n"); Printf(f, "_rankm += _pi;\n"); Printf(f, "_pi *= SWIG_MAXCASTRANK;\n"); } } if (!Getattr(pj, "tmap:in:SWIGTYPE") && Getattr(pj, "tmap:typecheck:SWIGTYPE")) { /* we emit a warning if the argument defines the 'in' typemap, but not the 'typecheck' one */ Swig_warning(WARN_TYPEMAP_TYPECHECK_UNDEF, Getfile(ni), Getline(ni), "Overloaded method %s with no explicit typecheck typemap for arg %d of type '%s'\n", Swig_name_decl(n), j, SwigType_str(Getattr(pj, "type"), 0)); } Parm *pj1 = Getattr(pj, "tmap:in:next"); if (pj1) pj = pj1; else pj = nextSibling(pj); j++; } } /* close braces */ for ( /* empty */ ; num_braces > 0; num_braces--) Printf(f, "}\n"); Printf(f, "if (!_index || (_ranki < _rank)) {\n"); Printf(f, " _rank = _ranki; _index = %d;\n", i + 1); Printf(f, " if (_rank == _rankm) goto dispatch;\n"); Printf(f, "}\n"); String *lfmt = ReplaceFormat(fmt, num_arguments); Printf(sw, "case %d:\n", i + 1); Printf(sw, Char(lfmt), Getattr(ni, "wrap:name")); Printf(sw, "\n"); Printf(f, "}\n"); /* braces closes "if" for this method */ if (fn) Printf(f, "check_%d:\n\n", fn); if (implicitconvtypecheckoff) Delattr(ni, "implicitconvtypecheckoff"); Delete(lfmt); Delete(coll); } Delete(dispatch); Printf(f, "dispatch:\n"); Printf(f, "switch(_index) {\n"); Printf(f, "%s", sw); Printf(f, "}\n"); Printf(f, "}\n"); return f; } /* Fast dispatch mechanism, provided by Salvador Fandi~no Garc'ia (#930586). */ static String *overload_dispatch_fast(Node *n, const_String_or_char_ptr fmt, int *maxargs, const_String_or_char_ptr fmt_fastdispatch) { int i, j; *maxargs = 1; String *f = NewString(""); /* Get a list of methods ranked by precedence values and argument count */ List *dispatch = Swig_overload_rank(n, true); int nfunc = Len(dispatch); /* Loop over the functions */ for (i = 0; i < nfunc; i++) { int fn = 0; Node *ni = Getitem(dispatch, i); Parm *pi = Getattr(ni, "wrap:parms"); bool implicitconvtypecheckoff = GetFlag(ni, "implicitconvtypecheckoff") != 0; int num_required = emit_num_required(pi); int num_arguments = emit_num_arguments(pi); if (num_arguments > *maxargs) *maxargs = num_arguments; if (num_required == num_arguments) { Printf(f, "if (%s == %d) {\n", argc_template_string, num_required); } else { Printf(f, "if ((%s >= %d) && (%s <= %d)) {\n", argc_template_string, num_required, argc_template_string, num_arguments); } /* create a list with the wrappers that collide with the current one based on argument number */ List *coll = NewList(); for (int k = i + 1; k < nfunc; k++) { Node *nk = Getitem(dispatch, k); Parm *pk = Getattr(nk, "wrap:parms"); int nrk = emit_num_required(pk); int nak = emit_num_arguments(pk); if ((nrk >= num_required && nrk <= num_arguments) || (nak >= num_required && nak <= num_arguments) || (nrk <= num_required && nak >= num_arguments)) Append(coll, nk); } // printf("overload: %s coll=%d\n", Char(Getattr(n, "sym:name")), Len(coll)); bool emitcheck = false; int num_braces = 0; bool test = (Len(coll) > 0 && num_arguments); if (test) { int need_v = 1; j = 0; Parm *pj = pi; while (pj) { if (checkAttribute(pj, "tmap:in:numinputs", "0")) { pj = Getattr(pj, "tmap:in:next"); continue; } String *tm = Getattr(pj, "tmap:typecheck"); if (tm) { tm = Copy(tm); /* normalise for comparison later */ Replaceid(tm, Getattr(pj, "lname"), "_v"); /* if all the wrappers have the same type check on this argument we can optimize it out */ emitcheck = false; for (int k = 0; k < Len(coll) && !emitcheck; k++) { Node *nk = Getitem(coll, k); Parm *pk = Getattr(nk, "wrap:parms"); int nak = emit_num_arguments(pk); if (nak <= j) continue; int l = 0; Parm *pl = pk; /* finds arg j on the collider wrapper */ while (pl && l <= j) { if (checkAttribute(pl, "tmap:in:numinputs", "0")) { pl = Getattr(pl, "tmap:in:next"); continue; } if (l == j) { /* we are at arg j, so we compare the tmaps now */ String *tml = Getattr(pl, "tmap:typecheck"); /* normalise it before comparing */ if (tml) Replaceid(tml, Getattr(pl, "lname"), "_v"); if (!tml || Cmp(tm, tml)) emitcheck = true; //printf("tmap: %s[%d] (%d) => %s\n\n", // Char(Getattr(nk, "sym:name")), // l, emitcheck, tml?Char(tml):0); } Parm *pl1 = Getattr(pl, "tmap:in:next"); if (pl1) pl = pl1; else pl = nextSibling(pl); l++; } } if (emitcheck) { if (need_v) { Printf(f, "int _v = 0;\n"); need_v = 0; } if (j >= num_required) { Printf(f, "if (%s > %d) {\n", argc_template_string, j); num_braces++; } String *tmp = NewStringf(argv_template_string, j); String *conv = Getattr(pj, "implicitconv"); if (conv && !implicitconvtypecheckoff) { Replaceall(tm, "$implicitconv", conv); } else { Replaceall(tm, "$implicitconv", "0"); } Replaceall(tm, "$input", tmp); Printv(f, "{\n", tm, "}\n", NIL); Delete(tm); fn = i + 1; Printf(f, "if (!_v) goto check_%d;\n", fn); } } if (!Getattr(pj, "tmap:in:SWIGTYPE") && Getattr(pj, "tmap:typecheck:SWIGTYPE")) { /* we emit a warning if the argument defines the 'in' typemap, but not the 'typecheck' one */ Swig_warning(WARN_TYPEMAP_TYPECHECK_UNDEF, Getfile(ni), Getline(ni), "Overloaded method %s with no explicit typecheck typemap for arg %d of type '%s'\n", Swig_name_decl(n), j, SwigType_str(Getattr(pj, "type"), 0)); } Parm *pj1 = Getattr(pj, "tmap:in:next"); if (pj1) pj = pj1; else pj = nextSibling(pj); j++; } } /* close braces */ for ( /* empty */ ; num_braces > 0; num_braces--) Printf(f, "}\n"); // The language module may want to generate different code for last overloaded function called (with same number of arguments) String *lfmt = ReplaceFormat(!emitcheck && fmt_fastdispatch ? fmt_fastdispatch : fmt, num_arguments); Printf(f, Char(lfmt), Getattr(ni, "wrap:name")); Printf(f, "}\n"); /* braces closes "if" for this method */ if (fn) Printf(f, "check_%d:\n\n", fn); if (implicitconvtypecheckoff) Delattr(ni, "implicitconvtypecheckoff"); Delete(lfmt); Delete(coll); } Delete(dispatch); return f; } String *Swig_overload_dispatch(Node *n, const_String_or_char_ptr fmt, int *maxargs, const_String_or_char_ptr fmt_fastdispatch) { if (fast_dispatch_mode || GetFlag(n, "feature:fastdispatch")) { return overload_dispatch_fast(n, fmt, maxargs, fmt_fastdispatch); } int i, j; *maxargs = 1; String *f = NewString(""); /* Get a list of methods ranked by precedence values and argument count */ List *dispatch = Swig_overload_rank(n, true); int nfunc = Len(dispatch); /* Loop over the functions */ for (i = 0; i < nfunc; i++) { Node *ni = Getitem(dispatch, i); Parm *pi = Getattr(ni, "wrap:parms"); bool implicitconvtypecheckoff = GetFlag(ni, "implicitconvtypecheckoff") != 0; int num_required = emit_num_required(pi); int num_arguments = emit_num_arguments(pi); if (GetFlag(n, "wrap:this")) { num_required++; num_arguments++; } if (num_arguments > *maxargs) *maxargs = num_arguments; if (num_required == num_arguments) { Printf(f, "if (%s == %d) {\n", argc_template_string, num_required); } else { Printf(f, "if ((%s >= %d) && (%s <= %d)) {\n", argc_template_string, num_required, argc_template_string, num_arguments); } if (num_arguments) { Printf(f, "int _v;\n"); } int num_braces = 0; j = 0; Parm *pj = pi; while (pj) { if (checkAttribute(pj, "tmap:in:numinputs", "0")) { pj = Getattr(pj, "tmap:in:next"); continue; } if (j >= num_required) { String *lfmt = ReplaceFormat(fmt, num_arguments); Printf(f, "if (%s <= %d) {\n", argc_template_string, j); Printf(f, Char(lfmt), Getattr(ni, "wrap:name")); Printf(f, "}\n"); Delete(lfmt); } if (print_typecheck(f, (GetFlag(n, "wrap:this") ? j + 1 : j), pj, implicitconvtypecheckoff)) { Printf(f, "if (_v) {\n"); num_braces++; } if (!Getattr(pj, "tmap:in:SWIGTYPE") && Getattr(pj, "tmap:typecheck:SWIGTYPE")) { /* we emit a warning if the argument defines the 'in' typemap, but not the 'typecheck' one */ Swig_warning(WARN_TYPEMAP_TYPECHECK_UNDEF, Getfile(ni), Getline(ni), "Overloaded method %s with no explicit typecheck typemap for arg %d of type '%s'\n", Swig_name_decl(n), j, SwigType_str(Getattr(pj, "type"), 0)); } Parm *pk = Getattr(pj, "tmap:in:next"); if (pk) pj = pk; else pj = nextSibling(pj); j++; } String *lfmt = ReplaceFormat(fmt, num_arguments); Printf(f, Char(lfmt), Getattr(ni, "wrap:name")); Delete(lfmt); /* close braces */ for ( /* empty */ ; num_braces > 0; num_braces--) Printf(f, "}\n"); Printf(f, "}\n"); /* braces closes "if" for this method */ if (implicitconvtypecheckoff) Delattr(ni, "implicitconvtypecheckoff"); } Delete(dispatch); return f; } /* ----------------------------------------------------------------------------- * Swig_overload_check() * ----------------------------------------------------------------------------- */ void Swig_overload_check(Node *n) { Swig_overload_rank(n, false); } swig-4.0.2/Source/Modules/allegrocl.cxx0000644000175000017500000026410213667507523017727 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * allegrocl.cxx * * ALLEGROCL language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include // #define ALLEGROCL_DEBUG // #define ALLEGROCL_WRAP_DEBUG // #define ALLEGROCL_TYPE_DEBUG // #define ALLEGROCL_CLASS_DEBUG static const char *usage = "\ Allegro CL Options (available with -allegrocl)\n\ -identifier-converter - \n\ Specifies the type of conversion to do on C identifiers to convert\n\ them to symbols. There are two built-in converters: 'null' and\n\ 'lispify'. The default is 'null'. If you supply a name other\n\ than one of the built-ins, then a function by that name will be\n\ called to convert identifiers to symbols.\n\ -[no]cwrap - Turn on or turn off generation of an intermediate C file when\n\ creating a C interface. By default this is only done for C++ code.\n\ -isolate - Define all SWIG helper functions in a package unique to this\n\ module. Avoids redefinition warnings when loading multiple\n\ SWIGged modules into the same running Allegro CL image.\n\ "; static File *f_cl = 0; String *f_clhead = NewString(""); String *f_clwrap = NewString("(swig-in-package ())\n\n"); static File *f_begin; static File *f_runtime; static File *f_cxx_header = 0; static File *f_cxx_wrapper = 0; static String *module_name = 0; static String *swig_package = 0; static String *identifier_converter = NewString("identifier-convert-null"); static bool CWrap = true; // generate wrapper file for C code by default. most correct. static bool Generate_Wrapper = false; static bool unique_swig_package = false; static SwigType *fwdref_ffi_type = NewString("__SWIGACL_FwdReference"); static String *current_namespace = NewString(""); static String *current_package = NewString(""); static Hash *defined_namespace_packages = NewHash(); static Node *in_class = 0; static Node *first_linked_type = 0; static Hash *defined_foreign_types = NewHash(); static Hash *defined_foreign_ltypes = NewHash(); static String *anon_type_name = NewString("anontype"); static int anon_type_count = 0; // stub String *convert_literal(String *num_param, String *type, bool try_to_split = true); class ALLEGROCL:public Language { public: virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int namespaceDeclaration(Node *n); virtual int constructorHandler(Node *n); virtual int destructorHandler(Node *n); virtual int globalvariableHandler(Node *n); virtual int variableWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int memberfunctionHandler(Node *n); virtual int membervariableHandler(Node *n); virtual int classHandler(Node *n); virtual int emit_one(Node *n); virtual int enumDeclaration(Node *n); virtual int enumvalueDeclaration(Node *n); virtual int typedefHandler(Node *n); virtual int classforwardDeclaration(Node *n); virtual int templateDeclaration(Node *n); virtual int validIdentifier(String *s); private: int emit_defun(Node *n, File *f_cl); int emit_dispatch_defun(Node *n); int emit_buffered_defuns(Node *n); int cClassHandler(Node *n); int cppClassHandler(Node *n); }; static ALLEGROCL *allegrocl = 0; static String *trim(String *str) { char *c = Char(str); while (*c != '\0' && isspace((int) *c)) ++c; String *result = NewString(c); Chop(result); return result; } int is_integer(String *s) { char *c = Char(s); if (c[0] == '#' && (c[1] == 'x' || c[1] == 'o')) c += 2; while (*c) { if (!isdigit(*c)) return 0; c++; } return 1; } String *class_from_class_or_class_ref(String *type) { SwigType *stripped = SwigType_strip_qualifiers(type); if (SwigType_isclass(stripped)) return stripped; if (SwigType_ispointer(stripped) || SwigType_isreference(stripped)) { // Printf(stderr,"It is a pointer/reference. Is it a class?\n"); SwigType_pop(stripped); if (SwigType_isclass(stripped)) { return stripped; } } return 0; } String *lookup_defined_foreign_type(String *k) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Looking up defined type '%s'.\n Found: '%s'\n", k, Getattr(defined_foreign_types, k)); #endif return Getattr(defined_foreign_types, k); } String *listify_namespace(String *namespaze) { if (Len(namespaze) == 0) return NewString("()"); String *result = NewStringf("(\"%s\")", namespaze); Replaceall(result, "::", "\" \""); return result; } String *namespaced_name(Node *n, String *ns = current_namespace) { return NewStringf("%s%s%s", ns, (Len(ns) != 0) ? "::" : "", Getattr(n, "sym:name")); } // "Namespace::Nested::Class2::Baz" -> "Baz" static String *strip_namespaces(String *str) { return Swig_scopename_last(str); } void add_linked_type(Node *n) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Adding linked node of type: %s(%s) %s(%p)\n\n", nodeType(n), Getattr(n, "storage"), Getattr(n, "name"), n); // Swig_print_node(n); #endif if (!first_linked_type) { first_linked_type = n; Setattr(n, "allegrocl:last_linked_type", n); } else { Node *t = Getattr(first_linked_type, "allegrocl:last_linked_type"); Setattr(t, "allegrocl:next_linked_type", n); Setattr(first_linked_type, "allegrocl:last_linked_type", n); } } void replace_linked_type(Node *old, Node *new_node) { Node *prev = Getattr(old, "allegrocl:prev_linked_type"); Setattr(new_node, "allegrocl:next_linked_type", Getattr(old, "allegrocl:next_linked_type")); if (prev) Setattr(prev, "allegrocl:next_linked_type", new_node); Delattr(old, "allegrocl:next_linked_type"); Delattr(old, "allegrocl:prev_linked_type"); // check if we're replacing the first link. if (first_linked_type == old) { first_linked_type = new_node; Setattr(first_linked_type, "allegrocl:last_linked_type", Getattr(old, "allegrocl:last_linked_type")); } // check if we're replacing the last link. if (Getattr(first_linked_type, "allegrocl:last_linked_type") == old) Setattr(first_linked_type, "allegrocl:last_linked_type", new_node); } void insert_linked_type_at(Node *old, Node *new_node, int before = 1) { Node *p = 0; if (!first_linked_type) { add_linked_type(new_node); return; } if (!before) { Setattr(new_node, "allegrocl:next_linked_type", Getattr(old, "allegrocl:next_linked_type")); Setattr(old, "allegrocl:next_linked_type", new_node); if (Getattr(first_linked_type, "allegrocl:last_linked_type") == old) Setattr(first_linked_type, "allegrocl:last_linked_type", new_node); } else { Node *c = first_linked_type; while (c) { if (c == old) { break; } else { p = c; c = Getattr(c, "allegrocl:next_linked_type"); } } if (c == old) { Setattr(new_node, "allegrocl:next_linked_type", c); if (first_linked_type == c) { first_linked_type = new_node; Setattr(first_linked_type, "allegrocl:last_linked_type", Getattr(c, "allegrocl:last_linked_type")); Delattr(c, "allegrocl:last_linked_type"); } if (p) Setattr(p, "allegrocl:next_linked_type", new_node); } } } Node *find_linked_type_by_name(String *name) { Node *p = 0; Node *c = first_linked_type; // Printf(stderr,"in find_linked_type_by_name '%s'...", name); while (c) { String *key = Getattr(c, "name"); if (!Strcmp(key, name)) { break; } else { p = c; c = Getattr(c, "allegrocl:next_linked_type"); } } // Printf(stderr,"exit find_linked_type_by_name.\n"); if (p && c) Setattr(c, "allegrocl:prev_linked_type", p); // Printf(stderr,"find_linked_type_by_name: DONE\n"); return c; } Node *get_primary_synonym_of(Node *n) { Node *p = Getattr(n, "allegrocl:synonym-of"); Node *prim = n; // Printf(stderr, "getting primary synonym of %p\n", n); while (p) { // Printf(stderr, " found one! %p\n", p); prim = p; p = Getattr(p, "allegrocl:synonym-of"); } // Printf(stderr,"get_primary_syn: DONE. returning %s(%p)\n", Getattr(prim,"name"),prim); return prim; } void add_forward_referenced_type(Node *n, int overwrite = 0) { String *k = Getattr(n, "name"); String *name = Getattr(n, "sym:name"); String *ns = listify_namespace(current_namespace); String *val = Getattr(defined_foreign_types, k); if (!val || overwrite) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Adding forward reference for %s (overwrite=%d)\n", k, overwrite); #endif Setattr(defined_foreign_types, Copy(k), NewString("forward-reference")); String *mangled_lname_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", name, ns); Setattr(defined_foreign_ltypes, Copy(k), mangled_lname_gen); // Printf(f_cl, ";; forward reference stub\n" // "(swig-def-foreign-class \"%s\" (ff:foreign-pointer) (:class ))\n\n" // , name); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Linking forward reference type = %s(%p)\n", k, n); #endif add_linked_type(n); } } void add_defined_foreign_type(Node *n, int overwrite = 0, String *k = 0, String *name = 0, String *ns = current_namespace) { String *val; String *ns_list = listify_namespace(ns); String *templated = n ? Getattr(n, "template") : 0; String *cDeclName = n ? Getattr(n, "name") : 0; #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "IN A-D-F-T. (n=%p, ow=%d, k=%s, name=%s, ns=%s\n", n, overwrite, k, name, ns); Printf(stderr, " templated = '%p', classDecl = '%p'\n", templated, cDeclName); #endif if (n) { if (!name) name = Getattr(n, "sym:name"); if (!name) name = strip_namespaces(Getattr(n, "name")); if (templated) { k = namespaced_name(n); } else { String *kind_of_type = Getattr(n, "kind"); /* For typedefs of the form: typedef struct __xxx { ... } xxx; behavior differs between C mode and C++ mode. C Mode: add_defined_foreign_type will be called once via classHandler to define the type for 'struct __xxx' and add the mapping from 'struct __xxx' -> 'xxx' It will also be called once via typedefHandler to add the mapping 'xxx' -> 'xxx' C++ Mode: add_defined_foreign_type will be called once via classHandler to define the type for 'xxx'. it also adds the mapping from 'xxx' -> 'xxx' and also for 'struct xxx' -> 'xxx' In typedefHandler, we again try to add the mapping from 'xxx' -> 'xxx', which already exists. This second mapping is ignored. Both modes: All references to this typedef'd struct will appear in generated lisp code as an objectd of type 'xxx'. For non-typedef'd structs, the classHand mapping will be struct __xxx -> (swig-insert-id "__xxx") */ // Swig_print_node(n); String *unnamed = Getattr(n, "unnamed"); if (kind_of_type && (!Strcmp(kind_of_type, "struct") || !Strcmp(kind_of_type, "union")) && cDeclName && !unnamed) { k = NewStringf("%s %s", kind_of_type, cDeclName); } else { if (!Strcmp(nodeType(n), "enum") && unnamed) { name = NewStringf("%s%d", anon_type_name, anon_type_count++); k = NewStringf("enum %s", name); Setattr(n, "allegrocl:name", name); } else { k = k ? k : Getattr(n, "name"); } } } // Swig_print_node(n); } String *tname = SwigType_istemplate_templateprefix(name); if (tname) { String *temp = strip_namespaces(tname); name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name)); Delete(temp); Delete(tname); } val = lookup_defined_foreign_type(k); int is_fwd_ref = 0; if (val) is_fwd_ref = !Strcmp(val, "forward-reference"); if (!val || overwrite || is_fwd_ref) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Adding defined type '%s' = '%s' '%s' (overwrite=%d, in-class=%d)\n", k, ns, name, overwrite, in_class); #endif String *mangled_name_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :type)", name, ns_list); String *mangled_lname_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", name, ns_list); Setattr(defined_foreign_types, Copy(k), Copy(mangled_name_gen)); Setattr(defined_foreign_ltypes, Copy(k), Copy(mangled_lname_gen)); if (CPlusPlus) { bool cpp_struct = Strstr(k, "struct ") ? true : false; bool cpp_union = Strstr(k, "union ") ? true : false; String *cpp_type = 0; if (cpp_struct) { cpp_type = Copy(k); Replaceall(cpp_type, "struct ", ""); } else if (cpp_union) { cpp_type = Copy(k); Replaceall(cpp_type, "union ", ""); } if (cpp_struct || cpp_union) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " Also adding defined type '%s' = '%s' '%s' (overwrite=%d)\n", cpp_type, ns, name, overwrite); #endif Setattr(defined_foreign_types, Copy(cpp_type), Copy(mangled_name_gen)); Setattr(defined_foreign_ltypes, Copy(cpp_type), Copy(mangled_lname_gen)); } } #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "looking to add %s/%s(%p) to linked_type_list...\n", k, name, n); #endif if (is_fwd_ref) { // Printf(stderr,"*** 1\n"); if (n) add_linked_type(n); } else { // Printf(stderr,"*** 1-a\n"); if (SwigType_istemplate(k)) { SwigType *resolved = SwigType_typedef_resolve_all(k); // Printf(stderr,"*** 1-b\n"); Node *match = find_linked_type_by_name(resolved); Node *new_node = 0; // Printf(stderr, "*** temp-1\n"); if (n) { new_node = n; } else { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Creating a new templateInst:\n"); Printf(stderr, " name = %s\n", resolved); Printf(stderr, " sym:name = %s\n", name); Printf(stderr, " real-name = %s\n", k); Printf(stderr, " type = %s\n", resolved); Printf(stderr, " ns = %s\n\n", ns); #endif new_node = NewHash(); Setattr(new_node, "nodeType", "templateInst"); Setattr(new_node, "name", Copy(resolved)); Setattr(new_node, "sym:name", Copy(name)); Setattr(new_node, "real-name", Copy(k)); Setattr(new_node, "type", Copy(resolved)); Setattr(new_node, "allegrocl:namespace", ns); Setattr(new_node, "allegrocl:package", ns); } if (!match) { if (!Strcmp(nodeType(new_node), "templateInst") && in_class) { /* this is an implicit template instantiation found while walking a class. need to insert this into the linked_type list before the current class definition */ #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "trying to insert a templateInst before a class\n"); #endif insert_linked_type_at(in_class, new_node); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "DID IT!\n"); #endif } else { // Printf(stderr,"*** 3\n"); add_linked_type(new_node); } Setattr(new_node, "allegrocl:synonym:is-primary", "1"); } else { // a synonym type was found (held in variable 'match') // Printf(stderr, "setting primary synonym of %p to %p\n", new_node, match); if (new_node == match) Printf(stderr, "Hey-4 * - '%s' is a synonym of itself!\n", Getattr(new_node, "name")); Setattr(new_node, "allegrocl:synonym-of", match); // Printf(stderr,"*** 4\n"); add_linked_type(new_node); } } else { Node *match; if (!Strcmp(nodeType(n), "cdecl") && !Strcmp(Getattr(n, "storage"), "typedef")) { SwigType *type = SwigType_strip_qualifiers(Getattr(n, "type")); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Examining typedef '%s' for class references. (%d)\n", type, SwigType_isclass(type)); #endif if (SwigType_isclass(type)) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Found typedef of a class '%s'\n", type); #endif /* For the following parsed expression: typedef struct __xxx { ... } xxx; if n is of kind "class" (defining the class 'struct __xxx' then we add n to the linked type list. if n is "cdecl" node of storage "typedef" (to note that xxx is equivalent to 'struct __xxx' then we don't want to add this node to the linked type list. */ String *defined_type = lookup_defined_foreign_type(type); String *defined_key_type = lookup_defined_foreign_type(k); if ((Strstr(type, "struct ") || Strstr(type, "union ")) && defined_type && !Strcmp(defined_type, defined_key_type)) { // mark as a synonym but don't add to linked_type list // Printf(stderr,"*** 4.8\n"); Setattr(n, "allegrocl:synonym", "1"); } else { SwigType *lookup_type = SwigType_istemplate(type) ? SwigType_typedef_resolve_all(type) : Copy(type); match = find_linked_type_by_name(lookup_type); if (match) { Setattr(n, "allegrocl:synonym", "1"); Setattr(n, "allegrocl:synonym-of", match); Setattr(n, "real-name", Copy(lookup_type)); // Printf(stderr, "*** pre-5: found match of '%s'(%p)\n", Getattr(match,"name"),match); // if(n == match) Printf(stderr, "Hey-5 *** setting synonym of %p to %p\n", n, match); // Printf(stderr,"*** 5\n"); add_linked_type(n); } else { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Creating classfoward node for struct stub in typedef.\n"); #endif Node *new_node = NewHash(); String *symname = Copy(type); Replaceall(symname, "struct ", ""); Setattr(new_node, "nodeType", "classforward"); Setattr(new_node, "name", Copy(type)); Setattr(new_node, "sym:name", symname); Setattr(new_node, "allegrocl:namespace", ns); Setattr(new_node, "allegrocl:package", ns); String *mangled_new_name = NewStringf("#.(swig-insert-id \"%s\" %s)", symname, ns_list); String *mangled_new_lname = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", symname, ns_list); Setattr(defined_foreign_types, Copy(symname), Copy(mangled_new_name)); Setattr(defined_foreign_ltypes, Copy(symname), Copy(mangled_new_lname)); // Printf(stderr,"Weird! Can't find the type!\n"); add_forward_referenced_type(new_node); add_linked_type(new_node); Setattr(n, "allegrocl:synonym", "1"); Setattr(n, "allegrocl:synonym-of", new_node); add_linked_type(n); } Delete(lookup_type); } } else { // check if it's a pointer or reference to a class. // Printf(stderr,"Checking if '%s' is a p. or r. to a class\n", type); String *class_ref = class_from_class_or_class_ref(type); if (class_ref) { match = find_linked_type_by_name(class_ref); Setattr(n, "allegrocl:synonym", "1"); Setattr(n, "allegrocl:synonym-of", match); add_linked_type(n); } } Delete(type); // synonym types have already been added. // Printf(stderr,"*** 10\n"); if (!Getattr(n, "allegrocl:synonym")) add_linked_type(n); } else if (Getattr(n, "template")) { // Printf(stderr, "this is a class template node(%s)\n", nodeType(n)); String *resolved = SwigType_typedef_resolve_all(Getattr(n, "name")); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " looking up %s for linked type match with %s...\n", Getattr(n, "sym:name"), resolved); #endif match = find_linked_type_by_name(resolved); if (!match) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "found no implicit instantiation of %%template node %s(%p)\n", Getattr(n, "name"), n); #endif add_linked_type(n); } else { Node *primary = get_primary_synonym_of(match); Setattr(n, "allegrocl:synonym:is-primary", "1"); Delattr(primary, "allegrocl:synonym:is-primary"); if (n == match) Printf(stderr, "Hey-7 * setting synonym of %p to %p\n (match = %p)", primary, n, match); Setattr(primary, "allegrocl:synonym-of", n); // Printf(stderr,"*** 7\n"); add_linked_type(n); } } else { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "linking type '%s'(%p)\n", k, n); #endif // Printf(stderr,"*** 8\n"); add_linked_type(n); } } } Delete(mangled_name_gen); Delete(mangled_lname_gen); } else { if (!CPlusPlus || Strcmp(Getattr(n,"kind"),"typedef")) { Swig_warning(WARN_TYPE_REDEFINED, Getfile(n), Getline(n), "Attempting to store a foreign type that exists: %s (%s)\n", k, val); } } Delete(ns_list); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "OUT A-D-F-T\n"); #endif } void note_implicit_template_instantiation(SwigType *t) { // the namespace of the implicit instantiation is not necessarily // current_namespace. Attempt to cull this from the type. #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "culling namespace of '%s' from '%s'\n", t, SwigType_templateprefix(t)); #endif SwigType *type = Copy(t); SwigType *tok = SwigType_pop(type); String *implicit_ns = SwigType_istemplate(tok) ? Swig_scopename_prefix(SwigType_templateprefix(tok)) : 0; add_defined_foreign_type(0, 0, t, t, implicit_ns ? implicit_ns : current_namespace); Delete(type); } String *get_ffi_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { /* lookup defined foreign type. if it exists, it will return a form suitable for placing into lisp code to generate the def-foreign-type name */ #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "inside g_f_t: looking up '%s' '%s'\n", ty, name); #endif String *found_type = lookup_defined_foreign_type(ty); if (found_type) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "found_type '%s'\n", found_type); #endif return (Strcmp(found_type, "forward-reference") ? Copy(found_type) : get_ffi_type(n, fwdref_ffi_type, "")); } else { Node *node = NewHash(); Setattr(node, "type", ty); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("ffitype", node, name, 0); Delete(node); if (tm) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "g-f-t: found ffitype typemap '%s'\n", tm); #endif return NewString(tm); } if (SwigType_istemplate(ty)) { note_implicit_template_instantiation(ty); return Copy(lookup_defined_foreign_type(ty)); } } return 0; } String *lookup_defined_foreign_ltype(String *l) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Looking up defined ltype '%s'.\n Found: '%s'\n", l, Getattr(defined_foreign_ltypes, l)); #endif return Getattr(defined_foreign_ltypes, l); } /* walk type and return string containing lisp version. recursive. */ String *internal_compose_foreign_type(Node *n, SwigType *ty) { SwigType *tok; String *ffiType = NewString(""); // for a function type, need to walk the parm list. while (Len(ty) != 0) { tok = SwigType_pop(ty); if (SwigType_isfunction(tok)) { // Generate Function wrapper Printf(ffiType, "(:function "); // walk parm list List *pl = SwigType_parmlist(tok); Printf(ffiType, "("); // start parm list for (Iterator i = First(pl); i.item; i = Next(i)) { SwigType *f_arg = SwigType_strip_qualifiers(i.item); Printf(ffiType, "%s ", internal_compose_foreign_type(n, f_arg)); Delete(f_arg); } Printf(ffiType, ")"); // end parm list. // do function return type. Printf(ffiType, " %s)", internal_compose_foreign_type(n, ty)); break; } else if (SwigType_ispointer(tok) || SwigType_isreference(tok)) { Printf(ffiType, "(* %s)", internal_compose_foreign_type(n, ty)); } else if (SwigType_isarray(tok)) { Printf(ffiType, "(:array %s", internal_compose_foreign_type(n, ty)); String *atype = NewString("int"); String *dim = convert_literal(SwigType_array_getdim(tok, 0), atype); Delete(atype); if (is_integer(dim)) { Printf(ffiType, " %s)", dim); } else { Printf(ffiType, " #| %s |#)", SwigType_array_getdim(tok, 0)); } } else if (SwigType_ismemberpointer(tok)) { // temp Printf(ffiType, "(* %s)", internal_compose_foreign_type(n, ty)); } else { String *res = get_ffi_type(n, tok, ""); if (res) { Printf(ffiType, "%s", res); } else { SwigType *resolved_type = SwigType_typedef_resolve_all(tok); if (Cmp(resolved_type, tok) != 0) { res = get_ffi_type(n, resolved_type, ""); if (res) { } else { res = internal_compose_foreign_type(n, resolved_type); } if (res) Printf(ffiType, "%s", res); } if (!res) { String *is_struct = 0; String *tok_remove_text = 0; String *tok_name = Copy(tok); String *tok_key = SwigType_str(tok,0); if ((is_struct = Strstr(tok_key, "struct ")) || Strstr(tok_key, "union ")) { tok_remove_text = NewString(is_struct ? "struct " : "union "); } /* be more permissive of opaque types. This is the swig way. compiles will notice if these types are ultimately not present. */ if(tok_remove_text) { Replaceall(tok_name,tok_remove_text,""); } tok_name = strip_namespaces(tok_name); Delete(tok_remove_text); // Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(tok), Getline(tok), "Unable to find definition of '%s', assuming forward reference.\n", tok); #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "i-c-f-t: adding forward reference for unknown type '%s'. mapping: %s -> %s\n", tok, tok_key, tok_name); #endif Node *nn = NewHash(); Setattr(nn,"nodeType","classforward"); Setattr(nn,"kind","class"); Setattr(nn,"sym:name",tok_name); Setattr(nn,"name",tok_key); Setattr(nn,"allegrocl:package",current_namespace); add_forward_referenced_type(nn, 0); // tok_name is dangling here, unused. ouch. why? Printf(ffiType, "%s", get_ffi_type(n, tok, ""), tok_name); } } } } return ffiType; } String *compose_foreign_type(Node *n, SwigType *ty, String * /*id*/ = 0) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "compose_foreign_type: ENTER (%s)...\n ", ty); // Printf(stderr, "compose_foreign_type: ENTER (%s)(%s)...\n ", ty, (id ? id : 0)); /* String *id_ref = SwigType_str(ty, id); Printf(stderr, "looking up typemap for %s, found '%s'(%p)\n", id_ref, lookup_res ? Getattr(lookup_res, "code") : 0, lookup_res); if (lookup_res) Swig_print_node(lookup_res); */ #endif /* should we allow named lookups in the typemap here? YES! */ /* unnamed lookups should be found in get_ffi_type, called by internal_compose_foreign_type(), below. */ /* I'm reverting to 'no' for the question above. I can no longer remember why I needed it. If a user needed it, I'll find out as soon as they upgrade. Sigh. -mutandiz 9/16/2008. */ /* if(id && lookup_res) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "compose_foreign_type: EXIT-1 (%s)\n ", Getattr(lookup_res, "code")); #endif return NewString(Getattr(lookup_res, "code")); } */ SwigType *temp = SwigType_strip_qualifiers(ty); String *res = internal_compose_foreign_type(n, temp); Delete(temp); #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "compose_foreign_type: EXIT (%s)\n ", res); #endif return res; } void update_package_if_needed(Node *n, File *f = f_clwrap) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "update_package: ENTER... \n"); Printf(stderr, " current_package = '%s'\n", current_package); Printf(stderr, " node_package = '%s'\n", Getattr(n, "allegrocl:package")); Printf(stderr, " node(%p) = '%s'\n", n, Getattr(n, "name")); #endif String *node_package = Getattr(n, "allegrocl:package"); if (Strcmp(current_package, node_package)) { String *lispy_package = listify_namespace(node_package); Delete(current_package); current_package = Copy(node_package); Printf(f, "\n(swig-in-package %s)\n", lispy_package); Delete(lispy_package); } #ifdef ALLEGROCL_DEBUG Printf(stderr, "update_package: EXIT.\n"); #endif } static String *mangle_name(Node *n, char const *prefix = "ACL", String *ns = current_namespace) { String *suffix = Getattr(n, "sym:overname"); String *pre_mangled_name = NewStringf("%s_%s__%s%s", prefix, ns, Getattr(n, "sym:name"), suffix); String *mangled_name = Swig_name_mangle(pre_mangled_name); Delete(pre_mangled_name); return mangled_name; } /* utilities */ /* remove a pointer from ffitype. non-destructive. (* :char) ==> :char (* (:array :int 30)) ==> (:array :int 30) */ String *dereference_ffitype(String *ffitype) { char *start; char *temp = Char(ffitype); String *reduced_type = 0; if(temp && temp[0] == '(' && temp[1] == '*') { temp += 2; // walk past start of pointer references while(*temp == ' ') temp++; start = temp; // temp = Char(reduced_type); reduced_type = NewString(start); temp = Char(reduced_type); // walk to end of string. remove closing paren while(*temp != '\0') temp++; *(--temp) = '\0'; } return reduced_type ? reduced_type : Copy(ffitype); } /* returns new string w/ parens stripped */ String *strip_parens(String *string) { string = Copy(string); Replaceall(string, "(", ""); Replaceall(string, ")", ""); return string; } int ALLEGROCL::validIdentifier(String *s) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "validIdentifier %s\n", s); #endif char *c = Char(s); bool got_dot = false; bool only_dots = true; /* Check that s is a valid common lisp symbol. There's a lot of leeway here. A common lisp symbol is essentially any token that's not a number and does not consist of only dots. We are expressly not allowing spaces in identifiers here, but spaces could be added via the identifier converter. */ while (*c) { if (*c == '.') { got_dot = true; } else { only_dots = false; } if (!isgraph(*c)) return 0; c++; } return (got_dot && only_dots) ? 0 : 1; } String *infix_to_prefix(String *val, char split_op, const String *op, String *type) { List *ored = Split(val, split_op, -1); // some float hackery if (((split_op == '+') || (split_op == '-')) && Len(ored) == 2 && (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || SwigType_type(type) == T_LONGDOUBLE)) { // check that we're not splitting a float String *possible_result = convert_literal(val, type, false); if (possible_result) return possible_result; } // try parsing the split results. if any part fails, kick out. bool part_failed = false; if (Len(ored) > 1) { String *result = NewStringf("(%s", op); for (Iterator i = First(ored); i.item; i = Next(i)) { String *converted = convert_literal(i.item, type); if (converted) { Printf(result, " %s", converted); Delete(converted); } else { part_failed = true; break; } } Printf(result, ")"); Delete(ored); return part_failed ? 0 : result; } Delete(ored); return 0; } /* To be called by code generating the lisp interface Will return a containing the literal based on type. Will return null if there are problems. try_to_split defaults to true (see stub above). */ String *convert_literal(String *literal, String *type, bool try_to_split) { String *num_param = Copy(literal); String *trimmed = trim(num_param); String *num = strip_parens(trimmed), *res = 0; char *s = Char(num); String *ns = listify_namespace(current_namespace); // very basic parsing of infix expressions. if (try_to_split && SwigType_type(type) != T_STRING) { if ((res = infix_to_prefix(num, '|', "logior", type))) return res; if ((res = infix_to_prefix(num, '&', "logand", type))) return res; if ((res = infix_to_prefix(num, '^', "logxor", type))) return res; if ((res = infix_to_prefix(num, '*', "*", type))) return res; if ((res = infix_to_prefix(num, '/', "/", type))) return res; if ((res = infix_to_prefix(num, '+', "+", type))) return res; if ((res = infix_to_prefix(num, '-', "-", type))) return res; // if ((res = infix_to_prefix(num, '~', "lognot", type))) return res; // if( (res = infix_to_prefix(num, '<<', "ash", type)) ) return res; } // unary complement... if (s[0] == '~' && Len(num) >= 2) { String *id = NewString(++s); String *id_conv = convert_literal(id, type, false); Delete(id); if (id_conv) return NewStringf("(lognot %s)", id_conv); s--; } if (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || SwigType_type(type) == T_LONGDOUBLE) { // Use CL syntax for float literals String *oldnum = Copy(num); // careful. may be a float identifier or float constant. char *num_start = Char(num); char *num_end = num_start + strlen(num_start) - 1; bool is_literal = isdigit(*num_start) || (*num_start == '.'); String *lisp_exp = 0; if (is_literal) { if (*num_end == 'f' || *num_end == 'F') { lisp_exp = NewString("f"); } else { lisp_exp = NewString("d"); } if (*num_end == 'l' || *num_end == 'L' || *num_end == 'f' || *num_end == 'F') { *num_end = '\0'; num_end--; } int exponents = Replaceall(num, "e", lisp_exp) + Replaceall(num, "E", lisp_exp); if (!exponents) Printf(num, "%s0", lisp_exp); if (exponents > 1 || (exponents + Replaceall(num, ".", ".") == 0)) { // Printf(stderr, "Can't parse '%s' as type '%s'.\n", oldnum, type); Delete(num); num = 0; } Delete(lisp_exp); } else { String *id = NewStringf("#.(swig-insert-id \"%s\" %s :type :constant)", num, ns); Delete(num); num = id; } Delete(oldnum); Delete(trimmed); Delete(ns); return num; } else if (SwigType_type(type) == T_CHAR) { /* Use CL syntax for character literals */ Delete(num); Delete(trimmed); return NewStringf("#\\%s", num_param); } else if (SwigType_type(type) == T_STRING) { /* Use CL syntax for string literals */ Delete(num); Delete(trimmed); return NewStringf("\"%s\"", num_param); } else if (Len(num) >= 1 && (isdigit(s[0]) || s[0] == '+' || s[0] == '-')) { /* use CL syntax for numbers */ String *oldnum = Copy(num); int usuffixes = Replaceall(num, "u", "") + Replaceall(num, "U", ""); int lsuffixes = Replaceall(num, "l", "") + Replaceall(num, "L", ""); if (usuffixes > 1 || lsuffixes > 1) { Printf(stderr, "Weird!! number %s looks invalid.\n", oldnum); SWIG_exit(EXIT_FAILURE); } s = Char(num); if (s[0] == '0' && Len(num) >= 2) { /*octal or hex */ res = NewStringf("#%c%s", tolower(s[1]) == 'x' ? 'x' : 'o', s + 2); Delete(num); } else { res = num; } Delete(oldnum); Delete(trimmed); return res; } else if (allegrocl->validIdentifier(num)) { /* convert C/C++ identifiers to CL symbols */ res = NewStringf("#.(swig-insert-id \"%s\" %s :type :constant)", num, ns); Delete(num); Delete(trimmed); Delete(ns); return res; } else { Delete(trimmed); return num; } } void emit_stub_class(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_stub_class: ENTER... '%s'(%p)\n", Getattr(n, "sym:name"), n); Swig_print_node(n); #endif String *name = Getattr(n, "sym:name"); if (Getattr(n, "allegrocl:synonym:already-been-stubbed")) return; String *tname = SwigType_istemplate_templateprefix(name); if (tname) { String *temp = strip_namespaces(tname); name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name)); Delete(temp); Delete(tname); } else { name = strip_namespaces(name); } // Printf(f_clhead, ";; from emit-stub-class\n"); update_package_if_needed(n, f_clhead); Printf(f_clhead, ";; class template stub.\n"); Printf(f_clhead, "(swig-def-foreign-stub \"%s\")\n", name); Setattr(n, "allegrocl:synonym:already-been-stubbed", "1"); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_stub_class: EXIT\n"); #endif } void emit_synonym(Node *synonym) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_synonym: ENTER... \n"); #endif // Printf(stderr,"in emit_synonym for %s(%p)\n", Getattr(synonym,"name"),synonym); int is_tempInst = !Strcmp(nodeType(synonym), "templateInst"); String *synonym_type; Node *of = get_primary_synonym_of(synonym); if (is_tempInst) { // Printf(stderr, "*** using real-name '%s'\n", Getattr(synonym,"real-name")); synonym_type = Getattr(synonym, "real-name"); } else { // Printf(stderr, "*** using name '%s'\n", Getattr(synonym,"name")); synonym_type = Getattr(synonym, "name"); } String *synonym_ns = listify_namespace(Getattr(synonym, "allegrocl:namespace")); String *syn_ltype, *syn_type, *of_ltype; // String *of_cdeclname = Getattr(of,"allegrocl:classDeclarationName"); String *of_ns = Getattr(of, "allegrocl:namespace"); String *of_ns_list = listify_namespace(of_ns); // String *of_name = of_cdeclname ? NewStringf("struct %s", Getattr(of,"name")) : NewStringf("%s::%s", of_ns, Getattr(of,"sym:name")); // String *of_name = NewStringf("%s::%s", of_ns, Getattr(of,"sym:name")); String *of_name = namespaced_name(of, of_ns); if (CPlusPlus && !Strcmp(nodeType(synonym), "cdecl")) { String *real_name = Getattr(synonym, "real-name"); if (!real_name) real_name = NewString("Unknown"); // TODO: fix syn_ltype = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", strip_namespaces(real_name), synonym_ns); syn_type = NewStringf("#.(swig-insert-id \"%s\" %s :type :type)", strip_namespaces(real_name), synonym_ns); } else { syn_ltype = lookup_defined_foreign_ltype(synonym_type); syn_type = lookup_defined_foreign_type(synonym_type); } of_ltype = lookup_defined_foreign_ltype(of_name); // Printf(stderr,";; from emit-synonym syn='%s' of_ltype='%s'\n", syn_ltype, of_ltype); if( of_ltype ) Printf(f_clhead, "(swig-def-synonym-type %s\n %s\n %s)\n", syn_ltype, of_ltype, syn_type); Delete(synonym_ns); Delete(of_ns_list); Delete(of_name); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_synonym: EXIT\n"); #endif } void emit_full_class(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_full_class: ENTER... \n"); #endif String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); // Printf(stderr,"in emit_full_class: '%s'(%p).", Getattr(n,"name"),n); if (Getattr(n, "allegrocl:synonym-of")) { // Printf(stderr,"but it's a synonym of something.\n"); update_package_if_needed(n, f_clhead); emit_synonym(n); return; } // collect superclasses String *bases = Getattr(n, "bases"); String *supers = NewString("("); if (bases) { int first = 1; for (Iterator i = First(bases); i.item; i = Next(i)) { if (!first) Printf(supers, " "); String *s = lookup_defined_foreign_ltype(Getattr(i.item, "name")); // String *name = Getattr(i.item,"name"); if (s) { Printf(supers, "%s", s); } else { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "emit_templ_inst: did not find ltype for base class %s (%s)", Getattr(i.item, "name"), Getattr(n, "allegrocl:namespace")); #endif } } } else { Printf(supers, "ff:foreign-pointer"); } // check for "feature:aclmixins" and add those as well. Printf(supers, " %s)", Getattr(n,"feature:aclmixins")); // Walk children to generate type definition. String *slotdefs = NewString(" "); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, " walking children...\n"); #endif Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { String *storage_type = Getattr(c, "storage"); if ((!Strcmp(nodeType(c), "cdecl") && (!storage_type || Strcmp(storage_type, "typedef")))) { String *access = Getattr(c, "access"); // hack. why would decl have a value of "variableHandler" and now "0"? String *childDecl = Getattr(c, "decl"); // Printf(stderr,"childDecl = '%s' (%s)\n", childDecl, Getattr(c,"view")); if (!childDecl || !Strcmp(childDecl, "0")) childDecl = NewString(""); SwigType *childType; String *cname; // don't include types for private slots (yet). spr33959. if(access && Strcmp(access,"public")) { childType = NewStringf("int"); cname = NewString("nil"); } else { childType = NewStringf("%s%s", childDecl, Getattr(c, "type")); cname = Copy(Getattr(c, "name")); } if (!SwigType_isfunction(childType)) { // Printf(slotdefs, ";;; member functions don't appear as slots.\n "); // Printf(slotdefs, ";; "); String *ns = listify_namespace(Getattr(n, "allegrocl:package")); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "slot name = '%s' ns = '%s' class-of '%s' and type = '%s'\n", cname, ns, name, childType); #endif Printf(slotdefs, "(#.(swig-insert-id \"%s\" %s :type :slot :class \"%s\") %s)", cname, ns, name, compose_foreign_type(n, childType)); Delete(ns); if (access && Strcmp(access, "public")) Printf(slotdefs, " ;; %s member", access); Printf(slotdefs, "\n "); } Delete(childType); Delete(cname); } } String *ns_list = listify_namespace(Getattr(n, "allegrocl:namespace")); update_package_if_needed(n, f_clhead); Printf(f_clhead, "(swig-def-foreign-class \"%s\"\n %s\n (:%s\n%s))\n\n", name, supers, kind, slotdefs); Delete(supers); Delete(ns_list); Setattr(n, "allegrocl:synonym:already-been-stubbed", "1"); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_full_class: EXIT\n"); #endif } void emit_class(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_class: ENTER... '%s'(%p)\n", Getattr(n, "sym:name"), n); #endif int is_tempInst = !Strcmp(nodeType(n), "templateInst"); String *ns_list = listify_namespace(Getattr(n, "allegrocl:namespace")); String *name = Getattr(n, is_tempInst ? "real-name" : "name"); String *tname = SwigType_istemplate_templateprefix(name); if (tname) { String *temp = strip_namespaces(tname); name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name)); Delete(temp); Delete(tname); } else { name = strip_namespaces(name); } if (Getattr(n, "allegrocl:synonym:is-primary")) { // Printf(stderr," is primary... "); if (is_tempInst) { emit_stub_class(n); } else { emit_full_class(n); } } else { // Node *primary = Getattr(n,"allegrocl:synonym-of"); Node *primary = get_primary_synonym_of(n); if (primary && (primary != n)) { // Printf(stderr," emitting synonym... "); emit_stub_class(primary); update_package_if_needed(n, f_clhead); emit_synonym(n); } else { emit_full_class(n); } } // Printf(stderr,"DONE\n"); Delete(name); Delete(ns_list); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_class: EXIT\n"); #endif } void emit_typedef(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_typedef: ENTER... \n"); #endif String *name; String *sym_name = Getattr(n, "sym:name"); String *type = NewStringf("%s%s", Getattr(n, "decl"), Getattr(n, "type")); String *lisp_type = compose_foreign_type(n, type); Delete(type); Node *in_class = Getattr(n, "allegrocl:typedef:in-class"); // Printf(stderr,"in emit_typedef: '%s'(%p).",Getattr(n,"name"),n); if (Getattr(n, "allegrocl:synonym-of")) { // Printf(stderr," but it's a synonym of something.\n"); emit_synonym(n); return; } if (in_class) { String *class_name = Getattr(in_class, "name"); String *tname = SwigType_istemplate_templateprefix(class_name); if (tname) { String *temp = strip_namespaces(tname); class_name = NewStringf("%s%s%s", temp, SwigType_templateargs(class_name), SwigType_templatesuffix(class_name)); Delete(temp); Delete(tname); } name = NewStringf("%s__%s", class_name, sym_name); Setattr(n, "allegrocl:in-class", in_class); } else { name = sym_name ? Copy(sym_name) : Copy(Getattr(n, "name")); } // leave these in for now. might want to change these to def-foreign-class at some point. // Printf(f_clhead, ";; %s\n", SwigType_typedef_resolve_all(lisp_type)); Printf(f_clhead, "(swig-def-foreign-type \"%s\"\n %s)\n", name, lisp_type); Delete(name); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_typedef: EXIT\n"); #endif } void emit_enum_type_no_wrap(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_enum_type_no_wrap: ENTER... \n"); #endif String *unnamed = Getattr(n, "unnamed"); String *name; // SwigType *enumtype; name = unnamed ? Getattr(n, "allegrocl:name") : Getattr(n, "sym:name"); SwigType *tmp = NewStringf("enum %s", unnamed ? unnamed : name); Node *node = NewHash(); Setattr(node, "type", tmp); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *enumtype = Swig_typemap_lookup("ffitype", node, "", 0); Delete(node); Delete(tmp); if (name) { String *ns = listify_namespace(current_namespace); Printf(f_clhead, "(swig-def-foreign-type \"%s\" %s)\n", name, enumtype); Delete(ns); // walk children. Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { if (!Getattr(c, "error")) { String *val = Getattr(c, "enumvalue"); if (!val) val = Getattr(c, "enumvalueex"); String *converted_val = convert_literal(val, Getattr(c, "type")); String *valname = Getattr(c, "sym:name"); if (converted_val) { Printf(f_clhead, "(swig-defconstant \"%s\" %s)\n", valname, converted_val); Delete(converted_val); } else { Swig_warning(WARN_LANG_DISCARD_CONST, Getfile(n), Getline(n), "Unable to parse enum value '%s'. Setting to NIL\n", val); Printf(f_clhead, "(swig-defconstant \"%s\" nil #| %s |#)\n", valname, val); } } } } Printf(f_clhead, "\n"); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_enum_type_no_wrap: EXIT\n"); #endif } void emit_enum_type(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_enum_type: ENTER... \n"); #endif if (!Generate_Wrapper) { emit_enum_type_no_wrap(n); return; } String *unnamed = Getattr(n, "unnamed"); String *name; // SwigType *enumtype; name = unnamed ? Getattr(n, "allegrocl:name") : Getattr(n, "sym:name"); SwigType *tmp = NewStringf("enum %s", unnamed ? unnamed : name); Node *node = NewHash(); Setattr(node, "type", tmp); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *enumtype = Swig_typemap_lookup("ffitype", node, "", 0); Delete(node); Delete(tmp); if (name) { String *ns = listify_namespace(current_namespace); Printf(f_clhead, "(swig-def-foreign-type \"%s\" %s)\n", name, enumtype); Delete(ns); // walk children. Node *c; for(c = firstChild(n); c; c=nextSibling(c)) { String *mangled_name = mangle_name(c, "ACL_ENUM", Getattr(c,"allegrocl:package")); Printf(f_clhead, "(swig-defvar \"%s\" \"%s\" :type :constant :ftype :signed-long)\n", Getattr(c, "sym:name"), mangled_name); Delete(mangled_name); } } #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_enum_type: EXIT\n"); #endif } void emit_default_linked_type(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_default_linked_type: ENTER... \n"); #endif // catchall for non class types. if (!Strcmp(nodeType(n), "classforward")) { Printf(f_clhead, ";; forward referenced stub.\n"); Printf(f_clhead, "(swig-def-foreign-class \"%s\" (ff:foreign-pointer) (:class ))\n\n", Getattr(n, "sym:name")); } else if (!Strcmp(nodeType(n), "enum")) { emit_enum_type(n); } else { Printf(stderr, "Don't know how to emit node type '%s' named '%s'\n", nodeType(n), Getattr(n, "name")); } #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_default_linked_type: EXIT\n"); #endif } void dump_linked_types(File *f) { Node *n = first_linked_type; int i = 0; while (n) { Printf(f, "%d: (%p) node '%s' name '%s'\n", i++, n, nodeType(n), Getattr(n, "sym:name")); Node *t = Getattr(n, "allegrocl:synonym-of"); if (t) Printf(f, " synonym-of %s(%p)\n", Getattr(t, "name"), t); n = Getattr(n, "allegrocl:next_linked_type"); } } void emit_linked_types() { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_linked_types: ENTER... "); #endif Node *n = first_linked_type; while (n) { String *node_type = nodeType(n); // Printf(stderr,"emitting node %s(%p) of type %s.", Getattr(n,"name"),n, nodeType(n)); if (!Strcmp(node_type, "class") || !Strcmp(node_type, "templateInst")) { // may need to emit a stub, so it will update the package itself. // Printf(stderr," Passing to emit_class."); emit_class(n); } else if (!Strcmp(nodeType(n), "cdecl")) { // Printf(stderr," Passing to emit_typedef."); update_package_if_needed(n, f_clhead); emit_typedef(n); } else { // Printf(stderr," Passing to default_emitter."); update_package_if_needed(n, f_clhead); emit_default_linked_type(n); } n = Getattr(n, "allegrocl:next_linked_type"); // Printf(stderr,"returned.\n"); } #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_linked_types: EXIT\n"); #endif } extern "C" Language *swig_allegrocl(void) { return (allegrocl = new ALLEGROCL()); } void ALLEGROCL::main(int argc, char *argv[]) { int i; Preprocessor_define("SWIGALLEGROCL 1", 0); SWIG_library_directory("allegrocl"); SWIG_config_file("allegrocl.swg"); for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-identifier-converter")) { char *conv = argv[i + 1]; if (!conv) Swig_arg_error(); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; /* check for built-ins */ if (!strcmp(conv, "lispify")) { Delete(identifier_converter); identifier_converter = NewString("identifier-convert-lispify"); } else if (!strcmp(conv, "null")) { Delete(identifier_converter); identifier_converter = NewString("identifier-convert-null"); } else { /* Must be user defined */ Delete(identifier_converter); identifier_converter = NewString(conv); } } else if (!strcmp(argv[i], "-cwrap")) { CWrap = true; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-nocwrap")) { CWrap = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-isolate")) { unique_swig_package = true; Swig_mark_arg(i); } if (!strcmp(argv[i], "-help")) { Printf(stdout, "%s\n", usage); } } allow_overloading(); } int ALLEGROCL::top(Node *n) { module_name = Getattr(n, "name"); String *cxx_filename = Getattr(n, "outfile"); String *cl_filename = NewString(""); swig_package = unique_swig_package ? NewStringf("swig.%s", module_name) : NewString("swig"); Printf(cl_filename, "%s%s.cl", SWIG_output_directory(), module_name); f_cl = NewFile(cl_filename, "w", SWIG_output_files()); if (!f_cl) { Printf(stderr, "Unable to open %s for writing\n", cl_filename); SWIG_exit(EXIT_FAILURE); } Generate_Wrapper = CPlusPlus || CWrap; if (Generate_Wrapper) { f_begin = NewFile(cxx_filename, "w", SWIG_output_files()); if (!f_begin) { Delete(f_cl); Printf(stderr, "Unable to open %s for writing\n", cxx_filename); SWIG_exit(EXIT_FAILURE); } } else f_begin = NewString(""); f_runtime = NewString(""); f_cxx_header = f_runtime; f_cxx_wrapper = NewString(""); Swig_register_filebyname("header", f_cxx_header); Swig_register_filebyname("wrapper", f_cxx_wrapper); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("lisp", f_clwrap); Swig_register_filebyname("lisphead", f_cl); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGALLEGROCL\n#define SWIGALLEGROCL\n#endif\n\n"); Swig_banner_target_lang(f_cl, ";;"); Printf(f_cl, "\n" "(defpackage :%s\n" " (:use :common-lisp :ff :excl)\n" " (:export #:*swig-identifier-converter* #:*swig-module-name*\n" " #:*void* #:*swig-export-list*))\n" "(in-package :%s)\n\n" "(eval-when (:compile-toplevel :load-toplevel :execute)\n" " (defparameter *swig-identifier-converter* '%s)\n" " (defparameter *swig-module-name* :%s))\n\n", swig_package, swig_package, identifier_converter, module_name); Printf(f_cl, "(defpackage :%s\n" " (:use :common-lisp :%s :ff :excl))\n\n", module_name, swig_package); Printf(f_clhead, "(in-package :%s)\n", module_name); Language::top(n); #ifdef ALLEGROCL_TYPE_DEBUG dump_linked_types(stderr); #endif emit_linked_types(); Printf(f_clwrap, "\n(cl::in-package :%s)\n", swig_package); Printf(f_clwrap, "\n(macrolet ((swig-do-export ()\n"); Printf(f_clwrap, " `(dolist (s ',*swig-export-list*)\n"); Printf(f_clwrap, " (apply #'export s))))\n"); Printf(f_clwrap, " (swig-do-export))\n"); Printf(f_clwrap, "\n(setq *swig-export-list* nil)\n"); Printf(f_cl, "%s\n", f_clhead); Printf(f_cl, "%s\n", f_clwrap); Delete(f_cl); Delete(f_clhead); Delete(f_clwrap); Dump(f_runtime, f_begin); Printf(f_begin, "%s\n", f_cxx_wrapper); Delete(f_runtime); Delete(f_begin); Delete(f_cxx_wrapper); // Swig_print_tree(n); return SWIG_OK; } int any_varargs(ParmList *pl) { Parm *p; for (p = pl; p; p = nextSibling(p)) { if (SwigType_isvarargs(Getattr(p, "type"))) return 1; } return 0; } String *get_lisp_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { Node *node = NewHash(); Setattr(node, "type", ty); Setattr(node, "name", name); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("lisptype", node, "", 0); Delete(node); return tm ? NewString(tm) : NewString(""); } Node *parent_node_skipping_extends(Node *n) { Node *result = n; do { result = parentNode(result); } while (Cmp("extend", nodeType(result)) == 0); return result; } /* ----------------------------------------------------------------------------- * emit_num_lin_arguments() * * Calculate the total number of arguments. This function is safe for use * with multi-argument typemaps which may change the number of arguments in * strange ways. * ----------------------------------------------------------------------------- */ int emit_num_lin_arguments(ParmList *parms) { Parm *p = parms; int nargs = 0; while (p) { // Printf(stderr,"enla: '%s' lin='%p' numinputs='%s'\n", Getattr(p,"name"), Getattr(p,"tmap:lin"), Getattr(p,"tmap:lin:numinputs")); if (Getattr(p, "tmap:lin")) { nargs += GetInt(p, "tmap:lin:numinputs"); p = Getattr(p, "tmap:lin:next"); } else { p = nextSibling(p); } } /* DB 04/02/2003: Not sure this is necessary with tmap:in:numinputs */ /* if (parms && (p = Getattr(parms,"emit:varargs"))) { if (!nextSibling(p)) { nargs--; } } */ return nargs; } String *id_converter_type(SwigType const *type) { SwigType *t = Copy(type); String *result = 0; if (SwigType_ispointer(t)) { SwigType_pop(t); String *pointee = id_converter_type(t); result = NewStringf("(:* %s)", pointee); Delete(pointee); } else if (SwigType_ismemberpointer(t)) { String *klass = SwigType_parm(t); SwigType_pop(t); String *member = id_converter_type(t); result = NewStringf("(:member \"%s\" %s)", klass, member); Delete(klass); Delete(member); } else if (SwigType_isreference(t)) { SwigType_pop(t); String *referencee = id_converter_type(t); result = NewStringf("(:& %s)", referencee); Delete(referencee); } else if (SwigType_isarray(t)) { String *size = SwigType_parm(t); SwigType_pop(t); String *element_type = id_converter_type(t); result = NewStringf("(:array %s \"%s\")", element_type, size); Delete(size); Delete(element_type); } else if (SwigType_isfunction(t)) { result = NewString("(:function ("); String *parmlist_str = SwigType_parm(t); List *parms = SwigType_parmlist(parmlist_str); for (Iterator i = First(parms); i.item;) { String *parm = id_converter_type((SwigType *) i.item); Printf(result, "%s", parm); i = Next(i); if (i.item) Printf(result, " "); Delete(parm); } SwigType_pop(t); String *ret = id_converter_type(t); Printf(result, ") %s)", ret); Delete(parmlist_str); Delete(parms); Delete(ret); } else if (SwigType_isqualifier(t)) { result = NewString("(:qualified ("); String *qualifiers_str = Copy(SwigType_parm(t)); // ?! // Replaceall below SEGVs if we don't put the Copy here... SwigType_pop(t); String *qualifiee = id_converter_type(t); Replaceall(qualifiers_str, " ", " :"); if (Len(qualifiers_str) > 0) Printf(result, ":"); Printf(result, "%s) %s)", qualifiers_str, qualifiee); Delete(qualifiers_str); Delete(qualifiee); } else if (SwigType_istemplate(t)) { result = NewStringf("(:template \"%s\")", t); } else { /* if (SwigType_issimple(t)) */ if (Strstr(Char(t), "::")) { result = listify_namespace(t); } else { result = NewStringf("\"%s\"", t); } } Delete(t); return result; } static ParmList *parmlist_with_names(ParmList *pl) { ParmList *pl2 = CopyParmList(pl); for (Parm *p = pl, *p2 = pl2; p2; p = nextSibling(p), p2 = nextSibling(p2)) { if (!Getattr(p2, "name")) Setattr(p2, "name", Getattr(p2, "lname")); Setattr(p2, "name", strip_namespaces(Getattr(p2, "name"))); Setattr(p2, "tmap:ctype", Getattr(p, "tmap:ctype")); String *temp = Getattr(p, "tmap:lin"); if (temp) { Setattr(p2, "tmap:lin", temp); Setattr(p2, "tmap:lin:next", Getattr(p, "tmap:lin:next")); } } return pl2; } static String *parmlist_str_id_converter(ParmList *pl) { String *result = NewString(""); for (Parm *p = pl; p;) { String *lispy_type = id_converter_type(Getattr(p, "type")); Printf(result, "(\"%s\" %s)", Getattr(p, "name"), lispy_type); Delete(lispy_type); if ((p = nextSibling(p))) Printf(result, " "); } return result; } String *collect_others_args(Node *overload) { String *overloaded_from = Getattr(overload, "sym:overloaded"); String *others_args = NewString(""); int first_overload = 1; for (Node *overload2 = overloaded_from; overload2; overload2 = Getattr(overload2, "sym:nextSibling")) { if (overload2 == overload || GetInt(overload2, "overload:ignore")) continue; ParmList *opl = parmlist_with_names(Getattr(overload2, "wrap:parms")); String *args = parmlist_str_id_converter(opl); if (!first_overload) Printf(others_args, "\n "); Printf(others_args, "(%s)", args); Delete(args); Delete(opl); first_overload = 0; } return others_args; } struct IDargs { String *name; String *type; String *klass; String *arity; IDargs():name(0), type(0), klass(0), arity(0) { } String *full_quoted_str() { String *result = no_others_quoted_str(); if (arity) Printf(result, " :arity %s", arity); return result; } String *no_others_quoted_str() { String *result = NewString(""); Printf(result, "\"%s\" :type :%s", name, type); if (klass) Printf(result, " :class \"%s\"", klass); return result; } String *noname_str(bool include_class = true) { String *result = NewString(""); Printf(result, " :type :%s", type); if (klass && include_class) Printf(result, " :class \"%s\"", klass); if (arity) Printf(result, " :arity %s", arity); return result; } String *noname_no_others_str(bool include_class = true) { String *result = NewString(""); Printf(result, " :type :%s", type); if (klass && include_class) Printf(result, " :class \"%s\"", klass); return result; } }; IDargs *id_converter_arguments(Node *n) { IDargs *result = (IDargs *) GetVoid(n, "allegrocl:id-converter-args"); if (!result) result = new IDargs; // Base name if (!result->name) { result->name = Getattr(n, "allegrocl:old-sym:name"); if (!result->name) result->name = Getattr(n, "sym:name"); result->name = Copy(result->name); } // :type if (result->type) Delete(result->type); if (!Getattr(n, "allegrocl:kind")) Setattr(n, "allegrocl:kind", "function"); if (Strstr(Getattr(n, "name"), "operator ")) Replaceall(Getattr(n, "allegrocl:kind"), "function", "operator"); if (Strstr(Getattr(n, "allegrocl:kind"), "variable")) { int name_end = Len(Getattr(n, "sym:name")) - 4; char *str = Char(Getattr(n, "sym:name")); String *get_set = NewString(str + name_end + 1); result->type = Copy(Getattr(n, "allegrocl:kind")); Replaceall(result->type, "variable", ""); Printf(result->type, "%ster", get_set); Delete(get_set); } else { result->type = Copy(Getattr(n, "allegrocl:kind")); } // :class if (Strstr(result->type, "member ")) { Replaceall(result->type, "member ", ""); if (!result->klass) { result->klass = Copy(Getattr(parent_node_skipping_extends(n), "sym:name")); } } // :arity if (Getattr(n, "sym:overloaded")) { if (result->arity) Delete(result->arity); result->arity = NewStringf("%d", // emit_num_arguments(Getattr(n, "wrap:parms"))); emit_num_lin_arguments(Getattr(n, "wrap:parms"))); // Printf(stderr, "got arity of '%s' node '%s' '%p'\n", result->arity, Getattr(n,"name"), Getattr(n,"wrap:parms")); } SetVoid(n, "allegrocl:id-converter-args", result); return result; } int ALLEGROCL::emit_buffered_defuns(Node *n) { Node *overloaded_from = Getattr(n, "sym:overloaded"); String *wrap; if (!overloaded_from) { wrap = Getattr(n, "allegrocl:lisp-wrap"); Printf(f_clwrap, "%s\n", wrap); Delattr(n, "allegrocl:lisp-wrap"); Delete(wrap); } else { for (Node *overload = overloaded_from; overload; overload = Getattr(overload, "sym:nextSibling")) { String *others_args = collect_others_args(overload); wrap = Getattr(overload, "allegrocl:lisp-wrap"); Replaceall(wrap, "@@OTHERS-ARGS-GO-HERE@@", others_args); // IDargs* id_args = id_converter_arguments(overload); // Replaceall(id_args->others_args, "@@OTHERS-ARGS-GO-HERE@@", others_args); if (!GetInt(overload, "overload:ignore")) Printf(f_clwrap, "%s", wrap); Delattr(overload, "allegrocl:lisp-wrap"); Delete(wrap); } } return SWIG_OK; } String *dispatching_type(Node *n, Parm *p) { String *result = 0; String *parsed = Getattr(p, "type"); //Swig_cparse_type(Getattr(p,"tmap:ctype")); String *cl_t = SwigType_typedef_resolve_all(parsed); Node *node = NewHash(); Setattr(node, "type", parsed); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("lispclass", node, Getattr(p, "name"), 0); Delete(node); if (tm) { result = Copy(tm); } else { String *lookup_type = class_from_class_or_class_ref(parsed); if (lookup_type) result = lookup_defined_foreign_ltype(lookup_type); } // if (!result && SwigType_ispointer(cl_t)) { // SwigType_pop(cl_t); // result = lookup_defined_foreign_ltype(cl_t); // } if (!result) result = NewStringf("ff:foreign-pointer"); // Delete(parsed); Delete(cl_t); return result; } int ALLEGROCL::emit_dispatch_defun(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_dispatch_defun: ENTER... "); #endif List *overloads = Swig_overload_rank(n, true); // Printf(stderr,"\ndispatch node=%p\n\n", n); // Swig_print_node(n); Node *overloaded_from = Getattr(n,"sym:overloaded"); bool include_class = Getattr(overloaded_from, "allegrocl:dispatcher:include-class") ? true : false; String *id_args = id_converter_arguments(n)->noname_no_others_str(include_class); Printf(f_clwrap, "(swig-dispatcher (\"%s\" %s :arities (", Getattr(overloaded_from, "allegrocl:dispatcher:name"), id_args); Delattr(overloaded_from, "allegrocl:dispatcher:include-class"); Delattr(overloaded_from, "allegrocl:dispatcher:name"); int last_arity = -1; for (Iterator i = First(overloads); i.item; i = Next(i)) { int arity = emit_num_lin_arguments(Getattr(i.item, "wrap:parms")); if (arity == last_arity) continue; Printf(f_clwrap, "%s%d", last_arity == -1 ? "" : " ", arity); last_arity = arity; } Printf(f_clwrap, ")))\n"); Delete(id_args); Delete(overloads); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_dispatch_defun: EXIT\n"); #endif return SWIG_OK; } int ALLEGROCL::emit_defun(Node *n, File *fcl) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_defun: ENTER... "); #endif // avoid name conflicts between smart pointer wrappers and the wrappers for the // actual class. bool smartmemberwrapper = (!Cmp(Getattr(n, "view"), "memberfunctionHandler") && Getattr(n,"allocate:smartpointeraccess")); #ifdef ALLEGROCL_DEBUG int auto_generated = Cmp(Getattr(n, "view"), "globalfunctionHandler"); Printf(stderr, "%s%sfunction %s%s%s\n", auto_generated ? "> " : "", Getattr(n, "sym:overloaded") ? "overloaded " : "", current_namespace, (current_namespace) > 0 ? "::" : "", Getattr(n, "sym:name")); Printf(stderr, " (view: %s)\n", Getattr(n, "view")); Swig_print_node(n); #endif String *funcname = Getattr(n, "allegrocl:old-sym:name"); if (smartmemberwrapper || !funcname) funcname = Getattr(n, "sym:name"); String *mangled_name = Getattr(n, "wrap:name"); ParmList *pl = parmlist_with_names(Getattr(n, "wrap:parms")); // attach typemap info. Wrapper *wrap = NewWrapper(); Swig_typemap_attach_parms("lin", pl, wrap); // Swig_typemap_attach_parms("ffitype", pl, wrap); Swig_typemap_lookup("lout", n, Swig_cresult_name(), 0); SwigType *result_type = Swig_cparse_type(Getattr(n, "tmap:ctype")); // prime the pump, with support for OUTPUT, INOUT typemaps. Printf(wrap->code, "(cl::let ((ACL_ffresult %s:*void*)\n ACL_result)\n $body\n (cl::if (cl::eq ACL_ffresult %s:*void*)\n (cl::values-list ACL_result)\n (cl::values-list (cl::cons ACL_ffresult ACL_result))))", swig_package, swig_package); Parm *p; int largnum = 0, argnum = 0, first = 1; // int varargs=0; if (Generate_Wrapper) { String *extra_parms = id_converter_arguments(n)->noname_str(smartmemberwrapper ? false : true); Node *overloaded_from = Getattr(n,"sym:overloaded"); if (overloaded_from) { if(!GetFlag(overloaded_from,"allegrocl:dispatcher:name")) { Setattr(overloaded_from,"allegrocl:dispatcher:name",funcname); Setattr(overloaded_from,"allegrocl:dispatcher:include-class", smartmemberwrapper ? 0 : "1"); // Printf(stderr, " set a:d:name='%s', a:d:i-c='%s'\n", Getattr(n,"allegrocl:dispatcher:name"), Getattr(n,"allegrocl:dispatcher:include-class")); } Printf(fcl, "(swig-defmethod (\"%s\" \"%s\"%s)\n", funcname, mangled_name, extra_parms); } else Printf(fcl, "(swig-defun (\"%s\" \"%s\"%s)\n", funcname, mangled_name, extra_parms); Delete(extra_parms); } // Just C else { Printf(fcl, "(swig-defun (\"%s\" \"%s\")\n", funcname, Generate_Wrapper ? mangled_name : funcname); } ////////////////////////////////////// // Lisp foreign call parameter list // ////////////////////////////////////// Printf(fcl, " ("); /* Special cases */ if (ParmList_len(pl) == 0) { Printf(fcl, ":void"); /* } else if (any_varargs(pl)) { Printf(fcl, "#| varargs |#"); varargs=1; */ } else { String *largs = NewString(""); for (p = pl; p; p = nextSibling(p), argnum++, largnum++) { // SwigType *argtype=Getattr(p, "type"); SwigType *argtype = Swig_cparse_type(Getattr(p, "tmap:ctype")); SwigType *parmtype = Getattr(p,"type"); if (!first) { Printf(fcl, "\n "); } /* by default, skip varargs */ if (!SwigType_isvarargs(parmtype)) { String *argname = NewStringf("PARM%d_%s", largnum, Getattr(p, "name")); // Printf(stderr,"%s\n", Getattr(p,"tmap:lin")); String *ffitype = compose_foreign_type(n, argtype, Getattr(p,"name")); String *deref_ffitype = dereference_ffitype(ffitype); String *lisptype = get_lisp_type(n, parmtype, Getattr(p, "name")); #ifdef ALLEGROCL_DEBUG Printf(stderr, "lisptype of '%s' '%s' = '%s'\n", parmtype, Getattr(p, "name"), lisptype); #endif // while we're walking the parameters, generating LIN // wrapper code... Setattr(p, "lname", NewStringf("SWIG_arg%d", largnum)); String *parm_code = Getattr(p, "tmap:lin"); if (parm_code) { String *lname = Getattr(p, "lname"); Printf(largs, " %s", lname); Replaceall(parm_code, "$in_fftype", ffitype); // must come before $in Replaceall(parm_code, "$in", argname); Replaceall(parm_code, "$out", lname); Replaceall(parm_code, "$*in_fftype", deref_ffitype); Replaceall(wrap->code, "$body", parm_code); } String *dispatchtype = Getattr(n, "sym:overloaded") ? dispatching_type(n, p) : NewString(""); // if this parameter has been removed from the C/++ wrapper // it shouldn't be in the lisp wrapper either. if (!checkAttribute(p, "tmap:in:numinputs", "0")) { Printf(fcl, "(%s %s %s %s %s)", // parms in the ff wrapper, but not in the lisp wrapper. (checkAttribute(p, "tmap:lin:numinputs", "0") ? ":p-" : ":p+"), argname, dispatchtype, ffitype, lisptype); first = 0; } Delete(argname); Delete(ffitype); Delete(deref_ffitype); Delete(lisptype); } } Printf(wrap->locals, "%s", largs); } String *lout = Getattr(n, "tmap:lout"); Replaceall(lout, "$owner", GetFlag(n, "feature:new") ? "t" : "nil"); Replaceall(wrap->code, "$body", lout); // $lclass handling. String *lclass = (String *) 0; SwigType *parsed = Swig_cparse_type(Getattr(n, "tmap:ctype")); // SwigType *cl_t = SwigType_typedef_resolve_all(parsed); SwigType *cl_t = class_from_class_or_class_ref(parsed); String *out_ffitype = compose_foreign_type(n, parsed); String *deref_out_ffitype; String *out_temp = Copy(parsed); if (SwigType_ispointer(out_temp)) { SwigType_pop(out_temp); deref_out_ffitype = compose_foreign_type(n, out_temp); } else { deref_out_ffitype = Copy(out_ffitype); } Delete(out_temp); Delete(parsed); if (cl_t) { lclass = lookup_defined_foreign_ltype(cl_t); } int ff_foreign_ptr = 0; if (!lclass) { ff_foreign_ptr = 1; lclass = NewStringf("ff:foreign-pointer"); } #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "for output wrapping %s: type=%s, ctype=%s\n", Getattr(n, "name"), Getattr(n, "type"), Swig_cparse_type(Getattr(n, "tmap:ctype"))); #endif if (lclass) Replaceall(wrap->code, "$lclass", lclass); if (out_ffitype) Replaceall(wrap->code, "$out_fftype", out_ffitype); if (deref_out_ffitype) Replaceall(wrap->code, "$*out_fftype", deref_out_ffitype); Replaceall(wrap->code, "$body", NewStringf("(swig-ff-call%s)", wrap->locals)); String *ldestructor = Copy(lclass); if (ff_foreign_ptr) Replaceall(ldestructor, ldestructor, "cl::identity"); else Replaceall(ldestructor, ":type :class", ":type :destructor"); Replaceall(wrap->code, "$ldestructor", ldestructor); Delete(ldestructor); Printf(fcl, ")\n"); /* finish arg list */ ///////////////////////////////////////////////////// // Lisp foreign call return type and optimizations // ///////////////////////////////////////////////////// Printf(fcl, " (:returning (%s %s)", compose_foreign_type(n, result_type), get_lisp_type(n, Getattr(n, "type"), Swig_cresult_name())); for (Iterator option = First(n); option.item; option = Next(option)) { if (Strncmp("feature:ffargs:", option.key, 15)) continue; String *option_val = option.item; String *option_name = NewString(Char(option.key) + 14); Replaceall(option_name, "_", "-"); // TODO: varargs vs call-direct ? Printf(fcl, "\n %s %s", option_name, option_val); Delete(option_name); } Printf(fcl, ")\n %s)\n\n", wrap->code); // Wrapper_print(wrap, stderr); Delete(result_type); Delete(mangled_name); Delete(pl); DelWrapper(wrap); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_defun: EXIT\n"); #endif return SWIG_OK; } int ALLEGROCL::functionWrapper(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "functionWrapper %s\n", Getattr(n,"name")); #endif ParmList *parms = CopyParmList(Getattr(n, "parms")); Wrapper *f = NewWrapper(); SwigType *t = Getattr(n, "type"); String *name = Getattr(n, "name"); String *raw_return_type = Swig_typemap_lookup("ctype", n, "", 0); SwigType *return_type = Swig_cparse_type(raw_return_type); SwigType *resolved = SwigType_typedef_resolve_all(return_type); int is_void_return = (Cmp(resolved, "void") == 0); Delete(resolved); if (!is_void_return) { String *lresult_init = NewStringf("= (%s)0", SwigType_str(SwigType_strip_qualifiers(return_type),0)); Wrapper_add_localv(f, "lresult", SwigType_lstr(SwigType_ltype(return_type), "lresult"), lresult_init, NIL); Delete(lresult_init); } // Emit all of the local variables for holding arguments. emit_parameter_variables(parms, f); // Attach the standard typemaps Swig_typemap_attach_parms("ctype", parms, f); Swig_typemap_attach_parms("lin", parms, f); emit_attach_parmmaps(parms, f); String *mangled = mangle_name(n); Node *overloaded = Getattr(n, "sym:overloaded"); // Parameter overloading Setattr(n, "wrap:parms", parms); Setattr(n, "wrap:name", mangled); if (overloaded) { // emit warnings when overloading is impossible on the lisp side. // basically Swig_overload_check(n), but with script_lang_wrapping // set to true. Delete(Swig_overload_rank(n, true)); if (Getattr(n, "overload:ignore")) { // if we're the last overload, make sure to force the emit // of the rest of the overloads before we leave. // Printf(stderr, "ignored overload %s(%p)\n", name, Getattr(n, "sym:nextSibling")); if (!Getattr(n, "sym:nextSibling")) { update_package_if_needed(n); emit_buffered_defuns(n); emit_dispatch_defun(n); } DelWrapper(f); return SWIG_OK; } } // Get number of required and total arguments int num_arguments = emit_num_arguments(parms); int gencomma = 0; #ifdef ALLEGROCL_DEBUG Printf(stderr, "Walking parameters for %s '%s'\n", Getattr(n, "allegrocl:kind"), name); #endif // Now walk the function parameter list and generate code to get arguments String *name_and_parms = NewStringf("%s (", mangled); int i; Parm *p; for (i = 0, p = parms; i < num_arguments; i++) { #ifdef ALLEGROCL_DEBUG String *temp1 = Getattr(p,"tmap:in"); String *temp2 = Getattr(p,"tmap:in:numinputs"); Printf(stderr," parm %d: %s, tmap:in='%s', tmap:in:numinputs='%s'\n", i, Getattr(p,"name"), temp1 ? temp1 : "", temp2 ? temp2 : ""); #endif while (p && checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } if (!p) break; SwigType *c_parm_type = Swig_cparse_type(Getattr(p, "tmap:ctype")); String *arg = NewStringf("l%s", Getattr(p, "lname")); // Emit parameter declaration if (gencomma) Printf(name_and_parms, ", "); String *parm_decl = SwigType_str(c_parm_type, arg); Printf(name_and_parms, "%s", parm_decl); #ifdef ALLEGROCL_DEBUG Printf(stderr, " param: %s\n", parm_decl); #endif Delete(parm_decl); gencomma = 1; // Emit parameter conversion code String *parm_code = Getattr(p, "tmap:in"); //if (!parm_code) { // Swig_warning(...); // p = nextSibling(p); /*} else */ { // canThrow(n, "in", p); Replaceall(parm_code, "$input", arg); Setattr(p, "emit:input", arg); Printf(f->code, "%s\n", parm_code); p = Getattr(p, "tmap:in:next"); } Delete(arg); } Printf(name_and_parms, ")"); #ifdef ALLEGROCL_DEBUG Printf(stderr, " arity = %d(%d)\n", emit_num_lin_arguments(parms), emit_num_lin_arguments(Getattr(n,"wrap:parms"))); #endif // Emit the function definition String *signature = SwigType_str(return_type, name_and_parms); Printf(f->def, "EXPORT %s {", signature); if (CPlusPlus) Printf(f->code, " try {\n"); String *actioncode = emit_action(n); String *tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); if (!is_void_return) { if (tm) { Replaceall(tm, "$result", "lresult"); Printf(f->code, "%s\n", tm); Printf(f->code, " return lresult;\n"); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), name); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } emit_return_variable(n, t, f); if (CPlusPlus) { Printf(f->code, " } catch (...) {\n"); if (!is_void_return) Printf(f->code, " return (%s)0;\n", SwigType_str(SwigType_strip_qualifiers(return_type),0)); Printf(f->code, " }\n"); } Printf(f->code, "}\n"); /* print this when in C mode? make this a command-line arg? */ if (Generate_Wrapper) Wrapper_print(f, f_cxx_wrapper); String *f_buffer = NewString(""); emit_defun(n, f_buffer); Setattr(n, "allegrocl:lisp-wrap", f_buffer); if (!overloaded || !Getattr(n, "sym:nextSibling")) { update_package_if_needed(n); emit_buffered_defuns(n); // this is the last overload. if (overloaded) { emit_dispatch_defun(n); } } DelWrapper(f); return SWIG_OK; } int ALLEGROCL::namespaceDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "namespaceDecl: '%s'(%p) (fc=%p)\n", Getattr(n, "sym:name"), n, firstChild(n)); #endif /* don't wrap a namespace with no contents. package bloat. also, test-suite/namespace_class.i claims an unnamed namespace is 'private' and should not be wrapped. Complying... */ if (Getattr(n,"unnamed") || !firstChild(n)) return SWIG_OK; String *name = Getattr(n, "sym:name"); String *old_namespace = current_namespace; if (Cmp(current_namespace, "") == 0) current_namespace = NewStringf("%s", name); else current_namespace = NewStringf("%s::%s", current_namespace, name); if (!GetInt(defined_namespace_packages, current_namespace)) { SetInt(defined_namespace_packages, current_namespace, 1); String *lispy_namespace = listify_namespace(current_namespace); Printf(f_clhead, "(swig-defpackage %s)\n", lispy_namespace); Delete(lispy_namespace); } emit_children(n); Delete(current_namespace); current_namespace = old_namespace; return SWIG_OK; } int ALLEGROCL::constructorHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "constructorHandler %s\n", Getattr(n, "name")); #endif // Swig_print_node(n); Setattr(n, "allegrocl:kind", "constructor"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a global forwarding function. return Language::constructorHandler(n); } int ALLEGROCL::destructorHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "destructorHandler %s\n", Getattr(n, "name")); #endif Setattr(n, "allegrocl:kind", "destructor"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a global forwarding function. return Language::destructorHandler(n); } int ALLEGROCL::constantWrapper(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "constantWrapper %s\n", Getattr(n, "name")); #endif if (Generate_Wrapper) { // Setattr(n,"wrap:name",mangle_name(n, "ACLPP")); String *const_type = Getattr(n, "type"); String *const_val = 0; String *raw_const = Getattr(n, "value"); if (SwigType_type(const_type) == T_STRING) { const_val = NewStringf("\"%s\"", raw_const); } else if (SwigType_type(const_type) == T_CHAR) { const_val = NewStringf("'%s'", raw_const); } else { const_val = Copy(raw_const); } SwigType_add_qualifier(const_type, "const"); String *ppcname = NewStringf("ACLppc_%s", Getattr(n, "sym:name")); // Printf(f_runtime, "static const %s = %s;\n", SwigType_lstr(const_type, ppcname), const_val); Printf(f_runtime, "static %s = %s;\n", SwigType_lstr(const_type, ppcname), const_val); Setattr(n, "name", ppcname); SetFlag(n, "feature:immutable"); Delete(const_val); return variableWrapper(n); } String *type = Getattr(n, "type"); String *value = Getattr(n, "value"); String *converted_value = convert_literal(value, type); String *name = Getattr(n, "sym:name"); Setattr(n, "allegrocl:kind", "constant"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); #if 0 Printf(stdout, "constant %s is of type %s. value: %s\n", name, type, converted_value); #endif if (converted_value) { Printf(f_clwrap, "(swig-defconstant \"%s\" %s)\n", name, converted_value); } else { Swig_warning(WARN_LANG_DISCARD_CONST, Getfile(n), Getline(n), "Unable to parse constant value '%s'. Setting to NIL\n", value); Printf(f_clwrap, "(swig-defconstant \"%s\" nil #| %s |#)\n", name, value); } Delete(converted_value); return SWIG_OK; } int ALLEGROCL::globalvariableHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "globalvariableHandler %s\n", Getattr(n, "name")); #endif if (Generate_Wrapper) return Language::globalvariableHandler(n); // String *name = Getattr(n, "name"); SwigType *type = Getattr(n, "type"); SwigType *rtype = SwigType_typedef_resolve_all(type); if (SwigType_isclass(rtype)) { SwigType_add_pointer(type); SwigType_add_pointer(rtype); } Printf(f_clwrap, "(swig-defvar \"%s\" \"%s\" :type %s)\n", Getattr(n, "sym:name"), Getattr(n, "sym:name"), ((SwigType_isconst(type)) ? ":constant" : ":variable")); return SWIG_OK; } int ALLEGROCL::variableWrapper(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "variableWrapper %s\n", Getattr(n, "name")); #endif Setattr(n, "allegrocl:kind", "variable"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a get/set function pair. if (Generate_Wrapper) return Language::variableWrapper(n); String *name = Getattr(n, "name"); SwigType *type = Getattr(n, "type"); SwigType *ctype; SwigType *rtype = SwigType_typedef_resolve_all(type); String *mangled_name = mangle_name(n); int pointer_added = 0; if (SwigType_isclass(rtype)) { SwigType_add_pointer(type); SwigType_add_pointer(rtype); pointer_added = 1; } ctype = SwigType_str(type, 0); // EXPORT ; // = ; Printf(f_runtime, "EXPORT %s %s;\n%s %s = %s%s;\n", ctype, mangled_name, ctype, mangled_name, (pointer_added ? "&" : ""), name); Printf(f_cl, "(swig-defvar \"%s\" :type %s)\n", mangled_name, ((SwigType_isconst(type)) ? ":constant" : ":variable")); Printf(stderr,"***\n"); Delete(mangled_name); #ifdef ALLEGROCL_DEBUG Printf(stderr, "DONE variable %s\n", Getattr(n, "name")); #endif return SWIG_OK; } int ALLEGROCL::memberfunctionHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "memberfunctionHandler %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name")); Swig_print_node(n); #endif Setattr(n, "allegrocl:kind", "member function"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a global forwarding function. return Language::memberfunctionHandler(n); } int ALLEGROCL::membervariableHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "membervariableHandler %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name")); #endif Setattr(n, "allegrocl:kind", "member variable"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a get/set function pair. return Language::membervariableHandler(n); } int ALLEGROCL::typedefHandler(Node *n) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "In typedefHandler\n"); #endif SwigType *typedef_type = Getattr(n,"type"); // has the side-effect of noting any implicit // template instantiations in type. String *ff_type = compose_foreign_type(n, typedef_type); String *sym_name = Getattr(n, "sym:name"); String *name; String *type_ref; if (in_class) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, " typedef in class '%s'(%p)\n", Getattr(in_class, "sym:name"), in_class); #endif Setattr(n, "allegrocl:typedef:in-class", in_class); String *class_name = Getattr(in_class, "name"); name = NewStringf("%s__%s", class_name, sym_name); type_ref = NewStringf("%s::%s", class_name, sym_name); Setattr(n, "allegrocl:in-class", in_class); } else { name = Copy(sym_name); type_ref = Copy(Getattr(n, "name")); } Setattr(n, "allegrocl:namespace", current_namespace); String *lookup = lookup_defined_foreign_type(typedef_type); #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "** lookup='%s'(%p), typedef_type='%s', strcmp = '%d' strstr = '%d'\n", lookup, lookup, typedef_type, Strcmp(typedef_type,"void"), Strstr(ff_type,"__SWIGACL_FwdReference")); #endif if(lookup || (!lookup && Strcmp(typedef_type,"void")) || (!lookup && Strstr(ff_type,"__SWIGACL_FwdReference"))) { add_defined_foreign_type(n, 0, type_ref, name); } else { add_forward_referenced_type(n); } #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Out typedefHandler\n"); #endif Delete(ff_type); return SWIG_OK; } // forward referenced classes are added specially to defined_foreign_types int ALLEGROCL::classforwardDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "classforwardDeclaration %s\n", Getattr(n, "name")); #endif add_forward_referenced_type(n); return SWIG_OK; } int ALLEGROCL::classHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "classHandler %s::%s\n", current_namespace, Getattr(n, "sym:name")); #endif int result; if (Generate_Wrapper) result = cppClassHandler(n); else result = cClassHandler(n); return result; } int ALLEGROCL::cClassHandler(Node *n) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "In cClassHandler\n"); #endif /* Add this structure to the known lisp types */ // Printf(stderr, "Adding %s foreign type\n", name); String *ns = listify_namespace(current_namespace); add_defined_foreign_type(n); Delete(ns); #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Out cClassHandler\n"); #endif return SWIG_OK; } int ALLEGROCL::cppClassHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "cppClassHandler %s\n", Getattr(n, "name")); #endif // String *name=Getattr(n, "sym:name"); // String *kind = Getattr(n,"kind"); /* Template instantiation. Careful. SWIG does not create instantiations of templated classes whenever it sees a templated class reference (say, as a return type, or in a parameter list). The %template directive results in a templated class instantiation that will actually be seen by :: classHandler(). In this case, we don't want to error if the type already exists; the point is to force the creation of wrappers for the templated class. */ String *templated = Getattr(n, "template"); String *t_name; // String *ns = listify_namespace(current_namespace); if (templated) { t_name = namespaced_name(n); } else { t_name = Getattr(n, "name"); } Setattr(n, "allegrocl:namespace", current_namespace); /* Add this structure to the known lisp types. Class may contain references to the type currently being defined */ if (!templated || !lookup_defined_foreign_type(t_name)) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Adding %s foreign type\n", Getattr(n, "sym:name")); #endif add_defined_foreign_type(n); } else { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "cppClassHand: type %s already exists. Assuming %%template instantiation for wrapping purposes.\n", Getattr(n, "sym:name")); #endif add_defined_foreign_type(n, 1); } // Generate slot accessors, constructor, and destructor. Node *prev_class = in_class; in_class = n; Node *c; // walk all member variables. #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " MANUALLY walking class members... \n"); #endif for (c = firstChild(n); c; c = nextSibling(c)) { // ping the types of all children--even protected and private // so their types can be added to the linked_type_list. SwigType *childType = NewStringf("%s%s", Getattr(c, "decl"), Getattr(c, "type")); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "looking at child '%p' of type '%s' '%d'\n", c, childType, SwigType_isfunction(childType)); // Swig_print_node(c); #endif if (!SwigType_isfunction(childType)) Delete(compose_foreign_type(n, childType)); Delete(childType); } #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " MANUAL walk DONE.\n"); #endif // this will walk all necessary methods. #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " LANGUAGE walk of children...\n"); #endif Language::classHandler(n); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " LANGUAGE walk DONE\n"); #endif in_class = prev_class; return SWIG_OK; } int ALLEGROCL::emit_one(Node *n) { // When the current package does not correspond with the current // namespace we need to generate an IN-PACKAGE form, unless the // current node is another namespace node. if (Cmp(nodeType(n), "namespace") != 0 && Cmp(current_package, current_namespace) != 0) { String *lispy_namespace = listify_namespace(current_namespace); Printf(f_clwrap, "(swig-in-package %s)\n", lispy_namespace); Delete(lispy_namespace); Delete(current_package); current_package = NewStringf("%s", current_namespace); } Setattr(n, "allegrocl:package", current_package); return Language::emit_one(n); } int ALLEGROCL::enumDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "enumDeclaration %s\n", Getattr(n, "name")); #endif if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; if (Getattr(n, "sym:name")) { add_defined_foreign_type(n); } Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { ALLEGROCL::enumvalueDeclaration(c); // since we walk our own children, we need to add // the current package ourselves. Setattr(c, "allegrocl:package", current_package); } return SWIG_OK; } int ALLEGROCL::enumvalueDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "enumvalueDeclaration %s\n", Getattr(n, "name")); #endif /* print this when in C mode? make this a command-line arg? */ if (Generate_Wrapper) { SwigType *enum_type = Copy(Getattr(n,"type")); String *mangled_name = mangle_name(n, "ACL_ENUM", in_class ? Getattr(in_class,"name") : current_namespace); SwigType_add_qualifier(enum_type,"const"); String *enum_decl = SwigType_str(enum_type, mangled_name); Printf(f_cxx_wrapper, "EXPORT %s;\n", enum_decl); Printf(f_cxx_wrapper, "%s = %s;\n", enum_decl, Getattr(n, "value")); Delete(mangled_name); Delete(enum_type); Delete(enum_decl); } return SWIG_OK; } int ALLEGROCL::templateDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "templateDeclaration %s\n", Getattr(n, "name")); #endif String *type = Getattr(n, "templatetype"); // Printf(stderr, "tempDecl: %s %s\n", Getattr(n,"name"), // type); // Swig_print_node(n); if (!Strcmp(type, "cdecl")) { SwigType *ty = NewStringf("%s%s", Getattr(n, "decl"), Getattr(n, "type")); Delete(ty); } Delete(type); return SWIG_OK; } swig-4.0.2/Source/Modules/java.cxx0000644000175000017500000056164613667507523016721 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * java.cxx * * Java language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include // for INT_MAX #include "cparse.h" #include #include "javadoc.h" /* Hash type used for upcalls from C/C++ */ typedef DOH UpcallData; class JAVA:public Language { static const char *usage; const String *empty_string; const String *public_string; const String *protected_string; Hash *swig_types_hash; File *f_begin; File *f_runtime; File *f_runtime_h; File *f_header; File *f_wrappers; File *f_init; File *f_directors; File *f_directors_h; List *filenames_list; bool proxy_flag; // Flag for generating proxy classes bool nopgcpp_flag; // Flag for suppressing the premature garbage collection prevention parameter bool native_function_flag; // Flag for when wrapping a native function bool enum_constant_flag; // Flag for when wrapping an enum or constant bool static_flag; // Flag for when wrapping a static functions or member variables bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable bool wrapping_member_flag; // Flag for when wrapping a member variable/enum/const bool global_variable_flag; // Flag for when wrapping a global variable bool old_variable_names; // Flag for old style variable names in the intermediary class bool member_func_flag; // flag set when wrapping a member function bool doxygen; //flag for converting found doxygen to javadoc bool comment_creation_chatter; //flag for getting information about where comments were created in java.cxx String *imclass_name; // intermediary class name String *module_class_name; // module class name String *constants_interface_name; // constants interface name String *imclass_class_code; // intermediary class code String *proxy_class_def; String *proxy_class_code; String *interface_class_code; // if %feature("interface") was declared for a class, here goes the interface declaration String *module_class_code; String *proxy_class_name; // proxy class name String *full_proxy_class_name;// fully qualified proxy class name when using nspace feature, otherwise same as proxy_class_name String *full_imclass_name; // fully qualified intermediary class name when using nspace feature, otherwise same as imclass_name String *variable_name; //Name of a variable being wrapped String *proxy_class_constants_code; String *module_class_constants_code; String *enum_code; String *package; // Optional package name String *jnipackage; // Package name used in the JNI code String *package_path; // Package name used internally by JNI (slashes) String *imclass_imports; //intermediary class imports from %pragma String *module_imports; //module imports from %pragma String *imclass_baseclass; //inheritance for intermediary class class from %pragma String *imclass_package; //package in which to generate the intermediary class String *module_baseclass; //inheritance for module class from %pragma String *imclass_interfaces; //interfaces for intermediary class class from %pragma String *module_interfaces; //interfaces for module class from %pragma String *imclass_class_modifiers; //class modifiers for intermediary class overridden by %pragma String *module_class_modifiers; //class modifiers for module class overridden by %pragma String *upcasts_code; //C++ casts for inheritance hierarchies C++ code String *imclass_cppcasts_code; //C++ casts up inheritance hierarchies intermediary class code String *imclass_directors; // Intermediate class director code String *destructor_call; //C++ destructor call if any String *destructor_throws_clause; //C++ destructor throws clause if any // Director method stuff: List *dmethods_seq; Hash *dmethods_table; int n_dmethods; int n_directors; int first_class_dmethod; int curr_class_dmethod; int nesting_depth; enum EnumFeature { SimpleEnum, TypeunsafeEnum, TypesafeEnum, ProperEnum }; public: /* ----------------------------------------------------------------------------- * JAVA() * ----------------------------------------------------------------------------- */ JAVA():empty_string(NewString("")), public_string(NewString("public")), protected_string(NewString("protected")), swig_types_hash(NULL), f_begin(NULL), f_runtime(NULL), f_runtime_h(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), f_directors(NULL), f_directors_h(NULL), filenames_list(NULL), proxy_flag(true), nopgcpp_flag(false), native_function_flag(false), enum_constant_flag(false), static_flag(false), variable_wrapper_flag(false), wrapping_member_flag(false), global_variable_flag(false), old_variable_names(false), member_func_flag(false), doxygen(false), comment_creation_chatter(false), imclass_name(NULL), module_class_name(NULL), constants_interface_name(NULL), imclass_class_code(NULL), proxy_class_def(NULL), proxy_class_code(NULL), interface_class_code(NULL), module_class_code(NULL), proxy_class_name(NULL), full_proxy_class_name(NULL), full_imclass_name(NULL), variable_name(NULL), proxy_class_constants_code(NULL), module_class_constants_code(NULL), enum_code(NULL), package(NULL), jnipackage(NULL), package_path(NULL), imclass_imports(NULL), module_imports(NULL), imclass_baseclass(NULL), imclass_package(NULL), module_baseclass(NULL), imclass_interfaces(NULL), module_interfaces(NULL), imclass_class_modifiers(NULL), module_class_modifiers(NULL), upcasts_code(NULL), imclass_cppcasts_code(NULL), imclass_directors(NULL), destructor_call(NULL), destructor_throws_clause(NULL), dmethods_seq(NULL), dmethods_table(NULL), n_dmethods(0), n_directors(0), first_class_dmethod(0), curr_class_dmethod(0), nesting_depth(0){ /* for now, multiple inheritance in directors is disabled, this should be easy to implement though */ director_multiple_inheritance = 0; director_language = 1; } ~JAVA() { delete doxygenTranslator; } /* ----------------------------------------------------------------------------- * constructIntermediateClassName() * * Construct the fully qualified name of the intermediate class and set * the full_imclass_name attribute accordingly. * ----------------------------------------------------------------------------- */ void constructIntermediateClassName(Node *n) { String *nspace = Getattr(n, "sym:nspace"); if (imclass_package && package) full_imclass_name = NewStringf("%s.%s.%s", package, imclass_package, imclass_name); else if (package && nspace) full_imclass_name = NewStringf("%s.%s", package, imclass_name); else if (imclass_package) full_imclass_name = NewStringf("%s.%s", imclass_package, imclass_name); else full_imclass_name = NewStringf("%s", imclass_name); if (nspace && !package) { String *name = Getattr(n, "name") ? Getattr(n, "name") : NewString(""); Swig_warning(WARN_JAVA_NSPACE_WITHOUT_PACKAGE, Getfile(n), Getline(n), "The nspace feature is used on '%s' without -package. " "The generated code may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package.\n", name); } } /* ----------------------------------------------------------------------------- * getProxyName() * * Test to see if a type corresponds to something wrapped with a proxy class. * Return NULL if not otherwise the proxy class name, fully qualified with * package name if the nspace feature is used, unless jnidescriptor is true as * the package name is handled differently (unfortunately for legacy reasons). * ----------------------------------------------------------------------------- */ String *getProxyName(SwigType *t, bool jnidescriptor = false) { String *proxyname = NULL; if (proxy_flag) { Node *n = classLookup(t); if (n) { proxyname = Getattr(n, "proxyname"); if (!proxyname || jnidescriptor) { String *nspace = Getattr(n, "sym:nspace"); String *symname = Copy(Getattr(n, "sym:name")); if (symname && !GetFlag(n, "feature:flatnested")) { for (Node *outer_class = Getattr(n, "nested:outer"); outer_class; outer_class = Getattr(outer_class, "nested:outer")) { if (String* name = Getattr(outer_class, "sym:name")) { Push(symname, jnidescriptor ? "$" : "."); Push(symname, name); } else return NULL; } } if (nspace) { if (package && !jnidescriptor) proxyname = NewStringf("%s.%s.%s", package, nspace, symname); else proxyname = NewStringf("%s.%s", nspace, symname); } else { proxyname = Copy(symname); } if (!jnidescriptor) { Setattr(n, "proxyname", proxyname); // Cache it Delete(proxyname); } Delete(symname); } } } return proxyname; } /* ----------------------------------------------------------------------------- * makeValidJniName() * ----------------------------------------------------------------------------- */ String *makeValidJniName(const String *name) { String *valid_jni_name = NewString(name); Replaceall(valid_jni_name, "_", "_1"); return valid_jni_name; } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("java"); int doxygen_translator_flags = 0; // Look for certain command line options for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-package") == 0) { if (argv[i + 1]) { package = NewString(""); Printf(package, argv[i + 1]); if (Len(package) == 0) { Delete(package); package = 0; } Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-shadow") == 0) || ((strcmp(argv[i], "-proxy") == 0))) { Printf(stderr, "Deprecated command line option: %s. Proxy classes are now generated by default.\n", argv[i]); Swig_mark_arg(i); proxy_flag = true; } else if ((strcmp(argv[i], "-doxygen") == 0)) { Swig_mark_arg(i); doxygen = true; scan_doxygen_comments = true; } else if ((strcmp(argv[i], "-debug-doxygen-translator") == 0)) { Swig_mark_arg(i); doxygen_translator_flags |= DoxygenTranslator::debug_translator; } else if ((strcmp(argv[i], "-debug-doxygen-parser") == 0)) { Swig_mark_arg(i); doxygen_translator_flags |= DoxygenTranslator::debug_parser; } else if ((strcmp(argv[i], "-noproxy") == 0)) { Swig_mark_arg(i); proxy_flag = false; } else if (strcmp(argv[i], "-nopgcpp") == 0) { Swig_mark_arg(i); nopgcpp_flag = true; } else if (strcmp(argv[i], "-oldvarnames") == 0) { Swig_mark_arg(i); old_variable_names = true; } else if (strcmp(argv[i], "-jnic") == 0) { Swig_mark_arg(i); Printf(stderr, "Deprecated command line option: -jnic. C JNI calling convention now used when -c++ not specified.\n"); } else if (strcmp(argv[i], "-nofinalize") == 0) { Swig_mark_arg(i); Printf(stderr, "Deprecated command line option: -nofinalize. Use the new javafinalize typemap instead.\n"); } else if (strcmp(argv[i], "-jnicpp") == 0) { Swig_mark_arg(i); Printf(stderr, "Deprecated command line option: -jnicpp. C++ JNI calling convention now used when -c++ specified.\n"); } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } } } if (doxygen) doxygenTranslator = new JavaDocConverter(doxygen_translator_flags); // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGJAVA 1", 0); // Add typemap definitions SWIG_typemap_lang("java"); SWIG_config_file("java.swg"); allow_overloading(); Swig_interface_feature_enable(); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { // Get any options set in the module directive Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode) { if (Getattr(optionsnode, "jniclassname")) imclass_name = Copy(Getattr(optionsnode, "jniclassname")); /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. */ if (Getattr(optionsnode, "directors")) { allow_directors(); } if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } allow_allprotected(GetFlag(optionsnode, "allprotected")); } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } if (directorsEnabled()) { if (!outfile_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); swig_types_hash = NewHash(); filenames_list = NewList(); // Make the intermediary class and module class names. The intermediary class name can be set in the module directive. if (!imclass_name) { imclass_name = NewStringf("%sJNI", Getattr(n, "name")); module_class_name = Copy(Getattr(n, "name")); } else { // Rename the module name if it is the same as intermediary class name - a backwards compatibility solution if (Cmp(imclass_name, Getattr(n, "name")) == 0) module_class_name = NewStringf("%sModule", Getattr(n, "name")); else module_class_name = Copy(Getattr(n, "name")); } constants_interface_name = NewStringf("%sConstants", module_class_name); // module class and intermediary classes are always created if (!addSymbol(imclass_name, n)) return SWIG_ERROR; if (!addSymbol(module_class_name, n)) return SWIG_ERROR; imclass_class_code = NewString(""); proxy_class_def = NewString(""); proxy_class_code = NewString(""); module_class_constants_code = NewString(""); imclass_baseclass = NewString(""); imclass_package = NULL; imclass_interfaces = NewString(""); imclass_class_modifiers = NewString(""); module_class_code = NewString(""); module_baseclass = NewString(""); module_interfaces = NewString(""); module_imports = NewString(""); module_class_modifiers = NewString(""); imclass_imports = NewString(""); imclass_cppcasts_code = NewString(""); imclass_directors = NewString(""); upcasts_code = NewString(""); dmethods_seq = NewList(); dmethods_table = NewHash(); n_dmethods = 0; n_directors = 0; jnipackage = NewString(""); package_path = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGJAVA\n#define SWIGJAVA\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); /* Emit initial director header and director code: */ Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module_class_name); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module_class_name); Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } } Printf(f_runtime, "\n"); String *wrapper_name = NewString(""); if (package) { String *jniname = makeValidJniName(package); Printv(jnipackage, jniname, NIL); Delete(jniname); Replaceall(jnipackage, ".", "_"); Append(jnipackage, "_"); Printv(package_path, package, NIL); Replaceall(package_path, ".", "/"); } String *jniname = makeValidJniName(imclass_name); Printf(wrapper_name, "Java_%s%s_%%f", jnipackage, jniname); Delete(jniname); Swig_name_register("wrapper", Char(wrapper_name)); if (old_variable_names) { Swig_name_register("set", "set_%n%v"); Swig_name_register("get", "get_%n%v"); } Delete(wrapper_name); Printf(f_wrappers, "\n#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); /* Emit code */ Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } // Generate the intermediary class { String *filen = NewStringf("%s%s.java", outputDirectory(imclass_package), imclass_name); File *f_im = NewFile(filen, "w", SWIG_output_files()); if (!f_im) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the intermediary class file emitBanner(f_im); if (imclass_package && package) Printf(f_im, "package %s.%s;", package, imclass_package); else if (imclass_package) Printf(f_im, "package %s;", imclass_package); else if (package) Printf(f_im, "package %s;\n", package); if (imclass_imports) Printf(f_im, "%s\n", imclass_imports); if (Len(imclass_class_modifiers) > 0) Printf(f_im, "%s ", imclass_class_modifiers); Printf(f_im, "%s ", imclass_name); if (imclass_baseclass && *Char(imclass_baseclass)) Printf(f_im, "extends %s ", imclass_baseclass); if (Len(imclass_interfaces) > 0) Printv(f_im, "implements ", imclass_interfaces, " ", NIL); Printf(f_im, "{\n"); // Add the intermediary class methods Replaceall(imclass_class_code, "$module", module_class_name); Replaceall(imclass_class_code, "$imclassname", imclass_name); Printv(f_im, imclass_class_code, NIL); Printv(f_im, imclass_cppcasts_code, NIL); if (Len(imclass_directors) > 0) Printv(f_im, "\n", imclass_directors, NIL); if (n_dmethods > 0) { Putc('\n', f_im); Printf(f_im, " private final static native void swig_module_init();\n"); Printf(f_im, " static {\n"); Printf(f_im, " swig_module_init();\n"); Printf(f_im, " }\n"); } // Finish off the class Printf(f_im, "}\n"); Delete(f_im); } // Generate the Java module class { String *filen = NewStringf("%s%s.java", SWIG_output_directory(), module_class_name); File *f_module = NewFile(filen, "w", SWIG_output_files()); if (!f_module) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the module class file emitBanner(f_module); if (package) Printf(f_module, "package %s;\n", package); if (module_imports) Printf(f_module, "%s\n", module_imports); if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, 0); if (comment_creation_chatter) Printf(f_module, "/* This was generated from top() */\n"); Printv(f_module, Char(doxygen_comments), NIL); Delete(doxygen_comments); } if (Len(module_class_modifiers) > 0) Printf(f_module, "%s ", module_class_modifiers); Printf(f_module, "%s ", module_class_name); if (module_baseclass && *Char(module_baseclass)) Printf(f_module, "extends %s ", module_baseclass); if (Len(module_interfaces) > 0) { if (Len(module_class_constants_code) != 0) Printv(f_module, "implements ", constants_interface_name, ", ", module_interfaces, " ", NIL); else Printv(f_module, "implements ", module_interfaces, " ", NIL); } else { if (Len(module_class_constants_code) != 0) Printv(f_module, "implements ", constants_interface_name, " ", NIL); } Printf(f_module, "{\n"); Replaceall(module_class_code, "$module", module_class_name); Replaceall(module_class_constants_code, "$module", module_class_name); Replaceall(module_class_code, "$imclassname", imclass_name); Replaceall(module_class_constants_code, "$imclassname", imclass_name); // Add the wrapper methods Printv(f_module, module_class_code, NIL); // Finish off the class Printf(f_module, "}\n"); Delete(f_module); } // Generate the Java constants interface if (Len(module_class_constants_code) != 0) { String *filen = NewStringf("%s%s.java", SWIG_output_directory(), constants_interface_name); File *f_module = NewFile(filen, "w", SWIG_output_files()); if (!f_module) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the Java constants interface file emitBanner(f_module); if (package) Printf(f_module, "package %s;\n", package); if (module_imports) Printf(f_module, "%s\n", module_imports); Printf(f_module, "public interface %s {\n", constants_interface_name); // Write out all the global constants Printv(f_module, module_class_constants_code, NIL); // Finish off the Java interface Printf(f_module, "}\n"); Delete(f_module); } if (upcasts_code) Printv(f_wrappers, upcasts_code, NIL); emitDirectorUpcalls(); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); // Output a Java type wrapper class for each SWIG type for (Iterator swig_type = First(swig_types_hash); swig_type.key; swig_type = Next(swig_type)) { emitTypeWrapperClass(swig_type.key, swig_type.item); } // Check for overwriting file problems on filesystems that are case insensitive Iterator it1; Iterator it2; for (it1 = First(filenames_list); it1.item; it1 = Next(it1)) { String *item1_lower = Swig_string_lower(it1.item); for (it2 = Next(it1); it2.item; it2 = Next(it2)) { String *item2_lower = Swig_string_lower(it2.item); if (it1.item && it2.item) { if (Strcmp(item1_lower, item2_lower) == 0) { Swig_warning(WARN_LANG_PORTABILITY_FILENAME, input_file, line_number, "Portability warning: File %s will be overwritten by %s on case insensitive filesystems such as " "Windows' FAT32 and NTFS unless the class/module name is renamed\n", it1.item, it2.item); } } Delete(item2_lower); } Delete(item1_lower); } Delete(swig_types_hash); swig_types_hash = NULL; Delete(filenames_list); filenames_list = NULL; Delete(imclass_name); imclass_name = NULL; Delete(imclass_class_code); imclass_class_code = NULL; Delete(proxy_class_def); proxy_class_def = NULL; Delete(proxy_class_code); proxy_class_code = NULL; Delete(module_class_constants_code); module_class_constants_code = NULL; Delete(imclass_baseclass); imclass_baseclass = NULL; Delete(imclass_package); imclass_package = NULL; Delete(imclass_interfaces); imclass_interfaces = NULL; Delete(imclass_class_modifiers); imclass_class_modifiers = NULL; Delete(module_class_name); module_class_name = NULL; Delete(constants_interface_name); constants_interface_name = NULL; Delete(module_class_code); module_class_code = NULL; Delete(module_baseclass); module_baseclass = NULL; Delete(module_interfaces); module_interfaces = NULL; Delete(module_imports); module_imports = NULL; Delete(module_class_modifiers); module_class_modifiers = NULL; Delete(imclass_imports); imclass_imports = NULL; Delete(imclass_cppcasts_code); imclass_cppcasts_code = NULL; Delete(imclass_directors); imclass_directors = NULL; Delete(upcasts_code); upcasts_code = NULL; Delete(package); package = NULL; Delete(jnipackage); jnipackage = NULL; Delete(package_path); package_path = NULL; Delete(dmethods_seq); dmethods_seq = NULL; Delete(dmethods_table); dmethods_table = NULL; n_dmethods = 0; /* Close all of the files */ Dump(f_header, f_runtime); if (directorsEnabled()) { Dump(f_directors, f_runtime); Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); f_runtime_h = NULL; Delete(f_directors); f_directors = NULL; Delete(f_directors_h); f_directors_h = NULL; } Dump(f_wrappers, f_runtime); Wrapper_pretty_print(f_init, f_runtime); Delete(f_header); Delete(f_wrappers); Delete(f_init); Dump(f_runtime, f_begin); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ----------------------------------------------------------------------------- * emitBanner() * ----------------------------------------------------------------------------- */ void emitBanner(File *f) { Printf(f, "/* ----------------------------------------------------------------------------\n"); Swig_banner_target_lang(f, " *"); Printf(f, " * ----------------------------------------------------------------------------- */\n\n"); } /*----------------------------------------------------------------------- * Add new director upcall signature *----------------------------------------------------------------------*/ UpcallData *addUpcallMethod(String *imclass_method, String *class_method, String *imclass_desc, String *class_desc, String *decl) { String *key = NewStringf("%s|%s", imclass_method, decl); ++curr_class_dmethod; String *imclass_methodidx = NewStringf("%d", n_dmethods); String *class_methodidx = NewStringf("%d", n_dmethods - first_class_dmethod); n_dmethods++; Hash *new_udata = NewHash(); Append(dmethods_seq, new_udata); Setattr(dmethods_table, key, new_udata); Setattr(new_udata, "method", Copy(class_method)); Setattr(new_udata, "fdesc", Copy(class_desc)); Setattr(new_udata, "imclass_method", Copy(imclass_method)); Setattr(new_udata, "imclass_fdesc", Copy(imclass_desc)); Setattr(new_udata, "imclass_methodidx", imclass_methodidx); Setattr(new_udata, "class_methodidx", class_methodidx); Setattr(new_udata, "decl", Copy(decl)); Delete(key); return new_udata; } /*----------------------------------------------------------------------- * Get director upcall signature *----------------------------------------------------------------------*/ UpcallData *getUpcallMethodData(String *director_class, String *decl) { String *key = NewStringf("%s|%s", director_class, decl); UpcallData *udata = Getattr(dmethods_table, key); Delete(key); return udata; } /* ---------------------------------------------------------------------- * nativeWrapper() * ---------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n, imclass_name)) return SWIG_ERROR; if (Getattr(n, "type")) { Swig_save("nativeWrapper", n, "name", NIL); Setattr(n, "name", wrapname); native_function_flag = true; functionWrapper(n); Swig_restore(n); native_function_flag = false; } else { Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name")); } return SWIG_OK; } /* ---------------------------------------------------------------------- * functionWrapper() * ---------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *c_return_type = NewString(""); String *im_return_type = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *body = NewString(""); int num_arguments = 0; int gencomma = 0; bool is_void_return; String *overloaded_name = getOverloadedName(n); String *nondir_args = NewString(""); bool is_destructor = (Cmp(Getattr(n, "nodeType"), "destructor") == 0); if (!Getattr(n, "sym:overloaded")) { if (!addSymbol(symname, n, imclass_name)) return SWIG_ERROR; } /* The rest of this function deals with generating the intermediary class wrapper function (that wraps a c/c++ function) and generating the JNI c code. Each Java wrapper function has a matching JNI c function call. */ // A new wrapper function object Wrapper *f = NewWrapper(); // Make a wrapper name for this function String *jniname = makeValidJniName(overloaded_name); String *wname = Swig_name_wrapper(jniname); Delete(jniname); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("jni", l, f); Swig_typemap_attach_parms("jtype", l, f); Swig_typemap_attach_parms("jstype", l, f); /* Get return types */ if ((tm = Swig_typemap_lookup("jni", n, "", 0))) { Printf(c_return_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, "No jni typemap defined for %s\n", SwigType_str(t, 0)); } if ((tm = Swig_typemap_lookup("jtype", n, "", 0))) { Printf(im_return_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, "No jtype typemap defined for %s\n", SwigType_str(t, 0)); } is_void_return = (Cmp(c_return_type, "void") == 0); if (!is_void_return) Wrapper_add_localv(f, "jresult", c_return_type, "jresult = 0", NIL); Printv(f->def, "SWIGEXPORT ", c_return_type, " JNICALL ", wname, "(JNIEnv *jenv, jclass jcls", NIL); // Usually these function parameters are unused - The code below ensures // that compilers do not issue such a warning if configured to do so. Printv(f->code, " (void)jenv;\n", NIL); Printv(f->code, " (void)jcls;\n", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); // Parameter overloading Setattr(n, "wrap:parms", l); Setattr(n, "wrap:name", wname); // Wrappers not wanted for some methods where the parameters cannot be overloaded in Java if (Getattr(n, "sym:overloaded")) { // Emit warnings for the few cases that can't be overloaded in Java and give up on generating wrapper Swig_overload_check(n); if (Getattr(n, "overload:ignore")) { DelWrapper(f); return SWIG_OK; } } Printf(imclass_class_code, " public final static native %s %s(", im_return_type, overloaded_name); num_arguments = emit_num_arguments(l); // Now walk the function parameter list and generate code to get arguments for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *im_param_type = NewString(""); String *c_param_type = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* Get the JNI C types of the parameter */ if ((tm = Getattr(p, "tmap:jni"))) { Printv(c_param_type, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, "No jni typemap defined for %s\n", SwigType_str(pt, 0)); } /* Get the intermediary class parameter types of the parameter */ if ((tm = Getattr(p, "tmap:jtype"))) { Printv(im_param_type, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, "No jtype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to intermediary class method */ if (gencomma) Printf(imclass_class_code, ", "); Printf(imclass_class_code, "%s %s", im_param_type, arg); // Add parameter to C function Printv(f->def, ", ", c_param_type, " ", arg, NIL); ++gencomma; // Premature garbage collection prevention parameter if (!is_destructor) { String *pgc_parameter = prematureGarbageCollectionPreventionParameter(pt, p); if (pgc_parameter) { Printf(imclass_class_code, ", %s %s_", pgc_parameter, arg); Printf(f->def, ", jobject %s_", arg); Printf(f->code, " (void)%s_;\n", arg); } } // Get typemap for this argument if ((tm = Getattr(p, "tmap:in"))) { addThrows(n, "tmap:in", p); Replaceall(tm, "$source", arg); /* deprecated */ Replaceall(tm, "$target", ln); /* deprecated */ Replaceall(tm, "$arg", arg); /* deprecated? */ Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); Printf(nondir_args, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } Delete(im_param_type); Delete(c_param_type); Delete(arg); } Printv(f->code, nondir_args, NIL); Delete(nondir_args); /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { addThrows(n, "tmap:check", p); Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { addThrows(n, "tmap:freearg", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { addThrows(n, "tmap:argout", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Get any Java exception classes in the throws typemap ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "catchlist"))) { Swig_typemap_attach_parms("throws", throw_parm_list, f); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { addThrows(n, "tmap:throws", p); } } } // Now write code to make the function call if (!native_function_flag) { Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); // Handle exception classes specified in the "except" feature's "throws" attribute addThrows(n, "feature:except", n); /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { addThrows(n, "tmap:out", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Replaceall(tm, "$target", "jresult"); /* deprecated */ Replaceall(tm, "$result", "jresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printf(f->code, "%s", tm); if (Len(tm)) Printf(f->code, "\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), Getattr(n, "name")); } emit_return_variable(n, t, f); } /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { addThrows(n, "tmap:newfree", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if (!native_function_flag) { if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { addThrows(n, "tmap:ret", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* Finish C function and intermediary class function definitions */ Printf(imclass_class_code, ")"); generateThrowsClause(n, imclass_class_code); Printf(imclass_class_code, ";\n"); Printf(f->def, ") {"); if (!is_void_return) Printv(f->code, " return jresult;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); /* Contract macro modification */ Replaceall(f->code, "SWIG_contract_assert(", "SWIG_contract_assert($null, "); if (!is_void_return) Replaceall(f->code, "$null", "0"); else Replaceall(f->code, "$null", ""); /* Dump the function out */ if (!native_function_flag) Wrapper_print(f, f_wrappers); if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { moduleClassFunctionHandler(n); } /* * Generate the proxy class getters/setters for public member variables. * Not for enums and constants. */ if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Capitalize the first letter in the variable to create a JavaBean type getter/setter function name bool getter_flag = Cmp(symname, Swig_name_set(getNSpace(), Swig_name_member(0, getClassPrefix(), variable_name))) != 0; String *getter_setter_name = NewString(""); if (!getter_flag) Printf(getter_setter_name, "set"); else Printf(getter_setter_name, "get"); Putc(toupper((int) *Char(variable_name)), getter_setter_name); Printf(getter_setter_name, "%s", Char(variable_name) + 1); Setattr(n, "proxyfuncname", getter_setter_name); Setattr(n, "imfuncname", symname); proxyClassFunctionHandler(n); Delete(getter_setter_name); } Delete(c_return_type); Delete(im_return_type); Delete(cleanup); Delete(outarg); Delete(body); Delete(overloaded_name); DelWrapper(f); return SWIG_OK; } /* ----------------------------------------------------------------------- * variableWrapper() * ----------------------------------------------------------------------- */ virtual int variableWrapper(Node *n) { variable_wrapper_flag = true; Language::variableWrapper(n); /* Default to functions */ variable_wrapper_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------- * globalvariableHandler() * ------------------------------------------------------------------------ */ virtual int globalvariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); global_variable_flag = true; int ret = Language::globalvariableHandler(n); global_variable_flag = false; return ret; } String *getCurrentScopeName(String *nspace) { String *scope = 0; if (nspace || getCurrentClass()) { scope = NewString(""); if (nspace) Printf(scope, "%s", nspace); if (Node* cls = getCurrentClass()) { if (Node *outer = Getattr(cls, "nested:outer")) { String *outerClassesPrefix = Copy(Getattr(outer, "sym:name")); for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { Push(outerClassesPrefix, "."); Push(outerClassesPrefix, Getattr(outer, "sym:name")); } Printv(scope, nspace ? "." : "", outerClassesPrefix, ".", proxy_class_name, NIL); Delete(outerClassesPrefix); } else Printv(scope, nspace ? "." : "", proxy_class_name, NIL); } } return scope; } /* ---------------------------------------------------------------------- * enumDeclaration() * * C/C++ enums can be mapped in one of 4 ways, depending on the java:enum feature specified: * 1) Simple enums - simple constant within the proxy class or module class * 2) Typeunsafe enums - simple constant in a Java class (class named after the c++ enum name) * 3) Typesafe enum - typesafe enum pattern (class named after the c++ enum name) * 4) Proper enums - proper Java enum * Anonymous enums always default to 1) * ---------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { if (!ImportMode) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *nspace = Getattr(n, "sym:nspace"); // NSpace/getNSpace() only works during Language::enumDeclaration call if (proxy_flag && !is_wrapping_class()) { // Global enums / enums in a namespace assert(!full_imclass_name); constructIntermediateClassName(n); } enum_code = NewString(""); String *symname = Getattr(n, "sym:name"); String *constants_code = (proxy_flag && is_wrapping_class())? proxy_class_constants_code : module_class_constants_code; EnumFeature enum_feature = decodeEnumFeature(n); String *typemap_lookup_type = Getattr(n, "name"); if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper Java enum if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, 0); if (comment_creation_chatter) Printf(enum_code, "/* This was generated from enumDeclaration() */\n"); Printv(enum_code, Char(doxygen_comments), NIL); Delete(doxygen_comments); } String *scope = getCurrentScopeName(nspace); if (!addSymbol(symname, n, scope)) return SWIG_ERROR; // Pure Java baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "javabase", typemap_lookup_type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "javainterfaces", typemap_lookup_type, WARN_NONE); // Emit the enum Printv(enum_code, typemapLookup(n, "javaclassmodifiers", typemap_lookup_type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers (enum modifiers really) " ", symname, *Char(pure_baseclass) ? // Bases " extends " : "", pure_baseclass, *Char(pure_interfaces) ? // Interfaces " implements " : "", pure_interfaces, " {\n", NIL); if (proxy_flag && is_wrapping_class()) Replaceall(enum_code, "$static ", "static "); else Replaceall(enum_code, "$static ", ""); Delete(scope); } else { if (symname && !Getattr(n, "unnamedinstance")) Printf(constants_code, " // %s \n", symname); // Translate and write javadoc comment for the enum itself if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, " "); if (comment_creation_chatter) Printf(constants_code, "/* This was generated from enumDeclaration() */\n"); Printf(constants_code, Char(doxygen_comments)); Printf(constants_code, "\n"); Delete(doxygen_comments); } } // Emit each enum item Language::enumDeclaration(n); if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper Java enum // Finish the enum declaration // Typemaps are used to generate the enum definition in a similar manner to proxy classes. Printv(enum_code, (enum_feature == ProperEnum) ? ";\n" : "", typemapLookup(n, "javabody", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF), // main body of class typemapLookup(n, "javacode", typemap_lookup_type, WARN_NONE), // extra Java code "}", NIL); Replaceall(enum_code, "$javaclassname", symname); // Substitute $enumvalues - intended usage is for typesafe enums if (Getattr(n, "enumvalues")) Replaceall(enum_code, "$enumvalues", Getattr(n, "enumvalues")); else Replaceall(enum_code, "$enumvalues", ""); if (proxy_flag && is_wrapping_class()) { // Enums defined within the C++ class are defined within the proxy class // Add extra indentation Replaceall(enum_code, "\n", "\n "); Replaceall(enum_code, " \n", "\n"); if (GetFlag(getCurrentClass(), "feature:interface")) Printv(interface_class_code, " ", enum_code, "\n\n", NIL); else Printv(proxy_class_constants_code, " ", enum_code, "\n\n", NIL); } else { // Global enums are defined in their own file String *output_directory = outputDirectory(nspace); String *filen = NewStringf("%s%s.java", output_directory, symname); File *f_enum = NewFile(filen, "w", SWIG_output_files()); if (!f_enum) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the enum file emitBanner(f_enum); if (package || nspace) { Printf(f_enum, "package "); if (package) Printv(f_enum, package, nspace ? "." : "", NIL); if (nspace) Printv(f_enum, nspace, NIL); Printf(f_enum, ";\n"); } Printv(f_enum, typemapLookup(n, "javaimports", typemap_lookup_type, WARN_NONE), // Import statements "\n", enum_code, "\n", NIL); Printf(f_enum, "\n"); Delete(f_enum); Delete(output_directory); } } else { // Wrap C++ enum with simple constant Printf(enum_code, "\n"); if (proxy_flag && is_wrapping_class()) Printv(proxy_class_constants_code, enum_code, NIL); else Printv(module_class_constants_code, enum_code, NIL); } Delete(enum_code); enum_code = NULL; if (proxy_flag && !is_wrapping_class()) { Delete(full_imclass_name); full_imclass_name = 0; } } return SWIG_OK; } /* ---------------------------------------------------------------------- * enumvalueDeclaration() * ---------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "?value", NIL); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); Node *parent = parentNode(n); int unnamedinstance = GetFlag(parent, "unnamedinstance"); String *parent_name = Getattr(parent, "name"); String *nspace = getNSpace(); String *newsymname = 0; String *tmpValue; // Strange hack from parent method if (value) tmpValue = NewString(value); else tmpValue = NewString(name); // Note that this is used in enumValue() amongst other places Setattr(n, "value", tmpValue); // Deal with enum values that are not int int swigtype = SwigType_type(Getattr(n, "type")); if (swigtype == T_BOOL) { const char *val = Equal(Getattr(n, "enumvalue"), "true") ? "1" : "0"; Setattr(n, "enumvalue", val); } else if (swigtype == T_CHAR) { String *val = NewStringf("'%(escape)s'", Getattr(n, "enumvalue")); Setattr(n, "enumvalue", val); Delete(val); } { EnumFeature enum_feature = decodeEnumFeature(parent); if ((enum_feature == SimpleEnum) && GetFlag(parent, "scopedenum")) { newsymname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); symname = newsymname; } // Add to language symbol table String *scope = 0; if (unnamedinstance || !parent_name || enum_feature == SimpleEnum) { String *enumClassPrefix = getEnumClassPrefix(); if (enumClassPrefix) { scope = NewString(""); if (nspace) Printf(scope, "%s.", nspace); Printf(scope, "%s", enumClassPrefix); } else { scope = Copy(constants_interface_name); } } else { scope = getCurrentScopeName(nspace); if (!scope) scope = Copy(Getattr(parent, "sym:name")); else Printf(scope, ".%s", Getattr(parent, "sym:name")); } if (!addSymbol(symname, n, scope)) return SWIG_ERROR; if ((enum_feature == ProperEnum) && parent_name && !unnamedinstance) { if (!GetFlag(n, "firstenumitem")) Printf(enum_code, ",\n"); } // Translate and write javadoc comment if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, " "); if (comment_creation_chatter) Printf(enum_code, "/* This was generated from enumvalueDeclaration() */\n"); Printv(enum_code, Char(doxygen_comments), NIL); Delete(doxygen_comments); } if ((enum_feature == ProperEnum) && parent_name && !unnamedinstance) { // Wrap (non-anonymous) C/C++ enum with a proper Java enum // Emit the enum item. Printf(enum_code, " %s", symname); if (Getattr(n, "enumvalue")) { String *value = enumValue(n); Printf(enum_code, "(%s)", value); Delete(value); } } else { // Wrap C/C++ enums with constant integers or use the typesafe enum pattern SwigType *typemap_lookup_type = parent_name ? parent_name : NewString("enum "); Setattr(n, "type", typemap_lookup_type); const String *tm = typemapLookup(n, "jstype", typemap_lookup_type, WARN_JAVA_TYPEMAP_JSTYPE_UNDEF); String *return_type = Copy(tm); substituteClassname(typemap_lookup_type, return_type); const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); if ((enum_feature == TypesafeEnum) && parent_name && !unnamedinstance) { // Wrap (non-anonymous) enum using the typesafe enum pattern if (Getattr(n, "enumvalue")) { String *value = enumValue(n); Printf(enum_code, " %s final static %s %s = new %s(\"%s\", %s);\n", methodmods, return_type, symname, return_type, symname, value); Delete(value); } else { Printf(enum_code, " %s final static %s %s = new %s(\"%s\");\n", methodmods, return_type, symname, return_type, symname); } } else { // Simple integer constants // Note these are always generated for anonymous enums, no matter what enum_feature is specified // Code generated is the same for SimpleEnum and TypeunsafeEnum -> the class it is generated into is determined later String *value = enumValue(n); Printf(enum_code, " %s final static %s %s = %s;\n", methodmods, return_type, symname, value); Delete(value); } Delete(return_type); } // Add the enum value to the comma separated list being constructed in the enum declaration. String *enumvalues = Getattr(parent, "enumvalues"); if (!enumvalues) Setattr(parent, "enumvalues", Copy(symname)); else Printv(enumvalues, ", ", symname, NIL); Delete(scope); } Delete(newsymname); Delete(tmpValue); Swig_restore(n); return SWIG_OK; } /* ----------------------------------------------------------------------- * constantWrapper() * Used for wrapping constants - #define or %constant. * Also for inline initialised const static primitive type member variables (short, int, double, enums etc). * Java static final variables are generated for these. * If the %javaconst(1) feature is used then the C constant value is used to initialise the Java final variable. * If not, a JNI method is generated to get the C constant value for initialisation of the Java final variable. * However, if the %javaconstvalue feature is used, it overrides all other ways to generate the initialisation. * Also note that this method might be called for wrapping enum items (when the enum is using %javaconst(0)). * ------------------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); SwigType *valuetype = Getattr(n, "valuetype"); ParmList *l = Getattr(n, "parms"); String *tm; String *return_type = NewString(""); String *constants_code = NewString(""); Swig_save("constantWrapper", n, "value", NIL); // Translate and write javadoc comment if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, " "); if (comment_creation_chatter) Printf(constants_code, "/* This was generated from constantWrapper() */\n"); Printv(constants_code, Char(doxygen_comments), NIL); Delete(doxygen_comments); } bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); const String *itemname = (proxy_flag && wrapping_member_flag) ? variable_name : symname; if (!is_enum_item) { String *scope = 0; if (proxy_class_name) { String *nspace = getNSpace(); scope = NewString(""); if (nspace) Printf(scope, "%s.", nspace); Printf(scope, "%s", proxy_class_name); } else { scope = Copy(constants_interface_name); } if (!addSymbol(itemname, n, scope)) return SWIG_ERROR; Delete(scope); } // The %javaconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:java:const"); /* Adjust the enum type for the Swig_typemap_lookup. * We want the same jstype typemap for all the enum items so we use the enum type (parent node). */ if (is_enum_item) { t = Getattr(parentNode(n), "enumtype"); Setattr(n, "type", t); } /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("jstype", l, NULL); /* Get Java return types */ bool classname_substituted_flag = false; if ((tm = Swig_typemap_lookup("jstype", n, "", 0))) { classname_substituted_flag = substituteClassname(t, tm); Printf(return_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(t, 0)); } // Add the stripped quotes back in String *new_value = NewString(""); if (SwigType_type(t) == T_STRING) { Printf(new_value, "\"%s\"", Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } else if (SwigType_type(t) == T_CHAR) { Printf(new_value, "\'%s\'", Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(constants_code, " %s final static %s %s = ", methodmods, return_type, itemname); // Check for the %javaconstvalue feature String *value = Getattr(n, "feature:java:constvalue"); if (value) { Printf(constants_code, "%s;\n", value); } else if (!const_feature_flag) { // Default enum and constant handling will work with any type of C constant and initialises the Java variable from C through a JNI call. if (classname_substituted_flag) { if (SwigType_isenum(t)) { // This handles wrapping of inline initialised const enum static member variables (not when wrapping enum items - ignored later on) Printf(constants_code, "%s.swigToEnum(%s.%s());\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { // This handles function pointers using the %constant directive Printf(constants_code, "new %s(%s.%s(), false);\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } } else { Printf(constants_code, "%s.%s();\n", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } // Each constant and enum value is wrapped with a separate JNI function call SetFlag(n, "feature:immutable"); enum_constant_flag = true; variableWrapper(n); enum_constant_flag = false; } else { // Alternative constant handling will use the C syntax to make a true Java constant and hope that it compiles as Java code if (Getattr(n, "wrappedasconstant")) { if (SwigType_type(valuetype) == T_CHAR) Printf(constants_code, "\'%(escape)s\';\n", Getattr(n, "staticmembervariableHandler:value")); else Printf(constants_code, "%s;\n", Getattr(n, "staticmembervariableHandler:value")); } else { Printf(constants_code, "%s;\n", Getattr(n, "value")); } } // Emit the generated code to appropriate place // Enums only emit the intermediate and JNI methods, so no proxy or module class wrapper methods needed if (!is_enum_item) { if (proxy_flag && wrapping_member_flag) Printv(proxy_class_constants_code, constants_code, NIL); else Printv(module_class_constants_code, constants_code, NIL); } // Cleanup Swig_restore(n); Delete(new_value); Delete(return_type); Delete(constants_code); return SWIG_OK; } /* ----------------------------------------------------------------------------- * insertDirective() * ----------------------------------------------------------------------------- */ virtual int insertDirective(Node *n) { int ret = SWIG_OK; String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); Replaceall(code, "$module", module_class_name); Replaceall(code, "$imclassname", imclass_name); if (!ImportMode && (Cmp(section, "proxycode") == 0)) { if (proxy_class_code) { Swig_typemap_replace_embedded_typemap(code, n); int offset = Len(code) > 0 && *Char(code) == '\n' ? 1 : 0; Printv(proxy_class_code, Char(code) + offset, "\n", NIL); } } else { ret = Language::insertDirective(n); } return ret; } /* ----------------------------------------------------------------------------- * pragmaDirective() * * Valid Pragmas: * jniclassbase - base (extends) for the intermediary class * jniclasspackage - package in which to generate the intermediary class * jniclassclassmodifiers - class modifiers for the intermediary class * jniclasscode - text (java code) is copied verbatim to the intermediary class * jniclassimports - import statements for the intermediary class * jniclassinterfaces - interface (implements) for the intermediary class * * modulebase - base (extends) for the module class * moduleclassmodifiers - class modifiers for the module class * modulecode - text (java code) is copied verbatim to the module class * moduleimports - import statements for the module class * moduleinterfaces - interface (implements) for the module class * * ----------------------------------------------------------------------------- */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *code = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "java") == 0) { String *strvalue = NewString(value); Replaceall(strvalue, "\\\"", "\""); if (Strcmp(code, "jniclassbase") == 0) { Delete(imclass_baseclass); imclass_baseclass = Copy(strvalue); } else if (Strcmp(code, "jniclasspackage") == 0) { Delete(imclass_package); imclass_package = Copy(strvalue); String *imclass_class_package_jniname = makeValidJniName(imclass_package); Printv(jnipackage, imclass_class_package_jniname, NIL); Delete(imclass_class_package_jniname); Replaceall(jnipackage, NSPACE_SEPARATOR, "_"); Append(jnipackage, "_"); String *wrapper_name = NewString(""); String *imclass_class_jniname = makeValidJniName(imclass_name); Printf(wrapper_name, "Java_%s%s_%%f", jnipackage, imclass_class_jniname); Delete(imclass_class_jniname); Swig_name_unregister("wrapper"); Swig_name_register("wrapper", Char(wrapper_name)); Delete(wrapper_name); } else if (Strcmp(code, "jniclassclassmodifiers") == 0) { Delete(imclass_class_modifiers); imclass_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "jniclasscode") == 0) { Printf(imclass_class_code, "%s\n", strvalue); } else if (Strcmp(code, "jniclassimports") == 0) { Delete(imclass_imports); imclass_imports = Copy(strvalue); } else if (Strcmp(code, "jniclassinterfaces") == 0) { Delete(imclass_interfaces); imclass_interfaces = Copy(strvalue); } else if (Strcmp(code, "modulebase") == 0) { Delete(module_baseclass); module_baseclass = Copy(strvalue); } else if (Strcmp(code, "moduleclassmodifiers") == 0) { Delete(module_class_modifiers); module_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "modulecode") == 0) { Printf(module_class_code, "%s\n", strvalue); } else if (Strcmp(code, "moduleimports") == 0) { Delete(module_imports); module_imports = Copy(strvalue); } else if (Strcmp(code, "moduleinterfaces") == 0) { Delete(module_interfaces); module_interfaces = Copy(strvalue); } else if (Strcmp(code, "moduleimport") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use the moduleimports pragma.\n"); } else if (Strcmp(code, "moduleinterface") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use the moduleinterfaces pragma.\n"); } else if (Strcmp(code, "modulemethodmodifiers") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%javamethodmodifiers.\n"); } else if (Strcmp(code, "allshadowimport") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javaimports).\n"); } else if (Strcmp(code, "allshadowcode") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javacode).\n"); } else if (Strcmp(code, "allshadowbase") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javabase).\n"); } else if (Strcmp(code, "allshadowinterface") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javainterfaces).\n"); } else if (Strcmp(code, "allshadowclassmodifiers") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javaclassmodifiers).\n"); } else if (proxy_flag) { if (Strcmp(code, "shadowcode") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javacode).\n"); } else if (Strcmp(code, "shadowimport") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javaimports).\n"); } else if (Strcmp(code, "shadowbase") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javabase).\n"); } else if (Strcmp(code, "shadowinterface") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javainterfaces).\n"); } else if (Strcmp(code, "shadowclassmodifiers") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javaclassmodifiers).\n"); } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } Delete(strvalue); } } return Language::pragmaDirective(n); } /* ----------------------------------------------------------------------------- * getQualifiedInterfaceName() * ----------------------------------------------------------------------------- */ String *getQualifiedInterfaceName(Node *n) { String *ret = Getattr(n, "interface:qname"); if (!ret) { String *nspace = Getattr(n, "sym:nspace"); String *symname = Getattr(n, "interface:name"); if (nspace) { if (package) ret = NewStringf("%s.%s.%s", package, nspace, symname); else ret = NewStringf("%s.%s", nspace, symname); } else { ret = Copy(symname); } Setattr(n, "interface:qname", ret); } return ret; } /* ----------------------------------------------------------------------------- * getInterfaceName() * ----------------------------------------------------------------------------- */ String *getInterfaceName(SwigType *t, bool qualified) { String *interface_name = NULL; if (proxy_flag) { Node *n = classLookup(t); if (n && Getattr(n, "interface:name")) interface_name = qualified ? getQualifiedInterfaceName(n) : Getattr(n, "interface:name"); } return interface_name; } /* ----------------------------------------------------------------------------- * addInterfaceNameAndUpcasts() * ----------------------------------------------------------------------------- */ void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, SwigType *c_classname) { List *keys = Keys(base_list); for (Iterator it = First(keys); it.item; it = Next(it)) { Node *base = Getattr(base_list, it.item); SwigType *c_baseclassname = Getattr(base, "name"); String *interface_name = Getattr(base, "interface:name"); if (Len(interface_list)) Append(interface_list, ", "); Append(interface_list, interface_name); Node *attributes = NewHash(); String *interface_code = Copy(typemapLookup(base, "javainterfacecode", Getattr(base, "classtypeobj"), WARN_JAVA_TYPEMAP_INTERFACECODE_UNDEF, attributes)); String *cptr_method_name = 0; if (interface_code) { Replaceall(interface_code, "$interfacename", interface_name); Printv(interface_upcasts, interface_code, NIL); cptr_method_name = Copy(Getattr(attributes, "tmap:javainterfacecode:cptrmethod")); } if (!cptr_method_name) cptr_method_name = NewStringf("%s_GetInterfaceCPtr", interface_name); Replaceall(cptr_method_name, ".", "_"); Replaceall(cptr_method_name, "$interfacename", interface_name); String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), cptr_method_name); upcastsCode(smart, upcast_method_name, c_classname, c_baseclassname); Delete(upcast_method_name); Delete(cptr_method_name); Delete(interface_code); } Delete(keys); } /* ----------------------------------------------------------------------------- * upcastsCode() * * Add code for C++ casting to base class * ----------------------------------------------------------------------------- */ void upcastsCode(SwigType *smart, String *upcast_method_name, SwigType *c_classname, SwigType *c_baseclassname) { String *jniname = makeValidJniName(upcast_method_name); String *wname = Swig_name_wrapper(jniname); Printf(imclass_cppcasts_code, " public final static native long %s(long jarg1);\n", upcast_method_name); String *classname = SwigType_namestr(c_classname); String *baseclassname = SwigType_namestr(c_baseclassname); if (smart) { String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(smart); // TODO: SwigType_typedef_resolve_all on a String instead of SwigType is incorrect for templates SwigType *rclassname = SwigType_typedef_resolve_all(classname); SwigType *rbaseclassname = SwigType_typedef_resolve_all(baseclassname); Replaceall(bsmartnamestr, rclassname, rbaseclassname); Printv(upcasts_code, "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", " jlong baseptr = 0;\n" " ", smartnamestr, " *argp1;\n" " (void)jenv;\n" " (void)jcls;\n" " argp1 = *(", smartnamestr, " **)&jarg1;\n" " *(", bsmartnamestr, " **)&baseptr = argp1 ? new ", bsmartnamestr, "(*argp1) : 0;\n" " return baseptr;\n" "}\n", "\n", NIL); Delete(rbaseclassname); Delete(rclassname); Delete(bsmartnamestr); Delete(smartnamestr); } else { Printv(upcasts_code, "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", " jlong baseptr = 0;\n" " (void)jenv;\n" " (void)jcls;\n" " *(", baseclassname, " **)&baseptr = *(", classname, " **)&jarg1;\n" " return baseptr;\n" "}\n", "\n", NIL); } Delete(baseclassname); Delete(classname); Delete(wname); Delete(jniname); } /* ----------------------------------------------------------------------------- * emitProxyClassDefAndCPPCasts() * ----------------------------------------------------------------------------- */ void emitProxyClassDefAndCPPCasts(Node *n) { SwigType *c_classname = Getattr(n, "name"); SwigType *c_baseclassname = NULL; String *baseclass = NULL; String *interface_list = NewStringEmpty(); String *interface_upcasts = NewStringEmpty(); SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); bool feature_director = Swig_directorclass(n) ? true : false; bool has_outerclass = Getattr(n, "nested:outer") != 0 && !GetFlag(n, "feature:flatnested"); SwigType *smart = Swig_cparse_smartptr(n); // Inheritance from pure Java classes Node *attributes = NewHash(); const String *pure_baseclass = typemapLookup(n, "javabase", typemap_lookup_type, WARN_NONE, attributes); bool purebase_replace = GetFlag(attributes, "tmap:javabase:replace") ? true : false; bool purebase_notderived = GetFlag(attributes, "tmap:javabase:notderived") ? true : false; Delete(attributes); // C++ inheritance if (!purebase_replace) { List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item) { if (!(GetFlag(base.item, "feature:ignore") || Getattr(base.item, "feature:interface"))) { SwigType *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { String *name = getProxyName(baseclassname); if (name) { c_baseclassname = baseclassname; baseclass = name; } } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); Swig_warning(WARN_JAVA_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Java.\n", SwigType_namestr(proxyclassname), SwigType_namestr(baseclassname)); } } base = Next(base); } } } Hash *interface_bases = Getattr(n, "interface:bases"); if (interface_bases) addInterfaceNameAndUpcasts(smart, interface_list, interface_upcasts, interface_bases, c_classname); bool derived = baseclass != 0; if (derived && purebase_notderived) pure_baseclass = empty_string; const String *wanted_base = baseclass ? baseclass : pure_baseclass; if (purebase_replace) { wanted_base = pure_baseclass; derived = false; baseclass = NULL; if (purebase_notderived) Swig_error(Getfile(n), Getline(n), "The javabase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); } else if (Len(pure_baseclass) > 0 && Len(baseclass) > 0) { Swig_warning(WARN_JAVA_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Java. " "Perhaps you need one of the 'replace' or 'notderived' attributes in the javabase typemap?\n", typemap_lookup_type, pure_baseclass); } // Pure Java interfaces const String *pure_interfaces = typemapLookup(n, "javainterfaces", typemap_lookup_type, WARN_NONE); if (*Char(interface_list) && *Char(pure_interfaces)) Append(interface_list, ", "); Append(interface_list, pure_interfaces); // Start writing the proxy class if (!has_outerclass) // Import statements Printv(proxy_class_def, typemapLookup(n, "javaimports", typemap_lookup_type, WARN_NONE),"\n", NIL); // Translate and write javadoc comment if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, 0); if (comment_creation_chatter) Printf(proxy_class_def, "/* This was generated from emitProxyClassDefAndCPPCasts() */\n"); Printv(proxy_class_def, Char(doxygen_comments), NIL); Delete(doxygen_comments); } if (has_outerclass) Printv(proxy_class_def, "static ", NIL); // C++ nested classes correspond to static java classes Printv(proxy_class_def, typemapLookup(n, "javaclassmodifiers", typemap_lookup_type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " $javaclassname", // Class name and bases (*Char(wanted_base)) ? " extends " : "", wanted_base, *Char(interface_list) ? // Pure Java interfaces " implements " : "", interface_list, " {", derived ? typemapLookup(n, "javabody_derived", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF) : // main body of class typemapLookup(n, "javabody", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF), // main body of class NIL); // C++ destructor is wrapped by the delete method // Note that the method name is specified in a typemap attribute called methodname String *destruct = NewString(""); const String *tm = NULL; attributes = NewHash(); const String *destruct_methodname = NULL; const String *destruct_methodmodifiers = NULL; const String *destruct_parameters = NULL; if (derived) { tm = typemapLookup(n, "javadestruct_derived", typemap_lookup_type, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:javadestruct_derived:methodname"); destruct_methodmodifiers = Getattr(attributes, "tmap:javadestruct_derived:methodmodifiers"); destruct_parameters = Getattr(attributes, "tmap:javadestruct_derived:parameters"); } else { tm = typemapLookup(n, "javadestruct", typemap_lookup_type, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:javadestruct:methodname"); destruct_methodmodifiers = Getattr(attributes, "tmap:javadestruct:methodmodifiers"); destruct_parameters = Getattr(attributes, "tmap:javadestruct:parameters"); } if (tm && *Char(tm)) { if (!destruct_methodname) { Swig_error(Getfile(n), Getline(n), "No methodname attribute defined in javadestruct%s typemap for %s\n", (derived ? "_derived" : ""), proxy_class_name); } if (!destruct_methodmodifiers) { Swig_error(Getfile(n), Getline(n), "No methodmodifiers attribute defined in javadestruct%s typemap for %s.\n", (derived ? "_derived" : ""), proxy_class_name); } if (!destruct_parameters) destruct_parameters = empty_string; } // Emit the finalize and delete methods if (tm) { // Finalize method if (*Char(destructor_call)) { Printv(proxy_class_def, typemapLookup(n, "javafinalize", typemap_lookup_type, WARN_NONE), NIL); } // delete method Printv(destruct, tm, NIL); if (*Char(destructor_call)) Replaceall(destruct, "$jnicall", destructor_call); else Replaceall(destruct, "$jnicall", "throw new UnsupportedOperationException(\"C++ destructor does not have public access\")"); if (*Char(destruct)) { Printv(proxy_class_def, "\n ", NIL); const String *methodmods = Getattr(n, "destructmethodmodifiers"); if (methodmods) Printv(proxy_class_def, methodmods, NIL); else Printv(proxy_class_def, destruct_methodmodifiers, NIL); Printv(proxy_class_def, " void ", destruct_methodname, "(", destruct_parameters, ")", destructor_throws_clause, " ", destruct, "\n", NIL); } } if (*Char(interface_upcasts)) Printv(proxy_class_def, interface_upcasts, NIL); /* Insert directordisconnect typemap, if this class has directors enabled */ /* Also insert the swigTakeOwnership and swigReleaseOwnership methods */ if (feature_director) { String *destruct_jnicall, *release_jnicall, *take_jnicall; String *changeown_method_name = Swig_name_member(getNSpace(), getClassPrefix(), "change_ownership"); destruct_jnicall = NewStringf("%s()", destruct_methodname); release_jnicall = NewStringf("%s.%s(this, swigCPtr, false)", full_imclass_name, changeown_method_name); take_jnicall = NewStringf("%s.%s(this, swigCPtr, true)", full_imclass_name, changeown_method_name); emitCodeTypemap(n, false, typemap_lookup_type, "directordisconnect", "methodname", destruct_jnicall); emitCodeTypemap(n, false, typemap_lookup_type, "directorowner_release", "methodname", release_jnicall); emitCodeTypemap(n, false, typemap_lookup_type, "directorowner_take", "methodname", take_jnicall); Delete(destruct_jnicall); Delete(changeown_method_name); Delete(release_jnicall); Delete(take_jnicall); } Delete(interface_upcasts); Delete(interface_list); Delete(attributes); Delete(destruct); // Emit extra user code Printv(proxy_class_def, typemapLookup(n, "javacode", typemap_lookup_type, WARN_NONE), // extra Java code "\n", NIL); if (derived) { String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); upcastsCode(smart, upcast_method_name, c_classname, c_baseclassname); Delete(upcast_method_name); } Delete(smart); } /* ---------------------------------------------------------------------- * emitInterfaceDeclaration() * ---------------------------------------------------------------------- */ void emitInterfaceDeclaration(Node *n, String *interface_name, File *f_interface, String *nspace) { if (package || nspace) { Printf(f_interface, "package "); if (package) Printv(f_interface, package, nspace ? "." : "", NIL); if (nspace) Printv(f_interface, nspace, NIL); Printf(f_interface, ";\n"); } Printv(f_interface, typemapLookup(n, "javaimports", Getattr(n, "classtypeobj"), WARN_NONE), "\n", NIL); Printf(f_interface, "public interface %s", interface_name); if (List *baselist = Getattr(n, "bases")) { String *bases = 0; for (Iterator base = First(baselist); base.item; base = Next(base)) { if (GetFlag(base.item, "feature:ignore") || !Getattr(base.item, "feature:interface")) continue; // TODO: warn about skipped non-interface bases String *base_iname = Getattr(base.item, "interface:name"); if (!bases) bases = Copy(base_iname); else { Append(bases, ", "); Append(bases, base_iname); } } if (bases) { Printv(f_interface, " extends ", bases, NIL); Delete(bases); } } Printf(f_interface, " {\n"); Node *attributes = NewHash(); String *interface_code = Copy(typemapLookup(n, "javainterfacecode", Getattr(n, "classtypeobj"), WARN_JAVA_TYPEMAP_INTERFACECODE_UNDEF, attributes)); if (interface_code) { String *interface_declaration = Copy(Getattr(attributes, "tmap:javainterfacecode:declaration")); if (interface_declaration) { Replaceall(interface_declaration, "$interfacename", interface_name); Printv(f_interface, interface_declaration, NIL); Delete(interface_declaration); } Delete(interface_code); } } /* ---------------------------------------------------------------------- * classDeclaration() * ---------------------------------------------------------------------- */ int classDeclaration(Node *n) { return Language::classDeclaration(n); } /* ---------------------------------------------------------------------- * classHandler() * ---------------------------------------------------------------------- */ virtual int classHandler(Node *n) { File *f_proxy = NULL; File *f_interface = NULL; String *old_proxy_class_name = proxy_class_name; String *old_full_proxy_class_name = full_proxy_class_name; String *old_full_imclass_name = full_imclass_name; String *old_destructor_call = destructor_call; String *old_destructor_throws_clause = destructor_throws_clause; String *old_proxy_class_constants_code = proxy_class_constants_code; String *old_proxy_class_def = proxy_class_def; String *old_proxy_class_code = proxy_class_code; bool has_outerclass = Getattr(n, "nested:outer") && !GetFlag(n, "feature:flatnested"); String *old_interface_class_code = interface_class_code; interface_class_code = 0; if (proxy_flag) { proxy_class_name = NewString(Getattr(n, "sym:name")); String *nspace = getNSpace(); constructIntermediateClassName(n); String *outerClassesPrefix = 0; if (Node *outer = Getattr(n, "nested:outer")) { outerClassesPrefix = Copy(Getattr(outer, "sym:name")); for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { Push(outerClassesPrefix, "."); Push(outerClassesPrefix, Getattr(outer, "sym:name")); } } if (!nspace) { full_proxy_class_name = outerClassesPrefix ? NewStringf("%s.%s", outerClassesPrefix, proxy_class_name) : NewStringf("%s", proxy_class_name); if (Cmp(proxy_class_name, imclass_name) == 0) { Printf(stderr, "Class name cannot be equal to intermediary class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } if (Cmp(proxy_class_name, module_class_name) == 0) { Printf(stderr, "Class name cannot be equal to module class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } } else { if (outerClassesPrefix) { if (package) full_proxy_class_name = NewStringf("%s.%s.%s.%s", package, nspace, outerClassesPrefix, proxy_class_name); else full_proxy_class_name = NewStringf("%s.%s.%s", nspace, outerClassesPrefix, proxy_class_name); } else { if (package) full_proxy_class_name = NewStringf("%s.%s.%s", package, nspace, proxy_class_name); else full_proxy_class_name = NewStringf("%s.%s", nspace, proxy_class_name); } } String *interface_name = Getattr(n, "feature:interface") ? Getattr(n, "interface:name") : 0; if (outerClassesPrefix) { String *fnspace = nspace ? NewStringf("%s.%s", nspace, outerClassesPrefix) : outerClassesPrefix; if (!addSymbol(proxy_class_name, n, fnspace)) return SWIG_ERROR; if (interface_name && !addInterfaceSymbol(interface_name, n, fnspace)) return SWIG_ERROR; if (nspace) Delete(fnspace); Delete(outerClassesPrefix); } else { if (!addSymbol(proxy_class_name, n, nspace)) return SWIG_ERROR; if (interface_name && !addInterfaceSymbol(interface_name, n, nspace)) return SWIG_ERROR; } // Each outer proxy class goes into a separate file if (!has_outerclass) { String *output_directory = outputDirectory(nspace); String *filen = NewStringf("%s%s.java", output_directory, proxy_class_name); f_proxy = NewFile(filen, "w", SWIG_output_files()); if (!f_proxy) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); Delete(output_directory); // Start writing out the proxy class file emitBanner(f_proxy); if (package || nspace) { Printf(f_proxy, "package "); if (package) Printv(f_proxy, package, nspace ? "." : "", NIL); if (nspace) Printv(f_proxy, nspace, NIL); Printf(f_proxy, ";\n"); } } else ++nesting_depth; proxy_class_def = NewString(""); proxy_class_code = NewString(""); destructor_call = NewString(""); destructor_throws_clause = NewString(""); proxy_class_constants_code = NewString(""); if (Getattr(n, "feature:interface")) { interface_class_code = NewString(""); String *output_directory = outputDirectory(nspace); String *filen = NewStringf("%s%s.java", output_directory, interface_name); f_interface = NewFile(filen, "w", SWIG_output_files()); if (!f_interface) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, filen); // file name ownership goes to the list emitBanner(f_interface); emitInterfaceDeclaration(n, interface_name, interface_class_code, nspace); Delete(filen); Delete(output_directory); } } Language::classHandler(n); if (proxy_flag) { emitProxyClassDefAndCPPCasts(n); String *javaclazzname = Swig_name_member(getNSpace(), getClassPrefix(), ""); // mangled full proxy class name Replaceall(proxy_class_def, "$javaclassname", proxy_class_name); Replaceall(proxy_class_code, "$javaclassname", proxy_class_name); Replaceall(proxy_class_constants_code, "$javaclassname", proxy_class_name); Replaceall(interface_class_code, "$javaclassname", proxy_class_name); Replaceall(proxy_class_def, "$javaclazzname", javaclazzname); Replaceall(proxy_class_code, "$javaclazzname", javaclazzname); Replaceall(proxy_class_constants_code, "$javaclazzname", javaclazzname); Replaceall(interface_class_code, "$javaclazzname", javaclazzname); Replaceall(proxy_class_def, "$module", module_class_name); Replaceall(proxy_class_code, "$module", module_class_name); Replaceall(proxy_class_constants_code, "$module", module_class_name); Replaceall(interface_class_code, "$module", module_class_name); Replaceall(proxy_class_def, "$imclassname", full_imclass_name); Replaceall(proxy_class_code, "$imclassname", full_imclass_name); Replaceall(proxy_class_constants_code, "$imclassname", full_imclass_name); Replaceall(interface_class_code, "$imclassname", full_imclass_name); if (!has_outerclass) Printv(f_proxy, proxy_class_def, proxy_class_code, NIL); else { Swig_offset_string(proxy_class_def, nesting_depth); Append(old_proxy_class_code, proxy_class_def); Swig_offset_string(proxy_class_code, nesting_depth); Append(old_proxy_class_code, proxy_class_code); } // Write out all the constants if (Len(proxy_class_constants_code) != 0) { if (!has_outerclass) Printv(f_proxy, proxy_class_constants_code, NIL); else { Swig_offset_string(proxy_class_constants_code, nesting_depth); Append(old_proxy_class_code, proxy_class_constants_code); } } if (!has_outerclass) { Printf(f_proxy, "}\n"); Delete(f_proxy); f_proxy = NULL; } else { for (int i = 0; i < nesting_depth; ++i) Append(old_proxy_class_code, " "); Append(old_proxy_class_code, "}\n\n"); --nesting_depth; } if (f_interface) { Printv(f_interface, interface_class_code, "}\n", NIL); Delete(f_interface); f_interface = 0; } emitDirectorExtraMethods(n); Delete(interface_class_code); interface_class_code = old_interface_class_code; Delete(javaclazzname); Delete(proxy_class_name); proxy_class_name = old_proxy_class_name; Delete(full_proxy_class_name); full_proxy_class_name = old_full_proxy_class_name; Delete(full_imclass_name); full_imclass_name = old_full_imclass_name; Delete(destructor_call); destructor_call = old_destructor_call; Delete(destructor_throws_clause); destructor_throws_clause = old_destructor_throws_clause; Delete(proxy_class_constants_code); proxy_class_constants_code = old_proxy_class_constants_code; Delete(proxy_class_def); proxy_class_def = old_proxy_class_def; Delete(proxy_class_code); proxy_class_code = old_proxy_class_code; } return SWIG_OK; } /* ---------------------------------------------------------------------- * memberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { member_func_flag = true; Language::memberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } member_func_flag = false; return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmemberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { static_flag = true; member_func_flag = true; Language::staticmemberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } static_flag = false; member_func_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * proxyClassFunctionHandler() * * Function called for creating a Java wrapper function around a c++ function in the * proxy class. Used for both static and non-static C++ class functions. * C++ class static functions map to Java static functions. * Two extra attributes in the Node must be available. These are "proxyfuncname" - * the name of the Java class proxy function, which in turn will call "imfuncname" - * the intermediary (JNI) function name in the intermediary class. * ----------------------------------------------------------------------------- */ void proxyClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *intermediary_function_name = Getattr(n, "imfuncname"); String *proxy_function_name = Getattr(n, "proxyfuncname"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); bool is_interface = Getattr(parentNode(n), "feature:interface") != 0 && !static_flag && Getattr(n, "interface:owner") == 0; if (!proxy_flag) return; // Wrappers not wanted for some methods where the parameters cannot be overloaded in Java if (Getattr(n, "overload:ignore")) return; // Don't generate proxy method for additional explicitcall method used in directors if (GetFlag(n, "explicitcall")) return; if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("jtype", l, NULL); Swig_typemap_attach_parms("jstype", l, NULL); Swig_typemap_attach_parms("javain", l, NULL); /* Get return types */ if ((tm = Swig_typemap_lookup("jstype", n, "", 0))) { // Note that in the case of polymorphic (covariant) return types, the method's return type is changed to be the base of the C++ return type SwigType *covariant = Getattr(n, "covariant"); substituteClassname(covariant ? covariant : t, tm); Printf(return_type, "%s", tm); if (covariant) Swig_warning(WARN_JAVA_COVARIANT_RET, input_file, line_number, "Covariant return types not supported in Java. Proxy method will return %s.\n", SwigType_str(covariant, 0)); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(t, 0)); } if (wrapping_member_flag && !enum_constant_flag) { // For wrapping member variables (Javabean setter) setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(getNSpace(), Swig_name_member(0, getClassPrefix(), variable_name))) == 0); } // Translate and write javadoc comment if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, " "); if (comment_creation_chatter) Printf(function_code, "/* This was generated from proxyclassfunctionhandler() */\n"); Printv(function_code, Char(doxygen_comments), NIL); Delete(doxygen_comments); } /* Start generating the proxy function */ const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(function_code, " %s ", methodmods); if (static_flag) Printf(function_code, "static "); Printf(function_code, "%s %s(", return_type, proxy_function_name); if (is_interface) Printf(interface_class_code, " %s %s(", return_type, proxy_function_name); Printv(imcall, full_imclass_name, ".$imfuncname(", NIL); if (!static_flag) { Printf(imcall, "swigCPtr"); String *this_type = Copy(getClassType()); String *name = NewString("jself"); String *qualifier = Getattr(n, "qualifier"); if (qualifier) SwigType_push(this_type, qualifier); SwigType_add_pointer(this_type); Parm *this_parm = NewParm(this_type, name, n); Swig_typemap_attach_parms("jtype", this_parm, NULL); Swig_typemap_attach_parms("jstype", this_parm, NULL); if (prematureGarbageCollectionPreventionParameter(this_type, this_parm)) Printf(imcall, ", this"); Delete(this_parm); Delete(name); Delete(this_type); } emit_mark_varargs(l); int gencomma = !static_flag; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* Ignore the 'this' argument for variable wrappers */ if (!(variable_wrapper_flag && i == 0) || static_flag) { SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Java parameter type */ if ((tm = Getattr(p, "tmap:jstype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, setter_flag); // Use typemaps to transform type used in Java proxy wrapper (in proxy class) to type used in JNI function (in intermediary class) if ((tm = Getattr(p, "tmap:javain"))) { addThrows(n, "tmap:javain", p); substituteClassname(pt, tm); Replaceall(tm, "$javainput", arg); String *pre = Getattr(p, "tmap:javain:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$javainput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:javain:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$javainput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, "No javain typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma >= 2) { Printf(function_code, ", "); if (is_interface) Printf(interface_class_code, ", "); } gencomma = 2; Printf(function_code, "%s %s", param_type, arg); if (is_interface) Printf(interface_class_code, "%s %s", param_type, arg); if (prematureGarbageCollectionPreventionParameter(pt, p)) { String *pgcppname = Getattr(p, "tmap:javain:pgcppname"); if (pgcppname) { String *argname = Copy(pgcppname); Replaceall(argname, "$javainput", arg); Printf(imcall, ", %s", argname); Delete(argname); } else { Printf(imcall, ", %s", arg); } } Delete(arg); Delete(param_type); } p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); // Transform return type used in JNI function (in intermediary class) to type used in Java wrapper function (in proxy class) if ((tm = Swig_typemap_lookup("javaout", n, "", 0))) { addThrows(n, "tmap:javaout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; if (is_pre_code || is_post_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } Insert(tm, 0, "{"); Printf(tm, "\n }"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); // For director methods: generate code to selectively make a normal polymorphic call or // an explicit method call - needed to prevent infinite recursion calls in director methods. Node *explicit_n = Getattr(n, "explicitcallnode"); if (explicit_n) { String *ex_overloaded_name = getOverloadedName(explicit_n); String *ex_intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), ex_overloaded_name); String *ex_imcall = Copy(imcall); Replaceall(ex_imcall, "$imfuncname", ex_intermediary_function_name); Replaceall(imcall, "$imfuncname", intermediary_function_name); String *excode = NewString(""); if (!Cmp(return_type, "void")) Printf(excode, "if (getClass() == %s.class) %s; else %s", proxy_class_name, imcall, ex_imcall); else Printf(excode, "(getClass() == %s.class) ? %s : %s", proxy_class_name, imcall, ex_imcall); Clear(imcall); Printv(imcall, excode, NIL); Delete(ex_overloaded_name); Delete(excode); } else { Replaceall(imcall, "$imfuncname", intermediary_function_name); } Replaceall(tm, "$jnicall", imcall); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF, input_file, line_number, "No javaout typemap defined for %s\n", SwigType_str(t, 0)); } if (is_interface) { Printf(interface_class_code, ")"); generateThrowsClause(n, interface_class_code); Printf(interface_class_code, ";\n"); } generateThrowsClause(n, function_code); Printf(function_code, " %s\n\n", tm ? tm : empty_string); Printv(proxy_class_code, function_code, NIL); Delete(pre_code); Delete(post_code); Delete(function_code); Delete(return_type); Delete(imcall); } /* ---------------------------------------------------------------------- * constructorHandler() * ---------------------------------------------------------------------- */ virtual int constructorHandler(Node *n) { ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *function_code = NewString(""); String *helper_code = NewString(""); // Holds code for the constructor helper method generated only when the javain typemap has code in the pre or post attributes String *helper_args = NewString(""); String *pre_code = NewString(""); String *post_code = NewString(""); String *im_return_type = NewString(""); bool feature_director = (parentNode(n) && Swig_directorclass(n)); Language::constructorHandler(n); // Wrappers not wanted for some methods where the parameters cannot be overloaded in Java if (Getattr(n, "overload:ignore")) return SWIG_OK; if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *mangled_overname = Swig_name_construct(getNSpace(), overloaded_name); String *imcall = NewString(""); const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); tm = Getattr(n, "tmap:jtype"); // typemaps were attached earlier to the node Printf(im_return_type, "%s", tm); // Translate and write javadoc comment if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, " "); if (comment_creation_chatter) Printf(function_code, "/* This was generated from constructionhandler() */\n"); Printv(function_code, Char(doxygen_comments), NIL); Delete(doxygen_comments); } Printf(function_code, " %s %s(", methodmods, proxy_class_name); Printf(helper_code, " static private %s SwigConstruct%s(", im_return_type, proxy_class_name); Printv(imcall, full_imclass_name, ".", mangled_overname, "(", NIL); /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("jtype", l, NULL); Swig_typemap_attach_parms("jstype", l, NULL); Swig_typemap_attach_parms("javain", l, NULL); emit_mark_varargs(l); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Java parameter type */ if ((tm = Getattr(p, "tmap:jstype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, false); // Use typemaps to transform type used in Java wrapper function (in proxy class) to type used in JNI function (in intermediary class) if ((tm = Getattr(p, "tmap:javain"))) { addThrows(n, "tmap:javain", p); substituteClassname(pt, tm); Replaceall(tm, "$javainput", arg); String *pre = Getattr(p, "tmap:javain:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$javainput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:javain:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$javainput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, "No javain typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma) { Printf(function_code, ", "); Printf(helper_code, ", "); Printf(helper_args, ", "); } Printf(function_code, "%s %s", param_type, arg); Printf(helper_code, "%s %s", param_type, arg); Printf(helper_args, "%s", arg); ++gencomma; if (prematureGarbageCollectionPreventionParameter(pt, p)) { String *pgcppname = Getattr(p, "tmap:javain:pgcppname"); if (pgcppname) { String *argname = Copy(pgcppname); Replaceall(argname, "$javainput", arg); Printf(imcall, ", %s", argname); Delete(argname); } else { Printf(imcall, ", %s", arg); } } Delete(arg); Delete(param_type); p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); Printf(helper_code, ")"); generateThrowsClause(n, function_code); /* Insert the javaconstruct typemap, doing the replacement for $directorconnect, as needed */ Hash *attributes = NewHash(); String *typemap_lookup_type = Getattr(getCurrentClass(), "classtypeobj"); String *construct_tm = Copy(typemapLookup(n, "javaconstruct", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVACONSTRUCT_UNDEF, attributes)); if (construct_tm) { if (!feature_director) { Replaceall(construct_tm, "$directorconnect", ""); } else { String *connect_attr = Getattr(attributes, "tmap:javaconstruct:directorconnect"); if (connect_attr) { Replaceall(construct_tm, "$directorconnect", connect_attr); } else { Swig_warning(WARN_JAVA_NO_DIRECTORCONNECT_ATTR, input_file, line_number, "\"directorconnect\" attribute missing in %s \"javaconstruct\" typemap.\n", Getattr(n, "name")); Replaceall(construct_tm, "$directorconnect", ""); } } Printv(function_code, " ", construct_tm, "\n", NIL); } bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; if (is_pre_code || is_post_code) { generateThrowsClause(n, helper_code); Printf(helper_code, " {\n"); if (is_pre_code) { Printv(helper_code, pre_code, "\n", NIL); } if (is_post_code) { Printf(helper_code, " try {\n"); Printv(helper_code, " return ", imcall, ";\n", NIL); Printv(helper_code, " } finally {\n", post_code, "\n }", NIL); } else { Printv(helper_code, " return ", imcall, ";", NIL); } Printf(helper_code, "\n }\n"); String *helper_name = NewStringf("%s.SwigConstruct%s(%s)", proxy_class_name, proxy_class_name, helper_args); Printv(proxy_class_code, helper_code, "\n", NIL); Replaceall(function_code, "$imcall", helper_name); Delete(helper_name); } else { Replaceall(function_code, "$imcall", imcall); } Printv(proxy_class_code, function_code, "\n", NIL); Delete(helper_args); Delete(im_return_type); Delete(pre_code); Delete(post_code); Delete(construct_tm); Delete(attributes); Delete(overloaded_name); Delete(imcall); } return SWIG_OK; } /* ---------------------------------------------------------------------- * destructorHandler() * ---------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); String *symname = Getattr(n, "sym:name"); if (proxy_flag) { Printv(destructor_call, full_imclass_name, ".", Swig_name_destroy(getNSpace(), symname), "(swigCPtr)", NIL); generateThrowsClause(n, destructor_throws_clause); const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); if (methodmods) Setattr(getCurrentClass(), "destructmethodmodifiers", methodmods); } return SWIG_OK; } /* ---------------------------------------------------------------------- * membervariableHandler() * ---------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; variable_wrapper_flag = true; Language::membervariableHandler(n); wrapping_member_flag = false; variable_wrapper_flag = false; return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmembervariableHandler() * ---------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; static_flag = true; Language::staticmembervariableHandler(n); wrapping_member_flag = false; static_flag = false; return SWIG_OK; } /* ---------------------------------------------------------------------- * memberconstantHandler() * ---------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; Language::memberconstantHandler(n); wrapping_member_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * getOverloadedName() * ----------------------------------------------------------------------------- */ String *getOverloadedName(Node *n) { /* Although JNI functions are designed to handle overloaded Java functions, * a Java long is used for all classes in the SWIG intermediary class. * The intermediary class methods are thus mangled when overloaded to give * a unique name. */ String *overloaded_name = NewStringf("%s", Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Printv(overloaded_name, Getattr(n, "sym:overname"), NIL); } return overloaded_name; } /* ----------------------------------------------------------------------------- * moduleClassFunctionHandler() * ----------------------------------------------------------------------------- */ void moduleClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); int num_arguments = 0; String *overloaded_name = getOverloadedName(n); String *func_name = NULL; bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); // Translate and write javadoc comment if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, " "); if (comment_creation_chatter) Printf(function_code, "/* This was generated from moduleClassFunctionHandler() */\n"); Printv(function_code, doxygen_comments, NIL); Delete(doxygen_comments); } if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("jstype", l, NULL); Swig_typemap_attach_parms("javain", l, NULL); /* Get return types */ if ((tm = Swig_typemap_lookup("jstype", n, "", 0))) { substituteClassname(t, tm); Printf(return_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(t, 0)); } /* Change function name for global variables */ if (proxy_flag && global_variable_flag) { // Capitalize the first letter in the variable to create a JavaBean type getter/setter function name func_name = NewString(""); setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(getNSpace(), variable_name)) == 0); if (setter_flag) Printf(func_name, "set"); else Printf(func_name, "get"); Putc(toupper((int) *Char(variable_name)), func_name); Printf(func_name, "%s", Char(variable_name) + 1); } else { func_name = Copy(Getattr(n, "sym:name")); } /* Start generating the function */ const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(function_code, " %s static %s %s(", methodmods, return_type, func_name); Printv(imcall, imclass_name, ".", overloaded_name, "(", NIL); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); bool global_or_member_variable = global_variable_flag || (wrapping_member_flag && !enum_constant_flag); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; i < num_arguments; i++) { /* Ignored parameters */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Java parameter type */ if ((tm = Getattr(p, "tmap:jstype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, global_or_member_variable); // Use typemaps to transform type used in Java wrapper function (in proxy class) to type used in JNI function (in intermediary class) if ((tm = Getattr(p, "tmap:javain"))) { addThrows(n, "tmap:javain", p); substituteClassname(pt, tm); Replaceall(tm, "$javainput", arg); String *pre = Getattr(p, "tmap:javain:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$javainput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:javain:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$javainput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, "No javain typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to module class function */ if (gencomma >= 2) Printf(function_code, ", "); gencomma = 2; Printf(function_code, "%s %s", param_type, arg); if (prematureGarbageCollectionPreventionParameter(pt, p)) { String *pgcppname = Getattr(p, "tmap:javain:pgcppname"); if (pgcppname) { String *argname = Copy(pgcppname); Replaceall(argname, "$javainput", arg); Printf(imcall, ", %s", argname); Delete(argname); } else { Printf(imcall, ", %s", arg); } } p = Getattr(p, "tmap:in:next"); Delete(arg); Delete(param_type); } Printf(imcall, ")"); Printf(function_code, ")"); // Transform return type used in JNI function (in intermediary class) to type used in Java wrapper function (in module class) if ((tm = Swig_typemap_lookup("javaout", n, "", 0))) { addThrows(n, "tmap:javaout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; if (is_pre_code || is_post_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } Insert(tm, 0, "{"); Printf(tm, "\n }"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$jnicall", imcall); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF, input_file, line_number, "No javaout typemap defined for %s\n", SwigType_str(t, 0)); } generateThrowsClause(n, function_code); Printf(function_code, " %s\n\n", tm ? tm : empty_string); Printv(module_class_code, function_code, NIL); Delete(pre_code); Delete(post_code); Delete(function_code); Delete(return_type); Delete(imcall); Delete(func_name); } /*---------------------------------------------------------------------- * replaceSpecialVariables() *--------------------------------------------------------------------*/ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; SwigType *type = Getattr(parm, "type"); substituteClassname(type, tm); } /*---------------------------------------------------------------------- * decodeEnumFeature() * Decode the possible enum features, which are one of: * %javaenum(simple) * %javaenum(typeunsafe) - default * %javaenum(typesafe) * %javaenum(proper) *--------------------------------------------------------------------*/ EnumFeature decodeEnumFeature(Node *n) { EnumFeature enum_feature = TypeunsafeEnum; String *feature = Getattr(n, "feature:java:enum"); if (feature) { if (Cmp(feature, "simple") == 0) enum_feature = SimpleEnum; else if (Cmp(feature, "typesafe") == 0) enum_feature = TypesafeEnum; else if (Cmp(feature, "proper") == 0) enum_feature = ProperEnum; } return enum_feature; } /* ----------------------------------------------------------------------- * enumValue() * This method will return a string with an enum value to use in Java generated * code. If the %javaconst feature is not used, the string will contain the intermediary * class call to obtain the enum value. The intermediary class and JNI methods to obtain * the enum value will be generated. Otherwise the C/C++ enum value will be used if there * is one and hopefully it will compile as Java code - e.g. 20 as in: enum E{e=20}; * The %javaconstvalue feature overrides all other ways to generate the constant value. * The caller must delete memory allocated for the returned string. * ------------------------------------------------------------------------ */ String *enumValue(Node *n) { String *symname = Getattr(n, "sym:name"); // Check for the %javaconstvalue feature String *value = Getattr(n, "feature:java:constvalue"); if (!value) { // The %javaconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:java:const"); if (const_feature_flag) { // Use the C syntax to make a true Java constant and hope that it compiles as Java code value = Getattr(n, "enumvalue") ? Copy(Getattr(n, "enumvalue")) : Copy(Getattr(n, "enumvalueex")); } else { String *newsymname = 0; if (!getCurrentClass() || !proxy_flag) { String *enumClassPrefix = getEnumClassPrefix(); if (enumClassPrefix) { // A global scoped enum newsymname = Swig_name_member(0, enumClassPrefix, symname); symname = newsymname; } } // Get the enumvalue from a JNI call if (!getCurrentClass() || !cparse_cplusplus || !proxy_flag) { // Strange hack to change the name Setattr(n, "name", Getattr(n, "value")); /* for wrapping of enums in a namespace when emit_action is used */ constantWrapper(n); value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { memberconstantHandler(n); value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, getEnumClassPrefix(), symname))); } Delete(newsymname); } } return value; } /* ----------------------------------------------------------------------------- * getEnumName() * * If jnidescriptor is set, inner class names are separated with '$' otherwise a '.' * and the package is also not added to the name. * ----------------------------------------------------------------------------- */ String *getEnumName(SwigType *t, bool jnidescriptor) { Node *enumname = NULL; Node *n = enumLookup(t); if (n) { enumname = Getattr(n, "enumname"); if (!enumname || jnidescriptor) { String *symname = Getattr(n, "sym:name"); if (symname) { // Add in class scope when referencing enum if not a global enum String *scopename_prefix = Swig_scopename_prefix(Getattr(n, "name")); String *proxyname = 0; if (scopename_prefix) { proxyname = getProxyName(scopename_prefix, jnidescriptor); } if (proxyname) { const char *class_separator = jnidescriptor ? "$" : "."; enumname = NewStringf("%s%s%s", proxyname, class_separator, symname); } else { // global enum or enum in a namespace String *nspace = Getattr(n, "sym:nspace"); if (nspace) { if (package && !jnidescriptor) enumname = NewStringf("%s.%s.%s", package, nspace, symname); else enumname = NewStringf("%s.%s", nspace, symname); } else { enumname = Copy(symname); } } if (!jnidescriptor) { Setattr(n, "enumname", enumname); // Cache it Delete(enumname); } Delete(scopename_prefix); } } } return enumname; } /* ----------------------------------------------------------------------------- * substituteClassname() * * Substitute the special variable $javaclassname with the proxy class name for classes/structs/unions * that SWIG knows about. Also substitutes enums with enum name. * Otherwise use the $descriptor name for the Java class name. Note that the $&javaclassname substitution * is the same as a $&descriptor substitution, ie one pointer added to descriptor name. * Note that the path separator is a '.' unless jnidescriptor is set. * Inputs: * pt - parameter type * tm - typemap contents that might contain the special variable to be replaced * jnidescriptor - if set, inner class names are separated with '$' otherwise a '/' is used for the path separator * Outputs: * tm - typemap contents complete with the special variable substitution * Return: * substitution_performed - flag indicating if a substitution was performed * ----------------------------------------------------------------------------- */ bool substituteClassname(SwigType *pt, String *tm, bool jnidescriptor = false) { bool substitution_performed = false; SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); SwigType *strippedtype = SwigType_strip_qualifiers(type); if (Strstr(tm, "$javaclassname")) { SwigType *classnametype = Copy(strippedtype); substituteClassnameSpecialVariable(classnametype, tm, "$javaclassname", jnidescriptor); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$*javaclassname")) { SwigType *classnametype = Copy(strippedtype); Delete(SwigType_pop(classnametype)); if (Len(classnametype) > 0) { substituteClassnameSpecialVariable(classnametype, tm, "$*javaclassname", jnidescriptor); substitution_performed = true; } Delete(classnametype); } if (Strstr(tm, "$&javaclassname")) { SwigType *classnametype = Copy(strippedtype); SwigType_add_pointer(classnametype); substituteClassnameSpecialVariable(classnametype, tm, "$&javaclassname", jnidescriptor); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$javainterfacename")) { SwigType *interfacenametype = Copy(strippedtype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$javainterfacename", jnidescriptor, true); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$*javainterfacename")) { SwigType *interfacenametype = Copy(strippedtype); Delete(SwigType_pop(interfacenametype)); if (Len(interfacenametype) > 0) { substituteInterfacenameSpecialVariable(interfacenametype, tm, "$*javainterfacename", jnidescriptor, true); substitution_performed = true; } Delete(interfacenametype); } if (Strstr(tm, "$&javainterfacename")) { SwigType *interfacenametype = Copy(strippedtype); SwigType_add_pointer(interfacenametype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$&javainterfacename", jnidescriptor, true); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$interfacename")) { SwigType *interfacenametype = Copy(strippedtype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$interfacename", jnidescriptor, false); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$*interfacename")) { SwigType *interfacenametype = Copy(strippedtype); Delete(SwigType_pop(interfacenametype)); if (Len(interfacenametype) > 0) { substituteInterfacenameSpecialVariable(interfacenametype, tm, "$*interfacename", jnidescriptor, false); substitution_performed = true; } Delete(interfacenametype); } if (Strstr(tm, "$&interfacename")) { SwigType *interfacenametype = Copy(strippedtype); SwigType_add_pointer(interfacenametype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$&interfacename", jnidescriptor, false); substitution_performed = true; Delete(interfacenametype); } Delete(strippedtype); Delete(type); return substitution_performed; } /* ----------------------------------------------------------------------------- * substituteClassnameSpecialVariable() * ----------------------------------------------------------------------------- */ void substituteClassnameSpecialVariable(SwigType *classnametype, String *tm, const char *classnamespecialvariable, bool jnidescriptor) { String *replacementname; if (SwigType_isenum(classnametype)) { String *enumname = getEnumName(classnametype, jnidescriptor); if (enumname) { replacementname = Copy(enumname); } else { bool anonymous_enum = (Cmp(classnametype, "enum ") == 0); if (anonymous_enum) { replacementname = NewString("int"); } else { // An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) or an ignored enum replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); Replace(replacementname, "enum ", "", DOH_REPLACE_ANY); Setattr(swig_types_hash, replacementname, classnametype); } } } else { String *classname = getProxyName(classnametype, jnidescriptor); // getProxyName() works for pointers to classes too if (classname) { replacementname = Copy(classname); } else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); // Add to hash table so that the type wrapper classes can be created later Setattr(swig_types_hash, replacementname, classnametype); } } if (jnidescriptor) Replaceall(replacementname,".","/"); Replaceall(tm, classnamespecialvariable, replacementname); Delete(replacementname); } /* ----------------------------------------------------------------------------- * substituteInterfacenameSpecialVariable() * ----------------------------------------------------------------------------- */ void substituteInterfacenameSpecialVariable(SwigType *interfacenametype, String *tm, const char *interfacenamespecialvariable, bool jnidescriptor, bool qualified) { String *interfacename = getInterfaceName(interfacenametype/*, jnidescriptor*/, qualified); if (interfacename) { String *replacementname = Copy(interfacename); if (jnidescriptor) Replaceall(replacementname,".","/"); Replaceall(tm, interfacenamespecialvariable, replacementname); Delete(replacementname); } } /* ----------------------------------------------------------------------------- * emitTypeWrapperClass() * ----------------------------------------------------------------------------- */ void emitTypeWrapperClass(String *classname, SwigType *type) { Node *n = NewHash(); Setfile(n, input_file); Setline(n, line_number); String *swigtype = NewString(""); String *filen = NewStringf("%s%s.java", SWIG_output_directory(), classname); File *f_swigtype = NewFile(filen, "w", SWIG_output_files()); if (!f_swigtype) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the type wrapper class file emitBanner(f_swigtype); if (package) Printf(f_swigtype, "package %s;\n", package); // Pure Java baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "javabase", type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "javainterfaces", type, WARN_NONE); // Emit the class Printv(swigtype, typemapLookup(n, "javaimports", type, WARN_NONE), // Import statements "\n", typemapLookup(n, "javaclassmodifiers", type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " $javaclassname", // Class name and bases *Char(pure_baseclass) ? " extends " : "", pure_baseclass, *Char(pure_interfaces) ? // Interfaces " implements " : "", pure_interfaces, " {", typemapLookup(n, "javabody", type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF), // main body of class typemapLookup(n, "javacode", type, WARN_NONE), // extra Java code "}\n", "\n", NIL); Replaceall(swigtype, "$javaclassname", classname); Replaceall(swigtype, "$module", module_class_name); Replaceall(swigtype, "$imclassname", imclass_name); // For unknown enums Replaceall(swigtype, "$static ", ""); Replaceall(swigtype, "$enumvalues", ""); Printv(f_swigtype, swigtype, NIL); Delete(f_swigtype); Delete(swigtype); Delete(n); } /* ----------------------------------------------------------------------------- * typemapLookup() * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * warning - warning number to issue if no typemaps found * typemap_attributes - the typemap attributes are attached to this node and will * also be used for temporary storage if non null * return is never NULL, unlike Swig_typemap_lookup() * ----------------------------------------------------------------------------- */ const String *typemapLookup(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) { Node *node = !typemap_attributes ? NewHash() : typemap_attributes; Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); if (!tm) { tm = empty_string; if (warning != WARN_NONE) Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); } if (!typemap_attributes) Delete(node); return tm; } /* ----------------------------------------------------------------------------- * addThrows() * * Adds exception classes to a throws list. The throws list is the list of classes * that will form the Java throws clause. Mainly for checked exceptions. * ----------------------------------------------------------------------------- */ void addThrows(Node *n, const String *attribute, Node *parameter) { // Get the comma separated exception classes for the throws clause - held in typemap/feature's "throws" attribute String *throws_attribute = NewStringf("%s:throws", attribute); String *throws = Getattr(parameter, throws_attribute); if (throws && Len(throws) > 0) { String *throws_list = Getattr(n, "java:throwslist"); if (!throws_list) { throws_list = NewList(); Setattr(n, "java:throwslist", throws_list); } // Put the exception classes in the throws clause into a temporary List List *temp_classes_list = Split(throws, ',', INT_MAX); // Add the exception classes to the node throws list, but don't duplicate if already in list if (temp_classes_list && Len(temp_classes_list) > 0) { for (Iterator cls = First(temp_classes_list); cls.item; cls = Next(cls)) { String *exception_class = NewString(cls.item); Replaceall(exception_class, " ", ""); // remove spaces Replaceall(exception_class, "\t", ""); // remove tabs if (Len(exception_class) > 0) { // $javaclassname substitution SwigType *pt = Getattr(parameter, "type"); substituteClassname(pt, exception_class); // Don't duplicate the Java exception class in the throws clause bool found_flag = false; for (Iterator item = First(throws_list); item.item; item = Next(item)) { if (Strcmp(item.item, exception_class) == 0) found_flag = true; } if (!found_flag) Append(throws_list, exception_class); } Delete(exception_class); } } Delete(temp_classes_list); } Delete(throws_attribute); } /* ----------------------------------------------------------------------------- * generateThrowsClause() * * Generates throws clause for checked exception * ----------------------------------------------------------------------------- */ void generateThrowsClause(Node *n, String *code) { // Add the throws clause into code List *throws_list = Getattr(n, "java:throwslist"); if (throws_list) { Iterator cls = First(throws_list); Printf(code, " throws %s", cls.item); while ((cls = Next(cls)).item) Printf(code, ", %s", cls.item); } } /* ----------------------------------------------------------------------------- * prematureGarbageCollectionPreventionParameter() * * Get the proxy class name for use in an additional generated parameter. The * additional parameter is added to a native method call purely to prevent * premature garbage collection of proxy classes which pass their C++ class pointer * in a Java long to the JNI layer. * ----------------------------------------------------------------------------- */ String *prematureGarbageCollectionPreventionParameter(SwigType *t, Parm *p) { String *pgcpp_java_type = 0; String *jtype = NewString(Getattr(p, "tmap:jtype")); // Strip C comments String *stripped_jtype = Swig_strip_c_comments(jtype); if (stripped_jtype) { Delete(jtype); jtype = stripped_jtype; } // Remove whitespace Replaceall(jtype, " ", ""); Replaceall(jtype, "\t", ""); if (Cmp(jtype, "long") == 0) { if (proxy_flag) { if (!GetFlag(p, "tmap:jtype:nopgcpp") && !nopgcpp_flag) { String *interface_name = getInterfaceName(t, true); pgcpp_java_type = interface_name ? interface_name : getProxyName(t); if (!pgcpp_java_type) { // Look for proxy class parameters passed to C++ layer using non-default typemaps, ie not one of above types String *jstype = NewString(Getattr(p, "tmap:jstype")); if (jstype) { Hash *classes = getClassHash(); if (classes) { // Strip C comments String *stripped_jstype = Swig_strip_c_comments(jstype); if (stripped_jstype) { Delete(jstype); jstype = stripped_jstype; } // Remove whitespace Replaceall(jstype, " ", ""); Replaceall(jstype, "\t", ""); Iterator ki; for (ki = First(classes); ki.key; ki = Next(ki)) { Node *cls = ki.item; if (cls && !Getattr(cls, "feature:ignore")) { String *symname = Getattr(cls, "sym:name"); if (symname && Strcmp(symname, jstype) == 0) { pgcpp_java_type = symname; } } } } } Delete(jstype); } } } } Delete(jtype); return pgcpp_java_type; } /* ----------------------------------------------------------------------------- * outputDirectory() * * Return the directory to use for generating Java classes/enums and create the * subdirectory (does not create if language specific outdir does not exist). * ----------------------------------------------------------------------------- */ String *outputDirectory(String *nspace) { String *output_directory = Copy(SWIG_output_directory()); if (nspace) { String *nspace_subdirectory = Copy(nspace); Replaceall(nspace_subdirectory, ".", SWIG_FILE_DELIMITER); String *newdir_error = Swig_new_subdirectory(output_directory, nspace_subdirectory); if (newdir_error) { Printf(stderr, "%s\n", newdir_error); Delete(newdir_error); SWIG_exit(EXIT_FAILURE); } Printv(output_directory, nspace_subdirectory, SWIG_FILE_DELIMITER, 0); Delete(nspace_subdirectory); } return output_directory; } /*---------------------------------------------------------------------- * Start of director methods *--------------------------------------------------------------------*/ /*---------------------------------------------------------------------- * getUpcallJNIMethod() *--------------------------------------------------------------------*/ String *getUpcallJNIMethod(String *descrip) { static struct { char code; const char *method; } upcall_methods[] = { { 'B', "CallStaticByteMethod"}, { 'C', "CallStaticCharMethod"}, { 'D', "CallStaticDoubleMethod"}, { 'F', "CallStaticFloatMethod"}, { 'I', "CallStaticIntMethod"}, { 'J', "CallStaticLongMethod"}, { 'L', "CallStaticObjectMethod"}, { 'S', "CallStaticShortMethod"}, { 'V', "CallStaticVoidMethod"}, { 'Z', "CallStaticBooleanMethod"}, { '[', "CallStaticObjectMethod"} }; char code; int i; code = *Char(descrip); for (i = 0; i < (int) (sizeof(upcall_methods) / sizeof(upcall_methods[0])); ++i) if (code == upcall_methods[i].code) return NewString(upcall_methods[i].method); return NULL; } /*---------------------------------------------------------------------- * emitDirectorUpcalls() *--------------------------------------------------------------------*/ void emitDirectorUpcalls() { if (n_dmethods) { Wrapper *w = NewWrapper(); String *jni_imclass_name = makeValidJniName(imclass_name); String *swig_module_init = NewString("swig_module_init"); String *swig_module_init_jni = makeValidJniName(swig_module_init); String *dmethod_data = NewString(""); int n_methods = 0; Iterator udata_iter; udata_iter = First(dmethods_seq); while (udata_iter.item) { UpcallData *udata = udata_iter.item; Printf(dmethod_data, " { \"%s\", \"%s\" }", Getattr(udata, "imclass_method"), Getattr(udata, "imclass_fdesc")); ++n_methods; udata_iter = Next(udata_iter); if (udata_iter.item) Putc(',', dmethod_data); Putc('\n', dmethod_data); } Printf(f_runtime, "namespace Swig {\n"); Printf(f_runtime, " namespace {\n"); Printf(f_runtime, " jclass jclass_%s = NULL;\n", imclass_name); Printf(f_runtime, " jmethodID director_method_ids[%d];\n", n_methods); Printf(f_runtime, " }\n"); Printf(f_runtime, "}\n"); Printf(w->def, "SWIGEXPORT void JNICALL Java_%s%s_%s(JNIEnv *jenv, jclass jcls) {", jnipackage, jni_imclass_name, swig_module_init_jni); Printf(w->code, "static struct {\n"); Printf(w->code, " const char *method;\n"); Printf(w->code, " const char *signature;\n"); Printf(w->code, "} methods[%d] = {\n", n_methods); Printv(w->code, dmethod_data, NIL); Printf(w->code, "};\n"); Wrapper_add_local(w, "i", "int i"); Printf(w->code, "Swig::jclass_%s = (jclass) jenv->NewGlobalRef(jcls);\n", imclass_name); Printf(w->code, "if (!Swig::jclass_%s) return;\n", imclass_name); Printf(w->code, "for (i = 0; i < (int) (sizeof(methods)/sizeof(methods[0])); ++i) {\n"); Printf(w->code, " Swig::director_method_ids[i] = jenv->GetStaticMethodID(jcls, methods[i].method, methods[i].signature);\n"); Printf(w->code, " if (!Swig::director_method_ids[i]) return;\n"); Printf(w->code, "}\n"); Printf(w->code, "}\n"); Wrapper_print(w, f_wrappers); Delete(dmethod_data); Delete(swig_module_init_jni); Delete(swig_module_init); Delete(jni_imclass_name); DelWrapper(w); } } /*---------------------------------------------------------------------- * emitDirectorExtraMethods() * * This is where the director connect method is generated. *--------------------------------------------------------------------*/ void emitDirectorExtraMethods(Node *n) { if (!Swig_directorclass(n)) return; // Output the director connect method: String *jni_imclass_name = makeValidJniName(imclass_name); String *norm_name = SwigType_namestr(Getattr(n, "name")); String *swig_director_connect = Swig_name_member(getNSpace(), getClassPrefix(), "director_connect"); String *swig_director_connect_jni = makeValidJniName(swig_director_connect); String *smartptr = Getattr(n, "feature:smartptr"); String *dirClassName = directorClassName(n); Wrapper *code_wrap; Printf(imclass_class_code, " public final static native void %s(%s obj, long cptr, boolean mem_own, boolean weak_global);\n", swig_director_connect, full_proxy_class_name); code_wrap = NewWrapper(); Printf(code_wrap->def, "SWIGEXPORT void JNICALL Java_%s%s_%s(JNIEnv *jenv, jclass jcls, jobject jself, jlong objarg, jboolean jswig_mem_own, " "jboolean jweak_global) {\n", jnipackage, jni_imclass_name, swig_director_connect_jni); if (smartptr) { Printf(code_wrap->code, " %s *obj = *((%s **)&objarg);\n", smartptr, smartptr); Printf(code_wrap->code, " (void)jcls;\n"); Printf(code_wrap->code, " // Keep a local instance of the smart pointer around while we are using the raw pointer\n"); Printf(code_wrap->code, " // Avoids using smart pointer specific API.\n"); Printf(code_wrap->code, " %s *director = static_cast<%s *>(obj->operator->());\n", dirClassName, dirClassName); } else { Printf(code_wrap->code, " %s *obj = *((%s **)&objarg);\n", norm_name, norm_name); Printf(code_wrap->code, " (void)jcls;\n"); Printf(code_wrap->code, " %s *director = static_cast<%s *>(obj);\n", dirClassName, dirClassName); } Printf(code_wrap->code, " director->swig_connect_director(jenv, jself, jenv->GetObjectClass(jself), " "(jswig_mem_own == JNI_TRUE), (jweak_global == JNI_TRUE));\n"); Printf(code_wrap->code, "}\n"); Wrapper_print(code_wrap, f_wrappers); DelWrapper(code_wrap); Delete(swig_director_connect_jni); Delete(swig_director_connect); // Output the swigReleaseOwnership, swigTakeOwnership methods: String *changeown_method_name = Swig_name_member(getNSpace(), getClassPrefix(), "change_ownership"); String *changeown_jnimethod_name = makeValidJniName(changeown_method_name); Printf(imclass_class_code, " public final static native void %s(%s obj, long cptr, boolean take_or_release);\n", changeown_method_name, full_proxy_class_name); code_wrap = NewWrapper(); Printf(code_wrap->def, "SWIGEXPORT void JNICALL Java_%s%s_%s(JNIEnv *jenv, jclass jcls, jobject jself, jlong objarg, jboolean jtake_or_release) {\n", jnipackage, jni_imclass_name, changeown_jnimethod_name); if (Len(smartptr)) { Printf(code_wrap->code, " %s *obj = *((%s **)&objarg);\n", smartptr, smartptr); Printf(code_wrap->code, " // Keep a local instance of the smart pointer around while we are using the raw pointer\n"); Printf(code_wrap->code, " // Avoids using smart pointer specific API.\n"); Printf(code_wrap->code, " %s *director = dynamic_cast<%s *>(obj->operator->());\n", dirClassName, dirClassName); } else { Printf(code_wrap->code, " %s *obj = *((%s **)&objarg);\n", norm_name, norm_name); Printf(code_wrap->code, " %s *director = dynamic_cast<%s *>(obj);\n", dirClassName, dirClassName); } Printf(code_wrap->code, " (void)jcls;\n"); Printf(code_wrap->code, " if (director) {\n"); Printf(code_wrap->code, " director->swig_java_change_ownership(jenv, jself, jtake_or_release ? true : false);\n"); Printf(code_wrap->code, " }\n"); Printf(code_wrap->code, "}\n"); Wrapper_print(code_wrap, f_wrappers); DelWrapper(code_wrap); Delete(changeown_method_name); Delete(changeown_jnimethod_name); Delete(norm_name); Delete(dirClassName); Delete(jni_imclass_name); } /*---------------------------------------------------------------------- * emitCodeTypemap() * * Output a code typemap that uses $methodname and $jnicall, as used * in the directordisconnect, director_release and director_take * typemaps. *--------------------------------------------------------------------*/ void emitCodeTypemap(Node *n, bool derived, SwigType *lookup_type, const String *typemap, const String *methodname, const String *jnicall) { const String *tm = NULL; Node *tmattrs = NewHash(); String *lookup_tmname = NewString(typemap); String *method_attr_name; String *method_attr; if (derived) { Append(lookup_tmname, "_derived"); } tm = typemapLookup(n, lookup_tmname, lookup_type, WARN_NONE, tmattrs); method_attr_name = NewStringf("tmap:%s:%s", lookup_tmname, methodname); method_attr = Getattr(tmattrs, method_attr_name); if (*Char(tm)) { if (method_attr) { String *codebody = Copy(tm); Replaceall(codebody, "$methodname", method_attr); Replaceall(codebody, "$jnicall", jnicall); Append(proxy_class_def, codebody); Delete(codebody); } else { Swig_error(input_file, line_number, "No %s method name attribute for %s\n", lookup_tmname, proxy_class_name); } } else { Swig_error(input_file, line_number, "No %s typemap for %s\n", lookup_tmname, proxy_class_name); } Delete(tmattrs); Delete(lookup_tmname); // Delete(method_attr); } /* ----------------------------------------------------------------------------- * substitutePackagePath() * * Replace $packagepath using the javapackage typemap associated with passed * parm or global package if p is 0. "$packagepath/" is replaced with "" if * no package is set. Note that the path separator is a '/'. * ----------------------------------------------------------------------------- */ void substitutePackagePath(String *text, Parm *p) { String *pkg_path= 0; if (p) pkg_path = Swig_typemap_lookup("javapackage", p, "", 0); if (!pkg_path || Len(pkg_path) == 0) pkg_path = Copy(package_path); if (Len(pkg_path) > 0) { Replaceall(pkg_path, ".", "/"); Replaceall(text, "$packagepath", pkg_path); } else { Replaceall(text, "$packagepath/", empty_string); Replaceall(text, "$packagepath", empty_string); } Delete(pkg_path); } /* --------------------------------------------------------------- * Canonicalize the JNI field descriptor * * Replace the $packagepath and $javaclassname family of special * variables with the desired package and Java proxy name as * required in the JNI field descriptors. * * !!SFM!! If $packagepath occurs in the field descriptor, but * package_path isn't set (length == 0), then strip it and the * optional trailing '/' from the resulting name. * * --------------------------------------------------------------- */ String *canonicalizeJNIDescriptor(String *descriptor_in, Parm *p) { SwigType *type = Getattr(p, "type"); String *descriptor_out = Copy(descriptor_in); substituteClassname(type, descriptor_out, true); substitutePackagePath(descriptor_out, p); return descriptor_out; } /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying Java object. * * --------------------------------------------------------------- */ int classDirectorMethod(Node *n, Node *parent, String *super) { String *c_classname = Getattr(parent, "name"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *returntype = Getattr(n, "type"); String *overloaded_name = getOverloadedName(n); String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); String *decl = Getattr(n, "decl"); String *declaration = NewString(""); String *tm; Parm *p; int i; Wrapper *w = NewWrapper(); ParmList *l = Getattr(n, "parms"); bool is_void = !(Cmp(returntype, "void")); String *qualified_return = 0; bool pure_virtual = (!(Cmp(storage, "virtual")) && !(Cmp(value, "0"))); int status = SWIG_OK; bool output_director = true; String *dirclassname = directorClassName(parent); String *qualified_name = NewStringf("%s::%s", dirclassname, name); String *jnidesc = NewString(""); String *classdesc = NewString(""); String *jniret_desc = NewString(""); String *classret_desc = NewString(""); SwigType *c_ret_type = NULL; String *jupcall_args = NewString("swigjobj"); String *imclass_dmethod; String *callback_def = NewString(""); String *callback_code = NewString(""); String *imcall_args = NewString(""); int classmeth_off = curr_class_dmethod - first_class_dmethod; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; String *qualified_classname = getProxyName(getClassName()); // Kludge Alert: functionWrapper sets sym:overload properly, but it // isn't at this point, so we have to manufacture it ourselves. At least // we're consistent with the sym:overload name in functionWrapper. (?? when // does the overloaded method name get set?) imclass_dmethod = NewStringf("%s", Swig_name_member(getNSpace(), dirclassname, overloaded_name)); qualified_return = SwigType_rcaststr(returntype, "c_result"); if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { String *base_typename = SwigType_base(returntype); String *resolved_typename = SwigType_typedef_resolve_all(base_typename); Symtab *symtab = Getattr(n, "sym:symtab"); Node *typenode = Swig_symbol_clookup(resolved_typename, symtab); if (SwigType_ispointer(returntype) || (typenode && Getattr(typenode, "abstracts"))) { /* initialize pointers to something sane. Same for abstract classes when a reference is returned. */ Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } else { /* If returning a reference, initialize the pointer to a sane default - if a Java exception occurs, then the pointer returns something other than a NULL-initialized reference. */ SwigType *noref_type = SwigType_del_reference(Copy(returntype)); String *noref_ltype = SwigType_lstr(noref_type, 0); String *return_ltype = SwigType_lstr(returntype, 0); Wrapper_add_localv(w, "result_default", "static", noref_ltype, "result_default", NIL); Wrapper_add_localv(w, "c_result", return_ltype, "c_result", NIL); Printf(w->code, "result_default = SwigValueInit< %s >();\n", noref_ltype); Printf(w->code, "c_result = &result_default;\n"); Delete(return_ltype); Delete(noref_ltype); Delete(noref_type); } Delete(base_typename); Delete(resolved_typename); } } else { SwigType *vt; vt = cplus_value_type(returntype); if (!vt) { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), NIL); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(vt, "c_result"), NIL); Delete(vt); } } } /* Create the intermediate class wrapper */ tm = Swig_typemap_lookup("jtype", n, "", 0); if (tm) { Printf(callback_def, " public static %s %s(%s jself", tm, imclass_dmethod, qualified_classname); } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, "No jtype typemap defined for %s\n", SwigType_str(returntype, 0)); } String *cdesc = NULL; SwigType *covariant = Getattr(n, "covariant"); SwigType *adjustedreturntype = covariant ? covariant : returntype; Parm *adjustedreturntypeparm = NewParmNode(adjustedreturntype, n); if (Swig_typemap_lookup("directorin", adjustedreturntypeparm, "", 0) && (cdesc = Getattr(adjustedreturntypeparm, "tmap:directorin:descriptor"))) { // Note that in the case of polymorphic (covariant) return types, the // method's return type is changed to be the base of the C++ return // type String *jnidesc_canon = canonicalizeJNIDescriptor(cdesc, adjustedreturntypeparm); Append(classret_desc, jnidesc_canon); Delete(jnidesc_canon); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } /* Get the JNI field descriptor for this return type, add the JNI field descriptor to jniret_desc */ if ((c_ret_type = Swig_typemap_lookup("jni", n, "", 0))) { Parm *tp = NewParmNode(c_ret_type, n); if (!is_void && !ignored_method) { String *jretval_decl = NewStringf("%s jresult", c_ret_type); Wrapper_add_localv(w, "jresult", jretval_decl, "= 0", NIL); Delete(jretval_decl); } String *jdesc = NULL; if (Swig_typemap_lookup("directorin", tp, "", 0) && (jdesc = Getattr(tp, "tmap:directorin:descriptor"))) { // Objects marshalled passing a Java class across JNI boundary use jobject - the nouse flag indicates this // We need the specific Java class name instead of the generic 'Ljava/lang/Object;' if (GetFlag(tp, "tmap:directorin:nouse")) jdesc = cdesc; String *jnidesc_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jniret_desc, jnidesc_canon); Delete(jnidesc_canon); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(c_ret_type, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(tp); } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, "No jni typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(adjustedreturntypeparm); Swig_director_parms_fixup(l); /* Attach the standard typemaps */ Swig_typemap_attach_parms("out", l, 0); Swig_typemap_attach_parms("jni", l, 0); Swig_typemap_attach_parms("jtype", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("javadirectorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); if (!ignored_method) { /* Add Java environment pointer to wrapper */ String *jenvstr = NewString("jenv"); String *jobjstr = NewString("swigjobj"); Wrapper_add_localv(w, "swigjnienv", "JNIEnvWrapper", "swigjnienv(this)", NIL, NIL); Wrapper_add_localv(w, jenvstr, "JNIEnv *", jenvstr, "= swigjnienv.getJNIEnv()", NIL); Wrapper_add_localv(w, jobjstr, "jobject", jobjstr, "= (jobject) NULL", NIL); Delete(jenvstr); Delete(jobjstr); /* Preamble code */ Printf(w->code, "if (!swig_override[%d]) {\n", classmeth_off); } if (!pure_virtual) { String *super_call = Swig_method_call(super, l); if (is_void) { Printf(w->code, "%s;\n", super_call); if (!ignored_method) Printf(w->code, "return;\n"); } else { Printf(w->code, "return %s;\n", super_call); } Delete(super_call); } else { Printf(w->code, "SWIG_JavaThrowException(JNIEnvWrapper(this).getJNIEnv(), SWIG_JavaDirectorPureVirtual, "); Printf(w->code, "\"Attempted to invoke pure virtual method %s::%s.\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); /* Make sure that we return something in the case of a pure * virtual method call for syntactical reasons. */ if (!is_void) Printf(w->code, "return %s;", qualified_return); else if (!ignored_method) Printf(w->code, "return;\n"); } if (!ignored_method) { Printf(w->code, "}\n"); Printf(w->code, "swigjobj = swig_get_self(jenv);\n"); Printf(w->code, "if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) {\n"); } /* Start the Java field descriptor for the intermediate class's upcall (insert jself object) */ Parm *tp = NewParmNode(c_classname, n); String *jdesc; if ((tm = Swig_typemap_lookup("directorin", tp, "", 0)) && (jdesc = Getattr(tp, "tmap:directorin:descriptor"))) { String *jni_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jnidesc, jni_canon); Delete(jni_canon); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap for type %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(tp); /* Go through argument list, convert from native to Java */ for (i = 0, p = l; p; ++i) { /* Is this superfluous? */ while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } SwigType *pt = Getattr(p, "type"); String *ln = makeParameterName(n, p, i, false); String *c_param_type = NULL; String *c_decl = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* Add various typemap's 'throws' clauses */ addThrows(n, "tmap:directorin", p); addThrows(n, "tmap:out", p); /* And add to the upcall args */ Printf(jupcall_args, ", %s", arg); /* Get parameter's intermediary C type */ if ((c_param_type = Getattr(p, "tmap:jni"))) { Parm *tp = NewParm(c_param_type, Getattr(p, "name"), n); String *desc_tm = NULL, *jdesc = NULL, *cdesc = NULL; /* Add to local variables */ Printf(c_decl, "%s %s", c_param_type, arg); if (!ignored_method) Wrapper_add_localv(w, arg, c_decl, (!(SwigType_ispointer(pt) || SwigType_isreference(pt)) ? "" : "= 0"), NIL); /* Add input marshalling code and update JNI field descriptor */ if ((desc_tm = Swig_typemap_lookup("directorin", tp, "", 0)) && (jdesc = Getattr(tp, "tmap:directorin:descriptor")) && (tm = Getattr(p, "tmap:directorin")) && (cdesc = Getattr(p, "tmap:directorin:descriptor"))) { // Objects marshalled by passing a Java class across the JNI boundary use jobject as the JNI type - // the nouse flag indicates this. We need the specific Java class name instead of the generic 'Ljava/lang/Object;' if (GetFlag(tp, "tmap:directorin:nouse")) jdesc = cdesc; String *jni_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jnidesc, jni_canon); Delete(jni_canon); Setattr(p, "emit:directorinput", arg); Replaceall(tm, "$input", arg); Replaceall(tm, "$owner", "0"); if (Len(tm)) if (!ignored_method) Printf(w->code, "%s\n", tm); /* Add parameter to the intermediate class code if generating the * intermediate's upcall code */ if ((tm = Getattr(p, "tmap:jtype"))) { String *din = Copy(Getattr(p, "tmap:javadirectorin")); addThrows(n, "tmap:javadirectorin", p); if (din) { Replaceall(din, "$module", module_class_name); Replaceall(din, "$imclassname", imclass_name); substituteClassname(pt, din); Replaceall(din, "$jniinput", ln); if (i > 0) Printf(imcall_args, ", "); Printf(callback_def, ", %s %s", tm, ln); if (Cmp(din, ln)) { Printv(imcall_args, din, NIL); } else Printv(imcall_args, ln, NIL); jni_canon = canonicalizeJNIDescriptor(cdesc, p); Append(classdesc, jni_canon); Delete(jni_canon); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF, input_file, line_number, "No javadirectorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, "No jtype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } p = Getattr(p, "tmap:directorin:next"); Delete(desc_tm); } else { if (!desc_tm) { Swig_warning(WARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(c_param_type, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = nextSibling(p); } else if (!jdesc) { Swig_warning(WARN_JAVA_TYPEMAP_DIRECTORIN_NODESC, input_file, line_number, "Missing JNI descriptor in directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(c_param_type, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = Getattr(p, "tmap:directorin:next"); } else if (!tm) { Swig_warning(WARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for argument %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = nextSibling(p); } else if (!cdesc) { Swig_warning(WARN_JAVA_TYPEMAP_DIRECTORIN_NODESC, input_file, line_number, "Missing JNI descriptor in directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = Getattr(p, "tmap:directorin:next"); } output_director = false; } } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, "No jni typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; p = nextSibling(p); } Delete(arg); Delete(c_decl); Delete(ln); } /* header declaration, start wrapper definition */ String *target; SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Add any exception specifications to the methods in the director class // Get any Java exception classes in the throws typemap ParmList *throw_parm_list = NULL; // May need to add Java throws clause to director methods if %catches defined // Get any Java exception classes in the throws typemap ParmList *catches_list = Getattr(n, "catchlist"); if (catches_list) { Swig_typemap_attach_parms("throws", catches_list, 0); Swig_typemap_attach_parms("directorthrows", catches_list, 0); for (p = catches_list; p; p = nextSibling(p)) { addThrows(n, "tmap:throws", p); } } if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) { Swig_typemap_attach_parms("throws", throw_parm_list, 0); Swig_typemap_attach_parms("directorthrows", throw_parm_list, 0); } for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { // %catches replaces the specified exception specification if (!catches_list) { addThrows(n, "tmap:throws", p); } if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0)); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* Emit the intermediate class's upcall to the actual class */ String *upcall = NewStringf("jself.%s(%s)", symname, imcall_args); // Handle exception classes specified in the "except" feature's "throws" attribute addThrows(n, "feature:except", n); if (!is_void) { if ((tm = Swig_typemap_lookup("javadirectorout", n, "", 0))) { addThrows(n, "tmap:javadirectorout", n); substituteClassname(returntype, tm); Replaceall(tm, "$javacall", upcall); Printf(callback_code, " return %s;\n", tm); } if ((tm = Swig_typemap_lookup("out", n, "", 0))) addThrows(n, "tmap:out", n); Delete(tm); } else Printf(callback_code, " %s;\n", upcall); Printf(callback_code, " }\n"); Delete(upcall); /* Finish off the inherited upcall's definition */ Putc(')', callback_def); generateThrowsClause(n, callback_def); Printf(callback_def, " {\n"); if (!ignored_method) { /* Emit the actual upcall through */ String *imclass_desc = NewStringf("(%s)%s", jnidesc, jniret_desc); String *class_desc = NewStringf("(%s)%s", classdesc, classret_desc); UpcallData *udata = addUpcallMethod(imclass_dmethod, symname, imclass_desc, class_desc, decl); String *methid = Getattr(udata, "imclass_methodidx"); String *methop = getUpcallJNIMethod(jniret_desc); if (!is_void) Printf(w->code, "jresult = (%s) ", c_ret_type); Printf(w->code, "jenv->%s(Swig::jclass_%s, Swig::director_method_ids[%s], %s);\n", methop, imclass_name, methid, jupcall_args); // Generate code to handle any Java exception thrown by director delegation directorExceptHandler(n, catches_list ? catches_list : throw_parm_list, w); if (!is_void) { String *jresult_str = NewString("jresult"); String *result_str = NewString("c_result"); /* Copy jresult into c_result... */ if ((tm = Swig_typemap_lookup("directorout", n, result_str, w))) { addThrows(n, "tmap:directorout", n); Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$result", result_str); Printf(w->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s used in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(jresult_str); Delete(result_str); } /* Marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout"))) { addThrows(n, "tmap:directorargout", p); Replaceall(tm, "$result", makeParameterName(n, p, i, false)); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(imclass_desc); Delete(class_desc); /* Terminate wrapper code */ Printf(w->code, "} else {\n"); Printf(w->code, "SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, \"null upcall object in %s::%s \");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); Printf(w->code, "}\n"); Printf(w->code, "if (swigjobj) jenv->DeleteLocalRef(swigjobj);\n"); if (!is_void) Printf(w->code, "return %s;", qualified_return); } Printf(w->code, "}"); // We expose virtual protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK && output_director) { if (!is_void) { Replaceall(w->code, "$null", qualified_return); } else { Replaceall(w->code, "$null", ""); } if (!GetFlag(n, "feature:ignore")) Printv(imclass_directors, callback_def, callback_code, NIL); if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } Delete(inline_extra_method); Delete(qualified_return); Delete(jnidesc); Delete(c_ret_type); Delete(jniret_desc); Delete(declaration); Delete(callback_def); Delete(callback_code); DelWrapper(w); return status; } /* ------------------------------------------------------------ * directorExceptHandler() * * Emit code to map Java exceptions back to C++ exceptions when * feature("director:except") is applied to a method node. * This is generated after the Java method upcall. * ------------------------------------------------------------ */ void directorExceptHandler(Node *n, ParmList *throw_parm_list, Wrapper *w) { String *directorexcept = Getattr(n, "feature:director:except"); if (!directorexcept) { directorexcept = NewString(""); Printf(directorexcept, "jthrowable $error = jenv->ExceptionOccurred();\n"); Printf(directorexcept, "if ($error) {"); Printf(directorexcept, "$directorthrowshandlers\n"); Printf(directorexcept, " Swig::DirectorException::raise(jenv, $error);\n"); Printf(directorexcept, "}\n"); } else { directorexcept = Copy(directorexcept); } // Can explicitly disable director:except by setting to "" or "0" if (Len(directorexcept) > 0 && Cmp(directorexcept, "0") != 0) { // Replace $packagepath substitutePackagePath(directorexcept, 0); // Replace $directorthrowshandlers with any defined typemap handlers (or nothing) if (Strstr(directorexcept, "$directorthrowshandlers")) { String *directorthrowshandlers_code = NewString(""); for (Parm *p = throw_parm_list; p; p = nextSibling(p)) { String *tm = Getattr(p, "tmap:directorthrows"); if (tm) { // replace $packagepath/$javaclassname String *directorthrows = canonicalizeJNIDescriptor(tm, p); Printv(directorthrowshandlers_code, directorthrows, NIL); Delete(directorthrows); } else { String *t = Getattr(p,"type"); Swig_warning(WARN_TYPEMAP_DIRECTORTHROWS_UNDEF, Getfile(n), Getline(n), "No directorthrows typemap defined for %s\n", SwigType_str(t, 0)); } } Replaceall(directorexcept, "$directorthrowshandlers", directorthrowshandlers_code); Delete(directorthrowshandlers_code); } Replaceall(directorexcept, "$error", "swigerror"); Printf(w->code, " %s\n", directorexcept); } Delete(directorexcept); } /* ------------------------------------------------------------ * directorPrefixArgs() * ------------------------------------------------------------ */ void directorPrefixArgs(Node *n) { Parm *p; /* Need to prepend 'jenv' to the director constructor's argument list */ String *jenv_type = NewString("JNIEnv"); SwigType_add_pointer(jenv_type); p = NewParm(jenv_type, NewString("jenv"), n); Setattr(p, "arg:byname", "1"); set_nextSibling(p, NULL); Setattr(n, "director:prefix_args", p); } /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { Node *parent = parentNode(n); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *dirclassname = directorClassName(parent); String *sub = NewString(""); Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms; int argidx = 0; /* Assign arguments to superclass's parameters, if not already done */ for (p = superparms; p; p = nextSibling(p)) { String *pname = Getattr(p, "name"); if (!pname) { pname = NewStringf("arg%d", argidx++); Setattr(p, "name", pname); } } /* insert jenv prefix argument */ parms = CopyParmList(superparms); String *jenv_type = NewString("JNIEnv"); SwigType_add_pointer(jenv_type); p = NewParm(jenv_type, NewString("jenv"), n); set_nextSibling(p, parms); parms = p; directorPrefixArgs(n); if (!Getattr(n, "defaultargs")) { /* constructor */ { String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, dirclassname, parms, 0); String *call = Swig_csuperclass_call(0, basetype, superparms); String *classtype = SwigType_namestr(Getattr(n, "name")); Printf(f_directors, "%s::%s : %s, %s {\n", dirclassname, target, call, Getattr(parent, "director:ctor")); Printf(f_directors, "}\n\n"); Delete(classtype); Delete(target); Delete(call); } /* constructor header */ { String *target = Swig_method_decl(0, decl, dirclassname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(supername); Delete(jenv_type); Delete(parms); Delete(dirclassname); return Language::classDirectorConstructor(n); } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ int classDirectorDefaultConstructor(Node *n) { String *classname = Swig_class_name(n); String *classtype = SwigType_namestr(Getattr(n, "name")); String *dirClassName = directorClassName(n); Wrapper *w = NewWrapper(); Printf(w->def, "%s::%s(JNIEnv *jenv) : %s {", dirClassName, dirClassName, Getattr(n, "director:ctor")); Printf(w->code, "}\n"); Wrapper_print(w, f_directors); Printf(f_directors_h, " %s(JNIEnv *jenv);\n", dirClassName); DelWrapper(w); Delete(classtype); Delete(classname); Delete(dirClassName); directorPrefixArgs(n); return Language::classDirectorDefaultConstructor(n); } /* ------------------------------------------------------------ * classDirectorInit() * ------------------------------------------------------------ */ int classDirectorInit(Node *n) { Delete(none_comparison); none_comparison = NewString(""); // not used Delete(director_ctor_code); director_ctor_code = NewString("$director_new"); directorDeclaration(n); Printf(f_directors_h, "%s {\n", Getattr(n, "director:decl")); Printf(f_directors_h, "\npublic:\n"); Printf(f_directors_h, " void swig_connect_director(JNIEnv *jenv, jobject jself, jclass jcls, bool swig_mem_own, bool weak_global);\n"); /* Keep track of the director methods for this class */ first_class_dmethod = curr_class_dmethod = n_dmethods; return Language::classDirectorInit(n); } /* ---------------------------------------------------------------------- * classDirectorDestructor() * ---------------------------------------------------------------------- */ int classDirectorDestructor(Node *n) { Node *current_class = getCurrentClass(); String *full_classname = Getattr(current_class, "name"); String *classname = Swig_class_name(current_class); String *dirClassName = directorClassName(current_class); Wrapper *w = NewWrapper(); if (Getattr(n, "noexcept")) { Printf(f_directors_h, " virtual ~%s() noexcept;\n", dirClassName); Printf(w->def, "%s::~%s() noexcept {\n", dirClassName, dirClassName); } else if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw();\n", dirClassName); Printf(w->def, "%s::~%s() throw() {\n", dirClassName, dirClassName); } else { Printf(f_directors_h, " virtual ~%s();\n", dirClassName); Printf(w->def, "%s::~%s() {\n", dirClassName, dirClassName); } /* Ensure that correct directordisconnect typemap's method name is called * here: */ Node *disconn_attr = NewHash(); String *disconn_methodname = NULL; typemapLookup(n, "directordisconnect", full_classname, WARN_NONE, disconn_attr); disconn_methodname = Getattr(disconn_attr, "tmap:directordisconnect:methodname"); Printv(w->code, " swig_disconnect_director_self(\"", disconn_methodname, "\");\n", "}\n", NIL); Wrapper_print(w, f_directors); DelWrapper(w); Delete(disconn_attr); Delete(classname); Delete(dirClassName); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorEnd() * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { String *full_classname = Getattr(n, "name"); String *classname = getProxyName(full_classname, true); String *director_classname = directorClassName(n); String *internal_classname; Wrapper *w = NewWrapper(); if (Len(package_path) > 0) internal_classname = NewStringf("%s/%s", package_path, classname); else internal_classname = NewStringf("%s", classname); // If the namespace is multiple levels, the result of getNSpace() will have inserted // .'s to delimit namespaces, so we need to replace those with /'s Replace(internal_classname, NSPACE_SEPARATOR, "/", DOH_REPLACE_ANY); Wrapper_add_localv(w, "baseclass", "static jclass baseclass", "= 0", NIL); Printf(w->def, "void %s::swig_connect_director(JNIEnv *jenv, jobject jself, jclass jcls, bool swig_mem_own, bool weak_global) {", director_classname); if (first_class_dmethod != curr_class_dmethod) { Printf(w->def, "static struct {\n"); Printf(w->def, "const char *mname;\n"); Printf(w->def, "const char *mdesc;\n"); Printf(w->def, "jmethodID base_methid;\n"); Printf(w->def, "} methods[] = {\n"); for (int i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); Printf(w->def, "{ \"%s\", \"%s\", NULL }", Getattr(udata, "method"), Getattr(udata, "fdesc")); if (i != curr_class_dmethod - 1) Putc(',', w->def); Putc('\n', w->def); } Printf(w->def, "};\n"); } Printf(w->code, "if (swig_set_self(jenv, jself, swig_mem_own, weak_global)) {\n"); Printf(w->code, "if (!baseclass) {\n"); Printf(w->code, "baseclass = jenv->FindClass(\"%s\");\n", internal_classname); Printf(w->code, "if (!baseclass) return;\n"); Printf(w->code, "baseclass = (jclass) jenv->NewGlobalRef(baseclass);\n"); Printf(w->code, "}\n"); int n_methods = curr_class_dmethod - first_class_dmethod; if (n_methods) { /* Emit the swig_overrides() method and the swig_override array */ Printf(f_directors_h, "public:\n"); Printf(f_directors_h, " bool swig_overrides(int n) {\n"); Printf(f_directors_h, " return (n < %d ? swig_override[n] : false);\n", n_methods); Printf(f_directors_h, " }\n"); Printf(f_directors_h, "protected:\n"); Printf(f_directors_h, " Swig::BoolArray<%d> swig_override;\n", n_methods); /* Emit the code to look up the class's methods, initialize the override array */ Printf(w->code, "bool derived = (jenv->IsSameObject(baseclass, jcls) ? false : true);\n"); Printf(w->code, "for (int i = 0; i < %d; ++i) {\n", n_methods); Printf(w->code, " if (!methods[i].base_methid) {\n"); Printf(w->code, " methods[i].base_methid = jenv->GetMethodID(baseclass, methods[i].mname, methods[i].mdesc);\n"); Printf(w->code, " if (!methods[i].base_methid) return;\n"); Printf(w->code, " }\n"); // Generally, derived classes have a mix of overridden and // non-overridden methods and it is worth making a GetMethodID // check during initialization to determine if each method is // overridden, thus avoiding unnecessary calls into Java. // // On the other hand, when derived classes are // expected to override all director methods then the // GetMethodID calls are inefficient, and it is better to let // the director unconditionally call up into Java. The resulting code // will still behave correctly (though less efficiently) when Java // code doesn't override a given method. // // The assumeoverride feature on a director controls whether or not // overrides are assumed. if (GetFlag(n, "feature:director:assumeoverride")) { Printf(w->code, " swig_override[i] = derived;\n"); } else { Printf(w->code, " swig_override[i] = false;\n"); Printf(w->code, " if (derived) {\n"); Printf(w->code, " jmethodID methid = jenv->GetMethodID(jcls, methods[i].mname, methods[i].mdesc);\n"); Printf(w->code, " swig_override[i] = (methid != methods[i].base_methid);\n"); Printf(w->code, " jenv->ExceptionClear();\n"); Printf(w->code, " }\n"); } Printf(w->code, "}\n"); } else { Printf(f_directors_h, "public:\n"); Printf(f_directors_h, " bool swig_overrides(int n) {\n"); Printf(f_directors_h, " return false;\n"); Printf(f_directors_h, " }\n"); } Printf(f_directors_h, "};\n\n"); Printf(w->code, "}\n"); Printf(w->code, "}\n"); Wrapper_print(w, f_directors); DelWrapper(w); Delete(internal_classname); return Language::classDirectorEnd(n); } /* -------------------------------------------------------------------- * classDirectorDisown() * ------------------------------------------------------------------*/ virtual int classDirectorDisown(Node *n) { (void) n; return SWIG_OK; } /*---------------------------------------------------------------------- * extraDirectorProtectedCPPMethodsRequired() *--------------------------------------------------------------------*/ bool extraDirectorProtectedCPPMethodsRequired() const { return false; } /*---------------------------------------------------------------------- * directorDeclaration() * * Generate the director class's declaration * e.g. "class SwigDirector_myclass : public myclass, public Swig::Director {" *--------------------------------------------------------------------*/ void directorDeclaration(Node *n) { String *base = Getattr(n, "classtype"); String *class_ctor = NewString("Swig::Director(jenv)"); String *directorname = directorClassName(n); String *declaration = Swig_class_declaration(n, directorname); Printf(declaration, " : public %s, public Swig::Director", base); // Stash stuff for later. Setattr(n, "director:decl", declaration); Setattr(n, "director:ctor", class_ctor); } /*---------------------------------------------------------------------- * nestedClassesSupport() *--------------------------------------------------------------------*/ NestedClassSupport nestedClassesSupport() const { return NCS_Full; } }; /* class JAVA */ /* ----------------------------------------------------------------------------- * swig_java() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_java() { return new JAVA(); } extern "C" Language *swig_java(void) { return new_swig_java(); } /* ----------------------------------------------------------------------------- * Static member variables * ----------------------------------------------------------------------------- */ const char *JAVA::usage = "\ Java Options (available with -java)\n\ -doxygen - Convert C++ doxygen comments to JavaDoc comments in proxy classes\n\ -debug-doxygen-parser - Display doxygen parser module debugging information\n\ -debug-doxygen-translator - Display doxygen translator module debugging information\n\ -nopgcpp - Suppress premature garbage collection prevention parameter\n\ -noproxy - Generate the low-level functional interface instead\n\ of proxy classes\n\ -oldvarnames - Old intermediary method names for variable wrappers\n\ -package - Set name of the Java package to \n\ \n"; swig-4.0.2/Source/Modules/s-exp.cxx0000644000175000017500000002404313667507523017015 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * s-exp.cxx * * A parse tree represented as Lisp s-expressions. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "dohint.h" static const char *usage = "\ S-Exp Options (available with -sexp)\n\ -typemaplang - Typemap language\n\n"; //static Node *view_top = 0; static File *out = 0; class Sexp:public Language { int indent_level; DOHHash *print_circle_hash; int print_circle_count; int hanging_parens; bool need_whitespace; bool need_newline; public: Sexp(): indent_level(0), print_circle_hash(0), print_circle_count(0), hanging_parens(0), need_whitespace(0), need_newline(0) { } virtual ~ Sexp() { } virtual void main(int argc, char *argv[]) { // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGSEXP 1", 0); SWIG_typemap_lang("sexp"); for (int iX = 0; iX < argc; iX++) { if (strcmp(argv[iX], "-typemaplang") == 0) { Swig_mark_arg(iX); iX++; SWIG_typemap_lang(argv[iX]); Swig_mark_arg(iX); continue; } if (strcmp(argv[iX], "-help") == 0) { fputs(usage, stdout); } } } /* Top of the parse tree */ virtual int top(Node *n) { if (out == 0) { String *outfile = Getattr(n, "outfile"); Replaceall(outfile, "_wrap.cxx", ".lisp"); Replaceall(outfile, "_wrap.c", ".lisp"); out = NewFile(outfile, "w", SWIG_output_files()); if (!out) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } } String *f_sink = NewString(""); Swig_register_filebyname("header", f_sink); Swig_register_filebyname("wrapper", f_sink); Swig_register_filebyname("begin", f_sink); Swig_register_filebyname("runtime", f_sink); Swig_register_filebyname("init", f_sink); Swig_banner_target_lang(out, ";;;"); Language::top(n); Printf(out, "\n"); Printf(out, ";;; Lisp parse tree produced by SWIG\n"); print_circle_hash = NewHash(); print_circle_count = 0; hanging_parens = 0; need_whitespace = 0; need_newline = 0; Sexp_print_node(n); flush_parens(); return SWIG_OK; } void print_indent() { int i; for (i = 0; i < indent_level; i++) { Printf(out, " "); } } void open_paren(const String *oper) { flush_parens(); Printf(out, "("); if (oper) Printf(out, "%s ", oper); indent_level += 2; } void close_paren(bool neednewline = false) { hanging_parens++; if (neednewline) print_lazy_whitespace(); indent_level -= 2; } void flush_parens() { int i; if (hanging_parens) { for (i = 0; i < hanging_parens; i++) Printf(out, ")"); hanging_parens = 0; need_newline = true; need_whitespace = true; } if (need_newline) { Printf(out, "\n"); print_indent(); need_newline = false; need_whitespace = false; } else if (need_whitespace) { Printf(out, " "); need_whitespace = false; } } void print_lazy_whitespace() { need_whitespace = 1; } void print_lazy_newline() { need_newline = 1; } bool internal_key_p(DOH *key) { return ((Cmp(key, "nodeType") == 0) || (Cmp(key, "firstChild") == 0) || (Cmp(key, "lastChild") == 0) || (Cmp(key, "parentNode") == 0) || (Cmp(key, "nextSibling") == 0) || (Cmp(key, "previousSibling") == 0) || (Cmp(key, "csym:nextSibling") == 0) || (Cmp(key, "csym:previousSibling") == 0) || (Cmp(key, "typepass:visit") == 0) || (Cmp(key, "allocate:visit") == 0) || (*(Char(key)) == '$')); } bool boolean_key_p(DOH *key) { return ((Cmp(key, "allocate:default_constructor") == 0) || (Cmp(key, "allocate:default_destructor") == 0) || (Cmp(key, "allows_typedef") == 0) || (Cmp(key, "feature:immutable") == 0)); } bool list_key_p(DOH *key) { return ((Cmp(key, "parms") == 0) || (Cmp(key, "baselist") == 0)); } bool plist_key_p(DOH *key) // true if KEY is the name of data that is a mapping from keys to // values, which should be printed as a plist. { return ((Cmp(key, "typescope") == 0)); } bool maybe_plist_key_p(DOH *key) { return (Strncmp(key, "tmap:", 5) == 0); } bool print_circle(DOH *obj, bool list_p) // We have a complex object, which might be referenced several // times, or even recursively. Use Lisp's reader notation for // circular structures (#n#, #n=). // // An object can be printed in list-mode or object-mode; LIST_P toggles. // return TRUE if OBJ still needs to be printed { flush_parens(); // Following is a silly hack. It works around the limitation of // DOH's hash tables that only work with string keys! char address[32]; sprintf(address, "%p%c", obj, list_p ? 'L' : 'O'); DOH *placeholder = Getattr(print_circle_hash, address); if (placeholder) { Printv(out, placeholder, NIL); return false; } else { String *placeholder = NewStringf("#%d#", ++print_circle_count); Setattr(print_circle_hash, address, placeholder); Printf(out, "#%d=", print_circle_count); return true; } } void Sexp_print_value_of_key(DOH *value, DOH *key) { if ((Cmp(key, "parms") == 0) || (Cmp(key, "wrap:parms") == 0) || (Cmp(key, "kwargs") == 0) || (Cmp(key, "pattern") == 0)) Sexp_print_parms(value); else if (plist_key_p(key)) Sexp_print_plist(value); else if (maybe_plist_key_p(key)) { if (DohIsMapping(value)) Sexp_print_plist(value); else Sexp_print_doh(value); } else if (list_key_p(key)) Sexp_print_list(value); else if (boolean_key_p(key)) Sexp_print_boolean(value); else Sexp_print_doh(value); } void Sexp_print_boolean(DOH *obj) { flush_parens(); /* See DOH/Doh/base.c, DohGetInt() */ if (DohIsString(obj)) { if (atoi(Char(obj)) != 0) Printf(out, "t"); else Printf(out, "nil"); } else Printf(out, "nil"); } void Sexp_print_list(DOH *obj) { if (print_circle(obj, true)) { open_paren(NIL); for (; obj; obj = nextSibling(obj)) { Sexp_print_doh(obj); print_lazy_whitespace(); } close_paren(true); } } void Sexp_print_parms(DOH *obj) { // print it as a list of plists if (print_circle(obj, true)) { open_paren(NIL); for (; obj; obj = nextSibling(obj)) { if (DohIsMapping(obj)) { Iterator k; open_paren(NIL); for (k = First(obj); k.key; k = Next(k)) { if (!internal_key_p(k.key)) { DOH *value = Getattr(obj, k.key); Sexp_print_as_keyword(k.key); Sexp_print_value_of_key(value, k.key); print_lazy_whitespace(); } } close_paren(true); } else Sexp_print_doh(obj); print_lazy_whitespace(); } close_paren(true); } } void Sexp_print_doh(DOH *obj) { flush_parens(); if (DohIsString(obj)) { String *o = Str(obj); Replaceall(o, "\\", "\\\\"); Replaceall(o, "\"", "\\\""); Printf(out, "\"%s\"", o); Delete(o); } else { if (print_circle(obj, false)) { // Dispatch type if (nodeType(obj)) { Sexp_print_node(obj); } else if (DohIsMapping(obj)) { Iterator k; open_paren(NIL); for (k = First(obj); k.key; k = Next(k)) { if (!internal_key_p(k.key)) { DOH *value = Getattr(obj, k.key); flush_parens(); open_paren(NIL); Sexp_print_doh(k.key); Printf(out, " . "); Sexp_print_value_of_key(value, k.key); close_paren(); } } close_paren(); } else if (strcmp(ObjType(obj)->objname, "List") == 0) { int i; open_paren(NIL); for (i = 0; i < Len(obj); i++) { DOH *item = Getitem(obj, i); Sexp_print_doh(item); } close_paren(); } else { // What is it? Printf(out, "#", ObjType(obj)->objname, obj); } } } } void Sexp_print_as_keyword(const DOH *k) { /* Print key, replacing ":" with "-" because : is CL's package prefix */ flush_parens(); String *key = NewString(k); Replaceall(key, ":", "-"); Replaceall(key, "_", "-"); Printf(out, ":%s ", key); Delete(key); } void Sexp_print_plist_noparens(DOH *obj) { /* attributes map names to objects */ Iterator k; bool first; for (k = First(obj), first = true; k.key; k = Next(k), first = false) { if (!internal_key_p(k.key)) { DOH *value = Getattr(obj, k.key); flush_parens(); if (!first) { Printf(out, " "); } Sexp_print_as_keyword(k.key); /* Print value */ Sexp_print_value_of_key(value, k.key); } } } void Sexp_print_plist(DOH *obj) { flush_parens(); if (print_circle(obj, true)) { open_paren(NIL); Sexp_print_plist_noparens(obj); close_paren(); } } void Sexp_print_attributes(Node *obj) { Sexp_print_plist_noparens(obj); } void Sexp_print_node(Node *obj) { Node *cobj; open_paren(nodeType(obj)); /* A node has an attribute list... */ Sexp_print_attributes(obj); /* ... and child nodes. */ cobj = firstChild(obj); if (cobj) { print_lazy_newline(); flush_parens(); Sexp_print_as_keyword("children"); open_paren(NIL); for (; cobj; cobj = nextSibling(cobj)) { Sexp_print_node(cobj); } close_paren(); } close_paren(); } virtual int functionWrapper(Node *n) { ParmList *l = Getattr(n, "parms"); Wrapper *f = NewWrapper(); emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); DelWrapper(f); return SWIG_OK; } }; static Language *new_swig_sexp() { return new Sexp(); } extern "C" Language *swig_sexp(void) { return new_swig_sexp(); } swig-4.0.2/Source/Modules/uffi.cxx0000644000175000017500000002501013667507523016705 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * uffi.cxx * * Uffi language module for SWIG. * ----------------------------------------------------------------------------- */ // TODO: remove remnants of lisptype #include "swigmod.h" static const char *usage = "\ UFFI Options (available with -uffi)\n\ -identifier-converter - \n\ Specifies the type of conversion to do on C identifiers\n\ to convert them to symbols. There are two built-in\n\ converters: 'null' and 'lispify'. The default is\n\ 'null'. If you supply a name other than one of the\n\ built-ins, then a function by that name will be\n\ called to convert identifiers to symbols.\n\ "; class UFFI:public Language { public: virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int classHandler(Node *n); virtual int membervariableHandler(Node *n); }; static File *f_cl = 0; static struct { int count; String **entries; } defined_foreign_types; static String *identifier_converter = NewString("identifier-convert-null"); static int any_varargs(ParmList *pl) { Parm *p; for (p = pl; p; p = nextSibling(p)) { if (SwigType_isvarargs(Getattr(p, "type"))) return 1; } return 0; } /* utilities */ /* returns new string w/ parens stripped */ static String *strip_parens(String *string) { char *s = Char(string), *p; int len = Len(string); String *res; if (len == 0 || s[0] != '(' || s[len - 1] != ')') { return NewString(string); } p = (char *) malloc(len - 2 + 1); if (!p) { Printf(stderr, "Malloc failed\n"); SWIG_exit(EXIT_FAILURE); } strncpy(p, s + 1, len - 1); p[len - 2] = 0; /* null terminate */ res = NewString(p); free(p); return res; } static String *convert_literal(String *num_param, String *type) { String *num = strip_parens(num_param), *res; char *s = Char(num); /* Make sure doubles use 'd' instead of 'e' */ if (!Strcmp(type, "double")) { String *updated = Copy(num); if (Replace(updated, "e", "d", DOH_REPLACE_ANY) > 1) { Printf(stderr, "Weird!! number %s looks invalid.\n", num); SWIG_exit(EXIT_FAILURE); } Delete(num); return updated; } if (SwigType_type(type) == T_CHAR) { /* Use CL syntax for character literals */ return NewStringf("#\\%s", num_param); } else if (SwigType_type(type) == T_STRING) { /* Use CL syntax for string literals */ return NewStringf("\"%s\"", num_param); } if (Len(num) < 2 || s[0] != '0') { return num; } /* octal or hex */ res = NewStringf("#%c%s", s[1] == 'x' ? 'x' : 'o', s + 2); Delete(num); return res; } static void add_defined_foreign_type(String *type) { if (!defined_foreign_types.count) { /* Make fresh */ defined_foreign_types.count = 1; defined_foreign_types.entries = (String **) malloc(sizeof(String *)); } else { /* make room */ defined_foreign_types.count++; defined_foreign_types.entries = (String **) realloc(defined_foreign_types.entries, defined_foreign_types.count * sizeof(String *)); } if (!defined_foreign_types.entries) { Printf(stderr, "Out of memory\n"); SWIG_exit(EXIT_FAILURE); } /* Fill in the new data */ defined_foreign_types.entries[defined_foreign_types.count - 1] = Copy(type); } static String *get_ffi_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { Node *node = NewHash(); Setattr(node, "type", ty); Setattr(node, "name", name); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("ffitype", node, "", 0); Delete(node); if (tm) { return NewString(tm); } else { SwigType *tr = SwigType_typedef_resolve_all(ty); char *type_reduced = Char(tr); int i; //Printf(stdout,"convert_type %s\n", ty); if (SwigType_isconst(tr)) { SwigType_pop(tr); type_reduced = Char(tr); } if (SwigType_ispointer(type_reduced) || SwigType_isarray(ty) || !strncmp(type_reduced, "p.f", 3)) { return NewString(":pointer-void"); } for (i = 0; i < defined_foreign_types.count; i++) { if (!Strcmp(ty, defined_foreign_types.entries[i])) { return NewStringf("#.(%s \"%s\" :type :type)", identifier_converter, ty); } } if (!Strncmp(type_reduced, "enum ", 5)) { return NewString(":int"); } Printf(stderr, "Unsupported data type: %s (was: %s)\n", type_reduced, ty); SWIG_exit(EXIT_FAILURE); } return 0; } static String *get_lisp_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { Node *node = NewHash(); Setattr(node, "type", ty); Setattr(node, "name", name); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("lisptype", node, "", 0); Delete(node); return tm ? NewString(tm) : NewString(""); } void UFFI::main(int argc, char *argv[]) { int i; Preprocessor_define("SWIGUFFI 1", 0); SWIG_library_directory("uffi"); SWIG_config_file("uffi.swg"); for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-identifier-converter")) { char *conv = argv[i + 1]; if (!conv) Swig_arg_error(); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; /* check for built-ins */ if (!strcmp(conv, "lispify")) { Delete(identifier_converter); identifier_converter = NewString("identifier-convert-lispify"); } else if (!strcmp(conv, "null")) { Delete(identifier_converter); identifier_converter = NewString("identifier-convert-null"); } else { /* Must be user defined */ Delete(identifier_converter); identifier_converter = NewString(conv); } } if (!strcmp(argv[i], "-help")) { Printf(stdout, "%s\n", usage); } } } int UFFI::top(Node *n) { String *module = Getattr(n, "name"); String *output_filename = NewString(""); File *f_null = NewString(""); Printf(output_filename, "%s%s.cl", SWIG_output_directory(), module); f_cl = NewFile(output_filename, "w", SWIG_output_files()); if (!f_cl) { FileErrorDisplay(output_filename); SWIG_exit(EXIT_FAILURE); } Swig_register_filebyname("header", f_null); Swig_register_filebyname("begin", f_null); Swig_register_filebyname("runtime", f_null); Swig_register_filebyname("wrapper", f_cl); Swig_banner_target_lang(f_cl, ";;"); Printf(f_cl, "\n" ";; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; package: %s -*-\n\n(defpackage :%s\n (:use :common-lisp :uffi))\n\n(in-package :%s)\n", module, module, module); Printf(f_cl, "(eval-when (compile load eval)\n (defparameter *swig-identifier-converter* '%s))\n", identifier_converter); Language::top(n); Delete(f_cl); // Delete the handle, not the file Delete(f_null); return SWIG_OK; } int UFFI::functionWrapper(Node *n) { String *funcname = Getattr(n, "sym:name"); ParmList *pl = Getattr(n, "parms"); Parm *p; int argnum = 0, first = 1; // int varargs = 0; //Language::functionWrapper(n); Printf(f_cl, "(swig-defun \"%s\"\n", funcname); Printf(f_cl, " ("); /* Special cases */ if (ParmList_len(pl) == 0) { Printf(f_cl, ":void"); } else if (any_varargs(pl)) { Printf(f_cl, "#| varargs |#"); // varargs = 1; } else { for (p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); SwigType *argtype = Getattr(p, "type"); String *ffitype = get_ffi_type(n, argtype, argname); String *lisptype = get_lisp_type(n, argtype, argname); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } if (!first) { Printf(f_cl, "\n "); } Printf(f_cl, "(%s %s %s)", argname, ffitype, lisptype); first = 0; Delete(ffitype); Delete(lisptype); if (tempargname) Delete(argname); } } Printf(f_cl, ")\n"); /* finish arg list */ Printf(f_cl, " :returning %s\n" //" :strings-convert t\n" //" :call-direct %s\n" //" :optimize-for-space t" ")\n", get_ffi_type(n, Getattr(n, "type"), Swig_cresult_name()) //,varargs ? "nil" : "t" ); return SWIG_OK; } int UFFI::constantWrapper(Node *n) { String *type = Getattr(n, "type"); String *converted_value = convert_literal(Getattr(n, "value"), type); String *name = Getattr(n, "sym:name"); #if 0 Printf(stdout, "constant %s is of type %s. value: %s\n", name, type, converted_value); #endif Printf(f_cl, "(swig-defconstant \"%s\" %s)\n", name, converted_value); Delete(converted_value); return SWIG_OK; } // Includes structs int UFFI::classHandler(Node *n) { String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); Node *c; if (Strcmp(kind, "struct")) { Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); Printf(stderr, " (name: %s)\n", name); SWIG_exit(EXIT_FAILURE); } Printf(f_cl, "(swig-def-struct \"%s\"\n \n", name); for (c = firstChild(n); c; c = nextSibling(c)) { SwigType *type = Getattr(c, "type"); SwigType *decl = Getattr(c, "decl"); if (type) { type = Copy(type); SwigType_push(type, decl); String *lisp_type; if (Strcmp(nodeType(c), "cdecl")) { Printf(stderr, "Structure %s has a slot that we can't deal with.\n", name); Printf(stderr, "nodeType: %s, name: %s, type: %s\n", nodeType(c), Getattr(c, "name"), Getattr(c, "type")); SWIG_exit(EXIT_FAILURE); } /* Printf(stdout, "Converting %s in %s\n", type, name); */ lisp_type = get_ffi_type(n, type, Getattr(c, "sym:name")); Printf(f_cl, " (#.(%s \"%s\" :type :slot) %s)\n", identifier_converter, Getattr(c, "sym:name"), lisp_type); Delete(lisp_type); } } // Language::classHandler(n); Printf(f_cl, " )\n"); /* Add this structure to the known lisp types */ //Printf(stdout, "Adding %s foreign type\n", name); add_defined_foreign_type(name); return SWIG_OK; } int UFFI::membervariableHandler(Node *n) { Language::membervariableHandler(n); return SWIG_OK; } extern "C" Language *swig_uffi(void) { return new UFFI(); } swig-4.0.2/Source/Modules/swigmain.cxx0000644000175000017500000002046513667507523017603 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigmain.cxx * * Simplified Wrapper and Interface Generator (SWIG) * * This file is the main entry point to SWIG. It collects the command * line options, registers built-in language modules, and instantiates * a module for code generation. If adding new language modules * to SWIG, you would modify this file. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include /* Module factories. These functions are used to instantiate the built-in language modules. If adding a new language module to SWIG, place a similar function here. Make sure the function has "C" linkage. This is required so that modules can be dynamically loaded in future versions. */ extern "C" { Language *swig_csharp(void); Language *swig_d(void); Language *swig_go(void); Language *swig_guile(void); Language *swig_java(void); Language *swig_javascript(void); Language *swig_lua(void); Language *swig_mzscheme(void); Language *swig_ocaml(void); Language *swig_octave(void); Language *swig_perl5(void); Language *swig_php(void); Language *swig_python(void); Language *swig_r(void); Language *swig_ruby(void); Language *swig_scilab(void); Language *swig_tcl(void); Language *swig_xml(void); } /* Association of command line options to language modules. Place an entry for new language modules here, keeping the list sorted alphabetically. */ static TargetLanguageModule modules[] = { {"-allegrocl", NULL, "ALLEGROCL", Disabled}, {"-chicken", NULL, "CHICKEN", Disabled}, {"-clisp", NULL, "CLISP", Disabled}, {"-cffi", NULL, "CFFI", Disabled}, {"-csharp", swig_csharp, "C#", Supported}, {"-d", swig_d, "D", Supported}, {"-go", swig_go, "Go", Supported}, {"-guile", swig_guile, "Guile", Supported}, {"-java", swig_java, "Java", Supported}, {"-javascript", swig_javascript, "Javascript", Supported}, {"-lua", swig_lua, "Lua", Supported}, {"-modula3", NULL, "Modula 3", Disabled}, {"-mzscheme", swig_mzscheme, "MzScheme/Racket", Experimental}, {"-ocaml", swig_ocaml, "OCaml", Experimental}, {"-octave", swig_octave, "Octave", Supported}, {"-perl", swig_perl5, NULL, Supported}, {"-perl5", swig_perl5, "Perl 5", Supported}, {"-php", swig_php, NULL, Supported}, {"-php5", NULL, "PHP 5", Disabled}, {"-php7", swig_php, "PHP 7", Supported}, {"-pike", NULL, "Pike", Disabled}, {"-python", swig_python, "Python", Supported}, {"-r", swig_r, "R (aka GNU S)", Supported}, {"-ruby", swig_ruby, "Ruby", Supported}, {"-scilab", swig_scilab, "Scilab", Supported}, {"-sexp", NULL, "Lisp S-Expressions", Disabled}, {"-tcl", swig_tcl, NULL, Supported}, {"-tcl8", swig_tcl, "Tcl 8", Supported}, {"-uffi", NULL, "Common Lisp / UFFI", Disabled}, {"-xml", swig_xml, "XML", Supported}, {NULL, NULL, NULL, Disabled} }; #ifdef MACSWIG #include #include #endif //----------------------------------------------------------------- // main() // // Main program. Initializes the files and starts the parser. //----------------------------------------------------------------- void SWIG_merge_envopt(const char *env, int oargc, char *oargv[], int *nargc, char ***nargv) { if (!env) { *nargc = oargc; *nargv = (char **)malloc(sizeof(char *) * (oargc + 1)); memcpy(*nargv, oargv, sizeof(char *) * (oargc + 1)); return; } int argc = 1; int arge = oargc + 1024; char **argv = (char **) malloc(sizeof(char *) * (arge + 1)); char *buffer = (char *) malloc(2048); char *b = buffer; char *be = b + 1023; const char *c = env; while ((b != be) && *c && (argc < arge)) { while (isspace(*c) && *c) ++c; if (*c) { argv[argc] = b; ++argc; } while ((b != be) && *c && !isspace(*c)) { *(b++) = *(c++); } *b++ = 0; } argv[0] = oargv[0]; for (int i = 1; (i < oargc) && (argc < arge); ++i, ++argc) { argv[argc] = oargv[i]; } argv[argc] = NULL; *nargc = argc; *nargv = argv; } static void insert_option(int *argc, char ***argv, int index, char const *start, char const *end) { int new_argc = *argc; char **new_argv = *argv; size_t option_len = end - start; // Preserve the NULL pointer at argv[argc] new_argv = (char **)realloc(new_argv, (new_argc + 2) * sizeof(char *)); memmove(&new_argv[index + 1], &new_argv[index], sizeof(char *) * (new_argc + 1 - index)); new_argc++; new_argv[index] = (char *)malloc(option_len + 1); memcpy(new_argv[index], start, option_len); new_argv[index][option_len] = '\0'; *argc = new_argc; *argv = new_argv; } static void merge_options_files(int *argc, char ***argv) { static const int BUFFER_SIZE = 4096; char buffer[BUFFER_SIZE]; int i; int insert; char **new_argv = *argv; int new_argc = *argc; FILE *f; i = 1; while (i < new_argc) { if (new_argv[i] && new_argv[i][0] == '@' && (f = fopen(&new_argv[i][1], "r"))) { int ci; char *b; char *be = &buffer[BUFFER_SIZE]; int quote = 0; bool escape = false; new_argc--; memmove(&new_argv[i], &new_argv[i + 1], sizeof(char *) * (new_argc - i)); insert = i; b = buffer; while ((ci = fgetc(f)) != EOF) { const char c = static_cast(ci); if (escape) { if (b != be) { *b = c; ++b; } escape = false; } else if (c == '\\') { escape = true; } else if (!quote && (c == '\'' || c == '"')) { quote = c; } else if (quote && c == quote) { quote = 0; } else if (isspace(c) && !quote) { if (b != buffer) { insert_option(&new_argc, &new_argv, insert, buffer, b); insert++; b = buffer; } } else if (b != be) { *b = c; ++b; } } if (b != buffer) insert_option(&new_argc, &new_argv, insert, buffer, b); fclose(f); } else { ++i; } } *argv = new_argv; *argc = new_argc; } int main(int margc, char **margv) { int i; const TargetLanguageModule *language_module = 0; int argc; char **argv; SWIG_merge_envopt(getenv("SWIG_FEATURES"), margc, margv, &argc, &argv); merge_options_files(&argc, &argv); #ifdef MACSWIG SIOUXSettings.asktosaveonclose = false; argc = ccommand(&argv); #endif Swig_init_args(argc, argv); /* Get options */ for (i = 1; i < argc; i++) { if (argv[i]) { bool is_target_language_module = false; for (int j = 0; modules[j].name; j++) { if (strcmp(modules[j].name, argv[i]) == 0) { language_module = &modules[j]; is_target_language_module = true; break; } } if (is_target_language_module) { Swig_mark_arg(i); if (language_module->status == Disabled) { if (language_module->help) Printf(stderr, "Target language option %s (%s) is no longer supported.\n", language_module->name, language_module->help); else Printf(stderr, "Target language option %s is no longer supported.\n", language_module->name); SWIG_exit(EXIT_FAILURE); } } else if ((strcmp(argv[i], "-help") == 0) || (strcmp(argv[i], "--help") == 0)) { if (strcmp(argv[i], "--help") == 0) strcpy(argv[i], "-help"); Printf(stdout, "Supported Target Language Options\n"); for (int j = 0; modules[j].name; j++) { if (modules[j].help && modules[j].status == Supported) { Printf(stdout, " %-15s - Generate %s wrappers\n", modules[j].name, modules[j].help); } } Printf(stdout, "\nExperimental Target Language Options\n"); for (int j = 0; modules[j].name; j++) { if (modules[j].help && modules[j].status == Experimental) { Printf(stdout, " %-15s - Generate %s wrappers\n", modules[j].name, modules[j].help); } } // Swig_mark_arg not called as the general -help options also need to be displayed later on } } } int res = SWIG_main(argc, argv, language_module); return res; } swig-4.0.2/Source/Modules/interface.cxx0000644000175000017500000001613713667507523017726 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * interface.cxx * * This module contains support for the interface feature. * This feature is used in language modules where the target language does not * naturally support C++ style multiple inheritance, but does support inheritance * from multiple interfaces. * ----------------------------------------------------------------------------- */ #include "swigmod.h" static bool interface_feature_enabled = false; /* ----------------------------------------------------------------------------- * collect_interface_methods() * * Create a list of all the methods from the base classes of class n that are * marked as an interface. The resulting list is thus the list of methods that * need to be implemented in order for n to be non-abstract. * ----------------------------------------------------------------------------- */ static List *collect_interface_methods(Node *n) { List *methods = NewList(); if (Hash *bases = Getattr(n, "interface:bases")) { List *keys = Keys(bases); for (Iterator base = First(keys); base.item; base = Next(base)) { Node *cls = Getattr(bases, base.item); if (cls == n) continue; for (Node *child = firstChild(cls); child; child = nextSibling(child)) { if (Cmp(nodeType(child), "cdecl") == 0) { if (GetFlag(child, "feature:ignore") || Getattr(child, "interface:owner")) continue; // skip methods propagated to bases Node *m = Copy(child); set_nextSibling(m, NIL); set_previousSibling(m, NIL); Setattr(m, "interface:owner", cls); Append(methods, m); } } } Delete(keys); } return methods; } /* ----------------------------------------------------------------------------- * collect_interface_bases * ----------------------------------------------------------------------------- */ static void collect_interface_bases(Hash *bases, Node *n) { if (Getattr(n, "feature:interface")) { String *name = Getattr(n, "interface:name"); if (!Getattr(bases, name)) Setattr(bases, name, n); } if (List *baselist = Getattr(n, "bases")) { for (Iterator base = First(baselist); base.item; base = Next(base)) { if (!GetFlag(base.item, "feature:ignore")) { if (Getattr(base.item, "feature:interface")) collect_interface_bases(bases, base.item); } } } } /* ----------------------------------------------------------------------------- * collect_interface_base_classes() * * Create a hash containing all the classes up the inheritance hierarchy * marked with feature:interface (including this class n). * Stops going up the inheritance chain as soon as a class is found without * feature:interface. * The idea is to find all the base interfaces that a class must implement. * ----------------------------------------------------------------------------- */ static void collect_interface_base_classes(Node *n) { if (Getattr(n, "feature:interface")) { // check all bases are also interfaces if (List *baselist = Getattr(n, "bases")) { for (Iterator base = First(baselist); base.item; base = Next(base)) { if (!GetFlag(base.item, "feature:ignore")) { if (!Getattr(base.item, "feature:interface")) { Swig_error(Getfile(n), Getline(n), "Base class '%s' of '%s' is not similarly marked as an interface.\n", SwigType_namestr(Getattr(base.item, "name")), SwigType_namestr(Getattr(n, "name"))); SWIG_exit(EXIT_FAILURE); } } } } } Hash *interface_bases = NewHash(); collect_interface_bases(interface_bases, n); if (Len(interface_bases) == 0) Delete(interface_bases); else Setattr(n, "interface:bases", interface_bases); } /* ----------------------------------------------------------------------------- * process_interface_name() * ----------------------------------------------------------------------------- */ static void process_interface_name(Node *n) { if (Getattr(n, "feature:interface")) { String *interface_name = Getattr(n, "feature:interface:name"); if (!Len(interface_name)) { Swig_error(Getfile(n), Getline(n), "The interface feature for '%s' is missing the name attribute.\n", SwigType_namestr(Getattr(n, "name"))); SWIG_exit(EXIT_FAILURE); } if (Strchr(interface_name, '%')) { String *name = NewStringf(interface_name, Getattr(n, "sym:name")); Setattr(n, "interface:name", name); } else { Setattr(n, "interface:name", interface_name); } } } /* ----------------------------------------------------------------------------- * Swig_interface_propagate_methods() * * Find all the base classes marked as an interface (with feature:interface) for * class node n. For each of these, add all of its methods as methods of n so that * n is not abstract. If class n is also marked as an interface, it will remain * abstract and not have any methods added. * ----------------------------------------------------------------------------- */ void Swig_interface_propagate_methods(Node *n) { if (interface_feature_enabled) { process_interface_name(n); collect_interface_base_classes(n); List *methods = collect_interface_methods(n); bool is_interface = Getattr(n, "feature:interface") != 0; for (Iterator mi = First(methods); mi.item; mi = Next(mi)) { if (!is_interface && GetFlag(mi.item, "abstract")) continue; String *this_decl = Getattr(mi.item, "decl"); String *this_decl_resolved = SwigType_typedef_resolve_all(this_decl); bool identically_overloaded_method = false; // true when a base class' method is implemented in n if (SwigType_isfunction(this_decl_resolved)) { String *name = Getattr(mi.item, "name"); for (Node *child = firstChild(n); child; child = nextSibling(child)) { if (Getattr(child, "interface:owner")) break; // at the end of the list are newly appended methods if (Cmp(nodeType(child), "cdecl") == 0) { if (checkAttribute(child, "name", name)) { String *decl = SwigType_typedef_resolve_all(Getattr(child, "decl")); identically_overloaded_method = Strcmp(decl, this_decl_resolved) == 0; Delete(decl); if (identically_overloaded_method) break; } } } } Delete(this_decl_resolved); if (!identically_overloaded_method) { // TODO: Fix if the method is overloaded with different arguments / has default args appendChild(n, mi.item); } else { Delete(mi.item); } } Delete(methods); } } /* ----------------------------------------------------------------------------- * Swig_interface_feature_enable() * * Turn on interface feature support * ----------------------------------------------------------------------------- */ void Swig_interface_feature_enable() { interface_feature_enabled = true; } swig-4.0.2/Source/Modules/mzscheme.cxx0000644000175000017500000006320313667507523017575 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * mzscheme.cxx * * Mzscheme language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include static const char *usage = "\ Mzscheme Options (available with -mzscheme)\n\ -declaremodule - Create extension that declares a module\n\ -dynamic-load ,[lib,...] - Do not link with these libraries, dynamic load them\n\ -noinit - Do not emit module initialization code\n\ -prefix - Set a prefix to be prepended to all names\n\ "; static String *fieldnames_tab = 0; static String *convert_tab = 0; static String *convert_proto_tab = 0; static String *struct_name = 0; static String *mangled_struct_name = 0; static String *prefix = 0; static bool declaremodule = false; static bool noinit = false; static String *load_libraries = NULL; static String *module = 0; static const char *mzscheme_path = "mzscheme"; static String *init_func_def = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_init = 0; // Used for garbage collection static int exporting_destructor = 0; static String *swigtype_ptr = 0; static String *cls_swigtype = 0; class MZSCHEME:public Language { public: /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int i; SWIG_library_directory(mzscheme_path); // Look for certain command line options for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); SWIG_exit(0); } else if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-declaremodule") == 0) { declaremodule = true; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noinit") == 0) { noinit = true; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dynamic-load") == 0) { if (argv[i + 1]) { Delete(load_libraries); load_libraries = NewString(argv[i + 1]); Swig_mark_arg(i++); Swig_mark_arg(i); } else { Swig_arg_error(); } } } } // If a prefix has been specified make sure it ends in a '_' (not actually used!) if (prefix) { const char *px = Char(prefix); if (px[Len(prefix) - 1] != '_') Printf(prefix, "_"); } else prefix = NewString("swig_"); // Add a symbol for this module Preprocessor_define("SWIGMZSCHEME 1", 0); // Set name of typemaps SWIG_typemap_lang("mzscheme"); // Read in default typemaps */ SWIG_config_file("mzscheme.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); init_func_def = NewString(""); Swig_register_filebyname("init", init_func_def); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGMZSCHEME\n#define SWIGMZSCHEME\n#endif\n\n"); module = Getattr(n, "name"); Language::top(n); SwigType_emit_type_table(f_runtime, f_wrappers); if (!noinit) { if (declaremodule) { Printf(f_init, "#define SWIG_MZSCHEME_CREATE_MENV(env) scheme_primitive_module(scheme_intern_symbol(\"%s\"), env)\n", module); } else { Printf(f_init, "#define SWIG_MZSCHEME_CREATE_MENV(env) (env)\n"); } Printf(f_init, "%s\n", Char(init_func_def)); if (declaremodule) { Printf(f_init, "\tscheme_finish_primitive_module(menv);\n"); } Printf(f_init, "\treturn scheme_void;\n}\n"); Printf(f_init, "Scheme_Object *scheme_initialize(Scheme_Env *env) {\n"); if (load_libraries) { Printf(f_init, "mz_set_dlopen_libraries(\"%s\");\n", load_libraries); } Printf(f_init, "\treturn scheme_reload(env);\n"); Printf(f_init, "}\n"); Printf(f_init, "Scheme_Object *scheme_module_name(void) {\n"); if (declaremodule) { Printf(f_init, " return scheme_intern_symbol((char*)\"%s\");\n", module); } else { Printf(f_init, " return scheme_make_symbol((char*)\"%s\");\n", module); } Printf(f_init, "}\n"); } /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------ * functionWrapper() * Create a function declaration and register it with the interpreter. * ------------------------------------------------------------ */ void throw_unhandled_mzscheme_type_error(SwigType *d) { Swig_warning(WARN_TYPEMAP_UNDEF, input_file, line_number, "Unable to handle type %s.\n", SwigType_str(d, 0)); } /* Return true iff T is a pointer type */ int is_a_pointer(SwigType *t) { return SwigType_ispointer(SwigType_typedef_resolve_all(t)); } virtual int functionWrapper(Node *n) { char *iname = GetChar(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; Wrapper *f = NewWrapper(); String *proc_name = NewString(""); String *target = NewString(""); String *arg = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *build = NewString(""); String *tm; int i = 0; int numargs; int numreq; String *overname = 0; if (load_libraries) { ParmList *parms = Getattr(n, "parms"); SwigType *type = Getattr(n, "type"); String *name = NewString("caller"); Setattr(n, "wrap:action", Swig_cresult(type, Swig_cresult_name(), Swig_cfunction_call(name, parms))); } // Make a wrapper name for this String *wname = Swig_name_wrapper(iname); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) { DelWrapper(f); return SWIG_ERROR; } } if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); // Build the name for Scheme. Printv(proc_name, iname, NIL); Replaceall(proc_name, "_", "-"); // writing the function wrapper function Printv(f->def, "static Scheme_Object *", wname, " (", NIL); Printv(f->def, "int argc, Scheme_Object **argv", NIL); Printv(f->def, ")\n{", NIL); /* Define the scheme name in C. This define is used by several macros. */ Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); numargs = emit_num_arguments(l); numreq = emit_num_required(l); /* Add the holder for the pointer to the function to be opened */ if (load_libraries) { Wrapper_add_local(f, "_function_loaded", "static int _function_loaded=(1==0)"); Wrapper_add_local(f, "_the_function", "static void *_the_function=NULL"); { String *parms = ParmList_protostr(l); String *func = NewStringf("(*caller)(%s)", parms); Wrapper_add_local(f, "caller", SwigType_lstr(d, func)); /*"(*caller)()")); */ } } // adds local variables Wrapper_add_local(f, "lenv", "int lenv = 1"); Wrapper_add_local(f, "values", "Scheme_Object *values[MAXVALUES]"); if (load_libraries) { Printf(f->code, "if (!_function_loaded) { _the_function=mz_load_function(\"%s\");_function_loaded=(1==1); }\n", iname); Printf(f->code, "if (!_the_function) { scheme_signal_error(\"Cannot load C function '%s'\"); }\n", iname); Printf(f->code, "caller=_the_function;\n"); } // Now write code to extract the parameters (this is super ugly) for (i = 0, p = l; i < numargs; i++) { /* Skip ignored arguments */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); // Produce names of source and target Clear(target); Clear(arg); String *source = NewStringf("argv[%d]", i); Printf(target, "%s", ln); Printv(arg, Getattr(p, "name"), NIL); if (i >= numreq) { Printf(f->code, "if (argc > %d) {\n", i); } // Handle parameter types. if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", target); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:in:next"); } else { // no typemap found // check if typedef and resolve throw_unhandled_mzscheme_type_error(pt); p = nextSibling(p); } if (i >= numreq) { Printf(f->code, "}\n"); } Delete(source); } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } // Pass output arguments back to the caller. for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "emit:input")); /* Deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* Deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Free up any memory allocated for the arguments. /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } // Now write code to make the function call String *actioncode = emit_action(n); // Now have return value, figure out what to do with it. if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "values[0]"); Replaceall(tm, "$result", "values[0]"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printv(f->code, tm, "\n", NIL); } else { throw_unhandled_mzscheme_type_error(d); } emit_return_variable(n, d, f); // Dump the argument output code Printv(f->code, Char(outarg), NIL); // Dump the argument cleanup code Printv(f->code, Char(cleanup), NIL); // Look for any remaining cleanup if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } } // Free any memory allocated by the function being wrapped.. if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } // Wrap things up (in a manner of speaking) Printv(f->code, tab4, "return SWIG_MzScheme_PackageValues(lenv, values);\n", NIL); Printf(f->code, "#undef FUNC_NAME\n"); Printv(f->code, "}\n", NIL); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Wrapper_print(f, f_wrappers); if (!Getattr(n, "sym:overloaded")) { // Now register the function char temp[256]; sprintf(temp, "%d", numargs); if (exporting_destructor) { Printf(init_func_def, "SWIG_TypeClientData(SWIGTYPE%s, (void *) %s);\n", swigtype_ptr, wname); } Printf(init_func_def, "scheme_add_global(\"%s\", scheme_make_prim_w_arity(%s,\"%s\",%d,%d),menv);\n", proc_name, wname, proc_name, numreq, numargs); } else { if (!Getattr(n, "sym:nextSibling")) { /* Emit overloading dispatch function */ int maxargs; String *dispatch = Swig_overload_dispatch(n, "return %s(argc,argv);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *df = NewWrapper(); String *dname = Swig_name_wrapper(iname); Printv(df->def, "static Scheme_Object *\n", dname, "(int argc, Scheme_Object **argv) {", NIL); Printv(df->code, dispatch, "\n", NIL); Printf(df->code, "scheme_signal_error(\"No matching function for overloaded '%s'\");\n", iname); Printf(df->code, "return NULL;\n", iname); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); Printf(init_func_def, "scheme_add_global(\"%s\", scheme_make_prim_w_arity(%s,\"%s\",%d,%d),menv);\n", proc_name, dname, proc_name, 0, maxargs); DelWrapper(df); Delete(dispatch); Delete(dname); } } Delete(proc_name); Delete(target); Delete(arg); Delete(outarg); Delete(cleanup); Delete(build); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * * Create a link to a C variable. * This creates a single function _wrap_swig_var_varname(). * This function takes a single optional argument. If supplied, it means * we are setting this variable to some value. If omitted, it means we are * simply evaluating this variable. Either way, we return the variables * value. * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *proc_name = NewString(""); String *tm; String *tm2 = NewString(""); String *argnum = NewString("0"); String *arg = NewString("argv[0]"); Wrapper *f; if (!addSymbol(iname, n)) return SWIG_ERROR; f = NewWrapper(); // evaluation function names String *var_name = Swig_name_wrapper(iname); // Build the name for scheme. Printv(proc_name, iname, NIL); Replaceall(proc_name, "_", "-"); Setattr(n, "wrap:name", proc_name); if ((SwigType_type(t) != T_USER) || (is_a_pointer(t))) { Printf(f->def, "static Scheme_Object *%s(int argc, Scheme_Object** argv) {\n", var_name); Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); Wrapper_add_local(f, "swig_result", "Scheme_Object *swig_result"); if (!GetFlag(n, "feature:immutable")) { /* Check for a setting of the variable value */ Printf(f->code, "if (argc) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "argv[0]"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "argv[0]"); Replaceall(tm, "$argnum", "1"); emit_action_code(n, f->code, tm); } else { throw_unhandled_mzscheme_type_error(t); } Printf(f->code, "}\n"); } // Now return the value of the variable (regardless // of evaluating or setting) if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "swig_result"); Replaceall(tm, "$result", "swig_result"); /* Printf (f->code, "%s\n", tm); */ emit_action_code(n, f->code, tm); } else { throw_unhandled_mzscheme_type_error(t); } Printf(f->code, "\nreturn swig_result;\n"); Printf(f->code, "#undef FUNC_NAME\n"); Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); // Now add symbol to the MzScheme interpreter Printv(init_func_def, "scheme_add_global(\"", proc_name, "\", scheme_make_prim_w_arity(", var_name, ", \"", proc_name, "\", ", "0", ", ", "1", "), menv);\n", NIL); } else { Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); } Delete(var_name); Delete(proc_name); Delete(argnum); Delete(arg); Delete(tm2); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); String *var_name = NewString(""); String *proc_name = NewString(""); String *rvalue = NewString(""); String *temp = NewString(""); String *tm; // Make a static variable; Printf(var_name, "_wrap_const_%s", Swig_name_mangle(Getattr(n, "sym:name"))); // Build the name for scheme. Printv(proc_name, iname, NIL); Replaceall(proc_name, "_", "-"); if ((SwigType_type(type) == T_USER) && (!is_a_pointer(type))) { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } // See if there's a typemap Printv(rvalue, value, NIL); if ((SwigType_type(type) == T_CHAR) && (is_a_pointer(type) == 1)) { temp = Copy(rvalue); Clear(rvalue); Printv(rvalue, "\"", temp, "\"", NIL); } if ((SwigType_type(type) == T_CHAR) && (is_a_pointer(type) == 0)) { Delete(temp); temp = Copy(rvalue); Clear(rvalue); Printv(rvalue, "'", temp, "'", NIL); } if ((tm = Swig_typemap_lookup("constant", n, name, 0))) { Replaceall(tm, "$source", rvalue); Replaceall(tm, "$value", rvalue); Replaceall(tm, "$target", name); Printf(f_init, "%s\n", tm); } else { // Create variable and assign it a value Printf(f_header, "static %s = ", SwigType_lstr(type, var_name)); bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); if ((SwigType_type(type) == T_STRING)) { Printf(f_header, "\"%s\";\n", value); } else if (SwigType_type(type) == T_CHAR && !is_enum_item) { Printf(f_header, "\'%s\';\n", value); } else { Printf(f_header, "%s;\n", value); } // Now create a variable declaration { /* Hack alert: will cleanup later -- Dave */ Node *nn = NewHash(); Setfile(nn, Getfile(n)); Setline(nn, Getline(n)); Setattr(nn, "name", var_name); Setattr(nn, "sym:name", iname); Setattr(nn, "type", type); SetFlag(nn, "feature:immutable"); variableWrapper(nn); Delete(nn); } } Delete(proc_name); Delete(rvalue); Delete(temp); return SWIG_OK; } virtual int destructorHandler(Node *n) { exporting_destructor = true; Language::destructorHandler(n); exporting_destructor = false; return SWIG_OK; } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { String *mangled_classname = 0; String *real_classname = 0; String *scm_structname = NewString(""); SwigType *ctype_ptr = NewStringf("p.%s", getClassType()); SwigType *t = NewStringf("p.%s", Getattr(n, "name")); swigtype_ptr = SwigType_manglestr(t); Delete(t); cls_swigtype = SwigType_manglestr(Getattr(n, "name")); fieldnames_tab = NewString(""); convert_tab = NewString(""); convert_proto_tab = NewString(""); struct_name = Getattr(n, "sym:name"); mangled_struct_name = Swig_name_mangle(Getattr(n, "sym:name")); Printv(scm_structname, struct_name, NIL); Replaceall(scm_structname, "_", "-"); real_classname = Getattr(n, "name"); mangled_classname = Swig_name_mangle(real_classname); Printv(fieldnames_tab, "static const char *_swig_struct_", cls_swigtype, "_field_names[] = { \n", NIL); Printv(convert_proto_tab, "static Scheme_Object *_swig_convert_struct_", cls_swigtype, "(", SwigType_str(ctype_ptr, "ptr"), ");\n", NIL); Printv(convert_tab, "static Scheme_Object *_swig_convert_struct_", cls_swigtype, "(", SwigType_str(ctype_ptr, "ptr"), ")\n {\n", NIL); Printv(convert_tab, tab4, "Scheme_Object *obj;\n", tab4, "Scheme_Object *fields[_swig_struct_", cls_swigtype, "_field_names_cnt];\n", tab4, "int i = 0;\n\n", NIL); /* Generate normal wrappers */ Language::classHandler(n); Printv(convert_tab, tab4, "obj = scheme_make_struct_instance(", "_swig_struct_type_", cls_swigtype, ", i, fields);\n", NIL); Printv(convert_tab, tab4, "return obj;\n}\n\n", NIL); Printv(fieldnames_tab, "};\n", NIL); Printv(f_header, "static Scheme_Object *_swig_struct_type_", cls_swigtype, ";\n", NIL); Printv(f_header, fieldnames_tab, NIL); Printv(f_header, "#define _swig_struct_", cls_swigtype, "_field_names_cnt (sizeof(_swig_struct_", cls_swigtype, "_field_names)/sizeof(char*))\n", NIL); Printv(f_header, convert_proto_tab, NIL); Printv(f_wrappers, convert_tab, NIL); Printv(init_func_def, "_swig_struct_type_", cls_swigtype, " = SWIG_MzScheme_new_scheme_struct(menv, \"", scm_structname, "\", ", "_swig_struct_", cls_swigtype, "_field_names_cnt,", "(char**) _swig_struct_", cls_swigtype, "_field_names);\n", NIL); Delete(mangled_classname); Delete(swigtype_ptr); swigtype_ptr = 0; Delete(fieldnames_tab); Delete(convert_tab); Delete(ctype_ptr); Delete(convert_proto_tab); struct_name = 0; mangled_struct_name = 0; Delete(cls_swigtype); cls_swigtype = 0; return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { Language::membervariableHandler(n); if (!is_smart_pointer()) { String *symname = Getattr(n, "sym:name"); String *name = Getattr(n, "name"); SwigType *type = Getattr(n, "type"); String *swigtype = SwigType_manglestr(Getattr(n, "type")); String *tm = 0; String *access_mem = NewString(""); SwigType *ctype_ptr = NewStringf("p.%s", Getattr(n, "type")); Printv(fieldnames_tab, tab4, "\"", symname, "\",\n", NIL); Printv(access_mem, "(ptr)->", name, NIL); if ((SwigType_type(type) == T_USER) && (!is_a_pointer(type))) { Printv(convert_tab, tab4, "fields[i++] = ", NIL); Printv(convert_tab, "_swig_convert_struct_", swigtype, "((", SwigType_str(ctype_ptr, 0), ")&((ptr)->", name, "));\n", NIL); } else if ((tm = Swig_typemap_lookup("varout", n, access_mem, 0))) { Replaceall(tm, "$result", "fields[i++]"); Printv(convert_tab, tm, "\n", NIL); } else Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported member variable type %s (ignored).\n", SwigType_str(type, 0)); Delete(access_mem); } return SWIG_OK; } /* ------------------------------------------------------------ * validIdentifier() * ------------------------------------------------------------ */ virtual int validIdentifier(String *s) { char *c = Char(s); /* Check whether we have an R5RS identifier. */ /* --> * | */ /* --> | */ if (!(isalpha(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~'))) { /* --> + | - | ... */ if ((strcmp(c, "+") == 0) || strcmp(c, "-") == 0 || strcmp(c, "...") == 0) return 1; else return 0; } /* --> | | */ while (*c) { if (!(isalnum(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~') || (*c == '+') || (*c == '-') || (*c == '.') || (*c == '@'))) return 0; c++; } return 1; } String *runtimeCode() { String *s = Swig_include_sys("mzrun.swg"); if (!s) { Printf(stderr, "*** Unable to open 'mzrun.swg'\n"); s = NewString(""); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigmzrun.h"); } }; /* ----------------------------------------------------------------------------- * swig_mzscheme() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_mzscheme() { return new MZSCHEME(); } extern "C" Language *swig_mzscheme(void) { return new_swig_mzscheme(); } swig-4.0.2/Source/Modules/javascript.cxx0000644000175000017500000022356213667507523020136 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * javascript.cxx * * Javascript language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" /** * Enables extra debugging information in typemaps. */ static bool js_template_enable_debug = false; #define ERR_MSG_ONLY_ONE_ENGINE_PLEASE "Only one engine can be specified at a time." // keywords used for state variables #define NAME "name" #define NAME_MANGLED "name_mangled" #define TYPE "type" #define TYPE_MANGLED "type_mangled" #define WRAPPER_NAME "wrapper" #define IS_IMMUTABLE "is_immutable" #define IS_STATIC "is_static" #define IS_ABSTRACT "is_abstract" #define GETTER "getter" #define SETTER "setter" #define PARENT "parent" #define PARENT_MANGLED "parent_mangled" #define CTOR "ctor" #define CTOR_WRAPPERS "ctor_wrappers" #define CTOR_DISPATCHERS "ctor_dispatchers" #define DTOR "dtor" #define ARGCOUNT "wrap:argc" #define HAS_TEMPLATES "has_templates" #define FORCE_CPP "force_cpp" #define RESET true // keys for global state variables #define CREATE_NAMESPACES "create_namespaces" #define REGISTER_NAMESPACES "register_namespaces" #define INITIALIZER "initializer" // keys for class scoped state variables #define MEMBER_VARIABLES "member_variables" #define MEMBER_FUNCTIONS "member_functions" #define STATIC_FUNCTIONS "static_functions" #define STATIC_VARIABLES "static_variables" /** * A convenience class to manage state variables for emitters. * The implementation delegates to SWIG Hash DOHs and provides * named sub-hashes for class, variable, and function states. */ class JSEmitterState { public: JSEmitterState(); ~JSEmitterState(); DOH *globals(); DOH *globals(const char *key, DOH *initial = 0); DOH *clazz(bool reset = false); DOH *clazz(const char *key, DOH *initial = 0); DOH *function(bool reset = false); DOH *function(const char *key, DOH *initial = 0); DOH *variable(bool reset = false); DOH *variable(const char *key, DOH *initial = 0); static int IsSet(DOH *val); private: DOH *getState(const char *key, bool reset = false); Hash *globalHash; }; /** * A convenience class that wraps a code snippet used as template * for code generation. */ class Template { public: Template(const String *code); Template(const String *code, const String *templateName); Template(const Template & other); ~Template(); String *str(); Template & replace(const String *pattern, const String *repl); Template & print(DOH *doh); Template & pretty_print(DOH *doh); void operator=(const Template & t); Template & trim(); private: String *code; String *templateName; }; /** * JSEmitter represents an abstraction of javascript code generators * for different javascript engines. **/ class JSEmitter { protected: typedef JSEmitterState State; enum MarshallingMode { Setter, Getter, Ctor, Function }; public: enum JSEngine { JavascriptCore, V8, NodeJS }; JSEmitter(JSEngine engine); virtual ~ JSEmitter(); /** * Opens output files and temporary output DOHs. */ virtual int initialize(Node *n); /** * Writes all collected code into the output file(s). */ virtual int dump(Node *n) = 0; /** * Cleans up all open output DOHs. */ virtual int close() = 0; /** * Switches the context for code generation. * * Classes, global variables and global functions may need to * be registered in certain static tables. * This method should be used to switch output DOHs correspondingly. */ virtual int switchNamespace(Node *); /** * Invoked at the beginning of the classHandler. */ virtual int enterClass(Node *); /** * Invoked at the end of the classHandler. */ virtual int exitClass(Node *) { return SWIG_OK; }; /** * Invoked at the beginning of the variableHandler. */ virtual int enterVariable(Node *); /** * Invoked at the end of the variableHandler. */ virtual int exitVariable(Node *) { return SWIG_OK; }; /** * Invoked at the beginning of the functionHandler. */ virtual int enterFunction(Node *); /** * Invoked at the end of the functionHandler. */ virtual int exitFunction(Node *) { return SWIG_OK; }; /** * Invoked by functionWrapper callback after call to Language::functionWrapper. */ virtual int emitWrapperFunction(Node *n); /** * Invoked by nativeWrapper callback */ virtual int emitNativeFunction(Node *n); /** * Invoked from constantWrapper after call to Language::constantWrapper. **/ virtual int emitConstant(Node *n); /** * Registers a given code snippet for a given key name. * * This method is called by the fragmentDirective handler * of the JAVASCRIPT language module. **/ int registerTemplate(const String *name, const String *code); /** * Retrieve the code template registered for a given name. */ Template getTemplate(const String *name); State & getState(); protected: /** * Generates code for a constructor function. */ virtual int emitCtor(Node *n); /** * Generates code for a destructor function. */ virtual int emitDtor(Node *n); /** * Generates code for a function. */ virtual int emitFunction(Node *n, bool is_member, bool is_static); virtual int emitFunctionDispatcher(Node *n, bool /*is_member */ ); /** * Generates code for a getter function. */ virtual int emitGetter(Node *n, bool is_member, bool is_static); /** * Generates code for a setter function. */ virtual int emitSetter(Node *n, bool is_member, bool is_static); virtual void marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) = 0; virtual String *emitInputTypemap(Node *n, Parm *params, Wrapper *wrapper, String *arg); virtual void marshalOutput(Node *n, ParmList *params, Wrapper *wrapper, String *actioncode, const String *cresult = 0, bool emitReturnVariable = true); virtual void emitCleanupCode(Node *n, Wrapper *wrapper, ParmList *params); /** * Helper function to retrieve the first parent class node. */ Node *getBaseClass(Node *n); Parm *skipIgnoredArgs(Parm *p); virtual int createNamespace(String *scope); virtual Hash *createNamespaceEntry(const char *name, const char *parent, const char *parent_mangled); virtual int emitNamespaces() = 0; protected: JSEngine engine; Hash *templates; State state; // contains context specific data (DOHs) // to allow generation of namespace related code // which are switched on namespace change Hash *namespaces; Hash *current_namespace; String *defaultResultName; File *f_wrappers; }; /* factory methods for concrete JSEmitters: */ JSEmitter *swig_javascript_create_JSCEmitter(); JSEmitter *swig_javascript_create_V8Emitter(); JSEmitter *swig_javascript_create_NodeJSEmitter(); /********************************************************************** * JAVASCRIPT: SWIG module implementation **********************************************************************/ class JAVASCRIPT:public Language { public: JAVASCRIPT():emitter(NULL) { } ~JAVASCRIPT() { delete emitter; } virtual int functionHandler(Node *n); virtual int globalfunctionHandler(Node *n); virtual int variableHandler(Node *n); virtual int globalvariableHandler(Node *n); virtual int staticmemberfunctionHandler(Node *n); virtual int classHandler(Node *n); virtual int functionWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int nativeWrapper(Node *n); virtual void main(int argc, char *argv[]); virtual int top(Node *n); /** * Registers all %fragments assigned to section "templates". **/ virtual int fragmentDirective(Node *n); public: virtual String *getNSpace() const; private: JSEmitter *emitter; }; /* --------------------------------------------------------------------- * functionWrapper() * * Low level code generator for functions * --------------------------------------------------------------------- */ int JAVASCRIPT::functionWrapper(Node *n) { // note: the default implementation only prints a message // Language::functionWrapper(n); emitter->emitWrapperFunction(n); return SWIG_OK; } /* --------------------------------------------------------------------- * functionHandler() * * Function handler for generating wrappers for functions * --------------------------------------------------------------------- */ int JAVASCRIPT::functionHandler(Node *n) { if (GetFlag(n, "isextension") == 1) { SetFlag(n, "ismember"); } emitter->enterFunction(n); Language::functionHandler(n); emitter->exitFunction(n); return SWIG_OK; } /* --------------------------------------------------------------------- * globalfunctionHandler() * * Function handler for generating wrappers for functions * --------------------------------------------------------------------- */ int JAVASCRIPT::globalfunctionHandler(Node *n) { emitter->switchNamespace(n); Language::globalfunctionHandler(n); return SWIG_OK; } /* --------------------------------------------------------------------- * staticmemberfunctionHandler() * * Function handler for generating wrappers for static member functions * --------------------------------------------------------------------- */ int JAVASCRIPT::staticmemberfunctionHandler(Node *n) { /* * Note: storage=static is removed by Language::staticmemberfunctionHandler. * So, don't rely on that after here. Instead use the state variable which is * set by JSEmitter::enterFunction(). */ Language::staticmemberfunctionHandler(n); return SWIG_OK; } /* --------------------------------------------------------------------- * variableHandler() * * Function handler for generating wrappers for variables * --------------------------------------------------------------------- */ int JAVASCRIPT::variableHandler(Node *n) { emitter->enterVariable(n); Language::variableHandler(n); emitter->exitVariable(n); return SWIG_OK; } /* --------------------------------------------------------------------- * globalvariableHandler() * * Function handler for generating wrappers for global variables * --------------------------------------------------------------------- */ int JAVASCRIPT::globalvariableHandler(Node *n) { emitter->switchNamespace(n); Language::globalvariableHandler(n); return SWIG_OK; } /* --------------------------------------------------------------------- * constantHandler() * * Function handler for generating wrappers for constants * --------------------------------------------------------------------- */ int JAVASCRIPT::constantWrapper(Node *n) { emitter->switchNamespace(n); // Note: callbacks trigger this wrapper handler // TODO: handle callback declarations if (Equal(Getattr(n, "kind"), "function")) { return SWIG_OK; } // TODO: the emitter for constants must be implemented in a cleaner way // currently we treat it like a read-only variable // however, there is a remaining bug with function pointer constants // which could be fixed with a cleaner approach emitter->emitConstant(n); return SWIG_OK; } /* --------------------------------------------------------------------- * nativeWrapper() * * Function wrapper for generating placeholders for native functions * --------------------------------------------------------------------- */ int JAVASCRIPT::nativeWrapper(Node *n) { emitter->emitNativeFunction(n); return SWIG_OK; } /* --------------------------------------------------------------------- * classHandler() * * Function handler for generating wrappers for class * --------------------------------------------------------------------- */ int JAVASCRIPT::classHandler(Node *n) { emitter->switchNamespace(n); emitter->enterClass(n); Language::classHandler(n); emitter->exitClass(n); return SWIG_OK; } int JAVASCRIPT::fragmentDirective(Node *n) { // catch all fragment directives that have "templates" as location // and register them at the emitter. String *section = Getattr(n, "section"); if (Equal(section, "templates") && !ImportMode) { emitter->registerTemplate(Getattr(n, "value"), Getattr(n, "code")); } else { return Language::fragmentDirective(n); } return SWIG_OK; } String *JAVASCRIPT::getNSpace() const { return Language::getNSpace(); } /* --------------------------------------------------------------------- * top() * * Function handler for processing top node of the parse tree * Wrapper code generation essentially starts from here * --------------------------------------------------------------------- */ int JAVASCRIPT::top(Node *n) { emitter->initialize(n); Language::top(n); emitter->dump(n); emitter->close(); return SWIG_OK; } static const char *usage = (char *) "\ Javascript Options (available with -javascript)\n\ -jsc - creates a JavascriptCore extension \n\ -v8 - creates a v8 extension \n\ -node - creates a node.js extension \n\ -debug-codetemplates - generates information about the origin of code templates\n"; /* --------------------------------------------------------------------- * main() * * Entry point for the JAVASCRIPT module * --------------------------------------------------------------------- */ void JAVASCRIPT::main(int argc, char *argv[]) { // Set javascript subdirectory in SWIG library SWIG_library_directory("javascript"); int engine = -1; for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-v8") == 0) { if (engine != -1) { Printf(stderr, ERR_MSG_ONLY_ONE_ENGINE_PLEASE); SWIG_exit(-1); } Swig_mark_arg(i); engine = JSEmitter::V8; } else if (strcmp(argv[i], "-jsc") == 0) { if (engine != -1) { Printf(stderr, ERR_MSG_ONLY_ONE_ENGINE_PLEASE); SWIG_exit(-1); } Swig_mark_arg(i); engine = JSEmitter::JavascriptCore; } else if (strcmp(argv[i], "-node") == 0) { if (engine != -1) { Printf(stderr, ERR_MSG_ONLY_ONE_ENGINE_PLEASE); SWIG_exit(-1); } Swig_mark_arg(i); engine = JSEmitter::NodeJS; } else if (strcmp(argv[i], "-debug-codetemplates") == 0) { Swig_mark_arg(i); js_template_enable_debug = true; } else if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); return; } } } switch (engine) { case JSEmitter::V8: { emitter = swig_javascript_create_V8Emitter(); Preprocessor_define("SWIG_JAVASCRIPT_V8 1", 0); SWIG_library_directory("javascript/v8"); // V8 API is C++, so output must be C++ compatible even when wrapping C code if (!cparse_cplusplus) { Swig_cparse_cplusplusout(1); } break; } case JSEmitter::JavascriptCore: { emitter = swig_javascript_create_JSCEmitter(); Preprocessor_define("SWIG_JAVASCRIPT_JSC 1", 0); SWIG_library_directory("javascript/jsc"); break; } case JSEmitter::NodeJS: { emitter = swig_javascript_create_V8Emitter(); Preprocessor_define("SWIG_JAVASCRIPT_V8 1", 0); Preprocessor_define("BUILDING_NODE_EXTENSION 1", 0); SWIG_library_directory("javascript/v8"); break; } default: { Printf(stderr, "SWIG Javascript: Unknown engine. Please specify one of '-jsc', '-v8' or '-node'.\n"); SWIG_exit(-1); break; } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGJAVASCRIPT 1", 0); // Add typemap definitions SWIG_typemap_lang("javascript"); // Set configuration file SWIG_config_file("javascript.swg"); allow_overloading(); } /* ----------------------------------------------------------------------------- * swig_javascript() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_javascript() { return new JAVASCRIPT(); } extern "C" Language *swig_javascript(void) { return new_swig_javascript(); } /********************************************************************** * Emitter implementations **********************************************************************/ /* ----------------------------------------------------------------------------- * JSEmitter() * ----------------------------------------------------------------------------- */ JSEmitter::JSEmitter(JSEmitter::JSEngine engine) : engine(engine), templates(NewHash()), namespaces(NULL), current_namespace(NULL), defaultResultName(NewString("result")), f_wrappers(NULL) { } /* ----------------------------------------------------------------------------- * ~JSEmitter() * ----------------------------------------------------------------------------- */ JSEmitter::~JSEmitter() { Delete(templates); } /* ----------------------------------------------------------------------------- * JSEmitter::RegisterTemplate() : Registers a code template * * Note: this is used only by JAVASCRIPT::fragmentDirective(). * ----------------------------------------------------------------------------- */ int JSEmitter::registerTemplate(const String *name, const String *code) { if (!State::IsSet(state.globals(HAS_TEMPLATES))) { SetFlag(state.globals(), HAS_TEMPLATES); } return Setattr(templates, name, code); } /* ----------------------------------------------------------------------------- * JSEmitter::getTemplate() : Provides a registered code template * ----------------------------------------------------------------------------- */ Template JSEmitter::getTemplate(const String *name) { String *templ = Getattr(templates, name); if (!templ) { Printf(stderr, "Could not find template %s\n.", name); SWIG_exit(EXIT_FAILURE); } Template t(templ, name); return t; } JSEmitterState & JSEmitter::getState() { return state; } int JSEmitter::initialize(Node * /*n */ ) { if (namespaces != NULL) { Delete(namespaces); } namespaces = NewHash(); Hash *global_namespace = createNamespaceEntry("exports", 0, 0); Setattr(namespaces, "::", global_namespace); current_namespace = global_namespace; f_wrappers = NewString(""); return SWIG_OK; } /* --------------------------------------------------------------------- * skipIgnoredArgs() * --------------------------------------------------------------------- */ Parm *JSEmitter::skipIgnoredArgs(Parm *p) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } return p; } /* ----------------------------------------------------------------------------- * JSEmitter::getBaseClass() : the node of the base class or NULL * * Note: the first base class is provided. Multiple inheritance is not * supported. * ----------------------------------------------------------------------------- */ Node *JSEmitter::getBaseClass(Node *n) { // retrieve the first base class that is not %ignored List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } return base.item; } return NULL; } /* ----------------------------------------------------------------------------- * JSEmitter::emitWrapperFunction() : dispatches emitter functions. * * This allows to have small sized, dedicated emitting functions. * All state dependent branching is done here. * ----------------------------------------------------------------------------- */ int JSEmitter::emitWrapperFunction(Node *n) { int ret = SWIG_OK; String *kind = Getattr(n, "kind"); if (kind) { if (Equal(kind, "function") // HACK: sneaky.ctest revealed that typedef'd (global) functions must be // detected via the 'view' attribute. || (Equal(kind, "variable") && Equal(Getattr(n, "view"), "globalfunctionHandler")) ) { bool is_member = GetFlag(n, "ismember") != 0 || GetFlag(n, "feature:extend") != 0; bool is_static = GetFlag(state.function(), IS_STATIC) != 0; ret = emitFunction(n, is_member, is_static); } else if (Cmp(kind, "variable") == 0) { bool is_static = GetFlag(state.variable(), IS_STATIC) != 0; // HACK: smartpointeraccessed static variables are not treated as statics if (GetFlag(n, "allocate:smartpointeraccess")) { is_static = false; } bool is_member = GetFlag(n, "ismember") != 0; bool is_setter = GetFlag(n, "memberset") != 0 || GetFlag(n, "varset") != 0; bool is_getter = GetFlag(n, "memberget") != 0 || GetFlag(n, "varget") != 0; if (is_setter) { ret = emitSetter(n, is_member, is_static); } else if (is_getter) { ret = emitGetter(n, is_member, is_static); } else { Swig_print_node(n); } } else { Printf(stderr, "Warning: unsupported wrapper function type\n"); Swig_print_node(n); ret = SWIG_ERROR; } } else { String *view = Getattr(n, "view"); if (Cmp(view, "constructorHandler") == 0) { ret = emitCtor(n); } else if (Cmp(view, "destructorHandler") == 0) { ret = emitDtor(n); } else { Printf(stderr, "Warning: unsupported wrapper function type"); Swig_print_node(n); ret = SWIG_ERROR; } } return ret; } int JSEmitter::emitNativeFunction(Node *n) { String *wrapname = Getattr(n, "wrap:name"); enterFunction(n); state.function(WRAPPER_NAME, wrapname); exitFunction(n); return SWIG_OK; } int JSEmitter::enterClass(Node *n) { state.clazz(RESET); state.clazz(NAME, Getattr(n, "sym:name")); state.clazz("nspace", current_namespace); // Creating a mangled name using the current namespace and the symbol name String *mangled_name = NewString(""); Printf(mangled_name, "%s_%s", Getattr(current_namespace, NAME_MANGLED), Getattr(n, "sym:name")); state.clazz(NAME_MANGLED, SwigType_manglestr(mangled_name)); Delete(mangled_name); state.clazz(TYPE, NewString(Getattr(n, "classtype"))); String *type = SwigType_manglestr(Getattr(n, "classtypeobj")); String *classtype_mangled = NewString(""); Printf(classtype_mangled, "p%s", type); state.clazz(TYPE_MANGLED, classtype_mangled); Delete(type); String *ctor_wrapper = NewString("_wrap_new_veto_"); Append(ctor_wrapper, state.clazz(NAME)); state.clazz(CTOR, ctor_wrapper); state.clazz(CTOR_DISPATCHERS, NewString("")); state.clazz(DTOR, NewString("0")); // HACK: assume that a class is abstract // this is resolved by emitCtor (which is only called for non abstract classes) SetFlag(state.clazz(), IS_ABSTRACT); return SWIG_OK; } int JSEmitter::enterFunction(Node *n) { state.function(RESET); state.function(NAME, Getattr(n, "sym:name")); if (Equal(Getattr(n, "storage"), "static")) { SetFlag(state.function(), IS_STATIC); } return SWIG_OK; } int JSEmitter::enterVariable(Node *n) { // reset the state information for variables. state.variable(RESET); // Retrieve a pure symbol name. Using 'sym:name' as a basis, as it considers %renamings. if (Equal(Getattr(n, "view"), "memberconstantHandler")) { // Note: this is kind of hacky/experimental // For constants/enums 'sym:name' contains e.g., 'Foo_Hello' instead of 'Hello' state.variable(NAME, Getattr(n, "memberconstantHandler:sym:name")); } else { state.variable(NAME, Swig_scopename_last(Getattr(n, "sym:name"))); } if (Equal(Getattr(n, "storage"), "static")) { SetFlag(state.variable(), IS_STATIC); } if (!Language::instance()->is_assignable(n)) { SetFlag(state.variable(), IS_IMMUTABLE); } // FIXME: test "arrays_global" does not compile with that as it is not allowed to assign to char[] if (Equal(Getattr(n, "type"), "a().char")) { SetFlag(state.variable(), IS_IMMUTABLE); } return SWIG_OK; } int JSEmitter::emitCtor(Node *n) { Wrapper *wrapper = NewWrapper(); bool is_overloaded = GetFlag(n, "sym:overloaded") != 0; Template t_ctor(getTemplate("js_ctor")); String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); if (is_overloaded) { t_ctor = getTemplate("js_overloaded_ctor"); Append(wrap_name, Getattr(n, "sym:overname")); } Setattr(n, "wrap:name", wrap_name); // note: we can remove the is_abstract flag now, as this // is called for non-abstract classes only. Setattr(state.clazz(), IS_ABSTRACT, 0); ParmList *params = Getattr(n, "parms"); emit_parameter_variables(params, wrapper); emit_attach_parmmaps(params, wrapper); // HACK: in test-case `ignore_parameter` emit_attach_parmmaps generated an extra line of applied typemaps. // Deleting wrapper->code here, to reset, and as it seemed to have no side effect elsewhere Delete(wrapper->code); wrapper->code = NewString(""); Printf(wrapper->locals, "%sresult;", SwigType_str(Getattr(n, "type"), 0)); marshalInputArgs(n, params, wrapper, Ctor, true, false); String *action = emit_action(n); Printv(wrapper->code, action, "\n", 0); emitCleanupCode(n, wrapper, params); t_ctor.replace("$jswrapper", wrap_name) .replace("$jsmangledtype", state.clazz(TYPE_MANGLED)) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .replace("$jsargcount", Getattr(n, ARGCOUNT)) .pretty_print(f_wrappers); Template t_ctor_case(getTemplate("js_ctor_dispatch_case")); t_ctor_case.replace("$jswrapper", wrap_name) .replace("$jsargcount", Getattr(n, ARGCOUNT)); Append(state.clazz(CTOR_DISPATCHERS), t_ctor_case.str()); DelWrapper(wrapper); // create a dispatching ctor if (is_overloaded) { if (!Getattr(n, "sym:nextSibling")) { String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); Template t_mainctor(getTemplate("js_ctor_dispatcher")); t_mainctor.replace("$jswrapper", wrap_name) .replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsdispatchcases", state.clazz(CTOR_DISPATCHERS)) .pretty_print(f_wrappers); state.clazz(CTOR, wrap_name); } } else { state.clazz(CTOR, wrap_name); } return SWIG_OK; } int JSEmitter::emitDtor(Node *n) { String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); SwigType *type = state.clazz(TYPE); String *p_classtype = SwigType_add_pointer(state.clazz(TYPE)); String *ctype = SwigType_lstr(p_classtype, ""); String *free = NewString(""); // (Taken from JSCore implementation.) /* The if (Extend) block was taken from the Ruby implementation. * The problem is that in the case of an %extend to create a destructor for a struct to coordinate automatic memory cleanup with the Javascript collector, * the SWIG function was not being generated. More specifically: struct MyData { %extend { ~MyData() { FreeData($self); } } }; %newobject CreateData; struct MyData* CreateData(void); %delobject FreeData; void FreeData(struct MyData* the_data); where the use case is something like: var my_data = example.CreateData(); my_data = null; This function was not being generated: SWIGINTERN void delete_MyData(struct MyData *self){ FreeData(self); } I don't understand fully why it wasn't being generated. It just seems to happen in the Lua generator. There is a comment about staticmemberfunctionHandler having an inconsistency and I tracked down dome of the SWIGINTERN void delete_* code to that function in the Language base class. The Ruby implementation seems to have an explicit check for if(Extend) and explicitly generates the code, so that's what I'm doing here. The Ruby implementation does other stuff which I omit. */ if (Extend) { String *wrap = Getattr(n, "wrap:code"); if (wrap) { Printv(f_wrappers, wrap, NIL); } } // HACK: this is only for the v8 emitter. maybe set an attribute wrap:action of node // TODO: generate dtors more similar to other wrappers // EW: I think this is wrong. delete should only be used when new was used to create. If malloc was used, free needs to be used. if (SwigType_isarray(type)) { Printf(free, "delete [] (%s)", ctype); } else { Printf(free, "delete (%s)", ctype); } String *destructor_action = Getattr(n, "wrap:action"); // Adapted from the JSCore implementation. /* The next challenge is to generate the correct finalize function for JavaScriptCore to call. Originally, it would use this fragment from javascriptcode.swg %fragment ("JS_destructordefn", "templates") %{ void _wrap_${classname_mangled}_finalize(JSObjectRef thisObject) { SWIG_PRV_DATA* t = (SWIG_PRV_DATA*)JSObjectGetPrivate(thisObject); if(t && t->swigCMemOwn) free ((${type}*)t->swigCObject); if(t) free(t); } %} But for the above example case of %extend to define a destructor on a struct, we need to override the system to not call free ((${type}*)t->swigCObject); and substitute it with what the user has provided. To solve this, I created a variation fragment called JS_destructoroverridedefn: SWIG_PRV_DATA* t = (SWIG_PRV_DATA*)JSObjectGetPrivate(thisObject); if(t && t->swigCMemOwn) { ${type}* arg1 = (${type}*)t->swigCObject; ${destructor_action} } if(t) free(t); Based on what I saw in the Lua and Ruby modules, I use Getattr(n, "wrap:action") to decide if the user has a preferred destructor action. Based on that, I decide which fragment to use. And in the case of the custom action, I substitute that action in. I noticed that destructor_action has the form delete_MyData(arg1); The explicit arg1 is a little funny, so I structured the fragment to create a temporary variable called arg1 to make the generation easier. This might suggest this solution misunderstands a more complex case. Also, there is a problem where destructor_action is always true for me, even when not requesting %extend as above. So this code doesn't actually quite work as I expect. The end result is that the code still works because destructor_action calls free like the original template. The one caveat is the string in destructor_action casts to char* which is weird. I think there is a deeper underlying SWIG issue because I don't think it should be char*. However, it doesn't really matter for free. Maybe the fix for the destructor_action always true problem is that this is supposed to be embedded in the if(Extend) block above. But I don't fully understand the conditions of any of these things, and since it works for the moment, I don't want to break more stuff. */ if (destructor_action) { Template t_dtor = getTemplate("js_dtoroverride"); state.clazz(DTOR, wrap_name); t_dtor.replace("${classname_mangled}", state.clazz(NAME_MANGLED)) .replace("$jswrapper", wrap_name) .replace("$jsfree", free) .replace("$jstype", ctype); t_dtor.replace("${destructor_action}", destructor_action); Wrapper_pretty_print(t_dtor.str(), f_wrappers); } else { Template t_dtor = getTemplate("js_dtor"); state.clazz(DTOR, wrap_name); t_dtor.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jswrapper", wrap_name) .replace("$jsfree", free) .replace("$jstype", ctype) .pretty_print(f_wrappers); } Delete(p_classtype); Delete(ctype); Delete(free); return SWIG_OK; } int JSEmitter::emitGetter(Node *n, bool is_member, bool is_static) { Wrapper *wrapper = NewWrapper(); Template t_getter(getTemplate("js_getter")); // prepare wrapper name String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); Setattr(n, "wrap:name", wrap_name); state.variable(GETTER, wrap_name); // prepare local variables ParmList *params = Getattr(n, "parms"); emit_parameter_variables(params, wrapper); emit_attach_parmmaps(params, wrapper); // prepare code part String *action = emit_action(n); marshalInputArgs(n, params, wrapper, Getter, is_member, is_static); marshalOutput(n, params, wrapper, action); emitCleanupCode(n, wrapper, params); t_getter.replace("$jswrapper", wrap_name) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .pretty_print(f_wrappers); DelWrapper(wrapper); return SWIG_OK; } int JSEmitter::emitSetter(Node *n, bool is_member, bool is_static) { // skip variables that are immutable if (State::IsSet(state.variable(IS_IMMUTABLE))) { return SWIG_OK; } Wrapper *wrapper = NewWrapper(); Template t_setter(getTemplate("js_setter")); // prepare wrapper name String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); Setattr(n, "wrap:name", wrap_name); state.variable(SETTER, wrap_name); // prepare local variables ParmList *params = Getattr(n, "parms"); emit_parameter_variables(params, wrapper); emit_attach_parmmaps(params, wrapper); // prepare code part String *action = emit_action(n); marshalInputArgs(n, params, wrapper, Setter, is_member, is_static); Append(wrapper->code, action); emitCleanupCode(n, wrapper, params); t_setter.replace("$jswrapper", wrap_name) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .pretty_print(f_wrappers); DelWrapper(wrapper); return SWIG_OK; } /* ----------------------------------------------------------------------------- * JSEmitter::emitConstant() : triggers code generation for constants * ----------------------------------------------------------------------------- */ int JSEmitter::emitConstant(Node *n) { // HACK: somehow it happened under Mac OS X that before everything started // a lot of SWIG internal constants were emitted // This didn't happen on other platforms yet... // we ignore those premature definitions if (!State::IsSet(state.globals(HAS_TEMPLATES))) { return SWIG_ERROR; } Wrapper *wrapper = NewWrapper(); SwigType *type = Getattr(n, "type"); String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(name); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); // HACK: forcing usage of cppvalue for v8 (which turned out to fix typdef_struct.i, et. al) if (State::IsSet(state.globals(FORCE_CPP)) && Getattr(n, "cppvalue") != NULL) { value = Getattr(n, "cppvalue"); } Template t_getter(getTemplate("js_getter")); // call the variable methods as a constants are // registered in same way enterVariable(n); state.variable(GETTER, wname); // TODO: why do we need this? Setattr(n, "wrap:name", wname); // special treatment of member pointers if (SwigType_type(type) == T_MPOINTER) { // TODO: this could go into a code-template String *mpointer_wname = NewString(""); Printf(mpointer_wname, "_wrapConstant_%s", iname); Setattr(n, "memberpointer:constant:wrap:name", mpointer_wname); String *str = SwigType_str(type, mpointer_wname); Printf(f_wrappers, "static %s = %s;\n", str, value); Delete(str); value = mpointer_wname; } marshalOutput(n, 0, wrapper, NewString(""), value, false); t_getter.replace("$jswrapper", wname) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .pretty_print(f_wrappers); exitVariable(n); DelWrapper(wrapper); return SWIG_OK; } int JSEmitter::emitFunction(Node *n, bool is_member, bool is_static) { Wrapper *wrapper = NewWrapper(); Template t_function(getTemplate("js_function")); bool is_overloaded = GetFlag(n, "sym:overloaded") != 0; // prepare the function wrapper name String *iname = Getattr(n, "sym:name"); String *wrap_name = Swig_name_wrapper(iname); if (is_overloaded) { t_function = getTemplate("js_overloaded_function"); Append(wrap_name, Getattr(n, "sym:overname")); } Setattr(n, "wrap:name", wrap_name); state.function(WRAPPER_NAME, wrap_name); // prepare local variables ParmList *params = Getattr(n, "parms"); emit_parameter_variables(params, wrapper); emit_attach_parmmaps(params, wrapper); // HACK: in test-case `ignore_parameter` emit_attach_parmmaps generates an extra line of applied typemap. // Deleting wrapper->code here fixes the problem, and seems to have no side effect elsewhere Delete(wrapper->code); wrapper->code = NewString(""); marshalInputArgs(n, params, wrapper, Function, is_member, is_static); String *action = emit_action(n); marshalOutput(n, params, wrapper, action); emitCleanupCode(n, wrapper, params); Replaceall(wrapper->code, "$symname", iname); t_function.replace("$jswrapper", wrap_name) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .replace("$jsargcount", Getattr(n, ARGCOUNT)) .pretty_print(f_wrappers); DelWrapper(wrapper); return SWIG_OK; } int JSEmitter::emitFunctionDispatcher(Node *n, bool /*is_member */ ) { Wrapper *wrapper = NewWrapper(); // Generate call list, go to first node Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up do { String *siblname = Getattr(sibl, "wrap:name"); if (siblname) { // handle function overloading Template t_dispatch_case = getTemplate("js_function_dispatch_case"); t_dispatch_case.replace("$jswrapper", siblname) .replace("$jsargcount", Getattr(sibl, ARGCOUNT)); Append(wrapper->code, t_dispatch_case.str()); } } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Template t_function(getTemplate("js_function_dispatcher")); // Note: this dispatcher function gets called after the last overloaded function has been created. // At this time, n.wrap:name contains the name of the last wrapper function. // To get a valid function name for the dispatcher function we take the last wrapper name and // substract the extension "sym:overname", String *wrap_name = NewString(Getattr(n, "wrap:name")); String *overname = Getattr(n, "sym:overname"); Node *methodclass = Swig_methodclass(n); String *class_name = Getattr(methodclass, "sym:name"); int l1 = Len(wrap_name); int l2 = Len(overname); Delslice(wrap_name, l1 - l2, l1); String *new_string = NewStringf("%s_%s", class_name, wrap_name); String *final_wrap_name = Swig_name_wrapper(new_string); Setattr(n, "wrap:name", final_wrap_name); state.function(WRAPPER_NAME, final_wrap_name); t_function.replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code); // call this here, to replace all variables t_function.replace("$jswrapper", final_wrap_name) .replace("$jsname", state.function(NAME)) .pretty_print(f_wrappers); // Delete the state variable DelWrapper(wrapper); return SWIG_OK; } String *JSEmitter::emitInputTypemap(Node *n, Parm *p, Wrapper *wrapper, String *arg) { // Get input typemap for current param String *tm = Getattr(p, "tmap:in"); SwigType *type = Getattr(p, "type"); if (tm != NULL) { Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); // do replacements for built-in variables if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$symname", Getattr(n, "sym:name")); Printf(wrapper->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(type, 0)); } return tm; } void JSEmitter::marshalOutput(Node *n, ParmList *params, Wrapper *wrapper, String *actioncode, const String *cresult, bool emitReturnVariable) { SwigType *type = Getattr(n, "type"); String *tm; Parm *p; // adds a declaration for the result variable if (emitReturnVariable) emit_return_variable(n, type, wrapper); // if not given, use default result identifier ('result') for output typemap if (cresult == 0) cresult = defaultResultName; tm = Swig_typemap_lookup_out("out", n, cresult, wrapper, actioncode); bool should_own = GetFlag(n, "feature:new") != 0; if (tm) { Replaceall(tm, "$objecttype", Swig_scopename_last(SwigType_str(SwigType_strip_qualifiers(type), 0))); if (should_own) { Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); } else { Replaceall(tm, "$owner", "0"); } Append(wrapper->code, tm); if (Len(tm) > 0) { Printf(wrapper->code, "\n"); } } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(type, 0), Getattr(n, "name")); } if (params) { for (p = params; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(wrapper->code, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } } Replaceall(wrapper->code, "$result", "jsresult"); } void JSEmitter::emitCleanupCode(Node *n, Wrapper *wrapper, ParmList *params) { Parm *p; String *tm; for (p = params; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { //addThrows(n, "tmap:freearg", p); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(wrapper->code, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } if (GetFlag(n, "feature:new")) { tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm != NIL) { //addThrows(throws_hash, "newfree", n); Printv(wrapper->code, tm, "\n", NIL); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Printf(wrapper->code, "%s\n", tm); Delete(tm); } } int JSEmitter::switchNamespace(Node *n) { // HACK: somehow this gets called for member functions. // We can safely ignore them, as members are not associated to a namespace (only their class) if (GetFlag(n, "ismember")) { return SWIG_OK; } // if nspace is deactivated, everything goes into the global scope if (!GetFlag(n, "feature:nspace")) { current_namespace = Getattr(namespaces, "::"); return SWIG_OK; } // EXPERIMENTAL: we want to use Language::getNSpace() here // However, it is not working yet. // For namespace functions Language::getNSpace() does not give a valid result #if 0 JAVASCRIPT *lang = static_cast(Language::instance()); String *_nspace = lang->getNSpace(); if (!Equal(nspace, _nspace)) { Printf(stdout, "##### Custom vs Language::getNSpace(): %s | %s\n", nspace, _nspace); Swig_print_node(n); } #endif String *nspace = Getattr(n, "sym:nspace"); if (nspace == NULL) { // It seems that only classes have 'sym:nspace' set. // We try to get the namespace from the qualified name (i.e., everything before the last '::') nspace = Swig_scopename_prefix(Getattr(n, "name")); } // If there is not even a scopename prefix then it must be global scope if (nspace == NULL) { current_namespace = Getattr(namespaces, "::"); return SWIG_OK; } String *scope = NewString(nspace); // replace "." with "::" that we can use Swig_scopename_last Replaceall(scope, ".", "::"); // if the scope is not yet registered // create (parent) namespaces recursively if (!Getattr(namespaces, scope)) { createNamespace(scope); } current_namespace = Getattr(namespaces, scope); return SWIG_OK; } int JSEmitter::createNamespace(String *scope) { String *parent_scope = Swig_scopename_prefix(scope); Hash *parent_namespace; if (parent_scope == 0) { parent_namespace = Getattr(namespaces, "::"); } else if (!Getattr(namespaces, parent_scope)) { createNamespace(parent_scope); parent_namespace = Getattr(namespaces, parent_scope); } else { parent_namespace = Getattr(namespaces, parent_scope); } assert(parent_namespace != 0); Hash *new_namespace = createNamespaceEntry(Char(scope), Char(Getattr(parent_namespace, "name")), Char(Getattr(parent_namespace, "name_mangled"))); Setattr(namespaces, scope, new_namespace); Delete(parent_scope); return SWIG_OK; } Hash *JSEmitter::createNamespaceEntry(const char *_name, const char *parent, const char *parent_mangled) { Hash *entry = NewHash(); String *name = NewString(_name); Setattr(entry, NAME, Swig_scopename_last(name)); Setattr(entry, NAME_MANGLED, Swig_name_mangle(name)); Setattr(entry, PARENT, NewString(parent)); Setattr(entry, PARENT_MANGLED, NewString(parent_mangled)); Delete(name); return entry; } /********************************************************************** * JavascriptCore: JSEmitter implementation for JavascriptCore engine **********************************************************************/ class JSCEmitter:public JSEmitter { public: JSCEmitter(); virtual ~ JSCEmitter(); virtual int initialize(Node *n); virtual int dump(Node *n); virtual int close(); protected: virtual int enterVariable(Node *n); virtual int exitVariable(Node *n); virtual int enterFunction(Node *n); virtual int exitFunction(Node *n); virtual int enterClass(Node *n); virtual int exitClass(Node *n); virtual void marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static); virtual Hash *createNamespaceEntry(const char *name, const char *parent, const char *parent_mangled); virtual int emitNamespaces(); private: String *NULL_STR; String *VETO_SET; // output file and major code parts File *f_wrap_cpp; File *f_runtime; File *f_header; File *f_init; }; JSCEmitter::JSCEmitter() : JSEmitter(JSEmitter::JavascriptCore), NULL_STR(NewString("NULL")), VETO_SET(NewString("JS_veto_set_variable")), f_wrap_cpp(NULL), f_runtime(NULL), f_header(NULL), f_init(NULL) { } JSCEmitter::~JSCEmitter() { Delete(NULL_STR); Delete(VETO_SET); } /* --------------------------------------------------------------------- * marshalInputArgs() * * Process all of the arguments passed into the argv array * and convert them into C/C++ function arguments using the * supplied typemaps. * --------------------------------------------------------------------- */ void JSCEmitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) { Parm *p; String *tm; // determine an offset index, as members have an extra 'this' argument // except: static members and ctors. int startIdx = 0; if (is_member && !is_static && mode != Ctor) { startIdx = 1; } // store number of arguments for argument checks int num_args = emit_num_arguments(parms) - startIdx; String *argcount = NewString(""); Printf(argcount, "%d", num_args); Setattr(n, ARGCOUNT, argcount); // process arguments int i = 0; for (p = parms; p; i++) { String *arg = NewString(""); String *type = Getattr(p, "type"); // ignore varargs if (SwigType_isvarargs(type)) break; switch (mode) { case Getter: case Function: if (is_member && !is_static && i == 0) { Printv(arg, "thisObject", 0); } else { Printf(arg, "argv[%d]", i - startIdx); } break; case Setter: if (is_member && !is_static && i == 0) { Printv(arg, "thisObject", 0); } else { Printv(arg, "value", 0); } break; case Ctor: Printf(arg, "argv[%d]", i); break; default: throw "Illegal state."; } tm = emitInputTypemap(n, p, wrapper, arg); Delete(arg); if (tm) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } int JSCEmitter::initialize(Node *n) { JSEmitter::initialize(n); /* Get the output file name */ String *outfile = Getattr(n, "outfile"); /* Initialize I/O */ f_wrap_cpp = NewFile(outfile, "w", SWIG_output_files()); if (!f_wrap_cpp) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } /* Initialization of members */ f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); state.globals(CREATE_NAMESPACES, NewString("")); state.globals(REGISTER_NAMESPACES, NewString("")); state.globals(INITIALIZER, NewString("")); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("begin", f_wrap_cpp); Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_banner(f_wrap_cpp); return SWIG_OK; } int JSCEmitter::dump(Node *n) { /* Get the module name */ String *module = Getattr(n, "name"); Template initializer_define(getTemplate("js_initializer_define")); initializer_define.replace("$jsname", module).pretty_print(f_header); SwigType_emit_type_table(f_runtime, f_wrappers); Printv(f_wrap_cpp, f_runtime, "\n", 0); Printv(f_wrap_cpp, f_header, "\n", 0); Printv(f_wrap_cpp, f_wrappers, "\n", 0); emitNamespaces(); // compose the initializer function using a template Template initializer(getTemplate("js_initializer")); initializer.replace("$jsname", module) .replace("$jsregisterclasses", state.globals(INITIALIZER)) .replace("$jscreatenamespaces", state.globals(CREATE_NAMESPACES)) .replace("$jsregisternamespaces", state.globals(REGISTER_NAMESPACES)) .pretty_print(f_init); Printv(f_wrap_cpp, f_init, 0); return SWIG_OK; } int JSCEmitter::close() { Delete(f_runtime); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(namespaces); Delete(f_wrap_cpp); return SWIG_OK; } int JSCEmitter::enterFunction(Node *n) { JSEmitter::enterFunction(n); return SWIG_OK; } int JSCEmitter::exitFunction(Node *n) { Template t_function = getTemplate("jsc_function_declaration"); bool is_member = GetFlag(n, "ismember") != 0 || GetFlag(n, "feature:extend") != 0; bool is_overloaded = GetFlag(n, "sym:overloaded") != 0; // handle overloaded functions if (is_overloaded) { if (!Getattr(n, "sym:nextSibling")) { //state.function(WRAPPER_NAME, Swig_name_wrapper(Getattr(n, "name"))); // create dispatcher emitFunctionDispatcher(n, is_member); } else { //don't register wrappers of overloaded functions in function tables return SWIG_OK; } } t_function.replace("$jsname", state.function(NAME)) .replace("$jswrapper", state.function(WRAPPER_NAME)); if (is_member) { if (GetFlag(state.function(), IS_STATIC)) { t_function.pretty_print(state.clazz(STATIC_FUNCTIONS)); } else { t_function.pretty_print(state.clazz(MEMBER_FUNCTIONS)); } } else { t_function.pretty_print(Getattr(current_namespace, "functions")); } return SWIG_OK; } int JSCEmitter::enterVariable(Node *n) { JSEmitter::enterVariable(n); state.variable(GETTER, NULL_STR); state.variable(SETTER, VETO_SET); return SWIG_OK; } int JSCEmitter::exitVariable(Node *n) { Template t_variable(getTemplate("jsc_variable_declaration")); t_variable.replace("$jsname", state.variable(NAME)) .replace("$jsgetter", state.variable(GETTER)) .replace("$jssetter", state.variable(SETTER)); if (GetFlag(n, "ismember")) { if (GetFlag(state.variable(), IS_STATIC) || Equal(Getattr(n, "nodeType"), "enumitem")) { t_variable.pretty_print(state.clazz(STATIC_VARIABLES)); } else { t_variable.pretty_print(state.clazz(MEMBER_VARIABLES)); } } else { t_variable.pretty_print(Getattr(current_namespace, "values")); } return SWIG_OK; } int JSCEmitter::enterClass(Node *n) { JSEmitter::enterClass(n); state.clazz(MEMBER_VARIABLES, NewString("")); state.clazz(MEMBER_FUNCTIONS, NewString("")); state.clazz(STATIC_VARIABLES, NewString("")); state.clazz(STATIC_FUNCTIONS, NewString("")); Template t_class_decl = getTemplate("jsc_class_declaration"); t_class_decl.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .pretty_print(f_wrappers); return SWIG_OK; } int JSCEmitter::exitClass(Node *n) { Template t_class_tables(getTemplate("jsc_class_tables")); t_class_tables.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsclassvariables", state.clazz(MEMBER_VARIABLES)) .replace("$jsclassfunctions", state.clazz(MEMBER_FUNCTIONS)) .replace("$jsstaticclassfunctions", state.clazz(STATIC_FUNCTIONS)) .replace("$jsstaticclassvariables", state.clazz(STATIC_VARIABLES)) .pretty_print(f_wrappers); /* adds the ctor wrappers at this position */ // Note: this is necessary to avoid extra forward declarations. //Append(f_wrappers, state.clazz(CTOR_WRAPPERS)); // for abstract classes add a vetoing ctor if (GetFlag(state.clazz(), IS_ABSTRACT)) { Template t_veto_ctor(getTemplate("js_veto_ctor")); t_veto_ctor.replace("$jswrapper", state.clazz(CTOR)) .replace("$jsname", state.clazz(NAME)) .pretty_print(f_wrappers); } /* adds a class template statement to initializer function */ Template t_classtemplate(getTemplate("jsc_class_definition")); /* prepare registration of base class */ String *jsclass_inheritance = NewString(""); Node *base_class = getBaseClass(n); if (base_class != NULL) { Template t_inherit(getTemplate("jsc_class_inherit")); t_inherit.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsbaseclassmangled", SwigType_manglestr(Getattr(base_class, "name"))) .pretty_print(jsclass_inheritance); } else { Template t_inherit(getTemplate("jsc_class_noinherit")); t_inherit.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .pretty_print(jsclass_inheritance); } t_classtemplate.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsmangledtype", state.clazz(TYPE_MANGLED)) .replace("$jsclass_inheritance", jsclass_inheritance) .replace("$jsctor", state.clazz(CTOR)) .replace("$jsdtor", state.clazz(DTOR)) .pretty_print(state.globals(INITIALIZER)); Delete(jsclass_inheritance); /* Note: this makes sure that there is a swig_type added for this class */ SwigType_remember_clientdata(state.clazz(TYPE_MANGLED), NewString("0")); /* adds a class registration statement to initializer function */ Template t_registerclass(getTemplate("jsc_class_registration")); t_registerclass.replace("$jsname", state.clazz(NAME)) .replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsnspace", Getattr(state.clazz("nspace"), NAME_MANGLED)) .pretty_print(state.globals(INITIALIZER)); return SWIG_OK; } Hash *JSCEmitter::createNamespaceEntry(const char *name, const char *parent, const char *parent_mangled) { Hash *entry = JSEmitter::createNamespaceEntry(name, parent, parent_mangled); Setattr(entry, "functions", NewString("")); Setattr(entry, "values", NewString("")); return entry; } int JSCEmitter::emitNamespaces() { Iterator it; for (it = First(namespaces); it.item; it = Next(it)) { Hash *entry = it.item; String *name = Getattr(entry, NAME); String *name_mangled = Getattr(entry, NAME_MANGLED); String *parent_mangled = Getattr(entry, PARENT_MANGLED); String *functions = Getattr(entry, "functions"); String *variables = Getattr(entry, "values"); // skip the global namespace which is given by the application Template namespace_definition(getTemplate("jsc_nspace_declaration")); namespace_definition.replace("$jsglobalvariables", variables) .replace("$jsglobalfunctions", functions) .replace("$jsnspace", name_mangled) .replace("$jsmangledname", name_mangled) .pretty_print(f_wrap_cpp); Template t_createNamespace(getTemplate("jsc_nspace_definition")); t_createNamespace.replace("$jsmangledname", name_mangled); Append(state.globals(CREATE_NAMESPACES), t_createNamespace.str()); // Don't register 'exports' as namespace. It is return to the application. if (!Equal("exports", name)) { Template t_registerNamespace(getTemplate("jsc_nspace_registration")); t_registerNamespace.replace("$jsmangledname", name_mangled) .replace("$jsname", name) .replace("$jsparent", parent_mangled); Append(state.globals(REGISTER_NAMESPACES), t_registerNamespace.str()); } } return SWIG_OK; } JSEmitter *swig_javascript_create_JSCEmitter() { return new JSCEmitter(); } /********************************************************************** * V8: JSEmitter implementation for V8 engine **********************************************************************/ class V8Emitter:public JSEmitter { public: V8Emitter(); virtual ~ V8Emitter(); virtual int initialize(Node *n); virtual int dump(Node *n); virtual int close(); virtual int enterClass(Node *n); virtual int exitClass(Node *n); virtual int enterVariable(Node *n); virtual int exitVariable(Node *n); virtual int exitFunction(Node *n); protected: virtual void marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static); virtual int emitNamespaces(); protected: /* built-in parts */ String *f_runtime; String *f_header; String *f_init; String *f_post_init; /* part for class templates */ String *f_class_templates; /* parts for initilizer */ String *f_init_namespaces; String *f_init_class_templates; String *f_init_wrappers; String *f_init_inheritance; String *f_init_class_instances; String *f_init_static_wrappers; String *f_init_register_classes; String *f_init_register_namespaces; // the output cpp file File *f_wrap_cpp; String *NULL_STR; String *VETO_SET; String *moduleName; }; V8Emitter::V8Emitter() : JSEmitter(JSEmitter::V8), NULL_STR(NewString("0")), VETO_SET(NewString("JS_veto_set_variable")) { } V8Emitter::~V8Emitter() { Delete(NULL_STR); Delete(VETO_SET); } int V8Emitter::initialize(Node *n) { JSEmitter::initialize(n); moduleName = Getattr(n, "name"); // Get the output file name String *outfile = Getattr(n, "outfile"); f_wrap_cpp = NewFile(outfile, "w", SWIG_output_files()); if (!f_wrap_cpp) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_header = NewString(""); f_class_templates = NewString(""); f_init = NewString(""); f_post_init = NewString(""); f_init_namespaces = NewString(""); f_init_class_templates = NewString(""); f_init_wrappers = NewString(""); f_init_inheritance = NewString(""); f_init_class_instances = NewString(""); f_init_static_wrappers = NewString(""); f_init_register_classes = NewString(""); f_init_register_namespaces = NewString(""); // note: this is necessary for built-in generation of SWIG runtime code Swig_register_filebyname("begin", f_wrap_cpp); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("init", f_init); Swig_register_filebyname("post-init", f_post_init); state.globals(FORCE_CPP, NewString("1")); Swig_banner(f_wrap_cpp); return SWIG_OK; } int V8Emitter::dump(Node *n) { /* Get the module name */ String *module = Getattr(n, "name"); Template initializer_define(getTemplate("js_initializer_define")); initializer_define.replace("$jsname", module).pretty_print(f_header); SwigType_emit_type_table(f_runtime, f_wrappers); Printv(f_wrap_cpp, f_runtime, "\n", 0); Printv(f_wrap_cpp, f_header, "\n", 0); Printv(f_wrap_cpp, f_class_templates, "\n", 0); Printv(f_wrap_cpp, f_wrappers, "\n", 0); emitNamespaces(); // compose the initializer function using a template // filled with sub-parts Template initializer(getTemplate("js_initializer")); initializer.replace("$jsname", moduleName) .replace("$jsv8nspaces", f_init_namespaces) .replace("$jsv8classtemplates", f_init_class_templates) .replace("$jsv8wrappers", f_init_wrappers) .replace("$jsv8inheritance", f_init_inheritance) .replace("$jsv8classinstances", f_init_class_instances) .replace("$jsv8staticwrappers", f_init_static_wrappers) .replace("$jsv8registerclasses", f_init_register_classes) .replace("$jsv8registernspaces", f_init_register_namespaces); Printv(f_init, initializer.str(), 0); Printv(f_wrap_cpp, f_init, 0); Printv(f_wrap_cpp, f_post_init, 0); return SWIG_OK; } int V8Emitter::close() { Delete(f_runtime); Delete(f_header); Delete(f_class_templates); Delete(f_init_namespaces); Delete(f_init_class_templates); Delete(f_init_wrappers); Delete(f_init_inheritance); Delete(f_init_class_instances); Delete(f_init_static_wrappers); Delete(f_init_register_classes); Delete(f_init_register_namespaces); Delete(f_init); Delete(f_post_init); Delete(f_wrap_cpp); return SWIG_OK; } int V8Emitter::enterClass(Node *n) { JSEmitter::enterClass(n); // emit declaration of a v8 class template Template t_decl_class(getTemplate("jsv8_declare_class_template")); t_decl_class.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .trim() .pretty_print(f_class_templates); return SWIG_OK; } int V8Emitter::exitClass(Node *n) { if (GetFlag(state.clazz(), IS_ABSTRACT)) { Template t_veto_ctor(getTemplate("js_veto_ctor")); t_veto_ctor.replace("$jswrapper", state.clazz(CTOR)) .replace("$jsname", state.clazz(NAME)) .pretty_print(f_wrappers); } /* Note: this makes sure that there is a swig_type added for this class */ String *clientData = NewString(""); Printf(clientData, "&%s_clientData", state.clazz(NAME_MANGLED)); /* Note: this makes sure that there is a swig_type added for this class */ SwigType_remember_clientdata(state.clazz(TYPE_MANGLED), NewString("0")); // emit definition of v8 class template Template t_def_class = getTemplate("jsv8_define_class_template"); t_def_class.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsname", state.clazz(NAME)) .replace("$jsmangledtype", state.clazz(TYPE_MANGLED)) .replace("$jsdtor", state.clazz(DTOR)) .trim() .pretty_print(f_init_class_templates); Template t_class_instance = getTemplate("jsv8_create_class_instance"); t_class_instance.replace("$jsname", state.clazz(NAME)) .replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsctor", state.clazz(CTOR)) .trim() .pretty_print(f_init_class_instances); // emit inheritance setup Node *baseClass = getBaseClass(n); if (baseClass) { String *base_name = Getattr(baseClass, "name"); Template t_inherit = getTemplate("jsv8_inherit"); String *base_name_mangled = SwigType_manglestr(base_name); t_inherit.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsbaseclass", base_name_mangled) .trim() .pretty_print(f_init_inheritance); Delete(base_name_mangled); } // emit registration of class template Template t_register = getTemplate("jsv8_register_class"); t_register.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsname", state.clazz(NAME)) .replace("$jsparent", Getattr(state.clazz("nspace"), NAME_MANGLED)) .trim() .pretty_print(f_init_register_classes); return SWIG_OK; } int V8Emitter::enterVariable(Node *n) { JSEmitter::enterVariable(n); state.variable(GETTER, NULL_STR); state.variable(SETTER, VETO_SET); return SWIG_OK; } int V8Emitter::exitVariable(Node *n) { if (GetFlag(n, "ismember")) { if (GetFlag(state.variable(), IS_STATIC) || Equal(Getattr(n, "nodeType"), "enumitem")) { Template t_register = getTemplate("jsv8_register_static_variable"); t_register.replace("$jsparent", state.clazz(NAME_MANGLED)) .replace("$jsname", state.variable(NAME)) .replace("$jsgetter", state.variable(GETTER)) .replace("$jssetter", state.variable(SETTER)) .trim() .pretty_print(f_init_static_wrappers); } else { Template t_register = getTemplate("jsv8_register_member_variable"); t_register.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsname", state.variable(NAME)) .replace("$jsgetter", state.variable(GETTER)) .replace("$jssetter", state.variable(SETTER)) .trim() .pretty_print(f_init_wrappers); } } else { // Note: a global variable is treated like a static variable // with the parent being a nspace object (instead of class object) Template t_register = getTemplate("jsv8_register_static_variable"); t_register.replace("$jsparent", Getattr(current_namespace, NAME_MANGLED)) .replace("$jsname", state.variable(NAME)) .replace("$jsgetter", state.variable(GETTER)) .replace("$jssetter", state.variable(SETTER)) .trim() .pretty_print(f_init_wrappers); } return SWIG_OK; } int V8Emitter::exitFunction(Node *n) { bool is_member = GetFlag(n, "ismember") != 0 || GetFlag(n, "feature:extend") != 0; // create a dispatcher for overloaded functions bool is_overloaded = GetFlag(n, "sym:overloaded") != 0; if (is_overloaded) { if (!Getattr(n, "sym:nextSibling")) { //state.function(WRAPPER_NAME, Swig_name_wrapper(Getattr(n, "name"))); emitFunctionDispatcher(n, is_member); } else { //don't register wrappers of overloaded functions in function tables return SWIG_OK; } } // register the function at the specific context if (is_member) { if (GetFlag(state.function(), IS_STATIC)) { Template t_register = getTemplate("jsv8_register_static_function"); t_register.replace("$jsparent", state.clazz(NAME_MANGLED)) .replace("$jsname", state.function(NAME)) .replace("$jswrapper", state.function(WRAPPER_NAME)) .trim() .pretty_print(f_init_static_wrappers); } else { Template t_register = getTemplate("jsv8_register_member_function"); t_register.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsname", state.function(NAME)) .replace("$jswrapper", state.function(WRAPPER_NAME)) .trim() .pretty_print(f_init_wrappers); } } else { // Note: a global function is treated like a static function // with the parent being a nspace object instead of class object Template t_register = getTemplate("jsv8_register_static_function"); t_register.replace("$jsparent", Getattr(current_namespace, NAME_MANGLED)) .replace("$jsname", state.function(NAME)) .replace("$jswrapper", state.function(WRAPPER_NAME)) .trim() .pretty_print(f_init_static_wrappers); } return SWIG_OK; } void V8Emitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) { Parm *p; String *tm; int startIdx = 0; if (is_member && !is_static && mode != Ctor) { startIdx = 1; } // store number of arguments for argument checks int num_args = emit_num_arguments(parms) - startIdx; String *argcount = NewString(""); Printf(argcount, "%d", num_args); Setattr(n, ARGCOUNT, argcount); int i = 0; for (p = parms; p; i++) { String *arg = NewString(""); String *type = Getattr(p, "type"); // ignore varargs if (SwigType_isvarargs(type)) break; switch (mode) { case Getter: if (is_member && !is_static && i == 0) { Printv(arg, "info.Holder()", 0); } else { Printf(arg, "args[%d]", i - startIdx); } break; case Function: if (is_member && !is_static && i == 0) { Printv(arg, "args.Holder()", 0); } else { Printf(arg, "args[%d]", i - startIdx); } break; case Setter: if (is_member && !is_static && i == 0) { Printv(arg, "info.Holder()", 0); } else { Printv(arg, "value", 0); } break; case Ctor: Printf(arg, "args[%d]", i); break; default: throw "Illegal state."; } tm = emitInputTypemap(n, p, wrapper, arg); Delete(arg); if (tm) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } int V8Emitter::emitNamespaces() { Iterator it; for (it = First(namespaces); it.item; it = Next(it)) { Hash *entry = it.item; String *name = Getattr(entry, NAME); String *name_mangled = Getattr(entry, NAME_MANGLED); String *parent = Getattr(entry, PARENT); String *parent_mangled = Getattr(entry, PARENT_MANGLED); bool do_create = true; bool do_register = true; if (Equal(parent, "")) { do_register = false; } // Note: 'exports' is by convention the name of the object where // globals are stored into if (Equal(name, "exports")) { do_create = false; } if (do_create) { // create namespace object and register it to the parent scope Template t_create_ns = getTemplate("jsv8_create_namespace"); t_create_ns.replace("$jsmangledname", name_mangled) .trim() .pretty_print(f_init_namespaces); } if (do_register) { Template t_register_ns = getTemplate("jsv8_register_namespace"); t_register_ns.replace("$jsmangledname", name_mangled) .replace("$jsname", name) .replace("$jsparent", parent_mangled) .trim(); // prepend in order to achieve reversed order of registration statements String *tmp_register_stmt = NewString(""); t_register_ns.pretty_print(tmp_register_stmt); Insert(f_init_register_namespaces, 0, tmp_register_stmt); Delete(tmp_register_stmt); } } return SWIG_OK; } JSEmitter *swig_javascript_create_V8Emitter() { return new V8Emitter(); } /********************************************************************** * Helper implementations **********************************************************************/ JSEmitterState::JSEmitterState() : globalHash(NewHash()) { // initialize sub-hashes Setattr(globalHash, "class", NewHash()); Setattr(globalHash, "function", NewHash()); Setattr(globalHash, "variable", NewHash()); } JSEmitterState::~JSEmitterState() { Delete(globalHash); } DOH *JSEmitterState::getState(const char *key, bool new_key) { if (new_key) { Hash *hash = NewHash(); Setattr(globalHash, key, hash); } return Getattr(globalHash, key); } DOH *JSEmitterState::globals() { return globalHash; } DOH *JSEmitterState::globals(const char *key, DOH *initial) { if (initial != 0) { Setattr(globalHash, key, initial); } return Getattr(globalHash, key); } DOH *JSEmitterState::clazz(bool new_key) { return getState("class", new_key); } DOH *JSEmitterState::clazz(const char *key, DOH *initial) { DOH *c = clazz(); if (initial != 0) { Setattr(c, key, initial); } return Getattr(c, key); } DOH *JSEmitterState::function(bool new_key) { return getState("function", new_key); } DOH *JSEmitterState::function(const char *key, DOH *initial) { DOH *f = function(); if (initial != 0) { Setattr(f, key, initial); } return Getattr(f, key); } DOH *JSEmitterState::variable(bool new_key) { return getState("variable", new_key); } DOH *JSEmitterState::variable(const char *key, DOH *initial) { DOH *v = variable(); if (initial != 0) { Setattr(v, key, initial); } return Getattr(v, key); } /*static*/ int JSEmitterState::IsSet(DOH *val) { if (!val) { return 0; } else { const char *cval = Char(val); if (!cval) return 0; return (strcmp(cval, "0") != 0) ? 1 : 0; } } /* ----------------------------------------------------------------------------- * Template::Template() : creates a Template class for given template code * ----------------------------------------------------------------------------- */ Template::Template(const String *code_) { if (!code_) { Printf(stdout, "Template code was null. Illegal input for template."); SWIG_exit(EXIT_FAILURE); } code = NewString(code_); templateName = NewString(""); } Template::Template(const String *code_, const String *templateName_) { if (!code_) { Printf(stdout, "Template code was null. Illegal input for template."); SWIG_exit(EXIT_FAILURE); } code = NewString(code_); templateName = NewString(templateName_); } /* ----------------------------------------------------------------------------- * Template::~Template() : cleans up of Template. * ----------------------------------------------------------------------------- */ Template::~Template() { Delete(code); Delete(templateName); } /* ----------------------------------------------------------------------------- * String* Template::str() : retrieves the current content of the template. * ----------------------------------------------------------------------------- */ String *Template::str() { if (js_template_enable_debug) { String *pre_code = NewString(""); String *post_code = NewString(""); String *debug_code = NewString(""); Printf(pre_code, "/* begin fragment(\"%s\") */", templateName); Printf(post_code, "/* end fragment(\"%s\") */", templateName); Printf(debug_code, "%s\n%s\n%s\n", pre_code, code, post_code); Delete(code); Delete(pre_code); Delete(post_code); code = debug_code; } return code; } Template & Template::trim() { const char *str = Char(code); if (str == 0) return *this; int length = Len(code); if (length == 0) return *this; int idx; for (idx = 0; idx < length; ++idx) { if (str[idx] != ' ' && str[idx] != '\t' && str[idx] != '\r' && str[idx] != '\n') break; } int start_pos = idx; for (idx = length - 1; idx >= start_pos; --idx) { if (str[idx] != ' ' && str[idx] != '\t' && str[idx] != '\r' && str[idx] != '\n') break; } int end_pos = idx; int new_length = end_pos - start_pos + 1; char *newstr = new char[new_length + 1]; memcpy(newstr, str + start_pos, new_length); newstr[new_length] = 0; Delete(code); code = NewString(newstr); delete[]newstr; return *this; } /* ----------------------------------------------------------------------------- * Template& Template::replace(const String* pattern, const String* repl) : * * replaces all occurrences of a given pattern with a given replacement. * * - pattern: the pattern to be replaced * - repl: the replacement string * - returns a reference to the Template to allow chaining of methods. * ----------------------------------------------------------------------------- */ Template & Template::replace(const String *pattern, const String *repl) { Replaceall(code, pattern, repl); return *this; } Template & Template::print(DOH *doh) { Printv(doh, str(), 0); return *this; } Template & Template::pretty_print(DOH *doh) { Wrapper_pretty_print(str(), doh); return *this; } Template::Template(const Template & t) { code = NewString(t.code); templateName = NewString(t.templateName); } void Template::operator=(const Template & t) { Delete(code); Delete(templateName); code = NewString(t.code); templateName = NewString(t.templateName); } swig-4.0.2/Source/Modules/directors.cxx0000644000175000017500000001750113667507523017760 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * directors.cxx * * Director support functions. * Not all of these may be necessary, and some may duplicate existing functionality * in SWIG. --MR * ----------------------------------------------------------------------------- */ #include "swigmod.h" /* ----------------------------------------------------------------------------- * Swig_csuperclass_call() * * Generates a fully qualified method call, including the full parameter list. * e.g. "base::method(i, j)" * ----------------------------------------------------------------------------- */ String *Swig_csuperclass_call(String *base, String *method, ParmList *l) { String *call = NewString(""); int arg_idx = 0; Parm *p; if (base) { Printf(call, "%s::", base); } Printf(call, "%s(", method); for (p = l; p; p = nextSibling(p)) { String *pname = Getattr(p, "name"); if (!pname && Cmp(Getattr(p, "type"), "void")) { pname = NewString(""); Printf(pname, "arg%d", arg_idx++); } if (p != l) Printf(call, ", "); Printv(call, pname, NIL); } Printf(call, ")"); return call; } /* ----------------------------------------------------------------------------- * Swig_class_declaration() * * Generate the start of a class/struct declaration. * e.g. "class myclass" * ----------------------------------------------------------------------------- */ String *Swig_class_declaration(Node *n, String *name) { if (!name) { name = Getattr(n, "sym:name"); } String *result = NewString(""); String *kind = Getattr(n, "kind"); Printf(result, "%s %s", kind, name); return result; } /* ----------------------------------------------------------------------------- * Swig_class_name() * ----------------------------------------------------------------------------- */ String *Swig_class_name(Node *n) { String *name; name = Copy(Getattr(n, "sym:name")); return name; } /* ----------------------------------------------------------------------------- * Swig_director_declaration() * * Generate the full director class declaration, complete with base classes. * e.g. "class SwigDirector_myclass : public myclass, public Swig::Director {" * ----------------------------------------------------------------------------- */ String *Swig_director_declaration(Node *n) { String *classname = Swig_class_name(n); String *directorname = Language::instance()->directorClassName(n); String *base = Getattr(n, "classtype"); String *declaration = Swig_class_declaration(n, directorname); Printf(declaration, " : public %s, public Swig::Director {\n", base); Delete(classname); Delete(directorname); return declaration; } /* ----------------------------------------------------------------------------- * Swig_method_call() * ----------------------------------------------------------------------------- */ String *Swig_method_call(const_String_or_char_ptr name, ParmList *parms) { String *func; int i = 0; int comma = 0; Parm *p = parms; SwigType *pt; String *nname; func = NewString(""); nname = SwigType_namestr(name); Printf(func, "%s(", nname); while (p) { String *pname; pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { if (comma) Printf(func, ","); pname = Getattr(p, "name"); Printf(func, "%s", pname); comma = 1; i++; } p = nextSibling(p); } Printf(func, ")"); return func; } /* ----------------------------------------------------------------------------- * Swig_method_decl() * * Return a stringified version of a C/C++ declaration. * ----------------------------------------------------------------------------- */ String *Swig_method_decl(SwigType *return_base_type, SwigType *decl, const_String_or_char_ptr id, List *args, int default_args) { String *result = NewString(""); bool conversion_operator = Strstr(id, "operator ") != 0 && !return_base_type; Parm *parm = args; int arg_idx = 0; while (parm) { String *type = Getattr(parm, "type"); String *name = Getattr(parm, "name"); if (!name && Cmp(type, "void")) { name = NewString(""); Printf(name, "arg%d", arg_idx++); Setattr(parm, "name", name); } parm = nextSibling(parm); } String *rettype = Copy(decl); String *quals = SwigType_pop_function_qualifiers(rettype); String *qualifiers = 0; if (quals) qualifiers = SwigType_str(quals, 0); String *popped_decl = SwigType_pop_function(rettype); if (return_base_type) Append(rettype, return_base_type); if (!conversion_operator) { SwigType *rettype_stripped = SwigType_strip_qualifiers(rettype); String *rtype = SwigType_str(rettype, 0); Append(result, rtype); if (SwigType_issimple(rettype_stripped) && return_base_type) Append(result, " "); Delete(rtype); Delete(rettype_stripped); } if (id) Append(result, id); String *args_string = default_args ? ParmList_str_defaultargs(args) : ParmList_str(args); Printv(result, "(", args_string, ")", NIL); if (qualifiers) Printv(result, " ", qualifiers, NIL); // Reformat result to how it has been historically Replaceall(result, ",", ", "); Replaceall(result, "=", " = "); Delete(args_string); Delete(popped_decl); Delete(qualifiers); Delete(quals); Delete(rettype); return result; } /* ----------------------------------------------------------------------------- * Swig_director_emit_dynamic_cast() * * In order to call protected virtual director methods from the target language, we need * to add an extra dynamic_cast to call the public C++ wrapper in the director class. * Also for non-static protected members when the allprotected option is on. * ----------------------------------------------------------------------------- */ void Swig_director_emit_dynamic_cast(Node *n, Wrapper *f) { // TODO: why is the storage element removed in staticmemberfunctionHandler ?? if ((!is_public(n) && (is_member_director(n) || GetFlag(n, "explicitcall"))) || (is_non_virtual_protected_access(n) && !(Swig_storage_isstatic_custom(n, "staticmemberfunctionHandler:storage") || Swig_storage_isstatic(n)) && !Equal(nodeType(n), "constructor"))) { Node *parent = Getattr(n, "parentNode"); String *dirname; String *dirdecl; dirname = Language::instance()->directorClassName(parent); dirdecl = NewStringf("%s *darg = 0", dirname); Wrapper_add_local(f, "darg", dirdecl); Printf(f->code, "darg = dynamic_cast<%s *>(arg1);\n", dirname); Delete(dirname); Delete(dirdecl); } } /* ----------------------------------------------------------------------------- * Swig_director_parms_fixup() * * For each parameter in the C++ member function, copy the parameter name * to its "lname"; this ensures that Swig_typemap_attach_parms() will do * the right thing when it sees strings like "$1" in "directorin" typemaps. * ----------------------------------------------------------------------------- */ void Swig_director_parms_fixup(ParmList *parms) { Parm *p; int i; for (i = 0, p = parms; p; p = nextSibling(p), ++i) { String *arg = Getattr(p, "name"); String *lname = 0; if (!arg && !Equal(Getattr(p, "type"), "void")) { lname = NewStringf("arg%d", i); Setattr(p, "name", lname); } else lname = Copy(arg); Setattr(p, "lname", lname); Delete(lname); } } swig-4.0.2/Source/Modules/xml.cxx0000644000175000017500000002110313667507523016553 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * xml.cxx * * An Xml parse tree generator. * ----------------------------------------------------------------------------- */ #include "swigmod.h" static const char *usage = "\ XML Options (available with -xml)\n\ -xmllang - Typedef language\n\ -xmllite - More lightweight version of XML\n\ ------\n\ deprecated (use -o): -xml - Use as output file (extension .xml mandatory)\n"; static File *out = 0; static int xmllite = 0; class XML:public Language { public: int indent_level; long id; XML() :indent_level(0) , id(0) { } virtual ~ XML() { } virtual void main(int argc, char *argv[]) { SWIG_typemap_lang("xml"); for (int iX = 0; iX < argc; iX++) { if (strcmp(argv[iX], "-xml") == 0) { char *extension = 0; if (iX + 1 >= argc) continue; extension = argv[iX + 1] + strlen(argv[iX + 1]) - 4; if (strcmp(extension, ".xml")) continue; iX++; Swig_mark_arg(iX); String *outfile = NewString(argv[iX]); out = NewFile(outfile, "w", SWIG_output_files()); if (!out) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } continue; } if (strcmp(argv[iX], "-xmllang") == 0) { Swig_mark_arg(iX); iX++; SWIG_typemap_lang(argv[iX]); Swig_mark_arg(iX); continue; } if (strcmp(argv[iX], "-help") == 0) { fputs(usage, stdout); } if (strcmp(argv[iX], "-xmllite") == 0) { Swig_mark_arg(iX); xmllite = 1; } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGXML 1", 0); } /* Top of the parse tree */ virtual int top(Node *n) { if (out == 0) { String *outfile = Getattr(n, "outfile"); String *ext = Swig_file_extension(outfile); // If there's an extension, ext will include the ".". Delslice(outfile, Len(outfile) - Len(ext), DOH_END); Delete(ext); Append(outfile, ".xml"); out = NewFile(outfile, "w", SWIG_output_files()); if (!out) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } } Printf(out, " \n"); Xml_print_tree(n); return SWIG_OK; } void print_indent(int l) { int i; for (i = 0; i < indent_level; i++) { Printf(out, " "); } if (l) { Printf(out, " "); } } void Xml_print_tree(DOH *obj) { while (obj) { Xml_print_node(obj); obj = nextSibling(obj); } } void Xml_print_attributes(Node *obj) { String *k; indent_level += 4; print_indent(0); Printf(out, "\n", ++id, obj); indent_level += 4; Iterator ki; ki = First(obj); while (ki.key) { k = ki.key; if ((Cmp(k, "nodeType") == 0) || (Cmp(k, "firstChild") == 0) || (Cmp(k, "lastChild") == 0) || (Cmp(k, "parentNode") == 0) || (Cmp(k, "nextSibling") == 0) || (Cmp(k, "previousSibling") == 0) || (*(Char(k)) == '$')) { /* Do nothing */ } else if (Cmp(k, "module") == 0) { Xml_print_module(Getattr(obj, k)); } else if (Cmp(k, "baselist") == 0) { Xml_print_baselist(Getattr(obj, k)); } else if (!xmllite && Cmp(k, "typescope") == 0) { Xml_print_typescope(Getattr(obj, k)); } else if (!xmllite && Cmp(k, "typetab") == 0) { Xml_print_typetab(Getattr(obj, k)); } else if (Cmp(k, "kwargs") == 0) { Xml_print_kwargs(Getattr(obj, k)); } else if (Cmp(k, "parms") == 0 || Cmp(k, "pattern") == 0) { Xml_print_parmlist(Getattr(obj, k)); } else if (Cmp(k, "catchlist") == 0 || Cmp(k, "templateparms") == 0) { Xml_print_parmlist(Getattr(obj, k), Char(k)); } else { DOH *o; print_indent(0); if (DohIsString(Getattr(obj, k))) { String *ck = NewString(k); o = Str(Getattr(obj, k)); Replaceall(ck, ":", "_"); Replaceall(ck, "<", "<"); /* Do first to avoid aliasing errors. */ Replaceall(o, "&", "&"); Replaceall(o, "<", "<"); Replaceall(o, "\"", """); Replaceall(o, "\\", "\\\\"); Replaceall(o, "\n", " "); Printf(out, "\n", ck, o, ++id, o); Delete(o); Delete(ck); } else { o = Getattr(obj, k); String *ck = NewString(k); Replaceall(ck, ":", "_"); Printf(out, "\n", ck, o, ++id, o); Delete(ck); } } ki = Next(ki); } indent_level -= 4; print_indent(0); Printf(out, "\n"); indent_level -= 4; } void Xml_print_node(Node *obj) { Node *cobj; print_indent(0); Printf(out, "<%s id=\"%ld\" addr=\"%p\" >\n", nodeType(obj), ++id, obj); Xml_print_attributes(obj); cobj = firstChild(obj); if (cobj) { indent_level += 4; Printf(out, "\n"); Xml_print_tree(cobj); indent_level -= 4; } else { print_indent(1); Printf(out, "\n"); } print_indent(0); Printf(out, "\n", nodeType(obj)); } void Xml_print_parmlist(ParmList *p, const char* markup = "parmlist") { print_indent(0); Printf(out, "<%s id=\"%ld\" addr=\"%p\" >\n", markup, ++id, p); indent_level += 4; while (p) { print_indent(0); Printf(out, "\n", ++id); Xml_print_attributes(p); print_indent(0); Printf(out, "\n"); p = nextSibling(p); } indent_level -= 4; print_indent(0); Printf(out, "\n", markup); } void Xml_print_baselist(List *p) { print_indent(0); Printf(out, "\n", ++id, p); indent_level += 4; Iterator s; for (s = First(p); s.item; s = Next(s)) { print_indent(0); String *item_name = Xml_escape_string(s.item); Printf(out, "\n", item_name, ++id, s.item); Delete(item_name); } indent_level -= 4; print_indent(0); Printf(out, "\n"); } String *Xml_escape_string(String *str) { String *escaped_str = 0; if (str) { escaped_str = NewString(str); Replaceall(escaped_str, "&", "&"); Replaceall(escaped_str, "<", "<"); Replaceall(escaped_str, "\"", """); Replaceall(escaped_str, "\\", "\\\\"); Replaceall(escaped_str, "\n", " "); } return escaped_str; } void Xml_print_module(Node *p) { print_indent(0); Printf(out, "\n", Getattr(p, "name"), ++id, p); } void Xml_print_kwargs(Hash *p) { Xml_print_hash(p, "kwargs"); } void Xml_print_typescope(Hash *p) { Xml_print_hash(p, "typescope"); } void Xml_print_typetab(Hash *p) { Xml_print_hash(p, "typetab"); } void Xml_print_hash(Hash *p, const char *markup) { print_indent(0); Printf(out, "<%s id=\"%ld\" addr=\"%p\" >\n", markup, ++id, p); Xml_print_attributes(p); indent_level += 4; Iterator n = First(p); while (n.key) { print_indent(0); Printf(out, "<%ssitem id=\"%ld\" addr=\"%p\" >\n", markup, ++id, n.item); Xml_print_attributes(n.item); print_indent(0); Printf(out, "\n", markup); n = Next(n); } indent_level -= 4; print_indent(0); Printf(out, "\n", markup); } }; /* ----------------------------------------------------------------------------- * Swig_print_xml * * Dump an XML version of the parse tree. This is different from using the -xml * language module normally as it allows the real language module to process the * tree first, possibly stuffing in new attributes, so the XML that is output ends * up being a post-processing version of the tree. * ----------------------------------------------------------------------------- */ void Swig_print_xml(DOH *obj, String *filename) { XML xml; xmllite = 1; if (!filename) { out = stdout; } else { out = NewFile(filename, "w", SWIG_output_files()); if (!out) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } } Printf(out, " \n"); xml.Xml_print_tree(obj); } static Language *new_swig_xml() { return new XML(); } extern "C" Language *swig_xml(void) { return new_swig_xml(); } swig-4.0.2/Source/Modules/d.cxx0000644000175000017500000047615013667507523016216 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * d.cxx * * D language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include // Hash type used for storing information about director callbacks for a class. typedef DOH UpcallData; class D : public Language { static const char *usage; const String *empty_string; const String *public_string; const String *protected_string; /* * Files and file sections containing C/C++ code. */ File *f_begin; File *f_runtime; File *f_runtime_h; File *f_header; File *f_wrappers; File *f_init; File *f_directors; File *f_directors_h; List *filenames_list; /* * Command line-set modes of operation. */ // Whether a single proxy D module is generated or classes and enums are // written to their own files. bool split_proxy_dmodule; // The major D version targeted (currently 1 or 2). unsigned short d_version; /* * State variables which indicate what is being wrapped at the moment. * This is probably not the most elegant way of handling state, but it has * proven to work in the C# and Java modules. */ // Indicates if wrapping a native function. bool native_function_flag; // Indicates if wrapping a static functions or member variables bool static_flag; // Indicates if wrapping a nonstatic member variable bool variable_wrapper_flag; // Indicates if wrapping a member variable/enum/const. bool wrapping_member_flag; // Indicates if wrapping a global variable. bool global_variable_flag; // Name of a variable being wrapped. String *variable_name; /* * Variables temporarily holding the generated C++ code. */ // C++ code for the generated wrapper functions for casts up the C++ // for inheritance hierarchies. String *upcasts_code; // Function pointer typedefs for handling director callbacks on the C++ side. String *director_callback_typedefs; // Variables for storing the function pointers to the director callbacks on // the C++ side. String *director_callback_pointers; /* * Names of generated D entities. */ // The name of the D module containing the interface to the C wrapper. String *im_dmodule_name; // The fully qualified name of the wrap D module (package name included). String *im_dmodule_fq_name; // The name of the proxy module which exposes the (SWIG) module contents as a // D module. String *proxy_dmodule_name; // The fully qualified name of the proxy D module. String *proxy_dmodule_fq_name; // Optional: Package the D modules are placed in (set via the -package // command line option). String *package; // The directory the generated D module files are written to. Is constructed // from the package path if a target package is set, points to the general // output directory otherwise. String *dmodule_directory; // The name of the library which contains the C wrapper (used when generating // the dynamic library loader). Can be overridden via the -wrapperlibrary // command line flag. String *wrap_library_name; /* * Variables temporarily holding the generated D code. */ // Import statements written to the intermediary D module header set via // %pragma(d) imdmoduleimports. String *im_dmodule_imports; // The code for the intermediary D module body. String *im_dmodule_code; // Import statements for all proxy modules (the main proxy module and, if in // split proxy module mode, the proxy class modules) from // %pragma(d) globalproxyimports. String *global_proxy_imports; // The D code for the main proxy modules. nspace_proxy_dmodules is a hash from // the namespace name as key to an {"imports", "code"}. If the nspace feature // is not active, only proxy_dmodule_imports and proxy_dmodule_code are used, // which contain the code for the root proxy module. // // These variables should not be accessed directly but rather via the // proxy{Imports, Code}Buffer)() helper functions which return the right // buffer for a given namespace. If not in split proxy mode, they contain the // whole proxy code. String *proxy_dmodule_imports; String *proxy_dmodule_code; Hash *nspace_proxy_dmodules; // The D code generated for the currently processed enum. String *proxy_enum_code; /* * D data for the current proxy class. * * These strings are mainly used to temporarily accumulate code from the * various member handling functions while a single class is processed and are * no longer relevant once that class has been finished, i.e. after * classHandler() has returned. */ // The unqualified name of the current proxy class. String *proxy_class_name; // The name of the current proxy class, qualified with the name of the // namespace it is in, if any. String *proxy_class_qname; // The import directives for the current proxy class. They are written to the // same D module the proxy class is written to. String *proxy_class_imports; // Code for enumerations nested in the current proxy class. Is emitted earlier // than the rest of the body to work around forward referencing-issues. String *proxy_class_enums_code; // The generated D code making up the body of the current proxy class. String *proxy_class_body_code; // D code which is emitted right after the proxy class. String *proxy_class_epilogue_code; // The full code for the current proxy class, including the epilogue. String* proxy_class_code; // Contains a D call to the function wrapping C++ the destructor of the // current class (if there is a public C++ destructor). String *destructor_call; // D code for the director callbacks generated for the current class. String *director_dcallbacks_code; /* * Code for dynamically loading the wrapper library on the D side. */ // D code which is inserted into the im D module if dynamic linking is used. String *wrapper_loader_code; // The D code to bind a function pointer to a library symbol. String *wrapper_loader_bind_command; // The cumulated binding commands binding all the functions declared in the // intermediary D module to the C/C++ library symbols. String *wrapper_loader_bind_code; /* * Director data. */ List *dmethods_seq; Hash *dmethods_table; int n_dmethods; int first_class_dmethod; int curr_class_dmethod; /* * SWIG types data. */ // Collects information about encountered types SWIG does not know about (e.g. // incomplete types). This is used later to generate type wrapper proxy // classes for the unknown types. Hash *unknown_types; public: /* --------------------------------------------------------------------------- * D::D() * --------------------------------------------------------------------------- */ D():empty_string(NewString("")), public_string(NewString("public")), protected_string(NewString("protected")), f_begin(NULL), f_runtime(NULL), f_runtime_h(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), f_directors(NULL), f_directors_h(NULL), filenames_list(NULL), split_proxy_dmodule(false), d_version(1), native_function_flag(false), static_flag(false), variable_wrapper_flag(false), wrapping_member_flag(false), global_variable_flag(false), variable_name(NULL), upcasts_code(NULL), director_callback_typedefs(NULL), director_callback_pointers(NULL), im_dmodule_name(NULL), im_dmodule_fq_name(NULL), proxy_dmodule_name(NULL), proxy_dmodule_fq_name(NULL), package(NULL), dmodule_directory(NULL), wrap_library_name(NULL), im_dmodule_imports(NULL), im_dmodule_code(NULL), global_proxy_imports(NULL), proxy_dmodule_imports(NULL), proxy_dmodule_code(NULL), nspace_proxy_dmodules(NULL), proxy_enum_code(NULL), proxy_class_name(NULL), proxy_class_qname(NULL), proxy_class_imports(NULL), proxy_class_enums_code(NULL), proxy_class_body_code(NULL), proxy_class_epilogue_code(NULL), proxy_class_code(NULL), destructor_call(NULL), director_dcallbacks_code(NULL), wrapper_loader_code(NULL), wrapper_loader_bind_command(NULL), wrapper_loader_bind_code(NULL), dmethods_seq(NULL), dmethods_table(NULL), n_dmethods(0), first_class_dmethod(0), curr_class_dmethod(0), unknown_types(NULL) { // For now, multiple inheritance with directors is not possible. It should be // easy to implement though. director_multiple_inheritance = 0; director_language = 1; // Not used: Delete(none_comparison); none_comparison = NewString(""); } /* --------------------------------------------------------------------------- * D::main() * --------------------------------------------------------------------------- */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("d"); // Look for certain command line options for (int i = 1; i < argc; i++) { if (argv[i]) { if ((strcmp(argv[i], "-d2") == 0)) { Swig_mark_arg(i); d_version = 2; } else if (strcmp(argv[i], "-wrapperlibrary") == 0) { if (argv[i + 1]) { wrap_library_name = NewString(""); Printf(wrap_library_name, argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-package") == 0) { if (argv[i + 1]) { package = NewString(""); Printf(package, argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-splitproxy") == 0)) { Swig_mark_arg(i); split_proxy_dmodule = true; } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGD 1", 0); // Also make the target D version available as preprocessor symbol for // use in our library files. String *version_define = NewStringf("SWIG_D_VERSION %u", d_version); Preprocessor_define(version_define, 0); Delete(version_define); // Add typemap definitions SWIG_typemap_lang("d"); SWIG_config_file("d.swg"); allow_overloading(); } /* --------------------------------------------------------------------------- * D::top() * --------------------------------------------------------------------------- */ virtual int top(Node *n) { // Get any options set in the module directive Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode) { if (Getattr(optionsnode, "imdmodulename")) { im_dmodule_name = Copy(Getattr(optionsnode, "imdmodulename")); } if (Getattr(optionsnode, "directors")) { // Check if directors are enabled for this module. Note: This is a // "master switch", if it is not set, not director code will be emitted // at all. %feature("director") statements are also required to enable // directors for individual classes or methods. // // Use the »directors« attributte of the %module directive to enable // director generation (e.g. »%module(directors="1") modulename«). allow_directors(); } if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } allow_allprotected(GetFlag(optionsnode, "allprotected")); } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } if (directorsEnabled()) { if (!outfile_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); unknown_types = NewHash(); filenames_list = NewList(); // Make the package name and the resulting module output path. if (package) { // Append a dot so we can prepend the package variable directly to the // module names in the rest of the code. Printv(package, ".", NIL); } else { // Write the generated D modules to the »root« package by default. package = NewString(""); } dmodule_directory = Copy(SWIG_output_directory()); if (Len(package) > 0) { String *package_directory = Copy(package); Replaceall(package_directory, ".", SWIG_FILE_DELIMITER); Printv(dmodule_directory, package_directory, NIL); Delete(package_directory); } // Make the wrap and proxy D module names. // The wrap module name can be set in the module directive. if (!im_dmodule_name) { im_dmodule_name = NewStringf("%s_im", Getattr(n, "name")); } im_dmodule_fq_name = NewStringf("%s%s", package, im_dmodule_name); proxy_dmodule_name = Copy(Getattr(n, "name")); proxy_dmodule_fq_name = NewStringf("%s%s", package, proxy_dmodule_name); im_dmodule_code = NewString(""); proxy_class_imports = NewString(""); proxy_class_enums_code = NewString(""); proxy_class_body_code = NewString(""); proxy_class_epilogue_code = NewString(""); proxy_class_code = NewString(""); destructor_call = NewString(""); proxy_dmodule_code = NewString(""); proxy_dmodule_imports = NewString(""); nspace_proxy_dmodules = NewHash(); im_dmodule_imports = NewString(""); upcasts_code = NewString(""); global_proxy_imports = NewString(""); wrapper_loader_code = NewString(""); wrapper_loader_bind_command = NewString(""); wrapper_loader_bind_code = NewString(""); dmethods_seq = NewList(); dmethods_table = NewHash(); n_dmethods = 0; // By default, expect the dynamically loaded wrapper library to be named // [lib]_wrap[.so/.dll]. if (!wrap_library_name) wrap_library_name = NewStringf("%s_wrap", Getattr(n, "name")); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGD\n#define SWIGD\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); /* Emit initial director header and director code: */ Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", proxy_dmodule_name); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", proxy_dmodule_name); Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } } Printf(f_runtime, "\n"); Swig_name_register("wrapper", "D_%f"); Printf(f_wrappers, "\n#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); // Emit all the wrapper code. Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (before %header section). Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } // Generate the wrap D module. // TODO: Add support for »static« linking. { String *filen = NewStringf("%s%s.d", dmodule_directory, im_dmodule_name); File *im_d_file = NewFile(filen, "w", SWIG_output_files()); if (!im_d_file) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the intermediary class file. emitBanner(im_d_file); Printf(im_d_file, "module %s;\n", im_dmodule_fq_name); Printv(im_d_file, im_dmodule_imports, "\n", NIL); Replaceall(wrapper_loader_code, "$wraplibrary", wrap_library_name); Replaceall(wrapper_loader_code, "$wrapperloaderbindcode", wrapper_loader_bind_code); Replaceall(wrapper_loader_code, "$module", proxy_dmodule_name); Printf(im_d_file, "%s\n", wrapper_loader_code); // Add the wrapper function declarations. replaceModuleVariables(im_dmodule_code); Printv(im_d_file, im_dmodule_code, NIL); Delete(im_d_file); } // Generate the main D proxy module. { String *filen = NewStringf("%s%s.d", dmodule_directory, proxy_dmodule_name); File *proxy_d_file = NewFile(filen, "w", SWIG_output_files()); if (!proxy_d_file) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; emitBanner(proxy_d_file); Printf(proxy_d_file, "module %s;\n", proxy_dmodule_fq_name); Printf(proxy_d_file, "\nstatic import %s;\n", im_dmodule_fq_name); Printv(proxy_d_file, global_proxy_imports, NIL); Printv(proxy_d_file, proxy_dmodule_imports, NIL); Printv(proxy_d_file, "\n", NIL); // Write a D type wrapper class for each SWIG type to the proxy module code. for (Iterator swig_type = First(unknown_types); swig_type.key; swig_type = Next(swig_type)) { writeTypeWrapperClass(swig_type.key, swig_type.item); } // Add the proxy functions (and classes, if they are not written to a separate file). replaceModuleVariables(proxy_dmodule_code); Printv(proxy_d_file, proxy_dmodule_code, NIL); Delete(proxy_d_file); } // Generate the additional proxy modules for nspace support. for (Iterator it = First(nspace_proxy_dmodules); it.key; it = Next(it)) { String *module_name = createLastNamespaceName(it.key); String *filename = NewStringf("%s%s.d", outputDirectory(it.key), module_name); File *file = NewFile(filename, "w", SWIG_output_files()); if (!file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } Delete(filename); emitBanner(file); Printf(file, "module %s%s.%s;\n", package, it.key, module_name); Printf(file, "\nstatic import %s;\n", im_dmodule_fq_name); Printv(file, global_proxy_imports, NIL); Printv(file, Getattr(it.item, "imports"), NIL); Printv(file, "\n", NIL); String *code = Getattr(it.item, "code"); replaceModuleVariables(code); Printv(file, code, NIL); Delete(file); Delete(module_name); } if (upcasts_code) Printv(f_wrappers, upcasts_code, NIL); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); // Check for overwriting file problems on filesystems that are case insensitive Iterator it1; Iterator it2; for (it1 = First(filenames_list); it1.item; it1 = Next(it1)) { String *item1_lower = Swig_string_lower(it1.item); for (it2 = Next(it1); it2.item; it2 = Next(it2)) { String *item2_lower = Swig_string_lower(it2.item); if (it1.item && it2.item) { if (Strcmp(item1_lower, item2_lower) == 0) { Swig_warning(WARN_LANG_PORTABILITY_FILENAME, input_file, line_number, "Portability warning: File %s will be overwritten by %s on case insensitive filesystems such as " "Windows' FAT32 and NTFS unless the class/module name is renamed\n", it1.item, it2.item); } } Delete(item2_lower); } Delete(item1_lower); } Delete(unknown_types); unknown_types = NULL; Delete(filenames_list); filenames_list = NULL; Delete(im_dmodule_name); im_dmodule_name = NULL; Delete(im_dmodule_fq_name); im_dmodule_fq_name = NULL; Delete(im_dmodule_code); im_dmodule_code = NULL; Delete(proxy_class_imports); proxy_class_imports = NULL; Delete(proxy_class_enums_code); proxy_class_enums_code = NULL; Delete(proxy_class_body_code); proxy_class_body_code = NULL; Delete(proxy_class_epilogue_code); proxy_class_epilogue_code = NULL; Delete(proxy_class_code); proxy_class_code = NULL; Delete(destructor_call); destructor_call = NULL; Delete(proxy_dmodule_name); proxy_dmodule_name = NULL; Delete(proxy_dmodule_fq_name); proxy_dmodule_fq_name = NULL; Delete(proxy_dmodule_code); proxy_dmodule_code = NULL; Delete(proxy_dmodule_imports); proxy_dmodule_imports = NULL; Delete(nspace_proxy_dmodules); nspace_proxy_dmodules = NULL; Delete(im_dmodule_imports); im_dmodule_imports = NULL; Delete(upcasts_code); upcasts_code = NULL; Delete(global_proxy_imports); global_proxy_imports = NULL; Delete(wrapper_loader_code); wrapper_loader_code = NULL; Delete(wrapper_loader_bind_code); wrapper_loader_bind_code = NULL; Delete(wrapper_loader_bind_command); wrapper_loader_bind_command = NULL; Delete(dmethods_seq); dmethods_seq = NULL; Delete(dmethods_table); dmethods_table = NULL; Delete(package); package = NULL; Delete(dmodule_directory); dmodule_directory = NULL; n_dmethods = 0; // Merge all the generated C/C++ code and close the output files. Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors, f_begin); Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); f_runtime_h = NULL; Delete(f_directors); f_directors = NULL; Delete(f_directors_h); f_directors_h = NULL; } Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::insertDirective() * --------------------------------------------------------------------------- */ virtual int insertDirective(Node *n) { int ret = SWIG_OK; String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); replaceModuleVariables(code); if (!ImportMode && (Cmp(section, "proxycode") == 0)) { if (proxy_class_body_code) { Swig_typemap_replace_embedded_typemap(code, n); Printv(proxy_class_body_code, code, NIL); } } else { ret = Language::insertDirective(n); } return ret; } /* --------------------------------------------------------------------------- * D::pragmaDirective() * * Valid Pragmas: * imdmodulecode - text (D code) is copied verbatim to the wrap module * imdmoduleimports - import statements for the im D module * * proxydmodulecode - text (D code) is copied verbatim to the proxy module * (the main proxy module if in split proxy mode). * globalproxyimports - import statements inserted into _all_ proxy modules. * * wrapperloadercode - D code for loading the wrapper library (is copied to * the im D module). * wrapperloaderbindcommand - D code for binding a symbol from the wrapper * library to the declaration in the im D module. * --------------------------------------------------------------------------- */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *code = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "d") == 0) { String *strvalue = NewString(value); Replaceall(strvalue, "\\\"", "\""); if (Strcmp(code, "imdmodulecode") == 0) { Printf(im_dmodule_code, "%s\n", strvalue); } else if (Strcmp(code, "imdmoduleimports") == 0) { replaceImportTypeMacros(strvalue); Chop(strvalue); Printf(im_dmodule_imports, "%s\n", strvalue); } else if (Strcmp(code, "proxydmodulecode") == 0) { Printf(proxyCodeBuffer(0), "%s\n", strvalue); } else if (Strcmp(code, "globalproxyimports") == 0) { replaceImportTypeMacros(strvalue); Chop(strvalue); Printf(global_proxy_imports, "%s\n", strvalue); } else if (Strcmp(code, "wrapperloadercode") == 0) { Delete(wrapper_loader_code); wrapper_loader_code = Copy(strvalue); } else if (Strcmp(code, "wrapperloaderbindcommand") == 0) { Delete(wrapper_loader_bind_command); wrapper_loader_bind_command = Copy(strvalue); } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } Delete(strvalue); } } return Language::pragmaDirective(n); } /* --------------------------------------------------------------------------- * D::enumDeclaration() * * Wraps C/C++ enums as D enums. * --------------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { if (ImportMode) return SWIG_OK; if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; proxy_enum_code = NewString(""); String *symname = Getattr(n, "sym:name"); String *typemap_lookup_type = Getattr(n, "name"); // Emit the enum declaration. if (typemap_lookup_type) { const String *enummodifiers = lookupCodeTypemap(n, "dclassmodifiers", typemap_lookup_type, WARN_D_TYPEMAP_CLASSMOD_UNDEF); Printv(proxy_enum_code, "\n", enummodifiers, " ", symname, " {\n", NIL); } else { // Handle anonymous enums. Printv(proxy_enum_code, "\nenum {\n", NIL); } // Emit each enum item. Language::enumDeclaration(n); if (GetFlag(n, "nonempty")) { // Finish the enum. if (typemap_lookup_type) { Printv(proxy_enum_code, lookupCodeTypemap(n, "dcode", typemap_lookup_type, WARN_NONE), // Extra D code "\n}\n", NIL); } else { // Handle anonymous enums. Printv(proxy_enum_code, "\n}\n", NIL); } Replaceall(proxy_enum_code, "$dclassname", symname); } else { // D enum declarations must have at least one member to be legal, so emit // an alias to int instead (their ctype/imtype is always int). Delete(proxy_enum_code); proxy_enum_code = NewStringf("\nalias int %s;\n", symname); } const String* imports = lookupCodeTypemap(n, "dimports", typemap_lookup_type, WARN_NONE); String* imports_trimmed; if (Len(imports) > 0) { imports_trimmed = Copy(imports); Chop(imports_trimmed); replaceImportTypeMacros(imports_trimmed); Printv(imports_trimmed, "\n", NIL); } else { imports_trimmed = NewString(""); } if (is_wrapping_class()) { // Enums defined within the C++ class are written into the proxy // class. Printv(proxy_class_imports, imports_trimmed, NIL); Printv(proxy_class_enums_code, proxy_enum_code, NIL); } else { // Write non-anonymous enums to their own file if in split proxy module // mode. if (split_proxy_dmodule && typemap_lookup_type) { assertClassNameValidity(proxy_class_name); String *nspace = Getattr(n, "sym:nspace"); String *output_directory = outputDirectory(nspace); String *filename = NewStringf("%s%s.d", output_directory, symname); Delete(output_directory); File *class_file = NewFile(filename, "w", SWIG_output_files()); if (!class_file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filename)); Delete(filename); emitBanner(class_file); if (nspace) { Printf(class_file, "module %s%s.%s;\n", package, nspace, symname); } else { Printf(class_file, "module %s%s;\n", package, symname); } Printv(class_file, imports_trimmed, NIL); Printv(class_file, proxy_enum_code, NIL); Delete(class_file); } else { String *nspace = Getattr(n, "sym:nspace"); Printv(proxyImportsBuffer(nspace), imports, NIL); Printv(proxyCodeBuffer(nspace), proxy_enum_code, NIL); } } Delete(imports_trimmed); Delete(proxy_enum_code); proxy_enum_code = NULL; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::enumvalueDeclaration() * --------------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "?value", NIL); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); Node *parent = parentNode(n); String *tmpValue; // Strange hack from parent method. // RESEARCH: What is this doing? if (value) tmpValue = NewString(value); else tmpValue = NewString(name); // Note that this is used in enumValue() amongst other places Setattr(n, "value", tmpValue); // Deal with enum values that are not int int swigtype = SwigType_type(Getattr(n, "type")); if (swigtype == T_BOOL) { const char *val = Equal(Getattr(n, "enumvalue"), "true") ? "1" : "0"; Setattr(n, "enumvalue", val); } else if (swigtype == T_CHAR) { String *val = NewStringf("'%(escape)s'", Getattr(n, "enumvalue")); Setattr(n, "enumvalue", val); Delete(val); } // Emit the enum item. { if (!GetFlag(n, "firstenumitem")) Printf(proxy_enum_code, ",\n"); Printf(proxy_enum_code, " %s", Getattr(n, "sym:name")); // Check for the %dconstvalue feature String *value = Getattr(n, "feature:d:constvalue"); // Note that in D, enum values must be compile-time constants. Thus, // %dmanifestconst(0) (getting the enum values at runtime) is not supported. value = value ? value : Getattr(n, "enumvalue"); if (value) { Printf(proxy_enum_code, " = %s", value); } // Keep track that the currently processed enum has at least one value. SetFlag(parent, "nonempty"); } Delete(tmpValue); Swig_restore(n); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::memberfunctionHandler() * --------------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { Language::memberfunctionHandler(n); String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), proxy_class_name, overloaded_name); Setattr(n, "imfuncname", intermediary_function_name); String *proxy_func_name = Getattr(n, "sym:name"); Setattr(n, "proxyfuncname", proxy_func_name); if (split_proxy_dmodule && Len(Getattr(n, "parms")) == 0 && Strncmp(proxy_func_name, package, Len(proxy_func_name)) == 0) { // If we are in split proxy mode and the function is named like the // target package, the D compiler is unable to resolve the ambiguity // between the package name and an argument-less function call. // TODO: This might occur with nspace as well, augment the check. Swig_warning(WARN_D_NAME_COLLISION, input_file, line_number, "%s::%s might collide with the package name, consider using %%rename to resolve the ambiguity.\n", proxy_class_name, proxy_func_name); } writeProxyClassFunction(n); Delete(overloaded_name); // For each function, look if we have to alias in the parent class function // for the overload resolution process to work as expected from C++ // (http://www.digitalmars.com/d/2.0/function.html#function-inheritance). // For multiple overloads, only emit the alias directive once (for the // last method, »sym:nextSibling« is null then). // Smart pointer classes do not mirror the inheritance hierarchy of the // underlying types, so aliasing the base class methods in is not required // for them. // DMD BUG: We have to emit the alias after the last function because // taking a delegate in the overload checking code fails otherwise // (http://d.puremagic.com/issues/show_bug.cgi?id=4860). if (!Getattr(n, "sym:nextSibling") && !is_smart_pointer() && !areAllOverloadsOverridden(n)) { String *name = Getattr(n, "sym:name"); Printf(proxy_class_body_code, "\nalias $dbaseclass.%s %s;\n", name, name); } return SWIG_OK; } /* --------------------------------------------------------------------------- * D::staticmemberfunctionHandler() * --------------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { static_flag = true; Language::staticmemberfunctionHandler(n); String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), proxy_class_name, overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); writeProxyClassFunction(n); Delete(overloaded_name); static_flag = false; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::globalvariableHandler() * --------------------------------------------------------------------------- */ virtual int globalvariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); global_variable_flag = true; int ret = Language::globalvariableHandler(n); global_variable_flag = false; return ret; } /* --------------------------------------------------------------------------- * D::membervariableHandler() * --------------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; variable_wrapper_flag = true; Language::membervariableHandler(n); wrapping_member_flag = false; variable_wrapper_flag = false; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::staticmembervariableHandler() * --------------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { if (GetFlag(n, "feature:d:manifestconst") != 1) { Delattr(n, "value"); } variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; static_flag = true; Language::staticmembervariableHandler(n); wrapping_member_flag = false; static_flag = false; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::memberconstantHandler() * --------------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; Language::memberconstantHandler(n); wrapping_member_flag = false; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::constructorHandler() * --------------------------------------------------------------------------- */ virtual int constructorHandler(Node *n) { Language::constructorHandler(n); // Wrappers not wanted for some methods where the parameters cannot be overloadedprocess in D. if (Getattr(n, "overload:ignore")) { return SWIG_OK; } ParmList *l = Getattr(n, "parms"); String *tm; String *proxy_constructor_code = NewString(""); int i; // Holds code for the constructor helper method generated only when the din // typemap has code in the pre or post attributes. String *helper_code = NewString(""); String *helper_args = NewString(""); String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); NewString(""); String *overloaded_name = getOverloadedName(n); String *mangled_overname = Swig_name_construct(getNSpace(), overloaded_name); String *imcall = NewString(""); const String *methodmods = Getattr(n, "feature:d:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); // Typemaps were attached earlier to the node, get the return type of the // call to the C++ constructor wrapper. const String *wrapper_return_type = lookupDTypemap(n, "imtype", true); String *imtypeout = Getattr(n, "tmap:imtype:out"); if (imtypeout) { // The type in the imtype typemap's out attribute overrides the type in // the typemap itself. wrapper_return_type = imtypeout; } Printf(proxy_constructor_code, "\n%s this(", methodmods); Printf(helper_code, "static private %s SwigConstruct%s(", wrapper_return_type, proxy_class_name); Printv(imcall, im_dmodule_fq_name, ".", mangled_overname, "(", NIL); /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("dtype", l, NULL); Swig_typemap_attach_parms("din", l, NULL); emit_mark_varargs(l); int gencomma = 0; /* Output each parameter */ Parm *p = l; for (i = 0; p; i++) { if (checkAttribute(p, "varargs:ignore", "1")) { // Skip ignored varargs. p = nextSibling(p); continue; } if (checkAttribute(p, "tmap:in:numinputs", "0")) { // Skip ignored parameters. p = Getattr(p, "tmap:in:next"); continue; } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); // Get the D parameter type. if ((tm = lookupDTypemap(p, "dtype", true))) { const String *inattributes = Getattr(p, "tmap:dtype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, false); String *parmtype = 0; // Get the D code to convert the parameter value to the type used in the // intermediary D module. if ((tm = lookupDTypemap(p, "din"))) { Replaceall(tm, "$dinput", arg); String *pre = Getattr(p, "tmap:din:pre"); if (pre) { replaceClassname(pre, pt); Replaceall(pre, "$dinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:din:post"); if (post) { replaceClassname(post, pt); Replaceall(post, "$dinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:din:terminator"); if (terminator) { replaceClassname(terminator, pt); Replaceall(terminator, "$dinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } parmtype = Getattr(p, "tmap:din:parmtype"); if (parmtype) Replaceall(parmtype, "$dinput", arg); Printv(imcall, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_DIN_UNDEF, input_file, line_number, "No din typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma) { Printf(proxy_constructor_code, ", "); Printf(helper_code, ", "); Printf(helper_args, ", "); } Printf(proxy_constructor_code, "%s %s", param_type, arg); Printf(helper_code, "%s %s", param_type, arg); Printf(helper_args, "%s", parmtype ? parmtype : arg); ++gencomma; Delete(parmtype); Delete(arg); Delete(param_type); p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(proxy_constructor_code, ")"); Printf(helper_code, ")"); // Insert the dconstructor typemap (replacing $directorconnect as needed). Hash *attributes = NewHash(); String *typemap_lookup_type = Getattr(getCurrentClass(), "classtypeobj"); String *construct_tm = Copy(lookupCodeTypemap(n, "dconstructor", typemap_lookup_type, WARN_D_TYPEMAP_DCONSTRUCTOR_UNDEF, attributes)); if (construct_tm) { const bool use_director = (parentNode(n) && Swig_directorclass(n)); if (!use_director) { Replaceall(construct_tm, "$directorconnect", ""); } else { String *connect_attr = Getattr(attributes, "tmap:dconstructor:directorconnect"); if (connect_attr) { Replaceall(construct_tm, "$directorconnect", connect_attr); } else { Swig_warning(WARN_D_NO_DIRECTORCONNECT_ATTR, input_file, line_number, "\"directorconnect\" attribute missing in %s \"dconstructor\" typemap.\n", Getattr(n, "name")); Replaceall(construct_tm, "$directorconnect", ""); } } Printv(proxy_constructor_code, " ", construct_tm, NIL); } replaceExcode(n, proxy_constructor_code, "dconstructor", attributes); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { Printf(helper_code, " {\n"); if (is_pre_code) { Printv(helper_code, pre_code, "\n", NIL); } if (is_post_code) { Printf(helper_code, " try {\n"); Printv(helper_code, " return ", imcall, ";\n", NIL); Printv(helper_code, " } finally {\n", post_code, "\n }", NIL); } else { Printv(helper_code, " return ", imcall, ";", NIL); } if (is_terminator_code) { Printv(helper_code, "\n", terminator_code, NIL); } Printf(helper_code, "\n}\n"); String *helper_name = NewStringf("%s.SwigConstruct%s(%s)", proxy_class_name, proxy_class_name, helper_args); Replaceall(proxy_constructor_code, "$imcall", helper_name); Delete(helper_name); } else { Replaceall(proxy_constructor_code, "$imcall", imcall); } Printv(proxy_class_body_code, proxy_constructor_code, "\n", NIL); Delete(helper_args); Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(construct_tm); Delete(attributes); Delete(overloaded_name); Delete(imcall); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::destructorHandler() * --------------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); String *symname = Getattr(n, "sym:name"); Printv(destructor_call, im_dmodule_fq_name, ".", Swig_name_destroy(getNSpace(),symname), "(cast(void*)swigCPtr)", NIL); const String *methodmods = Getattr(n, "feature:d:methodmodifiers"); if (methodmods) Setattr(getCurrentClass(), "destructmethodmodifiers", methodmods); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::classHandler() * --------------------------------------------------------------------------- */ virtual int classHandler(Node *n) { String *nspace = getNSpace(); File *class_file = NULL; proxy_class_name = Copy(Getattr(n, "sym:name")); if (nspace) { proxy_class_qname = NewStringf("%s.%s", nspace, proxy_class_name); } else { proxy_class_qname = Copy(proxy_class_name); } if (!addSymbol(proxy_class_name, n, nspace)) { return SWIG_ERROR; } assertClassNameValidity(proxy_class_name); if (split_proxy_dmodule) { String *output_directory = outputDirectory(nspace); String *filename = NewStringf("%s%s.d", output_directory, proxy_class_name); class_file = NewFile(filename, "w", SWIG_output_files()); Delete(output_directory); if (!class_file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filename)); Delete(filename); emitBanner(class_file); if (nspace) { Printf(class_file, "module %s%s.%s;\n", package, nspace, proxy_class_name); } else { Printf(class_file, "module %s%s;\n", package, proxy_class_name); } Printf(class_file, "\nstatic import %s;\n", im_dmodule_fq_name); } Clear(proxy_class_imports); Clear(proxy_class_enums_code); Clear(proxy_class_body_code); Clear(proxy_class_epilogue_code); Clear(proxy_class_code); Clear(destructor_call); // Traverse the tree for this class, using the *Handler()s to generate code // to the proxy_class_* variables. Language::classHandler(n); writeProxyClassAndUpcasts(n); writeDirectorConnectWrapper(n); Replaceall(proxy_class_code, "$dclassname", proxy_class_name); String *dclazzname = Swig_name_member(getNSpace(), proxy_class_name, ""); Replaceall(proxy_class_code, "$dclazzname", dclazzname); Delete(dclazzname); if (split_proxy_dmodule) { Printv(class_file, global_proxy_imports, NIL); Printv(class_file, proxy_class_imports, NIL); replaceModuleVariables(proxy_class_code); Printv(class_file, proxy_class_code, NIL); Delete(class_file); } else { Printv(proxyImportsBuffer(getNSpace()), proxy_class_imports, NIL); Printv(proxyCodeBuffer(getNSpace()), proxy_class_code, NIL); } Delete(proxy_class_qname); proxy_class_qname = NULL; Delete(proxy_class_name); proxy_class_name = NULL; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::constantWrapper() * * Used for wrapping constants declared by #define or %constant and also for * (primitive) static member constants initialised inline. * * If the %dmanifestconst feature is used, the C/C++ constant value is used to * initialize a D »const«. If not, a »getter« method is generated which * retrieves the value via a call to the C wrapper. However, if there is a * %dconstvalue specified, it overrides all other settings. * --------------------------------------------------------------------------- */ virtual int constantWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); if (!addSymbol(symname, n)) return SWIG_ERROR; // The %dmanifestconst feature determines if a D manifest constant // (const/enum) or a getter function is created. if (GetFlag(n, "feature:d:manifestconst") != 1) { // Default constant handling will work with any type of C constant. It // generates a getter function (which is the same as a read only property // in D) which retrieves the value via by calling the C wrapper. // Note that this is only called for global constants, static member // constants are already handled in staticmemberfunctionHandler(). Swig_save("constantWrapper", n, "value", NIL); Swig_save("constantWrapper", n, "tmap:ctype:out", "tmap:imtype:out", "tmap:dtype:out", "tmap:out:null", "tmap:imtype:outattributes", "tmap:dtype:outattributes", NIL); // Add the stripped quotes back in. String *old_value = Getattr(n, "value"); SwigType *t = Getattr(n, "type"); if (SwigType_type(t) == T_STRING) { Setattr(n, "value", NewStringf("\"%s\"", old_value)); Delete(old_value); } else if (SwigType_type(t) == T_CHAR) { Setattr(n, "value", NewStringf("\'%s\'", old_value)); Delete(old_value); } SetFlag(n, "feature:immutable"); int result = globalvariableHandler(n); Swig_restore(n); return result; } String *constants_code = NewString(""); SwigType *t = Getattr(n, "type"); SwigType *valuetype = Getattr(n, "valuetype"); ParmList *l = Getattr(n, "parms"); // Attach the non-standard typemaps to the parameter list. Swig_typemap_attach_parms("dtype", l, NULL); // Get D return type. String *return_type = NewString(""); String *tm; if ((tm = lookupDTypemap(n, "dtype"))) { String *dtypeout = Getattr(n, "tmap:dtype:out"); if (dtypeout) { // The type in the out attribute of the typemap overrides the type // in the dtype typemap. tm = dtypeout; replaceClassname(tm, t); } Printf(return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(t, 0)); } const String *itemname = wrapping_member_flag ? variable_name : symname; String *attributes = Getattr(n, "feature:d:methodmodifiers"); if (attributes) { attributes = Copy(attributes); } else { attributes = Copy(is_public(n) ? public_string : protected_string); } if (d_version == 1) { if (static_flag) { Printv(attributes, " static", NIL); } Printf(constants_code, "\n%s const %s %s = ", attributes, return_type, itemname); } else { Printf(constants_code, "\n%s enum %s %s = ", attributes, return_type, itemname); } Delete(attributes); // Retrieve the override value set via %dconstvalue, if any. String *override_value = Getattr(n, "feature:d:constvalue"); if (override_value) { Printf(constants_code, "%s;\n", override_value); } else { // Just take the value from the C definition and hope it compiles in D. if (Getattr(n, "wrappedasconstant")) { if (SwigType_type(valuetype) == T_CHAR) Printf(constants_code, "\'%(escape)s\';\n", Getattr(n, "staticmembervariableHandler:value")); else Printf(constants_code, "%s;\n", Getattr(n, "staticmembervariableHandler:value")); } else { // Add the stripped quotes back in. String* value = Getattr(n, "value"); if (SwigType_type(t) == T_STRING) { Printf(constants_code, "\"%s\";\n", value); } else if (SwigType_type(t) == T_CHAR) { Printf(constants_code, "\'%s\';\n", value); } else { Printf(constants_code, "%s;\n", value); } } } // Emit the generated code to appropriate place. if (wrapping_member_flag) { Printv(proxy_class_body_code, constants_code, NIL); } else { Printv(proxyCodeBuffer(getNSpace()), constants_code, NIL); } // Cleanup. Delete(return_type); Delete(constants_code); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::functionWrapper() * * Generates the C wrapper code for a function and the corresponding * declaration in the wrap D module. * --------------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *c_return_type = NewString(""); String *im_return_type = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *body = NewString(""); int num_arguments = 0; bool is_void_return; String *overloaded_name = getOverloadedName(n); if (!Getattr(n, "sym:overloaded")) { if (!addSymbol(Getattr(n, "sym:name"), n)) return SWIG_ERROR; } // A new wrapper function object Wrapper *f = NewWrapper(); // Make a wrapper name for this function String *wname = Swig_name_wrapper(overloaded_name); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("ctype", l, f); Swig_typemap_attach_parms("imtype", l, f); /* Get return types */ if ((tm = lookupDTypemap(n, "ctype"))) { String *ctypeout = Getattr(n, "tmap:ctype:out"); if (ctypeout) { // The type in the ctype typemap's out attribute overrides the type in // the typemap itself. tm = ctypeout; } Printf(c_return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(t, 0)); } if ((tm = lookupDTypemap(n, "imtype"))) { String *imtypeout = Getattr(n, "tmap:imtype:out"); if (imtypeout) { // The type in the imtype typemap's out attribute overrides the type in // the typemap itself. tm = imtypeout; } Printf(im_return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_IMTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(t, 0)); } is_void_return = (Cmp(c_return_type, "void") == 0); if (!is_void_return) Wrapper_add_localv(f, "jresult", c_return_type, "jresult", NIL); Printv(f->def, " SWIGEXPORT ", c_return_type, " ", wname, "(", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); // Parameter overloading Setattr(n, "wrap:parms", l); Setattr(n, "wrap:name", wname); // Wrappers not wanted for some methods where the parameters cannot be overloaded in D if (Getattr(n, "sym:overloaded")) { // Emit warnings for the few cases that can't be overloaded in D and give up on generating wrapper Swig_overload_check(n); if (Getattr(n, "overload:ignore")) { DelWrapper(f); return SWIG_OK; } } // Collect the parameter list for the intermediary D module declaration of // the generated wrapper function. String *im_dmodule_parameters = NewString("("); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); int gencomma = 0; // Now walk the function parameter list and generate code to get arguments for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *im_param_type = NewString(""); String *c_param_type = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* Get the ctype types of the parameter */ if ((tm = lookupDTypemap(p, "ctype", true))) { Printv(c_param_type, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Get the intermediary class parameter types of the parameter */ if ((tm = lookupDTypemap(p, "imtype", true))) { const String *inattributes = Getattr(p, "tmap:imtype:inattributes"); Printf(im_param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_D_TYPEMAP_IMTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to intermediary class method */ if (gencomma) Printf(im_dmodule_parameters, ", "); Printf(im_dmodule_parameters, "%s %s", im_param_type, arg); // Add parameter to C function Printv(f->def, gencomma ? ", " : "", c_param_type, " ", arg, NIL); gencomma = 1; // Get typemap for this argument if ((tm = Getattr(p, "tmap:in"))) { canThrow(n, "in", p); Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } Delete(im_param_type); Delete(c_param_type); Delete(arg); } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { canThrow(n, "check", p); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { canThrow(n, "freearg", p); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { canThrow(n, "argout", p); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Look for usage of throws typemap and the canthrow flag ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "catchlist"))) { Swig_typemap_attach_parms("throws", throw_parm_list, f); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { canThrow(n, "throws", p); } } } String *null_attribute = 0; // Now write code to make the function call if (!native_function_flag) { Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { canThrow(n, "out", n); Replaceall(tm, "$result", "jresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printf(f->code, "%s", tm); null_attribute = Getattr(n, "tmap:out:null"); if (Len(tm)) Printf(f->code, "\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), Getattr(n, "name")); } emit_return_variable(n, t, f); } /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { canThrow(n, "newfree", n); Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if (!native_function_flag) { if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { canThrow(n, "ret", n); Printf(f->code, "%s\n", tm); } } // Complete D im parameter list and emit the declaration/binding code. Printv(im_dmodule_parameters, ")", NIL); writeImDModuleFunction(overloaded_name, im_return_type, im_dmodule_parameters, wname); Delete(im_dmodule_parameters); // Finish C function header. Printf(f->def, ") {"); if (!is_void_return) Printv(f->code, " return jresult;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); /* Contract macro modification */ if (Replaceall(f->code, "SWIG_contract_assert(", "SWIG_contract_assert($null, ") > 0) { Setattr(n, "d:canthrow", "1"); } if (!null_attribute) Replaceall(f->code, "$null", "0"); else Replaceall(f->code, "$null", null_attribute); /* Dump the function out */ if (!native_function_flag) { Wrapper_print(f, f_wrappers); // Handle %exception which sets the canthrow attribute. if (Getattr(n, "feature:except:canthrow")) { Setattr(n, "d:canthrow", "1"); } // A very simple check (it is not foolproof) to assist typemap writers // with setting the correct features when the want to throw D exceptions // from C++ code. It checks for the common methods which set // a pending D exception and issues a warning if one of them has been found // in the typemap, but the »canthrow« attribute/feature is not set. if (!Getattr(n, "d:canthrow")) { if (Strstr(f->code, "SWIG_exception")) { Swig_warning(WARN_D_CANTHROW_MISSING, input_file, line_number, "C code contains a call to SWIG_exception and D code does not handle pending exceptions via the canthrow attribute.\n"); } else if (Strstr(f->code, "SWIG_DSetPendingException")) { Swig_warning(WARN_D_CANTHROW_MISSING, input_file, line_number, "C code contains a call to a SWIG_DSetPendingException method and D code does not handle pending exceptions via the canthrow attribute.\n"); } } } // If we are not processing an enum or constant, and we were not generating // a wrapper function which will be accessed via a proxy class, write a // function to the proxy D module. if (!is_wrapping_class()) { writeProxyDModuleFunction(n); } // If we are processing a public member variable, write the property-style // member function to the proxy class. if (wrapping_member_flag) { Setattr(n, "proxyfuncname", variable_name); Setattr(n, "imfuncname", symname); writeProxyClassFunction(n); } Delete(c_return_type); Delete(im_return_type); Delete(cleanup); Delete(outarg); Delete(body); Delete(overloaded_name); DelWrapper(f); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::nativeWrapper() * --------------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n)) return SWIG_ERROR; if (Getattr(n, "type")) { Swig_save("nativeWrapper", n, "name", NIL); Setattr(n, "name", wrapname); native_function_flag = true; functionWrapper(n); Swig_restore(n); native_function_flag = false; } else { Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name")); } return SWIG_OK; } /* --------------------------------------------------------------------------- * D::classDirector() * --------------------------------------------------------------------------- */ virtual int classDirector(Node *n) { String *nspace = Getattr(n, "sym:nspace"); proxy_class_name = NewString(Getattr(n, "sym:name")); if (nspace) { proxy_class_qname = NewStringf("%s.%s", nspace, proxy_class_name); } else { proxy_class_qname = Copy(proxy_class_name); } int success = Language::classDirector(n); Delete(proxy_class_qname); proxy_class_qname = NULL; Delete(proxy_class_name); proxy_class_name = NULL; return success; } /* --------------------------------------------------------------------------- * D::classDirectorInit() * --------------------------------------------------------------------------- */ virtual int classDirectorInit(Node *n) { Delete(director_ctor_code); director_ctor_code = NewString("$director_new"); // Write C++ director class declaration, for example: // class SwigDirector_myclass : public myclass, public Swig::Director { String *classname = Swig_class_name(n); String *directorname = directorClassName(n); String *declaration = Swig_class_declaration(n, directorname); const String *base = Getattr(n, "classtype"); Printf(f_directors_h, "%s : public %s, public Swig::Director {\n", declaration, base); Printf(f_directors_h, "\npublic:\n"); Delete(declaration); Delete(directorname); Delete(classname); // Stash for later. Setattr(n, "director:ctor", NewString("Swig::Director()")); // Keep track of the director methods for this class. first_class_dmethod = curr_class_dmethod = n_dmethods; director_callback_typedefs = NewString(""); director_callback_pointers = NewString(""); director_dcallbacks_code = NewString(""); return Language::classDirectorInit(n); } /* --------------------------------------------------------------------------- * D::classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying D object. * --------------------------------------------------------------------------- */ virtual int classDirectorMethod(Node *n, Node *parent, String *super) { String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *returntype = Getattr(n, "type"); String *overloaded_name = getOverloadedName(n); String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); String *decl = Getattr(n, "decl"); String *declaration = NewString(""); String *tm; Parm *p; int i; Wrapper *w = NewWrapper(); ParmList *l = Getattr(n, "parms"); bool is_void = !(Cmp(returntype, "void")); String *qualified_return = 0; bool pure_virtual = (!(Cmp(storage, "virtual")) && !(Cmp(value, "0"))); int status = SWIG_OK; bool output_director = true; String *dirclassname = directorClassName(parent); String *qualified_name = NewStringf("%s::%s", dirclassname, name); SwigType *c_ret_type = NULL; String *dcallback_call_args = NewString(""); String *imclass_dmethod; String *callback_typedef_parms = NewString(""); String *delegate_parms = NewString(""); String *proxy_method_param_list = NewString(""); String *proxy_callback_return_type = NewString(""); String *callback_def = NewString(""); String *callback_code = NewString(""); String *imcall_args = NewString(""); bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; // Kludge Alert: functionWrapper sets sym:overload properly, but it // isn't at this point, so we have to manufacture it ourselves. At least // we're consistent with the sym:overload name in functionWrapper. (?? when // does the overloaded method name get set?) imclass_dmethod = NewStringf("SwigDirector_%s", Swig_name_member(getNSpace(), classname, overloaded_name)); qualified_return = SwigType_rcaststr(returntype, "c_result"); if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { String *base_typename = SwigType_base(returntype); String *resolved_typename = SwigType_typedef_resolve_all(base_typename); Symtab *symtab = Getattr(n, "sym:symtab"); Node *typenode = Swig_symbol_clookup(resolved_typename, symtab); if (SwigType_ispointer(returntype) || (typenode && Getattr(typenode, "abstracts"))) { /* initialize pointers to something sane. Same for abstract classes when a reference is returned. */ Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } else { /* If returning a reference, initialize the pointer to a sane default - if a D exception occurs, then the pointer returns something other than a NULL-initialized reference. */ SwigType *noref_type = SwigType_del_reference(Copy(returntype)); String *noref_ltype = SwigType_lstr(noref_type, 0); String *return_ltype = SwigType_lstr(returntype, 0); Wrapper_add_localv(w, "result_default", "static", noref_ltype, "result_default", NIL); Wrapper_add_localv(w, "c_result", return_ltype, "c_result", NIL); Printf(w->code, "result_default = SwigValueInit< %s >();\n", noref_ltype); Printf(w->code, "c_result = &result_default;\n"); Delete(return_ltype); Delete(noref_ltype); Delete(noref_type); } Delete(base_typename); Delete(resolved_typename); } } else { SwigType *vt; vt = cplus_value_type(returntype); if (!vt) { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), NIL); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(vt, "c_result"), NIL); Delete(vt); } } } /* Create the intermediate class wrapper */ tm = lookupDTypemap(n, "imtype"); if (tm) { String *imtypeout = Getattr(n, "tmap:imtype:out"); if (imtypeout) { // The type in the imtype typemap's out attribute overrides the type // in the typemap. tm = imtypeout; } Printf(callback_def, "\nprivate extern(C) %s swigDirectorCallback_%s_%s(void* dObject", tm, classname, overloaded_name); Printv(proxy_callback_return_type, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_IMTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(returntype, 0)); } if ((c_ret_type = Swig_typemap_lookup("ctype", n, "", 0))) { if (!is_void && !ignored_method) { String *jretval_decl = NewStringf("%s jresult", c_ret_type); Wrapper_add_localv(w, "jresult", jretval_decl, "= 0", NIL); Delete(jretval_decl); } } else { Swig_warning(WARN_D_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Swig_director_parms_fixup(l); // Attach the standard typemaps. Swig_typemap_attach_parms("out", l, 0); Swig_typemap_attach_parms("ctype", l, 0); Swig_typemap_attach_parms("imtype", l, 0); Swig_typemap_attach_parms("dtype", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("ddirectorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); // Preamble code. if (!ignored_method) Printf(w->code, "if (!swig_callback_%s) {\n", overloaded_name); if (!pure_virtual) { String *super_call = Swig_method_call(super, l); if (is_void) { Printf(w->code, "%s;\n", super_call); if (!ignored_method) Printf(w->code, "return;\n"); } else { Printf(w->code, "return %s;\n", super_call); } Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"%s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); if (!is_void) Printf(w->code, "return %s;", qualified_return); else if (!ignored_method) Printf(w->code, "return;\n"); } if (!ignored_method) Printf(w->code, "} else {\n"); // Go through argument list. for (i = 0, p = l; p; ++i) { /* Is this superfluous? */ while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } SwigType *pt = Getattr(p, "type"); String *ln = makeParameterName(n, p, i, false); String *c_param_type = NULL; String *c_decl = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); // Add each parameter to the D callback invocation arguments. Printf(dcallback_call_args, ", %s", arg); /* Get parameter's intermediary C type */ if ((c_param_type = lookupDTypemap(p, "ctype", true))) { String *ctypeout = Getattr(p, "tmap:ctype:out"); if (ctypeout) { // The type in the ctype typemap's out attribute overrides the type // in the typemap itself. c_param_type = ctypeout; } /* Add to local variables */ Printf(c_decl, "%s %s", c_param_type, arg); if (!ignored_method) Wrapper_add_localv(w, arg, c_decl, (!(SwigType_ispointer(pt) || SwigType_isreference(pt)) ? "" : "= 0"), NIL); /* Add input marshalling code */ if ((tm = Getattr(p, "tmap:directorin"))) { Setattr(p, "emit:directorinput", arg); Replaceall(tm, "$input", arg); Replaceall(tm, "$owner", "0"); if (Len(tm)) if (!ignored_method) Printf(w->code, "%s\n", tm); // Add parameter type to the C typedef for the D callback function. Printf(callback_typedef_parms, ", %s", c_param_type); /* Add parameter to the intermediate class code if generating the * intermediate's upcall code */ if ((tm = lookupDTypemap(p, "imtype", true))) { String *imtypeout = Getattr(p, "tmap:imtype:out"); if (imtypeout) { // The type in the imtype typemap's out attribute overrides the // type in the typemap itself. tm = imtypeout; } const String *im_directorinattributes = Getattr(p, "tmap:imtype:directorinattributes"); // TODO: Is this copy really needed? String *din = Copy(lookupDTypemap(p, "ddirectorin", true)); if (din) { Replaceall(din, "$winput", ln); Printf(delegate_parms, ", "); if (i > 0) { Printf(proxy_method_param_list, ", "); Printf(imcall_args, ", "); } Printf(delegate_parms, "%s%s %s", im_directorinattributes ? im_directorinattributes : empty_string, tm, ln); if (Cmp(din, ln)) { Printv(imcall_args, din, NIL); } else { Printv(imcall_args, ln, NIL); } Delete(din); // Get the parameter type in the proxy D class (used later when // generating the overload checking code for the directorConnect // function). if ((tm = lookupDTypemap(p, "dtype", true))) { Printf(proxy_method_param_list, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(pt, 0)); } } else { Swig_warning(WARN_D_TYPEMAP_DDIRECTORIN_UNDEF, input_file, line_number, "No ddirectorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } } else { Swig_warning(WARN_D_TYPEMAP_IMTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } p = Getattr(p, "tmap:directorin:next"); } else { Swig_warning(WARN_D_TYPEMAP_DDIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for argument %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = nextSibling(p); output_director = false; } } else { Swig_warning(WARN_D_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; p = nextSibling(p); } Delete(arg); Delete(c_decl); Delete(c_param_type); Delete(ln); } /* header declaration, start wrapper definition */ String *target; SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Add any exception specifications to the methods in the director class if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0)); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); // Finish the callback function declaraction. Printf(callback_def, "%s)", delegate_parms); Printf(callback_def, " {\n"); /* Emit the intermediate class's upcall to the actual class */ String *upcall = NewStringf("(cast(%s)dObject).%s(%s)", classname, symname, imcall_args); if (!is_void) { if ((tm = lookupDTypemap(n, "ddirectorout"))) { Replaceall(tm, "$dcall", upcall); Printf(callback_code, " return %s;\n", tm); } } else { Printf(callback_code, " %s;\n", upcall); } Printf(callback_code, "}\n"); Delete(upcall); if (!ignored_method) { if (!is_void) Printf(w->code, "jresult = (%s) ", c_ret_type); Printf(w->code, "swig_callback_%s(d_object%s);\n", overloaded_name, dcallback_call_args); if (!is_void) { String *jresult_str = NewString("jresult"); String *result_str = NewString("c_result"); /* Copy jresult into c_result... */ if ((tm = Swig_typemap_lookup("directorout", n, result_str, w))) { Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$result", result_str); Printf(w->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s used in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(jresult_str); Delete(result_str); } /* Marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout"))) { canThrow(n, "directorargout", p); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } /* Terminate wrapper code */ Printf(w->code, "}\n"); if (!is_void) Printf(w->code, "return %s;", qualified_return); } Printf(w->code, "}"); // We expose virtual protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK && output_director) { if (!is_void) { Replaceall(w->code, "$null", qualified_return); } else { Replaceall(w->code, "$null", ""); } if (!ignored_method) Printv(director_dcallbacks_code, callback_def, callback_code, NIL); if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } if (!ignored_method) { // Register the upcall method so that the callback registering code can // be written later. // We cannot directly use n here because its »type« attribute does not // the full return type any longer after Language::functionHandler has // returned. String *dp_return_type = lookupDTypemap(n, "dtype"); if (dp_return_type) { String *dtypeout = Getattr(n, "tmap:dtype:out"); if (dtypeout) { // The type in the dtype typemap's out attribute overrides the type // in the typemap itself. dp_return_type = dtypeout; replaceClassname(dp_return_type, returntype); } } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(returntype, 0)); dp_return_type = NewString(""); } UpcallData *udata = addUpcallMethod(imclass_dmethod, symname, decl, overloaded_name, dp_return_type, proxy_method_param_list); Delete(dp_return_type); // Write the global callback function pointer on the C code. String *methid = Getattr(udata, "class_methodidx"); Printf(director_callback_typedefs, " typedef %s (* SWIG_Callback%s_t)", c_ret_type, methid); Printf(director_callback_typedefs, "(void *dobj%s);\n", callback_typedef_parms); Printf(director_callback_pointers, " SWIG_Callback%s_t swig_callback_%s;\n", methid, overloaded_name); // Write the type alias for the callback to the intermediary D module. String *proxy_callback_type = NewString(""); String *dirClassName = directorClassName(parent); Printf(proxy_callback_type, "%s_Callback%s", dirClassName, methid); Printf(im_dmodule_code, "alias extern(C) %s function(void*%s) %s;\n", proxy_callback_return_type, delegate_parms, proxy_callback_type); Delete(proxy_callback_type); Delete(dirClassName); } Delete(qualified_return); Delete(c_ret_type); Delete(declaration); Delete(callback_typedef_parms); Delete(delegate_parms); Delete(proxy_method_param_list); Delete(callback_def); Delete(callback_code); DelWrapper(w); return status; } /* --------------------------------------------------------------------------- * D::classDirectorConstructor() * --------------------------------------------------------------------------- */ virtual int classDirectorConstructor(Node *n) { Node *parent = parentNode(n); String *decl = Getattr(n, "decl");; String *supername = Swig_class_name(parent); String *dirclassname = directorClassName(parent); String *sub = NewString(""); Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms; int argidx = 0; /* Assign arguments to superclass's parameters, if not already done */ for (p = superparms; p; p = nextSibling(p)) { String *pname = Getattr(p, "name"); if (!pname) { pname = NewStringf("arg%d", argidx++); Setattr(p, "name", pname); } } // TODO: Is this copy needed? parms = CopyParmList(superparms); if (!Getattr(n, "defaultargs")) { /* constructor */ { String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, dirclassname, parms, 0); String *call = Swig_csuperclass_call(0, basetype, superparms); String *classtype = SwigType_namestr(Getattr(n, "name")); Printf(f_directors, "%s::%s : %s, %s {\n", dirclassname, target, call, Getattr(parent, "director:ctor")); Printf(f_directors, " swig_init_callbacks();\n"); Printf(f_directors, "}\n\n"); Delete(classtype); Delete(target); Delete(call); } /* constructor header */ { String *target = Swig_method_decl(0, decl, dirclassname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(supername); Delete(parms); Delete(dirclassname); return Language::classDirectorConstructor(n); } /* --------------------------------------------------------------------------- * D::classDirectorDefaultConstructor() * --------------------------------------------------------------------------- */ virtual int classDirectorDefaultConstructor(Node *n) { String *dirclassname = directorClassName(n); String *classtype = SwigType_namestr(Getattr(n, "name")); Wrapper *w = NewWrapper(); Printf(w->def, "%s::%s() : %s {", dirclassname, dirclassname, Getattr(n, "director:ctor")); Printf(w->code, "}\n"); Wrapper_print(w, f_directors); Printf(f_directors_h, " %s();\n", dirclassname); DelWrapper(w); Delete(classtype); Delete(dirclassname); return Language::classDirectorDefaultConstructor(n); } /* --------------------------------------------------------------------------- * D::classDirectorDestructor() * --------------------------------------------------------------------------- */ virtual int classDirectorDestructor(Node *n) { Node *current_class = getCurrentClass(); String *dirclassname = directorClassName(current_class); Wrapper *w = NewWrapper(); if (Getattr(n, "noexcept")) { Printf(f_directors_h, " virtual ~%s() noexcept;\n", dirclassname); Printf(w->def, "%s::~%s() noexcept {\n", dirclassname, dirclassname); } else if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw();\n", dirclassname); Printf(w->def, "%s::~%s() throw() {\n", dirclassname, dirclassname); } else { Printf(f_directors_h, " virtual ~%s();\n", dirclassname); Printf(w->def, "%s::~%s() {\n", dirclassname, dirclassname); } Printv(w->code, "}\n", NIL); Wrapper_print(w, f_directors); DelWrapper(w); Delete(dirclassname); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::classDirectorEnd() * --------------------------------------------------------------------------- */ virtual int classDirectorEnd(Node *n) { int i; String *director_classname = directorClassName(n); Wrapper *w = NewWrapper(); if (Len(director_callback_typedefs) > 0) { Printf(f_directors_h, "\n%s", director_callback_typedefs); } Printf(f_directors_h, " void swig_connect_director(void* dobj"); Printf(w->def, "void %s::swig_connect_director(void* dobj", director_classname); Printf(w->code, "d_object = dobj;"); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); String *overname = Getattr(udata, "overname"); Printf(f_directors_h, ", SWIG_Callback%s_t callback%s", methid, overname); Printf(w->def, ", SWIG_Callback%s_t callback_%s", methid, overname); Printf(w->code, "swig_callback_%s = callback_%s;\n", overname, overname); } Printf(f_directors_h, ");\n"); Printf(w->def, ") {"); Printf(f_directors_h, "\nprivate:\n"); Printf(f_directors_h, " void swig_init_callbacks();\n"); Printf(f_directors_h, " void *d_object;\n"); if (Len(director_callback_pointers) > 0) { Printf(f_directors_h, "%s", director_callback_pointers); } Printf(f_directors_h, "};\n\n"); Printf(w->code, "}\n\n"); Printf(w->code, "void %s::swig_init_callbacks() {\n", director_classname); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *overname = Getattr(udata, "overname"); Printf(w->code, "swig_callback_%s = 0;\n", overname); } Printf(w->code, "}"); Wrapper_print(w, f_directors); DelWrapper(w); return Language::classDirectorEnd(n); } /* --------------------------------------------------------------------------- * D::classDirectorDisown() * --------------------------------------------------------------------------- */ virtual int classDirectorDisown(Node *n) { (void) n; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::replaceSpecialVariables() * --------------------------------------------------------------------------- */ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; SwigType *type = Getattr(parm, "type"); // Just assume that this goes to the proxy class, we cannot know. replaceClassname(tm, type); } protected: /* --------------------------------------------------------------------------- * D::extraDirectorProtectedCPPMethodsRequired() * --------------------------------------------------------------------------- */ virtual bool extraDirectorProtectedCPPMethodsRequired() const { return false; } private: /* --------------------------------------------------------------------------- * D::writeImDModuleFunction() * * Writes a function declaration for the given (C) wrapper function to the * intermediary D module. * * d_name - The name the function in the intermediary D module will get. * return type - The return type of the function in the C wrapper. * parameters - The parameter list of the C wrapper function. * wrapper_function_name - The name of the exported function in the C wrapper * (usually d_name prefixed by »D_«). * --------------------------------------------------------------------------- */ void writeImDModuleFunction(const_String_or_char_ptr d_name, const_String_or_char_ptr return_type, const_String_or_char_ptr parameters, const_String_or_char_ptr wrapper_function_name) { // TODO: Add support for static linking here. Printf(im_dmodule_code, "SwigExternC!(%s function%s) %s;\n", return_type, parameters, d_name); Printv(wrapper_loader_bind_code, wrapper_loader_bind_command, NIL); Replaceall(wrapper_loader_bind_code, "$function", d_name); Replaceall(wrapper_loader_bind_code, "$symbol", wrapper_function_name); } /* --------------------------------------------------------------------------- * D::writeProxyClassFunction() * * Creates a D proxy function for a C++ function in the wrapped class. Used * for both static and non-static C++ class functions. * * The Node must contain two extra attributes. * - "proxyfuncname": The name of the D proxy function. * - "imfuncname": The corresponding function in the intermediary D module. * --------------------------------------------------------------------------- */ void writeProxyClassFunction(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *intermediary_function_name = Getattr(n, "imfuncname"); String *proxy_function_name = Getattr(n, "proxyfuncname"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); // Wrappers not wanted for some methods where the parameters cannot be // overloaded in D. if (Getattr(n, "overload:ignore")) return; // Don't generate proxy method for additional explicitcall method used in // directors. if (GetFlag(n, "explicitcall")) return; // RESEARCH: What is this good for? if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("dtype", l, NULL); Swig_typemap_attach_parms("din", l, NULL); // Get return types. if ((tm = lookupDTypemap(n, "dtype"))) { String *dtypeout = Getattr(n, "tmap:dtype:out"); if (dtypeout) { // The type in the dtype typemap's out attribute overrides the type in // the typemap. tm = dtypeout; replaceClassname(tm, t); } Printf(return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(t, 0)); } if (wrapping_member_flag) { // Check if this is a setter method for a public member. const String *setter_name = Swig_name_set(getNSpace(), Swig_name_member(0, proxy_class_name, variable_name)); if (Cmp(Getattr(n, "sym:name"), setter_name) == 0) { setter_flag = true; } } // Write function modifiers. { String *modifiers; const String *mods_override = Getattr(n, "feature:d:methodmodifiers"); if (mods_override) { modifiers = Copy(mods_override); } else { modifiers = Copy(is_public(n) ? public_string : protected_string); if (Getattr(n, "override")) { Printf(modifiers, " override"); } } if (is_smart_pointer()) { // Smart pointer classes do not mirror the inheritance hierarchy of the // underlying pointer type, so no override required. Replaceall(modifiers, "override", ""); } Chop(modifiers); if (static_flag) { Printf(modifiers, " static"); } Printf(function_code, "%s ", modifiers); Delete(modifiers); } // Complete the function declaration up to the parameter list. Printf(function_code, "%s %s(", return_type, proxy_function_name); // Write the wrapper function call up to the parameter list. Printv(imcall, im_dmodule_fq_name, ".$imfuncname(", NIL); if (!static_flag) { Printf(imcall, "cast(void*)swigCPtr"); } String *proxy_param_types = NewString(""); // Write the parameter list for the proxy function declaration and the // wrapper function call. emit_mark_varargs(l); int gencomma = !static_flag; for (i = 0, p = l; p; i++) { // Ignored varargs. if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } // Ignored parameters. if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } // Ignore the 'this' argument for variable wrappers. if (!(variable_wrapper_flag && i == 0)) { String *param_name = makeParameterName(n, p, i, setter_flag); SwigType *pt = Getattr(p, "type"); // Write the wrapper function call argument. { if (gencomma) { Printf(imcall, ", "); } if ((tm = lookupDTypemap(p, "din", true))) { Replaceall(tm, "$dinput", param_name); String *pre = Getattr(p, "tmap:din:pre"); if (pre) { replaceClassname(pre, pt); Replaceall(pre, "$dinput", param_name); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:din:post"); if (post) { replaceClassname(post, pt); Replaceall(post, "$dinput", param_name); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:din:terminator"); if (terminator) { replaceClassname(terminator, pt); Replaceall(terminator, "$dinput", param_name); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_DIN_UNDEF, input_file, line_number, "No din typemap defined for %s\n", SwigType_str(pt, 0)); } } // Write the D proxy function parameter. { String *proxy_type = NewString(""); if ((tm = lookupDTypemap(p, "dtype"))) { const String *inattributes = Getattr(p, "tmap:dtype:inattributes"); Printf(proxy_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma >= 2) { Printf(function_code, ", "); Printf(proxy_param_types, ", "); } gencomma = 2; Printf(function_code, "%s %s", proxy_type, param_name); Append(proxy_param_types, proxy_type); Delete(proxy_type); } Delete(param_name); } p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ") "); if (d_version > 1 && wrapping_member_flag) { Printf(function_code, "@property "); } if (wrapMemberFunctionAsDConst(n)) { Printf(function_code, "const "); } // Lookup the code used to convert the wrapper return value to the proxy // function return type. if ((tm = lookupDTypemap(n, "dout"))) { replaceExcode(n, tm, "dout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } if (is_terminator_code) { Printv(tm, "\n", terminator_code, NIL); } Insert(tm, 0, "{"); Printv(tm, "}", NIL); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); replaceClassname(tm, t); // For director methods: generate code to selectively make a normal // polymorphic call or an explicit method call. Needed to prevent infinite // recursion when calling director methods. Node *explicit_n = Getattr(n, "explicitcallnode"); if (explicit_n && Swig_directorclass(getCurrentClass())) { String *ex_overloaded_name = getOverloadedName(explicit_n); String *ex_intermediary_function_name = Swig_name_member(getNSpace(), proxy_class_name, ex_overloaded_name); String *ex_imcall = Copy(imcall); Replaceall(ex_imcall, "$imfuncname", ex_intermediary_function_name); Replaceall(imcall, "$imfuncname", intermediary_function_name); String *excode = NewString(""); if (!Cmp(return_type, "void")) Printf(excode, "if (swigIsMethodOverridden!(%s delegate(%s), %s function(%s), %s)()) %s; else %s", return_type, proxy_param_types, return_type, proxy_param_types, proxy_function_name, ex_imcall, imcall); else Printf(excode, "((swigIsMethodOverridden!(%s delegate(%s), %s function(%s), %s)()) ? %s : %s)", return_type, proxy_param_types, return_type, proxy_param_types, proxy_function_name, ex_imcall, imcall); Clear(imcall); Printv(imcall, excode, NIL); Delete(ex_overloaded_name); Delete(excode); } else { Replaceall(imcall, "$imfuncname", intermediary_function_name); } Replaceall(tm, "$imcall", imcall); } else { Swig_warning(WARN_D_TYPEMAP_DOUT_UNDEF, input_file, line_number, "No dout typemap defined for %s\n", SwigType_str(t, 0)); } Delete(proxy_param_types); // The whole function body is now in stored tm (if there was a matching type // map, of course), so simply append it to the code buffer. The braces are // included in the typemap. Printv(function_code, tm, NIL); // Write function code buffer to the class code. Printv(proxy_class_body_code, "\n", function_code, "\n", NIL); Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(function_code); Delete(return_type); Delete(imcall); } /* --------------------------------------------------------------------------- * D::writeProxyDModuleFunction() * --------------------------------------------------------------------------- */ void writeProxyDModuleFunction(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); int num_arguments = 0; String *overloaded_name = getOverloadedName(n); String *func_name = NULL; String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); // RESEARCH: What is this good for? if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("dtype", l, NULL); Swig_typemap_attach_parms("din", l, NULL); /* Get return types */ if ((tm = lookupDTypemap(n, "dtype"))) { String *dtypeout = Getattr(n, "tmap:dtype:out"); if (dtypeout) { // The type in the dtype typemap's out attribute overrides the type in // the typemap. tm = dtypeout; replaceClassname(tm, t); } Printf(return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(t, 0)); } /* Change function name for global variables */ if (global_variable_flag) { // RESEARCH: Is the Copy() needed here? func_name = Copy(variable_name); } else { func_name = Copy(Getattr(n, "sym:name")); } /* Start generating the function */ const String *outattributes = Getattr(n, "tmap:dtype:outattributes"); if (outattributes) Printf(function_code, " %s\n", outattributes); const String *methodmods = Getattr(n, "feature:d:methodmodifiers"); // TODO: Check if is_public(n) could possibly make any sense here // (private global functions would be useless anyway?). methodmods = methodmods ? methodmods : empty_string; Printf(function_code, "\n%s%s %s(", methodmods, return_type, func_name); Printv(imcall, im_dmodule_fq_name, ".", overloaded_name, "(", NIL); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; i < num_arguments; i++) { /* Ignored parameters */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); // Get the D parameter type. if ((tm = lookupDTypemap(p, "dtype", true))) { const String *inattributes = Getattr(p, "tmap:dtype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); const bool generating_setter = global_variable_flag || wrapping_member_flag; String *arg = makeParameterName(n, p, i, generating_setter); // Get the D code to convert the parameter value to the type used in the // wrapper D module. if ((tm = lookupDTypemap(p, "din", true))) { Replaceall(tm, "$dinput", arg); String *pre = Getattr(p, "tmap:din:pre"); if (pre) { replaceClassname(pre, pt); Replaceall(pre, "$dinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:din:post"); if (post) { replaceClassname(post, pt); Replaceall(post, "$dinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:din:terminator"); if (terminator) { replaceClassname(terminator, pt); Replaceall(terminator, "$dinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_DIN_UNDEF, input_file, line_number, "No din typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to module class function */ if (gencomma >= 2) Printf(function_code, ", "); gencomma = 2; Printf(function_code, "%s %s", param_type, arg); p = Getattr(p, "tmap:in:next"); Delete(arg); Delete(param_type); } Printf(imcall, ")"); Printf(function_code, ") "); if (global_variable_flag && (d_version > 1)) { Printf(function_code, "@property "); } // Lookup the code used to convert the wrapper return value to the proxy // function return type. if ((tm = lookupDTypemap(n, "dout"))) { replaceExcode(n, tm, "dout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } if (is_terminator_code) { Printv(tm, "\n", terminator_code, NIL); } Insert(tm, 0, " {"); Printf(tm, "\n}"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); replaceClassname(tm, t); Replaceall(tm, "$imcall", imcall); } else { Swig_warning(WARN_D_TYPEMAP_DOUT_UNDEF, input_file, line_number, "No dout typemap defined for %s\n", SwigType_str(t, 0)); } // The whole function code is now stored in tm (if there was a matching // type map, of course), so simply append it to the code buffer. Printf(function_code, "%s\n", tm ? (const String *) tm : empty_string); Printv(proxyCodeBuffer(getNSpace()), function_code, NIL); Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(function_code); Delete(return_type); Delete(imcall); Delete(func_name); } /* --------------------------------------------------------------------------- * D::writeProxyClassAndUpcasts() * * Collects all the code fragments generated by the handler function while * traversing the tree from the proxy_class_* variables and writes the * class definition (including any epilogue code) to proxy_class_code. * * Also writes the upcast function to the wrapper layer when processing a * derived class. * * Inputs: * n – The class node currently processed. * --------------------------------------------------------------------------- */ void writeProxyClassAndUpcasts(Node *n) { SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); /* * Handle inheriting from D and C++ classes. */ String *c_classname = Getattr(n, "name"); String *c_baseclassname = NULL; Node *basenode = NULL; String *baseclass = NULL; // Inheritance from pure D classes. Node *attributes = NewHash(); const String *pure_baseclass = lookupCodeTypemap(n, "dbase", typemap_lookup_type, WARN_NONE, attributes); bool purebase_replace = GetFlag(attributes, "tmap:dbase:replace") ? true : false; bool purebase_notderived = GetFlag(attributes, "tmap:dbase:notderived") ? true : false; Delete(attributes); // C++ inheritance. if (!purebase_replace) { List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item) { if (!GetFlag(base.item, "feature:ignore")) { SwigType *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { basenode = base.item; String *name = createProxyName(baseclassname); if (name) { c_baseclassname = baseclassname; baseclass = name; } } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); Swig_warning(WARN_D_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Base %s of class %s ignored: multiple inheritance is not supported in D.\n", SwigType_namestr(baseclassname), SwigType_namestr(proxyclassname)); } } base = Next(base); } } } bool derived = baseclass != NULL; if (derived && purebase_notderived) { pure_baseclass = empty_string; } const String *wanted_base = baseclass ? baseclass : pure_baseclass; if (purebase_replace) { wanted_base = pure_baseclass; derived = false; basenode = NULL; baseclass = NULL; if (purebase_notderived) { Swig_error(Getfile(n), Getline(n), "The dbase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); } } else if (baseclass && Len(pure_baseclass) > 0) { Swig_warning(WARN_D_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base class %s ignored. Multiple inheritance is not supported in D. " "Perhaps you need one of the 'replace' or 'notderived' attributes in the dbase typemap?\n", typemap_lookup_type, pure_baseclass); } // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { writeClassUpcast(n, proxy_class_name, c_classname, c_baseclassname); } /* * Write needed imports. */ // If this class is derived from a C++ class, we need to have the D class // generated for it in scope. if (derived) { requireDType(Getattr(basenode, "sym:nspace"), Getattr(basenode, "sym:name")); } // Write any custom import statements to the proxy module header. const String *imports = lookupCodeTypemap(n, "dimports", typemap_lookup_type, WARN_NONE); if (Len(imports) > 0) { String* imports_trimmed = Copy(imports); Chop(imports_trimmed); replaceImportTypeMacros(imports_trimmed); Printv(proxy_class_imports, imports_trimmed, "\n", NIL); Delete(imports_trimmed); } /* * Write the proxy class header. */ // Class modifiers. const String *modifiers = lookupCodeTypemap(n, "dclassmodifiers", typemap_lookup_type, WARN_D_TYPEMAP_CLASSMOD_UNDEF); // User-defined interfaces. const String *interfaces = lookupCodeTypemap(n, derived ? "dinterfaces_derived" : "dinterfaces", typemap_lookup_type, WARN_NONE); Printv(proxy_class_code, "\n", modifiers, " $dclassname", (*Char(wanted_base) || *Char(interfaces)) ? " : " : "", wanted_base, (*Char(wanted_base) && *Char(interfaces)) ? ", " : "", interfaces, " {", NIL); /* * Write the proxy class body. */ String* body = NewString(""); // Default class body. const String *dbody; if (derived) { dbody = lookupCodeTypemap(n, "dbody_derived", typemap_lookup_type, WARN_D_TYPEMAP_DBODY_UNDEF); } else { dbody = lookupCodeTypemap(n, "dbody", typemap_lookup_type, WARN_D_TYPEMAP_DBODY_UNDEF); } Printv(body, dbody, NIL); // Destructor and dispose(). // If the C++ destructor is accessible (public), it is wrapped by the // dispose() method which is also called by the emitted D constructor. If it // is not accessible, no D destructor is written and the generated dispose() // method throws an exception. // This enables C++ classes with protected or private destructors to be used // in D as it would be used in C++ (GC finalization is a no-op then because // of the empty D destructor) while preventing usage in »scope« variables. // The method name for the dispose() method is specified in a typemap // attribute called »methodname«. const String *tm = NULL; const String *dispose_methodname; const String *dispose_methodmodifiers; const String *dispose_parameters; attributes = NewHash(); if (derived) { tm = lookupCodeTypemap(n, "ddispose_derived", typemap_lookup_type, WARN_NONE, attributes); dispose_methodname = Getattr(attributes, "tmap:ddispose_derived:methodname"); dispose_methodmodifiers = Getattr(attributes, "tmap:ddispose_derived:methodmodifiers"); dispose_parameters = Getattr(attributes, "tmap:ddispose_derived:parameters"); } else { tm = lookupCodeTypemap(n, "ddispose", typemap_lookup_type, WARN_NONE, attributes); dispose_methodname = Getattr(attributes, "tmap:ddispose:methodname"); dispose_methodmodifiers = Getattr(attributes, "tmap:ddispose:methodmodifiers"); dispose_parameters = Getattr(attributes, "tmap:ddispose:parameters"); } if (tm && *Char(tm)) { if (!dispose_methodname) { Swig_error(Getfile(n), Getline(n), "No methodname attribute defined in the ddispose%s typemap for %s\n", (derived ? "_derived" : ""), proxy_class_name); } if (!dispose_methodmodifiers) { Swig_error(Getfile(n), Getline(n), "No methodmodifiers attribute defined in ddispose%s typemap for %s.\n", (derived ? "_derived" : ""), proxy_class_name); } if (!dispose_parameters) dispose_parameters = empty_string; } if (tm) { // Write the destructor if the C++ one is accessible. if (*Char(destructor_call)) { Printv(body, lookupCodeTypemap(n, "ddestructor", typemap_lookup_type, WARN_NONE), NIL); } // Write the dispose() method. String *dispose_code = NewString(""); Printv(dispose_code, tm, NIL); if (*Char(destructor_call)) { Replaceall(dispose_code, "$imcall", destructor_call); } else { Replaceall(dispose_code, "$imcall", "throw new object.Exception(\"C++ destructor does not have public access\")"); } if (*Char(dispose_code)) { Printv(body, "\n", NIL); const String *methodmods = Getattr(n, "destructmethodmodifiers"); if (methodmods) Printv(body, methodmods, NIL); else Printv(body, dispose_methodmodifiers, (derived ? " override" : ""), NIL); Printv(body, " void ", dispose_methodname, "(", dispose_parameters, ") ", dispose_code, "\n", NIL); } } if (Swig_directorclass(n)) { // If directors are enabled for the current class, generate the // director connect helper function which is called from the constructor // and write it to the class body. writeDirectorConnectProxy(n); } // Write all constants and enumerations first to prevent forward reference // errors. Printv(body, proxy_class_enums_code, NIL); // Write the code generated in other methods to the class body. Printv(body, proxy_class_body_code, NIL); // Append extra user D code to the class body. Printv(body, lookupCodeTypemap(n, "dcode", typemap_lookup_type, WARN_NONE), "\n", NIL); // Write the class body and the curly bracket closing the class definition // to the proxy module. indentCode(body); Replaceall(body, "$dbaseclass", baseclass); Printv(proxy_class_code, body, "\n}\n", NIL); Delete(body); // Write the epilogue code if there is any. Printv(proxy_class_code, proxy_class_epilogue_code, NIL); } /* --------------------------------------------------------------------------- * D::writeClassUpcast() * --------------------------------------------------------------------------- */ void writeClassUpcast(Node *n, const String* d_class_name, SwigType* c_classname, SwigType* c_baseclassname) { SwigType *smart = Swig_cparse_smartptr(n); String *upcast_name = Swig_name_member(getNSpace(), d_class_name, (smart != 0 ? "SmartPtrUpcast" : "Upcast")); String *upcast_wrapper_name = Swig_name_wrapper(upcast_name); writeImDModuleFunction(upcast_name, "void*", "(void* objectRef)", upcast_wrapper_name); String *classname = SwigType_namestr(c_classname); String *baseclassname = SwigType_namestr(c_baseclassname); if (smart) { String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(smart); // TODO: SwigType_typedef_resolve_all on a String instead of SwigType is incorrect for templates SwigType *rclassname = SwigType_typedef_resolve_all(classname); SwigType *rbaseclassname = SwigType_typedef_resolve_all(baseclassname); Replaceall(bsmartnamestr, rclassname, rbaseclassname); Printv(upcasts_code, "SWIGEXPORT ", bsmartnamestr, " * ", upcast_wrapper_name, "(", smartnamestr, " *objectRef) {\n", " return objectRef ? new ", bsmartnamestr, "(*objectRef) : 0;\n" "}\n", "\n", NIL); Delete(rbaseclassname); Delete(rclassname); Delete(bsmartnamestr); Delete(smartnamestr); } else { Printv(upcasts_code, "SWIGEXPORT ", baseclassname, " * ", upcast_wrapper_name, "(", baseclassname, " *objectRef) {\n", " return (", baseclassname, " *)objectRef;\n" "}\n", "\n", NIL); } Replaceall(upcasts_code, "$cclass", classname); Replaceall(upcasts_code, "$cbaseclass", baseclassname); Delete(baseclassname); Delete(classname); Delete(upcast_name); Delete(upcast_wrapper_name); Delete(smart); } /* --------------------------------------------------------------------------- * D::writeTypeWrapperClass() * --------------------------------------------------------------------------- */ void writeTypeWrapperClass(String *classname, SwigType *type) { Node *n = NewHash(); Setfile(n, input_file); Setline(n, line_number); assertClassNameValidity(classname); String* imports_target; String* code_target; File *class_file = NULL; if (split_proxy_dmodule) { String *filename = NewStringf("%s%s.d", dmodule_directory, classname); class_file = NewFile(filename, "w", SWIG_output_files()); if (!class_file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filename)); Delete(filename); emitBanner(class_file); Printf(class_file, "module %s%s;\n", package, classname); Printf(class_file, "\nstatic import %s;\n", im_dmodule_fq_name); imports_target = NewString(""); code_target = NewString(""); } else { imports_target = proxyImportsBuffer(0); code_target = proxyCodeBuffer(0); } // Import statements. const String *imports = lookupCodeTypemap(n, "dimports", type, WARN_NONE); if (Len(imports) > 0) { String *imports_trimmed = Copy(imports); Chop(imports_trimmed); replaceImportTypeMacros(imports_trimmed); Printv(imports_target, imports_trimmed, "\n", NIL); Delete(imports_trimmed); } // Pure D baseclass and interfaces (no C++ inheritance possible. const String *pure_baseclass = lookupCodeTypemap(n, "dbase", type, WARN_NONE); const String *pure_interfaces = lookupCodeTypemap(n, "dinterfaces", type, WARN_NONE); // Emit the class. Printv(code_target, "\n", lookupCodeTypemap(n, "dclassmodifiers", type, WARN_D_TYPEMAP_CLASSMOD_UNDEF), " $dclassname", (*Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", pure_baseclass, ((*Char(pure_baseclass)) && *Char(pure_interfaces)) ? ", " : "", pure_interfaces, " {", NIL); String* body = NewString(""); Printv(body, lookupCodeTypemap(n, "dbody", type, WARN_D_TYPEMAP_DBODY_UNDEF), lookupCodeTypemap(n, "dcode", type, WARN_NONE), NIL); indentCode(body); Printv(code_target, body, "\n}\n", NIL); Delete(body); Replaceall(code_target, "$dclassname", classname); if (split_proxy_dmodule) { Printv(class_file, imports_target, NIL); Delete(imports_target); replaceModuleVariables(code_target); Printv(class_file, code_target, NIL); Delete(code_target); Delete(class_file); } Delete(n); } /* --------------------------------------------------------------------------- * D::writeDirectorConnectProxy(Node *classNode) * * Writes the helper method which registers the director callbacks by calling * the director connect function from the D side to the proxy class. * --------------------------------------------------------------------------- */ void writeDirectorConnectProxy(Node* classNode) { String *dirClassName = directorClassName(classNode); String *connect_name = Swig_name_member(getNSpace(), proxy_class_name, "director_connect"); Printf(proxy_class_body_code, "\nprivate void swigDirectorConnect() {\n"); int i; for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *method = Getattr(udata, "method"); String *overloaded_name = Getattr(udata, "overname"); String *return_type = Getattr(udata, "return_type"); String *param_list = Getattr(udata, "param_list"); String *methid = Getattr(udata, "class_methodidx"); Printf(proxy_class_body_code, " %s.%s_Callback%s callback%s;\n", im_dmodule_fq_name, dirClassName, methid, methid); Printf(proxy_class_body_code, " if (swigIsMethodOverridden!(%s delegate(%s), %s function(%s), %s)()) {\n", return_type, param_list, return_type, param_list, method); Printf(proxy_class_body_code, " callback%s = &swigDirectorCallback_%s_%s;\n", methid, proxy_class_name, overloaded_name); Printf(proxy_class_body_code, " }\n\n"); } Printf(proxy_class_body_code, " %s.%s(cast(void*)swigCPtr, cast(void*)this", im_dmodule_fq_name, connect_name); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); Printf(proxy_class_body_code, ", callback%s", methid); } Printf(proxy_class_body_code, ");\n"); Printf(proxy_class_body_code, "}\n"); // Helper function to determine if a method has been overridden in a // subclass of the wrapped class. If not, we just pass null to the // director_connect_function since the method from the C++ class should // be called as usual (see above). // Only emit it if the proxy class has at least one method. if (first_class_dmethod < curr_class_dmethod) { Printf(proxy_class_body_code, "\n"); Printf(proxy_class_body_code, "private bool swigIsMethodOverridden(DelegateType, FunctionType, alias fn)() %s{\n", (d_version > 1) ? "const " : ""); Printf(proxy_class_body_code, " DelegateType dg = &fn;\n"); Printf(proxy_class_body_code, " return dg.funcptr != SwigNonVirtualAddressOf!(FunctionType, fn);\n"); Printf(proxy_class_body_code, "}\n"); Printf(proxy_class_body_code, "\n"); Printf(proxy_class_body_code, "private static Function SwigNonVirtualAddressOf(Function, alias fn)() {\n"); Printf(proxy_class_body_code, " return cast(Function) &fn;\n"); Printf(proxy_class_body_code, "}\n"); } if (Len(director_dcallbacks_code) > 0) { Printv(proxy_class_epilogue_code, director_dcallbacks_code, NIL); } Delete(director_callback_typedefs); director_callback_typedefs = NULL; Delete(director_callback_pointers); director_callback_pointers = NULL; Delete(director_dcallbacks_code); director_dcallbacks_code = NULL; Delete(dirClassName); Delete(connect_name); } /* --------------------------------------------------------------------------- * D::writeDirectorConnectWrapper() * * Writes the director connect function and the corresponding declaration to * the C++ wrapper respectively the D wrapper. * --------------------------------------------------------------------------- */ void writeDirectorConnectWrapper(Node *n) { if (!Swig_directorclass(n)) return; // Output the director connect method. String *norm_name = SwigType_namestr(Getattr(n, "name")); String *connect_name = Swig_name_member(getNSpace(), proxy_class_name, "director_connect"); String *dirClassName = directorClassName(n); Wrapper *code_wrap; Printv(wrapper_loader_bind_code, wrapper_loader_bind_command, NIL); Replaceall(wrapper_loader_bind_code, "$function", connect_name); Replaceall(wrapper_loader_bind_code, "$symbol", Swig_name_wrapper(connect_name)); Printf(im_dmodule_code, "extern(C) void function(void* cObject, void* dObject"); code_wrap = NewWrapper(); Printf(code_wrap->def, "SWIGEXPORT void D_%s(void *objarg, void *dobj", connect_name); Printf(code_wrap->code, " %s *obj = (%s *)objarg;\n", norm_name, norm_name); Printf(code_wrap->code, " %s *director = static_cast<%s *>(obj);\n", dirClassName, dirClassName); Printf(code_wrap->code, " director->swig_connect_director(dobj"); for (int i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); Printf(code_wrap->def, ", %s::SWIG_Callback%s_t callback%s", dirClassName, methid, methid); Printf(code_wrap->code, ", callback%s", methid); Printf(im_dmodule_code, ", %s_Callback%s callback%s", dirClassName, methid, methid); } Printf(code_wrap->def, ") {\n"); Printf(code_wrap->code, ");\n"); Printf(im_dmodule_code, ") %s;\n", connect_name); Printf(code_wrap->code, "}\n"); Wrapper_print(code_wrap, f_wrappers); DelWrapper(code_wrap); Delete(connect_name); Delete(dirClassName); } /* --------------------------------------------------------------------------- * D::requireDType() * * If the given type is not already in scope in the current module, adds an * import statement for it. The name is considered relative to the global root * package if one is set. * * This is only used for dependencies created in generated code, user- * (i.e. typemap-) specified import statements are handled separately. * --------------------------------------------------------------------------- */ void requireDType(const String *nspace, const String *symname) { String *dmodule = createModuleName(nspace, symname); if (!inProxyModule(dmodule)) { String *import = createImportStatement(dmodule); Append(import, "\n"); if (is_wrapping_class()) { addImportStatement(proxy_class_imports, import); } else { addImportStatement(proxyImportsBuffer(getNSpace()), import); } Delete(import); } Delete(dmodule); } /* --------------------------------------------------------------------------- * D::addImportStatement() * * Adds the given import statement to the given list of import statements if * there is no statement importing that module present yet. * --------------------------------------------------------------------------- */ void addImportStatement(String *target, const String *import) const { char *position = Strstr(target, import); if (position) { // If the import statement has been found in the target string, we have to // check if the previous import was static, which would lead to problems // if this import is not. // Thus, we check if the seven characters in front of the occurrence are // »static «. If the import string passed is also static, the checks fail // even if the found statement is also static because the last seven // characters would be part of the previous import statement then. if (position - Char(target) < 7) { return; } if (strncmp(position - 7, "static ", 7)) { return; } } Printv(target, import, NIL); } /* --------------------------------------------------------------------------- * D::createImportStatement() * * Creates a string containing an import statement for the given module. * --------------------------------------------------------------------------- */ String *createImportStatement(const String *dmodule_name, bool static_import = true) const { if (static_import) { return NewStringf("static import %s%s;", package, dmodule_name); } else { return NewStringf("import %s%s;", package, dmodule_name); } } /* --------------------------------------------------------------------------- * D::inProxyModule() * * Determines if the specified proxy type is declared in the currently * processed proxy D module. * * This function is used to determine if fully qualified type names have to * be used (package, module and type name). If the split proxy mode is not * used, this solely depends on whether the type is in the current namespace. * --------------------------------------------------------------------------- */ bool inProxyModule(const String *type_name) const { if (!split_proxy_dmodule) { String *nspace = createOuterNamespaceNames(type_name); // Check if strings are either both null (no namespace) or are both // non-null and have the same contents. Cannot use Strcmp for this // directly because of its strange way of handling the case where only // one argument is 0 ("<"). bool result = !nspace && !getNSpace(); if (nspace && getNSpace()) result = (Strcmp(nspace, getNSpace()) == 0); Delete(nspace); return result; } if (!is_wrapping_class()) { return false; } return (Strcmp(proxy_class_qname, type_name) == 0); } /* --------------------------------------------------------------------------- * D::addUpcallMethod() * * Adds new director upcall signature. * --------------------------------------------------------------------------- */ UpcallData *addUpcallMethod(String *imclass_method, String *class_method, String *decl, String *overloaded_name, String *return_type, String *param_list) { String *key = NewStringf("%s|%s", imclass_method, decl); ++curr_class_dmethod; String *class_methodidx = NewStringf("%d", n_dmethods - first_class_dmethod); n_dmethods++; Hash *new_udata = NewHash(); Append(dmethods_seq, new_udata); Setattr(dmethods_table, key, new_udata); Setattr(new_udata, "method", Copy(class_method)); Setattr(new_udata, "class_methodidx", class_methodidx); Setattr(new_udata, "decl", Copy(decl)); Setattr(new_udata, "overname", Copy(overloaded_name)); Setattr(new_udata, "return_type", Copy(return_type)); Setattr(new_udata, "param_list", Copy(param_list)); Delete(key); return new_udata; } /* --------------------------------------------------------------------------- * D::assertClassNameValidity() * --------------------------------------------------------------------------- */ void assertClassNameValidity(const String* class_name) const { // TODO: With nspace support, there could arise problems also when not in // split proxy mode, warnings for these should be added. if (split_proxy_dmodule) { if (Cmp(class_name, im_dmodule_name) == 0) { Swig_error(input_file, line_number, "Class name cannot be equal to intermediary D module name: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } String *nspace = getNSpace(); if (nspace) { // Check the root package/outermost namespace (a class A in module // A.B leads to problems if another module A.C is also imported) if (Len(package) > 0) { String *dotless_package = NewStringWithSize(package, Len(package) - 1); if (Cmp(class_name, dotless_package) == 0) { Swig_error(input_file, line_number, "Class name cannot be the same as the root package it is in: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } Delete(dotless_package); } else { String *outer = createFirstNamespaceName(nspace); if (Cmp(class_name, outer) == 0) { Swig_error(input_file, line_number, "Class name cannot be the same as the outermost namespace it is in: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } Delete(outer); } // … and the innermost one (because of the conflict with the main proxy // module named like the namespace). String *inner = createLastNamespaceName(nspace); if (Cmp(class_name, inner) == 0) { Swig_error(input_file, line_number, "Class name cannot be the same as the innermost namespace it is in: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } Delete(inner); } else { if (Cmp(class_name, proxy_dmodule_name) == 0) { Swig_error(input_file, line_number, "Class name cannot be equal to proxy D module name: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } } } } /* --------------------------------------------------------------------------- * D::getPrimitiveDptype() * * Returns the D proxy type for the passed type if it is a primitive type in * both C and D. * --------------------------------------------------------------------------- */ String *getPrimitiveDptype(Node *node, SwigType *type) { SwigType *stripped_type = SwigType_typedef_resolve_all(type); // A reference can only be the »outermost element« of a type. bool mutable_ref = false; if (SwigType_isreference(stripped_type)) { SwigType_del_reference(stripped_type); if (SwigType_isconst(stripped_type)) { SwigType_del_qualifier(stripped_type); } else { mutable_ref = true; } } // Strip all the pointers from the type. int indirection_count = 0; while (SwigType_ispointer(stripped_type)) { ++indirection_count; SwigType_del_pointer(stripped_type); } // Now that we got rid of the pointers, see if we are dealing with a // primitive type. String *dtype = 0; if (SwigType_isfunction(stripped_type) && indirection_count > 0) { // type was a function pointer, split it up. SwigType_add_pointer(stripped_type); --indirection_count; SwigType *return_type = Copy(stripped_type); SwigType *params_type = SwigType_functionpointer_decompose(return_type); String *return_dtype = getPrimitiveDptype(node, return_type); Delete(return_type); if (!return_dtype) { return 0; } List *parms = SwigType_parmlist(params_type); List *param_dtypes = NewList(); for (Iterator it = First(parms); it.item; it = Next(it)) { String *current_dtype = getPrimitiveDptype(node, it.item); if (Cmp(current_dtype, "void") == 0) { // void somefunc(void) is legal syntax in C, but not in D, so simply // skip the void parameter. Delete(current_dtype); continue; } if (!current_dtype) { Delete(return_dtype); Delete(param_dtypes); return 0; } Append(param_dtypes, current_dtype); } String *param_list = NewString(""); { bool gen_comma = false; for (Iterator it = First(param_dtypes); it.item; it = Next(it)) { if (gen_comma) { Append(param_list, ", "); } Append(param_list, it.item); Delete(it.item); gen_comma = true; } } dtype = NewStringf("%s.SwigExternC!(%s function(%s))", im_dmodule_fq_name, return_dtype, param_list); Delete(param_list); Delete(param_dtypes); Delete(return_dtype); } else { Hash *attributes = NewHash(); const String *tm = lookupCodeTypemap(node, "dtype", stripped_type, WARN_NONE, attributes); if(!GetFlag(attributes, "tmap:dtype:cprimitive")) { dtype = 0; } else { dtype = Copy(tm); // We need to call replaceClassname here with the stripped type to avoid // $dclassname in the enum typemaps being replaced later with the full // type. replaceClassname(dtype, stripped_type); } Delete(attributes); } Delete(stripped_type); if (!dtype) { // The type passed is no primitive type. return 0; } // The type is ultimately a primitive type, now append the right number of // indirection levels (pointers). for (int i = 0; i < indirection_count; ++i) { Append(dtype, "*"); } // Add a level of indirection for a mutable reference since it is wrapped // as a pointer. if (mutable_ref) { Append(dtype, "*"); } return dtype; } /* --------------------------------------------------------------------------- * D::lookupCodeTypemap() * * Looks up a D code fragment for generating the wrapper class for the given * type. * * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * warning - warning number to issue if no typemaps found * typemap_attributes - the typemap attributes are attached to this node and will * also be used for temporary storage if non null * return is never NULL, unlike Swig_typemap_lookup() * --------------------------------------------------------------------------- */ const String *lookupCodeTypemap(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) const { Node *node = !typemap_attributes ? NewHash() : typemap_attributes; Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); if (!tm) { tm = empty_string; if (warning != WARN_NONE) { Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); } } if (!typemap_attributes) { Delete(node); } return tm; } /* --------------------------------------------------------------------------- * D::lookupDTypemap() * * Looks up a D typemap for the given node, replacing D-specific special * variables as needed. * * The method parameter specifies the typemap method to use. If attached is * true, the value is just fetched from the tmap: node attribute, * Swig_typemap_lookup is used otherwise. * --------------------------------------------------------------------------- */ String *lookupDTypemap(Node *n, const_String_or_char_ptr method, bool attached = false) { String *result = 0; if (attached) { String *attr_name = NewStringf("tmap:%s", method); result = Copy(Getattr(n, attr_name)); Delete(attr_name); } else { // FIXME: As a workaround for a bug so far only surfacing in the // smart_pointer_const_overload test case, remove the nativepointer // typemap attribute since it seems to be already there from a dout // typemap of a different type in that test. String *np_key = NewStringf("tmap:%s:nativepointer", method); Delattr(n, np_key); Delete(np_key); result = Swig_typemap_lookup(method, n, "", 0); } if (!result) { return 0; } // Check if the passed node actually has type information attached. This // is not the case e.g. in constructorWrapper. SwigType *type = Getattr(n, "type"); if (type) { String *np_key = NewStringf("tmap:%s:nativepointer", method); String *np_value = Getattr(n, np_key); Delete(np_key); String *dtype; if (np_value && (dtype = getPrimitiveDptype(n, type))) { // If the typemap in question has a »nativepointer« attribute and we // are dealing with a primitive type, use it instead. result = Copy(np_value); Replaceall(result, "$dtype", dtype); } replaceClassname(result, type); } return result; } /* --------------------------------------------------------------------------- * D::replaceClassname() * * Replaces the special variable $dclassname with the proxy class name for * classes/structs/unions SWIG knows about. Also substitutes the enumeration * name for non-anonymous enums. Otherwise, $classname is replaced with a * $descriptor(type)-like name. * * $*dclassname and $&classname work like with descriptors (see manual section * 10.4.3), they remove a prointer from respectively add a pointer to the type. * * Inputs: * tm - String to perform the substitution at (will usually come from a * typemap. * pt - The type to substitute for the variables. * Outputs: * tm - String with the variables substituted. * Return: * substitution_performed - flag indicating if a substitution was performed * --------------------------------------------------------------------------- */ bool replaceClassname(String *tm, SwigType *pt) { bool substitution_performed = false; SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); SwigType *strippedtype = SwigType_strip_qualifiers(type); if (Strstr(tm, "$dclassname")) { SwigType *classnametype = Copy(strippedtype); replaceClassnameVariable(tm, "$dclassname", classnametype); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$*dclassname")) { SwigType *classnametype = Copy(strippedtype); Delete(SwigType_pop(classnametype)); replaceClassnameVariable(tm, "$*dclassname", classnametype); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$&dclassname")) { SwigType *classnametype = Copy(strippedtype); SwigType_add_pointer(classnametype); replaceClassnameVariable(tm, "$&dclassname", classnametype); substitution_performed = true; Delete(classnametype); } Delete(strippedtype); Delete(type); return substitution_performed; } /* --------------------------------------------------------------------------- * D::replaceClassnameVariable() * * See D::replaceClassname(). * --------------------------------------------------------------------------- */ void replaceClassnameVariable(String *target, const char *variable, SwigType *type) { // TODO: Fix const-correctness of methods called in here and make type const. // We make use of the fact that this function is called at least once for // every type encountered which is written to a separate file, which allows // us to handle imports here. // When working in split proxy module mode, each generated proxy class/enum // is written to a separate module. This requires us to add a corresponding // import when a type is used in another generated module. If we are not // working in split proxy module mode, this is not relevant and the // generated module name is discarded. String *type_name; if (SwigType_isenum(type)) { // RESEARCH: Make sure that we really cannot get here for anonymous enums. Node *n = enumLookup(type); if (n) { String *enum_name = Getattr(n, "sym:name"); Node *p = parentNode(n); if (p && !Strcmp(nodeType(p), "class")) { // This is a nested enum. String *parent_name = Getattr(p, "sym:name"); String *nspace = Getattr(p, "sym:nspace"); // An enum nested in a class is not written to a separate module (this // would not even be possible in D), so just import the parent. requireDType(nspace, parent_name); String *module = createModuleName(nspace, parent_name); if (inProxyModule(module)) { type_name = NewStringf("%s.%s", parent_name, enum_name); } else { type_name = NewStringf("%s%s.%s.%s", package, module, parent_name, enum_name); } } else { // A non-nested enum is written to a separate module, import it. String *nspace = Getattr(n, "sym:nspace"); requireDType(nspace, enum_name); String *module = createModuleName(nspace, enum_name); if (inProxyModule(module)) { type_name = Copy(enum_name); } else { type_name = NewStringf("%s%s.%s", package, module, enum_name); } } } else { type_name = NewStringf("int"); } } else { Node *n = classLookup(type); if (n) { String *class_name = Getattr(n, "sym:name"); String *nspace = Getattr(n, "sym:nspace"); requireDType(nspace, class_name); String *module = createModuleName(nspace, class_name); if (inProxyModule(module)) { type_name = Copy(class_name); } else { type_name = NewStringf("%s%s.%s", package, module, class_name); } Delete(module); } else { // SWIG does not know anything about the type (after resolving typedefs). // Just mangle the type name string like $descriptor(type) would do. String *descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); requireDType(NULL, descriptor); String *module = createModuleName(NULL, descriptor); if (inProxyModule(module)) { type_name = Copy(descriptor); } else { type_name = NewStringf("%s%s.%s", package, module, descriptor); } Delete(module); // Add to hash table so that a type wrapper class can be created later. Setattr(unknown_types, descriptor, type); Delete(descriptor); } } Replaceall(target, variable, type_name); Delete(type_name); } /* --------------------------------------------------------------------------- * D::createModuleName() * * Returns a string holding the name of the module to import to bring the * given type in scope. * --------------------------------------------------------------------------- */ String *createModuleName(const String *nspace, const String *type_name) const { String *module; if (nspace) { module = NewStringf("%s.", nspace); if (split_proxy_dmodule) { Printv(module, type_name, NIL); } else { String *inner = createLastNamespaceName(nspace); Printv(module, inner, NIL); Delete(inner); } } else { if (split_proxy_dmodule) { module = Copy(type_name); } else { module = Copy(proxy_dmodule_name); } } return module; } /* --------------------------------------------------------------------------- * D::replaceModuleVariables() * * Replaces the $imdmodule and $module variables with their values in the * target string. * --------------------------------------------------------------------------- */ void replaceModuleVariables(String *target) const { Replaceall(target, "$imdmodule", im_dmodule_fq_name); Replaceall(target, "$module", proxy_dmodule_name); } /* --------------------------------------------------------------------------- * D::replaceExcode() * * If a C++ method can throw a exception, additional code is added to the * proxy method to check if an exception is pending so that it can be * rethrown on the D side. * * This method replaces the $excode variable with the exception handling code * in the excode typemap attribute if it »canthrow« an exception. * --------------------------------------------------------------------------- */ void replaceExcode(Node *n, String *code, const String *typemap, Node *parameter) const { String *excode_attribute = NewStringf("tmap:%s:excode", typemap); String *excode = Getattr(parameter, excode_attribute); if (Getattr(n, "d:canthrow")) { int count = Replaceall(code, "$excode", excode); if (count < 1 || !excode) { Swig_warning(WARN_D_EXCODE_MISSING, input_file, line_number, "D exception may not be thrown – no $excode or excode attribute in '%s' typemap.\n", typemap); } } else { Replaceall(code, "$excode", ""); } Delete(excode_attribute); } /* --------------------------------------------------------------------------- * D::replaceImportTypeMacros() * * Replaces the $importtype(SomeDClass) macro with an import statement if it * is required to get SomeDClass in scope for the currently generated proxy * D module. * --------------------------------------------------------------------------- */ void replaceImportTypeMacros(String *target) const { // Code from replace_embedded_typemap. char *start = 0; while ((start = Strstr(target, "$importtype("))) { char *end = 0; char *param_start = 0; char *param_end = 0; int level = 0; char *c = start; while (*c) { if (*c == '(') { if (level == 0) { param_start = c + 1; } level++; } if (*c == ')') { level--; if (level == 0) { param_end = c; end = c + 1; break; } } c++; } if (end) { String *current_macro = NewStringWithSize(start, (int)(end - start)); String *current_param = NewStringWithSize(param_start, (int)(param_end - param_start)); if (inProxyModule(current_param)) { Replace(target, current_macro, "", DOH_REPLACE_ANY); } else { String *import = createImportStatement(current_param, false); Replace(target, current_macro, import, DOH_REPLACE_ANY); Delete(import); } Delete(current_param); Delete(current_macro); } else { String *current_macro = NewStringWithSize(start, (int)(c - start)); Swig_error(Getfile(target), Getline(target), "Syntax error in: %s\n", current_macro); Replace(target, current_macro, "", DOH_REPLACE_ANY); Delete(current_macro); } } } /* --------------------------------------------------------------------------- * D::getOverloadedName() * --------------------------------------------------------------------------- */ String *getOverloadedName(Node *n) const { // A void* parameter is used for all wrapped classes in the wrapper code. // Thus, the wrapper function names for overloaded functions are postfixed // with a counter string to make them unique. String *overloaded_name = Copy(Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Append(overloaded_name, Getattr(n, "sym:overname")); } return overloaded_name; } /* --------------------------------------------------------------------------- * D::createProxyName() * * Returns the D class name if a type corresponds to something wrapped with a * proxy class, NULL otherwise. * --------------------------------------------------------------------------- */ String *createProxyName(SwigType *t) { String *proxyname = NULL; Node *n = classLookup(t); if (n) { String *nspace = Getattr(n, "sym:nspace"); String *symname = Getattr(n, "sym:name"); String *module = createModuleName(nspace, symname); if (inProxyModule(module)) { proxyname = Copy(symname); } else { proxyname = NewStringf("%s%s.%s", package, module, symname); } } return proxyname; } String *makeParameterName(Node *n, Parm *p, int arg_num, bool setter) const { String *arg = Language::makeParameterName(n, p, arg_num, setter); if (split_proxy_dmodule && Strncmp(arg, package, Len(arg)) == 0) { // If we are in split proxy mode and the argument is named like the target // package, we append an underscore to its name to avoid clashes. Append(arg, "_"); } return arg; } /* --------------------------------------------------------------------------- * D::canThrow() * * Determines whether the code in the typemap can throw a D exception. * If so, note it for later when excodeSubstitute() is called. * --------------------------------------------------------------------------- */ void canThrow(Node *n, const String *typemap, Node *parameter) const { String *canthrow_attribute = NewStringf("tmap:%s:canthrow", typemap); String *canthrow = Getattr(parameter, canthrow_attribute); if (canthrow) Setattr(n, "d:canthrow", "1"); Delete(canthrow_attribute); } /* --------------------------------------------------------------------------- * D::wrapMemberFunctionAsDConst() * * Determines whether the member function represented by the passed node is * wrapped as D »const« or not. * --------------------------------------------------------------------------- */ bool wrapMemberFunctionAsDConst(Node *n) const { if (d_version == 1) return false; if (static_flag) return false; // Never emit »const« for static member functions. return GetFlag(n, "memberget") || SwigType_isconst(Getattr(n, "decl")); } /* --------------------------------------------------------------------------- * D::areAllOverloadsOverridden() * * Determines whether the class the passed function node belongs to overrides * all the overlaods for the passed function node defined somewhere up the * inheritance hierarchy. * --------------------------------------------------------------------------- */ bool areAllOverloadsOverridden(Node *n) const { List *base_list = Getattr(parentNode(n), "bases"); if (!base_list) { // If the class which contains n is not derived from any other class, // there cannot be any not-overridden overloads. return true; } // In case of multiple base classes, skip to the one which has not been // ignored. // RESEARCH: Also emit a warning in case of multiple inheritance here? Iterator it = First(base_list); while (it.item && GetFlag(it.item, "feature:ignore")) { it = Next(it); } Node *base_class = it.item; if (!base_class) { // If all base classes have been ignored, there cannot be one either. return true; } // We try to find at least a single overload which exists in the base class // so we can progress up the inheritance hierarchy even if there have been // new overloads introduced after the topmost class. Node *base_function = NULL; String *symname = Getattr(n, "sym:name"); if (symname) { for (Node *tmp = firstChild(base_class); tmp; tmp = nextSibling(tmp)) { String *child_symname = Getattr(tmp, "sym:name"); if (child_symname && (Strcmp(child_symname, symname) == 0)) { base_function = tmp; break; } } } if (!base_function) { // If there is no overload which also exists in the super class, there // cannot be any base class overloads not overridden. return true; } size_t base_overload_count = 0; for (Node *tmp = firstSibling(base_function); tmp; tmp = Getattr(tmp, "sym:nextSibling")) { if (is_protected(base_function) && !(Swig_director_mode() && Swig_director_protected_mode() && Swig_all_protected_mode())) { // If the base class function is »protected« and were are not in // director mode, it is not emitted to the base class and thus we do // not count it. Otherwise, we would run into issues if the visibility // of some functions was changed from protected to public in a child // class with the using directive. continue; } ++base_overload_count; } return ((base_overload_count <= overridingOverloadCount(n)) && areAllOverloadsOverridden(base_function)); } /* --------------------------------------------------------------------------- * D::overridingOverloadCount() * * Given a member function node, this function counts how many of the * overloads of the function (including itself) override a function in the * base class. * --------------------------------------------------------------------------- */ size_t overridingOverloadCount(Node *n) const { size_t result = 0; Node *tmp = firstSibling(n); do { // KLUDGE: We also have to count the function if the access attribute is // not present, since this means that it has been promoted into another // protection level in the base class with the C++ »using« directive, and // is thus taken into account when counting the base class overloads, even // if it is not marked as »override« by the SWIG parser. if (Getattr(n, "override") || !Getattr(n, "access")) { ++result; } } while((tmp = Getattr(tmp, "sym:nextSibling"))); return result; } /* --------------------------------------------------------------------------- * D::firstSibling() * * Returns the first sibling of the passed node. * --------------------------------------------------------------------------- */ Node *firstSibling(Node *n) const { Node *result = n; while (Node *tmp = Getattr(result, "sym:previousSibling")) { result = tmp; } return result; } /* --------------------------------------------------------------------------- * D::indentCode() * * Helper function to indent a code (string) by one level. * --------------------------------------------------------------------------- */ void indentCode(String* code) const { Replaceall(code, "\n", "\n "); Replaceall(code, " \n", "\n"); Chop(code); } /* --------------------------------------------------------------------------- * D::emitBanner() * --------------------------------------------------------------------------- */ void emitBanner(File *f) const { Printf(f, "/* ----------------------------------------------------------------------------\n"); Swig_banner_target_lang(f, " *"); Printf(f, " * ----------------------------------------------------------------------------- */\n\n"); } /* --------------------------------------------------------------------------- * D::outputDirectory() * * Returns the directory to write the D modules for the given namespace to and * and creates the subdirectory if it doesn't exist. * --------------------------------------------------------------------------- */ String *outputDirectory(String *nspace) { String *output_directory = Copy(dmodule_directory); if (nspace) { String *nspace_subdirectory = Copy(nspace); Replaceall(nspace_subdirectory, ".", SWIG_FILE_DELIMITER); String *newdir_error = Swig_new_subdirectory(output_directory, nspace_subdirectory); if (newdir_error) { Printf(stderr, "%s\n", newdir_error); Delete(newdir_error); SWIG_exit(EXIT_FAILURE); } Printv(output_directory, nspace_subdirectory, SWIG_FILE_DELIMITER, 0); Delete(nspace_subdirectory); } return output_directory; } /* --------------------------------------------------------------------------- * D::proxyCodeBuffer() * * Returns the buffer to write proxy code for the given namespace to. * --------------------------------------------------------------------------- */ String *proxyCodeBuffer(String *nspace) { if (!nspace) { return proxy_dmodule_code; } Hash *hash = Getattr(nspace_proxy_dmodules, nspace); if (!hash) { hash = NewHash(); Setattr(hash, "code", NewString("")); Setattr(hash, "imports", NewString("")); Setattr(nspace_proxy_dmodules, nspace, hash); } return Getattr(hash, "code"); } /* --------------------------------------------------------------------------- * D::proxyCodeBuffer() * * Returns the buffer to write imports for the proxy code for the given * namespace to. * --------------------------------------------------------------------------- */ String *proxyImportsBuffer(String *nspace) { if (!nspace) { return proxy_dmodule_imports; } Hash *hash = Getattr(nspace_proxy_dmodules, nspace); if (!hash) { hash = NewHash(); Setattr(hash, "code", NewString("")); Setattr(hash, "imports", NewString("")); Setattr(nspace_proxy_dmodules, nspace, hash); } return Getattr(hash, "imports"); } /* --------------------------------------------------------------------------- * D::createFirstNamespaceName() * * Returns a new string containing the name of the outermost namespace, e.g. * »A« for the argument »A.B.C«. * --------------------------------------------------------------------------- */ String *createFirstNamespaceName(const String *nspace) const { char *tmp = Char(nspace); char *c = tmp; char *co = 0; if (!strstr(c, ".")) return 0; co = c + Len(nspace); while (*c && (c != co)) { if (*c == '.') { break; } c++; } if (!*c || (c == tmp)) { return NULL; } return NewStringWithSize(tmp, (int)(c - tmp)); } /* --------------------------------------------------------------------------- * D::createLastNamespaceName() * * Returns a new string containing the name of the innermost namespace, e.g. * »C« for the argument »A.B.C«. * --------------------------------------------------------------------------- */ String *createLastNamespaceName(const String *nspace) const { if (!nspace) return NULL; char *c = Char(nspace); char *cc = c; if (!strstr(c, ".")) return NewString(nspace); while (*c) { if (*c == '.') { cc = c; } ++c; } return NewString(cc + 1); } /* --------------------------------------------------------------------------- * D::createOuterNamespaceNames() * * Returns a new string containing the name of the outer namespace, e.g. * »A.B« for the argument »A.B.C«. * --------------------------------------------------------------------------- */ String *createOuterNamespaceNames(const String *nspace) const { if (!nspace) return NULL; char *tmp = Char(nspace); char *c = tmp; char *cc = c; if (!strstr(c, ".")) return NULL; while (*c) { if (*c == '.') { cc = c; } ++c; } if (cc == tmp) { return NULL; } return NewStringWithSize(tmp, (int)(cc - tmp)); } }; static Language *new_swig_d() { return new D(); } /* ----------------------------------------------------------------------------- * swig_d() - Instantiate module * ----------------------------------------------------------------------------- */ extern "C" Language *swig_d(void) { return new_swig_d(); } /* ----------------------------------------------------------------------------- * Usage information displayed at the command line. * ----------------------------------------------------------------------------- */ const char *D::usage = "\ D Options (available with -d)\n\ -d2 - Generate code for D2/Phobos (default: D1/Tango)\n\ -package - Write generated D modules into package \n\ -splitproxy - Write each D type to a dedicated file instead of\n\ generating a single proxy D module.\n\ -wrapperlibrary - Set the name of the wrapper library to \n\ \n"; swig-4.0.2/Source/Modules/utils.cxx0000644000175000017500000001765613667507523017135 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * utils.cxx * * Various utility functions. * ----------------------------------------------------------------------------- */ #include int is_public(Node *n) { String *access = Getattr(n, "access"); return !access || !Cmp(access, "public"); } int is_private(Node *n) { String *access = Getattr(n, "access"); return access && !Cmp(access, "private"); } int is_protected(Node *n) { String *access = Getattr(n, "access"); return access && !Cmp(access, "protected"); } static int is_member_director_helper(Node *parentnode, Node *member) { int parent_nodirector = GetFlag(parentnode, "feature:nodirector"); if (parent_nodirector) return 0; int parent_director = Swig_director_mode() && GetFlag(parentnode, "feature:director"); int cdecl_director = parent_director || GetFlag(member, "feature:director"); int cdecl_nodirector = GetFlag(member, "feature:nodirector"); return cdecl_director && !cdecl_nodirector && !GetFlag(member, "feature:extend"); } int is_member_director(Node *parentnode, Node *member) { if (parentnode && checkAttribute(member, "storage", "virtual")) { return is_member_director_helper(parentnode, member); } else { return 0; } } int is_member_director(Node *member) { return is_member_director(Getattr(member, "parentNode"), member); } // Identifies the additional protected members that are generated when the allprotected option is used. // This does not include protected virtual methods as they are turned on with the dirprot option. int is_non_virtual_protected_access(Node *n) { int result = 0; if (Swig_director_mode() && Swig_director_protected_mode() && Swig_all_protected_mode() && is_protected(n) && !checkAttribute(n, "storage", "virtual")) { Node *parentNode = Getattr(n, "parentNode"); // When vtable is empty, the director class does not get emitted, so a check for an empty vtable should be done. // However, vtable is set in Language and so is not yet set when methods in Typepass call clean_overloaded() // which calls is_non_virtual_protected_access. So commented out below. // Moving the director vtable creation into Typepass should solve this problem. if (is_member_director_helper(parentNode, n) /* && Getattr(parentNode, "vtable")*/) result = 1; } return result; } /* Clean overloaded list. Removes templates, ignored, and errors */ void clean_overloaded(Node *n) { Node *nn = Getattr(n, "sym:overloaded"); Node *first = 0; while (nn) { String *ntype = nodeType(nn); if ((GetFlag(nn, "feature:ignore")) || (Getattr(nn, "error")) || (Strcmp(ntype, "template") == 0) || ((Strcmp(ntype, "cdecl") == 0) && is_protected(nn) && !is_member_director(nn) && !is_non_virtual_protected_access(n))) { /* Remove from overloaded list */ Node *ps = Getattr(nn, "sym:previousSibling"); Node *ns = Getattr(nn, "sym:nextSibling"); if (ps) { Setattr(ps, "sym:nextSibling", ns); } if (ns) { Setattr(ns, "sym:previousSibling", ps); } Delattr(nn, "sym:previousSibling"); Delattr(nn, "sym:nextSibling"); Delattr(nn, "sym:overloaded"); nn = ns; continue; } else { if (!first) first = nn; Setattr(nn, "sym:overloaded", first); } nn = Getattr(nn, "sym:nextSibling"); } if (!first || (first && !Getattr(first, "sym:nextSibling"))) { if (Getattr(n, "sym:overloaded")) Delattr(n, "sym:overloaded"); } } /* ----------------------------------------------------------------------------- * Swig_set_max_hash_expand() * * Controls how many Hash objects are displayed when displaying nested Hash objects. * Makes DohSetMaxHashExpand an externally callable function (for debugger). * ----------------------------------------------------------------------------- */ void Swig_set_max_hash_expand(int count) { SetMaxHashExpand(count); } extern "C" { /* ----------------------------------------------------------------------------- * Swig_get_max_hash_expand() * * Returns how many Hash objects are displayed when displaying nested Hash objects. * Makes DohGetMaxHashExpand an externally callable function (for debugger). * ----------------------------------------------------------------------------- */ int Swig_get_max_hash_expand() { return GetMaxHashExpand(); } /* ----------------------------------------------------------------------------- * Swig_to_doh_string() * * DOH version of Swig_to_string() * ----------------------------------------------------------------------------- */ static String *Swig_to_doh_string(DOH *object, int count) { int old_count = Swig_get_max_hash_expand(); if (count >= 0) Swig_set_max_hash_expand(count); String *debug_string = object ? NewStringf("%s", object) : NewString("NULL"); Swig_set_max_hash_expand(old_count); return debug_string; } /* ----------------------------------------------------------------------------- * Swig_to_doh_string_with_location() * * DOH version of Swig_to_string_with_location() * ----------------------------------------------------------------------------- */ static String *Swig_to_doh_string_with_location(DOH *object, int count) { int old_count = Swig_get_max_hash_expand(); if (count >= 0) Swig_set_max_hash_expand(count); String *debug_string = Swig_stringify_with_location(object); Swig_set_max_hash_expand(old_count); return debug_string; } /* ----------------------------------------------------------------------------- * Swig_to_string() * * Swig debug - return C string representation of any DOH type. * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0 * Note: leaks memory. * ----------------------------------------------------------------------------- */ const char *Swig_to_string(DOH *object, int count) { return Char(Swig_to_doh_string(object, count)); } /* ----------------------------------------------------------------------------- * Swig_to_string_with_location() * * Swig debug - return C string representation of any DOH type, within [] brackets * for Hash and List types, prefixed by line and file information. * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0 * Note: leaks memory. * ----------------------------------------------------------------------------- */ const char *Swig_to_string_with_location(DOH *object, int count) { return Char(Swig_to_doh_string_with_location(object, count)); } /* ----------------------------------------------------------------------------- * Swig_print() * * Swig debug - display string representation of any DOH type. * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0 * ----------------------------------------------------------------------------- */ void Swig_print(DOH *object, int count) { String *output = Swig_to_doh_string(object, count); Printf(stdout, "%s\n", output); Delete(output); } /* ----------------------------------------------------------------------------- * Swig_to_string_with_location() * * Swig debug - display string representation of any DOH type, within [] brackets * for Hash and List types, prefixed by line and file information. * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0 * ----------------------------------------------------------------------------- */ void Swig_print_with_location(DOH *object, int count) { String *output = Swig_to_doh_string_with_location(object, count); Printf(stdout, "%s\n", output); Delete(output); } } // extern "C" swig-4.0.2/Source/Modules/lua.cxx0000644000175000017500000025356013667507523016552 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * lua.cxx * * Lua language module for SWIG. * ----------------------------------------------------------------------------- */ /* NEW LANGUAGE NOTE: * ver001 this is simply a copy of tcl8.cxx, which has been renamed * ver002 all non essential code commented out, program now does virtually nothing it prints to stderr the list of functions to wrap, but does not create the XXX_wrap.c file * ver003 added back top(), still prints the list of fns to stderr but now creates a rather empty XXX_wrap.c with some basic boilerplate code * ver004 very basic version of functionWrapper() also uncommented usage_string() to keep compiler happy this will start producing proper looking code soon (I hope) produced the wrapper code, but without any type conversion (in or out) generates a few warning because of no wrappering does not generate SWIG_init() reason for this is that lua.swg is empty we will need to add code into this to make it work * ver005/6 massive rework, basing work on the pike module instead of tcl (pike module it only 1/3 of the size)(though not as complete) * ver007 added simple type checking * ver008 INPUT, OUTPUT, INOUT typemaps handled (though not all types yet) * ver009 class support: ok for basic types, but methods still TDB (code is VERY messed up & needs to be cleaned) * ver010 Added support for embedded Lua. Try swig -lua -help for more information */ #include "swigmod.h" #include "cparse.h" /**** Diagnostics: With the #define REPORT(), you can change the amount of diagnostics given This helps me search the parse tree & figure out what is going on inside SWIG (because its not clear or documented) */ #define REPORT(T,D) // no info: //#define REPORT(T,D) {Printf(stdout,T"\n");} // only title //#define REPORT(T,D) {Printf(stdout,T" %p\n",n);} // title & pointer //#define REPORT(T,D) {Printf(stdout,T"\n");display_mapping(D);} // the works //#define REPORT(T,D) {Printf(stdout,T"\n");if(D)Swig_print_node(D);} // the works void display_mapping(DOH *d) { if (d == 0 || !DohIsMapping(d)) return; for (Iterator it = First(d); it.item; it = Next(it)) { if (DohIsString(it.item)) Printf(stdout, " %s = %s\n", it.key, it.item); else if (DohIsMapping(it.item)) Printf(stdout, " %s = \n", it.key); else if (DohIsSequence(it.item)) Printf(stdout, " %s = \n", it.key); else Printf(stdout, " %s = \n", it.key); } } extern "C" { static int compareByLen(const DOH *f, const DOH *s) { return Len(s) - Len(f); } } /* NEW LANGUAGE NOTE:*********************************************** most of the default options are handled by SWIG you can add new ones here (though for now I have not bothered) NEW LANGUAGE NOTE:END ************************************************/ static const char *usage = "\ Lua Options (available with -lua)\n\ -elua - Generates LTR compatible wrappers for smaller devices running elua\n\ -eluac - LTR compatible wrappers in \"crass compress\" mode for elua\n\ -elua-emulate - Emulates behaviour of eLua. Useful only for testing.\n\ Incompatible with -elua/-eluac options.\n\ -nomoduleglobal - Do not register the module name as a global variable \n\ but return the module table from calls to require.\n\ -no-old-metatable-bindings\n\ - Disable support for old-style bindings name generation, some\n\ old-style members scheme etc.\n\ -squash-bases - Squashes symbols from all inheritance tree of a given class\n\ into itself. Emulates pre-SWIG3.0 inheritance. Insignificantly\n\ speeds things up, but increases memory consumption.\n\ \n"; static int nomoduleglobal = 0; static int elua_ltr = 0; static int eluac_ltr = 0; static int elua_emulate = 0; static int squash_bases = 0; /* The new metatable bindings were introduced in SWIG 3.0.0. * old_metatable_bindings in v2: * 1. static methods will be put into the scope their respective class * belongs to as well as into the class scope itself. (only for classes without %nspace given) * 2. The layout in elua mode is somewhat different */ static int old_metatable_bindings = 1; static int old_compatible_names = 1; // This flag can temporarily disable backward compatible names generation if old_metatable_bindings is enabled /* NEW LANGUAGE NOTE:*********************************************** To add a new language, you need to derive your class from Language and the overload various virtual functions (more on this as I figure it out) NEW LANGUAGE NOTE:END ************************************************/ class LUA:public Language { private: File *f_begin; File *f_runtime; File *f_header; File *f_wrappers; File *f_init; File *f_initbeforefunc; String *s_luacode; // luacode to be called during init String *module; //name of the module // Parameters for current class. NIL if not parsing class int have_constructor; int have_destructor; String *destructor_action; // This variable holds the name of the current class in Lua. Usually it is // the same as C++ class name, but rename directives can change it. String *proxy_class_name; // This is a so called fully qualified symname - the above proxy class name // prepended with class namespace. If class Lua name is the same as class C++ name, // then it is basically C++ fully qualified name with colons replaced with dots. String *full_proxy_class_name; // All static methods and/or variables are treated as if they were in the // special C++ namespace $(classname).SwigStatic. This is internal mechanism only // and is not visible to user in any manner. This variable holds the name // of such pseudo-namespace a.k.a the result of above expression evaluation String *class_static_nspace; // This variable holds the name of generated C function that acts as a constructor // for the currently parsed class. String *constructor_name; // Many wrappers forward calls to each other, for example staticmembervariableHandler // forwards calls to variableHandler, which, in turn, makes to call to functionWrapper. // In order to access information about whether it is a static member of class or just // a plain old variable, the current array is kept and used as a 'log' of the call stack. enum TState { NO_CPP, VARIABLE, GLOBAL_FUNC, GLOBAL_VAR, MEMBER_FUNC, CONSTRUCTOR, DESTRUCTOR, MEMBER_VAR, STATIC_FUNC, STATIC_VAR, STATIC_CONST, // enums and things like static const int x = 5; ENUM_CONST, // This is only needed for backward compatibility in C mode STATES_COUNT }; bool current[STATES_COUNT]; public: /* --------------------------------------------------------------------- * LUA() * * Initialize member data * --------------------------------------------------------------------- */ LUA(): f_begin(0), f_runtime(0), f_header(0), f_wrappers(0), f_init(0), f_initbeforefunc(0), s_luacode(0), module(0), have_constructor(0), have_destructor(0), destructor_action(0), proxy_class_name(0), full_proxy_class_name(0), class_static_nspace(0), constructor_name(0) { for (int i = 0; i < STATES_COUNT; i++) current[i] = false; } /* NEW LANGUAGE NOTE:*********************************************** This is called to initialise the system & read any command line args most of this is boilerplate code, except the command line args which depends upon what args your code supports NEW LANGUAGE NOTE:END *********************************************** */ /* --------------------------------------------------------------------- * main() * * Parse command line options and initializes variables. * --------------------------------------------------------------------- */ virtual void main(int argc, char *argv[]) { /* Set location of SWIG library */ SWIG_library_directory("lua"); /* Look for certain command line options */ for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { // usage flags fputs(usage, stdout); } else if (strcmp(argv[i], "-nomoduleglobal") == 0) { nomoduleglobal = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-elua") == 0) { elua_ltr = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-eluac") == 0) { eluac_ltr = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-no-old-metatable-bindings") == 0) { Swig_mark_arg(i); old_metatable_bindings = 0; } else if (strcmp(argv[i], "-squash-bases") == 0) { Swig_mark_arg(i); squash_bases = 1; } else if (strcmp(argv[i], "-elua-emulate") == 0) { Swig_mark_arg(i); elua_emulate = 1; } } } if (elua_emulate && (eluac_ltr || elua_ltr )) { Printf(stderr, "Cannot have -elua-emulate with either -eluac or -elua\n"); Swig_arg_error(); } // Set elua_ltr if elua_emulate is requested if(elua_emulate) elua_ltr = 1; /* NEW LANGUAGE NOTE:*********************************************** This is the boilerplate code, setting a few #defines and which lib directory to use the SWIG_library_directory() is also boilerplate code but it always seems to be the first line of code NEW LANGUAGE NOTE:END *********************************************** */ /* Add a symbol to the parser for conditional compilation */ Preprocessor_define("SWIGLUA 1", 0); /* Set language-specific configuration file */ SWIG_config_file("lua.swg"); /* Set typemap language */ SWIG_typemap_lang("lua"); /* Enable overloaded methods support */ allow_overloading(); } /* NEW LANGUAGE NOTE:*********************************************** After calling main, SWIG parses the code to wrap (I believe) then calls top() in this is more boilerplate code to set everything up and a call to Language::top() which begins the code generations by calling the member fns after all that is more boilerplate code to close all down (overall there is virtually nothing here that needs to be edited just use as is) NEW LANGUAGE NOTE:END *********************************************** */ /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { /* Get the module name */ module = Getattr(n, "name"); /* Get the output file name */ String *outfile = Getattr(n, "outfile"); /* Open the output file */ f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_initbeforefunc = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("initbeforefunc", f_initbeforefunc); s_luacode = NewString(""); Swig_register_filebyname("luacode", s_luacode); current[NO_CPP] = true; /* Standard stuff for the SWIG runtime section */ Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGLUA\n#define SWIGLUA\n#endif\n\n"); emitLuaFlavor(f_runtime); if (nomoduleglobal) { Printf(f_runtime, "#define SWIG_LUA_NO_MODULE_GLOBAL\n"); } else { Printf(f_runtime, "#define SWIG_LUA_MODULE_GLOBAL\n"); } if (squash_bases) Printf(f_runtime, "#define SWIG_LUA_SQUASH_BASES\n"); // if (NoInclude) { // Printf(f_runtime, "#define SWIG_NOINCLUDE\n"); // } Printf(f_runtime, "\n"); //String *init_name = NewStringf("%(title)s_Init", module); //Printf(f_header, "#define SWIG_init %s\n", init_name); //Printf(f_header, "#define SWIG_name \"%s\"\n", module); /* SWIG_import is a special function name for importing within Lua5.1 */ //Printf(f_header, "#define SWIG_import luaopen_%s\n\n", module); Printf(f_header, "#define SWIG_name \"%s\"\n", module); Printf(f_header, "#define SWIG_init luaopen_%s\n", module); Printf(f_header, "#define SWIG_init_user luaopen_%s_user\n\n", module); Printf(f_header, "#define SWIG_LUACODE luaopen_%s_luacode\n", module); Printf(f_wrappers, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); /* %init code inclusion, effectively in the SWIG_init function */ Printf(f_init, "void SWIG_init_user(lua_State* L)\n{\n"); Language::top(n); Printf(f_init, "/* exec Lua code if applicable */\nSWIG_Lua_dostring(L,SWIG_LUACODE);\n"); Printf(f_init, "}\n"); // Done. Close up the module & write to the wrappers closeNamespaces(f_wrappers); Printf(f_wrappers, "#ifdef __cplusplus\n}\n#endif\n"); SwigType_emit_type_table(f_runtime, f_wrappers); /* NEW LANGUAGE NOTE:*********************************************** this basically combines several of the strings together and then writes it all to a file NEW LANGUAGE NOTE:END *********************************************** */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Dump(f_initbeforefunc, f_begin); /* for the Lua code it needs to be properly escaped to be added into the C/C++ code */ escapeCode(s_luacode); Printf(f_begin, "const char* SWIG_LUACODE=\n \"%s\";\n\n", s_luacode); Wrapper_pretty_print(f_init, f_begin); /* Close all of the files */ Delete(s_luacode); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_initbeforefunc); Delete(f_runtime); Delete(f_begin); /* Done */ return SWIG_OK; } /* ------------------------------------------------------------ * importDirective() * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { return Language::importDirective(n); } /* ------------------------------------------------------------ * cDeclaration() * It copies sym:name to lua:name to preserve its original value * ------------------------------------------------------------ */ virtual int cDeclaration(Node *n) { // class 'Language' is messing with symname in a really heavy way. // Although documentation states that sym:name is a name in // the target language space, it is not true. sym:name and // its derivatives are used in various places, including // behind-the-scene C code generation. The best way is not to // touch it at all. // But we need to know what was the name of function/variable // etc that user desired, that's why we store correct symname // as lua:name String *symname = Getattr(n, "sym:name"); if (symname) Setattr(n, "lua:name", symname); return Language::cDeclaration(n); } virtual int constructorDeclaration(Node *n) { Setattr(n, "lua:name", Getattr(n, "sym:name")); return Language::constructorDeclaration(n); } virtual int destructorDeclaration(Node *n) { Setattr(n, "lua:name", Getattr(n, "sym:name")); return Language::destructorDeclaration(n); } /* NEW LANGUAGE NOTE:*********************************************** This is it! you get this one right, and most of your work is done but its going to take some file to get it working right quite a bit of this is generally boilerplate code (or stuff I don't understand) that which matters will have extra added comments NEW LANGUAGE NOTE:END *********************************************** */ /* --------------------------------------------------------------------- * functionWrapper() * * Create a function declaration and register it with the interpreter. * --------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- * registerMethod() * * Determines wrap name of a method, its scope etc and calls * registerMethod overload with correct arguments * Overloaded variant adds method to the "methods" array of specified lua scope/class * ---------------------------------------------------------------------- */ void registerMethod(Node *n, bool overwrite = false, String *overwriteLuaScope = 0) { String *symname = Getattr(n, "sym:name"); assert(symname); if (Getattr(n, "sym:nextSibling")) return; // Lua scope. It is not symbol NSpace, it is the actual key to retrieve getCArraysHash. String *luaScope = luaCurrentSymbolNSpace(); if (overwrite) luaScope = overwriteLuaScope; String *wrapname = 0; String *mrename; if (current[NO_CPP] || !getCurrentClass()) { mrename = symname; } else { assert(!current[NO_CPP]); if (current[STATIC_FUNC] || current[MEMBER_FUNC]) { mrename = Swig_name_member(getNSpace(), getClassPrefix(), symname); } else { mrename = symname; } } wrapname = Swig_name_wrapper(mrename); registerMethod(n, wrapname, luaScope); } /* ----------------------------------------------------------------------- * registerMethod() * * Add method to the "methods" C array of given namespace/class * ---------------------------------------------------------------------- */ void registerMethod(Node *n, String* wname, String *luaScope) { assert(n); Hash *nspaceHash = getCArraysHash(luaScope); String *s_ns_methods_tab = Getattr(nspaceHash, "methods"); String *lua_name = Getattr(n, "lua:name"); if (elua_ltr || eluac_ltr) Printv(s_ns_methods_tab, tab4, "{LSTRKEY(\"", lua_name, "\")", ", LFUNCVAL(", wname, ")", "},\n", NIL); else Printv(s_ns_methods_tab, tab4, "{ \"", lua_name, "\", ", wname, "},\n", NIL); // Add to the metatable if method starts with '__' const char * tn = Char(lua_name); if (tn[0]=='_' && tn[1] == '_' && !eluac_ltr) { String *metatable_tab = Getattr(nspaceHash, "metatable"); assert(metatable_tab); if (elua_ltr) Printv(metatable_tab, tab4, "{LSTRKEY(\"", lua_name, "\")", ", LFUNCVAL(", wname, ")", "},\n", NIL); else Printv(metatable_tab, tab4, "{ \"", lua_name, "\", ", wname, "},\n", NIL); } } virtual int functionWrapper(Node *n) { REPORT("functionWrapper", n); String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *lua_name = Getattr(n, "lua:name"); assert(lua_name); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; String *tm; int i; //Printf(stdout,"functionWrapper %s %s %d\n",name,iname,current); String *overname = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!luaAddSymbol(lua_name, n)) { return SWIG_ERROR; } } /* NEW LANGUAGE NOTE:*********************************************** the wrapper object holds all the wrapper code we need to add a couple of local variables NEW LANGUAGE NOTE:END *********************************************** */ Wrapper *f = NewWrapper(); Wrapper_add_local(f, "SWIG_arg", "int SWIG_arg = 0"); String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } if (current[CONSTRUCTOR]) { if (constructor_name != 0) Delete(constructor_name); constructor_name = Copy(wname); } /* NEW LANGUAGE NOTE:*********************************************** the format of a lua fn is: static int wrap_XXX(lua_State* L){...} this line adds this into the wrapper code NEW LANGUAGE NOTE:END *********************************************** */ Printv(f->def, "static int ", wname, "(lua_State* L) {", NIL); /* NEW LANGUAGE NOTE:*********************************************** this prints the list of args, eg for a C fn int gcd(int x,int y); it will print int arg1; int arg2; NEW LANGUAGE NOTE:END *********************************************** */ /* Write code to extract function parameters. */ emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ int num_arguments = emit_num_arguments(l); int num_required = emit_num_required(l); int varargs = emit_isvarargs(l); // Check if we have to ignore arguments that are passed by LUA. // Needed for unary minus, where lua passes two arguments and // we have to ignore the second. int args_to_ignore = 0; if (Getattr(n, "lua:ignore_args")) { args_to_ignore = GetInt(n, "lua:ignore_args"); } /* NEW LANGUAGE NOTE:*********************************************** from here on in, it gets rather hairy this is the code to convert from the scripting language to C/C++ some of the stuff will refer to the typemaps code written in your swig file (lua.swg), and some is done in the code here I suppose you could do all the conversion in C, but it would be a nightmare to do NEW LANGUAGE NOTE:END *********************************************** */ /* Generate code for argument marshalling */ // String *description = NewString(""); /* NEW LANGUAGE NOTE:*********************************************** argument_check is a new feature I added to check types of arguments: eg for int gcd(int,int) I want to check that arg1 & arg2 really are integers NEW LANGUAGE NOTE:END *********************************************** */ String *argument_check = NewString(""); String *argument_parse = NewString(""); String *checkfn = NULL; char source[64]; Printf(argument_check, "SWIG_check_num_args(\"%s\",%d,%d)\n", Swig_name_str(n), num_required + args_to_ignore, num_arguments + args_to_ignore); for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); /* Look for an input typemap */ sprintf(source, "%d", i + 1); if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } /* NEW LANGUAGE NOTE:*********************************************** look for a 'checkfn' typemap this an additional parameter added to the in typemap if found the type will be tested for this will result in code either in the argument_check or argument_parse string NEW LANGUAGE NOTE:END *********************************************** */ if ((checkfn = Getattr(p, "tmap:in:checkfn"))) { if (i < num_required) { Printf(argument_check, "if(!%s(L,%s))", checkfn, source); } else { Printf(argument_check, "if(lua_gettop(L)>=%s && !%s(L,%s))", source, checkfn, source); } Printf(argument_check, " SWIG_fail_arg(\"%s\",%s,\"%s\");\n", Swig_name_str(n), source, SwigType_str(pt, 0)); } /* NEW LANGUAGE NOTE:*********************************************** lua states the number of arguments passed to a function using the fn lua_gettop() we can use this to deal with default arguments NEW LANGUAGE NOTE:END *********************************************** */ if (i < num_required) { Printf(argument_parse, "%s\n", tm); } else { Printf(argument_parse, "if(lua_gettop(L)>=%s){%s}\n", source, tm); } p = Getattr(p, "tmap:in:next"); continue; } else { /* NEW LANGUAGE NOTE:*********************************************** // why is this code not called when I don't have a typemap? // instead of giving a warning, no code is generated NEW LANGUAGE NOTE:END *********************************************** */ Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } // add all argcheck code Printv(f->code, argument_check, argument_parse, NIL); /* Check for trailing varargs */ if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$input", "varargs"); Printv(f->code, tm, "\n", NIL); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ String *outarg = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { // // managing the number of returning variables // if (numoutputs=Getattr(p,"tmap:argout:numoutputs")){ // int i=GetInt(p,"tmap:argout:numoutputs"); // printf("got argout:numoutputs of %d\n",i); // returnval+=GetInt(p,"tmap:argout:numoutputs"); // } // else returnval++; Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", Swig_cresult_name()); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Remember C name of the wrapping function Setattr(n, "wrap:name", wname); /* Emit the function call */ String *actioncode = emit_action(n); /* NEW LANGUAGE NOTE:*********************************************** FIXME: returns 1 if there is a void return type this is because there is a typemap for void NEW LANGUAGE NOTE:END *********************************************** */ // Return value if necessary if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { // managing the number of returning variables // if (numoutputs=Getattr(tm,"numoutputs")){ // int i=GetInt(tm,"numoutputs"); // printf("return numoutputs %d\n",i); // returnval+=GetInt(tm,"numoutputs"); // } // else returnval++; Replaceall(tm, "$source", Swig_cresult_name()); if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "1"); } else { Replaceall(tm, "$owner", "0"); } Printf(f->code, "%s\n", tm); // returnval++; } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } /* Close the function */ Printv(f->code, "return SWIG_arg;\n", NIL); // add the failure cleanup code: Printv(f->code, "\nif(0) SWIG_fail;\n", NIL); Printv(f->code, "\nfail:\n", NIL); Printv(f->code, "$cleanup", "lua_error(L);\n", NIL); Printv(f->code, "return SWIG_arg;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Replaceall(f->code, "$result", Swig_cresult_name()); /* Dump the function out */ /* in Lua we will not emit the destructor as a wrapper function, Lua will automatically call the destructor when the object is free'd However: you cannot just skip this function as it will not emit any custom destructor (using %extend), as you need to call emit_action() Therefore we go though the whole function, but do not write the code into the wrapper */ if (!current[DESTRUCTOR]) { Wrapper_print(f, f_wrappers); } /* NEW LANGUAGE NOTE:*********************************************** register the function in SWIG different language mappings seem to use different ideas NEW LANGUAGE NOTE:END *********************************************** */ /* Now register the function with the interpreter. */ int result = SWIG_OK; if (Getattr(n, "sym:overloaded")) { if (!Getattr(n, "sym:nextSibling")) { result = dispatchFunction(n); } } Delete(argument_check); Delete(argument_parse); Delete(cleanup); Delete(outarg); // Delete(description); DelWrapper(f); return result; } /* ------------------------------------------------------------ * dispatchFunction() * * Emit overloading dispatch function * ------------------------------------------------------------ */ /* NEW LANGUAGE NOTE:*********************************************** This is an extra function used for overloading of functions it checks the args & then calls the relevant fn most of the real work in again typemaps: look for %typecheck(SWIG_TYPECHECK_*) in the .swg file NEW LANGUAGE NOTE:END *********************************************** */ int dispatchFunction(Node *n) { //REPORT("dispatchFunction", n); /* Last node in overloaded chain */ int maxargs; String *tmp = NewString(""); String *dispatch = Swig_overload_dispatch(n, "return %s(L);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *lua_name = Getattr(n, "lua:name"); assert(lua_name); String *wname = Swig_name_wrapper(symname); //Printf(stdout,"Swig_overload_dispatch %s %s '%s' %d\n",symname,wname,dispatch,maxargs); if (!luaAddSymbol(lua_name, n)) { DelWrapper(f); Delete(dispatch); Delete(tmp); return SWIG_ERROR; } Printv(f->def, "static int ", wname, "(lua_State* L) {", NIL); Wrapper_add_local(f, "argc", "int argc"); Printf(tmp, "int argv[%d]={1", maxargs + 1); for (int i = 1; i <= maxargs; i++) { Printf(tmp, ",%d", i + 1); } Printf(tmp, "}"); Wrapper_add_local(f, "argv", tmp); Printf(f->code, "argc = lua_gettop(L);\n"); Replaceall(dispatch, "$args", "self,args"); Printv(f->code, dispatch, "\n", NIL); Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up String *protoTypes = NewString(""); do { String *fulldecl = Swig_name_decl(sibl); Printf(protoTypes, "\n\" %s\\n\"", fulldecl); Delete(fulldecl); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Printf(f->code, "SWIG_Lua_pusherrstring(L,\"Wrong arguments for overloaded function '%s'\\n\"\n" "\" Possible C/C++ prototypes are:\\n\"%s);\n", symname, protoTypes); Delete(protoTypes); Printf(f->code, "lua_error(L);return 0;\n"); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); // Remember C name of the wrapping function Setattr(n, "wrap:name", wname); if (current[CONSTRUCTOR]) { if (constructor_name != 0) Delete(constructor_name); constructor_name = Copy(wname); } DelWrapper(f); Delete(dispatch); Delete(tmp); return SWIG_OK; } /* ------------------------------------------------------------ * Add variable to "attributes" C arrays of given namespace or class. * Input is node. Based on the state of "current" array it determines * the name of the getter function, setter function etc and calls * registerVariable overload with necessary params. * Lua scope could be overwritten. (Used only for backward compatibility) * ------------------------------------------------------------ */ void registerVariable(Node *n, bool overwrite = false, String *overwriteLuaScope = 0) { int assignable = is_assignable(n); String *symname = Getattr(n, "sym:name"); assert(symname); // Lua scope. It is not symbol NSpace, it is the actual key to retrieve getCArraysHash. String *luaScope = luaCurrentSymbolNSpace(); if (overwrite) luaScope = overwriteLuaScope; // Getter and setter String *getName = 0; String *setName = 0; String *mrename = 0; if (current[NO_CPP] || !getCurrentClass()) { // Global variable getName = Swig_name_get(getNSpace(), symname); if (assignable) setName = Swig_name_set(getNSpace(), symname); } else { assert(!current[NO_CPP]); if (current[STATIC_VAR] ) { mrename = Swig_name_member(getNSpace(), getClassPrefix(), symname); getName = Swig_name_get(0, mrename); if (assignable) setName = Swig_name_set(0, mrename); } else if (current[MEMBER_VAR]) { mrename = Swig_name_member(0, getClassPrefix(), symname); getName = Swig_name_get(getNSpace(), mrename); if (assignable) setName = Swig_name_set(getNSpace(), mrename); } else { assert(false); } } getName = Swig_name_wrapper(getName); if (setName) setName = Swig_name_wrapper(setName); registerVariable(luaScope, n, getName, setName); } /* ------------------------------------------------------------ * registerVariable() * * Add variable to the "attributes" (or "get"/"set" in * case of elua_ltr) C arrays of given namespace or class * ------------------------------------------------------------ */ void registerVariable(String *lua_nspace_or_class_name, Node *n, String *getName, String *setName) { String *unassignable = NewString("SWIG_Lua_set_immutable"); if (setName == 0 || GetFlag(n, "feature:immutable")) { setName = unassignable; } Hash *nspaceHash = getCArraysHash(lua_nspace_or_class_name); String *s_ns_methods_tab = Getattr(nspaceHash, "methods"); String *s_ns_var_tab = Getattr(nspaceHash, "attributes"); String *lua_name = Getattr(n, "lua:name"); if (elua_ltr) { String *s_ns_dot_get = Getattr(nspaceHash, "get"); String *s_ns_dot_set = Getattr(nspaceHash, "set"); Printf(s_ns_dot_get, "%s{LSTRKEY(\"%s\"), LFUNCVAL(%s)},\n", tab4, lua_name, getName); Printf(s_ns_dot_set, "%s{LSTRKEY(\"%s\"), LFUNCVAL(%s)},\n", tab4, lua_name, setName); } else if (eluac_ltr) { Printv(s_ns_methods_tab, tab4, "{LSTRKEY(\"", lua_name, "_get", "\")", ", LFUNCVAL(", getName, ")", "},\n", NIL); Printv(s_ns_methods_tab, tab4, "{LSTRKEY(\"", lua_name, "_set", "\")", ", LFUNCVAL(", setName, ")", "},\n", NIL); } else { Printf(s_ns_var_tab, "%s{ \"%s\", %s, %s },\n", tab4, lua_name, getName, setName); } } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { /* NEW LANGUAGE NOTE:*********************************************** Language::variableWrapper(n) will generate two wrapper fns Foo_get & Foo_set by calling functionWrapper() so we will just add these into the variable lists ideally we should not have registered these as functions, only WRT this variable will look into this later. NEW LANGUAGE NOTE:END *********************************************** */ // REPORT("variableWrapper", n); String *lua_name = Getattr(n, "lua:name"); assert(lua_name); current[VARIABLE] = true; // let SWIG generate the wrappers int result = Language::variableWrapper(n); // It is impossible to use registerVariable, because sym:name of the Node is currently // in an undefined state - the callees of this function may have modified it. // registerVariable should be used from respective callees.* current[VARIABLE] = false; return result; } /* ------------------------------------------------------------ * Add constant to appropriate C array. constantRecord is an array record. * Actually, in current implementation it is resolved consttab typemap * ------------------------------------------------------------ */ void registerConstant(String *nspace, String *constantRecord) { Hash *nspaceHash = getCArraysHash(nspace); String *s_const_tab = 0; if (eluac_ltr || elua_ltr) // In elua everything goes to "methods" tab s_const_tab = Getattr(nspaceHash, "methods"); else s_const_tab = Getattr(nspaceHash, "constants"); assert(s_const_tab); Printf(s_const_tab, " %s,\n", constantRecord); if ((eluac_ltr || elua_ltr) && old_metatable_bindings) { s_const_tab = Getattr(nspaceHash, "constants"); assert(s_const_tab); Printf(s_const_tab, " %s,\n", constantRecord); } } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { REPORT("constantWrapper", n); String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *lua_name = Getattr(n, "lua:name"); if (lua_name == 0) lua_name = iname; String *nsname = Copy(iname); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; String *lua_name_v2 = 0; String *tm_v2 = 0; String *iname_v2 = 0; Node *n_v2 = 0; if (!luaAddSymbol(lua_name, n)) return SWIG_ERROR; Swig_save("lua_constantMember", n, "sym:name", NIL); Setattr(n, "sym:name", lua_name); /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); Printf(f_wrappers, "static %s = %s;\n", SwigType_str(type, wname), value); value = Char(wname); } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", lua_name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); registerConstant(luaCurrentSymbolNSpace(), tm); } else if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", lua_name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); Printf(f_init, "%s\n", tm); } else { Delete(nsname); nsname = 0; Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); Swig_restore(n); return SWIG_NOWRAP; } bool make_v2_compatible = old_metatable_bindings && getCurrentClass() && old_compatible_names; if (make_v2_compatible) { // Don't do anything for enums in C mode - they are already // wrapped correctly if (CPlusPlus || !current[ENUM_CONST]) { lua_name_v2 = Swig_name_member(0, proxy_class_name, lua_name); iname_v2 = Swig_name_member(0, proxy_class_name, iname); n_v2 = Copy(n); if (!luaAddSymbol(iname_v2, n, getNSpace())) { Swig_restore(n); return SWIG_ERROR; } Setattr(n_v2, "sym:name", lua_name_v2); tm_v2 = Swig_typemap_lookup("consttab", n_v2, name, 0); if (tm_v2) { Replaceall(tm_v2, "$source", value); Replaceall(tm_v2, "$target", lua_name_v2); Replaceall(tm_v2, "$value", value); Replaceall(tm_v2, "$nsname", nsname); registerConstant(getNSpace(), tm_v2); } else { tm_v2 = Swig_typemap_lookup("constcode", n_v2, name, 0); if (!tm_v2) { // This can't be. assert(false); Swig_restore(n); return SWIG_ERROR; } Replaceall(tm_v2, "$source", value); Replaceall(tm_v2, "$target", lua_name_v2); Replaceall(tm_v2, "$value", value); Replaceall(tm_v2, "$nsname", nsname); Printf(f_init, "%s\n", tm_v2); } Delete(n_v2); } } Swig_restore(n); Delete(nsname); return SWIG_OK; } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { // REPORT("nativeWrapper", n); String *symname = Getattr(n, "sym:name"); String *wrapname = Getattr(n, "wrap:name"); if (!luaAddSymbol(wrapname, n)) return SWIG_ERROR; Hash *nspaceHash = getCArraysHash(getNSpace()); String *s_ns_methods_tab = Getattr(nspaceHash, "methods"); Printv(s_ns_methods_tab, tab4, "{ \"", symname, "\",", wrapname, "},\n", NIL); // return Language::nativeWrapper(n); // this does nothing... return SWIG_OK; } /* ------------------------------------------------------------ * enumDeclaration() * ------------------------------------------------------------ */ virtual int enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; current[STATIC_CONST] = true; current[ENUM_CONST] = true; // There is some slightly specific behaviour with enums. Basically, // their NSpace may be tracked separately. The code below tries to work around // this issue to some degree. // The idea is the same as in classHandler - to drop old names generation if // enum is in class in namespace. const int old_compatible_names_saved = old_compatible_names; if (getNSpace() || ( Getattr(n, "sym:nspace") != 0 && Len(Getattr(n, "sym:nspace")) > 0 ) ) { old_compatible_names = 0; } int result = Language::enumDeclaration(n); current[STATIC_CONST] = false; current[ENUM_CONST] = false; old_compatible_names = old_compatible_names_saved; return result; } /* ------------------------------------------------------------ * enumvalueDeclaration() * ------------------------------------------------------------ */ virtual int enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "?value", "*sym:name", NIL); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); String *tmpValue; Node *parent = parentNode(n); if (value) tmpValue = NewString(value); else tmpValue = NewString(name); Setattr(n, "value", tmpValue); Setattr(n, "name", tmpValue); /* for wrapping of enums in a namespace when emit_action is used */ if (GetFlag(parent, "scopedenum")) { symname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); Setattr(n, "sym:name", symname); Delete(symname); } int result = constantWrapper(n); Delete(tmpValue); Swig_restore(n); return result; } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { return Language::classDeclaration(n); } /* ------------------------------------------------------------ * Helper function that adds record to appropriate C arrays * ------------------------------------------------------------ */ void registerClass(String *scope, String *wrap_class) { assert(wrap_class); Hash *nspaceHash = getCArraysHash(scope); String *ns_classes = Getattr(nspaceHash, "classes"); Printv(ns_classes, "&", wrap_class, ",\n", NIL); if (elua_ltr || eluac_ltr) { String *ns_methods = Getattr(nspaceHash, "methods"); Hash *class_hash = getCArraysHash(class_static_nspace); assert(class_hash); String *cls_methods = Getattr(class_hash, "methods:name"); assert(cls_methods); Printv(ns_methods, tab4, "{LSTRKEY(\"", proxy_class_name, "\")", ", LROVAL(", cls_methods, ")", "},\n", NIL); } } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { //REPORT("classHandler", n); String *mangled_full_proxy_class_name = 0; String *destructor_name = 0; String *nspace = getNSpace(); constructor_name = 0; have_constructor = 0; have_destructor = 0; destructor_action = 0; assert(class_static_nspace == 0); assert(full_proxy_class_name == 0); assert(proxy_class_name == 0); current[NO_CPP] = false; proxy_class_name = Getattr(n, "sym:name"); // We have to enforce nspace here, because technically we are already // inside class parsing (getCurrentClass != 0), but we should register // class in its parent namespace if (!luaAddSymbol(proxy_class_name, n, nspace)) return SWIG_ERROR; if (nspace == 0) full_proxy_class_name = NewStringf("%s", proxy_class_name); else full_proxy_class_name = NewStringf("%s.%s", nspace, proxy_class_name); assert(full_proxy_class_name); mangled_full_proxy_class_name = Swig_name_mangle(full_proxy_class_name); SwigType *t = Copy(Getattr(n, "name")); SwigType *fr_t = SwigType_typedef_resolve_all(t); /* Create fully resolved type */ SwigType *t_tmp = 0; t_tmp = SwigType_typedef_qualified(fr_t); // Temporal variable Delete(fr_t); fr_t = SwigType_strip_qualifiers(t_tmp); String *mangled_fr_t = 0; mangled_fr_t = SwigType_manglestr(fr_t); // not sure exactly how this works, // but tcl has a static hashtable of all classes emitted and then only emits code for them once. // this fixes issues in test suites: template_default2 & template_specialization // * if i understand correctly, this is a bug. // * consider effect on template_specialization_defarg static Hash *emitted = NewHash(); if (GetFlag(emitted, mangled_fr_t)) { full_proxy_class_name = 0; proxy_class_name = 0; return SWIG_NOWRAP; } SetFlag(emitted, mangled_fr_t); // We treat class T as both 'class' and 'namespace'. All static members, attributes // and constants are considered part of namespace T, all members - part of the 'class' // Now, here is a trick. Static methods, attributes and non-static methods and attributes // are described with same structures - swig_lua_attribute/swig_lua_method. Instead of calling // getCArraysHash(class name) to initialize things for static methods/attributes and then // manually doing same initialization for non-static methods, we call getCArraysHash 2 times: // 1) With name "class name" + "." + "SwigStatic" to initialize static things // 2) With "class name" to initialize non-static things Hash *instance_cls = getCArraysHash(full_proxy_class_name, false); assert(instance_cls); String *s_attr_tab_name = Getattr(instance_cls, "attributes:name"); String *s_methods_tab_name = Getattr(instance_cls, "methods:name"); SetFlag(instance_cls, "lua:no_namespaces"); SetFlag(instance_cls, "lua:no_classes"); SetFlag(instance_cls, "lua:class_instance"); /* There is no use for "constants", "classes" and "namespaces" arrays. * All constants are considered part of static part of class. */ class_static_nspace = NewStringf("%s%sSwigStatic", full_proxy_class_name, NSPACE_SEPARATOR); Hash *static_cls = getCArraysHash(class_static_nspace, false); assert(static_cls); SetFlag(static_cls, "lua:no_namespaces"); SetFlag(static_cls, "lua:class_static"); // Notifying instance_cls and static_cls hashes about each other Setattr(instance_cls, "lua:class_instance:static_hash", static_cls); Setattr(static_cls, "lua:class_static:instance_hash", instance_cls); const int old_compatible_names_saved = old_compatible_names; // If class has %nspace enabled, then generation of backward compatible names // should be disabled if (getNSpace()) { old_compatible_names = 0; } /* There is no use for "classes" and "namespaces" arrays. Subclasses are not supported * by SWIG and namespaces couldn't be nested inside classes (C++ Standard) */ // Generate normal wrappers Language::classHandler(n); old_compatible_names = old_compatible_names_saved; SwigType_add_pointer(t); // Catch all: eg. a class with only static functions and/or variables will not have 'remembered' String *wrap_class_name = Swig_name_wrapper(NewStringf("class_%s", mangled_full_proxy_class_name)); String *wrap_class = NewStringf("&%s", wrap_class_name); SwigType_remember_clientdata(t, wrap_class); String *rt = Copy(getClassType()); SwigType_add_pointer(rt); // Adding class to appropriate namespace registerClass(nspace, wrap_class_name); Hash *nspaceHash = getCArraysHash(nspace); // Register the class structure with the type checker // Printf(f_init,"SWIG_TypeClientData(SWIGTYPE%s, (void *) &_wrap_class_%s);\n", SwigType_manglestr(t), mangled_full_proxy_class_name); // emit a function to be called to delete the object if (have_destructor) { destructor_name = NewStringf("swig_delete_%s", mangled_full_proxy_class_name); Printv(f_wrappers, "static void ", destructor_name, "(void *obj) {\n", NIL); if (destructor_action) { Printv(f_wrappers, SwigType_str(rt, "arg1"), " = (", SwigType_str(rt, 0), ") obj;\n", NIL); Printv(f_wrappers, destructor_action, "\n", NIL); } else { if (CPlusPlus) { Printv(f_wrappers, " delete (", SwigType_str(rt, 0), ") obj;\n", NIL); } else { Printv(f_wrappers, " free((char *) obj);\n", NIL); } } Printf(f_wrappers, "}\n"); } // Wrap constructor wrapper into one more proxy function. It will be used as class namespace __call method, thus // allowing both // Module.ClassName.StaticMethod to access static method/variable/constant // Module.ClassName() to create new object if (have_constructor) { assert(constructor_name); String *constructor_proxy_name = NewStringf("_proxy_%s", constructor_name); Printv(f_wrappers, "static int ", constructor_proxy_name, "(lua_State *L) {\n", NIL); Printv(f_wrappers, tab4, "assert(lua_istable(L,1));\n", tab4, "lua_pushcfunction(L,", constructor_name, ");\n", tab4, "assert(!lua_isnil(L,-1));\n", tab4, "lua_replace(L,1); /* replace our table with real constructor */\n", tab4, "lua_call(L,lua_gettop(L)-1,1);\n", tab4, "return 1;\n}\n", NIL); Delete(constructor_name); constructor_name = constructor_proxy_name; if (elua_ltr) { String *static_cls_metatable_tab = Getattr(static_cls, "metatable"); assert(static_cls_metatable_tab); Printf(static_cls_metatable_tab, " {LSTRKEY(\"__call\"), LFUNCVAL(%s)},\n", constructor_name); } else if (eluac_ltr) { String *ns_methods_tab = Getattr(nspaceHash, "methods"); assert(ns_methods_tab); Printv(ns_methods_tab, tab4, "{LSTRKEY(\"", "new_", proxy_class_name, "\")", ", LFUNCVAL(", constructor_name, ")", "},\n", NIL); } } if (have_destructor) { if (eluac_ltr) { String *ns_methods_tab = Getattr(nspaceHash, "methods"); assert(ns_methods_tab); Printv(ns_methods_tab, tab4, "{LSTRKEY(\"", "free_", mangled_full_proxy_class_name, "\")", ", LFUNCVAL(", destructor_name, ")", "},\n", NIL); } } closeCArraysHash(full_proxy_class_name, f_wrappers); closeCArraysHash(class_static_nspace, f_wrappers); // Handle inheritance // note: with the idea of class hierarchies spread over multiple modules // cf test-suite: imports.i // it is not possible to just add the pointers to the base classes to the code // (as sometimes these classes are not present) // therefore we instead hold the name of the base class and a null pointer // at runtime: we can query the swig type manager & see if the class exists // if so, we can get the pointer to the base class & replace the null pointer // if the type does not exist, then we cannot... String *base_class = NewString(""); String *base_class_names = NewString(""); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; int index = 0; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "name"); if ((!bname) || GetFlag(b.item, "feature:ignore") || (!Getattr(b.item, "module"))) { b = Next(b); continue; } // stores a null pointer & the name Printf(base_class, "0,"); Printf(base_class_names, "\"%s *\",", SwigType_namestr(bname)); b = Next(b); index++; } } // First, print class static part printCArraysDefinition(class_static_nspace, proxy_class_name, f_wrappers); assert(mangled_full_proxy_class_name); assert(base_class); assert(base_class_names); assert(proxy_class_name); assert(full_proxy_class_name); // Then print class instance part Printv(f_wrappers, "static swig_lua_class *swig_", mangled_full_proxy_class_name, "_bases[] = {", base_class, "0};\n", NIL); Delete(base_class); Printv(f_wrappers, "static const char *swig_", mangled_full_proxy_class_name, "_base_names[] = {", base_class_names, "0};\n", NIL); Delete(base_class_names); Printv(f_wrappers, "static swig_lua_class _wrap_class_", mangled_full_proxy_class_name, " = { \"", proxy_class_name, "\", \"", full_proxy_class_name, "\", &SWIGTYPE", SwigType_manglestr(t), ",", NIL); if (have_constructor) { Printv(f_wrappers, constructor_name, NIL); Delete(constructor_name); constructor_name = 0; } else { Printf(f_wrappers, "0"); } if (have_destructor) { Printv(f_wrappers, ", ", destructor_name, NIL); } else { Printf(f_wrappers, ",0"); } Printf(f_wrappers, ", %s, %s, &%s", s_methods_tab_name, s_attr_tab_name, Getattr(static_cls, "cname")); if (!eluac_ltr) { Printf(f_wrappers, ", %s", Getattr(instance_cls,"metatable:name")); } else Printf(f_wrappers, ", 0"); Printf(f_wrappers, ", swig_%s_bases, swig_%s_base_names };\n\n", mangled_full_proxy_class_name, mangled_full_proxy_class_name); current[NO_CPP] = true; Delete(class_static_nspace); class_static_nspace = 0; Delete(mangled_full_proxy_class_name); mangled_full_proxy_class_name = 0; Delete(destructor_name); destructor_name = 0; Delete(full_proxy_class_name); full_proxy_class_name = 0; proxy_class_name = 0; return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { String *symname = GetChar(n, "sym:name"); //Printf(stdout,"memberfunctionHandler %s %s\n",name,iname); // Special case unary minus: LUA passes two parameters for the // wrapper function while we want only one. Tell our // functionWrapper to ignore a parameter. if (Cmp(symname, "__unm") == 0) { //Printf(stdout, "unary minus: ignore one argument\n"); SetInt(n, "lua:ignore_args", 1); } current[MEMBER_FUNC] = true; Language::memberfunctionHandler(n); registerMethod(n); current[MEMBER_FUNC] = false; return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { // REPORT("membervariableHandler",n); current[MEMBER_VAR] = true; Language::membervariableHandler(n); registerVariable(n); current[MEMBER_VAR] = false; return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * * Method for adding C++ member constructor * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { // REPORT("constructorHandler", n); current[CONSTRUCTOR] = true; Language::constructorHandler(n); current[CONSTRUCTOR] = false; //constructor_name = NewString(Getattr(n, "sym:name")); have_constructor = 1; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { REPORT("destructorHandler", n); current[DESTRUCTOR] = true; Language::destructorHandler(n); current[DESTRUCTOR] = false; have_destructor = 1; destructor_action = Getattr(n, "wrap:action"); return SWIG_OK; } /* ---------------------------------------------------------------------- * globalfunctionHandler() * * It can be called: * 1. Usual C/C++ global function. * 2. During class parsing for functions declared/defined as friend * 3. During class parsing from staticmemberfunctionHandler * ---------------------------------------------------------------------- */ virtual int globalfunctionHandler(Node *n) { bool oldVal = current[NO_CPP]; if (!current[STATIC_FUNC]) // If static function, don't switch to NO_CPP current[NO_CPP] = true; const int result = Language::globalfunctionHandler(n); if (!current[STATIC_FUNC]) // Register only if not called from static function handler registerMethod(n); current[NO_CPP] = oldVal; return result; } /* ---------------------------------------------------------------------- * globalvariableHandler() * * Sets "current" array correctly * ---------------------------------------------------------------------- */ virtual int globalvariableHandler(Node *n) { bool oldVal = current[NO_CPP]; current[GLOBAL_VAR] = true; current[NO_CPP] = true; const int result = Language::globalvariableHandler(n); registerVariable(n); current[GLOBAL_VAR] = false; current[NO_CPP] = oldVal; return result; } /* ----------------------------------------------------------------------- * staticmemberfunctionHandler() * * Wrap a static C++ function * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { REPORT("staticmemberfunctionHandler", n); current[STATIC_FUNC] = true; const int result = Language::staticmemberfunctionHandler(n); registerMethod(n); if (old_metatable_bindings && result == SWIG_OK && old_compatible_names) { Swig_require("lua_staticmemberfunctionHandler", n, "*lua:name", NIL); String *lua_name = Getattr(n, "lua:name"); // Although this function uses Swig_name_member, it actually generates the Lua name, // not the C++ name. This is because an earlier version used such a scheme for static function // name generation and we have to maintain backward compatibility. String *compat_name = Swig_name_member(0, proxy_class_name, lua_name); Setattr(n, "lua:name", compat_name); registerMethod(n, true, getNSpace()); Delete(compat_name); Swig_restore(n); } current[STATIC_FUNC] = false;; return result; } /* ------------------------------------------------------------ * memberconstantHandler() * * Create a C++ constant * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { REPORT("memberconstantHandler", n); int result = Language::memberconstantHandler(n); return result; } /* --------------------------------------------------------------------- * staticmembervariableHandler() * --------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { REPORT("staticmembervariableHandler", n); current[STATIC_VAR] = true; //String *symname = Getattr(n, "sym:name"); int result = Language::staticmembervariableHandler(n); if (!GetFlag(n, "wrappedasconstant")) { registerVariable(n); } if (result == SWIG_OK) { // This will add static member variable to the class namespace with name ClassName_VarName if (old_metatable_bindings && old_compatible_names) { Swig_save("lua_staticmembervariableHandler", n, "lua:name", NIL); String *lua_name = Getattr(n, "lua:name"); // Although this function uses Swig_name_member, it actually generates the Lua name, // not the C++ name. This is because an earlier version used such a scheme for static function // name generation and we have to maintain backward compatibility. String *v2_name = Swig_name_member(NIL, proxy_class_name, lua_name); if (!GetFlag(n, "wrappedasconstant")) { Setattr(n, "lua:name", v2_name); // Registering static var in the class parent nspace registerVariable(n, true, getNSpace()); } // If static member variable was wrapped as a constant, then // constant wrapper has already performed all actions necessary for old_metatable_bindings Delete(v2_name); Swig_restore(n); } } current[STATIC_VAR] = false; return result; } /* --------------------------------------------------------------------- * external runtime generation * --------------------------------------------------------------------- */ /* This is to support the usage SWIG -external-runtime The code consists of two functions: String *runtimeCode() // returns a large string with all the runtimes in String *defaultExternalRuntimeFilename() // returns the default filename I am writing a generic solution, even though SWIG-Lua only has one file right now... */ String *runtimeCode() { String *s = NewString(""); const char *filenames[] = { "luarun.swg", 0 }; // must be 0 terminated emitLuaFlavor(s); String *sfile = 0; for (int i = 0; filenames[i] != 0; i++) { sfile = Swig_include_sys(filenames[i]); if (!sfile) { Printf(stderr, "*** Unable to open '%s'\n", filenames[i]); } else { Append(s, sfile); Delete(sfile); } } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigluarun.h"); } /* --------------------------------------------------------------------- * helpers * --------------------------------------------------------------------- */ void emitLuaFlavor(String *s) { if (elua_emulate) { Printf(s, "/*This is only emulation!*/\n"); Printf(s, "#define SWIG_LUA_TARGET SWIG_LUA_FLAVOR_ELUA\n"); Printf(s, "#define SWIG_LUA_ELUA_EMULATE\n"); } else if (elua_ltr) Printf(s, "#define SWIG_LUA_TARGET SWIG_LUA_FLAVOR_ELUA\n"); else if (eluac_ltr) Printf(s, "#define SWIG_LUA_TARGET SWIG_LUA_FLAVOR_ELUAC\n"); else Printf(s, "#define SWIG_LUA_TARGET SWIG_LUA_FLAVOR_LUA\n"); } /* ----------------------------------------------------------------------------- * escapeCode() * * This is to convert the string of Lua code into a proper string, which can then be * emitted into the C/C++ code. * Basically it is a lot of search & replacing of odd sequences * ---------------------------------------------------------------------------- */ void escapeCode(String *str) { //Printf(f_runtime,"/* original luacode:[[[\n%s\n]]]\n*/\n",str); Chop(str); // trim Replace(str, "\\", "\\\\", DOH_REPLACE_ANY); // \ to \\ (this must be done first) Replace(str, "\"", "\\\"", DOH_REPLACE_ANY); // " to \" Replace(str, "\n", "\\n\"\n \"", DOH_REPLACE_ANY); // \n to \n"\n" (ie quoting every line) //Printf(f_runtime,"/* hacked luacode:[[[\n%s\n]]]\n*/\n",str); } /* ----------------------------------------------------------------------------- * rawGetCArraysHash(String *name) * * A small helper to hide implementation of how CArrays hashes are stored * ---------------------------------------------------------------------------- */ Hash *rawGetCArraysHash(const_String_or_char_ptr name) { Hash *scope = symbolScopeLookup( name ? name : "" ); if(!scope) return 0; Hash *carrays_hash = Getattr(scope, "lua:cdata"); return carrays_hash; } /* ----------------------------------------------------------------------------- * getCArraysHash() * * Each namespace can be described with a hash that stores C arrays * where members of the namespace should be added. All these hashes are stored * inside the symbols table, in pseudo-symbol for every namespace. * nspace could be NULL (NSPACE_TODO), that means functions and variables and classes * that are not in any namespace (this is default for SWIG unless %nspace feature is used). * You can later set some attributes that will affect behaviour of functions that use this hash: * "lua:no_namespaces" will disable "namespaces" array. * "lua:no_classes" will disable "classes" array. * For every component ("attributes", "methods", etc) there are subcomponents: * XXX:name - name of the C array that stores data for component * XXX:decl - statement with forward declaration of this array; * Namespace could be automatically registered to its parent if 'reg' == true. This can only be * done during the first call (a.k.a when nspace is created). * ---------------------------------------------------------------------------- */ Hash *getCArraysHash(String *nspace, bool reg = true) { Hash *scope = symbolScopeLookup(nspace ? nspace : ""); if(!scope) { symbolAddScope( nspace ? nspace : "" ); scope = symbolScopeLookup(nspace ? nspace : ""); assert(scope); } Hash *carrays_hash = Getattr(scope, "lua:cdata"); if (carrays_hash != 0) return carrays_hash; carrays_hash = NewHash(); String *mangled_name = 0; if (nspace == 0 || Len(nspace) == 0) mangled_name = NewString("SwigModule"); else mangled_name = Swig_name_mangle(nspace); String *cname = NewStringf("swig_%s", mangled_name); Setattr(carrays_hash, "cname", cname); String *attr_tab = NewString(""); String *attr_tab_name = NewStringf("swig_%s_attributes", mangled_name); String *attr_tab_decl = NewString(""); Printv(attr_tab, "static swig_lua_attribute ", NIL); Printv(attr_tab, attr_tab_name, "[]", NIL); Printv(attr_tab_decl, attr_tab, ";\n", NIL); Printv(attr_tab, " = {\n", NIL); Setattr(carrays_hash, "attributes", attr_tab); Setattr(carrays_hash, "attributes:name", attr_tab_name); Setattr(carrays_hash, "attributes:decl", attr_tab_decl); String *methods_tab = NewString(""); String *methods_tab_name = NewStringf("swig_%s_methods", mangled_name); String *methods_tab_decl = NewString(""); if (elua_ltr || eluac_ltr) // In this case methods array also acts as namespace rotable Printf(methods_tab, "const LUA_REG_TYPE "); else Printf(methods_tab, "static swig_lua_method "); Printv(methods_tab, methods_tab_name, "[]", NIL); Printv(methods_tab_decl, methods_tab, ";\n", NIL); Printv(methods_tab, "= {\n", NIL); Setattr(carrays_hash, "methods", methods_tab); Setattr(carrays_hash, "methods:name", methods_tab_name); Setattr(carrays_hash, "methods:decl", methods_tab_decl); String *const_tab = NewString(""); String *const_tab_name = NewStringf("swig_%s_constants", mangled_name); String *const_tab_decl = NewString(""); if (elua_ltr || eluac_ltr) // In this case const array holds rotable with namespace constants Printf(const_tab, "const LUA_REG_TYPE "); else Printf(const_tab, "static swig_lua_const_info "); Printv(const_tab, const_tab_name, "[]", NIL); Printv(const_tab_decl, const_tab, ";", NIL); Printv(const_tab, "= {\n", NIL); Setattr(carrays_hash, "constants", const_tab); Setattr(carrays_hash, "constants:name", const_tab_name); Setattr(carrays_hash, "constants:decl", const_tab_decl); String *classes_tab = NewString(""); String *classes_tab_name = NewStringf("swig_%s_classes", mangled_name); String *classes_tab_decl = NewString(""); Printf(classes_tab, "static swig_lua_class* "); Printv(classes_tab, classes_tab_name, "[]", NIL); Printv(classes_tab_decl, classes_tab, ";", NIL); Printv(classes_tab, "= {\n", NIL); Setattr(carrays_hash, "classes", classes_tab); Setattr(carrays_hash, "classes:name", classes_tab_name); Setattr(carrays_hash, "classes:decl", classes_tab_decl); String *namespaces_tab = NewString(""); String *namespaces_tab_name = NewStringf("swig_%s_namespaces", mangled_name); String *namespaces_tab_decl = NewString(""); Printf(namespaces_tab, "static swig_lua_namespace* "); Printv(namespaces_tab, namespaces_tab_name, "[]", NIL); Printv(namespaces_tab_decl, namespaces_tab, ";", NIL); Printv(namespaces_tab, " = {\n", NIL); Setattr(carrays_hash, "namespaces", namespaces_tab); Setattr(carrays_hash, "namespaces:name", namespaces_tab_name); Setattr(carrays_hash, "namespaces:decl", namespaces_tab_decl); if (elua_ltr) { String *get_tab = NewString(""); String *get_tab_name = NewStringf("swig_%s_get", mangled_name); String *get_tab_decl = NewString(""); Printv(get_tab, "const LUA_REG_TYPE ", get_tab_name, "[]", NIL); Printv(get_tab_decl, get_tab, ";", NIL); Printv(get_tab, " = {\n", NIL); Setattr(carrays_hash, "get", get_tab); Setattr(carrays_hash, "get:name", get_tab_name); Setattr(carrays_hash, "get:decl", get_tab_decl); String *set_tab = NewString(""); String *set_tab_name = NewStringf("swig_%s_set", mangled_name); String *set_tab_decl = NewString(""); Printv(set_tab, "const LUA_REG_TYPE ", set_tab_name, "[]", NIL); Printv(set_tab_decl, set_tab, ";", NIL); Printv(set_tab, " = {\n", NIL); Setattr(carrays_hash, "set", set_tab); Setattr(carrays_hash, "set:name", set_tab_name); Setattr(carrays_hash, "set:decl", set_tab_decl); } if (!eluac_ltr) { String *metatable_tab = NewString(""); String *metatable_tab_name = NewStringf("swig_%s_meta", mangled_name); String *metatable_tab_decl = NewString(""); if (elua_ltr) // In this case const array holds rotable with namespace constants Printf(metatable_tab, "const LUA_REG_TYPE "); else Printf(metatable_tab, "static swig_lua_method "); Printv(metatable_tab, metatable_tab_name, "[]", NIL); Printv(metatable_tab_decl, metatable_tab, ";", NIL); Printv(metatable_tab, " = {\n", NIL); Setattr(carrays_hash, "metatable", metatable_tab); Setattr(carrays_hash, "metatable:name", metatable_tab_name); Setattr(carrays_hash, "metatable:decl", metatable_tab_decl); } Setattr(scope, "lua:cdata", carrays_hash); assert(rawGetCArraysHash(nspace)); if (reg && nspace != 0 && Len(nspace) != 0 && GetFlag(carrays_hash, "lua:no_reg") == 0) { // Split names into components List *components = Split(nspace, '.', -1); String *parent_path = NewString(""); int len = Len(components); String *name = Copy(Getitem(components, len - 1)); for (int i = 0; i < len - 1; i++) { if (i > 0) Printv(parent_path, NSPACE_SEPARATOR, NIL); String *item = Getitem(components, i); Printv(parent_path, item, NIL); } Hash *parent = getCArraysHash(parent_path, true); String *namespaces_tab = Getattr(parent, "namespaces"); Printv(namespaces_tab, "&", cname, ",\n", NIL); if (elua_ltr || eluac_ltr) { String *methods_tab = Getattr(parent, "methods"); Printv(methods_tab, tab4, "{LSTRKEY(\"", name, "\")", ", LROVAL(", methods_tab_name, ")", "},\n", NIL); } Setattr(carrays_hash, "name", name); Delete(components); Delete(parent_path); } else if (!reg) // This namespace shouldn't be registered. Lets remember it. SetFlag(carrays_hash, "lua:no_reg"); Delete(mangled_name); mangled_name = 0; return carrays_hash; } /* ----------------------------------------------------------------------------- * closeCArraysHash() * * Functions add end markers {0,0,...,0} to all arrays, prints them to * output and marks hash as closed (lua:closed). Consequent attempts to * close the same hash will result in an error. * closeCArraysHash DOES NOT print structure that describes namespace, it only * prints array. You can use printCArraysDefinition to print structure. * if "lua:no_namespaces" is set, then array for "namespaces" won't be printed * if "lua:no_classes" is set, then array for "classes" won't be printed * ----------------------------------------------------------------------------- */ void closeCArraysHash(String *nspace, File *output) { Hash *carrays_hash = rawGetCArraysHash(nspace); assert(carrays_hash); assert(GetFlag(carrays_hash, "lua:closed") == 0); SetFlag(carrays_hash, "lua:closed"); // Do arrays describe class instance part or class static part const int is_instance = GetFlag(carrays_hash, "lua:class_instance"); String *attr_tab = Getattr(carrays_hash, "attributes"); Printf(attr_tab, " {0,0,0}\n};\n"); Printv(output, attr_tab, NIL); String *const_tab = Getattr(carrays_hash, "constants"); String *const_tab_name = Getattr(carrays_hash, "constants:name"); if (elua_ltr || eluac_ltr) Printv(const_tab, tab4, "{LNILKEY, LNILVAL}\n", "};\n", NIL); else Printf(const_tab, " {0,0,0,0,0,0}\n};\n"); // For the sake of compiling with -Wall -Werror we print constants // only when necessary int need_constants = 0; if ( (elua_ltr || eluac_ltr) && (old_metatable_bindings) ) need_constants = 1; else if (!is_instance) // static part need constants tab need_constants = 1; if (need_constants) Printv(output, const_tab, NIL); if (elua_ltr) { // Put forward declaration of metatable array Printv(output, "extern ", Getattr(carrays_hash, "metatable:decl"), "\n", NIL); } String *methods_tab = Getattr(carrays_hash, "methods"); String *metatable_tab_name = Getattr(carrays_hash, "metatable:name"); if (elua_ltr || eluac_ltr) { if (old_metatable_bindings) Printv(methods_tab, tab4, "{LSTRKEY(\"const\"), LROVAL(", const_tab_name, ")},\n", NIL); if (elua_ltr) { Printv(methods_tab, tab4, "{LSTRKEY(\"__metatable\"), LROVAL(", metatable_tab_name, ")},\n", NIL); } Printv(methods_tab, tab4, "{LSTRKEY(\"__disown\"), LFUNCVAL(SWIG_Lua_class_disown)},\n", NIL); Printv(methods_tab, tab4, "{LNILKEY, LNILVAL}\n};\n", NIL); } else Printf(methods_tab, " {0,0}\n};\n"); Printv(output, methods_tab, NIL); if (!GetFlag(carrays_hash, "lua:no_classes")) { String *classes_tab = Getattr(carrays_hash, "classes"); Printf(classes_tab, " 0\n};\n"); Printv(output, classes_tab, NIL); } if (!GetFlag(carrays_hash, "lua:no_namespaces")) { String *namespaces_tab = Getattr(carrays_hash, "namespaces"); Printf(namespaces_tab, " 0\n};\n"); Printv(output, namespaces_tab, NIL); } if (elua_ltr) { String *get_tab = Getattr(carrays_hash, "get"); String *set_tab = Getattr(carrays_hash, "set"); Printv(get_tab, tab4, "{LNILKEY, LNILVAL}\n};\n", NIL); Printv(set_tab, tab4, "{LNILKEY, LNILVAL}\n};\n", NIL); Printv(output, get_tab, NIL); Printv(output, set_tab, NIL); } // Heuristic whether we need to print metatable or not. // For the sake of compiling with -Wall -Werror we don't print // metatable for static part. int need_metatable = 0; if (eluac_ltr) need_metatable = 0; else if(!is_instance) need_metatable = 0; else need_metatable = 1; if (need_metatable) { String *metatable_tab = Getattr(carrays_hash, "metatable"); assert(metatable_tab); if (elua_ltr) { String *get_tab_name = Getattr(carrays_hash, "get:name"); String *set_tab_name = Getattr(carrays_hash, "set:name"); if (GetFlag(carrays_hash, "lua:class_instance")) { Printv(metatable_tab, tab4, "{LSTRKEY(\"__index\"), LFUNCVAL(SWIG_Lua_class_get)},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\"__newindex\"), LFUNCVAL(SWIG_Lua_class_set)},\n", NIL); } else { Printv(metatable_tab, tab4, "{LSTRKEY(\"__index\"), LFUNCVAL(SWIG_Lua_namespace_get)},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\"__newindex\"), LFUNCVAL(SWIG_Lua_namespace_set)},\n", NIL); } Printv(metatable_tab, tab4, "{LSTRKEY(\"__gc\"), LFUNCVAL(SWIG_Lua_class_destruct)},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\".get\"), LROVAL(", get_tab_name, ")},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\".set\"), LROVAL(", set_tab_name, ")},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\".fn\"), LROVAL(", Getattr(carrays_hash, "methods:name"), ")},\n", NIL); if (GetFlag(carrays_hash, "lua:class_instance")) { String *static_cls = Getattr(carrays_hash, "lua:class_instance:static_hash"); assert(static_cls); // static_cls is swig_lua_namespace. This structure can't be use with eLua(LTR) // Instead structure describing its methods isused String *static_cls_cname = Getattr(static_cls, "methods:name"); assert(static_cls_cname); Printv(metatable_tab, tab4, "{LSTRKEY(\".static\"), LROVAL(", static_cls_cname, ")},\n", NIL); // Put forward declaration of this array Printv(output, "extern ", Getattr(static_cls, "methods:decl"), "\n", NIL); } else if (GetFlag(carrays_hash, "lua:class_static")) { Hash *instance_cls = Getattr(carrays_hash, "lua:class_static:instance_hash"); assert(instance_cls); String *instance_cls_metatable_name = Getattr(instance_cls, "metatable:name"); assert(instance_cls_metatable_name); Printv(metatable_tab, tab4, "{LSTRKEY(\".instance\"), LROVAL(", instance_cls_metatable_name, ")},\n", NIL); } Printv(metatable_tab, tab4, "{LNILKEY, LNILVAL}\n};\n", NIL); } else { Printf(metatable_tab, " {0,0}\n};\n"); } Printv(output, metatable_tab, NIL); } Printv(output, "\n", NIL); } /* ----------------------------------------------------------------------------- * closeNamespaces() * * Recursively close all non-closed namespaces. Prints data to dataOutput. * ----------------------------------------------------------------------------- */ void closeNamespaces(File *dataOutput) { // Special handling for empty module. if (symbolScopeLookup("") == 0 || rawGetCArraysHash("") == 0) { // Module is empty. Create hash for global scope in order to have swig_SwigModule // variable in resulting file getCArraysHash(0); } // Because we can't directly access 'symtabs', instead we access // top-level scope and look on all scope pseudo-symbols in it. Hash *top_scope = symbolScopeLookup(""); assert(top_scope); Iterator ki = First(top_scope); List *to_close = NewList(); while (ki.key) { assert(ki.item); if (Getattr(ki.item, "sym:scope")) { // We have a pseudo symbol. Lets get actual scope for this pseudo symbol Hash *carrays_hash = rawGetCArraysHash(ki.key); assert(carrays_hash); if (GetFlag(carrays_hash, "lua:closed") == 0) Append(to_close, ki.key); } ki = Next(ki); } SortList(to_close, &compareByLen); int len = Len(to_close); for (int i = 0; i < len; i++) { String *key = Getitem(to_close, i); closeCArraysHash(key, dataOutput); Hash *carrays_hash = rawGetCArraysHash(key); String *name = 0; // name - name of the namespace as it should be visible in Lua if (DohLen(key) == 0) // This is global module name = module; else name = Getattr(carrays_hash, "name"); assert(name); printCArraysDefinition(key, name, dataOutput); } Delete(to_close); } /* ----------------------------------------------------------------------------- * printCArraysDefinition() * * This function prints to output a definition of namespace in form * swig_lua_namespace $cname = { attr_array, methods_array, ... , namespaces_array }; * You can call this function as many times as is necessary. * 'name' is a user-visible name that this namespace will have in Lua. It shouldn't * be a fully qualified name, just its own name. * ----------------------------------------------------------------------------- */ void printCArraysDefinition(String *nspace, String *name, File *output) { Hash *carrays_hash = getCArraysHash(nspace, false); String *cname = Getattr(carrays_hash, "cname"); // cname - name of the C structure that describes namespace assert(cname); Printv(output, "static swig_lua_namespace ", cname, " = ", NIL); String *null_string = NewString("0"); String *attr_tab_name = Getattr(carrays_hash, "attributes:name"); String *methods_tab_name = Getattr(carrays_hash, "methods:name"); String *const_tab_name = Getattr(carrays_hash, "constants:name"); String *classes_tab_name = Getattr(carrays_hash, "classes:name"); String *namespaces_tab_name = Getattr(carrays_hash, "namespaces:name"); bool has_classes = GetFlag(carrays_hash, "lua:no_classes") == 0; bool has_namespaces = GetFlag(carrays_hash, "lua:no_namespaces") == 0; Printv(output, "{\n", tab4, "\"", name, "\",\n", tab4, methods_tab_name, ",\n", tab4, attr_tab_name, ",\n", tab4, const_tab_name, ",\n", tab4, (has_classes) ? classes_tab_name : null_string, ",\n", tab4, (has_namespaces) ? namespaces_tab_name : null_string, "\n};\n", NIL); Delete(null_string); } /* ----------------------------------------------------------------------------- * luaCurrentSymbolNSpace() * * This function determines actual namespace/scope where any symbol at the * current moment should be placed. It looks at the 'current' array * and depending on where are we - static class member/function, * instance class member/function or just global functions decides * where symbol should be put. * The namespace/scope doesn't depend from symbol, only from 'current' * ----------------------------------------------------------------------------- */ String *luaCurrentSymbolNSpace() { String *scope = 0; // If outside class, than NSpace is used. // If inside class, but current[NO_CPP], then this is friend function. It belongs to NSpace if (!getCurrentClass() || current[NO_CPP]) { scope = getNSpace(); } else if (current[ENUM_CONST] && !CPlusPlus ) { // Enums in C mode go to NSpace scope = getNSpace(); } else { // If inside class, then either class static namespace or class fully qualified name is used assert(!current[NO_CPP]); if (current[STATIC_FUNC] || current[STATIC_VAR] || current[STATIC_CONST]) { scope = class_static_nspace; } else if (current[MEMBER_VAR] || current[CONSTRUCTOR] || current[DESTRUCTOR] || current[MEMBER_FUNC]) { scope = full_proxy_class_name; } else { // Friend functions are handled this way scope = class_static_nspace; } assert(scope); } return scope; } /* ----------------------------------------------------------------------------- * luaAddSymbol() * * Our implementation of addSymbol. Determines scope correctly, then * forwards to Language::addSymbol * ----------------------------------------------------------------------------- */ int luaAddSymbol(const String *s, const Node *n) { String *scope = luaCurrentSymbolNSpace(); return luaAddSymbol(s, n, scope); } /* ----------------------------------------------------------------------------- * luaAddSymbol() * * Overload. Enforces given scope. Actually, it simply forwards call to Language::addSymbol * ----------------------------------------------------------------------------- */ int luaAddSymbol(const String *s, const Node *n, const_String_or_char_ptr scope) { int result = Language::addSymbol(s, n, scope); if (!result) Printf(stderr, "addSymbol(%s to scope %s) failed\n", s, scope); return result; } }; /* NEW LANGUAGE NOTE:*********************************************** in order to add you language into swig, you need to make the following changes: - write this file (obviously) - add into the makefile (not 100% clear on how to do this) - edit swigmain.cxx to add your module near the top of swigmain.cxx, look for this code & add you own codes ======= begin change ========== extern "C" { Language *swig_tcl(void); Language *swig_python(void); //etc,etc,etc... Language *swig_lua(void); // this is my code } //etc,etc,etc... swig_module modules[] = { {"-guile", swig_guile, "Guile"}, {"-java", swig_java, "Java"}, //etc,etc,etc... {"-lua", swig_lua, "Lua"}, // this is my code {NULL, NULL, NULL} // this must come at the end of the list }; ======= end change ========== This is all that is needed NEW LANGUAGE NOTE:END ************************************************/ /* ----------------------------------------------------------------------------- * swig_lua() - Instantiate module * ----------------------------------------------------------------------------- */ extern "C" Language *swig_lua(void) { return new LUA(); } swig-4.0.2/Source/Modules/ruby.cxx0000644000175000017500000033135613667507523016752 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * ruby.cxx * * Ruby language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include #include #include /* for INT_MAX */ #define SWIG_PROTECTED_TARGET_METHODS 1 class RClass { private: String *temp; public: String *name; /* class name (renamed) */ String *cname; /* original C class/struct name */ String *mname; /* Mangled name */ /** * The C variable name used in the SWIG-generated wrapper code to refer to * this class; usually it is of the form "SwigClassXXX.klass", where SwigClassXXX * is a swig_class struct instance and klass is a member of that struct. */ String *vname; /** * The C variable name used in the SWIG-generated wrapper code to refer to * the module that implements this class's methods (when we're trying to * support C++ multiple inheritance). Usually it is of the form * "SwigClassClassName.mImpl", where SwigClassXXX is a swig_class struct instance * and mImpl is a member of that struct. */ String *mImpl; String *type; String *prefix; String *init; int constructor_defined; int destructor_defined; RClass() { temp = NewString(""); name = NewString(""); cname = NewString(""); mname = NewString(""); vname = NewString(""); mImpl = NewString(""); type = NewString(""); prefix = NewString(""); init = NewString(""); constructor_defined = 0; destructor_defined = 0; } ~RClass() { Delete(name); Delete(cname); Delete(vname); Delete(mImpl); Delete(mname); Delete(type); Delete(prefix); Delete(init); Delete(temp); } void set_name(const_String_or_char_ptr cn, const_String_or_char_ptr rn, const_String_or_char_ptr valn) { /* Original C/C++ class (or struct) name */ Clear(cname); Append(cname, cn); /* Mangled name */ Delete(mname); mname = Swig_name_mangle(cname); /* Renamed class name */ Clear(name); Append(name, valn); /* Variable name for the VALUE that refers to the Ruby Class object */ Clear(vname); Printf(vname, "SwigClass%s.klass", name); /* Variable name for the VALUE that refers to the Ruby Class object */ Clear(mImpl); Printf(mImpl, "SwigClass%s.mImpl", name); /* Prefix */ Clear(prefix); Printv(prefix, (rn ? rn : cn), "_", NIL); } char *strip(const_String_or_char_ptr s) { Clear(temp); Append(temp, s); if (Strncmp(s, prefix, Len(prefix)) == 0) { Replaceall(temp, prefix, ""); } return Char(temp); } }; /* flags for the make_autodoc function */ enum autodoc_t { AUTODOC_CLASS, AUTODOC_CTOR, AUTODOC_DTOR, AUTODOC_STATICFUNC, AUTODOC_FUNC, AUTODOC_METHOD, AUTODOC_GETTER, AUTODOC_SETTER, AUTODOC_NONE }; static const char *usage = "\ Ruby Options (available with -ruby)\n\ -autorename - Enable renaming of classes and methods to follow Ruby coding standards\n\ -globalmodule - Wrap everything into the global module\n\ -initname - Set entry function to Init_ (used by `require')\n\ -minherit - Attempt to support multiple inheritance\n\ -noautorename - Disable renaming of classes and methods (default)\n\ -prefix - Set a prefix to be prepended to all names\n\ "; #define RCLASS(hash, name) (RClass*)(Getattr(hash, name) ? Data(Getattr(hash, name)) : 0) #define SET_RCLASS(hash, name, klass) Setattr(hash, name, NewVoid(klass, 0)) class RUBY:public Language { private: String *module; String *modvar; String *feature; String *prefix; int current; Hash *classes; /* key=cname val=RClass */ RClass *klass; /* Currently processing class */ Hash *special_methods; /* Python style special method name table */ File *f_directors; File *f_directors_h; File *f_directors_helpers; File *f_begin; File *f_runtime; File *f_runtime_h; File *f_header; File *f_wrappers; File *f_init; File *f_initbeforefunc; bool useGlobalModule; bool multipleInheritance; // Wrap modes enum WrapperMode { NO_CPP, MEMBER_FUNC, CONSTRUCTOR_ALLOCATE, CONSTRUCTOR_INITIALIZE, DESTRUCTOR, MEMBER_VAR, CLASS_CONST, STATIC_FUNC, STATIC_VAR }; /* ------------------------------------------------------------ * autodoc level declarations * ------------------------------------------------------------ */ enum autodoc_l { NO_AUTODOC = -2, // no autodoc STRING_AUTODOC = -1, // use provided string NAMES_AUTODOC = 0, // only parameter names TYPES_AUTODOC = 1, // parameter names and types EXTEND_AUTODOC = 2, // extended documentation and parameter names EXTEND_TYPES_AUTODOC = 3 // extended documentation and parameter types + names }; autodoc_t last_mode; String* last_autodoc; autodoc_l autodoc_level(String *autodoc) { autodoc_l dlevel = NO_AUTODOC; char *c = Char(autodoc); if (c) { if (isdigit(c[0])) { dlevel = (autodoc_l) atoi(c); } else { if (strcmp(c, "extended") == 0) { dlevel = EXTEND_AUTODOC; } else { dlevel = STRING_AUTODOC; } } } return dlevel; } /* ------------------------------------------------------------ * have_docstring() * Check if there is a docstring directive and it has text, * or there is an autodoc flag set * ------------------------------------------------------------ */ bool have_docstring(Node *n) { String *str = Getattr(n, "feature:docstring"); return (str && Len(str) > 0) || (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")); } /* ------------------------------------------------------------ * docstring() * Get the docstring text, stripping off {} if necessary, * and enclose in triple double quotes. If autodoc is also * set then it will build a combined docstring. * ------------------------------------------------------------ */ String *docstring(Node *n, autodoc_t ad_type) { String *str = Getattr(n, "feature:docstring"); bool have_ds = (str && Len(str) > 0); bool have_auto = (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")); String *autodoc = NULL; String *doc = NULL; if (have_ds) { char *t = Char(str); if (*t == '{') { Delitem(str, 0); Delitem(str, DOH_END); } } if (have_auto) { autodoc = make_autodoc(n, ad_type); have_auto = (autodoc && Len(autodoc) > 0); } if (have_auto || have_ds) doc = NewString("/*"); if (have_auto && have_ds) { // Both autodoc and docstring are present Printv(doc, "\n", autodoc, "\n", str, "\n", NIL); } else if (!have_auto && have_ds) { // only docstring Printv(doc, str, NIL); } else if (have_auto && !have_ds) { // only autodoc Printv(doc, "\n", autodoc, "\n", NIL); } else { doc = NewString(""); } if (have_auto || have_ds) Append(doc, "*/\n"); // Save the generated strings in the parse tree in case they are used later // by post processing tools Setattr(n, "ruby:docstring", doc); Setattr(n, "ruby:autodoc", autodoc); return doc; } /* ----------------------------------------------------------------------------- * addMissingParameterNames() * For functions that have not had nameless parameters set in the Language class. * * Inputs: * plist - entire parameter list * arg_offset - argument number for first parameter * Side effects: * The "lname" attribute in each parameter in plist will be contain a parameter name * ----------------------------------------------------------------------------- */ void addMissingParameterNames(Node* n, ParmList *plist, int arg_offset) { Parm *p = plist; int i = arg_offset; while (p) { if (!Getattr(p, "lname")) { String *name = makeParameterName(n, p, i); Setattr(p, "lname", name); Delete(name); } i++; p = nextSibling(p); } } /* ------------------------------------------------------------ * make_autodocParmList() * Generate the documentation for the function parameters * ------------------------------------------------------------ */ String *make_autodocParmList(Node *n, bool showTypes) { String *doc = NewString(""); String *pdocs = 0; ParmList *plist = CopyParmList(Getattr(n, "parms")); Parm *p; Parm *pnext; int lines = 0; int arg_num = is_wrapping_class() ? 1 : 0; const int maxwidth = 80; addMissingParameterNames(n, plist, arg_num); // for $1_name substitutions done in Swig_typemap_attach_parms Swig_typemap_attach_parms("in", plist, 0); Swig_typemap_attach_parms("doc", plist, 0); if (Strcmp(ParmList_protostr(plist), "void") == 0) { //No parameters actually return doc; } for (p = plist; p; p = pnext, arg_num++) { String *tm = Getattr(p, "tmap:in"); if (tm) { pnext = Getattr(p, "tmap:in:next"); if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } } else { pnext = nextSibling(p); } String *name = 0; String *type = 0; String *value = 0; String *pdoc = Getattr(p, "tmap:doc"); if (pdoc) { name = Getattr(p, "tmap:doc:name"); type = Getattr(p, "tmap:doc:type"); value = Getattr(p, "tmap:doc:value"); } // Note: the generated name should be consistent with that in kwnames[] String *made_name = 0; if (!name) { name = made_name = makeParameterName(n, p, arg_num); } type = type ? type : Getattr(p, "type"); value = value ? value : Getattr(p, "value"); if (SwigType_isvarargs(type)) break; // Skip the 'self' parameter which in ruby is implicit if ( Cmp(name, "self") == 0 ) continue; // Make __p parameters just p (as used in STL) Replace( name, "__", "", DOH_REPLACE_FIRST ); if (Len(doc)) { // add a comma to the previous one if any Append(doc, ", "); // Do we need to wrap a long line? if ((Len(doc) - lines * maxwidth) > maxwidth) { Printf(doc, "\n%s", tab4); lines += 1; } } // Do the param type too? Node *nn = classLookup(Getattr(p, "type")); String *type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); if (showTypes) Printf(doc, "%s ", type_str); Append(doc, name); if (pdoc) { if (!pdocs) pdocs = NewString("Parameters:\n"); Printf(pdocs, " %s.\n", pdoc); } if (value) { String *new_value = convertValue(value, Getattr(p, "type")); if (new_value) { value = new_value; } else { Node *lookup = Swig_symbol_clookup(value, 0); if (lookup) value = Getattr(lookup, "sym:name"); } Printf(doc, "=%s", value); } Delete(type_str); Delete(made_name); } if (pdocs) Setattr(n, "feature:pdocs", pdocs); Delete(plist); return doc; } /* ------------------------------------------------------------ * make_autodoc() * Build a docstring for the node, using parameter and other * info in the parse tree. If the value of the autodoc * attribute is "0" then do not include parameter types, if * it is "1" (the default) then do. If it has some other * value then assume it is supplied by the extension writer * and use it directly. * ------------------------------------------------------------ */ String *make_autodoc(Node *n, autodoc_t ad_type) { int extended = 0; // If the function is overloaded then this function is called // for the last one. Rewind to the first so the docstrings are // in order. while (Getattr(n, "sym:previousSibling")) n = Getattr(n, "sym:previousSibling"); Node *pn = Swig_methodclass(n); String* super_names = NewString(""); String* class_name = Getattr(pn, "sym:name") ; if ( !class_name ) { class_name = NewString(""); } else { class_name = Copy(class_name); List *baselist = Getattr(pn, "bases"); if (baselist && Len(baselist)) { Iterator base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } int count = 0; for ( ;base.item; ++count) { if ( count ) Append(super_names, ", "); String *basename = Getattr(base.item, "sym:name"); String* basenamestr = NewString(basename); Node* parent = parentNode(base.item); while (parent) { String *parent_name = Copy( Getattr(parent, "sym:name") ); if ( !parent_name ) { Node* mod = Getattr(parent, "module"); if ( mod ) parent_name = Copy( Getattr(mod, "name") ); if ( parent_name ) (Char(parent_name))[0] = (char)toupper((Char(parent_name))[0]); } if ( parent_name ) { Insert(basenamestr, 0, "::"); Insert(basenamestr, 0, parent_name); Delete(parent_name); } parent = parentNode(parent); } Append(super_names, basenamestr ); Delete(basenamestr); base = Next(base); } } } String* full_name; if ( module ) { full_name = NewString(module); if (Len(class_name) > 0) Append(full_name, "::"); } else full_name = NewString(""); Append(full_name, class_name); String* symname = Getattr(n, "sym:name"); if ( Getattr( special_methods, symname ) ) symname = Getattr( special_methods, symname ); String* methodName = NewString(full_name); Append(methodName, symname); // Each overloaded function will try to get documented, // so we keep the name of the last overloaded function and its type. // Documenting just from functionWrapper() is not possible as // sym:name has already been changed to include the class name if ( last_mode == ad_type && Cmp(methodName, last_autodoc) == 0 ) { Delete(full_name); Delete(class_name); Delete(super_names); Delete(methodName); return NewString(""); } last_mode = ad_type; last_autodoc = Copy(methodName); String *doc = NewString(""); int counter = 0; bool skipAuto = false; Node* on = n; for ( ; n; ++counter ) { String *type_str = NULL; skipAuto = false; bool showTypes = false; String *autodoc = Getattr(n, "feature:autodoc"); autodoc_l dlevel = autodoc_level(autodoc); switch (dlevel) { case NO_AUTODOC: break; case NAMES_AUTODOC: showTypes = false; break; case TYPES_AUTODOC: showTypes = true; break; case EXTEND_AUTODOC: extended = 1; showTypes = false; break; case EXTEND_TYPES_AUTODOC: extended = 1; showTypes = true; break; case STRING_AUTODOC: skipAuto = true; break; } SwigType *type = Getattr(n, "type"); if (type) { if (Strcmp(type, "void") == 0) { type_str = NULL; } else { SwigType *qt = SwigType_typedef_resolve_all(type); if (SwigType_isenum(qt)) { type_str = NewString("int"); } else { Node *nn = classLookup(type); type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); } } } if (counter == 0) { switch (ad_type) { case AUTODOC_CLASS: Printf(doc, " Document-class: %s", full_name); if ( Len(super_names) > 0 ) Printf( doc, " < %s", super_names); Append(doc, "\n\n"); break; case AUTODOC_CTOR: Printf(doc, " Document-method: %s.new\n\n", full_name); break; case AUTODOC_DTOR: break; case AUTODOC_STATICFUNC: Printf(doc, " Document-method: %s.%s\n\n", full_name, symname); break; case AUTODOC_FUNC: case AUTODOC_METHOD: case AUTODOC_GETTER: Printf(doc, " Document-method: %s.%s\n\n", full_name, symname); break; case AUTODOC_SETTER: Printf(doc, " Document-method: %s.%s=\n\n", full_name, symname); break; case AUTODOC_NONE: break; } } if (skipAuto) { if ( counter == 0 ) Printf(doc, " call-seq:\n"); switch( ad_type ) { case AUTODOC_STATICFUNC: case AUTODOC_FUNC: case AUTODOC_METHOD: case AUTODOC_GETTER: { String *paramList = make_autodocParmList(n, showTypes); if (Len(paramList)) Printf(doc, " %s(%s)", symname, paramList); else Printf(doc, " %s", symname); if (type_str) Printf(doc, " -> %s", type_str); break; } case AUTODOC_SETTER: { Printf(doc, " %s=(x)", symname); if (type_str) Printf(doc, " -> %s", type_str); break; } default: break; } } else { switch (ad_type) { case AUTODOC_CLASS: { // Only do the autodoc if there isn't a docstring for the class String *str = Getattr(n, "feature:docstring"); if (counter == 0 && (str == 0 || Len(str) == 0)) { if (CPlusPlus) { Printf(doc, " Proxy of C++ %s class", full_name); } else { Printf(doc, " Proxy of C %s struct", full_name); } } } break; case AUTODOC_CTOR: if (counter == 0) Printf(doc, " call-seq:\n"); if (Strcmp(class_name, symname) == 0) { String *paramList = make_autodocParmList(n, showTypes); if (Len(paramList)) Printf(doc, " %s.new(%s)", class_name, paramList); else Printf(doc, " %s.new", class_name); } else { Printf(doc, " %s.new(%s)", class_name, make_autodocParmList(n, showTypes)); } break; case AUTODOC_DTOR: break; case AUTODOC_STATICFUNC: case AUTODOC_FUNC: case AUTODOC_METHOD: case AUTODOC_GETTER: { if (counter == 0) Printf(doc, " call-seq:\n"); String *paramList = make_autodocParmList(n, showTypes); if (Len(paramList)) Printf(doc, " %s(%s)", symname, paramList); else Printf(doc, " %s", symname); if (type_str) Printf(doc, " -> %s", type_str); break; } case AUTODOC_SETTER: { Printf(doc, " call-seq:\n"); Printf(doc, " %s=(x)", symname); if (type_str) Printf(doc, " -> %s", type_str); break; } case AUTODOC_NONE: break; } } // if it's overloaded then get the next decl and loop around again n = Getattr(n, "sym:nextSibling"); if (n) Append(doc, "\n"); Delete(type_str); } Printf(doc, "\n\n"); if (!skipAuto) { switch (ad_type) { case AUTODOC_CLASS: case AUTODOC_DTOR: break; case AUTODOC_CTOR: Printf(doc, "Class constructor.\n"); break; case AUTODOC_STATICFUNC: Printf(doc, "A class method.\n"); break; case AUTODOC_FUNC: Printf(doc, "A module function.\n"); break; case AUTODOC_METHOD: Printf(doc, "An instance method.\n"); break; case AUTODOC_GETTER: Printf(doc, "Get value of attribute.\n"); break; case AUTODOC_SETTER: Printf(doc, "Set new value for attribute.\n"); break; case AUTODOC_NONE: break; } } n = on; while ( n ) { String *autodoc = Getattr(n, "feature:autodoc"); autodoc_l dlevel = autodoc_level(autodoc); switch (dlevel) { case NO_AUTODOC: case NAMES_AUTODOC: case TYPES_AUTODOC: extended = 0; break; case STRING_AUTODOC: extended = 2; Replaceall( autodoc, "$class", class_name ); Printv(doc, autodoc, ".", NIL); break; case EXTEND_AUTODOC: case EXTEND_TYPES_AUTODOC: extended = 1; break; } if (extended) { String *pdocs = Getattr(n, "feature:pdocs"); if (pdocs) { Printv(doc, "\n\n", pdocs, NULL); break; } if ( extended == 2 ) break; } n = Getattr(n, "sym:nextSibling"); } Delete(full_name); Delete(class_name); Delete(super_names); Delete(methodName); return doc; } /* ------------------------------------------------------------ * convertValue() * Check if string v can be a Ruby value literal, * (eg. number or string), or translate it to a Ruby literal. * ------------------------------------------------------------ */ String *convertValue(String *v, SwigType *t) { if (v && Len(v) > 0) { char fc = (Char(v))[0]; if (('0' <= fc && fc <= '9') || '\'' == fc || '"' == fc) { /* number or string (or maybe NULL pointer) */ if (SwigType_ispointer(t) && Strcmp(v, "0") == 0) return NewString("None"); else return v; } if (Strcmp(v, "NULL") == 0 || Strcmp(v, "nullptr") == 0) return SwigType_ispointer(t) ? NewString("nil") : NewString("0"); if (Strcmp(v, "true") == 0 || Strcmp(v, "TRUE") == 0) return NewString("True"); if (Strcmp(v, "false") == 0 || Strcmp(v, "FALSE") == 0) return NewString("False"); } return 0; } public: /* --------------------------------------------------------------------- * RUBY() * * Initialize member data * --------------------------------------------------------------------- */ RUBY() : module(0), modvar(0), feature(0), prefix(0), current(0), classes(0), klass(0), special_methods(0), f_directors(0), f_directors_h(0), f_directors_helpers(0), f_begin(0), f_runtime(0), f_runtime_h(0), f_header(0), f_wrappers(0), f_init(0), f_initbeforefunc(0), useGlobalModule(false), multipleInheritance(false), last_mode(AUTODOC_NONE), last_autodoc(NewString("")) { current = NO_CPP; director_prot_ctor_code = NewString(""); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " rb_raise(rb_eRuntimeError,\"accessing abstract class or protected constructor\"); \n", " return Qnil;\n", "}\n", NIL); director_multiple_inheritance = 0; director_language = 1; } /* --------------------------------------------------------------------- * main() * * Parse command line options and initializes variables. * --------------------------------------------------------------------- */ virtual void main(int argc, char *argv[]) { int autorename = 0; /* Set location of SWIG library */ SWIG_library_directory("ruby"); /* Look for certain command line options */ for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-initname") == 0) { if (argv[i + 1]) { char *name = argv[i + 1]; feature = NewString(name); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-feature") == 0) { fprintf( stderr, "Warning: Ruby -feature option is deprecated, " "please use -initname instead.\n"); if (argv[i + 1]) { char *name = argv[i + 1]; feature = NewString(name); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-globalmodule") == 0) { useGlobalModule = true; Swig_mark_arg(i); } else if (strcmp(argv[i], "-minherit") == 0) { multipleInheritance = true; director_multiple_inheritance = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-autorename") == 0) { autorename = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noautorename") == 0) { autorename = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { char *name = argv[i + 1]; prefix = NewString(name); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } else if (strcmp(argv[i], "-cppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is now always on.\n", argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is no longer supported.\n", argv[i]); Swig_mark_arg(i); SWIG_exit(EXIT_FAILURE); } } } if (autorename) { /* Turn on the autorename mode */ Preprocessor_define((DOH *) "SWIG_RUBY_AUTORENAME", 0); } /* Add a symbol to the parser for conditional compilation */ Preprocessor_define("SWIGRUBY 1", 0); /* Add typemap definitions */ SWIG_typemap_lang("ruby"); SWIG_config_file("ruby.swg"); allow_overloading(); } /** * Generate initialization code to define the Ruby module(s), * accounting for nested modules as necessary. */ void defineRubyModule() { List *modules = Split(module, ':', INT_MAX); if (modules != 0 && Len(modules) > 0) { String *mv = 0; Iterator m; m = First(modules); while (m.item) { if (Len(m.item) > 0) { if (mv != 0) { Printv(f_init, tab4, modvar, " = rb_define_module_under(", modvar, ", \"", m.item, "\");\n", NIL); } else { Printv(f_init, tab4, modvar, " = rb_define_module(\"", m.item, "\");\n", NIL); mv = NewString(modvar); } } m = Next(m); } Delete(mv); Delete(modules); } } void registerMagicMethods() { special_methods = NewHash(); /* Python->Ruby style special method name. */ /* Basic */ Setattr(special_methods, "__repr__", "inspect"); Setattr(special_methods, "__str__", "to_s"); Setattr(special_methods, "__cmp__", "<=>"); Setattr(special_methods, "__hash__", "hash"); Setattr(special_methods, "__nonzero__", "nonzero?"); /* Callable */ Setattr(special_methods, "__call__", "call"); /* Collection */ Setattr(special_methods, "__len__", "length"); Setattr(special_methods, "__getitem__", "[]"); Setattr(special_methods, "__setitem__", "[]="); /* Operators */ Setattr(special_methods, "__add__", "+"); Setattr(special_methods, "__pos__", "+@"); Setattr(special_methods, "__sub__", "-"); Setattr(special_methods, "__neg__", "-@"); Setattr(special_methods, "__mul__", "*"); Setattr(special_methods, "__div__", "/"); Setattr(special_methods, "__mod__", "%"); Setattr(special_methods, "__lshift__", "<<"); Setattr(special_methods, "__rshift__", ">>"); Setattr(special_methods, "__and__", "&"); Setattr(special_methods, "__or__", "|"); Setattr(special_methods, "__xor__", "^"); Setattr(special_methods, "__invert__", "~"); Setattr(special_methods, "__lt__", "<"); Setattr(special_methods, "__le__", "<="); Setattr(special_methods, "__gt__", ">"); Setattr(special_methods, "__ge__", ">="); Setattr(special_methods, "__eq__", "=="); /* Other numeric */ Setattr(special_methods, "__divmod__", "divmod"); Setattr(special_methods, "__pow__", "**"); Setattr(special_methods, "__abs__", "abs"); Setattr(special_methods, "__int__", "to_i"); Setattr(special_methods, "__float__", "to_f"); Setattr(special_methods, "__coerce__", "coerce"); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { String *mod_docstring = NULL; /** * See if any Ruby module options have been specified as options * to the %module directive. */ Node *swigModule = Getattr(n, "module"); if (swigModule) { Node *options = Getattr(swigModule, "options"); if (options) { if (Getattr(options, "directors")) { allow_directors(); } if (Getattr(options, "dirprot")) { allow_dirprot(); } if (Getattr(options, "ruby_globalmodule")) { useGlobalModule = true; } if (Getattr(options, "ruby_minherit")) { multipleInheritance = true; director_multiple_inheritance = 1; } mod_docstring = Getattr(options, "docstring"); } } /* Set comparison with none for ConstructorToFunction */ setSubclassInstanceCheck(NewStringf("strcmp(rb_obj_classname(self), classname) != 0")); // setSubclassInstanceCheck(NewString("CLASS_OF(self) != cFoo.klass")); /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); f_directors_helpers = NewString(""); f_initbeforefunc = NewString(""); if (directorsEnabled()) { if (!outfile_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); Swig_register_filebyname("director_helpers", f_directors_helpers); Swig_register_filebyname("initbeforefunc", f_initbeforefunc); modvar = 0; current = NO_CPP; klass = 0; classes = NewHash(); registerMagicMethods(); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGRUBY\n#define SWIGRUBY\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } Printf(f_runtime, "\n"); /* typedef void *VALUE */ SwigType *value = NewSwigType(T_VOID); SwigType_add_pointer(value); SwigType_typedef(value, "VALUE"); Delete(value); /* Set module name */ set_module(Char(Getattr(n, "name"))); if (directorsEnabled()) { /* Build a version of the module name for use in a C macro name. */ String *module_macro = Copy(module); Replaceall(module_macro, "::", "__"); Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module_macro); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module_macro); Printf(f_directors_h, "namespace Swig {\n"); Printf(f_directors_h, " class Director;\n"); Printf(f_directors_h, "}\n\n"); Printf(f_directors_helpers, "/* ---------------------------------------------------\n"); Printf(f_directors_helpers, " * C++ director class helpers\n"); Printf(f_directors_helpers, " * --------------------------------------------------- */\n\n"); Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } Delete(module_macro); } Printf(f_header, "#define SWIG_init Init_%s\n", feature); Printf(f_header, "#define SWIG_name \"%s\"\n\n", module); if (mod_docstring) { if (Len(mod_docstring)) { Printf(f_header, "/*\n Document-module: %s\n\n%s\n*/\n", module, mod_docstring); } Delete(mod_docstring); mod_docstring = NULL; } Printf(f_header, "static VALUE %s;\n", modvar); /* Start generating the initialization function */ String* docs = docstring(n, AUTODOC_CLASS); Printf(f_init, "/*\n%s\n*/", docs ); Printv(f_init, "\n", "#ifdef __cplusplus\n", "extern \"C\"\n", "#endif\n", "SWIGEXPORT void Init_", feature, "(void) {\n", "size_t i;\n", "\n", NIL); Printv(f_init, tab4, "SWIG_InitRuntime();\n", NIL); if (!useGlobalModule) defineRubyModule(); Printv(f_init, "\n", "SWIG_InitializeModule(0);\n", "for (i = 0; i < swig_module.size; i++) {\n", "SWIG_define_class(swig_module.types[i]);\n", "}\n", NIL); Printf(f_init, "\n"); /* Initialize code to keep track of objects */ Printf(f_init, "SWIG_RubyInitializeTrackings();\n"); Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } /* Finish off our init function */ Printf(f_init, "}\n"); SwigType_emit_type_table(f_runtime, f_wrappers); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors_helpers, f_begin); Dump(f_directors, f_begin); Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); } Dump(f_wrappers, f_begin); Dump(f_initbeforefunc, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_initbeforefunc); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ----------------------------------------------------------------------------- * importDirective() * ----------------------------------------------------------------------------- */ virtual int importDirective(Node *n) { String *modname = Getattr(n, "module"); if (modname) { if (prefix) { Insert(modname, 0, prefix); } List *modules = Split(modname, ':', INT_MAX); if (modules && Len(modules) > 0) { modname = NewString(""); String *last = NULL; Iterator m = First(modules); while (m.item) { if (Len(m.item) > 0) { if (last) { Append(modname, "/"); } Append(modname, m.item); last = m.item; } m = Next(m); } Printf(f_init, "rb_require(\"%s\");\n", modname); Delete(modname); } Delete(modules); } return Language::importDirective(n); } /* --------------------------------------------------------------------- * set_module(const char *mod_name) * * Sets the module name. Does nothing if it's already set (so it can * be overridden as a command line option). *---------------------------------------------------------------------- */ void set_module(const char *s) { String *mod_name = NewString(s); if (module == 0) { /* Start with the empty string */ module = NewString(""); if (prefix) { Insert(mod_name, 0, prefix); } /* Account for nested modules */ List *modules = Split(mod_name, ':', INT_MAX); if (modules != 0 && Len(modules) > 0) { String *last = 0; Iterator m = First(modules); while (m.item) { if (Len(m.item) > 0) { String *cap = NewString(m.item); (Char(cap))[0] = (char)toupper((Char(cap))[0]); if (last != 0) { Append(module, "::"); } Append(module, cap); last = m.item; } m = Next(m); } if (last) { if (feature == 0) { feature = Copy(last); } (Char(last))[0] = (char)toupper((Char(last))[0]); modvar = NewStringf("m%s", last); } } Delete(modules); } Delete(mod_name); } /* -------------------------------------------------------------------------- * nativeWrapper() * -------------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *funcname = Getattr(n, "wrap:name"); Swig_warning(WARN_LANG_NATIVE_UNIMPL, input_file, line_number, "Adding native function %s not supported (ignored).\n", funcname); return SWIG_NOWRAP; } /** * Process the comma-separated list of aliases (if any). */ void defineAliases(Node *n, const_String_or_char_ptr iname) { String *aliasv = Getattr(n, "feature:alias"); if (aliasv) { List *aliases = Split(aliasv, ',', INT_MAX); if (aliases && Len(aliases) > 0) { Iterator alias = First(aliases); while (alias.item) { if (Len(alias.item) > 0) { if (current == NO_CPP) { if (useGlobalModule) { Printv(f_init, tab4, "rb_define_alias(rb_cObject, \"", alias.item, "\", \"", iname, "\");\n", NIL); } else { Printv(f_init, tab4, "rb_define_alias(rb_singleton_class(", modvar, "), \"", alias.item, "\", \"", iname, "\");\n", NIL); } } else if (multipleInheritance) { Printv(klass->init, tab4, "rb_define_alias(", klass->mImpl, ", \"", alias.item, "\", \"", iname, "\");\n", NIL); } else { Printv(klass->init, tab4, "rb_define_alias(", klass->vname, ", \"", alias.item, "\", \"", iname, "\");\n", NIL); } } alias = Next(alias); } } Delete(aliases); } } /* --------------------------------------------------------------------- * create_command(Node *n, char *iname) * * Creates a new command from a C function. * iname = Name of function in scripting language * * A note about what "protected" and "private" mean in Ruby: * * A private method is accessible only within the class or its subclasses, * and it is callable only in "function form", with 'self' (implicit or * explicit) as a receiver. * * A protected method is callable only from within its class, but unlike * a private method, it can be called with a receiver other than self, such * as another instance of the same class. * --------------------------------------------------------------------- */ void create_command(Node *n, const_String_or_char_ptr iname) { String *alloc_func = Swig_name_wrapper(iname); String *wname = Swig_name_wrapper(iname); if (CPlusPlus) { Insert(wname, 0, "VALUEFUNC("); Append(wname, ")"); } if (current != NO_CPP) iname = klass->strip(iname); if (Getattr(special_methods, iname)) { iname = GetChar(special_methods, iname); } String *s = NewString(""); String *temp = NewString(""); #ifdef SWIG_PROTECTED_TARGET_METHODS const char *rb_define_method = is_public(n) ? "rb_define_method" : "rb_define_protected_method"; #else const char *rb_define_method = "rb_define_method"; #endif switch (current) { case MEMBER_FUNC: { if (multipleInheritance) { Printv(klass->init, tab4, rb_define_method, "(", klass->mImpl, ", \"", iname, "\", ", wname, ", -1);\n", NIL); } else { Printv(klass->init, tab4, rb_define_method, "(", klass->vname, ", \"", iname, "\", ", wname, ", -1);\n", NIL); } } break; case CONSTRUCTOR_ALLOCATE: Printv(s, tab4, "rb_define_alloc_func(", klass->vname, ", ", alloc_func, ");\n", NIL); Replaceall(klass->init, "$allocator", s); break; case CONSTRUCTOR_INITIALIZE: Printv(s, tab4, rb_define_method, "(", klass->vname, ", \"initialize\", ", wname, ", -1);\n", NIL); Replaceall(klass->init, "$initializer", s); break; case MEMBER_VAR: Append(temp, iname); /* Check for _set or _get at the end of the name. */ if (Len(temp) > 4) { const char *p = Char(temp) + (Len(temp) - 4); if (strcmp(p, "_set") == 0) { Delslice(temp, Len(temp) - 4, DOH_END); Append(temp, "="); } else if (strcmp(p, "_get") == 0) { Delslice(temp, Len(temp) - 4, DOH_END); } } if (multipleInheritance) { Printv(klass->init, tab4, "rb_define_method(", klass->mImpl, ", \"", temp, "\", ", wname, ", -1);\n", NIL); } else { Printv(klass->init, tab4, "rb_define_method(", klass->vname, ", \"", temp, "\", ", wname, ", -1);\n", NIL); } break; case STATIC_FUNC: Printv(klass->init, tab4, "rb_define_singleton_method(", klass->vname, ", \"", iname, "\", ", wname, ", -1);\n", NIL); break; case NO_CPP: if (!useGlobalModule) { Printv(s, tab4, "rb_define_module_function(", modvar, ", \"", iname, "\", ", wname, ", -1);\n", NIL); Printv(f_init, s, NIL); } else { Printv(s, tab4, "rb_define_global_function(\"", iname, "\", ", wname, ", -1);\n", NIL); Printv(f_init, s, NIL); } break; case DESTRUCTOR: case CLASS_CONST: case STATIC_VAR: default: assert(false); // Should not have gotten here for these types } defineAliases(n, iname); Delete(temp); Delete(s); Delete(wname); Delete(alloc_func); } /* --------------------------------------------------------------------- * applyInputTypemap() * * Look up the appropriate "in" typemap for this parameter (p), * substitute the correct strings for the $target and $input typemap * parameters, and dump the resulting code to the wrapper file. * --------------------------------------------------------------------- */ Parm *applyInputTypemap(Parm *p, String *ln, String *source, Wrapper *f, String *symname) { String *tm; SwigType *pt = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$target", ln); Replaceall(tm, "$source", source); Replaceall(tm, "$input", source); Replaceall(tm, "$symname", symname); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Setattr(p, "emit:input", Copy(source)); Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } return p; } Parm *skipIgnoredArgs(Parm *p) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } return p; } /* --------------------------------------------------------------------- * marshalInputArgs() * * Process all of the arguments passed into the scripting language * method and convert them into C/C++ function arguments using the * supplied typemaps. * --------------------------------------------------------------------- */ void marshalInputArgs(Node *n, ParmList *l, int numarg, int numreq, String *kwargs, bool allow_kwargs, Wrapper *f) { int i; Parm *p; String *tm; String *source; String *target; source = NewString(""); target = NewString(""); bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n)); /** * The 'start' value indicates which of the C/C++ function arguments * produced here corresponds to the first value in Ruby's argv[] array. * The value of start is either zero or one. If start is zero, then * the first argument (with name arg1) is based on the value of argv[0]. * If start is one, then arg1 is based on the value of argv[1]. */ int start = (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) ? 1 : 0; int varargs = emit_isvarargs(l); Printf(kwargs, "{ "); for (i = 0, p = l; i < numarg; i++) { p = skipIgnoredArgs(p); String *pn = Getattr(p, "name"); String *ln = Getattr(p, "lname"); /* Produce string representation of source argument */ Clear(source); /* First argument is a special case */ if (i == 0) { Printv(source, (start == 0) ? "argv[0]" : "self", NIL); } else { Printf(source, "argv[%d]", i - start); } /* Produce string representation of target argument */ Clear(target); Printf(target, "%s", Char(ln)); if (i >= (numreq)) { /* Check if parsing an optional argument */ Printf(f->code, " if (argc > %d) {\n", i - start); } /* Record argument name for keyword argument handling */ if (Len(pn)) { Printf(kwargs, "\"%s\",", pn); } else { Printf(kwargs, "\"arg%d\",", i + 1); } /* Look for an input typemap */ p = applyInputTypemap(p, ln, source, f, Getattr(n, "name")); if (i >= numreq) { Printf(f->code, "}\n"); } } /* Finish argument marshalling */ Printf(kwargs, " NULL }"); if (allow_kwargs) { // kwarg support not implemented // Printv(f->locals, tab4, "const char *kwnames[] = ", kwargs, ";\n", NIL); } /* Trailing varargs */ if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Clear(source); Printf(source, "argv[%d]", i - start); Replaceall(tm, "$input", source); Setattr(p, "emit:input", Copy(source)); Printf(f->code, "if (argc > %d) {\n", i - start); Printv(f->code, tm, "\n", NIL); Printf(f->code, "}\n"); } } Delete(source); Delete(target); } /* --------------------------------------------------------------------- * insertConstraintCheckingCode(ParmList *l, Wrapper *f) * * Checks each of the parameters in the parameter list for a "check" * typemap and (if it finds one) inserts the typemapping code into * the function wrapper. * --------------------------------------------------------------------- */ void insertConstraintCheckingCode(ParmList *l, Wrapper *f) { Parm *p; String *tm; for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } } /* --------------------------------------------------------------------- * insertCleanupCode(ParmList *l, String *cleanup) * * Checks each of the parameters in the parameter list for a "freearg" * typemap and (if it finds one) inserts the typemapping code into * the function wrapper. * --------------------------------------------------------------------- */ void insertCleanupCode(ParmList *l, String *cleanup) { String *tm; for (Parm *p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { if (Len(tm) != 0) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } } /* --------------------------------------------------------------------- * insertArgOutputCode(ParmList *l, String *outarg, int& need_result) * * Checks each of the parameters in the parameter list for a "argout" * typemap and (if it finds one) inserts the typemapping code into * the function wrapper. * --------------------------------------------------------------------- */ void insertArgOutputCode(ParmList *l, String *outarg, int &need_result) { String *tm; for (Parm *p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "vresult"); Replaceall(tm, "$result", "vresult"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); need_result += 1; p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } } /* --------------------------------------------------------------------- * validIdentifier() * * Is this a valid identifier in the scripting language? * Ruby method names can include any combination of letters, numbers * and underscores. A Ruby method name may optionally end with * a question mark ("?"), exclamation point ("!") or equals sign ("="). * * Methods whose names end with question marks are, by convention, * predicate methods that return true or false (e.g. Array#empty?). * * Methods whose names end with exclamation points are, by convention, * called bang methods that modify the instance in place (e.g. Array#sort!). * * Methods whose names end with an equals sign are attribute setters * (e.g. Thread#critical=). * --------------------------------------------------------------------- */ virtual int validIdentifier(String *s) { char *c = Char(s); while (*c) { if (!(isalnum(*c) || (*c == '_') || (*c == '?') || (*c == '!') || (*c == '='))) return 0; c++; } return 1; } /* --------------------------------------------------------------------- * functionWrapper() * * Create a function declaration and register it with the interpreter. * --------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *nodeType; bool destructor; String *symname = Copy(Getattr(n, "sym:name")); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); int director_method = 0; String *tm; int need_result = 0; /* Ruby needs no destructor wrapper */ if (current == DESTRUCTOR) return SWIG_NOWRAP; nodeType = Getattr(n, "nodeType"); destructor = (!Cmp(nodeType, "destructor")); /* If the C++ class constructor is overloaded, we only want to * write out the "new" singleton method once since it is always * the same. (It's the "initialize" method that will handle the * overloading). */ if (current == CONSTRUCTOR_ALLOCATE && Swig_symbol_isoverloaded(n) && Getattr(n, "sym:nextSibling") != 0) return SWIG_OK; String *overname = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(symname, n)) return SWIG_ERROR; } String *cleanup = NewString(""); String *outarg = NewString(""); String *kwargs = NewString(""); Wrapper *f = NewWrapper(); /* Rename predicate methods */ if (GetFlag(n, "feature:predicate")) { Append(symname, "?"); } /* Rename bang methods */ if (GetFlag(n, "feature:bang")) { Append(symname, "!"); } /* Determine the name of the SWIG wrapper function */ String *wname = Swig_name_wrapper(symname); if (overname && current != CONSTRUCTOR_ALLOCATE) { Append(wname, overname); } /* Emit arguments */ if (current != CONSTRUCTOR_ALLOCATE) { emit_parameter_variables(l, f); } /* Attach standard typemaps */ if (current != CONSTRUCTOR_ALLOCATE) { emit_attach_parmmaps(l, f); } Setattr(n, "wrap:parms", l); /* Get number of arguments */ int numarg = emit_num_arguments(l); int numreq = emit_num_required(l); int varargs = emit_isvarargs(l); bool allow_kwargs = GetFlag(n, "feature:kwargs") ? true : false; bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n)); int start = (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) ? 1 : 0; /* Now write the wrapper function itself */ if (current == CONSTRUCTOR_ALLOCATE) { Printv(f->def, "SWIGINTERN VALUE\n", NIL); Printf(f->def, "#ifdef HAVE_RB_DEFINE_ALLOC_FUNC\n"); Printv(f->def, wname, "(VALUE self)\n", NIL); Printf(f->def, "#else\n"); Printv(f->def, wname, "(int argc, VALUE *argv, VALUE self)\n", NIL); Printf(f->def, "#endif\n"); Printv(f->def, "{\n", NIL); } else if (current == CONSTRUCTOR_INITIALIZE) { Printv(f->def, "SWIGINTERN VALUE\n", wname, "(int argc, VALUE *argv, VALUE self) {", NIL); if (!varargs) { Printf(f->code, "if ((argc < %d) || (argc > %d)) ", numreq - start, numarg - start); } else { Printf(f->code, "if (argc < %d) ", numreq - start); } Printf(f->code, "{rb_raise(rb_eArgError, \"wrong # of arguments(%%d for %d)\",argc); SWIG_fail;}\n", numreq - start); } else { if ( current == NO_CPP ) { String* docs = docstring(n, AUTODOC_FUNC); Printf(f_wrappers, "%s", docs); Delete(docs); } Printv(f->def, "SWIGINTERN VALUE\n", wname, "(int argc, VALUE *argv, VALUE self) {", NIL); if (!varargs) { Printf(f->code, "if ((argc < %d) || (argc > %d)) ", numreq - start, numarg - start); } else { Printf(f->code, "if (argc < %d) ", numreq - start); } Printf(f->code, "{rb_raise(rb_eArgError, \"wrong # of arguments(%%d for %d)\",argc); SWIG_fail;}\n", numreq - start); } /* Now walk the function parameter list and generate code */ /* to get arguments */ if (current != CONSTRUCTOR_ALLOCATE) { marshalInputArgs(n, l, numarg, numreq, kwargs, allow_kwargs, f); } // FIXME? if (ctor_director) { numarg--; numreq--; } /* Insert constraint checking code */ insertConstraintCheckingCode(l, f); /* Insert cleanup code */ insertCleanupCode(l, cleanup); /* Insert argument output code */ insertArgOutputCode(l, outarg, need_result); /* if the object is a director, and the method call originated from its * underlying Ruby object, resolve the call by going up the c++ * inheritance chain. otherwise try to resolve the method in Ruby. * without this check an infinite loop is set up between the director and * shadow class method calls. */ // NOTE: this code should only be inserted if this class is the // base class of a director class. however, in general we haven't // yet analyzed all classes derived from this one to see if they are // directors. furthermore, this class may be used as the base of // a director class defined in a completely different module at a // later time, so this test must be included whether or not directorbase // is true. we do skip this code if directors have not been enabled // at the command line to preserve source-level compatibility with // non-polymorphic swig. also, if this wrapper is for a smart-pointer // method, there is no need to perform the test since the calling object // (the smart-pointer) and the director object (the "pointee") are // distinct. director_method = is_member_director(n) && !is_smart_pointer() && !destructor; if (director_method) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Printf(f->code, "director = dynamic_cast(arg1);\n"); Wrapper_add_local(f, "upcall", "bool upcall = false"); Append(f->code, "upcall = (director && (director->swig_get_self() == self));\n"); } /* Now write code to make the function call */ if (current != CONSTRUCTOR_ALLOCATE) { if (current == CONSTRUCTOR_INITIALIZE) { Node *pn = Swig_methodclass(n); String *symname = Getattr(pn, "sym:name"); String *action = Getattr(n, "wrap:action"); if (directorsEnabled()) { String *classname = NewStringf("const char *classname SWIGUNUSED = \"%s::%s\"", module, symname); Wrapper_add_local(f, "classname", classname); } if (action) { SwigType *smart = Swig_cparse_smartptr(pn); String *result_name = NewStringf("%s%s", smart ? "smart" : "", Swig_cresult_name()); if (smart) { String *result_var = NewStringf("%s *%s = 0", SwigType_namestr(smart), result_name); Wrapper_add_local(f, result_name, result_var); Printf(action, "\n%s = new %s(%s);", result_name, SwigType_namestr(smart), Swig_cresult_name()); } Printf(action, "\nDATA_PTR(self) = %s;", result_name); if (GetFlag(pn, "feature:trackobjects")) { Printf(action, "\nSWIG_RubyAddTracking(%s, self);", result_name); } Delete(result_name); Delete(smart); } } /* Emit the function call */ if (director_method) { Printf(f->code, "try {\n"); } Setattr(n, "wrap:name", wname); Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); if (director_method) { Printf(actioncode, "} catch (Swig::DirectorException& e) {\n"); Printf(actioncode, " rb_exc_raise(e.getError());\n"); Printf(actioncode, " SWIG_fail;\n"); Printf(actioncode, "}\n"); } /* Return value if necessary */ if (SwigType_type(t) != T_VOID && current != CONSTRUCTOR_INITIALIZE) { need_result = 1; if (GetFlag(n, "feature:predicate")) { Printv(actioncode, tab4, "vresult = (", Swig_cresult_name(), " ? Qtrue : Qfalse);\n", NIL); } else { tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); actioncode = 0; if (tm) { Replaceall(tm, "$result", "vresult"); Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "vresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); else Replaceall(tm, "$owner", "0"); #if 1 // FIXME: this will not try to unwrap directors returned as non-director // base class pointers! /* New addition to unwrap director return values so that the original * Ruby object is returned instead. */ bool unwrap = false; String *decl = Getattr(n, "decl"); int is_pointer = SwigType_ispointer_return(decl); int is_reference = SwigType_isreference_return(decl); if (is_pointer || is_reference) { String *type = Getattr(n, "type"); Node *parent = Swig_methodclass(n); Node *modname = Getattr(parent, "module"); Node *target = Swig_directormap(modname, type); if (target) unwrap = true; } if (unwrap) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Printf(f->code, "director = dynamic_cast(%s);\n", Swig_cresult_name()); Printf(f->code, "if (director) {\n"); Printf(f->code, " vresult = director->swig_get_self();\n"); Printf(f->code, "} else {\n"); Printf(f->code, "%s\n", tm); Printf(f->code, "}\n"); director_method = 0; } else { Printf(f->code, "%s\n", tm); } #else Printf(f->code, "%s\n", tm); #endif Delete(tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s.\n", SwigType_str(t, 0)); } } } if (actioncode) { Append(f->code, actioncode); Delete(actioncode); } emit_return_variable(n, t, f); } /* Extra code needed for new and initialize methods */ if (current == CONSTRUCTOR_ALLOCATE) { Node *pn = Swig_methodclass(n); SwigType *smart = Swig_cparse_smartptr(pn); if (smart) SwigType_add_pointer(smart); String *classtype = smart ? smart : t; need_result = 1; Printf(f->code, "VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE%s);\n", Char(SwigType_manglestr(classtype))); Printf(f->code, "#ifndef HAVE_RB_DEFINE_ALLOC_FUNC\n"); Printf(f->code, "rb_obj_call_init(vresult, argc, argv);\n"); Printf(f->code, "#endif\n"); Delete(smart); } else if (current == CONSTRUCTOR_INITIALIZE) { need_result = 1; } else { if ( need_result > 1 ) { if ( SwigType_type(t) == T_VOID ) Printf(f->code, "vresult = rb_ary_new();\n"); else { Printf(f->code, "if (vresult == Qnil) vresult = rb_ary_new();\n"); Printf(f->code, "else vresult = SWIG_Ruby_AppendOutput( " "rb_ary_new(), vresult);\n"); } } } /* Dump argument output code; */ Printv(f->code, outarg, NIL); /* Dump the argument cleanup code */ int need_cleanup = (current != CONSTRUCTOR_ALLOCATE) && (Len(cleanup) != 0); if (need_cleanup) { Printv(f->code, cleanup, NIL); } /* Look for any remaining cleanup. This processes the %new directive */ if (current != CONSTRUCTOR_ALLOCATE && GetFlag(n, "feature:new")) { tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); Delete(tm); } } /* Special processing on return value. */ tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0); if (tm) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, NIL); Delete(tm); } if (director_method) { if ((tm = Swig_typemap_lookup("directorfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "vresult"); Printf(f->code, "%s\n", tm); } } /* Wrap things up (in a manner of speaking) */ if (need_result) { if (current == CONSTRUCTOR_ALLOCATE) { Printv(f->code, tab4, "return vresult;\n", NIL); } else if (current == CONSTRUCTOR_INITIALIZE) { Printv(f->code, tab4, "return self;\n", NIL); Printv(f->code, "fail:\n", NIL); if (need_cleanup) { Printv(f->code, cleanup, NIL); } Printv(f->code, tab4, "return Qnil;\n", NIL); } else { Wrapper_add_local(f, "vresult", "VALUE vresult = Qnil"); Printv(f->code, tab4, "return vresult;\n", NIL); Printv(f->code, "fail:\n", NIL); if (need_cleanup) { Printv(f->code, cleanup, NIL); } Printv(f->code, tab4, "return Qnil;\n", NIL); } } else { Printv(f->code, tab4, "return Qnil;\n", NIL); Printv(f->code, "fail:\n", NIL); if (need_cleanup) { Printv(f->code, cleanup, NIL); } Printv(f->code, tab4, "return Qnil;\n", NIL); } Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); /* Emit the function */ Wrapper_print(f, f_wrappers); /* Now register the function with the interpreter */ if (!Swig_symbol_isoverloaded(n)) { create_command(n, symname); } else { if (current == CONSTRUCTOR_ALLOCATE) { create_command(n, symname); } else { if (!Getattr(n, "sym:nextSibling")) dispatchFunction(n); } } Delete(kwargs); Delete(cleanup); Delete(outarg); DelWrapper(f); Delete(symname); return SWIG_OK; } /* ------------------------------------------------------------ * dispatchFunction() * ------------------------------------------------------------ */ void dispatchFunction(Node *n) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewString(""); String *dispatch = Swig_overload_dispatch(n, "return %s(nargs, args, self);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); Printv(f->def, "SWIGINTERN VALUE ", wname, "(int nargs, VALUE *args, VALUE self) {", NIL); Wrapper_add_local(f, "argc", "int argc"); bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n)); if (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) { Printf(tmp, "VALUE argv[%d]", maxargs + 1); } else { Printf(tmp, "VALUE argv[%d]", maxargs); } Wrapper_add_local(f, "argv", tmp); Wrapper_add_local(f, "ii", "int ii"); if (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) { maxargs += 1; Printf(f->code, "argc = nargs + 1;\n"); Printf(f->code, "argv[0] = self;\n"); Printf(f->code, "if (argc > %d) SWIG_fail;\n", maxargs); Printf(f->code, "for (ii = 1; (ii < argc); ++ii) {\n"); Printf(f->code, "argv[ii] = args[ii-1];\n"); Printf(f->code, "}\n"); } else { Printf(f->code, "argc = nargs;\n"); Printf(f->code, "if (argc > %d) SWIG_fail;\n", maxargs); Printf(f->code, "for (ii = 0; (ii < argc); ++ii) {\n"); Printf(f->code, "argv[ii] = args[ii];\n"); Printf(f->code, "}\n"); } Replaceall(dispatch, "$args", "nargs, args, self"); Printv(f->code, dispatch, "\n", NIL); // Generate prototype list, go to first node Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up // Constructors will be treated specially const bool isCtor = (!Cmp(Getattr(sibl, "nodeType"), "constructor")); const bool isMethod = ( Cmp(Getattr(sibl, "ismember"), "1") == 0 && (!isCtor) ); // Construct real method name String* methodName = NewString(""); if ( isMethod ) { // Sometimes a method node has no parent (SF#3034054). // This value is used in an exception message, so just skip the class // name in this case so at least we don't segfault. This is probably // just working around a problem elsewhere though. Node *parent_node = parentNode(sibl); if (parent_node) Printv( methodName, Getattr(parent_node,"sym:name"), ".", NIL ); } Append( methodName, Getattr(sibl,"sym:name" ) ); if ( isCtor ) Append( methodName, ".new" ); // Generate prototype list String *protoTypes = NewString(""); do { Append( protoTypes, "\n\" "); if (!isCtor) { SwigType *type = SwigType_str(Getattr(sibl, "type"), NULL); Printv(protoTypes, type, " ", NIL); Delete(type); } Printv(protoTypes, methodName, NIL ); Parm* p = Getattr(sibl, "wrap:parms"); if (p && (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) ) p = nextSibling(p); // skip self Append( protoTypes, "(" ); while(p) { Append( protoTypes, SwigType_str(Getattr(p,"type"), Getattr(p,"name")) ); if ( ( p = nextSibling(p)) ) Append(protoTypes, ", "); } Append( protoTypes, ")\\n\"" ); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Append(f->code, "fail:\n"); Printf(f->code, "Ruby_Format_OverloadedError( argc, %d, \"%s\", %s);\n", maxargs, methodName, protoTypes); Append(f->code, "\nreturn Qnil;\n"); Delete(methodName); Delete(protoTypes); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); create_command(n, Char(symname)); DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } /* --------------------------------------------------------------------- * variableWrapper() * --------------------------------------------------------------------- */ virtual int variableWrapper(Node *n) { String* docs = docstring(n, AUTODOC_GETTER); Printf(f_wrappers, "%s", docs); Delete(docs); char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *tm; String *getfname, *setfname; Wrapper *getf, *setf; const int assignable = is_assignable(n); // Determine whether virtual global variables shall be used // which have different getter and setter signatures, // see https://docs.ruby-lang.org/en/2.6.0/extension_rdoc.html#label-Global+Variables+Shared+Between+C+and+Ruby const bool use_virtual_var = (current == NO_CPP && useGlobalModule); getf = NewWrapper(); setf = NewWrapper(); /* create getter */ int addfail = 0; String *getname = Swig_name_get(NSPACE_TODO, iname); getfname = Swig_name_wrapper(getname); Setattr(n, "wrap:name", getfname); Printv(getf->def, "SWIGINTERN VALUE\n", getfname, "(", NIL); Printf(getf->def, (use_virtual_var) ? "ID id, VALUE *data" : "VALUE self"); Printf(getf->def, ") {"); Wrapper_add_local(getf, "_val", "VALUE _val"); tm = Swig_typemap_lookup("varout", n, name, 0); if (tm) { Replaceall(tm, "$result", "_val"); Replaceall(tm, "$target", "_val"); Replaceall(tm, "$source", name); /* Printv(getf->code,tm, NIL); */ addfail = emit_action_code(n, getf->code, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Printv(getf->code, tab4, "return _val;\n", NIL); if (addfail) { Append(getf->code, "fail:\n"); Append(getf->code, " return Qnil;\n"); } Append(getf->code, "}\n"); Wrapper_print(getf, f_wrappers); if (!assignable) { setfname = NewString("(rb_gvar_setter_t *)NULL"); } else { /* create setter */ String* docs = docstring(n, AUTODOC_SETTER); Printf(f_wrappers, "%s", docs); Delete(docs); String *setname = Swig_name_set(NSPACE_TODO, iname); setfname = Swig_name_wrapper(setname); Setattr(n, "wrap:name", setfname); Printf(setf->def, "SWIGINTERN "); if (use_virtual_var) { Printv(setf->def, "void\n", setfname, "(VALUE _val, ID id, VALUE *data) {", NIL); } else { Printv(setf->def, "VALUE\n", setfname, "(VALUE self, VALUE _val) {", NIL); } tm = Swig_typemap_lookup("varin", n, name, 0); if (tm) { Replaceall(tm, "$input", "_val"); Replaceall(tm, "$source", "_val"); Replaceall(tm, "$target", name); /* Printv(setf->code,tm,"\n",NIL); */ emit_action_code(n, setf->code, tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s\n", SwigType_str(t, 0)); } if (use_virtual_var) { Printf(setf->code, "fail:\n"); Printv(setf->code, tab4, "return;\n", NIL); } else { Printv(setf->code, tab4, "return _val;\n", NIL); Printf(setf->code, "fail:\n"); Printv(setf->code, tab4, "return Qnil;\n", NIL); } Printf(setf->code, "}\n"); Wrapper_print(setf, f_wrappers); Delete(setname); } /* define accessor methods */ Insert(getfname, 0, "VALUEFUNC("); Append(getfname, ")"); Insert(setfname, 0, (use_virtual_var) ? "SWIG_RUBY_VOID_ANYARGS_FUNC(" : "VALUEFUNC("); Append(setfname, ")"); String *s = NewString(""); switch (current) { case STATIC_VAR: /* C++ class variable */ Printv(s, tab4, "rb_define_singleton_method(", klass->vname, ", \"", klass->strip(iname), "\", ", getfname, ", 0);\n", NIL); if (assignable) { Printv(s, tab4, "rb_define_singleton_method(", klass->vname, ", \"", klass->strip(iname), "=\", ", setfname, ", 1);\n", NIL); } Printv(klass->init, s, NIL); break; default: /* C global variable */ /* wrapped in Ruby module attribute */ assert(current == NO_CPP); if (!useGlobalModule) { Printv(s, tab4, "rb_define_singleton_method(", modvar, ", \"", iname, "\", ", getfname, ", 0);\n", NIL); if (assignable) { Printv(s, tab4, "rb_define_singleton_method(", modvar, ", \"", iname, "=\", ", setfname, ", 1);\n", NIL); } } else { Printv(s, tab4, "rb_define_virtual_variable(\"$", iname, "\", ", getfname, ", ", setfname, ");\n", NIL); } Printv(f_init, s, NIL); Delete(s); break; } Delete(getname); Delete(getfname); Delete(setfname); DelWrapper(setf); DelWrapper(getf); return SWIG_OK; } /* --------------------------------------------------------------------- * validate_const_name(char *name) * * Validate constant name. * --------------------------------------------------------------------- */ char *validate_const_name(char *name, const char *reason) { if (!name || name[0] == '\0') return name; if (isupper(name[0])) return name; if (islower(name[0])) { name[0] = (char)toupper(name[0]); Swig_warning(WARN_RUBY_WRONG_NAME, input_file, line_number, "Wrong %s name (corrected to `%s')\n", reason, name); return name; } Swig_warning(WARN_RUBY_WRONG_NAME, input_file, line_number, "Wrong %s name %s\n", reason, name); return name; } /* --------------------------------------------------------------------- * constantWrapper() * --------------------------------------------------------------------- */ virtual int constantWrapper(Node *n) { Swig_require("constantWrapper", n, "*sym:name", "type", "value", NIL); char *iname = GetChar(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); if (current == CLASS_CONST) { iname = klass->strip(iname); } validate_const_name(iname, "constant"); SetChar(n, "sym:name", iname); /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); Printf(f_header, "static %s = %s;\n", SwigType_str(type, wname), value); value = Char(wname); } String *tm = Swig_typemap_lookup("constant", n, value, 0); if (!tm) tm = Swig_typemap_lookup("constcode", n, value, 0); if (tm) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", iname); Replaceall(tm, "$symname", iname); Replaceall(tm, "$value", value); if (current == CLASS_CONST) { if (multipleInheritance) { Replaceall(tm, "$module", klass->mImpl); Printv(klass->init, tm, "\n", NIL); } else { Replaceall(tm, "$module", klass->vname); Printv(klass->init, tm, "\n", NIL); } } else { if (!useGlobalModule) { Replaceall(tm, "$module", modvar); } else { Replaceall(tm, "$module", "rb_cObject"); } Printf(f_init, "%s\n", tm); } } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value %s = %s\n", SwigType_str(type, 0), value); } Swig_restore(n); return SWIG_OK; } /* ----------------------------------------------------------------------------- * classDeclaration() * * Records information about classes---even classes that might be defined in * other modules referenced by %import. * ----------------------------------------------------------------------------- */ virtual int classDeclaration(Node *n) { if (!Getattr(n, "feature:onlychildren")) { String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *namestr = SwigType_namestr(name); klass = RCLASS(classes, Char(namestr)); if (!klass) { klass = new RClass(); String *valid_name = NewString(symname ? symname : namestr); validate_const_name(Char(valid_name), "class"); klass->set_name(namestr, symname, valid_name); SET_RCLASS(classes, Char(namestr), klass); Delete(valid_name); } Delete(namestr); } return Language::classDeclaration(n); } /** * Process the comma-separated list of mixed-in module names (if any). */ void includeRubyModules(Node *n) { String *mixin = Getattr(n, "feature:mixin"); if (mixin) { List *modules = Split(mixin, ',', INT_MAX); if (modules && Len(modules) > 0) { Iterator mod = First(modules); while (mod.item) { if (Len(mod.item) > 0) { Printf(klass->init, "rb_include_module(%s, rb_eval_string(\"%s\"));\n", klass->vname, mod.item); } mod = Next(mod); } } Delete(modules); } } void handleBaseClasses(Node *n) { List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } while (base.item) { String *basename = Getattr(base.item, "name"); String *basenamestr = SwigType_namestr(basename); RClass *super = RCLASS(classes, Char(basenamestr)); Delete(basenamestr); if (super) { SwigType *btype = NewString(basename); SwigType_add_pointer(btype); SwigType_remember(btype); SwigType *smart = Swig_cparse_smartptr(base.item); if (smart) { SwigType_add_pointer(smart); SwigType_remember(smart); } String *bmangle = SwigType_manglestr(smart ? smart : btype); if (multipleInheritance) { Insert(bmangle, 0, "((swig_class *) SWIGTYPE"); Append(bmangle, "->clientdata)->mImpl"); Printv(klass->init, "rb_include_module(", klass->mImpl, ", ", bmangle, ");\n", NIL); } else { Insert(bmangle, 0, "((swig_class *) SWIGTYPE"); Append(bmangle, "->clientdata)->klass"); Replaceall(klass->init, "$super", bmangle); } Delete(bmangle); Delete(smart); Delete(btype); } base = Next(base); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } if (!multipleInheritance) { /* Warn about multiple inheritance for additional base class(es) */ while (base.item) { if (GetFlag(base.item, "feature:ignore")) { base = Next(base); continue; } String *proxyclassname = SwigType_str(Getattr(n, "classtypeobj"), 0); String *baseclassname = SwigType_str(Getattr(base.item, "name"), 0); Swig_warning(WARN_RUBY_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Ruby.\n", proxyclassname, baseclassname); base = Next(base); } } } } } /** * Check to see if a %markfunc was specified. */ void handleMarkFuncDirective(Node *n) { String *markfunc = Getattr(n, "feature:markfunc"); if (markfunc) { Printf(klass->init, "SwigClass%s.mark = (void (*)(void *)) %s;\n", klass->name, markfunc); } else { Printf(klass->init, "SwigClass%s.mark = 0;\n", klass->name); } } /** * Check to see if a %freefunc was specified. */ void handleFreeFuncDirective(Node *n) { String *freefunc = Getattr(n, "feature:freefunc"); if (freefunc) { Printf(klass->init, "SwigClass%s.destroy = (void (*)(void *)) %s;\n", klass->name, freefunc); } else { if (klass->destructor_defined) { Printf(klass->init, "SwigClass%s.destroy = (void (*)(void *)) free_%s;\n", klass->name, klass->mname); } } } /** * Check to see if tracking is enabled for this class. */ void handleTrackDirective(Node *n) { int trackObjects = GetFlag(n, "feature:trackobjects"); if (trackObjects) { Printf(klass->init, "SwigClass%s.trackObjects = 1;\n", klass->name); } else { Printf(klass->init, "SwigClass%s.trackObjects = 0;\n", klass->name); } } /* ---------------------------------------------------------------------- * classHandler() * ---------------------------------------------------------------------- */ virtual int classHandler(Node *n) { String* docs = docstring(n, AUTODOC_CLASS); Printf(f_wrappers, "%s", docs); Delete(docs); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *namestr = SwigType_namestr(name); // does template expansion klass = RCLASS(classes, Char(namestr)); assert(klass != 0); Delete(namestr); String *valid_name = NewString(symname); validate_const_name(Char(valid_name), "class"); Clear(klass->type); Printv(klass->type, Getattr(n, "classtype"), NIL); Printv(f_wrappers, "static swig_class SwigClass", valid_name, ";\n\n", NIL); Printv(klass->init, "\n", tab4, NIL); if (!useGlobalModule) { Printv(klass->init, klass->vname, " = rb_define_class_under(", modvar, ", \"", klass->name, "\", $super);\n", NIL); } else { Printv(klass->init, klass->vname, " = rb_define_class(\"", klass->name, "\", $super);\n", NIL); } if (multipleInheritance) { Printv(klass->init, klass->mImpl, " = rb_define_module_under(", klass->vname, ", \"Impl\");\n", NIL); } SwigType *tt = NewString(name); SwigType_add_pointer(tt); SwigType_remember(tt); SwigType *smart = Swig_cparse_smartptr(n); if (smart) { SwigType_add_pointer(smart); SwigType_remember(smart); } String *tm = SwigType_manglestr(smart ? smart : tt); Printf(klass->init, "SWIG_TypeClientData(SWIGTYPE%s, (void *) &SwigClass%s);\n", tm, valid_name); Delete(tm); Delete(smart); Delete(tt); Delete(valid_name); includeRubyModules(n); Printv(klass->init, "$allocator", NIL); Printv(klass->init, "$initializer", NIL); Language::classHandler(n); handleBaseClasses(n); handleMarkFuncDirective(n); handleFreeFuncDirective(n); handleTrackDirective(n); if (multipleInheritance) { Printv(klass->init, "rb_include_module(", klass->vname, ", ", klass->mImpl, ");\n", NIL); } String *s = NewString(""); Printv(s, tab4, "rb_undef_alloc_func(", klass->vname, ");\n", NIL); Replaceall(klass->init, "$allocator", s); Replaceall(klass->init, "$initializer", ""); if (GetFlag(n, "feature:exceptionclass")) { Replaceall(klass->init, "$super", "rb_eRuntimeError"); } else { Replaceall(klass->init, "$super", "rb_cObject"); } Delete(s); Printv(f_init, klass->init, NIL); klass = 0; return SWIG_OK; } /* ---------------------------------------------------------------------- * memberfunctionHandler() * * Method for adding C++ member function * * By default, we're going to create a function of the form : * * Foo_bar(this,args) * * Where Foo is the classname, bar is the member name and the this pointer * is explicitly attached to the beginning. * * The renaming only applies to the member function part, not the full * classname. * * --------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { current = MEMBER_FUNC; String* docs = docstring(n, AUTODOC_METHOD); Printf(f_wrappers, "%s", docs); Delete(docs); Language::memberfunctionHandler(n); current = NO_CPP; return SWIG_OK; } /* --------------------------------------------------------------------- * constructorHandler() * * Method for adding C++ member constructor * -------------------------------------------------------------------- */ void set_director_ctor_code(Node *n) { /* director ctor code is specific for each class */ Delete(director_prot_ctor_code); director_prot_ctor_code = NewString(""); Node *pn = Swig_methodclass(n); String *symname = Getattr(pn, "sym:name"); String *name = Copy(symname); char *cname = Char(name); if (cname) cname[0] = (char)toupper(cname[0]); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " rb_raise(rb_eNameError,\"accessing abstract class or protected constructor\"); \n", " return Qnil;\n", "}\n", NIL); Delete(director_ctor_code); director_ctor_code = NewString(""); Printv(director_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " $nondirector_new \n", "}\n", NIL); Delete(name); } virtual int constructorHandler(Node *n) { int use_director = Swig_directorclass(n); if (use_director) { set_director_ctor_code(n); } /* First wrap the allocate method */ current = CONSTRUCTOR_ALLOCATE; Swig_name_register("construct", "%n%c_allocate"); Language::constructorHandler(n); String* docs = docstring(n, AUTODOC_CTOR); Printf(f_wrappers, "%s", docs); Delete(docs); /* * If we're wrapping the constructor of a C++ director class, prepend a new parameter * to receive the scripting language object (e.g. 'self') * */ Swig_save("ruby:constructorHandler", n, "parms", NIL); if (use_director) { Parm *parms = Getattr(n, "parms"); Parm *self; String *name = NewString("self"); String *type = NewString("VALUE"); self = NewParm(type, name, n); Delete(type); Delete(name); Setattr(self, "lname", "Qnil"); if (parms) set_nextSibling(self, parms); Setattr(n, "parms", self); Setattr(n, "wrap:self", "1"); Delete(self); } /* Now do the instance initialize method */ current = CONSTRUCTOR_INITIALIZE; Swig_name_register("construct", "new_%n%c"); Language::constructorHandler(n); /* Restore original parameter list */ Delattr(n, "wrap:self"); Swig_restore(n); /* Done */ Swig_name_unregister("construct"); current = NO_CPP; klass->constructor_defined = 1; return SWIG_OK; } virtual int copyconstructorHandler(Node *n) { int use_director = Swig_directorclass(n); if (use_director) { set_director_ctor_code(n); } /* First wrap the allocate method */ current = CONSTRUCTOR_ALLOCATE; Swig_name_register("construct", "%n%c_allocate"); return Language::copyconstructorHandler(n); } /* --------------------------------------------------------------------- * destructorHandler() * -------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { /* Do no spit free function if user defined his own for this class */ Node *pn = Swig_methodclass(n); String *freefunc = Getattr(pn, "feature:freefunc"); if (freefunc) return SWIG_OK; current = DESTRUCTOR; Language::destructorHandler(n); freefunc = NewString(""); String *freebody = NewString(""); String *pname0 = Swig_cparm_name(0, 0); Printv(freefunc, "free_", klass->mname, NIL); Printv(freebody, "SWIGINTERN void\n", freefunc, "(void *self) {\n", NIL); Printv(freebody, tab4, klass->type, " *", pname0, " = (", klass->type, " *)self;\n", NIL); Printv(freebody, tab4, NIL); /* Check to see if object tracking is activated for the class that owns this destructor. */ if (GetFlag(pn, "feature:trackobjects")) { Printf(freebody, "SWIG_RubyRemoveTracking(%s);\n", pname0); Printv(freebody, tab4, NIL); } if (Extend) { String *wrap = Getattr(n, "wrap:code"); if (wrap) { Printv(f_wrappers, wrap, NIL); } /* Printv(freebody, Swig_name_destroy(name), "(", pname0, ")", NIL); */ Printv(freebody, Getattr(n, "wrap:action"), "\n", NIL); } else { String *action = Getattr(n, "wrap:action"); if (action) { Printv(freebody, action, "\n", NIL); } else { /* In the case swig emits no destroy function. */ if (CPlusPlus) Printf(freebody, "delete %s;\n", pname0); else Printf(freebody, "free((char*) %s);\n", pname0); } } Printv(freebody, "}\n\n", NIL); Printv(f_wrappers, freebody, NIL); klass->destructor_defined = 1; current = NO_CPP; Delete(freefunc); Delete(freebody); Delete(pname0); return SWIG_OK; } /* --------------------------------------------------------------------- * membervariableHandler() * * This creates a pair of functions to set/get the variable of a member. * -------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { String* docs = docstring(n, AUTODOC_GETTER); Printf(f_wrappers, "%s", docs); Delete(docs); if (is_assignable(n)) { String* docs = docstring(n, AUTODOC_SETTER); Printf(f_wrappers, "%s", docs); Delete(docs); } current = MEMBER_VAR; Language::membervariableHandler(n); current = NO_CPP; return SWIG_OK; } /* ----------------------------------------------------------------------- * staticmemberfunctionHandler() * * Wrap a static C++ function * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { String* docs = docstring(n, AUTODOC_STATICFUNC); Printf(f_wrappers, "%s", docs); Delete(docs); current = STATIC_FUNC; Language::staticmemberfunctionHandler(n); current = NO_CPP; return SWIG_OK; } /* ---------------------------------------------------------------------- * memberconstantHandler() * * Create a C++ constant * --------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { String* docs = docstring(n, AUTODOC_STATICFUNC); Printf(f_wrappers, "%s", docs); Delete(docs); current = CLASS_CONST; Language::memberconstantHandler(n); current = NO_CPP; return SWIG_OK; } /* --------------------------------------------------------------------- * staticmembervariableHandler() * --------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { String* docs = docstring(n, AUTODOC_GETTER); Printf(f_wrappers, "%s", docs); Delete(docs); if (is_assignable(n)) { String* docs = docstring(n, AUTODOC_SETTER); Printf(f_wrappers, "%s", docs); Delete(docs); } current = STATIC_VAR; Language::staticmembervariableHandler(n); current = NO_CPP; return SWIG_OK; } /* C++ director class generation */ virtual int classDirector(Node *n) { return Language::classDirector(n); } virtual int classDirectorInit(Node *n) { String *declaration; declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n"); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } virtual int classDirectorEnd(Node *n) { Printf(f_directors_h, "};\n\n"); return Language::classDirectorEnd(n); } /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ virtual int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("VALUE"); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) { }", classname, target, call); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(classname); Delete(supername); Delete(parms); return Language::classDirectorConstructor(n); } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ virtual int classDirectorDefaultConstructor(Node *n) { String *classname; Wrapper *w; classname = Swig_class_name(n); w = NewWrapper(); Printf(w->def, "SwigDirector_%s::SwigDirector_%s(VALUE self) : Swig::Director(self) { }", classname, classname); Wrapper_print(w, f_directors); DelWrapper(w); Printf(f_directors_h, " SwigDirector_%s(VALUE self);\n", classname); Delete(classname); return Language::classDirectorDefaultConstructor(n); } /* --------------------------------------------------------------- * exceptionSafeMethodCall() * * Emit a virtual director method to pass a method call on to the * underlying Ruby instance. * * --------------------------------------------------------------- */ void exceptionSafeMethodCall(String *className, Node *n, Wrapper *w, int argc, String *args, bool initstack) { Wrapper *body = NewWrapper(); Wrapper *rescue = NewWrapper(); String *methodName = Getattr(n, "sym:name"); String *bodyName = NewStringf("%s_%s_body", className, methodName); String *rescueName = NewStringf("%s_%s_rescue", className, methodName); String *depthCountName = NewStringf("%s_%s_call_depth", className, methodName); // Check for an exception typemap of some kind String *tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); } if ((tm != 0) && (Len(tm) > 0) && (Strcmp(tm, "1") != 0)) { // Declare a global to hold the depth count if (!Getattr(n, "sym:nextSibling")) { Printf(body->def, "static int %s = 0;\n", depthCountName); // Function body Printf(body->def, "VALUE %s(VALUE data) {\n", bodyName); Wrapper_add_localv(body, "args", "Swig::body_args *", "args", "= reinterpret_cast(data)", NIL); Wrapper_add_localv(body, Swig_cresult_name(), "VALUE", Swig_cresult_name(), "= Qnil", NIL); Printf(body->code, "%s++;\n", depthCountName); Printv(body->code, Swig_cresult_name(), " = rb_funcall2(args->recv, args->id, args->argc, args->argv);\n", NIL); Printf(body->code, "%s--;\n", depthCountName); Printv(body->code, "return ", Swig_cresult_name(), ";\n", NIL); Printv(body->code, "}", NIL); // Exception handler Printf(rescue->def, "VALUE %s(VALUE args, VALUE error) {\n", rescueName); Replaceall(tm, "$error", "error"); Printf(rescue->code, "%s--;\n", depthCountName); Printf(rescue->code, "if (%s == 0) ", depthCountName); Printv(rescue->code, Str(tm), "\n", NIL); Printv(rescue->code, "rb_exc_raise(error);\n", NIL); Printv(rescue->code, "return Qnil;\n", NIL); Printv(rescue->code, "}", NIL); } // Main code Wrapper_add_localv(w, "args", "Swig::body_args", "args", NIL); Wrapper_add_localv(w, "status", "int", "status", NIL); Printv(w->code, "args.recv = swig_get_self();\n", NIL); Printf(w->code, "args.id = rb_intern(\"%s\");\n", methodName); Printf(w->code, "args.argc = %d;\n", argc); if (argc > 0) { Printf(w->code, "args.argv = new VALUE[%d];\n", argc); for (int i = 0; i < argc; i++) { Printf(w->code, "args.argv[%d] = obj%d;\n", i, i); } } else { Printv(w->code, "args.argv = 0;\n", NIL); } Printf(w->code, "%s = rb_protect(PROTECTFUNC(%s), reinterpret_cast(&args), &status);\n", Swig_cresult_name(), bodyName); if ( initstack ) Printf(w->code, "SWIG_RELEASE_STACK;\n"); Printf(w->code, "if (status) {\n"); Printf(w->code, "VALUE lastErr = rb_gv_get(\"$!\");\n"); Printf(w->code, "%s(reinterpret_cast(&args), lastErr);\n", rescueName); Printf(w->code, "}\n"); if (argc > 0) { Printv(w->code, "delete [] args.argv;\n", NIL); } // Dump wrapper code Wrapper_print(body, f_directors_helpers); Wrapper_print(rescue, f_directors_helpers); } else { if (argc > 0) { Printf(w->code, "%s = rb_funcall(swig_get_self(), rb_intern(\"%s\"), %d%s);\n", Swig_cresult_name(), methodName, argc, args); } else { Printf(w->code, "%s = rb_funcall(swig_get_self(), rb_intern(\"%s\"), 0, Qnil);\n", Swig_cresult_name(), methodName); } if ( initstack ) Printf(w->code, "SWIG_RELEASE_STACK;\n"); } // Clean up Delete(bodyName); Delete(rescueName); Delete(depthCountName); DelWrapper(body); DelWrapper(rescue); } virtual int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); String *returntype = Getattr(n, "type"); Parm *p; String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; bool asvoid = checkAttribute( n, "feature:numoutputs", "0") ? true : false; bool initstack = checkAttribute( n, "feature:initstack", "1") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } String *overnametmp = NewString(Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Printf(overnametmp, "::%s", Getattr(n, "sym:overname")); } /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0)); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); if (initstack && !(ignored_method && !pure_virtual)) { Append(w->def, "\nSWIG_INIT_STACK;\n"); } /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> Ruby) */ String *arglist = NewString(""); Swig_director_parms_fixup(l); Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("directorargout", l, w); char source[256]; int outputs = 0; if (!is_void && !asvoid) outputs++; /* build argument list and type conversion string */ idx = 0; p = l; while ( p ) { if (Getattr(p, "tmap:ignore")) { p = Getattr(p, "tmap:ignore:next"); continue; } if (Getattr(p, "tmap:directorargout") != 0) outputs++; if ( checkAttribute( p, "tmap:in:numinputs", "0") ) { p = Getattr(p, "tmap:in:next"); continue; } String *parameterName = Getattr(p, "name"); String *parameterType = Getattr(p, "type"); Putc(',', arglist); if ((tm = Getattr(p, "tmap:directorin")) != 0) { sprintf(source, "obj%d", idx++); String *input = NewString(source); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Replaceall(tm, "$owner", "0"); Delete(input); Printv(wrap_args, tm, "\n", NIL); Wrapper_add_localv(w, source, "VALUE", source, "= Qnil", NIL); Printv(arglist, source, NIL); p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(parameterType, "void")) { /** * Special handling for pointers to other C++ director classes. * Ideally this would be left to a typemap, but there is currently no * way to selectively apply the dynamic_cast<> to classes that have * directors. In other words, the type "SwigDirector_$1_lname" only exists * for classes with directors. We avoid the problem here by checking * module.wrap::directormap, but it's not clear how to get a typemap to * do something similar. Perhaps a new default typemap (in addition * to SWIGTYPE) called DIRECTORTYPE? */ if (SwigType_ispointer(parameterType) || SwigType_isreference(parameterType)) { Node *modname = Getattr(parent, "module"); Node *target = Swig_directormap(modname, parameterType); sprintf(source, "obj%d", idx++); String *nonconst = 0; /* strip pointer/reference --- should move to Swig/stype.c */ String *nptype = NewString(Char(parameterType) + 2); /* name as pointer */ String *ppname = Copy(parameterName); if (SwigType_isreference(parameterType)) { Insert(ppname, 0, "&"); } /* if necessary, cast away const since Ruby doesn't support it! */ if (SwigType_isconst(nptype)) { nonconst = NewStringf("nc_tmp_%s", parameterName); String *nonconst_i = NewStringf("= const_cast< %s >(%s)", SwigType_lstr(parameterType, 0), ppname); Wrapper_add_localv(w, nonconst, SwigType_lstr(parameterType, 0), nonconst, nonconst_i, NIL); Delete(nonconst_i); Swig_warning(WARN_LANG_DISCARD_CONST, input_file, line_number, "Target language argument '%s' discards const in director method %s::%s.\n", SwigType_str(parameterType, parameterName), SwigType_namestr(c_classname), SwigType_namestr(name)); } else { nonconst = Copy(ppname); } Delete(nptype); Delete(ppname); String *mangle = SwigType_manglestr(parameterType); if (target) { String *director = NewStringf("director_%s", mangle); Wrapper_add_localv(w, director, "Swig::Director *", director, "= 0", NIL); Wrapper_add_localv(w, source, "VALUE", source, "= Qnil", NIL); Printf(wrap_args, "%s = dynamic_cast(%s);\n", director, nonconst); Printf(wrap_args, "if (!%s) {\n", director); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Printf(wrap_args, "} else {\n"); Printf(wrap_args, "%s = %s->swig_get_self();\n", source, director); Printf(wrap_args, "}\n"); Delete(director); Printv(arglist, source, NIL); } else { Wrapper_add_localv(w, source, "VALUE", source, "= Qnil", NIL); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); //Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE_p_%s, 0);\n", // source, nonconst, base); Printv(arglist, source, NIL); } Delete(mangle); Delete(nonconst); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(parameterType, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } } p = nextSibling(p); } /* declare Ruby return value */ String *value_result = NewStringf("VALUE SWIGUNUSED %s", Swig_cresult_name()); Wrapper_add_local(w, Swig_cresult_name(), value_result); Delete(value_result); /* wrap complex arguments to VALUEs */ Printv(w->code, wrap_args, NIL); /* pass the method call on to the Ruby object */ exceptionSafeMethodCall(classname, n, w, idx, arglist, initstack); /* * Ruby method may return a simple object, or an Array of objects. * For in/out arguments, we have to extract the appropriate VALUEs from the Array, * then marshal everything back to C/C++ (return value and output arguments). */ /* Marshal return value and other outputs (if any) from VALUE to C/C++ type */ String *cleanup = NewString(""); String *outarg = NewString(""); if (outputs > 1) { Wrapper_add_local(w, "output", "VALUE output"); Printf(w->code, "if (TYPE(%s) != T_ARRAY) {\n", Swig_cresult_name()); Printf(w->code, "Ruby_DirectorTypeMismatchException(\"Ruby method failed to return an array.\");\n"); Printf(w->code, "}\n"); } idx = 0; /* Marshal return value */ if (!is_void) { tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { if (outputs > 1 && !asvoid ) { Printf(w->code, "output = rb_ary_entry(%s, %d);\n", Swig_cresult_name(), idx++); Replaceall(tm, "$input", "output"); } else { Replaceall(tm, "$input", Swig_cresult_name()); } /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } /* Marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { if (outputs > 1) { Printf(w->code, "output = rb_ary_entry(%s, %d);\n", Swig_cresult_name(), idx++); Replaceall(tm, "$result", "output"); } else { Replaceall(tm, "$result", Swig_cresult_name()); } Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(arglist); Delete(cleanup); Delete(outarg); } /* any existing helper functions to handle this? */ if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } Printf(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } virtual int classDirectorConstructors(Node *n) { return Language::classDirectorConstructors(n); } virtual int classDirectorMethods(Node *n) { return Language::classDirectorMethods(n); } virtual int classDirectorDisown(Node *n) { return Language::classDirectorDisown(n); } String *runtimeCode() { String *s = NewString(""); String *shead = Swig_include_sys("rubyhead.swg"); if (!shead) { Printf(stderr, "*** Unable to open 'rubyhead.swg'\n"); } else { Append(s, shead); Delete(shead); } String *serrors = Swig_include_sys("rubyerrors.swg"); if (!serrors) { Printf(stderr, "*** Unable to open 'rubyerrors.swg'\n"); } else { Append(s, serrors); Delete(serrors); } String *strack = Swig_include_sys("rubytracking.swg"); if (!strack) { Printf(stderr, "*** Unable to open 'rubytracking.swg'\n"); } else { Append(s, strack); Delete(strack); } String *sapi = Swig_include_sys("rubyapi.swg"); if (!sapi) { Printf(stderr, "*** Unable to open 'rubyapi.swg'\n"); } else { Append(s, sapi); Delete(sapi); } String *srun = Swig_include_sys("rubyrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'rubyrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigrubyrun.h"); } /*---------------------------------------------------------------------- * kwargsSupport() *--------------------------------------------------------------------*/ bool kwargsSupport() const { // kwargs support isn't actually implemented, but changing to return false may break something now as it turns on compactdefaultargs return true; } }; /* class RUBY */ /* ----------------------------------------------------------------------------- * swig_ruby() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_ruby() { return new RUBY(); } extern "C" Language *swig_ruby(void) { return new_swig_ruby(); } /* * Local Variables: * c-basic-offset: 2 * End: */ swig-4.0.2/Source/Modules/r.cxx0000644000175000017500000025150513667507523016227 0ustar williamwilliam /* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * r.cxx * * R language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" static String* replaceInitialDash(const String *name) { String *retval; if (!Strncmp(name, "_", 1)) { retval = Copy(name); Insert(retval, 0, "s"); } else { retval = Copy(name); } return retval; } static String * getRTypeName(SwigType *t, int *outCount = NULL) { String *b = SwigType_base(t); List *els = SwigType_split(t); int count = 0; int i; if(Strncmp(b, "struct ", 7) == 0) Replace(b, "struct ", "", DOH_REPLACE_FIRST); for(i = 0; i < Len(els); i++) { String *el = Getitem(els, i); if(Strcmp(el, "p.") == 0 || Strncmp(el, "a(", 2) == 0) { count++; Append(b, "Ref"); } } if(outCount) *outCount = count; String *tmp = NewString(""); char *retName = Char(SwigType_manglestr(t)); Insert(tmp, 0, retName); return tmp; } /* -------------------------------------------------------------- * Tries to get the resolved name, with options of adding * or removing a layer of references. Take care not * to request both * --------------------------------------------------------------*/ static String *getRClassName(String *retType, int deRef=0, int upRef=0) { SwigType *resolved = SwigType_typedef_resolve_all(retType); int ispointer = SwigType_ispointer(resolved); int isreference = SwigType_isreference(resolved); if (upRef) { SwigType_add_pointer(resolved); } if (deRef) { if (ispointer) { SwigType_del_pointer(resolved); } if (isreference) { SwigType_del_reference(resolved); } } String *tmp = NewString(""); Insert(tmp, 0, Char(SwigType_manglestr(resolved))); return(tmp); } /* -------------------------------------------------------------- * Tries to get the name of the R class corresponding to the given type * e.g. struct A * is ARef, struct A** is ARefRef. * Now handles arrays, i.e. struct A[2] * --------------------------------------------------------------*/ static String * getRClassNameCopyStruct(String *retType, int addRef) { String *tmp = NewString(""); List *l = SwigType_split(retType); int n = Len(l); if(!l || n == 0) { #ifdef R_SWIG_VERBOSE Printf(stdout, "SwigType_split return an empty list for %s\n", retType); #endif return(tmp); } String *el = Getitem(l, n-1); char *ptr = Char(el); if(strncmp(ptr, "struct ", 7) == 0) ptr += 7; Printf(tmp, "%s", ptr); if(addRef) { for(int i = 0; i < n; i++) { if(Strcmp(Getitem(l, i), "p.") == 0 || Strncmp(Getitem(l, i), "a(", 2) == 0) Printf(tmp, "Ref"); } } return tmp; } /* ------------------------------------------------------------- * Write the elements of a list to the File*, one element per line. * If quote is true, surround the element with "element". * This takes care of inserting a tab in front of each line and also * a comma after each element, except the last one. * --------------------------------------------------------------*/ static void writeListByLine(List *l, File *out, bool quote = 0) { int i, n = Len(l); for(i = 0; i < n; i++) Printf(out, "%s%s%s%s%s\n", tab8, quote ? "\"" :"", Getitem(l, i), quote ? "\"" :"", i < n-1 ? "," : ""); } static const char *usage = "\ R Options (available with -r)\n\ -copystruct - Emit R code to copy C structs (on by default)\n\ -debug - Output debug\n\ -dll - Name of the DLL (without the .dll or .so suffix).\n\ Default is the module name.\n\ -gc - Aggressive garbage collection\n\ -memoryprof - Add memory profile\n\ -namespace - Output NAMESPACE file\n\ -no-init-code - Turn off the generation of the R_init_ code\n\ (registration information still generated)\n\ -package - Package name for the PACKAGE argument of the R .Call()\n\ invocations. Default is the module name.\n\ "; /* ------------------------------------------------------------- * Display the help for this module on the screen/console. * --------------------------------------------------------------*/ static void showUsage() { fputs(usage, stdout); } static bool expandTypedef(SwigType *t) { if (SwigType_isenum(t)) return false; String *prefix = SwigType_prefix(t); if (Strncmp(prefix, "f", 1)) return false; if (Strncmp(prefix, "p.f", 3)) return false; return true; } /* ------------------------------------------------------------- * Determine whether we should add a .copy argument to the S function * that wraps/interfaces to the routine that returns the given type. * --------------------------------------------------------------*/ static int addCopyParameter(SwigType *type) { int ok = 0; ok = Strncmp(type, "struct ", 7) == 0 || Strncmp(type, "p.struct ", 9) == 0; if(!ok) { ok = Strncmp(type, "p.", 2); } return(ok); } static void replaceRClass(String *tm, SwigType *type) { String *tmp = getRClassName(type, 0, 0); String *tmp_base = getRClassName(type, 1, 0); String *tmp_ref = getRClassName(type, 0, 1); Replaceall(tm, "$R_class", tmp); Replaceall(tm, "$*R_class", tmp_base); Replaceall(tm, "$&R_class", tmp_ref); Delete(tmp); Delete(tmp_base); Delete(tmp_ref); } class R : public Language { public: R(); void registerClass(Node *n); void main(int argc, char *argv[]); int top(Node *n); void dispatchFunction(Node *n); int functionWrapper(Node *n); int constantWrapper(Node *n); int variableWrapper(Node *n); int classDeclaration(Node *n); int enumDeclaration(Node *n); String *enumValue(Node *n); virtual int enumvalueDeclaration(Node *n); int membervariableHandler(Node *n); int typedefHandler(Node *n); static List *Swig_overload_rank(Node *n, bool script_lang_wrapping); int memberfunctionHandler(Node *n) { if (debugMode) Printf(stdout, " %s %s\n", Getattr(n, "name"), Getattr(n, "type")); member_name = Getattr(n, "sym:name"); processing_class_member_function = 1; int status = Language::memberfunctionHandler(n); processing_class_member_function = 0; return status; } /* Grab the name of the current class being processed so that we can deal with members of that class. */ int classHandler(Node *n){ if(!ClassMemberTable) ClassMemberTable = NewHash(); class_name = Getattr(n, "name"); int status = Language::classHandler(n); class_name = NULL; return status; } // Not used: String *runtimeCode(); protected: int addRegistrationRoutine(String *rname, int nargs); int outputRegistrationRoutines(File *out); int outputCommandLineArguments(File *out); int generateCopyRoutines(Node *n); int DumpCode(Node *n); int OutputMemberReferenceMethod(String *className, int isSet, List *memberList, List *nameList, List *typeList, File *out); int defineArrayAccessors(SwigType *type); void addNamespaceFunction(String *name) { if(!namespaceFunctions) namespaceFunctions = NewList(); Append(namespaceFunctions, name); } void addNamespaceMethod(String *name) { if(!namespaceMethods) namespaceMethods = NewList(); Append(namespaceMethods, name); } String* processType(SwigType *t, Node *n, int *nargs = NULL); String *createFunctionPointerHandler(SwigType *t, Node *n, int *nargs); int addFunctionPointerProxy(String *name, Node *n, SwigType *t, String *s_paramTypes) { /*XXX Do we need to put the t in there to get the return type later. */ if(!functionPointerProxyTable) functionPointerProxyTable = NewHash(); Setattr(functionPointerProxyTable, name, n); Setattr(SClassDefs, name, name); Printv(s_classes, "setClass('", name, "',\n", tab8, "prototype = list(parameterTypes = c(", s_paramTypes, "),\n", tab8, tab8, tab8, "returnType = '", SwigType_manglestr(t), "'),\n", tab8, "contains = 'CRoutinePointer')\n\n##\n", NIL); return SWIG_OK; } void addSMethodInfo(String *name, String *argType, int nargs); // Simple initialization such as constant strings that can be reused. void init(); void addAccessor(String *memberName, Wrapper *f, String *name, String *methodSetGet); static int getFunctionPointerNumArgs(Node *n, SwigType *tt); // filtering of class member lists by function type. Used in constructing accessors // are we allowed to use stl style functors to customise this? List* filterMemberList(List *class_member_function_types, List *class_member_other, String *R_MEMBER, bool equal); protected: bool copyStruct; bool memoryProfile; bool aggressiveGc; // Strings into which we cumulate the generated code that is to be written //vto the files. String *enum_values; String *enum_def_calls; String *sfile; String *f_init; String *s_classes; String *f_begin; String *f_runtime; String *f_wrapper; String *s_header; String *f_wrappers; String *s_init; String *s_init_routine; String *s_namespace; // State variables that carry information across calls to functionWrapper() // from member accessors and class declarations. String *opaqueClassDeclaration; int processing_variable; int processing_member_access_function; String *member_name; String *class_name; String *R_MEMBER_NORMAL; String *R_MEMBER_SET; String *R_MEMBER_GET; int processing_class_member_function; // Spread out the lists so that they are simpler to process // by storing the type of the method (i.e. set, get or nothing) // and having separate lists for name, membername and wrapper List *class_member_function_types; List *class_member_function_names; List *class_member_function_membernames; List *class_member_function_wrappernames; /* */ Hash *ClassMemberTable; Hash *ClassMethodsTable; Hash *SClassDefs; Hash *SMethodInfo; // Information about routines that are generated and to be registered with // R for dynamic lookup. Hash *registrationTable; Hash *functionPointerProxyTable; List *namespaceFunctions; List *namespaceMethods; List *namespaceClasses; // Probably can do this from ClassMemberTable. // Store a copy of the command line. // Need only keep a string that has it formatted. char **Argv; int Argc; bool inCPlusMode; // State variables that we remember from the command line settings // potentially that govern the code we generate. String *DllName; String *Rpackage; bool noInitializationCode; bool outputNamespaceInfo; String *UnProtectWrapupCode; // Static members static bool debugMode; }; R::R() : copyStruct(false), memoryProfile(false), aggressiveGc(false), enum_values(0), enum_def_calls(0), sfile(0), f_init(0), s_classes(0), f_begin(0), f_runtime(0), f_wrapper(0), s_header(0), f_wrappers(0), s_init(0), s_init_routine(0), s_namespace(0), opaqueClassDeclaration(0), processing_variable(0), processing_member_access_function(0), member_name(0), class_name(0), R_MEMBER_NORMAL(NewString("normal")), R_MEMBER_SET(NewString("set")), R_MEMBER_GET(NewString("get")), processing_class_member_function(0), class_member_function_types(0), class_member_function_names(0), class_member_function_membernames(0), class_member_function_wrappernames(0), ClassMemberTable(0), ClassMethodsTable(0), SClassDefs(0), SMethodInfo(0), registrationTable(0), functionPointerProxyTable(0), namespaceFunctions(0), namespaceMethods(0), namespaceClasses(0), Argv(0), Argc(0), inCPlusMode(false), DllName(0), Rpackage(0), noInitializationCode(false), outputNamespaceInfo(false), UnProtectWrapupCode(0) { } bool R::debugMode = false; int R::getFunctionPointerNumArgs(Node *n, SwigType *tt) { (void) tt; n = Getattr(n, "type"); if (debugMode) Printf(stdout, "type: %s\n", n); ParmList *parms = Getattr(n, "parms"); if (debugMode) Printf(stdout, "parms = %p\n", parms); return ParmList_len(parms); } void R::addSMethodInfo(String *name, String *argType, int nargs) { (void) argType; if(!SMethodInfo) SMethodInfo = NewHash(); if (debugMode) Printf(stdout, "[addMethodInfo] %s\n", name); Hash *tb = Getattr(SMethodInfo, name); if(!tb) { tb = NewHash(); Setattr(SMethodInfo, name, tb); } String *str = Getattr(tb, "max"); int max = -1; if(str) max = atoi(Char(str)); if(max < nargs) { if(str) Delete(str); str = NewStringf("%d", max); Setattr(tb, "max", str); } } /* ---------------------------------------- * Returns the name of the new routine. * ------------------------------------------ */ String * R::createFunctionPointerHandler(SwigType *t, Node *n, int *numArgs) { String *funName = SwigType_manglestr(t); /* See if we have already processed this one. */ if(functionPointerProxyTable && Getattr(functionPointerProxyTable, funName)) return funName; if (debugMode) Printf(stdout, " Defining %s\n", t); SwigType *rettype = Copy(Getattr(n, "type")); SwigType *funcparams = SwigType_functionpointer_decompose(rettype); String *rtype = SwigType_str(rettype, 0); // ParmList *parms = Getattr(n, "parms"); // memory leak ParmList *parms = SwigType_function_parms(SwigType_del_pointer(Copy(t)), n); if (debugMode) { Printf(stdout, "Type: %s\n", t); Printf(stdout, "Return type: %s\n", SwigType_base(t)); } bool isVoidType = Strcmp(rettype, "void") == 0; if (debugMode) Printf(stdout, "%s is void ? %s (%s)\n", funName, isVoidType ? "yes" : "no", rettype); Wrapper *f = NewWrapper(); /* Go through argument list, attach lnames for arguments */ int i = 0; Parm *p = parms; for (i = 0; p; p = nextSibling(p), ++i) { String *arg = Getattr(p, "name"); String *lname; if (!arg && Cmp(Getattr(p, "type"), "void")) { lname = NewStringf("arg%d", i+1); Setattr(p, "name", lname); } else lname = arg; Setattr(p, "lname", lname); } Swig_typemap_attach_parms("out", parms, f); Swig_typemap_attach_parms("scoerceout", parms, f); Swig_typemap_attach_parms("scheck", parms, f); Printf(f->def, "%s %s(", rtype, funName); emit_parameter_variables(parms, f); emit_return_variable(n, rettype, f); // emit_attach_parmmaps(parms,f); /* Using weird name and struct to avoid potential conflicts. */ Wrapper_add_local(f, "r_swig_cb_data", "RCallbackFunctionData *r_swig_cb_data = R_SWIG_getCallbackFunctionData()"); String *lvar = NewString("r_swig_cb_data"); Wrapper_add_local(f, "r_tmp", "SEXP r_tmp"); // for use in converting arguments to R objects for call. Wrapper_add_local(f, "r_nprotect", "int r_nprotect = 0"); // for use in converting arguments to R objects for call. Wrapper_add_local(f, "r_vmax", "char * r_vmax= 0"); // for use in converting arguments to R objects for call. // Add local for error code in return value. This is not in emit_return_variable because that assumes an out typemap // whereas the type makes are reverse Wrapper_add_local(f, "ecode", "int ecode = 0"); p = parms; int nargs = ParmList_len(parms); if(numArgs) { *numArgs = nargs; if (debugMode) Printf(stdout, "Setting number of parameters to %d\n", *numArgs); } String *setExprElements = NewString(""); String *s_paramTypes = NewString(""); for(i = 0; p; i++) { SwigType *tt = Getattr(p, "type"); SwigType *name = Getattr(p, "name"); SwigType *swig_parm_name = NewStringf("swigarg_%s", name); String *tm = Getattr(p, "tmap:out"); bool isVoidParm = Strcmp(tt, "void") == 0; if (isVoidParm) Printf(f->def, "%s", SwigType_str(tt, 0)); else Printf(f->def, "%s %s", SwigType_str(tt, 0), swig_parm_name); if (tm) { String *lstr = SwigType_lstr(tt, 0); if (SwigType_isreference(tt) || SwigType_isrvalue_reference(tt)) { Printf(f->code, "%s = (%s) &%s;\n", Getattr(p, "lname"), lstr, swig_parm_name); } else if (!isVoidParm) { Printf(f->code, "%s = (%s) %s;\n", Getattr(p, "lname"), lstr, swig_parm_name); } Replaceall(tm, "$1", name); Replaceall(tm, "$result", "r_tmp"); if (debugMode) { Printf(stdout, "Calling Replace A: %s\n", Getattr(p,"type")); } replaceRClass(tm, Getattr(p,"type")); Replaceall(tm,"$owner", "0"); Delete(lstr); } Printf(setExprElements, "%s\n", tm); Printf(setExprElements, "SETCAR(r_swig_cb_data->el, %s);\n", "r_tmp"); Printf(setExprElements, "r_swig_cb_data->el = CDR(r_swig_cb_data->el);\n\n"); Printf(s_paramTypes, "'%s'", SwigType_manglestr(tt)); p = nextSibling(p); if(p) { Printf(f->def, ", "); Printf(s_paramTypes, ", "); } } Printf(f->def, ") {\n"); Printf(f->code, "Rf_protect(%s->expr = Rf_allocVector(LANGSXP, %d));\n", lvar, nargs + 1); Printf(f->code, "r_nprotect++;\n"); Printf(f->code, "r_swig_cb_data->el = r_swig_cb_data->expr;\n\n"); Printf(f->code, "SETCAR(r_swig_cb_data->el, r_swig_cb_data->fun);\n"); Printf(f->code, "r_swig_cb_data->el = CDR(r_swig_cb_data->el);\n\n"); Printf(f->code, "%s\n\n", setExprElements); Printv(f->code, "r_swig_cb_data->retValue = R_tryEval(", "r_swig_cb_data->expr,", " R_GlobalEnv,", " &r_swig_cb_data->errorOccurred", ");\n", NIL); Printv(f->code, "\n", "if(r_swig_cb_data->errorOccurred) {\n", "R_SWIG_popCallbackFunctionData(1);\n", "Rf_error(\"error in calling R function as a function pointer (", funName, ")\");\n", "}\n", NIL); if(!isVoidType) { /* Need to deal with the return type of the function pointer, not the function pointer itself. So build a new node that has the relevant pieces. XXX Have to be a little more clever so that we can deal with struct A * - the * is getting lost. Is this still true? If so, will a SwigType_push() solve things? */ Parm *bbase = NewParmNode(rettype, n); String *returnTM = Swig_typemap_lookup("in", bbase, Swig_cresult_name(), f); if(returnTM) { String *tm = returnTM; Replaceall(tm,"$input", "r_swig_cb_data->retValue"); Replaceall(tm,"$target", Swig_cresult_name()); replaceRClass(tm, rettype); Replaceall(tm,"$owner", "0"); Replaceall(tm,"$disown","0"); Printf(f->code, "%s\n", tm); } Delete(bbase); } Printv(f->code, "R_SWIG_popCallbackFunctionData(1);\n", NIL); Printv(f->code, "\n", UnProtectWrapupCode, NIL); if (SwigType_isreference(rettype)) { Printv(f->code, "return *", Swig_cresult_name(), ";\n", NIL); } else if (SwigType_isrvalue_reference(rettype)) { Printv(f->code, "return std::move(*", Swig_cresult_name(), ");\n", NIL); } else if (!isVoidType) { Printv(f->code, "return ", Swig_cresult_name(), ";\n", NIL); } Printv(f->code, "\n}\n", NIL); Replaceall(f->code, "SWIG_exception_fail", "SWIG_exception_noreturn"); /* To coerce correctly in S, we really want to have an extra/intermediate function that handles the scoerceout. We need to check if any of the argument types have an entry in that map. If none do, the ignore and call the function straight. Otherwise, generate a marshalling function. Need to be able to find it in S. Or use an entirely generic one that evaluates the expressions. Handle errors in the evaluation of the function by restoring the stack, if there is one in use for this function (i.e. no userData). */ Wrapper_print(f, f_wrapper); addFunctionPointerProxy(funName, n, t, s_paramTypes); Delete(s_paramTypes); Delete(rtype); Delete(rettype); Delete(funcparams); DelWrapper(f); return funName; } void R::init() { UnProtectWrapupCode = NewStringf("%s", "vmaxset(r_vmax);\nif(r_nprotect) Rf_unprotect(r_nprotect);\n\n"); SClassDefs = NewHash(); sfile = NewString(""); f_init = NewString(""); s_header = NewString(""); f_begin = NewString(""); f_runtime = NewString(""); f_wrapper = NewString(""); s_classes = NewString(""); s_init = NewString(""); s_init_routine = NewString(""); enum_def_calls = NewString(""); } /* ------------------------------------------------------------- * Method from Language that is called to start the entire * processing off, i.e. the generation of the code. * It is called after the input has been read and parsed. * Here we open the output streams and generate the code. * ------------------------------------------------------------- */ int R::top(Node *n) { String *module = Getattr(n, "name"); if (debugMode) { Printf(stdout, " %s\n", module); } if(!Rpackage) Rpackage = Copy(module); if(!DllName) DllName = Copy(module); if(outputNamespaceInfo) { s_namespace = NewString(""); Swig_register_filebyname("snamespace", s_namespace); Printf(s_namespace, "useDynLib(%s)\n", DllName); } // Register the naming functions Swig_name_register("wrapper", "R_swig_%f"); /* Associate the different streams with names so that they can be used in %insert directives by the typemap code. */ Swig_register_filebyname("sinit", s_init); Swig_register_filebyname("sinitroutine", s_init_routine); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("header", s_header); Swig_register_filebyname("wrapper", f_wrapper); Swig_register_filebyname("s", sfile); Swig_register_filebyname("sclasses", s_classes); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGR\n#define SWIGR\n#endif\n\n"); Swig_banner_target_lang(s_init, "#"); outputCommandLineArguments(s_init); Printf(f_wrapper, "#ifdef __cplusplus\n"); Printf(f_wrapper, "extern \"C\" {\n"); Printf(f_wrapper, "#endif\n\n"); Language::top(n); Printf(f_wrapper, "#ifdef __cplusplus\n"); Printf(f_wrapper, "}\n"); Printf(f_wrapper, "#endif\n"); String *type_table = NewString(""); SwigType_emit_type_table(f_runtime,f_wrapper); Delete(type_table); if(ClassMemberTable) { //XXX OutputClassAccessInfo(ClassMemberTable, sfile); Delete(ClassMemberTable); ClassMemberTable = NULL; } Printf(f_init,"}\n"); if(registrationTable) outputRegistrationRoutines(f_init); /* Now arrange to write the 2 files - .S and .c. */ DumpCode(n); Delete(sfile); Delete(s_classes); Delete(s_init); Delete(f_wrapper); Delete(f_init); Delete(s_header); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------- * Write the generated code to the .S and the .c files. * ------------------------------------------------------------- */ int R::DumpCode(Node *n) { String *output_filename = NewString(""); /* The name of the file in which we will generate the S code. */ Printf(output_filename, "%s%s.R", SWIG_output_directory(), Rpackage); #ifdef R_SWIG_VERBOSE Printf(stdout, "Writing S code to %s\n", output_filename); #endif File *scode = NewFile(output_filename, "w", SWIG_output_files()); if (!scode) { FileErrorDisplay(output_filename); SWIG_exit(EXIT_FAILURE); } Delete(output_filename); Printf(scode, "%s\n\n", s_init); Printf(scode, "%s\n\n", s_classes); Printf(scode, "%s\n", sfile); Printf(scode, "%s\n", enum_def_calls); Delete(scode); String *outfile = Getattr(n,"outfile"); File *runtime = NewFile(outfile,"w", SWIG_output_files()); if (!runtime) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", f_begin); Printf(runtime, "%s\n", f_runtime); Printf(runtime, "%s\n", s_header); Printf(runtime, "%s\n", f_wrapper); Printf(runtime, "%s\n", f_init); Delete(runtime); if(outputNamespaceInfo) { output_filename = NewString(""); Printf(output_filename, "%sNAMESPACE", SWIG_output_directory()); File *ns = NewFile(output_filename, "w", SWIG_output_files()); if (!ns) { FileErrorDisplay(output_filename); SWIG_exit(EXIT_FAILURE); } Delete(output_filename); Printf(ns, "%s\n", s_namespace); Printf(ns, "\nexport(\n"); writeListByLine(namespaceFunctions, ns); Printf(ns, ")\n"); Printf(ns, "\nexportMethods(\n"); writeListByLine(namespaceMethods, ns, 1); Printf(ns, ")\n"); Delete(ns); Delete(s_namespace); } return SWIG_OK; } List *R::filterMemberList(List *class_member_types, List *class_member_other, String *R_MEMBER, bool equal) { // filters class_member_other based on whether corresponding elements of // class_member_function_types are equal or notequal to R_MEMBER List *CM = NewList(); Iterator ftype, other; for (ftype = First(class_member_types), other = First(class_member_other); ftype.item; ftype=Next(ftype), other=Next(other)) { // verbose, clean up later if the overall structure works if (equal) { if (ftype.item == R_MEMBER) { Append(CM, other.item); } } else { if (ftype.item != R_MEMBER) { Append(CM, other.item); } } } return(CM); } # if 0 // not called /* ------------------------------------------------------------- * We may need to do more.... so this is left as a * stub for the moment. * -------------------------------------------------------------*/ int R::OutputClassAccessInfo(Hash *tb, File *out) { int n = OutputClassMemberTable(tb, out); OutputClassMethodsTable(out); return n; } /* ------------------------------------------------------------- * Currently this just writes the information collected about the * different methods of the C++ classes that have been processed * to the console. * This will be used later to define S4 generics and methods. * --------------------------------------------------------------*/ int R::OutputClassMethodsTable(File *) { Hash *tb = ClassMethodsTable; if(!tb) return SWIG_OK; List *keys = Keys(tb); String *key; int i, n = Len(keys); if (debugMode) { for(i = 0; i < n ; i++ ) { key = Getitem(keys, i); Printf(stdout, "%d) %s\n", i, key); List *els = Getattr(tb, key); int nels = Len(els); Printf(stdout, "\t"); for(int j = 0; j < nels; j+=2) { Printf(stdout, "%s%s", Getitem(els, j), j < nels - 1 ? ", " : ""); Printf(stdout, "%s\n", Getitem(els, j+1)); } Printf(stdout, "\n"); } } return SWIG_OK; } /* -------------------------------------------------------------- * Iterate over the _set and <>_get * elements and generate the $ and $<- functions * that provide constrained access to the member * fields in these elements. * tb - a hash table that is built up in functionWrapper * as we process each membervalueHandler. * The entries are indexed by _set and * _get. Each entry is a List *. * out - the stram where the code is to be written. This is the S * code stream as we generate only S code here. * --------------------------------------------------------------*/ int R::OutputClassMemberTable(Hash *tb, File *out) { List *keys = Keys(tb), *el; String *key; int i, n = Len(keys); /* Loop over all the _set and _get entries in the table. */ /* This function checks for names ending in _set - perhaps it should */ /* use attributes of some other form, as it potentially clashes with */ /* methods ending in _set */ if(n && outputNamespaceInfo) { Printf(s_namespace, "exportClasses("); } for(i = 0; i < n; i++) { key = Getitem(keys, i); el = Getattr(tb, key); String *className = Getitem(el, 0); char *ptr = Char(key); int klen = Len(key); int isSet = 0; if (klen > 4) { ptr = &ptr[klen - 4]; isSet = strcmp(ptr, "_set") == 0; } if(outputNamespaceInfo) Printf(s_namespace, "\"%s\"%s", className, i < n-1 ? "," : ""); } if(n && outputNamespaceInfo) { Printf(s_namespace, ")\n"); } return n; } // end not used #endif /* -------------------------------------------------------------- * Write the methods for $ or $<- for accessing a member field in an * struct or union (or class). * className - the name of the struct or union (e.g. Bar for struct Bar) * isSet - a logical value indicating whether the method is for * modifying ($<-) or accessing ($) the member field. * el - a list of length 2 * # accessible member elements + 1. * The first element is the name of the class. * The other pairs are member name and the name of the R function to access it. * out - the stream where we write the code. * --------------------------------------------------------------*/ int R::OutputMemberReferenceMethod(String *className, int isSet, List *memberList, List *nameList, List *typeList, File *out) { int numMems = Len(memberList), j; int varaccessor = 0; if (numMems == 0) return SWIG_OK; Wrapper *f = NewWrapper(), *attr = NewWrapper(); Printf(f->def, "function(x, name%s)", isSet ? ", value" : ""); Printf(attr->def, "function(x, i, j, ...%s)", isSet ? ", value" : ""); Printf(f->code, "{\n"); Printf(f->code, "%saccessorFuns = list(", tab8); Node *itemList = NewHash(); bool has_prev = false; for(j = 0; j < numMems; j++) { String *item = Getitem(memberList, j); String *dup = Getitem(nameList, j); String *setgetmethod = Getitem(typeList, j); if (setgetmethod == R_MEMBER_GET) varaccessor++; if (Getattr(itemList, item)) continue; Setattr(itemList, item, "1"); String *pitem; if (!Strcmp(item, "operator ()")) { pitem = NewString("call"); } else if (!Strcmp(item, "operator ->")) { pitem = NewString("deref"); } else if (!Strcmp(item, "operator +")) { pitem = NewString("add"); } else if (!Strcmp(item, "operator -")) { pitem = NewString("sub"); } else { pitem = Copy(item); } if (has_prev) Printf(f->code, ", "); Printf(f->code, "'%s' = %s", pitem, dup); has_prev = true; Delete(pitem); } Delete(itemList); Printf(f->code, ");\n"); if (!isSet && varaccessor > 0) { Printf(f->code, "%svaccessors = c(", tab8); bool first = true; for(j = 0; j < numMems; j++) { String *item = Getitem(memberList, j); String *setgetmethod = Getitem(typeList, j); // Check the type here instead of the name if (setgetmethod == R_MEMBER_GET) { Printf(f->code, "%s'%s'", first ? "" : ", ", item); first = false; } } Printf(f->code, ");\n"); } Printv(f->code, ";", tab8, "idx = pmatch(name, names(accessorFuns));\n", tab8, "if(is.na(idx)) \n", tab8, tab4, NIL); Printf(f->code, "return(callNextMethod(x, name%s));\n", isSet ? ", value" : ""); Printv(f->code, tab8, "f = accessorFuns[[idx]];\n", NIL); if(isSet) { Printv(f->code, tab8, "f(x, value);\n", NIL); Printv(f->code, tab8, "x;\n", NIL); // make certain to return the S value. } else { if (varaccessor) { Printv(f->code, tab8, "if (is.na(match(name, vaccessors))) function(...){f(x, ...)} else f(x);\n", NIL); } else { Printv(f->code, tab8, "function(...){f(x, ...)};\n", NIL); } } Printf(f->code, "}\n"); String *classname_str = SwigType_namestr(className); Printf(out, "# Start of accessor method for %s\n", classname_str); Printf(out, "setMethod('$%s', '_p%s', ", isSet ? "<-" : "", getRClassName(className)); Wrapper_print(f, out); Printf(out, ");\n"); if(isSet) { Printf(out, "setMethod('[[<-', c('_p%s', 'character'),", getRClassName(className)); Insert(f->code, 2, "name = i;\n"); Printf(attr->code, "%s", f->code); Wrapper_print(attr, out); Printf(out, ");\n"); } Printf(out, "# end of accessor method for %s\n", classname_str); Delete(classname_str); DelWrapper(attr); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------- * Called when a enumeration is to be processed. * We want to call the R function defineEnumeration(). * tdname is the typedef of the enumeration, i.e. giving its name. * --------------------------------------------------------------*/ int R::enumDeclaration(Node *n) { if (!ImportMode) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *symname = Getattr(n, "sym:name"); // TODO - deal with anonymous enumerations // Previous enum code for R didn't wrap them if (!symname || Getattr(n, "unnamedinstance")) return SWIG_NOWRAP; // create mangled name for the enum // This will have content if the %nspace feature is set on // the input file String *nspace = Getattr(n, "sym:nspace"); // NSpace/getNSpace() only works during Language::enumDeclaration call String *ename; String *name = Getattr(n, "name"); ename = getRClassName(name); if (debugMode) { Node *current_class = getCurrentClass(); String *cl = NewString(""); if (current_class) { cl = getEnumClassPrefix(); } Printf(stdout, "enumDeclaration: %s, %s, %s, %s, %s\n", name, symname, nspace, ename, cl); } Delete(name); // set up a call to create the R enum structure. The list of // individual elements will be built in enum_code enum_values = 0; // Emit each enum item Language::enumDeclaration(n); Printf(enum_def_calls, "defineEnumeration(\"%s\",\n .values=c(%s))\n\n", ename, enum_values); Delete(enum_values); Delete(ename); } return SWIG_OK; } /* ------------------------------------------------------------- * --------------------------------------------------------------*/ int R::enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) { Printf(stdout, "evd: Not public\n"); return SWIG_NOWRAP; } Swig_require("enumvalueDeclaration", n, "*name", "?value", NIL); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); Node *parent = parentNode(n); String *parent_name = Getattr(parent, "name"); String *newsymname = 0; String *tmpValue; // Strange hack from parent method if (value) tmpValue = NewString(value); else tmpValue = NewString(name); // Note that this is used in enumValue() amongst other places Setattr(n, "value", tmpValue); // Deal with enum values that are not int int swigtype = SwigType_type(Getattr(n, "type")); if (swigtype == T_BOOL) { const char *val = Equal(Getattr(n, "enumvalue"), "true") ? "1" : "0"; Setattr(n, "enumvalue", val); } else if (swigtype == T_CHAR) { String *val = NewStringf("'%s'", Getattr(n, "enumvalue")); Setattr(n, "enumvalue", val); Delete(val); } if (GetFlag(parent, "scopedenum")) { newsymname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); symname = newsymname; } { // Wrap C/C++ enums with constant integers or use the typesafe enum pattern SwigType *typemap_lookup_type = parent_name ? parent_name : NewString("enum "); if (debugMode) { Printf(stdout, "Setting type: %s\n", Copy(typemap_lookup_type)); } Setattr(n, "type", typemap_lookup_type); // Simple integer constants // Note these are always generated for anonymous enums, no matter what enum_feature is specified // Code generated is the same for SimpleEnum and TypeunsafeEnum -> the class it is generated into is determined later String *value = enumValue(n); if (enum_values) { Printf(enum_values, ",\n\"%s\" = %s", name, value); } else { enum_values = NewString(""); Printf(enum_values, "\"%s\" = %s", name, value); } Delete(value); } return SWIG_OK; } /* ------------------------------------------------------------- * Create accessor functions for variables. * Does not create equivalent wrappers for enumerations, * which are handled differently * --------------------------------------------------------------*/ int R::variableWrapper(Node *n) { String *name = Getattr(n, "sym:name"); if (debugMode) { Printf(stdout, "variableWrapper %s\n", n); } processing_variable = 1; Language::variableWrapper(n); // Force the emission of the _set and _get function wrappers. processing_variable = 0; SwigType *ty = Getattr(n, "type"); String *nodeType = nodeType(n); int addCopyParam = addCopyParameter(ty); //XXX processType(ty, n); if (nodeType && !Strcmp(nodeType, "enumitem")) { /* special wrapper for enums - don't want the R _set, _get functions*/ if (debugMode) { Printf(stdout, "variableWrapper enum branch\n"); } } else if(!SwigType_isconst(ty)) { Wrapper *f = NewWrapper(); Printf(f->def, "%s = \nfunction(value%s)\n{\n", name, addCopyParam ? ", .copy = FALSE" : ""); Printv(f->code, "if(missing(value)) {\n", name, "_get(", addCopyParam ? ".copy" : "", ")\n}", NIL); Printv(f->code, " else {\n", name, "_set(value)\n}\n}", NIL); Wrapper_print(f, sfile); DelWrapper(f); } else { Printf(sfile, "%s = %s_get\n", name, name); } return SWIG_OK; } /* ------------------------------------------------------------- * Creates accessor functions for class members. * ToDo - this version depends on naming conventions and needs * to be replaced. * --------------------------------------------------------------*/ void R::addAccessor(String *memberName, Wrapper *wrapper, String *name, String *methodSetGet) { if (!class_member_function_names) { class_member_function_names = NewList(); class_member_function_membernames = NewList(); class_member_function_wrappernames = NewList(); class_member_function_types = NewList(); } Append(class_member_function_types, methodSetGet); Append(class_member_function_names, name); Append(class_member_function_membernames, memberName); String *tmp = NewString(""); Wrapper_print(wrapper, tmp); Append(class_member_function_wrappernames, tmp); // if we could put the wrapper in directly: Append(l, Copy(sfun)); if (debugMode) Printf(stdout, "Adding accessor: %s (%s) => %s\n", memberName, name, tmp); } #define MAX_OVERLOAD 256 struct Overloaded { Node *n; /* Node */ int argc; /* Argument count */ ParmList *parms; /* Parameters used for overload check */ int error; /* Ambiguity error */ }; List * R::Swig_overload_rank(Node *n, bool script_lang_wrapping) { Overloaded nodes[MAX_OVERLOAD]; int nnodes = 0; Node *o = Getattr(n,"sym:overloaded"); if (!o) return 0; Node *c = o; while (c) { if (Getattr(c,"error")) { c = Getattr(c,"sym:nextSibling"); continue; } /* Make a list of all the declarations (methods) that are overloaded with * this one particular method name */ if (Getattr(c,"wrap:name")) { nodes[nnodes].n = c; nodes[nnodes].parms = Getattr(c,"wrap:parms"); nodes[nnodes].argc = emit_num_required(nodes[nnodes].parms); nodes[nnodes].error = 0; nnodes++; } c = Getattr(c,"sym:nextSibling"); } /* Sort the declarations by required argument count */ { int i,j; for (i = 0; i < nnodes; i++) { for (j = i+1; j < nnodes; j++) { if (nodes[i].argc > nodes[j].argc) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } } } } /* Sort the declarations by argument types */ { int i,j; for (i = 0; i < nnodes-1; i++) { if (nodes[i].argc == nodes[i+1].argc) { for (j = i+1; (j < nnodes) && (nodes[j].argc == nodes[i].argc); j++) { Parm *p1 = nodes[i].parms; Parm *p2 = nodes[j].parms; int differ = 0; int num_checked = 0; while (p1 && p2 && (num_checked < nodes[i].argc)) { if (debugMode) { Printf(stdout,"p1 = '%s', p2 = '%s'\n", Getattr(p1,"type"), Getattr(p2,"type")); } if (checkAttribute(p1,"tmap:in:numinputs","0")) { p1 = Getattr(p1,"tmap:in:next"); continue; } if (checkAttribute(p2,"tmap:in:numinputs","0")) { p2 = Getattr(p2,"tmap:in:next"); continue; } String *t1 = Getattr(p1,"tmap:typecheck:precedence"); String *t2 = Getattr(p2,"tmap:typecheck:precedence"); if (debugMode) { Printf(stdout,"t1 = '%s', t2 = '%s'\n", t1, t2); } if ((!t1) && (!nodes[i].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[i].n), Getline(nodes[i].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[i].n), SwigType_str(Getattr(p1, "type"), 0)); nodes[i].error = 1; } else if ((!t2) && (!nodes[j].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[j].n), SwigType_str(Getattr(p2, "type"), 0)); nodes[j].error = 1; } if (t1 && t2) { int t1v, t2v; t1v = atoi(Char(t1)); t2v = atoi(Char(t2)); differ = t1v-t2v; } else if (!t1 && t2) differ = 1; else if (t1 && !t2) differ = -1; else if (!t1 && !t2) differ = -1; num_checked++; if (differ > 0) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; break; } else if ((differ == 0) && (Strcmp(t1,"0") == 0)) { t1 = Getattr(p1,"ltype"); if (!t1) { t1 = SwigType_ltype(Getattr(p1,"type")); if (Getattr(p1,"tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t1); } Setattr(p1,"ltype",t1); } t2 = Getattr(p2,"ltype"); if (!t2) { t2 = SwigType_ltype(Getattr(p2,"type")); if (Getattr(p2,"tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t2); } Setattr(p2,"ltype",t2); } /* Need subtype check here. If t2 is a subtype of t1, then we need to change the order */ if (SwigType_issubtype(t2,t1)) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } if (Strcmp(t1,t2) != 0) { differ = 1; break; } } else if (differ) { break; } if (Getattr(p1,"tmap:in:next")) { p1 = Getattr(p1,"tmap:in:next"); } else { p1 = nextSibling(p1); } if (Getattr(p2,"tmap:in:next")) { p2 = Getattr(p2,"tmap:in:next"); } else { p2 = nextSibling(p2); } } if (!differ) { /* See if declarations differ by const only */ String *d1 = Getattr(nodes[i].n, "decl"); String *d2 = Getattr(nodes[j].n, "decl"); if (d1 && d2) { String *dq1 = Copy(d1); String *dq2 = Copy(d2); if (SwigType_isconst(d1)) { Delete(SwigType_pop(dq1)); } if (SwigType_isconst(d2)) { Delete(SwigType_pop(dq2)); } if (Strcmp(dq1, dq2) == 0) { if (SwigType_isconst(d1) && !SwigType_isconst(d2)) { if (script_lang_wrapping) { // Swap nodes so that the const method gets ignored (shadowed by the non-const method) Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } else if (!SwigType_isconst(d1) && SwigType_isconst(d2)) { differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } } Delete(dq1); Delete(dq2); } } if (!differ) { if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s effectively ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[i].n), Getline(nodes[i].n), "as it is shadowed by %s.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } nodes[j].error = 1; } } } } } } List *result = NewList(); { int i; for (i = 0; i < nnodes; i++) { if (nodes[i].error) Setattr(nodes[i].n, "overload:ignore", "1"); Append(result,nodes[i].n); // Printf(stdout,"[ %d ] %s\n", i, ParmList_errorstr(nodes[i].parms)); // Swig_print_node(nodes[i].n); } } return result; } void R::dispatchFunction(Node *n) { Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *nodeType = Getattr(n, "nodeType"); bool constructor = (!Cmp(nodeType, "constructor")); String *sfname = NewString(symname); if (constructor) Replace(sfname, "new_", "", DOH_REPLACE_FIRST); Printf(f->def, "`%s` <- function(...) {", sfname); if (debugMode) { Swig_print_node(n); } List *dispatch = Swig_overload_rank(n, true); int nfunc = Len(dispatch); Printv(f->code, "argtypes <- mapply(class, list(...));\n", "argv <- list(...);\n", "argc <- length(argtypes);\n", NIL ); Printf(f->code, "# dispatch functions %d\n", nfunc); int cur_args = -1; bool first_compare = true; for (int i=0; i < nfunc; i++) { Node *ni = Getitem(dispatch,i); Parm *pi = Getattr(ni,"wrap:parms"); int num_arguments = emit_num_arguments(pi); String *overname = Getattr(ni,"sym:overname"); if (cur_args != num_arguments) { if (cur_args != -1) { Printv(f->code, "} else ", NIL); } Printf(f->code, "if (argc == %d) {", num_arguments); cur_args = num_arguments; first_compare = true; } Parm *p; int j; if (num_arguments > 0) { if (!first_compare) { Printv(f->code, " else ", NIL); } else { first_compare = false; } Printv(f->code, "if (", NIL); for (p =pi, j = 0 ; j < num_arguments ; j++) { if (debugMode) { Swig_print_node(p); } String *tm = Swig_typemap_lookup("rtype", p, "", 0); if(tm) { replaceRClass(tm, Getattr(p, "type")); } String *tmcheck = Swig_typemap_lookup("rtypecheck", p, "", 0); if (tmcheck) { String *tmp = NewString(""); Printf(tmp, "argv[[%d]]", j+1); Replaceall(tmcheck, "$arg", tmp); Printf(tmp, "argtype[%d]", j+1); Replaceall(tmcheck, "$argtype", tmp); if (tm) { Replaceall(tmcheck, "$rtype", tm); } if (debugMode) { Printf(stdout, "%s\n", tmcheck); } Printf(f->code, "%s(%s)", j == 0 ? "" : " && ", tmcheck); p = Getattr(p, "tmap:in:next"); continue; } // Below should be migrated into rtypecheck typemaps if (tm) { Printf(f->code, "%s", j == 0 ? "" : " && "); if (Strcmp(tm, "numeric") == 0) { Printf(f->code, "is.numeric(argv[[%d]])", j+1); } else if (Strcmp(tm, "integer") == 0) { Printf(f->code, "(is.integer(argv[[%d]]) || is.numeric(argv[[%d]]))", j+1, j+1); } else if (Strcmp(tm, "character") == 0) { Printf(f->code, "is.character(argv[[%d]])", j+1); } else { if (SwigType_ispointer(Getattr(p, "type"))) Printf(f->code, "(extends(argtypes[%d], '%s') || is.null(argv[[%d]]))", j+1, tm, j+1); else Printf(f->code, "extends(argtypes[%d], '%s')", j+1, tm); } } if (!SwigType_ispointer(Getattr(p, "type"))) { Printf(f->code, " && length(argv[[%d]]) == 1", j+1); } p = Getattr(p, "tmap:in:next"); } Printf(f->code, ") { f <- %s%s; }\n", sfname, overname); } else { Printf(f->code, "f <- %s%s; ", sfname, overname); } } if (cur_args != -1) { Printf(f->code, "} else {\n" "stop(\"cannot find overloaded function for %s with argtypes (\"," "toString(argtypes),\")\");\n" "}", sfname); } Printv(f->code, ";\nf(...)", NIL); Printv(f->code, ";\n}", NIL); Wrapper_print(f, sfile); Printv(sfile, "# Dispatch function\n", NIL); DelWrapper(f); } /*-------------------------------------------------------------- * --------------------------------------------------------------*/ int R::functionWrapper(Node *n) { String *fname = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *type = Getattr(n, "type"); if (debugMode) { Printf(stdout, " %s %s %s\n", fname, iname, type); } String *overname = 0; String *nodeType = Getattr(n, "nodeType"); bool constructor = (!Cmp(nodeType, "constructor")); bool destructor = (!Cmp(nodeType, "destructor")); String *sfname = NewString(iname); if (constructor) Replace(sfname, "new_", "", DOH_REPLACE_FIRST); if (Getattr(n,"sym:overloaded")) { overname = Getattr(n,"sym:overname"); Append(sfname, overname); } if (debugMode) Printf(stdout, " processing parameters\n"); ParmList *l = Getattr(n, "parms"); Parm *p; String *tm; p = l; while(p) { SwigType *resultType = Getattr(p, "type"); if (expandTypedef(resultType) && SwigType_istypedef(resultType)) { SwigType *resolved = SwigType_typedef_resolve_all(resultType); if (expandTypedef(resolved)) { if (debugMode) { Printf(stdout, "Setting type: %s\n", resolved); } Setattr(p, "type", Copy(resolved)); } } p = nextSibling(p); } String *unresolved_return_type = Copy(type); if (expandTypedef(type) && SwigType_istypedef(type)) { SwigType *resolved = SwigType_typedef_resolve_all(type); if (debugMode) Printf(stdout, " resolved %s\n", Copy(unresolved_return_type)); if (expandTypedef(resolved)) { type = Copy(resolved); Setattr(n, "type", type); } } if (debugMode) Printf(stdout, " unresolved_return_type %s\n", unresolved_return_type); if(processing_member_access_function) { if (debugMode) Printf(stdout, " '%s' '%s' '%s' '%s'\n", fname, iname, member_name, class_name); if(opaqueClassDeclaration) return SWIG_OK; /* Add the name of this member to a list for this class_name. We will dump all these at the end. */ bool isSet(GetFlag(n, "memberset")); String *tmp = NewString(isSet ? Swig_name_set(NSPACE_TODO, class_name) : Swig_name_get(NSPACE_TODO, class_name)); List *memList = Getattr(ClassMemberTable, tmp); if(!memList) { memList = NewList(); Append(memList, class_name); Setattr(ClassMemberTable, tmp, memList); } Delete(tmp); Append(memList, member_name); Append(memList, iname); } int i; int nargs; String *wname = Swig_name_wrapper(iname); if(overname) Append(wname, overname); Setattr(n,"wrap:name", wname); Wrapper *f = NewWrapper(); Wrapper *sfun = NewWrapper(); int isVoidReturnType = (Strcmp(type, "void") == 0); // Need to use the unresolved return type since // typedef resolution removes the const which causes a // mismatch with the function action emit_return_variable(n, unresolved_return_type, f); SwigType *rtype = Getattr(n, "type"); int addCopyParam = 0; if(!isVoidReturnType) addCopyParam = addCopyParameter(rtype); if (debugMode) Printf(stdout, "Adding a .copy argument to %s for %s = %s\n", iname, type, addCopyParam ? "yes" : "no"); Printv(f->def, "SWIGEXPORT SEXP\n", wname, " ( ", NIL); Printf(sfun->def, "# Start of %s\n", iname); Printv(sfun->def, "\n`", sfname, "` = function(", NIL); if(outputNamespaceInfo) {//XXX Need to be a little more discriminating if (constructor) { String *niname = Copy(iname); Replace(niname, "new_", "", DOH_REPLACE_FIRST); addNamespaceFunction(niname); Delete(niname); } else { addNamespaceFunction(iname); } } Swig_typemap_attach_parms("scoercein", l, f); Swig_typemap_attach_parms("scoerceout", l, f); Swig_typemap_attach_parms("scheck", l, f); emit_parameter_variables(l, f); emit_attach_parmmaps(l,f); Setattr(n,"wrap:parms",l); nargs = emit_num_arguments(l); Wrapper_add_local(f, "r_nprotect", "unsigned int r_nprotect = 0"); Wrapper_add_localv(f, "r_ans", "SEXP", "r_ans = R_NilValue", NIL); Wrapper_add_localv(f, "r_vmax", "VMAXTYPE", "r_vmax = vmaxget()", NIL); String *sargs = NewString(""); String *s_inputTypes = NewString(""); String *s_inputMap = NewString(""); bool inFirstArg = true; bool inFirstType = true; Parm *curP; for (p =l, i = 0 ; i < nargs ; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *tt = Getattr(p, "type"); int nargs = -1; String *funcptr_name = processType(tt, p, &nargs); // SwigType *tp = Getattr(p, "type"); String *name = Getattr(p,"name"); String *lname = Getattr(p,"lname"); // R keyword renaming if (name) { if (Swig_name_warning(p, 0, name, 0)) { name = 0; } else { /* If we have a :: in the parameter name because we are accessing a static member of a class, say, then we need to remove that prefix. */ while (Strstr(name, "::")) { //XXX need to free. name = NewStringf("%s", Strchr(name, ':') + 2); if (debugMode) Printf(stdout, "+++ parameter name with :: in it %s\n", name); } } } if (!name || Len(name) == 0) name = NewStringf("s_arg%d", i+1); name = replaceInitialDash(name); if (!Strncmp(name, "arg", 3)) { name = Copy(name); Insert(name, 0, "s_"); } if(processing_variable) { name = Copy(name); Insert(name, 0, "s_"); } if(!Strcmp(name, fname)) { name = Copy(name); Insert(name, 0, "s_"); } Printf(sargs, "%s, ", name); String *tm; if((tm = Getattr(p, "tmap:scoercein"))) { Replaceall(tm, "$input", name); replaceRClass(tm, Getattr(p, "type")); if(funcptr_name) { //XXX need to get this to return non-zero if(nargs == -1) nargs = getFunctionPointerNumArgs(p, tt); String *snargs = NewStringf("%d", nargs); Printv(sfun->code, "if(is.function(", name, ")) {", "\n", "assert('...' %in% names(formals(", name, ")) || length(formals(", name, ")) >= ", snargs, ");\n} ", NIL); Delete(snargs); Printv(sfun->code, "else {\n", "if(is.character(", name, ")) {\n", name, " = getNativeSymbolInfo(", name, ");", "\n};\n", "if(is(", name, ", \"NativeSymbolInfo\")) {\n", name, " = ", name, "$address", ";\n};\n", "if(is(", name, ", \"ExternalReference\")) {\n", name, " = ", name, "@ref;\n}\n", "}; \n", NIL); } else { Printf(sfun->code, "%s\n", tm); } } Printv(sfun->def, inFirstArg ? "" : ", ", name, NIL); if ((tm = Getattr(p,"tmap:scheck"))) { Replaceall(tm,"$target", lname); Replaceall(tm,"$source", name); Replaceall(tm,"$input", name); replaceRClass(tm, Getattr(p, "type")); Printf(sfun->code,"%s\n",tm); } curP = p; if ((tm = Getattr(p,"tmap:in"))) { Replaceall(tm,"$target", lname); Replaceall(tm,"$source", name); Replaceall(tm,"$input", name); if (Getattr(p,"wrap:disown") || (Getattr(p,"tmap:in:disown"))) { Replaceall(tm,"$disown","SWIG_POINTER_DISOWN"); } else { Replaceall(tm,"$disown","0"); } if(funcptr_name) { /* have us a function pointer */ Printf(f->code, "if(TYPEOF(%s) != CLOSXP) {\n", name); Replaceall(tm,"$R_class", ""); } else { replaceRClass(tm, Getattr(p, "type")); } Printf(f->code,"%s\n",tm); if(funcptr_name) Printf(f->code, "} else {\n%s = %s;\nR_SWIG_pushCallbackFunctionData(%s, NULL);\n}\n", lname, funcptr_name, name); Printv(f->def, inFirstArg ? "" : ", ", "SEXP ", name, NIL); if (Len(name) != 0) inFirstArg = false; p = Getattr(p,"tmap:in:next"); } else { p = nextSibling(p); } tm = Swig_typemap_lookup("rtype", curP, "", 0); if(tm) { replaceRClass(tm, Getattr(curP, "type")); } Printf(s_inputTypes, "%s'%s'", inFirstType ? "" : ", ", tm); Printf(s_inputMap, "%s%s='%s'", inFirstType ? "" : ", ", name, tm); inFirstType = false; if(funcptr_name) Delete(funcptr_name); } /* end of looping over parameters. */ if(addCopyParam) { Printf(sfun->def, "%s.copy = FALSE", nargs > 0 ? ", " : ""); Printf(f->def, "%sSEXP s_swig_copy", nargs > 0 ? ", " : ""); Printf(sargs, "as.logical(.copy), "); } Printv(f->def, ")\n{\n", NIL); Printv(sfun->def, ")\n{\n", NIL); /* Insert cleanup code */ String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); if (tm && (Len(tm) != 0)) { Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } String *outargs = NewString(""); int numOutArgs = isVoidReturnType ? -1 : 0; for(p = l, i = 0; p; i++) { if((tm = Getattr(p, "tmap:argout"))) { // String *lname = Getattr(p, "lname"); numOutArgs++; String *pos = NewStringf("%d", numOutArgs); Replaceall(tm,"$source", Getattr(p, "lname")); Replaceall(tm,"$result", "r_ans"); Replaceall(tm,"$n", pos); // The position into which to store the answer. Replaceall(tm,"$arg", Getattr(p, "emit:input")); Replaceall(tm,"$input", Getattr(p, "emit:input")); Replaceall(tm,"$owner", "0"); Printf(outargs, "%s\n", tm); p = Getattr(p,"tmap:argout:next"); } else p = nextSibling(p); } String *actioncode = emit_action(n); /* Deal with the explicit return value. */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { SwigType *retType = Getattr(n, "type"); Replaceall(tm,"$1", Swig_cresult_name()); Replaceall(tm,"$result", "r_ans"); if (debugMode){ Printf(stdout, "Calling replace D: %s, %s, %s\n", retType, n, tm); } replaceRClass(tm, retType); if (GetFlag(n,"feature:new")) { Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); } else { Replaceall(tm,"$owner", "0"); } Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(type, 0), fname); } if(Len(outargs)) { Wrapper_add_local(f, "R_OutputValues", "SEXP R_OutputValues"); String *tmp = NewString(""); if(!isVoidReturnType) Printf(tmp, "Rf_protect(r_ans);\n"); Printf(tmp, "Rf_protect(R_OutputValues = Rf_allocVector(VECSXP,%d));\nr_nprotect += %d;\n", numOutArgs + !isVoidReturnType, isVoidReturnType ? 1 : 2); if(!isVoidReturnType) Printf(tmp, "SET_VECTOR_ELT(R_OutputValues, 0, r_ans);\n"); Printf(tmp, "r_ans = R_OutputValues;\n"); Insert(outargs, 0, tmp); Delete(tmp); Printv(f->code, outargs, NIL); Delete(outargs); } /* Output cleanup code */ int need_cleanup = Len(cleanup) != 0; if (need_cleanup) { Printv(f->code, cleanup, NIL); } /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } Printv(f->code, UnProtectWrapupCode, NIL); /*If the user gave us something to convert the result in */ if ((tm = Swig_typemap_lookup("scoerceout", n, Swig_cresult_name(), sfun))) { Replaceall(tm,"$source","ans"); Replaceall(tm,"$result","ans"); if (constructor) { Node * parent = Getattr(n, "parentNode"); String * smartname = Getattr(parent, "feature:smartptr"); if (smartname) { smartname = getRClassName(smartname, 1, 1); Replaceall(tm, "$R_class", smartname); Delete(smartname); } } if (debugMode) { Printf(stdout, "Calling replace B: %s, %s, %s\n", Getattr(n, "type"), Getattr(n, "sym:name"), getNSpace()); } replaceRClass(tm, Getattr(n, "type")); Chop(tm); } Printv(sfun->code, ";", (Len(tm) ? "ans = " : ""), ".Call('", wname, "', ", sargs, "PACKAGE='", Rpackage, "');\n", NIL); if(Len(tm)) { Printf(sfun->code, "%s\n\n", tm); if (constructor) { String *finalizer = NewString(iname); Replace(finalizer, "new_", "", DOH_REPLACE_FIRST); Printf(sfun->code, "reg.finalizer(ans@ref, delete_%s);\n", finalizer); } Printf(sfun->code, "ans\n"); } if (destructor) Printv(f->code, "R_ClearExternalPtr(self);\n", NIL); Printv(f->code, "return r_ans;\n", NIL); /* Error handling code */ Printv(f->code, "fail: SWIGUNUSED;\n", NIL); if (need_cleanup) { Printv(f->code, cleanup, NIL); } Printv(f->code, " Rf_error(\"%s %s\", SWIG_ErrorType(SWIG_lasterror_code), SWIG_lasterror_msg);\n", NIL); Printv(f->code, " return R_NilValue;\n", NIL); Delete(cleanup); Printv(f->code, "}\n", NIL); Printv(sfun->code, "\n}", NIL); /* Substitute the function name */ Replaceall(f->code,"$symname",iname); Wrapper_print(f, f_wrapper); Wrapper_print(sfun, sfile); Printf(sfun->code, "\n# End of %s\n", iname); tm = Swig_typemap_lookup("rtype", n, "", 0); if(tm) { SwigType *retType = Getattr(n, "type"); if (debugMode) { Printf(stdout, "Calling replace C: %s\n", Copy(retType)); } replaceRClass(tm, retType); } Printv(sfile, "attr(`", sfname, "`, 'returnType') = '", isVoidReturnType ? "void" : (tm ? tm : ""), "'\n", NIL); if(nargs > 0) Printv(sfile, "attr(`", sfname, "`, \"inputTypes\") = c(", s_inputTypes, ")\n", NIL); Printv(sfile, "class(`", sfname, "`) = c(\"SWIGFunction\", class('", sfname, "'))\n\n", NIL); if (memoryProfile) { Printv(sfile, "memory.profile()\n", NIL); } if (aggressiveGc) { Printv(sfile, "gc()\n", NIL); } // Printv(sfile, "setMethod('", name, "', '", name, "', ", iname, ")\n\n\n"); /* If we are dealing with a method in an C++ class, then add the name of the R function and its definition. XXX need to figure out how to store the Wrapper if possible in the hash/list. Would like to be able to do this so that we can potentially insert */ if(processing_member_access_function || processing_class_member_function) { String *method_type = R_MEMBER_NORMAL; if (GetFlag(n, "memberset")) { method_type = R_MEMBER_SET; } else if (GetFlag(n, "memberget")) { method_type = R_MEMBER_GET; } addAccessor(member_name, sfun, iname, method_type); } if (Getattr(n, "sym:overloaded") && !Getattr(n, "sym:nextSibling")) { dispatchFunction(n); } addRegistrationRoutine(wname, addCopyParam ? nargs +1 : nargs); DelWrapper(f); DelWrapper(sfun); Delete(sargs); Delete(sfname); return SWIG_OK; } /* ---------------------------------------------------------------------- * R::constantWrapper() * ---------------------------------------------------------------------- */ int R::constantWrapper(Node *n) { (void) n; // TODO return SWIG_OK; } /*-------------------------------------------------------------- * Add the specified routine name to the collection of * generated routines that are called from R functions. * This is used to register the routines with R for * resolving symbols. * rname - the name of the routine * nargs - the number of arguments it expects. * --------------------------------------------------------------*/ int R::addRegistrationRoutine(String *rname, int nargs) { if(!registrationTable) registrationTable = NewHash(); String *el = NewStringf("{\"%s\", (DL_FUNC) &%s, %d}", rname, rname, nargs); Setattr(registrationTable, rname, el); return SWIG_OK; } /* ------------------------------------------------------------- * Write the registration information to an array and * create the initialization routine for registering * these. * --------------------------------------------------------------*/ int R::outputRegistrationRoutines(File *out) { int i, n; if(!registrationTable) return(0); if(inCPlusMode) Printf(out, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n"); Printf(out, "#include \n\n"); if(inCPlusMode) Printf(out, "#ifdef __cplusplus\n}\n#endif\n\n"); Printf(out, "SWIGINTERN R_CallMethodDef CallEntries[] = {\n"); List *keys = Keys(registrationTable); n = Len(keys); for(i = 0; i < n; i++) Printf(out, " %s,\n", Getattr(registrationTable, Getitem(keys, i))); Printf(out, " {NULL, NULL, 0}\n};\n\n"); if(!noInitializationCode) { if (inCPlusMode) Printv(out, "extern \"C\" ", NIL); { /* R allows pckage names to have '.' in the name, which is not allowed in C++ var names we simply replace all occurrences of '.' with '_' to construct the var name */ String * Rpackage_sane = Copy(Rpackage); Replace(Rpackage_sane, ".", "_", DOH_REPLACE_ANY); Printf(out, "SWIGEXPORT void R_init_%s(DllInfo *dll) {\n", Rpackage_sane); Delete(Rpackage_sane); } Printf(out, "%sR_registerRoutines(dll, NULL, CallEntries, NULL, NULL);\n", tab4); if(Len(s_init_routine)) { Printf(out, "\n%s\n", s_init_routine); } Printf(out, "}\n"); } return n; } /* ------------------------------------------------------------- * Process a struct, union or class declaration in the source code, * or an anonymous typedef struct * --------------------------------------------------------------*/ //XXX What do we need to do here - // Define an S4 class to refer to this. void R::registerClass(Node *n) { String *name = Getattr(n, "name"); String *kind = Getattr(n, "kind"); if (debugMode) Swig_print_node(n); String *sname = NewStringf("_p%s", SwigType_manglestr(name)); if(!Getattr(SClassDefs, sname)) { Setattr(SClassDefs, sname, sname); String *base; if(Strcmp(kind, "class") == 0) { base = NewString(""); List *l = Getattr(n, "bases"); if(Len(l)) { Printf(base, "c("); for(int i = 0; i < Len(l); i++) { registerClass(Getitem(l, i)); Printf(base, "'_p%s'%s", SwigType_manglestr(Getattr(Getitem(l, i), "name")), i < Len(l)-1 ? ", " : ""); } Printf(base, ")"); } else { base = NewString("'C++Reference'"); } } else base = NewString("'ExternalReference'"); Printf(s_classes, "setClass('%s', contains = %s)\n", sname, base); Delete(base); String *smartptr = Getattr(n, "feature:smartptr"); if (smartptr) { List *l = Getattr(n, "bases"); SwigType *spt = Swig_cparse_type(smartptr); String *smart = SwigType_typedef_resolve_all(spt); String *smart_rname = SwigType_manglestr(smart); Printf(s_classes, "setClass('_p%s', contains = c('%s'", smart_rname, sname); Delete(spt); Delete(smart); Delete(smart_rname); for(int i = 0; i < Len(l); i++) { Node * b = Getitem(l, i); smartptr = Getattr(b, "feature:smartptr"); if (smartptr) { spt = Swig_cparse_type(smartptr); smart = SwigType_typedef_resolve_all(spt); smart_rname = SwigType_manglestr(smart); Printf(s_classes, ", '_p%s'", smart_rname); Delete(spt); Delete(smart); Delete(smart_rname); } } Printf(s_classes, "))\n"); } } } int R::classDeclaration(Node *n) { String *name = Getattr(n, "name"); String *kind = Getattr(n, "kind"); if (debugMode) Swig_print_node(n); registerClass(n); /* If we have a typedef union { ... } U, then we never get to see the typedef via a regular call to typedefHandler. Instead, */ if(Getattr(n, "unnamed") && Getattr(n, "storage") && Strcmp(Getattr(n, "storage"), "typedef") == 0 && Getattr(n, "tdname") && Strcmp(Getattr(n, "tdname"), name) == 0) { if (debugMode) Printf(stdout, "Typedef in the class declaration for %s\n", name); // typedefHandler(n); } bool opaque = GetFlag(n, "feature:opaque") ? true : false; if(opaque) opaqueClassDeclaration = name; int status = Language::classDeclaration(n); opaqueClassDeclaration = NULL; if (class_member_function_types) { // collect the "set" methods List *class_set_membernames = filterMemberList(class_member_function_types, class_member_function_membernames, R_MEMBER_SET, true); List *class_set_functionnames = filterMemberList(class_member_function_types, class_member_function_names, R_MEMBER_SET, true); // this one isn't used - collecting to keep code simpler List *class_set_functiontypes = filterMemberList(class_member_function_types, class_member_function_types, R_MEMBER_SET, true); // collect the others List *class_other_membernames = filterMemberList(class_member_function_types, class_member_function_membernames, R_MEMBER_SET, false); List *class_other_functionnames = filterMemberList(class_member_function_types, class_member_function_names, R_MEMBER_SET, false); List *class_other_functiontypes = filterMemberList(class_member_function_types, class_member_function_types, R_MEMBER_SET, false); if (Len(class_other_membernames) > 0) { OutputMemberReferenceMethod(name, 0, class_other_membernames, class_other_functionnames, class_other_functiontypes, sfile); } if (Len(class_set_membernames) > 0) { OutputMemberReferenceMethod(name, 1, class_set_membernames, class_set_functionnames, class_set_functiontypes, sfile); } Delete(class_set_membernames); Delete(class_set_functionnames); Delete(class_set_functiontypes); Delete(class_other_membernames); Delete(class_other_functionnames); Delete(class_other_functiontypes); } if (class_member_function_types) { Delete(class_member_function_types); class_member_function_types = NULL; Delete(class_member_function_names); class_member_function_names = NULL; Delete(class_member_function_membernames); class_member_function_membernames = NULL; Delete(class_member_function_wrappernames); class_member_function_wrappernames = NULL; } if (Getattr(n, "has_destructor")) { Printf(sfile, "setMethod('delete', '_p%s', function(obj) {delete%s(obj)})\n", getRClassName(name), getRClassName(name)); } if(!opaque && !Strcmp(kind, "struct") && copyStruct) { String *def = NewStringf("setClass(\"%s\",\n%srepresentation(\n", name, tab4); bool firstItem = true; for(Node *c = firstChild(n); c; ) { String *elName; String *tp; elName = Getattr(c, "name"); String *elKind = Getattr(c, "kind"); if (!Equal(elKind, "variable")) { c = nextSibling(c); continue; } if (!Len(elName)) { c = nextSibling(c); continue; } tp = Swig_typemap_lookup("rtype", c, "", 0); if(!tp) { c = nextSibling(c); continue; } if (Strstr(tp, "R_class")) { c = nextSibling(c); continue; } if (Strcmp(tp, "character") && Strstr(Getattr(c, "decl"), "p.")) { c = nextSibling(c); continue; } if (!firstItem) { Printf(def, ",\n"); } // else //XXX How can we tell if this is already done. // SwigType_push(elType, elDecl); // returns "" tp = processType(elType, c, NULL); // Printf(stdout, " elType %p\n", elType); // tp = getRClassNameCopyStruct(Getattr(c, "type"), 1); String *elNameT = replaceInitialDash(elName); Printf(def, "%s%s = \"%s\"", tab8, elNameT, tp); firstItem = false; Delete(tp); Delete(elNameT); c = nextSibling(c); } Printf(def, "),\n%scontains = \"RSWIGStruct\")\n", tab8); Printf(s_classes, "%s\n\n# End class %s\n\n", def, name); generateCopyRoutines(n); Delete(def); } return status; } /* ------------------------------------------------------------- * Create the C routines that copy an S object of the class given * by the given struct definition in Node *n to the C value * and also the routine that goes from the C routine to an object * of this S class. * --------------------------------------------------------------*/ /*XXX Clean up the toCRef - make certain the names are correct for the types, etc. in all cases. */ int R::generateCopyRoutines(Node *n) { Wrapper *copyToR = NewWrapper(); Wrapper *copyToC = NewWrapper(); String *name = Getattr(n, "name"); String *tdname = Getattr(n, "tdname"); String *kind = Getattr(n, "kind"); String *type; if(Len(tdname)) { type = Copy(tdname); } else { type = NewStringf("%s %s", kind, name); } String *mangledName = SwigType_manglestr(name); if (debugMode) Printf(stdout, "generateCopyRoutines: name = %s, %s\n", name, type); Printf(copyToR->def, "CopyToR%s = function(value, obj = new(\"%s\"))\n{\n", mangledName, name); Printf(copyToC->def, "CopyToC%s = function(value, obj)\n{\n", mangledName); Node *c = firstChild(n); for(; c; c = nextSibling(c)) { String *elName = Getattr(c, "name"); if (!Len(elName)) { continue; } String *elKind = Getattr(c, "kind"); if (!Equal(elKind, "variable")) { continue; } String *tp = Swig_typemap_lookup("rtype", c, "", 0); if(!tp) { continue; } if (Strstr(tp, "R_class")) { continue; } if (Strcmp(tp, "character") && Strstr(Getattr(c, "decl"), "p.")) { continue; } /* The S functions to get and set the member value. */ String *elNameT = replaceInitialDash(elName); Printf(copyToR->code, "obj@%s = value$%s;\n", elNameT, elNameT); Printf(copyToC->code, "obj$%s = value@%s;\n", elNameT, elNameT); Delete(elNameT); } Printf(copyToR->code, "obj;\n}\n\n"); String *rclassName = getRClassNameCopyStruct(type, 0); // without the Ref. Printf(sfile, "# Start definition of copy functions & methods for %s\n", rclassName); Wrapper_print(copyToR, sfile); Printf(copyToC->code, "obj\n}\n\n"); Wrapper_print(copyToC, sfile); Printf(sfile, "# Start definition of copy methods for %s\n", rclassName); Printf(sfile, "setMethod('copyToR', '_p_%s', CopyToR%s);\n", rclassName, mangledName); Printf(sfile, "setMethod('copyToC', '%s', CopyToC%s);\n\n", rclassName, mangledName); Printf(sfile, "# End definition of copy methods for %s\n", rclassName); Printf(sfile, "# End definition of copy functions & methods for %s\n", rclassName); String *m = NewStringf("%sCopyToR", name); addNamespaceMethod(m); char *tt = Char(m); tt[Len(m)-1] = 'C'; addNamespaceMethod(m); Delete(m); Delete(rclassName); Delete(mangledName); DelWrapper(copyToR); DelWrapper(copyToC); return SWIG_OK; } /* ------------------------------------------------------------- * Called when there is a typedef to be invoked. * * XXX Needs to be enhanced or split to handle the case where we have a * typedef within a classDeclaration emission because the struct/union/etc. * is anonymous. * --------------------------------------------------------------*/ int R::typedefHandler(Node *n) { SwigType *tp = Getattr(n, "type"); String *type = Getattr(n, "type"); if (debugMode) Printf(stdout, " %s\n", Getattr(n, "name")); processType(tp, n); if(Strncmp(type, "struct ", 7) == 0) { String *name = Getattr(n, "name"); char *trueName = Char(type); trueName += 7; if (debugMode) Printf(stdout, " Defining S class %s\n", trueName); Printf(s_classes, "setClass('_p%s', contains = 'ExternalReference')\n", SwigType_manglestr(name)); } return Language::typedefHandler(n); } /* -------------------------------------------------------------- * Called when processing a field in a "class", i.e. struct, union or * actual class. We set a state variable so that we can correctly * interpret the resulting functionWrapper() call and understand that * it is for a field element. * --------------------------------------------------------------*/ int R::membervariableHandler(Node *n) { SwigType *t = Getattr(n, "type"); processType(t, n, NULL); processing_member_access_function = 1; member_name = Getattr(n,"sym:name"); if (debugMode) Printf(stdout, " name = %s, sym:name = %s\n", Getattr(n, "name"), member_name); int status(Language::membervariableHandler(n)); if(!opaqueClassDeclaration && debugMode) Printf(stdout, " %s %s\n", Getattr(n, "name"), Getattr(n, "type")); processing_member_access_function = 0; member_name = NULL; return status; } /* This doesn't seem to get used so leave it out for the moment. */ String * R::runtimeCode() { String *s = Swig_include_sys("rrun.swg"); if (!s) { Printf(stdout, "*** Unable to open 'rrun.swg'\n"); s = NewString(""); } return s; } /* ----------------------------------------------------------------------- * Called when SWIG wants to initialize this * We initialize anythin we want here. * Most importantly, tell SWIG where to find the files (e.g. r.swg) for this module. * Use Swig_mark_arg() to tell SWIG that it is understood and not to * throw an error. * --------------------------------------------------------------*/ void R::main(int argc, char *argv[]) { init(); Preprocessor_define("SWIGR 1", 0); SWIG_library_directory("r"); SWIG_config_file("r.swg"); debugMode = false; copyStruct = true; memoryProfile = false; aggressiveGc = false; inCPlusMode = false; outputNamespaceInfo = false; noInitializationCode = false; this->Argc = argc; this->Argv = argv; allow_overloading();// can we support this? for(int i = 0; i < argc; i++) { if(strcmp(argv[i], "-package") == 0) { Swig_mark_arg(i); i++; Swig_mark_arg(i); Rpackage = argv[i]; } else if(strcmp(argv[i], "-dll") == 0) { Swig_mark_arg(i); i++; Swig_mark_arg(i); DllName = argv[i]; } else if(strcmp(argv[i], "-help") == 0) { showUsage(); } else if(strcmp(argv[i], "-namespace") == 0) { outputNamespaceInfo = true; Swig_mark_arg(i); } else if(!strcmp(argv[i], "-no-init-code")) { noInitializationCode = true; Swig_mark_arg(i); } else if(!strcmp(argv[i], "-c++")) { inCPlusMode = true; Swig_mark_arg(i); Printf(s_classes, "setClass('C++Reference', contains = 'ExternalReference')\n"); } else if(!strcmp(argv[i], "-debug")) { debugMode = true; Swig_mark_arg(i); } else if (!strcmp(argv[i],"-copystruct")) { copyStruct = true; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-nocopystruct")) { copyStruct = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-memoryprof")) { memoryProfile = true; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-nomemoryprof")) { memoryProfile = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-aggressivegc")) { aggressiveGc = true; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-noaggressivegc")) { aggressiveGc = false; Swig_mark_arg(i); } else if (strcmp(argv[i], "-cppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is now always on.\n", argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is no longer supported.\n", argv[i]); Swig_mark_arg(i); SWIG_exit(EXIT_FAILURE); } if (debugMode) { Swig_typemap_search_debug_set(); Swig_typemap_used_debug_set(); Swig_typemap_register_debug_set(); Swig_file_debug_set(); } /// copyToR copyToC functions. } } /* ----------------------------------------------------------------------- * Could make this work for String or File and then just store the resulting string * rather than the collection of arguments and argc. * ----------------------------------------------------------------------- */ int R::outputCommandLineArguments(File *out) { if(Argc < 1 || !Argv || !Argv[0]) return(-1); Printf(out, "\n## Generated via the command line invocation:\n##\t"); for(int i = 0; i < Argc ; i++) { Printf(out, " %s", Argv[i]); } Printf(out, "\n\n\n"); return Argc; } /* How SWIG instantiates an object from this module. See swigmain.cxx */ extern "C" Language *swig_r(void) { return new R(); } /* ----------------------------------------------------------------------- * Needs to be reworked. *----------------------------------------------------------------------- */ String * R::processType(SwigType *t, Node *n, int *nargs) { //XXX Need to handle typedefs, e.g. // a type which is a typedef to a function pointer. SwigType *tmp = Getattr(n, "tdname"); if (debugMode) Printf(stdout, "processType %s (tdname = %s)(SwigType = %s)\n", Getattr(n, "name"), tmp, Copy(t)); SwigType *td = t; if (expandTypedef(t) && SwigType_istypedef(t)) { SwigType *resolved = SwigType_typedef_resolve_all(t); if (expandTypedef(resolved)) { td = Copy(resolved); } } if(!td) { int count = 0; String *b = getRTypeName(t, &count); if(count && b && !Getattr(SClassDefs, b)) { if (debugMode) Printf(stdout, " Defining class %s\n", b); Printf(s_classes, "setClass('%s', contains = 'ExternalReference')\n", b); Setattr(SClassDefs, b, b); } } if(td) t = td; if(SwigType_isfunctionpointer(t)) { if (debugMode) Printf(stdout, " Defining pointer handler %s\n", t); String *tmp = createFunctionPointerHandler(t, n, nargs); return tmp; } return NULL; } /* ----------------------------------------------------------------------- * enumValue() * This method will return a string with an enum value to use in from R when * setting up an enum variable * ------------------------------------------------------------------------ */ String *R::enumValue(Node *n) { String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *newsymname = 0; Node *parent = parentNode(n); symname = Getattr(n, "sym:name"); // parent enumtype has namespace mangled in String *etype = Getattr(parent, "enumtype"); // we have to directly call the c wrapper function, as the // R wrapper to the enum is designed to be used after the enum // structures have been created on the R side. This means // that we'll need to construct a .Call expression // change the type for variableWrapper if (debugMode) { Printf(stdout, " type set: %s\n", etype); } Setattr(n, "type", etype); if (!getCurrentClass()) { newsymname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); // Strange hack to change the name Setattr(n, "name", Getattr(n, "value")); Setattr(n, "sym:name", newsymname); variableWrapper(n); value = Swig_name_get(NSPACE_TODO, newsymname); } else { String *enumClassPrefix = getEnumClassPrefix(); newsymname = Swig_name_member(0, enumClassPrefix, symname); Setattr(n, "name", Getattr(n, "value")); Setattr(n, "sym:name", newsymname); variableWrapper(n); value = Swig_name_get(NSPACE_TODO, newsymname); } value = Swig_name_wrapper(value); Replace(value, "_wrap", "R_swig", DOH_REPLACE_FIRST); String *valuecall=NewString(""); Printv(valuecall, ".Call('", value, "',FALSE, PACKAGE='", Rpackage, "')", NIL); Delete(value); return valuecall; } swig-4.0.2/Source/Modules/csharp.cxx0000644000175000017500000052260513667507523017250 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * csharp.cxx * * C# language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include // for INT_MAX #include "cparse.h" #include /* Hash type used for upcalls from C/C++ */ typedef DOH UpcallData; class CSHARP:public Language { static const char *usage; const String *empty_string; const String *public_string; const String *protected_string; Hash *swig_types_hash; File *f_begin; File *f_runtime; File *f_runtime_h; File *f_header; File *f_wrappers; File *f_init; File *f_directors; File *f_directors_h; File *f_single_out; List *filenames_list; bool proxy_flag; // Flag for generating proxy classes bool native_function_flag; // Flag for when wrapping a native function bool enum_constant_flag; // Flag for when wrapping an enum or constant bool static_flag; // Flag for when wrapping a static functions or member variables bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable bool wrapping_member_flag; // Flag for when wrapping a member variable/enum/const bool global_variable_flag; // Flag for when wrapping a global variable bool old_variable_names; // Flag for old style variable names in the intermediary class bool generate_property_declaration_flag; // Flag for generating properties String *imclass_name; // intermediary class name String *module_class_name; // module class name String *imclass_class_code; // intermediary class code String *proxy_class_def; String *proxy_class_code; String *interface_class_code; // if %feature("interface") was declared for a class, here goes the interface declaration String *module_class_code; String *proxy_class_name; // proxy class name String *full_imclass_name; // fully qualified intermediary class name when using nspace feature, otherwise same as imclass_name String *variable_name; //Name of a variable being wrapped String *proxy_class_constants_code; String *module_class_constants_code; String *enum_code; String *dllimport; // DllImport attribute name String *namespce; // Optional namespace name String *imclass_imports; //intermediary class imports from %pragma String *module_imports; //module imports from %pragma String *imclass_baseclass; //inheritance for intermediary class class from %pragma String *module_baseclass; //inheritance for module class from %pragma String *imclass_interfaces; //interfaces for intermediary class class from %pragma String *module_interfaces; //interfaces for module class from %pragma String *imclass_class_modifiers; //class modifiers for intermediary class overridden by %pragma String *module_class_modifiers; //class modifiers for module class overridden by %pragma String *upcasts_code; //C++ casts for inheritance hierarchies C++ code String *imclass_cppcasts_code; //C++ casts up inheritance hierarchies intermediary class code String *director_callback_typedefs; // Director function pointer typedefs for callbacks String *director_callbacks; // Director callback function pointer member variables String *director_delegate_callback; // Director callback method that delegates are set to call String *director_delegate_definitions; // Director delegates definitions in proxy class String *director_delegate_instances; // Director delegates member variables in proxy class String *director_method_types; // Director method types String *director_connect_parms; // Director delegates parameter list for director connect call String *destructor_call; //C++ destructor call if any String *output_file; // File name for single file mode. If set all generated code will be written to this file // Director method stuff: List *dmethods_seq; Hash *dmethods_table; int n_dmethods; int n_directors; int first_class_dmethod; int curr_class_dmethod; int nesting_depth; enum EnumFeature { SimpleEnum, TypeunsafeEnum, TypesafeEnum, ProperEnum }; public: /* ----------------------------------------------------------------------------- * CSHARP() * ----------------------------------------------------------------------------- */ CSHARP():empty_string(NewString("")), public_string(NewString("public")), protected_string(NewString("protected")), swig_types_hash(NULL), f_begin(NULL), f_runtime(NULL), f_runtime_h(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), f_directors(NULL), f_directors_h(NULL), f_single_out(NULL), filenames_list(NULL), proxy_flag(true), native_function_flag(false), enum_constant_flag(false), static_flag(false), variable_wrapper_flag(false), wrapping_member_flag(false), global_variable_flag(false), old_variable_names(false), generate_property_declaration_flag(false), imclass_name(NULL), module_class_name(NULL), imclass_class_code(NULL), proxy_class_def(NULL), proxy_class_code(NULL), interface_class_code(NULL), module_class_code(NULL), proxy_class_name(NULL), full_imclass_name(NULL), variable_name(NULL), proxy_class_constants_code(NULL), module_class_constants_code(NULL), enum_code(NULL), dllimport(NULL), namespce(NULL), imclass_imports(NULL), module_imports(NULL), imclass_baseclass(NULL), module_baseclass(NULL), imclass_interfaces(NULL), module_interfaces(NULL), imclass_class_modifiers(NULL), module_class_modifiers(NULL), upcasts_code(NULL), imclass_cppcasts_code(NULL), director_callback_typedefs(NULL), director_callbacks(NULL), director_delegate_callback(NULL), director_delegate_definitions(NULL), director_delegate_instances(NULL), director_method_types(NULL), director_connect_parms(NULL), destructor_call(NULL), output_file(NULL), dmethods_seq(NULL), dmethods_table(NULL), n_dmethods(0), n_directors(0), first_class_dmethod(0), curr_class_dmethod(0), nesting_depth(0){ /* for now, multiple inheritance in directors is disabled, this should be easy to implement though */ director_multiple_inheritance = 0; director_language = 1; } /* ----------------------------------------------------------------------------- * getProxyName() * * Test to see if a type corresponds to something wrapped with a proxy class. * Return NULL if not otherwise the proxy class name, fully qualified with * a namespace if the nspace feature is used. * ----------------------------------------------------------------------------- */ String *getProxyName(SwigType *t) { String *proxyname = NULL; if (proxy_flag) { Node *n = classLookup(t); if (n) { proxyname = Getattr(n, "proxyname"); if (!proxyname) { String *nspace = Getattr(n, "sym:nspace"); String *symname = Copy(Getattr(n, "sym:name")); if (symname && !GetFlag(n, "feature:flatnested")) { for (Node *outer_class = Getattr(n, "nested:outer"); outer_class; outer_class = Getattr(outer_class, "nested:outer")) { if (String* name = Getattr(outer_class, "sym:name")) { Push(symname, "."); Push(symname, name); } else return NULL; } } if (nspace) { if (namespce) proxyname = NewStringf("%s.%s.%s", namespce, nspace, symname); else proxyname = NewStringf("%s.%s", nspace, symname); } else { proxyname = Copy(symname); } Setattr(n, "proxyname", proxyname); Delete(proxyname); Delete(symname); } } } return proxyname; } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("csharp"); // Look for certain command line options for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-dllimport") == 0) { if (argv[i + 1]) { dllimport = NewString(""); Printf(dllimport, argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-namespace") == 0) { if (argv[i + 1]) { namespce = NewString(""); Printf(namespce, argv[i + 1]); if (Len(namespce) == 0) { Delete(namespce); namespce = 0; } Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-noproxy") == 0)) { Swig_mark_arg(i); proxy_flag = false; } else if (strcmp(argv[i], "-oldvarnames") == 0) { Swig_mark_arg(i); old_variable_names = true; } else if (strcmp(argv[i], "-outfile") == 0) { if (argv[i + 1]) { output_file = NewString(""); Printf(output_file, argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGCSHARP 1", 0); // Add typemap definitions SWIG_typemap_lang("csharp"); SWIG_config_file("csharp.swg"); allow_overloading(); Swig_interface_feature_enable(); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { // Get any options set in the module directive Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode) { if (Getattr(optionsnode, "imclassname")) imclass_name = Copy(Getattr(optionsnode, "imclassname")); /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. */ if (Getattr(optionsnode, "directors")) { allow_directors(); } if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } allow_allprotected(GetFlag(optionsnode, "allprotected")); } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } if (directorsEnabled()) { if (!outfile_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); swig_types_hash = NewHash(); filenames_list = NewList(); // Make the intermediary class and module class names. The intermediary class name can be set in the module directive. if (!imclass_name) { imclass_name = NewStringf("%sPINVOKE", Getattr(n, "name")); module_class_name = Copy(Getattr(n, "name")); } else { // Rename the module name if it is the same as intermediary class name - a backwards compatibility solution if (Cmp(imclass_name, Getattr(n, "name")) == 0) module_class_name = NewStringf("%sModule", Getattr(n, "name")); else module_class_name = Copy(Getattr(n, "name")); } // module class and intermediary classes are always created if (!addSymbol(imclass_name, n)) return SWIG_ERROR; if (!addSymbol(module_class_name, n)) return SWIG_ERROR; imclass_class_code = NewString(""); proxy_class_def = NewString(""); proxy_class_code = NewString(""); module_class_constants_code = NewString(""); imclass_baseclass = NewString(""); imclass_interfaces = NewString(""); imclass_class_modifiers = NewString(""); module_class_code = NewString(""); module_baseclass = NewString(""); module_interfaces = NewString(""); module_imports = NewString(""); module_class_modifiers = NewString(""); imclass_imports = NewString(""); imclass_cppcasts_code = NewString(""); director_connect_parms = NewString(""); upcasts_code = NewString(""); dmethods_seq = NewList(); dmethods_table = NewHash(); n_dmethods = 0; n_directors = 0; if (!dllimport) dllimport = Copy(module_class_name); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGCSHARP\n#define SWIGCSHARP\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); /* Emit initial director header and director code: */ Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module_class_name); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module_class_name); Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } } Printf(f_runtime, "\n"); if (namespce) { String *wrapper_name = NewStringf(""); Printf(wrapper_name, "CSharp_%s_%%f", namespce); Swig_name_register("wrapper", wrapper_name); Delete(wrapper_name); } else { Swig_name_register("wrapper", "CSharp_%f"); } if (old_variable_names) { Swig_name_register("set", "set_%n%v"); Swig_name_register("get", "get_%n%v"); } Printf(f_wrappers, "\n#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); /* Emit code */ Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } // Generate the intermediary class { File *f_im = getOutputFile(SWIG_output_directory(), imclass_name); addOpenNamespace(0, f_im); if (imclass_imports) Printf(f_im, "%s\n", imclass_imports); if (Len(imclass_class_modifiers) > 0) Printf(f_im, "%s ", imclass_class_modifiers); Printf(f_im, "%s ", imclass_name); if (imclass_baseclass && *Char(imclass_baseclass)) Printf(f_im, ": %s ", imclass_baseclass); if (Len(imclass_interfaces) > 0) Printv(f_im, "implements ", imclass_interfaces, " ", NIL); Printf(f_im, "{\n"); // Add the intermediary class methods Replaceall(imclass_class_code, "$module", module_class_name); Replaceall(imclass_class_code, "$imclassname", imclass_name); Replaceall(imclass_class_code, "$dllimport", dllimport); Printv(f_im, imclass_class_code, NIL); Printv(f_im, imclass_cppcasts_code, NIL); // Finish off the class Printf(f_im, "}\n"); addCloseNamespace(0, f_im); if (f_im != f_single_out) Delete(f_im); f_im = NULL; } // Generate the C# module class { File *f_module = getOutputFile(SWIG_output_directory(), module_class_name); addOpenNamespace(0, f_module); if (module_imports) Printf(f_module, "%s\n", module_imports); if (Len(module_class_modifiers) > 0) Printf(f_module, "%s ", module_class_modifiers); Printf(f_module, "%s ", module_class_name); if (module_baseclass && *Char(module_baseclass)) Printf(f_module, ": %s ", module_baseclass); if (Len(module_interfaces) > 0) Printv(f_module, "implements ", module_interfaces, " ", NIL); Printf(f_module, "{\n"); Replaceall(module_class_code, "$module", module_class_name); Replaceall(module_class_constants_code, "$module", module_class_name); Replaceall(module_class_code, "$imclassname", imclass_name); Replaceall(module_class_constants_code, "$imclassname", imclass_name); Replaceall(module_class_code, "$dllimport", dllimport); Replaceall(module_class_constants_code, "$dllimport", dllimport); // Add the wrapper methods Printv(f_module, module_class_code, NIL); // Write out all the global constants Printv(f_module, module_class_constants_code, NIL); // Finish off the class Printf(f_module, "}\n"); addCloseNamespace(0, f_module); if (f_module != f_single_out) Delete(f_module); f_module = NULL; } if (upcasts_code) Printv(f_wrappers, upcasts_code, NIL); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); // Output a C# type wrapper class for each SWIG type for (Iterator swig_type = First(swig_types_hash); swig_type.key; swig_type = Next(swig_type)) { emitTypeWrapperClass(swig_type.key, swig_type.item); } // Check for overwriting file problems on filesystems that are case insensitive Iterator it1; Iterator it2; for (it1 = First(filenames_list); it1.item; it1 = Next(it1)) { String *item1_lower = Swig_string_lower(it1.item); for (it2 = Next(it1); it2.item; it2 = Next(it2)) { String *item2_lower = Swig_string_lower(it2.item); if (it1.item && it2.item) { if (Strcmp(item1_lower, item2_lower) == 0) { Swig_warning(WARN_LANG_PORTABILITY_FILENAME, input_file, line_number, "Portability warning: File %s will be overwritten by %s on case insensitive filesystems such as " "Windows' FAT32 and NTFS unless the class/module name is renamed\n", it1.item, it2.item); } } Delete(item2_lower); } Delete(item1_lower); } Delete(swig_types_hash); swig_types_hash = NULL; Delete(filenames_list); filenames_list = NULL; Delete(imclass_name); imclass_name = NULL; Delete(imclass_class_code); imclass_class_code = NULL; Delete(proxy_class_def); proxy_class_def = NULL; Delete(proxy_class_code); proxy_class_code = NULL; Delete(module_class_constants_code); module_class_constants_code = NULL; Delete(imclass_baseclass); imclass_baseclass = NULL; Delete(imclass_interfaces); imclass_interfaces = NULL; Delete(imclass_class_modifiers); imclass_class_modifiers = NULL; Delete(module_class_name); module_class_name = NULL; Delete(module_class_code); module_class_code = NULL; Delete(module_baseclass); module_baseclass = NULL; Delete(module_interfaces); module_interfaces = NULL; Delete(module_imports); module_imports = NULL; Delete(module_class_modifiers); module_class_modifiers = NULL; Delete(imclass_imports); imclass_imports = NULL; Delete(imclass_cppcasts_code); imclass_cppcasts_code = NULL; Delete(upcasts_code); upcasts_code = NULL; Delete(dmethods_seq); dmethods_seq = NULL; Delete(dmethods_table); dmethods_table = NULL; Delete(namespce); namespce = NULL; n_dmethods = 0; /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors, f_begin); Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); f_runtime_h = NULL; Delete(f_directors); f_directors = NULL; Delete(f_directors_h); f_directors_h = NULL; } if (f_single_out) { Dump(f_single_out, f_begin); Delete(f_single_out); f_single_out = NULL; } Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ----------------------------------------------------------------------------- * emitBanner() * ----------------------------------------------------------------------------- */ void emitBanner(File *f) { Printf(f, "//------------------------------------------------------------------------------\n"); Printf(f, "// \n"); Printf(f, "//\n"); Swig_banner_target_lang(f, "//"); Printf(f, "//------------------------------------------------------------------------------\n\n"); } /* ----------------------------------------------------------------------------- * getOutputFile() * * Prepares a File object by creating the file in the file system and * writing the banner for auto-generated files to it (emitBanner). * If '-outfile' is provided (single file mode) the supplied parameters will * be ignored and the returned file will always be: * / * Otherwise the file will be: * /.cs * ----------------------------------------------------------------------------- */ File *getOutputFile(const String *dir, const String *name) { if (output_file) { if (!f_single_out) { String *filen = NewStringf("%s%s", SWIG_output_directory(), output_file); f_single_out = NewFile(filen, "w", SWIG_output_files()); if (!f_single_out) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; emitBanner(f_single_out); } return f_single_out; } else { String *filen = NewStringf("%s%s.cs", dir, name); File *f = NewFile(filen, "w", SWIG_output_files()); if (!f) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; emitBanner(f); return f; } } /*----------------------------------------------------------------------- * Add new director upcall signature *----------------------------------------------------------------------*/ UpcallData *addUpcallMethod(String *imclass_method, String *class_method, String *decl, String *overloaded_name) { String *key = NewStringf("%s|%s", imclass_method, decl); ++curr_class_dmethod; String *class_methodidx = NewStringf("%d", n_dmethods - first_class_dmethod); n_dmethods++; Hash *new_udata = NewHash(); Append(dmethods_seq, new_udata); Setattr(dmethods_table, key, new_udata); Setattr(new_udata, "method", Copy(class_method)); Setattr(new_udata, "class_methodidx", class_methodidx); Setattr(new_udata, "decl", Copy(decl)); Setattr(new_udata, "overname", Copy(overloaded_name)); Delete(key); return new_udata; } /*----------------------------------------------------------------------- * Get director upcall signature *----------------------------------------------------------------------*/ /* UpcallData * getUpcallMethodData(String *director_class, String *decl) { String *key = NewStringf("%s|%s", director_class, decl); UpcallData *udata = Getattr(dmethods_table, key); Delete(key); return udata; } */ /* ---------------------------------------------------------------------- * nativeWrapper() * ---------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n, imclass_name)) return SWIG_ERROR; if (Getattr(n, "type")) { Swig_save("nativeWrapper", n, "name", NIL); Setattr(n, "name", wrapname); native_function_flag = true; functionWrapper(n); Swig_restore(n); native_function_flag = false; } else { Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name")); } return SWIG_OK; } /* ---------------------------------------------------------------------- * functionWrapper() * ---------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *c_return_type = NewString(""); String *im_return_type = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *body = NewString(""); String *im_outattributes = 0; int num_arguments = 0; bool is_void_return; String *overloaded_name = getOverloadedName(n); if (!Getattr(n, "sym:overloaded")) { if (!addSymbol(symname, n, imclass_name)) return SWIG_ERROR; } /* The rest of this function deals with generating the intermediary class wrapper function (that wraps a c/c++ function) and generating the PInvoke c code. Each C# wrapper function has a matching PInvoke c function call. */ // A new wrapper function object Wrapper *f = NewWrapper(); // Make a wrapper name for this function String *wname = Swig_name_wrapper(overloaded_name); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("ctype", l, f); Swig_typemap_attach_parms("imtype", l, f); /* Get return types */ if ((tm = Swig_typemap_lookup("ctype", n, "", 0))) { String *ctypeout = Getattr(n, "tmap:ctype:out"); // the type in the ctype typemap's out attribute overrides the type in the typemap if (ctypeout) tm = ctypeout; Printf(c_return_type, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(t, 0)); } if ((tm = Swig_typemap_lookup("imtype", n, "", 0))) { String *imtypeout = Getattr(n, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap if (imtypeout) tm = imtypeout; Printf(im_return_type, "%s", tm); im_outattributes = Getattr(n, "tmap:imtype:outattributes"); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(t, 0)); } is_void_return = (Cmp(c_return_type, "void") == 0); if (!is_void_return) Wrapper_add_localv(f, "jresult", c_return_type, "jresult", NIL); Printv(f->def, " SWIGEXPORT ", c_return_type, " SWIGSTDCALL ", wname, "(", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); // Parameter overloading Setattr(n, "wrap:parms", l); Setattr(n, "wrap:name", wname); // Wrappers not wanted for some methods where the parameters cannot be overloaded in C# if (Getattr(n, "sym:overloaded")) { // Emit warnings for the few cases that can't be overloaded in C# and give up on generating wrapper Swig_overload_check(n); if (Getattr(n, "overload:ignore")) { DelWrapper(f); return SWIG_OK; } } Printv(imclass_class_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); if (im_outattributes) Printf(imclass_class_code, " %s\n", im_outattributes); Printf(imclass_class_code, " public static extern %s %s(", im_return_type, overloaded_name); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); int gencomma = 0; // Now walk the function parameter list and generate code to get arguments for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *im_param_type = NewString(""); String *c_param_type = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* Get the ctype types of the parameter */ if ((tm = Getattr(p, "tmap:ctype"))) { Printv(c_param_type, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Get the intermediary class parameter types of the parameter */ if ((tm = Getattr(p, "tmap:imtype"))) { const String *inattributes = Getattr(p, "tmap:imtype:inattributes"); Printf(im_param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to intermediary class method */ if (gencomma) Printf(imclass_class_code, ", "); Printf(imclass_class_code, "%s %s", im_param_type, arg); // Add parameter to C function Printv(f->def, gencomma ? ", " : "", c_param_type, " ", arg, NIL); gencomma = 1; // Get typemap for this argument if ((tm = Getattr(p, "tmap:in"))) { canThrow(n, "in", p); Replaceall(tm, "$source", arg); /* deprecated */ Replaceall(tm, "$target", ln); /* deprecated */ Replaceall(tm, "$arg", arg); /* deprecated? */ Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } Delete(im_param_type); Delete(c_param_type); Delete(arg); } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { canThrow(n, "check", p); Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { canThrow(n, "freearg", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { canThrow(n, "argout", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Look for usage of throws typemap and the canthrow flag ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "catchlist"))) { Swig_typemap_attach_parms("throws", throw_parm_list, f); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { canThrow(n, "throws", p); } } } String *null_attribute = 0; // Now write code to make the function call if (!native_function_flag) { Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { canThrow(n, "out", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Replaceall(tm, "$target", "jresult"); /* deprecated */ Replaceall(tm, "$result", "jresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printf(f->code, "%s", tm); null_attribute = Getattr(n, "tmap:out:null"); if (Len(tm)) Printf(f->code, "\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), Getattr(n, "name")); } emit_return_variable(n, t, f); } /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { canThrow(n, "newfree", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if (!native_function_flag) { if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { canThrow(n, "ret", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* Finish C function and intermediary class function definitions */ Printf(imclass_class_code, ")"); Printf(imclass_class_code, ";\n"); Printf(f->def, ") {"); if (!is_void_return) Printv(f->code, " return jresult;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); /* Contract macro modification */ if (Replaceall(f->code, "SWIG_contract_assert(", "SWIG_contract_assert($null, ") > 0) { Setattr(n, "csharp:canthrow", "1"); } if (!null_attribute) Replaceall(f->code, "$null", "0"); else Replaceall(f->code, "$null", null_attribute); /* Dump the function out */ if (!native_function_flag) { Wrapper_print(f, f_wrappers); // Handle %csexception which sets the canthrow attribute if (Getattr(n, "feature:except:canthrow")) Setattr(n, "csharp:canthrow", "1"); // A very simple check (it is not foolproof) to help typemap/feature writers for // throwing C# exceptions from unmanaged code. It checks for the common methods which // set a pending C# exception... the 'canthrow' typemap/feature attribute must be set // so that code which checks for pending exceptions is added in the C# proxy method. if (!Getattr(n, "csharp:canthrow")) { if (Strstr(f->code, "SWIG_exception")) { Swig_warning(WARN_CSHARP_CANTHROW, input_file, line_number, "Unmanaged code contains a call to SWIG_exception and C# code does not handle pending exceptions via the canthrow attribute.\n"); } else if (Strstr(f->code, "SWIG_CSharpSetPendingException")) { Swig_warning(WARN_CSHARP_CANTHROW, input_file, line_number, "Unmanaged code contains a call to a SWIG_CSharpSetPendingException method and C# code does not handle pending exceptions via the canthrow attribute.\n"); } } } if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { moduleClassFunctionHandler(n); } /* * Generate the proxy class properties for public member variables. * Not for enums and constants. */ if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Capitalize the first letter in the variable in the getter/setter function name bool getter_flag = Cmp(symname, Swig_name_set(getNSpace(), Swig_name_member(0, getClassPrefix(), variable_name))) != 0; String *getter_setter_name = NewString(""); if (!getter_flag) Printf(getter_setter_name, "set"); else Printf(getter_setter_name, "get"); Putc(toupper((int) *Char(variable_name)), getter_setter_name); Printf(getter_setter_name, "%s", Char(variable_name) + 1); Setattr(n, "proxyfuncname", getter_setter_name); Setattr(n, "imfuncname", symname); proxyClassFunctionHandler(n); Delete(getter_setter_name); } Delete(c_return_type); Delete(im_return_type); Delete(cleanup); Delete(outarg); Delete(body); Delete(overloaded_name); DelWrapper(f); return SWIG_OK; } /* ----------------------------------------------------------------------- * variableWrapper() * ----------------------------------------------------------------------- */ virtual int variableWrapper(Node *n) { Language::variableWrapper(n); return SWIG_OK; } /* ----------------------------------------------------------------------- * globalvariableHandler() * ------------------------------------------------------------------------ */ virtual int globalvariableHandler(Node *n) { generate_property_declaration_flag = true; variable_name = Getattr(n, "sym:name"); global_variable_flag = true; int ret = Language::globalvariableHandler(n); global_variable_flag = false; generate_property_declaration_flag = false; if (proxy_flag) { Printf(module_class_code, "\n }\n\n"); } return ret; } String *getCurrentScopeName(String *nspace) { String *scope = 0; if (nspace || getCurrentClass()) { scope = NewString(""); if (nspace) Printf(scope, "%s", nspace); if (Node *cls = getCurrentClass()) { if (Node *outer = Getattr(cls, "nested:outer")) { String *outerClassesPrefix = Copy(Getattr(outer, "sym:name")); for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { Push(outerClassesPrefix, "."); Push(outerClassesPrefix, Getattr(outer, "sym:name")); } Printv(scope, nspace ? "." : "", outerClassesPrefix, ".", proxy_class_name, NIL); Delete(outerClassesPrefix); } else Printv(scope, nspace ? "." : "", proxy_class_name, NIL); } } return scope; } /* ---------------------------------------------------------------------- * enumDeclaration() * * C/C++ enums can be mapped in one of 4 ways, depending on the cs:enum feature specified: * 1) Simple enums - simple constant within the proxy class or module class * 2) Typeunsafe enums - simple constant in a C# class (class named after the c++ enum name) * 3) Typesafe enum - typesafe enum pattern (class named after the c++ enum name) * 4) Proper enums - proper C# enum * Anonymous enums always default to 1) * ---------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { if (!ImportMode) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *nspace = Getattr(n, "sym:nspace"); // NSpace/getNSpace() only works during Language::enumDeclaration call if (proxy_flag && !is_wrapping_class()) { // Global enums / enums in a namespace assert(!full_imclass_name); if (!nspace) { full_imclass_name = NewStringf("%s", imclass_name); } else { if (namespce) { full_imclass_name = NewStringf("%s.%s", namespce, imclass_name); } else { full_imclass_name = NewStringf("%s", imclass_name); } } } enum_code = NewString(""); String *symname = Getattr(n, "sym:name"); String *constants_code = (proxy_flag && is_wrapping_class())? proxy_class_constants_code : module_class_constants_code; EnumFeature enum_feature = decodeEnumFeature(n); String *typemap_lookup_type = Getattr(n, "name"); if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper C# enum String *scope = getCurrentScopeName(nspace); if (!addSymbol(symname, n, scope)) return SWIG_ERROR; // Pure C# baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "csbase", typemap_lookup_type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "csinterfaces", typemap_lookup_type, WARN_NONE); // Class attributes const String *csattributes = typemapLookup(n, "csattributes", typemap_lookup_type, WARN_NONE); if (csattributes && *Char(csattributes)) Printf(enum_code, "%s\n", csattributes); // Emit the enum Printv(enum_code, typemapLookup(n, "csclassmodifiers", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers (enum modifiers really) " ", symname, (*Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", pure_baseclass, ((*Char(pure_baseclass)) && *Char(pure_interfaces)) ? // Interfaces ", " : "", pure_interfaces, " {\n", NIL); Delete(scope); } else { // Wrap C++ enum with integers - just indicate start of enum with a comment, no comment for anonymous enums of any sort if (symname && !Getattr(n, "unnamedinstance")) Printf(constants_code, " // %s \n", symname); } // Emit each enum item Language::enumDeclaration(n); if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper C# enum // Finish the enum declaration // Typemaps are used to generate the enum definition in a similar manner to proxy classes. Printv(enum_code, (enum_feature == ProperEnum) ? "\n" : typemapLookup(n, "csbody", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF), // main body of class typemapLookup(n, "cscode", typemap_lookup_type, WARN_NONE), // extra C# code "}", NIL); Replaceall(enum_code, "$csclassname", symname); // Substitute $enumvalues - intended usage is for typesafe enums if (Getattr(n, "enumvalues")) Replaceall(enum_code, "$enumvalues", Getattr(n, "enumvalues")); else Replaceall(enum_code, "$enumvalues", ""); if (proxy_flag && is_wrapping_class()) { // Enums defined within the C++ class are defined within the proxy class // Add extra indentation Replaceall(enum_code, "\n", "\n "); Replaceall(enum_code, " \n", "\n"); Printv(proxy_class_constants_code, " ", enum_code, "\n\n", NIL); } else { // Global enums are defined in their own file String *output_directory = outputDirectory(nspace); File *f_enum = getOutputFile(output_directory, symname); addOpenNamespace(nspace, f_enum); Printv(f_enum, typemapLookup(n, "csimports", typemap_lookup_type, WARN_NONE), // Import statements "\n", enum_code, "\n", NIL); addCloseNamespace(nspace, f_enum); if (f_enum != f_single_out) Delete(f_enum); f_enum = NULL; Delete(output_directory); } } else { // Wrap C++ enum with simple constant Printf(enum_code, "\n"); if (proxy_flag && is_wrapping_class()) Printv(proxy_class_constants_code, enum_code, NIL); else Printv(module_class_constants_code, enum_code, NIL); } Delete(enum_code); enum_code = NULL; if (proxy_flag && !is_wrapping_class()) { Delete(full_imclass_name); full_imclass_name = 0; } } return SWIG_OK; } /* ---------------------------------------------------------------------- * enumvalueDeclaration() * ---------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "?value", NIL); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); Node *parent = parentNode(n); int unnamedinstance = GetFlag(parent, "unnamedinstance"); String *parent_name = Getattr(parent, "name"); String *nspace = getNSpace(); String *newsymname = 0; String *tmpValue; // Strange hack from parent method if (value) tmpValue = NewString(value); else tmpValue = NewString(name); // Note that this is used in enumValue() amongst other places Setattr(n, "value", tmpValue); // Deal with enum values that are not int int swigtype = SwigType_type(Getattr(n, "type")); if (swigtype == T_BOOL) { const char *val = Equal(Getattr(n, "enumvalue"), "true") ? "1" : "0"; Setattr(n, "enumvalue", val); } else if (swigtype == T_CHAR) { String *val = NewStringf("'%(hexescape)s'", Getattr(n, "enumvalue")); Setattr(n, "enumvalue", val); Delete(val); } { EnumFeature enum_feature = decodeEnumFeature(parent); if ((enum_feature == SimpleEnum) && GetFlag(parent, "scopedenum")) { newsymname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); symname = newsymname; } // Add to language symbol table String *scope = 0; if (unnamedinstance || !parent_name || enum_feature == SimpleEnum) { String *enumClassPrefix = getEnumClassPrefix(); if (enumClassPrefix) { scope = NewString(""); if (nspace) Printf(scope, "%s.", nspace); Printf(scope, "%s", enumClassPrefix); } else { scope = Copy(module_class_name); } } else { scope = getCurrentScopeName(nspace); if (!scope) scope = Copy(Getattr(parent, "sym:name")); else Printf(scope, ".%s", Getattr(parent, "sym:name")); } if (!addSymbol(symname, n, scope)) return SWIG_ERROR; const String *csattributes = Getattr(n, "feature:cs:attributes"); if ((enum_feature == ProperEnum) && parent_name && !unnamedinstance) { // Wrap (non-anonymous) C/C++ enum with a proper C# enum // Emit the enum item. if (!GetFlag(n, "firstenumitem")) Printf(enum_code, ",\n"); if (csattributes) Printf(enum_code, " %s\n", csattributes); Printf(enum_code, " %s", symname); // Check for the %csconstvalue feature String *value = Getattr(n, "feature:cs:constvalue"); // Note that the enum value must be a true constant and cannot be set from a PINVOKE call, thus no support for %csconst(0) value = value ? value : Getattr(n, "enumvalue"); if (value) { Printf(enum_code, " = %s", value); } } else { // Wrap C/C++ enums with constant integers or use the typesafe enum pattern SwigType *typemap_lookup_type = parent_name ? parent_name : NewString("enum "); Setattr(n, "type", typemap_lookup_type); const String *tm = typemapLookup(n, "cstype", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF); String *return_type = Copy(tm); substituteClassname(typemap_lookup_type, return_type); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); if (csattributes) Printf(enum_code, " %s\n", csattributes); if ((enum_feature == TypesafeEnum) && parent_name && !unnamedinstance) { // Wrap (non-anonymous) enum using the typesafe enum pattern if (Getattr(n, "enumvalue")) { String *value = enumValue(n); Printf(enum_code, " %s static readonly %s %s = new %s(\"%s\", %s);\n", methodmods, return_type, symname, return_type, symname, value); Delete(value); } else { Printf(enum_code, " %s static readonly %s %s = new %s(\"%s\");\n", methodmods, return_type, symname, return_type, symname); } } else { // Simple integer constants // Note these are always generated for anonymous enums, no matter what enum_feature is specified // Code generated is the same for SimpleEnum and TypeunsafeEnum -> the class it is generated into is determined later // The %csconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:cs:const"); const char *const_readonly = const_feature_flag ? "const" : "static readonly"; String *value = enumValue(n); Printf(enum_code, " %s %s %s %s = %s;\n", methodmods, const_readonly, return_type, symname, value); Delete(value); } Delete(return_type); } // Add the enum value to the comma separated list being constructed in the enum declaration. String *enumvalues = Getattr(parent, "enumvalues"); if (!enumvalues) Setattr(parent, "enumvalues", Copy(symname)); else Printv(enumvalues, ", ", symname, NIL); Delete(scope); } Delete(newsymname); Delete(tmpValue); Swig_restore(n); return SWIG_OK; } /* ----------------------------------------------------------------------- * constantWrapper() * Used for wrapping constants - #define or %constant. * Also for inline initialised const static primitive type member variables (short, int, double, enums etc). * C# static const variables are generated for these. * If the %csconst(1) feature is used then the C constant value is used to initialise the C# const variable. * If not, a PINVOKE method is generated to get the C constant value for initialisation of the C# const variable. * However, if the %csconstvalue feature is used, it overrides all other ways to generate the initialisation. * Also note that this method might be called for wrapping enum items (when the enum is using %csconst(0)). * ------------------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); SwigType *valuetype = Getattr(n, "valuetype"); ParmList *l = Getattr(n, "parms"); String *tm; String *return_type = NewString(""); String *constants_code = NewString(""); Swig_save("constantWrapper", n, "value", NIL); Swig_save("constantWrapper", n, "tmap:ctype:out", "tmap:imtype:out", "tmap:cstype:out", "tmap:out:null", "tmap:imtype:outattributes", "tmap:cstype:outattributes", NIL); bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); const String *itemname = (proxy_flag && wrapping_member_flag) ? variable_name : symname; if (!is_enum_item) { String *scope = 0; if (proxy_class_name) { String *nspace = getNSpace(); scope = NewString(""); if (nspace) Printf(scope, "%s.", nspace); Printf(scope, "%s", proxy_class_name); } else { scope = Copy(module_class_name); } if (!addSymbol(itemname, n, scope)) return SWIG_ERROR; Delete(scope); } // The %csconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:cs:const"); /* Adjust the enum type for the Swig_typemap_lookup. * We want the same jstype typemap for all the enum items so we use the enum type (parent node). */ if (is_enum_item) { t = Getattr(parentNode(n), "enumtype"); Setattr(n, "type", t); } /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("cstype", l, NULL); /* Get C# return types */ bool classname_substituted_flag = false; if ((tm = Swig_typemap_lookup("cstype", n, "", 0))) { String *cstypeout = Getattr(n, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap if (cstypeout) tm = cstypeout; classname_substituted_flag = substituteClassname(t, tm); Printf(return_type, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(t, 0)); } // Default (octal) escaping is no good - change to hex escaped value String *hexescaped_value = Getattr(n, "rawvalue") ? NewStringf("%(hexescape)s", Getattr(n, "rawvalue")) : 0; // Add the stripped quotes back in String *new_value = NewString(""); if (SwigType_type(t) == T_STRING) { Printf(new_value, "\"%s\"", hexescaped_value ? hexescaped_value : Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } else if (SwigType_type(t) == T_CHAR) { Printf(new_value, "\'%s\'", hexescaped_value ? hexescaped_value : Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } const String *outattributes = Getattr(n, "tmap:cstype:outattributes"); if (outattributes) Printf(constants_code, " %s\n", outattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(constants_code, " %s %s %s %s = ", methodmods, (const_feature_flag ? "const" : "static readonly"), return_type, itemname); // Check for the %csconstvalue feature String *value = Getattr(n, "feature:cs:constvalue"); if (value) { Printf(constants_code, "%s;\n", value); } else if (!const_feature_flag) { // Default enum and constant handling will work with any type of C constant and initialises the C# variable from C through a PINVOKE call. if (classname_substituted_flag) { if (SwigType_isenum(t)) { // This handles wrapping of inline initialised const enum static member variables (not when wrapping enum items - ignored later on) Printf(constants_code, "(%s)%s.%s();\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { // This handles function pointers using the %constant directive Printf(constants_code, "new %s(%s.%s(), false);\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } } else { Printf(constants_code, "%s.%s();\n", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } // Each constant and enum value is wrapped with a separate PInvoke function call SetFlag(n, "feature:immutable"); enum_constant_flag = true; variableWrapper(n); enum_constant_flag = false; } else { // Alternative constant handling will use the C syntax to make a true C# constant and hope that it compiles as C# code if (Getattr(n, "wrappedasconstant")) { if (SwigType_type(t) == T_CHAR) { if (SwigType_type(valuetype) == T_CHAR) Printf(constants_code, "\'%(hexescape)s\';\n", Getattr(n, "staticmembervariableHandler:value")); else Printf(constants_code, "(char)%s;\n", Getattr(n, "staticmembervariableHandler:value")); } else { Printf(constants_code, "%s;\n", Getattr(n, "staticmembervariableHandler:value")); } } else { Printf(constants_code, "%s;\n", Getattr(n, "value")); } } // Emit the generated code to appropriate place // Enums only emit the intermediate and PINVOKE methods, so no proxy or module class wrapper methods needed if (!is_enum_item) { if (proxy_flag && wrapping_member_flag) Printv(proxy_class_constants_code, constants_code, NIL); else Printv(module_class_constants_code, constants_code, NIL); } // Cleanup Swig_restore(n); Delete(new_value); Delete(return_type); Delete(constants_code); return SWIG_OK; } /* ----------------------------------------------------------------------------- * insertDirective() * ----------------------------------------------------------------------------- */ virtual int insertDirective(Node *n) { int ret = SWIG_OK; String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); Replaceall(code, "$module", module_class_name); Replaceall(code, "$imclassname", imclass_name); Replaceall(code, "$dllimport", dllimport); if (!ImportMode && (Cmp(section, "proxycode") == 0)) { if (proxy_class_code) { Swig_typemap_replace_embedded_typemap(code, n); int offset = Len(code) > 0 && *Char(code) == '\n' ? 1 : 0; Printv(proxy_class_code, Char(code) + offset, "\n", NIL); } } else { ret = Language::insertDirective(n); } return ret; } /* ----------------------------------------------------------------------------- * pragmaDirective() * * Valid Pragmas: * imclassbase - base (extends) for the intermediary class * imclassclassmodifiers - class modifiers for the intermediary class * imclasscode - text (C# code) is copied verbatim to the intermediary class * imclassimports - import statements for the intermediary class * imclassinterfaces - interface (implements) for the intermediary class * * modulebase - base (extends) for the module class * moduleclassmodifiers - class modifiers for the module class * modulecode - text (C# code) is copied verbatim to the module class * moduleimports - import statements for the module class * moduleinterfaces - interface (implements) for the module class * * ----------------------------------------------------------------------------- */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *code = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "csharp") == 0) { String *strvalue = NewString(value); Replaceall(strvalue, "\\\"", "\""); if (Strcmp(code, "imclassbase") == 0) { Delete(imclass_baseclass); imclass_baseclass = Copy(strvalue); } else if (Strcmp(code, "imclassclassmodifiers") == 0) { Delete(imclass_class_modifiers); imclass_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "imclasscode") == 0) { Printf(imclass_class_code, "%s\n", strvalue); } else if (Strcmp(code, "imclassimports") == 0) { Delete(imclass_imports); imclass_imports = Copy(strvalue); } else if (Strcmp(code, "imclassinterfaces") == 0) { Delete(imclass_interfaces); imclass_interfaces = Copy(strvalue); } else if (Strcmp(code, "modulebase") == 0) { Delete(module_baseclass); module_baseclass = Copy(strvalue); } else if (Strcmp(code, "moduleclassmodifiers") == 0) { Delete(module_class_modifiers); module_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "modulecode") == 0) { Printf(module_class_code, "%s\n", strvalue); } else if (Strcmp(code, "moduleimports") == 0) { Delete(module_imports); module_imports = Copy(strvalue); } else if (Strcmp(code, "moduleinterfaces") == 0) { Delete(module_interfaces); module_interfaces = Copy(strvalue); } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } Delete(strvalue); } } return Language::pragmaDirective(n); } /* ----------------------------------------------------------------------------- * getQualifiedInterfaceName() * ----------------------------------------------------------------------------- */ String *getQualifiedInterfaceName(Node *n) { String *ret = Getattr(n, "interface:qname"); if (!ret) { String *nspace = Getattr(n, "sym:nspace"); String *interface_name = Getattr(n, "interface:name"); if (nspace) { if (namespce) ret = NewStringf("%s.%s.%s", namespce, nspace, interface_name); else ret = NewStringf("%s.%s", nspace, interface_name); } else { ret = Copy(interface_name); } Setattr(n, "interface:qname", ret); } return ret; } /* ----------------------------------------------------------------------------- * getInterfaceName() * ----------------------------------------------------------------------------- */ String *getInterfaceName(SwigType *t, bool qualified) { String *interface_name = NULL; if (proxy_flag) { Node *n = classLookup(t); if (n && Getattr(n, "interface:name")) interface_name = qualified ? getQualifiedInterfaceName(n) : Getattr(n, "interface:name"); } return interface_name; } /* ----------------------------------------------------------------------------- * addInterfaceNameAndUpcasts() * ----------------------------------------------------------------------------- */ void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, SwigType *c_classname) { List *keys = Keys(base_list); for (Iterator it = First(keys); it.item; it = Next(it)) { Node *base = Getattr(base_list, it.item); SwigType *c_baseclassname = Getattr(base, "name"); String *interface_name = Getattr(base, "interface:name"); if (Len(interface_list)) Append(interface_list, ", "); Append(interface_list, interface_name); Node *attributes = NewHash(); String *interface_code = Copy(typemapLookup(base, "csinterfacecode", Getattr(base, "classtypeobj"), WARN_CSHARP_TYPEMAP_INTERFACECODE_UNDEF, attributes)); String *cptr_method_name = 0; if (interface_code) { Replaceall(interface_code, "$interfacename", interface_name); Printv(interface_upcasts, interface_code, NIL); cptr_method_name = Copy(Getattr(attributes, "tmap:csinterfacecode:cptrmethod")); } if (!cptr_method_name) cptr_method_name = NewStringf("%s_GetInterfaceCPtr", interface_name); Replaceall(cptr_method_name, ".", "_"); Replaceall(cptr_method_name, "$interfacename", interface_name); String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), cptr_method_name); upcastsCode(smart, upcast_method_name, c_classname, c_baseclassname); Delete(upcast_method_name); Delete(cptr_method_name); Delete(interface_code); } Delete(keys); } /* ----------------------------------------------------------------------------- * upcastsCode() * * Add code for C++ casting to base class * ----------------------------------------------------------------------------- */ void upcastsCode(SwigType *smart, String *upcast_method_name, SwigType *c_classname, SwigType *c_baseclassname) { String *wname = Swig_name_wrapper(upcast_method_name); Printv(imclass_cppcasts_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); Printf(imclass_cppcasts_code, " public static extern global::System.IntPtr %s(global::System.IntPtr jarg1);\n", upcast_method_name); Replaceall(imclass_cppcasts_code, "$csclassname", proxy_class_name); String *classname = SwigType_namestr(c_classname); String *baseclassname = SwigType_namestr(c_baseclassname); if (smart) { String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(smart); // TODO: SwigType_typedef_resolve_all on a String instead of SwigType is incorrect for templates SwigType *rclassname = SwigType_typedef_resolve_all(classname); SwigType *rbaseclassname = SwigType_typedef_resolve_all(baseclassname); Replaceall(bsmartnamestr, rclassname, rbaseclassname); Printv(upcasts_code, "SWIGEXPORT ", bsmartnamestr, " * SWIGSTDCALL ", wname, "(", smartnamestr, " *jarg1) {\n", " return jarg1 ? new ", bsmartnamestr, "(*jarg1) : 0;\n" "}\n", "\n", NIL); Delete(rbaseclassname); Delete(rclassname); Delete(bsmartnamestr); Delete(smartnamestr); } else { Printv(upcasts_code, "SWIGEXPORT ", baseclassname, " * SWIGSTDCALL ", wname, "(", classname, " *jarg1) {\n", " return (", baseclassname, " *)jarg1;\n" "}\n", "\n", NIL); } Delete(baseclassname); Delete(classname); Delete(wname); } /* ----------------------------------------------------------------------------- * emitProxyClassDefAndCPPCasts() * ----------------------------------------------------------------------------- */ void emitProxyClassDefAndCPPCasts(Node *n) { SwigType *c_classname = Getattr(n, "name"); SwigType *c_baseclassname = NULL; String *baseclass = NULL; String *interface_list = NewStringEmpty(); String *interface_upcasts = NewStringEmpty(); SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); bool feature_director = Swig_directorclass(n) ? true : false; bool has_outerclass = Getattr(n, "nested:outer") != 0 && !GetFlag(n, "feature:flatnested"); SwigType *smart = Swig_cparse_smartptr(n); // Inheritance from pure C# classes Node *attributes = NewHash(); const String *pure_baseclass = typemapLookup(n, "csbase", typemap_lookup_type, WARN_NONE, attributes); bool purebase_replace = GetFlag(attributes, "tmap:csbase:replace") ? true : false; bool purebase_notderived = GetFlag(attributes, "tmap:csbase:notderived") ? true : false; Delete(attributes); // C++ inheritance if (!purebase_replace) { List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item) { if (!(GetFlag(base.item, "feature:ignore") || Getattr(base.item, "feature:interface"))) { SwigType *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { String *name = getProxyName(baseclassname); if (name) { c_baseclassname = baseclassname; baseclass = name; } } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); Swig_warning(WARN_CSHARP_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in C#.\n", SwigType_namestr(proxyclassname), SwigType_namestr(baseclassname)); } } base = Next(base); } } } Hash *interface_bases = Getattr(n, "interface:bases"); if (interface_bases) addInterfaceNameAndUpcasts(smart, interface_list, interface_upcasts, interface_bases, c_classname); bool derived = baseclass != 0; if (derived && purebase_notderived) pure_baseclass = empty_string; const String *wanted_base = baseclass ? baseclass : pure_baseclass; if (purebase_replace) { wanted_base = pure_baseclass; derived = false; baseclass = NULL; if (purebase_notderived) Swig_error(Getfile(n), Getline(n), "The csbase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); } else if (Len(pure_baseclass) > 0 && Len(baseclass) > 0) { Swig_warning(WARN_CSHARP_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in C#. " "Perhaps you need one of the 'replace' or 'notderived' attributes in the csbase typemap?\n", typemap_lookup_type, pure_baseclass); } // Pure C# interfaces const String *pure_interfaces = typemapLookup(n, derived ? "csinterfaces_derived" : "csinterfaces", typemap_lookup_type, WARN_NONE); if (*Char(interface_list) && *Char(pure_interfaces)) Append(interface_list, ", "); Append(interface_list, pure_interfaces); // Start writing the proxy class if (!has_outerclass) Printv(proxy_class_def, typemapLookup(n, "csimports", typemap_lookup_type, WARN_NONE), // Import statements "\n", NIL); // Class attributes const String *csattributes = typemapLookup(n, "csattributes", typemap_lookup_type, WARN_NONE); if (csattributes && *Char(csattributes)) Printf(proxy_class_def, "%s\n", csattributes); Printv(proxy_class_def, typemapLookup(n, "csclassmodifiers", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " $csclassname", // Class name and base class (*Char(wanted_base) || *Char(interface_list)) ? " : " : "", wanted_base, (*Char(wanted_base) && *Char(interface_list)) ? // Interfaces ", " : "", interface_list, " {", derived ? typemapLookup(n, "csbody_derived", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF) : // main body of class typemapLookup(n, "csbody", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF), // main body of class NIL); // C++ destructor is wrapped by the Finalize and Dispose methods const char *tmap_method = derived ? "csdestruct_derived" : "csdestruct"; const String *tm = typemapExists(n, tmap_method, typemap_lookup_type); if (tm) { Swig_error(Getfile(tm), Getline(tm), "A deprecated %s typemap was found for %s, please remove it and replace all csdestruct, csdestruct_derived and csfinalize typemaps by the csdispose, csdispose_derived, csdisposing and csdisposing_derived typemaps.\n", tmap_method, proxy_class_name); } tmap_method = "csfinalize"; tm = typemapExists(n, tmap_method, typemap_lookup_type); if (tm) { Swig_error(Getfile(tm), Getline(tm), "A deprecated %s typemap was found for %s, please remove it and replace all csdestruct, csdestruct_derived and csfinalize typemaps by the csdispose, csdispose_derived, csdisposing and csdisposing_derived typemaps.\n", tmap_method, proxy_class_name); } tmap_method = derived ? "csdisposing_derived" : "csdisposing"; String *destruct = NewString(""); attributes = NewHash(); const String *destruct_methodname = NULL; const String *destruct_methodmodifiers = NULL; const String *destruct_parameters = NULL; if (derived) { tm = typemapLookup(n, "csdisposing_derived", typemap_lookup_type, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:csdisposing_derived:methodname"); destruct_methodmodifiers = Getattr(attributes, "tmap:csdisposing_derived:methodmodifiers"); destruct_parameters = Getattr(attributes, "tmap:csdisposing_derived:parameters"); } else { tm = typemapLookup(n, "csdisposing", typemap_lookup_type, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:csdisposing:methodname"); destruct_methodmodifiers = Getattr(attributes, "tmap:csdisposing:methodmodifiers"); destruct_parameters = Getattr(attributes, "tmap:csdisposing:parameters"); } if (tm && *Char(tm)) { if (!destruct_methodname) { Swig_error(Getfile(n), Getline(n), "No methodname attribute defined in %s typemap for %s\n", tmap_method, proxy_class_name); } if (!destruct_methodmodifiers) { Swig_error(Getfile(n), Getline(n), "No methodmodifiers attribute defined in %s typemap for %s.\n", tmap_method, proxy_class_name); } if (!destruct_parameters) destruct_parameters = empty_string; } // Emit the Finalize and Dispose methods if (tm) { // Finalize and Dispose methods Printv(proxy_class_def, typemapLookup(n, derived ? "csdispose_derived" : "csdispose", typemap_lookup_type, WARN_NONE), NIL); // Dispose(bool disposing) method Printv(destruct, tm, NIL); if (*Char(destructor_call)) Replaceall(destruct, "$imcall", destructor_call); else Replaceall(destruct, "$imcall", "throw new global::System.MethodAccessException(\"C++ destructor does not have public access\")"); if (*Char(destruct)) { Printv(proxy_class_def, "\n ", NIL); const String *methodmods = Getattr(n, "destructmethodmodifiers"); if (methodmods) Printv(proxy_class_def, methodmods, NIL); else Printv(proxy_class_def, destruct_methodmodifiers, " ", derived ? "override" : "virtual", NIL); Printv(proxy_class_def, " void ", destruct_methodname, "(", destruct_parameters, ") ", destruct, "\n", NIL); } } if (*Char(interface_upcasts)) Printv(proxy_class_def, interface_upcasts, NIL); if (feature_director) { // Generate director connect method // put this in classDirectorEnd ??? Printf(proxy_class_code, " private void SwigDirectorConnect() {\n"); int i; for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *method = Getattr(udata, "method"); String *methid = Getattr(udata, "class_methodidx"); String *overname = Getattr(udata, "overname"); Printf(proxy_class_code, " if (SwigDerivedClassHasMethod(\"%s\", swigMethodTypes%s))\n", method, methid); Printf(proxy_class_code, " swigDelegate%s = new SwigDelegate%s_%s(SwigDirectorMethod%s);\n", methid, proxy_class_name, methid, overname); } String *director_connect_method_name = Swig_name_member(getNSpace(), getClassPrefix(), "director_connect"); Printf(proxy_class_code, " %s.%s(swigCPtr", imclass_name, director_connect_method_name); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); Printf(proxy_class_code, ", swigDelegate%s", methid); } Printf(proxy_class_code, ");\n"); Printf(proxy_class_code, " }\n"); if (first_class_dmethod < curr_class_dmethod) { // Only emit if there is at least one director method Printf(proxy_class_code, "\n"); Printf(proxy_class_code, " private bool SwigDerivedClassHasMethod(string methodName, global::System.Type[] methodTypes) {\n"); Printf(proxy_class_code, " global::System.Reflection.MethodInfo methodInfo = this.GetType().GetMethod(methodName, global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, methodTypes, null);\n"); Printf(proxy_class_code, " bool hasDerivedMethod = methodInfo.DeclaringType.IsSubclassOf(typeof(%s));\n", proxy_class_name); /* Could add this code to cover corner case where the GetMethod() returns a method which allows type * promotion, eg it will return foo(double), if looking for foo(int). if (hasDerivedMethod) { hasDerivedMethod = false; if (methodInfo != null) { hasDerivedMethod = true; ParameterInfo[] parameterArray1 = methodInfo.GetParameters(); for (int i=0; i 0) Printv(proxy_class_code, director_delegate_callback, NIL); if (Len(director_delegate_definitions) > 0) Printv(proxy_class_code, "\n", director_delegate_definitions, NIL); if (Len(director_delegate_instances) > 0) Printv(proxy_class_code, "\n", director_delegate_instances, NIL); if (Len(director_method_types) > 0) Printv(proxy_class_code, "\n", director_method_types, NIL); Delete(director_callback_typedefs); director_callback_typedefs = NULL; Delete(director_callbacks); director_callbacks = NULL; Delete(director_delegate_callback); director_delegate_callback = NULL; Delete(director_delegate_definitions); director_delegate_definitions = NULL; Delete(director_delegate_instances); director_delegate_instances = NULL; Delete(director_method_types); director_method_types = NULL; Delete(director_connect_parms); director_connect_parms = NULL; Delete(director_connect_method_name); } Delete(interface_upcasts); Delete(interface_list); Delete(attributes); Delete(destruct); // Emit extra user code Printv(proxy_class_def, typemapLookup(n, "cscode", typemap_lookup_type, WARN_NONE), // extra C# code "\n", NIL); if (derived) { String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); upcastsCode(smart, upcast_method_name, c_classname, c_baseclassname); Delete(upcast_method_name); } Delete(smart); } /* ---------------------------------------------------------------------- * emitInterfaceDeclaration() * ---------------------------------------------------------------------- */ void emitInterfaceDeclaration(Node *n, String *interface_name, File *f_interface) { Printv(f_interface, typemapLookup(n, "csimports", Getattr(n, "classtypeobj"), WARN_NONE), "\n", NIL); Printf(f_interface, "public interface %s", interface_name); if (List *baselist = Getattr(n, "bases")) { String *bases = 0; for (Iterator base = First(baselist); base.item; base = Next(base)) { if (GetFlag(base.item, "feature:ignore") || !Getattr(base.item, "feature:interface")) continue; // TODO: warn about skipped non-interface bases String *base_iname = Getattr(base.item, "interface:name"); if (!bases) bases = NewStringf(" : %s", base_iname); else { Append(bases, ", "); Append(bases, base_iname); } } if (bases) { Printv(f_interface, bases, NIL); Delete(bases); } } Printf(f_interface, " {\n"); Node *attributes = NewHash(); String *interface_code = Copy(typemapLookup(n, "csinterfacecode", Getattr(n, "classtypeobj"), WARN_CSHARP_TYPEMAP_INTERFACECODE_UNDEF, attributes)); if (interface_code) { String *interface_declaration = Copy(Getattr(attributes, "tmap:csinterfacecode:declaration")); if (interface_declaration) { Replaceall(interface_declaration, "$interfacename", interface_name); Printv(f_interface, interface_declaration, NIL); Delete(interface_declaration); } Delete(interface_code); } } /* ---------------------------------------------------------------------- * classHandler() * ---------------------------------------------------------------------- */ virtual int classHandler(Node *n) { String *nspace = getNSpace(); File *f_proxy = NULL; File *f_interface = NULL; // save class local variables String *old_proxy_class_name = proxy_class_name; String *old_full_imclass_name = full_imclass_name; String *old_destructor_call = destructor_call; String *old_proxy_class_constants_code = proxy_class_constants_code; String *old_proxy_class_def = proxy_class_def; String *old_proxy_class_code = proxy_class_code; bool has_outerclass = Getattr(n, "nested:outer") && !GetFlag(n, "feature:flatnested"); String *old_interface_class_code = interface_class_code; interface_class_code = 0; if (proxy_flag) { proxy_class_name = NewString(Getattr(n, "sym:name")); String *interface_name = Getattr(n, "feature:interface") ? Getattr(n, "interface:name") : 0; if (Node *outer = Getattr(n, "nested:outer")) { String *outerClassesPrefix = Copy(Getattr(outer, "sym:name")); for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { Push(outerClassesPrefix, "."); Push(outerClassesPrefix, Getattr(outer, "sym:name")); } String *fnspace = nspace ? NewStringf("%s.%s", nspace, outerClassesPrefix) : outerClassesPrefix; if (!addSymbol(proxy_class_name, n, fnspace)) return SWIG_ERROR; if (interface_name && !addInterfaceSymbol(interface_name, n, fnspace)) return SWIG_ERROR; if (nspace) Delete(fnspace); Delete(outerClassesPrefix); } else { if (!addSymbol(proxy_class_name, n, nspace)) return SWIG_ERROR; if (interface_name && !addInterfaceSymbol(interface_name, n, nspace)) return SWIG_ERROR; } if (!nspace) { full_imclass_name = NewStringf("%s", imclass_name); if (Cmp(proxy_class_name, imclass_name) == 0) { Printf(stderr, "Class name cannot be equal to intermediary class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } if (Cmp(proxy_class_name, module_class_name) == 0) { Printf(stderr, "Class name cannot be equal to module class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } } else { if (namespce) { full_imclass_name = NewStringf("%s.%s", namespce, imclass_name); } else { full_imclass_name = NewStringf("%s", imclass_name); } } if (!has_outerclass) { String *output_directory = outputDirectory(nspace); f_proxy = getOutputFile(output_directory, proxy_class_name); addOpenNamespace(nspace, f_proxy); Delete(output_directory); } else ++nesting_depth; proxy_class_def = NewString(""); proxy_class_code = NewString(""); destructor_call = NewString(""); proxy_class_constants_code = NewString(""); if (Getattr(n, "feature:interface")) { interface_class_code = NewString(""); String *output_directory = outputDirectory(nspace); f_interface = getOutputFile(output_directory, interface_name); addOpenNamespace(nspace, f_interface); emitInterfaceDeclaration(n, interface_name, interface_class_code); Delete(output_directory); } } Language::classHandler(n); if (proxy_flag) { emitProxyClassDefAndCPPCasts(n); String *csclazzname = Swig_name_member(getNSpace(), getClassPrefix(), ""); // mangled full proxy class name Replaceall(proxy_class_def, "$csclassname", proxy_class_name); Replaceall(proxy_class_code, "$csclassname", proxy_class_name); Replaceall(proxy_class_constants_code, "$csclassname", proxy_class_name); Replaceall(interface_class_code, "$csclassname", proxy_class_name); Replaceall(proxy_class_def, "$csclazzname", csclazzname); Replaceall(proxy_class_code, "$csclazzname", csclazzname); Replaceall(proxy_class_constants_code, "$csclazzname", csclazzname); Replaceall(interface_class_code, "$csclazzname", csclazzname); Replaceall(proxy_class_def, "$module", module_class_name); Replaceall(proxy_class_code, "$module", module_class_name); Replaceall(proxy_class_constants_code, "$module", module_class_name); Replaceall(interface_class_code, "$module", module_class_name); Replaceall(proxy_class_def, "$imclassname", full_imclass_name); Replaceall(proxy_class_code, "$imclassname", full_imclass_name); Replaceall(proxy_class_constants_code, "$imclassname", full_imclass_name); Replaceall(interface_class_code, "$imclassname", full_imclass_name); Replaceall(proxy_class_def, "$dllimport", dllimport); Replaceall(proxy_class_code, "$dllimport", dllimport); Replaceall(proxy_class_constants_code, "$dllimport", dllimport); Replaceall(interface_class_code, "$dllimport", dllimport); if (!has_outerclass) Printv(f_proxy, proxy_class_def, proxy_class_code, NIL); else { Swig_offset_string(proxy_class_def, nesting_depth); Append(old_proxy_class_code, proxy_class_def); Swig_offset_string(proxy_class_code, nesting_depth); Append(old_proxy_class_code, proxy_class_code); } // Write out all the constants if (Len(proxy_class_constants_code) != 0) { if (!has_outerclass) Printv(f_proxy, proxy_class_constants_code, NIL); else { Swig_offset_string(proxy_class_constants_code, nesting_depth); Append(old_proxy_class_code, proxy_class_constants_code); } } if (!has_outerclass) { Printf(f_proxy, "}\n"); addCloseNamespace(nspace, f_proxy); if (f_proxy != f_single_out) Delete(f_proxy); f_proxy = NULL; } else { for (int i = 0; i < nesting_depth; ++i) Append(old_proxy_class_code, " "); Append(old_proxy_class_code, "}\n\n"); --nesting_depth; } if (f_interface) { Printv(f_interface, interface_class_code, "}\n", NIL); addCloseNamespace(nspace, f_interface); if (f_interface != f_single_out) Delete(f_interface); f_interface = 0; } emitDirectorExtraMethods(n); Delete(interface_class_code); interface_class_code = old_interface_class_code; Delete(csclazzname); Delete(proxy_class_name); proxy_class_name = old_proxy_class_name; Delete(full_imclass_name); full_imclass_name = old_full_imclass_name; Delete(destructor_call); destructor_call = old_destructor_call; Delete(proxy_class_constants_code); proxy_class_constants_code = old_proxy_class_constants_code; Delete(proxy_class_def); proxy_class_def = old_proxy_class_def; Delete(proxy_class_code); proxy_class_code = old_proxy_class_code; } return SWIG_OK; } /* ---------------------------------------------------------------------- * memberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { Language::memberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmemberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { static_flag = true; Language::staticmemberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } static_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * proxyClassFunctionHandler() * * Function called for creating a C# wrapper function around a c++ function in the * proxy class. Used for both static and non-static C++ class functions. * C++ class static functions map to C# static functions. * Two extra attributes in the Node must be available. These are "proxyfuncname" - * the name of the C# class proxy function, which in turn will call "imfuncname" - * the intermediary (PInvoke) function name in the intermediary class. * ----------------------------------------------------------------------------- */ void proxyClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *intermediary_function_name = Getattr(n, "imfuncname"); String *proxy_function_name = Getattr(n, "proxyfuncname"); String *tm; Parm *p; Parm *last_parm = 0; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); bool is_interface = Getattr(parentNode(n), "feature:interface") != 0 && !static_flag && Getattr(n, "interface:owner") == 0; if (!proxy_flag) return; // Wrappers not wanted for some methods where the parameters cannot be overloaded in C# if (Getattr(n, "overload:ignore")) return; // Don't generate proxy method for additional explicitcall method used in directors if (GetFlag(n, "explicitcall")) return; if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("cstype", l, NULL); Swig_typemap_attach_parms("csin", l, NULL); /* Get return types */ if ((tm = Swig_typemap_lookup("cstype", n, "", 0))) { // Note that in the case of polymorphic (covariant) return types, the method's return type is changed to be the base of the C++ return type SwigType *covariant = Getattr(n, "covariant"); String *cstypeout = Getattr(n, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap if (cstypeout) tm = cstypeout; substituteClassname(covariant ? covariant : t, tm); Printf(return_type, "%s", tm); if (covariant) Swig_warning(WARN_CSHARP_COVARIANT_RET, input_file, line_number, "Covariant return types not supported in C#. Proxy method will return %s.\n", SwigType_str(covariant, 0)); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(t, 0)); } if (wrapping_member_flag && !enum_constant_flag) { // Properties setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(getNSpace(), Swig_name_member(0, getClassPrefix(), variable_name))) == 0); if (setter_flag) Swig_typemap_attach_parms("csvarin", l, NULL); } /* Start generating the proxy function */ const String *outattributes = Getattr(n, "tmap:cstype:outattributes"); if (outattributes) Printf(function_code, " %s\n", outattributes); const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) Printf(function_code, " %s\n", csattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); if (methodmods) { if (is_smart_pointer()) { // Smart pointer classes do not mirror the inheritance hierarchy of the underlying pointer type, so no virtual/override/new required. String *mmods = Copy(methodmods); Replaceall(mmods, "override", ""); Replaceall(mmods, "virtual", ""); Replaceall(mmods, "new", ""); Chop(mmods); // remove trailing whitespace Printf(function_code, " %s ", mmods); Delete(mmods); } else { Printf(function_code, " %s ", methodmods); } } else { methodmods = (is_public(n) ? public_string : protected_string); Printf(function_code, " %s ", methodmods); if (!is_smart_pointer()) { // Smart pointer classes do not mirror the inheritance hierarchy of the underlying pointer type, so no virtual/override/new required. if (Getattr(n, "override")) Printf(function_code, "override "); else if (checkAttribute(n, "storage", "virtual")) Printf(function_code, "virtual "); if (Getattr(n, "hides")) Printf(function_code, "new "); } } if (static_flag) Printf(function_code, "static "); Printf(function_code, "%s %s(", return_type, proxy_function_name); if (is_interface) Printf(interface_class_code, " %s %s(", return_type, proxy_function_name); Printv(imcall, full_imclass_name, ".$imfuncname(", NIL); if (!static_flag) Printf(imcall, "swigCPtr"); emit_mark_varargs(l); int gencomma = !static_flag; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* Ignore the 'this' argument for variable wrappers */ if (!(variable_wrapper_flag && i == 0)) { SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); if (setter_flag) last_parm = p; /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); const String *inattributes = Getattr(p, "tmap:cstype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, setter_flag); // Use typemaps to transform type used in C# wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = Getattr(p, "tmap:csin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", arg); String *pre = Getattr(p, "tmap:csin:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$csinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:csin:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$csinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:csin:terminator"); if (terminator) { substituteClassname(pt, terminator); Replaceall(terminator, "$csinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSIN_UNDEF, input_file, line_number, "No csin typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma >= 2) { Printf(function_code, ", "); if (is_interface) Printf(interface_class_code, ", "); } gencomma = 2; Printf(function_code, "%s %s", param_type, arg); if (is_interface) Printf(interface_class_code, "%s %s", param_type, arg); Delete(arg); Delete(param_type); } p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); if (is_interface) Printf(interface_class_code, ");\n"); // Transform return type used in PInvoke function (in intermediary class) to type used in C# wrapper function (in proxy class) if ((tm = Swig_typemap_lookup("csout", n, "", 0))) { excodeSubstitute(n, tm, "csout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } if (is_terminator_code) { Printv(tm, "\n", terminator_code, NIL); } Insert(tm, 0, "{"); Printf(tm, "\n }"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); // For director methods: generate code to selectively make a normal polymorphic call or // an explicit method call - needed to prevent infinite recursion calls in director methods. Node *explicit_n = Getattr(n, "explicitcallnode"); if (explicit_n) { String *ex_overloaded_name = getOverloadedName(explicit_n); String *ex_intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), ex_overloaded_name); String *ex_imcall = Copy(imcall); Replaceall(ex_imcall, "$imfuncname", ex_intermediary_function_name); Replaceall(imcall, "$imfuncname", intermediary_function_name); String *excode = NewString(""); Node *directorNode = Getattr(n, "directorNode"); if (directorNode) { UpcallData *udata = Getattr(directorNode, "upcalldata"); String *methid = Getattr(udata, "class_methodidx"); if (!Cmp(return_type, "void")) Printf(excode, "if (SwigDerivedClassHasMethod(\"%s\", swigMethodTypes%s)) %s; else %s", proxy_function_name, methid, ex_imcall, imcall); else Printf(excode, "(SwigDerivedClassHasMethod(\"%s\", swigMethodTypes%s) ? %s : %s)", proxy_function_name, methid, ex_imcall, imcall); Clear(imcall); Printv(imcall, excode, NIL); } else { // probably an ignored method or nodirector } Delete(excode); Delete(ex_overloaded_name); } else { Replaceall(imcall, "$imfuncname", intermediary_function_name); } Replaceall(tm, "$imcall", imcall); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csout typemap defined for %s\n", SwigType_str(t, 0)); } if (wrapping_member_flag && !enum_constant_flag) { // Properties if (generate_property_declaration_flag) { // Ensure the declaration is generated just once should the property contain both a set and get // Get the C# variable type - obtained differently depending on whether a setter is required. String *variable_type = return_type; if (setter_flag) { assert(last_parm); // (last parameter is the only parameter for properties) /* Get variable type - ensure the variable name is fully resolved during typemap lookup via the symbol table set in NewParmNode */ SwigType *cvariable_type = Getattr(last_parm, "type"); Parm *variable_parm = NewParmNode(cvariable_type, n); if ((tm = Swig_typemap_lookup("cstype", variable_parm, "", 0))) { String *cstypeout = Getattr(variable_parm, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap if (cstypeout) tm = cstypeout; substituteClassname(cvariable_type, tm); variable_type = tm; } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(cvariable_type, 0)); } } const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) Printf(proxy_class_code, " %s\n", csattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); if (!methodmods) methodmods = (is_public(n) ? public_string : protected_string); Printf(proxy_class_code, " %s %s%s %s {", methodmods, static_flag ? "static " : "", variable_type, variable_name); } generate_property_declaration_flag = false; if (setter_flag) { // Setter method assert(last_parm); // (last parameter is the only parameter for properties) SwigType *cvariable_type = Getattr(last_parm, "type"); Parm *variable_parm = NewParmNode(cvariable_type, n); if ((tm = Swig_typemap_lookup("csvarin", variable_parm, "", 0))) { substituteClassname(cvariable_type, tm); Replaceall(tm, "$csinput", "value"); Replaceall(tm, "$imcall", imcall); excodeSubstitute(n, tm, "csvarin", variable_parm); Printf(proxy_class_code, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarin typemap defined for %s\n", SwigType_str(cvariable_type, 0)); } } else { // Getter method if ((tm = Swig_typemap_lookup("csvarout", n, "", 0))) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); excodeSubstitute(n, tm, "csvarout", n); Printf(proxy_class_code, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarout typemap defined for %s\n", SwigType_str(t, 0)); } } } else { // Normal function call Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); Printv(proxy_class_code, function_code, NIL); } Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(function_code); Delete(return_type); Delete(imcall); } /* ---------------------------------------------------------------------- * constructorHandler() * ---------------------------------------------------------------------- */ virtual int constructorHandler(Node *n) { ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *function_code = NewString(""); String *helper_code = NewString(""); // Holds code for the constructor helper method generated only when the csin typemap has code in the pre or post attributes String *helper_args = NewString(""); String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); String *im_return_type = NewString(""); bool feature_director = (parentNode(n) && Swig_directorclass(n)); Language::constructorHandler(n); // Wrappers not wanted for some methods where the parameters cannot be overloaded in C# if (Getattr(n, "overload:ignore")) return SWIG_OK; if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *mangled_overname = Swig_name_construct(getNSpace(), overloaded_name); String *imcall = NewString(""); const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) { Printf(function_code, " %s\n", csattributes); Printf(helper_code, " %s\n", csattributes); } const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); tm = Getattr(n, "tmap:imtype"); // typemaps were attached earlier to the node String *imtypeout = Getattr(n, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap if (imtypeout) tm = imtypeout; Printf(im_return_type, "%s", tm); Printf(function_code, " %s %s(", methodmods, proxy_class_name); Printf(helper_code, " static private %s SwigConstruct%s(", im_return_type, proxy_class_name); Printv(imcall, full_imclass_name, ".", mangled_overname, "(", NIL); /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("cstype", l, NULL); Swig_typemap_attach_parms("csin", l, NULL); emit_mark_varargs(l); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); const String *inattributes = Getattr(p, "tmap:cstype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, false); String *cshin = 0; // Use typemaps to transform type used in C# wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = Getattr(p, "tmap:csin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", arg); String *pre = Getattr(p, "tmap:csin:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$csinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:csin:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$csinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:csin:terminator"); if (terminator) { substituteClassname(pt, terminator); Replaceall(terminator, "$csinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } cshin = Getattr(p, "tmap:csin:cshin"); if (cshin) Replaceall(cshin, "$csinput", arg); Printv(imcall, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSIN_UNDEF, input_file, line_number, "No csin typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma) { Printf(function_code, ", "); Printf(helper_code, ", "); Printf(helper_args, ", "); } Printf(function_code, "%s %s", param_type, arg); Printf(helper_code, "%s %s", param_type, arg); Printf(helper_args, "%s", cshin ? cshin : arg); ++gencomma; Delete(cshin); Delete(arg); Delete(param_type); p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); Printf(helper_code, ")"); /* Insert the csconstruct typemap, doing the replacement for $directorconnect, as needed */ Hash *attributes = NewHash(); String *typemap_lookup_type = Getattr(getCurrentClass(), "classtypeobj"); String *construct_tm = Copy(typemapLookup(n, "csconstruct", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSCONSTRUCT_UNDEF, attributes)); if (construct_tm) { if (!feature_director) { Replaceall(construct_tm, "$directorconnect", ""); } else { String *connect_attr = Getattr(attributes, "tmap:csconstruct:directorconnect"); if (connect_attr) { Replaceall(construct_tm, "$directorconnect", connect_attr); } else { Swig_warning(WARN_CSHARP_NO_DIRECTORCONNECT_ATTR, input_file, line_number, "\"directorconnect\" attribute missing in %s \"csconstruct\" typemap.\n", Getattr(n, "name")); Replaceall(construct_tm, "$directorconnect", ""); } } Printv(function_code, " ", construct_tm, NIL); } excodeSubstitute(n, function_code, "csconstruct", attributes); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { Printf(helper_code, " {\n"); if (is_pre_code) { Printv(helper_code, pre_code, "\n", NIL); } if (is_post_code) { Printf(helper_code, " try {\n"); Printv(helper_code, " return ", imcall, ";\n", NIL); Printv(helper_code, " } finally {\n", post_code, "\n }", NIL); } else { Printv(helper_code, " return ", imcall, ";", NIL); } if (is_terminator_code) { Printv(helper_code, "\n", terminator_code, NIL); } Printf(helper_code, "\n }\n"); String *helper_name = NewStringf("%s.SwigConstruct%s(%s)", proxy_class_name, proxy_class_name, helper_args); String *im_outattributes = Getattr(n, "tmap:imtype:outattributes"); if (im_outattributes) Printf(proxy_class_code, " %s\n", im_outattributes); Printv(proxy_class_code, helper_code, "\n", NIL); Replaceall(function_code, "$imcall", helper_name); Delete(helper_name); } else { Replaceall(function_code, "$imcall", imcall); } Printv(proxy_class_code, function_code, "\n", NIL); Delete(helper_args); Delete(im_return_type); Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(construct_tm); Delete(attributes); Delete(overloaded_name); Delete(imcall); } return SWIG_OK; } /* ---------------------------------------------------------------------- * destructorHandler() * ---------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); String *symname = Getattr(n, "sym:name"); if (proxy_flag) { Printv(destructor_call, full_imclass_name, ".", Swig_name_destroy(getNSpace(), symname), "(swigCPtr)", NIL); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); if (methodmods) Setattr(getCurrentClass(), "destructmethodmodifiers", methodmods); } return SWIG_OK; } /* ---------------------------------------------------------------------- * membervariableHandler() * ---------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { generate_property_declaration_flag = true; variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; variable_wrapper_flag = true; Language::membervariableHandler(n); wrapping_member_flag = false; variable_wrapper_flag = false; generate_property_declaration_flag = false; Printf(proxy_class_code, "\n }\n\n"); return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmembervariableHandler() * ---------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { bool static_const_member_flag = (Getattr(n, "value") == 0); generate_property_declaration_flag = true; variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; static_flag = true; Language::staticmembervariableHandler(n); wrapping_member_flag = false; static_flag = false; generate_property_declaration_flag = false; if (static_const_member_flag) Printf(proxy_class_code, "\n }\n\n"); return SWIG_OK; } /* ---------------------------------------------------------------------- * memberconstantHandler() * ---------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; Language::memberconstantHandler(n); wrapping_member_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * getOverloadedName() * ----------------------------------------------------------------------------- */ String *getOverloadedName(Node *n) { /* A C# HandleRef is used for all classes in the SWIG intermediary class. * The intermediary class methods are thus mangled when overloaded to give * a unique name. */ String *overloaded_name = NewStringf("%s", Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Printv(overloaded_name, Getattr(n, "sym:overname"), NIL); } return overloaded_name; } /* ----------------------------------------------------------------------------- * moduleClassFunctionHandler() * ----------------------------------------------------------------------------- */ void moduleClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; Parm *last_parm = 0; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); int num_arguments = 0; String *overloaded_name = getOverloadedName(n); String *func_name = NULL; bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("cstype", l, NULL); Swig_typemap_attach_parms("csin", l, NULL); /* Get return types */ if ((tm = Swig_typemap_lookup("cstype", n, "", 0))) { String *cstypeout = Getattr(n, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap if (cstypeout) tm = cstypeout; substituteClassname(t, tm); Printf(return_type, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(t, 0)); } /* Change function name for global variables */ if (proxy_flag && global_variable_flag) { // Capitalize the first letter in the variable to create the getter/setter function name func_name = NewString(""); setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(getNSpace(), variable_name)) == 0); if (setter_flag) Printf(func_name, "set"); else Printf(func_name, "get"); Putc(toupper((int) *Char(variable_name)), func_name); Printf(func_name, "%s", Char(variable_name) + 1); if (setter_flag) Swig_typemap_attach_parms("csvarin", l, NULL); } else { func_name = Copy(Getattr(n, "sym:name")); } /* Start generating the function */ const String *outattributes = Getattr(n, "tmap:cstype:outattributes"); if (outattributes) Printf(function_code, " %s\n", outattributes); const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) Printf(function_code, " %s\n", csattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(function_code, " %s static %s %s(", methodmods, return_type, func_name); Printv(imcall, imclass_name, ".", overloaded_name, "(", NIL); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); bool global_or_member_variable = global_variable_flag || (wrapping_member_flag && !enum_constant_flag); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; i < num_arguments; i++) { /* Ignored parameters */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); last_parm = p; /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); const String *inattributes = Getattr(p, "tmap:cstype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, global_or_member_variable); // Use typemaps to transform type used in C# wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = Getattr(p, "tmap:csin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", arg); String *pre = Getattr(p, "tmap:csin:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$csinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:csin:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$csinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:csin:terminator"); if (terminator) { substituteClassname(pt, terminator); Replaceall(terminator, "$csinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSIN_UNDEF, input_file, line_number, "No csin typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to module class function */ if (gencomma >= 2) Printf(function_code, ", "); gencomma = 2; Printf(function_code, "%s %s", param_type, arg); p = Getattr(p, "tmap:in:next"); Delete(arg); Delete(param_type); } Printf(imcall, ")"); Printf(function_code, ")"); // Transform return type used in PInvoke function (in intermediary class) to type used in C# wrapper function (in module class) if ((tm = Swig_typemap_lookup("csout", n, "", 0))) { excodeSubstitute(n, tm, "csout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } if (is_terminator_code) { Printv(tm, "\n", terminator_code, NIL); } Insert(tm, 0, "{"); Printf(tm, "\n }"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csout typemap defined for %s\n", SwigType_str(t, 0)); } if (proxy_flag && global_variable_flag) { // Properties if (generate_property_declaration_flag) { // Ensure the declaration is generated just once should the property contain both a set and get // Get the C# variable type - obtained differently depending on whether a setter is required. String *variable_type = return_type; if (setter_flag) { p = last_parm; // (last parameter is the only parameter for properties) SwigType *pt = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); String *cstypeout = Getattr(p, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap variable_type = cstypeout ? cstypeout : tm; } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarin typemap defined for %s\n", SwigType_str(pt, 0)); } } const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) Printf(module_class_code, " %s\n", csattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); if (!methodmods) methodmods = (is_public(n) ? public_string : protected_string); Printf(module_class_code, " %s static %s %s {", methodmods, variable_type, variable_name); } generate_property_declaration_flag = false; if (setter_flag) { // Setter method p = last_parm; // (last parameter is the only parameter for properties) SwigType *pt = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:csvarin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", "value"); Replaceall(tm, "$imcall", imcall); excodeSubstitute(n, tm, "csvarin", p); Printf(module_class_code, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarin typemap defined for %s\n", SwigType_str(pt, 0)); } } else { // Getter method if ((tm = Swig_typemap_lookup("csvarout", n, "", 0))) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); excodeSubstitute(n, tm, "csvarout", n); Printf(module_class_code, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarout typemap defined for %s\n", SwigType_str(t, 0)); } } } else { // Normal function call Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); Printv(module_class_code, function_code, NIL); } Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(function_code); Delete(return_type); Delete(imcall); Delete(func_name); } /*---------------------------------------------------------------------- * replaceSpecialVariables() *--------------------------------------------------------------------*/ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; SwigType *type = Getattr(parm, "type"); substituteClassname(type, tm); } /*---------------------------------------------------------------------- * decodeEnumFeature() * Decode the possible enum features, which are one of: * %csenum(simple) * %csenum(typeunsafe) - default * %csenum(typesafe) * %csenum(proper) *--------------------------------------------------------------------*/ EnumFeature decodeEnumFeature(Node *n) { EnumFeature enum_feature = TypeunsafeEnum; String *feature = Getattr(n, "feature:cs:enum"); if (feature) { if (Cmp(feature, "simple") == 0) enum_feature = SimpleEnum; else if (Cmp(feature, "typesafe") == 0) enum_feature = TypesafeEnum; else if (Cmp(feature, "proper") == 0) enum_feature = ProperEnum; } return enum_feature; } /* ----------------------------------------------------------------------- * enumValue() * This method will return a string with an enum value to use in C# generated * code. If the %csconst feature is not used, the string will contain the intermediary * class call to obtain the enum value. The intermediary class and PINVOKE methods to obtain * the enum value will be generated. Otherwise the C/C++ enum value will be used if there * is one and hopefully it will compile as C# code - e.g. 20 as in: enum E{e=20}; * The %csconstvalue feature overrides all other ways to generate the constant value. * The caller must delete memory allocated for the returned string. * ------------------------------------------------------------------------ */ String *enumValue(Node *n) { String *symname = Getattr(n, "sym:name"); // Check for the %csconstvalue feature String *value = Getattr(n, "feature:cs:constvalue"); if (!value) { // The %csconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:cs:const"); if (const_feature_flag) { // Use the C syntax to make a true C# constant and hope that it compiles as C# code value = Getattr(n, "enumvalue") ? Copy(Getattr(n, "enumvalue")) : Copy(Getattr(n, "enumvalueex")); } else { String *newsymname = 0; if (!getCurrentClass() || !proxy_flag) { String *enumClassPrefix = getEnumClassPrefix(); if (enumClassPrefix) { // A global scoped enum newsymname = Swig_name_member(0, enumClassPrefix, symname); symname = newsymname; } } // Get the enumvalue from a PINVOKE call if (!getCurrentClass() || !cparse_cplusplus || !proxy_flag) { // Strange hack to change the name Setattr(n, "name", Getattr(n, "value")); /* for wrapping of enums in a namespace when emit_action is used */ constantWrapper(n); value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { memberconstantHandler(n); value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, getEnumClassPrefix(), symname))); } } } return value; } /* ----------------------------------------------------------------------------- * getEnumName() * ----------------------------------------------------------------------------- */ String *getEnumName(SwigType *t) { Node *enumname = NULL; Node *n = enumLookup(t); if (n) { enumname = Getattr(n, "enumname"); if (!enumname) { String *symname = Getattr(n, "sym:name"); if (symname) { // Add in class scope when referencing enum if not a global enum String *scopename_prefix = Swig_scopename_prefix(Getattr(n, "name")); String *proxyname = 0; if (scopename_prefix) { proxyname = getProxyName(scopename_prefix); } if (proxyname) { enumname = NewStringf("%s.%s", proxyname, symname); } else { // global enum or enum in a namespace String *nspace = Getattr(n, "sym:nspace"); if (nspace) { if (namespce) enumname = NewStringf("%s.%s.%s", namespce, nspace, symname); else enumname = NewStringf("%s.%s", nspace, symname); } else { enumname = Copy(symname); } } Setattr(n, "enumname", enumname); Delete(enumname); Delete(scopename_prefix); } } } return enumname; } /* ----------------------------------------------------------------------------- * substituteClassname() * * Substitute the special variable $csclassname with the proxy class name for classes/structs/unions * that SWIG knows about. Also substitutes enums with enum name. * Otherwise use the $descriptor name for the C# class name. Note that the $&csclassname substitution * is the same as a $&descriptor substitution, ie one pointer added to descriptor name. * Inputs: * pt - parameter type * tm - typemap contents that might contain the special variable to be replaced * Outputs: * tm - typemap contents complete with the special variable substitution * Return: * substitution_performed - flag indicating if a substitution was performed * ----------------------------------------------------------------------------- */ bool substituteClassname(SwigType *pt, String *tm) { bool substitution_performed = false; SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); SwigType *strippedtype = SwigType_strip_qualifiers(type); if (Strstr(tm, "$csclassname")) { SwigType *classnametype = Copy(strippedtype); substituteClassnameSpecialVariable(classnametype, tm, "$csclassname"); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$*csclassname")) { SwigType *classnametype = Copy(strippedtype); Delete(SwigType_pop(classnametype)); if (Len(classnametype) > 0) { substituteClassnameSpecialVariable(classnametype, tm, "$*csclassname"); substitution_performed = true; } Delete(classnametype); } if (Strstr(tm, "$&csclassname")) { SwigType *classnametype = Copy(strippedtype); SwigType_add_pointer(classnametype); substituteClassnameSpecialVariable(classnametype, tm, "$&csclassname"); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$csinterfacename")) { SwigType *interfacenametype = Copy(strippedtype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$csinterfacename", true); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$*csinterfacename")) { SwigType *interfacenametype = Copy(strippedtype); Delete(SwigType_pop(interfacenametype)); if (Len(interfacenametype) > 0) { substituteInterfacenameSpecialVariable(interfacenametype, tm, "$*csinterfacename", true); substitution_performed = true; } Delete(interfacenametype); } if (Strstr(tm, "$&csinterfacename")) { SwigType *interfacenametype = Copy(strippedtype); SwigType_add_pointer(interfacenametype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$&csinterfacename", true); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$interfacename")) { SwigType *interfacenametype = Copy(strippedtype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$interfacename", false); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$*interfacename")) { SwigType *interfacenametype = Copy(strippedtype); Delete(SwigType_pop(interfacenametype)); if (Len(interfacenametype) > 0) { substituteInterfacenameSpecialVariable(interfacenametype, tm, "$*interfacename", false); substitution_performed = true; } Delete(interfacenametype); } if (Strstr(tm, "$&interfacename")) { SwigType *interfacenametype = Copy(strippedtype); SwigType_add_pointer(interfacenametype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$&interfacename", false); substitution_performed = true; Delete(interfacenametype); } Delete(strippedtype); Delete(type); return substitution_performed; } /* ----------------------------------------------------------------------------- * substituteClassnameSpecialVariable() * ----------------------------------------------------------------------------- */ void substituteClassnameSpecialVariable(SwigType *classnametype, String *tm, const char *classnamespecialvariable) { String *replacementname; if (SwigType_isenum(classnametype)) { String *enumname = getEnumName(classnametype); if (enumname) { replacementname = Copy(enumname); } else { bool anonymous_enum = (Cmp(classnametype, "enum ") == 0); if (anonymous_enum) { replacementname = NewString("int"); } else { // An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) or an ignored enum replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); Replace(replacementname, "enum ", "", DOH_REPLACE_ANY); Setattr(swig_types_hash, replacementname, classnametype); } } } else { String *classname = getProxyName(classnametype); // getProxyName() works for pointers to classes too if (classname) { replacementname = Copy(classname); } else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); // Add to hash table so that the type wrapper classes can be created later Setattr(swig_types_hash, replacementname, classnametype); } } Replaceall(tm, classnamespecialvariable, replacementname); Delete(replacementname); } /* ----------------------------------------------------------------------------- * substituteInterfacenameSpecialVariable() * ----------------------------------------------------------------------------- */ void substituteInterfacenameSpecialVariable(SwigType *interfacenametype, String *tm, const char *interfacenamespecialvariable, bool qualified) { String *interfacename = getInterfaceName(interfacenametype, qualified); if (interfacename) { String *replacementname = Copy(interfacename); Replaceall(tm, interfacenamespecialvariable, replacementname); Delete(replacementname); } } /* ----------------------------------------------------------------------------- * emitTypeWrapperClass() * ----------------------------------------------------------------------------- */ void emitTypeWrapperClass(String *classname, SwigType *type) { Node *n = NewHash(); Setfile(n, input_file); Setline(n, line_number); String *swigtype = NewString(""); File *f_swigtype = getOutputFile(SWIG_output_directory(), classname); addOpenNamespace(0, f_swigtype); // Pure C# baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "csbase", type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "csinterfaces", type, WARN_NONE); // Emit the class Printv(swigtype, typemapLookup(n, "csimports", type, WARN_NONE), // Import statements "\n", NIL); // Class attributes const String *csattributes = typemapLookup(n, "csattributes", type, WARN_NONE); if (csattributes && *Char(csattributes)) Printf(swigtype, "%s\n", csattributes); Printv(swigtype, typemapLookup(n, "csclassmodifiers", type, WARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " $csclassname", // Class name and base class (*Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", pure_baseclass, ((*Char(pure_baseclass)) && *Char(pure_interfaces)) ? // Interfaces ", " : "", pure_interfaces, " {", typemapLookup(n, "csbody", type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF), // main body of class typemapLookup(n, "cscode", type, WARN_NONE), // extra C# code "}\n", NIL); Replaceall(swigtype, "$csclassname", classname); Replaceall(swigtype, "$module", module_class_name); Replaceall(swigtype, "$imclassname", imclass_name); Replaceall(swigtype, "$dllimport", dllimport); // For unknown enums Replaceall(swigtype, "$enumvalues", ""); Printv(f_swigtype, swigtype, NIL); addCloseNamespace(0, f_swigtype); if (f_swigtype != f_single_out) Delete(f_swigtype); f_swigtype = NULL; Delete(swigtype); Delete(n); } /* ----------------------------------------------------------------------------- * typemapLookup() * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * warning - warning number to issue if no typemaps found * typemap_attributes - the typemap attributes are attached to this node and will * also be used for temporary storage if non null * return is never NULL, unlike Swig_typemap_lookup() * ----------------------------------------------------------------------------- */ const String *typemapLookup(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) { Node *node = !typemap_attributes ? NewHash() : typemap_attributes; Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); if (!tm) { tm = empty_string; if (warning != WARN_NONE) Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); } if (!typemap_attributes) Delete(node); return tm; } /* ----------------------------------------------------------------------------- * typemapExists() * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * returns found typemap or NULL if not found * ----------------------------------------------------------------------------- */ const String *typemapExists(Node *n, const_String_or_char_ptr tmap_method, SwigType *type) { Node *node = NewHash(); Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); Delete(node); return tm; } /* ----------------------------------------------------------------------------- * canThrow() * Determine whether the code in the typemap can throw a C# exception. * If so, note it for later when excodeSubstitute() is called. * ----------------------------------------------------------------------------- */ void canThrow(Node *n, const String *typemap, Node *parameter) { String *canthrow_attribute = NewStringf("tmap:%s:canthrow", typemap); String *canthrow = Getattr(parameter, canthrow_attribute); if (canthrow) Setattr(n, "csharp:canthrow", "1"); Delete(canthrow_attribute); } /* ----------------------------------------------------------------------------- * excodeSubstitute() * If a method can throw a C# exception, additional exception code is added to * check for the pending exception so that it can then throw the exception. The * $excode special variable is replaced by the exception code in the excode * typemap attribute. * ----------------------------------------------------------------------------- */ void excodeSubstitute(Node *n, String *code, const String *typemap, Node *parameter) { String *excode_attribute = NewStringf("tmap:%s:excode", typemap); String *excode = Getattr(parameter, excode_attribute); if (Getattr(n, "csharp:canthrow")) { int count = Replaceall(code, "$excode", excode); if (count < 1 || !excode) { Swig_warning(WARN_CSHARP_EXCODE, input_file, line_number, "C# exception may not be thrown - no $excode or excode attribute in '%s' typemap.\n", typemap); } } else { Replaceall(code, "$excode", empty_string); } Delete(excode_attribute); } /* ----------------------------------------------------------------------------- * addOpenNamespace() * ----------------------------------------------------------------------------- */ void addOpenNamespace(const String *nspace, File *file) { if (namespce || nspace) { Printf(file, "namespace "); if (namespce) Printv(file, namespce, nspace ? "." : "", NIL); if (nspace) Printv(file, nspace, NIL); Printf(file, " {\n"); } } /* ----------------------------------------------------------------------------- * addCloseNamespace() * ----------------------------------------------------------------------------- */ void addCloseNamespace(const String *nspace, File *file) { if (namespce || nspace) Printf(file, "\n}\n"); } /* ----------------------------------------------------------------------------- * outputDirectory() * * Return the directory to use for generating C# classes/enums and create the * subdirectory (does not create if language specific outdir does not exist). * ----------------------------------------------------------------------------- */ String *outputDirectory(String *nspace) { String *output_directory = Copy(SWIG_output_directory()); if (nspace) { String *nspace_subdirectory = Copy(nspace); Replaceall(nspace_subdirectory, ".", SWIG_FILE_DELIMITER); String *newdir_error = Swig_new_subdirectory(output_directory, nspace_subdirectory); if (newdir_error) { Printf(stderr, "%s\n", newdir_error); Delete(newdir_error); SWIG_exit(EXIT_FAILURE); } Printv(output_directory, nspace_subdirectory, SWIG_FILE_DELIMITER, 0); Delete(nspace_subdirectory); } return output_directory; } /*---------------------------------------------------------------------- * Start of director methods *--------------------------------------------------------------------*/ #if 0 /*---------------------------------------------------------------------- * emitDirectorUpcalls() *--------------------------------------------------------------------*/ void emitDirectorUpcalls() { if (n_dmethods) { Wrapper *w = NewWrapper(); String *dmethod_data = NewString(""); int n_methods = 0; Iterator udata_iter; udata_iter = First(dmethods_seq); while (udata_iter.item) { UpcallData *udata = udata_iter.item; Printf(dmethod_data, " { \"%s\", \"%s\" }", Getattr(udata, "imclass_method"), Getattr(udata, "imclass_fdesc")); ++n_methods; udata_iter = Next(udata_iter); if (udata_iter.item) Putc(',', dmethod_data); Putc('\n', dmethod_data); } Wrapper_print(w, f_wrappers); Delete(dmethod_data); Delete(swig_module_init); DelWrapper(w); } } #endif /*---------------------------------------------------------------------- * emitDirectorExtraMethods() * * This is where the director connect method is generated. *--------------------------------------------------------------------*/ void emitDirectorExtraMethods(Node *n) { if (!Swig_directorclass(n)) return; // Output the director connect method: String *norm_name = SwigType_namestr(Getattr(n, "name")); String *dirclassname = directorClassName(n); String *swig_director_connect = Swig_name_member(getNSpace(), getClassPrefix(), "director_connect"); String *wname = Swig_name_wrapper(swig_director_connect); String *sym_name = Getattr(n, "sym:name"); String *qualified_classname = Copy(sym_name); String *nspace = getNSpace(); String *dirClassName = directorClassName(n); String *smartptr = Getattr(n, "feature:smartptr"); if (!GetFlag(n, "feature:flatnested")) { for (Node *outer_class = Getattr(n, "nested:outer"); outer_class; outer_class = Getattr(outer_class, "nested:outer")) { Push(qualified_classname, "."); Push(qualified_classname, Getattr(outer_class, "sym:name")); } } if (nspace) Insert(qualified_classname, 0, NewStringf("%s.", nspace)); Printv(imclass_class_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); Printf(imclass_class_code, " public static extern void %s(global::System.Runtime.InteropServices.HandleRef jarg1", swig_director_connect); Wrapper *code_wrap = NewWrapper(); Printf(code_wrap->def, "SWIGEXPORT void SWIGSTDCALL %s(void *objarg", wname); if (smartptr) { Printf(code_wrap->code, " %s *obj = (%s *)objarg;\n", smartptr, smartptr); Printf(code_wrap->code, " // Keep a local instance of the smart pointer around while we are using the raw pointer\n"); Printf(code_wrap->code, " // Avoids using smart pointer specific API.\n"); Printf(code_wrap->code, " %s *director = static_cast<%s *>(obj->operator->());\n", dirClassName, dirClassName); } else { Printf(code_wrap->code, " %s *obj = (%s *)objarg;\n", norm_name, norm_name); Printf(code_wrap->code, " %s *director = static_cast<%s *>(obj);\n", dirClassName, dirClassName); } Printf(code_wrap->code, " director->swig_connect_director("); for (int i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); Printf(code_wrap->def, ", "); if (i != first_class_dmethod) Printf(code_wrap->code, ", "); Printf(code_wrap->def, "%s::SWIG_Callback%s_t callback%s", dirclassname, methid, methid); Printf(code_wrap->code, "callback%s", methid); Printf(imclass_class_code, ", %s.SwigDelegate%s_%s delegate%s", qualified_classname, sym_name, methid, methid); } Printf(code_wrap->def, ") {\n"); Printf(code_wrap->code, ");\n"); Printf(imclass_class_code, ");\n"); Printf(code_wrap->code, "}\n"); Wrapper_print(code_wrap, f_wrappers); DelWrapper(code_wrap); Delete(wname); Delete(swig_director_connect); Delete(qualified_classname); Delete(dirclassname); } /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying C# object. * * --------------------------------------------------------------- */ int classDirectorMethod(Node *n, Node *parent, String *super) { String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *returntype = Getattr(n, "type"); String *overloaded_name = getOverloadedName(n); String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); String *decl = Getattr(n, "decl"); String *declaration = NewString(""); String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); String *tm; Parm *p; int i; Wrapper *w = NewWrapper(); ParmList *l = Getattr(n, "parms"); bool is_void = !(Cmp(returntype, "void")); String *qualified_return = 0; bool pure_virtual = (!(Cmp(storage, "virtual")) && !(Cmp(value, "0"))); int status = SWIG_OK; bool output_director = true; String *dirclassname = directorClassName(parent); String *qualified_name = NewStringf("%s::%s", dirclassname, name); SwigType *c_ret_type = NULL; String *jupcall_args = NewString(""); String *imclass_dmethod; String *callback_typedef_parms = NewString(""); String *delegate_parms = NewString(""); String *proxy_method_types = NewString(""); String *callback_def = NewString(""); String *callback_code = NewString(""); String *imcall_args = NewString(""); bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; // Kludge Alert: functionWrapper sets sym:overload properly, but it // isn't at this point, so we have to manufacture it ourselves. At least // we're consistent with the sym:overload name in functionWrapper. (?? when // does the overloaded method name get set?) imclass_dmethod = NewStringf("SwigDirector_%s", Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name)); qualified_return = SwigType_rcaststr(returntype, "c_result"); if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { String *base_typename = SwigType_base(returntype); String *resolved_typename = SwigType_typedef_resolve_all(base_typename); Symtab *symtab = Getattr(n, "sym:symtab"); Node *typenode = Swig_symbol_clookup(resolved_typename, symtab); if (SwigType_ispointer(returntype) || (typenode && Getattr(typenode, "abstracts"))) { /* initialize pointers to something sane. Same for abstract classes when a reference is returned. */ Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } else { /* If returning a reference, initialize the pointer to a sane default - if a C# exception occurs, then the pointer returns something other than a NULL-initialized reference. */ SwigType *noref_type = SwigType_del_reference(Copy(returntype)); String *noref_ltype = SwigType_lstr(noref_type, 0); String *return_ltype = SwigType_lstr(returntype, 0); Wrapper_add_localv(w, "result_default", "static", noref_ltype, "result_default", NIL); Wrapper_add_localv(w, "c_result", return_ltype, "c_result", NIL); Printf(w->code, "result_default = SwigValueInit< %s >();\n", noref_ltype); Printf(w->code, "c_result = &result_default;\n"); Delete(return_ltype); Delete(noref_ltype); Delete(noref_type); } Delete(base_typename); Delete(resolved_typename); } } else { SwigType *vt; vt = cplus_value_type(returntype); if (!vt) { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), NIL); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(vt, "c_result"), NIL); Delete(vt); } } } /* Create the intermediate class wrapper */ tm = Swig_typemap_lookup("imtype", n, "", 0); if (tm) { String *imtypeout = Getattr(n, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap if (imtypeout) tm = imtypeout; const String *im_directoroutattributes = Getattr(n, "tmap:imtype:directoroutattributes"); if (im_directoroutattributes) { Printf(callback_def, " %s\n", im_directoroutattributes); if (!ignored_method) Printf(director_delegate_definitions, " %s\n", im_directoroutattributes); } Printf(callback_def, " private %s SwigDirectorMethod%s(", tm, overloaded_name); if (!ignored_method) { const String *csdirectordelegatemodifiers = Getattr(n, "feature:csdirectordelegatemodifiers"); String *modifiers = (csdirectordelegatemodifiers ? NewStringf("%s%s", csdirectordelegatemodifiers, Len(csdirectordelegatemodifiers) > 0 ? " " : "") : NewStringf("public ")); Printf(director_delegate_definitions, " %sdelegate %s", modifiers, tm); Delete(modifiers); } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(returntype, 0)); } if ((c_ret_type = Swig_typemap_lookup("ctype", n, "", 0))) { if (!is_void && !ignored_method) { String *jretval_decl = NewStringf("%s jresult", c_ret_type); Wrapper_add_localv(w, "jresult", jretval_decl, "= 0", NIL); Delete(jretval_decl); } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Swig_director_parms_fixup(l); /* Attach the standard typemaps */ Swig_typemap_attach_parms("out", l, 0); Swig_typemap_attach_parms("ctype", l, 0); Swig_typemap_attach_parms("imtype", l, 0); Swig_typemap_attach_parms("cstype", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("csdirectorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); /* Preamble code */ if (!ignored_method) Printf(w->code, "if (!swig_callback%s) {\n", overloaded_name); if (!pure_virtual) { String *super_call = Swig_method_call(super, l); if (is_void) { Printf(w->code, "%s;\n", super_call); if (!ignored_method) Printf(w->code, "return;\n"); } else { Printf(w->code, "return %s;\n", super_call); } Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"%s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); if (!is_void) Printf(w->code, "return %s;", qualified_return); else if (!ignored_method) Printf(w->code, "return;\n"); } if (!ignored_method) Printf(w->code, "} else {\n"); /* Go through argument list, convert from native to C# */ for (i = 0, p = l; p; ++i) { /* Is this superfluous? */ while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } SwigType *pt = Getattr(p, "type"); String *ln = makeParameterName(n, p, i, false); String *c_param_type = NULL; String *c_decl = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* And add to the upcall args */ if (i > 0) Printf(jupcall_args, ", "); Printf(jupcall_args, "%s", arg); /* Get parameter's intermediary C type */ if ((c_param_type = Getattr(p, "tmap:ctype"))) { String *ctypeout = Getattr(p, "tmap:ctype:out"); // the type in the ctype typemap's out attribute overrides the type in the typemap if (ctypeout) c_param_type = ctypeout; /* Add to local variables */ Printf(c_decl, "%s %s", c_param_type, arg); if (!ignored_method) Wrapper_add_localv(w, arg, c_decl, (!(SwigType_ispointer(pt) || SwigType_isreference(pt)) ? "" : "= 0"), NIL); /* Add input marshalling code */ if ((tm = Getattr(p, "tmap:directorin"))) { Setattr(p, "emit:directorinput", arg); Replaceall(tm, "$input", arg); Replaceall(tm, "$owner", "0"); if (Len(tm)) if (!ignored_method) Printf(w->code, "%s\n", tm); /* Add C type to callback typedef */ if (i > 0) Printf(callback_typedef_parms, ", "); Printf(callback_typedef_parms, "%s", c_param_type); /* Add parameter to the intermediate class code if generating the * intermediate's upcall code */ if ((tm = Getattr(p, "tmap:imtype"))) { String *imtypeout = Getattr(p, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap if (imtypeout) tm = imtypeout; const String *im_directorinattributes = Getattr(p, "tmap:imtype:directorinattributes"); String *din = Copy(Getattr(p, "tmap:csdirectorin")); if (din) { Replaceall(din, "$module", module_class_name); Replaceall(din, "$imclassname", imclass_name); substituteClassname(pt, din); Replaceall(din, "$iminput", ln); // pre and post attribute support String *pre = Getattr(p, "tmap:csdirectorin:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$iminput", ln); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:csdirectorin:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$iminput", ln); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:csdirectorin:terminator"); if (terminator) { substituteClassname(pt, terminator); Replaceall(terminator, "$iminput", ln); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } if (i > 0) { Printf(delegate_parms, ", "); Printf(proxy_method_types, ", "); Printf(imcall_args, ", "); } Printf(delegate_parms, "%s%s %s", im_directorinattributes ? im_directorinattributes : empty_string, tm, ln); if (Cmp(din, ln)) { Printv(imcall_args, din, NIL); } else Printv(imcall_args, ln, NIL); /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); int flags = DOH_REPLACE_FIRST | DOH_REPLACE_ID_BEGIN | DOH_REPLACE_NOCOMMENT; if (Replace(tm, "ref ", "", flags) || Replace(tm, "ref\t", "", flags)) { Printf(proxy_method_types, "typeof(%s).MakeByRefType()", tm); } else if (Replace(tm, "out ", "", flags) || Replace(tm, "out\t", "", flags)) { Printf(proxy_method_types, "typeof(%s).MakeByRefType()", tm); } else { Printf(proxy_method_types, "typeof(%s)", tm); } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(pt, 0)); } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSDIRECTORIN_UNDEF, input_file, line_number, "No csdirectorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } p = Getattr(p, "tmap:directorin:next"); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSDIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for argument %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = nextSibling(p); output_director = false; } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; p = nextSibling(p); } Delete(ln); Delete(arg); Delete(c_decl); } /* header declaration, start wrapper definition */ String *target; SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Add any exception specifications to the methods in the director class if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0)); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* Finish off the inherited upcall's definition */ Printf(callback_def, "%s)", delegate_parms); Printf(callback_def, " {\n"); /* Emit the intermediate class's upcall to the actual class */ String *upcall = NewStringf("%s(%s)", symname, imcall_args); if ((tm = Swig_typemap_lookup("csdirectorout", n, "", 0))) { substituteClassname(returntype, tm); Replaceall(tm, "$cscall", upcall); if (!is_void) Insert(tm, 0, "return "); Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap // pre and post attribute support bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code && is_post_code) Printf(callback_code, "%s\n try {\n %s;\n } finally {\n%s\n }\n", pre_code, tm, post_code); else if (is_pre_code) Printf(callback_code, "%s\n %s;\n", pre_code, tm); else if (is_post_code) Printf(callback_code, " try {\n %s;\n } finally {\n%s\n }\n", tm, post_code); else Printf(callback_code, " %s;\n", tm); if (is_terminator_code) Printv(callback_code, "\n", terminator_code, NIL); } Printf(callback_code, " }\n"); Delete(upcall); if (!ignored_method) { if (!is_void) Printf(w->code, "jresult = (%s) ", c_ret_type); Printf(w->code, "swig_callback%s(%s);\n", overloaded_name, jupcall_args); if (!is_void) { String *jresult_str = NewString("jresult"); String *result_str = NewString("c_result"); /* Copy jresult into c_result... */ if ((tm = Swig_typemap_lookup("directorout", n, result_str, w))) { Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$result", result_str); Printf(w->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s used in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(jresult_str); Delete(result_str); } /* Marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout"))) { canThrow(n, "directorargout", p); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } /* Terminate wrapper code */ Printf(w->code, "}\n"); if (!is_void) Printf(w->code, "return %s;", qualified_return); } Printf(w->code, "}"); // We expose virtual protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK && output_director) { if (!is_void) { Replaceall(w->code, "$null", qualified_return); } else { Replaceall(w->code, "$null", ""); } if (!ignored_method) Printv(director_delegate_callback, "\n", callback_def, callback_code, NIL); if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } if (!ignored_method) { /* Emit the actual upcall through */ UpcallData *udata = addUpcallMethod(imclass_dmethod, symname, decl, overloaded_name); String *methid = Getattr(udata, "class_methodidx"); Setattr(n, "upcalldata", udata); /* Printf(stdout, "setting upcalldata, nodeType: %s %s::%s %p\n", nodeType(n), classname, Getattr(n, "name"), n); */ Printf(director_callback_typedefs, " typedef %s (SWIGSTDCALL* SWIG_Callback%s_t)(", c_ret_type, methid); Printf(director_callback_typedefs, "%s);\n", callback_typedef_parms); Printf(director_callbacks, " SWIG_Callback%s_t swig_callback%s;\n", methid, overloaded_name); Printf(director_delegate_definitions, " SwigDelegate%s_%s(%s);\n", classname, methid, delegate_parms); Printf(director_delegate_instances, " private SwigDelegate%s_%s swigDelegate%s;\n", classname, methid, methid); Printf(director_method_types, " private static global::System.Type[] swigMethodTypes%s = new global::System.Type[] { %s };\n", methid, proxy_method_types); Printf(director_connect_parms, "SwigDirector%s%s delegate%s", classname, methid, methid); } Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(qualified_return); Delete(declaration); Delete(callback_typedef_parms); Delete(delegate_parms); Delete(proxy_method_types); Delete(callback_def); Delete(callback_code); Delete(dirclassname); DelWrapper(w); return status; } /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { Node *parent = parentNode(n); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *dirclassname = directorClassName(parent); String *sub = NewString(""); Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms; int argidx = 0; /* Assign arguments to superclass's parameters, if not already done */ for (p = superparms; p; p = nextSibling(p)) { String *pname = Getattr(p, "name"); if (!pname) { pname = NewStringf("arg%d", argidx++); Setattr(p, "name", pname); } } // TODO: Is this copy needed? parms = CopyParmList(superparms); if (!Getattr(n, "defaultargs")) { /* constructor */ { String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, dirclassname, parms, 0); String *call = Swig_csuperclass_call(0, basetype, superparms); Printf(f_directors, "%s::%s : %s, %s {\n", dirclassname, target, call, Getattr(parent, "director:ctor")); Printf(f_directors, " swig_init_callbacks();\n"); Printf(f_directors, "}\n\n"); Delete(target); Delete(call); } /* constructor header */ { String *target = Swig_method_decl(0, decl, dirclassname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(supername); Delete(parms); Delete(dirclassname); return Language::classDirectorConstructor(n); } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ int classDirectorDefaultConstructor(Node *n) { String *dirclassname = directorClassName(n); String *classtype = SwigType_namestr(Getattr(n, "name")); Wrapper *w = NewWrapper(); Printf(w->def, "%s::%s() : %s {", dirclassname, dirclassname, Getattr(n, "director:ctor")); Printf(w->code, "}\n"); Wrapper_print(w, f_directors); Printf(f_directors_h, " %s();\n", dirclassname); DelWrapper(w); Delete(classtype); Delete(dirclassname); return Language::classDirectorDefaultConstructor(n); } /* ------------------------------------------------------------ * classDirectorInit() * ------------------------------------------------------------ */ int classDirectorInit(Node *n) { Delete(none_comparison); none_comparison = NewString(""); // not used Delete(director_ctor_code); director_ctor_code = NewString("$director_new"); directorDeclaration(n); Printf(f_directors_h, "%s {\n", Getattr(n, "director:decl")); Printf(f_directors_h, "\npublic:\n"); /* Keep track of the director methods for this class */ first_class_dmethod = curr_class_dmethod = n_dmethods; director_callback_typedefs = NewString(""); director_callbacks = NewString(""); director_delegate_callback = NewString(""); director_delegate_definitions = NewString(""); director_delegate_instances = NewString(""); director_method_types = NewString(""); director_connect_parms = NewString(""); return Language::classDirectorInit(n); } int classDeclaration(Node *n) { String *old_director_callback_typedefs = director_callback_typedefs; String *old_director_callbacks = director_callbacks; String *old_director_delegate_callback = director_delegate_callback; String *old_director_delegate_definitions = director_delegate_definitions; String *old_director_delegate_instances = director_delegate_instances; String *old_director_method_types = director_method_types; String *old_director_connect_parms = director_connect_parms; int ret = Language::classDeclaration(n); // these variables are deleted in emitProxyClassDefAndCPPCasts, hence no Delete here director_callback_typedefs = old_director_callback_typedefs; director_callbacks = old_director_callbacks; director_delegate_callback = old_director_delegate_callback; director_delegate_definitions = old_director_delegate_definitions; director_delegate_instances = old_director_delegate_instances; director_method_types = old_director_method_types; director_connect_parms = old_director_connect_parms; return ret; } /* ---------------------------------------------------------------------- * classDirectorDestructor() * ---------------------------------------------------------------------- */ int classDirectorDestructor(Node *n) { Node *current_class = getCurrentClass(); String *dirclassname = directorClassName(current_class); Wrapper *w = NewWrapper(); if (Getattr(n, "noexcept")) { Printf(f_directors_h, " virtual ~%s() noexcept;\n", dirclassname); Printf(w->def, "%s::~%s() noexcept {\n", dirclassname, dirclassname); } else if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw();\n", dirclassname); Printf(w->def, "%s::~%s() throw() {\n", dirclassname, dirclassname); } else { Printf(f_directors_h, " virtual ~%s();\n", dirclassname); Printf(w->def, "%s::~%s() {\n", dirclassname, dirclassname); } Printv(w->code, "}\n", NIL); Wrapper_print(w, f_directors); DelWrapper(w); Delete(dirclassname); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorEnd() * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { int i; String *dirclassname = directorClassName(n); Wrapper *w = NewWrapper(); if (Len(director_callback_typedefs) > 0) { Printf(f_directors_h, "\n%s", director_callback_typedefs); } Printf(f_directors_h, " void swig_connect_director("); Printf(w->def, "void %s::swig_connect_director(", dirclassname); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); String *overname = Getattr(udata, "overname"); Printf(f_directors_h, "SWIG_Callback%s_t callback%s", methid, overname); Printf(w->def, "SWIG_Callback%s_t callback%s", methid, overname); Printf(w->code, "swig_callback%s = callback%s;\n", overname, overname); if (i != curr_class_dmethod - 1) { Printf(f_directors_h, ", "); Printf(w->def, ", "); } } Printf(f_directors_h, ");\n"); Printf(w->def, ") {"); if (Len(director_callbacks) > 0) { Printf(f_directors_h, "\nprivate:\n%s", director_callbacks); } Printf(f_directors_h, " void swig_init_callbacks();\n"); Printf(f_directors_h, "};\n\n"); Printf(w->code, "}\n\n"); Printf(w->code, "void %s::swig_init_callbacks() {\n", dirclassname); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *overname = Getattr(udata, "overname"); Printf(w->code, "swig_callback%s = 0;\n", overname); } Printf(w->code, "}"); Wrapper_print(w, f_directors); DelWrapper(w); Delete(dirclassname); return Language::classDirectorEnd(n); } /* -------------------------------------------------------------------- * classDirectorDisown() * ------------------------------------------------------------------*/ virtual int classDirectorDisown(Node *n) { (void) n; return SWIG_OK; } /*---------------------------------------------------------------------- * extraDirectorProtectedCPPMethodsRequired() *--------------------------------------------------------------------*/ bool extraDirectorProtectedCPPMethodsRequired() const { return false; } /*---------------------------------------------------------------------- * directorDeclaration() * * Generate the director class's declaration * e.g. "class SwigDirector_myclass : public myclass, public Swig::Director {" *--------------------------------------------------------------------*/ void directorDeclaration(Node *n) { String *base = Getattr(n, "classtype"); String *class_ctor = NewString("Swig::Director()"); String *dirclassname = directorClassName(n); String *declaration = Swig_class_declaration(n, dirclassname); Printf(declaration, " : public %s, public Swig::Director", base); // Stash stuff for later. Setattr(n, "director:decl", declaration); Setattr(n, "director:ctor", class_ctor); Delete(dirclassname); } /*---------------------------------------------------------------------- * nestedClassesSupport() *--------------------------------------------------------------------*/ NestedClassSupport nestedClassesSupport() const { return NCS_Full; } }; /* class CSHARP */ /* ----------------------------------------------------------------------------- * swig_csharp() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_csharp() { return new CSHARP(); } extern "C" Language *swig_csharp(void) { return new_swig_csharp(); } /* ----------------------------------------------------------------------------- * Static member variables * ----------------------------------------------------------------------------- */ const char *CSHARP::usage = "\ C# Options (available with -csharp)\n\ -dllimport
- Override DllImport attribute name to
\n\ -namespace - Generate wrappers into C# namespace \n\ -noproxy - Generate the low-level functional interface instead\n\ of proxy classes\n\ -oldvarnames - Old intermediary method names for variable wrappers\n\ -outfile - Write all C# into a single located in the output directory\n\ \n"; swig-4.0.2/Source/Modules/clisp.cxx0000644000175000017500000003213613667507523017075 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * clisp.cxx * * clisp language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" static const char *usage = "\ CLISP Options (available with -clisp)\n\ -extern-all - Create clisp definitions for all the functions and\n\ global variables otherwise only definitions for\n\ externed functions and variables are created.\n\ -generate-typedef - Use def-c-type to generate shortcuts according to the\n\ typedefs in the input.\n\ "; class CLISP:public Language { public: File *f_cl; String *module; virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int variableWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int classDeclaration(Node *n); virtual int enumDeclaration(Node *n); virtual int typedefHandler(Node *n); List *entries; private: String *get_ffi_type(Node *n, SwigType *ty); String *convert_literal(String *num_param, String *type); String *strip_parens(String *string); int extern_all_flag; int generate_typedef_flag; int is_function; }; void CLISP::main(int argc, char *argv[]) { int i; Preprocessor_define("SWIGCLISP 1", 0); SWIG_library_directory("clisp"); SWIG_config_file("clisp.swg"); generate_typedef_flag = 0; extern_all_flag = 0; for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-help")) { Printf(stdout, "%s\n", usage); } else if ((Strcmp(argv[i], "-extern-all") == 0)) { extern_all_flag = 1; Swig_mark_arg(i); } else if ((Strcmp(argv[i], "-generate-typedef") == 0)) { generate_typedef_flag = 1; Swig_mark_arg(i); } } } int CLISP::top(Node *n) { File *f_null = NewString(""); module = Getattr(n, "name"); String *output_filename; entries = NewList(); /* Get the output file name */ String *outfile = Getattr(n, "outfile"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } output_filename = NewStringf("%s%s.lisp", SWIG_output_directory(), module); f_cl = NewFile(output_filename, "w+", SWIG_output_files()); if (!f_cl) { FileErrorDisplay(output_filename); SWIG_exit(EXIT_FAILURE); } Swig_register_filebyname("header", f_null); Swig_register_filebyname("begin", f_null); Swig_register_filebyname("runtime", f_null); Swig_register_filebyname("wrapper", f_null); String *header = NewString(""); Swig_banner_target_lang(header, ";;"); Printf(header, "\n(defpackage :%s\n (:use :common-lisp :ffi)", module); Language::top(n); Iterator i; long len = Len(entries); if (len > 0) { Printf(header, "\n (:export"); } //else nothing to export for (i = First(entries); i.item; i = Next(i)) { Printf(header, "\n\t:%s", i.item); } if (len > 0) { Printf(header, ")"); } Printf(header, ")\n"); Printf(header, "\n(in-package :%s)\n", module); Printf(header, "\n(default-foreign-language :stdc)\n"); len = Tell(f_cl); Printf(f_cl, "%s", header); long end = Tell(f_cl); for (len--; len >= 0; len--) { end--; (void)Seek(f_cl, len, SEEK_SET); int ch = Getc(f_cl); (void)Seek(f_cl, end, SEEK_SET); Putc(ch, f_cl); } Seek(f_cl, 0, SEEK_SET); Write(f_cl, Char(header), Len(header)); Delete(f_cl); return SWIG_OK; } int CLISP::functionWrapper(Node *n) { is_function = 1; String *storage = Getattr(n, "storage"); if (!extern_all_flag && (!storage || (!Swig_storage_isextern(n) && !Swig_storage_isexternc(n)))) return SWIG_OK; String *func_name = Getattr(n, "sym:name"); ParmList *pl = Getattr(n, "parms"); int argnum = 0, first = 1; Printf(f_cl, "\n(ffi:def-call-out %s\n\t(:name \"%s\")\n", func_name, func_name); Append(entries, func_name); if (ParmList_len(pl) != 0) { Printf(f_cl, "\t(:arguments "); } for (Parm *p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); // SwigType *argtype; String *ffitype = get_ffi_type(n, Getattr(p, "type")); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } if (!first) { Printf(f_cl, "\n\t\t"); } Printf(f_cl, "(%s %s)", argname, ffitype); first = 0; Delete(ffitype); if (tempargname) Delete(argname); } if (ParmList_len(pl) != 0) { Printf(f_cl, ")\n"); /* finish arg list */ } String *ffitype = get_ffi_type(n, Getattr(n, "type")); if (Strcmp(ffitype, "NIL")) { //when return type is not nil Printf(f_cl, "\t(:return-type %s)\n", ffitype); } Printf(f_cl, "\t(:library +library-name+))\n"); return SWIG_OK; } int CLISP::constantWrapper(Node *n) { is_function = 0; String *type = Getattr(n, "type"); String *converted_value = convert_literal(Getattr(n, "value"), type); String *name = Getattr(n, "sym:name"); Printf(f_cl, "\n(defconstant %s %s)\n", name, converted_value); Append(entries, name); Delete(converted_value); return SWIG_OK; } int CLISP::variableWrapper(Node *n) { is_function = 0; String *storage = Getattr(n, "storage"); if (!extern_all_flag && (!storage || (!Swig_storage_isextern(n) && !Swig_storage_isexternc(n)))) return SWIG_OK; String *var_name = Getattr(n, "sym:name"); String *lisp_type = get_ffi_type(n, Getattr(n, "type")); Printf(f_cl, "\n(ffi:def-c-var %s\n (:name \"%s\")\n (:type %s)\n", var_name, var_name, lisp_type); Printf(f_cl, "\t(:library +library-name+))\n"); Append(entries, var_name); Delete(lisp_type); return SWIG_OK; } int CLISP::typedefHandler(Node *n) { if (generate_typedef_flag) { is_function = 0; Printf(f_cl, "\n(ffi:def-c-type %s %s)\n", Getattr(n, "name"), get_ffi_type(n, Getattr(n, "type"))); } return Language::typedefHandler(n); } int CLISP::enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; is_function = 0; String *name = Getattr(n, "sym:name"); Printf(f_cl, "\n(ffi:def-c-enum %s ", name); for (Node *c = firstChild(n); c; c = nextSibling(c)) { String *slot_name = Getattr(c, "name"); String *value = Getattr(c, "enumvalue"); Printf(f_cl, "(%s %s)", slot_name, value); Append(entries, slot_name); Delete(value); } Printf(f_cl, ")\n"); return SWIG_OK; } // Includes structs int CLISP::classDeclaration(Node *n) { is_function = 0; String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); if (Strcmp(kind, "struct")) { Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); Printf(stderr, " (name: %s)\n", name); SWIG_exit(EXIT_FAILURE); } Printf(f_cl, "\n(ffi:def-c-struct %s", name); Append(entries, NewStringf("make-%s", name)); for (Node *c = firstChild(n); c; c = nextSibling(c)) { if (Strcmp(nodeType(c), "cdecl")) { Printf(stderr, "Structure %s has a slot that we can't deal with.\n", name); Printf(stderr, "nodeType: %s, name: %s, type: %s\n", nodeType(c), Getattr(c, "name"), Getattr(c, "type")); SWIG_exit(EXIT_FAILURE); } String *temp = Copy(Getattr(c, "decl")); if (temp) { Append(temp, Getattr(c, "type")); //appending type to the end, otherwise wrong type String *lisp_type = get_ffi_type(n, temp); Delete(temp); String *slot_name = Getattr(c, "sym:name"); Printf(f_cl, "\n\t(%s %s)", slot_name, lisp_type); Append(entries, NewStringf("%s-%s", name, slot_name)); Delete(lisp_type); } } Printf(f_cl, ")\n"); /* Add this structure to the known lisp types */ //Printf(stdout, "Adding %s foreign type\n", name); // add_defined_foreign_type(name); return SWIG_OK; } /* utilities */ /* returns new string w/ parens stripped */ String *CLISP::strip_parens(String *string) { char *s = Char(string), *p; int len = Len(string); String *res; if (len == 0 || s[0] != '(' || s[len - 1] != ')') { return NewString(string); } p = (char *) malloc(len - 2 + 1); if (!p) { Printf(stderr, "Malloc failed\n"); SWIG_exit(EXIT_FAILURE); } strncpy(p, s + 1, len - 1); p[len - 2] = 0; /* null terminate */ res = NewString(p); free(p); return res; } String *CLISP::convert_literal(String *num_param, String *type) { String *num = strip_parens(num_param), *res; char *s = Char(num); /* Make sure doubles use 'd' instead of 'e' */ if (!Strcmp(type, "double")) { String *updated = Copy(num); if (Replace(updated, "e", "d", DOH_REPLACE_ANY) > 1) { Printf(stderr, "Weird!! number %s looks invalid.\n", num); SWIG_exit(EXIT_FAILURE); } Delete(num); return updated; } if (SwigType_type(type) == T_CHAR) { /* Use CL syntax for character literals */ return NewStringf("#\\%s", num_param); } else if (SwigType_type(type) == T_STRING) { /* Use CL syntax for string literals */ return NewStringf("\"%s\"", num_param); } if (Len(num) < 2 || s[0] != '0') { return num; } /* octal or hex */ res = NewStringf("#%c%s", s[1] == 'x' ? 'x' : 'o', s + 2); Delete(num); return res; } String *CLISP::get_ffi_type(Node *n, SwigType *ty) { Node *node = NewHash(); Setattr(node, "type", ty); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("in", node, "", 0); Delete(node); if (tm) { return NewString(tm); } else if (SwigType_ispointer(ty)) { SwigType *cp = Copy(ty); SwigType_del_pointer(cp); String *inner_type = get_ffi_type(n, cp); if (SwigType_isfunction(cp)) { return inner_type; } SwigType *base = SwigType_base(ty); String *base_name = SwigType_str(base, 0); String *str; if (!Strcmp(base_name, "int") || !Strcmp(base_name, "float") || !Strcmp(base_name, "short") || !Strcmp(base_name, "double") || !Strcmp(base_name, "long") || !Strcmp(base_name, "char")) { str = NewStringf("(ffi:c-ptr %s)", inner_type); } else { str = NewStringf("(ffi:c-pointer %s)", inner_type); } Delete(base_name); Delete(base); Delete(cp); Delete(inner_type); return str; } else if (SwigType_isarray(ty)) { SwigType *cp = Copy(ty); String *array_dim = SwigType_array_getdim(ty, 0); if (!Strcmp(array_dim, "")) { //dimension less array convert to pointer Delete(array_dim); SwigType_del_array(cp); SwigType_add_pointer(cp); String *str = get_ffi_type(n, cp); Delete(cp); return str; } else { SwigType_pop_arrays(cp); String *inner_type = get_ffi_type(n, cp); Delete(cp); int ndim = SwigType_array_ndim(ty); String *dimension; if (ndim == 1) { dimension = array_dim; } else { dimension = array_dim; for (int i = 1; i < ndim; i++) { array_dim = SwigType_array_getdim(ty, i); Append(dimension, " "); Append(dimension, array_dim); Delete(array_dim); } String *temp = dimension; dimension = NewStringf("(%s)", dimension); Delete(temp); } String *str; if (is_function) str = NewStringf("(ffi:c-ptr (ffi:c-array %s %s))", inner_type, dimension); else str = NewStringf("(ffi:c-array %s %s)", inner_type, dimension); Delete(inner_type); Delete(dimension); return str; } } else if (SwigType_isfunction(ty)) { SwigType *cp = Copy(ty); SwigType *fn = SwigType_pop_function(cp); String *args = NewString(""); ParmList *pl = SwigType_function_parms(fn, n); if (ParmList_len(pl) != 0) { Printf(args, "(:arguments "); } int argnum = 0, first = 1; for (Parm *p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); SwigType *argtype = Getattr(p, "type"); String *ffitype = get_ffi_type(n, argtype); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } if (!first) { Printf(args, "\n\t\t"); } Printf(args, "(%s %s)", argname, ffitype); first = 0; Delete(ffitype); if (tempargname) Delete(argname); } if (ParmList_len(pl) != 0) { Printf(args, ")\n"); /* finish arg list */ } String *ffitype = get_ffi_type(n, cp); String *str = NewStringf("(ffi:c-function %s \t\t\t\t(:return-type %s))", args, ffitype); Delete(fn); Delete(args); Delete(cp); Delete(ffitype); return str; } String *str = SwigType_str(ty, 0); if (str) { char *st = Strstr(str, "struct"); if (st) { st += 7; return NewString(st); } char *cl = Strstr(str, "class"); if (cl) { cl += 6; return NewString(cl); } } return str; } extern "C" Language *swig_clisp(void) { return new CLISP(); } swig-4.0.2/Source/Modules/scilab.cxx0000644000175000017500000012525113667507523017221 0ustar williamwilliam/* ---------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * scilab.cxx * * Scilab language module for SWIG. * --------------------------------------------------------------------------*/ #include "swigmod.h" static const int SCILAB_IDENTIFIER_NAME_CHAR_MAX = 24; static const int SCILAB_VARIABLE_NAME_CHAR_MAX = SCILAB_IDENTIFIER_NAME_CHAR_MAX - 4; static const char *usage = (char *) " \ Scilab options (available with -scilab)\n \ -builder - Generate a Scilab builder script\n \ -buildercflags - Add to the builder compiler flags\n \ -builderflagscript - Set the Scilab script to use by builder to configure the build flags\n \ -builderldflags - Add to the builder linker flags\n \ -buildersources - Add the (comma separated) files to the builder sources\n \ -builderverbositylevel - Set the builder verbosity level to (default 0: off, 2: high)\n \ -gatewayxml - Generate gateway xml with the given \n \ -targetversion - Generate for Scilab target (major) version (default: 5)\n \ \n"; class SCILAB:public Language { protected: /* General objects used for holding the strings */ File *beginSection; File *runtimeSection; File *headerSection; File *wrappersSection; File *initSection; String *variablesCode; int targetVersion; bool generateBuilder; File *builderFile; String *builderCode; int builderFunctionCount; List *sourceFileList; List *cflags; List *ldflags; String *verboseBuildLevel; String *buildFlagsScript; String *gatewayHeader; String *gatewayHeaderV5; String *gatewayHeaderV6; bool createGatewayXML; File *gatewayXMLFile; String *gatewayXML; String *gatewayID; int primitiveID; bool createLoader; File *loaderFile; String *loaderScript; public: /* ------------------------------------------------------------------------ * main() * ----------------------------------------------------------------------*/ virtual void main(int argc, char *argv[]) { targetVersion = 5; generateBuilder = false; sourceFileList = NewList(); cflags = NewList(); ldflags = NewList(); verboseBuildLevel = NULL; buildFlagsScript = NULL; gatewayHeader = NULL; gatewayHeaderV5 = NULL; gatewayHeaderV6 = NULL; createGatewayXML = false; gatewayXML = NULL; gatewayXMLFile = NULL; gatewayID = NULL; createLoader = true; loaderFile = NULL; loaderScript = NULL; /* Manage command line arguments */ for (int argIndex = 1; argIndex < argc; argIndex++) { if (argv[argIndex] != NULL) { if (strcmp(argv[argIndex], "-help") == 0) { Printf(stdout, "%s\n", usage); } else if (strcmp(argv[argIndex], "-builder") == 0) { Swig_mark_arg(argIndex); generateBuilder = true; createLoader = false; } else if (strcmp(argv[argIndex], "-buildersources") == 0) { if (argv[argIndex + 1] != NULL) { Swig_mark_arg(argIndex); char *sourceFile = strtok(argv[argIndex + 1], ","); while (sourceFile != NULL) { Insert(sourceFileList, Len(sourceFileList), sourceFile); sourceFile = strtok(NULL, ","); } Swig_mark_arg(argIndex + 1); } } else if (strcmp(argv[argIndex], "-buildercflags") == 0) { Swig_mark_arg(argIndex); if (argv[argIndex + 1] != NULL) { Insert(cflags, Len(cflags), argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } } else if (strcmp(argv[argIndex], "-builderldflags") == 0) { Swig_mark_arg(argIndex); if (argv[argIndex + 1] != NULL) { Insert(ldflags, Len(ldflags), argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } } else if (strcmp(argv[argIndex], "-builderverbositylevel") == 0) { Swig_mark_arg(argIndex); verboseBuildLevel = NewString(argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } else if (strcmp(argv[argIndex], "-builderflagscript") == 0) { Swig_mark_arg(argIndex); buildFlagsScript = NewString(argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } else if (strcmp(argv[argIndex], "-gatewayxml") == 0) { Swig_mark_arg(argIndex); createGatewayXML = true; gatewayID = NewString(argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } else if (strcmp(argv[argIndex], "-targetversion") == 0) { if (argv[argIndex + 1] != NULL) { Swig_mark_arg(argIndex); targetVersion = atoi(argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } } } } if (verboseBuildLevel == NULL) { verboseBuildLevel = NewString("0"); } /* Set language-specific subdirectory in SWIG library */ SWIG_library_directory("scilab"); /* Add a symbol to the parser for conditional compilation */ Preprocessor_define("SWIGSCILAB 1", 0); /* Set scilab configuration file */ SWIG_config_file("scilab.swg"); /* Set typemap for scilab */ SWIG_typemap_lang("scilab"); allow_overloading(); } /* ------------------------------------------------------------------------ * top() * ----------------------------------------------------------------------*/ virtual int top(Node *node) { /* Get the module name */ String *gatewayName = Getattr(node, "name"); // Set library name String *gatewayLibraryName = NewStringf("lib%s", gatewayName); /* Get the output file name */ String *outputFilename = Getattr(node, "outfile"); /* Initialize I/O */ beginSection = NewFile(outputFilename, "w", SWIG_output_files()); if (!beginSection) { FileErrorDisplay(outputFilename); SWIG_exit(EXIT_FAILURE); } runtimeSection = NewString(""); initSection = NewString(""); headerSection = NewString(""); wrappersSection = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("begin", beginSection); Swig_register_filebyname("header", headerSection); Swig_register_filebyname("wrapper", wrappersSection); Swig_register_filebyname("runtime", runtimeSection); Swig_register_filebyname("init", initSection); /* Output module initialization code */ Swig_banner(beginSection); Printf(runtimeSection, "\n\n#ifndef SWIGSCILAB\n#define SWIGSCILAB\n#endif\n\n"); // Gateway header source merged with wrapper source in nobuilder mode if (!generateBuilder) startGatewayHeader(gatewayLibraryName); // Create builder file if required if (generateBuilder) { createBuilderFile(outputFilename); } // Create gateway XML if required if (createGatewayXML) { createGatewayXMLFile(gatewayName); } // Create loader script if required if (createLoader) { createLoaderFile(gatewayLibraryName); } // Module initialization function String *gatewayInitFunctionName = NewStringf("%s_Init", gatewayName); /* Add initialization function to builder table */ addFunctionToScilab(gatewayInitFunctionName, gatewayInitFunctionName); // Add helper functions to builder table addHelperFunctions(); // Open Scilab wrapper variables creation function variablesCode = NewString(""); Printf(variablesCode, "int SWIG_CreateScilabVariables(void *_pvApiCtx) {"); /* Emit code for children */ if (CPlusPlus) { Printf(wrappersSection, "extern \"C\" {\n"); } Language::top(node); if (CPlusPlus) { Printf(wrappersSection, "}\n"); } // Close Scilab wrapper variables creation function Printf(variablesCode, " return SWIG_OK;\n}\n"); // Add Builder footer code and save if (generateBuilder) { saveBuilderFile(gatewayName); } /* Close the init function and rename with module name */ Printf(initSection, "return 0;\n}\n"); Replaceall(initSection, "", gatewayName); /* Write all to the wrapper file */ SwigType_emit_type_table(runtimeSection, wrappersSection); // Declare pointer types, ... (Ex: SWIGTYPE_p_p_double) // Gateway header source merged with wrapper source in nobuilder mode if (!generateBuilder) { terminateGatewayHeader(gatewayLibraryName); Printv(initSection, gatewayHeader, NIL); } Dump(runtimeSection, beginSection); Dump(headerSection, beginSection); Dump(wrappersSection, beginSection); Dump(variablesCode, beginSection); Wrapper_pretty_print(initSection, beginSection); if (createGatewayXML) { saveGatewayXMLFile(); } if (createLoader) { saveLoaderFile(gatewayLibraryName); } /* Cleanup files */ Delete(runtimeSection); Delete(headerSection); Delete(wrappersSection); Delete(initSection); Delete(beginSection); Delete(sourceFileList); Delete(cflags); Delete(ldflags); return SWIG_OK; } /* ------------------------------------------------------------------------ * emitBanner() * ----------------------------------------------------------------------*/ void emitBanner(File *f) { Printf(f, "// ----------------------------------------------------------------------------\n"); Swig_banner_target_lang(f, "// "); Printf(f, "// ----------------------------------------------------------------------------- */\n\n"); } /* ------------------------------------------------------------------------ * functionWrapper() * ----------------------------------------------------------------------*/ virtual int functionWrapper(Node *node) { /* Get some useful attributes of this function */ String *functionName = Getattr(node, "sym:name"); SwigType *functionReturnType = Getattr(node, "type"); ParmList *functionParamsList = Getattr(node, "parms"); int paramIndex = 0; // Used for loops over ParmsList Parm *param = NULL; // Used for loops over ParamsList /* Create the wrapper object */ Wrapper *wrapper = NewWrapper(); /* Create the function wrapper name */ String *wrapperName = Swig_name_wrapper(functionName); /* Deal with overloading */ String *overloadedName = Copy(wrapperName); /* Determine whether the function is overloaded or not */ bool isOverloaded = ! !Getattr(node, "sym:overloaded"); /* Determine whether the function is the last overloaded */ bool isLastOverloaded = isOverloaded && !Getattr(node, "sym:nextSibling"); if (!isOverloaded && !addSymbol(functionName, node)) { DelWrapper(wrapper); return SWIG_ERROR; } if (isOverloaded) { Append(overloadedName, Getattr(node, "sym:overname")); } /* Write the wrapper function definition (standard Scilab gateway function prototype) */ Printv(wrapper->def, "int ", overloadedName, "(SWIG_GatewayParameters) {", NIL); /* Emit all of the local variables for holding arguments */ // E.g.: double arg1; emit_parameter_variables(functionParamsList, wrapper); /* Attach typemaps to the parameter list */ // Add local variables used in typemaps (iRows, iCols, ...) emit_attach_parmmaps(functionParamsList, wrapper); Setattr(node, "wrap:parms", functionParamsList); /* Check input/output arguments count */ int maxInputArguments = emit_num_arguments(functionParamsList); int minInputArguments = emit_num_required(functionParamsList); int minOutputArguments = 0; int maxOutputArguments = 0; if (!emit_isvarargs(functionParamsList)) { Printf(wrapper->code, "SWIG_CheckInputArgument(pvApiCtx, $mininputarguments, $maxinputarguments);\n"); } else { Printf(wrapper->code, "SWIG_CheckInputArgumentAtLeast(pvApiCtx, $mininputarguments-1);\n"); } Printf(wrapper->code, "SWIG_CheckOutputArgument(pvApiCtx, $minoutputarguments, $maxoutputarguments);\n"); /* Set context */ Printf(wrapper->code, "SWIG_Scilab_SetFuncName(fname);\n"); Printf(wrapper->code, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); /* Write typemaps(in) */ for (paramIndex = 0, param = functionParamsList; paramIndex < maxInputArguments; ++paramIndex) { // Ignore parameter if the typemap specifies numinputs=0 while (checkAttribute(param, "tmap:in:numinputs", "0")) { param = Getattr(param, "tmap:in:next"); } SwigType *paramType = Getattr(param, "type"); String *paramTypemap = Getattr(param, "tmap:in"); if (paramTypemap) { // Replace $input by the position on Scilab stack String *source = NewString(""); Printf(source, "%d", paramIndex + 1); Setattr(param, "emit:input", source); Replaceall(paramTypemap, "$input", Getattr(param, "emit:input")); if (Getattr(param, "wrap:disown") || (Getattr(param, "tmap:in:disown"))) { Replaceall(paramTypemap, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(paramTypemap, "$disown", "0"); } if (paramIndex >= minInputArguments) { /* Optional input argument management */ Printf(wrapper->code, "if (SWIG_NbInputArgument(pvApiCtx) > %d) {\n%s\n}\n", paramIndex, paramTypemap); } else { Printf(wrapper->code, "%s\n", paramTypemap); } param = Getattr(param, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(paramType, 0)); break; } } /* TODO write constraints */ Setattr(node, "wrap:name", overloadedName); /* Emit the function call */ Swig_director_emit_dynamic_cast(node, wrapper); String *functionActionCode = emit_action(node); /* Insert the return variable */ emit_return_variable(node, functionReturnType, wrapper); /* Return the function value if necessary */ String *functionReturnTypemap = Swig_typemap_lookup_out("out", node, Swig_cresult_name(), wrapper, functionActionCode); if (functionReturnTypemap) { // Result is actually the position of output value on stack if (Len(functionReturnTypemap) > 0) { Printf(wrapper->code, "SWIG_Scilab_SetOutputPosition(%d);\n", 1); } Replaceall(functionReturnTypemap, "$result", "1"); if (GetFlag(node, "feature:new")) { Replaceall(functionReturnTypemap, "$owner", "1"); } else { Replaceall(functionReturnTypemap, "$owner", "0"); } Printf(wrapper->code, "%s\n", functionReturnTypemap); /* If the typemap is not empty, the function return one more argument than the typemaps gives */ if (Len(functionReturnTypemap) > 0) { minOutputArguments++; maxOutputArguments++; } Delete(functionReturnTypemap); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(functionReturnType, 0), functionName); } /* Write typemaps(out) */ for (param = functionParamsList; param;) { String *paramTypemap = Getattr(param, "tmap:argout"); if (paramTypemap) { minOutputArguments++; maxOutputArguments++; Printf(wrapper->code, "SWIG_Scilab_SetOutputPosition(%d);\n", minOutputArguments); String *result = NewString(""); Printf(result, "%d", minOutputArguments); Replaceall(paramTypemap, "$result", result); Printf(wrapper->code, "%s\n", paramTypemap); Delete(paramTypemap); param = Getattr(param, "tmap:argout:next"); } else { param = nextSibling(param); } } /* Add cleanup code */ for (param = functionParamsList; param;) { String *tm; if ((tm = Getattr(param, "tmap:freearg"))) { if (tm && (Len(tm) != 0)) { Replaceall(tm, "$source", Getattr(param, "lname")); Printf(wrapper->code, "%s\n", tm); } param = Getattr(param, "tmap:freearg:next"); } else { param = nextSibling(param); } } /* See if there is any return cleanup code */ String *tm; if ((tm = Swig_typemap_lookup("ret", node, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(wrapper->code, "%s\n", tm); Delete(tm); } /* Close the function(ok) */ Printv(wrapper->code, "return SWIG_OK;\n", NIL); Printv(wrapper->code, "}\n", NIL); /* Add the failure cleanup code */ /* TODO */ /* Final substitutions if applicable */ Replaceall(wrapper->code, "$symname", functionName); /* Set CheckInputArgument and CheckOutputArgument input arguments */ /* In Scilab there is always one output even if not defined */ if (minOutputArguments == 0) { maxOutputArguments = 1; } String *argnumber = NewString(""); Printf(argnumber, "%d", minInputArguments); Replaceall(wrapper->code, "$mininputarguments", argnumber); argnumber = NewString(""); Printf(argnumber, "%d", maxInputArguments); Replaceall(wrapper->code, "$maxinputarguments", argnumber); argnumber = NewString(""); Printf(argnumber, "%d", minOutputArguments); Replaceall(wrapper->code, "$minoutputarguments", argnumber); argnumber = NewString(""); Printf(argnumber, "%d", maxOutputArguments); Replaceall(wrapper->code, "$maxoutputarguments", argnumber); /* Dump the function out */ Wrapper_print(wrapper, wrappersSection); String *scilabFunctionName = checkIdentifierName(functionName, SCILAB_IDENTIFIER_NAME_CHAR_MAX); /* Update builder.sce contents */ if (isLastOverloaded) { addFunctionToScilab(scilabFunctionName, wrapperName); dispatchFunction(node); } if (!isOverloaded) { addFunctionToScilab(scilabFunctionName, wrapperName); } /* tidy up */ Delete(overloadedName); Delete(wrapperName); DelWrapper(wrapper); return SWIG_OK; } /* ----------------------------------------------------------------------- * dispatchFunction() * ----------------------------------------------------------------------- */ void dispatchFunction(Node *node) { Wrapper *wrapper = NewWrapper(); String *functionName = Getattr(node, "sym:name"); String *wrapperName = Swig_name_wrapper(functionName); int maxargs = 0; /* Generate the dispatch function */ String *dispatch = Swig_overload_dispatch(node, "return %s(SWIG_GatewayArguments);", &maxargs); String *tmp = NewString(""); Printv(wrapper->def, "int ", wrapperName, "(SWIG_GatewayParameters) {\n", NIL); /* Get the number of the parameters */ Wrapper_add_local(wrapper, "argc", "int argc = SWIG_NbInputArgument(pvApiCtx)"); Printf(tmp, "int argv[%d] = {", maxargs); for (int j = 0; j < maxargs; ++j) { Printf(tmp, "%s%d", j ? "," : " ", j + 1); } Printf(tmp, "}"); Wrapper_add_local(wrapper, "argv", tmp); Printf(wrapper->code, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); /* Dump the dispatch function */ Printv(wrapper->code, dispatch, "\n", NIL); Printf(wrapper->code, "Scierror(999, _(\"No matching function for overload\"));\n"); Printf(wrapper->code, "return SWIG_ERROR;\n"); Printv(wrapper->code, "}\n", NIL); Wrapper_print(wrapper, wrappersSection); Delete(tmp); DelWrapper(wrapper); Delete(dispatch); Delete(wrapperName); } /* ----------------------------------------------------------------------- * variableWrapper() * ----------------------------------------------------------------------- */ virtual int variableWrapper(Node *node) { /* Get information about variable */ String *origVariableName = Getattr(node, "name"); // Ex: Shape::nshapes String *variableName = Getattr(node, "sym:name"); // Ex; Shape_nshapes (can be used for function names, ...) // Variable names can have SCILAB_VARIABLE_NAME_CHAR_MAX because of suffixes "_get" or "_set" added to function String *scilabVariableName = checkIdentifierName(variableName, SCILAB_VARIABLE_NAME_CHAR_MAX); /* Manage GET function */ Wrapper *getFunctionWrapper = NewWrapper(); String *getFunctionName = Swig_name_get(NSPACE_TODO, variableName); String *scilabGetFunctionName = Swig_name_get(NSPACE_TODO, scilabVariableName); Setattr(node, "wrap:name", getFunctionName); Printv(getFunctionWrapper->def, "int ", getFunctionName, "(SWIG_GatewayParameters) {\n", NIL); /* Check the number of input and output */ Printf(getFunctionWrapper->def, "SWIG_CheckInputArgument(pvApiCtx, 0, 0);\n"); Printf(getFunctionWrapper->def, "SWIG_CheckOutputArgument(pvApiCtx, 1, 1);\n"); Printf(getFunctionWrapper->def, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); String *varoutTypemap = Swig_typemap_lookup("varout", node, origVariableName, 0); if (varoutTypemap != NULL) { Printf(getFunctionWrapper->code, "SWIG_Scilab_SetOutputPosition(%d);\n", 1); Replaceall(varoutTypemap, "$value", origVariableName); Replaceall(varoutTypemap, "$result", "1"); emit_action_code(node, getFunctionWrapper->code, varoutTypemap); Delete(varoutTypemap); } Append(getFunctionWrapper->code, "return SWIG_OK;\n"); Append(getFunctionWrapper->code, "}\n"); Wrapper_print(getFunctionWrapper, wrappersSection); /* Add function to builder table */ addFunctionToScilab(scilabGetFunctionName, getFunctionName); /* Manage SET function */ if (is_assignable(node)) { Wrapper *setFunctionWrapper = NewWrapper(); String *setFunctionName = Swig_name_set(NSPACE_TODO, variableName); String *scilabSetFunctionName = Swig_name_set(NSPACE_TODO, scilabVariableName); Setattr(node, "wrap:name", setFunctionName); Printv(setFunctionWrapper->def, "int ", setFunctionName, "(SWIG_GatewayParameters) {\n", NIL); /* Check the number of input and output */ Printf(setFunctionWrapper->def, "SWIG_CheckInputArgument(pvApiCtx, 1, 1);\n"); Printf(setFunctionWrapper->def, "SWIG_CheckOutputArgument(pvApiCtx, 1, 1);\n"); Printf(setFunctionWrapper->def, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); String *varinTypemap = Swig_typemap_lookup("varin", node, origVariableName, 0); if (varinTypemap != NULL) { Replaceall(varinTypemap, "$input", "1"); emit_action_code(node, setFunctionWrapper->code, varinTypemap); Delete(varinTypemap); } Append(setFunctionWrapper->code, "return SWIG_OK;\n"); Append(setFunctionWrapper->code, "}\n"); Wrapper_print(setFunctionWrapper, wrappersSection); /* Add function to builder table */ addFunctionToScilab(scilabSetFunctionName, setFunctionName); DelWrapper(setFunctionWrapper); } DelWrapper(getFunctionWrapper); return SWIG_OK; } /* ----------------------------------------------------------------------- * constantWrapper() * ----------------------------------------------------------------------- */ virtual int constantWrapper(Node *node) { /* Get the useful information from the node */ String *nodeName = Getattr(node, "name"); SwigType *type = Getattr(node, "type"); String *constantName = Getattr(node, "sym:name"); String *rawValue = Getattr(node, "rawval"); String *constantValue = rawValue ? rawValue : Getattr(node, "value"); String *constantTypemap = NULL; // If feature scilab:const enabled, constants & enums are wrapped to Scilab variables if (GetFlag(node, "feature:scilab:const")) { bool isConstant = ((SwigType_issimple(type)) || (SwigType_type(type) == T_STRING)); bool isEnum = (Cmp(nodeType(node), "enumitem") == 0); if (isConstant || isEnum) { if (isEnum) { Setattr(node, "type", "double"); constantValue = Getattr(node, "value"); } constantTypemap = Swig_typemap_lookup("scilabconstcode", node, nodeName, 0); if (constantTypemap != NULL) { String *scilabConstantName = checkIdentifierName(constantName, SCILAB_IDENTIFIER_NAME_CHAR_MAX); Setattr(node, "wrap:name", constantName); Replaceall(constantTypemap, "$result", scilabConstantName); Replaceall(constantTypemap, "$value", constantValue); emit_action_code(node, variablesCode, constantTypemap); Delete(constantTypemap); return SWIG_OK; } } } /* Create variables for member pointer constants, not supported by typemaps (like Python wrapper does) */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(constantName); String *str = SwigType_str(type, wname); Printf(headerSection, "static %s = %s;\n", str, constantValue); Delete(str); constantValue = wname; } // Constant names can have SCILAB_VARIABLE_NAME_CHAR_MAX because of suffixes "_get" added to function String *scilabConstantName = checkIdentifierName(constantName, SCILAB_VARIABLE_NAME_CHAR_MAX); /* Create GET function to get the constant value */ Wrapper *getFunctionWrapper = NewWrapper(); String *getFunctionName = Swig_name_get(NSPACE_TODO, constantName); String *scilabGetFunctionName = Swig_name_get(NSPACE_TODO, scilabConstantName); Setattr(node, "wrap:name", getFunctionName); Printv(getFunctionWrapper->def, "int ", getFunctionName, "(SWIG_GatewayParameters) {\n", NIL); /* Check the number of input and output */ Printf(getFunctionWrapper->def, "SWIG_CheckInputArgument(pvApiCtx, 0, 0);\n"); Printf(getFunctionWrapper->def, "SWIG_CheckOutputArgument(pvApiCtx, 1, 1);\n"); Printf(getFunctionWrapper->def, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); constantTypemap = Swig_typemap_lookup("constcode", node, nodeName, 0); if (constantTypemap != NULL) { Printf(getFunctionWrapper->code, "SWIG_Scilab_SetOutputPosition(%d);\n", 1); Replaceall(constantTypemap, "$value", constantValue); Replaceall(constantTypemap, "$result", "1"); emit_action_code(node, getFunctionWrapper->code, constantTypemap); Delete(constantTypemap); } /* Dump the wrapper function */ Append(getFunctionWrapper->code, "return SWIG_OK;\n"); Append(getFunctionWrapper->code, "}\n"); Wrapper_print(getFunctionWrapper, wrappersSection); /* Add the function to Scilab */ addFunctionToScilab(scilabGetFunctionName, getFunctionName); DelWrapper(getFunctionWrapper); return SWIG_OK; } /* --------------------------------------------------------------------- * enumvalueDeclaration() * --------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *node) { static int iPreviousEnumValue = 0; if (GetFlag(node, "feature:scilab:const")) { // Compute the "absolute" value of enum if needed // (most of time enum values are a linked list of relative values) String *enumValue = Getattr(node, "enumvalue"); String *enumValueEx = Getattr(node, "enumvalueex"); // First enum value ? String *firstenumitem = Getattr(node, "firstenumitem"); if (firstenumitem) { if (enumValue) { // Value is in 'enumvalue' iPreviousEnumValue = atoi(Char(enumValue)); } else if (enumValueEx) { // Or value is in 'enumValueEx' iPreviousEnumValue = atoi(Char(enumValueEx)); enumValue = NewString(""); Printf(enumValue, "%d", iPreviousEnumValue); Setattr(node, "enumvalue", enumValue); } } else if (!enumValue && enumValueEx) { // Value is not specified, set it by incrementing last value enumValue = NewString(""); Printf(enumValue, "%d", ++iPreviousEnumValue); Setattr(node, "enumvalue", enumValue); } // Enums in Scilab are mapped to double Setattr(node, "type", "double"); } return Language::enumvalueDeclaration(node); } /* --------------------------------------------------------------------- * membervariableHandler() * --------------------------------------------------------------------- */ virtual int membervariableHandler(Node *node) { checkMemberIdentifierName(node, SCILAB_VARIABLE_NAME_CHAR_MAX); return Language::membervariableHandler(node); } /* ----------------------------------------------------------------------- * checkIdentifierName() * If Scilab target version is lower than 6: * truncates (and displays a warning) too long member identifier names * (applies on members of structs, classes...) * (Scilab 5 identifier names are limited to 24 chars max) * ----------------------------------------------------------------------- */ String *checkIdentifierName(String *name, int char_size_max) { String *scilabIdentifierName; if (targetVersion <= 5) { if (Len(name) > char_size_max) { scilabIdentifierName = DohNewStringWithSize(name, char_size_max); Swig_warning(WARN_SCILAB_TRUNCATED_NAME, input_file, line_number, "Identifier name '%s' exceeds 24 characters and has been truncated to '%s'.\n", name, scilabIdentifierName); } else scilabIdentifierName = name; } else { scilabIdentifierName = DohNewString(name); } return scilabIdentifierName; } /* ----------------------------------------------------------------------- * checkMemberIdentifierName() * If Scilab target version is lower than 6: * truncates (and displays a warning) too long member identifier names * (applies on members of structs, classes...) * (Scilab 5 identifier names are limited to 24 chars max) * ----------------------------------------------------------------------- */ void checkMemberIdentifierName(Node *node, int char_size_max) { if (targetVersion <= 5) { String *memberName = Getattr(node, "sym:name"); Node *containerNode = parentNode(node); String *containerName = Getattr(containerNode, "sym:name"); int lenContainerName = Len(containerName); int lenMemberName = Len(memberName); if (lenContainerName + lenMemberName + 1 > char_size_max) { int lenScilabMemberName = char_size_max - lenContainerName - 1; if (lenScilabMemberName > 0) { String *scilabMemberName = DohNewStringWithSize(memberName, lenScilabMemberName); Setattr(node, "sym:name", scilabMemberName); Swig_warning(WARN_SCILAB_TRUNCATED_NAME, input_file, line_number, "Wrapping functions names for member '%s.%s' will exceed 24 characters, " "so member name has been truncated to '%s'.\n", containerName, memberName, scilabMemberName); } else { Swig_error(input_file, line_number, "Wrapping functions names for member '%s.%s' will exceed 24 characters, " "please rename the container of member '%s'.\n", containerName, memberName, containerName); } } } } /* ----------------------------------------------------------------------- * addHelperFunctions() * ----------------------------------------------------------------------- */ void addHelperFunctions() { addFunctionToScilab("SWIG_this", "SWIG_this"); addFunctionToScilab("SWIG_ptr", "SWIG_ptr"); } /* ----------------------------------------------------------------------- * addFunctionToScilab() * Declare a wrapped function in Scilab (builder, gateway, XML, ...) * ----------------------------------------------------------------------- */ void addFunctionToScilab(const_String_or_char_ptr scilabFunctionName, const_String_or_char_ptr wrapperFunctionName) { if (!generateBuilder) addFunctionInGatewayHeader(scilabFunctionName, wrapperFunctionName); if (generateBuilder) { addFunctionInScriptTable(scilabFunctionName, wrapperFunctionName, builderCode); } if (createLoader) { addFunctionInLoader(scilabFunctionName); } if (gatewayXMLFile) { Printf(gatewayXML, "\n", gatewayID, primitiveID++, scilabFunctionName); } } /* ----------------------------------------------------------------------- * createBuilderCode() * ----------------------------------------------------------------------- */ void createBuilderFile(String *outputFilename) { String *builderFilename = NewStringf("builder.sce"); builderFile = NewFile(builderFilename, "w", SWIG_output_files()); if (!builderFile) { FileErrorDisplay(builderFilename); SWIG_exit(EXIT_FAILURE); } emitBanner(builderFile); builderFunctionCount = 0; builderCode = NewString(""); Printf(builderCode, "mode(-1);\n"); Printf(builderCode, "lines(0);\n"); /* Useful for automatic tests */ // Scilab needs to be in the build directory Printf(builderCode, "originaldir = pwd();\n"); Printf(builderCode, "builddir = get_absolute_file_path('builder.sce');\n"); Printf(builderCode, "cd(builddir);\n"); Printf(builderCode, "ilib_verbose(%s);\n", verboseBuildLevel); Printf(builderCode, "libs = [];\n"); // Flags from command line arguments Printf(builderCode, "cflags = \"\";\n"); for (int i = 0; i < Len(cflags); i++) { String *cflag = Getitem(cflags, i); Printf(builderCode, "cflags = cflags + \" %s\";\n", cflag); } if (Len(ldflags) > 0) { for (int i = 0; i < Len(ldflags); i++) { String *ldflag = Getitem(ldflags, i); if (i == 0) { Printf(builderCode, "ldflags = \"%s\";\n", ldflag); } else { Printf(builderCode, "ldflags = ldflags + \" %s\";\n", ldflag); } } } else { Printf(builderCode, "ldflags = \"\";\n"); } // External script to set flags if (buildFlagsScript) { Printf(builderCode, "exec(\"%s\");\n", buildFlagsScript); Printf(builderCode, "cflags = cflags + getCompilationFlags();\n"); Printf(builderCode, "ldflags = ldflags + getLinkFlags();\n"); } // Additional sources Insert(sourceFileList, 0, outputFilename); for (int i = 0; i < Len(sourceFileList); i++) { String *sourceFile = Getitem(sourceFileList, i); if (i == 0) { Printf(builderCode, "files = \"%s\";\n", sourceFile); } else { Printf(builderCode, "files($ + 1) = \"%s\";\n", sourceFile); } } Printf(builderCode, "table = ["); } /* ----------------------------------------------------------------------- * addFunctionInBuilderCode() * Add a function wrapper in the function table of generated builder script * ----------------------------------------------------------------------- */ void addFunctionInScriptTable(const_String_or_char_ptr scilabFunctionName, const_String_or_char_ptr wrapperFunctionName, String *scriptCode) { if (++builderFunctionCount % 10 == 0) { Printf(scriptCode, "];\ntable = [table;"); } Printf(scriptCode, "\"%s\",\"%s\";", scilabFunctionName, wrapperFunctionName); } /* ----------------------------------------------------------------------- * saveBuilderFile() * ----------------------------------------------------------------------- */ void saveBuilderFile(String *gatewayName) { Printf(builderCode, "];\n"); Printf(builderCode, "ierr = 0;\n"); Printf(builderCode, "if ~isempty(table) then\n"); Printf(builderCode, " ierr = execstr(\"ilib_build(''%s'', table, files, libs, [], ldflags, cflags);\", 'errcatch');\n", gatewayName); Printf(builderCode, " if ierr <> 0 then\n"); Printf(builderCode, " err_msg = lasterror();\n"); Printf(builderCode, " end\n"); Printf(builderCode, "end\n"); Printf(builderCode, "cd(originaldir);\n"); Printf(builderCode, "if ierr <> 0 then\n"); Printf(builderCode, " error(ierr, err_msg);\n"); Printf(builderCode, "end\n"); Printv(builderFile, builderCode, NIL); Delete(builderFile); } /* ----------------------------------------------------------------------- * createGatewayXMLFile() * This XML file is used by Scilab in the context of internal modules * ----------------------------------------------------------------------- */ void createGatewayXMLFile(String *gatewayName) { String *gatewayXMLFilename = NewStringf("%s_gateway.xml", gatewayName); gatewayXMLFile = NewFile(gatewayXMLFilename, "w", SWIG_output_files()); if (!gatewayXMLFile) { FileErrorDisplay(gatewayXMLFilename); SWIG_exit(EXIT_FAILURE); } // Add a slightly modified SWIG banner to the gateway XML ("--modify" is illegal in XML) gatewayXML = NewString(""); Printf(gatewayXML, "\n"); Printf(gatewayXML, "\n"); Printf(gatewayXML, "\n", gatewayName); primitiveID = 1; } /* ----------------------------------------------------------------------- * saveGatewayXMLFile() * ----------------------------------------------------------------------- */ void saveGatewayXMLFile() { Printf(gatewayXML, "\n"); Printv(gatewayXMLFile, gatewayXML, NIL); Delete(gatewayXMLFile); } /* ----------------------------------------------------------------------- * startGatewayHeader() * Start the gateway header * ----------------------------------------------------------------------- */ void startGatewayHeader(String *gatewayLibraryName) { gatewayHeader = NewString(""); Printf(gatewayHeader, "\n"); gatewayHeaderV6 = NewString(""); Printf(gatewayHeaderV6, "#ifdef __cplusplus\n"); Printf(gatewayHeaderV6, "extern \"C\" {\n"); Printf(gatewayHeaderV6, "#endif\n"); Printf(gatewayHeaderV6, "#include \"c_gateway_prototype.h\"\n"); Printf(gatewayHeaderV6, "#include \"addfunction.h\"\n"); Printf(gatewayHeaderV6, "#ifdef __cplusplus\n"); Printf(gatewayHeaderV6, "}\n"); Printf(gatewayHeaderV6, "#endif\n"); Printf(gatewayHeaderV6, "\n"); Printf(gatewayHeaderV6, "#define MODULE_NAME L\"%s\"\n", gatewayLibraryName); Printf(gatewayHeaderV6, "#ifdef __cplusplus\n"); Printf(gatewayHeaderV6, "extern \"C\"\n"); Printf(gatewayHeaderV6, "#endif\n"); Printf(gatewayHeaderV6, "int %s(wchar_t *pwstFuncName) {\n", gatewayLibraryName); Printf(gatewayHeaderV6, "\n"); } /* ----------------------------------------------------------------------- * addFunctionInGatewayHeader() * Add a function in the gateway header * ----------------------------------------------------------------------- */ void addFunctionInGatewayHeader(const_String_or_char_ptr scilabFunctionName, const_String_or_char_ptr wrapperFunctionName) { if (gatewayHeaderV5 == NULL) { gatewayHeaderV5 = NewString(""); Printf(gatewayHeaderV5, "static GenericTable Tab[] = {\n"); } else Printf(gatewayHeaderV5, ",\n"); Printf(gatewayHeaderV5, " {(Myinterfun)sci_gateway, (GT)%s, (char *)\"%s\"}", wrapperFunctionName, scilabFunctionName); Printf(gatewayHeaderV6, "if (wcscmp(pwstFuncName, L\"%s\") == 0) { addCStackFunction((wchar_t *)L\"%s\", &%s, (wchar_t *)MODULE_NAME); }\n", scilabFunctionName, scilabFunctionName, wrapperFunctionName); } /* ----------------------------------------------------------------------- * terminateGatewayHeader() * Terminates the gateway header * ----------------------------------------------------------------------- */ void terminateGatewayHeader(String *gatewayLibraryName) { Printf(gatewayHeaderV5, "};\n"); Printf(gatewayHeaderV5, "\n"); Printf(gatewayHeaderV5, "#ifdef __cplusplus\n"); Printf(gatewayHeaderV5, "extern \"C\" {\n"); Printf(gatewayHeaderV5, "#endif\n"); Printf(gatewayHeaderV5, "int C2F(%s)() {\n", gatewayLibraryName); Printf(gatewayHeaderV5, " Rhs = Max(0, Rhs);\n"); Printf(gatewayHeaderV5, " if (*(Tab[Fin-1].f) != NULL) {\n"); Printf(gatewayHeaderV5, " if(pvApiCtx == NULL) {\n"); Printf(gatewayHeaderV5, " pvApiCtx = (StrCtx *)MALLOC(sizeof(StrCtx));\n"); Printf(gatewayHeaderV5, " }\n"); Printf(gatewayHeaderV5, " pvApiCtx->pstName = (char *)Tab[Fin-1].name;\n"); Printf(gatewayHeaderV5, " (*(Tab[Fin-1].f))(Tab[Fin-1].name,(GatefuncH)Tab[Fin-1].F);\n"); Printf(gatewayHeaderV5, " }\n"); Printf(gatewayHeaderV5, " return 0;\n"); Printf(gatewayHeaderV5, "}\n"); Printf(gatewayHeaderV5, "\n"); Printf(gatewayHeaderV5, "#ifdef __cplusplus\n"); Printf(gatewayHeaderV5, "}\n"); Printf(gatewayHeaderV5, "#endif\n"); Printf(gatewayHeaderV6, "return 1;\n"); Printf(gatewayHeaderV6, "};\n"); Printf(gatewayHeader, "#if SWIG_SCILAB_VERSION >= 600\n"); Printv(gatewayHeader, gatewayHeaderV6, NIL); Printf(gatewayHeader, "#else\n"); Printv(gatewayHeader, gatewayHeaderV5, NIL); Printf(gatewayHeader, "#endif\n"); } /* ----------------------------------------------------------------------- * createLoaderScriptFile() * Creates the loader script file (loader.sce) * ----------------------------------------------------------------------- */ void createLoaderFile(String *gatewayLibraryName) { String *loaderFilename = NewString("loader.sce"); loaderFile = NewFile(loaderFilename, "w", SWIG_output_files()); if (!loaderFile) { FileErrorDisplay(loaderFilename); SWIG_exit(EXIT_FAILURE); } emitBanner(loaderFile); loaderScript = NewString(""); Printf(loaderScript, "%s_path = get_absolute_file_path('loader.sce');\n", gatewayLibraryName); Printf(loaderScript, "[bOK, ilib] = c_link('%s');\n", gatewayLibraryName); Printf(loaderScript, "if bOK then\n"); Printf(loaderScript, " ulink(ilib);\n"); Printf(loaderScript, "end\n"); Printf(loaderScript, "list_functions = [..\n"); } /* ----------------------------------------------------------------------- * addFunctionInLoaderScript() * Add a function in the loader script table * ----------------------------------------------------------------------- */ void addFunctionInLoader(const_String_or_char_ptr scilabFunctionName) { Printf(loaderScript, " '%s'; ..\n", scilabFunctionName); } /* ----------------------------------------------------------------------- * saveLoaderScriptFile() * Terminates and saves the loader script * ----------------------------------------------------------------------- */ void saveLoaderFile(String *gatewayLibraryName) { Printf(loaderScript, "];\n"); Printf(loaderScript, "addinter(fullfile(%s_path, '%s' + getdynlibext()), '%s', list_functions);\n", gatewayLibraryName, gatewayLibraryName, gatewayLibraryName); Printf(loaderScript, "clear %s_path;\n", gatewayLibraryName); Printf(loaderScript, "clear bOK;\n"); Printf(loaderScript, "clear ilib;\n"); Printf(loaderScript, "clear list_functions;\n"); Printv(loaderFile, loaderScript, NIL); Delete(loaderFile); } }; extern "C" Language *swig_scilab(void) { return new SCILAB(); } swig-4.0.2/Source/Modules/ocaml.cxx0000644000175000017500000017532113667507523017062 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * ocaml.cxx * * Ocaml language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include static const char *usage = "\ Ocaml Options (available with -ocaml)\n\ -oldvarnames - Old intermediary method names for variable wrappers\n\ -prefix - Set a prefix to be prepended to all names\n\ -suffix - Deprecated alias for general option -cppext\n\ -where - Emit library location\n\ \n"; static int classmode = 0; static int in_constructor = 0, in_destructor = 0, in_copyconst = 0; static int const_enum = 0; static int static_member_function = 0; static int generate_sizeof = 0; static String *prefix = 0; static const char *ocaml_path = "ocaml"; static bool old_variable_names = false; static String *classname = 0; static String *module = 0; static String *init_func_def = 0; static String *f_classtemplate = 0; static SwigType *name_qualifier_type = 0; static Hash *seen_enums = 0; static Hash *seen_enumvalues = 0; static Hash *seen_constructors = 0; static File *f_header = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_wrappers = 0; static File *f_directors = 0; static File *f_directors_h = 0; static File *f_init = 0; static File *f_mlout = 0; static File *f_mliout = 0; static File *f_mlbody = 0; static File *f_mlibody = 0; static File *f_mltail = 0; static File *f_mlitail = 0; static File *f_enumtypes_type = 0; static File *f_enumtypes_value = 0; static File *f_class_ctors = 0; static File *f_class_ctors_end = 0; static File *f_enum_to_int = 0; static File *f_int_to_enum = 0; class OCAML:public Language { public: OCAML() { director_prot_ctor_code = NewString(""); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " caml_failwith(\"accessing abstract class or protected constructor\"); \n", "}\n", NIL); director_multiple_inheritance = 1; director_language = 1; } String *Swig_class_name(Node *n) { String *name; name = Copy(Getattr(n, "sym:name")); return name; } void PrintIncludeArg() { Printv(stdout, SWIG_LIB, SWIG_FILE_DELIMITER, ocaml_path, "\n", NIL); } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int i; prefix = 0; SWIG_library_directory(ocaml_path); // Look for certain command line options for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); SWIG_exit(0); } else if (strcmp(argv[i], "-where") == 0) { PrintIncludeArg(); SWIG_exit(0); } else if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-suffix") == 0) { if (argv[i + 1]) { Printf(stderr, "swig: warning: -suffix option deprecated. SWIG 3.0.4 and later provide a -cppext option which should be used instead.\n"); SWIG_config_cppext(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else Swig_arg_error(); } else if (strcmp(argv[i], "-oldvarnames") == 0) { Swig_mark_arg(i); old_variable_names = true; } } } // If a prefix has been specified make sure it ends in a '_' (not actually used!) if (prefix) { const char *px = Char(prefix); if (px[Len(prefix) - 1] != '_') Printf(prefix, "_"); } else prefix = NewString("swig_"); // Add a symbol for this module Preprocessor_define("SWIGOCAML 1", 0); // Set name of typemaps SWIG_typemap_lang("ocaml"); // Read in default typemaps */ SWIG_config_file("ocaml.i"); allow_overloading(); } /* Swig_director_declaration() * * Generate the full director class declaration, complete with base classes. * e.g. "class SwigDirector_myclass : public myclass, public Swig::Director {" * */ String *Swig_director_declaration(Node *n) { String *classname = Swig_class_name(n); String *directorname = NewStringf("SwigDirector_%s", classname); String *base = Getattr(n, "classtype"); String *declaration = Swig_class_declaration(n, directorname); Printf(declaration, " : public %s, public Swig::Director {\n", base); Delete(classname); Delete(directorname); return declaration; } void emitBanner(File *f) { Printf(f, "(* ----------------------------------------------------------------------------\n"); Swig_banner_target_lang(f, " *"); Printf(f, " * ---------------------------------------------------------------------------- *)\n\n"); } /* ------------------------------------------------------------ * top() * * Recognize the %module, and capture the module name. * Create the default enum cases. * Set up the named outputs: * * init * ml * mli * wrapper * header * runtime * directors * directors_h * ------------------------------------------------------------ */ virtual int top(Node *n) { /* Set comparison with none for ConstructorToFunction */ setSubclassInstanceCheck(NewString("caml_list_nth(args,0) != Val_unit")); /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. */ String *mod_docstring = NULL; { Node *module = Getattr(n, "module"); if (module) { Node *options = Getattr(module, "options"); if (options) { if (Getattr(options, "directors")) { allow_directors(); } if (Getattr(options, "dirprot")) { allow_dirprot(); } if (Getattr(options, "sizeof")) { generate_sizeof = 1; } mod_docstring = Getattr(options, "docstring"); } } } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors = NewString(""); f_directors_h = NewString(""); f_enumtypes_type = NewString(""); f_enumtypes_value = NewString(""); init_func_def = NewString(""); f_mlbody = NewString(""); f_mlibody = NewString(""); f_mltail = NewString(""); f_mlitail = NewString(""); f_class_ctors = NewString(""); f_class_ctors_end = NewString(""); f_enum_to_int = NewString(""); f_int_to_enum = NewString(""); f_classtemplate = NewString(""); module = Getattr(n, "name"); seen_constructors = NewHash(); seen_enums = NewHash(); seen_enumvalues = NewHash(); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("init", init_func_def); Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("mli", f_mlibody); Swig_register_filebyname("ml", f_mlbody); Swig_register_filebyname("mlitail", f_mlitail); Swig_register_filebyname("mltail", f_mltail); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); Swig_register_filebyname("classtemplate", f_classtemplate); Swig_register_filebyname("class_ctors", f_class_ctors); if (old_variable_names) { Swig_name_register("set", "%n%v__set__"); Swig_name_register("get", "%n%v__get__"); } Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGOCAML\n#define SWIGOCAML\n#endif\n\n"); Printf(f_runtime, "#define SWIG_MODULE \"%s\"\n", module); /* Module name */ Printf(f_mlbody, "let module_name = \"%s\"\n", module); Printf(f_mlibody, "val module_name : string\n"); Printf(f_enum_to_int, "let enum_to_int x (v : c_obj) =\n" " match v with\n" " C_enum _y ->\n" " (let y = _y in match (x : c_enum_type) with\n" " `unknown -> " " (match y with\n" " `Int x -> (Swig.C_int x)\n" " | _ -> raise (LabelNotFromThisEnum v))\n"); Printf(f_int_to_enum, "let int_to_enum x y =\n" " match (x : c_enum_type) with\n" " `unknown -> C_enum (`Int y)\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } Printf(f_runtime, "\n"); /* Produce the enum_to_int and int_to_enum functions */ Printf(f_enumtypes_type, "open Swig\n" "type c_enum_type = [ \n `unknown\n"); Printf(f_enumtypes_value, "type c_enum_value = [ \n `Int of int\n"); String *mlfile = NewString(""); String *mlifile = NewString(""); Printv(mlfile, module, ".ml", NIL); Printv(mlifile, module, ".mli", NIL); String *mlfilen = NewStringf("%s%s", SWIG_output_directory(), mlfile); if ((f_mlout = NewFile(mlfilen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(mlfilen); SWIG_exit(EXIT_FAILURE); } String *mlifilen = NewStringf("%s%s", SWIG_output_directory(), mlifile); if ((f_mliout = NewFile(mlifilen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(mlifilen); SWIG_exit(EXIT_FAILURE); } emitBanner(f_mlout); emitBanner(f_mliout); Language::top(n); if (mod_docstring) { if (Len(mod_docstring)) { Printv(f_mliout, "(** ", mod_docstring, " *)\n", NIL); } Delete(mod_docstring); mod_docstring = NULL; } Printf(f_enum_to_int, ") | _ -> (C_int (get_int v))\n" "let _ = Callback.register \"%s_enum_to_int\" enum_to_int\n", module); Printf(f_mlibody, "val enum_to_int : c_enum_type -> c_obj -> Swig.c_obj\n"); Printf(f_int_to_enum, "let _ = Callback.register \"%s_int_to_enum\" int_to_enum\n", module); Printf(f_mlibody, "val int_to_enum : c_enum_type -> int -> c_obj\n"); Printf(f_init, "#define SWIG_init f_%s_init\n" "%s" "}\n", module, init_func_def); Printf(f_mlbody, "external f_init : unit -> unit = \"f_%s_init\" ;;\n" "let _ = f_init ()\n", module); Printf(f_enumtypes_type, "]\n"); Printf(f_enumtypes_value, "]\n\n" "type c_obj = c_enum_value c_obj_t\n"); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } SwigType_emit_type_table(f_runtime, f_wrappers); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_directors_h, f_header); Dump(f_header, f_begin); Dump(f_directors, f_wrappers); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); Dump(f_enumtypes_type, f_mlout); Dump(f_enumtypes_value, f_mlout); Dump(f_mlbody, f_mlout); Dump(f_enum_to_int, f_mlout); Dump(f_int_to_enum, f_mlout); Delete(f_int_to_enum); Delete(f_enum_to_int); Dump(f_class_ctors, f_mlout); Dump(f_class_ctors_end, f_mlout); Dump(f_mltail, f_mlout); Delete(f_mlout); Dump(f_enumtypes_type, f_mliout); Dump(f_enumtypes_value, f_mliout); Dump(f_mlibody, f_mliout); Dump(f_mlitail, f_mliout); Delete(f_mliout); return SWIG_OK; } /* Produce an error for the given type */ void throw_unhandled_ocaml_type_error(SwigType *d, const char *types) { Swig_warning(WARN_TYPEMAP_UNDEF, input_file, line_number, "Unable to handle type %s (%s).\n", SwigType_str(d, 0), types); } /* Return true iff T is a pointer type */ int is_a_pointer(SwigType *t) { return SwigType_ispointer(SwigType_typedef_resolve_all(t)); } /* * Delete one reference from a given type. */ void oc_SwigType_del_reference(SwigType *t) { char *c = Char(t); if (strncmp(c, "q(", 2) == 0) { Delete(SwigType_pop(t)); c = Char(t); } if (strncmp(c, "r.", 2)) { printf("Fatal error. SwigType_del_pointer applied to non-pointer.\n"); abort(); } Replace(t, "r.", "", DOH_REPLACE_ANY | DOH_REPLACE_FIRST); } void oc_SwigType_del_array(SwigType *t) { char *c = Char(t); if (strncmp(c, "q(", 2) == 0) { Delete(SwigType_pop(t)); c = Char(t); } if (strncmp(c, "a(", 2) == 0) { Delete(SwigType_pop(t)); } } /* * Return true iff T is a reference type */ int is_a_reference(SwigType *t) { return SwigType_isreference(SwigType_typedef_resolve_all(t)); } int is_an_array(SwigType *t) { return SwigType_isarray(SwigType_typedef_resolve_all(t)); } virtual int membervariableHandler(Node *n) { String *symname = Getattr(n, "sym:name"); Language::membervariableHandler(n); String *mname = Swig_name_member(NSPACE_TODO, classname, symname); String *getname = Swig_name_get(NSPACE_TODO, mname); String *mangled_getname = mangleNameForCaml(getname); Delete(getname); if (!GetFlag(n, "feature:immutable")) { String *setname = Swig_name_set(NSPACE_TODO, mname); String *mangled_setname = mangleNameForCaml(setname); Delete(setname); Printf(f_class_ctors, " \"[%s]\", (fun args -> " "if args = (C_list [ raw_ptr ]) then _%s args else _%s args) ;\n", symname, mangled_getname, mangled_setname); Delete(mangled_setname); } else { Printf(f_class_ctors, " \"[%s]\", (fun args -> " "if args = (C_list [ raw_ptr ]) then _%s args else C_void) ;\n", symname, mangled_getname); } Delete(mangled_getname); Delete(mname); return SWIG_OK; } /* ------------------------------------------------------------ * functionWrapper() * Create a function declaration and register it with the interpreter. * ------------------------------------------------------------ */ virtual int functionWrapper(Node *n) { char *iname = GetChar(n, "sym:name"); SwigType *d = Getattr(n, "type"); String *return_type_normalized = normalizeTemplatedClassName(d); ParmList *l = Getattr(n, "parms"); int director_method = 0; Parm *p; Wrapper *f = NewWrapper(); String *proc_name = NewString(""); String *target = NewString(""); String *arg = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *build = NewString(""); String *tm; int i = 0; int numargs; int numreq; int newobj = GetFlag(n, "feature:new"); String *nodeType = Getattr(n, "nodeType"); int destructor = (!Cmp(nodeType, "destructor")); String *overname = 0; bool isOverloaded = Getattr(n, "sym:overloaded") ? true : false; // For overloaded functions, only the dispatch function needs to be exposed in the ml and mli files. bool expose_func = !isOverloaded || !Getattr(n, "sym:nextSibling"); // Make a wrapper name for this String *wname = Swig_name_wrapper(iname); if (isOverloaded) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) { DelWrapper(f); return SWIG_ERROR; } } if (overname) { Append(wname, overname); } /* Do this to disambiguate functions emitted from different modules */ Append(wname, module); Setattr(n, "wrap:name", wname); // Build the name for Scheme. Printv(proc_name, "_", iname, NIL); String *mangled_name = mangleNameForCaml(proc_name); if (classmode && in_constructor && expose_func) { // Emit constructor for object String *mangled_name_nounder = NewString((char *) (Char(mangled_name)) + 1); Printf(f_class_ctors_end, "let %s clst = _%s clst\n", mangled_name_nounder, mangled_name_nounder); Printf(f_mlibody, "val %s : c_obj -> c_obj\n", mangled_name_nounder); Delete(mangled_name_nounder); } else if (classmode && in_destructor) { Printf(f_class_ctors, " \"~\", %s ;\n", mangled_name); } else if (classmode && !in_constructor && !in_destructor && !static_member_function && !Getattr(n, "membervariableHandler:sym:name") && expose_func) { String *opname = Copy(Getattr(n, "memberfunctionHandler:sym:name")); Replaceall(opname, "operator ", ""); Printf(f_class_ctors, " \"%s\", %s ;\n", opname, mangled_name); Delete(opname); } if (classmode && in_constructor) { Setattr(seen_constructors, mangled_name, "true"); } // writing the function wrapper function Printv(f->def, "SWIGEXT CAML_VALUE ", wname, " (", NIL); Printv(f->def, "CAML_VALUE args", NIL); Printv(f->def, ")\n{", NIL); /* Define the scheme name in C. This define is used by several macros. */ //Printv(f->def, "#define FUNC_NAME \"", mangled_name, "\"", NIL); // adds local variables Wrapper_add_local(f, "args", "CAMLparam1(args)"); Wrapper_add_local(f, "ret", "SWIG_CAMLlocal2(swig_result,rv)"); d = SwigType_typedef_qualified(d); emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); numargs = emit_num_arguments(l); numreq = emit_num_required(l); if (!isOverloaded) { if (numargs > 0) { if (numreq > 0) { Printf(f->code, "if (caml_list_length(args) < %d || caml_list_length(args) > %d) {\n", numreq, numargs); } else { Printf(f->code, "if (caml_list_length(args) > %d) {\n", numargs); } Printf(f->code, "caml_invalid_argument(\"Incorrect number of arguments passed to '%s'\");\n}\n", iname); } else { Printf(f->code, "if (caml_list_length(args) > 0) caml_invalid_argument(\"'%s' takes no arguments\");\n", iname); } } Printf(f->code, "swig_result = Val_unit;\n"); // Now write code to extract the parameters (this is super ugly) for (i = 0, p = l; i < numargs; i++) { /* Skip ignored arguments */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); pt = SwigType_typedef_qualified(pt); // Produce names of source and target Clear(target); Clear(arg); String *source = NewStringf("caml_list_nth(args,%d)", i); Printf(target, "%s", ln); Printv(arg, Getattr(p, "name"), NIL); if (i >= numreq) { Printf(f->code, "if (caml_list_length(args) > %d) {\n", i); } // Handle parameter types. if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", target); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:in:next"); } else { // no typemap found // check if typedef and resolve throw_unhandled_ocaml_type_error(pt, "in"); p = nextSibling(p); } if (i >= numreq) { Printf(f->code, "}\n"); } Delete(source); } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } // Pass output arguments back to the caller. for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "emit:input")); /* Deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* Deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Replaceall(tm, "$ntype", normalizeTemplatedClassName(Getattr(p, "type"))); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Free up any memory allocated for the arguments. /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* if the object is a director, and the method call originated from its * underlying ocaml object, resolve the call by going up the c++ * inheritance chain. otherwise try to resolve the method in ocaml. * without this check an infinite loop is set up between the director and * shadow class method calls. */ // NOTE: this code should only be inserted if this class is the // base class of a director class. however, in general we haven't // yet analyzed all classes derived from this one to see if they are // directors. furthermore, this class may be used as the base of // a director class defined in a completely different module at a // later time, so this test must be included whether or not directorbase // is true. we do skip this code if directors have not been enabled // at the command line to preserve source-level compatibility with // non-polymorphic swig. also, if this wrapper is for a smart-pointer // method, there is no need to perform the test since the calling object // (the smart-pointer) and the director object (the "pointee") are // distinct. director_method = is_member_director(n) && !is_smart_pointer() && !destructor; if (director_method) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Printf(f->code, "director = dynamic_cast(arg1);\n"); Wrapper_add_local(f, "upcall", "bool upcall = false"); Append(f->code, "upcall = (director);\n"); } // Now write code to make the function call Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", "swig_result"); Replaceall(tm, "$target", "rv"); Replaceall(tm, "$result", "rv"); Replaceall(tm, "$ntype", return_type_normalized); Printv(f->code, tm, "\n", NIL); } else { throw_unhandled_ocaml_type_error(d, "out"); } emit_return_variable(n, d, f); // Dump the argument output code Printv(f->code, Char(outarg), NIL); // Dump the argument cleanup code Printv(f->code, Char(cleanup), NIL); // Look for any remaining cleanup if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", "swig_result"); Printv(f->code, tm, "\n", NIL); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } // Free any memory allocated by the function being wrapped.. if ((tm = Swig_typemap_lookup("swig_result", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } // Wrap things up (in a manner of speaking) Printv(f->code, tab4, "swig_result = caml_list_append(swig_result,rv);\n", NIL); Printv(f->code, tab4, "CAMLreturn(swig_result);\n", NIL); Printv(f->code, "}\n", NIL); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Wrapper_print(f, f_wrappers); if (isOverloaded) { if (!Getattr(n, "sym:nextSibling")) { int maxargs; Wrapper *df = NewWrapper(); String *dispatch = Swig_overload_dispatch(n, "free(argv);\n" "CAMLreturn(%s(args));\n", &maxargs); Wrapper_add_local(df, "argv", "CAML_VALUE *argv"); /* Undifferentiate name .. this is the dispatch function */ wname = Swig_name_wrapper(iname); /* Do this to disambiguate functions emitted from different * modules */ Append(wname, module); Printv(df->def, "SWIGEXT CAML_VALUE ", wname, "(CAML_VALUE args) {\n" " CAMLparam1(args);\n" " int i;\n" " int argc = caml_list_length(args);\n", NIL); Printv(df->code, "argv = (CAML_VALUE *)malloc( argc * sizeof( CAML_VALUE ) );\n" "for( i = 0; i < argc; i++ ) {\n" " argv[i] = caml_list_nth(args,i);\n" "}\n", NIL); Printv(df->code, dispatch, "\nfree(argv);\n", NIL); Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); String *protoTypes = NewString(""); do { String *fulldecl = Swig_name_decl(sibl); Printf(protoTypes, "\n\" %s\\n\"", fulldecl); Delete(fulldecl); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Printf(df->code, "caml_failwith(\"Wrong number or type of arguments for overloaded function '%s'.\\n\"" "\n\" Possible C/C++ prototypes are:\\n\"%s);\n", iname, protoTypes); Delete(protoTypes); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); DelWrapper(df); Delete(dispatch); } } if (expose_func) { Printf(f_mlbody, "external %s_f : c_obj list -> c_obj list = \"%s\" ;;\n", mangled_name, wname); Printf(f_mlbody, "let %s arg = match %s_f (%s(fnhelper arg)) with\n", mangled_name, mangled_name, in_constructor && Swig_directorclass(getCurrentClass()) ? "director_core_helper " : ""); Printf(f_mlbody, " [] -> C_void\n" "| [x] -> (if %s then Gc.finalise \n" " (fun x -> ignore ((invoke x) \"~\" C_void)) x) ; x\n" "| lst -> C_list lst ;;\n", newobj ? "true" : "false"); } if ((!classmode || in_constructor || in_destructor || static_member_function) && expose_func) Printf(f_mlibody, "val %s : c_obj -> c_obj\n", mangled_name); Delete(proc_name); Delete(target); Delete(arg); Delete(outarg); Delete(cleanup); Delete(build); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * * Create a link to a C variable. * This creates a single function _wrap_varname(). * This function takes a single optional argument. If supplied, it means * we are setting this variable to some value. If omitted, it means we are * simply evaluating this variable. We return the value of the variable * in both cases. * * symname is the name of the variable with respect to C. This * may need to differ from the original name in the case of enums. * enumvname is the name of the variable with respect to ocaml. This * will vary if the variable has been renamed. * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { char *name = GetChar(n, "feature:symname"); String *iname = Getattr(n, "feature:enumvname"); String *mname = mangleNameForCaml(iname); SwigType *t = Getattr(n, "type"); String *proc_name = NewString(""); String *tm; Wrapper *f; if (!name) { name = GetChar(n, "name"); } if (!iname) { iname = Getattr(n, "sym:name"); mname = mangleNameForCaml(NewString(iname)); } if (!iname || !addSymbol(iname, n)) return SWIG_ERROR; f = NewWrapper(); // evaluation function names String *var_name = Swig_name_wrapper(iname); // Build the name for OCaml. Printv(proc_name, iname, NIL); Setattr(n, "wrap:name", proc_name); Printf(f->def, "SWIGEXT CAML_VALUE %s(CAML_VALUE args) {\n", var_name); // Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); Wrapper_add_local(f, "args", "CAMLparam1(args)"); Wrapper_add_local(f, "swig_result", "SWIG_CAMLlocal1(swig_result)"); Printf(f->code, "swig_result = Val_unit;\n"); if (!GetFlag(n, "feature:immutable")) { /* Check for a setting of the variable value */ Printf(f->code, "if (args != Val_int(0)) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "args"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "args"); emit_action_code(n, f->code, tm); } else if ((tm = Swig_typemap_lookup("in", n, name, 0))) { Replaceall(tm, "$source", "args"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "args"); emit_action_code(n, f->code, tm); } else { throw_unhandled_ocaml_type_error(t, "varin/in"); } Printf(f->code, "}\n"); } // Now return the value of the variable (regardless // of evaluating or setting) if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "swig_result"); Replaceall(tm, "$result", "swig_result"); emit_action_code(n, f->code, tm); } else if ((tm = Swig_typemap_lookup("out", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "swig_result"); Replaceall(tm, "$result", "swig_result"); emit_action_code(n, f->code, tm); } else { throw_unhandled_ocaml_type_error(t, "varout/out"); } Printf(f->code, "\nCAMLreturn(swig_result);\n"); Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); // Now add symbol to the Ocaml interpreter if (GetFlag(n, "feature:immutable")) { Printf(f_mlbody, "external _%s : c_obj -> Swig.c_obj = \"%s\" \n", mname, var_name); Printf(f_mlibody, "val _%s : c_obj -> Swig.c_obj\n", iname); if (const_enum) { Printf(f_enum_to_int, " | `%s -> _%s C_void\n", mname, mname); Printf(f_int_to_enum, " if y = (get_int (_%s C_void)) then `%s else\n", mname, mname); } } else { Printf(f_mlbody, "external _%s : c_obj -> c_obj = \"%s\"\n", mname, var_name); Printf(f_mlibody, "external _%s : c_obj -> c_obj = \"%s\"\n", mname, var_name); } Delete(var_name); Delete(proc_name); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * staticmemberfunctionHandler -- * Overridden to set static_member_function * ------------------------------------------------------------ */ virtual int staticmemberfunctionHandler(Node *n) { static_member_function = 1; Language::staticmemberfunctionHandler(n); static_member_function = 0; return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * * The one trick here is that we have to make sure we rename the * constant to something useful that doesn't collide with the * original if any exists. * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *name = Getattr(n, "feature:symname"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); SwigType *qname = Getattr(n, "qualified:name"); if (qname) value = qname; if (!name) { name = mangleNameForCaml(Getattr(n, "name")); Insert(name, 0, "_swig_wrap_"); Setattr(n, "feature:symname", name); } // See if there's a typemap // Create variable and assign it a value Printf(f_header, "static %s = %s;\n", SwigType_str(type, name), value); SetFlag(n, "feature:immutable"); variableWrapper(n); return SWIG_OK; } int constructorHandler(Node *n) { int ret; in_constructor = 1; ret = Language::constructorHandler(n); in_constructor = 0; return ret; } /* destructorHandler: * Turn on destructor flag to inform decisions in functionWrapper */ int destructorHandler(Node *n) { int ret; in_destructor = 1; ret = Language::destructorHandler(n); in_destructor = 0; return ret; } /* copyconstructorHandler: * Turn on constructor and copyconstructor flags for functionWrapper */ int copyconstructorHandler(Node *n) { int ret; in_copyconst = 1; in_constructor = 1; ret = Language::copyconstructorHandler(n); in_constructor = 0; in_copyconst = 0; return ret; } /** * A simple, somewhat general purpose function for writing to multiple * streams from a source template. This allows the user to define the * class definition in ways different from the one I have here if they * want to. It will also make the class definition system easier to * fiddle with when I want to change methods, etc. */ void Multiwrite(String *s) { char *find_marker = strstr(Char(s), "(*Stream:"); while (find_marker) { char *next = strstr(find_marker, "*)"); find_marker += strlen("(*Stream:"); if (next) { int num_chars = (int)(next - find_marker); String *stream_name = NewString(find_marker); Delslice(stream_name, num_chars, Len(stream_name)); File *fout = Swig_filebyname(stream_name); if (fout) { next += strlen("*)"); char *following = strstr(next, "(*Stream:"); find_marker = following; if (!following) following = next + strlen(next); String *chunk = NewString(next); Delslice(chunk, (int)(following - next), Len(chunk)); Printv(fout, chunk, NIL); } } } } bool isSimpleType(String *name) { char *ch = Char(name); return !(strchr(ch, '(') || strchr(ch, '<') || strchr(ch, ')') || strchr(ch, '>')); } /* We accept all chars in identifiers because we use strings to index * them. */ int validIdentifier(String *name) { return Len(name) > 0 ? 1 : 0; } /* classHandler * * Create a "class" definition for ocaml. I thought quite a bit about * how I should do this part of it, and arrived here, using a function * invocation to select a method, and dispatch. This can obviously be * done better, but I can't see how, given that I want to support * overloaded methods, out parameters, and operators. * * I needed a system that would do this: * * a Be able to call these methods: * int foo( int x ); * float foo( int x, int &out ); * * b Be typeable, even in the presence of mutually dependent classes. * * c Support some form of operator invocation. * * (c) I chose strings for the method names so that "+=" would be a * valid method name, and the somewhat natural << (invoke x) "+=" y >> * would work. * * (a) (b) Since the c_obj type exists, it's easy to return C_int in one * case and C_list [ C_float ; C_int ] in the other. This makes tricky * problems with out parameters disappear; they're simply appended to the * return list. * * (b) Since every item that comes from C++ is the same type, there is no * problem with the following: * * class Foo; * class Bar { Foo *toFoo(); } * class Foo { Bar *toBar(); } * * Since the Objective caml types of Foo and Bar are the same. Now that * I correctly incorporate SWIG's typechecking, this isn't a big deal. * * The class is in the form of a function returning a c_obj. The c_obj * is a C_obj containing a function which invokes a method on the * underlying object given its type. * * The name emitted here is normalized before being sent to * Callback.register, because we need this string to look up properly * when the typemap passes the descriptor string. I've been considering * some, possibly more forgiving method that would do some transformations * on the $descriptor in order to find a potential match. This is for * later. * * Important things to note: * * We rely on exception handling (BadMethodName) in order to call an * ancestor. This can be improved. * * The method used to get :classof could be improved to look at the type * info that the base pointer contains. It's really an error to have a * SWIG-generated object that does not contain type info, since the * existence of the object means that SWIG knows the type. * * :parents could use :classof to tell what class it is and make a better * decision. This could be nice, (i.e. provide a run-time graph of C++ * classes represented);. * * I can't think of a more elegant way of converting a C_obj fun to a * pointer than "operator &"... * * Added a 'sizeof' that will allow you to do the expected thing. * This should help users to fill buffer structs and the like (as is * typical in windows-styled code). It's only enabled if you give * %feature(sizeof) and then, only for simple types. * * Overall, carrying the list of methods and base classes has worked well. * It allows me to give the Ocaml user introspection over their objects. */ int classHandler(Node *n) { String *name = Getattr(n, "name"); classname = Getattr(n, "sym:name"); if (!name) return SWIG_OK; String *mangled_name = mangleNameForCaml(name); String *this_class_def = NewString(f_classtemplate); String *name_normalized = normalizeTemplatedClassName(name); String *old_class_ctors = f_class_ctors; String *base_classes = NewString(""); f_class_ctors = NewString(""); bool sizeof_feature = generate_sizeof && isSimpleType(name); classmode = true; int rv = Language::classHandler(n); classmode = false; if (sizeof_feature) { Printf(f_wrappers, "SWIGEXT CAML_VALUE _wrap_%s_sizeof( CAML_VALUE args ) {\n" " CAMLparam1(args);\n" " CAMLreturn(Val_int(sizeof(%s)));\n" "}\n", mangled_name, name_normalized); Printf(f_mlbody, "external __%s_sizeof : unit -> int = " "\"_wrap_%s_sizeof\"\n", mangled_name, mangled_name); } /* Insert sizeof operator for concrete classes */ if (sizeof_feature) { Printv(f_class_ctors, "\"sizeof\" , (fun args -> C_int (__", mangled_name, "_sizeof ())) ;\n", NIL); } /* Handle up-casts in a nice way */ List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "name"); if (bname) { String *base_create = NewString(""); Printv(base_create, "(create_class \"", bname, "\")", NIL); Printv(f_class_ctors, " \"::", bname, "\", (fun args -> ", base_create, " args) ;\n", NIL); Printv(base_classes, base_create, " ;\n", NIL); } b = Next(b); } } Replaceall(this_class_def, "$classname", mangled_name); Replaceall(this_class_def, "$normalized", name_normalized); Replaceall(this_class_def, "$realname", name); Replaceall(this_class_def, "$baselist", base_classes); Replaceall(this_class_def, "$classbody", f_class_ctors); Delete(f_class_ctors); f_class_ctors = old_class_ctors; // Actually write out the class definition Multiwrite(this_class_def); Setattr(n, "ocaml:ctor", mangled_name); return rv; } String *normalizeTemplatedClassName(String *name) { String *name_normalized = SwigType_typedef_resolve_all(name); bool took_action; do { took_action = false; if (is_a_pointer(name_normalized)) { SwigType_del_pointer(name_normalized); took_action = true; } if (is_a_reference(name_normalized)) { oc_SwigType_del_reference(name_normalized); took_action = true; } if (is_an_array(name_normalized)) { oc_SwigType_del_array(name_normalized); took_action = true; } } while (took_action); return SwigType_str(name_normalized, 0); } /* * Produce the symbol name that ocaml will use when referring to the * target item. I wonder if there's a better way to do this: * * I shudder to think about doing it with a hash lookup, but that would * make a couple of things easier: */ String *mangleNameForCaml(String *s) { String *out = Copy(s); Replaceall(out, " ", "_xx"); Replaceall(out, "::", "_xx"); Replaceall(out, ",", "_x"); Replaceall(out, "+", "_xx_plus"); Replaceall(out, "-", "_xx_minus"); Replaceall(out, "<", "_xx_ldbrace"); Replaceall(out, ">", "_xx_rdbrace"); Replaceall(out, "!", "_xx_not"); Replaceall(out, "%", "_xx_mod"); Replaceall(out, "^", "_xx_xor"); Replaceall(out, "*", "_xx_star"); Replaceall(out, "&", "_xx_amp"); Replaceall(out, "|", "_xx_or"); Replaceall(out, "(", "_xx_lparen"); Replaceall(out, ")", "_xx_rparen"); Replaceall(out, "[", "_xx_lbrace"); Replaceall(out, "]", "_xx_rbrace"); Replaceall(out, "~", "_xx_bnot"); Replaceall(out, "=", "_xx_equals"); Replaceall(out, "/", "_xx_slash"); Replaceall(out, ".", "_xx_dot"); return out; } SwigType *fully_qualified_enum_type(Node *n) { Node *parent = 0; String *fully_qualified_name = NewString(""); String *parent_type = 0; parent = parentNode(n); while (parent) { parent_type = nodeType(parent); if (Getattr(parent, "name")) { String *parent_copy = NewStringf("%s::", Getattr(parent, "name")); if (Cmp(parent_type, "class") == 0 || Cmp(parent_type, "namespace") == 0) Insert(fully_qualified_name, 0, parent_copy); Delete(parent_copy); } if (!Cmp(parent_type, "class")) break; parent = parentNode(parent); } return fully_qualified_name; } /* Benedikt Grundmann inspired --> Enum wrap styles */ int enumvalueDeclaration(Node *n) { String *name = Getattr(n, "name"); SwigType *qtype = 0; if (name_qualifier_type) { qtype = Copy(name_qualifier_type); Printv(qtype, name, NIL); } if (const_enum && qtype && name && !Getattr(seen_enumvalues, name)) { Setattr(seen_enumvalues, name, "true"); SetFlag(n, "feature:immutable"); Setattr(n, "feature:enumvalue", "1"); // this does not appear to be used Setattr(n, "qualified:name", SwigType_namestr(qtype)); String *evname = SwigType_manglestr(qtype); Insert(evname, 0, "SWIG_ENUM_"); Setattr(n, "feature:enumvname", name); Setattr(n, "feature:symname", evname); Delete(evname); Printf(f_enumtypes_value, "| `%s\n", name); return Language::enumvalueDeclaration(n); } else return SWIG_OK; } /* ------------------------------------------------------------------- * This function is a bit uglier than it deserves. * * I used to direct lookup the name of the enum. Now that certain fixes * have been made in other places, the names of enums are now fully * qualified, which is a good thing, overall, but requires me to do * some legwork. * * The other thing that uglifies this function is the varying way that * typedef enum and enum are handled. I need to produce consistent names, * which means looking up and registering by typedef and enum name. */ int enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *name = Getattr(n, "name"); if (name) { String *oname = NewString(name); /* name is now fully qualified */ String *fully_qualified_name = NewString(name); bool seen_enum = false; if (name_qualifier_type) Delete(name_qualifier_type); char *strip_position; name_qualifier_type = fully_qualified_enum_type(n); strip_position = strstr(Char(oname), "::"); while (strip_position) { strip_position += 2; oname = NewString(strip_position); strip_position = strstr(Char(oname), "::"); } seen_enum = (Getattr(seen_enums, fully_qualified_name) ? true : false); if (!seen_enum) { const_enum = true; Printf(f_enum_to_int, "| `%s -> (match y with\n", oname); Printf(f_int_to_enum, "| `%s -> C_enum (\n", oname); /* * * * A note about enum name resolution * * * * * This code should now work, but I think we can do a bit better. * The problem I'm having is that swig isn't very precise about * typedef name resolution. My opinion is that SwigType_typedef * resolve_all should *always* return the enum tag if one exists, * rather than the admittedly friendlier enclosing typedef. * * This would make one of the cases below unnecessary. * * * */ Printf(f_mlbody, "let _ = Callback.register \"%s_marker\" (`%s)\n", fully_qualified_name, oname); if (!strncmp(Char(fully_qualified_name), "enum ", 5)) { String *fq_noenum = NewString(Char(fully_qualified_name) + 5); Printf(f_mlbody, "let _ = Callback.register \"%s_marker\" (`%s)\n" "let _ = Callback.register \"%s_marker\" (`%s)\n", fq_noenum, oname, fq_noenum, name); } Printf(f_enumtypes_type, "| `%s\n", oname); Insert(fully_qualified_name, 0, "enum "); Setattr(seen_enums, fully_qualified_name, n); } } int ret = Language::enumDeclaration(n); if (const_enum) { Printf(f_int_to_enum, "`Int y)\n"); Printf(f_enum_to_int, "| `Int x -> Swig.C_int x\n" "| _ -> raise (LabelNotFromThisEnum v))\n"); } const_enum = false; return ret; } /* ---------------------------------------------------------------------------- * BEGIN C++ Director Class modifications * ------------------------------------------------------------------------- */ /* * Modified polymorphism code for Ocaml language module. * * TODO * * Move some boilerplate code generation to Swig_...() functions. * */ /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying Python object. * * --------------------------------------------------------------- */ int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); String *decl = Getattr(n, "decl"); String *returntype = Getattr(n, "type"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); int status = SWIG_OK; int idx; bool pure_virtual = false; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } Printf(w->locals, "CAMLparam0();\n"); /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (ignored_method) { if (!pure_virtual) { String *super_call = Swig_method_call(super, l); if (is_void) Printf(w->code, "%s;\n", super_call); else Printf(w->code, "CAMLreturn_type(%s);\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { Wrapper_add_local(w, "swig_result", "SWIG_CAMLlocal2(swig_result, args)"); /* attach typemaps to arguments (C/C++ -> Ocaml) */ String *arglist = NewString(""); Swig_director_parms_fixup(l); Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("directorargout", l, w); Parm *p; int num_arguments = emit_num_arguments(l); int i; char source[256]; int outputs = 0; if (!is_void) outputs++; /* build argument list and type conversion string */ for (i = 0, idx = 0, p = l; i < num_arguments; i++) { while (Getattr(p, "tmap:ignore")) { p = Getattr(p, "tmap:ignore:next"); } if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); Putc(',', arglist); if ((tm = Getattr(p, "tmap:directorin")) != 0) { Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); if (Len(tm) == 0) Append(tm, pname); Printv(wrap_args, tm, "\n", NIL); p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { /* special handling for pointers to other C++ director classes. * ideally this would be left to a typemap, but there is currently no * way to selectively apply the dynamic_cast<> to classes that have * directors. in other words, the type "SwigDirector_$1_lname" only exists * for classes with directors. we avoid the problem here by checking * module.wrap::directormap, but it's not clear how to get a typemap to * do something similar. perhaps a new default typemap (in addition * to SWIGTYPE) called DIRECTORTYPE? */ if (SwigType_ispointer(ptype) || SwigType_isreference(ptype)) { Node *module = Getattr(parent, "module"); Node *target = Swig_directormap(module, ptype); sprintf(source, "obj%d", idx++); String *nonconst = 0; /* strip pointer/reference --- should move to Swig/stype.c */ String *nptype = NewString(Char(ptype) + 2); /* name as pointer */ String *ppname = Copy(pname); if (SwigType_isreference(ptype)) { Insert(ppname, 0, "&"); } /* if necessary, cast away const since Python doesn't support it! */ if (SwigType_isconst(nptype)) { nonconst = NewStringf("nc_tmp_%s", pname); String *nonconst_i = NewStringf("= const_cast< %s >(%s)", SwigType_lstr(ptype, 0), ppname); Wrapper_add_localv(w, nonconst, SwigType_lstr(ptype, 0), nonconst, nonconst_i, NIL); Delete(nonconst_i); Swig_warning(WARN_LANG_DISCARD_CONST, input_file, line_number, "Target language argument '%s' discards const in director method %s::%s.\n", SwigType_str(ptype, pname), SwigType_namestr(c_classname), SwigType_namestr(name)); } else { nonconst = Copy(ppname); } Delete(nptype); Delete(ppname); String *mangle = SwigType_manglestr(ptype); if (target) { String *director = NewStringf("director_%s", mangle); Wrapper_add_localv(w, director, "Swig::Director *", director, "= 0", NIL); Wrapper_add_localv(w, source, "CAML_VALUE", source, "= Val_unit", NIL); Printf(wrap_args, "%s = dynamic_cast(%s);\n", director, nonconst); Printf(wrap_args, "if (!%s) {\n", director); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Printf(wrap_args, "} else {\n"); Printf(wrap_args, "%s = %s->swig_get_self();\n", source, director); Printf(wrap_args, "}\n"); Delete(director); Printv(arglist, source, NIL); } else { Wrapper_add_localv(w, source, "CAML_VALUE", source, "= Val_unit", NIL); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); //Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE_p_%s, 0);\n", // source, nonconst, base); Printv(arglist, source, NIL); } Delete(mangle); Delete(nonconst); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } } p = nextSibling(p); } Printv(w->code, "swig_result = Val_unit;\n", 0); Printf(w->code, "args = Val_unit;\n"); /* wrap complex arguments to values */ Printv(w->code, wrap_args, NIL); /* pass the method call on to the OCaml object */ Printv(w->code, "swig_result = caml_swig_alloc(1,C_list);\n" "SWIG_Store_field(swig_result,0,args);\n" "args = swig_result;\n" "swig_result = Val_unit;\n", 0); Printf(w->code, "static const CAML_VALUE *swig_ocaml_func_val = NULL;\n" "if (!swig_ocaml_func_val) {\n"); Printf(w->code, " swig_ocaml_func_val = caml_named_value(\"swig_runmethod\");\n }\n"); Printf(w->code, "swig_result = caml_callback3(*swig_ocaml_func_val,swig_get_self(),caml_copy_string(\"%s\"),args);\n", Getattr(n, "name")); /* exception handling */ tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); } if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { Printf(w->code, "if (!%s) {\n", Swig_cresult_name()); Printf(w->code, " CAML_VALUE error = *caml_named_value(\"director_except\");\n"); Replaceall(tm, "$error", "error"); Printv(w->code, Str(tm), "\n", NIL); Printf(w->code, "}\n"); } /* * Python method may return a simple object, or a tuple. * for in/out arguments, we have to extract the appropriate values from the * argument list, then marshal everything back to C/C++ (return value and * output arguments). */ /* marshal return value and other outputs (if any) from value to C/C++ * type */ String *cleanup = NewString(""); String *outarg = NewString(""); tm = Swig_typemap_lookup("directorout", n, "c_result", w); if (tm != 0) { Replaceall(tm, "$input", "swig_result"); /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); } /* marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { Replaceall(tm, "$result", "swig_result"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(arglist); Delete(cleanup); Delete(outarg); } /* any existing helper functions to handle this? */ if (!is_void) { if (!(ignored_method && !pure_virtual)) { /* A little explanation: * The director_enum test case makes a method whose return type * is an enum type. returntype here is "int". gcc complains * about an implicit enum conversion, and although i don't strictly * agree with it, I'm working on fixing the error: * * Below is what I came up with. It's not great but it should * always essentially work. */ if (!SwigType_isreference(returntype)) { Printf(w->code, "CAMLreturn_type((%s)c_result);\n", SwigType_lstr(returntype, "")); } else { Printf(w->code, "CAMLreturn_type(*c_result);\n"); } } } else { Printf(w->code, "CAMLreturn0;\n"); } Printf(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p, *q; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("CAML_VALUE"); p = NewParm(type, NewString("self"), n); q = Copy(p); set_nextSibling(q, superparms); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) { }", classname, target, call); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Setattr(n, "parms", q); Language::classDirectorConstructor(n); Delete(sub); Delete(classname); Delete(supername); //Delete(parms); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ int classDirectorDefaultConstructor(Node *n) { String *classname; classname = Swig_class_name(n); /* insert self parameter */ Parm *p, *q; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("CAML_VALUE"); p = NewParm(type, NewString("self"), n); q = Copy(p); set_nextSibling(p, parms); { Wrapper *w = NewWrapper(); Printf(w->def, "SwigDirector_%s::SwigDirector_%s(CAML_VALUE self) : Swig::Director(self) { }", classname, classname); Wrapper_print(w, f_directors); DelWrapper(w); } Printf(f_directors_h, " SwigDirector_%s(CAML_VALUE self);\n", classname); Delete(classname); Setattr(n, "parms", q); return Language::classDirectorDefaultConstructor(n); } int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n" "%s\n" "public:\n", declaration); Delete(declaration); return Language::classDirectorInit(n); } int classDirectorEnd(Node *n) { Printf(f_directors_h, "};\n\n"); return Language::classDirectorEnd(n); } /* --------------------------------------------------------------------- * typedefHandler * * This is here in order to maintain the correct association between * typedef names and enum names. * * Since I implement enums as polymorphic variant tags, I need to call * back into ocaml to evaluate them. This requires a string that can * be generated in the typemaps, and also at SWIG time to be the same * string. The problem that arises is that SWIG variously generates * enum e_name_tag * e_name_tag * e_typedef_name * for * typedef enum e_name_tag { ... } e_typedef_name; * * Since I need these strings to be consistent, I must maintain a correct * association list between typedef and enum names. * --------------------------------------------------------------------- */ int typedefHandler(Node *n) { String *type = Getattr(n, "type"); Node *enum_node = type ? Getattr(seen_enums, type) : 0; if (enum_node) { String *name = Getattr(enum_node, "name"); Printf(f_mlbody, "let _ = Callback.register \"%s_marker\" (`%s)\n", Getattr(n, "name"), name); } return SWIG_OK; } String *runtimeCode() { String *s = Swig_include_sys("ocamlrun.swg"); if (!s) { Printf(stderr, "*** Unable to open 'ocamlrun.swg'\n"); s = NewString(""); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigocamlrun.h"); } }; /* ------------------------------------------------------------------------- * swig_ocaml() - Instantiate module * ------------------------------------------------------------------------- */ static Language *new_swig_ocaml() { return new OCAML(); } extern "C" Language *swig_ocaml(void) { return new_swig_ocaml(); } swig-4.0.2/Source/Modules/tcl8.cxx0000644000175000017500000012101713667507523016632 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * tcl8.cxx * * Tcl8 language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" static const char *usage = "\ Tcl 8 Options (available with -tcl8)\n\ -itcl - Enable ITcl support\n\ -nosafe - Leave out SafeInit module function.\n\ -prefix - Set a prefix to be prepended to all names\n\ -namespace - Build module into a Tcl 8 namespace\n\ -pkgversion - Set package version\n\n"; static String *cmd_tab = 0; /* Table of command names */ static String *var_tab = 0; /* Table of global variables */ static String *const_tab = 0; /* Constant table */ static String *methods_tab = 0; /* Methods table */ static String *attr_tab = 0; /* Attribute table */ static String *prefix = 0; static String *module = 0; static int namespace_option = 0; static String *init_name = 0; static String *ns_name = 0; static int have_constructor; static String *constructor_name; static int have_destructor; static int have_base_classes; static String *destructor_action = 0; static String *version = (String *) "0.0"; static String *class_name = 0; static int have_attributes; static int have_methods; static int nosafe = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_init = 0; static File *f_begin = 0; static File *f_runtime = 0; // Itcl support static int itcl = 0; static File *f_shadow = 0; static File *f_shadow_stubs = 0; static String *constructor = 0; static String *destructor = 0; static String *base_classes = 0; static String *base_class_init = 0; static String *methods = 0; static String *imethods = 0; static String *attributes = 0; static String *attribute_traces = 0; static String *iattribute_traces = 0; class TCL8:public Language { public: /* ------------------------------------------------------------ * TCL8::main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("tcl"); for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else Swig_arg_error(); } else if (strcmp(argv[i], "-pkgversion") == 0) { if (argv[i + 1]) { version = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } } else if (strcmp(argv[i], "-namespace") == 0) { namespace_option = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-itcl") == 0) { itcl = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nosafe") == 0) { nosafe = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } else if (strcmp(argv[i], "-cppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is now always on.\n", argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is no longer supported.\n", argv[i]); Swig_mark_arg(i); SWIG_exit(EXIT_FAILURE); } } } Preprocessor_define("SWIGTCL 1", 0); // SWIGTCL8 is deprecated, and no longer documented. Preprocessor_define("SWIGTCL8 1", 0); SWIG_typemap_lang("tcl8"); SWIG_config_file("tcl8.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); /* Initialize some variables for the object interface */ cmd_tab = NewString(""); var_tab = NewString(""); methods_tab = NewString(""); const_tab = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGTCL\n#define SWIGTCL\n#endif\n\n"); /* Set the module name, namespace, and prefix */ module = NewStringf("%(lower)s", Getattr(n, "name")); init_name = NewStringf("%(title)s_Init", module); ns_name = prefix ? Copy(prefix) : Copy(module); if (prefix) Append(prefix, "_"); /* If shadow classing is enabled, we're going to change the module name to "_module" */ if (itcl) { String *filen; filen = NewStringf("%s%s.itcl", SWIG_output_directory(), module); Insert(module, 0, "_"); if ((f_shadow = NewFile(filen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } f_shadow_stubs = NewString(""); Swig_register_filebyname("shadow", f_shadow); Swig_register_filebyname("itcl", f_shadow); Swig_banner_target_lang(f_shadow, "#"); Printv(f_shadow, "\npackage require Itcl\n\n", NIL); Delete(filen); } /* Generate some macros used throughout code generation */ Printf(f_header, "#define SWIG_init %s\n", init_name); Printf(f_header, "#define SWIG_name \"%s\"\n", module); if (namespace_option) { Printf(f_header, "#define SWIG_prefix \"%s::\"\n", ns_name); Printf(f_header, "#define SWIG_namespace \"%s\"\n\n", ns_name); } else { Printf(f_header, "#define SWIG_prefix \"%s\"\n", prefix); } Printf(f_header, "#define SWIG_version \"%s\"\n", version); Printf(cmd_tab, "\nstatic swig_command_info swig_commands[] = {\n"); Printf(var_tab, "\nstatic swig_var_info swig_variables[] = {\n"); Printf(const_tab, "\nstatic swig_const_info swig_constants[] = {\n"); Printf(f_wrappers, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); /* Start emitting code */ Language::top(n); /* Done. Close up the module */ Printv(cmd_tab, tab4, "{0, 0, 0}\n", "};\n", NIL); Printv(var_tab, tab4, "{0,0,0,0}\n", "};\n", NIL); Printv(const_tab, tab4, "{0,0,0,0,0,0}\n", "};\n", NIL); Printv(f_wrappers, cmd_tab, var_tab, const_tab, NIL); /* Dump the pointer equivalency table */ SwigType_emit_type_table(f_runtime, f_wrappers); Printf(f_wrappers, "#ifdef __cplusplus\n}\n#endif\n"); /* Close the init function and quit */ Printf(f_init, "return TCL_OK;\n}\n"); if (!nosafe) { Printf(f_init, "SWIGEXPORT int %(title)s_SafeInit(Tcl_Interp *interp) {\n", module); Printf(f_init, " return SWIG_init(interp);\n"); Printf(f_init, "}\n"); } if (itcl) { Printv(f_shadow, f_shadow_stubs, "\n", NIL); Delete(f_shadow); } /* Close all of the files */ Dump(f_runtime, f_begin); Printv(f_begin, f_header, f_wrappers, NIL); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------ * functionWrapper() * ------------------------------------------------------------ */ virtual int functionWrapper(Node *n) { String *name = Getattr(n, "name"); /* Like to get rid of this */ String *iname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); ParmList *parms = Getattr(n, "parms"); String *overname = 0; Parm *p; int i; String *tm; Wrapper *f; String *incode, *cleanup, *outarg, *argstr, *args; int num_arguments = 0; int num_required = 0; int varargs = 0; char source[64]; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } incode = NewString(""); cleanup = NewString(""); outarg = NewString(""); argstr = NewString("\""); args = NewString(""); f = NewWrapper(); #ifdef SWIG_USE_RESULTOBJ Wrapper_add_local(f, "resultobj", "Tcl_Obj *resultobj = NULL"); #endif String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); Printv(f->def, "SWIGINTERN int\n ", wname, "(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) {", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(parms, f); /* Attach standard typemaps */ emit_attach_parmmaps(parms, f); Setattr(n, "wrap:parms", parms); /* Get number of require and total arguments */ num_arguments = emit_num_arguments(parms); num_required = emit_num_required(parms); varargs = emit_isvarargs(parms); /* Unmarshal parameters */ for (i = 0, p = parms; i < num_arguments; i++) { /* Skip ignored arguments */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); /* Produce string representations of the source and target arguments */ sprintf(source, "objv[%d]", i + 1); if (i == num_required) Putc('|', argstr); if ((tm = Getattr(p, "tmap:in"))) { String *parse = Getattr(p, "tmap:in:parse"); if (!parse) { Replaceall(tm, "$target", ln); Replaceall(tm, "$source", source); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Putc('o', argstr); Printf(args, ",(void *)0"); if (i >= num_required) { Printf(incode, "if (objc > %d) {\n", i + 1); } Printf(incode, "%s\n", tm); if (i >= num_required) { Printf(incode, "}\n"); } } else { Printf(argstr, "%s", parse); Printf(args, ",&%s", ln); if (Strcmp(parse, "p") == 0) { SwigType *lt = SwigType_ltype(pt); SwigType_remember(pt); if (Cmp(lt, "p.void") == 0) { Printf(args, ",(void *)0"); } else { Printf(args, ",SWIGTYPE%s", SwigType_manglestr(pt)); } Delete(lt); } } p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); } p = nextSibling(p); } if (!varargs) { Putc(':', argstr); } else { Putc(';', argstr); /* If variable length arguments we need to emit the in typemap here */ if (p && (tm = Getattr(p, "tmap:in"))) { sprintf(source, "objv[%d]", i + 1); Printf(incode, "if (objc > %d) {\n", i); Replaceall(tm, "$input", source); Printv(incode, tm, "\n", NIL); Printf(incode, "}\n"); } } Printf(argstr, "%s\"", usage_string(Char(iname), type, parms)); Printv(f->code, "if (SWIG_GetArgs(interp, objc, objv,", argstr, args, ") == TCL_ERROR) SWIG_fail;\n", NIL); Printv(f->code, incode, NIL); /* Insert constraint checking code */ for (p = parms; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (i = 0, p = parms; p; i++) { if (!checkAttribute(p, "tmap:in:numinputs", "0") && !Getattr(p, "tmap:in:parse") && (tm = Getattr(p, "tmap:freearg"))) { if (Len(tm) != 0) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (i = 0, p = parms; p; i++) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); #ifdef SWIG_USE_RESULTOBJ Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); #else Replaceall(tm, "$target", "(Tcl_GetObjResult(interp))"); Replaceall(tm, "$result", "(Tcl_GetObjResult(interp))"); #endif Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* Now write code to make the function call */ String *actioncode = emit_action(n); /* Need to redo all of this code (eventually) */ /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", Swig_cresult_name()); #ifdef SWIG_USE_RESULTOBJ Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); #else Replaceall(tm, "$target", "(Tcl_GetObjResult(interp))"); Replaceall(tm, "$result", "(Tcl_GetObjResult(interp))"); #endif if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); } else { Replaceall(tm, "$owner", "0"); } Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(type, 0), name); } emit_return_variable(n, type, f); /* Dump output argument code */ Printv(f->code, outarg, NIL); /* Dump the argument cleanup code */ Printv(f->code, cleanup, NIL); /* Look for any remaining cleanup */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } #ifdef SWIG_USE_RESULTOBJ Printv(f->code, "if (resultobj) Tcl_SetObjResult(interp, resultobj);\n", NIL); #endif Printv(f->code, "return TCL_OK;\n", NIL); Printv(f->code, "fail:\n", cleanup, "return TCL_ERROR;\n", NIL); Printv(f->code, "}\n", NIL); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); /* Dump out the function */ Wrapper_print(f, f_wrappers); if (!Getattr(n, "sym:overloaded")) { /* Register the function with Tcl */ Printv(cmd_tab, tab4, "{ SWIG_prefix \"", iname, "\", (swig_wrapper_func) ", Swig_name_wrapper(iname), ", NULL},\n", NIL); } else { if (!Getattr(n, "sym:nextSibling")) { /* Emit overloading dispatch function */ int maxargs; String *dispatch = Swig_overload_dispatch(n, "return %s(clientData, interp, objc, argv - 1);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *df = NewWrapper(); String *dname = Swig_name_wrapper(iname); Printv(df->def, "SWIGINTERN int\n", dname, "(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) {", NIL); Printf(df->code, "Tcl_Obj *CONST *argv = objv+1;\n"); Printf(df->code, "int argc = objc-1;\n"); Printv(df->code, dispatch, "\n", NIL); Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up String *protoTypes = NewString(""); do { String *fulldecl = Swig_name_decl(sibl); Printf(protoTypes, "\n\" %s\\n\"", fulldecl); Delete(fulldecl); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Printf(df->code, "Tcl_SetResult(interp,(char *) " "\"Wrong number or type of arguments for overloaded function '%s'.\\n\"" "\n\" Possible C/C++ prototypes are:\\n\"%s, TCL_STATIC);\n", iname, protoTypes); Delete(protoTypes); Printf(df->code, "return TCL_ERROR;\n"); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); Printv(cmd_tab, tab4, "{ SWIG_prefix \"", iname, "\", (swig_wrapper_func) ", dname, ", NULL},\n", NIL); DelWrapper(df); Delete(dispatch); Delete(dname); } } Delete(incode); Delete(cleanup); Delete(outarg); Delete(argstr); Delete(args); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *setname = 0; String *setfname = 0; Wrapper *setf = 0, *getf = 0; int readonly = 0; String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; /* Create a function for getting a variable */ int addfail = 0; getf = NewWrapper(); String *getname = Swig_name_get(NSPACE_TODO, iname); String *getfname = Swig_name_wrapper(getname); Setattr(n, "wrap:name", getfname); Printv(getf->def, "SWIGINTERN const char *", getfname, "(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, char *name1, char *name2, int flags) {", NIL); Wrapper_add_local(getf, "value", "Tcl_Obj *value = 0"); if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "value"); Replaceall(tm, "$result", "value"); /* Printf(getf->code, "%s\n",tm); */ addfail = emit_action_code(n, getf->code, tm); Printf(getf->code, "if (value) {\n"); Printf(getf->code, "Tcl_SetVar2(interp,name1,name2,Tcl_GetStringFromObj(value,NULL), flags);\n"); Printf(getf->code, "Tcl_DecrRefCount(value);\n"); Printf(getf->code, "}\n"); Printf(getf->code, "return NULL;\n"); if (addfail) { Append(getf->code, "fail:\n"); Printf(getf->code, "return \"%s\";\n", iname); } Printf(getf->code, "}\n"); Wrapper_print(getf, f_wrappers); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); DelWrapper(getf); return SWIG_NOWRAP; } DelWrapper(getf); /* Try to create a function setting a variable */ if (is_assignable(n)) { setf = NewWrapper(); setname = Swig_name_set(NSPACE_TODO, iname); setfname = Swig_name_wrapper(setname); Setattr(n, "wrap:name", setfname); if (setf) { Printv(setf->def, "SWIGINTERN const char *", setfname, "(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, char *name1, char *name2 SWIGUNUSED, int flags) {", NIL); Wrapper_add_local(setf, "value", "Tcl_Obj *value = 0"); Wrapper_add_local(setf, "name1o", "Tcl_Obj *name1o = 0"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "value"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "value"); Printf(setf->code, "name1o = Tcl_NewStringObj(name1,-1);\n"); Printf(setf->code, "value = Tcl_ObjGetVar2(interp, name1o, 0, flags);\n"); Printf(setf->code, "Tcl_DecrRefCount(name1o);\n"); Printf(setf->code, "if (!value) SWIG_fail;\n"); /* Printf(setf->code,"%s\n", tm); */ emit_action_code(n, setf->code, tm); Printf(setf->code, "return NULL;\n"); Printf(setf->code, "fail:\n"); Printf(setf->code, "return \"%s\";\n", iname); Printf(setf->code, "}\n"); Wrapper_print(setf, f_wrappers); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); readonly = 1; } } DelWrapper(setf); } else { readonly = 1; } Printv(var_tab, tab4, "{ SWIG_prefix \"", iname, "\", 0, (swig_variable_func) ", getfname, ",", NIL); if (readonly) { static int readonlywrap = 0; if (!readonlywrap) { Wrapper *ro = NewWrapper(); Printf(ro->def, "SWIGINTERN const char *swig_readonly(ClientData clientData SWIGUNUSED, Tcl_Interp *interp SWIGUNUSED, char *name1 SWIGUNUSED, char *name2 SWIGUNUSED, int flags SWIGUNUSED) {"); Printv(ro->code, "return \"Variable is read-only\";\n", "}\n", NIL); Wrapper_print(ro, f_wrappers); readonlywrap = 1; DelWrapper(ro); } Printf(var_tab, "(swig_variable_func) swig_readonly},\n"); } else { Printv(var_tab, "(swig_variable_func) ", setfname, "},\n", NIL); } Delete(getfname); Delete(setfname); Delete(setname); Delete(getname); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *nsname = !namespace_option ? Copy(iname) : NewStringf("%s::%s", ns_name, iname); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; if (namespace_option) Setattr(n, "sym:name", nsname); /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); Printf(f_wrappers, "static %s = %s;\n", SwigType_str(type, wname), value); value = Char(wname); } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); Printf(const_tab, "%s,\n", tm); } else if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); Printf(f_init, "%s\n", tm); } else { Delete(nsname); Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } Delete(nsname); return SWIG_OK; } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { String *name = Getattr(n, "sym:name"); String *funcname = Getattr(n, "wrap:name"); if (!addSymbol(funcname, n)) return SWIG_ERROR; Printf(f_init, "\t Tcl_CreateObjCommand(interp, SWIG_prefix \"%s\", (swig_wrapper_func) %s, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);\n", name, funcname); return SWIG_OK; } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { static Hash *emitted = NewHash(); String *mangled_classname = 0; String *real_classname = 0; have_constructor = 0; have_destructor = 0; destructor_action = 0; constructor_name = 0; if (itcl) { constructor = NewString(""); destructor = NewString(""); base_classes = NewString(""); base_class_init = NewString(""); methods = NewString(""); imethods = NewString(""); attributes = NewString(""); attribute_traces = NewString(""); iattribute_traces = NewString(""); have_base_classes = 0; have_methods = 0; have_attributes = 0; } class_name = Getattr(n, "sym:name"); if (!addSymbol(class_name, n)) return SWIG_ERROR; real_classname = Getattr(n, "name"); mangled_classname = Swig_name_mangle(real_classname); if (Getattr(emitted, mangled_classname)) return SWIG_NOWRAP; Setattr(emitted, mangled_classname, "1"); attr_tab = NewString(""); Printf(attr_tab, "static swig_attribute swig_"); Printv(attr_tab, mangled_classname, "_attributes[] = {\n", NIL); methods_tab = NewStringf(""); Printf(methods_tab, "static swig_method swig_"); Printv(methods_tab, mangled_classname, "_methods[] = {\n", NIL); /* Generate normal wrappers */ Language::classHandler(n); SwigType *t = Copy(Getattr(n, "name")); SwigType_add_pointer(t); // Catch all: eg. a class with only static functions and/or variables will not have 'remembered' // SwigType_remember(t); String *wrap_class = NewStringf("&_wrap_class_%s", mangled_classname); SwigType_remember_clientdata(t, wrap_class); String *rt = Copy(getClassType()); SwigType_add_pointer(rt); // Register the class structure with the type checker /* Printf(f_init,"SWIG_TypeClientData(SWIGTYPE%s, (void *) &_wrap_class_%s);\n", SwigType_manglestr(t), mangled_classname); */ if (have_destructor) { Printv(f_wrappers, "SWIGINTERN void swig_delete_", class_name, "(void *obj) {\n", NIL); if (destructor_action) { Printv(f_wrappers, SwigType_str(rt, "arg1"), " = (", SwigType_str(rt, 0), ") obj;\n", NIL); Printv(f_wrappers, destructor_action, "\n", NIL); } else { if (CPlusPlus) { Printv(f_wrappers, " delete (", SwigType_str(rt, 0), ") obj;\n", NIL); } else { Printv(f_wrappers, " free((char *) obj);\n", NIL); } } Printf(f_wrappers, "}\n"); } Printf(methods_tab, " {0,0}\n};\n"); Printv(f_wrappers, methods_tab, NIL); Printf(attr_tab, " {0,0,0}\n};\n"); Printv(f_wrappers, attr_tab, NIL); /* Handle inheritance */ String *base_class = NewString(""); String *base_class_names = NewString(""); if (itcl) { base_classes = NewString(""); } List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; int index = 0; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "name"); if ((!bname) || GetFlag(b.item, "feature:ignore") || (!Getattr(b.item, "module"))) { b = Next(b); continue; } if (itcl) { have_base_classes = 1; Printv(base_classes, bname, " ", NIL); Printv(base_class_init, " ", bname, "Ptr::constructor $ptr\n", NIL); } String *bmangle = Swig_name_mangle(bname); // Printv(f_wrappers,"extern swig_class _wrap_class_", bmangle, ";\n", NIL); // Printf(base_class,"&_wrap_class_%s",bmangle); Printf(base_class, "0"); Printf(base_class_names, "\"%s *\",", SwigType_namestr(bname)); /* Put code to register base classes in init function */ //Printf(f_init,"/* Register base : %s */\n", bmangle); //Printf(f_init,"swig_%s_bases[%d] = (swig_class *) SWIG_TypeQuery(\"%s *\")->clientdata;\n", mangled_classname, index, SwigType_namestr(bname)); b = Next(b); index++; Putc(',', base_class); Delete(bmangle); } } if (itcl) { String *ptrclass = NewString(""); // First, build the pointer base class Printv(ptrclass, "itcl::class ", class_name, "Ptr {\n", NIL); if (have_base_classes) Printv(ptrclass, " inherit ", base_classes, "\n", NIL); // Define protected variables for SWIG object pointer Printv(ptrclass, " protected variable swigobj\n", " protected variable thisown\n", NIL); // Define public variables if (have_attributes) { Printv(ptrclass, attributes, NIL); // base class swig_getset was being called for complex inheritance trees if (namespace_option) { Printv(ptrclass, " protected method ", class_name, "_swig_getset {var name1 name2 op} {\n", NIL); Printv(ptrclass, " switch -exact -- $op {\n", " r {set $var [", ns_name, "::", class_name, "_[set var]_get $swigobj]}\n", " w {", ns_name, "::", class_name, "_${var}_set $swigobj [set $var]}\n", " }\n", " }\n", NIL); } else { Printv(ptrclass, " protected method ", class_name, "_swig_getset {var name1 name2 op} {\n", " switch -exact -- $op {\n", " r {set $var [", class_name, "_[set var]_get $swigobj]}\n", " w {", class_name, "_${var}_set $swigobj [set $var]}\n", " }\n", " }\n", NIL); } } // Add the constructor, which may include // calls to base class class constructors Printv(ptrclass, " constructor { ptr } {\n", NIL); if (have_base_classes) { Printv(ptrclass, base_class_init, NIL); Printv(ptrclass, " } {\n", NIL); } Printv(ptrclass, " set swigobj $ptr\n", " set thisown 0\n", NIL); if (have_attributes) { Printv(ptrclass, attribute_traces, NIL); } Printv(ptrclass, " }\n", NIL); // Add destructor Printv(ptrclass, " destructor {\n", " set d_func delete_", class_name, "\n", " if { $thisown && ([info command $d_func] != \"\") } {\n" " $d_func $swigobj\n", " }\n", " }\n", NIL); // Add methods if (have_methods) { Printv(ptrclass, imethods, NIL); }; // Close out the pointer class Printv(ptrclass, "}\n\n", NIL); Printv(f_shadow, ptrclass, NIL); // pointer class end // Create the "real" class. Printv(f_shadow, "itcl::class ", class_name, " {\n", NIL); Printv(f_shadow, " inherit ", class_name, "Ptr\n", NIL); // If we have a constructor, then use it. // If not, then we must have an abstract class without // any constructor. So we create a class constructor // which will fail for this class (but not for inherited // classes). Note that the constructor must fail before // calling the ptrclass constructor. if (have_constructor) { Printv(f_shadow, constructor, NIL); } else { Printv(f_shadow, " constructor { } {\n", NIL); Printv(f_shadow, " # This constructor will fail if called directly\n", NIL); Printv(f_shadow, " if { [info class] == \"::", class_name, "\" } {\n", NIL); Printv(f_shadow, " error \"No constructor for class ", class_name, (Getattr(n, "abstracts") ? " - class is abstract" : ""), "\"\n", NIL); Printv(f_shadow, " }\n", NIL); Printv(f_shadow, " }\n", NIL); } Printv(f_shadow, "}\n\n", NIL); } Printv(f_wrappers, "static swig_class *swig_", mangled_classname, "_bases[] = {", base_class, "0};\n", NIL); Printv(f_wrappers, "static const char * swig_", mangled_classname, "_base_names[] = {", base_class_names, "0};\n", NIL); Delete(base_class); Delete(base_class_names); Printv(f_wrappers, "static swig_class _wrap_class_", mangled_classname, " = { \"", class_name, "\", &SWIGTYPE", SwigType_manglestr(t), ",", NIL); if (have_constructor) { Printf(f_wrappers, "%s", Swig_name_wrapper(Swig_name_construct(NSPACE_TODO, constructor_name))); Delete(constructor_name); constructor_name = 0; } else { Printf(f_wrappers, "0"); } if (have_destructor) { Printv(f_wrappers, ", swig_delete_", class_name, NIL); } else { Printf(f_wrappers, ",0"); } Printv(f_wrappers, ", swig_", mangled_classname, "_methods, swig_", mangled_classname, "_attributes, swig_", mangled_classname, "_bases,", "swig_", mangled_classname, "_base_names, &swig_module, SWIG_TCL_HASHTABLE_INIT };\n", NIL); if (!itcl) { Printv(cmd_tab, tab4, "{ SWIG_prefix \"", class_name, "\", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_", mangled_classname, "},\n", NIL); }; Delete(t); Delete(mangled_classname); return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { String *name = Getattr(n, "name"); String *iname = GetChar(n, "sym:name"); String *realname, *rname; Language::memberfunctionHandler(n); realname = iname ? iname : name; rname = Swig_name_wrapper(Swig_name_member(NSPACE_TODO, class_name, realname)); if (!Getattr(n, "sym:nextSibling")) { Printv(methods_tab, tab4, "{\"", realname, "\", ", rname, "}, \n", NIL); } if (itcl) { ParmList *l = Getattr(n, "parms"); Parm *p = 0; String *pname = NewString(""); // Add this member to our class handler function Printv(imethods, tab2, "method ", realname, " [list ", NIL); int pnum = 0; for (p = l; p; p = nextSibling(p)) { String *pn = Getattr(p, "name"); String *dv = Getattr(p, "value"); SwigType *pt = Getattr(p, "type"); Printv(pname, ",(", pt, ")", NIL); Clear(pname); /* Only print an argument if not void */ if (Cmp(pt, "void") != 0) { if (Len(pn) > 0) { Printv(pname, pn, NIL); } else { Printf(pname, "p%d", pnum); } if (Len(dv) > 0) { String *defval = NewString(dv); if (namespace_option) { Insert(defval, 0, "::"); Insert(defval, 0, ns_name); } if (Strncmp(dv, "(", 1) == 0) { Insert(defval, 0, "$"); Replaceall(defval, "(", ""); Replaceall(defval, ")", ""); } Printv(imethods, "[list ", pname, " ", defval, "] ", NIL); } else { Printv(imethods, pname, " ", NIL); } } ++pnum; } Printv(imethods, "] ", NIL); if (namespace_option) { Printv(imethods, "{ ", ns_name, "::", class_name, "_", realname, " $swigobj", NIL); } else { Printv(imethods, "{ ", class_name, "_", realname, " $swigobj", NIL); }; pnum = 0; for (p = l; p; p = nextSibling(p)) { String *pn = Getattr(p, "name"); SwigType *pt = Getattr(p, "type"); Clear(pname); /* Only print an argument if not void */ if (Cmp(pt, "void") != 0) { if (Len(pn) > 0) { Printv(pname, pn, NIL); } else { Printf(pname, "p%d", pnum); } Printv(imethods, " $", pname, NIL); } ++pnum; } Printv(imethods, " }\n", NIL); have_methods = 1; } Delete(rname); return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { String *symname = Getattr(n, "sym:name"); String *rname; Language::membervariableHandler(n); Printv(attr_tab, tab4, "{ \"-", symname, "\",", NIL); rname = Swig_name_wrapper(Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname))); Printv(attr_tab, rname, ", ", NIL); Delete(rname); if (!GetFlag(n, "feature:immutable")) { rname = Swig_name_wrapper(Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname))); Printv(attr_tab, rname, "},\n", NIL); Delete(rname); } else { Printf(attr_tab, "0 },\n"); } if (itcl) { Printv(attributes, " public variable ", symname, "\n", NIL); Printv(attribute_traces, " trace variable ", symname, " rw [list ", class_name, "_swig_getset ", symname, "]\n", NIL); Printv(attribute_traces, " set ", symname, "\n", NIL); have_attributes = 1; } return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { Language::constructorHandler(n); if (itcl) { String *name = Getattr(n, "name"); String *iname = GetChar(n, "sym:name"); String *realname; ParmList *l = Getattr(n, "parms"); Parm *p = 0; String *pname = NewString(""); realname = iname ? iname : name; if (!have_constructor) { // Add this member to our class handler function Printf(constructor, " constructor { "); // Add parameter list int pnum = 0; for (p = l; p; p = nextSibling(p)) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); String *dv = Getattr(p, "value"); Clear(pname); /* Only print an argument if not void */ if (Cmp(pt, "void") != 0) { if (Len(pn) > 0) { Printv(pname, pn, NIL); } else { Printf(pname, "p%d", pnum); } if (Len(dv) > 0) { Printv(constructor, "{", pname, " {", dv, "} } ", NIL); } else { Printv(constructor, pname, " ", NIL); } } ++pnum; } Printf(constructor, "} { \n"); // [BRE] 08/17/00 Added test to see if we are instantiating this object // type, or, if this constructor is being called as part of the itcl // inheritance hierarchy. // In the former case, we need to call the C++ constructor, in the // latter we don't, or we end up with two C++ objects. // Check to see if we are instantiating a 'realname' or something // derived from it. // Printv(constructor, " if { [string equal -nocase \"", realname, "\" \"[namespace tail [info class]]\" ] } {\n", NIL); // Call to constructor wrapper and parent Ptr class // [BRE] add -namespace/-prefix support if (namespace_option) { Printv(constructor, " ", realname, "Ptr::constructor [", ns_name, "::new_", realname, NIL); } else { Printv(constructor, " ", realname, "Ptr::constructor [new_", realname, NIL); } pnum = 0; for (p = l; p; p = nextSibling(p)) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); Clear(pname); /* Only print an argument if not void */ if (Cmp(pt, "void") != 0) { if (Len(pn) > 0) { Printv(pname, pn, NIL); } else { Printf(pname, "p%d", pnum); } Printv(constructor, " $", pname, NIL); } ++pnum; } Printv(constructor, "]\n", " }\n", " } {\n", " set thisown 1\n", " }\n", NIL); } } if (!have_constructor) constructor_name = NewString(Getattr(n, "sym:name")); have_constructor = 1; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); have_destructor = 1; destructor_action = Getattr(n, "wrap:action"); return SWIG_OK; } /* ------------------------------------------------------------ * validIdentifier() * ------------------------------------------------------------ */ virtual int validIdentifier(String *s) { if (Strchr(s, ' ')) return 0; return 1; } /* ------------------------------------------------------------ * usage_string() * ------------------------------------------------------------ */ char *usage_string(char *iname, SwigType *, ParmList *l) { static String *temp = 0; Parm *p; int i, numopt, pcount; if (!temp) temp = NewString(""); Clear(temp); if (namespace_option) { Printf(temp, "%s::%s ", ns_name, iname); } else { Printf(temp, "%s ", iname); } /* Now go through and print parameters */ i = 0; pcount = emit_num_arguments(l); numopt = pcount - emit_num_required(l); for (p = l; p; p = nextSibling(p)) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); /* Only print an argument if not ignored */ if (!checkAttribute(p, "tmap:in:numinputs", "0")) { if (i >= (pcount - numopt)) Putc('?', temp); if (Len(pn) > 0) { Printf(temp, "%s", pn); } else { Printf(temp, "%s", SwigType_str(pt, 0)); } if (i >= (pcount - numopt)) Putc('?', temp); Putc(' ', temp); i++; } } return Char(temp); } String *runtimeCode() { String *s = NewString(""); String *serrors = Swig_include_sys("tclerrors.swg"); if (!serrors) { Printf(stderr, "*** Unable to open 'tclerrors.swg'\n"); } else { Append(s, serrors); Delete(serrors); } String *sapi = Swig_include_sys("tclapi.swg"); if (!sapi) { Printf(stderr, "*** Unable to open 'tclapi.swg'\n"); } else { Append(s, sapi); Delete(sapi); } String *srun = Swig_include_sys("tclrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'tclrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigtclrun.h"); } }; /* ---------------------------------------------------------------------- * swig_tcl() - Instantiate module * ---------------------------------------------------------------------- */ static Language *new_swig_tcl() { return new TCL8(); } extern "C" Language *swig_tcl(void) { return new_swig_tcl(); } swig-4.0.2/Source/Modules/typepass.cxx0000644000175000017500000012364213667507523017636 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * typepass.cxx * * This module builds all of the internal type information by collecting * typedef declarations as well as registering classes, structures, and unions. * This information is needed to correctly handle shadow classes and other * advanced features. This phase of compilation is also used to perform * type-expansion. All types are fully qualified with namespace prefixes * and other information needed for compilation. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" struct normal_node { Symtab *symtab; Hash *typescope; List *normallist; normal_node *next; }; static normal_node *patch_list = 0; /* Singleton class - all non-static methods in this class are private */ class TypePass:private Dispatcher { Node *inclass; Node *module; int importmode; String *nsname; String *nssymname; Hash *classhash; List *normalize; TypePass() : inclass(0), module(0), importmode(0), nsname(0), nssymname(0), classhash(0), normalize(0) { } /* Normalize a type. Replaces type with fully qualified version */ void normalize_type(SwigType *ty) { SwigType *qty; if (CPlusPlus) { Replaceall(ty, "struct ", ""); Replaceall(ty, "union ", ""); Replaceall(ty, "class ", ""); } qty = SwigType_typedef_qualified(ty); /* Printf(stdout,"%s --> %s\n", ty, qty); */ Clear(ty); Append(ty, qty); Delete(qty); } /* Normalize a parameter list */ void normalize_parms(ParmList *p) { while (p) { SwigType *ty = Getattr(p, "type"); normalize_type(ty); /* This is a check for a function type */ { SwigType *qty = SwigType_typedef_resolve_all(ty); if (SwigType_isfunction(qty)) { SwigType_add_pointer(ty); } Delete(qty); } String *value = Getattr(p, "value"); if (value) { Node *n = Swig_symbol_clookup(value, 0); if (n) { String *q = Swig_symbol_qualified(n); if (q && Len(q)) { String *vb = Swig_scopename_last(value); Clear(value); Printf(value, "%s::%s", SwigType_namestr(q), vb); Delete(q); } } } if (value && SwigType_istemplate(value)) { String *nv = SwigType_namestr(value); Setattr(p, "value", nv); } p = nextSibling(p); } } void normalize_later(ParmList *p) { while (p) { SwigType *ty = Getattr(p, "type"); Append(normalize, ty); p = nextSibling(p); } } /* Walk through entries in normalize list and patch them up */ void normalize_list() { Hash *currentsym = Swig_symbol_current(); normal_node *nn = patch_list; normal_node *np; while (nn) { Swig_symbol_setscope(nn->symtab); SwigType_set_scope(nn->typescope); Iterator t; for (t = First(nn->normallist); t.item; t = Next(t)) { normalize_type(t.item); } Delete(nn->normallist); np = nn->next; delete(nn); nn = np; } Swig_symbol_setscope(currentsym); } /* generate C++ inheritance type-relationships */ void cplus_inherit_types_impl(Node *first, Node *cls, String *clsname, const char *bases, const char *baselist, int ispublic, String *cast = 0) { if (first == cls) return; /* The Marcelo check */ if (!cls) cls = first; List *alist = 0; List *ilist = Getattr(cls, bases); if (!ilist) { List *nlist = Getattr(cls, baselist); if (nlist) { int len = Len(nlist); int i; for (i = 0; i < len; i++) { Node *bcls = 0; int clsforward = 0; String *bname = Getitem(nlist, i); String *sname = bname; String *tname = 0; /* Try to locate the base class. We look in the symbol table and we chase typedef declarations to get to the base class if necessary */ Symtab *st = Getattr(cls, "sym:symtab"); if (SwigType_istemplate(bname)) { tname = SwigType_typedef_resolve_all(bname); sname = tname; } while (1) { String *qsname = SwigType_typedef_qualified(sname); bcls = Swig_symbol_clookup(qsname, st); Delete(qsname); if (bcls) { if (Strcmp(nodeType(bcls), "class") != 0) { /* Not a class. The symbol could be a typedef. */ if (checkAttribute(bcls, "storage", "typedef")) { SwigType *decl = Getattr(bcls, "decl"); if (!decl || !(Len(decl))) { sname = Getattr(bcls, "type"); st = Getattr(bcls, "sym:symtab"); if (SwigType_istemplate(sname)) { if (tname) Delete(tname); tname = SwigType_typedef_resolve_all(sname); sname = tname; } continue; } // A case when both outer and nested classes inherit from the same parent. Constructor may be found instead of the class itself. } else if (GetFlag(cls, "nested") && checkAttribute(bcls, "nodeType", "constructor")) { bcls = Getattr(bcls, "parentNode"); if (Getattr(bcls, "typepass:visit")) { if (!Getattr(bcls, "feature:onlychildren")) { if (!ilist) ilist = alist = NewList(); Append(ilist, bcls); } else { if (!GetFlag(bcls, "feature:ignore")) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Base class '%s' has no name as it is an empty template instantiated with '%%template()'. Ignored.\n", SwigType_namestr(bname)); Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bcls), Getline(bcls), "The %%template directive must be written before '%s' is used as a base class and be declared with a name.\n", SwigType_namestr(bname)); } } } break; } if (Strcmp(nodeType(bcls), "classforward") != 0) { Swig_error(Getfile(bname), Getline(bname), "'%s' is not a valid base class.\n", SwigType_namestr(bname)); Swig_error(Getfile(bcls), Getline(bcls), "See definition of '%s'.\n", SwigType_namestr(bname)); } else { Swig_warning(WARN_TYPE_INCOMPLETE, Getfile(bname), Getline(bname), "Base class '%s' is incomplete.\n", SwigType_namestr(bname)); Swig_warning(WARN_TYPE_INCOMPLETE, Getfile(bcls), Getline(bcls), "Only forward declaration '%s' was found.\n", SwigType_namestr(bname)); clsforward = 1; } bcls = 0; } else { if (Getattr(bcls, "typepass:visit")) { if (!Getattr(bcls, "feature:onlychildren")) { if (!ilist) ilist = alist = NewList(); Append(ilist, bcls); } else { if (!GetFlag(bcls, "feature:ignore")) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Base class '%s' has no name as it is an empty template instantiated with '%%template()'. Ignored.\n", SwigType_namestr(bname)); Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bcls), Getline(bcls), "The %%template directive must be written before '%s' is used as a base class and be declared with a name.\n", SwigType_namestr(bname)); } } } else { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Base class '%s' undefined.\n", SwigType_namestr(bname)); Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bcls), Getline(bcls), "'%s' must be defined before it is used as a base class.\n", SwigType_namestr(bname)); } } } break; } if (tname) Delete(tname); if (!bcls) { if (!clsforward && !GetFlag(cls, "feature:ignore")) { if (ispublic && !Getmeta(bname, "already_warned")) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Nothing known about base class '%s'. Ignored.\n", SwigType_namestr(bname)); if (Strchr(bname, '<')) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Maybe you forgot to instantiate '%s' using %%template.\n", SwigType_namestr(bname)); } Setmeta(bname, "already_warned", "1"); } } SwigType_inherit(clsname, bname, cast, 0); } } } if (ilist) { Setattr(cls, bases, ilist); } } if (alist) Delete(alist); if (!ilist) return; int len = Len(ilist); int i; for (i = 0; i < len; i++) { Node *n = Getitem(ilist, i); String *bname = Getattr(n, "name"); Node *bclass = n; /* Getattr(n,"class"); */ Hash *scopes = Getattr(bclass, "typescope"); SwigType_inherit(clsname, bname, cast, 0); if (ispublic && !GetFlag(bclass, "feature:ignore")) { String *smartptr = Getattr(first, "feature:smartptr"); if (smartptr) { SwigType *smart = Swig_cparse_smartptr(first); if (smart) { /* Record a (fake) inheritance relationship between smart pointer and smart pointer to base class, so that smart pointer upcasts are automatically generated. */ SwigType *bsmart = Copy(smart); // TODO: SwigType_typedef_resolve_all on a String instead of SwigType is incorrect for templates SwigType *rclsname = SwigType_typedef_resolve_all(clsname); SwigType *rbname = SwigType_typedef_resolve_all(bname); int replace_count = Replaceall(bsmart, rclsname, rbname); if (replace_count == 0) { // If no replacement made, it will be because rclsname is fully resolved, but the // type in the smartptr feature used a typedef or not fully resolved name. String *firstname = Getattr(first, "name"); Replaceall(bsmart, firstname, rbname); } // The code above currently creates a smartptr of the base class by substitution, replacing Derived // with Base resulting in something like: 'smartptr< Derived >' from 'smartptr< Base >'. Instead // the feature:smartptr should be used as it also contains 'smartptr< Base >' as specified by the user. // A similar fix should also be done in upcastsCode in java.cxx, csharp.cxx and writeClassUpcast in d.cxx. // Printf(stdout, "smartcomparison %s <=> %s\n", SwigType_namestr(bsmart), Getattr(bclass, "feature:smartptr")); Delete(rclsname); Delete(rbname); String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(bsmart); /* construct casting code */ String *convcode = NewStringf("\n *newmemory = SWIG_CAST_NEW_MEMORY;\n return (void *) new %s(*(%s *)$from);\n", bsmartnamestr, smartnamestr); Delete(bsmartnamestr); Delete(smartnamestr); /* setup inheritance relationship between smart pointer templates */ SwigType_inherit(smart, bsmart, 0, convcode); if (!GetFlag(bclass, "feature:smartptr")) Swig_warning(WARN_LANG_SMARTPTR_MISSING, Getfile(first), Getline(first), "Base class '%s' of '%s' is not similarly marked as a smart pointer.\n", SwigType_namestr(Getattr(bclass, "name")), SwigType_namestr(Getattr(first, "name"))); Delete(convcode); Delete(bsmart); } Delete(smart); } else { if (GetFlag(bclass, "feature:smartptr")) Swig_warning(WARN_LANG_SMARTPTR_MISSING, Getfile(first), Getline(first), "Derived class '%s' of '%s' is not similarly marked as a smart pointer.\n", SwigType_namestr(Getattr(first, "name")), SwigType_namestr(Getattr(bclass, "name"))); } } if (!importmode) { String *btype = Copy(bname); SwigType_add_pointer(btype); SwigType_remember(btype); Delete(btype); } if (scopes) { SwigType_inherit_scope(scopes); } /* Set up inheritance in the symbol table */ Symtab *st = Getattr(cls, "symtab"); Symtab *bst = Getattr(bclass, "symtab"); if (st == bst) { Swig_warning(WARN_PARSE_REC_INHERITANCE, Getfile(cls), Getline(cls), "Recursive scope inheritance of '%s'.\n", SwigType_namestr(Getattr(cls, "name"))); continue; } Symtab *s = Swig_symbol_current(); Swig_symbol_setscope(st); Swig_symbol_inherit(bst); Swig_symbol_setscope(s); /* Recursively hit base classes */ String *namestr = SwigType_namestr(Getattr(bclass, "name")); String *newcast = NewStringf("(%s *)%s", namestr, cast); Delete(namestr); cplus_inherit_types_impl(first, bclass, clsname, bases, baselist, ispublic, newcast); Delete(newcast); } } void append_list(List *lb, List *la) { if (la && lb) { for (Iterator bi = First(la); bi.item; bi = Next(bi)) { Append(lb, bi.item); } } } void cplus_inherit_types(Node *first, Node *cls, String *clsname, String *cast = 0) { cplus_inherit_types_impl(first, cls, clsname, "bases", "baselist", 1, cast); cplus_inherit_types_impl(first, cls, clsname, "protectedbases", "protectedbaselist", 0, cast); cplus_inherit_types_impl(first, cls, clsname, "privatebases", "privatebaselist", 0, cast); if (!cls) cls = first; List *allbases = NewList(); append_list(allbases, Getattr(cls, "bases")); append_list(allbases, Getattr(cls, "protectedbases")); append_list(allbases, Getattr(cls, "privatebases")); if (Len(allbases)) { Setattr(cls, "allbases", allbases); } Delete(allbases); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { importmode = 0; module = Getattr(n, "module"); inclass = 0; normalize = 0; nsname = 0; nssymname = 0; classhash = Getattr(n, "classes"); emit_children(n); normalize_list(); SwigType_set_scope(0); return SWIG_OK; } /* ------------------------------------------------------------ * moduleDirective() * ------------------------------------------------------------ */ virtual int moduleDirective(Node *n) { if (!module) { module = n; } return SWIG_OK; } /* ------------------------------------------------------------ * importDirective() * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { String *oldmodule = module; int oldimport = importmode; importmode = 1; module = 0; emit_children(n); importmode = oldimport; module = oldmodule; return SWIG_OK; } /* ------------------------------------------------------------ * includeDirective() * externDirective() * extendDirective() * ------------------------------------------------------------ */ virtual int includeDirective(Node *n) { return emit_children(n); } virtual int externDeclaration(Node *n) { return emit_children(n); } virtual int extendDirective(Node *n) { return emit_children(n); } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { String *name = Getattr(n, "name"); String *tdname = Getattr(n, "tdname"); String *unnamed = Getattr(n, "unnamed"); String *storage = Getattr(n, "storage"); String *kind = Getattr(n, "kind"); save_value oldinclass(inclass); List *olist = normalize; Symtab *symtab; String *nname = 0; String *fname = 0; String *scopename = 0; String *template_default_expanded = 0; normalize = NewList(); if (name) { if (SwigType_istemplate(name)) { // We need to fully resolve the name and expand default template parameters to make templates work correctly */ Node *cn; SwigType *resolved_name = SwigType_typedef_resolve_all(name); SwigType *deftype_name = Swig_symbol_template_deftype(resolved_name, 0); fname = Copy(resolved_name); if (!Equal(resolved_name, deftype_name)) template_default_expanded = Copy(deftype_name); if (!Equal(fname, name) && (cn = Swig_symbol_clookup_local(fname, 0))) { if ((n == cn) || (Strcmp(nodeType(cn), "template") == 0) || (Getattr(cn, "feature:onlychildren") != 0) || (Getattr(n, "feature:onlychildren") != 0)) { Swig_symbol_cadd(fname, n); if (template_default_expanded) Swig_symbol_cadd(template_default_expanded, n); SwigType_typedef_class(fname); scopename = Copy(fname); } else { Swig_warning(WARN_TYPE_REDEFINED, Getfile(n), Getline(n), "Template '%s' was already wrapped,\n", SwigType_namestr(name)); Swig_warning(WARN_TYPE_REDEFINED, Getfile(cn), Getline(cn), "previous wrap of '%s'.\n", SwigType_namestr(Getattr(cn, "name"))); scopename = 0; } } else { Swig_symbol_cadd(fname, n); SwigType_typedef_class(fname); scopename = Copy(fname); } Delete(deftype_name); Delete(resolved_name); } else { if ((CPlusPlus) || (unnamed)) { SwigType_typedef_class(name); } else { SwigType_typedef_class(NewStringf("%s %s", kind, name)); } scopename = Copy(name); } } else { scopename = 0; } Setattr(n, "typepass:visit", "1"); /* Need to set up a typedef if unnamed */ if (unnamed && tdname && (Cmp(storage, "typedef") == 0)) { SwigType_typedef(unnamed, tdname); } // name of the outer class should already be patched to contain its outer classes names, but not to contain namespaces // namespace name (if present) is added after processing child nodes if (Getattr(n, "nested:outer") && name) { String *outerName = Getattr(Getattr(n, "nested:outer"), "name"); name = NewStringf("%s::%s", outerName, name); Setattr(n, "name", name); if (tdname) { tdname = NewStringf("%s::%s", outerName, tdname); Setattr(n, "tdname", tdname); } } if (nsname && name) { nname = NewStringf("%s::%s", nsname, name); String *tdname = Getattr(n, "tdname"); if (tdname) { tdname = NewStringf("%s::%s", nsname, tdname); Setattr(n, "tdname", tdname); } } if (nssymname) { if (GetFlag(n, "feature:nspace")) Setattr(n, "sym:nspace", nssymname); } SwigType_new_scope(scopename); SwigType_attach_symtab(Getattr(n, "symtab")); /* Inherit type definitions into the class */ if (name && !(GetFlag(n, "nested") && !checkAttribute(n, "access", "public") && (GetFlag(n, "feature:flatnested") || Language::instance()->nestedClassesSupport() == Language::NCS_None))) { cplus_inherit_types(n, 0, nname ? nname : (fname ? fname : name)); } inclass = n; symtab = Swig_symbol_setscope(Getattr(n, "symtab")); emit_children(n); Swig_symbol_setscope(symtab); Hash *ts = SwigType_pop_scope(); Setattr(n, "typescope", ts); Delete(ts); Setattr(n, "module", module); // When a fully qualified templated type with default parameters is used in the parsed code, // the following additional symbols and scopes are needed for successful lookups if (template_default_expanded) { Swig_symbol_alias(template_default_expanded, Getattr(n, "symtab")); SwigType_scope_alias(template_default_expanded, Getattr(n, "typescope")); } /* Normalize deferred types */ { normal_node *nn = new normal_node(); nn->normallist = normalize; nn->symtab = Getattr(n, "symtab"); nn->next = patch_list; nn->typescope = Getattr(n, "typescope"); patch_list = nn; } normalize = olist; /* If in a namespace, patch the class name */ if (nname) { Setattr(n, "name", nname); Delete(nname); } Delete(fname); return SWIG_OK; } /* ------------------------------------------------------------ * templateDeclaration() * ------------------------------------------------------------ */ virtual int templateDeclaration(Node *n) { String *name = Getattr(n, "name"); String *ttype = Getattr(n, "templatetype"); if (Strcmp(ttype, "class") == 0) { String *rname = SwigType_typedef_resolve_all(name); SwigType_typedef_class(rname); Delete(rname); } else if (Strcmp(ttype, "classforward") == 0) { String *rname = SwigType_typedef_resolve_all(name); SwigType_typedef_class(rname); Delete(rname); /* SwigType_typedef_class(name); */ } else if (Strcmp(ttype, "cdecl") == 0) { String *rname = SwigType_typedef_resolve_all(name); SwigType_typedef_class(rname); Delete(rname); } return SWIG_OK; } /* ------------------------------------------------------------ * lambdaDeclaration() * ------------------------------------------------------------ */ virtual int lambdaDeclaration(Node *) { return SWIG_OK; } /* ------------------------------------------------------------ * classforwardDeclaration() * ------------------------------------------------------------ */ virtual int classforwardDeclaration(Node *n) { /* Can't do inside a C struct because it breaks C nested structure wrapping */ if ((!inclass) || (CPlusPlus)) { String *name = Getattr(n, "name"); SwigType_typedef_class(name); } return SWIG_OK; } /* ------------------------------------------------------------ * namespaceDeclaration() * ------------------------------------------------------------ */ virtual int namespaceDeclaration(Node *n) { Symtab *symtab; String *name = Getattr(n, "name"); String *alias = Getattr(n, "alias"); List *olist = normalize; normalize = NewList(); if (alias) { Typetab *ts = Getattr(n, "typescope"); if (!ts) { /* Create an empty scope for the alias */ Node *ns = Getattr(n, "namespace"); SwigType_scope_alias(name, Getattr(ns, "typescope")); ts = Getattr(ns, "typescope"); Setattr(n, "typescope", ts); } /* Namespace alias */ return SWIG_OK; } else { if (name) { Node *nn = Swig_symbol_clookup(name, n); Hash *ts = 0; if (nn) ts = Getattr(nn, "typescope"); if (!ts) { SwigType_new_scope(name); SwigType_attach_symtab(Getattr(n, "symtab")); } else { SwigType_set_scope(ts); } } String *oldnsname = nsname; String *oldnssymname = nssymname; nsname = Swig_symbol_qualified(Getattr(n, "symtab")); nssymname = Swig_symbol_qualified_language_scopename(Getattr(n, "symtab")); symtab = Swig_symbol_setscope(Getattr(n, "symtab")); emit_children(n); Swig_symbol_setscope(symtab); if (name) { Hash *ts = SwigType_pop_scope(); Setattr(n, "typescope", ts); Delete(ts); } /* Normalize deferred types */ { normal_node *nn = new normal_node(); nn->normallist = normalize; nn->symtab = Getattr(n, "symtab"); nn->next = patch_list; nn->typescope = Getattr(n, "typescope"); patch_list = nn; } normalize = olist; Delete(nssymname); nssymname = oldnssymname; Delete(nsname); nsname = oldnsname; return SWIG_OK; } } /* ------------------------------------------------------------ * cDeclaration() * ------------------------------------------------------------ */ virtual int cDeclaration(Node *n) { if (NoExcept) { Delattr(n, "throws"); } /* Normalize types. */ SwigType *ty = Getattr(n, "type"); if (!ty) { return SWIG_OK; } normalize_type(ty); SwigType *decl = Getattr(n, "decl"); if (decl) { normalize_type(decl); } normalize_parms(Getattr(n, "parms")); normalize_parms(Getattr(n, "throws")); if (GetFlag(n, "conversion_operator")) { /* The call to the operator in the generated wrapper must be fully qualified in order to compile */ SwigType *name = Getattr(n, "name"); SwigType *qualifiedname = Swig_symbol_string_qualify(name, 0); Clear(name); Append(name, qualifiedname); Delete(qualifiedname); } if (checkAttribute(n, "storage", "typedef")) { String *name = Getattr(n, "name"); ty = Getattr(n, "type"); decl = Getattr(n, "decl"); SwigType *t = Copy(ty); { /* If the typename is qualified, make sure the scopename is fully qualified when making a typedef */ if (Swig_scopename_check(t) && strncmp(Char(t), "::", 2)) { String *base, *prefix, *qprefix; base = Swig_scopename_last(t); prefix = Swig_scopename_prefix(t); qprefix = SwigType_typedef_qualified(prefix); Delete(t); t = NewStringf("%s::%s", qprefix, base); Delete(base); Delete(prefix); Delete(qprefix); } } SwigType_push(t, decl); if (CPlusPlus) { Replaceall(t, "struct ", ""); Replaceall(t, "union ", ""); Replaceall(t, "class ", ""); } SwigType_typedef(t, name); } /* If namespaces are active. We need to patch the name with a namespace prefix */ if (nsname && !inclass) { String *name = Getattr(n, "name"); if (name) { String *nname = NewStringf("%s::%s", nsname, name); Setattr(n, "name", nname); Delete(nname); } } clean_overloaded(n); return SWIG_OK; } /* ------------------------------------------------------------ * constructorDeclaration() * ------------------------------------------------------------ */ virtual int constructorDeclaration(Node *n) { if (NoExcept) { Delattr(n, "throws"); } normalize_parms(Getattr(n, "parms")); normalize_parms(Getattr(n, "throws")); clean_overloaded(n); return SWIG_OK; } /* ------------------------------------------------------------ * destructorDeclaration() * ------------------------------------------------------------ */ virtual int destructorDeclaration(Node *) { return SWIG_OK; } /* ------------------------------------------------------------ * constantDirective() * ------------------------------------------------------------ */ virtual int constantDirective(Node *n) { SwigType *ty = Getattr(n, "type"); if (ty) { Setattr(n, "type", SwigType_typedef_qualified(ty)); } return SWIG_OK; } /* ------------------------------------------------------------ * enumDeclaration() * ------------------------------------------------------------ */ virtual int enumDeclaration(Node *n) { String *name = Getattr(n, "name"); if (name) { String *scope = 0; // Add a typedef to the type table so that we can use 'enum Name' as well as just 'Name' if (nsname || inclass) { // But first correct the name and tdname to contain the fully qualified scopename if (nsname && inclass) { scope = NewStringf("%s::%s", nsname, Getattr(inclass, "name")); } else if (nsname) { scope = NewStringf("%s", nsname); } else if (inclass) { scope = NewStringf("%s", Getattr(inclass, "name")); } String *nname = NewStringf("%s::%s", scope, name); Setattr(n, "name", nname); String *tdname = Getattr(n, "tdname"); if (tdname) { tdname = NewStringf("%s::%s", scope, tdname); Setattr(n, "tdname", tdname); } SwigType *t = NewStringf("enum %s", nname); SwigType_typedef(t, name); } else { SwigType *t = NewStringf("enum %s", name); SwigType_typedef(t, name); } Delete(scope); } String *tdname = Getattr(n, "tdname"); String *unnamed = Getattr(n, "unnamed"); String *storage = Getattr(n, "storage"); // Construct enumtype - for declaring an enum of this type with SwigType_ltype() etc String *enumtype = 0; if (unnamed && tdname && (Cmp(storage, "typedef") == 0)) { enumtype = Copy(Getattr(n, "tdname")); } else if (name) { enumtype = NewStringf("%s%s", CPlusPlus ? "" : "enum ", Getattr(n, "name")); } else { // anonymous enums enumtype = Copy(Getattr(n, "type")); } Setattr(n, "enumtype", enumtype); if (nssymname) { if (GetFlag(n, "feature:nspace")) Setattr(n, "sym:nspace", nssymname); } // This block of code is for dealing with %ignore on an enum item where the target language // attempts to use the C enum value in the target language itself and expects the previous enum value // to be one more than the previous value... the previous enum item might not exist if it is ignored! // - It sets the first non-ignored enum item with the "firstenumitem" attribute. // - It adds an enumvalue attribute if the previous enum item is ignored { Node *c; int count = 0; String *previous = 0; bool previous_ignored = false; bool firstenumitem = false; for (c = firstChild(n); c; c = nextSibling(c)) { assert(strcmp(Char(nodeType(c)), "enumitem") == 0); bool reset; String *enumvalue = Getattr(c, "enumvalue"); if (GetFlag(c, "feature:ignore") || !Getattr(c, "sym:name")) { reset = enumvalue ? true : false; previous_ignored = true; } else { if (!enumvalue && previous_ignored) { if (previous) Setattr(c, "enumvalue", NewStringf("(%s) + %d", previous, count+1)); else Setattr(c, "enumvalue", NewStringf("%d", count)); SetFlag(c, "virtenumvalue"); // identify enumvalue as virtual, ie not from the parsed source } if (!firstenumitem) { SetFlag(c, "firstenumitem"); firstenumitem = true; } reset = true; previous_ignored = false; } if (reset) { previous = enumvalue ? enumvalue : Getattr(c, "name"); count = 0; } else { count++; } } } emit_children(n); return SWIG_OK; } /* ------------------------------------------------------------ * enumvalueDeclaration() * ------------------------------------------------------------ */ virtual int enumvalueDeclaration(Node *n) { String *name = Getattr(n, "name"); String *value = Getattr(n, "value"); String *scopedenum = Getattr(parentNode(n), "scopedenum"); if (!value) value = name; if (Strcmp(value, name) == 0) { String *new_value; if ((nsname || inclass || scopedenum) && cparse_cplusplus) { new_value = NewStringf("%s::%s", SwigType_namestr(Swig_symbol_qualified(n)), value); } else { new_value = NewString(value); } if ((nsname || inclass || scopedenum) && !cparse_cplusplus) { String *cppvalue = NewStringf("%s::%s", SwigType_namestr(Swig_symbol_qualified(n)), value); Setattr(n, "cppvalue", cppvalue); /* for target languages that always generate C++ code even when wrapping C code */ } Setattr(n, "value", new_value); Delete(new_value); } Node *next = nextSibling(n); // Make up an enumvalue if one was not specified in the parsed code (not designed to be used on enum items and %ignore - enumvalue will be set instead) if (!GetFlag(n, "feature:ignore")) { if (Getattr(n, "_last") && !Getattr(n, "enumvalue")) { // Only the first enum item has _last set (Note: first non-ignored enum item has firstenumitem set) Setattr(n, "enumvalueex", "0"); } if (next && !Getattr(next, "enumvalue")) { Setattr(next, "enumvalueex", NewStringf("%s + 1", Getattr(n, "sym:name"))); } } return SWIG_OK; } /* ------------------------------------------------------------ * enumforwardDeclaration() * ------------------------------------------------------------ */ virtual int enumforwardDeclaration(Node *n) { // Use enumDeclaration() to do all the hard work. // Note that no children can be emitted in a forward declaration as there aren't any. int result = enumDeclaration(n); if (result == SWIG_OK) { // Detect when the real enum matching the forward enum declaration has not been parsed/declared SwigType *ty = SwigType_typedef_resolve_all(Getattr(n, "type")); Replaceall(ty, "enum ", ""); Node *nn = Swig_symbol_clookup(ty, 0); String *nodetype = nn ? nodeType(nn) : 0; if (nodetype) { if (Equal(nodetype, "enumforward")) { SetFlag(nn, "enumMissing"); } // if a real enum was declared this would be an "enum" node type } Delete(ty); } return result; } #ifdef DEBUG_OVERLOADED static void show_overloaded(Node *n) { Node *c = Getattr(n, "sym:overloaded"); Node *checkoverloaded = c; Printf(stdout, "-------------------- overloaded start %s sym:overloaded():%p -------------------------------\n", Getattr(n, "name"), c); while (c) { if (Getattr(c, "error")) { c = Getattr(c, "sym:nextSibling"); continue; } if (Getattr(c, "sym:overloaded") != checkoverloaded) { Printf(stdout, "sym:overloaded error c:%p checkoverloaded:%p\n", c, checkoverloaded); Swig_print_node(c); SWIG_exit(EXIT_FAILURE); } String *decl = Strcmp(nodeType(c), "using") == 0 ? NewString("------") : Getattr(c, "decl"); Printf(stdout, " show_overloaded %s::%s(%s) [%s] nodeType:%s\n", parentNode(c) ? Getattr(parentNode(c), "name") : "NOPARENT", Getattr(c, "name"), decl, Getattr(c, "sym:overname"), nodeType(c)); if (!Getattr(c, "sym:overloaded")) { Printf(stdout, "sym:overloaded error.....%p\n", c); Swig_print_node(c); SWIG_exit(EXIT_FAILURE); } c = Getattr(c, "sym:nextSibling"); } Printf(stdout, "-------------------- overloaded end %s -------------------------------\n", Getattr(n, "name")); } #endif /* ------------------------------------------------------------ * usingDeclaration() * ------------------------------------------------------------ */ virtual int usingDeclaration(Node *n) { if (Getattr(n, "namespace")) { /* using namespace id */ /* For a namespace import. We set up inheritance in the type system */ Node *ns = Getattr(n, "node"); if (ns) { Typetab *ts = Getattr(ns, "typescope"); if (ts) { SwigType_using_scope(ts); } } return SWIG_OK; } else { Node *ns; /* using id */ Symtab *stab = Getattr(n, "sym:symtab"); if (stab) { String *uname = Getattr(n, "uname"); ns = Swig_symbol_clookup(uname, stab); if (!ns && SwigType_istemplate(uname)) { String *tmp = Swig_symbol_template_deftype(uname, 0); if (!Equal(tmp, uname)) { ns = Swig_symbol_clookup(tmp, stab); } Delete(tmp); } } else { ns = 0; } if (!ns) { if (is_public(n)) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(n), Getline(n), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(n, "uname"))); } } else { /* Only a single symbol is being used. There are only a few symbols that we actually care about. These are typedef, class declarations, and enum */ String *ntype = nodeType(ns); if (Strcmp(ntype, "cdecl") == 0) { if (checkAttribute(ns, "storage", "typedef")) { /* A typedef declaration */ String *uname = Getattr(n, "uname"); SwigType_typedef_using(uname); } else { /* A normal C declaration. */ if ((inclass) && (!GetFlag(n, "feature:ignore")) && (Getattr(n, "sym:name"))) { Node *c = ns; Node *unodes = 0, *last_unodes = 0; int ccount = 0; String *symname = Getattr(n, "sym:name"); while (c) { if (Strcmp(nodeType(c), "cdecl") == 0) { if (!(Swig_storage_isstatic(c) || checkAttribute(c, "storage", "typedef") || checkAttribute(c, "storage", "friend") || (Getattr(c, "feature:extend") && !Getattr(c, "code")) || GetFlag(c, "feature:ignore"))) { /* Don't generate a method if the method is overridden in this class, * for example don't generate another m(bool) should there be a Base::m(bool) : * struct Derived : Base { * void m(bool); * using Base::m; * }; */ String *csymname = Getattr(c, "sym:name"); if (!csymname || (Strcmp(csymname, symname) == 0)) { { String *decl = Getattr(c, "decl"); Node *over = Getattr(n, "sym:overloaded"); int match = 0; while (over) { String *odecl = Getattr(over, "decl"); if (Cmp(decl, odecl) == 0) { match = 1; break; } over = Getattr(over, "sym:nextSibling"); } if (match) { c = Getattr(c, "csym:nextSibling"); continue; } } Node *nn = copyNode(c); Delattr(nn, "access"); // access might be different from the method in the base class Setattr(nn, "access", Getattr(n, "access")); if (!Getattr(nn, "sym:name")) Setattr(nn, "sym:name", symname); if (!GetFlag(nn, "feature:ignore")) { ParmList *parms = CopyParmList(Getattr(c, "parms")); int is_pointer = SwigType_ispointer_return(Getattr(nn, "decl")); int is_void = checkAttribute(nn, "type", "void") && !is_pointer; Setattr(nn, "parms", parms); Delete(parms); if (Getattr(n, "feature:extend")) { String *ucode = is_void ? NewStringf("{ self->%s(", Getattr(n, "uname")) : NewStringf("{ return self->%s(", Getattr(n, "uname")); for (ParmList *p = parms; p;) { Append(ucode, Getattr(p, "name")); p = nextSibling(p); if (p) Append(ucode, ","); } Append(ucode, "); }"); Setattr(nn, "code", ucode); Delete(ucode); } ParmList *throw_parm_list = Getattr(c, "throws"); if (throw_parm_list) Setattr(nn, "throws", CopyParmList(throw_parm_list)); ccount++; if (!last_unodes) { last_unodes = nn; unodes = nn; } else { Setattr(nn, "previousSibling", last_unodes); Setattr(last_unodes, "nextSibling", nn); Setattr(nn, "sym:previousSibling", last_unodes); Setattr(last_unodes, "sym:nextSibling", nn); Setattr(nn, "sym:overloaded", unodes); Setattr(unodes, "sym:overloaded", unodes); last_unodes = nn; } } else { Delete(nn); } } } } c = Getattr(c, "csym:nextSibling"); } if (unodes) { set_firstChild(n, unodes); if (ccount > 1) { if (!Getattr(n, "sym:overloaded")) { Setattr(n, "sym:overloaded", n); Setattr(n, "sym:overname", "_SWIG_0"); } } } /* Hack the parse tree symbol table for overloaded methods. Replace the "using" node with the * list of overloaded methods we have just added in as child nodes to the "using" node. * The node will still exist, it is just the symbol table linked list of overloaded methods * which is hacked. */ if (Getattr(n, "sym:overloaded")) { int cnt = 0; #ifdef DEBUG_OVERLOADED Node *debugnode = n; show_overloaded(n); #endif if (!firstChild(n)) { // Remove from overloaded list ('using' node does not actually end up adding in any methods) Node *ps = Getattr(n, "sym:previousSibling"); Node *ns = Getattr(n, "sym:nextSibling"); if (ps) { Setattr(ps, "sym:nextSibling", ns); } if (ns) { Setattr(ns, "sym:previousSibling", ps); } } else { // The 'using' node results in methods being added in - slot in the these methods here Node *ps = Getattr(n, "sym:previousSibling"); Node *ns = Getattr(n, "sym:nextSibling"); Node *fc = firstChild(n); Node *pp = fc; Node *firstoverloaded = Getattr(n, "sym:overloaded"); if (firstoverloaded == n) { // This 'using' node we are cutting out was the first node in the overloaded list. // Change the first node in the list to its first sibling Delattr(firstoverloaded, "sym:overloaded"); Node *nnn = Getattr(firstoverloaded, "sym:nextSibling"); firstoverloaded = fc; while (nnn) { Setattr(nnn, "sym:overloaded", firstoverloaded); nnn = Getattr(nnn, "sym:nextSibling"); } } while (pp) { Node *ppn = Getattr(pp, "sym:nextSibling"); Setattr(pp, "sym:overloaded", firstoverloaded); Setattr(pp, "sym:overname", NewStringf("%s_%d", Getattr(n, "sym:overname"), cnt++)); if (ppn) pp = ppn; else break; } if (ps) { Setattr(ps, "sym:nextSibling", fc); Setattr(fc, "sym:previousSibling", ps); } if (ns) { Setattr(ns, "sym:previousSibling", pp); Setattr(pp, "sym:nextSibling", ns); } #ifdef DEBUG_OVERLOADED debugnode = firstoverloaded; #endif } Delattr(n, "sym:previousSibling"); Delattr(n, "sym:nextSibling"); Delattr(n, "sym:overloaded"); Delattr(n, "sym:overname"); #ifdef DEBUG_OVERLOADED show_overloaded(debugnode); #endif clean_overloaded(n); // Needed? } } } } else if ((Strcmp(ntype, "class") == 0) || ((Strcmp(ntype, "classforward") == 0))) { /* We install the using class name as kind of a typedef back to the original class */ String *uname = Getattr(n, "uname"); /* Import into current type scope */ SwigType_typedef_using(uname); } else if (Strcmp(ntype, "enum") == 0) { SwigType_typedef_using(Getattr(n, "uname")); } else if (Strcmp(ntype, "template") == 0) { SwigType_typedef_using(Getattr(n, "uname")); } } } return SWIG_OK; } /* ------------------------------------------------------------ * typemapDirective() * ------------------------------------------------------------ */ virtual int typemapDirective(Node *n) { if (inclass || nsname) { Node *items = firstChild(n); while (items) { Parm *pattern = Getattr(items, "pattern"); Parm *parms = Getattr(items, "parms"); normalize_later(pattern); normalize_later(parms); items = nextSibling(items); } } return SWIG_OK; } /* ------------------------------------------------------------ * typemapcopyDirective() * ------------------------------------------------------------ */ virtual int typemapcopyDirective(Node *n) { if (inclass || nsname) { Node *items = firstChild(n); ParmList *pattern = Getattr(n, "pattern"); normalize_later(pattern); while (items) { ParmList *npattern = Getattr(items, "pattern"); normalize_later(npattern); items = nextSibling(items); } } return SWIG_OK; } /* ------------------------------------------------------------ * applyDirective() * ------------------------------------------------------------ */ virtual int applyDirective(Node *n) { if (inclass || nsname) { ParmList *pattern = Getattr(n, "pattern"); normalize_later(pattern); Node *items = firstChild(n); while (items) { Parm *apattern = Getattr(items, "pattern"); normalize_later(apattern); items = nextSibling(items); } } return SWIG_OK; } /* ------------------------------------------------------------ * clearDirective() * ------------------------------------------------------------ */ virtual int clearDirective(Node *n) { if (inclass || nsname) { Node *p; for (p = firstChild(n); p; p = nextSibling(p)) { ParmList *pattern = Getattr(p, "pattern"); normalize_later(pattern); } } return SWIG_OK; } public: static void pass(Node *n) { TypePass t; t.top(n); } }; void Swig_process_types(Node *n) { if (!n) return; TypePass::pass(n); } swig-4.0.2/Source/Modules/python.cxx0000644000175000017500000062671513667507523017320 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * python.cxx * * Python language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include #include "cparse.h" #include #include #include "pydoc.h" #include #define PYSHADOW_MEMBER 0x2 #define WARN_PYTHON_MULTIPLE_INH 405 #define PYTHON_INT_MAX (2147483647) #define PYTHON_INT_MIN (-2147483647-1) static String *const_code = 0; static String *module = 0; static String *package = 0; static String *mainmodule = 0; static String *interface = 0; static String *global_name = 0; static int shadow = 1; static int use_kw = 0; static int director_method_index = 0; static int builtin = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_runtime_h = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_directors = 0; static File *f_directors_h = 0; static File *f_init = 0; static File *f_shadow_py = 0; static String *f_shadow = 0; static String *f_shadow_begin = 0; static Hash *f_shadow_imports = 0; static String *f_shadow_after_begin = 0; static String *f_shadow_stubs = 0; static Hash *builtin_getset = 0; static Hash *builtin_closures = 0; static Hash *class_members = 0; static File *f_builtins = 0; static String *builtin_tp_init = 0; static String *builtin_methods = 0; static String *builtin_default_unref = 0; static String *builtin_closures_code = 0; static String *methods; static String *methods_proxydocs; static String *class_name; static String *shadow_indent = 0; static int in_class = 0; static int no_header_file = 0; static int max_bases = 0; static int builtin_bases_needed = 0; static int py3 = 0; /* C++ Support + Shadow Classes */ static int have_constructor; static int have_repr; static String *real_classname; /* Thread Support */ static int threads = 0; static int nothreads = 0; /* Other options */ static int dirvtable = 0; static int doxygen = 0; static int fastunpack = 1; static int fastproxy = 0; static int olddefs = 0; static int castmode = 0; static int extranative = 0; static int nortti = 0; static int relativeimport = 0; /* flags for the make_autodoc function */ enum autodoc_t { AUTODOC_CLASS, AUTODOC_CTOR, AUTODOC_DTOR, AUTODOC_STATICFUNC, AUTODOC_FUNC, AUTODOC_METHOD, AUTODOC_CONST, AUTODOC_VAR }; static const char *usage1 = "\ Python Options (available with -python)\n\ -builtin - Create Python built-in types rather than proxy classes, for better performance\n\ -castmode - Enable the casting mode, which allows implicit cast between types in Python\n\ -debug-doxygen-parser - Display doxygen parser module debugging information\n\ -debug-doxygen-translator - Display doxygen translator module debugging information\n\ -dirvtable - Generate a pseudo virtual table for directors for faster dispatch\n\ -doxygen - Convert C++ doxygen comments to pydoc comments in proxy classes\n\ -extranative - Return extra native wrappers for C++ std containers wherever possible\n\ -fastproxy - Use fast proxy mechanism for member methods\n\ -globals - Set used to access C global variable (default: 'cvar')\n\ -interface - Set low-level C/C++ module name to (default: module name prefixed by '_')\n\ -keyword - Use keyword arguments\n"; static const char *usage2 = "\ -nofastunpack - Use traditional UnpackTuple method to parse the argument functions\n\ -noh - Don't generate the output header file\n"; static const char *usage3 = "\ -noproxy - Don't generate proxy classes\n\ -nortti - Disable the use of the native C++ RTTI with directors\n\ -nothreads - Disable thread support for the entire interface\n\ -olddefs - Keep the old method definitions when using -fastproxy\n\ -py3 - Generate code with Python 3 specific features and syntax\n\ -relativeimport - Use relative Python imports\n\ -threads - Add thread support for all the interface\n\ -O - Enable the following optimization options:\n\ -fastdispatch -fastproxy -fvirtual\n\ \n"; static String *getSlot(Node *n = NULL, const char *key = NULL, String *default_slot = NULL) { static String *zero = NewString("0"); String *val = n && key && *key ? Getattr(n, key) : NULL; return val ? val : default_slot ? default_slot : zero; } static void printSlot(File *f, String *slotval, const char *slotname, const char *functype = NULL) { String *slotval_override = 0; if (functype && Strcmp(slotval, "0") == 0) slotval = slotval_override = NewStringf("(%s) %s", functype, slotval); int len = Len(slotval); int fieldwidth = len > 41 ? (len > 61 ? 0 : 61 - len) : 41 - len; Printf(f, " %s,%*s/* %s */\n", slotval, fieldwidth, "", slotname); Delete(slotval_override); } static String *getClosure(String *functype, String *wrapper, int funpack = 0) { static const char *functypes[] = { "unaryfunc", "SWIGPY_UNARYFUNC_CLOSURE", "destructor", "SWIGPY_DESTRUCTOR_CLOSURE", "inquiry", "SWIGPY_INQUIRY_CLOSURE", "getiterfunc", "SWIGPY_GETITERFUNC_CLOSURE", "binaryfunc", "SWIGPY_BINARYFUNC_CLOSURE", "ternaryfunc", "SWIGPY_TERNARYFUNC_CLOSURE", "ternarycallfunc", "SWIGPY_TERNARYCALLFUNC_CLOSURE", "lenfunc", "SWIGPY_LENFUNC_CLOSURE", "ssizeargfunc", "SWIGPY_SSIZEARGFUNC_CLOSURE", "ssizessizeargfunc", "SWIGPY_SSIZESSIZEARGFUNC_CLOSURE", "ssizeobjargproc", "SWIGPY_SSIZEOBJARGPROC_CLOSURE", "ssizessizeobjargproc", "SWIGPY_SSIZESSIZEOBJARGPROC_CLOSURE", "objobjproc", "SWIGPY_OBJOBJPROC_CLOSURE", "objobjargproc", "SWIGPY_OBJOBJARGPROC_CLOSURE", "reprfunc", "SWIGPY_REPRFUNC_CLOSURE", "hashfunc", "SWIGPY_HASHFUNC_CLOSURE", "iternextfunc", "SWIGPY_ITERNEXTFUNC_CLOSURE", NULL }; static const char *funpack_functypes[] = { "unaryfunc", "SWIGPY_UNARYFUNC_CLOSURE", "destructor", "SWIGPY_DESTRUCTOR_CLOSURE", "inquiry", "SWIGPY_INQUIRY_CLOSURE", "getiterfunc", "SWIGPY_GETITERFUNC_CLOSURE", "ternaryfunc", "SWIGPY_TERNARYFUNC_CLOSURE", "ternarycallfunc", "SWIGPY_TERNARYCALLFUNC_CLOSURE", "lenfunc", "SWIGPY_LENFUNC_CLOSURE", "ssizeargfunc", "SWIGPY_FUNPACK_SSIZEARGFUNC_CLOSURE", "ssizessizeargfunc", "SWIGPY_SSIZESSIZEARGFUNC_CLOSURE", "ssizeobjargproc", "SWIGPY_SSIZEOBJARGPROC_CLOSURE", "ssizessizeobjargproc", "SWIGPY_SSIZESSIZEOBJARGPROC_CLOSURE", "objobjproc", "SWIGPY_FUNPACK_OBJOBJPROC_CLOSURE", "objobjargproc", "SWIGPY_OBJOBJARGPROC_CLOSURE", "reprfunc", "SWIGPY_REPRFUNC_CLOSURE", "hashfunc", "SWIGPY_HASHFUNC_CLOSURE", "iternextfunc", "SWIGPY_ITERNEXTFUNC_CLOSURE", NULL }; if (!functype) return NULL; char *c = Char(functype); int i; if (funpack) { for (i = 0; funpack_functypes[i] != NULL; i += 2) { if (!strcmp(c, funpack_functypes[i])) return NewStringf("%s(%s)", funpack_functypes[i + 1], wrapper); } } else { for (i = 0; functypes[i] != NULL; i += 2) { if (!strcmp(c, functypes[i])) return NewStringf("%s(%s)", functypes[i + 1], wrapper); } } return NULL; } class PYTHON:public Language { public: PYTHON() { /* Add code to manage protected constructors and directors */ director_prot_ctor_code = NewString(""); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " SWIG_SetErrorMsg(PyExc_RuntimeError,\"accessing abstract class or protected constructor\"); \n", " SWIG_fail;\n", "}\n", NIL); director_multiple_inheritance = 1; director_language = 1; } ~PYTHON() { delete doxygenTranslator; } /* ------------------------------------------------------------ * Thread Implementation * ------------------------------------------------------------ */ int threads_enable(Node *n) const { return threads && !GetFlagAttr(n, "feature:nothread"); } int initialize_threads(String *f_init) { if (!threads) { return SWIG_OK; } Printf(f_init, "\n"); Printf(f_init, "/* Initialize threading */\n"); Printf(f_init, "SWIG_PYTHON_INITIALIZE_THREADS;\n"); return SWIG_OK; } virtual void thread_begin_block(Node *n, String *f) { if (!GetFlag(n, "feature:nothreadblock")) { String *bb = Getattr(n, "feature:threadbeginblock"); if (bb) { Append(f, bb); } else { Append(f, "SWIG_PYTHON_THREAD_BEGIN_BLOCK;\n"); } } } virtual void thread_end_block(Node *n, String *f) { if (!GetFlag(n, "feature:nothreadblock")) { String *eb = Getattr(n, "feature:threadendblock"); if (eb) { Append(f, eb); } else { Append(f, "SWIG_PYTHON_THREAD_END_BLOCK;\n"); } } } virtual void thread_begin_allow(Node *n, String *f) { if (!GetFlag(n, "feature:nothreadallow")) { String *bb = Getattr(n, "feature:threadbeginallow"); Append(f, "{\n"); if (bb) { Append(f, bb); } else { Append(f, "SWIG_PYTHON_THREAD_BEGIN_ALLOW;\n"); } } } virtual void thread_end_allow(Node *n, String *f) { if (!GetFlag(n, "feature:nothreadallow")) { String *eb = Getattr(n, "feature:threadendallow"); Append(f, "\n"); if (eb) { Append(f, eb); } else { Append(f, "SWIG_PYTHON_THREAD_END_ALLOW;"); } Append(f, "\n}"); } } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("python"); int doxygen_translator_flags = 0; for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-interface") == 0) { if (argv[i + 1]) { interface = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } /* end added */ } else if (strcmp(argv[i], "-globals") == 0) { if (argv[i + 1]) { global_name = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-shadow") == 0) || ((strcmp(argv[i], "-proxy") == 0))) { shadow = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-noproxy") == 0)) { shadow = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-keyword") == 0) { use_kw = 1; SWIG_cparse_set_compact_default_args(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nortti") == 0) { nortti = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-threads") == 0) { threads = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nothreads") == 0) { /* Turn off thread support mode */ nothreads = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dirvtable") == 0) { dirvtable = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-doxygen") == 0) { doxygen = 1; scan_doxygen_comments = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-doxygen-translator") == 0) { doxygen_translator_flags |= DoxygenTranslator::debug_translator; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-doxygen-parser") == 0) { doxygen_translator_flags |= DoxygenTranslator::debug_parser; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nofastunpack") == 0) { fastunpack = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-fastproxy") == 0) { fastproxy = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-olddefs") == 0) { olddefs = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-castmode") == 0) { castmode = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-extranative") == 0) { extranative = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noh") == 0) { no_header_file = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-newvwm") == 0) { /* Turn on new value wrapper mode */ /* Undocumented option, did have -help text: New value wrapper mode, use only when everything else fails */ Swig_value_wrapper_mode(1); no_header_file = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-O") == 0) { fastproxy = 1; Wrapper_fast_dispatch_mode_set(1); Wrapper_virtual_elimination_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage1, stdout); fputs(usage2, stdout); fputs(usage3, stdout); } else if (strcmp(argv[i], "-py3") == 0) { py3 = 1; Preprocessor_define("SWIGPYTHON_PY3", 0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-builtin") == 0) { builtin = 1; Preprocessor_define("SWIGPYTHON_BUILTIN", 0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-relativeimport") == 0) { relativeimport = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-cppcast") == 0 || strcmp(argv[i], "-fastinit") == 0 || strcmp(argv[i], "-fastquery") == 0 || strcmp(argv[i], "-fastunpack") == 0 || strcmp(argv[i], "-modern") == 0 || strcmp(argv[i], "-modernargs") == 0 || strcmp(argv[i], "-noproxydel") == 0 || strcmp(argv[i], "-safecstrings") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is now always on.\n", argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i], "-aliasobj0") == 0 || strcmp(argv[i], "-buildnone") == 0 || strcmp(argv[i], "-classic") == 0 || strcmp(argv[i], "-classptr") == 0 || strcmp(argv[i], "-new_repr") == 0 || strcmp(argv[i], "-new_vwm") == 0 || strcmp(argv[i], "-newrepr") == 0 || strcmp(argv[i], "-noaliasobj0") == 0 || strcmp(argv[i], "-nobuildnone") == 0 || strcmp(argv[i], "-nocastmode") == 0 || strcmp(argv[i], "-nocppcast") == 0 || strcmp(argv[i], "-nodirvtable") == 0 || strcmp(argv[i], "-noextranative") == 0 || strcmp(argv[i], "-nofastinit") == 0 || strcmp(argv[i], "-nofastproxy") == 0 || strcmp(argv[i], "-nofastquery") == 0 || strcmp(argv[i], "-nomodern") == 0 || strcmp(argv[i], "-nomodernargs") == 0 || strcmp(argv[i], "-noolddefs") == 0 || strcmp(argv[i], "-nooutputtuple") == 0 || strcmp(argv[i], "-noproxyimport") == 0 || strcmp(argv[i], "-nosafecstrings") == 0 || strcmp(argv[i], "-old_repr") == 0 || strcmp(argv[i], "-oldrepr") == 0 || strcmp(argv[i], "-outputtuple") == 0 || strcmp(argv[i], "-proxydel") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is no longer supported.\n", argv[i]); Swig_mark_arg(i); SWIG_exit(EXIT_FAILURE); } } } if (doxygen) doxygenTranslator = new PyDocConverter(doxygen_translator_flags); if (!global_name) global_name = NewString("cvar"); Preprocessor_define("SWIGPYTHON 1", 0); SWIG_typemap_lang("python"); SWIG_config_file("python.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. */ String *mod_docstring = NULL; String *moduleimport = NULL; { Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options) { int dirprot = 0; if (Getattr(options, "dirprot")) { dirprot = 1; } if (Getattr(options, "nodirprot")) { dirprot = 0; } if (Getattr(options, "directors")) { allow_directors(); if (dirprot) allow_dirprot(); } if (Getattr(options, "threads")) { threads = 1; } if (Getattr(options, "castmode")) { castmode = 1; } if (Getattr(options, "nocastmode")) { Printf(stderr, "Deprecated module option: %s. This option is no longer supported.\n", "nocastmode"); SWIG_exit(EXIT_FAILURE); } if (Getattr(options, "extranative")) { extranative = 1; } if (Getattr(options, "noextranative")) { Printf(stderr, "Deprecated module option: %s. This option is no longer supported.\n", "noextranative"); SWIG_exit(EXIT_FAILURE); } if (Getattr(options, "outputtuple")) { Printf(stderr, "Deprecated module option: %s. This option is no longer supported.\n", "outputtuple"); SWIG_exit(EXIT_FAILURE); } if (Getattr(options, "nooutputtuple")) { Printf(stderr, "Deprecated module option: %s. This option is no longer supported.\n", "nooutputtuple"); SWIG_exit(EXIT_FAILURE); } mod_docstring = Getattr(options, "docstring"); package = Getattr(options, "package"); moduleimport = Getattr(options, "moduleimport"); } } } /* Set comparison with none for ConstructorToFunction */ setSubclassInstanceCheck(NewString("$arg != Py_None")); /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = !no_header_file ? Getattr(n, "outfile_h") : 0; f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); builtin_getset = NewHash(); builtin_closures = NewHash(); builtin_closures_code = NewString(""); class_members = NewHash(); builtin_methods = NewString(""); builtin_default_unref = NewString("delete $self;"); if (builtin) { f_builtins = NewString(""); } if (directorsEnabled()) { if (!no_header_file) { f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } else { f_runtime_h = f_runtime; } } /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); const_code = NewString(""); methods = NewString(""); methods_proxydocs = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGPYTHON\n#define SWIGPYTHON\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } if (nothreads) { Printf(f_runtime, "#define SWIG_PYTHON_NO_THREADS\n"); } else if (threads) { Printf(f_runtime, "#define SWIG_PYTHON_THREADS\n"); } if (!dirvtable) { Printf(f_runtime, "#define SWIG_PYTHON_DIRECTOR_NO_VTABLE\n"); } if (nortti) { Printf(f_runtime, "#ifndef SWIG_DIRECTOR_NORTTI\n"); Printf(f_runtime, "#define SWIG_DIRECTOR_NORTTI\n"); Printf(f_runtime, "#endif\n"); } if (castmode) { Printf(f_runtime, "#define SWIG_CASTRANK_MODE\n"); Printf(f_runtime, "#define SWIG_PYTHON_CAST_MODE\n"); } if (extranative) { Printf(f_runtime, "#define SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS\n"); } if (builtin) { Printf(f_runtime, "#define SWIGPYTHON_BUILTIN\n"); } Printf(f_runtime, "\n"); Printf(f_header, "#ifdef SWIG_TypeQuery\n"); Printf(f_header, "# undef SWIG_TypeQuery\n"); Printf(f_header, "#endif\n"); Printf(f_header, "#define SWIG_TypeQuery SWIG_Python_TypeQuery\n"); /* Set module name */ module = Copy(Getattr(n, "name")); mainmodule = Getattr(n, "name"); if (directorsEnabled()) { Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module); if (dirprot_mode()) { Printf(f_directors_h, "#include \n"); Printf(f_directors_h, "#include \n\n"); } Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } } /* If shadow classing is enabled, we're going to change the module name to "_module" */ String *default_import_code = NewString(""); if (shadow) { String *filen = NewStringf("%s%s.py", SWIG_output_directory(), Char(module)); // If we don't have an interface then change the module name X to _X if (interface) module = interface; else Insert(module, 0, "_"); if ((f_shadow_py = NewFile(filen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Delete(filen); filen = NULL; f_shadow = NewString(""); f_shadow_begin = NewString(""); f_shadow_imports = NewHash(); f_shadow_after_begin = NewString(""); f_shadow_stubs = NewString(""); Swig_register_filebyname("shadow", f_shadow); Swig_register_filebyname("python", f_shadow); if (!builtin) { /* Import the low-level C/C++ module. This should be a relative import, * since the shadow module may also have been imported by a relative * import, and there is thus no guarantee that the low-level C/C++ module is on * sys.path. Relative imports must be explicitly specified from 2.6.0 * onwards (implicit relative imports raised a DeprecationWarning in 2.6, * and fail in 2.7 onwards). * * First check for __package__ which is available from 2.6 onwards, see PEP366. * Next try determine the shadow wrapper's package based on the __name__ it * was given by the importer that loaded it. * If the module is in a package, load the low-level C/C++ module from the * same package, otherwise load it as a global module. */ Printv(default_import_code, "# Import the low-level C/C++ module\n", NULL); Printv(default_import_code, "if __package__ or \".\" in __name__:\n", NULL); Printv(default_import_code, tab4, "from . import ", module, "\n", NULL); Printv(default_import_code, "else:\n", NULL); Printv(default_import_code, tab4, "import ", module, "\n", NULL); } else { Printv(default_import_code, "# Pull in all the attributes from the low-level C/C++ module\n", NULL); Printv(default_import_code, "if __package__ or \".\" in __name__:\n", NULL); Printv(default_import_code, tab4, "from .", module, " import *\n", NULL); Printv(default_import_code, "else:\n", NULL); Printv(default_import_code, tab4, "from ", module, " import *\n", NULL); } /* Need builtins to qualify names like Exception that might also be defined in this module (try both Python 3 and Python 2 names) */ Printv(f_shadow, "try:\n", tab4, "import builtins as __builtin__\n", "except ImportError:\n", tab4, "import __builtin__\n", NULL); if (!builtin && fastproxy) { Printf(f_shadow, "\n"); Printf(f_shadow, "_swig_new_instance_method = %s.SWIG_PyInstanceMethod_New\n", module); Printf(f_shadow, "_swig_new_static_method = %s.SWIG_PyStaticMethod_New\n", module); } Printv(f_shadow, "\n", "def _swig_repr(self):\n", tab4, "try:\n", tab4, tab4, "strthis = \"proxy of \" + self.this.__repr__()\n", tab4, "except __builtin__.Exception:\n", tab4, tab4, "strthis = \"\"\n", tab4, "return \"<%s.%s; %s >\" % (self.__class__.__module__, self.__class__.__name__, strthis,)\n\n", NIL); Printv(f_shadow, "\n", "def _swig_setattr_nondynamic_instance_variable(set):\n", tab4, "def set_instance_attr(self, name, value):\n", #ifdef USE_THISOWN tab4, tab4, "if name in (\"this\", \"thisown\"):\n", tab4, tab4, tab4, "set(self, name, value)\n", #else tab4, tab4, "if name == \"thisown\":\n", tab4, tab4, tab4, "self.this.own(value)\n", tab4, tab4, "elif name == \"this\":\n", tab4, tab4, tab4, "set(self, name, value)\n", #endif tab4, tab4, "elif hasattr(self, name) and isinstance(getattr(type(self), name), property):\n", tab4, tab4, tab4, "set(self, name, value)\n", tab4, tab4, "else:\n", tab4, tab4, tab4, "raise AttributeError(\"You cannot add instance attributes to %s\" % self)\n", tab4, "return set_instance_attr\n\n", NIL); Printv(f_shadow, "\n", "def _swig_setattr_nondynamic_class_variable(set):\n", tab4, "def set_class_attr(cls, name, value):\n", tab4, tab4, "if hasattr(cls, name) and not isinstance(getattr(cls, name), property):\n", tab4, tab4, tab4, "set(cls, name, value)\n", tab4, tab4, "else:\n", tab4, tab4, tab4, "raise AttributeError(\"You cannot add class attributes to %s\" % cls)\n", tab4, "return set_class_attr\n\n", NIL); Printv(f_shadow, "\n", "def _swig_add_metaclass(metaclass):\n", tab4, "\"\"\"Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass\"\"\"\n", tab4, "def wrapper(cls):\n", tab4, tab4, "return metaclass(cls.__name__, cls.__bases__, cls.__dict__.copy())\n", tab4, "return wrapper\n\n", NIL); Printv(f_shadow, "\n", "class _SwigNonDynamicMeta(type):\n", tab4, "\"\"\"Meta class to enforce nondynamic attributes (no new attributes) for a class\"\"\"\n", tab4, "__setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__)\n", "\n", NIL); Printv(f_shadow, "\n", NIL); if (directorsEnabled()) { Printv(f_shadow, "import weakref\n\n", NIL); } } // Include some information in the code Printf(f_header, "\n/*-----------------------------------------------\n @(target):= %s.so\n\ ------------------------------------------------*/\n", module); Printf(f_header, "#if PY_VERSION_HEX >= 0x03000000\n"); Printf(f_header, "# define SWIG_init PyInit_%s\n\n", module); Printf(f_header, "#else\n"); Printf(f_header, "# define SWIG_init init%s\n\n", module); Printf(f_header, "#endif\n"); Printf(f_header, "#define SWIG_name \"%s\"\n", module); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n"); Append(const_code, "static swig_const_info swig_const_table[] = {\n"); Append(methods, "static PyMethodDef SwigMethods[] = {\n"); Append(methods_proxydocs, "static PyMethodDef SwigMethods_proxydocs[] = {\n"); /* the method exported for replacement of new.instancemethod in Python 3 */ add_pyinstancemethod_new(); add_pystaticmethod_new(); if (builtin) { SwigType *s = NewString("SwigPyObject"); SwigType_add_pointer(s); SwigType_remember(s); Delete(s); } /* emit code */ Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } /* Close language module */ Append(methods, "\t { NULL, NULL, 0, NULL }\n"); Append(methods, "};\n"); Printf(f_wrappers, "%s\n", methods); Append(methods_proxydocs, "\t { NULL, NULL, 0, NULL }\n"); Append(methods_proxydocs, "};\n"); Printf(f_wrappers, "%s\n", methods_proxydocs); if (builtin) { Dump(f_builtins, f_wrappers); } SwigType_emit_type_table(f_runtime, f_wrappers); Append(const_code, "{0, 0, 0, 0.0, 0, 0}};\n"); Printf(f_wrappers, "%s\n", const_code); initialize_threads(f_init); Printf(f_init, "#if PY_VERSION_HEX >= 0x03000000\n"); Printf(f_init, " return m;\n"); Printf(f_init, "#else\n"); Printf(f_init, " return;\n"); Printf(f_init, "#endif\n"); Printf(f_init, "}\n"); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); if (shadow) { Swig_banner_target_lang(f_shadow_py, "#"); if (mod_docstring) { if (Len(mod_docstring)) { const char *triple_double = "\"\"\""; // follow PEP257 rules: https://www.python.org/dev/peps/pep-0257/ // reported by pep257: https://github.com/GreenSteam/pep257 bool multi_line_ds = Strchr(mod_docstring, '\n') != 0; Printv(f_shadow_py, "\n", triple_double, multi_line_ds ? "\n":"", mod_docstring, multi_line_ds ? "\n":"", triple_double, "\n", NIL); } Delete(mod_docstring); mod_docstring = NULL; } if (Len(f_shadow_begin) > 0) Printv(f_shadow_py, "\n", f_shadow_begin, "\n", NIL); Printv(f_shadow_py, "\nfrom sys import version_info as _swig_python_version_info\n", NULL); Printv(f_shadow_py, "if _swig_python_version_info < (2, 7, 0):\n", NULL); Printv(f_shadow_py, tab4, "raise RuntimeError(\"Python 2.7 or later required\")\n\n", NULL); if (Len(f_shadow_after_begin) > 0) Printv(f_shadow_py, f_shadow_after_begin, "\n", NIL); if (moduleimport) { Replaceall(moduleimport, "$module", module); Printv(f_shadow_py, moduleimport, "\n", NIL); } else { Printv(f_shadow_py, default_import_code, NIL); } Printv(f_shadow_py, "\n", f_shadow, "\n", NIL); Printv(f_shadow_py, f_shadow_stubs, "\n", NIL); Delete(f_shadow_py); } /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); if (f_runtime_h != f_begin) Delete(f_runtime_h); Dump(f_directors, f_begin); } Dump(f_wrappers, f_begin); if (builtin && builtin_bases_needed) Printf(f_begin, "static PyTypeObject *builtin_bases[%d];\n\n", max_bases + 2); Wrapper_pretty_print(f_init, f_begin); Delete(default_import_code); Delete(f_shadow_after_begin); Delete(f_shadow_imports); Delete(f_shadow_begin); Delete(f_shadow); Delete(f_header); Delete(f_wrappers); Delete(f_builtins); Delete(f_init); Delete(f_directors); Delete(f_directors_h); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------ * Emit the wrapper for PyInstanceMethod_New to MethodDef array. * This wrapper is used to implement -fastproxy, * as a replacement of new.instancemethod in Python 3. * ------------------------------------------------------------ */ int add_pyinstancemethod_new() { String *name = NewString("SWIG_PyInstanceMethod_New"); String *line = NewString(""); Printf(line, "\t { \"%s\", %s, METH_O, NULL},\n", name, name); Append(methods, line); if (fastproxy) { Append(methods_proxydocs, line); } Delete(line); Delete(name); return 0; } /* ------------------------------------------------------------ * Emit the wrapper for PyStaticMethod_New to MethodDef array. * This wrapper is used to ensure the correct documentation is * generated for static methods when using -fastproxy * ------------------------------------------------------------ */ int add_pystaticmethod_new() { if (fastproxy) { String *name = NewString("SWIG_PyStaticMethod_New"); String *line = NewString(""); Printf(line, "\t { \"%s\", %s, METH_O, NULL},\n", name, name); Append(methods, line); Append(methods_proxydocs, line); Delete(line); Delete(name); } return 0; } /* ------------------------------------------------------------ * subpkg_tail() * * Return the name of 'other' package relative to 'base'. * * 1. If 'other' is a sub-package of 'base', returns the 'other' relative to * 'base'. * 2. If 'other' and 'base' are equal, returns empty string "". * 3. In any other case, NULL pointer is returned. * * The 'base' and 'other' are expected to be fully qualified names. * * NOTE: none of 'base' nor 'other' can be null. * * Examples: * * # base other tail * -- ---- ----- ---- * 1 "Foo" "Foo.Bar" -> "Bar" * 2 "Foo" "Foo." -> "" * 3 "Foo" "FooB.ar" -> NULL * 4 "Foo.Bar" "Foo.Bar" -> "" * 5 "Foo.Bar" "Foo" -> NULL * 6 "Foo.Bar" "Foo.Gez" -> NULL * * NOTE: the example #2 is actually a syntax error (at input). I believe * swig parser prevents us from this case happening here. * ------------------------------------------------------------ */ static String *subpkg_tail(const String *base, const String *other) { int baselen = Len(base); int otherlen = Len(other); if (Strncmp(other, base, baselen) == 0) { if ((baselen < otherlen) && (Char(other))[baselen] == '.') { return NewString((Char(other)) + baselen + 1); } else if (baselen == otherlen) { return NewString(""); } else { return 0; } } else { return 0; } } /* ------------------------------------------------------------ * abs_import_directive_string() * * Return a string containing python code to import module. * * pkg package name or the module being imported * mod module name of the module being imported * pfx optional prefix to module name * * NOTE: keep this function consistent with abs_import_name_string(). * ------------------------------------------------------------ */ static String *abs_import_directive_string(const String *pkg, const String *mod, const char *pfx = "") { String *out = NewString(""); if (pkg && *Char(pkg)) { Printf(out, "import %s.%s%s\n", pkg, pfx, mod); } else { Printf(out, "import %s%s\n", pfx, mod); } return out; } /* ------------------------------------------------------------ * rel_import_directive_string() * * Return a string containing python code to import module that * is potentially within a package. * * mainpkg package name of the module which imports the other module * pkg package name or the module being imported * mod module name of the module being imported * pfx optional prefix to module name * * NOTE: keep this function consistent with rel_import_name_string(). * ------------------------------------------------------------ */ static String *rel_import_directive_string(const String *mainpkg, const String *pkg, const String *mod, const char *pfx = "") { /* NOTE: things are not so trivial. This is what we do here (by examples): * * 0. To import module 'foo', which is not in any package, we do absolute * import: * * import foo * * 1. To import 'pkg1.pkg2.foo', when mainpkg != "pkg1" and * mainpkg != "pkg1.pkg2" or when mainpkg is not given we do absolute * import: * * import pkg1.pkg2.foo * * 2. To import module pkg1.foo, when mainpkg == "pkg1", we do: * * - for py3 = 0: * * import foo * * - for py3 = 1: * * from . import foo * * 3. To import "pkg1.pkg2.pkg3.foo", when mainpkg = "pkg1", we do: * * - for py3 == 0: * * import pkg2.pkg3.foo * * - for py3 == 1: * * from . import pkg2 # [1] * import pkg1.pkg2.pkg3.foo * * NOTE: [1] is necessary for pkg2.foo to be present in the importing module */ String *apkg = 0; // absolute (FQDN) package name of pkg String *rpkg = 0; // relative package name int py3_rlen1 = 0; // length of 1st level sub-package name, used by py3 String *out = NewString(""); if (pkg && *Char(pkg)) { if (mainpkg) { String *tail = subpkg_tail(mainpkg, pkg); if (tail) { if (*Char(tail)) { rpkg = NewString(tail); const char *py3_end1 = Strchr(rpkg, '.'); if (!py3_end1) py3_end1 = (Char(rpkg)) + Len(rpkg); py3_rlen1 = (int)(py3_end1 - Char(rpkg)); } else { rpkg = NewString(""); } Delete(tail); } else { apkg = NewString(pkg); } } else { apkg = NewString(pkg); } } else { apkg = NewString(""); } if (apkg) { Printf(out, "import %s%s%s%s\n", apkg, *Char(apkg) ? "." : "", pfx, mod); Delete(apkg); } else { if (py3_rlen1) Printf(out, "from . import %.*s\n", py3_rlen1, rpkg); Printf(out, "from .%s import %s%s\n", rpkg, pfx, mod); Delete(rpkg); } return out; } /* ------------------------------------------------------------ * import_directive_string() * ------------------------------------------------------------ */ static String *import_directive_string(const String *mainpkg, const String *pkg, const String *mod, const char *pfx = "") { if (!relativeimport) { return abs_import_directive_string(pkg, mod, pfx); } else { return rel_import_directive_string(mainpkg, pkg, mod, pfx); } } /* ------------------------------------------------------------ * abs_import_name_string() * * Return a string with the name of a symbol (perhaps imported * from external module by absolute import directive). * * mainpkg package name of current module * mainmod module name of current module * pkg package name of (perhaps other) module * mod module name of (perhaps other) module * sym symbol name * * NOTE: mainmod, mod, and sym can't be NULL. * NOTE: keep this function consistent with abs_import_directive_string() * ------------------------------------------------------------ */ static String *abs_import_name_string(const String *mainpkg, const String *mainmod, const String *pkg, const String *mod, const String *sym) { String *out = NewString(""); if (pkg && *Char(pkg)) { if (mainpkg && *Char(mainpkg)) { if (Strcmp(mainpkg,pkg) != 0 || Strcmp(mainmod, mod) != 0) { Printf(out, "%s.%s.", pkg, mod); } } else { Printf(out, "%s.%s.", pkg, mod); } } else if ((mainpkg && *Char(mainpkg)) || Strcmp(mainmod, mod) != 0) { Printf(out, "%s.", mod); } Append(out, sym); return out; } /* ------------------------------------------------------------ * rel_import_name_string() * * Return a string with the name of a symbol (perhaps imported * from external module by relative import directive). * * mainpkg package name of current module * mainmod module name of current module * pkg package name of (perhaps other) module * mod module name of (perhaps other) module * sym symbol name * * NOTE: mainmod, mod, and sym can't be NULL. * NOTE: keep this function consistent with rel_import_directive_string() * ------------------------------------------------------------ */ static String *rel_import_name_string(const String *mainpkg, const String *mainmod, const String *pkg, const String *mod, const String *sym) { String *out = NewString(""); if (pkg && *Char(pkg)) { String *tail = 0; if (mainpkg) tail = subpkg_tail(mainpkg, pkg); if (!tail) tail = NewString(pkg); if (*Char(tail)) { Printf(out, "%s.%s.", tail, mod); } else if (Strcmp(mainmod, mod) != 0) { Printf(out, "%s.", mod); } Delete(tail); } else if ((mainpkg && *Char(mainpkg)) || Strcmp(mainmod, mod) != 0) { Printf(out, "%s.", mod); } Append(out, sym); return out; } /* ------------------------------------------------------------ * import_name_string() * ------------------------------------------------------------ */ static String *import_name_string(const String *mainpkg, const String *mainmod, const String *pkg, const String *mod, const String *sym) { if (!relativeimport) { return abs_import_name_string(mainpkg,mainmod,pkg,mod,sym); } else { return rel_import_name_string(mainpkg,mainmod,pkg,mod,sym); } } /* ------------------------------------------------------------ * importDirective() * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { if (shadow) { String *modname = Getattr(n, "module"); if (modname) { // Find the module node for this imported module. It should be the // first child but search just in case. Node *mod = firstChild(n); while (mod && Strcmp(nodeType(mod), "module") != 0) mod = nextSibling(mod); Node *options = Getattr(mod, "options"); String *pkg = options ? Getattr(options, "package") : 0; if (!options || (!Getattr(options, "noshadow") && !Getattr(options, "noproxy"))) { String *_import = import_directive_string(package, pkg, modname, "_"); if (!GetFlagAttr(f_shadow_imports, _import)) { String *import = import_directive_string(package, pkg, modname); Printf(builtin ? f_shadow_after_begin : f_shadow, "%s", import); Delete(import); SetFlag(f_shadow_imports, _import); } Delete(_import); } } } return Language::importDirective(n); } /* ------------------------------------------------------------ * funcCall() * * Emit shadow code to call a function in the extension * module. Using proper argument and calling style for * given node n. * ------------------------------------------------------------ */ String *funcCall(String *name, String *parms) { String *str = NewString(""); Printv(str, module, ".", name, "(", parms, ")", NIL); return str; } /* ------------------------------------------------------------ * indent_pythoncode() * * Format (indent) Python code. * Remove leading whitespace from 'code' and re-indent using * the indentation string in 'indent'. * ------------------------------------------------------------ */ String *indent_pythoncode(const String *code, const_String_or_char_ptr indent, String *file, int line, const char *directive_name) { String *out = NewString(""); String *temp; char *t; if (!indent) indent = ""; temp = NewString(code); t = Char(temp); if (*t == '{') { Delitem(temp, 0); Delitem(temp, DOH_END); } /* Split the input text into lines */ List *clist = SplitLines(temp); Delete(temp); // Line number within the pythoncode. int py_line = 0; String *initial = 0; Iterator si; /* Get the initial indentation. Skip lines which only contain whitespace * and/or a comment, as the indentation of those doesn't matter: * * A logical line that contains only spaces, tabs, formfeeds and * possibly a comment, is ignored (i.e., no NEWLINE token is * generated). * * see: * https://docs.python.org/2/reference/lexical_analysis.html#blank-lines * https://docs.python.org/3/reference/lexical_analysis.html#blank-lines */ for (si = First(clist); si.item; si = Next(si), ++py_line) { const char *c = Char(si.item); int i; for (i = 0; isspace((unsigned char)c[i]); i++) { // Scan forward until we find a non-space (which may be a null byte). } char ch = c[i]; if (ch && ch != '#') { // Found a line with actual content. initial = NewStringWithSize(c, i); break; } if (ch) { Printv(out, indent, c, NIL); } Putc('\n', out); } // Process remaining lines. for ( ; si.item; si = Next(si), ++py_line) { const char *c = Char(si.item); // If no prefixed line was found, the above loop should have completed. assert(initial); int i; for (i = 0; isspace((unsigned char)c[i]); i++) { // Scan forward until we find a non-space (which may be a null byte). } char ch = c[i]; if (!ch) { // Line is just whitespace - emit an empty line. Putc('\n', out); continue; } if (ch == '#') { // Comment - the indentation doesn't matter to python, but try to // adjust the whitespace for the benefit of human readers (though SWIG // currently seems to always remove any whitespace before a '#' before // we get here, in which case we'll just leave the comment at the start // of the line). if (i >= Len(initial)) { Printv(out, indent, NIL); } Printv(out, c + i, "\n", NIL); continue; } if (i < Len(initial)) { // There's non-whitespace in the initial prefix of this line. Swig_error(file, line, "Line indented less than expected (line %d of %s) as no line should be indented less than the indentation in line 1\n", py_line, directive_name); Printv(out, indent, c, "\n", NIL); } else { if (memcmp(c, Char(initial), Len(initial)) == 0) { // Prefix matches initial, so just remove it. Printv(out, indent, c + Len(initial), "\n", NIL); continue; } Swig_warning(WARN_PYTHON_INDENT_MISMATCH, file, line, "Whitespace indentation is inconsistent compared to earlier lines (line %d of %s)\n", py_line, directive_name); // To avoid gratuitously breaking interface files which worked with // SWIG <= 3.0.5, we remove a prefix of the same number of bytes for // lines which start with different whitespace to the line we got // 'initial' from. Printv(out, indent, c + Len(initial), "\n", NIL); } } Delete(clist); return out; } /* ------------------------------------------------------------ * indent_docstring() * * Format (indent) a Python docstring. * Remove leading whitespace from 'code' and re-indent using * the indentation string in 'indent'. * ------------------------------------------------------------ */ String *indent_docstring(const String *code, const_String_or_char_ptr indent) { String *out = NewString(""); String *temp; char *t; if (!indent) indent = ""; temp = NewString(code); t = Char(temp); if (*t == '{') { Delitem(temp, 0); Delitem(temp, DOH_END); } /* Split the input text into lines */ List *clist = SplitLines(temp); Delete(temp); Iterator si; int truncate_characters_count = INT_MAX; for (si = First(clist); si.item; si = Next(si)) { const char *c = Char(si.item); int i; for (i = 0; isspace((unsigned char)c[i]); i++) { // Scan forward until we find a non-space (which may be a null byte). } char ch = c[i]; if (ch) { // Found a line which isn't just whitespace if (i < truncate_characters_count) truncate_characters_count = i; } } if (truncate_characters_count == INT_MAX) truncate_characters_count = 0; for (si = First(clist); si.item; si = Next(si)) { const char *c = Char(si.item); int i; for (i = 0; isspace((unsigned char)c[i]); i++) { // Scan forward until we find a non-space (which may be a null byte). } char ch = c[i]; if (!ch) { // Line is just whitespace - emit an empty line. Putc('\n', out); continue; } Printv(out, indent, c + truncate_characters_count, "\n", NIL); } Delete(clist); return out; } /* ------------------------------------------------------------ * autodoc level declarations * ------------------------------------------------------------ */ enum autodoc_l { NO_AUTODOC = -2, // no autodoc STRING_AUTODOC = -1, // use provided string NAMES_AUTODOC = 0, // only parameter names TYPES_AUTODOC = 1, // parameter names and types EXTEND_AUTODOC = 2, // extended documentation and parameter names EXTEND_TYPES_AUTODOC = 3 // extended documentation and parameter types + names }; autodoc_l autodoc_level(String *autodoc) { autodoc_l dlevel = NO_AUTODOC; char *c = Char(autodoc); if (c) { if (isdigit(c[0])) { dlevel = (autodoc_l) atoi(c); } else { if (strcmp(c, "extended") == 0) { dlevel = EXTEND_AUTODOC; } else { dlevel = STRING_AUTODOC; } } } return dlevel; } /* ------------------------------------------------------------ * have_docstring() * * Check if there is a docstring directive and it has text, * or there is an autodoc flag set * ------------------------------------------------------------ */ bool have_docstring(Node *n) { String *str = Getattr(n, "feature:docstring"); return ((str && Len(str) > 0) || (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")) || (doxygen && doxygenTranslator->hasDocumentation(n)) ); } /* ------------------------------------------------------------ * build_combined_docstring() * * Build the full docstring which may be a combination of the * explicit docstring and autodoc string or, if none of them * is specified, obtained by translating Doxygen comment to * Python. * * Return new string to be deleted by caller (never NIL but * may be empty if there is no docstring). * ------------------------------------------------------------ */ String *build_combined_docstring(Node *n, autodoc_t ad_type, const String *indent = "", bool low_level = false) { String *docstr = Getattr(n, "feature:docstring"); if (docstr) { // Simplify the code below by just ignoring empty docstrings. if (!Len(docstr)) docstr = NULL; else docstr = Copy(docstr); } if (docstr) { char *t = Char(docstr); if (*t == '{') { Delitem(docstr, 0); Delitem(docstr, DOH_END); } } if (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")) { String *autodoc = make_autodoc(n, ad_type, low_level); if (autodoc && Len(autodoc) > 0) { if (docstr) { Append(autodoc, "\n"); Append(autodoc, docstr); } String *tmp = autodoc; autodoc = docstr; docstr = tmp; } Delete(autodoc); } if (!docstr) { if (doxygen) { docstr = Getattr(n, "python:docstring"); if (!docstr && doxygenTranslator->hasDocumentation(n)) { docstr = doxygenTranslator->getDocumentation(n, 0); // Avoid rebuilding it again the next time: notice that we can't do // this for the combined doc string as autodoc part of it depends on // the sym:name of the node and it is changed while handling it, so // the cached results become incorrect. But Doxygen docstring only // depends on the comment which is not going to change, so we can // safely cache it. Setattr(n, "python:docstring", Copy(docstr)); } else { // Must copy here since if the docstring is multi-line, the String* // here will get Deleted below, which is bad if it is a pointer to // the cached object! docstr = Copy(docstr); } } } if (!docstr) docstr = NewString(""); // If there is more than one line then make docstrings like this: // // """ // This is line1 // And here is line2 followed by the rest of them // """ // // otherwise, put it all on a single line if (Strchr(docstr, '\n')) { String *tmp = NewString(""); Append(tmp, "\n"); Append(tmp, indent_docstring(docstr, indent)); Append(tmp, indent); Delete(docstr); docstr = tmp; } return docstr; } /* ------------------------------------------------------------ * docstring() * * Get the docstring text, stripping off {} if necessary, * and enclose in triple double quotes. If autodoc is also * set then it will build a combined docstring. * ------------------------------------------------------------ */ String *docstring(Node *n, autodoc_t ad_type, const String *indent, bool low_level = false) { String *docstr = build_combined_docstring(n, ad_type, indent, low_level); const int len = Len(docstr); if (!len) return docstr; // Notice that all comments are created as raw strings (prefix "r"), // because '\' is used often in comments, but may break Python module from // loading. For example, in doxy comment one may write path in quotes: // // This is path to file "C:\x\file.txt" // // Python will not load the module with such comment because of illegal // escape '\x'. '\' may additionally appear in verbatim or htmlonly sections // of doxygen doc, Latex expressions, ... String *doc = NewString(""); // Determine which kind of quotes to use as delimiters: for single line // strings we can avoid problems with having a quote as the last character // of the docstring by using different kind of quotes as delimiters. For // multi-line strings this problem doesn't arise, as we always have a new // line or spaces at the end of it, but it still does no harm to do it for // them too. // // Note: we use double quotes by default, i.e. if there is no reason to // prefer using single ones, for consistency with the older SWIG versions. const bool useSingleQuotes = (Char(docstr))[len - 1] == '"'; Append(doc, useSingleQuotes ? "r'''" : "r\"\"\""); // We also need to avoid having triple quotes of whichever type we use, as // this would break Python doc string syntax too. Unfortunately there is no // way to have triple quotes inside of raw-triple-quoted string, so we have // to break the string in parts and rely on concatenation of the adjacent // string literals. if (useSingleQuotes) Replaceall(docstr, "'''", "''' \"'''\" '''"); else Replaceall(docstr, "\"\"\"", "\"\"\" '\"\"\"' \"\"\""); Append(doc, docstr); Append(doc, useSingleQuotes ? "'''" : "\"\"\""); Delete(docstr); return doc; } /* ------------------------------------------------------------ * cdocstring() * * Get the docstring text as it would appear in C-language * source code (but without quotes around it). * ------------------------------------------------------------ */ String *cdocstring(Node *n, autodoc_t ad_type, bool low_level = false) { String *ds = build_combined_docstring(n, ad_type, "", low_level); Replaceall(ds, "\\", "\\\\"); Replaceall(ds, "\"", "\\\""); Replaceall(ds, "\n", "\\n\"\n\t\t\""); return ds; } /* ----------------------------------------------------------------------------- * addMissingParameterNames() * * For functions that have not had nameless parameters set in the Language class. * * Inputs: * plist - entire parameter list * arg_num - the number to start from when naming arguments * Side effects: * The "lname" attribute in each parameter in plist will be contain a parameter name * ----------------------------------------------------------------------------- */ void addMissingParameterNames(Node *n, ParmList *plist, int arg_num) { Parm *p = plist; int i = arg_num; while (p) { if (!Getattr(p, "lname")) { String *name = makeParameterName(n, p, i); Setattr(p, "lname", name); Delete(name); } i++; p = nextSibling(p); } } /* ------------------------------------------------------------ * make_autodocParmList() * * Generate the documentation for the function parameters * Parameters: * arg_num: The number to start assigning unnamed arguments from * func_annotation: Function annotation support * ------------------------------------------------------------ */ String *make_autodocParmList(Node *n, bool showTypes, int arg_num = 1, bool calling = false, bool func_annotation = false) { String *doc = NewString(""); String *pdocs = 0; ParmList *plist = CopyParmList(Getattr(n, "parms")); Parm *p; Parm *pnext; if (calling) func_annotation = false; addMissingParameterNames(n, plist, arg_num); // for $1_name substitutions done in Swig_typemap_attach_parms Swig_typemap_attach_parms("in", plist, 0); Swig_typemap_attach_parms("doc", plist, 0); if (Strcmp(ParmList_protostr(plist), "void") == 0) { //No parameters actually return doc; } for (p = plist; p; p = pnext) { String *tm = Getattr(p, "tmap:in"); if (tm) { pnext = Getattr(p, "tmap:in:next"); if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } } else { pnext = nextSibling(p); } String *name = 0; String *type = 0; String *value = 0; String *pdoc = Getattr(p, "tmap:doc"); if (pdoc) { name = Getattr(p, "tmap:doc:name"); type = Getattr(p, "tmap:doc:type"); value = Getattr(p, "tmap:doc:value"); } // Skip the "self" argument - it is added to the parameter list automatically // and shouldn't be included in the Parameters block if (Getattr(p, "self")) { continue; } // Note: the generated name should be consistent with that in kwnames[] String *made_name = 0; if (!name) { name = made_name = makeParameterName(n, p, arg_num); } // Increment the argument number once we are sure this is a real argument to count arg_num++; type = type ? type : Getattr(p, "type"); value = value ? value : Getattr(p, "value"); if (SwigType_isvarargs(type)) { Delete(made_name); break; } if (Len(doc)) { // add a comma to the previous one if any Append(doc, ", "); } // Do the param type too? Node *nn = classLookup(Getattr(p, "type")); String *type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); if (showTypes) Printf(doc, "%s ", type_str); Append(doc, name); if (pdoc) { if (!pdocs) // numpydoc style: https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt pdocs = NewString("\nParameters\n----------\n"); Printf(pdocs, "%s\n", pdoc); } // Write the function annotation if (func_annotation) Printf(doc, ": \"%s\"", type_str); // Write default value if (value && !calling) { String *new_value = convertValue(value, Getattr(p, "type")); if (new_value) { value = new_value; } else { // Even if the value is not representable in the target language, still use it in the documentation, for compatibility with the previous SWIG versions // and because it can still be useful to see the C++ expression there. Node *lookup = Swig_symbol_clookup(value, 0); if (lookup) value = Getattr(lookup, "sym:name"); } Printf(doc, "=%s", value); if (new_value) Delete(new_value); } Delete(type_str); Delete(made_name); } if (pdocs) Setattr(n, "feature:pdocs", pdocs); Delete(plist); return doc; } /* ------------------------------------------------------------ * make_autodoc() * * Build a docstring for the node, using parameter and other * info in the parse tree. If the value of the autodoc * attribute is "0" then do not include parameter types, if * it is "1" (the default) then do. If it has some other * value then assume it is supplied by the extension writer * and use it directly. * ------------------------------------------------------------ */ String *make_autodoc(Node *n, autodoc_t ad_type, bool low_level = false) { int extended = 0; bool first_func = true; // If the function is overloaded then this function is called // for the last one. Rewind to the first so the docstrings are // in order. while (Getattr(n, "sym:previousSibling")) n = Getattr(n, "sym:previousSibling"); String *doc = NewString(""); while (n) { bool showTypes = false; bool skipAuto = false; String *autodoc = Getattr(n, "feature:autodoc"); autodoc_l dlevel = autodoc_level(autodoc); switch (dlevel) { case NO_AUTODOC: break; case NAMES_AUTODOC: showTypes = false; break; case TYPES_AUTODOC: showTypes = true; break; case EXTEND_AUTODOC: extended = 1; showTypes = false; break; case EXTEND_TYPES_AUTODOC: extended = 1; showTypes = true; break; case STRING_AUTODOC: Append(doc, autodoc); skipAuto = true; break; } if (!skipAuto) { /* Check if a documentation name was given for either the low-level C API or high-level Python shadow API */ String *symname = Getattr(n, low_level ? "doc:low:name" : "doc:high:name"); if (!symname) { symname = Getattr(n, "sym:name"); } SwigType *type = Getattr(n, "type"); String *type_str = NULL; // If the function has default arguments, then that documentation covers this version too if (Getattr(n, "defaultargs") != NULL) { n = Getattr(n, "sym:nextSibling"); continue; } if (!first_func) Append(doc, "\n"); if (type) { if (Strcmp(type, "void") == 0) { type_str = NULL; } else { Node *nn = classLookup(type); type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); } } /* Treat the low-level C API functions for getting/setting variables as methods for documentation purposes */ String *kind = Getattr(n, "kind"); if (kind && Strcmp(kind, "variable") == 0) { if (ad_type == AUTODOC_FUNC) { ad_type = AUTODOC_METHOD; } } /* Treat destructors as methods for documentation purposes */ String *nodeType = Getattr(n, "nodeType"); if (nodeType && Strcmp(nodeType, "destructor") == 0) { if (ad_type == AUTODOC_FUNC) { ad_type = AUTODOC_METHOD; } } switch (ad_type) { case AUTODOC_CLASS: { // Only do the autodoc if there isn't a docstring for the class String *str = Getattr(n, "feature:docstring"); if (!str || Len(str) == 0) { if (builtin) { String *name = Getattr(n, "name"); String *rname = add_explicit_scope(SwigType_namestr(name)); Printf(doc, "%s", rname); Delete(rname); } else { if (CPlusPlus) { Printf(doc, "Proxy of C++ %s class.", SwigType_namestr(real_classname)); } else { Printf(doc, "Proxy of C %s struct.", SwigType_namestr(real_classname)); } } } } break; case AUTODOC_CTOR: if (Strcmp(class_name, symname) == 0) { String *paramList = make_autodocParmList(n, showTypes, 2); Printf(doc, "__init__("); if (showTypes) Printf(doc, "%s ", class_name); if (Len(paramList)) Printf(doc, "self, %s) -> %s", paramList, class_name); else Printf(doc, "self) -> %s", class_name); } else Printf(doc, "%s(%s) -> %s", symname, make_autodocParmList(n, showTypes), class_name); break; case AUTODOC_DTOR: if (showTypes) Printf(doc, "__del__(%s self)", class_name); else Printf(doc, "__del__(self)"); break; case AUTODOC_STATICFUNC: Printf(doc, "%s(%s)", symname, make_autodocParmList(n, showTypes)); if (type_str) Printf(doc, " -> %s", type_str); break; case AUTODOC_FUNC: Printf(doc, "%s(%s)", symname, make_autodocParmList(n, showTypes)); if (type_str) Printf(doc, " -> %s", type_str); break; case AUTODOC_METHOD: { String *paramList = make_autodocParmList(n, showTypes, 2); Printf(doc, "%s(", symname); if (showTypes) Printf(doc, "%s ", class_name); if (Len(paramList)) Printf(doc, "self, %s)", paramList); else Printf(doc, "self)"); if (type_str) Printf(doc, " -> %s", type_str); } break; case AUTODOC_CONST: // There is no autodoc support for constants currently, this enum // element only exists to allow calling docstring() with it. return NULL; case AUTODOC_VAR: // Variables can also be documented (e.g. through the property() function in python) Printf(doc, "%s", symname); if (showTypes) { String *type = Getattr(n, "tmap:doc:type"); if (!type) type = Getattr(n, "membervariableHandler:type"); if (!type) type = Getattr(n, "type"); Printf(doc, " : %s", type); } break; } Delete(type_str); // Special case: wrapper functions to get a variable should have no parameters. // Because the node is re-used for the setter and getter, the feature:pdocs field will // exist for the getter function, so explicitly avoid printing parameters in this case. bool variable_getter = kind && Strcmp(kind, "variable") == 0 && Getattr(n, "memberget"); if (extended && ad_type != AUTODOC_VAR && !variable_getter) { String *pdocs = Getattr(n, "feature:pdocs"); if (pdocs) { Printv(doc, "\n", pdocs, NULL); } } } // if it's overloaded then get the next decl and loop around again n = Getattr(n, "sym:nextSibling"); if (n) first_func = false; } return doc; } /* ------------------------------------------------------------ * convertIntegerValue() * * Check if string v is an integer and can be represented in * Python. If so, return an appropriate Python representation, * otherwise (or if we are unsure), return NIL. * ------------------------------------------------------------ */ String *convertIntegerValue(String *v, SwigType *resolved_type) { const char *const s = Char(v); char *end; String *result = NIL; // Check if this is an integer number in any base. errno = 0; long value = strtol(s, &end, 0); if (errno == ERANGE || end == s) return NIL; if (*end != '\0') { // If there is a suffix after the number, we can safely ignore "l" // and (provided the number is unsigned) "u", and also combinations of // these, but not anything else. for (char *p = end; *p != '\0'; ++p) { switch (*p) { case 'l': case 'L': break; case 'u': case 'U': if (value < 0) return NIL; break; default: return NIL; } } } // So now we are certain that we are indeed dealing with an integer // that has a representation as long given by value. // Restrict to guaranteed supported range in Python, see maxint docs: https://docs.python.org/2/library/sys.html#sys.maxint // Don't do this pointless check when long is 32 bits or smaller as strtol will have already failed with ERANGE #if LONG_MAX > PYTHON_INT_MAX || LONG_MIN < PYTHON_INT_MIN if (value > PYTHON_INT_MAX || value < PYTHON_INT_MIN) { return NIL; } #endif if (Cmp(resolved_type, "bool") == 0) // Allow integers as the default value for a bool parameter. return NewString(value ? "True" : "False"); if (value == 0) return NewString(SwigType_ispointer(resolved_type) ? "None" : "0"); // v may still be octal or hexadecimal: const char *p = s; if (*p == '+' || *p == '-') ++p; if (*p == '0' && *(p+1) != 'x' && *(p+1) != 'X') { // This must have been an octal number. This is the only case we // cannot use in Python directly, since Python 2 and 3 use non- // compatible representations. result = NewString(*s == '-' ? "int(\"-" : "int(\""); String *octal_string = NewStringWithSize(p, (int) (end - p)); Append(result, octal_string); Append(result, "\", 8)"); Delete(octal_string); return result; } result = *end == '\0' ? Copy(v) : NewStringWithSize(s, (int) (end - s)); return result; } /* ------------------------------------------------------------ * convertDoubleValue() * * Check if the given string looks like a decimal floating point constant * and return it if it does, otherwise return NIL. * ------------------------------------------------------------ */ String *convertDoubleValue(String *v) { const char *const s = Char(v); char *end; errno = 0; double value = strtod(s, &end); (void) value; if (errno != ERANGE && end != s) { // An added complication: at least some versions of strtod() recognize // hexadecimal floating point numbers which don't exist in Python, so // detect them ourselves and refuse to convert them (this can't be done // without loss of precision in general). // // Also don't accept neither "NAN" nor "INFINITY" (both of which // conveniently contain "n"). if (strpbrk(s, "xXnN")) return NIL; // Disregard optional "f" suffix, it can be just dropped in Python as it // uses doubles for everything anyhow. for (char * p = end; *p != '\0'; ++p) { switch (*p) { case 'f': case 'F': break; default: return NIL; } } // Avoid unnecessary string allocation in the common case when we don't // need to remove any suffix. return *end == '\0' ? Copy(v) : NewStringWithSize(s, (int)(end - s)); } return NIL; } /* ------------------------------------------------------------ * convertValue() * * Check if string v can be a Python value literal or a * constant. Return an equivalent Python representation, * or NIL if it isn't, or we are unsure. * ------------------------------------------------------------ */ String *convertValue(String *v, SwigType *type) { const char *const s = Char(v); String *result = NIL; SwigType *resolved_type = SwigType_typedef_resolve_all(type); result = convertIntegerValue(v, resolved_type); if (!result) { result = convertDoubleValue(v); if (!result) { if (Strcmp(v, "true") == 0) result = NewString("True"); else if (Strcmp(v, "false") == 0) result = NewString("False"); else if (Strcmp(v, "NULL") == 0 || Strcmp(v, "nullptr") == 0) result = SwigType_ispointer(resolved_type) ? NewString("None") : NewString("0"); // This could also be an enum type, default value of which could be // representable in Python if it doesn't include any scope (which could, // but currently is not, translated). else if (!Strchr(s, ':')) { Node *lookup = Swig_symbol_clookup(v, 0); if (lookup) { if (Cmp(Getattr(lookup, "nodeType"), "enumitem") == 0) result = Copy(Getattr(lookup, "sym:name")); } } } } Delete(resolved_type); return result; } /* ------------------------------------------------------------ * is_representable_as_pyargs() * * Check if the function parameters default argument values * can be represented in Python. * * If this method returns false, the parameters will be translated * to a generic "*args" which allows us to deal with default values * at C++ code level where they can always be handled. * ------------------------------------------------------------ */ bool is_representable_as_pyargs(Node *n) { ParmList *plist = CopyParmList(Getattr(n, "parms")); Swig_typemap_attach_parms("default", plist, NULL); Parm *p; Parm *pnext; for (p = plist; p; p = pnext) { pnext = nextSibling(p); String *tm = Getattr(p, "tmap:in"); if (tm) { Parm *in_next = Getattr(p, "tmap:in:next"); if (in_next) pnext = in_next; if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } } // "default" typemap can contain arbitrary C++ code, so while it could, in // principle, be possible to examine it and check if it's just something // simple of the form "$1 = expression" and then use convertValue() to // check if expression can be used in Python, but for now we just // pessimistically give up and prefer to handle this at C++ level only. if (Getattr(p, "tmap:default")) return false; String *value = Getattr(p, "value"); if (value) { String *convertedValue = convertValue(value, Getattr(p, "type")); if (!convertedValue) return false; Delete(convertedValue); } } return true; } /* ------------------------------------------------------------ * is_real_overloaded() * * Check if the function is overloaded, but not just have some * siblings generated due to the original function having * default arguments. * ------------------------------------------------------------ */ bool is_real_overloaded(Node *n) { Node *h = Getattr(n, "sym:overloaded"); Node *i; if (!h) return false; i = Getattr(h, "sym:nextSibling"); while (i) { Node *nn = Getattr(i, "defaultargs"); if (nn != h) { /* Check if overloaded function has defaultargs and * pointed to the first overloaded. */ return true; } i = Getattr(i, "sym:nextSibling"); } return false; } /* ------------------------------------------------------------ * make_pyParmList() * * Generate parameter list for Python functions or methods, * reuse make_autodocParmList() to do so. * ------------------------------------------------------------ */ String *make_pyParmList(Node *n, bool in_class, bool is_calling, int kw, bool has_self_for_count = false) { /* Get the original function for a defaultargs copy, * see default_arguments() in parser.y. */ Node *nn = Getattr(n, "defaultargs"); if (nn) n = nn; Parm *parms = Getattr(n, "parms"); int varargs = parms ? emit_isvarargs(parms) : 0; /* We prefer to explicitly list all parameters of the C function in the generated Python code as this makes the function more convenient to use, however in some cases we must replace the real parameters list with just the catch all "*args". This happens when: 1. The function is overloaded as Python doesn't support this. 2. We were explicitly asked to use the "compact" arguments form. 3. We were explicitly asked to use default args from C via the "python:cdefaultargs" feature. 4. One of the default argument values can't be represented in Python. 5. Varargs that haven't been forced to use a fixed number of arguments with %varargs. */ if (is_real_overloaded(n) || GetFlag(n, "feature:compactdefaultargs") || GetFlag(n, "feature:python:cdefaultargs") || !is_representable_as_pyargs(n) || varargs) { String *parms = NewString(""); if (in_class) Printf(parms, "self, "); Printf(parms, "*args"); if (kw) Printf(parms, ", **kwargs"); return parms; } bool funcanno = py3 ? true : false; String *params = NewString(""); String *_params = make_autodocParmList(n, false, ((in_class || has_self_for_count)? 2 : 1), is_calling, funcanno); if (in_class) { Printf(params, "self"); if (Len(_params) > 0) Printf(params, ", "); } Printv(params, _params, NULL); return params; } /* ------------------------------------------------------------ * have_pythonprepend() * * Check if there is a %pythonprepend directive and it has text * ------------------------------------------------------------ */ bool have_pythonprepend(Node *n) { String *str = Getattr(n, "feature:pythonprepend"); return (str && Len(str) > 0); } /* ------------------------------------------------------------ * pythonprepend() * * Get the %pythonprepend code, stripping off {} if necessary * ------------------------------------------------------------ */ String *pythonprepend(Node *n) { String *str = Getattr(n, "feature:pythonprepend"); char *t = Char(str); if (*t == '{') { Delitem(str, 0); Delitem(str, DOH_END); } return str; } /* ------------------------------------------------------------ * have_pythonappend() * * Check if there is a %pythonappend directive and it has text * ------------------------------------------------------------ */ bool have_pythonappend(Node *n) { String *str = Getattr(n, "feature:pythonappend"); if (!str) str = Getattr(n, "feature:addtofunc"); return (str && Len(str) > 0); } /* ------------------------------------------------------------ * pythonappend() * * Get the %pythonappend code, stripping off {} if necessary * ------------------------------------------------------------ */ String *pythonappend(Node *n) { String *str = Getattr(n, "feature:pythonappend"); if (!str) str = Getattr(n, "feature:addtofunc"); char *t = Char(str); if (*t == '{') { Delitem(str, 0); Delitem(str, DOH_END); } return str; } /* ------------------------------------------------------------ * have_addtofunc() * * Check if there is a %addtofunc directive and it has text * ------------------------------------------------------------ */ bool have_addtofunc(Node *n) { return have_pythonappend(n) || have_pythonprepend(n); } /* ------------------------------------------------------------ * returnTypeAnnotation() * * Helper function for constructing the function annotation * of the returning type, return a empty string for Python 2.x * ------------------------------------------------------------ */ String *returnTypeAnnotation(Node *n) { String *ret = 0; Parm *p = Getattr(n, "parms"); String *tm; /* Try to guess the returning type by argout typemap, * however the result may not accurate. */ while (p) { if ((tm = Getattr(p, "tmap:argout:match_type"))) { tm = SwigType_str(tm, 0); if (ret) Printv(ret, ", ", tm, NULL); else ret = tm; p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* If no argout typemap, then get the returning type from * the function prototype. */ if (!ret) { ret = Getattr(n, "type"); if (ret) ret = SwigType_str(ret, 0); } return (ret && py3) ? NewStringf(" -> \"%s\"", ret) : NewString(""); } /* ------------------------------------------------------------ * emitFunctionShadowHelper() * * Refactoring some common code out of functionWrapper and * dispatchFunction that writes the proxy code for non-member * functions. * ------------------------------------------------------------ */ void emitFunctionShadowHelper(Node *n, File *f_dest, String *name, int kw) { String *parms = make_pyParmList(n, false, false, kw); String *callParms = make_pyParmList(n, false, true, kw); // Callbacks need the C function in order to extract the pointer from the swig_ptr: string bool fast = (fastproxy && !have_addtofunc(n)) || Getattr(n, "feature:callback"); if (!fast || olddefs) { /* Make a wrapper function to insert the code into */ Printv(f_dest, "\n", "def ", name, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_dest, tab4, docstring(n, AUTODOC_FUNC, tab4, true), "\n", NIL); if (have_pythonprepend(n)) Printv(f_dest, indent_pythoncode(pythonprepend(n), tab4, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); if (have_pythonappend(n)) { Printv(f_dest, tab4 "val = ", funcCall(name, callParms), "\n", NIL); Printv(f_dest, indent_pythoncode(pythonappend(n), tab4, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_dest, tab4 "return val\n", NIL); } else { Printv(f_dest, tab4 "return ", funcCall(name, callParms), "\n", NIL); } } // Below may result in a 2nd definition of the method when -olddefs is used. The Python interpreter will use the second definition as it overwrites the first. if (fast) { /* If there is no addtofunc directive then just assign from the extension module (for speed up) */ Printv(f_dest, name, " = ", module, ".", name, "\n", NIL); } } /* ------------------------------------------------------------ * check_kwargs() * * check if using kwargs is allowed for this Node * ------------------------------------------------------------ */ int check_kwargs(Node *n) const { return (use_kw || GetFlag(n, "feature:kwargs")) && !GetFlag(n, "memberset") && !GetFlag(n, "memberget"); } /* ------------------------------------------------------------ * add_method() * ------------------------------------------------------------ */ void add_method(String *name, String *function, int kw, Node *n = 0, int funpack = 0, int num_required = -1, int num_arguments = -1) { String * meth_str = NewString(""); if (!kw) { if (funpack) { if (num_required == 0 && num_arguments == 0) { Printf(meth_str, "\t { \"%s\", %s, METH_NOARGS, ", name, function); } else if (num_required == 1 && num_arguments == 1) { Printf(meth_str, "\t { \"%s\", %s, METH_O, ", name, function); } else { Printf(meth_str, "\t { \"%s\", %s, METH_VARARGS, ", name, function); } } else { Printf(meth_str, "\t { \"%s\", %s, METH_VARARGS, ", name, function); } } else { // Cast via void(*)(void) to suppress GCC -Wcast-function-type warning. // Python should always call the function correctly, but the Python C API // requires us to store it in function pointer of a different type. Printf(meth_str, "\t { \"%s\", (PyCFunction)(void(*)(void))%s, METH_VARARGS|METH_KEYWORDS, ", name, function); } Append(methods, meth_str); if (fastproxy) { Append(methods_proxydocs, meth_str); } Delete(meth_str); if (!n) { Append(methods, "NULL"); if (fastproxy) { Append(methods_proxydocs, "NULL"); } } else if (have_docstring(n)) { /* Use the low-level docstring here since this is the docstring that will be used for the C API */ String *ds = cdocstring(n, Getattr(n, "memberfunction") ? AUTODOC_METHOD : AUTODOC_FUNC, true); Printf(methods, "\"%s\"", ds); if (fastproxy) { /* In the fastproxy case, we must also record the high-level docstring for use in the Python shadow API */ Delete(ds); ds = cdocstring(n, Getattr(n, "memberfunction") ? AUTODOC_METHOD : AUTODOC_FUNC); Printf(methods_proxydocs, "\"%s\"", ds); } Delete(ds); } else if (Getattr(n, "feature:callback")) { Printf(methods, "\"swig_ptr: %s\"", Getattr(n, "feature:callback:name")); if (fastproxy) { Printf(methods_proxydocs, "\"swig_ptr: %s\"", Getattr(n, "feature:callback:name")); } } else { Append(methods, "NULL"); if (fastproxy) { Append(methods_proxydocs, "NULL"); } } Append(methods, "},\n"); if (fastproxy) { Append(methods_proxydocs, "},\n"); } } /* ------------------------------------------------------------ * dispatchFunction() * ------------------------------------------------------------ */ void dispatchFunction(Node *n, String *linkage, int funpack = 0, bool builtin_self = false, bool builtin_ctor = false, bool director_class = false) { /* Last node in overloaded chain */ bool add_self = builtin_self && (!builtin_ctor || director_class); int maxargs; String *tmp = NewString(""); String *dispatch; const char *dispatch_call = funpack ? "%s(self, argc, argv);" : (builtin_ctor ? "%s(self, args, NULL);" : "%s(self, args);"); String *dispatch_code = NewStringf("return %s", dispatch_call); if (castmode) { dispatch = Swig_overload_dispatch_cast(n, dispatch_code, &maxargs); } else { String *fastdispatch_code; if (builtin_ctor) fastdispatch_code = NewStringf("int retval = %s\nif (retval == 0 || !SWIG_Python_TypeErrorOccurred(NULL)) return retval;\nSWIG_fail;", dispatch_call); else fastdispatch_code = NewStringf("PyObject *retobj = %s\nif (!SWIG_Python_TypeErrorOccurred(retobj)) return retobj;\nSWIG_fail;", dispatch_call); if (!CPlusPlus) { Insert(fastdispatch_code, 0, "{\n"); Append(fastdispatch_code, "\n}"); } dispatch = Swig_overload_dispatch(n, dispatch_code, &maxargs, fastdispatch_code); Delete(fastdispatch_code); } /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); const char *builtin_kwargs = builtin_ctor ? ", PyObject *kwargs" : ""; Printv(f->def, linkage, builtin_ctor ? "int " : "PyObject *", wname, "(PyObject *self, PyObject *args", builtin_kwargs, ") {", NIL); Wrapper_add_local(f, "argc", "Py_ssize_t argc"); Printf(tmp, "PyObject *argv[%d] = {0}", maxargs + 1); Wrapper_add_local(f, "argv", tmp); if (!fastunpack) { Wrapper_add_local(f, "ii", "Py_ssize_t ii"); if (builtin_ctor) Printf(f->code, "if (!SWIG_Python_CheckNoKeywords(kwargs, \"%s\")) SWIG_fail;\n", symname); if (maxargs - (add_self ? 1 : 0) > 0) { Append(f->code, "if (!PyTuple_Check(args)) SWIG_fail;\n"); Append(f->code, "argc = PyObject_Length(args);\n"); } else { Append(f->code, "argc = args ? PyObject_Length(args) : 0;\n"); } if (add_self) Append(f->code, "argv[0] = self;\n"); Printf(f->code, "for (ii = 0; (ii < %d) && (ii < argc); ii++) {\n", add_self ? maxargs - 1 : maxargs); Printf(f->code, "argv[ii%s] = PyTuple_GET_ITEM(args,ii);\n", add_self ? " + 1" : ""); Append(f->code, "}\n"); if (add_self) Append(f->code, "argc++;\n"); } else { if (builtin_ctor) Printf(f->code, "if (!SWIG_Python_CheckNoKeywords(kwargs, \"%s\")) SWIG_fail;\n", symname); Printf(f->code, "if (!(argc = SWIG_Python_UnpackTuple(args, \"%s\", 0, %d, argv%s))) SWIG_fail;\n", symname, maxargs, add_self ? "+1" : ""); if (add_self) Append(f->code, "argv[0] = self;\n"); else Append(f->code, "--argc;\n"); } Replaceall(dispatch, "$args", "self, args"); Printv(f->code, dispatch, "\n", NIL); if (GetFlag(n, "feature:python:maybecall")) { Append(f->code, "fail:\n"); Append(f->code, " Py_INCREF(Py_NotImplemented);\n"); Append(f->code, " return Py_NotImplemented;\n"); } else { Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up String *protoTypes = NewString(""); do { String *fulldecl = Swig_name_decl(sibl); Printf(protoTypes, "\n\" %s\\n\"", fulldecl); Delete(fulldecl); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Append(f->code, "fail:\n"); Printf(f->code, " SWIG_Python_RaiseOrModifyTypeError(" "\"Wrong number or type of arguments for overloaded function '%s'.\\n\"" "\n\" Possible C/C++ prototypes are:\\n\"%s);\n", symname, protoTypes); Printf(f->code, "return %s;\n", builtin_ctor ? "-1" : "0"); Delete(protoTypes); } Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); Node *p = Getattr(n, "sym:previousSibling"); if (!builtin_self) add_method(symname, wname, 0, p); /* Create a shadow for this function (if enabled and not in a member function) */ if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { emitFunctionShadowHelper(n, in_class ? f_shadow_stubs : f_shadow, symname, 0); } DelWrapper(f); Delete(dispatch); Delete(dispatch_code); Delete(tmp); Delete(wname); } /* ------------------------------------------------------------ * functionWrapper() * ------------------------------------------------------------ */ /* A note about argument marshalling with built-in types. There are three distinct cases for member (non-static) methods: 1) An ordinary member function. In this case, the first param in the param list is 'this'. For builtin types, 'this' is taken from the first argument to the wrapper (usually called 'self); it's not extracted from the second argument (which is usually a tuple). 2) A constructor for a non-director class. In this case, the param list doesn't contain an entry for 'this', but the first ('self') argument to the wrapper *does* contain the newly-allocated, uninitialized object. 3) A constructor for a director class. In this case, the param list contains a 'self' param, which comes from the first argument to the wrapper function. */ const char *get_implicitconv_flag(Node *klass) { int conv = 0; if (klass && GetFlag(klass, "feature:implicitconv")) { conv = 1; } return conv ? "SWIG_POINTER_IMPLICIT_CONV" : "0"; } virtual int functionWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Node *parent = Swig_methodclass(n); int director_method = 0; Parm *p; int i; char source[64]; Wrapper *f; String *self_parse; String *parse_args; String *arglist; String *get_pointers; String *cleanup; String *outarg; String *kwargs; String *tm; String *overname = 0; int num_required; int num_arguments; int num_fixed_arguments; int tuple_required; int tuple_arguments; int varargs = 0; int allow_kwargs = check_kwargs(n); String *nodeType = Getattr(n, "nodeType"); int constructor = (!Cmp(nodeType, "constructor")); int destructor = (!Cmp(nodeType, "destructor")); String *storage = Getattr(n, "storage"); /* Only the first constructor is handled as init method. Others constructor can be emitted via %rename */ int handled_as_init = 0; if (!have_constructor && (constructor || Getattr(n, "handled_as_constructor")) && ((shadow & PYSHADOW_MEMBER))) { String *nname = Getattr(n, "sym:name"); String *sname = Getattr(getCurrentClass(), "sym:name"); String *cname = Swig_name_construct(NSPACE_TODO, sname); handled_as_init = (Strcmp(nname, sname) == 0) || (Strcmp(nname, cname) == 0); Delete(cname); } bool builtin_self = builtin && in_class && (constructor || (l && Getattr(l, "self"))); bool builtin_ctor = false; if (builtin_self && constructor) { String *class_mname = Getattr(getCurrentClass(), "sym:name"); String *mrename = Swig_name_construct(getNSpace(), class_mname); if (Cmp(iname, mrename)) builtin_self = false; else builtin_ctor = true; Delete(mrename); } bool director_class = (getCurrentClass() && Swig_directorclass(getCurrentClass())); bool add_self = builtin_self && (!builtin_ctor || director_class); bool builtin_getter = (builtin && GetFlag(n, "memberget")); bool builtin_setter = (builtin && GetFlag(n, "memberset") && !builtin_getter); char const *self_param = builtin ? "self" : "SWIGUNUSEDPARM(self)"; char const *wrap_return = builtin_ctor ? "int " : "PyObject *"; String *linkage = NewString("SWIGINTERN "); String *wrapper_name = Swig_name_wrapper(iname); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } f = NewWrapper(); self_parse = NewString(""); parse_args = NewString(""); arglist = NewString(""); get_pointers = NewString(""); cleanup = NewString(""); outarg = NewString(""); kwargs = NewString(""); int allow_thread = threads_enable(n); Wrapper_add_local(f, "resultobj", "PyObject *resultobj = 0"); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ tuple_arguments = num_arguments = emit_num_arguments(l); tuple_required = num_required = emit_num_required(l); if (add_self) { --tuple_arguments; --tuple_required; } num_fixed_arguments = tuple_required; // builtin handles/checks kwargs by default except in constructor wrappers so we need to explicitly handle them in the C constructor wrapper // The check below is for zero arguments. Sometimes (eg directors) self is the first argument for a method with zero arguments. if (((num_arguments == 0) && (num_required == 0)) || ((num_arguments == 1) && (num_required == 1) && Getattr(l, "self"))) if (!builtin_ctor) allow_kwargs = 0; varargs = emit_isvarargs(l); String *wname = Copy(wrapper_name); if (overname) { Append(wname, overname); } const char *builtin_kwargs = builtin_ctor ? ", PyObject *kwargs" : ""; if (!allow_kwargs || overname) { if (!varargs) { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args", builtin_kwargs, ") {", NIL); } else { Printv(f->def, linkage, wrap_return, wname, "__varargs__", "(PyObject *", self_param, ", PyObject *args, PyObject *varargs) {", NIL); } if (allow_kwargs) { Swig_warning(WARN_LANG_OVERLOAD_KEYWORD, input_file, line_number, "Can't use keyword arguments with overloaded functions (%s).\n", Swig_name_decl(n)); allow_kwargs = 0; } } else { if (varargs) { Swig_warning(WARN_LANG_VARARGS_KEYWORD, input_file, line_number, "Can't wrap varargs with keyword arguments enabled\n"); varargs = 0; } Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args, PyObject *kwargs) {", NIL); } if (!builtin || !in_class || tuple_arguments > 0 || builtin_ctor) { if (!allow_kwargs) { Append(parse_args, " if (!PyArg_ParseTuple(args, \""); } else { Append(parse_args, " if (!PyArg_ParseTupleAndKeywords(args, kwargs, \""); Append(arglist, ", kwnames"); } } bool over_varargs = emit_isvarargs_function(n); int funpack = fastunpack && !varargs && !over_varargs && !allow_kwargs; int noargs = funpack && (tuple_required == 0 && tuple_arguments == 0); int onearg = funpack && (tuple_required == 1 && tuple_arguments == 1); if (builtin && funpack && !overname && !builtin_ctor) { int compactdefargs = ParmList_is_compactdefargs(l); if (!(compactdefargs && (tuple_arguments > tuple_required || varargs))) { String *argattr = NewStringf("%d", tuple_arguments); Setattr(n, "python:argcount", argattr); Delete(argattr); } } /* Generate code for argument marshalling */ if (funpack) { if (num_arguments > 0 && !overname) { sprintf(source, "PyObject *swig_obj[%d]", num_arguments); Wrapper_add_localv(f, "swig_obj", source, NIL); } } if (constructor && num_arguments == 1 && num_required == 1) { if (Cmp(storage, "explicit") == 0) { if (GetFlag(parent, "feature:implicitconv")) { String *desc = NewStringf("SWIGTYPE%s", SwigType_manglestr(Getattr(n, "type"))); Printf(f->code, "if (SWIG_CheckImplicit(%s)) SWIG_fail;\n", desc); Delete(desc); } } } if (builtin_ctor && checkAttribute(n, "access", "protected")) { String *tmp_none_comparison = Copy(none_comparison); Replaceall(tmp_none_comparison, "$arg", "self"); Printf(self_parse, "if (!(%s)) {\n", tmp_none_comparison); Printv(self_parse, " SWIG_SetErrorMsg(PyExc_RuntimeError, \"accessing abstract class or protected constructor\");\n SWIG_fail;\n}\n", NIL); Delete(tmp_none_comparison); } int use_parse = 0; Append(kwargs, "{"); for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); bool parse_from_tuple = (i > 0 || !add_self); if (SwigType_type(pt) == T_VARARGS) { parse_from_tuple = false; num_fixed_arguments -= atoi(Char(Getattr(p, "tmap:in:numinputs"))); } if (!parse_from_tuple) sprintf(source, "self"); else if (funpack) sprintf(source, "swig_obj[%d]", add_self && !overname ? i - 1 : i); else sprintf(source, "obj%d", builtin_ctor ? i + 1 : i); if (parse_from_tuple) { Printf(arglist, ", "); if (i == num_required) Putc('|', parse_args); /* Optional argument separator */ } /* Keyword argument handling */ if (allow_kwargs && parse_from_tuple) { String *name = makeParameterName(n, p, i + 1); Printf(kwargs, " (char *)\"%s\", ", name); Delete(name); } /* Look for an input typemap */ if ((tm = Getattr(p, "tmap:in"))) { String *parse = Getattr(p, "tmap:in:parse"); if (!parse) { if (builtin_self) { Replaceall(tm, "$self", "self"); } else if (funpack) { Replaceall(tm, "$self", "swig_obj[0]"); } else { Replaceall(tm, "$self", "obj0"); } Replaceall(tm, "$source", source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); /* Save the location of the object */ if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } if (Getattr(p, "tmap:in:implicitconv")) { const char *convflag = "0"; if (!Getattr(p, "hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } Replaceall(tm, "$implicitconv", convflag); Setattr(p, "implicitconv", convflag); } if (parse_from_tuple) Putc('O', parse_args); if (!funpack && parse_from_tuple) { Wrapper_add_localv(f, source, "PyObject *", source, "= 0", NIL); Printf(arglist, "&%s", source); } if (i >= num_required) Printv(get_pointers, "if (", source, ") {\n", NIL); Printv(get_pointers, tm, "\n", NIL); if (i >= num_required) Printv(get_pointers, "}\n", NIL); } else { use_parse = 1; Append(parse_args, parse); if (parse_from_tuple) Printf(arglist, "&%s", ln); } p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } /* finish argument marshalling */ Append(kwargs, " NULL }"); if (allow_kwargs) { Printv(f->locals, " char * kwnames[] = ", kwargs, ";\n", NIL); } if (use_parse || allow_kwargs) { Printf(parse_args, ":%s\"", iname); Printv(parse_args, arglist, ")) SWIG_fail;\n", NIL); funpack = 0; } else { Clear(parse_args); if (funpack) { Clear(f->def); if (overname) { if (noargs) { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {", NIL); } else { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", Py_ssize_t nobjs, PyObject **swig_obj) {", NIL); } Printf(parse_args, "if ((nobjs < %d) || (nobjs > %d)) SWIG_fail;\n", num_required, num_arguments); } else { int is_tp_call = Equal(Getattr(n, "feature:python:slot"), "tp_call"); Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args", builtin_kwargs, ") {", NIL); if (builtin_ctor) Printf(parse_args, "if (!SWIG_Python_CheckNoKeywords(kwargs, \"%s\")) SWIG_fail;\n", iname); if (onearg && !builtin_ctor && !is_tp_call) { Printf(parse_args, "if (!args) SWIG_fail;\n"); Append(parse_args, "swig_obj[0] = args;\n"); } else if (!noargs) { Printf(parse_args, "if (!SWIG_Python_UnpackTuple(args, \"%s\", %d, %d, swig_obj)) SWIG_fail;\n", iname, num_fixed_arguments, tuple_arguments); } else if (noargs) { Printf(parse_args, "if (!SWIG_Python_UnpackTuple(args, \"%s\", %d, %d, 0)) SWIG_fail;\n", iname, num_fixed_arguments, tuple_arguments); } } } else { if (builtin_ctor) Printf(parse_args, "if (!SWIG_Python_CheckNoKeywords(kwargs, \"%s\")) SWIG_fail;\n", iname); if (builtin && in_class && tuple_arguments == 0) { Printf(parse_args, " if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_exception_fail(SWIG_TypeError, \"%s takes no arguments\");\n", iname); } else { Printf(parse_args, "if (!PyArg_UnpackTuple(args, \"%s\", %d, %d", iname, num_fixed_arguments, tuple_arguments); Printv(parse_args, arglist, ")) SWIG_fail;\n", NIL); } } } /* Now piece together the first part of the wrapper function */ Printv(f->code, self_parse, parse_args, get_pointers, NIL); /* Check for trailing varargs */ if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$input", "varargs"); Printv(f->code, tm, "\n", NIL); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if (!Getattr(p, "tmap:in:parse") && (tm = Getattr(p, "tmap:freearg"))) { if (Getattr(p, "tmap:freearg:implicitconv")) { const char *convflag = "0"; if (!Getattr(p, "hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } if (strcmp(convflag, "0") == 0) { tm = 0; } } if (tm && (Len(tm) != 0)) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* if the object is a director, and the method call originated from its * underlying python object, resolve the call by going up the c++ * inheritance chain. otherwise try to resolve the method in python. * without this check an infinite loop is set up between the director and * shadow class method calls. */ // NOTE: this code should only be inserted if this class is the // base class of a director class. however, in general we haven't // yet analyzed all classes derived from this one to see if they are // directors. furthermore, this class may be used as the base of // a director class defined in a completely different module at a // later time, so this test must be included whether or not directorbase // is true. we do skip this code if directors have not been enabled // at the command line to preserve source-level compatibility with // non-polymorphic swig. also, if this wrapper is for a smart-pointer // method, there is no need to perform the test since the calling object // (the smart-pointer) and the director object (the "pointee") are // distinct. director_method = is_member_director(n) && !is_smart_pointer() && !destructor; if (director_method) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Append(f->code, "director = SWIG_DIRECTOR_CAST(arg1);\n"); if (dirprot_mode() && !is_public(n)) { Printf(f->code, "if (!director || !(director->swig_get_inner(\"%s\"))) {\n", name); Printf(f->code, "SWIG_SetErrorMsg(PyExc_RuntimeError,\"accessing protected member %s\");\n", name); Append(f->code, "SWIG_fail;\n"); Append(f->code, "}\n"); } Wrapper_add_local(f, "upcall", "bool upcall = false"); if (funpack) { const char *self_parm = builtin_self ? "self" : "swig_obj[0]"; Printf(f->code, "upcall = (director && (director->swig_get_self()==%s));\n", self_parm); } else { const char *self_parm = builtin_self ? "self" : "obj0"; Printf(f->code, "upcall = (director && (director->swig_get_self()==%s));\n", self_parm); } } /* Emit the function call */ if (director_method) { Append(f->code, "try {\n"); } else { if (allow_thread) { String *preaction = NewString(""); thread_begin_allow(n, preaction); Setattr(n, "wrap:preaction", preaction); String *postaction = NewString(""); thread_end_allow(n, postaction); Setattr(n, "wrap:postaction", postaction); } } Setattr(n, "wrap:name", wname); Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); if (director_method) { Append(actioncode, "} catch (Swig::DirectorException&) {\n"); Append(actioncode, " SWIG_fail;\n"); Append(actioncode, "}\n"); } /* This part below still needs cleanup */ /* Return the function value */ tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); if (tm) { if (builtin_self) { Replaceall(tm, "$self", "self"); } else if (funpack) { Replaceall(tm, "$self", "swig_obj[0]"); } else { Replaceall(tm, "$self", "obj0"); } Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); if (builtin_ctor) { Replaceall(tm, "$owner", "SWIG_BUILTIN_INIT"); } else if (handled_as_init) { Replaceall(tm, "$owner", "SWIG_POINTER_NEW"); } else { if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); } else { Replaceall(tm, "$owner", "0"); } } // FIXME: this will not try to unwrap directors returned as non-director // base class pointers! /* New addition to unwrap director return values so that the original * python object is returned instead. */ #if 1 int unwrap = 0; String *decl = Getattr(n, "decl"); int is_pointer = SwigType_ispointer_return(decl); int is_reference = SwigType_isreference_return(decl); if (is_pointer || is_reference) { String *type = Getattr(n, "type"); //Node *classNode = Swig_methodclass(n); //Node *module = Getattr(classNode, "module"); Node *module = Getattr(parent, "module"); Node *target = Swig_directormap(module, type); if (target) unwrap = 1; } if (unwrap) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Printf(f->code, "director = SWIG_DIRECTOR_CAST(%s);\n", Swig_cresult_name()); Append(f->code, "if (director) {\n"); Append(f->code, " resultobj = director->swig_get_self();\n"); Append(f->code, " Py_INCREF(resultobj);\n"); Append(f->code, "} else {\n"); Printf(f->code, "%s\n", tm); Append(f->code, "}\n"); } else { Printf(f->code, "%s\n", tm); } #else Printf(f->code, "%s\n", tm); #endif Delete(tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ int need_cleanup = Len(cleanup) != 0; if (need_cleanup) { Printv(f->code, cleanup, NIL); } /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } if (director_method) { if ((tm = Swig_typemap_lookup("directorfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "resultobj"); Printf(f->code, "%s\n", tm); Delete(tm); } } if (builtin_ctor) Append(f->code, " return resultobj == Py_None ? -1 : 0;\n"); else Append(f->code, " return resultobj;\n"); /* Error handling code */ Append(f->code, "fail:\n"); if (need_cleanup) { Printv(f->code, cleanup, NIL); } if (builtin_ctor) { Printv(f->code, " return -1;\n", NIL); } else { if (GetFlag(n, "feature:python:maybecall")) { Append(f->code, " PyErr_Clear();\n"); Append(f->code, " Py_INCREF(Py_NotImplemented);\n"); Append(f->code, " return Py_NotImplemented;\n"); } else { Printv(f->code, " return NULL;\n", NIL); } } Append(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Replaceall(f->code, "$result", "resultobj"); if (builtin_self) { Replaceall(f->code, "$self", "self"); } else if (funpack) { Replaceall(f->code, "$self", "swig_obj[0]"); } else { Replaceall(f->code, "$self", "obj0"); } /* Dump the function out */ Wrapper_print(f, f_wrappers); /* If varargs. Need to emit a varargs stub */ if (varargs) { DelWrapper(f); f = NewWrapper(); if (funpack) { // Note: funpack is currently always false for varargs Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", Py_ssize_t nobjs, PyObject **swig_obj) {", NIL); } else { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args", builtin_kwargs, ") {", NIL); } Wrapper_add_local(f, "resultobj", builtin_ctor ? "int resultobj" : "PyObject *resultobj"); Wrapper_add_local(f, "varargs", "PyObject *varargs"); Wrapper_add_local(f, "newargs", "PyObject *newargs"); if (funpack) { Wrapper_add_local(f, "i", "int i"); Printf(f->code, "newargs = PyTuple_New(%d);\n", num_fixed_arguments); Printf(f->code, "for (i = 0; i < %d; ++i) {\n", num_fixed_arguments); Printf(f->code, " PyTuple_SET_ITEM(newargs, i, swig_obj[i]);\n"); Printf(f->code, " Py_XINCREF(swig_obj[i]);\n"); Printf(f->code, "}\n"); Printf(f->code, "varargs = PyTuple_New(nobjs > %d ? nobjs - %d : 0);\n", num_fixed_arguments, num_fixed_arguments); Printf(f->code, "for (i = 0; i < nobjs - %d; ++i) {\n", num_fixed_arguments); Printf(f->code, " PyTuple_SET_ITEM(newargs, i, swig_obj[i + %d]);\n", num_fixed_arguments); Printf(f->code, " Py_XINCREF(swig_obj[i + %d]);\n", num_fixed_arguments); Printf(f->code, "}\n"); } else { Printf(f->code, "newargs = PyTuple_GetSlice(args,0,%d);\n", num_fixed_arguments); Printf(f->code, "varargs = PyTuple_GetSlice(args,%d,PyTuple_Size(args));\n", num_fixed_arguments); } Printf(f->code, "resultobj = %s__varargs__(%s,newargs,varargs);\n", wname, builtin ? "self" : "NULL"); Append(f->code, "Py_XDECREF(newargs);\n"); Append(f->code, "Py_XDECREF(varargs);\n"); Append(f->code, "return resultobj;\n"); Append(f->code, "}\n"); Wrapper_print(f, f_wrappers); } /* Now register the function with the interpreter. */ if (!Getattr(n, "sym:overloaded")) { if (!builtin_self) add_method(iname, wname, allow_kwargs, n, funpack, num_required, num_arguments); /* Create a shadow for this function (if enabled and not in a member function) */ if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { emitFunctionShadowHelper(n, in_class ? f_shadow_stubs : f_shadow, iname, allow_kwargs); } } else { if (!Getattr(n, "sym:nextSibling")) { dispatchFunction(n, linkage, funpack, builtin_self, builtin_ctor, director_class); } } // Put this in tp_init of the PyTypeObject if (builtin_ctor) { if ((director_method || !is_private(n)) && !Getattr(class_members, iname)) { Setattr(class_members, iname, n); if (!builtin_tp_init) builtin_tp_init = Swig_name_wrapper(iname); } } /* If this is a builtin type, create a PyGetSetDef entry for this member variable. */ if (builtin) { const char *memname = "__dict__"; Hash *h = Getattr(builtin_getset, memname); if (!h) { h = NewHash(); Setattr(builtin_getset, memname, h); Delete(h); } Setattr(h, "getter", "SwigPyObject_get___dict__"); if (!Getattr(h, "doc")) { Setattr(n, "doc:high:name", Getattr(n, "name")); Setattr(h, "doc", cdocstring(n, AUTODOC_VAR)); } } if (builtin_getter) { String *memname = Getattr(n, "membervariableHandler:sym:name"); if (!memname) memname = iname; Hash *h = Getattr(builtin_getset, memname); if (!h) { h = NewHash(); Setattr(builtin_getset, memname, h); Delete(h); } Setattr(h, "getter", wrapper_name); Delattr(n, "memberget"); if (!Getattr(h, "doc")) { Setattr(n, "doc:high:name", Getattr(n, "name")); String *ds = cdocstring(n, AUTODOC_VAR); Setattr(h, "doc", ds); Delete(ds); } } if (builtin_setter) { String *memname = Getattr(n, "membervariableHandler:sym:name"); if (!memname) memname = iname; Hash *h = Getattr(builtin_getset, memname); if (!h) { h = NewHash(); Setattr(builtin_getset, memname, h); Delete(h); } Setattr(h, "setter", wrapper_name); Delattr(n, "memberset"); if (!Getattr(h, "doc")) { Setattr(n, "doc:high:name", Getattr(n, "name")); String *ds = cdocstring(n, AUTODOC_VAR); Setattr(h, "doc", ds); Delete(ds); } } if (in_class && builtin) { /* Handle operator overloads for builtin types */ String *slot = Getattr(n, "feature:python:slot"); if (slot) { String *func_type = Getattr(n, "feature:python:slot:functype"); String *closure_decl = getClosure(func_type, wrapper_name, overname ? 0 : funpack); String *feature_name = NewStringf("feature:python:%s", slot); String *closure_name = 0; if (closure_decl) { closure_name = NewStringf("%s_%s_closure", wrapper_name, func_type); if (!GetFlag(builtin_closures, closure_name)) Printf(builtin_closures_code, "%s /* defines %s */\n\n", closure_decl, closure_name); SetFlag(builtin_closures, closure_name); Delete(closure_decl); } else { closure_name = Copy(wrapper_name); } if (func_type) { String *s = NewStringf("%s", closure_name); Delete(closure_name); closure_name = s; } Setattr(parent, feature_name, closure_name); Delete(feature_name); Delete(closure_name); } /* Handle comparison operators for builtin types */ String *compare = Getattr(n, "feature:python:compare"); if (compare) { Hash *richcompare = Getattr(parent, "python:richcompare"); assert(richcompare); Setattr(richcompare, compare, wrapper_name); } } Delete(self_parse); Delete(parse_args); Delete(linkage); Delete(arglist); Delete(get_pointers); Delete(cleanup); Delete(outarg); Delete(kwargs); Delete(wname); DelWrapper(f); Delete(wrapper_name); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); static int have_globals = 0; String *tm; Wrapper *getf, *setf; if (!addSymbol(iname, n)) return SWIG_ERROR; getf = NewWrapper(); setf = NewWrapper(); /* If this is our first call, add the globals variable to the Python dictionary. */ if (!have_globals) { Printf(f_init, "\t globals = SWIG_globals();\n"); Printf(f_init, "\t if (!globals) {\n"); Printf(f_init, " PyErr_SetString(PyExc_TypeError, \"Failure to create SWIG globals.\");\n"); Printf(f_init, "#if PY_VERSION_HEX >= 0x03000000\n"); Printf(f_init, "\t return NULL;\n"); Printf(f_init, "#else\n"); Printf(f_init, "\t return;\n"); Printf(f_init, "#endif\n"); Printf(f_init, "\t }\n"); Printf(f_init, "\t PyDict_SetItemString(md, \"%s\", globals);\n", global_name); Printf(f_init, "\t Py_DECREF(globals);\n"); if (builtin) Printf(f_init, "\t SwigPyBuiltin_AddPublicSymbol(public_interface, \"%s\");\n", global_name); have_globals = 1; if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { Printf(f_shadow_stubs, "%s = %s.%s\n", global_name, module, global_name); } } int assignable = is_assignable(n); if (!builtin && shadow && !assignable && !in_class) Printf(f_shadow_stubs, "%s = %s.%s\n", iname, global_name, iname); String *getname = Swig_name_get(NSPACE_TODO, iname); String *setname = Swig_name_set(NSPACE_TODO, iname); String *vargetname = NewStringf("Swig_var_%s", getname); String *varsetname = NewStringf("Swig_var_%s", setname); /* Create a function for setting the value of the variable */ if (assignable) { Setattr(n, "wrap:name", varsetname); if (builtin && in_class) { String *set_wrapper = Swig_name_wrapper(setname); Setattr(n, "pybuiltin:setter", set_wrapper); Delete(set_wrapper); } Printf(setf->def, "SWIGINTERN int %s(PyObject *_val) {", varsetname); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "_val"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "_val"); if (Getattr(n, "tmap:varin:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); } emit_action_code(n, setf->code, tm); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); } Printv(setf->code, " return 0;\n", NULL); Append(setf->code, "fail:\n"); Printv(setf->code, " return 1;\n", NULL); } else { /* Is a readonly variable. Issue an error */ if (CPlusPlus) { Printf(setf->def, "SWIGINTERN int %s(PyObject *) {", varsetname); } else { Printf(setf->def, "SWIGINTERN int %s(PyObject *_val SWIGUNUSED) {", varsetname); } Printv(setf->code, " SWIG_Error(SWIG_AttributeError,\"Variable ", iname, " is read-only.\");\n", " return 1;\n", NIL); } Append(setf->code, "}\n"); Wrapper_print(setf, f_wrappers); /* Create a function for getting the value of a variable */ Setattr(n, "wrap:name", vargetname); if (builtin && in_class) { String *get_wrapper = Swig_name_wrapper(getname); Setattr(n, "pybuiltin:getter", get_wrapper); Delete(get_wrapper); } int addfail = 0; Printf(getf->def, "SWIGINTERN PyObject *%s(void) {", vargetname); Wrapper_add_local(getf, "pyobj", "PyObject *pyobj = 0"); if (builtin) { Wrapper_add_local(getf, "self", "PyObject *self = 0"); Append(getf->code, " (void)self;\n"); } if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "pyobj"); Replaceall(tm, "$result", "pyobj"); addfail = emit_action_code(n, getf->code, tm); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Append(getf->code, " return pyobj;\n"); if (addfail) { Append(getf->code, "fail:\n"); Append(getf->code, " return NULL;\n"); } Append(getf->code, "}\n"); Wrapper_print(getf, f_wrappers); /* Now add this to the variable linking mechanism */ Printf(f_init, "\t SWIG_addvarlink(globals, \"%s\", %s, %s);\n", iname, vargetname, varsetname); if (builtin && shadow && !assignable && !in_class) { Printf(f_init, "\t PyDict_SetItemString(md, \"%s\", PyObject_GetAttrString(globals, \"%s\"));\n", iname, iname); Printf(f_init, "\t SwigPyBuiltin_AddPublicSymbol(public_interface, \"%s\");\n", iname); } Delete(vargetname); Delete(varsetname); Delete(getname); Delete(setname); DelWrapper(setf); DelWrapper(getf); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ /* Determine if the node requires the _swigconstant code to be generated */ bool needs_swigconstant(Node *n) { SwigType *type = Getattr(n, "type"); SwigType *qtype = SwigType_typedef_resolve_all(type); SwigType *uqtype = SwigType_strip_qualifiers(qtype); bool result = false; /* Note, that we need special handling for function pointers, as * SwigType_base(fptr) does not return the underlying pointer-to-function * type but the return-type of function. */ if (!SwigType_isfunction(uqtype) && !SwigType_isfunctionpointer(uqtype)) { SwigType *basetype = SwigType_base(uqtype); result = SwigType_isclass(basetype) != 0; Delete(basetype); } Delete(qtype); Delete(uqtype); return result; } virtual int constantWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; int have_tm = 0; int have_builtin_symname = 0; if (!addSymbol(iname, n)) return SWIG_ERROR; /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); String *str = SwigType_str(type, wname); Printf(f_header, "static %s = %s;\n", str, value); Delete(str); value = wname; } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Printf(const_code, "%s,\n", tm); Delete(tm); have_tm = 1; } if (builtin && in_class && Getattr(n, "pybuiltin:symname")) { have_builtin_symname = 1; Swig_require("builtin_constantWrapper", n, "*sym:name", "pybuiltin:symname", NIL); Setattr(n, "sym:name", Getattr(n, "pybuiltin:symname")); } if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); if (needs_swigconstant(n) && !builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER)) && (!in_class || !Getattr(n, "feature:python:callback"))) { // Generate `*_swigconstant()` method which registers the new constant. // // *_swigconstant methods are required for constants of class type. // Class types are registered in shadow file (see *_swigregister). The // instances of class must be created (registered) after the type is // registered, so we can't let SWIG_init() to register constants of // class type (the SWIG_init() is called before shadow classes are // defined and registered). Printf(f_wrappers, "SWIGINTERN PyObject *%s_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {\n", iname); Printf(f_wrappers, tab2 "PyObject *module;\n", tm); Printf(f_wrappers, tab2 "PyObject *d;\n"); Printf(f_wrappers, tab2 "if (!SWIG_Python_UnpackTuple(args, \"swigconstant\", 1, 1, &module)) return NULL;\n"); Printf(f_wrappers, tab2 "d = PyModule_GetDict(module);\n"); Printf(f_wrappers, tab2 "if (!d) return NULL;\n"); Printf(f_wrappers, tab2 "%s\n", tm); Printf(f_wrappers, tab2 "return SWIG_Py_Void();\n"); Printf(f_wrappers, "}\n\n\n"); // Register the method in SwigMethods array String *cname = NewStringf("%s_swigconstant", iname); add_method(cname, cname, 0, 0, 1, 1, 1); Delete(cname); } else { Printf(f_init, "%s\n", tm); } Delete(tm); have_tm = 1; } if (have_builtin_symname) Swig_restore(n); if (!have_tm) { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { String *f_s; if (!in_class) { f_s = f_shadow; } else { f_s = Getattr(n, "feature:python:callback") ? NIL : f_shadow_stubs; } if (f_s) { if (needs_swigconstant(n)) { Printv(f_s, "\n",NIL); Printv(f_s, module, ".", iname, "_swigconstant(",module,")\n", NIL); } Printv(f_s, iname, " = ", module, ".", iname, "\n", NIL); if (have_docstring(n)) Printv(f_s, docstring(n, AUTODOC_CONST, tab4), "\n", NIL); } } return SWIG_OK; } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { String *name = Getattr(n, "sym:name"); String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n)) return SWIG_ERROR; add_method(name, wrapname, 0); if (!builtin && shadow) { Printv(f_shadow_stubs, name, " = ", module, ".", name, "\n", NIL); } return SWIG_OK; } /* ---------------------------------------------------------------------------- * BEGIN C++ Director Class modifications * ------------------------------------------------------------------------- */ /* C++/Python polymorphism demo code * * TODO * * Move some boilerplate code generation to Swig_...() functions. * */ /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying Python object. * ** Moved down due to gcc-2.96 internal error ** * --------------------------------------------------------------- */ int classDirectorMethods(Node *n); int classDirectorMethod(Node *n, Node *parent, String *super); /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("PyObject"); SwigType_add_pointer(type); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) { \n", classname, target, call); Printf(w->def, " SWIG_DIRECTOR_RGTR((%s *)this, this); \n", basetype); Append(w->def, "}\n"); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(classname); Delete(supername); Delete(parms); return Language::classDirectorConstructor(n); } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ int classDirectorDefaultConstructor(Node *n) { String *classname = Swig_class_name(n); { Node *parent = Swig_methodclass(n); String *basetype = Getattr(parent, "classtype"); Wrapper *w = NewWrapper(); Printf(w->def, "SwigDirector_%s::SwigDirector_%s(PyObject *self) : Swig::Director(self) { \n", classname, classname); Printf(w->def, " SWIG_DIRECTOR_RGTR((%s *)this, this); \n", basetype); Append(w->def, "}\n"); Wrapper_print(w, f_directors); DelWrapper(w); } Printf(f_directors_h, " SwigDirector_%s(PyObject *self);\n", classname); Delete(classname); return Language::classDirectorDefaultConstructor(n); } /* ------------------------------------------------------------ * classDirectorInit() * ------------------------------------------------------------ */ int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n"); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } /* ------------------------------------------------------------ * classDirectorEnd() * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { String *classname = Swig_class_name(n); if (dirprot_mode()) { /* This implementation uses a std::map. It should be possible to rewrite it using a more elegant way, like copying the Java approach for the 'override' array. But for now, this seems to be the least intrusive way. */ Printf(f_directors_h, "\n"); Printf(f_directors_h, "/* Internal director utilities */\n"); Printf(f_directors_h, "public:\n"); Printf(f_directors_h, " bool swig_get_inner(const char *swig_protected_method_name) const {\n"); Printf(f_directors_h, " std::map::const_iterator iv = swig_inner.find(swig_protected_method_name);\n"); Printf(f_directors_h, " return (iv != swig_inner.end() ? iv->second : false);\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, " void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {\n"); Printf(f_directors_h, " swig_inner[swig_protected_method_name] = swig_val;\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, "private:\n"); Printf(f_directors_h, " mutable std::map swig_inner;\n"); } if (director_method_index) { Printf(f_directors_h, "\n"); Printf(f_directors_h, "#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)\n"); Printf(f_directors_h, "/* VTable implementation */\n"); Printf(f_directors_h, " PyObject *swig_get_method(size_t method_index, const char *method_name) const {\n"); Printf(f_directors_h, " PyObject *method = vtable[method_index];\n"); Printf(f_directors_h, " if (!method) {\n"); Printf(f_directors_h, " swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);\n"); Printf(f_directors_h, " method = PyObject_GetAttr(swig_get_self(), name);\n"); Printf(f_directors_h, " if (!method) {\n"); Printf(f_directors_h, " std::string msg = \"Method in class %s doesn't exist, undefined \";\n", classname); Printf(f_directors_h, " msg += method_name;\n"); Printf(f_directors_h, " Swig::DirectorMethodException::raise(msg.c_str());\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, " vtable[method_index] = method;\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, " return method;\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, "private:\n"); Printf(f_directors_h, " mutable swig::SwigVar_PyObject vtable[%d];\n", director_method_index); Printf(f_directors_h, "#endif\n\n"); } Printf(f_directors_h, "};\n\n"); return Language::classDirectorEnd(n); } /* ------------------------------------------------------------ * classDirectorDisown() * ------------------------------------------------------------ */ int classDirectorDisown(Node *n) { int result; int oldshadow = shadow; /* disable shadowing */ if (shadow) shadow = shadow | PYSHADOW_MEMBER; result = Language::classDirectorDisown(n); shadow = oldshadow; if (shadow) { if (builtin) { String *rname = SwigType_namestr(real_classname); Printf(builtin_methods, " { \"__disown__\", Swig::Director::swig_pyobj_disown< %s >, METH_NOARGS, \"\" },\n", rname); Delete(rname); } else { String *symname = Getattr(n, "sym:name"); String *mrename = Swig_name_disown(NSPACE_TODO, symname); //Getattr(n, "name")); Printv(f_shadow, tab4, "def __disown__(self):\n", NIL); #ifdef USE_THISOWN Printv(f_shadow, tab8, "self.thisown = 0\n", NIL); #else Printv(f_shadow, tab8, "self.this.disown()\n", NIL); #endif Printv(f_shadow, tab8, module, ".", mrename, "(self)\n", NIL); Printv(f_shadow, tab8, "return weakref.proxy(self)\n", NIL); Delete(mrename); } } return result; } /* ---------------------------------------------------------------------------- * END of C++ Director Class modifications * ------------------------------------------------------------------------- */ /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { if (shadow && !Getattr(n, "feature:onlychildren")) { Node *mod = Getattr(n, "module"); if (mod) { String *modname = Getattr(mod, "name"); Node *options = Getattr(mod, "options"); String *pkg = options ? Getattr(options, "package") : 0; String *sym = Getattr(n, "sym:name"); String *importname = import_name_string(package, mainmodule, pkg, modname, sym); Setattr(n, "python:proxy", importname); Delete(importname); } } int result = Language::classDeclaration(n); return result; } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ String *add_explicit_scope(String *s) { if (!Strstr(s, "::")) { String *ss = NewStringf("::%s", s); Delete(s); s = ss; } return s; } void builtin_pre_decl(Node *n) { String *name = Getattr(n, "name"); String *rname = add_explicit_scope(SwigType_namestr(name)); String *mname = SwigType_manglestr(rname); Printf(f_init, "\n/* type '%s' */\n", rname); Printf(f_init, " builtin_pytype = (PyTypeObject *)&SwigPyBuiltin_%s_type;\n", mname); Printf(f_init, " builtin_pytype->tp_dict = d = PyDict_New();\n"); Delete(rname); Delete(mname); } void builtin_post_decl(File *f, Node *n) { String *name = Getattr(n, "name"); String *pname = Copy(name); SwigType_add_pointer(pname); String *symname = Getattr(n, "sym:name"); String *rname = add_explicit_scope(SwigType_namestr(name)); String *mname = SwigType_manglestr(rname); String *pmname = SwigType_manglestr(pname); String *templ = NewStringf("SwigPyBuiltin_%s", mname); int funpack = fastunpack; static String *tp_new = NewString("PyType_GenericNew"); Printv(f_init, " SwigPyBuiltin_SetMetaType(builtin_pytype, metatype);\n", NIL); // We can’t statically initialize a structure member with a function defined in another C module // So this is done in the initialization function instead, see https://docs.python.org/2/extending/newtypes.html Printf(f_init, " builtin_pytype->tp_new = %s;\n", getSlot(n, "feature:python:tp_new", tp_new)); Printv(f_init, " builtin_base_count = 0;\n", NIL); List *baselist = Getattr(n, "bases"); if (baselist) { int base_count = 0; for (Iterator b = First(baselist); b.item; b = Next(b)) { String *bname = Getattr(b.item, "name"); if (!bname || GetFlag(b.item, "feature:ignore")) continue; base_count++; String *base_name = Copy(bname); SwigType_add_pointer(base_name); String *base_mname = SwigType_manglestr(base_name); Printf(f_init, " builtin_basetype = SWIG_MangledTypeQuery(\"%s\");\n", base_mname); Printv(f_init, " if (builtin_basetype && builtin_basetype->clientdata && ((SwigPyClientData *) builtin_basetype->clientdata)->pytype) {\n", NIL); Printv(f_init, " builtin_bases[builtin_base_count++] = ((SwigPyClientData *) builtin_basetype->clientdata)->pytype;\n", NIL); Printv(f_init, " } else {\n", NIL); Printf(f_init, " PyErr_SetString(PyExc_TypeError, \"Could not create type '%s' as base '%s' has not been initialized.\\n\");\n", symname, bname); Printv(f_init, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); Printv(f_init, " return NULL;\n", NIL); Printv(f_init, "#else\n", NIL); Printv(f_init, " return;\n", NIL); Printv(f_init, "#endif\n", NIL); Printv(f_init, " }\n", NIL); Delete(base_name); Delete(base_mname); } if (base_count > max_bases) max_bases = base_count; } Printv(f_init, " builtin_bases[builtin_base_count] = NULL;\n", NIL); Printv(f_init, " SwigPyBuiltin_InitBases(builtin_pytype, builtin_bases);\n", NIL); builtin_bases_needed = 1; // Check for non-public destructor, in which case tp_dealloc will issue // a warning and allow the memory to leak. Any class that doesn't explicitly // have a private/protected destructor has an implicit public destructor. static String *tp_dealloc_bad = NewString("SwigPyBuiltin_BadDealloc"); String *getset_name = NewStringf("%s_getset", templ); String *methods_name = NewStringf("%s_methods", templ); String *getset_def = NewString(""); Printf(getset_def, "SWIGINTERN PyGetSetDef %s[] = {\n", getset_name); // All objects have 'this' and 'thisown' attributes Printv(f_init, "PyDict_SetItemString(d, \"this\", this_descr);\n", NIL); Printv(f_init, "PyDict_SetItemString(d, \"thisown\", thisown_descr);\n", NIL); // Now, the rest of the attributes for (Iterator member_iter = First(builtin_getset); member_iter.item; member_iter = Next(member_iter)) { String *memname = member_iter.key; Hash *mgetset = member_iter.item; String *getter = Getattr(mgetset, "getter"); String *setter = Getattr(mgetset, "setter"); const char *getter_closure = getter ? funpack ? "SwigPyBuiltin_FunpackGetterClosure" : "SwigPyBuiltin_GetterClosure" : "0"; const char *setter_closure = setter ? funpack ? "SwigPyBuiltin_FunpackSetterClosure" : "SwigPyBuiltin_SetterClosure" : "0"; String *gspair = NewStringf("%s_%s_getset", symname, memname); Printf(f, "static SwigPyGetSet %s = { %s, %s };\n", gspair, getter ? getter : "0", setter ? setter : "0"); String *doc = Getattr(mgetset, "doc"); if (!doc) doc = NewStringf("%s.%s", name, memname); String *entry = NewStringf("{ (char *)\"%s\", %s, %s, (char *)\"%s\", &%s }", memname, getter_closure, setter_closure, doc, gspair); if (GetFlag(mgetset, "static")) { Printf(f, "static PyGetSetDef %s_def = %s;\n", gspair, entry); Printf(f_init, "static_getset = SwigPyStaticVar_new_getset(metatype, &%s_def);\n", gspair); Printf(f_init, "PyDict_SetItemString(d, static_getset->d_getset->name, (PyObject *) static_getset);\n", memname); Printf(f_init, "Py_DECREF(static_getset);\n"); } else { Printf(getset_def, " %s,\n", entry); } Delete(gspair); Delete(entry); } Printv(f, getset_def, " { NULL, NULL, NULL, NULL, NULL } /* Sentinel */\n", "};\n\n", NIL); // Rich compare function Hash *richcompare = Getattr(n, "python:richcompare"); String *richcompare_func = NewStringf("%s_richcompare", templ); assert(richcompare); Printf(f, "SWIGINTERN PyObject *\n"); Printf(f, "%s(PyObject *self, PyObject *other, int op) {\n", richcompare_func); Printf(f, " PyObject *result = NULL;\n"); if (!funpack) { Printf(f, " PyObject *tuple = PyTuple_New(1);\n"); Printf(f, " assert(tuple);\n"); Printf(f, " PyTuple_SET_ITEM(tuple, 0, other);\n"); Printf(f, " Py_XINCREF(other);\n"); } Iterator rich_iter = First(richcompare); if (rich_iter.item) { Printf(f, " switch (op) {\n"); for (; rich_iter.item; rich_iter = Next(rich_iter)) Printf(f, " case %s : result = %s(self, %s); break;\n", rich_iter.key, rich_iter.item, funpack ? "other" : "tuple"); Printv(f, " default : break;\n", NIL); Printf(f, " }\n"); } Printv(f, " if (!result) {\n", NIL); Printv(f, " if (SwigPyObject_Check(self) && SwigPyObject_Check(other)) {\n", NIL); Printv(f, " result = SwigPyObject_richcompare((SwigPyObject *)self, (SwigPyObject *)other, op);\n", NIL); Printv(f, " } else {\n", NIL); Printv(f, " result = Py_NotImplemented;\n", NIL); Printv(f, " Py_INCREF(result);\n", NIL); Printv(f, " }\n", NIL); Printv(f, " }\n", NIL); if (!funpack) Printf(f, " Py_DECREF(tuple);\n"); Printf(f, " return result;\n"); Printf(f, "}\n\n"); // Methods Printf(f, "SWIGINTERN PyMethodDef %s_methods[] = {\n", templ); Dump(builtin_methods, f); Printf(f, " { NULL, NULL, 0, NULL } /* Sentinel */\n};\n\n"); // No instance dict for nondynamic objects if (GetFlag(n, "feature:python:nondynamic")) Setattr(n, "feature:python:tp_setattro", "SWIG_Python_NonDynamicSetAttr"); Node *mod = Getattr(n, "module"); String *modname = mod ? Getattr(mod, "name") : 0; String *quoted_symname; if (package) { if (modname) quoted_symname = NewStringf("\"%s.%s.%s\"", package, modname, symname); else quoted_symname = NewStringf("\"%s.%s\"", package, symname); } else { if (modname) quoted_symname = NewStringf("\"%s.%s\"", modname, symname); else quoted_symname = NewStringf("\"%s\"", symname); } String *quoted_tp_doc_str = NewStringf("\"%s\"", getSlot(n, "feature:python:tp_doc")); String *tp_init = NewString(builtin_tp_init ? Char(builtin_tp_init) : Swig_directorclass(n) ? "0" : "SwigPyBuiltin_BadInit"); String *tp_flags = NewString("Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_CHECKTYPES"); String *tp_flags_py3 = NewString("Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE"); static String *tp_basicsize = NewStringf("sizeof(SwigPyObject)"); static String *tp_dictoffset_default = NewString("offsetof(SwigPyObject, dict)"); static String *tp_hash = NewString("SwigPyObject_hash"); String *tp_as_number = NewStringf("&%s_type.as_number", templ); String *tp_as_sequence = NewStringf("&%s_type.as_sequence", templ); String *tp_as_mapping = NewStringf("&%s_type.as_mapping", templ); String *tp_as_buffer = NewStringf("&%s_type.as_buffer", templ); Printf(f, "static PyHeapTypeObject %s_type = {\n", templ); // PyTypeObject ht_type Printf(f, " {\n"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); Printv(f, " PyVarObject_HEAD_INIT(NULL, 0)\n", NIL); Printv(f, "#else\n", NIL); Printf(f, " PyObject_HEAD_INIT(NULL)\n"); printSlot(f, getSlot(), "ob_size"); Printv(f, "#endif\n", NIL); printSlot(f, quoted_symname, "tp_name"); printSlot(f, getSlot(n, "feature:python:tp_basicsize", tp_basicsize), "tp_basicsize"); printSlot(f, getSlot(n, "feature:python:tp_itemsize"), "tp_itemsize"); printSlot(f, getSlot(n, "feature:python:tp_dealloc", tp_dealloc_bad), "tp_dealloc", "destructor"); printSlot(f, getSlot(n, "feature:python:tp_print"), "tp_print", "printfunc"); printSlot(f, getSlot(n, "feature:python:tp_getattr"), "tp_getattr", "getattrfunc"); printSlot(f, getSlot(n, "feature:python:tp_setattr"), "tp_setattr", "setattrfunc"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_compare"), "tp_compare"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_compare"), "tp_compare", "cmpfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_repr"), "tp_repr", "reprfunc"); printSlot(f, getSlot(n, "feature:python:tp_as_number", tp_as_number), "tp_as_number"); printSlot(f, getSlot(n, "feature:python:tp_as_sequence", tp_as_sequence), "tp_as_sequence"); printSlot(f, getSlot(n, "feature:python:tp_as_mapping", tp_as_mapping), "tp_as_mapping"); printSlot(f, getSlot(n, "feature:python:tp_hash", tp_hash), "tp_hash", "hashfunc"); printSlot(f, getSlot(n, "feature:python:tp_call"), "tp_call", "ternaryfunc"); printSlot(f, getSlot(n, "feature:python:tp_str"), "tp_str", "reprfunc"); printSlot(f, getSlot(n, "feature:python:tp_getattro"), "tp_getattro", "getattrofunc"); printSlot(f, getSlot(n, "feature:python:tp_setattro"), "tp_setattro", "setattrofunc"); printSlot(f, getSlot(n, "feature:python:tp_as_buffer", tp_as_buffer), "tp_as_buffer"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_flags", tp_flags_py3), "tp_flags"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_flags", tp_flags), "tp_flags"); Printv(f, "#endif\n", NIL); if (have_docstring(n)) { String *ds = cdocstring(n, AUTODOC_CLASS); String *tp_doc = NewString(""); Printf(tp_doc, "\"%s\"", ds); Delete(ds); printSlot(f, tp_doc, "tp_doc"); Delete(tp_doc); } else { printSlot(f, quoted_tp_doc_str, "tp_doc"); } printSlot(f, getSlot(n, "feature:python:tp_traverse"), "tp_traverse", "traverseproc"); printSlot(f, getSlot(n, "feature:python:tp_clear"), "tp_clear", "inquiry"); printSlot(f, getSlot(n, "feature:python:tp_richcompare", richcompare_func), "tp_richcompare", "richcmpfunc"); printSlot(f, getSlot(n, "feature:python:tp_weaklistoffset"), "tp_weaklistoffset"); printSlot(f, getSlot(n, "feature:python:tp_iter"), "tp_iter", "getiterfunc"); printSlot(f, getSlot(n, "feature:python:tp_iternext"), "tp_iternext", "iternextfunc"); printSlot(f, getSlot(n, "feature:python:tp_methods", methods_name), "tp_methods"); printSlot(f, getSlot(n, "feature:python:tp_members"), "tp_members"); printSlot(f, getSlot(n, "feature:python:tp_getset", getset_name), "tp_getset"); printSlot(f, getSlot(n, "feature:python:tp_base"), "tp_base"); printSlot(f, getSlot(n, "feature:python:tp_dict"), "tp_dict"); printSlot(f, getSlot(n, "feature:python:tp_descr_get"), "tp_descr_get", "descrgetfunc"); printSlot(f, getSlot(n, "feature:python:tp_descr_set"), "tp_descr_set", "descrsetfunc"); printSlot(f, getSlot(n, "feature:python:tp_dictoffset", tp_dictoffset_default), "tp_dictoffset", "Py_ssize_t"); printSlot(f, getSlot(n, "feature:python:tp_init", tp_init), "tp_init", "initproc"); printSlot(f, getSlot(n, "feature:python:tp_alloc"), "tp_alloc", "allocfunc"); printSlot(f, getSlot(), "tp_new", "newfunc"); printSlot(f, getSlot(n, "feature:python:tp_free"), "tp_free", "freefunc"); printSlot(f, getSlot(n, "feature:python:tp_is_gc"), "tp_is_gc", "inquiry"); printSlot(f, getSlot(n, "feature:python:tp_bases"), "tp_bases", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_mro"), "tp_mro", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_cache"), "tp_cache", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_subclasses"), "tp_subclasses", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_weaklist"), "tp_weaklist", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_del"), "tp_del", "destructor"); printSlot(f, getSlot(n, "feature:python:tp_version_tag"), "tp_version_tag", "int"); Printv(f, "#if PY_VERSION_HEX >= 0x03040000\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_finalize"), "tp_finalize", "destructor"); Printv(f, "#endif\n", NIL); Printv(f, "#if PY_VERSION_HEX >= 0x03080000\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_vectorcall"), "tp_vectorcall", "vectorcallfunc"); Printv(f, "#endif\n", NIL); Printv(f, "#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000)\n", NIL); printSlot(f, getSlot(), "tp_print"); Printv(f, "#endif\n", NIL); Printv(f, "#ifdef COUNT_ALLOCS\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_allocs"), "tp_allocs", "Py_ssize_t"); printSlot(f, getSlot(n, "feature:python:tp_frees"), "tp_frees", "Py_ssize_t"); printSlot(f, getSlot(n, "feature:python:tp_maxalloc"), "tp_maxalloc", "Py_ssize_t"); printSlot(f, getSlot(n, "feature:python:tp_prev"), "tp_prev"); printSlot(f, getSlot(n, "feature:python:tp_next"), "tp_next"); Printv(f, "#endif\n", NIL); Printf(f, " },\n"); // PyAsyncMethods as_async Printv(f, "#if PY_VERSION_HEX >= 0x03050000\n", NIL); Printf(f, " {\n"); printSlot(f, getSlot(n, "feature:python:am_await"), "am_await", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:am_aiter"), "am_aiter", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:am_anext"), "am_anext", "unaryfunc"); Printf(f, " },\n"); Printv(f, "#endif\n", NIL); // PyNumberMethods as_number Printf(f, " {\n"); printSlot(f, getSlot(n, "feature:python:nb_add"), "nb_add", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_subtract"), "nb_subtract", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_multiply"), "nb_multiply", "binaryfunc"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_divide"), "nb_divide", "binaryfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_remainder"), "nb_remainder", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_divmod"), "nb_divmod", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_power"), "nb_power", "ternaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_negative"), "nb_negative", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_positive"), "nb_positive", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_absolute"), "nb_absolute", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_nonzero"), "nb_nonzero", "inquiry"); printSlot(f, getSlot(n, "feature:python:nb_invert"), "nb_invert", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_lshift"), "nb_lshift", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_rshift"), "nb_rshift", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_and"), "nb_and", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_xor"), "nb_xor", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_or"), "nb_or", "binaryfunc"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_coerce"), "nb_coerce", "coercion"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_int"), "nb_int", "unaryfunc"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_reserved"), "nb_reserved", "void *"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_long"), "nb_long", "unaryfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_float"), "nb_float", "unaryfunc"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_oct"), "nb_oct", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_hex"), "nb_hex", "unaryfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_inplace_add"), "nb_inplace_add", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_subtract"), "nb_inplace_subtract", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_multiply"), "nb_inplace_multiply", "binaryfunc"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_inplace_divide"), "nb_inplace_divide", "binaryfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_inplace_remainder"), "nb_inplace_remainder", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_power"), "nb_inplace_power", "ternaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_lshift"), "nb_inplace_lshift", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_rshift"), "nb_inplace_rshift", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_and"), "nb_inplace_and", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_xor"), "nb_inplace_xor", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_or"), "nb_inplace_or", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_floor_divide"), "nb_floor_divide", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_divide"), "nb_true_divide", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_floor_divide"), "nb_inplace_floor_divide", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_divide"), "nb_inplace_true_divide", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_index"), "nb_index", "unaryfunc"); Printv(f, "#if PY_VERSION_HEX >= 0x03050000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_matrix_multiply"), "nb_matrix_multiply", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_matrix_multiply"), "nb_inplace_matrix_multiply", "binaryfunc"); Printv(f, "#endif\n", NIL); Printf(f, " },\n"); // PyMappingMethods as_mapping; Printf(f, " {\n"); printSlot(f, getSlot(n, "feature:python:mp_length"), "mp_length", "lenfunc"); printSlot(f, getSlot(n, "feature:python:mp_subscript"), "mp_subscript", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:mp_ass_subscript"), "mp_ass_subscript", "objobjargproc"); Printf(f, " },\n"); // PySequenceMethods as_sequence; Printf(f, " {\n"); printSlot(f, getSlot(n, "feature:python:sq_length"), "sq_length", "lenfunc"); printSlot(f, getSlot(n, "feature:python:sq_concat"), "sq_concat", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:sq_repeat"), "sq_repeat", "ssizeargfunc"); printSlot(f, getSlot(n, "feature:python:sq_item"), "sq_item", "ssizeargfunc"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:was_sq_slice"), "was_sq_slice", "void *"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:sq_slice"), "sq_slice", "ssizessizeargfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:sq_ass_item"), "sq_ass_item", "ssizeobjargproc"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:was_sq_ass_slice"), "was_sq_ass_slice", "void *"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:sq_ass_slice"), "sq_ass_slice", "ssizessizeobjargproc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:sq_contains"), "sq_contains", "objobjproc"); printSlot(f, getSlot(n, "feature:python:sq_inplace_concat"), "sq_inplace_concat", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:sq_inplace_repeat"), "sq_inplace_repeat", "ssizeargfunc"); Printf(f, " },\n"); // PyBufferProcs as_buffer; Printf(f, " {\n"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:bf_getreadbuffer"), "bf_getreadbuffer", "readbufferproc"); printSlot(f, getSlot(n, "feature:python:bf_getwritebuffer"), "bf_getwritebuffer", "writebufferproc"); printSlot(f, getSlot(n, "feature:python:bf_getsegcount"), "bf_getsegcount", "segcountproc"); printSlot(f, getSlot(n, "feature:python:bf_getcharbuffer"), "bf_getcharbuffer", "charbufferproc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:bf_getbuffer"), "bf_getbuffer", "getbufferproc"); printSlot(f, getSlot(n, "feature:python:bf_releasebuffer"), "bf_releasebuffer", "releasebufferproc"); Printf(f, " },\n"); // PyObject *ht_name, *ht_slots, *ht_qualname; printSlot(f, getSlot(n, "feature:python:ht_name"), "ht_name", "PyObject *"); printSlot(f, getSlot(n, "feature:python:ht_slots"), "ht_slots", "PyObject *"); Printv(f, "#if PY_VERSION_HEX >= 0x03030000\n", NIL); printSlot(f, getSlot(n, "feature:python:ht_qualname"), "ht_qualname", "PyObject *"); // struct _dictkeysobject *ht_cached_keys; printSlot(f, getSlot(n, "feature:python:ht_cached_keys"), "ht_cached_keys"); Printv(f, "#endif\n", NIL); Printf(f, "};\n\n"); String *clientdata = NewString(""); Printf(clientdata, "&%s_clientdata", templ); SwigType_remember_mangleddata(pmname, clientdata); SwigType *smart = Swig_cparse_smartptr(n); if (smart) { SwigType_add_pointer(smart); String *smart_pmname = SwigType_manglestr(smart); SwigType_remember_mangleddata(smart_pmname, clientdata); Delete(smart_pmname); } String *clientdata_klass = NewString("0"); if (GetFlag(n, "feature:implicitconv")) { Clear(clientdata_klass); Printf(clientdata_klass, "(PyObject *) &%s_type", templ); } Printf(f, "SWIGINTERN SwigPyClientData %s_clientdata = {%s, 0, 0, 0, 0, 0, (PyTypeObject *)&%s_type};\n\n", templ, clientdata_klass, templ); Printv(f_init, " if (PyType_Ready(builtin_pytype) < 0) {\n", NIL); Printf(f_init, " PyErr_SetString(PyExc_TypeError, \"Could not create type '%s'.\");\n", symname); Printv(f_init, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); Printv(f_init, " return NULL;\n", NIL); Printv(f_init, "#else\n", NIL); Printv(f_init, " return;\n", NIL); Printv(f_init, "#endif\n", NIL); Printv(f_init, " }\n", NIL); Printv(f_init, " Py_INCREF(builtin_pytype);\n", NIL); Printf(f_init, " PyModule_AddObject(m, \"%s\", (PyObject *)builtin_pytype);\n", symname); Printf(f_init, " SwigPyBuiltin_AddPublicSymbol(public_interface, \"%s\");\n", symname); Printv(f_init, " d = md;\n", NIL); Delete(clientdata); Delete(smart); Delete(rname); Delete(pname); Delete(mname); Delete(pmname); Delete(templ); Delete(tp_flags); Delete(tp_flags_py3); Delete(tp_as_buffer); Delete(tp_as_mapping); Delete(tp_as_sequence); Delete(tp_as_number); Delete(quoted_symname); Delete(quoted_tp_doc_str); Delete(tp_init); Delete(clientdata_klass); Delete(richcompare_func); Delete(getset_name); Delete(methods_name); } virtual int classHandler(Node *n) { File *f_shadow_file = f_shadow; Node *base_node = NULL; if (shadow) { /* Create new strings for building up a wrapper function */ have_constructor = 0; have_repr = 0; class_name = Getattr(n, "sym:name"); real_classname = Getattr(n, "name"); if (!addSymbol(class_name, n)) return SWIG_ERROR; if (builtin) { List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist) > 0) { Iterator b = First(baselist); base_node = b.item; } } shadow_indent = (String *) tab4; /* Handle inheritance */ String *base_class = NewString(""); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "python:proxy"); bool ignore = GetFlag(b.item, "feature:ignore") ? true : false; if (!bname || ignore) { if (!bname && !ignore) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(n), Getline(n), "Base class '%s' ignored - unknown module name for base. Either import the appropriate module interface file or specify the name of the module in the %%import directive.\n", SwigType_namestr(Getattr(b.item, "name"))); } b = Next(b); continue; } Printv(base_class, bname, NIL); b = Next(b); if (b.item) { Printv(base_class, ", ", NIL); } } } if (builtin) { Hash *base_richcompare = NULL; Hash *richcompare = NULL; if (base_node) base_richcompare = Getattr(base_node, "python:richcompare"); if (base_richcompare) richcompare = Copy(base_richcompare); else richcompare = NewHash(); Setattr(n, "python:richcompare", richcompare); } /* dealing with abstract base class */ String *abcs = Getattr(n, "feature:python:abc"); if (py3 && abcs) { if (Len(base_class)) { Printv(base_class, ", ", NIL); } Printv(base_class, abcs, NIL); } if (builtin) { if (have_docstring(n)) { String *ds = cdocstring(n, AUTODOC_CLASS); Setattr(n, "feature:python:tp_doc", ds); Delete(ds); } else { String *name = Getattr(n, "name"); String *rname = add_explicit_scope(SwigType_namestr(name)); Setattr(n, "feature:python:tp_doc", rname); Delete(rname); } } else { if (!py3) { if (GetFlag(n, "feature:python:nondynamic")) Printv(f_shadow, "@_swig_add_metaclass(_SwigNonDynamicMeta)\n", NIL); } Printv(f_shadow, "class ", class_name, NIL); if (Len(base_class)) { Printf(f_shadow, "(%s)", base_class); } else { if (GetFlag(n, "feature:exceptionclass")) { Printf(f_shadow, "(Exception)"); } else { Printf(f_shadow, "(object"); Printf(f_shadow, py3 && GetFlag(n, "feature:python:nondynamic") ? ", metaclass=_SwigNonDynamicMeta" : "", ")"); Printf(f_shadow, ")"); } } Printf(f_shadow, ":\n"); // write docstrings if requested if (have_docstring(n)) { String *str = docstring(n, AUTODOC_CLASS, tab4); if (str && Len(str)) Printv(f_shadow, tab4, str, "\n\n", NIL); } Printv(f_shadow, tab4, "thisown = property(lambda x: x.this.own(), ", "lambda x, v: x.this.own(v), doc=\"The membership flag\")\n", NIL); /* Add static attribute */ if (GetFlag(n, "feature:python:nondynamic")) { Printv(f_shadow_file, tab4, "__setattr__ = _swig_setattr_nondynamic_instance_variable(object.__setattr__)\n", NIL); } } } /* Emit all of the members */ in_class = 1; if (builtin) builtin_pre_decl(n); /* Override the shadow file so we can capture its methods */ f_shadow = NewString(""); // Set up type check for director class constructor Clear(none_comparison); if (builtin && Swig_directorclass(n)) { String *p_real_classname = Copy(real_classname); SwigType_add_pointer(p_real_classname); String *mangle = SwigType_manglestr(p_real_classname); String *descriptor = NewStringf("SWIGTYPE%s", mangle); Printv(none_comparison, "self->ob_type != ((SwigPyClientData *)(", descriptor, ")->clientdata)->pytype", NIL); Delete(descriptor); Delete(mangle); Delete(p_real_classname); } else { Printv(none_comparison, "$arg != Py_None", NIL); } Language::classHandler(n); in_class = 0; /* Complete the class */ if (shadow) { /* Generate a class registration function */ // Replace storing a pointer to underlying class with a smart pointer (intended for use with non-intrusive smart pointers) SwigType *smart = Swig_cparse_smartptr(n); SwigType *ct = Copy(smart ? smart : real_classname); SwigType_add_pointer(ct); SwigType *realct = Copy(real_classname); SwigType_add_pointer(realct); SwigType_remember(realct); if (builtin) { Printv(f_wrappers, builtin_closures_code, NIL); Delete(builtin_closures_code); builtin_closures_code = NewString(""); Clear(builtin_closures); } else { Printv(f_wrappers, "SWIGINTERN PyObject *", class_name, "_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {\n", NIL); Printv(f_wrappers, " PyObject *obj;\n", NIL); Printv(f_wrappers, " if (!SWIG_Python_UnpackTuple(args, \"swigregister\", 1, 1, &obj)) return NULL;\n", NIL); Printv(f_wrappers, " SWIG_TypeNewClientData(SWIGTYPE", SwigType_manglestr(ct), ", SWIG_NewClientData(obj));\n", " return SWIG_Py_Void();\n", "}\n\n", NIL); String *cname = NewStringf("%s_swigregister", class_name); add_method(cname, cname, 0, 0, 1, 1, 1); Delete(cname); } Delete(smart); Delete(ct); Delete(realct); if (!have_constructor) { if (!builtin) Printv(f_shadow_file, "\n", tab4, "def __init__(self, *args, **kwargs):\n", tab8, "raise AttributeError(\"", "No constructor defined", (Getattr(n, "abstracts") ? " - class is abstract" : ""), "\")\n", NIL); } else if (!builtin) { Printv(f_wrappers, "SWIGINTERN PyObject *", class_name, "_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {\n", NIL); Printv(f_wrappers, " return SWIG_Python_InitShadowInstance(args);\n", "}\n\n", NIL); String *cname = NewStringf("%s_swiginit", class_name); add_method(cname, cname, 0); Delete(cname); } if (!have_repr && !builtin) { /* Supply a repr method for this class */ String *rname = SwigType_namestr(real_classname); Printv(f_shadow_file, tab4, "__repr__ = _swig_repr\n", NIL); Delete(rname); } if (builtin) builtin_post_decl(f_builtins, n); if (builtin_tp_init) { Delete(builtin_tp_init); builtin_tp_init = 0; } if (!builtin) { /* Now emit methods */ Printv(f_shadow_file, f_shadow, NIL); Printf(f_shadow_file, "\n"); Printf(f_shadow_file, "# Register %s in %s:\n", class_name, module); Printf(f_shadow_file, "%s.%s_swigregister(%s)\n", module, class_name, class_name); } shadow_indent = 0; Printf(f_shadow_file, "%s\n", f_shadow_stubs); Clear(f_shadow_stubs); } if (builtin) { Clear(class_members); Clear(builtin_getset); Clear(builtin_methods); } /* Restore shadow file back to original version */ Delete(f_shadow); f_shadow = f_shadow_file; return SWIG_OK; } /* ------------------------------------------------------------ * functionHandler() - Mainly overloaded for callback handling * ------------------------------------------------------------ */ virtual int functionHandler(Node *n) { String *pcb = GetFlagAttr(n, "feature:python:callback"); if (pcb) { if (Strcmp(pcb, "1") == 0) { SetFlagAttr(n, "feature:callback", "%s_cb_ptr"); } else { SetFlagAttr(n, "feature:callback", pcb); } autodoc_l dlevel = autodoc_level(Getattr(n, "feature:autodoc")); if (dlevel != NO_AUTODOC && dlevel > TYPES_AUTODOC) { Setattr(n, "feature:autodoc", "1"); } } return Language::functionHandler(n); } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldshadow; if (builtin) Swig_save("builtin_memberfunc", n, "python:argcount", NIL); /* Create the default member function */ oldshadow = shadow; /* Disable shadowing when wrapping member functions */ if (shadow) shadow = shadow | PYSHADOW_MEMBER; Language::memberfunctionHandler(n); shadow = oldshadow; if (builtin && in_class) { // Can't use checkAttribute(n, "access", "public") because // "access" attr isn't set on %extend methods if (!checkAttribute(n, "access", "private") && strncmp(Char(symname), "operator ", 9) && !Getattr(class_members, symname)) { String *fullname = Swig_name_member(NSPACE_TODO, class_name, symname); String *wname = Swig_name_wrapper(fullname); Setattr(class_members, symname, n); int argcount = Getattr(n, "python:argcount") ? atoi(Char(Getattr(n, "python:argcount"))) : 2; String *ds = have_docstring(n) ? cdocstring(n, AUTODOC_METHOD) : NewString(""); if (check_kwargs(n)) { // Cast via void(*)(void) to suppress GCC -Wcast-function-type // warning. Python should always call the function correctly, but // the Python C API requires us to store it in function pointer of a // different type. Printf(builtin_methods, " { \"%s\", (PyCFunction)(void(*)(void))%s, METH_VARARGS|METH_KEYWORDS, \"%s\" },\n", symname, wname, ds); } else if (argcount == 0) { Printf(builtin_methods, " { \"%s\", %s, METH_NOARGS, \"%s\" },\n", symname, wname, ds); } else if (argcount == 1) { Printf(builtin_methods, " { \"%s\", %s, METH_O, \"%s\" },\n", symname, wname, ds); } else { Printf(builtin_methods, " { \"%s\", %s, METH_VARARGS, \"%s\" },\n", symname, wname, ds); } Delete(fullname); Delete(wname); Delete(ds); } } if (builtin) Swig_restore(n); if (!Getattr(n, "sym:nextSibling")) { if (shadow && !builtin) { int fproxy = fastproxy; String *fullname = Swig_name_member(NSPACE_TODO, class_name, symname); if (Strcmp(symname, "__repr__") == 0) { have_repr = 1; } if (Getattr(n, "feature:shadow")) { String *pycode = indent_pythoncode(Getattr(n, "feature:shadow"), tab4, Getfile(n), Getline(n), "%feature(\"shadow\")"); String *pyaction = NewStringf("%s.%s", module, fullname); Replaceall(pycode, "$action", pyaction); Delete(pyaction); Printv(f_shadow, pycode, "\n", NIL); Delete(pycode); fproxy = 0; } else { int allow_kwargs = (check_kwargs(n) && !Getattr(n, "sym:overloaded")) ? 1 : 0; String *parms = make_pyParmList(n, true, false, allow_kwargs); String *callParms = make_pyParmList(n, true, true, allow_kwargs); if (!have_addtofunc(n)) { if (!fastproxy || olddefs) { Printv(f_shadow, "\n", tab4, "def ", symname, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_METHOD, tab8), "\n", NIL); Printv(f_shadow, tab8, "return ", funcCall(fullname, callParms), "\n", NIL); } } else { Printv(f_shadow, "\n", tab4, "def ", symname, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_METHOD, tab8), "\n", NIL); if (have_pythonprepend(n)) { fproxy = 0; Printv(f_shadow, indent_pythoncode(pythonprepend(n), tab8, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); } if (have_pythonappend(n)) { fproxy = 0; Printv(f_shadow, tab8, "val = ", funcCall(fullname, callParms), "\n", NIL); Printv(f_shadow, indent_pythoncode(pythonappend(n), tab8, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_shadow, tab8, "return val\n\n", NIL); } else { Printv(f_shadow, tab8, "return ", funcCall(fullname, callParms), "\n\n", NIL); } } } if (fproxy) { Printf(f_shadow, tab4); Printf(f_shadow, "%s = _swig_new_instance_method(%s.%s)\n", symname, module, Swig_name_member(NSPACE_TODO, class_name, symname)); } Delete(fullname); } } return SWIG_OK; } /* ------------------------------------------------------------ * staticmemberfunctionHandler() * ------------------------------------------------------------ */ virtual int staticmemberfunctionHandler(Node *n) { String *symname = Getattr(n, "sym:name"); if (builtin && in_class) { Swig_save("builtin_memberconstantHandler", n, "pybuiltin:symname", NIL); Setattr(n, "pybuiltin:symname", symname); } Language::staticmemberfunctionHandler(n); if (builtin && in_class) { Swig_restore(n); } if (builtin && in_class) { if ((GetFlagAttr(n, "feature:extend") || checkAttribute(n, "access", "public")) && !Getattr(class_members, symname)) { String *fullname = Swig_name_member(NSPACE_TODO, class_name, symname); String *wname = Swig_name_wrapper(fullname); Setattr(class_members, symname, n); int funpack = fastunpack && !Getattr(n, "sym:overloaded"); String *pyflags = NewString("METH_STATIC|"); int argcount = Getattr(n, "python:argcount") ? atoi(Char(Getattr(n, "python:argcount"))) : 2; if (funpack && argcount == 0) Append(pyflags, "METH_NOARGS"); else if (funpack && argcount == 1) Append(pyflags, "METH_O"); else Append(pyflags, "METH_VARARGS"); // Cast via void(*)(void) to suppress GCC -Wcast-function-type warning. // Python should always call the function correctly, but the Python C // API requires us to store it in function pointer of a different type. if (have_docstring(n)) { String *ds = cdocstring(n, AUTODOC_STATICFUNC); Printf(builtin_methods, " { \"%s\", (PyCFunction)(void(*)(void))%s, %s, \"%s\" },\n", symname, wname, pyflags, ds); Delete(ds); } else { Printf(builtin_methods, " { \"%s\", (PyCFunction)(void(*)(void))%s, %s, \"\" },\n", symname, wname, pyflags); } Delete(fullname); Delete(wname); Delete(pyflags); } return SWIG_OK; } if (Getattr(n, "sym:nextSibling")) { return SWIG_OK; } if (shadow) { String *staticfunc_name = NewString(fastproxy ? "_swig_new_static_method" : "staticmethod"); bool fast = (fastproxy && !have_addtofunc(n)) || Getattr(n, "feature:callback"); if (!fast || olddefs) { int kw = (check_kwargs(n) && !Getattr(n, "sym:overloaded")) ? 1 : 0; String *parms = make_pyParmList(n, false, false, kw); String *callParms = make_pyParmList(n, false, true, kw); Printv(f_shadow, "\n", tab4, "@staticmethod", NIL); Printv(f_shadow, "\n", tab4, "def ", symname, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_STATICFUNC, tab8), "\n", NIL); if (have_pythonprepend(n)) Printv(f_shadow, indent_pythoncode(pythonprepend(n), tab8, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); if (have_pythonappend(n)) { Printv(f_shadow, tab8, "val = ", funcCall(Swig_name_member(NSPACE_TODO, class_name, symname), callParms), "\n", NIL); Printv(f_shadow, indent_pythoncode(pythonappend(n), tab8, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_shadow, tab8, "return val\n", NIL); } else { Printv(f_shadow, tab8, "return ", funcCall(Swig_name_member(NSPACE_TODO, class_name, symname), callParms), "\n", NIL); } } // Below may result in a 2nd definition of the method when -olddefs is used. The Python interpreter will use the second definition as it overwrites the first. if (fast) { Printv(f_shadow, tab4, symname, " = ", staticfunc_name, "(", module, ".", Swig_name_member(NSPACE_TODO, class_name, symname), ")\n", NIL); } Delete(staticfunc_name); } return SWIG_OK; } /* ------------------------------------------------------------ * constructorDeclaration() * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldshadow = shadow; int use_director = Swig_directorclass(n); /* * If we're wrapping the constructor of a C++ director class, prepend a new parameter * to receive the scripting language object (e.g. 'self') * */ Swig_save("python:constructorHandler", n, "parms", NIL); if (use_director) { Parm *parms = Getattr(n, "parms"); Parm *self; String *name = NewString("self"); String *type = NewString("PyObject"); SwigType_add_pointer(type); self = NewParm(type, name, n); Delete(type); Delete(name); Setattr(self, "lname", "O"); if (parms) set_nextSibling(self, parms); Setattr(n, "parms", self); Setattr(n, "wrap:self", "1"); Setattr(n, "hidden", "1"); Delete(self); } if (shadow) shadow = shadow | PYSHADOW_MEMBER; Language::constructorHandler(n); shadow = oldshadow; Delattr(n, "wrap:self"); Swig_restore(n); if (!Getattr(n, "sym:nextSibling")) { if (shadow) { int allow_kwargs = (check_kwargs(n) && (!Getattr(n, "sym:overloaded"))) ? 1 : 0; int handled_as_init = 0; if (!have_constructor) { String *nname = Getattr(n, "sym:name"); String *sname = Getattr(getCurrentClass(), "sym:name"); String *cname = Swig_name_construct(NSPACE_TODO, sname); handled_as_init = (Strcmp(nname, sname) == 0) || (Strcmp(nname, cname) == 0); Delete(cname); } String *subfunc = Swig_name_construct(NSPACE_TODO, symname); if (!have_constructor && handled_as_init) { if (!builtin) { if (Getattr(n, "feature:shadow")) { String *pycode = indent_pythoncode(Getattr(n, "feature:shadow"), tab4, Getfile(n), Getline(n), "%feature(\"shadow\")"); String *pyaction = NewStringf("%s.%s", module, subfunc); Replaceall(pycode, "$action", pyaction); Delete(pyaction); Printv(f_shadow, pycode, "\n", NIL); Delete(pycode); } else { String *pass_self = NewString(""); Node *parent = Swig_methodclass(n); String *classname = Swig_class_name(parent); String *rclassname = Swig_class_name(getCurrentClass()); assert(rclassname); String *parms = make_pyParmList(n, true, false, allow_kwargs); /* Pass 'self' only if using director */ String *callParms = make_pyParmList(n, false, true, allow_kwargs, true); if (use_director) { Insert(callParms, 0, "_self, "); Printv(pass_self, tab8, NIL); Printf(pass_self, "if self.__class__ == %s:\n", classname); //Printv(pass_self, tab8, tab4, "args = (None,) + args\n", tab8, "else:\n", tab8, tab4, "args = (self,) + args\n", NIL); Printv(pass_self, tab8, tab4, "_self = None\n", tab8, "else:\n", tab8, tab4, "_self = self\n", NIL); } Printv(f_shadow, "\n", tab4, "def __init__(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_CTOR, tab8), "\n", NIL); if (have_pythonprepend(n)) Printv(f_shadow, indent_pythoncode(pythonprepend(n), tab8, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); Printv(f_shadow, pass_self, NIL); Printv(f_shadow, tab8, module, ".", class_name, "_swiginit(self, ", funcCall(subfunc, callParms), ")\n", NIL); if (have_pythonappend(n)) Printv(f_shadow, indent_pythoncode(pythonappend(n), tab8, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n\n", NIL); Delete(pass_self); } have_constructor = 1; } } else { /* Hmmm. We seem to be creating a different constructor. We're just going to create a function for it. */ if (!builtin) { if (Getattr(n, "feature:shadow")) { String *pycode = indent_pythoncode(Getattr(n, "feature:shadow"), "", Getfile(n), Getline(n), "%feature(\"shadow\")"); String *pyaction = NewStringf("%s.%s", module, subfunc); Replaceall(pycode, "$action", pyaction); Delete(pyaction); Printv(f_shadow_stubs, pycode, "\n", NIL); Delete(pycode); } else { String *parms = make_pyParmList(n, false, false, allow_kwargs); String *callParms = make_pyParmList(n, false, true, allow_kwargs); Printv(f_shadow_stubs, "\ndef ", symname, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow_stubs, tab4, docstring(n, AUTODOC_CTOR, tab4), "\n", NIL); if (have_pythonprepend(n)) Printv(f_shadow_stubs, indent_pythoncode(pythonprepend(n), tab4, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); Printv(f_shadow_stubs, tab4, "val = ", funcCall(subfunc, callParms), "\n", NIL); #ifdef USE_THISOWN Printv(f_shadow_stubs, tab4, "val.thisown = 1\n", NIL); #endif if (have_pythonappend(n)) Printv(f_shadow_stubs, indent_pythoncode(pythonappend(n), tab4, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_shadow_stubs, tab4, "return val\n", NIL); } } else { Printf(f_shadow_stubs, "%s = %s\n", symname, subfunc); } } Delete(subfunc); } } return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldshadow = shadow; if (builtin && in_class) { Node *cls = Swig_methodclass(n); // Use the destructor for the tp_dealloc slot unless a user overrides it with another method if (!Getattr(cls, "feature:python:tp_dealloc")) { Setattr(n, "feature:python:slot", "tp_dealloc"); Setattr(n, "feature:python:slot:functype", "destructor"); } } if (shadow) shadow = shadow | PYSHADOW_MEMBER; //Setattr(n,"emit:dealloc","1"); Language::destructorHandler(n); shadow = oldshadow; if (shadow) { if (Getattr(n, "feature:shadow")) { String *pycode = indent_pythoncode(Getattr(n, "feature:shadow"), tab4, Getfile(n), Getline(n), "%feature(\"shadow\")"); String *pyaction = NewStringf("%s.%s", module, Swig_name_destroy(NSPACE_TODO, symname)); Replaceall(pycode, "$action", pyaction); Delete(pyaction); Printv(f_shadow, pycode, "\n", NIL); Delete(pycode); } else { Printv(f_shadow, tab4, "__swig_destroy__ = ", module, ".", Swig_name_destroy(NSPACE_TODO, symname), "\n", NIL); if (!have_pythonprepend(n) && !have_pythonappend(n)) { return SWIG_OK; } Printv(f_shadow, tab4, "def __del__(self):\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_DTOR, tab8), "\n", NIL); if (have_pythonprepend(n)) Printv(f_shadow, indent_pythoncode(pythonprepend(n), tab8, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); #ifdef USE_THISOWN Printv(f_shadow, tab8, "try:\n", NIL); Printv(f_shadow, tab8, tab4, "if self.thisown:", module, ".", Swig_name_destroy(NSPACE_TODO, symname), "(self)\n", NIL); Printv(f_shadow, tab8, "except __builtin__.Exception: pass\n", NIL); #else #endif if (have_pythonappend(n)) Printv(f_shadow, indent_pythoncode(pythonappend(n), tab8, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_shadow, tab8, "pass\n", NIL); Printv(f_shadow, "\n", NIL); } } return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldshadow = shadow; if (shadow) shadow = shadow | PYSHADOW_MEMBER; Language::membervariableHandler(n); shadow = oldshadow; if (shadow && !builtin) { String *mname = Swig_name_member(NSPACE_TODO, class_name, symname); String *setname = Swig_name_set(NSPACE_TODO, mname); String *getname = Swig_name_get(NSPACE_TODO, mname); int assignable = is_assignable(n); Printv(f_shadow, tab4, symname, " = property(", module, ".", getname, NIL); if (assignable) Printv(f_shadow, ", ", module, ".", setname, NIL); if (have_docstring(n)) Printv(f_shadow, ", doc=", docstring(n, AUTODOC_VAR, tab4), NIL); Printv(f_shadow, ")\n", NIL); Delete(mname); Delete(setname); Delete(getname); } return SWIG_OK; } /* ------------------------------------------------------------ * staticmembervariableHandler() * ------------------------------------------------------------ */ virtual int staticmembervariableHandler(Node *n) { Swig_save("builtin_staticmembervariableHandler", n, "builtin_symname", NIL); Language::staticmembervariableHandler(n); Swig_restore(n); if (GetFlag(n, "wrappedasconstant")) return SWIG_OK; String *symname = Getattr(n, "sym:name"); if (shadow) { if (!builtin && GetFlag(n, "hasconsttype")) { String *mname = Swig_name_member(NSPACE_TODO, class_name, symname); Printf(f_shadow_stubs, "%s.%s = %s.%s.%s\n", class_name, symname, module, global_name, mname); Delete(mname); } else { String *mname = Swig_name_member(NSPACE_TODO, class_name, symname); String *getname = Swig_name_get(NSPACE_TODO, mname); String *wrapgetname = Swig_name_wrapper(getname); String *vargetname = NewStringf("Swig_var_%s", getname); String *setname = Swig_name_set(NSPACE_TODO, mname); String *wrapsetname = Swig_name_wrapper(setname); String *varsetname = NewStringf("Swig_var_%s", setname); Wrapper *f = NewWrapper(); Printv(f->def, "SWIGINTERN PyObject *", wrapgetname, "(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(args)) {", NIL); Printv(f->code, " return ", vargetname, "();\n", NIL); Append(f->code, "}\n"); add_method(getname, wrapgetname, 0); Wrapper_print(f, f_wrappers); DelWrapper(f); int assignable = is_assignable(n); if (assignable) { int funpack = fastunpack; Wrapper *f = NewWrapper(); Printv(f->def, "SWIGINTERN PyObject *", wrapsetname, "(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {", NIL); Wrapper_add_local(f, "res", "int res"); if (!funpack) { Wrapper_add_local(f, "value", "PyObject *value"); Append(f->code, "if (!PyArg_ParseTuple(args, \"O:set\", &value)) return NULL;\n"); } Printf(f->code, "res = %s(%s);\n", varsetname, funpack ? "args" : "value"); Append(f->code, "return !res ? SWIG_Py_Void() : NULL;\n"); Append(f->code, "}\n"); Wrapper_print(f, f_wrappers); add_method(setname, wrapsetname, 0, 0, funpack, 1, 1); DelWrapper(f); } if (!builtin) { Printv(f_shadow, tab4, symname, " = property(", module, ".", getname, NIL); if (assignable) Printv(f_shadow, ", ", module, ".", setname, NIL); if (have_docstring(n)) Printv(f_shadow, ", doc=", docstring(n, AUTODOC_VAR, tab4), NIL); Printv(f_shadow, ")\n", NIL); } String *getter = Getattr(n, "pybuiltin:getter"); String *setter = Getattr(n, "pybuiltin:setter"); Hash *h = NULL; if (getter || setter) { h = Getattr(builtin_getset, symname); if (!h) { h = NewHash(); Setattr(h, "static", "1"); Setattr(builtin_getset, symname, h); } } if (getter) Setattr(h, "getter", getter); if (setter) Setattr(h, "setter", setter); if (h) Delete(h); Delete(mname); Delete(getname); Delete(wrapgetname); Delete(vargetname); Delete(setname); Delete(wrapsetname); Delete(varsetname); } } return SWIG_OK; } /* ------------------------------------------------------------ * memberconstantHandler() * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { String *symname = Getattr(n, "sym:name"); if (builtin && in_class) { Swig_save("builtin_memberconstantHandler", n, "pybuiltin:symname", NIL); Setattr(n, "pybuiltin:symname", symname); } int oldshadow = shadow; if (shadow) shadow = shadow | PYSHADOW_MEMBER; Language::memberconstantHandler(n); shadow = oldshadow; if (builtin && in_class) { Swig_restore(n); } else if (shadow) { Printv(f_shadow, tab4, symname, " = ", module, ".", Swig_name_member(NSPACE_TODO, class_name, symname), "\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab4, docstring(n, AUTODOC_CONST, tab4), "\n", NIL); } return SWIG_OK; } /* ------------------------------------------------------------ * insertDirective() * * Hook for %insert directive. We're going to look for special %shadow inserts * as a special case so we can do indenting correctly * ------------------------------------------------------------ */ virtual int insertDirective(Node *n) { String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); if (!ImportMode && (Cmp(section, "python") == 0 || Cmp(section, "shadow") == 0)) { if (shadow) { String *pycode = indent_pythoncode(code, shadow_indent, Getfile(n), Getline(n), "%pythoncode or %insert(\"python\") block"); Printv(f_shadow, pycode, NIL); Delete(pycode); } } else if (!ImportMode && (Cmp(section, "pythonbegin") == 0)) { if (shadow) { String *pycode = indent_pythoncode(code, "", Getfile(n), Getline(n), "%pythonbegin or %insert(\"pythonbegin\") block"); Printv(f_shadow_begin, pycode, NIL); Delete(pycode); } } else { Language::insertDirective(n); } return SWIG_OK; } virtual String *runtimeCode() { String *s = NewString(""); String *shead = Swig_include_sys("pyhead.swg"); if (!shead) { Printf(stderr, "*** Unable to open 'pyhead.swg'\n"); } else { Append(s, shead); Delete(shead); } String *serrors = Swig_include_sys("pyerrors.swg"); if (!serrors) { Printf(stderr, "*** Unable to open 'pyerrors.swg'\n"); } else { Append(s, serrors); Delete(serrors); } String *sthread = Swig_include_sys("pythreads.swg"); if (!sthread) { Printf(stderr, "*** Unable to open 'pythreads.swg'\n"); } else { Append(s, sthread); Delete(sthread); } String *sapi = Swig_include_sys("pyapi.swg"); if (!sapi) { Printf(stderr, "*** Unable to open 'pyapi.swg'\n"); } else { Append(s, sapi); Delete(sapi); } String *srun = Swig_include_sys("pyrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'pyrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } virtual String *defaultExternalRuntimeFilename() { return NewString("swigpyrun.h"); } /*---------------------------------------------------------------------- * kwargsSupport() *--------------------------------------------------------------------*/ bool kwargsSupport() const { return true; } }; /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying Python object. * * ** Moved it here due to internal error on gcc-2.96 ** * --------------------------------------------------------------- */ int PYTHON::classDirectorMethods(Node *n) { director_method_index = 0; return Language::classDirectorMethods(n); } int PYTHON::classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); String *returntype = Getattr(n, "type"); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (builtin) { // Rename any wrapped parameters called 'self' as the generated code contains a variable with same name Parm *p; for (p = l; p; p = nextSibling(p)) { String *arg = Getattr(p, "name"); if (arg && Cmp(arg, "self") == 0) Delattr(p, "name"); } } if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (builtin) { Printv(w->code, "PyObject *self = NULL;\n", NIL); Printv(w->code, "(void)self;\n", NIL); } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> Python) */ String *arglist = NewString(""); String *parse_args = NewString(""); Swig_director_parms_fixup(l); /* remove the wrapper 'w' since it was producing spurious temps */ Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("directorargout", l, w); Parm *p; char source[256]; int outputs = 0; if (!is_void) outputs++; /* build argument list and type conversion string */ idx = 0; p = l; int use_parse = 0; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* old style? caused segfaults without the p!=0 check in the for() condition, and seems dangerous in the while loop as well. while (Getattr(p, "tmap:ignore")) { p = Getattr(p, "tmap:ignore:next"); } */ if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); Putc(',', arglist); if ((tm = Getattr(p, "tmap:directorin")) != 0) { String *parse = Getattr(p, "tmap:directorin:parse"); if (!parse) { sprintf(source, "obj%d", idx++); String *input = NewString(source); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Delete(input); Replaceall(tm, "$owner", "0"); /* Wrapper_add_localv(w, source, "swig::SwigVar_PyObject", source, "= 0", NIL); */ Printv(wrap_args, "swig::SwigVar_PyObject ", source, ";\n", NIL); Printv(wrap_args, tm, "\n", NIL); Printv(arglist, "(PyObject *)", source, NIL); Putc('O', parse_args); } else { use_parse = 1; Append(parse_args, parse); Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); if (Len(tm) == 0) Append(tm, pname); Append(arglist, tm); } p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { /* special handling for pointers to other C++ director classes. * ideally this would be left to a typemap, but there is currently no * way to selectively apply the dynamic_cast<> to classes that have * directors. in other words, the type "SwigDirector_$1_lname" only exists * for classes with directors. we avoid the problem here by checking * module.wrap::directormap, but it's not clear how to get a typemap to * do something similar. perhaps a new default typemap (in addition * to SWIGTYPE) called DIRECTORTYPE? */ if (SwigType_ispointer(ptype) || SwigType_isreference(ptype)) { Node *module = Getattr(parent, "module"); Node *target = Swig_directormap(module, ptype); sprintf(source, "obj%d", idx++); String *nonconst = 0; /* strip pointer/reference --- should move to Swig/stype.c */ String *nptype = NewString(Char(ptype) + 2); /* name as pointer */ String *ppname = Copy(pname); if (SwigType_isreference(ptype)) { Insert(ppname, 0, "&"); } /* if necessary, cast away const since Python doesn't support it! */ if (SwigType_isconst(nptype)) { nonconst = NewStringf("nc_tmp_%s", pname); String *nonconst_i = NewStringf("= const_cast< %s >(%s)", SwigType_lstr(ptype, 0), ppname); Wrapper_add_localv(w, nonconst, SwigType_lstr(ptype, 0), nonconst, nonconst_i, NIL); Delete(nonconst_i); Swig_warning(WARN_LANG_DISCARD_CONST, input_file, line_number, "Target language argument '%s' discards const in director method %s::%s.\n", SwigType_str(ptype, pname), SwigType_namestr(c_classname), SwigType_namestr(name)); } else { nonconst = Copy(ppname); } Delete(nptype); Delete(ppname); String *mangle = SwigType_manglestr(ptype); if (target) { String *director = NewStringf("director_%s", mangle); Wrapper_add_localv(w, director, "Swig::Director *", director, "= 0", NIL); Wrapper_add_localv(w, source, "swig::SwigVar_PyObject", source, "= 0", NIL); Printf(wrap_args, "%s = SWIG_DIRECTOR_CAST(%s);\n", director, nonconst); Printf(wrap_args, "if (!%s) {\n", director); Printf(wrap_args, "%s = SWIG_InternalNewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Append(wrap_args, "} else {\n"); Printf(wrap_args, "%s = %s->swig_get_self();\n", source, director); Printf(wrap_args, "Py_INCREF((PyObject *)%s);\n", source); Append(wrap_args, "}\n"); Delete(director); Printv(arglist, source, NIL); } else { Wrapper_add_localv(w, source, "swig::SwigVar_PyObject", source, "= 0", NIL); Printf(wrap_args, "%s = SWIG_InternalNewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); //Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE_p_%s, 0);\n", // source, nonconst, base); Printv(arglist, source, NIL); } Putc('O', parse_args); Delete(mangle); Delete(nonconst); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } } p = nextSibling(p); } /* add the method name as a PyString */ String *pyname = Getattr(n, "sym:name"); int allow_thread = threads_enable(n); if (allow_thread) { thread_begin_block(n, w->code); Append(w->code, "{\n"); } /* wrap complex arguments to PyObjects */ Printv(w->code, wrap_args, NIL); /* pass the method call on to the Python object */ if (dirprot_mode() && !is_public(n)) { Printf(w->code, "swig_set_inner(\"%s\", true);\n", name); } Append(w->code, "if (!swig_get_self()) {\n"); Printf(w->code, " Swig::DirectorException::raise(\"'self' uninitialized, maybe you forgot to call %s.__init__.\");\n", classname); Append(w->code, "}\n"); Append(w->code, "#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)\n"); Printf(w->code, "const size_t swig_method_index = %d;\n", director_method_index++); Printf(w->code, "const char *const swig_method_name = \"%s\";\n", pyname); Append(w->code, "PyObject *method = swig_get_method(swig_method_index, swig_method_name);\n"); if (Len(parse_args) > 0) { if (use_parse) { Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallFunction(method, (char *)\"(%s)\" %s);\n", Swig_cresult_name(), parse_args, arglist); } else { Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallFunctionObjArgs(method %s, NULL);\n", Swig_cresult_name(), arglist); } } else { Append(w->code, "swig::SwigVar_PyObject args = PyTuple_New(0);\n"); Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_Call(method, (PyObject *) args, NULL);\n", Swig_cresult_name()); } Append(w->code, "#else\n"); if (Len(parse_args) > 0) { if (use_parse) { Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallMethod(swig_get_self(), (char *)\"%s\", (char *)\"(%s)\" %s);\n", Swig_cresult_name(), pyname, parse_args, arglist); } else { Printf(w->code, "swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar(\"%s\");\n", pyname); Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name %s, NULL);\n", Swig_cresult_name(), arglist); } } else { Printf(w->code, "swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar(\"%s\");\n", pyname); Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name, NULL);\n", Swig_cresult_name()); } Append(w->code, "#endif\n"); if (dirprot_mode() && !is_public(n)) Printf(w->code, "swig_set_inner(\"%s\", false);\n", name); /* exception handling */ tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); if (tm) tm = Copy(tm); } Printf(w->code, "if (!%s) {\n", Swig_cresult_name()); Append(w->code, " PyObject *error = PyErr_Occurred();\n"); if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { Replaceall(tm, "$error", "error"); Printv(w->code, Str(tm), "\n", NIL); } else { Append(w->code, " if (error) {\n"); Printf(w->code, " Swig::DirectorMethodException::raise(\"Error detected when calling '%s.%s'\");\n", classname, pyname); Append(w->code, " }\n"); } Append(w->code, "}\n"); Delete(tm); /* * Python method may return a simple object, or a tuple. * for in/out arguments, we have to extract the appropriate PyObjects from the tuple, * then marshal everything back to C/C++ (return value and output arguments). * */ /* marshal return value and other outputs (if any) from PyObject to C/C++ type */ String *cleanup = NewString(""); String *outarg = NewString(""); if (outputs > 1) { Wrapper_add_local(w, "output", "PyObject *output"); Printf(w->code, "if (!PyTuple_Check(%s)) {\n", Swig_cresult_name()); Printf(w->code, " Swig::DirectorTypeMismatchException::raise(\"Python method %s.%sfailed to return a tuple.\");\n", classname, pyname); Append(w->code, "}\n"); } idx = 0; /* marshal return value */ if (!is_void) { tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { if (outputs > 1) { Printf(w->code, "output = PyTuple_GetItem(%s, %d);\n", Swig_cresult_name(), idx++); Replaceall(tm, "$input", "output"); } else { Replaceall(tm, "$input", Swig_cresult_name()); } char temp[24]; sprintf(temp, "%d", idx); Replaceall(tm, "$argnum", temp); /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } if (Getattr(n, "tmap:directorout:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } /* marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { if (outputs > 1) { Printf(w->code, "output = PyTuple_GetItem(%s, %d);\n", Swig_cresult_name(), idx++); Replaceall(tm, "$result", "output"); } else { Replaceall(tm, "$result", Swig_cresult_name()); } Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } /* any existing helper functions to handle this? */ if (allow_thread) { Append(w->code, "}\n"); thread_end_block(n, w->code); } Delete(parse_args); Delete(arglist); Delete(cleanup); Delete(outarg); } if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } /* ----------------------------------------------------------------------------- * swig_python() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_python() { return new PYTHON(); } extern "C" Language *swig_python(void) { return new_swig_python(); } swig-4.0.2/Source/Modules/chicken.cxx0000644000175000017500000013351513667507523017372 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * chicken.cxx * * CHICKEN language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include static const char *usage = "\ \ CHICKEN Options (available with -chicken)\n\ -closprefix - Prepend to all clos identifiers\n\ -noclosuses - Do not (declare (uses ...)) in scheme file\n\ -nocollection - Do not register pointers with chicken garbage\n\ collector and export destructors\n\ -nounit - Do not (declare (unit ...)) in scheme file\n\ -proxy - Export TinyCLOS class definitions\n\ -unhideprimitive - Unhide the primitive: symbols\n\ -useclassprefix - Prepend the class name to all clos identifiers\n\ \n"; static char *module = 0; static const char *chicken_path = "chicken"; static int num_methods = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_init = 0; static String *chickentext = 0; static String *closprefix = 0; static String *swigtype_ptr = 0; static String *f_sym_size = 0; /* some options */ static int declare_unit = 1; static int no_collection = 0; static int clos_uses = 1; /* C++ Support + Clos Classes */ static int clos = 0; static String *c_class_name = 0; static String *class_name = 0; static String *short_class_name = 0; static int in_class = 0; static int have_constructor = 0; static bool exporting_destructor = false; static bool exporting_constructor = false; static String *constructor_name = 0; static String *member_name = 0; /* sections of the .scm code */ static String *scm_const_defs = 0; static String *clos_class_defines = 0; static String *clos_methods = 0; /* Some clos options */ static int useclassprefix = 0; static String *clossymnameprefix = 0; static int hide_primitive = 1; static Hash *primitive_names = 0; /* Used for overloading constructors */ static int has_constructor_args = 0; static List *constructor_arg_types = 0; static String *constructor_dispatch = 0; static Hash *overload_parameter_lists = 0; class CHICKEN:public Language { public: virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int variableWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int classHandler(Node *n); virtual int memberfunctionHandler(Node *n); virtual int membervariableHandler(Node *n); virtual int constructorHandler(Node *n); virtual int destructorHandler(Node *n); virtual int validIdentifier(String *s); virtual int staticmembervariableHandler(Node *n); virtual int staticmemberfunctionHandler(Node *n); virtual int importDirective(Node *n); protected: void addMethod(String *scheme_name, String *function); /* Return true iff T is a pointer type */ int isPointer(SwigType *t); void dispatchFunction(Node *n); String *chickenNameMapping(String *, const_String_or_char_ptr ); String *chickenPrimitiveName(String *); String *runtimeCode(); String *defaultExternalRuntimeFilename(); String *buildClosFunctionCall(List *types, const_String_or_char_ptr closname, const_String_or_char_ptr funcname); }; /* ----------------------------------------------------------------------- * swig_chicken() - Instantiate module * ----------------------------------------------------------------------- */ static Language *new_swig_chicken() { return new CHICKEN(); } extern "C" { Language *swig_chicken(void) { return new_swig_chicken(); } } void CHICKEN::main(int argc, char *argv[]) { int i; SWIG_library_directory(chicken_path); // Look for certain command line options for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); SWIG_exit(0); } else if (strcmp(argv[i], "-proxy") == 0) { clos = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-closprefix") == 0) { if (argv[i + 1]) { clossymnameprefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-useclassprefix") == 0) { useclassprefix = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-unhideprimitive") == 0) { hide_primitive = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nounit") == 0) { declare_unit = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noclosuses") == 0) { clos_uses = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocollection") == 0) { no_collection = 1; Swig_mark_arg(i); } } } if (!clos) hide_primitive = 0; // Add a symbol for this module Preprocessor_define("SWIGCHICKEN 1", 0); // Set name of typemaps SWIG_typemap_lang("chicken"); // Read in default typemaps */ SWIG_config_file("chicken.swg"); allow_overloading(); } int CHICKEN::top(Node *n) { String *chicken_filename = NewString(""); File *f_scm; String *scmmodule; /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); chickentext = NewString(""); closprefix = NewString(""); f_sym_size = NewString(""); primitive_names = NewHash(); overload_parameter_lists = NewHash(); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("chicken", chickentext); Swig_register_filebyname("closprefix", closprefix); clos_class_defines = NewString(""); clos_methods = NewString(""); scm_const_defs = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGCHICKEN\n#define SWIGCHICKEN\n#endif\n\n"); if (no_collection) Printf(f_runtime, "#define SWIG_CHICKEN_NO_COLLECTION 1\n"); Printf(f_runtime, "\n"); /* Set module name */ module = Swig_copy_string(Char(Getattr(n, "name"))); scmmodule = NewString(module); Replaceall(scmmodule, "_", "-"); Printf(f_header, "#define SWIG_init swig_%s_init\n", module); Printf(f_header, "#define SWIG_name \"%s\"\n", scmmodule); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); Language::top(n); SwigType_emit_type_table(f_runtime, f_wrappers); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); Printf(f_init, "C_kontinue (continuation, ret);\n"); Printf(f_init, "}\n\n"); Printf(f_init, "#ifdef __cplusplus\n"); Printf(f_init, "}\n"); Printf(f_init, "#endif\n"); Printf(chicken_filename, "%s%s.scm", SWIG_output_directory(), module); if ((f_scm = NewFile(chicken_filename, "w", SWIG_output_files())) == 0) { FileErrorDisplay(chicken_filename); SWIG_exit(EXIT_FAILURE); } Swig_banner_target_lang(f_scm, ";;"); Printf(f_scm, "\n"); if (declare_unit) Printv(f_scm, "(declare (unit ", scmmodule, "))\n\n", NIL); Printv(f_scm, "(declare \n", tab4, "(hide swig-init swig-init-return)\n", tab4, "(foreign-declare \"C_extern void swig_", module, "_init(C_word,C_word,C_word) C_noret;\"))\n", NIL); Printv(f_scm, "(define swig-init (##core#primitive \"swig_", module, "_init\"))\n", NIL); Printv(f_scm, "(define swig-init-return (swig-init))\n\n", NIL); if (clos) { //Printf (f_scm, "(declare (uses tinyclos))\n"); //New chicken versions have tinyclos as an egg Printf(f_scm, "(require-extension tinyclos)\n"); Replaceall(closprefix, "$module", scmmodule); Printf(f_scm, "%s\n", closprefix); Printf(f_scm, "%s\n", clos_class_defines); Printf(f_scm, "%s\n", clos_methods); } else { Printf(f_scm, "%s\n", scm_const_defs); } Printf(f_scm, "%s\n", chickentext); Delete(f_scm); char buftmp[20]; sprintf(buftmp, "%d", num_methods); Replaceall(f_init, "$nummethods", buftmp); Replaceall(f_init, "$symsize", f_sym_size); if (hide_primitive) Replaceall(f_init, "$veclength", buftmp); else Replaceall(f_init, "$veclength", "0"); Delete(chicken_filename); Delete(chickentext); Delete(closprefix); Delete(overload_parameter_lists); Delete(clos_class_defines); Delete(clos_methods); Delete(scm_const_defs); /* Close all of the files */ Delete(primitive_names); Delete(scmmodule); Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_sym_size); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } int CHICKEN::functionWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; int i; String *wname; Wrapper *f; String *mangle = NewString(""); String *get_pointers; String *cleanup; String *argout; String *tm; String *overname = 0; String *declfunc = 0; String *scmname; bool any_specialized_arg = false; List *function_arg_types = NewList(); int num_required; int num_arguments; int have_argout; Printf(mangle, "\"%s\"", SwigType_manglestr(d)); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } f = NewWrapper(); wname = NewString(""); get_pointers = NewString(""); cleanup = NewString(""); argout = NewString(""); declfunc = NewString(""); scmname = NewString(iname); Replaceall(scmname, "_", "-"); /* Local vars */ Wrapper_add_local(f, "resultobj", "C_word resultobj"); /* Write code to extract function parameters. */ emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); num_required = emit_num_required(l); Append(wname, Swig_name_wrapper(iname)); if (overname) { Append(wname, overname); } // Check for interrupts Printv(f->code, "C_trace(\"", scmname, "\");\n", NIL); Printv(f->def, "static ", "void ", wname, " (C_word argc, C_word closure, C_word continuation", NIL); Printv(declfunc, "void ", wname, "(C_word,C_word,C_word", NIL); /* Generate code for argument marshalling */ for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); Printf(f->def, ", C_word scm%d", i + 1); Printf(declfunc, ",C_word"); /* Look for an input typemap */ if ((tm = Getattr(p, "tmap:in"))) { String *parse = Getattr(p, "tmap:in:parse"); if (!parse) { String *source = NewStringf("scm%d", i + 1); Replaceall(tm, "$source", source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); /* Save the location of the object */ if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } if (i >= num_required) Printf(get_pointers, "if (argc-2>%i && (%s)) {\n", i, source); Printv(get_pointers, tm, "\n", NIL); if (i >= num_required) Printv(get_pointers, "}\n", NIL); if (clos) { if (i < num_required) { if (strcmp("void", Char(pt)) != 0) { Node *class_node = 0; String *clos_code = Getattr(p, "tmap:in:closcode"); class_node = classLookup(pt); if (clos_code && class_node) { String *class_name = NewStringf("<%s>", Getattr(class_node, "sym:name")); Replaceall(class_name, "_", "-"); Append(function_arg_types, class_name); Append(function_arg_types, Copy(clos_code)); any_specialized_arg = true; Delete(class_name); } else { Append(function_arg_types, ""); Append(function_arg_types, "$input"); } } } } Delete(source); } p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } /* finish argument marshalling */ Printf(f->def, ") {"); Printf(declfunc, ")"); if (num_required != num_arguments) { Append(function_arg_types, "^^##optional$$"); } /* First check the number of arguments is correct */ if (num_arguments != num_required) Printf(f->code, "if (argc-2<%i || argc-2>%i) C_bad_argc(argc,%i);\n", num_required, num_arguments, num_required + 2); else Printf(f->code, "if (argc!=%i) C_bad_argc(argc,%i);\n", num_arguments + 2, num_arguments + 2); /* Now piece together the first part of the wrapper function */ Printv(f->code, get_pointers, NIL); /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ have_argout = 0; for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { if (!have_argout) { have_argout = 1; // Print initial argument output code Printf(argout, "SWIG_Chicken_SetupArgout\n"); } Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printf(argout, "%s", tm); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } Setattr(n, "wrap:name", wname); /* Emit the function call */ String *actioncode = emit_action(n); /* Return the function value */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "1"); } else { Replaceall(tm, "$owner", "0"); } Printf(f->code, "%s", tm); if (have_argout) Printf(f->code, "\nSWIG_APPEND_VALUE(resultobj);\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); /* Insert the argument output code */ Printv(f->code, argout, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } if (have_argout) { Printf(f->code, "C_kontinue(continuation,C_SCHEME_END_OF_LIST);\n"); } else { if (exporting_constructor && clos && hide_primitive) { /* Don't return a proxy, the wrapped CLOS class is the proxy */ Printf(f->code, "C_kontinue(continuation,resultobj);\n"); } else { // make the continuation the proxy creation function, if one exists Printv(f->code, "{\n", "C_word func;\n", "SWIG_Chicken_FindCreateProxy(func, resultobj)\n", "if (C_swig_is_closurep(func))\n", " ((C_proc4)(void *)C_block_item(func, 0))(4,func,continuation,resultobj,C_SCHEME_FALSE);\n", "else\n", " C_kontinue(continuation, resultobj);\n", "}\n", NIL); } } /* Error handling code */ #ifdef USE_FAIL Printf(f->code, "fail:\n"); Printv(f->code, cleanup, NIL); Printf(f->code, "swig_panic (\"failure in " "'$symname' SWIG function wrapper\");\n"); #endif Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Replaceall(f->code, "$result", "resultobj"); /* Dump the function out */ Printv(f_wrappers, "static ", declfunc, " C_noret;\n", NIL); Wrapper_print(f, f_wrappers); /* Now register the function with the interpreter. */ if (!Getattr(n, "sym:overloaded")) { if (exporting_destructor && !no_collection) { Printf(f_init, "((swig_chicken_clientdata *)(SWIGTYPE%s->clientdata))->destroy = (swig_chicken_destructor) %s;\n", swigtype_ptr, wname); } else { addMethod(scmname, wname); } /* Only export if we are not in a class, or if in a class memberfunction */ if (!in_class || member_name) { String *method_def; String *clos_name; if (in_class) clos_name = NewString(member_name); else clos_name = chickenNameMapping(scmname, ""); if (!any_specialized_arg) { method_def = NewString(""); Printv(method_def, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")", NIL); } else { method_def = buildClosFunctionCall(function_arg_types, clos_name, chickenPrimitiveName(scmname)); } Printv(clos_methods, method_def, "\n", NIL); Delete(clos_name); Delete(method_def); } if (have_constructor && !has_constructor_args && any_specialized_arg) { has_constructor_args = 1; constructor_arg_types = Copy(function_arg_types); } } else { /* add function_arg_types to overload hash */ List *flist = Getattr(overload_parameter_lists, scmname); if (!flist) { flist = NewList(); Setattr(overload_parameter_lists, scmname, flist); } Append(flist, Copy(function_arg_types)); if (!Getattr(n, "sym:nextSibling")) { dispatchFunction(n); } } Delete(wname); Delete(get_pointers); Delete(cleanup); Delete(declfunc); Delete(mangle); Delete(function_arg_types); DelWrapper(f); return SWIG_OK; } int CHICKEN::variableWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *wname = NewString(""); String *mangle = NewString(""); String *tm; String *tm2 = NewString(""); String *argnum = NewString("0"); String *arg = NewString("argv[0]"); Wrapper *f; String *overname = 0; String *scmname; scmname = NewString(iname); Replaceall(scmname, "_", "-"); Printf(mangle, "\"%s\"", SwigType_manglestr(t)); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } f = NewWrapper(); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); // evaluation function names Append(wname, Swig_name_wrapper(iname)); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); // Check for interrupts Printv(f->code, "C_trace(\"", scmname, "\");\n", NIL); if (1 || (SwigType_type(t) != T_USER) || (isPointer(t))) { Printv(f->def, "static ", "void ", wname, "(C_word, C_word, C_word, C_word) C_noret;\n", NIL); Printv(f->def, "static " "void ", wname, "(C_word argc, C_word closure, " "C_word continuation, C_word value) {\n", NIL); Wrapper_add_local(f, "resultobj", "C_word resultobj"); Printf(f->code, "if (argc!=2 && argc!=3) C_bad_argc(argc,2);\n"); /* Check for a setting of the variable value */ if (!GetFlag(n, "feature:immutable")) { Printf(f->code, "if (argc > 2) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "value"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "value"); /* Printv(f->code, tm, "\n",NIL); */ emit_action_code(n, f->code, tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); } Printf(f->code, "}\n"); } String *varname; if (SwigType_istemplate((char *) name)) { varname = SwigType_namestr((char *) name); } else { varname = name; } // Now return the value of the variable - regardless // of evaluating or setting. if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", varname); Replaceall(tm, "$varname", varname); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); /* Printf(f->code, "%s\n", tm); */ emit_action_code(n, f->code, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Printv(f->code, "{\n", "C_word func;\n", "SWIG_Chicken_FindCreateProxy(func, resultobj)\n", "if (C_swig_is_closurep(func))\n", " ((C_proc4)(void *)C_block_item(func, 0))(4,func,continuation,resultobj,C_SCHEME_FALSE);\n", "else\n", " C_kontinue(continuation, resultobj);\n", "}\n", NIL); /* Error handling code */ #ifdef USE_FAIL Printf(f->code, "fail:\n"); Printf(f->code, "swig_panic (\"failure in " "'%s' SWIG wrapper\");\n", proc_name); #endif Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); /* Now register the variable with the interpreter. */ addMethod(scmname, wname); if (!in_class || member_name) { String *clos_name; if (in_class) clos_name = NewString(member_name); else clos_name = chickenNameMapping(scmname, ""); Node *class_node = classLookup(t); String *clos_code = Getattr(n, "tmap:varin:closcode"); if (class_node && clos_code && !GetFlag(n, "feature:immutable")) { Replaceall(clos_code, "$input", "(car lst)"); Printv(clos_methods, "(define (", clos_name, " . lst) (if (null? lst) (", chickenPrimitiveName(scmname), ") (", chickenPrimitiveName(scmname), " ", clos_code, ")))\n", NIL); } else { /* Simply re-export the procedure */ if (GetFlag(n, "feature:immutable") && GetFlag(n, "feature:constasvar")) { Printv(clos_methods, "(define ", clos_name, " (", chickenPrimitiveName(scmname), "))\n", NIL); Printv(scm_const_defs, "(set! ", scmname, " (", scmname, "))\n", NIL); } else { Printv(clos_methods, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")\n", NIL); } } Delete(clos_name); } } else { Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); } Delete(wname); Delete(argnum); Delete(arg); Delete(tm2); Delete(mangle); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ int CHICKEN::constantWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *value = Getattr(n, "value"); String *proc_name = NewString(""); String *wname = NewString(""); String *mangle = NewString(""); String *tm; String *tm2 = NewString(""); String *source = NewString(""); String *argnum = NewString("0"); String *arg = NewString("argv[0]"); Wrapper *f; String *overname = 0; String *scmname; String *rvalue; SwigType *nctype; scmname = NewString(iname); Replaceall(scmname, "_", "-"); Printf(source, "swig_const_%s", iname); Replaceall(source, "::", "__"); Printf(mangle, "\"%s\"", SwigType_manglestr(t)); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } Append(wname, Swig_name_wrapper(iname)); if (overname) { Append(wname, overname); } nctype = NewString(t); if (SwigType_isconst(nctype)) { Delete(SwigType_pop(nctype)); } bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); if (SwigType_type(nctype) == T_STRING) { rvalue = NewStringf("\"%s\"", value); } else if (SwigType_type(nctype) == T_CHAR && !is_enum_item) { rvalue = NewStringf("\'%s\'", value); } else { rvalue = NewString(value); } /* Special hook for member pointer */ if (SwigType_type(t) == T_MPOINTER) { Printf(f_header, "static %s = %s;\n", SwigType_str(t, source), rvalue); } else { if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", rvalue); Replaceall(tm, "$target", source); Replaceall(tm, "$result", source); Replaceall(tm, "$value", rvalue); Printf(f_header, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } } f = NewWrapper(); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); // evaluation function names // Check for interrupts Printv(f->code, "C_trace(\"", scmname, "\");\n", NIL); if (1 || (SwigType_type(t) != T_USER) || (isPointer(t))) { Setattr(n, "wrap:name", wname); Printv(f->def, "static ", "void ", wname, "(C_word, C_word, C_word) C_noret;\n", NIL); Printv(f->def, "static ", "void ", wname, "(C_word argc, C_word closure, " "C_word continuation) {\n", NIL); Wrapper_add_local(f, "resultobj", "C_word resultobj"); Printf(f->code, "if (argc!=2) C_bad_argc(argc,2);\n"); // Return the value of the variable if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", source); Replaceall(tm, "$varname", source); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); /* Printf(f->code, "%s\n", tm); */ emit_action_code(n, f->code, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Printv(f->code, "{\n", "C_word func;\n", "SWIG_Chicken_FindCreateProxy(func, resultobj)\n", "if (C_swig_is_closurep(func))\n", " ((C_proc4)(void *)C_block_item(func, 0))(4,func,continuation,resultobj,C_SCHEME_FALSE);\n", "else\n", " C_kontinue(continuation, resultobj);\n", "}\n", NIL); /* Error handling code */ #ifdef USE_FAIL Printf(f->code, "fail:\n"); Printf(f->code, "swig_panic (\"failure in " "'%s' SWIG wrapper\");\n", proc_name); #endif Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); /* Now register the variable with the interpreter. */ addMethod(scmname, wname); if (!in_class || member_name) { String *clos_name; if (in_class) clos_name = NewString(member_name); else clos_name = chickenNameMapping(scmname, ""); if (GetFlag(n, "feature:constasvar")) { Printv(clos_methods, "(define ", clos_name, " (", chickenPrimitiveName(scmname), "))\n", NIL); Printv(scm_const_defs, "(set! ", scmname, " (", scmname, "))\n", NIL); } else { Printv(clos_methods, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")\n", NIL); } Delete(clos_name); } } else { Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); } Delete(wname); Delete(nctype); Delete(proc_name); Delete(argnum); Delete(arg); Delete(tm2); Delete(mangle); Delete(source); Delete(rvalue); DelWrapper(f); return SWIG_OK; } int CHICKEN::classHandler(Node *n) { /* Create new strings for building up a wrapper function */ have_constructor = 0; constructor_dispatch = 0; constructor_name = 0; c_class_name = NewString(Getattr(n, "sym:name")); class_name = NewString(""); short_class_name = NewString(""); Printv(class_name, "<", c_class_name, ">", NIL); Printv(short_class_name, c_class_name, NIL); Replaceall(class_name, "_", "-"); Replaceall(short_class_name, "_", "-"); if (!addSymbol(class_name, n)) return SWIG_ERROR; /* Handle inheritance */ String *base_class = NewString(""); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator base = First(baselist); while (base.item) { if (!Getattr(base.item, "feature:ignore")) Printv(base_class, "<", Getattr(base.item, "sym:name"), "> ", NIL); base = Next(base); } } Replaceall(base_class, "_", "-"); String *scmmod = NewString(module); Replaceall(scmmod, "_", "-"); Printv(clos_class_defines, "(define ", class_name, "\n", " (make 'name \"", short_class_name, "\"\n", NIL); Delete(scmmod); if (Len(base_class)) { Printv(clos_class_defines, " 'direct-supers (list ", base_class, ")\n", NIL); } else { Printv(clos_class_defines, " 'direct-supers (list )\n", NIL); } Printf(clos_class_defines, " 'direct-slots (list 'swig-this\n"); String *mangled_classname = Swig_name_mangle(Getattr(n, "sym:name")); SwigType *ct = NewStringf("p.%s", Getattr(n, "name")); swigtype_ptr = SwigType_manglestr(ct); Printf(f_runtime, "static swig_chicken_clientdata _swig_chicken_clientdata%s = { 0 };\n", mangled_classname); Printv(f_init, "SWIG_TypeClientData(SWIGTYPE", swigtype_ptr, ", (void *) &_swig_chicken_clientdata", mangled_classname, ");\n", NIL); SwigType_remember(ct); /* Emit all of the members */ in_class = 1; Language::classHandler(n); in_class = 0; Printf(clos_class_defines, ")))\n\n"); if (have_constructor) { Printv(clos_methods, "(define-method (initialize (obj ", class_name, ") initargs)\n", " (swig-initialize obj initargs ", NIL); if (constructor_arg_types) { String *initfunc_name = NewStringf("%s@@SWIG@initmethod", class_name); String *func_call = buildClosFunctionCall(constructor_arg_types, initfunc_name, chickenPrimitiveName(constructor_name)); Printf(clos_methods, "%s)\n)\n", initfunc_name); Printf(clos_methods, "(declare (hide %s))\n", initfunc_name); Printf(clos_methods, "%s\n", func_call); Delete(func_call); Delete(initfunc_name); Delete(constructor_arg_types); constructor_arg_types = 0; } else if (constructor_dispatch) { Printf(clos_methods, "%s)\n)\n", constructor_dispatch); Delete(constructor_dispatch); constructor_dispatch = 0; } else { Printf(clos_methods, "%s)\n)\n", chickenPrimitiveName(constructor_name)); } Delete(constructor_name); constructor_name = 0; } else { Printv(clos_methods, "(define-method (initialize (obj ", class_name, ") initargs)\n", " (swig-initialize obj initargs (lambda x #f)))\n", NIL); } /* export class initialization function */ if (clos) { String *funcname = NewString(mangled_classname); Printf(funcname, "_swig_chicken_setclosclass"); String *closfuncname = NewString(funcname); Replaceall(closfuncname, "_", "-"); Printv(f_wrappers, "static void ", funcname, "(C_word,C_word,C_word,C_word) C_noret;\n", "static void ", funcname, "(C_word argc, C_word closure, C_word continuation, C_word cl) {\n", " C_trace(\"", funcname, "\");\n", " if (argc!=3) C_bad_argc(argc,3);\n", " swig_chicken_clientdata *cdata = (swig_chicken_clientdata *) SWIGTYPE", swigtype_ptr, "->clientdata;\n", " cdata->gc_proxy_create = CHICKEN_new_gc_root();\n", " CHICKEN_gc_root_set(cdata->gc_proxy_create, cl);\n", " C_kontinue(continuation, C_SCHEME_UNDEFINED);\n", "}\n", NIL); addMethod(closfuncname, funcname); Printv(clos_methods, "(", chickenPrimitiveName(closfuncname), " (lambda (x lst) (if lst ", "(cons (make ", class_name, " 'swig-this x) lst) ", "(make ", class_name, " 'swig-this x))))\n\n", NIL); Delete(closfuncname); Delete(funcname); } Delete(mangled_classname); Delete(swigtype_ptr); swigtype_ptr = 0; Delete(class_name); Delete(short_class_name); Delete(c_class_name); class_name = 0; short_class_name = 0; c_class_name = 0; return SWIG_OK; } int CHICKEN::memberfunctionHandler(Node *n) { String *iname = Getattr(n, "sym:name"); String *proc = NewString(iname); Replaceall(proc, "_", "-"); member_name = chickenNameMapping(proc, short_class_name); Language::memberfunctionHandler(n); Delete(member_name); member_name = NULL; Delete(proc); return SWIG_OK; } int CHICKEN::staticmemberfunctionHandler(Node *n) { String *iname = Getattr(n, "sym:name"); String *proc = NewString(iname); Replaceall(proc, "_", "-"); member_name = NewStringf("%s-%s", short_class_name, proc); Language::staticmemberfunctionHandler(n); Delete(member_name); member_name = NULL; Delete(proc); return SWIG_OK; } int CHICKEN::membervariableHandler(Node *n) { String *iname = Getattr(n, "sym:name"); //String *pb = SwigType_typedef_resolve_all(SwigType_base(Getattr(n, "type"))); Language::membervariableHandler(n); String *proc = NewString(iname); Replaceall(proc, "_", "-"); //Node *class_node = Swig_symbol_clookup(pb, Getattr(n, "sym:symtab")); Node *class_node = classLookup(Getattr(n, "type")); //String *getfunc = NewStringf("%s-%s-get", short_class_name, proc); //String *setfunc = NewStringf("%s-%s-set", short_class_name, proc); String *getfunc = Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, c_class_name, iname)); Replaceall(getfunc, "_", "-"); String *setfunc = Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, c_class_name, iname)); Replaceall(setfunc, "_", "-"); Printv(clos_class_defines, " (list '", proc, " ':swig-virtual ':swig-get ", chickenPrimitiveName(getfunc), NIL); if (!GetFlag(n, "feature:immutable")) { if (class_node) { Printv(clos_class_defines, " ':swig-set (lambda (x y) (", chickenPrimitiveName(setfunc), " x (slot-ref y 'swig-this))))\n", NIL); } else { Printv(clos_class_defines, " ':swig-set ", chickenPrimitiveName(setfunc), ")\n", NIL); } } else { Printf(clos_class_defines, ")\n"); } Delete(proc); Delete(setfunc); Delete(getfunc); return SWIG_OK; } int CHICKEN::staticmembervariableHandler(Node *n) { String *iname = Getattr(n, "sym:name"); String *proc = NewString(iname); Replaceall(proc, "_", "-"); member_name = NewStringf("%s-%s", short_class_name, proc); Language::staticmembervariableHandler(n); Delete(member_name); member_name = NULL; Delete(proc); return SWIG_OK; } int CHICKEN::constructorHandler(Node *n) { have_constructor = 1; has_constructor_args = 0; exporting_constructor = true; Language::constructorHandler(n); exporting_constructor = false; has_constructor_args = 1; String *iname = Getattr(n, "sym:name"); constructor_name = Swig_name_construct(NSPACE_TODO, iname); Replaceall(constructor_name, "_", "-"); return SWIG_OK; } int CHICKEN::destructorHandler(Node *n) { if (no_collection) member_name = NewStringf("delete-%s", short_class_name); exporting_destructor = true; Language::destructorHandler(n); exporting_destructor = false; if (no_collection) { Delete(member_name); member_name = NULL; } return SWIG_OK; } int CHICKEN::importDirective(Node *n) { String *modname = Getattr(n, "module"); if (modname && clos_uses) { // Find the module node for this imported module. It should be the // first child but search just in case. Node *mod = firstChild(n); while (mod && Strcmp(nodeType(mod), "module") != 0) mod = nextSibling(mod); if (mod) { String *name = Getattr(mod, "name"); if (name) { Printf(closprefix, "(declare (uses %s))\n", name); } } } return Language::importDirective(n); } String *CHICKEN::buildClosFunctionCall(List *types, const_String_or_char_ptr closname, const_String_or_char_ptr funcname) { String *method_signature = NewString(""); String *func_args = NewString(""); String *func_call = NewString(""); Iterator arg_type; int arg_count = 0; int optional_arguments = 0; for (arg_type = First(types); arg_type.item; arg_type = Next(arg_type)) { if (Strcmp(arg_type.item, "^^##optional$$") == 0) { optional_arguments = 1; } else { Printf(method_signature, " (arg%i %s)", arg_count, arg_type.item); arg_type = Next(arg_type); if (!arg_type.item) break; String *arg = NewStringf("arg%i", arg_count); String *access_arg = Copy(arg_type.item); Replaceall(access_arg, "$input", arg); Printf(func_args, " %s", access_arg); Delete(arg); Delete(access_arg); } arg_count++; } if (optional_arguments) { Printf(func_call, "(define-method (%s %s . args) (apply %s %s args))", closname, method_signature, funcname, func_args); } else { Printf(func_call, "(define-method (%s %s) (%s %s))", closname, method_signature, funcname, func_args); } Delete(method_signature); Delete(func_args); return func_call; } extern "C" { /* compares based on non-primitive names */ static int compareTypeListsHelper(const DOH *a, const DOH *b, int opt_equal) { List *la = (List *) a; List *lb = (List *) b; Iterator ia = First(la); Iterator ib = First(lb); while (ia.item && ib.item) { int ret = Strcmp(ia.item, ib.item); if (ret) return ret; ia = Next(Next(ia)); ib = Next(Next(ib)); } if (opt_equal && ia.item && Strcmp(ia.item, "^^##optional$$") == 0) return 0; if (ia.item) return -1; if (opt_equal && ib.item && Strcmp(ib.item, "^^##optional$$") == 0) return 0; if (ib.item) return 1; return 0; } static int compareTypeLists(const DOH *a, const DOH *b) { return compareTypeListsHelper(a, b, 0); } } void CHICKEN::dispatchFunction(Node *n) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewString(""); String *dispatch = Swig_overload_dispatch(n, "%s (2+$numargs,closure," "continuation$commaargs);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *iname = Getattr(n, "sym:name"); String *wname = NewString(""); String *scmname = NewString(iname); Replaceall(scmname, "_", "-"); Append(wname, Swig_name_wrapper(iname)); Printv(f->def, "static void real_", wname, "(C_word, C_word, C_word, C_word) C_noret;\n", NIL); Printv(f->def, "static void real_", wname, "(C_word oldargc, C_word closure, C_word continuation, C_word args) {", NIL); Wrapper_add_local(f, "argc", "int argc"); Printf(tmp, "C_word argv[%d]", maxargs + 1); Wrapper_add_local(f, "argv", tmp); Wrapper_add_local(f, "ii", "int ii"); Wrapper_add_local(f, "t", "C_word t = args"); Printf(f->code, "if (!C_swig_is_list (args)) {\n"); Printf(f->code, " swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, " "\"Argument #1 must be a list of overloaded arguments\");\n"); Printf(f->code, "}\n"); Printf(f->code, "argc = C_unfix (C_i_length (args));\n"); Printf(f->code, "for (ii = 0; (ii < argc) && (ii < %d); ii++, t = C_block_item (t, 1)) {\n", maxargs); Printf(f->code, "argv[ii] = C_block_item (t, 0);\n"); Printf(f->code, "}\n"); Printv(f->code, dispatch, "\n", NIL); Printf(f->code, "swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE," "\"No matching function for overloaded '%s'\");\n", iname); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); addMethod(scmname, wname); DelWrapper(f); f = NewWrapper(); /* varargs */ Printv(f->def, "void ", wname, "(C_word, C_word, C_word, ...) C_noret;\n", NIL); Printv(f->def, "void ", wname, "(C_word c, C_word t0, C_word t1, ...) {", NIL); Printv(f->code, "C_word t2;\n", "va_list v;\n", "C_word *a, c2 = c;\n", "C_save_rest (t1, c2, 2);\n", "a = C_alloc((c-2)*3);\n", "t2 = C_restore_rest (a, C_rest_count (0));\n", "real_", wname, " (3, t0, t1, t2);\n", NIL); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); /* Now deal with overloaded function when exporting clos */ if (clos) { List *flist = Getattr(overload_parameter_lists, scmname); if (flist) { Delattr(overload_parameter_lists, scmname); SortList(flist, compareTypeLists); String *clos_name; if (have_constructor && !has_constructor_args) { has_constructor_args = 1; constructor_dispatch = NewStringf("%s@SWIG@new@dispatch", short_class_name); clos_name = Copy(constructor_dispatch); Printf(clos_methods, "(declare (hide %s))\n", clos_name); } else if (in_class) clos_name = NewString(member_name); else clos_name = chickenNameMapping(scmname, ""); Iterator f; List *prev = 0; int all_primitive = 1; /* first check for duplicates and an empty call */ String *newlist = NewList(); for (f = First(flist); f.item; f = Next(f)) { /* check if cur is a duplicate of prev */ if (prev && compareTypeListsHelper(f.item, prev, 1) == 0) { Delete(f.item); } else { Append(newlist, f.item); prev = f.item; Iterator j; for (j = First(f.item); j.item; j = Next(j)) { if (Strcmp(j.item, "^^##optional$$") != 0 && Strcmp(j.item, "") != 0) all_primitive = 0; } } } Delete(flist); flist = newlist; if (all_primitive) { Printf(clos_methods, "(define %s %s)\n", clos_name, chickenPrimitiveName(scmname)); } else { for (f = First(flist); f.item; f = Next(f)) { /* now export clos code for argument */ String *func_call = buildClosFunctionCall(f.item, clos_name, chickenPrimitiveName(scmname)); Printf(clos_methods, "%s\n", func_call); Delete(f.item); Delete(func_call); } } Delete(clos_name); Delete(flist); } } DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } int CHICKEN::isPointer(SwigType *t) { return SwigType_ispointer(SwigType_typedef_resolve_all(t)); } void CHICKEN::addMethod(String *scheme_name, String *function) { String *sym = NewString(""); if (clos) { Append(sym, "primitive:"); } Append(sym, scheme_name); /* add symbol to Chicken internal symbol table */ if (hide_primitive) { Printv(f_init, "{\n", " C_word *p0 = a;\n", " *(a++)=C_CLOSURE_TYPE|1;\n", " *(a++)=(C_word)", function, ";\n", " C_mutate(return_vec++, (C_word)p0);\n", "}\n", NIL); } else { Printf(f_sym_size, "+C_SIZEOF_INTERNED_SYMBOL(%d)", Len(sym)); Printf(f_init, "sym = C_intern (&a, %d, \"%s\");\n", Len(sym), sym); Printv(f_init, "C_mutate ((C_word*)sym+1, (*a=C_CLOSURE_TYPE|1, a[1]=(C_word)", function, ", tmp=(C_word)a, a+=2, tmp));\n", NIL); } if (hide_primitive) { Setattr(primitive_names, scheme_name, NewStringf("(vector-ref swig-init-return %i)", num_methods)); } else { Setattr(primitive_names, scheme_name, Copy(sym)); } num_methods++; Delete(sym); } String *CHICKEN::chickenPrimitiveName(String *name) { String *value = Getattr(primitive_names, name); if (value) return value; else { Swig_error(input_file, line_number, "Internal Error: attempting to reference non-existent primitive name %s\n", name); return NewString("#f"); } } int CHICKEN::validIdentifier(String *s) { char *c = Char(s); /* Check whether we have an R5RS identifier. */ /* --> * | */ /* --> | */ if (!(isalpha(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~'))) { /* --> + | - | ... */ if ((strcmp(c, "+") == 0) || strcmp(c, "-") == 0 || strcmp(c, "...") == 0) return 1; else return 0; } /* --> | | */ while (*c) { if (!(isalnum(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~') || (*c == '+') || (*c == '-') || (*c == '.') || (*c == '@'))) return 0; c++; } return 1; } /* ------------------------------------------------------------ * closNameMapping() * Maps the identifier from C++ to the CLOS based on command * line parameters and such. * If class_name = "" that means the mapping is for a function or * variable not attached to any class. * ------------------------------------------------------------ */ String *CHICKEN::chickenNameMapping(String *name, const_String_or_char_ptr class_name) { String *n = NewString(""); if (Strcmp(class_name, "") == 0) { // not part of a class, so no class name to prefix if (clossymnameprefix) { Printf(n, "%s%s", clossymnameprefix, name); } else { Printf(n, "%s", name); } } else { if (useclassprefix) { Printf(n, "%s-%s", class_name, name); } else { if (clossymnameprefix) { Printf(n, "%s%s", clossymnameprefix, name); } else { Printf(n, "%s", name); } } } return n; } String *CHICKEN::runtimeCode() { String *s = Swig_include_sys("chickenrun.swg"); if (!s) { Printf(stderr, "*** Unable to open 'chickenrun.swg'\n"); s = NewString(""); } return s; } String *CHICKEN::defaultExternalRuntimeFilename() { return NewString("swigchickenrun.h"); } swig-4.0.2/Source/Modules/perl5.cxx0000644000175000017500000024345513667507523017022 0ustar williamwilliam/* ---------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * perl5.cxx * * Perl5 language module for SWIG. * ------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include static const char *usage = "\ Perl 5 Options (available with -perl5)\n\ -compat - Compatibility mode\n\ -const - Wrap constants as constants and not variables (implies -proxy)\n\ -nopm - Do not generate the .pm file\n\ -noproxy - Don't create proxy classes\n\ -proxy - Create proxy classes\n\ -static - Omit code related to dynamic loading\n\ \n"; static int compat = 0; static int no_pmfile = 0; static int export_all = 0; /* * pmfile * set by the -pm flag, overrides the name of the .pm file */ static String *pmfile = 0; /* * module * set by the %module directive, e.g. "Xerces". It will determine * the name of the .pm file, and the dynamic library, and the name * used by any module wanting to %import the module. */ static String *module = 0; /* * namespace_module * the fully namespace qualified name of the module. It will be used * to set the package namespace in the .pm file, as well as the name * of the initialization methods in the glue library. This will be * the same as module, above, unless the %module directive is given * the 'package' option, e.g. %module(package="Foo::Bar") "baz" */ static String *namespace_module = 0; /* * cmodule * the namespace of the internal glue code, set to the value of * module with a 'c' appended */ static String *cmodule = 0; /* * dest_package * an optional namespace to put all classes into. Specified by using * the %module(package="Foo::Bar") "baz" syntax */ static String *dest_package = 0; static String *command_tab = 0; static String *constant_tab = 0; static String *variable_tab = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_runtime_h = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_directors = 0; static File *f_directors_h = 0; static File *f_init = 0; static File *f_pm = 0; static String *pm; /* Package initialization code */ static String *magic; /* Magic variable wrappers */ static int staticoption = 0; // controlling verbose output static int verbose = 0; /* The following variables are used to manage Perl5 classes */ static int blessed = 1; /* Enable object oriented features */ static int do_constants = 0; /* Constant wrapping */ static List *classlist = 0; /* List of classes */ static int have_constructor = 0; static int have_destructor = 0; static int have_data_members = 0; static String *class_name = 0; /* Name of the class (what Perl thinks it is) */ static String *real_classname = 0; /* Real name of C/C++ class */ static String *fullclassname = 0; static String *pcode = 0; /* Perl code associated with each class */ /* static String *blessedmembers = 0; *//* Member data associated with each class */ static int member_func = 0; /* Set to 1 when wrapping a member function */ static String *func_stubs = 0; /* Function stubs */ static String *const_stubs = 0; /* Constant stubs */ static int num_consts = 0; /* Number of constants */ static String *var_stubs = 0; /* Variable stubs */ static String *exported = 0; /* Exported symbols */ static String *pragma_include = 0; static String *additional_perl_code = 0; /* Additional Perl code from %perlcode %{ ... %} */ static Hash *operators = 0; static int have_operators = 0; class PERL5:public Language { public: PERL5():Language () { Clear(argc_template_string); Printv(argc_template_string, "items", NIL); Clear(argv_template_string); Printv(argv_template_string, "ST(%d)", NIL); director_language = 1; } /* Test to see if a type corresponds to something wrapped with a shadow class */ Node *is_shadow(SwigType *t) { Node *n; n = classLookup(t); /* Printf(stdout,"'%s' --> '%p'\n", t, n); */ if (n) { if (!Getattr(n, "perl5:proxy")) { setclassname(n); } return Getattr(n, "perl5:proxy"); } return 0; } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int i = 1; SWIG_library_directory("perl5"); for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-package") == 0) { Printv(stderr, "*** -package is no longer supported\n*** use the directive '%module A::B::C' in your interface file instead\n*** see the Perl section in the manual for details.\n", NIL); SWIG_exit(EXIT_FAILURE); } else if (strcmp(argv[i], "-interface") == 0) { Printv(stderr, "*** -interface is no longer supported\n*** use the directive '%module A::B::C' in your interface file instead\n*** see the Perl section in the manual for details.\n", NIL); SWIG_exit(EXIT_FAILURE); } else if (strcmp(argv[i], "-exportall") == 0) { export_all = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-static") == 0) { staticoption = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-shadow") == 0) || ((strcmp(argv[i], "-proxy") == 0))) { blessed = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-noproxy") == 0)) { blessed = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-const") == 0) { do_constants = 1; blessed = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nopm") == 0) { no_pmfile = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-pm") == 0) { Swig_mark_arg(i); i++; pmfile = NewString(argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i],"-v") == 0) { Swig_mark_arg(i); verbose++; } else if (strcmp(argv[i], "-compat") == 0) { compat = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } else if (strcmp(argv[i], "-cppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is now always on.\n", argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is no longer supported.\n", argv[i]); Swig_mark_arg(i); SWIG_exit(EXIT_FAILURE); } } } Preprocessor_define("SWIGPERL 1", 0); // SWIGPERL5 is deprecated, and no longer documented. Preprocessor_define("SWIGPERL5 1", 0); SWIG_typemap_lang("perl5"); SWIG_config_file("perl5.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. * * TODO: directors are disallowed in conjunction with many command * line options. Some of them are probably safe, but it will take * some effort to validate each one. */ { Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options) { int dirprot = 0; if (Getattr(options, "dirprot")) dirprot = 1; if (Getattr(options, "nodirprot")) dirprot = 0; if (Getattr(options, "directors")) { int allow = 1; if (export_all) { Printv(stderr, "*** directors are not supported with -exportall\n", NIL); allow = 0; } if (staticoption) { Printv(stderr, "*** directors are not supported with -static\n", NIL); allow = 0; } if (!blessed) { Printv(stderr, "*** directors are not supported with -noproxy\n", NIL); allow = 0; } if (no_pmfile) { Printv(stderr, "*** directors are not supported with -nopm\n", NIL); allow = 0; } if (compat) { Printv(stderr, "*** directors are not supported with -compat\n", NIL); allow = 0; } if (allow) { allow_directors(); if (dirprot) allow_dirprot(); } } } } } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); if (directorsEnabled()) { f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); classlist = NewList(); pm = NewString(""); func_stubs = NewString(""); var_stubs = NewString(""); const_stubs = NewString(""); exported = NewString(""); magic = NewString(""); pragma_include = NewString(""); additional_perl_code = NewString(""); command_tab = NewString("static swig_command_info swig_commands[] = {\n"); constant_tab = NewString("static swig_constant_info swig_constants[] = {\n"); variable_tab = NewString("static swig_variable_info swig_variables[] = {\n"); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGPERL\n#define SWIGPERL\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } Printf(f_runtime, "#define SWIG_CASTRANK_MODE\n"); Printf(f_runtime, "\n"); // Is the imported module in another package? (IOW, does it use the // %module(package="name") option and it's different than the package // of this module.) Node *mod = Getattr(n, "module"); Node *options = Getattr(mod, "options"); module = Copy(Getattr(n,"name")); String *underscore_module = Copy(module); Replaceall(underscore_module,":","_"); if (verbose > 0) { fprintf(stdout, "top: using namespace_module: %s\n", Char(namespace_module)); } if (directorsEnabled()) { Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", underscore_module); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", underscore_module); if (dirprot_mode()) { Printf(f_directors_h, "#include \n"); Printf(f_directors_h, "#include \n\n"); } Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(magic, "#include \"%s\"\n\n", filename); Delete(filename); } } if (verbose > 0) { fprintf(stdout, "top: using module: %s\n", Char(module)); } dest_package = options ? Getattr(options, "package") : 0; if (dest_package) { namespace_module = Copy(dest_package); if (verbose > 0) { fprintf(stdout, "top: Found package: %s\n",Char(dest_package)); } } else { namespace_module = Copy(module); if (verbose > 0) { fprintf(stdout, "top: No package found\n"); } } /* If we're in blessed mode, change the package name to "packagec" */ if (blessed) { cmodule = NewStringf("%sc",namespace_module); } else { cmodule = NewString(namespace_module); } /* Create a .pm file * Need to strip off any prefixes that might be found in * the module name */ if (no_pmfile) { f_pm = NewString(0); } else { if (!pmfile) { char *m = Char(module) + Len(module); while (m != Char(module)) { if (*m == ':') { m++; break; } m--; } pmfile = NewStringf("%s.pm", m); } String *filen = NewStringf("%s%s", SWIG_output_directory(), pmfile); if ((f_pm = NewFile(filen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Delete(filen); filen = NULL; Swig_register_filebyname("pm", f_pm); Swig_register_filebyname("perl", f_pm); } { String *boot_name = NewStringf("boot_%s", underscore_module); Printf(f_header,"#define SWIG_init %s\n\n", boot_name); Printf(f_header,"#define SWIG_name \"%s::%s\"\n", cmodule, boot_name); Printf(f_header,"#define SWIG_prefix \"%s::\"\n", cmodule); Delete(boot_name); } Swig_banner_target_lang(f_pm, "#"); Printf(f_pm, "\n"); Printf(f_pm, "package %s;\n", module); /* * If the package option has been given we are placing our * symbols into some other packages namespace, so we do not * mess with @ISA or require for that package */ if (dest_package) { Printf(f_pm,"use base qw(DynaLoader);\n"); } else { Printf(f_pm,"use base qw(Exporter);\n"); if (!staticoption) { Printf(f_pm,"use base qw(DynaLoader);\n"); } } /* Start creating magic code */ Printv(magic, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n", "#ifdef PERL_OBJECT\n", "#define MAGIC_CLASS _wrap_", underscore_module, "_var::\n", "class _wrap_", underscore_module, "_var : public CPerlObj {\n", "public:\n", "#else\n", "#define MAGIC_CLASS\n", "#endif\n", "SWIGCLASS_STATIC int swig_magic_readonly(pTHX_ SV *SWIGUNUSEDPARM(sv), MAGIC *SWIGUNUSEDPARM(mg)) {\n", tab4, "MAGIC_PPERL\n", tab4, "croak(\"Value is read-only.\");\n", tab4, "return 0;\n", "}\n", NIL); Printf(f_wrappers, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); /* emit wrappers */ Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } String *base = NewString(""); /* Dump out variable wrappers */ Printv(magic, "\n\n#ifdef PERL_OBJECT\n", "};\n", "#endif\n", NIL); Printv(magic, "\n#ifdef __cplusplus\n}\n#endif\n", NIL); Printf(f_header, "%s\n", magic); String *type_table = NewString(""); /* Patch the type table to reflect the names used by shadow classes */ if (blessed) { Iterator cls; for (cls = First(classlist); cls.item; cls = Next(cls)) { String *pname = Getattr(cls.item, "perl5:proxy"); if (pname) { SwigType *type = Getattr(cls.item, "classtypeobj"); if (!type) continue; /* If unnamed class, no type will be found */ type = Copy(type); SwigType_add_pointer(type); String *mangled = SwigType_manglestr(type); SwigType_remember_mangleddata(mangled, NewStringf("\"%s\"", pname)); Delete(type); Delete(mangled); } } } SwigType_emit_type_table(f_runtime, type_table); Printf(f_wrappers, "%s", type_table); Delete(type_table); Printf(constant_tab, "{0,0,0,0,0,0}\n};\n"); Printv(f_wrappers, constant_tab, NIL); Printf(f_wrappers, "#ifdef __cplusplus\n}\n#endif\n"); Printf(f_init, "\t ST(0) = &PL_sv_yes;\n"); Printf(f_init, "\t XSRETURN(1);\n"); Printf(f_init, "}\n"); /* Finish off tables */ Printf(variable_tab, "{0,0,0,0}\n};\n"); Printv(f_wrappers, variable_tab, NIL); Printf(command_tab, "{0,0}\n};\n"); Printv(f_wrappers, command_tab, NIL); Printf(f_pm, "package %s;\n", cmodule); if (!staticoption) { Printf(f_pm,"bootstrap %s;\n", module); } else { Printf(f_pm,"package %s;\n", cmodule); Printf(f_pm,"boot_%s();\n", underscore_module); } Printf(f_pm, "package %s;\n", module); /* * If the package option has been given we are placing our * symbols into some other packages namespace, so we do not * mess with @EXPORT */ if (!dest_package) { Printf(f_pm,"@EXPORT = qw(%s);\n", exported); } Printf(f_pm, "%s", pragma_include); if (blessed) { /* * These methods will be duplicated if package * has been specified, so we do not output them */ if (!dest_package) { Printv(base, "\n# ---------- BASE METHODS -------------\n\n", "package ", namespace_module, ";\n\n", NIL); /* Write out the TIE method */ Printv(base, "sub TIEHASH {\n", tab4, "my ($classname,$obj) = @_;\n", tab4, "return bless $obj, $classname;\n", "}\n\n", NIL); /* Output a CLEAR method. This is just a place-holder, but by providing it we * can make declarations such as * %$u = ( x => 2, y=>3, z =>4 ); * * Where x,y,z are the members of some C/C++ object. */ Printf(base, "sub CLEAR { }\n\n"); /* Output default firstkey/nextkey methods */ Printf(base, "sub FIRSTKEY { }\n\n"); Printf(base, "sub NEXTKEY { }\n\n"); /* Output a FETCH method. This is actually common to all classes */ Printv(base, "sub FETCH {\n", tab4, "my ($self,$field) = @_;\n", tab4, "my $member_func = \"swig_${field}_get\";\n", tab4, "$self->$member_func();\n", "}\n\n", NIL); /* Output a STORE method. This is also common to all classes (might move to base class) */ Printv(base, "sub STORE {\n", tab4, "my ($self,$field,$newval) = @_;\n", tab4, "my $member_func = \"swig_${field}_set\";\n", tab4, "$self->$member_func($newval);\n", "}\n\n", NIL); /* Output a 'this' method */ Printv(base, "sub this {\n", tab4, "my $ptr = shift;\n", tab4, "return tied(%$ptr);\n", "}\n\n", NIL); Printf(f_pm, "%s", base); } /* Emit function stubs for stand-alone functions */ Printf(f_pm, "\n# ------- FUNCTION WRAPPERS --------\n\n"); Printf(f_pm, "package %s;\n\n", namespace_module); Printf(f_pm, "%s", func_stubs); /* Emit package code for different classes */ Printf(f_pm, "%s", pm); if (num_consts > 0) { /* Emit constant stubs */ Printf(f_pm, "\n# ------- CONSTANT STUBS -------\n\n"); Printf(f_pm, "package %s;\n\n", namespace_module); Printf(f_pm, "%s", const_stubs); } /* Emit variable stubs */ Printf(f_pm, "\n# ------- VARIABLE STUBS --------\n\n"); Printf(f_pm, "package %s;\n\n", namespace_module); Printf(f_pm, "%s", var_stubs); } /* Add additional Perl code at the end */ Printf(f_pm, "%s", additional_perl_code); Printf(f_pm, "1;\n"); Delete(f_pm); Delete(base); Delete(dest_package); Delete(underscore_module); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Dump(f_directors, f_begin); } Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_directors); Delete(f_directors_h); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------ * importDirective(Node *n) * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { if (blessed) { String *modname = Getattr(n, "module"); if (modname) { Printf(f_pm, "require %s;\n", modname); } } return Language::importDirective(n); } /* ------------------------------------------------------------ * functionWrapper() * ------------------------------------------------------------ */ virtual int functionWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *overname = 0; int director_method = 0; Parm *p; int i; Wrapper *f; char source[256], temp[256]; String *tm; String *cleanup, *outarg; int num_saved = 0; int num_arguments, num_required; int varargs = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } f = NewWrapper(); cleanup = NewString(""); outarg = NewString(""); String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); Printv(f->def, "XS(", wname, ") {\n", "{\n", /* scope to destroy C++ objects before croaking */ NIL); emit_parameter_variables(l, f); emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); num_arguments = emit_num_arguments(l); num_required = emit_num_required(l); varargs = emit_isvarargs(l); Wrapper_add_local(f, "argvi", "int argvi = 0"); /* Check the number of arguments */ if (!varargs) { Printf(f->code, " if ((items < %d) || (items > %d)) {\n", num_required, num_arguments); } else { Printf(f->code, " if (items < %d) {\n", num_required); } Printf(f->code, " SWIG_croak(\"Usage: %s\");\n", usage_func(Char(iname), d, l)); Printf(f->code, "}\n"); /* Write code to extract parameters. */ for (i = 0, p = l; i < num_arguments; i++) { /* Skip ignored arguments */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); /* Produce string representation of source and target arguments */ sprintf(source, "ST(%d)", i); String *target = Getattr(p, "lname"); if (i >= num_required) { Printf(f->code, " if (items > %d) {\n", i); } if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$target", target); Replaceall(tm, "$source", source); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); /* Save input location */ if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } if (i >= num_required) { Printf(f->code, " }\n"); } } if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { sprintf(source, "ST(%d)", i); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printf(f->code, "if (items >= %d) {\n", i); Printv(f->code, tm, "\n", NIL); Printf(f->code, "}\n"); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ num_saved = 0; for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:argout"))) { SwigType *t = Getattr(p, "type"); Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "ST(argvi)"); Replaceall(tm, "$result", "ST(argvi)"); if (is_shadow(t)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } String *in = Getattr(p, "emit:input"); if (in) { sprintf(temp, "_saved[%d]", num_saved); Replaceall(tm, "$arg", temp); Replaceall(tm, "$input", temp); Printf(f->code, "_saved[%d] = %s;\n", num_saved, in); num_saved++; } Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* If there were any saved arguments, emit a local variable for them */ if (num_saved) { sprintf(temp, "_saved[%d]", num_saved); Wrapper_add_localv(f, "_saved", "SV *", temp, NIL); } director_method = is_member_director(n) && !is_smart_pointer() && 0 != Cmp(nodeType(n), "destructor"); if (director_method) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Append(f->code, "director = SWIG_DIRECTOR_CAST(arg1);\n"); if (dirprot_mode() && !is_public(n)) { Printf(f->code, "if (!director || !(director->swig_get_inner(\"%s\"))) {\n", name); Printf(f->code, "SWIG_exception_fail(SWIG_RuntimeError, \"accessing protected member %s\");\n", name); Append(f->code, "}\n"); } Wrapper_add_local(f, "upcall", "bool upcall = false"); Printf(f->code, "upcall = director && SvSTASH(SvRV(ST(0))) == gv_stashpv(director->swig_get_class(), 0);\n"); } /* Emit the function call */ if (director_method) { Append(f->code, "try {\n"); } /* Now write code to make the function call */ Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); if (director_method) { Append(actioncode, "} catch (Swig::DirectorException& swig_err) {\n"); Append(actioncode, " sv_setsv(ERRSV, swig_err.getNative());\n"); Append(actioncode, " SWIG_fail;\n"); Append(actioncode, "}\n"); } if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { SwigType *t = Getattr(n, "type"); Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "ST(argvi)"); Replaceall(tm, "$result", "ST(argvi)"); if (is_shadow(t)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "SWIG_OWNER"); } else { Replaceall(tm, "$owner", "0"); } Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); /* If there were any output args, take care of them. */ Printv(f->code, outarg, NIL); /* If there was any cleanup, do that. */ Printv(f->code, cleanup, NIL); if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } if (director_method) { if ((tm = Swig_typemap_lookup("directorfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "ST(argvi)"); Printf(f->code, "%s\n", tm); Delete(tm); } } Printv(f->code, "XSRETURN(argvi);\n", "fail:\n", cleanup, "SWIG_croak_null();\n" "}\n" "}\n", NIL); /* Add the dXSARGS last */ Wrapper_add_local(f, "dXSARGS", "dXSARGS"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); /* Dump the wrapper function */ Wrapper_print(f, f_wrappers); /* Now register the function */ if (!Getattr(n, "sym:overloaded")) { Printf(command_tab, "{\"%s::%s\", %s},\n", cmodule, iname, wname); } else if (!Getattr(n, "sym:nextSibling")) { /* Generate overloaded dispatch function */ int maxargs; String *dispatch = Swig_overload_dispatch_cast(n, "PUSHMARK(MARK); SWIG_CALLXS(%s); return;", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *df = NewWrapper(); String *dname = Swig_name_wrapper(iname); Printv(df->def, "XS(", dname, ") {\n", NIL); Wrapper_add_local(df, "dXSARGS", "dXSARGS"); Printv(df->code, dispatch, "\n", NIL); Printf(df->code, "croak(\"No matching function for overloaded '%s'\");\n", iname); Printf(df->code, "XSRETURN(0);\n"); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); Printf(command_tab, "{\"%s::%s\", %s},\n", cmodule, iname, dname); DelWrapper(df); Delete(dispatch); Delete(dname); } if (!Getattr(n, "sym:nextSibling")) { if (export_all) { Printf(exported, "%s ", iname); } /* -------------------------------------------------------------------- * Create a stub for this function, provided it's not a member function * -------------------------------------------------------------------- */ if ((blessed) && (!member_func)) { Printv(func_stubs, "*", iname, " = *", cmodule, "::", iname, ";\n", NIL); } } Delete(cleanup); Delete(outarg); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); Wrapper *getf, *setf; String *tm; String *getname = Swig_name_get(NSPACE_TODO, iname); String *setname = Swig_name_set(NSPACE_TODO, iname); String *get_name = Swig_name_wrapper(getname); String *set_name = Swig_name_wrapper(setname); if (!addSymbol(iname, n)) return SWIG_ERROR; getf = NewWrapper(); setf = NewWrapper(); /* Create a Perl function for setting the variable value */ if (!GetFlag(n, "feature:immutable")) { Setattr(n, "wrap:name", set_name); Printf(setf->def, "SWIGCLASS_STATIC int %s(pTHX_ SV* sv, MAGIC * SWIGUNUSEDPARM(mg)) {\n", set_name); Printv(setf->code, tab4, "MAGIC_PPERL\n", NIL); /* Check for a few typemaps */ tm = Swig_typemap_lookup("varin", n, name, 0); if (tm) { Replaceall(tm, "$source", "sv"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "sv"); /* Printf(setf->code,"%s\n", tm); */ emit_action_code(n, setf->code, tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); DelWrapper(setf); DelWrapper(getf); return SWIG_NOWRAP; } Printf(setf->code, "fail:\n"); Printf(setf->code, " return 1;\n}\n"); Replaceall(setf->code, "$symname", iname); Wrapper_print(setf, magic); } /* Now write a function to evaluate the variable */ Setattr(n, "wrap:name", get_name); int addfail = 0; Printf(getf->def, "SWIGCLASS_STATIC int %s(pTHX_ SV *sv, MAGIC *SWIGUNUSEDPARM(mg)) {\n", get_name); Printv(getf->code, tab4, "MAGIC_PPERL\n", NIL); if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$target", "sv"); Replaceall(tm, "$result", "sv"); Replaceall(tm, "$source", name); if (is_shadow(t)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } /* Printf(getf->code,"%s\n", tm); */ addfail = emit_action_code(n, getf->code, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); DelWrapper(setf); DelWrapper(getf); return SWIG_NOWRAP; } Printf(getf->code, " return 1;\n"); if (addfail) { Append(getf->code, "fail:\n"); Append(getf->code, " return 0;\n"); } Append(getf->code, "}\n"); Replaceall(getf->code, "$symname", iname); Wrapper_print(getf, magic); String *tt = Getattr(n, "tmap:varout:type"); if (tt) { tt = NewStringf("&%s", tt); } else { tt = NewString("0"); } /* Now add symbol to the PERL interpreter */ if (GetFlag(n, "feature:immutable")) { Printv(variable_tab, tab4, "{ \"", cmodule, "::", iname, "\", MAGIC_CLASS swig_magic_readonly, MAGIC_CLASS ", get_name, ",", tt, " },\n", NIL); } else { Printv(variable_tab, tab4, "{ \"", cmodule, "::", iname, "\", MAGIC_CLASS ", set_name, ", MAGIC_CLASS ", get_name, ",", tt, " },\n", NIL); } /* If we're blessed, try to figure out what to do with the variable 1. If it's a Perl object of some sort, create a tied-hash around it. 2. Otherwise, just hack Perl's symbol table */ if (blessed) { if (is_shadow(t)) { Printv(var_stubs, "\nmy %__", iname, "_hash;\n", "tie %__", iname, "_hash,\"", is_shadow(t), "\", $", cmodule, "::", iname, ";\n", "$", iname, "= \\%__", iname, "_hash;\n", "bless $", iname, ", ", is_shadow(t), ";\n", NIL); } else { Printv(var_stubs, "*", iname, " = *", cmodule, "::", iname, ";\n", NIL); } } if (export_all) Printf(exported, "$%s ", iname); Delete(tt); DelWrapper(setf); DelWrapper(getf); Delete(getname); Delete(setname); Delete(set_name); Delete(get_name); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); Printf(f_wrappers, "static %s = %s;\n", SwigType_str(type, wname), value); value = Char(wname); } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); if (is_shadow(type)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } Printf(constant_tab, "%s,\n", tm); } else if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); if (is_shadow(type)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } Printf(f_init, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } if (blessed) { if (is_shadow(type)) { Printv(var_stubs, "\nmy %__", iname, "_hash;\n", "tie %__", iname, "_hash,\"", is_shadow(type), "\", $", cmodule, "::", iname, ";\n", "$", iname, "= \\%__", iname, "_hash;\n", "bless $", iname, ", ", is_shadow(type), ";\n", NIL); } else if (do_constants) { Printv(const_stubs, "sub ", name, " () { $", cmodule, "::", name, " }\n", NIL); num_consts++; } else { Printv(var_stubs, "*", iname, " = *", cmodule, "::", iname, ";\n", NIL); } } if (export_all) { if (do_constants && !is_shadow(type)) { Printf(exported, "%s ", name); } else { Printf(exported, "$%s ", iname); } } return SWIG_OK; } /* ------------------------------------------------------------ * usage_func() * ------------------------------------------------------------ */ char *usage_func(char *iname, SwigType *, ParmList *l) { static String *temp = 0; Parm *p; int i; if (!temp) temp = NewString(""); Clear(temp); Printf(temp, "%s(", iname); /* Now go through and print parameters */ p = l; i = 0; while (p != 0) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); if (!checkAttribute(p,"tmap:in:numinputs","0")) { /* If parameter has been named, use that. Otherwise, just print a type */ if (SwigType_type(pt) != T_VOID) { if (Len(pn) > 0) { Printf(temp, "%s", pn); } else { Printf(temp, "%s", SwigType_str(pt, 0)); } } i++; p = nextSibling(p); if (p) if (!checkAttribute(p,"tmap:in:numinputs","0")) Putc(',', temp); } else { p = nextSibling(p); if (p) if ((i > 0) && (!checkAttribute(p,"tmap:in:numinputs","0"))) Putc(',', temp); } } Printf(temp, ");"); return Char(temp); } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { String *name = Getattr(n, "sym:name"); String *funcname = Getattr(n, "wrap:name"); if (!addSymbol(funcname, n)) return SWIG_ERROR; Printf(command_tab, "{\"%s::%s\", %s},\n", cmodule, name, funcname); if (export_all) Printf(exported, "%s ", name); if (blessed) { Printv(func_stubs, "*", name, " = *", cmodule, "::", name, ";\n", NIL); } return SWIG_OK; } /* ---------------------------------------------------------------------------- * OBJECT-ORIENTED FEATURES * * These extensions provide a more object-oriented interface to C++ * classes and structures. The code here is based on extensions * provided by David Fletcher and Gary Holt. * * I have generalized these extensions to make them more general purpose * and to resolve object-ownership problems. * * The approach here is very similar to the Python module : * 1. All of the original methods are placed into a single * package like before except that a 'c' is appended to the * package name. * * 2. All methods and function calls are wrapped with a new * perl function. While possibly inefficient this allows * us to catch complex function arguments (which are hard to * track otherwise). * * 3. Classes are represented as tied-hashes in a manner similar * to Gary Holt's extension. This allows us to access * member data. * * 4. Stand-alone (global) C functions are modified to take * tied hashes as arguments for complex datatypes (if * appropriate). * * 5. Global variables involving a class/struct is encapsulated * in a tied hash. * * ------------------------------------------------------------------------- */ void setclassname(Node *n) { String *symname = Getattr(n, "sym:name"); String *fullname; String *actualpackage; Node *clsmodule = Getattr(n, "module"); if (!clsmodule) { /* imported module does not define a module name. Oh well */ return; } /* Do some work on the class name */ if (verbose > 0) { String *modulename = Getattr(clsmodule, "name"); fprintf(stdout, "setclassname: Found sym:name: %s\n", Char(symname)); fprintf(stdout, "setclassname: Found module: %s\n", Char(modulename)); fprintf(stdout, "setclassname: No package found\n"); } if (dest_package) { fullname = NewStringf("%s::%s", namespace_module, symname); } else { actualpackage = Getattr(clsmodule,"name"); if (verbose > 0) { fprintf(stdout, "setclassname: Found actualpackage: %s\n", Char(actualpackage)); } if ((!compat) && (!Strchr(symname,':'))) { fullname = NewStringf("%s::%s",actualpackage,symname); } else { fullname = NewString(symname); } } if (verbose > 0) { fprintf(stdout, "setclassname: setting proxy: %s\n", Char(fullname)); } Setattr(n, "perl5:proxy", fullname); } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { /* Do some work on the class name */ if (!Getattr(n, "feature:onlychildren")) { if (blessed) { setclassname(n); Append(classlist, n); } } return Language::classDeclaration(n); } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { if (blessed) { have_constructor = 0; have_operators = 0; have_destructor = 0; have_data_members = 0; operators = NewHash(); class_name = Getattr(n, "sym:name"); if (!addSymbol(class_name, n)) return SWIG_ERROR; /* Use the fully qualified name of the Perl class */ if (!compat) { fullclassname = NewStringf("%s::%s", namespace_module, class_name); } else { fullclassname = NewString(class_name); } real_classname = Getattr(n, "name"); pcode = NewString(""); // blessedmembers = NewString(""); } /* Emit all of the members */ Language::classHandler(n); /* Finish the rest of the class */ if (blessed) { /* Generate a client-data entry */ SwigType *ct = NewStringf("p.%s", real_classname); Printv(f_init, "SWIG_TypeClientData(SWIGTYPE", SwigType_manglestr(ct), ", (void*) \"", fullclassname, "\");\n", NIL); SwigType_remember(ct); Delete(ct); Printv(pm, "\n############# Class : ", fullclassname, " ##############\n", "\npackage ", fullclassname, ";\n", NIL); if (have_operators) { Printf(pm, "use overload\n"); Iterator ki; for (ki = First(operators); ki.key; ki = Next(ki)) { char *name = Char(ki.key); // fprintf(stderr,"found name: <%s>\n", name); if (strstr(name, "__eq__")) { Printv(pm, tab4, "\"==\" => sub { $_[0]->__eq__($_[1])},\n",NIL); } else if (strstr(name, "__ne__")) { Printv(pm, tab4, "\"!=\" => sub { $_[0]->__ne__($_[1])},\n",NIL); // there are no tests for this in operator_overload_runme.pl // it is likely to be broken // } else if (strstr(name, "__assign__")) { // Printv(pm, tab4, "\"=\" => sub { $_[0]->__assign__($_[1])},\n",NIL); } else if (strstr(name, "__str__")) { Printv(pm, tab4, "'\"\"' => sub { $_[0]->__str__()},\n",NIL); } else if (strstr(name, "__plusplus__")) { Printv(pm, tab4, "\"++\" => sub { $_[0]->__plusplus__()},\n",NIL); } else if (strstr(name, "__minmin__")) { Printv(pm, tab4, "\"--\" => sub { $_[0]->__minmin__()},\n",NIL); } else if (strstr(name, "__add__")) { Printv(pm, tab4, "\"+\" => sub { $_[0]->__add__($_[1])},\n",NIL); } else if (strstr(name, "__sub__")) { Printv(pm, tab4, "\"-\" => sub { if( not $_[2] ) { $_[0]->__sub__($_[1]) }\n",NIL); Printv(pm, tab8, "elsif( $_[0]->can('__rsub__') ) { $_[0]->__rsub__($_[1]) }\n",NIL); Printv(pm, tab8, "else { die(\"reverse subtraction not supported\") }\n",NIL); Printv(pm, tab8, "},\n",NIL); } else if (strstr(name, "__mul__")) { Printv(pm, tab4, "\"*\" => sub { $_[0]->__mul__($_[1])},\n",NIL); } else if (strstr(name, "__div__")) { Printv(pm, tab4, "\"/\" => sub { $_[0]->__div__($_[1])},\n",NIL); } else if (strstr(name, "__mod__")) { Printv(pm, tab4, "\"%\" => sub { $_[0]->__mod__($_[1])},\n",NIL); // there are no tests for this in operator_overload_runme.pl // it is likely to be broken // } else if (strstr(name, "__and__")) { // Printv(pm, tab4, "\"&\" => sub { $_[0]->__and__($_[1])},\n",NIL); // there are no tests for this in operator_overload_runme.pl // it is likely to be broken // } else if (strstr(name, "__or__")) { // Printv(pm, tab4, "\"|\" => sub { $_[0]->__or__($_[1])},\n",NIL); } else if (strstr(name, "__gt__")) { Printv(pm, tab4, "\">\" => sub { $_[0]->__gt__($_[1])},\n",NIL); } else if (strstr(name, "__ge__")) { Printv(pm, tab4, "\">=\" => sub { $_[0]->__ge__($_[1])},\n",NIL); } else if (strstr(name, "__not__")) { Printv(pm, tab4, "\"!\" => sub { $_[0]->__not__()},\n",NIL); } else if (strstr(name, "__lt__")) { Printv(pm, tab4, "\"<\" => sub { $_[0]->__lt__($_[1])},\n",NIL); } else if (strstr(name, "__le__")) { Printv(pm, tab4, "\"<=\" => sub { $_[0]->__le__($_[1])},\n",NIL); } else if (strstr(name, "__pluseq__")) { Printv(pm, tab4, "\"+=\" => sub { $_[0]->__pluseq__($_[1])},\n",NIL); } else if (strstr(name, "__mineq__")) { Printv(pm, tab4, "\"-=\" => sub { $_[0]->__mineq__($_[1])},\n",NIL); } else if (strstr(name, "__neg__")) { Printv(pm, tab4, "\"neg\" => sub { $_[0]->__neg__()},\n",NIL); } else { fprintf(stderr,"Unknown operator: %s\n", name); } } Printv(pm, tab4, "\"=\" => sub { my $class = ref($_[0]); $class->new($_[0]) },\n", NIL); Printv(pm, tab4, "\"fallback\" => 1;\n", NIL); } // make use strict happy Printv(pm, "use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS);\n", NIL); /* If we are inheriting from a base class, set that up */ Printv(pm, "@ISA = qw(", NIL); /* Handle inheritance */ List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "perl5:proxy"); if (!bname) { b = Next(b); continue; } Printv(pm, " ", bname, NIL); b = Next(b); } } /* Module comes last */ if (!compat || Cmp(namespace_module, fullclassname)) { Printv(pm, " ", namespace_module, NIL); } Printf(pm, " );\n"); /* Dump out a hash table containing the pointers that we own */ Printf(pm, "%%OWNER = ();\n"); if (have_data_members || have_destructor) Printf(pm, "%%ITERATORS = ();\n"); /* Dump out the package methods */ Printv(pm, pcode, NIL); Delete(pcode); /* Output methods for managing ownership */ String *director_disown; if (Getattr(n, "perl5:directordisown")) { director_disown = NewStringf("%s%s($self);\n", tab4, Getattr(n, "perl5:directordisown")); } else { director_disown = NewString(""); } Printv(pm, "sub DISOWN {\n", tab4, "my $self = shift;\n", director_disown, tab4, "my $ptr = tied(%$self);\n", tab4, "delete $OWNER{$ptr};\n", "}\n\n", "sub ACQUIRE {\n", tab4, "my $self = shift;\n", tab4, "my $ptr = tied(%$self);\n", tab4, "$OWNER{$ptr} = 1;\n", "}\n\n", NIL); Delete(director_disown); /* Only output the following methods if a class has member data */ Delete(operators); operators = 0; if (Swig_directorclass(n)) { /* director classes need a way to recover subclass instance attributes */ Node *get_attr = NewHash(); String *mrename; String *symname = Getattr(n, "sym:name"); mrename = Swig_name_disown(NSPACE_TODO, symname); Replaceall(mrename, "disown", "swig_get_attr"); String *type = NewString(getClassType()); String *name = NewString("self"); SwigType_add_pointer(type); Parm *p = NewParm(type, name, n); Delete(name); Delete(type); type = NewString("SV"); SwigType_add_pointer(type); String *action = NewString(""); Printv(action, "{\n", " Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);\n", " result = sv_newmortal();\n" " if (director) sv_setsv(result, director->swig_get_self());\n", "}\n", NIL); Setfile(get_attr, Getfile(n)); Setline(get_attr, Getline(n)); Setattr(get_attr, "wrap:action", action); Setattr(get_attr, "name", mrename); Setattr(get_attr, "sym:name", mrename); Setattr(get_attr, "type", type); Setattr(get_attr, "parms", p); Delete(action); Delete(type); Delete(p); member_func = 1; functionWrapper(get_attr); member_func = 0; Delete(get_attr); Printv(pm, "sub FETCH {\n", tab4, "my ($self,$field) = @_;\n", tab4, "my $member_func = \"swig_${field}_get\";\n", tab4, "if (not $self->can($member_func)) {\n", tab8, "my $h = ", cmodule, "::", mrename, "($self);\n", tab8, "return $h->{$field} if $h;\n", tab4, "}\n", tab4, "return $self->$member_func;\n", "}\n", "\n", "sub STORE {\n", tab4, "my ($self,$field,$newval) = @_;\n", tab4, "my $member_func = \"swig_${field}_set\";\n", tab4, "if (not $self->can($member_func)) {\n", tab8, "my $h = ", cmodule, "::", mrename, "($self);\n", tab8, "return $h->{$field} = $newval if $h;\n", tab4, "}\n", tab4, "return $self->$member_func($newval);\n", "}\n", NIL); Delete(mrename); } } return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { String *symname = Getattr(n, "sym:name"); member_func = 1; Language::memberfunctionHandler(n); member_func = 0; if ((blessed) && (!Getattr(n, "sym:nextSibling"))) { if (Strstr(symname, "__eq__")) { DohSetInt(operators, "__eq__", 1); have_operators = 1; } else if (Strstr(symname, "__ne__")) { DohSetInt(operators, "__ne__", 1); have_operators = 1; } else if (Strstr(symname, "__assign__")) { DohSetInt(operators, "__assign__", 1); have_operators = 1; } else if (Strstr(symname, "__str__")) { DohSetInt(operators, "__str__", 1); have_operators = 1; } else if (Strstr(symname, "__add__")) { DohSetInt(operators, "__add__", 1); have_operators = 1; } else if (Strstr(symname, "__sub__")) { DohSetInt(operators, "__sub__", 1); have_operators = 1; } else if (Strstr(symname, "__mul__")) { DohSetInt(operators, "__mul__", 1); have_operators = 1; } else if (Strstr(symname, "__div__")) { DohSetInt(operators, "__div__", 1); have_operators = 1; } else if (Strstr(symname, "__mod__")) { DohSetInt(operators, "__mod__", 1); have_operators = 1; } else if (Strstr(symname, "__and__")) { DohSetInt(operators, "__and__", 1); have_operators = 1; } else if (Strstr(symname, "__or__")) { DohSetInt(operators, "__or__", 1); have_operators = 1; } else if (Strstr(symname, "__not__")) { DohSetInt(operators, "__not__", 1); have_operators = 1; } else if (Strstr(symname, "__gt__")) { DohSetInt(operators, "__gt__", 1); have_operators = 1; } else if (Strstr(symname, "__ge__")) { DohSetInt(operators, "__ge__", 1); have_operators = 1; } else if (Strstr(symname, "__lt__")) { DohSetInt(operators, "__lt__", 1); have_operators = 1; } else if (Strstr(symname, "__le__")) { DohSetInt(operators, "__le__", 1); have_operators = 1; } else if (Strstr(symname, "__neg__")) { DohSetInt(operators, "__neg__", 1); have_operators = 1; } else if (Strstr(symname, "__plusplus__")) { DohSetInt(operators, "__plusplus__", 1); have_operators = 1; } else if (Strstr(symname, "__minmin__")) { DohSetInt(operators, "__minmin__", 1); have_operators = 1; } else if (Strstr(symname, "__mineq__")) { DohSetInt(operators, "__mineq__", 1); have_operators = 1; } else if (Strstr(symname, "__pluseq__")) { DohSetInt(operators, "__pluseq__", 1); have_operators = 1; } if (Getattr(n, "feature:shadow")) { String *plcode = perlcode(Getattr(n, "feature:shadow"), 0); String *plaction = NewStringf("%s::%s", cmodule, Swig_name_member(NSPACE_TODO, class_name, symname)); Replaceall(plcode, "$action", plaction); Delete(plaction); Printv(pcode, plcode, NIL); } else { Printv(pcode, "*", symname, " = *", cmodule, "::", Swig_name_member(NSPACE_TODO, class_name, symname), ";\n", NIL); } } return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * * Adds an instance member. * ----------------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { String *symname = Getattr(n, "sym:name"); /* SwigType *t = Getattr(n,"type"); */ /* Emit a pair of get/set functions for the variable */ member_func = 1; Language::membervariableHandler(n); member_func = 0; if (blessed) { Printv(pcode, "*swig_", symname, "_get = *", cmodule, "::", Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)), ";\n", NIL); Printv(pcode, "*swig_", symname, "_set = *", cmodule, "::", Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)), ";\n", NIL); /* Now we need to generate a little Perl code for this */ /* if (is_shadow(t)) { *//* This is a Perl object that we have already seen. Add an entry to the members list *//* Printv(blessedmembers, tab4, symname, " => '", is_shadow(t), "',\n", NIL); } */ } have_data_members++; return SWIG_OK; } /* ------------------------------------------------------------ * constructorDeclaration() * * Emits a blessed constructor for our class. In addition to our construct * we manage a Perl hash table containing all of the pointers created by * the constructor. This prevents us from accidentally trying to free * something that wasn't necessarily allocated by malloc or new * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { String *symname = Getattr(n, "sym:name"); member_func = 1; Swig_save("perl5:constructorHandler", n, "parms", NIL); if (Swig_directorclass(n)) { Parm *parms = Getattr(n, "parms"); Parm *self; String *name = NewString("self"); String *type = NewString("SV"); SwigType_add_pointer(type); self = NewParm(type, name, n); Delete(type); Delete(name); Setattr(self, "lname", "O"); if (parms) set_nextSibling(self, parms); Setattr(n, "parms", self); Setattr(n, "wrap:self", "1"); Setattr(n, "hidden", "1"); Delete(self); } String *saved_nc = none_comparison; none_comparison = NewStringf("strcmp(SvPV_nolen(ST(0)), \"%s::%s\") != 0", module, class_name); String *saved_director_prot_ctor_code = director_prot_ctor_code; director_prot_ctor_code = NewStringf("if ($comparison) { /* subclassed */\n" " $director_new\n" "} else {\n" "SWIG_exception_fail(SWIG_RuntimeError, \"accessing abstract class or protected constructor\");\n" "}\n"); Language::constructorHandler(n); Delete(none_comparison); none_comparison = saved_nc; Delete(director_prot_ctor_code); director_prot_ctor_code = saved_director_prot_ctor_code; Swig_restore(n); if ((blessed) && (!Getattr(n, "sym:nextSibling"))) { if (Getattr(n, "feature:shadow")) { String *plcode = perlcode(Getattr(n, "feature:shadow"), 0); String *plaction = NewStringf("%s::%s", module, Swig_name_member(NSPACE_TODO, class_name, symname)); Replaceall(plcode, "$action", plaction); Delete(plaction); Printv(pcode, plcode, NIL); } else { if ((Cmp(symname, class_name) == 0)) { /* Emit a blessed constructor */ Printf(pcode, "sub new {\n"); } else { /* Constructor doesn't match classname so we'll just use the normal name */ Printv(pcode, "sub ", Swig_name_construct(NSPACE_TODO, symname), " {\n", NIL); } const char *pkg = getCurrentClass() && Swig_directorclass(getCurrentClass())? "$_[0]" : "shift"; Printv(pcode, tab4, "my $pkg = ", pkg, ";\n", tab4, "my $self = ", cmodule, "::", Swig_name_construct(NSPACE_TODO, symname), "(@_);\n", tab4, "bless $self, $pkg if defined($self);\n", "}\n\n", NIL); have_constructor = 1; } } member_func = 0; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { String *symname = Getattr(n, "sym:name"); member_func = 1; Language::destructorHandler(n); if (blessed) { if (Getattr(n, "feature:shadow")) { String *plcode = perlcode(Getattr(n, "feature:shadow"), 0); String *plaction = NewStringf("%s::%s", module, Swig_name_member(NSPACE_TODO, class_name, symname)); Replaceall(plcode, "$action", plaction); Delete(plaction); Printv(pcode, plcode, NIL); } else { Printv(pcode, "sub DESTROY {\n", tab4, "return unless $_[0]->isa('HASH');\n", tab4, "my $self = tied(%{$_[0]});\n", tab4, "return unless defined $self;\n", tab4, "delete $ITERATORS{$self};\n", tab4, "if (exists $OWNER{$self}) {\n", tab8, cmodule, "::", Swig_name_destroy(NSPACE_TODO, symname), "($self);\n", tab8, "delete $OWNER{$self};\n", tab4, "}\n}\n\n", NIL); have_destructor = 1; } } member_func = 0; return SWIG_OK; } /* ------------------------------------------------------------ * staticmemberfunctionHandler() * ------------------------------------------------------------ */ virtual int staticmemberfunctionHandler(Node *n) { member_func = 1; Language::staticmemberfunctionHandler(n); member_func = 0; if ((blessed) && (!Getattr(n, "sym:nextSibling"))) { String *symname = Getattr(n, "sym:name"); Printv(pcode, "*", symname, " = *", cmodule, "::", Swig_name_member(NSPACE_TODO, class_name, symname), ";\n", NIL); } return SWIG_OK; } /* ------------------------------------------------------------ * staticmembervariableHandler() * ------------------------------------------------------------ */ virtual int staticmembervariableHandler(Node *n) { Language::staticmembervariableHandler(n); if (blessed) { String *symname = Getattr(n, "sym:name"); Printv(pcode, "*", symname, " = *", cmodule, "::", Swig_name_member(NSPACE_TODO, class_name, symname), ";\n", NIL); } return SWIG_OK; } /* ------------------------------------------------------------ * memberconstantHandler() * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldblessed = blessed; /* Create a normal constant */ blessed = 0; Language::memberconstantHandler(n); blessed = oldblessed; if (blessed) { Printv(pcode, "*", symname, " = *", cmodule, "::", Swig_name_member(NSPACE_TODO, class_name, symname), ";\n", NIL); } return SWIG_OK; } /* ------------------------------------------------------------ * pragma() * * Pragma directive. * * %pragma(perl5) code="String" # Includes a string in the .pm file * %pragma(perl5) include="file.pl" # Includes a file in the .pm file * ------------------------------------------------------------ */ virtual int pragmaDirective(Node *n) { String *lang; String *code; String *value; if (!ImportMode) { lang = Getattr(n, "lang"); code = Getattr(n, "name"); value = Getattr(n, "value"); if (Strcmp(lang, "perl5") == 0) { if (Strcmp(code, "code") == 0) { /* Dump the value string into the .pm file */ if (value) { Printf(pragma_include, "%s\n", value); } } else if (Strcmp(code, "include") == 0) { /* Include a file into the .pm file */ if (value) { FILE *f = Swig_include_open(value); if (!f) { Swig_error(input_file, line_number, "Unable to locate file %s\n", value); } else { char buffer[4096]; while (fgets(buffer, 4095, f)) { Printf(pragma_include, "%s", buffer); } fclose(f); } } } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } } } return Language::pragmaDirective(n); } /* ------------------------------------------------------------ * perlcode() - Output perlcode code into the shadow file * ------------------------------------------------------------ */ String *perlcode(String *code, const String *indent) { String *out = NewString(""); String *temp; char *t; if (!indent) indent = ""; temp = NewString(code); t = Char(temp); if (*t == '{') { Delitem(temp, 0); Delitem(temp, DOH_END); } /* Split the input text into lines */ List *clist = SplitLines(temp); Delete(temp); int initial = 0; String *s = 0; Iterator si; /* Get the initial indentation */ for (si = First(clist); si.item; si = Next(si)) { s = si.item; if (Len(s)) { char *c = Char(s); while (*c) { if (!isspace(*c)) break; initial++; c++; } if (*c && !isspace(*c)) break; else { initial = 0; } } } while (si.item) { s = si.item; if (Len(s) > initial) { char *c = Char(s); c += initial; Printv(out, indent, c, "\n", NIL); } else { Printv(out, "\n", NIL); } si = Next(si); } Delete(clist); return out; } /* ------------------------------------------------------------ * insertDirective() * * Hook for %insert directive. * ------------------------------------------------------------ */ virtual int insertDirective(Node *n) { String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); if ((!ImportMode) && (Cmp(section, "perl") == 0)) { Printv(additional_perl_code, code, NIL); } else { Language::insertDirective(n); } return SWIG_OK; } String *runtimeCode() { String *s = NewString(""); String *shead = Swig_include_sys("perlhead.swg"); if (!shead) { Printf(stderr, "*** Unable to open 'perlhead.swg'\n"); } else { Append(s, shead); Delete(shead); } String *serrors = Swig_include_sys("perlerrors.swg"); if (!serrors) { Printf(stderr, "*** Unable to open 'perlerrors.swg'\n"); } else { Append(s, serrors); Delete(serrors); } String *srun = Swig_include_sys("perlrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'perlrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigperlrun.h"); } virtual int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n"); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } virtual int classDirectorEnd(Node *n) { if (dirprot_mode()) { /* This implementation uses a std::map. It should be possible to rewrite it using a more elegant way, like copying the Java approach for the 'override' array. But for now, this seems to be the least intrusive way. */ Printf(f_directors_h, "\n"); Printf(f_directors_h, "/* Internal director utilities */\n"); Printf(f_directors_h, "public:\n"); Printf(f_directors_h, " bool swig_get_inner(const char *swig_protected_method_name) const {\n"); Printf(f_directors_h, " std::map::const_iterator iv = swig_inner.find(swig_protected_method_name);\n"); Printf(f_directors_h, " return (iv != swig_inner.end() ? iv->second : false);\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, " void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {\n"); Printf(f_directors_h, " swig_inner[swig_protected_method_name] = swig_val;\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, "private:\n"); Printf(f_directors_h, " mutable std::map swig_inner;\n"); } Printf(f_directors_h, "};\n"); return Language::classDirectorEnd(n); } virtual int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("SV"); SwigType_add_pointer(type); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) { \n", classname, target, call); Printf(w->def, " SWIG_DIRECTOR_RGTR((%s *)this, this); \n", basetype); Append(w->def, "}\n"); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(classname); Delete(supername); Delete(parms); return Language::classDirectorConstructor(n); } virtual int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); String *returntype = Getattr(n, "type"); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (!is_void && !ignored_method) { String *pres = NewStringf("SV *%s", Swig_cresult_name()); Wrapper_add_local(w, Swig_cresult_name(), pres); Delete(pres); } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> Perl) */ String *parse_args = NewString(""); String *pstack = NewString(""); Swig_director_parms_fixup(l); /* remove the wrapper 'w' since it was producing spurious temps */ Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("directorargout", l, w); Wrapper_add_local(w, "SP", "dSP"); { String *ptype = Copy(getClassType()); SwigType_add_pointer(ptype); String *mangle = SwigType_manglestr(ptype); Wrapper_add_local(w, "swigself", "SV *swigself"); Printf(w->code, "swigself = SWIG_NewPointerObj(SWIG_as_voidptr(this), SWIGTYPE%s, SWIG_SHADOW);\n", mangle); Printf(w->code, "sv_bless(swigself, gv_stashpv(swig_get_class(), 0));\n"); Delete(mangle); Delete(ptype); Append(pstack, "XPUSHs(swigself);\n"); } Parm *p; char source[256]; int outputs = 0; if (!is_void) outputs++; /* build argument list and type conversion string */ idx = 0; p = l; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* old style? caused segfaults without the p!=0 check in the for() condition, and seems dangerous in the while loop as well. while (Getattr(p, "tmap:ignore")) { p = Getattr(p, "tmap:ignore:next"); } */ if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:directorin")) != 0) { sprintf(source, "obj%d", idx++); String *input = NewString(source); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Delete(input); Replaceall(tm, "$owner", "0"); Replaceall(tm, "$shadow", "0"); /* Wrapper_add_localv(w, source, "SV *", source, "= 0", NIL); */ Printv(wrap_args, "SV *", source, ";\n", NIL); Printv(wrap_args, tm, "\n", NIL); Putc('O', parse_args); Printv(pstack, "XPUSHs(", source, ");\n", NIL); p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { /* special handling for pointers to other C++ director classes. * ideally this would be left to a typemap, but there is currently no * way to selectively apply the dynamic_cast<> to classes that have * directors. in other words, the type "SwigDirector_$1_lname" only exists * for classes with directors. we avoid the problem here by checking * module.wrap::directormap, but it's not clear how to get a typemap to * do something similar. perhaps a new default typemap (in addition * to SWIGTYPE) called DIRECTORTYPE? */ if (SwigType_ispointer(ptype) || SwigType_isreference(ptype)) { Node *module = Getattr(parent, "module"); Node *target = Swig_directormap(module, ptype); sprintf(source, "obj%d", idx++); String *nonconst = 0; /* strip pointer/reference --- should move to Swig/stype.c */ String *nptype = NewString(Char(ptype) + 2); /* name as pointer */ String *ppname = Copy(pname); if (SwigType_isreference(ptype)) { Insert(ppname, 0, "&"); } /* if necessary, cast away const since Perl doesn't support it! */ if (SwigType_isconst(nptype)) { nonconst = NewStringf("nc_tmp_%s", pname); String *nonconst_i = NewStringf("= const_cast< %s >(%s)", SwigType_lstr(ptype, 0), ppname); Wrapper_add_localv(w, nonconst, SwigType_lstr(ptype, 0), nonconst, nonconst_i, NIL); Delete(nonconst_i); Swig_warning(WARN_LANG_DISCARD_CONST, input_file, line_number, "Target language argument '%s' discards const in director method %s::%s.\n", SwigType_str(ptype, pname), SwigType_namestr(c_classname), SwigType_namestr(name)); } else { nonconst = Copy(ppname); } Delete(nptype); Delete(ppname); String *mangle = SwigType_manglestr(ptype); if (target) { String *director = NewStringf("director_%s", mangle); Wrapper_add_localv(w, director, "Swig::Director *", director, "= 0", NIL); Wrapper_add_localv(w, source, "SV *", source, "= 0", NIL); Printf(wrap_args, "%s = SWIG_DIRECTOR_CAST(%s);\n", director, nonconst); Printf(wrap_args, "if (!%s) {\n", director); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Append(wrap_args, "} else {\n"); Printf(wrap_args, "%s = %s->swig_get_self();\n", source, director); Printf(wrap_args, "SvREFCNT_inc((SV *)%s);\n", source); Append(wrap_args, "}\n"); Delete(director); } else { Wrapper_add_localv(w, source, "SV *", source, "= 0", NIL); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Printf(pstack, "XPUSHs(sv_2mortal(%s));\n", source); } Putc('O', parse_args); Delete(mangle); Delete(nonconst); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } } p = nextSibling(p); } /* add the method name as a PyString */ String *pyname = Getattr(n, "sym:name"); /* wrap complex arguments to PyObjects */ Printv(w->code, wrap_args, NIL); /* pass the method call on to the Python object */ if (dirprot_mode() && !is_public(n)) { Printf(w->code, "swig_set_inner(\"%s\", true);\n", name); } Append(w->code, "ENTER;\n"); Append(w->code, "SAVETMPS;\n"); Append(w->code, "PUSHMARK(SP);\n"); Append(w->code, pstack); Delete(pstack); Append(w->code, "PUTBACK;\n"); Printf(w->code, "call_method(\"%s\", G_EVAL | G_SCALAR);\n", pyname); if (dirprot_mode() && !is_public(n)) Printf(w->code, "swig_set_inner(\"%s\", false);\n", name); /* exception handling */ tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); if (tm) tm = Copy(tm); } Append(w->code, "if (SvTRUE(ERRSV)) {\n"); Append(w->code, " PUTBACK;\n FREETMPS;\n LEAVE;\n"); if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { Replaceall(tm, "$error", "ERRSV"); Printv(w->code, Str(tm), "\n", NIL); } else { Printf(w->code, " Swig::DirectorMethodException::raise(ERRSV);\n", classname, pyname); } Append(w->code, "}\n"); Delete(tm); /* * Python method may return a simple object, or a tuple. * for in/out arguments, we have to extract the appropriate PyObjects from the tuple, * then marshal everything back to C/C++ (return value and output arguments). * */ /* marshal return value and other outputs (if any) from PyObject to C/C++ type */ String *cleanup = NewString(""); String *outarg = NewString(""); if (outputs > 1) { Wrapper_add_local(w, "output", "SV *output"); Printf(w->code, "if (count != %d) {\n", outputs); Printf(w->code, " Swig::DirectorTypeMismatchException::raise(\"Perl method %s.%sfailed to return a list.\");\n", classname, pyname); Append(w->code, "}\n"); } idx = 0; /* marshal return value */ if (!is_void) { Append(w->code, "SPAGAIN;\n"); Printf(w->code, "%s = POPs;\n", Swig_cresult_name()); tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { if (outputs > 1) { Printf(w->code, "output = POPs;\n"); Replaceall(tm, "$input", "output"); } else { Replaceall(tm, "$input", Swig_cresult_name()); } char temp[24]; sprintf(temp, "%d", idx); Replaceall(tm, "$argnum", temp); /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } /* marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { if (outputs > 1) { Printf(w->code, "output = POPs;\n"); Replaceall(tm, "$result", "output"); } else { Replaceall(tm, "$result", Swig_cresult_name()); } Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(parse_args); Delete(cleanup); Delete(outarg); } if (!ignored_method) { Append(w->code, "PUTBACK;\n"); Append(w->code, "FREETMPS;\n"); Append(w->code, "LEAVE;\n"); } if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } int classDirectorDisown(Node *n) { int rv; member_func = 1; rv = Language::classDirectorDisown(n); member_func = 0; if (rv == SWIG_OK && Swig_directorclass(n)) { String *symname = Getattr(n, "sym:name"); String *disown = Swig_name_disown(NSPACE_TODO, symname); Setattr(n, "perl5:directordisown", NewStringf("%s::%s", cmodule, disown)); } return rv; } int classDirectorDestructor(Node *n) { /* TODO: it would be nice if this didn't have to copy the body of Language::classDirectorDestructor() */ String *DirectorClassName = directorClassName(getCurrentClass()); String *body = NewString("\n"); String *ptype = Copy(getClassType()); SwigType_add_pointer(ptype); String *mangle = SwigType_manglestr(ptype); Printv(body, tab4, "dSP;\n", tab4, "SV *self = SWIG_NewPointerObj(SWIG_as_voidptr(this), SWIGTYPE", mangle, ", SWIG_SHADOW);\n", tab4, "\n", tab4, "sv_bless(self, gv_stashpv(swig_get_class(), 0));\n", tab4, "ENTER;\n", tab4, "SAVETMPS;\n", tab4, "PUSHMARK(SP);\n", tab4, "XPUSHs(self);\n", tab4, "XPUSHs(&PL_sv_yes);\n", tab4, "PUTBACK;\n", tab4, "call_method(\"DESTROY\", G_EVAL | G_VOID);\n", tab4, "FREETMPS;\n", tab4, "LEAVE;\n", NIL); Delete(mangle); Delete(ptype); if (Getattr(n, "noexcept")) { Printf(f_directors_h, " virtual ~%s() noexcept;\n", DirectorClassName); Printf(f_directors, "%s::~%s() noexcept {%s}\n\n", DirectorClassName, DirectorClassName, body); } else if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw();\n", DirectorClassName); Printf(f_directors, "%s::~%s() throw() {%s}\n\n", DirectorClassName, DirectorClassName, body); } else { Printf(f_directors_h, " virtual ~%s();\n", DirectorClassName); Printf(f_directors, "%s::~%s() {%s}\n\n", DirectorClassName, DirectorClassName, body); } return SWIG_OK; } }; /* ----------------------------------------------------------------------------- * swig_perl5() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_perl5() { return new PERL5(); } extern "C" Language *swig_perl5(void) { return new_swig_perl5(); } swig-4.0.2/Source/Modules/emit.cxx0000644000175000017500000004057613667507523016730 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * emit.cxx * * Useful functions for emitting various pieces of code. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" /* ----------------------------------------------------------------------------- * emit_return_variable() * * Emits a variable declaration for a function return value. * The variable name is always called result. * n => Node of the method being wrapped * rt => the return type * f => the wrapper to generate code into * ----------------------------------------------------------------------------- */ void emit_return_variable(Node *n, SwigType *rt, Wrapper *f) { if (!GetFlag(n, "tmap:out:optimal")) { if (rt && (SwigType_type(rt) != T_VOID)) { SwigType *vt = cplus_value_type(rt); SwigType *tt = vt ? vt : rt; SwigType *lt = SwigType_ltype(tt); String *lstr = SwigType_str(lt, Swig_cresult_name()); if (SwigType_ispointer(lt)) { Wrapper_add_localv(f, Swig_cresult_name(), lstr, "= 0", NULL); } else { Wrapper_add_local(f, Swig_cresult_name(), lstr); } if (vt) { Delete(vt); } Delete(lt); Delete(lstr); } } } /* ----------------------------------------------------------------------------- * emit_parameter_variables() * * Emits a list of variable declarations for function parameters. * The variable names are always called arg1, arg2, etc... * l => the parameter list * f => the wrapper to generate code into * ----------------------------------------------------------------------------- */ void emit_parameter_variables(ParmList *l, Wrapper *f) { Parm *p; String *tm; /* Emit function arguments */ Swig_cargs(f, l); /* Attach typemaps to parameters */ /* Swig_typemap_attach_parms("ignore",l,f); */ Swig_typemap_attach_parms("default", l, f); Swig_typemap_attach_parms("arginit", l, f); /* Apply the arginit and default */ p = l; while (p) { tm = Getattr(p, "tmap:arginit"); if (tm) { Replace(tm, "$target", Getattr(p, "lname"), DOH_REPLACE_ANY); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:arginit:next"); } else { p = nextSibling(p); } } /* Apply the default typemap */ p = l; while (p) { tm = Getattr(p, "tmap:default"); if (tm) { Replace(tm, "$target", Getattr(p, "lname"), DOH_REPLACE_ANY); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:default:next"); } else { p = nextSibling(p); } } } /* ----------------------------------------------------------------------------- * emit_attach_parmmaps() * * Attach the standard parameter related typemaps. * ----------------------------------------------------------------------------- */ void emit_attach_parmmaps(ParmList *l, Wrapper *f) { Swig_typemap_attach_parms("in", l, f); Swig_typemap_attach_parms("typecheck", l, 0); Swig_typemap_attach_parms("argout", l, f); Swig_typemap_attach_parms("check", l, f); Swig_typemap_attach_parms("freearg", l, f); { /* This is compatibility code to deal with the deprecated "ignore" typemap */ Parm *p = l; Parm *np; while (p) { String *tm = Getattr(p, "tmap:in"); if (tm && checkAttribute(p, "tmap:in:numinputs", "0")) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); np = Getattr(p, "tmap:in:next"); while (p && (p != np)) { /* Setattr(p,"ignore","1"); Deprecate */ p = nextSibling(p); } } else if (tm) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } /* Perform a sanity check on "in" and "freearg" typemaps. These must exactly match to avoid chaos. If a mismatch occurs, we nuke the freearg typemap */ { Parm *p = l; Parm *npin, *npfreearg; while (p) { npin = Getattr(p, "tmap:in:next"); /* if (Getattr(p,"tmap:ignore")) { npin = Getattr(p,"tmap:ignore:next"); } else if (Getattr(p,"tmap:in")) { npin = Getattr(p,"tmap:in:next"); } */ if (Getattr(p, "tmap:freearg")) { npfreearg = Getattr(p, "tmap:freearg:next"); if (npin != npfreearg) { while (p != npin) { Delattr(p, "tmap:freearg"); Delattr(p, "tmap:freearg:next"); p = nextSibling(p); } } } p = npin; } } /* Check for variable length arguments with no input typemap. If no input is defined, we set this to ignore and print a message. */ { Parm *p = l; Parm *lp = 0; while (p) { if (!checkAttribute(p, "tmap:in:numinputs", "0")) { lp = p; p = Getattr(p, "tmap:in:next"); continue; } if (SwigType_isvarargs(Getattr(p, "type"))) { Swig_warning(WARN_LANG_VARARGS, input_file, line_number, "Variable length arguments discarded.\n"); Setattr(p, "tmap:in", ""); } lp = 0; p = nextSibling(p); } /* Check if last input argument is variable length argument */ if (lp) { p = lp; while (p) { if (SwigType_isvarargs(Getattr(p, "type"))) { // Mark the head of the ParmList that it has varargs Setattr(l, "emit:varargs", lp); //Printf(stdout, "setting emit:varargs %s ... %s +++ %s\n", Getattr(l, "emit:varargs"), Getattr(l, "type"), Getattr(p, "type")); break; } p = nextSibling(p); } } } /* * An equivalent type can be used in the typecheck typemap for SWIG to detect the overloading of equivalent * target language types. This is primarily for the smartptr feature, where a pointer and a smart pointer * are seen as equivalent types in the target language. */ { Parm *p = l; while (p) { String *tm = Getattr(p, "tmap:typecheck"); if (tm) { String *equivalent = Getattr(p, "tmap:typecheck:equivalent"); if (equivalent) { String *precedence = Getattr(p, "tmap:typecheck:precedence"); if (precedence && Strcmp(precedence, "0") != 0) Swig_error(Getfile(tm), Getline(tm), "The 'typecheck' typemap for %s contains an 'equivalent' attribute for a 'precedence' that is not set to SWIG_TYPECHECK_POINTER or 0.\n", SwigType_str(Getattr(p, "type"), 0)); SwigType *cpt = Swig_cparse_type(equivalent); if (cpt) { Setattr(p, "equivtype", cpt); Delete(cpt); } else { Swig_error(Getfile(tm), Getline(tm), "Invalid type (%s) in 'equivalent' attribute in 'typecheck' typemap for type %s.\n", equivalent, SwigType_str(Getattr(p, "type"), 0)); } } p = Getattr(p, "tmap:typecheck:next"); } else { p = nextSibling(p); } } } } /* ----------------------------------------------------------------------------- * emit_num_arguments() * * Calculate the total number of arguments. This function is safe for use * with multi-argument typemaps which may change the number of arguments in * strange ways. * ----------------------------------------------------------------------------- */ int emit_num_arguments(ParmList *parms) { Parm *p = parms; int nargs = 0; while (p) { if (Getattr(p, "tmap:in")) { nargs += GetInt(p, "tmap:in:numinputs"); p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } /* DB 04/02/2003: Not sure this is necessary with tmap:in:numinputs */ /* if (parms && (p = Getattr(parms,"emit:varargs"))) { if (!nextSibling(p)) { nargs--; } } */ return nargs; } /* ----------------------------------------------------------------------------- * emit_num_required() * * Computes the number of required arguments. This function is safe for * use with multi-argument typemaps and knows how to skip over everything * properly. Note that parameters with default values are counted unless * the compact default args option is on. * ----------------------------------------------------------------------------- */ int emit_num_required(ParmList *parms) { Parm *p = parms; int nargs = 0; Parm *first_default_arg = 0; int compactdefargs = ParmList_is_compactdefargs(p); while (p) { if (Getattr(p, "tmap:in") && checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } else { if (Getattr(p, "tmap:default")) break; if (Getattr(p, "value")) { if (!first_default_arg) first_default_arg = p; if (compactdefargs) break; } nargs += GetInt(p, "tmap:in:numinputs"); if (Getattr(p, "tmap:in")) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } /* Print error message for non-default arguments following default arguments */ /* The error message is printed more than once with most language modules, this ought to be fixed */ if (first_default_arg) { p = first_default_arg; while (p) { if (Getattr(p, "tmap:in") && checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } else { if (!Getattr(p, "value") && (!Getattr(p, "tmap:default"))) { Swig_error(Getfile(p), Getline(p), "Non-optional argument '%s' follows an optional argument.\n", Getattr(p, "name")); } if (Getattr(p, "tmap:in")) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } } /* DB 04/02/2003: Not sure this is necessary with tmap:in:numinputs */ /* if (parms && (p = Getattr(parms,"emit:varargs"))) { if (!nextSibling(p)) { nargs--; } } */ return nargs; } /* ----------------------------------------------------------------------------- * emit_isvarargs() * * Checks if a ParmList is a parameter list containing varargs. * This function requires emit_attach_parmmaps to have been called beforehand. * ----------------------------------------------------------------------------- */ int emit_isvarargs(ParmList *p) { if (!p) return 0; if (Getattr(p, "emit:varargs")) return 1; return 0; } /* ----------------------------------------------------------------------------- * emit_isvarargs_function() * * Checks for varargs in a function/constructor (can be overloaded) * ----------------------------------------------------------------------------- */ bool emit_isvarargs_function(Node *n) { bool has_varargs = false; Node *over = Getattr(n, "sym:overloaded"); if (over) { for (Node *sibling = over; sibling; sibling = Getattr(sibling, "sym:nextSibling")) { if (ParmList_has_varargs(Getattr(sibling, "parms"))) { has_varargs = true; break; } } } else { has_varargs = ParmList_has_varargs(Getattr(n, "parms")) ? true : false; } return has_varargs; } /* ----------------------------------------------------------------------------- * void emit_mark_vararg_parms() * * Marks the vararg parameters which are to be ignored. * Vararg parameters are marked as ignored if there is no 'in' varargs (...) * typemap. * ----------------------------------------------------------------------------- */ void emit_mark_varargs(ParmList *l) { Parm *p = l; while (p) { if (SwigType_isvarargs(Getattr(p, "type"))) if (!Getattr(p, "tmap:in")) Setattr(p, "varargs:ignore", "1"); p = nextSibling(p); } } #if 0 /* replace_contract_args. This function replaces argument names in contract specifications. Used in conjunction with the %contract directive. */ static void replace_contract_args(Parm *cp, Parm *rp, String *s) { while (cp && rp) { String *n = Getattr(cp, "name"); if (n) { Replace(s, n, Getattr(rp, "lname"), DOH_REPLACE_ID); } cp = nextSibling(cp); rp = nextSibling(rp); } } #endif /* ----------------------------------------------------------------------------- * int emit_action_code() * * Emits action code for a wrapper. Adds in exception handling code (%exception). * eaction -> the action code to emit * wrappercode -> the emitted code (output) * ----------------------------------------------------------------------------- */ int emit_action_code(Node *n, String *wrappercode, String *eaction) { assert(Getattr(n, "wrap:name")); /* Look for except feature (%exception) */ String *tm = GetFlagAttr(n, "feature:except"); if (tm) tm = Copy(tm); if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { if (Strstr(tm, "$")) { Swig_replace_special_variables(n, parentNode(n), tm); Replaceall(tm, "$function", eaction); // deprecated Replaceall(tm, "$action", eaction); } Printv(wrappercode, tm, "\n", NIL); Delete(tm); return 1; } else { Printv(wrappercode, eaction, "\n", NIL); return 0; } } /* ----------------------------------------------------------------------------- * int emit_action() * * Emits the call to the wrapped function. * Adds in exception specification exception handling and %exception code. * ----------------------------------------------------------------------------- */ String *emit_action(Node *n) { String *actioncode = NewStringEmpty(); String *tm; String *action; String *wrap; ParmList *catchlist = Getattr(n, "catchlist"); /* Look for fragments */ { String *fragment = Getattr(n, "feature:fragment"); if (fragment) { char *c, *tok; String *t = Copy(fragment); c = Char(t); tok = strtok(c, ","); while (tok) { String *fname = NewString(tok); Setfile(fname, Getfile(n)); Setline(fname, Getline(n)); Swig_fragment_emit(fname); Delete(fname); tok = strtok(NULL, ","); } Delete(t); } } /* Emit wrapper code (if any) */ wrap = Getattr(n, "wrap:code"); if (wrap && Swig_filebyname("header") != Getattr(n, "wrap:code:done")) { File *f_code = Swig_filebyname("header"); if (f_code) { Printv(f_code, wrap, NIL); } Setattr(n, "wrap:code:done", f_code); } action = Getattr(n, "feature:action"); if (!action) action = Getattr(n, "wrap:action"); assert(action != 0); /* Emit contract code (if any) */ if (Swig_contract_mode_get()) { /* Preassertion */ tm = Getattr(n, "contract:preassert"); if (Len(tm)) { Printv(actioncode, tm, "\n", NIL); } } /* Exception handling code */ /* saves action -> eaction for postcatching exception */ String *eaction = NewString(""); /* If we are in C++ mode and there is an exception specification. We're going to enclose the block in a try block */ if (catchlist) { Printf(eaction, "try {\n"); } String *preaction = Getattr(n, "wrap:preaction"); if (preaction) Printv(eaction, preaction, NIL); Printv(eaction, action, NIL); String *postaction = Getattr(n, "wrap:postaction"); if (postaction) Printv(eaction, postaction, NIL); if (catchlist) { int unknown_catch = 0; int has_varargs = 0; Printf(eaction, "}"); for (Parm *ep = catchlist; ep; ep = nextSibling(ep)) { String *em = Swig_typemap_lookup("throws", ep, "_e", 0); if (em) { SwigType *et = Getattr(ep, "type"); SwigType *etr = SwigType_typedef_resolve_all(et); if (SwigType_isreference(etr) || SwigType_ispointer(etr) || SwigType_isarray(etr)) { Printf(eaction, " catch(%s) {", SwigType_str(et, "_e")); } else if (SwigType_isvarargs(etr)) { Printf(eaction, " catch(...) {"); has_varargs = 1; } else { Printf(eaction, " catch(%s) {", SwigType_str(et, "&_e")); } Printv(eaction, em, "\n", NIL); Printf(eaction, "}"); } else { Swig_warning(WARN_TYPEMAP_THROW, Getfile(n), Getline(n), "No 'throws' typemap defined for exception type '%s'\n", SwigType_str(Getattr(ep, "type"), 0)); unknown_catch = 1; } } if (unknown_catch && !has_varargs) { Printf(eaction, " catch(...) {\nthrow;\n}"); } } /* Look for except typemap (Deprecated) */ tm = Swig_typemap_lookup("except", n, Swig_cresult_name(), 0); if (tm) { Setattr(n, "feature:except", tm); tm = 0; } /* emit the except feature code */ emit_action_code(n, actioncode, eaction); Delete(eaction); /* Emit contract code (if any) */ if (Swig_contract_mode_get()) { /* Postassertion */ tm = Getattr(n, "contract:postassert"); if (Len(tm)) { Printv(actioncode, tm, "\n", NIL); } } return actioncode; } swig-4.0.2/Source/Modules/cffi.cxx0000644000175000017500000010631313667507523016671 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * cffi.cxx * * cffi language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include //#define CFFI_DEBUG //#define CFFI_WRAP_DEBUG static const char *usage = "\ CFFI Options (available with -cffi)\n\ -generate-typedef - Use defctype to generate shortcuts according to the\n\ typedefs in the input.\n\ -[no]cwrap - Turn on or turn off generation of an intermediate C\n\ file when creating a C interface. By default this is\n\ only done for C++ code.\n\ -[no]swig-lisp - Turn on or off generation of code for helper lisp\n\ macro, functions, etc. which SWIG uses while\n\ generating wrappers. These macros, functions may still\n\ be used by generated wrapper code.\n\ "; class CFFI:public Language { public: String *f_cl; String *f_clhead; String *f_clwrap; bool CWrap; // generate wrapper file for C code? File *f_begin; File *f_runtime; File *f_cxx_header; File *f_cxx_wrapper; File *f_clos; String *module; virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int variableWrapper(Node *n); virtual int constantWrapper(Node *n); // virtual int classDeclaration(Node *n); virtual int enumDeclaration(Node *n); virtual int typedefHandler(Node *n); //c++ specific code virtual int constructorHandler(Node *n); virtual int destructorHandler(Node *n); virtual int memberfunctionHandler(Node *n); virtual int membervariableHandler(Node *n); virtual int classHandler(Node *n); private: static void checkConstraints(ParmList *parms, Wrapper *f); static void argout(ParmList *parms, Wrapper *f); static String *freearg(ParmList *parms); static void cleanupFunction(Node *n, Wrapper *f, ParmList *parms); void emit_defun(Node *n, String *name); void emit_defmethod(Node *n); void emit_initialize_instance(Node *n); void emit_getter(Node *n); void emit_setter(Node *n); void emit_class(Node *n); void emit_struct_union(Node *n, bool un); void emit_export(Node *n, String *name); void emit_inline(Node *n, String *name); String *lispy_name(char *name); String *lispify_name(Node *n, String *ty, const char *flag, bool kw = false); String *convert_literal(String *num_param, String *type, bool try_to_split = true); String *infix_to_prefix(String *val, char split_op, const String *op, String *type); String *strip_parens(String *string); String *trim(String *string); int generate_typedef_flag; bool no_swig_lisp; }; void CFFI::main(int argc, char *argv[]) { int i; Preprocessor_define("SWIGCFFI 1", 0); SWIG_library_directory("cffi"); SWIG_config_file("cffi.swg"); generate_typedef_flag = 0; no_swig_lisp = false; CWrap = false; for (i = 1; i < argc; i++) { if (!Strcmp(argv[i], "-help")) { Printf(stdout, "%s\n", usage); } else if (!strcmp(argv[i], "-cwrap")) { CWrap = true; Swig_mark_arg(i); } else if ((Strcmp(argv[i], "-generate-typedef") == 0)) { generate_typedef_flag = 1; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-nocwrap")) { CWrap = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-swig-lisp")) { no_swig_lisp = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-noswig-lisp")) { no_swig_lisp = true; Swig_mark_arg(i); } } f_clhead = NewString(""); f_clwrap = NewString(""); f_cl = NewString(""); allow_overloading(); } int CFFI::top(Node *n) { File *f_null = NewString(""); module = Getattr(n, "name"); String *cxx_filename = Getattr(n, "outfile"); String *lisp_filename = NewString(""); Printf(lisp_filename, "%s%s.lisp", SWIG_output_directory(), module); File *f_lisp = NewFile(lisp_filename, "w", SWIG_output_files()); if (!f_lisp) { FileErrorDisplay(lisp_filename); SWIG_exit(EXIT_FAILURE); } if (CPlusPlus || CWrap) { f_begin = NewFile(cxx_filename, "w", SWIG_output_files()); if (!f_begin) { Delete(f_lisp); Printf(stderr, "Unable to open %s for writing\n", cxx_filename); SWIG_exit(EXIT_FAILURE); } String *clos_filename = NewString(""); Printf(clos_filename, "%s%s-clos.lisp", SWIG_output_directory(), module); f_clos = NewFile(clos_filename, "w", SWIG_output_files()); if (!f_clos) { Delete(f_lisp); Printf(stderr, "Unable to open %s for writing\n", cxx_filename); SWIG_exit(EXIT_FAILURE); } } else { f_begin = NewString(""); f_clos = NewString(""); } f_runtime = NewString(""); f_cxx_header = f_runtime; f_cxx_wrapper = NewString(""); Swig_register_filebyname("header", f_cxx_header); Swig_register_filebyname("wrapper", f_cxx_wrapper); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("lisphead", f_clhead); if (!no_swig_lisp) Swig_register_filebyname("swiglisp", f_cl); else Swig_register_filebyname("swiglisp", f_null); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGCFFI\n#define SWIGCFFI\n#endif\n\n"); Swig_banner_target_lang(f_lisp, ";;;"); Language::top(n); Printf(f_lisp, "%s\n", f_clhead); Printf(f_lisp, "%s\n", f_cl); Printf(f_lisp, "%s\n", f_clwrap); Delete(f_lisp); Delete(f_cl); Delete(f_clhead); Delete(f_clwrap); Dump(f_runtime, f_begin); Delete(f_runtime); Delete(f_begin); Delete(f_cxx_wrapper); Delete(f_null); return SWIG_OK; } int CFFI::classHandler(Node *n) { #ifdef CFFI_DEBUG Printf(stderr, "class %s::%s\n", "some namespace", //current_namespace, Getattr(n, "sym:name")); #endif String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); // maybe just remove this check and get rid of the else clause below. if (Strcmp(kind, "struct") == 0) { emit_struct_union(n, false); return SWIG_OK; } else if (Strcmp(kind, "union") == 0) { emit_struct_union(n, true); return SWIG_OK; } else if (Strcmp(kind, "class") == 0) { emit_class(n); Language::classHandler(n); } else { Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); Printf(stderr, " (name: %s)\n", name); SWIG_exit(EXIT_FAILURE); return SWIG_OK; } return SWIG_OK; } int CFFI::constructorHandler(Node *n) { #ifdef CFFI_DEBUG Printf(stderr, "constructor %s\n", Getattr(n, "name")); Printf(stderr, "constructor %s\n and %s and %s", Getattr(n, "kind"), Getattr(n, "sym:name"), Getattr(n, "allegrocl:old-sym:name")); #endif Setattr(n, "cffi:constructorfunction", "1"); // Let SWIG generate a global forwarding function. return Language::constructorHandler(n); } int CFFI::destructorHandler(Node *n) { #ifdef CFFI_DEBUG Printf(stderr, "destructor %s\n", Getattr(n, "name")); #endif // Let SWIG generate a global forwarding function. return Language::destructorHandler(n); } void CFFI::emit_defmethod(Node *n) { String *args_placeholder = NewStringf(""); String *args_call = NewStringf(""); ParmList *pl = Getattr(n, "parms"); int argnum = 0; Node *parent = getCurrentClass(); bool first = 0; for (Parm *p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); String *ffitype = Swig_typemap_lookup("lispclass", p, "", 0); int tempargname = 0; if(!first) first = true; else Printf(args_placeholder, " "); if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } else if (Strcmp(argname, "t") == 0 || Strcmp(argname, "T") == 0) { argname = NewStringf("t-arg%d", argnum); tempargname = 1; } if (Len(ffitype) > 0) Printf(args_placeholder, "(%s %s)", argname, ffitype); else Printf(args_placeholder, "%s", argname); if (ffitype && Strcmp(ffitype, lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'classname")) == 0) Printf(args_call, " (ff-pointer %s)", argname); else Printf(args_call, " %s", argname); Delete(ffitype); if (tempargname) Delete(argname); } String *method_name = Getattr(n, "name"); int x = Replace(method_name, "operator ", "", DOH_REPLACE_FIRST); // if (x == 1) Printf(f_clos, "(cl:shadow \"%s\")\n", method_name); Printf(f_clos, "(cl:defmethod %s (%s)\n (%s%s))\n\n", lispify_name(n, lispy_name(Char(method_name)), "'method"), args_placeholder, lispify_name(n, Getattr(n, "sym:name"), "'function"), args_call); } void CFFI::emit_initialize_instance(Node *n) { String *args_placeholder = NewStringf(""); String *args_call = NewStringf(""); ParmList *pl = Getattr(n, "parms"); int argnum = 0; Node *parent = getCurrentClass(); for (Parm *p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); String *ffitype = Swig_typemap_lookup("lispclass", p, "", 0); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } else if (Strcmp(argname, "t") == 0 || Strcmp(argname, "T") == 0) { argname = NewStringf("t-arg%d", argnum); tempargname = 1; } if (Len(ffitype) > 0) Printf(args_placeholder, " (%s %s)", argname, ffitype); else Printf(args_placeholder, " %s", argname); if (ffitype && Strcmp(ffitype, lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'classname")) == 0) Printf(args_call, " (ff-pointer %s)", argname); else Printf(args_call, " %s", argname); Delete(ffitype); if (tempargname) Delete(argname); } Printf(f_clos, "(cl:defmethod initialize-instance :after ((obj %s) &key%s)\n (setf (slot-value obj 'ff-pointer) (%s%s)))\n\n", lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'class"), args_placeholder, lispify_name(n, Getattr(n, "sym:name"), "'function"), args_call); } void CFFI::emit_setter(Node *n) { Node *parent = getCurrentClass(); Printf(f_clos, "(cl:defmethod (cl:setf %s) (arg0 (obj %s))\n (%s (ff-pointer obj) arg0))\n\n", lispify_name(n, Getattr(n, "name"), "'method"), lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'class"), lispify_name(n, Getattr(n, "sym:name"), "'function")); } void CFFI::emit_getter(Node *n) { Node *parent = getCurrentClass(); Printf(f_clos, "(cl:defmethod %s ((obj %s))\n (%s (ff-pointer obj)))\n\n", lispify_name(n, Getattr(n, "name"), "'method"), lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'class"), lispify_name(n, Getattr(n, "sym:name"), "'function")); } int CFFI::memberfunctionHandler(Node *n) { // Let SWIG generate a global forwarding function. Setattr(n, "cffi:memberfunction", "1"); return Language::memberfunctionHandler(n); } int CFFI::membervariableHandler(Node *n) { // Let SWIG generate a get/set function pair. Setattr(n, "cffi:membervariable", "1"); return Language::membervariableHandler(n); } void CFFI::checkConstraints(ParmList *parms, Wrapper *f) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:check"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n\n", NULL); Delete(tm); p = Getattr(p, "tmap:check:next"); } } } void CFFI::argout(ParmList *parms, Wrapper *f) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:argout"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$result", Swig_cresult_name()); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:argout:next"); } } } String *CFFI::freearg(ParmList *parms) { String *ret = NewString(""); Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:freearg"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(ret, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:freearg:next"); } } return ret; } void CFFI::cleanupFunction(Node *n, Wrapper *f, ParmList *parms) { String *cleanup = freearg(parms); Printv(f->code, cleanup, NULL); if (GetFlag(n, "feature:new")) { String *tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NULL); Delete(tm); } } Replaceall(f->code, "$cleanup", cleanup); Delete(cleanup); Replaceall(f->code, "$symname", Getattr(n, "sym:name")); } int CFFI::functionWrapper(Node *n) { ParmList *parms = Getattr(n, "parms"); String *iname = Getattr(n, "sym:name"); Wrapper *f = NewWrapper(); String *raw_return_type = Swig_typemap_lookup("ctype", n, "", 0); SwigType *return_type = Swig_cparse_type(raw_return_type); SwigType *resolved = SwigType_typedef_resolve_all(return_type); int is_void_return = (Cmp(resolved, "void") == 0); Delete(resolved); if (!is_void_return) { String *lresult_init = NewStringf("lresult = (%s)0", raw_return_type); Wrapper_add_localv(f, "lresult", raw_return_type, lresult_init, NIL); Delete(lresult_init); } String *overname = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) { DelWrapper(f); return SWIG_ERROR; } } String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); // Emit all of the local variables for holding arguments. emit_parameter_variables(parms, f); // Attach the standard typemaps Swig_typemap_attach_parms("ctype", parms, f); emit_attach_parmmaps(parms, f); int num_arguments = emit_num_arguments(parms); String *name_and_parms = NewStringf("%s (", wname); int i; Parm *p; int gencomma = 0; #ifdef CFFI_DEBUG Printf(stderr, "function - %s - %d\n", Getattr(n, "name"), num_arguments); #endif for (i = 0, p = parms; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *c_parm_type = Swig_cparse_type(Getattr(p, "tmap:ctype")); String *arg = NewStringf("l%s", Getattr(p, "lname")); // Emit parameter declaration if (gencomma) Printf(name_and_parms, ", "); String *parm_decl = SwigType_str(c_parm_type, arg); Printf(name_and_parms, "%s", parm_decl); #ifdef CFFI_DEBUG Printf(stderr, " param: %s\n", parm_decl); #endif Delete(parm_decl); gencomma = 1; // Emit parameter conversion code String *parm_code = Getattr(p, "tmap:in"); { Replaceall(parm_code, "$input", arg); Setattr(p, "emit:input", arg); Printf(f->code, "%s\n", parm_code); p = Getattr(p, "tmap:in:next"); } Delete(arg); } Printf(name_and_parms, ")"); // Emit the function definition String *signature = SwigType_str(return_type, name_and_parms); Printf(f->def, "EXPORT %s {", signature); checkConstraints(parms, f); Printf(f->code, " try {\n"); String *actioncode = emit_action(n); String *result_convert = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); if (result_convert) { Replaceall(result_convert, "$result", "lresult"); Printf(f->code, "%s\n", result_convert); } Delete(result_convert); argout(parms, f); cleanupFunction(n, f, parms); /* See if there is any return cleanup code */ String *tm = 0; if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } if (!is_void_return) { Printf(f->code, " return lresult;\n"); } emit_return_variable(n, Getattr(n, "type"), f); Printf(f->code, " } catch (...) {\n"); if (!is_void_return) Printf(f->code, " return (%s)0;\n", raw_return_type); Printf(f->code, " }\n"); Printf(f->code, "}\n"); if (CPlusPlus) Wrapper_print(f, f_runtime); if (CPlusPlus) { emit_defun(n, wname); if (Getattr(n, "cffi:memberfunction")) emit_defmethod(n); else if (Getattr(n, "cffi:membervariable")) { if (Getattr(n, "memberget")) emit_getter(n); else if (Getattr(n, "memberset")) emit_setter(n); } else if (Getattr(n, "cffi:constructorfunction")) { emit_initialize_instance(n); } } else emit_defun(n, iname); // if (!overloaded || !Getattr(n, "sym:nextSibling")) { // update_package_if_needed(n); // emit_buffered_defuns(n); // // this is the last overload. // if (overloaded) { // emit_dispatch_defun(n); // } // } Delete(wname); DelWrapper(f); return SWIG_OK; } void CFFI::emit_defun(Node *n, String *name) { String *func_name = Getattr(n, "sym:name"); ParmList *pl = Getattr(n, "parms"); int argnum = 0; func_name = lispify_name(n, func_name, "'function"); emit_inline(n, func_name); Printf(f_cl, "\n(cffi:defcfun (\"%s\" %s)", name, func_name); String *ffitype = Swig_typemap_lookup("cout", n, ":pointer", 0); Printf(f_cl, " %s", ffitype); Delete(ffitype); for (Parm *p = pl; p; p = nextSibling(p), argnum++) { if (SwigType_isvarargs(Getattr(p, "type"))) { Printf(f_cl, "\n %s", NewString("&rest")); continue; } String *argname = Getattr(p, "name"); ffitype = Swig_typemap_lookup("cin", p, "", 0); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } else if (Strcmp(argname, "t") == 0 || Strcmp(argname, "T") == 0) { argname = NewStringf("t_arg%d", argnum); tempargname = 1; } Printf(f_cl, "\n (%s %s)", argname, ffitype); Delete(ffitype); if (tempargname) Delete(argname); } Printf(f_cl, ")\n"); /* finish arg list */ emit_export(n, func_name); } int CFFI::constantWrapper(Node *n) { String *type = Getattr(n, "type"); String *converted_value; if (SwigType_type(type) == T_STRING) { converted_value = NewString(Getattr(n, "rawval")); } else { converted_value = convert_literal(Getattr(n, "value"), type); } String *name = lispify_name(n, Getattr(n, "sym:name"), "'constant"); if (Strcmp(name, "t") == 0 || Strcmp(name, "T") == 0) name = NewStringf("t_var"); Printf(f_cl, "\n(cl:defconstant %s %s)\n", name, converted_value); Delete(converted_value); emit_export(n, name); return SWIG_OK; } int CFFI::variableWrapper(Node *n) { String *var_name = Getattr(n, "sym:name"); String *lisp_type = Swig_typemap_lookup("cin", n, "", 0); String *lisp_name = lispify_name(n, var_name, "'variable"); if (Strcmp(lisp_name, "t") == 0 || Strcmp(lisp_name, "T") == 0) lisp_name = NewStringf("t_var"); Printf(f_cl, "\n(cffi:defcvar (\"%s\" %s)\n %s)\n", var_name, lisp_name, lisp_type); Delete(lisp_type); emit_export(n, lisp_name); return SWIG_OK; } int CFFI::typedefHandler(Node *n) { if (generate_typedef_flag && strncmp(Char(Getattr(n, "type")), "enum", 4)) { String *lisp_name = lispify_name(n, Getattr(n, "name"), "'typename"); Printf(f_cl, "\n(cffi:defctype %s %s)\n", lisp_name, Swig_typemap_lookup("cin", n, "", 0)); emit_export(n, lisp_name); } return Language::typedefHandler(n); } int CFFI::enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *name = Getattr(n, "sym:name"); bool slot_name_keywords; String *lisp_name = 0; if (name && Len(name) != 0) { lisp_name = lispify_name(n, name, "'enumname"); if (GetFlag(n, "feature:bitfield")) { Printf(f_cl, "\n(cffi:defbitfield %s", lisp_name); } else { Printf(f_cl, "\n(cffi:defcenum %s", lisp_name); } slot_name_keywords = true; //Registering the enum name to the cin and cout typemaps Parm *pattern = NewParm(name, NULL, n); Swig_typemap_register("cin", pattern, lisp_name, NULL, NULL); Swig_typemap_register("cout", pattern, lisp_name, NULL, NULL); Delete(pattern); //Registering with the kind, i.e., enum pattern = NewParm(NewStringf("enum %s", name), NULL, n); Swig_typemap_register("cin", pattern, lisp_name, NULL, NULL); Swig_typemap_register("cout", pattern, lisp_name, NULL, NULL); Delete(pattern); } else { Printf(f_cl, "\n(defanonenum %s", name); slot_name_keywords = false; } for (Node *c = firstChild(n); c; c = nextSibling(c)) { String *slot_name = lispify_name(c, Getattr(c, "name"), "'enumvalue", slot_name_keywords); String *value = Getattr(c, "enumvalue"); if (!value || GetFlag(n, "feature:bitfield:ignore_values")) Printf(f_cl, "\n\t%s", slot_name); else { String *type = Getattr(c, "type"); String *converted_value = convert_literal(value, type); Printf(f_cl, "\n\t(%s #.%s)", slot_name, converted_value); Delete(converted_value); } Delete(value); } Printf(f_cl, ")\n"); // No need to export keywords if (lisp_name && Len(lisp_name) != 0) { emit_export(n, lisp_name); } else { for (Node *c = firstChild(n); c; c = nextSibling(c)) emit_export(c, lispify_name(c, Getattr(c, "name"), "'enumvalue")); } return SWIG_OK; } void CFFI::emit_class(Node *n) { #ifdef CFFI_WRAP_DEBUG Printf(stderr, "emit_class: ENTER... '%s'(%p)\n", Getattr(n, "sym:name"), n); #endif String *name = Getattr(n, "sym:name"); String *lisp_name = lispify_name(n, lispy_name(Char(name)), "'classname"); String *bases = Getattr(n, "bases"); String *supers = NewString("("); if (bases) { int first = 1; for (Iterator i = First(bases); i.item; i = Next(i)) { if (!first) Printf(supers, " "); String *s = Getattr(i.item, "name"); Printf(supers, "%s", lispify_name(i.item, lispy_name(Char(s)), "'classname")); } } else { // Printf(supers,"ff:foreign-pointer"); } Printf(supers, ")"); Printf(f_clos, "\n(cl:defclass %s%s", lisp_name, supers); Printf(f_clos, "\n ((ff-pointer :reader ff-pointer)))\n\n"); Parm *pattern = NewParm(Getattr(n, "name"), NULL, n); Swig_typemap_register("lispclass", pattern, lisp_name, NULL, NULL); SwigType_add_pointer(Getattr(pattern, "type")); Swig_typemap_register("lispclass", pattern, lisp_name, NULL, NULL); SwigType_add_qualifier(Getattr(pattern, "type"), "const"); Swig_typemap_register("lispclass", pattern, lisp_name, NULL, NULL); SwigType_del_pointer(Getattr(pattern, "type")); SwigType_add_reference(Getattr(pattern, "type")); Swig_typemap_register("lispclass", pattern, lisp_name, NULL, NULL); #ifdef CFFI_WRAP_DEBUG Printf(stderr, " pattern %s name %s .. ... %s .\n", pattern, lisp_name); #endif Delete(pattern); // Walk children to generate type definition. String *slotdefs = NewString(" "); #ifdef CFFI_WRAP_DEBUG Printf(stderr, " walking children...\n"); #endif Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { String *storage_type = Getattr(c, "storage"); if ((!Strcmp(nodeType(c), "cdecl") && (!storage_type || Strcmp(storage_type, "typedef")))) { String *access = Getattr(c, "access"); // hack. why would decl have a value of "variableHandler" and now "0"? String *childDecl = Getattr(c, "decl"); // Printf(stderr,"childDecl = '%s' (%s)\n", childDecl, Getattr(c,"view")); if (!Strcmp(childDecl, "0")) childDecl = NewString(""); SwigType *childType = NewStringf("%s%s", childDecl, Getattr(c, "type")); String *cname = (access && Strcmp(access, "public")) ? NewString("nil") : Copy(Getattr(c, "name")); if (!SwigType_isfunction(childType)) { // Printf(slotdefs, ";;; member functions don't appear as slots.\n "); // Printf(slotdefs, ";; "); // String *ns = listify_namespace(Getattr(n, "cffi:package")); String *ns = NewString(""); #ifdef CFFI_WRAP_DEBUG Printf(stderr, "slot name = '%s' ns = '%s' class-of '%s' and type = '%s'\n", cname, ns, name, childType); #endif Printf(slotdefs, "(#.(swig-insert-id \"%s\" %s :type :slot :class \"%s\") %s)", cname, ns, name, childType); //compose_foreign_type(childType) Delete(ns); if (access && Strcmp(access, "public")) Printf(slotdefs, " ;; %s member", access); Printf(slotdefs, "\n "); } Delete(childType); Delete(cname); } } // String *ns_list = listify_namespace(Getattr(n,"cffi:namespace")); // update_package_if_needed(n,f_clhead); // Printf(f_clos, // "(swig-def-foreign-class \"%s\"\n %s\n (:%s\n%s))\n\n", // name, supers, kind, slotdefs); Delete(supers); // Delete(ns_list); // Parm *pattern = NewParm(name, NULL, n); // Swig_typemap_register("cin",pattern,lisp_name,NULL,NULL); //Swig_typemap_register("cout",pattern,lisp_name,NULL,NULL); //Delete(pattern); #ifdef CFFI_WRAP_DEBUG Printf(stderr, "emit_class: EXIT\n"); #endif } // Includes structs void CFFI::emit_struct_union(Node *n, bool un = false) { #ifdef CFFI_DEBUG Printf(stderr, "struct/union %s\n", Getattr(n, "name")); Printf(stderr, "struct/union %s\n and %s", Getattr(n, "kind"), Getattr(n, "sym:name")); #endif String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); if (Strcmp(kind, "struct") != 0 && Strcmp(kind, "union") != 0) { Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); Printf(stderr, " (name: %s)\n", name); SWIG_exit(EXIT_FAILURE); } String *lisp_name = lispify_name(n, name, "'classname"); //Register the struct/union name to the cin and cout typemaps Parm *pattern = NewParm(name, NULL, n); Swig_typemap_register("cin", pattern, lisp_name, NULL, NULL); Swig_typemap_register("cout", pattern, lisp_name, NULL, NULL); Delete(pattern); //Registering with the kind, i.e., struct or union pattern = NewParm(NewStringf("%s %s", kind, name), NULL, n); Swig_typemap_register("cin", pattern, lisp_name, NULL, NULL); Swig_typemap_register("cout", pattern, lisp_name, NULL, NULL); Delete(pattern); if (un) { Printf(f_cl, "\n(cffi:defcunion %s", lisp_name); } else Printf(f_cl, "\n(cffi:defcstruct %s", lisp_name); for (Node *c = firstChild(n); c; c = nextSibling(c)) { #ifdef CFFI_DEBUG Printf(stderr, "struct/union %s\n", Getattr(c, "name")); Printf(stderr, "struct/union %s and %s \n", Getattr(c, "kind"), Getattr(c, "sym:name")); #endif if (Strcmp(nodeType(c), "cdecl")) { //C declaration ignore // Printf(stderr, "Structure %s has a slot that we can't deal with.\n", // name); // Printf(stderr, "nodeType: %s, name: %s, type: %s\n", // nodeType(c), // Getattr(c, "name"), // Getattr(c, "type")); // SWIG_exit(EXIT_FAILURE); } else { SwigType *childType = NewStringf("%s%s", Getattr(c, "decl"), Getattr(c, "type")); Node *node = NewHash(); Setattr(node, "type", childType); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("cin", node, "", 0); String *typespec = tm ? NewString(tm) : NewString(""); String *slot_name = lispify_name(c, Getattr(c, "sym:name"), "'slotname"); if (slot_name && (Strcmp(slot_name, "t") == 0 || Strcmp(slot_name, "T") == 0)) slot_name = NewStringf("t_var"); if (SwigType_isarray(childType) && SwigType_array_ndim(childType) == 1) { String *dim = SwigType_array_getdim(childType, 0); Printf(f_cl, "\n\t(%s %s :count %s)", slot_name, typespec, dim); Delete(dim); } else Printf(f_cl, "\n\t(%s %s)", slot_name, typespec); Delete(node); Delete(childType); Delete(typespec); } } Printf(f_cl, ")\n"); emit_export(n, lisp_name); for (Node *child = firstChild(n); child; child = nextSibling(child)) { if (!Strcmp(nodeType(child), "cdecl")) { emit_export(child, lispify_name(child, Getattr(child, "sym:name"), "'slotname")); } } /* Add this structure to the known lisp types */ //Printf(stdout, "Adding %s foreign type\n", name); // add_defined_foreign_type(name); } void CFFI::emit_export(Node *n, String *name) { if (GetInt(n, "feature:export")) { String* package = Getattr(n, "feature:export:package"); Printf(f_cl, "\n(cl:export '%s%s%s)\n", name, package ? " " : "", package ? package : ""); } } void CFFI::emit_inline(Node *n, String *name) { if (GetInt(n, "feature:inline")) Printf(f_cl, "\n(cl:declaim (cl:inline %s))\n", name); } String *CFFI::lispify_name(Node *n, String *ty, const char *flag, bool kw) { String *intern_func = Getattr(n, "feature:intern_function"); if (intern_func) { if (Strcmp(intern_func, "1") == 0) intern_func = NewStringf("swig-lispify"); return NewStringf("#.(%s \"%s\" %s%s)", intern_func, ty, flag, kw ? " :keyword" : ""); } else if (kw) return NewStringf(":%s", ty); else return ty; } /* utilities */ /* returns new string w/ parens stripped */ String *CFFI::strip_parens(String *string) { char *s = Char(string), *p; int len = Len(string); String *res; if (len == 0 || s[0] != '(' || s[len - 1] != ')') { return NewString(string); } p = (char *) malloc(len - 2 + 1); if (!p) { Printf(stderr, "Malloc failed\n"); SWIG_exit(EXIT_FAILURE); } strncpy(p, s + 1, len - 1); p[len - 2] = 0; /* null terminate */ res = NewString(p); free(p); return res; } String *CFFI::trim(String *str) { char *c = Char(str); while (*c != '\0' && isspace((int) *c)) ++c; String *result = NewString(c); Chop(result); return result; } String *CFFI::infix_to_prefix(String *val, char split_op, const String *op, String *type) { List *ored = Split(val, split_op, -1); // some float hackery //i don't understand it, if you do then please explain // if ( ((split_op == '+') || (split_op == '-')) && Len(ored) == 2 && // (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || // SwigType_type(type) == T_LONGDOUBLE) ) { // // check that we're not splitting a float // String *possible_result = convert_literal(val, type, false); // if (possible_result) return possible_result; // } // try parsing the split results. if any part fails, kick out. bool part_failed = false; if (Len(ored) > 1) { String *result = NewStringf("(%s", op); for (Iterator i = First(ored); i.item; i = Next(i)) { String *converted = convert_literal(i.item, type); if (converted) { Printf(result, " %s", converted); Delete(converted); } else { part_failed = true; break; } } Printf(result, ")"); Delete(ored); return part_failed ? 0 : result; } else { Delete(ored); } return 0; } /* To be called by code generating the lisp interface Will return a String containing the literal based on type. Will return null if there are problems. try_to_split defaults to true (see stub above). */ String *CFFI::convert_literal(String *literal, String *type, bool try_to_split) { String *num_param = Copy(literal); String *trimmed = trim(num_param); String *num = strip_parens(trimmed), *res = 0; Delete(trimmed); char *s = Char(num); // very basic parsing of infix expressions. if (try_to_split) { if ((res = infix_to_prefix(num, '|', "cl:logior", type))) return res; if ((res = infix_to_prefix(num, '&', "cl:logand", type))) return res; if ((res = infix_to_prefix(num, '^', "cl:logxor", type))) return res; if ((res = infix_to_prefix(num, '*', "cl:*", type))) return res; if ((res = infix_to_prefix(num, '/', "cl:/", type))) return res; if ((res = infix_to_prefix(num, '+', "cl:+", type))) return res; if ((res = infix_to_prefix(num, '-', "cl:-", type))) return res; } if (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || SwigType_type(type) == T_LONGDOUBLE) { // Use CL syntax for float literals // careful. may be a float identifier or float constant. char *num_start = Char(num); char *num_end = num_start + strlen(num_start) - 1; bool is_literal = isdigit(*num_start) || (*num_start == '.') || (*num_start == '+') || (*num_start == '-'); String *lisp_exp = 0; if (is_literal) { if (*num_end == 'f' || *num_end == 'F') { lisp_exp = NewString("f"); } else { lisp_exp = NewString("d"); } if (*num_end == 'l' || *num_end == 'L' || *num_end == 'f' || *num_end == 'F') { *num_end = '\0'; num_end--; } int exponents = Replaceall(num, "e", lisp_exp) + Replaceall(num, "E", lisp_exp); if (!exponents) Printf(num, "%s0", lisp_exp); if (exponents > 1 || (exponents + Replaceall(num, ".", ".") == 0)) { Delete(num); num = 0; } } return num; } else if (SwigType_type(type) == T_CHAR) { /* Use CL syntax for character literals */ String* result = NewStringf("#\\%s", s); Delete(num); return result; } else if (SwigType_type(type) == T_STRING) { /* Use CL syntax for string literals */ String* result = NewStringf("\"%s\"", num_param); Delete(num); return result; } else if (SwigType_type(type) == T_INT || SwigType_type(type) == T_UINT) { // Printf(stderr, "Is a T_INT or T_UINT %s, before replaceall\n", s); const char *num_start = Char(num); bool is_literal = isdigit(*num_start) || (*num_start == '.') || (*num_start == '+') || (*num_start == '-'); if (is_literal) { Replaceall(num, "u", ""); Replaceall(num, "U", ""); Replaceall(num, "l", ""); Replaceall(num, "L", ""); } int i, j; if (sscanf(s, "%d >> %d", &i, &j) == 2) { String* result = NewStringf("(cl:ash %d -%d)", i, j); Delete(num); return result; } else if (sscanf(s, "%d << %d", &i, &j) == 2) { String* result = NewStringf("(cl:ash %d %d)", i, j); Delete(num); return result; } } if (Len(num) >= 2 && s[0] == '0') { /* octal or hex */ if (s[1] == 'x'){ Replace(num,"0","#",DOH_REPLACE_FIRST); } else{ Replace(num,"0","#o",DOH_REPLACE_FIRST); } } return num; } //less flexible as it does the conversion in C, the lispify name does the conversion in lisp String *CFFI::lispy_name(char *name) { bool helper = false; String *new_name = NewString(""); for (unsigned int i = 0; i < strlen(name); i++) { if (name[i] == '_' || name[i] == '-') { Printf(new_name, "%c", '-'); helper = false; } else if (name[i] >= 'A' && name[i] <= 'Z') { if (helper) Printf(new_name, "%c", '-'); Printf(new_name, "%c", ('a' + (name[i] - 'A'))); helper = false; } else { helper = true; Printf(new_name, "%c", name[i]); } } return new_name; } extern "C" Language *swig_cffi(void) { return new CFFI(); } swig-4.0.2/Source/Modules/modula3.cxx0000644000175000017500000040426213667507523017332 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * modula3.cxx * * Modula3 language module for SWIG. * ----------------------------------------------------------------------------- */ /* Text formatted with indent -sob -br -ce -nut -npsl */ /* Report: - It's not a good concept to use member variables or global variables for passing parameters to functions. It's not a good concept to use functions of superclasses for specific services. E.g. For SWIG this means: Generating accessor functions for member variables is the most common but no general task to be processed in membervariableHandler. Better provide a service function which generates accessor function code and equip this service function with all parameters needed for input (parse node) and output (generated code). - How can I make globalvariableHandler not to generate interface functions to two accessor functions (that don't exist) ? - How can I generate a typemap that turns every C reference argument into its Modula 3 counterpart, that is void test(Complex &z); PROCEDURE test(VAR z:Complex); - neither $*n_mangle nor $*n_type nor $*n_ltype return the type without pointer converted to Modula3 equivalent, $*n_mangle is the variant closest to what I expect - using a typemap like typemap(m3wrapintype) int * %{VAR $1_name: INTEGER%} has the advantages: - one C parameter can be turned into multiple M3 parameters - the argument can be renamed - using typemaps like typemap(m3wrapinmode) int * "VAR" typemap(m3wrapintype) int * "INTEGER" has the advantages: - multiple parameters with same type and default value can be bundled - more conform to the other language modules - Where takes the reduction of multi-typemaps place? How can I preserve all parameters for functions of the intermediary class? The answer is Getattrs(n,"tmap:m3rawintype:next") - Char() can be used to transform a String to (char *) which can be used for output with printf - What is the while (checkAttribute()) loop in functionWrapper good for? Appearently for skipping (numinputs=0) typemaps. - SWIGTYPE const * - typemap is ignored, whereas SWIGTYPE * - typemap is invoked, why? Had it been (const SWIGTYPE *) instead? - enumeration items should definitely be equipped with its plain numerical value One could add tag 'numvalue' in CParse/parser.y, but it is still possible that someone declares an enumeration using a symbolic constant. I have quickly hacked that the successive number is assigned if "enumvalue" has suffix "+1". The ultimate solution would be to generate a C program which includes the header and outputs all constants. This program might be compiled and run by 'make' or by SWIG and the resulting output is fed back to SWIG. - It's a bad idea to interpret feature value "" 'disable feature' because the value "" might be sensible in case of feature:modula3:oldprefix. - What's the difference between "sym:name" and "name" ? "name" is the original name and "sym:name" is probably modified by the user using %rename - Is it possible for 'configure' to find out if m3pp is installed and to invoke it for generated Modula3 files? - It would be better to separate an arguments purpose and its name, because an output variable with name "OUTPUT" is not very descriptive. In case of PLPlot this could be solved by typedefs that assign special purposes to the array types. - Can one interpret $n_basetype as the identifier matched with SWIGTYPE ? SWIG's odds: - arguments of type (Node *) for SWIG functions should be most often better (const Node *): Swig_symbol_qualified, Getattr, nodeType, parentNode - unique identifier style instead of NewString, Getattr, firstChild - 'class'.name is qualified, 'enum'.name and 'enumitem'.name is not - Swig_symbol_qualified() returns NIL for enumeration nodes - Is there a function that creates a C representation of a SWIG type string? ToDo: - create WeakRefs only for resources returned by function marked with %newobject -> part of output conversion - clean typemap conception - should a multi-typemap for m3wrapouttype skip the corresponding input parameters? when yes - How to handle inout-arguments? In this case like in-argument. - C++ classes - C++ exceptions - allow for moving RECORD and OBJECT definitions to separate files, with the main type called T - call-back functions - special option: fast access to class members by pointer arithmetic, member offsets can be determined by a C++ program that print them. - emit enumeration definitions when its first item is declared, currently enumerations are emitted at the beginning of the file Done: - addThrow should convert the typemap by itself - not possible because routine for attaching mapped types to parameter nodes won't work for the function node - turning error codes into exceptions -> part of output value checking - create WeakRefs for resources allocated by the library -> part of output conversion - TRY..FINALLY..END; can be omitted - if there is no m3wrapfreearg - no exception can be raised in the body (empty RAISES) list */ #include "swigmod.h" #include // for INT_MAX #include #define USAGE_ARG_DIR "m3wrapargdir typemap expect values: in, out, inout\n" class MODULA3:public Language { public: enum block_type { no_block, constant, variable, blocktype, revelation }; private: struct M3File { String *f; Hash *import; block_type bt; /* VC++ 6 doesn't allow the access to 'no_block' if it is a private member of MODULA3 class */ M3File():f(NewString("")), import(NewHash()), bt(no_block) { } ~M3File() { Delete(f); Delete(import); } /* ----------------------------------------------------------------------------- * enterBlock() * * Make sure that a given declaration is written to the right declaration block, * that is constants are written after "CONST" and so on ... * ----------------------------------------------------------------------------- */ void enterBlock(block_type newbt) { static const char *ident[] = { "", "\nCONST\n", "\nVAR\n", "\nTYPE\n", "\nREVEAL\n" }; #ifdef DEBUG if ((bt < 0) || (4 < bt)) { printf("bt %d out of range\n", bt); } #endif if (newbt != bt) { Append(f, ident[newbt]); bt = newbt; } } }; static const char *usage; const String *empty_string; Hash *swig_types_hash; File *f_begin; File *f_runtime; File *f_header; File *f_wrappers; File *f_init; bool proxy_flag; // Flag for generating proxy classes bool have_default_constructor_flag; bool native_function_flag; // Flag for when wrapping a native function bool enum_constant_flag; // Flag for when wrapping an enum or constant bool static_flag; // Flag for when wrapping a static functions or member variables bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable bool wrapping_member_flag; // Flag for when wrapping a member variable/enum/const bool global_variable_flag; // Flag for when wrapping a global variable bool old_variable_names; // Flag for old style variable names in the intermediary class bool unsafe_module; String *m3raw_name; // raw interface name M3File m3raw_intf; // raw interface M3File m3raw_impl; // raw implementation (usually empty) String *m3wrap_name; // wrapper module M3File m3wrap_intf; M3File m3wrap_impl; String *m3makefile; String *targetlibrary; String *proxy_class_def; String *proxy_class_code; String *proxy_class_name; String *variable_name; //Name of a variable being wrapped String *variable_type; //Type of this variable Hash *enumeration_coll; //Collection of all enumerations. /* The items are nodes with members: "items" - hash of with key 'itemname' and content 'itemvalue' "max" - maximum value in item list */ String *constant_values; String *constantfilename; String *renamefilename; String *typemapfilename; String *m3raw_imports; //intermediary class imports from %pragma String *module_imports; //module imports from %pragma String *m3raw_baseclass; //inheritance for intermediary class class from %pragma String *module_baseclass; //inheritance for module class from %pragma String *m3raw_interfaces; //interfaces for intermediary class class from %pragma String *module_interfaces; //interfaces for module class from %pragma String *m3raw_class_modifiers; //class modifiers for intermediary class overridden by %pragma String *m3wrap_modifiers; //class modifiers for module class overridden by %pragma String *upcasts_code; //C++ casts for inheritance hierarchies C++ code String *m3raw_cppcasts_code; //C++ casts up inheritance hierarchies intermediary class code String *destructor_call; //C++ destructor call if any String *outfile; enum type_additions { none, pointer, reference }; public: /* ----------------------------------------------------------------------------- * MODULA3() * ----------------------------------------------------------------------------- */ MODULA3(): empty_string(NewString("")), swig_types_hash(NULL), f_begin(NULL), f_runtime(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), proxy_flag(true), have_default_constructor_flag(false), native_function_flag(false), enum_constant_flag(false), static_flag(false), variable_wrapper_flag(false), wrapping_member_flag(false), global_variable_flag(false), old_variable_names(false), unsafe_module(false), m3raw_name(NULL), m3raw_intf(), m3raw_impl(), m3wrap_name(NULL), m3wrap_intf(), m3wrap_impl(), m3makefile(NULL), targetlibrary(NULL), proxy_class_def(NULL), proxy_class_code(NULL), proxy_class_name(NULL), variable_name(NULL), variable_type(NULL), enumeration_coll(NULL), constant_values(NULL), constantfilename(NULL), renamefilename(NULL), typemapfilename(NULL), m3raw_imports(NULL), module_imports(NULL), m3raw_baseclass(NULL), module_baseclass(NULL), m3raw_interfaces(NULL), module_interfaces(NULL), m3raw_class_modifiers(NULL), m3wrap_modifiers(NULL), upcasts_code(NULL), m3raw_cppcasts_code(NULL), destructor_call(NULL), outfile(NULL) { } /************** some utility functions ***************/ /* ----------------------------------------------------------------------------- * getMappedType() * * Return the type of 'p' mapped by 'map'. * Print a standard warning if 'p' can't be mapped. * ----------------------------------------------------------------------------- */ String *getMappedType(Node *p, const char *map) { String *mapattr = NewString("tmap:"); Append(mapattr, map); String *tm = Getattr(p, mapattr); if (tm == NIL) { Swig_warning(WARN_MODULA3_TYPEMAP_TYPE_UNDEF, input_file, line_number, "No '%s' typemap defined for type '%s'\n", map, SwigType_str(Getattr(p, "type"), 0)); } Delete(mapattr); return tm; } /* ----------------------------------------------------------------------------- * getMappedTypeNew() * * Similar to getMappedType but uses Swig_type_lookup_new. * ----------------------------------------------------------------------------- */ String *getMappedTypeNew(Node *n, const char *map, const char *lname = "", bool warn = true) { String *tm = Swig_typemap_lookup(map, n, lname, 0); if ((tm == NIL) && warn) { Swig_warning(WARN_MODULA3_TYPEMAP_TYPE_UNDEF, input_file, line_number, "No '%s' typemap defined for type '%s'\n", map, SwigType_str(Getattr(n, "type"), 0)); } return tm; } /* ----------------------------------------------------------------------------- * attachMappedType() * * Obtain the type mapped by 'map' and attach it to the node * ----------------------------------------------------------------------------- */ void attachMappedType(Node *n, const char *map, const char *lname = "") { String *tm = Swig_typemap_lookup(map, n, lname, 0); if (tm != NIL) { String *attr = NewStringf("tmap:%s", map); Setattr(n, attr, tm); Delete(attr); } } /* ----------------------------------------------------------------------------- * skipIgnored() * * Skip all parameters that have 'numinputs=0' * with respect to a given typemap. * ----------------------------------------------------------------------------- */ Node *skipIgnored(Node *p, const char *map) { String *niattr = NewStringf("tmap:%s:numinputs", map); String *nextattr = NewStringf("tmap:%s:next", map); while ((p != NIL) && checkAttribute(p, niattr, "0")) { p = Getattr(p, nextattr); } Delete(nextattr); Delete(niattr); return p; } /* ----------------------------------------------------------------------------- * isInParam() * isOutParam() * * Check if the parameter is intended for input or for output. * ----------------------------------------------------------------------------- */ bool isInParam(Node *p) { String *dir = Getattr(p, "tmap:m3wrapargdir"); //printf("dir for %s: %s\n", Char(Getattr(p,"name")), Char(dir)); if ((dir == NIL) || (Strcmp(dir, "in") == 0) || (Strcmp(dir, "inout") == 0)) { return true; } else if (Strcmp(dir, "out") == 0) { return false; } else { printf("%s", USAGE_ARG_DIR); return false; } } bool isOutParam(Node *p) { String *dir = Getattr(p, "tmap:m3wrapargdir"); if ((dir == NIL) || (Strcmp(dir, "in") == 0)) { return false; } else if ((Strcmp(dir, "out") == 0) || (Strcmp(dir, "inout") == 0)) { return true; } else { printf("%s", USAGE_ARG_DIR); return false; } } /* ----------------------------------------------------------------------------- * printAttrs() * * For debugging: Show all attributes of a node and their values. * ----------------------------------------------------------------------------- */ void printAttrs(Node *n) { Iterator it; for (it = First(n); it.key != NIL; it = Next(it)) { printf("%s = %s\n", Char(it.key), Char(Getattr(n, it.key))); } } /* ----------------------------------------------------------------------------- * hasPrefix() * * Check if a string have a given prefix. * ----------------------------------------------------------------------------- */ bool hasPrefix(const String *str, const String *prefix) { int len_prefix = Len(prefix); return (Len(str) > len_prefix) && (Strncmp(str, prefix, len_prefix) == 0); } /* ----------------------------------------------------------------------------- * getQualifiedName() * * Return fully qualified identifier of n. * ----------------------------------------------------------------------------- */ #if 0 // Swig_symbol_qualified returns NIL for enumeration nodes String *getQualifiedName(Node *n) { String *qual = Swig_symbol_qualified(n); String *name = Getattr(n, "name"); if (hasContent(qual)) { return NewStringf("%s::%s", qual, name); } else { return name; } } #else String *getQualifiedName(Node *n) { String *name = Copy(Getattr(n, "name")); n = parentNode(n); while (n != NIL) { const String *type = nodeType(n); if ((Strcmp(type, "class") == 0) || (Strcmp(type, "struct") == 0) || (Strcmp(type, "namespace") == 0)) { String *newname = NewStringf("%s::%s", Getattr(n, "name"), name); Delete(name); //name = newname; // Hmpf, the class name is already qualified. return newname; } n = parentNode(n); } //printf("qualified name: %s\n", Char(name)); return name; } #endif /* ----------------------------------------------------------------------------- * nameToModula3() * * Turn usual C identifiers like "this_is_an_identifier" * into usual Modula 3 identifier like "thisIsAnIdentifier" * ----------------------------------------------------------------------------- */ String *nameToModula3(const String *sym, bool leadingCap) { int len_sym = Len(sym); char *csym = Char(sym); char *m3sym = new char[len_sym + 1]; int i, j; bool cap = leadingCap; for (i = 0, j = 0; j < len_sym; j++) { char c = csym[j]; if ((c == '_') || (c == ':')) { cap = true; } else { if (isdigit(c)) { m3sym[i] = c; cap = true; } else { if (cap) { m3sym[i] = (char)toupper(c); } else { m3sym[i] = (char)tolower(c); } cap = false; } i++; } } m3sym[i] = 0; String *result = NewString(m3sym); delete[]m3sym; return result; } /* ----------------------------------------------------------------------------- * capitalizeFirst() * * Make the first character upper case. * ----------------------------------------------------------------------------- */ String *capitalizeFirst(const String *str) { return NewStringf("%c%s", toupper(*Char(str)), Char(str) + 1); } /* ----------------------------------------------------------------------------- * prefixedNameToModula3() * * If feature modula3:oldprefix and modula3:newprefix is present * and the C identifier has leading 'oldprefix' * then it is replaced by the 'newprefix'. * The rest is converted to Modula style. * ----------------------------------------------------------------------------- */ String *prefixedNameToModula3(Node *n, const String *sym, bool leadingCap) { String *oldPrefix = Getattr(n, "feature:modula3:oldprefix"); String *newPrefix = Getattr(n, "feature:modula3:newprefix"); String *result = NewString(""); char *short_sym = Char(sym); // if at least one prefix feature is present // the replacement takes place if ((oldPrefix != NIL) || (newPrefix != NIL)) { if ((oldPrefix == NIL) || hasPrefix(sym, oldPrefix)) { short_sym += Len(oldPrefix); if (newPrefix != NIL) { Append(result, newPrefix); } } } String *suffix = nameToModula3(short_sym, leadingCap || hasContent(newPrefix)); Append(result, suffix); Delete(suffix); return result; } /* ----------------------------------------------------------------------------- * hasContent() * * Check if the string exists and contains something. * ----------------------------------------------------------------------------- */ bool hasContent(const String *str) { return (str != NIL) && (Strcmp(str, "") != 0); } /* ----------------------------------------------------------------------------- * openWriteFile() * * Caution: The file must be freshly allocated and will be destroyed * by this routine. * ----------------------------------------------------------------------------- */ File *openWriteFile(String *name) { File *file = NewFile(name, "w", SWIG_output_files()); if (!file) { FileErrorDisplay(name); SWIG_exit(EXIT_FAILURE); } Delete(name); return file; } /* ----------------------------------------------------------------------------- * aToL() * * like atol but with additional user warning * ----------------------------------------------------------------------------- */ long aToL(const String *value) { char *endptr; long numvalue = strtol(Char(value), &endptr, 0); if (*endptr != 0) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "The string <%s> does not denote a numeric value.\n", value); } return numvalue; } /* ----------------------------------------------------------------------------- * strToL() * * like strtol but returns if the conversion was successful * ----------------------------------------------------------------------------- */ bool strToL(const String *value, long &numvalue) { char *endptr; numvalue = strtol(Char(value), &endptr, 0); return (*endptr == 0); } /* ----------------------------------------------------------------------------- * evalExpr() * * Evaluate simple expression as they may occur in "enumvalue" attributes. * ----------------------------------------------------------------------------- */ bool evalExpr(String *value, long &numvalue) { // Split changes file status of String and thus cannot receive 'const' strings //printf("evaluate <%s>\n", Char(value)); List *summands = Split(value, '+', INT_MAX); Iterator sm = First(summands); numvalue = 0; for (; sm.item != NIL; sm = Next(sm)) { String *smvalue = Getattr(constant_values, sm.item); long smnumvalue; if (smvalue != NIL) { if (!strToL(smvalue, smnumvalue)) { //printf("evaluation: abort 0 <%s>\n", Char(smvalue)); return false; } } else { if (!strToL(sm.item, smnumvalue)) { //printf("evaluation: abort 1 <%s>\n", Char(sm)); return false; } } numvalue += smnumvalue; } //printf("evaluation: return %ld\n", numvalue); return true; } /* ----------------------------------------------------------------------------- * log2() * * Determine the position of the single bit of a power of two. * Returns true if the given number is a power of two. * ----------------------------------------------------------------------------- */ bool log2(long n, long &exp) { exp = 0; while (n > 0) { if ((n & 1) != 0) { return n == 1; } exp++; n >>= 1; } return false; } /* ----------------------------------------------------------------------------- * writeArg * * Write a function argument or RECORD entry definition. * Bundles arguments of same type and default value. * 'name.next==NIL' denotes the end of the entry or argument list. * ----------------------------------------------------------------------------- */ bool equalNilStr(const String *str0, const String *str1) { if (str0 == NIL) { return (str1 == NIL); //return (str0==NIL) == (str1==NIL); } else { return (str1 != NIL) && (Cmp(str0, str1) == 0); //return Cmp(str0,str1)==0; } } struct writeArgState { String *mode, *name, *type, *value; bool hold; writeArgState():mode(NIL), name(NIL), type(NIL), value(NIL), hold(false) { } }; void writeArg(File *f, writeArgState & state, String *mode, String *name, String *type, String *value) { /* skip the first argument, only store the information for the next call in this case */ if (state.name != NIL) { if ((!state.hold) && (state.mode != NIL)) { Printf(f, "%s ", state.mode); } if ((name != NIL) && equalNilStr(state.mode, mode) && equalNilStr(state.type, type) && (state.value == NIL) && (value == NIL) /* the same expression may have different values due to side effects of the called function */ /*equalNilStr(state.value,value) */ ) { Printf(f, "%s, ", state.name); state.hold = true; } else { Append(f, state.name); if (state.type != NIL) { Printf(f, ": %s", state.type); } if (state.value != NIL) { Printf(f, ":= %s", state.value); } Append(f, ";\n"); state.hold = false; } } /* at the next call the current argument will be the previous one */ state.mode = mode; state.name = name; state.type = type; state.value = value; } /* ----------------------------------------------------------------------------- * getProxyName() * * Test to see if a type corresponds to something wrapped with a proxy class * Return NULL if not otherwise the proxy class name * ----------------------------------------------------------------------------- */ String *getProxyName(SwigType *t) { if (proxy_flag) { Node *n = classLookup(t); if (n) { return Getattr(n, "sym:name"); } } return NULL; } /*************** language processing ********************/ /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("modula3"); // Look for certain command line options for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-generateconst") == 0) { if (argv[i + 1]) { constantfilename = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-generaterename") == 0) { if (argv[i + 1]) { renamefilename = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-generatetypemap") == 0) { if (argv[i + 1]) { typemapfilename = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-noproxy") == 0) { Swig_mark_arg(i); proxy_flag = false; } else if (strcmp(argv[i], "-oldvarnames") == 0) { Swig_mark_arg(i); old_variable_names = true; } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGMODULA3 1", 0); // Add typemap definitions SWIG_typemap_lang("modula3"); SWIG_config_file("modula3.swg"); allow_overloading(); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { if (hasContent(constantfilename) || hasContent(renamefilename) || hasContent(typemapfilename)) { int result = SWIG_OK; if (hasContent(constantfilename)) { result = generateConstantTop(n) && result; } if (hasContent(renamefilename)) { result = generateRenameTop(n) && result; } if (hasContent(typemapfilename)) { result = generateTypemapTop(n) && result; } return result; } else { return generateM3Top(n); } } void scanConstant(File *file, Node *n) { Node *child = firstChild(n); while (child != NIL) { String *constname = NIL; String *type = nodeType(child); if ((Strcmp(type, "enumitem") == 0) || (Strcmp(type, "constant") == 0)) { #if 1 constname = getQualifiedName(child); #else constname = Getattr(child, "value"); if ((!hasContent(constname)) || (('0' <= *Char(constname)) && (*Char(constname) <= '9'))) { constname = Getattr(child, "name"); } #endif } if (constname != NIL) { Printf(file, " printf(\"%%%%constnumeric(%%Lg) %s;\\n\", (long double)%s);\n", constname, constname); } scanConstant(file, child); child = nextSibling(child); } } int generateConstantTop(Node *n) { File *file = openWriteFile(NewStringf("%s.c", constantfilename)); if (CPlusPlus) { Printf(file, "#include \n"); } else { Printf(file, "#include \n"); } Printf(file, "#include \"%s\"\n", input_file); Printf(file, "\n"); Printf(file, "int main (int argc, char *argv[]) {\n"); Printf(file, "\ /*This program must work for floating point numbers and integers.\n\ Thus all numbers are converted to double precision floating point format.*/\n"); scanConstant(file, n); Printf(file, " return 0;\n"); Printf(file, "}\n"); Delete(file); return SWIG_OK; } void scanRename(File *file, Node *n) { Node *child = firstChild(n); while (child != NIL) { String *type = nodeType(child); if (Strcmp(type, "cdecl") == 0) { ParmList *p = Getattr(child, "parms"); if (p != NIL) { String *name = getQualifiedName(child); String *m3name = nameToModula3(name, true); /*don't know how to get the original C type identifiers */ //String *arguments = createCSignature (child); Printf(file, "%%rename(\"%s\") %s;\n", m3name, name); /*Printf(file, "%%rename(\"%s\") %s %s(%s);\n", m3name, Getattr(n,"type"), name, arguments); */ Delete(name); Delete(m3name); //Delete (arguments); } } scanRename(file, child); child = nextSibling(child); } } int generateRenameTop(Node *n) { File *file = openWriteFile(NewStringf("%s.i", renamefilename)); Printf(file, "\ /* This file was generated from %s\n\ by SWIG with option -generaterename. */\n\ \n", input_file); scanRename(file, n); Delete(file); return SWIG_OK; } void scanTypemap(File *file, Node *n) { Node *child = firstChild(n); while (child != NIL) { String *type = nodeType(child); //printf("nodetype %s\n", Char(type)); String *storage = Getattr(child, "storage"); if ((Strcmp(type, "class") == 0) || ((Strcmp(type, "cdecl") == 0) && (storage != NIL) && (Strcmp(storage, "typedef") == 0))) { String *name = getQualifiedName(child); String *m3name = nameToModula3(name, true); Printf(file, "%%typemap(\"m3wrapintype\") %s %%{%s%%}\n", name, m3name); Printf(file, "%%typemap(\"m3rawintype\") %s %%{%s%%}\n", name, m3name); Printf(file, "\n"); } scanTypemap(file, child); child = nextSibling(child); } } int generateTypemapTop(Node *n) { File *file = openWriteFile(NewStringf("%s.i", typemapfilename)); Printf(file, "\ /* This file was generated from %s\n\ by SWIG with option -generatetypemap. */\n\ \n", input_file); scanTypemap(file, n); Delete(file); return SWIG_OK; } int generateM3Top(Node *n) { /* Initialize all of the output files */ outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); m3makefile = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("m3rawintf", m3raw_intf.f); Swig_register_filebyname("m3rawimpl", m3raw_impl.f); Swig_register_filebyname("m3wrapintf", m3wrap_intf.f); Swig_register_filebyname("m3wrapimpl", m3wrap_impl.f); Swig_register_filebyname("m3makefile", m3makefile); swig_types_hash = NewHash(); String *name = Getattr(n, "name"); // Make the intermediary class and module class names. The intermediary class name can be set in the module directive. Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode != NIL) { String *m3raw_name_tmp = Getattr(optionsnode, "m3rawname"); if (m3raw_name_tmp != NIL) { m3raw_name = Copy(m3raw_name_tmp); } } if (m3raw_name == NIL) { m3raw_name = NewStringf("%sRaw", name); } Setattr(m3wrap_impl.import, m3raw_name, ""); m3wrap_name = Copy(name); proxy_class_def = NewString(""); proxy_class_code = NewString(""); m3raw_baseclass = NewString(""); m3raw_interfaces = NewString(""); m3raw_class_modifiers = NewString(""); // package access only to the intermediary class by default m3raw_imports = NewString(""); m3raw_cppcasts_code = NewString(""); m3wrap_modifiers = NewString("public"); module_baseclass = NewString(""); module_interfaces = NewString(""); module_imports = NewString(""); upcasts_code = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGMODULA3\n#define SWIGMODULA3\n#endif\n\n"); Swig_name_register("wrapper", "Modula3_%f"); if (old_variable_names) { Swig_name_register("set", "set_%n%v"); Swig_name_register("get", "get_%n%v"); } Printf(f_wrappers, "\n#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); constant_values = NewHash(); scanForConstPragmas(n); enumeration_coll = NewHash(); collectEnumerations(enumeration_coll, n); /* Emit code */ Language::top(n); // Generate m3makefile // This will be unnecessary if SWIG is invoked from Quake. { File *file = openWriteFile(NewStringf("%sm3makefile", SWIG_output_directory())); Printf(file, "%% automatically generated quake file for %s\n\n", name); /* Write the fragments written by '%insert' collected while 'top' processed the parse tree */ Printv(file, m3makefile, NIL); Printf(file, "import(\"libm3\")\n"); //Printf(file, "import_lib(\"%s\",\"/usr/lib\")\n", name); Printf(file, "module(\"%s\")\n", m3raw_name); Printf(file, "module(\"%s\")\n\n", m3wrap_name); if (targetlibrary != NIL) { Printf(file, "library(\"%s\")\n", targetlibrary); } else { Printf(file, "library(\"m3%s\")\n", name); } Delete(file); } // Generate the raw interface { File *file = openWriteFile(NewStringf("%s%s.i3", SWIG_output_directory(), m3raw_name)); emitBanner(file); Printf(file, "INTERFACE %s;\n\n", m3raw_name); emitImportStatements(m3raw_intf.import, file); Printf(file, "\n"); // Write the interface generated within 'top' Printv(file, m3raw_intf.f, NIL); Printf(file, "\nEND %s.\n", m3raw_name); Delete(file); } // Generate the raw module { File *file = openWriteFile(NewStringf("%s%s.m3", SWIG_output_directory(), m3raw_name)); emitBanner(file); Printf(file, "MODULE %s;\n\n", m3raw_name); emitImportStatements(m3raw_impl.import, file); Printf(file, "\n"); // will be empty usually Printv(file, m3raw_impl.f, NIL); Printf(file, "BEGIN\nEND %s.\n", m3raw_name); Delete(file); } // Generate the interface for the comfort wrappers { File *file = openWriteFile(NewStringf("%s%s.i3", SWIG_output_directory(), m3wrap_name)); emitBanner(file); Printf(file, "INTERFACE %s;\n", m3wrap_name); emitImportStatements(m3wrap_intf.import, file); Printf(file, "\n"); { Iterator it = First(enumeration_coll); if (it.key != NIL) { Printf(file, "TYPE\n"); } for (; it.key != NIL; it = Next(it)) { Printf(file, "\n"); emitEnumeration(file, it.key, it.item); } } // Add the wrapper methods Printv(file, m3wrap_intf.f, NIL); // Finish off the class Printf(file, "\nEND %s.\n", m3wrap_name); Delete(file); } // Generate the wrapper routines implemented in Modula 3 { File *file = openWriteFile(NewStringf("%s%s.m3", SWIG_output_directory(), m3wrap_name)); emitBanner(file); if (unsafe_module) { Printf(file, "UNSAFE "); } Printf(file, "MODULE %s;\n\n", m3wrap_name); emitImportStatements(m3wrap_impl.import, file); Printf(file, "\n"); // Add the wrapper methods Printv(file, m3wrap_impl.f, NIL); Printf(file, "\nBEGIN\nEND %s.\n", m3wrap_name); Delete(file); } if (upcasts_code) Printv(f_wrappers, upcasts_code, NIL); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); // Output a Modula 3 type wrapper class for each SWIG type for (Iterator swig_type = First(swig_types_hash); swig_type.item != NIL; swig_type = Next(swig_type)) { emitTypeWrapperClass(swig_type.key, swig_type.item); } Delete(swig_types_hash); swig_types_hash = NULL; Delete(constant_values); constant_values = NULL; Delete(enumeration_coll); enumeration_coll = NULL; Delete(m3raw_name); m3raw_name = NULL; Delete(m3raw_baseclass); m3raw_baseclass = NULL; Delete(m3raw_interfaces); m3raw_interfaces = NULL; Delete(m3raw_class_modifiers); m3raw_class_modifiers = NULL; Delete(m3raw_imports); m3raw_imports = NULL; Delete(m3raw_cppcasts_code); m3raw_cppcasts_code = NULL; Delete(proxy_class_def); proxy_class_def = NULL; Delete(proxy_class_code); proxy_class_code = NULL; Delete(m3wrap_name); m3wrap_name = NULL; Delete(m3wrap_modifiers); m3wrap_modifiers = NULL; Delete(targetlibrary); targetlibrary = NULL; Delete(module_baseclass); module_baseclass = NULL; Delete(module_interfaces); module_interfaces = NULL; Delete(module_imports); module_imports = NULL; Delete(upcasts_code); upcasts_code = NULL; Delete(constantfilename); constantfilename = NULL; Delete(renamefilename); renamefilename = NULL; Delete(typemapfilename); typemapfilename = NULL; /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ----------------------------------------------------------------------------- * emitBanner() * ----------------------------------------------------------------------------- */ void emitBanner(File *f) { Printf(f, "(*******************************************************************************\n"); Swig_banner_target_lang(f, " *"); Printf(f, "*******************************************************************************)\n\n"); } /* ---------------------------------------------------------------------- * nativeWrapper() * ---------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n)) return SWIG_ERROR; if (Getattr(n, "type")) { Swig_save("nativeWrapper", n, "name", NIL); Setattr(n, "name", wrapname); native_function_flag = true; functionWrapper(n); Swig_restore(n); native_function_flag = false; } else { Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name")); } return SWIG_OK; } /* ---------------------------------------------------------------------- * functionWrapper() * ---------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *type = nodeType(n); String *funcType = Getattr(n, "modula3:functype"); String *rawname = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *capname = capitalizeFirst(symname); //String *wname = Swig_name_wrapper(symname); //printf("function: %s\n", Char(symname)); //printf(" purpose: %s\n", Char(funcType)); if (Strcmp(type, "cdecl") == 0) { if (funcType == NIL) { // no wrapper needed for plain functions emitM3RawPrototype(n, rawname, symname); emitM3Wrapper(n, symname); } else if (Strcmp(funcType, "method") == 0) { Setattr(n, "modula3:funcname", capname); emitCWrapper(n, capname); emitM3RawPrototype(n, capname, capname); emitM3Wrapper(n, capname); } else if (Strcmp(funcType, "accessor") == 0) { /* * Generate the proxy class properties for public member variables. * Not for enums and constants. */ if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Capitalize the first letter in the function name Setattr(n, "proxyfuncname", capname); Setattr(n, "imfuncname", symname); if (hasPrefix(capname, "Set")) { Setattr(n, "modula3:setname", capname); } else { Setattr(n, "modula3:getname", capname); } emitCWrapper(n, capname); emitM3RawPrototype(n, capname, capname); emitM3Wrapper(n, capname); //proxyClassFunctionHandler(n); } #ifdef DEBUG } else { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Function type <%s> unknown.\n", Char(funcType)); #endif } } else if ((Strcmp(type, "constructor") == 0) || (Strcmp(type, "destructor") == 0)) { emitCWrapper(n, capname); emitM3RawPrototype(n, capname, capname); emitM3Wrapper(n, capname); } // a Java relict #if 0 if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { emitM3Wrapper(n, capname); } #endif Delete(capname); return SWIG_OK; } /* ---------------------------------------------------------------------- * emitCWrapper() * * Generate the wrapper in C which calls C++ methods. * ---------------------------------------------------------------------- */ virtual int emitCWrapper(Node *n, const String *wname) { String *rawname = Getattr(n, "name"); String *c_return_type = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *body = NewString(""); Hash *throws_hash = NewHash(); ParmList *l = Getattr(n, "parms"); SwigType *t = Getattr(n, "type"); String *symname = Getattr(n, "sym:name"); if (!Getattr(n, "sym:overloaded")) { if (!addSymbol(wname, n)) { return SWIG_ERROR; } } // A new wrapper function object Wrapper *f = NewWrapper(); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("ctype", l, f); /* Get return types */ { String *tm = getMappedTypeNew(n, "ctype", ""); if (tm != NIL) { Printf(c_return_type, "%s", tm); } } bool is_void_return = (Cmp(c_return_type, "void") == 0); if (!is_void_return) { Wrapper_add_localv(f, "cresult", c_return_type, "cresult = 0", NIL); } Printv(f->def, " SWIGEXPORT ", c_return_type, " ", wname, "(", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); // Generate signature and argument conversion for C wrapper { Parm *p; attachParameterNames(n, "tmap:name", "c:wrapname", "m3arg%d"); bool gencomma = false; for (p = skipIgnored(l, "in"); p; p = skipIgnored(p, "in")) { String *arg = Getattr(p, "c:wrapname"); { /* Get the ctype types of the parameter */ String *c_param_type = getMappedType(p, "ctype"); // Add parameter to C function Printv(f->def, gencomma ? ", " : "", c_param_type, " ", arg, NIL); Delete(c_param_type); gencomma = true; } // Get typemap for this argument String *tm = getMappedType(p, "in"); if (tm != NIL) { addThrows(throws_hash, "in", p); Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); /*??? */ Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } /* Insert constraint checking code */ { Parm *p; for (p = l; p;) { String *tm = Getattr(p, "tmap:check"); if (tm != NIL) { addThrows(throws_hash, "check", p); Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } } /* Insert cleanup code */ { Parm *p; for (p = l; p;) { String *tm = Getattr(p, "tmap:freearg"); if (tm != NIL) { addThrows(throws_hash, "freearg", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } } /* Insert argument output code */ { Parm *p; for (p = l; p;) { String *tm = Getattr(p, "tmap:argout"); if (tm != NIL) { addThrows(throws_hash, "argout", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$result", "cresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } } // Get any Modula 3 exception classes in the throws typemap ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "catchlist"))) { Swig_typemap_attach_parms("throws", throw_parm_list, f); Parm *p; for (p = throw_parm_list; p; p = nextSibling(p)) { addThrows(throws_hash, "throws", p); } } Setattr(n, "wrap:name", wname); // Now write code to make the function call if (!native_function_flag) { String *actioncode = emit_action(n); /* Return value if necessary */ String *tm; if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { addThrows(throws_hash, "out", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Replaceall(tm, "$target", "cresult"); /* deprecated */ Replaceall(tm, "$result", "cresult"); Printf(f->code, "%s", tm); if (hasContent(tm)) Printf(f->code, "\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), rawname); } emit_return_variable(n, t, f); } /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { String *tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm != NIL) { addThrows(throws_hash, "newfree", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if (!native_function_flag) { String *tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0); if (tm != NIL) { Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* Finish C wrapper */ Printf(f->def, ") {"); if (!is_void_return) Printv(f->code, " return cresult;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); if (!is_void_return) { Replaceall(f->code, "$null", "0"); } else { Replaceall(f->code, "$null", ""); } /* Dump the function out */ if (!native_function_flag) { Wrapper_print(f, f_wrappers); } Delete(c_return_type); Delete(cleanup); Delete(outarg); Delete(body); Delete(throws_hash); DelWrapper(f); return SWIG_OK; } /* ---------------------------------------------------------------------- * emitM3RawPrototype() * * Generate an EXTERNAL procedure declaration in Modula 3 * which is the interface to an existing C routine or a C wrapper. * ---------------------------------------------------------------------- */ virtual int emitM3RawPrototype(Node *n, const String *cname, const String *m3name) { String *im_return_type = NewString(""); //String *symname = Getattr(n,"sym:name"); ParmList *l = Getattr(n, "parms"); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("m3rawinmode", l, NULL); Swig_typemap_attach_parms("m3rawintype", l, NULL); /* Get return types */ bool has_return; { String *tm = getMappedTypeNew(n, "m3rawrettype", ""); if (tm != NIL) { Printf(im_return_type, "%s", tm); } has_return = hasContent(tm); } /* cname is the original name if 'n' denotes a C function and it is the relabeled name (sym:name) if 'n' denotes a C++ method or similar */ m3raw_intf.enterBlock(no_block); Printf(m3raw_intf.f, "\n<* EXTERNAL %s *>\nPROCEDURE %s (", cname, m3name); // Generate signature for raw interface { Parm *p; writeArgState state; attachParameterNames(n, "tmap:rawinname", "modula3:rawname", "arg%d"); for (p = skipIgnored(l, "m3rawintype"); p; p = skipIgnored(p, "m3rawintype")) { /* Get argument passing mode, should be one of VALUE, VAR, READONLY */ String *mode = Getattr(p, "tmap:m3rawinmode"); String *argname = Getattr(p, "modula3:rawname"); String *im_param_type = getMappedType(p, "m3rawintype"); addImports(m3raw_intf.import, "m3rawintype", p); writeArg(m3raw_intf.f, state, mode, argname, im_param_type, NIL); if (im_param_type != NIL) { p = Getattr(p, "tmap:m3rawintype:next"); } else { p = nextSibling(p); } } writeArg(m3raw_intf.f, state, NIL, NIL, NIL, NIL); } /* Finish M3 raw prototype */ Printf(m3raw_intf.f, ")"); // neither a C wrapper nor a plain C function may throw an exception //generateThrowsClause(throws_hash, m3raw_intf.f); if (has_return) { Printf(m3raw_intf.f, ": %s", im_return_type); } Printf(m3raw_intf.f, ";\n"); Delete(im_return_type); return SWIG_OK; } /* ----------------------------------------------------------------------- * variableWrapper() * ----------------------------------------------------------------------- */ virtual int variableWrapper(Node *n) { Language::variableWrapper(n); return SWIG_OK; } /* ----------------------------------------------------------------------- * globalvariableHandler() * ----------------------------------------------------------------------- */ virtual int globalvariableHandler(Node *n) { SwigType *t = Getattr(n, "type"); String *tm; // Get the variable type if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { substituteClassname(t, tm); } variable_name = Getattr(n, "sym:name"); variable_type = Copy(tm); // Get the variable type expressed in terms of Modula 3 equivalents of C types if ((tm = getMappedTypeNew(n, "m3rawtype", ""))) { m3raw_intf.enterBlock(no_block); Printf(m3raw_intf.f, "\n<* EXTERNAL *> VAR %s: %s;\n", variable_name, tm); } // Output the property's accessor methods /* global_variable_flag = true; int ret = Language::globalvariableHandler(n); global_variable_flag = false; */ Printf(m3wrap_impl.f, "\n\n"); //return ret; return 1; } long getConstNumeric(Node *n) { String *constnumeric = Getfeature(n, "constnumeric"); String *name = Getattr(n, "name"); long numvalue; if (constnumeric == NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Feature 'constnumeric' is necessary to obtain value of %s.\n", name); return 0; } else if (!strToL(constnumeric, numvalue)) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "The feature 'constnumeric' of %s specifies value <%s> which is not an integer constant.\n", name, constnumeric); return 0; } else { return numvalue; } } /* ------------------------------------------------------------------------ * generateIntConstant() * * Considers node as an integer constant definition * and generate a Modula 3 constant definition. * ------------------------------------------------------------------------ */ void generateIntConstant(Node *n, String *name) { String *value = Getattr(n, "value"); String *type = Getfeature(n, "modula3:constint:type"); String *conv = Getfeature(n, "modula3:constint:conv"); if (name == NIL) { name = Getattr(n, "sym:name"); } long numvalue; bool isSimpleNum = strToL(value, numvalue); if (!isSimpleNum) { numvalue = getConstNumeric(n); } String *m3value; if ((conv == NIL) || ((Strcmp(conv, "set:int") != 0) && (Strcmp(conv, "int:set") != 0))) { /* The original value of the constant has precedence over 'constnumeric' feature since we like to keep the style (that is the base) of simple numeric constants */ if (isSimpleNum) { if (hasPrefix(value, "0x")) { m3value = NewStringf("16_%s", Char(value) + 2); } else if ((Len(value) > 1) && (*Char(value) == '0')) { m3value = NewStringf("8_%s", Char(value) + 1); } else { m3value = Copy(value); } /* If we cannot easily obtain the value of a numeric constant, we use the results given by a C compiler. */ } else { m3value = Copy(Getfeature(n, "constnumeric")); } } else { // if the value can't be converted, it is ignored if (convertInt(numvalue, numvalue, conv)) { m3value = NewStringf("%d", numvalue); } else { m3value = NIL; } } if (m3value != NIL) { m3wrap_intf.enterBlock(constant); Printf(m3wrap_intf.f, "%s", name); if (hasContent(type)) { Printf(m3wrap_intf.f, ": %s", type); } Printf(m3wrap_intf.f, " = %s;\n", m3value); Delete(m3value); } } /* ----------------------------------------------------------------------- * generateSetConstant() * * Considers node as a set constant definition * and generate a Modula 3 constant definition. * ------------------------------------------------------------------------ */ void generateSetConstant(Node *n, String *name) { String *value = Getattr(n, "value"); String *type = Getfeature(n, "modula3:constset:type"); String *setname = Getfeature(n, "modula3:constset:set"); String *basename = Getfeature(n, "modula3:constset:base"); String *conv = Getfeature(n, "modula3:constset:conv"); m3wrap_intf.enterBlock(constant); Printf(m3wrap_intf.f, "%s", name); if (type != NIL) { Printf(m3wrap_intf.f, ":%s ", type); } Printf(m3wrap_intf.f, " = %s{", setname); long numvalue = 0; if (!strToL(value, numvalue)) { numvalue = getConstNumeric(n); } convertInt(numvalue, numvalue, conv); bool isIntType = Strcmp(basename, "CARDINAL") == 0; Hash *items = NIL; if (!isIntType) { Hash *enumeration = Getattr(enumeration_coll, basename); if (enumeration == NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "There is no enumeration <%s> as needed for the set.\n", setname); isIntType = true; } else { items = Getattr(enumeration, "items"); } } bool gencomma = false; int bitpos = 0; while (numvalue > 0) { if ((numvalue & 1) != 0) { if (isIntType) { if (gencomma) { Printv(m3wrap_intf.f, ",", NIL); } gencomma = true; Printf(m3wrap_intf.f, "%d", bitpos); } else { char bitval[15]; sprintf(bitval, "%d", bitpos); String *bitname = Getattr(items, bitval); if (bitname == NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Enumeration <%s> has no value <%s>.\n", setname, bitval); } else { if (gencomma) { Printv(m3wrap_intf.f, ",", NIL); } gencomma = true; Printf(m3wrap_intf.f, "%s.%s", basename, bitname); } } } numvalue >>= 1; bitpos++; } Printf(m3wrap_intf.f, "};\n"); } void generateConstant(Node *n) { // any of the special interpretation disables the default behaviour String *enumitem = Getfeature(n, "modula3:enumitem:name"); String *constset = Getfeature(n, "modula3:constset:name"); String *constint = Getfeature(n, "modula3:constint:name"); if (hasContent(enumitem) || hasContent(constset) || hasContent(constint)) { if (hasContent(constset)) { generateSetConstant(n, constset); } if (hasContent(constint)) { generateIntConstant(n, constint); } } else { String *value = Getattr(n, "value"); String *name = Getattr(n, "sym:name"); if (name == NIL) { name = Getattr(n, "name"); } m3wrap_intf.enterBlock(constant); Printf(m3wrap_intf.f, "%s = %s;\n", name, value); } } void emitEnumeration(File *file, String *name, Node *n) { Printf(file, "%s = {", name); int i; bool gencomma = false; int max = aToL(Getattr(n, "max")); Hash *items = Getattr(n, "items"); for (i = 0; i <= max; i++) { if (gencomma) { Printf(file, ","); } Printf(file, "\n"); gencomma = true; char numstr[15]; sprintf(numstr, "%d", i); String *name = Getattr(items, numstr); if (name != NIL) { Printv(file, name, NIL); } else { Printf(file, "Dummy%d", i); } } Printf(file, "\n};\n"); } /* ----------------------------------------------------------------------- * constantWrapper() * * Handles constants and enumeration items. * ------------------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { generateConstant(n); return SWIG_OK; } #if 0 // enumerations are handled like constant definitions /* ----------------------------------------------------------------------------- * enumDeclaration() * ----------------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { String *symname = nameToModula3(Getattr(n, "sym:name"), true); enumerationStart(symname); int result = Language::enumDeclaration(n); enumerationStop(); Delete(symname); return result; } #endif /* ----------------------------------------------------------------------------- * enumvalueDeclaration() * ----------------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *n) { generateConstant(n); /* This call would continue processing in the constantWrapper which cannot handle values like "RED+1". return Language::enumvalueDeclaration(n); */ return SWIG_OK; } /* ----------------------------------------------------------------------------- * pragmaDirective() * * Valid Pragmas: * imclassbase - base (extends) for the intermediary class * imclassclassmodifiers - class modifiers for the intermediary class * imclasscode - text (Modula 3 code) is copied verbatim to the intermediary class * imclassimports - import statements for the intermediary class * imclassinterfaces - interface (implements) for the intermediary class * * modulebase - base (extends) for the module class * moduleclassmodifiers - class modifiers for the module class * modulecode - text (Modula 3 code) is copied verbatim to the module class * moduleimports - import statements for the module class * moduleinterfaces - interface (implements) for the module class * * ----------------------------------------------------------------------------- */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *code = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "modula3") == 0) { String *strvalue = NewString(value); Replaceall(strvalue, "\\\"", "\""); /* bool isEnumItem = Strcmp(code, "enumitem") == 0; bool isSetItem = Strcmp(code, "setitem") == 0; */ if (Strcmp(code, "imclassbase") == 0) { Delete(m3raw_baseclass); m3raw_baseclass = Copy(strvalue); } else if (Strcmp(code, "imclassclassmodifiers") == 0) { Delete(m3raw_class_modifiers); m3raw_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "imclasscode") == 0) { Printf(m3raw_intf.f, "%s\n", strvalue); } else if (Strcmp(code, "imclassimports") == 0) { Delete(m3raw_imports); m3raw_imports = Copy(strvalue); } else if (Strcmp(code, "imclassinterfaces") == 0) { Delete(m3raw_interfaces); m3raw_interfaces = Copy(strvalue); } else if (Strcmp(code, "modulebase") == 0) { Delete(module_baseclass); module_baseclass = Copy(strvalue); } else if (Strcmp(code, "moduleclassmodifiers") == 0) { Delete(m3wrap_modifiers); m3wrap_modifiers = Copy(strvalue); } else if (Strcmp(code, "modulecode") == 0) { Printf(m3wrap_impl.f, "%s\n", strvalue); } else if (Strcmp(code, "moduleimports") == 0) { Delete(module_imports); module_imports = Copy(strvalue); } else if (Strcmp(code, "moduleinterfaces") == 0) { Delete(module_interfaces); module_interfaces = Copy(strvalue); } else if (Strcmp(code, "unsafe") == 0) { unsafe_module = true; } else if (Strcmp(code, "library") == 0) { if (targetlibrary) { Delete(targetlibrary); } targetlibrary = Copy(strvalue); } else if (Strcmp(code, "enumitem") == 0) { } else if (Strcmp(code, "constset") == 0) { } else if (Strcmp(code, "constint") == 0) { } else if (Strcmp(code, "makesetofenum") == 0) { m3wrap_intf.enterBlock(blocktype); Printf(m3wrap_intf.f, "%sSet = SET OF %s;\n", value, value); } else { Swig_warning(WARN_MODULA3_UNKNOWN_PRAGMA, input_file, line_number, "Unrecognized pragma <%s>.\n", code); } Delete(strvalue); } } return Language::pragmaDirective(n); } void Setfeature(Node *n, const char *feature, const String *value, bool warn = false) { //printf("tag feature <%s> with value <%s>\n", feature, Char(value)); String *attr = NewStringf("feature:%s", feature); if ((Setattr(n, attr, value) != 0) && warn) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Feature <%s> of %s did already exist.\n", feature, Getattr(n, "name")); } Delete(attr); } String *Getfeature(Node *n, const char *feature) { //printf("retrieve feature <%s> with value <%s>\n", feature, Char(value)); String *attr = NewStringf("feature:%s", feature); String *result = Getattr(n, attr); Delete(attr); return result; } bool convertInt(long in, long &out, const String *mode) { if ((mode == NIL) || (Strcmp(mode, "int:int") == 0) || (Strcmp(mode, "set:set") == 0)) { out = in; return true; } else if (Strcmp(mode, "set:int") == 0) { return log2(in, out); } else if (Strcmp(mode, "int:set") == 0) { out = 1L << in; return unsigned (in) < (sizeof(out) * 8); } else { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown integer conversion method <%s>.\n", mode); return false; } } void collectEnumerations(Hash *enums, Node *n) { Node *child = firstChild(n); while (child != NIL) { String *name = Getattr(child, "name"); const bool isConstant = Strcmp(nodeType(child), "constant") == 0; const bool isEnumItem = Strcmp(nodeType(child), "enumitem") == 0; if (isConstant || isEnumItem) { //printf("%s%s name %s\n", isConstant?"constant":"", isEnumItem?"enumitem":"", Char(name)); { String *m3name = Getfeature(child, "modula3:enumitem:name"); String *m3enum = Getfeature(child, "modula3:enumitem:enum"); String *conv = Getfeature(child, "modula3:enumitem:conv"); if (m3enum != NIL) { //printf("m3enum %s\n", Char(m3enum)); if (m3name == NIL) { m3name = name; } long max = -1; Hash *items; Hash *enumnode = Getattr(enums, m3enum); if (enumnode == NIL) { enumnode = NewHash(); items = NewHash(); Setattr(enumnode, "items", items); Setattr(enums, m3enum, enumnode); } else { String *maxstr = Getattr(enumnode, "max"); if (maxstr != NIL) { max = aToL(maxstr); } items = Getattr(enumnode, "items"); } long numvalue; String *value = Getattr(child, "value"); //printf("value: %s\n", Char(value)); if ((value == NIL) || (!strToL(value, numvalue))) { value = Getattr(child, "enumvalue"); if ((value == NIL) || (!evalExpr(value, numvalue))) { numvalue = getConstNumeric(child); } //printf("constnumeric: %s\n", Char(value)); } Setattr(constant_values, name, NewStringf("%d", numvalue)); if (convertInt(numvalue, numvalue, conv)) { String *newvalue = NewStringf("%d", numvalue); String *oldname = Getattr(items, newvalue); if (oldname != NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "The value <%s> is already assigned to <%s>.\n", value, oldname); } //printf("items %p, set %s = %s\n", items, Char(newvalue), Char(m3name)); Setattr(items, newvalue, m3name); if (max < numvalue) { max = numvalue; } Setattr(enumnode, "max", NewStringf("%d", max)); } } } } collectEnumerations(enums, child); child = nextSibling(child); } } enum const_pragma_type { cpt_none, cpt_constint, cpt_constset, cpt_enumitem }; struct const_id_pattern { String *prefix, *parentEnum; }; void tagConstants(Node *first, String *parentEnum, const const_id_pattern & pat, const String *pragma, List *convdesc) { Node *n = first; while (n != NIL) { String *name = getQualifiedName(n); bool isConstant = Strcmp(nodeType(n), "constant") == 0; bool isEnumItem = Strcmp(nodeType(n), "enumitem") == 0; if ((isConstant || isEnumItem) && ((pat.prefix == NIL) || (hasPrefix(name, pat.prefix))) && ((pat.parentEnum == NIL) || ((parentEnum != NIL) && (Strcmp (pat.parentEnum, parentEnum) == 0)))) { //printf("tag %s\n", Char(name)); String *srctype = Getitem(convdesc, 1); String *relationstr = Getitem(convdesc, 3); List *relationdesc = Split(relationstr, ',', 2); // transform name from C to Modula3 style String *srcstyle = NIL; String *newprefix = NIL; { //printf("name conversion <%s>\n", Char(Getitem(convdesc,2))); List *namedesc = Split(Getitem(convdesc, 2), ',', INT_MAX); Iterator nameit = First(namedesc); for (; nameit.item != NIL; nameit = Next(nameit)) { List *nameassign = Split(nameit.item, '=', 2); String *tag = Getitem(nameassign, 0); String *data = Getitem(nameassign, 1); //printf("name conv <%s> = <%s>\n", Char(tag), Char(data)); if (Strcmp(tag, "srcstyle") == 0) { srcstyle = Copy(data); } else if (Strcmp(tag, "prefix") == 0) { newprefix = Copy(data); } else { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown name conversion tag <%s> with value <%s>.\n", tag, data); } Delete(nameassign); } Delete(namedesc); } const char *stem = Char(name); if (pat.prefix != NIL) { //printf("pat.prefix %s for %s\n", Char(pat.prefix), Char(name)); stem += Len(pat.prefix); } String *newname; if (srcstyle && Strcmp(srcstyle, "underscore") == 0) { if (newprefix != NIL) { String *newstem = nameToModula3(stem, true); newname = NewStringf("%s%s", newprefix, newstem); Delete(newstem); } else { newname = nameToModula3(stem, true); } } else { if (srcstyle != NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown C identifier style <%s>.\n", srcstyle); } newname = Copy(name); } if (Strcmp(pragma, "enumitem") == 0) { if (Len(relationdesc) != 1) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Expected , got <%s>.\n", relationstr); } Setfeature(n, "modula3:enumitem:name", newname, true); Setfeature(n, "modula3:enumitem:enum", relationstr, true); Setfeature(n, "modula3:enumitem:conv", NewStringf("%s:int", srctype), true); } else if (Strcmp(pragma, "constint") == 0) { if (Len(relationdesc) != 1) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Expected , got <%s>.\n", relationstr); } Setfeature(n, "modula3:constint:name", newname, true); Setfeature(n, "modula3:constint:type", Getitem(relationdesc, 0), true); Setfeature(n, "modula3:constint:conv", NewStringf("%s:int", srctype), true); } else if (Strcmp(pragma, "constset") == 0) { if (Len(relationdesc) != 2) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Expected , got <%s>.\n", relationstr); } String *settype = Getitem(relationdesc, 0); Setfeature(n, "modula3:constset:name", newname, true); //Setfeature(n,"modula3:constset:type",settype,true); Setfeature(n, "modula3:constset:set", settype, true); Setfeature(n, "modula3:constset:base", Getitem(relationdesc, 1), true); Setfeature(n, "modula3:constset:conv", NewStringf("%s:set", srctype), true); } Delete(newname); Delete(relationdesc); } if (Strcmp(nodeType(n), "enum") == 0) { //printf("explore enum %s, qualification %s\n", Char(name), Char(Swig_symbol_qualified(n))); tagConstants(firstChild(n), name, pat, pragma, convdesc); } else { tagConstants(firstChild(n), NIL, pat, pragma, convdesc); } n = nextSibling(n); } } void scanForConstPragmas(Node *n) { Node *child = firstChild(n); while (child != NIL) { const String *type = nodeType(child); if (Strcmp(type, "pragma") == 0) { const String *lang = Getattr(child, "lang"); const String *code = Getattr(child, "name"); String *value = Getattr(child, "value"); if (Strcmp(lang, "modula3") == 0) { const_pragma_type cpt = cpt_none; if (Strcmp(code, "constint") == 0) { cpt = cpt_constint; } else if (Strcmp(code, "constset") == 0) { cpt = cpt_constset; } else if (Strcmp(code, "enumitem") == 0) { cpt = cpt_enumitem; } if (cpt != cpt_none) { const_id_pattern pat = { NIL, NIL }; List *convdesc = Split(value, ';', 4); List *patterndesc = Split(Getitem(convdesc, 0), ',', INT_MAX); Iterator patternit; for (patternit = First(patterndesc); patternit.item != NIL; patternit = Next(patternit)) { List *patternassign = Split(patternit.item, '=', 2); String *tag = Getitem(patternassign, 0); String *data = Getitem(patternassign, 1); if (Strcmp(tag, "prefix") == 0) { pat.prefix = Copy(data); } else if (Strcmp(tag, "enum") == 0) { pat.parentEnum = Copy(data); } else { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown identification tag <%s> with value <%s>.\n", tag, data); } Delete(patternassign); } tagConstants(child, NIL, pat, code, convdesc); Delete(patterndesc); } } } scanForConstPragmas(child); child = nextSibling(child); } } /* ----------------------------------------------------------------------------- * emitProxyClassDefAndCPPCasts() * ----------------------------------------------------------------------------- */ void emitProxyClassDefAndCPPCasts(Node *n) { String *c_classname = SwigType_namestr(Getattr(n, "name")); String *c_baseclass = NULL; String *baseclass = NULL; String *c_baseclassname = NULL; String *name = Getattr(n, "name"); /* Deal with inheritance */ List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item) { if (!GetFlag(base.item, "feature:ignore")) { String *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { c_baseclassname = baseclassname; baseclass = Copy(getProxyName(baseclassname)); if (baseclass) c_baseclass = SwigType_namestr(baseclassname); } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); Swig_warning(WARN_MODULA3_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Modula 3.\n", SwigType_namestr(proxyclassname), SwigType_namestr(baseclassname)); } } base = Next(base); } } bool derived = baseclass && getProxyName(c_baseclassname); if (!baseclass) baseclass = NewString(""); // Inheritance from pure Modula 3 classes const String *pure_baseclass = typemapLookup(n, "m3base", name, WARN_NONE); if (hasContent(pure_baseclass) && hasContent(baseclass)) { Swig_warning(WARN_MODULA3_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Modula 3.\n", name, pure_baseclass); } // Pure Modula 3 interfaces const String *pure_interfaces = typemapLookup(n, derived ? "m3interfaces_derived" : "m3interfaces", name, WARN_NONE); // Start writing the proxy class Printv(proxy_class_def, typemapLookup(n, "m3imports", name, WARN_NONE), // Import statements "\n", typemapLookup(n, "m3classmodifiers", name, WARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " class $m3classname", // Class name and bases (derived || *Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", baseclass, pure_baseclass, ((derived || *Char(pure_baseclass)) && *Char(pure_interfaces)) ? // Interfaces ", " : "", pure_interfaces, " {\n", " private IntPtr swigCPtr;\n", // Member variables for memory handling derived ? "" : " protected bool swigCMemOwn;\n", "\n", " ", typemapLookup(n, "m3ptrconstructormodifiers", name, WARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF), // pointer constructor modifiers " $m3classname(IntPtr cPtr, bool cMemoryOwn) ", // Constructor used for wrapping pointers derived ? ": base($imclassname.$m3classnameTo$baseclass(cPtr), cMemoryOwn) {\n" : "{\n swigCMemOwn = cMemoryOwn;\n", " swigCPtr = cPtr;\n", " }\n", NIL); if (!have_default_constructor_flag) { // All proxy classes need a constructor Printv(proxy_class_def, "\n", " protected $m3classname() : this(IntPtr.Zero, false) {\n", " }\n", NIL); } // C++ destructor is wrapped by the Dispose method // Note that the method name is specified in a typemap attribute called methodname String *destruct = NewString(""); const String *tm = NULL; Node *attributes = NewHash(); String *destruct_methodname = NULL; if (derived) { tm = typemapLookup(n, "m3destruct_derived", name, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:m3destruct_derived:methodname"); } else { tm = typemapLookup(n, "m3destruct", name, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:m3destruct:methodname"); } if (!destruct_methodname) { Swig_error(Getfile(n), Getline(n), "No methodname attribute defined in m3destruct%s typemap for %s\n", (derived ? "_derived" : ""), proxy_class_name); } // Emit the Finalize and Dispose methods if (tm) { // Finalize method if (*Char(destructor_call)) { Printv(proxy_class_def, typemapLookup(n, "m3finalize", name, WARN_NONE), NIL); } // Dispose method Printv(destruct, tm, NIL); if (*Char(destructor_call)) Replaceall(destruct, "$imcall", destructor_call); else Replaceall(destruct, "$imcall", "throw new MethodAccessException(\"C++ destructor does not have public access\")"); if (*Char(destruct)) Printv(proxy_class_def, "\n public ", derived ? "override" : "virtual", " void ", destruct_methodname, "() ", destruct, "\n", NIL); } Delete(attributes); Delete(destruct); // Emit various other methods Printv(proxy_class_def, typemapLookup(n, "m3getcptr", name, WARN_MODULA3_TYPEMAP_GETCPTR_UNDEF), // getCPtr method typemapLookup(n, "m3code", name, WARN_NONE), // extra Modula 3 code "\n", NIL); // Substitute various strings into the above template Replaceall(proxy_class_def, "$m3classname", proxy_class_name); Replaceall(proxy_class_code, "$m3classname", proxy_class_name); Replaceall(proxy_class_def, "$baseclass", baseclass); Replaceall(proxy_class_code, "$baseclass", baseclass); Replaceall(proxy_class_def, "$imclassname", m3raw_name); Replaceall(proxy_class_code, "$imclassname", m3raw_name); // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { Printv(m3raw_cppcasts_code, "\n [DllImport(\"", m3wrap_name, "\", EntryPoint=\"Modula3_", proxy_class_name, "To", baseclass, "\")]\n", NIL); Printv(m3raw_cppcasts_code, " public static extern IntPtr ", "$m3classnameTo$baseclass(IntPtr objectRef);\n", NIL); Replaceall(m3raw_cppcasts_code, "$m3classname", proxy_class_name); Replaceall(m3raw_cppcasts_code, "$baseclass", baseclass); Printv(upcasts_code, "SWIGEXPORT long Modula3_$imclazznameTo$imbaseclass", "(long objectRef) {\n", " long baseptr = 0;\n" " *($cbaseclass **)&baseptr = *($cclass **)&objectRef;\n" " return baseptr;\n" "}\n", "\n", NIL); Replaceall(upcasts_code, "$imbaseclass", baseclass); Replaceall(upcasts_code, "$cbaseclass", c_baseclass); Replaceall(upcasts_code, "$imclazzname", proxy_class_name); Replaceall(upcasts_code, "$cclass", c_classname); } Delete(baseclass); } /* ---------------------------------------------------------------------- * getAttrString() * * If necessary create and return the string * associated with a certain attribute of 'n'. * ---------------------------------------------------------------------- */ String *getAttrString(Node *n, const char *attr) { String *str = Getattr(n, attr); if (str == NIL) { str = NewString(""); Setattr(n, attr, str); } return str; } /* ---------------------------------------------------------------------- * getMethodDeclarations() * * If necessary create and return the handle * where the methods of the current access can be written to. * 'n' must be a member of a struct or a class. * ---------------------------------------------------------------------- */ String *getMethodDeclarations(Node *n) { String *acc_str = Getattr(n, "access"); String *methodattr; if (acc_str == NIL) { methodattr = NewString("modula3:method:public"); } else { methodattr = NewStringf("modula3:method:%s", acc_str); } String *methods = getAttrString(parentNode(n), Char(methodattr)); Delete(methodattr); return methods; } /* ---------------------------------------------------------------------- * classHandler() * ---------------------------------------------------------------------- */ virtual int classHandler(Node *n) { File *f_proxy = NULL; proxy_class_name = Copy(Getattr(n, "sym:name")); //String *rawname = Getattr(n,"name"); if (proxy_flag) { if (!addSymbol(proxy_class_name, n)) return SWIG_ERROR; if (Cmp(proxy_class_name, m3raw_name) == 0) { Printf(stderr, "Class name cannot be equal to intermediary class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } if (Cmp(proxy_class_name, m3wrap_name) == 0) { Printf(stderr, "Class name cannot be equal to module class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } String *filen = NewStringf("%s%s.m3", SWIG_output_directory(), proxy_class_name); f_proxy = NewFile(filen, "w", SWIG_output_files()); if (!f_proxy) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Delete(filen); filen = NULL; emitBanner(f_proxy); Clear(proxy_class_def); Clear(proxy_class_code); have_default_constructor_flag = false; destructor_call = NewString(""); } /* This will invoke memberfunctionHandler, membervariableHandler ... and finally it may invoke functionWrapper for wrappers and member variable accessors. It will invoke Language:constructorDeclaration which decides whether to call MODULA3::constructorHandler */ Language::classHandler(n); { String *kind = Getattr(n, "kind"); if (Cmp(kind, "struct") == 0) { String *entries = NewString(""); Node *child; writeArgState state; for (child = firstChild(n); child != NIL; child = nextSibling(child)) { String *childType = nodeType(child); if (Strcmp(childType, "cdecl") == 0) { String *member = Getattr(child, "sym:name"); ParmList *pl = Getattr(child, "parms"); if (pl == NIL) { // Get the variable type in Modula 3 type equivalents String *m3ct = getMappedTypeNew(child, "m3rawtype", ""); writeArg(entries, state, NIL, member, m3ct, NIL); } } } writeArg(entries, state, NIL, NIL, NIL, NIL); m3raw_intf.enterBlock(blocktype); Printf(m3raw_intf.f, "%s =\nRECORD\n%sEND;\n", proxy_class_name, entries); Delete(entries); } else if (Cmp(kind, "class") == 0) { enum access_privilege { acc_public, acc_protected, acc_private }; int max_acc = acc_public; const char *acc_name[3] = { "public", "protected", "private" }; String *methods[3]; int acc; for (acc = acc_public; acc <= acc_private; acc++) { String *methodattr = NewStringf("modula3:method:%s", acc_name[acc]); methods[acc] = Getattr(n, methodattr); Delete(methodattr); max_acc = max_acc > acc ? max_acc : acc; } /* Determine the name of the base class */ String *baseclassname = NewString(""); { List *baselist = Getattr(n, "bases"); if (baselist) { /* Look for the first (principal?) base class - Modula 3 does not support multiple inheritance */ Iterator base = First(baselist); if (base.item) { Append(baseclassname, Getattr(base.item, "sym:name")); base = Next(base); if (base.item) { Swig_warning(WARN_MODULA3_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Modula 3.\n", proxy_class_name, Getattr(base.item, "name")); } } } } /* the private class of the base class and only this need a pointer to the C++ object */ bool need_private = !hasContent(baseclassname); max_acc = need_private ? acc_private : max_acc; /* Declare C++ object as abstract pointer in Modula 3 */ /* The revelation system does not allow us to imitate the whole class hierarchy of the C++ library, but at least we can distinguish between classes of different roots. */ if (hasContent(baseclassname)) { m3raw_intf.enterBlock(blocktype); Printf(m3raw_intf.f, "%s = %s;\n", proxy_class_name, baseclassname); } else { m3raw_intf.enterBlock(blocktype); Printf(m3raw_intf.f, "%s <: ADDRESS;\n", proxy_class_name); m3raw_impl.enterBlock(revelation); Printf(m3raw_impl.f, "%s = UNTRACED BRANDED REF RECORD (*Dummy*) END;\n", proxy_class_name); } String *superclass; m3wrap_intf.enterBlock(blocktype); if (hasContent(methods[acc_public])) { superclass = NewStringf("%sPublic", proxy_class_name); } else if (hasContent(baseclassname)) { superclass = Copy(baseclassname); } else { superclass = NewString("ROOT"); } Printf(m3wrap_intf.f, "%s <: %s;\n", proxy_class_name, superclass); Delete(superclass); { static const char *acc_m3suffix[] = { "Public", "Protected", "Private" }; int acc; for (acc = acc_public; acc <= acc_private; acc++) { bool process_private = (acc == acc_private) && need_private; if (hasContent(methods[acc]) || process_private) { String *subclass = NewStringf("%s%s", proxy_class_name, acc_m3suffix[acc]); /* m3wrap_intf.enterBlock(revelation); Printf(m3wrap_intf.f, "%s <: %s;\n", proxy_class_name, subclass); */ if (acc == max_acc) { m3wrap_intf.enterBlock(revelation); Printf(m3wrap_intf.f, "%s =\n", proxy_class_name); } else { m3wrap_intf.enterBlock(blocktype); Printf(m3wrap_intf.f, "%s =\n", subclass); } Printf(m3wrap_intf.f, "%s BRANDED OBJECT\n", baseclassname); if (process_private) { Setattr(m3wrap_intf.import, m3raw_name, ""); Printf(m3wrap_intf.f, "cxxObj:%s.%s;\n", m3raw_name, proxy_class_name); } if (hasContent(methods[acc])) { Printf(m3wrap_intf.f, "METHODS\n%s", methods[acc]); } if (acc == max_acc) { String *overrides = Getattr(n, "modula3:override"); Printf(m3wrap_intf.f, "OVERRIDES\n%s", overrides); } Printf(m3wrap_intf.f, "END;\n"); Delete(baseclassname); baseclassname = subclass; } } } Delete(methods[acc_public]); Delete(methods[acc_protected]); Delete(methods[acc_private]); } else { Swig_warning(WARN_MODULA3_TYPECONSTRUCTOR_UNKNOWN, input_file, line_number, "Unknown type constructor %s\n", kind); } } if (proxy_flag) { emitProxyClassDefAndCPPCasts(n); Printv(f_proxy, proxy_class_def, proxy_class_code, NIL); Printf(f_proxy, "}\n"); Delete(f_proxy); f_proxy = NULL; Delete(proxy_class_name); proxy_class_name = NULL; Delete(destructor_call); destructor_call = NULL; } return SWIG_OK; } /* ---------------------------------------------------------------------- * memberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { //printf("begin memberfunctionHandler(%s)\n", Char(Getattr(n,"name"))); Setattr(n, "modula3:functype", "method"); Language::memberfunctionHandler(n); { /* Language::memberfunctionHandler will remove the mapped types that emitM3Wrapper may attach */ ParmList *pl = Getattr(n, "parms"); Swig_typemap_attach_parms("m3wrapinmode", pl, NULL); Swig_typemap_attach_parms("m3wrapinname", pl, NULL); Swig_typemap_attach_parms("m3wrapintype", pl, NULL); Swig_typemap_attach_parms("m3wrapindefault", pl, NULL); attachParameterNames(n, "tmap:m3wrapinname", "autoname", "arg%d"); String *rettype = getMappedTypeNew(n, "m3wrapouttype", ""); String *methodname = Getattr(n, "sym:name"); /* if (methodname==NIL) { methodname = Getattr(n,"name"); } */ String *arguments = createM3Signature(n); String *storage = Getattr(n, "storage"); String *overridden = Getattr(n, "override"); bool isVirtual = (storage != NIL) && (Strcmp(storage, "virtual") == 0); bool isOverridden = (overridden != NIL) && (Strcmp(overridden, "1") == 0); if ((!isVirtual) || (!isOverridden)) { { String *methods = getMethodDeclarations(n); Printf(methods, "%s(%s)%s%s;%s\n", methodname, arguments, hasContent(rettype) ? ": " : "", hasContent(rettype) ? (const String *) rettype : "", isVirtual ? " (* base method *)" : ""); } { /* this was attached by functionWrapper invoked by Language::memberfunctionHandler */ String *fname = Getattr(n, "modula3:funcname"); String *overrides = getAttrString(parentNode(n), "modula3:override"); Printf(overrides, "%s := %s;\n", methodname, fname); } } } if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(NSPACE_TODO, proxy_class_name, overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } //printf("end memberfunctionHandler(%s)\n", Char(Getattr(n,"name"))); return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmemberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { static_flag = true; Language::staticmemberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(NSPACE_TODO, proxy_class_name, overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } static_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * proxyClassFunctionHandler() * * Function called for creating a Modula 3 wrapper function around a c++ function in the * proxy class. Used for both static and non-static C++ class functions. * C++ class static functions map to Modula 3 static functions. * Two extra attributes in the Node must be available. These are "proxyfuncname" - * the name of the Modula 3 class proxy function, which in turn will call "imfuncname" - * the intermediary (PInvoke) function name in the intermediary class. * ----------------------------------------------------------------------------- */ void proxyClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Hash *throws_hash = NewHash(); String *intermediary_function_name = Getattr(n, "imfuncname"); String *proxy_function_name = Getattr(n, "proxyfuncname"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; if (!proxy_flag) return; if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("m3wraptype", l, NULL); Swig_typemap_attach_parms("m3in", l, NULL); /* Get return types */ if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { substituteClassname(t, tm); Printf(return_type, "%s", tm); } if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Properties setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, proxy_class_name, variable_name))) == 0); } /* Start generating the proxy function */ Printf(function_code, " %s ", Getattr(n, "feature:modula3:methodmodifiers")); if (static_flag) Printf(function_code, "static "); if (Getattr(n, "override")) Printf(function_code, "override "); else if (checkAttribute(n, "storage", "virtual")) Printf(function_code, "virtual "); Printf(function_code, "%s %s(", return_type, proxy_function_name); Printv(imcall, m3raw_name, ".", intermediary_function_name, "(", NIL); if (!static_flag) Printv(imcall, "swigCPtr", NIL); emit_mark_varargs(l); int gencomma = !static_flag; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* Ignore the 'this' argument for variable wrappers */ if (!(variable_wrapper_flag && i == 0)) { SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Modula 3 parameter type */ if ((tm = getMappedType(p, "m3wraptype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } if (gencomma) Printf(imcall, ", "); String *arg = variable_wrapper_flag ? NewString("value") : makeParameterName(n, p, i); // Use typemaps to transform type used in Modula 3 wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = getMappedType(p, "in"))) { addThrows(throws_hash, "in", p); substituteClassname(pt, tm); Replaceall(tm, "$input", arg); Printv(imcall, tm, NIL); } /* Add parameter to proxy function */ if (gencomma >= 2) Printf(function_code, ", "); gencomma = 2; Printf(function_code, "%s %s", param_type, arg); Delete(arg); Delete(param_type); } p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); // Transform return type used in PInvoke function (in intermediary class) to type used in Modula 3 wrapper function (in proxy class) if ((tm = getMappedTypeNew(n, "m3out", ""))) { addThrows(throws_hash, "m3out", n); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); } generateThrowsClause(throws_hash, function_code); Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Properties if (setter_flag) { // Setter method if ((tm = getMappedTypeNew(n, "m3varin", ""))) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); Printf(proxy_class_code, "%s", tm); } } else { // Getter method if ((tm = getMappedTypeNew(n, "m3varout", ""))) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); Printf(proxy_class_code, "%s", tm); } } } else { // Normal function call Printv(proxy_class_code, function_code, NIL); } Delete(function_code); Delete(return_type); Delete(imcall); Delete(throws_hash); } /* ---------------------------------------------------------------------- * constructorHandler() * ---------------------------------------------------------------------- */ virtual int constructorHandler(Node *n) { // this invokes functionWrapper Language::constructorHandler(n); if (proxy_flag) { ParmList *l = Getattr(n, "parms"); Hash *throws_hash = NewHash(); String *overloaded_name = getOverloadedName(n); String *imcall = NewString(""); Printf(proxy_class_code, " %s %s(", Getattr(n, "feature:modula3:methodmodifiers"), proxy_class_name); Printv(imcall, " : this(", m3raw_name, ".", Swig_name_construct(NSPACE_TODO, overloaded_name), "(", NIL); /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("m3wraptype", l, NULL); Swig_typemap_attach_parms("m3in", l, NULL); emit_mark_varargs(l); int gencomma = 0; String *tm; Parm *p = l; int i; /* Output each parameter */ for (i = 0; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Modula 3 parameter type */ if ((tm = getMappedType(p, "m3wraptype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i); // Use typemaps to transform type used in Modula 3 wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = getMappedType(p, "in"))) { addThrows(throws_hash, "in", p); substituteClassname(pt, tm); Replaceall(tm, "$input", arg); Printv(imcall, tm, NIL); } /* Add parameter to proxy function */ if (gencomma) Printf(proxy_class_code, ", "); Printf(proxy_class_code, "%s %s", param_type, arg); gencomma = 1; Delete(arg); Delete(param_type); p = Getattr(p, "tmap:in:next"); } Printf(imcall, "), true)"); Printf(proxy_class_code, ")"); Printf(proxy_class_code, "%s", imcall); generateThrowsClause(throws_hash, proxy_class_code); Printf(proxy_class_code, " {\n"); Printf(proxy_class_code, " }\n\n"); if (!gencomma) // We must have a default constructor have_default_constructor_flag = true; Delete(overloaded_name); Delete(imcall); Delete(throws_hash); } return SWIG_OK; } /* ---------------------------------------------------------------------- * destructorHandler() * ---------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); String *symname = Getattr(n, "sym:name"); if (proxy_flag) { Printv(destructor_call, m3raw_name, ".", Swig_name_destroy(NSPACE_TODO, symname), "(swigCPtr)", NIL); } return SWIG_OK; } /* ---------------------------------------------------------------------- * membervariableHandler() * ---------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { //printf("begin membervariableHandler(%s)\n", Char(Getattr(n,"name"))); SwigType *t = Getattr(n, "type"); String *tm; // Get the variable type if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { substituteClassname(t, tm); } variable_name = Getattr(n, "sym:name"); //printf("member variable: %s\n", Char(variable_name)); // Output the property's field declaration and accessor methods Printf(proxy_class_code, " public %s %s {", tm, variable_name); Setattr(n, "modula3:functype", "accessor"); wrapping_member_flag = true; variable_wrapper_flag = true; Language::membervariableHandler(n); wrapping_member_flag = false; variable_wrapper_flag = false; Printf(proxy_class_code, "\n }\n\n"); { String *methods = getMethodDeclarations(n); String *overrides = getAttrString(parentNode(n), "modula3:override"); SwigType *type = Getattr(n, "type"); String *m3name = capitalizeFirst(variable_name); //String *m3name = nameToModula3(variable_name,true); if (!SwigType_isconst(type)) { { String *inmode = getMappedTypeNew(n, "m3wrapinmode", "", false); String *intype = getMappedTypeNew(n, "m3wrapintype", ""); Printf(methods, "set%s(%s val:%s);\n", m3name, (inmode != NIL) ? (const String *) inmode : "", intype); } { /* this was attached by functionWrapper invoked by Language::memberfunctionHandler */ String *fname = Getattr(n, "modula3:setname"); Printf(overrides, "set%s := %s;\n", m3name, fname); } } { { String *outtype = getMappedTypeNew(n, "m3wrapouttype", ""); Printf(methods, "get%s():%s;\n", m3name, outtype); } { /* this was attached by functionWrapper invoked by Language::memberfunctionHandler */ String *fname = Getattr(n, "modula3:getname"); Printf(overrides, "get%s := %s;\n", m3name, fname); } } Delete(m3name); } //printf("end membervariableHandler(%s)\n", Char(Getattr(n,"name"))); return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmembervariableHandler() * ---------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { bool static_const_member_flag = (Getattr(n, "value") == 0); if (static_const_member_flag) { SwigType *t = Getattr(n, "type"); String *tm; // Get the variable type if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { substituteClassname(t, tm); } // Output the property's field declaration and accessor methods Printf(proxy_class_code, " public static %s %s {", tm, Getattr(n, "sym:name")); } variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; static_flag = true; Language::staticmembervariableHandler(n); wrapping_member_flag = false; static_flag = false; if (static_const_member_flag) Printf(proxy_class_code, "\n }\n\n"); return SWIG_OK; } /* ---------------------------------------------------------------------- * memberconstantHandler() * ---------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; Language::memberconstantHandler(n); wrapping_member_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * getOverloadedName() * ----------------------------------------------------------------------------- */ String *getOverloadedName(Node *n) { String *overloaded_name = Copy(Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Printv(overloaded_name, Getattr(n, "sym:overname"), NIL); } return overloaded_name; } /* ----------------------------------------------------------------------------- * emitM3Wrapper() * It is also used for set and get methods of global variables. * ----------------------------------------------------------------------------- */ void emitM3Wrapper(Node *n, const String *func_name) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Hash *throws_hash = NewHash(); int num_exceptions = 0; int num_returns = 0; String *rawcall = NewString(""); String *reccall = NewString(""); String *local_variables = NewString(""); String *local_constants = NewString(""); String *incheck = NewString(""); String *outcheck = NewString(""); String *setup = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); /* don't mix up with 'autark' :-] */ String *storeout = NewString(""); String *result_name = NewString(""); String *return_variables = NewString(""); const char *result_return = "ret"; String *function_code = NewString(""); /*several names for the same function */ String *raw_name = Getattr(n, "name"); /*original C function name */ //String *func_name = Getattr(n,"sym:name"); /*final Modula3 name chosen by the user*/ bool setter_flag = false; int multiretval = GetFlag(n, "feature:modula3:multiretval"); if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("m3wrapargvar", l, NULL); Swig_typemap_attach_parms("m3wrapargconst", l, NULL); Swig_typemap_attach_parms("m3wrapargraw", l, NULL); Swig_typemap_attach_parms("m3wrapargdir", l, NULL); Swig_typemap_attach_parms("m3wrapinmode", l, NULL); Swig_typemap_attach_parms("m3wrapinname", l, NULL); Swig_typemap_attach_parms("m3wrapintype", l, NULL); Swig_typemap_attach_parms("m3wrapindefault", l, NULL); Swig_typemap_attach_parms("m3wrapinconv", l, NULL); Swig_typemap_attach_parms("m3wrapincheck", l, NULL); Swig_typemap_attach_parms("m3wrapoutname", l, NULL); Swig_typemap_attach_parms("m3wrapouttype", l, NULL); Swig_typemap_attach_parms("m3wrapoutconv", l, NULL); Swig_typemap_attach_parms("m3wrapoutcheck", l, NULL); attachMappedType(n, "m3wrapretraw"); attachMappedType(n, "m3wrapretname"); attachMappedType(n, "m3wraprettype"); attachMappedType(n, "m3wrapretvar"); attachMappedType(n, "m3wrapretconv"); attachMappedType(n, "m3wrapretcheck"); Swig_typemap_attach_parms("m3wrapfreearg", l, NULL); /* Swig_typemap_attach_parms("m3wrapargvar:throws", l, NULL); Swig_typemap_attach_parms("m3wrapargraw:throws", l, NULL); Swig_typemap_attach_parms("m3wrapinconv:throws", l, NULL); Swig_typemap_attach_parms("m3wrapincheck:throws", l, NULL); Swig_typemap_attach_parms("m3wrapoutconv:throws", l, NULL); Swig_typemap_attach_parms("m3wrapoutcheck:throws", l, NULL); attachMappedType(n, "m3wrapretvar:throws"); attachMappedType(n, "m3wrapretconv:throws"); attachMappedType(n, "m3wrapretcheck:throws"); Swig_typemap_attach_parms("m3wrapfreearg:throws", l, NULL); */ /* Attach argument names to the parameter list */ /* should be a separate procedure making use of hashes */ attachParameterNames(n, "tmap:m3wrapinname", "autoname", "arg%d"); /* Get return types */ String *result_m3rawtype = Copy(getMappedTypeNew(n, "m3rawrettype", "")); String *result_m3wraptype = Copy(getMappedTypeNew(n, "m3wraprettype", "")); bool has_return_raw = hasContent(result_m3rawtype); bool has_return_m3 = hasContent(result_m3wraptype); if (has_return_m3) { num_returns++; //printf("%s: %s\n", Char(func_name),Char(result_m3wraptype)); } String *arguments = createM3Signature(n); /* Create local variables or RECORD fields for return values and determine return type that might result from a converted VAR argument. */ { writeArgState state; if (multiretval && has_return_m3) { writeArg(return_variables, state, NIL, NewString(result_return), result_m3wraptype, NIL); } Parm *p = skipIgnored(l, "m3wrapouttype"); while (p != NIL) { String *arg = Getattr(p, "tmap:m3wrapoutname"); if (arg == NIL) { arg = Getattr(p, "name"); } String *tm = Getattr(p, "tmap:m3wrapouttype"); if (tm != NIL) { if (isOutParam(p)) { if (!multiretval) { if (num_returns == 0) { Printv(result_name, arg, NIL); Clear(result_m3wraptype); Printv(result_m3wraptype, tm, NIL); } else { Swig_warning(WARN_MODULA3_TYPEMAP_MULTIPLE_RETURN, input_file, line_number, "Typemap m3wrapargdir set to 'out' for %s implies a RETURN value, but the routine %s has already one.\nUse %%multiretval feature.\n", SwigType_str(Getattr(p, "type"), 0), raw_name); } } num_returns++; addImports(m3wrap_intf.import, "m3wrapouttype", p); writeArg(return_variables, state, NIL, arg, tm, NIL); } p = skipIgnored(Getattr(p, "tmap:m3wrapouttype:next"), "m3wrapouttype"); } else { p = nextSibling(p); } } writeArg(return_variables, state, NIL, NIL, NIL, NIL); if (multiretval) { Printv(result_name, Swig_cresult_name(), NIL); Printf(result_m3wraptype, "%sResult", func_name); m3wrap_intf.enterBlock(blocktype); Printf(m3wrap_intf.f, "%s =\nRECORD\n%sEND;\n", result_m3wraptype, return_variables); Printf(local_variables, "%s: %s;\n", result_name, result_m3wraptype); } else { Append(local_variables, return_variables); } } /* Declare local constants e.g. for storing argument names. */ { Parm *p = l; while (p != NIL) { String *arg = Getattr(p, "autoname"); String *tm = Getattr(p, "tmap:m3wrapargconst"); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapargconst", p); Replaceall(tm, "$input", arg); Printv(local_constants, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapargconst:next"); } else { p = nextSibling(p); } } } /* Declare local variables e.g. for converted input values. */ { String *tm = getMappedTypeNew(n, "m3wrapretvar", "", false); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapretvar", n); addThrows(throws_hash, "m3wrapretvar", n); Printv(local_variables, tm, "\n", NIL); } Parm *p = l; while (p != NIL) { String *arg = Getattr(p, "autoname"); tm = Getattr(p, "tmap:m3wrapargvar"); if (tm != NIL) { /* exceptions that may be raised but can't be caught, thus we won't count them in num_exceptions */ addImports(m3wrap_impl.import, "m3wrapargvar", p); addThrows(throws_hash, "m3wrapargvar", p); Replaceall(tm, "$input", arg); Printv(local_variables, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapargvar:next"); } else { p = nextSibling(p); } } } /* Convert input values from Modula 3 to C. */ { Parm *p = l; while (p != NIL) { String *arg = Getattr(p, "autoname"); String *tm = Getattr(p, "tmap:m3wrapinconv"); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapinconv", p); num_exceptions += addThrows(throws_hash, "m3wrapinconv", p); Replaceall(tm, "$input", arg); Printv(setup, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapinconv:next"); } else { p = nextSibling(p); } } } /* Generate checks for input value integrity. */ { Parm *p = l; while (p != NIL) { String *arg = Getattr(p, "autoname"); String *tm = Getattr(p, "tmap:m3wrapincheck"); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapincheck", p); num_exceptions += addThrows(throws_hash, "m3wrapincheck", p); Replaceall(tm, "$input", arg); Printv(incheck, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapincheck:next"); } else { p = nextSibling(p); } } } Printv(rawcall, m3raw_name, ".", func_name, "(", NIL); /* Arguments to the raw C function */ { bool gencomma = false; Parm *p = l; while (p != NIL) { if (gencomma) { Printf(rawcall, ", "); } gencomma = true; addImports(m3wrap_impl.import, "m3wrapargraw", p); num_exceptions += addThrows(throws_hash, "m3wrapargraw", p); String *arg = Getattr(p, "autoname"); String *qualarg = NewString(""); if (!isInParam(p)) { String *tmparg = Getattr(p, "tmap:m3wrapoutname"); if (tmparg != NIL) { arg = tmparg; } if (multiretval /*&& isOutParam(p) - automatically fulfilled */ ) { Printf(qualarg, "%s.", result_name); } } Append(qualarg, arg); Setattr(p, "m3outarg", qualarg); String *tm = Getattr(p, "tmap:m3wrapargraw"); if (tm != NIL) { Replaceall(tm, "$input", arg); Replaceall(tm, "$output", qualarg); Printv(rawcall, tm, NIL); p = Getattr(p, "tmap:m3wrapargraw:next"); } else { //Printv(rawcall, Getattr(p,"lname"), NIL); Printv(rawcall, qualarg, NIL); p = nextSibling(p); } Delete(qualarg); } } Printf(rawcall, ")"); /* Check for error codes and integrity of results */ { String *tm = getMappedTypeNew(n, "m3wrapretcheck", "", false); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapretcheck", n); num_exceptions += addThrows(throws_hash, "m3wrapretcheck", n); Printv(outcheck, tm, "\n", NIL); } Parm *p = l; while (p != NIL) { tm = Getattr(p, "tmap:m3wrapoutcheck"); if (tm != NIL) { String *arg = Getattr(p, "autoname"); String *outarg = Getattr(p, "m3outarg"); addImports(m3wrap_impl.import, "m3wrapoutcheck", p); num_exceptions += addThrows(throws_hash, "m3wrapoutcheck", p); //substituteClassname(Getattr(p,"type"), tm); Replaceall(tm, "$input", arg); Replaceall(tm, "$output", outarg); Printv(outcheck, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapoutcheck:next"); } else { p = nextSibling(p); } } } /* Convert the results to Modula 3 data structures and put them in the record prepared for returning */ { /* m3wrapretconv is processed when it is clear if there is some output conversion and checking code */ Parm *p = l; while (p != NIL) { String *tm = Getattr(p, "tmap:m3wrapoutconv"); if (tm != NIL) { String *arg = Getattr(p, "autoname"); String *outarg = Getattr(p, "m3outarg"); addImports(m3wrap_impl.import, "m3wrapoutconv", n); num_exceptions += addThrows(throws_hash, "m3wrapoutconv", p); //substituteClassname(Getattr(p,"type"), tm); Replaceall(tm, "$input", arg); Replaceall(tm, "$output", outarg); Printf(storeout, "%s := %s;\n", outarg, tm); p = Getattr(p, "tmap:m3wrapoutconv:next"); } else { p = nextSibling(p); } } } /* Generate cleanup code */ { Parm *p = l; while (p != NIL) { String *tm = Getattr(p, "tmap:m3wrapfreearg"); if (tm != NIL) { String *arg = Getattr(p, "autoname"); String *outarg = Getattr(p, "m3outarg"); addImports(m3wrap_impl.import, "m3wrapfreearg", p); num_exceptions += addThrows(throws_hash, "m3wrapfreearg", p); //substituteClassname(Getattr(p,"type"), tm); Replaceall(tm, "$input", arg); Replaceall(tm, "$output", outarg); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapfreearg:next"); } else { p = nextSibling(p); } } } { /* Currently I don't know how a typemap similar to the original 'out' typemap could help returning the return value. */ /* Receive result from call to raw library function */ if (!has_return_raw) { /* rawcall(arg1); result.val := arg1; RETURN result; */ /* rawcall(arg1); RETURN arg1; */ Printf(reccall, "%s;\n", rawcall); if (hasContent(result_name)) { Printf(outarg, "RETURN %s;\n", result_name); } } else { /* arg0 := rawcall(arg1); result.ret := Convert(arg0); result.val := arg1; RETURN result; */ /* arg0 := rawcall(); RETURN Convert(arg0); */ /* RETURN rawcall(); */ String *return_raw = getMappedTypeNew(n, "m3wrapretraw", "", false); String *return_conv = getMappedTypeNew(n, "m3wrapretconv", "", false); /* immediate RETURN would skip result checking */ if ((hasContent(outcheck) || hasContent(storeout) || hasContent(cleanup)) && (!hasContent(result_name)) && (return_raw == NIL)) { Printv(result_name, Swig_cresult_name(), NIL); Printf(local_variables, "%s: %s;\n", result_name, result_m3wraptype); } String *result_lvalue = Copy(result_name); if (multiretval) { Printf(result_lvalue, ".%s", result_return); } if (return_raw != NIL) { Printf(reccall, "%s := %s;\n", return_raw, rawcall); } else if (hasContent(result_name)) { Printf(reccall, "%s := %s;\n", result_lvalue, rawcall); } else { Printf(outarg, "RETURN %s;\n", rawcall); } if (return_conv != NIL) { addImports(m3wrap_impl.import, "m3wrapretconv", n); num_exceptions += addThrows(throws_hash, "m3wrapretconv", n); if (hasContent(result_name)) { Printf(reccall, "%s := %s;\n", result_lvalue, return_conv); Printf(outarg, "RETURN %s;\n", result_name); } else { Printf(outarg, "RETURN %s;\n", return_conv); } } else { if (hasContent(result_name)) { Printf(outarg, "RETURN %s;\n", result_name); } } } } /* Create procedure header */ { String *header = NewStringf("PROCEDURE %s (%s)", func_name, arguments); if ((num_returns > 0) || multiretval) { Printf(header, ": %s", result_m3wraptype); } generateThrowsClause(throws_hash, header); Append(function_code, header); m3wrap_intf.enterBlock(no_block); Printf(m3wrap_intf.f, "%s;\n\n", header); } { String *body = NewStringf("%s%s%s%s%s", incheck, setup, reccall, outcheck, storeout); String *exc_handler; if (hasContent(cleanup) && (num_exceptions > 0)) { exc_handler = NewStringf("TRY\n%sFINALLY\n%sEND;\n", body, cleanup); } else { exc_handler = NewStringf("%s%s", body, cleanup); } Printf(function_code, " =\n%s%s%s%sBEGIN\n%s%sEND %s;\n\n", hasContent(local_constants) ? "CONST\n" : "", local_constants, hasContent(local_variables) ? "VAR\n" : "", local_variables, exc_handler, outarg, func_name); Delete(exc_handler); Delete(body); } m3wrap_impl.enterBlock(no_block); if (proxy_flag && global_variable_flag) { setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(NSPACE_TODO, variable_name)) == 0); // Properties if (setter_flag) { // Setter method String *tm = getMappedTypeNew(n, "m3varin", ""); if (tm != NIL) { if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "true"); } else { Replaceall(tm, "$owner", "false"); } substituteClassname(t, tm); Replaceall(tm, "$rawcall", rawcall); Replaceall(tm, "$vartype", variable_type); /* $type is already replaced by some super class */ Replaceall(tm, "$var", variable_name); Printf(m3wrap_impl.f, "%s", tm); } } else { // Getter method String *tm = getMappedTypeNew(n, "m3varout", ""); if (tm != NIL) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$rawcall", rawcall); Replaceall(tm, "$vartype", variable_type); Replaceall(tm, "$var", variable_name); Printf(m3wrap_impl.f, "%s", tm); } } } else { // Normal function call Printv(m3wrap_impl.f, function_code, NIL); } Delete(arguments); Delete(return_variables); Delete(local_variables); Delete(local_constants); Delete(outarg); Delete(incheck); Delete(outcheck); Delete(setup); Delete(cleanup); Delete(storeout); Delete(function_code); Delete(result_name); Delete(result_m3wraptype); Delete(reccall); Delete(rawcall); Delete(throws_hash); } /*---------------------------------------------------------------------- * replaceSpecialVariables() *--------------------------------------------------------------------*/ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; SwigType *type = Getattr(parm, "type"); substituteClassname(type, tm); } /* ----------------------------------------------------------------------------- * substituteClassname() * * Substitute the special variable $m3classname with the proxy class name for classes/structs/unions * that SWIG knows about. * Otherwise use the $descriptor name for the Modula 3 class name. Note that the $&m3classname substitution * is the same as a $&descriptor substitution, ie one pointer added to descriptor name. * Inputs: * pt - parameter type * tm - typemap contents that might contain the special variable to be replaced * Outputs: * tm - typemap contents complete with the special variable substitution * Return: * substitution_performed - flag indicating if a substitution was performed * ----------------------------------------------------------------------------- */ bool substituteClassname(SwigType *pt, String *tm) { bool substitution_performed = false; if (Strstr(tm, "$m3classname") || Strstr(tm, "$&m3classname")) { String *classname = getProxyName(pt); if (classname) { Replaceall(tm, "$&m3classname", classname); // getProxyName() works for pointers to classes too Replaceall(tm, "$m3classname", classname); } else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. String *descriptor = NULL; SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); if (Strstr(tm, "$&m3classname")) { SwigType_add_pointer(type); descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); Replaceall(tm, "$&m3classname", descriptor); } else { // $m3classname descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); Replaceall(tm, "$m3classname", descriptor); } // Add to hash table so that the type wrapper classes can be created later Setattr(swig_types_hash, descriptor, type); Delete(descriptor); Delete(type); } substitution_performed = true; } return substitution_performed; } /* ----------------------------------------------------------------------------- * attachParameterNames() * * Inputs: * n - Node of a function declaration * tmid - attribute name for overriding C argument names, * e.g. "tmap:m3wrapinname", * don't forget to attach the mapped types before * nameid - attribute for attaching the names, * e.g. "modula3:inname" * fmt - format for the argument name containing %d * e.g. "arg%d" * ----------------------------------------------------------------------------- */ void attachParameterNames(Node *n, const char *tmid, const char *nameid, const char *fmt) { /* Use C parameter name if present and unique, otherwise create an 'arg%d' name */ Hash *hash = NewHash(); Parm *p = Getattr(n, "parms"); int count = 0; while (p != NIL) { String *name = Getattr(p, tmid); if (name == NIL) { name = Getattr(p, "name"); } String *newname; if ((!hasContent(name)) || (Getattr(hash, name) != NIL)) { newname = NewStringf(fmt, count); } else { newname = Copy(name); } if (1 == Setattr(hash, newname, "1")) { Swig_warning(WARN_MODULA3_DOUBLE_ID, input_file, line_number, "Argument '%s' twice.\n", newname); } Setattr(p, nameid, newname); // Delete(newname); p = nextSibling(p); count++; } Delete(hash); } /* ----------------------------------------------------------------------------- * createM3Signature() * * Create signature of M3 wrapper procedure * Call attachParameterNames and attach mapped types before! * m3wrapintype, m3wrapinmode, m3wrapindefault * ----------------------------------------------------------------------------- */ String *createM3Signature(Node *n) { String *arguments = NewString(""); Parm *p = skipIgnored(Getattr(n, "parms"), "m3wrapintype"); writeArgState state; while (p != NIL) { /* Get the M3 parameter type */ String *tm = getMappedType(p, "m3wrapintype"); if (tm != NIL) { if (isInParam(p)) { addImports(m3wrap_intf.import, "m3wrapintype", p); addImports(m3wrap_impl.import, "m3wrapintype", p); String *mode = Getattr(p, "tmap:m3wrapinmode"); String *deflt = Getattr(p, "tmap:m3wrapindefault"); String *arg = Getattr(p, "autoname"); SwigType *pt = Getattr(p, "type"); substituteClassname(pt, tm); /* do we need this ? */ writeArg(arguments, state, mode, arg, tm, deflt); } p = skipIgnored(Getattr(p, "tmap:m3wrapintype:next"), "m3wrapintype"); } else { p = nextSibling(p); } } writeArg(arguments, state, NIL, NIL, NIL, NIL); return (arguments); } /* not used any longer - try SwigType_str if required again */ #if 0 /* ----------------------------------------------------------------------------- * createCSignature() * * Create signature of C function * ----------------------------------------------------------------------------- */ String *createCSignature(Node *n) { String *arguments = NewString(""); bool gencomma = false; Node *p; for (p = Getattr(n, "parms"); p != NIL; p = nextSibling(p)) { if (gencomma) { Append(arguments, ","); } gencomma = true; String *type = Getattr(p, "type"); String *ctype = getMappedTypeNew(type, "ctype"); Append(arguments, ctype); } return arguments; } #endif /* ----------------------------------------------------------------------------- * emitTypeWrapperClass() * ----------------------------------------------------------------------------- */ void emitTypeWrapperClass(String *classname, SwigType *type) { Node *n = NewHash(); Setfile(n, input_file); Setline(n, line_number); String *filen = NewStringf("%s%s.m3", SWIG_output_directory(), classname); File *f_swigtype = NewFile(filen, "w", SWIG_output_files()); if (!f_swigtype) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } String *swigtype = NewString(""); // Emit banner name emitBanner(f_swigtype); // Pure Modula 3 baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "m3base", type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "m3interfaces", type, WARN_NONE); // Emit the class Printv(swigtype, typemapLookup(n, "m3imports", type, WARN_NONE), // Import statements "\n", typemapLookup(n, "m3classmodifiers", type, WARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " class $m3classname", // Class name and bases *Char(pure_baseclass) ? " : " : "", pure_baseclass, *Char(pure_interfaces) ? // Interfaces " : " : "", pure_interfaces, " {\n", " private IntPtr swigCPtr;\n", "\n", " ", typemapLookup(n, "m3ptrconstructormodifiers", type, WARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF), // pointer constructor modifiers " $m3classname(IntPtr cPtr, bool bFutureUse) {\n", // Constructor used for wrapping pointers " swigCPtr = cPtr;\n", " }\n", "\n", " protected $m3classname() {\n", // Default constructor " swigCPtr = IntPtr.Zero;\n", " }\n", typemapLookup(n, "m3getcptr", type, WARN_MODULA3_TYPEMAP_GETCPTR_UNDEF), // getCPtr method typemapLookup(n, "m3code", type, WARN_NONE), // extra Modula 3 code "}\n", "\n", NIL); Replaceall(swigtype, "$m3classname", classname); Printv(f_swigtype, swigtype, NIL); Delete(f_swigtype); Delete(filen); Delete(swigtype); } /* ----------------------------------------------------------------------------- * typemapLookup() * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * warning - warning number to issue if no typemaps found * typemap_attributes - the typemap attributes are attached to this node and will * also be used for temporary storage if non null * return is never NULL, unlike Swig_typemap_lookup() * ----------------------------------------------------------------------------- */ const String *typemapLookup(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) { Node *node = !typemap_attributes ? NewHash() : typemap_attributes; Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); if (!tm) { tm = empty_string; if (warning != WARN_NONE) Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); } if (!typemap_attributes) Delete(node); return tm; } /* ----------------------------------------------------------------------------- * addThrows() * * Add all exceptions to a hash that are associated with the 'typemap'. * Return number the number of these exceptions. * ----------------------------------------------------------------------------- */ int addThrows(Hash *throws_hash, const String *typemap, Node *parameter) { // Get the comma separated throws clause - held in "throws" attribute in the typemap passed in int len = 0; String *throws_attribute = NewStringf("%s:throws", typemap); addImports(m3wrap_intf.import, throws_attribute, parameter); addImports(m3wrap_impl.import, throws_attribute, parameter); String *throws = getMappedTypeNew(parameter, Char(throws_attribute), "", false); //printf("got exceptions %s for %s\n", Char(throws), Char(throws_attribute)); if (throws) { // Put the exception classes in the throws clause into a temporary List List *temp_classes_list = Split(throws, ',', INT_MAX); len = Len(temp_classes_list); // Add the exception classes to the node throws list, but don't duplicate if already in list if (temp_classes_list /*&& hasContent(temp_classes_list) */ ) { for (Iterator cls = First(temp_classes_list); cls.item != NIL; cls = Next(cls)) { String *exception_class = NewString(cls.item); Replaceall(exception_class, " ", ""); // remove spaces Replaceall(exception_class, "\t", ""); // remove tabs if (hasContent(exception_class)) { // $m3classname substitution SwigType *pt = Getattr(parameter, "type"); substituteClassname(pt, exception_class); // Don't duplicate the exception class in the throws clause //printf("add exception %s\n", Char(exception_class)); Setattr(throws_hash, exception_class, "1"); } Delete(exception_class); } } Delete(temp_classes_list); } Delete(throws_attribute); return len; } /* ----------------------------------------------------------------------------- * generateThrowsClause() * ----------------------------------------------------------------------------- */ void generateThrowsClause(Hash *throws_hash, String *code) { // Add the throws clause into code if (Len(throws_hash) > 0) { Iterator cls = First(throws_hash); Printf(code, " RAISES {%s", cls.key); for (cls = Next(cls); cls.key != NIL; cls = Next(cls)) { Printf(code, ", %s", cls.key); } Printf(code, "}"); } } /* ----------------------------------------------------------------------------- * addImports() * * Add all imports that are needed for contents of 'typemap'. * ----------------------------------------------------------------------------- */ void addImports(Hash *imports_hash, const String *typemap, Node *node) { // Get the comma separated throws clause - held in "throws" attribute in the typemap passed in String *imports_attribute = NewStringf("%s:import", typemap); String *imports = getMappedTypeNew(node, Char(imports_attribute), "", false); //printf("got imports %s for %s\n", Char(imports), Char(imports_attribute)); if (imports != NIL) { List *import_list = Split(imports, ',', INT_MAX); // Add the exception classes to the node imports list, but don't duplicate if already in list if (import_list != NIL) { for (Iterator imp = First(import_list); imp.item != NIL; imp = Next(imp)) { List *import_pair = Split(imp.item, ' ', 3); if (Len(import_pair) == 1) { Setattr(imports_hash, Getitem(import_pair, 0), ""); } else if ((Len(import_pair) == 3) && Strcmp(Getitem(import_pair, 1), "AS") == 0) { Setattr(imports_hash, Getitem(import_pair, 0), Getitem(import_pair, 2)); } else { Swig_warning(WARN_MODULA3_BAD_IMPORT, input_file, line_number, "Malformed import '%s' for typemap '%s' defined for type '%s'\n", imp, typemap, SwigType_str(Getattr(node, "type"), 0)); } Delete(import_pair); } } Delete(import_list); } Delete(imports_attribute); } /* ----------------------------------------------------------------------------- * emitImportStatements() * ----------------------------------------------------------------------------- */ void emitImportStatements(Hash *imports_hash, String *code) { // Add the imports statements into code Iterator imp = First(imports_hash); while (imp.key != NIL) { Printf(code, "IMPORT %s", imp.key); String *imp_as = imp.item; if (hasContent(imp_as)) { Printf(code, " AS %s", imp_as); } Printf(code, ";\n"); imp = Next(imp); } } }; /* class MODULA3 */ /* ----------------------------------------------------------------------------- * swig_modula3() - Instantiate module * ----------------------------------------------------------------------------- */ extern "C" Language *swig_modula3(void) { return new MODULA3(); } /* ----------------------------------------------------------------------------- * Static member variables * ----------------------------------------------------------------------------- */ const char *MODULA3::usage = "\ Modula 3 Options (available with -modula3)\n\ -generateconst - Generate code for computing numeric values of constants\n\ -generaterename - Generate suggestions for %rename\n\ -generatetypemap - Generate templates for some basic typemaps\n\ -oldvarnames - Old intermediary method names for variable wrappers\n\ \n"; /* -generateconst - stem of the .c source file for computing the numeric values of constants\n\ -generaterename - stem of the .i source file containing %rename suggestions\n\ -generatetypemap - stem of the .i source file containing typemap patterns\n\ */ swig-4.0.2/Source/Modules/nested.cxx0000644000175000017500000003013513667507523017242 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * nested.cxx * * Nested structs support * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" // Nested classes processing section static Hash *classhash = 0; static String *make_name(Node *n, String *name, SwigType *decl) { int destructor = name && (*(Char(name)) == '~'); if (String *yyrename = Getattr(n, "class_rename")) { String *s = NewString(yyrename); Delattr(n, "class_rename"); if (destructor && (*(Char(s)) != '~')) { Insert(s, 0, "~"); } return s; } if (!name) return 0; return Swig_name_make(n, 0, name, decl, 0); } // C version of add_symbols() static void add_symbols_c(Node *n) { String *decl; String *wrn = 0; String *symname = 0; int iscdecl = Cmp(nodeType(n), "cdecl") == 0; Setattr(n, "ismember", "1"); Setattr(n, "access", "public"); if (Getattr(n, "sym:name")) return; decl = Getattr(n, "decl"); if (!SwigType_isfunction(decl)) { String *name = Getattr(n, "name"); String *makename = Getattr(n, "parser:makename"); if (iscdecl) { String *storage = Getattr(n, "storage"); if (Cmp(storage, "typedef") == 0) { Setattr(n, "kind", "typedef"); } else { SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); Setattr(n, "kind", "variable"); if (value && Len(value)) { Setattr(n, "hasvalue", "1"); } if (type) { SwigType *ty; SwigType *tmp = 0; if (decl) { ty = tmp = Copy(type); SwigType_push(ty, decl); } else { ty = type; } if (!SwigType_ismutable(ty)) { SetFlag(n, "hasconsttype"); SetFlag(n, "feature:immutable"); } if (tmp) Delete(tmp); } if (!type) { Printf(stderr, "notype name %s\n", name); } } } Swig_features_get(Swig_cparse_features(), 0, name, 0, n); if (makename) { symname = make_name(n, makename, 0); Delattr(n, "parser:makename"); /* temporary information, don't leave it hanging around */ } else { makename = name; symname = make_name(n, makename, 0); } if (!symname) { symname = Copy(Getattr(n, "unnamed")); } if (symname) { wrn = Swig_name_warning(n, 0, symname, 0); } } else { String *name = Getattr(n, "name"); SwigType *fdecl = Copy(decl); SwigType *fun = SwigType_pop_function(fdecl); if (iscdecl) { Setattr(n, "kind", "function"); } Swig_features_get(Swig_cparse_features(), 0, name, fun, n); symname = make_name(n, name, fun); wrn = Swig_name_warning(n, 0, symname, fun); Delete(fdecl); Delete(fun); } if (!symname) return; if (GetFlag(n, "feature:ignore")) { /* Only add to C symbol table and continue */ Swig_symbol_add(0, n); } else if (strncmp(Char(symname), "$ignore", 7) == 0) { char *c = Char(symname) + 7; SetFlag(n, "feature:ignore"); if (strlen(c)) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0, Getfile(n), Getline(n), "%s\n", c + 1); SWIG_WARN_NODE_END(n); } Swig_symbol_add(0, n); } else { Node *c; if ((wrn) && (Len(wrn))) { String *metaname = symname; if (!Getmeta(metaname, "already_warned")) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0, Getfile(n), Getline(n), "%s\n", wrn); SWIG_WARN_NODE_END(n); Setmeta(metaname, "already_warned", "1"); } } c = Swig_symbol_add(symname, n); if (c != n) { /* symbol conflict attempting to add in the new symbol */ if (Getattr(n, "sym:weak")) { Setattr(n, "sym:name", symname); } else { String *e = NewStringEmpty(); String *en = NewStringEmpty(); String *ec = NewStringEmpty(); int redefined = Swig_need_redefined_warn(n, c, true); if (redefined) { Printf(en, "Identifier '%s' redefined (ignored)", symname); Printf(ec, "previous definition of '%s'", symname); } else { Printf(en, "Redundant redeclaration of '%s'", symname); Printf(ec, "previous declaration of '%s'", symname); } if (Cmp(symname, Getattr(n, "name"))) { Printf(en, " (Renamed from '%s')", SwigType_namestr(Getattr(n, "name"))); } Printf(en, ","); if (Cmp(symname, Getattr(c, "name"))) { Printf(ec, " (Renamed from '%s')", SwigType_namestr(Getattr(c, "name"))); } Printf(ec, "."); SWIG_WARN_NODE_BEGIN(n); if (redefined) { Swig_warning(WARN_PARSE_REDEFINED, Getfile(n), Getline(n), "%s\n", en); Swig_warning(WARN_PARSE_REDEFINED, Getfile(c), Getline(c), "%s\n", ec); } else { Swig_warning(WARN_PARSE_REDUNDANT, Getfile(n), Getline(n), "%s\n", en); Swig_warning(WARN_PARSE_REDUNDANT, Getfile(c), Getline(c), "%s\n", ec); } SWIG_WARN_NODE_END(n); Printf(e, "%s:%d:%s\n%s:%d:%s\n", Getfile(n), Getline(n), en, Getfile(c), Getline(c), ec); Setattr(n, "error", e); Delete(e); Delete(en); Delete(ec); } } } Delete(symname); } /* Strips C-style and C++-style comments from string in-place. */ static void strip_comments(char *string) { int state = 0; /* * 0 - not in comment * 1 - in c-style comment * 2 - in c++-style comment * 3 - in string * 4 - after reading / not in comments * 5 - after reading * in c-style comments * 6 - after reading \ in strings */ char *c = string; while (*c) { switch (state) { case 0: if (*c == '\"') state = 3; else if (*c == '/') state = 4; break; case 1: if (*c == '*') state = 5; *c = ' '; break; case 2: if (*c == '\n') state = 0; else *c = ' '; break; case 3: if (*c == '\"') state = 0; else if (*c == '\\') state = 6; break; case 4: if (*c == '/') { *(c - 1) = ' '; *c = ' '; state = 2; } else if (*c == '*') { *(c - 1) = ' '; *c = ' '; state = 1; } else state = 0; break; case 5: if (*c == '/') state = 0; else state = 1; *c = ' '; break; case 6: state = 3; break; } ++c; } } // Create a %insert with a typedef to make a new name visible to C static Node *create_insert(Node *n, bool noTypedef = false) { // format a typedef String *ccode = Getattr(n, "code"); Push(ccode, " "); if (noTypedef) { Push(ccode, Getattr(n, "name")); Push(ccode, " "); Push(ccode, Getattr(n, "kind")); } else { Push(ccode, Getattr(n, "kind")); Push(ccode, "typedef "); Append(ccode, " "); Append(ccode, Getattr(n, "tdname")); } Append(ccode, ";"); /* Strip comments - further code may break in presence of comments. */ strip_comments(Char(ccode)); /* Make all SWIG created typedef structs/unions/classes unnamed else redefinition errors occur - nasty hack alert. */ if (!noTypedef) { const char *types_array[3] = { "struct", "union", "class" }; for (int i = 0; i < 3; i++) { char *code_ptr = Char(ccode); while (code_ptr) { /* Replace struct name (as in 'struct name {...}' ) with whitespace name will be between struct and opening brace */ code_ptr = strstr(code_ptr, types_array[i]); if (code_ptr) { char *open_bracket_pos; code_ptr += strlen(types_array[i]); open_bracket_pos = strchr(code_ptr, '{'); if (open_bracket_pos) { /* Make sure we don't have something like struct A a; */ char *semi_colon_pos = strchr(code_ptr, ';'); if (!(semi_colon_pos && (semi_colon_pos < open_bracket_pos))) while (code_ptr < open_bracket_pos) *code_ptr++ = ' '; } } } } } { /* Remove SWIG directive %constant which may be left in the SWIG created typedefs */ char *code_ptr = Char(ccode); while (code_ptr) { code_ptr = strstr(code_ptr, "%constant"); if (code_ptr) { char *directive_end_pos = strchr(code_ptr, ';'); if (directive_end_pos) { while (code_ptr <= directive_end_pos) *code_ptr++ = ' '; } } } } Node *newnode = NewHash(); set_nodeType(newnode, "insert"); Setfile(newnode, Getfile(n)); Setline(newnode, Getline(n)); String *code = NewStringEmpty(); Wrapper_pretty_print(ccode, code); Setattr(newnode, "code", code); Delete(code); Delattr(n, "code"); return newnode; } static void insertNodeAfter(Node *n, Node *c) { Node *g = parentNode(n); set_parentNode(c, g); Node *ns = nextSibling(n); if (Node *outer = Getattr(c, "nested:outer")) { while (ns && outer == Getattr(ns, "nested:outer")) { n = ns; ns = nextSibling(n); } } if (!ns) { set_lastChild(g, c); } else { set_nextSibling(c, ns); set_previousSibling(ns, c); } set_nextSibling(n, c); set_previousSibling(c, n); } void Swig_nested_name_unnamed_c_structs(Node *n) { if (!n) return; if (!classhash) classhash = Getattr(n, "classes"); Node *c = firstChild(n); while (c) { Node *next = nextSibling(c); if (String *declName = Getattr(c, "nested:unnamed")) { if (Node *outer = Getattr(c, "nested:outer")) { // generate a name String *name = NewStringf("%s_%s", Getattr(outer, "name"), declName); Delattr(c, "nested:unnamed"); // set the name to the class and symbol table Setattr(c, "tdname", name); Setattr(c, "name", name); Swig_symbol_setscope(Getattr(c, "symtab")); Swig_symbol_setscopename(name); // now that we have a name - gather base symbols if (List *publicBases = Getattr(c, "baselist")) { List *bases = Swig_make_inherit_list(name, publicBases, 0); Swig_inherit_base_symbols(bases); Delete(bases); } Setattr(classhash, name, c); // Merge the extension into the symbol table if (Node *am = Getattr(Swig_extend_hash(), name)) { Swig_extend_merge(c, am); Swig_extend_append_previous(c, am); Delattr(Swig_extend_hash(), name); } Swig_symbol_popscope(); // process declarations following this type (assign correct new type) SwigType *ty = Copy(name); Node *decl = nextSibling(c); List *declList = NewList(); while (decl && Getattr(decl, "nested:unnamedtype") == c) { Setattr(decl, "type", ty); Append(declList, decl); Delattr(decl, "nested:unnamedtype"); SetFlag(decl, "feature:immutable"); add_symbols_c(decl); decl = nextSibling(decl); } Delete(ty); Swig_symbol_setscope(Swig_symbol_global_scope()); add_symbols_c(c); Node *ins = create_insert(c); insertNodeAfter(c, ins); removeNode(c); insertNodeAfter(n, c); Delete(ins); Delattr(c, "nested:outer"); } else { // global unnamed struct - ignore it and it's instances SetFlag(c, "feature:ignore"); while (next && Getattr(next, "nested:unnamedtype") == c) { SetFlag(next, "feature:ignore"); next = nextSibling(next); } c = next; continue; } } else if (cparse_cplusplusout) { if (Getattr(c, "nested:outer")) { Node *ins = create_insert(c, true); insertNodeAfter(c, ins); Delete(ins); Delattr(c, "nested:outer"); } } // process children Swig_nested_name_unnamed_c_structs(c); c = next; } } static void remove_outer_class_reference(Node *n) { for (Node *c = firstChild(n); c; c = nextSibling(c)) { if (GetFlag(c, "feature:flatnested") || Language::instance()->nestedClassesSupport() == Language::NCS_None) { Delattr(c, "nested:outer"); remove_outer_class_reference(c); } } } void Swig_nested_process_classes(Node *n) { if (!n) return; Node *c = firstChild(n); while (c) { Node *next = nextSibling(c); if (!Getattr(c, "templatetype")) { if (GetFlag(c, "nested") && (GetFlag(c, "feature:flatnested") || Language::instance()->nestedClassesSupport() == Language::NCS_None)) { removeNode(c); if (!checkAttribute(c, "access", "public")) SetFlag(c, "feature:ignore"); else if (Strcmp(nodeType(n),"extend") == 0 && Strcmp(nodeType(parentNode(n)),"class") == 0) insertNodeAfter(parentNode(n), c); else insertNodeAfter(n, c); } Swig_nested_process_classes(c); } c = next; } remove_outer_class_reference(n); } swig-4.0.2/Source/Modules/allocate.cxx0000644000175000017500000007426213667507523017555 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * allocate.cxx * * This module tries to figure out which classes and structures support * default constructors and destructors in C++. There are several rules that * define this behavior including pure abstract methods, private sections, * and non-default constructors in base classes. See the ARM or * Doc/Manual/SWIGPlus.html for details. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" static int virtual_elimination_mode = 0; /* set to 0 on default */ /* Set virtual_elimination_mode */ void Wrapper_virtual_elimination_mode_set(int flag) { virtual_elimination_mode = flag; } /* Helper function to assist with abstract class checking. This is a major hack. Sorry. */ extern "C" { static String *search_decl = 0; /* Declarator being searched */ static int check_implemented(Node *n) { String *decl; if (!n) return 0; while (n) { if (Strcmp(nodeType(n), "cdecl") == 0) { decl = Getattr(n, "decl"); if (SwigType_isfunction(decl)) { SwigType *decl1 = SwigType_typedef_resolve_all(decl); SwigType *decl2 = SwigType_pop_function(decl1); if (Strcmp(decl2, search_decl) == 0) { if (!GetFlag(n, "abstract")) { Delete(decl1); Delete(decl2); return 1; } } Delete(decl1); Delete(decl2); } } n = Getattr(n, "csym:nextSibling"); } return 0; } } class Allocate:public Dispatcher { Node *inclass; int extendmode; /* Checks if a function, n, is the same as any in the base class, ie if the method is polymorphic. * Also checks for methods which will be hidden (ie a base has an identical non-virtual method). * Both methods must have public access for a match to occur. */ int function_is_defined_in_bases(Node *n, Node *bases) { if (!bases) return 0; String *this_decl = Getattr(n, "decl"); if (!this_decl) return 0; String *name = Getattr(n, "name"); String *this_type = Getattr(n, "type"); String *resolved_decl = SwigType_typedef_resolve_all(this_decl); // Search all base classes for methods with same signature for (int i = 0; i < Len(bases); i++) { Node *b = Getitem(bases, i); Node *base = firstChild(b); while (base) { if (Strcmp(nodeType(base), "extend") == 0) { // Loop through all the %extend methods Node *extend = firstChild(base); while (extend) { if (function_is_defined_in_bases_seek(n, b, extend, this_decl, name, this_type, resolved_decl)) { Delete(resolved_decl); return 1; } extend = nextSibling(extend); } } else if (Strcmp(nodeType(base), "using") == 0) { // Loop through all the using declaration methods Node *usingdecl = firstChild(base); while (usingdecl) { if (function_is_defined_in_bases_seek(n, b, usingdecl, this_decl, name, this_type, resolved_decl)) { Delete(resolved_decl); return 1; } usingdecl = nextSibling(usingdecl); } } else { // normal methods if (function_is_defined_in_bases_seek(n, b, base, this_decl, name, this_type, resolved_decl)) { Delete(resolved_decl); return 1; } } base = nextSibling(base); } } Delete(resolved_decl); resolved_decl = 0; for (int j = 0; j < Len(bases); j++) { Node *b = Getitem(bases, j); if (function_is_defined_in_bases(n, Getattr(b, "allbases"))) return 1; } return 0; } /* Helper function for function_is_defined_in_bases */ int function_is_defined_in_bases_seek(Node *n, Node *b, Node *base, String *this_decl, String *name, String *this_type, String *resolved_decl) { String *base_decl = Getattr(base, "decl"); SwigType *base_type = Getattr(base, "type"); if (base_decl && base_type) { if (checkAttribute(base, "name", name) && !GetFlag(b, "feature:ignore") /* whole class is ignored */ ) { if (SwigType_isfunction(resolved_decl) && SwigType_isfunction(base_decl)) { // We have found a method that has the same name as one in a base class bool covariant_returntype = false; bool returntype_match = Strcmp(base_type, this_type) == 0 ? true : false; bool decl_match = Strcmp(base_decl, this_decl) == 0 ? true : false; if (returntype_match && decl_match) { // Exact match - we have found a method with identical signature // No typedef resolution was done, but skipping it speeds things up slightly } else { // Either we have: // 1) matching methods but are one of them uses a different typedef (return type or parameter) to the one in base class' method // 2) matching polymorphic methods with covariant return type // 3) a non-matching method (ie an overloaded method of some sort) // 4) a matching method which is not polymorphic, ie it hides the base class' method // Check if fully resolved return types match (including // covariant return types) if (!returntype_match) { String *this_returntype = function_return_type(n); String *base_returntype = function_return_type(base); returntype_match = Strcmp(this_returntype, base_returntype) == 0 ? true : false; if (!returntype_match) { covariant_returntype = SwigType_issubtype(this_returntype, base_returntype) ? true : false; returntype_match = covariant_returntype; } Delete(this_returntype); Delete(base_returntype); } // The return types must match at this point, for the whole method to match if (returntype_match && !decl_match) { // Now need to check the parameter list // First do an inexpensive parameter count ParmList *this_parms = Getattr(n, "parms"); ParmList *base_parms = Getattr(base, "parms"); if (ParmList_len(this_parms) == ParmList_len(base_parms)) { // Number of parameters are the same, now check that all the parameters match SwigType *base_fn = NewString(""); SwigType *this_fn = NewString(""); SwigType_add_function(base_fn, base_parms); SwigType_add_function(this_fn, this_parms); base_fn = SwigType_typedef_resolve_all(base_fn); this_fn = SwigType_typedef_resolve_all(this_fn); if (Strcmp(base_fn, this_fn) == 0) { // Finally check that the qualifiers match int base_qualifier = SwigType_isqualifier(resolved_decl); int this_qualifier = SwigType_isqualifier(base_decl); if (base_qualifier == this_qualifier) { decl_match = true; } } Delete(base_fn); Delete(this_fn); } } } //Printf(stderr,"look %s %s %d %d\n",base_decl, this_decl, returntype_match, decl_match); if (decl_match && returntype_match) { // Found an identical method in the base class bool this_wrapping_protected_members = is_member_director(n) ? true : false; // This should really check for dirprot rather than just being a director method bool base_wrapping_protected_members = is_member_director(base) ? true : false; // This should really check for dirprot rather than just being a director method bool both_have_public_access = is_public(n) && is_public(base); bool both_have_protected_access = (is_protected(n) && this_wrapping_protected_members) && (is_protected(base) && base_wrapping_protected_members); bool both_have_private_access = is_private(n) && is_private(base); if (checkAttribute(base, "storage", "virtual")) { // Found a polymorphic method. // Mark the polymorphic method, in case the virtual keyword was not used. Setattr(n, "storage", "virtual"); if (!Getattr(b, "feature:interface")) { // interface implementation neither hides nor overrides if (both_have_public_access || both_have_protected_access) { if (!is_non_public_base(inclass, b)) Setattr(n, "override", base); // Note C# definition of override, ie access must be the same } else if (!both_have_private_access) { // Different access if (this_wrapping_protected_members || base_wrapping_protected_members) if (!is_non_public_base(inclass, b)) Setattr(n, "hides", base); // Note C# definition of hiding, ie hidden if access is different } } // Try and find the most base's covariant return type SwigType *most_base_covariant_type = Getattr(base, "covariant"); if (!most_base_covariant_type && covariant_returntype) most_base_covariant_type = function_return_type(base, false); if (!most_base_covariant_type) { // Eliminate the derived virtual method. if (virtual_elimination_mode && !is_member_director(n)) if (both_have_public_access) if (!is_non_public_base(inclass, b)) if (!Swig_symbol_isoverloaded(n)) { // Don't eliminate if an overloaded method as this hides the method // in the scripting languages: the dispatch function will hide the base method if ignored. SetFlag(n, "feature:ignore"); } } else { // Some languages need to know about covariant return types Setattr(n, "covariant", most_base_covariant_type); } } else { // Found an identical method in the base class, but it is not polymorphic. if (both_have_public_access || both_have_protected_access) if (!is_non_public_base(inclass, b)) Setattr(n, "hides", base); } if (both_have_public_access || both_have_protected_access) return 1; } } } } return 0; } /* Determines whether the base class, b, is in the list of private * or protected base classes for class n. */ bool is_non_public_base(Node *n, Node *b) { bool non_public_base = false; Node *bases = Getattr(n, "privatebases"); if (bases) { for (int i = 0; i < Len(bases); i++) { Node *base = Getitem(bases, i); if (base == b) non_public_base = true; } } bases = Getattr(n, "protectedbases"); if (bases) { for (int i = 0; i < Len(bases); i++) { Node *base = Getitem(bases, i); if (base == b) non_public_base = true; } } return non_public_base; } /* Returns the return type for a function. The node n should be a function. If resolve is true the fully returned type is fully resolved. Caller is responsible for deleting returned string. */ String *function_return_type(Node *n, bool resolve = true) { String *decl = Getattr(n, "decl"); SwigType *type = Getattr(n, "type"); String *ty = NewString(type); SwigType_push(ty, decl); if (SwigType_isqualifier(ty)) Delete(SwigType_pop(ty)); Delete(SwigType_pop_function(ty)); if (resolve) { String *unresolved = ty; ty = SwigType_typedef_resolve_all(unresolved); Delete(unresolved); } return ty; } /* Checks if a class member is the same as inherited from the class bases */ int class_member_is_defined_in_bases(Node *member, Node *classnode) { Node *bases; /* bases is the closest ancestors of classnode */ int defined = 0; bases = Getattr(classnode, "allbases"); if (!bases) return 0; { int old_mode = virtual_elimination_mode; if (is_member_director(classnode, member)) virtual_elimination_mode = 0; if (function_is_defined_in_bases(member, bases)) { defined = 1; } virtual_elimination_mode = old_mode; } if (defined) return 1; else return 0; } /* Checks to see if a class is abstract through inheritance, and saves the first node that seems to be abstract. */ int is_abstract_inherit(Node *n, Node *base = 0, int first = 0) { if (!first && (base == n)) return 0; if (!base) { /* Root node */ Symtab *stab = Getattr(n, "symtab"); /* Get symbol table for node */ Symtab *oldtab = Swig_symbol_setscope(stab); int ret = is_abstract_inherit(n, n, 1); Swig_symbol_setscope(oldtab); return ret; } List *abstracts = Getattr(base, "abstracts"); if (abstracts) { int dabstract = 0; int len = Len(abstracts); for (int i = 0; i < len; i++) { Node *nn = Getitem(abstracts, i); String *name = Getattr(nn, "name"); if (!name) continue; if (Strchr(name, '~')) continue; /* Don't care about destructors */ String *base_decl = Getattr(nn, "decl"); if (base_decl) base_decl = SwigType_typedef_resolve_all(base_decl); if (SwigType_isfunction(base_decl)) search_decl = SwigType_pop_function(base_decl); Node *dn = Swig_symbol_clookup_local_check(name, 0, check_implemented); Delete(search_decl); Delete(base_decl); if (!dn) { List *nabstracts = Getattr(n, "abstracts"); if (!nabstracts) { nabstracts = NewList(); Setattr(n, "abstracts", nabstracts); Delete(nabstracts); } Append(nabstracts, nn); if (!Getattr(n, "abstracts:firstnode")) { Setattr(n, "abstracts:firstnode", nn); } dabstract = base != n; } } if (dabstract) return 1; } List *bases = Getattr(base, "allbases"); if (!bases) return 0; for (int i = 0; i < Len(bases); i++) { if (is_abstract_inherit(n, Getitem(bases, i))) { return 1; } } return 0; } /* Grab methods used by smart pointers */ List *smart_pointer_methods(Node *cls, List *methods, int isconst, String *classname = 0) { if (!methods) { methods = NewList(); } Node *c = firstChild(cls); while (c) { if (Getattr(c, "error") || GetFlag(c, "feature:ignore")) { c = nextSibling(c); continue; } if (!isconst && (Strcmp(nodeType(c), "extend") == 0)) { methods = smart_pointer_methods(c, methods, isconst, Getattr(cls, "name")); } else if (Strcmp(nodeType(c), "cdecl") == 0) { if (!GetFlag(c, "feature:ignore")) { String *storage = Getattr(c, "storage"); if (!((Cmp(storage, "typedef") == 0)) && !((Cmp(storage, "friend") == 0))) { String *name = Getattr(c, "name"); String *symname = Getattr(c, "sym:name"); Node *e = Swig_symbol_clookup_local(name, 0); if (e && is_public(e) && !GetFlag(e, "feature:ignore") && (Cmp(symname, Getattr(e, "sym:name")) == 0)) { Swig_warning(WARN_LANG_DEREF_SHADOW, Getfile(e), Getline(e), "Declaration of '%s' shadows declaration accessible via operator->(),\n", name); Swig_warning(WARN_LANG_DEREF_SHADOW, Getfile(c), Getline(c), "previous declaration of '%s'.\n", name); } else { /* Make sure node with same name doesn't already exist */ int k; int match = 0; for (k = 0; k < Len(methods); k++) { e = Getitem(methods, k); if (Cmp(symname, Getattr(e, "sym:name")) == 0) { match = 1; break; } if (!Getattr(e, "sym:name") && (Cmp(name, Getattr(e, "name")) == 0)) { match = 1; break; } } if (!match) { Node *cc = c; while (cc) { Node *cp = cc; if (classname) { Setattr(cp, "extendsmartclassname", classname); } Setattr(cp, "allocate:smartpointeraccess", "1"); /* If constant, we have to be careful */ if (isconst) { SwigType *decl = Getattr(cp, "decl"); if (decl) { if (SwigType_isfunction(decl)) { /* If method, we only add if it's a const method */ if (SwigType_isconst(decl)) { Append(methods, cp); } } else { Append(methods, cp); } } else { Append(methods, cp); } } else { Append(methods, cp); } cc = Getattr(cc, "sym:nextSibling"); } } } } } } c = nextSibling(c); } /* Look for methods in base classes */ { Node *bases = Getattr(cls, "bases"); int k; for (k = 0; k < Len(bases); k++) { smart_pointer_methods(Getitem(bases, k), methods, isconst); } } /* Remove protected/private members */ { for (int i = 0; i < Len(methods);) { Node *n = Getitem(methods, i); if (!is_public(n)) { Delitem(methods, i); continue; } i++; } } return methods; } void mark_exception_classes(ParmList *p) { while (p) { SwigType *ty = Getattr(p, "type"); SwigType *t = SwigType_typedef_resolve_all(ty); if (SwigType_isreference(t) || SwigType_ispointer(t) || SwigType_isarray(t)) { Delete(SwigType_pop(t)); } Node *c = Swig_symbol_clookup(t, 0); if (c) { if (!GetFlag(c, "feature:exceptionclass")) { SetFlag(c, "feature:exceptionclass"); } } p = nextSibling(p); Delete(t); } } void process_exceptions(Node *n) { ParmList *catchlist = 0; /* the "catchlist" attribute is used to emit the block try {$action;} catch ; in emit.cxx and is either constructed from the "feature:catches" feature or copied from the node "throws" list. */ String *scatchlist = Getattr(n, "feature:catches"); if (scatchlist) { catchlist = Swig_cparse_parms(scatchlist, n); if (catchlist) { Setattr(n, "catchlist", catchlist); mark_exception_classes(catchlist); Delete(catchlist); } } ParmList *throws = Getattr(n, "throws"); if (throws) { /* if there is no explicit catchlist, we catch everything in the throws list */ if (!catchlist) { Setattr(n, "catchlist", throws); } mark_exception_classes(throws); } } public: Allocate(): inclass(NULL), extendmode(0) { } virtual int top(Node *n) { cplus_mode = PUBLIC; inclass = 0; extendmode = 0; emit_children(n); return SWIG_OK; } virtual int importDirective(Node *n) { return emit_children(n); } virtual int includeDirective(Node *n) { return emit_children(n); } virtual int externDeclaration(Node *n) { return emit_children(n); } virtual int namespaceDeclaration(Node *n) { return emit_children(n); } virtual int extendDirective(Node *n) { extendmode = 1; emit_children(n); extendmode = 0; return SWIG_OK; } virtual int classDeclaration(Node *n) { Symtab *symtab = Swig_symbol_current(); Swig_symbol_setscope(Getattr(n, "symtab")); save_value oldInclass(inclass); save_value oldAcessMode(cplus_mode); save_value oldExtendMode(extendmode); if (Getattr(n, "template")) extendmode = 0; if (!CPlusPlus) { /* Always have default constructors/destructors in C */ Setattr(n, "allocate:default_constructor", "1"); Setattr(n, "allocate:default_destructor", "1"); } if (Getattr(n, "allocate:visit")) return SWIG_OK; Setattr(n, "allocate:visit", "1"); /* Always visit base classes first */ { List *bases = Getattr(n, "bases"); if (bases) { for (int i = 0; i < Len(bases); i++) { Node *b = Getitem(bases, i); classDeclaration(b); } } } inclass = n; String *kind = Getattr(n, "kind"); if (Strcmp(kind, "class") == 0) { cplus_mode = PRIVATE; } else { cplus_mode = PUBLIC; } emit_children(n); /* Check if the class is abstract via inheritance. This might occur if a class didn't have any pure virtual methods of its own, but it didn't implement all of the pure methods in a base class */ if (!Getattr(n, "abstracts") && is_abstract_inherit(n)) { if (((Getattr(n, "allocate:public_constructor") || (!GetFlag(n, "feature:nodefault") && !Getattr(n, "allocate:has_constructor"))))) { if (!GetFlag(n, "feature:notabstract")) { Node *na = Getattr(n, "abstracts:firstnode"); if (na) { Swig_warning(WARN_TYPE_ABSTRACT, Getfile(n), Getline(n), "Class '%s' might be abstract, " "no constructors generated,\n", SwigType_namestr(Getattr(n, "name"))); Swig_warning(WARN_TYPE_ABSTRACT, Getfile(na), Getline(na), "Method %s might not be implemented.\n", Swig_name_decl(na)); if (!Getattr(n, "abstracts")) { List *abstracts = NewList(); Append(abstracts, na); Setattr(n, "abstracts", abstracts); Delete(abstracts); } } } } } if (!Getattr(n, "allocate:has_constructor")) { /* No constructor is defined. We need to check a few things */ /* If class is abstract. No default constructor. Sorry */ if (Getattr(n, "abstracts")) { Delattr(n, "allocate:default_constructor"); } if (!Getattr(n, "allocate:default_constructor")) { /* Check base classes */ List *bases = Getattr(n, "allbases"); int allows_default = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow default constructor, we don't allow it either */ if (!Getattr(n, "allocate:default_constructor") && (!Getattr(n, "allocate:default_base_constructor"))) { allows_default = 0; } } if (allows_default) { Setattr(n, "allocate:default_constructor", "1"); } } } if (!Getattr(n, "allocate:has_copy_constructor")) { if (Getattr(n, "abstracts")) { Delattr(n, "allocate:copy_constructor"); } if (!Getattr(n, "allocate:copy_constructor")) { /* Check base classes */ List *bases = Getattr(n, "allbases"); int allows_copy = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow copy constructor, we don't allow it either */ if (!Getattr(n, "allocate:copy_constructor") && (!Getattr(n, "allocate:copy_base_constructor"))) { allows_copy = 0; } } if (allows_copy) { Setattr(n, "allocate:copy_constructor", "1"); } } } if (!Getattr(n, "allocate:has_destructor")) { /* No destructor was defined */ List *bases = Getattr(n, "allbases"); int allows_destruct = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow default destructor, we don't allow it either */ if (!Getattr(n, "allocate:default_destructor") && (!Getattr(n, "allocate:default_base_destructor"))) { allows_destruct = 0; } } if (allows_destruct) { Setattr(n, "allocate:default_destructor", "1"); } } if (!Getattr(n, "allocate:has_assign")) { /* No assignment operator was defined */ List *bases = Getattr(n, "allbases"); int allows_assign = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow assignment, we don't allow it either */ if (Getattr(n, "allocate:has_assign")) { allows_assign = !Getattr(n, "allocate:noassign"); } } if (!allows_assign) { Setattr(n, "allocate:noassign", "1"); } } if (!Getattr(n, "allocate:has_new")) { /* No new operator was defined */ List *bases = Getattr(n, "allbases"); int allows_new = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow new operator, we don't allow it either */ if (Getattr(n, "allocate:has_new")) { allows_new = !Getattr(n, "allocate:nonew"); } } if (!allows_new) { Setattr(n, "allocate:nonew", "1"); } } /* Check if base classes allow smart pointers, but might be hidden */ if (!Getattr(n, "allocate:smartpointer")) { Node *sp = Swig_symbol_clookup("operator ->", 0); if (sp) { /* Look for parent */ Node *p = parentNode(sp); if (Strcmp(nodeType(p), "extend") == 0) { p = parentNode(p); } if (Strcmp(nodeType(p), "class") == 0) { if (GetFlag(p, "feature:ignore")) { Setattr(n, "allocate:smartpointer", Getattr(p, "allocate:smartpointer")); } } } } Swig_interface_propagate_methods(n); /* Only care about default behavior. Remove temporary values */ Setattr(n, "allocate:visit", "1"); Swig_symbol_setscope(symtab); return SWIG_OK; } virtual int accessDeclaration(Node *n) { String *kind = Getattr(n, "kind"); if (Cmp(kind, "public") == 0) { cplus_mode = PUBLIC; } else if (Cmp(kind, "private") == 0) { cplus_mode = PRIVATE; } else if (Cmp(kind, "protected") == 0) { cplus_mode = PROTECTED; } return SWIG_OK; } virtual int usingDeclaration(Node *n) { Node *c = 0; for (c = firstChild(n); c; c = nextSibling(c)) { if (Strcmp(nodeType(c), "cdecl") == 0) { process_exceptions(c); if (inclass) class_member_is_defined_in_bases(c, inclass); } } return SWIG_OK; } virtual int cDeclaration(Node *n) { process_exceptions(n); if (inclass) { /* check whether the member node n is defined in class node in class's bases */ class_member_is_defined_in_bases(n, inclass); /* Check to see if this is a static member or not. If so, we add an attribute cplus:staticbase that saves the current class */ if (Swig_storage_isstatic(n)) { Setattr(n, "cplus:staticbase", inclass); } String *name = Getattr(n, "name"); if (cplus_mode != PUBLIC) { if (Strcmp(name, "operator =") == 0) { /* Look for a private assignment operator */ if (!GetFlag(n, "deleted")) Setattr(inclass, "allocate:has_assign", "1"); Setattr(inclass, "allocate:noassign", "1"); } else if (Strcmp(name, "operator new") == 0) { /* Look for a private new operator */ if (!GetFlag(n, "deleted")) Setattr(inclass, "allocate:has_new", "1"); Setattr(inclass, "allocate:nonew", "1"); } } else { if (Strcmp(name, "operator =") == 0) { if (!GetFlag(n, "deleted")) Setattr(inclass, "allocate:has_assign", "1"); else Setattr(inclass, "allocate:noassign", "1"); } else if (Strcmp(name, "operator new") == 0) { if (!GetFlag(n, "deleted")) Setattr(inclass, "allocate:has_new", "1"); else Setattr(inclass, "allocate:nonew", "1"); } /* Look for smart pointer operator */ if ((Strcmp(name, "operator ->") == 0) && (!GetFlag(n, "feature:ignore"))) { /* Look for version with no parameters */ Node *sn = n; while (sn) { if (!Getattr(sn, "parms")) { SwigType *type = SwigType_typedef_resolve_all(Getattr(sn, "type")); SwigType_push(type, Getattr(sn, "decl")); Delete(SwigType_pop_function(type)); SwigType *base = SwigType_base(type); Node *sc = Swig_symbol_clookup(base, 0); if ((sc) && (Strcmp(nodeType(sc), "class") == 0)) { if (SwigType_check_decl(type, "p.")) { /* Need to check if type is a const pointer */ int isconst = 0; Delete(SwigType_pop(type)); if (SwigType_isconst(type)) { isconst = !Getattr(inclass, "allocate:smartpointermutable"); Setattr(inclass, "allocate:smartpointerconst", "1"); } else { Setattr(inclass, "allocate:smartpointermutable", "1"); } List *methods = smart_pointer_methods(sc, 0, isconst); Setattr(inclass, "allocate:smartpointer", methods); Setattr(inclass, "allocate:smartpointerpointeeclassname", Getattr(sc, "name")); } else { /* Hmmm. The return value is not a pointer. If the type is a value or reference. We're going to chase it to see if another operator->() can be found */ if ((SwigType_check_decl(type, "")) || (SwigType_check_decl(type, "r."))) { Node *nn = Swig_symbol_clookup("operator ->", Getattr(sc, "symtab")); if (nn) { Delete(base); Delete(type); sn = nn; continue; } } } } Delete(base); Delete(type); break; } } } } } return SWIG_OK; } virtual int constructorDeclaration(Node *n) { if (!inclass) return SWIG_OK; Parm *parms = Getattr(n, "parms"); process_exceptions(n); if (!extendmode) { if (!ParmList_numrequired(parms)) { /* Class does define a default constructor */ /* However, we had better see where it is defined */ if (cplus_mode == PUBLIC) { Setattr(inclass, "allocate:default_constructor", "1"); } else if (cplus_mode == PROTECTED) { Setattr(inclass, "allocate:default_base_constructor", "1"); } } /* Class defines some kind of constructor. May or may not be public */ Setattr(inclass, "allocate:has_constructor", "1"); if (cplus_mode == PUBLIC) { Setattr(inclass, "allocate:public_constructor", "1"); } } else { Setattr(inclass, "allocate:has_constructor", "1"); Setattr(inclass, "allocate:public_constructor", "1"); } /* See if this is a copy constructor */ if (parms && (ParmList_numrequired(parms) == 1)) { /* Look for a few cases. X(const X &), X(X &), X(X *) */ int copy_constructor = 0; SwigType *type = Getattr(inclass, "name"); String *tn = NewStringf("r.q(const).%s", type); String *cc = SwigType_typedef_resolve_all(tn); SwigType *rt = SwigType_typedef_resolve_all(Getattr(parms, "type")); if (SwigType_istemplate(type)) { String *tmp = Swig_symbol_template_deftype(cc, 0); Delete(cc); cc = tmp; tmp = Swig_symbol_template_deftype(rt, 0); Delete(rt); rt = tmp; } if (Strcmp(cc, rt) == 0) { copy_constructor = 1; } else { Delete(cc); cc = NewStringf("r.%s", Getattr(inclass, "name")); if (Strcmp(cc, Getattr(parms, "type")) == 0) { copy_constructor = 1; } else { Delete(cc); cc = NewStringf("p.%s", Getattr(inclass, "name")); String *ty = SwigType_strip_qualifiers(Getattr(parms, "type")); if (Strcmp(cc, ty) == 0) { copy_constructor = 1; } Delete(ty); } } Delete(cc); Delete(rt); Delete(tn); if (copy_constructor) { Setattr(n, "copy_constructor", "1"); Setattr(inclass, "allocate:has_copy_constructor", "1"); if (cplus_mode == PUBLIC) { Setattr(inclass, "allocate:copy_constructor", "1"); } else if (cplus_mode == PROTECTED) { Setattr(inclass, "allocate:copy_base_constructor", "1"); } } } return SWIG_OK; } virtual int destructorDeclaration(Node *n) { (void) n; if (!inclass) return SWIG_OK; if (!extendmode) { Setattr(inclass, "allocate:has_destructor", "1"); if (cplus_mode == PUBLIC) { Setattr(inclass, "allocate:default_destructor", "1"); } else if (cplus_mode == PROTECTED) { Setattr(inclass, "allocate:default_base_destructor", "1"); } else if (cplus_mode == PRIVATE) { Setattr(inclass, "allocate:private_destructor", "1"); } } else { Setattr(inclass, "allocate:has_destructor", "1"); Setattr(inclass, "allocate:default_destructor", "1"); } return SWIG_OK; } }; void Swig_default_allocators(Node *n) { if (!n) return; Allocate *a = new Allocate; a->top(n); delete a; } swig-4.0.2/Source/Modules/browser.cxx0000644000175000017500000002626013667507523017447 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * browser.cxx * * A web-base parse tree browser using SWILL. This is an optional * feature that's normally disabled. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #ifdef SWIG_SWILL extern "C" { #include "swill.h" } static FILE *out = 0; static Node *view_top = 0; class Browser:public Dispatcher { void show_checkbox(Node *t, Node *n) { int v = 0; if (Getmeta(n, "visible")) { v = 1; } if (v) { Printf(out, "[-] ", n, t, n, n); } else { Printf(out, "[+] ", n, t, n, n); } } void show_attributes(Node *obj) { if (!Getmeta(obj, "visible")) return; String *os = NewString(""); String *k; Iterator ki; ki = First(obj); while (ki.key) { k = ki.key; if ((Cmp(k, "nodeType") == 0) || (Cmp(k, "firstChild") == 0) || (Cmp(k, "lastChild") == 0) || (Cmp(k, "parentNode") == 0) || (Cmp(k, "nextSibling") == 0) || (Cmp(k, "previousSibling") == 0) || (*(Char(k)) == '$')) { /* Do nothing */ } else if (Cmp(k, "parms") == 0) { String *o = NewString(""); Printf(o, "%s", ParmList_protostr(Getattr(obj, k))); Replaceall(o, "&", "&"); Replaceall(o, "<", "<"); Replaceall(o, ">", ">"); Printf(os, "? %-12s - %s\n", Getattr(obj, k), k, o); Delete(o); } else { DOH *o; char *trunc = ""; if (DohIsString(Getattr(obj, k))) { o = Str(Getattr(obj, k)); if (Len(o) > 70) { trunc = "..."; } Replaceall(o, "&", "&"); Replaceall(o, "<", "<"); Printf(os, "? %-12s - \"%(escape)-0.70s%s\"\n", Getattr(obj, k), k, o, trunc); Delete(o); } else { Printf(os, "? %-12s - %p\n", Getattr(obj, k), k, Getattr(obj, k)); } } ki = Next(ki); } Printf(out, "
\n%s
\n", Char(os)); Delete(os); } public: virtual int emit_one(Node *n) { char *tag = Char(nodeType(n)); char *file = Char(Getfile(n)); int line = Getline(n); char *name = GetChar(n, "name"); show_checkbox(view_top, n); Printf(out, "%s", n, tag); if (name) { Printf(out, " (%s)", name); } Printf(out, ". %s:%d\n", file, line); Printf(out, "
"); Dispatcher::emit_one(n); return SWIG_OK; } virtual int emit_children(Node *n) { if (Getmeta(n, "visible")) { Printf(out, "
\n"); Dispatcher::emit_children(n); Printf(out, "
\n"); } return SWIG_OK; } virtual int defaultHandler(Node *n) { show_attributes(n); return SWIG_OK; } virtual int top(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int includeDirective(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int importDirective(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int extendDirective(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int classDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int templateDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int lambdaDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int enumDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int typemapDirective(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int namespaceDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int usingDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } }; static int browser_exit = 0; static Node *tree_top = 0; static Browser *browse = 0; /* ---------------------------------------------------------------------- * exit_handler() - Force the browser to exit * ---------------------------------------------------------------------- */ void exit_handler(FILE *f) { browser_exit = 1; Printf(f, "Terminated.\n"); } /* ---------------------------------------------------------------------- * node_handler() - Generate information about a specific node * ---------------------------------------------------------------------- */ static void display(FILE *f, Node *n) { /* Print standard HTML header */ Printf(f, "SWIG-%s\n", Swig_package_version()); Printf(f, "SWIG-%s
\n", Swig_package_version()); Printf(f, "[ Exit ]"); Printf(f, " [ Top ]", tree_top); if (n != tree_top) { Printf(f, " [ Up ]", parentNode(n)); } Printf(f, " [ Symbols ]"); Printf(f, "

\n"); out = f; browse->emit_one(n); /* Print standard footer */ Printf(f, "


\n"); } void node_handler(FILE *f) { Node *n = 0; if (!swill_getargs("p(node)", &n)) { n = tree_top; } view_top = n; display(f, n); } /* ---------------------------------------------------------------------- * hide_handler() - Hide a node * ---------------------------------------------------------------------- */ void hide_handler(FILE *f) { Node *n = 0; if (!swill_getargs("p(hn)", &n)) { n = 0; } if (n) { Delmeta(n, "visible"); } node_handler(f); } void show_handler(FILE *f) { Node *n = 0; if (!swill_getargs("p(hn)", &n)) { n = 0; } if (n) { Setmeta(n, "visible", "1"); } node_handler(f); } void raw_data(FILE *out, Node *obj) { if (!obj) return; if (DohIsMapping(obj)) { String *k; Iterator ki; String *os = NewString(""); Printf(os, "Hash {\n"); ki = First(obj); while (ki.key) { k = ki.key; DOH *o; const char *trunc = ""; if (DohIsString(Getattr(obj, k))) { o = Str(Getattr(obj, k)); if (Len(o) > 70) { trunc = "..."; } Replaceall(o, "<", "<"); Printf(os, " ? %-12s - \"%(escape)-0.70s%s\"\n", Getattr(obj, k), k, o, trunc); Delete(o); } else { Printf(os, " ? %-12s - %p\n", Getattr(obj, k), k, Getattr(obj, k)); } ki = Next(ki); } Printf(os, "}\n"); Printf(out, "
\n%s
\n", Char(os)); Delete(os); } else if (DohIsString(obj)) { String *o = Str(obj); Replaceall(o, "<", "<"); Printf(out, "
\n%s
\n", Char(o)); Delete(o); } else if (DohIsSequence(obj)) { int i; String *os = NewString(""); Printf(os, "List [\n"); for (i = 0; i < Len(obj); i++) { DOH *o = Getitem(obj, i); const char *trunc = ""; if (DohIsString(o)) { String *s = Str(o); if (Len(s) > 70) { trunc = "..."; } Replaceall(o, "<", "<"); Printf(os, " ? [%d] - \"%(escape)-0.70s%s\"\n", o, i, s, trunc); Delete(s); } else { Printf(os, " ? [%d] - %p\n", o, i, o); } } Printf(os, "\n]\n"); Printf(out, "
\n%s
\n", Char(os)); Delete(os); } } void data_handler(FILE *f) { DOH *n = 0; if (!swill_getargs("p(n)", &n)) { n = 0; } Printf(f, "SWIG-%s\n", Swig_package_version()); Printf(f, "SWIG-%s
\n", Swig_package_version()); Printf(f, "[ Exit ]"); Printf(f, " [ Top ]", tree_top); Printf(f, "

\n"); if (n) { raw_data(f, n); } /* Print standard footer */ Printf(f, "


\n"); } void symbol_handler(FILE *f) { Symtab *sym; char *name = 0; Printf(f, "SWIG-%s\n", Swig_package_version()); Printf(f, "SWIG-%s
\n", Swig_package_version()); Printf(f, "[ Exit ]"); Printf(f, " [ Top ]", tree_top); Printf(f, " [ Symbols ]"); Printf(f, "

\n"); if (!swill_getargs("p(sym)|s(name)", &sym, &name)) { sym = Swig_symbol_getscope(""); name = 0; } if (!sym) { Printf(f, "No symbol table specified!\n"); return; } { String *q = Swig_symbol_qualifiedscopename(sym); if (!Len(q)) { Printf(f, "Symbol table: :: (global)
\n"); } else { Printf(f, "Symbol table: %s
\n", q); } Delete(q); } fprintf(f, "

\n"); fprintf(f, "Symbol lookup:
\n"); fprintf(f, "\n", sym); fprintf(f, "Submit : \n"); fprintf(f, "
"); if (name) { Node *n = Swig_symbol_clookup(name, sym); Printf(f, "Symbol '%s':\n", name); Printf(f, "
\n"); if (!n) { Printf(f, "Not defined!\n"); } else { raw_data(f, n); } Printf(f, "
\n"); } Printf(f, "

Nested scopes
\n"); Printf(f, "

\n");
  {
    Hash *h;
    h = firstChild(sym);
    while (h) {
      Printf(f, "%s\n", h, Getattr(h, "name"));
      h = nextSibling(h);
    }
  }
  Printf(f, "
\n"); Printf(f, "

Symbol table contents
\n"); raw_data(f, Getattr(sym, "symtab")); Printf(f, "


\n"); } #endif void Swig_browser(Node *top, int port) { #ifdef SWIG_SWILL int sport; browser_exit = 0; /* Initialize the server */ sport = swill_init(port); if (sport < 0) { Printf(stderr, "Couldn't open socket on port %d. Sorry.\n", port); return; } browse = new Browser(); Setmeta(top, "visible", "1"); tree_top = top; Printf(stderr, "SWIG: Tree browser listening on port %d\n", sport); swill_handle("exit.html", exit_handler, 0); swill_handle("index.html", node_handler, 0); swill_handle("hide.html", hide_handler, 0); swill_handle("show.html", show_handler, 0); swill_handle("data.html", data_handler, 0); swill_handle("symbol.html", symbol_handler, 0); swill_netscape("index.html"); while (!browser_exit) { swill_serve(); } Printf(stderr, "Browser terminated.\n"); swill_close(); delete browse; return; #else (void) top; (void) port; #endif } swig-4.0.2/Source/Modules/guile.cxx0000644000175000017500000015373113667507523017075 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * guile.cxx * * Guile language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include // Note string broken in half for compilers that can't handle long strings static const char *usage = "\ Guile Options (available with -guile)\n\ -emitsetters - Emit procedures-with-setters for variables\n\ and structure slots.\n\ -emitslotaccessors - Emit accessor methods for all GOOPS slots\n" "\ -exportprimitive - Add the (export ...) code from scmstub into the\n\ GOOPS file.\n\ -goopsprefix - Prepend to all goops identifiers\n\ -Linkage - Use linkage protocol (default `simple')\n\ Use `module' for native Guile module linking\n\ (requires Guile >= 1.5.0). Use `passive' for\n\ passive linking (no C-level module-handling code),\n\ `ltdlmod' for Guile's old dynamic module\n\ convention (Guile <= 1.4), or `hobbit' for hobbit\n\ modules.\n\ -onlysetters - Don't emit traditional getter and setter\n\ procedures for structure slots,\n\ only emit procedures-with-setters.\n\ -package - Set the path of the module to \n\ (default NULL)\n\ -prefix - Use as prefix [default \"gswig_\"]\n\ -procdoc - Output procedure documentation to \n\ -procdocformat - Output procedure documentation in ;\n\ one of `guile-1.4', `plain', `texinfo'\n\ -proxy - Export GOOPS class definitions\n\ -primsuffix - Name appended to primitive module when exporting\n\ GOOPS classes. (default = \"primitive\")\n\ -scmstub - Output Scheme file with module declaration and\n\ exports; only with `passive' and `simple' linkage\n\ -useclassprefix - Prepend the class name to all goops identifiers\n\ \n"; static File *f_begin = 0; static File *f_runtime = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_init = 0; static String *prefix = NewString("gswig_"); static char *module = 0; static String *package = 0; static enum { GUILE_LSTYLE_SIMPLE, // call `SWIG_init()' GUILE_LSTYLE_PASSIVE, // passive linking (no module code) GUILE_LSTYLE_MODULE, // native guile module linking (Guile >= 1.4.1) GUILE_LSTYLE_LTDLMOD_1_4, // old (Guile <= 1.4) dynamic module convention GUILE_LSTYLE_HOBBIT // use (hobbit4d link) } linkage = GUILE_LSTYLE_SIMPLE; static File *procdoc = 0; static bool scmstub = false; static String *scmtext; static bool goops = false; static String *goopstext; static String *goopscode; static String *goopsexport; static enum { GUILE_1_4, PLAIN, TEXINFO } docformat = GUILE_1_4; static int emit_setters = 0; static int only_setters = 0; static int emit_slot_accessors = 0; static int struct_member = 0; static String *beforereturn = 0; static String *return_nothing_doc = 0; static String *return_one_doc = 0; static String *return_multi_doc = 0; static String *exported_symbols = 0; static int exporting_destructor = 0; static String *swigtype_ptr = 0; /* GOOPS stuff */ static String *primsuffix = 0; static String *class_name = 0; static String *short_class_name = 0; static String *goops_class_methods; static int in_class = 0; static int have_constructor = 0; static int useclassprefix = 0; // -useclassprefix argument static String *goopsprefix = 0; // -goopsprefix argument static int primRenamer = 0; // if (use-modules ((...) :renamer ...) is exported to GOOPS file static int exportprimitive = 0; // -exportprimitive argument static String *memberfunction_name = 0; extern "C" { static int has_classname(Node *class_node) { return Getattr(class_node, "guile:goopsclassname") ? 1 : 0; } } class GUILE:public Language { public: /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int i; SWIG_library_directory("guile"); SWIG_typemap_lang("guile"); // Look for certain command line options for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); SWIG_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-package") == 0) { if (argv[i + 1]) { package = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-Linkage") == 0 || strcmp(argv[i], "-linkage") == 0) { if (argv[i + 1]) { if (0 == strcmp(argv[i + 1], "ltdlmod")) linkage = GUILE_LSTYLE_LTDLMOD_1_4; else if (0 == strcmp(argv[i + 1], "hobbit")) linkage = GUILE_LSTYLE_HOBBIT; else if (0 == strcmp(argv[i + 1], "simple")) linkage = GUILE_LSTYLE_SIMPLE; else if (0 == strcmp(argv[i + 1], "passive")) linkage = GUILE_LSTYLE_PASSIVE; else if (0 == strcmp(argv[i + 1], "module")) linkage = GUILE_LSTYLE_MODULE; else Swig_arg_error(); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-procdoc") == 0) { if (argv[i + 1]) { procdoc = NewFile(argv[i + 1], "w", SWIG_output_files()); if (!procdoc) { FileErrorDisplay(argv[i + 1]); SWIG_exit(EXIT_FAILURE); } Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-procdocformat") == 0) { if (strcmp(argv[i + 1], "guile-1.4") == 0) docformat = GUILE_1_4; else if (strcmp(argv[i + 1], "plain") == 0) docformat = PLAIN; else if (strcmp(argv[i + 1], "texinfo") == 0) docformat = TEXINFO; else Swig_arg_error(); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else if (strcmp(argv[i], "-emit-setters") == 0 || strcmp(argv[i], "-emitsetters") == 0) { emit_setters = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-only-setters") == 0 || strcmp(argv[i], "-onlysetters") == 0) { emit_setters = 1; only_setters = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-emit-slot-accessors") == 0 || strcmp(argv[i], "-emitslotaccessors") == 0) { emit_slot_accessors = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-scmstub") == 0) { scmstub = true; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-shadow") == 0) || ((strcmp(argv[i], "-proxy") == 0))) { goops = true; Swig_mark_arg(i); } else if (strcmp(argv[i], "-gh") == 0) { Printf(stderr, "Deprecated command line option: -gh. Wrappers are always generated for the SCM interface. See documentation for more information regarding the deprecated GH interface.\n"); Swig_mark_arg(i); } else if (strcmp(argv[i], "-scm") == 0) { Printf(stderr, "Deprecated command line option: -scm. Wrappers are always generated for the SCM interface. See documentation for more information regarding the deprecated GH interface.\n"); Swig_mark_arg(i); } else if (strcmp(argv[i], "-primsuffix") == 0) { if (argv[i + 1]) { primsuffix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-goopsprefix") == 0) { if (argv[i + 1]) { goopsprefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-useclassprefix") == 0) { useclassprefix = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-exportprimitive") == 0) { exportprimitive = 1; // should use Swig_warning() here? Swig_mark_arg(i); } } } // set default value for primsuffix if (!primsuffix) primsuffix = NewString("primitive"); //goops support can only be enabled if passive or module linkage is used if (goops) { if (linkage != GUILE_LSTYLE_PASSIVE && linkage != GUILE_LSTYLE_MODULE) { Printf(stderr, "guile: GOOPS support requires passive or module linkage\n"); SWIG_exit(EXIT_FAILURE); } } if (goops) { // -proxy implies -emit-setters emit_setters = 1; } if ((linkage == GUILE_LSTYLE_PASSIVE && scmstub) || linkage == GUILE_LSTYLE_MODULE) primRenamer = 1; if (exportprimitive && primRenamer) { // should use Swig_warning() ? Printf(stderr, "guile: Warning: -exportprimitive only makes sense with passive linkage without a scmstub.\n"); } // Make sure `prefix' ends in an underscore if (prefix) { const char *px = Char(prefix); if (px[Len(prefix) - 1] != '_') Printf(prefix, "_"); } /* Add a symbol for this module */ Preprocessor_define("SWIGGUILE 1", 0); /* Read in default typemaps */ SWIG_config_file("guile_scm.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); scmtext = NewString(""); Swig_register_filebyname("scheme", scmtext); exported_symbols = NewString(""); goopstext = NewString(""); Swig_register_filebyname("goops", goopstext); goopscode = NewString(""); goopsexport = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGGUILE\n#define SWIGGUILE\n#endif\n\n"); /* Write out directives and declarations */ module = Swig_copy_string(Char(Getattr(n, "name"))); switch (linkage) { case GUILE_LSTYLE_SIMPLE: /* Simple linkage; we have to export the SWIG_init function. The user can rename the function by a #define. */ Printf(f_runtime, "#define SWIG_GUILE_INIT_STATIC extern\n"); break; default: /* Other linkage; we make the SWIG_init function static */ Printf(f_runtime, "#define SWIG_GUILE_INIT_STATIC static\n"); break; } if (CPlusPlus) { Printf(f_runtime, "extern \"C\" {\n\n"); } Printf(f_runtime, "SWIG_GUILE_INIT_STATIC void\nSWIG_init (void);\n"); if (CPlusPlus) { Printf(f_runtime, "\n}\n"); } Printf(f_runtime, "\n"); Language::top(n); /* Close module */ Printf(f_wrappers, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); SwigType_emit_type_table(f_runtime, f_wrappers); Printf(f_init, "}\n\n"); Printf(f_init, "#ifdef __cplusplus\n}\n#endif\n"); String *module_name = NewString(""); if (!module) Printv(module_name, "swig", NIL); else { if (package) Printf(module_name, "%s/%s", package, module); else Printv(module_name, module, NIL); } emit_linkage(module_name); Delete(module_name); if (procdoc) { Delete(procdoc); procdoc = NULL; } Delete(goopscode); Delete(goopsexport); Delete(goopstext); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } void emit_linkage(String *module_name) { String *module_func = NewString(""); if (CPlusPlus) { Printf(f_init, "extern \"C\" {\n\n"); } Printv(module_func, module_name, NIL); Replaceall(module_func, "-", "_"); switch (linkage) { case GUILE_LSTYLE_SIMPLE: Printf(f_init, "\n/* Linkage: simple */\n"); break; case GUILE_LSTYLE_PASSIVE: Printf(f_init, "\n/* Linkage: passive */\n"); Replaceall(module_func, "/", "_"); Insert(module_func, 0, "scm_init_"); Append(module_func, "_module"); Printf(f_init, "SCM\n%s (void)\n{\n", module_func); Printf(f_init, " SWIG_init();\n"); Printf(f_init, " return SCM_UNSPECIFIED;\n"); Printf(f_init, "}\n"); break; case GUILE_LSTYLE_LTDLMOD_1_4: Printf(f_init, "\n/* Linkage: ltdlmod */\n"); Replaceall(module_func, "/", "_"); Insert(module_func, 0, "scm_init_"); Append(module_func, "_module"); Printf(f_init, "SCM\n%s (void)\n{\n", module_func); { String *mod = NewString(module_name); Replaceall(mod, "/", " "); Printf(f_init, " scm_register_module_xxx (\"%s\", (void *) SWIG_init);\n", mod); Printf(f_init, " return SCM_UNSPECIFIED;\n"); Delete(mod); } Printf(f_init, "}\n"); break; case GUILE_LSTYLE_MODULE: Printf(f_init, "\n/* Linkage: module */\n"); Replaceall(module_func, "/", "_"); Insert(module_func, 0, "scm_init_"); Append(module_func, "_module"); Printf(f_init, "static void SWIG_init_helper(void *data)\n"); Printf(f_init, "{\n SWIG_init();\n"); if (Len(exported_symbols) > 0) Printf(f_init, " scm_c_export(%sNULL);", exported_symbols); Printf(f_init, "\n}\n\n"); Printf(f_init, "SCM\n%s (void)\n{\n", module_func); { String *mod = NewString(module_name); if (goops) Printv(mod, "-", primsuffix, NIL); Replaceall(mod, "/", " "); Printf(f_init, " scm_c_define_module(\"%s\",\n", mod); Printf(f_init, " SWIG_init_helper, NULL);\n"); Printf(f_init, " return SCM_UNSPECIFIED;\n"); Delete(mod); } Printf(f_init, "}\n"); break; case GUILE_LSTYLE_HOBBIT: Printf(f_init, "\n/* Linkage: hobbit */\n"); Replaceall(module_func, "/", "_slash_"); Insert(module_func, 0, "scm_init_"); Printf(f_init, "SCM\n%s (void)\n{\n", module_func); { String *mod = NewString(module_name); Replaceall(mod, "/", " "); Printf(f_init, " scm_register_module_xxx (\"%s\", (void *) SWIG_init);\n", mod); Printf(f_init, " return SCM_UNSPECIFIED;\n"); Delete(mod); } Printf(f_init, "}\n"); break; default: abort(); // for now } if (scmstub) { /* Emit Scheme stub if requested */ String *primitive_name = NewString(module_name); if (goops) Printv(primitive_name, "-", primsuffix, NIL); String *mod = NewString(primitive_name); Replaceall(mod, "/", " "); String *fname = NewStringf("%s%s.scm", SWIG_output_directory(), primitive_name); Delete(primitive_name); File *scmstubfile = NewFile(fname, "w", SWIG_output_files()); if (!scmstubfile) { FileErrorDisplay(fname); SWIG_exit(EXIT_FAILURE); } Delete(fname); Swig_banner_target_lang(scmstubfile, ";;;"); Printf(scmstubfile, "\n"); if (linkage == GUILE_LSTYLE_SIMPLE || linkage == GUILE_LSTYLE_PASSIVE) Printf(scmstubfile, "(define-module (%s))\n\n", mod); Delete(mod); Printf(scmstubfile, "%s", scmtext); if ((linkage == GUILE_LSTYLE_SIMPLE || linkage == GUILE_LSTYLE_PASSIVE) && Len(exported_symbols) > 0) { String *ex = NewString(exported_symbols); Replaceall(ex, ", ", "\n "); Replaceall(ex, "\"", ""); Chop(ex); Printf(scmstubfile, "\n(export %s)\n", ex); Delete(ex); } Delete(scmstubfile); } if (goops) { String *mod = NewString(module_name); Replaceall(mod, "/", " "); String *fname = NewStringf("%s%s.scm", SWIG_output_directory(), module_name); File *goopsfile = NewFile(fname, "w", SWIG_output_files()); if (!goopsfile) { FileErrorDisplay(fname); SWIG_exit(EXIT_FAILURE); } Delete(fname); Swig_banner_target_lang(goopsfile, ";;;"); Printf(goopsfile, "\n"); Printf(goopsfile, "(define-module (%s))\n", mod); Printf(goopsfile, "%s\n", goopstext); Printf(goopsfile, "(use-modules (oop goops) (Swig common))\n"); if (primRenamer) { Printf(goopsfile, "(use-modules ((%s-%s) :renamer (symbol-prefix-proc 'primitive:)))\n", mod, primsuffix); } Printf(goopsfile, "%s\n(export %s)", goopscode, goopsexport); if (exportprimitive) { String *ex = NewString(exported_symbols); Replaceall(ex, ", ", "\n "); Replaceall(ex, "\"", ""); Chop(ex); Printf(goopsfile, "\n(export %s)", ex); Delete(ex); } Delete(mod); Delete(goopsfile); } Delete(module_func); if (CPlusPlus) { Printf(f_init, "\n}\n"); } } /* Return true iff T is a pointer type */ int is_a_pointer(SwigType *t) { return SwigType_ispointer(SwigType_typedef_resolve_all(t)); } /* Report an error handling the given type. */ void throw_unhandled_guile_type_error(SwigType *d) { Swig_warning(WARN_TYPEMAP_UNDEF, input_file, line_number, "Unable to handle type %s.\n", SwigType_str(d, 0)); } /* Write out procedure documentation */ void write_doc(const String *proc_name, const String *signature, const String *doc, const String *signature2 = NULL) { switch (docformat) { case GUILE_1_4: Printv(procdoc, "\f\n", NIL); Printv(procdoc, "(", signature, ")\n", NIL); if (signature2) Printv(procdoc, "(", signature2, ")\n", NIL); Printv(procdoc, doc, "\n", NIL); break; case PLAIN: Printv(procdoc, "\f", proc_name, "\n\n", NIL); Printv(procdoc, "(", signature, ")\n", NIL); if (signature2) Printv(procdoc, "(", signature2, ")\n", NIL); Printv(procdoc, doc, "\n\n", NIL); break; case TEXINFO: Printv(procdoc, "\f", proc_name, "\n", NIL); Printv(procdoc, "@deffn primitive ", signature, "\n", NIL); if (signature2) Printv(procdoc, "@deffnx primitive ", signature2, "\n", NIL); Printv(procdoc, doc, "\n", NIL); Printv(procdoc, "@end deffn\n\n", NIL); break; } } /* returns false if the typemap is an empty string */ bool handle_documentation_typemap(String *output, const String *maybe_delimiter, Parm *p, const String *typemap, const String *default_doc, const String *name = NULL) { String *tmp = NewString(""); String *tm; if (!(tm = Getattr(p, typemap))) { Printf(tmp, "%s", default_doc); tm = tmp; } bool result = (Len(tm) > 0); if (maybe_delimiter && Len(output) > 0 && Len(tm) > 0) { Printv(output, maybe_delimiter, NIL); } const String *pn = !name ? (const String *) Getattr(p, "name") : name; String *pt = Getattr(p, "type"); Replaceall(tm, "$name", pn); // legacy for $parmname Replaceall(tm, "$type", SwigType_str(pt, 0)); /* $NAME is like $name, but marked-up as a variable. */ String *ARGNAME = NewString(""); if (docformat == TEXINFO) Printf(ARGNAME, "@var{%s}", pn); else Printf(ARGNAME, "%(upper)s", pn); Replaceall(tm, "$NAME", ARGNAME); Replaceall(tm, "$PARMNAME", ARGNAME); Printv(output, tm, NIL); Delete(tmp); return result; } /* ------------------------------------------------------------ * functionWrapper() * Create a function declaration and register it with the interpreter. * ------------------------------------------------------------ */ virtual int functionWrapper(Node *n) { String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; String *proc_name = 0; char source[256]; Wrapper *f = NewWrapper(); String *cleanup = NewString(""); String *outarg = NewString(""); String *signature = NewString(""); String *doc_body = NewString(""); String *returns = NewString(""); String *method_signature = NewString(""); String *primitive_args = NewString(""); Hash *scheme_arg_names = NewHash(); int num_results = 1; String *tmp = NewString(""); String *tm; int i; int numargs = 0; int numreq = 0; String *overname = 0; int args_passed_as_array = 0; int scheme_argnum = 0; bool any_specialized_arg = false; // Make a wrapper name for this String *wname = Swig_name_wrapper(iname); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); args_passed_as_array = 1; } else { if (!addSymbol(iname, n)) { DelWrapper(f); return SWIG_ERROR; } } if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); // Build the name for scheme. proc_name = NewString(iname); Replaceall(proc_name, "_", "-"); /* Emit locals etc. into f->code; figure out which args to ignore */ emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ numargs = emit_num_arguments(l); numreq = emit_num_required(l); /* Declare return variable */ Wrapper_add_local(f, "gswig_result", "SCM gswig_result"); Wrapper_add_local(f, "gswig_list_p", "SWIGUNUSED int gswig_list_p = 0"); /* Open prototype and signature */ Printv(f->def, "static SCM\n", wname, " (", NIL); if (args_passed_as_array) { Printv(f->def, "int argc, SCM *argv", NIL); } Printv(signature, proc_name, NIL); /* Now write code to extract the parameters */ for (i = 0, p = l; i < numargs; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); int opt_p = (i >= numreq); // Produce names of source and target if (args_passed_as_array) sprintf(source, "argv[%d]", i); else sprintf(source, "s_%d", i); String *target = Getattr(p, "lname"); if (!args_passed_as_array) { if (i != 0) Printf(f->def, ", "); Printf(f->def, "SCM s_%d", i); } if (opt_p) { Printf(f->code, " if (%s != SCM_UNDEFINED) {\n", source); } if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", target); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printv(f->code, tm, "\n", NIL); SwigType *pb = SwigType_typedef_resolve_all(SwigType_base(pt)); SwigType *pn = Getattr(p, "name"); String *argname; scheme_argnum++; if (pn && !Getattr(scheme_arg_names, pn)) argname = pn; else { /* Anonymous arg or re-used argument name -- choose a name that cannot clash */ argname = NewStringf("%%arg%d", scheme_argnum); } if (procdoc) { if (i == numreq) { /* First optional argument */ Printf(signature, " #:optional"); } /* Add to signature (arglist) */ handle_documentation_typemap(signature, " ", p, "tmap:in:arglist", "$name", argname); /* Document the type of the arg in the documentation body */ handle_documentation_typemap(doc_body, ", ", p, "tmap:in:doc", "$NAME is of type <$type>", argname); } if (goops) { if (i < numreq) { if (strcmp("void", Char(pt)) != 0) { Node *class_node = Swig_symbol_clookup_check(pb, Getattr(n, "sym:symtab"), has_classname); String *goopsclassname = !class_node ? NULL : Getattr(class_node, "guile:goopsclassname"); /* do input conversion */ if (goopsclassname) { Printv(method_signature, " (", argname, " ", goopsclassname, ")", NIL); any_specialized_arg = true; } else { Printv(method_signature, " ", argname, NIL); } Printv(primitive_args, " ", argname, NIL); Setattr(scheme_arg_names, argname, p); } } } if (!pn) { Delete(argname); } p = Getattr(p, "tmap:in:next"); } else { throw_unhandled_guile_type_error(pt); p = nextSibling(p); } if (opt_p) Printf(f->code, " }\n"); } if (Len(doc_body) > 0) Printf(doc_body, ".\n"); /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Pass output arguments back to the caller. */ /* Insert argument output code */ String *returns_argout = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", Getattr(p, "lname")); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); if (procdoc) { if (handle_documentation_typemap(returns_argout, ", ", p, "tmap:argout:doc", "$NAME (of type $type)")) { /* A documentation typemap that is not the empty string indicates that a value is returned to Scheme. */ num_results++; } } p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } if (exporting_destructor) { /* Mark the destructor's argument as destroyed. */ String *tm = NewString("SWIG_Guile_MarkPointerDestroyed($input);"); Replaceall(tm, "$input", Getattr(l, "emit:input")); Printv(cleanup, tm, "\n", NIL); Delete(tm); } /* Close prototype */ Printf(f->def, ")\n{\n"); /* Define the scheme name in C. This define is used by several Guile macros. */ Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); // Now write code to make the function call String *actioncode = emit_action(n); // Now have return value, figure out what to do with it. if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$result", "gswig_result"); Replaceall(tm, "$target", "gswig_result"); Replaceall(tm, "$source", Swig_cresult_name()); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printv(f->code, tm, "\n", NIL); } else { throw_unhandled_guile_type_error(d); } emit_return_variable(n, d, f); // Documentation if ((tm = Getattr(n, "tmap:out:doc"))) { Printv(returns, tm, NIL); if (Len(tm) > 0) num_results = 1; else num_results = 0; } else { String *s = SwigType_str(d, 0); Chop(s); Printf(returns, "<%s>", s); Delete(s); num_results = 1; } Append(returns, returns_argout); // Dump the argument output code Printv(f->code, outarg, NIL); // Dump the argument cleanup code Printv(f->code, cleanup, NIL); // Look for any remaining cleanup if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } } // Free any memory allocated by the function being wrapped.. if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } // Wrap things up (in a manner of speaking) if (beforereturn) Printv(f->code, beforereturn, "\n", NIL); Printv(f->code, "return gswig_result;\n", NIL); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); // Undefine the scheme name Printf(f->code, "#undef FUNC_NAME\n"); Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); if (!Getattr(n, "sym:overloaded")) { if (numargs > 10) { int i; /* gh_new_procedure would complain: too many args */ /* Build a wrapper wrapper */ Printv(f_wrappers, "static SCM\n", wname, "_rest (SCM rest)\n", NIL); Printv(f_wrappers, "{\n", NIL); Printf(f_wrappers, "SCM arg[%d];\n", numargs); Printf(f_wrappers, "SWIG_Guile_GetArgs (arg, rest, %d, %d, \"%s\");\n", numreq, numargs - numreq, proc_name); Printv(f_wrappers, "return ", wname, "(", NIL); Printv(f_wrappers, "arg[0]", NIL); for (i = 1; i < numargs; i++) Printf(f_wrappers, ", arg[%d]", i); Printv(f_wrappers, ");\n", NIL); Printv(f_wrappers, "}\n", NIL); /* Register it */ Printf(f_init, "scm_c_define_gsubr(\"%s\", 0, 0, 1, (swig_guile_proc) %s_rest);\n", proc_name, wname); } else if (emit_setters && struct_member && strlen(Char(proc_name)) > 3) { int len = Len(proc_name); const char *pc = Char(proc_name); /* MEMBER-set and MEMBER-get functions. */ int is_setter = (pc[len - 3] == 's'); if (is_setter) { Printf(f_init, "SCM setter = "); struct_member = 2; /* have a setter */ } else Printf(f_init, "SCM getter = "); /* GOOPS support uses the MEMBER-set and MEMBER-get functions, so ignore only_setters in this case. */ if (only_setters && !goops) Printf(f_init, "scm_c_make_gsubr(\"%s\", %d, %d, 0, (swig_guile_proc) %s);\n", proc_name, numreq, numargs - numreq, wname); else Printf(f_init, "scm_c_define_gsubr(\"%s\", %d, %d, 0, (swig_guile_proc) %s);\n", proc_name, numreq, numargs - numreq, wname); if (!is_setter) { /* Strip off "-get" */ char *pws_name = (char *) malloc(sizeof(char) * (len - 3)); strncpy(pws_name, pc, len - 3); pws_name[len - 4] = 0; if (struct_member == 2) { /* There was a setter, so create a procedure with setter */ Printf(f_init, "scm_c_define"); Printf(f_init, "(\"%s\", " "scm_make_procedure_with_setter(getter, setter));\n", pws_name); } else { /* There was no setter, so make an alias to the getter */ Printf(f_init, "scm_c_define"); Printf(f_init, "(\"%s\", getter);\n", pws_name); } Printf(exported_symbols, "\"%s\", ", pws_name); free(pws_name); } } else { /* Register the function */ if (exporting_destructor) { Printf(f_init, "((swig_guile_clientdata *)(SWIGTYPE%s->clientdata))->destroy = (guile_destructor) %s;\n", swigtype_ptr, wname); //Printf(f_init, "SWIG_TypeClientData(SWIGTYPE%s, (void *) %s);\n", swigtype_ptr, wname); } Printf(f_init, "scm_c_define_gsubr(\"%s\", %d, %d, 0, (swig_guile_proc) %s);\n", proc_name, numreq, numargs - numreq, wname); } } else { /* overloaded function; don't export the single methods */ if (!Getattr(n, "sym:nextSibling")) { /* Emit overloading dispatch function */ int maxargs; String *dispatch = Swig_overload_dispatch(n, "return %s(argc,argv);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *df = NewWrapper(); String *dname = Swig_name_wrapper(iname); Printv(df->def, "static SCM\n", dname, "(SCM rest)\n{\n", NIL); Printf(df->code, "#define FUNC_NAME \"%s\"\n", proc_name); Printf(df->code, "SCM argv[%d];\n", maxargs); Printf(df->code, "int argc = SWIG_Guile_GetArgs (argv, rest, %d, %d, \"%s\");\n", 0, maxargs, proc_name); Printv(df->code, dispatch, "\n", NIL); Printf(df->code, "scm_misc_error(\"%s\", \"No matching method for generic function `%s'\", SCM_EOL);\n", proc_name, iname); Printf(df->code, "#undef FUNC_NAME\n"); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); Printf(f_init, "scm_c_define_gsubr(\"%s\", 0, 0, 1, (swig_guile_proc) %s);\n", proc_name, dname); DelWrapper(df); Delete(dispatch); Delete(dname); } } Printf(exported_symbols, "\"%s\", ", proc_name); if (!in_class || memberfunction_name) { // export wrapper into goops file String *method_def = NewString(""); String *goops_name; if (in_class) goops_name = NewString(memberfunction_name); else goops_name = goopsNameMapping(proc_name, ""); String *primitive_name = NewString(""); if (primRenamer) Printv(primitive_name, "primitive:", proc_name, NIL); else Printv(primitive_name, proc_name, NIL); Replaceall(method_signature, "_", "-"); Replaceall(primitive_args, "_", "-"); if (!any_specialized_arg) { /* If there would not be any specialized argument in the method declaration, we simply re-export the function. This is a performance optimization. */ Printv(method_def, "(define ", goops_name, " ", primitive_name, ")\n", NIL); } else if (numreq == numargs) { Printv(method_def, "(define-method (", goops_name, method_signature, ")\n", NIL); Printv(method_def, " (", primitive_name, primitive_args, "))\n", NIL); } else { /* Handle optional args. For the rest argument, use a name that cannot clash. */ Printv(method_def, "(define-method (", goops_name, method_signature, " . %args)\n", NIL); Printv(method_def, " (apply ", primitive_name, primitive_args, " %args))\n", NIL); } if (in_class) { /* Defer method definition till end of class definition. */ Printv(goops_class_methods, method_def, NIL); } else { Printv(goopscode, method_def, NIL); } Printf(goopsexport, "%s ", goops_name); Delete(primitive_name); Delete(goops_name); Delete(method_def); } if (procdoc) { String *returns_text = NewString(""); if (num_results == 0) Printv(returns_text, return_nothing_doc, NIL); else if (num_results == 1) Printv(returns_text, return_one_doc, NIL); else Printv(returns_text, return_multi_doc, NIL); /* Substitute documentation variables */ static const char *numbers[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve" }; if (num_results <= 12) Replaceall(returns_text, "$num_values", numbers[num_results]); else { String *num_results_str = NewStringf("%d", num_results); Replaceall(returns_text, "$num_values", num_results_str); Delete(num_results_str); } Replaceall(returns_text, "$values", returns); Printf(doc_body, "\n%s", returns_text); write_doc(proc_name, signature, doc_body); Delete(returns_text); } Delete(proc_name); Delete(outarg); Delete(cleanup); Delete(signature); Delete(method_signature); Delete(primitive_args); Delete(doc_body); Delete(returns_argout); Delete(returns); Delete(tmp); Delete(scheme_arg_names); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * * Create a link to a C variable. * This creates a single function PREFIX_var_VARNAME(). * This function takes a single optional argument. If supplied, it means * we are setting this variable to some value. If omitted, it means we are * simply evaluating this variable. Either way, we return the variables * value. * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *proc_name; Wrapper *f; String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; f = NewWrapper(); // evaluation function names String *var_name = Swig_name_wrapper(iname); // Build the name for scheme. proc_name = NewString(iname); Replaceall(proc_name, "_", "-"); Setattr(n, "wrap:name", proc_name); if (1 || (SwigType_type(t) != T_USER) || (is_a_pointer(t))) { Printf(f->def, "static SCM\n%s(SCM s_0)\n{\n", var_name); /* Define the scheme name in C. This define is used by several Guile macros. */ Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); Wrapper_add_local(f, "gswig_result", "SCM gswig_result"); if (!GetFlag(n, "feature:immutable")) { /* Check for a setting of the variable value */ Printf(f->code, "if (s_0 != SCM_UNDEFINED) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "s_0"); Replaceall(tm, "$input", "s_0"); Replaceall(tm, "$target", name); /* Printv(f->code,tm,"\n",NIL); */ emit_action_code(n, f->code, tm); } else { throw_unhandled_guile_type_error(t); } Printf(f->code, "}\n"); } // Now return the value of the variable (regardless // of evaluating or setting) if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "gswig_result"); Replaceall(tm, "$result", "gswig_result"); /* Printv(f->code,tm,"\n",NIL); */ emit_action_code(n, f->code, tm); } else { throw_unhandled_guile_type_error(t); } Printf(f->code, "\nreturn gswig_result;\n"); Printf(f->code, "#undef FUNC_NAME\n"); Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); // Now add symbol to the Guile interpreter if (!emit_setters || GetFlag(n, "feature:immutable")) { /* Read-only variables become a simple procedure returning the value; read-write variables become a simple procedure with an optional argument. */ if (!goops && GetFlag(n, "feature:constasvar")) { /* need to export this function as a variable instead of a procedure */ if (scmstub) { /* export the function in the wrapper, and (set!) it in scmstub */ Printf(f_init, "scm_c_define_gsubr(\"%s\", 0, %d, 0, (swig_guile_proc) %s);\n", proc_name, !GetFlag(n, "feature:immutable"), var_name); Printf(scmtext, "(set! %s (%s))\n", proc_name, proc_name); } else { /* export the variable directly */ Printf(f_init, "scm_c_define(\"%s\", %s(SCM_UNDEFINED));\n", proc_name, var_name); } } else { /* Export the function as normal */ Printf(f_init, "scm_c_define_gsubr(\"%s\", 0, %d, 0, (swig_guile_proc) %s);\n", proc_name, !GetFlag(n, "feature:immutable"), var_name); } } else { /* Read/write variables become a procedure with setter. */ Printf(f_init, "{ SCM p = scm_c_define_gsubr(\"%s\", 0, 1, 0, (swig_guile_proc) %s);\n", proc_name, var_name); Printf(f_init, "scm_c_define"); Printf(f_init, "(\"%s\", " "scm_make_procedure_with_setter(p, p)); }\n", proc_name); } Printf(exported_symbols, "\"%s\", ", proc_name); // export wrapper into goops file if (!in_class) { // only if the variable is not part of a class String *class_name = SwigType_typedef_resolve_all(SwigType_base(t)); String *goops_name = goopsNameMapping(proc_name, ""); String *primitive_name = NewString(""); if (primRenamer) Printv(primitive_name, "primitive:", NIL); Printv(primitive_name, proc_name, NIL); /* Simply re-export the procedure */ if ((!emit_setters || GetFlag(n, "feature:immutable")) && GetFlag(n, "feature:constasvar")) { Printv(goopscode, "(define ", goops_name, " (", primitive_name, "))\n", NIL); } else { Printv(goopscode, "(define ", goops_name, " ", primitive_name, ")\n", NIL); } Printf(goopsexport, "%s ", goops_name); Delete(primitive_name); Delete(class_name); Delete(goops_name); } if (procdoc) { /* Compute documentation */ String *signature = NewString(""); String *signature2 = NULL; String *doc = NewString(""); if (GetFlag(n, "feature:immutable")) { Printv(signature, proc_name, NIL); if (GetFlag(n, "feature:constasvar")) { Printv(doc, "Is constant ", NIL); } else { Printv(doc, "Returns constant ", NIL); } if ((tm = Getattr(n, "tmap:varout:doc"))) { Printv(doc, tm, NIL); } else { String *s = SwigType_str(t, 0); Chop(s); Printf(doc, "<%s>", s); Delete(s); } } else if (emit_setters) { Printv(signature, proc_name, NIL); signature2 = NewString(""); Printv(signature2, "set! (", proc_name, ") ", NIL); handle_documentation_typemap(signature2, NIL, n, "tmap:varin:arglist", "new-value"); Printv(doc, "Get or set the value of the C variable, \n", NIL); Printv(doc, "which is of type ", NIL); handle_documentation_typemap(doc, NIL, n, "tmap:varout:doc", "$1_type"); Printv(doc, "."); } else { Printv(signature, proc_name, " #:optional ", NIL); if ((tm = Getattr(n, "tmap:varin:doc"))) { Printv(signature, tm, NIL); } else { String *s = SwigType_str(t, 0); Chop(s); Printf(signature, "new-value <%s>", s); Delete(s); } Printv(doc, "If NEW-VALUE is provided, " "set C variable to this value.\n", NIL); Printv(doc, "Returns variable value ", NIL); if ((tm = Getattr(n, "tmap:varout:doc"))) { Printv(doc, tm, NIL); } else { String *s = SwigType_str(t, 0); Chop(s); Printf(doc, "<%s>", s); Delete(s); } } write_doc(proc_name, signature, doc, signature2); Delete(signature); if (signature2) Delete(signature2); Delete(doc); } } else { Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); } Delete(var_name); Delete(proc_name); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * * We create a read-only variable. * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); int constasvar = GetFlag(n, "feature:constasvar"); String *proc_name; String *var_name; Wrapper *f; SwigType *nctype; String *tm; f = NewWrapper(); // Make a static variable; var_name = NewStringf("%sconst_%s", prefix, iname); // Strip const qualifier from type if present nctype = NewString(type); if (SwigType_isconst(nctype)) { Delete(SwigType_pop(nctype)); } // Build the name for scheme. proc_name = NewString(iname); Replaceall(proc_name, "_", "-"); if ((SwigType_type(nctype) == T_USER) && (!is_a_pointer(nctype))) { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); Delete(var_name); DelWrapper(f); return SWIG_NOWRAP; } // See if there's a typemap if ((tm = Swig_typemap_lookup("constant", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$value", value); Replaceall(tm, "$target", name); Printv(f_header, tm, "\n", NIL); } else { // Create variable and assign it a value Printf(f_header, "static %s = (%s)(%s);\n", SwigType_str(type, var_name), SwigType_str(type, 0), value); } { /* Hack alert: will cleanup later -- Dave */ Node *nn = NewHash(); Setfile(nn, Getfile(n)); Setline(nn, Getline(n)); Setattr(nn, "name", var_name); Setattr(nn, "sym:name", iname); Setattr(nn, "type", nctype); SetFlag(nn, "feature:immutable"); if (constasvar) { SetFlag(nn, "feature:constasvar"); } variableWrapper(nn); Delete(nn); } Delete(var_name); Delete(nctype); Delete(proc_name); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { String *class_name = NewStringf("<%s>", Getattr(n, "sym:name")); Setattr(n, "guile:goopsclassname", class_name); return Language::classDeclaration(n); } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { /* Create new strings for building up a wrapper function */ have_constructor = 0; class_name = NewString(""); short_class_name = NewString(""); Printv(class_name, "<", Getattr(n, "sym:name"), ">", NIL); Printv(short_class_name, Getattr(n, "sym:name"), NIL); Replaceall(class_name, "_", "-"); Replaceall(short_class_name, "_", "-"); if (!addSymbol(class_name, n)) return SWIG_ERROR; /* Handle inheritance */ String *base_class = NewString("<"); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator i = First(baselist); while (i.item) { Printv(base_class, Getattr(i.item, "sym:name"), NIL); i = Next(i); if (i.item) { Printf(base_class, "> <"); } } } Printf(base_class, ">"); Replaceall(base_class, "_", "-"); Printv(goopscode, "(define-class ", class_name, " ", NIL); Printf(goopsexport, "%s ", class_name); if (Len(base_class) > 2) { Printv(goopscode, "(", base_class, ")\n", NIL); } else { Printv(goopscode, "()\n", NIL); } SwigType *ct = NewStringf("p.%s", Getattr(n, "name")); swigtype_ptr = SwigType_manglestr(ct); String *mangled_classname = Swig_name_mangle(Getattr(n, "sym:name")); /* Export clientdata structure */ Printf(f_runtime, "static swig_guile_clientdata _swig_guile_clientdata%s = { NULL, SCM_EOL };\n", mangled_classname); Printv(f_init, "SWIG_TypeClientData(SWIGTYPE", swigtype_ptr, ", (void *) &_swig_guile_clientdata", mangled_classname, ");\n", NIL); SwigType_remember(ct); Delete(ct); /* Emit all of the members */ goops_class_methods = NewString(""); in_class = 1; Language::classHandler(n); in_class = 0; Printv(goopscode, " #:metaclass \n", NIL); if (have_constructor) Printv(goopscode, " #:new-function ", primRenamer ? "primitive:" : "", "new-", short_class_name, "\n", NIL); Printf(goopscode, ")\n%s\n", goops_class_methods); Delete(goops_class_methods); goops_class_methods = 0; /* export class initialization function */ if (goops) { /* export the wrapper function */ String *funcName = NewString(mangled_classname); Printf(funcName, "_swig_guile_setgoopsclass"); String *guileFuncName = NewString(funcName); Replaceall(guileFuncName, "_", "-"); Printv(f_wrappers, "static SCM ", funcName, "(SCM cl) \n", NIL); Printf(f_wrappers, "#define FUNC_NAME %s\n{\n", guileFuncName); Printv(f_wrappers, " ((swig_guile_clientdata *)(SWIGTYPE", swigtype_ptr, "->clientdata))->goops_class = cl;\n", NIL); Printf(f_wrappers, " return SCM_UNSPECIFIED;\n"); Printf(f_wrappers, "}\n#undef FUNC_NAME\n\n"); Printf(f_init, "scm_c_define_gsubr(\"%s\", 1, 0, 0, (swig_guile_proc) %s);\n", guileFuncName, funcName); Printf(exported_symbols, "\"%s\", ", guileFuncName); /* export the call to the wrapper function */ Printf(goopscode, "(%s%s %s)\n\n", primRenamer ? "primitive:" : "", guileFuncName, class_name); Delete(guileFuncName); Delete(funcName); } Delete(mangled_classname); Delete(swigtype_ptr); swigtype_ptr = 0; Delete(class_name); Delete(short_class_name); class_name = 0; short_class_name = 0; return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ int memberfunctionHandler(Node *n) { String *iname = Getattr(n, "sym:name"); String *proc = NewString(iname); Replaceall(proc, "_", "-"); memberfunction_name = goopsNameMapping(proc, short_class_name); Language::memberfunctionHandler(n); Delete(memberfunction_name); memberfunction_name = NULL; Delete(proc); return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ int membervariableHandler(Node *n) { String *iname = Getattr(n, "sym:name"); if (emit_setters) { struct_member = 1; Printf(f_init, "{\n"); } Language::membervariableHandler(n); if (emit_setters) { Printf(f_init, "}\n"); struct_member = 0; } String *proc = NewString(iname); Replaceall(proc, "_", "-"); String *goops_name = goopsNameMapping(proc, short_class_name); /* The slot name is never qualified with the class, even if useclassprefix is true. */ Printv(goopscode, " (", proc, " #:allocation #:virtual", NIL); /* GOOPS (at least in Guile 1.6.3) only accepts closures, not primitive procedures for slot-ref and slot-set. */ Printv(goopscode, "\n #:slot-ref (lambda (obj) (", primRenamer ? "primitive:" : "", short_class_name, "-", proc, "-get", " obj))", NIL); if (!GetFlag(n, "feature:immutable")) { Printv(goopscode, "\n #:slot-set! (lambda (obj value) (", primRenamer ? "primitive:" : "", short_class_name, "-", proc, "-set", " obj value))", NIL); } else { Printf(goopscode, "\n #:slot-set! (lambda (obj value) (error \"Immutable slot\"))"); } if (emit_slot_accessors) { if (GetFlag(n, "feature:immutable")) { Printv(goopscode, "\n #:getter ", goops_name, NIL); } else { Printv(goopscode, "\n #:accessor ", goops_name, NIL); } Printf(goopsexport, "%s ", goops_name); } Printv(goopscode, ")\n", NIL); Delete(proc); Delete(goops_name); return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * ------------------------------------------------------------ */ int constructorHandler(Node *n) { Language::constructorHandler(n); have_constructor = 1; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { exporting_destructor = true; Language::destructorHandler(n); exporting_destructor = false; return SWIG_OK; } /* ------------------------------------------------------------ * pragmaDirective() * ------------------------------------------------------------ */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *cmd = Getattr(n, "name"); String *value = Getattr(n, "value"); # define store_pragma(PRAGMANAME) \ if (Strcmp(cmd, #PRAGMANAME) == 0) { \ if (PRAGMANAME) Delete(PRAGMANAME); \ PRAGMANAME = value ? NewString(value) : NULL; \ } if (Strcmp(lang, "guile") == 0) { store_pragma(beforereturn) store_pragma(return_nothing_doc) store_pragma(return_one_doc) store_pragma(return_multi_doc); # undef store_pragma } } return Language::pragmaDirective(n); } /* ------------------------------------------------------------ * goopsNameMapping() * Maps the identifier from C++ to the GOOPS based * on command * line parameters and such. * If class_name = "" that means the mapping is for a function or * variable not attached to any class. * ------------------------------------------------------------ */ String *goopsNameMapping(String *name, const_String_or_char_ptr class_name) { String *n = NewString(""); if (Strcmp(class_name, "") == 0) { // not part of a class, so no class name to prefix if (goopsprefix) { Printf(n, "%s%s", goopsprefix, name); } else { Printf(n, "%s", name); } } else { if (useclassprefix) { Printf(n, "%s-%s", class_name, name); } else { if (goopsprefix) { Printf(n, "%s%s", goopsprefix, name); } else { Printf(n, "%s", name); } } } return n; } /* ------------------------------------------------------------ * validIdentifier() * ------------------------------------------------------------ */ virtual int validIdentifier(String *s) { char *c = Char(s); /* Check whether we have an R5RS identifier. Guile supports a superset of R5RS identifiers, but it's probably a bad idea to use those. */ /* --> * | */ /* --> | */ if (!(isalpha(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~'))) { /* --> + | - | ... */ if ((strcmp(c, "+") == 0) || strcmp(c, "-") == 0 || strcmp(c, "...") == 0) return 1; else return 0; } /* --> | | */ while (*c) { if (!(isalnum(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~') || (*c == '+') || (*c == '-') || (*c == '.') || (*c == '@'))) return 0; c++; } return 1; } String *runtimeCode() { String *s; s = Swig_include_sys("guile_scm_run.swg"); if (!s) { Printf(stderr, "*** Unable to open 'guile_scm_run.swg"); s = NewString(""); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigguilerun.h"); } }; /* ----------------------------------------------------------------------------- * swig_guile() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_guile() { return new GUILE(); } extern "C" Language *swig_guile(void) { return new_swig_guile(); } swig-4.0.2/Source/Modules/go.cxx0000644000175000017500000062252313667507523016375 0ustar williamwilliam/* ----------------------------------------------------------------------------- * See the LICENSE file for information on copyright, usage and redistribution * of SWIG, and the README file for authors - http://www.swig.org/release.html. * * go.cxx * * Go language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include /* ---------------------------------------------------------------------- * siphash() * * 64-bit SipHash-2-4 to generate unique id for each module * ---------------------------------------------------------------------- */ // An unsigned 64-bit integer that works on a 32-bit host. typedef struct { // Assume unsigned long is at least 32 bits. unsigned long hi; unsigned long lo; } swig_uint64; // Rotate v left by bits, which must be <= 32. static inline void _rotl(swig_uint64 *v, int bits) { assert(bits <= 32); unsigned long tmp = v->hi; if (bits == 32) { v->hi = v->lo; v->lo = tmp; } else { v->hi = (tmp << bits) | ((0xfffffffful & v->lo) >> (32 - bits)); v->lo = (v->lo << bits) | ((0xfffffffful & tmp) >> (32 - bits)); } } // dst ^= src static inline void _xor(swig_uint64 *dst, swig_uint64 *src) { dst->lo ^= src->lo; dst->hi ^= src->hi; } // dst += src static inline void _add(swig_uint64 *dst, swig_uint64 *src) { dst->lo += src->lo; dst->hi += src->hi + ((dst->lo & 0xfffffffful) < (src->lo&0xfffffffful) ? 1 : 0); } #define SIPROUND \ do { \ _add(&v0, &v1); _rotl(&v1, 13); _xor(&v1, &v0); _rotl(&v0, 32); \ _add(&v2, &v3); _rotl(&v3, 16); _xor(&v3, &v2); \ _add(&v0, &v3); _rotl(&v3, 21); _xor(&v3, &v0); \ _add(&v2, &v1); _rotl(&v1, 17); _xor(&v1, &v2); _rotl(&v2, 32); \ } while(0) // Set out to the hash of inc/inlen. static void siphash(swig_uint64 *out, const char *inc, unsigned long inlen) { /* "somepseudorandomlygeneratedbytes" */ swig_uint64 v0 = {0x736f6d65UL, 0x70736575UL}; swig_uint64 v1 = {0x646f7261UL, 0x6e646f6dUL}; swig_uint64 v2 = {0x6c796765UL, 0x6e657261UL}; swig_uint64 v3 = {0x74656462UL, 0x79746573UL}; swig_uint64 b; /* hard-coded k. */ swig_uint64 k0 = {0x07060504UL, 0x03020100UL}; swig_uint64 k1 = {0x0F0E0D0CUL, 0x0B0A0908UL}; int i; const int cROUNDS = 2, dROUNDS = 4; const unsigned char *in = (const unsigned char *)inc; const unsigned char *end = in + inlen - (inlen % 8); int left = inlen & 7; _xor(&v3, &k1); _xor(&v2, &k0); _xor(&v1, &k1); _xor(&v0, &k0); for (; in != end; in += 8) { b.hi = 0; b.lo = 0; for (i = 0; i < 4; i++) { b.lo |= ((unsigned long)in[i]) << (8*i); } for (i = 0; i < 4; i++) { b.hi |= ((unsigned long)in[i+4]) << (8*i); } _xor(&v3, &b); for (i = 0; i < cROUNDS; i++) { SIPROUND; } _xor(&v0, &b); } b.hi = (inlen & 0xff)<<24; b.lo = 0; for (; left; left--) { if (left > 4) { b.hi |= ((unsigned long)in[left-1]) << (8*left-8-32); } else { b.lo |= ((unsigned long)in[left-1]) << (8*left-8); } } _xor(&v3, &b); for(i=0; ilo = 0; out->hi = 0; _xor(out, &v0); _xor(out, &v1); _xor(out, &v2); _xor(out, &v3); } #undef SIPROUND class GO:public Language { static const char *const usage; // Go package name. String *package; // SWIG module name. String *module; // Flag for generating cgo input files. bool cgo_flag; // Flag for generating gccgo output. bool gccgo_flag; // Prefix to use with gccgo. String *go_prefix; // -fgo-prefix option. String *prefix_option; // -fgo-pkgpath option. String *pkgpath_option; // Prefix for translating %import directive to import statements. String *import_prefix; // Whether to use a shared library. bool use_shlib; // Name of shared library to import. String *soname; // Size in bits of the Go type "int". 0 if not specified. int intgo_type_size; /* Output files */ File *f_c_begin; File *f_go_begin; File *f_gc_begin; /* Output fragments */ File *f_c_runtime; File *f_c_header; File *f_c_wrappers; File *f_c_init; File *f_c_directors; File *f_c_directors_h; File *f_go_imports; File *f_go_runtime; File *f_go_header; File *f_go_wrappers; File *f_go_directors; File *f_gc_runtime; File *f_gc_header; File *f_gc_wrappers; File *f_cgo_comment; File *f_cgo_comment_typedefs; // True if we imported a module. bool saw_import; // If not NULL, name of import package being processed. String *imported_package; // Build interface methods while handling a class. This is only // non-NULL when we are handling methods. String *interfaces; // The class node while handling a class. This is only non-NULL // when we are handling methods. Node *class_node; // The class name while handling a class. This is only non-NULL // when we are handling methods. This is the name of the class as // SWIG sees it. String *class_name; // The receiver name while handling a class. This is only non-NULL // when we are handling methods. This is the name of the class // as run through goCPointerType. String *class_receiver; // A hash table of method names that we have seen when processing a // class. This lets us detect base class methods that we don't want // to use. Hash *class_methods; // True when we are generating the wrapper functions for a variable. bool making_variable_wrappers; // True when working with a static member function. bool is_static_member_function; // A hash table of enum types that we have seen but which may not have // been defined. The index is a SwigType. Hash *undefined_enum_types; // A hash table of types that we have seen but which may not have // been defined. The index is a SwigType. Hash *undefined_types; // A hash table of classes which were defined. The index is a Go // type name. Hash *defined_types; // A hash table of all the go_imports already imported. The index is a full // import name e.g. '"runtime"' or '_ "runtime/cgo"' or 'sc "syscall"'. Hash *go_imports; // A unique ID used to make public symbols unique. String *unique_id; public: GO():package(NULL), module(NULL), cgo_flag(true), gccgo_flag(false), go_prefix(NULL), prefix_option(NULL), pkgpath_option(NULL), import_prefix(NULL), use_shlib(false), soname(NULL), intgo_type_size(0), f_c_begin(NULL), f_go_begin(NULL), f_gc_begin(NULL), f_c_runtime(NULL), f_c_header(NULL), f_c_wrappers(NULL), f_c_init(NULL), f_c_directors(NULL), f_c_directors_h(NULL), f_go_imports(NULL), f_go_runtime(NULL), f_go_header(NULL), f_go_wrappers(NULL), f_go_directors(NULL), f_gc_runtime(NULL), f_gc_header(NULL), f_gc_wrappers(NULL), f_cgo_comment(NULL), f_cgo_comment_typedefs(NULL), saw_import(false), imported_package(NULL), interfaces(NULL), class_node(NULL), class_name(NULL), class_receiver(NULL), class_methods(NULL), making_variable_wrappers(false), is_static_member_function(false), undefined_enum_types(NULL), undefined_types(NULL), defined_types(NULL), go_imports(NULL), unique_id(NULL) { director_multiple_inheritance = 1; director_language = 1; director_prot_ctor_code = NewString("_swig_gopanic(\"accessing abstract class or protected constructor\");"); } private: /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("go"); bool display_help = false; // Process command line options. for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-package") == 0) { if (argv[i + 1]) { package = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-cgo") == 0) { Swig_mark_arg(i); cgo_flag = true; } else if (strcmp(argv[i], "-no-cgo") == 0) { Swig_mark_arg(i); cgo_flag = false; } else if (strcmp(argv[i], "-gccgo") == 0) { Swig_mark_arg(i); gccgo_flag = true; } else if (strcmp(argv[i], "-go-prefix") == 0) { if (argv[i + 1]) { prefix_option = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-go-pkgpath") == 0) { if (argv[i + 1]) { pkgpath_option = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-import-prefix") == 0) { if (argv[i + 1]) { import_prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-use-shlib") == 0) { Swig_mark_arg(i); use_shlib = true; } else if (strcmp(argv[i], "-soname") == 0) { if (argv[i + 1]) { soname = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-longsize") == 0) { // Ignore for backward compatibility. if (argv[i + 1]) { Swig_mark_arg(i); Swig_mark_arg(i + 1); ++i; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-intgosize") == 0) { if (argv[i + 1]) { intgo_type_size = atoi(argv[i + 1]); if (intgo_type_size != 32 && intgo_type_size != 64) { Printf(stderr, "-intgosize not 32 or 64\n"); Swig_arg_error(); } Swig_mark_arg(i); Swig_mark_arg(i + 1); ++i; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-help") == 0) { display_help = true; Printf(stdout, "%s\n", usage); } } } if (gccgo_flag && !pkgpath_option && !prefix_option) { prefix_option = NewString("go"); } // Add preprocessor symbol to parser. Preprocessor_define("SWIGGO 1", 0); if (cgo_flag) { Preprocessor_define("SWIGGO_CGO 1", 0); } if (gccgo_flag) { Preprocessor_define("SWIGGO_GCCGO 1", 0); } // This test may be removed in the future, when we can assume that // everybody has upgraded to Go 1.1. The code below is prepared // for this test to simply be taken out. if (intgo_type_size == 0 && !display_help) { Printf(stderr, "SWIG -go: -intgosize option required but not specified\n"); SWIG_exit(EXIT_FAILURE); } if (intgo_type_size == 32) { Preprocessor_define("SWIGGO_INTGO_SIZE 32", 0); } else if (intgo_type_size == 64) { Preprocessor_define("SWIGGO_INTGO_SIZE 64", 0); } else { Preprocessor_define("SWIGGO_INTGO_SIZE 0", 0); } // Add typemap definitions. SWIG_typemap_lang("go"); SWIG_config_file("go.swg"); allow_overloading(); } /* --------------------------------------------------------------------- * top() * * For 6g/8g, we are going to create the following files: * * 1) A .c or .cxx file compiled with gcc. This file will contain * function wrappers. Each wrapper will take a pointer to a * struct holding the arguments, unpack them, and call the real * function. * * 2) A .go file which defines the Go form of all types, and which * defines Go function wrappers. Each wrapper will call the C * function wrapper in the second file. * * 3) A .c file compiled with 6c/8c. This file will define * Go-callable C function wrappers. Each wrapper will use * cgocall to call the function wrappers in the first file. * * When generating code for gccgo, we don't need the third file, and * the function wrappers in the first file have a different form. * * --------------------------------------------------------------------- */ virtual int top(Node *n) { Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode) { if (Getattr(optionsnode, "directors")) { allow_directors(); } if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } allow_allprotected(GetFlag(optionsnode, "allprotected")); } module = Getattr(n, "name"); if (!package) { package = Copy(module); } if (!soname && use_shlib) { soname = Copy(package); Append(soname, ".so"); } if (gccgo_flag) { String *pref; if (pkgpath_option) { pref = pkgpath_option; } else { pref = prefix_option; } go_prefix = NewString(""); for (char *p = Char(pref); *p != '\0'; p++) { if ((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z') || (*p >= '0' && *p <= '9') || *p == '.' || *p == '$') { Putc(*p, go_prefix); } else { Putc('_', go_prefix); } } if (!pkgpath_option) { Append(go_prefix, "."); Append(go_prefix, getModuleName(package)); } } // Get filenames. String *swig_filename = Getattr(n, "infile"); String *c_filename = Getattr(n, "outfile"); String *c_filename_h = Getattr(n, "outfile_h"); String *go_filename = NewString(""); Printf(go_filename, "%s%s.go", SWIG_output_directory(), module); String *gc_filename = NULL; if (!gccgo_flag) { gc_filename = NewString(""); Printf(gc_filename, "%s%s_gc.c", SWIG_output_directory(), module); } // Generate a unique ID based on a hash of the SWIG input. swig_uint64 hash = {0, 0}; FILE *swig_input = Swig_open(swig_filename); if (swig_input == NULL) { FileErrorDisplay(swig_filename); SWIG_exit(EXIT_FAILURE); } String *swig_input_content = Swig_read_file(swig_input); siphash(&hash, Char(swig_input_content), Len(swig_input_content)); Delete(swig_input_content); fclose(swig_input); unique_id = NewString(""); Printf(unique_id, "_%s_%08x%08x", getModuleName(package), hash.hi, hash.lo); // Open files. f_c_begin = NewFile(c_filename, "w", SWIG_output_files()); if (!f_c_begin) { FileErrorDisplay(c_filename); SWIG_exit(EXIT_FAILURE); } if (directorsEnabled()) { if (!c_filename_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_c_directors_h = NewFile(c_filename_h, "w", SWIG_output_files()); if (!f_c_directors_h) { FileErrorDisplay(c_filename_h); SWIG_exit(EXIT_FAILURE); } } f_go_begin = NewFile(go_filename, "w", SWIG_output_files()); if (!f_go_begin) { FileErrorDisplay(go_filename); SWIG_exit(EXIT_FAILURE); } if (!gccgo_flag && !cgo_flag) { f_gc_begin = NewFile(gc_filename, "w", SWIG_output_files()); if (!f_gc_begin) { FileErrorDisplay(gc_filename); SWIG_exit(EXIT_FAILURE); } } f_c_runtime = NewString(""); f_c_header = NewString(""); f_c_wrappers = NewString(""); f_c_init = NewString(""); f_c_directors = NewString(""); f_go_imports = NewString(""); f_go_runtime = NewString(""); f_go_header = NewString(""); f_go_wrappers = NewString(""); f_go_directors = NewString(""); if (!gccgo_flag && !cgo_flag) { f_gc_runtime = NewString(""); f_gc_header = NewString(""); f_gc_wrappers = NewString(""); } if (cgo_flag) { f_cgo_comment = NewString(""); f_cgo_comment_typedefs = NewString(""); } Swig_register_filebyname("begin", f_c_begin); Swig_register_filebyname("runtime", f_c_runtime); Swig_register_filebyname("header", f_c_header); Swig_register_filebyname("wrapper", f_c_wrappers); Swig_register_filebyname("init", f_c_init); Swig_register_filebyname("director", f_c_directors); Swig_register_filebyname("director_h", f_c_directors_h); Swig_register_filebyname("go_begin", f_go_begin); Swig_register_filebyname("go_imports", f_go_imports); Swig_register_filebyname("go_runtime", f_go_runtime); Swig_register_filebyname("go_header", f_go_header); Swig_register_filebyname("go_wrapper", f_go_wrappers); Swig_register_filebyname("go_director", f_go_directors); if (!gccgo_flag && !cgo_flag) { Swig_register_filebyname("gc_begin", f_gc_begin); Swig_register_filebyname("gc_runtime", f_gc_runtime); Swig_register_filebyname("gc_header", f_gc_header); Swig_register_filebyname("gc_wrapper", f_gc_wrappers); } if (cgo_flag) { Swig_register_filebyname("cgo_comment", f_cgo_comment); Swig_register_filebyname("cgo_comment_typedefs", f_cgo_comment_typedefs); } Swig_banner(f_c_begin); if (CPlusPlus) { Printf(f_c_begin, "\n// source: %s\n\n", swig_filename); } else { Printf(f_c_begin, "\n/* source: %s */\n\n", swig_filename); } Printf(f_c_runtime, "#define SWIGMODULE %s\n", module); if (gccgo_flag) { Printf(f_c_runtime, "#define SWIGGO_PREFIX %s\n", go_prefix); } if (directorsEnabled()) { Printf(f_c_runtime, "#define SWIG_DIRECTORS\n"); Swig_banner(f_c_directors_h); Printf(f_c_directors_h, "\n// source: %s\n\n", swig_filename); Printf(f_c_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module); Printf(f_c_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module); Printf(f_c_directors_h, "class Swig_memory;\n\n"); Printf(f_c_directors, "\n// C++ director class methods.\n"); String *filename = Swig_file_filename(c_filename_h); Printf(f_c_directors, "#include \"%s\"\n\n", filename); Delete(filename); } Swig_banner(f_go_begin); Printf(f_go_begin, "\n// source: %s\n", swig_filename); if (!gccgo_flag && !cgo_flag && soname) { Swig_banner(f_gc_begin); Printf(f_gc_begin, "\n/* source: %s */\n\n", swig_filename); Printf(f_gc_begin, "\n/* This file should be compiled with 6c/8c. */\n"); Printf(f_gc_begin, "#pragma dynimport _ _ \"%s\"\n", soname); } if (cgo_flag) { Printv(f_cgo_comment_typedefs, "/*\n", NULL); // The cgo program defines the intgo type after our function // definitions, but we want those definitions to be able to use // intgo also. Printv(f_cgo_comment_typedefs, "#define intgo swig_intgo\n", NULL); Printv(f_cgo_comment_typedefs, "typedef void *swig_voidp;\n", NULL); } // Output module initialization code. Printf(f_go_begin, "\npackage %s\n\n", getModuleName(package)); if (gccgo_flag && !cgo_flag) { Printf(f_go_runtime, "func SwigCgocall()\n"); Printf(f_go_runtime, "func SwigCgocallDone()\n"); Printf(f_go_runtime, "func SwigCgocallBack()\n"); Printf(f_go_runtime, "func SwigCgocallBackDone()\n\n"); } // All the C++ wrappers should be extern "C". Printv(f_c_wrappers, "#ifdef __cplusplus\n", "extern \"C\" {\n", "#endif\n\n", NULL); // Set up the hash table for types not defined by SWIG. undefined_enum_types = NewHash(); undefined_types = NewHash(); defined_types = NewHash(); go_imports = NewHash(); // Emit code. Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_c_runtime); Swig_insert_file("director.swg", f_c_runtime); } Delete(go_imports); // Write out definitions for the types not defined by SWIG. if (Len(undefined_enum_types) > 0) Printv(f_go_wrappers, "\n", NULL); for (Iterator p = First(undefined_enum_types); p.key; p = Next(p)) { String *name = p.item; Printv(f_go_wrappers, "type ", name, " int\n", NULL); } Printv(f_go_wrappers, "\n", NULL); for (Iterator p = First(undefined_types); p.key; p = Next(p)) { String *ty = goType(NULL, p.key); if (!Getattr(defined_types, ty)) { String *cp = goCPointerType(p.key, false); if (!Getattr(defined_types, cp)) { Printv(f_go_wrappers, "type ", cp, " uintptr\n", NULL); Printv(f_go_wrappers, "type ", ty, " interface {\n", NULL); Printv(f_go_wrappers, "\tSwigcptr() uintptr;\n", NULL); Printv(f_go_wrappers, "}\n", NULL); Printv(f_go_wrappers, "func (p ", cp, ") Swigcptr() uintptr {\n", NULL); Printv(f_go_wrappers, "\treturn uintptr(p)\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); } Delete(cp); } Delete(ty); } Delete(undefined_enum_types); Delete(undefined_types); Delete(defined_types); /* Write and cleanup */ Dump(f_c_header, f_c_runtime); if (directorsEnabled()) { Printf(f_c_directors_h, "#endif\n"); Delete(f_c_directors_h); f_c_directors_h = NULL; Dump(f_c_directors, f_c_runtime); Delete(f_c_directors); f_c_directors = NULL; } // End the extern "C". Printv(f_c_wrappers, "#ifdef __cplusplus\n", "}\n", "#endif\n\n", NULL); if (cgo_flag) { // End the cgo comment. Printv(f_cgo_comment, "#undef intgo\n", NULL); Printv(f_cgo_comment, "*/\n", NULL); Printv(f_cgo_comment, "import \"C\"\n", NULL); Printv(f_cgo_comment, "\n", NULL); } Dump(f_c_runtime, f_c_begin); Dump(f_c_wrappers, f_c_begin); Dump(f_c_init, f_c_begin); if (cgo_flag) { Dump(f_cgo_comment_typedefs, f_go_begin); Dump(f_cgo_comment, f_go_begin); } Dump(f_go_imports, f_go_begin); Dump(f_go_header, f_go_begin); Dump(f_go_runtime, f_go_begin); Dump(f_go_wrappers, f_go_begin); if (directorsEnabled()) { Dump(f_go_directors, f_go_begin); } if (!gccgo_flag && !cgo_flag) { Dump(f_gc_header, f_gc_begin); Dump(f_gc_runtime, f_gc_begin); Dump(f_gc_wrappers, f_gc_begin); } Delete(f_c_runtime); Delete(f_c_header); Delete(f_c_wrappers); Delete(f_c_init); Delete(f_go_imports); Delete(f_go_runtime); Delete(f_go_header); Delete(f_go_wrappers); Delete(f_go_directors); if (!gccgo_flag && !cgo_flag) { Delete(f_gc_runtime); Delete(f_gc_header); Delete(f_gc_wrappers); } if (cgo_flag) { Delete(f_cgo_comment); Delete(f_cgo_comment_typedefs); } Delete(f_c_begin); Delete(f_go_begin); if (!gccgo_flag && !cgo_flag) { Delete(f_gc_begin); } return SWIG_OK; } /* ------------------------------------------------------------ * importDirective() * * Handle a SWIG import statement by generating a Go import * statement. * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { String *hold_import = imported_package; String *modname = Getattr(n, "module"); if (modname) { if (!Getattr(go_imports, modname)) { Setattr(go_imports, modname, modname); Printv(f_go_imports, "import \"", NULL); if (import_prefix) { Printv(f_go_imports, import_prefix, "/", NULL); } Printv(f_go_imports, modname, "\"\n", NULL); } imported_package = modname; saw_import = true; } int r = Language::importDirective(n); imported_package = hold_import; return r; } /* ---------------------------------------------------------------------- * Language::insertDirective() * * If the section is go_imports, store them for later. * ---------------------------------------------------------------------- */ virtual int insertDirective(Node *n) { char *section = Char(Getattr(n, "section")); if ((ImportMode && !Getattr(n, "generated")) || !section || (strcmp(section, "go_imports") != 0)) { return Language::insertDirective(n); } char *code = Char(Getattr(n, "code")); char *pch = strtok(code, ","); while (pch != NULL) { // Do not import same thing more than once. if (!Getattr(go_imports, pch)) { Setattr(go_imports, pch, pch); Printv(f_go_imports, "import ", pch, "\n", NULL); } pch = strtok(NULL, ","); } return SWIG_OK; } /* ---------------------------------------------------------------------- * functionWrapper() * * Implement a function. * ---------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { if (GetFlag(n, "feature:ignore")) { return SWIG_OK; } // We don't need explicit calls. if (GetFlag(n, "explicitcall")) { return SWIG_OK; } // Don't emit constructors for abstract director classes. They // will never succeed anyhow. if (Swig_methodclass(n) && Swig_directorclass(n) && Strcmp(Char(Getattr(n, "wrap:action")), director_prot_ctor_code) == 0) { return SWIG_OK; } String *name = Getattr(n, "sym:name"); String *nodetype = Getattr(n, "nodeType"); bool is_static = is_static_member_function || isStatic(n); bool is_friend = isFriend(n); bool is_ctor_dtor = false; SwigType *result = Getattr(n, "type"); // For some reason SWIG changs the "type" value during the call to // functionWrapper. We need to remember the type for possible // overload processing. Setattr(n, "go:type", Copy(result)); String *go_name; String *r1 = NULL; if (making_variable_wrappers) { // Change the name of the variable setter and getter functions // to be more Go like. bool is_set = Strcmp(Char(name) + Len(name) - 4, "_set") == 0; assert(is_set || Strcmp(Char(name) + Len(name) - 4, "_get") == 0); // Start with Set or Get. go_name = NewString(is_set ? "Set" : "Get"); // If this is a static variable, put in the class name, // capitalized. if (is_static && class_name) { String *ccn = exportedName(class_name); Append(go_name, ccn); Delete(ccn); } // Add the rest of the name, capitalized, dropping the _set or // _get. String *c1 = removeClassname(name); String *c2 = exportedName(c1); char *p = Char(c2); int len = Len(p); for (int i = 0; i < len - 4; ++i) { Putc(p[i], go_name); } Delete(c2); Delete(c1); if (!checkIgnoredParameters(n, go_name)) { Delete(go_name); return SWIG_NOWRAP; } } else if (Cmp(nodetype, "constructor") == 0) { is_ctor_dtor = true; // Change the name of a constructor to be more Go like. Change // new_ to New, and capitalize the class name. assert(Strncmp(name, "new_", 4) == 0); String *c1 = NewString(Char(name) + 4); String *c2 = exportedName(c1); go_name = NewString("New"); Append(go_name, c2); Delete(c2); Delete(c1); if (Swig_methodclass(n) && Swig_directorclass(n)) { // The core SWIG code skips the first parameter when // generating the $nondirector_new string. Recreate the // action in this case. But don't it if we are using the // special code for an abstract class. String *call = Swig_cppconstructor_call(getClassType(), Getattr(n, "parms")); SwigType *type = Copy(getClassType()); SwigType_add_pointer(type); String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); } } else if (Cmp(nodetype, "destructor") == 0) { // No need to emit protected destructors. if (!is_public(n)) { return SWIG_OK; } is_ctor_dtor = true; // Change the name of a destructor to be more Go like. Change // delete_ to Delete and capitalize the class name. assert(Strncmp(name, "delete_", 7) == 0); String *c1 = NewString(Char(name) + 7); String *c2 = exportedName(c1); go_name = NewString("Delete"); Append(go_name, c2); Delete(c2); Delete(c1); result = NewString("void"); r1 = result; } else { if (!checkFunctionVisibility(n, NULL)) { return SWIG_OK; } go_name = buildGoName(name, is_static, is_friend); if (!checkIgnoredParameters(n, go_name)) { Delete(go_name); return SWIG_NOWRAP; } } String *overname = NULL; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { String *scope; if (!class_name || is_static || is_ctor_dtor) { scope = NULL; } else { scope = NewString("swiggoscope."); Append(scope, class_name); } if (!checkNameConflict(go_name, n, scope)) { Delete(go_name); return SWIG_NOWRAP; } } String *wname = Swig_name_wrapper(name); if (overname) { Append(wname, overname); } Append(wname, unique_id); Setattr(n, "wrap:name", wname); ParmList *parms = Getattr(n, "parms"); Setattr(n, "wrap:parms", parms); int r = makeWrappers(n, name, go_name, overname, wname, NULL, parms, result, is_static); if (r != SWIG_OK) { return r; } if (Getattr(n, "sym:overloaded") && !Getattr(n, "sym:nextSibling")) { String *scope ; if (!class_name || is_static || is_ctor_dtor) { scope = NULL; } else { scope = NewString("swiggoscope."); Append(scope, class_name); } if (!checkNameConflict(go_name, n, scope)) { Delete(go_name); return SWIG_NOWRAP; } String *receiver = class_receiver; if (is_static || is_ctor_dtor) { receiver = NULL; } r = makeDispatchFunction(n, go_name, receiver, is_static, NULL, false); if (r != SWIG_OK) { return r; } } Delete(wname); Delete(go_name); Delete(r1); return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmemberfunctionHandler() * * For some reason the language code removes the "storage" attribute * for a static function before calling functionWrapper, which means * that we have no way of knowing whether a function is static or * not. That makes no sense in the Go context. Here we note that a * function is static. * ---------------------------------------------------------------------- */ int staticmemberfunctionHandler(Node *n) { assert(!is_static_member_function); is_static_member_function = true; int r = Language::staticmemberfunctionHandler(n); is_static_member_function = false; return r; } /* ---------------------------------------------------------------------- * makeWrappers() * * Write out the various function wrappers. * n: The function we are emitting. * name: The function name. * go_name: The name of the function in Go. * overname: The overload string for overloaded function. * wname: The SWIG wrapped name--the name of the C function. * base: A list of the names of base classes, in the case where this * is a virtual method not defined in the current class. * parms: The parameters. * result: The result type. * is_static: Whether this is a static method or member. * ---------------------------------------------------------------------- */ int makeWrappers(Node *n, String *name, String *go_name, String *overname, String *wname, List *base, ParmList *parms, SwigType *result, bool is_static) { assert(result); int ret = SWIG_OK; if (cgo_flag) { int r = makeCgoWrappers(n, go_name, overname, wname, base, parms, result, is_static); if (r != SWIG_OK) { ret = r; } } else { int r = goFunctionWrapper(n, name, go_name, overname, wname, base, parms, result, is_static); if (r != SWIG_OK) { ret = r; } if (!gccgo_flag) { r = gcFunctionWrapper(wname); if (r != SWIG_OK) { ret = r; } r = gccFunctionWrapper(n, base, wname, parms, result); if (r != SWIG_OK) { ret = r; } } else { r = gccgoFunctionWrapper(n, base, wname, parms, result); if (r != SWIG_OK) { ret = r; } } } if (class_methods) { Setattr(class_methods, Getattr(n, "name"), NewString("")); } return ret; } /* ---------------------------------------------------------------------- * struct cgoWrapperInfo * * Information needed by the CGO wrapper functions. * ---------------------------------------------------------------------- */ struct cgoWrapperInfo { // The function we are generating code for. Node *n; // The name of the Go function. String *go_name; // The overload string for an overloaded function. String *overname; // The name of the C wrapper function. String *wname; // The base classes. List *base; // The parameters. ParmList *parms; // The result type. SwigType *result; // Whether this is a static function, not a class method. bool is_static; // The Go receiver type. String *receiver; // Whether this is a class constructor. bool is_constructor; // Whether this is a class destructor. bool is_destructor; }; /* ---------------------------------------------------------------------- * makeCgoWrappers() * * Write out the wrappers for a function when producing cgo input * files. * ---------------------------------------------------------------------- */ int makeCgoWrappers(Node *n, String *go_name, String *overname, String *wname, List *base, ParmList *parms, SwigType *result, bool is_static) { Swig_save("makeCgoWrappers", n, "emit:cgotype", "emit:cgotypestruct", NULL); cgoWrapperInfo info; info.n = n; info.go_name = go_name; info.overname = overname; info.wname = wname; info.base = base; info.parms = parms; info.result = result; info.is_static = is_static; info.receiver = class_receiver; if (is_static) { info.receiver = NULL; } String *nodetype = Getattr(n, "nodeType"); info.is_constructor = Cmp(nodetype, "constructor") == 0; info.is_destructor = Cmp(nodetype, "destructor") == 0; if (info.is_constructor || info.is_destructor) { assert(class_receiver); assert(!base); info.receiver = NULL; } int ret = SWIG_OK; int r = cgoGoWrapper(&info); if (r != SWIG_OK) { ret = r; } r = cgoCommentWrapper(&info); if (r != SWIG_OK) { ret = r; } r = cgoGccWrapper(&info); if (r != SWIG_OK) { ret = r; } Swig_restore(n); return ret; } /* ---------------------------------------------------------------------- * cgoGoWrapper() * * Write out Go code to call a cgo function. This code will go into * the generated Go output file. * ---------------------------------------------------------------------- */ int cgoGoWrapper(const cgoWrapperInfo *info) { Wrapper *dummy = initGoTypemaps(info->parms); bool add_to_interface = interfaces && !info->is_constructor && !info->is_destructor && !info->is_static && !info->overname && checkFunctionVisibility(info->n, NULL); Printv(f_go_wrappers, "func ", NULL); Parm *p = info->parms; int pi = 0; // Add the receiver first if this is a method. if (info->receiver) { Printv(f_go_wrappers, "(", NULL); if (info->base && info->receiver) { Printv(f_go_wrappers, "_swig_base", NULL); } else { Printv(f_go_wrappers, Getattr(p, "lname"), NULL); p = nextParm(p); ++pi; } Printv(f_go_wrappers, " ", info->receiver, ") ", NULL); } Printv(f_go_wrappers, info->go_name, NULL); if (info->overname) { Printv(f_go_wrappers, info->overname, NULL); } Printv(f_go_wrappers, "(", NULL); // If we are doing methods, add this method to the interface. if (add_to_interface) { Printv(interfaces, "\t", info->go_name, "(", NULL); } // Write out the parameters to both the function definition and // the interface. String *parm_print = NewString(""); int parm_count = emit_num_arguments(info->parms); int required_count = emit_num_required(info->parms); int args = 0; for (; pi < parm_count; ++pi) { p = getParm(p); if (pi == 0 && info->is_destructor) { String *cl = exportedName(class_name); Printv(parm_print, Getattr(p, "lname"), " ", cl, NULL); Delete(cl); ++args; } else { if (args > 0) { Printv(parm_print, ", ", NULL); } ++args; if (pi >= required_count) { Printv(parm_print, "_swig_args ...interface{}", NULL); break; } Printv(parm_print, Getattr(p, "lname"), " ", NULL); String *tm = goType(p, Getattr(p, "type")); Printv(parm_print, tm, NULL); Delete(tm); } p = nextParm(p); } Printv(parm_print, ")", NULL); // Write out the result type. if (info->is_constructor) { String *cl = exportedName(class_name); Printv(parm_print, " (_swig_ret ", cl, ")", NULL); Delete(cl); } else { if (SwigType_type(info->result) != T_VOID) { String *tm = goType(info->n, info->result); Printv(parm_print, " (_swig_ret ", tm, ")", NULL); Delete(tm); } } Printv(f_go_wrappers, parm_print, NULL); if (add_to_interface) { Printv(interfaces, parm_print, "\n", NULL); } // Write out the function body. Printv(f_go_wrappers, " {\n", NULL); if (parm_count > required_count) { Parm *p = info->parms; int i; for (i = 0; i < required_count; ++i) { p = getParm(p); p = nextParm(p); } for (; i < parm_count; ++i) { p = getParm(p); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, "\tvar ", Getattr(p, "lname"), " ", tm, "\n", NULL); Printf(f_go_wrappers, "\tif len(_swig_args) > %d {\n", i - required_count); Printf(f_go_wrappers, "\t\t%s = _swig_args[%d].(%s)\n", Getattr(p, "lname"), i - required_count, tm); Printv(f_go_wrappers, "\t}\n", NULL); Delete(tm); p = nextParm(p); } } String *call = NewString("\t"); String *ret_type = NULL; bool memcpy_ret = false; String *wt = NULL; if (SwigType_type(info->result) != T_VOID) { if (info->is_constructor) { ret_type = exportedName(class_name); } else { ret_type = goImType(info->n, info->result); } Printv(f_go_wrappers, "\tvar swig_r ", ret_type, "\n", NULL); bool c_struct_type; Delete(cgoTypeForGoValue(info->n, info->result, &c_struct_type)); if (c_struct_type) { memcpy_ret = true; } if (memcpy_ret) { Printv(call, "swig_r_p := ", NULL); } else { Printv(call, "swig_r = (", ret_type, ")(", NULL); } if (info->is_constructor || goTypeIsInterface(info->n, info->result)) { if (info->is_constructor) { wt = Copy(class_receiver); } else { wt = goWrapperType(info->n, info->result, true); } Printv(call, wt, "(", NULL); } } Printv(call, "C.", info->wname, "(", NULL); args = 0; if (parm_count > required_count) { Printv(call, "C.swig_intgo(len(_swig_args))", NULL); ++args; } if (info->base && info->receiver) { if (args > 0) { Printv(call, ", ", NULL); } ++args; Printv(call, "C.uintptr_t(_swig_base)", NULL); } p = info->parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (args > 0) { Printv(call, ", ", NULL); } ++args; SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *ivar = NewStringf("_swig_i_%d", i); String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(f_go_wrappers, "\t", ivar, " := ", ln, NULL); if ((i == 0 && info->is_destructor) || ((i > 0 || !info->receiver || info->base || info->is_constructor) && goTypeIsInterface(p, pt))) { Printv(f_go_wrappers, ".Swigcptr()", NULL); } Printv(f_go_wrappers, "\n", NULL); Setattr(p, "emit:goinput", ln); } else { String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, "\n", NULL); Delete(goin); Setattr(p, "emit:goinput", ivar); } bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); if (c_struct_type) { Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { Printv(call, "C.", ct, "(", ivar, ")", NULL); } Delete(ct); p = nextParm(p); } Printv(f_go_wrappers, call, ")", NULL); Delete(call); if (wt) { // Close the type conversion to the wrapper type. Printv(f_go_wrappers, ")", NULL); } if (SwigType_type(info->result) != T_VOID && !memcpy_ret) { // Close the type conversion of the return value. Printv(f_go_wrappers, ")", NULL); } Printv(f_go_wrappers, "\n", NULL); if (memcpy_ret) { Printv(f_go_wrappers, "\tswig_r = *(*", ret_type, ")(unsafe.Pointer(&swig_r_p))\n", NULL); } if (ret_type) { Delete(ret_type); } goargout(info->parms); if (SwigType_type(info->result) != T_VOID) { Swig_save("cgoGoWrapper", info->n, "type", "tmap:goout", NULL); Setattr(info->n, "type", info->result); String *goout = goTypemapLookup("goout", info->n, "swig_r"); if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goType(info->n, info->result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); goout = Copy(goout); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } Swig_restore(info->n); } Printv(f_go_wrappers, "}\n\n", NULL); DelWrapper(dummy); return SWIG_OK; } /* ---------------------------------------------------------------------- * cgoCommentWrapper() * * Write out a cgo function to call a C/C++ function. This code * will go into the cgo comment in the generated Go output file. * ---------------------------------------------------------------------- */ int cgoCommentWrapper(const cgoWrapperInfo *info) { String *ret_type; if (SwigType_type(info->result) == T_VOID) { ret_type = NewString("void"); } else { bool c_struct_type; ret_type = cgoTypeForGoValue(info->n, info->result, &c_struct_type); } Printv(f_cgo_comment, "extern ", ret_type, " ", info->wname, "(", NULL); Delete(ret_type); int parm_count = emit_num_arguments(info->parms); int required_count = emit_num_required(info->parms); int args = 0; if (parm_count > required_count) { Printv(f_cgo_comment, "intgo _swig_args", NULL); ++args; } if (info->base && info->receiver) { if (args > 0) { Printv(f_cgo_comment, ", ", NULL); } ++args; Printv(f_cgo_comment, "uintptr_t _swig_base", NULL); } Parm *p = info->parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (args > 0) { Printv(f_cgo_comment, ", ", NULL); } ++args; SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); Printv(f_cgo_comment, ct, " ", ln, NULL); Delete(ct); p = nextParm(p); } if (args == 0) { Printv(f_cgo_comment, "void", NULL); } Printv(f_cgo_comment, ");\n", NULL); return SWIG_OK; } /* ---------------------------------------------------------------------- * cgoGccWrapper() * * Write out code to the C/C++ wrapper file. This code will be * called by the code generated by cgoCommentWrapper. * ---------------------------------------------------------------------- */ int cgoGccWrapper(const cgoWrapperInfo *info) { Wrapper *f = NewWrapper(); Swig_save("cgoGccWrapper", info->n, "parms", NULL); ParmList *parms = info->parms; Parm *base_parm = NULL; if (info->base && !isStatic(info->n)) { SwigType *base_type = Copy(getClassType()); SwigType_add_pointer(base_type); base_parm = NewParm(base_type, NewString("arg1"), info->n); set_nextSibling(base_parm, parms); parms = base_parm; } emit_parameter_variables(parms, f); emit_attach_parmmaps(parms, f); int parm_count = emit_num_arguments(parms); int required_count = emit_num_required(parms); emit_return_variable(info->n, info->result, f); // Start the function definition. String *fnname = NewString(""); Printv(fnname, info->wname, "(", NULL); int args = 0; if (parm_count > required_count) { Printv(fnname, "intgo _swig_optargc", NULL); ++args; } Parm *p = parms; for (int i = 0; i < parm_count; ++i) { if (args > 0) { Printv(fnname, ", ", NULL); } ++args; p = getParm(p); SwigType *pt = Copy(Getattr(p, "type")); if (SwigType_isarray(pt)) { SwigType_del_array(pt); SwigType_add_pointer(pt); } String *pn = NewStringf("_swig_go_%d", i); String *ct = gcCTypeForGoValue(p, pt, pn); Printv(fnname, ct, NULL); Delete(ct); Delete(pn); Delete(pt); p = nextParm(p); } Printv(fnname, ")", NULL); if (SwigType_type(info->result) == T_VOID) { Printv(f->def, "void ", fnname, NULL); } else { String *ct = gcCTypeForGoValue(info->n, info->result, fnname); Printv(f->def, ct, NULL); Delete(ct); String *ln = NewString("_swig_go_result"); ct = gcCTypeForGoValue(info->n, info->result, ln); Wrapper_add_local(f, "_swig_go_result", ct); Delete(ct); Delete(ln); } Delete(fnname); Printv(f->def, " {\n", NULL); // Apply the in typemaps. p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = Getattr(p, "tmap:in"); if (!tm) { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "unable to use type %s as a function argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); String *pn = NewStringf("_swig_go_%d", i); Replaceall(tm, "$input", pn); if (i < required_count) { Printv(f->code, "\t", tm, "\n", NULL); } else { Printf(f->code, "\tif (_swig_optargc > %d) {\n", i - required_count); Printv(f->code, "\t\t", tm, "\n", NULL); Printv(f->code, "\t}\n", NULL); } Delete(tm); Setattr(p, "emit:input", pn); } p = nextParm(p); } Printv(f->code, "\n", NULL); // Do the real work of the function. checkConstraints(parms, f); emitGoAction(info->n, info->base, parms, info->result, f); argout(parms, f); cleanupFunction(info->n, f, parms); if (SwigType_type(info->result) != T_VOID) { Printv(f->code, "\treturn _swig_go_result;\n", NULL); } Printv(f->code, "}\n", NULL); Wrapper_print(f, f_c_wrappers); Swig_restore(info->n); DelWrapper(f); if (base_parm) { Delete(base_parm); } return SWIG_OK; } /* ---------------------------------------------------------------------- * goFunctionWrapper() * * Write out a function wrapper in Go. When not implementing a * method, the actual code is all in C; here we just declare the C * function. When implementing a method, we have to call the C * function, because it will have a different name. If base is not * NULL, then we are being called to forward a virtual method to a * base class. * ---------------------------------------------------------------------- */ int goFunctionWrapper(Node *n, String *name, String *go_name, String *overname, String *wname, List *base, ParmList *parms, SwigType *result, bool is_static) { Wrapper *dummy = initGoTypemaps(parms); int parm_count = emit_num_arguments(parms); int required_count = emit_num_required(parms); String *receiver = class_receiver; if (receiver && is_static) { receiver = NULL; } String *nodetype = Getattr(n, "nodeType"); bool is_constructor = Cmp(nodetype, "constructor") == 0; bool is_destructor = Cmp(nodetype, "destructor") == 0; if (is_constructor || is_destructor) { assert(class_receiver); assert(!base); receiver = NULL; } Swig_save("cgoGoWrapper", n, "type", "tmap:goout", NULL); Setattr(n, "type", result); String *goout = goTypemapLookup("goout", n, "swig_r"); Swig_restore(n); bool add_to_interface = (interfaces && !is_constructor && !is_destructor && !is_static && !overname && checkFunctionVisibility(n, NULL)); bool needs_wrapper = (gccgo_flag || receiver || is_constructor || is_destructor || parm_count > required_count); bool has_goout = false; if (goout) { has_goout = true; } // See whether any of the function parameters are represented by // interface values. When calling the C++ code, we need to convert // back to a uintptr. Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *ty = Getattr(p, "type"); if (goGetattr(p, "tmap:goargout")) { has_goout = true; needs_wrapper = true; } else if (goTypeIsInterface(p, ty) || goGetattr(p, "tmap:goin")) { needs_wrapper = true; } if (paramNeedsEscape(p)) { needs_wrapper = true; } p = nextParm(p); } if (goTypeIsInterface(n, result) || goout != NULL) { needs_wrapper = true; } if (!gccgo_flag) { Printv(f_go_wrappers, "var ", wname, " unsafe.Pointer\n\n", NULL); } // If this is a method, first declare the C function we will call. // If we do not need a wrapper, then we will only be writing a // declaration. String *wrapper_name = NULL; if (needs_wrapper) { wrapper_name = buildGoWrapperName(name, overname); if (gccgo_flag) { Printv(f_go_wrappers, "//extern ", go_prefix, "_", wname, "\n", NULL); } bool arg = false; Printv(f_go_wrappers, "func ", wrapper_name, "(", NULL); if (parm_count > required_count) { Printv(f_go_wrappers, argName(&arg), " int", NULL); } Parm *p = getParm(parms); int i = 0; if (is_destructor) { if (parm_count > required_count) { Printv(f_go_wrappers, ", ", NULL); } Printv(f_go_wrappers, argName(&arg), " uintptr", NULL); ++i; p = nextParm(p); } else if (receiver && (base || !is_constructor)) { if (parm_count > required_count) { Printv(f_go_wrappers, ", ", NULL); } Printv(f_go_wrappers, argName(&arg), " ", receiver, NULL); if (!base) { ++i; p = nextParm(p); } } for (; i < parm_count; ++i) { p = getParm(p); if (i > 0 || (base && receiver) || parm_count > required_count) { Printv(f_go_wrappers, ", ", NULL); } String *tm = goWrapperType(p, Getattr(p, "type"), false); Printv(f_go_wrappers, argName(&arg), " ", tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (is_constructor) { Printv(f_go_wrappers, " (", argName(&arg), " ", class_receiver, ")", NULL); } else { if (SwigType_type(result) != T_VOID) { String *tm = goWrapperType(n, result, true); Printv(f_go_wrappers, " (", argName(&arg), " ", tm, ")", NULL); Delete(tm); } } if (!gccgo_flag) { Printv(f_go_wrappers, " {\n", NULL); if (arg) { Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&base))\n", NULL); } else { Printv(f_go_wrappers, "\tvar _swig_p uintptr\n", NULL); } Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", wname, ", _swig_p)\n", NULL); Printv(f_go_wrappers, "\treturn\n", NULL); Printv(f_go_wrappers, "}", NULL); } Printv(f_go_wrappers, "\n\n", NULL); } // Start defining the Go function. if (!needs_wrapper && gccgo_flag) { Printv(f_go_wrappers, "//extern ", go_prefix, "_", wname, "\n", NULL); } Printv(f_go_wrappers, "func ", NULL); p = parms; int pi = 0; // Add the receiver if this is a method. String *first = NULL; if (receiver) { Printv(f_go_wrappers, "(", NULL); if (base && receiver) { Printv(f_go_wrappers, "_swig_base", NULL); if (first == NULL) { first = NewString("_swig_base"); } } else { Printv(f_go_wrappers, Getattr(p, "lname"), NULL); if (first == NULL) { first = Copy(Getattr(p, "lname")); } p = nextParm(p); ++pi; } Printv(f_go_wrappers, " ", receiver, ") ", NULL); } Printv(f_go_wrappers, go_name, NULL); if (overname) { Printv(f_go_wrappers, overname, NULL); } Printv(f_go_wrappers, "(", NULL); // If we are doing methods, add this function to the interface. if (add_to_interface) { Printv(interfaces, "\t", go_name, "(", NULL); } // Write out the parameters to both the function definition and // the interface. String *parm_print = NewString(""); for (; pi < parm_count; ++pi) { p = getParm(p); if (pi == 0 && is_destructor) { String *cl = exportedName(class_name); Printv(parm_print, Getattr(p, "lname"), " ", cl, NULL); if (first == NULL) { first = Copy(Getattr(p, "lname")); } Delete(cl); } else { if (pi > (receiver && !base ? 1 : 0)) { Printv(parm_print, ", ", NULL); } if (pi >= required_count) { Printv(parm_print, "_swig_args ...interface{}", NULL); if (first == NULL) { first = NewString("_swig_args"); } break; } Printv(parm_print, Getattr(p, "lname"), " ", NULL); if (first == NULL) { first = Copy(Getattr(p, "lname")); } String *tm = goType(p, Getattr(p, "type")); Printv(parm_print, tm, NULL); Delete(tm); } p = nextParm(p); } Printv(parm_print, ")", NULL); // Write out the result type. if (is_constructor) { String *cl = exportedName(class_name); Printv(parm_print, " (_swig_ret ", cl, ")", NULL); if (first == NULL) { first = NewString("_swig_ret"); } Delete(cl); } else { if (SwigType_type(result) != T_VOID) { String *tm = goType(n, result); Printv(parm_print, " (_swig_ret ", tm, ")", NULL); if (first == NULL) { first = NewString("_swig_ret"); } Delete(tm); } } Printv(f_go_wrappers, parm_print, NULL); if (add_to_interface) { Printv(interfaces, parm_print, "\n", NULL); } // If this is a wrapper, we need to actually call the C function. if (needs_wrapper) { Printv(f_go_wrappers, " {\n", NULL); if (parm_count > required_count) { Parm *p = parms; int i; for (i = 0; i < required_count; ++i) { p = getParm(p); p = nextParm(p); } for (; i < parm_count; ++i) { p = getParm(p); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, "\tvar ", Getattr(p, "lname"), " ", tm, "\n", NULL); Printf(f_go_wrappers, "\tif len(_swig_args) > %d {\n", i - required_count); Printf(f_go_wrappers, "\t\t%s = _swig_args[%d].(%s)\n", Getattr(p, "lname"), i - required_count, tm); Printv(f_go_wrappers, "\t}\n", NULL); Delete(tm); p = nextParm(p); } } String *call = NewString(""); bool need_return_var = SwigType_type(result) != T_VOID && ((gccgo_flag && is_constructor) || has_goout); if (need_return_var) { Printv(f_go_wrappers, "\tvar swig_r ", NULL); if (is_constructor) { String *cl = exportedName(class_name); Printv(f_go_wrappers, cl, NULL); Delete(cl); } else { Printv(f_go_wrappers, goImType(n, result), NULL); } Printv(f_go_wrappers, "\n", NULL); } if (gccgo_flag) { if (has_goout || is_constructor) { Printv(call, "\tfunc() {\n", NULL); } Printv(call, "\tdefer SwigCgocallDone()\n", NULL); Printv(call, "\tSwigCgocall()\n", NULL); } Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { if (need_return_var) { Printv(call, "swig_r = ", NULL); } else { Printv(call, "return ", NULL); } } Printv(call, wrapper_name, "(", NULL); if (parm_count > required_count) { Printv(call, "len(_swig_args)", NULL); } if (base && receiver) { if (parm_count > required_count) { Printv(call, ", ", NULL); } Printv(call, "_swig_base", NULL); } Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0 || (base && receiver) || parm_count > required_count) { Printv(call, ", ", NULL); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(call, ln, NULL); if ((i == 0 && is_destructor) || ((i > 0 || !receiver || base || is_constructor) && goTypeIsInterface(p, pt))) { Printv(call, ".Swigcptr()", NULL); } Setattr(p, "emit:goinput", ln); } else { String *ivar = NewString(""); Printf(ivar, "_swig_i_%d", i); String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, "\n", NULL); Delete(goin); Printv(call, ivar, NULL); Setattr(p, "emit:goinput", ivar); } // If the parameter has an argout or freearg typemap, make // sure that it escapes. if (paramNeedsEscape(p)) { Printv(f_go_wrappers, "\tif Swig_escape_always_false {\n", NULL); Printv(f_go_wrappers, "\t\tSwig_escape_val = ", Getattr(p, "emit:goinput"), "\n", NULL); Printv(f_go_wrappers, "\t}\n", NULL); } p = nextParm(p); } Printv(call, ")\n", NULL); if (gccgo_flag && (has_goout || is_constructor)) { Printv(call, "\t}()\n", NULL); } Printv(f_go_wrappers, call, NULL); Delete(call); goargout(parms); if (need_return_var) { if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goType(n, result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } } Printv(f_go_wrappers, "}\n", NULL); } else if (!gccgo_flag) { // We don't need a wrapper. If we're using gccgo, the function // declaration is all we need--it has a //extern comment to // GCC-compiled wrapper. If we're not using gccgo, we need to // call the GCC-compiled wrapper here. Printv(f_go_wrappers, " {\n", NULL); if (first == NULL) { Printv(f_go_wrappers, "\tvar _swig_p uintptr\n", NULL); } else { Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&", first, "))\n", NULL); } Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", wname, ", _swig_p)\n", NULL); Printv(f_go_wrappers, "\treturn\n", NULL); Printv(f_go_wrappers, "}", NULL); } Printv(f_go_wrappers, "\n", NULL); Delete(wrapper_name); DelWrapper(dummy); return SWIG_OK; } /* ---------------------------------------------------------------------- * initGoTypemaps() * * Initialize the typenames for a Go wrapper, returning a dummy * Wrapper*. Also set consistent names for the parameters. * ---------------------------------------------------------------------- */ Wrapper* initGoTypemaps(ParmList *parms) { Wrapper *dummy = NewWrapper(); emit_attach_parmmaps(parms, dummy); Parm *p = parms; int parm_count = emit_num_arguments(parms); for (int i = 0; i < parm_count; ++i) { p = getParm(p); Swig_cparm_name(p, i); p = nextParm(p); } Swig_typemap_attach_parms("default", parms, dummy); Swig_typemap_attach_parms("gotype", parms, dummy); Swig_typemap_attach_parms("goin", parms, dummy); Swig_typemap_attach_parms("goargout", parms, dummy); Swig_typemap_attach_parms("imtype", parms, dummy); return dummy; } /* ---------------------------------------------------------------------- * argName() * * A helper for goFunctionWrapper to output the first argument name * as "base" and all others as "_". * ---------------------------------------------------------------------- */ const char *argName(bool *arg) { if (*arg) { return "_"; } *arg = true; return "base"; } /* ---------------------------------------------------------------------- * paramNeedsEscape() * * A helper for goFunctionWrapper that returns whether a parameter * needs to explicitly escape. This is true if the parameter has a * non-empty argout or freearg typemap, because in those cases the * Go argument might be or contain a pointer. We need to ensure * that that pointer does not point into the stack, which means that * it needs to escape. * ---------------------------------------------------------------------- */ bool paramNeedsEscape(Parm *p) { String *argout = Getattr(p, "tmap:argout"); String *freearg = Getattr(p, "tmap:freearg"); if ((!argout || Len(argout) == 0) && (!freearg || Len(freearg) == 0)) { return false; } // If a C++ type is represented as an interface type in Go, then // we don't care whether it escapes, because we know that the // pointer is a C++ pointer. if (goTypeIsInterface(p, Getattr(p, "type"))) { return false; } return true; } /* ---------------------------------------------------------------------- * gcFunctionWrapper() * * This is used for 6g/8g, not for gccgo. Write out the function * redirector that will be compiled with 6c/8c. This used to write * out a real function wrapper, but that has moved into Go code. * ---------------------------------------------------------------------- */ int gcFunctionWrapper(String *wname) { Wrapper *f = NewWrapper(); Printv(f->def, "#pragma dynimport ", wname, " ", wname, " \"\"\n", NULL); Printv(f->def, "#pragma cgo_import_static ", wname, "\n", NULL); Printv(f->def, "extern void ", wname, "(void*);\n", NULL); // Declare this as a uintptr, since it is not a pointer into the // Go heap. // \xc2\xb7 is UTF-8 for U+00B7 which is Unicode 'Middle Dot' Printv(f->def, "uintptr \xc2\xb7", wname, " = (uintptr)", wname, ";\n", NULL); Wrapper_print(f, f_gc_wrappers); DelWrapper(f); return SWIG_OK; } /* ---------------------------------------------------------------------- * gccFunctionWrapper() * * This is used for 6g/8g, not for gccgo. Write out the function * wrapper which will be compiled with gcc. If the base parameter * is not NULL, this is calls the base class method rather than * executing the SWIG wrapper code. * ---------------------------------------------------------------------- */ int gccFunctionWrapper(Node *n, List *base, String *wname, ParmList *parms, SwigType *result) { Wrapper *f = NewWrapper(); Swig_save("gccFunctionWrapper", n, "parms", NULL); Parm *base_parm = NULL; if (base && !isStatic(n)) { SwigType *base_type = Copy(getClassType()); SwigType_add_pointer(base_type); base_parm = NewParm(base_type, NewString("arg1"), n); set_nextSibling(base_parm, parms); parms = base_parm; } emit_parameter_variables(parms, f); emit_attach_parmmaps(parms, f); int parm_count = emit_num_arguments(parms); int required_count = emit_num_required(parms); bool needs_swigargs = false; emit_return_variable(n, result, f); // Start the function definition. Printv(f->def, "void\n", wname, "(void *swig_v)\n", "{\n", NULL); // The single function parameter is a pointer to the real argument // values. Define the structure that it points to. String *swigargs = NewString("\tstruct swigargs {\n"); if (parm_count > required_count) { needs_swigargs = true; Printv(swigargs, "\t\tintgo _swig_optargc;\n", NULL); } Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *ln = Getattr(p, "lname"); SwigType *pt = Getattr(p, "type"); String *ct = gcCTypeForGoValue(p, pt, ln); Printv(swigargs, "\t\t\t", ct, ";\n", NULL); needs_swigargs = true; Delete(ct); String *gn = NewStringf("_swig_go_%d", i); ct = gcCTypeForGoValue(p, pt, gn); Setattr(p, "emit:input", gn); Wrapper_add_local(f, gn, ct); Delete(ct); p = nextParm(p); } if (SwigType_type(result) != T_VOID) { Printv(swigargs, "\t\tlong : 0;\n", NULL); String *ln = NewString(Swig_cresult_name()); String *ct = gcCTypeForGoValue(n, result, ln); Delete(ln); Printv(swigargs, "\t\t", ct, ";\n", NULL); needs_swigargs = true; Delete(ct); ln = NewString("_swig_go_result"); ct = gcCTypeForGoValue(n, result, ln); Wrapper_add_local(f, "_swig_go_result", ct); Delete(ct); Delete(ln); } Printv(swigargs, "\t} SWIGSTRUCTPACKED *swig_a = (struct swigargs *) swig_v;\n", NULL); // Copy the input arguments out of the structure into the Go local // variables. p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *ln = Getattr(p, "lname"); String *gn = Getattr(p, "emit:input"); Printv(f->code, "\t", gn, " = swig_a->", ln, ";\n", NULL); p = nextParm(p); } // Apply the in typemaps. p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = Getattr(p, "tmap:in"); if (!tm) { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); String *gn = Getattr(p, "emit:input"); Replaceall(tm, "$input", gn); if (i < required_count) { Printv(f->code, "\t", tm, "\n", NULL); } else { Printf(f->code, "\tif (swig_a->_swig_optargc > %d) {\n", i - required_count); Printv(f->code, "\t\t", tm, "\n", NULL); Printv(f->code, "\t}\n", NULL); } Delete(tm); } p = nextParm(p); } Printv(f->code, "\n", NULL); // Do the real work of the function. checkConstraints(parms, f); emitGoAction(n, base, parms, result, f); argout(parms, f); cleanupFunction(n, f, parms); if (needs_swigargs) { Printv(f->locals, swigargs, NULL); } Printv(f->code, "}\n", NULL); Wrapper_print(f, f_c_wrappers); Swig_restore(n); Delete(swigargs); DelWrapper(f); Delete(base_parm); return SWIG_OK; } /* ---------------------------------------------------------------------- * gccgoFunctionWrapper() * * This is used for gccgo, not 6g/8g. Write out the function * wrapper which will be compiled with gcc. If the base parameter * is not NULL, this is calls the base class method rather than * executing the SWIG wrapper code. * ---------------------------------------------------------------------- */ int gccgoFunctionWrapper(Node *n, List *base, String *wname, ParmList *parms, SwigType *result) { Wrapper *f = NewWrapper(); Swig_save("gccgoFunctionWrapper", n, "parms", NULL); Parm *base_parm = NULL; if (base && !isStatic(n)) { SwigType *base_type = Copy(getClassType()); SwigType_add_pointer(base_type); base_parm = NewParm(base_type, NewString("arg1"), n); set_nextSibling(base_parm, parms); parms = base_parm; } emit_parameter_variables(parms, f); emit_attach_parmmaps(parms, f); int parm_count = emit_num_arguments(parms); int required_count = emit_num_required(parms); emit_return_variable(n, result, f); // Start the function definition. String *fnname = NewString(""); Printv(fnname, "go_", wname, "(", NULL); if (parm_count > required_count) { Printv(fnname, "intgo _swig_optargc", NULL); } Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); SwigType *pt = Copy(Getattr(p, "type")); if (SwigType_isarray(pt)) { SwigType_del_array(pt); SwigType_add_pointer(pt); } String *pn = NewString("g"); Append(pn, Getattr(p, "lname")); String *ct = gccgoCTypeForGoValue(p, pt, pn); if (i > 0 || parm_count > required_count) { Printv(fnname, ", ", NULL); } Printv(fnname, ct, NULL); Delete(ct); Delete(pn); Delete(pt); p = nextParm(p); } Printv(fnname, ")", NULL); String *fndef = NewString(""); if (SwigType_type(result) == T_VOID) { Printv(fndef, "void ", fnname, NULL); } else { String *ct = gccgoCTypeForGoValue(n, result, fnname); Printv(fndef, ct, NULL); Delete(ct); } Printv(f->def, fndef, " __asm__(\"", go_prefix, "_", wname, "\");\n", NULL); Printv(f->def, fndef, " {\n", NULL); Delete(fnname); Delete(fndef); if (SwigType_type(result) != T_VOID) { String *ln = NewString("_swig_go_result"); String *ct = gccgoCTypeForGoValue(n, result, ln); Wrapper_add_local(f, "_swig_go_result", ct); Delete(ct); Delete(ln); } // Copy the parameters into the variables which hold their values, // applying appropriate transformations. p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = Getattr(p, "tmap:in"); if (!tm) { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { String *ln = Getattr(p, "lname"); String *pn = NewString("g"); Append(pn, ln); tm = Copy(tm); Replaceall(tm, "$input", pn); Setattr(p, "emit:input", pn); if (i < required_count) { Printv(f->code, " ", tm, "\n", NULL); } else { Printf(f->code, " if (_swig_optargc > %d) {\n", i - required_count); Printv(f->code, " ", tm, "\n", NULL); Printv(f->code, " }\n", NULL); } Delete(tm); } p = nextParm(p); } Printv(f->code, "\n", NULL); // Do the real work of the function. checkConstraints(parms, f); emitGoAction(n, base, parms, result, f); argout(parms, f); cleanupFunction(n, f, parms); if (SwigType_type(result) != T_VOID) { Printv(f->code, " return _swig_go_result;\n", NULL); } Printv(f->code, "}\n", NULL); Wrapper_print(f, f_c_wrappers); Swig_restore(n); DelWrapper(f); Delete(base_parm); return SWIG_OK; } /* ----------------------------------------------------------------------- * checkConstraints() * * Check parameter constraints if any. This is used for the C/C++ * function. This assumes that each parameter has an "emit:input" * property with the name to use to refer to that parameter. * ----------------------------------------------------------------------- */ void checkConstraints(ParmList *parms, Wrapper *f) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:check"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n\n", NULL); Delete(tm); p = Getattr(p, "tmap:check:next"); } } } /* ----------------------------------------------------------------------- * emitGoAction() * * Emit the action of the function. This is used for the C/C++ function. * ----------------------------------------------------------------------- */ void emitGoAction(Node *n, List *base, ParmList *parms, SwigType *result, Wrapper *f) { if (!gccgo_flag && !cgo_flag && SwigType_type(result) != T_VOID) { Wrapper_add_local(f, "swig_stktop", "char *swig_stktop"); Printv(f->code, "\tswig_stktop = _swig_topofstack();\n", NULL); } String *actioncode; if (!base || isStatic(n)) { Swig_director_emit_dynamic_cast(n, f); actioncode = emit_action(n); } else { // Call the base class method. actioncode = NewString(""); String *current = NewString(""); if (!gccgo_flag && !cgo_flag) { Printv(current, "swig_a->", NULL); } Printv(current, Getattr(parms, "lname"), NULL); int vc = 0; for (Iterator bi = First(base); bi.item; bi = Next(bi)) { Printf(actioncode, " %s *swig_b%d = (%s *)%s;\n", bi.item, vc, bi.item, current); Delete(current); current = NewString(""); Printf(current, "swig_b%d", vc); ++vc; } String *code = Copy(Getattr(n, "wrap:action")); Replace(code, Getattr(parms, "lname"), current, DOH_REPLACE_ANY | DOH_REPLACE_ID); Delete(current); Printv(actioncode, code, "\n", NULL); } Swig_save("emitGoAction", n, "type", "tmap:out", NULL); Setattr(n, "type", result); String *tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); if (!tm) { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s\n", SwigType_str(result, 0)); } else { Replaceall(tm, "$result", "_swig_go_result"); if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "1"); } else { Replaceall(tm, "$owner", "0"); } Printv(f->code, tm, "\n", NULL); Delete(tm); } if (!gccgo_flag && !cgo_flag && SwigType_type(result) != T_VOID) { // If the function called back into the Go code, the stack might // have been copied. We need to adjust swig_a accordingly here. // This is what cgo does. Printv(f->code, "\tswig_a = (struct swigargs*)((char*)swig_a + (_swig_topofstack() - swig_stktop));\n", NULL); Printv(f->code, "\tswig_a->", Swig_cresult_name(), " = ", "_swig_go_result;\n", NULL); } Swig_restore(n); } /* ----------------------------------------------------------------------- * argout() * * Handle argument output code if any. This is used for the C/C++ * function. This assumes that each parameter has an "emit:input" * property with the name to use to refer to that parameter. * ----------------------------------------------------------------------- */ void argout(ParmList *parms, Wrapper *f) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:argout"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$result", Swig_cresult_name()); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:argout:next"); } } } /* ----------------------------------------------------------------------- * goargout() * * Handle Go argument output code if any. This is used for the Go * function. This assumes that each parameter has an "emit:goinput" * property with the name to use to refer to that parameter. * ----------------------------------------------------------------------- */ void goargout(ParmList *parms) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:goargout"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$result", "swig_r"); Replaceall(tm, "$input", Getattr(p, "emit:goinput")); Printv(f_go_wrappers, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:goargout:next"); } } // When using cgo, if we need to memcpy a parameter to pass it to // the C code, the compiler may think that the parameter is not // live during the function call. If the garbage collector runs // while the C/C++ function is running, the parameter may be // freed. Force the compiler to see the parameter as live across // the C/C++ function. if (cgo_flag) { int parm_count = emit_num_arguments(parms); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); bool c_struct_type; Delete(cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type)); if (c_struct_type) { Printv(f_go_wrappers, "\tif Swig_escape_always_false {\n", NULL); Printv(f_go_wrappers, "\t\tSwig_escape_val = ", Getattr(p, "emit:goinput"), "\n", NULL); Printv(f_go_wrappers, "\t}\n", NULL); } p = nextParm(p); } } } /* ----------------------------------------------------------------------- * freearg() * * Handle argument cleanup code if any. This is used for the C/C++ * function. This assumes that each parameter has an "emit:input" * property with the name to use to refer to that parameter. * ----------------------------------------------------------------------- */ String *freearg(ParmList *parms) { String *ret = NewString(""); Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:freearg"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(ret, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:freearg:next"); } } return ret; } /* ----------------------------------------------------------------------- * cleanupFunction() * * Final function cleanup code. * ----------------------------------------------------------------------- */ void cleanupFunction(Node *n, Wrapper *f, ParmList *parms) { String *cleanup = freearg(parms); Printv(f->code, cleanup, NULL); if (GetFlag(n, "feature:new")) { String *tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NULL); Delete(tm); } } Replaceall(f->code, "$cleanup", cleanup); Delete(cleanup); /* See if there is any return cleanup code */ String *tm; if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } Replaceall(f->code, "$symname", Getattr(n, "sym:name")); } /* ----------------------------------------------------------------------- * variableHandler() * * This exists just to set the making_variable_wrappers flag. * ----------------------------------------------------------------------- */ virtual int variableHandler(Node *n) { assert(!making_variable_wrappers); making_variable_wrappers = true; int r = Language::variableHandler(n); making_variable_wrappers = false; return r; } /* ----------------------------------------------------------------------- * constantWrapper() * * Product a const declaration. * ------------------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { SwigType *type = Getattr(n, "type"); if (!SwigType_issimple(type) && SwigType_type(type) != T_STRING) { return goComplexConstant(n, type); } if (Swig_storage_isstatic(n)) { return goComplexConstant(n, type); } String *go_name = buildGoName(Getattr(n, "sym:name"), false, false); String *tm = goType(n, type); String *value = Getattr(n, "value"); String *copy = NULL; if (SwigType_type(type) == T_BOOL) { if (Cmp(value, "true") != 0 && Cmp(value, "false") != 0) { return goComplexConstant(n, type); } } else if (SwigType_type(type) == T_STRING || SwigType_type(type) == T_CHAR) { // Backslash sequences are somewhat different in Go and C/C++. if (Strchr(value, '\\') != 0) { return goComplexConstant(n, type); } } else { // Accept a 0x prefix, and strip combinations of u and l // suffixes. Otherwise accept digits, decimal point, and // exponentiation. Treat anything else as too complicated to // handle as a Go constant. char *p = Char(value); int len = (int)strlen(p); bool need_copy = false; while (len > 0) { char c = p[len - 1]; if (c != 'l' && c != 'L' && c != 'u' && c != 'U') { break; } --len; need_copy = true; } bool is_hex = false; int i = 0; if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { i = 2; is_hex = true; } for (; i < len; ++i) { switch (p[i]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': break; case 'a': case 'b': case 'c': case 'd': case 'f': case 'A': case 'B': case 'C': case 'D': case 'F': if (!is_hex) { return goComplexConstant(n, type); } break; case '.': case 'e': case 'E': case '+': case '-': break; default: return goComplexConstant(n, type); } } if (need_copy) { copy = Copy(value); Replaceall(copy, p + len, ""); value = copy; } } if (!checkNameConflict(go_name, n, NULL)) { Delete(tm); Delete(go_name); Delete(copy); return SWIG_NOWRAP; } Printv(f_go_wrappers, "const ", go_name, " ", tm, " = ", NULL); if (SwigType_type(type) == T_STRING) { Printv(f_go_wrappers, "\"", value, "\"", NULL); } else if (SwigType_type(type) == T_CHAR) { Printv(f_go_wrappers, "'", value, "'", NULL); } else { Printv(f_go_wrappers, value, NULL); } Printv(f_go_wrappers, "\n", NULL); Delete(tm); Delete(go_name); Delete(copy); return SWIG_OK; } /* ---------------------------------------------------------------------- * enumDeclaration() * * A C++ enum type turns into a Named go int type. * ---------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *name = goEnumName(n); if (Strcmp(name, "int") != 0) { if (!ImportMode || !imported_package) { if (!checkNameConflict(name, n, NULL)) { Delete(name); return SWIG_NOWRAP; } Printv(f_go_wrappers, "type ", name, " int\n", NULL); } else { String *nw = NewString(""); Printv(nw, getModuleName(imported_package), ".", name, NULL); Setattr(n, "go:enumname", nw); } } Delete(name); return Language::enumDeclaration(n); } /* ----------------------------------------------------------------------- * enumvalueDeclaration() * * Declare a single value of an enum type. We fetch the value by * calling a C/C++ function. * ------------------------------------------------------------------------ */ virtual int enumvalueDeclaration(Node *n) { if (!is_public(n)) { return SWIG_OK; } Swig_require("enumvalueDeclaration", n, "*sym:name", NIL); Node *parent = parentNode(n); if (Getattr(parent, "unnamed")) { Setattr(n, "type", NewString("int")); } else { Setattr(n, "type", Getattr(parent, "enumtype")); } if (GetFlag(parent, "scopedenum")) { String *symname = Getattr(n, "sym:name"); symname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); Setattr(n, "sym:name", symname); Delete(symname); } int ret = goComplexConstant(n, Getattr(n, "type")); Swig_restore(n); return ret; } /* ----------------------------------------------------------------------- * goComplexConstant() * * Handle a const declaration for something which is not a Go constant. * ------------------------------------------------------------------------ */ int goComplexConstant(Node *n, SwigType *type) { String *symname = Getattr(n, "sym:name"); if (!symname) { symname = Getattr(n, "name"); } String *varname = buildGoName(symname, true, false); if (!checkNameConflict(varname, n, NULL)) { Delete(varname); return SWIG_NOWRAP; } String *rawval = Getattr(n, "rawval"); if (rawval && Len(rawval)) { // Based on Swig_VargetToFunction String *nname = NewStringf("(%s)", rawval); String *call; if (SwigType_isclass(type)) { call = NewStringf("%s", nname); } else { call = SwigType_lcaststr(type, nname); } String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(nname); Delete(call); Delete(cres); } else { String *get = NewString(""); Printv(get, Swig_cresult_name(), " = ", NULL); char quote; if (Getattr(n, "wrappedasconstant")) { quote = '\0'; } else if (SwigType_type(type) == T_CHAR) { quote = '\''; } else if (SwigType_type(type) == T_STRING) { Printv(get, "(char *)", NULL); quote = '"'; } else { quote = '\0'; } if (quote != '\0') { Printf(get, "%c", quote); } Printv(get, Getattr(n, "value"), NULL); if (quote != '\0') { Printf(get, "%c", quote); } Printv(get, ";\n", NULL); Setattr(n, "wrap:action", get); Delete(get); } String *sname = Copy(symname); if (class_name) { Append(sname, "_"); Append(sname, class_name); } String *go_name = NewString("_swig_get"); if (class_name) { Append(go_name, class_name); Append(go_name, "_"); } Append(go_name, sname); String *wname = Swig_name_wrapper(sname); Append(wname, unique_id); Setattr(n, "wrap:name", wname); int r = makeWrappers(n, sname, go_name, NULL, wname, NULL, NULL, type, true); if (r != SWIG_OK) { return r; } String *t = goType(n, type); Printv(f_go_wrappers, "var ", varname, " ", t, " = ", go_name, "()\n", NULL); Delete(varname); Delete(t); Delete(go_name); Delete(sname); return SWIG_OK; } /* ------------------------------------------------------------ * classHandler() * * For a C++ class, in Go we generate both a struct and an * interface. The interface will declare all the class public * methods. We will define all the methods on the struct, so that * the struct meets the interface. We then expect users of the * class to use the interface. * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { class_node = n; List *baselist = Getattr(n, "bases"); bool has_base_classes = baselist && Len(baselist) > 0; String *name = Getattr(n, "sym:name"); String *go_name = exportedName(name); if (!checkNameConflict(go_name, n, NULL)) { Delete(go_name); SetFlag(n, "go:conflict"); return SWIG_NOWRAP; } String *go_type_name = goCPointerType(Getattr(n, "classtypeobj"), true); class_name = name; class_receiver = go_type_name; class_methods = NewHash(); int isdir = GetFlag(n, "feature:director"); int isnodir = GetFlag(n, "feature:nodirector"); bool is_director = isdir && !isnodir; Printv(f_go_wrappers, "type ", go_type_name, " uintptr\n\n", NULL); // A method to return the pointer to the C++ class. This is used // by generated code to convert between the interface and the C++ // value. Printv(f_go_wrappers, "func (p ", go_type_name, ") Swigcptr() uintptr {\n", NULL); Printv(f_go_wrappers, "\treturn (uintptr)(p)\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); // A method used as a marker for the class, to avoid invalid // interface conversions when using multiple inheritance. Printv(f_go_wrappers, "func (p ", go_type_name, ") SwigIs", go_name, "() {\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); if (is_director) { // Return the interface passed to the NewDirector function. Printv(f_go_wrappers, "func (p ", go_type_name, ") DirectorInterface() interface{} {\n", NULL); Printv(f_go_wrappers, "\treturn nil\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); } // We have seen a definition for this type. Setattr(defined_types, go_name, go_name); Setattr(defined_types, go_type_name, go_type_name); interfaces = NewString(""); int r = Language::classHandler(n); if (r != SWIG_OK) { return r; } if (has_base_classes) { // For each method defined in a base class but not defined in // this class, we need to define the method in this class. We // can't use anonymous field inheritance because it works // differently in Go and in C++. Hash *local = NewHash(); for (Node *ni = Getattr(n, "firstChild"); ni; ni = nextSibling(ni)) { if (!is_public(ni)) { continue; } String *type = Getattr(ni, "nodeType"); if (Cmp(type, "constructor") == 0 || Cmp(type, "destructor") == 0) { continue; } String *cname = Getattr(ni, "sym:name"); if (!cname) { cname = Getattr(ni, "name"); } if (cname) { Setattr(local, cname, NewString("")); } } for (Iterator b = First(baselist); b.item; b = Next(b)) { List *bases = NewList(); Append(bases, Getattr(b.item, "classtype")); int r = addBase(n, b.item, bases, local); if (r != SWIG_OK) { return r; } Delete(bases); } Delete(local); Hash *parents = NewHash(); addFirstBaseInterface(n, parents, baselist); int r = addExtraBaseInterfaces(n, parents, baselist); Delete(parents); if (r != SWIG_OK) { return r; } } Printv(f_go_wrappers, "type ", go_name, " interface {\n", NULL); Printv(f_go_wrappers, "\tSwigcptr() uintptr\n", NULL); Printv(f_go_wrappers, "\tSwigIs", go_name, "()\n", NULL); if (is_director) { Printv(f_go_wrappers, "\tDirectorInterface() interface{}\n", NULL); } Append(f_go_wrappers, interfaces); Printv(f_go_wrappers, "}\n\n", NULL); Delete(interfaces); interfaces = NULL; class_name = NULL; class_receiver = NULL; class_node = NULL; Delete(class_methods); class_methods = NULL; Delete(go_type_name); return SWIG_OK; } /* ------------------------------------------------------------ * addBase() * * Implement methods and members defined in a parent class for a * child class. * ------------------------------------------------------------ */ int addBase(Node *n, Node *base, List *bases, Hash *local) { if (GetFlag(base, "feature:ignore")) { return SWIG_OK; } for (Node *ni = Getattr(base, "firstChild"); ni; ni = nextSibling(ni)) { if (GetFlag(ni, "feature:ignore")) { continue; } if (!is_public(ni)) { continue; } String *type = Getattr(ni, "nodeType"); if (Strcmp(type, "constructor") == 0 || Strcmp(type, "destructor") == 0 || Strcmp(type, "enum") == 0 || Strcmp(type, "using") == 0 || Strcmp(type, "classforward") == 0 || Strcmp(type, "template") == 0) { continue; } String *storage = Getattr(ni, "storage"); if (storage && (Strcmp(storage, "typedef") == 0 || Strcmp(storage, "friend") == 0)) { continue; } String *mname = Getattr(ni, "sym:name"); if (!mname) { continue; } String *lname = Getattr(ni, "name"); if (Getattr(class_methods, lname)) { continue; } if (Getattr(local, lname)) { continue; } Setattr(local, lname, NewString("")); String *ty = NewString(Getattr(ni, "type")); SwigType_push(ty, Getattr(ni, "decl")); String *fullty = SwigType_typedef_resolve_all(ty); bool is_function = SwigType_isfunction(fullty) ? true : false; Delete(ty); Delete(fullty); if (is_function) { int r = goBaseMethod(n, bases, ni); if (r != SWIG_OK) { return r; } if (Getattr(ni, "sym:overloaded")) { for (Node *on = Getattr(ni, "sym:nextSibling"); on; on = Getattr(on, "sym:nextSibling")) { r = goBaseMethod(n, bases, on); if (r != SWIG_OK) { return r; } } String *receiver = class_receiver; bool is_static = isStatic(ni); if (is_static) { receiver = NULL; } String *go_name = buildGoName(Getattr(ni, "sym:name"), is_static, false); r = makeDispatchFunction(ni, go_name, receiver, is_static, NULL, false); Delete(go_name); if (r != SWIG_OK) { return r; } } } else { int r = goBaseVariable(n, bases, ni); if (r != SWIG_OK) { return r; } } } List *baselist = Getattr(base, "bases"); if (baselist && Len(baselist) > 0) { for (Iterator b = First(baselist); b.item; b = Next(b)) { List *nb = Copy(bases); Append(nb, Getattr(b.item, "classtype")); int r = addBase(n, b.item, nb, local); Delete(nb); if (r != SWIG_OK) { return r; } } } return SWIG_OK; } /* ------------------------------------------------------------ * goBaseMethod() * * Implement a method defined in a parent class for a child class. * ------------------------------------------------------------ */ int goBaseMethod(Node *method_class, List *bases, Node *method) { String *symname = Getattr(method, "sym:name"); if (!validIdentifier(symname)) { return SWIG_OK; } String *name = NewString(""); Printv(name, Getattr(method_class, "sym:name"), "_", symname, NULL); bool is_static = isStatic(method); String *go_name = buildGoName(name, is_static, false); String *overname = NULL; if (Getattr(method, "sym:overloaded")) { overname = Getattr(method, "sym:overname"); } String *wname = Swig_name_wrapper(name); if (overname) { Append(wname, overname); } Append(wname, unique_id); String *result = NewString(Getattr(method, "type")); SwigType_push(result, Getattr(method, "decl")); if (SwigType_isqualifier(result)) { Delete(SwigType_pop(result)); } Delete(SwigType_pop_function(result)); // If the base method is imported, wrap:action may not be set. Swig_save("goBaseMethod", method, "wrap:name", "wrap:action", "parms", NULL); Setattr(method, "wrap:name", wname); if (!Getattr(method, "wrap:action")) { if (!is_static) { Swig_MethodToFunction(method, getNSpace(), getClassType(), (Getattr(method, "template") ? SmartPointer : Extend | SmartPointer), NULL, false); // Remove any self parameter that was just added. ParmList *parms = Getattr(method, "parms"); if (parms && Getattr(parms, "self")) { parms = CopyParmList(nextSibling(parms)); Setattr(method, "parms", parms); } } else { String *call = Swig_cfunction_call(Getattr(method, "name"), Getattr(method, "parms")); Setattr(method, "wrap:action", Swig_cresult(Getattr(method, "type"), Swig_cresult_name(), call)); } } int r = makeWrappers(method, name, go_name, overname, wname, bases, Getattr(method, "parms"), result, is_static); Swig_restore(method); Delete(result); Delete(go_name); Delete(name); return r; } /* ------------------------------------------------------------ * goBaseVariable() * * Add accessors for a member variable defined in a parent class for * a child class. * ------------------------------------------------------------ */ int goBaseVariable(Node *var_class, List *bases, Node *var) { if (isStatic(var)) { return SWIG_OK; } String *var_name = buildGoName(Getattr(var, "sym:name"), false, false); Swig_save("goBaseVariable", var, "type", "wrap:action", NULL); // For a pointer type we apparently have to wrap in the decl. SwigType *var_type = NewString(Getattr(var, "type")); SwigType_push(var_type, Getattr(var, "decl")); Setattr(var, "type", var_type); SwigType *vt = Copy(var_type); int flags = Extend | SmartPointer | use_naturalvar_mode(var); if (isNonVirtualProtectedAccess(var)) { flags |= CWRAP_ALL_PROTECTED_ACCESS; } // Copied from Swig_wrapped_member_var_type. if (SwigType_isclass(vt)) { if (flags & CWRAP_NATURAL_VAR) { if (CPlusPlus) { if (!SwigType_isconst(vt)) { SwigType_add_qualifier(vt, "const"); } SwigType_add_reference(vt); } } else { SwigType_add_pointer(vt); } } String *mname = Swig_name_member(getNSpace(), Getattr(var_class, "sym:name"), var_name); if (is_assignable(var)) { for (Iterator ki = First(var); ki.key; ki = Next(ki)) { if (Strncmp(ki.key, "tmap:", 5) == 0) { Delattr(var, ki.key); } } Swig_save("goBaseVariableSet", var, "name", "sym:name", "type", NULL); String *mname_set = NewString("Set"); Append(mname_set, mname); String *go_name = NewString("Set"); Append(go_name, var_name); Swig_MembersetToFunction(var, class_name, flags); String *wname = Swig_name_wrapper(mname_set); Append(wname, unique_id); ParmList *parms = NewParm(vt, var_name, var); String *result = NewString("void"); int r = makeWrappers(var, mname_set, go_name, NULL, wname, bases, parms, result, false); if (r != SWIG_OK) { return r; } Delete(wname); Delete(parms); Delete(result); Delete(go_name); Delete(mname_set); Swig_restore(var); for (Iterator ki = First(var); ki.key; ki = Next(ki)) { if (Strncmp(ki.key, "tmap:", 5) == 0) { Delattr(var, ki.key); } } } Swig_MembergetToFunction(var, class_name, flags); String *mname_get = NewString("Get"); Append(mname_get, mname); String *go_name = NewString("Get"); Append(go_name, var_name); String *wname = Swig_name_wrapper(mname_get); Append(wname, unique_id); int r = makeWrappers(var, mname_get, go_name, NULL, wname, bases, NULL, vt, false); if (r != SWIG_OK) { return r; } Delete(wname); Delete(mname_get); Delete(go_name); Delete(mname); Delete(var_name); Delete(var_type); Delete(vt); Swig_restore(var); return SWIG_OK; } /* ------------------------------------------------------------ * addFirstBaseInterface() * * When a C++ class uses multiple inheritance, we can use the C++ * pointer for the first base class but not for any subsequent base * classes. However, the Go interface will match the interface for * all the base classes. To avoid accidentally treating a class as * a pointer to a base class other than the first one, we use an * isClassname method. This function adds those methods as * required. * * For convenience when using multiple inheritance, we also add * functions to retrieve the base class pointers. * ------------------------------------------------------------ */ void addFirstBaseInterface(Node *n, Hash *parents, List *bases) { if (!bases || Len(bases) == 0) { return; } Iterator b = First(bases); if (!GetFlag(b.item, "feature:ignore")) { String *go_name = buildGoName(Getattr(n, "sym:name"), false, false); String *go_type_name = goCPointerType(Getattr(n, "classtypeobj"), true); String *go_base_name = exportedName(Getattr(b.item, "sym:name")); String *go_base_type = goType(n, Getattr(b.item, "classtypeobj")); String *go_base_type_name = goCPointerType(Getattr(b.item, "classtypeobj"), true); Printv(f_go_wrappers, "func (p ", go_type_name, ") SwigIs", go_base_name, "() {\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(interfaces, "\tSwigIs", go_base_name, "()\n", NULL); Printv(f_go_wrappers, "func (p ", go_type_name, ") SwigGet", go_base_name, "() ", go_base_type, " {\n", NULL); Printv(f_go_wrappers, "\treturn ", go_base_type_name, "(p.Swigcptr())\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(interfaces, "\tSwigGet", go_base_name, "() ", go_base_type, "\n", NULL); Setattr(parents, go_base_name, NewString("")); Delete(go_name); Delete(go_type_name); Delete(go_base_type); Delete(go_base_type_name); } addFirstBaseInterface(n, parents, Getattr(b.item, "bases")); } /* ------------------------------------------------------------ * addExtraBaseInterfaces() * * Add functions to retrieve the base class pointers for all base * classes other than the first. * ------------------------------------------------------------ */ int addExtraBaseInterfaces(Node *n, Hash *parents, List *bases) { Iterator b = First(bases); Node *fb = b.item; for (b = Next(b); b.item; b = Next(b)) { if (GetFlag(b.item, "feature:ignore")) { continue; } String *go_base_name = exportedName(Getattr(b.item, "sym:name")); Swig_save("addExtraBaseInterface", n, "wrap:action", "wrap:name", "wrap:parms", NULL); SwigType *type = Copy(Getattr(n, "classtypeobj")); SwigType_add_pointer(type); Parm *parm = NewParm(type, "self", n); Setattr(n, "wrap:parms", parm); String *pn = Swig_cparm_name(parm, 0); String *action = NewString(""); Printv(action, Swig_cresult_name(), " = (", Getattr(b.item, "classtype"), "*)", pn, ";", NULL); Delete(pn); Setattr(n, "wrap:action", action); String *name = Copy(class_name); Append(name, "_SwigGet"); Append(name, go_base_name); String *go_name = NewString("SwigGet"); String *c1 = exportedName(go_base_name); Append(go_name, c1); Delete(c1); String *wname = Swig_name_wrapper(name); Append(wname, unique_id); Setattr(n, "wrap:name", wname); SwigType *result = Copy(Getattr(b.item, "classtypeobj")); SwigType_add_pointer(result); int r = makeWrappers(n, name, go_name, NULL, wname, NULL, parm, result, false); if (r != SWIG_OK) { return r; } Swig_restore(n); Setattr(parents, go_base_name, NewString("")); Delete(go_name); Delete(type); Delete(parm); Delete(action); Delete(result); String *ns = NewString(""); addParentExtraBaseInterfaces(n, parents, b.item, false, ns); Delete(ns); } if (!GetFlag(fb, "feature:ignore")) { String *ns = NewString(""); addParentExtraBaseInterfaces(n, parents, fb, true, ns); Delete(ns); } return SWIG_OK; } /* ------------------------------------------------------------ * addParentExtraBaseInterfaces() * * Add functions to retrieve the base class pointers for all base * classes of parents other than the first base class at each level. * ------------------------------------------------------------ */ void addParentExtraBaseInterfaces(Node *n, Hash *parents, Node *base, bool is_base_first, String *sofar) { List *baselist = Getattr(base, "bases"); if (!baselist || Len(baselist) == 0) { return; } String *go_this_base_name = exportedName(Getattr(base, "sym:name")); String *sf = NewString(""); Printv(sf, sofar, ".SwigGet", go_this_base_name, "()", NULL); Iterator b = First(baselist); if (is_base_first) { if (!b.item) { return; } if (!GetFlag(b.item, "feature:ignore")) { addParentExtraBaseInterfaces(n, parents, b.item, true, sf); } b = Next(b); } String *go_name = buildGoName(Getattr(n, "sym:name"), false, false); String *go_type_name = goCPointerType(Getattr(n, "classtypeobj"), true); for (; b.item; b = Next(b)) { if (GetFlag(b.item, "feature:ignore")) { continue; } String *go_base_name = exportedName(Getattr(b.item, "sym:name")); if (!Getattr(parents, go_base_name)) { Printv(f_go_wrappers, "func (p ", go_type_name, ") SwigGet", go_base_name, "() ", go_base_name, " {\n", NULL); Printv(f_go_wrappers, "\treturn p", sf, ".SwigGet", go_base_name, "()\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(interfaces, "\tSwigGet", go_base_name, "() ", go_base_name, "\n", NULL); addParentExtraBaseInterfaces(n, parents, b.item, false, sf); Setattr(parents, go_base_name, NewString("")); } } Delete(go_name); Delete(go_type_name); Delete(go_this_base_name); Delete(sf); } /* ------------------------------------------------------------ * classDirectorInit * * Add support for a director class. * * Virtual inheritance is different in Go and C++. We implement * director classes by defining a new function in Go, * NewDirectorClassname, which takes a empty interface value and * creates an instance of a new child class. The new child class * refers all methods back to Go. The Go code checks whether the * value passed to NewDirectorClassname implements that method; if * it does, it calls it, otherwise it calls back into C++. * ------------------------------------------------------------ */ int classDirectorInit(Node *n) { // Because we use a different function to handle inheritance in // Go, ordinary creations of the object should not create a // director object. Delete(director_ctor_code); director_ctor_code = NewString("$nondirector_new"); class_node = n; String *name = Getattr(n, "sym:name"); assert(!class_name); class_name = name; String *go_name = exportedName(name); String *go_type_name = goCPointerType(Getattr(n, "classtypeobj"), true); assert(!class_receiver); class_receiver = go_type_name; String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, go_name); String *cxx_director_name = NewString("SwigDirector_"); Append(cxx_director_name, name); // The Go type of the director class. Printv(f_go_wrappers, "type ", director_struct_name, " struct {\n", NULL); Printv(f_go_wrappers, "\t", go_type_name, "\n", NULL); Printv(f_go_wrappers, "\tv interface{}\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(f_go_wrappers, "func (p *", director_struct_name, ") Swigcptr() uintptr {\n", NULL); Printv(f_go_wrappers, "\treturn p.", go_type_name, ".Swigcptr()\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(f_go_wrappers, "func (p *", director_struct_name, ") SwigIs", go_name, "() {\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(f_go_wrappers, "func (p *", director_struct_name, ") DirectorInterface() interface{} {\n", NULL); Printv(f_go_wrappers, "\treturn p.v\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); // Start defining the director class. Printv(f_c_directors_h, "class ", cxx_director_name, " : public ", Getattr(n, "classtype"), "\n", NULL); Printv(f_c_directors_h, "{\n", NULL); Printv(f_c_directors_h, " public:\n", NULL); Delete(director_struct_name); Delete(cxx_director_name); class_methods = NewHash(); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorConstructor * * Emit a constructor for a director class. * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { bool is_ignored = GetFlag(n, "feature:ignore") ? true : false; String *name = Getattr(n, "sym:name"); if (!name) { assert(is_ignored); name = Getattr(n, "name"); } String *overname = NULL; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } String *go_name = exportedName(name); ParmList *parms = Getattr(n, "parms"); Setattr(n, "wrap:parms", parms); String *cn = exportedName(Getattr(parentNode(n), "sym:name")); String *go_type_name = goCPointerType(Getattr(parentNode(n), "classtypeobj"), true); String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, cn); String *fn_name = NewString("_swig_NewDirector"); Append(fn_name, cn); Append(fn_name, go_name); if (!overname && !is_ignored) { if (!checkNameConflict(fn_name, n, NULL)) { return SWIG_NOWRAP; } } String *fn_with_over_name = Copy(fn_name); if (overname) { Append(fn_with_over_name, overname); } String *wname = Swig_name_wrapper(fn_name); if (overname) { Append(wname, overname); } Append(wname, unique_id); Setattr(n, "wrap:name", wname); bool is_static = isStatic(n); Wrapper *dummy = NewWrapper(); emit_attach_parmmaps(parms, dummy); DelWrapper(dummy); Swig_typemap_attach_parms("gotype", parms, NULL); Swig_typemap_attach_parms("goin", parms, NULL); Swig_typemap_attach_parms("goargout", parms, NULL); Swig_typemap_attach_parms("imtype", parms, NULL); int parm_count = emit_num_arguments(parms); String *func_name = NewString("NewDirector"); Append(func_name, go_name); String *func_with_over_name = Copy(func_name); if (overname) { Append(func_with_over_name, overname); } SwigType *first_type = NewString("int"); Parm *first_parm = NewParm(first_type, "swig_p", n); set_nextSibling(first_parm, parms); Setattr(first_parm, "lname", "p"); Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); Swig_cparm_name(p, i); p = nextParm(p); } if (!is_ignored) { if (cgo_flag) { Printv(f_cgo_comment, "extern uintptr_t ", wname, "(int", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); bool c_struct_type; String *ct = cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type); Printv(f_cgo_comment, ", ", ct, " ", Getattr(p, "lname"), NULL); p = nextParm(p); } Printv(f_cgo_comment, ");\n", NULL); } else { // Declare the C++ wrapper. if (!gccgo_flag) { Printv(f_go_wrappers, "var ", wname, " unsafe.Pointer\n\n", NULL); } else { Printv(f_go_wrappers, "//extern ", go_prefix, "_", wname, "\n", NULL); } Printv(f_go_wrappers, "func ", fn_with_over_name, "(_swig_director int", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = goWrapperType(p, Getattr(p, "type"), false); Printv(f_go_wrappers, ", _ ", tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ") (_swig_ret ", go_type_name, ")", NULL); if (!gccgo_flag) { Printv(f_go_wrappers, " {\n", NULL); Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&_swig_director))\n", NULL); Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", wname, ", _swig_p)\n", NULL); Printv(f_go_wrappers, "\treturn\n", NULL); Printv(f_go_wrappers, "}", NULL); } Printv(f_go_wrappers, "\n\n", NULL); } // Write out the Go function that calls the wrapper. Printv(f_go_wrappers, "func ", func_with_over_name, "(v interface{}", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); Printv(f_go_wrappers, ", ", Getattr(p, "lname"), " ", NULL); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ") ", cn, " {\n", NULL); Printv(f_go_wrappers, "\tp := &", director_struct_name, "{0, v}\n", NULL); if (gccgo_flag && !cgo_flag) { Printv(f_go_wrappers, "\tdefer SwigCgocallDone()\n", NULL); Printv(f_go_wrappers, "\tSwigCgocall()\n", NULL); } String *call = NewString(""); Printv(call, "\tp.", class_receiver, " = ", NULL); if (cgo_flag) { Printv(call, go_type_name, "(C.", wname, "(C.int(swigDirectorAdd(p))", NULL); } else { Printv(call, fn_with_over_name, "(swigDirectorAdd(p)", NULL); } p = parms; for (int i = 0; i < parm_count; ++i) { Printv(call, ", ", NULL); p = getParm(p); String *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *ivar = NewStringf("_swig_i_%d", i); String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(f_go_wrappers, "\t", ivar, " := ", ln, NULL); if (goTypeIsInterface(p, pt)) { Printv(f_go_wrappers, ".Swigcptr()", NULL); } Printv(f_go_wrappers, "\n", NULL); } else { String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, "\n", NULL); Delete(goin); } Setattr(p, "emit:goinput", ivar); if (cgo_flag) { bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); if (c_struct_type) { Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { Printv(call, "C.", ct, "(", ivar, ")", NULL); } Delete(ct); } else { Printv(call, ivar, NULL); } p = nextParm(p); } Printv(call, ")", NULL); if (cgo_flag) { Printv(call, ")", NULL); } Printv(f_go_wrappers, call, "\n", NULL); goargout(parms); Printv(f_go_wrappers, "\treturn p\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); SwigType *result = Copy(Getattr(parentNode(n), "classtypeobj")); SwigType_add_pointer(result); Swig_save("classDirectorConstructor", n, "wrap:name", "wrap:action", NULL); String *dwname = Swig_name_wrapper(name); Append(dwname, unique_id); Setattr(n, "wrap:name", dwname); String *action = NewString(""); Printv(action, Swig_cresult_name(), " = new SwigDirector_", class_name, "(", NULL); String *pname = Swig_cparm_name(NULL, 0); Printv(action, pname, NULL); Delete(pname); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *pname = Swig_cparm_name(NULL, i + 1); Printv(action, ", ", NULL); if (SwigType_isreference(Getattr(p, "type"))) { Printv(action, "*", NULL); } Printv(action, pname, NULL); Delete(pname); p = nextParm(p); } Printv(action, ");", NULL); Setattr(n, "wrap:action", action); if (cgo_flag) { cgoWrapperInfo info; info.n = n; info.go_name = func_name; info.overname = overname; info.wname = wname; info.base = NULL; info.parms = first_parm; info.result = result; info.is_static = false; info.receiver = NULL; info.is_constructor = true; info.is_destructor = false; int r = cgoGccWrapper(&info); if (r != SWIG_OK) { return r; } } else if (!gccgo_flag) { int r = gcFunctionWrapper(wname); if (r != SWIG_OK) { return r; } r = gccFunctionWrapper(n, NULL, wname, first_parm, result); if (r != SWIG_OK) { return r; } } else { int r = gccgoFunctionWrapper(n, NULL, wname, first_parm, result); if (r != SWIG_OK) { return r; } } Swig_restore(n); Delete(result); } String *cxx_director_name = NewString("SwigDirector_"); Append(cxx_director_name, class_name); String *decl = Swig_method_decl(NULL, Getattr(n, "decl"), cxx_director_name, first_parm, 0); Printv(f_c_directors_h, " ", decl, ";\n", NULL); Delete(decl); decl = Swig_method_decl(NULL, Getattr(n, "decl"), cxx_director_name, first_parm, 0); Printv(f_c_directors, cxx_director_name, "::", decl, "\n", NULL); Delete(decl); Printv(f_c_directors, " : ", Getattr(parentNode(n), "classtype"), "(", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(f_c_directors, ", ", NULL); } String *pn = Getattr(p, "name"); assert(pn); Printv(f_c_directors, pn, NULL); p = nextParm(p); } Printv(f_c_directors, "),\n", NULL); Printv(f_c_directors, " go_val(swig_p), swig_mem(0)\n", NULL); Printv(f_c_directors, "{ }\n\n", NULL); if (Getattr(n, "sym:overloaded") && !Getattr(n, "sym:nextSibling")) { int r = makeDispatchFunction(n, func_name, cn, is_static, Getattr(parentNode(n), "classtypeobj"), false); if (r != SWIG_OK) { return r; } } Delete(cxx_director_name); Delete(go_name); Delete(cn); Delete(go_type_name); Delete(director_struct_name); Delete(fn_name); Delete(fn_with_over_name); Delete(func_name); Delete(func_with_over_name); Delete(wname); Delete(first_type); Delete(first_parm); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorDestructor * * Emit a destructor for a director class. * ------------------------------------------------------------ */ int classDirectorDestructor(Node *n) { if (!is_public(n)) { return SWIG_OK; } bool is_ignored = GetFlag(n, "feature:ignore") ? true : false; if (!is_ignored) { String *fnname = NewString("DeleteDirector"); String *c1 = exportedName(class_name); Append(fnname, c1); Delete(c1); String *wname = Swig_name_wrapper(fnname); Append(wname, unique_id); Setattr(n, "wrap:name", fnname); Swig_DestructorToFunction(n, getNSpace(), getClassType(), CPlusPlus, Extend); ParmList *parms = Getattr(n, "parms"); Setattr(n, "wrap:parms", parms); String *result = NewString("void"); int r = makeWrappers(n, fnname, fnname, NULL, wname, NULL, parms, result, isStatic(n)); if (r != SWIG_OK) { return r; } Delete(result); Delete(fnname); Delete(wname); } // Generate the destructor for the C++ director class. Since the // Go code is keeping a pointer to the C++ object, we need to call // back to the Go code to let it know that the C++ object is gone. String *go_name = NewString("Swiggo_DeleteDirector_"); Append(go_name, class_name); String *cn = exportedName(class_name); String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, cn); Printv(f_c_directors_h, " virtual ~SwigDirector_", class_name, "()", NULL); String *throws = buildThrow(n); if (throws) { Printv(f_c_directors_h, " ", throws, NULL); } Printv(f_c_directors_h, ";\n", NULL); String *director_sig = NewString(""); Printv(director_sig, "SwigDirector_", class_name, "::~SwigDirector_", class_name, "()", NULL); if (throws) { Printv(director_sig, " ", throws, NULL); Delete(throws); } Printv(director_sig, "\n", NULL); Printv(director_sig, "{\n", NULL); if (is_ignored) { Printv(f_c_directors, director_sig, NULL); } else { makeDirectorDestructorWrapper(go_name, director_struct_name, director_sig); } Printv(f_c_directors, " delete swig_mem;\n", NULL); Printv(f_c_directors, "}\n\n", NULL); Delete(director_sig); Delete(go_name); Delete(cn); Delete(director_struct_name); return SWIG_OK; } /* ------------------------------------------------------------ * makeDirectorDestructorWrapper * * Emit the function wrapper for the destructor of a director class. * This writes director_sig to f_c_directors and leaves the function * unfinished. * ------------------------------------------------------------ */ void makeDirectorDestructorWrapper(String *go_name, String *director_struct_name, String *director_sig) { if (cgo_flag) { makeCgoDirectorDestructorWrapper(go_name, director_struct_name, director_sig); return; } Printv(f_go_wrappers, "func ", go_name, "(c int) {\n", NULL); if (gccgo_flag) { Printv(f_go_wrappers, "\tSwigCgocallBack()\n", NULL); Printv(f_go_wrappers, "\tdefer SwigCgocallBackDone()\n", NULL); } Printv(f_go_wrappers, "\tswigDirectorLookup(c).(*", director_struct_name, ").", class_receiver, " = 0\n", NULL); Printv(f_go_wrappers, "\tswigDirectorDelete(c)\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); String *wname = NewString("_swiggo_wrap_DeleteDirector_"); Append(wname, class_name); if (!gccgo_flag) { Printv(f_c_directors, "extern \"C\" void ", wname, "(void*, int);\n", NULL); } else { Printv(f_c_directors, "extern \"C\" void ", wname, "(intgo) __asm__(\"", go_prefix, ".", go_name, "\");\n", NULL); } Printv(f_c_directors, director_sig, NULL); if (!gccgo_flag) { Printv(f_c_directors, " struct { intgo p; } SWIGSTRUCTPACKED a;\n", NULL); Printv(f_c_directors, " a.p = go_val;\n", NULL); Printv(f_c_directors, " crosscall2(", wname, ", &a, (int) sizeof a);\n", NULL); Printv(f_gc_wrappers, "#pragma dynexport ", wname, " ", wname, "\n", NULL); Printv(f_gc_wrappers, "#pragma cgo_export_static ", wname, " ", wname, "\n", NULL); Printv(f_gc_wrappers, "#pragma textflag 7\n", NULL); Printv(f_gc_wrappers, "extern void \xc2\xb7", go_name, "();\n", NULL); Printv(f_gc_wrappers, "void\n", NULL); Printv(f_gc_wrappers, wname, "(void *a, int32 n)\n", NULL); Printv(f_gc_wrappers, "{\n", NULL); Printv(f_gc_wrappers, "\truntime\xc2\xb7" "cgocallback(\xc2\xb7", go_name, ", a, n);\n", NULL); Printv(f_gc_wrappers, "}\n\n", NULL); } else { Printv(f_c_directors, " ", wname, "(go_val);\n", NULL); } Delete(wname); } /* ------------------------------------------------------------ * makeCgoDirectorDestructorWrapper * * When using cgo, emit the function wrapper for the destructor of a * director class. * ------------------------------------------------------------ */ void makeCgoDirectorDestructorWrapper(String *go_name, String *director_struct_name, String *director_sig) { String *wname = Copy(go_name); Append(wname, unique_id); Printv(f_go_wrappers, "//export ", wname, "\n", NULL); Printv(f_go_wrappers, "func ", wname, "(c int) {\n", NULL); Printv(f_go_wrappers, "\tswigDirectorLookup(c).(*", director_struct_name, ").", class_receiver, " = 0\n", NULL); Printv(f_go_wrappers, "\tswigDirectorDelete(c)\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(f_c_directors, "extern \"C\" void ", wname, "(intgo);\n", NULL); Printv(f_c_directors, director_sig, NULL); Printv(f_c_directors, " ", wname, "(go_val);\n", NULL); } /* ------------------------------------------------------------ * classDirectorMethod * * Emit a method for a director class, plus its overloads. * ------------------------------------------------------------ */ int classDirectorMethod(Node *n, Node *parent, String *super) { bool is_ignored = GetFlag(n, "feature:ignore") ? true : false; // We don't need explicit calls. if (GetFlag(n, "explicitcall")) { return SWIG_OK; } String *name = Getattr(n, "sym:name"); if (!name) { assert(is_ignored); name = Getattr(n, "name"); } bool overloaded = Getattr(n, "sym:overloaded") && !Getattr(n, "explicitcallnode"); if (!overloaded) { int r = oneClassDirectorMethod(n, parent, super); if (r != SWIG_OK) { return r; } } else { // Handle overloaded methods here, because otherwise we will // reject them in the class_methods hash table. We need to use // class_methods so that we correctly handle cases where a // function in one class hides a function of the same name in a // parent class. if (!Getattr(class_methods, name)) { for (Node *on = Getattr(n, "sym:overloaded"); on; on = Getattr(on, "sym:nextSibling")) { // Swig_overload_rank expects wrap:name and wrap:parms to be // set. String *wn = Swig_name_wrapper(Getattr(on, "sym:name")); Append(wn, Getattr(on, "sym:overname")); Append(wn, unique_id); Setattr(on, "wrap:name", wn); Delete(wn); Setattr(on, "wrap:parms", Getattr(on, "parms")); } } int r = oneClassDirectorMethod(n, parent, super); if (r != SWIG_OK) { return r; } if (!Getattr(n, "sym:nextSibling")) { // Last overloaded function Node *on = Getattr(n, "sym:overloaded"); bool is_static = isStatic(on); String *cn = exportedName(Getattr(parent, "sym:name")); String *go_name = buildGoName(name, is_static, false); String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, cn); int r = makeDispatchFunction(on, go_name, director_struct_name, is_static, director_struct_name, false); if (r != SWIG_OK) { return r; } if (!GetFlag(n, "abstract")) { String *go_upcall = NewString("Director"); Append(go_upcall, cn); Append(go_upcall, go_name); r = makeDispatchFunction(on, go_upcall, director_struct_name, is_static, director_struct_name, true); if (r != SWIG_OK) { return r; } Delete(go_upcall); } Delete(director_struct_name); Delete(go_name); Delete(cn); } } Setattr(class_methods, name, NewString("")); return SWIG_OK; } /* ------------------------------------------------------------ * oneClassDirectorMethod * * Emit a method for a director class. * ------------------------------------------------------------ */ int oneClassDirectorMethod(Node *n, Node *parent, String *super) { String *symname = Getattr(n, "sym:name"); if (!checkFunctionVisibility(n, parent)) { return SWIG_OK; } bool is_ignored = GetFlag(n, "feature:ignore") ? true : false; bool is_pure_virtual = (Cmp(Getattr(n, "storage"), "virtual") == 0 && Cmp(Getattr(n, "value"), "0") == 0); String *name = Getattr(n, "sym:name"); if (!name) { assert(is_ignored); name = Getattr(n, "name"); } String *overname = NULL; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } String *cn = exportedName(Getattr(parent, "sym:name")); String *go_type_name = goCPointerType(Getattr(parent, "classtypeobj"), true); String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, cn); bool is_static = isStatic(n); String *go_name = buildGoName(name, is_static, false); ParmList *parms = Getattr(n, "parms"); Setattr(n, "wrap:parms", parms); Wrapper *dummy = NewWrapper(); emit_attach_parmmaps(parms, dummy); Swig_typemap_attach_parms("gotype", parms, NULL); Swig_typemap_attach_parms("imtype", parms, NULL); int parm_count = emit_num_arguments(parms); SwigType *result = Getattr(n, "type"); // Save the type for overload processing. Setattr(n, "go:type", result); String *interface_name = NewString("_swig_DirectorInterface"); Append(interface_name, cn); Append(interface_name, go_name); if (overname) { Append(interface_name, overname); } String *callback_name = Copy(director_struct_name); Append(callback_name, "_callback_"); Append(callback_name, name); Replace(callback_name, "_swig", "Swig", DOH_REPLACE_FIRST); if (overname) { Append(callback_name, overname); } if (cgo_flag) { Append(callback_name, unique_id); } String *upcall_name = Copy(director_struct_name); Append(upcall_name, "_upcall_"); Append(upcall_name, go_name); String *upcall_wname = Swig_name_wrapper(upcall_name); if (overname) { Append(upcall_wname, overname); } Append(upcall_wname, unique_id); String *upcall_gc_name = buildGoWrapperName(upcall_name, overname); String *go_with_over_name = Copy(go_name); if (overname) { Append(go_with_over_name, overname); } Parm *p = 0; Wrapper *w = NewWrapper(); Swig_director_parms_fixup(parms); Swig_typemap_attach_parms("directorin", parms, w); Swig_typemap_attach_parms("directorargout", parms, w); Swig_typemap_attach_parms("godirectorin", parms, w); Swig_typemap_attach_parms("goin", parms, dummy); Swig_typemap_attach_parms("goargout", parms, dummy); DelWrapper(dummy); if (!is_ignored) { // We use an interface to see if this method is defined in Go. Printv(f_go_wrappers, "type ", interface_name, " interface {\n", NULL); Printv(f_go_wrappers, "\t", go_with_over_name, "(", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(f_go_wrappers, ", ", NULL); } String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (SwigType_type(result) != T_VOID) { String *tm = goType(n, result); Printv(f_go_wrappers, " ", tm, NULL); Delete(tm); } Printv(f_go_wrappers, "\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); if (!GetFlag(n, "abstract")) { if (cgo_flag) { Printv(f_cgo_comment, "extern ", NULL); if (SwigType_type(result) == T_VOID) { Printv(f_cgo_comment, "void", NULL); } else { bool c_struct_type; String *ret_type = cgoTypeForGoValue(n, result, &c_struct_type); Printv(f_cgo_comment, ret_type, NULL); Delete(ret_type); } Printv(f_cgo_comment, " ", upcall_wname, "(uintptr_t", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); bool c_struct_type; String *ct = cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type); Printv(f_cgo_comment, ", ", ct, " ", Getattr(p, "lname"), NULL); p = nextParm(p); } Printv(f_cgo_comment, ");\n", NULL); } else { // Declare the upcall function, which calls the method on // the parent class. if (!gccgo_flag) { Printv(f_go_wrappers, "var ", upcall_wname, " unsafe.Pointer\n\n", NULL); } else { Printv(f_go_wrappers, "//extern ", go_prefix, "_", upcall_wname, "\n", NULL); } Printv(f_go_wrappers, "func ", upcall_gc_name, "(_swig_ptr ", go_type_name, NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = goWrapperType(p, Getattr(p, "type"), false); Printv(f_go_wrappers, ", _ ", tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (SwigType_type(result) != T_VOID) { String *tm = goWrapperType(n, result, true); Printv(f_go_wrappers, " (_swig_ret ", tm, ")", NULL); Delete(tm); } if (!gccgo_flag) { Printv(f_go_wrappers, " {\n", NULL); Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&_swig_ptr))\n", NULL); Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", upcall_wname, ", _swig_p)\n", NULL); Printv(f_go_wrappers, "\treturn\n", NULL); Printv(f_go_wrappers, "}", NULL); } Printv(f_go_wrappers, "\n\n", NULL); } } // Define the method on the director class in Go. Printv(f_go_wrappers, "func (swig_p *", director_struct_name, ") ", go_with_over_name, "(", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(f_go_wrappers, ", ", NULL); } Printv(f_go_wrappers, Getattr(p, "lname"), " ", NULL); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (SwigType_type(result) != T_VOID) { String *tm = goType(n, result); Printv(f_go_wrappers, " ", tm, NULL); Delete(tm); } Printv(f_go_wrappers, " {\n", NULL); Printv(f_go_wrappers, "\tif swig_g, swig_ok := swig_p.v.(", interface_name, "); swig_ok {\n", NULL); Printv(f_go_wrappers, "\t\t", NULL); if (SwigType_type(result) != T_VOID) { Printv(f_go_wrappers, "return ", NULL); } Printv(f_go_wrappers, "swig_g.", go_with_over_name, "(", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(f_go_wrappers, ", ", NULL); } Printv(f_go_wrappers, Getattr(p, "lname"), NULL); p = nextParm(p); } Printv(f_go_wrappers, ")\n", NULL); if (SwigType_type(result) == T_VOID) { Printv(f_go_wrappers, "\t\treturn\n", NULL); } Printv(f_go_wrappers, "\t}\n", NULL); if (GetFlag(n, "abstract")) { Printv(f_go_wrappers, "\tpanic(\"call to pure virtual method\")\n", NULL); } else { String *ret_type = NULL; bool memcpy_ret = false; String *wt = NULL; bool has_goout = false; String *goout = NULL; if (SwigType_type(result) != T_VOID) { ret_type = goImType(n, result); Printv(f_go_wrappers, "\tvar swig_r ", ret_type, "\n", NULL); goout = goTypemapLookup("goout", n, "swig_r"); if (goout) { has_goout = true; } if (cgo_flag) { bool c_struct_type; Delete(cgoTypeForGoValue(n, result, &c_struct_type)); if (c_struct_type) { memcpy_ret = true; } } } p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (goGetattr(p, "tmap:goargout")) { has_goout = true; } p = nextParm(p); } String *call = NewString(""); if (gccgo_flag && !cgo_flag) { if (has_goout) { Printv(call, "\tfunc() {\n", NULL); } Printv(call, "\tdefer SwigCgocallDone()\n", NULL); Printv(call, "\tSwigCgocall()\n", NULL); } Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { if (memcpy_ret) { Printv(call, "swig_r_p := ", NULL); } else { Printv(call, "swig_r = ", NULL); if (cgo_flag) { Printv(call, "(", ret_type, ")(", NULL); } } if (cgo_flag && goTypeIsInterface(n, result)) { wt = goWrapperType(n, result, true); Printv(call, "(", wt, ")(", NULL); } } if (cgo_flag) { Printv(call, "C.", upcall_wname, NULL); } else { Printv(call, upcall_gc_name, NULL); } Printv(call, "(", NULL); if (cgo_flag) { Printv(call, "C.uintptr_t(", NULL); } Printv(call, "swig_p.", go_type_name, NULL); if (cgo_flag) { Printv(call, ")", NULL); } p = parms; for (int i = 0; i < parm_count; ++i) { Printv(call, ", ", NULL); p = getParm(p); SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *ivar = NewStringf("_swig_i_%d", i); // This is an ordinary call from Go to C++, so adjust using // the goin typemap. String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(f_go_wrappers, "\t", ivar, " := ", ln, NULL); if (goTypeIsInterface(p, pt)) { Printv(f_go_wrappers, ".Swigcptr()", NULL); } Printv(f_go_wrappers, "\n", NULL); } else { String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, NULL); Delete(goin); } Setattr(p, "emit:goinput", ivar); if (cgo_flag) { bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); if (c_struct_type) { Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { Printv(call, "C.", ct, "(", ivar, ")", NULL); } } else { Printv(call, ivar, NULL); } p = nextParm(p); } Printv(call, ")", NULL); if (gccgo_flag && !cgo_flag && has_goout) { Printv(call, "\n\t}()", NULL); } if (cgo_flag) { if (wt) { // Close the type conversion to the wrapper type. Printv(call, ")", NULL); } if (SwigType_type(result) != T_VOID && !memcpy_ret) { // Close the type conversion of the return value. Printv(call, ")", NULL); } } Printv(call, "\n", NULL); Printv(f_go_wrappers, call, NULL); Delete(call); if (memcpy_ret) { Printv(f_go_wrappers, "\tswig_r = *(*", ret_type, ")(unsafe.Pointer(&swig_r_p))\n", NULL); } goargout(parms); if (SwigType_type(result) != T_VOID) { if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goType(n, result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } } if (ret_type) { Delete(ret_type); } if (wt) { Delete(wt); } } Printv(f_go_wrappers, "}\n\n", NULL); // Define a method in the C++ director class that the C++ upcall // function can call. This permits an upcall to a protected // method. if (!GetFlag(n, "abstract")) { String *upcall_method_name = NewString("_swig_upcall_"); Append(upcall_method_name, name); if (overname) { Append(upcall_method_name, overname); } SwigType *rtype = Getattr(n, "classDirectorMethods:type"); String *upcall_decl = Swig_method_decl(rtype, Getattr(n, "decl"), upcall_method_name, parms, 0); Printv(f_c_directors_h, " ", upcall_decl, " {\n", NULL); Delete(upcall_decl); Printv(f_c_directors_h, " ", NULL); if (SwigType_type(result) != T_VOID) { Printv(f_c_directors_h, "return ", NULL); } String *super_call = Swig_method_call(super, parms); Printv(f_c_directors_h, super_call, ";\n", NULL); Delete(super_call); Printv(f_c_directors_h, " }\n", NULL); // Define the C++ function that the Go function calls. SwigType *first_type = NULL; Parm *first_parm = parms; if (!is_static) { first_type = NewString("SwigDirector_"); Append(first_type, class_name); SwigType_add_pointer(first_type); first_parm = NewParm(first_type, "p", n); set_nextSibling(first_parm, parms); } Swig_save("classDirectorMethod", n, "wrap:name", "wrap:action", NULL); Setattr(n, "wrap:name", upcall_wname); String *action = NewString(""); if (SwigType_type(result) != T_VOID) { Printv(action, Swig_cresult_name(), " = (", SwigType_lstr(result, 0), ")", NULL); if (SwigType_isreference(result)) { Printv(action, "&", NULL); } } Printv(action, Swig_cparm_name(NULL, 0), "->", upcall_method_name, "(", NULL); p = parms; int i = 0; while (p != NULL) { if (SwigType_type(Getattr(p, "type")) != T_VOID) { String *pname = Swig_cparm_name(NULL, i + 1); if (i > 0) { Printv(action, ", ", NULL); } // A parameter whose type is a reference is converted into a // pointer type by gcCTypeForGoValue. We are calling a // function which expects a reference so we need to convert // back. if (SwigType_isreference(Getattr(p, "type"))) { Printv(action, "*", NULL); } Printv(action, pname, NULL); Delete(pname); i++; } p = nextSibling(p); } Printv(action, ");", NULL); Setattr(n, "wrap:action", action); if (cgo_flag) { cgoWrapperInfo info; info.n = n; info.go_name = go_name; info.overname = overname; info.wname = upcall_wname; info.base = NULL; info.parms = first_parm; info.result = result; info.is_static = is_static; info.receiver = NULL; info.is_constructor = false; info.is_destructor = false; int r = cgoGccWrapper(&info); if (r != SWIG_OK) { return r; } } else if (!gccgo_flag) { // Write the upcall wrapper function. This is compiled by gc // and calls the C++ function. int r = gcFunctionWrapper(upcall_wname); if (r != SWIG_OK) { return r; } r = gccFunctionWrapper(n, NULL, upcall_wname, first_parm, result); if (r != SWIG_OK) { return r; } } else { int r = gccgoFunctionWrapper(n, NULL, upcall_wname, first_parm, result); if (r != SWIG_OK) { return r; } } Delete(first_type); if (first_parm != parms) { Delete(first_parm); } Swig_restore(n); Delete(upcall_method_name); // Define a function that uses the Go director type that other // methods in the Go type can call to get parent methods. Printv(f_go_wrappers, "func Director", cn, go_with_over_name, "(p ", cn, NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); Printv(f_go_wrappers, ", ", Getattr(p, "lname"), " ", NULL); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (SwigType_type(result) != T_VOID) { String *tm = goType(n, result); Printv(f_go_wrappers, " ", tm, NULL); Delete(tm); } Printv(f_go_wrappers, " {\n", NULL); String *ret_type = NULL; bool memcpy_ret = false; String *wt = NULL; String *goout = NULL; if (SwigType_type(result) != T_VOID) { ret_type = goImType(n, result); Printv(f_go_wrappers, "\tvar swig_r ", ret_type, "\n", NULL); goout = goTypemapLookup("goout", n, "swig_r"); if (cgo_flag) { bool c_struct_type; Delete(cgoTypeForGoValue(n, result, &c_struct_type)); if (c_struct_type) { memcpy_ret = true; } } } String *call = NewString(""); if (gccgo_flag && !cgo_flag) { if (goout != NULL) { Printv(call, "\tfunc() {\n", NULL); } Printv(call, "\tdefer SwigCgocallDone()\n", NULL); Printv(call, "\tSwigCgocall()\n", NULL); } Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { if (memcpy_ret) { Printv(call, "swig_r_p := ", NULL); } else { Printv(call, "swig_r = ", NULL); if (cgo_flag) { Printv(call, "(", ret_type, ")(", NULL); } } if (cgo_flag && goTypeIsInterface(n, result)) { wt = goWrapperType(n, result, true); Printv(call, "(", wt, ")(", NULL); } } if (cgo_flag) { Printv(call, "C.", upcall_wname, NULL); } else { Printv(call, upcall_gc_name, NULL); } Printv(call, "(", NULL); if (cgo_flag) { Printv(call, "C.uintptr_t(", NULL); } Printv(call, "p.(*", director_struct_name, ").", go_type_name, NULL); if (cgo_flag) { Printv(call, ")", NULL); } p = parms; for (int i = 0; i < parm_count; ++i) { Printv(call, ", ", NULL); p = getParm(p); SwigType *pt = Getattr(p, "type"); String *ivar = NewStringf("_swig_i_%d", i); String *ln = Copy(Getattr(p, "lname")); String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(f_go_wrappers, "\t", ivar, " := ", ln, NULL); if (goTypeIsInterface(p, pt)) { Printv(f_go_wrappers, ".Swigcptr()", NULL); } Printv(f_go_wrappers, "\n", NULL); } else { String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, NULL); Delete(goin); } Setattr(p, "emit:goinput", ivar); if (cgo_flag) { bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); if (c_struct_type) { Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { Printv(call, "C.", ct, "(", ivar, ")", NULL); } } else { Printv(call, ivar, NULL); } Delete(ln); p = nextParm(p); } Printv(call, ")", NULL); if (gccgo_flag && !cgo_flag && goout != NULL) { Printv(call, "\n\t}()", NULL); } if (cgo_flag) { if (wt) { // Close the type conversion to the wrapper type. Printv(call, ")", NULL); } if (SwigType_type(result) != T_VOID && !memcpy_ret) { // Close the type conversion of the return value. Printv(call, ")", NULL); } } Printv(call, "\n", NULL); Printv(f_go_wrappers, call, NULL); Delete(call); if (memcpy_ret) { Printv(f_go_wrappers, "\tswig_r = *(*", ret_type, ")(unsafe.Pointer(&swig_r_p))\n", NULL); } goargout(parms); if (SwigType_type(result) != T_VOID) { if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goType(n, result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } } Printv(f_go_wrappers, "}\n\n", NULL); if (ret_type) { Delete(ret_type); } if (wt) { Delete(wt); } } // The Go function which invokes the method. This is called by // the C++ method on the director class. if (cgo_flag) { Printv(f_go_wrappers, "//export ", callback_name, "\n", NULL); } Printv(f_go_wrappers, "func ", callback_name, "(swig_c int", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = goWrapperType(p, Getattr(p, "type"), false); Printv(f_go_wrappers, ", ", Getattr(p, "lname"), " ", tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ") ", NULL); String *result_wrapper = NULL; if (SwigType_type(result) != T_VOID) { result_wrapper = goWrapperType(n, result, true); Printv(f_go_wrappers, "(swig_result ", result_wrapper, ") ", NULL); } Printv(f_go_wrappers, "{\n", NULL); if (is_ignored) { Printv(f_go_wrappers, "\treturn\n", NULL); } else { bool result_is_interface = false; String *goout = NULL; if (SwigType_type(result) != T_VOID) { result_is_interface = goTypeIsInterface(NULL, result); Printv(f_go_wrappers, "\tvar swig_r ", NULL); if (!result_is_interface) { Printv(f_go_wrappers, goType(n, result), NULL); } else { Printv(f_go_wrappers, result_wrapper, NULL); } Printv(f_go_wrappers, "\n", NULL); goout = goTypemapLookup("godirectorout", n, "swig_r"); } String *call = NewString(""); Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { Printv(call, "swig_r = ", NULL); if (result_is_interface) { Printv(call, result_wrapper, "(", NULL); } } Printv(call, "swig_p.", go_with_over_name, "(", NULL); String *goincode = NewString(""); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(call, ", ", NULL); } SwigType *pt = Getattr(p, "type"); String *ln = NewString(""); // If the Go representation is an interface type class, then // we are receiving a uintptr, and must convert to the // interface. bool is_interface = goTypeIsInterface(p, pt); if (is_interface) { // Passing is_result as true to goWrapperType gives us the // name of the Go type we need to convert to an interface. String *wt = goWrapperType(p, pt, true); Printv(ln, wt, "(", NULL); Delete(wt); } Printv(ln, Getattr(p, "lname"), NULL); if (is_interface) { Printv(ln, ")", NULL); } String *goin = goGetattr(p, "tmap:godirectorin"); if (goin == NULL) { Printv(call, ln, NULL); } else { String *ivar = NewString(""); Printf(ivar, "_swig_i_%d", i); String *itm = goType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(goincode, goin, "\n", NULL); Delete(goin); Printv(call, ivar, NULL); Delete(ivar); } Delete(ln); p = nextParm(p); } Printv(call, ")", NULL); if (result_is_interface) { Printv(call, ".Swigcptr())", NULL); } Printv(call, "\n", NULL); if (gccgo_flag && !cgo_flag) { if (goout != NULL) { Printv(f_go_wrappers, "\tfunc() {\n", NULL); } Printv(f_go_wrappers, "\tSwigCgocallBack()\n", NULL); Printv(f_go_wrappers, "\tdefer SwigCgocallBackDone()\n", NULL); } Printv(f_go_wrappers, "\tswig_p := swigDirectorLookup(swig_c).(*", director_struct_name, ")\n", NULL); Printv(f_go_wrappers, goincode, NULL); Printv(f_go_wrappers, call, NULL); Delete(call); if (gccgo_flag && !cgo_flag && goout != NULL) { Printv(f_go_wrappers, "\t}()\n", NULL); } if (SwigType_type(result) != T_VOID) { if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goImType(n, result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } } } Printv(f_go_wrappers, "}\n\n", NULL); Delete(result_wrapper); Delete(upcall_wname); Delete(upcall_gc_name); Delete(go_with_over_name); } if (!is_ignored || is_pure_virtual) { // Declare the method for the director class. SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); String *decl = Swig_method_decl(rtype, Getattr(n, "decl"), Getattr(n, "name"), parms, 0); Printv(f_c_directors_h, " virtual ", decl, NULL); Delete(decl); String *qname = NewString(""); Printv(qname, "SwigDirector_", class_name, "::", Getattr(n, "name"), NULL); decl = Swig_method_decl(rtype, Getattr(n, "decl"), qname, parms, 0); Printv(w->def, decl, NULL); Delete(decl); Delete(qname); String *throws = buildThrow(n); if (throws) { Printv(f_c_directors_h, " ", throws, NULL); Printv(w->def, " ", throws, NULL); Delete(throws); } Printv(f_c_directors_h, ";\n", NULL); Printv(w->def, " {\n", NULL); if (SwigType_type(result) != T_VOID) { if (!SwigType_isclass(result)) { if (!(SwigType_ispointer(result) || SwigType_isreference(result))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(result, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(result, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(result, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(result, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (!is_ignored) { makeDirectorMethodWrapper(n, w, callback_name); } else { assert(is_pure_virtual); Printv(w->code, " _swig_gopanic(\"call to pure virtual function ", Getattr(parent, "sym:name"), name, "\");\n", NULL); if (SwigType_type(result) != T_VOID) { String *retstr = SwigType_rcaststr(result, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); } } Printv(w->code, "}", NULL); Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_c_directors); } Delete(cn); Delete(go_type_name); Delete(director_struct_name); Delete(interface_name); Delete(callback_name); Delete(upcall_name); Delete(go_name); DelWrapper(w); return SWIG_OK; } /* ------------------------------------------------------------ * makeDirectorMethodWrapper * * Emit the function wrapper for a director method. * ------------------------------------------------------------ */ void makeDirectorMethodWrapper(Node *n, Wrapper *w, String *callback_name) { if (cgo_flag) { makeCgoDirectorMethodWrapper(n, w, callback_name); return; } ParmList *parms = Getattr(n, "wrap:parms"); SwigType *result = Getattr(n, "type"); String *callback_wname = Swig_name_wrapper(callback_name); Append(callback_wname, unique_id); if (!gccgo_flag) { Printv(f_c_directors, "extern \"C\" void ", callback_wname, "(void*, int);\n", NULL); } else { Printv(f_c_directors, "extern \"C\" ", NULL); String *fnname = NewString(""); Printv(fnname, callback_wname, "(int", NULL); Parm *p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *cg = gccgoCTypeForGoValue(p, Getattr(p, "type"), Getattr(p, "lname")); Printv(fnname, ", ", cg, NULL); Delete(cg); p = Getattr(p, "tmap:directorin:next"); } Printv(fnname, ")", NULL); if (SwigType_type(result) == T_VOID) { Printv(f_c_directors, "void ", fnname, NULL); } else { String *tm = gccgoCTypeForGoValue(n, result, fnname); Printv(f_c_directors, tm, NULL); Delete(tm); } Delete(fnname); Printv(f_c_directors, " __asm__(\"", go_prefix, ".", callback_name, "\");\n", NULL); } if (!gccgo_flag) { Printv(w->code, " struct {\n", NULL); Printv(w->code, " intgo go_val;\n", NULL); Parm *p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *ln = Getattr(p, "lname"); String *cg = gcCTypeForGoValue(p, Getattr(p, "type"), ln); Printv(w->code, " ", cg, ";\n", NULL); Delete(cg); p = Getattr(p, "tmap:directorin:next"); } if (SwigType_type(result) != T_VOID) { Printv(w->code, " long : 0;\n", NULL); String *rname = NewString(Swig_cresult_name()); String *cg = gcCTypeForGoValue(n, result, rname); Printv(w->code, " ", cg, ";\n", NULL); Delete(cg); Delete(rname); } Printv(w->code, " } SWIGSTRUCTPACKED swig_a;\n", NULL); Printv(w->code, " swig_a.go_val = go_val;\n", NULL); p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *tm = Getattr(p, "tmap:directorin"); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as director method argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); String *ln = Getattr(p, "lname"); String *input = NewString(""); Printv(input, "swig_a.", ln, NULL); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Replaceall(tm, "$owner", "0"); Delete(input); Printv(w->code, "\t", tm, "\n", NULL); Delete(tm); } p = Getattr(p, "tmap:directorin:next"); } Printv(w->code, " crosscall2(", callback_wname, ", &swig_a, (int) sizeof swig_a);\n", NULL); /* Marshal outputs */ for (p = parms; p;) { String *tm; if ((tm = Getattr(p, "tmap:directorargout"))) { tm = Copy(tm); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); Delete(tm); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } if (SwigType_type(result) != T_VOID) { String *result_str = NewString("c_result"); String *tm = Swig_typemap_lookup("directorout", n, result_str, NULL); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use type %s as director method result\n", SwigType_str(result, 0)); } else { static const String *swig_a_result = NewStringf("swig_a.%s", Swig_cresult_name()); Replaceall(tm, "$input", swig_a_result); Replaceall(tm, "$result", "c_result"); Printv(w->code, " ", tm, "\n", NULL); String *retstr = SwigType_rcaststr(result, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); Delete(tm); } Delete(result_str); } // The C wrapper code which calls the Go function. Printv(f_gc_wrappers, "#pragma dynexport ", callback_wname, " ", callback_wname, "\n", NULL); Printv(f_gc_wrappers, "#pragma cgo_export_static ", callback_wname, " ", callback_wname, "\n", NULL); Printv(f_gc_wrappers, "#pragma textflag 7\n", NULL); Printv(f_gc_wrappers, "extern void \xc2\xb7", callback_name, "();\n", NULL); Printv(f_gc_wrappers, "void\n", NULL); Printv(f_gc_wrappers, callback_wname, "(void *a, int32 n)\n", NULL); Printv(f_gc_wrappers, "{\n", NULL); Printv(f_gc_wrappers, "\truntime\xc2\xb7" "cgocallback(\xc2\xb7", callback_name, ", a, n);\n", NULL); Printv(f_gc_wrappers, "}\n\n", NULL); } else { if (SwigType_type(result) != T_VOID) { String *r = NewString(Swig_cresult_name()); String *tm = gccgoCTypeForGoValue(n, result, r); Wrapper_add_local(w, r, tm); Delete(tm); Delete(r); } String *args = NewString(""); Parm *p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *pn = NewString("g"); Append(pn, Getattr(p, "lname")); Setattr(p, "emit:directorinput", pn); String *tm = gccgoCTypeForGoValue(n, Getattr(p, "type"), pn); Wrapper_add_local(w, pn, tm); Delete(tm); tm = Getattr(p, "tmap:directorin"); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as director method argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); Replaceall(tm, "$input", pn); Replaceall(tm, "$owner", 0); Printv(w->code, " ", tm, "\n", NULL); Delete(tm); Printv(args, ", ", pn, NULL); } p = Getattr(p, "tmap:directorin:next"); } Printv(w->code, " ", NULL); if (SwigType_type(result) != T_VOID) { Printv(w->code, Swig_cresult_name(), " = ", NULL); } Printv(w->code, callback_wname, "(go_val", args, ");\n", NULL); /* Marshal outputs */ for (p = parms; p;) { String *tm; if ((tm = Getattr(p, "tmap:directorargout"))) { tm = Copy(tm); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); Delete(tm); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } if (SwigType_type(result) != T_VOID) { String *result_str = NewString("c_result"); String *tm = Swig_typemap_lookup("directorout", n, result_str, NULL); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use type %s as director method result\n", SwigType_str(result, 0)); } else { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "c_result"); Printv(w->code, " ", tm, "\n", NULL); String *retstr = SwigType_rcaststr(result, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); Delete(tm); } Delete(result_str); } } Delete(callback_wname); } /* ------------------------------------------------------------ * makeDirectorMethodWrapper * * Emit the function wrapper for a director method for cgo. * ------------------------------------------------------------ */ void makeCgoDirectorMethodWrapper(Node *n, Wrapper *w, String *callback_name) { ParmList *parms = Getattr(n, "wrap:parms"); SwigType *result = Getattr(n, "type"); Printv(f_c_directors, "extern \"C\" ", NULL); String *fnname = Copy(callback_name); Append(fnname, "(int"); Parm *p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *cg = gcCTypeForGoValue(p, Getattr(p, "type"), Getattr(p, "lname")); Printv(fnname, ", ", cg, NULL); Delete(cg); p = Getattr(p, "tmap:directorin:next"); } Printv(fnname, ")", NULL); if (SwigType_type(result) == T_VOID) { Printv(f_c_directors, "void ", fnname, NULL); } else { String *tm = gcCTypeForGoValue(n, result, fnname); Printv(f_c_directors, tm, NULL); Delete(tm); } Delete(fnname); Printv(f_c_directors, ";\n", NULL); if (SwigType_type(result) != T_VOID) { String *r = NewString(Swig_cresult_name()); String *tm = gcCTypeForGoValue(n, result, r); Wrapper_add_local(w, r, tm); Delete(tm); Delete(r); } String *args = NewString(""); p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *pn = NewString("swig_"); Append(pn, Getattr(p, "lname")); Setattr(p, "emit:directorinput", pn); String *tm = gcCTypeForGoValue(p, Getattr(p, "type"), pn); Wrapper_add_local(w, pn, tm); Delete(tm); tm = Getattr(p, "tmap:directorin"); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as director method argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); Replaceall(tm, "$input", pn); Replaceall(tm, "$owner", 0); Printv(w->code, " ", tm, "\n", NULL); Delete(tm); Printv(args, ", ", pn, NULL); } p = Getattr(p, "tmap:directorin:next"); } Printv(w->code, " ", NULL); if (SwigType_type(result) != T_VOID) { Printv(w->code, Swig_cresult_name(), " = ", NULL); } Printv(w->code, callback_name, "(go_val", args, ");\n", NULL); /* Marshal outputs */ for (p = parms; p; ) { String *tm; if ((tm = Getattr(p, "tmap:directorargout"))) { tm = Copy(tm); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } if (SwigType_type(result) != T_VOID) { String *result_str = NewString("c_result"); String *tm = Swig_typemap_lookup("directorout", n, result_str, NULL); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use type %s as director method result\n", SwigType_str(result, 0)); } else { tm = Copy(tm); Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "c_result"); Printv(w->code, " ", tm, "\n", NULL); String *retstr = SwigType_rcaststr(result, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); Delete(tm); } Delete(result_str); } } /* ------------------------------------------------------------ * classDirectorEnd * * Complete support for a director class. * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { (void) n; Printv(f_c_directors_h, " private:\n", NULL); Printv(f_c_directors_h, " intgo go_val;\n", NULL); Printv(f_c_directors_h, " Swig_memory *swig_mem;\n", NULL); Printv(f_c_directors_h, "};\n\n", NULL); class_name = NULL; class_node = NULL; Delete(class_receiver); class_receiver = NULL; Delete(class_methods); class_methods = NULL; return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorDisown * * I think Go does not require a disown method. * ------------------------------------------------------------ */ int classDirectorDisown(Node *n) { (void) n; return SWIG_OK; } /*---------------------------------------------------------------------- * buildThrow() * * Build and return a throw clause if needed. *--------------------------------------------------------------------*/ String *buildThrow(Node *n) { if (Getattr(n, "noexcept")) return NewString("noexcept"); ParmList *throw_parm_list = Getattr(n, "throws"); if (!throw_parm_list && !Getattr(n, "throw")) return NULL; String *ret = NewString("throw("); if (throw_parm_list) { Swig_typemap_attach_parms("throws", throw_parm_list, NULL); } bool first = true; for (Parm *p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (first) { first = false; } else { Printv(ret, ", ", NULL); } String *s = SwigType_str(Getattr(p, "type"), 0); Printv(ret, s, NULL); Delete(s); } } Printv(ret, ")", NULL); return ret; } /*---------------------------------------------------------------------- * extraDirectorProtectedCPPMethodsRequired() * * We don't need to check upcall when calling methods. *--------------------------------------------------------------------*/ bool extraDirectorProtectedCPPMethodsRequired() const { return false; } /*---------------------------------------------------------------------- * makeDispatchFunction * * Make a dispatch function for an overloaded C++ function. The * receiver parameter is the receiver for a method, unless is_upcall * is true. If is_upcall is true, then the receiver parameter is * the type of the first argument to the function. *--------------------------------------------------------------------*/ int makeDispatchFunction(Node *n, String *go_name, String *receiver, bool is_static, SwigType *director_struct, bool is_upcall) { bool is_director = director_struct ? true : false; String *nodetype = Getattr(n, "nodeType"); bool is_constructor = Cmp(nodetype, "constructor") == 0; bool is_destructor = Cmp(nodetype, "destructor") == 0; bool can_use_receiver = (!is_constructor && !is_destructor && !is_upcall); bool use_receiver = (!is_static && can_use_receiver); bool add_to_interface = (interfaces && !is_constructor && !is_destructor && !is_static && !is_upcall); List *dispatch = Swig_overload_rank(n, false); int nfunc = Len(dispatch); SwigType *all_result; bool mismatch; if (is_constructor) { assert(!is_upcall); if (!is_director) { all_result = Copy(Getattr(class_node, "classtypeobj")); } else { all_result = Copy(director_struct); } mismatch = false; } else { all_result = NULL; mismatch = false; bool any_void = false; for (int i = 0; i < nfunc; ++i) { Node *nn = Getitem(dispatch, i); Node *ni = Getattr(nn, "directorNode") ? Getattr(nn, "directorNode") : nn; SwigType *result = Getattr(ni, "go:type"); assert(result); if (SwigType_type(result) == T_VOID) { if (all_result) { mismatch = true; } any_void = true; } else { if (any_void) { mismatch = true; } else if (!all_result) { all_result = Copy(result); } else if (Cmp(result, all_result) != 0) { mismatch = true; } } } if (mismatch) { Delete(all_result); all_result = NULL; } else if (all_result) { ; } else { all_result = NewString("void"); } } Printv(f_go_wrappers, "func ", NULL); if (receiver && use_receiver) { Printv(f_go_wrappers, "(p ", receiver, ") ", NULL); } Printv(f_go_wrappers, go_name, "(", NULL); if (is_director && is_constructor) { Printv(f_go_wrappers, "abi interface{}, ", NULL); assert(!add_to_interface); } if (is_upcall) { Printv(f_go_wrappers, "p *", receiver, ", ", NULL); assert(!add_to_interface); } Printv(f_go_wrappers, "a ...interface{})", NULL); if (add_to_interface) { Printv(interfaces, "\t", go_name, "(a ...interface{})", NULL); } if (mismatch) { Printv(f_go_wrappers, " interface{}", NULL); if (add_to_interface) { Printv(interfaces, " interface{}", NULL); } } else if (all_result && SwigType_type(all_result) != T_VOID) { if (is_director && is_constructor) { Printv(f_go_wrappers, " ", receiver, NULL); if (add_to_interface) { Printv(interfaces, " ", receiver, NULL); } } else { String *tm = goType(n, all_result); Printv(f_go_wrappers, " ", tm, NULL); if (add_to_interface) { Printv(interfaces, " ", tm, NULL); } Delete(tm); } } Printv(f_go_wrappers, " {\n", NULL); if (add_to_interface) { Printv(interfaces, "\n", NULL); } Printv(f_go_wrappers, "\targc := len(a)\n", NULL); for (int i = 0; i < nfunc; ++i) { int fn = 0; Node *nn = Getitem(dispatch, i); Node *ni = Getattr(nn, "directorNode") ? Getattr(nn, "directorNode") : nn; Parm *pi = Getattr(ni, "wrap:parms"); // If we are using a receiver, we want to ignore a leading self // parameter. Because of the way this is called, there may or // may not be a self parameter at this point. if (use_receiver && pi && Getattr(pi, "self")) { pi = getParm(pi); if (pi) { pi = nextParm(pi); } } int num_required = emit_num_required(pi); int num_arguments = emit_num_arguments(pi); bool varargs = emit_isvarargs(pi) ? true : false; if (varargs) { Printf(f_go_wrappers, "\tif argc >= %d {\n", num_required); } else { if (num_required == num_arguments) { Printf(f_go_wrappers, "\tif argc == %d {\n", num_required); } else { Printf(f_go_wrappers, "\tif argc >= %d && argc <= %d {\n", num_required, num_arguments); } } // Build list of collisions with the same number of arguments. List *coll = NewList(); for (int k = i + 1; k < nfunc; ++k) { Node *nnk = Getitem(dispatch, k); Node *nk = Getattr(nnk, "directorNode") ? Getattr(nnk, "directorNode") : nnk; Parm *pk = Getattr(nk, "wrap:parms"); if (use_receiver && pk && Getattr(pk, "self")) { pk = getParm(pk); if (pk) { pk = nextParm(pk); } } int nrk = emit_num_required(pk); int nak = emit_num_arguments(pk); if ((nrk >= num_required && nrk <= num_arguments) || (nak >= num_required && nak <= num_arguments) || (nrk <= num_required && nak >= num_arguments) || (varargs && nrk >= num_required)) { Append(coll, nk); } } int num_braces = 0; if (Len(coll) > 0 && num_arguments > 0) { int j = 0; Parm *pj = pi; while (pj) { pj = getParm(pj); if (!pj) { break; } // If all the overloads have the same type in this position, // we can omit the check. SwigType *tm = goOverloadType(pj, Getattr(pj, "type")); bool emitcheck = false; for (int k = 0; k < Len(coll) && !emitcheck; ++k) { Node *nk = Getitem(coll, k); Parm *pk = Getattr(nk, "wrap:parms"); if (use_receiver && pk && Getattr(pk, "self")) { pk = getParm(pk); if (pk) { pk = nextParm(pk); } } int nak = emit_num_arguments(pk); if (nak <= j) continue; int l = 0; Parm *pl = pk; while (pl && l <= j) { pl = getParm(pl); if (!pl) { break; } if (l == j) { SwigType *tml = goOverloadType(pl, Getattr(pl, "type")); if (Cmp(tm, tml) != 0) { emitcheck = true; } Delete(tml); } pl = nextParm(pl); ++l; } } if (emitcheck) { if (j >= num_required) { Printf(f_go_wrappers, "\t\tif argc > %d {\n", j); ++num_braces; } fn = i + 1; Printf(f_go_wrappers, "\t\tif _, ok := a[%d].(%s); !ok {\n", j, tm); Printf(f_go_wrappers, "\t\t\tgoto check_%d\n", fn); Printv(f_go_wrappers, "\t\t}\n", NULL); } Delete(tm); pj = nextParm(pj); ++j; } } for (; num_braces > 0; --num_braces) { Printv(f_go_wrappers, "\t\t}\n", NULL); } // We may need to generate multiple calls if there are variable // argument lists involved. Build the start of the call. String *start = NewString(""); SwigType *result = Getattr(ni, "go:type"); if (is_constructor) { result = all_result; } else if (is_destructor) { result = NULL; } if (result && SwigType_type(result) != T_VOID && (!all_result || SwigType_type(all_result) != T_VOID)) { Printv(start, "return ", NULL); } bool advance_parm = false; if (receiver && use_receiver) { Printv(start, "p.", go_name, NULL); } else if (can_use_receiver && !isStatic(ni) && pi && Getattr(pi, "self")) { // This is an overload of a static function and a non-static // function. assert(num_required > 0); SwigType *tm = goWrapperType(pi, Getattr(pi, "type"), true); String *nm = buildGoName(Getattr(ni, "sym:name"), false, isFriend(ni)); Printv(start, "a[0].(", tm, ").", nm, NULL); Delete(nm); Delete(tm); advance_parm = true; } else { Printv(start, go_name, NULL); } Printv(start, Getattr(ni, "sym:overname"), "(", NULL); bool need_comma = false; if (is_director && is_constructor) { Printv(start, "abi", NULL); need_comma = true; } if (is_upcall) { Printv(start, "p", NULL); need_comma = true; } Parm *p = pi; int pn = 0; if (advance_parm) { p = getParm(p); if (p) { p = nextParm(p); } ++pn; } while (pn < num_required) { p = getParm(p); if (need_comma) { Printv(start, ", ", NULL); } SwigType *tm = goType(p, Getattr(p, "type")); Printf(start, "a[%d].(%s)", pn, tm); Delete(tm); need_comma = true; ++pn; p = nextParm(p); } String *end = NULL; if (!result || SwigType_type(result) == T_VOID || (all_result && SwigType_type(all_result) == T_VOID)) { end = NewString(""); Printv(end, "return", NULL); if (!all_result || SwigType_type(all_result) != T_VOID) { Printv(end, " 0", NULL); } } if (num_required == num_arguments) { Printv(f_go_wrappers, "\t\t", start, ")\n", NULL); if (end) { Printv(f_go_wrappers, "\t\t", end, "\n", NULL); } } else { Printv(f_go_wrappers, "\t\tswitch argc {\n", NULL); for (int j = num_required; j <= num_arguments; ++j) { Printf(f_go_wrappers, "\t\tcase %d:\n", j); Printv(f_go_wrappers, "\t\t\t", start, NULL); bool nc = need_comma; for (int k = num_required; k < j; ++k) { if (nc) { Printv(f_go_wrappers, ", ", NULL); } Printf(f_go_wrappers, "a[%d]", k); nc = true; } Printv(f_go_wrappers, ")\n", NULL); if (end) { Printv(f_go_wrappers, "\t\t\t", end, "\n", NULL); } } Printv(f_go_wrappers, "\t\t}\n", NULL); } Printv(f_go_wrappers, "\t}\n", NULL); if (fn != 0) { Printf(f_go_wrappers, "check_%d:\n", fn); } Delete(coll); } Printv(f_go_wrappers, "\tpanic(\"No match for overloaded function call\")\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Delete(all_result); Delete(dispatch); return SWIG_OK; } /* ---------------------------------------------------------------------- * checkFunctionVisibility() * * Return true if we should write out a function based on its * visibility, false otherwise. * ---------------------------------------------------------------------- */ bool checkFunctionVisibility(Node *n, Node *parent) { // Write out a public function. if (is_public(n)) return true; // Don't write out a private function. if (is_private(n)) return false; // Write a protected function for a director class in // dirprot_mode. if (parent == NULL) { return false; } if (dirprot_mode() && Swig_directorclass(parent)) return true; // Otherwise don't write out a protected function. return false; } /* ---------------------------------------------------------------------- * exportedName() * * Given a C/C++ name, return a name in Go which will be exported. * If the first character is an upper case letter, this returns a * copy of its argument. If the first character is a lower case * letter, this forces it to upper case. Otherwise, this prepends * 'X'. * ---------------------------------------------------------------------- */ String *exportedName(String *name) { String *copy = Copy(name); char c = *Char(copy); if (islower(c)) { char l[2]; char u[2]; l[0] = c; l[1] = '\0'; u[0] = toupper(c); u[1] = '\0'; Replace(copy, l, u, DOH_REPLACE_FIRST); } else if (!isalpha(c)) { char l[2]; char u[3]; l[0] = c; l[1] = '\0'; u[0] = 'X'; u[1] = c; u[2] = '\0'; Replace(copy, l, u, DOH_REPLACE_FIRST); } String *ret = Swig_name_mangle(copy); Delete(copy); return ret; } /* ---------------------------------------------------------------------- * removeClassname() * * If the name starts with the current class name, followed by an * underscore, remove it. If there is no current class name, this * simply returns a copy of the name. This undoes Swig's way of * recording the class name in a member name. * ---------------------------------------------------------------------- */ String *removeClassname(String *name) { String *copy = Copy(name); if (class_name) { char *p = Char(name); if (Strncmp(name, class_name, Len(class_name)) == 0 && p[Len(class_name)] == '_') { Replace(copy, class_name, "", DOH_REPLACE_FIRST); Replace(copy, "_", "", DOH_REPLACE_FIRST); } } return copy; } /* ---------------------------------------------------------------------- * buildGoName() * * Build the name to use for an ordinary function, variable, or * whatever in Go. The name argument is something like the sym:name * attribute of the node. If is_static is false, this could be a * method, and the returned name will be the name of the * method--i.e., it will not include the class name. * ---------------------------------------------------------------------- */ String *buildGoName(String *name, bool is_static, bool is_friend) { String *nw = NewString(""); if (is_static && !is_friend && class_name) { String *c1 = exportedName(class_name); Append(nw, c1); Delete(c1); } String *c2 = removeClassname(name); String *c3 = exportedName(c2); Append(nw, c3); Delete(c2); Delete(c3); String *ret = Swig_name_mangle(nw); Delete(nw); return ret; } /* ---------------------------------------------------------------------- * buildGoWrapperName() * * Build the name to use for a Go wrapper function. This is a * function called by the real Go function in order to convert C++ * classes from interfaces to pointers, and other such conversions * between the Go type and the C++ type. * ---------------------------------------------------------------------- */ String *buildGoWrapperName(String *name, String *overname) { String *s1 = NewString("_swig_wrap_"); Append(s1, name); String *s2 = Swig_name_mangle(s1); Delete(s1); if (overname) { Append(s2, overname); } return s2; } /* ---------------------------------------------------------------------- * checkNameConflict() * * Check for a name conflict on the name we are going to use in Go. * These conflicts are likely because of the enforced * capitalization. When we find one, issue a warning and return * false. If the name is OK, return true. * ---------------------------------------------------------------------- */ bool checkNameConflict(String* name, Node* n, const_String_or_char_ptr scope) { Node *lk = symbolLookup(name, scope); if (lk) { String *n1 = Getattr(n, "sym:name"); if (!n1) { n1 = Getattr(n, "name"); } String *n2 = Getattr(lk, "sym:name"); if (!n2) { n2 = Getattr(lk, "name"); } Swig_warning(WARN_GO_NAME_CONFLICT, input_file, line_number, "Ignoring '%s' due to Go name ('%s') conflict with '%s'\n", n1, name, n2); return false; } bool r = addSymbol(name, n, scope) ? true : false; assert(r); return true; } /* ---------------------------------------------------------------------- * checkIgnoredParameters() * * If any of the parameters of this function, or the return type, * are ignored due to a name conflict, give a warning and return * false. * ---------------------------------------------------------------------- */ bool checkIgnoredParameters(Node *n, String *go_name) { ParmList *parms = Getattr(n, "parms"); if (parms) { Wrapper *dummy = NewWrapper(); emit_attach_parmmaps(parms, dummy); int parm_count = emit_num_arguments(parms); Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (!checkIgnoredType(n, go_name, Getattr(p, "type"))) { DelWrapper(dummy); return false; } p = nextParm(p); } DelWrapper(dummy); } if (!checkIgnoredType(n, go_name, Getattr(n, "type"))) { return false; } return true; } /* ---------------------------------------------------------------------- * checkIgnoredType() * * If this type is being ignored due to a name conflict, give a * warning and return false. * ---------------------------------------------------------------------- */ bool checkIgnoredType(Node *n, String *go_name, SwigType *type) { if (hasGoTypemap(n, type)) { return true; } SwigType *t = SwigType_typedef_resolve_all(type); bool ret = true; bool is_conflict = false; Node *e = Language::enumLookup(t); if (e) { if (GetFlag(e, "go:conflict")) { is_conflict = true; } } else if (SwigType_issimple(t)) { Node *cn = classLookup(t); if (cn) { if (GetFlag(cn, "go:conflict")) { is_conflict = true; } } } else if (SwigType_ispointer(t) || SwigType_isarray(t) || SwigType_isqualifier(t) || SwigType_isreference(t)) { SwigType *r = Copy(t); if (SwigType_ispointer(r)) { SwigType_del_pointer(r); } else if (SwigType_isarray(r)) { SwigType_del_array(r); } else if (SwigType_isqualifier(r)) { SwigType_del_qualifier(r); } else { SwigType_del_reference(r); } if (!checkIgnoredType(n, go_name, r)) { ret = false; } Delete(r); } if (is_conflict) { String *s = SwigType_str(t, NULL); Swig_warning(WARN_GO_NAME_CONFLICT, input_file, line_number, "Ignoring '%s' (Go name '%s') due to Go name conflict for parameter or result type '%s'\n", Getattr(n, "name"), go_name, s); Delete(s); ret = false; } Delete(t); return ret; } /* ---------------------------------------------------------------------- * goType() * * Given a SWIG type, return a string for the type in Go. * ---------------------------------------------------------------------- */ String *goType(Node *n, SwigType *type) { return goTypeWithInfo(n, type, false, NULL); } /* ---------------------------------------------------------------------- * goImType() * * Given a SWIG type, return a string for the intermediate Go type * to pass to C/C++. This is like goType except that it looks for * an imtype typemap entry first. * ---------------------------------------------------------------------- */ String *goImType(Node *n, SwigType *type) { return goTypeWithInfo(n, type, true, NULL); } /* ---------------------------------------------------------------------- * goTypeWithInfo() * * Like goType, but return some more information. * * If use_imtype is true, this look for a imtype typemap entry. * * If the p_is_interface parameter is not NULL, this sets * *p_is_interface to indicate whether this type is going to be * represented by a Go interface type. These are cases where the Go * code needs to make some adjustments when passing values back and * forth with C/C++. * ---------------------------------------------------------------------- */ String *goTypeWithInfo(Node *n, SwigType *type, bool use_imtype, bool *p_is_interface) { if (p_is_interface) { *p_is_interface = false; } String *ret = NULL; if (use_imtype) { if (n && Cmp(type, Getattr(n, "type")) == 0) { if (Strcmp(Getattr(n, "nodeType"), "parm") == 0) { ret = Getattr(n, "tmap:imtype"); } if (!ret) { ret = Swig_typemap_lookup("imtype", n, "", NULL); } } else { Parm *p = NewParm(type, "goImType", n); ret = Swig_typemap_lookup("imtype", p, "", NULL); Delete(p); } } if (!ret) { if (n && Cmp(type, Getattr(n, "type")) == 0) { if (Strcmp(Getattr(n, "nodeType"), "parm") == 0) { ret = Getattr(n, "tmap:gotype"); } if (!ret) { ret = Swig_typemap_lookup("gotype", n, "", NULL); } } else { Parm *p = NewParm(type, "goType", n); ret = Swig_typemap_lookup("gotype", p, "", NULL); Delete(p); } } if (ret && Strstr(ret, "$gotypename") != 0) { ret = NULL; } if (ret) { return Copy(ret); } SwigType *t = SwigType_typedef_resolve_all(type); if (SwigType_isenum(t)) { Node *e = Language::enumLookup(t); if (e) { ret = goEnumName(e); } else if (Strcmp(t, "enum ") == 0) { ret = NewString("int"); } else { // An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) or an ignored enum String *tt = Copy(t); Replace(tt, "enum ", "", DOH_REPLACE_ANY); ret = exportedName(tt); Setattr(undefined_enum_types, t, ret); Delete(tt); } } else if (SwigType_isfunctionpointer(t) || SwigType_isfunction(t)) { ret = NewString("_swig_fnptr"); } else if (SwigType_ismemberpointer(t)) { ret = NewString("_swig_memberptr"); } else if (SwigType_issimple(t)) { Node *cn = classLookup(t); if (cn) { ret = Getattr(cn, "sym:name"); if (!ret) { ret = Getattr(cn, "name"); } ret = exportedName(ret); Node *cnmod = Getattr(cn, "module"); if (!cnmod || Strcmp(Getattr(cnmod, "name"), module) == 0) { Setattr(undefined_types, t, t); } else { String *nw = NewString(""); Printv(nw, getModuleName(Getattr(cnmod, "name")), ".", ret, NULL); Delete(ret); ret = nw; } } else { // SWIG does not know about this type. ret = exportedName(t); Setattr(undefined_types, t, t); } if (p_is_interface) { *p_is_interface = true; } } else if (SwigType_ispointer(t) || SwigType_isarray(t)) { SwigType *r = Copy(t); if (SwigType_ispointer(r)) { SwigType_del_pointer(r); } else { SwigType_del_array(r); } if (SwigType_type(r) == T_VOID) { ret = NewString("uintptr"); } else { bool is_interface; String *base = goTypeWithInfo(n, r, false, &is_interface); // At the Go level, an unknown or class type is handled as an // interface wrapping a pointer. This means that if a // function returns the C type X, we will be wrapping the C // type X*. In Go we will call that type X. That means that // if a C function expects X*, we can pass the Go type X. And // that means that when we see the C type X*, we should use // the Go type X. // The is_interface variable tells us this. However, it will // be true both for the case of X and for the case of X*. If // r is a pointer here, then we are looking at X**. There is // really no good way for us to handle that. bool is_pointer_to_pointer = false; if (is_interface) { SwigType *c = Copy(r); if (SwigType_isqualifier(c)) { SwigType_del_qualifier(c); if (SwigType_ispointer(c) || SwigType_isarray(c)) { is_pointer_to_pointer = true; } } Delete(c); } if (is_interface) { if (!is_pointer_to_pointer) { ret = base; if (p_is_interface) { *p_is_interface = true; } } else { ret = NewString("uintptr"); } } else { ret = NewString("*"); Append(ret, base); Delete(base); } } Delete(r); } else if (SwigType_isreference(t)) { SwigType *r = Copy(t); SwigType_del_reference(r); // If this is a const reference, and we are looking at a pointer // to it, then we just use the pointer we already have. bool add_pointer = true; if (SwigType_isqualifier(r)) { String *q = SwigType_parm(r); if (Strcmp(q, "const") == 0) { SwigType *c = Copy(r); SwigType_del_qualifier(c); if (SwigType_ispointer(c)) { add_pointer = false; } Delete(c); } } if (add_pointer) { SwigType_add_pointer(r); } ret = goTypeWithInfo(n, r, false, p_is_interface); Delete(r); } else if (SwigType_isqualifier(t)) { SwigType *r = Copy(t); SwigType_del_qualifier(r); ret = goTypeWithInfo(n, r, false, p_is_interface); Delete(r); } else if (SwigType_isvarargs(t)) { ret = NewString("[]interface{}"); } Delete(t); if (!ret) { Swig_warning(WARN_LANG_NATIVE_UNIMPL, input_file, line_number, "No Go typemap defined for %s\n", SwigType_str(type, 0)); ret = NewString("uintptr"); } return ret; } /* ---------------------------------------------------------------------- * cgoTypeForGoValue() * * Given a SWIG type, return a string for the C type to use for the * cgo wrapper code. This always returns a simple identifier, since * it is used in Go code as C.name. * * This sets *c_struct_type if the C type uses a struct where the Go * type uses a simple type. This is true for strings and slices. * When this is true the Go code has to jump through unsafe hoops to * pass the type checker. * ---------------------------------------------------------------------- */ String *cgoTypeForGoValue(Node *n, SwigType *type, bool *c_struct_type) { *c_struct_type = false; bool is_interface; String *go_type = goTypeWithInfo(n, type, true, &is_interface); if (is_interface) { Delete(go_type); return NewString("uintptr_t"); } if (Strcmp(go_type, "uintptr") == 0) { Delete(go_type); return NewString("uintptr_t"); } if (((char*)Char(go_type))[0] == '*') { // Treat all pointers as void*. There is no meaningful type // checking going on here anyhow, and that lets us avoid // worrying about defining the base type of the pointer. Delete(go_type); return NewString("swig_voidp"); } // Check for some Go types that are really pointers under the covers. bool is_hidden_pointer = Strncmp(go_type, "func(", 5) == 0 || Strncmp(go_type, "map[", 4) == 0 || Strncmp(go_type, "chan ", 5) == 0; Delete(go_type); String *ct = Getattr(n, "emit:cgotype"); if (ct) { *c_struct_type = Getattr(n, "emit:cgotypestruct") ? true : false; return Copy(ct); } String *t = Copy(type); if (SwigType_isarray(t)) { SwigType_del_array(t); SwigType_add_pointer(t); } bool add_typedef = true; static int count; ++count; ct = NewStringf("swig_type_%d", count); String *gct = gcCTypeForGoValue(n, t, ct); Delete(t); if (Strncmp(gct, "_gostring_", 10) == 0 || Strncmp(gct, "_goslice_", 9) == 0) { *c_struct_type = true; Setattr(n, "emit:cgotypestruct", type); } else { char *p = Strstr(gct, ct); if (p != NULL && p > (char*)Char(gct) && p[-1] == '*' && p[Len(ct)] == '\0') { // Treat all pointers as void*. See above. Delete(ct); --count; ct = NewString("swig_voidp"); add_typedef = false; if (is_hidden_pointer) { // A Go type that is really a pointer, like func, map, chan, // is being represented in C by a pointer. This is fine, // but we have to memcpy the type rather than simply // converting it. *c_struct_type = true; Setattr(n, "emit:cgotypestruct", type); } } if (Strncmp(gct, "bool ", 5) == 0) { // Change the C++ type bool to the C type _Bool. Replace(gct, "bool", "_Bool", DOH_REPLACE_FIRST); } if (Strncmp(gct, "intgo ", 6) == 0) { // We #define intgo to swig_intgo for the cgo comment. Replace(gct, "intgo", "swig_intgo", DOH_REPLACE_FIRST); } p = Strstr(gct, ct); if (p != NULL && p > (char*)Char(gct) && p[-1] == ' ' && p[Len(ct)] == '\0') { String *q = NewStringWithSize(gct, Len(gct) - Len(ct) - 1); if (validIdentifier(q)) { // This is a simple type name, and we can use it directly. Delete(ct); --count; ct = q; add_typedef = false; } } } if (add_typedef) { Printv(f_cgo_comment_typedefs, "typedef ", gct, ";\n", NULL); } Setattr(n, "emit:cgotype", ct); Delete(gct); return Copy(ct); } /* ---------------------------------------------------------------------- * goWrapperType() * * Given a type, return a string for the type to use for the wrapped * Go function. This function exists because for a C++ class we * need to convert interface and reference types. * ---------------------------------------------------------------------- */ String *goWrapperType(Node *n, SwigType *type, bool is_result) { bool is_interface; String *ret = goTypeWithInfo(n, type, true, &is_interface); // If this is an interface, we want to pass the real type. if (is_interface) { Delete(ret); if (!is_result) { ret = NewString("uintptr"); } else { SwigType *ty = SwigType_typedef_resolve_all(type); while (true) { if (SwigType_ispointer(ty)) { SwigType_del_pointer(ty); } else if (SwigType_isarray(ty)) { SwigType_del_array(ty); } else if (SwigType_isreference(ty)) { SwigType_del_reference(ty); } else if (SwigType_isqualifier(ty)) { SwigType_del_qualifier(ty); } else { break; } } assert(SwigType_issimple(ty)); String *p = goCPointerType(ty, true); Delete(ty); ret = p; } } return ret; } /* ---------------------------------------------------------------------- * goOverloadType() * * Given a type, return the Go type to use when dispatching of * overloaded functions. This is normally just the usual Go type. * However, for a C++ class, the usual Go type is an interface type. * And if that interface type represents a C++ type that SWIG does * not know about, then the interface type generated for any C++ * class will match that interface. So for that case, we match on * the underlying integer type. * * It has to work this way so that we can handle a derived type of a * %ignore'd type. It's unlikely that anybody will have a value of * an undefined type, but we support it because it worked in the * past. * ---------------------------------------------------------------------- */ String *goOverloadType(Node *n, SwigType *type) { SwigType *ty = SwigType_typedef_resolve_all(type); while (true) { if (SwigType_ispointer(ty)) { SwigType_del_pointer(ty); } else if (SwigType_isarray(ty)) { SwigType_del_array(ty); } else if (SwigType_isreference(ty)) { SwigType_del_reference(ty); } else if (SwigType_isqualifier(ty)) { SwigType_del_qualifier(ty); } else { break; } } if (Getattr(undefined_types, ty) && !Getattr(defined_types, ty)) { return goWrapperType(n, type, true); } return goType(n, type); } /* ---------------------------------------------------------------------- * goCPointerType() * * Return the name of the Go type to use for the C pointer value. * The regular C type is the name of an interface type which wraps a * pointer whose name is returned by this function. * ---------------------------------------------------------------------- */ String *goCPointerType(SwigType *type, bool add_to_hash) { SwigType *ty = SwigType_typedef_resolve_all(type); Node *cn = classLookup(ty); String *ex; String *ret; if (!cn) { if (add_to_hash) { Setattr(undefined_types, ty, ty); } ret = NewString("Swigcptr"); ex = exportedName(ty); Append(ret, ex); } else { String *cname = Getattr(cn, "sym:name"); if (!cname) { cname = Getattr(cn, "name"); } ex = exportedName(cname); Node *cnmod = Getattr(cn, "module"); if (!cnmod || Strcmp(Getattr(cnmod, "name"), module) == 0) { if (add_to_hash) { Setattr(undefined_types, ty, ty); } ret = NewString("Swigcptr"); Append(ret, ex); } else { ret = NewString(""); Printv(ret, getModuleName(Getattr(cnmod, "name")), ".Swigcptr", ex, NULL); } } Delete(ty); Delete(ex); return ret; } /* ---------------------------------------------------------------------- * gcCTypeForGoValue() * * Given a type, return the C/C++ type which will be used to catch * the value in Go. This is the 6g/8g version. * ---------------------------------------------------------------------- */ String *gcCTypeForGoValue(Node *n, SwigType *type, String *name) { bool is_interface; String *gt = goTypeWithInfo(n, type, true, &is_interface); String *tail = NewString(""); SwigType *t = SwigType_typedef_resolve_all(type); if (!SwigType_isreference(t)) { while (Strncmp(gt, "*", 1) == 0) { Replace(gt, "*", "", DOH_REPLACE_FIRST); Printv(tail, "*", NULL); } } Delete(t); bool is_string = Strcmp(gt, "string") == 0; bool is_slice = Strncmp(gt, "[]", 2) == 0; bool is_function = Strcmp(gt, "_swig_fnptr") == 0; bool is_member = Strcmp(gt, "_swig_memberptr") == 0; bool is_complex64 = Strcmp(gt, "complex64") == 0; bool is_complex128 = Strcmp(gt, "complex128") == 0; bool is_bool = false; bool is_int8 = false; bool is_int16 = false; bool is_int = Strcmp(gt, "int") == 0 || Strcmp(gt, "uint") == 0; bool is_int32 = false; bool is_int64 = false; bool is_float32 = false; bool is_float64 = false; bool has_typemap = (n != NULL && Getattr(n, "tmap:gotype") != NULL) || hasGoTypemap(n, type); if (has_typemap) { is_bool = Strcmp(gt, "bool") == 0; is_int8 = Strcmp(gt, "int8") == 0 || Strcmp(gt, "uint8") == 0 || Strcmp(gt, "byte") == 0; is_int16 = Strcmp(gt, "int16") == 0 || Strcmp(gt, "uint16") == 0; is_int32 = Strcmp(gt, "int32") == 0 || Strcmp(gt, "uint32") == 0; is_int64 = Strcmp(gt, "int64") == 0 || Strcmp(gt, "uint64") == 0; is_float32 = Strcmp(gt, "float32") == 0; is_float64 = Strcmp(gt, "float64") == 0; } Delete(gt); String *ret; if (is_string) { // Note that we don't turn a reference to a string into a // pointer to a string. Strings are immutable anyhow. ret = NewString(""); Printv(ret, "_gostring_", tail, " ", name, NULL); Delete(tail); return ret; } else if (is_slice) { // Slices are always passed as a _goslice_, whether or not references // are involved. ret = NewString(""); Printv(ret, "_goslice_", tail, " ", name, NULL); Delete(tail); return ret; } else if (is_function || is_member) { ret = NewString(""); Printv(ret, "void*", tail, " ", name, NULL); Delete(tail); return ret; } else if (is_complex64) { ret = NewString("_Complex float "); } else if (is_complex128) { ret = NewString("_Complex double "); } else if (is_interface) { SwigType *t = SwigType_typedef_resolve_all(type); if (SwigType_ispointer(t)) { SwigType_del_pointer(t); } if (SwigType_isreference(t)) { SwigType_del_reference(t); } SwigType_add_pointer(t); ret = SwigType_lstr(t, name); Delete(t); Delete(tail); return ret; } else { SwigType *t = SwigType_typedef_resolve_all(type); if (!has_typemap && SwigType_isreference(t)) { // A const reference to a known type, or to a pointer, is not // mapped to a pointer. SwigType_del_reference(t); if (SwigType_isqualifier(t)) { String *q = SwigType_parm(t); if (Strcmp(q, "const") == 0) { SwigType_del_qualifier(t); if (hasGoTypemap(n, t) || SwigType_ispointer(t)) { if (is_int) { ret = NewString("intgo "); Append(ret, name); } else if (is_int64) { ret = NewString("long long "); Append(ret, name); } else { ret = SwigType_lstr(t, name); } Delete(q); Delete(t); Delete(tail); return ret; } } Delete(q); } } if (Language::enumLookup(t) != NULL) { is_int = true; } else { SwigType *tstripped = SwigType_strip_qualifiers(t); if (SwigType_isenum(tstripped)) is_int = true; Delete(tstripped); } Delete(t); if (is_bool) { ret = NewString("bool "); } else if (is_int8) { ret = NewString("char "); } else if (is_int16) { ret = NewString("short "); } else if (is_int) { ret = NewString("intgo "); } else if (is_int32) { ret = NewString("int "); } else if (is_int64) { ret = NewString("long long "); } else if (is_float32) { ret = NewString("float "); } else if (is_float64) { ret = NewString("double "); } else { Delete(tail); return SwigType_lstr(type, name); } } Append(ret, tail); if (!has_typemap && SwigType_isreference(type)) { Append(ret, "* "); } Append(ret, name); Delete(tail); return ret; } /* ---------------------------------------------------------------------- * gccgoCTypeForGoValue() * * Given a type, return the C/C++ type which will be used to catch * the value in Go. This is the gccgo version. * ---------------------------------------------------------------------- */ String *gccgoCTypeForGoValue(Node *n, SwigType *type, String *name) { return gcCTypeForGoValue(n, type, name); } /* ---------------------------------------------------------------------- * goTypeIsInterface * * Return whether this C++ type is represented as an interface type * in Go. These types require adjustments in the Go code when * passing them back and forth between Go and C++. * ---------------------------------------------------------------------- */ bool goTypeIsInterface(Node *n, SwigType *type) { bool is_interface; Delete(goTypeWithInfo(n, type, false, &is_interface)); return is_interface; } /* ---------------------------------------------------------------------- * hasGoTypemap * * Return whether a type has a "gotype" typemap entry. * ---------------------------------------------------------------------- */ bool hasGoTypemap(Node *n, SwigType *type) { Parm *p = NewParm(type, "test", n); SwigType *tm = Swig_typemap_lookup("gotype", p, "", NULL); Delete(p); if (tm && Strstr(tm, "$gotypename") == 0) { Delete(tm); return true; } Delete(tm); return false; } /* ---------------------------------------------------------------------- * goEnumName() * * Given an enum node, return a string to use for the enum type in Go. * ---------------------------------------------------------------------- */ String *goEnumName(Node *n) { String *ret = Getattr(n, "go:enumname"); if (ret) { return Copy(ret); } if (Equal(Getattr(n, "type"), "enum ")) { return NewString("int"); } String *type = Getattr(n, "enumtype"); assert(type); char *p = Char(type); int len = Len(type); String *s = NewString(""); bool capitalize = true; for (int i = 0; i < len; ++i, ++p) { if (*p == ':') { ++i; ++p; assert(*p == ':'); capitalize = true; } else if (capitalize) { Putc(toupper(*p), s); capitalize = false; } else { Putc(*p, s); } } ret = Swig_name_mangle(s); Delete(s); return ret; } /* ---------------------------------------------------------------------- * getParm() * * Get the real parameter to use. * ---------------------------------------------------------------------- */ Parm *getParm(Parm *p) { while (p && checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } return p; } /* ---------------------------------------------------------------------- * nextParm() * * Return the next parameter. * ---------------------------------------------------------------------- */ Parm *nextParm(Parm *p) { if (!p) { return NULL; } else if (Getattr(p, "tmap:in")) { return Getattr(p, "tmap:in:next"); } else { return nextSibling(p); } } /* ---------------------------------------------------------------------- * isStatic * * Return whether a node should be considered as static rather than * as a member. * ---------------------------------------------------------------------- */ bool isStatic(Node *n) { String *storage = Getattr(n, "storage"); return (storage && (Swig_storage_isstatic(n) || Strcmp(storage, "friend") == 0) && (!SmartPointer || !Getattr(n, "allocate:smartpointeraccess"))); } /* ---------------------------------------------------------------------- * isFriend * * Return whether a node is a friend. * ---------------------------------------------------------------------- */ bool isFriend(Node *n) { String *storage = Getattr(n, "storage"); return storage && Strcmp(storage, "friend") == 0; } /* ---------------------------------------------------------------------- * goGetattr * * Fetch an attribute from a node but return NULL if it is the empty string. * ---------------------------------------------------------------------- */ Node *goGetattr(Node *n, const char *name) { Node *ret = Getattr(n, name); if (ret != NULL && Len(ret) == 0) { ret = NULL; } return ret; } /* ---------------------------------------------------------------------- * goTypemapLookup * * Look up a typemap but return NULL if it is the empty string. * ---------------------------------------------------------------------- */ String *goTypemapLookup(const char *name, Node *node, const char *lname) { String *ret = Swig_typemap_lookup(name, node, lname, NULL); if (ret != NULL && Len(ret) == 0) { ret = NULL; } return ret; } /* ---------------------------------------------------------------------- * getModuleName * * Return the name of a module. This is different from module path: * "some/path/to/module" -> "module". * ---------------------------------------------------------------------- */ String *getModuleName(String *module_path) { char *suffix = strrchr(Char(module_path), '/'); if (suffix == NULL) { return module_path; } return Str(suffix + 1); } }; /* class GO */ /* ----------------------------------------------------------------------------- * swig_go() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_go() { return new GO(); } extern "C" Language *swig_go(void) { return new_swig_go(); } /* ----------------------------------------------------------------------------- * Static member variables * ----------------------------------------------------------------------------- */ // Usage message. const char * const GO::usage = "\ Go Options (available with -go)\n\ -cgo - Generate cgo input files\n\ -no-cgo - Do not generate cgo input files\n\ -gccgo - Generate code for gccgo rather than gc\n\ -go-pkgpath

- Like gccgo -fgo-pkgpath option\n\ -go-prefix

- Like gccgo -fgo-prefix option\n\ -import-prefix

- Prefix to add to %import directives\n\ -intgosize - Set size of Go int type--32 or 64 bits\n\ -package - Set name of the Go package to \n\ -use-shlib - Force use of a shared library\n\ -soname - Set shared library holding C/C++ code to \n\ \n"; swig-4.0.2/Source/Modules/README0000644000175000017500000000047213667507523016115 0ustar williamwilliam06/25/2002 This directory contains all of the SWIG language modules. Many of these modules contain code that dates back to SWIG1.0. The module API has changed a lot in the development releases so this is fairly messy. We're working on cleaning it up, but you'll have to bear with us until it's done. -- Dave swig-4.0.2/Source/Modules/lang.cxx0000644000175000017500000036660713667507523016721 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * lang.cxx * * Language base class functions. Default C++ handling is also implemented here. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include /* default mode settings */ static int director_mode = 0; static int director_protected_mode = 1; static int all_protected_mode = 0; static int naturalvar_mode = 0; Language *Language::this_ = 0; /* Set director_protected_mode */ void Wrapper_director_mode_set(int flag) { director_mode = flag; } void Wrapper_director_protected_mode_set(int flag) { director_protected_mode = flag; } void Wrapper_all_protected_mode_set(int flag) { all_protected_mode = flag; } void Wrapper_naturalvar_mode_set(int flag) { naturalvar_mode = flag; } extern "C" { int Swig_director_mode() { return director_mode; } int Swig_director_protected_mode() { return director_protected_mode; } int Swig_all_protected_mode() { return all_protected_mode; } void Language_replace_special_variables(String *method, String *tm, Parm *parm) { Language::instance()->replaceSpecialVariables(method, tm, parm); } } /* Some status variables used during parsing */ static int InClass = 0; /* Parsing C++ or not */ static String *ClassName = 0; /* This is the real name of the current class */ static String *EnumClassName = 0; /* Enum class name */ static String *ClassPrefix = 0; /* Class prefix */ static String *EnumClassPrefix = 0; /* Prefix for strongly typed enums (including ClassPrefix) */ static String *NSpace = 0; /* Namespace for the nspace feature */ static String *ClassType = 0; /* Fully qualified type name to use */ static String *DirectorClassName = 0; /* Director name of the current class */ int Abstract = 0; int ImportMode = 0; int IsVirtual = 0; static String *AttributeFunctionGet = 0; static String *AttributeFunctionSet = 0; static Node *CurrentClass = 0; int line_number = 0; String *input_file = 0; int SmartPointer = 0; static Hash *classhash; extern int GenerateDefault; extern int ForceExtern; extern int AddExtern; /* import modes */ #define IMPORT_MODE 1 /* ---------------------------------------------------------------------- * Dispatcher::emit_one() * * Dispatch a single node * ---------------------------------------------------------------------- */ int Dispatcher::emit_one(Node *n) { int ret = SWIG_OK; char *tag = Char(nodeType(n)); if (!tag) { /* Printf(stderr,"SWIG: Fatal internal error. Malformed parse tree node!\n"); */ return SWIG_OK; } /* Do not proceed if marked with an error */ if (Getattr(n, "error")) return SWIG_OK; /* Look for warnings */ String *wrn = Getattr(n, "feature:warnfilter"); if (wrn) Swig_warnfilter(wrn, 1); /* ============================================================ * C/C++ parsing * ============================================================ */ if (strcmp(tag, "extern") == 0) { ret = externDeclaration(n); } else if (strcmp(tag, "cdecl") == 0) { ret = cDeclaration(n); } else if (strcmp(tag, "enum") == 0) { ret = enumDeclaration(n); } else if (strcmp(tag, "enumitem") == 0) { ret = enumvalueDeclaration(n); } else if (strcmp(tag, "enumforward") == 0) { ret = enumforwardDeclaration(n); } else if (strcmp(tag, "class") == 0) { ret = classDeclaration(n); } else if (strcmp(tag, "classforward") == 0) { ret = classforwardDeclaration(n); } else if (strcmp(tag, "constructor") == 0) { ret = constructorDeclaration(n); } else if (strcmp(tag, "destructor") == 0) { ret = destructorDeclaration(n); } else if (strcmp(tag, "access") == 0) { ret = accessDeclaration(n); } else if (strcmp(tag, "using") == 0) { ret = usingDeclaration(n); } else if (strcmp(tag, "namespace") == 0) { ret = namespaceDeclaration(n); } else if (strcmp(tag, "template") == 0) { ret = templateDeclaration(n); } else if (strcmp(tag, "lambda") == 0) { ret = lambdaDeclaration(n); } /* =============================================================== * SWIG directives * =============================================================== */ else if (strcmp(tag, "top") == 0) { ret = top(n); } else if (strcmp(tag, "extend") == 0) { ret = extendDirective(n); } else if (strcmp(tag, "apply") == 0) { ret = applyDirective(n); } else if (strcmp(tag, "clear") == 0) { ret = clearDirective(n); } else if (strcmp(tag, "constant") == 0) { ret = constantDirective(n); } else if (strcmp(tag, "fragment") == 0) { ret = fragmentDirective(n); } else if (strcmp(tag, "import") == 0) { ret = importDirective(n); } else if (strcmp(tag, "include") == 0) { ret = includeDirective(n); } else if (strcmp(tag, "insert") == 0) { ret = insertDirective(n); } else if (strcmp(tag, "module") == 0) { ret = moduleDirective(n); } else if (strcmp(tag, "native") == 0) { ret = nativeDirective(n); } else if (strcmp(tag, "pragma") == 0) { ret = pragmaDirective(n); } else if (strcmp(tag, "typemap") == 0) { ret = typemapDirective(n); } else if (strcmp(tag, "typemapcopy") == 0) { ret = typemapcopyDirective(n); } else if (strcmp(tag, "typemapitem") == 0) { ret = typemapitemDirective(n); } else if (strcmp(tag, "types") == 0) { ret = typesDirective(n); } else { Swig_error(input_file, line_number, "Unrecognized parse tree node type '%s'\n", tag); ret = SWIG_ERROR; } if (wrn) Swig_warnfilter(wrn, 0); return ret; } /* ---------------------------------------------------------------------- * Dispatcher::emit_children() * * Emit all children that match the given type. type = 0 means all types. * ---------------------------------------------------------------------- */ int Dispatcher::emit_children(Node *n) { Node *c; char *eo = Char(Getattr(n, "feature:emitonlychildren")); for (c = firstChild(n); c; c = nextSibling(c)) { if (eo) { const char *tag = Char(nodeType(c)); if (strcmp(tag, "cdecl") == 0) { if (checkAttribute(c, "storage", "typedef")) tag = "typedef"; } if (strstr(eo, tag) == 0) { continue; } } emit_one(c); } return SWIG_OK; } /* Stubs for dispatcher class. We don't do anything by default---up to derived class to fill in traversal code */ int Dispatcher::defaultHandler(Node *) { return SWIG_OK; } int Dispatcher::extendDirective(Node *n) { return defaultHandler(n); } int Dispatcher::applyDirective(Node *n) { return defaultHandler(n); } int Dispatcher::clearDirective(Node *n) { return defaultHandler(n); } int Dispatcher::constantDirective(Node *n) { return defaultHandler(n); } int Dispatcher::fragmentDirective(Node *n) { return defaultHandler(n); } int Dispatcher::importDirective(Node *n) { return defaultHandler(n); } int Dispatcher::includeDirective(Node *n) { return defaultHandler(n); } int Dispatcher::insertDirective(Node *n) { return defaultHandler(n); } int Dispatcher::moduleDirective(Node *n) { return defaultHandler(n); } int Dispatcher::nativeDirective(Node *n) { return defaultHandler(n); } int Dispatcher::pragmaDirective(Node *n) { return defaultHandler(n); } int Dispatcher::typemapDirective(Node *n) { return defaultHandler(n); } int Dispatcher::typemapitemDirective(Node *n) { return defaultHandler(n); } int Dispatcher::typemapcopyDirective(Node *n) { return defaultHandler(n); } int Dispatcher::typesDirective(Node *n) { return defaultHandler(n); } int Dispatcher::cDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::externDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::enumDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::enumvalueDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::enumforwardDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::classDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::templateDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::lambdaDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::classforwardDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::constructorDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::destructorDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::accessDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::usingDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::namespaceDeclaration(Node *n) { return defaultHandler(n); } /* Allocators */ Language::Language(): none_comparison(NewString("$arg != 0")), director_ctor_code(NewString("")), director_prot_ctor_code(0), symtabs(NewHash()), overloading(0), multiinput(0), cplus_runtime(0), directors(0) { symbolAddScope(""); // create top level/global symbol table scope argc_template_string = NewString("argc"); argv_template_string = NewString("argv[%d]"); /* Default director constructor code, passed to Swig_ConstructorToFunction */ Printv(director_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " $nondirector_new \n", "}\n", NIL); /* Default director 'protected' constructor code, disabled by default. Each language that needs it, has to define it. */ director_prot_ctor_code = 0; director_multiple_inheritance = 1; director_language = 0; assert(!this_); this_ = this; doxygenTranslator = NULL; } Language::~Language() { Delete(symtabs); Delete(director_ctor_code); Delete(none_comparison); this_ = 0; } /* ----------------------------------------------------------------------------- * directorClassName() * ----------------------------------------------------------------------------- */ String *Language::directorClassName(Node *n) { String *dirclassname; String *nspace = NewString(Getattr(n, "sym:nspace")); const char *attrib = "director:classname"; String *classname = getClassPrefix(); Replace(nspace, NSPACE_SEPARATOR, "_", DOH_REPLACE_ANY); if (Len(nspace) > 0) dirclassname = NewStringf("SwigDirector_%s_%s", nspace, classname); else dirclassname = NewStringf("SwigDirector_%s", classname); Setattr(n, attrib, dirclassname); Delete(nspace); return dirclassname; } /* ---------------------------------------------------------------------- emit_one() ---------------------------------------------------------------------- */ int Language::emit_one(Node *n) { int ret; int oldext; if (!n) return SWIG_OK; if (GetFlag(n, "feature:ignore") && !Getattr(n, "feature:onlychildren")) return SWIG_OK; oldext = Extend; if (Getattr(n, "feature:extend")) Extend = 1; line_number = Getline(n); input_file = Getfile(n); /* symtab = Getattr(n,"symtab"); if (symtab) { symtab = Swig_symbol_setscope(symtab); } */ ret = Dispatcher::emit_one(n); /* if (symtab) { Swig_symbol_setscope(symtab); } */ Extend = oldext; return ret; } static Parm *nonvoid_parms(Parm *p) { if (p) { SwigType *t = Getattr(p, "type"); if (SwigType_type(t) == T_VOID) return 0; } return p; } /* ----------------------------------------------------------------------------- * cplus_value_type() * * Returns the alternative value type needed in C++ for class value * types. When swig is not sure about using a plain $ltype value, * since the class doesn't have a default constructor, or it can't be * assigned, you will get back 'SwigValueWrapper'. * * ----------------------------------------------------------------------------- */ SwigType *cplus_value_type(SwigType *t) { return SwigType_alttype(t, 0); } static Node *first_nontemplate(Node *n) { while (n) { if (Strcmp(nodeType(n), "template") != 0) return n; n = Getattr(n, "sym:nextSibling"); } return n; } /* -------------------------------------------------------------------------- * swig_pragma() * * Handle swig pragma directives. * -------------------------------------------------------------------------- */ void swig_pragma(char *lang, char *name, char *value) { if (strcmp(lang, "swig") == 0) { if ((strcmp(name, "make_default") == 0) || ((strcmp(name, "makedefault") == 0))) { GenerateDefault = 1; } else if ((strcmp(name, "no_default") == 0) || ((strcmp(name, "nodefault") == 0))) { Swig_warning(WARN_DEPRECATED_NODEFAULT, "SWIG", 1, "dangerous, use %%nodefaultctor, %%nodefaultdtor instead.\n"); GenerateDefault = 0; } else if (strcmp(name, "attributefunction") == 0) { String *nvalue = NewString(value); char *s = strchr(Char(nvalue), ':'); if (!s) { Swig_error(input_file, line_number, "Bad value for attributefunction. Expected \"fmtget:fmtset\".\n"); } else { *s = 0; AttributeFunctionGet = NewString(Char(nvalue)); AttributeFunctionSet = NewString(s + 1); } Delete(nvalue); } else if (strcmp(name, "noattributefunction") == 0) { AttributeFunctionGet = 0; AttributeFunctionSet = 0; } } } /* -------------------------------------------------------------------------- * Language::use_naturalvar_mode() * * Determine whether to use const ref typemaps instead of pointer typemaps * for variable access. * -------------------------------------------------------------------------- */ int Language::use_naturalvar_mode(Node *n) const { if (Getattr(n, "unnamed")) return 0; // The naturalvar feature can be attached to either the variable name or the variable's type // naturalvar on the variable name is more specific and overrides naturalvar on the variable's type String *naturalvar = Getattr(n, "feature:naturalvar"); bool explicitly_off = naturalvar && Strcmp(naturalvar, "0") == 0; int nvar = GetFlag(n, "feature:naturalvar"); if (!explicitly_off && !nvar) { /* look for feature in the class */ SwigType *ty = Getattr(n, "type"); SwigType *fullty = SwigType_typedef_resolve_all(ty); if (SwigType_isclass(fullty)) { SwigType *tys = SwigType_strip_qualifiers(fullty); if (!CPlusPlus) { Replaceall(tys, "struct ", ""); Replaceall(tys, "union ", ""); Replaceall(tys, "class ", ""); } Node *typenode = Swig_symbol_clookup(tys, 0); if (typenode) { naturalvar = Getattr(typenode, "feature:naturalvar"); explicitly_off = naturalvar && Strcmp(naturalvar, "0") == 0; nvar = nvar || GetFlag(typenode, "feature:naturalvar"); } Delete(tys); } Delete(fullty); } nvar = nvar || naturalvar_mode; return explicitly_off ? 0 : nvar ? CWRAP_NATURAL_VAR : 0; } /* ---------------------------------------------------------------------- * Language::top() - Top of parsing tree * ---------------------------------------------------------------------- */ int Language::top(Node *n) { Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options) { if (Getattr(options, "naturalvar")) { naturalvar_mode = 1; } } } classhash = Getattr(n, "classes"); return emit_children(n); } /* ---------------------------------------------------------------------- * Language::extendDirective() * ---------------------------------------------------------------------- */ int Language::extendDirective(Node *n) { save_value oldam(Extend, CWRAP_EXTEND); save_value oldmode(cplus_mode, PUBLIC); emit_children(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::applyDirective() * ---------------------------------------------------------------------- */ int Language::applyDirective(Node *n) { Parm *pattern = Getattr(n, "pattern"); Node *c = firstChild(n); while (c) { Parm *apattern = Getattr(c, "pattern"); if (ParmList_len(pattern) != ParmList_len(apattern)) { Swig_error(input_file, line_number, "Can't apply (%s) to (%s). Number of arguments don't match.\n", ParmList_str(pattern), ParmList_str(apattern)); } else { if (!Swig_typemap_apply(pattern, apattern)) { Swig_warning(WARN_TYPEMAP_APPLY_UNDEF, input_file, line_number, "Can't apply (%s). No typemaps are defined.\n", ParmList_str(pattern)); } } c = nextSibling(c); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::clearDirective() * ---------------------------------------------------------------------- */ int Language::clearDirective(Node *n) { Node *p; for (p = firstChild(n); p; p = nextSibling(p)) { ParmList *pattern = Getattr(p, "pattern"); Swig_typemap_clear_apply(pattern); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::constantDirective() * ---------------------------------------------------------------------- */ int Language::constantDirective(Node *n) { if (CurrentClass && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; if (!GetFlag(n, "feature:allowexcept")) { UnsetFlag(n, "feature:except"); } if (Getattr(n, "feature:exceptvar")) { Setattr(n, "feature:except", Getattr(n, "feature:exceptvar")); } if (!ImportMode) { Swig_require("constantDirective", n, "name", "?value", NIL); String *name = Getattr(n, "name"); String *value = Getattr(n, "value"); if (!value) { value = Copy(name); } else { /* if (checkAttribute(n,"type","char")) { value = NewString(value); } else { value = NewStringf("%(escape)s", value); } */ Setattr(n, "rawvalue", value); value = NewStringf("%(escape)s", value); if (!Len(value)) Append(value, "\\0"); /* Printf(stdout,"'%s' = '%s'\n", name, value); */ } Setattr(n, "value", value); this->constantWrapper(n); Swig_restore(n); return SWIG_OK; } return SWIG_NOWRAP; } /* ---------------------------------------------------------------------- * Language::fragmentDirective() * ---------------------------------------------------------------------- */ int Language::fragmentDirective(Node *n) { if (!(Getattr(n, "emitonly") && ImportMode)) Swig_fragment_register(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::importDirective() * ---------------------------------------------------------------------- */ int Language::importDirective(Node *n) { int oldim = ImportMode; ImportMode = IMPORT_MODE; emit_children(n); ImportMode = oldim; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::includeDirective() * ---------------------------------------------------------------------- */ int Language::includeDirective(Node *n) { emit_children(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::insertDirective() * ---------------------------------------------------------------------- */ int Language::insertDirective(Node *n) { /* %insert directive */ if ((!ImportMode) || Getattr(n, "generated")) { String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); File *f = 0; if (!section) { /* %{ ... %} */ f = Swig_filebyname("header"); } else { f = Swig_filebyname(section); } if (f) { Printf(f, "%s\n", code); } else { Swig_error(input_file, line_number, "Unknown target '%s' for %%insert directive.\n", section); } return SWIG_OK; } else { return SWIG_NOWRAP; } } /* ---------------------------------------------------------------------- * Language::moduleDirective() * ---------------------------------------------------------------------- */ int Language::moduleDirective(Node *n) { (void) n; /* %module directive */ return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::nativeDirective() * ---------------------------------------------------------------------- */ int Language::nativeDirective(Node *n) { if (!ImportMode) { return nativeWrapper(n); } else { return SWIG_NOWRAP; } } /* ---------------------------------------------------------------------- * Language::pragmaDirective() * ---------------------------------------------------------------------- */ int Language::pragmaDirective(Node *n) { /* %pragma directive */ if (!ImportMode) { String *lan = Getattr(n, "lang"); String *name = Getattr(n, "name"); String *value = Getattr(n, "value"); swig_pragma(Char(lan), Char(name), Char(value)); /* pragma(Char(lan),Char(name),Char(value)); */ return SWIG_OK; } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::typemapDirective() * ---------------------------------------------------------------------- */ int Language::typemapDirective(Node *n) { /* %typemap directive */ String *method = Getattr(n, "method"); String *code = Getattr(n, "code"); Parm *kwargs = Getattr(n, "kwargs"); Node *items = firstChild(n); static int namewarn = 0; if (code && (Strstr(code, "$source") || (Strstr(code, "$target")))) { Swig_warning(WARN_TYPEMAP_SOURCETARGET, Getfile(n), Getline(n), "Deprecated typemap feature ($source/$target).\n"); if (!namewarn) { Swig_warning(WARN_TYPEMAP_SOURCETARGET, Getfile(n), Getline(n), "The use of $source and $target in a typemap declaration is deprecated.\n\ For typemaps related to argument input (in,ignore,default,arginit,check), replace\n\ $source by $input and $target by $1. For typemaps related to return values (out,\n\ argout,ret,except), replace $source by $1 and $target by $result. See the file\n\ Doc/Manual/Typemaps.html for complete details.\n"); namewarn = 1; } } if (Strcmp(method, "except") == 0) { Swig_warning(WARN_DEPRECATED_EXCEPT_TM, Getfile(n), Getline(n), "%%typemap(except) is deprecated. Use the %%exception directive.\n"); } if (Strcmp(method, "in") == 0) { Hash *k; k = kwargs; while (k) { if (checkAttribute(k, "name", "numinputs")) { if (!multiinput && (GetInt(k, "value") > 1)) { Swig_error(Getfile(n), Getline(n), "Multiple-input typemaps (numinputs > 1) not supported by this target language module.\n"); return SWIG_ERROR; } break; } k = nextSibling(k); } if (!k) { k = NewHash(); Setattr(k, "name", "numinputs"); Setattr(k, "value", "1"); set_nextSibling(k, kwargs); Setattr(n, "kwargs", k); kwargs = k; } } if (Strcmp(method, "ignore") == 0) { Swig_warning(WARN_DEPRECATED_IGNORE_TM, Getfile(n), Getline(n), "%%typemap(ignore) has been replaced by %%typemap(in,numinputs=0).\n"); Clear(method); Append(method, "in"); Hash *k = NewHash(); Setattr(k, "name", "numinputs"); Setattr(k, "value", "0"); set_nextSibling(k, kwargs); Setattr(n, "kwargs", k); kwargs = k; } /* Replace $descriptor() macros */ if (code) { Setfile(code, Getfile(n)); Setline(code, Getline(n)); Swig_cparse_replace_descriptor(code); } while (items) { Parm *pattern = Getattr(items, "pattern"); Parm *parms = Getattr(items, "parms"); if (code) { Swig_typemap_register(method, pattern, code, parms, kwargs); } else { Swig_typemap_clear(method, pattern); } items = nextSibling(items); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::typemapcopyDirective() * ---------------------------------------------------------------------- */ int Language::typemapcopyDirective(Node *n) { String *method = Getattr(n, "method"); Parm *pattern = Getattr(n, "pattern"); Node *items = firstChild(n); int nsrc = 0; nsrc = ParmList_len(pattern); while (items) { ParmList *npattern = Getattr(items, "pattern"); if (nsrc != ParmList_len(npattern)) { Swig_error(input_file, line_number, "Can't copy typemap. Number of types differ.\n"); } else { if (Swig_typemap_copy(method, pattern, npattern) < 0) { Swig_error(input_file, line_number, "Can't copy typemap (%s) %s = %s\n", method, ParmList_str(pattern), ParmList_str(npattern)); } } items = nextSibling(items); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::typesDirective() * ---------------------------------------------------------------------- */ int Language::typesDirective(Node *n) { Parm *parms = Getattr(n, "parms"); String *convcode = Getattr(n, "convcode"); /* optional user supplied conversion code for custom casting */ while (parms) { SwigType *t = Getattr(parms, "type"); String *v = Getattr(parms, "value"); if (!v) { SwigType_remember(t); } else { if (SwigType_issimple(t)) { SwigType_inherit(t, v, 0, convcode); } } parms = nextSibling(parms); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::cDeclaration() * ---------------------------------------------------------------------- */ int Language::cDeclaration(Node *n) { String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); SwigType *decl = Getattr(n, "decl"); String *storage = Getattr(n, "storage"); Node *over; File *f_header = 0; SwigType *ty, *fullty; if (Getattr(n, "feature:onlychildren")) { if (GetFlag(n, "feature:ignore")) { return SWIG_NOWRAP; } else { // Found an unignored templated method that has an empty template instantiation (%template()) // Ignore it unless it has been %rename'd if (Strncmp(symname, "__dummy_", 8) == 0 && Cmp(storage, "typedef") != 0) { SetFlag(n, "feature:ignore"); Swig_warning(WARN_LANG_TEMPLATE_METHOD_IGNORE, input_file, line_number, "%%template() contains no name. Template method ignored: %s\n", Swig_name_decl(n)); return SWIG_NOWRAP; } } } /* discards nodes following the access control rules */ if (cplus_mode != PUBLIC || !is_public(n)) { /* except for friends, they are not affected by access control */ int isfriend = Cmp(storage, "friend") == 0; if (!isfriend) { /* Check what the director needs. If the method is pure virtual, it is always needed. * Also wrap non-virtual protected members if asked for (allprotected mode). */ if (!(directorsEnabled() && ((is_member_director(CurrentClass, n) && need_nonpublic_member(n)) || isNonVirtualProtectedAccess(n)))) { return SWIG_NOWRAP; } // Prevent wrapping protected overloaded director methods more than once - // This bit of code is only needed due to the cDeclaration call in classHandler() String *wrapname = NewStringf("nonpublic_%s%s", symname, Getattr(n, "sym:overname")); if (Getattr(CurrentClass, wrapname)) { Delete(wrapname); return SWIG_NOWRAP; } SetFlag(CurrentClass, wrapname); Delete(wrapname); } } if (Cmp(storage, "typedef") == 0) { Swig_save("cDeclaration", n, "type", NIL); SwigType *t = Copy(type); if (t) { SwigType_push(t, decl); Setattr(n, "type", t); typedefHandler(n); } Swig_restore(n); return SWIG_OK; } /* If in import mode, we proceed no further */ if (ImportMode) return SWIG_NOWRAP; /* If we're in extend mode and there is code, replace the $descriptor macros */ if (Extend) { String *code = Getattr(n, "code"); if (code) { Setfile(code, Getfile(n)); Setline(code, Getline(n)); Swig_cparse_replace_descriptor(code); } } /* Overloaded symbol check */ over = Swig_symbol_isoverloaded(n); if (!overloading) { if (over) over = first_nontemplate(over); if (over && (over != n)) { Swig_warning(WARN_LANG_OVERLOAD_DECL, input_file, line_number, "Overloaded declaration ignored. %s\n", Swig_name_decl(n)); Swig_warning(WARN_LANG_OVERLOAD_DECL, Getfile(over), Getline(over), "Previous declaration is %s\n", Swig_name_decl(over)); return SWIG_NOWRAP; } } if (!validIdentifier(symname)) { Swig_warning(WARN_LANG_IDENTIFIER, input_file, line_number, "Can't wrap '%s' unless renamed to a valid identifier.\n", SwigType_namestr(symname)); return SWIG_NOWRAP; } ty = NewString(type); SwigType_push(ty, decl); fullty = SwigType_typedef_resolve_all(ty); if (SwigType_isfunction(fullty)) { if (!SwigType_isfunction(ty)) { Delete(ty); ty = fullty; fullty = 0; ParmList *parms = SwigType_function_parms(ty, n); Setattr(n, "parms", parms); } /* Transform the node into a 'function' node and emit */ if (!CurrentClass) { f_header = Swig_filebyname("header"); if (AddExtern) { if (f_header) { if (Swig_storage_isextern(n) || (ForceExtern && !storage)) { /* we don't need the 'extern' part in the C/C++ declaration, and it produces some problems when namespace and SUN Studio is used. Printf(f_header,"extern %s", SwigType_str(ty,name)); In fact generating extern declarations is quite error prone and is no longer the default. Getting it right seems impossible with namespaces and default arguments and when a method is declared with the various Windows calling conventions - SWIG doesn't understand Windows (non standard) calling conventions in the first place, so can't regenerate them. */ String *str = SwigType_str(ty, name); Printf(f_header, "%s", str); Delete(str); { DOH *t = Getattr(n, "throws"); if (t) { Printf(f_header, " throw("); while (t) { Printf(f_header, "%s", Getattr(t, "type")); t = nextSibling(t); if (t) Printf(f_header, ","); } Printf(f_header, ")"); } } Printf(f_header, ";\n"); } else if (Swig_storage_isexternc(n)) { /* here 'extern "C"' is needed */ String *str = SwigType_str(ty, name); Printf(f_header, "extern \"C\" %s;\n", str); Delete(str); } } } } /* This needs to check qualifiers */ if (SwigType_isqualifier(ty)) { SwigType *qual = SwigType_pop(ty); Setattr(n, "qualifier", qual); Delete(qual); } Delete(SwigType_pop_function(ty)); DohIncref(type); Setattr(n, "type", ty); functionHandler(n); Setattr(n, "type", type); Delete(ty); Delete(type); return SWIG_OK; } else { /* Some kind of variable declaration */ String *declaration = Copy(decl); Delattr(n, "decl"); if (!CurrentClass) { if (Swig_storage_isextern(n) || ForceExtern) { if (AddExtern) { f_header = Swig_filebyname("header"); if (f_header) { String *str = SwigType_str(ty, name); Printf(f_header, "%s %s;\n", Getattr(n, "storage"), str); Delete(str); } } } } if (!SwigType_ismutable(ty)) { SetFlag(n, "feature:immutable"); } /* If an array and elements are const, then read-only */ if (SwigType_isarray(ty)) { SwigType *tya = SwigType_array_type(ty); if (SwigType_isconst(tya)) { SetFlag(n, "feature:immutable"); } Delete(tya); } DohIncref(type); Setattr(n, "type", ty); variableHandler(n); Setattr(n, "type", type); Setattr(n, "decl", declaration); Delete(ty); Delete(type); Delete(fullty); return SWIG_OK; } } /* ---------------------------------------------------------------------- * Language::functionHandler() * ---------------------------------------------------------------------- */ int Language::functionHandler(Node *n) { String *storage = Getattr(n, "storage"); int isfriend = CurrentClass && Cmp(storage, "friend") == 0; int isstatic = CurrentClass && Swig_storage_isstatic(n) && !(SmartPointer && Getattr(n, "allocate:smartpointeraccess")); Parm *p = Getattr(n, "parms"); if (GetFlag(n, "feature:del")) { /* the method acts like a delete operator, ie, we need to disown the parameter */ if (CurrentClass && !isstatic && !isfriend) { SetFlag(n, "feature:self:disown"); } else { if (p) SetFlag(p, "wrap:disown"); } } if (!CurrentClass) { globalfunctionHandler(n); } else { if (isstatic) { staticmemberfunctionHandler(n); } else if (isfriend) { int oldInClass = InClass; InClass = 0; globalfunctionHandler(n); InClass = oldInClass; } else { // This is a member function, set a flag so the documentation type is correct SetFlag(n, "memberfunction"); Node *explicit_n = 0; if (directorsEnabled() && is_member_director(CurrentClass, n) && !extraDirectorProtectedCPPMethodsRequired()) { bool virtual_but_not_pure_virtual = (!(Cmp(storage, "virtual")) && (Cmp(Getattr(n, "value"), "0") != 0)); if (virtual_but_not_pure_virtual) { // Add additional wrapper which makes an explicit call to the virtual method (ie not a virtual call) explicit_n = Copy(n); String *new_symname = Copy(Getattr(n, "sym:name")); String *suffix = Getattr(parentNode(n), "sym:name"); Printv(new_symname, "SwigExplicit", suffix, NIL); Setattr(explicit_n, "sym:name", new_symname); Delattr(explicit_n, "storage"); Delattr(explicit_n, "override"); Delattr(explicit_n, "hides"); SetFlag(explicit_n, "explicitcall"); Setattr(n, "explicitcallnode", explicit_n); } } memberfunctionHandler(n); if (explicit_n) { memberfunctionHandler(explicit_n); Delattr(explicit_n, "explicitcall"); Delete(explicit_n); } } } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::globalfunctionHandler() * ---------------------------------------------------------------------- */ int Language::globalfunctionHandler(Node *n) { Swig_require("globalfunctionHandler", n, "name", "sym:name", "type", "?parms", NIL); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); ParmList *parms = Getattr(n, "parms"); /* Check for callback mode */ String *cb = GetFlagAttr(n, "feature:callback"); if (cb) { String *cbname = Getattr(n, "feature:callback:name"); if (!cbname) { cbname = NewStringf(cb, symname); Setattr(n, "feature:callback:name", cbname); } callbackfunctionHandler(n); if (Cmp(cbname, symname) == 0) { Delete(cbname); Swig_restore(n); return SWIG_NOWRAP; } Delete(cbname); } Setattr(n, "parms", nonvoid_parms(parms)); String *extendname = Getattr(n, "extendname"); String *call = Swig_cfunction_call(extendname ? extendname : name, parms); String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); functionWrapper(n); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::callbackfunctionHandler() * ---------------------------------------------------------------------- */ int Language::callbackfunctionHandler(Node *n) { Swig_require("callbackfunctionHandler", n, "name", "*sym:name", "*type", "?value", NIL); String *type = Getattr(n, "type"); String *name = Getattr(n, "name"); String *parms = Getattr(n, "parms"); String *cbname = Getattr(n, "feature:callback:name"); String *calltype = NewStringf("(%s (*)(%s))(%s)", SwigType_str(type, 0), ParmList_str(parms), SwigType_namestr(name)); SwigType *cbty = Copy(type); SwigType_add_function(cbty, parms); SwigType_add_pointer(cbty); Setattr(n, "sym:name", cbname); Setattr(n, "type", cbty); Setattr(n, "value", calltype); Node *ns = symbolLookup(cbname); if (!ns) constantWrapper(n); Delete(cbty); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::memberfunctionHandler() * ---------------------------------------------------------------------- */ int Language::memberfunctionHandler(Node *n) { Swig_require("memberfunctionHandler", n, "*name", "*sym:name", "*type", "?parms", "?value", NIL); String *storage = Getattr(n, "storage"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); ParmList *parms = Getattr(n, "parms"); String *cb = GetFlagAttr(n, "feature:callback"); if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { IsVirtual = PURE_VIRTUAL; } else { IsVirtual = PLAIN_VIRTUAL; } } else { IsVirtual = 0; } if (cb) { Node *cbn = NewHash(); String *cbname = Getattr(n, "feature:callback:name"); if (!cbname) { cbname = NewStringf(cb, symname); } SwigType *cbty = Copy(type); SwigType_add_function(cbty, parms); SwigType_add_memberpointer(cbty, ClassName); String *cbvalue = NewStringf("&%s::%s", ClassName, name); Setattr(cbn, "sym:name", cbname); Setattr(cbn, "type", cbty); Setattr(cbn, "value", cbvalue); Setattr(cbn, "name", name); Setfile(cbn, Getfile(n)); Setline(cbn, Getline(n)); memberconstantHandler(cbn); Setattr(n, "feature:callback:name", Swig_name_member(NSpace, ClassPrefix, cbname)); Delete(cb); Delete(cbn); Delete(cbvalue); Delete(cbty); Delete(cbname); if (Cmp(cbname, symname) == 0) { Swig_restore(n); return SWIG_NOWRAP; } } String *fname = Swig_name_member(NSpace, ClassPrefix, symname); if (Extend && SmartPointer) { if (!Getattr(n, "extendsmartclassname")) { Setattr(n, "extendsmartclassname", Getattr(CurrentClass, "allocate:smartpointerpointeeclassname")); } } // Set up the type for the cast to this class for use when wrapping const director (virtual) methods. // Note: protected director methods or when allprotected mode turned on. String *director_type = 0; if (!is_public(n) && (is_member_director(CurrentClass, n) || GetFlag(n, "explicitcall") || isNonVirtualProtectedAccess(n))) { director_type = Copy(DirectorClassName); String *qualifier = Getattr(n, "qualifier"); if (qualifier) SwigType_push(director_type, qualifier); SwigType_add_pointer(director_type); } int DirectorExtraCall = 0; if (directorsEnabled() && is_member_director(CurrentClass, n) && !SmartPointer) if (extraDirectorProtectedCPPMethodsRequired()) DirectorExtraCall = CWRAP_DIRECTOR_TWO_CALLS; if (GetFlag(n, "explicitcall")) DirectorExtraCall = CWRAP_DIRECTOR_ONE_CALL; int extendmember = GetFlag(n, "isextendmember") ? Extend : 0; int flags = Getattr(n, "template") ? extendmember | SmartPointer : Extend | SmartPointer | DirectorExtraCall; Swig_MethodToFunction(n, NSpace, ClassType, flags, director_type, is_member_director(CurrentClass, n)); Setattr(n, "sym:name", fname); /* Explicitly save low-level and high-level documentation names */ Setattr(n, "doc:low:name", fname); Setattr(n, "doc:high:name", symname); functionWrapper(n); Delete(director_type); Delete(fname); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::staticmemberfunctionHandler() * ---------------------------------------------------------------------- */ int Language::staticmemberfunctionHandler(Node *n) { Swig_require("staticmemberfunctionHandler", n, "*name", "*sym:name", "*type", NIL); Swig_save("staticmemberfunctionHandler", n, "storage", NIL); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); ParmList *parms = Getattr(n, "parms"); String *cb = GetFlagAttr(n, "feature:callback"); String *cname, *mrename; if (!Extend) { Node *sb = Getattr(n, "cplus:staticbase"); String *sname = Getattr(sb, "name"); if (isNonVirtualProtectedAccess(n)) cname = NewStringf("%s::%s", DirectorClassName, name); else cname = NewStringf("%s::%s", sname, name); } else { String *mname = Swig_name_mangle(ClassName); cname = Swig_name_member(NSpace, mname, name); Delete(mname); } mrename = Swig_name_member(NSpace, ClassPrefix, symname); if (Extend) { String *code = Getattr(n, "code"); String *defaultargs = Getattr(n, "defaultargs"); String *mangled = Swig_name_mangle(mrename); Delete(mrename); mrename = mangled; if (Getattr(n, "sym:overloaded") && code) { Append(cname, Getattr(defaultargs ? defaultargs : n, "sym:overname")); } if (!defaultargs && code) { /* Hmmm. An added static member. We have to create a little wrapper for this */ String *mangled_cname = Swig_name_mangle(cname); Swig_add_extension_code(n, mangled_cname, parms, type, code, CPlusPlus, 0); Setattr(n, "extendname", mangled_cname); Delete(mangled_cname); } } Setattr(n, "name", cname); Setattr(n, "sym:name", mrename); /* Explicitly save low-level and high-level documentation names */ Setattr(n, "doc:low:name", mrename); Setattr(n, "doc:high:name", symname); if (cb) { String *cbname = NewStringf(cb, symname); Setattr(n, "feature:callback:name", Swig_name_member(NSpace, ClassPrefix, cbname)); Setattr(n, "feature:callback:staticname", name); } Delattr(n, "storage"); globalfunctionHandler(n); Delete(cname); Delete(mrename); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::variableHandler() * ---------------------------------------------------------------------- */ int Language::variableHandler(Node *n) { /* If not a smart-pointer access or added method. We clear feature:except. There is no way C++ or C would throw an exception merely for accessing a member data. Caveat: Some compilers seem to route attribute access through methods which can generate exceptions. The feature:allowexcept allows this. Also, the feature:exceptvar can be used to match only variables. */ if (!(Extend | SmartPointer)) { if (!GetFlag(n, "feature:allowexcept")) { UnsetFlag(n, "feature:except"); } if (Getattr(n, "feature:exceptvar")) { Setattr(n, "feature:except", Getattr(n, "feature:exceptvar")); } } if (!CurrentClass) { globalvariableHandler(n); } else { Swig_save("variableHandler", n, "feature:immutable", NIL); if (SmartPointer) { /* If a smart-pointer and it's a constant access, we have to set immutable */ if (!Getattr(CurrentClass, "allocate:smartpointermutable")) { SetFlag(n, "feature:immutable"); } } if (Swig_storage_isstatic(n) && !(SmartPointer && Getattr(n, "allocate:smartpointeraccess"))) { staticmembervariableHandler(n); } else { membervariableHandler(n); } Swig_restore(n); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::globalvariableHandler() * ---------------------------------------------------------------------- */ int Language::globalvariableHandler(Node *n) { variableWrapper(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::membervariableHandler() * ---------------------------------------------------------------------- */ int Language::membervariableHandler(Node *n) { Swig_require("membervariableHandler", n, "*name", "*sym:name", "*type", NIL); Swig_save("membervariableHandler", n, "parms", NIL); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); if (!AttributeFunctionGet) { String *mname = Swig_name_member(0, ClassPrefix, symname); String *mrename_get = Swig_name_get(NSpace, mname); String *mrename_set = Swig_name_set(NSpace, mname); Delete(mname); /* Create a function to set the value of the variable */ int assignable = is_assignable(n); if (SmartPointer) { if (!Getattr(CurrentClass, "allocate:smartpointermutable")) { assignable = 0; } } if (assignable) { int make_set_wrapper = 1; String *tm = 0; String *target = 0; if (!Extend) { if (SmartPointer) { if (Swig_storage_isstatic(n)) { Node *sn = Getattr(n, "cplus:staticbase"); String *base = Getattr(sn, "name"); target = NewStringf("%s::%s", base, name); } else { String *pname = Swig_cparm_name(0, 0); target = NewStringf("(*%s)->%s", pname, name); Delete(pname); } } else { String *pname = isNonVirtualProtectedAccess(n) ? NewString("darg") : Swig_cparm_name(0, 0); target = NewStringf("%s->%s", pname, name); Delete(pname); } // This is an input type typemap lookup and so it should not use Node n // otherwise qualification is done on the parameter name for the setter function Parm *nin = NewParm(type, name, n); tm = Swig_typemap_lookup("memberin", nin, target, 0); Delete(nin); } int flags = Extend | SmartPointer | use_naturalvar_mode(n); if (isNonVirtualProtectedAccess(n)) flags = flags | CWRAP_ALL_PROTECTED_ACCESS; Swig_MembersetToFunction(n, ClassType, flags); Setattr(n, "memberset", "1"); if (!Extend) { /* Check for a member in typemap here */ if (!tm) { if (SwigType_isarray(type)) { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(type, 0)); make_set_wrapper = 0; } } else { String *pname0 = Swig_cparm_name(0, 0); String *pname1 = Swig_cparm_name(0, 1); Replace(tm, "$source", pname1, DOH_REPLACE_ANY); Replace(tm, "$target", target, DOH_REPLACE_ANY); Replace(tm, "$input", pname1, DOH_REPLACE_ANY); Replace(tm, "$self", pname0, DOH_REPLACE_ANY); Setattr(n, "wrap:action", tm); Delete(tm); Delete(pname0); Delete(pname1); } Delete(target); } if (make_set_wrapper) { Setattr(n, "sym:name", mrename_set); functionWrapper(n); } else { SetFlag(n, "feature:immutable"); } /* Restore parameters */ Setattr(n, "type", type); Setattr(n, "name", name); Setattr(n, "sym:name", symname); Delattr(n, "memberset"); /* Delete all attached typemaps and typemap attributes */ Iterator ki; for (ki = First(n); ki.key; ki = Next(ki)) { if (Strncmp(ki.key, "tmap:", 5) == 0) Delattr(n, ki.key); } } /* Emit get function */ { int flags = Extend | SmartPointer | use_naturalvar_mode(n); if (isNonVirtualProtectedAccess(n)) flags = flags | CWRAP_ALL_PROTECTED_ACCESS; Swig_MembergetToFunction(n, ClassType, flags); Setattr(n, "sym:name", mrename_get); Setattr(n, "memberget", "1"); functionWrapper(n); Delattr(n, "memberget"); } Delete(mrename_get); Delete(mrename_set); } else { /* This code is used to support the attributefunction directive where member variables are converted automagically to accessor functions */ #if 0 Parm *p; String *gname; SwigType *vty; p = NewParm(type, 0, n); gname = NewStringf(AttributeFunctionGet, symname); if (!Extend) { ActionFunc = Copy(Swig_cmemberget_call(name, type)); cpp_member_func(Char(gname), Char(gname), type, 0); Delete(ActionFunc); } else { String *cname = Swig_name_get(NSpace, name); cpp_member_func(Char(cname), Char(gname), type, 0); Delete(cname); } Delete(gname); if (!GetFlag(n, "feature:immutable")) { gname = NewStringf(AttributeFunctionSet, symname); vty = NewString("void"); if (!Extend) { ActionFunc = Copy(Swig_cmemberset_call(name, type)); cpp_member_func(Char(gname), Char(gname), vty, p); Delete(ActionFunc); } else { String *cname = Swig_name_set(NSpace, name); cpp_member_func(Char(cname), Char(gname), vty, p); Delete(cname); } Delete(gname); } ActionFunc = 0; #endif } Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::staticmembervariableHandler() * ---------------------------------------------------------------------- */ int Language::staticmembervariableHandler(Node *n) { Swig_require("staticmembervariableHandler", n, "*name", "*sym:name", "*type", "?value", NIL); String *value = Getattr(n, "value"); String *classname = !SmartPointer ? (isNonVirtualProtectedAccess(n) ? DirectorClassName : ClassName) : Getattr(CurrentClass, "allocate:smartpointerpointeeclassname"); if (!value || !Getattr(n, "hasconsttype")) { String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *cname, *mrename; /* Create the variable name */ mrename = Swig_name_member(0, ClassPrefix, symname); cname = NewStringf("%s::%s", classname, name); Setattr(n, "sym:name", mrename); Setattr(n, "name", cname); /* Wrap as an ordinary global variable */ variableWrapper(n); Delete(mrename); Delete(cname); } else { /* This is a C++ static member declaration with an initializer and it's const. Certain C++ compilers optimize this out so that there is no linkage to a memory address. Example: class Foo { public: static const int x = 3; }; Some discussion of this in section 9.4 of the C++ draft standard. Also, we have to manage the case: class Foo { public: %extend { static const int x = 3; } }; in which there's no actual Foo::x variable to refer to. In this case, the best we can do is to wrap the given value verbatim. */ String *name = Getattr(n, "name"); String *cname = NewStringf("%s::%s", classname, name); if (Extend) { /* the variable is a synthesized one. There's nothing we can do; we just keep the given value */ } else { /* we refer to the value as Foo::x */ String *value = SwigType_namestr(cname); Setattr(n, "value", value); } SwigType *t1 = SwigType_typedef_resolve_all(Getattr(n, "type")); SwigType *t2 = SwigType_strip_qualifiers(t1); Setattr(n, "type", t2); Delete(t1); Delete(t2); SetFlag(n, "wrappedasconstant"); memberconstantHandler(n); Delete(cname); } Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::externDeclaration() * ---------------------------------------------------------------------- */ int Language::externDeclaration(Node *n) { return emit_children(n); } /* ---------------------------------------------------------------------- * Language::enumDeclaration() * ---------------------------------------------------------------------- */ int Language::enumDeclaration(Node *n) { if (CurrentClass && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *oldNSpace = NSpace; NSpace = Getattr(n, "sym:nspace"); String *oldEnumClassPrefix = EnumClassPrefix; if (GetFlag(n, "scopedenum")) { assert(Getattr(n, "sym:name")); assert(Getattr(n, "name")); EnumClassPrefix = ClassPrefix ? NewStringf("%s_", ClassPrefix) : NewString(""); Printv(EnumClassPrefix, Getattr(n, "sym:name"), NIL); EnumClassName = Copy(Getattr(n, "name")); } if (!ImportMode) { emit_children(n); } if (GetFlag(n, "scopedenum")) { Delete(EnumClassName); EnumClassName = 0; Delete(EnumClassPrefix); EnumClassPrefix = oldEnumClassPrefix; } NSpace = oldNSpace; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::enumvalueDeclaration() * ---------------------------------------------------------------------- */ int Language::enumvalueDeclaration(Node *n) { if (CurrentClass && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "*sym:name", "?value", NIL); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); String *tmpValue; if (value) tmpValue = NewString(value); else tmpValue = NewString(name); Setattr(n, "value", tmpValue); Node *parent = parentNode(n); if (GetFlag(parent, "scopedenum")) { String *symname = Swig_name_member(0, Getattr(parent, "sym:name"), Getattr(n, "sym:name")); Setattr(n, "sym:name", symname); Delete(symname); } if (!CurrentClass || !cparse_cplusplus) { Setattr(n, "name", tmpValue); /* for wrapping of enums in a namespace when emit_action is used */ constantWrapper(n); } else { memberconstantHandler(n); } Delete(tmpValue); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::enumforwardDeclaration() * ---------------------------------------------------------------------- */ int Language::enumforwardDeclaration(Node *n) { (void) n; if (GetFlag(n, "enumMissing")) enumDeclaration(n); // Generate an empty enum in target language return SWIG_OK; } /* ----------------------------------------------------------------------------- * Language::memberconstantHandler() * ----------------------------------------------------------------------------- */ int Language::memberconstantHandler(Node *n) { Swig_require("memberconstantHandler", n, "*name", "*sym:name", "value", NIL); if (!GetFlag(n, "feature:allowexcept")) { UnsetFlag(n, "feature:except"); } if (Getattr(n, "feature:exceptvar")) { Setattr(n, "feature:except", Getattr(n, "feature:exceptvar")); } String *enumvalue_symname = Getattr(n, "enumvalueDeclaration:sym:name"); // Only set if a strongly typed enum String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *mrename = Swig_name_member(0, EnumClassPrefix, enumvalue_symname ? enumvalue_symname : symname); Setattr(n, "sym:name", mrename); String *new_name = 0; if (Extend) new_name = Copy(value); else if (EnumClassName) new_name = NewStringf("%s::%s", isNonVirtualProtectedAccess(n) ? DirectorClassName : EnumClassName, name); else new_name = NewStringf("%s::%s", isNonVirtualProtectedAccess(n) ? DirectorClassName : ClassName, name); Setattr(n, "name", new_name); constantWrapper(n); Delete(mrename); Delete(new_name); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::typedefHandler() * ---------------------------------------------------------------------- */ int Language::typedefHandler(Node *n) { /* since this is a recurring issue, we are going to remember the typedef pointer, if already it is not a pointer or reference, as in typedef void NT; int func(NT *p); see director_basic.i for example. */ SwigType *name = Getattr(n, "name"); SwigType *decl = Getattr(n, "decl"); if (!SwigType_ispointer(decl) && !SwigType_isreference(decl)) { SwigType *pname = Copy(name); SwigType_add_pointer(pname); SwigType_remember(pname); Delete(pname); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorMethod() * ---------------------------------------------------------------------- */ int Language::classDirectorMethod(Node *n, Node *parent, String *super) { (void) n; (void) parent; (void) super; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorConstructor() * ---------------------------------------------------------------------- */ int Language::classDirectorConstructor(Node *n) { (void) n; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorDefaultConstructor() * ---------------------------------------------------------------------- */ int Language::classDirectorDefaultConstructor(Node *n) { (void) n; return SWIG_OK; } static String *vtable_method_id(Node *n) { String *nodeType = Getattr(n, "nodeType"); int is_destructor = (Cmp(nodeType, "destructor") == 0); if (is_destructor) return 0; String *name = Getattr(n, "name"); String *decl = Getattr(n, "decl"); String *local_decl = SwigType_typedef_resolve_all(decl); String *tmp = SwigType_pop_function(local_decl); Delete(local_decl); local_decl = tmp; Node *method_id = NewStringf("%s|%s", name, local_decl); Delete(local_decl); return method_id; } /* ---------------------------------------------------------------------- * Language::unrollVirtualMethods() * ---------------------------------------------------------------------- */ int Language::unrollVirtualMethods(Node *n, Node *parent, List *vm, int default_director, int &virtual_destructor, int protectedbase) { Node *ni; String *nodeType; String *classname; String *decl; bool first_base = false; // recurse through all base classes to build the vtable List *bl = Getattr(n, "bases"); if (bl) { Iterator bi; for (bi = First(bl); bi.item; bi = Next(bi)) { if (first_base && !director_multiple_inheritance) break; unrollVirtualMethods(bi.item, parent, vm, default_director, virtual_destructor); first_base = true; } } // recurse through all protected base classes to build the vtable, as needed bl = Getattr(n, "protectedbases"); if (bl) { Iterator bi; for (bi = First(bl); bi.item; bi = Next(bi)) { if (first_base && !director_multiple_inheritance) break; unrollVirtualMethods(bi.item, parent, vm, default_director, virtual_destructor, 1); first_base = true; } } // find the methods that need directors classname = Getattr(n, "name"); for (ni = Getattr(n, "firstChild"); ni; ni = nextSibling(ni)) { /* we only need to check the virtual members */ nodeType = Getattr(ni, "nodeType"); int is_using = (Cmp(nodeType, "using") == 0); Node *nn = is_using ? firstChild(ni) : ni; /* assume there is only one child node for "using" nodes */ if (is_using) { if (nn) nodeType = Getattr(nn, "nodeType"); else continue; // A private "using" node } if (!checkAttribute(nn, "storage", "virtual")) continue; if (GetFlag(nn, "final")) continue; /* we need to add methods(cdecl) and destructor (to check for throw decl) */ int is_destructor = (Cmp(nodeType, "destructor") == 0); if ((Cmp(nodeType, "cdecl") == 0) || is_destructor) { decl = Getattr(nn, "decl"); /* extra check for function type and proper access */ if (SwigType_isfunction(decl) && (((!protectedbase || dirprot_mode()) && is_public(nn)) || need_nonpublic_member(nn))) { String *name = Getattr(nn, "name"); Node *method_id = is_destructor ? NewStringf("~destructor") : vtable_method_id(nn); /* Make sure that the new method overwrites the existing: */ int len = Len(vm); const int DO_NOT_REPLACE = -1; int replace = DO_NOT_REPLACE; for (int i = 0; i < len; i++) { Node *item = Getitem(vm, i); String *check_vmid = Getattr(item, "vmid"); if (Strcmp(method_id, check_vmid) == 0) { replace = i; break; } } /* filling a new method item */ String *fqdname = NewStringf("%s::%s", classname, name); Hash *item = NewHash(); Setattr(item, "fqdname", fqdname); Node *m = Copy(nn); /* Store the complete return type - needed for non-simple return types (pointers, references etc.) */ SwigType *ty = NewString(Getattr(m, "type")); SwigType_push(ty, decl); if (SwigType_isqualifier(ty)) { Delete(SwigType_pop(ty)); } Delete(SwigType_pop_function(ty)); Setattr(m, "returntype", ty); String *mname = NewStringf("%s::%s", Getattr(parent, "name"), name); /* apply the features of the original method found in the base class */ Swig_features_get(Swig_cparse_features(), 0, mname, Getattr(m, "decl"), m); Setattr(item, "methodNode", m); Setattr(item, "vmid", method_id); if (replace == DO_NOT_REPLACE) Append(vm, item); else Setitem(vm, replace, item); Setattr(nn, "directorNode", m); Delete(mname); } if (is_destructor) { virtual_destructor = 1; } } } /* We delete all the nodirector methods. This prevents the generation of 'empty' director classes. But this has to be done outside the previous 'for' and the recursive loop!. */ if (n == parent) { int len = Len(vm); for (int i = 0; i < len; i++) { Node *item = Getitem(vm, i); Node *m = Getattr(item, "methodNode"); /* retrieve the director features */ int mdir = GetFlag(m, "feature:director"); int mndir = GetFlag(m, "feature:nodirector"); /* 'nodirector' has precedence over 'director' */ int dir = (mdir || mndir) ? (mdir && !mndir) : 1; /* check if the method was found only in a base class */ Node *p = Getattr(m, "parentNode"); if (p != n) { Node *c = Copy(m); Setattr(c, "parentNode", n); int cdir = GetFlag(c, "feature:director"); int cndir = GetFlag(c, "feature:nodirector"); dir = (cdir || cndir) ? (cdir && !cndir) : dir; Delete(c); } if (dir) { /* be sure the 'nodirector' feature is disabled */ if (mndir) Delattr(m, "feature:nodirector"); } else { /* or just delete from the vm, since is not a director method */ Delitem(vm, i); len--; i--; } } } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorDisown() * ---------------------------------------------------------------------- */ int Language::classDirectorDisown(Node *n) { Node *disown = NewHash(); String *mrename; String *symname = Getattr(n, "sym:name"); mrename = Swig_name_disown(NSpace, symname); String *type = NewString(ClassType); String *name = NewString("self"); SwigType_add_pointer(type); Parm *p = NewParm(type, name, n); Delete(name); Delete(type); type = NewString("void"); String *action = NewString(""); Printv(action, "{\n", "Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);\n", "if (director) director->swig_disown();\n", "}\n", NULL); Setfile(disown, Getfile(n)); Setline(disown, Getline(n)); Setattr(disown, "wrap:action", action); Setattr(disown, "name", mrename); Setattr(disown, "sym:name", mrename); Setattr(disown, "type", type); Setattr(disown, "parms", p); Delete(action); Delete(mrename); Delete(type); Delete(p); functionWrapper(disown); Delete(disown); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorConstructors() * ---------------------------------------------------------------------- */ int Language::classDirectorConstructors(Node *n) { Node *ni; String *nodeType; Node *parent = Swig_methodclass(n); int default_ctor = Getattr(parent, "allocate:default_constructor") ? 1 : 0; int protected_ctor = 0; int constructor = 0; /* emit constructors */ for (ni = Getattr(n, "firstChild"); ni; ni = nextSibling(ni)) { nodeType = Getattr(ni, "nodeType"); if (Cmp(nodeType, "constructor") == 0) { if (GetFlag(ni, "feature:ignore")) continue; Parm *parms = Getattr(ni, "parms"); if (is_public(ni)) { /* emit public constructor */ classDirectorConstructor(ni); constructor = 1; if (default_ctor) default_ctor = !ParmList_numrequired(parms); } else { /* emit protected constructor if needed */ if (need_nonpublic_ctor(ni)) { classDirectorConstructor(ni); constructor = 1; protected_ctor = 1; if (default_ctor) default_ctor = !ParmList_numrequired(parms); } } } } /* emit default constructor if needed */ if (!constructor) { if (!default_ctor) { /* we get here because the class has no public, protected or default constructor, therefore, the director class can't be created, ie, is kind of abstract. */ Swig_warning(WARN_LANG_DIRECTOR_ABSTRACT, Getfile(n), Getline(n), "Director class '%s' can't be constructed\n", SwigType_namestr(Getattr(n, "name"))); return SWIG_OK; } classDirectorDefaultConstructor(n); default_ctor = 1; } /* this is just to support old java behavior, ie, the default constructor is always emitted, even when protected, and not needed, since there is a public constructor already defined. (scottm) This code is needed here to make the director_abstract + test generate compilable code (Example2 in director_abstract.i). (mmatus) This is very strange, since swig compiled with gcc3.2.3 doesn't need it here.... */ if (!default_ctor && !protected_ctor) { if (Getattr(parent, "allocate:default_base_constructor")) { classDirectorDefaultConstructor(n); } } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorMethods() * ---------------------------------------------------------------------- */ int Language::classDirectorMethods(Node *n) { Node *vtable = Getattr(n, "vtable"); int len = Len(vtable); for (int i = 0; i < len; i++) { Node *item = Getitem(vtable, i); String *method = Getattr(item, "methodNode"); String *fqdname = Getattr(item, "fqdname"); if (GetFlag(method, "feature:nodirector") || GetFlag(method, "final")) continue; String *wrn = Getattr(method, "feature:warnfilter"); if (wrn) Swig_warnfilter(wrn, 1); String *type = Getattr(method, "nodeType"); if (!Cmp(type, "destructor")) { classDirectorDestructor(method); } else { Swig_require("classDirectorMethods", method, "*type", NIL); assert(Getattr(method, "returntype")); Setattr(method, "type", Getattr(method, "returntype")); if (classDirectorMethod(method, n, fqdname) == SWIG_OK) SetFlag(item, "director"); Swig_restore(method); } if (wrn) Swig_warnfilter(wrn, 0); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorInit() * ---------------------------------------------------------------------- */ int Language::classDirectorInit(Node *n) { (void) n; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorDestructor() * ---------------------------------------------------------------------- */ int Language::classDirectorDestructor(Node *n) { /* Always emit the virtual destructor in the declaration and in the compilation unit. Been explicit here can't make any damage, and can solve some nasty C++ compiler problems. */ File *f_directors = Swig_filebyname("director"); File *f_directors_h = Swig_filebyname("director_h"); if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw();\n", DirectorClassName); Printf(f_directors, "%s::~%s() throw() {\n}\n\n", DirectorClassName, DirectorClassName); } else { Printf(f_directors_h, " virtual ~%s();\n", DirectorClassName); Printf(f_directors, "%s::~%s() {\n}\n\n", DirectorClassName, DirectorClassName); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorEnd() * ---------------------------------------------------------------------- */ int Language::classDirectorEnd(Node *n) { (void) n; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirector() * ---------------------------------------------------------------------- */ int Language::classDirector(Node *n) { Node *module = Getattr(n, "module"); String *classtype = Getattr(n, "classtype"); Hash *directormap = 0; if (module) { directormap = Getattr(module, "wrap:directormap"); if (directormap == 0) { directormap = NewHash(); Setattr(module, "wrap:directormap", directormap); } } List *vtable = NewList(); int virtual_destructor = 0; unrollVirtualMethods(n, n, vtable, 0, virtual_destructor); // Emit all the using base::member statements for non virtual members (allprotected mode) Node *ni; String *using_protected_members_code = NewString(""); for (ni = Getattr(n, "firstChild"); ni; ni = nextSibling(ni)) { Node *nodeType = Getattr(ni, "nodeType"); if (Cmp(nodeType, "destructor") == 0 && GetFlag(ni, "final")) { String *classtype = Getattr(n, "classtype"); SWIG_WARN_NODE_BEGIN(ni); Swig_warning(WARN_LANG_DIRECTOR_FINAL, input_file, line_number, "Destructor %s is final, %s cannot be a director class.\n", Swig_name_decl(ni), classtype); SWIG_WARN_NODE_END(ni); SetFlag(n, "feature:nodirector"); Delete(vtable); Delete(using_protected_members_code); return SWIG_OK; } bool cdeclaration = (Cmp(nodeType, "cdecl") == 0); if (cdeclaration && !GetFlag(ni, "feature:ignore")) { if (isNonVirtualProtectedAccess(ni)) { Node *overloaded = Getattr(ni, "sym:overloaded"); // emit the using base::member statement (but only once if the method is overloaded) if (!overloaded || (overloaded && (overloaded == ni))) Printf(using_protected_members_code, " using %s::%s;\n", SwigType_namestr(ClassName), Getattr(ni, "name")); } } } if (virtual_destructor || Len(vtable) > 0) { if (!virtual_destructor) { String *classtype = Getattr(n, "classtype"); Swig_warning(WARN_LANG_DIRECTOR_VDESTRUCT, input_file, line_number, "Director base class %s has no virtual destructor.\n", classtype); } Setattr(n, "vtable", vtable); if (directormap != 0) { Setattr(directormap, classtype, n); } classDirectorInit(n); classDirectorConstructors(n); classDirectorMethods(n); File *f_directors_h = Swig_filebyname("director_h"); Printv(f_directors_h, using_protected_members_code, NIL); classDirectorEnd(n); } Delete(vtable); Delete(using_protected_members_code); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDeclaration() * ---------------------------------------------------------------------- */ static void addCopyConstructor(Node *n) { Node *cn = NewHash(); set_nodeType(cn, "constructor"); Setattr(cn, "access", "public"); Setfile(cn, Getfile(n)); Setline(cn, Getline(n)); String *cname = Getattr(n, "name"); SwigType *type = Copy(cname); String *name = Swig_scopename_last(cname); String *cc = NewStringf("r.q(const).%s", type); String *decl = NewStringf("f(%s).", cc); String *oldname = Getattr(n, "sym:name"); if (Getattr(n, "allocate:has_constructor")) { // to work properly with '%rename Class', we must look // for any other constructor in the class, which has not been // renamed, and use its name as oldname. Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { const char *tag = Char(nodeType(c)); if (strcmp(tag, "constructor") == 0) { String *cname = Getattr(c, "name"); String *csname = Getattr(c, "sym:name"); String *clast = Swig_scopename_last(cname); if (Equal(csname, clast)) { oldname = csname; break; } } } } String *symname = Swig_name_make(cn, cname, name, decl, oldname); if (Strcmp(symname, "$ignore") != 0) { Parm *p = NewParm(cc, "other", n); Setattr(cn, "name", name); Setattr(cn, "sym:name", symname); SetFlag(cn, "feature:new"); Setattr(cn, "decl", decl); Setattr(cn, "parentNode", n); Setattr(cn, "parms", p); Setattr(cn, "copy_constructor", "1"); Symtab *oldscope = Swig_symbol_setscope(Getattr(n, "symtab")); Node *on = Swig_symbol_add(symname, cn); Swig_features_get(Swig_cparse_features(), Swig_symbol_qualifiedscopename(0), name, decl, cn); Swig_symbol_setscope(oldscope); if (on == cn) { Node *access = NewHash(); set_nodeType(access, "access"); Setattr(access, "kind", "public"); appendChild(n, access); appendChild(n, cn); Setattr(n, "has_copy_constructor", "1"); Setattr(n, "copy_constructor_decl", decl); Setattr(n, "allocate:copy_constructor", "1"); Delete(access); } } Delete(cn); Delete(name); Delete(decl); Delete(symname); } static void addDefaultConstructor(Node *n) { Node *cn = NewHash(); set_nodeType(cn, "constructor"); Setattr(cn, "access", "public"); Setfile(cn, Getfile(n)); Setline(cn, Getline(n)); String *cname = Getattr(n, "name"); String *name = Swig_scopename_last(cname); String *decl = NewString("f()."); String *oldname = Getattr(n, "sym:name"); String *symname = Swig_name_make(cn, cname, name, decl, oldname); if (Strcmp(symname, "$ignore") != 0) { Setattr(cn, "name", name); Setattr(cn, "sym:name", symname); SetFlag(cn, "feature:new"); Setattr(cn, "decl", decl); Setattr(cn, "parentNode", n); Setattr(cn, "default_constructor", "1"); Symtab *oldscope = Swig_symbol_setscope(Getattr(n, "symtab")); Node *on = Swig_symbol_add(symname, cn); Swig_features_get(Swig_cparse_features(), Swig_symbol_qualifiedscopename(0), name, decl, cn); Swig_symbol_setscope(oldscope); if (on == cn) { Node *access = NewHash(); set_nodeType(access, "access"); Setattr(access, "kind", "public"); appendChild(n, access); appendChild(n, cn); Setattr(n, "has_default_constructor", "1"); Setattr(n, "allocate:default_constructor", "1"); Delete(access); } } Delete(cn); Delete(name); Delete(decl); Delete(symname); } static void addDestructor(Node *n) { Node *cn = NewHash(); set_nodeType(cn, "destructor"); Setattr(cn, "access", "public"); Setfile(cn, Getfile(n)); Setline(cn, Getline(n)); String *cname = Getattr(n, "name"); String *name = Swig_scopename_last(cname); Insert(name, 0, "~"); String *decl = NewString("f()."); String *symname = Swig_name_make(cn, cname, name, decl, 0); if (Strcmp(symname, "$ignore") != 0) { String *possible_nonstandard_symname = NewStringf("~%s", Getattr(n, "sym:name")); Setattr(cn, "name", name); Setattr(cn, "sym:name", symname); Setattr(cn, "decl", "f()."); Setattr(cn, "parentNode", n); Symtab *oldscope = Swig_symbol_setscope(Getattr(n, "symtab")); Node *nonstandard_destructor = Equal(possible_nonstandard_symname, symname) ? 0 : Swig_symbol_clookup(possible_nonstandard_symname, 0); Node *on = Swig_symbol_add(symname, cn); Swig_features_get(Swig_cparse_features(), Swig_symbol_qualifiedscopename(0), name, decl, cn); Swig_symbol_setscope(oldscope); if (on == cn) { // SWIG accepts a non-standard named destructor in %extend that uses a typedef for the destructor name // For example: typedef struct X {} XX; %extend X { ~XX() {...} } // Don't add another destructor if a nonstandard one has been declared if (!nonstandard_destructor) { Node *access = NewHash(); set_nodeType(access, "access"); Setattr(access, "kind", "public"); appendChild(n, access); appendChild(n, cn); Setattr(n, "has_destructor", "1"); Setattr(n, "allocate:destructor", "1"); Delete(access); } } Delete(possible_nonstandard_symname); } Delete(cn); Delete(name); Delete(decl); Delete(symname); } int Language::classDeclaration(Node *n) { String *ochildren = Getattr(n, "feature:onlychildren"); if (ochildren) { Setattr(n, "feature:emitonlychildren", ochildren); emit_children(n); Delattr(n, "feature:emitonlychildren"); SetFlag(n, "feature:ignore"); return SWIG_NOWRAP; } // save class local variables for nested classes support int oldInClass = InClass; String *oldClassType = ClassType; String *oldClassPrefix = ClassPrefix; String *oldEnumClassPrefix = EnumClassPrefix; String *oldClassName = ClassName; String *oldDirectorClassName = DirectorClassName; String *oldNSpace = NSpace; Node *oldCurrentClass = CurrentClass; int dir = 0; String *kind = Getattr(n, "kind"); String *name = Getattr(n, "name"); String *tdname = Getattr(n, "tdname"); String *unnamed = Getattr(n, "unnamed"); String *symname = Getattr(n, "sym:name"); int strip = CPlusPlus ? 1 : unnamed && tdname; if (cplus_mode != PUBLIC) return SWIG_NOWRAP; if (!name) { Swig_warning(WARN_LANG_CLASS_UNNAMED, input_file, line_number, "Can't generate wrappers for unnamed struct/class.\n"); return SWIG_NOWRAP; } /* Check symbol name for template. If not renamed. Issue a warning */ if (!validIdentifier(symname)) { Swig_warning(WARN_LANG_IDENTIFIER, input_file, line_number, "Can't wrap class %s unless renamed to a valid identifier.\n", SwigType_namestr(symname)); return SWIG_NOWRAP; } AccessMode oldAccessMode = cplus_mode; Node *outerClass = Getattr(n, "nested:outer"); if (outerClass && oldAccessMode != PUBLIC) return SWIG_NOWRAP; ClassName = Copy(name); ClassPrefix = Copy(symname); if (Cmp(kind, "class") == 0) { cplus_mode = PRIVATE; } else { cplus_mode = PUBLIC; } for (; outerClass; outerClass = Getattr(outerClass, "nested:outer")) { Push(ClassPrefix, "_"); Push(ClassPrefix, Getattr(outerClass, "sym:name")); } EnumClassPrefix = Copy(ClassPrefix); if (strip) { ClassType = Copy(name); } else { ClassType = NewStringf("%s %s", kind, name); } Setattr(n, "classtypeobj", Copy(ClassType)); Setattr(n, "classtype", SwigType_namestr(ClassType)); InClass = 1; CurrentClass = n; NSpace = Getattr(n, "sym:nspace"); int oldAbstract = Abstract; /* Call classHandler() here */ if (!ImportMode) { if (directorsEnabled()) { int ndir = GetFlag(n, "feature:director"); int nndir = GetFlag(n, "feature:nodirector"); /* 'nodirector' has precedence over 'director' */ dir = (ndir || nndir) ? (ndir && !nndir) : 0; } int abstract = !dir && abstractClassTest(n); int odefault = (GenerateDefault && !GetFlag(n, "feature:nodefault")); /* default constructor */ if (!abstract && !GetFlag(n, "feature:nodefaultctor") && odefault) { if (!Getattr(n, "has_constructor") && !Getattr(n, "allocate:has_constructor") && (Getattr(n, "allocate:default_constructor"))) { addDefaultConstructor(n); } } /* copy constructor */ if (CPlusPlus && !abstract && GetFlag(n, "feature:copyctor")) { if (!Getattr(n, "has_copy_constructor") && !Getattr(n, "allocate:has_copy_constructor") && (Getattr(n, "allocate:copy_constructor")) && (!GetFlag(n, "feature:ignore"))) { addCopyConstructor(n); } } /* default destructor */ if (!GetFlag(n, "feature:nodefaultdtor") && odefault) { if (!Getattr(n, "has_destructor") && (!Getattr(n, "allocate:has_destructor")) && (Getattr(n, "allocate:default_destructor")) && (!GetFlag(n, "feature:ignore"))) { addDestructor(n); } } if (dir) { DirectorClassName = directorClassName(n); classDirector(n); } /* check for abstract after resolving directors */ Abstract = abstractClassTest(n); classHandler(n); } else { Abstract = abstractClassTest(n); Language::classHandler(n); } Abstract = oldAbstract; cplus_mode = oldAccessMode; NSpace = oldNSpace; InClass = oldInClass; CurrentClass = oldCurrentClass; Delete(ClassType); ClassType = oldClassType; Delete(EnumClassPrefix); EnumClassPrefix = oldEnumClassPrefix; Delete(ClassPrefix); ClassPrefix = oldClassPrefix; Delete(ClassName); ClassName = oldClassName; if (dir) { Delete(DirectorClassName); } DirectorClassName = oldDirectorClassName; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classHandler() * ---------------------------------------------------------------------- */ int Language::classHandler(Node *n) { save_value oldExtend(Extend); if (Getattr(n, "template")) Extend = 0; bool hasDirector = Swig_directorclass(n) ? true : false; /* Emit all of the class members */ emit_children(n); /* Look for smart pointer handling */ if (Getattr(n, "allocate:smartpointer")) { List *methods = Getattr(n, "allocate:smartpointer"); cplus_mode = PUBLIC; SmartPointer = CWRAP_SMART_POINTER; if (Getattr(n, "allocate:smartpointerconst") && Getattr(n, "allocate:smartpointermutable")) { SmartPointer |= CWRAP_SMART_POINTER_OVERLOAD; } Iterator c; for (c = First(methods); c.item; c = Next(c)) { emit_one(c.item); } SmartPointer = 0; } cplus_mode = PUBLIC; /* emit director disown method */ if (hasDirector) { classDirectorDisown(n); /* Emit additional protected virtual methods - only needed if the language module * codes logic in the C++ layer instead of the director proxy class method - primarily * to catch public use of protected methods by the scripting languages. */ if (dirprot_mode() && extraDirectorProtectedCPPMethodsRequired()) { Node *vtable = Getattr(n, "vtable"); String *symname = Getattr(n, "sym:name"); save_value old_mode(cplus_mode); cplus_mode = PROTECTED; int len = Len(vtable); for (int i = 0; i < len; i++) { Node *item = Getitem(vtable, i); Node *method = Getattr(item, "methodNode"); SwigType *type = Getattr(method, "nodeType"); if (Strcmp(type, "cdecl") != 0) continue; if (GetFlag(method, "feature:ignore")) continue; String *methodname = Getattr(method, "sym:name"); String *wrapname = NewStringf("%s_%s", symname, methodname); if (!symbolLookup(wrapname, "") && (!is_public(method))) { Node *m = Copy(method); Setattr(m, "director", "1"); Setattr(m, "parentNode", n); /* * There is a bug that needs fixing still... * This area of code is creating methods which have not been overridden in a derived class (director methods that are protected in the base) * If the method is overloaded, then Swig_overload_dispatch() incorrectly generates a call to the base wrapper, _wrap_xxx method * See director_protected_overloaded.i - Possibly sym:overname needs correcting here. Printf(stdout, "new method: %s::%s(%s)\n", Getattr(parentNode(m), "name"), Getattr(m, "name"), ParmList_str_defaultargs(Getattr(m, "parms"))); */ cDeclaration(m); Delete(m); } Delete(wrapname); } } } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classforwardDeclaration() * ---------------------------------------------------------------------- */ int Language::classforwardDeclaration(Node *n) { (void) n; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::constructorDeclaration() * ---------------------------------------------------------------------- */ int Language::constructorDeclaration(Node *n) { String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); if (!symname) return SWIG_NOWRAP; if (!CurrentClass) return SWIG_NOWRAP; if (ImportMode) return SWIG_NOWRAP; if (Extend) { /* extend default constructor can be safely ignored if there is already one */ int num_required = ParmList_numrequired(Getattr(n, "parms")); if ((num_required == 0) && Getattr(CurrentClass, "has_default_constructor")) { return SWIG_NOWRAP; } if ((num_required == 1) && Getattr(CurrentClass, "has_copy_constructor")) { String *ccdecl = Getattr(CurrentClass, "copy_constructor_decl"); if (ccdecl && (Strcmp(ccdecl, Getattr(n, "decl")) == 0)) { return SWIG_NOWRAP; } } } /* clean protected overloaded constructors, in case they are not needed anymore */ Node *over = Swig_symbol_isoverloaded(n); if (over && !Getattr(CurrentClass, "sym:cleanconstructor")) { int dirclass = Swig_directorclass(CurrentClass); Node *nn = over; while (nn) { if (!is_public(nn)) { if (!dirclass || !need_nonpublic_ctor(nn)) { SetFlag(nn, "feature:ignore"); } } nn = Getattr(nn, "sym:nextSibling"); } clean_overloaded(over); Setattr(CurrentClass, "sym:cleanconstructor", "1"); } if ((cplus_mode != PUBLIC)) { /* check only for director classes */ if (!Swig_directorclass(CurrentClass) || !need_nonpublic_ctor(n)) return SWIG_NOWRAP; } /* Name adjustment for %name */ Swig_save("constructorDeclaration", n, "sym:name", NIL); { String *base = Swig_scopename_last(name); if ((Strcmp(base, symname) == 0) && (Strcmp(symname, ClassPrefix) != 0)) { Setattr(n, "sym:name", ClassPrefix); } Delete(base); } /* Only create a constructor if the class is not abstract */ if (!Abstract) { Node *over; over = Swig_symbol_isoverloaded(n); if (over) over = first_nontemplate(over); if ((over) && (!overloading)) { /* If the symbol is overloaded. We check to see if it is a copy constructor. If so, we invoke copyconstructorHandler() as a special case. */ if (Getattr(n, "copy_constructor") && (!Getattr(CurrentClass, "has_copy_constructor"))) { copyconstructorHandler(n); Setattr(CurrentClass, "has_copy_constructor", "1"); } else { if (Getattr(over, "copy_constructor")) over = Getattr(over, "sym:nextSibling"); if (over != n) { Swig_warning(WARN_LANG_OVERLOAD_CONSTRUCT, input_file, line_number, "Overloaded constructor ignored. %s\n", Swig_name_decl(n)); Swig_warning(WARN_LANG_OVERLOAD_CONSTRUCT, Getfile(over), Getline(over), "Previous declaration is %s\n", Swig_name_decl(over)); } else { constructorHandler(n); } } } else { String *expected_name = ClassName; String *scope = Swig_scopename_check(ClassName) ? Swig_scopename_prefix(ClassName) : 0; String *actual_name = scope ? NewStringf("%s::%s", scope, name) : NewString(name); Delete(scope); if (!Equal(actual_name, expected_name) && !SwigType_istemplate(expected_name) && !SwigType_istemplate(actual_name)) { // Checking templates is skipped but they ought to be checked... they are just somewhat more tricky to check correctly bool illegal_name = true; if (Extend) { // Check for typedef names used as a constructor name in %extend. This is deprecated except for anonymous // typedef structs which have had their symbol names adjusted to the typedef name in the parser. SwigType *name_resolved = SwigType_typedef_resolve_all(actual_name); SwigType *expected_name_resolved = SwigType_typedef_resolve_all(expected_name); if (!CPlusPlus) { if (Strncmp(name_resolved, "struct ", 7) == 0) Replace(name_resolved, "struct ", "", DOH_REPLACE_FIRST); else if (Strncmp(name_resolved, "union ", 6) == 0) Replace(name_resolved, "union ", "", DOH_REPLACE_FIRST); } illegal_name = !Equal(name_resolved, expected_name_resolved); if (!illegal_name) Swig_warning(WARN_LANG_EXTEND_CONSTRUCTOR, input_file, line_number, "Use of an illegal constructor name '%s' in %%extend is deprecated, the constructor name should be '%s'.\n", SwigType_str(Swig_scopename_last(actual_name), 0), SwigType_str(Swig_scopename_last(expected_name), 0)); Delete(name_resolved); Delete(expected_name_resolved); } if (illegal_name) { Swig_warning(WARN_LANG_RETURN_TYPE, input_file, line_number, "Function %s must have a return type. Ignored.\n", Swig_name_decl(n)); Swig_restore(n); return SWIG_NOWRAP; } } constructorHandler(n); } } Setattr(CurrentClass, "has_constructor", "1"); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * get_director_ctor_code() * ---------------------------------------------------------------------- */ static String *get_director_ctor_code(Node *n, String *director_ctor_code, String *director_prot_ctor_code, List *&abstracts) { String *director_ctor = director_ctor_code; int use_director = Swig_directorclass(n); if (use_director) { Node *pn = Swig_methodclass(n); abstracts = Getattr(pn, "abstracts"); if (director_prot_ctor_code) { int is_notabstract = GetFlag(pn, "feature:notabstract"); int is_abstract = abstracts && !is_notabstract; if (is_protected(n) || is_abstract) { director_ctor = director_prot_ctor_code; abstracts = Copy(abstracts); Delattr(pn, "abstracts"); } else { if (is_notabstract) { abstracts = Copy(abstracts); Delattr(pn, "abstracts"); } else { abstracts = 0; } } } } return director_ctor; } /* ---------------------------------------------------------------------- * Language::constructorHandler() * ---------------------------------------------------------------------- */ int Language::constructorHandler(Node *n) { Swig_require("constructorHandler", n, "?name", "*sym:name", "?type", "?parms", NIL); String *symname = Getattr(n, "sym:name"); String *mrename = Swig_name_construct(NSpace, symname); String *nodeType = Getattr(n, "nodeType"); int constructor = (!Cmp(nodeType, "constructor")); List *abstracts = 0; String *director_ctor = get_director_ctor_code(n, director_ctor_code, director_prot_ctor_code, abstracts); if (!constructor) { /* if not originally a constructor, still handle it as one */ Setattr(n, "handled_as_constructor", "1"); } int extendmember = GetFlag(n, "isextendmember") ? Extend : 0; int flags = Getattr(n, "template") ? extendmember : Extend; Swig_ConstructorToFunction(n, NSpace, ClassType, none_comparison, director_ctor, CPlusPlus, flags, DirectorClassName); Setattr(n, "sym:name", mrename); functionWrapper(n); Delete(mrename); Swig_restore(n); if (abstracts) Setattr(Swig_methodclass(n), "abstracts", abstracts); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::copyconstructorHandler() * ---------------------------------------------------------------------- */ int Language::copyconstructorHandler(Node *n) { Swig_require("copyconstructorHandler", n, "?name", "*sym:name", "?type", "?parms", NIL); String *symname = Getattr(n, "sym:name"); String *mrename = Swig_name_copyconstructor(NSpace, symname); List *abstracts = 0; String *director_ctor = get_director_ctor_code(n, director_ctor_code, director_prot_ctor_code, abstracts); Swig_ConstructorToFunction(n, NSpace, ClassType, none_comparison, director_ctor, CPlusPlus, Getattr(n, "template") ? 0 : Extend, DirectorClassName); Setattr(n, "sym:name", mrename); functionWrapper(n); Delete(mrename); Swig_restore(n); if (abstracts) Setattr(Swig_methodclass(n), "abstracts", abstracts); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::destructorDeclaration() * ---------------------------------------------------------------------- */ int Language::destructorDeclaration(Node *n) { if (!CurrentClass) return SWIG_NOWRAP; if (cplus_mode != PUBLIC && !Getattr(CurrentClass, "feature:unref")) return SWIG_NOWRAP; if (ImportMode) return SWIG_NOWRAP; Swig_save("destructorDeclaration", n, "name", "sym:name", NIL); char *c = GetChar(n, "sym:name"); if (c && (*c == '~')) { Setattr(n, "sym:name", c + 1); } String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); if ((Strcmp(name, symname) == 0) || (Strcmp(symname, ClassPrefix) != 0)) { Setattr(n, "sym:name", ClassPrefix); } String *expected_name = ClassName; String *scope = Swig_scopename_check(ClassName) ? Swig_scopename_prefix(ClassName) : 0; String *actual_name = scope ? NewStringf("%s::%s", scope, name) : NewString(name); Delete(scope); Replace(actual_name, "~", "", DOH_REPLACE_FIRST); if (!Equal(actual_name, expected_name) && !(Getattr(n, "template"))) { bool illegal_name = true; if (Extend) { // Check for typedef names used as a destructor name in %extend. This is deprecated except for anonymous // typedef structs which have had their symbol names adjusted to the typedef name in the parser. SwigType *name_resolved = SwigType_typedef_resolve_all(actual_name); SwigType *expected_name_resolved = SwigType_typedef_resolve_all(expected_name); if (!CPlusPlus) { if (Strncmp(name_resolved, "struct ", 7) == 0) Replace(name_resolved, "struct ", "", DOH_REPLACE_FIRST); else if (Strncmp(name_resolved, "union ", 6) == 0) Replace(name_resolved, "union ", "", DOH_REPLACE_FIRST); } illegal_name = !Equal(name_resolved, expected_name_resolved); if (!illegal_name) Swig_warning(WARN_LANG_EXTEND_DESTRUCTOR, input_file, line_number, "Use of an illegal destructor name '%s' in %%extend is deprecated, the destructor name should be '%s'.\n", SwigType_str(Swig_scopename_last(actual_name), 0), SwigType_str(Swig_scopename_last(expected_name), 0)); Delete(name_resolved); Delete(expected_name_resolved); } if (illegal_name) { Swig_warning(WARN_LANG_ILLEGAL_DESTRUCTOR, input_file, line_number, "Illegal destructor name %s. Ignored.\n", Swig_name_decl(n)); Swig_restore(n); return SWIG_NOWRAP; } } destructorHandler(n); Setattr(CurrentClass, "has_destructor", "1"); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::destructorHandler() * ---------------------------------------------------------------------- */ int Language::destructorHandler(Node *n) { Swig_require("destructorHandler", n, "?name", "*sym:name", NIL); Swig_save("destructorHandler", n, "type", "parms", NIL); String *symname = Getattr(n, "sym:name"); String *mrename; char *csymname = Char(symname); if (*csymname == '~') csymname += 1; mrename = Swig_name_destroy(NSpace, csymname); Swig_DestructorToFunction(n, NSpace, ClassType, CPlusPlus, Extend); Setattr(n, "sym:name", mrename); functionWrapper(n); Delete(mrename); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::accessDeclaration() * ---------------------------------------------------------------------- */ int Language::accessDeclaration(Node *n) { String *kind = Getattr(n, "kind"); if (Cmp(kind, "public") == 0) { cplus_mode = PUBLIC; } else if (Cmp(kind, "private") == 0) { cplus_mode = PRIVATE; } else if (Cmp(kind, "protected") == 0) { cplus_mode = PROTECTED; } return SWIG_OK; } /* ----------------------------------------------------------------------------- * Language::namespaceDeclaration() * ----------------------------------------------------------------------------- */ int Language::namespaceDeclaration(Node *n) { if (Getattr(n, "alias")) return SWIG_OK; if (Getattr(n, "unnamed")) return SWIG_OK; emit_children(n); return SWIG_OK; } int Language::validIdentifier(String *s) { char *c = Char(s); while (*c) { if (!(isalnum(*c) || (*c == '_'))) return 0; c++; } return 1; } /* ----------------------------------------------------------------------------- * Language::usingDeclaration() * ----------------------------------------------------------------------------- */ int Language::usingDeclaration(Node *n) { if ((cplus_mode == PUBLIC) || (!is_public(n) && dirprot_mode())) { Node *np = Copy(n); Node *c; for (c = firstChild(np); c; c = nextSibling(c)) { /* it seems for some cases this is needed, like A* A::boo() */ if (CurrentClass) Setattr(c, "parentNode", CurrentClass); emit_one(c); } Delete(np); } return SWIG_OK; } /* Stubs. Language modules need to implement these */ /* ---------------------------------------------------------------------- * Language::constantWrapper() * ---------------------------------------------------------------------- */ int Language::constantWrapper(Node *n) { String *name = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); String *str = SwigType_str(type, name); Printf(stdout, "constantWrapper : %s = %s\n", str, value); Delete(str); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::variableWrapper() * ---------------------------------------------------------------------- */ int Language::variableWrapper(Node *n) { Swig_require("variableWrapper", n, "*name", "*sym:name", "*type", "?parms", "?varset", "?varget", NIL); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *name = Getattr(n, "name"); Delattr(n,"varset"); Delattr(n,"varget"); String *newsymname = 0; if (!CurrentClass && EnumClassPrefix) { newsymname = Swig_name_member(0, EnumClassPrefix, symname); symname = newsymname; } /* If no way to set variables. We simply create functions */ int assignable = is_assignable(n); int flags = use_naturalvar_mode(n); if (!GetFlag(n, "wrappedasconstant")) flags = flags | Extend; if (assignable) { int make_set_wrapper = 1; String *tm = Swig_typemap_lookup("globalin", n, name, 0); Swig_VarsetToFunction(n, flags); String *sname = Swig_name_set(NSpace, symname); Setattr(n, "sym:name", sname); Delete(sname); if (!tm) { if (SwigType_isarray(type)) { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(type, 0)); make_set_wrapper = 0; } } else { String *pname0 = Swig_cparm_name(0, 0); Replace(tm, "$source", pname0, DOH_REPLACE_ANY); Replace(tm, "$target", name, DOH_REPLACE_ANY); Replace(tm, "$input", pname0, DOH_REPLACE_ANY); Setattr(n, "wrap:action", tm); Delete(tm); Delete(pname0); } if (make_set_wrapper) { Setattr(n, "varset", "1"); functionWrapper(n); } else { SetFlag(n, "feature:immutable"); } /* Restore parameters */ Setattr(n, "sym:name", symname); Setattr(n, "type", type); Setattr(n, "name", name); Delattr(n, "varset"); /* Delete all attached typemaps and typemap attributes */ Iterator ki; for (ki = First(n); ki.key; ki = Next(ki)) { if (Strncmp(ki.key, "tmap:", 5) == 0) Delattr(n, ki.key); } } Swig_VargetToFunction(n, flags); String *gname = Swig_name_get(NSpace, symname); Setattr(n, "sym:name", gname); Delete(gname); Setattr(n, "varget", "1"); functionWrapper(n); Delattr(n, "varget"); Swig_restore(n); Delete(newsymname); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::functionWrapper() * ---------------------------------------------------------------------- */ int Language::functionWrapper(Node *n) { String *name = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); ParmList *parms = Getattr(n, "parms"); Printf(stdout, "functionWrapper : %s\n", SwigType_str(type, NewStringf("%s(%s)", name, ParmList_str_defaultargs(parms)))); Printf(stdout, " action : %s\n", Getattr(n, "wrap:action")); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Language::nativeWrapper() * ----------------------------------------------------------------------------- */ int Language::nativeWrapper(Node *n) { (void) n; return SWIG_OK; } void Language::main(int argc, char *argv[]) { (void) argc; (void) argv; } /* ----------------------------------------------------------------------------- * Language::addSymbol() * * Adds a symbol entry into the target language symbol tables. * Returns 1 if the symbol is added successfully. * Prints an error message and returns 0 if a conflict occurs. * The scope is optional for target languages and if supplied must be a fully * qualified scope and the symbol s must not contain any scope qualifiers. * ----------------------------------------------------------------------------- */ int Language::addSymbol(const String *s, const Node *n, const_String_or_char_ptr scope) { //Printf( stdout, "addSymbol: %s %s\n", s, scope ); Hash *symbols = Getattr(symtabs, scope ? scope : ""); if (!symbols) { symbols = symbolAddScope(scope); } else { Node *c = Getattr(symbols, s); if (c && (c != n)) { if (scope && Len(scope) > 0) Swig_error(input_file, line_number, "'%s' is multiply defined in the generated target language module in scope '%s'.\n", s, scope); else Swig_error(input_file, line_number, "'%s' is multiply defined in the generated target language module.\n", s); Swig_error(Getfile(c), Getline(c), "Previous declaration of '%s'\n", s); return 0; } } Setattr(symbols, s, n); return 1; } /* ----------------------------------------------------------------------------- * Language::addInterfaceSymbol() * * Adds a symbol entry into the target language symbol tables - for the interface * feature only. * Returns 1 if the symbol is added successfully. * The scope is as per addSymbol. * ----------------------------------------------------------------------------- */ int Language::addInterfaceSymbol(const String *interface_name, Node *n, const_String_or_char_ptr scope) { if (interface_name) { Node *existing_symbol = symbolLookup(interface_name, scope); if (existing_symbol) { String *proxy_class_name = Getattr(n, "sym:name"); Swig_error(input_file, line_number, "The interface feature name '%s' for proxy class '%s' is already defined in the generated target language module in scope '%s'.\n", interface_name, proxy_class_name, scope); Swig_error(Getfile(existing_symbol), Getline(existing_symbol), "Previous declaration of '%s'\n", interface_name); return 0; } if (!addSymbol(interface_name, n, scope)) return 0; } return 1; } /* ----------------------------------------------------------------------------- * Language::symbolAddScope() * * Creates a scope (symbols Hash) for given name. This method is auxiliary, * you don't have to call it - addSymbols will lazily create scopes automatically. * If scope with given name already exists, then do nothing. * Returns newly created (or already existing) scope. * ----------------------------------------------------------------------------- */ Hash* Language::symbolAddScope(const_String_or_char_ptr scope) { Hash *symbols = symbolScopeLookup(scope); if(!symbols) { // The order in which the following code is executed is important. In the Language // constructor addScope("") is called to create a top level scope. // Thus we must first add a symbols hash to symtab and only then add pseudo // symbols to the top-level scope. // New scope which has not been added by the target language - lazily created. symbols = NewHash(); Setattr(symtabs, scope, symbols); // Add the new scope as a symbol in the top level scope. // Alternatively the target language must add it in before attempting to add symbols into the scope. const_String_or_char_ptr top_scope = ""; Hash *topscope_symbols = Getattr(symtabs, top_scope); Hash *pseudo_symbol = NewHash(); Setattr(pseudo_symbol, "sym:scope", "1"); Setattr(topscope_symbols, scope, pseudo_symbol); } return symbols; } /* ----------------------------------------------------------------------------- * Language::symbolScopeLookup() * * Lookup and returns a symtable (hash) representing given scope. Hash contains * all symbols in this scope. * ----------------------------------------------------------------------------- */ Hash* Language::symbolScopeLookup( const_String_or_char_ptr scope ) { Hash *symbols = Getattr(symtabs, scope ? scope : ""); return symbols; } /* ----------------------------------------------------------------------------- * Language::symbolScopePseudoSymbolLookup() * * For every scope there is a special pseudo-symbol in the top scope (""). It * exists solely to detect name clashes. This pseudo symbol may contain a few properties, * but more could be added. This is also true for the top level scope (""). * It contains a pseudo symbol with name "" (empty). Pseudo symbol contains the * following properties: * sym:scope = "1" - a flag that this is a scope pseudo symbol * * Pseudo symbols are a Hash*, not a Node*. * There is no difference from symbolLookup() method except for signature * and return type. * ----------------------------------------------------------------------------- */ Hash* Language::symbolScopePseudoSymbolLookup( const_String_or_char_ptr scope ) { /* Getting top scope */ const_String_or_char_ptr top_scope = ""; Hash *symbols = Getattr(symtabs, top_scope); return Getattr(symbols, scope); } /* ----------------------------------------------------------------------------- * Language::dumpSymbols() * ----------------------------------------------------------------------------- */ void Language::dumpSymbols() { Printf(stdout, "LANGUAGE SYMBOLS start =======================================\n"); Node *table = symtabs; Iterator ki = First(table); while (ki.key) { String *k = ki.key; Printf(stdout, "===================================================\n"); Printf(stdout, "%s -\n", k); { Symtab *symtab = Getattr(table, k); Iterator it = First(symtab); while (it.key) { String *symname = it.key; Printf(stdout, " %s\n", symname); it = Next(it); } } ki = Next(ki); } Printf(stdout, "LANGUAGE SYMBOLS finish =======================================\n"); } /* ----------------------------------------------------------------------------- * Language::symbolLookup() * ----------------------------------------------------------------------------- */ Node *Language::symbolLookup(const String *s, const_String_or_char_ptr scope) { Hash *symbols = Getattr(symtabs, scope ? scope : ""); if (!symbols) { return NULL; } return Getattr(symbols, s); } /* ----------------------------------------------------------------------------- * Language::classLookup() * * Tries to locate a class from a type definition * ----------------------------------------------------------------------------- */ Node *Language::classLookup(const SwigType *s) { static Hash *classtypes = 0; Node *n = 0; /* Look in hash of cached values */ n = classtypes ? Getattr(classtypes, s) : 0; if (!n) { Symtab *stab = 0; SwigType *ty1 = SwigType_typedef_resolve_all(s); SwigType *ty2 = SwigType_strip_qualifiers(ty1); String *base = SwigType_base(ty2); Replaceall(base, "class ", ""); Replaceall(base, "struct ", ""); Replaceall(base, "union ", ""); if (strncmp(Char(base), "::", 2) == 0) { String *oldbase = base; base = NewString(Char(base) + 2); Delete(oldbase); } String *prefix = SwigType_prefix(ty2); /* Do a symbol table search on the base type */ while (!n) { Hash *nstab; n = Swig_symbol_clookup(base, stab); if (!n) break; if (Strcmp(nodeType(n), "class") == 0) break; Node *sibling = n; while (sibling) { sibling = Getattr(sibling, "csym:nextSibling"); if (sibling && Strcmp(nodeType(sibling), "class") == 0) break; } if (sibling) break; n = parentNode(n); if (!n) break; nstab = Getattr(n, "sym:symtab"); n = 0; if ((!nstab) || (nstab == stab)) { break; } stab = nstab; } if (n) { /* Found a match. Look at the prefix. We only allow the cases where we want a proxy class for the particular type */ bool acceptable_prefix = (Len(prefix) == 0) || // simple type (pass by value) (Strcmp(prefix, "p.") == 0) || // pointer (Strcmp(prefix, "r.") == 0) || // reference (Strcmp(prefix, "z.") == 0) || // rvalue reference SwigType_prefix_is_simple_1D_array(prefix); // Simple 1D array (not arrays of pointers/references) // Also accept pointer by const reference, not non-const pointer reference if (!acceptable_prefix && (Strcmp(prefix, "r.p.") == 0)) { Delete(prefix); prefix = SwigType_prefix(ty1); acceptable_prefix = (Strncmp(prefix, "r.q(const", 9) == 0); } if (acceptable_prefix) { SwigType *cs = Copy(s); if (!classtypes) classtypes = NewHash(); Setattr(classtypes, cs, n); Delete(cs); } else { n = 0; } } Delete(prefix); Delete(base); Delete(ty2); Delete(ty1); } if (n && (GetFlag(n, "feature:ignore") || Getattr(n, "feature:onlychildren"))) { n = 0; } return n; } /* ----------------------------------------------------------------------------- * Language::enumLookup() * * Finds and returns the Node containing the enum declaration for the (enum) * type passed in. * ----------------------------------------------------------------------------- */ Node *Language::enumLookup(SwigType *s) { static Hash *enumtypes = 0; Node *n = 0; /* Look in hash of cached values */ n = enumtypes ? Getattr(enumtypes, s) : 0; if (!n) { Symtab *stab = 0; SwigType *lt = SwigType_ltype(s); SwigType *ty1 = SwigType_typedef_resolve_all(lt); SwigType *ty2 = SwigType_strip_qualifiers(ty1); String *base = SwigType_base(ty2); Replaceall(base, "enum ", ""); String *prefix = SwigType_prefix(ty2); if (strncmp(Char(base), "::", 2) == 0) { String *oldbase = base; base = NewString(Char(base) + 2); Delete(oldbase); } /* Look for type in symbol table */ while (!n) { Hash *nstab; n = Swig_symbol_clookup(base, stab); if (!n) break; if (Equal(nodeType(n), "enum")) break; if (Equal(nodeType(n), "enumforward") && GetFlag(n, "enumMissing")) break; n = parentNode(n); if (!n) break; nstab = Getattr(n, "sym:symtab"); n = 0; if ((!nstab) || (nstab == stab)) { break; } stab = nstab; } if (n) { /* Found a match. Look at the prefix. We only allow simple types. */ if (Len(prefix) == 0) { /* Simple type */ if (!enumtypes) enumtypes = NewHash(); Setattr(enumtypes, Copy(s), n); } else { n = 0; } } Delete(prefix); Delete(base); Delete(ty2); Delete(ty1); Delete(lt); } if (n && (GetFlag(n, "feature:ignore"))) { n = 0; } return n; } /* ----------------------------------------------------------------------------- * Language::allow_overloading() * ----------------------------------------------------------------------------- */ void Language::allow_overloading(int val) { overloading = val; } /* ----------------------------------------------------------------------------- * Language::allow_multiple_input() * ----------------------------------------------------------------------------- */ void Language::allow_multiple_input(int val) { multiinput = val; } /* ----------------------------------------------------------------------------- * Language::enable_cplus_runtime_mode() * ----------------------------------------------------------------------------- */ void Language::enable_cplus_runtime_mode() { cplus_runtime = 1; } /* ----------------------------------------------------------------------------- * Language::cplus_runtime_mode() * ----------------------------------------------------------------------------- */ int Language::cplus_runtime_mode() { return cplus_runtime; } /* ----------------------------------------------------------------------------- * Language::allow_directors() * ----------------------------------------------------------------------------- */ void Language::allow_directors(int val) { directors = val; } /* ----------------------------------------------------------------------------- * Language::directorsEnabled() * ----------------------------------------------------------------------------- */ int Language::directorsEnabled() const { return director_language && CPlusPlus && (directors || director_mode); } /* ----------------------------------------------------------------------------- * Language::allow_dirprot() * ----------------------------------------------------------------------------- */ void Language::allow_dirprot(int val) { director_protected_mode = val; } /* ----------------------------------------------------------------------------- * Language::allow_allprotected() * ----------------------------------------------------------------------------- */ void Language::allow_allprotected(int val) { all_protected_mode = val; } /* ----------------------------------------------------------------------------- * Language::dirprot_mode() * ----------------------------------------------------------------------------- */ int Language::dirprot_mode() const { return directorsEnabled() ? director_protected_mode : 0; } /* ----------------------------------------------------------------------------- * Language::need_nonpublic_ctor() * ----------------------------------------------------------------------------- */ int Language::need_nonpublic_ctor(Node *n) { /* detects when a protected constructor is needed, which is always the case if 'dirprot' mode is used. However, if that is not the case, we will try to strictly emit what is minimal to don't break the generated, while preserving compatibility with java, which always try to emit the default constructor. rules: - when dirprot mode is used, the protected constructors are always needed. - the protected default constructor is always needed. - if dirprot mode is not used, the protected constructors will be needed only if: - there is no any public constructor in the class, and - there is no protected default constructor In that case, all the declared protected constructors are needed since we don't know which one to pick up. Note: given all the complications here, I am always in favor to always enable 'dirprot', since is the C++ idea of protected members, and use %ignore for the method you don't want to add in the director class. */ if (directorsEnabled()) { if (is_protected(n)) { if (dirprot_mode()) { /* when using dirprot mode, the protected constructors are always needed */ return 1; } else { int is_default_ctor = !ParmList_numrequired(Getattr(n, "parms")); if (is_default_ctor) { /* the default protected constructor is always needed, for java compatibility */ return 1; } else { /* check if there is a public constructor */ Node *parent = Swig_methodclass(n); int public_ctor = Getattr(parent, "allocate:default_constructor") || Getattr(parent, "allocate:public_constructor"); if (!public_ctor) { /* if not, the protected constructor will be needed only if there is no protected default constructor declared */ int no_prot_default_ctor = !Getattr(parent, "allocate:default_base_constructor"); return no_prot_default_ctor; } } } } } return 0; } /* ----------------------------------------------------------------------------- * Language::need_nonpublic_member() * ----------------------------------------------------------------------------- */ int Language::need_nonpublic_member(Node *n) { if (directorsEnabled() && DirectorClassName) { if (is_protected(n)) { if (dirprot_mode()) { /* when using dirprot mode, the protected members are always needed. */ return 1; } else { /* if the method is pure virtual, we need it. */ int pure_virtual = (Cmp(Getattr(n, "value"), "0") == 0); return pure_virtual; } } } return 0; } /* ----------------------------------------------------------------------------- * Language::is_smart_pointer() * ----------------------------------------------------------------------------- */ int Language::is_smart_pointer() const { return SmartPointer; } /* ----------------------------------------------------------------------------- * Language::makeParameterName() * * Inputs: * n - Node * p - parameter node * arg_num - parameter argument number * setter - set this flag when wrapping variables * Return: * arg - a unique parameter name * ----------------------------------------------------------------------------- */ String *Language::makeParameterName(Node *n, Parm *p, int arg_num, bool setter) const { String *arg = 0; String *pn = Getattr(p, "name"); // Check if parameter name is a duplicate. int count = 0; ParmList *plist = Getattr(n, "parms"); while (plist) { if ((Cmp(pn, Getattr(plist, "name")) == 0)) count++; plist = nextSibling(plist); } // If the parameter has no name at all or has a non-unique name, replace it with "argN". if (!pn || count > 1) { arg = NewStringf("arg%d", arg_num); } else { // Otherwise, try to use the original C name, but modify it if necessary to avoid conflicting with the language keywords. arg = Swig_name_make(p, 0, pn, 0, 0); } if (setter && Cmp(arg, "self") != 0) { // Some languages (C#) insist on calling the input variable "value" while // others (D, Java) could, in principle, use something different but this // would require more work, and so we just use "value" for them too. // For setters the parameter name sometimes includes C++ scope resolution which needs removing. Delete(arg); arg = NewString("value"); } return arg; } /* ----------------------------------------------------------------------------- * Language::() * ----------------------------------------------------------------------------- */ bool Language::isNonVirtualProtectedAccess(Node *n) const { // Ideally is_non_virtual_protected_access() would contain all this logic, see // comments therein about vtable. return DirectorClassName && is_non_virtual_protected_access(n); } /* ----------------------------------------------------------------------------- * Language::extraDirectorProtectedCPPMethodsRequired() * ----------------------------------------------------------------------------- */ bool Language::extraDirectorProtectedCPPMethodsRequired() const { return true; } /* ----------------------------------------------------------------------------- * Language::nestedClassesSupport() * ----------------------------------------------------------------------------- */ Language::NestedClassSupport Language::nestedClassesSupport() const { return NCS_Unknown; } /* ----------------------------------------------------------------------------- * Language::kwargsSupport() * ----------------------------------------------------------------------------- */ bool Language::kwargsSupport() const { return false; } /* ----------------------------------------------------------------------------- * Language::is_wrapping_class() * ----------------------------------------------------------------------------- */ int Language::is_wrapping_class() const { return InClass; } /* ----------------------------------------------------------------------------- * Language::getCurrentClass() * ----------------------------------------------------------------------------- */ Node *Language::getCurrentClass() const { return CurrentClass; } /* ----------------------------------------------------------------------------- * Language::getNSpace() * ----------------------------------------------------------------------------- */ String *Language::getNSpace() const { return NSpace; } /* ----------------------------------------------------------------------------- * Language::getClassName() * ----------------------------------------------------------------------------- */ String *Language::getClassName() const { return ClassName; } /* ----------------------------------------------------------------------------- * Language::getClassPrefix() * ----------------------------------------------------------------------------- */ String *Language::getClassPrefix() const { return ClassPrefix; } /* ----------------------------------------------------------------------------- * Language::getEnumClassPrefix() * ----------------------------------------------------------------------------- */ String *Language::getEnumClassPrefix() const { return EnumClassPrefix; } /* ----------------------------------------------------------------------------- * Language::getClassType() * ----------------------------------------------------------------------------- */ String *Language::getClassType() const { return ClassType; } /* ----------------------------------------------------------------------------- * Language::abstractClassTest() * ----------------------------------------------------------------------------- */ //#define SWIG_DEBUG int Language::abstractClassTest(Node *n) { /* check for non public operator new */ if (GetFlag(n, "feature:notabstract")) return 0; if (Getattr(n, "allocate:nonew")) return 1; // A class cannot be instantiated if one of its bases has a private destructor // Note that if the above does not hold the class can be instantiated if its own destructor is private List *bases = Getattr(n, "bases"); if (bases) { for (int i = 0; i < Len(bases); i++) { Node *b = Getitem(bases, i); if (GetFlag(b, "allocate:private_destructor")) return 1; } } /* now check for the rest */ List *abstracts = Getattr(n, "abstracts"); if (!abstracts) return 0; int labs = Len(abstracts); #ifdef SWIG_DEBUG List *allbases = Getattr(n, "allbases"); Printf(stderr, "testing %s %d %d\n", Getattr(n, "name"), labs, Len(allbases)); #endif if (!labs) return 0; /*strange, but need to be fixed */ if (abstracts && !directorsEnabled()) return 1; if (!GetFlag(n, "feature:director")) return 1; Node *dirabstract = 0; Node *vtable = Getattr(n, "vtable"); if (vtable) { #ifdef SWIG_DEBUG Printf(stderr, "vtable %s %d %d\n", Getattr(n, "name"), Len(vtable), labs); #endif for (int i = 0; i < labs; i++) { Node *ni = Getitem(abstracts, i); Node *method_id = vtable_method_id(ni); if (!method_id) continue; bool exists_item = false; int len = Len(vtable); for (int i = 0; i < len; i++) { Node *item = Getitem(vtable, i); String *check_item = Getattr(item, "vmid"); if (Strcmp(method_id, check_item) == 0) { exists_item = true; break; } } #ifdef SWIG_DEBUG Printf(stderr, "method %s %d\n", method_id, exists_item ? 1 : 0); #endif Delete(method_id); if (!exists_item) { dirabstract = ni; break; } } if (dirabstract) { if (is_public(dirabstract)) { Swig_warning(WARN_LANG_DIRECTOR_ABSTRACT, Getfile(n), Getline(n), "Director class '%s' is abstract, abstract method '%s' is not accessible, maybe due to multiple inheritance or 'nodirector' feature\n", SwigType_namestr(Getattr(n, "name")), Getattr(dirabstract, "name")); } else { Swig_warning(WARN_LANG_DIRECTOR_ABSTRACT, Getfile(n), Getline(n), "Director class '%s' is abstract, abstract method '%s' is private\n", SwigType_namestr(Getattr(n, "name")), Getattr(dirabstract, "name")); } return 1; } } else { return 1; } return 0; } void Language::setSubclassInstanceCheck(String *nc) { none_comparison = nc; } void Language::setOverloadResolutionTemplates(String *argc, String *argv) { Delete(argc_template_string); argc_template_string = Copy(argc); Delete(argv_template_string); argv_template_string = Copy(argv); } int Language::is_assignable(Node *n) { if (GetFlag(n, "feature:immutable")) return 0; SwigType *type = Getattr(n, "type"); Node *cn = 0; SwigType *ftd = SwigType_typedef_resolve_all(type); SwigType *td = SwigType_strip_qualifiers(ftd); if (SwigType_type(td) == T_USER) { cn = Swig_symbol_clookup(td, 0); if (cn) { if ((Strcmp(nodeType(cn), "class") == 0)) { if (Getattr(cn, "allocate:noassign")) { SetFlag(n, "feature:immutable"); Delete(ftd); Delete(td); return 0; } } } } Delete(ftd); Delete(td); return 1; } String *Language::runtimeCode() { return NewString(""); } String *Language::defaultExternalRuntimeFilename() { return 0; } /* ----------------------------------------------------------------------------- * Language::replaceSpecialVariables() * * Language modules should implement this if special variables are to be handled * correctly in the $typemap(...) special variable macro. * method - typemap method name * tm - string containing typemap contents * parm - a parameter describing the typemap type to be handled * ----------------------------------------------------------------------------- */ void Language::replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; (void)tm; (void)parm; } Language *Language::instance() { return this_; } Hash *Language::getClassHash() const { return classhash; } swig-4.0.2/Source/Modules/main.cxx0000644000175000017500000013323313667507523016707 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * main.cxx * * Main entry point to the SWIG core. * ----------------------------------------------------------------------------- */ #include "swigconfig.h" #if defined(_WIN32) #define WIN32_LEAN_AND_MEAN #include #endif #include "swigmod.h" #include "swigwarn.h" #include "cparse.h" #include #include #include // for INT_MAX // Global variables static Language *lang = 0; // Language method int CPlusPlus = 0; int Extend = 0; // Extend flag int ForceExtern = 0; // Force extern mode int GenerateDefault = 1; // Generate default constructors int Verbose = 0; int AddExtern = 0; int NoExcept = 0; int SwigRuntime = 0; // 0 = no option, 1 = -runtime, 2 = -noruntime /* Suppress warning messages for private inheritance, preprocessor evaluation etc... WARN_PP_EVALUATION 202 WARN_PARSE_PRIVATE_INHERIT 309 WARN_PARSE_BUILTIN_NAME 321 WARN_PARSE_REDUNDANT 322 WARN_TYPE_ABSTRACT 403 WARN_TYPE_RVALUE_REF_QUALIFIER_IGNORED 405 WARN_LANG_OVERLOAD_CONST 512 */ #define EXTRA_WARNINGS "202,309,403,405,512,321,322" extern "C" { extern String *ModuleName; extern int ignore_nested_classes; extern int kwargs_supported; } /* usage string split into multiple parts otherwise string is too big for some compilers */ /* naming conventions for commandline options - no underscores, no capital letters, join words together * except when using a common prefix, then use '-' to separate, eg the debug-xxx options */ static const char *usage1 = (const char *) "\ \nGeneral Options\n\ -addextern - Add extra extern declarations\n\ -c++ - Enable C++ processing\n\ -co - Check out of the SWIG library\n\ -copyctor - Automatically generate copy constructors wherever possible\n\ -cpperraswarn - Treat the preprocessor #error statement as #warning (default)\n\ -cppext - Change file extension of generated C++ files to \n\ (default is cxx)\n\ -copyright - Display copyright notices\n\ -debug-classes - Display information about the classes found in the interface\n\ -debug-module - Display module parse tree at stages 1-4, is a csv list of stages\n\ -debug-symtabs - Display symbol tables information\n\ -debug-symbols - Display target language symbols in the symbol tables\n\ -debug-csymbols - Display C symbols in the symbol tables\n\ -debug-lsymbols - Display target language layer symbols\n\ -debug-tags - Display information about the tags found in the interface\n\ -debug-template - Display information for debugging templates\n\ -debug-top - Display entire parse tree at stages 1-4, is a csv list of stages\n\ -debug-typedef - Display information about the types and typedefs in the interface\n\ -debug-typemap - Display typemap debugging information\n\ -debug-tmsearch - Display typemap search debugging information\n\ -debug-tmused - Display typemaps used debugging information\n\ -directors - Turn on director mode for all the classes, mainly for testing\n\ -dirprot - Turn on wrapping of protected members for director classes (default)\n\ -D - Define a symbol (for conditional compilation)\n\ "; static const char *usage2 = (const char *) "\ -E - Preprocess only, does not generate wrapper code\n\ -external-runtime [file] - Export the SWIG runtime stack\n\ -fakeversion - Make SWIG fake the program version number to \n\ -fcompact - Compile in compact mode\n\ -features - Set global features, where is a comma separated list of\n\ features, eg -features directors,autodoc=1\n\ If no explicit value is given to the feature, a default of 1 is used\n\ -fastdispatch - Enable fast dispatch mode to produce faster overload dispatcher code\n\ -Fmicrosoft - Display error/warning messages in Microsoft format\n\ -Fstandard - Display error/warning messages in commonly used format\n\ -fvirtual - Compile in virtual elimination mode\n\ -help - Display help\n\ -I- - Don't search the current directory\n\ -I

- Look for SWIG files in directory \n\ -ignoremissing - Ignore missing include files\n\ -importall - Follow all #include statements as imports\n\ -includeall - Follow all #include statements\n\ -l - Include SWIG library file \n\ "; static const char *usage3 = (const char *) "\ -macroerrors - Report errors inside macros\n\ -makedefault - Create default constructors/destructors (the default)\n\ -M - List all dependencies\n\ -MD - Is equivalent to `-M -MF ', except `-E' is not implied\n\ -MF - Generate dependencies into and continue generating wrappers\n\ -MM - List dependencies, but omit files in SWIG library\n\ -MMD - Like `-MD', but omit files in SWIG library\n\ -module - Set module name to \n\ -MP - Generate phony targets for all dependencies\n\ -MT - Set the target of the rule emitted by dependency generation\n\ -nocontract - Turn off contract checking\n\ -nocpperraswarn - Do not treat the preprocessor #error statement as #warning\n\ -nodefault - Do not generate default constructors nor default destructors\n\ -nodefaultctor - Do not generate implicit default constructors\n\ -nodefaultdtor - Do not generate implicit default destructors\n\ -nodirprot - Do not wrap director protected members\n\ -noexcept - Do not wrap exception specifiers\n\ -nofastdispatch - Disable fast dispatch mode (default)\n\ -nopreprocess - Skip the preprocessor step\n\ -notemplatereduce - Disable reduction of the typedefs in templates\n\ "; static const char *usage4 = (const char *) "\ -O - Enable the optimization options:\n\ -fastdispatch -fvirtual\n\ -o - Set name of C/C++ output file to \n\ -oh - Set name of C++ output header file for directors to \n\ -outcurrentdir - Set default output dir to current dir instead of input file's path\n\ -outdir - Set language specific files output directory to \n\ -pcreversion - Display PCRE version information\n\ -small - Compile in virtual elimination and compact mode\n\ -swiglib - Report location of SWIG library and exit\n\ -templatereduce - Reduce all the typedefs in templates\n\ -v - Run in verbose mode\n\ -version - Display SWIG version number\n\ -Wall - Remove all warning suppression, also implies -Wextra\n\ -Wallkw - Enable keyword warnings for all the supported languages\n\ -Werror - Treat warnings as errors\n\ -Wextra - Adds the following additional warnings: " EXTRA_WARNINGS "\n\ -w - Suppress/add warning messages, eg -w401,+321 - see Warnings.html\n\ -xmlout - Write XML version of the parse tree to after normal processing\n\ \n\ Options can also be defined using the SWIG_FEATURES environment variable, for example:\n\ \n\ $ SWIG_FEATURES=\"-Wall\"\n\ $ export SWIG_FEATURES\n\ $ swig -python interface.i\n\ \n\ is equivalent to:\n\ \n\ $ swig -Wall -python interface.i\n\ \n\ Arguments may also be passed in a file, separated by whitespace. For example:\n\ \n\ $ echo \"-Wall -python interface.i\" > args.txt\n\ $ swig @args.txt\n\ \n"; // Local variables static String *LangSubDir = 0; // Target language library subdirectory static String *SwigLib = 0; // Library directory static String *SwigLibWinUnix = 0; // Extra library directory on Windows static int freeze = 0; static String *lang_config = 0; static const char *hpp_extension = "h"; static const char *cpp_extension = "cxx"; static const char *depends_extension = "d"; static String *outdir = 0; static String *xmlout = 0; static int outcurrentdir = 0; static int help = 0; static int checkout = 0; static int cpp_only = 0; static int no_cpp = 0; static String *outfile_name = 0; static String *outfile_name_h = 0; static int tm_debug = 0; static int dump_symtabs = 0; static int dump_symbols = 0; static int dump_csymbols = 0; static int dump_lang_symbols = 0; static int dump_tags = 0; static int dump_module = 0; static int dump_top = 0; static int dump_xml = 0; static int browse = 0; static int dump_typedef = 0; static int dump_classes = 0; static int werror = 0; static int depend = 0; static int depend_only = 0; static int depend_phony = 0; static int memory_debug = 0; static int allkw = 0; static DOH *cpps = 0; static String *dependencies_file = 0; static String *dependencies_target = 0; static int external_runtime = 0; static String *external_runtime_name = 0; enum { STAGE1=1, STAGE2=2, STAGE3=4, STAGE4=8, STAGEOVERFLOW=16 }; static List *libfiles = 0; static List *all_output_files = 0; /* ----------------------------------------------------------------------------- * check_extension() * * Checks the extension of a file to see if we should emit extern declarations. * ----------------------------------------------------------------------------- */ static bool check_extension(String *filename) { bool wanted = false; const char *name = Char(filename); if (!name) return 0; String *extension = Swig_file_extension(name); const char *c = Char(extension); if ((strcmp(c, ".c") == 0) || (strcmp(c, ".C") == 0) || (strcmp(c, ".cc") == 0) || (strcmp(c, ".cxx") == 0) || (strcmp(c, ".c++") == 0) || (strcmp(c, ".cpp") == 0)) { wanted = true; } Delete(extension); return wanted; } /* ----------------------------------------------------------------------------- * install_opts() * * Install all command line options as preprocessor symbols * ----------------------------------------------------------------------------- */ static void install_opts(int argc, char *argv[]) { int i; int noopt = 0; char *c; for (i = 1; i < (argc - 1); i++) { if (argv[i]) { if ((*argv[i] == '-') && (!isupper(*(argv[i] + 1)))) { String *opt = NewStringf("SWIGOPT%(upper)s", argv[i]); Replaceall(opt, "-", "_"); c = Char(opt); noopt = 0; while (*c) { if (!(isalnum(*c) || (*c == '_'))) { noopt = 1; break; } c++; } if (((i + 1) < (argc - 1)) && (argv[i + 1]) && (*argv[i + 1] != '-')) { Printf(opt, " %s", argv[i + 1]); i++; } else { Printf(opt, " 1"); } if (!noopt) { /* Printf(stdout,"%s\n", opt); */ Preprocessor_define(opt, 0); } Delete(opt); } } } } /* ----------------------------------------------------------------------------- * decode_numbers_list() * * Decode comma separated list into a binary number of the inputs or'd together * eg list="1,4" will return (2^0 || 2^3) = 0x1001 * ----------------------------------------------------------------------------- */ static unsigned int decode_numbers_list(String *numlist) { unsigned int decoded_number = 0; if (numlist) { List *numbers = Split(numlist, ',', INT_MAX); if (numbers && Len(numbers) > 0) { for (Iterator it = First(numbers); it.item; it = Next(it)) { String *numstring = it.item; // TODO: check that it is a number int number = atoi(Char(numstring)); if (number > 0 && number <= 16) { decoded_number |= (1 << (number-1)); } } } } return decoded_number; } /* ----------------------------------------------------------------------------- * Sets the output directory for language specific (proxy) files from the * C wrapper file if not set and corrects the directory name and adds a trailing * file separator if necessary. * ----------------------------------------------------------------------------- */ static void configure_outdir(const String *c_wrapper_outfile) { // Use the C wrapper file's directory if the output directory has not been set by user if (!outdir || Len(outdir) == 0) outdir = Swig_file_dirname(c_wrapper_outfile); Swig_filename_correct(outdir); // Add trailing file delimiter if not present in output directory name if (Len(outdir) > 0) { const char *outd = Char(outdir); if (strcmp(outd + strlen(outd) - strlen(SWIG_FILE_DELIMITER), SWIG_FILE_DELIMITER) != 0) Printv(outdir, SWIG_FILE_DELIMITER, NIL); } } /* This function sets the name of the configuration file */ void SWIG_config_file(const_String_or_char_ptr filename) { lang_config = NewString(filename); } /* Sets the target language subdirectory name */ void SWIG_library_directory(const char *subdirectory) { LangSubDir = NewString(subdirectory); } // Returns the directory for generating language specific files (non C/C++ files) const String *SWIG_output_directory() { assert(outdir); return outdir; } void SWIG_config_cppext(const char *ext) { cpp_extension = ext; } List *SWIG_output_files() { assert(all_output_files); return all_output_files; } void SWIG_setfeature(const char *cfeature, const char *cvalue) { Hash *features_hash = Swig_cparse_features(); String *name = NewString(""); String *fname = NewString(cfeature); String *fvalue = NewString(cvalue); Swig_feature_set(features_hash, name, 0, fname, fvalue, 0); Delete(name); Delete(fname); Delete(fvalue); } void SWIG_setfeatures(const char *c) { char feature[64]; char *fb = feature; char *fe = fb + 63; Hash *features_hash = Swig_cparse_features(); String *name = NewString(""); /* Printf(stderr,"all features %s\n", c); */ while (*c) { char *f = fb; String *fname = NewString("feature:"); String *fvalue = NewString(""); while ((f != fe) && *c != '=' && *c != ',' && *c) { *(f++) = *(c++); } *f = 0; Printf(fname, "%s", feature); if (*c && *(c++) == '=') { char value[64]; char *v = value; char *ve = v + 63; while ((v != ve) && *c != ',' && *c && !isspace(*c)) { *(v++) = *(c++); } *v = 0; Printf(fvalue, "%s", value); } else { Printf(fvalue, "1"); } /* Printf(stderr,"%s %s\n", fname, fvalue); */ Swig_feature_set(features_hash, name, 0, fname, fvalue, 0); Delete(fname); Delete(fvalue); } Delete(name); } /* This function handles the -external-runtime command option */ static void SWIG_dump_runtime() { String *outfile; File *runtime; String *s; outfile = external_runtime_name; if (!outfile) { outfile = lang->defaultExternalRuntimeFilename(); if (!outfile) { Printf(stderr, "*** Please provide a filename for the external runtime\n"); SWIG_exit(EXIT_FAILURE); } } runtime = NewFile(outfile, "w", SWIG_output_files()); if (!runtime) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } Swig_banner(runtime); Printf(runtime, "\n"); s = Swig_include_sys("swiglabels.swg"); if (!s) { Printf(stderr, "*** Unable to open 'swiglabels.swg'\n"); Delete(runtime); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", s); Delete(s); s = Swig_include_sys("swigerrors.swg"); if (!s) { Printf(stderr, "*** Unable to open 'swigerrors.swg'\n"); Delete(runtime); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", s); Delete(s); s = Swig_include_sys("swigrun.swg"); if (!s) { Printf(stderr, "*** Unable to open 'swigrun.swg'\n"); Delete(runtime); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", s); Delete(s); s = lang->runtimeCode(); Printf(runtime, "%s", s); Delete(s); s = Swig_include_sys("runtime.swg"); if (!s) { Printf(stderr, "*** Unable to open 'runtime.swg'\n"); Delete(runtime); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", s); Delete(s); Delete(runtime); SWIG_exit(EXIT_SUCCESS); } static void getoptions(int argc, char *argv[]) { int i; // Get options for (i = 1; i < argc; i++) { if (argv[i] && !Swig_check_marked(i)) { if (strncmp(argv[i], "-I-", 3) == 0) { // Don't push/pop directories Swig_set_push_dir(0); Swig_mark_arg(i); } else if (strncmp(argv[i], "-I", 2) == 0) { // Add a new directory search path char *a = Swig_copy_string(argv[i] + 2); Swig_add_directory((DOH *) a); free(a); Swig_mark_arg(i); } else if (strncmp(argv[i], "-D", 2) == 0) { String *d = NewString(argv[i] + 2); Replace(d, "=", " ", DOH_REPLACE_ANY | DOH_REPLACE_FIRST); Preprocessor_define((DOH *) d, 0); Delete(d); // Create a symbol Swig_mark_arg(i); } else if (strcmp(argv[i], "-E") == 0) { cpp_only = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nopreprocess") == 0) { no_cpp = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-verbose") == 0) || (strcmp(argv[i], "-v") == 0)) { Verbose = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-c++") == 0) { CPlusPlus = 1; Preprocessor_define((DOH *) "__cplusplus __cplusplus", 0); Swig_cparse_cplusplus(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-c++out") == 0) { // Undocumented Swig_cparse_cplusplusout(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-fcompact") == 0) { Wrapper_compact_print_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-fvirtual") == 0) { Wrapper_virtual_elimination_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-fastdispatch") == 0) { Wrapper_fast_dispatch_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nofastdispatch") == 0) { Wrapper_fast_dispatch_mode_set(0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-naturalvar") == 0) { Wrapper_naturalvar_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-directors") == 0) { SWIG_setfeature("feature:director", "1"); Wrapper_director_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-dirprot") == 0) { Wrapper_director_protected_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nodirprot") == 0) { Wrapper_director_protected_mode_set(0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-pcreversion") == 0) { String *version = Swig_pcre_version(); Printf(stdout, "%s\n", version); Delete(version); Swig_mark_arg(i); SWIG_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "-small") == 0) { Wrapper_compact_print_mode_set(1); Wrapper_virtual_elimination_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-runtime") == 0) { // Used to also accept -c. removed in swig-1.3.36 Swig_mark_arg(i); Swig_warning(WARN_DEPRECATED_OPTC, "SWIG", 1, "-runtime, -noruntime command line options are deprecated.\n"); SwigRuntime = 1; } else if (strcmp(argv[i], "-noruntime") == 0) { Swig_mark_arg(i); Swig_warning(WARN_DEPRECATED_OPTC, "SWIG", 1, "-runtime, -noruntime command line options are deprecated.\n"); SwigRuntime = 2; } else if (strcmp(argv[i], "-external-runtime") == 0) { external_runtime = 1; Swig_mark_arg(i); if (argv[i + 1]) { external_runtime_name = NewString(argv[i + 1]); Swig_mark_arg(i + 1); i++; } } else if ((strcmp(argv[i], "-make_default") == 0) || (strcmp(argv[i], "-makedefault") == 0)) { GenerateDefault = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-no_default") == 0) || (strcmp(argv[i], "-nodefault") == 0)) { GenerateDefault = 0; Swig_warning(WARN_DEPRECATED_NODEFAULT, "SWIG", 1, "dangerous, use -nodefaultctor, -nodefaultdtor instead.\n"); Swig_mark_arg(i); } else if ((strcmp(argv[i], "-nodefaultctor") == 0)) { SWIG_setfeature("feature:nodefaultctor", "1"); Swig_mark_arg(i); } else if ((strcmp(argv[i], "-nodefaultdtor") == 0)) { SWIG_setfeature("feature:nodefaultdtor", "1"); Swig_mark_arg(i); } else if ((strcmp(argv[i], "-copyctor") == 0)) { SWIG_setfeature("feature:copyctor", "1"); Swig_mark_arg(i); } else if (strcmp(argv[i], "-noexcept") == 0) { NoExcept = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noextern") == 0) { Swig_warning(WARN_DEPRECATED_NOEXTERN, "SWIG", 1, "-noextern command line option is deprecated; extern is no longer generated by default.\n"); AddExtern = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-addextern") == 0) { AddExtern = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-template") == 0) || (strcmp(argv[i], "-debug_template") == 0) || (strcmp(argv[i], "-show_templates") == 0)) { Swig_cparse_debug_templates(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-templatereduce") == 0) { SWIG_cparse_template_reduce(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-notemplatereduce") == 0) { SWIG_cparse_template_reduce(0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-macroerrors") == 0) { Swig_cparse_follow_locators(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-swiglib") == 0) { Printf(stdout, "%s\n", SwigLib); if (SwigLibWinUnix) Printf(stdout, "%s\n", SwigLibWinUnix); SWIG_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "-o") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { outfile_name = NewString(argv[i + 1]); Swig_filename_correct(outfile_name); if (!outfile_name_h || !dependencies_file) { char *ext = strrchr(Char(outfile_name), '.'); String *basename = ext ? NewStringWithSize(Char(outfile_name), (int)(Char(ext) - Char(outfile_name))) : NewString(outfile_name); if (!dependencies_file) { dependencies_file = NewStringf("%s.%s", basename, depends_extension); } if (!outfile_name_h) { Printf(basename, ".%s", hpp_extension); outfile_name_h = NewString(basename); } Delete(basename); } Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-oh") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { outfile_name_h = NewString(argv[i + 1]); Swig_filename_correct(outfile_name_h); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-fakeversion") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { Swig_set_fakeversion(argv[i + 1]); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-version") == 0) { fprintf(stdout, "\nSWIG Version %s\n", Swig_package_version()); fprintf(stdout, "\nCompiled with %s [%s]\n", SWIG_CXX, SWIG_PLATFORM); fprintf(stdout, "\nConfigured options: %cpcre\n", #ifdef HAVE_PCRE '+' #else '-' #endif ); fprintf(stdout, "\nPlease see %s for reporting bugs and further information\n", PACKAGE_BUGREPORT); SWIG_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "-copyright") == 0) { fprintf(stdout, "\nSWIG Version %s\n", Swig_package_version()); fprintf(stdout, "Copyright (c) 1995-1998\n"); fprintf(stdout, "University of Utah and the Regents of the University of California\n"); fprintf(stdout, "Copyright (c) 1998-2005\n"); fprintf(stdout, "University of Chicago\n"); fprintf(stdout, "Copyright (c) 2005-2006\n"); fprintf(stdout, "Arizona Board of Regents (University of Arizona)\n"); SWIG_exit(EXIT_SUCCESS); } else if (strncmp(argv[i], "-l", 2) == 0) { // Add a new directory search path Append(libfiles, argv[i] + 2); Swig_mark_arg(i); } else if (strcmp(argv[i], "-co") == 0) { checkout = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-features") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { SWIG_setfeatures(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-freeze") == 0) { freeze = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-includeall") == 0) { Preprocessor_include_all(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-importall") == 0) { Preprocessor_import_all(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-ignoremissing") == 0) { Preprocessor_ignore_missing(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-cpperraswarn") == 0) { Preprocessor_error_as_warning(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocpperraswarn") == 0) { Preprocessor_error_as_warning(0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-cppext") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { SWIG_config_cppext(argv[i + 1]); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-debug-typemap") == 0) || (strcmp(argv[i], "-debug_typemap") == 0) || (strcmp(argv[i], "-tm_debug") == 0)) { tm_debug = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-tmsearch") == 0) { Swig_typemap_search_debug_set(); Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-tmused") == 0) { Swig_typemap_used_debug_set(); Swig_mark_arg(i); } else if (strcmp(argv[i], "-module") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { ModuleName = NewString(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-M") == 0) { depend = 1; depend_only = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MM") == 0) { depend = 2; depend_only = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MF") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { dependencies_file = NewString(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-MD") == 0) { depend = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MMD") == 0) { depend = 2; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MP") == 0) { depend_phony = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MT") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { if (!dependencies_target) dependencies_target = NewString(argv[i + 1]); else Printf(dependencies_target, " %s", argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-outdir") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { outdir = NewString(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-outcurrentdir") == 0) { Swig_mark_arg(i); outcurrentdir = 1; } else if (strcmp(argv[i], "-Wall") == 0) { Swig_mark_arg(i); Swig_warnall(); } else if (strcmp(argv[i], "-Wallkw") == 0) { allkw = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-Werror") == 0) { werror = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-Wextra") == 0) { Swig_mark_arg(i); Swig_warnfilter(EXTRA_WARNINGS, 0); } else if (strncmp(argv[i], "-w", 2) == 0) { Swig_mark_arg(i); Swig_warnfilter(argv[i] + 2, 1); } else if (strcmp(argv[i], "-debug-symtabs") == 0) { dump_symtabs = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-symbols") == 0) { dump_symbols = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-csymbols") == 0) { dump_csymbols = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-lsymbols") == 0) { dump_lang_symbols = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-tags") == 0) || (strcmp(argv[i], "-dump_tags") == 0)) { dump_tags = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-top") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { String *dump_list = NewString(argv[i + 1]); dump_top = decode_numbers_list(dump_list); if (dump_top < STAGE1 || dump_top >= STAGEOVERFLOW) Swig_arg_error(); else Swig_mark_arg(i + 1); Delete(dump_list); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-debug-module") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { String *dump_list = NewString(argv[i + 1]); dump_module = decode_numbers_list(dump_list); if (dump_module < STAGE1 || dump_module >= STAGEOVERFLOW) Swig_arg_error(); else Swig_mark_arg(i + 1); Delete(dump_list); } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-dump_tree") == 0) || (strcmp(argv[i], "-dump_top") == 0)) { dump_top |= STAGE4; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dump_module") == 0) { dump_module |= STAGE4; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dump_parse_module") == 0) { dump_module |= STAGE1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dump_parse_top") == 0) { dump_top |= STAGE1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dump_xml") == 0) { dump_xml = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-xmlout") == 0) { dump_xml = 1; Swig_mark_arg(i); if (argv[i + 1]) { xmlout = NewString(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-nocontract") == 0) { Swig_mark_arg(i); Swig_contract_mode_set(0); } else if (strcmp(argv[i], "-browse") == 0) { browse = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-typedef") == 0) || (strcmp(argv[i], "-dump_typedef") == 0)) { dump_typedef = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-classes") == 0) || (strcmp(argv[i], "-dump_classes") == 0)) { dump_classes = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-memory") == 0) || (strcmp(argv[i], "-dump_memory") == 0)) { memory_debug = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-Fstandard") == 0) { Swig_error_msg_format(EMF_STANDARD); Swig_mark_arg(i); } else if (strcmp(argv[i], "-Fmicrosoft") == 0) { Swig_error_msg_format(EMF_MICROSOFT); Swig_mark_arg(i); } else if (strcmp(argv[i], "-O") == 0) { Wrapper_virtual_elimination_mode_set(1); Wrapper_fast_dispatch_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage1, stdout); fputs(usage2, stdout); fputs(usage3, stdout); fputs(usage4, stdout); Swig_mark_arg(i); help = 1; } } } } int SWIG_main(int argc, char *argv[], const TargetLanguageModule *tlm) { char *c; /* Initialize the SWIG core */ Swig_init(); // Default warning suppression Swig_warnfilter(EXTRA_WARNINGS, 1); // Initialize the preprocessor Preprocessor_init(); // Set lang to a dummy value if no target language was specified so we // can process options enough to handle -version, etc. lang = tlm ? tlm->fac() : new Language; // Set up some default symbols (available in both SWIG interface files // and C files) Preprocessor_define((DOH *) "SWIG 1", 0); Preprocessor_define((DOH *) "__STDC__", 0); // Set the SWIG version value in format 0xAABBCC from package version expected to be in format A.B.C String *package_version = NewString(PACKAGE_VERSION); /* Note that the fakeversion has not been set at this point */ char *token = strtok(Char(package_version), "."); String *vers = NewString("SWIG_VERSION 0x"); int count = 0; while (token) { int len = (int)strlen(token); assert(len == 1 || len == 2); Printf(vers, "%s%s", (len == 1) ? "0" : "", token); token = strtok(NULL, "."); count++; } Delete(package_version); assert(count == 3); // Check version format is correct /* Turn on contracts */ Swig_contract_mode_set(1); Preprocessor_define(vers, 0); /* Turn off directors mode */ Wrapper_director_mode_set(0); Wrapper_director_protected_mode_set(1); // Inform the parser if the nested classes should be ignored unless explicitly told otherwise via feature:flatnested ignore_nested_classes = lang->nestedClassesSupport() == Language::NCS_Unknown ? 1 : 0; kwargs_supported = lang->kwargsSupport() ? 1 : 0; // Create Library search directories // Check for SWIG_LIB environment variable if ((c = getenv("SWIG_LIB")) == (char *) 0) { #if defined(_WIN32) char buf[MAX_PATH]; char *p; if (!(GetModuleFileName(0, buf, MAX_PATH) == 0 || (p = strrchr(buf, '\\')) == 0)) { *(p + 1) = '\0'; SwigLib = NewStringf("%sLib", buf); // Native windows installation path } else { SwigLib = NewStringf(""); // Unexpected error } if (Len(SWIG_LIB_WIN_UNIX) > 0) SwigLibWinUnix = NewString(SWIG_LIB_WIN_UNIX); // Unix installation path using a drive letter (for msys/mingw) #else SwigLib = NewString(SWIG_LIB); #endif } else { SwigLib = NewString(c); } libfiles = NewList(); all_output_files = NewList(); /* Check for SWIG_FEATURES environment variable */ getoptions(argc, argv); // Define the __cplusplus symbol if (CPlusPlus) Preprocessor_define((DOH *) "__cplusplus __cplusplus", 0); // Parse language dependent options lang->main(argc, argv); if (help) { Printf(stdout, "\nNote: 'swig - -help' displays options for a specific target language.\n\n"); SWIG_exit(EXIT_SUCCESS); // Exit if we're in help mode } // Check all of the options to make sure we're cool. // Don't check for an input file if -external-runtime is passed Swig_check_options(external_runtime ? 0 : 1); if (CPlusPlus && cparse_cplusplusout) { Printf(stderr, "The -c++out option is for C input but C++ input has been requested via -c++\n"); SWIG_exit(EXIT_FAILURE); } install_opts(argc, argv); // Add language dependent directory to the search path { String *rl = NewString(""); Printf(rl, ".%sswig_lib%s%s", SWIG_FILE_DELIMITER, SWIG_FILE_DELIMITER, LangSubDir); Swig_add_directory(rl); if (SwigLibWinUnix) { rl = NewString(""); Printf(rl, "%s%s%s", SwigLibWinUnix, SWIG_FILE_DELIMITER, LangSubDir); Swig_add_directory(rl); } rl = NewString(""); Printf(rl, "%s%s%s", SwigLib, SWIG_FILE_DELIMITER, LangSubDir); Swig_add_directory(rl); } Swig_add_directory((String *) "." SWIG_FILE_DELIMITER "swig_lib"); if (SwigLibWinUnix) Swig_add_directory((String *) SwigLibWinUnix); Swig_add_directory(SwigLib); if (Verbose) { Printf(stdout, "Language subdirectory: %s\n", LangSubDir); Printf(stdout, "Search paths:\n"); List *sp = Swig_search_path(); Iterator s; for (s = First(sp); s.item; s = Next(s)) { Printf(stdout, " %s\n", s.item); } } // handle the -external-runtime argument if (external_runtime) SWIG_dump_runtime(); // If we made it this far, looks good. go for it.... input_file = NewString(argv[argc - 1]); Swig_filename_correct(input_file); // If the user has requested to check out a file, handle that if (checkout) { DOH *s; String *outfile = input_file; if (outfile_name) outfile = outfile_name; if (Verbose) Printf(stdout, "Handling checkout...\n"); s = Swig_include(input_file); if (!s) { Printf(stderr, "Unable to locate '%s' in the SWIG library.\n", input_file); } else { FILE *f = Swig_open(outfile); if (f) { fclose(f); Printf(stderr, "File '%s' already exists. Checkout aborted.\n", outfile); } else { File *f_outfile = NewFile(outfile, "w", SWIG_output_files()); if (!f_outfile) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } else { if (Verbose) Printf(stdout, "'%s' checked out from the SWIG library.\n", outfile); Printv(f_outfile, s, NIL); Delete(f_outfile); } } } } else { // Run the preprocessor if (Verbose) Printf(stdout, "Preprocessing...\n"); { int i; String *fs = NewString(""); FILE *df = Swig_open(input_file); if (!df) { df = Swig_include_open(input_file); if (!df) { char *cfile = Char(input_file); if (cfile && cfile[0] == '-') { Printf(stderr, "Unable to find option or file '%s', ", input_file); Printf(stderr, "Use 'swig -help' for more information.\n"); } else { Printf(stderr, "Unable to find file '%s'.\n", input_file); } SWIG_exit(EXIT_FAILURE); } else { Swig_warning(WARN_DEPRECATED_INPUT_FILE, "SWIG", 1, "Use of the include path to find the input file is deprecated and will not work with ccache. Please include the path when specifying the input file.\n"); // so that behaviour is like c/c++ compilers } } if (!tlm) { Printf(stderr, "No target language specified.\n"); Printf(stderr, "Use 'swig -help' for more information.\n"); SWIG_exit(EXIT_FAILURE); } if (!no_cpp) { fclose(df); Printf(fs, "%%include \n"); if (allkw) { Printf(fs, "%%include \n"); } if (lang_config) { Printf(fs, "\n%%include <%s>\n", lang_config); } Printf(fs, "%%include(maininput=\"%s\") \"%s\"\n", Swig_filename_escape(input_file), Swig_filename_escape(Swig_last_file())); for (i = 0; i < Len(libfiles); i++) { Printf(fs, "\n%%include \"%s\"\n", Swig_filename_escape(Getitem(libfiles, i))); } Seek(fs, 0, SEEK_SET); cpps = Preprocessor_parse(fs); Delete(fs); } else { cpps = Swig_read_file(df); fclose(df); } if (Swig_error_count()) { SWIG_exit(EXIT_FAILURE); } if (cpp_only) { Printf(stdout, "%s", cpps); SWIG_exit(EXIT_SUCCESS); } if (depend) { if (!no_cpp) { String *outfile; File *f_dependencies_file = 0; String *inputfile_filename = outcurrentdir ? Swig_file_filename(input_file): Copy(input_file); String *basename = Swig_file_basename(inputfile_filename); if (!outfile_name) { if (CPlusPlus || lang->cplus_runtime_mode()) { outfile = NewStringf("%s_wrap.%s", basename, cpp_extension); } else { outfile = NewStringf("%s_wrap.c", basename); } } else { outfile = NewString(outfile_name); } if (dependencies_file && Len(dependencies_file) != 0) { f_dependencies_file = NewFile(dependencies_file, "w", SWIG_output_files()); if (!f_dependencies_file) { FileErrorDisplay(dependencies_file); SWIG_exit(EXIT_FAILURE); } } else if (!depend_only) { String *filename = NewStringf("%s_wrap.%s", basename, depends_extension); f_dependencies_file = NewFile(filename, "w", SWIG_output_files()); if (!f_dependencies_file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } } else f_dependencies_file = stdout; if (dependencies_target) { Printf(f_dependencies_file, "%s: ", Swig_filename_escape_space(dependencies_target)); } else { Printf(f_dependencies_file, "%s: ", Swig_filename_escape_space(outfile)); } List *files = Preprocessor_depend(); List *phony_targets = NewList(); for (int i = 0; i < Len(files); i++) { int use_file = 1; if (depend == 2) { if ((Strncmp(Getitem(files, i), SwigLib, Len(SwigLib)) == 0) || (SwigLibWinUnix && (Strncmp(Getitem(files, i), SwigLibWinUnix, Len(SwigLibWinUnix)) == 0))) use_file = 0; } if (use_file) { Printf(f_dependencies_file, "\\\n %s ", Swig_filename_escape_space(Getitem(files, i))); if (depend_phony) Append(phony_targets, Getitem(files, i)); } } Printf(f_dependencies_file, "\n"); if (depend_phony) { for (int i = 0; i < Len(phony_targets); i++) { Printf(f_dependencies_file, "\n%s:\n", Swig_filename_escape_space(Getitem(phony_targets, i))); } } if (f_dependencies_file != stdout) Delete(f_dependencies_file); if (depend_only) SWIG_exit(EXIT_SUCCESS); Delete(inputfile_filename); Delete(basename); Delete(phony_targets); } else { Printf(stderr, "Cannot generate dependencies with -nopreprocess\n"); // Actually we could but it would be inefficient when just generating dependencies, as it would be done after Swig_cparse SWIG_exit(EXIT_FAILURE); } } Seek(cpps, 0, SEEK_SET); } /* Register a null file with the file handler */ Swig_register_filebyname("null", NewString("")); // Pass control over to the specific language interpreter if (Verbose) { fprintf(stdout, "Starting language-specific parse...\n"); fflush(stdout); } Node *top = Swig_cparse(cpps); if (dump_top & STAGE1) { Printf(stdout, "debug-top stage 1\n"); Swig_print_tree(top); } if (dump_module & STAGE1) { Printf(stdout, "debug-module stage 1\n"); Swig_print_tree(Getattr(top, "module")); } if (!CPlusPlus) { if (Verbose) Printf(stdout, "Processing unnamed structs...\n"); Swig_nested_name_unnamed_c_structs(top); } Swig_extend_unused_check(); if (Verbose) { Printf(stdout, "Processing types...\n"); } Swig_process_types(top); if (dump_top & STAGE2) { Printf(stdout, "debug-top stage 2\n"); Swig_print_tree(top); } if (dump_module & STAGE2) { Printf(stdout, "debug-module stage 2\n"); Swig_print_tree(Getattr(top, "module")); } if (Verbose) { Printf(stdout, "C++ analysis...\n"); } Swig_default_allocators(top); if (CPlusPlus) { if (Verbose) Printf(stdout, "Processing nested classes...\n"); Swig_nested_process_classes(top); } if (dump_top & STAGE3) { Printf(stdout, "debug-top stage 3\n"); Swig_print_tree(top); } if (top && (dump_module & STAGE3)) { Printf(stdout, "debug-module stage 3\n"); Swig_print_tree(Getattr(top, "module")); } if (Verbose) { Printf(stdout, "Generating wrappers...\n"); } if (top && dump_classes) { Hash *classes = Getattr(top, "classes"); if (classes) { Printf(stdout, "Classes\n"); Printf(stdout, "------------\n"); Iterator ki; for (ki = First(classes); ki.key; ki = Next(ki)) { Printf(stdout, "%s\n", ki.key); } } } if (dump_typedef) { SwigType_print_scope(); } if (dump_symtabs) { Swig_symbol_print_tables(Swig_symbol_global_scope()); Swig_symbol_print_tables_summary(); } if (dump_symbols) { Swig_symbol_print_symbols(); } if (dump_csymbols) { Swig_symbol_print_csymbols(); } if (dump_tags) { Swig_print_tags(top, 0); } if (top) { if (!Getattr(top, "name")) { Printf(stderr, "No module name specified using %%module or -module.\n"); SWIG_exit(EXIT_FAILURE); } else { /* Set some filename information on the object */ String *infile = scanner_get_main_input_file(); if (!infile) { Printf(stderr, "Missing input file in preprocessed output.\n"); SWIG_exit(EXIT_FAILURE); } Setattr(top, "infile", infile); // Note: if nopreprocess then infile is the original input file, otherwise input_file Setattr(top, "inputfile", input_file); String *infile_filename = outcurrentdir ? Swig_file_filename(infile): Copy(infile); String *basename = Swig_file_basename(infile_filename); if (!outfile_name) { if (CPlusPlus || lang->cplus_runtime_mode()) { Setattr(top, "outfile", NewStringf("%s_wrap.%s", basename, cpp_extension)); } else { Setattr(top, "outfile", NewStringf("%s_wrap.c", basename)); } } else { Setattr(top, "outfile", outfile_name); } if (!outfile_name_h) { Setattr(top, "outfile_h", NewStringf("%s_wrap.%s", basename, hpp_extension)); } else { Setattr(top, "outfile_h", outfile_name_h); } configure_outdir(Getattr(top, "outfile")); if (Swig_contract_mode_get()) { Swig_contracts(top); } // Check the extension for a c/c++ file. If so, we're going to declare everything we see as "extern" ForceExtern = check_extension(input_file); if (tlm->status == Experimental) { Swig_warning(WARN_LANG_EXPERIMENTAL, "SWIG", 1, "Experimental target language. " "Target language %s specified by %s is an experimental language. " "Please read about SWIG experimental languages, http://swig.org/Doc4.0/Introduction.html#Introduction_experimental_status.\n", tlm->help ? tlm->help : "", tlm->name); } lang->top(top); if (browse) { Swig_browser(top, 0); } Delete(infile_filename); Delete(basename); } } if (dump_lang_symbols) { lang->dumpSymbols(); } if (dump_top & STAGE4) { Printf(stdout, "debug-top stage 4\n"); Swig_print_tree(top); } if (dump_module & STAGE4) { Printf(stdout, "debug-module stage 4\n"); Swig_print_tree(Getattr(top, "module")); } if (dump_xml && top) { delete lang; lang = 0; Swig_print_xml(top, xmlout); } Delete(top); } if (tm_debug) Swig_typemap_debug(); if (memory_debug) DohMemoryDebug(); char *outfiles = getenv("CCACHE_OUTFILES"); if (outfiles) { File *f_outfiles = NewFile(outfiles, "w", 0); if (!f_outfiles) { Printf(stderr, "Failed to write list of output files to the filename '%s' specified in CCACHE_OUTFILES environment variable - ", outfiles); FileErrorDisplay(outfiles); SWIG_exit(EXIT_FAILURE); } else { int i; for (i = 0; i < Len(all_output_files); i++) Printf(f_outfiles, "%s\n", Getitem(all_output_files, i)); Delete(f_outfiles); } } // Deletes Delete(libfiles); Preprocessor_delete(); while (freeze) { } delete lang; int error_count = werror ? Swig_warn_count() : 0; error_count += Swig_error_count(); if (error_count != 0) SWIG_exit(error_count); return 0; } /* ----------------------------------------------------------------------------- * SWIG_exit() * * Cleanup and either freeze or exit * ----------------------------------------------------------------------------- */ void SWIG_exit(int exit_code) { while (freeze) { } if (exit_code > 0) { CloseAllOpenFiles(); /* Remove all generated files */ if (all_output_files) { for (int i = 0; i < Len(all_output_files); i++) { String *filename = Getitem(all_output_files, i); int removed = remove(Char(filename)); if (removed == -1) fprintf(stderr, "On exit, could not delete file %s: %s\n", Char(filename), strerror(errno)); } } } exit(exit_code); } swig-4.0.2/Source/Modules/php.cxx0000644000175000017500000026621713667507523016563 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * php.cxx * * PHP language module for SWIG. * ----------------------------------------------------------------------------- */ /* FIXME: PHP OO wrapping TODO list: * * Medium term: * * Handle default parameters on overloaded methods in PHP where possible. * (Mostly done - just need to handle cases of overloaded methods with * default parameters...) * This is an optimisation - we could handle this case using a PHP * default value, but currently we treat it as we would for a default * value which is a compound C++ expression (i.e. as if we had a * method with two overloaded forms instead of a single method with * a default parameter value). * * Long term: * * Sort out locale-dependent behaviour of strtod() - it's harmless unless * SWIG ever sets the locale and DOH/base.c calls atof, so we're probably * OK currently at least. */ /* * TODO: Replace remaining stderr messages with Swig_error or Swig_warning * (may need to add more WARN_PHP_xxx codes...) */ #include "swigmod.h" #include #include static const char *usage = "\ PHP 7 Options (available with -php7)\n\ -noproxy - Don't generate proxy classes.\n\ -prefix - Prepend to all class names in PHP wrappers\n\ \n"; /* The original class wrappers for PHP stored the pointer to the C++ class in * the object property _cPtr. If we use the same name for the member variable * which we put the pointer to the C++ class in, then the flat function * wrappers will automatically pull it out without any changes being required. * FIXME: Isn't using a leading underscore a bit suspect here? */ #define SWIG_PTR "_cPtr" /* This is the name of the hash where the variables existing only in PHP * classes are stored. */ #define SWIG_DATA "_pData" static int constructors = 0; static String *NOTCLASS = NewString("Not a class"); static Node *classnode = 0; static String *module = 0; static String *cap_module = 0; static String *prefix = 0; static String *shadow_classname = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_runtime_h = 0; static File *f_h = 0; static File *f_phpcode = 0; static File *f_directors = 0; static File *f_directors_h = 0; static String *phpfilename = 0; static String *s_header; static String *s_wrappers; static String *s_init; static String *r_init; // RINIT user code static String *s_shutdown; // MSHUTDOWN user code static String *r_shutdown; // RSHUTDOWN user code static String *s_vinit; // varinit initialization code. static String *s_vdecl; static String *s_cinit; // consttab initialization code. static String *s_oinit; static String *s_arginfo; static String *s_entry; static String *cs_entry; static String *all_cs_entry; static String *pragma_incl; static String *pragma_code; static String *pragma_phpinfo; static String *pragma_version; static String *s_oowrappers; static String *s_fakeoowrappers; static String *s_phpclasses; /* To reduce code size (generated and compiled) we only want to emit each * different arginfo once, so we need to track which have been used. */ static Hash *arginfo_used; /* Variables for using PHP classes */ static Node *current_class = 0; static Hash *shadow_get_vars; static Hash *shadow_set_vars; static Hash *zend_types = 0; static int shadow = 1; static bool class_has_ctor = false; static String *wrapping_member_constant = NULL; // These static variables are used to pass some state from Handlers into functionWrapper static enum { standard = 0, memberfn, staticmemberfn, membervar, staticmembervar, constructor, directorconstructor } wrapperType = standard; extern "C" { static void (*r_prevtracefunc) (const SwigType *t, String *mangled, String *clientdata) = 0; } static void SwigPHP_emit_resource_registrations() { Iterator ki; bool emitted_default_dtor = false; if (!zend_types) return; ki = First(zend_types); if (ki.key) Printf(s_oinit, "\n /* Register resource destructors for pointer types */\n"); while (ki.key) { DOH *key = ki.key; Node *class_node = ki.item; String *human_name = key; String *rsrc_dtor_name = NULL; // write out body if (class_node != NOTCLASS) { String *destructor = Getattr(class_node, "destructor"); human_name = Getattr(class_node, "sym:name"); if (!human_name) human_name = Getattr(class_node, "name"); // Do we have a known destructor for this type? if (destructor) { rsrc_dtor_name = NewStringf("_wrap_destroy%s", key); // Write out custom destructor function Printf(s_wrappers, "static ZEND_RSRC_DTOR_FUNC(%s) {\n", rsrc_dtor_name); Printf(s_wrappers, " %s(res, SWIGTYPE%s->name);\n", destructor, key); Printf(s_wrappers, "}\n"); } } if (!rsrc_dtor_name) { rsrc_dtor_name = NewString("_swig_default_rsrc_destroy"); if (!emitted_default_dtor) { // Write out custom destructor function Printf(s_wrappers, "static ZEND_RSRC_DTOR_FUNC(%s) {\n", rsrc_dtor_name); Printf(s_wrappers, " efree(res->ptr);\n"); Printf(s_wrappers, "}\n"); emitted_default_dtor = true; } } // declare le_swig_ to store php registration Printf(s_vdecl, "static int le_swig_%s=0; /* handle for %s */\n", key, human_name); // register with php Printf(s_oinit, " le_swig_%s=zend_register_list_destructors_ex" "(%s, NULL, SWIGTYPE%s->name, module_number);\n", key, rsrc_dtor_name, key); // store php type in class struct Printf(s_oinit, " SWIG_TypeClientData(SWIGTYPE%s,&le_swig_%s);\n", key, key); Delete(rsrc_dtor_name); ki = Next(ki); } } class PHP : public Language { public: PHP() { director_language = 1; } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("php"); for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-noshadow") == 0) || (strcmp(argv[i], "-noproxy") == 0)) { shadow = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } } Preprocessor_define("SWIGPHP 1", 0); Preprocessor_define("SWIGPHP7 1", 0); SWIG_typemap_lang("php"); SWIG_config_file("php.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { String *filen; /* Check if directors are enabled for this module. */ Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options && Getattr(options, "directors")) { allow_directors(); } } /* Set comparison with null for ConstructorToFunction */ setSubclassInstanceCheck(NewString("Z_TYPE_P($arg) != IS_NULL")); /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); /* main output file */ f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewStringEmpty(); /* sections of the output file */ s_init = NewStringEmpty(); r_init = NewStringEmpty(); s_shutdown = NewStringEmpty(); r_shutdown = NewStringEmpty(); s_header = NewString("/* header section */\n"); s_wrappers = NewString("/* wrapper section */\n"); /* subsections of the init section */ s_vinit = NewStringEmpty(); s_vdecl = NewString("/* vdecl subsection */\n"); s_cinit = NewString(" /* cinit subsection */\n"); s_oinit = NewString(" /* oinit subsection */\n"); pragma_phpinfo = NewStringEmpty(); s_phpclasses = NewString("/* PHP Proxy Classes */\n"); f_directors_h = NewStringEmpty(); f_directors = NewStringEmpty(); if (directorsEnabled()) { f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } /* Register file targets with the SWIG file handler */ Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", s_init); Swig_register_filebyname("rinit", r_init); Swig_register_filebyname("shutdown", s_shutdown); Swig_register_filebyname("rshutdown", r_shutdown); Swig_register_filebyname("header", s_header); Swig_register_filebyname("wrapper", s_wrappers); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGPHP\n#define SWIGPHP\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } /* Set the module name */ module = Copy(Getattr(n, "name")); cap_module = NewStringf("%(upper)s", module); if (!prefix) prefix = NewStringEmpty(); Printf(f_runtime, "#define SWIG_PREFIX \"%s\"\n", prefix); Printf(f_runtime, "#define SWIG_PREFIX_LEN %lu\n", (unsigned long)Len(prefix)); if (directorsEnabled()) { Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", cap_module); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", cap_module); String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "\n#include \"%s\"\n\n", filename); Delete(filename); } /* PHP module file */ filen = NewStringEmpty(); Printv(filen, SWIG_output_directory(), module, ".php", NIL); phpfilename = NewString(filen); f_phpcode = NewFile(filen, "w", SWIG_output_files()); if (!f_phpcode) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Printf(f_phpcode, "error_msg = default_error_msg;\n"); Printf(s_header, " globals->error_code = default_error_code;\n"); Printf(s_header, "}\n"); Printf(s_header, "static void SWIG_ResetError(void) {\n"); Printf(s_header, " SWIG_ErrorMsg() = default_error_msg;\n"); Printf(s_header, " SWIG_ErrorCode() = default_error_code;\n"); Printf(s_header, "}\n"); Append(s_header, "\n"); Printf(s_header, "ZEND_NAMED_FUNCTION(_wrap_swig_%s_alter_newobject) {\n", module); Append(s_header, " zval args[2];\n"); Append(s_header, " swig_object_wrapper *value;\n"); Append(s_header, "\n"); Append(s_header, " SWIG_ResetError();\n"); Append(s_header, " if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) {\n"); Append(s_header, " WRONG_PARAM_COUNT;\n"); Append(s_header, " }\n"); Append(s_header, "\n"); Append(s_header, " value = (swig_object_wrapper *) Z_RES_VAL(args[0]);\n"); Append(s_header, " value->newobject = zval_is_true(&args[1]);\n"); Append(s_header, "\n"); Append(s_header, " return;\n"); Append(s_header, "}\n"); Printf(s_header, "ZEND_NAMED_FUNCTION(_wrap_swig_%s_get_newobject) {\n", module); Append(s_header, " zval args[1];\n"); Append(s_header, " swig_object_wrapper *value;\n"); Append(s_header, "\n"); Append(s_header, " SWIG_ResetError();\n"); Append(s_header, " if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) {\n"); Append(s_header, " WRONG_PARAM_COUNT;\n"); Append(s_header, " }\n"); Append(s_header, "\n"); Append(s_header, " value = (swig_object_wrapper *) Z_RES_VAL(args[0]);\n"); Append(s_header, " RETVAL_LONG(value->newobject);\n"); Append(s_header, "\n"); Append(s_header, " return;\n"); Append(s_header, "}\n"); Printf(s_header, "#define SWIG_name \"%s\"\n", module); Printf(s_header, "#ifdef __cplusplus\n"); Printf(s_header, "extern \"C\" {\n"); Printf(s_header, "#endif\n"); Printf(s_header, "#include \"php.h\"\n"); Printf(s_header, "#include \"php_ini.h\"\n"); Printf(s_header, "#include \"ext/standard/info.h\"\n"); Printf(s_header, "#include \"php_%s.h\"\n", module); Printf(s_header, "#ifdef __cplusplus\n"); Printf(s_header, "}\n"); Printf(s_header, "#endif\n\n"); if (directorsEnabled()) { // Insert director runtime Swig_insert_file("director_common.swg", s_header); Swig_insert_file("director.swg", s_header); } /* Create the .h file too */ filen = NewStringEmpty(); Printv(filen, SWIG_output_directory(), "php_", module, ".h", NIL); f_h = NewFile(filen, "w", SWIG_output_files()); if (!f_h) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Swig_banner(f_h); Printf(f_h, "\n"); Printf(f_h, "#ifndef PHP_%s_H\n", cap_module); Printf(f_h, "#define PHP_%s_H\n\n", cap_module); Printf(f_h, "extern zend_module_entry %s_module_entry;\n", module); Printf(f_h, "#define phpext_%s_ptr &%s_module_entry\n\n", module, module); Printf(f_h, "#ifdef PHP_WIN32\n"); Printf(f_h, "# define PHP_%s_API __declspec(dllexport)\n", cap_module); Printf(f_h, "#else\n"); Printf(f_h, "# define PHP_%s_API\n", cap_module); Printf(f_h, "#endif\n\n"); /* start the arginfo section */ s_arginfo = NewString("/* arginfo subsection */\n"); arginfo_used = NewHash(); /* start the function entry section */ s_entry = NewString("/* entry subsection */\n"); /* holds all the per-class function entry sections */ all_cs_entry = NewString("/* class entry subsection */\n"); cs_entry = NULL; Printf(s_entry, "/* Every non-class user visible function must have an entry here */\n"); Printf(s_entry, "static zend_function_entry %s_functions[] = {\n", module); /* Emit all of the code */ Language::top(n); SwigPHP_emit_resource_registrations(); /* start the init section */ { String * s_init_old = s_init; s_init = NewString("/* init section */\n"); Printv(s_init, "zend_module_entry ", module, "_module_entry = {\n", NIL); Printf(s_init, " STANDARD_MODULE_HEADER,\n"); Printf(s_init, " \"%s\",\n", module); Printf(s_init, " %s_functions,\n", module); Printf(s_init, " PHP_MINIT(%s),\n", module); if (Len(s_shutdown) > 0) { Printf(s_init, " PHP_MSHUTDOWN(%s),\n", module); } else { Printf(s_init, " NULL, /* No MSHUTDOWN code */\n"); } if (Len(r_init) > 0 || Len(s_vinit) > 0) { Printf(s_init, " PHP_RINIT(%s),\n", module); } else { Printf(s_init, " NULL, /* No RINIT code */\n"); } if (Len(r_shutdown) > 0) { Printf(s_init, " PHP_RSHUTDOWN(%s),\n", module); } else { Printf(s_init, " NULL, /* No RSHUTDOWN code */\n"); } if (Len(pragma_phpinfo) > 0) { Printf(s_init, " PHP_MINFO(%s),\n", module); } else { Printf(s_init, " NULL, /* No MINFO code */\n"); } if (Len(pragma_version) > 0) { Printf(s_init, " \"%s\",\n", pragma_version); } else { Printf(s_init, " NO_VERSION_YET,\n"); } Printf(s_init, " STANDARD_MODULE_PROPERTIES\n"); Printf(s_init, "};\n"); Printf(s_init, "zend_module_entry* SWIG_module_entry = &%s_module_entry;\n\n", module); Printf(s_init, "#ifdef __cplusplus\n"); Printf(s_init, "extern \"C\" {\n"); Printf(s_init, "#endif\n"); // We want to write "SWIGEXPORT ZEND_GET_MODULE(%s)" but ZEND_GET_MODULE // in PHP7 has "extern "C" { ... }" around it so we can't do that. Printf(s_init, "SWIGEXPORT zend_module_entry *get_module(void) { return &%s_module_entry; }\n", module); Printf(s_init, "#ifdef __cplusplus\n"); Printf(s_init, "}\n"); Printf(s_init, "#endif\n\n"); Printf(s_init, "#define SWIG_php_minit PHP_MINIT_FUNCTION(%s)\n\n", module); Printv(s_init, s_init_old, NIL); Delete(s_init_old); } /* We have to register the constants before they are (possibly) used * by the pointer typemaps. This all needs re-arranging really as * things are being called in the wrong order */ // Printv(s_init,s_resourcetypes,NIL); /* We need this after all classes written out by ::top */ Printf(s_oinit, " CG(active_class_entry) = NULL;\n"); Printf(s_oinit, " /* end oinit subsection */\n"); Printf(s_init, "%s\n", s_oinit); /* Constants generated during top call */ Printf(s_cinit, " /* end cinit subsection */\n"); Printf(s_init, "%s\n", s_cinit); Clear(s_cinit); Delete(s_cinit); Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); // Now do REQUEST init which holds any user specified %rinit, and also vinit if (Len(r_init) > 0 || Len(s_vinit) > 0) { Printf(f_h, "PHP_RINIT_FUNCTION(%s);\n", module); Printf(s_init, "PHP_RINIT_FUNCTION(%s)\n{\n", module); if (Len(r_init) > 0) { Printv(s_init, "/* rinit section */\n", r_init, "\n", NIL); } if (Len(s_vinit) > 0) { /* finish our init section which will have been used by class wrappers */ Printv(s_init, " /* vinit subsection */\n", s_vinit, "\n" " /* end vinit subsection */\n", NIL); Clear(s_vinit); } Delete(s_vinit); Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); } Printf(f_h, "PHP_MINIT_FUNCTION(%s);\n", module); if (Len(s_shutdown) > 0) { Printf(f_h, "PHP_MSHUTDOWN_FUNCTION(%s);\n", module); Printv(s_init, "PHP_MSHUTDOWN_FUNCTION(", module, ")\n" "/* shutdown section */\n" "{\n", s_shutdown, " return SUCCESS;\n" "}\n\n", NIL); } if (Len(r_shutdown) > 0) { Printf(f_h, "PHP_RSHUTDOWN_FUNCTION(%s);\n", module); Printf(s_init, "PHP_RSHUTDOWN_FUNCTION(%s)\n{\n", module); Printf(s_init, "/* rshutdown section */\n"); Printf(s_init, "%s\n", r_shutdown); Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); } if (Len(pragma_phpinfo) > 0) { Printf(f_h, "PHP_MINFO_FUNCTION(%s);\n", module); Printf(s_init, "PHP_MINFO_FUNCTION(%s)\n{\n", module); Printf(s_init, "%s", pragma_phpinfo); Printf(s_init, "}\n"); } Printf(s_init, "/* end init section */\n"); Printf(f_h, "\n#endif /* PHP_%s_H */\n", cap_module); Delete(f_h); String *type_table = NewStringEmpty(); SwigType_emit_type_table(f_runtime, type_table); Printf(s_header, "%s", type_table); Delete(type_table); /* Oh dear, more things being called in the wrong order. This whole * function really needs totally redoing. */ if (directorsEnabled()) { Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); } Printf(s_header, "/* end header section */\n"); Printf(s_wrappers, "/* end wrapper section */\n"); Printf(s_vdecl, "/* end vdecl subsection */\n"); Dump(f_runtime, f_begin); Printv(f_begin, s_header, NIL); if (directorsEnabled()) { Dump(f_directors, f_begin); } Printv(f_begin, s_vdecl, s_wrappers, NIL); Printv(f_begin, all_cs_entry, "\n\n", s_arginfo, "\n\n", s_entry, " SWIG_ZEND_NAMED_FE(swig_", module, "_alter_newobject,_wrap_swig_", module, "_alter_newobject,NULL)\n" " SWIG_ZEND_NAMED_FE(swig_", module, "_get_newobject,_wrap_swig_", module, "_get_newobject,NULL)\n" " ZEND_FE_END\n};\n\n", NIL); Printv(f_begin, s_init, NIL); Delete(s_header); Delete(s_wrappers); Delete(s_init); Delete(s_vdecl); Delete(all_cs_entry); Delete(s_entry); Delete(s_arginfo); Delete(f_runtime); Delete(f_begin); Delete(arginfo_used); Printf(f_phpcode, "%s\n%s\n", pragma_incl, pragma_code); if (s_fakeoowrappers) { Printf(f_phpcode, "abstract class %s {", Len(prefix) ? prefix : module); Printf(f_phpcode, "%s", s_fakeoowrappers); Printf(f_phpcode, "}\n\n"); Delete(s_fakeoowrappers); s_fakeoowrappers = NULL; } Printf(f_phpcode, "%s\n", s_phpclasses); Delete(f_phpcode); return SWIG_OK; } /* Just need to append function names to function table to register with PHP. */ void create_command(String *cname, String *iname, Node *n) { // This is for the single main zend_function_entry record Printf(f_h, "ZEND_NAMED_FUNCTION(%s);\n", iname); // We want to only emit each different arginfo once, as that reduces the // size of both the generated source code and the compiled extension // module. To do this, we name the arginfo to encode the number of // parameters and which (if any) are passed by reference by using a // sequence of 0s (for non-reference) and 1s (for by references). ParmList *l = Getattr(n, "parms"); String * arginfo_code = NewStringEmpty(); for (Parm *p = l; p; p = Getattr(p, "tmap:in:next")) { /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } Append(arginfo_code, GetFlag(p, "tmap:in:byref") ? "1" : "0"); } if (!GetFlag(arginfo_used, arginfo_code)) { // Not had this one before, so emit it. SetFlag(arginfo_used, arginfo_code); Printf(s_arginfo, "ZEND_BEGIN_ARG_INFO_EX(swig_arginfo_%s, 0, 0, 0)\n", arginfo_code); for (const char * p = Char(arginfo_code); *p; ++p) { Printf(s_arginfo, " ZEND_ARG_PASS_INFO(%c)\n", *p); } Printf(s_arginfo, "ZEND_END_ARG_INFO()\n"); } String * s = cs_entry; if (!s) s = s_entry; Printf(s, " SWIG_ZEND_NAMED_FE(%(lower)s,%s,swig_arginfo_%s)\n", cname, iname, arginfo_code); Delete(arginfo_code); } /* ------------------------------------------------------------ * dispatchFunction() * ------------------------------------------------------------ */ void dispatchFunction(Node *n) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewStringEmpty(); if (Swig_directorclass(n) && wrapperType == directorconstructor) { /* We have an extra 'this' parameter. */ SetFlag(n, "wrap:this"); } String *dispatch = Swig_overload_dispatch(n, "%s(INTERNAL_FUNCTION_PARAM_PASSTHRU); return;", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); create_command(symname, wname, n); Printv(f->def, "ZEND_NAMED_FUNCTION(", wname, ") {\n", NIL); Wrapper_add_local(f, "argc", "int argc"); Printf(tmp, "zval argv[%d]", maxargs); Wrapper_add_local(f, "argv", tmp); Printf(f->code, "argc = ZEND_NUM_ARGS();\n"); Printf(f->code, "zend_get_parameters_array_ex(argc, argv);\n"); Replaceall(dispatch, "$args", "self,args"); Printv(f->code, dispatch, "\n", NIL); Printf(f->code, "SWIG_ErrorCode() = E_ERROR;\n"); Printf(f->code, "SWIG_ErrorMsg() = \"No matching function for overloaded '%s'\";\n", symname); Printv(f->code, "SWIG_FAIL();\n", NIL); Printv(f->code, "}\n", NIL); Wrapper_print(f, s_wrappers); DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } /* ------------------------------------------------------------ * functionWrapper() * ------------------------------------------------------------ */ /* Helper method for PHP::functionWrapper */ bool is_class(SwigType *t) { Node *n = classLookup(t); if (n) { String *r = Getattr(n, "php:proxy"); // Set by classDeclaration() if (!r) r = Getattr(n, "sym:name"); // Not seen by classDeclaration yet, but this is the name if (r) return true; } return false; } virtual int functionWrapper(Node *n) { String *name = GetChar(n, "name"); String *iname = GetChar(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *nodeType = Getattr(n, "nodeType"); int newobject = GetFlag(n, "feature:new"); int constructor = (Cmp(nodeType, "constructor") == 0); Parm *p; int i; int numopt; String *tm; Wrapper *f; String *wname; int overloaded = 0; String *overname = 0; if (Cmp(nodeType, "destructor") == 0) { // We just generate the Zend List Destructor and let Zend manage the // reference counting. There's no explicit destructor, but the user can // just do `$obj = null;' to remove a reference to an object. return CreateZendListDestructor(n); } // Test for overloading; if (Getattr(n, "sym:overloaded")) { overloaded = 1; overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } wname = Swig_name_wrapper(iname); if (overname) { Printf(wname, "%s", overname); } f = NewWrapper(); String *outarg = NewStringEmpty(); String *cleanup = NewStringEmpty(); Printv(f->def, "ZEND_NAMED_FUNCTION(", wname, ") {\n", NIL); emit_parameter_variables(l, f); /* Attach standard typemaps */ emit_attach_parmmaps(l, f); // Not issued for overloaded functions. if (!overloaded) { create_command(iname, wname, n); } // wrap:parms is used by overload resolution. Setattr(n, "wrap:parms", l); int num_arguments = emit_num_arguments(l); int num_required = emit_num_required(l); numopt = num_arguments - num_required; if (wrapperType == directorconstructor) num_arguments++; if (num_arguments > 0) { String *args = NewStringEmpty(); if (wrapperType == directorconstructor) Wrapper_add_local(f, "arg0", "zval * arg0"); Printf(args, "zval args[%d]", num_arguments); Wrapper_add_local(f, "args", args); Delete(args); args = NULL; } // This generated code may be called: // 1) as an object method, or // 2) as a class-method/function (without a "this_ptr") // Option (1) has "this_ptr" for "this", option (2) needs it as // first parameter // NOTE: possible we ignore this_ptr as a param for native constructor Printf(f->code, "SWIG_ResetError();\n"); if (numopt > 0) { // membervariable wrappers do not have optional args Wrapper_add_local(f, "arg_count", "int arg_count"); Printf(f->code, "arg_count = ZEND_NUM_ARGS();\n"); Printf(f->code, "if(arg_count<%d || arg_count>%d ||\n", num_required, num_arguments); Printf(f->code, " zend_get_parameters_array_ex(arg_count,args)!=SUCCESS)\n"); Printf(f->code, "\tWRONG_PARAM_COUNT;\n\n"); } else { if (num_arguments == 0) { Printf(f->code, "if(ZEND_NUM_ARGS() != 0) {\n"); } else { Printf(f->code, "if(ZEND_NUM_ARGS() != %d || zend_get_parameters_array_ex(%d, args) != SUCCESS) {\n", num_arguments, num_arguments); } Printf(f->code, "WRONG_PARAM_COUNT;\n}\n\n"); } if (wrapperType == directorconstructor) Printf(f->code, "arg0 = &args[0];\n \n"); /* Now convert from PHP to C variables */ // At this point, argcount if used is the number of deliberately passed args // not including this_ptr even if it is used. // It means error messages may be out by argbase with error // reports. We can either take argbase into account when raising // errors, or find a better way of dealing with _thisptr. // I would like, if objects are wrapped, to assume _thisptr is always // _this and not the first argument. // This may mean looking at Language::memberfunctionHandler int limit = num_arguments; if (wrapperType == directorconstructor) limit--; for (i = 0, p = l; i < limit; i++) { String *source; /* Skip ignored arguments */ //while (Getattr(p,"tmap:ignore")) { p = Getattr(p,"tmap:ignore:next");} while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); if (wrapperType == directorconstructor) { source = NewStringf("args[%d]", i+1); } else { source = NewStringf("args[%d]", i); } String *ln = Getattr(p, "lname"); /* Check if optional */ if (i >= num_required) { Printf(f->code, "\tif(arg_count > %d) {\n", i); } if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", &source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printf(f->code, "%s\n", tm); if (i == 0 && Getattr(p, "self")) { Printf(f->code, "\tif(!arg1) SWIG_PHP_Error(E_ERROR, \"this pointer is NULL\");\n"); } p = Getattr(p, "tmap:in:next"); if (i >= num_required) { Printf(f->code, "}\n"); } continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); } if (i >= num_required) { Printf(f->code, "\t}\n"); } Delete(source); } if (is_member_director(n)) { Wrapper_add_local(f, "upcall", "bool upcall = false"); Printf(f->code, "upcall = !Swig::Director::swig_is_overridden_method(\"%s%s\", \"%s\");\n", prefix, Swig_class_name(Swig_methodclass(n)), name); } Swig_director_emit_dynamic_cast(n, f); /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ bool hasargout = false; for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:argout")) && Len(tm)) { hasargout = true; Replaceall(tm, "$source", Getattr(p, "lname")); // Replaceall(tm,"$input",Getattr(p,"lname")); Replaceall(tm, "$target", "return_value"); Replaceall(tm, "$result", "return_value"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } Setattr(n, "wrap:name", wname); /* emit function call */ String *actioncode = emit_action(n); if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "return_value"); Replaceall(tm, "$result", "return_value"); Replaceall(tm, "$owner", newobject ? "1" : "0"); Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); if (outarg) { Printv(f->code, outarg, NIL); } if (cleanup) { Printv(f->code, cleanup, NIL); } /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Printf(f->code, "%s\n", tm); Delete(tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Printf(f->code, "%s\n", tm); Delete(tm); } Printf(f->code, "thrown:\n"); Printf(f->code, "return;\n"); /* Error handling code */ Printf(f->code, "fail:\n"); Printv(f->code, cleanup, NIL); Append(f->code, "SWIG_FAIL();\n"); Printf(f->code, "}\n"); Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); Wrapper_print(f, s_wrappers); DelWrapper(f); f = NULL; if (overloaded && !Getattr(n, "sym:nextSibling")) { dispatchFunction(n); } Delete(wname); wname = NULL; if (!shadow) { return SWIG_OK; } // Handle getters and setters. if (wrapperType == membervar) { const char *p = Char(iname); if (strlen(p) > 4) { p += strlen(p) - 4; String *varname = Getattr(n, "membervariableHandler:sym:name"); if (strcmp(p, "_get") == 0) { Setattr(shadow_get_vars, varname, Getattr(n, "type")); } else if (strcmp(p, "_set") == 0) { Setattr(shadow_set_vars, varname, iname); } } return SWIG_OK; } // Only look at non-overloaded methods and the last entry in each overload // chain (we check the last so that wrap:parms and wrap:name have been set // for them all). if (overloaded && Getattr(n, "sym:nextSibling") != 0) return SWIG_OK; if (!s_oowrappers) s_oowrappers = NewStringEmpty(); if (newobject || wrapperType == memberfn || wrapperType == staticmemberfn || wrapperType == standard || wrapperType == staticmembervar) { bool handle_as_overload = false; String **arg_names; String **arg_values; unsigned char * byref; // Method or static method or plain function. const char *methodname = 0; String *output = s_oowrappers; if (constructor) { class_has_ctor = true; // Skip the Foo:: prefix. char *ptr = strrchr(GetChar(current_class, "sym:name"), ':'); if (ptr) { ptr++; } else { ptr = GetChar(current_class, "sym:name"); } if (strcmp(ptr, GetChar(n, "constructorHandler:sym:name")) == 0) { methodname = "__construct"; } else { // The class has multiple constructors and this one is // renamed, so this will be a static factory function methodname = GetChar(n, "constructorHandler:sym:name"); } } else if (wrapperType == memberfn) { methodname = Char(Getattr(n, "memberfunctionHandler:sym:name")); } else if (wrapperType == staticmemberfn) { methodname = Char(Getattr(n, "staticmemberfunctionHandler:sym:name")); } else if (wrapperType == staticmembervar) { // Static member variable, wrapped as a function due to PHP limitations. methodname = Char(Getattr(n, "staticmembervariableHandler:sym:name")); } else { // wrapperType == standard methodname = Char(iname); if (!s_fakeoowrappers) s_fakeoowrappers = NewStringEmpty(); output = s_fakeoowrappers; } bool really_overloaded = overloaded ? true : false; int min_num_of_arguments = emit_num_required(l); int max_num_of_arguments = emit_num_arguments(l); Hash *ret_types = NewHash(); Setattr(ret_types, d, d); bool non_void_return = (Cmp(d, "void") != 0); if (overloaded) { // Look at all the overloaded versions of this method in turn to // decide if it's really an overloaded method, or just one where some // parameters have default values. Node *o = Getattr(n, "sym:overloaded"); while (o) { if (o == n) { o = Getattr(o, "sym:nextSibling"); continue; } SwigType *d2 = Getattr(o, "type"); if (!d2) { assert(constructor); } else if (!Getattr(ret_types, d2)) { Setattr(ret_types, d2, d2); non_void_return = non_void_return || (Cmp(d2, "void") != 0); } ParmList *l2 = Getattr(o, "wrap:parms"); int num_arguments = emit_num_arguments(l2); int num_required = emit_num_required(l2); if (num_required < min_num_of_arguments) min_num_of_arguments = num_required; if (num_arguments > max_num_of_arguments) { max_num_of_arguments = num_arguments; } o = Getattr(o, "sym:nextSibling"); } o = Getattr(n, "sym:overloaded"); while (o) { if (o == n) { o = Getattr(o, "sym:nextSibling"); continue; } ParmList *l2 = Getattr(o, "wrap:parms"); Parm *p = l, *p2 = l2; if (wrapperType == memberfn) { p = nextSibling(p); p2 = nextSibling(p2); } while (p && p2) { if (Cmp(Getattr(p, "type"), Getattr(p2, "type")) != 0) break; if (Cmp(Getattr(p, "name"), Getattr(p2, "name")) != 0) break; String *value = Getattr(p, "value"); String *value2 = Getattr(p2, "value"); if (value && !value2) break; if (!value && value2) break; if (value) { if (Cmp(value, value2) != 0) break; } p = nextSibling(p); p2 = nextSibling(p2); } if (p && p2) break; // One parameter list is a prefix of the other, so check that all // remaining parameters of the longer list are optional. if (p2) p = p2; while (p && Getattr(p, "value")) p = nextSibling(p); if (p) break; o = Getattr(o, "sym:nextSibling"); } if (!o) { // This "overloaded method" is really just one with default args. really_overloaded = false; } } if (wrapperType == memberfn) { // Allow for the "this" pointer. --min_num_of_arguments; --max_num_of_arguments; } arg_names = (String **) malloc(max_num_of_arguments * sizeof(String *)); if (!arg_names) { /* FIXME: How should this be handled? The rest of SWIG just seems * to not bother checking for malloc failing! */ fprintf(stderr, "Malloc failed!\n"); SWIG_exit(EXIT_FAILURE); } for (i = 0; i < max_num_of_arguments; ++i) { arg_names[i] = NULL; } arg_values = (String **) malloc(max_num_of_arguments * sizeof(String *)); byref = (unsigned char *) malloc(max_num_of_arguments); if (!arg_values || !byref) { /* FIXME: How should this be handled? The rest of SWIG just seems * to not bother checking for malloc failing! */ fprintf(stderr, "Malloc failed!\n"); SWIG_exit(EXIT_FAILURE); } for (i = 0; i < max_num_of_arguments; ++i) { arg_values[i] = NULL; byref[i] = false; } Node *o; if (overloaded) { o = Getattr(n, "sym:overloaded"); } else { o = n; } while (o) { int argno = 0; Parm *p = Getattr(o, "wrap:parms"); if (wrapperType == memberfn) p = nextSibling(p); while (p) { if (GetInt(p, "tmap:in:numinputs") == 0) { p = nextSibling(p); continue; } assert(0 <= argno && argno < max_num_of_arguments); byref[argno] = GetFlag(p, "tmap:in:byref"); String *&pname = arg_names[argno]; const char *pname_cstr = GetChar(p, "name"); // Just get rid of the C++ namespace part for now. const char *ptr = NULL; if (pname_cstr && (ptr = strrchr(pname_cstr, ':'))) { pname_cstr = ptr + 1; } if (!pname_cstr) { // Unnamed parameter, e.g. int foo(int); } else if (!pname) { pname = NewString(pname_cstr); } else { size_t len = strlen(pname_cstr); size_t spc = 0; size_t len_pname = strlen(Char(pname)); while (spc + len <= len_pname) { if (strncmp(pname_cstr, Char(pname) + spc, len) == 0) { char ch = ((char *) Char(pname))[spc + len]; if (ch == '\0' || ch == ' ') { // Already have this pname_cstr. pname_cstr = NULL; break; } } char *p = strchr(Char(pname) + spc, ' '); if (!p) break; spc = (p + 4) - Char(pname); } if (pname_cstr) { Printf(pname, " or_%s", pname_cstr); } } String *value = NewString(Getattr(p, "value")); if (Len(value)) { /* Check that value is a valid constant in PHP (and adjust it if * necessary, or replace it with "?" if it's just not valid). */ SwigType *type = Getattr(p, "type"); switch (SwigType_type(type)) { case T_BOOL: { if (Strcmp(value, "true") == 0 || Strcmp(value, "false") == 0) break; char *p; errno = 0; long n = strtol(Char(value), &p, 0); Clear(value); if (errno || *p) { Append(value, "?"); } else if (n) { Append(value, "true"); } else { Append(value, "false"); } break; } case T_CHAR: case T_SCHAR: case T_SHORT: case T_INT: case T_LONG: case T_LONGLONG: { char *p; errno = 0; long n = strtol(Char(value), &p, 0); (void) n; if (errno || *p) { Clear(value); Append(value, "?"); } break; } case T_UCHAR: case T_USHORT: case T_UINT: case T_ULONG: case T_ULONGLONG: { char *p; errno = 0; unsigned int n = strtoul(Char(value), &p, 0); (void) n; if (errno || *p) { Clear(value); Append(value, "?"); } break; } case T_FLOAT: case T_DOUBLE: case T_LONGDOUBLE: { char *p; errno = 0; /* FIXME: strtod is locale dependent... */ double val = strtod(Char(value), &p); if (errno || *p) { Clear(value); Append(value, "?"); } else if (strchr(Char(value), '.') == 0) { // Ensure value is a double constant, not an integer one. Append(value, ".0"); double val2 = strtod(Char(value), &p); if (errno || *p || val != val2) { Clear(value); Append(value, "?"); } } break; } case T_STRING: if (Len(value) < 2) { // How can a string (including "" be less than 2 characters?) Clear(value); Append(value, "?"); } else { const char *v = Char(value); if (v[0] != '"' || v[Len(value) - 1] != '"') { Clear(value); Append(value, "?"); } // Strings containing "$" require special handling, but we do // that later. } break; case T_VOID: assert(false); break; case T_POINTER: { const char *v = Char(value); if (v[0] == '(') { // Handle "(void*)0", "(TYPE*)0", "(char*)NULL", etc. v += strcspn(v + 1, "*()") + 1; if (*v == '*') { do { v++; v += strspn(v, " \t"); } while (*v == '*'); if (*v++ == ')') { v += strspn(v, " \t"); String * old = value; value = NewString(v); Delete(old); } } } if (Strcmp(value, "NULL") == 0 || Strcmp(value, "nullptr") == 0 || Strcmp(value, "0") == 0 || Strcmp(value, "0L") == 0) { Clear(value); Append(value, "null"); } else { Clear(value); Append(value, "?"); } break; } default: /* Safe default */ Clear(value); Append(value, "?"); break; } if (!arg_values[argno]) { arg_values[argno] = value; value = NULL; } else if (Cmp(arg_values[argno], value) != 0) { // If a parameter has two different default values in // different overloaded forms of the function, we can't // set its default in PHP. Flag this by setting its // default to `?'. Delete(arg_values[argno]); arg_values[argno] = NewString("?"); } } else if (arg_values[argno]) { // This argument already has a default value in another overloaded // form, but doesn't in this form. So don't try to do anything // clever, just let the C wrappers resolve the overload and set the // default values. // // This handling is safe, but I'm wondering if it may be overly // conservative (FIXME) in some cases. It seems it's only bad when // there's an overloaded form with the appropriate number of // parameters which doesn't want the default value, but I need to // think about this more. Delete(arg_values[argno]); arg_values[argno] = NewString("?"); } Delete(value); p = nextSibling(p); ++argno; } if (!really_overloaded) break; o = Getattr(o, "sym:nextSibling"); } /* Clean up any parameters which haven't yet got names, or whose * names clash. */ Hash *seen = NewHash(); /* We need $this to refer to the current class, so can't allow it * to be used as a parameter. */ Setattr(seen, "this", seen); for (int argno = 0; argno < max_num_of_arguments; ++argno) { String *&pname = arg_names[argno]; if (pname) { Replaceall(pname, " ", "_"); } else { /* We get here if the SWIG .i file has "int foo(int);" */ pname = NewStringEmpty(); Printf(pname, "arg%d", argno + 1); } // Check if we've already used this parameter name. while (Getattr(seen, pname)) { // Append "_" to clashing names until they stop clashing... Printf(pname, "_"); } Setattr(seen, Char(pname), seen); if (arg_values[argno] && Cmp(arg_values[argno], "?") == 0) { handle_as_overload = true; } } Delete(seen); seen = NULL; String *invoke = NewStringEmpty(); String *prepare = NewStringEmpty(); String *args = NewStringEmpty(); if (!handle_as_overload && !(really_overloaded && max_num_of_arguments > min_num_of_arguments)) { Printf(invoke, "%s(", iname); if (wrapperType == memberfn) { Printf(invoke, "$this->%s", SWIG_PTR); } for (int i = 0; i < max_num_of_arguments; ++i) { if (i) Printf(args, ","); if (i || wrapperType == memberfn) Printf(invoke, ","); if (byref[i]) Printf(args, "&"); String *value = arg_values[i]; if (value) { const char *v = Char(value); if (v[0] == '"') { /* In a PHP double quoted string, $ needs to be escaped as \$. */ Replaceall(value, "$", "\\$"); } Printf(args, "$%s=%s", arg_names[i], value); } else if (constructor && strcmp(methodname, "__construct") == 0 && i >= 1 && i < min_num_of_arguments) { // We need to be able to call __construct($resource). Printf(args, "$%s=null", arg_names[i]); } else { Printf(args, "$%s", arg_names[i]); } Printf(invoke, "$%s", arg_names[i]); } Printf(invoke, ")"); } else { int i; for (i = 0; i < min_num_of_arguments; ++i) { if (i) Printf(args, ","); Printf(args, "$%s", arg_names[i]); } String *invoke_args = NewStringEmpty(); if (wrapperType == memberfn) { Printf(invoke_args, "$this->%s", SWIG_PTR); if (min_num_of_arguments > 0) Printf(invoke_args, ","); } Printf(invoke_args, "%s", args); if (constructor && min_num_of_arguments > 1) { // We need to be able to call __construct($resource). Clear(args); Printf(args, "$%s", arg_names[0]); for (i = 1; i < min_num_of_arguments; ++i) { Printf(args, ","); Printf(args, "$%s=null", arg_names[i]); } } bool had_a_case = false; int last_handled_i = i - 1; for (; i < max_num_of_arguments; ++i) { if (i) Printf(args, ","); const char *value = Char(arg_values[i]); // FIXME: (really_overloaded && handle_as_overload) is perhaps a // little conservative, but it doesn't hit any cases that it // shouldn't for Xapian at least (and we need it to handle // "Enquire::get_mset()" correctly). bool non_php_default = ((really_overloaded && handle_as_overload) || !value || strcmp(value, "?") == 0); if (non_php_default) value = "null"; Printf(args, "$%s=%s", arg_names[i], value); if (non_php_default) { if (!had_a_case) { Printf(prepare, "\t\tswitch (func_num_args()) {\n"); had_a_case = true; } Printf(prepare, "\t\t"); while (last_handled_i < i) { Printf(prepare, "case %d: ", ++last_handled_i); } if (non_void_return) { if ((!directorsEnabled() || !Swig_directorclass(n)) && !constructor) { Append(prepare, "$r="); } else if (wrapperType == staticmemberfn || wrapperType == staticmembervar) { Append(prepare, "$r="); } else { Printf(prepare, "$this->%s=", SWIG_PTR); } } if (!directorsEnabled() || !Swig_directorclass(n) || !constructor) { Printf(prepare, "%s(%s); break;\n", iname, invoke_args); } else if (!i) { Printf(prepare, "%s($_this%s); break;\n", iname, invoke_args); } else { Printf(prepare, "%s($_this, %s); break;\n", iname, invoke_args); } } if (i || wrapperType == memberfn) Printf(invoke_args, ","); Printf(invoke_args, "$%s", arg_names[i]); } Printf(prepare, "\t\t"); if (had_a_case) Printf(prepare, "default: "); if (non_void_return) { if ((!directorsEnabled() || !Swig_directorclass(n)) && !constructor) { Append(prepare, "$r="); } else if (wrapperType == staticmemberfn || wrapperType == staticmembervar) { Append(prepare, "$r="); } else { Printf(prepare, "$this->%s=", SWIG_PTR); } } if (!directorsEnabled() || !Swig_directorclass(n) || !constructor) { Printf(prepare, "%s(%s);\n", iname, invoke_args); } else { Printf(prepare, "%s($_this, %s);\n", iname, invoke_args); } if (had_a_case) Printf(prepare, "\t\t}\n"); Delete(invoke_args); Printf(invoke, "$r"); } Printf(output, "\n"); // If it's a member function or a class constructor... if (wrapperType == memberfn || (constructor && current_class)) { String *acc = NewString(Getattr(n, "access")); // If a base has the same method with public access, then PHP // requires to have it here as public as well Node *bases = Getattr(Swig_methodclass(n), "bases"); if (bases && Strcmp(acc, "public") != 0) { String *warnmsg = 0; int haspublicbase = 0; Iterator i = First(bases); while (i.item) { Node *j = firstChild(i.item); while (j) { String *jname = Getattr(j, "name"); if (!jname || Strcmp(jname, Getattr(n, "name")) != 0) { j = nextSibling(j); continue; } if (Strcmp(nodeType(j), "cdecl") == 0) { if (!Getattr(j, "access") || checkAttribute(j, "access", "public")) { haspublicbase = 1; } } else if (Strcmp(nodeType(j), "using") == 0 && firstChild(j) && Strcmp(nodeType(firstChild(j)), "cdecl") == 0) { if (!Getattr(firstChild(j), "access") || checkAttribute(firstChild(j), "access", "public")) { haspublicbase = 1; } } if (haspublicbase) { warnmsg = NewStringf("Modifying the access of '%s::%s' to public, as the base '%s' has it as public as well.\n", Getattr(current_class, "classtype"), Getattr(n, "name"), Getattr(i.item, "classtype")); break; } j = nextSibling(j); } i = Next(i); if (haspublicbase) { break; } } if (Getattr(n, "access") && haspublicbase) { Delete(acc); acc = NewStringEmpty(); // implicitly public Swig_warning(WARN_PHP_PUBLIC_BASE, input_file, line_number, Char(warnmsg)); Delete(warnmsg); } } if (Cmp(acc, "public") == 0) { // The default visibility for methods is public, so don't specify // that explicitly to keep the wrapper size down. Delete(acc); acc = NewStringEmpty(); } else if (Cmp(acc, "") != 0) { Append(acc, " "); } if (constructor) { // Discriminate between the PHP constructor and a C++ constructor // renamed to become a factory function in PHP. bool php_constructor = (strcmp(methodname, "__construct") == 0); const char * arg0 = NULL; if (max_num_of_arguments > 0) { arg0 = Char(arg_names[0]); } else if (php_constructor) { // The PHP constructor needs to be able to wrap a resource, but a // renamed constructor doesn't. arg0 = "res"; Delete(args); args = NewString("$res=null"); } String *mangled_type = SwigType_manglestr(Getattr(n, "type")); if (!php_constructor) { // A renamed constructor should be a static method. Append(acc, "static "); } Printf(output, "\t%sfunction %s(%s) {\n", acc, methodname, args); if (php_constructor) { // The PHP constructor needs to be able to wrap a resource, but a // renamed constructor doesn't. Printf(output, "\t\tif (is_resource($%s) && get_resource_type($%s) === '%s') {\n", arg0, arg0, mangled_type); Printf(output, "\t\t\t$this->%s=$%s;\n", SWIG_PTR, arg0); Printf(output, "\t\t\treturn;\n"); Printf(output, "\t\t}\n"); } } else { Printf(output, "\t%sfunction %s(%s) {\n", acc, methodname, args); } Delete(acc); } else if (wrapperType == staticmembervar) { // We're called twice for a writable static member variable - first // with "foo_set" and then with "foo_get" - so generate half the // wrapper function each time. // // For a const static member, we only get called once. static bool started = false; if (!started) { Printf(output, "\tstatic function %s() {\n", methodname); if (max_num_of_arguments) { // Setter. Printf(output, "\t\tif (func_num_args()) {\n"); Printf(output, "\t\t\t%s(func_get_arg(0));\n", iname); Printf(output, "\t\t\treturn;\n"); Printf(output, "\t\t}\n"); started = true; goto done; } } started = false; } else { Printf(output, "\tstatic function %s(%s) {\n", methodname, args); } if (!constructor) Printf(output, "%s", prepare); if (constructor) { if (!directorsEnabled() || !Swig_directorclass(n)) { if (!Len(prepare)) { if (strcmp(methodname, "__construct") == 0) { Printf(output, "\t\t$this->%s=%s;\n", SWIG_PTR, invoke); } else { String *classname = Swig_class_name(current_class); Printf(output, "\t\treturn new %s%s(%s);\n", prefix, classname, invoke); } } } else { Node *parent = Swig_methodclass(n); String *classname = Swig_class_name(parent); Printf(output, "\t\tif (get_class($this) === '%s%s') {\n", prefix, classname); Printf(output, "\t\t\t$_this = null;\n"); Printf(output, "\t\t} else {\n"); Printf(output, "\t\t\t$_this = $this;\n"); Printf(output, "\t\t}\n"); if (!Len(prepare)) { if (num_arguments > 1) { Printf(output, "\t\t$this->%s=%s($_this, %s);\n", SWIG_PTR, iname, args); } else { Printf(output, "\t\t$this->%s=%s($_this);\n", SWIG_PTR, iname); } } } Printf(output, "%s", prepare); } else if (!non_void_return && !hasargout) { if (Cmp(invoke, "$r") != 0) Printf(output, "\t\t%s;\n", invoke); } else if (is_class(d)) { if (Cmp(invoke, "$r") != 0) Printf(output, "\t\t$r=%s;\n", invoke); if (Len(ret_types) == 1) { /* If d is abstract we can't create a new wrapper type d. */ Node *d_class = classLookup(d); int is_abstract = 0; if (Getattr(d_class, "abstracts")) { is_abstract = 1; } if (newobject || !is_abstract) { Printf(output, "\t\tif (is_resource($r)) {\n"); if (Getattr(classLookup(Getattr(n, "type")), "module")) { /* * _p_Foo -> Foo, _p_ns__Bar -> Bar * TODO: do this in a more elegant way */ if (Len(prefix) == 0) { Printf(output, "\t\t\t$c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3));\n"); } else { Printf(output, "\t\t\t$c='%s'.substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3));\n", prefix); } Printf(output, "\t\t\tif (class_exists($c)) return new $c($r);\n"); Printf(output, "\t\t\treturn new %s%s($r);\n", prefix, Getattr(classLookup(d), "sym:name")); } else { Printf(output, "\t\t\t$c = new stdClass();\n"); Printf(output, "\t\t\t$c->" SWIG_PTR " = $r;\n"); Printf(output, "\t\t\treturn $c;\n"); } Printf(output, "\t\t}\n\t\treturn $r;\n"); } else { Printf(output, "\t\t$this->%s = $r;\n", SWIG_PTR); Printf(output, "\t\treturn $this;\n"); } } else { Printf(output, "\t\tif (!is_resource($r)) return $r;\n"); String *wrapobj = NULL; String *common = NULL; Iterator i = First(ret_types); while (i.item) { SwigType *ret_type = i.item; i = Next(i); String *mangled = NewString("_p"); Printf(mangled, "%s", SwigType_manglestr(ret_type)); Node *class_node = Getattr(zend_types, mangled); if (!class_node) { /* This is needed when we're returning a pointer to a type * rather than returning the type by value or reference. */ Delete(mangled); mangled = NewString(SwigType_manglestr(ret_type)); class_node = Getattr(zend_types, mangled); if (!class_node) { // Return type isn't an object, so will be handled by the // !is_resource() check before the switch. continue; } } const char *classname = GetChar(class_node, "sym:name"); if (!classname) classname = GetChar(class_node, "name"); String * action = NewStringEmpty(); if (classname) Printf(action, "return new %s%s($r);\n", prefix, classname); else Printf(action, "return $r;\n"); if (!wrapobj) { wrapobj = NewString("\t\tswitch (get_resource_type($r)) {\n"); common = action; } else { if (common && Cmp(common, action) != 0) { Delete(common); common = NULL; } } Printf(wrapobj, "\t\t"); if (i.item) { Printf(wrapobj, "case '%s': ", mangled); } else { Printf(wrapobj, "default: "); } Printv(wrapobj, action, NIL); if (action != common) Delete(action); Delete(mangled); } Printf(wrapobj, "\t\t}\n"); if (common) { // All cases have the same action, so eliminate the switch // wrapper. Printf(output, "\t\t%s", common); Delete(common); } else { Printv(output, wrapobj, NIL); } Delete(wrapobj); } } else { if (non_void_return || hasargout) { Printf(output, "\t\treturn %s;\n", invoke); } else if (Cmp(invoke, "$r") != 0) { Printf(output, "\t\t%s;\n", invoke); } } Printf(output, "\t}\n"); done: Delete(prepare); Delete(invoke); free(arg_values); Delete(args); args = NULL; for (int i = 0; i < max_num_of_arguments; ++i) { Delete(arg_names[i]); } free(arg_names); arg_names = NULL; } return SWIG_OK; } /* ------------------------------------------------------------ * globalvariableHandler() * ------------------------------------------------------------ */ virtual int globalvariableHandler(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *tm; /* First do the wrappers such as name_set(), name_get() * as provided by the baseclass's implementation of variableWrapper */ if (Language::globalvariableHandler(n) == SWIG_NOWRAP) { return SWIG_NOWRAP; } if (!addSymbol(iname, n)) return SWIG_ERROR; /* First link C variables to PHP */ tm = Swig_typemap_lookup("varinit", n, name, 0); if (tm) { Replaceall(tm, "$target", name); Printf(s_vinit, "%s\n", tm); } else { Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); } /* Now generate PHP -> C sync blocks */ /* tm = Swig_typemap_lookup("varin", n, name, 0); if(tm) { Replaceall(tm, "$symname", iname); Printf(f_c->code, "%s\n", tm); } else { Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); } */ /* Now generate C -> PHP sync blocks */ /* if(!GetFlag(n,"feature:immutable")) { tm = Swig_typemap_lookup("varout", n, name, 0); if(tm) { Replaceall(tm, "$symname", iname); Printf(f_php->code, "%s\n", tm); } else { Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); } } */ return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *name = GetChar(n, "name"); String *iname = GetChar(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; SwigType_remember(type); if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Printf(s_cinit, "%s\n", tm); } if (shadow) { String *enumvalue = GetChar(n, "enumvalue"); String *set_to = iname; if (!enumvalue) { enumvalue = GetChar(n, "enumvalueex"); } if (enumvalue && *Char(enumvalue)) { // Check for a simple constant expression which is valid in PHP. // If we find one, initialise the const member with it; otherwise // we initialise it using the C/C++ wrapped constant. const char *p; for (p = Char(enumvalue); *p; ++p) { if (!isdigit((unsigned char)*p) && !strchr(" +-", *p)) { // FIXME: enhance to handle ` + 1' which is what // we get for enums that don't have an explicit value set. break; } } if (!*p) set_to = enumvalue; } if (wrapping_member_constant) { if (!s_oowrappers) s_oowrappers = NewStringEmpty(); Printf(s_oowrappers, "\n\tconst %s = %s;\n", wrapping_member_constant, set_to); } else { if (!s_fakeoowrappers) s_fakeoowrappers = NewStringEmpty(); Printf(s_fakeoowrappers, "\n\tconst %s = %s;\n", iname, set_to); } } return SWIG_OK; } /* * PHP::pragma() * * Pragma directive. * * %pragma(php) code="String" # Includes a string in the .php file * %pragma(php) include="file.php" # Includes a file in the .php file */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *type = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "php") == 0) { if (Strcmp(type, "code") == 0) { if (value) { Printf(pragma_code, "%s\n", value); } } else if (Strcmp(type, "include") == 0) { if (value) { Printf(pragma_incl, "include '%s';\n", value); } } else if (Strcmp(type, "phpinfo") == 0) { if (value) { Printf(pragma_phpinfo, "%s\n", value); } } else if (Strcmp(type, "version") == 0) { if (value) { pragma_version = value; } } else { Swig_warning(WARN_PHP_UNKNOWN_PRAGMA, input_file, line_number, "Unrecognized pragma <%s>.\n", type); } } } return Language::pragmaDirective(n); } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { if (!Getattr(n, "feature:onlychildren")) { String *symname = Getattr(n, "sym:name"); Setattr(n, "php:proxy", symname); } return Language::classDeclaration(n); } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { constructors = 0; current_class = n; if (shadow) { char *rename = GetChar(n, "sym:name"); if (!addSymbol(rename, n)) return SWIG_ERROR; shadow_classname = NewString(rename); shadow_get_vars = NewHash(); shadow_set_vars = NewHash(); /* Deal with inheritance */ List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } base = Next(base); if (base.item) { /* Warn about multiple inheritance for additional base class(es) */ while (base.item) { if (GetFlag(base.item, "feature:ignore")) { base = Next(base); continue; } String *proxyclassname = SwigType_str(Getattr(n, "classtypeobj"), 0); String *baseclassname = SwigType_str(Getattr(base.item, "name"), 0); Swig_warning(WARN_PHP_MULTIPLE_INHERITANCE, input_file, line_number, "Warning for %s, base %s ignored. Multiple inheritance is not supported in PHP.\n", proxyclassname, baseclassname); base = Next(base); } } } } classnode = n; Language::classHandler(n); classnode = 0; if (shadow) { List *baselist = Getattr(n, "bases"); Iterator ki, base; if (baselist) { base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } } else { base.item = NULL; } if (Getattr(n, "abstracts") && !GetFlag(n, "feature:notabstract")) { Printf(s_phpclasses, "abstract "); } Printf(s_phpclasses, "class %s%s ", prefix, shadow_classname); String *baseclass = NULL; if (base.item && Getattr(base.item, "module")) { baseclass = Getattr(base.item, "sym:name"); if (!baseclass) baseclass = Getattr(base.item, "name"); Printf(s_phpclasses, "extends %s%s ", prefix, baseclass); } else if (GetFlag(n, "feature:exceptionclass")) { Append(s_phpclasses, "extends Exception "); } { Node *node = NewHash(); Setattr(node, "type", Getattr(n, "name")); Setfile(node, Getfile(n)); Setline(node, Getline(n)); String * interfaces = Swig_typemap_lookup("phpinterfaces", node, "", 0); if (interfaces) { Printf(s_phpclasses, "implements %s ", interfaces); } Delete(node); } Printf(s_phpclasses, "{\n\tpublic $%s=null;\n", SWIG_PTR); if (!baseclass) { // Only store this in the base class (NB !baseclass means we *are* // a base class...) Printf(s_phpclasses, "\tprotected $%s=array();\n", SWIG_DATA); } // Write property SET handlers ki = First(shadow_set_vars); if (ki.key) { // This class has setters. Printf(s_phpclasses, "\n\tfunction __set($var,$value) {\n"); // FIXME: tune this threshold... if (Len(shadow_set_vars) <= 2) { // Not many setters, so avoid call_user_func. for (; ki.key; ki = Next(ki)) { DOH *key = ki.key; String *iname = ki.item; Printf(s_phpclasses, "\t\tif ($var === '%s') return %s($this->%s,$value);\n", key, iname, SWIG_PTR); } } else { Printf(s_phpclasses, "\t\t$func = '%s_'.$var.'_set';\n", shadow_classname); Printf(s_phpclasses, "\t\tif (function_exists($func)) return call_user_func($func,$this->%s,$value);\n", SWIG_PTR); } Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_alter_newobject($this->%s,$value);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\t%s%s::__set($var,$value);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\t$this->%s[$var] = $value;\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } else { Printf(s_phpclasses, "\n\tfunction __set($var,$value) {\n"); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_alter_newobject($this->%s,$value);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\t%s%s::__set($var,$value);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\t$this->%s[$var] = $value;\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } // Write property GET handlers ki = First(shadow_get_vars); if (ki.key) { // This class has getters. Printf(s_phpclasses, "\n\tfunction __get($var) {\n"); int non_class_getters = 0; for (; ki.key; ki = Next(ki)) { DOH *key = ki.key; SwigType *d = ki.item; if (!is_class(d)) { ++non_class_getters; continue; } Printv(s_phpclasses, "\t\tif ($var === '", key, "') return new ", prefix, Getattr(classLookup(d), "sym:name"), "(", shadow_classname, "_", key, "_get($this->", SWIG_PTR, "));\n", NIL); } // FIXME: tune this threshold... if (non_class_getters <= 2) { // Not many non-class getters, so avoid call_user_func. for (ki = First(shadow_get_vars); non_class_getters && ki.key; ki = Next(ki)) { DOH *key = ki.key; SwigType *d = ki.item; if (is_class(d)) continue; Printv(s_phpclasses, "\t\tif ($var === '", key, "') return ", shadow_classname, "_", key, "_get($this->", SWIG_PTR, ");\n", NIL); --non_class_getters; } } else { Printf(s_phpclasses, "\t\t$func = '%s_'.$var.'_get';\n", shadow_classname); Printf(s_phpclasses, "\t\tif (function_exists($func)) return call_user_func($func,$this->%s);\n", SWIG_PTR); } Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_get_newobject($this->%s);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__get($var);\n", prefix, baseclass); } else { // Reading an unknown property name gives null in PHP. Printf(s_phpclasses, "\t\treturn $this->%s[$var];\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); /* __isset() should return true for read-only properties, so check for * *_get() not *_set(). */ Printf(s_phpclasses, "\n\tfunction __isset($var) {\n"); Printf(s_phpclasses, "\t\tif (function_exists('%s_'.$var.'_get')) return true;\n", shadow_classname); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return true;\n"); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__isset($var);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\treturn array_key_exists($var, $this->%s);\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } else { Printf(s_phpclasses, "\n\tfunction __get($var) {\n"); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_get_newobject($this->%s);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__get($var);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\treturn $this->%s[$var];\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); Printf(s_phpclasses, "\n\tfunction __isset($var) {\n"); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return true;\n"); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__isset($var);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\treturn array_key_exists($var, $this->%s);\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } if (!class_has_ctor) { Printf(s_phpclasses, "\tfunction __construct($h) {\n"); Printf(s_phpclasses, "\t\t$this->%s=$h;\n", SWIG_PTR); Printf(s_phpclasses, "\t}\n"); } if (s_oowrappers) { Printf(s_phpclasses, "%s", s_oowrappers); Delete(s_oowrappers); s_oowrappers = NULL; } class_has_ctor = false; Printf(s_phpclasses, "}\n\n"); Delete(shadow_classname); shadow_classname = NULL; Delete(shadow_set_vars); shadow_set_vars = NULL; Delete(shadow_get_vars); shadow_get_vars = NULL; } return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { wrapperType = memberfn; Language::memberfunctionHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { wrapperType = membervar; Language::membervariableHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * staticmembervariableHandler() * ------------------------------------------------------------ */ virtual int staticmembervariableHandler(Node *n) { wrapperType = staticmembervar; Language::staticmembervariableHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * staticmemberfunctionHandler() * ------------------------------------------------------------ */ virtual int staticmemberfunctionHandler(Node *n) { wrapperType = staticmemberfn; Language::staticmemberfunctionHandler(n); wrapperType = standard; return SWIG_OK; } int abstractConstructorHandler(Node *) { return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { constructors++; if (Swig_directorclass(n)) { String *name = GetChar(Swig_methodclass(n), "name"); String *ctype = GetChar(Swig_methodclass(n), "classtype"); String *sname = GetChar(Swig_methodclass(n), "sym:name"); String *args = NewStringEmpty(); ParmList *p = Getattr(n, "parms"); int i; for (i = 0; p; p = nextSibling(p), i++) { if (i) { Printf(args, ", "); } if (Strcmp(GetChar(p, "type"), SwigType_str(GetChar(p, "type"), 0))) { SwigType *t = Getattr(p, "type"); Printf(args, "%s", SwigType_rcaststr(t, 0)); if (SwigType_isreference(t)) { Append(args, "*"); } } Printf(args, "arg%d", i+1); } /* director ctor code is specific for each class */ Delete(director_ctor_code); director_ctor_code = NewStringEmpty(); director_prot_ctor_code = NewStringEmpty(); Printf(director_ctor_code, "if (Z_TYPE_P(arg0) == IS_NULL) { /* not subclassed */\n"); Printf(director_prot_ctor_code, "if (Z_TYPE_P(arg0) == IS_NULL) { /* not subclassed */\n"); Printf(director_ctor_code, " %s = (%s *)new %s(%s);\n", Swig_cresult_name(), ctype, ctype, args); Printf(director_prot_ctor_code, " SWIG_PHP_Error(E_ERROR, \"accessing abstract class or protected constructor\");\n", name, name, args); if (i) { Insert(args, 0, ", "); } Printf(director_ctor_code, "} else {\n %s = (%s *)new SwigDirector_%s(arg0%s);\n}\n", Swig_cresult_name(), ctype, sname, args); Printf(director_prot_ctor_code, "} else {\n %s = (%s *)new SwigDirector_%s(arg0%s);\n}\n", Swig_cresult_name(), ctype, sname, args); Delete(args); wrapperType = directorconstructor; } else { wrapperType = constructor; } Language::constructorHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * CreateZendListDestructor() * ------------------------------------------------------------ */ //virtual int destructorHandler(Node *n) { //} int CreateZendListDestructor(Node *n) { String *name = GetChar(Swig_methodclass(n), "name"); String *iname = GetChar(n, "sym:name"); ParmList *l = Getattr(n, "parms"); String *destructorname = NewStringEmpty(); Printf(destructorname, "_%s", Swig_name_wrapper(iname)); Setattr(classnode, "destructor", destructorname); Wrapper *f = NewWrapper(); Printf(f->def, "/* This function is designed to be called by the zend list destructors */\n"); Printf(f->def, "/* to typecast and do the actual destruction */\n"); Printf(f->def, "static void %s(zend_resource *res, const char *type_name) {\n", destructorname); Wrapper_add_localv(f, "value", "swig_object_wrapper *value=(swig_object_wrapper *) res->ptr", NIL); Wrapper_add_localv(f, "ptr", "void *ptr=value->ptr", NIL); Wrapper_add_localv(f, "newobject", "int newobject=value->newobject", NIL); emit_parameter_variables(l, f); emit_attach_parmmaps(l, f); // Get type of first arg, thing to be destructed // Skip ignored arguments Parm *p = l; //while (Getattr(p,"tmap:ignore")) {p = Getattr(p,"tmap:ignore:next");} while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); Printf(f->code, " efree(value);\n"); Printf(f->code, " if (! newobject) return; /* can't delete it! */\n"); Printf(f->code, " arg1 = (%s)SWIG_ConvertResourceData(ptr, type_name, SWIGTYPE%s);\n", SwigType_lstr(pt, 0), SwigType_manglestr(pt)); Printf(f->code, " if (! arg1) zend_error(E_ERROR, \"%s resource already free'd\");\n", Char(name)); Setattr(n, "wrap:name", destructorname); String *actioncode = emit_action(n); Append(f->code, actioncode); Delete(actioncode); Printf(f->code, "thrown:\n"); Append(f->code, "return;\n"); Append(f->code, "fail:\n"); Append(f->code, "SWIG_FAIL();\n"); Printf(f->code, "}\n"); Wrapper_print(f, s_wrappers); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * memberconstantHandler() * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { wrapping_member_constant = Getattr(n, "sym:name"); Language::memberconstantHandler(n); wrapping_member_constant = NULL; return SWIG_OK; } int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } int classDirectorEnd(Node *n) { Printf(f_directors_h, "};\n"); return Language::classDirectorEnd(n); } int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewStringEmpty(); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("zval"); SwigType_add_pointer(type); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { // There should always be a "self" parameter first. assert(ParmList_len(parms) > 0); /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) {", classname, target, call); Append(w->def, "}"); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } return Language::classDirectorConstructor(n); } int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *returntype = Getattr(n, "type"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewStringEmpty(); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewStringEmpty(); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (Cmp(returntype, "void") == 0 && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> PHP) */ String *parse_args = NewStringEmpty(); Swig_director_parms_fixup(l); /* remove the wrapper 'w' since it was producing spurious temps */ Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("directorargout", l, w); Parm *p; int outputs = 0; if (!is_void) outputs++; /* build argument list and type conversion string */ idx = 0; p = l; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:directorin")) != 0) { String *parse = Getattr(p, "tmap:directorin:parse"); if (!parse) { String *input = NewStringf("&args[%d]", idx++); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Delete(input); Replaceall(tm, "$owner", "0"); Printv(wrap_args, tm, "\n", NIL); Putc('O', parse_args); } else { Append(parse_args, parse); Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); if (Len(tm) == 0) Append(tm, pname); } p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } p = nextSibling(p); } /* exception handling */ bool error_used_in_typemap = false; tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); if (tm) tm = Copy(tm); } if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { if (Replaceall(tm, "$error", "error")) { /* Only declare error if it is used by the typemap. */ error_used_in_typemap = true; Append(w->code, "int error;\n"); } } else { Delete(tm); tm = NULL; } if (!idx) { Printf(w->code, "zval *args = NULL;\n"); } else { Printf(w->code, "zval args[%d];\n", idx); } // typemap_directorout testcase requires that 0 can be assigned to the // variable named after the result of Swig_cresult_name(), so that can't // be a zval - make it a pointer to one instead. Printf(w->code, "zval swig_zval_result, swig_funcname;\n", Swig_cresult_name()); Printf(w->code, "zval * SWIGUNUSED %s = &swig_zval_result;\n", Swig_cresult_name()); const char * funcname = GetChar(n, "sym:name"); Printf(w->code, "ZVAL_STRINGL(&swig_funcname, \"%s\", %d);\n", funcname, strlen(funcname)); /* wrap complex arguments to zvals */ Printv(w->code, wrap_args, NIL); if (error_used_in_typemap) { Append(w->code, "error = "); } Append(w->code, "call_user_function(EG(function_table), &swig_self, &swig_funcname,"); Printf(w->code, " &swig_zval_result, %d, args);\n", idx); if (tm) { Printv(w->code, Str(tm), "\n", NIL); Delete(tm); } /* marshal return value from PHP to C/C++ type */ String *cleanup = NewStringEmpty(); String *outarg = NewStringEmpty(); idx = 0; /* marshal return value */ if (!is_void) { tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { Replaceall(tm, "$input", Swig_cresult_name()); char temp[24]; sprintf(temp, "%d", idx); Replaceall(tm, "$argnum", temp); /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } /* marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { Replaceall(tm, "$result", Swig_cresult_name()); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(parse_args); Delete(cleanup); Delete(outarg); } Append(w->code, "thrown:\n"); if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } else { Append(w->code, "return;\n"); } Append(w->code, "fail:\n"); Append(w->code, "SWIG_FAIL();\n"); Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewStringEmpty(); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } int classDirectorDisown(Node *) { return SWIG_OK; } }; /* class PHP */ static PHP *maininstance = 0; // We use this function to be able to write out zend_register_list_destructor_ex // lines for most things in the type table // NOTE: it's a function NOT A PHP::METHOD extern "C" { static void typetrace(const SwigType *ty, String *mangled, String *clientdata) { Node *class_node; if (!zend_types) { zend_types = NewHash(); } // we want to know if the type which reduced to this has a constructor if ((class_node = maininstance->classLookup(ty))) { if (!Getattr(zend_types, mangled)) { // OK it may have been set before by a different SwigType but it would // have had the same underlying class node I think // - it is certainly required not to have different originating class // nodes for the same SwigType Setattr(zend_types, mangled, class_node); } } else { // a non-class pointer Setattr(zend_types, mangled, NOTCLASS); } if (r_prevtracefunc) (*r_prevtracefunc) (ty, mangled, (String *) clientdata); } } /* ----------------------------------------------------------------------------- * new_swig_php() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_php() { maininstance = new PHP; if (!r_prevtracefunc) { r_prevtracefunc = SwigType_remember_trace(typetrace); } else { Printf(stderr, "php Typetrace vector already saved!\n"); assert(0); } return maininstance; } extern "C" Language *swig_php(void) { return new_swig_php(); } swig-4.0.2/Source/Makefile.am0000644000175000017500000001144413667507523015662 0ustar williamwilliam## Process this file with automake to produce Makefile.in # subdir-objects generates object files using the directory structure of the source files. AUTOMAKE_OPTIONS = foreign nostdinc subdir-objects 1.7.2 SOURCE_DIR=$(top_srcdir)/Source BUILD_SOURCE_DIR=$(top_builddir)/Source SWIG_CXX_DEFS = @SWILL@ AM_CPPFLAGS = -I$(BUILD_SOURCE_DIR)/Include \ -I$(BUILD_SOURCE_DIR)/CParse \ -I$(SOURCE_DIR)/Include \ -I$(SOURCE_DIR)/DOH \ -I$(SOURCE_DIR)/CParse \ -I$(SOURCE_DIR)/Doxygen \ -I$(SOURCE_DIR)/Preprocessor \ -I$(SOURCE_DIR)/Swig \ -I$(SOURCE_DIR)/Modules AM_CXXFLAGS = $(SWIG_CXX_DEFS) AM_YFLAGS = -d BUILT_SOURCES = CParse/parser.h eswig_SOURCES = CParse/cscanner.c \ CParse/parser.y \ CParse/templ.c \ CParse/util.c \ DOH/base.c \ DOH/file.c \ DOH/fio.c \ DOH/hash.c \ DOH/list.c \ DOH/memory.c \ DOH/string.c \ DOH/void.c \ Doxygen/doxyentity.cxx \ Doxygen/doxyentity.h \ Doxygen/doxyparser.cxx \ Doxygen/doxyparser.h \ Doxygen/doxytranslator.cxx \ Doxygen/doxytranslator.h \ Doxygen/javadoc.cxx \ Doxygen/javadoc.h \ Doxygen/pydoc.cxx \ Doxygen/pydoc.h \ Modules/allocate.cxx \ Modules/browser.cxx \ Modules/contract.cxx \ Modules/csharp.cxx \ Modules/d.cxx \ Modules/directors.cxx \ Modules/emit.cxx \ Modules/go.cxx \ Modules/guile.cxx \ Modules/interface.cxx \ Modules/java.cxx \ Modules/javascript.cxx \ Modules/lang.cxx \ Modules/lua.cxx \ Modules/main.cxx \ Modules/mzscheme.cxx \ Modules/nested.cxx \ Modules/ocaml.cxx \ Modules/octave.cxx \ Modules/overload.cxx \ Modules/perl5.cxx \ Modules/php.cxx \ Modules/python.cxx \ Modules/r.cxx \ Modules/ruby.cxx \ Modules/scilab.cxx \ Modules/swigmain.cxx \ Modules/tcl8.cxx \ Modules/typepass.cxx \ Modules/utils.cxx \ Modules/xml.cxx \ Preprocessor/cpp.c \ Preprocessor/expr.c \ Swig/cwrap.c \ Swig/deprecate.c \ Swig/error.c \ Swig/extend.c \ Swig/fragment.c \ Swig/getopt.c \ Swig/include.c \ Swig/misc.c \ Swig/naming.c \ Swig/parms.c \ Swig/scanner.c \ Swig/stype.c \ Swig/symbol.c \ Swig/tree.c \ Swig/typemap.c \ Swig/typeobj.c \ Swig/typesys.c \ Swig/wrapfunc.c bin_PROGRAMS = eswig eswig_LDADD = @SWIGLIBS@ # Override the link stage to avoid using Libtool CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ # The executable is copied to the root directory for installation and running the test-suite. # This occurs on each invocation of make and is a step towards providing support for multiple # build directories. all-local: eswig@EXEEXT@ cp -f $(top_builddir)/Source/eswig@EXEEXT@ $(top_builddir)/swig@EXEEXT@ clean-local: rm -f $(top_builddir)/swig@EXEEXT@ rm -f core @EXTRA_CLEAN@ distclean-local: rm -f $(top_builddir)/Source/Include/swigconfig.h rm -f $(top_builddir)/Source/Include/stamp-h1 # Beautify the code. # Note that this works well on C code, but does some odd joining of lines for C++ code. # Compiling with -DNDEBUG and no optimisations will allow one to do a binary diff of the # swig executable as a way of checking before and after the 'beautifying'. # Single files can be beautified with the beautify-file target, eg: 'make beautify-file INDENTFILE=chosenfile.c' SWIGTYPEDEFS=-T bool -T File -T DohObjInfo -T Parm -T Language -T List -T TargetLanguageModule -T Typetab -T ModuleFactory -T ErrorMessageFormat -T Symtab -T Hash -T Scanner -T String -T DohBase -T Node -T String_or_char -T SwigType -T Dispatcher -T Wrapper -T DohStringMethods -T DohFileMethods -T DohListMethods -T DohHashMethods -T DOH -T DohIterator -T ParmList -T FILE -T HashNode -T DOHObj_or_char -T DOHFile -T DOHString -T DOHString_or_char -T UpcallData INDENTBAKSDIR=../IndentBaks beautify: rm -rf $(INDENTBAKSDIR) mkdir $(INDENTBAKSDIR) mkdir $(INDENTBAKSDIR)/CParse mkdir $(INDENTBAKSDIR)/DOH mkdir $(INDENTBAKSDIR)/Modules mkdir $(INDENTBAKSDIR)/Preprocessor mkdir $(INDENTBAKSDIR)/Swig mkdir $(INDENTBAKSDIR)/Include (csources=`find . -name "*.c"` && \ hsources=`find . -name "*.h"` && \ cxxsources=`find . -name "*.cxx"` && \ for file in $$csources $$hsources $$cxxsources; do \ $(MAKE) beautify-file INDENTFILE=$$file; \ done; ) beautify-file: test -e $(INDENTBAKSDIR) || (echo $(INDENTBAKSDIR) directory does not exist && exit 1;) test -n "$(INDENTFILE)" || (echo INDENTFILE not defined && exit 1;) test -e $(INDENTFILE) || (echo File does not exist: $(INDENTFILE) && exit 1;) cp $(INDENTFILE) $(INDENTBAKSDIR)/$(INDENTFILE); indent -kr --honour-newlines --line-length160 --indent-level2 --braces-on-func-def-line --leave-optional-blank-lines $(SWIGTYPEDEFS) $(INDENTFILE) -o $(INDENTFILE).tmp; cat $(INDENTFILE).tmp | sed -e 's/const const /const /' > $(INDENTFILE); rm $(INDENTFILE).tmp; swig-4.0.2/Source/Include/0000755000175000017500000000000013667507557015214 5ustar williamwilliamswig-4.0.2/Source/Include/swigwarn.h0000644000175000017500000003216113667507523017222 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigwarn.h * * SWIG warning message numbers * This file serves as the main registry of warning message numbers. Some of these * numbers are used internally in the C/C++ source code of SWIG. However, some * of the numbers are used in SWIG configuration files (swig.swg and others). * * The numbers are roughly organized into a few different classes by functionality. * * Even though symbolic constants are used in the SWIG source, this is * not always the case in SWIG interface files. Do not change the * numbers in this file. * * This file is used as the input for generating Lib/swigwarn.swg. * ----------------------------------------------------------------------------- */ #ifndef SWIGWARN_H_ #define SWIGWARN_H_ #define WARN_NONE 0 /* -- Deprecated features -- */ #define WARN_DEPRECATED_EXTERN 101 #define WARN_DEPRECATED_VAL 102 #define WARN_DEPRECATED_OUT 103 #define WARN_DEPRECATED_DISABLEDOC 104 #define WARN_DEPRECATED_ENABLEDOC 105 #define WARN_DEPRECATED_DOCONLY 106 #define WARN_DEPRECATED_STYLE 107 #define WARN_DEPRECATED_LOCALSTYLE 108 #define WARN_DEPRECATED_TITLE 109 #define WARN_DEPRECATED_SECTION 110 #define WARN_DEPRECATED_SUBSECTION 111 #define WARN_DEPRECATED_SUBSUBSECTION 112 #define WARN_DEPRECATED_ADDMETHODS 113 #define WARN_DEPRECATED_READONLY 114 #define WARN_DEPRECATED_READWRITE 115 #define WARN_DEPRECATED_EXCEPT 116 #define WARN_DEPRECATED_NEW 117 #define WARN_DEPRECATED_EXCEPT_TM 118 #define WARN_DEPRECATED_IGNORE_TM 119 #define WARN_DEPRECATED_OPTC 120 #define WARN_DEPRECATED_NAME 121 #define WARN_DEPRECATED_NOEXTERN 122 #define WARN_DEPRECATED_NODEFAULT 123 #define WARN_DEPRECATED_TYPEMAP_LANG 124 #define WARN_DEPRECATED_INPUT_FILE 125 #define WARN_DEPRECATED_NESTED_WORKAROUND 126 /* -- Preprocessor -- */ #define WARN_PP_MISSING_FILE 201 #define WARN_PP_EVALUATION 202 #define WARN_PP_INCLUDEALL_IMPORTALL 203 #define WARN_PP_CPP_WARNING 204 #define WARN_PP_CPP_ERROR 205 #define WARN_PP_UNEXPECTED_TOKENS 206 /* -- C/C++ Parser -- */ #define WARN_PARSE_CLASS_KEYWORD 301 #define WARN_PARSE_REDEFINED 302 #define WARN_PARSE_EXTEND_UNDEF 303 #define WARN_PARSE_UNSUPPORTED_VALUE 304 #define WARN_PARSE_BAD_VALUE 305 #define WARN_PARSE_PRIVATE 306 #define WARN_PARSE_BAD_DEFAULT 307 #define WARN_PARSE_NAMESPACE_ALIAS 308 #define WARN_PARSE_PRIVATE_INHERIT 309 #define WARN_PARSE_TEMPLATE_REPEAT 310 #define WARN_PARSE_TEMPLATE_PARTIAL 311 #define WARN_PARSE_UNNAMED_NESTED_CLASS 312 #define WARN_PARSE_UNDEFINED_EXTERN 313 #define WARN_PARSE_KEYWORD 314 #define WARN_PARSE_USING_UNDEF 315 #define WARN_PARSE_MODULE_REPEAT 316 #define WARN_PARSE_TEMPLATE_SP_UNDEF 317 #define WARN_PARSE_TEMPLATE_AMBIG 318 #define WARN_PARSE_NO_ACCESS 319 #define WARN_PARSE_EXPLICIT_TEMPLATE 320 #define WARN_PARSE_BUILTIN_NAME 321 #define WARN_PARSE_REDUNDANT 322 #define WARN_PARSE_REC_INHERITANCE 323 #define WARN_PARSE_NESTED_TEMPLATE 324 #define WARN_PARSE_NAMED_NESTED_CLASS 325 #define WARN_PARSE_EXTEND_NAME 326 #define WARN_CPP11_LAMBDA 340 #define WARN_CPP11_ALIAS_DECLARATION 341 /* redundant now */ #define WARN_CPP11_ALIAS_TEMPLATE 342 /* redundant now */ #define WARN_CPP11_VARIADIC_TEMPLATE 343 #define WARN_IGNORE_OPERATOR_NEW 350 /* new */ #define WARN_IGNORE_OPERATOR_DELETE 351 /* delete */ #define WARN_IGNORE_OPERATOR_PLUS 352 /* + */ #define WARN_IGNORE_OPERATOR_MINUS 353 /* - */ #define WARN_IGNORE_OPERATOR_MUL 354 /* * */ #define WARN_IGNORE_OPERATOR_DIV 355 /* / */ #define WARN_IGNORE_OPERATOR_MOD 356 /* % */ #define WARN_IGNORE_OPERATOR_XOR 357 /* ^ */ #define WARN_IGNORE_OPERATOR_AND 358 /* & */ #define WARN_IGNORE_OPERATOR_OR 359 /* | */ #define WARN_IGNORE_OPERATOR_NOT 360 /* ~ */ #define WARN_IGNORE_OPERATOR_LNOT 361 /* ! */ #define WARN_IGNORE_OPERATOR_EQ 362 /* = */ #define WARN_IGNORE_OPERATOR_LT 363 /* < */ #define WARN_IGNORE_OPERATOR_GT 364 /* > */ #define WARN_IGNORE_OPERATOR_PLUSEQ 365 /* += */ #define WARN_IGNORE_OPERATOR_MINUSEQ 366 /* -= */ #define WARN_IGNORE_OPERATOR_MULEQ 367 /* *= */ #define WARN_IGNORE_OPERATOR_DIVEQ 368 /* /= */ #define WARN_IGNORE_OPERATOR_MODEQ 369 /* %= */ #define WARN_IGNORE_OPERATOR_XOREQ 370 /* ^= */ #define WARN_IGNORE_OPERATOR_ANDEQ 371 /* &= */ #define WARN_IGNORE_OPERATOR_OREQ 372 /* |= */ #define WARN_IGNORE_OPERATOR_LSHIFT 373 /* << */ #define WARN_IGNORE_OPERATOR_RSHIFT 374 /* >> */ #define WARN_IGNORE_OPERATOR_LSHIFTEQ 375 /* <<= */ #define WARN_IGNORE_OPERATOR_RSHIFTEQ 376 /* >>= */ #define WARN_IGNORE_OPERATOR_EQUALTO 377 /* == */ #define WARN_IGNORE_OPERATOR_NOTEQUAL 378 /* != */ #define WARN_IGNORE_OPERATOR_LTEQUAL 379 /* <= */ #define WARN_IGNORE_OPERATOR_GTEQUAL 380 /* >= */ #define WARN_IGNORE_OPERATOR_LAND 381 /* && */ #define WARN_IGNORE_OPERATOR_LOR 382 /* || */ #define WARN_IGNORE_OPERATOR_PLUSPLUS 383 /* ++ */ #define WARN_IGNORE_OPERATOR_MINUSMINUS 384 /* -- */ #define WARN_IGNORE_OPERATOR_COMMA 385 /* , */ #define WARN_IGNORE_OPERATOR_ARROWSTAR 386 /* ->* */ #define WARN_IGNORE_OPERATOR_ARROW 387 /* -> */ #define WARN_IGNORE_OPERATOR_CALL 388 /* () */ #define WARN_IGNORE_OPERATOR_INDEX 389 /* [] */ #define WARN_IGNORE_OPERATOR_UPLUS 390 /* + */ #define WARN_IGNORE_OPERATOR_UMINUS 391 /* - */ #define WARN_IGNORE_OPERATOR_UMUL 392 /* * */ #define WARN_IGNORE_OPERATOR_UAND 393 /* & */ #define WARN_IGNORE_OPERATOR_NEWARR 394 /* new [] */ #define WARN_IGNORE_OPERATOR_DELARR 395 /* delete [] */ #define WARN_IGNORE_OPERATOR_REF 396 /* operator *() */ /* 394-399 are reserved */ /* -- Type system and typemaps -- */ #define WARN_TYPE_UNDEFINED_CLASS 401 #define WARN_TYPE_INCOMPLETE 402 #define WARN_TYPE_ABSTRACT 403 #define WARN_TYPE_REDEFINED 404 #define WARN_TYPE_RVALUE_REF_QUALIFIER_IGNORED 405 #define WARN_TYPEMAP_SOURCETARGET 450 #define WARN_TYPEMAP_CHARLEAK 451 #define WARN_TYPEMAP_SWIGTYPE 452 #define WARN_TYPEMAP_APPLY_UNDEF 453 #define WARN_TYPEMAP_SWIGTYPELEAK 454 #define WARN_TYPEMAP_IN_UNDEF 460 #define WARN_TYPEMAP_OUT_UNDEF 461 #define WARN_TYPEMAP_VARIN_UNDEF 462 #define WARN_TYPEMAP_VAROUT_UNDEF 463 #define WARN_TYPEMAP_CONST_UNDEF 464 #define WARN_TYPEMAP_UNDEF 465 #define WARN_TYPEMAP_VAR_UNDEF 466 #define WARN_TYPEMAP_TYPECHECK 467 #define WARN_TYPEMAP_THROW 468 #define WARN_TYPEMAP_DIRECTORIN_UNDEF 469 #define WARN_TYPEMAP_THREAD_UNSAFE 470 /* mostly used in directorout typemaps */ #define WARN_TYPEMAP_DIRECTOROUT_UNDEF 471 #define WARN_TYPEMAP_TYPECHECK_UNDEF 472 #define WARN_TYPEMAP_DIRECTOROUT_PTR 473 #define WARN_TYPEMAP_OUT_OPTIMAL_IGNORED 474 #define WARN_TYPEMAP_OUT_OPTIMAL_MULTIPLE 475 #define WARN_TYPEMAP_INITIALIZER_LIST 476 #define WARN_TYPEMAP_DIRECTORTHROWS_UNDEF 477 /* -- Fragments -- */ #define WARN_FRAGMENT_NOT_FOUND 490 /* -- General code generation -- */ #define WARN_LANG_OVERLOAD_DECL 501 #define WARN_LANG_OVERLOAD_CONSTRUCT 502 #define WARN_LANG_IDENTIFIER 503 #define WARN_LANG_RETURN_TYPE 504 #define WARN_LANG_VARARGS 505 #define WARN_LANG_VARARGS_KEYWORD 506 #define WARN_LANG_NATIVE_UNIMPL 507 #define WARN_LANG_DEREF_SHADOW 508 #define WARN_LANG_OVERLOAD_SHADOW 509 #define WARN_LANG_FRIEND_IGNORE 510 #define WARN_LANG_OVERLOAD_KEYWORD 511 #define WARN_LANG_OVERLOAD_CONST 512 #define WARN_LANG_CLASS_UNNAMED 513 #define WARN_LANG_DIRECTOR_VDESTRUCT 514 #define WARN_LANG_DISCARD_CONST 515 #define WARN_LANG_OVERLOAD_IGNORED 516 #define WARN_LANG_DIRECTOR_ABSTRACT 517 #define WARN_LANG_PORTABILITY_FILENAME 518 #define WARN_LANG_TEMPLATE_METHOD_IGNORE 519 #define WARN_LANG_SMARTPTR_MISSING 520 #define WARN_LANG_ILLEGAL_DESTRUCTOR 521 #define WARN_LANG_EXTEND_CONSTRUCTOR 522 #define WARN_LANG_EXTEND_DESTRUCTOR 523 #define WARN_LANG_EXPERIMENTAL 524 #define WARN_LANG_DIRECTOR_FINAL 525 /* -- Doxygen comments -- */ #define WARN_DOXYGEN_UNKNOWN_COMMAND 560 #define WARN_DOXYGEN_UNEXPECTED_END_OF_COMMENT 561 #define WARN_DOXYGEN_COMMAND_EXPECTED 562 #define WARN_DOXYGEN_HTML_ERROR 563 #define WARN_DOXYGEN_COMMAND_ERROR 564 #define WARN_DOXYGEN_UNKNOWN_CHARACTER 565 #define WARN_DOXYGEN_UNEXPECTED_ITERATOR_VALUE 566 /* -- Reserved (600-799) -- */ /* -- Language module specific warnings (700 - 899) -- */ /* Feel free to claim any number in this space that's not currently being used. Just make sure you add an entry here */ #define WARN_D_TYPEMAP_CTYPE_UNDEF 700 #define WARN_D_TYPEMAP_IMTYPE_UNDEF 701 #define WARN_D_TYPEMAP_DTYPE_UNDEF 702 #define WARN_D_MULTIPLE_INHERITANCE 703 #define WARN_D_TYPEMAP_CLASSMOD_UNDEF 704 #define WARN_D_TYPEMAP_DBODY_UNDEF 705 #define WARN_D_TYPEMAP_DOUT_UNDEF 706 #define WARN_D_TYPEMAP_DIN_UNDEF 707 #define WARN_D_TYPEMAP_DDIRECTORIN_UNDEF 708 #define WARN_D_TYPEMAP_DCONSTRUCTOR_UNDEF 709 #define WARN_D_EXCODE_MISSING 710 #define WARN_D_CANTHROW_MISSING 711 #define WARN_D_NO_DIRECTORCONNECT_ATTR 712 #define WARN_D_NAME_COLLISION 713 /* please leave 700-719 free for D */ #define WARN_SCILAB_TRUNCATED_NAME 720 /* please leave 720-739 free for Scilab */ #define WARN_PYTHON_INDENT_MISMATCH 740 /* please leave 740-759 free for Python */ #define WARN_RUBY_WRONG_NAME 801 #define WARN_RUBY_MULTIPLE_INHERITANCE 802 /* please leave 800-809 free for Ruby */ #define WARN_JAVA_TYPEMAP_JNI_UNDEF 810 #define WARN_JAVA_TYPEMAP_JTYPE_UNDEF 811 #define WARN_JAVA_TYPEMAP_JSTYPE_UNDEF 812 #define WARN_JAVA_MULTIPLE_INHERITANCE 813 #define WARN_JAVA_TYPEMAP_GETCPTR_UNDEF 814 #define WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF 815 #define WARN_JAVA_TYPEMAP_JAVABODY_UNDEF 816 #define WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF 817 #define WARN_JAVA_TYPEMAP_JAVAIN_UNDEF 818 #define WARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF 819 #define WARN_JAVA_TYPEMAP_JAVADIRECTOROUT_UNDEF 820 #define WARN_JAVA_TYPEMAP_INTERFACECODE_UNDEF 821 #define WARN_JAVA_COVARIANT_RET 822 #define WARN_JAVA_TYPEMAP_JAVACONSTRUCT_UNDEF 823 #define WARN_JAVA_TYPEMAP_DIRECTORIN_NODESC 824 #define WARN_JAVA_NO_DIRECTORCONNECT_ATTR 825 #define WARN_JAVA_NSPACE_WITHOUT_PACKAGE 826 /* please leave 810-829 free for Java */ #define WARN_CSHARP_TYPEMAP_CTYPE_UNDEF 830 #define WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF 831 #define WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF 832 #define WARN_CSHARP_MULTIPLE_INHERITANCE 833 #define WARN_CSHARP_TYPEMAP_GETCPTR_UNDEF 834 #define WARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF 835 #define WARN_CSHARP_TYPEMAP_CSBODY_UNDEF 836 #define WARN_CSHARP_TYPEMAP_CSOUT_UNDEF 837 #define WARN_CSHARP_TYPEMAP_CSIN_UNDEF 838 #define WARN_CSHARP_TYPEMAP_CSDIRECTORIN_UNDEF 839 #define WARN_CSHARP_TYPEMAP_CSDIRECTOROUT_UNDEF 840 #define WARN_CSHARP_TYPEMAP_INTERFACECODE_UNDEF 841 #define WARN_CSHARP_COVARIANT_RET 842 #define WARN_CSHARP_TYPEMAP_CSCONSTRUCT_UNDEF 843 #define WARN_CSHARP_EXCODE 844 #define WARN_CSHARP_CANTHROW 845 #define WARN_CSHARP_NO_DIRECTORCONNECT_ATTR 846 /* please leave 830-849 free for C# */ #define WARN_MODULA3_TYPEMAP_TYPE_UNDEF 850 #define WARN_MODULA3_TYPEMAP_GETCPTR_UNDEF 851 #define WARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF 852 #define WARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF 853 #define WARN_MODULA3_TYPEMAP_MULTIPLE_RETURN 854 #define WARN_MODULA3_MULTIPLE_INHERITANCE 855 #define WARN_MODULA3_TYPECONSTRUCTOR_UNKNOWN 856 #define WARN_MODULA3_UNKNOWN_PRAGMA 857 #define WARN_MODULA3_BAD_ENUMERATION 858 #define WARN_MODULA3_DOUBLE_ID 859 #define WARN_MODULA3_BAD_IMPORT 860 /* please leave 850-869 free for Modula 3 */ #define WARN_PHP_MULTIPLE_INHERITANCE 870 #define WARN_PHP_UNKNOWN_PRAGMA 871 #define WARN_PHP_PUBLIC_BASE 872 /* please leave 870-889 free for PHP */ #define WARN_GO_NAME_CONFLICT 890 /* please leave 890-899 free for Go */ /* -- User defined warnings (900 - 999) -- */ #endif swig-4.0.2/Source/Include/swigconfig.h.in0000644000175000017500000000437013667507557020135 0ustar williamwilliam/* Source/Include/swigconfig.h.in. Generated from configure.ac by autoheader. */ /* define if the Boost library is available */ #undef HAVE_BOOST /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `dl' library (-ldl). */ #undef HAVE_LIBDL /* Define to 1 if you have the `dld' library (-ldld). */ #undef HAVE_LIBDLD /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define if you have PCRE library */ #undef HAVE_PCRE /* Define if popen is available */ #undef HAVE_POPEN /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* 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 /* The size of `void *', as computed by sizeof. */ #undef SIZEOF_VOID_P /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Compiler that built SWIG */ #undef SWIG_CXX /* Directory for SWIG system-independent libraries */ #undef SWIG_LIB /* Directory for SWIG system-independent libraries (Unix install on native Windows) */ #undef SWIG_LIB_WIN_UNIX /* Platform that SWIG is built for */ #undef SWIG_PLATFORM /* Version number of package */ #undef VERSION /* Deal with attempt by Microsoft to deprecate C standard runtime functions */ #if defined(_MSC_VER) # define _CRT_SECURE_NO_DEPRECATE #endif swig-4.0.2/Source/Doxygen/0000755000175000017500000000000013667507523015237 5ustar williamwilliamswig-4.0.2/Source/Doxygen/pydoc.h0000644000175000017500000001615613667507523016537 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * pydoc.h * * Module to return documentation for nodes formatted for PyDoc * ----------------------------------------------------------------------------- */ #ifndef PYDOCCONVERTER_H_ #define PYDOCCONVERTER_H_ #include #include #include "swig.h" #include "doxyentity.h" #include "doxytranslator.h" #define DOC_STRING_LENGTH 64 // characters per line allowed #define DOC_PARAM_STRING_LENGTH 30 // characters reserved for param name / type class PyDocConverter : public DoxygenTranslator { public: PyDocConverter(int flags = 0); String *makeDocumentation(Node *node); protected: size_t m_tableLineLen; bool m_prevRowIsTH; std::string m_url; /* * Translate every entity in a tree, also manages sections * display. Prints title for every group of tags that have * a section title associated with them */ std::string translateSubtree(DoxygenEntity &doxygenEntity); /* * Translate one entity with the appropriate handler, according * to the tagHandlers */ void translateEntity(DoxygenEntity &doxyEntity, std::string &translatedComment); /* * Typedef for the function that handles one tag * arg - some string argument to easily pass it through lookup table */ typedef void (PyDocConverter::*tagHandler) (DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Wrap the command data with the some string * arg - string to wrap with, like '_' or '*' */ void handleTagWrap(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Just prints new line */ void handleNewLine(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Print the name of tag to the output, used for escape-commands */ void handleTagChar(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Format the contents of the \exception tag or its synonyms. */ void handleTagException(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Print only the content and strip original tag */ void handleParagraph(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg = std::string()); /* * Handle Doxygen verbatim tag */ void handleVerbatimBlock(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg = std::string()); /* * Handle one of the Doxygen formula-related tags. */ void handleMath(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Handle a code snippet. */ void handleCode(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Print only data part of code */ void handlePlainString(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /** * Copies verbatim args of the tag to output, used for commands like \f$, ... */ void handleTagVerbatim(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Print the if-elseif-else-endif section */ void handleTagIf(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Prints the specified message, than the contents of the tag * arg - message */ void handleTagMessage(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Insert 'Title: ...' */ void handleTagPar(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Insert 'Image: ...' */ void handleTagImage(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Format nice param description with type information */ void handleTagParam(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Format the contents of the \return tag or its synonyms. */ void handleTagReturn(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Writes text for \ref tag. */ void handleTagRef(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* Handles HTML tags recognized by Doxygen, like , \n" if subsubsection: index += "\n" if subsection: index += "\n" if section == 1: index += "
    \n" index += """
  • %s\n""" % (headingname,prevheadingtext) subsection = 0 subsubsection = 0 subsubsubsection = 0 skipspace = 1 continue m = h3.match(s) if m: prevheadingtext = getheadingtext(m, s) nameindex += 1 subsection += 1 headingname = getheadingname(m) result.append("""

    %d.%d.%d %s

    """ % (headingname,num,section, subsection, prevheadingtext)) if subsubsubsection: index += "
\n" if subsubsection: index += "\n" if subsection == 1: index += "
    \n" index += """
  • %s\n""" % (headingname,prevheadingtext) subsubsection = 0 skipspace = 1 continue m = h4.match(s) if m: prevheadingtext = getheadingtext(m, s) nameindex += 1 subsubsection += 1 headingname = getheadingname(m) result.append("""

    %d.%d.%d.%d %s

    """ % (headingname,num,section, subsection, subsubsection, prevheadingtext)) if subsubsubsection: index += "
\n" if subsubsection == 1: index += "
    \n" index += """
  • %s\n""" % (headingname,prevheadingtext) subsubsubsection = 0 skipspace = 1 continue m = h5.match(s) if m: prevheadingtext = getheadingtext(m, s) nameindex += 1 subsubsubsection += 1 headingname = getheadingname(m) result.append("""
    %d.%d.%d.%d.%d %s
    """ % (headingname,num,section, subsection, subsubsection, subsubsubsection, prevheadingtext)) if subsubsubsection == 1: index += "
      \n" index += """
    • %s\n""" % (headingname,prevheadingtext) skipspace = 1 continue result.append(s) if subsubsubsection: index += "
    \n" if subsubsection: index += "
\n" if subsection: index += "\n" if section: index += "\n" index += "\n\n" data = "\n".join(result) data = data.replace("@INDEX@",index) + "\n"; # Write the file back out open(filename,"w").write(data) # Print the TOC data to stdout correcting the anchor links for external referencing index = index.replace("
  • %d %s\n""" % (filename,filenamebase,num,name) print index swig-4.0.2/Doc/Manual/fixstyle.py0000644000175000017500000000111513667507523016523 0ustar williamwilliam#!/usr/bin/python # Replace the inline htmldoc stylesheet with the SWIG stylesheet import sys import string filename = sys.argv[1] data = open(filename).read() open(filename+".bak","w").write(data) swigstyle = "\n" + open("style.css").read() lines = data.splitlines() result = [ ] skip = False for s in lines: if not skip: result.append(s) if s == "": result.append(s) skip = False data = "\n".join(result) open(filename,"w").write(data) swig-4.0.2/Doc/Manual/CCache.html0000644000175000017500000004676313667507563016324 0ustar williamwilliam ccache-swig(1) manpage

    20 Using SWIG with ccache - ccache-swig(1) manpage

    20.1 NAME

    ccache-swig - a fast compiler cache

    20.2 SYNOPSIS

    ccache-swig [OPTION]

    ccache-swig <compiler> [COMPILER OPTIONS]

    <compiler> [COMPILER OPTIONS]

    20.3 DESCRIPTION

    ccache-swig is a compiler cache. It speeds up re-compilation of C/C++/SWIG code by caching previous compiles and detecting when the same compile is being done again. ccache-swig is ccache plus support for SWIG. ccache and ccache-swig are used interchangeably in this document.

    20.4 OPTIONS SUMMARY

    Here is a summary of the options to ccache-swig.

    
    -s                      show statistics summary
    -z                      zero statistics
    -c                      run a cache cleanup
    -C                      clear the cache completely
    -F <n>                  set maximum files in cache
    -M <n>                  set maximum size of cache (use G, M or K)
    -h                      this help page
    -V                      print version number
    
    

    20.5 OPTIONS

    These options only apply when you invoke ccache as "ccache-swig". When invoked as a compiler none of these options apply. In that case your normal compiler options apply and you should refer to your compilers documentation.

    -h
    Print a options summary page

    -s
    Print the current statistics summary for the cache. The statistics are stored spread across the subdirectories of the cache. Using "ccache-swig -s" adds up the statistics across all subdirectories and prints the totals.

    -z
    Zero the cache statistics.

    -V
    Print the ccache version number

    -c
    Clean the cache and re-calculate the cache file count and size totals. Normally the -c option should not be necessary as ccache keeps the cache below the specified limits at runtime and keeps statistics up to date on each compile. This option is mostly useful if you manually modify the cache contents or believe that the cache size statistics may be inaccurate.

    -C
    Clear the entire cache, removing all cached files.

    -F <maxfiles>
    This sets the maximum number of files allowed in the cache. The value is stored inside the cache directory and applies to all future compiles. Due to the way the value is stored the actual value used is always rounded down to the nearest multiple of 16.

    -M <maxsize>
    This sets the maximum cache size. You can specify a value in gigabytes, megabytes or kilobytes by appending a G, M or K to the value. The default is gigabytes. The actual value stored is rounded down to the nearest multiple of 16 kilobytes.

    20.6 INSTALLATION

    There are two ways to use ccache. You can either prefix your compile commands with "ccache-swig" or you can create a symbolic link between ccache-swig and the names of your compilers. The first method is most convenient if you just want to try out ccache or wish to use it for some specific projects. The second method is most useful for when you wish to use ccache for all your compiles.

    To install for usage by the first method just copy ccache-swig to somewhere in your path.

    To install for the second method do something like this:

    
      cp ccache-swig /usr/local/bin/
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/gcc
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/g++
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/cc
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/swig
    
    
    This will work as long as /usr/local/bin comes before the path to gcc (which is usually in /usr/bin). After installing you may wish to run "which gcc" to make sure that the correct link is being used.

    Note! Do not use a hard link, use a symbolic link. A hardlink will cause "interesting" problems.

    20.7 EXTRA OPTIONS

    When run as a compiler front end ccache usually just takes the same command line options as the compiler you are using. The only exception to this is the option '--ccache-skip'. That option can be used to tell ccache that the next option is definitely not a input filename, and should be passed along to the compiler as-is.

    The reason this can be important is that ccache does need to parse the command line and determine what is an input filename and what is a compiler option, as it needs the input filename to determine the name of the resulting object file (among other things). The heuristic ccache uses in this parse is that any string on the command line that exists as a file is treated as an input file name (usually a C file). By using --ccache-skip you can force an option to not be treated as an input file name and instead be passed along to the compiler as a command line option.

    20.8 ENVIRONMENT VARIABLES

    ccache uses a number of environment variables to control operation. In most cases you won't need any of these as the defaults will be fine.

    CCACHE_DIR
    the CCACHE_DIR environment variable specifies where ccache will keep its cached compiler output. The default is "$HOME/.ccache".

    CCACHE_TEMPDIR
    the CCACHE_TEMPDIR environment variable specifies where ccache will put temporary files. The default is the same as CCACHE_DIR. Note that the CCACHE_TEMPDIR path must be on the same filesystem as the CCACHE_DIR path, so that renames of files between the two directories can work.

    CCACHE_LOGFILE
    If you set the CCACHE_LOGFILE environment variable then ccache will write some log information on cache hits and misses in that file. This is useful for tracking down problems.

    CCACHE_VERBOSE
    If you set the CCACHE_VERBOSE environment variable then ccache will display on stdout all the compiler invocations that it makes. This can useful for debugging unexpected problems.

    CCACHE_PATH
    You can optionally set CCACHE_PATH to a colon separated path where ccache will look for the real compilers. If you don't do this then ccache will look for the first executable matching the compiler name in the normal PATH that isn't a symbolic link to ccache itself.

    CCACHE_CC
    You can optionally set CCACHE_CC to force the name of the compiler to use. If you don't do this then ccache works it out from the command line.

    CCACHE_PREFIX
    This option adds a prefix to the command line that ccache runs when invoking the compiler. Also see the section below on using ccache with distcc.

    CCACHE_DISABLE
    If you set the environment variable CCACHE_DISABLE then ccache will just call the real compiler, bypassing the cache completely.

    CCACHE_READONLY
    the CCACHE_READONLY environment variable tells ccache to attempt to use existing cached object files, but not to try to add anything new to the cache. If you are using this because your CCACHE_DIR is read-only, then you may find that you also need to set CCACHE_TEMPDIR as otherwise ccache will fail to create the temporary files.

    CCACHE_CPP2
    If you set the environment variable CCACHE_CPP2 then ccache will not use the optimisation of avoiding the 2nd call to the pre-processor by compiling the pre-processed output that was used for finding the hash in the case of a cache miss. This is primarily a debugging option, although it is possible that some unusual compilers will have problems with the intermediate filename extensions used in this optimisation, in which case this option could allow ccache to be used.

    CCACHE_NOCOMPRESS
    If you set the environment variable CCACHE_NOCOMPRESS then there is no compression used on files that go into the cache. However, this setting has no effect on how files are retrieved from the cache, compressed results will still be usable.

    CCACHE_NOSTATS
    If you set the environment variable CCACHE_NOSTATS then ccache will not update the statistics files on each compile.

    CCACHE_NLEVELS
    The environment variable CCACHE_NLEVELS allows you to choose the number of levels of hash in the cache directory. The default is 2. The minimum is 1 and the maximum is 8.

    CCACHE_HARDLINK
    If you set the environment variable CCACHE_HARDLINK then ccache will attempt to use hard links from the cache directory when creating the compiler output rather than using a file copy. Using hard links is faster, but can confuse programs like 'make' that rely on modification times. Hard links are never made for compressed cache files.

    CCACHE_RECACHE
    This forces ccache to not use any cached results, even if it finds them. New results are still cached, but existing cache entries are ignored.

    CCACHE_UMASK
    This sets the umask for ccache and all child processes (such as the compiler). This is mostly useful when you wish to share your cache with other users. Note that this also affects the file permissions set on the object files created from your compilations.

    CCACHE_HASHDIR
    This tells ccache to hash the current working directory when calculating the hash that is used to distinguish two compiles. This prevents a problem with the storage of the current working directory in the debug info of a object file, which can lead ccache to give a cached object file that has the working directory in the debug info set incorrectly. This option is off by default as the incorrect setting of this debug info rarely causes problems. If you strike problems with gdb not using the correct directory then enable this option.

    CCACHE_UNIFY
    If you set the environment variable CCACHE_UNIFY then ccache will use the C/C++ unifier when hashing the pre-processor output if -g is not used in the compile. The unifier is slower than a normal hash, so setting this environment variable loses a little bit of speed, but it means that ccache can take advantage of not recompiling when the changes to the source code consist of reformatting only. Note that using CCACHE_UNIFY changes the hash, so cached compiles with CCACHE_UNIFY set cannot be used when CCACHE_UNIFY is not set and vice versa. The reason the unifier is off by default is that it can give incorrect line number information in compiler warning messages.

    CCACHE_EXTENSION
    Normally ccache tries to automatically determine the extension to use for intermediate C pre-processor files based on the type of file being compiled. Unfortunately this sometimes doesn't work, for example when using the aCC compiler on HP-UX. On systems like this you can use the CCACHE_EXTENSION option to override the default. On HP-UX set this environment variable to "i" if you use the aCC compiler.

    CCACHE_STRIPC
    If you set the environment variable CCACHE_STRIPC then ccache will strip the -c option when invoking the preprocessor. This option is primarily for the Sun Workshop C++ compiler as without this option an unwarranted warning is displayed: CC: Warning: "-E" redefines product from "object" to "source (stdout)" when -E and -c is used together.

    CCACHE_SWIG
    When using SWIG as the compiler and it does not have 'swig' in the executable name, then the CCACHE_SWIG environment variable needs to be set in order for ccache to work correctly with SWIG. The use of CCACHE_CPP2 is also recommended for SWIG due to some preprocessor quirks, however, use of CCACHE_CPP2 can often be skipped -- check your generated code with and without this option set. Known problems are using preprocessor directives within %inline blocks and the use of '#pragma SWIG'.

    20.9 CACHE SIZE MANAGEMENT

    By default ccache has a one gigabyte limit on the cache size and no maximum number of files. You can set a different limit using the "ccache -M" and "ccache -F" options, which set the size and number of files limits.

    When these limits are reached ccache will reduce the cache to 20% below the numbers you specified in order to avoid doing the cache clean operation too often.

    20.10 CACHE COMPRESSION

    By default on most platforms ccache will compress all files it puts into the cache using the zlib compression. While this involves a negligible performance slowdown, it significantly increases the number of files that fit in the cache. You can turn off compression setting the CCACHE_NOCOMPRESS environment variable.

    20.11 HOW IT WORKS

    The basic idea is to detect when you are compiling exactly the same code a 2nd time and use the previously compiled output. You detect that it is the same code by forming a hash of:

    • the pre-processor output from running the compiler with -E
    • the command line options
    • the real compilers size and modification time
    • any stderr output generated by the compiler

    These are hashed using md4 (a strong hash) and a cache file is formed based on that hash result. When the same compilation is done a second time ccache is able to supply the correct compiler output (including all warnings etc) from the cache.

    ccache has been carefully written to always produce exactly the same compiler output that you would get without the cache. If you ever discover a case where ccache changes the output of your compiler then please let me know.

    20.12 USING CCACHE WITH DISTCC

    distcc is a very useful program for distributing compilation across a range of compiler servers. It is often useful to combine distcc with ccache, so that compiles that are done are sped up by distcc, but that ccache avoids the compile completely where possible.

    To use distcc with ccache I recommend using the CCACHE_PREFIX option. You just need to set the environment variable CCACHE_PREFIX to 'distcc' and ccache will prefix the command line used with the compiler with the command 'distcc'.

    20.13 SHARING A CACHE

    A group of developers can increase the cache hit rate by sharing a cache directory. The hard links however cause unwanted side effects, as all links to a cached file share the file's modification timestamp. This results in false dependencies to be triggered by timestamp-based build systems whenever another user links to an existing file. Typically, users will see that their libraries and binaries are relinked without reason. To share a cache without side effects, the following conditions need to be met:

    • Use the same CCACHE_DIR environment variable setting
    • Unset the CCACHE_HARDLINK environment variable
    • Make sure everyone sets the CCACHE_UMASK environment variable to 002, this ensures that cached files are accessible to everyone in the group.
    • Make sure that all users have write permission in the entire cache directory (and that you trust all users of the shared cache).
    • Make sure that the setgid bit is set on all directories in the cache. This tells the filesystem to inherit group ownership for new directories. The command "chmod g+s `find $CCACHE_DIR -type d`" might be useful for this.
    • Set CCACHE_NOCOMPRESS for all users, if there are users with versions of ccache that do not support compression.

    20.14 HISTORY

    ccache was inspired by the compilercache shell script written by Erik Thiele and I would like to thank him for an excellent piece of work. See http://www.erikyyy.de/compilercache/ for the Erik's scripts. ccache-swig is a port of the original ccache with support added for use with SWIG.

    I wrote ccache because I wanted to get a bit more speed out of a compiler cache and I wanted to remove some of the limitations of the shell-script version.

    20.15 DIFFERENCES FROM COMPILERCACHE

    The biggest differences between Erik's compilercache script and ccache are:

    • ccache is written in C, which makes it a bit faster (calling out to external programs is mostly what slowed down the scripts).
    • ccache can automatically find the real compiler
    • ccache keeps statistics on hits/misses
    • ccache can do automatic cache management
    • ccache can cache compiler output that includes warnings. In many cases this gives ccache a much higher cache hit rate.
    • ccache can handle a much wider ranger of compiler options
    • ccache avoids a double call to cpp on a cache miss

    20.16 CREDITS

    Thanks to the following people for their contributions to ccache

    • Erik Thiele for the original compilercache script
    • Luciano Rocha for the idea of compiling the pre-processor output to avoid a 2nd cpp pass
    • Paul Russell for many suggestions and the debian packaging

    20.17 AUTHOR

    ccache was written by Andrew Tridgell https://www.samba.org/~tridge/. ccache was adapted to create ccache-swig for use with SWIG by William Fulton.

    If you wish to report a problem or make a suggestion then please email the SWIG developers on the swig-devel mailing list, see http://www.swig.org/mail.html

    ccache is released under the GNU General Public License version 2 or later. Please see the file COPYING for license details.

    swig-4.0.2/Doc/Manual/Lisp.html0000644000175000017500000004304213667507523016104 0ustar williamwilliam SWIG and Common Lisp

    29 SWIG and Common Lisp

    Common Lisp is a high-level, all-purpose, object-oriented, dynamic, functional programming language with long history. Common Lisp is used in many fields, ranging from web development to finance, and also common in computer science education. There are more than 9 different implementations of common lisp which are available, all have different foreign function interfaces. SWIG currently supports the Common Foreign Function Interface(CFFI).

    29.2 Common Foreign Function Interface(CFFI)

    CFFI, the Common Foreign Function Interface, is a portable foreign function interface for ANSI Common Lisp systems. CFFI requires only a small set of low-level functionality from the Lisp implementation, such as calling a foreign function by name, allocating foreign memory, and dereferencing pointers.

    To run the cffi module of SWIG requires very little effort, you just need to run:

    swig -cffi -module module-name   file-name 
    
    

    But a better was of using all the power of SWIG is to write SWIG interface files. Below we will explain how to write interface files and the various things which you can do with them.

    29.2.1 Additional Commandline Options

    CFFI specific options
    -generate-typedef If this option is given then defctype will be used to generate
    shortcuts according to the typedefs in the input.
    -[no]cwrap Turn on or turn off generation of an intermediate C file when
    creating a C interface. By default this is only done for C++ code.
    -[no]swig-lisp Turns on or off generation of code for helper lisp macro, functions, etc. which SWIG uses while generating wrappers. These macros, functions may still be used by generated wrapper code.

    29.2.2 Generating CFFI bindings

    As we mentioned earlier the ideal way to use SWIG is to use interface files. To illustrate the use of it, let's assume that we have a file named test.h with the following C code:

    #define y 5
    #define x (y >>  1)
    
    typedef int days;
    
    struct bar {
      short p, q;
      char a, b;
      int *z[1000];
      struct bar * n;
    };
      
    struct   bar * my_struct;
    
    struct foo {
      int a;
      struct foo * b[100];
    };
    
    int pointer_func(void (*ClosureFun)( void* _fun, void* _data, void* _evt ), int p);
    
    int func123(div_t * p, int **q[100], int r[][1000][10]);
    
    void lispsort_double (int n, double * array);
    
    enum color { RED, BLUE, GREEN};
    

    Corresponding to this we will write a simple interface file:

    %module test
    
    %include "test.h"
    
    

    The generated SWIG Code will be:

    ;;;SWIG wrapper code starts here
    
    (cl:defmacro defanonenum (&body enums)
       "Converts anonymous enums to defconstants."
      `(cl:progn , @(cl:loop for value in enums
                            for index = 0 then (cl:1+ index)
                            when (cl:listp value) do (cl:setf index (cl:second value)
                                                              value (cl:first value))
                            collect `(cl:defconstant , value , index))))
    
    (cl:eval-when (:compile-toplevel :load-toplevel)
      (cl:unless (cl:fboundp 'swig-lispify)
        (cl:defun swig-lispify (name flag cl:&optional (package cl:*package*))
          (cl:labels ((helper (lst last rest cl:&aux (c (cl:car lst)))
                        (cl:cond
                          ((cl:null lst)
                           rest)
                          ((cl:upper-case-p c)
                           (helper (cl:cdr lst) 'upper
                                   (cl:case last
                                     ((lower digit) (cl:list* c #\- rest))
                                     (cl:t (cl:cons c rest)))))
                          ((cl:lower-case-p c)
                           (helper (cl:cdr lst) 'lower (cl:cons (cl:char-upcase c) rest)))
                          ((cl:digit-char-p c)
                           (helper (cl:cdr lst) 'digit 
                                   (cl:case last
                                     ((upper lower) (cl:list* c #\- rest))
                                     (cl:t (cl:cons c rest)))))
                          ((cl:char-equal c #\_)
                           (helper (cl:cdr lst) '_ (cl:cons #\- rest)))
                          (cl:t
                           (cl:error "Invalid character: ~A" c)))))
            (cl:let ((fix (cl:case flag
                            ((constant enumvalue) "+")
                            (variable "*")
                            (cl:t ""))))
              (cl:intern
               (cl:concatenate
                'cl:string
                fix
                (cl:nreverse (helper (cl:concatenate 'cl:list name) cl:nil cl:nil))
                fix)
               package))))))
    
    ;;;SWIG wrapper code ends here
    
    
    (cl:defconstant y 5)
    
    (cl:defconstant x (cl:ash 5 -1))
    
    (cffi:defcstruct bar
            (p :short)
            (q :short)
            (a :char)
            (b :char)
            (z :pointer)
            (n :pointer))
    
    (cffi:defcvar ("my_struct" my_struct)
     :pointer)
    
    (cffi:defcstruct foo
            (a :int)
            (b :pointer))
    
    (cffi:defcfun ("pointer_func" pointer_func) :int
      (ClosureFun :pointer)
      (p :int))
    
    (cffi:defcfun ("func123" func123) :int
      (p :pointer)
      (q :pointer)
      (r :pointer))
    
    (cffi:defcfun ("lispsort_double" lispsort_double) :void
      (n :int)
      (array :pointer))
    
    (cffi:defcenum color
            :RED
            :BLUE
            :GREEN)
    

    The SWIG wrapper code refers to the special code which SWIG may need to use while wrapping C code. You can turn on/off the generation of this code by using the -[no]swig-lisp option. You must have noticed that SWIG goes one extra step to ensure that CFFI does not do automatic lispification of the C function names. The reason SWIG does this is because quite often developers want to build a nice CLOS based lispy API, and this one to one correspondence between C function names and lisp function name helps.

    Maybe you want to have your own convention for generating lisp function names for corresponding C function names, or you just want to lispify the names, also, before we forget you want to export the generated lisp names. To do this, we will use the SWIG feature directive. Let's edit the interface file such that the C type "div_t*" is changed to Lisp type ":my-pointer", we lispify all names, export everything, and do some more stuff.

    %module test
    
    %typemap(cin) div_t* ":my-pointer";
    
    %feature("intern_function", "1");
    %feature("export");
    
    %feature("inline") lispsort_double;
    %feature("intern_function", "my-lispify") lispsort_double;
    %feature("export", package="'some-other-package") lispsort_double;
    
    %rename func123 renamed_cool_func;
    
    %ignore "pointer_func";
    
    %include "test.h"
    
    

    The typemap(cin) ensures that for all arguments which are input to C with the type "div_t*", the ":my-pointer" type be used. Similarly typemap(cout) are used for all types which are returned from C.

    The feature intern_function ensures that all C names are interned using the swig-lispify function. The "1" given to the feature is optional. The use of feature like %feature("intern_function", "1"); globally enables interning for everything. If you want to target a single function, or declaration then use the targeted version of feature, %feature("intern_function", "my-lispify") lispsort_double;, here we are using an additional feature which allows us to use our lispify function.

    The export feature allows us to export the symbols. If the package argument is given, then the symbol will be exported to the specified Lisp package. The inline feature declaims the declared function as inline. The rename directive allows us to change the name(it is useful when generating C wrapper code for handling overloaded functions). The ignore directive ignores a certain declaration.

    There are several other things which are possible, to see some example of usage of SWIG look at the Lispbuilder and wxCL projects. The generated code with 'noswig-lisp' option is:

    (cl:defconstant #.(swig-lispify "y" 'constant) 5)
    
    (cl:export '#.(swig-lispify "y" 'constant))
    
    (cl:defconstant #.(swig-lispify "x" 'constant) (cl:ash 5 -1))
    
    (cl:export '#.(swig-lispify "x" 'constant))
    
    (cffi:defcstruct #.(swig-lispify "bar" 'classname)
            (#.(swig-lispify "p" 'slotname) :short)
            (#.(swig-lispify "q" 'slotname) :short)
            (#.(swig-lispify "a" 'slotname) :char)
            (#.(swig-lispify "b" 'slotname) :char)
            (#.(swig-lispify "z" 'slotname) :pointer)
            (#.(swig-lispify "n" 'slotname) :pointer))
    
    (cl:export '#.(swig-lispify "bar" 'classname))
    
    (cl:export '#.(swig-lispify "p" 'slotname))
    
    (cl:export '#.(swig-lispify "q" 'slotname))
    
    (cl:export '#.(swig-lispify "a" 'slotname))
    
    (cl:export '#.(swig-lispify "b" 'slotname))
    
    (cl:export '#.(swig-lispify "z" 'slotname))
    
    (cl:export '#.(swig-lispify "n" 'slotname))
    
    (cffi:defcvar ("my_struct" #.(swig-lispify "my_struct" 'variable))
     :pointer)
    
    (cl:export '#.(swig-lispify "my_struct" 'variable))
    
    (cffi:defcstruct #.(swig-lispify "foo" 'classname)
            (#.(swig-lispify "a" 'slotname) :int)
            (#.(swig-lispify "b" 'slotname) :pointer))
    
    (cl:export '#.(swig-lispify "foo" 'classname))
    
    (cl:export '#.(swig-lispify "a" 'slotname))
    
    (cl:export '#.(swig-lispify "b" 'slotname))
    
    (cffi:defcfun ("renamed_cool_func" #.(swig-lispify "renamed_cool_func" 'function)) :int
      (p :my-pointer)
      (q :pointer)
      (r :pointer))
    
    (cl:export '#.(swig-lispify "renamed_cool_func" 'function))
    
    (cl:declaim (cl:inline #.(my-lispify "lispsort_double" 'function)))
    
    (cffi:defcfun ("lispsort_double" #.(my-lispify "lispsort_double" 'function)) :void
      (n :int)
      (array :pointer))
    
    (cl:export '#.(my-lispify "lispsort_double" 'function) 'some-other-package)
    
    (cffi:defcenum #.(swig-lispify "color" 'enumname)
            #.(swig-lispify "RED" 'enumvalue :keyword)
            #.(swig-lispify "BLUE" 'enumvalue :keyword)
            #.(swig-lispify "GREEN" 'enumvalue :keyword))
    
    (cl:export '#.(swig-lispify "color" 'enumname))
    
    

    29.2.3 Generating CFFI bindings for C++ code

    This feature to SWIG (for CFFI) is very new and still far from complete. Pitch in with your patches, bug reports and feature requests to improve it.

    Generating bindings for C++ code, requires -c++ option to be present and it first generates C binding which will wrap the C++ code, and then generates the corresponding CFFI wrapper code. In the generated C wrapper code, you will often want to put your own C code, such as the code to include various files. This can be done by making use of "%{" and "%}" as shown below.

    %{
     #include "Test/test.h"
    %}
    

    Also, while parsing the C++ file and generating C wrapper code SWIG may need to be able to understand various symbols used in other header files. To help SWIG in doing this while ensuring that wrapper code is generated for the target file, use the "import" directive. The "include" directive specifies the target file for which wrapper code will be generated.

    
    %import "ancillary/header.h"
    
    %include "target/header.h"
    
    

    Various features which were available for C headers can also be used here. The target header which we are going to use here is:

    namespace OpenDemo {
      class Test
      {
        public:
          float x;
          // constructors
          Test (void) {x = 0;}
          Test (float X) {x = X;}
    
          // vector addition
          Test operator+ (const Test& v) const {return Test (x+v.x);}
    
          // length squared
          float lengthSquared (void) const {return this->dot (*this);}
    
          static float distance (const Test& a, const Test& b){return(a-b).length();}
    
          inline Test parallelComponent (const Test& unitBasis) const {
            return unitBasis * projection;
          }
    
          Test setYtoZero (void) const {return Test (this->x);}
    
          static const Test zero;
      };
    
      inline Test operator* (float s, const Test& v) {return v*s;}
    
      inline std::ostream& operator<< (std::ostream& o, const Test& v)
      {
        return o << "(" << v.x << ")";
      }
    
      inline Test RandomUnitVectorOnXZPlane (void)
      {
        return RandomVectorInUnitRadiusSphere().setYtoZero().normalize();
      }
    }
    

    The interface used is:

    %module test
    %include "test.cpp"
    

    SWIG generates 3 files, the first one is a C wrap which we don't show, the second is the plain CFFI wrapper which is as shown below:

    (cffi:defcfun ("_wrap_Test_x_set" Test_x_set) :void
      (self :pointer)
      (x :float))
    
    (cffi:defcfun ("_wrap_Test_x_get" Test_x_get) :float
      (self :pointer))
    
    (cffi:defcfun ("_wrap_new_Test__SWIG_0" new_Test) :pointer)
    
    (cffi:defcfun ("_wrap_new_Test__SWIG_1" new_Test) :pointer
      (X :float))
    
    (cffi:defcfun ("_wrap_Test___add__" Test___add__) :pointer
      (self :pointer)
      (v :pointer))
    
    (cffi:defcfun ("_wrap_Test_lengthSquared" Test_lengthSquared) :float
      (self :pointer))
    
    (cffi:defcfun ("_wrap_Test_distance" Test_distance) :float
      (a :pointer)
      (b :pointer))
    
    (cffi:defcfun ("_wrap_Test_parallelComponent" Test_parallelComponent) :pointer
      (self :pointer)
      (unitBasis :pointer))
    
    (cffi:defcfun ("_wrap_Test_setYtoZero" Test_setYtoZero) :pointer
      (self :pointer))
    
    (cffi:defcvar ("Test_zero" Test_zero)
     :pointer)
    
    (cffi:defcfun ("_wrap_delete_Test" delete_Test) :void
      (self :pointer))
    
    (cffi:defcfun ("_wrap___mul__" __mul__) :pointer
      (s :float)
      (v :pointer))
    
    (cffi:defcfun ("_wrap___lshift__" __lshift__) :pointer
      (o :pointer)
      (v :pointer))
    
    (cffi:defcfun ("_wrap_RandomUnitVectorOnXZPlane" RandomUnitVectorOnXZPlane) :pointer)
    

    The output is pretty good but it fails in disambiguating overloaded functions such as the constructor, in this case. One way of resolving this problem is to make the interface use the rename directiv, but hopefully there are better solutions. In addition SWIG also generates, a CLOS file

    (clos:defclass test()
      ((ff :reader ff-pointer)))
    
    (clos:defmethod (cl:setf x) (arg0 (obj test))
      (Test_x_set (ff-pointer obj) arg0))
    
    (clos:defmethod x ((obj test))
      (Test_x_get (ff-pointer obj)))
    
    (cl:shadow "+")
    (clos:defmethod + ((obj test) (self test) (v test))
      (Test___add__ (ff-pointer obj) (ff-pointer self) (ff-pointer v)))
    
    (clos:defmethod length-squared ((obj test) (self test))
      (Test_lengthSquared (ff-pointer obj) (ff-pointer self)))
    
    (clos:defmethod parallel-component ((obj test) (self test) (unitBasis test))
      (Test_parallelComponent (ff-pointer obj) (ff-pointer self) (ff-pointer unitBasis)))
    
    (clos:defmethod set-yto-zero ((obj test) (self test))
      (Test_setYtoZero (ff-pointer obj) (ff-pointer self)))
    

    I agree that the CFFI C++ module needs lot more work. But I hope it provides a starting point, on which you can base your work of importing C++ libraries to Lisp.

    If you have any questions, suggestions, patches, etc., related to CFFI module feel free to contact us on the SWIG mailing list, and also please add a "[CFFI]" tag in the subject line.

    29.2.4 Inserting user code into generated files

    It is often necessary to include user-defined code into the automatically generated interface files. For example, when building a C++ interface, example_wrap.cxx will likely not compile unless you add a #include "header.h" directive. This can be done using the SWIG %insert(section) %{ ...code... %} directive:

    %module example
    
    %{
    #include "header.h"
    %}
    
    %include "header.h"
    
    int fact(int n);
    

    Additional sections have been added for inserting into the generated lisp interface file:

    • lisphead - inserts before type declarations
    • swiglisp - inserts after type declarations according to where it appears in the .i file

    Note that the block %{ ... %} is effectively a shortcut for %insert("header") %{ ... %}.

    swig-4.0.2/Doc/Manual/Octave.html0000644000175000017500000007204213667507563016424 0ustar williamwilliam SWIG and Octave

    29 SWIG and Octave

    Octave is a high-level language intended for numerical programming that is mostly compatible with MATLAB. More information can be found at Octave web site.

    This chapter is intended to give an introduction to using the module. You should also read the SWIG documentation that is not specific to Octave. Also, there are a dozen or so examples in the Examples/octave directory, and hundreds in the test suite (Examples/test-suite and Examples/test-suite/octave).

    29.1 Preliminaries

    SWIG is regularly tested against the following versions of Octave: 3.8, 4.0, 4.2.

    Every effort is made to maintain backward compatibility with older versions of Octave. This cannot be guaranteed however, as in recent times new Octave releases have required nontrivial updates to SWIG, which may break backward compatibility for older Octave versions against which SWIG is not regularly tested.

    The SWIG runtime exports the function swig_octave_prereq() for checking the version of Octave.

    29.2 Running SWIG

    Let's start with a very simple SWIG interface file, example.i:

    %module swigexample
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo; 

    To build an Octave module when wrapping C code, run SWIG using the -octave option:

    $ swig -octave -o example_wrap.cpp example.i 

    The -c++ option is also required when wrapping C++ code:

    $ swig -octave -c++ -o example_wrap.cpp example.i 

    This creates a C++ source file "example_wrap.cpp". A C++ file is generated even when wrapping C code as Octave is itself written in C++ and requires wrapper code to be in the same language. The generated C++ source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application (in this case, the gcd implementation) to create an extension module.

    29.2.1 Command-line options

    The swig command line has a number of options you can use, like to redirect its output. Use swig -help to learn about these. Options specific to the Octave module are:

    $ swig -octave -help
    ...
    Octave Options (available with -octave)
         -globals name - Set name used to access C global variables [default: 'cvar']
                         Use '.' to load C global variables into module namespace
         -opprefix str - Prefix str for global operator functions [default: 'op_']
    

    The -globals option sets the name of the variable which is the namespace for C global variables exported by the module. The special name "." loads C global variables into the module namespace, i.e. alongside C functions and structs exported by the module. The -opprefix options sets the prefix of the names of global/friend operator functions.

    29.2.2 Compiling a dynamic module

    Octave modules are DLLs/shared objects having the ".oct" suffix. Building an oct file is usually done with the mkoctfile command (either within Octave itself, or from the shell). For example,

    $ swig -octave -c++ -o example_wrap.cpp example.i
    $ mkoctfile example_wrap.cpp example.c
    

    where "example.c" is the file containing the gcd() implementation.

    mkoctfile can also be used to extract the build parameters required to invoke the compiler and linker yourself. See the Octave manual and mkoctfile man page.

    mkoctfile will produce "swigexample.oct", which contains the compiled extension module. Loading it into Octave is then a matter of invoking

    octave:1> swigexample

    29.2.3 Using your module

    Assuming all goes well, you will be able to do this:

    $ octave -q
    octave:1> swigexample
    octave:2> swigexample.gcd(4, 6)
    ans =  2
    octave:3> swigexample.cvar.Foo
    ans =  3
    octave:4> swigexample.cvar.Foo=4;
    octave:5> swigexample.cvar.Foo
    ans =  4 

    29.3 A tour of basic C/C++ wrapping

    29.3.1 Modules

    The SWIG module directive specifies the name of the Octave module. If you specify "module swigexample", then in Octave everything in the module will be accessible under "swigexample", as in the above example. When choosing a module name, make sure you don't use the same name as a built-in Octave command or standard module name.

    When Octave is asked to invoke swigexample, it will try to find the ".m" or ".oct" file that defines the function "swigexample". You therefore need to make sure that "swigexample.oct" is in Octave's search path, which can be specified with the environment variable "OCTAVE_PATH".

    To load an Octave module, simply type its name:

    octave:1> swigexample;
    octave:2> gcd(4, 6)
    ans =  2
    octave:3> cvar.Foo
    ans =  3
    octave:4> cvar.Foo=4;
    octave:5> cvar.Foo
    ans =  4
    

    Modules can also be loaded from within functions, even before being loaded in the base context. If the module is also used in the base context, however, it must first be loaded again:

    octave:1> function l = my_lcm(a, b)
    > swigexample
    > l = abs(a*b)/swigexample.gcd(a, b);
    > endfunction
    octave:2> my_lcm(4, 6)
    ans =  12
    octave:3> swigexample.gcd(4, 6)
    error: can't perform indexing operations for <unknown type> type
    octave:3> swigexample;
    octave:4> swigexample.gcd(4, 6)
    ans =  2
    

    29.3.2 Functions

    Global functions are wrapped as new Octave built-in functions. For example,

    %module swigexample
    int fact(int n); 

    creates a built-in function swigexample.fact(n) that works exactly like you think it does:

    octave:1> swigexample.fact(4)
    24 

    29.3.3 Global variables

    Global variables are a little special in Octave. Given a global variable:

    %module swigexample
    extern double Foo;
    

    To expose variables, SWIG actually generates two functions, to get and set the value. In this case, Foo_set and Foo_set would be generated. SWIG then automatically calls these functions when you get and set the variable-- in the former case creating a local copy in the interpreter of the C variables, and in the latter case copying an interpreter variables onto the C variable.

    octave:1> swigexample;
    octave:2> c=swigexample.cvar.Foo
    c =  3
    octave:3> swigexample.cvar.Foo=4;
    octave:4> c
    c =  3
    octave:5> swigexample.cvar.Foo
    ans =  4

    If a variable is marked with the %immutable directive then any attempts to set this variable will cause an Octave error. Given a global variable:

    %module swigexample
    %immutable;
    extern double Foo;
    %mutable;
    

    SWIG will allow the reading of Foo but when a set attempt is made, an error function will be called.

    octave:1> swigexample
    octave:2> swigexample.Foo=4
    error: attempt to set immutable member variable
    error: assignment failed, or no method for `swig_type = scalar'
    error: evaluating assignment expression near line 2, column 12 

    It is possible to add new functions or variables to the module. This also allows the user to rename/remove existing functions and constants (but not linked variables, mutable or immutable). Therefore users are recommended to be careful when doing so.

    octave:1> swigexample;
    octave:2> swigexample.PI=3.142;
    octave:3> swigexample.PI
    ans =  3.1420 

    29.3.4 Constants and enums

    Because Octave doesn't really have the concept of constants, C/C++ constants are not really constant in Octave. They are actually just a copy of the value into the Octave interpreter. Therefore they can be changed just as any other value. For example given some constants:

    %module swigexample
    %constant int ICONST=42;
    #define    SCONST      "Hello World"
    enum Days{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
    

    This is 'effectively' converted into the following Octave code:

    swigexample.ICONST=42
    swigexample.SCONST="Hello World"
    swigexample.SUNDAY=0
    .... 

    29.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface: C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface:

    %module swigexample
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Octave. For example:

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("w", "junk");
    octave:3> swigexample.fputs("Hello world", f);
    octave:4> swigexample.fclose(f);
    

    Simply printing the value of a wrapped C++ type will print its typename. E.g.,

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("junk", "w");
    octave:3> f
    f =
    
    {
      _p_FILE, ptr = 0x9b0cd00
    } 

    As the user of the pointer, you are responsible for freeing it, or closing any resources associated with it (just as you would in a C program). This does not apply so strictly to classes and structs (see below).

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("not there", "r");
    error: value on right hand side of assignment is undefined
    error: evaluating assignment expression near line 2, column 2 

    29.3.6 Structures and C++ classes

    SWIG wraps C structures and C++ classes by using a special Octave type called a swig_ref. A swig_ref contains a reference to one or more instances of C/C++ objects, or just the type information for an object. For each wrapped structure and class, a swig_ref will be exposed that has the name of the type. When invoked as a function, it creates a new object of its type and returns a swig_ref that points to that instance. This provides a very natural interface. For example,

    struct Point{
      int x, y;
    };
    

    is used as follows:

    octave:1> swigexample;
    octave:2> p=swigexample.Point();
    octave:3> p.x=3;
    octave:4> p.y=5;
    octave:5> p.x, p.y
    ans =  3
    ans =  5 
    

    In C++, invoking the type object in this way calls the object's constructor. swig_ref objects can also be acquired by having a wrapped function return a pointer, reference, or value of a non-primitive type.

    The swig_ref type handles indexing operations such that usage maps closely to what you would have in C/C++. Structure members are accessed as in the above example, by calling set and get methods for C++ variables. Methods also work as expected. For example, code wrapped in the following way

    class Point{
    public:
      int x, y;
      Point(int _x, int _y) : x(_x), y(_y) {}
      double distance(const Point& rhs) {
        return sqrt(pow(x-rhs.x, 2)+pow(y-rhs.y, 2));
      }
      void set(int _x, int _y) {
        x=_x; y=_y;
      }
    };
    

    can be used from Octave like this

    octave:1> swigexample;
    octave:2> p1=swigexample.Point(3, 5);
    octave:3> p2=swigexample.Point(1, 2);
    octave:4> p1.distance(p2)
    ans =  3.6056
    

    By using the swig_this() and swig_type() functions, one can discover the pointers to and types of the underlying C/C++ object.

    octave:5> swig_this(p1)
    ans = 162504808
    octave:6> swig_type(p1)
    ans = Point
    

    Note that swig_ref is a reference-counted pointer to a C/C++ object/type, and as such has pass-by-reference semantics. For example if one has a allocated a single object but has two swig_ref's pointing to it, modifying the object through either of them will change the single allocated object. This differs from the usual pass-by-value (copy-on-write) semantics that Octave maintains for built-in types. For example, in the following snippet, modifying b does not modify a,

    octave:7> a=struct('x', 4)
    a =
    {
      x =  4
    }
    
    octave:8> b=a
    b =
    {
      x =  4
    }
    
    octave:9> b.y=4
    b =
    {
      x =  4
      y =  4
    }
    
    octave:10> a
    a =
    {
      x =  4
    }
    

    However, when dealing with wrapped objects, one gets the behavior

    octave:2> a=Point(3, 5)
    a =
    
    {
      Point, ptr = 0x9afbbb0
    }
    
    octave:3> b=a
    b =
    
    {
      Point, ptr = 0x9afbbb0
    }
    
    octave:4> b.set(2, 1);
    octave:5> b.x, b.y
    ans =  2
    ans =  1
    octave:6> a.x, a.y
    ans =  2
    ans =  1
    

    Depending on the ownership setting of a swig_ref, it may call C++ destructors when its reference count goes to zero. See the section on memory management below for details.

    29.3.7 C++ inheritance

    Single and multiple inheritance are fully supported. The swig_ref type carries type information along with any C++ object pointer it holds. This information contains the full class hierarchy. When an indexing operation (such as a method invocation) occurs, the tree is walked to find a match in the current class as well as any of its bases. The lookup is then cached in the swig_ref.

    29.3.8 C++ overloaded functions

    Overloaded functions are supported, and handled as in other modules. That is, each overload is wrapped separately (under internal names), and a dispatch function is also emitted under the external/visible name. The dispatch function selects which overload to call (if any) based on the passed arguments. typecheck typemaps are used to analyze each argument, as well as assign precedence. See the chapter on typemaps for details.

    29.3.9 C++ operators

    C++ operator overloading is supported, in a way similar to other modules. The swig_ref type supports all unary and binary operators between itself and all other types that exist in the system at module load time. When an operator is used (where one of the operands is a swig_ref), the runtime routes the call to either a member function of the given object, or to a global function whose named is derived from the types of the operands (either both or just the lhs or rhs).

    For example, if a and b are SWIG variables in Octave, a+b becomes a.__add__(b). The wrapper is then free to implement __add__ to do whatever it wants. A wrapper may define the __add__ function manually, %rename some other function to it, or %rename a C++ operator to it.

    By default the C++ operators are renamed to their corresponding Octave operators. So without doing any work, the following interface

    %inline {
    struct A {
      int value;
      A(int _value) : value(_value) {}
      A operator+ (const A& x) {
        return A(value+x.value);
      }
    };
    }
    

    is usable from Octave like this:

    a=A(2), b=A(3), c=a+b
    assert(c.value==5);
    

    Octave operators are mapped in the following way:

    __brace__      a{args}
    __brace_asgn__ a{args} = rhs
    __paren__      a(args)
    __paren_asgn__ a(args) = rhs
    __str__        generates string rep
    __not__        !a
    __uplus__      +a
    __uminus__     -a
    __transpose__  a.'
    __hermitian__  a'
    __incr__       a++
    __decr__       a--
    __add__        a + b
    __sub__        a - b
    __mul__        a * b
    __div__        a / b
    __pow__        a ^ b
    __ldiv__       a \ b
    __lshift__     a << b
    __rshift__     a >> b
    __lt__         a < b
    __le__         a <= b
    __eq__         a == b
    __ge__         a >= b
    __gt__         a > b
    __ne__         a != b
    __el_mul__     a .* b
    __el_div__     a ./ b
    __el_pow__     a .^ b
    __el_ldiv__    a .\ b
    __el_and__     a & b
    __el_or__      a | b
    

    On the C++ side, the default mappings are as follows:

    %rename(__add__)       *::operator+;
    %rename(__add__)       *::operator+();
    %rename(__add__)       *::operator+() const;
    %rename(__sub__)       *::operator-;
    %rename(__uminus__)    *::operator-();
    %rename(__uminus__)    *::operator-() const;
    %rename(__mul__)       *::operator*;
    %rename(__div__)       *::operator/;
    %rename(__mod__)       *::operator%;
    %rename(__lshift__)    *::operator<<;
    %rename(__rshift__)    *::operator>>;
    %rename(__el_and__)    *::operator&&;
    %rename(__el_or__)     *::operator||;
    %rename(__xor__)       *::operator^;
    %rename(__invert__)    *::operator~;
    %rename(__lt__)        *::operator<;
    %rename(__le__)        *::operator<=;
    %rename(__gt__)        *::operator>;
    %rename(__ge__)        *::operator>=;
    %rename(__eq__)        *::operator==;
    %rename(__ne__)        *::operator!=;
    %rename(__not__)       *::operator!;
    %rename(__incr__)      *::operator++;
    %rename(__decr__)      *::operator--;
    %rename(__paren__)     *::operator();
    %rename(__brace__)     *::operator[];
    

    Octave can also utilise friend (i.e. non-member) operators with a simple %rename: see the example in the Examples/octave/operator directory.

    29.3.10 Class extension with %extend

    The %extend directive works the same as in other modules.

    You can use it to define special behavior, like for example defining Octave operators not mapped to C++ operators, or defining certain Octave mechanisms such as how an object prints. For example, the octave_value::{is_string, string_value, print} functions are routed to a special method __str__ that can be defined inside an %extend.

    %extend A {
    string __str__() {
      stringstream sout;
      sout<<$self->value;
      return sout.str();
    }
    }
    

    Then in Octave one gets,

    octave:1> a=A(4);
    octave:2> a
    a = 4
    octave:3> printf("%s\n", a);
    4
    octave:4> a.__str__()
    4
    

    Similarly, Octave can use the __float__ method to convert an object to a numeric value.

    Octave 3.8.0 and later versions will also map unary functions X() to the corresponding __X__ method, where X includes: abs(), acos(), acosh(), angle(), arg(), asin(), asinh(), atan(), atanh(), cbrt(), ceil(), conj(), cos(), cosh(), dawson(), erf(), erfc(), erfcinv(), erfcx(), erfi(), erfinv(), exp(), expm1(), finite(), fix(), floor(), gamma(), imag(), isalnum(), isalpha(), isascii(), iscntrl(), isdigit(), isgraph(), isinf(), islower(), isna(), isnan(), isprint(), ispunct(), isspace(), isupper(), isxdigit(), lgamma(), log(), log10(), log1p(), log2(), real(), round(), roundb(), signbit(), signum(), sin(), sinh(), sqrt(), tan(), tanh(), toascii(), tolower(), toupper()

    29.3.11 C++ templates

    C++ class and function templates are fully supported as in other modules, in that the %template directive may used to create explicit instantiations of templated types. For example, function templates can be instantiated as follows:

    %module swigexample
    %inline {
      template<class __scalar>
        __scalar mul(__scalar a, __scalar b) {
        return a*b;
      }
    }
    %include <std_complex.i>
    %template(mul) mul<std::complex<double> >
    %template(mul) mul<double>
    

    and then used from Octave

    octave:1> mul(4, 3)
    ans =  12
    octave:2> mul(4.2, 3.6)
    ans =  15.120
    octave:3> mul(3+4i, 10+2i)
    ans =  22 + 46i
    

    Similarly, class templates can be instantiated as in the following example,

    %module swigexample
    %include <std_complex.i>
    %include <std_string.i>
    %inline {
      #include <sstream>
      template<class __scalar> class sum {
        __scalar s;
      public:
        sum(__scalar _s=0) : s(_s) {}
        sum& add(__scalar _s) {
          s+=_s;
          return *this;
        }
        std::string __str__() const {
          std::stringstream sout;
          sout<<s;
          return sout.str();
        }
      };
    }
    %template(sum_complex) sum<std::complex<double> >;
    %template(sum_double) sum<double>;
    

    and then used from Octave

    octave:2> a=sum_complex(2+3i);
    octave:3> a.add(2)
    ans =
    
    (4, 3)
    octave:4> a.add(3+i)
    ans =
    
    (7, 4)
    

    29.3.12 C++ Smart Pointers

    29.3.12.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Octave in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    29.3.12.2 Generic Smart Pointers

    C++ smart pointers are fully supported as in other modules.

    29.3.13 Directors (calling Octave from C++ code)

    There is full support for SWIG Directors, which permits Octave code to subclass C++ classes, and implement their virtual methods.

    Octave has no direct support for object oriented programming, however the swig_ref type provides some of this support. You can manufacture a swig_ref using the subclass function (provided by the SWIG/Octave runtime).

    For example,

    octave:1> a=subclass();
    octave:2> a.my_var = 4;
    octave:3> a.my_method = @(self) printf("my_var = ", self.my_var);
    octave:4> a.my_method();
    my_var = 4
    

    subclass() can also be used to subclass one or more C++ types. Suppose you have an interface defined by

    %inline {
    class A {
    public:
      virtual my_method() {
        printf("c-side routine called\n");
      }
    };
    void call_your_method(A& a) {
      a.my_method();
    }
    }
    

    Then from Octave you can say:

    octave:1> B=@() subclass(A(), @my_method);
    octave:2> function my_method(self)
    octave:3>   printf("octave-side routine called\n");
    octave:4> end
    octave:5> call_your_method(B());
    octave-side routine called
    

    or more concisely,

    octave:1> B=@() subclass(A(), 'my_method', @(self) printf("octave-side routine called\n"));
    octave:2> call_your_method(B());
    octave-side routine called
    

    Note that you have to enable directors via the %feature directive (see other modules for this).

    subclass() will accept any number of C++ bases or other subclass()'ed objects, (string, octave_value) pairs, and function_handles. In the first case, these are taken as base classes; in the second case, as named members (either variables or functions, depending on whether the given value is a function handle); in the third case, as member functions whose name is taken from the given function handle. E.g.,

    octave:1> B=@(some_var=2) subclass(A(), 'some_var', some_var, @some_func, 'another_func',
    @(self) do_stuff())
    

    You can also assign non-C++ member variables and functions after construct time. There is no support for non-C++ static members.

    There is limited support for explicitly referencing C++ bases. So, in the example above, we could have

    octave:1> B=@() subclass(A(), @my_method);
    octave:2> function my_method(self)
    octave:3>   self.A.my_method();
    octave:4>   printf("octave-side routine called\n");
    octave:5> end
    octave:6> call_your_method(B());
    c-side routine called
    octave-side routine called
    

    29.3.14 Threads

    The use of threads in wrapped Director code is not supported; i.e., an Octave-side implementation of a C++ class must be called from the Octave interpreter's thread. Anything fancier (apartment/queue model, whatever) is left to the user. Without anything fancier, this amounts to the limitation that Octave must drive the module... like, for example, an optimization package that calls Octave to evaluate an objective function.

    29.3.15 Memory management

    As noted above, swig_ref represents a reference counted pointer to a C/C++-side object. It also contains a flag indicating whether Octave or the C/C++ code owns the object. If Octave owns it, any destructors will be called when the reference count reaches zero. If the C/C++ side owns the object, then destructors will not be called when the reference count goes to zero.

    For example,

    %inline {
    class A {
    public:
      A() { printf("A constructing\n"); }
      ~A() { printf("A destructing\n"); }
    };
    }
    

    Would produce this behavior in Octave:

    octave:1> a=A();
    A constructing
    octave:2> b=a;
    octave:3> clear a;
    octave:4> b=4;
    A destructing
    

    The %newobject directive may be used to control this behavior for pointers returned from functions.

    In the case where one wishes for the C++ side to own an object that was created in Octave (especially a Director object), one can use the __disown() method to invert this logic. Then letting the Octave reference count go to zero will not destroy the object, but destroying the object will invalidate the Octave-side object if it still exists (and call destructors of other C++ bases in the case of multiple inheritance/subclass()'ing).

    29.3.16 STL support

    Various STL library files are provided for wrapping STL containers.

    29.3.17 Matrix typemaps

    Octave provides a rich set of classes for dealing with matrices. Currently there are no built-in typemaps to deal with those. However, these are relatively straight forward for users to add themselves (see the docs on typemaps). Without much work (a single typemap decl-- say, 5 lines of code in the interface file), it would be possible to have a function

    double my_det(const double* mat, int m, int n);
    

    that is accessed from Octave as,

    octave:1> my_det(rand(4));
    ans = -0.18388
    

    swig-4.0.2/Doc/Manual/Php.html0000644000175000017500000010603213667507563015727 0ustar williamwilliam SWIG and PHP

    31 SWIG and PHP

    In this chapter, we discuss SWIG's support of PHP. SWIG currently supports generating wrappers for PHP7. Support for PHP5 was removed in SWIG 4.0.0 and support for PHP4 was removed in SWIG 1.3.37.

    Currently any PHP7 release should work.

    In order to use this module, you will need to have a copy of the PHP include files to compile the SWIG generated files. If you installed PHP from a binary package, you may need to install a "php-dev" or "php-devel" package for these to be installed. You can find out where these files are by running php-config --includes. To use the built PHP module you will need either the php binary or the Apache php module. If you want to build your extension into php directly, you will need the complete PHP source tree available.

    31.1 Generating PHP Extensions

    To build a PHP extension, run swig using the -php7 option as follows (-php is also supported and currently is an alias for -php7 but prior to SWIG 4.0.0 it was an alias for -php5):

    swig -php7 example.i
    

    This will produce 3 files example_wrap.c, php_example.h and example.php. The first file, example_wrap.c contains all of the C code needed to build a PHP extension. The second file, php_example.h contains the header information needed if you wish to statically link the extension into the php interpreter. The third file, example.php can be included by PHP scripts. It attempts to dynamically load the extension and contains extra php code specified in the interface file. If wrapping C++ code with PHP classes, it will also contain PHP class wrappers.

    SWIG can generate PHP extensions from C++ libraries as well when given the -c++ option. The support for C++ is discussed in more detail in section 27.2.6. The generated C++ wrapper will be called example_wrap.cxx. You can specify a different extension for the C++ wrapper using -cppext - e.g. if you want example_wrap.cc use -cppext cc.

    The usual (and recommended) way is to build the extension as a separate dynamically loaded module (which is supported by all modern operating systems).

    It is also possible to rebuild PHP from source so that your module is statically linked into the php executable/library. This is a lot more work, and also requires a full rebuild of PHP to update your module, and it doesn't play nicely with package system. We don't recommend this approach, or provide explicit support for it.

    31.1.1 Building a loadable extension

    To build your module as a dynamically loadable extension, use compilation commands like these (if you aren't using GCC, the commands will be different, and there may be some variation between platforms - these commands should at least work for Linux though):

            gcc `php-config --includes` -fpic -c example_wrap.c example.c
            gcc -shared example_wrap.o example.o -o example.so
    

    31.1.2 Using PHP Extensions

    To test the extension from a PHP script, you first need to tell PHP to load it. To do this, add a line like this to the [PHP] section of php.ini:

            extension=/path/to/modulename.so
    

    If the module is in PHP's default extension directory, you can omit the path.

    For some SAPIs (for example, the CLI SAPI) you can instead use the dl() function to load an extension at run time, by adding a line like this to the start of each PHP script which uses your extension:

            dl("/path/to/modulename.so"); // Load the module
    

    But note that dl() isn't supported when running PHP through a webserver - you'll need to use extension in php.ini as described above.

    The PHP module which SWIG generates will also attempt to do the dl() call for you if the extension isn't already loaded:

            include("example.php");
    

    This PHP module also defines the PHP classes for the wrapped API, so you'll almost certainly want to include it anyway.

    31.2 Basic PHP interface

    It is important to understand that PHP uses a single global namespace into which all symbols from extension modules are loaded. It is quite possible for names of symbols in one extension module to clash with other symbols unless care is taken to %rename them. At present SWIG doesn't have support for generating wrappers which make use of PHP's namespace feature.

    31.2.1 Constants

    These work in much the same way as in C/C++. Constants can be defined by using either the normal C pre-processor declarations, or the %constant SWIG directive. These will then be available from your PHP script as a PHP constant, (i.e. no dollar sign is needed to access them.) For example, with a swig interface file like this,

    %module example
    
    #define PI 3.14159
    
    %constant int E  = 2.71828
    

    you can access the constants in your PHP script like this,

    include("example.php");
    
    echo "PI = " . PI . "\n";
    
    echo "E = " . E . "\n";
    
    

    There's one peculiarity of how constants work in PHP which it is useful to note (this is not specific to SWIG though) - if you try to use an undeclared constant, PHP will emit a warning (or a notice in PHP 7.1 and earlier) and then expand the constant to a string version of the constant's name. Unfortunately it is easy to miss the warning message if you're using PHP in a webserver as it will probably end up in error.log or similar. Apparently this will throw an Error in a future version of PHP, but until then it's something to be aware of.

    For example,

    %module example
    
    #define EASY_TO_MISPELL 0
    

    accessed incorrectly in PHP,

    include("example.php");
    
    if(EASY_TO_MISPEL) {
      ...
    } else {
      ...
    }
    
    

    The mis-spelled constant will become the string 'EASY_TO_MISPEL', which is treated as true by the if test, when the value of the intended constant would be treated as false!

    31.2.2 Global Variables

    Because PHP does not provide a mechanism to intercept access and assignment of global variables, global variables are supported through the use of automatically generated accessor functions.

    %module example;
    
    %inline %{
      double seki = 2;
      void print_seki() {
        zend_printf("seki is now %f\n", seki);
      }
    %}
    

    is accessed as follows:

    include("example.php");
    print seki_get();
    seki_set( seki_get() * 2); # The C variable is now 4.
    print seki_get();
    

    SWIG supports global variables of all C datatypes including pointers and complex objects. Additional types can be supported by using the varinit typemap.

    SWIG honors the %immutable modifier by not generating code for the _set method. This provides read-only access to the variable from the php script. Attempting to access the _set method will result in a php fatal error because the function is undefined.

    At this time SWIG does not support custom accessor methods.

    31.2.3 Functions

    C functions are converted into PHP functions. Default/optional arguments are also allowed. An interface file like this :

    %module example
    int foo(int a);
    double bar(double, double b = 3.0);
    ...
    

    Will be accessed in PHP like this :

    include("example.php");
    $a = foo(2);
    $b = bar(3.5, -1.5);
    $c = bar(3.5);  # Use default argument for 2nd parameter
    
    

    31.2.4 Overloading

    Although PHP does not support overloading functions natively, swig will generate dispatch functions which will use %typecheck typemaps to allow overloading. This dispatch function's operation and precedence is described in Overloaded functions and methods.

    31.2.5 Pointers and References

    Pointers to C/C++ objects are represented as PHP resources, rather like MySQL connection handles.

    There are multiple ways to wrap pointers to simple types. Given the following C method:

      void add( int *in1, int *in2, int *result);
    

    One can include cpointer.i to generate PHP wrappers to int *.

    %module example
    %include "cpointer.i"
    %pointer_functions(int, intp)
    
    void add( int *in1, int *in2, int *result);
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1=copy_intp(3);
    $in2=copy_intp(5);
    $result=new_intp();
    
    add( $in1, $in2, $result );
    
    echo "The sum " . intp_value($in1) . " + " . intp_value($in2) . " = " . intp_value( $result) . "\n";
    ?>
    

    An alternative would be to use the include typemaps.i which defines named typemaps for INPUT, OUTPUT and INOUT variables. One needs to either %apply the appropriate typemap or adjust the parameter names as appropriate.

    %module example
    %include "typemaps.i"
    
    void add( int *INPUT, int *INPUT, int *OUTPUT);
    
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1 = 3;
    $in2 = 5;
    $result= add($in1, $in2);  # Note using variables for the input is unnecessary.
    
    echo "The sum $in1 + $in2 = $result\n";
    ?>
    

    Because PHP has a native concept of reference, it may seem more natural to the PHP developer to use references to pass pointers. To enable this, one needs to include phppointers.i which defines the named typemap REF.

    In case you write your own typemaps, SWIG supports an attribute called byref: if you set that, then SWIG will make sure that the generated wrapper function will want the input parameter as a reference.

    %module example
    %include "phppointers.i"
    
    void add( int *REF, int *REF, int *REF);
    
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1 = 3;
    $in2 = 5;
    $result = 0;
    add($in1, $in2, $result);
    
    echo "The sum $in1 + $in2 = $result\n";
    ?>
    

    It is important to note that a php variable which is NULL when passed by reference would end up passing a NULL pointer into the function. In PHP, an unassigned variable (i.e. where the first reference to the variable is not an assignment) is NULL. In the above example, if any of the three variables had not been assigned, a NULL pointer would have been passed into add. Depending on the implementation of the function, this may or may not be a good thing.

    We chose to allow passing NULL pointers into functions because that is sometimes required in C libraries. A NULL pointer can be created in PHP in a number of ways: by using unset on an existing variable, or assigning NULL to a variable.

    31.2.6 Structures and C++ classes

    SWIG defaults to wrapping C++ structs and classes with PHP classes - this is done by generating a PHP wrapper script which defines proxy classes which calls a set of flat functions which actually wrap the C++ class. You can disable this wrapper layer by passing the command-line option "-noproxy" in which case you'll just get the flat functions.

    This interface file

    %module vector
    
    class Vector {
    public:
      double x, y, z;
      Vector();
      ~Vector();
      double magnitude();
    };
    
    struct Complex {
     double re, im;
    };
    

    Would be used in the following way from PHP:

    <?php
      require "vector.php";
    
      $v = new Vector();
      $v->x = 3;
      $v->y = 4;
      $v->z = 5;
    
      echo "Magnitude of ($v->x, $v->y, $v->z) = " . $v->magnitude() . "\n";
    
      $v = NULL;   # destructor called.
    
      $c = new Complex();
    
      $c->re = 0;
      $c->im = 0;
    
      # $c destructor called when $c goes out of scope.
    ?>
    

    Member variables and methods are accessed using the -> operator.

    31.2.6.1 Using -noproxy

    The -noproxy option flattens the object structure and generates collections of named functions (these are the functions which the PHP class wrappers call). The above example results in the following PHP functions:

    new_Vector();
    Vector_x_set($obj, $d);
    Vector_x_get($obj);
    Vector_y_set($obj, $d);
    Vector_y_get($obj);
    Vector_z_set($obj, $d);
    Vector_z_get($obj);
    Vector_magnitude($obj);
    new_Complex();
    Complex_re_set($obj, $d);
    Complex_re_get($obj);
    Complex_im_set($obj, $d);
    Complex_im_get($obj);
    

    31.2.6.2 Constructors and Destructors

    The constructor is called when new Object() (or new_Object() if using -noproxy) is used to create an instance of the object. If multiple constructors are defined for an object, function overloading will be used to determine which constructor to execute.

    Because PHP uses reference counting to manage resources, simple assignment of one variable to another such as:

    $ref = $v;
    

    causes the symbol $ref to refer to the same underlying object as $v. This does not result in a call to the C++ copy constructor or copy assignment operator.

    One can force execution of the copy constructor by using:

    $o_copy = new Object($o);
    

    Destructors are automatically called when all variables referencing the instance are reassigned or go out of scope. The destructor is not available to be called manually. To force a destructor to be called the programmer can either reassign the variable or call unset($v)

    31.2.6.3 Static Member Variables

    Static member variables in C++ are not wrapped as such in PHP as it does not appear to be possible to intercept accesses to such variables. Therefore, static member variables are wrapped using a class function with the same name, which returns the current value of the class variable. For example

    %module example
    
    class Ko {
      static int threats;
    };
    
    

    would be accessed in PHP as,

    include("example.php");
    
    echo "There have now been " . Ko::threats() . " threats\n";
    
    

    To set the static member variable, pass the value as the argument to the class function, e.g.

    
    Ko::threats(10);
    
    echo "There have now been " . Ko::threats() . " threats\n";
    
    

    31.2.6.4 Static Member Functions

    Static member functions are supported in PHP using the class::function() syntax. For example

    %module example
    class Ko {
      static void threats();
    };
    
    would be executed in PHP as,
    include("example.php");
    Ko::threats();
    

    31.2.6.5 Specifying Implemented Interfaces

    PHP supports the concept of abstract interfaces which a class can implement. Since SWIG 3.0.3, you can tell SWIG that a wrapped class (for example MyIterator) implements the Iterator interface like so:

    %typemap("phpinterfaces") MyIterator "Iterator";
    

    If there are multiple interfaces, just list them separated by commas.

    31.2.7 PHP Pragmas, Startup and Shutdown code

    To place PHP code in the generated "example.php" file one can use the code pragma. The code is inserted after loading the shared object.

    %module example
    %pragma(php) code="
    # This code is inserted into example.php
    echo \"example.php execution\\n\";
    "
    

    Results in the following in "example.php"

    # This code is inserted into example.php
    echo "example.php execution\n";
    

    The version pragma can be used to add version to generated PHP extension module. The version is inserted in the zend_module_entry block.

    %module example
    %pragma(php) version="1.5"
    

    The include pragma is a short cut to add include statements to the example.php file.

    %module example
    %pragma(php) code="
    include \"include.php\";
    "
    %pragma(php) include="include.php"   // equivalent.
    

    The phpinfo pragma inserts code in the PHP_MINFO_FUNCTION which is called from PHP's phpinfo() function.

    %module example;
    %pragma(php) phpinfo="
      zend_printf("An example of PHP support through SWIG\n");
      php_info_print_table_start();
      php_info_print_table_header(2, \"Directive\", \"Value\");
      php_info_print_table_row(2, \"Example support\", \"enabled\");
      php_info_print_table_end();
    "
    

    To insert code into the PHP_MINIT_FUNCTION, one can use either %init or %minit.

    %module example;
    %init {
      zend_printf("Inserted into PHP_MINIT_FUNCTION\n");
    }
    %minit {
      zend_printf("Inserted into PHP_MINIT_FUNCTION\n");
    }
    

    To insert code into the PHP_MSHUTDOWN_FUNCTION, one can use either %shutdown or %mshutdown.

    %module example;
    %mshutdown {
      zend_printf("Inserted into PHP_MSHUTDOWN_FUNCTION\n");
    }
    

    The %rinit and %rshutdown statements are very similar but insert code into the request init (PHP_RINIT_FUNCTION) and request shutdown (PHP_RSHUTDOWN_FUNCTION) code respectively.

    31.3 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to PHP. In particular, if a C++ class has been extended in PHP (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG 1.3.18 to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. Support for generating PHP classes has been added in SWIG 1.3.40. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to PHP implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in PHP and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor PHP code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    31.3.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      Foo(int foo);
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    then at the PHP side you can define

    require("mymodule.php");
    
    class MyFoo extends Foo {
      function one() {
        print "one from php\n";
      }
    }
    

    31.3.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the PHP proxy classes. The director classes store a pointer to their underlying PHP object. Indeed, this is quite similar to the "_cPtr" and "thisown" members of the PHP proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in PHP via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in PHP were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or PHP. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in PHP, the Zend API is used to call the method of the underlying PHP object (after which the usual virtual method resolution in PHP automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in PHP, unless there's a good reason not to. The reason for this is simple: PHP has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the PHP proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the PHP method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the called and the declaring class name of the given method. If these are not the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in PHP, SWIG creates an instance of the original C++ class and assigns it to ->_cPtr. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through PHP.

    31.3.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. PHP instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to the PHP object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special ->thisown property of the proxy class. After setting this property to 0, the director class no longer destroys the PHP object. Assuming no outstanding references to the PHP object remain, the PHP object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    Here is an example:

    class Foo {
    public:
      ...
    };
    class FooContainer {
    public:
      void addFoo(Foo *);
      ...
    };
    

    $c = new FooContainer();
    $a = new Foo();
    $a->thisown = 0;
    $c->addFoo($a);
    

    In this example, we are assuming that FooContainer will take care of deleting all the Foo pointers it contains at some point.

    31.3.4 Exception unrolling

    With directors routing method calls to PHP, and proxies routing them to C++, the handling of exceptions is an important concern. By default, an exception thrown in PHP code called from C++ causes the PHP interpreter to flag that an exception is thrown, then return passes to C++ as if the PHP function had returned Null. Assuming the directorout typemaps handle this (those SWIG defines by default should) then once control returns to PHP code again, the PHP exception will actually propagate.

    Sometimes this control flow is problematic, and you want to skip any handling in the C++ code. To achieve this, it is necessary to temporarily translate the PHP exception into a C++ exception. This can be achieved using the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
      if ($error == FAILURE) {
        throw Swig::DirectorMethodException();
      }
    }
    

    This code will check the PHP error state after each method call from a director into PHP, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler. Currently no information about the PHP error is stored in the Swig::DirectorMethodException object, but this will likely change in the future.

    It may be the case that a method call originates in PHP, travels up to C++ through a proxy class, and then back into PHP via a director method. If an exception occurs in PHP at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
      try { $action }
      catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the PHP error state is still set when Swig::DirectorMethodException is thrown, PHP will register the exception as soon as the C wrapper function returns.

    31.3.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in PHP and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from PHP. Relative to the speed of PHP execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through PHP in order to ensure that the method does not have an extended PHP implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with PHP objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to PHP objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in PHP.

    31.3.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    31.3.7 Miscellaneous

    Director typemaps for STL classes are mostly in place, and hence you should be able to use std::string, etc., as you would any other type.

    swig-4.0.2/Doc/Manual/Tcl.html0000644000175000017500000023545313667507563015734 0ustar williamwilliam SWIG and Tcl

    36 SWIG and Tcl

    Caution: This chapter is under repair!

    This chapter discusses SWIG's support of Tcl. SWIG currently requires Tcl 8.0 or a later release. Earlier releases of SWIG supported Tcl 7.x, but this is no longer supported.

    36.1 Preliminaries

    To build a Tcl module, run SWIG using the -tcl or -tcl8 option :

    $ swig -tcl example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -tcl example.i
    

    This creates a file example_wrap.c or example_wrap.cxx that contains all of the code needed to build a Tcl extension module. To finish building the module, you need to compile this file and link it with the rest of your program.

    36.1.1 Getting the right header files

    In order to compile the wrapper code, the compiler needs the tcl.h header file. This file is usually contained in the directory

    /usr/local/include
    

    Be aware that some Tcl versions install this header file with a version number attached to it. If this is the case, you should probably make a symbolic link so that tcl.h points to the correct header file.

    36.1.2 Compiling a dynamic module

    The preferred approach to building an extension module is to compile it into a shared object file or DLL. Assuming you have code you need to link to in a file called example.c, you will need to compile your program using commands like this (shown for Linux):

    $ swig -tcl example.i
    $ gcc -fPIC -c example.c
    $ gcc -fPIC -c example_wrap.c -I/usr/local/include
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The exact commands for doing this vary from platform to platform. SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/tcl directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the output file has to match the name of the module. If the name of your SWIG module is "example", the name of the corresponding object file should be "example.so". The name of the module is specified using the %module directive or the -module command line option.

    36.1.3 Static linking

    An alternative approach to dynamic linking is to rebuild the Tcl interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Tcl involves writing a special function Tcl_AppInit() and using it to initialize the interpreter and your module. With SWIG, the tclsh.i and wish.i library files can be used to rebuild the tclsh and wish interpreters respectively. For example:

    %module example
    
    %inline %{
    extern int fact(int);
    extern int mod(int, int);
    extern double My_variable;
    %}
    
    %include "tclsh.i"       // Include code for rebuilding tclsh
    
    

    The tclsh.i library file includes supporting code that contains everything needed to rebuild tclsh. To rebuild the interpreter, you simply do something like this:

    $ swig -tcl example.i
    $ gcc example.c example_wrap.c \
            -Xlinker -export-dynamic \
            -DHAVE_CONFIG_H -I/usr/local/include/ \
            -L/usr/local/lib -ltcl -lm -ldl \
            -o mytclsh
    
    

    You will need to supply the same libraries that were used to build Tcl the first time. This may include system libraries such as -lsocket, -lnsl, and -lpthread. If this actually works, the new version of Tcl should be identical to the default version except that your extension module will be a built-in part of the interpreter.

    Comment: In practice, you should probably try to avoid static linking if possible. Some programmers may be inclined to use static linking in the interest of getting better performance. However, the performance gained by static linking tends to be rather minimal in most situations (and quite frankly not worth the extra hassle in the opinion of this author).

    36.1.4 Using your module

    To use your module, simply use the Tcl load command. If all goes well, you will be able to this:

    $ tclsh
    % load ./example.so
    % fact 4
    24
    %
    

    A common error received by first-time users is the following:

    % load ./example.so
    couldn't find procedure Example_Init
    % 
    

    This error is almost always caused when the name of the shared object file doesn't match the name of the module supplied using the SWIG %module directive. Double-check the interface to make sure the module name and the shared object file match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

    Another common error is something similar to the following:

    % load ./example.so
    couldn't load file "./example.so": ./example.so: undefined symbol: fact
    % 
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o example.so
    

    If the foo library is compiled as a shared library, you might get the following problem when you try to use your module:

    % load ./example.so
    couldn't load file "./example.so": libfoo.so: cannot open shared object file:
    No such file or directory
    %        
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To fix this problem, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib \
          -o example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Tcl, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib tclsh
    

    Finally, you can use a command such as ldconfig to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    36.1.5 Compilation of C++ extensions

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Tcl interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    % swig -c++ -tcl example.i
    % g++ -fPIC -c example.cxx
    % g++ -fPIC -c example_wrap.cxx -I/usr/local/include
    % g++ -shared example.o example_wrap.o -o example.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    % swig -c++ -tcl example.i
    % CC -KPIC -c example.cxx
    % CC -KPIC -c example_wrap.cxx -I/usr/local/include
    % CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o example.so -lCrun
    

    Of course, the extra libraries to use are completely non-portable---you will probably need to do some experimentation.

    Sometimes people have suggested that it is necessary to relink the Tcl interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Tcl.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    As a final complication, a major weakness of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Tcl, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. If working with lots of software components, you might want to investigate using a more formal standard such as COM.

    36.1.6 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Tcl executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    36.1.7 Setting a package prefix

    To avoid namespace problems, you can instruct SWIG to append a package prefix to all of your functions and variables. This is done using the -prefix option as follows :

    swig -tcl -prefix Foo example.i
    

    If you have a function "bar" in the SWIG file, the prefix option will append the prefix to the name when creating a command and call it "Foo_bar".

    36.1.8 Using namespaces

    Alternatively, you can have SWIG install your module into a Tcl namespace by specifying the -namespace option :

    swig -tcl -namespace example.i
    

    By default, the name of the namespace will be the same as the module name, but you can override it using the -prefix option.

    When the -namespace option is used, objects in the module are always accessed with the namespace name such as Foo::bar.

    36.2 Building Tcl/Tk Extensions under Windows 95/NT

    Building a SWIG extension to Tcl/Tk under Windows 95/NT is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into tclsh or wish. This section covers the process of using SWIG with Microsoft Visual C++. although the procedure may be similar with other compilers.

    36.2.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly follows these steps :

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -tcl -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Tcl installation under "Additional include directories".
    • Finally, select the settings for the entire project and go to "Link Options". Add the Tcl library file to your link libraries. For example "tcl80.lib". Also, set the name of the output file to match the name of your Tcl module (ie. example.dll).
    • Build your project.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Tcl extension, simply run tclsh or wish and use the load command. For example :

    MSDOS > tclsh80
    % load example.dll
    % fact 4
    24
    %
    

    36.2.2 Using NMAKE

    Alternatively, SWIG extensions can be built by writing a Makefile for NMAKE. To do this, make sure the environment variables for MSVC++ are available and the MSVC++ tools are in your path. Now, just write a short Makefile like this :

    # Makefile for building various SWIG generated extensions
    
    SRCS          = example.c
    IFILE         = example
    INTERFACE     = $(IFILE).i
    WRAPFILE      = $(IFILE)_wrap.c
    
    # Location of the Visual C++ tools (32 bit assumed)
    
    TOOLS         = c:\msdev
    TARGET        = example.dll
    CC            = $(TOOLS)\bin\cl.exe
    LINK          = $(TOOLS)\bin\link.exe
    INCLUDE32     = -I$(TOOLS)\include
    MACHINE       = IX86
    
    # C Library needed to build a DLL
    
    DLLIBC        = msvcrt.lib oldnames.lib  
    
    # Windows libraries that are apparently needed
    WINLIB        = kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib 
    winspool.lib
    
    # Libraries common to all DLLs
    LIBS          = $(DLLIBC) $(WINLIB) 
    
    # Linker options
    LOPT      = -debug:full -debugtype:cv /NODEFAULTLIB /RELEASE /NOLOGO /
    MACHINE:$(MACHINE) -entry:_DllMainCRTStartup@12 -dll
    
    # C compiler flags
    
    CFLAGS    = /Z7 /Od /c /nologo
    TCL_INCLUDES  = -Id:\tcl8.0a2\generic -Id:\tcl8.0a2\win
    TCLLIB        = d:\tcl8.0a2\win\tcl80.lib
    
    tcl:
            ..\..\swig -tcl -o $(WRAPFILE) $(INTERFACE)
            $(CC) $(CFLAGS) $(TCL_INCLUDES) $(SRCS) $(WRAPFILE)
            set LIB=$(TOOLS)\lib
            $(LINK) $(LOPT) -out:example.dll $(LIBS) $(TCLLIB) example.obj example_wrap.obj
    
    

    To build the extension, run NMAKE (you may need to run vcvars32 first). This is a pretty minimal Makefile, but hopefully its enough to get you started. With a little practice, you'll be making lots of Tcl extensions.

    36.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Tcl interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped in an interface that mimics the style of Tk widgets and [incr Tcl] classes. This section briefly covers the essential aspects of this wrapping.

    36.3.1 Modules

    The SWIG %module directive specifies the name of the Tcl module. If you specify `%module example', then everything is compiled into an extension module example.so. When choosing a module name, make sure you don't use the same name as a built-in Tcl command.

    One pitfall to watch out for is module names involving numbers. If you specify a module name like %module md5, you'll find that the load command no longer seems to work:

    % load ./md5.so
    couldn't find procedure Md_Init
    

    To fix this, supply an extra argument to load like this:

    % load ./md5.so md5
    

    36.3.2 Functions

    Global functions are wrapped as new Tcl built-in commands. For example,

    %module example
    int fact(int n);
    

    creates a built-in function fact that works exactly like you think it does:

    % load ./example.so
    % fact 4
    24
    % set x [fact 6]
    %
    

    36.3.3 Global variables

    C/C++ global variables are wrapped by Tcl global variables. For example:

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern double density;
    %}
    ...
    

    Now look at the Tcl interface:

    % puts $density          # Output value of C global variable
    1.0
    % set density 0.95       # Change value
    

    If you make an error in variable assignment, you will get an error message. For example:

    % set density "hello"
    can't set "density": Type error. expected a double.
    %
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    36.3.4 Constants and enums

    C/C++ constants are installed as global Tcl variables containing the appropriate value. To create a constant, use #define, enum, or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    enum Beverage { ALE, LAGER, STOUT, PILSNER };
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    For enums, make sure that the definition of the enumeration actually appears in a header file or in the wrapper file somehow---if you just stick an enum in a SWIG interface without also telling the C compiler about it, the wrapper code won't compile.

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using the cvar object described in the previous section. They are not wrapped as constants. For further discussion about this, see the SWIG Basics chapter.

    Constants are not guaranteed to remain constant in Tcl---the value of the constant could be accidentally reassigned.You will just have to be careful.

    A peculiarity of installing constants as variables is that it is necessary to use the Tcl global statement to access constants in procedure bodies. For example:

    proc blah {} {
      global FOO
      bar $FOO
    }
    

    If a program relies on a lot of constants, this can be extremely annoying. To fix the problem, consider using the following typemap rule:

    %apply int CONSTANT { int x };
    #define FOO 42
    ...
    void bar(int x);
    

    When applied to an input argument, the CONSTANT rule allows a constant to be passed to a function using its actual value or a symbolic identifier name. For example:

    proc blah {} {
      bar FOO
    }
    

    When an identifier name is given, it is used to perform an implicit hash-table lookup of the value during argument conversion. This allows the global statement to be omitted.

    36.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Tcl. For example:

    % load ./example.so
    % set f [fopen junk w]
    % fputs "Hello World\n" $f
    % fclose $f
    

    If this makes you uneasy, rest assured that there is no deep magic involved. Underneath the covers, pointers to C/C++ objects are simply represented as opaque values--normally an encoded character string like this:

    % puts $f
    _c0671108_p_FILE
    % 
    

    This pointer value can be freely passed around to different C functions that expect to receive an object of type FILE *. The only thing you can't do is dereference the pointer from Tcl.

    The NULL pointer is represented by the string NULL.

    As much as you might be inclined to modify a pointer value directly from Tcl, don't. The hexadecimal encoding is not necessarily the same as the logical memory address of the underlying object. Instead it is the raw byte encoding of the pointer value. The encoding will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Similarly, don't try to manually cast a pointer to a new type by simply replacing the type-string. This may not work like you expect and it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return None if the conversion can't be performed.

    36.3.6 Structures

    If you wrap a C structure, it is wrapped by a Tcl interface that somewhat resembles a Tk widget. This provides a very natural interface. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    % Vector v
    % v configure -x 3.5 -y 7.2
    % puts "[v cget -x] [v cget -y] [v cget -z]"
    3.5 7.2 0.0
    % 
    

    Similar access is provided for unions and the data members of C++ classes.

    In the above example, v is a name that's used for the object. However, underneath the covers, there's a pointer to a raw C structure. This can be obtained by looking at the -this attribute. For example:

    % puts [v cget -this]
    _88e31408_p_Vector
    

    Further details about the relationship between the Tcl and the underlying C structure are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Tcl, you will see behavior like this:

    % Bar b
    % puts [b cget -x]
    _801861a4_p_int
    % 
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    % Bar c
    % c configure -x [b cget -x]   # Copy contents of b.x to c.x
    

    For array assignment, SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    % Bar b
    % set x [b cget -f]
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    However, one peculiarity of accessing a substructure like this is that the returned value does work quite like you might expect. For example:

    % Bar b
    % set x [b cget -f]
    % x cget -a
    invalid command name "x"
    

    This is because the returned value was not created in a normal way from the interpreter (x is not a command object). To make it function normally, just evaluate the variable like this:

    % Bar b
    % set x [b cget -f]
    % $x cget -a
    0
    %
    

    In this example, x points inside the original structure. This means that modifications work just like you would expect. For example:

    
    % Bar b
    % set x [b cget -f]
    % $x configure -a 3            # Modifies contents of f (inside b)
    % [b cget -f] -configure -a 3  # Same thing
    

    In many of these structure examples, a simple name like "v" or "b" has been given to wrapped structures. If necessary, this name can be passed to functions that expect to receive an object. For example, if you have a function like this,

    void blah(Foo *f);
    

    you can call the function in Tcl as follows:

    % Foo x            # Create a Foo object 
    % blah x           # Pass the object to a function
    

    It is also possible to call the function using the raw pointer value. For instance:

    % blah [x cget -this]   # Pass object to a function
    

    It is also possible to create and use objects using variables. For example:

    % set b [Bar]            # Create a Bar
    % $b cget -f             # Member access
    % puts $b
    _108fea88_p_Bar
    %
    

    Finally, to destroy objects created from Tcl, you can either let the object name go out of scope or you can explicitly delete the object. For example:

    % Foo f                 # Create object f
    % rename f ""
    

    or

    % Foo f                 # Create object f
    % f -delete
    

    Note: Tcl only destroys the underlying object if it has ownership. See the memory management section that appears shortly.

    36.3.7 C++ classes

    C++ classes are wrapped as an extension of structure wrapping. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Tcl like this:

    % List x
    % x insert Ale
    % x insert Stout
    % x insert Lager
    % x get 1
    Stout
    % puts [x cget -length]
    3
    %
    

    Class data members are accessed in the same manner as C structures.

    Static class members are accessed as global functions or variables. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Tcl, the static member is accessed as follows:

    % Spam_foo        # Spam::foo()
    % puts $Spam_bar  # Spam::bar
    

    36.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    An object of type Bar can be used where a Foo is expected. For example, if you have this function:

    void spam(Foo *f);
    

    then the function spam() accepts a Foo * or a pointer to any class derived from Foo. For instance:

    % Foo f      # Create a Foo
    % Bar b      # Create a Bar
    % spam f     # OK
    % spam b     # OK
    

    It is safe to use multiple inheritance with SWIG.

    36.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In Tcl, there is no detailed distinction like this. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    % Foo f             # Create a Foo
    % spam1 f           # Ok. Pointer
    % spam2 f           # Ok. Reference
    % spam3 f           # Ok. Value.
    % spam4 f           # Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Tcl will release this memory when the return value is garbage collected).

    36.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Tcl in a straightforward manner:

    % foo 3            # foo(int)
    % foo Hello        # foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Tcl code like this:

    % Foo f                # Create a Foo
    % Foo g f              # Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);    
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);    
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    36.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
      
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like this:

    % Complex c 3 4
    % Complex d 7 8
    % set e [c + d]
    % $e re
    10.0
    % $e im
    12.0
    

    It should be stressed that operators in SWIG have no relationship to operators in Tcl. In fact, the only thing that's happening here is that an operator like operator + has been renamed to a method +. Therefore, the statement [c + d] is really just invoking the + method on c. When more than operator is defined (with different arguments), the standard method overloading facilities are used. Here is a rather odd looking example:

    % Complex c 3 4
    % Complex d 7 8
    % set e [c - d]       # operator-(const Complex &)
    % puts "[$e re] [$e im]"
    10.0 12.0
    % set f [c -]         # operator-()
    % puts "[$f re] [$f im]"
    -3.0 -4.0
    %
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG doesn't know what to do with the friend function--in fact, it simply ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    ...
    Complex operator+(double, const Complex &c);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    36.3.12 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Tcl as follows:

    % load ./example.so
    % fact 3
    6
    % Vector v
    % v configure -x 3.4
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    36.3.13 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Tcl:

    % pairii p 3 4
    % p cget -first
    3
    % p cget -second
    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    36.3.14 C++ Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Tcl, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Tcl, everything should just "work":

    % set p [CreateFoo]                  # Create a smart-pointer somehow
    % $p configure -x 3                  # Foo::x
    % $p bar                             # Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    % set f [$p __deref__]    # Returns underlying Foo *
    

    36.4 Further details on the Tcl class interface

    In the previous section, a high-level view of Tcl wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Tcl class-like objects. This provides a very natural Tcl interface and allows SWIG to support a number of advanced features such as operator overloading. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work.

    36.4.1 Proxy classes

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a class like this

    class Foo {
    public:
      int x;
      int spam(int);
      ...
    

    then SWIG transforms it into a set of low-level procedural wrappers. For example:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int arg1) {
      return f->spam(arg1);
    }
    

    These wrappers are actually found in the Tcl extension module. For example, you can certainly do this:

    % load ./example.so
    % set f [new_Foo]
    % Foo_x_get $f
    0
    % Foo_spam $f 3
    1
    %
    

    However, in addition to this, the classname Foo is used as an object constructor function. This allows objects to be encapsulated objects that look a lot like Tk widgets as shown in the last section.

    36.4.2 Memory management

    Associated with each wrapped object, is an ownership flag thisown The value of this flag determines who is responsible for deleting the underlying C++ object. If set to 1, the Tcl interpreter destroys the C++ object when the proxy class is garbage collected. If set to 0 (or if the attribute is missing), then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Tcl automatically takes ownership of the result. For example:

    class Foo {
    public:
      Foo();
      Foo bar();
    };
    

    In Tcl:

    % Foo f
    % f cget -thisown
    1
    % set g [f bar]
    % $g cget -thisown
    1
    

    On the other hand, when pointers are returned to Tcl, there is often no way to know where they came from. Therefore, the ownership is set to zero. For example:

    class Foo {
    public:
      ...
      Foo *spam();
      ...
    };
    

    % Foo f
    % set s [f spam]
    % $s cget -thisown
    0
    % 
    

    This behavior is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Tcl to assume ownership and destroy it!

    Related to containers, ownership issues can arise whenever an object is assigned to a member or global variable. For example, consider this interface:

    %module example
    
    struct Foo {
      int  value;
      Foo  *next;
    };
    
    Foo *head = 0;
    

    When wrapped in Tcl, careful observation will reveal that ownership changes whenever an object is assigned to a global variable. For example:

    % Foo f
    % f cget -thisown
    1
    % set head f
    % f cget -thisown
    0
    

    In this case, C is now holding a reference to the object---you probably don't want Tcl to destroy it. Similarly, this occurs for members. For example:

    % Foo f
    % Foo g
    % f cget -thisown
    1
    % g cget -thisown
    1
    % f configure -next g
    % g cget -thisown 
    0
    %
    

    For the most part, memory management issues remain hidden. However, there are occasionally situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Node {
      Object *value;
    public:
      void set_value(Object *v) { value = v; }
      ...
    };
    

    Now, consider the following Tcl code:

    % Object v                 # Create an object
    % Node n                   # Create a node
    % n setvalue v             # Set value
    % v cget -thisown
    1
    % 
    

    In this case, the object n is holding a reference to v internally. However, SWIG has no way to know that this has occurred. Therefore, Tcl still thinks that it has ownership of the object. Should the proxy object be destroyed, then the C++ destructor will be invoked and n will be holding a stale-pointer. If you're lucky, you will only get a segmentation fault.

    To work around this, it is always possible to flip the ownership flag. For example,

    % v -disown              # Give ownership to C/C++
    % v -acquire             # Acquire ownership
    

    It is also possible to deal with situations like this using typemaps--an advanced topic discussed later.

    36.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x+*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Tcl, this allows you to pass simple values instead of pointer. For example:

    set a [add 3 4]
    puts $a
    7
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Tcl, a mutated parameter shows up as a return value. For example:

    set a [negate 3]
    puts $a
    -3
    

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Tcl, the function will return multiple values as a list.

    set r [send_message "Hello World"]
    set bytes [lindex $r 0]
    set success [lindex $r 1]
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Perl:

    set dim [get_dimensions $m]
    set r  [lindex $dim 0]
    set c  [lindex $dim 1]
    

    36.6 Exception handling

    The %exception directive can be used to create a user-definable exception handler in charge of converting exceptions in your C/C++ program into Tcl exceptions. The chapter on customization features contains more details, but suppose you extended the array example into a C++ class like the following :

    class RangeError {};   // Used for an exception
    
    class DoubleArray {
      private:
        int n;
        double *ptr;
      public:
        // Create a new array of fixed size
        DoubleArray(int size) {
          ptr = new double[size];
          n = size;
        }
        // Destroy an array
        ~DoubleArray() {
          delete ptr;
        }
        // Return the length of the array
        int   length() {
          return n;
        }
    
        // Get an item from the array and perform bounds checking.
        double getitem(int i) {
          if ((i >= 0) && (i < n))
            return ptr[i];
          else
            throw RangeError();
        }
    
        // Set an item in the array and perform bounds checking.
        void setitem(int i, double val) {
          if ((i >= 0) && (i < n))
            ptr[i] = val;
          else {
            throw RangeError();
          }
        }
      };
    

    The functions associated with this class can throw a C++ range exception for an out-of-bounds array access. We can catch this in our Tcl extension by specifying the following in an interface file :

    %exception {
      try {
        $action                // Gets substituted by actual function call
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    

    As shown, the exception handling code will be added to every wrapper function. Since this is somewhat inefficient. You might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    
    %exception setitem {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    If you had a lot of different methods, you can avoid extra typing by using a macro. For example:

    %define RANGE_ERROR
    {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    %enddef
    
    %exception getitem RANGE_ERROR;
    %exception setitem RANGE_ERROR;
    

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on "Customization Features" for more examples.

    36.7 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Tcl C API as well as the material in the "Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Tcl interface.

    36.7.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Tcl to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object of type Tcl_Obj *.

    When this example is compiled into a Tcl module, it operates as follows:

    % load ./example.so
    % fact 6
    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int n {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("n = %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int n.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
        $1 = Tcl_GetStringFromObj($input, &$2);
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Tcl object. This allows the function to be used like this (notice how the length parameter is omitted):

    % count e "Hello World"
    1
    

    36.7.2 Tcl typemaps

    The previous section illustrated an "in" typemap for converting Tcl objects to C. A variety of different typemap methods are defined by the Tcl module. For example, to convert a C integer back into a Tcl object, you might define an "out" typemap like this:

    %typemap(out) int {
      Tcl_SetObjResult(interp, Tcl_NewIntObj($1));
    }
    

    The following list details all of the typemap methods that can be used by the Tcl module:

    %typemap(in)

    Converts Tcl objects to input function arguments

    %typemap(out)

    Converts return value of a C function to a Tcl object

    %typemap(varin)

    Assigns a C global variable from a Tcl object

    %typemap(varout)

    Returns a C global variable as a Tcl object

    %typemap(freearg)

    Cleans up a function argument (if necessary)

    %typemap(argout)

    Output argument processing

    %typemap(ret)

    Cleanup of function return values

    %typemap(consttab)

    Creation of Tcl constants (constant table)

    %typemap(constcode)

    Creation of Tcl constants (init function)

    %typemap(memberin)

    Setting of structure/class member data

    %typemap(globalin)

    Setting of C global variables

    %typemap(check)

    Checks function input values.

    %typemap(default)

    Set a default value for an argument (making it optional).

    %typemap(arginit)

    Initialize an argument to a value before any conversions occur.

    Examples of these methods will appear shortly.

    36.7.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the "Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Tcl.

    $input

    A Tcl_Obj * holding a raw Tcl object with an argument or variable value.

    $result

    A Tcl_Obj * that holds the result to be returned to Tcl.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Tcl name of the wrapper function being created.

    36.7.4 Converting a Tcl list to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Tcl list to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      Tcl_Obj **listobjv;
      int       nitems;
      int       i;
      if (Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) {
        return TCL_ERROR;
      }
      $1 = (char **) malloc((nitems+1)*sizeof(char *));
      for (i = 0; i < nitems; i++) {
        $1[i] = Tcl_GetStringFromObj(listobjv[i], 0);
      }
      $1[i] = 0;
    }
    
    // This gives SWIG some cleanup code that will get called after the function call
    %typemap(freearg) char ** {
      if ($1) {
        free($1);
      }
    }
    
    // Now a test functions
    %inline %{
      int print_args(char **argv) {
        int i = 0;
        while (argv[i]) {
          printf("argv[%d] = %s\n", i, argv[i]);
          i++;
        }
        return i;
      }
    %}
    %include "tclsh.i"
    
    

    In Tcl:

    % print_args {John Guido Larry}
    argv[0] = John
    argv[1] = Guido
    argv[2] = Larry
    3
    

    36.7.5 Returning values in arguments

    The "argout" typemap can be used to return a value originating from a function argument. For example :

    // A typemap defining how to return an argument by appending it to the result
    %typemap(argout) double *outvalue {
      Tcl_Obj *o = Tcl_NewDoubleObj($1);
      Tcl_ListObjAppendElement(interp, $result, o);
    }
    
    // A typemap telling SWIG to ignore an argument for input
    // However, we still need to pass a pointer to the C function
    %typemap(in, numinputs=0) double *outvalue (double temp) {
      $1 = &temp;
    }
    
    // Now a function returning two values
    int mypow(double a, double b, double *outvalue) {
      if ((a < 0) || (b < 0)) return -1;
      *outvalue = pow(a, b);
      return 0;
    };
    

    When wrapped, SWIG matches the argout typemap to the "double *outvalue" argument. The numinputs=0 specification tells SWIG to simply ignore this argument when generating wrapper code. As a result, a Tcl function using these typemaps will work like this :

    % mypow 2 3     # Returns two values, a status value and the result
    0 8
    %
    

    36.7.6 Useful functions

    The following tables provide some functions that may be useful in writing Tcl typemaps.

    Integers

    Tcl_Obj   *Tcl_NewIntObj(int Value);
    void       Tcl_SetIntObj(Tcl_Obj *obj, int Value);
    int        Tcl_GetIntFromObj(Tcl_Interp *, Tcl_Obj *obj, int *ip);
    

    Floating Point

    Tcl_Obj  *Tcl_NewDoubleObj(double Value);
    void      Tcl_SetDoubleObj(Tcl_Obj *obj, double value);
    int       Tcl_GetDoubleFromObj(Tcl_Interp *, Tcl_Obj *o, double *dp);
    

    Strings

    Tcl_Obj  *Tcl_NewStringObj(char *str, int len);
    char     *Tcl_GetStringFromObj(Tcl_Obj *obj, int *len);
    void      Tcl_AppendToObj(Tcl_Obj *obj, char *str, int len);
    

    Lists

    Tcl_Obj  *Tcl_NewListObj(int objc, Tcl_Obj *objv);
    int       Tcl_ListObjAppendList(Tcl_Interp *, Tcl_Obj *listPtr, Tcl_Obj *elemListPtr);
    int       Tcl_ListObjAppendElement(Tcl_Interp *, Tcl_Obj *listPtr, Tcl_Obj *element);
    int       Tcl_ListObjGetElements(Tcl_Interp *, Tcl_Obj *listPtr, int *objcPtr,
                                     Tcl_Obj ***objvPtr);
    int       Tcl_ListObjLength(Tcl_Interp *, Tcl_Obj *listPtr, int *intPtr);
    int       Tcl_ListObjIndex(Tcl_Interp *, Tcl_Obj *listPtr, int index,
                               Tcl_Obj_Obj **objptr);
    int       Tcl_ListObjReplace(Tcl_Interp *, Tcl_Obj *listPtr, int first, int count,
                                 int objc, Tcl_Obj *objv);
    

    Objects

    Tcl_Obj *Tcl_DuplicateObj(Tcl_Obj *obj);
    void     Tcl_IncrRefCount(Tcl_Obj *obj);
    void     Tcl_DecrRefCount(Tcl_Obj *obj);
    int      Tcl_IsShared(Tcl_Obj *obj);
    

    36.7.7 Standard typemaps

    The following typemaps show how to convert a few common kinds of objects between Tcl and C (and to give a better idea of how typemaps work)

    Integer conversion

    %typemap(in) int, short, long {
      int temp;
      if (Tcl_GetIntFromObj(interp, $input, &temp) == TCL_ERROR)
        return TCL_ERROR;
      $1 = ($1_ltype) temp;
    }
    

    %typemap(out) int, short, long {
      Tcl_SetIntObj($result, (int) $1);
    }
    

    Floating point conversion

    %typemap(in) float, double {
      double temp;
      if (Tcl_GetDoubleFromObj(interp, $input, &temp) == TCL_ERROR)
        return TCL_ERROR;
      $1 = ($1_ltype) temp;
    }
    

    %typemap(out) float, double {
      Tcl_SetDoubleObj($result, $1);
    }
    

    String Conversion

    %typemap(in) char * {
      int len;
      $1 = Tcl_GetStringFromObj(interp, &len);
    }
    

    %typemap(out, noblock=1, fragment="SWIG_FromCharPtr") char *, const char * {
      Tcl_SetObjResult(interp, SWIG_FromCharPtr((const char *)$1));
    }
    
    

    36.7.8 Pointer handling

    SWIG pointers are mapped into Tcl strings containing the hexadecimal value and type. The following functions can be used to create and read pointer values.

    int SWIG_ConvertPtr(Tcl_Obj *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Tcl object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. It is currently reserved for future expansion. Returns 0 on success and -1 on error.

    Tcl_Obj *SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int flags)

    Creates a new Tcl pointer object. ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag reserved for future expansion.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    Tcl_Obj *;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    36.8 Turning a SWIG module into a Tcl Package.

    Tcl 7.4 introduced the idea of an extension package. By default, SWIG generates all of the code necessary to create a package. To set the package version, simply use the -pkgversion option. For example:

    % swig -tcl -pkgversion 2.3 example.i
    

    After building the SWIG generated module, you need to execute the "pkg_mkIndex" command inside tclsh. For example :

    unix > tclsh
    % pkg_mkIndex . example.so
    % exit
    

    This creates a file "pkgIndex.tcl" with information about the package. To use your package, you now need to move it to its own subdirectory which has the same name as the package. For example :

    ./example/
               pkgIndex.tcl           # The file created by pkg_mkIndex
               example.so             # The SWIG generated module
    

    Finally, assuming that you're not entirely confused at this point, make sure that the example subdirectory is visible from the directories contained in either the tcl_library or auto_path variables. At this point you're ready to use the package as follows :

    unix > tclsh
    % package require example
    % fact 4
    24
    %
    

    If you're working with an example in the current directory and this doesn't work, do this instead :

    unix > tclsh
    % lappend auto_path .
    % package require example
    % fact 4
    24
    

    As a final note, most SWIG examples do not yet use the package commands. For simple extensions it may be easier just to use the load command instead.

    36.9 Building new kinds of Tcl interfaces (in Tcl)

    One of the most interesting aspects of Tcl and SWIG is that you can create entirely new kinds of Tcl interfaces in Tcl using the low-level SWIG accessor functions. For example, suppose you had a library of helper functions to access arrays :

    /* File : array.i */
    %module array
    
    %inline %{
    double *new_double(int size) {
      return (double *) malloc(size*sizeof(double));
    }
    void delete_double(double *a) {
      free(a);
    }
    double get_double(double *a, int index) {
      return a[index];
    }
    void set_double(double *a, int index, double val) {
      a[index] = val;
    }
    int *new_int(int size) {
      return (int *) malloc(size*sizeof(int));
    }
    void delete_int(int *a) {
      free(a);
    }
    int get_int(int *a, int index) {
      return a[index];
    }
    int set_int(int *a, int index, int val) {
      a[index] = val;
    }
    %}
    
    

    While these could be called directly, we could also write a Tcl script like this :

    proc Array {type size} {
        set ptr [new_$type $size]
        set code {
            set method [lindex $args 0]
            set parms [concat $ptr [lrange $args 1 end]]
            switch $method {
                get {return [eval "get_$type $parms"]}
                set {return [eval "set_$type $parms"]}
                delete {eval "delete_$type $ptr; rename $ptr {}"}
            }
        }
        # Create a procedure
        uplevel "proc $ptr args {set ptr $ptr; set type $type;$code}"
        return $ptr
    }
    

    Our script allows easy array access as follows :

    set a [Array double 100]                   ;# Create a double [100]
    for {set i 0} {$i < 100} {incr i 1} {      ;# Clear the array
            $a set $i 0.0
    }
    $a set 3 3.1455                            ;# Set an individual element
    set b [$a get 10]                          ;# Retrieve an element
    
    set ia [Array int 50]                      ;# Create an int[50]
    for {set i 0} {$i < 50} {incr i 1} {       ;# Clear it
            $ia set $i 0
    }
    $ia set 3 7                                ;# Set an individual element
    set ib [$ia get 10]                        ;# Get an individual element
    
    $a delete                                  ;# Destroy a
    $ia delete                                 ;# Destroy ia
    

    The cool thing about this approach is that it makes a common interface for two different types of arrays. In fact, if we were to add more C datatypes to our wrapper file, the Tcl code would work with those as well--without modification. If an unsupported datatype was requested, the Tcl code would simply return with an error so there is very little danger of blowing something up (although it is easily accomplished with an out of bounds array access).

    36.9.1 Proxy classes

    A similar approach can be applied to proxy classes (also known as shadow classes). The following example is provided by Erik Bierwagen and Paul Saxe. To use it, run SWIG with the -noobject option (which disables the builtin object oriented interface). When running Tcl, simply source this file. Now, objects can be used in a more or less natural fashion.

    # swig_c++.tcl
    # Provides a simple object oriented interface using
    # SWIG's low level interface.
    #
    
    proc new {objectType handle_r args} {
        # Creates a new SWIG object of the given type,
        # returning a handle in the variable "handle_r".
        #
        # Also creates a procedure for the object and a trace on
        # the handle variable that deletes the object when the
        # handle variable is overwritten or unset
        upvar $handle_r handle
        #
        # Create the new object
        #
        eval set handle \[new_$objectType $args\]
        #
        # Set up the object procedure
        #
        proc $handle {cmd args} "eval ${objectType}_\$cmd $handle \$args"
        #
        # And the trace ...
        #
        uplevel trace variable $handle_r uw "{deleteObject $objectType $handle}"
        #
        # Return the handle so that 'new' can be used as an argument to a procedure
        #
        return $handle
    }
    
    proc deleteObject {objectType handle name element op} {
        #
        # Check that the object handle has a reasonable form
        #
        if {![regexp {_[0-9a-f]*_(.+)_p} $handle]} {
            error "deleteObject: not a valid object handle: $handle"
        }
        #
        # Remove the object procedure
        #
        catch {rename $handle {}}
        #
        # Delete the object
        #
        delete_$objectType $handle
    }
    
    proc delete {handle_r} {
        #
        # A synonym for unset that is more familiar to C++ programmers
        #
        uplevel unset $handle_r
    }
    

    To use this file, we simply source it and execute commands such as "new" and "delete" to manipulate objects. For example :

    // list.i
    %module List
    %{
    #include "list.h"
    %}
    
    // Very simple C++ example
    
    class List {
    public:
      List();  // Create a new list
      ~List(); // Destroy a list
      int  search(char *value);
      void insert(char *);  // Insert a new item into the list
      void remove(char *);  // Remove item from list
      char *get(int n);     // Get the nth item in the list
      int  length;          // The current length of the list
    static void print(List *l);  // Print out the contents of the list
    };
    

    Now a Tcl script using the interface...

    load ./list.so list       ; # Load the module
    source swig_c++.tcl       ; # Source the object file
    
    new List l
    $l insert Dave
    $l insert John
    $l insert Guido
    $l remove Dave
    puts $l length_get
    
    delete l
    

    The cool thing about this example is that it works with any C++ object wrapped by SWIG and requires no special compilation. Proof that a short, but clever Tcl script can be combined with SWIG to do many interesting things.

    36.10 Tcl/Tk Stubs

    For background information about the Tcl Stubs feature, see http://www.tcl.tk/doc/howto/stubs.html.

    As of SWIG 1.3.10, the generated C/C++ wrapper will use the Tcl Stubs feature if compiled with -DUSE_TCL_STUBS.

    As of SWIG 1.3.40, the generated C/C++ wrapper will use the Tk Stubs feature if compiled with -DUSE_TK_STUBS. Also, you can override the minimum version to support which is passed to Tcl_InitStubs() and Tk_InitStubs() with -DSWIG_TCL_STUBS_VERSION="8.3" or the version being compiled with using -DSWIG_TCL_STUBS_VERSION=TCL_VERSION.

    swig-4.0.2/Doc/Manual/Contents.html0000644000175000017500000026337013667507563017006 0ustar williamwilliam SWIG Users Manual

    SWIG Users Manual

    1 Preface

    2 Introduction

    3 Getting started on Windows

    4 Scripting Languages

    5 SWIG Basics

    6 SWIG and C++

    7 SWIG and C++11

    8 SWIG and C++14

    9 SWIG and C++17

    10 Preprocessing

    11 SWIG library

    12 Argument Handling

    13 Typemaps

    14 Customization Features

    15 Contracts

    16 Variable Length Arguments

    17 SWIG and Doxygen Translation

    18 Warning Messages

    19 Working with Modules

    20 Using SWIG with ccache - ccache-swig(1) manpage

    21 SWIG and Android

    22 SWIG and C#

    23 SWIG and D

    24 SWIG and Go

    25 SWIG and Guile

    26 SWIG and Java

    27 SWIG and Javascript

    28 SWIG and Lua

    29 SWIG and Octave

    30 SWIG and Perl5

    31 SWIG and PHP

    32 SWIG and Python

    33 SWIG and R

    34 SWIG and Ruby

    35 SWIG and Scilab

    36 SWIG and Tcl

    37 SWIG and MzScheme/Racket

    38 SWIG and OCaml

    39 Extending SWIG to support new languages

    swig-4.0.2/Doc/Manual/Scripting.html0000644000175000017500000003454313667507562017150 0ustar williamwilliam Scripting Languages

    4 Scripting Languages

    This chapter provides a brief overview of scripting language extension programming and the mechanisms by which scripting language interpreters access C and C++ code.

    4.1 The two language view of the world

    When a scripting language is used to control a C program, the resulting system tends to look as follows:

    Scripting language input - C/C++ functions output

    In this programming model, the scripting language interpreter is used for high level control whereas the underlying functionality of the C/C++ program is accessed through special scripting language "commands." If you have ever tried to write your own simple command interpreter, you might view the scripting language approach to be a highly advanced implementation of that. Likewise, If you have ever used a package such as MATLAB or IDL, it is a very similar model--the interpreter executes user commands and scripts. However, most of the underlying functionality is written in a low-level language like C or Fortran.

    The two-language model of computing is extremely powerful because it exploits the strengths of each language. C/C++ can be used for maximal performance and complicated systems programming tasks. Scripting languages can be used for rapid prototyping, interactive debugging, scripting, and access to high-level data structures such associative arrays.

    4.2 How does a scripting language talk to C?

    Scripting languages are built around a parser that knows how to execute commands and scripts. Within this parser, there is a mechanism for executing commands and accessing variables. Normally, this is used to implement the builtin features of the language. However, by extending the interpreter, it is usually possible to add new commands and variables. To do this, most languages define a special API for adding new commands. Furthermore, a special foreign function interface defines how these new commands are supposed to hook into the interpreter.

    Typically, when you add a new command to a scripting interpreter you need to do two things; first you need to write a special "wrapper" function that serves as the glue between the interpreter and the underlying C function. Then you need to give the interpreter information about the wrapper by providing details about the name of the function, arguments, and so forth. The next few sections illustrate the process.

    4.2.1 Wrapper functions

    Suppose you have an ordinary C function like this :

    int fact(int n) {
      if (n <= 1)
        return 1;
      else
        return n*fact(n-1);
    }
    

    In order to access this function from a scripting language, it is necessary to write a special "wrapper" function that serves as the glue between the scripting language and the underlying C function. A wrapper function must do three things :

    • Gather function arguments and make sure they are valid.
    • Call the C function.
    • Convert the return value into a form recognized by the scripting language.

    As an example, the Tcl wrapper function for the fact() function above example might look like the following :

    int wrap_fact(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
      int result;
      int arg0;
      if (argc != 2) {
        interp->result = "wrong # args";
        return TCL_ERROR;
      }
      arg0 = atoi(argv[1]);
      result = fact(arg0);
      sprintf(interp->result, "%d", result);
      return TCL_OK;
    }
    
    

    Once you have created a wrapper function, the final step is to tell the scripting language about the new function. This is usually done in an initialization function called by the language when the module is loaded. For example, adding the above function to the Tcl interpreter requires code like the following :

    int Wrap_Init(Tcl_Interp *interp) {
      Tcl_CreateCommand(interp, "fact", wrap_fact, (ClientData) NULL,
                        (Tcl_CmdDeleteProc *) NULL);
      return TCL_OK;
    }
    

    When executed, Tcl will now have a new command called "fact" that you can use like any other Tcl command.

    Although the process of adding a new function to Tcl has been illustrated, the procedure is almost identical for Perl and Python. Both require special wrappers to be written and both need additional initialization code. Only the specific details are different.

    4.2.2 Variable linking

    Variable linking refers to the problem of mapping a C/C++ global variable to a variable in the scripting language interpreter. For example, suppose you had the following variable:

    double Foo = 3.5;
    

    It might be nice to access it from a script as follows (shown for Perl):

    $a = $Foo * 2.3;   # Evaluation
    $Foo = $a + 2.0;   # Assignment
    

    To provide such access, variables are commonly manipulated using a pair of get/set functions. For example, whenever the value of a variable is read, a "get" function is invoked. Similarly, whenever the value of a variable is changed, a "set" function is called.

    In many languages, calls to the get/set functions can be attached to evaluation and assignment operators. Therefore, evaluating a variable such as $Foo might implicitly call the get function. Similarly, typing $Foo = 4 would call the underlying set function to change the value.

    4.2.3 Constants

    In many cases, a C program or library may define a large collection of constants. For example:

    #define RED   0xff0000
    #define BLUE  0x0000ff
    #define GREEN 0x00ff00
    

    To make constants available, their values can be stored in scripting language variables such as $RED, $BLUE, and $GREEN. Virtually all scripting languages provide C functions for creating variables so installing constants is usually a trivial exercise.

    4.2.4 Structures and classes

    Although scripting languages have no trouble accessing simple functions and variables, accessing C/C++ structures and classes present a different problem. This is because the implementation of structures is largely related to the problem of data representation and layout. Furthermore, certain language features are difficult to map to an interpreter. For instance, what does C++ inheritance mean in a Perl interface?

    The most straightforward technique for handling structures is to implement a collection of accessor functions that hide the underlying representation of a structure. For example,

    struct Vector {
      Vector();
      ~Vector();
      double x, y, z;
    };
    
    

    can be transformed into the following set of functions :

    Vector *new_Vector();
    void delete_Vector(Vector *v);
    double Vector_x_get(Vector *v);
    double Vector_y_get(Vector *v);
    double Vector_z_get(Vector *v);
    void Vector_x_set(Vector *v, double x);
    void Vector_y_set(Vector *v, double y);
    void Vector_z_set(Vector *v, double z);
    
    

    Now, from an interpreter these function might be used as follows:

    % set v [new_Vector]
    % Vector_x_set $v 3.5
    % Vector_y_get $v
    % delete_Vector $v
    % ...
    

    Since accessor functions provide a mechanism for accessing the internals of an object, the interpreter does not need to know anything about the actual representation of a Vector.

    4.2.5 Proxy classes

    In certain cases, it is possible to use the low-level accessor functions to create a proxy class, also known as a shadow class. A proxy class is a special kind of object that gets created in a scripting language to access a C/C++ class (or struct) in a way that looks like the original structure (that is, it proxies the real C++ class). For example, if you have the following C++ definition :

    class Vector {
    public:
      Vector();
      ~Vector();
      double x, y, z;
    };
    

    A proxy classing mechanism would allow you to access the structure in a more natural manner from the interpreter. For example, in Python, you might want to do this:

    >>> v = Vector()
    >>> v.x = 3
    >>> v.y = 4
    >>> v.z = -13
    >>> ...
    >>> del v
    

    Similarly, in Perl5 you may want the interface to work like this:

    $v = new Vector;
    $v->{x} = 3;
    $v->{y} = 4;
    $v->{z} = -13;
    
    

    Finally, in Tcl :

    Vector v
    v configure -x 3 -y 4 -z -13
    
    

    When proxy classes are used, two objects are really at work--one in the scripting language, and an underlying C/C++ object. Operations affect both objects equally and for all practical purposes, it appears as if you are simply manipulating a C/C++ object.

    4.3 Building scripting language extensions

    The final step in using a scripting language with your C/C++ application is adding your extensions to the scripting language itself. There are two primary approaches for doing this. The preferred technique is to build a dynamically loadable extension in the form of a shared library. Alternatively, you can recompile the scripting language interpreter with your extensions added to it.

    4.3.1 Shared libraries and dynamic loading

    To create a shared library or DLL, you often need to look at the manual pages for your compiler and linker. However, the procedure for a few common platforms is shown below:

    # Build a shared library for Solaris
    gcc -fpic -c example.c example_wrap.c -I/usr/local/include
    ld -G example.o example_wrap.o -o example.so
    
    # Build a shared library for Linux
    gcc -fpic -c example.c example_wrap.c -I/usr/local/include
    gcc -shared example.o example_wrap.o -o example.so
    

    To use your shared library, you simply use the corresponding command in the scripting language (load, import, use, etc...). This will import your module and allow you to start using it. For example:

    % load ./example.so
    % fact 4
    24
    %
    

    When working with C++ codes, the process of building shared libraries may be more complicated--primarily due to the fact that C++ modules may need additional code in order to operate correctly. On many machines, you can build a shared C++ module by following the above procedures, but changing the link line to the following :

    c++ -shared example.o example_wrap.o -o example.so
    

    4.3.2 Linking with shared libraries

    When building extensions as shared libraries, it is not uncommon for your extension to rely upon other shared libraries on your machine. In order for the extension to work, it needs to be able to find all of these libraries at run-time. Otherwise, you may get an error such as the following :

    >>> import graph
    Traceback (innermost last):
      File "<stdin>", line 1, in ?
      File "/home/sci/data1/beazley/graph/graph.py", line 2, in ?
        import graphc
    ImportError:  1101:/home/sci/data1/beazley/bin/python: rld: Fatal Error: cannot 
    successfully map soname 'libgraph.so' under any of the filenames /usr/lib/libgraph.so:/
    lib/libgraph.so:/lib/cmplrs/cc/libgraph.so:/usr/lib/cmplrs/cc/libgraph.so:
    >>>
    

    What this error means is that the extension module created by SWIG depends upon a shared library called "libgraph.so" that the system was unable to locate. To fix this problem, there are a few approaches you can take.

    • Link your extension and explicitly tell the linker where the required libraries are located. Often times, this can be done with a special linker flag such as -R, -rpath, etc. This is not implemented in a standard manner so read the man pages for your linker to find out more about how to set the search path for shared libraries.
    • Put shared libraries in the same directory as the executable. This technique is sometimes required for correct operation on non-Unix platforms.
    • Set the UNIX environment variable LD_LIBRARY_PATH to the directory where shared libraries are located before running Python. Although this is an easy solution, it is not recommended. Consider setting the path using linker options instead.

    4.3.3 Static linking

    With static linking, you rebuild the scripting language interpreter with extensions. The process usually involves compiling a short main program that adds your customized commands to the language and starts the interpreter. You then link your program with a library to produce a new scripting language executable.

    Although static linking is supported on all platforms, this is not the preferred technique for building scripting language extensions. In fact, there are very few practical reasons for doing this--consider using shared libraries instead.

    swig-4.0.2/Doc/Manual/Modules.html0000644000175000017500000003336013667507563016613 0ustar williamwilliam Working with Modules

    19 Working with Modules

    19.1 Modules Introduction

    Each invocation of SWIG requires a module name to be specified. The module name is used to name the resulting target language extension module. Exactly what this means and what the name is used for depends on the target language, for example the name can define a target language namespace or merely be a useful name for naming files or helper classes. Essentially, a module comprises target language wrappers for a chosen collection of global variables/functions, structs/classes and other C/C++ types.

    The module name can be supplied in one of two ways. The first is to specify it with the special %module directive. This directive must appear at the beginning of the interface file. The general form of this directive is:

    %module(option1="value1", option2="value2", ...) modulename
    

    where the modulename is mandatory and the options add one or more optional additional features. Typically no options are specified, for example:

    %module mymodule
    

    The second way to specify the module name is with the -module command line option, for example -module mymodule. If the module name is supplied on the command line, it overrides the name specified by the %module directive.

    When first working with SWIG, users commonly start by creating a single module. That is, you might define a single SWIG interface that wraps some set of C/C++ code. You then compile all of the generated wrapper code together and use it. For large applications, however, this approach is problematic---the size of the generated wrapper code can be rather large. Moreover, it is probably easier to manage the target language interface when it is broken up into smaller pieces.

    This chapter describes the problem of using SWIG in programs where you want to create a collection of modules. Each module in the collection is created via separate invocations of SWIG.

    19.2 Basics

    The basic usage case with multiple modules is when modules do not have cross-references (ie. when wrapping multiple independent C APIs). In that case, swig input files should just work out of the box - you simply create multiple wrapper .cxx files, link them into your application, and insert/load each in the scripting language runtime as you would do for the single module case.

    A bit more complex is the case in which modules need to share information. For example, when one module extends the class of another by deriving from it:

    // File: base.h
    class base {
    public:
      int foo();
    };
    
     
    // File: base_module.i
    %module base_module
    
    %{
    #include "base.h"
    %}
    %include "base.h"
    
     
    // File: derived_module.i
    %module derived_module
    
    %import "base_module.i"
    
    %inline %{
    class derived : public base {
    public:
      int bar();
    };
    %}
    

    To create the wrapper properly, module derived_module needs to know about the base class and that its interface is covered in another module. The line %import "base_module.i" lets SWIG know exactly that. Often the .h file is passed to %import instead of the .i, which unfortunately doesn't work for all language modules. For example, Python requires the name of module that the base class exists in so that the proxy classes can fully inherit the base class's methods. Typically you will get a warning when the module name is missing, eg:

    derived_module.i:8: Warning 401: Base class 'base' ignored - unknown module name for base. Either
    import
    the appropriate module interface file or specify the name of the module in the %import directive.
    

    It is sometimes desirable to import the header file rather than the interface file and overcome the above warning. For example in the case of the imported interface being quite large, it may be desirable to simplify matters and just import a small header file of dependent types. This can be done by specifying the optional module attribute in the %import directive. The derived_module.i file shown above could be replaced with the following:

    // File: derived_module.i
    %module derived_module
    
    %import(module="base_module") "base.h"
    
    %inline %{
    class derived : public base {
    public:
      int bar();
    };
    

    Note that "base_module" is the module name and is the same as that specified in %module in base_module.i as well as the %import in derived_module.i.

    Another issue to beware of is that multiple dependent wrappers should not be linked/loaded in parallel from multiple threads as SWIG provides no locking - for more on that issue, read on.

    19.3 The SWIG runtime code

    Many of SWIG's target languages generate a set of functions commonly known as the "SWIG runtime." These functions are primarily related to the runtime type system which checks pointer types and performs other tasks such as proper casting of pointer values in C++. As a general rule, the statically typed target languages, such as Java, use the language's built in static type checking and have no need for a SWIG runtime. All the dynamically typed / interpreted languages rely on the SWIG runtime.

    The runtime functions are private to each SWIG-generated module. That is, the runtime functions are declared with "static" linkage and are visible only to the wrapper functions defined in that module. The only problem with this approach is that when more than one SWIG module is used in the same application, those modules often need to share type information. This is especially true for C++ programs where SWIG must collect and share information about inheritance relationships that cross module boundaries.

    To solve the problem of sharing information across modules, a pointer to the type information is stored in a global variable in the target language namespace. During module initialization, type information is loaded into the global data structure of type information from all modules.

    There are a few trade offs with this approach. This type information is global across all SWIG modules loaded, and can cause type conflicts between modules that were not designed to work together. To solve this approach, the SWIG runtime code uses a define SWIG_TYPE_TABLE to provide a unique type table. This behavior can be enabled when compiling the generated _wrap.cxx or _wrap.c file by adding -DSWIG_TYPE_TABLE=myprojectname to the command line argument.

    Then, only modules compiled with SWIG_TYPE_TABLE set to myprojectname will share type information. So if your project has three modules, all three should be compiled with -DSWIG_TYPE_TABLE=myprojectname, and then these three modules will share type information. But any other project's types will not interfere or clash with the types in your module.

    Another issue relating to the global type table is thread safety. If two modules try and load at the same time, the type information can become corrupt. SWIG currently does not provide any locking, and if you use threads, you must make sure that modules are loaded serially. Be careful if you use threads and the automatic module loading that some scripting languages provide. One solution is to load all modules before spawning any threads, or use SWIG_TYPE_TABLE to separate type tables so they do not clash with each other.

    Lastly, SWIG uses a #define SWIG_RUNTIME_VERSION, located in Lib/swigrun.swg and near the top of every generated module. This number gets incremented when the data structures change, so that SWIG modules generated with different versions can peacefully coexist. So the type structures are separated by the (SWIG_TYPE_TABLE, SWIG_RUNTIME_VERSION) pair, where by default SWIG_TYPE_TABLE is empty. Only modules compiled with the same pair will share type information.

    19.4 External access to the runtime

    As described in The run-time type checker, the functions SWIG_TypeQuery, SWIG_NewPointerObj, and others sometimes need to be called. Calling these functions from a typemap is supported, since the typemap code is embedded into the _wrap.c file, which has those declarations available. If you need to call the SWIG run-time functions from another C file, there is one header you need to include. To generate the header that needs to be included, SWIG can be run in a different mode via -external-runtime to generate the run-time instead of the normal mode of processing an input interface file. For example:

    $ swig -python -external-runtime <filename>
    

    The filename argument is optional and if it is not passed, then the default filename will be something like swigpyrun.h, depending on the language. This header file should be treated like any of the other _wrap.c output files, and should be regenerated when the _wrap files are. After including this header, your code will be able to call SWIG_TypeQuery, SWIG_NewPointerObj, SWIG_ConvertPtr and others. The exact argument parameters for these functions might differ between language modules; please check the language module chapters for more information.

    Inside this header the functions are declared static and are included inline into the file, and thus the file does not need to be linked against any SWIG libraries or code (you might still need to link against the language libraries like libpython-2.3). Data is shared between this file and the _wrap.c files through a global variable in the scripting language. It is also possible to copy this header file along with the generated wrapper files into your own package, so that you can distribute a package that can be compiled without SWIG installed (this works because the header file is self-contained, and does not need to link with anything).

    This header will also use the -DSWIG_TYPE_TABLE described above, so when compiling any code which includes the generated header file should define the SWIG_TYPE_TABLE to be the same as the module whose types you are trying to access.

    19.5 A word of caution about static libraries

    When working with multiple SWIG modules, you should take care not to use static libraries. For example, if you have a static library libfoo.a and you link a collection of SWIG modules with that library, each module will get its own private copy of the library code inserted into it. This is very often NOT what you want and it can lead to unexpected or bizarre program behavior. When working with dynamically loadable modules, you should try to work exclusively with shared libraries.

    19.6 References

    Due to the complexity of working with shared libraries and multiple modules, it might be a good idea to consult an outside reference. John Levine's "Linkers and Loaders" is highly recommended.

    19.7 Reducing the wrapper file size

    Using multiple modules with the %import directive is the most common approach to modularising large projects. In this way a number of different wrapper files can be generated, thereby avoiding the generation of a single large wrapper file. There are a couple of alternative solutions for reducing the size of a wrapper file through the use of command line options and features.

    -fcompact
    This command line option will compact the size of the wrapper file without changing the code generated into the wrapper file. It simply removes blank lines and joins lines of code together. This is useful for compilers that have a maximum file size that can be handled.

    -fvirtual
    This command line option will remove the generation of superfluous virtual method wrappers. Consider the following inheritance hierarchy:

    struct Base {
      virtual void method();
      ...
    };
    
    struct Derived : Base {
      virtual void method();
      ...
    };
    

    Normally wrappers are generated for both methods, whereas this command line option will suppress the generation of a wrapper for Derived::method. Normal polymorphic behaviour remains as Derived::method will still be called should you have a Derived instance and call the wrapper for Base::method.

    %feature("compactdefaultargs")
    This feature can reduce the number of wrapper methods when wrapping methods with default arguments. The section on default arguments discusses the feature and its limitations.

    swig-4.0.2/Doc/Manual/Typemaps.html0000644000175000017500000044352413667507563017014 0ustar williamwilliam Typemaps

    13 Typemaps

    13.1 Introduction

    Chances are, you are reading this chapter for one of two reasons; you either want to customize SWIG's behavior or you overheard someone mumbling some incomprehensible drivel about "typemaps" and you asked yourself "typemaps, what are those?" That said, let's start with a short disclaimer that "typemaps" are an advanced customization feature that provide direct access to SWIG's low-level code generator. Not only that, they are an integral part of the SWIG C++ type system (a non-trivial topic of its own). Typemaps are generally not a required part of using SWIG. Therefore, you might want to re-read the earlier chapters if you have found your way to this chapter with only a vague idea of what SWIG already does by default.

    13.1.1 Type conversion

    One of the most important problems in wrapper code generation is the conversion or marshalling of datatypes between programming languages. Specifically, for every C/C++ declaration, SWIG must somehow generate wrapper code that allows values to be passed back and forth between languages. Since every programming language represents data differently, this is not a simple of matter of simply linking code together with the C linker. Instead, SWIG has to know something about how data is represented in each language and how it can be manipulated.

    To illustrate, suppose you had a simple C function like this:

    int factorial(int n);
    

    To access this function from Python, a pair of Python API functions are used to convert integer values. For example:

    long PyInt_AsLong(PyObject *obj);      /* Python --> C */
    PyObject *PyInt_FromLong(long x);      /* C --> Python */
    

    The first function is used to convert the input argument from a Python integer object to C long. The second function is used to convert a value from C back into a Python integer object.

    Inside the wrapper function, you might see these functions used like this:

    PyObject *wrap_factorial(PyObject *self, PyObject *args) {
      int       arg1;
      int       result;
      PyObject *obj1;
      PyObject *resultobj;
    
      if (!PyArg_ParseTuple("O:factorial", &obj1)) return NULL;
      arg1 = PyInt_AsLong(obj1);
      result = factorial(arg1);
      resultobj = PyInt_FromLong(result);
      return resultobj;
    }
    

    Every target language supported by SWIG has functions that work in a similar manner. For example, in Perl, the following functions are used:

    IV SvIV(SV *sv);                     /* Perl --> C */
    void sv_setiv(SV *sv, IV val);       /* C --> Perl */
    

    In Tcl:

    int Tcl_GetLongFromObj(Tcl_Interp *interp, Tcl_Obj *obj, long *value);
    Tcl_Obj *Tcl_NewIntObj(long value);
    

    The precise details are not so important. What is important is that all of the underlying type conversion is handled by collections of utility functions and short bits of C code like this---you simply have to read the extension documentation for your favorite language to know how it works (an exercise left to the reader).

    13.1.2 Typemaps

    Since type handling is so central to wrapper code generation, SWIG allows it to be completely defined (or redefined) by the user. To do this, a special %typemap directive is used. For example:

    /* Convert from Python --> C */
    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    
    /* Convert from C --> Python */
    %typemap(out) int {
      $result = PyInt_FromLong($1);
    }
    

    At first glance, this code will look a little confusing. However, there is really not much to it. The first typemap (the "in" typemap) is used to convert a value from the target language to C. The second typemap (the "out" typemap) is used to convert in the other direction. The content of each typemap is a small fragment of code that is inserted directly into the SWIG generated wrapper functions. The code is usually C or C++ code which will be generated into the C/C++ wrapper functions. Note that this isn't always the case as some target language modules allow target language code within the typemaps which gets generated into target language specific files. Within this code, a number of special variables prefixed with a $ are expanded. These are really just placeholders for C/C++ variables that are generated in the course of creating the wrapper function. In this case, $input refers to an input object that needs to be converted to C/C++ and $result refers to an object that is going to be returned by a wrapper function. $1 refers to a C/C++ variable that has the same type as specified in the typemap declaration (an int in this example).

    A short example might make this a little more clear. If you were wrapping a function like this:

    int gcd(int x, int y);
    

    A wrapper function would look approximately like this:

    PyObject *wrap_gcd(PyObject *self, PyObject *args) {
      int arg1;
      int arg2;
      int result;
      PyObject *obj1;
      PyObject *obj2;
      PyObject *resultobj;
    
      if (!PyArg_ParseTuple("OO:gcd", &obj1, &obj2)) return NULL;
    
      /* "in" typemap, argument 1 */
      {
        arg1 = PyInt_AsLong(obj1);
      }
    
      /* "in" typemap, argument 2 */
      {
        arg2 = PyInt_AsLong(obj2);
      }
    
      result = gcd(arg1, arg2);
    
      /* "out" typemap, return value */
      {
        resultobj = PyInt_FromLong(result);
      }
    
      return resultobj;
    }
    

    In this code, you can see how the typemap code has been inserted into the function. You can also see how the special $ variables have been expanded to match certain variable names inside the wrapper function. This is really the whole idea behind typemaps--they simply let you insert arbitrary code into different parts of the generated wrapper functions. Because arbitrary code can be inserted, it possible to completely change the way in which values are converted.

    13.1.3 Pattern matching

    As the name implies, the purpose of a typemap is to "map" C datatypes to types in the target language. Once a typemap is defined for a C datatype, it is applied to all future occurrences of that type in the input file. For example:

    /* Convert from Perl --> C */
    %typemap(in) int {
      $1 = SvIV($input);
    }
    
    ...
    int factorial(int n);
    int gcd(int x, int y);
    int count(char *s, char *t, int max);
    

    The matching of typemaps to C datatypes is more than a simple textual match. In fact, typemaps are fully built into the underlying type system. Therefore, typemaps are unaffected by typedef, namespaces, and other declarations that might hide the underlying type. For example, you could have code like this:

    /* Convert from Ruby--> C */
    %typemap(in) int {
      $1 = NUM2INT($input);
    }
    ...
    typedef int Integer;
    namespace foo {
      typedef Integer Number;
    };
    
    int foo(int x);
    int bar(Integer y);
    int spam(foo::Number a, foo::Number b);
    

    In this case, the typemap is still applied to the proper arguments even though typenames don't always match the text "int". This ability to track types is a critical part of SWIG--in fact, all of the target language modules work merely define a family of typemaps for the basic types. Yet, it is never necessary to write new typemaps for typenames introduced by typedef.

    In addition to tracking typenames, typemaps may also be specialized to match against a specific argument name. For example, you could write a typemap like this:

    %typemap(in) double nonnegative {
      $1 = PyFloat_AsDouble($input);
      if ($1 < 0) {
        PyErr_SetString(PyExc_ValueError, "argument must be nonnegative.");
        SWIG_fail;
      }
    }
    
    ...
    double sin(double x);
    double cos(double x);
    double sqrt(double nonnegative);
    
    typedef double Real;
    double log(Real nonnegative);
    ...
    

    For certain tasks such as input argument conversion, typemaps can be defined for sequences of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = PyString_AsString($input);   /* char *str */
      $2 = PyString_Size($input);       /* int len   */
    }
    ...
    int count(char *str, int len, char c);
    

    In this case, a single input object is expanded into a pair of C arguments. This example also provides a hint to the unusual variable naming scheme involving $1, $2, and so forth.

    13.1.4 Reusing typemaps

    Typemaps are normally defined for specific type and argument name patterns. However, typemaps can also be copied and reused. One way to do this is to use assignment like this:

    %typemap(in) Integer = int;   
    %typemap(in) (char *buffer, int size) = (char *str, int len);
    

    There is a more powerful way to copy a family of typemaps though. Consider the following family of two typemap methods, "in" and "out" for type int:

    %typemap(in) int {
      /* Convert an integer argument */
      ...
    }
    %typemap(out) int {
      /* Return an integer value */
      ...
    }
    

    Each of the two typemap methods could be copied individually for type size_t as follows:

    /* Apply all of the int typemaps to size_t */
    %typemap(in) size_t = int;   
    %typemap(out) size_t = int;   
    

    A more powerful form of copying is available from the %apply directive. The code below is identical to the above:

    /* Apply all of the int typemaps to size_t */
    %apply int { size_t };    
    

    %apply merely takes all of the typemaps that are defined for one type and applies them to other types. Note: you can include a comma separated set of types in the { ... } part of %apply.

    It should be noted that it is not necessary to copy typemaps for types that are related by typedef. For example, if you have this,

    typedef int size_t;
    

    then SWIG already knows that the int typemaps apply. You don't have to do anything.

    13.1.5 What can be done with typemaps?

    The primary use of typemaps is for defining wrapper generation behavior at the level of individual C/C++ datatypes. There are currently six general categories of problems that typemaps address:

    Argument handling

    int foo(int x, double y, char *s);
    
    • Input argument conversion ("in" typemap).
    • Input argument type checking for types used in overloaded methods ("typecheck" typemap).
    • Output argument handling ("argout" typemap).
    • Input argument value checking ("check" typemap).
    • Input argument initialization ("arginit" typemap).
    • Default arguments ("default" typemap).
    • Input argument resource management ("freearg" typemap).

    Return value handling

    int foo(int x, double y, char *s);
    
    • Function return value conversion ("out" typemap).
    • Return value resource management ("ret" typemap).
    • Resource management for newly allocated objects ("newfree" typemap).

    Exception handling

    int foo(int x, double y, char *s) throw(MemoryError, IndexError);
    
    • Handling of C++ exception specifications. ("throw" typemap).

    Global variables

    int foo;
    
    • Assignment of a global variable. ("varin" typemap).
    • Reading a global variable. ("varout" typemap).

    Member variables

    struct Foo {
      int x[20];
    };
    
    • Assignment of data to a class/structure member. ("memberin" typemap).

    Constant creation

    #define FOO 3
    %constant int BAR = 42;
    enum { ALE, LAGER, STOUT };
    
    • Creation of constant values. ("consttab" or "constcode" typemap).

    Details of each of these typemaps will be covered shortly. Also, certain language modules may define additional typemaps that expand upon this list. For example, the Java module defines a variety of typemaps for controlling additional aspects of the Java bindings. Consult language specific documentation for further details.

    13.1.6 What can't be done with typemaps?

    Typemaps can't be used to define properties that apply to C/C++ declarations as a whole. For example, suppose you had a declaration like this,

    Foo *make_Foo(int n);
    

    and you wanted to tell SWIG that make_Foo(int n) returned a newly allocated object (for the purposes of providing better memory management). Clearly, this property of make_Foo(int n) is not a property that would be associated with the datatype Foo * by itself. Therefore, a completely different SWIG customization mechanism (%feature) is used for this purpose. Consult the Customization Features chapter for more information about that.

    Typemaps also can't be used to rearrange or transform the order of arguments. For example, if you had a function like this:

    void foo(int, char *);
    

    you can't use typemaps to interchange the arguments, allowing you to call the function like this:

    foo("hello", 3)          # Reversed arguments
    

    If you want to change the calling conventions of a function, write a helper function instead. For example:

    %rename(foo) wrap_foo;
    %inline %{
    void wrap_foo(char *s, int x) {
      foo(x, s);
    }
    %}
    

    13.1.7 Similarities to Aspect Oriented Programming

    SWIG has parallels to Aspect Oriented Software Development (AOP). The AOP terminology with respect to SWIG typemaps can be viewed as follows:

    • Cross-cutting concerns: The cross-cutting concerns are the modularization of the functionality that the typemaps implement, which is primarily marshalling of types from/to the target language and C/C++.
    • Advice: The typemap body contains code which is executed whenever the marshalling is required.
    • Pointcut: The pointcuts are the positions in the wrapper code that the typemap code is generated into.
    • Aspect: Aspects are the combination of the pointcut and the advice, hence each typemap is an aspect.

    SWIG can also be viewed as has having a second set of aspects based around %feature. Features such as %exception are also cross-cutting concerns as they encapsulate code that can be used to add logging or exception handling to any function.

    13.1.8 The rest of this chapter

    The rest of this chapter provides detailed information for people who want to write new typemaps. This information is of particular importance to anyone who intends to write a new SWIG target language module. Power users can also use this information to write application specific type conversion rules.

    Since typemaps are strongly tied to the underlying C++ type system, subsequent sections assume that you are reasonably familiar with the basic details of values, pointers, references, arrays, type qualifiers (e.g., const), structures, namespaces, templates, and memory management in C/C++. If not, you would be well-advised to consult a copy of "The C Programming Language" by Kernighan and Ritchie or "The C++ Programming Language" by Stroustrup before going any further.

    13.2 Typemap specifications

    This section describes the behavior of the %typemap directive itself.

    13.2.1 Defining a typemap

    New typemaps are defined using the %typemap declaration. The general form of this declaration is as follows (parts enclosed in [ ... ] are optional):

    %typemap(method [, modifiers]) typelist code ;
    

    method is a simply a name that specifies what kind of typemap is being defined. It is usually a name like "in", "out", or "argout". The purpose of these methods is described later.

    modifiers is an optional comma separated list of name="value" values. These are sometimes to attach extra information to a typemap and is often target-language dependent. They are also known as typemap attributes.

    typelist is a list of the C++ type patterns that the typemap will match. The general form of this list is as follows:

    typelist    :  typepattern [, typepattern, typepattern, ... ] ;
    
    typepattern :  type [ (parms) ]
                |  type name [ (parms) ]
                |  ( typelist ) [ (parms) ]
    
    

    Each type pattern is either a simple type, a simple type and argument name, or a list of types in the case of multi-argument typemaps. In addition, each type pattern can be parameterized with a list of temporary variables (parms). The purpose of these variables will be explained shortly.

    code specifies the code used in the typemap. Usually this is C/C++ code, but in the statically typed target languages, such as Java and C#, this can contain target language code for certain typemaps. It can take any one of the following forms:

    code       : { ... }
               | " ... "
               | %{ ... %}
    

    Note that the preprocessor will expand code within the {} delimiters, but not in the last two styles of delimiters, see Preprocessor and Typemaps. Here are some examples of valid typemap specifications:

    /* Simple typemap declarations */
    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    %typemap(in) int "$1 = PyInt_AsLong($input);";
    %typemap(in) int %{ 
      $1 = PyInt_AsLong($input);
    %}
    
    /* Typemap with extra argument name */
    %typemap(in) int nonnegative {
      ...
    }
    
    /* Multiple types in one typemap */
    %typemap(in) int, short, long { 
      $1 = SvIV($input);
    }
    
    /* Typemap with modifiers */
    %typemap(in, doc="integer") int "$1 = scm_to_int($input);";
    
    /* Typemap applied to patterns of multiple arguments */
    %typemap(in) (char *str, int len),
                 (char *buffer, int size)
    {
      $1 = PyString_AsString($input);
      $2 = PyString_Size($input);
    }
    
    /* Typemap with extra pattern parameters */
    %typemap(in, numinputs=0) int *output (int temp),
                              long *output (long temp)
    {
      $1 = &temp;
    }
    

    Admittedly, it's not the most readable syntax at first glance. However, the purpose of the individual pieces will become clear.

    13.2.2 Typemap scope

    Once defined, a typemap remains in effect for all of the declarations that follow. A typemap may be redefined for different sections of an input file. For example:

    // typemap1
    %typemap(in) int {
    ...
    }
    
    int fact(int);                    // typemap1
    int gcd(int x, int y);            // typemap1
    
    // typemap2
    %typemap(in) int {
    ...
    }
    
    int isprime(int);                 // typemap2
    

    One exception to the typemap scoping rules pertains to the %extend declaration. %extend is used to attach new declarations to a class or structure definition. Because of this, all of the declarations in an %extend block are subject to the typemap rules that are in effect at the point where the class itself is defined. For example:

    class Foo {
      ...
    };
    
    %typemap(in) int {
     ...
    }
    
    %extend Foo {
      int blah(int x);    // typemap has no effect.  Declaration is attached to Foo which
                          // appears before the %typemap declaration.
    };
    

    13.2.3 Copying a typemap

    A typemap is copied by using assignment. For example:

    %typemap(in) Integer = int;
    

    or this:

    %typemap(in) Integer, Number, int32_t = int;
    

    Types are often managed by a collection of different typemaps. For example:

    %typemap(in)     int { ... }
    %typemap(out)    int { ... }
    %typemap(varin)  int { ... }
    %typemap(varout) int { ... }
    

    To copy all of these typemaps to a new type, use %apply. For example:

    %apply int { Integer };            // Copy all int typemaps to Integer
    %apply int { Integer, Number };    // Copy all int typemaps to both Integer and Number
    

    The patterns for %apply follow the same rules as for %typemap. For example:

    %apply int *output { Integer *output };                    // Typemap with name
    %apply (char *buf, int len) { (char *buffer, int size) };  // Multiple arguments
    

    13.2.4 Deleting a typemap

    A particular typemap can be deleted / cleared by simply defining no code. For example:

    %typemap(in) int;                 // Clears the "in" typemap for int
    %typemap(in) int, long, short;    // Clears the "in" typemap for int, long, short
    %typemap(in) int *output;       
    

    The above syntax deletes a typemap for just one typemap method - the "in" method in each of the examples above. The %clear directive is more powerful and will delete / clear a family of typemaps, that is, all the typemap methods for a given type. For example:

    %clear int;                       // Delete all typemaps ("in", "out", "varin", ...) for int
    %clear int *output, long *output;
    

    Note: Since SWIG's default behavior is defined by typemaps, clearing a fundamental type like int will make that type unusable unless you also define a new family of typemaps immediately after the clear operation.

    13.2.5 Placement of typemaps

    Typemap declarations can be declared in the global scope, within a C++ namespace, and within a C++ class. For example:

    %typemap(in) int {
      ...
    }
    
    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    
    class Bar {
    public:
      typedef const int & const_reference;
      %typemap(out) const_reference {
        ...
      }
    };
    

    When a typemap appears inside a namespace or class, it stays in effect until the end of the SWIG input (just like before). However, the typemap takes the local scope into account. Therefore, this code

    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    

    is really defining a typemap for the type std::string. You could have code like this:

    namespace std {
      class string;
      %typemap(in) string {          /* std::string */
        ...
      }
    }
    
    namespace Foo {
      class string;
      %typemap(in) string {          /* Foo::string */
        ...
      }
    }
    

    In this case, there are two completely distinct typemaps that apply to two completely different types (std::string and Foo::string).

    It should be noted that for scoping to work, SWIG has to know that string is a typename defined within a particular namespace. In this example, this is done using the forward class declaration class string.

    13.3 Pattern matching rules

    The section describes the pattern matching rules by which C/C++ datatypes are associated with typemaps. The matching rules can be observed in practice by using the debugging options also described.

    13.3.1 Basic matching rules

    Typemaps are matched using both a type and a name (typically the name of a argument). For a given TYPE NAME pair, the following rules are applied, in order, to find a match. The first typemap found is used.

    • Typemaps that exactly match TYPE and NAME.
    • Typemaps that exactly match TYPE only.
    • If TYPE is a C++ template of type T< TPARMS >, where TPARMS are the template parameters, the type is stripped of the template parameters and the following checks are then made:
      • Typemaps that exactly match T and NAME.
      • Typemaps that exactly match T only.

    If TYPE includes qualifiers (const, volatile, etc.), each qualifier is stripped one at a time to form a new stripped type and the matching rules above are repeated on the stripped type. The left-most qualifier is stripped first, resulting in the right-most (or top-level) qualifier being stripped last. For example int const*const is first stripped to int *const then int *.

    If TYPE is an array. The following transformation is made:

    • Replace all dimensions to [ANY] and look for a generic array typemap.

    To illustrate, suppose that you had a function like this:

    int foo(const char *s);
    

    To find a typemap for the argument const char *s, SWIG will search for the following typemaps:

    const char *s           Exact type and name match
    const char *            Exact type match
    char *s                 Type and name match (qualifier stripped)
    char *                  Type match (qualifier stripped)
    

    When more than one typemap rule might be defined, only the first match found is actually used. Here is an example that shows how some of the basic rules are applied:

    %typemap(in) int *x {
      ... typemap 1
    }
    
    %typemap(in) int * {
      ... typemap 2
    }
    
    %typemap(in) const int *z {
      ... typemap 3
    }
    
    %typemap(in) int [4] {
      ... typemap 4
    }
    
    %typemap(in) int [ANY] {
      ... typemap 5
    }
    
    void A(int *x);        // int *x rule       (typemap 1)
    void B(int *y);        // int * rule        (typemap 2)
    void C(const int *x);  // int *x rule       (typemap 1)
    void D(const int *z);  // const int *z rule (typemap 3)
    void E(int x[4]);      // int [4] rule      (typemap 4)
    void F(int x[1000]);   // int [ANY] rule    (typemap 5)
    

    Compatibility note: SWIG-2.0.0 introduced stripping the qualifiers one step at a time. Prior versions stripped all qualifiers in one step.

    13.3.2 Typedef reductions matching

    If no match is found using the rules in the previous section, SWIG applies a typedef reduction to the type and repeats the typemap search for the reduced type. To illustrate, suppose you had code like this:

    %typemap(in) int {
      ... typemap 1
    }
    
    typedef int Integer;
    void blah(Integer x);
    

    To find the typemap for Integer x, SWIG will first search for the following typemaps:

    Integer x
    Integer
    

    Finding no match, it then applies a reduction Integer -> int to the type and repeats the search.

    int x
    int      --> match: typemap 1
    

    Even though two types might be the same via typedef, SWIG allows typemaps to be defined for each typename independently. This allows for interesting customization possibilities based solely on the typename itself. For example, you could write code like this:

    typedef double  pdouble;     // Positive double
    
    // typemap 1
    %typemap(in) double {
      ... get a double ...
    }
    // typemap 2
    %typemap(in) pdouble {
      ... get a positive double ...
    }
    double sin(double x);           // typemap 1
    pdouble sqrt(pdouble x);        // typemap 2
    

    When reducing the type, only one typedef reduction is applied at a time. The search process continues to apply reductions until a match is found or until no more reductions can be made.

    For complicated types, the reduction process can generate a long list of patterns. Consider the following:

    typedef int Integer;
    typedef Integer Row4[4];
    void foo(Row4 rows[10]);
    

    To find a match for the Row4 rows[10] argument, SWIG would check the following patterns, stopping only when it found a match:

    Row4 rows[10]
    Row4 [10]
    Row4 rows[ANY]
    Row4 [ANY]
    
    # Reduce Row4 --> Integer[4]
    Integer rows[10][4]
    Integer [10][4]
    Integer rows[ANY][ANY]
    Integer [ANY][ANY]
    
    # Reduce Integer --> int
    int rows[10][4]
    int [10][4]
    int rows[ANY][ANY]
    int [ANY][ANY]
    

    For parameterized types like templates, the situation is even more complicated. Suppose you had some declarations like this:

    typedef int Integer;
    typedef foo<Integer, Integer> fooii;
    void blah(fooii *x);
    

    In this case, the following typemap patterns are searched for the argument fooii *x:

    fooii *x
    fooii *
    
    # Reduce fooii --> foo<Integer, Integer>
    foo<Integer, Integer> *x
    foo<Integer, Integer> *
    
    # Reduce Integer -> int
    foo<int, Integer> *x
    foo<int, Integer> *
    
    # Reduce Integer -> int
    foo<int, int> *x
    foo<int, int> *
    

    Typemap reductions are always applied to the left-most type that appears. Only when no reductions can be made to the left-most type are reductions made to other parts of the type. This behavior means that you could define a typemap for foo<int, Integer>, but a typemap for foo<Integer, int> would never be matched. Admittedly, this is rather esoteric--there's little practical reason to write a typemap quite like that. Of course, you could rely on this to confuse your coworkers even more.

    As a point of clarification, it is worth emphasizing that typedef matching is a typedef reduction process only, that is, SWIG does not search for every single possible typedef. Given a type in a declaration, it will only reduce the type, it won't build it up looking for typedefs. For example, given the type Struct, the typemap below will not be used for the aStruct parameter, because Struct is fully reduced:

    struct Struct {...};
    typedef Struct StructTypedef;
    
    %typemap(in) StructTypedef { 
      ...
    }
    
    void go(Struct aStruct);
    

    13.3.3 Default typemap matching rules

    If the basic pattern matching rules result in no match being made, even after typedef reductions, the default typemap matching rules are used to look for a suitable typemap match. These rules match a generic typemap based on the reserved SWIGTYPE base type. For example pointers will use SWIGTYPE * and references will use SWIGTYPE &. More precisely, the rules are based on the C++ class template partial specialization matching rules used by C++ compilers when looking for an appropriate partial template specialization. This means that a match is chosen from the most specialized set of generic typemap types available. For example, when looking for a match to int const *, the rules will prefer to match SWIGTYPE const * if available before matching SWIGTYPE *, before matching SWIGTYPE.

    Most SWIG language modules use typemaps to define the default behavior of the C primitive types. This is entirely straightforward. For example, a set of typemaps for primitives marshalled by value or const reference are written like this:

    %typemap(in) int           "... convert to int ...";
    %typemap(in) short         "... convert to short ...";
    %typemap(in) float         "... convert to float ...";
    ...
    %typemap(in) const int &   "... convert ...";
    %typemap(in) const short & "... convert ...";
    %typemap(in) const float & "... convert ...";
    ...
    

    Since typemap matching follows all typedef declarations, any sort of type that is mapped to a primitive type by value or const reference through typedef will be picked up by one of these primitive typemaps. Most language modules also define typemaps for char pointers and char arrays to handle strings, so these non-default types will also be used in preference as the basic typemap matching rules provide a better match than the default typemap matching rules.

    Below is a list of the typical default types supplied by language modules, showing what the "in" typemap would look like:

    %typemap(in) SWIGTYPE &            { ... default reference handling ...                       };
    %typemap(in) SWIGTYPE *            { ... default pointer handling ...                         };
    %typemap(in) SWIGTYPE *const       { ... default pointer const handling ...                   };
    %typemap(in) SWIGTYPE *const&      { ... default pointer const reference handling ...         };
    %typemap(in) SWIGTYPE[ANY]         { ... 1D fixed size arrays handling ...                    };
    %typemap(in) SWIGTYPE []           { ... unknown sized array handling ...                     };
    %typemap(in) enum SWIGTYPE         { ... default handling for enum values ...                 };
    %typemap(in) const enum SWIGTYPE & { ... default handling for const enum reference values ... };
    %typemap(in) SWIGTYPE (CLASS::*)   { ... default pointer member handling ...                  };
    %typemap(in) SWIGTYPE              { ... simple default handling ...                          };
    

    If you wanted to change SWIG's default handling for simple pointers, you would simply redefine the rule for SWIGTYPE *. Note, the simple default typemap rule is used to match against simple types that don't match any other rules:

    %typemap(in) SWIGTYPE              { ... simple default handling ...                          } 
    

    This typemap is important because it is the rule that gets triggered when call or return by value is used. For instance, if you have a declaration like this:

    double dot_product(Vector a, Vector b);
    

    The Vector type will usually just get matched against SWIGTYPE. The default implementation of SWIGTYPE is to convert the value into pointers (as described in this earlier section).

    By redefining SWIGTYPE it may be possible to implement other behavior. For example, if you cleared all typemaps for SWIGTYPE, SWIG simply won't wrap any unknown datatype (which might be useful for debugging). Alternatively, you might modify SWIGTYPE to marshal objects into strings instead of converting them to pointers.

    Let's consider an example where the following typemaps are defined and SWIG is looking for the best match for the enum shown below:

    %typemap(in) const Hello &          { ... }
    %typemap(in) const enum SWIGTYPE &  { ... }
    %typemap(in) enum SWIGTYPE &        { ... }
    %typemap(in) SWIGTYPE &             { ... }
    %typemap(in) SWIGTYPE               { ... }
    
    enum Hello {};
    const Hello &hi;
    

    The typemap at the top of the list will be chosen, not because it is defined first, but because it is the closest match for the type being wrapped. If any of the typemaps in the above list were not defined, then the next one on the list would have precedence.

    The best way to explore the default typemaps is to look at the ones already defined for a particular language module. Typemap definitions are usually found in the SWIG library in a file such as java.swg, csharp.swg etc. However, for many of the target languages the typemaps are hidden behind complicated macros, so the best way to view the default typemaps, or any typemaps for that matter, is to look at the preprocessed output by running swig -E on any interface file. Finally the best way to view the typemap matching rules in action is via the debugging typemap pattern matching options covered later on.

    Compatibility note: The default typemap matching rules were modified in SWIG-2.0.0 from a slightly simpler scheme to match the current C++ class template partial specialization matching rules.

    13.3.4 Multi-arguments typemaps

    When multi-argument typemaps are specified, they take precedence over any typemaps specified for a single type. For example:

    %typemap(in) (char *buffer, int len) {
      // typemap 1
    }
    
    %typemap(in) char *buffer {
      // typemap 2
    }
    
    void foo(char *buffer, int len, int count); // (char *buffer, int len)
    void bar(char *buffer, int blah);           // char *buffer
    

    Multi-argument typemaps are also more restrictive in the way that they are matched. Currently, the first argument follows the matching rules described in the previous section, but all subsequent arguments must match exactly.

    13.3.5 Matching rules compared to C++ templates

    For those intimately familiar with C++ templates, a comparison of the typemap matching rules and template type deduction is interesting. The two areas considered are firstly the default typemaps and their similarities to partial template specialization and secondly, non-default typemaps and their similarities to full template specialization.

    For default (SWIGTYPE) typemaps the rules are inspired by C++ class template partial specialization. For example, given partial specialization for T const& :

    template <typename T> struct X             { void a(); };
    template <typename T> struct X< T const& > { void b(); };
    

    The full (unspecialized) template is matched with most types, such as:

    X< int & >            x1;  x1.a();
    

    and the following all match the T const& partial specialization:

    X< int *const& >      x2;  x2.b();
    X< int const*const& > x3;  x3.b();
    X< int const& >       x4;  x4.b();
    

    Now, given just these two default typemaps, where T is analogous to SWIGTYPE:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) SWIGTYPE const& { ... }
    

    The generic default typemap SWIGTYPE is used with most types, such as

    int &
    

    and the following all match the SWIGTYPE const& typemap, just like the partial template matching:

    int *const&
    int const*const&
    int const&
    

    Note that the template and typemap matching rules are not identical for all default typemaps though, for example, with arrays.

    For non-default typemaps, one might expect SWIG to follow the fully specialized template rules. This is nearly the case, but not quite. Consider a very similar example to the earlier partially specialized template but this time there is a fully specialized template:

    template <typename T> struct Y       { void a(); };
    template <> struct Y< int const & >  { void b(); };
    

    Only the one type matches the specialized template exactly:

    Y< int & >             y1;  y1.a();
    Y< int *const& >       y2;  y2.a();
    Y< int const *const& > y3;  y3.a();
    Y< int const& >        y4;  y4.b(); // fully specialized match
    

    Given typemaps with the same types used for the template declared above, where T is again analogous to SWIGTYPE:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) int const&      { ... }
    

    The comparison between non-default typemaps and fully specialized single parameter templates turns out to be the same, as just the one type will match the non-default typemap:

    int &
    int *const&
    int const*const&
    int const&        // matches non-default typemap int const&
    

    However, if a non-const type is used instead:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) int &           { ... }
    

    then there is a clear difference to template matching as both the const and non-const types match the typemap:

    int &             // matches non-default typemap int &
    int *const&
    int const*const&
    int const&        // matches non-default typemap int &
    

    There are other subtle differences such as typedef handling, but at least it should be clear that the typemap matching rules are similar to those for specialized template handling.

    13.3.6 Debugging typemap pattern matching

    There are two useful debug command line options available for debugging typemaps, -debug-tmsearch and -debug-tmused.

    The -debug-tmsearch option is a verbose option for debugging typemap searches. This can be very useful for watching the pattern matching process in action and for debugging which typemaps are used. The option displays all the typemaps and types that are looked for until a successful pattern match is made. As the display includes searches for each and every type needed for wrapping, the amount of information displayed can be large. Normally you would manually search through the displayed information for the particular type that you are interested in.

    For example, consider some of the code used in the Typedef reductions section already covered:

    typedef int Integer;
    typedef Integer Row4[4];
    void foo(Row4 rows[10]);
    

    A sample of the debugging output is shown below for the "in" typemap:

    swig -perl -debug-tmsearch example.i
    ...
    example.h:3: Searching for a suitable 'in' typemap for: Row4 rows[10]
      Looking for: Row4 rows[10]
      Looking for: Row4 [10]
      Looking for: Row4 rows[ANY]
      Looking for: Row4 [ANY]
      Looking for: Integer rows[10][4]
      Looking for: Integer [10][4]
      Looking for: Integer rows[ANY][ANY]
      Looking for: Integer [ANY][ANY]
      Looking for: int rows[10][4]
      Looking for: int [10][4]
      Looking for: int rows[ANY][ANY]
      Looking for: int [ANY][ANY]
      Looking for: SWIGTYPE rows[ANY][ANY]
      Looking for: SWIGTYPE [ANY][ANY]
      Looking for: SWIGTYPE rows[ANY][]
      Looking for: SWIGTYPE [ANY][]
      Looking for: SWIGTYPE *rows[ANY]
      Looking for: SWIGTYPE *[ANY]
      Looking for: SWIGTYPE rows[ANY]
      Looking for: SWIGTYPE [ANY]
      Looking for: SWIGTYPE rows[]
      Looking for: SWIGTYPE []
      Using: %typemap(in) SWIGTYPE []
    ...
    

    showing that the best default match supplied by SWIG is the SWIGTYPE [] typemap. As the example shows, the successful match displays the used typemap source including typemap method, type and optional name in one of these simplified formats:

    • Using: %typemap(method) type name
    • Using: %typemap(method) type name = type2 name2
    • Using: %apply type2 name2 { type name }

    This information might meet your debugging needs, however, you might want to analyze further. If you next invoke SWIG with the -E option to display the preprocessed output, and search for the particular typemap used, you'll find the full typemap contents (example shown below for Python):

    %typemap(in, noblock=1) SWIGTYPE [] (void *argp = 0, int res = 0) {
      res = SWIG_ConvertPtr($input, &argp, $descriptor, $disown |  0 );
      if (!SWIG_IsOK(res)) { 
        SWIG_exception_fail(SWIG_ArgError(res), "in method '" "$symname" "', argument "
                           "$argnum"" of type '" "$type""'"); 
      } 
      $1 = ($ltype)(argp);
    }
    

    The generated code for the foo wrapper will then contain the snippets of the typemap with the special variables expanded. The rest of this chapter will need reading though to fully understand all of this, however, the relevant parts of the generated code for the above typemap can be seen below:

    SWIGINTERN PyObject *_wrap_foo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
    ...
      void *argp1 = 0 ;
      int res1 = 0 ;
    ...
      res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_a_4__int, 0 |  0 );
      if (!SWIG_IsOK(res1)) {
        SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "foo" "', argument "
                           "1"" of type '" "int [10][4]""'"); 
      } 
      arg1 = (int (*)[4])(argp1);
    ...
    }
    

    Searches for multi-argument typemaps are not mentioned unless a matching multi-argument typemap does actually exist. For example, the output for the code in the earlier multi-arguments section is as follows:

    ...
    example.h:39: Searching for a suitable 'in' typemap for: char *buffer
      Looking for: char *buffer
      Multi-argument typemap found...
      Using: %typemap(in) (char *buffer, int len)
    ...
    

    The second option for debugging is -debug-tmused and this displays the typemaps used. This option is a less verbose version of the -debug-tmsearch option as it only displays each successfully found typemap on a separate single line. The output displays the type, and name if present, the typemap method in brackets and then the actual typemap used in the same simplified format output by the -debug-tmsearch option. Below is the output for the example code at the start of this section on debugging.

    $ swig -perl -debug-tmused example.i
    example.h:3: Typemap for Row4 rows[10] (in) : %typemap(in) SWIGTYPE []
    example.h:3: Typemap for Row4 rows[10] (typecheck) : %typemap(typecheck) SWIGTYPE *
    example.h:3: Typemap for Row4 rows[10] (freearg) : %typemap(freearg) SWIGTYPE []
    example.h:3: Typemap for void foo (out) : %typemap(out) void
    

    Now, consider the following interface file:

    %module example
    
    %{
    void set_value(const char* val) {}
    %}
    
    %typemap(check) char *NON_NULL {
      if (!$1) {
        /* ... error handling ... */
      }
    }
    
    // use default pointer handling instead of strings
    %apply SWIGTYPE * { const char* val, const char* another_value }
    
    %typemap(check) const char* val = char* NON_NULL;
    
    %typemap(arginit, noblock=1) const char* val {
      $1 = "";
    }
    
    void set_value(const char* val);
    
    

    and the output debug:

    swig -perl5 -debug-tmused example.i
    example.i:21: Typemap for char const *val (arginit) : %typemap(arginit) char const *val
    example.i:21: Typemap for char const *val (in) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for char const *val (typecheck) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for char const *val (check) : %typemap(check) char const *val = char *NON_NULL
    example.i:21: Typemap for char const *val (freearg) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for void set_value (out) : %typemap(out) void
    

    The following observations about what is displayed can be noted (the same applies for -debug-tmsearch):

    • The relevant typemap is shown, but for typemap copying, the appropriate %typemap or %apply is displayed, for example, the "check" and "in" typemaps.
    • The typemap modifiers are not shown, eg the noblock=1 modifier in the "arginit" typemap.
    • The exact %apply statement might look different to what is in the actual code. For example, the const char* another_value is not shown as it is not relevant here. Also the types may be displayed slightly differently - char const * and not const char*.

    13.4 Code generation rules

    This section describes rules by which typemap code is inserted into the generated wrapper code.

    13.4.1 Scope

    When a typemap is defined like this:

    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    

    the typemap code is inserted into the wrapper function using a new block scope. In other words, the wrapper code will look like this:

    wrap_whatever() {
      ...
      // Typemap code
      {
        arg1 = PyInt_AsLong(obj1);
      }
      ...
    }
    

    Because the typemap code is enclosed in its own block, it is legal to declare temporary variables for use during typemap execution. For example:

    %typemap(in) short {
      long temp;          /* Temporary value */
      if (Tcl_GetLongFromObj(interp, $input, &temp) != TCL_OK) {
        return TCL_ERROR;
      }
      $1 = (short) temp;
    }
    

    Of course, any variables that you declare inside a typemap are destroyed as soon as the typemap code has executed (they are not visible to other parts of the wrapper function or other typemaps that might use the same variable names).

    Occasionally, typemap code will be specified using a few alternative forms. For example:

    %typemap(in) int "$1 = PyInt_AsLong($input);";
    %typemap(in) int %{
    $1 = PyInt_AsLong($input);
    %}
    %typemap(in, noblock=1) int {
    $1 = PyInt_AsLong($input);
    }
    

    These three forms are mainly used for cosmetics--the specified code is not enclosed inside a block scope when it is emitted. This sometimes results in a less complicated looking wrapper function. Note that only the third of the three typemaps have the typemap code passed through the SWIG preprocessor.

    13.4.2 Declaring new local variables

    Sometimes it is useful to declare a new local variable that exists within the scope of the entire wrapper function. A good example of this might be an application in which you wanted to marshal strings. Suppose you had a C++ function like this

    int foo(std::string *s);
    

    and you wanted to pass a native string in the target language as an argument. For instance, in Perl, you wanted the function to work like this:

    $x = foo("Hello World");
    

    To do this, you can't just pass a raw Perl string as the std::string * argument. Instead, you have to create a temporary std::string object, copy the Perl string data into it, and then pass a pointer to the object. To do this, simply specify the typemap with an extra parameter like this:

    %typemap(in) std::string * (std::string temp) {
      unsigned int len;
      char        *s;
      s = SvPV($input, len);         /* Extract string data */
      temp.assign(s, len);           /* Assign to temp */
      $1 = &temp;                   /* Set argument to point to temp */
    }
    

    In this case, temp becomes a local variable in the scope of the entire wrapper function. For example:

    wrap_foo() {
      std::string temp;    <--- Declaration of temp goes here
      ...
    
      /* Typemap code */
      {
        ...
        temp.assign(s, len);
        ...
      }
      ...
    }
    

    When you set temp to a value, it persists for the duration of the wrapper function and gets cleaned up automatically on exit.

    It is perfectly safe to use more than one typemap involving local variables in the same declaration. For example, you could declare a function as :

    void foo(std::string *x, std::string *y, std::string *z);
    

    This is safely handled because SWIG actually renames all local variable references by appending an argument number suffix. Therefore, the generated code would actually look like this:

    wrap_foo() {
      int *arg1;    /* Actual arguments */
      int *arg2;
      int *arg3;
      std::string temp1;    /* Locals declared in the typemap */
      std::string temp2;
      std::string temp3;
      ...
      {
        char *s;
        unsigned int len;
        ...
        temp1.assign(s, len);
        arg1 = *temp1;
      }
      {
        char *s;
        unsigned int len;
        ...
        temp2.assign(s, len);
        arg2 = &temp2;
      }
      {
        char *s;
        unsigned int len;
        ...
        temp3.assign(s, len);
        arg3 = &temp3;
      }
      ...
    }
    

    There is an exception: if the variable name starts with the _global_ prefix, the argument number is not appended. Such variables can be used throughout the generated wrapper function. For example, the above typemap could be rewritten to use _global_temp instead of temp and the generated code would then contain a single _global_temp variable instead of temp1, temp2 and temp3:

    %typemap(in) std::string * (std::string _global_temp) {
     ... as above ...
    }
    

    Some typemaps do not recognize local variables (or they may simply not apply). At this time, only typemaps that apply to argument conversion support this (input typemaps such as the "in" typemap).

    Note:

    When declaring a typemap for multiple types, each type must have its own local variable declaration.

    %typemap(in) const std::string *, std::string * (std::string temp) // NO!
    // only std::string * has a local variable
    // const std::string * does not (oops)
    ....
    
    %typemap(in) const std::string * (std::string temp), std::string * (std::string temp) // Correct
    ....
    

    13.4.3 Special variables

    Within all typemaps, the following special variables are expanded. This is by no means a complete list as some target languages have additional special variables which are documented in the language specific chapters.

    VariableMeaning
    $n A C local variable corresponding to type n in the typemap pattern.
    $argnum Argument number. Only available in typemaps related to argument conversion
    $n_name Argument name
    $n_type Real C datatype of type n.
    $n_ltype ltype of type n
    $n_mangle Mangled form of type n. For example _p_Foo
    $n_descriptor Type descriptor structure for type n. For example SWIGTYPE_p_Foo. This is primarily used when interacting with the run-time type checker (described later).
    $*n_type Real C datatype of type n with one pointer removed.
    $*n_ltype ltype of type n with one pointer removed.
    $*n_mangle Mangled form of type n with one pointer removed.
    $*n_descriptor Type descriptor structure for type n with one pointer removed.
    $&n_type Real C datatype of type n with one pointer added.
    $&n_ltype ltype of type n with one pointer added.
    $&n_mangle Mangled form of type n with one pointer added.
    $&n_descriptor Type descriptor structure for type n with one pointer added.
    $n_basetype Base typename with all pointers and qualifiers stripped.

    Within the table, $n refers to a specific type within the typemap specification. For example, if you write this

    %typemap(in) int *INPUT {
    
    }
    

    then $1 refers to int *INPUT. If you have a typemap like this,

    %typemap(in) (int argc, char *argv[]) {
      ...
    }
    

    then $1 refers to int argc and $2 refers to char *argv[].

    Substitutions related to types and names always fill in values from the actual code that was matched. This is useful when a typemap might match multiple C datatype. For example:

    %typemap(in)  int, short, long {
      $1 = ($1_ltype) PyInt_AsLong($input);
    }
    

    In this case, $1_ltype is replaced with the datatype that is actually matched.

    When typemap code is emitted, the C/C++ datatype of the special variables $1 and $2 is always an "ltype." An "ltype" is simply a type that can legally appear on the left-hand side of a C assignment operation. Here are a few examples of types and ltypes:

    type              ltype
    ------            ----------------
    int               int
    const int         int
    const int *       int *
    int [4]           int *
    int [4][5]        int (*)[5]
    

    In most cases a ltype is simply the C datatype with qualifiers stripped off. In addition, arrays are converted into pointers.

    Variables such as $&1_type and $*1_type are used to safely modify the type by removing or adding pointers. Although not needed in most typemaps, these substitutions are sometimes needed to properly work with typemaps that convert values between pointers and values.

    If necessary, type related substitutions can also be used when declaring locals. For example:

    %typemap(in) int * ($*1_type temp) {
      temp = PyInt_AsLong($input);
      $1 = &temp;
    }
    

    There is one word of caution about declaring local variables in this manner. If you declare a local variable using a type substitution such as $1_ltype temp, it won't work like you expect for arrays and certain kinds of pointers. For example, if you wrote this,

    %typemap(in) int [10][20] {
      $1_ltype temp;
    }
    

    then the declaration of temp will be expanded as

    int (*)[20] temp;
    

    This is illegal C syntax and won't compile. There is currently no straightforward way to work around this problem in SWIG due to the way that typemap code is expanded and processed. However, one possible workaround is to simply pick an alternative type such as void * and use casts to get the correct type when needed. For example:

    %typemap(in) int [10][20] {
      void *temp;
      ...
      (($1_ltype) temp)[i][j] = x;    /* set a value */
      ...
    }
    

    Another approach, which only works for arrays is to use the $1_basetype substitution. For example:

    %typemap(in) int [10][20] {
      $1_basetype temp[10][20];
      ...
      temp[i][j] = x;    /* set a value */
      ...
    }
    

    13.4.4 Special variable macros

    Special variable macros are like macro functions in that they take one or more input arguments which are used for the macro expansion. They look like macro/function calls but use the special variable $ prefix to the macro name. Note that unlike normal macros, the expansion is not done by the preprocessor, it is done during the SWIG parsing/compilation stages. The following special variable macros are available across all language modules.

    13.4.4.1 $descriptor(type)

    This macro expands into the type descriptor structure for any C/C++ type specified in type. It behaves like the $1_descriptor special variable described above except that the type to expand is taken from the macro argument rather than inferred from the typemap type. For example, $descriptor(std::vector<int> *) will expand into SWIGTYPE_p_std__vectorT_int_t. This macro is mostly used in the scripting target languages and is demonstrated later in the Run-time type checker usage section.

    13.4.4.2 $typemap(method, typepattern)

    This macro uses the pattern matching rules described earlier to lookup and then substitute the special variable macro with the code in the matched typemap. The typemap to search for is specified by the arguments, where method is the typemap method name and typepattern is a type pattern as per the %typemap specification in the Defining a typemap section.

    The special variables within the matched typemap are expanded into those for the matched typemap type, not the typemap within which the macro is called. In practice, there is little use for this macro in the scripting target languages. It is mostly used in the target languages that are statically typed as a way to obtain the target language type given the C/C++ type and more commonly only when the C++ type is a template parameter.

    The example below is for C# only and uses some typemap method names documented in the C# chapter, but it shows some of the possible syntax variations.

    %typemap(cstype) unsigned long    "uint"
    %typemap(cstype) unsigned long bb "bool"
    %typemap(cscode) BarClass %{
      void foo($typemap(cstype, unsigned long aa) var1,
               $typemap(cstype, unsigned long bb) var2,
               $typemap(cstype, (unsigned long bb)) var3,
               $typemap(cstype, unsigned long) var4)
      {
        // do something
      }
    %}
    

    The result is the following expansion

    %typemap(cstype) unsigned long    "uint"
    %typemap(cstype) unsigned long bb "bool"
    %typemap(cscode) BarClass %{
      void foo(uint var1,
               bool var2,
               bool var3,
               uint var4)
      {
        // do something
      }
    %}
    

    13.4.5 Special variables and typemap attributes

    As of SWIG-3.0.7 typemap attributes will also expand special variables and special variable macros.

    Example usage showing the expansion in the 'out' attribute (C# specific) as well as the main typemap body:

    %typemap(ctype, out="$*1_ltype") unsigned int& "$*1_ltype"
    

    is equivalent to the following as $*1_ltype expands to unsigned int:

    %typemap(ctype, out="unsigned int") unsigned int& "unsigned int"
    

    13.4.6 Special variables combined with special variable macros

    Special variables can also be used within special variable macros. The special variables are expanded before they are used in the special variable macros.

    Consider the following C# typemaps:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="$typemap(cstype, $*1_ltype)") unsigned int& "$typemap(cstype, $*1_ltype)"
    

    Special variables are expanded first and hence the above is equivalent to:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="$typemap(cstype, unsigned int)") unsigned int& "$typemap(cstype, unsigned int)"
    

    which then expands to:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="uint") unsigned int& "uint"
    

    13.5 Common typemap methods

    The family of typemaps recognized by a language module may vary. However, the following typemap methods are nearly universal:

    13.5.1 "in" typemap

    The "in" typemap is used to convert function arguments from the target language to C. For example:

    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    

    The following special variables are available:

    $input            - Input object holding value to be converted.
    $symname          - Name of function/method being wrapped
    

    This is probably the most commonly redefined typemap because it can be used to implement customized conversions.

    In addition, the "in" typemap allows the number of converted arguments to be specified. The numinputs attributes facilitates this. For example:

    // Ignored argument.
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    

    At this time, only zero or one arguments may be converted. When numinputs is set to 0, the argument is effectively ignored and cannot be supplied from the target language. The argument is still required when making the C/C++ call and the above typemap shows the value used is instead obtained from a locally declared variable called temp. Usually numinputs is not specified, whereupon the default value is 1, that is, there is a one to one mapping of the number of arguments when used from the target language to the C/C++ call. Multi-argument typemaps provide a similar concept where the number of arguments mapped from the target language to C/C++ can be changed for multiple adjacent C/C++ arguments.

    Compatibility note: Specifying numinputs=0 is the same as the old "ignore" typemap.

    13.5.2 "typecheck" typemap

    The "typecheck" typemap is used to support overloaded functions and methods. It merely checks an argument to see whether or not it matches a specific type. For example:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_INTEGER) int {
      $1 = PyInt_Check($input) ? 1 : 0;
    }
    

    For typechecking, the $1 variable is always a simple integer that is set to 1 or 0 depending on whether or not the input argument is the correct type. Set to 1 if the input argument is the correct type otherwise set to 0.

    If you define new "in" typemaps and your program uses overloaded methods, you should also define a collection of "typecheck" typemaps. More details about this follow in the Typemaps and overloading section.

    13.5.3 "out" typemap

    The "out" typemap is used to convert function/method return values from C into the target language. For example:

    %typemap(out) int {
      $result = PyInt_FromLong($1);
    }
    

    The following special variables are available.

    $result           - Result object returned to target language.
    $symname          - Name of function/method being wrapped
    

    The "out" typemap supports an optional attribute flag called "optimal". This is for code optimisation and is detailed in the Optimal code generation when returning by value section.

    13.5.4 "arginit" typemap

    The "arginit" typemap is used to set the initial value of a function argument--before any conversion has occurred. This is not normally necessary, but might be useful in highly specialized applications. For example:

    // Set argument to NULL before any conversion occurs
    %typemap(arginit) int *data {
      $1 = NULL;
    }
    

    13.5.5 "default" typemap

    The "default" typemap is used to turn an argument into a default argument. For example:

    %typemap(default) int flags {
      $1 = DEFAULT_FLAGS;
    }
    ...
    int foo(int x, int y, int flags);
    

    The primary use of this typemap is to either change the wrapping of default arguments or specify a default argument in a language where they aren't supported (like C). Target languages that do not support optional arguments, such as Java and C#, effectively ignore the value specified by this typemap as all arguments must be given.

    Once a default typemap has been applied to an argument, all arguments that follow must have default values. See the Default/optional arguments section for further information on default argument wrapping.

    13.5.6 "check" typemap

    The "check" typemap is used to supply value checking code during argument conversion. The typemap is applied after arguments have been converted. For example:

    %typemap(check) int positive {
      if ($1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected positive value.");
      }
    }
    

    13.5.7 "argout" typemap

    The "argout" typemap is used to return values from arguments. This is most commonly used to write wrappers for C/C++ functions that need to return multiple values. The "argout" typemap is almost always combined with an "in" typemap---possibly to ignore the input value. For example:

    /* Set the input argument to point to a temporary variable */
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    
    %typemap(argout) int *out {
      // Append output value $1 to $result
      ...
    }
    

    The following special variables are available.

    $result           - Result object returned to target language.
    $input            - The original input object passed.
    $symname          - Name of function/method being wrapped
    

    The code supplied to the "argout" typemap is always placed after the "out" typemap. If multiple return values are used, the extra return values are often appended to return value of the function.

    See the typemaps.i library file for examples.

    13.5.8 "freearg" typemap

    The "freearg" typemap is used to cleanup argument data. It is only used when an argument might have allocated resources that need to be cleaned up when the wrapper function exits. The "freearg" typemap usually cleans up argument resources allocated by the "in" typemap. For example:

    // Get a list of integers
    %typemap(in) int *items {
      int nitems = Length($input);
      $1 = (int *) malloc(sizeof(int)*nitems);
    }
    // Free the list 
    %typemap(freearg) int *items {
      free($1);
    }
    

    The "freearg" typemap inserted at the end of the wrapper function, just before control is returned back to the target language. This code is also placed into a special variable $cleanup that may be used in other typemaps whenever a wrapper function needs to abort prematurely.

    13.5.9 "newfree" typemap

    The "newfree" typemap is used in conjunction with the %newobject directive and is used to deallocate memory used by the return result of a function. For example:

    %typemap(newfree) string * {
      delete $1;
    }
    %typemap(out) string * {
      $result = PyString_FromString($1->c_str());
    }
    ...
    
    %newobject foo;
    ...
    string *foo();
    

    See Object ownership and %newobject for further details.

    13.5.10 "ret" typemap

    The "ret" typemap is not used very often, but can be useful for anything associated with the return type, such as resource management, return value error checking, etc. Usually this can all be done in the "out" typemap, but sometimes it is handy to use the "out" typemap code untouched and add to the generated code using the code in the "ret" typemap. One such case is memory clean up. For example, a stringheap_t type is defined indicating that the returned memory must be deleted and a string_t type is defined indicating that the returned memory must not be deleted.

    %typemap(ret) stringheap_t %{
      free($1);
    %}
    
    typedef char * string_t;
    typedef char * stringheap_t;
    
    string_t MakeString1();
    stringheap_t MakeString2();
    

    The "ret" typemap above will only be used for MakeString2, but both functions will use the default "out" typemap for char * provided by SWIG. The code above would ensure the appropriate memory is freed in all target languages as the need to provide custom "out" typemaps (which involve target language specific code) is not necessary.

    This approach is an alternative to using the "newfree" typemap and %newobject as there is no need to list all the functions that require the memory cleanup, it is purely done on types.

    13.5.11 "memberin" typemap

    The "memberin" typemap is used to copy data from an already converted input value into a structure member. It is typically used to handle array members and other special cases. For example:

    %typemap(memberin) int [4] {
      memmove($1, $input, 4*sizeof(int));
    }
    

    It is rarely necessary to write "memberin" typemaps---SWIG already provides a default implementation for arrays, strings, and other objects.

    13.5.12 "varin" typemap

    The "varin" typemap is used to convert objects in the target language to C for the purposes of assigning to a C/C++ global variable. This is implementation specific.

    13.5.13 "varout" typemap

    The "varout" typemap is used to convert a C/C++ object to an object in the target language when reading a C/C++ global variable. This is implementation specific.

    13.5.14 "throws" typemap

    The "throws" typemap is only used when SWIG parses a C++ method with an exception specification or has the %catches feature attached to the method (see Exception handling with %catches). It provides a default mechanism for handling C++ methods that have declared the exceptions they will throw. The purpose of this typemap is to convert a C++ exception into an error or exception in the target language. It is slightly different to the other typemaps as it is based around the exception type rather than the type of a parameter or variable. For example:

    %typemap(throws) const char * %{
      PyErr_SetString(PyExc_RuntimeError, $1);
      SWIG_fail;
    %}
    
    // Either an exception specification on the method
      void bar() throw (const char *);
    
    // Or a %catches feature attached to the method
      %catches(const char *) bar();
      void bar();
    

    As can be seen from the resulting generated code below, SWIG generates an exception handler when wrapping the bar function with the catch block comprising the "throws" typemap content.

    ...
    try {
      bar();
    } catch(char const *_e) {
      PyErr_SetString(PyExc_RuntimeError, _e);
      SWIG_fail;
    }
    ...
    

    Note that if your methods do not have an exception specification but they do throw exceptions and you are not using %catches, SWIG cannot know how to deal with them. Please also see the Exception handling with %exception section for another way to handle exceptions.

    13.6 Some typemap examples

    This section contains a few examples. Consult language module documentation for more examples.

    13.6.1 Typemaps for arrays

    A common use of typemaps is to provide support for C arrays appearing both as arguments to functions and as structure members.

    For example, suppose you had a function like this:

    void set_vector(int type, float value[4]);
    

    If you wanted to handle float value[4] as a list of floats, you might write a typemap similar to this:

    
    %typemap(in) float value[4] (float temp[4]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != 4) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected 4 elements");
        SWIG_fail;
      }
      for (i = 0; i < 4; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          temp[i] = (float) PyFloat_AsDouble(o);
        } else {
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");      
          SWIG_fail;
        }
      }
      $1 = temp;
    }
    

    In this example, the variable temp allocates a small array on the C stack. The typemap then populates this array and passes it to the underlying C function.

    When used from Python, the typemap allows the following type of function call:

    >>> set_vector(type, [ 1, 2.5, 5, 20 ])
    

    If you wanted to generalize the typemap to apply to arrays of all dimensions you might write this:

    %typemap(in) float value[ANY] (float temp[$1_dim0]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected $1_dim0 elements");
        SWIG_fail;
      }
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          temp[i] = (float) PyFloat_AsDouble(o);
        } else {
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");      
          SWIG_fail;
        }
      }
      $1 = temp;
    }
    

    In this example, the special variable $1_dim0 is expanded with the actual array dimensions. Multidimensional arrays can be matched in a similar manner. For example:

    %typemap(in) float matrix[ANY][ANY] (float temp[$1_dim0][$1_dim1]) {
      ... convert a 2d array ...
    }
    

    For large arrays, it may be impractical to allocate storage on the stack using a temporary variable as shown. To work with heap allocated data, the following technique can be used.

    %typemap(in) float value[ANY] {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected $1_dim0 elements");
        SWIG_fail;
      }
      $1 = (float *) malloc($1_dim0*sizeof(float));
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          $1[i] = (float) PyFloat_AsDouble(o);
        } else {
          free($1);
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");
          SWIG_fail;
        }
      }
    }
    %typemap(freearg) float value[ANY] {
      if ($1) free($1);
    }
    

    In this case, an array is allocated using malloc. The freearg typemap is then used to release the argument after the function has been called.

    Another common use of array typemaps is to provide support for array structure members. Due to subtle differences between pointers and arrays in C, you can't just "assign" to a array structure member. Instead, you have to explicitly copy elements into the array. For example, suppose you had a structure like this:

    struct SomeObject {
      float  value[4];
      ...
    };
    

    When SWIG runs, it won't produce any code to set the vec member. You may even get a warning message like this:

    $ swig -python  example.i
    example.i:10: Warning 462: Unable to set variable of type float [4].
    

    These warning messages indicate that SWIG does not know how you want to set the vec field.

    To fix this, you can supply a special "memberin" typemap like this:

    %typemap(memberin) float [ANY] {
      int i;
      for (i = 0; i < $1_dim0; i++) {
          $1[i] = $input[i];
      }
    }
    

    The memberin typemap is used to set a structure member from data that has already been converted from the target language to C. In this case, $input is the local variable in which converted input data is stored. This typemap then copies this data into the structure.

    When combined with the earlier typemaps for arrays, the combination of the "in" and "memberin" typemap allows the following usage:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    

    Related to structure member input, it may be desirable to return structure members as a new kind of object. For example, in this example, you will get very odd program behavior where the structure member can be set nicely, but reading the member simply returns a pointer:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    >>> print s.x
    _1008fea8_p_float
    >>> 
    

    To fix this, you can write an "out" typemap. For example:

    %typemap(out) float [ANY] {
      int i;
      $result = PyList_New($1_dim0);
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PyFloat_FromDouble((double) $1[i]);
        PyList_SetItem($result, i, o);
      }
    }
    

    Now, you will find that member access is quite nice:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    >>> print s.x
    [ 1, 2.5, 5, 10]
    

    Compatibility Note: SWIG1.1 used to provide a special "memberout" typemap. However, it was mostly useless and has since been eliminated. To return structure members, simply use the "out" typemap.

    13.6.2 Implementing constraints with typemaps

    One particularly interesting application of typemaps is the implementation of argument constraints. This can be done with the "check" typemap. When used, this allows you to provide code for checking the values of function arguments. For example:

    %module math
    
    %typemap(check) double posdouble {
      if ($1 < 0) {
        croak("Expecting a positive number");
      }
    }
    
    ...
    double sqrt(double posdouble);
    
    

    This provides a sanity check to your wrapper function. If a negative number is passed to this function, a Perl exception will be raised and your program terminated with an error message.

    This kind of checking can be particularly useful when working with pointers. For example:

    %typemap(check) Vector * {
      if ($1 == 0) {
        PyErr_SetString(PyExc_TypeError, "NULL Pointer not allowed");
        SWIG_fail;
      }
    }
    
    

    will prevent any function involving a Vector * from accepting a NULL pointer. As a result, SWIG can often prevent a potential segmentation faults or other run-time problems by raising an exception rather than blindly passing values to the underlying C/C++ program.

    13.7 Typemaps for multiple target languages

    The code within typemaps is usually language dependent, however, many target languages support the same typemaps. In order to distinguish typemaps across different languages, the preprocessor should be used. For example, the "in" typemap for Perl and Ruby could be written as:

    #if defined(SWIGPERL)
      %typemap(in) int "$1 = ($1_ltype) SvIV($input);"
    #elif defined(SWIGRUBY)
      %typemap(in) int "$1 = NUM2INT($input);"
    #else
      #warning no "in" typemap defined
    #endif
    

    The full set of language specific macros is defined in the Conditional Compilation section. The example above also shows a common approach of issuing a warning for an as yet unsupported language.

    Compatibility note: In SWIG-1.1 different languages could be distinguished with the language name being put within the %typemap directive, for example,
    %typemap(ruby, in) int "$1 = NUM2INT($input);".

    13.8 Optimal code generation when returning by value

    The "out" typemap is the main typemap for return types. This typemap supports an optional attribute flag called "optimal", which is for reducing the number of temporary variables and the amount of generated code, thereby giving the compiler the opportunity to use return value optimization for generating faster executing code. It only really makes a difference when returning objects by value and has some limitations on usage, as explained later on.

    When a function returns an object by value, SWIG generates code that instantiates the default type on the stack then assigns the value returned by the function call to it. A copy of this object is then made on the heap and this is what is ultimately stored and used from the target language. This will be clearer considering an example. Consider running the following code through SWIG:

    %typemap(out) SWIGTYPE %{
      $result = new $1_ltype((const $1_ltype &)$1);
    %}
    
    %inline %{
    #include <iostream>
    using namespace std;
    
    struct XX {
      XX() { cout << "XX()" << endl; }
      XX(int i) { cout << "XX(" << i << ")" << endl; }
      XX(const XX &other) { cout << "XX(const XX &)" << endl; }
      XX & operator =(const XX &other) { cout << "operator=(const XX &)" << endl; return *this; }
      ~XX() { cout << "~XX()" << endl; }
      static XX create() { 
        return XX(0);
      }
    };
    %}
    

    The "out" typemap shown is the default typemap for C# when returning objects by value. When making a call to XX::create() from C#, the output is as follows:

    XX()
    XX(0)
    operator=(const XX &)
    ~XX()
    XX(const XX &)
    ~XX()
    ~XX()
    

    Note that three objects are being created as well as an assignment. Wouldn't it be great if the XX::create() method was the only time a constructor was called? As the method returns by value, this is asking a lot and the code that SWIG generates by default makes it impossible for the compiler to use return value optimisation (RVO). However, this is where the "optimal" attribute in the "out" typemap can help out. If the typemap code is kept the same and just the "optimal" attribute specified like this:

    %typemap(out, optimal="1") SWIGTYPE %{
      $result = new $1_ltype((const $1_ltype &)$1);
    %}
    

    then when the code is run again, the output is simply:

    XX(0)
    ~XX()
    

    How the "optimal" attribute works is best explained using the generated code. Without "optimal", the generated code is:

    SWIGEXPORT void * SWIGSTDCALL CSharp_XX_create() {
      void * jresult ;
      XX result;
      result = XX::create();
      jresult = new XX((const XX &)result);
      return jresult;
    }
    
    

    With the "optimal" attribute, the code is:

    SWIGEXPORT void * SWIGSTDCALL CSharp_XX_create() {
      void * jresult ;
      jresult = new XX((const XX &)XX::create());
      return jresult;
    }
    

    The major difference is the result temporary variable holding the value returned from XX::create() is no longer generated and instead the copy constructor call is made directly from the value returned by XX::create(). With modern compilers implementing RVO, the copy is not actually done, in fact the object is never created on the stack in XX::create() at all, it is simply created directly on the heap. In the first instance, the $1 special variable in the typemap is expanded into result. In the second instance, $1 is expanded into XX::create() and this is essentially what the "optimal" attribute is telling SWIG to do.

    The "optimal" attribute optimisation is not turned on by default as it has a number of restrictions. Firstly, some code cannot be condensed into a simple call for passing into the copy constructor. One common occurrence is when %exception is used. Consider adding the following %exception to the example:

    %exception XX::create() %{
    try {
      $action
    } catch(const std::exception &e) {
      cout << e.what() << endl;
    }
    %}
    

    SWIG can detect when the "optimal" attribute cannot be used and will ignore it and in this case will issue the following warning:

    example.i:28: Warning 474: Method XX::create() usage of the optimal attribute ignored
    example.i:14: Warning 474: in the out typemap as the following cannot be used to generate
    optimal code: 
    try {
      result = XX::create();
    } catch(const std::exception &e) {
      cout << e.what() << endl;
    }
    

    It should be clear that the above code cannot be used as the argument to the copy constructor call, that is, for the $1 substitution.

    Secondly, if the typemaps uses $1 more than once, then multiple calls to the wrapped function will be made. Obviously that is not very optimal. In fact SWIG attempts to detect this and will issue a warning something like:

    example.i:21: Warning 475: Multiple calls to XX::create() might be generated due to
    example.i:7: Warning 475: optimal attribute usage in the out typemap.
    

    However, it doesn't always get it right, for example when $1 is within some commented out code.

    13.9 Multi-argument typemaps

    So far, the typemaps presented have focused on the problem of dealing with single values. For example, converting a single input object to a single argument in a function call. However, certain conversion problems are difficult to handle in this manner. As an example, consider the example at the very beginning of this chapter:

    int foo(int argc, char *argv[]);
    

    Suppose that you wanted to wrap this function so that it accepted a single list of strings like this:

    >>> foo(["ale", "lager", "stout"])
    

    To do this, you not only need to map a list of strings to char *argv[], but the value of int argc is implicitly determined by the length of the list. Using only simple typemaps, this type of conversion is possible, but extremely painful. Multi-argument typemaps help in this situation.

    A multi-argument typemap is a conversion rule that specifies how to convert a single object in the target language to a set of consecutive function arguments in C/C++. For example, the following multi-argument maps perform the conversion described for the above example:

    %typemap(in) (int argc, char *argv[]) {
      int i;
      if (!PyList_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting a list");
        SWIG_fail;
      }
      $1 = PyList_Size($input);
      $2 = (char **) malloc(($1+1)*sizeof(char *));
      for (i = 0; i < $1; i++) {
        PyObject *s = PyList_GetItem($input, i);
        if (!PyString_Check(s)) {
          free($2);
          PyErr_SetString(PyExc_ValueError, "List items must be strings");
          SWIG_fail;
        }
        $2[i] = PyString_AsString(s);
      }
      $2[i] = 0;
    }
    
    %typemap(freearg) (int argc, char *argv[]) {
      if ($2) free($2);
    }
    
    /* Required for C++ method overloading */
    %typecheck(SWIG_TYPECHECK_STRING_ARRAY) (int argc, char *argv[]) {
      $1 = PyList_Check($input) ? 1 : 0;
    }
    

    A multi-argument map is always specified by surrounding the arguments with parentheses as shown. For example:

    %typemap(in) (int argc, char *argv[]) { ... }
    

    Within the typemap code, the variables $1, $2, and so forth refer to each type in the map. All of the usual substitutions apply--just use the appropriate $1 or $2 prefix on the variable name (e.g., $2_type, $1_ltype, etc.)

    Multi-argument typemaps always have precedence over simple typemaps and SWIG always performs longest-match searching. Therefore, you will get the following behavior:

    %typemap(in) int argc                              { ... typemap 1 ... }
    %typemap(in) (int argc, char *argv[])              { ... typemap 2 ... }
    %typemap(in) (int argc, char *argv[], char *env[]) { ... typemap 3 ... }
    
    int foo(int argc, char *argv[]);                   // Uses typemap 2
    int bar(int argc, int x);                          // Uses typemap 1
    int spam(int argc, char *argv[], char *env[]);     // Uses typemap 3
    

    It should be stressed that multi-argument typemaps can appear anywhere in a function declaration and can appear more than once. For example, you could write this:

    %typemap(in) (int scount, char *swords[]) { ... }
    %typemap(in) (int wcount, char *words[]) { ... }
    
    void search_words(int scount, char *swords[], int wcount, char *words[], int maxcount);
    

    Other directives such as %apply and %clear also work with multi-argument maps. For example:

    %apply (int argc, char *argv[]) {
        (int scount, char *swords[]),
        (int wcount, char *words[])
    };
    ...
    %clear (int scount, char *swords[]), (int wcount, char *words[]);
    ...
    

    Don't forget to also provide a suitable typemap for overloaded functions, such as %typecheck shown for foo above. This is only required if the function is overloaded in C++.

    Although multi-argument typemaps may seem like an exotic, little used feature, there are several situations where they make sense. First, suppose you wanted to wrap functions similar to the low-level read() and write() system calls. For example:

    typedef unsigned int size_t;
    
    int read(int fd, void *rbuffer, size_t len);
    int write(int fd, void *wbuffer, size_t len);
    

    As is, the only way to use the functions would be to allocate memory and pass some kind of pointer as the second argument---a process that might require the use of a helper function. However, using multi-argument maps, the functions can be transformed into something more natural. For example, you might write typemaps like this:

    // typemap for an outgoing buffer
    %typemap(in) (void *wbuffer, size_t len) {
      if (!PyString_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting a string");
        SWIG_fail;
      }
      $1 = (void *) PyString_AsString($input);
      $2 = PyString_Size($input);
    }
    
    // typemap for an incoming buffer
    %typemap(in) (void *rbuffer, size_t len) {
      if (!PyInt_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting an integer");
        SWIG_fail;
      }
      $2 = PyInt_AsLong($input);
      if ($2 < 0) {
        PyErr_SetString(PyExc_ValueError, "Positive integer expected");
        SWIG_fail;
      }
      $1 = (void *) malloc($2);
    }
    
    // Return the buffer.  Discarding any previous return result
    %typemap(argout) (void *rbuffer, size_t len) {
      Py_XDECREF($result);   /* Blow away any previous result */
      if (result < 0) {      /* Check for I/O error */
        free($1);
        PyErr_SetFromErrno(PyExc_IOError);
        return NULL;
      }
      $result = PyString_FromStringAndSize($1, result);
      free($1);
    }
    

    (note: In the above example, $result and result are two different variables. result is the real C datatype that was returned by the function. $result is the scripting language object being returned to the interpreter.).

    Now, in a script, you can write code that simply passes buffers as strings like this:

    >>> f = example.open("Makefile")
    >>> example.read(f, 40)
    'TOP        = ../..\nSWIG       = $(TOP)/.'
    >>> example.read(f, 40)
    './swig\nSRCS       = example.c\nTARGET    '
    >>> example.close(f)
    0
    >>> g = example.open("foo", example.O_WRONLY | example.O_CREAT, 0644)
    >>> example.write(g, "Hello world\n")
    12
    >>> example.write(g, "This is a test\n")
    15
    >>> example.close(g)
    0
    >>>
    

    A number of multi-argument typemap problems also arise in libraries that perform matrix-calculations--especially if they are mapped onto low-level Fortran or C code. For example, you might have a function like this:

    int is_symmetric(double *mat, int rows, int columns);
    

    In this case, you might want to pass some kind of higher-level object as an matrix. To do this, you could write a multi-argument typemap like this:

    %typemap(in) (double *mat, int rows, int columns) {
      MatrixObject *a;
      a = GetMatrixFromObject($input);     /* Get matrix somehow */
    
      /* Get matrix properties */
      $1 = GetPointer(a);
      $2 = GetRows(a);
      $3 = GetColumns(a);
    }
    

    This kind of technique can be used to hook into scripting-language matrix packages such as Numeric Python. However, it should also be stressed that some care is in order. For example, when crossing languages you may need to worry about issues such as row-major vs. column-major ordering (and perform conversions if needed). Note that multi-argument typemaps cannot deal with non-consecutive C/C++ arguments; a workaround such as a helper function re-ordering the arguments to make them consecutive will need to be written.

    13.10 Typemap warnings

    Warnings can be added to typemaps so that SWIG generates a warning message whenever the typemap is used. See the information in the issuing warnings section.

    13.11 Typemap fragments

    The primary purpose of fragments is to reduce code bloat that repeated use of typemap code can lead to. Fragments are snippets of code that can be thought of as code dependencies of a typemap. If a fragment is used by more than one typemap, then the snippet of code within the fragment is only generated once. Code bloat is typically reduced by moving typemap code into a support function and then placing the support function into a fragment.

    For example, if you have a very long typemap

    %typemap(in) MyClass * {
      MyClass *value = 0;
    
      ... many lines of marshalling code  ...
    
      $result = value;
    }
    

    the same marshalling code is often repeated in several typemaps, such as "in", "varin", "directorout", etc. SWIG copies the code for each argument that requires the typemap code, easily leading to code bloat in the generated code. To eliminate this, define a fragment that includes the common marshalling code:

    %fragment("AsMyClass", "header") {
      MyClass *AsMyClass(PyObject *obj) {
        MyClass *value = 0;
    
        ... many lines of marshalling code  ...
    
        return value;
      }
    }
    
    %typemap(in, fragment="AsMyClass") MyClass * {
      $result = AsMyClass($input);
    }
    
    %typemap(varin, fragment="AsMyClass") MyClass * {
      $result = AsMyClass($input);
    }
    

    When the "in" or "varin" typemaps for MyClass are required, the contents of the fragment called "AsMyClass" is added to the "header" section within the generated code, and then the typemap code is emitted. Hence, the method AsMyClass will be generated into the wrapper code before any typemap code that calls it.

    To define a fragment you need a fragment name, a section name for generating the fragment code into, and the code itself. See Code insertion blocks for a full list of section names. Usually the section name used is "header". Different delimiters can be used:

    %fragment("my_name", "header") %{ ... %}
    %fragment("my_name", "header") { ... }
    %fragment("my_name", "header") " ... "
    

    and these follow the usual preprocessing rules mentioned in the Preprocessing delimiters section. The following are some rules and guidelines for using fragments:

    1. A fragment is added to the wrapping code only once. When using the MyClass * typemaps above and wrapping the method:

      void foo(MyClass *a, MyClass *b);
      

      the generated code will look something like:

      MyClass *AsMyClass(PyObject *obj) {
        ...
      }
      
      void _wrap_foo(...) {
        ....
        arg1 = AsMyClass(obj1);
        arg2 = AsMyClass(obj2);
        ...
        foo(arg1, arg2);
      }
      

      even as there is duplicated typemap code to process both a and b, the AsMyClass method will be defined only once.

    2. A fragment should only be defined once. If there is more than one definition, the first definition is the one used. All other definitions are silently ignored. For example, if you have

      %fragment("AsMyClass", "header") { ...definition 1... }
      ....
      %fragment("AsMyClass", "header") { ...definition 2... }
      

      only the first definition is used. In this way you can override the default fragments in a SWIG library by defining your fragment before the library %include. Note that this behavior is the opposite to typemaps, where the last typemap defined/applied prevails. Fragments follow the first-in-first-out convention since they are intended to be global, while typemaps are intended to be locally specialized.

    3. Fragment names cannot contain commas.

    4. A fragment can use one or more additional fragments, for example:

      %fragment("<limits.h>", "header") %{
        #include <limits.h>
      %}
      
      
      %fragment("AsMyClass", "header", fragment="<limits.h>") {
        MyClass *AsMyClass(PyObject *obj) {
          MyClass *value = 0;
      
          ... some marshalling code  ...
      
          if  (ival < CHAR_MIN /*defined in <limits.h>*/) {
            ...
          } else {
            ...
          }
          ...
          return value;
        }
      }
      

      in this case, when the "AsMyClass" fragment is emitted, it also triggers the inclusion of the "<limits.h>" fragment.

    5. A fragment can have dependencies on a number of other fragments, for example:

      %fragment("bigfragment", "header", fragment="frag1", fragment="frag2", fragment="frag3") "";
      

      When the "bigfragment" is used, the three dependent fragments "frag1", "frag2" and "frag3" are also pulled in. Note that as "bigframent" is empty (the empty string - ""), it does not add any code itself, but merely triggers the inclusion of the other fragments.

    6. A typemap can also use more than one fragment, but since the syntax is different, you need to specify the dependent fragments in a comma separated list. Consider:

      %typemap(in, fragment="frag1, frag2, frag3") {...}
      

      which is equivalent to:

      %typemap(in, fragment="bigfragment") {...}
      

      when used with the "bigfragment" defined above.

    7. Finally, you can force the inclusion of a fragment at any point in the generated code as follows:

      %fragment("bigfragment");
      

      which, for example, is very useful inside a template class. Another useful case is when using %extend inside a class where the additional code in the %extend block depends on the contents of the fragment.

      %fragment("<limits.h>", "header") %{
        #include <limits.h>
      %}
      
      struct X {
        ...
        %extend {
          %fragment("<limits.h>");
          bool check(short val) {
            if (val < SHRT_MIN /*defined in <limits.h>*/) {
              return true;
            } else {
              return false;
            }
          }
        }
      };
      

      Forced inclusion of fragments can be used as a replacement for code insertion block, ensuring the code block is only generated once. Consider the contents of FileA.i below which first uses a code insertion block and then a forced fragment inclusion to generate code:

      // FileA.i
      %{
        #include <stdio.h>
      %}
      %fragment("<limits.h>");
      

      and another file including the above:

      // FileB.i
      %include "FileA.i"
      

      The resulting code in the wrappers for FileB.i is:

        #include <stdio.h>
      
        #include <limits.h>
      

      A note of caution must be mentioned when using %fragment forced inclusion or code insertion blocks with %import. If %import is used instead:

      // FileC.i
      %import "FileA.i"
      

      then nothing is generated in the resulting code in the wrappers for FileC.i. This is because %import is for collecting type information and does not result in any code being generated, see File Imports.

    Most readers will probably want to skip the next two sub-sections on advanced fragment usage unless a desire to really get to grips with some powerful but tricky macro and fragment usage that is used in parts of the SWIG typemap library.

    13.11.1 Fragment type specialization

    Fragments can be type specialized. The syntax is as follows:

    %fragment("name", "header") { ...a type independent fragment... }
    %fragment("name"{type}, "header") { ...a type dependent fragment...  }
    

    where type is a C/C++ type. Like typemaps, fragments can also be used inside templates, for example:

    template <class T>
    struct A {
      %fragment("incode"{A<T>}, "header") {
        ... 'incode' specialized fragment ...
      }
    
      %typemap(in, fragment="incode"{A<T>}) {
        ... here we use the 'type specialized' fragment "incode"{A<T>} ...
      }
    };
    

    13.11.2 Fragments and automatic typemap specialization

    Since fragments can be type specialized, they can be elegantly used to specialize typemaps. For example, if you have something like:

    %fragment("incode"{float}, "header") {
      float in_method_float(PyObject *obj) {
        ...
      }
    }
    
    %fragment("incode"{long}, "header") {
      float in_method_long(PyObject *obj) {
        ...
      }
    }
    
    // %my_typemaps macro definition
    %define %my_typemaps(Type) 
    %typemap(in, fragment="incode"{Type}) Type {
      value = in_method_##Type(obj);
    }
    %enddef
    
    %my_typemaps(float);
    %my_typemaps(long);
    

    then the proper "incode"{float} or "incode"{long} fragment will be used, and the in_method_float and in_method_long methods will be called whenever the float or long types are used as input parameters.

    This feature is used a lot in the typemaps shipped in the SWIG library for some scripting languages. The interested (or very brave) reader can take a look at the fragments.swg file shipped with SWIG to see this in action.

    13.12 The run-time type checker

    Most scripting languages need type information at run-time. This type information can include how to construct types, how to garbage collect types, and the inheritance relationships between types. If the language interface does not provide its own type information storage, the generated SWIG code needs to provide it.

    Requirements for the type system:

    • Store inheritance and type equivalence information and be able to correctly re-create the type pointer.
    • Share type information between modules.
    • Modules can be loaded in any order, regardless of actual type dependency.
    • Avoid the use of dynamically allocated memory, and library/system calls in general.
    • Provide a reasonably fast implementation, minimizing the lookup time for all language modules.
    • Custom, language specific information can be attached to types.
    • Modules can be unloaded from the type system.

    13.12.1 Implementation

    The run-time type checker is used by many, but not all, of SWIG's supported target languages. The run-time type checker features are not required and are thus not used for statically typed languages such as Java and C#. The scripting and scheme based languages rely on it and it forms a critical part of SWIG's operation for these languages.

    When pointers, arrays, and objects are wrapped by SWIG, they are normally converted into typed pointer objects. For example, an instance of Foo * might be a string encoded like this:

    _108e688_p_Foo
    

    At a basic level, the type checker simply restores some type-safety to extension modules. However, the type checker is also responsible for making sure that wrapped C++ classes are handled correctly---especially when inheritance is used. This is especially important when an extension module makes use of multiple inheritance. For example:

    class Foo {
    public:
      int x;
    };
    
    class Bar {
    public:
      int y;
    };
    
    class FooBar : public Foo, public Bar {
    public:
      int z;
    };
    

    When the class FooBar is organized in memory, it contains the contents of the classes Foo and Bar as well as its own data members. For example:

    FooBar --> | -----------|  <-- Foo
               |   int x    |
               |------------|  <-- Bar
               |   int y    |
               |------------|
               |   int z    |
               |------------|
    

    Because of the way that base class data is stacked together, the casting of a Foobar * to either of the base classes may change the actual value of the pointer. This means that it is generally not safe to represent pointers using a simple integer or a bare void *---type tags are needed to implement correct handling of pointer values (and to make adjustments when needed).

    In the wrapper code generated for each language, pointers are handled through the use of special type descriptors and conversion functions. For example, if you look at the wrapper code for Python, you will see code similar to the following (simplified for brevity):

    if (!SWIG_IsOK(SWIG_ConvertPtr(obj0, (void **) &arg1, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method 'GrabVal', expecting type Foo");
    }
    

    In this code, SWIGTYPE_p_Foo is the type descriptor that describes Foo *. The type descriptor is actually a pointer to a structure that contains information about the type name to use in the target language, a list of equivalent typenames (via typedef or inheritance), and pointer value handling information (if applicable). The SWIG_ConvertPtr() function is simply a utility function that takes a pointer object in the target language and a type-descriptor object and uses this information to generate a C++ pointer. The SWIG_IsOK macro checks the return value for errors and SWIG_exception_fail can be called to raise an exception in the target language. However, the exact name and calling conventions of the conversion function depends on the target language (see language specific chapters for details).

    The actual type code is in swigrun.swg, and gets inserted near the top of the generated swig wrapper file. The phrase "a type X that can cast into a type Y" means that given a type X, it can be converted into a type Y. In other words, X is a derived class of Y or X is a typedef of Y. The structure to store type information looks like this:

    /* Structure to store information on one type */
    typedef struct swig_type_info {
      const char *name;             /* mangled name of this type */
      const char *str;              /* human readable name for this type */
      swig_dycast_func dcast;       /* dynamic cast function down a hierarchy */
      struct swig_cast_info *cast;  /* Linked list of types that can cast into this type */
      void *clientdata;             /* Language specific type data */
    } swig_type_info;
    
    /* Structure to store a type and conversion function used for casting */
    typedef struct swig_cast_info {
      swig_type_info *type;          /* pointer to type that is equivalent to this type */
      swig_converter_func converter; /* function to cast the void pointers */
      struct swig_cast_info *next;   /* pointer to next cast in linked list */
      struct swig_cast_info *prev;   /* pointer to the previous cast */
    } swig_cast_info;
    

    Each swig_type_info stores a linked list of types that it is equivalent to. Each entry in this doubly linked list stores a pointer back to another swig_type_info structure, along with a pointer to a conversion function. This conversion function is used to solve the above problem of the FooBar class, correctly returning a pointer to the type we want.

    The basic problem we need to solve is verifying and building arguments passed to functions. So going back to the SWIG_ConvertPtr() function example from above, we are expecting a Foo * and need to check if obj0 is in fact a Foo *. From before, SWIGTYPE_p_Foo is just a pointer to the swig_type_info structure describing Foo *. So we loop through the linked list of swig_cast_info structures attached to SWIGTYPE_p_Foo. If we see that the type of obj0 is in the linked list, we pass the object through the associated conversion function and then return a positive. If we reach the end of the linked list without a match, then obj0 can not be converted to a Foo * and an error is generated.

    Another issue needing to be addressed is sharing type information between multiple modules. More explicitly, we need to have ONE swig_type_info for each type. If two modules both use the type, the second module loaded must lookup and use the swig_type_info structure from the module already loaded. Because no dynamic memory is used and the circular dependencies of the casting information, loading the type information is somewhat tricky, and not explained here. A complete description is in the Lib/swiginit.swg file (and near the top of any generated file).

    Each module has one swig_module_info structure which looks like this:

    /* Structure used to store module information
     * Each module generates one structure like this, and the runtime collects
     * all of these structures and stores them in a circularly linked list.*/
    typedef struct swig_module_info {
      swig_type_info **types;         /* Array of pointers to swig_type_info structs in this module */
      int size;                       /* Number of types in this module */
      struct swig_module_info *next;  /* Pointer to next element in circularly linked list */
      swig_type_info **type_initial;  /* Array of initially generated type structures */
      swig_cast_info **cast_initial;  /* Array of initially generated casting structures */
      void *clientdata;               /* Language specific module data */
    } swig_module_info;
    

    Each module stores an array of pointers to swig_type_info structures and the number of types in this module. So when a second module is loaded, it finds the swig_module_info structure for the first module and searches the array of types. If any of its own types are in the first module and have already been loaded, it uses those swig_type_info structures rather than creating new ones. These swig_module_info structures are chained together in a circularly linked list.

    13.12.2 Usage

    This section covers how to use these functions from typemaps. To learn how to call these functions from external files (not the generated _wrap.c file), see the External access to the run-time system section.

    When pointers are converted in a typemap, the typemap code often looks similar to this:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    The most critical part is the typemap is the use of the $1_descriptor special variable. When placed in a typemap, this is expanded into the SWIGTYPE_* type descriptor object above. As a general rule, you should always use $1_descriptor instead of trying to hard-code the type descriptor name directly.

    There is another reason why you should always use the $1_descriptor variable. When this special variable is expanded, SWIG marks the corresponding type as "in use." When type-tables and type information is emitted in the wrapper file, descriptor information is only generated for those datatypes that were actually used in the interface. This greatly reduces the size of the type tables and improves efficiency.

    Occasionally, you might need to write a typemap that needs to convert pointers of other types. To handle this, the special variable macro $descriptor(type) covered earlier can be used to generate the SWIG type descriptor name for any C datatype. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        Bar *temp;
        if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &temp, $descriptor(Bar *), 0))) {
          SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo or Bar");
        }
        $1 = (Foo *)temp;
      }
    }
    

    The primary use of $descriptor(type) is when writing typemaps for container objects and other complex data structures. There are some restrictions on the argument---namely it must be a fully defined C datatype. It can not be any of the special typemap variables.

    In certain cases, SWIG may not generate type-descriptors like you expect. For example, if you are converting pointers in some non-standard way or working with an unusual combination of interface files and modules, you may find that SWIG omits information for a specific type descriptor. To fix this, you may need to use the %types directive. For example:

    %types(int *, short *, long *, float *, double *);
    

    When %types is used, SWIG generates type-descriptor information even if those datatypes never appear elsewhere in the interface file.

    Further details about the run-time type checking can be found in the documentation for individual language modules. Reading the source code may also help. The file Lib/swigrun.swg in the SWIG library contains all of the source of the generated code for type-checking. This code is also included in every generated wrapped file so you probably just look at the output of SWIG to get a better sense for how types are managed.

    13.13 Typemaps and overloading

    This section does not apply to the statically typed languages like Java and C#, where overloading of the types is handled much like C++ by generating overloaded methods in the target language. In many of the other target languages, SWIG still fully supports C++ overloaded methods and functions. For example, if you have a collection of functions like this:

    int foo(int x);
    int foo(double x);
    int foo(char *s, int y);
    

    You can access the functions in a normal way from the scripting interpreter:

    # Python
    foo(3)           # foo(int)
    foo(3.5)         # foo(double)
    foo("hello", 5)  # foo(char *, int)
    
    # Tcl
    foo 3            # foo(int)
    foo 3.5          # foo(double)
    foo hello 5      # foo(char *, int)
    

    To implement overloading, SWIG generates a separate wrapper function for each overloaded method. For example, the above functions would produce something roughly like this:

    // wrapper pseudocode
    _wrap_foo_0(argc, args[]) {       // foo(int)
      int arg1;
      int result;
      ...
      arg1 = FromInteger(args[0]);
      result = foo(arg1);
      return ToInteger(result);
    }
    
    _wrap_foo_1(argc, args[]) {       // foo(double)
      double arg1;
      int result;
      ...
      arg1 = FromDouble(args[0]);
      result = foo(arg1);
      return ToInteger(result);
    }
    
    _wrap_foo_2(argc, args[]) {       // foo(char *, int)
      char *arg1;
      int   arg2;
      int result;
      ...
      arg1 = FromString(args[0]);
      arg2 = FromInteger(args[1]);
      result = foo(arg1, arg2);
      return ToInteger(result);
    }
    
    

    Next, a dynamic dispatch function is generated:

    _wrap_foo(argc, args[]) {
      if (argc == 1) {
        if (IsInteger(args[0])) {
          return _wrap_foo_0(argc, args);
        }
        if (IsDouble(args[0])) {
          return _wrap_foo_1(argc, args);
        }
      }
      if (argc == 2) {
        if (IsString(args[0]) && IsInteger(args[1])) {
          return _wrap_foo_2(argc, args);
        }
      }
      error("No matching function!\n");
    }
    

    The purpose of the dynamic dispatch function is to select the appropriate C++ function based on argument types---a task that must be performed at runtime in most of SWIG's target languages.

    The generation of the dynamic dispatch function is a relatively tricky affair. Not only must input typemaps be taken into account (these typemaps can radically change the types of arguments accepted), but overloaded methods must also be sorted and checked in a very specific order to resolve potential ambiguity. A high-level overview of this ranking process is found in the "SWIG and C++" chapter. What isn't mentioned in that chapter is the mechanism by which it is implemented---as a collection of typemaps.

    To support dynamic dispatch, SWIG first defines a general purpose type hierarchy as follows:

    Symbolic Name                   Precedence Value
    ------------------------------  ------------------
    SWIG_TYPECHECK_POINTER           0
    SWIG_TYPECHECK_ITERATOR          5
    SWIG_TYPECHECK_VOIDPTR           10
    SWIG_TYPECHECK_BOOL              15
    SWIG_TYPECHECK_UINT8             20
    SWIG_TYPECHECK_INT8              25
    SWIG_TYPECHECK_UINT16            30
    SWIG_TYPECHECK_INT16             35
    SWIG_TYPECHECK_UINT32            40
    SWIG_TYPECHECK_INT32             45
    SWIG_TYPECHECK_SIZE              47
    SWIG_TYPECHECK_PTRDIFF           48
    SWIG_TYPECHECK_UINT64            50
    SWIG_TYPECHECK_INT64             55
    SWIG_TYPECHECK_UINT128           60
    SWIG_TYPECHECK_INT128            65
    SWIG_TYPECHECK_INTEGER           70
    SWIG_TYPECHECK_FLOAT             80
    SWIG_TYPECHECK_DOUBLE            90
    SWIG_TYPECHECK_CPLXFLT           95
    SWIG_TYPECHECK_CPLXDBL           100
    SWIG_TYPECHECK_COMPLEX           105
    SWIG_TYPECHECK_UNICHAR           110
    SWIG_TYPECHECK_STDUNISTRING      115
    SWIG_TYPECHECK_UNISTRING         120
    SWIG_TYPECHECK_CHAR              130
    SWIG_TYPECHECK_STDSTRING         135
    SWIG_TYPECHECK_STRING            140
    SWIG_TYPECHECK_PAIR              150
    SWIG_TYPECHECK_STDARRAY          155
    SWIG_TYPECHECK_VECTOR            160
    SWIG_TYPECHECK_DEQUE             170
    SWIG_TYPECHECK_LIST              180
    SWIG_TYPECHECK_SET               190
    SWIG_TYPECHECK_MULTISET          200
    SWIG_TYPECHECK_MAP               210
    SWIG_TYPECHECK_MULTIMAP          220
    SWIG_TYPECHECK_STACK             230
    SWIG_TYPECHECK_QUEUE             240
    SWIG_TYPECHECK_BOOL_ARRAY        1015
    SWIG_TYPECHECK_INT8_ARRAY        1025
    SWIG_TYPECHECK_INT16_ARRAY       1035
    SWIG_TYPECHECK_INT32_ARRAY       1045
    SWIG_TYPECHECK_INT64_ARRAY       1055
    SWIG_TYPECHECK_INT128_ARRAY      1065
    SWIG_TYPECHECK_FLOAT_ARRAY       1080
    SWIG_TYPECHECK_DOUBLE_ARRAY      1090
    SWIG_TYPECHECK_CHAR_ARRAY        1130
    SWIG_TYPECHECK_STRING_ARRAY      1140
    SWIG_TYPECHECK_OBJECT_ARRAY      1150
    SWIG_TYPECHECK_BOOL_PTR          2015
    SWIG_TYPECHECK_UINT8_PTR         2020
    SWIG_TYPECHECK_INT8_PTR          2025
    SWIG_TYPECHECK_UINT16_PTR        2030
    SWIG_TYPECHECK_INT16_PTR         2035
    SWIG_TYPECHECK_UINT32_PTR        2040
    SWIG_TYPECHECK_INT32_PTR         2045
    SWIG_TYPECHECK_UINT64_PTR        2050
    SWIG_TYPECHECK_INT64_PTR         2055
    SWIG_TYPECHECK_FLOAT_PTR         2080
    SWIG_TYPECHECK_DOUBLE_PTR        2090
    SWIG_TYPECHECK_CHAR_PTR          2130
    SWIG_TYPECHECK_SWIGOBJECT        5000
    

    (These precedence levels are defined in swig.swg, a library file that's included by all target language modules.)

    In this table, the precedence-level determines the order in which types are going to be checked. Low values are always checked before higher values. For example, integers are checked before floats, single values are checked before arrays, and so forth.

    Using the above table as a guide, each target language defines a collection of "typecheck" typemaps. The following excerpt from the Python module illustrates this:

    /* Python type checking rules */
    /* Note:  %typecheck(X) is a macro for %typemap(typecheck, precedence=X) */
    
    %typecheck(SWIG_TYPECHECK_INTEGER)
      int, short, long,
      unsigned int, unsigned short, unsigned long,
      signed char, unsigned char,
      long long, unsigned long long,
      const int &, const short &, const long &,
      const unsigned int &, const unsigned short &, const unsigned long &,
      const long long &, const unsigned long long &,
      enum SWIGTYPE,
      bool, const bool &
    {
      $1 = (PyInt_Check($input) || PyLong_Check($input)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_DOUBLE)
      float, double,
      const float &, const double &
    {
      $1 = (PyFloat_Check($input) || PyInt_Check($input) || PyLong_Check($input)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_CHAR) char {
      $1 = (PyString_Check($input) && (PyString_Size($input) == 1)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_STRING) char * {
      $1 = PyString_Check($input) ? 1 : 0;
    }
    
    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, noblock=1) SWIGTYPE * {
      void *vptr = 0;
      int res = SWIG_ConvertPtr($input, &vptr, $1_descriptor, 0);
      $1 = SWIG_IsOK(res) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_POINTER) PyObject * {
      $1 = ($input != 0);
    }
    

    It might take a bit of contemplation, but this code has merely organized all of the basic C++ types, provided some simple type-checking code, and assigned each type a precedence value.

    Finally, to generate the dynamic dispatch function, SWIG uses the following algorithm:

    • Overloaded methods are first sorted by the number of required arguments.
    • Methods with the same number of arguments are then sorted by precedence values of argument types.
    • Typecheck typemaps are then emitted to produce a dispatch function that checks arguments in the correct order.

    If you haven't written any typemaps of your own, it is unnecessary to worry about the typechecking rules. However, if you have written new input typemaps, you might have to supply a typechecking rule as well. An easy way to do this is to simply copy one of the existing typechecking rules. Here is an example,

    // Typemap for a C++ string
    %typemap(in) std::string {
      if (PyString_Check($input)) {
        $1 = std::string(PyString_AsString($input));
      } else {
        SWIG_exception(SWIG_TypeError, "string expected");
      }
    }
    // Copy the typecheck code for "char *".  
    %typemap(typecheck) std::string = char *;
    

    The bottom line: If you are writing new typemaps and you are using overloaded methods, you will probably have to write new typecheck code or copy and modify existing typecheck code.

    If you write a typecheck typemap and omit the precedence level, for example commenting it out as shown below:

    %typemap(typecheck /*, precedence=SWIG_TYPECHECK_INTEGER*/) int {
      $1 = PyInt_Check($input) ? 1 : 0;
    }
    

    then the type is given a precedence higher than any other known precedence level and a warning is issued:

    example.i:18: Warning 467: Overloaded method foo(int) not supported (incomplete type
    checking rule - no precedence level in typecheck typemap for 'int').
    

    Notes:

    • Typecheck typemaps are not used for non-overloaded methods. Because of this, it is still always necessary to check types in any "in" typemaps.
    • The dynamic dispatch process is only meant to be a heuristic. There are many corner cases where SWIG simply can't disambiguate types to the same degree as C++. The only way to resolve this ambiguity is to use the %rename directive to rename one of the overloaded methods (effectively eliminating overloading).
    • Typechecking may be partial. For example, if working with arrays, the typecheck code might simply check the type of the first array element and use that to dispatch to the correct function. Subsequent "in" typemaps would then perform more extensive type-checking.
    • Make sure you read the section on overloading in the SWIG and C++ chapter.

    13.13.1 SWIG_TYPECHECK_POINTER precedence level and the typecheck typemap

    When it comes to overloading of a particular type passed by value, pointer or reference (const and non-const), a C++ compiler can disambiguate which overloaded function to call. However, SWIG effectively treats these as pointers in the target language and thus as equivalent types. For example, consider:

    class X { ... };
    void m(X const &c); // equivalent: void m(X *c);
    void m(X &r);       // equivalent: void m(X *r);
    void m(X *p);       // equivalent: void m(X *p);
    

    These cannot be disambiguated in the target languages and so SWIG will choose the first method and ignore the subsequent two methods. The scripting languages do this by using the overload dispatch mechanism described earlier and warnings indicate this:

    example.i:6: Warning 509: Overloaded method m(X &) effectively ignored,
    example.i:5: Warning 509: as it is shadowed by m(X const &).
    example.i:7: Warning 509: Overloaded method m(X *) effectively ignored,
    example.i:5: Warning 509: as it is shadowed by m(X const &).
    

    The statically typed languages like Java and C# automatically ignore all but the first equivalent overloaded methods with warnings:

    example.i:6: Warning 516: Overloaded method m(X &) ignored,
    example.i:5: Warning 516: using m(X const &) instead.
    example.i:7: Warning 516: Overloaded method m(X *) ignored,
    example.i:5: Warning 516: using m(X const &) instead.
    

    You can select the overloaded method you would like to wrap by ignoring the other two with %ignore or rename two of them with %rename and this will of course remove the warnings too. The problem of ambiguity is also discussed in the C++ chapter on overloading.

    So how does this work with respect to typemaps? The typemaps SWIG provides to handle overloading for these three methods are from the SWIGTYPE family. As discussed earlier, in Default typemap matching rules, the SWIGTYPE & typemaps are used for references and SWIGTYPE * typemaps are used for pointers. SWIG uses the special SWIG_TYPECHECK_POINTER (0) precedence level to handle these types in the "typecheck" typemap:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) SWIGTYPE & "..."
    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) SWIGTYPE * "..."
    

    When the SWIGTYPE "typecheck" typemaps use the SWIG_TYPECHECK_POINTER precedence level, SWIG converts the type to a pointer equivalent type and then uses the equivalent type to detect if it can be disambiguated in an overloaded method in the target language. In our example above, the equivalent types for X const &, X & and X * are all X *. As they are the same, they cannot be disambiguated and so just the first overloaded method is chosen.

    The automatic conversion to equivalent types and subsequent type comparison is triggered via the use of the special SWIG_TYPECHECK_POINTER precedence level and works for types passed by value, pointer and reference. Alas, there are more ways to overload a method that also need handling. C++ smart pointers are such a type which can be disambiguated by a C++ compiler but not automatically by SWIG. SWIG does not automatically know that a smart pointer has an equivalent type, but it can be told manually. Just specify the 'equivalent' attribute in the "typecheck" typemap with a pointer to the underlying type.

    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="X *") MySmartPtr<X> " ... "
    
    void m(X &r);            // equivalent: void m(X *r);
    void m(MySmartPtr<X> s); // equivalent: void m(X *s);
    

    Now SWIG will detect the two types are equivalent and generate valid code by wrapping just the first overloaded method. You can of course choose which method to wrap by ignoring one of them with %ignore. Otherwise both can be wrapped by removing the overloading name ambiguity by renaming one of them with %rename.

    The 'equivalent' attribute is used in the implementation for the shared_ptr smart pointer library.

    13.14 More about %apply and %clear

    In order to implement certain kinds of program behavior, it is sometimes necessary to write a family of typemap methods. For example, to support output arguments, one often writes a family of typemaps like this:

    %typemap(in, numinputs=0) int *OUTPUT (int temp) {
      $1 = &temp;
    }
    %typemap(argout) int *OUTPUT {
      // return value somehow
    }
    

    To make it easier to apply the typemap to different argument types and names, the %apply directive performs a copy of all typemaps from a source type to one or more set of target types. For example, if you specify this,

    %apply int *OUTPUT { int *retvalue, int32 *output };
    

    then all of the int *OUTPUT (source) typemap methods are copied to int *retvalue and int32 *output (the targets).

    However, there is a subtle aspect of %apply that needs clarification. Namely, if a target contains a typemap method that the source does not, the target typemap method remains in place and unchanged. This behavior allows you to do two things:

    • You can specialize parts of a complex typemap rule by first defining a few typemaps and then using %apply to incorporate the remaining pieces.
    • Different typemaps can be applied to the same datatype using repeated %apply directives.

    For example:

    %typemap(in) int *INPUT (int temp) {
      temp = ... get value from $input ...;
      $1 = &temp;
    }
    
    %typemap(check) int *POSITIVE {
      if (*$1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected a positive number!\n");
        return NULL;
      }
    }
    
    %typemap(arginit) int *invalue %{
      $1 = NULL;
    %}
    
    ...
    %apply int *INPUT     { int *invalue };
    %apply int *POSITIVE  { int *invalue };
    

    In this example, neither of the two %apply directives will overwrite / delete the "arginit" typemap as neither has an "arginit" typemap. The result is a family of three relevant typemaps for int *invalue. Since %apply does not overwrite / delete any existing rules, the only way to reset behavior is to delete them, such as with the %clear directive. For example:

    %clear int *invalue;
    

    will delete the typemaps for all the typemap methods; namely "in", "check" and "arginit". Alternatively delete each one individually:

    %typemap(in) int *invalue;
    %typemap(check) int *invalue;
    %typemap(arginit) int *invalue;
    

    13.15 Passing data between typemaps

    It is also important to note that the primary use of local variables is to create stack-allocated objects for temporary use inside a wrapper function (this is faster and less-prone to error than allocating data on the heap). In general, the variables are not intended to pass information between different types of typemaps. However, this can be done if you realize that local names have the argument number appended to them. For example, you could do this:

    %typemap(in) int *(int temp) {
      temp = (int) PyInt_AsLong($input);
      $1 = &temp;
    }
    
    %typemap(argout) int * {
      PyObject *o = PyInt_FromLong(temp$argnum);
      ...
    }
    

    In this case, the $argnum variable is expanded into the argument number. Therefore, the code will reference the appropriate local such as temp1 and temp2. It should be noted that there are plenty of opportunities to break the universe here and that accessing locals in this manner should probably be avoided. At the very least, you should make sure that the typemaps sharing information have exactly the same types and names.

    13.16 C++ "this" pointer

    All the rules discussed for typemaps apply to C++ as well as C. However in addition C++ passes an extra parameter into every non-static class method -- the this pointer. Occasionally it can be useful to apply a typemap to this pointer (for example to check and make sure this is non-null before deferencing). Actually, C also has an the equivalent of the this pointer which is used when accessing variables in a C struct.

    In order to customise the this pointer handling, target a variable named self in your typemaps. self is the name SWIG uses to refer to the extra parameter in wrapped functions.

    For example, if wrapping for Java generation:

    %typemap(check) SWIGTYPE *self %{
    if (!$1) {
      SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException,
        "invalid native object; delete() likely already called");
      return $null;
    }
    %}
    

    In the above case, the $1 variable is expanded into the argument name that SWIG is using as the this pointer. SWIG will then insert the check code before the actual C++ class method is called, and will raise an exception rather than crash the Java virtual machine. The generated code will look something like:

      if (!arg1) {
        SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException,
          "invalid native object; delete() likely already called");
        return ;
      }
      (arg1)->wrappedFunction(...);
    

    Note that if you have a parameter named self then it will also match the typemap. One work around is to create an interface file that wraps the method, but gives the argument a name other than self.

    13.17 Where to go for more information?

    The best place to find out more information about writing typemaps is to look in the SWIG library. Most language modules define all of their default behavior using typemaps. These are found in files such as python.swg, perl5.swg, tcl8.swg and so forth. The typemaps.i file in the library also contains numerous examples. You should look at these files to get a feel for how to define typemaps of your own. Some of the language modules support additional typemaps and further information is available in the individual chapters for each target language. There you may also find more hands-on practical examples.

    swig-4.0.2/Doc/Manual/Allegrocl.html0000644000175000017500000021100713667507523017077 0ustar williamwilliam SWIG and Allegro Common Lisp

    20 SWIG and Allegro Common Lisp

    This chapter describes SWIG's support of Allegro Common Lisp. Allegro CL is a full-featured implementation of the Common Lisp language standard that includes many vendor-specific enhancements and add-on modules for increased usability.

    One such module included in Allegro CL is the Foreign Functions Interface (FFI). This module, tailored primarily toward interfacing with C/C++ and, historically, Fortran, provides a means by which compiled foreign code can be loaded into a running lisp environment and executed. The interface supports the calling of foreign functions and methods, allows for executing lisp routines from foreign code (callbacks), and the passing of data between foreign and lisp code.

    The goal of this module is to make it possible to quickly generate the necessary foreign function definitions so one can make use of C/C++ foreign libraries directly from lisp without the tedium of having to code them by hand. When necessary, it will also generate further C/C++ code that will need to be linked with the intended library for proper interfacing from lisp. It has been designed with an eye toward flexibility. Some foreign function calls may release the heap, while other should not. Some foreign functions should automatically convert lisp strings into native strings, while others should not. These adjustments and many more are possible with the current module.

    It is significant to note that, while this is a vendor-specific module, we would like to acknowledge the current and ongoing work by developers in the open source lisp community that are working on similar interfaces to implementation-independent foreign function interfaces (CFFI, for example). Such work can only benefit the lisp community, and we would not be unhappy to see some enterprising folk use this work to add to it.

    20.1 Basics

    20.1.1 Running SWIG

    If you're reading this, you must have some library you need to generate an interface for. In order for SWIG to do this work, however, it needs a bit of information about how it should go about creating your interface, and what you are interfacing to.

    SWIG expects a description of what in the foreign interface you wish to connect to. It must consisting of C/C++ declarations and special SWIG directives. SWIG can be furnished with a header file, but an interface can also be generated without library headers by supplying a simple text file--called the interface file, which is typically named with a .i extension--containing any foreign declarations of identifiers you wish to use. The most common approach is to use an interface file with directives to parse the needed headers. A straight parse of library headers will result in usable code, but SWIG directives provides much freedom in how a user might tailor the generated code to their needs or style of coding.

    Note that SWIG does not require any function definitions; the declarations of those functions is all that is necessary. Be careful when tuning the interface as it is quite possible to generate code that will not load or compile.

    An example interface file is shown below. It makes use of two SWIG directives, one of which requests that the declarations in a header file be used to generate part of the interface, and also includes an additional declaration to be added.

    example.i
    %module example
    
    %include "header.h"
    
    int fact(int n);
    

    The contents of header.h are very simple:

    header.h
    int fact(char *statement);   // pass it a fact, and it will rate it.
    

    The contents of example.cl will look like this:

    example.cl
    (defpackage :example
      (:use :common-lisp :swig :ff :excl))
    
      ... helper routines for defining the interface ...
    
    (swig-in-package ())
    
    (swig-defun ("fact")
      ((PARM0_statement cl:string (* :char) ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_statement))
      (swig-ff-call SWIG_arg0)))
    
    (swig-defun ("fact")
      ((PARM0_n cl:integer :int ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_n))
      (swig-ff-call SWIG_arg0)))
    
    (swig-dispatcher ("fact" :type :function :arities (1)))
    

    The generated file contains calls to internal swig helper functions. In this case there are two calls to swig-defun. These calls will expand into code that will make the appropriate definitions using the Allegro FFI. Note also, that this code is erroneous. Function overloading is not supported in C, and this code will not compile even though SWIG did not complain.

    In order to generate a C interface to Allegro CL using this code run swig using the -allegrocl option, as below:

    % swig -allegrocl example.i
    

    When building an interface to C++ code, include the -c++ option:

    % swig -allegrocl -c++ example.i
    

    As a result of running one of the above commands, a file named example.cl will be generated containing the lisp side of the interface. As well, a file example_wrap.cxx is also generated, containing C/C++ wrapper code to facilitate access to C++ methods, enumeration values, and constant values. Wrapper functions are necessary in C++ due to the lack of a standard for mangling the names of symbols across all C++ compilers. These wrapper functions are exported from the shared library as appropriate, using the C name mangling convention. The lisp code that is generated will interface to your foreign library through these wrappers.

    It is possible to disable the creation of the .cxx file when generating a C interface by using the -nocwrap command-line argument. For interfaces that don't contain complex enum or constant expressions, contain nested struct/union declarations, or doesn't need to use many of the SWIG customization featuers, this will result in a more streamlined, direct interface to the intended module.

    The generated wrapper file is below. It contains very simple wrappers by default, that simply pass the arguments to the actual function.

    example_wrap.i
      ... lots of SWIG internals ...
    
    EXPORT int ACL___fact__SWIG_0 (char *larg1) {
      int lresult = (int)0 ;
      char *arg1 = (char *) 0 ;
      int result;
    
      arg1 = larg1;
      try {
        result = (int)fact(arg1);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (int)0;
      }
    }
    
    
    EXPORT int ACL___fact__SWIG_1 (int larg1) {
      int lresult = (int)0 ;
      int arg1 ;
      int result;
    
      arg1 = larg1;
      try {
        result = (int)fact(arg1);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (int)0;
      }
    }
    

    And again, the generated lisp code. Note that it differs from what is generated when parsing C code:

      ...
    
    (swig-in-package ())
    
    (swig-defmethod ("fact" "ACL___fact__SWIG_0" :type :function :arity 1)
      ((PARM0_statement cl:string (* :char) ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_statement))
      (swig-ff-call SWIG_arg0)))
    
    (swig-defmethod ("fact" "ACL___fact__SWIG_1" :type :function :arity 1)
      ((PARM0_n cl:integer :int ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_n))
      (swig-ff-call SWIG_arg0)))
    
    (swig-dispatcher ("fact" :type :function :arities (1)))
    

    In this case, the interface generates two swig-defmethod forms and a swig-dispatcher form. This provides a single functional interface for all overloaded routines. A more detailed description of this features is to be found in the section titled Function overloading/Parameter defaulting.

    In order to load a C++ interface, you will need to build a shared library from example_wrap.cxx. Be sure to link in the actual library you created the interface for, as well as any other dependent shared libraries. For example, if you intend to be able to call back into lisp, you will also need to link in the Allegro shared library. The library you create from the C++ wrapper will be what you then load into Allegro CL.

    20.1.2 Command Line Options

    There are three Allegro CL specific command-line option:

    swig -allegrocl [ options ] filename
    
       -identifier-converter [name] - Binds the variable swig:*swig-identifier-convert* 
                                      in the generated .cl file to name.
                                      This function is used to generate symbols
                                      for the lisp side of the interface.
    
       -cwrap - [default] Generate a .cxx file containing C wrapper function when
                wrapping C code. The interface generated is similar to what is
                done for C++ code.
       -nocwrap - Explicitly turn off generation of .cxx wrappers for C code. Reasonable
                  for modules with simple interfaces. Can not handle all legal enum
                  and constant constructs, or take advantage of SWIG customization features.
    
       -isolate - With this command-line argument, all lisp helper functions are defined
                  in a unique package named swig.<module-name> rather than
                  swig. This prevents conflicts when the module is
                  intended to be used with other swig generated interfaces that may,
                  for instance, make use of different identifier converters.
    

    See Section 17.5 Identifier converter functions for more details.

    20.1.3 Inserting user code into generated files

    It is often necessary to include user-defined code into the automatically generated interface files. For example, when building a C++ interface, example_wrap.cxx will likely not compile unless you add a #include "header.h" directive. This can be done using the SWIG %insert(section) %{ ...code... %} directive:

    %module example
    
    %{
    #include "header.h"
    %}
    
    %include "header.h"
    
    int fact(int n);
    

    Additional sections have been added for inserting into the generated lisp interface file

    • lisphead - inserts before type declarations
    • lisp - inserts after type declarations according to where it appears in the .i file

    Note that the block %{ ... %} is effectively a shortcut for %insert("header") %{ ... %}.

    20.2 Wrapping Overview

    New users to SWIG are encouraged to read SWIG Basics, and SWIG and C++, for those interested in generating an interface to C++.

    20.2.1 Function Wrapping

    Writing lisp code that directly invokes functions at the foreign function interface level can be cumbersome. Data must often be translated between lisp and foreign types, data extracted from objects, foreign objects allocated and freed upon completion of the foreign call. Dealing with pointers can be unwieldy when it comes to keeping them distinct from other valid integer values.

    We make an attempt to ease some of these burdens by making the interface to foreign code much more lisp-like, rather than C like. How this is done is described in later chapters. The layers themselves, appear as follows:

            ______________
           |              |  (foreign side)
           | Foreign Code |  What we're generating an interface to.
           |______________|
                   |
                   |
            _______v______
           |              |  (foreign side)
           | Wrapper code |  extern "C" wrappers calling C++ 
           |______________|  functions and methods.
                   |
        .  . . - - + - - . .  .
            _______v______
           |              |  (lisp side)
           |  FFI Layer   |  Low level lisp interface. ff:def-foreign-call,
           |______________|  ff:def-foreign-variable
                   |
                   +----------------------------
            _______v______              _______v______
           |              |            |              | (lisp side)    
           |    Defuns    |            |  Defmethods  | wrapper for overloaded
           |______________|            |______________| functions or those with
            (lisp side)                        |        defaulted arguments
            Wrapper for non-overloaded         |
            functions and methods       _______v______
                                       |              | (lisp side)
                                       |    Defuns    | dispatch function
                                       |______________| to overloads based
                                                        on arity
      

    20.2.2 Foreign Wrappers

    These wrappers are as generated by SWIG default. The types of function parameters can be transformed in place using the CTYPE typemap. This is use for converting pass-by-value parameters to pass-by-reference where necessary. All wrapper parameters are then bound to local variables for possible transformation of values (see LIN typemap). Return values can be transformed via the OUT typemap.

    20.2.3 FFI Wrappers

    These are the generated ff:def-foreign-call forms. No typemaps are applicable to this layer, but the %ffargs directive is available for use in .i files, to specify which keyword arguments should be specified for a given function.

    ffargs.i:
    %module ffargs
    
    %ffargs(strings_convert="nil", call_direct="t") foo;
    %ffargs(strings_convert="nil", release_heap=":never", optimize_for_space="t") bar;
    
    int foo(float f1, float f2);
    int foo(float f1, char c2);
    
    void bar(void *lisp_fn);
    
    char *xxx();
      

    Generates:

    ffargs.cl:
    (swig-in-package ())
    
    (swig-defmethod ("foo" "ACL___foo__SWIG_0" :type :function :arity 2)
      ((PARM0_f1 cl:single-float :float )
       (PARM1_f2 cl:single-float :float ))
      (:returning (:int )
       :call-direct t
       :strings-convert nil)
      (let ((SWIG_arg0 PARM0_f1))
      (let ((SWIG_arg1 PARM1_f2))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-defmethod ("foo" "ACL___foo__SWIG_1" :type :function :arity 2)
      ((PARM0_f1 cl:single-float :float )
       (PARM1_c2 cl:character :char character))
      (:returning (:int )
       :call-direct t
       :strings-convert nil)
      (let ((SWIG_arg0 PARM0_f1))
      (let ((SWIG_arg1 PARM1_c2))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-dispatcher ("foo" :type :function :arities (2)))
    (swig-defun ("bar" "ACL___bar__SWIG_0" :type :function)
      ((PARM0_lisp_fn  (* :void) ))
      (:returning (:void )
       :release-heap :never
       :optimize-for-space t
       :strings-convert nil)
      (let ((SWIG_arg0 PARM0_lisp_fn))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("xxx" "ACL___xxx__SWIG_0" :type :function)
      (:void)
      (:returning ((* :char) )
       :strings-convert t)
      (swig-ff-call))
      
    %ffargs(strings_convert="t");

    Is the only default value specified in allegrocl.swg to force the muffling of warnings about automatic string conversion when defining ff:def-foreign-call's.

    20.2.4 Non-overloaded Defuns

    These are simple defuns. There is no typechecking of arguments. Parameters are bound to local variables for possible transformation of values, such as pulling values out of instance slots or allocating temporary stack allocated structures, via the lin typemap. These arguments are then passed to the foreign-call (where typechecking may occur). The return value from this function can be manipulated via the lout typemap.

    20.2.5 Overloaded Defuns

    In the case of overloaded functions, multiple layers are generated. First, all the overloads for a given name are separated out into groups based on arity, and are wrapped in defmethods. Each method calls a distinct wrapper function, but are themselves distinguished by the types of their arguments (see lispclass typemap). These are further wrapped in a dispatching function (defun) which will invoke the appropriate generic-function based on arity. This provides a single functional interface to all overloads. The return value from this function can be manipulated via the lout typemap.

    20.2.6 What about constant and variable access?

    Along with the described functional layering, when creating a .cxx wrapper, this module will generate getter and--if not immutable--setter, functions for variables and constants. If the -nocwrap option is used, defconstant and ff:def-foreign-variable forms will be generated for accessing constants and global variables. These, along with the defuns listed above are the intended API for calling into the foreign module.

    20.2.7 Object Wrapping

    All non-primitive types (Classes, structs, unions, and typedefs involving same) have a corresponding foreign-type defined on the lisp side via ff:def-foreign-type.

    All non-primitive types are further represented by a CLOS class, created via defclass. An attempt is made to create the same class hierarchy, with all classes inheriting directly or indirectly from ff:foreign-pointer. Further, wherever it is apparent, all pointers returned from foreign code are wrapped in a CLOS instance of the appropriate class. For ff:def-foreign-calls that have been defined to expect a :foreign-address type as argument, these CLOS instances can legally be passed and the pointer to the C++ object automatically extracted. This is a natural feature of Allegro's foreign function interface.

    20.3 Wrapping Details

    In this section is described how particular C/C++ constructs are translated into lisp.

    20.3.1 Namespaces

    C++ namespaces are translated into Lisp packages by SWIG. The Global namespace is mapped to a package named by the %module directive or the -module command-line argument. Further namespaces are generated by the swig-defpackage utility function and given names based on Allegro CLs nested namespace convention. For example:

    foo.i:
    %module foo
    
    %{
    #include "foo.h"
    %}
    
    %include "foo.h"
    
    namespace car {
      ...
      namespace tires {
        int do_something(int n);
      }
    }
        

    Generates the following code.

    foo.cl
    (defpackage :foo
      (:use :common-lisp :swig :ff :excl))
    
    ...
    
    (swig-defpackage ("car"))
    (swig-defpackage ("car" "tires"))
    
    ...
    
    (swig-in-package ("car" "tires"))
    (swig-defun ("do_something" "ACL_car_tires__do_something__SWIG_0" :type :function)
      ((PARM0_n  :int ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_n))
      (swig-ff-call SWIG_arg0)))
        

    The above interface file would cause packages foo, foo.car, and foo.car.tires to be created. One would find the function wrapper for do_something defined in the foo.car.tires package(*).

    (*) Except for the package named by the module, all namespace names are passed to the identifier-converter-function as strings with a :type of :namespace. It is the job of this function to generate the desired symbol, accounting for case preferences, additional naming cues, etc.

    Note that packages created by swig-defpackage do not use the COMMON-LISP or EXCL package. This reduces possible conflicts when defining foreign types via the SWIG interface in all but the toplevel modules package. This may lead to confusion if, for example, the current package is foo.car.tires and you attempt to use a common-lisp function such as (car '(1 2 3).

    20.3.2 Constants

    Constants, as declared by the preprocessor #define macro or SWIG %constant directive, are included in SWIG's parse tree when it can be determined that they are, or could be reduced to, a literal value. Such values are translated into defconstant forms in the generated lisp wrapper when the -nocwrap command-line options is used. Else, wrapper functions are generated as in the case of variable access (see section below).

    Here are examples of simple preprocessor constants when using -nocwrap.

    #define A 1                    => (swig-defconstant "A" 1)  
    #define B 'c'                  => (swig-defconstant "B" #\c)
    #define C B                    => (swig-defconstant "C" #\c)
    #define D 1.0e2                => (swig-defconstant "D" 1.0d2)
    #define E 2222                 => (swig-defconstant "E" 2222)
    #define F (unsigned int)2222   => no code generated
    #define G 1.02e2f              => (swig-defconstant "G" 1.02f2)
    #define H foo                  => no code generated
          

    Note that where SWIG is unable to determine if a constant is a literal, no node is added to the SWIG parse tree, and so no values can be generated.

    For preprocessor constants containing expressions which can be reduced to literal values, nodes are created, but with no simplification of the constant value. A very very simple infix to prefix converter has been implemented that tries to do the right thing for simple cases, but does not for more complex expressions. If the literal parser determines that something is wrong, a warning will be generated and the literal expression will be included in the generated code, but commented out.

    #define I A + E                => (swig-defconstant "I" (+ 1 2222))
    #define J 1|2                  => (swig-defconstant "J" (logior 1 2))
    #define Y 1 + 2 * 3 + 4        => (swig-defconstant "Y" (* (+ 1 2) (+ 3 4)))
    #define Y1 (1 + 2) * (3 + 4)   => (swig-defconstant "Y1" (* (+ 1 2) (+ 3 4)))
    #define Y2 1 * 2 + 3 * 4       => (swig-defconstant "Y2" (* 1 (+ 2 3) 4))  ;; WRONG
    #define Y3 (1 * 2) + (3 * 4)   => (swig-defconstant "Y3" (* 1 (+ 2 3) 4))  ;; WRONG
    #define Z 1 + 2 - 3 + 4 * 5    => (swig-defconstant "Z" (* (+ 1 (- 2 3) 4) 5)) ;; WRONG
          

    Users are cautioned to get to know their constants before use, or not use the -nocwrap command-line option.

    20.3.3 Variables

    For C wrapping, a def-foreign-variable call is generated for access to global variables.

    When wrapping C++ code, both global and member variables, getter wrappers are generated for accessing their value, and if not immutable, setter wrappers as well. In the example below, note the lack of a setter wrapper for global_var, defined as const.

    vars.h
    namespace nnn {
      int const global_var = 2;
      float glob_float = 2.0;
    }
        

    Generated code:

    vars.cl
    (swig-in-package ("nnn"))
    (swig-defun ("global_var" "ACL_nnn__global_var_get__SWIG_0" :type :getter)
      (:void)
      (:returning (:int )
       :strings-convert t)
      (swig-ff-call))
    
    
    (swig-defun ("glob_float" "ACL_nnn__glob_float_set__SWIG_0" :type :setter)
      ((PARM0_glob_float  :float ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_glob_float))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("glob_float" "ACL_nnn__glob_float_get__SWIG_0" :type :getter)
      (:void)
      (:returning (:float )
       :strings-convert t)
      (swig-ff-call))
        

    Note also, that where applicable, setter wrappers are implemented as setf methods on the getter function, providing a lispy interface to the foreign code.

    user> (load "globalvar.dll")
    ; Foreign loading globalvar.dll.
    t
    user> (load "globalvar.cl")
    ; Loading c:\mikel\src\swig\test\globalvar.cl
    t
    user> 
    globalvar> (globalvar.nnn::global_var)
    2
    globalvar> (globalvar.nnn::glob_float)
    2.0
    globalvar> (setf (globalvar.nnn::glob_float) 3.0)
    3.0
    globalvar> (globalvar.nnn::glob_float)
    3.0
        

    20.3.4 Enumerations

    In C, an enumeration value is an integer value, while in C++ an enumeration value is implicitly convertible to an integer value, but can also be distinguished by its enum type. For each enum declaration a def-foreign-type is generated, assigning the enum a default type of :int. Users may adjust the foreign type of enums via SWIG typemaps.

    Enum values are a bit trickier as they can be initialized using any valid C/C++ expression. In C with the -nocwrap command-line option, we handle the typical cases (simple integer initialization) and generate a defconstant form for each enum value. This has the advantage of it not being necessary to probe into foreign space to retrieve enum values. When generating a .cxx wrapper file, a more general solution is employed. A wrapper variable is created in the module_wrap.cxx file, and a ff:def-foreign-variable call is generated to retrieve its value into lisp.

    For example, the following header file

    enum.h:
    enum COL { RED, GREEN, BLUE };
    enum FOO { FOO1 = 10, FOO2, FOO3 };
          

    In -nocwrap mode, generates

    enum.cl:
    (swig-def-foreign-type "COL" :int)
    (swig-defconstant "RED" 0)
    (swig-defconstant "GREEN" (+ #.(swig-insert-id "RED" () :type :constant) 1))
    (swig-defconstant "BLUE" (+ #.(swig-insert-id "GREEN" () :type :constant) 1))
    
    (swig-def-foreign-type "FOO" :int)
    (swig-defconstant "FOO1" 10)
    (swig-defconstant "FOO2" (+ #.(swig-insert-id "FOO1" () :type :constant) 1))
    (swig-defconstant "FOO3" (+ #.(swig-insert-id "FOO2" () :type :constant) 1))
          

    And when generating a .cxx wrapper

    enum_wrap.cxx:
    EXPORT const int ACL_ENUM___RED__SWIG_0 = RED;
    EXPORT const int ACL_ENUM___GREEN__SWIG_0 = GREEN;
    EXPORT const int ACL_ENUM___BLUE__SWIG_0 = BLUE;
    EXPORT const int ACL_ENUM___FOO1__SWIG_0 = FOO1;
    EXPORT const int ACL_ENUM___FOO2__SWIG_0 = FOO2;
    EXPORT const int ACL_ENUM___FOO3__SWIG_0 = FOO3;
          

    and

    enum.cl:
    (swig-def-foreign-type "COL" :int)
    (swig-defvar "RED" "ACL_ENUM___RED__SWIG_0" :type :constant)
    (swig-defvar "GREEN" "ACL_ENUM___GREEN__SWIG_0" :type :constant)
    (swig-defvar "BLUE" "ACL_ENUM___BLUE__SWIG_0" :type :constant)
    
    (swig-def-foreign-type "FOO" :int)
    (swig-defvar "FOO1" "ACL_ENUM___FOO1__SWIG_0" :type :constant)
    (swig-defvar "FOO2" "ACL_ENUM___FOO2__SWIG_0" :type :constant)
    (swig-defvar "FOO3" "ACL_ENUM___FOO3__SWIG_0" :type :constant)
    
          

    20.3.5 Arrays

    One limitation in the Allegro CL foreign-types module, is that, without macrology, expressions may not be used to specify the dimensions of an array declaration. This is not a horrible drawback unless it is necessary to allocate foreign structures based on the array declaration using ff:allocate-fobject. When it can be determined that an array bound is a valid numeric value, SWIG will include this in the generated array declaration on the lisp side, otherwise the value will be included, but commented out.

    Below is a comprehensive example, showing a number of legal C/C++ array declarations and how they are translated into foreign-type specifications in the generated lisp code.

    array.h
    #define MAX_BUF_SIZE 1024
    
    namespace FOO {
      int global_var1[13];
      float global_var2[MAX_BUF_SIZE];
    
    }
    
    enum COLOR { RED = 10, GREEN = 20, BLUE, PURPLE = 50, CYAN };
    
    namespace BAR {
      char global_var3[MAX_BUF_SIZE + 1];
      float global_var4[MAX_BUF_SIZE][13];
      signed short global_var5[MAX_BUF_SIZE + MAX_BUF_SIZE];
    
      int enum_var5[GREEN];
      int enum_var6[CYAN];
    
      COLOR enum_var7[CYAN][MAX_BUF_SIZE];
    }
        

    Generates:

    array.cl
    (in-package #.*swig-module-name*)
    
    (swig-defpackage ("FOO"))
    (swig-defpackage ("BAR"))
    
    (swig-in-package ())
    (swig-def-foreign-type "COLOR" :int)
    (swig-defvar "RED" "ACL_ENUM___RED__SWIG_0" :type :constant)
    (swig-defvar "GREEN" "ACL_ENUM___GREEN__SWIG_0" :type :constant)
    (swig-defvar "BLUE" "ACL_ENUM___BLUE__SWIG_0" :type :constant)
    (swig-defvar "PURPLE" "ACL_ENUM___PURPLE__SWIG_0" :type :constant)
    (swig-defvar "CYAN" "ACL_ENUM___CYAN__SWIG_0" :type :constant)
    
    (swig-in-package ())
    
    (swig-defconstant "MAX_BUF_SIZE" 1024)
    (swig-in-package ("FOO"))
    
    (swig-defun ("global_var1" "ACL_FOO__global_var1_get__SWIG_0" :type :getter)
      (:void)
      (:returning ((* :int) )
       :strings-convert t)
      (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
    
    
    (swig-defun ("global_var2" "ACL_FOO__global_var2_set__SWIG_0" :type :setter)
      ((global_var2  (:array :float 1024) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var2))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-in-package ())
    (swig-in-package ("BAR"))
    (swig-defun ("global_var3" "ACL_BAR__global_var3_set__SWIG_0" :type :setter)
      ((global_var3  (:array :char #|1024+1|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var3))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("global_var4" "ACL_BAR__global_var4_set__SWIG_0" :type :setter)
      ((global_var4  (:array (:array :float 13) 1024) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var4))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("global_var4" "ACL_BAR__global_var4_get__SWIG_0" :type :getter)
      (:void)
      (:returning ((* (:array :float 13)) )
       :strings-convert t)
      (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
    
    
    (swig-defun ("global_var5" "ACL_BAR__global_var5_set__SWIG_0" :type :setter)
      ((global_var5  (:array :short #|1024+1024|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var5))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var5" "ACL_BAR__enum_var5_set__SWIG_0" :type :setter)
      ((enum_var5  (:array :int #|GREEN|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 enum_var5))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var6" "ACL_BAR__enum_var6_set__SWIG_0" :type :setter)
      ((enum_var6  (:array :int #|CYAN|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 enum_var6))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var7" "ACL_BAR__enum_var7_set__SWIG_0" :type :setter)
      ((enum_var7  (:array (:array #.(swig-insert-id "COLOR" ()) 1024) #|CYAN|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 enum_var7))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var7" "ACL_BAR__enum_var7_get__SWIG_0" :type :getter)
      (:void)
      (:returning ((* (:array #.(swig-insert-id "COLOR" ()) 1024)) )
       :strings-convert t)
      (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
        

    20.3.6 Classes and Structs and Unions (oh my!)

    20.3.6.1 CLOS wrapping of

    Classes, unions, and structs are all treated the same way by the interface generator. For any of these objects, a def-foreign-type and a defclass form are generated. For every function that returns an object (or pointer/reference) of C/C++ type X, the wrapping defun (or defmethod) on the Lisp side will automatically wrap the pointer returned in an instance of the appropriate class. This makes it much easier to write and debug code than if pointers were passed around as a jumble of integer values.

    20.3.6.2 CLOS Inheritance

    The CLOS class schema generated by the interface mirrors the inheritance of the classes in foreign code, with the ff:foreign-pointer class at its root. ff:foreign-pointer is a thin wrapper for pointers that is made available by the foreign function interface. Its key benefit is that it may be passed as an argument to any ff:def-foreign-call that is expecting a pointer as the parameter.

    20.3.6.3 Member fields and functions

    All public fields will have accessor getter/setter functions generated for them, as appropriate. All public member functions will have wrapper functions generated.

    We currently ignore anything that isn't public (i.e. private or protected), because the C++ compiler won't allow the wrapper functions to access such fields. Likewise, the interface does nothing for friend directives,

    20.3.6.4 Why not directly access C++ classes using foreign types?

    The def-foreign-type generated by the SWIG interface is currently incomplete. We can reliably generate the object layout of simple structs and unions; they can be allocated via ff:allocate-fobject, and their member variables accessed directly using the various ff:fslot-value-* functions. However, the layout of C++ classes is more complicated. Different compilers adjust class layout based on inheritance patterns, and the presence of virtual member functions. The size of member function pointers vary across compilers as well. As a result, it is recommended that users of any generated interface not attempt to access C++ instances via the foreign type system, but instead use the more robust wrapper functions.

    20.3.7 Templates

    20.3.7.1 Generating wrapper code for templates

    SWIG provides support for dealing with templates, but by default, it will not generate any member variable or function wrappers for templated classes. In order to create these wrappers, you need to explicitly tell SWIG to instantiate them. This is done via the %template directive.

    20.3.7.2 Implicit Template instantiation

    While no wrapper code is generated for accessing member variables, or calling member functions, type code is generated to include these templated classes in the foreign-type and CLOS class schema.

    20.3.8 Typedef, Templates, and Synonym Types

    In C/C++ it is possible, via typedef, to have many names refer to the same type. In general, this is not a problem, though it can lead to confusion. Assume the below C++ header file:

    synonyms.h
    class A { 
      int x;
      int y;
    };
    
    typedef A Foo;
    
    A *xxx(int i);         /* sets A->x = A->y = i */
    Foo *yyy(int i);       /* sets Foo->x = Foo->y = i */
    
    int zzz(A *inst = 0);  /* return inst->x + inst->y */
        

    The function zzz is an overloaded functions; the foreign function call to it will be wrapped in a generic-function whose argument will be checked against a type of A. Assuming a simple implementation, a call to xxx(1) will return a pointer to an A object, which will be wrapped in a CLOS instance of class A, and a call to yyy(1) will result in a CLOS instance of type Foo being returned. Without establishing a clear type relationship between Foo and A, an attempt to call zzz(yyy(1)) will result in an error.

    We resolve this issue, by noting synonym relationships between types while generating the interface. A Primary type is selected (more on this below) from the candidate list of synonyms. For all other synonyms, instead of generating a distinct CLOS class definition, we generate a form that expands to:

    (setf (find-class <synonym>) <primary>)

    The result is that all references to synonym types in foreign code, are wrapped in the same CLOS wrapper, and, in particular, method specialization in wrapping generic functions works as expected.

    Given the above header file, synonym.h, a Lisp session would appear as follows:

    CL-USER> (load "synonym.dll")
    ; Foreign loading synonym.dll.
    t
    CL-USER> (load "synonym.cl")
    ; Loading c:\mikel\src\swig\test\synonym.cl
    t
    CL-USER> 
    synonym> (setf a (xxx 3))
    #<A nil #x3261a0 @ #x207299da>
    synonym> (setf foo (yyy 10))
    #<A nil #x3291d0 @ #x2072e982>
    synonym> (zzz a)
    6
    synonym> (zzz foo)
    20
    synonym> 
        

    20.3.8.1 Choosing a primary type

    The choice of a primary type is selected by the following criteria from a set of synonym types.

    • If a synonym type has a class definition, it is the primary type.
    • If a synonym type is a class template and has been explicitly instantiated via %template, it is the primary type.
    • For all other sets of synonymous types, the synonym which is parsed first becomes the primary type.

    20.3.9 Function overloading/Parameter defaulting

    For each possible argument combination, a distinct wrapper function is created in the .cxx file. On the Lisp side, a generic functions is defined for each possible arity the overloaded/defaulted call may have. Each distinct wrapper is then called from within a defmethod on the appropriate generic function. These are further wrapped inside a dispatch function that checks the number of arguments it is called with and passes them via apply to the appropriate generic-function. This allows for a single entry point to overloaded functions on the lisp side.

    Example:

    overload.h:
    
    class A {
     public:
      int x;
      int y;
    };
    
    float xxx(int i, int x = 0);   /* return i * x */
    float xxx(A *inst, int x);     /* return x + A->x + A->y */
        

    Creates the following three wrappers, for each of the possible argument combinations

    overload_wrap.cxx
    EXPORT void ACL___delete_A__SWIG_0 (A *larg1) {
      A *arg1 = (A *) 0 ;
    
      arg1 = larg1;
      try {
        delete arg1;
    
      } catch (...) {
    
      }
    }
    
    
    EXPORT float ACL___xxx__SWIG_0 (int larg1, int larg2) {
      float lresult = (float)0 ;
      int arg1 ;
      int arg2 ;
      float result;
    
      arg1 = larg1;
      arg2 = larg2;
      try {
        result = (float)xxx(arg1, arg2);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (float)0;
      }
    }
    
    
    EXPORT float ACL___xxx__SWIG_1 (int larg1) {
      float lresult = (float)0 ;
      int arg1 ;
      float result;
    
      arg1 = larg1;
      try {
        result = (float)xxx(arg1);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (float)0;
      }
    }
    
    
    EXPORT float ACL___xxx__SWIG_2 (A *larg1, int larg2) {
      float lresult = (float)0 ;
      A *arg1 = (A *) 0 ;
      int arg2 ;
      float result;
    
      arg1 = larg1;
      arg2 = larg2;
      try {
        result = (float)xxx(arg1, arg2);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (float)0;
      }
    }
        

    And the following foreign-function-call and method definitions on the lisp side:

    overload.cl
    (swig-defmethod ("xxx" "ACL___xxx__SWIG_0" :type :function :arity 2)
      ((PARM0_i cl:integer :int )
       (PARM1_x cl:integer :int ))
      (:returning (:float )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_i))
      (let ((SWIG_arg1 PARM1_x))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-defmethod ("xxx" "ACL___xxx__SWIG_1" :type :function :arity 1)
      ((PARM0_i cl:integer :int ))
      (:returning (:float )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_i))
      (swig-ff-call SWIG_arg0)))
    
    (swig-defmethod ("xxx" "ACL___xxx__SWIG_2" :type :function :arity 2)
      ((PARM0_inst #.(swig-insert-id "A" () :type :class) (* #.(swig-insert-id "A" ())) )
       (PARM1_x cl:integer :int ))
      (:returning (:float )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_inst))
      (let ((SWIG_arg1 PARM1_x))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-dispatcher ("xxx" :type :function :arities (1 2)))
        

    And their usage in a sample lisp session:

    overload> (setf a (new_A))
    #<A nil #x329268 @ #x206cf612>
    overload> (setf (A_x a) 10)
    10
    overload> (setf (A_y a) 20)
    20
    overload> (xxx 1)
    0.0
    overload> (xxx 3 10)
    30.0
    overload> (xxx a 1)
    31.0
    overload> (xxx a 2)
    32.0
    overload> 
        

    20.3.10 Operator wrapping and Operator overloading

    Wrappers to defined C++ Operators are automatically renamed, using %rename, to the following defaults:

    /* name conversion for overloaded operators. */
    #ifdef __cplusplus
    %rename(__add__)             *::operator+;
    %rename(__pos__)             *::operator+();
    %rename(__pos__)             *::operator+() const;
    
    %rename(__sub__)             *::operator-;
    %rename(__neg__)             *::operator-() const;
    %rename(__neg__)             *::operator-();
    
    %rename(__mul__)             *::operator*;
    %rename(__deref__)           *::operator*();
    %rename(__deref__)           *::operator*() const;
    
    %rename(__div__)             *::operator/;
    %rename(__mod__)             *::operator%;
    %rename(__logxor__)          *::operator^;
    %rename(__logand__)          *::operator&;
    %rename(__logior__)          *::operator|;
    %rename(__lognot__)          *::operator~();
    %rename(__lognot__)          *::operator~() const;
    
    %rename(__not__)             *::operator!();
    %rename(__not__)             *::operator!() const;
    
    %rename(__assign__)          *::operator=;
    
    %rename(__add_assign__)      *::operator+=;
    %rename(__sub_assign__)      *::operator-=;
    %rename(__mul_assign__)      *::operator*=;
    %rename(__div_assign__)      *::operator/=;
    %rename(__mod_assign__)      *::operator%=;
    %rename(__logxor_assign__)   *::operator^=;
    %rename(__logand_assign__)   *::operator&=;
    %rename(__logior_assign__)   *::operator|=;
    
    %rename(__lshift__)          *::operator<<;
    %rename(__lshift_assign__)   *::operator<<=;
    %rename(__rshift__)          *::operator>>;
    %rename(__rshift_assign__)   *::operator>>=;
    
    %rename(__eq__)              *::operator==;
    %rename(__ne__)              *::operator!=;
    %rename(__lt__)              *::operator<;
    %rename(__gt__)              *::operator>;
    %rename(__lte__)             *::operator<=;
    %rename(__gte__)             *::operator>=;
    
    %rename(__and__)             *::operator&&;
    %rename(__or__)              *::operator||;
    
    %rename(__preincr__)         *::operator++();
    %rename(__postincr__)        *::operator++(int);
    %rename(__predecr__)         *::operator--();
    %rename(__postdecr__)        *::operator--(int);
    
    %rename(__comma__)           *::operator,();
    %rename(__comma__)           *::operator,() const;
    
    %rename(__member_ref__)      *::operator->;
    %rename(__member_func_ref__) *::operator->*;
    
    %rename(__funcall__)         *::operator();
    %rename(__aref__)            *::operator[];
        

    Name mangling occurs on all such renamed identifiers, so that wrapper name generated by B::operator= will be B___eq__, i.e. <class-or-namespace>_ has been added. Users may modify these default names by adding %rename directives in their own .i files.

    Operator overloading can be achieved by adding functions based on the mangled names of the function. In the following example, a class B is defined with a Operator== method defined. The swig %extend directive is used to add an overload method on Operator==.

    opoverload.h
    class B {
     public:
      int x;
      int y;
      bool operator==(B const& other) const;
    };
        

    and

    opoverload.i
    %module opoverload
    
    %{
    #include <fstream>
    #include "opoverload.h"
    %}
    
    %{
    bool B___eq__(B const *inst, int const x)
    {
      // insert the function definition into the wrapper code before
      // the wrapper for it.
      // ... do stuff ...
    }
    %}
    
    %include "opoverload.h"
    
    %extend B {
     public:
      bool __eq__(int const x) const;
    };
        

    Either operator can be called via a single call to the dispatch function:

    opoverload> (B___eq__ x1 x2)
    nil
    opoverload> (B___eq__ x1 3)
    nil
    opoverload> 
        

    20.3.11 Varargs

    Variable length argument lists are not supported, by default. If such a function is encountered, a warning will generated to stderr. Varargs are supported via the SWIG %varargs directive. This directive allows you to specify a (finite) argument list which will be inserted into the wrapper in place of the variable length argument indicator. As an example, consider the function printf(). Its declaration would appear as follows:

    See the following section on Variable Length arguments provides examples on how %varargs can be used, along with other ways such functions can be wrapped.

    20.3.12 C++ Exceptions

    Each C++ wrapper includes a handler to catch any exceptions that may be thrown while in foreign code. This helps prevent simple C++ errors from killing the entire lisp process. There is currently no mechanism to have these exceptions forwarded to the lisp condition system, nor has any explicit support of the exception related SWIG typemaps been implemented.

    20.3.13 Pass by value, pass by reference

    Allegro CL does not support the passing of non-primitive foreign structures by value. As a result, SWIG must automatically detect and convert function parameters and return values to pointers whenever necessary. This is done via the use of typemaps, and should not require any fine tuning by the user, even for newly defined types.

    20.4 Typemaps

    SWIG Typemaps provide a powerful tool for automatically generating code to handle various menial tasks required of writing an interface to foreign code. The purpose of this section is to describe each of the typemaps used by the Allegro CL module. Please read the chapter on Typemaps for more information.

    20.4.1 Code Generation in the C++ Wrapper

    Every C++ wrapper generated by SWIG takes the following form:

    return-val wrapper-name(parm0, parm1, ..., parmN)
    {
      return-val lresult;   /* return value from wrapper */
      <local-declaration>
      ... results;          /* return value from function call */
    
      <binding locals to parameters>
    
      try {
        result = function-name(local0, local1, ..., localN);
    
        <convert and bind result to lresult>
    
        return lresult;
      catch (...) {
        return (int)0;
      }
        

    20.4.1.1 IN Typemap

    the in typemap is used to generate code to convert parameters passed to C++ wrapper functions into the arguments desired for the call being wrapped. That is, it fills in the code for the <binding locals to parameters> section above. We use this map to automatically convert parameters passed by reference to the wrapper function into by-value arguments for the wrapped call, and also to convert boolean values, which are passed as integers from lisp (by default), into the appropriate type for the language of code being wrapped.

    These are the default specifications for the IN typemap. Here, $input refers to the parameter code is being generated for, and $1 is the local variable to which it is being assigned. The default settings of this typemap are as follows:

    %typemap(in) bool                          "$1 = (bool)$input;";
    %typemap(in) char, unsigned char, signed char,
                 short, signed short, unsigned short,
                 int, signed int, unsigned int,
                 long, signed long, unsigned long,
                 float, double, long double, char *, void *, void,
                 enum SWIGTYPE, SWIGTYPE *,
                 SWIGTYPE[ANY], SWIGTYPE &     "$1 = $input;";
    %typemap(in) SWIGTYPE                      "$1 = *$input;";
        

    20.4.1.2 OUT Typemap

    The out typemap is used to generate code to form the return value of the wrapper from the return value of the wrapped function. This code is placed in the <convert and bind result to lresult> section of the above code diagram. Its default mapping is as follows:

    %typemap(out) bool                          "$result = (int)$1;";
    %typemap(out) char, unsigned char, signed char,
                  short, signed short, unsigned short,
                  int, signed int, unsigned int,
                  long, signed long, unsigned long,
                  float, double, long double, char *, void *, void,
                  enum SWIGTYPE, SWIGTYPE *,
                  SWIGTYPE[ANY], SWIGTYPE &    "$result = $1;";
    %typemap(out) SWIGTYPE                     "$result = new $1_type($1);";
        

    20.4.1.3 CTYPE Typemap

    This typemap is not used for code generation, but purely for the transformation of types in the parameter list of the wrapper function. Its primary use is to handle by-value to by-reference conversion in the wrappers parameter list. Its default settings are:

    %typemap(ctype) bool                       "int";
    %typemap(ctype) char, unsigned char, signed char,
                    short, signed short, unsigned short,
                    int, signed int, unsigned int,
                    long, signed long, unsigned long,
                    float, double, long double, char *, void *, void,
                    enum SWIGTYPE, SWIGTYPE *,
                    SWIGTYPE[ANY], SWIGTYPE &  "$1_ltype";
    %typemap(ctype) SWIGTYPE                   "$&1_type";
        

    These three typemaps are specifically employed by the Allegro CL interface generator. SWIG also implements a number of other typemaps that can be used for generating code in the C/C++ wrappers. You can read about these common typemaps here.

    20.4.2 Code generation in Lisp wrappers

    A number of custom typemaps have also been added to facilitate the generation of code in the lisp side of the interface. These are described below. The basic code generation structure is applied as a series of nested expressions, one for each parameter, then one for manipulating the return value, and last, the foreign function call itself.

    Note that the typemaps below use fully qualified symbols where necessary. Users writing their own typemaps should do likewise. See the explanation in the last paragraph of 16.3.1 Namespaces for details.

    20.4.2.1 LIN Typemap

    The LIN typemap allows for the manipulating the lisp objects passed as arguments to the wrapping defun before passing them to the foreign function call. For example, when passing lisp strings to foreign code, it is often necessary to copy the string into a foreign structure of type (:char *) of appropriate size, and pass this copy to the foreign call. Using the LIN typemap, one could arrange for the stack-allocation of a foreign char array, copy your string into it, and not have to worry about freeing the copy after the function returns.

    The LIN typemap accepts the following $variable references.

    • $in - expands to the name of the parameter being applied to this typemap
    • $out - expands to the name of the local variable assigned to this typemap
    • $in_fftype - the foreign function type of the C type.
    • $*in_fftype - the foreign function type of the C type with one pointer removed. If there is no pointer, then $*in_fftype is the same as $in_fftype.
    • $body - very important. Instructs SWIG where subsequent code generation steps should be inserted into the current typemap. Leaving out a $body reference will result in lisp wrappers that do very little by way of calling into foreign code. Not recommended.
    %typemap(lin) SWIGTYPE "(cl:let (($out $in))\n  $body)";
        

    20.4.2.2 LOUT Typemap

    The LOUT typemap is the means by which we effect the wrapping of foreign pointers in CLOS instances. It is applied after all LIN typemaps, and immediately before the actual foreign-call.

    The LOUT typemap uses the following $variable

    • $lclass - Expands to the CLOS class that represents foreign-objects of the return type matching this typemap.
    • $body - Same as for the LIN map. Place this variable where you want the foreign-function call to occur.
    • $ldestructor - Expands to the symbol naming the destructor for this class ($lclass) of object. Allows you to insert finalization or automatic garbage collection into the wrapper code (see default mappings below).
    %typemap(lout) bool, char, unsigned char, signed char,
                   short, signed short, unsigned short,
                   int, signed int, unsigned int,
                   long, signed long, unsigned long,
                   float, double, long double, char *, void *, void,
                   enum SWIGTYPE    "$body";
    %typemap(lout) SWIGTYPE[ANY], SWIGTYPE *,
                   SWIGTYPE &       "(cl:make-instance '$lclass :foreign-address $body)";
    %typemap(lout) SWIGTYPE    "(cl:let* ((address $body)\n
                                (ACL_result (cl:make-instance '$lclass :foreign-address address)))\n
                                (cl:unless (cl::zerop address)\n
                                (excl:schedule-finalization ACL_result #'$ldestructor))\n
                                 ACL_result)";
        

    20.4.2.3 FFITYPE Typemap

    The FFITYPE typemap works as a helper for a body of code that converts C/C++ type specifications into Allegro CL foreign-type specifications. These foreign-type specifications appear in ff:def-foreing-type declarations, and in the argument list and return values of ff:def-foreign-calls. You would modify this typemap if you want to change how the FFI passes through arguments of a given type. For example, if you know that a particular compiler represents booleans as a single byte, you might add an entry for:

    %typemap(ffitype) bool ":unsigned-char";
        

    Note that this typemap is pure type transformation, and is not used in any code generations step the way the LIN and LOUT typemaps are. The default mappings for this typemap are:

    %typemap(ffitype) bool ":int";
    %typemap(ffitype) char ":char";
    %typemap(ffitype) unsigned char ":unsigned-char";
    %typemap(ffitype) signed char ":char";
    %typemap(ffitype) short, signed short ":short";
    %typemap(ffitype) unsigned short ":unsigned-short";
    %typemap(ffitype) int, signed int ":int";
    %typemap(ffitype) unsigned int ":unsigned-int";
    %typemap(ffitype) long, signed long ":long";
    %typemap(ffitype) unsigned long ":unsigned-long";
    %typemap(ffitype) float ":float";
    %typemap(ffitype) double ":double";
    %typemap(ffitype) char * "(* :char)";
    %typemap(ffitype) void * "(* :void)";
    %typemap(ffitype) void ":void";
    %typemap(ffitype) enum SWIGTYPE ":int";
    %typemap(ffitype) SWIGTYPE & "(* :void)";
        

    20.4.2.4 LISPTYPE Typemap

    This is another type only transformation map, and is used to provide the lisp-type, which is the optional third argument in argument specifier in a ff:def-foreign-call form. Specifying a lisp-type allows the foreign call to perform type checking on the arguments passed in. The default entries in this typemap are:

    %typemap(lisptype) bool "cl:boolean";
    %typemap(lisptype) char "cl:character";
    %typemap(lisptype) unsigned char "cl:integer";
    %typemap(lisptype) signed char "cl:integer";
        

    20.4.2.5 LISPCLASS Typemap

    The LISPCLASS typemap is used to generate the method signatures for the generic-functions which wrap overloaded functions and functions with defaulted arguments. The default entries are:

    %typemap(lispclass) bool "t";
    %typemap(lispclass) char "cl:character";
    %typemap(lispclass) unsigned char, signed char,
                        short, signed short, unsigned short,
                        int, signed int, unsigned int,
                        long, signed long, unsigned long,
                        enum SWIGTYPE       "cl:integer";
    %typemap(lispclass) float "cl:single-float";
    %typemap(lispclass) double "cl:double-float";
    %typemap(lispclass) char * "cl:string";
        

    20.4.3 Modifying SWIG behavior using typemaps

    The following example shows how we made use of the above typemaps to add support for the wchar_t type.

    %typecheck(SWIG_TYPECHECK_UNICHAR) wchar_t { $1 = 1; };
    
    %typemap(in)        wchar_t "$1 = $input;";
    %typemap(lin)       wchar_t "(cl:let (($out (cl:char-code $in)))\n  $body)";
    %typemap(lin)       wchar_t* "(excl:with-native-string
                                             ($out $in
                                              :external-format #+little-endian :fat-le 
                                                               #-little-endian :fat)\n
                                     $body)"
    
    %typemap(out)       wchar_t "$result = $1;";
    %typemap(lout)      wchar_t "(cl:code-char $body)";
    %typemap(lout)      wchar_t* "(excl:native-to-string $body
                                              :external-format #+little-endian :fat-le
                                                               #-little-endian :fat)";
    
    %typemap(ffitype)   wchar_t ":unsigned-short";
    %typemap(lisptype)  wchar_t "";
    %typemap(ctype)     wchar_t "wchar_t";
    %typemap(lispclass) wchar_t "cl:character";
    %typemap(lispclass) wchar_t* "cl:string";
        

    20.5 Identifier Converter functions

    20.5.1 Creating symbols in the lisp environment

    Various symbols must be generated in the lisp environment to which class definitions, functions, constants, variables, etc. must be bound. Rather than force a particular convention for naming these symbols, an identifier (to symbol) conversion function is used. A user-defined identifier-converter can then implement any symbol naming, case-modifying, scheme desired.

    In generated SWIG code, whenever some interface object must be referenced by its lisp symbol, a macro is inserted that calls the identifier-converter function to generate the appropriate symbol reference. It is therefore expected that the identifier-converter function reliably return the same (eq) symbol given the same set of arguments.

    20.5.2 Existing identifier-converter functions

    Two basic identifier routines have been defined.

    20.5.2.1 identifier-convert-null

    No modification of the identifier string is performed. Based on other arguments, the identifier may be concatenated with other strings, from which a symbol will be created.

    20.5.2.2 identifier-convert-lispify

    All underscores in the identifier string are converted to hyphens. Otherwise, identifier-convert-lispify performs the same symbol transformations.

    20.5.2.3 Default identifier to symbol conversions

    Check the definitions of the above two default identifier-converters in Lib/allegrocl/allegrocl.swg for default naming conventions.

    20.5.3 Defining your own identifier-converter

    A user-defined identifier-converter function should conform to the following specification:

    (defun identifier-convert-fn (id &key type class arity) ...body...)
    result ==> symbol or (setf symbol)
    

    The ID argument is a string representing an identifier in the foreign environment.

    The :type keyword argument provides more information on the type of identifier. Its value is a symbol. This allows the identifier-converter to apply different heuristics when mapping different types of identifiers to symbols. SWIG will generate calls to your identifier-converter using the following types.

    • :class - names a CLOS class.
    • :constant - names a defconstant
    • :constructor - names a function for creating a foreign object
    • :destructor - names a function for freeing a foreign object
    • :function - names a CLOS wrapping defmethod or defun.
    • :ff-operator - names a foreign call defined via ff:def-foreign-call
    • :getter - getter function
    • :namespace - names a C++ namespace
    • :setter - names a setter function. May return a (setf symbol) reference
    • :operator - names a C++ operator, such as Operator=, Operator*.
    • :slot - names a slot in a struct/class/union declaration.
    • :type - names a foreign-type defined via ff:def-foreign-type.
    • :variable - names a variable defined via ff:def-foreign-variable.

    The :class keyword argument is a string naming a foreign class. When non-nil, it indicates that the current identifier has scope in the specified class.

    The :arity keyword argument only appears in swig:swig-defmethod forms generated for overloaded functions. Its value is an integer indicating the number of arguments passed to the routine indicated by this identifier.

    20.5.4 Instructing SWIG to use a particular identifier-converter

    By default, SWIG will use identifier-converter-null. To specify another convert function, use the -identifier-converter command-line argument. The value should be a string naming the function you wish the interface to use instead, when generating symbols. ex:

    % swig -allegrocl -c++ -module mymodule -identifier-converter my-identifier-converter
    
    swig-4.0.2/Doc/Manual/Mzscheme.html0000644000175000017500000001204313667507563016751 0ustar williamwilliam SWIG and MzScheme/Racket

    37 SWIG and MzScheme/Racket

    This section contains information on SWIG's support of Racket, formally known as MzScheme.

    37.1 Creating native structures

    Example interface file:

    /* define a macro for the struct creation */
    %define handle_ptr(TYPE, NAME)
    %typemap(argout) TYPE *NAME{
      Scheme_Object *o = SWIG_NewStructFromPtr($1, $*1_mangle);
      SWIG_APPEND_VALUE(o);
    }
    
    %typemap(in, numinputs=0) TYPE *NAME (TYPE temp) {
      $1 = &temp;
    }
    %enddef
    
    /* setup the typemaps for the pointer to an output parameter cntrs */
    handle_ptr(struct diag_cntrs, cntrs);
    

    Then in scheme, you can use regular struct access procedures like

            ; suppose a function created a struct foo as
            ; (define foo (make-diag-cntrs (#x1 #x2 #x3) (make-inspector))
            ; Then you can do
            (format "0x~x" (diag-cntrs-field1 foo))
            (format "0x~x" (diag-cntrs-field2 foo))
            ;etc...
    

    37.2 Simple example

    A few examples are available in the Examples/mzscheme directory. The code and log of a session using SWIG below should help getting started.

    C header file:

    // example.h
    int fact(int n);
    

    C source code:

    // File: example.c
    #include "example.h"
    
    int fact(int n) {
      if (n < 0) { /* This should probably return an error, but this is simpler */
        return 0;
      }
      if (n == 0) {
        return 1;
      }
      else {
        /* testing for overflow would be a good idea here */
        return n * fact(n-1);
      }
    }
    

    SWIG interface file:

    /* File: example.i */
    %module example
    
    %{
    #include "example.h"
    %}
    
    int fact(int n);
    

    The session below using the above files is on an OS X machine, but the points to be made are more general. On OS X, libtool is the tool which creates libraries, which are named .dylib, rather than .so on other unixes, or .dll on Windows.

    % swig -mzscheme -declaremodule example.i
    % gcc -c -m32 -o example.o example.c # force 32-bit object file (mzscheme is 32-bit only)
    % libtool -dynamic -o libexample.dylib example.o # make it into a library
    % ls # what've we got so far?
    example.c example.o
    example.h example_wrap.c
    example.i libexample.dylib*
    % mzc --cgc --cc example_wrap.c # compile the wrapping code
    % LDFLAGS="-L. -lexample" mzc --ld example_wrap.dylib example_wrap.o # ...and link it
    % mzscheme -e '(path->string (build-path "compiled" "native" (system-library-subpath)))'
    "compiled/native/i386-macosx/3m"
    % mkdir -p compiled/native/i386-macosx/3m # move the extension library to a magic place
    % mv example_wrap.dylib compiled/native/i386-macosx/3m/example_ss.dylib
    % mzscheme
    Welcome to MzScheme v4.2.4 [3m], Copyright (c) 2004-2010 PLT Scheme Inc.
    > (require "example.ss")
    > (fact 5)
    120
    > ^D
    % echo 'It works!'
    

    Some points of interest:

    • This is on a 64-bit machine, so we have to include the -m32 option when building the object file
    • If you want to declare a scheme module (and you probably do), it's important that you include the -declaremodule option to swig (if you miss this out, it'll appear to work, but fail later).
    • Use mzc to compile and then link the wrapped code. You'll probably need to adjust the link flags to refer to the library you're wrapping (you can either do this with an LDFLAGS declaration, as here, or with multiple ++ldf options to mzc).
    • Create the directory with path (build-path "compiled" "native" (system-library-subpath)) and move the freshly-generated .dylib to there, changing its name to module-name_ss.dylib. After that, you can REQUIRE the new module with (require "module-name.ss").
    • The above requests mzc to create an extension using the CGC garbage-collector. The alternative -- the 3m collector -- has generally better performance, but work is still required for SWIG to emit code which is compatible with it.

    37.3 External documentation

    See the C API for more description of using the mechanism for adding extensions. The main documentation is here.

    Tip: mzc's --vv option is very useful for debugging the inevitable library problems you'll encounter.

    swig-4.0.2/Doc/Manual/Chicken.html0000644000175000017500000006002313667507523016537 0ustar williamwilliam SWIG and Chicken

    23 SWIG and Chicken

    This chapter describes SWIG's support of CHICKEN. CHICKEN is a Scheme-to-C compiler supporting most of the language features as defined in the Revised^5 Report on Scheme. Its main attributes are that it

    1. generates portable C code
    2. includes a customizable interpreter
    3. links to C libraries with a simple Foreign Function Interface
    4. supports full tail-recursion and first-class continuations

    When confronted with a large C library, CHICKEN users can use SWIG to generate CHICKEN wrappers for the C library. However, the real advantages of using SWIG with CHICKEN are its support for C++ -- object-oriented code is difficult to wrap by hand in CHICKEN -- and its typed pointer representation, essential for C and C++ libraries involving structures or classes.

    23.1 Preliminaries

    CHICKEN support was introduced to SWIG in version 1.3.18. SWIG relies on some recent additions to CHICKEN, which are only present in releases of CHICKEN with version number greater than or equal to 1.89. To use a chicken version between 1.40 and 1.89, see the Garbage collection section below.

    You may want to look at any of the examples in Examples/chicken/ directory for the basic steps to run SWIG CHICKEN.

    23.1.1 Running SWIG in C mode

    To run SWIG CHICKEN in C mode, use the -chicken option.

    % swig -chicken example.i

    To allow the wrapper to take advantage of future CHICKEN code generation improvements, part of the wrapper is direct CHICKEN function calls (example_wrap.c) and part is CHICKEN Scheme (example.scm). The basic Scheme code must be compiled to C using your system's CHICKEN compiler or both files can be compiled directly using the much simpler csc.

    % chicken example.scm -output-file oexample.c
    

    So for the C mode of SWIG CHICKEN, example_wrap.c and oexample.c are the files that must be compiled to object files and linked into your project.

    23.1.2 Running SWIG in C++ mode

    To run SWIG CHICKEN in C++ mode, use the -chicken -c++ option.

    % swig -chicken -c++ example.i

    This will generate example_wrap.cxx and example.scm. The basic Scheme code must be compiled to C using your system's CHICKEN compiler or both files can be compiled directly using the much simpler csc.

    % chicken example.scm -output-file oexample.c

    So for the C++ mode of SWIG CHICKEN, example_wrap.cxx and oexample.c are the files that must be compiled to object files and linked into your project.

    23.2 Code Generation

    23.2.1 Naming Conventions

    Given a C variable, function or constant declaration named Foo_Bar, the declaration will be available in CHICKEN as an identifier ending with Foo-Bar. That is, an underscore is converted to a dash.

    You may control what the CHICKEN identifier will be by using the %rename SWIG directive in the SWIG interface file.

    23.2.2 Modules

    The name of the module must be declared one of two ways:

    • Placing %module example in the SWIG interface file.
    • Using -module example on the SWIG command line.

    The generated example.scm file then exports (declare (unit modulename)). If you do not want SWIG to export the (declare (unit modulename)), pass the -nounit option to SWIG.

    CHICKEN will be able to access the module using the (declare (uses modulename)) CHICKEN Scheme form.

    23.2.3 Constants and Variables

    Constants may be created using any of the four constructs in the interface file:

    1. #define MYCONSTANT1 ...
    2. %constant int MYCONSTANT2 = ...
    3. const int MYCONSTANT3 = ...
    4. enum { MYCONSTANT4 = ... };

    In all cases, the constants may be accessed from within CHICKEN using the form (MYCONSTANT1); that is, the constants may be accessed using the read-only parameter form.

    Variables are accessed using the full parameter form. For example, to set the C variable "int my_variable;", use the Scheme form (my-variable 2345). To get the C variable, use (my-variable).

    The %feature("constasvar") can be applied to any constant or immutable variable. Instead of exporting the constant as a function that must be called, the constant will appear as a scheme variable. This causes the generated .scm file to just contain the code (set! MYCONSTANT1 (MYCONSTANT1)). See Features and the %feature directive for info on how to apply the %feature.

    23.2.4 Functions

    C functions declared in the SWIG interface file will have corresponding CHICKEN Scheme procedures. For example, the C function "int sqrt(double x);" will be available using the Scheme form (sqrt 2345.0). A void return value will give C_SCHEME_UNDEFINED as a result.

    A function may return more than one value by using the OUTPUT specifier (see Lib/chicken/typemaps.i). They will be returned as multiple values using (values) if there is more than one result (that is, a non-void return value and at least one argout parameter, or a void return value and at least two argout parameters). The return values can then be accessed with (call-with-values).

    23.2.5 Exceptions

    The SWIG chicken module has support for exceptions thrown from C or C++ code to be caught in scheme. See Exception handling with %exception for more information about declaring exceptions in the interface file.

    Chicken supports both the SWIG_exception(int code, const char *msg) interface as well as a SWIG_ThrowException(C_word val) function for throwing exceptions from inside the %exception blocks. SWIG_exception will throw a list consisting of the code (as an integer) and the message. Both of these will throw an exception using (abort), which can be handled by (handle-exceptions). See the Chicken manual on Exceptions and SFRI-12. Since the exception values are thrown directly, if (condition-case) is used to catch an exception the exception will come through in the val () case.

    The following simple module

    %module exception_test
    
    %inline %{
      void test_throw(int i) throws (int) { 
        if (i == 1) throw 15; 
      }
    %}
    

    could be run with

    (handle-exceptions exvar 
      (if (= exvar 15)
        (print "Correct!") 
        (print "Threw something else " exvar))
      (test-throw 1))
    

    23.3 TinyCLOS

    The author of TinyCLOS, Gregor Kiczales, describes TinyCLOS as: "Tiny CLOS is a Scheme implementation of a 'kernelized' CLOS, with a metaobject protocol. The implementation is even simpler than the simple CLOS found in 'The Art of the Metaobject Protocol', weighing in at around 850 lines of code, including (some) comments and documentation."

    Almost all good Scheme books describe how to use metaobjects and generic procedures to implement an object-oriented Scheme system. Please consult a Scheme book if you are unfamiliar with the concept.

    CHICKEN has a modified version of TinyCLOS, which SWIG CHICKEN uses if the -proxy argument is given. If -proxy is passed, then the generated example.scm file will contain TinyCLOS class definitions. A class named Foo is declared as <Foo>, and each member variable is allocated a slot. Member functions are exported as generic functions.

    Primitive symbols and functions (the interface that would be presented if -proxy was not passed) are hidden and no longer accessible. If the -unhideprimitive command line argument is passed to SWIG, then the primitive symbols will be available, but each will be prefixed by the string "primitive:"

    The exported symbol names can be controlled with the -closprefix and -useclassprefix arguments. If -useclassprefix is passed to SWIG, every member function will be generated with the class name as a prefix. If the -closprefix mymod: argument is passed to SWIG, then the exported functions will be prefixed by the string "mymod:". If -useclassprefix is passed, -closprefix is ignored.

    23.4 Linkage

    Please refer to CHICKEN - A practical and portable Scheme system - User's manual for detailed help on how to link object files to create a CHICKEN Scheme program. Briefly, to link object files, be sure to add `chicken-config -extra-libs -libs` or `chicken-config -shared -extra-libs -libs`to your linker options. Use the -shared option if you want to create a dynamically loadable module. You might also want to use the much simpler csc or csc.bat.

    Each scheme file that is generated by SWIG contains (declare (uses modname)). This means that to load the module from scheme code, the code must include (declare (uses modname)).

    23.4.1 Static binary or shared library linked at compile time

    We can easily use csc to build a static binary.

    $ swig -chicken example.i
    $ csc -v example.scm example_impl.c example_wrap.c test_script.scm -o example
    $ ./example
    

    Similar to the above, any number of module.scm files could be compiled into a shared library, and then that shared library linked when compiling the main application.

    $ swig -chicken example.i
    $ csc -sv example.scm example_wrap.c example_impl.c -o example.so
    

    The example.so file can then linked with test_script.scm when it is compiled, in which case test_script.scm must have (declare (uses example)). Multiple SWIG modules could have been linked into example.so and each one accessed with a (declare (uses ... )).

    $ csc -v test_script.scm -lexample
    

    An alternative is that the test_script.scm can have the code (load-library 'example "example.so"), in which case the test script does not need to be linked with example.so. The test_script.scm file can then be run with csi.

    23.4.2 Building chicken extension libraries

    Building a shared library like in the above section only works if the library is linked at compile time with a script containing (declare (uses ...)) or is loaded explicitly with (load-library 'example "example.so"). It is not the format that CHICKEN expects for extension libraries and eggs. The problem is the (declare (unit modname)) inside the modname.scm file. There are two possible solutions to this.

    First, SWIG accepts a -nounit argument, in which case the (declare (unit modname)) is not generated. Then, the modname.scm and modname_wrap.c files must be compiled into their own shared library.

    $ csc -sv modname.scm modname_wrap.c modname_impl.c -o modname.so
    

    This library can then be loaded by scheme code with the (require 'modname) function. See the Loading-extension-libraries in the eval unit inside the CHICKEN manual for more information.

    Another alternative is to run SWIG normally and create a scheme file that contains (declare (uses modname)) and then compile that file into the shared library as well. For example, inside the mod_load.scm file,

    (declare (uses mod1))
    (declare (uses mod2))
    

    Which would then be compiled with

    $ swig -chicken mod1.i
    $ swig -chicken mod2.i
    $ csc -sv mod_load.scm mod1.scm mod2.scm mod1_wrap.c mod2_wrap.c mod1_impl.c mod2_impl.c -o mod.so
    

    Then the extension library can be loaded with (require 'mod). As we can see here, mod_load.scm contains the code that gets executed when the module is loaded. All this code does is load both mod1 and mod2. As we can see, this technique is more useful when you want to combine a few SWIG modules into one chicken extension library, especially if modules are related by %import

    In either method, the files that are compiled into the shared library could also be packaged into an egg. The mod1_wrap.c and mod2_wrap.c files that are created by SWIG are stand alone and do not need SWIG to be installed to be compiled. Thus the egg could be distributed and used by anyone, even if SWIG is not installed.

    See the Examples/chicken/egg directory in the SWIG source for an example that builds two eggs, one using the first method and one using the second method.

    23.4.3 Linking multiple SWIG modules with TinyCLOS

    Linking together multiple modules that share type information using the %import directive while also using -proxy is more complicated. For example, if mod2.i imports mod1.i, then the mod2.scm file contains references to symbols declared in mod1.scm, and thus a (declare (uses mod1)) or (require 'mod1) must be exported to the top of mod2.scm. By default, when SWIG encounters an %import "modname.i" directive, it exports (declare (uses modname)) into the scm file. This works fine unless mod1 was compiled with the -nounit argument or was compiled into an extension library with other modules under a different name.

    One option is to override the automatic generation of (declare (uses mod1)) by passing the -noclosuses option to SWIG when compiling mod2.i. SWIG then provides the %insert(closprefix) %{ %} directive. Any scheme code inside that directive is inserted into the generated .scm file, and if mod1 was compiled with -nounit, the directive should contain (require 'mod1). This option allows for mixed loading as well, where some modules are imported with (declare (uses modname)) (which means they were compiled without -nounit) and some are imported with (require 'modname).

    The other option is to use the second idea in the above section. Compile all the modules normally, without any %insert(closprefix), -nounit, or -noclosuses. Then the modules will import each other correctly with (declare (uses ...)). To create an extension library or an egg, just create a module_load.scm file that (declare (uses ...)) all the modules.

    23.5 Typemaps

    The Chicken module handles all types via typemaps. This information is read from Lib/chicken/typemaps.i and Lib/chicken/chicken.swg.

    23.6 Pointers

    For pointer types, SWIG uses CHICKEN tagged pointers. A tagged pointer is an ordinary CHICKEN pointer with an extra slot for a void *. With SWIG CHICKEN, this void * is a pointer to a type-info structure. So each pointer used as input or output from the SWIG-generated CHICKEN wrappers will have type information attached to it. This will let the wrappers correctly determine which method should be called according to the object type hierarchy exposed in the SWIG interface files.

    To construct a Scheme object from a C pointer, the wrapper code calls the function SWIG_NewPointerObj(void *ptr, swig_type_info *type, int owner), The function that calls SWIG_NewPointerObj must have a variable declared C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); It is ok to call SWIG_NewPointerObj more than once, just make sure known_space has enough space for all the created pointers.

    To get the pointer represented by a CHICKEN tagged pointer, the wrapper code calls the function SWIG_ConvertPtr(C_word s, void **result, swig_type_info *type, int flags), passing a pointer to a struct representing the expected pointer type. flags is either zero or SWIG_POINTER_DISOWN (see below).

    23.6.1 Garbage collection

    If the owner flag passed to SWIG_NewPointerObj is 1, NewPointerObj will add a finalizer to the type which will call the destructor or delete method of that type. The destructor and delete functions are no longer exported for use in scheme code, instead SWIG and chicken manage pointers. In situations where SWIG knows that a function is returning a type that should be garbage collected, SWIG will automatically set the owner flag to 1. For other functions, the %newobject directive must be specified for functions whose return values should be garbage collected. See Object ownership and %newobject for more information.

    In situations where a C or C++ function will assume ownership of a pointer, and thus chicken should no longer garbage collect it, SWIG provides the DISOWN input typemap. After applying this typemap (see the Typemaps chapter for more information on how to apply typemaps), any pointer that gets passed in will no longer be garbage collected. An object is disowned by passing the SWIG_POINTER_DISOWN flag to SWIG_ConvertPtr. Warning: Since the lifetime of the object is now controlled by the underlying code, the object might get deleted while the scheme code still holds a pointer to it. Further use of this pointer can lead to a crash.

    Adding a finalizer function from C code was added to chicken in the 1.89 release, so garbage collection does not work for chicken versions below 1.89. If you would like the SWIG generated code to work with chicken 1.40 to 1.89, pass the -nocollection argument to SWIG. This will not export code inside the _wrap.c file to register finalizers, and will then export destructor functions which must be called manually.

    23.7 Unsupported features and known problems

    • No director support.
    • No support for c++ standard types like std::vector.
    • The TinyCLOS wrappers for overloaded functions will not work correctly when using %feature(compactdefaultargs).

    23.7.1 TinyCLOS problems with Chicken version <= 1.92

    In Chicken versions equal to or below 1.92, TinyCLOS has a limitation such that generic methods do not properly work on methods with different number of specializers: TinyCLOS assumes that every method added to a generic function will have the same number of specializers. SWIG generates functions with different lengths of specializers when C/C++ functions are overloaded. For example, the code

    class Foo {};
    int foo(int a, Foo *b);
    int foo(int a);
    

    will produce scheme code

    (define-method (foo (arg0 <top>) (arg1 <Foo>)) (call primitive function))
    (define-method (foo (arg0 <top>)) (call primitive function))
    

    Using unpatched TinyCLOS, the second (define-method) will replace the first one, so calling (foo 3 f) will produce an error.

    There are three solutions to this. The easist is to upgrade to the latest Chicken version. Otherwise, the file Lib/chicken/tinyclos-multi-generic.patch in the SWIG source contains a patch against tinyclos.scm inside the 1.92 chicken source to add support into TinyCLOS for multi-argument generics. (This patch was accepted into Chicken) This requires chicken to be rebuilt and custom install of chicken. An alternative is the Lib/chicken/multi-generic.scm file in the SWIG source. This file can be loaded after TinyCLOS is loaded, and it will override some functions inside TinyCLOS to correctly support multi-argument generics. Please see the comments at the top of both files for more information.

    swig-4.0.2/Doc/Manual/ch2.1.png0000644000175000017500000000611213667507523015625 0ustar williamwilliam‰PNG  IHDRy•Š,zBPLTEÿÿÿÿÿÌÿÿ™ÿÿfÿÿ3ÿÿÿÌÿÿÌÌÿÌ™ÿÌfÿÌ3ÿÌÿ™ÿÿ™Ìÿ™™ÿ™fÿ™3ÿ™ÿfÿÿfÌÿf™ÿffÿf3ÿfÿ3ÿÿ3Ìÿ3™ÿ3fÿ33ÿ3ÿÿÿÌÿ™ÿfÿ3ÿÌÿÿÌÿÌÌÿ™ÌÿfÌÿ3ÌÿÌÌÿÌÌÌÌÌ™ÌÌfÌÌ3ÌÌÌ™ÿÌ™ÌÌ™™Ì™fÌ™3Ì™ÌfÿÌfÌÌf™ÌffÌf3ÌfÌ3ÿÌ3ÌÌ3™Ì3fÌ33Ì3ÌÿÌÌÌ™ÌfÌ3Ì™ÿÿ™ÿÌ™ÿ™™ÿf™ÿ3™ÿ™Ìÿ™Ì̙̙™Ìf™Ì3™Ì™™ÿ™™Ì™™™™™f™™3™™™fÿ™fÌ™f™™ff™f3™f™3ÿ™3Ì™3™™3f™33™3™ÿ™Ì™™™f™3™fÿÿfÿÌfÿ™fÿffÿ3fÿfÌÿfÌÌfÌ™fÌffÌ3fÌf™ÿf™Ìf™™f™ff™3f™ffÿffÌff™fffff3fff3ÿf3Ìf3™f3ff33f3fÿfÌf™fff3f3ÿÿ3ÿÌ3ÿ™3ÿf3ÿ33ÿ3Ìÿ3ÌÌ3Ì™3Ìf3Ì33Ì3™ÿ3™Ì3™™3™f3™33™3fÿ3fÌ3f™3ff3f33f33ÿ33Ì33™33f333333ÿ3Ì3™3f333ÿÿÿÌÿ™ÿfÿ3ÿÌÿÌÌÌ™ÌfÌ3Ì™ÿ™Ì™™™f™3™fÿfÌf™fff3f3ÿ3Ì3™3f333ÿÌ™f3îÝ»ªˆwUD"îÝ»ªˆwUD"îÝ»ªˆwUD"îîîÝÝÝ»»»ªªªˆˆˆwwwUUUDDD"""û‚™ IDATxÚb`ÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿ¢ú?l-C ÿÿ ù yÿÿ¢MÈ—¼KKÓÿÿuñ@ùÿÿuñ@ùÿÿuñ@ùÿÿœ.ÆbÂm­ÿÿhcoB  ý'd(š!´ yÿÿà+ýO±q´ #Ú†<ÿÿ ù yÿÿðÿZdüGŠŒÿ`iXyÂR¾ ˜Â€U!Ât œÎ¥mÈÿÿø‡…¢ó 8ëÿXøü‡q¡Lr¨ á¦"TÀÌÄí^Ú†<ÿÿð\ zh¨ÀÓ!ñÿ?Š2Æf#v…È:Ð%&äÿÿ å#’ï)yXÑ„;ä1 ËòÿÿèÒ†¼Ç^ÎÿÇÐð 3*– H9ÿÿm›ÿH¥6zÈ#'UÜåÎGTðÚ½äù?@!ÿÿ<5,ÒÈìx} oüG&ÐˈÿHU3.…(HVÚÿÿÄí`¼±ÖàTH„ ´ yÿÿš!ÿŸØÇ©ðÿ€‡<ÿÿÊ!OI™Jg ÿÿ¼!ÿåG¤%8amCÿÿï(ÿÿuñ@ùÿÿuñ@ùÿÿ¢‹GW}ÿÿ ù yÿÿEÿÿEÿÿEÿÿ5ÈÐô ÿÿb!χ †jÐÿÿ!?$ƒÿÿ!?ƒÿÿ ùÿÿ ùÿÿ¢U†TBÿÿ&É~†;ÿÿÉ~H&xÿÿEÎÐ wÿÿúÉ~¨†;ÿÿòÉ~È<ÿÿâé~‡;ÿÿÒÉ~H‡;ÿÿÊÉ~h<ÿÿºÉ~¨‡;ÿÿÊÉ~h‡;ÿÿúé~¨ºÿÿêÉ~è:ÿÿEÿÿEÿÿEÿÿ"²Ý6 ¨¾‰ÿÿ ù yÿÿÂò£ùžâb$ÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ!ÿ(†<ÿÿ¢cÈÿÇHÄÙ†]ÑWKÑÛËxÍÿÿ¢™3ÐWúüG¿Ç-Fˆ»ð?6 þc³¿f A­ ÿÿ¢UÈÿÇð ®›úˆ·Û•°°Kèþ :üÖ Àîÿÿ¢‘càׯÒ*ä‘-øfßlåÿ  yÿÿ¢cЊ™ÿh!tíüä«íÿ£ß\brq‚"îVl!b ŠAþƼúÿÿ¢yÈ£\SÌ€|ý<Ò¥ëws£\í™aHy„5ÿQ­ è0¦AÈÿÿ€G½Ž›óžn´ §I yxF[Í‹j Ž `K^ÿÿG\?$‡<þr×EáøCž&¥ ÿÿ¢q ‹+Í#©!+ä‘¥1›=T y R=^}ÿÿ¢m«ý:z”ì‹rÝ=©!d*—`ÈÿÇV–àKóä^}ÿÿ¢}O ™B½ÔQ #I )ÅÒ¶ÁbÁì=7,ÎA úÿ(u-^GP°ç¯Fÿÿòã6ƒÙ™xÝÿÿú!?TSÿÿc•C2äÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ§mÐòt\ÿÿ ù yÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿUŸ˜Å"AIEND®B`‚swig-4.0.2/Doc/Manual/Ocaml.html0000644000175000017500000010765613667507563016250 0ustar williamwilliam SWIG and Ocaml

    38 SWIG and OCaml

    This chapter describes SWIG's support of Ocaml.

    Ocaml is a relatively recent addition to the ML family, and is a recent addition to SWIG. It's the second compiled, typed language to be added. Ocaml has widely acknowledged benefits for engineers, mostly derived from a sophisticated type system, compile-time checking which eliminates several classes of common programming errors, and good native performance. While all of this is wonderful, there are well-written C and C++ libraries that Ocaml users will want to take advantage of as part of their arsenal (such as SSL and gdbm), as well as their own mature C and C++ code. SWIG allows this code to be used in a natural, type-safe way with Ocaml, by providing the necessary, but repetitive glue code which creates and uses Ocaml values to communicate with C and C++ code. In addition, SWIG also produces the needed Ocaml source that binds variants, functions, classes, etc.

    If you're not familiar with the Objective Caml language, you can visit The Ocaml Website.

    38.1 Preliminaries

    SWIG is compatible with OCaml 3.12.0 and above. Given the choice, you should use the latest stable release. The SWIG Ocaml module has been tested on Linux (x86, PPC, Sparc) and Cygwin on Windows. The best way to determine whether your system will work is to compile the examples and test-suite which come with SWIG. You can do this by running make check from the SWIG root directory after installing SWIG. The Ocaml module has been tested using the system's dynamic linking (the usual -lxxx against libxxx.so, as well as with Gerd Stolpmann's Dl package. The ocaml_dynamic and ocaml_dynamic_cpp targets in the file Examples/Makefile illustrate how to compile and link SWIG modules that will be loaded dynamically. This has only been tested on Linux so far.

    38.1.1 Running SWIG

    The basics of getting a SWIG Ocaml module up and running can be seen from one of SWIG's example Makefiles, but is also described here. To build an Ocaml module, run SWIG using the -ocaml option.

    %swig -ocaml example.i
    

    This will produce 3 files. The file example_wrap.c contains all of the C code needed to build an Ocaml module. To build the module, you will compile the file example_wrap.c with ocamlc or ocamlopt to create the needed .o file. You will need to compile the resulting .ml and .mli files as well, and do the final link with -custom (not needed for native link).

    38.1.2 Compiling the code

    The OCaml SWIG module now requires you to compile a module (Swig) separately. In addition to aggregating common SWIG functionality, the Swig module contains the data structure that represents C/C++ values. This allows easier data sharing between modules if two or more are combined, because the type of each SWIG'ed module's c_obj is derived from Swig.c_obj_t. This also allows SWIG to acquire new conversions painlessly, as well as giving the user more freedom with respect to custom typing. Use ocamlc or ocamlopt to compile your SWIG interface like:

    % swig -ocaml -co swig.mli ; swig -ocaml -co swig.ml
    % ocamlc -c swig.mli ; ocamlc -c swig.ml
    % ocamlc -c -ccopt "-I/usr/include/foo" example_wrap.c
    % ocamlc -c example.mli
    % ocamlc -c example.ml
    

    ocamlc is aware of .c files and knows how to handle them. Unfortunately, it does not know about .cxx, .cc, or .cpp files, so when SWIG is invoked in C++ mode, you must:

    % cp example_wrap.cxx example_wrap.cxx.c
    % ocamlc -c ... -ccopt -xc++ example_wrap.cxx.c
    % ...
    

    38.1.3 The camlp4 module

    The camlp4 module (swigp4.ml -> swigp4.cmo) contains a simple rewriter which makes C++ code blend more seamlessly with objective caml code. Its use is optional, but encouraged. The source file is included in the Lib/ocaml directory of the SWIG source distribution. You can checkout this file with "swig -ocaml -co swigp4.ml". You should compile the file with "ocamlc -I `camlp4 -where` -pp 'camlp4o pa_extend.cmo q_MLast.cmo' -c swigp4.ml"

    The basic principle of the module is to recognize certain non-caml expressions and convert them for use with C++ code as interfaced by SWIG. The camlp4 module is written to work with generated SWIG interfaces, and probably isn't great to use with anything else.

    Here are the main rewriting rules:

    InputRewritten to
    f'( ... ) as in
    atoi'("0") or
    _exit'(0)
    f(C_list [ ... ]) as in
    atoi (C_list [ C_string "0" ]) or
    _exit (C_list [ C_int 0 ])
    object -> method ( ... )(invoke object) "method" (C_list [ ... ])
    object 'binop argument as in
    a '+= b
    (invoke object) "+=" argument as in
    (invoke a) "+=" b
    Note that because camlp4 always recognizes << and >>, they are replaced by lsl and lsr in operator names.
    'unop object as in
    '! a
    (invoke a) "!" C_void
    Smart pointer access like this
    object '-> method ( args )
    (invoke (invoke object "->" C_void))
    Invoke syntax
    object . '( ... )
    (invoke object) "()" (C_list [ ... ])
    Array syntax
    object '[ 10 ]
    (invoke object) "[]" (C_int 10)
    Assignment syntax
    let a = '10 and b = '"foo" and c = '1.0 and d = 'true
    let a = C_int 10 and b = C_string "foo" and c = C_double 1.0 and d = C_bool true
    Cast syntax
    let a = _atoi '("2") as int
    let b = (getenv "PATH") to string
    This works for int, string, float, bool
    let a = get_int (_atoi (C_string "2"))
    let b = C_string (getenv "PATH")

    38.1.4 Using your module

    You can test-drive your module by building a toplevel ocaml interpreter. Consult the ocaml manual for details.

    When linking any ocaml bytecode with your module, use the -custom option to build your functions into the primitive list. This option is not needed when you build native code.

    38.1.5 Compilation problems and compiling with C++

    As mentioned above, .cxx files need special handling to be compiled with ocamlc. Other than that, C code that uses class as a non-keyword, and C code that is too liberal with pointer types may not compile under the C++ compiler. Most code meant to be compiled as C++ will not have problems.

    38.2 The low-level Ocaml/C interface

    In order to provide access to overloaded functions, and provide sensible outputs from them, all C entities are represented as members of the c_obj type:

    In the code as seen by the typemap writer, there is a value, swig_result, that always contains the current return data. It is a list, and must be appended with the caml_list_append function, or with functions and macros provided by objective caml.

    type c_obj =
        C_void
      | C_bool of bool
      | C_char of char
      | C_uchar of char
      | C_short of int
      | C_ushort of int
      | C_int of int
      | C_uint of int32
      | C_int32 of int32
      | C_int64 of int64
      | C_float of float
      | C_double of float
      | C_ptr of int64 * int64
      | C_array of c_obj array
      | C_list of c_obj list
      | C_obj of (string -> c_obj -> c_obj)
      | C_string of string
      | C_enum of c_enum_t
    

    A few functions exist which generate and return these:

    • caml_ptr_val receives a c_obj and returns a void *. This should be used for all pointer purposes.
    • caml_long_val receives a c_obj and returns a long. This should be used for most integral purposes.
    • caml_val_ptr receives a void * and returns a c_obj.
    • caml_val_bool receives a C int and returns a c_obj representing its bool value.
    • caml_val_(u)?(char|short|int|long|float|double) receives an appropriate C value and returns a c_obj representing it.
    • caml_val_string receives a char * and returns a string value.
    • caml_val_string_len receives a char * and a length and returns a string value.
    • caml_val_obj receives a void * and an object type and returns a C_obj, which contains a closure giving method access.

    Because of this style, a typemap can return any kind of value it wants from a function. This enables out typemaps and inout typemaps to work well. The one thing to remember about outputting values is that you must append them to the return list with swig_result = caml_list_append(swig_result, v).

    This function will return a new list that has your element appended. Upon return to caml space, the fnhelper function beautifies the result. A list containing a single item degrades to only that item (i.e. [ C_int 3 ] -> C_int 3), and a list containing more than one item is wrapped in C_list (i.e. [ C_char 'a' ; C_char 'b' ] -> C_list [ C_char 'a' ; C_char 'b' ]). This is in order to make return values easier to handle when functions have only one return value, such as constructors, and operators. In addition, string, pointer, and object values are interchangeable with respect to caml_ptr_val, so you can allocate memory as caml strings and still use the resulting pointers for C purposes, even using them to construct simple objects on. Note, though, that foreign C++ code does not respect the garbage collector, although the SWIG interface does.

    The wild card type that you can use in lots of different ways is C_obj. It allows you to wrap any type of thing you like as an object using the same mechanism that the ocaml module does. When evaluated in caml_ptr_val, the returned value is the result of a call to the object's "&" operator, taken as a pointer.

    You should only construct values using objective caml, or using the functions caml_val_* functions provided as static functions to a SWIG ocaml module, as well as the caml_list_* functions. These functions provide everything a typemap needs to produce values. In addition, value items pass through directly, but you must make your own type signature for a function that uses value in this way.

    38.2.1 The generated module

    The SWIG %module directive specifies the name of the Ocaml module to be generated. If you specified `%module example', then your Ocaml code will be accessible in the module Example. The module name is always capitalized as is the ocaml convention. Note that you must not use any Ocaml keyword to name your module. Remember that the keywords are not the same as the C++ ones.

    You can introduce extra code into the output wherever you like with SWIG. These are the places you can introduce code:
    "header"This code is inserted near the beginning of the C wrapper file, before any function definitions.
    "wrapper"This code is inserted in the function definition section.
    "runtime"This code is inserted near the end of the C wrapper file.
    "mli"This code is inserted into the caml interface file. Special signatures should be inserted here.
    "ml"This code is inserted in the caml code defining the interface to your C code. Special caml code, as well as any initialization which should run when the module is loaded may be inserted here.
    "classtemplate"The "classtemplate" place is special because it describes the output SWIG will generate for class definitions.

    38.2.2 Enums

    SWIG will wrap enumerations as polymorphic variants in the output Ocaml code, as above in C_enum. In order to support all C++-style uses of enums, the function int_to_enum and enum_to_int are provided for ocaml code to produce and consume these values as integers. Other than that, correct uses of enums will not have a problem. Since enum labels may overlap between enums, the enum_to_int and int_to_enum functions take an enum type label as an argument. Example:

    %module enum_test
    %{
    enum c_enum_type { a = 1, b, c = 4, d = 8 };
    %}
    enum c_enum_type { a = 1, b, c = 4, d = 8 };
    

    The output mli contains:

    type c_enum_type = [
      `unknown
    | `c_enum_type
    ]
    type c_enum_tag = [
      `int of int
    | `a
    | `b
    | `c
    | `d
    ]
    val int_to_enum c_enum_type -> int -> c_obj
    val enum_to_int c_enum_type -> c_obj -> c_obj
    

    So it's possible to do this:

    bash-2.05a$ ocamlmktop -custom enum_test_wrap.o enum_test.cmo -o enum_test_top
    bash-2.05a$ ./enum_test_top
            Objective Caml version 3.04
    
    # open Enum_test ;;
    # let x = C_enum `a ;;
    val x : Enum_test.c_obj = C_enum `a
    # enum_to_int `c_enum_type x ;;
    - : Enum_test.c_obj = C_int 1
    # int_to_enum `c_enum_type 4 ;;
    - : Enum_test.c_obj = C_enum `c
    

    38.2.2.1 Enum typing in Ocaml

    The ocaml SWIG module now has support for loading and using multiple SWIG modules at the same time. This enhances modularity, but presents problems when used with a language which assumes that each module's types are complete at compile time. In order to achieve total soundness enum types are now isolated per-module. The type issue matters when values are shared between functions imported from different modules. You must convert values to master values using the swig_val function before sharing them with another module.

    38.2.3 Arrays

    38.2.3.1 Simple types of bounded arrays

    SWIG has support for array types, but you generally will need to provide a typemap to handle them. You can currently roll your own, or expand some of the macros provided (but not included by default) with the SWIG distribution.

    By including "carray.i", you will get access to some macros that help you create typemaps for array types fairly easily.

    %make_simple_array_typemap is the easiest way to get access to arrays of simple types with known bounds in your code, but this only works for arrays whose bounds are completely specified.

    38.2.3.2 Complex and unbounded arrays

    Unfortunately, unbounded arrays and pointers can't be handled in a completely general way by SWIG, because the end-condition of such an array can't be predicted. In some cases, it will be by consent (e.g. an array of four or more chars), sometimes by explicit length (char *buffer, int len), and sometimes by sentinel value (0, -1, etc.). SWIG can't predict which of these methods will be used in the array, so you have to specify it for yourself in the form of a typemap.

    38.2.3.3 Using an object

    It's possible to use C++ to your advantage by creating a simple object that provides access to your array. This may be more desirable in some cases, since the object can provide bounds checking, etc., that prevents crashes.

    Consider writing an object when the ending condition of your array is complex, such as using a required sentinel, etc.

    38.2.3.4 Example typemap for a function taking float * and int

    This is a simple example in typemap for an array of float, where the length of the array is specified as an extra parameter. Other such typemaps will work similarly. In the example, the function printfloats is called with a float array, and specified length. The actual length reported in the len argument is the length of the array passed from ocaml, making passing an array into this type of function convenient.

    tarray.i
    %module tarray
    %{
    #include <stdio.h>
    
    void printfloats( float *tab, int len ) {
      int i;
    
      for( i = 0; i < len; i++ ) {
        printf( "%f ", tab[i] );
      }
    
      printf( "\n" );
    }
    %}
    
    %typemap(in) (float *tab, int len) {
      int i;
      /* $*1_type */
      $2 = caml_array_len($input);
      $1 = ($*1_type *)malloc( $2 * sizeof( float ) );
      for( i = 0; i < $2; i++ ) {
        $1[i] = caml_double_val(caml_array_nth($input, i));
      }
    }
    
    void printfloats( float *tab, int len );
    
    Sample Run
    # open Tarray ;;
    # _printfloats (C_array [| C_double 1.0 ; C_double 3.0 ; C_double 5.6666 |]) ;;
    1.000000 3.000000 5.666600
    - : Tarray.c_obj = C_void
    

    38.2.4 C++ Classes

    C++ classes, along with structs and unions are represented by C_obj (string -> c_obj -> c_obj) wrapped closures. These objects contain a method list, and a type, which allow them to be used like C++ objects. When passed into typemaps that use pointers, they degrade to pointers through their "&" method. Every method an object has is represented as a string in the object's method table, and each method table exists in memory only once. In addition to any other operators an object might have, certain builtin ones are provided by SWIG: (all of these take no arguments (C_void))

    "~"Delete this object
    "&"Return an ordinary C_ptr value representing this object's address
    "sizeof"If enabled with ("sizeof"="1") on the module node, return the object's size in char.
    ":methods"Returns a list of strings containing the names of the methods this object contains
    ":classof"Returns the name of the class this object belongs to.
    ":parents"Returns a list of all direct parent classes which have been wrapped by SWIG.
    "::[parent-class]"Returns a view of the object as the indicated parent class. This is mainly used internally by the SWIG module, but may be useful to client programs.
    "[member-variable]"Each member variable is wrapped as a method with an optional parameter. Called with one argument, the member variable is set to the value of the argument. With zero arguments, the value is returned.

    Note that this string belongs to the wrapper object, and not the underlying pointer, so using create_[x]_from_ptr alters the returned value for the same object.

    38.2.4.1 STL vector and string Example

    Standard typemaps are now provided for STL vector and string. More are in the works. STL strings are passed just like normal strings, and returned as strings. STL string references don't mutate the original string, (which might be surprising), because Ocaml strings are mutable but have fixed length. Instead, use multiple returns, as in the argout_ref example.

    example.i
    %module example
    %{
    #include "example.h"
    %}
    
    %include <stl.i>
    
    namespace std {
      %template(StringVector) std::vector < string >;
    };
    
    %include "example.h"
    
    This example is in Examples/ocaml/stl

    Since there's a makefile in that directory, the example is easy to build.

    Here's a sample transcript of an interactive session using a string vector after making a toplevel (make toplevel). This example uses the camlp4 module.

    bash-2.05a$ ./runme_top
            Objective Caml version 3.06
    
            Camlp4 Parsing version 3.06
    
    # open Swig ;;
    # open Example ;;
    # let x = new_StringVector '() ;;
    val x : Example.c_obj = C_obj <fun>
    # x -> ":methods" () ;;
    - : Example.c_obj =
    C_list
     [C_string "nop"; C_string "size"; C_string "empty"; C_string "clear";
      C_string "push_back"; C_string "[]"; C_string "="; C_string "set";
      C_string "~"; C_string "&"; C_string ":parents"; C_string ":classof";
      C_string ":methods"]
    # x -> push_back ("foo") ;;
    - : Example.c_obj = C_void
    # x -> push_back ("bar") ;;
    - : Example.c_obj = C_void
    # x -> push_back ("baz") ;;
    - : Example.c_obj = C_void
    # x '[1] ;;
    - : Example.c_obj = C_string "bar"
    # x -> set (1, "spam") ;;
    - : Example.c_obj = C_void
    # x '[1] ;;
    - : Example.c_obj = C_string "spam"
    # for i = 0 to (x -> size() as int) - 1 do
        print_endline ((x '[i to int]) as string)
      done ;;
    foo
    bar
    baz
    - : unit = ()
    #
    

    38.2.4.2 C++ Class Example

    Here's a simple example using Trolltech's Qt Library:

    qt.i
    %module qt
    %{
    #include <qapplication.h>
    #include <qpushbutton.h>
    %}
    class QApplication {
    public:
      QApplication( int argc, char **argv );
      void setMainWidget( QWidget *widget );
      void exec();
    };
    
    class QPushButton {
    public:
      QPushButton( char *str, QWidget *w );
      void resize( int x, int y );
      void show();
    };
    

    38.2.4.3 Compiling the example

    bash-2.05a$ QTPATH=/your/qt/path
    bash-2.05a$ for file in swig.mli swig.ml swigp4.ml ; do swig -ocaml -co $file ; done
    bash-2.05a$ ocamlc -c swig.mli ; ocamlc -c swig.ml
    bash-2.05a$ ocamlc -I `camlp4 -where` -pp "camlp4o pa_extend.cmo q_MLast.cmo" -c swigp4.ml
    bash-2.05a$ swig -ocaml -c++ -I$QTPATH/include qt.i
    bash-2.05a$ mv qt_wrap.cxx qt_wrap.c
    bash-2.05a$ ocamlc -c -ccopt -xc++ -ccopt -g -g -ccopt -I$QTPATH/include qt_wrap.c
    bash-2.05a$ ocamlc -c qt.mli
    bash-2.05a$ ocamlc -c qt.ml
    bash-2.05a$ ocamlmktop -custom swig.cmo -I `camlp4 -where` \
      camlp4o.cma swigp4.cmo qt_wrap.o qt.cmo -o qt_top -cclib \
      -L$QTPATH/lib -cclib -lqt
    

    38.2.4.4 Sample Session

    bash-2.05a$ ./qt_top
            Objective Caml version 3.06
    
            Camlp4 Parsing version 3.06
    
    # open Swig ;;
    # open Qt ;;
    # let a = new_QApplication '(0, 0) ;;
    val a : Qt.c_obj = C_obj <fun>
    # let hello = new_QPushButton '("hi", 0) ;;
    val hello : Qt.c_obj = C_obj <fun>
    # hello -> resize (100, 30) ;;
    - : Qt.c_obj = C_void
    # hello -> show () ;;
    - : Qt.c_obj = C_void
    # a -> exec () ;;
    

    Assuming you have a working installation of QT, you will see a window containing the string "hi" in a button.

    38.2.5 Director Classes

    38.2.5.1 Director Introduction

    Director classes are classes which allow Ocaml code to override the public methods of a C++ object. This facility allows the user to use C++ libraries that require a derived class to provide application specific functionality in the context of an application or utility framework.

    You can turn on director classes by using an optional module argument like this:

    %module(directors="1")
    
    ...
    
    // Turn on the director class for a specific class like this:
    %feature("director")
    class foo {
      ...
    };
    

    38.2.5.2 Overriding Methods in Ocaml

    Because the Ocaml language module treats C++ method calls as calls to a certain function, all you need to do is to define the function that will handle the method calls in terms of the public methods of the object, and any other relevant information. The function new_derived_object uses a stub class to call your methods in place of the ones provided by the underlying implementation. The object you receive is the underlying object, so you are free to call any methods you want from within your derived method. Note that calls to the underlying object do not invoke Ocaml code. You need to handle that yourself.

    new_derived_object receives your function, the function that creates the underlying object, and any constructor arguments, and provides an object that you can use in any usual way. When C++ code calls one of the object's methods, the object invokes the Ocaml function as if it had been invoked from Ocaml, allowing any method definitions to override the C++ ones.

    In this example, I'll examine the objective caml code involved in providing an overloaded class. This example is contained in Examples/ocaml/shapes.

    38.2.5.3 Director Usage Example

    runme.ml
    open Swig
    open Example
    
    ...
    
    let triangle_class pts ob meth args =
      match meth with
          "cover" ->
            (match args with
                 C_list [ x_arg ; y_arg ] ->
                 let xa = x_arg as float
                 and ya = y_arg as float in
                   (point_in_triangle pts xa ya) to bool
               | _ -> raise (Failure "cover needs two double arguments."))
        | _ -> (invoke ob) meth args ;;
    
    ...
    
    let triangle =
      new_derived_object
        new_shape
        (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.6)))
        '() ;;
    
    let _ = _draw_shape_coverage '(triangle, 60, 20) ;;
    

    This is the meat of what you need to do. The actual "class" definition containing the overloaded method is defined in the function triangle_class. This is a lot like the class definitions emitted by SWIG, if you look at example.ml, which is generated when SWIG consumes example.i. Basically, you are given the arguments as a c_obj and the method name as a string, and you must intercept the method you are interested in and provide whatever return value you need. Bear in mind that the underlying C++ code needs the right return type, or an exception will be thrown. This exception will generally be Failure, or NotObject. You must call other ocaml methods that you rely on yourself. Due to the way directors are implemented, method calls on your object from with ocaml code will always invoke C++ methods even if they are overridden in ocaml.

    In the example, the draw_shape_coverage function plots the indicated number of points as either covered (x) or uncovered ( ) between 0 and 1 on the X and Y axes. Your shape implementation can provide any coverage map it likes, as long as it responds to the "cover" method call with a boolean return (the underlying method returns bool). This might allow a tricky shape implementation, such as a boolean combination, to be expressed in a more effortless style in ocaml, while leaving the "engine" part of the program in C++.

    38.2.5.4 Creating director objects

    The definition of the actual object triangle can be described this way:

    let triangle =
      new_derived_object
        new_shape
        (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.0)))
        '()
    

    The first argument to new_derived_object, new_shape is the method which returns a shape instance. This function will be invoked with the third argument will be appended to the argument list [ C_void ]. In the example, the actual argument list is sent as (C_list [ C_void ; C_void ]). The augmented constructor for a director class needs the first argument to determine whether it is being constructed as a derived object, or as an object of the indicated type only (in this case shape). The Second argument is a closure that will be added to the final C_obj.

    The actual object passed to the self parameter of the director object will be a C_director_core, containing a c_obj option ref and a c_obj. The c_obj provided is the same object that will be returned from new_derived object, that is, the object exposing the overridden methods. The other part is an option ref that will have its value extracted before becoming the ob parameter of your class closure. This ref will contain None if the C++ object underlying is ever destroyed, and will consequently trigger an exception when any method is called on the object after that point (the actual raise is from an inner function used by new_derived_object, and throws NotObject). This prevents a deleted C++ object from causing a core dump, as long as the object is destroyed properly.

    38.2.5.5 Typemaps for directors, directorin, directorout, directorargout

    Special typemaps exist for use with directors, the directorin, directorout, directorargout are used in place of in, out, argout typemaps, except that their direction is reversed. They provide for you to provide argout values, as well as a function return value in the same way you provide function arguments, and to receive arguments the same way you normally receive function returns.

    38.2.5.6 directorin typemap

    The directorin typemap is used when you will receive arguments from a call made by C++ code to you, therefore, values will be translated from C++ to ocaml. You must provide some valid C_obj value. This is the value your ocaml code receives when you are called. In general, a simple directorin typemap can use the same body as a simple out typemap.

    38.2.5.7 directorout typemap

    The directorout typemap is used when you will send an argument from your code back to the C++ caller. That is; directorout specifies a function return conversion. You can usually use the same body as an in typemap for the same type, except when there are special requirements for object ownership, etc.

    38.2.5.8 directorargout typemap

    C++ allows function arguments which are by pointer (*) and by reference (&) to receive a value from the called function, as well as sending one there. Sometimes, this is the main purpose of the argument given. directorargout typemaps allow your caml code to emulate this by specifying additional return values to be put into the output parameters. The SWIG ocaml module is a bit loose in order to make code easier to write. In this case, your return to the caller must be a list containing the normal function return first, followed by any argout values in order. These argout values will be taken from the list and assigned to the values to be returned to C++ through directorargout typemaps. In the event that you don't specify all of the necessary values, integral values will read zero, and struct or object returns have undefined results.

    38.2.6 Exceptions

    If an error occurs in a C or C++ function, you may want to convert that error into an OCaml exception. To do this, you can use the %exception directive. The %exception directive simply lets you rewrite part of the generated wrapper code to include an error check. It is detailed in full in the Exception handling with %exception section.

    In C, a function often indicates an error by returning a status code (e.g. a negative number or a NULL pointer). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (result == NULL) {
        caml_failwith("Not enough memory");
      }
    }
    void *malloc(size_t nbytes);
    

    In OCaml:

    # let a = _malloc (C_int 20000000000);;
    Exception: Failure "Not enough memory".
    #
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception {
      $action
      if (err_occurred()) {
        caml_failwith(err_message());
      }
    }
    

    If no declaration name is given to %exception, it is applied to all wrapper functions. $action is a SWIG special variable and is replaced by the C/C++ function call being wrapped.

    C++ exceptions are also easy to handle. We can catch a C++ exception and rethrow it as an OCaml exception like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        caml_failwith(e.what());
      }
    }
    
    class FooClass {
      public:
        int getitem(int index);      // Exception handling added
        ...
    };
    

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter.

    38.3 Documentation Features

    The features described in this section can be used to generate documentation comments (colloquially referred to as "docstrings") that can be read by OCamldoc.

    38.3.1 Module docstring

    The first documentation comment of an mli file is the comment associated with the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example
    

    When you have more than just a line or so, you can retain the readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus,
    controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc
    
    swig-4.0.2/Doc/Manual/android-class.png0000644000175000017500000003446613667507523017552 0ustar williamwilliam‰PNG  IHDRÎv)r8ýIDATxœí}”EÕo¼õ¼'Oó)êª D‚$BÂ?³ˆ`–1$˜L%«Aã‚c@X¢Ä>¾¸¢Æ1@\‚„5j<»ïÏÆÏèFEz¢‹Ê1ñ&Ñ ¢ G}jªëoϽUu«nßë½–Áh#xõât£À À(4êf€Ól8õÔSgΜyb- –kÖ¬Y5sN>ùdkÕŒ¶hã”SN #†“N: O‘&~Eu3ÀlÎ9çœóÎ;oéÒ¥Ë\wÝuêO<}ã߈”2ל9sæÏŸ¿dÉ’åµP*•òÌ3Ï´ÖÎhKÌ›7ï /´Òâñ<¿–d zç;ßù® z{{o¾ùæ¿ÿýï[¶lAXƯZµ ä.sÍ;÷â‹/~—‚ñññ}èCW_}õ5×\ó½ï}ï½ï}¯|ôŽw¼}ŽßaFK£ûÛßþö+®¸b``à–[nÙ¾}û—¾ô¥/~ñ‹ ¨~ô£ïÿûW®\yÆgXóž<ó¤ã§wâ´ãpŸf¦#pÒ4É:u3ÀÉ6\pÁ+\uÕU<ðÀ¿þõ¯_þò—üàÕG‹-’¹0¼ímo“úúú}ôѧžzê™gžùë_ÿú»ßýÌ Ÿ"eww·µvFû¤ùž÷¼çöÛoéö³ŸEà3ŸùÌÖ­[‡††>ÿùÏá _¸üòËÁ$fÆ®9] .8ÿ}ž·îÆ×_sã\\ën<[Öß8÷ýÏZúÖÅg½þ,L HŸ `ýóõÑ\Ìh÷»ßýnõÑùçŸ/suÖYË–-“~îãÞ{ïç pß}÷ýêW¿’O1ñ}öÙ)½n†ŸúÔ§0*a8Óâï¾ûîçž{®\.kñˆùÃþ€,û÷ïÇê J /ºè¢uëÖa€…COOÏ[ßúVܱиì²Ëhd$ Ör-<á¥<ëÆMÚt¿·ù~ïæû=-pÓ½ÿö_>fÑÂ…gvÍ9¹8É,fÞ\ ´cùÚµk±˜ùÛßþ†>ƒwî¹çÊ\0!PúmÛ¶=gÃÈÈ%@JÈÖÚ©âË_þ2†$ü`5¾¿¿Ÿþ£O~ò“j<ÈôÙgŸ}üñÇ÷îÝ‹§ øšYLÌœ9Ë üï×_ý7¾ñ_ÿú×ÿøÇ?~ó›ß|ë[ßÚ°aâñänfðÒŸÿügPfî=ôÐ_þò,1ðôÄOÔrÍš9ó¥®+oœZþ¡WþÁa廽w­Ÿýæ ß¼|Ùò[oÙò·ÿ÷·ƒÖßÿáÅ‹/¼`áé§ rJ† ޼á oÀ„…æ¢{X·Aº`ÂZ¼x1ýãÿ1HóÚ×¾v¢¹³fA Øîc÷îÝÿ·ˆ¿2üï|“¤Ú>ªÿdÄÅûÞ÷>Ð.þV•ð—Ü¿ò•¯HjÆœÿÏþsÏž=ßüæ7 ù‘ßýîwÆ2ØšÅ׿þõXY`¼ÇÀŠùá… ‚¢ c§3fÌPÓŸtÒŒ9gœvÕç^ô‘o>ïãwy»ë¿}ì.oåU3æŸ7ÃÀÀ¯õð#¿~äâÞwΟwîüyóQÚɳOžÞoH™ö4¿ÿýï?ùä“K–,ÁŠ ‚,FÐ.&D¬ùæøË\à`ðÃG>òÄÓ›"<öØc2ü“ŸüO¯»î:¤Ä„e­‘6°Ú& Ÿ¥R ¤ aôsŸûâ?þñS<8å]wÝ…HüõˆÁêaL#aYÀ„O4³qãÆ}ûöA¤Ä€i‹Dâé´iÓÔô3Nœ®èß1éºÿzÞÀ7¼ÝâZþžc¯X{ÅÏîûÙÃ=¼ÿ¾ý‡xxÁ‚ Î8ýŒ'Ì@®dœDRVl˜¡°ø:tèž{îÈ"ÅLmj.,õ¾ýíocl¸ÿþû%Ñ?úè£2Œ—Ž)iRë0£iÐà‡?üáŸþô' Æ£££ˆ¿ýöÛ1?ËÄDô—_~9ÂwÞy' w¯yÍkèô@!÷Þ{/ø ð£ýC!"ÍÑpÖ¬™‹.\¼¼wÚš›þLJ¿âýçW¼ëþË[pñQ3O˜yÂI'œý†³¿>ö­-·Λ7ÿä™'?ãø×÷šã`€©! F`€¹c­†å;þ›nº £‚ÚÊc=VfAýĪñ–[nùéO*‰þ·¿ý­ ÿüç?¿ù曑)êf¤ þ‹|~b0Öö*00#0©[o½1øëƒ,X!>,K@ÇwÑ Ä?¬X0t‚– .bÜD$žª´ æÔÙ§Î9sN÷²#úÿ·‡ëÚÿã-»â…H8õØ©¯ëz&'Θñjd:vê”)SŽ>æhäJ†^õªW]Á1Ç6øêW¿ ±iÅŠGWã¨£Ž’¹ׯ_¾aŒ—¯¢’ cäÀÓ«¯¾)‘>ÞÿÈh`†¿Á-\wíÚµtéÒË.»ŒdÐ(Èýü#=Åê%,‹£ÆW¿úÕ’¨0ØcüðÃcá„Å6Eâ)Ò¹¦¼ø¥¯è^zDÿv¯o»wÍvïŸóÖmý·u·öþÛ»ú¶Ãún;ìªÛ»ì¦Ã¦N™úÊ£^9µ˜bCg5À²h.-fÀvÚS™ë•¯|¥ŒüØÇ>&‰þ‘G‘a ÿ2 Ò[kg¤ ¬Fˆ´ø¡¡!ÄC*ExåÊ•O=õVØCfûýïÿÌ3Ï`é~Ëâ»—½ìeô¿£Z ÌåË—S$ž‚ Ì\Çwü¬Sf.Xõ¿.^wØEô/?ðv?°âšÃÞ¶î¿Ï˜qÌ©§Ÿ þA–ºàh^ô¢ý»‚·¼å-4åá\rÉ%ÿ^ ™ }˜eÔÉógpPÝH¾ø »êf"/õNÄ*´ªã­)A¦ xðmÛÓ9˜¡f^¾ó={#3@Ãõõ_ äbµ³VlõãzeØæ;ß›|O`h€°V‘ Lý|ÏðÞÔ€ï|ÏÛ½Ù3ßùž«{Ý À`0L>br÷üîÒŠRÏŠžô‘¯÷ŒT1éðIƒ[…†æ¾{öß3žÞ}|ïøÐ¶!0[Ö=f0”7•=tèÐ#‡Ä=½ë‘à^ÞR¿Þƒ‘=xè‰&lu  J¡£ö‡æÝ³î1ƒ¡D9A¥|G-O<‘u  Ê&#ë3 ª|¤)w鼂 †¥Ø¢ñwi@¦rÇ&­ð#,3ò„ êè1¹k™^õP ë¬.ûž;÷ @1ÂbÜÎÑñ»Ç±LÂ1¥%%ÁÕ%„^÷‰+ë3 „í·ý0¨ õïB8q:Ø ¼¹Œ˜ ¸g™LéCH È X&ɼ5îûÅ.#gèìì,-)‘ÿÆÞÕ½‰ßÉi$ª˜rÌ”¬ûÊ`0 ƒÁ`0 ƒÁ`0Z “&Mš=köôiӽެ›Â`4 ý¡mCååÉ“r<·çŽ=CÛ‡†w ÷]Ù—Í>mvÿzáµx쎱á‘a\}ë¢.óJtÍéj  Ñs5V>#'˜~âôÑ£ƒ›d€@-§CøÉëžßH›¦LE« ßµp™7@‡þ®»Ñs5V>#7ÀúG0À–˜ ày=+{pM>bòÀ }ëûˆ,JK„\]g‰aOÁjƒ[‡¶aí…ŸåÍe„Q=~Ê2¿`ÑÏ×±S ï<²Ù)Ã<†^Qà–Áþkû…Æ@Ž2/¡÷Ò^ÌQx*yJ{P{¡µ¹0ùÈ\ÐæáíÃ-(±ì£V>£å{ðiTø Þ2ˆåˆ¤CÔÐÙÙ‰iÁó5…P‡çÓ_ϪÏ— 6 AÝ:È„®¹Ær\!Ðî7uËÕøPô– ×ÎQYšÕk@ú˜0Òk}dhu`À_[¨@¥ÈoZ $ãj`4--/€ˆÔ‚Ÿ#ÃV Â16c¥áÈàZÖ\¹¦{®!'(ŠöH@™Ú*¨ª%j®E „ébê”`BS*ehu`56.ŒîªúûQ –ËAø¡#Më*].u°\ÁBûZ¸/h‚ú‘~xÇ0Å d±âRªq[f¥…B`¨$ÆšJÕ*5["s•V”hu„}‡ VZõ:¼@ü0Œ¼"î à`Ï_‘ÐI[“ø‰§¸hLÕ~: eÓèÛ»º¤BD…£$¿‚©FP³šÆl‰ÌEã=&ŒdJaóÔçO3ÀÈ-hh\`0Zqg£¥W`0Z<0 ¸2DORס­¦Q+Ž–Â.ɯ Fˆ5€ˆ¥…‘¿ÃS·G\ˆœ’€‘*bÉšê%&±Ýcr+¡ö³mˆ~¢‚þ ý}ëú©¥”»“R³²gem>"’€‘âÊåMeµTŒ©Úöî*@Ïg½™R(¢ù{üòœKœøÒüà'c`¤‡ÎºævGKÕ €a¤a^ž©2e÷ün„1Øã¢“cÄô®î¥§‚»˜©!™] `ðVÈzB…æ˜)–Ôj¨Òà÷c˜ÍA,@æ•q7 Bcª U-Fü%«Ù0ÒA¬‹¨ÈQÕ_Ü7 Bã*C^E&¡™Õléu…Ÿ3 Öb<0 Ø2@‡gIˆ¼ênAE)H“’s³muµ6ºŠ£Éˆ; Ü0@Ûž²+Zª•‚&‘ÓiÈJîQ[]EŠÑtÄ;ð·ð«b…Ϧä£)©JA’È(o.÷¯§ÈrV¡Ÿ£»Féû`Y]y“ÐBzÒ¼˜øè‘¬Tø Ö¬]#T6Ö÷÷¬ìAxJ´k6OÂ,=E!¨øT–0ËA R" b´>ª æÍÜÌï`N—¶ìQ~L%j¡*¥ …PÑI0–Dv Gõs^ÐhZk~ö®…~ÒÙJÀeožç*‡Þš$ RÈÖÚt™¤"­Zƒù8/sÄ’¬ ~L%ÏP c€ c'k× ©vJ´;Q܆*\Õ¡[Ô¢P#Y‚èšÛ…dֿɖ;Ê!+Z²µn]&½Õ fdŽX3@0Ô)P¦’© Ʀ­ZY¬äv5Ê“„+‹2@kž„›ðSc‡.“ÖG­ÁÖÚÍDÜsRv °0÷é´ d*yªRƒ:DEfíš=ëÒ%ŒÌæI„.ް/ìºL•EŽÚGÝ/²FÜ] ’z1Â@¬n»@¦‚§ª9€vZ…=ÚU½jùš=ÍòƒÌæ©0Ë¡ùÇ*›åLXöÅbÙG­Á,gŽÖй[éþ–bÚšçS Ft´ÆIpyS9Øt'{ü9ðfCÕ³n#.ZCl jÃw«ýÃ&Óø0)‡ Œ Ñ3ƒ‘š"$§/ä†Û†J”U{æ+ûzyƒÃÛ†ihÆ ¬¾5ÕÔÞÉÃßV—BTlEn¦!u Y}!kz‡!U'GÝfÕ`¦±V¤«i ©FQ[B˜!#íÉ¢mÙZŽ£Á¦!&µF‡ÞuPSB¶¡ý\kVÅ*@ s«{…÷´ºRùAê3@ÂúBõÒtr4]£À‘YXšú5…¨ÀˆjKàj’¡…dO®VõB¾— +'¬Áæ{Ój4õ¦Ì"ÙQ ô•æ–ìŠUÊ#4Û­+•+¤.$«/T—!M%Áªk–¦aM¡ˆjKH†¡­EgÑMáp“ðÕ¬2€µœ°›ïM«ÑÔ›2;î„#§–ôcõzt¥¼žº-;™ ]W*WPÍØJP_ÈLïF„ÔªU+„¥±V$áÐ8ÒÔ–¤¶©¶D"#…‘†D•¬å„vÊxo5=²i$oäž¿ú¢£w‡e'ë €¿ Š®T®4 ZC¨…”ÚRÕŸh•MO|œ0’R[Ê¡ú“­Ë­¡ ÔBHJm)oêOn´.ð À(4¶ ”ˆ¾ ¼Ðö3„fmçXÝS"ÁZx(«ì š1 ä"©DFéÂ’h zæ~ f¬ Ä(4x`² Ôº¨W×2·º™9lX±ìµ.ØXPJhg»@“ K8ÚÇ“GvJ- ù–i ÇÝZ 6ÔŠÆ‚ÚÙ.f ÇLie«1Wk+ 3¿”gcAù7ÔÎvÄ(¥•ÆpØXûý´¢± v¶ Dy­Ä(¥jã„òrÃacAíg,¨íi–pÌ”ó¯CÊØc8l,¨ýŒµ³] ÓN .o*ÓºÖó5®Ñ*1¬ú3€Û޵v 6ÔŠÆ‚ò¨ Ô4yÔå= n2°± Ü¢ º@Mf6”[t`0qeµEêï¶’Eó-! Å.„œ=ØRP Ö LnY¤7ƒ4ßRzÌiNâÄl)¨=K“É+Ûda)H5!¶‘ʦqÄ–‚Úqe¡µ¡_ÚÿI\Ù&KAô1~ÐŒ‘ #¦Æ[ j$p@'ö ¦4”m²²„F‚OÐfÜoQ¸`KAmdvhÀNCÙ&sKAd(Åì[ jij ZÉj–#âwrÊ6™X ’(-)Ƀz­kl)¨=Ï6èÜ.ÒK‘Û…i(Û4ßRW‘ÔQµd]ãˆ-µÒÒJö¨•-1RBZ'Ámüy.£–.3£%Àº@ŒB£ ß0ž…FA¿`0<0 –…ÏŒBƒeF¡Á3£Ð`€Qhð À(4X`<0 d€‹˜–¼Z޽O#Z+­æ`å'”d]‚¾k1ù4P~;¡àNÖH`(o*£ý›@·c/çÓˆ**U=iÒ$úó@ýdZ"fùív²ޏ2ÙtЖxᎽèëAí©i)ÈüôpÝ5*?¼Ôš¤e7cÑ'—ô‰#¥1Û ù·ò ›E¦ƒ-B˜«/k Ñ©.Àšãd­ˆ;€ñO|3.QíØKs¡>¥ÄžÓ›¥°ºÖ+j¶tOXŠãAô—‡»¾ ü[6‹´b%B]}%Dt@fºkŽ“µ" ® @vJ<ß|H•ij¿Fšû LKAXJa±þ©=Ó1–b‰3 „kEäÞÇ´Y¤+æêËRBýÈ´¶¥êd­ˆ5€0‘™ÝÆNdp[ -ÁÆ4QØ-”(ž°ÔòÌí²¶Ád‹,ÍßV%ÒêêË,¡d5s%ìd­ÝKF~*ïÎt†§:ö20ò©ÛR£ìÈħÕJ¡î Ë`ktÿV†Í"ÓׄÝÕ—QBDda.À¬¹t²VĚȖü)–C ¨Ž½4ÿYêÓš–‚f  s`õ­z=¦yÂ2ÀÚÍ¿•gØ,2lIX]}™%Dw@fuf/39'kEëÙQ¸­Ò¢‚O‚í`(XÈf€‚€gF¡Á2£Ðà€Qh° À(4x`,0 ž…ËŒBƒgF¡Á2£Ðà€Qh° À(4x`qeù©‘Wù¸¤á¦DQÀ”öm¢$ÎV£3¢)7Ô.ÔÕwFDÄdÏÿšÉõX±o‘j˜"›â©‰  ÕfÖ¯¶C\ÀÊY¿‘4foGµocµícÖ+ T ¡Ûé<²SÚ·CJ ·j.wDƒ7—Ñ´£™â‘tØ¢/ýMFT£ÖwÙKöê– _š‘†Š¸3€´ A†!âX¿‘ÿk˜½*û6†mk½’d$4c;V˜h¶³ ª¡À°‚føHi³fkHûØß4a¤íÑ^”™ÝÚ”áŸ,(’—¶~£þ¯V{;h¶}¬õJÐ,Vx†­+È\î.X …0€ijE3÷bš0r0€%»ÍäÃäe€†­ßT-ëCìí˜D¥^«À Û9b²d,!ˆ¬"‡»ƒÁ:°QÐúÞè-a8‘¼ аõ™Ìaog¾ʹIX½VÐŒíL,É|ó8pwP’úfd!¦­!m ã0adöݺ2Y‘—@¤² Ô˜õu` ³·3aMÈFsaõ†m©Æv<ߘ([ˆÎÀÝAÙÕ,Ä´5¤Ù;r˜0²ö]Ën¶„…`7X¨yàýû‚O‚›f€‚ušf€‚gF¡Ñ CptX°9jŒE!§CȦêùTjBžï ;è ±ÏÃJA9Gê3–¿rÿ;ÛYÆÖY)(ÿH]hÛ—=+{èË@PøÏ4Çàù{8¤z)­’D±,䀩äù§ˆ— ÐØ5X+e¥ ü£2þ{a£¦¢ó£š9c:“TѲP]ÚA•Ó’@ÛÐ :"ÐNX)(ÿhÒ9@×Ü.úp[=%ËMVÀ0‰§˜hùѲšvD|¿ †TŒy±RPþѼ] °M0 ò€R‰(AR’¢XŠ¢„yl#Ù)þH*e¥ ÖBúßTÊ9‚ˆ«–@#b däÁÀItƒ€É1µƒ4¨ Иšœ‚ÄZhÄŸX)¨uþ÷s»hÄ•%’Œ­ tƒ<þž ©Ð™ àÅÓÒ 2€×š:E9.V j9d© ¶˜N yÐb¥ ¼!Ë“à&3@´ƒX)(oÈR¨É À`˜`] F¡Ñ¶ß0QÀ3£Ðàï…ÏŒBƒeF¡Á3£Ð`€Qhð À(4X`<0 –…ÏŒB#® `u”͈ù•LRß ”V3Dê'£‰TÑÆŸ1¤â)ž žJU5ý¦EntH©‚ÀЏ2€•4»=Ñ­ú4fÉÈ…£t#S’QJ€æ -ëû{VöëH¢9G±Â½ßê^Üé³É°öÈZ´ôîWÑ»ªwl÷£³Ÿhfï$´àŽ¿C~hêù¦Ô*è#R2Êd­+ì•ZóšV”î«ÅªßŽf…¸3Þ¯´¾·0íöD´ê#Ð9 ¼åÀæŸ=°ÇæƒlCP9ôõ:zK_¬ ›%+JŽbÕ\øGÉkÚG-Azç« ËH²®0ŸhZï&šg4€zWe'¦º TM†:ÍqSب*½óU¨oO³ ¤fÑz7Ѽ(K [Ž*ô•y­VÍîë}ÉÁ(•] ÍnOD«> ›BŸ‡‚ .´h÷Y(Ìu¡E»Ï3£ÐhI mÆæ¨ ë²,6BÊŒ’«f:À¢]|ȵºó(_º¥°é-Ì'Z]¹èPœdb¹»Õ»ª7p–Þ,šVêÒœiu*ÛîÁvj­î»Ky‰}˜ÊѲæ³D\ÞTVw–´ìVŸhõæ"ÿTT;Ë]»–@:HQ0UeTEšþõbøÝ5Š÷"Jhº"Ò©2Ò°Ñ5§ ÕúïZËñ*vÉ1Þhû÷¦‹¦ô¦VDÇŸò¨{~7míY ´êY•‹ÂT€$L‡†n’µËzÉþ‹õüã3j<„+m»#Yˆ”MhVŸhå2»#a~GZ3@Ø9Q Þ5QxCŽž¡+B§‰žOdôŸ!FlBWÞTX9ø?ĬŒpÚù«§h°h5šjE¦¶ i›¡À`Ù®£ëÙ”‹ÂT€$Lsï§Š|¥a]6K&$ÈE¯ýE㉨wÈ"Iy²áÍŒi8Auß&yµi†ìÓ’ÜšÒu$Q†Ì¥éŠ †Rü7 {ð€Eð¢}H°–£yaQ@×`Ñ”^ µ"S[¤† Ga:TbôSçpÝ ‡ZŽ›¬ºIj³dTMzÔä3àÓŠEJR–0= É˜ÆrÄúGj¹vˆ±’(\:‰"­À­ãùÄAÓ·¦äX¥+â¿¢ðfÉÓžgœìšå„Qƒ©Á¢×èéjEæ?Æà/¤AË­¿T„ýåÁЮÀ\38ºl–Œ\;H®À–K d t{wÝ^ͯ¦æMÆ4–Ë«,¤<£vÁáˆ-Y¤%¸rˆ²'RWtBL½$„ÕP˜¾t)'pˆTWdzSƒE«ÑT+ÒµeüOL¨|½šÑTª1›ªj6fízöšuµ4òò=@½´ôéA=ˆ%UiZÓQ¡%6•aÔ\¨B=÷‘Wu`RŽÙT3yx쨮j¦ÑΧ[¹™êµT¾1tÏï&º4ý,hÍ žÈh  éÀhP›Ê0tôkdXæ¥z Ú€u’¡":³*ÕhMµ¦ÑÔlµËã këki]äE¨×"–>=€Ôå„JÓ3±Z T†A/@ÙHƒ»d?U=%áýpÔªf£­|&ÒØÔl¬µ«Gøai¬uµ(r1ÔkÈ®ÒS?Ü3€„Jy*M»u`¼ðlê1R§@SÁJC*)^ »Sƒ€Ò¸ÕlTTg5U¢i=XëjEäB¨×"™>qÈ¿V¨$(Òž•¦'f€jC7š ”l¨Ð”–”HIÁT ÞƒŸ˜Î,Çlª™Æ¡f#k'˜æúÔ4a¯¥u‘‹ ^‹@fúÄA—Ð2ZwÝ  ºQ[UhH”G¢9‹zŒ²æ&õ³³©–ºlj6Zí^µ:š5MØki]äE`02A.f#+äB`0²ÏŒB£%e€†Õ*µ8â6£ZKǪÉ#¡©âDÔ52x¢(Ñ—1ƒ¾¹/DÉG«+Š"Y»µ…¦òRžÑª3@#;ÐÕ>¹âCÛ ±jòLUœ(ºFV;95‚\Á^™ÖfùÕ„U¯IMcUª©bd¾–œ#2€i0Çsz×R5[¢;ÿRf¹ËÒfÇœ9A9,Þ8tÌ\QÄ™×*û™—Tò1ë2Ó˜Š@QTŒbM6¹˜,s܎ƪ ãDuþ¥ºKq{ïªÀqTljéH¨†n$L‹7Qt´\QD÷+;ýh¡UÉÇZ—–ÆTŠ¢bäx-ùD.dÓ^ˆÛ»–u@­íüKa€Þ»" LK§ÊÐD¸Å‡®‘;W˜"PhJ>z]¶4E 0#‡òR>‘—Àd‡w-«Y„ÚοªÀ彫× `ÓÒÑ4yÔrª8aºFî\aŠ@aK SÉÇd€èŠ@a*Fnå¥"/2@]Þµ¢0€ÕքìZÞ»¢´ÙÔÒÑ5ê*ªA¦*N]#3WE Í",ÙTò1À­EÅÈ|-Þe–ÈÑ Ý»V0Kð‡Yîò#BÓÒ15y&Tƒ UœHºFF®(Š@2—*'˜Ë}j*ET1Ò^KΑ Ù J#"ò2002A^dfF&ÈÅ À`d…\Èõ¢Á›ü!bÃÖ¬]hàTÛpNÍ÷fêIÈŒ´½†µê Pa³O›-• Òû“šï5Ìm˜ˆ  ^ÃØGXÞ}„I/8(“vQ¨½–*:Ò\v}v–²ðf5:D]CJjƒC‡*)°°¼û£Q¸ô6(}#ìc€ºì,eâ5ÌÔ52»æ¥ï5Œ}„åÝGÜC¡aj×W„0@]v–²ò¦é™]k‚×0ö–wa4`›T"Fô `8Ôkg)s¯a¤Xav­ ^ÃØGXÞ}„É?Eɪ)­ªô½G†i=S—¥L¼†IH]#³kMðÆ>Âòî# y©ƒr»07•I¡·„4b2ôg€zí,yYx ól†‰4ù¾ ^ÃØGXóøn¬ö½KLÓkûkrÎÅûk˜rˆV= f0AKê5 †•ÍÞŽ5Æ‘˜‘Cð  »•ÅÞŽÃÛ8#?ÈÅ÷^.}„i–sÌÍx¹Bnf€üùó ‡Hš¹‡Ç#F® Ÿ>˜Ú¹˜rë#Œ—@m\È9ôF°[ê”fhM <Šþˆ‘KäbÈ¡0‚i©S³·£Å¨ÊHfbF‘€Áȹ˜Œ¬ €ÁÈ <0 –”V«LCUMß°jPË¡Ug€<øóªMß°jP+"2€i0Ç˽0Ï0}Ãçb­ˆ\̃9¹÷æ¦oX3¢‘ À´’a¦éf€VD^f€–ófš¾á%P+"/2@Ëù“P­ÿ±jPË!G3@Ëù#¨ÖÿX5¨å ñ J# ò2002A^dfF&ÈÅ À`d…\È FVà€QhäB`0²ÏŒBƒeF¡Á3£Ð`€Qhð À(4X`<0 –…ÏŒB#¶ Ð!¼4ƒ‡†G†Éy‚>¢w —7•'Mš4û´Ù}ëú¬ŸÂXÁ¦Œ(ˆ;ôoè§Ï¯<ÿ¨$›V)Ÿ>àšrÌr¶Î ÀH±dë®`ƒòæ2…¥'wÓÆuü);ôŸ*$ q3}vˆ&‰¯Š•5]Œ‰l–…¯ù\2»cµb¼[9²v2 !?Š—cZ¥¿ÏhbÍøçL]Š1Œð€&zVöˆ>¹k?UH 8õªÎâÕïÐkºSí i5Z@³b¤6O+'° çƒìJÍ ÏgBjbòïå»]KP@ ½;†1È™c1Âã[,­(vªªˆÎÂôHe1¦&ˆâbLµË‚ÁX¥i+hF\ÔJµrÔVÉñ~P¡SȈÚÑa`‹· 2B¬@X=P–@øw“lŠÁb€À2Åwöb¢×~VÔt1¦–&WÍî¸@+Çdô"Lnö†e• ÷@x“®P1@•)‘aZiFx$•“¥Ní§Z~]K 2@KUk¦xÜ.Æ `éŽaÅÈlž,Ç\Q@ÔÛp &H0š‰¸»@ Œ‹ Ú ÌЮîÅO!úC¦gáÁO’ é¿×~J¨Û ã‚iÁ¥ Á5]Œ9ÀìŽÕŠ‘Ö<µœ !¸b>ˆh £ƒ$02ëÕ Þ`m'ðIpÝ`h'°.PÝ`h'ð À(4âÊ]_µÐ¨ÙBMeÄG¬ ºë«Ö¢ªF1Z±d‡ßSÛ‡v!i‘Ò˜ 9Q<…Yµ†4_Ö\a®ÄÌfL8 Qb´ bÍÏ?šzzx$N»(e¸BN˜§°0­¡Éª±ÿ_VWbÖf˜È´ó8FÛ – à`]ÛǦlãPÈ õ¢5¤æuûÿ2ýh˜Í0i BŒ¶A¬ †ë+E½Ç<"µ*äÔô¦+ã´s_‡ÿ/zAîãaF{ Þ÷ᮯ4õ“˜¬ 95=……i U9PrúÿÒÀ¡Ä PÄ=s}¥©÷XµÄL…œšžÂ´†´]&‡ÿ/Ó—^˜^3@#] ÖÚ*e´rtÌ Àh>r¤ Ä Àh>r40ÍGövè‡F&ÈÞ.3#C$oÈ3,áXczVöÐþ#i’¢zUÞT–{ xp”ÿ1®g3ïÃ`ÄDòvÌÏÀ͘àvÏ'îÃÄâlòÄ)}bïUìFÙÍû0ñ¼] Óˆ;&0 eèA2¦n\(^Ç äíÅg$ õa1ªò¥]/ˆÁˆ‡äíÕ½Q–@ÕÆv0€è¥-MÇÁˆTì™–pÌ‚é+b «Š@ˆÝ5*E^MÇÁˆéY!–X†Å\#)äú$xú´é<Ø3REŽt4Ðg»i8Ý`0$r=0i#® 0¶{ Ëtqˆ»¹ìPg{T¯D 7q„Ži.ƒQ¸3€Fˆ‹:ÖG13’B\@e‡EªGµì™:?šâ2ºíp1‘ä à°¨#Õ´dêü˜ŠCž §Û !1@sâ«YÔQíG¸í™:?¦Þ„çsKÜ®3éͺ u­ï´dêüX€½ª0AZ2@Ô´dêü˜ŠCyC#&š=Ô´äÙt~4Å!¡…Ê»@Œ$€`tçh~uŒTñ À'ÁŒ‚‚f€<ê1MQÁ˜EĤÃ'uÍéÂ<ÀZ÷ ƒÁ`0 ƒÁ`0 +þ?³ºýÿí¦b IEND®B`‚swig-4.0.2/Doc/Manual/Modula3.html0000644000175000017500000006223413667507523016505 0ustar williamwilliam SWIG and Modula-3

    31 SWIG and Modula-3

    This chapter describes SWIG's support for Modula-3. You should be familiar with the basics of SWIG, especially typemaps.

    31.1 Overview

    Modula-3 is a compiled language in the tradition of Niklaus Wirth's Modula 2, which is in turn a successor to Pascal.

    SWIG's Modula-3 support is currently very basic and highly experimental! Many features are still not designed satisfyingly and I need more discussion about the odds and ends. Don't rely on any feature, incompatible changes are likely in the future! However, the Modula-3 generator was already useful for interfacing to the libraries:

    1. PLPlot
    2. FFTW

    31.1.1 Motivation

    Although it is possible to write Modula-3 code that performs as well as C/C++ most existing libraries are not written in Modula-3 but in C or C++, and even libraries in other languages may provide C header files.

    Fortunately Modula-3 can call C functions, but you have to write Modula-3 interfaces to them, and to make things comfortable you will also need wrappers that convert between high-level features of Modula-3 (garbage collecting, exceptions) and the explicit tracking of allocated memory and exception codes used by C APIs.

    SWIG converts C headers to Modula-3 interfaces for you, and using typemaps you can pass TEXTs or open arrays, and convert error return codes into exceptions.

    If the library API is ill designed writing appropriate typemaps can still be time-consuming. E.g. C programmers are very creative to work-around missing data types like (real) enumerations and sets. You should turn such work-arounds back to the Modula-3 way otherwise you lose static safety and consistency.

    Without SWIG you would probably never consider trying to call C++ libraries from Modula-3, but with SWIG this is becomes feasible. SWIG can generate C wrappers to C++ functions and object methods that may throw exceptions, and then wrap these C wrappers for Modula-3. To make it complete you can then hide the C interface with Modula-3 classes and exceptions.

    SWIG allows you to call C and C++ libraries from Modula-3 (even with call back functions), but it doesn't allow you to easily integrate a Modula-3 module into a C/C++ project.

    31.2 Conception

    31.2.1 Interfaces to C libraries

    Modula-3 has integrated support for calling C functions. This is also extensively used by the standard Modula-3 libraries to call OS functions. The Modula-3 part of SWIG and the corresponding SWIG library modula3.swg contain code that uses these features. Because of the built-in support there is no need for calling the SWIG kernel to generate wrappers written in C. All conversion and argument checking can be done in Modula-3 and the interfacing is quite efficient. All you have to do is to write pieces of Modula-3 code that SWIG puts together.

    C library support integrated in Modula-3
    Pragma <* EXTERNAL *> Precedes a declaration of a PROCEDURE that is implemented in an external library instead of a Modula-3 module.
    Pragma <* CALLBACK *> Precedes a declaration of a PROCEDURE that should be called by external library code.
    Module Ctypes Contains Modula-3 types that match some basic C types.
    Module M3toC Contains routines that convert between Modula-3's TEXT type and C's char * type.

    In each run of SWIG the Modula-3 part generates several files:

    Module name scheme Identifier for %insert Description
    ModuleRaw.i3 m3rawintf Declaration of types that are equivalent to those of the C library, EXTERNAL procedures as interface to the C library functions
    ModuleRaw.m3 m3rawimpl Almost empty.
    Module.i3 m3wrapintf Declaration of comfortable wrappers to the C library functions.
    Module.m3 m3wrapimpl Implementation of the wrappers that convert between Modula-3 and C types, check for validity of values, hand-over resource management to the garbage collector using WeakRefs and raises exceptions.
    m3makefile m3makefile Add the modules above to the Modula-3 project and specify the name of the Modula-3 wrapper library to be generated. Today I'm not sure if it is a good idea to create a m3makefile in each run, because SWIG must be started for each Modula-3 module it creates. Thus the m3makefile is overwritten each time. :-(

    Here's a scheme of how the function calls to Modula-3 wrappers are redirected to C library functions:

    Modula-3 wrapper
    Module.i3
    generated by Modula-3 part of SWIG
    |
    v
    Modula-3 interface to C
    ModuleRaw.i3
    generated by Modula-3 part of SWIG
    --> C library

    I have still no good conception how one can split C library interfaces into type oriented interfaces. A Module in Modula-3 represents an Abstract DataType (or call it a static classes, i.e. a class without virtual methods). E.g. if you have a principal type, say Database, it is good Modula-3 style to set up one Module with the name Database where the database type is declared with the name T and where all functions are declared that operates on it.

    The normal operation of SWIG is to generate a fixed set of files per call. To generate multiple modules one has to write one SWIG interface (different SWIG interfaces can share common data) per module. Identifiers belonging to a different module may ignored (%ignore) and the principal type must be renamed (%typemap).

    31.2.2 Interfaces to C++ libraries

    Interfaces to C++ files are much more complicated and there are some more design decisions that are not made, yet. Modula-3 has no support for C++ functions but C++ compilers should support generating C++ functions with a C interface.

    Here's a scheme of how the function calls to Modula-3 wrappers are redirected to C library functions:

    Modula-3 wrapper
    Module.i3
    generated by Modula-3 part of SWIG
    C++ library
    |
    v
    ^
    |
    Modula-3 interface to C
    ModuleRaw.i3
    generated by Modula-3 part of SWIG
    --> C interface to C++
    module_wrap.cxx
    generated by the SWIG core

    Wrapping C++ libraries arises additional problems:

    • Is it sensible to wrap C++ classes with Modula-3 classes?
    • How to find the wrapping Modula-3 class for a class pointer that is returned by a C++ routine?
    • How to deal with multiple inheritance which was neglected for Modula-3 for good reasons?
    • Is it possible to sub-class C++ classes with Modula-3 code? This issue is addressed by directors, a feature that was experimentally added to some Language modules like Java and Python.
    • How to manage storage with the garbage collector of Modula-3? Support for %newobject and %typemap(newfree) isn't implemented, yet. What's about resources that are managed by the garbage collector but shall be passed back to the storage management of the C++ library? This is a general issue which is not solved in a satisfying fashion as far as I know.
    • How to turn C++ exceptions into Modula-3 exceptions? There's also no support for %exception, yet.

    Be warned: There is no C++ library I wrote a SWIG interface for, so I'm not sure if this is possible or sensible, yet.

    31.3 Preliminaries

    31.3.1 Compilers

    There are different Modula-3 compilers around: cm3, pm3, ezm3, Klagenfurth Modula-3, Cambridge Modula-3. SWIG itself does not contain compiler specific code but the modula3.swg library file may do so. For testing examples I use Critical Mass cm3.

    31.3.2 Additional Commandline Options

    There are some experimental command line options that prevent SWIG from generating interface files. Instead files are emitted that may assist you when writing SWIG interface files.

    Modula-3 specific options Description
    -generateconst <file> Disable generation of interfaces and wrappers. Instead write code for computing numeric values of constants to the specified file.
    C code may contain several constant definitions written as preprocessor macros. Other language modules of SWIG use compute-once-use-readonly variables or functions to wrap such definitions. All of them can invoke C code dynamically for computing the macro values. But if one wants to turn them into Modula-3 integer constants, enumerations or set types, the values of these expressions has to be known statically. Although definitions like (1 << FLAG_MAXIMIZEWINDOW) must be considered as good C style they are hard to convert to Modula-3 since the value computation can use every feature of C.
    Thus I implemented these switch to extract all constant definitions and write a C program that output the values of them. It works for numeric constants only and treats all of them as double. Future versions may generate a C++ program that can detect the type of the macros by overloaded output functions. Then strings can also be processed.
    -generaterename <file> Disable generation of interfaces and wrappers. Instead generate suggestions for %rename.
    C libraries use a naming style that is neither homogeneous nor similar to that of Modula-3. C function names often contain a prefix denoting the library and some name components separated by underscores or capitalization changes. To get library interfaces that are really Modula-3 like you should rename the function names with the %rename directive. This switch outputs a list of such directives with a name suggestion generated by a simple heuristic.
    -generatetypemap <file> Disable generation of interfaces and wrappers. Instead generate templates for some basic typemaps.

    31.4 Modula-3 typemaps

    31.4.1 Inputs and outputs

    Each C procedure has a bunch of inputs and outputs. Inputs are passed as function arguments, outputs are updated referential arguments and the function value.

    Each C type can have several typemaps that apply only in case if a type is used for an input argument, for an output argument, or for a return value. A further typemap may specify the direction that is used for certain parameters. I have chosen this separation in order to be able to write general typemaps for the modula3.swg typemap library. In the library code the final usage of the type is not known. Using separate typemaps for each possible use allows appropriate definitions for each case. If these pre-definitions are fine then the direction of the function parameter is the only hint the user must give.

    The typemaps specific to Modula-3 have a common name scheme: A typemap name starts with "m3", followed by "raw" or "wrap" depending on whether it controls the generation of the ModuleRaw.i3 or the Module.i3, respectively. It follows an "in" for typemaps applied to input argument, "out" for output arguments, "arg" for all kind of arguments, "ret" for returned values.

    The main task of SWIG is to build wrapper function, i.e. functions that convert values between C and Modula-3 and call the corresponding C function. Modula-3 wrapper functions generated by SWIG consist of the following parts:

    • Generate PROCEDURE signature.
    • Declare local variables.
    • Convert input values from Modula-3 to C.
    • Check for input value integrity.
    • Call the C function.
    • Check returned values, e.g. error codes.
    • Convert and write back values into Modula-3 records.
    • Free temporary storage.
    • Return values.
    Typemap Example Description
    m3wrapargvar $1: INTEGER := $1_name; Declaration of some variables needed for temporary results.
    m3wrapargconst $1 = "$1_name"; Declaration of some constant, maybe for debug purposes.
    m3wrapargraw ORD($1_name) The expression that should be passed as argument to the raw Modula-3 interface function.
    m3wrapargdir out Referential arguments can be used for input, output, update. ???
    m3wrapinmode READONLY One of Modula-3 parameter modes VALUE (or empty), VAR, READONLY
    m3wrapinname New name of the input argument.
    m3wrapintype Modula-3 type of the input argument.
    m3wrapindefault Default value of the input argument
    m3wrapinconv $1 := M3toC.SharedTtoS($1_name); Statement for converting the Modula-3 input value to C compliant value.
    m3wrapincheck IF Text.Length($1_name) > 10 THEN RAISE E("str too long"); END; Check the integrity of the input value.
    m3wrapoutname Name of the RECORD field to be used for returning multiple values. This applies to referential output arguments that shall be turned into return values.
    m3wrapouttype Type of the value that is returned instead of a referential output argument.
    m3wrapoutconv
    m3wrapoutcheck
    m3wrapretraw
    m3wrapretname
    m3wraprettype
    m3wrapretvar
    m3wrapretconv
    m3wrapretcheck
    m3wrapfreearg M3toC.FreeSharedS(str, arg1); Free resources that were temporarily used in the wrapper. Since this step should never be skipped, SWIG will put it in the FINALLY branch of a TRY .. FINALLY structure.

    31.4.2 Subranges, Enumerations, Sets

    Subranges, enumerations, and sets are machine oriented types that make Modula very strong and expressive compared with the type systems of many other languages.

    • Subranges are used for statically restricted choices of integers.
    • Enumerations are used for named choices.
    • Sets are commonly used for flag (option) sets.

    Using them extensively makes Modula code very safe and readable.

    C supports enumerations, too, but they are not as safe as the ones of Modula. Thus they are abused for many things: For named choices, for integer constant definitions, for sets. To make it complete every way of defining a value in C (#define, const int, enum) is somewhere used for defining something that must be handled completely different in Modula-3 (INTEGER, enumeration, SET).

    I played around with several %features and %pragmas that split the task up into converting the C bit patterns (integer or bit set) into Modula-3 bit patterns (integer or bit set) and change the type as requested. See the corresponding example in the Examples/modula3/enum/example.i file. This is quite messy and not satisfying. So the best what you can currently do is to rewrite constant definitions manually. Though this is a tedious work that I'd like to automate.

    31.4.3 Objects

    Declarations of C++ classes are mapped to OBJECT types while it is tried to retain the access hierarchy "public - protected - private" using partial revelation. Though the example in Examples/modula3/class/example.i is not really useful, yet.

    31.4.4 Imports

    Pieces of Modula-3 code provided by typemaps may contain identifiers from foreign modules. If the typemap m3wrapinconv for blah * contains code using the function M3toC.SharedTtoS you may declare %typemap("m3wrapinconv:import") blah * %{M3toC%}. Then the module M3toC is imported if the m3wrapinconv typemap for blah * is used at least once. Use %typemap("m3wrapinconv:import") blah * %{MyConversions AS M3toC%} if you need module renaming. Unqualified import is not supported.

    It is cumbersome to add this typemap to each piece of Modula-3 code. It is especially useful when writing general typemaps for the modula3.swg typemap library. For a monolithic module you might be better off if you add the imports directly:

    %insert(m3rawintf) %{
    IMPORT M3toC;
    %}
    

    31.4.5 Exceptions

    Modula-3 provides another possibility of an output of a function: exceptions.

    Any piece of Modula-3 code that SWIG inserts due to a typemap can raise an exception. This way you can also convert an error code from a C function into a Modula-3 exception.

    The RAISES clause is controlled by typemaps with the throws extension. If the typemap m3wrapinconv for blah * contains code that may raise the exceptions OSError.E you should declare %typemap("m3wrapinconv:throws") blah * %{OSError.E%}.

    31.4.6 Example

    The generation of wrappers in Modula-3 needs very fine control to take advantage of the language features. Here is an example of a generated wrapper where almost everything is generated by a typemap:

             (* %relabel  m3wrapinmode m3wrapinname m3wrapintype  m3wrapindefault *)
      PROCEDURE Name     (READONLY       str       :    TEXT    :=      ""       )
                  (* m3wrapoutcheck:throws *)
         : NameResult RAISES {E} =
        CONST
          arg1name = "str";                  (* m3wrapargconst *)
        VAR
          arg0   : C.char_star;              (* m3wrapretvar *)
          arg1   : C.char_star;              (* m3wrapargvar *)
          arg2   : C.int;
          result : RECORD
               (*m3wrapretname  m3wraprettype*)
                     unixPath : TEXT;
               (*m3wrapoutname  m3wrapouttype*)
                     checksum : CARDINAL;
                   END;
        BEGIN
          TRY
            arg1 := M3toC.SharedTtoS(str);   (* m3wrapinconv *)
            IF Text.Length(arg1) > 10 THEN   (* m3wrapincheck *)
              RAISE E("str too long");
            END;
     (* m3wrapretraw           m3wrapargraw *)
            arg0 := MessyToUnix  (arg1,   arg2);
            result.unixPath := M3toC.CopyStoT(arg0);  (* m3wrapretconv *)
            result.checksum := arg2;         (* m3wrapoutconv *)
            IF result.checksum = 0 THEN      (* m3wrapoutcheck *)
              RAISE E("invalid checksum");
            END;
          FINALLY
            M3toC.FreeSharedS(str, arg1);     (* m3wrapfreearg *)
          END;
        END Name;
    

    31.5 More hints to the generator

    31.5.1 Features

    Feature Example Description
    multiretval %m3multiretval get_box; or %feature("modula3:multiretval") get_box; Let the denoted function return a RECORD rather than a plain value. This RECORD contains all arguments with "out" direction including the return value of the C function (if there is one). If more than one argument is "out" then the function must have the multiretval feature activated, but it is explicitly requested from the user to prevent mistakes.
    constnumeric %constnumeric(12) twelve; or %feature("constnumeric", "12") twelve; This feature can be used to tell Modula-3's back-end of SWIG the value of an identifier. This is necessary in the cases where it was defined by a non-trivial C expression. This feature is used by the -generateconst option. In future it may be generalized to other kind of values such as strings.

    31.5.2 Pragmas

    Pragma Example Description
    unsafe %pragma(modula3) unsafe="true"; Mark the raw interface modules as UNSAFE. This will be necessary in many cases.
    library %pragma(modula3) library="m3fftw"; Specifies the library name for the wrapper library to be created. It should be distinct from the name of the library to be wrapped.

    31.6 Remarks

    • The Modula-3 part of SWIG doesn't try to generate nicely formatted code. If you need to read the generated code, use m3pp to postprocess the Modula files.
    swig-4.0.2/Doc/Manual/Makefile0000644000175000017500000001314513667507523015750 0ustar williamwilliam# Makefile for generating the SWIG documentation # # Note that the htmldoc package needs to be installed. wkhtmltopdf patched with qt is also required # and can be installed from http://wkhtmltopdf.org/downloads.html. # # The .html files are first processed and updated with chapter numbering and anchor names # are added to the HTML headings using the python scripts. The htmldoc program is then # used to generate the single page HTML version of the documentation. # wkhtmltopdf is used to generate the pdf document from the single page html file. # HTML TIDY (package also known as tidy) is also required and is used as an aid to HTML # validation. # # Additional html validation can be done using the validate target. # Additional link checking can be done using the linkchecker1 and linkchecker2 target. # # Note the # and " are escaped HTMLDOC_OPTIONS = "--book --toclevels 4 --no-numbered --toctitle \"Table of Contents\" --title --titleimage swig16.png --linkcolor \#0000ff --linkstyle underline --size Universal --left 0.50in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --footer h.1 --nup 1 --tocheader .t. --tocfooter ..i --portrait --color --no-pscommands --no-xrxcomments --compression=1 --jpeg=0 --fontsize 10.0 --fontspacing 1.2 --headingfont Helvetica --bodyfont Times --headfootsize 10.0 --headfootfont Helvetica --charset iso-8859-1 --links --no-embedfonts --pagemode outline --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password \"\" --user-password \"\" --browserwidth 680" .PHONY: maketoc check generate all maintainer-clean validate test all: maketoc check generate maketoc: python maketoc.py # Use this to regenerate CCache.html should this ever be needed CCache.html: ../../CCache/ccache.yo yodl2html -o CCache.html ../../CCache/ccache.yo # Tabs in the html files will stop the build as wkhtmltopdf does not expand them correctly - replace them with the appropriate number of tabs # Use htmltidy to warn about some HTML errors. Note that it is not used to clean/tidy the HTML, # it is just used as a primitive HTML checker. # CCache.html is generated by yodl2html and has a few insignificant problems, so we don't put it through tidy check: all="index.html Sections.html `sed '/^#/d' chapters | grep -v CCache.html`" && for a in $$all; do echo "Check for tabs $$a" && if grep -P '\t' $$a; then echo "Please delete the tabs from the lines above" && exit 1; fi; done && for a in $$all; do echo "HTML tidy check $$a" && tidy -errors --gnu-emacs yes -quiet $$a; done; # Note wkhtmltopdf limitations for generating pdf docs: # 1)

    Text

    style links don't work and need changing to #

    Text

    # 2) Tabs in
     elements should be expanded to 8 spaces by default, but
    #     are expanded to just one space and css tab-size is not working.
    #  3) 
       elements do not always select a fixed-width font - try installing the
    #     Courier font to fix - these have been added to style.css.
    generate: SWIGDocumentation.html
    	wkhtmltopdf --version | grep "with patched qt" || (echo "wkhtmltopdf is not the patched qt version and so cannot be used - download it from http://wkhtmltopdf.org/downloads.html" && false)
    	wkhtmltopdf --margin-top 20mm --margin-bottom 20mm --margin-left 10mm --margin-right 10mm --header-font-size 6 --footer-font-size 6 --header-spacing 6 --footer-spacing 6 --header-center '[doctitle]' --footer-left '[subsection]' --footer-right '[page]' SWIGDocumentation.html SWIGDocumentation.pdf
    
    SWIGDocumentation.html: swightml.book
    	htmldoc --batch swightml.book || true
    	python fixstyle.py SWIGDocumentation.html
    
    swightml.book: chapters Sections.html
    	echo "#HTMLDOC 1.8.24" > swightml.book
    	echo -t html -f SWIGDocumentation.html $(HTMLDOC_OPTIONS) >> swightml.book
    	echo "Sections.html" >> swightml.book
    	cat chapters >> swightml.book
    
    maintainer-clean: clean-baks
    	rm -f swightml.book
    	rm -f SWIGDocumentation.html
    	rm -f SWIGDocumentation.pdf
    	rm -rf linkchecker-tmp
    
    clean-baks:
    	rm -f *.bak
    
    test:
    	grep "href=\".*\.html\"" index.html
    	grep "href=\".*\.html\"" Sections.html
    	all=`sed '/^#/d' chapters`; for a in $$all; do grep -l "href=\".*\.html\"" $$a; done;
    
    # Validating using the WDG offline validator - http://www.htmlhelp.com/tools/validator/offline/
    validate:
    	all=`sed '/^#/d' chapters`; for a in $$all; do validate --emacs $$a; done;
    
    # Link checking using linkchecker of the index.html only file (including anchors)
    linkchecker1:
    	@echo -----------------------------------------------------------------------
    	@echo Note linkchecker versions prior to 6.1 do not work properly wrt anchors
    	@echo -----------------------------------------------------------------------
    	linkchecker --config=./linkchecker.config --anchors index.html
    
    # Check for links which don't work including those generated from the individual .html files into SWIGDocumentation.html
    linkchecker2:
    	rm -rf linkchecker-tmp
    	mkdir linkchecker-tmp
    	cp SWIGDocumentation.html linkchecker-tmp
    	cp *.png linkchecker-tmp
    	(cd linkchecker-tmp && linkchecker --config=../linkchecker.config -F text --no-warnings SWIGDocumentation.html)
    
    # Simple check for relative links (there shouldn't be any), they don't translate properly creating the .pdf doc
    # with wkhtmltopdf. For example, href="SWIG.html" needs to be href="SWIG.html#SWIG"
    linkchecker3:
    	@echo "The following list should just contain SWIGDocumentation.html and SWIGDocumentation.pdf,"
    	@echo "as all links should have an anchor (with a #) or be a full url beginning http."
    	grep 'href="' *.html | sed -e 's/.*href="\(.*\)">.*$$/\1/' | grep -v "#" | grep -v "^http" | grep -v "^style.css"
    swig-4.0.2/Doc/Manual/Python.html0000644000175000017500000062372413667507563016475 0ustar  williamwilliam
    
    
    SWIG and Python
    
    
    
    
    
    

    32 SWIG and Python

    Caution: This chapter is under repair!

    This chapter describes SWIG's support of Python. SWIG is compatible with all recent Python versions (Python 2.7 and Python >= 3.2). If you still need to generate bindings which work with older versions of Python, you'll have to use SWIG 3.0.x.

    This chapter covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters. At the very least, make sure you read the "SWIG Basics" chapter.

    32.1 Overview

    To build Python extension modules, SWIG uses a layered approach in which parts of the extension module are defined in C and other parts are defined in Python. The C layer contains low-level wrappers whereas Python code is used to define high-level features.

    This layered approach recognizes the fact that certain aspects of extension building are better accomplished in each language (instead of trying to do everything in C or C++). Furthermore, by generating code in both languages, you get a lot more flexibility since you can enhance the extension module with support code in either language.

    In describing the Python interface, this chapter starts by covering the basics of configuration, compiling, and installing Python modules. Next, the Python interface to common C and C++ programming features is described. Advanced customization features such as typemaps are then described followed by a discussion of low-level implementation details.

    32.2 Preliminaries

    32.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    /* File: example.i */
    %module example
    
    %{
    #define SWIG_FILE_WITH_INIT
    #include "example.h"
    %}
    
    int fact(int n);
    

    The #define SWIG_FILE_WITH_INIT line inserts a macro that specifies that the resulting C file should be built as a Python extension, inserting the module init code. This .i file wraps the following simple C file:

    /* File: example.c */
    
    #include "example.h"
    
    int fact(int n) {
      if (n < 0) { /* This should probably return an error, but this is simpler */
        return 0;
      }
      if (n == 0) {
        return 1;
      } else {
        /* testing for overflow would be a good idea here */
        return n * fact(n-1);
      }
    }
    
    

    With the header file:

    /* File: example.h */
    
    int fact(int n);
    

    To build a Python module, run SWIG using the -python option:

    $ swig -python example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -python example.i
    

    This creates two different files; a C/C++ source file example_wrap.c or example_wrap.cxx and a Python source file example.py. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module. The Python source file contains high-level support code. This is the file that you will import to use the module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The name of the Python file is derived from the module name specified with %module. If the module name is example, then a file example.py is created.

    The following sections have further practical examples and details on how you might go about compiling and using the generated files.

    32.2.2 Using distutils

    The preferred approach to building an extension module for Python is to compile it with distutils, which comes with all recent versions of Python (Distutils Docs).

    Distutils takes care of making sure that your extension is built with all the correct flags, headers, etc. for the version of Python it is run with. Distutils will compile your extension into a shared object file or DLL (.so on Linux, .pyd on Windows, etc). In addition, distutils can handle installing your package into site-packages, if that is desired. A configuration file (conventionally called: setup.py) describes the extension (and related Python modules). The distutils will then generate all the right compiler directives to build it for you.

    Here is a sample setup.py file for the above example:

    #!/usr/bin/env python
    
    """
    setup.py file for SWIG example
    """
    
    from distutils.core import setup, Extension
    
    
    example_module = Extension('_example',
                               sources=['example_wrap.c', 'example.c'],
                               )
    
    setup (name = 'example',
           version = '0.1',
           author      = "SWIG Docs",
           description = """Simple swig example from docs""",
           ext_modules = [example_module],
           py_modules = ["example"],
           )
    

    In this example, the line: example_module = Extension(....) creates an Extension module object, defining the name as _example, and using the source code files: example_wrap.c, generated by swig, and example.c, your original c source. The swig (and other Python extension modules) tradition is for the compiled extension to have the name of the Python portion, prefixed by an underscore. If the name of your Python module is "example.py", then the name of the corresponding object file will be"_example.so"

    The setup call then sets up distutils to build your package, defining some meta data, and passing in your extension module object. Once this is saved as setup.py, you can build your extension with these commands:

    $ swig -python example.i
    $ python setup.py build_ext --inplace
    

    And a .so, or .pyd or... will be created for you. It will build a version that matches the Python that you run the command with. Taking apart the command line:

    • python -- the version of Python you want to build for
    • setup.py -- the name of your setup script (it can be called anything, but setup.py is the tradition)
    • build_ext -- telling distutils to build extensions
    • --inplace -- this tells distutils to put the extension lib in the current dir. Otherwise, it will put it inside a build hierarchy, and you'd have to move it to use it.

    The distutils have many other features, consult the Python distutils docs for details.

    This same approach works on all platforms if the appropriate compiler is installed. (it can even build extensions to the standard Windows Python using MingGW)

    32.2.3 Hand compiling a dynamic module

    While the preferred approach to building an extension module is to use the distutils, some people like to integrate building extensions with a larger build system, and thus may wish to compile their modules without the distutils. To do this, you need to compile your program using commands like this (shown for Linux):

    $ swig -python example.i
    $ gcc -O2 -fPIC -c example.c
    $ gcc -O2 -fPIC -c example_wrap.c -I/usr/local/include/python2.5
    $ gcc -shared example.o example_wrap.o -o _example.so
    

    The exact commands for doing this vary from platform to platform. However, SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/python directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the output file has to match the name of the module prefixed by an underscore. If the name of your module is "example", then the name of the corresponding object file should be "_example.so" or "_examplemodule.so". The name of the module is specified using the %module directive or the -module command line option.

    Compatibility Note: In SWIG-1.3.13 and earlier releases, module names did not include the leading underscore. This is because modules were normally created as C-only extensions without the extra Python support file (instead, creating Python code was supported as an optional feature). This has been changed in SWIG-1.3.14 and is consistent with other Python extension modules. For example, the socket module actually consists of two files; socket.py and _socket.so. Many other built-in Python modules follow a similar convention.

    32.2.4 Static linking

    An alternative approach to dynamic linking is to rebuild the Python interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Python involves finding the Python source, adding an entry to the Modules/Setup file, and rebuilding the interpreter using the Python Makefile. However, newer Python versions have changed the build process. You may need to edit the 'setup.py' file in the Python distribution instead.

    In earlier versions of SWIG, the embed.i library file could be used to rebuild the interpreter. For example:

    %module example
    
    %inline %{
    extern int fact(int);
    extern int mod(int, int);
    extern double My_variable;
    %}
    
    %include "embed.i"       // Include code for a static version of Python
    
    

    The embed.i library file includes supporting code that contains everything needed to rebuild Python. To rebuild the interpreter, you simply do something like this:

    $ swig -python -lembed.i example.i
    $ gcc example.c example_wrap.c \
            -Xlinker -export-dynamic \
            -DHAVE_CONFIG_H -I/usr/include/python2.7 \
            -I/usr/lib/python2.7/config-x86_64-linux-gnu \
            -I/usr/lib/python2.7/config \
            -L/usr/lib/python2.7/config -lpython2.7 -lm -ldl \
            -o mypython
    

    You will need to supply the same libraries that were used to build Python the first time. This may include system libraries such as -lsocket, -lnsl, and -lpthread. Assuming this actually works, the new version of Python should be identical to the default version except that your extension module will be a built-in part of the interpreter.

    Comment: In practice, you should probably try to avoid static linking if possible. Some programmers may be inclined to use static linking in the interest of getting better performance. However, the performance gained by static linking tends to be rather minimal in most situations (and quite frankly not worth the extra hassle in the opinion of this author).

    Compatibility note: The embed.i library file is deprecated and has not been actively maintained for many years. Even though it appears to "work" with Python 2.7, no future support is guaranteed. If using static linking, you might want to rely on a different approach (perhaps using distutils).

    32.2.5 Using your module

    To use your module, simply use the Python import statement. If all goes well, you will be able to run this:

    $ python
    >>> import example
    >>> example.fact(4)
    24
    >>>
    

    A common error received by first-time users is the following:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "example.py", line 2, in ?
        import _example
    ImportError: No module named _example
    

    If you get this message, it means that you either forgot to compile the wrapper code into an extension module or you didn't give the extension module the right name. Make sure that you compiled the wrappers into a module called _example.so. And don't forget the leading underscore (_).

    Another possible error is the following:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ImportError: dynamic module does not define init function (init_example)
    >>>
    

    This error is almost always caused when a bad name is given to the shared object file. For example, if you created a file example.so instead of _example.so you would get this error. Alternatively, this error could arise if the name of the module is inconsistent with the module name supplied with the %module directive. Double-check the interface to make sure the module name and the shared object filename match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

    Another common error is something similar to the following:

    Traceback (most recent call last):
      File "example.py", line 3, in ?
        import example
    ImportError: ./_example.so: undefined symbol: fact
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o _example.so
    

    If the foo library is compiled as a shared library, you might encounter the following problem when you try to use your module:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ImportError: libfoo.so: cannot open shared object file: No such file or directory
    >>>
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To fix this problem, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib  \
          -o _example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Python, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib python
    

    Finally, you can use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    32.2.6 Compilation of C++ extensions

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Python interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly. This should be a non-issue if you're using distutils, as it takes care of all that for you. The following is included for historical reasons, and in case you need to compile on your own.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -python example.i
    $ g++ -O2 -fPIC -c example.cxx
    $ g++ -O2 -fPIC -c example_wrap.cxx -I/usr/local/include/python2.5
    $ g++ -shared example.o example_wrap.o -o _example.so
    

    The -fPIC option tells GCC to generate position-independent code (PIC) which is required for most architectures (it's not vital on x86, but still a good idea as it allows code pages from the library to be shared between processes). Other compilers may need a different option specified instead of -fPIC.

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    $ swig -c++ -python example.i
    $ CC -c example.cxx
    $ CC -c example_wrap.cxx -I/usr/local/include/python2.5
    $ CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o _example.so -lCrun
    

    Of course, the extra libraries to use are completely non-portable---you will probably need to do some experimentation.

    Sometimes people have suggested that it is necessary to relink the Python interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Python.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    

    As a final complication, a major weakness of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Python, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. If working with lots of software components, you might want to investigate using a more formal standard such as COM.

    32.2.7 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Python executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    On the Linux x86_64 platform (Opteron or EM64T), besides of the required compiler option -fPIC discussed above, you will need to be careful about the libraries you link with or the library path you use. In general, a Linux distribution will have two set of libraries, one for native x86_64 programs (under /usr/lib64), and another for 32 bits compatibility (under /usr/lib). Also, the compiler options -m32 and -m64 allow you to choose the desired binary format for your Python extension.

    32.2.8 Building Python extensions under Windows

    Building a SWIG extension to Python under Windows is roughly similar to the process used with Unix. Using the distutils, it is essentially identical. If you have the same version of the MS compiler that Python was built with (the python2.4 and python2.5 distributed by python.org are built with Visual Studio 2003), the standard python setup.py build should just work.

    As of python2.5, the distutils support building extensions with MingGW out of the box. Following the instruction here: Building Python extensions for Windows with only free tools should get you started.

    If you need to build it on your own, the following notes are provided:

    You will need to create a DLL that can be loaded into the interpreter. This section briefly describes the use of SWIG with Microsoft Visual C++. As a starting point, many of SWIG's examples include project files (.dsp files) for Visual C++ 6. These can be opened by more recent versions of Visual Studio. You might want to take a quick look at these examples in addition to reading this section.

    In Developer Studio, SWIG should be invoked as a custom build option. This is usually done as follows:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer Studio keeps a reference to it.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -python -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Python installation under "Additional include directories".
    • Define the symbol __WIN32__ under preprocessor options.
    • Finally, select the settings for the entire project and go to "Link Options". Add the Python library file to your link libraries. For example "python27.lib". Also, set the name of the output file to match the name of your Python module, i.e. _example.pyd
    • Build your project.

    If all went well, SWIG will be automatically invoked whenever you build your project. Any changes made to the interface file will result in SWIG being automatically executed to produce a new version of the wrapper file.

    To run your new Python extension, simply run Python and use the import command as normal. For example :

    $ python
    >>> import example
    >>> print example.fact(4)
    24
    >>>
    

    If you get an ImportError exception when importing the module, you may have forgotten to include additional library files when you built your module. If you get an access violation or some kind of general protection fault immediately upon import, you have a more serious problem. This is often caused by linking your extension module against the wrong set of Win32 debug or thread libraries. You will have to fiddle around with the build options of project to try and track this down.

    A 'Debug' build of the wrappers requires a debug build of the Python interpreter. This normally requires building the Python interpreter from source, which is not a job for the feint-hearted. Alternatively you can use the 'Release' build of the Python interpreter with a 'Debug' build of your wrappers by defining the SWIG_PYTHON_INTERPRETER_NO_DEBUG symbol under the preprocessor options. Or you can ensure this macro is defined at the beginning of the wrapper code using the following in your interface file, where _MSC_VER ensures it is only used by the Visual Studio compiler:

    %begin %{
    #ifdef _MSC_VER
    #define SWIG_PYTHON_INTERPRETER_NO_DEBUG
    #endif
    %}
    

    Some users have reported success in building extension modules using Cygwin and other compilers. However, the problem of building usable DLLs with these compilers tends to be rather problematic. For the latest information, you may want to consult the SWIG Wiki.

    32.2.9 Additional Python commandline options

    The following table lists the additional commandline options available for the Python module. They can also be seen by using:

    swig -python -help
    
    Python specific options
    -builtin Create Python built-in types rather than proxy classes, for better performance
    -castmode Enable the casting mode, which allows implicit cast between types in Python
    -debug-doxygen-parser Display doxygen parser module debugging information
    -debug-doxygen-translator Display doxygen translator module debugging information
    -dirvtable Generate a pseudo virtual table for directors for faster dispatch
    -doxygen Convert C++ doxygen comments to pydoc comments in proxy classes
    -extranative Return extra native wrappers for C++ std containers wherever possible
    -fastproxy Use fast proxy mechanism for member methods
    -globals <name> Set <name> used to access C global variable (default: 'cvar')
    -interface <mod>Set low-level C/C++ module name to <mod> (default: module name prefixed by '_')
    -keyword Use keyword arguments
    -nofastunpack Use traditional UnpackTuple method to parse the argument functions
    -noh Don't generate the output header file
    -noproxy Don't generate proxy classes
    -nortti Disable the use of the native C++ RTTI with directors
    -nothreads Disable thread support for the entire interface
    -olddefs Keep the old method definitions when using -fastproxy
    -py3 Generate code with Python 3 specific features and syntax
    -relativeimport Use relative Python imports
    -threads Add thread support for all the interface
    -O Enable the following optimization options: -fastdispatch -fastproxy -fvirtual

    Many of these options are covered later on and their use should become clearer by the time you have finished reading this section on SWIG and Python.

    32.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Python interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped as classes, and so forth. This section briefly covers the essential aspects of this wrapping.

    32.3.1 Modules

    The SWIG %module directive specifies the name of the Python module. If you specify `%module example', then everything is wrapped into a Python 'example' module. Underneath the covers, this module consists of a Python source file example.py and a low-level extension module _example.so. When choosing a module name, make sure you don't use the same name as a built-in Python command or standard module name.

    32.3.2 Functions

    Global functions are wrapped as new Python built-in functions. For example,

    %module example
    int fact(int n);
    

    creates a built-in function example.fact(n) that works exactly like you think it does:

    >>> import example
    >>> print example.fact(4)
    24
    >>>
    

    32.3.3 Global variables

    C/C++ global variables are fully supported by SWIG. However, the underlying mechanism is somewhat different than you might expect due to the way that Python assignment works. When you type the following in Python

    a = 3.4
    

    "a" becomes a name for an object containing the value 3.4. If you later type

    b = a
    

    then "a" and "b" are both names for the object containing the value 3.4. Thus, there is only one object containing 3.4 and "a" and "b" are both names that refer to it. This is quite different than C where a variable name refers to a memory location in which a value is stored (and assignment copies data into that location). Because of this, there is no direct way to map variable assignment in C to variable assignment in Python.

    To provide access to C global variables, SWIG creates a special object called `cvar' that is added to each SWIG generated module. Global variables are then accessed as attributes of this object. For example, consider this interface

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern int My_variable;
    extern double density;
    %}
    ...
    

    Now look at the Python interface:

    >>> import example
    >>> # Print out value of a C global variable
    >>> print example.cvar.My_variable
    4
    >>> # Set the value of a C global variable
    >>> example.cvar.density = 0.8442
    >>> # Use in a math operation
    >>> example.cvar.density = example.cvar.density*1.10
    

    If you make an error in variable assignment, you will receive an error message. For example:

    >>> example.cvar.density = "Hello"
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: C variable 'density (double )'
    >>>
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    If you would like to access variables using a name other than "cvar", it can be changed using the -globals option :

    $ swig -python -globals myvar example.i
    

    Some care is in order when importing multiple SWIG modules. If you use the "from <file> import *" style of importing, you will get a name clash on the variable `cvar' and you will only be able to access global variables from the last module loaded. To prevent this, you might consider renaming cvar or making it private to the module by giving it a name that starts with a leading underscore. SWIG does not create cvar if there are no global variables in a module.

    32.3.4 Constants and enums

    C/C++ constants are installed as Python objects containing the appropriate value. To create a constant, use #define, enum, or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    enum Beverage { ALE, LAGER, STOUT, PILSNER };
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    For enums, make sure that the definition of the enumeration actually appears in a header file or in the wrapper file somehow---if you just stick an enum in a SWIG interface without also telling the C compiler about it, the wrapper code won't compile.

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using the cvar object described in the previous section. They are not wrapped as constants. For further discussion about this, see the SWIG Basics chapter.

    Constants are not guaranteed to remain constant in Python---the name of the constant could be accidentally reassigned to refer to some other object. Unfortunately, there is no easy way for SWIG to generate code that prevents this. You will just have to be careful.

    32.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Python. For example:

    >>> import example
    >>> f = example.fopen("junk", "w")
    >>> example.fputs("Hello World\n", f)
    >>> example.fclose(f)
    

    If this makes you uneasy, rest assured that there is no deep magic involved. Underneath the covers, pointers to C/C++ objects are simply represented as opaque values using an especial Python container object:

    >>> print f
    <Swig Object of type 'FILE *' at 0xb7d6f470>
    

    This pointer value can be freely passed around to different C functions that expect to receive an object of type FILE *. The only thing you can't do is dereference the pointer from Python. Of course, that isn't much of a concern in this example.

    In older versions of SWIG (1.3.22 or older), pointers were represented using a plain string object. If you have an old package that still requires that representation, or you just feel nostalgic, you can always retrieve it by casting the pointer object to a string:

    >>> print str(f)
    _c0671108_p_FILE
    

    Also, if you need to pass the raw pointer value to some external Python library, you can do it by casting the pointer object to an integer:

    >>> print int(f)
    135833352
    

    However, the inverse operation is not possible, i.e., you can't build a SWIG pointer object from a raw integer value.

    Note also that the '0' or NULL pointer is always represented by None, no matter what type swig is addressing. In the previous example, you can call:

    >>> example.fclose(None)
    

    and that will be equivalent to the following, but not really useful, C code:

    FILE *f = NULL;
    fclose(f);
    

    As much as you might be inclined to modify a pointer value directly from Python, don't. The hexadecimal encoding is not necessarily the same as the logical memory address of the underlying object. Instead it is the raw byte encoding of the pointer value. The encoding will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Similarly, don't try to manually cast a pointer to a new type by simply replacing the type-string. This may not work like you expect, it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return None if the conversion can't be performed.

    32.3.6 Structures

    If you wrap a C structure, it is wrapped by a Python class. This provides a very natural interface. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    >>> v = example.Vector()
    >>> v.x = 3.5
    >>> v.y = 7.2
    >>> print v.x, v.y, v.z
    3.5 7.2 0.0
    >>>
    

    Similar access is provided for unions and the data members of C++ classes.

    If you print out the value of v in the above example, you will see something like this:

    >>> print v
    <C Vector instance at _18e31408_p_Vector>
    

    This object is actually a Python instance that has been wrapped around a pointer to the low-level C structure. This instance doesn't actually do anything--it just serves as a proxy. The pointer to the C object can be found in the .this attribute. For example:

    >>> print v.this
    _18e31408_p_Vector
    >>>
    

    Further details about the Python proxy class are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Python, you will see behavior like this:

    >>> b = example.Bar()
    >>> print b.x
    _801861a4_p_int
    >>>
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    >>> c = example.Bar()
    >>> c.x = b.x             # Copy contents of b.x to c.x
    

    For array assignment, SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    >>> b = Bar()
    >>> x = b.f
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    >>> b = Bar()
    >>> b.f.a = 3               # Modify attribute of structure member
    >>> x = b.f
    >>> x.a = 3                 # Modifies the same structure
    

    Note that there is a limitation with structs within structs that will cause a problem if the outer struct is not a named variable in Python. The following will cause a segfault:

    Bar().f.a = 3
    

    because the unnamed Python proxy class for Bar() has its reference count decremented by the Python interpreter after f has been obtained from it and before f is used to obtain a. This results in the underlying Bar instance being deleted, which of course also deletes f inside it. Hence the pointer to f points to deleted memory and use of it results in a segfault or some sort of other undefined behaviour.

    32.3.7 C++ classes

    C++ classes are wrapped by Python classes as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Python like this:

    >>> l = example.List()
    >>> l.insert("Ale")
    >>> l.insert("Stout")
    >>> l.insert("Lager")
    >>> l.get(1)
    'Stout'
    >>> print l.length
    3
    >>>
    

    Class data members are accessed in the same manner as C structures.

    Static class members present a special problem for Python. Prior to Python-2.2, Python classes had no support for static methods and no version of Python supports static member variables in a manner that SWIG can utilize. Therefore, SWIG generates wrappers that try to work around some of these issues. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Python, the static member can be access in three different ways:

    >>> example.Spam_foo()    # Spam::foo()
    >>> s = example.Spam()
    >>> s.foo()               # Spam::foo() via an instance
    >>> example.Spam.foo()    # Spam::foo(). Python-2.2 only
    

    The first two methods of access are supported in all versions of Python. The last technique is only available in Python-2.2 and later versions.

    Static member variables are currently accessed as global variables. This means, they are accessed through cvar like this:

    >>> print example.cvar.Spam_bar
    7
    

    32.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    those classes are wrapped into a hierarchy of Python classes that reflect the same inheritance structure. All of the usual Python utility functions work normally:

    >>> b = Bar()
    >>> instance(b, Foo)
    1
    >>> issubclass(Bar, Foo)
    1
    >>> issubclass(Foo, Bar)
    0
    

    Furthermore, if you have functions like this

    void spam(Foo *f);
    

    then the function spam() accepts Foo * or a pointer to any class derived from Foo.

    It is safe to use multiple inheritance with SWIG.

    32.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(const Foo &x);// Pass by const reference
    void spam4(Foo x);       // Pass by value
    void spam5(Foo x[]);     // Array of objects
    

    In Python, there is no detailed distinction like this--specifically, there are only "objects". There are no pointers, references, arrays, and so forth. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    >>> f = Foo()           # Create a Foo
    >>> spam1(f)            # Ok. Pointer
    >>> spam2(f)            # Ok. Reference
    >>> spam3(f)            # Ok. Const reference
    >>> spam4(f)            # Ok. Value.
    >>> spam5(f)            # Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam6();
    Foo &spam7();
    Foo  spam8();
    const Foo &spam9();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam8) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Python will release this memory when the return value is garbage collected). The fourth case (spam9) which returns a const reference, in most of the cases will be treated as a returning value, and it will follow the same allocation/deallocation process.

    32.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Python in a straightforward manner:

    >>> foo(3)           # foo(int)
    >>> foo("Hello")     # foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Python code like this:

    >>> f = Foo()          # Create a Foo
    >>> g = Foo(f)         # Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    32.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
    
      Complex operator+=(const Complex &c) const;
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
    
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like you expect:

    >>> c = Complex(3, 4)
    >>> d = Complex(7, 8)
    >>> e = c + d
    >>> e.re()
    10.0
    >>> e.im()
    12.0
    >>> c += d
    >>> c.re()
    10.0
    >>> c.im()
    12.0
    
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    Also, be aware that certain operators don't map cleanly to Python. For instance, overloaded assignment operators don't map to Python semantics and will be ignored.

    Operator overloading is implemented in the pyopers.swg library file. In particular overloaded operators are marked with the python:maybecall feature, also known as %pythonmaybecall. This feature forces SWIG to generate code that return an instance of Python's NotImplemented instead of raising an exception when the comparison fails, that is, on any kind of error. This follows the guidelines in PEP 207 - Rich Comparisons and NotImplemented Python constant.

    32.3.12 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Python as follows:

    >>> import example
    >>> example.fact(3)
    6
    >>> v = example.Vector()
    >>> v.x = 3.4
    >>> print v.y
    0.0
    >>>
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    32.3.13 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
     ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Python:

    >>> import example
    >>> p = example.pairii(3, 4)
    >>> p.first
    3
    >>> p.second
    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    32.3.14 C++ Smart Pointers

    32.3.14.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Python in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    32.3.14.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Python, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Python, everything should just "work":

    >>> p = example.CreateFoo()          # Create a smart-pointer somehow
    >>> p.x = 3                          # Foo::x
    >>> p.bar()                          # Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    >>> f = p.__deref__()     # Returns underlying Foo *
    

    32.3.15 C++ reference counted objects

    The C++ reference counted objects section contains Python examples of memory management using referencing counting.

    32.4 Further details on the Python class interface

    In the previous section, a high-level view of Python wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Python proxy classes. This provides a very natural Python interface and allows SWIG to support a number of advanced features such as operator overloading. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work.

    New in SWIG version 2.0.4: The use of Python proxy classes has performance implications that may be unacceptable for a high-performance library. The new -builtin option instructs SWIG to forego the use of proxy classes, and instead create wrapped types as new built-in Python types. When this option is used, the following section ("Proxy classes") does not apply. Details on the use of the -builtin option are in the Built-in Types section.

    32.4.1 Proxy classes

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a class like this

    class Foo {
    public:
      int x;
      int spam(int);
      ...
    

    then SWIG transforms it into a set of low-level procedural wrappers. For example:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int arg1) {
      return f->spam(arg1);
    }
    

    These wrappers can be found in the low-level extension module (e.g., _example).

    Using these wrappers, SWIG generates a high-level Python proxy class (also known as a shadow class) like this (shown for Python 2.2):

    import _example
    
    class Foo(object):
        def __init__(self):
            self.this = _example.new_Foo()
            self.thisown = 1
        def __del__(self):
            if self.thisown:
                _example.delete_Foo(self.this)
        def spam(self, arg1):
            return _example.Foo_spam(self.this, arg1)
        x = property(_example.Foo_x_get, _example.Foo_x_set)
    

    This class merely holds a pointer to the underlying C++ object (.this) and dispatches methods and member variable access to that object using the low-level accessor functions. From a user's point of view, it makes the class work normally:

    >>> f = example.Foo()
    >>> f.x = 3
    >>> y = f.spam(5)
    

    The fact that the class has been wrapped by a real Python class offers certain advantages. For instance, you can attach new Python methods to the class and you can even inherit from it (something not supported by Python built-in types until Python 2.2).

    32.4.2 Built-in Types

    The -builtin option provides a significant performance improvement in the wrapped code. To understand the difference between proxy classes and built-in types, let's take a look at what a wrapped object looks like under both circumstances.

    When proxy classes are used, each wrapped object in Python is an instance of a pure Python class. As a reminder, here is what the __init__ method looks like in a proxy class:

    class Foo(object):
        def __init__(self):
            self.this = _example.new_Foo()
            self.thisown = 1
    

    When a Foo instance is created, the call to _example.new_Foo() creates a new C++ Foo instance; wraps that C++ instance inside an instance of a Python built-in type called SwigPyObject; and stores the SwigPyObject instance in the 'this' field of the Python Foo object. Did you get all that? So, the Python Foo object is composed of three parts:

    • The Python Foo instance, which contains...
    • ... an instance of struct SwigPyObject, which contains...
    • ... a C++ Foo instance

    When -builtin is used, the pure Python layer is stripped off. Each wrapped class is turned into a new Python built-in type which inherits from SwigPyObject, and SwigPyObject instances are returned directly from the wrapped methods. For more information about Python built-in extensions, please refer to the Python documentation:

    https://docs.python.org/3/extending/newtypes.html

    32.4.2.1 Limitations

    Use of the -builtin option implies a couple of limitations:

    • Some legacy syntax is no longer supported; in particular:

      • The functional interface is no longer exposed. For example, you may no longer call Whizzo.new_CrunchyFrog(). Instead, you must use Whizzo.CrunchyFrog().
      • Static member variables are no longer accessed through the 'cvar' field (e.g., Dances.cvar.FishSlap). They are instead accessed in the idiomatic way (Dances.FishSlap).
    • Wrapped types may not be raised as Python exceptions. Here's why: the Python internals expect that all sub-classes of Exception will have this struct layout:

      typedef struct {
        PyObject_HEAD
        PyObject *dict;
        PyObject *args;
        PyObject *message;
      } PyBaseExceptionObject;
      

      But swig-generated wrappers expect that all swig-wrapped classes will have this struct layout:

      typedef struct {
        PyObject_HEAD
        void *ptr;
        swig_type_info *ty;
        int own;
        PyObject *next;
        PyObject *dict;
      } SwigPyObject;
      

      There are workarounds for this. For example, if you wrap this class:

      class MyException {
      public:
        MyException (const char *msg_);
        ~MyException ();
      
        const char *what () const;
      
      private:
        char *msg;
      };
      

      ... you can define this Python class, which may be raised as an exception:

      class MyPyException(Exception):
          def __init__(self, msg, *args):
              Exception.__init__(self, *args)
              self.myexc = MyException(msg)
          def what(self):
              return self.myexc.what()
      
    • Reverse binary operators (e.g., __radd__) are not supported.

      To illustrate this point, if you have a wrapped class called MyString, and you want to use instances of MyString interchangeably with native Python strings, you can define an 'operator+ (const char*)' method :

      class MyString {
      public:
        MyString (const char *init);
        MyString operator+ (const char *other) const;
        ...
      };
      

      SWIG will automatically create an operator overload in Python that will allow this:

      from MyModule import MyString
      
      mystr = MyString("No one expects")
      episode = mystr + " the Spanish Inquisition"
      

      This works because the first operand (mystr) defines a way to add a native string to itself. However, the following will not work:

      from MyModule import MyString
      
      mystr = MyString("Parrot")
      episode = "Dead " + mystr
      

      The above code fails, because the first operand -- a native Python string -- doesn't know how to add an instance of MyString to itself.

    • If you have multiple SWIG modules that share type information (more info), the -builtin option requires a bit of extra discipline to ensure that base classes are initialized before derived classes. Specifically:

      • There must be an unambiguous dependency graph for the modules.

      • Module dependencies must be explicitly stated with %import statements in the SWIG interface file.

      As an example, suppose module A has this interface in A.i :

      %module "A";
      
      class Base {
      ...
      };
      

      If you want to wrap another module containing a class that inherits from A, this is how it would look :

      %module "B";
      
      %import "A.i"
      
      class Derived : public Base {
      ...
      };
      

      The import "A.i" statement is required, because module B depends on module A.

      As long as you obey these requirements, your Python code may import the modules in any order :

      import B
      import A
      
      assert(issubclass(B.Derived, A.Base))
      

    32.4.2.2 Operator overloads and slots -- use them!

    The entire justification for the -builtin option is improved performance. To that end, the best way to squeeze maximum performance out of your wrappers is to use operator overloads. Named method dispatch is slow in Python, even when compared to other scripting languages. However, Python built-in types have a large number of "slots", analogous to C++ operator overloads, which allow you to short-circuit named method dispatch for certain common operations.

    By default, SWIG will translate most C++ arithmetic operator overloads into Python slot entries. For example, suppose you have this class:

    class Twit {
    public:
      Twit operator+ (const Twit& twit) const;
    
      // Forward to operator+
      Twit add (const Twit& twit) const {
        return *this + twit;
      }
    };
    

    SWIG will automatically register operator+ as a Python slot operator for addition. You may write Python code like this:

    from MyModule import Twit
    
    nigel = Twit()
    emily = Twit()
    percival = nigel + emily
    percival = nigel.add(emily)
    

    The last two lines of the Python code are equivalent, but the line that uses the '+' operator is much faster.

    In-place operators (e.g., operator+=) and comparison operators (operator==, operator<, etc.) are also converted to Python slot operators. For a complete list of C++ operators that are automatically converted to Python slot operators, refer to the file python/pyopers.swig in the SWIG library.

    Read about all of the available Python slots here: https://docs.python.org/3/c-api/typeobj.html

    There are two ways to define a Python slot function: dispatch to a statically defined function; or dispatch to a method defined on the operand.

    To dispatch to a statically defined function, use %feature("python:<slot>"), where <slot> is the name of a field in a PyTypeObject, PyNumberMethods, PyMappingMethods, PySequenceMethods or PyBufferProcs. You may override (almost) all of these slots.

    Let's consider an example setting the tp_hash slot for the MyClass type. This is akin to providing a __hash__ method (for non-builtin types) to make a type hashable. The hashable type can then for example be added to a Python dict.

    %feature("python:tp_hash") MyClass "myHashFunc";
    
    class MyClass {
    public:
      long field1;
      long field2;
      ...
    };
    
    %{
    #if PY_VERSION_HEX >= 0x03020000
      static Py_hash_t myHashFunc(PyObject *pyobj)
    #else
      static long myHashFunc(PyObject *pyobj)
    #endif
      {
        MyClass *cobj;
        // Convert pyobj to cobj
        return (cobj->field1 * (cobj->field2 << 7));
      }
    %}
    

    If you examine the generated code, the supplied hash function will now be the function callback in the tp_hash slot for the builtin type for MyClass:

    static PyHeapTypeObject SwigPyBuiltin__MyClass_type = {
      ...
      (hashfunc) myHashFunc,       /* tp_hash */
      ...
    

    NOTE: It is the responsibility of the programmer (that's you!) to ensure that a statically defined slot function has the correct signature, the hashfunc typedef in this case.

    If, instead, you want to dispatch to an instance method, you can use %feature("python:slot"). For example:

    %feature("python:slot", "tp_hash", functype="hashfunc") MyClass::myHashFunc;
    
    #if PY_VERSION_HEX < 0x03020000
      #define Py_hash_t long
    #endif
    
    class MyClass {
      public:
        Py_hash_t myHashFunc() const;
        ...
    };
    

    NOTE: Some Python slots use a method signature which does not match the signature of SWIG-wrapped methods. For those slots, SWIG will automatically generate a "closure" function to re-marshal the arguments before dispatching to the wrapped method. Setting the "functype" attribute of the feature enables SWIG to generate the chosen closure function.

    There is further information on %feature("python:slot") in the file python/pyopers.swig in the SWIG library.

    32.4.3 Memory management

    NOTE: Although this section refers to proxy objects, everything here also applies when the -builtin option is used.

    Associated with proxy object, is an ownership flag .thisown The value of this flag determines who is responsible for deleting the underlying C++ object. If set to 1, the Python interpreter will destroy the C++ object when the proxy class is garbage collected. If set to 0 (or if the attribute is missing), then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Python automatically takes ownership of the result. For example:

    class Foo {
    public:
      Foo();
      Foo bar();
    };
    

    In Python:

    >>> f = Foo()
    >>> f.thisown
    1
    >>> g = f.bar()
    >>> g.thisown
    1
    

    On the other hand, when pointers are returned to Python, there is often no way to know where they came from. Therefore, the ownership is set to zero. For example:

    class Foo {
    public:
      ...
      Foo *spam();
      ...
    };
    

    >>> f = Foo()
    >>> s = f.spam()
    >>> print s.thisown
    0
    >>>
    

    This behavior is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Python to assume ownership and destroy it!

    A good way to indicate that ownership should be set for a returned pointer is to use the %newobject directive.

    Related to containers, ownership issues can arise whenever an object is assigned to a member or global variable. For example, consider this interface:

    %module example
    
    struct Foo {
      int  value;
      Foo  *next;
    };
    
    Foo *head = 0;
    

    When wrapped in Python, careful observation will reveal that ownership changes whenever an object is assigned to a global variable. For example:

    >>> f = example.Foo()
    >>> f.thisown
    1
    >>> example.cvar.head = f
    >>> f.thisown
    0
    >>>
    

    In this case, C is now holding a reference to the object---you probably don't want Python to destroy it. Similarly, this occurs for members. For example:

    >>> f = example.Foo()
    >>> g = example.Foo()
    >>> f.thisown
    1
    >>> g.thisown
    1
    >>> f.next = g
    >>> g.thisown
    0
    >>>
    

    For the most part, memory management issues remain hidden. However, there are occasionally situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Node {
      Object *value;
    public:
      void set_value(Object *v) { value = v; }
      ...
    };
    

    Now, consider the following Python code:

    >>> v = Object()           # Create an object
    >>> n = Node()             # Create a node
    >>> n.set_value(v)         # Set value
    >>> v.thisown
    1
    >>> del v
    

    In this case, the object n is holding a reference to v internally. However, SWIG has no way to know that this has occurred. Therefore, Python still thinks that it has ownership of the object. Should the proxy object be destroyed, then the C++ destructor will be invoked and n will be holding a stale-pointer. If you're lucky, you will only get a segmentation fault.

    To work around this, it is always possible to flip the ownership flag. For example,

    >>> v.thisown = 0
    

    It is also possible to deal with situations like this using typemaps--an advanced topic discussed later.

    32.5 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Python. In particular, if a C++ class has been extended in Python (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG 1.3.18 to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Python implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Python and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Python code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    32.5.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      Foo(int foo);
      virtual ~Foo();
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    then at the Python side you can define

    import mymodule
    
    class MyFoo(mymodule.Foo):
        def __init__(self, foo):
            mymodule.Foo.__init__(self, foo)
    #       super().__init__(foo) # Alternative construction for Python3
    
        def one(self):
            print "one from Python"
    

    32.5.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Python proxy classes. The director classes store a pointer to their underlying Python object and handle various issues related to object ownership. Indeed, this is quite similar to the "this" and "thisown" members of the Python proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in Python via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in Python were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Python. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Python, the Python API is used to call the method of the underlying Python object (after which the usual virtual method resolution in Python automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in Python, unless there's a good reason not to. The reason for this is simple: Python has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the Python proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the Python method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the pointer to the Python object that called the wrapper function to the pointer stored by the director. If these are the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in Python, SWIG creates an instance of the original C++ class and assigns it to .this. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through Python.

    32.5.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. Python instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to the Python object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special __disown__() method of the proxy class. After calling this method, the .thisown flag is set to zero, and the director class increments the reference count of the Python object. When the director class is deleted it decrements the reference count. Assuming no outstanding references to the Python object remain, the Python object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    To help ensure that no references to the Python object remain after calling __disown__(), this method returns a weak reference to the Python object. Weak references are only available in Python versions 2.1 and higher, so for older versions you must explicitly delete all references. Here is an example:

    class Foo {
    public:
      ...
    };
    class FooContainer {
    public:
      void addFoo(Foo *);
      ...
    };
    

    >>> c = FooContainer()
    >>> a = Foo().__disown__()
    >>> c.addFoo(a)
    >>> b = Foo()
    >>> b = b.__disown__()
    >>> c.addFoo(b)
    >>> c.addFoo(Foo().__disown__())
    

    In this example, we are assuming that FooContainer will take care of deleting all the Foo pointers it contains at some point. Note that no hard references to the Foo objects remain in Python.

    32.5.4 Exception unrolling

    With directors routing method calls to Python, and proxies routing them to C++, the handling of exceptions is an important concern. By default, the directors ignore exceptions that occur during method calls that are resolved in Python. To handle such exceptions correctly, it is necessary to temporarily translate them into C++ exceptions. This can be done with the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
      if ($error != NULL) {
        throw Swig::DirectorMethodException();
      }
    }
    

    This code will check the Python error state after each method call from a director into Python, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler. Currently no information about the Python error is stored in the Swig::DirectorMethodException object, but this will likely change in the future.

    It may be the case that a method call originates in Python, travels up to C++ through a proxy class, and then back into Python via a director method. If an exception occurs in Python at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
      try { $action }
      catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the Python error state is still set when Swig::DirectorMethodException is thrown, Python will register the exception as soon as the C wrapper function returns.

    32.5.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in Python and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from Python. Relative to the speed of Python execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through Python in order to ensure that the method does not have an extended Python implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with Python objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to Python objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Python.

    32.5.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    32.5.7 Miscellaneous

    Director typemaps for STL classes are in place, and hence you should be able to use std::vector, std::string, etc., as you would any other type.

    Note: The director typemaps for return types based in const references, such as

    class Foo {
    …
      virtual const int& bar();
    …
    };
    

    will work only for simple call scenarios. Usually the resulting code is neither thread or reentrant safe. Hence, the user is advised to avoid returning const references in director methods. For example, the user could modify the method interface to use lvalue return types, wherever possible, for example

    class Foo {
    …
      virtual int bar();
    …
    };
    

    If that is not possible, the user should avoid enabling the director feature for reentrant, recursive or threaded member methods that return const references.

    32.6 Common customization features

    The last section presented the absolute basics of C/C++ wrapping. If you do nothing but feed SWIG a header file, you will get an interface that mimics the behavior described. However, sometimes this isn't enough to produce a nice module. Certain types of functionality might be missing or the interface to certain functions might be awkward. This section describes some common SWIG features that are used to improve your the interface to an extension module.

    32.6.1 C/C++ helper functions

    Sometimes when you create a module, it is missing certain bits of functionality. For example, if you had a function like this

    void set_transform(Image *im, double m[4][4]);
    

    it would be accessible from Python, but there may be no easy way to call it. For example, you might get errors like this:

    >>> a = [
    ...   [1, 0, 0, 0],
    ...   [0, 1, 0, 0],
    ...   [0, 0, 1, 0],
    ...   [0, 0, 0, 1]]
    >>> set_transform(im, a)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_a_4__double
    

    The problem here is that there is no easy way to construct and manipulate a suitable double [4][4] value to use. To fix this, you can write some extra C helper functions. Just use the %inline directive. For example:

    %inline %{
    /* Note: double[4][4] is equivalent to a pointer to an array double (*)[4] */
    double (*new_mat44())[4] {
      return (double (*)[4]) malloc(16*sizeof(double));
    }
    void free_mat44(double (*x)[4]) {
      free(x);
    }
    void mat44_set(double x[4][4], int i, int j, double v) {
      x[i][j] = v;
    }
    double mat44_get(double x[4][4], int i, int j) {
      return x[i][j];
    }
    %}
    

    From Python, you could then write code like this:

    >>> a = new_mat44()
    >>> mat44_set(a, 0, 0, 1.0)
    >>> mat44_set(a, 1, 1, 1.0)
    >>> mat44_set(a, 2, 2, 1.0)
    ...
    >>> set_transform(im, a)
    >>>
    

    Admittedly, this is not the most elegant looking approach. However, it works and it wasn't too hard to implement. It is possible to clean this up using Python code, typemaps, and other customization features as covered in later sections.

    32.6.2 Adding additional Python code

    If writing support code in C isn't enough, it is also possible to write code in Python. This code gets inserted in to the .py file created by SWIG. One use of Python code might be to supply a high-level interface to certain functions. For example:

    void set_transform(Image *im, double x[4][4]);
    
    ...
    /* Rewrite the high level interface to set_transform */
    %pythoncode %{
    def set_transform(im, x):
        a = new_mat44()
        for i in range(4):
            for j in range(4):
                mat44_set(a, i, j, x[i][j])
        _example.set_transform(im, a)
        free_mat44(a)
    %}
    

    In this example, set_transform() provides a high-level Python interface built on top of low-level helper functions. For example, this code now seems to work:

    >>> a = [
    ...   [1, 0, 0, 0],
    ...   [0, 1, 0, 0],
    ...   [0, 0, 1, 0],
    ...   [0, 0, 0, 1]]
    >>> set_transform(im, a)
    >>>
    

    Admittedly, this whole scheme for wrapping the two-dimension array argument is rather ad-hoc. Besides, shouldn't a Python list or a Numeric Python array just work normally? We'll get to those examples soon enough. For now, think of this example as an illustration of what can be done without having to rely on any of the more advanced customization features.

    There is also %pythonbegin which is another directive very similar to %pythoncode, but generates the given Python code at the beginning of the .py file. This directive works in the same way as %pythoncode, except the code is copied just after the SWIG banner (comment) at the top of the file, before any real code. This provides an opportunity to add your own description in a comment near the top of the file as well as Python imports that have to appear at the top of the file, such as "from __future__ import" statements.

    The following example for Python 2.x shows how to insert code into the generated wrapper to enable print to be used as a Python3-compatible function instead of a statement:

    %pythonbegin %{
    # This module provides wrappers to the Whizz Bang library
    %}
    
    %pythonbegin %{
    from __future__ import print_function
    print("Loading", "Whizz", "Bang", sep=' ... ')
    %}
    

    The insert code can be seen at the start of the generated .py file:

    # This file was automatically generated by SWIG (http://www.swig.org).
    # Version 4.0.0
    #
    # Do not make changes to this file unless you know what you are doing--modify
    # the SWIG interface file instead.
    
    # This module provides wrappers to the Whizz Bang library
    
    from __future__ import print_function
    print("Loading", "Whizz", "Bang", sep=' ... ')
    
    

    When using %pythoncode and %pythonbegin you generally want to make sure that the block is delimited by %{ and %}. If you delimit it with { and } then any lines with a leading # will be handled by SWIG as preprocessor directives, when you probably meant them as Python comments. Prior to SWIG 3.0.3, invalid preprocessor directives were silently ignored, so generally using the wrong delimiters resulted in such comments not appearing in the generated output (though a comment starting with a valid preprocessor directive could cause problems, for example: # error handling). SWIG 3.0.3 and later report an error for invalid preprocessor directives, so you may have to update existing interface files to delimit blocks of Python code correctly.

    As an alternative to providing a block containing Python code, you can include Python code from a file. The code is inserted exactly as in the file, so this avoids any issues with the SWIG preprocessor. It's a good approach if you have a non-trivial chunk of Python code to insert. To use this feature you specify a filename in double quotes, for example:

    %pythoncode "somecode.py"
    

    Sometimes you may want to replace or modify the wrapper function that SWIG creates in the proxy .py file. The Python module in SWIG provides some features that enable you to do this. First, to entirely replace a proxy function you can use %feature("shadow"). For example:

    %module example
    
    // Rewrite bar() Python code
    
    %feature("shadow") Foo::bar(int) %{
    def bar(*args):
        #do something before
        $action
        #do something after
    %}
    
    class Foo {
    public:
      int bar(int x);
    };
    

    where $action will be replaced by the call to the C/C++ proper method.

    Often the proxy function created by SWIG is fine, but you simply want to add code to it without touching the rest of the generated function body. For these cases SWIG provides the pythonprepend and pythonappend features which do exactly as their names suggest. The pythonprepend feature will insert its value at the beginning of the proxy function, and pythonappend will insert code at the end of the proxy, just before the return statement.

    %module example
    
    // Add Python code to bar()
    
    %feature("pythonprepend") Foo::bar(int) %{
        #do something before C++ call
    %}
    
    %feature("pythonappend") Foo::bar(int) %{
        #do something after C++ call
        #the 'val' variable holds the return value
    %}
    
    
    class Foo {
    public:
      int bar(int x);
    };
    

    Notes: Usually the pythonappend and pythonprepend features are safer to use than the shadow feature. Also, from SWIG version 1.3.28 you can use the directive forms %pythonappend and %pythonprepend as follows:

    %module example
    
    // Add Python code to bar()
    
    %pythonprepend Foo::bar(int) %{
        #do something before C++ call
    %}
    
    %pythonappend Foo::bar(int) %{
        #do something after C++ call
        #the 'val' variable holds the return value
    %}
    
    
    class Foo {
    public:
      int bar(int x);
    };
    

    Note that when the underlying C++ method is overloaded, there is only one proxy Python method for multiple C++ methods. In this case, only one of parsed methods is examined for the feature. You are better off specifying the feature without the argument list to ensure it will get used, as it will then get attached to all the overloaded C++ methods. For example:

    %module example
    
    // Add Python code to bar()
    
    %pythonprepend Foo::bar %{
        #do something before C++ call
    %}
    
    %pythonappend Foo::bar %{
        #do something after C++ call
    %}
    
    
    class Foo {
    public:
      int bar(int x);
      int bar();
    };
    

    The same applies for overloaded constructors.

    32.6.3 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods--at least in the Python interface. Here is a simple example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    struct Vector {
      double x, y, z;
    };
    
    %extend Vector {
      char *__str__() {
        static char tmp[1024];
        sprintf(tmp, "Vector(%g, %g, %g)", $self->x, $self->y, $self->z);
        return tmp;
      }
      Vector(double x, double y, double z) {
        Vector *v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
    };
    

    Now, in Python

    >>> v = example.Vector(2, 3, 4)
    >>> print v
    Vector(2, 3, 4)
    >>>
    

    %extend can be used for many more tasks than this. For example, if you wanted to overload a Python operator, you might do this:

    %extend Vector {
      Vector __add__(Vector *other) {
        Vector v;
        v.x = $self->x + other->x;
        v.y = $self->y + other->y;
        v.z = $self->z + other->z;
        return v;
      }
    };
    

    Use it like this:

    >>> import example
    >>> v = example.Vector(2, 3, 4)
    >>> w = example.Vector(10, 11, 12)
    >>> print v+w
    Vector(12, 14, 16)
    >>>
    

    %extend works with both C and C++ code. It does not modify the underlying object in any way---the extensions only show up in the Python interface.

    32.6.4 Exception handling with %exception

    If a C or C++ function throws an error, you may want to convert that error into a Python exception. To do this, you can use the %exception directive. %exception simply lets you rewrite part of the generated wrapper code to include an error check.

    In C, a function often indicates an error by returning a status code (a negative number or a NULL pointer perhaps). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (!result) {
        PyErr_SetString(PyExc_MemoryError, "Not enough memory");
        SWIG_fail;
      }
    }
    void *malloc(size_t nbytes);
    

    In Python,

    >>> a = example.malloc(2000000000)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    MemoryError: Not enough memory
    >>>
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception {
      $action
      if (err_occurred()) {
        PyErr_SetString(PyExc_RuntimeError, err_message());
        SWIG_fail;
      }
    }
    

    No declaration name is given to %exception, it is applied to all wrapper functions.

    C++ exceptions are also easy to handle. For example, you can write code like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        PyErr_SetString(PyExc_IndexError, const_cast<char*>(e.what()));
        SWIG_fail;
      }
    }
    
    class Base {
    public:
      Foo *getitem(int index);      // Exception handled added
      ...
    };
    

    When raising a Python exception from C, use the PyErr_SetString() function as shown above followed by SWIG_fail. The following exception types can be used as the first argument.

    PyExc_ArithmeticError
    PyExc_AssertionError
    PyExc_AttributeError
    PyExc_EnvironmentError
    PyExc_EOFError
    PyExc_Exception
    PyExc_FloatingPointError
    PyExc_ImportError
    PyExc_IndexError
    PyExc_IOError
    PyExc_KeyError
    PyExc_KeyboardInterrupt
    PyExc_LookupError
    PyExc_MemoryError
    PyExc_NameError
    PyExc_NotImplementedError
    PyExc_OSError
    PyExc_OverflowError
    PyExc_RuntimeError
    PyExc_StandardError
    PyExc_SyntaxError
    PyExc_SystemError
    PyExc_TypeError
    PyExc_UnicodeError
    PyExc_ValueError
    PyExc_ZeroDivisionError
    

    SWIG_fail is a C macro which when called within the context of SWIG wrapper function, will jump to the error handler code. This will call any cleanup code (freeing any temp variables) and then return from the wrapper function so that the Python interpreter can raise the Python exception. This macro should always be called after setting a Python error in code snippets, such as typemaps and %exception, that are ultimately generated into the wrapper function.

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter.

    32.6.5 Optimization options

    32.6.5.1 -fastproxy

    The -fastproxy command line option enables faster method calling as the call is made directly into the C/C++ layer rather than going through a method wrapper.

    Consider wrapping a C++ class:

    struct Go {
      void callme0() {}
      void callme4(int a, int b, int c, int d) {}
      void callme8(double a, double b, double c, double d, double e, double f, double g, double i) {}
    };
    

    The default generated proxy class is:

    class Go(object):
        def callme0(self):
            return _example.Go_callme0(self)
    
        def callme4(self, a, b, c, d):
            return _example.Go_callme4(self, a, b, c, d)
    
        def callme8(self, a, b, c, d, e, f, g, i):
            return _example.Go_callme8(self, a, b, c, d, e, f, g, i)
        ...
    

    Each method in the Python class contains a Python proxy method which passes the arguments on to the underlying function in the low-level C/C++ module (_example in this case). The generated proxy class when using -fastproxy is:

    %module example
    class Go(object):
        callme0 = _swig_new_instance_method(_example.Go_callme0)
        callme4 = _swig_new_instance_method(_example.Go_callme4)
        callme8 = _swig_new_instance_method(_example.Go_callme8)
        ...
    

    where _swig_new_instance_method adds the method to the proxy class via C API calls for direct access to the underlying function in the low-level C/C++ module. Note that for some methods it is not possible to generate the direct access call and so -fastproxy is ignored. This happens, for example, when adding additional code to Python proxy methods, such as using %pythonprepend.

    The overhead calling into C/C++ from Python is reduced slightly using -fastproxy. Below are some timings in microseconds calling the 3 functions in the example above. Also included in the table for comparison is using the -builtin option covered in the Built-in Types.

    Method name Default -fastproxy -builtin
    callme0 0.15 0.09 0.07
    callme4 0.26 0.16 0.14
    callme8 0.32 0.20 0.17

    Although the -fastproxy option results in faster code over the default, the generated proxy code is not as user-friendly as docstring/doxygen comments and functions with default values are not visible in the generated Python proxy class. The -olddefs option can rectify this.

    The generated proxy class for the example above when using -fastproxy -olddefs is:

    class Go(object):
        def callme0(self):
            return _example.Go_callme0(self)
        callme0 = _swig_new_instance_method(_example.Go_callme0)
    
        def callme4(self, a, b, c, d):
            return _example.Go_callme4(self, a, b, c, d)
        callme4 = _swig_new_instance_method(_example.Go_callme4)
    
        def callme8(self, a, b, c, d, e, f, g, i):
            return _example.Go_callme8(self, a, b, c, d, e, f, g, i)
        callme8 = _swig_new_instance_method(_example.Go_callme8)
        ...
    

    The class defines each method in two different ways. The first definition is replaced by the second definition and so the second definition is the one used when the method is called. While this possibly provides the best of both worlds, the time to import the module will be slightly slower when the class is defined due to the additional method definitions.

    The command line options mentioned above also apply to wrapped C/C++ global functions, not just class methods.

    32.7 Tips and techniques

    Although SWIG is largely automatic, there are certain types of wrapping problems that require additional user input. Examples include dealing with output parameters, strings, binary data, and arrays. This chapter discusses the common techniques for solving these problems.

    32.7.1 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x-*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Python, this allows you to pass simple values. For example:

    >>> a = add(3, 4)
    >>> print a
    7
    >>> b = sub(7, 4)
    >>> print b
    3
    >>>
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Python, a mutated parameter shows up as a return value. For example:

    >>> a = negate(3)
    >>> print a
    -3
    >>>
    

    Note: Since most primitive Python objects are immutable, it is not possible to perform in-place modification of a Python object passed as a parameter.

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Python, the function will return multiple values.

    bytes, success = send_message("Hello World")
    if not success:
        print "Whoa!"
    else:
        print "Sent", bytes
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Python:

    >>> r, c = get_dimensions(m)
    

    Be aware that the primary purpose of the typemaps.i file is to support primitive datatypes. Writing a function like this

    void foo(Bar *OUTPUT);
    

    may not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    32.7.2 Simple pointers

    If you must work with simple pointers such as int * or double * and you don't want to use typemaps.i, consider using the cpointer.i library file. For example:

    %module example
    %include "cpointer.i"
    
    %inline %{
    extern void add(int x, int y, int *result);
    %}
    
    %pointer_functions(int, intp);
    

    The %pointer_functions(type, name) macro generates five helper functions that can be used to create, destroy, copy, assign, and dereference a pointer. In this case, the functions are as follows:

    int  *new_intp();
    int  *copy_intp(int *x);
    void  delete_intp(int *x);
    void  intp_assign(int *x, int value);
    int   intp_value(int *x);
    

    In Python, you would use the functions like this:

    >>> result = new_intp()
    >>> print result
    _108fea8_p_int
    >>> add(3, 4, result)
    >>> print intp_value(result)
    7
    >>>
    

    If you replace %pointer_functions() by %pointer_class(type, name), the interface is more class-like.

    >>> result = intp()
    >>> add(3, 4, result)
    >>> print result.value()
    7
    

    See the SWIG Library chapter for further details.

    32.7.3 Unbounded C Arrays

    Sometimes a C function expects an array to be passed as a pointer. For example,

    int sumitems(int *first, int nitems) {
      int i, sum = 0;
      for (i = 0; i < nitems; i++) {
        sum += first[i];
      }
      return sum;
    }
    

    To wrap this into Python, you need to pass an array pointer as the first argument. A simple way to do this is to use the carrays.i library file. For example:

    %include "carrays.i"
    %array_class(int, intArray);
    

    The %array_class(type, name) macro creates wrappers for an unbounded array object that can be passed around as a simple pointer like int * or double *. For instance, you will be able to do this in Python:

    >>> a = intArray(10000000)         # Array of 10-million integers
    >>> for i in xrange(10000):        # Set some values
    ...     a[i] = i
    >>> sumitems(a, 10000)
    49995000
    >>>
    

    The array "object" created by %array_class() does not encapsulate pointers inside a special array object. In fact, there is no bounds checking or safety of any kind (just like in C). Because of this, the arrays created by this library are extremely low-level indeed. You can't iterate over them nor can you even query their length. In fact, any valid memory address can be accessed if you want (negative indices, indices beyond the end of the array, etc.). Needless to say, this approach is not going to suit all applications. On the other hand, this low-level approach is extremely efficient and well suited for applications in which you need to create buffers, package binary data, etc.

    32.7.4 String handling

    If a C function has an argument of char *, then a Python string can be passed as input. For example:

    // C
    void foo(char *s);
    
    # Python
    >>> foo("Hello")
    

    When a Python string is passed as a parameter, the C function receives a pointer to the raw data contained in the string. Since Python strings are immutable, it is illegal for your program to change the value. In fact, doing so will probably crash the Python interpreter.

    If your program modifies the input parameter or uses it to return data, consider using the cstring.i library file described in the SWIG Library chapter.

    When functions return a char *, it is assumed to be a NULL-terminated string. Data is copied into a new Python string and returned.

    If your program needs to work with binary data, you can use a typemap to expand a Python string into a pointer/length argument pair. As luck would have it, just such a typemap is already defined. Just do this:

    %apply (char *STRING, int LENGTH) { (char *data, int size) };
    ...
    int parity(char *data, int size, int initial);
    

    Now in Python:

    >>> parity("e\x09ffss\x00\x00\x01\nx", 0)
    

    If you need to return binary data, you might use the cstring.i library file. The cdata.i library can also be used to extra binary data from arbitrary pointers.

    32.7.5 Default arguments

    C++ default argument code generation is documented in the main Default arguments section. There is also an optional Python specific feature that can be used called the python:cdefaultargs feature flag. By default, SWIG attempts to convert C++ default argument values into Python values and generates code into the Python layer containing these values. For example:

    struct CDA {
      int fff(int a = 1, bool b = false);
    };
    

    From Python this can be called as follows:

    >>> CDA().fff()        # C++ layer receives a=1 and b=false
    >>> CDA().fff(2)       # C++ layer receives a=2 and b=false
    >>> CDA().fff(3, True) # C++ layer receives a=3 and b=true
    

    The default code generation in the Python layer is:

    class CDA(object):
        ...
        def fff(self, a=1, b=False):
            return _default_args.CDA_fff(self, a, b)
    

    Adding the feature:

    %feature("python:cdefaultargs") CDA::fff;
    struct CDA {
      int fff(int a = 1, bool b = false);
    

    results in identical behaviour when called from Python, however, it results in different code generation:

    class CDA(object):
        ...
        def fff(self, *args):
            return _default_args.CDA_fff(self, *args)
    

    The default arguments are obtained in the C++ wrapper layer instead of the Python layer. Some code generation modes are quite different, eg -builtin and -fastproxy, and are unaffected by python:cdefaultargs as the default values are always obtained from the C++ layer.

    Note that not all default arguments can be converted into a Python equivalent. When SWIG does not convert them, it will generate code to obtain them from the C++ layer as if python:cdefaultargs was specified. This will happen if just one argument cannot be converted into a Python equivalent. This occurs typically when the argument is not fully numeric, such as int(1):

    struct CDA {
      int fff(int a = int(1), bool b = false);
    };
    

    Compatibility Note: SWIG-3.0.6 introduced the python:cdefaultargs feature. Versions of SWIG prior to this varied in their ability to convert C++ default values into equivalent Python default argument values.

    32.8 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Python C API as well as the material in the "Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Python interface or if you want to elevate your guru status.

    32.8.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Python to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) PyLong_AsLong($input);
      printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object of type PyObject *.

    When this example is compiled into a Python module, it operates as follows:

    >>> from example import *
    >>> fact(6)
    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int nonnegative {
      $1 = (int) PyLong_AsLong($input);
      if ($1 < 0) {
        PyErr_SetString(PyExc_ValueError, "Expected a nonnegative value.");
        SWIG_fail;
      }
    }
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int nonnegative.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG C++ type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) PyLong_AsLong($input);
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = PyString_AsString($input);
      $2 = PyString_Size($input);
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Python object. This allows the function to be used like this (notice how the length parameter is omitted):

    >>> example.count('e', 'Hello World')
    1
    >>>
    

    32.8.2 Python typemaps

    The previous section illustrated an "in" typemap for converting Python objects to C. A variety of different typemap methods are defined by the Python module. For example, to convert a C integer back into a Python object, you might define an "out" typemap like this:

    %typemap(out) int {
        $result = PyInt_FromLong((long) $1);
    }
    

    A detailed list of available methods can be found in the "Typemaps" chapter.

    However, the best source of typemap information (and examples) is probably the Python module itself. In fact, all of SWIG's default type handling is defined by typemaps. You can view these typemaps by looking at the files in the SWIG library. Just take into account that in the latest versions of swig (1.3.22+), the library files are not very pristine clear for the casual reader, as they used to be. The extensive use of macros and other ugly techniques in the latest version produce a very powerful and consistent Python typemap library, but at the cost of simplicity and pedagogic value.

    To learn how to write a simple or your first typemap, you better take a look at the SWIG library version 1.3.20 or so.

    32.8.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the "Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Python.

    $input

    A PyObject * holding a raw Python object with an argument or variable value.

    $result

    A PyObject * that holds the result to be returned to Python.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Python name of the wrapper function being created.

    32.8.4 Useful Python Functions

    When you write a typemap, you usually have to work directly with Python objects. The following functions may prove to be useful.

    Python Integer Functions

    PyObject *PyInt_FromLong(long l);
    long      PyInt_AsLong(PyObject *);
    int       PyInt_Check(PyObject *);
    

    Python Floating Point Functions

    PyObject *PyFloat_FromDouble(double);
    double    PyFloat_AsDouble(PyObject *);
    int       PyFloat_Check(PyObject *);
    

    Python String Functions

    PyObject *PyString_FromString(char *);
    PyObject *PyString_FromStringAndSize(char *, lint len);
    int       PyString_Size(PyObject *);
    char     *PyString_AsString(PyObject *);
    int       PyString_Check(PyObject *);
    

    Python List Functions

    PyObject *PyList_New(int size);
    int       PyList_Size(PyObject *list);
    PyObject *PyList_GetItem(PyObject *list, int i);
    int       PyList_SetItem(PyObject *list, int i, PyObject *item);
    int       PyList_Insert(PyObject *list, int i, PyObject *item);
    int       PyList_Append(PyObject *list, PyObject *item);
    PyObject *PyList_GetSlice(PyObject *list, int i, int j);
    int       PyList_SetSlice(PyObject *list, int i, int , PyObject *list2);
    int       PyList_Sort(PyObject *list);
    int       PyList_Reverse(PyObject *list);
    PyObject *PyList_AsTuple(PyObject *list);
    int       PyList_Check(PyObject *);
    

    Python Tuple Functions

    PyObject *PyTuple_New(int size);
    int       PyTuple_Size(PyObject *);
    PyObject *PyTuple_GetItem(PyObject *, int i);
    int       PyTuple_SetItem(PyObject *, int i, PyObject *item);
    PyObject *PyTuple_GetSlice(PyObject *t, int i, int j);
    int       PyTuple_Check(PyObject *);
    

    Python Dictionary Functions

    PyObject *PyDict_New();
    int       PyDict_Check(PyObject *);
    int       PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val);
    int       PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);
    int       PyDict_DelItem(PyObject *p, PyObject *key);
    int       PyDict_DelItemString(PyObject *p, char *key);
    PyObject* PyDict_Keys(PyObject *p);
    PyObject* PyDict_Values(PyObject *p);
    PyObject* PyDict_GetItem(PyObject *p, PyObject *key);
    PyObject* PyDict_GetItemString(PyObject *p, const char *key);
    int       PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);
    Py_ssize_t PyDict_Size(PyObject *p);
    int       PyDict_Update(PyObject *a, PyObject *b);
    int       PyDict_Merge(PyObject *a, PyObject *b, int override);
    PyObject* PyDict_Items(PyObject *p);
    

    Python File Conversion Functions

    PyObject *PyFile_FromFile(FILE *f);
    FILE     *PyFile_AsFile(PyObject *);
    int       PyFile_Check(PyObject *);
    

    Abstract Object Interface

    write me
    

    32.9 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "python.swg" and "typemaps.i" in the SWIG library.

    32.9.1 Converting Python list to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Python list object to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      /* Check if is a list */
      if (PyList_Check($input)) {
        int size = PyList_Size($input);
        int i = 0;
        $1 = (char **) malloc((size+1)*sizeof(char *));
        for (i = 0; i < size; i++) {
          PyObject *o = PyList_GetItem($input, i);
          if (PyString_Check(o)) {
            $1[i] = PyString_AsString(PyList_GetItem($input, i));
          } else {
            free($1);
            PyErr_SetString(PyExc_TypeError, "list must contain strings");
            SWIG_fail;
          }
        }
        $1[i] = 0;
      } else {
        PyErr_SetString(PyExc_TypeError, "not a list");
        SWIG_fail;
      }
    }
    
    // This cleans up the char ** array we malloc'd before the function call
    %typemap(freearg) char ** {
      free((char *) $1);
    }
    
    // Now a test function
    %inline %{
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    %}
    
    

    When this module is compiled, the wrapped C function now operates as follows :

    >>> from argv import *
    >>> print_args(["Dave", "Mike", "Mary", "Jane", "John"])
    argv[0] = Dave
    argv[1] = Mike
    argv[2] = Mary
    argv[3] = Jane
    argv[4] = John
    5
    

    In the example, two different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function.

    32.9.2 Expanding a Python object into multiple arguments

    Suppose that you had a collection of C functions with arguments such as the following:

    int foo(int argc, char **argv);
    

    In the previous example, a typemap was written to pass a Python list as the char **argv. This allows the function to be used from Python as follows:

    >>> foo(4, ["foo", "bar", "spam", "1"])
    

    Although this works, it's a little awkward to specify the argument count. To fix this, a multi-argument typemap can be defined. This is not very difficult--you only have to make slight modifications to the previous example:

    %typemap(in) (int argc, char **argv) {
      /* Check if is a list */
      if (PyList_Check($input)) {
        int i;
        $1 = PyList_Size($input);
        $2 = (char **) malloc(($1+1)*sizeof(char *));
        for (i = 0; i < $1; i++) {
          PyObject *o = PyList_GetItem($input, i);
          if (PyString_Check(o)) {
            $2[i] = PyString_AsString(PyList_GetItem($input, i));
          } else {
            free($2);
            PyErr_SetString(PyExc_TypeError, "list must contain strings");
            SWIG_fail;
          }
        }
        $2[i] = 0;
      } else {
        PyErr_SetString(PyExc_TypeError, "not a list");
        SWIG_fail;
      }
    }
    
    %typemap(freearg) (int argc, char **argv) {
      free((char *) $2);
    }
    

    When writing a multiple-argument typemap, each of the types is referenced by a variable such as $1 or $2. The typemap code simply fills in the appropriate values from the supplied Python object.

    With the above typemap in place, you will find it no longer necessary to supply the argument count. This is automatically set by the typemap code. For example:

    >>> foo(["foo", "bar", "spam", "1"])
    

    If your function is overloaded in C++, for example:

    int foo(int argc, char **argv);
    int foo();
    

    don't forget to also provide a suitable typecheck typemap for overloading such as:

    %typecheck(SWIG_TYPECHECK_STRING_ARRAY) (int argc, char **argv) {
      $1 = PyList_Check($input) ? 1 : 0;
    }
    

    If you don't you'll get an error message along the lines of:

    Traceback (most recent call last):
      File "runme.py", line 3, in >module<
        example.foo(["foo", "bar", "spam", "1"])
    TypeError: Wrong number or type of arguments for overloaded function 'foo'.
      Possible C/C++ prototypes are:
        foo(int, char **)
        foo()
    

    32.9.3 Using typemaps to return arguments

    A common problem in some C programs is that values may be returned in arguments rather than in the return value of a function. For example:

    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2) {
      ... Do a bunch of stuff ...
      *out1 = result1;
      *out2 = result2;
      return status;
    }
    

    A typemap can be used to handle this case as follows :

    %module outarg
    
    // This tells SWIG to treat an double * argument with name 'OutValue' as
    // an output value.  We'll append the value to the current result which
    // is guaranteed to be a List object by SWIG.
    
    %typemap(argout) double *OutValue {
      PyObject *o, *o2, *o3;
      o = PyFloat_FromDouble(*$1);
      if ((!$result) || ($result == Py_None)) {
        $result = o;
      } else {
        if (!PyTuple_Check($result)) {
          PyObject *o2 = $result;
          $result = PyTuple_New(1);
          PyTuple_SetItem($result, 0, o2);
        }
        o3 = PyTuple_New(1);
        PyTuple_SetItem(o3, 0, o);
        o2 = $result;
        $result = PySequence_Concat(o2, o3);
        Py_DECREF(o2);
        Py_DECREF(o3);
      }
    }
    
    int spam(double a, double b, double *OutValue, double *OutValue);
    
    

    The typemap works as follows. First, a check is made to see if any previous result exists. If so, it is turned into a tuple and the new output value is concatenated to it. Otherwise, the result is returned normally. For the sample function spam(), there are three output values--meaning that the function will return a 3-tuple of the results.

    As written, the function must accept 4 arguments as input values, last two being pointers to doubles. If these arguments are only used to hold output values (and have no meaningful input value), an additional typemap can be written. For example:

    %typemap(in, numinputs=0) double *OutValue(double temp) {
      $1 = &temp;
    }
    
    

    By specifying numinputs=0, the input value is ignored. However, since the argument still has to be set to some meaningful value before calling C, it is set to point to a local variable temp. When the function stores its output value, it will simply be placed in this local variable. As a result, the function can now be used as follows:

    >>> a = spam(4, 5)
    >>> print a
    (0, 2.45, 5.0)
    >>> x, y, z = spam(4, 5)
    >>>
    

    32.9.4 Mapping Python tuples into small arrays

    In some applications, it is sometimes desirable to pass small arrays of numbers as arguments. For example :

    extern void set_direction(double a[4]);       // Set direction vector
    

    This too, can be handled used typemaps as follows :

    // Grab a 4 element array as a Python 4-tuple
    %typemap(in) double[4](double temp[4]) {   // temp[4] becomes a local variable
      int i;
      if (PyTuple_Check($input)) {
        if (!PyArg_ParseTuple($input, "dddd", temp, temp+1, temp+2, temp+3)) {
          PyErr_SetString(PyExc_TypeError, "tuple must have 4 elements");
          SWIG_fail;
        }
        $1 = &temp[0];
      } else {
        PyErr_SetString(PyExc_TypeError, "expected a tuple.");
        SWIG_fail;
      }
    }
    
    

    This allows our set_direction function to be called from Python as follows :

    >>> set_direction((0.5, 0.0, 1.0, -0.25))
    

    Since our mapping copies the contents of a Python tuple into a C array, such an approach would not be recommended for huge arrays, but for small structures, this approach works fine.

    32.9.5 Mapping sequences to C arrays

    Suppose that you wanted to generalize the previous example to handle C arrays of different sizes. To do this, you might write a typemap as follows:

    // Map a Python sequence into any sized C double array
    %typemap(in) double[ANY](double temp[$1_dim0]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_TypeError, "Expecting a sequence");
        SWIG_fail;
      }
      if (PyObject_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Expecting a sequence with $1_dim0 elements");
        SWIG_fail;
      }
      for (i =0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (!PyFloat_Check(o)) {
          Py_XDECREF(o);
          PyErr_SetString(PyExc_ValueError, "Expecting a sequence of floats");
          SWIG_fail;
        }
        temp[i] = PyFloat_AsDouble(o);
        Py_DECREF(o);
      }
      $1 = &temp[0];
    }
    

    In this case, the variable $1_dim0 is expanded to match the array dimensions actually used in the C code. This allows the typemap to be applied to types such as:

    void foo(double x[10]);
    void bar(double a[4], double b[8]);
    

    Since the above typemap code gets inserted into every wrapper function where used, it might make sense to use a helper function instead. This will greatly reduce the amount of wrapper code. For example:

    %{
    static int convert_darray(PyObject *input, double *ptr, int size) {
      int i;
      if (!PySequence_Check(input)) {
        PyErr_SetString(PyExc_TypeError, "Expecting a sequence");
        return 0;
      }
      if (PyObject_Length(input) != size) {
        PyErr_SetString(PyExc_ValueError, "Sequence size mismatch");
        return 0;
      }
      for (i =0; i < size; i++) {
        PyObject *o = PySequence_GetItem(input, i);
        if (!PyFloat_Check(o)) {
          Py_XDECREF(o);
          PyErr_SetString(PyExc_ValueError, "Expecting a sequence of floats");
          return 0;
        }
        ptr[i] = PyFloat_AsDouble(o);
        Py_DECREF(o);
      }
      return 1;
    }
    %}
    
    %typemap(in) double [ANY](double temp[$1_dim0]) {
      if (!convert_darray($input, temp, $1_dim0)) {
        SWIG_fail;
      }
      $1 = &temp[0];
    }
    

    32.9.6 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. Since there are several ways in which pointers can be represented, the following two functions are used to safely perform this conversion:

    int SWIG_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Python object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. It is the bitwise-or of several flag values including SWIG_POINTER_EXCEPTION and SWIG_POINTER_DISOWN. The first flag makes the function raise an exception on type error. The second flag additionally steals ownership of an object. Returns 0 on success and -1 on error.

    PyObject *SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int own)

    Creates a new Python pointer object. ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag that indicates whether or not Python should take ownership of the pointer.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    PyObject *obj;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    Although the pointer handling functions are primarily intended for manipulating low-level pointers, both functions are fully aware of Python proxy classes. Specifically, SWIG_ConvertPtr() will retrieve a pointer from any object that has a this attribute. In addition, SWIG_NewPointerObj() can automatically generate a proxy class object (if applicable).

    32.9.7 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable. The example is a direct equivalent to this Java equivalent.

    Consider the following C++ code:

    #include <iostream>
    struct Wheel {
      int size;
      Wheel(int sz = 0) : size(sz) {}
      ~Wheel() { std::cout << "~Wheel" << std::endl; }
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from Python after running the code through SWIG:

    bike = Bike(10)
    wheel = bike.getWheel()
    print("wheel size: {}".format(wheel.size))
    
    del bike  # Allow bike to be garbage collected
    print("wheel size: {}".format(wheel.size))
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    ~Wheel
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance, a reference to the Bike must be added to the wheel instance.

    You can do this by adding the reference when the getWheel() method is called using one of three approaches:

    The easier, but less optimized, way is to use the %pythonappend directive (see Adding additional Python code):

    %pythonappend getWheel %{
      # val is the Wheel proxy, self is the Bike instance
      val.__bike_reference = self
    %}
    

    The code gets appended to the Python code generated for the Bike::getWheel wrapper function, where we store the Bike proxy instance onto the Wheel proxy instance before it is returned to the caller as follows.

    class Bike(object):
        ...
        def getWheel(self):
            val = _example.Bike_getWheel(self)
    
            # val is the Wheel proxy, self is the Bike instance
            val.__bike_reference = self
    
            return val
    

    The second option, which performs better and is required if you use the -builtin option, is to set the reference in the CPython implementation:

    %extend Wheel {
    // A reference to the parent class is added to ensure the underlying C++
    // object is not deleted while the item is in use
    %typemap(ret) Wheel& getWheel {
      PyObject *bike_reference_string = SWIG_Python_str_FromChar("__bike_reference");
      PyObject_SetAttr($result, bike_reference_string, $self);
      Py_DecRef(bike_reference_string);
    }
    }
    

    The third approach, shown below, is an optimization of the above approach and creates the "__bike_reference" Python string object just once. While this looks more complex, it is just a small variation on the above typemap plus a support function bike_reference() in a fragment called bike_reference_function. The bike_reference_init typemap generates code into the "init" section for an initial call to bike_reference() when the module is initialized and is done to create the "__bike_reference" Python string singleton in a thread-safe manner.

    %fragment("bike_reference_init", "init") {
      // Thread-safe initialization - initialize during Python module initialization
      bike_reference();
    }
    
    %fragment("bike_reference_function", "header", fragment="bike_reference_init") {
    
    static PyObject *bike_reference() {
      static PyObject *bike_reference_string = SWIG_Python_str_FromChar("__bike_reference");
      return bike_reference_string;
    }
    
    }
    
    %extend Wheel {
    // A reference to the parent class is added to ensure the underlying C++
    // object is not deleted while the item is in use
    %typemap(ret, fragment="bike_reference_function") Wheel& getWheel %{
      PyObject_SetAttr($result, bike_reference(), $self);
    %}
    }
    

    32.10 Docstring Features

    Using docstrings in Python code is becoming more and more important and more tools are coming on the scene that take advantage of them, everything from full-blown documentation generators to class browsers and popup call-tips in Python-aware IDEs. Given the way that SWIG generates the proxy code by default, your users will normally get something like "function_name(*args)" in the popup calltip of their IDE which is next to useless when the real function prototype might be something like this:

    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    The features described in this section make it easy for you to add docstrings to your modules, functions and methods that can then be used by the various tools out there to make the programming experience of your users much simpler.

    32.10.1 Module docstring

    Python allows a docstring at the beginning of the .py file before any other statements, and it is typically used to give a general description of the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example
    

    When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus,
    layout of controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc
    

    32.10.2 %feature("autodoc")

    As alluded to above SWIG will generate all the function and method proxy wrappers with just "*args" (or "*args, **kwargs" if the -keyword option is used) for a parameter list and will then sort out the individual parameters in the C wrapper code. This is nice and simple for the wrapper code, but makes it difficult to be programmer and tool friendly as anyone looking at the .py file will not be able to find out anything about the parameters that the functions accept.

    But since SWIG does know everything about the function it is possible to generate a docstring containing the parameter types, names and default values. Since many of the docstring tools are adopting a standard of recognizing if the first thing in the docstring is a function prototype then using that instead of what they found from introspection, then life is good once more.

    SWIG's Python module provides support for the "autodoc" feature, which when attached to a node in the parse tree will cause a docstring to be generated that includes the name of the function, parameter names, default values if any, and return type if any. There are also four levels for autodoc controlled by the value given to the feature, %feature("autodoc", "level"). The four values for level are covered in the following sub-sections.

    32.10.2.1 %feature("autodoc", "0")

    When level "0" is used then the types of the parameters will not be included in the autodoc string. For example, given this function prototype:

    %feature("autodoc", "0");
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    Then Python code like this will be generated:

    def function_name(*args, **kwargs):
        """function_name(x, y, foo=None, bar=None) -> bool"""
        ...
    

    32.10.2.2 %feature("autodoc", "1")

    When level "1" is used then the parameter types will be used in the autodoc string. In addition, an attempt is made to simplify the type name such that it makes more sense to the Python user. Pointer, reference and const info is removed if the associated type is has an associated Python type (%rename's are thus shown correctly). This works most of the time, otherwise a C/C++ type will be used. See the next section for the "docstring" feature for tweaking the docstrings to your liking. Given the example above, then turning on the parameter types with level "1" will result in Python code like this:

    def function_name(*args, **kwargs):
        """function_name(int x, int y, Foo foo=None, Bar bar=None) -> bool"""
        ...
    

    32.10.2.3 %feature("autodoc", "2")

    Level "2" results in the function prototype as per level "0". In addition, a line of documentation is generated for each parameter using numpydoc style. Using the previous example, the generated code will be:

    def function_name(*args, **kwargs):
        """
        function_name(x, y, foo=None, bar=None) -> bool
    
        Parameters
        ----------
        x: int
        y: int
        foo: Foo *
        bar: Bar *
    
        """
        ...
    

    Note that the documentation for each parameter is sourced from the "doc" typemap which by default shows the C/C++ type rather than the simplified Python type name described earlier for level "1". Typemaps can of course change the output for any particular type, for example the int x parameter:

    %feature("autodoc", "2");
    %typemap("doc") int x "$1_name (C++ type: $1_type) -- Input $1_name dimension"
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    resulting in

    def function_name(*args, **kwargs):
        """
        function_name(x, y, foo=None, bar=None) -> bool
    
        Parameters
        ----------
        x (C++ type: int) -- Input x dimension
        y: int
        foo: Foo *
        bar: Bar *
    
        """
    

    32.10.2.4 %feature("autodoc", "3")

    Level "3" results in the function prototype as per level "1" but also contains the same additional line of documentation for each parameter as per level "2". Using our earlier example again, the generated code will be:

    def function_name(*args, **kwargs):
        """
        function_name(int x, int y, Foo foo=None, Bar bar=None) -> bool
    
        Parameters
        ----------
        x: int
        y: int
        foo: Foo *
        bar: Bar *
    
        """
        ...
    

    32.10.2.5 %feature("autodoc", "docstring")

    Finally, there are times when the automatically generated autodoc string will make no sense for a Python programmer, particularly when a typemap is involved. So if you give an explicit value for the autodoc feature then that string will be used in place of the automatically generated string. For example:

    %feature("autodoc", "GetPosition() -> (x, y)") GetPosition;
    void GetPosition(int* OUTPUT, int* OUTPUT);
    

    32.10.3 %feature("docstring")

    In addition to the autodoc strings described above, you can also attach any arbitrary descriptive text to a node in the parse tree with the "docstring" feature. When the proxy module is generated then any docstring associated with classes, function or methods are output. If an item already has an autodoc string then it is combined with the docstring and they are output together. If the docstring is all on a single line then it is output like this::

    """This is the docstring"""
    

    Otherwise, to aid readability it is output like this:

    """
    This is a multi-line docstring
    with more than one line.
    """
    

    32.11 Python Packages

    Python has concepts of modules and packages. Modules are separate units of code and may be grouped together to form a package. Packages may be nested, that is they may contain subpackages. This leads to tree-like hierarchy, with packages as intermediate nodes and modules as leaf nodes.

    The hierarchy of Python packages/modules follows the hierarchy of *.py files found in a source tree (or, more generally, in the Python path). Normally, the developer creates new module by placing a *.py file somewhere under Python path; the module is then named after that *.py file. A package is created by placing an __init__.py file within a directory; the package is then named after that directory. For example, the following source tree:

    mod1.py
    pkg1/__init__.py
    pkg1/mod2.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/mod3.py
    

    defines the following Python packages and modules:

    pkg1            # package
    pkg1.pkg2       # package
    mod1            # module
    pkg1.mod2       # module
    pkg1.pkg2.mod3  # module
    

    The purpose of an __init__.py file is two-fold. First, the existence of __init__.py in a directory informs the Python interpreter that this directory contains a Python package. Second, the code in __init__.py is loaded/executed automatically when the package is initialized (when it or its submodule/subpackage gets import'ed). By default, SWIG generates proxy Python code – one *.py file for each *.i interface. The __init__.py files, however, are not generated by SWIG. They should be created by other means. Both files (module *.py and __init__.py) should be installed in appropriate destination directories in order to obtain a desirable package/module hierarchy.

    Python3 adds another option for packages with PEP 0420 (implicit namespace packages). Implicit namespace packages no longer use __init__.py files. SWIG generated Python modules support implicit namespace packages. See Implicit namespace packages for more information.

    You can place a SWIG generated module into a Python package or keep as a global module, details are covered a little later in Location of modules.

    The way Python defines its modules and packages impacts SWIG users. Some users may need to use special features such as the package option in the %module directive or import related command line options. These are explained in the following sections.

    32.11.1 Setting the Python package

    Using the package option in the %module directive allows you to specify a Python package that the module will be in when installed.

    %module(package="wx") xrc
    

    This is useful when the .i file is %imported by another .i file. By default SWIG will assume that the importer is able to find the importee with just the module name, but if they live in separate Python packages then this won't work. However if the importee specifies what its package is with the %module option then the Python code generated for the importer will use that package name when importing the other module and in base class declarations, etc..

    SWIG assumes that the package option provided to %module together with the module name (that is, wx.xrc in the above example) forms a fully qualified (absolute) name of a module (in Python terms). This is important especially for Python 3, where absolute imports are used by default. It's up to you to place the generated module files (.py, .so) in appropriate subdirectories. For example, if you have an interface file foo.i with:

    %module(package="pkg1.pkg2") foo
    

    then the resulting directory layout should be

    pkg1/
    pkg1/__init__.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/foo.py        # (generated by SWIG)
    pkg1/pkg2/_foo.so       # (shared library built from C/C++ code generated by SWIG)
    

    32.11.2 Absolute and relative imports

    Suppose, we have the following hierarchy of files:

    pkg1/
    pkg1/__init__.py
    pkg1/mod2.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/mod3.py
    

    Let the contents of pkg1/pkg2/mod3.py be

    class M3: pass
    

    We edit pkg1/mod2.py and want to import module pkg1/pkg2/mod3.py in order to derive from class M3. We can write appropriate Python code in several ways, for example:

    1. Using "import <>" syntax with absolute package name:

      # pkg1/mod2.py
      import pkg1.pkg2.mod3
      class M2(pkg1.pkg2.mod3.M3): pass
      
    2. Using "import <>" syntax with package name relative to pkg1 (only in Python 2.7 and earlier):

      # pkg1/mod2.py
      import pkg2.mod3
      class M2(pkg2.mod3.M3): pass
      
    3. Using "from <> import <>" syntax (relative import syntax, only in Python 2.5 and later):

      # pkg1/mod2.py
      from .pkg2 import mod3
      class M2(mod3.M3): pass
      
    4. Other variants, for example the following construction in order to have the pkg2.mod3.M3 symbol available in mod2 as in point 2 above (but now under Python 3):

      # pkg1/mod2.py
      from . import pkg2
      from .pkg2 import mod3
      class M2(pkg2.mod3.M3): pass
      

    Now suppose we have mod2.i with

    // mod2.i
    %module (package="pkg1") mod2
    %import "mod3.i"
    // ...
    

    and mod3.i with

    // mod3.i
    %module (package="pkg1.pkg2") mod3
    // ...
    

    By default, SWIG will generate mod2.py proxy file with import directive as in point 1. This can be changed with the -relativeimport command line option. The -relativeimport instructs SWIG to organize imports as in point 4 for Python 2.7.0 and newer.

    Compatibility Note: Versions of SWIG prior to SWIG-4.0.0 supported Python < 2.7.0 and would organize the imports as in point 2 if an older version of Python was detected at runtime.

    In short, if you have mod2.i and mod3.i as above, then without -relativeimport SWIG will write

    import pkg1.pkg2.mod3
    

    to mod2.py proxy file, and with -relativeimport it will write

    from . import pkg2
    from .pkg2 import mod3
    

    You should avoid using relative imports and use absolute ones whenever possible. There are some cases, however, when relative imports may be necessary. The first example is, when some (legacy) Python code refers entities imported by proxy files generated by SWIG, and it assumes that the proxy file uses relative imports. Second case is, when one puts import directives in __init__.py to import symbols from submodules or subpackages and the submodule depends on other submodules (discussed later).

    32.11.3 Enforcing absolute import semantics

    As you may know, there is an incompatibility in import semantics (for the import <> syntax) between Python 2 and 3. In Python 2.4 and earlier it is not clear whether

    import foo
    

    refers to a top-level module or to another module inside the current package. In Python 3 it always refers to a top-level module (see PEP 328). To instruct Python 2.5 through 2.7 to use new semantics (that is import foo is interpreted as absolute import), one has to put the following line

    from __future__ import absolute_import
    

    at the very beginning of your proxy *.py file. In SWIG, it may be accomplished with %pythonbegin directive as follows:

    %pythonbegin %{
    from __future__ import absolute_import
    %}
    

    32.11.4 Importing from __init__.py

    Imports in __init__.py are handy when you want to populate a package's namespace with names imported from other modules. In SWIG based projects this approach may also be used to split large pieces of code into smaller modules, compile them in parallel and then re-assemble everything at runtime by importing submodules' contents in __init__.py, for example.

    Unfortunately import directives in __init__.py may cause problems, especially if they refer to a package's submodules. This is caused by the way Python initializes packages. If you spot problems with imports from __init__.py try using -relativeimport option. Below we explain in detail one issue, for which the -relativeimport workaround may be helpful.

    Consider the following example (Python 3):

    pkg1/__init__.py        # (empty)
    pkg1/pkg2/__init__.py   # (imports something from bar.py)
    pkg1/pkg2/foo.py
    pkg1/pkg2/bar.py        # (imports foo.py)
    

    If the file contents are:

    • pkg1/pkg2/__init__.py:

      # pkg1/pkg2/__init__.py
      from .bar import Bar
      
    • pkg1/pkg2/foo.py:

      # pkg1/pkg2/foo.py
      class Foo: pass
      
    • pkg1/pkg2/bar.py:

      # pkg1/pkg2/bar.py
      import pkg1.pkg2.foo
      class Bar(pkg1.pkg2.foo.Foo): pass
      

    Now if one simply used import pkg1.pkg2, it will usually fail:

    >>> import pkg1.pkg2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "./pkg1/pkg2/__init__.py", line 2, in <module>
        from .bar import Bar
      File "./pkg1/pkg2/bar.py", line 3, in <module>
        class Bar(pkg1.pkg2.foo.Foo): pass
    AttributeError: 'module' object has no attribute 'pkg2'
    

    Surprisingly, if we execute the import pkg1.pkg2 directive for the second time, it succeeds. The reason seems to be following: when Python spots the from .bar import Bar directive in pkg1/pkg2/__init__.py it starts loading pkg1/pkg2/bar.py. This module imports pkg1.pkg2.foo in turn and tries to use pkg1.pkg2.foo.Foo, but the package pkg1 is not fully initialized yet (the initialization procedure is actually in progress) and it seems like the effect of the already seen import pkg1.pkg2.pkg3.foo is "delayed" or ignored. Exactly the same may happen to a proxy module generated by SWIG.

    One workaround for this case is to use a relative import in pkg1/pkg2/bar.py. If we change bar.py to be:

    from .pkg3 import foo
    class Bar(foo.Foo): pass
    

    or

    from . import pkg3
    from .pkg3 import foo
    class Bar(pkg3.foo.Foo): pass
    

    then the example works again. With SWIG, you need to enable the -relativeimport option in order to have the above workaround in effect (note, that the Python 2 case also needs the -relativeimport workaround).

    32.11.5 Implicit namespace packages

    Python 3.3 introduced PEP 0420 which implements implicit namespace packages. In a nutshell, implicit namespace packages remove the requirement of an __init__.py file and allow packages to be split across multiple PATH elements. For example:

    /fragment1/pkg1/mod1.py
    /fragment2/pkg1/mod2.py
    /fragment3/pkg1/mod3.py
    

    If PYTHONPATH is set to "/fragment1:/fragment2:/fragment3", then mod1, mod2 and mod3 will be part of pkg1. This allows for splitting of packages into separate pieces. This can be useful for SWIG generated wrappers in the following way.

    Suppose you create a SWIG wrapper for a module called robin. The SWIG generated code consists of two files robin.py and _robin.so. You wish to make these modules part of a subpackage (brave.sir). With implicit namespace packages you can place these files in the following configurations:

    Using PYTHONPATH="/some/path"

    /some/path/brave/sir/robin.py
    /some/path/brave/sir/_robin.so
    

    Using PYTHONPATH="/some/path:/some/other/path"

    /some/path/brave/sir/robin.py
    /some/other/path/brave/sir/_robin.so
    

    Finally suppose that your pure Python code is stored in a .zip file or some other way (database, web service connection, etc). Python can load the robin.py module using a custom importer. But the _robin.so module will need to be located on a file system. Implicit namespace packages make this possible. For example, using PYTHONPATH="/some/path/foo.zip:/some/other/path"

    Contents of foo.zip

    brave/
    brave/sir/
    brave/sir/robin.py
    

    File system contents

    /some/other/path/brave/sir/_robin.so
    

    Support for implicit namespace packages was added to python-3.3. The zipimporter requires python-3.5.1 or newer to work with subpackages.

    Compatibility Note: Support for implicit namespace packages was added in SWIG-3.0.9.

    32.11.6 Location of modules

    When SWIG creates wrappers from an interface file, say foo.i, two Python modules are created. There is a pure Python module (foo.py) and C/C++ code which is compiled and linked into a dynamically (or statically) loaded low-level module _foo (see the Preliminaries section for details). So, the interface file really defines two Python modules. How these two modules are loaded is covered next.

    The pure Python module needs to load the C/C++ module in order to call the wrapped C/C++ methods. To do this it must make some assumptions about the location of the C/C++ module. There are two configurations that are supported by default.

    1. Both modules in the same package

    2. Both modules are global

    Additional configurations are supported but require custom import code.

    The following sub-sections look more closely at the two default configurations as well as some customized configurations. An input interface file, foo.i, results in the two modules foo.py and _foo.so for each of the configurations.

    32.11.6.1 Both modules in the same package

    In this configuration, the pure Python module, foo.py, tries to load the C/C++ module, _foo, from the same package foo.py is located in. The package name is determined from the __package__ attribute if available, see PEP 366. Otherwise it is derived from the __name__ attribute given to foo.py by the Python loader that imported foo.py. The interface file for this configuration would contain:

    %module(package="mypackage") foo
    

    The location of the files could be as follows:

    /dir/mypackage/foo.py
    /dir/mypackage/__init__.py
    /dir/mypackage/_foo.so
    

    Assuming /dir/ is in PYTHONPATH, the module can be imported using

    from mypackage import foo
    

    32.11.6.2 Both modules are global

    In this configuration, there are no packages. If foo.py is not in a package, that is, it is a global module, then _foo is loaded as a global module. The interface file for this configuration would contain:

    %module foo
    

    The location of the files could be as follows:

    /dir/foo.py
    /dir/_foo.so
    

    Assuming /dir/ is in PYTHONPATH, the module can be imported using

    import foo
    

    32.11.6.3 Split modules custom configuration

    In this non-standard 'split module' configuration, the pure Python module is in a package and the low level C/C++ module is global. This configuration is not generally recommended and is not supported by default as it needs a custom configuration. The module import code customization required is via the moduleimport attribute in the %module directive. The next sub-section elaborates further on this. The interface file for this split module configuration would contain:

    %module(package="mypackage", moduleimport="import _foo") foo
    

    When using -builtin, use the following instead (the reasons are also covered shortly in the next sub-section):

    %module(package="mypackage", moduleimport="from _foo import *") foo
    

    The location of the files could be as follows:

    /dir/mypackage/foo.py
    /dir/mypackage/__init__.py
    /dir/_foo.so
    

    Assuming /dir/ is in PYTHONPATH, the module can be imported using

    from mypackage import foo
    

    Compatibility Note: Versions of SWIG prior to SWIG-4.0.0 supported split modules without the above customization. However, this had to be removed as the default import code often led to confusion due to obfuscation of genuine Python ImportError problems. Using one of the two default configurations is the recommended approach now.

    32.11.6.4 More on customizing the module import code

    The Python code implementing the default import logic is shown below. It supports the two configurations described earlier, that is, either both modules are in a package or loading both as global modules. The code is generated into the pure Python module, foo.py, and merely imports the low-level _foo module.

    if __package__ or '.' in __name__:
        from . import _foo
    else:
        import _foo
    

    This import code implementation is non-trivial but it can be replaced with custom code providing opportunities to make it simpler and/or more flexible. This is not normally recommended though unless you have a good understanding of the intricacies of importing Python modules. The custom code can be specified by setting the moduleimport option of the %module directive with the appropriate import code. For example:

    %module(moduleimport="import _foo") foo
    

    This will replace the default import logic above and generate the following into the pure Python module, foo.py:

    import _foo
    

    In fact the above is a simplification customization for the configuration where both modules are global; it removes the logic for also handling the modules being in a package.

    There is a special variable, $module, which is expanded into the low-level C/C++ module name, _foo in the case above. The identical output would be generated if instead the following had been used:

    %module(moduleimport="import $module") foo
    

    When you have many lines you can retain the easy readability of the %module directive by using a macro. For example:

    %define MODULEIMPORT
    "
    print 'Loading low-level module $module'
    import $module
    print 'Module has loaded'
    "
    %enddef
    
    %module(moduleimport=MODULEIMPORT) foo
    

    This will of course generate the following into the pure Python module:

    print 'Loading low-level module $module'
    import _foo
    print 'Module has loaded'
    

    When using the -builtin option, the link between the pure Python module and the low-level C/C++ module is slightly different as all the objects from the low-level module are imported directly into the pure Python module. The default import loading code is thus different:

    if __package__ or '.' in __name__:
        from ._foo import *
    else:
        from _foo import *
    

    Any customizations must import the code in a similar manner. The best way to support both with and without -builtin is to make use of the SWIGPYTHON_BUILTIN macro which is defined when -builtin is specified. The following will do this for the split modules case above.

    #if defined(SWIGPYTHON_BUILTIN) /* defined when using -builtin */
    %module(package="mypackage", moduleimport="from $module import *") foo
    #else
    %module(package="mypackage", moduleimport="import $module") foo
    #endif
    

    32.11.6.5 Statically linked C modules

    It is strongly recommended to use dynamically linked modules for the C portion of your pair of Python modules. If for some reason you still need to link the C module of the pair of Python modules generated by SWIG into your interpreter, then this section provides some details on how this impacts the pure Python modules ability to locate the other part of the pair. Please also see the Static Linking section.

    When Python is extended with C code the Python interpreter needs to be informed about details of the new C functions that have been linked into the executable. The code to do this is created by SWIG and is automatically called in the correct way when the module is dynamically loaded. However when the code is not dynamically loaded (because it is statically linked) Then the initialization method for the module created by SWIG is not called automatically and the Python interpreter has no idea that the new SWIG C module exists.

    Before Python 3, one could simply call the init method created by SWIG which would have normally been called when the shared object was dynamically loaded. The specific name of this method is not given here because statically linked modules are not encouraged with SWIG (Static Linking). However one can find this init function in the C file generated by SWIG.

    If you are really keen on static linking there are two ways to initialize the SWIG generated C module with the init method. Which way you use depends on what version of Python your module is being linked with. Python 2 and Python 3 treat this init function differently. And the way they treat it affects how the pure Python module will be able to locate the C module.

    The details concerning this are covered completely in the documentation for Python itself. Links to the relevant sections follow:

    There are two keys things to understand. The first is that in Python 2 the init() function returns void. In Python 3 the init() function returns a PyObject * which points to the new module. Secondly, when you call the init() method manually, you are the Python importer. So, you determine which package the C module will be located in.

    So, if you are using Python 3 it is important that you follow what is described in the Python documentation linked above. In particular, you can't simply call the init() function generated by SWIG and cast the PyObject pointer it returns over the side. If you do then Python 3 will have no idea that your C module exists and the pure Python half of your wrapper will not be able to find it. You need to register your module with the Python interpreter as described in the Python docs.

    With Python 2 things are somewhat more simple. In this case the init() function returns void. Calling it will register your new C module as a global module. The pure Python part of the SWIG wrapper will be able to find it because it tries both the pure Python module it is part of and the global module. If you wish not to have the statically linked module be a global module then you will either need to refer to the Python documentation on how to do this (remember you are now the Python importer) or use dynamic linking.

    32.12 Python 3 Support

    SWIG is able to support Python 3.x. The wrapper code generated by SWIG can be compiled with both Python 2.x or 3.x. Further more, by passing the -py3 command line option to SWIG, wrapper code with some Python 3 specific features can be generated (see below subsections for details of these features).

    There is a list of known-to-be-broken features in Python 3:

    • No more support for FILE* typemaps, because PyFile_AsFile has been dropped in Python 3.
    • The -apply command line option is removed and generating code using apply() is no longer supported.

    The following are Python 3 new features that are currently supported by SWIG.

    32.12.1 Function annotation

    The -py3 option will enable function annotation support. When used SWIG is able to generate proxy method definitions like this:

      def foo(self, bar : "int"=0) -> "void" : ...
    

    Also, even if without passing SWIG the -py3 option, the parameter list still could be generated:

      def foo(self, bar=0): ...
    

    But for overloaded function or method, the parameter list would fallback to *args or self, *args, and **kwargs may be append depend on whether you enabled the keyword argument. This fallback is due to all overloaded functions share the same function in SWIG generated proxy class.

    For detailed usage of function annotation, see PEP 3107.

    32.12.2 Buffer interface

    SWIG has a series of typemaps to support buffer interfaces. These typemap macros are defined in pybuffer.i, which must be included in order to use them. By using these typemaps, your wrapped function will be able to accept any Python object that exposes a suitable buffer interface.

    For example, the get_path() function puts the path string into the memory pointed to by its argument:

    void get_path(char *s);
    

    Then you can write a typemap like this: (the following example is applied to both Python 2 and 3, since the bytearray type was backported to 2.6.

    %include <pybuffer.i>
    %pybuffer_mutable_string(char *str);
    void get_path(char *str);
    

    And then on the Python side the wrapped get_path could be used in this way:

    >>> p = bytearray(10)
    >>> get_path(p)
    >>> print(p)
    bytearray(b'/Foo/Bar/\x00')
    

    The macros defined in pybuffer.i are similar to those in cstring.i:

    %pybuffer_mutable_binary(parm, size_parm)

    The macro can be used to generate a typemap which maps a buffer of an object to a pointer provided by parm and a size argument provided by size_parm. For example:

    %pybuffer_mutable_binary(char *str, size_t size);
    ...
    int snprintf(char *str, size_t size, const char *format, ...);
    

    In Python:

    >>> buf = bytearray(6)
    >>> snprintf(buf, "Hello world!")
    >>> print(buf)
    bytearray(b'Hello\x00')
    >>>
    

    %pybuffer_mutable_string(parm)

    This typemap macro requires the buffer to be a zero terminated string, and maps the pointer of the buffer to parm. For example:

    %pybuffer_mutable_string(char *str);
    ...
    size_t make_upper(char *str);
    

    In Python:

    >>> buf = bytearray(b'foo\x00')
    >>> make_upper(buf)
    >>> print(buf)
    bytearray(b'FOO\x00')
    >>>
    

    Both %pybuffer_mutable_binary and %pybuffer_mutable_string require the provided buffer to be mutable, eg. they can accept a bytearray type but can't accept an immutable byte type.

    %pybuffer_binary(parm, size_parm)

    This macro maps an object's buffer to a pointer parm and a size size_parm. It is similar to %pybuffer_mutable_binary, except the %pybuffer_binary can accept both mutable and immutable buffers. As a result, the wrapped function should not modify the buffer.

    %pybuffer_string(parm)

    This macro maps an object's buffer as a string pointer parm. It is similar to %pybuffer_mutable_string but the buffer could be both mutable and immutable. And your function should not modify the buffer.

    32.12.3 Abstract base classes

    By including pyabc.i and using the -py3 command line option when calling SWIG, the proxy classes of the STL containers will automatically gain an appropriate abstract base class from the collections.abc module. For example, the following SWIG interface:

    %include <pyabc.i>
    %include <std_map.i>
    %include <std_list.i>
    
    namespace std {
      %template(Mapii) map<int, int>;
      %template(IntList) list<int>;
    }
    

    will generate a Python proxy class Mapii inheriting from collections.abc.MutableMap and a proxy class IntList inheriting from collections.abc.MutableSequence.

    pyabc.i also provides a macro %pythonabc that could be used to define an abstract base class for your own C++ class:

    %pythonabc(MySet, collections.abc.MutableSet);
    

    For details of abstract base class, please see PEP 3119.

    Compatibility Note: SWIG-4.0.0 changed the base classes to use the collections.abc module instead of collections due to the deprecation of the classes in the collections module in Python 3.7. The collections.abc module was introduced in Python 3.3 and hence this feature requires Python 3.3 or later.

    32.12.4 Byte string output conversion

    By default, any byte string (char* or std::string) returned from C or C++ code is decoded to text as UTF-8. This decoding uses the surrogateescape error handler under Python 3.1 or higher -- this error handler decodes invalid byte sequences to high surrogate characters in the range U+DC80 to U+DCFF. As an example, consider the following SWIG interface, which exposes a byte string that cannot be completely decoded as UTF-8:

    %module example
    
    %inline %{
    
    const char * non_utf8_c_str(void) {
      return "h\xe9llo w\xc3\xb6rld";
    }
    
    void instring(const char *s) {
      ...
    }
    
    %}
    

    Note that "\xe9" is an invalid UTF-8 encoding, but "\xc3\xb6" is valid. When this method is called from Python 3, the return value is the following text string:

    >>> s = example.non_utf8_c_str()
    >>> s
    'h\udce9llo wörld'
    

    Since the C string contains bytes that cannot be decoded as UTF-8, those raw bytes are represented as high surrogate characters that can be used to obtain the original byte sequence:

    >>> b = s.encode('utf-8', errors='surrogateescape')
    >>> b
    b'h\xe9llo w\xc3\xb6rld'
    

    One can then attempt a different encoding, if desired (or simply leave the byte string as a raw sequence of bytes for use in binary protocols):

    >>> b.decode('latin-1')
    'héllo wörld'
    

    Note, however, that text strings containing surrogate characters are rejected with the default strict codec error handler. For example:

    >>> with open('test', 'w') as f:
    ...     print(s, file=f)
    ...
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    UnicodeEncodeError: 'utf-8' codec can't encode character '\udce9' in position 1: surrogates not allowed
    

    This requires the user to check most strings returned by SWIG bindings, but the alternative is for a non-UTF8 byte string to be completely inaccessible in Python 3 code.

    For more details about the surrogateescape error handler, please see PEP 383.

    When Python 3 strings are passed to the C/C++ layer, they are expected to be valid UTF8 Unicode strings too. For example, when the instring method above is wrapped and called, any invalid UTF8 Unicode code strings will result in a TypeError because the attempted conversion fails:

    >>> example.instring('h\xe9llo')
    >>> example.instring('h\udce9llo')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: in method 'instring', argument 1 of type 'char const *'
    

    In some cases, users may wish to instead handle all byte strings as bytes objects in Python 3. This can be accomplished by adding SWIG_PYTHON_STRICT_BYTE_CHAR to the generated code:

    %module char_to_bytes
    %begin %{
    #define SWIG_PYTHON_STRICT_BYTE_CHAR
    %}
    
    char *charstring(char *s) {
      return s;
    }
    

    This will modify the behavior so that only Python 3 bytes objects will be accepted and converted to a C/C++ string, and any string returned from C/C++ will be converted to a bytes object in Python 3:

    >>> from char_to_bytes import *
    >>> charstring(b"hi") # Byte string
    b'hi'
    >>> charstring("hi")  # Unicode string
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'char *'
    

    Note that in Python 2, defining SWIG_PYTHON_STRICT_BYTE_CHAR has no effect, since strings in Python 2 are equivalent to Python 3 bytes objects. However, there is a similar capability to force unicode-only handling for wide characters C/C++ strings (wchar_t * or std::wstring types) in Python 2. By default, in Python 2 both strings and unicode strings are converted to C/C++ wide strings, and returned wide strings are converted to a Python unicode string. To instead only convert unicode strings to wide strings, users can add SWIG_PYTHON_STRICT_UNICODE_WCHAR to the generated code:

    %module wchar_to_unicode
    %begin %{
    #define SWIG_PYTHON_STRICT_UNICODE_WCHAR
    %}
    
    wchar_t *wcharstring(wchar_t *s) {
      return s;
    }
    

    This ensures that only unicode strings are accepted by wcharstring in both Python 2 and Python 3:

    >>> from wchar_to_unicode import *
    >>> wcharstring(u"hi") # Unicode string
    u'hi'
    >>> wcharstring(b"hi") # Byte string
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'wchar_t *'
    

    By defining both SWIG_PYTHON_STRICT_BYTE_CHAR and SWIG_PYTHON_STRICT_UNICODE_WCHAR, Python wrapper code can support overloads taking both std::string (as Python bytes) and std::wstring (as Python unicode).

    32.12.5 Python 2 Unicode

    A Python 3 string is a Unicode string so by default a Python 3 string that contains Unicode characters passed to C/C++ will be accepted and converted to a C/C++ string (char * or std::string types). A Python 2 string is not a unicode string by default and should a Unicode string be passed to C/C++ it will fail to convert to a C/C++ string (char * or std::string types). The Python 2 behavior can be made more like Python 3 by defining SWIG_PYTHON_2_UNICODE when compiling the generated C/C++ code. By default when the following is wrapped:

    %module unicode_strings
    char *charstring(char *s) {
      return s;
    }
    

    An error will occur when using Unicode strings in Python 2:

    >>> from unicode_strings import *
    >>> charstring("hi")
    'hi'
    >>> charstring(u"hi")
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'char *'
    

    When the SWIG_PYTHON_2_UNICODE macro is added to the generated code:

    %module unicode_strings
    %begin %{
    #define SWIG_PYTHON_2_UNICODE
    %}
    
    char *charstring(char *s) {
      return s;
    }
    

    Unicode strings will be successfully accepted and converted from UTF-8, but note that they are returned as a normal Python 2 string:

    >>> from unicode_strings import *
    >>> charstring("hi")
    'hi'
    >>> charstring(u"hi")
    'hi'
    >>>
    

    Note that defining both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at the same time is not allowed, since the first is allowing unicode conversion and the second is explicitly prohibiting it.

    32.13 Support for Multithreaded Applications

    By default, SWIG does not enable support for multithreaded Python applications. More specifically, the Python wrappers generated by SWIG will not release the Python's interpreter's Global Interpreter Lock (GIL) when wrapped C/C++ code is entered. Hence, while any of the wrapped C/C++ code is executing, the Python interpreter will not be able to run any other threads, even if the wrapped C/C++ code is waiting in a blocking call for something like network or disk IO. Fortunately, SWIG does have the ability to enable multithreaded support and automatic release of the GIL either for all wrapped code in a module or on a more selective basis. The user interface for this is described in the next section.

    32.13.1 UI for Enabling Multithreading Support

    The user interface is as follows:

    1. Module thread support can be enabled in two ways:

      • The -threads SWIG Python option at the command line (or in setup.py):

        $ swig -python -threads example.i
      • The threads module option in the *.i template file:

        %module("threads"=1)
    2. You can disable thread support for a given method:

      %feature("nothread") method;
      or
      %nothread method;
    3. You can partially disable thread support for a given method:

      • To disable the C++/Python thread protection:

        %feature("nothreadblock") method;
        or
        %nothreadblock method;
      • To disable the Python/C++ thread protection

        %feature("nothreadallow") method;
        or
        %nothreadallow method;

    32.13.2 Multithread Performance

    For the curious about performance, here are some numbers for the profiletest.i test, which is used to check the speed of the wrapped code:

    Thread Mode Execution Time (sec) Comment
    Single Threaded 9.6 no "-threads" option given
    Fully Multithreaded 15.5 "-threads" option = 'allow' + 'block'
    No Thread block 12.2 only 'allow'
    No Thread Allow 13.6 only block'

    Fully threaded code decreases the wrapping performance by around 60%. If that is important to your application, you can tune each method using the different 'nothread', 'nothreadblock' or 'nothreadallow' features as needed. Note that for some methods deactivating the 'thread block' or 'thread allow' code is not an option, so, be careful.

    swig-4.0.2/Doc/Manual/Javascript.html0000644000175000017500000010221213667507563017302 0ustar williamwilliam

    27 SWIG and Javascript

    This chapter describes SWIG's support of Javascript. It does not cover SWIG basics, but only information that is specific to this module.

    27.1 Overview

    Javascript is a prototype-based scripting language that is dynamic, weakly typed and has first-class functions. Its arguably the most popular language for web development. Javascript has gone beyond being a browser-based scripting language and with node.js, it is also used as a backend development language.

    Native Javascript extensions can be used for applications that embed a web-browser view or that embed a Javascript engine (such as node.js). Extending a general purpose web-browser is not possible as this would be a severe security issue.

    SWIG Javascript currently supports JavascriptCore, the Javascript engine used by Safari/Webkit, and v8, which is used by Chromium and node.js.

    WebKit is a modern browser implementation available as open-source which can be embedded into an application. With node-webkit there is a platform which uses Google's Chromium as Web-Browser widget and node.js for javascript extensions.

    27.2 Preliminaries

    27.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    %module example
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo;

    To build a Javascript module, run SWIG using the -javascript option and a desired target engine -jsc, -v8, or -node. The generator for node is essentially delegating to the v8 generator and adds some necessary preprocessor definitions.

    $ swig -javascript -jsc example.i

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -javascript -jsc example.i

    The V8 code that SWIG generates should work with most versions from 3.11.10 up to 3.29.14 and later.

    The API headers for V8 >= 4.3.0 define constants which SWIG can use to determine the V8 version it is compiling for. For versions < 4.3.0, you need to specify the V8 version when running SWIG. This is specified as a hex constant, but the constant is read as pairs of decimal digits, so for V8 3.25.30 use constant 0x032530. This scheme can't represent components > 99, but this constant is only useful for V8 < 4.3.0, and no V8 versions from that era had a component > 99. For example:

    $ swig -c++ -javascript -v8 -DV8_VERSION=0x032530 example.i

    If you're targeting V8 >= 4.3.0, you would just run swig like so:

    $ swig -c++ -javascript -v8 example.i

    This creates a C/C++ source file example_wrap.c or example_wrap.cxx. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The wrapped module will export one function which must be called to register the module with the Javascript interpreter. For example, if your module is named example the corresponding initializer for JavascriptCore would be

    bool example_initialize(JSGlobalContextRef context, JSObjectRef *exports)

    and for v8:

    void example_initialize(v8::Handle<v8::Object> exports)

    Note: be aware that v8 has a C++ API, and thus, the generated modules must be compiled as C++.

    27.2.2 Running Tests and Examples

    The configuration for tests and examples currently supports Linux and Mac only and not MinGW (Windows) yet.

    The default interpreter is node.js as it is available on all platforms and convenient to use.

    Running the examples with JavascriptCore requires libjavascriptcoregtk-1.0 to be installed, e.g., under Ubuntu with

    $ sudo apt-get install libjavascriptcoregtk-1.0-dev

    Running with V8 requires libv8:

    $ sudo apt-get install libv8-dev

    Examples can be run using

    $ make check-javascript-examples ENGINE=jsc

    ENGINE can be node, jsc, or v8.

    The test-suite can be run using

    $ make check-javascript-test-suite ENGINE=jsc

    You can specify a specific V8 version for running the examples and tests

    $ make check-javascript-examples V8_VERSION=0x032530 ENGINE=v8

    27.2.3 Known Issues

    At the moment, the Javascript generators pass all tests syntactically, i.e., the generated source code compiles. However, there are still remaining runtime issues.

    • Default optional arguments do not work for all targeted interpreters

    • Multiple output arguments do not work for JSC

    • C89 incompatibility: the JSC generator might still generate C89 violating code

    • long long is not supported

    • Javascript callbacks are not supported

    • instanceOf does not work under JSC

    The primary development environment has been Linux (Ubuntu 12.04). Windows and Mac OS X have been tested sporadically. Therefore, the generators might have more issues on those platforms. Please report back any problem you observe to help us improving this module quickly.

    27.3 Integration

    This chapter gives a short introduction how to use a native Javascript extension: as a node.js module, and as an extension for an embedded Webkit.

    27.3.1 Creating node.js Extensions

    To install node.js you can download an installer from their web-site for Mac OS X and Windows. For Linux you can either build the source yourself and run sudo checkinstall or keep to the (probably stone-age) packaged version. For Ubuntu there is a PPA available.

    $ sudo add-apt-repository ppa:chris-lea/node.js
    $ sudo apt-get update
    $ sudo apt-get install nodejs

    As v8 is written in C++ and comes as a C++ library it is crucial to compile your module using the same compiler flags as used for building v8. To make things easier, node.js provides a build tool called node-gyp.

    You have to install it using npm:

    $ sudo npm install -g node-gyp

    node-gyp expects a configuration file named binding.gyp which is basically in JSON format and conforms to the same format that is used with Google's build-tool gyp.

    binding.gyp:

    {
      "targets": [
        {
          "target_name": "example",
          "sources": [ "example.cxx", "example_wrap.cxx" ]
        }
      ]
    }

    First create the wrapper using SWIG:

    $ swig -javascript -node -c++ example.i

    Then run node-gyp build to actually create the module:

    $ node-gyp build

    This will create a build folder containing the native module. To use the extension you need to 'require' it in your Javascript source file:

    require("./build/Release/example")

    A more detailed explanation is given in the Examples section.

    27.3.1.1 Troubleshooting

    • 'module' object has no attribute 'script_main'

    This error happens when gyp is installed as a distribution package. It seems to be outdated. Removing it resolves the problem.

    $ sudo apt-get remove gyp

    27.3.2 Embedded Webkit

    Webkit is pre-installed on Mac OS X and available as a library for GTK.

    27.3.2.1 Mac OS X

    There is general information about programming with WebKit on Apple Developer Documentation. Details about Cocoa programming are not covered here.

    An integration of a native extension 'example' would look like this:

    #import "appDelegate.h"
    
    extern bool example_initialize(JSGlobalContextRef context, JSObjectRef* exports);
    
    
    @implementation ExampleAppDelegate
    
    @synthesize webView;
    
    - (void)addGlobalObject:(JSContextRef) context:(NSString *)objectName:(JSObjectRef) theObject {
      JSObjectRef global = JSContextGetGlobalObject(context);
      JSStringRef objectJSName = JSStringCreateWithCFString( (CFStringRef) objectName )
      if ( objectJSName != NULL ) {
        JSObjectSetProperty(context, global, objectJSName, theObject, kJSPropertyAttributeReadOnly, NULL);
        JSStringRelease( objectJSName );
      }
    }
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    
      // Start a webview with the bundled index.html file
      NSString *path = [[NSBundle mainBundle] bundlePath];
      NSString *url =  [NSString stringWithFormat: @"file://%@/Contents/Assets/index.html", path];
    
      WebFrame *webframe = [webView mainFrame];
      JSGlobalContextRef context = [webframe globalContext];
    
      JSObjectRef example;
      example_initialize(context, &example);
      [self addGlobalObject:context:@"example":example]
    
      JSObjectSetProperty(context, global, JSStringRef propertyName, example, JSPropertyAttributes attributes, NULL);
    
      [ [webView mainFrame] loadRequest:
        [NSURLRequest requestWithURL: [NSURL URLWithString:url] ]
      ];
    }
    
    @end

    27.3.2.2 GTK

    There is general information about programming GTK at GTK documentation and in the GTK tutorial, and for Webkit there is a Webkit GTK+ API Reference.

    An integration of a native extension 'example' would look like this:

    #include <gtk/gtk.h>
    #include <webkit/webkit.h>
    
    extern bool example_initialize(JSGlobalContextRef context);
    
    int main(int argc, char* argv[])
    {
      // Initialize GTK+
      gtk_init(&argc, &argv);
    
      ...
    
      // Create a browser instance
      WebKitWebView *webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
      WebFrame *webframe = webkit_web_view_get_main_frame(webView);
      JSGlobalContextRef context = webkit_web_frame_get_global_context(webFrame);
      JSObjectRef global = JSContextGetGlobalObject(context);
    
      JSObjectRef exampleModule;
      example_initialize(context, &exampleModule);
      JSStringRef jsName = JSStringCreateWithUTF8CString("example");
      JSObjectSetProperty(context, global, jsName, exampleModule, kJSPropertyAttributeReadOnly, NULL);
      JSStringRelease(jsName);
    
      ...
    
      // Load a web page into the browser instance
      webkit_web_view_load_uri(webView, "http://www.webkitgtk.org/");
    
      ...
    
      // Run the main GTK+ event loop
      gtk_main();
    
      return 0;
    }

    27.3.3 Creating Applications with node-webkit

    To get started with node-webkit there is a very informative set of wiki pages.

    Similar to node.js, node-webkit is started from command line within a node.js project directory. Native extensions are created in the very same way as for node.js, except that a customized gyp derivate has to be used: nw-gyp.

    A simple example would have the following structure:

    - package.json
    - app.html
    - app.js
    - node_modules
      / example
      ... (as known from node.js)
    

    The configuration file essentially conforms to node.js syntax. It has some extras to configure node-webkit. See the Manifest specification for more details.

    package.json:

    {
      "name": "example",
      "main": "app.html",
      "window": {
        "show": true,
        "width": 800,
        "height": 600
      }
    }

    The 'main' property of package.json specifies a web-page to be rendered in the main window.

    app.html:

    <html>
      <head>
        <script src="app.js"></script>
      </head>
      <body>
        <div>
          The greatest common divisor of
          <span id="x"></span> and
          <span id="y"></span> is
          <span id="z"></span>.
        </div>
      </body>
    </html>

    As known from node.js one can use require to load javascript modules. Additionally, node-webkit provides an API that allows to manipulate the window's menu, open new windows, and many more things.

    app.js:

    window.onload = function() {
      var example = require("example");
      var x = 18;
      var y = 24;
      var z = example.gcd(x, y);
      document.querySelector('#x').innerHTML = x;
      document.querySelector('#y').innerHTML = y;
      document.querySelector('#z').innerHTML = z;
    };

    27.4 Examples

    Some basic examples are shown here in more detail.

    27.4.1 Simple

    The common example simple looks like this:

    /* File : example.i */
    %module example
    
    %inline %{
    extern int    gcd(int x, int y);
    extern double Foo;
    %}

    To make this available as a node extension a binding.gyp has to be created:

    {
      "targets": [
        {
          "target_name": "example",
          "sources": [ "example.cxx", "example_wrap.cxx" ]
        }
      ]
    }

    Then node-gyp is used to build the extension:

    $ node-gyp configure build

    From a 'nodejs` application the extension would be used like this:

    // import the extension via require
    var example = require("./build/Release/example");
    
    // calling the global method
    var x = 42;
    var y = 105;
    var g = example.gcd(x, y);
    
    // Accessing the global variable
    var f = example.Foo;
    example.Foo = 3.1415926;

    First the module example is loaded from the previously built extension. Global methods and variables are available in the scope of the module.

    Note: ECMAScript 5, the currently implemented Javascript standard, does not have modules. node.js and other implementations provide this mechanism defined by the CommonJS group. For browsers this is provided by Browserify, for instance.

    27.4.2 Class

    The common example class defines three classes, Shape, Circle, and Square:

    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      }
      double  x, y;
      void    move(double dx, double dy);
      virtual double area(void) = 0;
      virtual double perimeter(void) = 0;
      static  int nshapes;
    };
    
    class Circle : public Shape {
    private:
      double radius;
    public:
      Circle(double r) : radius(r) { }
      virtual double area(void);
      virtual double perimeter(void);
    };
    
    class Square : public Shape {
    private:
      double width;
    public:
      Square(double w) : width(w) { }
      virtual double area(void);
      virtual double perimeter(void);
    };

    Circle and Square inherit from Shape. Shape has a static variable nshapes, a function move that can't be overridden (non-virtual), and two abstract functions area and perimeter (pure virtual) that must be overridden by the sub-classes.

    A nodejs extension is built the same way as for the simple example.

    In Javascript it can be used as follows:

    var example = require("./build/Release/example");
    
    // local aliases for convenience
    var Shape = example.Shape;
    var Circle = example.Circle;
    var Square = example.Square;
    
    // creating new instances using the 'new' operator
    var c = new Circle(10);
    var s = new Square(10);
    
    // accessing a static member
    Shape.nshapes;
    
    // accessing member variables
    c.x = 20;
    c.y = 30;
    s.x = -10;
    s.y = 5;
    
    // calling some methods
    c.area();
    c.perimeter();
    s.area();
    s.perimeter();
    
    // instantiation of Shape is not permitted
    new Shape();

    Running these commands in an interactive node shell results in the following output:

    $ node -i
    & var example = require("./build/Release/example");
    undefined
    & var Shape = example.Shape;
    undefined
    & var Circle = example.Circle;
    undefined
    & var Square = example.Square;
    undefined
    & var c = new Circle(10);
    undefined
    & var s = new Square(10);
    undefined
    & Shape.nshapes;
    2
    & c.x = 20;
    20
    & c.y = 30;
    30
    & s.x = -10;
    -10
    & s.y = 5;
    5
    & c.area();
    314.1592653589793
    & c.perimeter();
    62.83185307179586
    & s.area();
    100
    & s.perimeter();
    40
    & c.move(40, 40)
    undefined
    & c.x
    60
    & c.y
    70
    & new Shape()
    Error: Class Shape can not be instantiated
    at repl:1:2
    at REPLServer.self.eval (repl.js:110:21)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.EventEmitter.emit (events.js:95:17)
    at Interface._onLine (readline.js:202:10)
    at Interface._line (readline.js:531:8)
    at Interface._ttyWrite (readline.js:760:14)
    at ReadStream.onkeypress (readline.js:99:10)
    at ReadStream.EventEmitter.emit (events.js:98:17)
    at emitKey (readline.js:1095:12)

    Note: In ECMAScript 5 there is no concept for classes. Instead each function can be used as a constructor function which is executed by the 'new' operator. Furthermore, during construction the key property prototype of the constructor function is used to attach a prototype instance to the created object. A prototype is essentially an object itself that is the first-class delegate of a class used whenever the access to a property of an object fails. The very same prototype instance is shared among all instances of one type. Prototypal inheritance is explained in more detail on in Inheritance and the prototype chain, for instance.

    27.5 Implementation

    The Javascript Module implementation has taken a very different approach compared to other language modules in order to support different Javascript interpreters.

    27.5.1 Source Code

    The Javascript module is implemented in Source/Modules/javascript.cxx. It dispatches the code generation to a JSEmitter instance, V8Emitter or JSCEmitter. Additionally there are some helpers: Template, for templated code generation, and JSEmitterState, which is used to manage state information during AST traversal. This rough map shall make it easier to find a way through this huge source file:

    // module wide defines
    
    #define NAME "name"
    ...
    
    // ###############################
    // #  Helper class declarations
    
    class JSEmitterState { ... };
    
    class Template { ... };
    
    // ###############################
    // # JSEmitter declaration
    
    class JSEmitter { ... };
    
    // Emitter factory declarations
    
    JSEmitter *swig_javascript_create_JSCEmitter();
    JSEmitter *swig_javascript_create_V8Emitter();
    
    // ###############################
    // # Javascript module
    
    // Javascript module declaration
    
    class JAVASCRIPT:public Language { ... };
    
    // Javascript module implementation
    
    int JAVASCRIPT::functionWrapper(Node *n) { ... }
    ...
    
    // Module factory implementation
    
    static Language *new_swig_javascript() { ... }
    
    extern "C" Language *swig_javascript(void) { ... }
    
    // ###############################
    // # JSEmitter base implementation
    
    JSEmitter::JSEmitter() { ... }
    
    Template JSEmitter::getTemplate(const String *name) { ... }
    ...
    
    // ###############################
    // # JSCEmitter
    
    // JSCEmitter declaration
    
    class JSCEmitter: public JSEmitter { ... };
    
    // JSCEmitter implementation
    
    JSCEmitter::JSCEmitter() { ... }
    
    void JSCEmitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) { ... }
    ...
    
    // JSCEmitter factory
    
    JSEmitter *swig_javascript_create_JSCEmitter() { ... }
    
    
    // ###############################
    // # V8Emitter
    
    // V8Emitter declaration
    
    class V8Emitter: public JSEmitter { ... };
    
    // V8Emitter implementation
    
    V8Emitter::V8Emitter() { ... }
    
    int V8Emitter::initialize(Node *n) { ... }
    
    // V8Emitter factory
    
    JSEmitter *swig_javascript_create_V8Emitter() { ... }
    
    
    // ###############################
    // # Helper implementation (JSEmitterState, Template)
    
    JSEmitterState::JSEmitterState() { ... }
    ...
    
    Template::Template(const String *code_) { ... }
    ...

    27.5.2 Code Templates

    All generated code is created on the basis of code templates. The templates for JavascriptCore can be found in Lib/javascript/jsc/javascriptcode.swg, for v8 in Lib/javascript/v8/javascriptcode.swg.

    To track the originating code template for generated code you can run

    $ swig -javascript -jsc -debug-codetemplates

    which wraps generated code with a descriptive comment

    /* begin fragment("template_name") */
    
    ...generated code ...
    
    /* end fragment("template_name") */

    The Template class is used like this:

    Template t_register = getTemplate("jsv8_register_static_variable");
    t_register.replace("$jsparent", state.clazz(NAME_MANGLED))
        .replace("$jsname", state.variable(NAME))
        .replace("$jsgetter", state.variable(GETTER))
        .replace("$jssetter", state.variable(SETTER))
        .trim().
        print(f_init_static_wrappers);

    A code template is registered with the JSEmitter via fragment(name, "template"), e.g.,

    %fragment ("jsc_variable_declaration", "templates")
    %{
      {"$jsname", $jsgetter, $jssetter, kJSPropertyAttributeNone},
    %}

    Template creates a copy of that string and Template::replace uses Swig's Replaceall to replace variables in the template. Template::trim can be used to eliminate leading and trailing whitespaces. Template::print is used to write the final template string to a Swig DOH (based on Printv). All methods allow chaining.

    27.5.3 Emitter

    The Javascript module delegates code generation to a JSEmitter instance. The following extract shows the essential interface:

    class JSEmitter {
      ...
    
      /**
       * Opens output files and temporary output DOHs.
       */
      virtual int initialize(Node *n);
    
      /**
       * Writes all collected code into the output file(s).
       */
      virtual int dump(Node *n) = 0;
    
      /**
       * Cleans up all open output DOHs.
       */
      virtual int close() = 0;
    
      ...
    
      /**
       * Invoked at the beginning of the classHandler.
       */
      virtual int enterClass(Node *);
    
      /**
       * Invoked at the end of the classHandler.
       */
      virtual int exitClass(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked at the beginning of the variableHandler.
       */
      virtual int enterVariable(Node *);
    
      /**
       * Invoked at the end of the variableHandler.
       */
      virtual int exitVariable(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked at the beginning of the functionHandler.
       */
      virtual int enterFunction(Node *);
    
      /**
       * Invoked at the end of the functionHandler.
       */
      virtual int exitFunction(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked by functionWrapper callback after call to Language::functionWrapper.
       */
      virtual int emitWrapperFunction(Node *n);
    
      /**
       * Invoked from constantWrapper after call to Language::constantWrapper.
       **/
      virtual int emitConstant(Node *n);
    
      /**
       * Registers a given code snippet for a given key name.
       *
       * This method is called by the fragmentDirective handler
       * of the JAVASCRIPT language module.
       **/
      int registerTemplate(const String *name, const String *code);
    
      /**
       * Retrieve the code template registered for a given name.
       */
      Template getTemplate(const String *name);
    
      State &getState();
    
      ...
    
    }

    The module calls initialize, dump, and close from within the top method:

    int JAVASCRIPT::top(Node *n) {
      emitter->initialize(n);
    
      Language::top(n);
    
      emitter->dump(n);
      emitter->close();
    
      return SWIG_OK;
    }

    The methods enterClass and exitClass are called from within the classHandler method:

    int JAVASCRIPT::classHandler(Node *n) {
    
      emitter->enterClass(n);
      Language::classHandler(n);
      emitter->exitClass(n);
    
      return SWIG_OK;
    }

    In enterClass the emitter stores state information that is necessary when processing class members. In exitClass the wrapper code for the whole class is generated.

    27.5.4 Emitter states

    For storing information during the AST traversal the emitter provides a JSEmitterState with different slots to store data representing the scopes global, class, function, and variable.

    class JSEmitterState {
    
    public:
    
      JSEmitterState();
    
      ~JSEmitterState();
    
      DOH *global();
    
      DOH *global(const char* key, DOH *initial = 0);
    
      DOH *clazz(bool reset = false);
    
      DOH *clazz(const char* key, DOH *initial = 0);
    
      DOH *function(bool reset = false);
    
      DOH *function(const char* key, DOH *initial = 0);
    
      DOH *variable(bool reset = false);
    
      DOH *variable(const char* key, DOH *initial = 0);
    
      static int IsSet(DOH *val);
    
      ...
    };

    When entering a scope, such as in enterClass, the corresponding state is reset and new data is stored:

    state.clazz(RESET);
    state.clazz(NAME, Getattr(n, "sym:name"));

    State information can be retrieved using state.clazz(NAME) or with Getattr on state.clazz() which actually returns a Hash instance.

    27.5.5 Handling Exceptions in JavascriptCore

    Applications with an embedded JavascriptCore should be able to present detailed exception messages that occur in the Javascript engine. Below is an example derived from code provided by Brian Barnes on how these exception details can be extracted.

    void script_exception_to_string(JSContextRef js_context, JSValueRef exception_value_ref, char* return_error_string, int return_error_string_max_length)
    {
      JSObjectRef exception_object;
      JSValueRef value_ref;
      JSStringRef jsstring_property_name = NULL;
      JSValueRef temporary_exception = NULL;
      JSStringRef js_return_string = NULL;
      size_t bytes_needed;
      char* c_result_string = NULL;
      exception_object = JSValueToObject(js_context, exception_value_ref, NULL);
    
      /* source url */
      strcpy(return_error_string, "[");
      jsstring_property_name = JSStringCreateWithUTF8CString("sourceURL");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
      bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
      c_result_string = (char*)calloc(bytes_needed, sizeof(char));
      JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
      JSStringRelease(js_return_string);
      strncat(return_error_string, c_result_string, return_error_string_max_length-1);
      free(c_result_string);
    
      strncat(return_error_string, ":", return_error_string_max_length-1);
    
      /* line number */
    
      jsstring_property_name = JSStringCreateWithUTF8CString("line");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
      bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
      c_result_string = (char*)calloc(bytes_needed, sizeof(char));
      JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
      JSStringRelease(js_return_string);
      strncat(return_error_string, c_result_string, return_error_string_max_length-1);
      free(c_result_string);
    
      strncat(return_error_string, "]", return_error_string_max_length-1);
    
      /* error message */
    
      jsstring_property_name = JSStringCreateWithUTF8CString("message");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      if(NULL == value_ref)
      {
        strncat(return_error_string, "Unknown Error", return_error_string_max_length-1);
      }
      else
      {
        js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
        bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
        c_result_string = (char*)calloc(bytes_needed, sizeof(char));
        JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
        JSStringRelease(js_return_string);
        strncat(return_error_string, c_result_string, return_error_string_max_length-1);
        free(c_result_string);
      }
    }

    It would be used in the following way:

    if(js_exception)
    {
      char return_error_string[256];
      script_exception_to_string(js_context, js_exception, return_error_string, 256);
      printf("Compile error is %s", return_error_string);
    }
    swig-4.0.2/Doc/Manual/linkchecker.config0000644000175000017500000000012513667507523017753 0ustar williamwilliam[filtering] ignorewarnings=http-robots-denied ignorewarnings=https-certificate-error swig-4.0.2/Doc/Manual/SWIGPlus.html0000644000175000017500000045631613667507562016631 0ustar williamwilliam SWIG and C++

    6 SWIG and C++

    This chapter describes SWIG's support for wrapping C++. It is mostly concerned about C++ as defined by the C++ 98 and 03 standards. For additions to the original C++ standard, please read the SWIG and C++11, SWIG and C++14 and SWIG and C++17 chapters. As a prerequisite, you should first read the chapter SWIG Basics to see how SWIG wraps ISO C. Support for C++ builds upon ISO C wrapping and that material will be useful in understanding this chapter.

    6.1 Comments on C++ Wrapping

    Because of its complexity and the fact that C++ can be difficult to integrate with itself let alone other languages, SWIG only provides support for a subset of C++ features. Fortunately, this is now a rather large subset.

    In part, the problem with C++ wrapping is that there is no semantically obvious (or automatic ) way to map many of its advanced features into other languages. As a simple example, consider the problem of wrapping C++ multiple inheritance to a target language with no such support. Similarly, the use of overloaded operators and overloaded functions can be problematic when no such capability exists in a target language.

    A more subtle issue with C++ has to do with the way that some C++ programmers think about programming libraries. In the world of SWIG, you are really trying to create binary-level software components for use in other languages. In order for this to work, a "component" has to contain real executable instructions and there has to be some kind of binary linking mechanism for accessing its functionality. In contrast, C++ has increasingly relied upon generic programming and templates for much of its functionality. Although templates are a powerful feature, they are largely orthogonal to the whole notion of binary components and libraries. For example, an STL vector does not define any kind of binary object for which SWIG can just create a wrapper. To further complicate matters, these libraries often utilize a lot of behind the scenes magic in which the semantics of seemingly basic operations (e.g., pointer dereferencing, procedure call, etc.) can be changed in dramatic and sometimes non-obvious ways. Although this "magic" may present few problems in a C++-only universe, it greatly complicates the problem of crossing language boundaries and provides many opportunities to shoot yourself in the foot. You will just have to be careful.

    6.2 Approach

    To wrap C++, SWIG uses a layered approach to code generation. At the lowest level, SWIG generates a collection of procedural ISO C style wrappers. These wrappers take care of basic type conversion, type checking, error handling, and other low-level details of the C++ binding. These wrappers are also sufficient to bind C++ into any target language that supports built-in procedures. In some sense, you might view this layer of wrapping as providing a C library interface to C++. On top of the low-level procedural (flattened) interface, SWIG generates proxy classes that provide a natural object-oriented (OO) interface to the underlying code. The proxy classes are typically written in the target language itself. For instance, in Python, a real Python class is used to provide a wrapper around the underlying C++ object.

    It is important to emphasize that SWIG takes a deliberately conservative and non-intrusive approach to C++ wrapping. SWIG does not encapsulate C++ classes inside a special C++ adaptor, it does not rely upon templates, nor does it add in additional C++ inheritance when generating wrappers. The last thing that most C++ programs need is even more compiler magic. Therefore, SWIG tries to maintain a very strict and clean separation between the implementation of your C++ application and the resulting wrapper code. You might say that SWIG has been written to follow the principle of least surprise--it does not play sneaky tricks with the C++ type system, it doesn't mess with your class hierarchies, and it doesn't introduce new semantics. Although this approach might not provide the most seamless integration with C++, it is safe, simple, portable, and debuggable.

    Some of this chapter focuses on the low-level procedural interface to C++ that is used as the foundation for all language modules. Keep in mind that the target languages also provide the high-level OO interface via proxy classes. More detailed coverage can be found in the documentation for each target language.

    6.3 Supported C++ features

    SWIG currently supports most C++ features including the following:

    • Classes
    • Constructors and destructors
    • Virtual functions
    • Public inheritance (including multiple inheritance)
    • Static functions
    • Function and method overloading
    • Operator overloading for many standard operators
    • References
    • Templates (including specialization and member templates)
    • Pointers to members
    • Namespaces
    • Default parameters
    • Smart pointers

    The following C++ features are not currently supported:

    • Overloaded versions of certain operators (new, delete, etc.)

    As a rule of thumb, SWIG should not be used on raw C++ source files, use header files only.

    SWIG's C++ support is an ongoing project so some of these limitations may be lifted in future releases. However, we make no promises. Also, submitting a bug report is a very good way to get problems fixed (wink).

    6.4 Command line options and compilation

    When wrapping C++ code, it is critical that SWIG be called with the `-c++' option. This changes the way a number of critical features such as memory management are handled. It also enables the recognition of C++ keywords. Without the -c++ flag, SWIG will either issue a warning or a large number of syntax errors if it encounters C++ code in an interface file.

    When compiling and linking the resulting wrapper file, it is normal to use the C++ compiler. For example:

    $ swig -c++ -tcl example.i
    $ c++ -fPIC -c example_wrap.cxx 
    $ c++ example_wrap.o $(OBJS) -o example.so
    

    Unfortunately, the process varies slightly on each platform. Make sure you refer to the documentation on each target language for further details. The SWIG Wiki also has further details.

    Compatibility Note: Early versions of SWIG generated just a flattened low-level C style API to C++ classes by default. The -noproxy commandline option is recognised by many target languages and will generate just this interface as in earlier versions.

    6.5 Proxy classes

    In order to provide a natural mapping from C++ classes to the target language classes, SWIG's target languages mostly wrap C++ classes with special proxy classes. These proxy classes are typically implemented in the target language itself. For example, if you're building a Python module, each C++ class is wrapped by a Python proxy class. Or if you're building a Java module, each C++ class is wrapped by a Java proxy class.

    6.5.1 Construction of proxy classes

    Proxy classes are always constructed as an extra layer of wrapping that uses low-level accessor functions. To illustrate, suppose you had a C++ class like this:

    class Foo {
      public:
        Foo();
        ~Foo();
        int  bar(int x);
        int  x;
    };
    

    Using C++ as pseudocode, a proxy class looks something like this:

    class FooProxy {
      private:
        Foo    *self;
      public:
        FooProxy() {
          self = new_Foo();
        }
        ~FooProxy() {
          delete_Foo(self);
        }
        int bar(int x) {
          return Foo_bar(self, x);
        }
        int x_get() {
          return Foo_x_get(self);
        }
        void x_set(int x) {
          Foo_x_set(self, x);
        }
    };
    

    Of course, always keep in mind that the real proxy class is written in the target language. For example, in Python, the proxy might look roughly like this:

    class Foo:
        def __init__(self):
            self.this = new_Foo()
        def __del__(self):
            delete_Foo(self.this)
        def bar(self, x):
            return Foo_bar(self.this, x)
        def __getattr__(self, name):
            if name == 'x':
                return Foo_x_get(self.this)
            ...
        def __setattr__(self, name, value):
            if name == 'x':
                Foo_x_set(self.this, value)
            ...
    

    Again, it's important to emphasize that the low-level accessor functions are always used by the proxy classes. Whenever possible, proxies try to take advantage of language features that are similar to C++. This might include operator overloading, exception handling, and other features.

    6.5.2 Resource management in proxies

    A major issue with proxies concerns the memory management of wrapped objects. Consider the following C++ code:

    class Foo {
    public:
      Foo();
      ~Foo();
      int bar(int x);
      int x;
    };
    
    class Spam {
    public:
      Foo *value;
      ...
    };
    

    Consider some script code that uses these classes:

    f = Foo()               # Creates a new Foo
    s = Spam()              # Creates a new Spam
    s.value = f             # Stores a reference to f inside s
    g = s.value             # Returns stored reference
    g = 4                   # Reassign g to some other value
    del f                   # Destroy f 
    

    Now, ponder the resulting memory management issues. When objects are created in the script, the objects are wrapped by newly created proxy classes. That is, there is both a new proxy class instance and a new instance of the underlying C++ class. In this example, both f and s are created in this way. However, the statement s.value is rather curious---when executed, a pointer to f is stored inside another object. This means that the scripting proxy class AND another C++ class share a reference to the same object. To make matters even more interesting, consider the statement g = s.value. When executed, this creates a new proxy class g that provides a wrapper around the C++ object stored in s.value. In general, there is no way to know where this object came from---it could have been created by the script, but it could also have been generated internally. In this particular example, the assignment of g results in a second proxy class for f. In other words, a reference to f is now shared by two proxy classes and a C++ class.

    Finally, consider what happens when objects are destroyed. In the statement, g=4, the variable g is reassigned. In many languages, this makes the old value of g available for garbage collection. Therefore, this causes one of the proxy classes to be destroyed. Later on, the statement del f destroys the other proxy class. Of course, there is still a reference to the original object stored inside another C++ object. What happens to it? Is the object still valid?

    To deal with memory management problems, proxy classes provide an API for controlling ownership. In C++ pseudocode, ownership control might look roughly like this:

    class FooProxy {
      public:
        Foo    *self;
        int     thisown;
    
        FooProxy() {
          self = new_Foo();
          thisown = 1;       // Newly created object
        }
        ~FooProxy() {
          if (thisown) delete_Foo(self);
        }
        ...
        // Ownership control API
        void disown() {
          thisown = 0;
        }
        void acquire() {
          thisown = 1;
        }
    };
    
    class FooPtrProxy: public FooProxy {
    public:
      FooPtrProxy(Foo *s) {
        self = s;
        thisown = 0;
      }
    };
    
    class SpamProxy {
      ...
      FooProxy *value_get() {
        return FooPtrProxy(Spam_value_get(self));
      }
      void value_set(FooProxy *v) {
        Spam_value_set(self, v->self);
        v->disown();
      }
      ...
    };
    

    Looking at this code, there are a few central features:

    • Each proxy class keeps an extra flag to indicate ownership. C++ objects are only destroyed if the ownership flag is set.
    • When new objects are created in the target language, the ownership flag is set.
    • When a reference to an internal C++ object is returned, it is wrapped by a proxy class, but the proxy class does not have ownership.
    • In certain cases, ownership is adjusted. For instance, when a value is assigned to the member of a class, ownership is lost.
    • Manual ownership control is provided by special disown() and acquire() methods.

    Given the tricky nature of C++ memory management, it is impossible for proxy classes to automatically handle every possible memory management problem. However, proxies do provide a mechanism for manual control that can be used (if necessary) to address some of the more tricky memory management problems.

    6.5.3 Language specific details

    Language specific details on proxy classes are contained in the chapters describing each target language. This chapter has merely introduced the topic in a very general way.

    6.6 Simple C++ wrapping

    The following code shows a SWIG interface file for a simple C++ class.

    %module list
    %{
    #include "list.h"
    %}
    
    // Very simple C++ example for linked list
    
    class List {
    public:
      List();
      ~List();
      int  search(char *value);
      void insert(char *);
      void remove(char *);
      char *get(int n);
      int  length;
    static void print(List *l);
    };
    

    To generate wrappers for this class, SWIG first reduces the class to a collection of low-level C-style accessor functions which are then used by the proxy classes.

    6.6.1 Constructors and destructors

    C++ constructors and destructors are translated into accessor functions such as the following :

    List * new_List(void) {
      return new List;
    }
    void delete_List(List *l) {
      delete l;
    }
    
    

    6.6.2 Default constructors, copy constructors and implicit destructors

    Following the C++ rules for implicit constructor and destructors, SWIG will automatically assume there is one even when they are not explicitly declared in the class interface.

    In general then:

    • If a C++ class does not declare any explicit constructor, SWIG will automatically generate a wrapper for one.
    • If a C++ class does not declare an explicit copy constructor, SWIG will automatically generate a wrapper for one if the %copyctor is used.
    • If a C++ class does not declare an explicit destructor, SWIG will automatically generate a wrapper for one.

    And as in C++, a few rules that alters the previous behavior:

    • A default constructor is not created if a class already defines a constructor with arguments.
    • Default constructors are not generated for classes with pure virtual methods or for classes that inherit from an abstract class, but don't provide definitions for all of the pure methods.
    • A default constructor is not created unless all base classes support a default constructor.
    • Default constructors and implicit destructors are not created if a class defines them in a private or protected section.
    • Default constructors and implicit destructors are not created if any base class defines a non-public default constructor or destructor.

    SWIG should never generate a default constructor, copy constructor or default destructor wrapper for a class in which it is illegal to do so. In some cases, however, it could be necessary (if the complete class declaration is not visible from SWIG, and one of the above rules is violated) or desired (to reduce the size of the final interface) by manually disabling the implicit constructor/destructor generation.

    To manually disable these, the %nodefaultctor and %nodefaultdtor feature flag directives can be used. Note that these directives only affects the implicit generation, and they have no effect if the default/copy constructors or destructor are explicitly declared in the class interface.

    For example:

    %nodefaultctor Foo;  // Disable the default constructor for class Foo.
    class Foo {          // No default constructor is generated, unless one is declared
    ...
    };
    class Bar {          // A default constructor is generated, if possible
    ...
    };
    

    The directive %nodefaultctor can also be applied "globally", as in:

    %nodefaultctor; // Disable creation of default constructors
    class Foo {     // No default constructor is generated, unless one is declared
    ...
    };
    class Bar {   
    public:
      Bar();        // The default constructor is generated, since one is declared
    };
    %clearnodefaultctor; // Enable the creation of default constructors again
    

    The corresponding %nodefaultdtor directive can be used to disable the generation of the default or implicit destructor, if needed. Be aware, however, that this could lead to memory leaks in the target language. Hence, it is recommended to use this directive only in well known cases. For example:

    %nodefaultdtor Foo;   // Disable the implicit/default destructor for class Foo.
    class Foo {           // No destructor is generated, unless one is declared
    ...
    };
    

    Compatibility Note: The generation of default constructors/implicit destructors was made the default behavior in SWIG 1.3.7. This may break certain older modules, but the old behavior can be easily restored using %nodefault or the -nodefault command line option. Furthermore, in order for SWIG to properly generate (or not generate) default constructors, it must be able to gather information from both the private and protected sections (specifically, it needs to know if a private or protected constructor/destructor is defined). In older versions of SWIG, it was fairly common to simply remove or comment out the private and protected sections of a class due to parser limitations. However, this removal may now cause SWIG to erroneously generate constructors for classes that define a constructor in those sections. Consider restoring those sections in the interface or using %nodefault to fix the problem.

    Note: The %nodefault directive/-nodefault options described above, which disable both the default constructor and the implicit destructors, could lead to memory leaks, and so it is strongly recommended to not use them.

    6.6.3 When constructor wrappers aren't created

    If a class defines a constructor, SWIG normally tries to generate a wrapper for it. However, SWIG will not generate a constructor wrapper if it thinks that it will result in illegal wrapper code. There are really two cases where this might show up.

    First, SWIG won't generate wrappers for protected or private constructors. For example:

    class Foo {
    protected:
      Foo();         // Not wrapped.
    public:
      ...
    };
    

    Next, SWIG won't generate wrappers for a class if it appears to be abstract--that is, it has undefined pure virtual methods. Here are some examples:

    class Bar {
    public:
      Bar();               // Not wrapped.  Bar is abstract.
      virtual void spam(void) = 0;
    };
    
    class Grok : public Bar {
    public:
      Grok();              // Not wrapped. No implementation of abstract spam().
    };
    

    Some users are surprised (or confused) to find missing constructor wrappers in their interfaces. In almost all cases, this is caused when classes are determined to be abstract. To see if this is the case, run SWIG with all of its warnings turned on:

    % swig -Wall -python module.i
    

    In this mode, SWIG will issue a warning for all abstract classes. It is possible to force a class to be non-abstract using this:

    %feature("notabstract") Foo;
    
    class Foo : public Bar {
    public:
      Foo();    // Generated no matter what---not abstract.
      ...
    };
    

    More information about %feature can be found in the Customization features chapter.

    6.6.4 Copy constructors

    If a class defines more than one constructor, its behavior depends on the capabilities of the target language. If overloading is supported, the copy constructor is accessible using the normal constructor function. For example, if you have this:

    class List {
    public:
      List();    
      List(const List &);      // Copy constructor
      ...
    };
    

    then the copy constructor can be used as follows:

    x = List()               # Create a list
    y = List(x)              # Copy list x
    

    If the target language does not support overloading, then the copy constructor is available through a special function like this:

    List *copy_List(List *f) {
      return new List(*f);
    }
    

    Note: For a class X, SWIG only treats a constructor as a copy constructor if it can be applied to an object of type X or X *. If more than one copy constructor is defined, only the first definition that appears is used as the copy constructor--other definitions will result in a name-clash. Constructors such as X(const X &), X(X &), and X(X *) are handled as copy constructors in SWIG.

    Note: SWIG does not generate a copy constructor wrapper unless one is explicitly declared in the class. This differs from the treatment of default constructors and destructors. However, copy constructor wrappers can be generated if using the copyctor feature flag. For example:

    %copyctor List;
    
    class List {
    public:
      List();    
    };
    

    Will generate a copy constructor wrapper for List.

    Compatibility note: Special support for copy constructors was not added until SWIG-1.3.12. In previous versions, copy constructors could be wrapped, but they had to be renamed. For example:

    class Foo {
    public:
      Foo();
      %name(CopyFoo) Foo(const Foo &);
      ...
    };
    

    For backwards compatibility, SWIG does not perform any special copy-constructor handling if the constructor has been manually renamed. For instance, in the above example, the name of the constructor is set to new_CopyFoo(). This is the same as in older versions.

    6.6.5 Member functions

    All member functions are roughly translated into accessor functions like this :

    int List_search(List *obj, char *value) {
      return obj->search(value);
    }
    
    

    This translation is the same even if the member function has been declared as virtual.

    It should be noted that SWIG does not actually create a C accessor function in the code it generates. Instead, member access such as obj->search(value) is directly inlined into the generated wrapper functions. However, the name and calling convention of the low-level procedural wrappers match the accessor function prototype described above.

    6.6.6 Static members

    Static member functions are called directly without making any special transformations. For example, the static member function print(List *l) directly invokes List::print(List *l) in the generated wrapper code.

    6.6.7 Member data

    Member data is handled in exactly the same manner as for C structures. A pair of accessor functions are effectively created. For example :

    int List_length_get(List *obj) {
      return obj->length;
    }
    int List_length_set(List *obj, int value) {
      obj->length = value;
      return value;
    }
    
    

    A read-only member can be created using the %immutable and %mutable feature flag directive. For example, we probably wouldn't want the user to change the length of a list so we could do the following to make the value available, but read-only.

    class List {
    public:
    ...
    %immutable;
      int length;
    %mutable;
    ...
    };
    

    Alternatively, you can specify an immutable member in advance like this:

    %immutable List::length;
    ...
    class List {
      ...
      int length;         // Immutable by above directive
      ...
    };
    

    Similarly, all data attributes declared as const are wrapped as read-only members.

    By default, SWIG uses the const reference typemaps for members that are primitive types. There are some subtle issues when wrapping data members that are not primitive types, such as classes. For instance, if you had another class like this,

    class Foo {
    public:
      List items;
      ...
    

    then the low-level accessor to the items member actually uses pointers. For example:

    List *Foo_items_get(Foo *self) {
      return &self->items;
    }
    void Foo_items_set(Foo *self, List *value) {
      self->items = *value;
    }
    

    More information about this can be found in the SWIG Basics chapter, Structure data members section.

    The wrapper code to generate the accessors for classes comes from the pointer typemaps. This can be somewhat unnatural for some types. For example, a user would expect the STL std::string class member variables to be wrapped as a string in the target language, rather than a pointer to this class. The const reference typemaps offer this type of marshalling, so there is a feature to tell SWIG to use the const reference typemaps rather than the pointer typemaps. It is the naturalvar feature and can be used to effectively change the way accessors are generated to the following:

    const List &Foo_items_get(Foo *self) {
      return self->items;
    }
    void Foo_items_set(Foo *self, const List &value) {
      self->items = value;
    }
    

    The %naturalvar directive is a macro for, and hence equivalent to, %feature("naturalvar"). It can be used as follows:

    // All List variables will use const List& typemaps
    %naturalvar List;
    
    // Only Foo::myList will use const List& typemaps
    %naturalvar Foo::myList;
    struct Foo {
      List myList;
    };
    
    // All non-primitive types will use const reference typemaps
    %naturalvar;
    

    The observant reader will notice that %naturalvar works like any other feature flag directive but with some extra flexibility. The first of the example usages above shows %naturalvar attaching to the myList's variable type, that is the List class. The second usage shows %naturalvar attaching to the variable name. Hence the naturalvar feature can be used on either the variable's name or type. Note that using the naturalvar feature on a variable's name overrides any naturalvar feature attached to the variable's type.

    It is generally a good idea to use this feature globally as the reference typemaps have extra NULL checking compared to the pointer typemaps. A pointer can be NULL, whereas a reference cannot, so the extra checking ensures that the target language user does not pass in a value that translates to a NULL pointer and thereby preventing any potential NULL pointer dereferences. The %naturalvar feature will apply to global variables in addition to member variables in some language modules, eg C# and Java.

    The naturalvar behavior can also be turned on as a global setting via the -naturalvar commandline option or the module mode option, %module(naturalvar=1). However, any use of %feature("naturalvar") will override the global setting.

    Compatibility note: The %naturalvar feature was introduced in SWIG-1.3.28, prior to which it was necessary to manually apply the const reference typemaps, eg %apply const std::string & { std::string * }, but this example would also apply the typemaps to methods taking a std::string pointer.

    Compatibility note: Read-only access used to be controlled by a pair of directives %readonly and %readwrite. Although these directives still work, they generate a warning message. Simply change the directives to %immutable; and %mutable; to silence the warning. Don't forget the extra semicolon!

    Compatibility note: Prior to SWIG-1.3.12, all members of unknown type were wrapped into accessor functions using pointers. For example, if you had a structure like this

    struct Foo {
      size_t  len;
    };
    

    and nothing was known about size_t, then accessors would be written to work with size_t *. Starting in SWIG-1.3.12, this behavior has been modified. Specifically, pointers will only be used if SWIG knows that a datatype corresponds to a structure or class. Therefore, the above code would be wrapped into accessors involving size_t. This change is subtle, but it smooths over a few problems related to structure wrapping and some of SWIG's customization features.

    6.7 Protection

    SWIG wraps class members that are public following the C++ conventions, i.e., by explicit public declaration or by the use of the using directive. In general, anything specified in a private or protected section will be ignored, although the internal code generator sometimes looks at the contents of the private and protected sections so that it can properly generate code for default constructors and destructors. Directors could also modify the way non-public virtual protected members are treated.

    By default, members of a class definition are assumed to be private until you explicitly give a `public:' declaration (This is the same convention used by C++).

    6.8 Enums and constants

    Enumerations and constants are handled differently by the different language modules and are described in detail in the appropriate language chapter. However, many languages map enums and constants in a class definition into constants with the classname as a prefix. For example :

    class Swig {
    public:
      enum {ALE, LAGER, PORTER, STOUT};
    };
    
    

    Generates the following set of constants in the target scripting language :

    Swig_ALE = Swig::ALE
    Swig_LAGER = Swig::LAGER
    Swig_PORTER = Swig::PORTER
    Swig_STOUT = Swig::STOUT
    
    

    Members declared as const are wrapped as read-only members and do not create constants.

    6.9 Friends

    Friend declarations are recognised by SWIG. For example, if you have this code:

    class Foo {
    public:
      ...
      friend void blah(Foo *f);
      ...
    };
    

    then the friend declaration does result in a wrapper code equivalent to one generated for the following declaration

    class Foo {
    public:
      ...
    };
    
    void blah(Foo *f);    
    

    A friend declaration, as in C++, is understood to be in the same scope where the class is declared, hence, you can have

    
    %ignore bar::blah(Foo *f);
    
    namespace bar {
    
      class Foo {
      public:
        ...
        friend void blah(Foo *f);
        ...
      };
    }
    

    and a wrapper for the method 'blah' will not be generated.

    6.10 References and pointers

    C++ references are supported, but SWIG transforms them back into pointers. For example, a declaration like this :

    class Foo {
    public:
      double bar(double &a);
    }
    

    has a low-level accessor

    double Foo_bar(Foo *obj, double *a) {
      obj->bar(*a);
    }
    

    As a special case, most language modules pass const references to primitive datatypes (int, short, float, etc.) by value instead of pointers. For example, if you have a function like this,

    void foo(const int &x);
    

    it is called from a script as follows:

    foo(3)              # Notice pass by value
    

    Functions that return a reference are remapped to return a pointer instead. For example:

    class Bar {
    public:
      Foo &spam();
    };
    

    Generates an accessor like this:

    Foo *Bar_spam(Bar *obj) {
      Foo &result = obj->spam();
      return &result;
    }
    

    However, functions that return const references to primitive datatypes (int, short, etc.) normally return the result as a value rather than a pointer. For example, a function like this,

    const int &bar();
    

    will return integers such as 37 or 42 in the target scripting language rather than a pointer to an integer.

    Don't return references to objects allocated as local variables on the stack. SWIG doesn't make a copy of the objects so this will probably cause your program to crash.

    Note: The special treatment for references to primitive datatypes is necessary to provide more seamless integration with more advanced C++ wrapping applications---especially related to templates and the STL. This was first added in SWIG-1.3.12.

    6.11 Pass and return by value

    Occasionally, a C++ program will pass and return class objects by value. For example, a function like this might appear:

    Vector cross_product(Vector a, Vector b);
    

    If no information is supplied about Vector, SWIG creates a wrapper function similar to the following:

    Vector *wrap_cross_product(Vector *a, Vector *b) {
      Vector x = *a;
      Vector y = *b;
      Vector r = cross_product(x, y);
      return new Vector(r);
    }

    In order for the wrapper code to compile, Vector must define a copy constructor and a default constructor.

    If Vector is defined as a class in the interface, but it does not support a default constructor, SWIG changes the wrapper code by encapsulating the arguments inside a special C++ template wrapper class, through a process called the "Fulton Transform". This produces a wrapper that looks like this:

    Vector cross_product(Vector *a, Vector *b) {
      SwigValueWrapper<Vector> x = *a;
      SwigValueWrapper<Vector> y = *b;
      SwigValueWrapper<Vector> r = cross_product(x, y);
      return new Vector(r);
    }
    

    This transformation is a little sneaky, but it provides support for pass-by-value even when a class does not provide a default constructor and it makes it possible to properly support a number of SWIG's customization options. The definition of SwigValueWrapper can be found by reading the SWIG wrapper code. This class is really nothing more than a thin wrapper around a pointer.

    Although SWIG usually detects the classes to which the Fulton Transform should be applied, in some situations it's necessary to override it. That's done with %feature("valuewrapper") to ensure it is used and %feature("novaluewrapper") to ensure it is not used:

    %feature("novaluewrapper") A;    
    class A;
    
    %feature("valuewrapper") B;
    struct B { 
      B();
      // ....
    };   
    

    It is well worth considering turning this feature on for classes that do have a default constructor. It will remove a redundant constructor call at the point of the variable declaration in the wrapper, so will generate notably better performance for large objects or for classes with expensive construction. Alternatively consider returning a reference or a pointer.

    Note: this transformation has no effect on typemaps or any other part of SWIG---it should be transparent except that you may see this code when reading the SWIG output file.

    Note: This template transformation is new in SWIG-1.3.11 and may be refined in future SWIG releases. In practice, it is only absolutely necessary to do this for classes that don't define a default constructor.

    Note: The use of this template only occurs when objects are passed or returned by value. It is not used for C++ pointers or references.

    6.12 Inheritance

    SWIG supports C++ inheritance of classes and allows both single and multiple inheritance, as limited or allowed by the target language. The SWIG type-checker knows about the relationship between base and derived classes and allows pointers to any object of a derived class to be used in functions of a base class. The type-checker properly casts pointer values and is safe to use with multiple inheritance.

    SWIG treats private or protected inheritance as close to the C++ spirit, and target language capabilities, as possible. In most cases, this means that SWIG will parse the non-public inheritance declarations, but that will have no effect in the generated code, besides the implicit policies derived for constructors and destructors.

    The following example shows how SWIG handles inheritance. For clarity, the full C++ code has been omitted.

    // shapes.i
    %module shapes
    %{
    #include "shapes.h"
    %}
    
    class Shape {
    public:
      double x, y;
      virtual double area() = 0;
      virtual double perimeter() = 0;
      void    set_location(double x, double y);
    };
    class Circle : public Shape {
    public:
      Circle(double radius);
      ~Circle();
      double area();
      double perimeter();
    };
    class Square : public Shape {
    public:
      Square(double size);
      ~Square();
      double area();
      double perimeter();
    }
    

    When wrapped into Python, we can perform the following operations (shown using the low level Python accessors):

    $ python
    >>> import shapes
    >>> circle = shapes.new_Circle(7)
    >>> square = shapes.new_Square(10)
    >>> print shapes.Circle_area(circle)
    153.93804004599999757
    >>> print shapes.Shape_area(circle)
    153.93804004599999757
    >>> print shapes.Shape_area(square)
    100.00000000000000000
    >>> shapes.Shape_set_location(square, 2, -3)
    >>> print shapes.Shape_perimeter(square)
    40.00000000000000000
    >>>
    

    In this example, Circle and Square objects have been created. Member functions can be invoked on each object by making calls to Circle_area, Square_area, and so on. However, the same results can be accomplished by simply using the Shape_area function on either object.

    One important point concerning inheritance is that the low-level accessor functions are only generated for classes in which they are actually declared. For instance, in the above example, the method set_location() is only accessible as Shape_set_location() and not as Circle_set_location() or Square_set_location(). Of course, the Shape_set_location() function will accept any kind of object derived from Shape. Similarly, accessor functions for the attributes x and y are generated as Shape_x_get(), Shape_x_set(), Shape_y_get(), and Shape_y_set(). Functions such as Circle_x_get() are not available--instead you should use Shape_x_get().

    Note that there is a one to one correlation between the low-level accessor functions and the proxy methods and therefore there is also a one to one correlation between the C++ class methods and the generated proxy class methods.

    Note: For the best results, SWIG requires all base classes to be defined in an interface. Otherwise, you may get a warning message like this:

    example.i:18: Warning 401: Nothing known about base class 'Foo'. Ignored.
    

    If any base class is undefined, SWIG still generates correct type relationships. For instance, a function accepting a Foo * will accept any object derived from Foo regardless of whether or not SWIG actually wrapped the Foo class. If you really don't want to generate wrappers for the base class, but you want to silence the warning, you might consider using the %import directive to include the file that defines Foo. %import simply gathers type information, but doesn't generate wrappers. Alternatively, you could just define Foo as an empty class in the SWIG interface or use warning suppression.

    Note: typedef-names can be used as base classes. For example:

    class Foo {
    ...
    };
    
    typedef Foo FooObj;
    class Bar : public FooObj {     // Ok.  Base class is Foo
    ...
    };
    

    Similarly, typedef allows unnamed structures to be used as base classes. For example:

    typedef struct {
      ...
    } Foo;
    
    class Bar : public Foo {    // Ok. 
    ...
    };
    

    Compatibility Note: Starting in version 1.3.7, SWIG only generates low-level accessor wrappers for the declarations that are actually defined in each class. This differs from SWIG1.1 which used to inherit all of the declarations defined in base classes and regenerate specialized accessor functions such as Circle_x_get(), Square_x_get(), Circle_set_location(), and Square_set_location(). This behavior resulted in huge amounts of replicated code for large class hierarchies and made it awkward to build applications spread across multiple modules (since accessor functions are duplicated in every single module). It is also unnecessary to have such wrappers when advanced features like proxy classes are used. Note: Further optimizations are enabled when using the -fvirtual option, which avoids the regenerating of wrapper functions for virtual members that are already defined in a base class.

    6.13 A brief discussion of multiple inheritance, pointers, and type checking

    When a target scripting language refers to a C++ object, it normally uses a tagged pointer object that contains both the value of the pointer and a type string. For example, in Tcl, a C++ pointer might be encoded as a string like this:

    _808fea88_p_Circle
    

    A somewhat common question is whether or not the type-tag could be safely removed from the pointer. For instance, to get better performance, could you strip all type tags and just use simple integers instead?

    In general, the answer to this question is no. In the wrappers, all pointers are converted into a common data representation in the target language. Typically this is the equivalent of casting a pointer to void *. This means that any C++ type information associated with the pointer is lost in the conversion.

    The problem with losing type information is that it is needed to properly support many advanced C++ features--especially multiple inheritance. For example, suppose you had code like this:

    class A {
    public:
      int x;
    };
    
    class B {
    public:
      int y;
    };
    
    class C : public A, public B {
    };
    
    int A_function(A *a) {
      return a->x;
    }
    
    int B_function(B *b) {
      return b->y;
    }
    

    Now, consider the following code that uses void *.

    C *c = new C();
    void *p = (void *) c;
    ...
    int x = A_function((A *) p);
    int y = B_function((B *) p);
    

    In this code, both A_function() and B_function() may legally accept an object of type C * (via inheritance). However, one of the functions will always return the wrong result when used as shown. The reason for this is that even though p points to an object of type C, the casting operation doesn't work like you would expect. Internally, this has to do with the data representation of C. With multiple inheritance, the data from each base class is stacked together. For example:

                 ------------    <--- (C *),  (A *)
                |     A      |
                |------------|   <--- (B *)
                |     B      |
                 ------------   
    

    Because of this stacking, a pointer of type C * may change value when it is converted to a A * or B *. However, this adjustment does not occur if you are converting from a void *.

    The use of type tags marks all pointers with the real type of the underlying object. This extra information is then used by SWIG generated wrappers to correctly cast pointer values under inheritance (avoiding the above problem).

    Some of the language modules are able to solve the problem by storing multiple instances of the pointer, for example, A *, in the A proxy class as well as C * in the C proxy class. The correct cast can then be made by choosing the correct void * pointer to use and is guaranteed to work as the cast to a void pointer and back to the same type does not lose any type information:

    C *c = new C();
    void *p = (void *) c;
    void *pA = (void *) c;
    void *pB = (void *) c;
    ...
    int x = A_function((A *) pA);
    int y = B_function((B *) pB);
    

    In practice, the pointer is held as an integral number in the target language proxy class.

    6.14 Default arguments

    SWIG will wrap all types of functions that have default arguments. For example member functions:

    class Foo {
    public:
      void bar(int x, int y = 3, int z = 4);
    };
    

    SWIG handles default arguments by generating an extra overloaded method for each defaulted argument. SWIG is effectively handling methods with default arguments as if it was wrapping the equivalent overloaded methods. Thus for the example above, it is as if we had instead given the following to SWIG:

    class Foo {
    public:
      void bar(int x, int y, int z);
      void bar(int x, int y);
      void bar(int x);
    };
    

    The wrappers produced are exactly the same as if the above code was instead fed into SWIG. Details of this are covered in the next section Overloaded functions and methods. This approach allows SWIG to wrap all possible default arguments, but can be verbose. For example if a method has ten default arguments, then eleven wrapper methods are generated.

    Please see the Features and default arguments section for more information on using %feature with functions with default arguments. The Renaming and ambiguity resolution section also deals with using %rename and %ignore on methods with default arguments. If you are writing your own typemaps for types used in methods with default arguments, you may also need to write a typecheck typemap. See the Typemaps and overloading section for details or otherwise use the compactdefaultargs feature flag as mentioned below.

    Compatibility note: Versions of SWIG prior to SWIG-1.3.23 wrapped default arguments slightly differently. Instead a single wrapper method was generated and the default values were copied into the C++ wrappers so that the method being wrapped was then called with all the arguments specified. If the size of the wrappers are a concern then this approach to wrapping methods with default arguments can be re-activated by using the compactdefaultargs feature flag.

    %feature("compactdefaultargs") Foo::bar;
    class Foo {
    public:
      void bar(int x, int y = 3, int z = 4);
    };
    

    This is great for reducing the size of the wrappers, but the caveat is it does not work for the statically typed languages, such as C# and Java, which don't have optional arguments in the language, Another restriction of this feature is that it cannot handle default arguments that are not public. The following example illustrates this:

    class Foo {
    private:
      static const int spam;
    public:
      void bar(int x, int y = spam);   // Won't work with %feature("compactdefaultargs") -
                                       // private default value
    };
    

    This produces uncompilable wrapper code because default values in C++ are evaluated in the same scope as the member function whereas SWIG evaluates them in the scope of a wrapper function (meaning that the values have to be public).

    The compactdefaultargs feature is automatically turned on when wrapping C code with default arguments. Some target languages will also automatically turn on this feature if the keyword arguments feature (kwargs) is specified for either C or C++ functions, and the target language supports kwargs, the compactdefaultargs feature is also automatically turned on. Keyword arguments are a language feature of some scripting languages, for example Ruby and Python. SWIG is unable to support kwargs when wrapping overloaded methods, so the default approach cannot be used.

    6.15 Overloaded functions and methods

    In many language modules, SWIG provides partial support for overloaded functions, methods, and constructors. For example, if you supply SWIG with overloaded functions like this:

    void foo(int x) {
      printf("x is %d\n", x);
    }
    void foo(char *x) {
      printf("x is '%s'\n", x);
    }
    

    The function is used in a completely natural way. For example:

    >>> foo(3)
    x is 3
    >>> foo("hello")
    x is 'hello'
    >>>
    

    Overloading works in a similar manner for methods and constructors. For example if you have this code,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);   // Copy constructor
      void bar(int x);
      void bar(char *s, int y);
    };
    

    it might be used like this

    >>> f = Foo()          # Create a Foo
    >>> f.bar(3)
    >>> g = Foo(f)         # Copy Foo
    >>> f.bar("hello", 2)
    

    6.15.1 Dispatch function generation

    The implementation of overloaded functions and methods is somewhat complicated due to the dynamic nature of scripting languages. Unlike C++, which binds overloaded methods at compile time, SWIG must determine the proper function as a runtime check for scripting language targets. This check is further complicated by the typeless nature of certain scripting languages. For instance, in Tcl, all types are simply strings. Therefore, if you have two overloaded functions like this,

    void foo(char *x);
    void foo(int x);
    

    the order in which the arguments are checked plays a rather critical role.

    For statically typed languages, SWIG uses the language's method overloading mechanism. To implement overloading for the scripting languages, SWIG generates a dispatch function that checks the number of passed arguments and their types. To create this function, SWIG first examines all of the overloaded methods and ranks them according to the following rules:

    1. Number of required arguments. Methods are sorted by increasing number of required arguments.
    2. Argument type precedence. All C++ datatypes are assigned a numeric type precedence value (which is determined by the language module).

      Type              Precedence
      ----------------  ----------
      TYPE *            0     (High)
      void *            20
      Integers          40
      Floating point    60
      char              80
      Strings           100   (Low)
      

      Using these precedence values, overloaded methods with the same number of required arguments are sorted in increased order of precedence values.

    This may sound very confusing, but an example will help. Consider the following collection of overloaded methods:

    void foo(double);
    void foo(int);
    void foo(Bar *);
    void foo();
    void foo(int x, int y, int z, int w);
    void foo(int x, int y, int z = 3);
    void foo(double x, double y);
    void foo(double x, Bar *z);
    

    The first rule simply ranks the functions by required argument count. This would produce the following list:

    rank
    -----
    [0]   foo()
    [1]   foo(double);
    [2]   foo(int);
    [3]   foo(Bar *);
    [4]   foo(int x, int y, int z = 3);
    [5]   foo(double x, double y)
    [6]   foo(double x, Bar *z)
    [7]   foo(int x, int y, int z, int w);
    

    The second rule, simply refines the ranking by looking at argument type precedence values.

    rank
    -----
    [0]   foo()
    [1]   foo(Bar *);
    [2]   foo(int);
    [3]   foo(double);
    [4]   foo(int x, int y, int z = 3);
    [5]   foo(double x, Bar *z)
    [6]   foo(double x, double y)
    [7]   foo(int x, int y, int z, int w);
    

    Finally, to generate the dispatch function, the arguments passed to an overloaded method are simply checked in the same order as they appear in this ranking.

    If you're still confused, don't worry about it---SWIG is probably doing the right thing.

    6.15.2 Ambiguity in overloading

    Regrettably, SWIG is not able to support every possible use of valid C++ overloading. Consider the following example:

    void foo(int x);
    void foo(long x);
    

    In C++, this is perfectly legal. However, in a scripting language, there is generally only one kind of integer object. Therefore, which one of these functions do you pick? Clearly, there is no way to truly make a distinction just by looking at the value of the integer itself (int and long may even be the same precision). Therefore, when SWIG encounters this situation, it may generate a warning message like this for scripting languages:

    example.i:4: Warning 509: Overloaded method foo(long) effectively ignored,
    example.i:3: Warning 509: as it is shadowed by foo(int).
    

    or for statically typed languages like Java:

    example.i:4: Warning 516: Overloaded method foo(long) ignored,
    example.i:3: Warning 516: using foo(int) instead.
    at example.i:3 used.
    

    This means that the second overloaded function will be inaccessible from a scripting interface or the method won't be wrapped at all. This is done as SWIG does not know how to disambiguate it from an earlier method.

    Ambiguity problems are known to arise in the following situations:

    • Integer conversions. Datatypes such as int, long, and short cannot be disambiguated in some languages. Shown above.
    • Floating point conversion. float and double can not be disambiguated in some languages.
    • Pointers and references. For example, Foo * and Foo &.
    • Pointers and arrays. For example, Foo * and Foo [4].
    • Pointers and instances. For example, Foo and Foo *. Note: SWIG converts all instances to pointers.
    • Qualifiers. For example, const Foo * and Foo *.
    • Default vs. non default arguments. For example, foo(int a, int b) and foo(int a, int b = 3).

    When an ambiguity arises, methods are checked in the same order as they appear in the interface file. Therefore, earlier methods will shadow methods that appear later.

    When wrapping an overloaded function, there is a chance that you will get a warning message like this:

    example.i:3: Warning 467: Overloaded foo(int) not supported (incomplete type checking rule - 
    no precedence level in typecheck typemap for 'int').
    

    This error means that the target language module supports overloading, but for some reason there is no type-checking rule that can be used to generate a working dispatch function. The resulting behavior is then undefined. You should report this as a bug to the SWIG bug tracking database if this is due to one of the typemaps supplied with SWIG.

    If you get an error message such as the following,

    foo.i:6. Overloaded declaration ignored.  Spam::foo(double )
    foo.i:5. Previous declaration is Spam::foo(int )
    foo.i:7. Overloaded declaration ignored.  Spam::foo(Bar *, Spam *, int )
    foo.i:5. Previous declaration is Spam::foo(int )
    

    it means that the target language module has not yet implemented support for overloaded functions and methods. The only way to fix the problem is to read the next section.

    6.15.3 Renaming and ambiguity resolution

    If an ambiguity in overload resolution occurs or if a module doesn't allow overloading, there are a few strategies for dealing with the problem. First, you can tell SWIG to ignore one of the methods. This is easy---simply use the %ignore directive. For example:

    %ignore foo(long);
    
    void foo(int);
    void foo(long);       // Ignored.  Oh well.
    

    The other alternative is to rename one of the methods. This can be done using %rename. For example:

    %rename("foo_short") foo(short);
    %rename(foo_long) foo(long);
    
    void foo(int);
    void foo(short);      // Accessed as foo_short()
    void foo(long);       // Accessed as foo_long()
    

    Note that the quotes around the new name are optional, however, should the new name be a C/C++ keyword they would be essential in order to avoid a parsing error. The %ignore and %rename directives are both rather powerful in their ability to match declarations. When used in their simple form, they apply to both global functions and methods. For example:

    /* Forward renaming declarations */
    %rename(foo_i) foo(int); 
    %rename(foo_d) foo(double);
    ...
    void foo(int);           // Becomes 'foo_i'
    void foo(char *c);       // Stays 'foo' (not renamed)
    
    class Spam {
    public:
      void foo(int);      // Becomes 'foo_i'
      void foo(double);   // Becomes 'foo_d'
      ...
    };
    

    If you only want the renaming to apply to a certain scope, the C++ scope resolution operator (::) can be used. For example:

    %rename(foo_i) ::foo(int);      // Only rename foo(int) in the global scope.
                                    // (will not rename class members)
    
    %rename(foo_i) Spam::foo(int);  // Only rename foo(int) in class Spam
    

    When a renaming operator is applied to a class as in Spam::foo(int), it is applied to that class and all derived classes. This can be used to apply a consistent renaming across an entire class hierarchy with only a few declarations. For example:

    %rename(foo_i) Spam::foo(int);
    %rename(foo_d) Spam::foo(double);
    
    class Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Bar : public Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Grok : public Bar {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    

    It is also possible to include %rename specifications in the class definition itself. For example:

    class Spam {
      %rename(foo_i) foo(int);
      %rename(foo_d) foo(double);
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Bar : public Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
    ...
    };
    

    In this case, the %rename directives still get applied across the entire inheritance hierarchy, but it's no longer necessary to explicitly specify the class prefix Spam::.

    A special form of %rename can be used to apply a renaming just to class members (of all classes):

    %rename(foo_i) *::foo(int);   // Only rename foo(int) if it appears in a class.
    

    Note: the *:: syntax is non-standard C++, but the '*' is meant to be a wildcard that matches any class name (we couldn't think of a better alternative so if you have a better idea, send email to the swig-devel mailing list.

    Although this discussion has primarily focused on %rename all of the same rules also apply to %ignore. For example:

    %ignore foo(double);          // Ignore all foo(double)
    %ignore Spam::foo;            // Ignore foo in class Spam
    %ignore Spam::foo(double);    // Ignore foo(double) in class Spam
    %ignore *::foo(double);       // Ignore foo(double) in all classes
    

    When applied to a base class, %ignore forces all definitions in derived classes to disappear. For example, %ignore Spam::foo(double) will eliminate foo(double) in Spam and all classes derived from Spam.

    Notes on %rename and %ignore:

    • Since, the %rename declaration is used to declare a renaming in advance, it can be placed at the start of an interface file. This makes it possible to apply a consistent name resolution without having to modify header files. For example:

      %module foo
      
      /* Rename these overloaded functions */
      %rename(foo_i) foo(int); 
      %rename(foo_d) foo(double);
      
      %include "header.h"
      
    • The scope qualifier (::) can also be used on simple names. For example:

      %rename(bar) ::foo;       // Rename foo to bar in global scope only
      %rename(bar) Spam::foo;   // Rename foo to bar in class Spam only
      %rename(bar) *::foo;      // Rename foo in classes only
      
    • Name matching tries to find the most specific match that is defined. A qualified name such as Spam::foo always has higher precedence than an unqualified name foo. Spam::foo has higher precedence than *::foo and *::foo has higher precedence than foo. A parameterized name has higher precedence than an unparameterized name within the same scope level. However, an unparameterized name with a scope qualifier has higher precedence than a parameterized name in global scope (e.g., a renaming of Spam::foo takes precedence over a renaming of foo(int)).

    • The order in which %rename directives are defined does not matter as long as they appear before the declarations to be renamed. Thus, there is no difference between saying:

      %rename(bar) foo;
      %rename(foo_i) Spam::foo(int);
      %rename(Foo) Spam::foo;
      

      and this

      %rename(Foo) Spam::foo;
      %rename(bar) foo;
      %rename(foo_i) Spam::foo(int);
      

      (the declarations are not stored in a linked list and order has no importance). Of course, a repeated %rename directive will change the setting for a previous %rename directive if exactly the same name, scope, and parameters are supplied.

    • For multiple inheritance where renaming rules are defined for multiple base classes, the first renaming rule found on a depth-first traversal of the class hierarchy is used.
    • The name matching rules strictly follow member qualifier rules. For example, if you have a class and member with a member that is const qualified like this:

      class Spam {
      public:
        ...
        void bar() const;
        ...
      };
      

      the declaration

      %rename(name) Spam::bar();
      

      will not apply as there is no unqualified member bar(). The following will apply the rename as the qualifier matches correctly:

      %rename(name) Spam::bar() const;
      

      Similarly for combinations of cv-qualifiers and ref-qualifiers, all the qualifiers must be specified to match correctly:

      %rename(name) Jam::bar();          // will not match
      %rename(name) Jam::bar() &;        // will not match
      %rename(name) Jam::bar() const;    // will not match
      %rename(name) Jam::bar() const &;  // ok, will match
      
      class Jam {
      public:
        ...
        void bar() const &;
        ...
      };
      

      An often overlooked C++ feature is that classes can define two different overloaded members that differ only in their qualifiers, like this:

      class Spam {
      public:
        ...
        void bar();         // Unqualified member
        void bar() const;   // Qualified member
        ...
      };
      

      %rename can then be used to target each of the overloaded methods individually. For example we can give them separate names in the target language:

      %rename(name1) Spam::bar();
      %rename(name2) Spam::bar() const;
      

      Similarly, if you merely wanted to ignore one of the declarations, use %ignore with the full qualifier. For example, the following directive would tell SWIG to ignore the const version of bar() above:

      %ignore Spam::bar() const;   // Ignore bar() const, but leave other bar() alone
      
    • Currently no resolution is performed in order to match function parameters. This means function parameter types must match exactly. For example, namespace qualifiers and typedefs will not work. The following usage of typedefs demonstrates this:

      typedef int Integer;
      
      %rename(foo_i) foo(int);
      
      class Spam {
      public:
        void foo(Integer);  // Stays 'foo' (not renamed)
      };
      class Ham {
      public:
        void foo(int);      // Renamed to foo_i
      };
      
    • The name matching rules also use default arguments for finer control when wrapping methods that have default arguments. Recall that methods with default arguments are wrapped as if the equivalent overloaded methods had been parsed (Default arguments section). Let's consider the following example class:

      class Spam {
      public:
        ...
        void bar(int i=-1, double d=0.0);
        ...
      };
      

      The following %rename will match exactly and apply to all the target language overloaded methods because the declaration with the default arguments exactly matches the wrapped method:

      %rename(newbar) Spam::bar(int i=-1, double d=0.0);
      

      The C++ method can then be called from the target language with the new name no matter how many arguments are specified, for example: newbar(2, 2.0), newbar(2) or newbar(). However, if the %rename does not contain the default arguments:

      %rename(newbar) Spam::bar(int i, double d);
      

      then only one of the three equivalent overloaded methods will be renamed and wrapped as if SWIG parsed:

      void Spam::newbar(int i, double d);
      void Spam::bar(int i);
      void Spam::bar();
      

      The C++ method must then be called from the target language with the new name newbar(2, 2.0) when both arguments are supplied or with the original name as bar(2) (one argument) or bar() (no arguments).

      In fact it is possible to use %rename on the equivalent overloaded methods, to rename all the equivalent overloaded methods:

      %rename(bar_2args)   Spam::bar(int i, double d);
      %rename(bar_1arg)    Spam::bar(int i);
      %rename(bar_default) Spam::bar();
      

      Similarly, the extra overloaded methods can be selectively ignored using %ignore.

      Compatibility note: The %rename directive introduced the default argument matching rules in SWIG-1.3.23 at the same time as the changes to wrapping methods with default arguments was introduced.

    6.15.4 Comments on overloading

    Support for overloaded methods was first added in SWIG-1.3.14. The implementation is somewhat unusual when compared to similar tools. For instance, the order in which declarations appear is largely irrelevant in SWIG. Furthermore, SWIG does not rely upon trial execution or exception handling to figure out which method to invoke.

    Internally, the overloading mechanism is completely configurable by the target language module. Therefore, the degree of overloading support may vary from language to language. As a general rule, statically typed languages like Java are able to provide more support than dynamically typed languages like Perl, Python, Ruby, and Tcl.

    6.16 Overloaded operators

    C++ overloaded operator declarations can be wrapped. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c) {
        rpart = c.rpart;
        ipart = c.ipart;
        return *this;
      }
      Complex operator+(const Complex &c) const {
        return Complex(rpart+c.rpart, ipart+c.ipart);
      }
      Complex operator-(const Complex &c) const {
        return Complex(rpart-c.rpart, ipart-c.ipart);
      }
      Complex operator*(const Complex &c) const {
        return Complex(rpart*c.rpart - ipart*c.ipart,
                       rpart*c.ipart + c.rpart*ipart);
      }
      Complex operator-() const {
        return Complex(-rpart, -ipart);
      }
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When operator declarations appear, they are handled in exactly the same manner as regular methods. However, the names of these methods are set to strings like "operator +" or "operator -". The problem with these names is that they are illegal identifiers in most scripting languages. For instance, you can't just create a method called "operator +" in Python--there won't be any way to call it.

    Some language modules already know how to automatically handle certain operators (mapping them into operators in the target language). However, the underlying implementation of this is really managed in a very general way using the %rename directive. For example, in Python a declaration similar to this is used:

    %rename(__add__) Complex::operator+;
    

    This binds the + operator to a method called __add__ (which is conveniently the same name used to implement the Python + operator). Internally, the generated wrapper code for a wrapped operator will look something like this pseudocode:

    _wrap_Complex___add__(args) {
      ... get args ...
      obj->operator+(args);
      ...
    }
    

    When used in the target language, it may now be possible to use the overloaded operator normally. For example:

    >>> a = Complex(3, 4)
    >>> b = Complex(5, 2)
    >>> c = a + b           # Invokes __add__ method
    

    It is important to realize that there is nothing magical happening here. The %rename directive really only picks a valid method name. If you wrote this:

    %rename(add) operator+;
    

    The resulting scripting interface might work like this:

    a = Complex(3, 4)
    b = Complex(5, 2)
    c = a.add(b)      # Call a.operator+(b)
    

    All of the techniques described to deal with overloaded functions also apply to operators. For example:

    %ignore Complex::operator=;             // Ignore = in class Complex
    %ignore *::operator=;                   // Ignore = in all classes
    %ignore operator=;                      // Ignore = everywhere.
    
    %rename(__sub__) Complex::operator-; 
    %rename(__neg__) Complex::operator-();  // Unary - 
    

    The last part of this example illustrates how multiple definitions of the operator- method might be handled.

    Handling operators in this manner is mostly straightforward. However, there are a few subtle issues to keep in mind:

    • In C++, it is fairly common to define different versions of the operators to account for different types. For example, a class might also include a friend function like this:

      class Complex {
      public:
        friend Complex operator+(Complex &, double);
      };
      Complex operator+(Complex &, double);
      

      SWIG simply ignores all friend declarations. Furthermore, it doesn't know how to associate the associated operator+ with the class (because it's not a member of the class).

      It's still possible to make a wrapper for this operator, but you'll have to handle it like a normal function. For example:

      %rename(add_complex_double) operator+(Complex &, double);
      
    • Certain operators are ignored by default. For instance, new and delete operators are ignored as well as conversion and index operators. A warning such as the one below is shown:

      example.i:12: Warning 503: Can't wrap 'operator []' unless renamed to a valid identifier.
      
    • The index operator, operator[], is particularly difficult to overload due to differences in C++ implementations. Specifically, the get and set operators in other languages typically are separated into two methods such that additional logic can be packed into the operations; C# uses this[type key] { get { ... } set { ... }}, Python uses __getitem__ and __setitem__, etc. In C++ if the return type of operator[] is a reference and the method is const, it is often indicative of the setter, and the getter is usually a const function return an object by value. In the absence of any hard and fast rules and the fact that there may be multiple index operators, it is up to the user to choose the getter and setter to use by using %rename as shown earlier.

    • The semantics of certain C++ operators may not match those in the target language.

    6.17 Class extension

    New methods can be added to a class using the %extend directive. This directive is primarily used in conjunction with proxy classes to add additional functionality to an existing class. For example :

    %module vector
    %{
    #include "vector.h"
    %}
    
    class Vector {
    public:
      double x, y, z;
      Vector();
      ~Vector();
      ... bunch of C++ methods ...
      %extend {
        char *__str__() {
          static char temp[256];
          sprintf(temp, "[ %g, %g, %g ]", $self->x, $self->y, $self->z);
          return &temp[0];
        }
      }
    };
    

    This code adds a __str__ method to our class for producing a string representation of the object. In Python, such a method would allow us to print the value of an object using the print command.

    >>>
    >>> v = Vector();
    >>> v.x = 3
    >>> v.y = 4
    >>> v.z = 0
    >>> print(v)
    [ 3.0, 4.0, 0.0 ]
    >>>
    
    

    The C++ 'this' pointer is often needed to access member variables, methods etc. The $self special variable should be used wherever you could use 'this'. The example above demonstrates this for accessing member variables. Note that the members dereferenced by $self must be public members as the code is ultimately generated into a global function and so will not have any access to non-public members. The implicit 'this' pointer that is present in C++ methods is not present in %extend methods. In order to access anything in the extended class or its base class, an explicit 'this' is required. The following example shows how one could access base class members:

    struct Base {
      virtual void method(int v) {
        ...
      }
      int value;
    };
    struct Derived : Base {
    };
    %extend Derived {
      virtual void method(int v) {
        $self->Base::method(v); // akin to this->Base::method(v);
        $self->value = v;       // akin to this->value = v;
        ...
      }
    }
    

    The following special variables are expanded if used within a %extend block: $name, $symname, $overname, $decl, $fulldecl, $parentclassname and $parentclasssymname. The Special variables section provides more information each of these special variables.

    The %extend directive follows all of the same conventions as its use with C structures. Please refer to the Adding member functions to C structures section for further details.

    Compatibility note: The %extend directive is a new name for the %addmethods directive in SWIG1.1. Since %addmethods could be used to extend a structure with more than just methods, a more suitable directive name has been chosen.

    6.18 Templates

    Template type names may appear anywhere a type is expected in an interface file. For example:

    void foo(vector<int> *a, int n);
    void bar(list<int, 100> *x);
    

    There are some restrictions on the use of non-type arguments. Simple literals are supported, and so are some constant expressions. However, use of '<' and '>' within a constant expressions currently is not supported by SWIG ('<=' and '>=' are though). For example:

    void bar(list<int, 100> *x);                // OK
    void bar(list<int, 2*50> *x);               // OK
    void bar(list<int, (2>1 ? 100 : 50)> *x)    // Not supported
    

    The type system is smart enough to figure out clever games you might try to play with typedef. For instance, consider this code:

    typedef int Integer;
    void foo(vector<int> *x, vector<Integer> *y);
    

    In this case, vector<Integer> is exactly the same type as vector<int>. The wrapper for foo() will accept either variant.

    6.18.1 The %template directive

    There are a couple of important points about template wrapping. First, a bare C++ template does not define any sort of runnable object-code for which SWIG can normally create a wrapper. Therefore, in order to wrap a template, you need to give SWIG information about a particular template instantiation (e.g., vector<int>, array<double>, etc.). Second, an instantiation name such as vector<int> is generally not a valid identifier name in most target languages. Thus, you will need to give the template instantiation a more suitable name such as intvector.

    To illustrate, consider the following class template definition:

    template<class T> class List {
    private:
      T *data;
      int nitems;
      int maxitems;
    public:
      List(int max) {
        data = new T [max];
        nitems = 0;
        maxitems = max;
      }
      ~List() {
        delete [] data;
      };
      void append(T obj) {
        if (nitems < maxitems) {
          data[nitems++] = obj;
        }
      }
      int length() {
        return nitems;
      }
      T get(int n) {
        return data[n];
      }
    };
    

    By itself, this class template is useless--SWIG simply ignores it because it doesn't know how to generate any code unless a definition of T is provided. The %template directive is required to instantiate the template for use in a target language. The directive requires an identifier name for use in the target language plus the template for instantiation. The example below instantiates List<int> for use as a class named intList:

    %template(intList) List<int>;
    

    The instantiation expands the template code as a C++ compiler would do and then makes it available under the given identifier name. Essentially it is the same as wrapping the following concept code where the class template definition has T expanded to int (note that this is not entirely valid syntax):

    %rename(intList) List<int>;       // Rename to a suitable identifier
    class List<int> {
    private:
      int *data;
      int nitems;
      int maxitems;
    public:
      List(int max);
      ~List();
      void append(int obj);
      int length();
      int get(int n);
    };
    

    The argument to %template() is the name of the instantiation in the target language. The name you choose should not conflict with any other declarations in the interface file with one exception---it is okay for the template name to match that of a typedef declaration. For example:

    %template(intList) List<int>;
    ...
    typedef List<int> intList;    // OK
    

    The %template directive must always appear after the definition of the template to be expanded, so the following will work:

    template<class T> class List { ... };
    %template(intList) List<int>;
    

    but if %template is used before the template definition, such as:

    %template(intList) List<int>;
    template<class T> class List { ... };
    

    SWIG will generate an error:

    example.i:3: Error: Template 'List' undefined.
    

    Since the type system knows how to handle typedef, it is generally not necessary to instantiate different versions of a template for typenames that are equivalent. For instance, consider this code:

    %template(intList) List<int>;
    typedef int Integer;
    ...
    void foo(List<Integer> *x);
    

    In this case, List<Integer> is exactly the same type as List<int>. Any use of List<Integer> is mapped back to the instantiation of List<int> created earlier. Therefore, it is not necessary to instantiate a new class for the type Integer (doing so is redundant and will simply result in code bloat).

    The template provided to %template for instantiation must be the actual template and not a typedef to a template.

    typedef List<int> ListOfInt;
    
    %template(intList) List<int>; // ok
    %template(intList) ListOfInt; // illegal - Syntax error
    

    6.18.2 Function templates

    SWIG can also generate wrappers for function templates using a similar technique to that shown above for class templates. For example:

    // Function template
    template<class T> T max(T a, T b) { return a > b ? a : b; }
    
    // Make some different versions of this function
    %template(maxint) max<int>;
    %template(maxdouble) max<double>;
    

    In this case, maxint and maxdouble become unique names for specific instantiations of the function.

    SWIG even supports overloaded templated functions. As usual the %template directive is used to wrap templated functions. For example:

    template<class T> void foo(T x) { };
    template<class T> void foo(T x, T y) { };
    
    %template(foo) foo<int>;
    

    This will generate two overloaded wrapper methods, the first will take a single integer as an argument and the second will take two integer arguments.

    6.18.3 Default template arguments

    The number of arguments supplied to %template should match that in the original template definition. Template default arguments are supported. For example:

    template vector<typename T, int max=100> class vector {
    ...
    };
    
    %template(intvec) vector<int>;           // OK
    %template(vec1000) vector<int, 1000>;     // OK
    

    The %template directive should not be used to wrap the same template instantiation more than once in the same scope. This will generate an error. For example:

    %template(intList) List<int>;
    %template(Listint) List<int>;    // Error.   Template already wrapped.
    

    This error is caused because the template expansion results in two identical classes with the same name. This generates a symbol table conflict. Besides, it probably more efficient to only wrap a specific instantiation only once in order to reduce the potential for code bloat.

    6.18.4 Template base classes

    When a template is instantiated using %template, information about that class is saved by SWIG and used elsewhere in the program. For example, if you wrote code like this,

    ...
    %template(intList) List<int>;
    ...
    class UltraList : public List<int> {
      ...
    };
    

    then SWIG knows that List<int> was already wrapped as a class called intList and arranges to handle the inheritance correctly. If, on the other hand, nothing is known about List<int>, you will get a warning message similar to this:

    example.h:42: Warning 401. Nothing known about class 'List< int >'. Ignored. 
    example.h:42: Warning 401. Maybe you forgot to instantiate 'List< int >' using %template. 
    

    If a class template inherits from another class template, you need to make sure that base classes are instantiated before derived classes. For example:

    template<class T> class Foo {
    ...
    };
    
    template<class T> class Bar : public Foo<T> {
    ...
    };
    
    // Instantiate base classes first 
    %template(intFoo) Foo<int>;
    %template(doubleFoo) Foo<double>;
    
    // Now instantiate derived classes
    %template(intBar) Bar<int>;
    %template(doubleBar) Bar<double>;
    

    The order is important since SWIG uses the instantiation names to properly set up the inheritance hierarchy in the resulting wrapper code (and base classes need to be wrapped before derived classes). Don't worry--if you get the order wrong, SWIG should generate a warning message.

    Occasionally, you may need to tell SWIG about base classes that are defined by templates, but which aren't supposed to be wrapped. Since SWIG is not able to automatically instantiate templates for this purpose, you must do it manually. To do this, simply use the empty template instantiation, that is, %template with no name. For example:

    // Instantiate traits<double, double>, but don't wrap it.
    %template() traits<double, double>;
    

    If you have to instantiate a lot of different classes for many different types, you might consider writing a SWIG macro. For example:

    %define TEMPLATE_WRAP(prefix, T...) 
    %template(prefix ## Foo) Foo<T >;
    %template(prefix ## Bar) Bar<T >;
    ...
    %enddef
    
    TEMPLATE_WRAP(int, int)
    TEMPLATE_WRAP(double, double)
    TEMPLATE_WRAP(String, char *)
    TEMPLATE_WRAP(PairStringInt, std::pair<string, int>)
    ...
    

    Note the use of a vararg macro for the type T. If this wasn't used, the comma in the templated type in the last example would not be possible.

    6.18.5 Template specialization

    The SWIG template mechanism does support specialization. For instance, if you define a class like this,

    template<> class List<int> {
    private:
      int *data;
      int nitems;
      int maxitems;
    public:
      List(int max);
      ~List();
      void append(int obj);
      int length();
      int get(int n);
    };
    

    then SWIG will use this code whenever the user expands List<int>. In practice, this may have very little effect on the underlying wrapper code since specialization is often used to provide slightly modified method bodies (which are ignored by SWIG). However, special SWIG directives such as %typemap, %extend, and so forth can be attached to a specialization to provide customization for specific types.

    Partial template specialization is partially supported by SWIG. For example, this code defines a template that is applied when the template argument is a pointer.

    template<class T> class List<T*> {
    private:
      T *data;
      int nitems;
      int maxitems;
    public:
      List(int max);
      ~List();
      void append(T obj);
      int length();
      T get(int n);
    };
    

    SWIG supports both template explicit specialization and partial specialization. Consider:

    template<class T1, class T2> class Foo { };                     // (1) primary template
    template<>                   class Foo<double *, int *> { };    // (2) explicit specialization
    template<class T1, class T2> class Foo<T1, T2 *> { };           // (3) partial specialization
    

    SWIG is able to properly match explicit instantiations:

    Foo<double *, int *>     // explicit specialization matching (2)
    

    SWIG implements template argument deduction so that the following partial specialization examples work just like they would with a C++ compiler:

    Foo<int *, int *>        // partial specialization matching (3)
    Foo<int *, const int *>  // partial specialization matching (3)
    Foo<int *, int **>       // partial specialization matching (3)
    

    6.18.6 Member templates

    Member templates are supported. The underlying principle is the same as for normal templates--SWIG can't create a wrapper unless you provide more information about types. For example, a class with a member function template might look like this:

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    

    To expand the template, simply use %template inside the class.

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
      %template(barint)    bar<int>;
      %template(bardouble) bar<double>;
    };
    

    Or, if you want to leave the original class definition alone, just do this:

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    ...
    %extend Foo {
      %template(barint)    bar<int>;
      %template(bardouble) bar<double>;
    };
    

    or simply

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    ...
    
    %template(bari) Foo::bar<int>;
    %template(bard) Foo::bar<double>;
    

    In this case, the %extend directive is not needed, and %template does exactly the same job, i.e., it adds two new methods to the Foo class.

    Now, if your target language supports overloading, you can even try

    %template(bar) Foo::bar<int>;
    %template(bar) Foo::bar<double>;
    

    and since the two new wrapped methods have the same name 'bar', they will be overloaded, and when called, the correct method will be dispatched depending on the argument type.

    When used with members, the %template directive may be placed in another class template. Here is a slightly perverse example:

    // A template
    template<class T> class Foo {
    public:
      // A member template
      template<class S> T bar(S x, S y) { ... };
      ...
    };
    
    // Expand a few member templates
    %extend Foo {
      %template(bari) bar<int>;
      %template(bard) bar<double>;
    }
    
    // Create some wrappers for the template
    %template(Fooi) Foo<int>;
    %template(Food) Foo<double>;
    

    Miraculously, you will find that each expansion of Foo has member functions bari() and bard() added.

    A common use of member templates is to define constructors for copies and conversions. For example:

    template<class T1, class T2> struct pair {
      T1 first;
      T2 second;
      pair() : first(T1()), second(T2()) { }
      pair(const T1 &x, const T2 &y) : first(x), second(y) { }
      template<class U1, class U2> pair(const pair<U1, U2> &x)
                                           : first(x.first), second(x.second) { }
    };
    

    This declaration is perfectly acceptable to SWIG, but the constructor template will be ignored unless you explicitly expand it. To do that, you could expand a few versions of the constructor in the class template itself. For example:

    %extend pair {
      %template(pair) pair<T1, T2>;        // Generate default copy constructor
    };
    

    When using %extend in this manner, notice how you can still use the template parameters in the original template definition.

    Alternatively, you could expand the constructor template in selected instantiations. For example:

    // Instantiate a few versions
    %template(pairii) pair<int, int>;
    %template(pairdd) pair<double, double>;
    
    // Create a default constructor only 
    %extend pair<int, int> {
      %template(paird) pair<int, int>;         // Default constructor
    };
    
    // Create default and conversion constructors 
    %extend pair<double, double> {
      %template(paird) pair<double, dobule>;   // Default constructor
      %template(pairc) pair<int, int>;         // Conversion constructor
    };
    

    And if your target language supports overloading, then you can try instead:

    // Create default and conversion constructors 
    %extend pair<double, double> {
      %template(pair) pair<double, dobule>;   // Default constructor
      %template(pair) pair<int, int>;         // Conversion constructor
    };
    

    In this case, the default and conversion constructors have the same name. Hence, SWIG will overload them and define an unique visible constructor, that will dispatch the proper call depending on the argument type.

    6.18.7 Scoping and templates

    The %template directive for a class template is the equivalent to an explicit instantiation of a C++ class template. The scope for a valid %template instantiation is the same as the scope required for a valid explicit instantiation of a C++ template. A definition of the template for the explicit instantiation must be in scope where the instantiation is declared and must not be enclosed within a different namespace.

    For example, a few %template instantiations and C++ explicit instantiations are shown below:

    namespace N {
      template<typename T> class C {};
    }
    
    // valid
    %template(cin) N::C<int>;
    template class N::C<int>;
    
    // valid
    namespace N {
      %template(cin) C<int>;
      template class C<int>;
    }
    
    // valid
    using namespace N;
    %template(cin) C<int>;
    template class C<int>;
    
    // valid
    using N::C;
    %template(cin) C<int>;
    template class C<int>;
    
    // ill-formed
    namespace unrelated {
      using N::C;
      %template(cin) C<int>;
      template class C<int>;
    }
    
    // ill-formed
    namespace unrelated {
      using namespace N;
      %template(cin) C<int>;
      template class C<int>;
    }
    
    // ill-formed
    namespace unrelated {
      namespace N {
        %template(cin) C<int>;
        template class C<int>;
      }
    }
    
    // ill-formed
    namespace unrelated {
      %template(cin) N::C<int>;
      template class N::C<int>;
    }
    

    When the scope is incorrect, such as for the ill-formed examples above, an error occurs:

    cpp_template_scope.i:34: Error: 'C' resolves to 'N::C' and was incorrectly instantiated
    in scope 'unrelated' instead of within scope 'N'.
    

    A note for the C++ standard geeks out there; a valid instantiation is one which conforms to the C++03 standard as C++11 made a change to disallow using declarations and using directives to find a template.

    // valid C++03, ill-formed C++11
    using N::C;
    template class C<int>;
    

    Compatibility Note: Versions prior to SWIG-4.0.0 did not error out with incorrectly scoped %template declarations, but this led to numerous subtle template scope problems.

    6.18.8 More on templates

    If all of this isn't quite enough and you really want to make someone's head explode, SWIG directives such as %rename, %extend, and %typemap can be included directly in template definitions. For example:

    // File : list.h
    template<class T> class List {
      ...
    public:
      %rename(__getitem__) get(int);
      List(int max);
      ~List();
      ...
      T get(int index);
      %extend {
        char *__str__() {
          /* Make a string representation */
          ...
        }
      }
    };
    

    In this example, the extra SWIG directives are propagated to every template instantiation.

    It is also possible to separate these declarations from the class template. For example:

    %rename(__getitem__) List::get;
    %extend List {
      char *__str__() {
        /* Make a string representation */
        ...
      }
      /* Make a copy */
      T *__copy__() {
        return new List<T>(*$self);
      }
    };
    
    ...
    template<class T> class List {
      ...
      public:
      List() { }
      T get(int index);
      ...
    };
    

    When %extend is decoupled from the class definition, it is legal to use the same template parameters as provided in the class definition. These are replaced when the template is expanded. In addition, the %extend directive can be used to add additional methods to a specific instantiation. For example:

    %template(intList) List<int>;
    
    %extend List<int> {
      void blah() {
        printf("Hey, I'm an List<int>!\n");
      }
    };
    

    It is even possible to extend a class via %extend with template methods, for example:

    %include <std_string.i>
    
    %inline %{
    class ExtendMe {
    public:
      template <typename T>
      T do_stuff_impl(int a, T b, double d) {
        return b;
      }
    };
    %}
    
    %extend ExtendMe {
      template<typename T>
      T do_overloaded_stuff(T b) {
        return $self->do_stuff_impl(0, b, 4.0);
      }
    }
    %template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<std::string>;
    %template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<double>;
    

    The wrapped ExtendMe class will then have two (overloaded) methods called do_overloaded_stuff.

    Compatibility Note: Extending a class with template methods was added in version 3.0.12

    Needless to say, SWIG's template support provides plenty of opportunities to break the universe. That said, an important final point is that SWIG does not perform extensive error checking of templates! Specifically, SWIG does not perform type checking nor does it check to see if the actual contents of the template declaration make any sense. Since the C++ compiler checks this when it compiles the resulting wrapper file, there is no practical reason for SWIG to duplicate this functionality.

    As SWIG's template support does not perform type checking %template can be used as early as after a template declaration. You can, and rarely have to, use %template before the template parameters have been declared. For example:

    template <class T> class OuterTemplateClass {};
    
    // The nested class OuterClass::InnerClass inherits from the class template
    // OuterTemplateClass<OuterClass::InnerStruct> and thus the template needs
    // to be expanded with %template before the OuterClass declaration.
    %template(OuterTemplateClass_OuterClass__InnerStruct)
      OuterTemplateClass<OuterClass::InnerStruct>
    
    
    // Don't forget to use %feature("flatnested") for OuterClass::InnerStruct and
    // OuterClass::InnerClass if the target language doesn't support nested classes.
    class OuterClass {
      public:
        // Forward declarations:
        struct InnerStruct;
        class InnerClass;
    };
    
    struct OuterClass::InnerStruct {};
    
    // Expanding the template at this point with %template is too late as the
    // OuterClass::InnerClass declaration is processed inside OuterClass.
    
    class OuterClass::InnerClass : public OuterTemplateClass<InnerStruct> {};
    

    Compatibility Note: The first implementation of template support relied heavily on macro expansion in the preprocessor. Templates have been more tightly integrated into the parser and type system in SWIG-1.3.12 and the preprocessor is no longer used. Code that relied on preprocessing features in template expansion will no longer work. However, SWIG still allows the # operator to be used to generate a string from a template argument.

    Compatibility Note: In earlier versions of SWIG, the %template directive introduced a new class name. This name could then be used with other directives. For example:

    %template(vectori) vector<int>;
    %extend vectori {
      void somemethod() { }
    };
    

    This behavior is no longer supported. Instead, you should use the original template name as the class name. For example:

    %template(vectori) vector<int>;
    %extend vector<int> {
      void somemethod() { }
    };
    

    Similar changes apply to typemaps and other customization features.

    6.19 Namespaces

    Support for C++ namespaces is comprehensive, but by default simple, however, some target languages can turn on more advanced namespace support via the nspace feature, described later. Code within unnamed namespaces is ignored as there is no external access to symbols declared within the unnamed namespace. Before detailing the default implementation for named namespaces, it is worth noting that the semantics of C++ namespaces is extremely non-trivial--especially with regard to the C++ type system and class machinery. At a most basic level, namespaces are sometimes used to encapsulate common functionality. For example:

    namespace math {
      double sin(double);
      double cos(double);
    
      class Complex {
        double im, re;
      public:
        ...
      };
      ...
    };
    

    Members of the namespace are accessed in C++ by prepending the namespace prefix to names. For example:

    double x = math::sin(1.0);
    double magnitude(math::Complex *c);
    math::Complex c;
    ...
    

    At this level, namespaces are relatively easy to manage. However, things start to get very ugly when you throw in the other ways a namespace can be used. For example, selective symbols can be exported from a namespace with using.

    using math::Complex;
    double magnitude(Complex *c);       // Namespace prefix stripped
    

    Similarly, the contents of an entire namespace can be made available like this:

    using namespace math;
    double x = sin(1.0);
    double magnitude(Complex *c);
    

    Alternatively, a namespace can be aliased:

    namespace M = math;
    double x = M::sin(1.0);
    double magnitude(M::Complex *c);
    

    Using combinations of these features, it is possible to write head-exploding code like this:

    namespace A {
      class Foo {
      };
    }
    
    namespace B {
      namespace C {
        using namespace A;
      }
      typedef C::Foo FooClass;
    }
    
    namespace BIGB = B;
    
    namespace D {
      using BIGB::FooClass;
      class Bar : public FooClass {
      }
    };
    
    class Spam : public D::Bar {
    };
    
    void evil(A::Foo *a, B::FooClass *b, B::C::Foo *c, BIGB::FooClass *d,
              BIGB::C::Foo *e, D::FooClass *f);
    
    

    Given the possibility for such perversion, it's hard to imagine how every C++ programmer might want such code wrapped into the target language. Clearly this code defines three different classes. However, one of those classes is accessible under at least six different names!

    SWIG fully supports C++ namespaces in its internal type system and class handling code. If you feed SWIG the above code, it will be parsed correctly, it will generate compilable wrapper code, and it will produce a working scripting language module. However, the default wrapping behavior is to flatten namespaces in the target language. This means that the contents of all namespaces are merged together in the resulting scripting language module. For example, if you have code like this,

    %module foo
    namespace foo {
      void bar(int);
      void spam();
    }
    
    namespace bar {
      void blah();
    }
    
    

    then SWIG simply creates three wrapper functions bar(), spam(), and blah() in the target language. SWIG does not prepend the names with a namespace prefix nor are the functions packaged in any kind of nested scope. Note that the default handling of flattening all the namespace scopes in the target language can be changed via the nspace feature.

    There is some rationale for taking this approach. Since C++ namespaces are often used to define modules in C++, there is a natural correlation between the likely contents of a SWIG module and the contents of a namespace. For instance, it would not be unreasonable to assume that a programmer might make a separate extension module for each C++ namespace. In this case, it would be redundant to prepend everything with an additional namespace prefix when the module itself already serves as a namespace in the target language. Or put another way, if you want SWIG to keep namespaces separate, simply wrap each namespace with its own SWIG interface.

    Because namespaces are flattened, it is possible for symbols defined in different namespaces to generate a name conflict in the target language. For example:

    namespace A {
      void foo(int);
    }
    namespace B {
      void foo(double);
    }
    

    When this conflict occurs, you will get an error message that resembles this:

    example.i:26. Error. 'foo' is multiply defined in the generated target language module.
    example.i:23. Previous declaration of 'foo'
    

    To resolve this error, simply use %rename to disambiguate the declarations. For example:

    %rename(B_foo) B::foo;
    ...
    namespace A {
      void foo(int);
    }
    namespace B {
      void foo(double);     // Gets renamed to B_foo
    }
    

    Similarly, %ignore can be used to ignore declarations.

    using declarations do not have any effect on the generated wrapper code. They are ignored by SWIG language modules and they do not result in any code. However, these declarations are used by the internal type system to track type-names. Therefore, if you have code like this:

    namespace A {
      typedef int Integer;
    }
    using namespace A;
    void foo(Integer x);
    

    SWIG knows that Integer is the same as A::Integer which is the same as int.

    Namespaces may be combined with templates. If necessary, the %template directive can be used to expand a template defined in a different namespace. For example:

    namespace foo {
      template<typename T> T max(T a, T b) { return a > b ? a : b; }
    }
    
    using foo::max;
    
    %template(maxint)   max<int>;           // Okay.
    %template(maxfloat) foo::max<float>;    // Okay (qualified name).
    
    namespace bar {
      using namespace foo;
      %template(maxdouble)  max<double>;    // Okay.
    }
    

    The combination of namespaces and other SWIG directives may introduce subtle scope-related problems. The key thing to keep in mind is that all SWIG generated wrappers are produced in the global namespace. Symbols from other namespaces are always accessed using fully qualified names---names are never imported into the global space unless the interface happens to do so with a using declaration. In almost all cases, SWIG adjusts typenames and symbols to be fully qualified. However, this is not done in code fragments such as function bodies, typemaps, exception handlers, and so forth. For example, consider the following:

    namespace foo {
      typedef int Integer;
      class bar {
        public:
        ...
      };
    }
    
    %extend foo::bar {
      Integer add(Integer x, Integer y) {
        Integer r = x + y;        // Error. Integer not defined in this scope
        return r;
      }
    };
    

    In this case, SWIG correctly resolves the added method parameters and return type to foo::Integer. However, since function bodies aren't parsed and such code is emitted in the global namespace, this code produces a compiler error about Integer. To fix the problem, make sure you use fully qualified names. For example:

    %extend foo::bar {
      Integer add(Integer x, Integer y) {
        foo::Integer r = x + y;        // Ok.
        return r;
      }
    };
    

    Note: SWIG does not propagate using declarations to the resulting wrapper code. If these declarations appear in an interface, they should also appear in any header files that might have been included in a %{ ... %} section. In other words, don't insert extra using declarations into a SWIG interface unless they also appear in the underlying C++ code.

    Note: Code inclusion directives such as %{ ... %} or %inline %{ ... %} should not be placed inside a namespace declaration. The code emitted by these directives will not be enclosed in a namespace and you may get very strange results. If you need to use namespaces with these directives, consider the following:

    // Good version
    %inline %{
    namespace foo {
      void bar(int) { ... }
      ...
    }
    %}
    
    // Bad version.  Emitted code not placed in namespace.
    namespace foo {
    %inline %{
      void bar(int) { ... }   /* I'm bad */
      ...
      %}
    }
    

    Note: When the %extend directive is used inside a namespace, the namespace name is included in the generated functions. For example, if you have code like this,

    namespace foo {
      class bar {
        public:
          %extend {
            int blah(int x);
          };
      };
    }
    

    the added method blah() is mapped to a function int foo_bar_blah(foo::bar *self, int x). This function resides in the global namespace.

    Note: Although namespaces are flattened in the target language, the SWIG generated wrapper code observes the same namespace conventions as used in the input file. Thus, if there are no symbol conflicts in the input, there will be no conflicts in the generated code.

    Note: In the same way that no resolution is performed on parameters, a conversion operator name must match exactly to how it is defined. Do not change the qualification of the operator. For example, suppose you had an interface like this:

    namespace foo {
      class bar;
      class spam {
        public:
        ...
        operator bar();      // Conversion of spam -> bar
        ...
      };
    }
    

    The following is how the feature is expected to be written for a successful match:

    %rename(tofoo) foo::spam::operator bar();
    

    The following does not work as no namespace resolution is performed in the matching of conversion operator names:

    %rename(tofoo) foo::spam::operator foo::bar();
    

    Note, however, that if the operator is defined using a qualifier in its name, then the feature must use it too...

    %rename(tofoo) foo::spam::operator bar();      // will not match
    %rename(tofoo) foo::spam::operator foo::bar(); // will match
    namespace foo {
      class bar;
      class spam {
        public:
        ...
        operator foo::bar();
        ...
      };
    }
    

    Compatibility Note: Versions of SWIG prior to 1.3.32 were inconsistent in this approach. A fully qualified name was usually required, but would not work in some situations.

    Note: The flattening of namespaces is only intended to serve as a basic namespace implementation. More advanced handling of namespaces is discussed next.

    6.19.1 The nspace feature for namespaces

    Some target languages provide support for the nspace feature. The feature can be applied to any class, struct, union or enum declared within a named namespace. The feature wraps the type within the target language specific concept of a namespace, for example, a Java package or C# namespace. Please see the language specific sections to see if the target language you are interested in supports the nspace feature.

    The feature is demonstrated below for C# using the following example:

    %feature("nspace") MyWorld::Material::Color;
    %nspace MyWorld::Wrapping::Color; // %nspace is a macro for %feature("nspace")
    
    namespace MyWorld {
      namespace Material {
        class Color {
        ...
        };
      }
      namespace Wrapping {
        class Color {
        ...
        };
      }
    }
    

    Without the nspace feature directives above or %rename, you would get the following warning resulting in just one of the Color classes being available for use from the target language:

    example.i:9: Error: 'Color' is multiply defined in the generated target language module.
    example.i:5: Error: Previous declaration of 'Color'
    

    With the nspace feature the two Color classes are wrapped into the equivalent C# namespaces. A fully qualified constructor call of each these two types in C# is then:

    MyWorld.Material.Color materialColor = new MyWorld.Material.Color();
    MyWorld.Wrapping.Color wrappingColor = new MyWorld.Wrapping.Color();
    

    Note that the nspace feature does not apply to variables and functions simply declared in a namespace. For example, the following symbols cannot co-exist in the target language without renaming. This may change in a future version.

    namespace MyWorld {
      namespace Material {
        int quantity;
        void dispatch();
      }
      namespace Wrapping {
        int quantity;
        void dispatch();
      }
    }
    

    Compatibility Note: The nspace feature was first introduced in SWIG-2.0.0.

    6.20 Renaming templated types in namespaces

    As has been mentioned, when %rename includes parameters, the parameter types must match exactly (no typedef or namespace resolution is performed). SWIG treats templated types slightly differently and has an additional matching rule so unlike non-templated types, an exact match is not always required. If the fully qualified templated type is specified, it will have a higher precedence over the generic template type. In the example below, the generic template type is used to rename to bbb and the fully qualified type is used to rename to ccc.

    %rename(bbb) Space::ABC::aaa(T t);                     // will match but with lower precedence than ccc
    %rename(ccc) Space::ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence
                                                           // than bbb
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    It should now be apparent that there are many ways to achieve a renaming with %rename. This is demonstrated by the following two examples, which are effectively the same as the above example. Below shows how %rename can be placed inside a namespace.

    namespace Space {
      %rename(bbb) ABC::aaa(T t);                     // will match but with lower precedence than ccc
      %rename(ccc) ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence than bbb
      %rename(ddd) ABC<Space::XYZ>::aaa(XYZ t);       // will not match
    }
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    Note that ddd does not match as there is no namespace resolution for parameter types and the fully qualified type must be specified for template type expansion. The following example shows how %rename can be placed within %extend.

    namespace Space {
      %extend ABC {
        %rename(bbb) aaa(T t);         // will match but with lower precedence than ccc
      }
      %extend ABC<Space::XYZ> {
        %rename(ccc) aaa(Space::XYZ t);// will match but with higher precedence than bbb
        %rename(ddd) aaa(XYZ t);       // will not match
      }
    }
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    6.21 Exception specifications

    When C++ programs utilize exceptions, exceptional behavior is sometimes specified as part of a function or method declaration. For example:

    class Error { };
    
    class Foo {
    public:
      ...
      void blah() throw(Error);
      ...
    };
    

    If an exception specification is used, SWIG automatically generates wrapper code for catching the indicated exception and, when possible, rethrowing it into the target language, or converting it into an error in the target language otherwise. For example, in Python, you can write code like this:

    f = Foo()
    try:
        f.blah()
    except Error, e:
        # e is a wrapped instance of "Error"
    

    Details of how to tailor code for handling the caught C++ exception and converting it into the target language's exception/error handling mechanism is outlined in the "throws" typemap section.

    Since exception specifications are sometimes only used sparingly, this alone may not be enough to properly handle C++ exceptions. To do that, a different set of special SWIG directives are used. Consult the "Exception handling with %exception" section for details. The next section details a way of simulating an exception specification or replacing an existing one.

    6.22 Exception handling with %catches

    Exceptions are automatically handled for methods with an exception specification. Similar handling can be achieved for methods without exception specifications through the %catches feature. It is also possible to replace any declared exception specification using the %catches feature. In fact, %catches uses the same "throws" typemaps that SWIG uses for exception specifications in handling exceptions. The %catches feature must contain a list of possible types that can be thrown. For each type that is in the list, SWIG will generate a catch handler, in the same way that it would for types declared in the exception specification. Note that the list can also include the catch all specification "...". For example,

    struct EBase { virtual ~EBase(); };
    struct Error1 : EBase { };
    struct Error2 : EBase { };
    struct Error3 : EBase { };
    struct Error4 : EBase { };
    
    %catches(Error1, Error2, ...) Foo::bar();
    %catches(EBase) Foo::blah();
    
    class Foo {
    public:
      ...
      void bar();
      void blah() throw(Error1, Error2, Error3, Error4);
      ...
    };
    

    For the Foo::bar() method, which can throw anything, SWIG will generate catch handlers for Error1, Error2 as well as a catch all handler (...). Each catch handler will convert the caught exception and convert it into a target language error/exception. The catch all handler will convert the caught exception into an unknown error/exception.

    Without the %catches feature being attached to Foo::blah(), SWIG will generate catch handlers for all of the types in the exception specification, that is, Error1, Error2, Error3, Error4. However, with the %catches feature above, just a single catch handler for the base class, EBase will be generated to convert the C++ exception into a target language error/exception.

    6.23 Pointers to Members

    Starting with SWIG-1.3.7, there is limited parsing support for pointers to C++ class members. For example:

    double do_op(Object *o, double (Object::*callback)(double, double));
    extern double (Object::*fooptr)(double, double);
    %constant double (Object::*FOO)(double, double) = &Object::foo;
    

    Although these kinds of pointers can be parsed and represented by the SWIG type system, few language modules know how to handle them due to implementation differences from standard C pointers. Readers are strongly advised to consult an advanced text such as the "The Annotated C++ Manual" for specific details.

    When pointers to members are supported, the pointer value might appear as a special string like this:

    >>> print example.FOO
    _ff0d54a800000000_m_Object__f_double_double__double
    >>>
    

    In this case, the hexadecimal digits represent the entire value of the pointer which is usually the contents of a small C++ structure on most machines.

    SWIG's type-checking mechanism is also more limited when working with member pointers. Normally SWIG tries to keep track of inheritance when checking types. However, no such support is currently provided for member pointers.

    6.24 Smart pointers and operator->()

    In some C++ programs, objects are often encapsulated by smart-pointers or proxy classes. This is sometimes done to implement automatic memory management (reference counting) or persistence. Typically a smart-pointer is defined by a class template where the -> operator has been overloaded. This class is then wrapped around some other class. For example:

    // Smart-pointer class
    template<class T> class SmartPtr {
      T *pointee;
    public:
      SmartPtr(T *p) : pointee(p) { ... }
      T *operator->() {
        return pointee;
      }
      ...
    };
    
    // Ordinary class
    class Foo_Impl {
    public:
      int x;
      virtual void bar();
      ...
    };
    
    // Smart-pointer wrapper
    typedef SmartPtr<Foo_Impl> Foo;
    
    // Create smart pointer Foo
    Foo make_Foo() {
      return SmartPtr<Foo_Impl>(new Foo_Impl());
    }
    
    // Do something with smart pointer Foo
    void do_something(Foo f) {
      printf("x = %d\n", f->x);
      f->bar();
    }
    
    // Call the wrapped smart pointer proxy class in the target language 'Foo'
    %template(Foo) SmartPtr<Foo_Impl>;
    

    A key feature of this approach is that by defining operator-> the methods and attributes of the object wrapped by a smart pointer are transparently accessible. For example, expressions such as these (from the previous example),

    f->x
    f->bar()
    

    are transparently mapped to the following

    (f.operator->())->x;
    (f.operator->())->bar();
    

    When generating wrappers, SWIG tries to emulate this functionality to the extent that it is possible. To do this, whenever operator->() is encountered in a class, SWIG looks at its returned type and uses it to generate wrappers for accessing attributes of the underlying object. For example, wrapping the above code produces wrappers like this:

    int Foo_x_get(Foo *f) {
      return (*f)->x;
    }
    void Foo_x_set(Foo *f, int value) {
      (*f)->x = value;
    }
    void Foo_bar(Foo *f) {
      (*f)->bar();
    }
    

    These wrappers take a smart-pointer instance as an argument, but dereference it in a way to gain access to the object returned by operator->(). You should carefully compare these wrappers to those in the first part of this chapter (they are slightly different).

    The end result is that access looks very similar to C++. For example, you could do this in Python:

    >>> f = make_Foo()
    >>> print f.x
    0
    >>> f.bar()
    >>>
    

    When generating wrappers through a smart-pointer, SWIG tries to generate wrappers for all methods and attributes that might be accessible through operator->(). This includes any methods that might be accessible through inheritance. However, there are a number of restrictions:

    • Member variables and methods are wrapped through a smart pointer. Enumerations, constructors, and destructors are not wrapped.
    • If the smart-pointer class and the underlying object both define a method or variable of the same name, then the smart-pointer version has precedence. For example, if you have this code

      class Foo {
      public:
        int x;
      };
      
      class Bar {
      public:
        int x;       
        Foo *operator->();
      };
      

      then the wrapper for Bar::x accesses the x defined in Bar, and not the x defined in Foo.

    If your intent is to only expose the smart-pointer class in the interface, it is not necessary to wrap both the smart-pointer class and the class for the underlying object. However, you must still tell SWIG about both classes if you want the technique described in this section to work. To only generate wrappers for the smart-pointer class, you can use the %ignore directive. For example:

    %ignore Foo;
    class Foo {       // Ignored
    };
    
    class Bar {
    public:
      Foo *operator->();
      ...
    };
    

    Alternatively, you can import the definition of Foo from a separate file using %import.

    Note: When a class defines operator->(), the operator itself is wrapped as a method __deref__(). For example:

    f = Foo()               # Smart-pointer
    p = f.__deref__()       # Raw pointer from operator->
    

    Note: To disable the smart-pointer behavior, use %ignore to ignore operator->(). For example:

    %ignore Bar::operator->;
    

    Note: Smart pointer support was first added in SWIG-1.3.14.

    6.25 C++ reference counted objects - ref/unref feature

    Another similar idiom in C++ is the use of reference counted objects. Consider for example:

    class RCObj  {
      // implement the ref counting mechanism
      int add_ref();
      int del_ref();
      int ref_count();
    
    public:
      virtual ~RCObj() = 0;
    
      int ref() const {
        return add_ref();
      }
    
      int unref() const {
        if (ref_count() == 0 || del_ref() == 0 ) {
          delete this;
          return 0;
        }
        return ref_count();
      }
    };
    
    
    class A : RCObj {
    public:
      A();
      int foo();
    };
    
    
    class B {
      A *_a;
    
    public:
      B(A *a) : _a(a) { 
        a->ref(); 
      }
    
      ~B() { 
        a->unref(); 
      }
    };
    
    int main() {
      A *a  = new A();       // (count: 0)
      a->ref();           // 'a' ref here (count: 1)
    
      B *b1 = new B(a);   // 'a' ref here (count: 2)
      if (1 + 1 == 2) {
        B *b2 = new B(a); // 'a' ref here (count: 3)
        delete b2;        // 'a' unref, but not deleted (count: 2)
      }
    
      delete b1;          // 'a' unref, but not deleted (count: 1)
      a->unref();         // 'a' unref and deleted (count: 0)
    }
    

    In the example above, the 'A' class instance 'a' is a reference counted object, which can't be deleted arbitrarily since it is shared between the objects 'b1' and 'b2'. 'A' is derived from a Reference Counted Object 'RCObj', which implements the ref/unref idiom.

    To tell SWIG that 'RCObj' and all its derived classes are reference counted objects, use the "ref" and "unref" features. These are also available as %refobject and %unrefobject, respectively. For example:

    %module example
    ...
    
    %feature("ref")   RCObj "$this->ref();"
    %feature("unref") RCObj "$this->unref();"
    
    %include "rcobj.h"
    %include "A.h"
    ...
    

    where the code passed to the "ref" and "unref" features will be executed as needed whenever a new object is passed to Python, or when Python tries to release the proxy object instance, respectively.

    On the Python side, the use of a reference counted object is no different to any other regular instance:

    def create_A():
        a = A()         # SWIG ref 'a' - new object is passed to Python (count: 1)
        b1 = B(a)       # C++ ref 'a (count: 2)
        if 1 + 1 == 2:
            b2 = B(a)   # C++ ref 'a' (count: 3)
        return a        # 'b1' and 'b2' are released and deleted, C++ unref 'a' twice (count: 1)
    
    a = create_A()      # (count: 1)
    exit                # 'a' is released, SWIG unref 'a' called in the destructor wrapper (count: 0)
    

    Note that the user doesn't explicitly need to call 'a->ref()' nor 'a->unref()' (and neither 'delete a'). Instead, SWIG takes cares of executing the "ref" and "unref" calls as needed. If the user doesn't specify the "ref/unref" feature for a type, SWIG will produce code equivalent to defining these features:

    %feature("ref")   ""
    %feature("unref") "delete $this;"
    

    In other words, SWIG will not do anything special when a new object is passed to Python, and it will always 'delete' the underlying object when Python releases the proxy instance.

    The %newobject feature is designed to indicate to the target language that it should take ownership of the returned object. When used in conjunction with a type that has the "ref" feature associated with it, it additionally emits the code in the "ref" feature into the C++ wrapper. Consider wrapping the following factory function in addition to the above:

    %newobject AFactory;
    A *AFactory() {
      return new A();
    }
    

    The AFactory function now acts much like a call to the A constructor with respect to memory handling:

    a = AFactory()    # SWIG ref 'a' due to %newobject (count: 1)
    exit              # 'a' is released, SWIG unref 'a' called in the destructor wrapper (count: 0)
    

    6.26 Using declarations and inheritance

    using declarations are sometimes used to adjust access to members of base classes. For example:

    class Foo {
    public:
      int  blah(int x);
    };
    
    class Bar {
    public:
      double blah(double x);
    };
    
    class FooBar : public Foo, public Bar {
    public:
      using Foo::blah;
      using Bar::blah;
      char *blah(const char *x);
    };
    

    In this example, the using declarations make different versions of the overloaded blah() method accessible from the derived class. For example:

    FooBar *f;
    f->blah(3);         // Ok. Invokes Foo::blah(int)
    f->blah(3.5);       // Ok. Invokes Bar::blah(double)
    f->blah("hello");   // Ok. Invokes FooBar::blah(const char *);
    

    SWIG emulates the same functionality when creating wrappers. For example, if you wrap this code in Python, the module works just like you would expect:

    >>> import example
    >>> f = example.FooBar()
    >>> f.blah(3)
    >>> f.blah(3.5)
    >>> f.blah("hello")
    

    using declarations can also be used to change access when applicable. For example:

    class Foo {
    protected:
      int x;
      int blah(int x);
    };
    
    class Bar : public Foo {
    public:
      using Foo::x;       // Make x public
      using Foo::blah;    // Make blah public
    };
    

    This also works in SWIG---the exposed declarations will be wrapped normally.

    When using declarations are used as shown in these examples, declarations from the base classes are copied into the derived class and wrapped normally. When copied, the declarations retain any properties that might have been attached using %rename, %ignore, or %feature. Thus, if a method is ignored in a base class, it will also be ignored by a using declaration.

    Because a using declaration does not provide fine-grained control over the declarations that get imported, it may be difficult to manage such declarations in applications that make heavy use of SWIG customization features. If you can't get using to work correctly, you can always change the interface to the following:

    
    class FooBar : public Foo, public Bar {
    public:
    #ifndef SWIG
      using Foo::blah;
      using Bar::blah;
    #else
      int blah(int x);         // explicitly tell SWIG about other declarations
      double blah(double x);
    #endif
    
      char *blah(const char *x);
    };
    

    Notes:

    • If a derived class redefines a method defined in a base class, then a using declaration won't cause a conflict. For example:

      class Foo {
      public:
        int blah(int );
        double blah(double);
      };
      
      class Bar : public Foo {
      public:
        using Foo::blah;    // Only imports blah(double);
        int blah(int);
      };
      
    • Resolving ambiguity in overloading may prevent declarations from being imported by using. For example:

      %rename(blah_long) Foo::blah(long);
      class Foo {
      public:
        int blah(int);
        long blah(long);  // Renamed to blah_long
      };
      
      class Bar : public Foo {
      public:
        using Foo::blah;     // Only imports blah(int)
        double blah(double x);
      };
      

    6.27 Nested classes

    If the target language supports the nested classes concept (like Java), the nested C++ classes are wrapped as nested target language proxy classes. (In case of Java - "static" nested classes.) Only public nested classes are wrapped. Otherwise there is little difference between nested and normal classes.

    If the target language doesn't support nested classes directly, or the support is not implemented in the language module (like for Python currently), then the visible nested classes are moved to the same name space as the containing class (nesting hierarchy is "flattened"). The same behaviour may be turned on for C# and Java by the %feature ("flatnested"); If there is a class with the same name in the outer namespace the inner class (or the global one) may be renamed or ignored:

    %rename (Bar_Foo) Bar::Foo;
    class Foo {};
    class Bar {
      public:
      class Foo {};
    };
    

    If a nested class, within an outer class, has to be used as a template parameter within the outer class, then the template will have to be instantiated with %template before the beginning of the outer class. An example can be found in the Templates section.

    Compatibility Note: Prior to SWIG-3.0.0, there was limited nested class support. Nested classes were treated as opaque pointers. However, there was a workaround for nested class support in these older versions requiring the user to replicate the nested class in the global scope, adding in a typedef for the nested class in the global scope and using the "nestedworkaround" feature on the nested class. This resulted in approximately the same behaviour as the "flatnested" feature. With proper nested class support now available in SWIG-3.0.0, this feature has been deprecated and no longer works requiring code changes. If you see the following warning:

    example.i:8: Warning 126: The nestedworkaround feature is deprecated
    

    consider using the "flatnested" feature discussed above which generates a non-nested proxy class, like the "nestedworkaround" feature did. Alternatively, use the default nested class code generation, which may generate an equivalent to a nested proxy class in the target language, depending on the target language support.

    SWIG-1.3.40 and earlier versions did not have the nestedworkaround feature and the generated code resulting from parsing nested classes did not always compile. Nested class warnings could also not be suppressed using %warnfilter.

    6.28 A brief rant about const-correctness

    A common issue when working with C++ programs is dealing with all possible ways in which the const qualifier (or lack thereof) will break your program, all programs linked against your program, and all programs linked against those programs.

    Although SWIG knows how to correctly deal with const in its internal type system and it knows how to generate wrappers that are free of const-related warnings, SWIG does not make any attempt to preserve const-correctness in the target language. Thus, it is possible to pass const qualified objects to non-const methods and functions. For example, consider the following code in C++:

    const Object * foo();
    void bar(Object *);
    
    ...
    // C++ code
    void blah() {
      bar(foo());         // Error: bar discards const
    };
    

    Now, consider the behavior when wrapped into a Python module:

    >>> bar(foo())         # Okay
    >>> 
    

    Although this is clearly a violation of the C++ type-system, fixing the problem doesn't seem to be worth the added implementation complexity that would be required to support it in the SWIG run-time type system. There are no plans to change this in future releases (although we'll never rule anything out entirely).

    The bottom line is that this particular issue does not appear to be a problem for most SWIG projects. Of course, you might want to consider using another tool if maintaining constness is the most important part of your project.

    6.29 Callbacks to the target language

    C/C++ function pointers are often used for callbacks and this is discussed in the Pointers to functions and callbacks section. The callback techniques described therein provide a way to control callbacks to a C/C++ function but not callbacks into the target language. The techniques described below show how the director feature can be used to support callbacks from C/C++ to the target language.

    6.29.1 Introduction to director classes

    The director feature enables the ability for a target language class to derive from a wrapped C++ class. The target language can override virtual methods of a wrapped C++ class, thereby supporting cross-language polymorphism. Code can 'call up' from C++ into the target language by simply calling a virtual method overridden in a derived class in the target language. The wrapped C++ classes that have this ability are termed 'director' classes. The director feature is documented individually in each target language and the reader should locate and read this to obtain a full understanding of directors.

    6.29.2 Using directors and target language callbacks

    SWIG's primary goal is to make it possible to call C/C++ code from a target language, however, the director feature enables the reverse. While there isn't simple direct support for calling target language code from C, the director feature makes this possible. It does require some work and additional wrapper code to be provided by the user. The additional code required must be C++ and not C code and hence may introduce a small dependency on C++ if using a pure C project. In a nutshell, the user must create a C++ base class and turn it into a director class. A virtual method in the director base class is required. SWIG generates the code to call up into the target language when wrapping the director virtual method.

    Let's look at some details next. Consider the same function pointer for a callback called binary_op from the Pointers to functions and callbacks section. For completeness, the code required for the module and director feature is also shown:

    %module(directors="1") example
    
    %{
    int binary_op(int a, int b, int (*op)(int, int)) {
      return op(a, b);
    }
    %}
    

    The goal is to have a target language function that gets called by binary_op. The target language function should have the equivalent signature as the C/C++ function pointer int (*op)(int, int). As we are using directors, we need a C++ virtual method with this signature, so let's define the C++ class and pure virtual method first and make it a director class via the director feature:

    %feature("director") BinaryOp;
    
    %inline %{
    struct BinaryOp {
      virtual int handle(int a, int b) = 0;
      virtual ~BinaryOp() {}
    };
    %}
    

    The following handler_helper function and binary_op_wrapper function completes the code needed in the C++/SWIG layer. The binary_op_wrapper function is wrapped by SWIG and is very similar to the binary_op function, however, it takes a pointer to the director base class BinaryOp instead of a C/C++ function pointer.

    %{
    static BinaryOp *handler_ptr = NULL;
    static int handler_helper(int a, int b) {
      // Make the call up to the target language when handler_ptr
      // is an instance of a target language director class
      return handler_ptr->handle(a, b);
    }
    // If desired, handler_ptr above could be changed to a thread-local variable in order to make thread-safe
    %}
    
    %inline %{
    int binary_op_wrapper(int a, int b, BinaryOp *handler) {
      handler_ptr = handler;
      int result = binary_op(a, b, &handler_helper);
      handler = NULL;
      return result;
    }
    %}
    

    On the target language side, we need to derive a class from BinaryOp and override the handle method. In Python this could be as simple as:

    import example
    
    # PythonBinaryOp class is defined and derived from C++ class BinaryOp
    class PythonBinaryOp(example.BinaryOp):
    
        # Define Python class 'constructor'
        def __init__(self):
            # Call C++ base class constructor
            example.BinaryOp.__init__(self)
    
        # Override C++ method: virtual int handle(int a, int b) = 0;
        def handle(self, a, b):
            # Return the product
            return a * b
    

    For this to work from Python, an instance of the PythonBinaryOp class is created and then passed to binary_op_wrapper. The net result is the binary_op function will in turn be called which will call handler_helper which will call the virtual handle method, that is, the Python method handle in the PythonBinaryOp class. The result will be the product of 10 and 20 and make its way back to Python and hence 200 will be printed with the following code:

    handler = PythonBinaryOp()
    result = example.binary_op_wrapper(10, 20, handler)
    print result
    

    This has thus demonstrated a C/C++ function pointer calling back into a target language function. The code could be made a little more user friendly by using %rename to provide the original binary_op name from the target language instead of binary_op_wrapper. A C++ functor base class and Python functor class could also be used instead, but these are left as exercises for the reader.

    6.30 Where to go for more information

    If you're wrapping serious C++ code, you might want to pick up a copy of "The Annotated C++ Reference Manual" by Ellis and Stroustrup. This is the reference document we use to guide a lot of SWIG's C++ support.

    swig-4.0.2/Doc/Manual/chapters0000644000175000017500000000076413667507523016047 0ustar williamwilliamPreface.html Introduction.html Windows.html Scripting.html SWIG.html SWIGPlus.html CPlusPlus11.html CPlusPlus14.html CPlusPlus17.html Preprocessor.html Library.html Arguments.html Typemaps.html Customization.html Contract.html Varargs.html Doxygen.html Warnings.html Modules.html CCache.html Android.html CSharp.html D.html Go.html Guile.html Java.html Javascript.html Lua.html Octave.html Perl5.html Php.html Python.html R.html Ruby.html Scilab.html Tcl.html Mzscheme.html Ocaml.html Extending.html swig-4.0.2/Doc/Manual/Sections.html0000644000175000017500000000610113667507523016757 0ustar williamwilliam SWIG-4.0 Documentation

    SWIG-4.0 Documentation

    Last update : SWIG-4.0.2 (8 Jun 2020)

    Sections

    SWIG Core Documentation

    Supported Language Modules Documentation

    Experimental Language Modules Documentation

    Developer Documentation

    swig-4.0.2/Doc/Manual/CPlusPlus17.html0000644000175000017500000000452413667507562017244 0ustar williamwilliam SWIG and C++17

    9 SWIG and C++17

    9.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++17 standard. There isn't much in C++17 that affects SWIG, however, work has only just begun on adding C++17 support.

    Compatibility note: SWIG-4.0.0 is the first version to support any C++17 features.

    9.2 Core language changes

    9.2.1 Nested namespace definitions

    C++17 offers a more concise syntax for defining namespaces. SWIG has support for nested namespace definitions such as:

    namespace A::B::C {
      ...
    }
    

    This is the equivalent to the C++98 namespace definitions:

    namespace A {
      namespace B {
        namespace C {
          ...
        }
      }
    }
    

    9.2.2 UTF-8 character literals

    C++17 added UTF-8 (u8) character literals. These are of type char. Example:

    char a = u8'a';
    

    9.2.3 Hexadecimal floating literals

    C++17 added hexadecimal floating literals. For example:

    double f = 0xF.68p2;
    

    9.3 Standard library changes

    swig-4.0.2/Doc/Manual/CSharp.html0000644000175000017500000027357713667507563016403 0ustar williamwilliam SWIG and C#

    22 SWIG and C#

    22.1 Introduction

    The purpose of the C# module is to offer an automated way of accessing existing C/C++ code from .NET languages. The wrapper code implementation uses C# and the Platform Invoke (PInvoke) interface to access natively compiled C/C++ code. The PInvoke interface has been chosen over Microsoft's Managed C++ interface as it is portable to both Microsoft Windows and non-Microsoft platforms. PInvoke is part of the ECMA/ISO C# specification. It is also better suited for robust production environments due to the Managed C++ flaw called the Mixed DLL Loading Problem. SWIG C# works equally well on non-Microsoft operating systems such as Linux, Solaris and Apple Mac using Mono.

    SWIG 3 and later requires .NET 2.0 at a minimum. There are some minor exceptions, where the minimum required is .NET 4.0. This is when using the std::complex and std::list STL containers.

    To get the most out of this chapter an understanding of interop is required. The Microsoft Developer Network (MSDN) has a good reference guide in a section titled "Interop Marshaling". Monodoc, available from the Mono project, has a very useful section titled Interop with native libraries.

    22.1.1 SWIG 2 Compatibility

    In order to minimize name collisions between names generated based on input to SWIG and names used in the generated code from the .NET framework, SWIG 3 fully qualifies the use of all .NET types. Furthermore, SWIG 3 avoids using directives in generated code. This breaks backwards compatibility with typemaps, pragmas, etc written for use with SWIG 2 that assume the presence of using System; or using System.Runtime.InteropServices; directives in the intermediate class imports, module imports, or proxy imports. SWIG 3 supports backwards compatibility though the use of the SWIG2_CSHARP macro. If SWIG2_CSHARP is defined, SWIG 3 generates using directives in the intermediate class, module class, and proxy class code similar to those generated by SWIG 2. This can be done without modifying any of the input code by passing the -DSWIG2_CSHARP commandline parameter when executing swig.

    22.1.2 Additional command line options

    The following table lists the additional commandline options available for the C# module. They can also be seen by using:

    swig -csharp -help 
    
    C# specific options
    -dllimport <dl> Override DllImport attribute name to <dl>
    -namespace <nm> Generate wrappers into C# namespace <nm>
    -noproxy Generate the low-level functional interface instead of proxy classes
    -oldvarnames Old intermediary method names for variable wrappers
    -outfile <file> Write all C# into a single <file> located in the output directory

    The -outfile option combines all the generated C# code into a single output file instead of creating multiple C# files. The default, when this option is not provided, is to generate separate .cs files for the module class, intermediary class and each of the generated proxy and type wrapper classes. Note that the file extension (.cs) will not be automatically added and needs to be provided. Due to possible compiler limits it is not advisable to use -outfile for large projects.

    22.2 Differences to the Java module

    The C# module is very similar to the Java module, so until some more complete documentation has been written, please use the Java documentation as a guide to using SWIG with C#. The C# module has the same major SWIG features as the Java module. The rest of this section should be read in conjunction with the Java documentation as it lists the main differences. The most notable differences to Java are the following:

    • When invoking SWIG use the -csharp command line option instead of -java.
    • The -nopgcpp command line option does not exist.
    • The -package command line option does not exist.
    • The -namespace <name> commandline option will generate all code into the namespace specified by <name>. C# supports nested namespaces that are not lexically nested, so nested namespaces will of course also work. For example: -namespace com.bloggs.widget, will generate code into C# namespaces:
      namespace com.bloggs.widget {
        ...
      }
      
      Note that by default, the generated C# classes have no namespace and the module name is unrelated to namespaces. The module name is just like in Java and is merely used to name some of the generated classes.
    • The nspace feature is also supported as described in this general section with a C# example. Unlike Java which requires the use of the -package option when using the nspace feature, the -namespace option is not mandatory for C#.
    • The -dllimport <name> commandline option specifies the name of the DLL for the DllImport attribute for every PInvoke method. If this commandline option is not given, the DllImport DLL name is the same as the module name. This option is useful for when one wants to invoke SWIG multiple times on different modules, yet compile all the resulting code into a single DLL.
    • C/C++ variables are wrapped with C# properties and not JavaBean style getters and setters.
    • Global constants are generated into the module class. There is no constants interface.
    • There is no implementation for type unsafe enums - not deemed necessary.
    • The default enum wrapping approach is proper C# enums, not typesafe enums.
      Note that %csconst(0) will be ignored when wrapping C/C++ enums with proper C# enums. This is because C# enum items must be initialised from a compile time constant. If an enum item has an initialiser and the initialiser doesn't compile as C# code, then the %csconstvalue directive must be used as %csconst(0) will have no effect. If it was used, it would generate an illegal runtime initialisation via a PInvoke call.
    • C# doesn't support the notion of throws clauses. Therefore there is no 'throws' typemap attribute support for adding exception classes to a throws clause. Likewise there is no need for an equivalent to %javaexception. In fact, throwing C# exceptions works quite differently, see C# Exceptions below.
    • The majority of the typemaps are in csharp.swg, not java.swg.
    • Typemap equivalent names:

      jni                         -> ctype
      jtype                       -> imtype
      jstype                      -> cstype
      javain                      -> csin
      javaout                     -> csout
      javadirectorin              -> csdirectorin
      javadirectorout             -> csdirectorout
      javainterfaces              -> csinterfaces and csinterfaces_derived
      javabase                    -> csbase
      javaclassmodifiers          -> csclassmodifiers
      javacode                    -> cscode
      javaimports                 -> csimports
      javabody                    -> csbody
      javafinalize                -> csfinalize
      javadestruct                -> csdisposing and csdispose
      javadestruct_derived        -> csdisposing_derived and csdispose_derived
      javainterfacecode           -> csinterfacecode
      
    • Typemap macros:

      SWIG_JAVABODY_PROXY         -> SWIG_CSBODY_PROXY
      SWIG_JAVABODY_TYPEWRAPPER   -> SWIG_CSBODY_TYPEWRAPPER
      
    • Additional typemaps:

      csvarin                     C# code property set typemap
      csvarout                    C# code property get typemap
      csattributes                C# attributes for attaching to proxy classes/enums
      
    • Additional typemap attributes:

      The "null" attribute in the "out" typemap can be specified to provide a value for $null to expand into for wrapped functions that return non-void. Normally the default value of 0 is used. For example this is needed if you change the return type to void:

      %typemap(ctype) Status "void"
      %typemap(out, null="") Status { ... }
      
    • Feature equivalent names:

      %javaconst                  -> %csconst
      %javaconstvalue             -> %csconstvalue
      %javamethodmodifiers        -> %csmethodmodifiers
      
    • Pragma equivalent names:

      %pragma(java)               -> %pragma(csharp)
      jniclassbase                -> imclassbase
      jniclassclassmodifiers      -> imclassclassmodifiers
      jniclasscode                -> imclasscode
      jniclassimports             -> imclassimports
      jniclassinterfaces          -> imclassinterfaces
      
    • Special variable equivalent names:

      $javaclassname              -> $csclassname
      $&javaclassname             -> $&csclassname
      $*javaclassname             -> $*csclassname
      $javaclazzname              -> $csclazzname
      $javainput                  -> $csinput
      $jnicall                    -> $imcall
      $javainterfacename          -> $csinterfacename
      $&javainterfacename         -> $&csinterfacename
      $*javainterfacename         -> $*csinterfacename
      
    • Unlike the "javain" typemap, the "csin" typemap does not support the 'pgcpp' attribute as the C# module does not have a premature garbage collection prevention parameter. The "csin" typemap supports additional optional attributes called 'cshin' and 'terminator'. The "csdirectorin" typemap supports additional optional attributes called 'terminator'. The 'cshin' attribute should contain the parameter type and name whenever a constructor helper function is generated due to the 'pre' or 'post' attributes. The 'terminator' attribute normally just contains a closing brace for when the 'pre' attribute contains an opening brace, such as when a C# using or fixed block is started. Note that 'pre', 'post', 'terminator' and 'cshin' attributes are not used for marshalling the property set. Please see the Date marshalling example and Date marshalling of properties example for further understanding of these "csin" applicable attributes. Please see the Date marshalling director example for further understanding of the "csdirectorin" attributes.

    • Support for asymmetric type marshalling. The 'ctype', 'imtype' and 'cstype' typemaps support an optional out attribute which is used for output types. If this typemap attribute is specified, then the type specified in the attribute is used for output types and the type specified in the typemap itself is used for the input type. If this typemap attribute is not specified, then the type used for both input and output is the type specified in the typemap. An example shows that char * could be marshalled in different ways,

      %typemap(imtype, out="global::System.IntPtr") char * "string"
      char * function(char *);
      

      The output type is thus IntPtr and the input type is string. The resulting intermediary C# code is:

      public static extern global::System.IntPtr function(string jarg1);
      
    • Support for type attributes. The 'imtype' and 'cstype' typemaps can have an optional inattributes and outattributes typemap attribute. The 'imtype' typemap can also have an optional directorinattributes and directoroutattributes typemap attribute which attaches to director delegates, an implementation detail of directors, see directors implementation. Note that there are C# attributes and typemap attributes, don't get confused between the two!! The C# attributes specified in these typemap attributes are generated wherever the type is used in the C# wrappers. These can be used to specify any C# attribute associated with a C/C++ type, but are more typically used for the C# MarshalAs attribute. For example:

      %typemap(imtype,
               inattributes="[global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]",
               outattributes="[return: global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]") const char * "String"
      
      const char * GetMsg() {}
      void SetMsg(const char *msg) {}
      

      The intermediary class will then have the marshalling as specified by everything in the 'imtype' typemap:

      class examplePINVOKE {
        ...
        [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_GetMsg")]
        [return: global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]
        public static extern String GetMsg();
      
        [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_SetMsg")]
        public static extern void SetMsg([global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]String jarg1);
      }
      

      Note that the DllImport attribute is always generated, irrespective of any additional attributes specified.

      These attributes are associated with the C/C++ parameter type or return type, which is subtly different to the attribute features and typemaps covered next. Note that all these different C# attributes can be combined so that a method has more than one attribute.

      The directorinattributes and directoroutattributes typemap attribute are attached to the delegates in the director class, for example, the SwigDelegateBase_0

    • Support for attaching C# attributes to wrapped methods, variables and enum values. This is done using the %csattributes feature, see %feature directives. Note that C# attributes are attached to proxy classes and enums using the csattributes typemap. For example, imagine we have a custom attribute class, ThreadSafeAttribute, for labelling thread safety. The following SWIG code shows how to attach this C# attribute to some methods and the class declaration itself:

      %typemap(csattributes) AClass          "[ThreadSafe]"
      %csattributes AClass::AClass(double d) "[ThreadSafe(false)]"
      %csattributes AClass::AMethod()        "[ThreadSafe(true)]"
      
      %inline %{
      class AClass {
      public:
        AClass(double a) {}
        void AMethod() {}
      };
      %}
      

      will generate a C# proxy class:

      [ThreadSafe]
      public class AClass : global::System.IDisposable {
        ...
        [ThreadSafe(false)]
        public AClass(double a) ...
      
        [ThreadSafe(true)]
        public void AMethod() ...
      }
      

      If C# attributes need adding to the set or get part of C# properties, when wrapping C/C++ variables, they can be added using the 'csvarin' and 'csvarout' typemaps respectively. Note that the type used for the property is specified in the 'cstype' typemap. If the 'out' attribute exists in this typemap, then the type used is from the 'out' attribute.

      An example for attaching attributes to the enum and enum values is shown below.

      %typemap(csattributes) Couleur "[global::System.ComponentModel.Description(\"Colours\")]"
      %csattributes Rouge "[global::System.ComponentModel.Description(\"Red\")]"
      %csattributes Vert "[global::System.ComponentModel.Description(\"Green\")]"
      %inline %{
        enum Couleur { Rouge, Orange, Vert };
      %}
      

      which will result in the following C# enum:

      [global::System.ComponentModel.Description("Colours")]
      public enum Couleur {
        [global::System.ComponentModel.Description("Red")]
        Rouge,
        Orange,
        [global::System.ComponentModel.Description("Green")]
        Vert
      }
      
    • The intermediary classname has PINVOKE appended after the module name instead of JNI, for example modulenamePINVOKE.

    • The %csmethodmodifiers feature can also be applied to variables as well as methods. In addition to the default public modifier that SWIG generates when %csmethodmodifiers is not specified, the feature will also replace the virtual/new/override modifiers that SWIG thinks is appropriate. This feature is useful for some obscure cases where SWIG might get the virtual/new/override modifiers incorrect, for example with multiple inheritance.

    • The name of the intermediary class can be changed from its default, that is, the module name with PINVOKE appended after it. The module directive attribute imclassname is used to achieve this:

      %module (imclassname="name") modulename
      

      If name is the same as modulename then the module class name gets changed from modulename to modulenameModule.

    • There is no additional 'premature garbage collection prevention parameter' as the marshalling of the HandleRef object takes care of ensuring a reference to the proxy class is held until the unmanaged call completed.

    $dllimport
    This is a C# only special variable that can be used in typemaps, pragmas, features etc. The special variable will get translated into the value specified by the -dllimport commandline option if specified, otherwise it is equivalent to the $module special variable.

    $imclassname
    This special variable expands to the intermediary class name. For C# this is usually the same as '$modulePINVOKE' ('$moduleJNI' for Java), unless the imclassname attribute is specified in the %module directive.

    The directory Examples/csharp has a number of simple examples. Visual Studio .NET 2003 solution and project files are available for compiling with the Microsoft .NET C# compiler on Windows. This also works with newer versions of Visual Studio if you allow it to convert the solution to the latest version. If your SWIG installation went well on a Unix environment and your C# compiler was detected, you should be able to type make in each example directory. After SWIG has run and both the C# and C/C++ compilers have finished building, the examples will be run, by either running runme.exe or by running mono runme.exe (Mono C# compiler). Windows users can also get the examples working using a Cygwin or MinGW environment for automatic configuration of the example makefiles. Any one of the C# compilers (Mono or Microsoft) can be detected from within a Cygwin or Mingw environment if installed in your path.

    22.3 Void pointers

    By default SWIG treats void * as any other pointer and hence marshalls it as a type wrapper class called SWIGTYPE_p_void. If you want to marshall with the .NET System.IntPtr type instead, there is a simple set of named typemaps called void *VOID_INT_PTR that can be used. They can be applied like any other named typemaps:

    %apply void *VOID_INT_PTR { void * }
    void * f(void *v);
    

    22.4 C# Arrays

    There are various ways to pass arrays from C# to C/C++. The default wrapping treats arrays as pointers and as such simple type wrapper classes are generated, eg SWIGTYPE_p_int when wrapping the C type int [] or int *. This gives a rather restricted use of the underlying unmanaged code and the most practical way to use arrays is to enhance or customise with one of the following three approaches; namely the SWIG C arrays library, P/Invoke default array marshalling or pinned arrays.

    22.4.1 The SWIG C arrays library

    The C arrays library keeps all the array memory in the unmanaged layer. The library is available to all language modules and is documented in the carrays.i library section. Please refer to this section for details, but for convenience, the C# usage for the two examples outlined there is shown below.

    For the %array_functions example, the equivalent usage would be:

    SWIGTYPE_p_double a = example.new_doubleArray(10);  // Create an array
    for (int i=0; i<10; i++)
      example.doubleArray_setitem(a, i, 2*i);           // Set a value
    example.print_array(a);                             // Pass to C
    example.delete_doubleArray(a);                      // Destroy array
    

    and for the %array_class example, the equivalent usage would be:

    doubleArray c = new doubleArray(10);    // Create double[10]
    for (int i=0; i<10; i++)
      c.setitem(i, 2*i);                    // Assign values
    example.print_array(c.cast());          // Pass to C
    

    22.4.2 Managed arrays using P/Invoke default array marshalling

    In the P/Invoke default marshalling scheme, one needs to designate whether the invoked function will treat a managed array parameter as input, output, or both. When the function is invoked, the CLR allocates a separate chunk of memory as big as the given managed array, which is automatically released at the end of the function call. If the array parameter is marked as being input, the content of the managed array is copied into this buffer when the call is made. Correspondingly, if the array parameter is marked as being output, the contents of the reserved buffer are copied back into the managed array after the call returns. A pointer to this buffer is passed to the native function.

    The reason for allocating a separate buffer is to leave the CLR free to relocate the managed array object during garbage collection. If the overhead caused by the copying is causing a significant performance penalty, consider pinning the managed array and passing a direct reference as described in the next section.

    For more information on the subject, see the Default Marshaling for Arrays article on MSDN.

    The P/Invoke default marshalling is supported by the arrays_csharp.i library via the INPUT, OUTPUT and INOUT typemaps. Let's look at some example usage. Consider the following C function:

    void myArrayCopy(int *sourceArray, int *targetArray, int nitems);
    

    We can now instruct SWIG to use the default marshalling typemaps by

    %include "arrays_csharp.i"
    
    %apply int INPUT[]  {int *sourceArray}
    %apply int OUTPUT[] {int *targetArray}
    

    As a result, we get the following method in the module class:

    public static void myArrayCopy(int[] sourceArray, int[] targetArray, int nitems) {
      examplePINVOKE.myArrayCopy(sourceArray, targetArray, nitems);
    }
    

    If we look beneath the surface at the corresponding intermediary class code, we see that SWIG has generated code that uses attributes (from the System.Runtime.InteropServices namespace) to tell the CLR to use default marshalling for the arrays:

    [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArrayCopy")]
    public static extern void myArrayCopy([global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg1, 
                                          [global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg2,
                                           int jarg3);
    

    As an example of passing an inout array (i.e. the target function will both read from and write to the array), consider this C function that swaps a given number of elements in the given arrays:

    void myArraySwap(int *array1, int *array2, int nitems);
    

    Now, we can instruct SWIG to wrap this by

    %include "arrays_csharp.i"
    
    %apply int INOUT[] {int *array1}
    %apply int INOUT[] {int *array2}
    

    This results in the module class method

      public static void myArraySwap(int[] array1, int[] array2, int nitems) {
        examplePINVOKE.myArraySwap(array1, array2, nitems);
      }
    

    and intermediary class method

      [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArraySwap")]
      public static extern void myArraySwap([global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg1, 
                                            [global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg2,
                                             int jarg3);
    

    22.4.3 Managed arrays using pinning

    It is also possible to pin a given array in memory (i.e. fix its location in memory), obtain a direct pointer to it, and then pass this pointer to the wrapped C/C++ function. This approach involves no copying, but it makes the work of the garbage collector harder as the managed array object can not be relocated before the fix on the array is released. You should avoid fixing arrays in memory in cases where the control may re-enter the managed side via a callback and/or another thread may produce enough garbage to trigger garbage collection.

    For more information, see the fixed statement in the C# language reference.

    Now let's look at an example using pinning, thus avoiding the CLR making copies of the arrays passed as parameters. The arrays_csharp.i library file again provides the required support via the FIXED typemaps. Let's use the same function from the previous section:

    void myArrayCopy(int *sourceArray, int *targetArray, int nitems);
    

    We now need to declare the module class method unsafe, as we are using pointers:

    %csmethodmodifiers myArrayCopy "public unsafe";
     

    Apply the appropriate typemaps to the array parameters:

    %include "arrays_csharp.i"
    
    %apply int FIXED[] {int *sourceArray}
    %apply int FIXED[] {int *targetArray}
    

    Notice that there is no need for separate in, out or inout typemaps as is the case when using P/Invoke default marshalling.

    As a result, we get the following method in the module class:

      public unsafe static void myArrayCopy(int[] sourceArray, int[] targetArray, int nitems) {
        fixed ( int *swig_ptrTo_sourceArray = sourceArray ) {
        fixed ( int *swig_ptrTo_targetArray = targetArray ) {
        {
          examplePINVOKE.myArrayCopy((global::System.IntPtr)swig_ptrTo_sourceArray, (global::System.IntPtr)swig_ptrTo_targetArray,
                                     nitems);
        }
        }
        }
      }
    

    On the method signature level the only difference to the version using P/Invoke default marshalling is the "unsafe" quantifier, which is required because we are handling pointers.

    Also the intermediary class method looks a little different from the default marshalling example - the method is expecting an IntPtr as the parameter type.

    [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArrayCopy")]
    public static extern void myArrayCopy(global::System.IntPtr jarg1, global::System.IntPtr jarg2, int jarg3);
    

    22.5 C# Exceptions

    It is possible to throw a C# Exception from C/C++ code. SWIG already provides the framework for throwing C# exceptions if it is able to detect that a C++ exception could be thrown. Automatically detecting that a C++ exception could be thrown is only possible when a C++ exception specification is used, see Exception specifications. The Exception handling with %exception section details the %exception feature. Customised code for handling exceptions with or without a C++ exception specification is possible and the details follow. However anyone wishing to do this should be familiar with the contents of the sections referred to above.

    Unfortunately a C# exception cannot simply be thrown from unmanaged code for a variety of reasons. Most notably being that throwing a C# exception results in exceptions being thrown across the C PInvoke interface and C does not understand exceptions. The design revolves around a C# exception being constructed and stored as a pending exception, to be thrown only when the unmanaged code has completed. Implementing this is a tad involved and there are thus some unusual typemap constructs. Some practical examples follow and they should be read in conjunction with the rest of this section.

    First some details about the design that must be followed. Each typemap or feature that generates unmanaged code supports an attribute called canthrow. This is simply a flag which when set indicates that the code in the typemap/feature has code which might want to throw a C# exception. The code in the typemap/feature can then raise a C# exception by calling one of the C functions, SWIG_CSharpSetPendingException() or SWIG_CSharpSetPendingExceptionArgument(). When called, the function makes a callback into the managed world via a delegate. The callback creates and stores an exception ready for throwing when the unmanaged code has finished. The typemap/feature unmanaged code is then expected to force an immediate return from the unmanaged wrapper function, so that the pending managed exception can then be thrown. The support code has been carefully designed to be efficient as well as thread-safe. However to achieve the goal of efficiency requires some optional code generation in the managed code typemaps. Code to check for pending exceptions is generated if and only if the unmanaged code has code to set a pending exception, that is if the canthrow attribute is set. The optional managed code is generated using the excode typemap attribute and $excode special variable in the relevant managed code typemaps. Simply, if any relevant unmanaged code has the canthrow attribute set, then any occurrences of $excode is replaced with the code in the excode attribute. If the canthrow attribute is not set, then any occurrences of $excode are replaced with nothing.

    The prototypes for the SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() functions are

    static void SWIG_CSharpSetPendingException(SWIG_CSharpExceptionCodes code,
                                               const char *msg);
    
    static void SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpExceptionArgumentCodes code,
                                                       const char *msg,
                                                       const char *param_name);
    

    The first parameter defines which .NET exceptions can be thrown:

    typedef enum {
      SWIG_CSharpApplicationException,
      SWIG_CSharpArithmeticException,
      SWIG_CSharpDivideByZeroException,
      SWIG_CSharpIndexOutOfRangeException,
      SWIG_CSharpInvalidCastException,
      SWIG_CSharpInvalidOperationException,
      SWIG_CSharpIOException,
      SWIG_CSharpNullReferenceException,
      SWIG_CSharpOutOfMemoryException,
      SWIG_CSharpOverflowException,
      SWIG_CSharpSystemException
    } SWIG_CSharpExceptionCodes;
    
    typedef enum {
      SWIG_CSharpArgumentException,
      SWIG_CSharpArgumentNullException,
      SWIG_CSharpArgumentOutOfRangeException,
    } SWIG_CSharpExceptionArgumentCodes;
    

    where, for example, SWIG_CSharpApplicationException corresponds to the .NET exception, ApplicationException. The msg and param_name parameters contain the C# exception message and parameter name associated with the exception.

    The %exception feature in C# has the canthrow attribute set. The %csnothrowexception feature is like %exception, but it does not have the canthrow attribute set so should only be used when a C# exception is not created.

    22.5.1 C# exception example using "check" typemap

    Let's say we have the following simple C++ method:

    void positivesonly(int number);
    

    and we want to check that the input number is always positive and if not throw a C# ArgumentOutOfRangeException. The "check" typemap is designed for checking input parameters. Below you will see the canthrow attribute is set because the code contains a call to SWIG_CSharpSetPendingExceptionArgument(). The full example follows:

    %module example
    
    %typemap(check, canthrow=1) int number %{
    if ($1 < 0) {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
                                             "only positive numbers accepted", "number");
      return $null;
    }
    // SWIGEXCODE is a macro used by many other csout typemaps
    %define SWIGEXCODE
     "\n    if ($modulePINVOKE.SWIGPendingException.Pending)"
     "\n      throw $modulePINVOKE.SWIGPendingException.Retrieve();"
    %enddef
    %typemap(csout, excode=SWIGEXCODE) void {
        $imcall;$excode
      }
    %}
    
    %inline %{
    
    void positivesonly(int number) {
    }
    
    %}
    

    When the following C# code is executed:

    public class runme {
      static void Main() {
        example.positivesonly(-1);
      }
    }
    

    The exception is thrown:

    Unhandled Exception: System.ArgumentOutOfRangeException: only positive numbers accepted
    Parameter name: number
    in <0x00034> example:positivesonly (int)
    in <0x0000c> runme:Main ()
    

    Now let's analyse the generated code to gain a fuller understanding of the typemaps. The generated unmanaged C++ code is:

    SWIGEXPORT void SWIGSTDCALL CSharp_positivesonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
    
      if (arg1 < 0) {
        SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
          "only positive numbers accepted", "number");
        return ;
      }
    
      positivesonly(arg1);
    
    }
    

    This largely comes from the "check" typemap. The managed code in the module class is:

    public class example {
      public static void positivesonly(int number) {
        examplePINVOKE.positivesonly(number);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
    }
    

    This comes largely from the "csout" typemap.

    The "csout" typemap is the same as the default void "csout" typemap so is not strictly necessary for the example. However, it is shown to demonstrate what managed output code typemaps should contain, that is, a $excode special variable and an excode attribute. Also note that $excode is expanded into the code held in the excode attribute. The $imcall as always expands into examplePINVOKE.positivesonly(number). The exception support code in the intermediary class, examplePINVOKE, is not shown, but is contained within the inner classes, SWIGPendingException and SWIGExceptionHelper and is always generated. These classes can be seen in any of the generated wrappers. However, all that is required of a user is as demonstrated in the "csin" typemap above. That is, is to check SWIGPendingException.Pending and to throw the exception returned by SWIGPendingException.Retrieve().

    If the "check" typemap did not exist, then the following module class would instead be generated:

    public class example {
      public static void positivesonly(int number) {
        examplePINVOKE.positivesonly(number);
      }
    
    }
    

    Here we see the pending exception checking code is omitted. In fact, the code above would be generated if the canthrow attribute was not in the "check" typemap, such as:

    %typemap(check) int number %{
    if ($1 < 0) {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
                                             "only positive numbers accepted", "number");
      return $null;
    }
    %}
    

    Note that if SWIG detects you have used SWIG_CSharpSetPendingException() or SWIG_CSharpSetPendingExceptionArgument() without setting the canthrow attribute you will get a warning message similar to

    example.i:21: Warning 845: Unmanaged code contains a call to a SWIG_CSharpSetPendingException
    method and C# code does not handle pending exceptions via the canthrow attribute.
    

    Actually it will issue this warning for any function beginning with SWIG_CSharpSetPendingException.

    22.5.2 C# exception example using %exception

    Let's consider a similar, but more common example that throws a C++ exception from within a wrapped function. We can use %exception as mentioned in Exception handling with %exception.

    %exception negativesonly(int value) %{
    try {
      $action
    } catch (std::out_of_range e) {
      SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what());
      return $null;
    }
    %}
    
    %inline %{
    #include <stdexcept>
    void negativesonly(int value) {
      if (value >= 0)
        throw std::out_of_range("number should be negative");
    }
    %}
    

    The generated unmanaged code this time catches the C++ exception and converts it into a C# ApplicationException.

    SWIGEXPORT void SWIGSTDCALL CSharp_negativesonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
    
      try {
        negativesonly(arg1);
    
      } catch (std::out_of_range e) {
        SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what());
        return ;
      }
    }
    

    The managed code generated does check for the pending exception as mentioned earlier as the C# version of %exception has the canthrow attribute set by default:

      public static void negativesonly(int value) {
        examplePINVOKE.negativesonly(value);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    

    22.5.3 C# exception example using exception specifications

    When C++ exception specifications are used, SWIG is able to detect that the method might throw an exception. By default SWIG will automatically generate code to catch the exception and convert it into a managed ApplicationException, as defined by the default "throws" typemaps. The following example has a user supplied "throws" typemap which is used whenever an exception specification contains a std::out_of_range, such as the evensonly method below.

    %typemap(throws, canthrow=1) std::out_of_range {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, $1.what(), NULL);
      return $null;
    }
    
    %inline %{
    #include <stdexcept>
    void evensonly(int input) throw (std::out_of_range) {
      if (input%2 != 0)
        throw std::out_of_range("number is not even");
    }
    %}
    

    Note that the type for the throws typemap is the type in the exception specification. SWIG generates a try catch block with the throws typemap code in the catch handler.

    SWIGEXPORT void SWIGSTDCALL CSharp_evensonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
      try {
        evensonly(arg1);
      }
      catch(std::out_of_range &_e) {
        {
          SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, (&_e)->what(), NULL);
          return ;
        }
      }
    }
    

    Multiple catch handlers are generated should there be more than one exception specifications declared.

    22.5.4 Custom C# ApplicationException example

    This example involves a user defined exception. The conventional .NET exception handling approach is to create a custom ApplicationException and throw it in your application. The goal in this example is to convert the STL std::out_of_range exception into one of these custom .NET exceptions.

    The default exception handling is quite easy to use as the SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() methods are provided by SWIG. However, for a custom C# exception, the boiler plate code that supports these functions needs replicating. In essence this consists of some C/C++ code and C# code. The C/C++ code can be generated into the wrapper file using the %insert(runtime) directive and the C# code can be generated into the intermediary class using the imclasscode pragma as follows:

    %insert(runtime) %{
      // Code to handle throwing of C# CustomApplicationException from C/C++ code.
      // The equivalent delegate to the callback, CSharpExceptionCallback_t, is CustomExceptionDelegate
      // and the equivalent customExceptionCallback instance is customDelegate
      typedef void (SWIGSTDCALL* CSharpExceptionCallback_t)(const char *);
      CSharpExceptionCallback_t customExceptionCallback = NULL;
    
      extern "C" SWIGEXPORT
      void SWIGSTDCALL CustomExceptionRegisterCallback(CSharpExceptionCallback_t customCallback) {
        customExceptionCallback = customCallback;
      }
    
      // Note that SWIG detects any method calls named starting with
      // SWIG_CSharpSetPendingException for warning 845
      static void SWIG_CSharpSetPendingExceptionCustom(const char *msg) {
        customExceptionCallback(msg);
      }
    %}
    
    %pragma(csharp) imclasscode=%{
      class CustomExceptionHelper {
        // C# delegate for the C/C++ customExceptionCallback
        public delegate void CustomExceptionDelegate(string message);
        static CustomExceptionDelegate customDelegate =
                                       new CustomExceptionDelegate(SetPendingCustomException);
    
        [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="CustomExceptionRegisterCallback")]
        public static extern
               void CustomExceptionRegisterCallback(CustomExceptionDelegate customCallback);
    
        static void SetPendingCustomException(string message) {
          SWIGPendingException.Set(new CustomApplicationException(message));
        }
    
        static CustomExceptionHelper() {
          CustomExceptionRegisterCallback(customDelegate);
        }
      }
      static CustomExceptionHelper exceptionHelper = new CustomExceptionHelper();
    %}
    

    The method stored in the C# delegate instance, customDelegate is what gets called by the C/C++ callback. However, the equivalent to the C# delegate, that is the C/C++ callback, needs to be assigned before any unmanaged code is executed. This is achieved by putting the initialisation code in the intermediary class. Recall that the intermediary class contains all the PInvoke methods, so the static variables in the intermediary class will be initialised before any of the PInvoke methods in this class are called. The exceptionHelper static variable ensures the C/C++ callback is initialised with the value in customDelegate by calling the CustomExceptionRegisterCallback method in the CustomExceptionHelper static constructor. Once this has been done, unmanaged code can make callbacks into the managed world as customExceptionCallback will be initialised with a valid callback/delegate. Any calls to SWIG_CSharpSetPendingExceptionCustom() will make the callback to create the pending exception in the same way that SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() does. In fact the method has been similarly named so that SWIG can issue the warning about missing canthrow attributes as discussed earlier. It is an invaluable warning as it is easy to forget the canthrow attribute when writing typemaps/features.

    The SWIGPendingException helper class is not shown, but is generated as an inner class into the intermediary class. It stores the pending exception in Thread Local Storage so that the exception handling mechanism is thread safe.

    The boiler plate code above must be used in addition to a handcrafted CustomApplicationException:

    // Custom C# Exception
    class CustomApplicationException : global::System.ApplicationException {
      public CustomApplicationException(string message) 
        : base(message) {
      }
    }
    

    and the SWIG interface code:

    %typemap(throws, canthrow=1) std::out_of_range {
      SWIG_CSharpSetPendingExceptionCustom($1.what());
      return $null;
    }
    
    %inline %{
    void oddsonly(int input) throw (std::out_of_range) {
      if (input%2 != 1)
        throw std::out_of_range("number is not odd");
    }
    %}
    

    The "throws" typemap now simply calls our new SWIG_CSharpSetPendingExceptionCustom() function so that the exception can be caught, as such:

    try {
      example.oddsonly(2);
    } catch (CustomApplicationException e) {
      ...
    }
    

    22.6 C# Directors

    The SWIG directors feature adds extra code to the generated C# proxy classes that enable these classes to be used in cross-language polymorphism. Essentially, it enables unmanaged C++ code to call back into managed code for virtual methods so that a C# class can derive from a wrapped C++ class.

    The following sections provide information on the C# director implementation and contain most of the information required to use the C# directors. However, the Java directors section should also be read in order to gain more insight into directors.

    22.6.1 Directors example

    Imagine we are wrapping a C++ base class, Base, from which we would like to inherit in C#. Such a class is shown below as well as another class, Caller, which calls the virtual method UIntMethod from pure unmanaged C++ code.

    // file: example.h
    class Base {
    public:
      virtual ~Base() {}
    
      virtual unsigned int UIntMethod(unsigned int x) {
        std::cout << "Base - UIntMethod(" << x << ")" << std::endl;
        return x;
      }
      virtual void BaseBoolMethod(const Base &b, bool flag) {}
    };
    
    class Caller {
    public:
      Caller(): m_base(0) {}
      ~Caller() { delBase(); }
      void set(Base *b) { delBase(); m_base = b; }
      void reset() { m_base = 0; }
      unsigned int UIntMethodCall(unsigned int x) { return m_base->UIntMethod(x); }
    
    private:
      Base *m_base;
      void delBase() { delete m_base; m_base = 0; }
    };
    

    The director feature is turned off by default and the following simple interface file shows how directors are enabled for the class Base.

    /* File : example.i */
    %module(directors="1") example
    %{
    #include "example.h"
    %}
    
    %feature("director") Base;
    
    %include "example.h"
    

    The following is a C# class inheriting from Base:

    public class CSharpDerived : Base
    {
      public override uint UIntMethod(uint x)
      {
        Console.WriteLine("CSharpDerived - UIntMethod({0})", x);
        return x;
      }
    }
    

    The Caller class can demonstrate the UIntMethod method being called from unmanaged code using the following C# code:

    public class runme
    {
      static void Main() 
      {
        Caller myCaller = new Caller();
    
        // Test pure C++ class
        using (Base myBase = new Base())
        {
          makeCalls(myCaller, myBase);
        }
    
        // Test director / C# derived class
        using (Base myBase = new CSharpDerived())
        {
          makeCalls(myCaller, myBase);
        }
      }
    
      static void makeCalls(Caller myCaller, Base myBase)
      {
        myCaller.set(myBase);
        myCaller.UIntMethodCall(123);
        myCaller.reset();
      }
    }
    

    If the above is run, the output is then:

    Base - UIntMethod(123)
    CSharpDerived - UIntMethod(123)
    

    22.6.2 Directors implementation

    The previous section demonstrated a simple example where the virtual UIntMethod method was called from C++ code, even when the overridden method is implemented in C#. The intention of this section is to gain an insight into how the director feature works. It shows the generated code for the two virtual methods, UIntMethod and BaseBoolMethod, when the director feature is enabled for the Base class.

    Below is the generated C# Base director class.

    public class Base : global::System.IDisposable {
      private global::System.Runtime.InteropServices.HandleRef swigCPtr;
      protected bool swigCMemOwn;
    
      internal Base(global::System.IntPtr cPtr, bool cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
      }
    
      internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Base obj) {
        return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
      }
    
      ~Base() {
        Dispose();
      }
    
      public virtual void Dispose() {
        lock(this) {
          if(swigCPtr.Handle != global::System.IntPtr.Zero && swigCMemOwn) {
            swigCMemOwn = false;
            examplePINVOKE.delete_Base(swigCPtr);
          }
          swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
          global::System.GC.SuppressFinalize(this);
        }
      }
    
      public virtual uint UIntMethod(uint x) {
        uint ret = examplePINVOKE.Base_UIntMethod(swigCPtr, x);
        return ret;
      }
    
      public virtual void BaseBoolMethod(Base b, bool flag) {
        examplePINVOKE.Base_BaseBoolMethod(swigCPtr, Base.getCPtr(b), flag);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
      public Base() : this(examplePINVOKE.new_Base(), true) {
        SwigDirectorConnect();
      }
    
      private void SwigDirectorConnect() {
        if (SwigDerivedClassHasMethod("UIntMethod", swigMethodTypes0))
          swigDelegate0 = new SwigDelegateBase_0(SwigDirectorMethodUIntMethod);
        if (SwigDerivedClassHasMethod("BaseBoolMethod", swigMethodTypes1))
          swigDelegate1 = new SwigDelegateBase_1(SwigDirectorMethodBaseBoolMethod);
        examplePINVOKE.Base_director_connect(swigCPtr, swigDelegate0, swigDelegate1);
      }
    
      private bool SwigDerivedClassHasMethod(string methodName, global::System.global::System.Type[] methodTypes) {
        System.Reflection.MethodInfo methodInfo = this.GetType().GetMethod(methodName, methodTypes);
        bool hasDerivedMethod = methodInfo.DeclaringType.IsSubclassOf(typeof(Base));
        return hasDerivedMethod;
      }
    
      private uint SwigDirectorMethodUIntMethod(uint x) {
        return UIntMethod(x);
      }
    
      private void SwigDirectorMethodBaseBoolMethod(global::System.IntPtr b, bool flag) {
        BaseBoolMethod(new Base(b, false), flag);
      }
    
      public delegate uint SwigDelegateBase_0(uint x);
      public delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    
      private SwigDelegateBase_0 swigDelegate0;
      private SwigDelegateBase_1 swigDelegate1;
    
      private static global::System.Type[] swigMethodTypes0 = new global::System.Type[] { typeof(uint) };
      private static global::System.Type[] swigMethodTypes1 = new global::System.Type[] { typeof(Base), typeof(bool) };
    }
    

    Everything from the SwigDirectorConnect() method and below is code that is only generated when directors are enabled. The design comprises a C# delegate being initialised for each virtual method on construction of the class. Let's examine the BaseBoolMethod.

    In the Base constructor a call is made to SwigDirectorConnect() which contains the initialisation code for all the virtual methods. It uses a support method, SwigDerivedClassHasMethod(), which simply uses reflection to determine if the named method, BaseBoolMethod, with the list of required parameter types, exists in a subclass. If it does not exist, the delegate is not initialised as there is no need for unmanaged code to call back into managed C# code. However, if there is an overridden method in any subclass, the delegate is required. It is then initialised to the SwigDirectorMethodBaseBoolMethod which in turn will call BaseBoolMethod if invoked. The delegate is not initialised to the BaseBoolMethod directly as quite often types will need marshalling from the unmanaged type to the managed type in which case an intermediary method (SwigDirectorMethodBaseBoolMethod) is required for the marshalling. In this case, the C# Base class needs to be created from the unmanaged IntPtr type.

    The last thing that SwigDirectorConnect() does is to pass the delegates to the unmanaged code. It calls the intermediary method Base_director_connect() which is really a call to the C function CSharp_Base_director_connect(). This method simply maps each C# delegate onto a C function pointer.

    SWIGEXPORT void SWIGSTDCALL CSharp_Base_director_connect(void *objarg, 
                                            SwigDirector_Base::SWIG_Callback0_t callback0,
                                            SwigDirector_Base::SWIG_Callback1_t callback1) {
      Base *obj = (Base *)objarg;
      SwigDirector_Base *director = dynamic_cast<SwigDirector_Base *>(obj);
      if (director) {
        director->swig_connect_director(callback0, callback1);
      }
    }
    
    class SwigDirector_Base : public Base, public Swig::Director {
    public:
      SwigDirector_Base();
      virtual unsigned int UIntMethod(unsigned int x);
      virtual ~SwigDirector_Base();
      virtual void BaseBoolMethod(Base const &b, bool flag);
    
      typedef unsigned int (SWIGSTDCALL* SWIG_Callback0_t)(unsigned int);
      typedef void (SWIGSTDCALL* SWIG_Callback1_t)(void *, unsigned int);
      void swig_connect_director(SWIG_Callback0_t callbackUIntMethod,
                                 SWIG_Callback1_t callbackBaseBoolMethod);
    
    private:
      SWIG_Callback0_t swig_callbackUIntMethod;
      SWIG_Callback1_t swig_callbackBaseBoolMethod;
      void swig_init_callbacks();
    };
    
    void SwigDirector_Base::swig_connect_director(SWIG_Callback0_t callbackUIntMethod, 
                                                  SWIG_Callback1_t callbackBaseBoolMethod) {
      swig_callbackUIntMethod = callbackUIntMethod;
      swig_callbackBaseBoolMethod = callbackBaseBoolMethod;
    }
    

    Note that for each director class SWIG creates an unmanaged director class for making the callbacks. For example Base has SwigDirector_Base and SwigDirector_Base is derived from Base. Should a C# class be derived from Base, the underlying C++ SwigDirector_Base is created rather than Base. The SwigDirector_Base class then implements all the virtual methods, redirecting calls up to managed code if the callback/delegate is non-zero. The implementation of SwigDirector_Base::BaseBoolMethod shows this - the callback is made by invoking the swig_callbackBaseBoolMethod function pointer:

    void SwigDirector_Base::BaseBoolMethod(Base const &b, bool flag) {
      void * jb = 0 ;
      unsigned int jflag  ;
      
      if (!swig_callbackBaseBoolMethod) {
        Base::BaseBoolMethod(b, flag);
        return;
      } else {
        jb = (Base *) &b; 
        jflag = flag;
        swig_callbackBaseBoolMethod(jb, jflag);
      }
    }
    

    The delegates from the above example are public by default:

      public delegate uint SwigDelegateBase_0(uint x);
      public delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    

    These can be changed if desired via the csdirectordelegatemodifiers %feature directive. For example, using %feature("csdirectordelegatemodifiers") "internal" before SWIG parses the Base class will change all the delegates to internal:

      internal delegate uint SwigDelegateBase_0(uint x);
      internal delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    

    22.6.3 Director caveats

    There is a subtle gotcha with directors. If default parameters are used, it is recommended to follow a pattern of always calling a single method in any C# derived class. An example will clarify this and the reasoning behind the recommendation. Consider the following C++ class wrapped as a director class:

    class Defaults {
    public:
      virtual ~Defaults();
      virtual void DefaultMethod(int a=-100);
    };
    

    Recall that C++ methods with default parameters generate overloaded methods for each defaulted parameter, so a C# derived class can be created with two DefaultMethod override methods:

    public class CSharpDefaults : Defaults
    {
      public override void DefaultMethod()
      {
        DefaultMethod(-100); // note C++ default value used
      }
      public override void DefaultMethod(int x)
      {
      }
    }
    

    It may not be clear at first, but should a user intend to call CSharpDefaults.DefaultMethod() from C++, a call is actually made to CSharpDefaults.DefaultMethod(int). This is because the initial call is made in C++ and therefore the DefaultMethod(int) method will be called as is expected with C++ calls to methods with defaults, with the default being set to -100. The callback/delegate matching this method is of course the overloaded method DefaultMethod(int). However, a call from C# to CSharpDefaults.DefaultMethod() will of course call this exact method and in order for behaviour to be consistent with calls from C++, the implementation should pass the call on to CSharpDefaults.DefaultMethod(int)using the C++ default value, as shown above.

    22.7 Multiple modules

    When using multiple modules it is possible to compile each SWIG generated wrapper into a different assembly. However, by default the generated code may not compile if generated classes in one assembly use generated classes in another assembly. The visibility of the getCPtr() and pointer constructor generated from the csbody typemaps needs changing. The default visibility is internal but it needs to be public for access from a different assembly. Just changing 'internal' to 'public' in the typemap achieves this. Two macros are available in csharp.swg to make this easier and using them is the preferred approach over simply copying the typemaps and modifying as this is forward compatible with any changes in the csbody typemap in future versions of SWIG. The macros are for the proxy and typewrapper classes and can respectively be used to to make the method and constructor public:

      SWIG_CSBODY_PROXY(public, public, SWIGTYPE)
      SWIG_CSBODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    

    Alternatively, instead of exposing these as public, consider using the [assembly:InternalsVisibleTo("Name")] attribute available in the .NET framework when you know which assemblies these can be exposed to. Another approach would be to make these public, but also to hide them from intellisense by using the [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] attribute if you don't want users to easily stumble upon these so called 'internal workings' of the wrappers.

    22.8 C# Typemap examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "csharp.swg" and "typemaps.i" in the SWIG library.

    22.8.1 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable. The example is a direct equivalent to this Java equivalent.

    Consider the following C++ code:

    struct Wheel {
      int size;
      Wheel(int sz = 0) : size(sz) {}
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from C# after running the code through SWIG:

      Wheel wheel = new Bike(10).getWheel();
      Console.WriteLine("wheel size: " + wheel.size);
      // Simulate a garbage collection
      global::System.GC.Collect();
      global::System.GC.WaitForPendingFinalizers();
      global::System.Console.WriteLine("wheel size: " + wheel.size);
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance a reference to the Bike must be added to the wheel instance. You can do this by adding the reference when the getWheel() method is called using the following typemaps.

    %typemap(cscode) Wheel %{
      // Ensure that the GC doesn't collect any Bike instance set from C#
      private Bike bikeReference;
      internal void addReference(Bike bike) {
        bikeReference = bike;
      }
    %}
    
    // Add a C# reference to prevent premature garbage collection and resulting use
    // of dangling C++ pointer. Intended for methods that return pointers or
    // references to a member variable.
    %typemap(csout, excode=SWIGEXCODE) Wheel& getWheel {
        global::System.IntPtr cPtr = $imcall;$excode
        $csclassname ret = null;
        if (cPtr != global::System.IntPtr.Zero) {
          ret = new $csclassname(cPtr, $owner);
          ret.addReference(this);
        }
        return ret;
      }
    

    The code in the first typemap gets added to the Wheel proxy class. The code in the second typemap constitutes the bulk of the code in the generated getWheel() function:

    public class Wheel : global::System.IDisposable {
      ...
      // Ensure that the GC doesn't collect any Bike instance set from C#
      private Bike bikeReference;
      internal void addReference(Bike bike) {
        bikeReference = bike;
      }
    }
    
    public class Bike : global::System.IDisposable {
      ...
      public Wheel getWheel() {
        global::System.IntPtr cPtr = examplePINVOKE.Bike_getWheel(swigCPtr);
        Wheel ret = null;
        if (cPtr != global::System.IntPtr.Zero) {
          ret = new Wheel(cPtr, false);
          ret.addReference(this);
        }
        return ret;
      }
    }
    

    Note the addReference call.

    22.8.2 Memory management for objects passed to the C++ layer

    The example is a direct equivalent to this Java equivalent. Managing memory can be tricky when using C++ and C# proxy classes. The previous example shows one such case and this example looks at memory management for a class passed to a C++ method which expects the object to remain in scope after the function has returned. Consider the following two C++ classes:

    struct Element {
      int value;
      Element(int val) : value(val) {}
    };
    class Container {
      Element* element;
    public:
      Container() : element(0) {}
      void setElement(Element* e) { element = e; }
      Element* getElement() { return element; }
    };
    

    and usage from C++

      Container container;
      Element element(20);
      container.setElement(&element);
      cout << "element.value: " << container.getElement()->value << endl;
    

    and more or less equivalent usage from C#

      Container container = new Container();
      Element element = new Element(20);
      container.setElement(element);
    

    The C++ code will always print out 20, but the value printed out may not be this in the C# equivalent code. In order to understand why, consider a garbage collection occurring...

      Container container = new Container();
      Element element = new Element(20);
      container.setElement(element);
      Console.WriteLine("element.value: " + container.getElement().value);
      // Simulate a garbage collection
      global::System.GC.Collect();
      global::System.GC.WaitForPendingFinalizers();
      global::System.Console.WriteLine("element.value: " + container.getElement().value);
    

    The temporary element created with new Element(20) could get garbage collected which ultimately means the container variable is holding a dangling pointer, thereby printing out any old random value instead of the expected value of 20. One solution is to add in the appropriate references in the C# layer...

    public class Container : global::System.IDisposable {
    
      ...
    
      // Ensure that the GC doesn't collect any Element set from C#
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    
      public void setElement(Element e) {
        examplePINVOKE.Container_setElement(swigCPtr, Element.getCPtr(e));
        elementReference = e;
      }
    }
    

    The following typemaps can be used to generate this code:

    %typemap(cscode) Container %{
      // Ensure that the GC doesn't collect any Element set from C#
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    %}
    
    %typemap(csin,
             post="      elementReference = $csinput;"
             ) Element *e "Element.getCPtr($csinput)"
    

    The 'cscode' typemap simply adds in the specified code into the C# proxy class. The 'csin' typemap matches the input parameter type and name for the setElement method and the 'post' typemap attribute allows adding code after the PInvoke call. The 'post' code is generated into a finally block after the PInvoke call so the resulting code isn't quite as mentioned earlier, setElement is actually:

      public void setElement(Element e) {
        try {
          examplePINVOKE.Container_setElement(swigCPtr, Element.getCPtr(e));
        } finally {
          elementReference = e;
        }
      }
    

    22.8.3 Date marshalling using the csin typemap and associated attributes

    The NaN Exception example is a simple example of the "javain" typemap and its 'pre' attribute. This example demonstrates how a C++ date class, say CDate, can be mapped onto the standard .NET date class, System.DateTime by using the 'pre', 'post' and 'pgcppname' attributes of the "csin" typemap (the C# equivalent to the "javain" typemap). The example is an equivalent to the Java Date marshalling example. The idea is that the System.DateTime is used wherever the C++ API uses a CDate. Let's assume the code being wrapped is as follows:

    class CDate {
    public:
      CDate();
      CDate(int year, int month, int day);
      int getYear();
      int getMonth();
      int getDay();
      ...
    };
    struct Action {
      static int doSomething(const CDate &dateIn, CDate &dateOut);
      Action(const CDate &date, CDate &dateOut);
    };
    

    Note that dateIn is const and therefore read only and dateOut is a non-const output type.

    First let's look at the code that is generated by default, where the C# proxy class CDate is used in the proxy interface:

    public class Action : global::System.IDisposable {
      ...
      public Action(CDate dateIn, CDate dateOut) 
          : this(examplePINVOKE.new_Action(CDate.getCPtr(dateIn), CDate.getCPtr(dateOut)), true) {
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
      public int doSomething(CDate dateIn, CDate dateOut) {
        int ret = examplePINVOKE.Action_doSomething(swigCPtr, 
                                                    CDate.getCPtr(dateIn), 
                                                    CDate.getCPtr(dateOut));
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
        return ret;
      }
    }
    

    The CDate & and const CDate & C# code is generated from the following two default typemaps:

    %typemap(cstype) SWIGTYPE & "$csclassname"
    %typemap(csin) SWIGTYPE & "$csclassname.getCPtr($csinput)"
    

    where '$csclassname' is translated into the proxy class name, CDate and '$csinput' is translated into the name of the parameter, eg dateIn. From C#, the intention is then to call into a modified API with something like:

    System.DateTime dateIn = new System.DateTime(2011, 4, 13);
    System.DateTime dateOut = new System.DateTime();
    
    // Note in calls below, dateIn remains unchanged and dateOut 
    // is set to a new value by the C++ call
    Action action = new Action(dateIn, out dateOut);
    dateIn = new System.DateTime(2012, 7, 14);
    

    To achieve this mapping, we need to alter the default code generation slightly so that at the C# layer, a System.DateTime is converted into a CDate. The intermediary layer will still take a pointer to the underlying CDate class. The typemaps to achieve this are shown below.

    %typemap(cstype) const CDate & "System.DateTime"
    %typemap(csin, 
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);"
            ) const CDate &
             "$csclassname.getCPtr(temp$csinput)"
    
    %typemap(cstype) CDate & "out System.DateTime"
    %typemap(csin, 
             pre="    CDate temp$csinput = new CDate();", 
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="out $csinput"
            ) CDate &
             "$csclassname.getCPtr(temp$csinput)"
    
    

    The resulting generated proxy code in the Action class follows:

    public class Action : global::System.IDisposable {
      ...
      public int doSomething(System.DateTime dateIn, out System.DateTime dateOut) {
        CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day);
        CDate tempdateOut = new CDate();
        try {
          int ret = examplePINVOKE.Action_doSomething(swigCPtr, 
                                                      CDate.getCPtr(tempdateIn), 
                                                      CDate.getCPtr(tempdateOut));
          if (examplePINVOKE.SWIGPendingException.Pending) 
            throw examplePINVOKE.SWIGPendingException.Retrieve();
          return ret;
        } finally {
          dateOut = new System.DateTime(tempdateOut.getYear(), 
                                        tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      static private global::System.IntPtr SwigConstructAction(System.DateTime dateIn, out System.DateTime dateOut) {
        CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day);
        CDate tempdateOut = new CDate();
        try {
          return examplePINVOKE.new_Action(CDate.getCPtr(tempdateIn), CDate.getCPtr(tempdateOut));
        } finally {
          dateOut = new System.DateTime(tempdateOut.getYear(), 
                                        tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      public Action(System.DateTime dateIn, out System.DateTime dateOut) 
          : this(Action.SwigConstructAction(dateIn, out dateOut), true) {
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    }
    

    A few things to note:

    • The "cstype" typemap has changed the parameter type to System.DateTime instead of the default generated CDate proxy.
    • The non-const CDate & type is marshalled as a reference parameter in C# as the date cannot be explicitly set once the object has been created, so a new object is created instead.
    • The code in the 'pre' attribute appears before the intermediary call (examplePINVOKE.new_Action / examplePINVOKE.Action_doSomething).
    • The code in the 'post' attribute appears after the intermediary call.
    • A try .. finally block is generated with the intermediary call in the try block and 'post' code in the finally block. The alternative of just using a temporary variable for the return value from the intermediary call and the 'post' code being inserted before the return statement is not possible given that the intermediary call and method return comes from a single source (the "csout" typemap).
    • The temporary variables in the "csin" typemaps are called temp$csin, where "$csin" is replaced with the parameter name. "$csin" is used to mangle the variable name so that more than one CDate & type can be used as a parameter in a method, otherwise two or more local variables with the same name would be generated.
    • The use of the "csin" typemap causes a constructor helper function (SwigConstructAction) to be generated. This allows C# code to be called before the intermediary call made in the constructor initialization list.
    • The 'cshin' attribute is required for the SwigConstructAction constructor helper function so that the 2nd parameter is declared as out dateOut instead of just dateOut.

    So far we have considered the date as an input only and an output only type. Now let's consider CDate * used as an input/output type. Consider the following C++ function which modifies the date passed in:

    void addYears(CDate *pDate, int years) {
      *pDate = CDate(pDate->getYear() + years, pDate->getMonth(), pDate->getDay());
    }
    

    If usage of CDate * commonly follows this input/output pattern, usage from C# like the following

    System.DateTime christmasEve = new System.DateTime(2000, 12, 24);
    example.addYears(ref christmasEve, 10); // christmasEve now contains 2010-12-24
    

    will be possible with the following CDate * typemaps

    %typemap(cstype, out="System.DateTime") CDate * "ref System.DateTime"
    
    %typemap(csin,
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);",
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="ref $csinput"
            ) CDate *
             "$csclassname.getCPtr(temp$csinput)"
    

    Globals are wrapped by the module class and for a module called example, the typemaps result in the following code:

    public class example {
      public static void addYears(ref System.DateTime pDate, int years) {
        CDate temppDate = new CDate(pDate.Year, pDate.Month, pDate.Day);
        try {
          examplePINVOKE.addYears(CDate.getCPtr(temppDate), years);
        } finally {
          pDate = new System.DateTime(temppDate.getYear(), temppDate.getMonth(), temppDate.getDay(),
                                      0, 0, 0);
        }
      }
      ...
    }
    

    The following typemap is the same as the previous but demonstrates how a using block can be used for the temporary variable. The only change to the previous typemap is the introduction of the 'terminator' attribute to terminate the using block. The subtractYears method is nearly identical to the above addYears method.

    %typemap(csin,
      pre="    using (CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day)) {",
      post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
           " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
      terminator="    } // terminate temp$csinput using block",
      cshin="ref $csinput"
     ) CDate *
      "$csclassname.getCPtr(temp$csinput)"
    
    void subtractYears(CDate *pDate, int years) {
      *pDate = CDate(pDate->getYear() - years, pDate->getMonth(), pDate->getDay());
    }
    

    The resulting generated code shows the termination of the using block:

    public class example {
      public static void subtractYears(ref System.DateTime pDate, int years) {
        using (CDate temppDate = new CDate(pDate.Year, pDate.Month, pDate.Day)) {
        try {
          examplePINVOKE.subtractYears(CDate.getCPtr(temppDate), years);
        } finally {
          pDate = new System.DateTime(temppDate.getYear(), temppDate.getMonth(), temppDate.getDay(),
                                      0, 0, 0);
        }
        } // terminate temppDate using block
      }
      ...
    }
    

    22.8.4 A date example demonstrating marshalling of C# properties

    The previous section looked at converting a C++ date class to System.DateTime for parameters. This section extends this idea so that the correct marshalling is obtained when wrapping C++ variables. Consider the same CDate class from the previous section and a global variable:

    CDate ImportantDate = CDate(1999, 12, 31);
    

    The aim is to use System.DateTime from C# when accessing this date as shown in the following usage where the module name is 'example':

    example.ImportantDate = new System.DateTime(2000, 11, 22);
    System.DateTime importantDate = example.ImportantDate;
    Console.WriteLine("Important date: " + importantDate);
    

    When SWIG wraps a variable that is a class/struct/union, it is wrapped using a pointer to the type for the reasons given in Structure data members. The typemap type required is thus CDate *. Given that the previous section already designed CDate * typemaps, we'll use those same typemaps plus the 'csvarin' and 'csvarout' typemaps.

    %typemap(cstype, out="System.DateTime") CDate * "ref System.DateTime"
    
    %typemap(csin,
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);",
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="ref $csinput"
            ) CDate *
             "$csclassname.getCPtr(temp$csinput)"
    
    %typemap(csvarin, excode=SWIGEXCODE2) CDate * %{
        /* csvarin typemap code */
        set {
          CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);
          $imcall;$excode
        } %}
    
    %typemap(csvarout, excode=SWIGEXCODE2) CDate * %{
        /* csvarout typemap code */
        get {
          global::System.IntPtr cPtr = $imcall;
          CDate tempDate = (cPtr == global::System.IntPtr.Zero) ? null : new CDate(cPtr, $owner);$excode
          return new System.DateTime(tempDate.getYear(), tempDate.getMonth(), tempDate.getDay(),
                                     0, 0, 0);
        } %}
    

    For a module called example, the typemaps result in the following code:

    public class example {
      public static System.DateTime ImportantDate {
        /* csvarin typemap code */
        set {
          CDate tempvalue = new CDate(value.Year, value.Month, value.Day);
          examplePINVOKE.ImportantDate_set(CDate.getCPtr(tempvalue));
        } 
        /* csvarout typemap code */
        get {
          global::System.IntPtr cPtr = examplePINVOKE.ImportantDate_get();
          CDate tempDate = (cPtr == global::System.IntPtr.Zero) ? null : new CDate(cPtr, false);
          return new System.DateTime(tempDate.getYear(), tempDate.getMonth(), tempDate.getDay(),
                                     0, 0, 0);
        } 
      }
      ...
    }
    

    Some points to note:

    • The property set comes from the 'csvarin' typemap and the property get comes from the 'csvarout' typemap.
    • The type used for the property comes from the 'cstype' typemap. This particular example has the 'out' attribute set in the typemap and as it is specified, it is used in preference to the type in the typemap body. This is because the type in the 'out' attribute can never include modifiers such as 'ref', thereby avoiding code such as public static ref System.DateTime ImportantDate { ..., which would of course not compile.
    • The $excode special variable expands to nothing as there are no exception handlers specified in any of the unmanaged code typemaps (in fact the marshalling was done using the default unmanaged code typemaps.)
    • The $imcall typemap expands to the appropriate intermediary method call in the examplePINVOKE class.
    • The $csinput special variable in the 'csin' typemap always expands to value for properties. In this case $csclassname.getCPtr(temp$csinput) expands to CDate.getCPtr(tempvalue).
    • The 'csin' typemap has 'pre', 'post' and 'cshin' attributes, and these are all ignored in the property set. The code in these attributes must instead be replicated within the 'csvarin' typemap. The line creating the temp$csinput variable is such an example; it is identical to what is in the 'pre' attribute.

    22.8.5 Date example demonstrating the 'pre' and 'post' typemap attributes for directors

    The 'pre' and 'post' attributes in the "csdirectorin" typemap act like the attributes of the same name in the "csin" typemap. For example if we modify the Date marshalling example like this:

    class CDate {
      ...
      void setYear(int);
      void setMonth(int);
      void setDay(int);
    };
    struct Action {
      virtual void someCallback(CDate &date);
      virtual ~Action();
      ...
    };
    

    and declare %feature ("director") for the Action class, we would have to define additional marshalling rules for CDate & parameter. The typemap may look like this:

    %typemap(csdirectorin,
             pre="System.DateTime temp$iminput = new System.DateTime();",
             post="CDate temp2$iminput = new CDate($iminput, false);\n"
                  "temp2$iminput.setYear(tempdate.Year);\n"
                  "temp2$iminput.setMonth(tempdate.Month);\n"
                  "temp2$iminput.setDay(tempdate.Day);"
             ) CDate &date "out temp$iminput"
    

    The generated proxy class code will then contain the following wrapper for calling user-overloaded someCallback():

    ...
      private void SwigDirectorMethodsomeCallback(global::System.IntPtr date) {
        System.DateTime tempdate = new System.DateTime();
        try {
          someCallback(out tempdate);
        } finally {
          // we create a managed wrapper around the existing C reference, just for convenience
          CDate temp2date = new CDate(date, false);
          temp2date.setYear(tempdate.Year);
          temp2date.setMonth(tempdate.Month);
          temp2date.setDay(tempdate.Day);
        }
      }
    ...
    

    Pay special attention to the memory management issues, using these attributes.

    22.8.6 Turning proxy classes into partial classes

    C# supports the notion of partial classes whereby a class definition can be split into more than one file. It is possible to turn the wrapped C++ class into a partial C# class using the csclassmodifiers typemap. Consider a C++ class called ExtendMe:

    class ExtendMe {
    public:
      int Part1() { return 1; }
    };
    

    The default C# proxy class generated is:

    public class ExtendMe : global::System.IDisposable {
      ...
      public int Part1() {
        ...
      }
    }
    

    The default csclassmodifiers typemap shipped with SWIG is

    %typemap(csclassmodifiers) SWIGTYPE "public class"
    

    Note that the type used is the special catch all type SWIGTYPE. If instead we use the following typemap to override this for just the ExtendMe class:

    %typemap(csclassmodifiers) ExtendMe "public partial class"
    

    The C# proxy class becomes a partial class:

    public partial class ExtendMe : global::System.IDisposable {
      ...
      public int Part1() {
        ...
      }
    }
    

    You can then of course declare another part of the partial class elsewhere, for example:

    public partial class ExtendMe : global::System.IDisposable {
      public int Part2() {
        return 2;
      }
    }
    

    and compile the following code:

    ExtendMe em = new ExtendMe();
    Console.WriteLine("part1: {0}", em.Part1());
    Console.WriteLine("part2: {0}", em.Part2());
    

    demonstrating that the class contains methods calling both unmanaged code - Part1() and managed code - Part2(). The following example is an alternative approach to adding managed code to the generated proxy class.

    22.8.7 Turning proxy classes into sealed classes

    The technique in the previous section can be used to make the proxy class a sealed class. Consider a C++ class NotABaseClass that you don't want to be derived from in C#:

    struct NotABaseClass {
      NotABaseClass();
      ~NotABaseClass();
    };
    

    The default C# proxy class method generated with Dispose method is:

    public class NotABaseClass : global::System.IDisposable {
      ...
      public virtual void Dispose() {
        ...
      }
    }
    

    The csclassmodifiers typemap can be used to modify the class modifiers and the csmethodmodifiers feature can be used on the destructor to modify the proxy's Dispose method:

    %typemap(csclassmodifiers) NotABaseClass "public sealed class"
    %csmethodmodifiers NotABaseClass::~NotABaseClass "public /*virtual*/";
    

    The relevant generated code is thus:

    public sealed class NotABaseClass : global::System.IDisposable {
      ...
      public /*virtual*/ void Dispose() {
        ...
      }
    }
    

    Any attempt to derive from the NotABaseClass in C# will result in a C# compiler error, for example:

    public class Derived : NotABaseClass {
    };
    
    runme.cs(6,14): error CS0509: `Derived': cannot derive from sealed type `NotABaseClass'
    

    Finally, if you get a warning about use of 'protected' in the generated base class:

    NotABaseClass.cs(14,18): warning CS0628: `NotABaseClass.swigCMemOwn': new protected member declared in sealed class
    

    Either suppress the warning or modify the generated code by copying and tweaking the default 'csbody' typemap code in csharp.swg by modifying swigCMemOwn to not be protected.

    22.8.8 Extending proxy classes with additional C# code

    The previous example showed how to use partial classes to add functionality to a generated C# proxy class. It is also possible to extend a wrapped struct/class with C/C++ code by using the %extend directive. A third approach is to add some C# methods into the generated proxy class with the cscode typemap. If we declare the following typemap before SWIG parses the ExtendMe class used in the previous example

    %typemap(cscode) ExtendMe %{
      public int Part3() {
        return 3;
      }
    %}
    
    

    The generated C# proxy class will instead be:

    public class ExtendMe : global::System.IDisposable {
      ...
      public int Part3() {
        return 3;
      }
      public int Part1() {
        ...
      }
    }
    

    22.8.9 Underlying type for enums

    C# enums use int as the underlying type for each enum item. If you wish to change the underlying type to something else, then use the csbase typemap. For example when your C++ code uses a value larger than int, this is necessary as the C# compiler will not compile values which are too large to fit into an int. Here is an example:

    %typemap(csbase) BigNumbers "uint"
    %inline %{
      enum BigNumbers { big=0x80000000, bigger };
    %}
    

    The generated enum will then use the given underlying type and compile correctly:

    public enum BigNumbers : uint {
      big = 0x80000000,
      bigger
    }
    
    swig-4.0.2/Doc/Manual/CPlusPlus11.html0000644000175000017500000012301613667507562017234 0ustar williamwilliam SWIG and C++11

    7 SWIG and C++11

    7.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++11 standard. This part of SWIG is still a work in progress.

    SWIG supports the new C++ syntax changes with some minor limitations in some areas such as decltype expressions and variadic templates. Wrappers for the new STL types (unordered_ containers, result_of, tuples) are incomplete. The wrappers for the new containers would work much like the C++03 containers and users are welcome to help by adapting the existing container interface files and submitting them as a patch for inclusion in future versions of SWIG.

    7.2 Core language changes

    7.2.1 Rvalue reference and move semantics

    SWIG correctly parses the rvalue reference syntax '&&', for example the typical usage of it in the move constructor and move assignment operator below:

    class MyClass {
    ...
      std::vector<int> numbers;
    public:
      MyClass(MyClass &&other) : numbers(std::move(other.numbers)) {}
      MyClass & operator=(MyClass &&other) {
        numbers = std::move(other.numbers);
        return *this;
      }
    };
    

    Rvalue references are designed for C++ temporaries and so are not very useful when used from non-C++ target languages. Generally you would just ignore them via %ignore before parsing the class. For example, ignore the move constructor:

    %ignore MyClass::MyClass(MyClass &&);
    

    The plan is to ignore move constructors by default in a future version of SWIG. Note that both normal assignment operators as well as move assignment operators are ignored by default in most target languages with the following warning:

    example.i:18: Warning 503: Can't wrap 'operator =' unless renamed to a valid identifier.
    

    7.2.2 Generalized constant expressions

    SWIG parses and identifies the keyword constexpr, but cannot fully utilise it. These C++ compile time constants are usable as runtime constants from the target languages. Below shows example usage for assigning a C++ compile time constant from a compile time constant function:

    constexpr int XXX() { return 10; }
    constexpr int YYY = XXX() + 100;
    

    When either of these is used from a target language, a runtime call is made to obtain the underlying constant.

    7.2.3 Extern template

    SWIG correctly parses the keywords extern template. However, this template instantiation suppression in a translation unit has no relevance outside of the C++ compiler and so is not used by SWIG. SWIG only uses %template for instantiating and wrapping templates.

    template class std::vector<int>;        // C++03 explicit instantiation in C++
    extern template class std::vector<int>; // C++11 explicit instantiation suppression in C++
    %template(VectorInt) std::vector<int>;  // SWIG instantiation
    

    7.2.4 Initializer lists

    Initializer lists are very much a C++ compiler construct and are not very accessible from wrappers as they are intended for compile time initialization of classes using the special std::initializer_list type. SWIG detects usage of initializer lists and will emit a special informative warning each time one is used:

    example.i:33: Warning 476: Initialization using std::initializer_list.
    

    Initializer lists usually appear in constructors but can appear in any function or method. They often appear in constructors which are overloaded with alternative approaches to initializing a class, such as the std container's push_back method for adding elements to a container. The recommended approach then is to simply ignore the initializer-list constructor, for example:

    %ignore Container::Container(std::initializer_list<int>);
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    Alternatively you could modify the class and add another constructor for initialization by some other means, for example by a std::vector:

    %include <std_vector.i>
    class Container {
    public:
      Container(const std::vector<int> &);
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    And then call this constructor from your target language, for example, in Python, the following will call the constructor taking the std::vector:

    >>> c = Container( [1, 2, 3, 4] )
    

    If you are unable to modify the class being wrapped, consider ignoring the initializer-list constructor and using %extend to add in an alternative constructor:

    %include <std_vector.i>
    %extend Container {
      Container(const std::vector<int> &elements) {
        Container *c = new Container();
        for (int element : elements)
          c->push_back(element);
        return c;
      }
    }
    
    %ignore Container::Container(std::initializer_list<int>);
    
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    The above makes the wrappers look is as if the class had been declared as follows:

    %include <std_vector.i>
    class Container {
    public:
      Container(const std::vector<int> &);
    //  Container(std::initializer_list<int>); // initializer-list constructor (ignored)
      Container();
      void push_back(const int &);
      ...
    };
    

    std::initializer_list is simply a container that can only be initialized at compile time. As it is just a C++ type, it is possible to write typemaps for a target language container to map onto std::initializer_list. However, this can only be done for a fixed number of elements as initializer lists are not designed to be constructed with a variable number of arguments at runtime. The example below is a very simple approach which ignores any parameters passed in and merely initializes with a fixed list of fixed integer values chosen at compile time:

    %typemap(in) std::initializer_list<int> {
      $1 = {10, 20, 30, 40, 50};
    }
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    Any attempt at passing in values from the target language will be ignored and be replaced by {10, 20, 30, 40, 50}. Needless to say, this approach is very limited, but could be improved upon, but only slightly. A typemap could be written to map a fixed number of elements on to the std::initializer_list, but with values decided at runtime. The typemaps would be target language specific.

    Note that the default typemap for std::initializer_list does nothing but issue the warning and hence any user supplied typemaps will override it and suppress the warning.

    7.2.5 Uniform initialization

    The curly brackets {} for member initialization are fully supported by SWIG:

    struct BasicStruct {
     int x;
     double y;
    };
     
    struct AltStruct {
      AltStruct(int x, double y) : x_{x}, y_{y} {}
     
      int x_;
      double y_;
    };
    
    BasicStruct var1{5, 3.2}; // only fills the struct components
    AltStruct var2{2, 4.3};   // calls the constructor
    

    Uniform initialization does not affect usage from the target language, for example in Python:

    >>> a = AltStruct(10, 142.15)
    >>> a.x_
    10
    >>> a.y_
    142.15
    

    7.2.6 Type inference

    SWIG supports decltype() with some limitations. Single variables are allowed, however, expressions are not supported yet. For example, the following code will work:

    int i;
    decltype(i) j;
    

    However, using an expression inside the decltype results in syntax error:

    int i; int j;
    decltype(i+j) k;  // syntax error
    

    7.2.7 Range-based for-loop

    This feature is part of the implementation block only. SWIG ignores it.

    7.2.8 Lambda functions and expressions

    SWIG correctly parses most of the Lambda functions syntax. For example:

    auto val = [] { return something; };
    auto sum = [](int x, int y) { return x+y; };
    auto sum = [](int x, int y) -> int { return x+y; };
    

    The lambda functions are removed from the wrappers for now, because of the lack of support for closures (scope of the lambda functions) in the target languages.

    Lambda functions used to create variables can also be parsed, but due to limited support of auto when the type is deduced from the expression, the variables are simply ignored.

    auto six = [](int x, int y) { return x+y; }(4, 2);
    

    Better support should be available in a later release.

    7.2.9 Alternate function syntax

    SWIG fully supports the new definition of functions. For example:

    struct SomeStruct {
      int FuncName(int x, int y);
    };
    

    can now be written as in C++11:

    struct SomeStruct {
      auto FuncName(int x, int y) -> int;
    };
     
    auto SomeStruct::FuncName(int x, int y) -> int {
      return x + y;
    }
    

    The usage in the target languages remains the same, for example in Python:

    >>> a = SomeStruct()
    >>> a.FuncName(10, 5)
    15
    

    SWIG will also deal with type inference for the return type, as per the limitations described earlier. For example:

    auto square(float a, float b) -> decltype(a);
    

    7.2.10 Object construction improvement

    There are three parts to object construction improvement. The first improvement is constructor delegation such as the following:

    class A {
    public:
      int a;
      int b;
      int c;
    
      A() : A(10) {}
      A(int aa) : A(aa, 20) {}
      A(int aa, int bb) : A(aa, bb, 30) {}
      A(int aa, int bb, int cc) { a=aa; b=bb; c=cc; }
    };
    

    where peer constructors can be called. SWIG handles this without any issue.

    The second improvement is constructor inheritance via a using declaration. This is parsed correctly, but the additional constructors are not currently added to the derived proxy class in the target language. An example is shown below:

    class BaseClass {
    public:
      BaseClass(int iValue);
    };
    
    class DerivedClass: public BaseClass {
      public:
      using BaseClass::BaseClass; // Adds DerivedClass(int) constructor
    };
    

    The final part is member initialization at the site of the declaration. This kind of initialization is handled by SWIG.

    class SomeClass {
    public:
      SomeClass() {}
      explicit SomeClass(int new_value) : value(new_value) {}
    
      int value = 5;
    };
    

    7.2.11 Explicit overrides and final

    The special identifiers final and override can be used on methods and destructors, such as in the following example:

    struct BaseStruct {
      virtual void ab() const = 0;
      virtual void cd();
      virtual void ef();
      virtual ~BaseStruct();
    };
    struct DerivedStruct : BaseStruct {
      virtual void ab() const override;
      virtual void cd() final;
      virtual void ef() final override;
      virtual ~DerivedStruct() override;
    };
    

    7.2.12 Null pointer constant

    The nullptr constant is mostly unimportant in wrappers. In the few places it has an effect, it is treated like NULL.

    7.2.13 Strongly typed enumerations

    SWIG supports strongly typed enumerations and parses the new enum class syntax and forward declarator for the enums, such as:

    enum class MyEnum : unsigned int;
    

    Strongly typed enums are often used to avoid name clashes such as the following:

    struct Color {
      enum class RainbowColors : unsigned int {
        Red, Orange, Yellow, Green, Blue, Indigo, Violet
      };
      
      enum class WarmColors {
        Yellow, Orange, Red
      };
    
      // Note normal enum
      enum PrimeColors {
        Red=100, Green, Blue
      };
    };
    

    There are various ways that the target languages handle enums, so it is not possible to precisely state how they are handled in this section. However, generally, most scripting languages mangle in the strongly typed enumeration's class name, but do not use any additional mangling for normal enumerations. For example, in Python, the following code

    print Color.RainbowColors_Red, Color.WarmColors_Red, Color.Red
    

    results in

    0 2 100
    

    The strongly typed languages often wrap normal enums into an enum class and so treat normal enums and strongly typed enums the same. The equivalent in Java is:

    System.out.println(Color.RainbowColors.Red.swigValue() + " " + Color.WarmColors.Red.swigValue() + " " + Color.PrimeColors.Red.swigValue());
    

    7.2.14 Double angle brackets

    SWIG correctly parses the symbols >> as closing the template block, if found inside it at the top level, or as the right shift operator >> otherwise.

    std::vector<std::vector<int>> myIntTable;
    

    7.2.15 Explicit conversion operators

    SWIG correctly parses the keyword explicit for operators in addition to constructors now. For example:

    class U {
    public:
      int u;
    };
    
    class V {
    public:
      int v;
    };
    
    class TestClass {
    public:
      //implicit converting constructor
      TestClass(U const &val) { t=val.u; }
    
      // explicit constructor
      explicit TestClass(V const &val) { t=val.v; }
    
      int t;
    };
    
    struct Testable {
      // explicit conversion operator
      explicit operator bool() const {
        return false;
      }
    };
    

    The effect of explicit constructors and operators has little relevance for the proxy classes as target languages don't have the same concepts of implicit conversions as C++. Conversion operators either with or without explicit need renaming to a valid identifier name in order to make them available as a normal proxy method.

    7.2.16 Type alias and alias templates

    A type alias is a statement of the form:

    using PFD = void (*)(double); // New introduced syntax
    

    which is equivalent to the old style typedef:

    typedef void (*PFD)(double);  // The old style
    

    The following is an example of an alias template:

    template< typename T1, typename T2, int N >
    class SomeType {
    public:
      T1 a;
      T2 b;
    };
    
    template< typename T2 >
    using TypedefName = SomeType<char*, T2, 5>;
    

    SWIG supports both type aliasing and alias templates. However, in order to use an alias template, two %template directives must be used:

    %template(SomeTypeBool) SomeType<char*, bool, 5>;
    %template() TypedefName<bool>;
    

    Firstly, the actual template is instantiated with a name to be used by the target language, as per any template being wrapped. Secondly, the empty template instantiation, %template(), is required for the alias template. This second requirement is necessary to add the appropriate instantiated template type into the type system as SWIG does not automatically instantiate templates. See the Templates section for more general information on wrapping templates.

    7.2.17 Unrestricted unions

    SWIG fully supports any type inside a union even if it does not define a trivial constructor. For example, the wrapper for the following code correctly provides access to all members in the union:

    struct point {
      point() {}
      point(int x, int y) : x_(x), y_(y) {}
      int x_, y_;
    };
    
    #include <new> // For placement 'new' in the constructor below
    union P {
      int z;
      double w;
      point p; // Illegal in C++03; legal in C++11.
      // Due to the point member, a constructor definition is required.
      P() {
        new(&p) point();
      }
    } p1;
    

    7.2.18 Variadic templates

    SWIG supports the variadic templates syntax (inside the <> block, variadic class inheritance and variadic constructor and initializers) with some limitations. The following code is correctly parsed:

    template <typename... BaseClasses> class ClassName : public BaseClasses... {
    public:
      ClassName (BaseClasses &&... baseClasses) : BaseClasses(baseClasses)... {}
    }
    

    For now however, the %template directive only accepts one parameter substitution for the variable template parameters.

    %template(MyVariant1) ClassName<>         // zero argument not supported yet
    %template(MyVariant2) ClassName<int>      // ok
    %template(MyVariant3) ClassName<int, int> // too many arguments not supported yet
    

    Support for the variadic sizeof() function is correctly parsed:

    const int SIZE = sizeof...(ClassName<int, int>);
    

    In the above example SIZE is of course wrapped as a constant.

    7.2.19 New character literals

    C++11 adds support for UCS-2 and UCS-4 character literals. These character literals are preceded by either 'u' or 'U'.

    char16_t a = u'a';
    char32_t b = U'b';
    

    Compatibility note: SWIG-4.0.0 was the first version to support these Universal Coded Character Set (UCS) character literals.

    7.2.20 New string literals

    SWIG supports wide string and Unicode string constants and raw string literals.

    // New string literals
    wstring         aa =  L"Wide string";
    const char     *bb = u8"UTF-8 string";
    const char16_t *cc =  u"UTF-16 string";
    const char32_t *dd =  U"UTF-32 string";
    
    // Raw string literals
    const char      *xx =        ")I'm an \"ascii\" \\ string.";
    const char      *ee =   R"XXX()I'm an "ascii" \ string.)XXX"; // same as xx
    wstring          ff =  LR"XXX(I'm a "raw wide" \ string.)XXX";
    const char      *gg = u8R"XXX(I'm a "raw UTF-8" \ string.)XXX";
    const char16_t  *hh =  uR"XXX(I'm a "raw UTF-16" \ string.)XXX";
    const char32_t  *ii =  UR"XXX(I'm a "raw UTF-32" \ string.)XXX";
    

    Non-ASCII string support varies quite a bit among the various target languages though.

    Note: There is a bug currently where SWIG's preprocessor incorrectly parses an odd number of double quotes inside raw string literals.

    7.2.21 User-defined literals

    SWIG parses the declaration of user-defined literals, that is, the operator "" _mysuffix() function syntax.

    Some examples are the raw literal:

    OutputType operator "" _myRawLiteral(const char * value);
    

    numeric cooked literals:

    OutputType operator "" _mySuffixIntegral(unsigned long long);
    OutputType operator "" _mySuffixFloat(long double);
    

    and cooked string literals:

    OutputType operator "" _mySuffix(const char * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const wchar_t * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const char16_t * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const char32_t * string_values, size_t num_chars);
    

    Like other operators that SWIG parses, a warning is given about renaming the operator in order for it to be wrapped:

    example.i:27: Warning 503: Can't wrap 'operator "" _myRawLiteral' unless renamed to a valid identifier.
    

    If %rename is used, then it can be called like any other wrapped method. Currently you need to specify the full declaration including parameters for %rename:

    %rename(MyRawLiteral)  operator"" _myRawLiteral(const char * value);
    

    Or if you just wish to ignore it altogether:

    %ignore operator "" _myRawLiteral(const char * value);
    

    Note that use of user-defined literals such as the following still give a syntax error:

    OutputType var1 = "1234"_suffix;
    OutputType var2 = 1234_suffix;
    OutputType var3 = 3.1416_suffix;
    

    7.2.22 Thread-local storage

    SWIG correctly parses the thread_local keyword. For example, variables reachable by the current thread can be defined as:

    struct A {
      static thread_local int val;
    };
    thread_local int global_val;
    

    The use of the thread_local storage specifier does not affect the wrapping process; it does not modify the wrapper code compared to when it is not specified. A variable will be thread local if accessed from different threads from the target language in the same way that it will be thread local if accessed from C++ code.

    7.2.23 Explicitly defaulted functions and deleted functions

    SWIG handles explicitly defaulted functions, that is, = default added to a function declaration. Deleted definitions, which are also called deleted functions, have = delete added to the function declaration. For example:

    struct NonCopyable {
      NonCopyable & operator=(const NonCopyable &) = delete; /* Removes operator= */
      NonCopyable(const NonCopyable &) = delete;             /* Removes copy constructor */
      NonCopyable() = default;                               /* Explicitly allows the empty constructor */
    };
    

    Wrappers for deleted functions will not be available in the target language. Wrappers for defaulted functions will of course be available in the target language. Explicitly defaulted functions have no direct effect for SWIG wrapping as the declaration is handled much like any other method declaration parsed by SWIG.

    Deleted functions are also designed to prevent implicit conversions when calling the function. For example, the C++ compiler will not compile any code which attempts to use an int as the type of the parameter passed to f below:

    struct NoInt {
      void f(double i);
      void f(int) = delete;
    };
    

    This is a C++ compile time check and SWIG does not make any attempt to detect if the target language is using an int instead of a double though, so in this case it is entirely possible to pass an int instead of a double to f from Java, Python etc.

    7.2.24 Type long long int

    SWIG correctly parses and uses the new long long type already introduced in C99 some time ago.

    7.2.25 Static assertions

    SWIG correctly parses the new static_assert declarations (though 3.0.12 and earlier had a bug which meant this wasn't accepted at file scope). This is a C++ compile time directive so there isn't anything useful that SWIG can do with it.

    template <typename T>
    struct Check {
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
    };
    

    7.2.26 Allow sizeof to work on members of classes without an explicit object

    SWIG can parse the new sizeof() on types as well as on objects. For example:

    struct A {
      int member;
    };
    
    const int SIZE = sizeof(A::member); // does not work with C++03. Okay with C++11
    

    In Python:

    >>> SIZE
    8
    

    7.2.27 Exception specifications and noexcept

    C++11 added in the noexcept specification to exception specifications to indicate that a function simply may or may not throw an exception, without actually naming any exception. SWIG understands these, although there isn't any useful way that this information can be taken advantage of by target languages, so it is as good as ignored during the wrapping process. Below are some examples of noexcept in function declarations:

    static void noex1() noexcept;
    int noex2(int) noexcept(true);
    int noex3(int, bool) noexcept(false);
    

    7.2.28 Control and query object alignment

    An alignof operator is used mostly within C++ to return alignment in number of bytes, but could be used to initialize a variable as shown below. The variable's value will be available for access by the target language as any other variable's compile time initialised value.

    const int align1 = alignof(A::member);
    

    The alignas specifier for variable alignment is not yet supported. Example usage:

    struct alignas(16) S {
      int num;
    };
    alignas(double) unsigned char c[sizeof(double)];
    

    Use the preprocessor to work around this for now:

    #define alignas(T)
    

    7.2.29 Attributes

    Attributes such as those shown below, are not yet supported and will give a syntax error.

    int [[attr1]] i [[attr2, attr3]];
    
    [[noreturn, nothrow]] void f [[noreturn]] ();
    

    7.2.30 Methods with ref-qualifiers

    C++11 non-static member functions can be declared with ref-qualifiers. Member functions declared with a & lvalue ref-qualifiers are wrapped like any other function without ref-qualifiers. Member functions declared with a && rvalue ref-qualifiers are ignored by default as they are unlikely to be required from non-C++ languages where the concept of rvalue-ness for the implied *this pointer does not apply. The warning is hidden by default, but can be displayed as described in the section on Enabling extra warnings.

    Consider:

    struct RQ {
      void m1(int x) &;
      void m2(int x) &&;
    };
    

    The only wrapped method will be the lvalue ref-qualified method m1 and if SWIG is run with the -Wextra command-line option, the following warning will be issued indicating m2 is not wrapped:

    example.i:7: Warning 405: Method with rvalue ref-qualifier m2(int) && ignored.
    

    If you unignore the method as follows, wrappers for m2 will be generated:

    %feature("ignore", "0") RQ::m2(int x) &&;
    struct RQ {
      void m1(int x) &;
      void m2(int x) &&;
    };
    

    Inspection of the generated C++ code, will show that std::move is used on the instance of the RQ * class:

      RQ *arg1 = (RQ *) 0 ;
      int arg2 ;
    
      arg1 = ...marshalled from target language...
      arg2 = ...marshalled from target language...
    
      std::move(*arg1).m2(arg2);
    

    This will compile but when run, the move effects may not be what you want. As stated earlier, rvalue ref-qualifiers aren't really applicable outside the world of C++. However, if you really know what you are doing, full control over the call to the method is possible via the low-level "action" feature. This feature completely replaces the call to the underlying function, that is, the last line in the snippet of code above.

    %feature("ignore", "0") RQ::m2(int x) &&;
    %feature("action") RQ::m2(int x) && %{
      RQ().m2(arg2);
    %}
    struct RQ {
      void m1(int x) &;
      void m2(int x) &&;
    };
    

    resulting in:

      RQ *arg1 = (RQ *) 0 ;
      int arg2 ;
    
      arg1 = ...marshalled from target language...
      arg2 = ...marshalled from target language...
    
      RQ().m2(arg2);
    

    Compatibility note: SWIG-4.0.0 was the first version to support ref-qualifiers.

    7.3 Standard library changes

    7.3.1 Threading facilities

    SWIG does not currently wrap or use any of the new threading classes introduced (thread, mutex, locks, condition variables, task). The main reason is that SWIG target languages offer their own threading facilities so there is limited use for them.

    7.3.2 Tuple types

    SWIG does not provide library files for the new tuple types yet. Variadic template support requires further work to provide substantial tuple wrappers.

    7.3.3 Hash tables

    The new hash tables in the STL are unordered_set, unordered_multiset, unordered_map, unordered_multimap. These are not available in all target languages. Any missing support can in principle be easily implemented by adapting the current STL containers.

    7.3.4 Regular expressions

    While SWIG could provide wrappers for the new C++11 regular expressions classes, there is little need as the target languages have their own regular expression facilities.

    7.3.5 General-purpose smart pointers

    SWIG provides special smart pointer handling for std::shared_ptr in the same way it has support for boost::shared_ptr. Please see the shared_ptr smart pointer library section. There is no special smart pointer handling available for std::weak_ptr and std::unique_ptr yet.

    7.3.6 Extensible random number facility

    This feature extends and standardizes the standard library only and does not effect the C++ language nor SWIG.

    7.3.7 Wrapper reference

    Wrapper references are similar to normal C++ references but are copy-constructible and copy-assignable. They could conceivably be used in public APIs. There is no special support for std::reference_wrapper in SWIG though. Users would need to write their own typemaps if wrapper references are being used and these would be similar to the plain C++ reference typemaps.

    7.3.8 Polymorphic wrappers for function objects

    SWIG supports functor classes in a few languages in a very natural way. However nothing is provided yet for the new std::function template. SWIG will parse usage of the template like any other template.

    %rename(__call__) Test::operator(); // Default renaming used for Python
    
    struct Test {
      bool operator()(int x, int y); // function object
    };
    
    #include <functional>
    std::function<void (int, int)> pF = Test;   // function template wrapper
    
    

    Example of supported usage of the plain functor from Python is shown below. It does not involve std::function.

    t = Test()
    b = t(1, 2) # invoke C++ function object
    

    7.3.9 Type traits for metaprogramming

    The type_traits functions to support C++ metaprogramming is useful at compile time and is aimed specifically at C++ development:

    #include <type_traits>
    
    // First way of operating.
    template< bool B > struct algorithm {
      template< class T1, class T2 > static int do_it(T1 &, T2 &)  { /*...*/ return 1; }
    };
    
    // Second way of operating.
    template<> struct algorithm<true> {
      template< class T1, class T2 > static int do_it(T1, T2)  { /*...*/ return 2; }
    };
    
    // Instantiating 'elaborate' will automatically instantiate the correct way to operate, depending on the types used.
    template< class T1, class T2 > int elaborate(T1 A, T2 B) {
      // Use the second way only if 'T1' is an integer and if 'T2' is a floating point,
      // otherwise use the first way.
      return algorithm< std::is_integral<T1>::value && std::is_floating_point<T2>::value >::do_it(A, B);
    }
    

    SWIG correctly parses the template specialization, template types etc. However, metaprogramming and the additional support in the type_traits header is really for compile time and is not much use at runtime for the target languages. For example, as SWIG requires explicit instantiation of templates via %template, there isn't much that std::is_integral<int> is going to provide by itself. However, template functions using such metaprogramming techniques might be useful to wrap. For example, the following instantiations could be made:

    %template(Elaborate) elaborate<int, int>;
    %template(Elaborate) elaborate<int, double>;
    

    Then the appropriate algorithm can be called for the subset of types given by the above %template instantiations from a target language, such as Python:

    >>> Elaborate(0, 0)
    1
    >>> Elaborate(0, 0.0)
    2
    

    7.3.10 Uniform method for computing return type of function objects

    The new std::result_of class introduced in the <functional> header provides a generic way to obtain the return type of a function type via std::result_of::type. There isn't any library interface file to support this type. With a bit of work, SWIG will deduce the return type of functions when used in std::result_of using the approach shown below. The technique basically forward declares the std::result_of template class, then partially specializes it for the function types of interest. SWIG will use the partial specialization and hence correctly use the std::result_of::type provided in the partial specialization.

    %inline %{
    #include <functional>
    typedef double(*fn_ptr)(double);
    %}
    
    namespace std {
      // Forward declaration of result_of
      template<typename Func> struct result_of;
      // Add in a partial specialization of result_of
      template<> struct result_of< fn_ptr(double) > {
        typedef double type;
      };
    }
    
    %template() std::result_of< fn_ptr(double) >;
    
    %inline %{
    
    double square(double x) {
      return (x * x);
    }
    
    template<class Fun, class Arg>
    typename std::result_of<Fun(Arg)>::type test_result_impl(Fun fun, Arg arg) {
      return fun(arg);
    }
    %}
    
    %template(test_result) test_result_impl< fn_ptr, double >;
    %constant double (*SQUARE)(double) = square;
    

    Note the first use of %template which SWIG requires to instantiate the template. The empty template instantiation suffices as no proxy class is required for std::result_of<Fun(Arg)>::type as this type is really just a double. The second %template instantiates the template function which is being wrapped for use as a callback. The %constant can then be used for any callback function as described in Pointers to functions and callbacks.

    Example usage from Python should give the not too surprising result:

    >>> test_result(SQUARE, 5.0)
    25.0
    

    Phew, that is a lot of hard work to get a callback working. You could just go with the more attractive option of just using double as the return type in the function declaration instead of result_of!

    swig-4.0.2/Doc/Manual/Varargs.html0000644000175000017500000007514713667507563016621 0ustar williamwilliam Variable Length Arguments

    16 Variable Length Arguments

    (a.k.a, "The horror. The horror.")

    This chapter describes the problem of wrapping functions that take a variable number of arguments. For instance, generating wrappers for the C printf() family of functions.

    This topic is sufficiently advanced to merit its own chapter. In fact, support for varargs is an often requested feature that was first added in SWIG-1.3.12. Most other wrapper generation tools have wisely chosen to avoid this issue.

    16.1 Introduction

    Some C and C++ programs may include functions that accept a variable number of arguments. For example, most programmers are familiar with functions from the C library such as the following:

    int printf(const char *fmt, ...)
    int fprintf(FILE *, const char *fmt, ...);
    int sprintf(char *s, const char *fmt, ...);
    

    Although there is probably little practical purpose in wrapping these specific C library functions in a scripting language (what would be the point?), a library may include its own set of special functions based on a similar API. For example:

    int  traceprintf(const char *fmt, ...);
    

    In this case, you may want to have some kind of access from the target language.

    Before describing the SWIG implementation, it is important to discuss the common uses of varargs that you are likely to encounter in real programs. Obviously, there are the printf() style output functions as shown. Closely related to this would be scanf() style input functions that accept a format string and a list of pointers into which return values are placed. However, variable length arguments are also sometimes used to write functions that accept a NULL-terminated list of pointers. A good example of this would be a function like this:

    int execlp(const char *path, const char *arg1, ...);
    ...
    
    /* Example */
    execlp("ls", "ls", "-l", NULL);
    

    In addition, varargs is sometimes used to fake default arguments in older C libraries. For instance, the low level open() system call is often declared as a varargs function so that it will accept two or three arguments:

    int open(const char *path, int oflag, ...);
    ...
    
    /* Examples */
    f = open("foo", O_RDONLY);
    g = open("bar", O_WRONLY | O_CREAT, 0644);
    

    Finally, to implement a varargs function, recall that you have to use the C library functions defined in <stdarg.h>. For example:

    List make_list(const char *s, ...) {
      va_list ap;
      List    x;
      ...
      va_start(ap, s);
      while (s) {
        x.append(s);
        s = va_arg(ap, const char *);
      }
      va_end(ap);
      return x;
    }
    

    16.2 The Problem

    Generating wrappers for a variable length argument function presents a number of special challenges. Although C provides support for implementing functions that receive variable length arguments, there are no functions that can go in the other direction. Specifically, you can't write a function that dynamically creates a list of arguments and which invokes a varargs function on your behalf.

    Although it is possible to write functions that accept the special type va_list, this is something entirely different. You can't take a va_list structure and pass it in place of the variable length arguments to another varargs function. It just doesn't work.

    The reason this doesn't work has to do with the way that function calls get compiled. For example, suppose that your program has a function call like this:

    printf("Hello %s. Your number is %d\n", name, num);
    

    When the compiler looks at this, it knows that you are calling printf() with exactly three arguments. Furthermore, it knows that the number of arguments as well are their types and sizes is never going to change during program execution. Therefore, this gets turned to machine code that sets up a three-argument stack frame followed by a call to printf().

    In contrast, suppose you attempted to make some kind of wrapper around printf() using code like this:

    int wrap_printf(const char *fmt, ...) {
      va_list ap;
      va_start(ap, fmt);
      ...
      printf(fmt, ap);
      ...
      va_end(ap);
    };
    

    Although this code might compile, it won't do what you expect. This is because the call to printf() is compiled as a procedure call involving only two arguments. However, clearly a two-argument configuration of the call stack is completely wrong if your intent is to pass an arbitrary number of arguments to the real printf(). Needless to say, it won't work.

    Unfortunately, the situation just described is exactly the problem faced by wrapper generation tools. In general, the number of passed arguments will not be known until run-time. To make matters even worse, you won't know the types and sizes of arguments until run-time as well. Needless to say, there is no obvious way to make the C compiler generate code for a function call involving an unknown number of arguments of unknown types.

    In theory, it is possible to write a wrapper that does the right thing. However, this involves knowing the underlying ABI for the target platform and language as well as writing special purpose code that manually constructed the call stack before making a procedure call. Unfortunately, both of these tasks require the use of inline assembly code. Clearly, that's the kind of solution you would much rather avoid.

    With this nastiness in mind, SWIG provides a number of solutions to the varargs wrapping problem. Most of these solutions are compromises that provide limited varargs support without having to resort to assembly language. However, SWIG can also support real varargs wrapping (with stack-frame manipulation) if you are willing to get hands dirty. Keep reading.

    16.3 Default varargs support

    When variable length arguments appear in an interface, the default behavior is to drop the variable argument list entirely, replacing them with a single NULL pointer. For example, if you had this function,

    void traceprintf(const char *fmt, ...);
    

    it would be wrapped as if it had been declared as follows:

    void traceprintf(const char *fmt);
    

    When the function is called inside the wrappers, it is called as follows:

    traceprintf(arg1, NULL);
    

    Arguably, this approach seems to defeat the whole point of variable length arguments. However, this actually provides enough support for many simple kinds of varargs functions to still be useful, however it does come with a caveat. For instance, you could make function calls like this (in Python):

    >>> traceprintf("Hello World")
    >>> traceprintf("Hello %s. Your number is %d\n" % (name, num))
    >>> traceprintf("Your result is 90%%.")
    

    Notice how string formatting is being done in Python instead of C. The caveat is the strings passed must be safe to use in C though. For example if name was to contain a "%" it should be double escaped in order to avoid unpredictable behaviour:

    >>> traceprintf("Your result is 90%.\n")  # unpredictable behaviour
    >>> traceprintf("Your result is 90%%.\n") # good
    

    Read on for further solutions.

    16.4 Argument replacement using %varargs

    Instead of dropping the variable length arguments, an alternative approach is to replace (...) with a set of suitable arguments. SWIG provides a special %varargs directive that can be used to do this. For example,

    %varargs(int mode = 0) open;
    ...
    int open(const char *path, int oflags, ...);
    

    is equivalent to this:

    int open(const char *path, int oflags, int mode = 0);
    

    In this case, %varargs is simply providing more specific information about the extra arguments that might be passed to a function. If the arguments to a varargs function are of uniform type, %varargs can also accept a numerical argument count as follows:

    %varargs(3, char *str = NULL) execlp;
    ...
    int execlp(const char *path, const char *arg, ...);
    

    and is effectively seen as:

    int execlp(const char *path, const char *arg, 
               char *str1 = NULL, 
               char *str2 = NULL, 
               char *str3 = NULL);
    

    This would wrap execlp() as a function that accepted up to 3 optional arguments. Depending on the application, this may be more than enough for practical purposes.

    The handling of default arguments can be changed via the compactdefaultargs feature. If this feature is used, for example

    %feature("compactdefaultargs") execlp;
    %varargs(3, char *str = NULL) execlp;
    ...
    int execlp(const char *path, const char *arg, ...);
    

    a call from the target language which does not provide the maximum number of arguments, such as, execlp("a", "b", "c") will generate C code which includes the missing default values, that is, execlp("a", "b", "c", NULL, NULL). If compactdefaultargs is not used, then the generated code will be execlp("a", "b", "c"). The former is useful for helping providing a sentinel to terminate the argument list. However, this is not guaranteed, for example when a user passes a non-NULL value for all the parameters. When using compactdefaultargs it is possible to guarantee the NULL sentinel is passed through the, numinputs=0 'in' typemap attribute, naming the last parameter. For example,

    %feature("compactdefaultargs") execlp;
    %varargs(3, char *str = NULL) execlp;
    %typemap(in, numinputs=0) char *str3 ""
    ...
    int execlp(const char *path, const char *arg, ...);
    

    Note that str3 is the name of the last argument, as we have used %varargs with 3. Now execlp("a", "b", "c", "d", "e") will result in an error as one too many arguments has been passed, as now only 2 additional 'str' arguments can be passed with the 3rd one always using the specified default NULL.

    Argument replacement is most appropriate in cases where the types of the extra arguments are uniform and the maximum number of arguments are known. Argument replacement is not as useful when working with functions that accept mixed argument types such as printf(). Providing general purpose wrappers to such functions presents special problems (covered shortly).

    16.5 Varargs and typemaps

    Variable length arguments may be used in typemap specifications. For example:

    %typemap(in) (...) {
      // Get variable length arguments (somehow)
      ...
    }
    
    %typemap(in) (const char *fmt, ...) {
        // Multi-argument typemap
    }
    

    However, this immediately raises the question of what "type" is actually used to represent (...). For lack of a better alternative, the type of (...) is set to void *. Since there is no way to dynamically pass arguments to a varargs function (as previously described), the void * argument value is intended to serve as a place holder for storing some kind of information about the extra arguments (if any). In addition, the default behavior of SWIG is to pass the void * value as an argument to the function. Therefore, you could use the pointer to hold a valid argument value if you wanted.

    To illustrate, here is a safer version of wrapping printf() in Python:

    %typemap(in) (const char *fmt, ...) {
        $1 = "%s";                                /* Fix format string to %s */
        $2 = (void *) PyString_AsString($input);  /* Get string argument */
    };
    ...
    int printf(const char *fmt, ...);
    

    In this example, the format string is implicitly set to "%s". This prevents a program from passing a bogus format string to the extension. Then, the passed input object is decoded and placed in the void * argument defined for the (...) argument. When the actual function call is made, the underlying wrapper code will look roughly like this:

    wrap_printf() {
      char *arg1;
      void *arg2;
      int   result;
    
      arg1 = "%s";
      arg2 = (void *) PyString_AsString(arg2obj);
      ...
      result = printf(arg1, arg2);
      ...
    }
    

    Notice how both arguments are passed to the function and it does what you would expect.

    The next example illustrates a more advanced kind of varargs typemap. Disclaimer: this requires special support in the target language module and is not guaranteed to work with all SWIG modules at this time. It also starts to illustrate some of the more fundamental problems with supporting varargs in more generality.

    If a typemap is defined for any form of (...), many SWIG modules will generate wrappers that accept a variable number of arguments as input and will make these arguments available in some form. The precise details of this depends on the language module being used (consult the appropriate chapter for more details). However, suppose that you wanted to create a Python wrapper for the execlp() function shown earlier. To do this using a typemap instead of using %varargs, you might first write a typemap like this:

    %typemap(in) (...)(char *vargs[10]) {
      int i;
      int argc;
      for (i = 0; i < 10; i++) vargs[i] = 0;
      argc = PyTuple_Size(varargs);
      if (argc > 10) {
        PyErr_SetString(PyExc_ValueError, "Too many arguments");
        SWIG_fail;
      }
      for (i = 0; i < argc; i++) {
        PyObject *pyobj = PyTuple_GetItem(varargs, i);
        char *str = 0;
    %#if PY_VERSION_HEX>=0x03000000
        PyObject *pystr;
        if (!PyUnicode_Check(pyobj)) {
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        pystr = PyUnicode_AsUTF8String(pyobj);
        if (!pystr) {
          SWIG_fail;
        }
        str = strdup(PyBytes_AsString(pystr));
        Py_DECREF(pystr);
    %#else  
        if (!PyString_Check(pyobj)) {
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        str = PyString_AsString(pyobj);
    %#endif
        vargs[i] = str;
      }
      $1 = (void *)vargs;
    }
    
    %typemap(freearg) (...) {
    %#if PY_VERSION_HEX>=0x03000000
      int i;
      for (i = 0; i < 10; i++) {
        free(vargs$argnum[i]);
      }
    %#endif
    }
    

    In the 'in' typemap, the special variable varargs is a tuple holding all of the extra arguments passed (this is specific to the Python module). The typemap then pulls this apart and sticks the values into the array of strings args. Then, the array is assigned to $1 (recall that this is the void * variable corresponding to (...)). However, this assignment is only half of the picture----clearly this alone is not enough to make the function work. The 'freearg' typemap cleans up memory allocated in the 'in' typemap; this code is generated to be called after the execlp function is called. To patch everything up, you have to rewrite the underlying action code using the %feature directive like this:

    %feature("action") execlp {
      char **vargs = (char **) arg3;
      result = execlp(arg1, arg2, vargs[0], vargs[1], vargs[2], vargs[3], vargs[4],
                      vargs[5], vargs[6], vargs[7], vargs[8], vargs[9], NULL);
    }
    
    int execlp(const char *path, const char *arg, ...);
    

    This patches everything up and creates a function that more or less works. However, don't try explaining this to your coworkers unless you know for certain that they've had several cups of coffee. If you really want to elevate your guru status and increase your job security, continue to the next section.

    16.6 Varargs wrapping with libffi

    All of the previous examples have relied on features of SWIG that are portable and which don't rely upon any low-level machine-level details. In many ways, they have all dodged the real issue of variable length arguments by recasting a varargs function into some weaker variation with a fixed number of arguments of known types. In many cases, this works perfectly fine. However, if you want more generality than this, you need to bring out some bigger guns.

    One way to do this is to use a special purpose library such as libffi (http://www.sourceware.org/libffi/). libffi is a library that allows you to dynamically construct call-stacks and invoke procedures in a relatively platform independent manner. Details about the library can be found in the libffi distribution and are not repeated here.

    To illustrate the use of libffi, suppose that you really wanted to create a wrapper for execlp() that accepted any number of arguments. To do this, you might make a few adjustments to the previous example. For example:

    /* Take an arbitrary number of extra arguments and place into an array
       of strings */
    
    %typemap(in) (...) {
      char **argv;
      int    argc;
      int    i;
    
      argc = PyTuple_Size(varargs);
      argv = (char **) malloc(sizeof(char *)*(argc+1));
      for (i = 0; i < argc; i++) {
        PyObject *o = PyTuple_GetItem(varargs, i);
        if (!PyString_Check(o)) {
          free(argv);
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        argv[i] = PyString_AsString(o);
      }
      argv[i] = NULL;
      $1 = (void *) argv;
    }
    
    /* Rewrite the function call, using libffi */    
    
    %feature("action") execlp {
      int       i, vc;
      ffi_cif   cif;
      ffi_type  **types;
      void      **values;
      char      **args;
    
      vc = PyTuple_Size(varargs);
      types  = (ffi_type **) malloc((vc+3)*sizeof(ffi_type *));
      values = (void **) malloc((vc+3)*sizeof(void *));
      args   = (char **) arg3;
    
      /* Set up path parameter */
      types[0] = &ffi_type_pointer;
      values[0] = &arg1;
      
      /* Set up first argument */
      types[1] = &ffi_type_pointer;
      values[1] = &arg2;
    
      /* Set up rest of parameters */
      for (i = 0; i <= vc; i++) {
        types[2+i] = &ffi_type_pointer;
        values[2+i] = &args[i];
      }
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, vc+3,
                       &ffi_type_uint, types) == FFI_OK) {
        ffi_call(&cif, (void (*)()) execlp, &result, values);
      } else {
        free(types);
        free(values);
        free(arg3);
        PyErr_SetString(PyExc_RuntimeError, "Whoa!!!!!");
        SWIG_fail;
      }
      free(types);
      free(values);
      free(arg3);
    }
    
    /* Declare the function. Whew! */
    int execlp(const char *path, const char *arg1, ...);
    

    Looking at this example, you may start to wonder if SWIG is making life any easier. Given the amount of code involved, you might also wonder why you didn't just write a hand-crafted wrapper! Either that or you're wondering "why in the hell am I trying to wrap this varargs function in the first place?!?" Obviously, those are questions you'll have to answer for yourself.

    As a more extreme example of libffi, here is some code that attempts to wrap printf(),

    /* A wrapper for printf() using libffi */
    
    %{
    /* Structure for holding passed arguments after conversion */
      typedef struct {
        int type;
        union {
          int    ivalue;
          double dvalue;
          void   *pvalue;
        } val;
      } vtype;
      enum { VT_INT, VT_DOUBLE, VT_POINTER };
    %}
    
    %typemap(in) (const char *fmt, ...) {
      vtype *argv;
      int    argc;
      int    i;
    
      /* Format string */
      $1 = PyString_AsString($input);
    
      /* Variable length arguments */
      argc = PyTuple_Size(varargs);
      argv = (vtype *) malloc(argc*sizeof(vtype));
      for (i = 0; i < argc; i++) {
        PyObject *o = PyTuple_GetItem(varargs, i);
        if (PyInt_Check(o)) {
          argv[i].type = VT_INT;
          argv[i].val.ivalue = PyInt_AsLong(o);
        } else if (PyFloat_Check(o)) {
          argv[i].type = VT_DOUBLE;
          argv[i].val.dvalue = PyFloat_AsDouble(o);
        } else if (PyString_Check(o)) {
          argv[i].type = VT_POINTER;
          argv[i].val.pvalue = (void *) PyString_AsString(o);
        } else {
          free(argv);
          PyErr_SetString(PyExc_ValueError, "Unsupported argument type");
          return NULL;
        }
      }
      $2 = (void *) argv;
    }
    
    /* Rewrite the function call using libffi */    
    %feature("action") printf {
      int       i, vc;
      ffi_cif   cif;
      ffi_type  **types;
      void      **values;
      vtype     *args;
    
      vc = PyTuple_Size(varargs);
      types  = (ffi_type **) malloc((vc+1)*sizeof(ffi_type *));
      values = (void **) malloc((vc+1)*sizeof(void *));
      args   = (vtype *) arg2;
    
      /* Set up fmt parameter */
      types[0] = &ffi_type_pointer;
      values[0] = &arg1;
    
      /* Set up rest of parameters */
      for (i = 0; i < vc; i++) {
        switch(args[i].type) {
        case VT_INT:
          types[1+i] = &ffi_type_uint;
          values[1+i] = &args[i].val.ivalue;
          break;
        case VT_DOUBLE:
          types[1+i] = &ffi_type_double;
          values[1+i] = &args[i].val.dvalue;
          break;
        case VT_POINTER:
          types[1+i] = &ffi_type_pointer;
          values[1+i] = &args[i].val.pvalue;
          break;
        default:
          abort();    /* Whoa! We're seriously hosed */
          break;   
        }
      }
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, vc+1,
                       &ffi_type_uint, types) == FFI_OK) {
        ffi_call(&cif, (void (*)()) printf, &result, values);
      } else {
        free(types);
        free(values);
        free(args);
        PyErr_SetString(PyExc_RuntimeError, "Whoa!!!!!");
        SWIG_fail;
      }
      free(types);
      free(values);
      free(args);
    }
    
    /* The function */
    int printf(const char *fmt, ...);
    

    Much to your amazement, it even seems to work if you try it:

    >>> import example
    >>> example.printf("Grade: %s   %d/60 = %0.2f%%\n", "Dave", 47, 47.0*100/60)
    Grade: Dave   47/60 = 78.33%
    >>>
    

    Of course, there are still some limitations to consider:

    >>> example.printf("la de da de da %s", 42)
    Segmentation fault (core dumped)
    

    And, on this note, we leave further exploration of libffi to the reader as an exercise. Although Python has been used as an example, most of the techniques in this section can be extrapolated to other language modules with a bit of work. The only details you need to know is how the extra arguments are accessed in each target language. For example, in the Python module, we used the special varargs variable to get these arguments. Modules such as Tcl8 and Perl5 simply provide an argument number for the first extra argument. This can be used to index into an array of passed arguments to get values. Please consult the chapter on each language module for more details.

    16.7 Wrapping of va_list

    Closely related to variable length argument wrapping, you may encounter functions that accept a parameter of type va_list. For example:

    int vprintf(const char *fmt, va_list ap);
    

    As far as we know, there is no obvious way to wrap these functions with SWIG. This is because there is no documented way to assemble the proper va_list structure (there are no C library functions to do it and the contents of va_list are opaque). Not only that, the contents of a va_list structure are closely tied to the underlying call-stack. It's not clear that exporting a va_list would have any use or that it would work at all.

    A workaround can be implemented by writing a simple varargs C wrapper and then using the techniques discussed earlier in this chapter for varargs. Below is a simple wrapper for vprintf renamed so that it can still be called as vprintf from your target language. The %varargs used in the example restricts the function to taking one string argument.

    %{
    int vprintf(const char *fmt, va_list ap);
    %}
    
    %varargs(const char *) my_vprintf;
    %rename(vprintf) my_vprintf;
    
    %inline %{
    int my_vprintf(const char *fmt, ...) {
      va_list ap;
      int result;
    
      va_start(ap, fmt);
      result = vprintf(fmt, ap);
      va_end(ap);
      return result;
    }
    %}
    

    16.8 C++ Issues

    Wrapping of C++ member functions that accept a variable number of arguments presents a number of challenges. By far, the easiest way to handle this is to use the %varargs directive. This is portable and it fully supports classes much like the %rename directive. For example:

    %varargs (10, char * = NULL) Foo::bar;
    
    class Foo {
    public:
      virtual void bar(char *arg, ...);   // gets varargs above
    };
    
    class Spam: public Foo {
    public:
      virtual void bar(char *arg, ...);   // gets varargs above
    };
    

    %varargs also works with constructors, operators, and any other C++ programming construct that accepts variable arguments.

    Doing anything more advanced than this is likely to involve a serious world of pain. In order to use a library like libffi, you will need to know the underlying calling conventions and details of the C++ ABI. For instance, the details of how this is passed to member functions as well as any hidden arguments that might be used to pass additional information. These details are implementation specific and may differ between compilers and even different versions of the same compiler. Also, be aware that invoking a member function is further complicated if it is a virtual method. In this case, invocation might require a table lookup to obtain the proper function address (although you might be able to obtain an address by casting a bound pointer to a pointer to function as described in the C++ ARM section 18.3.4).

    If you do decide to change the underlying action code, be aware that SWIG always places the this pointer in arg1. Other arguments are placed in arg2, arg3, and so forth. For example:

    %feature("action") Foo::bar {
      ...
      result = arg1->bar(arg2, arg3, etc.);
      ...
    }
    

    Given the potential to shoot yourself in the foot, it is probably easier to reconsider your design or to provide an alternative interface using a helper function than it is to create a fully general wrapper to a varargs C++ member function.

    16.9 Discussion

    This chapter has provided a number of techniques that can be used to address the problem of variable length argument wrapping. If you care about portability and ease of use, the %varargs directive is probably the easiest way to tackle the problem. However, using typemaps, it is possible to do some very advanced kinds of wrapping.

    One point of discussion concerns the structure of the libffi examples in the previous section. Looking at that code, it is not at all clear that this is the easiest way to solve the problem. However, there are a number of subtle aspects of the solution to consider--mostly concerning the way in which the problem has been decomposed. First, the example is structured in a way that tries to maintain separation between wrapper-specific information and the declaration of the function itself. The idea here is that you might structure your interface like this:

    %typemap(const char *fmt, ...) {
      ...
    }
    %feature("action") traceprintf {
      ...
    }
    
    /* Include some header file with traceprintf in it */
    %include "someheader.h"
    

    Second, careful scrutiny will reveal that the typemaps involving (...) have nothing whatsoever to do with the libffi library. In fact, they are generic with respect to the way in which the function is actually called. This decoupling means that it will be much easier to consider other library alternatives for making the function call. For instance, if libffi wasn't supported on a certain platform, you might be able to use something else instead. You could use conditional compilation to control this:

    #ifdef USE_LIBFFI
    %feature("action") printf {
      ...
    }
    #endif
    #ifdef USE_OTHERFFI
    %feature("action") printf {
    ...
    }
    #endif
    

    Finally, even though you might be inclined to just write a hand-written wrapper for varargs functions, the techniques used in the previous section have the advantage of being compatible with all other features of SWIG such as exception handling.

    As a final word, some C programmers seem to have the assumption that the wrapping of variable length argument functions is an easily solved problem. However, this section has hopefully dispelled some of these myths. All things being equal, you are better off avoiding variable length arguments if you can. If you can't avoid them, please consider some of the simple solutions first. If you can't live with a simple solution, proceed with caution. At the very least, make sure you carefully read the section "A7.3.2 Function Calls" in Kernighan and Ritchie and make sure you fully understand the parameter passing conventions used for varargs. Also, be aware of the platform dependencies and reliability issues that this will introduce. Good luck.

    swig-4.0.2/Doc/Manual/Windows.html0000644000175000017500000003700613667507562016635 0ustar williamwilliam Getting started on Windows

    3 Getting started on Windows

    This chapter describes SWIG usage on Microsoft Windows. Installing SWIG and running the examples is covered as well as building the SWIG executable. Usage within the Unix like environments MinGW and Cygwin is also detailed.

    3.1 Installation on Windows

    SWIG does not come with the usual Windows type installation program, however it is quite easy to get started. The main steps are:

    • Download the swigwin zip package from the SWIG website and unzip into a directory. This is all that needs downloading for the Windows platform.
    • Set environment variables as described in the SWIG Windows Examples section in order to run examples using Visual C++.

    3.1.1 Windows Executable

    The swigwin distribution contains the SWIG Windows 32-bit executable, swig.exe, which will run on both 32-bit and 64-bit versions of Windows. If you want to build your own swig.exe have a look at Building swig.exe on Windows.

    3.2 SWIG Windows Examples

    Using Microsoft Visual C++ is the most common approach to compiling and linking SWIG's output. The Examples directory has a few Visual C++ project files (.dsp files). These were produced by Visual C++ 6. Newer versions of Visual Studio should be able to open and convert these project files. Each C# example comes with a Visual Studio 2005 solution and associated project files instead of Visual C++ 6 project files. The project files have been set up to execute SWIG in a custom build rule for the SWIG interface (.i) file. Alternatively run the examples using Cygwin.

    More information on each of the examples is available with the examples distributed with SWIG (Examples/index.html).

    3.2.1 Instructions for using the Examples with Visual Studio

    Ensure the SWIG executable is as supplied in the SWIG root directory in order for the examples to work. Most languages require some environment variables to be set before running Visual C++. Note that Visual C++ must be re-started to pick up any changes in environment variables. Open up an example .dsp file, Visual C++ will create a workspace for you (.dsw file). Ensure the Release build is selected then do a Rebuild All from the Build menu. The required environment variables are displayed with their current values.

    The list of required environment variables for each module language is also listed below. They are usually set from the Control Panel and System properties, but this depends on which flavour of Windows you are running. If you don't want to use environment variables then change all occurrences of the environment variables in the .dsp files with hard coded values. If you are interested in how the project files are set up there is explanatory information in some of the language module's documentation.

    3.2.1.1 C#

    The C# examples do not require any environment variables to be set as a C# project file is included. Just open up the .sln solution file in Visual Studio .NET 2003 or later, select Release Build, and do a Rebuild All from the Build menu. The accompanying C# and C++ project files are automatically used by the solution file.

    3.2.1.2 Java

    JAVA_INCLUDE : Set this to the directory containing jni.h
    JAVA_BIN : Set this to the bin directory containing javac.exe

    Example using JDK1.3:
    JAVA_INCLUDE: D:\jdk1.3\include
    JAVA_BIN: D:\jdk1.3\bin

    3.2.1.3 Perl

    PERL5_INCLUDE : Set this to the directory containing perl.h
    PERL5_LIB : Set this to the Perl library including path for linking

    Example using nsPerl 5.004_04:

    PERL5_INCLUDE: D:\nsPerl5.004_04\lib\CORE
    PERL5_LIB: D:\nsPerl5.004_04\lib\CORE\perl.lib

    3.2.1.4 Python

    PYTHON_INCLUDE : Set this to the directory that contains Python.h
    PYTHON_LIB : Set this to the Python library including path for linking

    Example using Python 2.1.1:
    PYTHON_INCLUDE: D:\python21\include
    PYTHON_LIB: D:\python21\libs\python21.lib

    3.2.1.5 TCL

    TCL_INCLUDE : Set this to the directory containing tcl.h
    TCL_LIB : Set this to the TCL library including path for linking

    Example using ActiveTcl 8.3.3.3
    TCL_INCLUDE: D:\tcl\include
    TCL_LIB: D:\tcl\lib\tcl83.lib

    3.2.1.6 R

    R_INCLUDE : Set this to the directory containing R.h
    R_LIB : Set this to the R library (Rdll.lib) including path for linking. The library needs to be built as described in the R README.packages file (the pexports.exe approach is the easiest).

    Example using R 2.5.1:
    R_INCLUDE: C:\Program Files\R\R-2.5.1\include
    R_LIB: C:\Program Files\R\R-2.5.1\bin\Rdll.lib

    3.2.1.7 Ruby

    RUBY_INCLUDE : Set this to the directory containing ruby.h
    RUBY_LIB : Set this to the ruby library including path for linking

    Example using Ruby 1.6.4:
    RUBY_INCLUDE: D:\ruby\lib\ruby\1.6\i586-mswin32
    RUBY_LIB: D:\ruby\lib\mswin32-ruby16.lib

    3.2.2 Instructions for using the Examples with other compilers

    If you do not have access to Visual C++ you will have to set up project files / Makefiles for your chosen compiler. There is a section in each of the language modules detailing what needs setting up using Visual C++ which may be of some guidance. Alternatively you may want to use Cygwin as described in the following section.

    3.3 SWIG on Cygwin and MinGW

    SWIG can also be compiled and run using Cygwin or MinGW which provides a Unix like front end to Windows and comes free with gcc, an ISO C/C++ compiler. However, this is not a recommended approach as the prebuilt executable is supplied.

    3.3.1 Building swig.exe on Windows

    If you want to replicate the build of swig.exe that comes with the download, follow the MinGW instructions below. This is not necessary to use the supplied swig.exe. This information is provided for those that want to modify the SWIG source code in a Windows environment. Normally this is not needed, so most people will want to ignore this section.

    3.3.1.1 Building swig.exe using MinGW and MSYS

    The short abbreviated instructions follow...

    • Install MinGW and MSYS from the MinGW site. This provides a Unix environment on Windows.
    • Follow the usual Unix instructions in the README file in the SWIG root directory to build swig.exe from the MinGW command prompt.

    The step by step instructions to download and install MinGW and MSYS, then download and build the latest version of SWIG from Github follow... Note that the instructions for obtaining SWIG from Github are also online at SWIG Bleeding Edge.

    Pitfall note: Execute the steps in the order shown and don't use spaces in path names. In fact it is best to use the default installation directories.

    1. Download the following packages from the MinGW download page or MinGW SourceForge download page. Note that at the time of writing, the majority of these are in the Current release list and some are in the Snapshot or Previous release list.
      • MinGW-3.1.0-1.exe
      • MSYS-1.0.11-2004.04.30-1.exe
      • msysDTK-1.0.1.exe
      • bison-2.0-MSYS.tar.gz
      • msys-autoconf-2.59.tar.bz2
      • msys-automake-1.8.2.tar.bz2
    2. Install MinGW-3.1.0-1.exe (C:\MinGW is default location.)
    3. Install MSYS-1.0.11-2004.04.30-1.exe. Make sure you install it on the same windows drive letter as MinGW (C:\msys\1.0 is default). In the post install script,
      • Answer y to the "do you wish to continue with the post install?"
      • Answer y to the "do you have MinGW installed?"
      • Type in the folder in which you installed MinGW (C:/MinGW is default)
    4. Install msysDTK-1.0.1.exe to the same folder that you installed MSYS (C:\msys\1.0 is default).
    5. Copy the following to the MSYS install folder (C:\msys\1.0 is default):
      • msys-automake-1.8.2.tar.bz2
      • msys-autoconf-2.59.tar.bz2
      • bison-2.0-MSYS.tar.gz
    6. Start the MSYS command prompt and execute:
      cd /
      tar -jxf msys-automake-1.8.2.tar.bz2
      tar -jxf msys-autoconf-2.59.tar.bz2
      tar -zxf bison-2.0-MSYS.tar.gz
      
    7. The very latest development version of SWIG is available from SWIG on Github and can be downloaded as a zip file or if you have Git installed, via Git. Either download the latest Zip file snapshot and unzip and rename the top level folder to /usr/src/swig. Otherwise if using Git, type in the following:
      mkdir /usr/src
      cd /usr/src
      git clone https://github.com/swig/swig.git
      
      Pitfall note: If you want to place SWIG in a different folder to the proposed /usr/src/swig, do not use MSYS emulated windows drive letters, because the autotools will fail miserably on those.
    8. The PCRE third party library needs to be built next. Download the latest PCRE source tarball, such as pcre-8.10.tar.bz2, from PCRE and place in the /usr/src/swig directory. Build PCRE as a static library using the Tools/pcre-build.sh script as follows:
      cd /usr/src/swig
      Tools/pcre-build.sh
      
    9. You are now ready to build SWIG. Execute the following commands to build swig.exe:
      cd /usr/src/swig
      ./autogen.sh
      ./configure
      make
      

    3.3.1.2 Building swig.exe using Cygwin

    Note that SWIG can also be built using Cygwin. However, SWIG will then require the Cygwin DLL when executing. Follow the Unix instructions in the README file in the SWIG root directory. Note that the Cygwin environment will also allow one to regenerate the autotool generated files which are supplied with the release distribution. These files are generated using the autogen.sh script and will only need regenerating in circumstances such as changing the build system.

    3.3.1.3 Building swig.exe alternatives

    If you don't want to install Cygwin or MinGW, use a different compiler to build SWIG. For example, all the source code files can be added to a Visual C++ project file in order to build swig.exe from the Visual C++ IDE.

    3.3.2 Running the examples on Windows using Cygwin

    The examples and test-suite work as successfully on Cygwin as on any other Unix operating system. The modules which are known to work are Python, Tcl, Perl, Ruby, Java and C#. Follow the Unix instructions in the README file in the SWIG root directory to build the examples.

    3.4 Microsoft extensions and other Windows quirks

    A common problem when using SWIG on Windows are the Microsoft function calling conventions which are not in the C++ standard. SWIG parses ISO C/C++ so cannot deal with proprietary conventions such as __declspec(dllimport), __stdcall etc. There is a Windows interface file, windows.i, to deal with these calling conventions though. The file also contains typemaps for handling commonly used Windows specific types such as __int64, BOOL, DWORD etc. Include it like you would any other interface file, for example:

    %include <windows.i>
    
    __declspec(dllexport) ULONG __stdcall foo(DWORD, __int32);
    

    Note that if you follow Microsoft's recommendation of wrapping the __declspec calls in a preprocessor definition, you will need to make sure that the definition is included by SWIG as well, by either defining it manually or via a header. For example, if you have specified the preprocessor definition in a header named export_lib.h and include other headers which depend on it, you should use the %include directive to include the definition explicitly. For example, if you had a header file, bar.h, which depended on export_lib.h, your SWIG definition file might look like:

    // bar.i
    %module bar
    %include <windows.i>
    %include "export_lib.h"
    %include "bar.h"
    

    where export_lib.h may contain:

    // export_lib.h
    #define BAR_API __declspec(dllexport)
    

    and bar.h may look like:

    // bar.h
    #include "export_lib.h"
    BAR_API void bar_function(int, double);
    

    Using the preprocessor to remove BAR_API is a popular simpler solution:

    // bar.i
    %module bar
    #define BAR_API
    %include "bar.h"
    
    swig-4.0.2/Doc/Manual/CPlusPlus14.html0000644000175000017500000000275313667507562017243 0ustar williamwilliam SWIG and C++14

    8 SWIG and C++14

    8.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++14 standard. There isn't much in C++14 that affects SWIG, however, work has only just begun on adding C++14 support.

    Compatibility note: SWIG-4.0.0 is the first version to support any C++14 features.

    8.2 Core language changes

    8.2.1 Binary integer literals

    C++14 added binary integer literals and SWIG supports these. Example:

    int b = 0b101011;
    

    8.3 Standard library changes

    swig-4.0.2/Doc/Manual/SWIGDocumentation.html0000644000175000017500001102616613667507574020520 0ustar williamwilliam SWIG-4.0 Documentation
    SWIG-4.0 Documentation

    SWIG-4.0 Documentation



    Table of Contents



    SWIG-4.0 Documentation 1 Preface 2 Introduction 3 Getting started on Windows 4 Scripting Languages 5 SWIG Basics 6 SWIG and C++ 7 SWIG and C++11 8 SWIG and C++14 9 SWIG and C++17 10 Preprocessing 11 SWIG library 12 Argument Handling 13 Typemaps 14 Customization Features 15 Contracts 16 Variable Length Arguments 17 SWIG and Doxygen Translation 18 Warning Messages 19 Working with Modules 20 Using SWIG with ccache - ccache-swig(1) manpage 21 SWIG and Android 22 SWIG and C# 23 SWIG and D 24 SWIG and Go 25 SWIG and Guile 26 SWIG and Java 27 SWIG and Javascript 28 SWIG and Lua 29 SWIG and Octave 30 SWIG and Perl5 31 SWIG and PHP 32 SWIG and Python 33 SWIG and R 34 SWIG and Ruby 35 SWIG and Scilab 36 SWIG and Tcl 37 SWIG and MzScheme/Racket 38 SWIG and OCaml 39 Extending SWIG to support new languages

    SWIG-4.0 Documentation

    Last update : SWIG-4.0.2 (8 Jun 2020)

    Sections

    SWIG Core Documentation

    Supported Language Modules Documentation

    Experimental Language Modules Documentation

    Developer Documentation


    1 Preface

    1.1 Introduction

    SWIG (Simplified Wrapper and Interface Generator) is a software development tool for building scripting language interfaces to C and C++ programs. Originally developed in 1995, SWIG was first used by scientists in the Theoretical Physics Division at Los Alamos National Laboratory for building user interfaces to simulation codes running on the Connection Machine 5 supercomputer. In this environment, scientists needed to work with huge amounts of simulation data, complex hardware, and a constantly changing code base. The use of a scripting language interface provided a simple yet highly flexible foundation for solving these types of problems. SWIG simplifies development by largely automating the task of scripting language integration--allowing developers and users to focus on more important problems.

    Although SWIG was originally developed for scientific applications, it has since evolved into a general purpose tool that is used in a wide variety of applications--in fact almost anything where C/C++ programming is involved.

    1.2 SWIG Versions

    In the late 1990's, the most stable version of SWIG was release 1.1p5. Versions 1.3.x were officially development versions and these were released over a period of 10 years starting from the year 2000. The final version in the 1.3.x series was 1.3.40, but in truth the 1.3.x series had been stable for many years. An official stable version was released along with the decision to make SWIG license changes and this gave rise to version 2.0.0 in 2010. Version 3.0.0 was released in 2014 focusing on adding C++11 support and C++ nested classes. Version 4.0.0 was released in 2019 to add in Doxygen support. Some target languages were disabled as part of a clean up and others were given a new status of either 'Supported' or 'Experimental'.

    1.3 SWIG License

    The LICENSE file shipped with SWIG in the top level directory contains the SWIG license. For further insight into the license including the license of SWIG's output code, please visit the SWIG legal page - http://www.swig.org/legal.html.

    The license was clarified in version 2.0.0 so that the code that SWIG generated could be distributed under license terms of the user's choice/requirements and at the same time the SWIG source was placed under the GNU General Public License version 3.

    1.4 SWIG resources

    The official location of SWIG related material is

    This site contains the latest version of the software, users guide, and information regarding bugs, installation problems, and implementation tricks.

    You can also subscribe to the swig-user mailing list by visiting the page

    The mailing list often discusses some of the more technical aspects of SWIG along with information about beta releases and future work.

    Git and Subversion access to the latest version of SWIG is also available. More information about this can be obtained at:

    1.5 Prerequisites

    This manual assumes that you know how to write C/C++ programs and that you have at least heard of scripting languages such as Tcl, Python, and Perl. A detailed knowledge of these scripting languages is not required although some familiarity won't hurt. No prior experience with building C extensions to these languages is required---after all, this is what SWIG does automatically. However, you should be reasonably familiar with the use of compilers, linkers, and makefiles since making scripting language extensions is somewhat more complicated than writing a normal C program.

    Over time SWIG releases have become significantly more capable in their C++ handling--especially support for advanced features like namespaces, overloaded operators, and templates. Whenever possible, this manual tries to cover the technicalities of this interface. However, this isn't meant to be a tutorial on C++ programming. For many of the gory details, you will almost certainly want to consult a good C++ reference. If you don't program in C++, you may just want to skip those parts of the manual.

    1.6 Organization of this manual

    The first few chapters of this manual describe SWIG in general and provide an overview of its capabilities. The remaining chapters are devoted to specific SWIG language modules and are self contained. Thus, if you are using SWIG to build Python interfaces, you can probably skip to that chapter and find almost everything you need to know.

    1.7 How to avoid reading the manual

    If you hate reading manuals, glance at the "Introduction" which contains a few simple examples. These examples contain about 95% of everything you need to know to use SWIG. After that, simply use the language-specific chapters as a reference. The SWIG distribution also comes with a large directory of examples that illustrate different topics.

    1.8 Backwards compatibility

    If you are a previous user of SWIG, don't expect SWIG to provide complete backwards compatibility. Although the developers strive to the utmost to keep backwards compatibility, this isn't always possible as the primary goal over time is to make SWIG better---a process that would simply be impossible if the developers are constantly bogged down with backwards compatibility issues. Potential incompatibilities are clearly marked in the detailed release notes.

    If you need to work with different versions of SWIG and backwards compatibility is an issue, you can use the SWIG_VERSION preprocessor symbol which holds the version of SWIG being executed. SWIG_VERSION is a hexadecimal integer such as 0x010311 (corresponding to SWIG-1.3.11). This can be used in an interface file to define different typemaps, take advantage of different features etc:

    #if SWIG_VERSION >= 0x010311
    /* Use some fancy new feature */
    #endif
    

    Note: The version symbol is not defined in the generated SWIG wrapper file. The SWIG preprocessor has defined SWIG_VERSION since SWIG-1.3.11.

    1.9 Release notes

    The CHANGES.current, CHANGES and RELEASENOTES files shipped with SWIG in the top level directory contain, respectively, detailed release notes for the current version, detailed release notes for previous releases and summary release notes from SWIG-1.3.22 onwards.

    1.10 Credits

    SWIG is an unfunded project that would not be possible without the contributions of many people working in their spare time. If you have benefitted from using SWIG, please consider Donating to SWIG to keep development going. There have been a large varied number of people who have made contributions at all levels over time. Contributors are mentioned either in the COPYRIGHT file or CHANGES files shipped with SWIG or in submitted bugs.

    1.11 Bug reports

    Although every attempt has been made to make SWIG bug-free, we are also trying to make feature improvements that may introduce bugs. To report a bug, either send mail to the SWIG developer list at the swig-devel mailing list or report a bug at the SWIG bug tracker. In your report, be as specific as possible, including (if applicable), error messages, tracebacks (if a core dump occurred), corresponding portions of the SWIG interface file used, and any important pieces of the SWIG generated wrapper code. We can only fix bugs if we know about them.

    1.12 Installation

    1.12.1 Windows installation

    Please see the dedicated Windows chapter for instructions on installing SWIG on Windows and running the examples. The Windows distribution is called swigwin and includes a prebuilt SWIG executable, swig.exe, included in the top level directory. Otherwise it is exactly the same as the main SWIG distribution. There is no need to download anything else.

    1.12.2 Unix installation

    These installation instructions are for using the distributed tarball, for example, swig-3.0.8.tar.gz. If you wish to build and install from source on Github, extra steps are required. Please see the Bleeding Edge page on the SWIG website.

    You must use GNU make to build and install SWIG.

    PCRE needs to be installed on your system to build SWIG, in particular pcre-config must be available. If you have PCRE headers and libraries but not pcre-config itself or, alternatively, wish to override the compiler or linker flags returned by pcre-config, you may set PCRE_LIBS and PCRE_CFLAGS variables to be used instead. And if you don't have PCRE at all, the configure script will provide instructions for obtaining it.

    To build and install SWIG, simply type the following:

    $ ./configure
    $ make
    $ make install
    

    By default SWIG installs itself in /usr/local. If you need to install SWIG in a different location or in your home directory, use the --prefix option to ./configure. For example:

    $ ./configure --prefix=/home/yourname/projects
    $ make
    $ make install
    

    Note: the directory given to --prefix must be an absolute pathname. Do not use the ~ shell-escape to refer to your home directory. SWIG won't work properly if you do this.

    The INSTALL file shipped in the top level directory details more about using configure. Also try

    $ ./configure --help.
    

    The configure script will attempt to locate various packages on your machine including Tcl, Perl5, Python and all the other target languages that SWIG supports. Don't panic if you get 'not found' messages -- SWIG does not need these packages to compile or run. The configure script is actually looking for these packages so that you can try out the SWIG examples contained in the 'Examples' directory without having to hack Makefiles. Note that the --without-xxx options, where xxx is a target language, have minimal effect. All they do is reduce the amount of testing done with 'make check'. The SWIG executable and library files installed cannot currently be configured with a subset of target languages.

    SWIG used to include a set of runtime libraries for some languages for working with multiple modules. These are no longer built during the installation stage. However, users can build them just like any wrapper module as described in the Modules chapter. The CHANGES file shipped with SWIG in the top level directory also lists some examples which build the runtime library.

    Note:

    • If you checked the code out via Git, you will have to run ./autogen.sh before ./configure. In addition, a full build of SWIG requires a number of packages to be installed. Full instructions at SWIG bleeding edge.

    1.12.3 Macintosh OS X installation

    SWIG is known to work on various flavors of OS X. Follow the Unix installation instructions above. However, as of this writing, there is still great deal of inconsistency with how shared libraries are handled by various scripting languages on OS X.

    Users of OS X should be aware that Darwin handles shared libraries and linking in a radically different way than most Unix systems. In order to test SWIG and run the examples, SWIG configures itself to use flat namespaces and to allow undefined symbols (-flat_namespace -undefined suppress). This mostly closely follows the Unix model and makes it more likely that the SWIG examples will work with whatever installation of software you might have. However, this is generally not the recommended technique for building larger extension modules. Instead, you should utilize Darwin's two-level namespaces. Some details about this can be found here Understanding Two-Level Namespaces.

    Needless to say, you might have to experiment a bit to get things working at first.

    1.12.4 Testing

    If you want to test SWIG after building it, a check can be performed on Unix operating systems. Type the following:

        $ make -k check
    

    This step can be performed either before or after installation. The check requires at least one of the target languages to be installed. If it fails, it may mean that you have an uninstalled language module or that the file 'Examples/Makefile' has been incorrectly configured. It may also fail due to compiler issues such as a broken C++ compiler. Even if the check fails, there is a pretty good chance SWIG still works correctly --- you will just have to mess around with one of the examples and some makefiles to get it to work. Some tests may also fail due to missing dependency packages, eg PCRE or Boost, but this will require careful analysis of the configure output done during configuration.

    The test suite executed by the check is designed to stress-test many parts of the implementation including obscure corner cases. If some of these tests fail or generate warning messages, there is no reason for alarm --- the test may be related to some new SWIG feature or a difficult bug that we're trying to resolve. Chances are that SWIG will work just fine for you. Note that if you have more than one CPU/core, then you can use parallel make to speed up the check as it does take quite some time to run, for example:

        $ make -j2 -k check
    

    Also, SWIG's support for C++ is sufficiently advanced that certain tests may fail on older C++ compilers (for instance if your compiler does not support member templates). These errors are harmless if you don't intend to use these features in your own programs.

    Note: The test-suite currently contains over 600 tests. If you have many different target languages installed and a slow machine, it might take more than an hour to run the test-suite.

    1.12.5 Examples

    The Examples directory contains a variety of examples of using SWIG and it has some browsable documentation. Simply point your browser to the file "Example/index.html".

    The Examples directory also includes Visual C++ project 6 (.dsp) files for building some of the examples on Windows. Later versions of Visual Studio will convert these old style project files into a current solution file.


    2 Introduction

    2.1 What is SWIG?

    SWIG is a software development tool that simplifies the task of interfacing different languages to C and C++ programs. In a nutshell, SWIG is a compiler that takes C/C++ declarations and creates the wrappers needed to access those declarations from other languages including Perl, Python, Tcl, Ruby, Guile, and Java. SWIG normally requires no modifications to existing code and can often be used to build a usable interface in only a few minutes. Possible applications of SWIG include:

    • Building interpreted interfaces to existing C programs.
    • Rapid prototyping and application development.
    • Interactive debugging.
    • Reengineering or refactoring of legacy software into scripting language components.
    • Making a graphical user interface (using Tk for example).
    • Testing of C libraries and programs (using scripts).
    • Building high performance C modules for scripting languages.
    • Making C programming more enjoyable (or tolerable depending on your point of view).
    • Impressing your friends.
    • Obtaining vast sums of research funding (although obviously not applicable to the author).

    SWIG was originally designed to make it extremely easy for scientists and engineers to build extensible scientific software without having to get a degree in software engineering. Because of this, the use of SWIG tends to be somewhat informal and ad-hoc (e.g., SWIG does not require users to provide formal interface specifications as you would find in a dedicated IDL compiler). Although this style of development isn't appropriate for every project, it is particularly well suited to software development in the small; especially the research and development work that is commonly found in scientific and engineering projects. However, nowadays SWIG is known to be used in many large open source and commercial projects.

    2.2 Why use SWIG?

    As stated in the previous section, the primary purpose of SWIG is to simplify the task of integrating C/C++ with other programming languages. However, why would anyone want to do that? To answer that question, it is useful to list a few strengths of C/C++ programming:

    • Excellent support for writing programming libraries.
    • High performance (number crunching, data processing, graphics, etc.).
    • Systems programming and systems integration.
    • Large user community and software base.

    Next, let's list a few problems with C/C++ programming

    • Writing a user interface is rather painful (i.e., consider programming with MFC, X11, GTK, or any number of other libraries).
    • Testing is time consuming (the compile/debug cycle).
    • Not easy to reconfigure or customize without recompilation.
    • Modularization can be tricky.
    • Security concerns (buffer overflows for instance).

    To address these limitations, many programmers have arrived at the conclusion that it is much easier to use different programming languages for different tasks. For instance, writing a graphical user interface may be significantly easier in a scripting language like Python or Tcl (consider the reasons why millions of programmers have used languages like Visual Basic if you need more proof). An interactive interpreter might also serve as a useful debugging and testing tool. Other languages like Java might greatly simplify the task of writing distributed computing software. The key point is that different programming languages offer different strengths and weaknesses. Moreover, it is extremely unlikely that any programming is ever going to be perfect. Therefore, by combining languages together, you can utilize the best features of each language and greatly simplify certain aspects of software development.

    From the standpoint of C/C++, a lot of people use SWIG because they want to break out of the traditional monolithic C programming model which usually results in programs that resemble this:

    • A collection of functions and variables that do something useful.
    • A main() program that starts everything.
    • A horrible collection of hacks that form some kind of user interface (but which no-one really wants to touch).

    Instead of going down that route, incorporating C/C++ into a higher level language often results in a more modular design, less code, better flexibility, and increased programmer productivity.

    SWIG tries to make the problem of C/C++ integration as painless as possible. This allows you to focus on the underlying C program and using the high-level language interface, but not the tedious and complex chore of making the two languages talk to each other. At the same time, SWIG recognizes that all applications are different. Therefore, it provides a wide variety of customization features that let you change almost every aspect of the language bindings. This is the main reason why SWIG has such a large user manual ;-).

    2.3 Target languages

    SWIG in essence is a tool to generate code for making C/C++ code available to various other programming languages. These higher level programming languages are the target languages for the SWIG code generator and C or C++ are the input languages. A single target language must be specified when SWIG is run. This results in generating code for C/C++ and the specified target language to interface with each other. SWIG can be invoked multiple times, but with a different target language specified on each invocation. This ability to interface C/C++ to many different target languages is one of SWIG's core strengths and features.

    SWIG is very broadly composed of two components. A core component creates a parse tree from the input ISO C/C++ and SWIG directives (extensions to the C/C++ standards). The parse tree is then passed to a second component, one of the target language modules for generating code specific to a higher level language. SWIG supports many different target languages. These target languages are given a status of either Supported or Experimental. This status is provided to indicate the level of maturity to expect when using a particular target language as not all target languages are fully developed.

    The second part of the SWIG documentation contains a chapter for each target level language. Each chapter will state the status (Supported or Experimental) for that language.

    2.3.1 Supported status

    A target language is given the 'Supported' status when

    • It is in a mature, well functioning state.
    • It has its own comprehensive chapter in the documentation.
    • It passes all of the main SWIG test-suite and has a range of working examples.
    • It supports the vast majority of SWIG features.
    • It provides strong backwards compatibility between releases.

    The above is a short summary and further details are outlined in the Supported status section in the Extending chapter. The good news is that all the well-known and most popular languages have this status.

    2.3.2 Experimental status

    A target language is given the 'Experimental' status when

    • It is of sub-standard quality, failing to meet the above 'Supported' status.
    • It is somewhere between the mid to mature stage of development.
    • It does not guarantee any backwards compatibility between releases.
    • It is in need of help to finish development.

    Anyone using an experimental target language is strongly urged to assist with development of the target language module if they wish to use it.

    SWIG displays a warning when an experimental target language is used in order to set expectations and emphasize the experimental status of the target language. The usual warning suppression techniques can be used if required.

    The above is a short summary and further details are outlined in the Experimental status section in the Extending chapter.

    2.4 A SWIG example

    The best way to illustrate SWIG is with a simple example. Consider the following C code:

    /* File : example.c */
    
    double My_variable = 3.0;
    
    /* Compute factorial of n */
    int fact(int n) {
      if (n <= 1)
        return 1;
      else
        return n*fact(n-1);
    }
    
    /* Compute n mod m */
    int my_mod(int n, int m) {
      return(n % m);
    }
    

    Suppose that you wanted to access these functions and the global variable My_variable from Tcl. You start by making a SWIG interface file as shown below (by convention, these files carry a .i suffix) :

    2.4.1 SWIG interface file

    /* File : example.i */
    %module example
    %{
    /* Put headers and other declarations here */
    extern double My_variable;
    extern int    fact(int);
    extern int    my_mod(int n, int m);
    %}
    
    extern double My_variable;
    extern int    fact(int);
    extern int    my_mod(int n, int m);
    

    The interface file contains ISO C function prototypes and variable declarations. The %module directive defines the name of the module that will be created by SWIG. The %{ %} block provides a location for inserting additional code, such as C header files or additional C declarations, into the generated C wrapper code.

    2.4.2 The swig command

    SWIG is invoked using the swig command. We can use this to build a Tcl module (under Linux) as follows :

    unix > swig -tcl example.i
    unix > gcc -c -fpic example.c example_wrap.c -I/usr/local/include
    unix > gcc -shared example.o example_wrap.o -o example.so
    unix > tclsh
    % load ./example.so
    % fact 4
    24
    % my_mod 23 7
    2
    % expr $My_variable + 4.5
    7.5
    %
    

    The swig command produced a new file called example_wrap.c that should be compiled along with the example.c file. Most operating systems and scripting languages now support dynamic loading of modules. In our example, our Tcl module has been compiled into a shared library that can be loaded into Tcl. When loaded, Tcl can now access the functions and variables declared in the SWIG interface. A look at the file example_wrap.c reveals a hideous mess. However, you almost never need to worry about it.

    2.4.3 Building a Perl5 module

    Now, let's turn these functions into a Perl5 module. Without making any changes type the following (shown for Solaris):

    unix > swig -perl5 example.i
    unix > gcc -c example.c example_wrap.c \
            -I/usr/local/lib/perl5/sun4-solaris/5.003/CORE
    unix > ld -G example.o example_wrap.o -o example.so # This is for Solaris
    unix > perl5.003
    use example;
    print example::fact(4), "\n";
    print example::my_mod(23, 7), "\n";
    print $example::My_variable + 4.5, "\n";
    <ctrl-d>
    24
    2
    7.5
    unix >
    

    2.4.4 Building a Python module

    Finally, let's build a module for Python (shown for Irix).

    unix > swig -python example.i
    unix > gcc -c -fpic example.c example_wrap.c -I/usr/local/include/python2.0
    unix > gcc -shared example.o example_wrap.o -o _example.so
    unix > python
    Python 2.0 (#6, Feb 21 2001, 13:29:45)
    [GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2
    Type "copyright", "credits" or "license" for more information.     
    >>> import example
    >>> example.fact(4)
    24
    >>> example.my_mod(23, 7)
    2
    >>> example.cvar.My_variable + 4.5
    7.5
    

    2.4.5 Shortcuts

    To the truly lazy programmer, one may wonder why we needed the extra interface file at all. As it turns out, you can often do without it. For example, you could also build a Perl5 module by just running SWIG on the C header file and specifying a module name as follows

    unix > swig -perl5 -module example example.h
    unix > gcc -c example.c example_wrap.c \
            -I/usr/local/lib/perl5/sun4-solaris/5.003/CORE
    unix > ld -G example.o example_wrap.o -o example.so
    unix > perl5.003
    use example;
    print example::fact(4), "\n";
    print example::my_mod(23, 7), "\n";
    print $example::My_variable + 4.5, "\n";
    <ctrl-d>
    24
    2
    7.5
    

    2.5 Supported C/C++ language features

    A primary goal of the SWIG project is to make the language binding process extremely easy. Although a few simple examples have been shown, SWIG is quite capable in supporting most of C++. Some of the major features include:

    • Full C99 preprocessing.
    • All ISO C and C++ datatypes.
    • Functions, variables, and constants.
    • Classes.
    • Single and multiple inheritance.
    • Overloaded functions and methods.
    • Overloaded operators.
    • C++ templates (including member templates, specialization, and partial specialization).
    • Namespaces.
    • Variable length arguments.
    • C++ smart pointers.

    Most of C++11 is also supported. Details are in the C++11 chapter. C++14 support is covered in the C++14 chapter. C++17 support is covered in the C++17 chapter.

    It is important to stress that SWIG is not a simplistic C++ lexing tool like several apparently similar wrapper generation tools. SWIG not only parses C++, it implements the full C++ type system and it is able to understand C++ semantics. SWIG generates its wrappers with full knowledge of this information. As a result, you will find SWIG to be just as capable of dealing with nasty corner cases as it is in wrapping simple C++ code. In fact, SWIG is able to handle C++ code that stresses the very limits of many C++ compilers.

    2.6 Non-intrusive interface building

    When used as intended, SWIG requires minimal (if any) modification to existing C or C++ code. This makes SWIG extremely easy to use with existing packages and promotes software reuse and modularity. By making the C/C++ code independent of the high level interface, you can change the interface and reuse the code in other applications. It is also possible to support different types of interfaces depending on the application.

    2.7 Incorporating SWIG into a build system

    SWIG is a command line tool and as such can be incorporated into any build system that supports invoking external tools/compilers. SWIG is most commonly invoked from within a Makefile, but is also known to be invoked from popular IDEs such as Microsoft Visual Studio.

    If you are using the GNU Autotools ( Autoconf/ Automake / Libtool) to configure SWIG use in your project, the SWIG Autoconf macros can be used. The primary macro is ax_pkg_swig, see http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html#ax_pkg_swig . The ax_python_devel macro is also helpful for generating Python extensions. See the Autoconf Archive for further information on this and other Autoconf macros.

    There is growing support for SWIG in some build tools, for example CMake is a cross-platform, open-source build manager with built in support for SWIG. CMake can detect the SWIG executable and many of the target language libraries for linking against. CMake knows how to build shared libraries and loadable modules on many different operating systems. This allows easy cross platform SWIG development. It can also generate the custom commands necessary for driving SWIG from IDEs and makefiles. All of this can be done from a single cross platform input file. The following example is a CMake input file for creating a Python wrapper for the SWIG interface file, example.i:

    
    # This is a CMake example for Python
    
    FIND_PACKAGE(SWIG REQUIRED)
    INCLUDE(${SWIG_USE_FILE})
    
    FIND_PACKAGE(PythonLibs)
    INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
    
    INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
    
    SET(CMAKE_SWIG_FLAGS "")
    
    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES CPLUSPLUS ON)
    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES SWIG_FLAGS "-includeall")
    SWIG_ADD_MODULE(example python example.i example.cxx)
    SWIG_LINK_LIBRARIES(example ${PYTHON_LIBRARIES})
    
    

    The above example will generate native build files such as makefiles, nmake files and Visual Studio projects which will invoke SWIG and compile the generated C++ files into _example.so (UNIX) or _example.pyd (Windows). For other target languages on Windows a dll, instead of a .pyd file, is usually generated.

    2.8 Hands off code generation

    SWIG is designed to produce working code that needs no hand-modification (in fact, if you look at the output, you probably won't want to modify it). You should think of your target language interface being defined entirely by the input to SWIG, not the resulting output file. While this approach may limit flexibility for hard-core hackers, it allows others to forget about the low-level implementation details.

    2.9 SWIG and freedom

    No, this isn't a special section on the sorry state of world politics. However, it may be useful to know that SWIG was written with a certain "philosophy" about programming---namely that programmers are smart and that tools should just stay out of their way. Because of that, you will find that SWIG is extremely permissive in what it lets you get away with. In fact, you can use SWIG to go well beyond "shooting yourself in the foot" if dangerous programming is your goal. On the other hand, this kind of freedom may be exactly what is needed to work with complicated and unusual C/C++ applications.

    Ironically, the freedom that SWIG provides is countered by an extremely conservative approach to code generation. At its core, SWIG tries to distill even the most advanced C++ code down to a small well-defined set of interface building techniques based on ISO C programming. Because of this, you will find that SWIG interfaces can be easily compiled by virtually every C/C++ compiler and that they can be used on any platform. Again, this is an important part of staying out of the programmer's way----the last thing any developer wants to do is to spend their time debugging the output of a tool that relies on non-portable or unreliable programming features. Dependencies are often a source of incompatibilities and problems and so additional third party libraries are not used in the generated code. SWIG will also generally avoid generating code that introduces a dependency on the C++ Standard Template Library (STL). SWIG will generate code that depends on the C libraries though.


    3 Getting started on Windows

    This chapter describes SWIG usage on Microsoft Windows. Installing SWIG and running the examples is covered as well as building the SWIG executable. Usage within the Unix like environments MinGW and Cygwin is also detailed.

    3.1 Installation on Windows

    SWIG does not come with the usual Windows type installation program, however it is quite easy to get started. The main steps are:

    • Download the swigwin zip package from the SWIG website and unzip into a directory. This is all that needs downloading for the Windows platform.
    • Set environment variables as described in the SWIG Windows Examples section in order to run examples using Visual C++.

    3.1.1 Windows Executable

    The swigwin distribution contains the SWIG Windows 32-bit executable, swig.exe, which will run on both 32-bit and 64-bit versions of Windows. If you want to build your own swig.exe have a look at Building swig.exe on Windows.

    3.2 SWIG Windows Examples

    Using Microsoft Visual C++ is the most common approach to compiling and linking SWIG's output. The Examples directory has a few Visual C++ project files (.dsp files). These were produced by Visual C++ 6. Newer versions of Visual Studio should be able to open and convert these project files. Each C# example comes with a Visual Studio 2005 solution and associated project files instead of Visual C++ 6 project files. The project files have been set up to execute SWIG in a custom build rule for the SWIG interface (.i) file. Alternatively run the examples using Cygwin.

    More information on each of the examples is available with the examples distributed with SWIG (Examples/index.html).

    3.2.1 Instructions for using the Examples with Visual Studio

    Ensure the SWIG executable is as supplied in the SWIG root directory in order for the examples to work. Most languages require some environment variables to be set before running Visual C++. Note that Visual C++ must be re-started to pick up any changes in environment variables. Open up an example .dsp file, Visual C++ will create a workspace for you (.dsw file). Ensure the Release build is selected then do a Rebuild All from the Build menu. The required environment variables are displayed with their current values.

    The list of required environment variables for each module language is also listed below. They are usually set from the Control Panel and System properties, but this depends on which flavour of Windows you are running. If you don't want to use environment variables then change all occurrences of the environment variables in the .dsp files with hard coded values. If you are interested in how the project files are set up there is explanatory information in some of the language module's documentation.

    3.2.1.1 C#

    The C# examples do not require any environment variables to be set as a C# project file is included. Just open up the .sln solution file in Visual Studio .NET 2003 or later, select Release Build, and do a Rebuild All from the Build menu. The accompanying C# and C++ project files are automatically used by the solution file.

    3.2.1.2 Java

    JAVA_INCLUDE : Set this to the directory containing jni.h
    JAVA_BIN : Set this to the bin directory containing javac.exe

    Example using JDK1.3:
    JAVA_INCLUDE: D:\jdk1.3\include
    JAVA_BIN: D:\jdk1.3\bin

    3.2.1.3 Perl

    PERL5_INCLUDE : Set this to the directory containing perl.h
    PERL5_LIB : Set this to the Perl library including path for linking

    Example using nsPerl 5.004_04:

    PERL5_INCLUDE: D:\nsPerl5.004_04\lib\CORE
    PERL5_LIB: D:\nsPerl5.004_04\lib\CORE\perl.lib

    3.2.1.4 Python

    PYTHON_INCLUDE : Set this to the directory that contains Python.h
    PYTHON_LIB : Set this to the Python library including path for linking

    Example using Python 2.1.1:
    PYTHON_INCLUDE: D:\python21\include
    PYTHON_LIB: D:\python21\libs\python21.lib

    3.2.1.5 TCL

    TCL_INCLUDE : Set this to the directory containing tcl.h
    TCL_LIB : Set this to the TCL library including path for linking

    Example using ActiveTcl 8.3.3.3
    TCL_INCLUDE: D:\tcl\include
    TCL_LIB: D:\tcl\lib\tcl83.lib

    3.2.1.6 R

    R_INCLUDE : Set this to the directory containing R.h
    R_LIB : Set this to the R library (Rdll.lib) including path for linking. The library needs to be built as described in the R README.packages file (the pexports.exe approach is the easiest).

    Example using R 2.5.1:
    R_INCLUDE: C:\Program Files\R\R-2.5.1\include
    R_LIB: C:\Program Files\R\R-2.5.1\bin\Rdll.lib

    3.2.1.7 Ruby

    RUBY_INCLUDE : Set this to the directory containing ruby.h
    RUBY_LIB : Set this to the ruby library including path for linking

    Example using Ruby 1.6.4:
    RUBY_INCLUDE: D:\ruby\lib\ruby\1.6\i586-mswin32
    RUBY_LIB: D:\ruby\lib\mswin32-ruby16.lib

    3.2.2 Instructions for using the Examples with other compilers

    If you do not have access to Visual C++ you will have to set up project files / Makefiles for your chosen compiler. There is a section in each of the language modules detailing what needs setting up using Visual C++ which may be of some guidance. Alternatively you may want to use Cygwin as described in the following section.

    3.3 SWIG on Cygwin and MinGW

    SWIG can also be compiled and run using Cygwin or MinGW which provides a Unix like front end to Windows and comes free with gcc, an ISO C/C++ compiler. However, this is not a recommended approach as the prebuilt executable is supplied.

    3.3.1 Building swig.exe on Windows

    If you want to replicate the build of swig.exe that comes with the download, follow the MinGW instructions below. This is not necessary to use the supplied swig.exe. This information is provided for those that want to modify the SWIG source code in a Windows environment. Normally this is not needed, so most people will want to ignore this section.

    3.3.1.1 Building swig.exe using MinGW and MSYS

    The short abbreviated instructions follow...

    • Install MinGW and MSYS from the MinGW site. This provides a Unix environment on Windows.
    • Follow the usual Unix instructions in the README file in the SWIG root directory to build swig.exe from the MinGW command prompt.

    The step by step instructions to download and install MinGW and MSYS, then download and build the latest version of SWIG from Github follow... Note that the instructions for obtaining SWIG from Github are also online at SWIG Bleeding Edge.

    Pitfall note: Execute the steps in the order shown and don't use spaces in path names. In fact it is best to use the default installation directories.

    1. Download the following packages from the MinGW download page or MinGW SourceForge download page. Note that at the time of writing, the majority of these are in the Current release list and some are in the Snapshot or Previous release list.
      • MinGW-3.1.0-1.exe
      • MSYS-1.0.11-2004.04.30-1.exe
      • msysDTK-1.0.1.exe
      • bison-2.0-MSYS.tar.gz
      • msys-autoconf-2.59.tar.bz2
      • msys-automake-1.8.2.tar.bz2
    2. Install MinGW-3.1.0-1.exe (C:\MinGW is default location.)
    3. Install MSYS-1.0.11-2004.04.30-1.exe. Make sure you install it on the same windows drive letter as MinGW (C:\msys\1.0 is default). In the post install script,
      • Answer y to the "do you wish to continue with the post install?"
      • Answer y to the "do you have MinGW installed?"
      • Type in the folder in which you installed MinGW (C:/MinGW is default)
    4. Install msysDTK-1.0.1.exe to the same folder that you installed MSYS (C:\msys\1.0 is default).
    5. Copy the following to the MSYS install folder (C:\msys\1.0 is default):
      • msys-automake-1.8.2.tar.bz2
      • msys-autoconf-2.59.tar.bz2
      • bison-2.0-MSYS.tar.gz
    6. Start the MSYS command prompt and execute:
      cd /
      tar -jxf msys-automake-1.8.2.tar.bz2
      tar -jxf msys-autoconf-2.59.tar.bz2
      tar -zxf bison-2.0-MSYS.tar.gz
      
    7. The very latest development version of SWIG is available from SWIG on Github and can be downloaded as a zip file or if you have Git installed, via Git. Either download the latest Zip file snapshot and unzip and rename the top level folder to /usr/src/swig. Otherwise if using Git, type in the following:
      mkdir /usr/src
      cd /usr/src
      git clone https://github.com/swig/swig.git
      
      Pitfall note: If you want to place SWIG in a different folder to the proposed /usr/src/swig, do not use MSYS emulated windows drive letters, because the autotools will fail miserably on those.
    8. The PCRE third party library needs to be built next. Download the latest PCRE source tarball, such as pcre-8.10.tar.bz2, from PCRE and place in the /usr/src/swig directory. Build PCRE as a static library using the Tools/pcre-build.sh script as follows:
      cd /usr/src/swig
      Tools/pcre-build.sh
      
    9. You are now ready to build SWIG. Execute the following commands to build swig.exe:
      cd /usr/src/swig
      ./autogen.sh
      ./configure
      make
      

    3.3.1.2 Building swig.exe using Cygwin

    Note that SWIG can also be built using Cygwin. However, SWIG will then require the Cygwin DLL when executing. Follow the Unix instructions in the README file in the SWIG root directory. Note that the Cygwin environment will also allow one to regenerate the autotool generated files which are supplied with the release distribution. These files are generated using the autogen.sh script and will only need regenerating in circumstances such as changing the build system.

    3.3.1.3 Building swig.exe alternatives

    If you don't want to install Cygwin or MinGW, use a different compiler to build SWIG. For example, all the source code files can be added to a Visual C++ project file in order to build swig.exe from the Visual C++ IDE.

    3.3.2 Running the examples on Windows using Cygwin

    The examples and test-suite work as successfully on Cygwin as on any other Unix operating system. The modules which are known to work are Python, Tcl, Perl, Ruby, Java and C#. Follow the Unix instructions in the README file in the SWIG root directory to build the examples.

    3.4 Microsoft extensions and other Windows quirks

    A common problem when using SWIG on Windows are the Microsoft function calling conventions which are not in the C++ standard. SWIG parses ISO C/C++ so cannot deal with proprietary conventions such as __declspec(dllimport), __stdcall etc. There is a Windows interface file, windows.i, to deal with these calling conventions though. The file also contains typemaps for handling commonly used Windows specific types such as __int64, BOOL , DWORD etc. Include it like you would any other interface file, for example:

    %include <windows.i>
    
    __declspec(dllexport) ULONG __stdcall foo(DWORD, __int32);
    

    Note that if you follow Microsoft's recommendation of wrapping the __declspec calls in a preprocessor definition, you will need to make sure that the definition is included by SWIG as well, by either defining it manually or via a header. For example, if you have specified the preprocessor definition in a header named export_lib.h and include other headers which depend on it, you should use the %include directive to include the definition explicitly. For example, if you had a header file, bar.h, which depended on export_lib.h, your SWIG definition file might look like:

    // bar.i
    %module bar
    %include <windows.i>
    %include "export_lib.h"
    %include "bar.h"
    

    where export_lib.h may contain:

    // export_lib.h
    #define BAR_API __declspec(dllexport)
    

    and bar.h may look like:

    // bar.h
    #include "export_lib.h"
    BAR_API void bar_function(int, double);
    

    Using the preprocessor to remove BAR_API is a popular simpler solution:

    // bar.i
    %module bar
    #define BAR_API
    %include "bar.h"
    

    4 Scripting Languages

    This chapter provides a brief overview of scripting language extension programming and the mechanisms by which scripting language interpreters access C and C++ code.

    4.1 The two language view of the world

    When a scripting language is used to control a C program, the resulting system tends to look as follows:

    Scripting language input - C/C++ functions output

    In this programming model, the scripting language interpreter is used for high level control whereas the underlying functionality of the C/C++ program is accessed through special scripting language "commands." If you have ever tried to write your own simple command interpreter, you might view the scripting language approach to be a highly advanced implementation of that. Likewise, If you have ever used a package such as MATLAB or IDL, it is a very similar model--the interpreter executes user commands and scripts. However, most of the underlying functionality is written in a low-level language like C or Fortran.

    The two-language model of computing is extremely powerful because it exploits the strengths of each language. C/C++ can be used for maximal performance and complicated systems programming tasks. Scripting languages can be used for rapid prototyping, interactive debugging, scripting, and access to high-level data structures such associative arrays.

    4.2 How does a scripting language talk to C?

    Scripting languages are built around a parser that knows how to execute commands and scripts. Within this parser, there is a mechanism for executing commands and accessing variables. Normally, this is used to implement the builtin features of the language. However, by extending the interpreter, it is usually possible to add new commands and variables. To do this, most languages define a special API for adding new commands. Furthermore, a special foreign function interface defines how these new commands are supposed to hook into the interpreter.

    Typically, when you add a new command to a scripting interpreter you need to do two things; first you need to write a special "wrapper" function that serves as the glue between the interpreter and the underlying C function. Then you need to give the interpreter information about the wrapper by providing details about the name of the function, arguments, and so forth. The next few sections illustrate the process.

    4.2.1 Wrapper functions

    Suppose you have an ordinary C function like this :

    int fact(int n) {
      if (n <= 1)
        return 1;
      else
        return n*fact(n-1);
    }
    

    In order to access this function from a scripting language, it is necessary to write a special "wrapper" function that serves as the glue between the scripting language and the underlying C function. A wrapper function must do three things :

    • Gather function arguments and make sure they are valid.
    • Call the C function.
    • Convert the return value into a form recognized by the scripting language.

    As an example, the Tcl wrapper function for the fact() function above example might look like the following :

    int wrap_fact(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
      int result;
      int arg0;
      if (argc != 2) {
        interp->result = "wrong # args";
        return TCL_ERROR;
      }
      arg0 = atoi(argv[1]);
      result = fact(arg0);
      sprintf(interp->result, "%d", result);
      return TCL_OK;
    }
    
    

    Once you have created a wrapper function, the final step is to tell the scripting language about the new function. This is usually done in an initialization function called by the language when the module is loaded. For example, adding the above function to the Tcl interpreter requires code like the following :

    int Wrap_Init(Tcl_Interp *interp) {
      Tcl_CreateCommand(interp, "fact", wrap_fact, (ClientData) NULL,
                        (Tcl_CmdDeleteProc *) NULL);
      return TCL_OK;
    }
    

    When executed, Tcl will now have a new command called "fact " that you can use like any other Tcl command.

    Although the process of adding a new function to Tcl has been illustrated, the procedure is almost identical for Perl and Python. Both require special wrappers to be written and both need additional initialization code. Only the specific details are different.

    4.2.2 Variable linking

    Variable linking refers to the problem of mapping a C/C++ global variable to a variable in the scripting language interpreter. For example, suppose you had the following variable:

    double Foo = 3.5;
    

    It might be nice to access it from a script as follows (shown for Perl):

    $a = $Foo * 2.3;   # Evaluation
    $Foo = $a + 2.0;   # Assignment
    

    To provide such access, variables are commonly manipulated using a pair of get/set functions. For example, whenever the value of a variable is read, a "get" function is invoked. Similarly, whenever the value of a variable is changed, a "set" function is called.

    In many languages, calls to the get/set functions can be attached to evaluation and assignment operators. Therefore, evaluating a variable such as $Foo might implicitly call the get function. Similarly, typing $Foo = 4 would call the underlying set function to change the value.

    4.2.3 Constants

    In many cases, a C program or library may define a large collection of constants. For example:

    #define RED   0xff0000
    #define BLUE  0x0000ff
    #define GREEN 0x00ff00
    

    To make constants available, their values can be stored in scripting language variables such as $RED, $BLUE, and $GREEN. Virtually all scripting languages provide C functions for creating variables so installing constants is usually a trivial exercise.

    4.2.4 Structures and classes

    Although scripting languages have no trouble accessing simple functions and variables, accessing C/C++ structures and classes present a different problem. This is because the implementation of structures is largely related to the problem of data representation and layout. Furthermore, certain language features are difficult to map to an interpreter. For instance, what does C++ inheritance mean in a Perl interface?

    The most straightforward technique for handling structures is to implement a collection of accessor functions that hide the underlying representation of a structure. For example,

    struct Vector {
      Vector();
      ~Vector();
      double x, y, z;
    };
    
    

    can be transformed into the following set of functions :

    Vector *new_Vector();
    void delete_Vector(Vector *v);
    double Vector_x_get(Vector *v);
    double Vector_y_get(Vector *v);
    double Vector_z_get(Vector *v);
    void Vector_x_set(Vector *v, double x);
    void Vector_y_set(Vector *v, double y);
    void Vector_z_set(Vector *v, double z);
    
    

    Now, from an interpreter these function might be used as follows:

    % set v [new_Vector]
    % Vector_x_set $v 3.5
    % Vector_y_get $v
    % delete_Vector $v
    % ...
    

    Since accessor functions provide a mechanism for accessing the internals of an object, the interpreter does not need to know anything about the actual representation of a Vector.

    4.2.5 Proxy classes

    In certain cases, it is possible to use the low-level accessor functions to create a proxy class, also known as a shadow class. A proxy class is a special kind of object that gets created in a scripting language to access a C/C++ class (or struct) in a way that looks like the original structure (that is, it proxies the real C++ class). For example, if you have the following C++ definition :

    class Vector {
    public:
      Vector();
      ~Vector();
      double x, y, z;
    };
    

    A proxy classing mechanism would allow you to access the structure in a more natural manner from the interpreter. For example, in Python, you might want to do this:

    >>> v = Vector()
    >>> v.x = 3
    >>> v.y = 4
    >>> v.z = -13
    >>> ...
    >>> del v
    

    Similarly, in Perl5 you may want the interface to work like this:

    $v = new Vector;
    $v->{x} = 3;
    $v->{y} = 4;
    $v->{z} = -13;
    
    

    Finally, in Tcl :

    Vector v
    v configure -x 3 -y 4 -z -13
    
    

    When proxy classes are used, two objects are really at work--one in the scripting language, and an underlying C/C++ object. Operations affect both objects equally and for all practical purposes, it appears as if you are simply manipulating a C/C++ object.

    4.3 Building scripting language extensions

    The final step in using a scripting language with your C/C++ application is adding your extensions to the scripting language itself. There are two primary approaches for doing this. The preferred technique is to build a dynamically loadable extension in the form of a shared library. Alternatively, you can recompile the scripting language interpreter with your extensions added to it.

    4.3.1 Shared libraries and dynamic loading

    To create a shared library or DLL, you often need to look at the manual pages for your compiler and linker. However, the procedure for a few common platforms is shown below:

    # Build a shared library for Solaris
    gcc -fpic -c example.c example_wrap.c -I/usr/local/include
    ld -G example.o example_wrap.o -o example.so
    
    # Build a shared library for Linux
    gcc -fpic -c example.c example_wrap.c -I/usr/local/include
    gcc -shared example.o example_wrap.o -o example.so
    

    To use your shared library, you simply use the corresponding command in the scripting language (load, import, use, etc...). This will import your module and allow you to start using it. For example:

    % load ./example.so
    % fact 4
    24
    %
    

    When working with C++ codes, the process of building shared libraries may be more complicated--primarily due to the fact that C++ modules may need additional code in order to operate correctly. On many machines, you can build a shared C++ module by following the above procedures, but changing the link line to the following :

    c++ -shared example.o example_wrap.o -o example.so
    

    4.3.2 Linking with shared libraries

    When building extensions as shared libraries, it is not uncommon for your extension to rely upon other shared libraries on your machine. In order for the extension to work, it needs to be able to find all of these libraries at run-time. Otherwise, you may get an error such as the following :

    >>> import graph
    Traceback (innermost last):
      File "<stdin>", line 1, in ?
      File "/home/sci/data1/beazley/graph/graph.py", line 2, in ?
        import graphc
    ImportError:  1101:/home/sci/data1/beazley/bin/python: rld: Fatal Error: cannot 
    successfully map soname 'libgraph.so' under any of the filenames /usr/lib/libgraph.so:/
    lib/libgraph.so:/lib/cmplrs/cc/libgraph.so:/usr/lib/cmplrs/cc/libgraph.so:
    >>>
    

    What this error means is that the extension module created by SWIG depends upon a shared library called "libgraph.so" that the system was unable to locate. To fix this problem, there are a few approaches you can take.

    • Link your extension and explicitly tell the linker where the required libraries are located. Often times, this can be done with a special linker flag such as -R, -rpath, etc. This is not implemented in a standard manner so read the man pages for your linker to find out more about how to set the search path for shared libraries.
    • Put shared libraries in the same directory as the executable. This technique is sometimes required for correct operation on non-Unix platforms.
    • Set the UNIX environment variable LD_LIBRARY_PATH to the directory where shared libraries are located before running Python. Although this is an easy solution, it is not recommended. Consider setting the path using linker options instead.

    4.3.3 Static linking

    With static linking, you rebuild the scripting language interpreter with extensions. The process usually involves compiling a short main program that adds your customized commands to the language and starts the interpreter. You then link your program with a library to produce a new scripting language executable.

    Although static linking is supported on all platforms, this is not the preferred technique for building scripting language extensions. In fact, there are very few practical reasons for doing this--consider using shared libraries instead.


    5 SWIG Basics

    This chapter describes the basic operation of SWIG, the structure of its input files, and how it handles standard ISO C declarations. C++ support is described in the next chapter. However, C++ programmers should still read this chapter to understand the basics. Specific details about each target language are described in later chapters.

    5.1 Running SWIG

    To run SWIG, use the swig command with options and a filename like this:

    swig [ options ] filename
    

    where filename is a SWIG interface file or a C/C++ header file. Full help can be seen by running swig -help. Below is the common set of options that can be used. Additional options are also defined for each target language. A full list can be obtained by running swig -<lang> -help for language <lang> specific options, for example, swig -ruby -help for Ruby.

    Supported Target Language Options
         -csharp         - Generate C# wrappers
         -d              - Generate D wrappers
         -go             - Generate Go wrappers
         -guile          - Generate Guile wrappers
         -java           - Generate Java wrappers
         -javascript     - Generate Javascript wrappers
         -lua            - Generate Lua wrappers
         -octave         - Generate Octave wrappers
         -perl5          - Generate Perl 5 wrappers
         -php7           - Generate PHP 7 wrappers
         -python         - Generate Python wrappers
         -r              - Generate R (aka GNU S) wrappers
         -ruby           - Generate Ruby wrappers
         -scilab         - Generate Scilab wrappers
         -tcl8           - Generate Tcl 8 wrappers
         -xml            - Generate XML wrappers
    
    Experimental Target Language Options
         -mzscheme       - Generate MzScheme/Racket wrappers
         -ocaml          - Generate OCaml wrappers
    
    General Options
         -addextern      - Add extra extern declarations
         -c++            - Enable C++ processing
         -co <file>      - Check <file> out of the SWIG library
         -copyctor       - Automatically generate copy constructors wherever possible
         -cpperraswarn   - Treat the preprocessor #error statement as #warning (default)
         -cppext <ext>   - Change file extension of generated C++ files to <ext>
                           (default is cxx)
         -copyright      - Display copyright notices
         -debug-classes  - Display information about the classes found in the interface
         -debug-module <n>- Display module parse tree at stages 1-4, <n> is a csv list of stages
         -debug-symtabs  - Display symbol tables information
         -debug-symbols  - Display target language symbols in the symbol tables
         -debug-csymbols - Display C symbols in the symbol tables
         -debug-lsymbols - Display target language layer symbols
         -debug-tags     - Display information about the tags found in the interface
         -debug-template - Display information for debugging templates
         -debug-top <n>  - Display entire parse tree at stages 1-4, <n> is a csv list of stages
         -debug-typedef  - Display information about the types and typedefs in the interface
         -debug-typemap  - Display typemap debugging information
         -debug-tmsearch - Display typemap search debugging information
         -debug-tmused   - Display typemaps used debugging information
         -directors      - Turn on director mode for all the classes, mainly for testing
         -dirprot        - Turn on wrapping of protected members for director classes (default)
         -D<symbol>      - Define a symbol <symbol> (for conditional compilation)
         -E              - Preprocess only, does not generate wrapper code
         -external-runtime [file] - Export the SWIG runtime stack
         -fakeversion <v>- Make SWIG fake the program version number to <v>
         -fcompact       - Compile in compact mode
         -features <list>- Set global features, where <list> is a comma separated list of
                           features, eg -features directors,autodoc=1
                           If no explicit value is given to the feature, a default of 1 is used
         -fastdispatch   - Enable fast dispatch mode to produce faster overload dispatcher code
         -Fmicrosoft     - Display error/warning messages in Microsoft format
         -Fstandard      - Display error/warning messages in commonly used format
         -fvirtual       - Compile in virtual elimination mode
         -help           - Display help
         -I-             - Don't search the current directory
         -I<dir>         - Look for SWIG files in directory <dir>
         -ignoremissing  - Ignore missing include files
         -importall      - Follow all #include statements as imports
         -includeall     - Follow all #include statements
         -l<ifile>       - Include SWIG library file <ifile>
         -macroerrors    - Report errors inside macros
         -makedefault    - Create default constructors/destructors (the default)
         -M              - List all dependencies
         -MD             - Is equivalent to `-M -MF <file>', except `-E' is not implied
         -MF <file>      - Generate dependencies into <file> and continue generating wrappers
         -MM             - List dependencies, but omit files in SWIG library
         -MMD            - Like `-MD', but omit files in SWIG library
         -module <name>  - Set module name to <name>
         -MP             - Generate phony targets for all dependencies
         -MT <target>    - Set the target of the rule emitted by dependency generation
         -nocontract     - Turn off contract checking
         -nocpperraswarn - Do not treat the preprocessor #error statement as #warning
         -nodefault      - Do not generate default constructors nor default destructors
         -nodefaultctor  - Do not generate implicit default constructors
         -nodefaultdtor  - Do not generate implicit default destructors
         -nodirprot      - Do not wrap director protected members
         -noexcept       - Do not wrap exception specifiers
         -nofastdispatch - Disable fast dispatch mode (default)
         -nopreprocess   - Skip the preprocessor step
         -notemplatereduce - Disable reduction of the typedefs in templates
         -O              - Enable the optimization options:
                            -fastdispatch -fvirtual
         -o <outfile>    - Set name of C/C++ output file to <outfile>
         -oh <headfile>  - Set name of C++ output header file for directors to <headfile>
         -outcurrentdir  - Set default output dir to current dir instead of input file's path
         -outdir <dir>   - Set language specific files output directory to <dir>
         -pcreversion    - Display PCRE version information
         -small          - Compile in virtual elimination and compact mode
         -swiglib        - Report location of SWIG library and exit
         -templatereduce - Reduce all the typedefs in templates
         -v              - Run in verbose mode
         -version        - Display SWIG version number
         -Wall           - Remove all warning suppression, also implies -Wextra
         -Wallkw         - Enable keyword warnings for all the supported languages
         -Werror         - Treat warnings as errors
         -Wextra         - Adds the following additional warnings: 202,309,403,405,512,321,322
         -w<list>        - Suppress/add warning messages, eg -w401,+321 - see Warnings.html
         -xmlout <file>  - Write XML version of the parse tree to <file> after normal processing
    

    Arguments may also be passed in a command-line options file (also known as a response file) which is useful if they exceed the system command line length limit. To do this, put the arguments in a file, then provide the file name prefixed with @ like so:

    swig @file
    

    The options read from the file are inserted in place of the file option. If the file does not exist, or cannot be read, then the option will be treated literally and not removed.

    Options in the file are separated by whitespace. A whitespace character may be included in an option by surrounding the entire option in either single or double quotes. Any character (including a backslash) may be included by prefixing the character to be included with a backslash. The file may itself contain additional @file options; any such options will be processed recursively.

    5.1.1 Input format

    As input, SWIG expects a file containing ISO C/C++ declarations and special SWIG directives. More often than not, this is a special SWIG interface file which is usually denoted with a special .i or .swg suffix. In certain cases, SWIG can be used directly on raw header files or source files. However, this is not the most typical case and there are several reasons why you might not want to do this (described later).

    The most common format of a SWIG interface is as follows:

    %module mymodule 
    %{
    #include "myheader.h"
    %}
    // Now list ISO C/C++ declarations
    int foo;
    int bar(int x);
    ...
    

    The module name is supplied using the special %module directive. Modules are described further in the Modules Introduction section.

    Everything in the %{ ... %} block is simply copied verbatim to the resulting wrapper file created by SWIG. This section is almost always used to include header files and other declarations that are required to make the generated wrapper code compile. It is important to emphasize that just because you include a declaration in a SWIG input file, that declaration does not automatically appear in the generated wrapper code---therefore you need to make sure you include the proper header files in the %{ ... %} section. It should be noted that the text enclosed in %{ ... %} is not parsed or interpreted by SWIG. The %{...%} syntax and semantics in SWIG is analogous to that of the declarations section used in input files to parser generation tools such as yacc or bison.

    5.1.2 SWIG Output

    The output of SWIG is a C/C++ file that contains all of the wrapper code needed to build an extension module. SWIG may generate some additional files depending on the target language. By default, an input file with the name file.i is transformed into a file file_wrap.c or file_wrap.cxx (depending on whether or not the -c++ option has been used). The name of the output C/C++ file can be changed using the -o option. In certain cases, file suffixes are used by the compiler to determine the source language (C, C++, etc.). Therefore, you have to use the -o option to change the suffix of the SWIG-generated wrapper file if you want something different than the default. For example:

    $ swig -c++ -python -o example_wrap.cpp example.i
    

    The C/C++ output file created by SWIG often contains everything that is needed to construct an extension module for the target scripting language. SWIG is not a stub compiler nor is it usually necessary to edit the output file (and if you look at the output, you probably won't want to). To build the final extension module, the SWIG output file is compiled and linked with the rest of your C/C++ program to create a shared library.

    For many target languages SWIG will also generate proxy class files in the target language. The default output directory for these language specific files is the same directory as the generated C/C++ file. This can be modified using the -outdir option. For example:

    $ swig -c++ -python -outdir pyfiles -o cppfiles/example_wrap.cpp example.i
    

    If the directories cppfiles and pyfiles exist, the following will be generated:

    cppfiles/example_wrap.cpp
    pyfiles/example.py
    

    If the -outcurrentdir option is used (without -o) then SWIG behaves like a typical C/C++ compiler and the default output directory is then the current directory. Without this option the default output directory is the path to the input file. If -o and -outcurrentdir are used together, -outcurrentdir is effectively ignored as the output directory for the language files is the same directory as the generated C/C++ file if not overridden with -outdir.

    5.1.3 Comments

    C and C++ style comments may appear anywhere in interface files. In previous versions of SWIG, comments were used to generate documentation files. However, this feature is currently under repair and will reappear in a later SWIG release.

    5.1.4 C Preprocessor

    Like C, SWIG preprocesses all input files through an enhanced version of the C preprocessor. All standard preprocessor features are supported including file inclusion, conditional compilation and macros. However, #include statements are ignored unless the -includeall command line option has been supplied. The reason for disabling includes is that SWIG is sometimes used to process raw C header files. In this case, you usually only want the extension module to include functions in the supplied header file rather than everything that might be included by that header file (i.e., system headers, C library functions, etc.).

    It should also be noted that the SWIG preprocessor skips all text enclosed inside a %{...%} block. In addition, the preprocessor includes a number of macro handling enhancements that make it more powerful than the normal C preprocessor. These extensions are described in the "Preprocessor" chapter.

    5.1.5 SWIG Directives

    Most of SWIG's operation is controlled by special directives that are always preceded by a "%" to distinguish them from normal C declarations. These directives are used to give SWIG hints or to alter SWIG's parsing behavior in some manner.

    Since SWIG directives are not legal C syntax, it is generally not possible to include them in header files. However, SWIG directives can be included in C header files using conditional compilation like this:

    /* header.h  --- Some header file */
    
    /* SWIG directives -- only seen if SWIG is running */ 
    #ifdef SWIG
    %module foo
    #endif
    

    SWIG is a special preprocessing symbol defined by SWIG when it is parsing an input file.

    5.1.6 Parser Limitations

    Although SWIG can parse most C/C++ declarations, it does not provide a complete C/C++ parser implementation. Most of these limitations pertain to very complicated type declarations and certain advanced C++ features. Specifically, the following features are not currently supported:

    • Non-conventional type declarations. For example, SWIG does not support declarations such as the following (even though this is legal C):

      /* Non-conventional placement of storage specifier (extern) */
      const int extern Number;
      
      /* Extra declarator grouping */
      Matrix (foo);    // A global variable
      
      /* Extra declarator grouping in parameters */
      void bar(Spam (Grok)(Doh));
      
      

      In practice, few (if any) C programmers actually write code like this since this style is never featured in programming books. However, if you're feeling particularly obfuscated, you can certainly break SWIG (although why would you want to?).

    • Running SWIG on C++ source files (the code in a .C, .cpp or .cxx file) is not recommended. The usual approach is to feed SWIG header files for parsing C++ definitions and declarations. The main reason is if SWIG parses a scoped definition or declaration (as is normal for C++ source files), it is ignored, unless a declaration for the symbol was parsed earlier. For example

      /* bar not wrapped unless foo has been defined and 
         the declaration of bar within foo has already been parsed */
      int foo::bar(int) {
        ... whatever ...
      }
      
    • Certain advanced features of C++ such as nested classes are not yet fully supported. Please see the C++ Nested classes section for more information.

    In the event of a parsing error, conditional compilation can be used to skip offending code. For example:

    #ifndef SWIG
    ... some bad declarations ...
    #endif
    

    Alternatively, you can just delete the offending code from the interface file.

    One of the reasons why SWIG does not provide a full C++ parser implementation is that it has been designed to work with incomplete specifications and to be very permissive in its handling of C/C++ datatypes (e.g., SWIG can generate interfaces even when there are missing class declarations or opaque datatypes). Unfortunately, this approach makes it extremely difficult to implement certain parts of a C/C++ parser as most compilers use type information to assist in the parsing of more complex declarations (for the truly curious, the primary complication in the implementation is that the SWIG parser does not utilize a separate typedef-name terminal symbol as described on p. 234 of K&R).

    5.2 Wrapping Simple C Declarations

    SWIG wraps simple C declarations by creating an interface that closely matches the way in which the declarations would be used in a C program. For example, consider the following interface file:

    %module example
    
    %inline %{
    extern double sin(double x);
    extern int strcmp(const char *, const char *);
    extern int Foo;
    %}
    #define STATUS 50
    #define VERSION "1.1"
    

    In this file, there are two functions sin() and strcmp(), a global variable Foo, and two constants STATUS and VERSION. When SWIG creates an extension module, these declarations are accessible as scripting language functions, variables, and constants respectively. For example, in Tcl:

    % sin 3
    5.2335956
    % strcmp Dave Mike
    -1
    % puts $Foo
    42
    % puts $STATUS
    50
    % puts $VERSION
    1.1
    

    Or in Python:

    >>> example.sin(3)
    5.2335956
    >>> example.strcmp('Dave', 'Mike')
    -1
    >>> print example.cvar.Foo
    42
    >>> print example.STATUS
    50
    >>> print example.VERSION
    1.1
    

    Whenever possible, SWIG creates an interface that closely matches the underlying C/C++ code. However, due to subtle differences between languages, run-time environments, and semantics, it is not always possible to do so. The next few sections describe various aspects of this mapping.

    5.2.1 Basic Type Handling

    In order to build an interface, SWIG has to convert C/C++ datatypes to equivalent types in the target language. Generally, scripting languages provide a more limited set of primitive types than C. Therefore, this conversion process involves a certain amount of type coercion.

    Most scripting languages provide a single integer type that is implemented using the int or long datatype in C. The following list shows all of the C datatypes that SWIG will convert to and from integers in the target language:

    int
    short
    long
    unsigned
    signed
    unsigned short
    unsigned long
    unsigned char
    signed char
    bool
    

    When an integral value is converted from C, a cast is used to convert it to the representation in the target language. Thus, a 16 bit short in C may be promoted to a 32 bit integer. When integers are converted in the other direction, the value is cast back into the original C type. If the value is too large to fit, it is silently truncated.

    unsigned char and signed char are special cases that are handled as small 8-bit integers. Normally, the char datatype is mapped as a one-character ASCII string.

    The bool datatype is cast to and from an integer value of 0 and 1 unless the target language provides a special boolean type.

    Some care is required when working with large integer values. Most scripting languages use 32-bit integers so mapping a 64-bit long integer may lead to truncation errors. Similar problems may arise with 32 bit unsigned integers (which may appear as large negative numbers). As a rule of thumb, the int datatype and all variations of char and short datatypes are safe to use. For unsigned int and long datatypes, you will need to carefully check the correct operation of your program after it has been wrapped with SWIG.

    Although the SWIG parser supports the long long datatype, not all language modules support it. This is because long long usually exceeds the integer precision available in the target language. In certain modules such as Tcl and Perl5, long long integers are encoded as strings. This allows the full range of these numbers to be represented. However, it does not allow long long values to be used in arithmetic expressions. It should also be noted that although long long is part of the ISO C99 standard, it is not universally supported by all C compilers. Make sure you are using a compiler that supports long long before trying to use this type with SWIG.

    SWIG recognizes the following floating point types :

    float
    double
    

    Floating point numbers are mapped to and from the natural representation of floats in the target language. This is almost always a C double. The rarely used datatype of long double is not supported by SWIG.

    The char datatype is mapped into a NULL terminated ASCII string with a single character. When used in a scripting language it shows up as a tiny string containing the character value. When converting the value back into C, SWIG takes a character string from the scripting language and strips off the first character as the char value. Thus if the value "foo" is assigned to a char datatype, it gets the value `f'.

    The char * datatype is handled as a NULL-terminated ASCII string. SWIG maps this into a 8-bit character string in the target scripting language. SWIG converts character strings in the target language to NULL terminated strings before passing them into C/C++. The default handling of these strings does not allow them to have embedded NULL bytes. Therefore, the char * datatype is not generally suitable for passing binary data. However, it is possible to change this behavior by defining a SWIG typemap. See the chapter on Typemaps for details about this.

    At this time, SWIG provides limited support for Unicode and wide-character strings (the C wchar_t type). Some languages provide typemaps for wchar_t, but bear in mind these might not be portable across different operating systems. This is a delicate topic that is poorly understood by many programmers and not implemented in a consistent manner across languages. For those scripting languages that provide Unicode support, Unicode strings are often available in an 8-bit representation such as UTF-8 that can be mapped to the char * type (in which case the SWIG interface will probably work). If the program you are wrapping uses Unicode, there is no guarantee that Unicode characters in the target language will use the same internal representation (e.g., UCS-2 vs. UCS-4). You may need to write some special conversion functions.

    5.2.2 Global Variables

    Whenever possible, SWIG maps C/C++ global variables into scripting language variables. For example,

    %module example
    double foo;
    
    

    results in a scripting language variable like this:

    # Tcl
    set foo [3.5]                   ;# Set foo to 3.5
    puts $foo                       ;# Print the value of foo
    
    # Python
    cvar.foo = 3.5                  # Set foo to 3.5
    print cvar.foo                  # Print value of foo
    
    # Perl
    $foo = 3.5;                     # Set foo to 3.5
    print $foo, "\n";               # Print value of foo
    
    # Ruby
    Module.foo = 3.5               # Set foo to 3.5
    print Module.foo, "\n"         # Print value of foo
    

    Whenever the scripting language variable is used, the underlying C global variable is accessed. Although SWIG makes every attempt to make global variables work like scripting language variables, it is not always possible to do so. For instance, in Python, all global variables must be accessed through a special variable object known as cvar (shown above). In Ruby, variables are accessed as attributes of the module. Other languages may convert variables to a pair of accessor functions. For example, the Java module generates a pair of functions double get_foo() and set_foo(double val) that are used to manipulate the value.

    Finally, if a global variable has been declared as const, it only supports read-only access. Note: this behavior is new to SWIG-1.3. Earlier versions of SWIG incorrectly handled const and created constants instead.

    5.2.3 Constants

    Constants can be created using #define, enumerations, or a special %constant directive. The following interface file shows a few valid constant declarations :

    #define I_CONST       5               // An integer constant
    #define PI            3.14159         // A Floating point constant
    #define S_CONST       "hello world"   // A string constant
    #define NEWLINE       '\n'            // Character constant
    
    enum boolean {NO=0, YES=1};
    enum months {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG,
                 SEP, OCT, NOV, DEC};
    %constant double BLAH = 42.37;
    #define PI_4 PI/4
    #define FLAGS 0x04 | 0x08 | 0x40
    
    

    In #define declarations, the type of a constant is inferred by syntax. For example, a number with a decimal point is assumed to be floating point. In addition, SWIG must be able to fully resolve all of the symbols used in a #define in order for a constant to actually be created. This restriction is necessary because #define is also used to define preprocessor macros that are definitely not meant to be part of the scripting language interface. For example:

    #define EXTERN extern
    
    EXTERN void foo();
    

    In this case, you probably don't want to create a constant called EXTERN (what would the value be?). In general, SWIG will not create constants for macros unless the value can be completely determined by the preprocessor. For instance, in the above example, the declaration

    #define PI_4  PI/4
    

    defines a constant because PI was already defined as a constant and the value is known. However, for the same conservative reasons even a constant with a simple cast will be ignored, such as

    #define F_CONST (double) 5            // A floating point constant with cast
    

    This logic can lead to false attempts at converting #define into %constant though. For example the following case does not have any undefined symbols within the macro:

    // For indicating pure virtual functions such as: virtual void f() PURE;
    #define PURE = 0
    

    A warning is issued:

    pure.h:1: Warning 305: Bad constant value (ignored).
    

    In such cases simply ignore the warning or suppress it using the normal warning suppression techniques.

    The use of constant expressions is allowed, but SWIG does not evaluate them. Rather, it passes them through to the output file and lets the C compiler perform the final evaluation (SWIG does perform a limited form of type-checking however).

    For enumerations, it is critical that the original enum definition be included somewhere in the interface file (either in a header file or in the %{ %} block). SWIG only translates the enumeration into code needed to add the constants to a scripting language. It needs the original enumeration declaration in order to get the correct enum values as assigned by the C compiler.

    The %constant directive is used to more precisely create constants corresponding to different C datatypes. Although it is not usually needed for simple values, it is more useful when working with pointers and other more complex datatypes. Typically, %constant is only used when you want to add constants to the scripting language interface that are not defined in the original header file.

    5.2.4 A brief word about const

    A common confusion with C programming is the semantic meaning of the const qualifier in declarations--especially when it is mixed with pointers and other type modifiers. In fact, previous versions of SWIG handled const incorrectly--a situation that SWIG-1.3.7 and newer releases have fixed.

    Starting with SWIG-1.3, all variable declarations, regardless of any use of const, are wrapped as global variables. If a declaration happens to be declared as const, it is wrapped as a read-only variable. To tell if a variable is const or not, you need to look at the right-most occurrence of the const qualifier (that appears before the variable name). If the right-most const occurs after all other type modifiers (such as pointers), then the variable is const. Otherwise, it is not.

    Here are some examples of const declarations.

    const char a;           // A constant character
    char const b;           // A constant character (the same)
    char *const c;          // A constant pointer to a character
    const char *const d;    // A constant pointer to a constant character
    

    Here is an example of a declaration that is not const:

    const char *e;          // A pointer to a constant character.  The pointer
                            // may be modified.
    

    In this case, the pointer e can change---it's only the value being pointed to that is read-only.

    Please note that for const parameters or return types used in a function, SWIG pretty much ignores the fact that these are const, see the section on const-correctness for more information.

    Compatibility Note: One reason for changing SWIG to handle const declarations as read-only variables is that there are many situations where the value of a const variable might change. For example, a library might export a symbol as const in its public API to discourage modification, but still allow the value to change through some other kind of internal mechanism. Furthermore, programmers often overlook the fact that with a constant declaration like char *const, the underlying data being pointed to can be modified--it's only the pointer itself that is constant. In an embedded system, a const declaration might refer to a read-only memory address such as the location of a memory-mapped I/O device port (where the value changes, but writing to the port is not supported by the hardware). Rather than trying to build a bunch of special cases into the const qualifier, the new interpretation of const as "read-only" is simple and exactly matches the actual semantics of const in C/C++. If you really want to create a constant as in older versions of SWIG, use the %constant directive instead. For example:

    %constant double PI = 3.14159;
    

    or

    #ifdef SWIG
    #define const %constant
    #endif
    const double foo = 3.4;
    const double bar = 23.4;
    const int    spam = 42;
    #ifdef SWIG
    #undef const
    #endif
    ...
    
    

    5.2.5 A cautionary tale of char *

    Before going any further, there is one bit of caution involving char * that must now be mentioned. When strings are passed from a scripting language to a C char *, the pointer usually points to string data stored inside the interpreter. It is almost always a really bad idea to modify this data. Furthermore, some languages may explicitly disallow it. For instance, in Python, strings are supposed to be immutable. If you violate this, you will probably receive a vast amount of wrath when you unleash your module on the world.

    The primary source of problems are functions that might modify string data in place. A classic example would be a function like this:

    char *strcat(char *s, const char *t)
    

    Although SWIG will certainly generate a wrapper for this, its behavior will be undefined. In fact, it will probably cause your application to crash with a segmentation fault or other memory related problem. This is because s refers to some internal data in the target language---data that you shouldn't be touching.

    The bottom line: don't rely on char * for anything other than read-only input values. However, it must be noted that you could change the behavior of SWIG using typemaps.

    5.3 Pointers and complex objects

    Most C programs manipulate arrays, structures, and other types of objects. This section discusses the handling of these datatypes.

    5.3.1 Simple pointers

    Pointers to primitive C datatypes such as

    int *
    double ***
    char **
    

    are fully supported by SWIG. Rather than trying to convert the data being pointed to into a scripting representation, SWIG simply encodes the pointer itself into a representation that contains the actual value of the pointer and a type-tag. Thus, the SWIG representation of the above pointers (in Tcl), might look like this:

    _10081012_p_int
    _1008e124_ppp_double
    _f8ac_pp_char
    

    A NULL pointer is represented by the string "NULL" or the value 0 encoded with type information.

    All pointers are treated as opaque objects by SWIG. Thus, a pointer may be returned by a function and passed around to other C functions as needed. For all practical purposes, the scripting language interface works in exactly the same way as you would use the pointer in a C program. The only difference is that there is no mechanism for dereferencing the pointer since this would require the target language to understand the memory layout of the underlying object.

    The scripting language representation of a pointer value should never be manipulated directly. Even though the values shown look like hexadecimal addresses, the numbers used may differ from the actual machine address (e.g., on little-endian machines, the digits may appear in reverse order). Furthermore, SWIG does not normally map pointers into high-level objects such as associative arrays or lists (for example, converting an int * into an list of integers). There are several reasons why SWIG does not do this:

    • There is not enough information in a C declaration to properly map pointers into higher level constructs. For example, an int * may indeed be an array of integers, but if it contains ten million elements, converting it into a list object is probably a bad idea.
    • The underlying semantics associated with a pointer is not known by SWIG. For instance, an int * might not be an array at all--perhaps it is an output value!
    • By handling all pointers in a consistent manner, the implementation of SWIG is greatly simplified and less prone to error.

    5.3.2 Run time pointer type checking

    By allowing pointers to be manipulated from a scripting language, extension modules effectively bypass compile-time type checking in the C/C++ compiler. To prevent errors, a type signature is encoded into all pointer values and is used to perform run-time type checking. This type-checking process is an integral part of SWIG and can not be disabled or modified without using typemaps (described in later chapters).

    Like C, void * matches any kind of pointer. Furthermore, NULL pointers can be passed to any function that expects to receive a pointer. Although this has the potential to cause a crash, NULL pointers are also sometimes used as sentinel values or to denote a missing/empty value. Therefore, SWIG leaves NULL pointer checking up to the application.

    5.3.3 Derived types, structs, and classes

    For everything else (structs, classes, arrays, etc...) SWIG applies a very simple rule :

    Everything else is a pointer

    In other words, SWIG manipulates everything else by reference. This model makes sense because most C/C++ programs make heavy use of pointers and SWIG can use the type-checked pointer mechanism already present for handling pointers to basic datatypes.

    Although this probably sounds complicated, it's really quite simple. Suppose you have an interface file like this :

    %module fileio
    FILE *fopen(char *, char *);
    int fclose(FILE *);
    unsigned fread(void *ptr, unsigned size, unsigned nobj, FILE *);
    unsigned fwrite(void *ptr, unsigned size, unsigned nobj, FILE *);
    void *malloc(int nbytes);
    void free(void *);
    
    

    In this file, SWIG doesn't know what a FILE is, but since it's used as a pointer, so it doesn't really matter what it is. If you wrapped this module into Python, you can use the functions just like you expect :

    # Copy a file 
    def filecopy(source, target):
        f1 = fopen(source, "r")
        f2 = fopen(target, "w")
        buffer = malloc(8192)
        nbytes = fread(buffer, 8192, 1, f1)
        while (nbytes > 0):
            fwrite(buffer, 8192, 1, f2)
                nbytes = fread(buffer, 8192, 1, f1)
        free(buffer)
    

    In this case f1, f2, and buffer are all opaque objects containing C pointers. It doesn't matter what value they contain--our program works just fine without this knowledge.

    5.3.4 Undefined datatypes

    When SWIG encounters an undeclared datatype, it automatically assumes that it is a structure or class. For example, suppose the following function appeared in a SWIG input file:

    void matrix_multiply(Matrix *a, Matrix *b, Matrix *c);
    

    SWIG has no idea what a "Matrix" is. However, it is obviously a pointer to something so SWIG generates a wrapper using its generic pointer handling code.

    Unlike C or C++, SWIG does not actually care whether Matrix has been previously defined in the interface file or not. This allows SWIG to generate interfaces from only partial or limited information. In some cases, you may not care what a Matrix really is as long as you can pass an opaque reference to one around in the scripting language interface.

    An important detail to mention is that SWIG will gladly generate wrappers for an interface when there are unspecified type names. However, all unspecified types are internally handled as pointers to structures or classes! For example, consider the following declaration:

    void foo(size_t num);
    

    If size_t is undeclared, SWIG generates wrappers that expect to receive a type of size_t * (this mapping is described shortly). As a result, the scripting interface might behave strangely. For example:

    foo(40);
    TypeError: expected a _p_size_t.
    

    The only way to fix this problem is to make sure you properly declare type names using typedef.

    5.3.5 Typedef

    Like C, typedef can be used to define new type names in SWIG. For example:

    typedef unsigned int size_t;
    

    typedef definitions appearing in a SWIG interface are not propagated to the generated wrapper code. Therefore, they either need to be defined in an included header file or placed in the declarations section like this:

    %{
    /* Include in the generated wrapper file */
    typedef unsigned int size_t;
    %}
    /* Tell SWIG about it */
    typedef unsigned int size_t;
    

    or

    %inline %{
    typedef unsigned int size_t;
    %}
    

    In certain cases, you might be able to include other header files to collect type information. For example:

    %module example
    %import "sys/types.h"
    

    In this case, you might run SWIG as follows:

    $ swig -I/usr/include -includeall example.i
    

    It should be noted that your mileage will vary greatly here. System headers are notoriously complicated and may rely upon a variety of non-standard C coding extensions (e.g., such as special directives to GCC). Unless you exactly specify the right include directories and preprocessor symbols, this may not work correctly (you will have to experiment).

    SWIG tracks typedef declarations and uses this information for run-time type checking. For instance, if you use the above typedef and had the following function declaration:

    void foo(unsigned int *ptr);
    

    The corresponding wrapper function will accept arguments of type unsigned int * or size_t *.

    5.4 Other Practicalities

    So far, this chapter has presented almost everything you need to know to use SWIG for simple interfaces. However, some C programs use idioms that are somewhat more difficult to map to a scripting language interface. This section describes some of these issues.

    5.4.1 Passing structures by value

    Sometimes a C function takes structure parameters that are passed by value. For example, consider the following function:

    double dot_product(Vector a, Vector b);
    

    To deal with this, SWIG transforms the function to use pointers by creating a wrapper equivalent to the following:

    double wrap_dot_product(Vector *a, Vector *b) {
      Vector x = *a;
      Vector y = *b;
      return dot_product(x, y);
    }
    

    In the target language, the dot_product() function now accepts pointers to Vectors instead of Vectors. For the most part, this transformation is transparent so you might not notice.

    5.4.2 Return by value

    C functions that return structures or classes datatypes by value are more difficult to handle. Consider the following function:

    Vector cross_product(Vector v1, Vector v2);
    

    This function wants to return Vector, but SWIG only really supports pointers. As a result, SWIG creates a wrapper like this:

    Vector *wrap_cross_product(Vector *v1, Vector *v2) {
      Vector x = *v1;
      Vector y = *v2;
      Vector *result;
      result = (Vector *) malloc(sizeof(Vector));
      *(result) = cross(x, y);
      return result;
    }
    

    or if SWIG was run with the -c++ option:

    Vector *wrap_cross(Vector *v1, Vector *v2) {
      Vector x = *v1;
      Vector y = *v2;
      Vector *result = new Vector(cross(x, y)); // Uses default copy constructor
      return result;
    }
    

    In both cases, SWIG allocates a new object and returns a reference to it. It is up to the user to delete the returned object when it is no longer in use. Clearly, this will leak memory if you are unaware of the implicit memory allocation and don't take steps to free the result. That said, it should be noted that some language modules can now automatically track newly created objects and reclaim memory for you. Consult the documentation for each language module for more details.

    It should also be noted that the handling of pass/return by value in C++ has some special cases. For example, the above code fragments don't work correctly if Vector doesn't define a default constructor. The section on SWIG and C++ has more information about this case.

    5.4.3 Linking to structure variables

    When global variables or class members involving structures are encountered, SWIG handles them as pointers. For example, a global variable like this

    Vector unit_i;
    

    gets mapped to an underlying pair of set/get functions like this :

    Vector *unit_i_get() {
      return &unit_i;
    }
    void unit_i_set(Vector *value) {
      unit_i = *value;
    }
    

    Again some caution is in order. A global variable created in this manner will show up as a pointer in the target scripting language. It would be an extremely bad idea to free or destroy such a pointer. Also, C++ classes must supply a properly defined copy constructor in order for assignment to work correctly.

    5.4.4 Linking to char *

    When a global variable of type char * appears, SWIG uses malloc() or new to allocate memory for the new value. Specifically, if you have a variable like this

    char *foo;
    

    SWIG generates the following code:

    /* C mode */
    void foo_set(char *value) {
      if (foo) free(foo);
      foo = (char *) malloc(strlen(value)+1);
      strcpy(foo, value);
    }
    
    /* C++ mode.  When -c++ option is used */
    void foo_set(char *value) {
      if (foo) delete [] foo;
      foo = new char[strlen(value)+1];
      strcpy(foo, value);
    }
    

    If this is not the behavior that you want, consider making the variable read-only using the %immutable directive. Alternatively, you might write a short assist-function to set the value exactly like you want. For example:

    %inline %{
      void set_foo(char *value) {
        strncpy(foo, value, 50);
      }
    %}
    

    Note: If you write an assist function like this, you will have to call it as a function from the target scripting language (it does not work like a variable). For example, in Python you will have to write:

    >>> set_foo("Hello World")
    

    A common mistake with char * variables is to link to a variable declared like this:

    char *VERSION = "1.0";
    

    In this case, the variable will be readable, but any attempt to change the value results in a segmentation or general protection fault. This is due to the fact that SWIG is trying to release the old value using free or delete when the string literal value currently assigned to the variable wasn't allocated using malloc() or new. To fix this behavior, you can either mark the variable as read-only, write a typemap (as described in Chapter 6), or write a special set function as shown. Another alternative is to declare the variable as an array:

    char VERSION[64] = "1.0";
    

    When variables of type const char * are declared, SWIG still generates functions for setting and getting the value. However, the default behavior does not release the previous contents (resulting in a possible memory leak). In fact, you may get a warning message such as this when wrapping such a variable:

    example.i:20. Typemap warning. Setting const char * variable may leak memory
    

    The reason for this behavior is that const char * variables are often used to point to string literals. For example:

    const char *foo = "Hello World\n";
    

    Therefore, it's a really bad idea to call free() on such a pointer. On the other hand, it is legal to change the pointer to point to some other value. When setting a variable of this type, SWIG allocates a new string (using malloc or new) and changes the pointer to point to the new value. However, repeated modifications of the value will result in a memory leak since the old value is not released.

    5.4.5 Arrays

    Arrays are fully supported by SWIG, but they are always handled as pointers instead of mapping them to a special array object or list in the target language. Thus, the following declarations :

    int foobar(int a[40]);
    void grok(char *argv[]);
    void transpose(double a[20][20]);
    

    are processed as if they were really declared like this:

    int foobar(int *a);
    void grok(char **argv);
    void transpose(double (*a)[20]);
    

    Like C, SWIG does not perform array bounds checking. It is up to the user to make sure the pointer points to a suitably allocated region of memory.

    Multi-dimensional arrays are transformed into a pointer to an array of one less dimension. For example:

    int [10];         // Maps to int *
    int [10][20];     // Maps to int (*)[20]
    int [10][20][30]; // Maps to int (*)[20][30]
    

    It is important to note that in the C type system, a multidimensional array a[][] is NOT equivalent to a single pointer *a or a double pointer such as **a. Instead, a pointer to an array is used (as shown above) where the actual value of the pointer is the starting memory location of the array. The reader is strongly advised to dust off their C book and re-read the section on arrays before using them with SWIG.

    Array variables are supported, but are read-only by default. For example:

    int   a[100][200];
    

    In this case, reading the variable 'a' returns a pointer of type int (*)[200] that points to the first element of the array &a[0][0]. Trying to modify 'a' results in an error. This is because SWIG does not know how to copy data from the target language into the array. To work around this limitation, you may want to write a few simple assist functions like this:

    %inline %{
    void a_set(int i, int j, int val) {
      a[i][j] = val;
    }
    int a_get(int i, int j) {
      return a[i][j];
    }
    %}
    

    To dynamically create arrays of various sizes and shapes, it may be useful to write some helper functions in your interface. For example:

    // Some array helpers
    %inline %{
      /* Create any sort of [size] array */
      int *int_array(int size) {
        return (int *) malloc(size*sizeof(int));
      }
      /* Create a two-dimension array [size][10] */
      int (*int_array_10(int size))[10] {
        return (int (*)[10]) malloc(size*10*sizeof(int));
      }
    %}
    

    Arrays of char are handled as a special case by SWIG. In this case, strings in the target language can be stored in the array. For example, if you have a declaration like this,

    char pathname[256];
    

    SWIG generates functions for both getting and setting the value that are equivalent to the following code:

    char *pathname_get() {
      return pathname;
    }
    void pathname_set(char *value) {
      strncpy(pathname, value, 256);
    }
    

    In the target language, the value can be set like a normal variable.

    5.4.6 Creating read-only variables

    A read-only variable can be created by using the %immutable directive as shown :

    // File : interface.i
    
    int a;       // Can read/write
    %immutable;
    int b, c, d;   // Read only variables
    %mutable;
    double x, y;  // read/write
    

    The %immutable directive enables read-only mode until it is explicitly disabled using the %mutable directive. As an alternative to turning read-only mode off and on like this, individual declarations can also be tagged as immutable. For example:

    %immutable x;                   // Make x read-only
    ...
    double x;                       // Read-only (from earlier %immutable directive)
    double y;                       // Read-write
    ...
    

    The %mutable and %immutable directives are actually %feature directives defined like this:

    #define %immutable   %feature("immutable")
    #define %mutable     %feature("immutable", "")
    

    If you wanted to make all wrapped variables read-only, barring one or two, it might be easier to take this approach:

    %immutable;                     // Make all variables read-only
    %feature("immutable", "0") x;   // except, make x read/write
    ...
    double x;
    double y;
    double z;
    ...
    

    Read-only variables are also created when declarations are declared as const. For example:

    const int foo;               /* Read only variable */
    char * const version="1.0";  /* Read only variable */
    

    Compatibility note: Read-only access used to be controlled by a pair of directives %readonly and %readwrite. Although these directives still work, they generate a warning message. Simply change the directives to %immutable; and %mutable; to silence the warning. Don't forget the extra semicolon!

    5.4.7 Renaming and ignoring declarations

    5.4.7.1 Simple renaming of specific identifiers

    Normally, the name of a C declaration is used when that declaration is wrapped into the target language. However, this may generate a conflict with a keyword or already existing function in the scripting language. To resolve a name conflict, you can use the %rename directive as shown :

    // interface.i
    
    %rename(my_print) print;
    extern void print(const char *);
    
    %rename(foo) a_really_long_and_annoying_name;
    extern int a_really_long_and_annoying_name;
    
    

    SWIG still calls the correct C function, but in this case the function print() will really be called "my_print()" in the target language.

    The placement of the %rename directive is arbitrary as long as it appears before the declarations to be renamed. A common technique is to write code for wrapping a header file like this:

    // interface.i
    
    %rename(my_print) print;
    %rename(foo) a_really_long_and_annoying_name;
    
    %include "header.h"
    

    %rename applies a renaming operation to all future occurrences of a name. The renaming applies to functions, variables, class and structure names, member functions, and member data. For example, if you had two-dozen C++ classes, all with a member function named `print' (which is a keyword in Python), you could rename them all to `output' by specifying :

    %rename(output) print; // Rename all `print' functions to `output'
    

    SWIG does not normally perform any checks to see if the functions it wraps are already defined in the target scripting language. However, if you are careful about namespaces and your use of modules, you can usually avoid these problems.

    When wrapping C code, simple use of identifiers/symbols with %rename usually suffices. When wrapping C++ code, simple use of simple identifiers/symbols with %rename might be too limiting when using C++ features such as function overloading, default arguments, namespaces, template specialization etc. If you are using the %rename directive and C++, make sure you read the SWIG and C++ chapter and in particular the section on Renaming and ambiguity resolution for method overloading and default arguments.

    Closely related to %rename is the %ignore directive. %ignore instructs SWIG to ignore declarations that match a given identifier. For example:

    %ignore print;         // Ignore all declarations named print
    %ignore MYMACRO;       // Ignore a macro
    ...
    #define MYMACRO 123
    void print(const char *);
    ...
    

    Any function, variable etc which matches %ignore will not be wrapped and therefore will not be available from the target language. A common usage of %ignore is to selectively remove certain declarations from a header file without having to add conditional compilation to the header. However, it should be stressed that this only works for simple declarations. If you need to remove a whole section of problematic code, the SWIG preprocessor should be used instead.

    Compatibility note: Older versions of SWIG provided a special %name directive for renaming declarations. For example:

    %name(output) extern void print(const char *);
    

    This directive is still supported, but it is deprecated and should probably be avoided. The %rename directive is more powerful and better supports wrapping of raw header file information.

    5.4.7.2 Advanced renaming support

    While writing %rename for specific declarations is simple enough, sometimes the same renaming rule needs to be applied to many, maybe all, identifiers in the SWIG input. For example, it may be necessary to apply some transformation to all the names in the target language to better follow its naming conventions, like adding a specific prefix to all wrapped functions. Doing it individually for each function is impractical so SWIG supports applying a renaming rule to all declarations if the name of the identifier to be renamed is not specified:

    %rename("myprefix_%s") ""; // print -> myprefix_print
    

    This also shows that the argument of %rename doesn't have to be a literal string but can be a printf()-like format string. In the simplest form, "%s" is replaced with the name of the original declaration, as shown above. However this is not always enough and SWIG provides extensions to the usual format string syntax to allow applying a (SWIG-defined) function to the argument. For example, to wrap all C functions do_something_long() as more Java-like doSomethingLong() you can use the "lowercamelcase" extended format specifier like this:

    %rename("%(lowercamelcase)s") ""; // foo_bar -> fooBar; FooBar -> fooBar
    

    Some functions can be parametrized, for example the "strip" one strips the provided prefix from its argument. The prefix is specified as part of the format string, following a colon after the function name:

    %rename("%(strip:[wx])s") ""; // wxHello -> Hello; FooBar -> FooBar
    

    Below is the table summarizing all currently defined functions with an example of applying each one. Note that some of them have two names, a shorter one and a more descriptive one, but the two functions are otherwise equivalent:

    FunctionReturnsExample (in/out)
    uppercase or upperUpper case version of the string.PrintPRINT
    lowercase or lowerLower case version of the string.Printprint
    titleString with first letter capitalized and the rest in lower case.printPrint
    firstuppercaseString with the first letter capitalized and the rest unchanged.printIt PrintIt
    firstlowercaseString with the first letter in lower case and the rest unchanged.PrintIt printIt
    camelcase or ctitleString with capitalized first letter and any letter following an underscore (which are removed in the process) and rest in lower case. print_itPrintIt
    lowercamelcase or lctitleString with every letter following an underscore (which is removed in the process) capitalized and rest, including the first letter, in lower case. print_itprintIt
    undercase or utitleLower case string with underscores inserted before every upper case letter in the original string and any number not at the end of string. Logically, this is the reverse of camelcase.PrintIt print_it
    schemifyString with all underscores replaced with dashes, resulting in more Lispers/Schemers-pleasing name. print_itprint-it
    strip:[prefix]String without the given prefix or the original string if it doesn't start with this prefix. Note that square brackets should be used literally, e.g. %rename("strip:[wx]")wxPrintPrint
    rstrip:[suffix]String without the given suffix or the original string if it doesn't end with this suffix. Note that square brackets should be used literally, e.g. %rename("rstrip:[Cls]")PrintClsPrint
    regex:/pattern/subst/ String after (Perl-like) regex substitution operation. This function allows to apply arbitrary regular expressions to the identifier names. The pattern part is a regular expression in Perl syntax (as supported by the Perl Compatible Regular Expressions (PCRE)) library and the subst string can contain back-references of the form \N where N is a digit from 0 to 9, or one of the following escape sequences: \l, \L, \u, \U or \E. The back-references are replaced with the contents of the corresponding capture group while the escape sequences perform the case conversion in the substitution string: \l and \L convert to the lower case, while \u and \U convert to the upper case. The difference between the elements of each pair is that \l and \u change the case of the next character only, while \L and \U do it for all the remaining characters or until \E is encountered. Finally please notice that backslashes need to be escaped in C strings, so in practice "\\" must be used in all these escape sequences. For example, to remove any alphabetic prefix before an underscore and capitalize the remaining part you could use the following directive: %rename("regex:/(\\w+)_(.*)/\\u\\2/") prefix_printPrint
    command:cmdOutput of an external command cmd with the string passed to it as input. Notice that this function is extremely slow compared to all the other ones as it involves spawning a separate process and using it for many declarations is not recommended. The cmd is not enclosed in square brackets but must be terminated with a triple '<' sign, e.g. %rename("command:tr -d aeiou <<<") (nonsensical example removing all vowels)PrintPrnt

    The most general function of all of the above ones (not counting command which is even more powerful in principle but which should generally be avoided because of performance considerations) is the regex one. Here are some more examples of its use:

    // Strip the wx prefix from all identifiers except those starting with wxEVT
    %rename("%(regex:/wx(?!EVT)(.*)/\\1/)s") ""; // wxSomeWidget -> SomeWidget
                                                 // wxEVT_PAINT -> wxEVT_PAINT
    
    // Apply a rule for renaming the enum elements to avoid the common prefixes
    // which are redundant in C#/Java
    %rename("%(regex:/^([A-Z][a-z]+)+_(.*)/\\2/)s", %$isenumitem) ""; // Colour_Red -> Red
    
    // Remove all "Set/Get" prefixes.
    %rename("%(regex:/^(Set|Get)(.*)/\\2/)s") ""; // SetValue -> Value
                                                  // GetValue -> Value
    

    As before, everything that was said above about %rename also applies to %ignore. In fact, the latter is just a special case of the former and ignoring an identifier is the same as renaming it to the special "$ignore" value. So the following snippets

    %ignore print;
    

    and

    %rename("$ignore") print;
    

    are exactly equivalent and %rename can be used to selectively ignore multiple declarations using the previously described matching possibilities.

    5.4.7.3 Limiting global renaming rules

    As explained in the previous sections, it is possible to either rename individual declarations or apply a rename rule to all of them at once. In practice, the latter is however rarely appropriate as there are always some exceptions to the general rules. To deal with them, the scope of an unnamed %rename can be limited using subsequent match parameters. They can be applied to any of the attributes associated by SWIG with the declarations appearing in its input. For example:

    %rename("foo", match$name="bar") "";
    

    can be used to achieve the same effect as the simpler

    %rename("foo") bar;
    

    and so is not very interesting on its own. However match can also be applied to the declaration type, for example match="class" restricts the match to class declarations only (in C++) and match="enumitem" restricts it to the enum elements. SWIG also provides convenience macros for such match expressions, for example

    %rename("%(title)s", %$isenumitem) "";
    

    will capitalize the names of all the enum elements but not change the case of the other declarations. Similarly, %$isclass, %$isfunction, %$isconstructor, %$isunion, %$istemplate, and %$isvariable can be used. Many other checks are possible and this documentation is not exhaustive, see the "%rename predicates" section in swig.swg for the full list of supported match expressions.

    In addition to literally matching some string with match you can also use regexmatch or notregexmatch to match a string against a regular expression. For example, to ignore all functions having "Old" as a suffix you could use

    %rename("$ignore", regexmatch$name="Old$") "";
    

    For simple cases like this, specifying the regular expression for the declaration name directly can be preferable and can also be done using regextarget:

    %rename("$ignore", regextarget=1) "Old$";
    

    Notice that the check is done only against the name of the declaration itself, if you need to match the full name of a C++ declaration you must use fullname attribute:

    %rename("$ignore", regextarget=1, fullname=1) "NameSpace::ClassName::.*Old$";
    

    As for notregexmatch, it restricts the match only to the strings not matching the specified regular expression. So to rename all declarations to lower case except those consisting of capital letters only:

    %rename("$(lower)s", notregexmatch$name="^[A-Z]+$") "";
    

    Finally, variants of %rename and %ignore directives can be used to help wrap C++ overloaded functions and methods or C++ methods which use default arguments. This is described in the Renaming and ambiguity resolution section in the C++ chapter.

    5.4.7.4 Ignoring everything then wrapping a few selected symbols

    Using the techniques described above it is possible to ignore everything in a header and then selectively wrap a few chosen methods or classes. For example, consider a header, myheader.h which has many classes in it and just the one class called Star is wanted within this header, the following approach could be taken:

    %ignore ""; // Ignore everything
    
    // Unignore chosen class 'Star'
    %rename("%s") Star;
    
    // As the ignore everything will include the constructor, destructor, methods etc
    // in the class, these have to be explicitly unignored too:
    %rename("%s") Star::Star;
    %rename("%s") Star::~Star;
    %rename("%s") Star::shine; // named method
    
    %include "myheader.h"
    

    Another approach which might be more suitable as it does not require naming all the methods in the chosen class is to begin by ignoring just the classes. This does not add an explicit ignore to any members of the class, so when the chosen class is unignored, all of its methods will be wrapped.

    %rename($ignore, %$isclass) ""; // Only ignore all classes
    %rename("%s") Star; // Unignore 'Star'
    %include "myheader.h"
    

    5.4.8 Default/optional arguments

    SWIG supports default arguments in both C and C++ code. For example:

    int plot(double x, double y, int color=WHITE);
    

    In this case, SWIG generates wrapper code where the default arguments are optional in the target language. For example, this function could be used in Tcl as follows :

    % plot -3.4 7.5    # Use default value
    % plot -3.4 7.5 10 # set color to 10 instead
    
    

    Although the ISO C standard does not allow default arguments, default arguments specified in a SWIG interface work with both C and C++.

    Note: There is a subtle semantic issue concerning the use of default arguments and the SWIG generated wrapper code. When default arguments are used in C code, the default values are emitted into the wrappers and the function is invoked with a full set of arguments. This is different to when wrapping C++ where an overloaded wrapper method is generated for each defaulted argument. Please refer to the section on default arguments in the C++ chapter for further details.

    5.4.9 Pointers to functions and callbacks

    Occasionally, a C library may include functions that expect to receive pointers to functions--possibly to serve as callbacks. SWIG provides full support for function pointers when the callback functions are defined in C and not in the target language. For example, consider a function like this:

    int binary_op(int a, int b, int (*op)(int, int));
    

    When you first wrap something like this into an extension module, you may find the function to be impossible to use. For instance, in Python:

    >>> def add(x, y):
    ...     return x+y
    ...
    >>> binary_op(3, 4, add)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_f_int_int__int
    >>>
    

    The reason for this error is that SWIG doesn't know how to map a scripting language function into a C callback. However, existing C functions can be used as arguments provided you install them as constants. One way to do this is to use the %constant directive like this:

    /* Function with a callback */
    int binary_op(int a, int b, int (*op)(int, int));
    
    /* Some callback functions */
    %constant int add(int, int);
    %constant int sub(int, int);
    %constant int mul(int, int);
    

    In this case, add, sub, and mul become function pointer constants in the target scripting language. This allows you to use them as follows:

    >>> binary_op(3, 4, add)
    7
    >>> binary_op(3, 4, mul)
    12
    >>>
    

    Unfortunately, by declaring the callback functions as constants, they are no longer accessible as functions. For example:

    >>> add(3, 4)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: object is not callable: '_ff020efc_p_f_int_int__int'
    >>>
    

    If you want to make a function available as both a callback function and a function, you can use the %callback and %nocallback directives like this:

    /* Function with a callback */
    int binary_op(int a, int b, int (*op)(int, int));
    
    /* Some callback functions */
    %callback("%s_cb");
    int add(int, int);
    int sub(int, int);
    int mul(int, int);
    %nocallback;
    

    The argument to %callback is a printf-style format string that specifies the naming convention for the callback constants (%s gets replaced by the function name). The callback mode remains in effect until it is explicitly disabled using %nocallback. When you do this, the interface now works as follows:

    >>> binary_op(3, 4, add_cb)
    7
    >>> binary_op(3, 4, mul_cb)
    12
    >>> add(3, 4)
    7
    >>> mul(3, 4)
    12
    

    Notice that when the function is used as a callback, special names such as add_cb are used instead. To call the function normally, just use the original function name such as add().

    SWIG provides a number of extensions to standard C printf formatting that may be useful in this context. For instance, the following variation installs the callbacks as all upper case constants such as ADD, SUB, and MUL:

    /* Some callback functions */
    %callback("%(uppercase)s");
    int add(int, int);
    int sub(int, int);
    int mul(int, int);
    %nocallback;
    

    A format string of "%(lowercase)s" converts all characters to lower case. A string of "%(title)s" capitalizes the first character and converts the rest to lower case.

    And now, a final note about function pointer support. Although SWIG does not normally allow callback functions to be written in the target language, this can be accomplished with the use of typemaps and other advanced SWIG features. See the Typemaps chapter for more about typemaps and individual target language chapters for more on callbacks. The 'director' feature can be used to make callbacks from C/C++ into the target language, see Callbacks to the target language.

    5.5 Structures and unions

    This section describes the behavior of SWIG when processing ISO C structures and union declarations. Extensions to handle C++ are described in the next section.

    If SWIG encounters the definition of a structure or union, it creates a set of accessor functions. Although SWIG does not need structure definitions to build an interface, providing definitions makes it possible to access structure members. The accessor functions generated by SWIG simply take a pointer to an object and allow access to an individual member. For example, the declaration :

    struct Vector {
      double x, y, z;
    }
    
    

    gets transformed into the following set of accessor functions :

    double Vector_x_get(struct Vector *obj) {
      return obj->x;
    }
    double Vector_y_get(struct Vector *obj) { 
      return obj->y;
    }
    double Vector_z_get(struct Vector *obj) { 
      return obj->z;
    }
    void Vector_x_set(struct Vector *obj, double value) {
      obj->x = value;
    }
    void Vector_y_set(struct Vector *obj, double value) {
      obj->y = value;
    }
    void Vector_z_set(struct Vector *obj, double value) {
      obj->z = value;
    }
    

    In addition, SWIG creates default constructor and destructor functions if none are defined in the interface. For example:

    struct Vector *new_Vector() {
      return (Vector *) calloc(1, sizeof(struct Vector));
    }
    void delete_Vector(struct Vector *obj) {
      free(obj);
    }
    

    Using these low-level accessor functions, an object can be minimally manipulated from the target language using code like this:

    v = new_Vector()
    Vector_x_set(v, 2)
    Vector_y_set(v, 10)
    Vector_z_set(v, -5)
    ...
    delete_Vector(v)
    

    However, most of SWIG's language modules also provide a high-level interface that is more convenient. Keep reading.

    5.5.1 Typedef and structures

    SWIG supports the following construct which is quite common in C programs :

    typedef struct {
      double x, y, z;
    } Vector;
    
    

    When encountered, SWIG assumes that the name of the object is `Vector' and creates accessor functions like before. The only difference is that the use of typedef allows SWIG to drop the struct keyword on its generated code. For example:

    double Vector_x_get(Vector *obj) {
      return obj->x;
    }
    

    If two different names are used like this :

    typedef struct vector_struct {
      double x, y, z;
    } Vector;
    
    

    the name Vector is used instead of vector_struct since this is more typical C programming style. If declarations defined later in the interface use the type struct vector_struct, SWIG knows that this is the same as Vector and it generates the appropriate type-checking code.

    5.5.2 Character strings and structures

    Structures involving character strings require some care. SWIG assumes that all members of type char * have been dynamically allocated using malloc() and that they are NULL-terminated ASCII strings. When such a member is modified, the previous contents will be released, and the new contents allocated. For example :

    %module mymodule
    ...
    struct Foo {
      char *name;
      ...
    }
    
    

    This results in the following accessor functions :

    char *Foo_name_get(Foo *obj) {
      return Foo->name;
    }
    
    char *Foo_name_set(Foo *obj, char *c) {
      if (obj->name)
        free(obj->name);
      obj->name = (char *) malloc(strlen(c)+1);
      strcpy(obj->name, c);
      return obj->name;
    }
    

    If this behavior differs from what you need in your applications, the SWIG "memberin" typemap can be used to change it. See the typemaps chapter for further details.

    Note: If the -c++ option is used, new and delete are used to perform memory allocation.

    5.5.3 Array members

    Arrays may appear as the members of structures, but they will be read-only. SWIG will write an accessor function that returns the pointer to the first element of the array, but will not write a function to change the contents of the array itself. When this situation is detected, SWIG may generate a warning message such as the following :

    interface.i:116. Warning. Array member will be read-only
    

    To eliminate the warning message, typemaps can be used, but this is discussed in a later chapter. In many cases, the warning message is harmless.

    5.5.4 Structure data members

    Occasionally, a structure will contain data members that are themselves structures. For example:

    typedef struct Foo {
      int x;
    } Foo;
    
    typedef struct Bar {
      int y;
      Foo f;           /* struct member */
    } Bar;
    

    When a structure member is wrapped, it is handled as a pointer, unless the %naturalvar directive is used where it is handled more like a C++ reference (see C++ Member data). The accessors to the member variable as a pointer are effectively wrapped as follows:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    void Bar_f_set(Bar *b, Foo *value) {
      b->f = *value;
    }
    

    The reasons for this are somewhat subtle but have to do with the problem of modifying and accessing data inside the data member. For example, suppose you wanted to modify the value of f.x of a Bar object like this:

    Bar *b;
    b->f.x = 37;
    

    Translating this assignment to function calls (as would be used inside the scripting language interface) results in the following code:

    Bar *b;
    Foo_x_set(Bar_f_get(b), 37);
    

    In this code, if the Bar_f_get() function were to return a Foo instead of a Foo *, then the resulting modification would be applied to a copy of f and not the data member f itself. Clearly that's not what you want!

    It should be noted that this transformation to pointers only occurs if SWIG knows that a data member is a structure or class. For instance, if you had a structure like this,

    struct Foo {
      WORD   w;
    };
    

    and nothing was known about WORD, then SWIG will generate more normal accessor functions like this:

    WORD Foo_w_get(Foo *f) {
      return f->w;
    }
    void Foo_w_set(FOO *f, WORD value) {
      f->w = value;
    }
    

    Compatibility Note: SWIG-1.3.11 and earlier releases transformed all non-primitive member datatypes to pointers. Starting in SWIG-1.3.12, this transformation only occurs if a datatype is known to be a structure, class, or union. This is unlikely to break existing code. However, if you need to tell SWIG that an undeclared datatype is really a struct, simply use a forward struct declaration such as "struct Foo;".

    5.5.5 C constructors and destructors

    When wrapping structures, it is generally useful to have a mechanism for creating and destroying objects. If you don't do anything, SWIG will automatically generate functions for creating and destroying objects using malloc() and free(). Note: the use of malloc() only applies when SWIG is used on C code (i.e., when the -c++ option is not supplied on the command line). C++ is handled differently.

    If you don't want SWIG to generate default constructors for your interfaces, you can use the %nodefaultctor directive or the -nodefaultctor command line option. For example:

    swig -nodefaultctor example.i 
    

    or

    %module foo
    ...
    %nodefaultctor;        // Don't create default constructors
    ... declarations ...
    %clearnodefaultctor;   // Re-enable default constructors
    

    If you need more precise control, %nodefaultctor can selectively target individual structure definitions. For example:

    %nodefaultctor Foo;      // No default constructor for Foo
    ...
    struct Foo {             // No default constructor generated.
    };
    
    struct Bar {             // Default constructor generated.
    };
    

    Since ignoring the implicit or default destructors most of the time produces memory leaks, SWIG will always try to generate them. If needed, however, you can selectively disable the generation of the default/implicit destructor by using %nodefaultdtor

    %nodefaultdtor Foo; // No default/implicit destructor for Foo
    ...
    struct Foo {              // No default destructor is generated.
    };
    
    struct Bar {              // Default destructor generated.
    };
    

    Compatibility note: Prior to SWIG-1.3.7, SWIG did not generate default constructors or destructors unless you explicitly turned them on using -make_default. However, it appears that most users want to have constructor and destructor functions so it has now been enabled as the default behavior.

    Note: There are also the -nodefault option and %nodefault directive, which disable both the default or implicit destructor generation. This could lead to memory leaks across the target languages, and it is highly recommended you don't use them.

    5.5.6 Adding member functions to C structures

    Most languages provide a mechanism for creating classes and supporting object oriented programming. From a C standpoint, object oriented programming really just boils down to the process of attaching functions to structures. These functions normally operate on an instance of the structure (or object). Although there is a natural mapping of C++ to such a scheme, there is no direct mechanism for utilizing it with C code. However, SWIG provides a special %extend directive that makes it possible to attach methods to C structures for purposes of building an object oriented interface. Suppose you have a C header file with the following declaration :

    /* file : vector.h */
    ...
    typedef struct Vector {
      double x, y, z;
    } Vector;
    
    

    You can make a Vector look a lot like a class by writing a SWIG interface like this:

    // file : vector.i
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    %include "vector.h"          // Just grab original C header file
    %extend Vector {             // Attach these functions to struct Vector
      Vector(double x, double y, double z) {
        Vector *v;
        v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
      ~Vector() {
        free($self);
      }
      double magnitude() {
        return sqrt($self->x*$self->x+$self->y*$self->y+$self->z*$self->z);
      }
      void print() {
        printf("Vector [%g, %g, %g]\n", $self->x, $self->y, $self->z);
      }
    };
    
    

    Note the usage of the $self special variable. Its usage is identical to a C++ 'this' pointer and should be used whenever access to the struct instance is required. Also note that C++ constructor and destructor syntax has been used to simulate a constructor and destructor, even for C code. There is one subtle difference to a normal C++ constructor implementation though and that is although the constructor declaration is as per a normal C++ constructor, the newly constructed object must be returned as if the constructor declaration had a return value, a Vector * in this case.

    Now, when used with proxy classes in Python, you can do things like this :

    >>> v = Vector(3, 4, 0)                 # Create a new vector
    >>> print v.magnitude()                # Print magnitude
    5.0
    >>> v.print()                  # Print it out
    [ 3, 4, 0 ]
    >>> del v                      # Destroy it
    

    The %extend directive can also be used inside the definition of the Vector structure. For example:

    // file : vector.i
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    typedef struct Vector {
      double x, y, z;
      %extend {
        Vector(double x, double y, double z) { ... }
        ~Vector() { ... }
        ...
      }
    } Vector;
    

    Note that %extend can be used to access externally written functions provided they follow the naming convention used in this example :

    /* File : vector.c */
    /* Vector methods */
    #include "vector.h"
    Vector *new_Vector(double x, double y, double z) {
      Vector *v;
      v = (Vector *) malloc(sizeof(Vector));
      v->x = x;
      v->y = y;
      v->z = z;
      return v;
    }
    void delete_Vector(Vector *v) {
      free(v);
    }
    
    double Vector_magnitude(Vector *v) {
      return sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
    }
    
    // File : vector.i
    // Interface file
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    typedef struct Vector {
      double x, y, z;
      %extend {
        Vector(int, int, int); // This calls new_Vector()
        ~Vector();           // This calls delete_Vector()
        double magnitude();  // This will call Vector_magnitude()
        ...
      }
    } Vector;
    

    The name used for %extend should be the name of the struct and not the name of any typedef to the struct. For example:

    typedef struct Integer {
      int value;
    } Int;
    %extend Integer { ...  } /* Correct name */
    %extend Int { ...  } /* Incorrect name */
    
    struct Float {
      float value;
    };
    typedef struct Float FloatValue;
    %extend Float { ...  } /* Correct name */
    %extend FloatValue { ...  } /* Incorrect name */
    

    There is one exception to this rule and that is when the struct is anonymously named such as:

    typedef struct {
      double value;
    } Double;
    %extend Double { ...  } /* Okay */
    

    A little known feature of the %extend directive is that it can also be used to add synthesized attributes or to modify the behavior of existing data attributes. For example, suppose you wanted to make magnitude a read-only attribute of Vector instead of a method. To do this, you might write some code like this:

    // Add a new attribute to Vector
    %extend Vector {
      const double magnitude;
    }
    // Now supply the implementation of the Vector_magnitude_get function
    %{
    const double Vector_magnitude_get(Vector *v) {
      return (const double) sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
    }
    %}
    
    

    Now, for all practical purposes, magnitude will appear like an attribute of the object.

    A similar technique can also be used to work with data members that you want to process. For example, consider this interface:

    typedef struct Person {
      char name[50];
      ...
    } Person;
    

    Say you wanted to ensure name was always upper case, you can rewrite the interface as follows to ensure this occurs whenever a name is read or written to:

    typedef struct Person {
      %extend {
        char name[50];
      }
      ...
    } Person;
    
    %{
    #include <string.h>
    #include <ctype.h>
    
    void make_upper(char *name) {
      char *c;
      for (c = name; *c; ++c)
        *c = (char)toupper((int)*c);
    }
    
    /* Specific implementation of set/get functions forcing capitalization */
    
    char *Person_name_get(Person *p) {
      make_upper(p->name);
      return p->name;
    }
    
    void Person_name_set(Person *p, char *val) {
      strncpy(p->name, val, 50);
      make_upper(p->name);
    }
    %}
    

    Finally, it should be stressed that even though %extend can be used to add new data members, these new members can not require the allocation of additional storage in the object (e.g., their values must be entirely synthesized from existing attributes of the structure or obtained elsewhere).

    Compatibility note: The %extend directive is a new name for the %addmethods directive. Since %addmethods could be used to extend a structure with more than just methods, a more suitable directive name has been chosen.

    5.5.7 Nested structures

    Occasionally, a C program will involve structures like this :

    typedef struct Object {
      int objtype;
      union {
        int ivalue;
        double dvalue;
        char *strvalue;
        void *ptrvalue;
      } intRep;
    } Object;
    
    

    When SWIG encounters this, it performs a structure splitting operation that transforms the declaration into the equivalent of the following:

    typedef union {
      int ivalue;
      double dvalue;
      char *strvalue;
      void *ptrvalue;
    } Object_intRep;
    
    typedef struct Object {
      int objType;
      Object_intRep intRep;
    } Object;
    
    

    SWIG will then create an Object_intRep structure for use inside the interface file. Accessor functions will be created for both structures. In this case, functions like this would be created :

    Object_intRep *Object_intRep_get(Object *o) {
      return (Object_intRep *) &o->intRep;
    }
    int Object_intRep_ivalue_get(Object_intRep *o) {
      return o->ivalue;
    }
    int Object_intRep_ivalue_set(Object_intRep *o, int value) {
      return (o->ivalue = value);
    }
    double Object_intRep_dvalue_get(Object_intRep *o) {
      return o->dvalue;
    }
    ... etc ...
    
    

    Although this process is a little hairy, it works like you would expect in the target scripting language--especially when proxy classes are used. For instance, in Perl:

    # Perl5 script for accessing nested member
    $o = CreateObject();                    # Create an object somehow
    $o->{intRep}->{ivalue} = 7              # Change value of o.intRep.ivalue
    

    If you have a lot of nested structure declarations, it is advisable to double-check them after running SWIG. Although, there is a good chance that they will work, you may have to modify the interface file in certain cases.

    Finally, note that nesting is handled differently in C++ mode, see Nested classes.

    5.5.8 Other things to note about structure wrapping

    SWIG doesn't care if the declaration of a structure in a .i file exactly matches that used in the underlying C code (except in the case of nested structures). For this reason, there are no problems omitting problematic members or simply omitting the structure definition altogether. If you are happy passing pointers around, this can be done without ever giving SWIG a structure definition.

    Starting with SWIG1.3, a number of improvements have been made to SWIG's code generator. Specifically, even though structure access has been described in terms of high-level accessor functions such as this,

    double Vector_x_get(Vector *v) {
      return v->x;
    }
    

    most of the generated code is actually inlined directly into wrapper functions. Therefore, no function Vector_x_get() actually exists in the generated wrapper file. For example, when creating a Tcl module, the following function is generated instead:

    static int
    _wrap_Vector_x_get(ClientData clientData, Tcl_Interp *interp, 
                       int objc, Tcl_Obj *CONST objv[]) {
      struct Vector *arg1 ;
      double result ;
    
      if (SWIG_GetArgs(interp, objc, objv, "p:Vector_x_get self ", &arg0,
                       SWIGTYPE_p_Vector) == TCL_ERROR)
        return TCL_ERROR;
      result = (double ) (arg1->x);
      Tcl_SetObjResult(interp, Tcl_NewDoubleObj((double) result));
      return TCL_OK;
    }
    

    The only exception to this rule are methods defined with %extend . In this case, the added code is contained in a separate function.

    Finally, it is important to note that most language modules may choose to build a more advanced interface. Although you may never use the low-level interface described here, most of SWIG's language modules use it in some way or another.

    5.6 Code Insertion

    Sometimes it is necessary to insert special code into the resulting wrapper file generated by SWIG. For example, you may want to include additional C code to perform initialization or other operations. There are four common ways to insert code, but it's useful to know how the output of SWIG is structured first.

    5.6.1 The output of SWIG

    When SWIG creates its output C/C++ file, it is broken up into five sections corresponding to runtime code, headers, wrapper functions, and module initialization code (in that order).

    • Begin section.
      A placeholder for users to put code at the beginning of the C/C++ wrapper file. This is most often used to define preprocessor macros that are used in later sections.
    • Runtime code.
      This code is internal to SWIG and is used to include type-checking and other support functions that are used by the rest of the module.
    • Header section.
      This is user-defined support code that has been included by the %{ ... %} directive. Usually this consists of header files and other helper functions.
    • Wrapper code.
      These are the wrappers generated automatically by SWIG.
    • Module initialization.
      The function generated by SWIG to initialize the module upon loading.

    5.6.2 Code insertion blocks

    The %insert directive enables inserting blocks of code into a given section of the generated code. It can be used in one of two ways:

    %insert("section") "filename"
    %insert("section") %{ ... %}
    

    The first will dump the contents of the file in the given filename into the named section. The second inserts the code between the braces into the named section. For example, the following adds code into the runtime section:

    %insert("runtime") %{
      ... code in runtime section ...
    %}
    

    There are the 5 sections, however, some target languages add in additional sections and some of these result in code being generated into a target language file instead of the C/C++ wrapper file. These are documented when available in the target language chapters. Macros named after the code sections are available as additional directives and these macro directives are normally used instead of %insert . For example, %runtime is used instead of %insert("runtime"). The valid sections and order of the sections in the generated C/C++ wrapper file is as shown:

    %begin %{
      ... code in begin section ...
    %}
    
    %runtime %{
      ... code in runtime section ...
    %}
    
    %header %{
      ... code in header section ...
    %}
    
    %wrapper %{
      ... code in wrapper section ...
    %}
    
    %init %{
      ... code in init section ...
    %}
    

    The bare %{ ... %} directive is a shortcut that is the same as %header %{ ... %}.

    The %begin section is effectively empty as it just contains the SWIG banner by default. This section is provided as a way for users to insert code at the top of the wrapper file before any other code is generated. Everything in a code insertion block is copied verbatim into the output file and is not parsed by SWIG. Most SWIG input files have at least one such block to include header files and support C code. Additional code blocks may be placed anywhere in a SWIG file as needed.

    %module mymodule
    %{
    #include "my_header.h"
    %}
    ... Declare functions here
    %{
    
    void some_extra_function() {
      ...
    }
    %}
    

    A common use for code blocks is to write "helper" functions. These are functions that are used specifically for the purpose of building an interface, but which are generally not visible to the normal C program. For example :

    %{
    /* Create a new vector */
    static Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    
    %}
    // Now wrap it 
    Vector *new_Vector();
    

    5.6.3 Inlined code blocks

    Since the process of writing helper functions is fairly common, there is a special inlined form of code block that is used as follows :

    %inline %{
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    %}
    

    This is the same as writing:

    %{
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    %}
    
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    

    In other words, the %inline directive inserts all of the code that follows verbatim into the header portion of an interface file. The code is then parsed by both the SWIG preprocessor and parser. Thus, the above example creates a new command new_Vector using only one declaration. Since the code inside an %inline %{ ... %} block is given to both the C compiler and SWIG, it is illegal to include any SWIG directives inside a %{ ... %} block.

    Note: The usual SWIG C preprocessor rules apply to code in %apply blocks when SWIG parses this code. For example, as mentioned earlier, SWIG's C Preprocessor does not follow #include directives by default.

    5.6.4 Initialization blocks

    When code is included in the %init section, it is copied directly into the module initialization function. For example, if you needed to perform some extra initialization on module loading, you could write this:

    %init %{
      init_variables();
    %}
    

    Please note that some language backends (e.g. C# or Java) don't have any initialization function, hence you should define a global object performing the necessary initialization for them instead:

    %init %{
      static struct MyInit { MyInit() { init_variables(); } } myInit;
    %}
    

    5.7 An Interface Building Strategy

    This section describes the general approach for building interfaces with SWIG. The specifics related to a particular scripting language are found in later chapters.

    5.7.1 Preparing a C program for SWIG

    SWIG doesn't require modifications to your C code, but if you feed it a collection of raw C header files or source code, the results might not be what you expect---in fact, they might be awful. Here's a series of steps you can follow to make an interface for a C program :

    • Identify the functions that you want to wrap. It's probably not necessary to access every single function of a C program--thus, a little forethought can dramatically simplify the resulting scripting language interface. C header files are a particularly good source for finding things to wrap.
    • Create a new interface file to describe the scripting language interface to your program.
    • Copy the appropriate declarations into the interface file or use SWIG's %include directive to process an entire C source/header file.
    • Make sure everything in the interface file uses ISO C/C++ syntax.
    • Make sure all necessary `typedef' declarations and type-information is available in the interface file. In particular, ensure that the type information is specified in the correct order as required by a C/C++ compiler. Most importantly, define a type before it is used! A C compiler will tell you if the full type information is not available if it is needed, whereas SWIG will usually not warn or error out as it is designed to work without full type information. However, if type information is not specified correctly, the wrappers can be sub-optimal and even result in uncompilable C/C++ code.
    • If your program has a main() function, you may need to rename it (read on).
    • Run SWIG and compile.

    Although this may sound complicated, the process turns out to be fairly easy once you get the hang of it.

    In the process of building an interface, SWIG may encounter syntax errors or other problems. The best way to deal with this is to simply copy the offending code into a separate interface file and edit it. However, the SWIG developers have worked very hard to improve the SWIG parser--you should report parsing errors to the swig-devel mailing list or to the SWIG bug tracker.

    5.7.2 The SWIG interface file

    The preferred method of using SWIG is to generate a separate interface file. Suppose you have the following C header file :

    /* File : header.h */
    
    #include <stdio.h>
    #include <math.h>
    
    extern int foo(double);
    extern double bar(int, int);
    extern void dump(FILE *f);
    
    

    A typical SWIG interface file for this header file would look like the following :

    /* File : interface.i */
    %module mymodule
    %{
    #include "header.h"
    %}
    extern int foo(double);
    extern double bar(int, int);
    extern void dump(FILE *f);
    
    

    Of course, in this case, our header file is pretty simple so we could use a simpler approach and use an interface file like this:

    /* File : interface.i */
    %module mymodule
    %{
    #include "header.h"
    %}
    %include "header.h"
    

    The main advantage of this approach is minimal maintenance of an interface file for when the header file changes in the future. In more complex projects, an interface file containing numerous %include and #include statements like this is one of the most common approaches to interface file design due to lower maintenance overhead.

    5.7.3 Why use separate interface files?

    Although SWIG can parse many header files, it is more common to write a special .i file defining the interface to a package. There are several reasons why you might want to do this:

    • It is rarely necessary to access every single function in a large package. Many C functions might have little or no use in a scripted environment. Therefore, why wrap them?
    • Separate interface files provide an opportunity to provide more precise rules about how an interface is to be constructed.
    • Interface files can provide more structure and organization.
    • SWIG can't parse certain definitions that appear in header files. Having a separate file allows you to eliminate or work around these problems.
    • Interface files provide a more precise definition of what the interface is. Users wanting to extend the system can go to the interface file and immediately see what is available without having to dig it out of header files.

    5.7.4 Getting the right header files

    Sometimes, it is necessary to use certain header files in order for the code generated by SWIG to compile properly. Make sure you include certain header files by using a %{ %} block like this:

    %module graphics
    %{
    #include <GL/gl.h>
    #include <GL/glu.h>
    %}
    
    // Put the rest of the declarations here
    ...
    

    5.7.5 What to do with main()

    If your program defines a main() function, you may need to get rid of it or rename it in order to use a scripting language. Most scripting languages define their own main() procedure that is called instead. main() also makes no sense when working with dynamic loading. There are a few approaches to solving the main() conflict :

    • Get rid of main() entirely.
    • Rename main() to something else. You can do this by compiling your C program with an option like -Dmain=oldmain.
    • Use conditional compilation to only include main() when not using a scripting language.

    Getting rid of main() may cause potential initialization problems of a program. To handle this problem, you may consider writing a special function called program_init() that initializes your program upon startup. This function could then be called either from the scripting language as the first operation, or when the SWIG generated module is loaded.

    As a general note, many C programs only use the main() function to parse command line options and to set parameters. However, by using a scripting language, you are probably trying to create a program that is more interactive. In many cases, the old main() program can be completely replaced by a Perl, Python, or Tcl script.

    Note: In some cases, you might be inclined to create a scripting language wrapper for main(). If you do this, the compilation will probably work and your module might even load correctly. The only trouble is that when you call your main() wrapper, you will find that it actually invokes the main() of the scripting language interpreter itself! This behavior is a side effect of the symbol binding mechanism used in the dynamic linker. The bottom line: don't do this.


    6 SWIG and C++

    This chapter describes SWIG's support for wrapping C++. It is mostly concerned about C++ as defined by the C++ 98 and 03 standards. For additions to the original C++ standard, please read the SWIG and C++11, SWIG and C++14 and SWIG and C++17 chapters. As a prerequisite, you should first read the chapter SWIG Basics to see how SWIG wraps ISO C. Support for C++ builds upon ISO C wrapping and that material will be useful in understanding this chapter.

    6.1 Comments on C++ Wrapping

    Because of its complexity and the fact that C++ can be difficult to integrate with itself let alone other languages, SWIG only provides support for a subset of C++ features. Fortunately, this is now a rather large subset.

    In part, the problem with C++ wrapping is that there is no semantically obvious (or automatic ) way to map many of its advanced features into other languages. As a simple example, consider the problem of wrapping C++ multiple inheritance to a target language with no such support. Similarly, the use of overloaded operators and overloaded functions can be problematic when no such capability exists in a target language.

    A more subtle issue with C++ has to do with the way that some C++ programmers think about programming libraries. In the world of SWIG, you are really trying to create binary-level software components for use in other languages. In order for this to work, a "component" has to contain real executable instructions and there has to be some kind of binary linking mechanism for accessing its functionality. In contrast, C++ has increasingly relied upon generic programming and templates for much of its functionality. Although templates are a powerful feature, they are largely orthogonal to the whole notion of binary components and libraries. For example, an STL vector does not define any kind of binary object for which SWIG can just create a wrapper. To further complicate matters, these libraries often utilize a lot of behind the scenes magic in which the semantics of seemingly basic operations (e.g., pointer dereferencing, procedure call, etc.) can be changed in dramatic and sometimes non-obvious ways. Although this "magic" may present few problems in a C++-only universe, it greatly complicates the problem of crossing language boundaries and provides many opportunities to shoot yourself in the foot. You will just have to be careful.

    6.2 Approach

    To wrap C++, SWIG uses a layered approach to code generation. At the lowest level, SWIG generates a collection of procedural ISO C style wrappers. These wrappers take care of basic type conversion, type checking, error handling, and other low-level details of the C++ binding. These wrappers are also sufficient to bind C++ into any target language that supports built-in procedures. In some sense, you might view this layer of wrapping as providing a C library interface to C++. On top of the low-level procedural (flattened) interface, SWIG generates proxy classes that provide a natural object-oriented (OO) interface to the underlying code. The proxy classes are typically written in the target language itself. For instance, in Python, a real Python class is used to provide a wrapper around the underlying C++ object.

    It is important to emphasize that SWIG takes a deliberately conservative and non-intrusive approach to C++ wrapping. SWIG does not encapsulate C++ classes inside a special C++ adaptor, it does not rely upon templates, nor does it add in additional C++ inheritance when generating wrappers. The last thing that most C++ programs need is even more compiler magic. Therefore, SWIG tries to maintain a very strict and clean separation between the implementation of your C++ application and the resulting wrapper code. You might say that SWIG has been written to follow the principle of least surprise--it does not play sneaky tricks with the C++ type system, it doesn't mess with your class hierarchies, and it doesn't introduce new semantics. Although this approach might not provide the most seamless integration with C++, it is safe, simple, portable, and debuggable.

    Some of this chapter focuses on the low-level procedural interface to C++ that is used as the foundation for all language modules. Keep in mind that the target languages also provide the high-level OO interface via proxy classes. More detailed coverage can be found in the documentation for each target language.

    6.3 Supported C++ features

    SWIG currently supports most C++ features including the following:

    • Classes
    • Constructors and destructors
    • Virtual functions
    • Public inheritance (including multiple inheritance)
    • Static functions
    • Function and method overloading
    • Operator overloading for many standard operators
    • References
    • Templates (including specialization and member templates)
    • Pointers to members
    • Namespaces
    • Default parameters
    • Smart pointers

    The following C++ features are not currently supported:

    • Overloaded versions of certain operators (new, delete, etc.)

    As a rule of thumb, SWIG should not be used on raw C++ source files, use header files only.

    SWIG's C++ support is an ongoing project so some of these limitations may be lifted in future releases. However, we make no promises. Also, submitting a bug report is a very good way to get problems fixed (wink).

    6.4 Command line options and compilation

    When wrapping C++ code, it is critical that SWIG be called with the `-c++' option. This changes the way a number of critical features such as memory management are handled. It also enables the recognition of C++ keywords. Without the -c++ flag, SWIG will either issue a warning or a large number of syntax errors if it encounters C++ code in an interface file.

    When compiling and linking the resulting wrapper file, it is normal to use the C++ compiler. For example:

    $ swig -c++ -tcl example.i
    $ c++ -fPIC -c example_wrap.cxx 
    $ c++ example_wrap.o $(OBJS) -o example.so
    

    Unfortunately, the process varies slightly on each platform. Make sure you refer to the documentation on each target language for further details. The SWIG Wiki also has further details.

    Compatibility Note: Early versions of SWIG generated just a flattened low-level C style API to C++ classes by default. The -noproxy commandline option is recognised by many target languages and will generate just this interface as in earlier versions.

    6.5 Proxy classes

    In order to provide a natural mapping from C++ classes to the target language classes, SWIG's target languages mostly wrap C++ classes with special proxy classes. These proxy classes are typically implemented in the target language itself. For example, if you're building a Python module, each C++ class is wrapped by a Python proxy class. Or if you're building a Java module, each C++ class is wrapped by a Java proxy class.

    6.5.1 Construction of proxy classes

    Proxy classes are always constructed as an extra layer of wrapping that uses low-level accessor functions. To illustrate, suppose you had a C++ class like this:

    class Foo {
      public:
        Foo();
        ~Foo();
        int  bar(int x);
        int  x;
    };
    

    Using C++ as pseudocode, a proxy class looks something like this:

    class FooProxy {
      private:
        Foo    *self;
      public:
        FooProxy() {
          self = new_Foo();
        }
        ~FooProxy() {
          delete_Foo(self);
        }
        int bar(int x) {
          return Foo_bar(self, x);
        }
        int x_get() {
          return Foo_x_get(self);
        }
        void x_set(int x) {
          Foo_x_set(self, x);
        }
    };
    

    Of course, always keep in mind that the real proxy class is written in the target language. For example, in Python, the proxy might look roughly like this:

    class Foo:
        def __init__(self):
            self.this = new_Foo()
        def __del__(self):
            delete_Foo(self.this)
        def bar(self, x):
            return Foo_bar(self.this, x)
        def __getattr__(self, name):
            if name == 'x':
                return Foo_x_get(self.this)
            ...
        def __setattr__(self, name, value):
            if name == 'x':
                Foo_x_set(self.this, value)
            ...
    

    Again, it's important to emphasize that the low-level accessor functions are always used by the proxy classes. Whenever possible, proxies try to take advantage of language features that are similar to C++. This might include operator overloading, exception handling, and other features.

    6.5.2 Resource management in proxies

    A major issue with proxies concerns the memory management of wrapped objects. Consider the following C++ code:

    class Foo {
    public:
      Foo();
      ~Foo();
      int bar(int x);
      int x;
    };
    
    class Spam {
    public:
      Foo *value;
      ...
    };
    

    Consider some script code that uses these classes:

    f = Foo()               # Creates a new Foo
    s = Spam()              # Creates a new Spam
    s.value = f             # Stores a reference to f inside s
    g = s.value             # Returns stored reference
    g = 4                   # Reassign g to some other value
    del f                   # Destroy f 
    

    Now, ponder the resulting memory management issues. When objects are created in the script, the objects are wrapped by newly created proxy classes. That is, there is both a new proxy class instance and a new instance of the underlying C++ class. In this example, both f and s are created in this way. However, the statement s.value is rather curious---when executed, a pointer to f is stored inside another object. This means that the scripting proxy class AND another C++ class share a reference to the same object. To make matters even more interesting, consider the statement g = s.value. When executed, this creates a new proxy class g that provides a wrapper around the C++ object stored in s.value . In general, there is no way to know where this object came from---it could have been created by the script, but it could also have been generated internally. In this particular example, the assignment of g results in a second proxy class for f. In other words, a reference to f is now shared by two proxy classes and a C++ class.

    Finally, consider what happens when objects are destroyed. In the statement, g=4, the variable g is reassigned. In many languages, this makes the old value of g available for garbage collection. Therefore, this causes one of the proxy classes to be destroyed. Later on, the statement del f destroys the other proxy class. Of course, there is still a reference to the original object stored inside another C++ object. What happens to it? Is the object still valid?

    To deal with memory management problems, proxy classes provide an API for controlling ownership. In C++ pseudocode, ownership control might look roughly like this:

    class FooProxy {
      public:
        Foo    *self;
        int     thisown;
    
        FooProxy() {
          self = new_Foo();
          thisown = 1;       // Newly created object
        }
        ~FooProxy() {
          if (thisown) delete_Foo(self);
        }
        ...
        // Ownership control API
        void disown() {
          thisown = 0;
        }
        void acquire() {
          thisown = 1;
        }
    };
    
    class FooPtrProxy: public FooProxy {
    public:
      FooPtrProxy(Foo *s) {
        self = s;
        thisown = 0;
      }
    };
    
    class SpamProxy {
      ...
      FooProxy *value_get() {
        return FooPtrProxy(Spam_value_get(self));
      }
      void value_set(FooProxy *v) {
        Spam_value_set(self, v->self);
        v->disown();
      }
      ...
    };
    

    Looking at this code, there are a few central features:

    • Each proxy class keeps an extra flag to indicate ownership. C++ objects are only destroyed if the ownership flag is set.
    • When new objects are created in the target language, the ownership flag is set.
    • When a reference to an internal C++ object is returned, it is wrapped by a proxy class, but the proxy class does not have ownership.
    • In certain cases, ownership is adjusted. For instance, when a value is assigned to the member of a class, ownership is lost.
    • Manual ownership control is provided by special disown() and acquire() methods.

    Given the tricky nature of C++ memory management, it is impossible for proxy classes to automatically handle every possible memory management problem. However, proxies do provide a mechanism for manual control that can be used (if necessary) to address some of the more tricky memory management problems.

    6.5.3 Language specific details

    Language specific details on proxy classes are contained in the chapters describing each target language. This chapter has merely introduced the topic in a very general way.

    6.6 Simple C++ wrapping

    The following code shows a SWIG interface file for a simple C++ class.

    %module list
    %{
    #include "list.h"
    %}
    
    // Very simple C++ example for linked list
    
    class List {
    public:
      List();
      ~List();
      int  search(char *value);
      void insert(char *);
      void remove(char *);
      char *get(int n);
      int  length;
    static void print(List *l);
    };
    

    To generate wrappers for this class, SWIG first reduces the class to a collection of low-level C-style accessor functions which are then used by the proxy classes.

    6.6.1 Constructors and destructors

    C++ constructors and destructors are translated into accessor functions such as the following :

    List * new_List(void) {
      return new List;
    }
    void delete_List(List *l) {
      delete l;
    }
    
    

    6.6.2 Default constructors, copy constructors and implicit destructors

    Following the C++ rules for implicit constructor and destructors, SWIG will automatically assume there is one even when they are not explicitly declared in the class interface.

    In general then:

    • If a C++ class does not declare any explicit constructor, SWIG will automatically generate a wrapper for one.
    • If a C++ class does not declare an explicit copy constructor, SWIG will automatically generate a wrapper for one if the %copyctor is used.
    • If a C++ class does not declare an explicit destructor, SWIG will automatically generate a wrapper for one.

    And as in C++, a few rules that alters the previous behavior:

    • A default constructor is not created if a class already defines a constructor with arguments.
    • Default constructors are not generated for classes with pure virtual methods or for classes that inherit from an abstract class, but don't provide definitions for all of the pure methods.
    • A default constructor is not created unless all base classes support a default constructor.
    • Default constructors and implicit destructors are not created if a class defines them in a private or protected section.
    • Default constructors and implicit destructors are not created if any base class defines a non-public default constructor or destructor.

    SWIG should never generate a default constructor, copy constructor or default destructor wrapper for a class in which it is illegal to do so. In some cases, however, it could be necessary (if the complete class declaration is not visible from SWIG, and one of the above rules is violated) or desired (to reduce the size of the final interface) by manually disabling the implicit constructor/destructor generation.

    To manually disable these, the %nodefaultctor and %nodefaultdtor feature flag directives can be used. Note that these directives only affects the implicit generation, and they have no effect if the default/copy constructors or destructor are explicitly declared in the class interface.

    For example:

    %nodefaultctor Foo;  // Disable the default constructor for class Foo.
    class Foo {          // No default constructor is generated, unless one is declared
    ...
    };
    class Bar {          // A default constructor is generated, if possible
    ...
    };
    

    The directive %nodefaultctor can also be applied "globally", as in:

    %nodefaultctor; // Disable creation of default constructors
    class Foo {     // No default constructor is generated, unless one is declared
    ...
    };
    class Bar {   
    public:
      Bar();        // The default constructor is generated, since one is declared
    };
    %clearnodefaultctor; // Enable the creation of default constructors again
    

    The corresponding %nodefaultdtor directive can be used to disable the generation of the default or implicit destructor, if needed. Be aware, however, that this could lead to memory leaks in the target language. Hence, it is recommended to use this directive only in well known cases. For example:

    %nodefaultdtor Foo;   // Disable the implicit/default destructor for class Foo.
    class Foo {           // No destructor is generated, unless one is declared
    ...
    };
    

    Compatibility Note: The generation of default constructors/implicit destructors was made the default behavior in SWIG 1.3.7. This may break certain older modules, but the old behavior can be easily restored using %nodefault or the -nodefault command line option. Furthermore, in order for SWIG to properly generate (or not generate) default constructors, it must be able to gather information from both the private and protected sections (specifically, it needs to know if a private or protected constructor/destructor is defined). In older versions of SWIG, it was fairly common to simply remove or comment out the private and protected sections of a class due to parser limitations. However, this removal may now cause SWIG to erroneously generate constructors for classes that define a constructor in those sections. Consider restoring those sections in the interface or using %nodefault to fix the problem.

    Note: The %nodefault directive/-nodefault options described above, which disable both the default constructor and the implicit destructors, could lead to memory leaks, and so it is strongly recommended to not use them.

    6.6.3 When constructor wrappers aren't created

    If a class defines a constructor, SWIG normally tries to generate a wrapper for it. However, SWIG will not generate a constructor wrapper if it thinks that it will result in illegal wrapper code. There are really two cases where this might show up.

    First, SWIG won't generate wrappers for protected or private constructors. For example:

    class Foo {
    protected:
      Foo();         // Not wrapped.
    public:
      ...
    };
    

    Next, SWIG won't generate wrappers for a class if it appears to be abstract--that is, it has undefined pure virtual methods. Here are some examples:

    class Bar {
    public:
      Bar();               // Not wrapped.  Bar is abstract.
      virtual void spam(void) = 0;
    };
    
    class Grok : public Bar {
    public:
      Grok();              // Not wrapped. No implementation of abstract spam().
    };
    

    Some users are surprised (or confused) to find missing constructor wrappers in their interfaces. In almost all cases, this is caused when classes are determined to be abstract. To see if this is the case, run SWIG with all of its warnings turned on:

    % swig -Wall -python module.i
    

    In this mode, SWIG will issue a warning for all abstract classes. It is possible to force a class to be non-abstract using this:

    %feature("notabstract") Foo;
    
    class Foo : public Bar {
    public:
      Foo();    // Generated no matter what---not abstract.
      ...
    };
    

    More information about %feature can be found in the Customization features chapter.

    6.6.4 Copy constructors

    If a class defines more than one constructor, its behavior depends on the capabilities of the target language. If overloading is supported, the copy constructor is accessible using the normal constructor function. For example, if you have this:

    class List {
    public:
      List();    
      List(const List &);      // Copy constructor
      ...
    };
    

    then the copy constructor can be used as follows:

    x = List()               # Create a list
    y = List(x)              # Copy list x
    

    If the target language does not support overloading, then the copy constructor is available through a special function like this:

    List *copy_List(List *f) {
      return new List(*f);
    }
    

    Note: For a class X, SWIG only treats a constructor as a copy constructor if it can be applied to an object of type X or X *. If more than one copy constructor is defined, only the first definition that appears is used as the copy constructor--other definitions will result in a name-clash. Constructors such as X(const X &), X(X &), and X(X *) are handled as copy constructors in SWIG.

    Note: SWIG does not generate a copy constructor wrapper unless one is explicitly declared in the class. This differs from the treatment of default constructors and destructors. However, copy constructor wrappers can be generated if using the copyctor feature flag. For example:

    %copyctor List;
    
    class List {
    public:
      List();    
    };
    

    Will generate a copy constructor wrapper for List.

    Compatibility note: Special support for copy constructors was not added until SWIG-1.3.12. In previous versions, copy constructors could be wrapped, but they had to be renamed. For example:

    class Foo {
    public:
      Foo();
      %name(CopyFoo) Foo(const Foo &);
      ...
    };
    

    For backwards compatibility, SWIG does not perform any special copy-constructor handling if the constructor has been manually renamed. For instance, in the above example, the name of the constructor is set to new_CopyFoo(). This is the same as in older versions.

    6.6.5 Member functions

    All member functions are roughly translated into accessor functions like this :

    int List_search(List *obj, char *value) {
      return obj->search(value);
    }
    
    

    This translation is the same even if the member function has been declared as virtual.

    It should be noted that SWIG does not actually create a C accessor function in the code it generates. Instead, member access such as obj->search(value) is directly inlined into the generated wrapper functions. However, the name and calling convention of the low-level procedural wrappers match the accessor function prototype described above.

    6.6.6 Static members

    Static member functions are called directly without making any special transformations. For example, the static member function print(List *l) directly invokes List::print(List *l) in the generated wrapper code.

    6.6.7 Member data

    Member data is handled in exactly the same manner as for C structures. A pair of accessor functions are effectively created. For example :

    int List_length_get(List *obj) {
      return obj->length;
    }
    int List_length_set(List *obj, int value) {
      obj->length = value;
      return value;
    }
    
    

    A read-only member can be created using the %immutable and %mutable feature flag directive. For example, we probably wouldn't want the user to change the length of a list so we could do the following to make the value available, but read-only.

    class List {
    public:
    ...
    %immutable;
      int length;
    %mutable;
    ...
    };
    

    Alternatively, you can specify an immutable member in advance like this:

    %immutable List::length;
    ...
    class List {
      ...
      int length;         // Immutable by above directive
      ...
    };
    

    Similarly, all data attributes declared as const are wrapped as read-only members.

    By default, SWIG uses the const reference typemaps for members that are primitive types. There are some subtle issues when wrapping data members that are not primitive types, such as classes. For instance, if you had another class like this,

    class Foo {
    public:
      List items;
      ...
    

    then the low-level accessor to the items member actually uses pointers. For example:

    List *Foo_items_get(Foo *self) {
      return &self->items;
    }
    void Foo_items_set(Foo *self, List *value) {
      self->items = *value;
    }
    

    More information about this can be found in the SWIG Basics chapter, Structure data members section.

    The wrapper code to generate the accessors for classes comes from the pointer typemaps. This can be somewhat unnatural for some types. For example, a user would expect the STL std::string class member variables to be wrapped as a string in the target language, rather than a pointer to this class. The const reference typemaps offer this type of marshalling, so there is a feature to tell SWIG to use the const reference typemaps rather than the pointer typemaps. It is the naturalvar feature and can be used to effectively change the way accessors are generated to the following:

    const List &Foo_items_get(Foo *self) {
      return self->items;
    }
    void Foo_items_set(Foo *self, const List &value) {
      self->items = value;
    }
    

    The %naturalvar directive is a macro for, and hence equivalent to, %feature("naturalvar"). It can be used as follows:

    // All List variables will use const List& typemaps
    %naturalvar List;
    
    // Only Foo::myList will use const List& typemaps
    %naturalvar Foo::myList;
    struct Foo {
      List myList;
    };
    
    // All non-primitive types will use const reference typemaps
    %naturalvar;
    

    The observant reader will notice that %naturalvar works like any other feature flag directive but with some extra flexibility. The first of the example usages above shows %naturalvar attaching to the myList 's variable type, that is the List class. The second usage shows %naturalvar attaching to the variable name. Hence the naturalvar feature can be used on either the variable's name or type. Note that using the naturalvar feature on a variable's name overrides any naturalvar feature attached to the variable's type.

    It is generally a good idea to use this feature globally as the reference typemaps have extra NULL checking compared to the pointer typemaps. A pointer can be NULL, whereas a reference cannot, so the extra checking ensures that the target language user does not pass in a value that translates to a NULL pointer and thereby preventing any potential NULL pointer dereferences. The %naturalvar feature will apply to global variables in addition to member variables in some language modules, eg C# and Java.

    The naturalvar behavior can also be turned on as a global setting via the -naturalvar commandline option or the module mode option, %module(naturalvar=1). However, any use of %feature("naturalvar") will override the global setting.

    Compatibility note: The %naturalvar feature was introduced in SWIG-1.3.28, prior to which it was necessary to manually apply the const reference typemaps, eg %apply const std::string & { std::string * }, but this example would also apply the typemaps to methods taking a std::string pointer.

    Compatibility note: Read-only access used to be controlled by a pair of directives %readonly and %readwrite. Although these directives still work, they generate a warning message. Simply change the directives to %immutable; and %mutable; to silence the warning. Don't forget the extra semicolon!

    Compatibility note: Prior to SWIG-1.3.12, all members of unknown type were wrapped into accessor functions using pointers. For example, if you had a structure like this

    struct Foo {
      size_t  len;
    };
    

    and nothing was known about size_t, then accessors would be written to work with size_t *. Starting in SWIG-1.3.12, this behavior has been modified. Specifically, pointers will only be used if SWIG knows that a datatype corresponds to a structure or class. Therefore, the above code would be wrapped into accessors involving size_t. This change is subtle, but it smooths over a few problems related to structure wrapping and some of SWIG's customization features.

    6.7 Protection

    SWIG wraps class members that are public following the C++ conventions, i.e., by explicit public declaration or by the use of the using directive. In general, anything specified in a private or protected section will be ignored, although the internal code generator sometimes looks at the contents of the private and protected sections so that it can properly generate code for default constructors and destructors. Directors could also modify the way non-public virtual protected members are treated.

    By default, members of a class definition are assumed to be private until you explicitly give a `public:' declaration (This is the same convention used by C++).

    6.8 Enums and constants

    Enumerations and constants are handled differently by the different language modules and are described in detail in the appropriate language chapter. However, many languages map enums and constants in a class definition into constants with the classname as a prefix. For example :

    class Swig {
    public:
      enum {ALE, LAGER, PORTER, STOUT};
    };
    
    

    Generates the following set of constants in the target scripting language :

    Swig_ALE = Swig::ALE
    Swig_LAGER = Swig::LAGER
    Swig_PORTER = Swig::PORTER
    Swig_STOUT = Swig::STOUT
    
    

    Members declared as const are wrapped as read-only members and do not create constants.

    6.9 Friends

    Friend declarations are recognised by SWIG. For example, if you have this code:

    class Foo {
    public:
      ...
      friend void blah(Foo *f);
      ...
    };
    

    then the friend declaration does result in a wrapper code equivalent to one generated for the following declaration

    class Foo {
    public:
      ...
    };
    
    void blah(Foo *f);    
    

    A friend declaration, as in C++, is understood to be in the same scope where the class is declared, hence, you can have

    
    %ignore bar::blah(Foo *f);
    
    namespace bar {
    
      class Foo {
      public:
        ...
        friend void blah(Foo *f);
        ...
      };
    }
    

    and a wrapper for the method 'blah' will not be generated.

    6.10 References and pointers

    C++ references are supported, but SWIG transforms them back into pointers. For example, a declaration like this :

    class Foo {
    public:
      double bar(double &a);
    }
    

    has a low-level accessor

    double Foo_bar(Foo *obj, double *a) {
      obj->bar(*a);
    }
    

    As a special case, most language modules pass const references to primitive datatypes (int, short, float, etc.) by value instead of pointers. For example, if you have a function like this,

    void foo(const int &x);
    

    it is called from a script as follows:

    foo(3)              # Notice pass by value
    

    Functions that return a reference are remapped to return a pointer instead. For example:

    class Bar {
    public:
      Foo &spam();
    };
    

    Generates an accessor like this:

    Foo *Bar_spam(Bar *obj) {
      Foo &result = obj->spam();
      return &result;
    }
    

    However, functions that return const references to primitive datatypes (int, short, etc.) normally return the result as a value rather than a pointer. For example, a function like this,

    const int &bar();
    

    will return integers such as 37 or 42 in the target scripting language rather than a pointer to an integer.

    Don't return references to objects allocated as local variables on the stack. SWIG doesn't make a copy of the objects so this will probably cause your program to crash.

    Note: The special treatment for references to primitive datatypes is necessary to provide more seamless integration with more advanced C++ wrapping applications---especially related to templates and the STL. This was first added in SWIG-1.3.12.

    6.11 Pass and return by value

    Occasionally, a C++ program will pass and return class objects by value. For example, a function like this might appear:

    Vector cross_product(Vector a, Vector b);
    

    If no information is supplied about Vector, SWIG creates a wrapper function similar to the following:

    Vector *wrap_cross_product(Vector *a, Vector *b) {
      Vector x = *a;
      Vector y = *b;
      Vector r = cross_product(x, y);
      return new Vector(r);
    }

    In order for the wrapper code to compile, Vector must define a copy constructor and a default constructor.

    If Vector is defined as a class in the interface, but it does not support a default constructor, SWIG changes the wrapper code by encapsulating the arguments inside a special C++ template wrapper class, through a process called the "Fulton Transform". This produces a wrapper that looks like this:

    Vector cross_product(Vector *a, Vector *b) {
      SwigValueWrapper<Vector> x = *a;
      SwigValueWrapper<Vector> y = *b;
      SwigValueWrapper<Vector> r = cross_product(x, y);
      return new Vector(r);
    }
    

    This transformation is a little sneaky, but it provides support for pass-by-value even when a class does not provide a default constructor and it makes it possible to properly support a number of SWIG's customization options. The definition of SwigValueWrapper can be found by reading the SWIG wrapper code. This class is really nothing more than a thin wrapper around a pointer.

    Although SWIG usually detects the classes to which the Fulton Transform should be applied, in some situations it's necessary to override it. That's done with %feature("valuewrapper") to ensure it is used and %feature("novaluewrapper") to ensure it is not used:

    %feature("novaluewrapper") A;    
    class A;
    
    %feature("valuewrapper") B;
    struct B { 
      B();
      // ....
    };   
    

    It is well worth considering turning this feature on for classes that do have a default constructor. It will remove a redundant constructor call at the point of the variable declaration in the wrapper, so will generate notably better performance for large objects or for classes with expensive construction. Alternatively consider returning a reference or a pointer.

    Note: this transformation has no effect on typemaps or any other part of SWIG---it should be transparent except that you may see this code when reading the SWIG output file.

    Note: This template transformation is new in SWIG-1.3.11 and may be refined in future SWIG releases. In practice, it is only absolutely necessary to do this for classes that don't define a default constructor.

    Note: The use of this template only occurs when objects are passed or returned by value. It is not used for C++ pointers or references.

    6.12 Inheritance

    SWIG supports C++ inheritance of classes and allows both single and multiple inheritance, as limited or allowed by the target language. The SWIG type-checker knows about the relationship between base and derived classes and allows pointers to any object of a derived class to be used in functions of a base class. The type-checker properly casts pointer values and is safe to use with multiple inheritance.

    SWIG treats private or protected inheritance as close to the C++ spirit, and target language capabilities, as possible. In most cases, this means that SWIG will parse the non-public inheritance declarations, but that will have no effect in the generated code, besides the implicit policies derived for constructors and destructors.

    The following example shows how SWIG handles inheritance. For clarity, the full C++ code has been omitted.

    // shapes.i
    %module shapes
    %{
    #include "shapes.h"
    %}
    
    class Shape {
    public:
      double x, y;
      virtual double area() = 0;
      virtual double perimeter() = 0;
      void    set_location(double x, double y);
    };
    class Circle : public Shape {
    public:
      Circle(double radius);
      ~Circle();
      double area();
      double perimeter();
    };
    class Square : public Shape {
    public:
      Square(double size);
      ~Square();
      double area();
      double perimeter();
    }
    

    When wrapped into Python, we can perform the following operations (shown using the low level Python accessors):

    $ python
    >>> import shapes
    >>> circle = shapes.new_Circle(7)
    >>> square = shapes.new_Square(10)
    >>> print shapes.Circle_area(circle)
    153.93804004599999757
    >>> print shapes.Shape_area(circle)
    153.93804004599999757
    >>> print shapes.Shape_area(square)
    100.00000000000000000
    >>> shapes.Shape_set_location(square, 2, -3)
    >>> print shapes.Shape_perimeter(square)
    40.00000000000000000
    >>>
    

    In this example, Circle and Square objects have been created. Member functions can be invoked on each object by making calls to Circle_area, Square_area, and so on. However, the same results can be accomplished by simply using the Shape_area function on either object.

    One important point concerning inheritance is that the low-level accessor functions are only generated for classes in which they are actually declared. For instance, in the above example, the method set_location() is only accessible as Shape_set_location() and not as Circle_set_location() or Square_set_location() . Of course, the Shape_set_location() function will accept any kind of object derived from Shape. Similarly, accessor functions for the attributes x and y are generated as Shape_x_get(), Shape_x_set(), Shape_y_get(), and Shape_y_set(). Functions such as Circle_x_get() are not available--instead you should use Shape_x_get().

    Note that there is a one to one correlation between the low-level accessor functions and the proxy methods and therefore there is also a one to one correlation between the C++ class methods and the generated proxy class methods.

    Note: For the best results, SWIG requires all base classes to be defined in an interface. Otherwise, you may get a warning message like this:

    example.i:18: Warning 401: Nothing known about base class 'Foo'. Ignored.
    

    If any base class is undefined, SWIG still generates correct type relationships. For instance, a function accepting a Foo * will accept any object derived from Foo regardless of whether or not SWIG actually wrapped the Foo class. If you really don't want to generate wrappers for the base class, but you want to silence the warning, you might consider using the %import directive to include the file that defines Foo. %import simply gathers type information, but doesn't generate wrappers. Alternatively, you could just define Foo as an empty class in the SWIG interface or use warning suppression .

    Note: typedef-names can be used as base classes. For example:

    class Foo {
    ...
    };
    
    typedef Foo FooObj;
    class Bar : public FooObj {     // Ok.  Base class is Foo
    ...
    };
    

    Similarly, typedef allows unnamed structures to be used as base classes. For example:

    typedef struct {
      ...
    } Foo;
    
    class Bar : public Foo {    // Ok. 
    ...
    };
    

    Compatibility Note: Starting in version 1.3.7, SWIG only generates low-level accessor wrappers for the declarations that are actually defined in each class. This differs from SWIG1.1 which used to inherit all of the declarations defined in base classes and regenerate specialized accessor functions such as Circle_x_get(), Square_x_get(), Circle_set_location(), and Square_set_location(). This behavior resulted in huge amounts of replicated code for large class hierarchies and made it awkward to build applications spread across multiple modules (since accessor functions are duplicated in every single module). It is also unnecessary to have such wrappers when advanced features like proxy classes are used. Note: Further optimizations are enabled when using the -fvirtual option, which avoids the regenerating of wrapper functions for virtual members that are already defined in a base class.

    6.13 A brief discussion of multiple inheritance, pointers, and type checking

    When a target scripting language refers to a C++ object, it normally uses a tagged pointer object that contains both the value of the pointer and a type string. For example, in Tcl, a C++ pointer might be encoded as a string like this:

    _808fea88_p_Circle
    

    A somewhat common question is whether or not the type-tag could be safely removed from the pointer. For instance, to get better performance, could you strip all type tags and just use simple integers instead?

    In general, the answer to this question is no. In the wrappers, all pointers are converted into a common data representation in the target language. Typically this is the equivalent of casting a pointer to void *. This means that any C++ type information associated with the pointer is lost in the conversion.

    The problem with losing type information is that it is needed to properly support many advanced C++ features--especially multiple inheritance. For example, suppose you had code like this:

    class A {
    public:
      int x;
    };
    
    class B {
    public:
      int y;
    };
    
    class C : public A, public B {
    };
    
    int A_function(A *a) {
      return a->x;
    }
    
    int B_function(B *b) {
      return b->y;
    }
    

    Now, consider the following code that uses void *.

    C *c = new C();
    void *p = (void *) c;
    ...
    int x = A_function((A *) p);
    int y = B_function((B *) p);
    

    In this code, both A_function() and B_function() may legally accept an object of type C * (via inheritance). However, one of the functions will always return the wrong result when used as shown. The reason for this is that even though p points to an object of type C, the casting operation doesn't work like you would expect. Internally, this has to do with the data representation of C. With multiple inheritance, the data from each base class is stacked together. For example:

                 ------------    <--- (C *),  (A *)
                |     A      |
                |------------|   <--- (B *)
                |     B      |
                 ------------   
    

    Because of this stacking, a pointer of type C * may change value when it is converted to a A * or B *. However, this adjustment does not occur if you are converting from a void *.

    The use of type tags marks all pointers with the real type of the underlying object. This extra information is then used by SWIG generated wrappers to correctly cast pointer values under inheritance (avoiding the above problem).

    Some of the language modules are able to solve the problem by storing multiple instances of the pointer, for example, A *, in the A proxy class as well as C * in the C proxy class. The correct cast can then be made by choosing the correct void * pointer to use and is guaranteed to work as the cast to a void pointer and back to the same type does not lose any type information:

    C *c = new C();
    void *p = (void *) c;
    void *pA = (void *) c;
    void *pB = (void *) c;
    ...
    int x = A_function((A *) pA);
    int y = B_function((B *) pB);
    

    In practice, the pointer is held as an integral number in the target language proxy class.

    6.14 Default arguments

    SWIG will wrap all types of functions that have default arguments. For example member functions:

    class Foo {
    public:
      void bar(int x, int y = 3, int z = 4);
    };
    

    SWIG handles default arguments by generating an extra overloaded method for each defaulted argument. SWIG is effectively handling methods with default arguments as if it was wrapping the equivalent overloaded methods. Thus for the example above, it is as if we had instead given the following to SWIG:

    class Foo {
    public:
      void bar(int x, int y, int z);
      void bar(int x, int y);
      void bar(int x);
    };
    

    The wrappers produced are exactly the same as if the above code was instead fed into SWIG. Details of this are covered in the next section Overloaded functions and methods . This approach allows SWIG to wrap all possible default arguments, but can be verbose. For example if a method has ten default arguments, then eleven wrapper methods are generated.

    Please see the Features and default arguments section for more information on using %feature with functions with default arguments. The Renaming and ambiguity resolution section also deals with using %rename and %ignore on methods with default arguments. If you are writing your own typemaps for types used in methods with default arguments, you may also need to write a typecheck typemap. See the Typemaps and overloading section for details or otherwise use the compactdefaultargs feature flag as mentioned below.

    Compatibility note: Versions of SWIG prior to SWIG-1.3.23 wrapped default arguments slightly differently. Instead a single wrapper method was generated and the default values were copied into the C++ wrappers so that the method being wrapped was then called with all the arguments specified. If the size of the wrappers are a concern then this approach to wrapping methods with default arguments can be re-activated by using the compactdefaultargs feature flag.

    %feature("compactdefaultargs") Foo::bar;
    class Foo {
    public:
      void bar(int x, int y = 3, int z = 4);
    };
    

    This is great for reducing the size of the wrappers, but the caveat is it does not work for the statically typed languages, such as C# and Java, which don't have optional arguments in the language, Another restriction of this feature is that it cannot handle default arguments that are not public. The following example illustrates this:

    class Foo {
    private:
      static const int spam;
    public:
      void bar(int x, int y = spam);   // Won't work with %feature("compactdefaultargs") -
                                       // private default value
    };
    

    This produces uncompilable wrapper code because default values in C++ are evaluated in the same scope as the member function whereas SWIG evaluates them in the scope of a wrapper function (meaning that the values have to be public).

    The compactdefaultargs feature is automatically turned on when wrapping C code with default arguments. Some target languages will also automatically turn on this feature if the keyword arguments feature (kwargs) is specified for either C or C++ functions, and the target language supports kwargs, the compactdefaultargs feature is also automatically turned on. Keyword arguments are a language feature of some scripting languages, for example Ruby and Python. SWIG is unable to support kwargs when wrapping overloaded methods, so the default approach cannot be used.

    6.15 Overloaded functions and methods

    In many language modules, SWIG provides partial support for overloaded functions, methods, and constructors. For example, if you supply SWIG with overloaded functions like this:

    void foo(int x) {
      printf("x is %d\n", x);
    }
    void foo(char *x) {
      printf("x is '%s'\n", x);
    }
    

    The function is used in a completely natural way. For example:

    >>> foo(3)
    x is 3
    >>> foo("hello")
    x is 'hello'
    >>>
    

    Overloading works in a similar manner for methods and constructors. For example if you have this code,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);   // Copy constructor
      void bar(int x);
      void bar(char *s, int y);
    };
    

    it might be used like this

    >>> f = Foo()          # Create a Foo
    >>> f.bar(3)
    >>> g = Foo(f)         # Copy Foo
    >>> f.bar("hello", 2)
    

    6.15.1 Dispatch function generation

    The implementation of overloaded functions and methods is somewhat complicated due to the dynamic nature of scripting languages. Unlike C++, which binds overloaded methods at compile time, SWIG must determine the proper function as a runtime check for scripting language targets. This check is further complicated by the typeless nature of certain scripting languages. For instance, in Tcl, all types are simply strings. Therefore, if you have two overloaded functions like this,

    void foo(char *x);
    void foo(int x);
    

    the order in which the arguments are checked plays a rather critical role.

    For statically typed languages, SWIG uses the language's method overloading mechanism. To implement overloading for the scripting languages, SWIG generates a dispatch function that checks the number of passed arguments and their types. To create this function, SWIG first examines all of the overloaded methods and ranks them according to the following rules:

    1. Number of required arguments. Methods are sorted by increasing number of required arguments.
    2. Argument type precedence. All C++ datatypes are assigned a numeric type precedence value (which is determined by the language module).

      Type              Precedence
      ----------------  ----------
      TYPE *            0     (High)
      void *            20
      Integers          40
      Floating point    60
      char              80
      Strings           100   (Low)
      

      Using these precedence values, overloaded methods with the same number of required arguments are sorted in increased order of precedence values.

    This may sound very confusing, but an example will help. Consider the following collection of overloaded methods:

    void foo(double);
    void foo(int);
    void foo(Bar *);
    void foo();
    void foo(int x, int y, int z, int w);
    void foo(int x, int y, int z = 3);
    void foo(double x, double y);
    void foo(double x, Bar *z);
    

    The first rule simply ranks the functions by required argument count. This would produce the following list:

    rank
    -----
    [0]   foo()
    [1]   foo(double);
    [2]   foo(int);
    [3]   foo(Bar *);
    [4]   foo(int x, int y, int z = 3);
    [5]   foo(double x, double y)
    [6]   foo(double x, Bar *z)
    [7]   foo(int x, int y, int z, int w);
    

    The second rule, simply refines the ranking by looking at argument type precedence values.

    rank
    -----
    [0]   foo()
    [1]   foo(Bar *);
    [2]   foo(int);
    [3]   foo(double);
    [4]   foo(int x, int y, int z = 3);
    [5]   foo(double x, Bar *z)
    [6]   foo(double x, double y)
    [7]   foo(int x, int y, int z, int w);
    

    Finally, to generate the dispatch function, the arguments passed to an overloaded method are simply checked in the same order as they appear in this ranking.

    If you're still confused, don't worry about it---SWIG is probably doing the right thing.

    6.15.2 Ambiguity in overloading

    Regrettably, SWIG is not able to support every possible use of valid C++ overloading. Consider the following example:

    void foo(int x);
    void foo(long x);
    

    In C++, this is perfectly legal. However, in a scripting language, there is generally only one kind of integer object. Therefore, which one of these functions do you pick? Clearly, there is no way to truly make a distinction just by looking at the value of the integer itself ( int and long may even be the same precision). Therefore, when SWIG encounters this situation, it may generate a warning message like this for scripting languages:

    example.i:4: Warning 509: Overloaded method foo(long) effectively ignored,
    example.i:3: Warning 509: as it is shadowed by foo(int).
    

    or for statically typed languages like Java:

    example.i:4: Warning 516: Overloaded method foo(long) ignored,
    example.i:3: Warning 516: using foo(int) instead.
    at example.i:3 used.
    

    This means that the second overloaded function will be inaccessible from a scripting interface or the method won't be wrapped at all. This is done as SWIG does not know how to disambiguate it from an earlier method.

    Ambiguity problems are known to arise in the following situations:

    • Integer conversions. Datatypes such as int, long, and short cannot be disambiguated in some languages. Shown above.
    • Floating point conversion. float and double can not be disambiguated in some languages.
    • Pointers and references. For example, Foo * and Foo & .
    • Pointers and arrays. For example, Foo * and Foo [4] .
    • Pointers and instances. For example, Foo and Foo * . Note: SWIG converts all instances to pointers.
    • Qualifiers. For example, const Foo * and Foo *.
    • Default vs. non default arguments. For example, foo(int a, int b) and foo(int a, int b = 3).

    When an ambiguity arises, methods are checked in the same order as they appear in the interface file. Therefore, earlier methods will shadow methods that appear later.

    When wrapping an overloaded function, there is a chance that you will get a warning message like this:

    example.i:3: Warning 467: Overloaded foo(int) not supported (incomplete type checking rule - 
    no precedence level in typecheck typemap for 'int').
    

    This error means that the target language module supports overloading, but for some reason there is no type-checking rule that can be used to generate a working dispatch function. The resulting behavior is then undefined. You should report this as a bug to the SWIG bug tracking database if this is due to one of the typemaps supplied with SWIG.

    If you get an error message such as the following,

    foo.i:6. Overloaded declaration ignored.  Spam::foo(double )
    foo.i:5. Previous declaration is Spam::foo(int )
    foo.i:7. Overloaded declaration ignored.  Spam::foo(Bar *, Spam *, int )
    foo.i:5. Previous declaration is Spam::foo(int )
    

    it means that the target language module has not yet implemented support for overloaded functions and methods. The only way to fix the problem is to read the next section.

    6.15.3 Renaming and ambiguity resolution

    If an ambiguity in overload resolution occurs or if a module doesn't allow overloading, there are a few strategies for dealing with the problem. First, you can tell SWIG to ignore one of the methods. This is easy---simply use the %ignore directive. For example:

    %ignore foo(long);
    
    void foo(int);
    void foo(long);       // Ignored.  Oh well.
    

    The other alternative is to rename one of the methods. This can be done using %rename. For example:

    %rename("foo_short") foo(short);
    %rename(foo_long) foo(long);
    
    void foo(int);
    void foo(short);      // Accessed as foo_short()
    void foo(long);       // Accessed as foo_long()
    

    Note that the quotes around the new name are optional, however, should the new name be a C/C++ keyword they would be essential in order to avoid a parsing error. The %ignore and %rename directives are both rather powerful in their ability to match declarations. When used in their simple form, they apply to both global functions and methods. For example:

    /* Forward renaming declarations */
    %rename(foo_i) foo(int); 
    %rename(foo_d) foo(double);
    ...
    void foo(int);           // Becomes 'foo_i'
    void foo(char *c);       // Stays 'foo' (not renamed)
    
    class Spam {
    public:
      void foo(int);      // Becomes 'foo_i'
      void foo(double);   // Becomes 'foo_d'
      ...
    };
    

    If you only want the renaming to apply to a certain scope, the C++ scope resolution operator (::) can be used. For example:

    %rename(foo_i) ::foo(int);      // Only rename foo(int) in the global scope.
                                    // (will not rename class members)
    
    %rename(foo_i) Spam::foo(int);  // Only rename foo(int) in class Spam
    

    When a renaming operator is applied to a class as in Spam::foo(int), it is applied to that class and all derived classes. This can be used to apply a consistent renaming across an entire class hierarchy with only a few declarations. For example:

    %rename(foo_i) Spam::foo(int);
    %rename(foo_d) Spam::foo(double);
    
    class Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Bar : public Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Grok : public Bar {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    

    It is also possible to include %rename specifications in the class definition itself. For example:

    class Spam {
      %rename(foo_i) foo(int);
      %rename(foo_d) foo(double);
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Bar : public Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
    ...
    };
    

    In this case, the %rename directives still get applied across the entire inheritance hierarchy, but it's no longer necessary to explicitly specify the class prefix Spam::.

    A special form of %rename can be used to apply a renaming just to class members (of all classes):

    %rename(foo_i) *::foo(int);   // Only rename foo(int) if it appears in a class.
    

    Note: the *:: syntax is non-standard C++, but the '*' is meant to be a wildcard that matches any class name (we couldn't think of a better alternative so if you have a better idea, send email to the swig-devel mailing list.

    Although this discussion has primarily focused on %rename all of the same rules also apply to %ignore. For example:

    %ignore foo(double);          // Ignore all foo(double)
    %ignore Spam::foo;            // Ignore foo in class Spam
    %ignore Spam::foo(double);    // Ignore foo(double) in class Spam
    %ignore *::foo(double);       // Ignore foo(double) in all classes
    

    When applied to a base class, %ignore forces all definitions in derived classes to disappear. For example, %ignore Spam::foo(double) will eliminate foo(double) in Spam and all classes derived from Spam.

    Notes on %rename and %ignore:

    • Since, the %rename declaration is used to declare a renaming in advance, it can be placed at the start of an interface file. This makes it possible to apply a consistent name resolution without having to modify header files. For example:

      %module foo
      
      /* Rename these overloaded functions */
      %rename(foo_i) foo(int); 
      %rename(foo_d) foo(double);
      
      %include "header.h"
      
    • The scope qualifier (::) can also be used on simple names. For example:

      %rename(bar) ::foo;       // Rename foo to bar in global scope only
      %rename(bar) Spam::foo;   // Rename foo to bar in class Spam only
      %rename(bar) *::foo;      // Rename foo in classes only
      
    • Name matching tries to find the most specific match that is defined. A qualified name such as Spam::foo always has higher precedence than an unqualified name foo. Spam::foo has higher precedence than *::foo and *::foo has higher precedence than foo. A parameterized name has higher precedence than an unparameterized name within the same scope level. However, an unparameterized name with a scope qualifier has higher precedence than a parameterized name in global scope (e.g., a renaming of Spam::foo takes precedence over a renaming of foo(int) ).

    • The order in which %rename directives are defined does not matter as long as they appear before the declarations to be renamed. Thus, there is no difference between saying:

      %rename(bar) foo;
      %rename(foo_i) Spam::foo(int);
      %rename(Foo) Spam::foo;
      

      and this

      %rename(Foo) Spam::foo;
      %rename(bar) foo;
      %rename(foo_i) Spam::foo(int);
      

      (the declarations are not stored in a linked list and order has no importance). Of course, a repeated %rename directive will change the setting for a previous %rename directive if exactly the same name, scope, and parameters are supplied.

    • For multiple inheritance where renaming rules are defined for multiple base classes, the first renaming rule found on a depth-first traversal of the class hierarchy is used.
    • The name matching rules strictly follow member qualifier rules. For example, if you have a class and member with a member that is const qualified like this:

      class Spam {
      public:
        ...
        void bar() const;
        ...
      };
      

      the declaration

      %rename(name) Spam::bar();
      

      will not apply as there is no unqualified member bar(). The following will apply the rename as the qualifier matches correctly:

      %rename(name) Spam::bar() const;
      

      Similarly for combinations of cv-qualifiers and ref-qualifiers, all the qualifiers must be specified to match correctly:

      %rename(name) Jam::bar();          // will not match
      %rename(name) Jam::bar() &;        // will not match
      %rename(name) Jam::bar() const;    // will not match
      %rename(name) Jam::bar() const &;  // ok, will match
      
      class Jam {
      public:
        ...
        void bar() const &;
        ...
      };
      

      An often overlooked C++ feature is that classes can define two different overloaded members that differ only in their qualifiers, like this:

      class Spam {
      public:
        ...
        void bar();         // Unqualified member
        void bar() const;   // Qualified member
        ...
      };
      

      %rename can then be used to target each of the overloaded methods individually. For example we can give them separate names in the target language:

      %rename(name1) Spam::bar();
      %rename(name2) Spam::bar() const;
      

      Similarly, if you merely wanted to ignore one of the declarations, use %ignore with the full qualifier. For example, the following directive would tell SWIG to ignore the const version of bar() above:

      %ignore Spam::bar() const;   // Ignore bar() const, but leave other bar() alone
      
    • Currently no resolution is performed in order to match function parameters. This means function parameter types must match exactly. For example, namespace qualifiers and typedefs will not work. The following usage of typedefs demonstrates this:

      typedef int Integer;
      
      %rename(foo_i) foo(int);
      
      class Spam {
      public:
        void foo(Integer);  // Stays 'foo' (not renamed)
      };
      class Ham {
      public:
        void foo(int);      // Renamed to foo_i
      };
      
    • The name matching rules also use default arguments for finer control when wrapping methods that have default arguments. Recall that methods with default arguments are wrapped as if the equivalent overloaded methods had been parsed (Default arguments section). Let's consider the following example class:

      class Spam {
      public:
        ...
        void bar(int i=-1, double d=0.0);
        ...
      };
      

      The following %rename will match exactly and apply to all the target language overloaded methods because the declaration with the default arguments exactly matches the wrapped method:

      %rename(newbar) Spam::bar(int i=-1, double d=0.0);
      

      The C++ method can then be called from the target language with the new name no matter how many arguments are specified, for example: newbar(2, 2.0), newbar(2) or newbar(). However, if the %rename does not contain the default arguments:

      %rename(newbar) Spam::bar(int i, double d);
      

      then only one of the three equivalent overloaded methods will be renamed and wrapped as if SWIG parsed:

      void Spam::newbar(int i, double d);
      void Spam::bar(int i);
      void Spam::bar();
      

      The C++ method must then be called from the target language with the new name newbar(2, 2.0) when both arguments are supplied or with the original name as bar(2) (one argument) or bar() (no arguments).

      In fact it is possible to use %rename on the equivalent overloaded methods, to rename all the equivalent overloaded methods:

      %rename(bar_2args)   Spam::bar(int i, double d);
      %rename(bar_1arg)    Spam::bar(int i);
      %rename(bar_default) Spam::bar();
      

      Similarly, the extra overloaded methods can be selectively ignored using %ignore.

      Compatibility note: The %rename directive introduced the default argument matching rules in SWIG-1.3.23 at the same time as the changes to wrapping methods with default arguments was introduced.

    6.15.4 Comments on overloading

    Support for overloaded methods was first added in SWIG-1.3.14. The implementation is somewhat unusual when compared to similar tools. For instance, the order in which declarations appear is largely irrelevant in SWIG. Furthermore, SWIG does not rely upon trial execution or exception handling to figure out which method to invoke.

    Internally, the overloading mechanism is completely configurable by the target language module. Therefore, the degree of overloading support may vary from language to language. As a general rule, statically typed languages like Java are able to provide more support than dynamically typed languages like Perl, Python, Ruby, and Tcl.

    6.16 Overloaded operators

    C++ overloaded operator declarations can be wrapped. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c) {
        rpart = c.rpart;
        ipart = c.ipart;
        return *this;
      }
      Complex operator+(const Complex &c) const {
        return Complex(rpart+c.rpart, ipart+c.ipart);
      }
      Complex operator-(const Complex &c) const {
        return Complex(rpart-c.rpart, ipart-c.ipart);
      }
      Complex operator*(const Complex &c) const {
        return Complex(rpart*c.rpart - ipart*c.ipart,
                       rpart*c.ipart + c.rpart*ipart);
      }
      Complex operator-() const {
        return Complex(-rpart, -ipart);
      }
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When operator declarations appear, they are handled in exactly the same manner as regular methods. However, the names of these methods are set to strings like "operator +" or "operator -". The problem with these names is that they are illegal identifiers in most scripting languages. For instance, you can't just create a method called "operator +" in Python--there won't be any way to call it.

    Some language modules already know how to automatically handle certain operators (mapping them into operators in the target language). However, the underlying implementation of this is really managed in a very general way using the %rename directive. For example, in Python a declaration similar to this is used:

    %rename(__add__) Complex::operator+;
    

    This binds the + operator to a method called __add__ (which is conveniently the same name used to implement the Python + operator). Internally, the generated wrapper code for a wrapped operator will look something like this pseudocode:

    _wrap_Complex___add__(args) {
      ... get args ...
      obj->operator+(args);
      ...
    }
    

    When used in the target language, it may now be possible to use the overloaded operator normally. For example:

    >>> a = Complex(3, 4)
    >>> b = Complex(5, 2)
    >>> c = a + b           # Invokes __add__ method
    

    It is important to realize that there is nothing magical happening here. The %rename directive really only picks a valid method name. If you wrote this:

    %rename(add) operator+;
    

    The resulting scripting interface might work like this:

    a = Complex(3, 4)
    b = Complex(5, 2)
    c = a.add(b)      # Call a.operator+(b)
    

    All of the techniques described to deal with overloaded functions also apply to operators. For example:

    %ignore Complex::operator=;             // Ignore = in class Complex
    %ignore *::operator=;                   // Ignore = in all classes
    %ignore operator=;                      // Ignore = everywhere.
    
    %rename(__sub__) Complex::operator-; 
    %rename(__neg__) Complex::operator-();  // Unary - 
    

    The last part of this example illustrates how multiple definitions of the operator- method might be handled.

    Handling operators in this manner is mostly straightforward. However, there are a few subtle issues to keep in mind:

    • In C++, it is fairly common to define different versions of the operators to account for different types. For example, a class might also include a friend function like this:

      class Complex {
      public:
        friend Complex operator+(Complex &, double);
      };
      Complex operator+(Complex &, double);
      

      SWIG simply ignores all friend declarations. Furthermore, it doesn't know how to associate the associated operator+ with the class (because it's not a member of the class).

      It's still possible to make a wrapper for this operator, but you'll have to handle it like a normal function. For example:

      %rename(add_complex_double) operator+(Complex &, double);
      
    • Certain operators are ignored by default. For instance, new and delete operators are ignored as well as conversion and index operators. A warning such as the one below is shown:

      example.i:12: Warning 503: Can't wrap 'operator []' unless renamed to a valid identifier.
      
    • The index operator, operator[], is particularly difficult to overload due to differences in C++ implementations. Specifically, the get and set operators in other languages typically are separated into two methods such that additional logic can be packed into the operations; C# uses this[type key] { get { ... } set { ... }}, Python uses __getitem__ and __setitem__, etc. In C++ if the return type of operator[] is a reference and the method is const, it is often indicative of the setter, and the getter is usually a const function return an object by value. In the absence of any hard and fast rules and the fact that there may be multiple index operators, it is up to the user to choose the getter and setter to use by using %rename as shown earlier.

    • The semantics of certain C++ operators may not match those in the target language.

    6.17 Class extension

    New methods can be added to a class using the %extend directive. This directive is primarily used in conjunction with proxy classes to add additional functionality to an existing class. For example :

    %module vector
    %{
    #include "vector.h"
    %}
    
    class Vector {
    public:
      double x, y, z;
      Vector();
      ~Vector();
      ... bunch of C++ methods ...
      %extend {
        char *__str__() {
          static char temp[256];
          sprintf(temp, "[ %g, %g, %g ]", $self->x, $self->y, $self->z);
          return &temp[0];
        }
      }
    };
    

    This code adds a __str__ method to our class for producing a string representation of the object. In Python, such a method would allow us to print the value of an object using the print command.

    >>>
    >>> v = Vector();
    >>> v.x = 3
    >>> v.y = 4
    >>> v.z = 0
    >>> print(v)
    [ 3.0, 4.0, 0.0 ]
    >>>
    
    

    The C++ 'this' pointer is often needed to access member variables, methods etc. The $self special variable should be used wherever you could use 'this'. The example above demonstrates this for accessing member variables. Note that the members dereferenced by $self must be public members as the code is ultimately generated into a global function and so will not have any access to non-public members. The implicit 'this' pointer that is present in C++ methods is not present in %extend methods. In order to access anything in the extended class or its base class, an explicit 'this' is required. The following example shows how one could access base class members:

    struct Base {
      virtual void method(int v) {
        ...
      }
      int value;
    };
    struct Derived : Base {
    };
    %extend Derived {
      virtual void method(int v) {
        $self->Base::method(v); // akin to this->Base::method(v);
        $self->value = v;       // akin to this->value = v;
        ...
      }
    }
    

    The following special variables are expanded if used within a %extend block: $name, $symname, $overname, $decl, $fulldecl, $parentclassname and $parentclasssymname. The Special variables section provides more information each of these special variables.

    The %extend directive follows all of the same conventions as its use with C structures. Please refer to the Adding member functions to C structures section for further details.

    Compatibility note: The %extend directive is a new name for the %addmethods directive in SWIG1.1. Since %addmethods could be used to extend a structure with more than just methods, a more suitable directive name has been chosen.

    6.18 Templates

    Template type names may appear anywhere a type is expected in an interface file. For example:

    void foo(vector<int> *a, int n);
    void bar(list<int, 100> *x);
    

    There are some restrictions on the use of non-type arguments. Simple literals are supported, and so are some constant expressions. However, use of '<' and '>' within a constant expressions currently is not supported by SWIG ('<=' and '>=' are though). For example:

    void bar(list<int, 100> *x);                // OK
    void bar(list<int, 2*50> *x);               // OK
    void bar(list<int, (2>1 ? 100 : 50)> *x)    // Not supported
    

    The type system is smart enough to figure out clever games you might try to play with typedef. For instance, consider this code:

    typedef int Integer;
    void foo(vector<int> *x, vector<Integer> *y);
    

    In this case, vector<Integer> is exactly the same type as vector<int>. The wrapper for foo() will accept either variant.

    6.18.1 The %template directive

    There are a couple of important points about template wrapping. First, a bare C++ template does not define any sort of runnable object-code for which SWIG can normally create a wrapper. Therefore, in order to wrap a template, you need to give SWIG information about a particular template instantiation (e.g., vector<int>, array<double>, etc.). Second, an instantiation name such as vector<int> is generally not a valid identifier name in most target languages. Thus, you will need to give the template instantiation a more suitable name such as intvector.

    To illustrate, consider the following class template definition:

    template<class T> class List {
    private:
      T *data;
      int nitems;
      int maxitems;
    public:
      List(int max) {
        data = new T [max];
        nitems = 0;
        maxitems = max;
      }
      ~List() {
        delete [] data;
      };
      void append(T obj) {
        if (nitems < maxitems) {
          data[nitems++] = obj;
        }
      }
      int length() {
        return nitems;
      }
      T get(int n) {
        return data[n];
      }
    };
    

    By itself, this class template is useless--SWIG simply ignores it because it doesn't know how to generate any code unless a definition of T is provided. The %template directive is required to instantiate the template for use in a target language. The directive requires an identifier name for use in the target language plus the template for instantiation. The example below instantiates List<int> for use as a class named intList:

    %template(intList) List<int>;
    

    The instantiation expands the template code as a C++ compiler would do and then makes it available under the given identifier name. Essentially it is the same as wrapping the following concept code where the class template definition has T expanded to int (note that this is not entirely valid syntax):

    %rename(intList) List<int>;       // Rename to a suitable identifier
    class List<int> {
    private:
      int *data;
      int nitems;
      int maxitems;
    public:
      List(int max);
      ~List();
      void append(int obj);
      int length();
      int get(int n);
    };
    

    The argument to %template() is the name of the instantiation in the target language. The name you choose should not conflict with any other declarations in the interface file with one exception---it is okay for the template name to match that of a typedef declaration. For example:

    %template(intList) List<int>;
    ...
    typedef List<int> intList;    // OK
    

    The %template directive must always appear after the definition of the template to be expanded, so the following will work:

    template<class T> class List { ... };
    %template(intList) List<int>;
    

    but if %template is used before the template definition, such as:

    %template(intList) List<int>;
    template<class T> class List { ... };
    

    SWIG will generate an error:

    example.i:3: Error: Template 'List' undefined.
    

    Since the type system knows how to handle typedef, it is generally not necessary to instantiate different versions of a template for typenames that are equivalent. For instance, consider this code:

    %template(intList) List<int>;
    typedef int Integer;
    ...
    void foo(List<Integer> *x);
    

    In this case, List<Integer> is exactly the same type as List<int>. Any use of List<Integer> is mapped back to the instantiation of List<int> created earlier. Therefore, it is not necessary to instantiate a new class for the type Integer (doing so is redundant and will simply result in code bloat).

    The template provided to %template for instantiation must be the actual template and not a typedef to a template.

    typedef List<int> ListOfInt;
    
    %template(intList) List<int>; // ok
    %template(intList) ListOfInt; // illegal - Syntax error
    

    6.18.2 Function templates

    SWIG can also generate wrappers for function templates using a similar technique to that shown above for class templates. For example:

    // Function template
    template<class T> T max(T a, T b) { return a > b ? a : b; }
    
    // Make some different versions of this function
    %template(maxint) max<int>;
    %template(maxdouble) max<double>;
    

    In this case, maxint and maxdouble become unique names for specific instantiations of the function.

    SWIG even supports overloaded templated functions. As usual the %template directive is used to wrap templated functions. For example:

    template<class T> void foo(T x) { };
    template<class T> void foo(T x, T y) { };
    
    %template(foo) foo<int>;
    

    This will generate two overloaded wrapper methods, the first will take a single integer as an argument and the second will take two integer arguments.

    6.18.3 Default template arguments

    The number of arguments supplied to %template should match that in the original template definition. Template default arguments are supported. For example:

    template vector<typename T, int max=100> class vector {
    ...
    };
    
    %template(intvec) vector<int>;           // OK
    %template(vec1000) vector<int, 1000>;     // OK
    

    The %template directive should not be used to wrap the same template instantiation more than once in the same scope. This will generate an error. For example:

    %template(intList) List<int>;
    %template(Listint) List<int>;    // Error.   Template already wrapped.
    

    This error is caused because the template expansion results in two identical classes with the same name. This generates a symbol table conflict. Besides, it probably more efficient to only wrap a specific instantiation only once in order to reduce the potential for code bloat.

    6.18.4 Template base classes

    When a template is instantiated using %template, information about that class is saved by SWIG and used elsewhere in the program. For example, if you wrote code like this,

    ...
    %template(intList) List<int>;
    ...
    class UltraList : public List<int> {
      ...
    };
    

    then SWIG knows that List<int> was already wrapped as a class called intList and arranges to handle the inheritance correctly. If, on the other hand, nothing is known about List<int> , you will get a warning message similar to this:

    example.h:42: Warning 401. Nothing known about class 'List< int >'. Ignored. 
    example.h:42: Warning 401. Maybe you forgot to instantiate 'List< int >' using %template. 
    

    If a class template inherits from another class template, you need to make sure that base classes are instantiated before derived classes. For example:

    template<class T> class Foo {
    ...
    };
    
    template<class T> class Bar : public Foo<T> {
    ...
    };
    
    // Instantiate base classes first 
    %template(intFoo) Foo<int>;
    %template(doubleFoo) Foo<double>;
    
    // Now instantiate derived classes
    %template(intBar) Bar<int>;
    %template(doubleBar) Bar<double>;
    

    The order is important since SWIG uses the instantiation names to properly set up the inheritance hierarchy in the resulting wrapper code (and base classes need to be wrapped before derived classes). Don't worry--if you get the order wrong, SWIG should generate a warning message.

    Occasionally, you may need to tell SWIG about base classes that are defined by templates, but which aren't supposed to be wrapped. Since SWIG is not able to automatically instantiate templates for this purpose, you must do it manually. To do this, simply use the empty template instantiation, that is, %template with no name. For example:

    // Instantiate traits<double, double>, but don't wrap it.
    %template() traits<double, double>;
    

    If you have to instantiate a lot of different classes for many different types, you might consider writing a SWIG macro. For example:

    %define TEMPLATE_WRAP(prefix, T...) 
    %template(prefix ## Foo) Foo<T >;
    %template(prefix ## Bar) Bar<T >;
    ...
    %enddef
    
    TEMPLATE_WRAP(int, int)
    TEMPLATE_WRAP(double, double)
    TEMPLATE_WRAP(String, char *)
    TEMPLATE_WRAP(PairStringInt, std::pair<string, int>)
    ...
    

    Note the use of a vararg macro for the type T. If this wasn't used, the comma in the templated type in the last example would not be possible.

    6.18.5 Template specialization

    The SWIG template mechanism does support specialization. For instance, if you define a class like this,

    template<> class List<int> {
    private:
      int *data;
      int nitems;
      int maxitems;
    public:
      List(int max);
      ~List();
      void append(int obj);
      int length();
      int get(int n);
    };
    

    then SWIG will use this code whenever the user expands List<int> . In practice, this may have very little effect on the underlying wrapper code since specialization is often used to provide slightly modified method bodies (which are ignored by SWIG). However, special SWIG directives such as %typemap, %extend, and so forth can be attached to a specialization to provide customization for specific types.

    Partial template specialization is partially supported by SWIG. For example, this code defines a template that is applied when the template argument is a pointer.

    template<class T> class List<T*> {
    private:
      T *data;
      int nitems;
      int maxitems;
    public:
      List(int max);
      ~List();
      void append(T obj);
      int length();
      T get(int n);
    };
    

    SWIG supports both template explicit specialization and partial specialization. Consider:

    template<class T1, class T2> class Foo { };                     // (1) primary template
    template<>                   class Foo<double *, int *> { };    // (2) explicit specialization
    template<class T1, class T2> class Foo<T1, T2 *> { };           // (3) partial specialization
    

    SWIG is able to properly match explicit instantiations:

    Foo<double *, int *>     // explicit specialization matching (2)
    

    SWIG implements template argument deduction so that the following partial specialization examples work just like they would with a C++ compiler:

    Foo<int *, int *>        // partial specialization matching (3)
    Foo<int *, const int *>  // partial specialization matching (3)
    Foo<int *, int **>       // partial specialization matching (3)
    

    6.18.6 Member templates

    Member templates are supported. The underlying principle is the same as for normal templates--SWIG can't create a wrapper unless you provide more information about types. For example, a class with a member function template might look like this:

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    

    To expand the template, simply use %template inside the class.

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
      %template(barint)    bar<int>;
      %template(bardouble) bar<double>;
    };
    

    Or, if you want to leave the original class definition alone, just do this:

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    ...
    %extend Foo {
      %template(barint)    bar<int>;
      %template(bardouble) bar<double>;
    };
    

    or simply

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    ...
    
    %template(bari) Foo::bar<int>;
    %template(bard) Foo::bar<double>;
    

    In this case, the %extend directive is not needed, and %template does exactly the same job, i.e., it adds two new methods to the Foo class.

    Now, if your target language supports overloading, you can even try

    %template(bar) Foo::bar<int>;
    %template(bar) Foo::bar<double>;
    

    and since the two new wrapped methods have the same name 'bar', they will be overloaded, and when called, the correct method will be dispatched depending on the argument type.

    When used with members, the %template directive may be placed in another class template. Here is a slightly perverse example:

    // A template
    template<class T> class Foo {
    public:
      // A member template
      template<class S> T bar(S x, S y) { ... };
      ...
    };
    
    // Expand a few member templates
    %extend Foo {
      %template(bari) bar<int>;
      %template(bard) bar<double>;
    }
    
    // Create some wrappers for the template
    %template(Fooi) Foo<int>;
    %template(Food) Foo<double>;
    

    Miraculously, you will find that each expansion of Foo has member functions bari() and bard() added.

    A common use of member templates is to define constructors for copies and conversions. For example:

    template<class T1, class T2> struct pair {
      T1 first;
      T2 second;
      pair() : first(T1()), second(T2()) { }
      pair(const T1 &x, const T2 &y) : first(x), second(y) { }
      template<class U1, class U2> pair(const pair<U1, U2> &x)
                                           : first(x.first), second(x.second) { }
    };
    

    This declaration is perfectly acceptable to SWIG, but the constructor template will be ignored unless you explicitly expand it. To do that, you could expand a few versions of the constructor in the class template itself. For example:

    %extend pair {
      %template(pair) pair<T1, T2>;        // Generate default copy constructor
    };
    

    When using %extend in this manner, notice how you can still use the template parameters in the original template definition.

    Alternatively, you could expand the constructor template in selected instantiations. For example:

    // Instantiate a few versions
    %template(pairii) pair<int, int>;
    %template(pairdd) pair<double, double>;
    
    // Create a default constructor only 
    %extend pair<int, int> {
      %template(paird) pair<int, int>;         // Default constructor
    };
    
    // Create default and conversion constructors 
    %extend pair<double, double> {
      %template(paird) pair<double, dobule>;   // Default constructor
      %template(pairc) pair<int, int>;         // Conversion constructor
    };
    

    And if your target language supports overloading, then you can try instead:

    // Create default and conversion constructors 
    %extend pair<double, double> {
      %template(pair) pair<double, dobule>;   // Default constructor
      %template(pair) pair<int, int>;         // Conversion constructor
    };
    

    In this case, the default and conversion constructors have the same name. Hence, SWIG will overload them and define an unique visible constructor, that will dispatch the proper call depending on the argument type.

    6.18.7 Scoping and templates

    The %template directive for a class template is the equivalent to an explicit instantiation of a C++ class template. The scope for a valid %template instantiation is the same as the scope required for a valid explicit instantiation of a C++ template. A definition of the template for the explicit instantiation must be in scope where the instantiation is declared and must not be enclosed within a different namespace.

    For example, a few %template instantiations and C++ explicit instantiations are shown below:

    namespace N {
      template<typename T> class C {};
    }
    
    // valid
    %template(cin) N::C<int>;
    template class N::C<int>;
    
    // valid
    namespace N {
      %template(cin) C<int>;
      template class C<int>;
    }
    
    // valid
    using namespace N;
    %template(cin) C<int>;
    template class C<int>;
    
    // valid
    using N::C;
    %template(cin) C<int>;
    template class C<int>;
    
    // ill-formed
    namespace unrelated {
      using N::C;
      %template(cin) C<int>;
      template class C<int>;
    }
    
    // ill-formed
    namespace unrelated {
      using namespace N;
      %template(cin) C<int>;
      template class C<int>;
    }
    
    // ill-formed
    namespace unrelated {
      namespace N {
        %template(cin) C<int>;
        template class C<int>;
      }
    }
    
    // ill-formed
    namespace unrelated {
      %template(cin) N::C<int>;
      template class N::C<int>;
    }
    

    When the scope is incorrect, such as for the ill-formed examples above, an error occurs:

    cpp_template_scope.i:34: Error: 'C' resolves to 'N::C' and was incorrectly instantiated
    in scope 'unrelated' instead of within scope 'N'.
    

    A note for the C++ standard geeks out there; a valid instantiation is one which conforms to the C++03 standard as C++11 made a change to disallow using declarations and using directives to find a template.

    // valid C++03, ill-formed C++11
    using N::C;
    template class C<int>;
    

    Compatibility Note: Versions prior to SWIG-4.0.0 did not error out with incorrectly scoped %template declarations, but this led to numerous subtle template scope problems.

    6.18.8 More on templates

    If all of this isn't quite enough and you really want to make someone's head explode, SWIG directives such as %rename, %extend, and %typemap can be included directly in template definitions. For example:

    // File : list.h
    template<class T> class List {
      ...
    public:
      %rename(__getitem__) get(int);
      List(int max);
      ~List();
      ...
      T get(int index);
      %extend {
        char *__str__() {
          /* Make a string representation */
          ...
        }
      }
    };
    

    In this example, the extra SWIG directives are propagated to every template instantiation.

    It is also possible to separate these declarations from the class template. For example:

    %rename(__getitem__) List::get;
    %extend List {
      char *__str__() {
        /* Make a string representation */
        ...
      }
      /* Make a copy */
      T *__copy__() {
        return new List<T>(*$self);
      }
    };
    
    ...
    template<class T> class List {
      ...
      public:
      List() { }
      T get(int index);
      ...
    };
    

    When %extend is decoupled from the class definition, it is legal to use the same template parameters as provided in the class definition. These are replaced when the template is expanded. In addition, the %extend directive can be used to add additional methods to a specific instantiation. For example:

    %template(intList) List<int>;
    
    %extend List<int> {
      void blah() {
        printf("Hey, I'm an List<int>!\n");
      }
    };
    

    It is even possible to extend a class via %extend with template methods, for example:

    %include <std_string.i>
    
    %inline %{
    class ExtendMe {
    public:
      template <typename T>
      T do_stuff_impl(int a, T b, double d) {
        return b;
      }
    };
    %}
    
    %extend ExtendMe {
      template<typename T>
      T do_overloaded_stuff(T b) {
        return $self->do_stuff_impl(0, b, 4.0);
      }
    }
    %template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<std::string>;
    %template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<double>;
    

    The wrapped ExtendMe class will then have two (overloaded) methods called do_overloaded_stuff.

    Compatibility Note: Extending a class with template methods was added in version 3.0.12

    Needless to say, SWIG's template support provides plenty of opportunities to break the universe. That said, an important final point is that SWIG does not perform extensive error checking of templates! Specifically, SWIG does not perform type checking nor does it check to see if the actual contents of the template declaration make any sense. Since the C++ compiler checks this when it compiles the resulting wrapper file, there is no practical reason for SWIG to duplicate this functionality.

    As SWIG's template support does not perform type checking %template can be used as early as after a template declaration. You can, and rarely have to, use %template before the template parameters have been declared. For example:

    template <class T> class OuterTemplateClass {};
    
    // The nested class OuterClass::InnerClass inherits from the class template
    // OuterTemplateClass<OuterClass::InnerStruct> and thus the template needs
    // to be expanded with %template before the OuterClass declaration.
    %template(OuterTemplateClass_OuterClass__InnerStruct)
      OuterTemplateClass<OuterClass::InnerStruct>
    
    
    // Don't forget to use %feature("flatnested") for OuterClass::InnerStruct and
    // OuterClass::InnerClass if the target language doesn't support nested classes.
    class OuterClass {
      public:
        // Forward declarations:
        struct InnerStruct;
        class InnerClass;
    };
    
    struct OuterClass::InnerStruct {};
    
    // Expanding the template at this point with %template is too late as the
    // OuterClass::InnerClass declaration is processed inside OuterClass.
    
    class OuterClass::InnerClass : public OuterTemplateClass<InnerStruct> {};
    

    Compatibility Note: The first implementation of template support relied heavily on macro expansion in the preprocessor. Templates have been more tightly integrated into the parser and type system in SWIG-1.3.12 and the preprocessor is no longer used. Code that relied on preprocessing features in template expansion will no longer work. However, SWIG still allows the # operator to be used to generate a string from a template argument.

    Compatibility Note: In earlier versions of SWIG, the %template directive introduced a new class name. This name could then be used with other directives. For example:

    %template(vectori) vector<int>;
    %extend vectori {
      void somemethod() { }
    };
    

    This behavior is no longer supported. Instead, you should use the original template name as the class name. For example:

    %template(vectori) vector<int>;
    %extend vector<int> {
      void somemethod() { }
    };
    

    Similar changes apply to typemaps and other customization features.

    6.19 Namespaces

    Support for C++ namespaces is comprehensive, but by default simple, however, some target languages can turn on more advanced namespace support via the nspace feature, described later. Code within unnamed namespaces is ignored as there is no external access to symbols declared within the unnamed namespace. Before detailing the default implementation for named namespaces, it is worth noting that the semantics of C++ namespaces is extremely non-trivial--especially with regard to the C++ type system and class machinery. At a most basic level, namespaces are sometimes used to encapsulate common functionality. For example:

    namespace math {
      double sin(double);
      double cos(double);
    
      class Complex {
        double im, re;
      public:
        ...
      };
      ...
    };
    

    Members of the namespace are accessed in C++ by prepending the namespace prefix to names. For example:

    double x = math::sin(1.0);
    double magnitude(math::Complex *c);
    math::Complex c;
    ...
    

    At this level, namespaces are relatively easy to manage. However, things start to get very ugly when you throw in the other ways a namespace can be used. For example, selective symbols can be exported from a namespace with using.

    using math::Complex;
    double magnitude(Complex *c);       // Namespace prefix stripped
    

    Similarly, the contents of an entire namespace can be made available like this:

    using namespace math;
    double x = sin(1.0);
    double magnitude(Complex *c);
    

    Alternatively, a namespace can be aliased:

    namespace M = math;
    double x = M::sin(1.0);
    double magnitude(M::Complex *c);
    

    Using combinations of these features, it is possible to write head-exploding code like this:

    namespace A {
      class Foo {
      };
    }
    
    namespace B {
      namespace C {
        using namespace A;
      }
      typedef C::Foo FooClass;
    }
    
    namespace BIGB = B;
    
    namespace D {
      using BIGB::FooClass;
      class Bar : public FooClass {
      }
    };
    
    class Spam : public D::Bar {
    };
    
    void evil(A::Foo *a, B::FooClass *b, B::C::Foo *c, BIGB::FooClass *d,
              BIGB::C::Foo *e, D::FooClass *f);
    
    

    Given the possibility for such perversion, it's hard to imagine how every C++ programmer might want such code wrapped into the target language. Clearly this code defines three different classes. However, one of those classes is accessible under at least six different names!

    SWIG fully supports C++ namespaces in its internal type system and class handling code. If you feed SWIG the above code, it will be parsed correctly, it will generate compilable wrapper code, and it will produce a working scripting language module. However, the default wrapping behavior is to flatten namespaces in the target language. This means that the contents of all namespaces are merged together in the resulting scripting language module. For example, if you have code like this,

    %module foo
    namespace foo {
      void bar(int);
      void spam();
    }
    
    namespace bar {
      void blah();
    }
    
    

    then SWIG simply creates three wrapper functions bar(), spam(), and blah() in the target language. SWIG does not prepend the names with a namespace prefix nor are the functions packaged in any kind of nested scope. Note that the default handling of flattening all the namespace scopes in the target language can be changed via the nspace feature.

    There is some rationale for taking this approach. Since C++ namespaces are often used to define modules in C++, there is a natural correlation between the likely contents of a SWIG module and the contents of a namespace. For instance, it would not be unreasonable to assume that a programmer might make a separate extension module for each C++ namespace. In this case, it would be redundant to prepend everything with an additional namespace prefix when the module itself already serves as a namespace in the target language. Or put another way, if you want SWIG to keep namespaces separate, simply wrap each namespace with its own SWIG interface.

    Because namespaces are flattened, it is possible for symbols defined in different namespaces to generate a name conflict in the target language. For example:

    namespace A {
      void foo(int);
    }
    namespace B {
      void foo(double);
    }
    

    When this conflict occurs, you will get an error message that resembles this:

    example.i:26. Error. 'foo' is multiply defined in the generated target language module.
    example.i:23. Previous declaration of 'foo'
    

    To resolve this error, simply use %rename to disambiguate the declarations. For example:

    %rename(B_foo) B::foo;
    ...
    namespace A {
      void foo(int);
    }
    namespace B {
      void foo(double);     // Gets renamed to B_foo
    }
    

    Similarly, %ignore can be used to ignore declarations.

    using declarations do not have any effect on the generated wrapper code. They are ignored by SWIG language modules and they do not result in any code. However, these declarations are used by the internal type system to track type-names. Therefore, if you have code like this:

    namespace A {
      typedef int Integer;
    }
    using namespace A;
    void foo(Integer x);
    

    SWIG knows that Integer is the same as A::Integer which is the same as int.

    Namespaces may be combined with templates. If necessary, the %template directive can be used to expand a template defined in a different namespace. For example:

    namespace foo {
      template<typename T> T max(T a, T b) { return a > b ? a : b; }
    }
    
    using foo::max;
    
    %template(maxint)   max<int>;           // Okay.
    %template(maxfloat) foo::max<float>;    // Okay (qualified name).
    
    namespace bar {
      using namespace foo;
      %template(maxdouble)  max<double>;    // Okay.
    }
    

    The combination of namespaces and other SWIG directives may introduce subtle scope-related problems. The key thing to keep in mind is that all SWIG generated wrappers are produced in the global namespace. Symbols from other namespaces are always accessed using fully qualified names---names are never imported into the global space unless the interface happens to do so with a using declaration. In almost all cases, SWIG adjusts typenames and symbols to be fully qualified. However, this is not done in code fragments such as function bodies, typemaps, exception handlers, and so forth. For example, consider the following:

    namespace foo {
      typedef int Integer;
      class bar {
        public:
        ...
      };
    }
    
    %extend foo::bar {
      Integer add(Integer x, Integer y) {
        Integer r = x + y;        // Error. Integer not defined in this scope
        return r;
      }
    };
    

    In this case, SWIG correctly resolves the added method parameters and return type to foo::Integer. However, since function bodies aren't parsed and such code is emitted in the global namespace, this code produces a compiler error about Integer. To fix the problem, make sure you use fully qualified names. For example:

    %extend foo::bar {
      Integer add(Integer x, Integer y) {
        foo::Integer r = x + y;        // Ok.
        return r;
      }
    };
    

    Note: SWIG does not propagate using declarations to the resulting wrapper code. If these declarations appear in an interface, they should also appear in any header files that might have been included in a %{ ... %} section. In other words, don't insert extra using declarations into a SWIG interface unless they also appear in the underlying C++ code.

    Note: Code inclusion directives such as %{ ... %} or %inline %{ ... %} should not be placed inside a namespace declaration. The code emitted by these directives will not be enclosed in a namespace and you may get very strange results. If you need to use namespaces with these directives, consider the following:

    // Good version
    %inline %{
    namespace foo {
      void bar(int) { ... }
      ...
    }
    %}
    
    // Bad version.  Emitted code not placed in namespace.
    namespace foo {
    %inline %{
      void bar(int) { ... }   /* I'm bad */
      ...
      %}
    }
    

    Note: When the %extend directive is used inside a namespace, the namespace name is included in the generated functions. For example, if you have code like this,

    namespace foo {
      class bar {
        public:
          %extend {
            int blah(int x);
          };
      };
    }
    

    the added method blah() is mapped to a function int foo_bar_blah(foo::bar *self, int x). This function resides in the global namespace.

    Note: Although namespaces are flattened in the target language, the SWIG generated wrapper code observes the same namespace conventions as used in the input file. Thus, if there are no symbol conflicts in the input, there will be no conflicts in the generated code.

    Note: In the same way that no resolution is performed on parameters, a conversion operator name must match exactly to how it is defined. Do not change the qualification of the operator. For example, suppose you had an interface like this:

    namespace foo {
      class bar;
      class spam {
        public:
        ...
        operator bar();      // Conversion of spam -> bar
        ...
      };
    }
    

    The following is how the feature is expected to be written for a successful match:

    %rename(tofoo) foo::spam::operator bar();
    

    The following does not work as no namespace resolution is performed in the matching of conversion operator names:

    %rename(tofoo) foo::spam::operator foo::bar();
    

    Note, however, that if the operator is defined using a qualifier in its name, then the feature must use it too...

    %rename(tofoo) foo::spam::operator bar();      // will not match
    %rename(tofoo) foo::spam::operator foo::bar(); // will match
    namespace foo {
      class bar;
      class spam {
        public:
        ...
        operator foo::bar();
        ...
      };
    }
    

    Compatibility Note: Versions of SWIG prior to 1.3.32 were inconsistent in this approach. A fully qualified name was usually required, but would not work in some situations.

    Note: The flattening of namespaces is only intended to serve as a basic namespace implementation. More advanced handling of namespaces is discussed next.

    6.19.1 The nspace feature for namespaces

    Some target languages provide support for the nspace feature. The feature can be applied to any class, struct, union or enum declared within a named namespace. The feature wraps the type within the target language specific concept of a namespace, for example, a Java package or C# namespace. Please see the language specific sections to see if the target language you are interested in supports the nspace feature.

    The feature is demonstrated below for C# using the following example:

    %feature("nspace") MyWorld::Material::Color;
    %nspace MyWorld::Wrapping::Color; // %nspace is a macro for %feature("nspace")
    
    namespace MyWorld {
      namespace Material {
        class Color {
        ...
        };
      }
      namespace Wrapping {
        class Color {
        ...
        };
      }
    }
    

    Without the nspace feature directives above or %rename , you would get the following warning resulting in just one of the Color classes being available for use from the target language:

    example.i:9: Error: 'Color' is multiply defined in the generated target language module.
    example.i:5: Error: Previous declaration of 'Color'
    

    With the nspace feature the two Color classes are wrapped into the equivalent C# namespaces. A fully qualified constructor call of each these two types in C# is then:

    MyWorld.Material.Color materialColor = new MyWorld.Material.Color();
    MyWorld.Wrapping.Color wrappingColor = new MyWorld.Wrapping.Color();
    

    Note that the nspace feature does not apply to variables and functions simply declared in a namespace. For example, the following symbols cannot co-exist in the target language without renaming. This may change in a future version.

    namespace MyWorld {
      namespace Material {
        int quantity;
        void dispatch();
      }
      namespace Wrapping {
        int quantity;
        void dispatch();
      }
    }
    

    Compatibility Note: The nspace feature was first introduced in SWIG-2.0.0.

    6.20 Renaming templated types in namespaces

    As has been mentioned, when %rename includes parameters, the parameter types must match exactly (no typedef or namespace resolution is performed). SWIG treats templated types slightly differently and has an additional matching rule so unlike non-templated types, an exact match is not always required. If the fully qualified templated type is specified, it will have a higher precedence over the generic template type. In the example below, the generic template type is used to rename to bbb and the fully qualified type is used to rename to ccc.

    %rename(bbb) Space::ABC::aaa(T t);                     // will match but with lower precedence than ccc
    %rename(ccc) Space::ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence
                                                           // than bbb
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    It should now be apparent that there are many ways to achieve a renaming with %rename. This is demonstrated by the following two examples, which are effectively the same as the above example. Below shows how %rename can be placed inside a namespace.

    namespace Space {
      %rename(bbb) ABC::aaa(T t);                     // will match but with lower precedence than ccc
      %rename(ccc) ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence than bbb
      %rename(ddd) ABC<Space::XYZ>::aaa(XYZ t);       // will not match
    }
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    Note that ddd does not match as there is no namespace resolution for parameter types and the fully qualified type must be specified for template type expansion. The following example shows how %rename can be placed within %extend.

    namespace Space {
      %extend ABC {
        %rename(bbb) aaa(T t);         // will match but with lower precedence than ccc
      }
      %extend ABC<Space::XYZ> {
        %rename(ccc) aaa(Space::XYZ t);// will match but with higher precedence than bbb
        %rename(ddd) aaa(XYZ t);       // will not match
      }
    }
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    6.21 Exception specifications

    When C++ programs utilize exceptions, exceptional behavior is sometimes specified as part of a function or method declaration. For example:

    class Error { };
    
    class Foo {
    public:
      ...
      void blah() throw(Error);
      ...
    };
    

    If an exception specification is used, SWIG automatically generates wrapper code for catching the indicated exception and, when possible, rethrowing it into the target language, or converting it into an error in the target language otherwise. For example, in Python, you can write code like this:

    f = Foo()
    try:
        f.blah()
    except Error, e:
        # e is a wrapped instance of "Error"
    

    Details of how to tailor code for handling the caught C++ exception and converting it into the target language's exception/error handling mechanism is outlined in the "throws" typemap section.

    Since exception specifications are sometimes only used sparingly, this alone may not be enough to properly handle C++ exceptions. To do that, a different set of special SWIG directives are used. Consult the "Exception handling with %exception " section for details. The next section details a way of simulating an exception specification or replacing an existing one.

    6.22 Exception handling with %catches

    Exceptions are automatically handled for methods with an exception specification. Similar handling can be achieved for methods without exception specifications through the %catches feature. It is also possible to replace any declared exception specification using the %catches feature. In fact, %catches uses the same "throws" typemaps that SWIG uses for exception specifications in handling exceptions. The %catches feature must contain a list of possible types that can be thrown. For each type that is in the list, SWIG will generate a catch handler, in the same way that it would for types declared in the exception specification. Note that the list can also include the catch all specification "...". For example,

    struct EBase { virtual ~EBase(); };
    struct Error1 : EBase { };
    struct Error2 : EBase { };
    struct Error3 : EBase { };
    struct Error4 : EBase { };
    
    %catches(Error1, Error2, ...) Foo::bar();
    %catches(EBase) Foo::blah();
    
    class Foo {
    public:
      ...
      void bar();
      void blah() throw(Error1, Error2, Error3, Error4);
      ...
    };
    

    For the Foo::bar() method, which can throw anything, SWIG will generate catch handlers for Error1, Error2 as well as a catch all handler (...). Each catch handler will convert the caught exception and convert it into a target language error/exception. The catch all handler will convert the caught exception into an unknown error/exception.

    Without the %catches feature being attached to Foo::blah(), SWIG will generate catch handlers for all of the types in the exception specification, that is, Error1, Error2, Error3, Error4. However, with the %catches feature above, just a single catch handler for the base class, EBase will be generated to convert the C++ exception into a target language error/exception.

    6.23 Pointers to Members

    Starting with SWIG-1.3.7, there is limited parsing support for pointers to C++ class members. For example:

    double do_op(Object *o, double (Object::*callback)(double, double));
    extern double (Object::*fooptr)(double, double);
    %constant double (Object::*FOO)(double, double) = &Object::foo;
    

    Although these kinds of pointers can be parsed and represented by the SWIG type system, few language modules know how to handle them due to implementation differences from standard C pointers. Readers are strongly advised to consult an advanced text such as the "The Annotated C++ Manual" for specific details.

    When pointers to members are supported, the pointer value might appear as a special string like this:

    >>> print example.FOO
    _ff0d54a800000000_m_Object__f_double_double__double
    >>>
    

    In this case, the hexadecimal digits represent the entire value of the pointer which is usually the contents of a small C++ structure on most machines.

    SWIG's type-checking mechanism is also more limited when working with member pointers. Normally SWIG tries to keep track of inheritance when checking types. However, no such support is currently provided for member pointers.

    6.24 Smart pointers and operator->()

    In some C++ programs, objects are often encapsulated by smart-pointers or proxy classes. This is sometimes done to implement automatic memory management (reference counting) or persistence. Typically a smart-pointer is defined by a class template where the -> operator has been overloaded. This class is then wrapped around some other class. For example:

    // Smart-pointer class
    template<class T> class SmartPtr {
      T *pointee;
    public:
      SmartPtr(T *p) : pointee(p) { ... }
      T *operator->() {
        return pointee;
      }
      ...
    };
    
    // Ordinary class
    class Foo_Impl {
    public:
      int x;
      virtual void bar();
      ...
    };
    
    // Smart-pointer wrapper
    typedef SmartPtr<Foo_Impl> Foo;
    
    // Create smart pointer Foo
    Foo make_Foo() {
      return SmartPtr<Foo_Impl>(new Foo_Impl());
    }
    
    // Do something with smart pointer Foo
    void do_something(Foo f) {
      printf("x = %d\n", f->x);
      f->bar();
    }
    
    // Call the wrapped smart pointer proxy class in the target language 'Foo'
    %template(Foo) SmartPtr<Foo_Impl>;
    

    A key feature of this approach is that by defining operator-> the methods and attributes of the object wrapped by a smart pointer are transparently accessible. For example, expressions such as these (from the previous example),

    f->x
    f->bar()
    

    are transparently mapped to the following

    (f.operator->())->x;
    (f.operator->())->bar();
    

    When generating wrappers, SWIG tries to emulate this functionality to the extent that it is possible. To do this, whenever operator->() is encountered in a class, SWIG looks at its returned type and uses it to generate wrappers for accessing attributes of the underlying object. For example, wrapping the above code produces wrappers like this:

    int Foo_x_get(Foo *f) {
      return (*f)->x;
    }
    void Foo_x_set(Foo *f, int value) {
      (*f)->x = value;
    }
    void Foo_bar(Foo *f) {
      (*f)->bar();
    }
    

    These wrappers take a smart-pointer instance as an argument, but dereference it in a way to gain access to the object returned by operator->(). You should carefully compare these wrappers to those in the first part of this chapter (they are slightly different).

    The end result is that access looks very similar to C++. For example, you could do this in Python:

    >>> f = make_Foo()
    >>> print f.x
    0
    >>> f.bar()
    >>>
    

    When generating wrappers through a smart-pointer, SWIG tries to generate wrappers for all methods and attributes that might be accessible through operator->(). This includes any methods that might be accessible through inheritance. However, there are a number of restrictions:

    • Member variables and methods are wrapped through a smart pointer. Enumerations, constructors, and destructors are not wrapped.
    • If the smart-pointer class and the underlying object both define a method or variable of the same name, then the smart-pointer version has precedence. For example, if you have this code

      class Foo {
      public:
        int x;
      };
      
      class Bar {
      public:
        int x;       
        Foo *operator->();
      };
      

      then the wrapper for Bar::x accesses the x defined in Bar, and not the x defined in Foo.

    If your intent is to only expose the smart-pointer class in the interface, it is not necessary to wrap both the smart-pointer class and the class for the underlying object. However, you must still tell SWIG about both classes if you want the technique described in this section to work. To only generate wrappers for the smart-pointer class, you can use the %ignore directive. For example:

    %ignore Foo;
    class Foo {       // Ignored
    };
    
    class Bar {
    public:
      Foo *operator->();
      ...
    };
    

    Alternatively, you can import the definition of Foo from a separate file using %import.

    Note: When a class defines operator->(), the operator itself is wrapped as a method __deref__(). For example:

    f = Foo()               # Smart-pointer
    p = f.__deref__()       # Raw pointer from operator->
    

    Note: To disable the smart-pointer behavior, use %ignore to ignore operator->(). For example:

    %ignore Bar::operator->;
    

    Note: Smart pointer support was first added in SWIG-1.3.14.

    6.25 C++ reference counted objects - ref/unref feature

    Another similar idiom in C++ is the use of reference counted objects. Consider for example:

    class RCObj  {
      // implement the ref counting mechanism
      int add_ref();
      int del_ref();
      int ref_count();
    
    public:
      virtual ~RCObj() = 0;
    
      int ref() const {
        return add_ref();
      }
    
      int unref() const {
        if (ref_count() == 0 || del_ref() == 0 ) {
          delete this;
          return 0;
        }
        return ref_count();
      }
    };
    
    
    class A : RCObj {
    public:
      A();
      int foo();
    };
    
    
    class B {
      A *_a;
    
    public:
      B(A *a) : _a(a) { 
        a->ref(); 
      }
    
      ~B() { 
        a->unref(); 
      }
    };
    
    int main() {
      A *a  = new A();       // (count: 0)
      a->ref();           // 'a' ref here (count: 1)
    
      B *b1 = new B(a);   // 'a' ref here (count: 2)
      if (1 + 1 == 2) {
        B *b2 = new B(a); // 'a' ref here (count: 3)
        delete b2;        // 'a' unref, but not deleted (count: 2)
      }
    
      delete b1;          // 'a' unref, but not deleted (count: 1)
      a->unref();         // 'a' unref and deleted (count: 0)
    }
    

    In the example above, the 'A' class instance 'a' is a reference counted object, which can't be deleted arbitrarily since it is shared between the objects 'b1' and 'b2'. 'A' is derived from a Reference Counted Object 'RCObj', which implements the ref/unref idiom.

    To tell SWIG that 'RCObj' and all its derived classes are reference counted objects, use the "ref" and "unref" features. These are also available as %refobject and %unrefobject, respectively. For example:

    %module example
    ...
    
    %feature("ref")   RCObj "$this->ref();"
    %feature("unref") RCObj "$this->unref();"
    
    %include "rcobj.h"
    %include "A.h"
    ...
    

    where the code passed to the "ref" and "unref" features will be executed as needed whenever a new object is passed to Python, or when Python tries to release the proxy object instance, respectively.

    On the Python side, the use of a reference counted object is no different to any other regular instance:

    def create_A():
        a = A()         # SWIG ref 'a' - new object is passed to Python (count: 1)
        b1 = B(a)       # C++ ref 'a (count: 2)
        if 1 + 1 == 2:
            b2 = B(a)   # C++ ref 'a' (count: 3)
        return a        # 'b1' and 'b2' are released and deleted, C++ unref 'a' twice (count: 1)
    
    a = create_A()      # (count: 1)
    exit                # 'a' is released, SWIG unref 'a' called in the destructor wrapper (count: 0)
    

    Note that the user doesn't explicitly need to call 'a->ref()' nor 'a->unref()' (and neither 'delete a'). Instead, SWIG takes cares of executing the "ref" and "unref" calls as needed. If the user doesn't specify the "ref/unref" feature for a type, SWIG will produce code equivalent to defining these features:

    %feature("ref")   ""
    %feature("unref") "delete $this;"
    

    In other words, SWIG will not do anything special when a new object is passed to Python, and it will always 'delete' the underlying object when Python releases the proxy instance.

    The %newobject feature is designed to indicate to the target language that it should take ownership of the returned object. When used in conjunction with a type that has the "ref" feature associated with it, it additionally emits the code in the "ref" feature into the C++ wrapper. Consider wrapping the following factory function in addition to the above:

    %newobject AFactory;
    A *AFactory() {
      return new A();
    }
    

    The AFactory function now acts much like a call to the A constructor with respect to memory handling:

    a = AFactory()    # SWIG ref 'a' due to %newobject (count: 1)
    exit              # 'a' is released, SWIG unref 'a' called in the destructor wrapper (count: 0)
    

    6.26 Using declarations and inheritance

    using declarations are sometimes used to adjust access to members of base classes. For example:

    class Foo {
    public:
      int  blah(int x);
    };
    
    class Bar {
    public:
      double blah(double x);
    };
    
    class FooBar : public Foo, public Bar {
    public:
      using Foo::blah;
      using Bar::blah;
      char *blah(const char *x);
    };
    

    In this example, the using declarations make different versions of the overloaded blah() method accessible from the derived class. For example:

    FooBar *f;
    f->blah(3);         // Ok. Invokes Foo::blah(int)
    f->blah(3.5);       // Ok. Invokes Bar::blah(double)
    f->blah("hello");   // Ok. Invokes FooBar::blah(const char *);
    

    SWIG emulates the same functionality when creating wrappers. For example, if you wrap this code in Python, the module works just like you would expect:

    >>> import example
    >>> f = example.FooBar()
    >>> f.blah(3)
    >>> f.blah(3.5)
    >>> f.blah("hello")
    

    using declarations can also be used to change access when applicable. For example:

    class Foo {
    protected:
      int x;
      int blah(int x);
    };
    
    class Bar : public Foo {
    public:
      using Foo::x;       // Make x public
      using Foo::blah;    // Make blah public
    };
    

    This also works in SWIG---the exposed declarations will be wrapped normally.

    When using declarations are used as shown in these examples, declarations from the base classes are copied into the derived class and wrapped normally. When copied, the declarations retain any properties that might have been attached using %rename , %ignore, or %feature. Thus, if a method is ignored in a base class, it will also be ignored by a using declaration.

    Because a using declaration does not provide fine-grained control over the declarations that get imported, it may be difficult to manage such declarations in applications that make heavy use of SWIG customization features. If you can't get using to work correctly, you can always change the interface to the following:

    
    class FooBar : public Foo, public Bar {
    public:
    #ifndef SWIG
      using Foo::blah;
      using Bar::blah;
    #else
      int blah(int x);         // explicitly tell SWIG about other declarations
      double blah(double x);
    #endif
    
      char *blah(const char *x);
    };
    

    Notes:

    • If a derived class redefines a method defined in a base class, then a using declaration won't cause a conflict. For example:

      class Foo {
      public:
        int blah(int );
        double blah(double);
      };
      
      class Bar : public Foo {
      public:
        using Foo::blah;    // Only imports blah(double);
        int blah(int);
      };
      
    • Resolving ambiguity in overloading may prevent declarations from being imported by using. For example:

      %rename(blah_long) Foo::blah(long);
      class Foo {
      public:
        int blah(int);
        long blah(long);  // Renamed to blah_long
      };
      
      class Bar : public Foo {
      public:
        using Foo::blah;     // Only imports blah(int)
        double blah(double x);
      };
      

    6.27 Nested classes

    If the target language supports the nested classes concept (like Java), the nested C++ classes are wrapped as nested target language proxy classes. (In case of Java - "static" nested classes.) Only public nested classes are wrapped. Otherwise there is little difference between nested and normal classes.

    If the target language doesn't support nested classes directly, or the support is not implemented in the language module (like for Python currently), then the visible nested classes are moved to the same name space as the containing class (nesting hierarchy is "flattened"). The same behaviour may be turned on for C# and Java by the %feature ("flatnested"); If there is a class with the same name in the outer namespace the inner class (or the global one) may be renamed or ignored:

    %rename (Bar_Foo) Bar::Foo;
    class Foo {};
    class Bar {
      public:
      class Foo {};
    };
    

    If a nested class, within an outer class, has to be used as a template parameter within the outer class, then the template will have to be instantiated with %template before the beginning of the outer class. An example can be found in the Templates section.

    Compatibility Note: Prior to SWIG-3.0.0, there was limited nested class support. Nested classes were treated as opaque pointers. However, there was a workaround for nested class support in these older versions requiring the user to replicate the nested class in the global scope, adding in a typedef for the nested class in the global scope and using the "nestedworkaround" feature on the nested class. This resulted in approximately the same behaviour as the "flatnested" feature. With proper nested class support now available in SWIG-3.0.0, this feature has been deprecated and no longer works requiring code changes. If you see the following warning:

    example.i:8: Warning 126: The nestedworkaround feature is deprecated
    

    consider using the "flatnested" feature discussed above which generates a non-nested proxy class, like the "nestedworkaround" feature did. Alternatively, use the default nested class code generation, which may generate an equivalent to a nested proxy class in the target language, depending on the target language support.

    SWIG-1.3.40 and earlier versions did not have the nestedworkaround feature and the generated code resulting from parsing nested classes did not always compile. Nested class warnings could also not be suppressed using %warnfilter.

    6.28 A brief rant about const-correctness

    A common issue when working with C++ programs is dealing with all possible ways in which the const qualifier (or lack thereof) will break your program, all programs linked against your program, and all programs linked against those programs.

    Although SWIG knows how to correctly deal with const in its internal type system and it knows how to generate wrappers that are free of const-related warnings, SWIG does not make any attempt to preserve const-correctness in the target language. Thus, it is possible to pass const qualified objects to non-const methods and functions. For example, consider the following code in C++:

    const Object * foo();
    void bar(Object *);
    
    ...
    // C++ code
    void blah() {
      bar(foo());         // Error: bar discards const
    };
    

    Now, consider the behavior when wrapped into a Python module:

    >>> bar(foo())         # Okay
    >>> 
    

    Although this is clearly a violation of the C++ type-system, fixing the problem doesn't seem to be worth the added implementation complexity that would be required to support it in the SWIG run-time type system. There are no plans to change this in future releases (although we'll never rule anything out entirely).

    The bottom line is that this particular issue does not appear to be a problem for most SWIG projects. Of course, you might want to consider using another tool if maintaining constness is the most important part of your project.

    6.29 Callbacks to the target language

    C/C++ function pointers are often used for callbacks and this is discussed in the Pointers to functions and callbacks section. The callback techniques described therein provide a way to control callbacks to a C/C++ function but not callbacks into the target language. The techniques described below show how the director feature can be used to support callbacks from C/C++ to the target language.

    6.29.1 Introduction to director classes

    The director feature enables the ability for a target language class to derive from a wrapped C++ class. The target language can override virtual methods of a wrapped C++ class, thereby supporting cross-language polymorphism. Code can 'call up' from C++ into the target language by simply calling a virtual method overridden in a derived class in the target language. The wrapped C++ classes that have this ability are termed 'director' classes. The director feature is documented individually in each target language and the reader should locate and read this to obtain a full understanding of directors.

    6.29.2 Using directors and target language callbacks

    SWIG's primary goal is to make it possible to call C/C++ code from a target language, however, the director feature enables the reverse. While there isn't simple direct support for calling target language code from C, the director feature makes this possible. It does require some work and additional wrapper code to be provided by the user. The additional code required must be C++ and not C code and hence may introduce a small dependency on C++ if using a pure C project. In a nutshell, the user must create a C++ base class and turn it into a director class. A virtual method in the director base class is required. SWIG generates the code to call up into the target language when wrapping the director virtual method.

    Let's look at some details next. Consider the same function pointer for a callback called binary_op from the Pointers to functions and callbacks section. For completeness, the code required for the module and director feature is also shown:

    %module(directors="1") example
    
    %{
    int binary_op(int a, int b, int (*op)(int, int)) {
      return op(a, b);
    }
    %}
    

    The goal is to have a target language function that gets called by binary_op. The target language function should have the equivalent signature as the C/C++ function pointer int (*op)(int, int). As we are using directors, we need a C++ virtual method with this signature, so let's define the C++ class and pure virtual method first and make it a director class via the director feature:

    %feature("director") BinaryOp;
    
    %inline %{
    struct BinaryOp {
      virtual int handle(int a, int b) = 0;
      virtual ~BinaryOp() {}
    };
    %}
    

    The following handler_helper function and binary_op_wrapper function completes the code needed in the C++/SWIG layer. The binary_op_wrapper function is wrapped by SWIG and is very similar to the binary_op function, however, it takes a pointer to the director base class BinaryOp instead of a C/C++ function pointer.

    %{
    static BinaryOp *handler_ptr = NULL;
    static int handler_helper(int a, int b) {
      // Make the call up to the target language when handler_ptr
      // is an instance of a target language director class
      return handler_ptr->handle(a, b);
    }
    // If desired, handler_ptr above could be changed to a thread-local variable in order to make thread-safe
    %}
    
    %inline %{
    int binary_op_wrapper(int a, int b, BinaryOp *handler) {
      handler_ptr = handler;
      int result = binary_op(a, b, &handler_helper);
      handler = NULL;
      return result;
    }
    %}
    

    On the target language side, we need to derive a class from BinaryOp and override the handle method. In Python this could be as simple as:

    import example
    
    # PythonBinaryOp class is defined and derived from C++ class BinaryOp
    class PythonBinaryOp(example.BinaryOp):
    
        # Define Python class 'constructor'
        def __init__(self):
            # Call C++ base class constructor
            example.BinaryOp.__init__(self)
    
        # Override C++ method: virtual int handle(int a, int b) = 0;
        def handle(self, a, b):
            # Return the product
            return a * b
    

    For this to work from Python, an instance of the PythonBinaryOp class is created and then passed to binary_op_wrapper. The net result is the binary_op function will in turn be called which will call handler_helper which will call the virtual handle method, that is, the Python method handle in the PythonBinaryOp class. The result will be the product of 10 and 20 and make its way back to Python and hence 200 will be printed with the following code:

    handler = PythonBinaryOp()
    result = example.binary_op_wrapper(10, 20, handler)
    print result
    

    This has thus demonstrated a C/C++ function pointer calling back into a target language function. The code could be made a little more user friendly by using %rename to provide the original binary_op name from the target language instead of binary_op_wrapper. A C++ functor base class and Python functor class could also be used instead, but these are left as exercises for the reader.

    6.30 Where to go for more information

    If you're wrapping serious C++ code, you might want to pick up a copy of "The Annotated C++ Reference Manual" by Ellis and Stroustrup. This is the reference document we use to guide a lot of SWIG's C++ support.


    7 SWIG and C++11

    7.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++11 standard. This part of SWIG is still a work in progress.

    SWIG supports the new C++ syntax changes with some minor limitations in some areas such as decltype expressions and variadic templates. Wrappers for the new STL types (unordered_ containers, result_of, tuples) are incomplete. The wrappers for the new containers would work much like the C++03 containers and users are welcome to help by adapting the existing container interface files and submitting them as a patch for inclusion in future versions of SWIG.

    7.2 Core language changes

    7.2.1 Rvalue reference and move semantics

    SWIG correctly parses the rvalue reference syntax '&&', for example the typical usage of it in the move constructor and move assignment operator below:

    class MyClass {
    ...
      std::vector<int> numbers;
    public:
      MyClass(MyClass &&other) : numbers(std::move(other.numbers)) {}
      MyClass & operator=(MyClass &&other) {
        numbers = std::move(other.numbers);
        return *this;
      }
    };
    

    Rvalue references are designed for C++ temporaries and so are not very useful when used from non-C++ target languages. Generally you would just ignore them via %ignore before parsing the class. For example, ignore the move constructor:

    %ignore MyClass::MyClass(MyClass &&);
    

    The plan is to ignore move constructors by default in a future version of SWIG. Note that both normal assignment operators as well as move assignment operators are ignored by default in most target languages with the following warning:

    example.i:18: Warning 503: Can't wrap 'operator =' unless renamed to a valid identifier.
    

    7.2.2 Generalized constant expressions

    SWIG parses and identifies the keyword constexpr, but cannot fully utilise it. These C++ compile time constants are usable as runtime constants from the target languages. Below shows example usage for assigning a C++ compile time constant from a compile time constant function:

    constexpr int XXX() { return 10; }
    constexpr int YYY = XXX() + 100;
    

    When either of these is used from a target language, a runtime call is made to obtain the underlying constant.

    7.2.3 Extern template

    SWIG correctly parses the keywords extern template. However, this template instantiation suppression in a translation unit has no relevance outside of the C++ compiler and so is not used by SWIG. SWIG only uses %template for instantiating and wrapping templates.

    template class std::vector<int>;        // C++03 explicit instantiation in C++
    extern template class std::vector<int>; // C++11 explicit instantiation suppression in C++
    %template(VectorInt) std::vector<int>;  // SWIG instantiation
    

    7.2.4 Initializer lists

    Initializer lists are very much a C++ compiler construct and are not very accessible from wrappers as they are intended for compile time initialization of classes using the special std::initializer_list type. SWIG detects usage of initializer lists and will emit a special informative warning each time one is used:

    example.i:33: Warning 476: Initialization using std::initializer_list.
    

    Initializer lists usually appear in constructors but can appear in any function or method. They often appear in constructors which are overloaded with alternative approaches to initializing a class, such as the std container's push_back method for adding elements to a container. The recommended approach then is to simply ignore the initializer-list constructor, for example:

    %ignore Container::Container(std::initializer_list<int>);
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    Alternatively you could modify the class and add another constructor for initialization by some other means, for example by a std::vector:

    %include <std_vector.i>
    class Container {
    public:
      Container(const std::vector<int> &);
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    And then call this constructor from your target language, for example, in Python, the following will call the constructor taking the std::vector:

    >>> c = Container( [1, 2, 3, 4] )
    

    If you are unable to modify the class being wrapped, consider ignoring the initializer-list constructor and using %extend to add in an alternative constructor:

    %include <std_vector.i>
    %extend Container {
      Container(const std::vector<int> &elements) {
        Container *c = new Container();
        for (int element : elements)
          c->push_back(element);
        return c;
      }
    }
    
    %ignore Container::Container(std::initializer_list<int>);
    
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    The above makes the wrappers look is as if the class had been declared as follows:

    %include <std_vector.i>
    class Container {
    public:
      Container(const std::vector<int> &);
    //  Container(std::initializer_list<int>); // initializer-list constructor (ignored)
      Container();
      void push_back(const int &);
      ...
    };
    

    std::initializer_list is simply a container that can only be initialized at compile time. As it is just a C++ type, it is possible to write typemaps for a target language container to map onto std::initializer_list. However, this can only be done for a fixed number of elements as initializer lists are not designed to be constructed with a variable number of arguments at runtime. The example below is a very simple approach which ignores any parameters passed in and merely initializes with a fixed list of fixed integer values chosen at compile time:

    %typemap(in) std::initializer_list<int> {
      $1 = {10, 20, 30, 40, 50};
    }
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    Any attempt at passing in values from the target language will be ignored and be replaced by {10, 20, 30, 40, 50}. Needless to say, this approach is very limited, but could be improved upon, but only slightly. A typemap could be written to map a fixed number of elements on to the std::initializer_list, but with values decided at runtime. The typemaps would be target language specific.

    Note that the default typemap for std::initializer_list does nothing but issue the warning and hence any user supplied typemaps will override it and suppress the warning.

    7.2.5 Uniform initialization

    The curly brackets {} for member initialization are fully supported by SWIG:

    struct BasicStruct {
     int x;
     double y;
    };
     
    struct AltStruct {
      AltStruct(int x, double y) : x_{x}, y_{y} {}
     
      int x_;
      double y_;
    };
    
    BasicStruct var1{5, 3.2}; // only fills the struct components
    AltStruct var2{2, 4.3};   // calls the constructor
    

    Uniform initialization does not affect usage from the target language, for example in Python:

    >>> a = AltStruct(10, 142.15)
    >>> a.x_
    10
    >>> a.y_
    142.15
    

    7.2.6 Type inference

    SWIG supports decltype() with some limitations. Single variables are allowed, however, expressions are not supported yet. For example, the following code will work:

    int i;
    decltype(i) j;
    

    However, using an expression inside the decltype results in syntax error:

    int i; int j;
    decltype(i+j) k;  // syntax error
    

    7.2.7 Range-based for-loop

    This feature is part of the implementation block only. SWIG ignores it.

    7.2.8 Lambda functions and expressions

    SWIG correctly parses most of the Lambda functions syntax. For example:

    auto val = [] { return something; };
    auto sum = [](int x, int y) { return x+y; };
    auto sum = [](int x, int y) -> int { return x+y; };
    

    The lambda functions are removed from the wrappers for now, because of the lack of support for closures (scope of the lambda functions) in the target languages.

    Lambda functions used to create variables can also be parsed, but due to limited support of auto when the type is deduced from the expression, the variables are simply ignored.

    auto six = [](int x, int y) { return x+y; }(4, 2);
    

    Better support should be available in a later release.

    7.2.9 Alternate function syntax

    SWIG fully supports the new definition of functions. For example:

    struct SomeStruct {
      int FuncName(int x, int y);
    };
    

    can now be written as in C++11:

    struct SomeStruct {
      auto FuncName(int x, int y) -> int;
    };
     
    auto SomeStruct::FuncName(int x, int y) -> int {
      return x + y;
    }
    

    The usage in the target languages remains the same, for example in Python:

    >>> a = SomeStruct()
    >>> a.FuncName(10, 5)
    15
    

    SWIG will also deal with type inference for the return type, as per the limitations described earlier. For example:

    auto square(float a, float b) -> decltype(a);
    

    7.2.10 Object construction improvement

    There are three parts to object construction improvement. The first improvement is constructor delegation such as the following:

    class A {
    public:
      int a;
      int b;
      int c;
    
      A() : A(10) {}
      A(int aa) : A(aa, 20) {}
      A(int aa, int bb) : A(aa, bb, 30) {}
      A(int aa, int bb, int cc) { a=aa; b=bb; c=cc; }
    };
    

    where peer constructors can be called. SWIG handles this without any issue.

    The second improvement is constructor inheritance via a using declaration. This is parsed correctly, but the additional constructors are not currently added to the derived proxy class in the target language. An example is shown below:

    class BaseClass {
    public:
      BaseClass(int iValue);
    };
    
    class DerivedClass: public BaseClass {
      public:
      using BaseClass::BaseClass; // Adds DerivedClass(int) constructor
    };
    

    The final part is member initialization at the site of the declaration. This kind of initialization is handled by SWIG.

    class SomeClass {
    public:
      SomeClass() {}
      explicit SomeClass(int new_value) : value(new_value) {}
    
      int value = 5;
    };
    

    7.2.11 Explicit overrides and final

    The special identifiers final and override can be used on methods and destructors, such as in the following example:

    struct BaseStruct {
      virtual void ab() const = 0;
      virtual void cd();
      virtual void ef();
      virtual ~BaseStruct();
    };
    struct DerivedStruct : BaseStruct {
      virtual void ab() const override;
      virtual void cd() final;
      virtual void ef() final override;
      virtual ~DerivedStruct() override;
    };
    

    7.2.12 Null pointer constant

    The nullptr constant is mostly unimportant in wrappers. In the few places it has an effect, it is treated like NULL.

    7.2.13 Strongly typed enumerations

    SWIG supports strongly typed enumerations and parses the new enum class syntax and forward declarator for the enums, such as:

    enum class MyEnum : unsigned int;
    

    Strongly typed enums are often used to avoid name clashes such as the following:

    struct Color {
      enum class RainbowColors : unsigned int {
        Red, Orange, Yellow, Green, Blue, Indigo, Violet
      };
      
      enum class WarmColors {
        Yellow, Orange, Red
      };
    
      // Note normal enum
      enum PrimeColors {
        Red=100, Green, Blue
      };
    };
    

    There are various ways that the target languages handle enums, so it is not possible to precisely state how they are handled in this section. However, generally, most scripting languages mangle in the strongly typed enumeration's class name, but do not use any additional mangling for normal enumerations. For example, in Python, the following code

    print Color.RainbowColors_Red, Color.WarmColors_Red, Color.Red
    

    results in

    0 2 100
    

    The strongly typed languages often wrap normal enums into an enum class and so treat normal enums and strongly typed enums the same. The equivalent in Java is:

    System.out.println(Color.RainbowColors.Red.swigValue() + " " + Color.WarmColors.Red.swigValue() + " " + Color.PrimeColors.Red.swigValue());
    

    7.2.14 Double angle brackets

    SWIG correctly parses the symbols >> as closing the template block, if found inside it at the top level, or as the right shift operator >> otherwise.

    std::vector<std::vector<int>> myIntTable;
    

    7.2.15 Explicit conversion operators

    SWIG correctly parses the keyword explicit for operators in addition to constructors now. For example:

    class U {
    public:
      int u;
    };
    
    class V {
    public:
      int v;
    };
    
    class TestClass {
    public:
      //implicit converting constructor
      TestClass(U const &val) { t=val.u; }
    
      // explicit constructor
      explicit TestClass(V const &val) { t=val.v; }
    
      int t;
    };
    
    struct Testable {
      // explicit conversion operator
      explicit operator bool() const {
        return false;
      }
    };
    

    The effect of explicit constructors and operators has little relevance for the proxy classes as target languages don't have the same concepts of implicit conversions as C++. Conversion operators either with or without explicit need renaming to a valid identifier name in order to make them available as a normal proxy method.

    7.2.16 Type alias and alias templates

    A type alias is a statement of the form:

    using PFD = void (*)(double); // New introduced syntax
    

    which is equivalent to the old style typedef:

    typedef void (*PFD)(double);  // The old style
    

    The following is an example of an alias template:

    template< typename T1, typename T2, int N >
    class SomeType {
    public:
      T1 a;
      T2 b;
    };
    
    template< typename T2 >
    using TypedefName = SomeType<char*, T2, 5>;
    

    SWIG supports both type aliasing and alias templates. However, in order to use an alias template, two %template directives must be used:

    %template(SomeTypeBool) SomeType<char*, bool, 5>;
    %template() TypedefName<bool>;
    

    Firstly, the actual template is instantiated with a name to be used by the target language, as per any template being wrapped. Secondly, the empty template instantiation, %template(), is required for the alias template. This second requirement is necessary to add the appropriate instantiated template type into the type system as SWIG does not automatically instantiate templates. See the Templates section for more general information on wrapping templates.

    7.2.17 Unrestricted unions

    SWIG fully supports any type inside a union even if it does not define a trivial constructor. For example, the wrapper for the following code correctly provides access to all members in the union:

    struct point {
      point() {}
      point(int x, int y) : x_(x), y_(y) {}
      int x_, y_;
    };
    
    #include <new> // For placement 'new' in the constructor below
    union P {
      int z;
      double w;
      point p; // Illegal in C++03; legal in C++11.
      // Due to the point member, a constructor definition is required.
      P() {
        new(&p) point();
      }
    } p1;
    

    7.2.18 Variadic templates

    SWIG supports the variadic templates syntax (inside the <> block, variadic class inheritance and variadic constructor and initializers) with some limitations. The following code is correctly parsed:

    template <typename... BaseClasses> class ClassName : public BaseClasses... {
    public:
      ClassName (BaseClasses &&... baseClasses) : BaseClasses(baseClasses)... {}
    }
    

    For now however, the %template directive only accepts one parameter substitution for the variable template parameters.

    %template(MyVariant1) ClassName<>         // zero argument not supported yet
    %template(MyVariant2) ClassName<int>      // ok
    %template(MyVariant3) ClassName<int, int> // too many arguments not supported yet
    

    Support for the variadic sizeof() function is correctly parsed:

    const int SIZE = sizeof...(ClassName<int, int>);
    

    In the above example SIZE is of course wrapped as a constant.

    7.2.19 New character literals

    C++11 adds support for UCS-2 and UCS-4 character literals. These character literals are preceded by either 'u' or 'U'.

    char16_t a = u'a';
    char32_t b = U'b';
    

    Compatibility note: SWIG-4.0.0 was the first version to support these Universal Coded Character Set (UCS) character literals.

    7.2.20 New string literals

    SWIG supports wide string and Unicode string constants and raw string literals.

    // New string literals
    wstring         aa =  L"Wide string";
    const char     *bb = u8"UTF-8 string";
    const char16_t *cc =  u"UTF-16 string";
    const char32_t *dd =  U"UTF-32 string";
    
    // Raw string literals
    const char      *xx =        ")I'm an \"ascii\" \\ string.";
    const char      *ee =   R"XXX()I'm an "ascii" \ string.)XXX"; // same as xx
    wstring          ff =  LR"XXX(I'm a "raw wide" \ string.)XXX";
    const char      *gg = u8R"XXX(I'm a "raw UTF-8" \ string.)XXX";
    const char16_t  *hh =  uR"XXX(I'm a "raw UTF-16" \ string.)XXX";
    const char32_t  *ii =  UR"XXX(I'm a "raw UTF-32" \ string.)XXX";
    

    Non-ASCII string support varies quite a bit among the various target languages though.

    Note: There is a bug currently where SWIG's preprocessor incorrectly parses an odd number of double quotes inside raw string literals.

    7.2.21 User-defined literals

    SWIG parses the declaration of user-defined literals, that is, the operator "" _mysuffix() function syntax.

    Some examples are the raw literal:

    OutputType operator "" _myRawLiteral(const char * value);
    

    numeric cooked literals:

    OutputType operator "" _mySuffixIntegral(unsigned long long);
    OutputType operator "" _mySuffixFloat(long double);
    

    and cooked string literals:

    OutputType operator "" _mySuffix(const char * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const wchar_t * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const char16_t * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const char32_t * string_values, size_t num_chars);
    

    Like other operators that SWIG parses, a warning is given about renaming the operator in order for it to be wrapped:

    example.i:27: Warning 503: Can't wrap 'operator "" _myRawLiteral' unless renamed to a valid identifier.
    

    If %rename is used, then it can be called like any other wrapped method. Currently you need to specify the full declaration including parameters for %rename:

    %rename(MyRawLiteral)  operator"" _myRawLiteral(const char * value);
    

    Or if you just wish to ignore it altogether:

    %ignore operator "" _myRawLiteral(const char * value);
    

    Note that use of user-defined literals such as the following still give a syntax error:

    OutputType var1 = "1234"_suffix;
    OutputType var2 = 1234_suffix;
    OutputType var3 = 3.1416_suffix;
    

    7.2.22 Thread-local storage

    SWIG correctly parses the thread_local keyword. For example, variables reachable by the current thread can be defined as:

    struct A {
      static thread_local int val;
    };
    thread_local int global_val;
    

    The use of the thread_local storage specifier does not affect the wrapping process; it does not modify the wrapper code compared to when it is not specified. A variable will be thread local if accessed from different threads from the target language in the same way that it will be thread local if accessed from C++ code.

    7.2.23 Explicitly defaulted functions and deleted functions

    SWIG handles explicitly defaulted functions, that is, = default added to a function declaration. Deleted definitions, which are also called deleted functions, have = delete added to the function declaration. For example:

    struct NonCopyable {
      NonCopyable & operator=(const NonCopyable &) = delete; /* Removes operator= */
      NonCopyable(const NonCopyable &) = delete;             /* Removes copy constructor */
      NonCopyable() = default;                               /* Explicitly allows the empty constructor */
    };
    

    Wrappers for deleted functions will not be available in the target language. Wrappers for defaulted functions will of course be available in the target language. Explicitly defaulted functions have no direct effect for SWIG wrapping as the declaration is handled much like any other method declaration parsed by SWIG.

    Deleted functions are also designed to prevent implicit conversions when calling the function. For example, the C++ compiler will not compile any code which attempts to use an int as the type of the parameter passed to f below:

    struct NoInt {
      void f(double i);
      void f(int) = delete;
    };
    

    This is a C++ compile time check and SWIG does not make any attempt to detect if the target language is using an int instead of a double though, so in this case it is entirely possible to pass an int instead of a double to f from Java, Python etc.

    7.2.24 Type long long int

    SWIG correctly parses and uses the new long long type already introduced in C99 some time ago.

    7.2.25 Static assertions

    SWIG correctly parses the new static_assert declarations (though 3.0.12 and earlier had a bug which meant this wasn't accepted at file scope). This is a C++ compile time directive so there isn't anything useful that SWIG can do with it.

    template <typename T>
    struct Check {
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
    };
    

    7.2.26 Allow sizeof to work on members of classes without an explicit object

    SWIG can parse the new sizeof() on types as well as on objects. For example:

    struct A {
      int member;
    };
    
    const int SIZE = sizeof(A::member); // does not work with C++03. Okay with C++11
    

    In Python:

    >>> SIZE
    8
    

    7.2.27 Exception specifications and noexcept

    C++11 added in the noexcept specification to exception specifications to indicate that a function simply may or may not throw an exception, without actually naming any exception. SWIG understands these, although there isn't any useful way that this information can be taken advantage of by target languages, so it is as good as ignored during the wrapping process. Below are some examples of noexcept in function declarations:

    static void noex1() noexcept;
    int noex2(int) noexcept(true);
    int noex3(int, bool) noexcept(false);
    

    7.2.28 Control and query object alignment

    An alignof operator is used mostly within C++ to return alignment in number of bytes, but could be used to initialize a variable as shown below. The variable's value will be available for access by the target language as any other variable's compile time initialised value.

    const int align1 = alignof(A::member);
    

    The alignas specifier for variable alignment is not yet supported. Example usage:

    struct alignas(16) S {
      int num;
    };
    alignas(double) unsigned char c[sizeof(double)];
    

    Use the preprocessor to work around this for now:

    #define alignas(T)
    

    7.2.29 Attributes

    Attributes such as those shown below, are not yet supported and will give a syntax error.

    int [[attr1]] i [[attr2, attr3]];
    
    [[noreturn, nothrow]] void f [[noreturn]] ();
    

    7.2.30 Methods with ref-qualifiers

    C++11 non-static member functions can be declared with ref-qualifiers. Member functions declared with a & lvalue ref-qualifiers are wrapped like any other function without ref-qualifiers. Member functions declared with a && rvalue ref-qualifiers are ignored by default as they are unlikely to be required from non-C++ languages where the concept of rvalue-ness for the implied *this pointer does not apply. The warning is hidden by default, but can be displayed as described in the section on Enabling extra warnings.

    Consider:

    struct RQ {
      void m1(int x) &;
      void m2(int x) &&;
    };
    

    The only wrapped method will be the lvalue ref-qualified method m1 and if SWIG is run with the -Wextra command-line option, the following warning will be issued indicating m2 is not wrapped:

    example.i:7: Warning 405: Method with rvalue ref-qualifier m2(int) && ignored.
    

    If you unignore the method as follows, wrappers for m2 will be generated:

    %feature("ignore", "0") RQ::m2(int x) &&;
    struct RQ {
      void m1(int x) &;
      void m2(int x) &&;
    };
    

    Inspection of the generated C++ code, will show that std::move is used on the instance of the RQ * class:

      RQ *arg1 = (RQ *) 0 ;
      int arg2 ;
    
      arg1 = ...marshalled from target language...
      arg2 = ...marshalled from target language...
    
      std::move(*arg1).m2(arg2);
    

    This will compile but when run, the move effects may not be what you want. As stated earlier, rvalue ref-qualifiers aren't really applicable outside the world of C++. However, if you really know what you are doing, full control over the call to the method is possible via the low-level "action" feature. This feature completely replaces the call to the underlying function, that is, the last line in the snippet of code above.

    %feature("ignore", "0") RQ::m2(int x) &&;
    %feature("action") RQ::m2(int x) && %{
      RQ().m2(arg2);
    %}
    struct RQ {
      void m1(int x) &;
      void m2(int x) &&;
    };
    

    resulting in:

      RQ *arg1 = (RQ *) 0 ;
      int arg2 ;
    
      arg1 = ...marshalled from target language...
      arg2 = ...marshalled from target language...
    
      RQ().m2(arg2);
    

    Compatibility note: SWIG-4.0.0 was the first version to support ref-qualifiers.

    7.3 Standard library changes

    7.3.1 Threading facilities

    SWIG does not currently wrap or use any of the new threading classes introduced (thread, mutex, locks, condition variables, task). The main reason is that SWIG target languages offer their own threading facilities so there is limited use for them.

    7.3.2 Tuple types

    SWIG does not provide library files for the new tuple types yet. Variadic template support requires further work to provide substantial tuple wrappers.

    7.3.3 Hash tables

    The new hash tables in the STL are unordered_set, unordered_multiset, unordered_map, unordered_multimap . These are not available in all target languages. Any missing support can in principle be easily implemented by adapting the current STL containers.

    7.3.4 Regular expressions

    While SWIG could provide wrappers for the new C++11 regular expressions classes, there is little need as the target languages have their own regular expression facilities.

    7.3.5 General-purpose smart pointers

    SWIG provides special smart pointer handling for std::shared_ptr in the same way it has support for boost::shared_ptr. Please see the shared_ptr smart pointer library section. There is no special smart pointer handling available for std::weak_ptr and std::unique_ptr yet.

    7.3.6 Extensible random number facility

    This feature extends and standardizes the standard library only and does not effect the C++ language nor SWIG.

    7.3.7 Wrapper reference

    Wrapper references are similar to normal C++ references but are copy-constructible and copy-assignable. They could conceivably be used in public APIs. There is no special support for std::reference_wrapper in SWIG though. Users would need to write their own typemaps if wrapper references are being used and these would be similar to the plain C++ reference typemaps.

    7.3.8 Polymorphic wrappers for function objects

    SWIG supports functor classes in a few languages in a very natural way. However nothing is provided yet for the new std::function template. SWIG will parse usage of the template like any other template.

    %rename(__call__) Test::operator(); // Default renaming used for Python
    
    struct Test {
      bool operator()(int x, int y); // function object
    };
    
    #include <functional>
    std::function<void (int, int)> pF = Test;   // function template wrapper
    
    

    Example of supported usage of the plain functor from Python is shown below. It does not involve std::function.

    t = Test()
    b = t(1, 2) # invoke C++ function object
    

    7.3.9 Type traits for metaprogramming

    The type_traits functions to support C++ metaprogramming is useful at compile time and is aimed specifically at C++ development:

    #include <type_traits>
    
    // First way of operating.
    template< bool B > struct algorithm {
      template< class T1, class T2 > static int do_it(T1 &, T2 &)  { /*...*/ return 1; }
    };
    
    // Second way of operating.
    template<> struct algorithm<true> {
      template< class T1, class T2 > static int do_it(T1, T2)  { /*...*/ return 2; }
    };
    
    // Instantiating 'elaborate' will automatically instantiate the correct way to operate, depending on the types used.
    template< class T1, class T2 > int elaborate(T1 A, T2 B) {
      // Use the second way only if 'T1' is an integer and if 'T2' is a floating point,
      // otherwise use the first way.
      return algorithm< std::is_integral<T1>::value && std::is_floating_point<T2>::value >::do_it(A, B);
    }
    

    SWIG correctly parses the template specialization, template types etc. However, metaprogramming and the additional support in the type_traits header is really for compile time and is not much use at runtime for the target languages. For example, as SWIG requires explicit instantiation of templates via %template, there isn't much that std::is_integral<int> is going to provide by itself. However, template functions using such metaprogramming techniques might be useful to wrap. For example, the following instantiations could be made:

    %template(Elaborate) elaborate<int, int>;
    %template(Elaborate) elaborate<int, double>;
    

    Then the appropriate algorithm can be called for the subset of types given by the above %template instantiations from a target language, such as Python:

    >>> Elaborate(0, 0)
    1
    >>> Elaborate(0, 0.0)
    2
    

    7.3.10 Uniform method for computing return type of function objects

    The new std::result_of class introduced in the <functional> header provides a generic way to obtain the return type of a function type via std::result_of::type. There isn't any library interface file to support this type. With a bit of work, SWIG will deduce the return type of functions when used in std::result_of using the approach shown below. The technique basically forward declares the std::result_of template class, then partially specializes it for the function types of interest. SWIG will use the partial specialization and hence correctly use the std::result_of::type provided in the partial specialization.

    %inline %{
    #include <functional>
    typedef double(*fn_ptr)(double);
    %}
    
    namespace std {
      // Forward declaration of result_of
      template<typename Func> struct result_of;
      // Add in a partial specialization of result_of
      template<> struct result_of< fn_ptr(double) > {
        typedef double type;
      };
    }
    
    %template() std::result_of< fn_ptr(double) >;
    
    %inline %{
    
    double square(double x) {
      return (x * x);
    }
    
    template<class Fun, class Arg>
    typename std::result_of<Fun(Arg)>::type test_result_impl(Fun fun, Arg arg) {
      return fun(arg);
    }
    %}
    
    %template(test_result) test_result_impl< fn_ptr, double >;
    %constant double (*SQUARE)(double) = square;
    

    Note the first use of %template which SWIG requires to instantiate the template. The empty template instantiation suffices as no proxy class is required for std::result_of<Fun(Arg)>::type as this type is really just a double. The second %template instantiates the template function which is being wrapped for use as a callback. The %constant can then be used for any callback function as described in Pointers to functions and callbacks.

    Example usage from Python should give the not too surprising result:

    >>> test_result(SQUARE, 5.0)
    25.0
    

    Phew, that is a lot of hard work to get a callback working. You could just go with the more attractive option of just using double as the return type in the function declaration instead of result_of !


    8 SWIG and C++14

    8.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++14 standard. There isn't much in C++14 that affects SWIG, however, work has only just begun on adding C++14 support.

    Compatibility note: SWIG-4.0.0 is the first version to support any C++14 features.

    8.2 Core language changes

    8.2.1 Binary integer literals

    C++14 added binary integer literals and SWIG supports these. Example:

    int b = 0b101011;
    

    8.3 Standard library changes


    9 SWIG and C++17

    9.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++17 standard. There isn't much in C++17 that affects SWIG, however, work has only just begun on adding C++17 support.

    Compatibility note: SWIG-4.0.0 is the first version to support any C++17 features.

    9.2 Core language changes

    9.2.1 Nested namespace definitions

    C++17 offers a more concise syntax for defining namespaces. SWIG has support for nested namespace definitions such as:

    namespace A::B::C {
      ...
    }
    

    This is the equivalent to the C++98 namespace definitions:

    namespace A {
      namespace B {
        namespace C {
          ...
        }
      }
    }
    

    9.2.2 UTF-8 character literals

    C++17 added UTF-8 (u8) character literals. These are of type char. Example:

    char a = u8'a';
    

    9.2.3 Hexadecimal floating literals

    C++17 added hexadecimal floating literals. For example:

    double f = 0xF.68p2;
    

    9.3 Standard library changes


    10 Preprocessing

    SWIG includes its own enhanced version of the C preprocessor. The preprocessor supports the standard preprocessor directives and macro expansion rules. However, a number of modifications and enhancements have been made. This chapter describes some of these modifications.

    10.1 File inclusion

    To include another file into a SWIG interface, use the %include directive like this:

    %include "pointer.i"
    

    Unlike, #include, %include includes each file once (and will not reload the file on subsequent %include declarations). Therefore, it is not necessary to use include-guards in SWIG interfaces.

    By default, the #include is ignored unless you run SWIG with the -includeall option. The reason for ignoring traditional includes is that you often don't want SWIG to try and wrap everything included in standard header system headers and auxiliary files.

    10.2 File imports

    SWIG provides another file inclusion directive with the %import directive. For example:

    %import "foo.i"
    

    The purpose of %import is to collect certain information from another SWIG interface file or a header file without actually generating any wrapper code. Such information generally includes type declarations (e.g., typedef) as well as C++ classes that might be used as base-classes for class declarations in the interface. The use of %import is also important when SWIG is used to generate extensions as a collection of related modules. This is an advanced topic and is described in later in the Working with Modules chapter.

    The -importall directive tells SWIG to follow all #include statements as imports. This might be useful if you want to extract type definitions from system header files without generating any wrappers.

    10.3 Conditional Compilation

    SWIG fully supports the use of #if, #ifdef, #ifndef, #else, #endif to conditionally include parts of an interface. The following symbols are predefined by SWIG when it is parsing the interface:

    SWIG                            Always defined when SWIG is processing a file
    SWIGIMPORTED                    Defined when SWIG is importing a file with %import
    SWIG_VERSION                    Hexadecimal (binary-coded decimal) number containing SWIG version,
                                    such as 0x010311 (corresponding to SWIG-1.3.11).
    
    SWIGCSHARP                      Defined when using C#
    SWIGD                           Defined when using D
    SWIGGO                          Defined when using Go
    SWIGGUILE                       Defined when using Guile
    SWIGJAVA                        Defined when using Java
    SWIGJAVASCRIPT                  Defined when using Javascript
    SWIG_JAVASCRIPT_JSC             Defined when using Javascript with -jsc
    SWIG_JAVASCRIPT_V8              Defined when using Javascript with -v8 or -node
    SWIGLUA                         Defined when using Lua
    SWIGMZSCHEME                    Defined when using Mzscheme
    SWIGOCAML                       Defined when using OCaml
    SWIGOCTAVE                      Defined when using Octave
    SWIGPERL                        Defined when using Perl
    SWIGPHP                         Defined when using PHP (any version)
    SWIGPHP7                        Defined when using PHP7
    SWIGPYTHON                      Defined when using Python
    SWIGR                           Defined when using R
    SWIGRUBY                        Defined when using Ruby
    SWIGSCILAB                      Defined when using Scilab
    SWIGTCL                         Defined when using Tcl
    SWIGXML                         Defined when using XML
    

    In addition, SWIG defines the following set of standard C/C++ macros:

    __LINE__                        Current line number
    __FILE__                        Current file name
    __STDC__                        Defined to indicate ISO C
    __cplusplus                     Defined when -c++ option used
    

    The following are language specific symbols that might be defined:

    SWIG_D_VERSION                  Unsigned integer target version when using D
    SWIGGO_CGO                      Defined when using Go for cgo
    SWIGGO_GCCGO                    Defined when using Go for gccgo
    SWIGGO_INTGO_SIZE               Size of the Go type int when using Go (32 or 64)
    SWIGPYTHON_PY3                  Defined when using Python with -py3
    SWIGPYTHON_BUILTIN              Defined when using Python with -builtin
    SWIG_RUBY_AUTORENAME            Defined when using Ruby with -autorename
    

    Interface files can look at these symbols as necessary to change the way in which an interface is generated or to mix SWIG directives with C code.

    10.4 Macro Expansion

    Traditional preprocessor macros can be used in SWIG interfaces. Be aware that the #define statement is also used to try and detect constants. Therefore, if you have something like this in your file,

    #ifndef _FOO_H 1
    #define _FOO_H 1
    ...
    #endif
    

    you may get some extra constants such as _FOO_H showing up in the scripting interface.

    More complex macros can be defined in the standard way. For example:

    #define EXTERN extern
    #ifdef __STDC__
    #define ISOC_(args)   (args)
    #else
    #define ISOC_(args) ()
    #endif
    

    The following operators can appear in macro definitions:

    • #x
      Converts macro argument x to a string surrounded by double quotes ("x").
    • x ## y
      Concatenates x and y together to form xy.
    • `x`
      If x is a string surrounded by double quotes, do nothing. Otherwise, turn into a string like #x. This is a non-standard SWIG extension.

    10.5 SWIG Macros

    SWIG provides an enhanced macro capability with the %define and %enddef directives. For example:

    %define ARRAYHELPER(type, name)
    %inline %{
    type *new_ ## name (int nitems) {
      return (type *) malloc(sizeof(type)*nitems);
    }
    void delete_ ## name(type *t) {
      free(t);
    }
    type name ## _get(type *t, int index) {
      return t[index];
    }
    void name ## _set(type *t, int index, type val) {
      t[index] = val;
    }
    %}
    %enddef
    
    ARRAYHELPER(int, IntArray)
    ARRAYHELPER(double, DoubleArray)
    

    The primary purpose of %define is to define large macros of code. Unlike normal C preprocessor macros, it is not necessary to terminate each line with a continuation character (\)--the macro definition extends to the first occurrence of %enddef. Furthermore, when such macros are expanded, they are reparsed through the C preprocessor. Thus, SWIG macros can contain all other preprocessor directives except for nested %define statements.

    The SWIG macro capability is a very quick and easy way to generate large amounts of code. In fact, many of SWIG's advanced features and libraries are built using this mechanism (such as C++ template support).

    10.6 C99 and GNU Extensions

    SWIG-1.3.12 and newer releases support variadic preprocessor macros. For example:

    #define DEBUGF(fmt, ...)   fprintf(stderr, fmt, __VA_ARGS__)
    

    When used, any extra arguments to ... are placed into the special variable __VA_ARGS__. This also works with special SWIG macros defined using %define.

    SWIG allows a variable number of arguments to be empty. However, this often results in an extra comma (, ) and syntax error in the resulting expansion. For example:

    DEBUGF("hello");   --> fprintf(stderr, "hello", );
    

    To get rid of the extra comma, use ## like this:

    #define DEBUGF(fmt, ...)   fprintf(stderr, fmt, ##__VA_ARGS__)
    

    SWIG also supports GNU-style variadic macros. For example:

    #define DEBUGF(fmt, args...)  fprintf(stdout, fmt, args)
    

    Comment: It's not entirely clear how variadic macros might be useful to interface building. However, they are used internally to implement a number of SWIG directives and are provided to make SWIG more compatible with C99 code.

    10.7 Preprocessing and delimiters

    The preprocessor handles { }, " " and %{ %} delimiters differently.

    10.7.1 Preprocessing and %{ ... %} & " ... " delimiters

    The SWIG preprocessor does not process any text enclosed in a code block %{ ... %}. Therefore, if you write code like this,

    %{
    #ifdef NEED_BLAH
    int blah() {
      ...
    }
    #endif
    %}
    

    the contents of the %{ ... %} block are copied without modification to the output (including all preprocessor directives).

    10.7.2 Preprocessing and { ... } delimiters

    SWIG always runs the preprocessor on text appearing inside { ... }. However, sometimes it is desirable to make a preprocessor directive pass through to the output file. For example:

    %extend Foo {
      void bar() {
        #ifdef DEBUG
          printf("I'm in bar\n");
        #endif
      }
    }
    

    By default, SWIG will interpret the #ifdef DEBUG statement. However, if you really wanted that code to actually go into the wrapper file, prefix the preprocessor directives with % like this:

    %extend Foo {
      void bar() {
        %#ifdef DEBUG
          printf("I'm in bar\n");
        %#endif
      }
    }
    

    SWIG will strip the extra % and leave the preprocessor directive in the code.

    10.8 Preprocessor and Typemaps

    Typemaps support a special attribute called noblock where the { ... } delimiters can be used, but the delimiters are not actually generated into the code. The effect is then similar to using "" or %{ %} delimiters but the code is run through the preprocessor. For example:

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in) Int {$1= SWIG_macro(int);}
    

    might generate

      {
        arg1=(int)jarg1;
      }
    

    whereas

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in, noblock=1) Int {$1= SWIG_macro(int);}
    

    might generate

      arg1=(int)jarg1;
    

    and

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in) Int %{$1=SWIG_macro(int);%}
    

    would generate

      arg1=SWIG_macro(int);
    

    10.9 Viewing preprocessor output

    Like many compilers, SWIG supports a -E command line option to display the output from the preprocessor. When the -E option is used, SWIG will not generate any wrappers. Instead the results after the preprocessor has run are displayed. This might be useful as an aid to debugging and viewing the results of macro expansions.

    10.10 The #error and #warning directives

    SWIG supports the commonly used #warning and #error preprocessor directives. The #warning directive will cause SWIG to issue a warning then continue processing. The #error directive will cause SWIG to exit with a fatal error. Example usage:

    #error "This is a fatal error message"
    #warning "This is a warning message"
    

    The #error behaviour can be made to work like #warning if the -cpperraswarn commandline option is used. Alternatively, the #pragma directive can be used to the same effect, for example:

      /* Modified behaviour: #error does not cause SWIG to exit with error */
      #pragma SWIG cpperraswarn=1
      /* Normal behaviour: #error does cause SWIG to exit with error */
      #pragma SWIG cpperraswarn=0
    

    11 SWIG library

    To help build extension modules, SWIG is packaged with a library of support files that you can include in your own interfaces. These files often define new SWIG directives or provide utility functions that can be used to access parts of the standard C and C++ libraries. This chapter provides a reference to the current set of supported library files.

    Compatibility note: Older versions of SWIG included a number of library files for manipulating pointers, arrays, and other structures. Most these files are now deprecated and have been removed from the distribution. Alternative libraries provide similar functionality. Please read this chapter carefully if you used the old libraries.

    11.1 The %include directive and library search path

    Library files are included using the %include directive. When searching for files, directories are searched in the following order:

    1. The current directory
    2. Directories specified with the -I command line option
    3. ./swig_lib
    4. SWIG library install location as reported by swig -swiglib, for example /usr/local/share/swig/1.3.30
    5. On Windows, a directory Lib relative to the location of swig.exe is also searched.

    Within directories mentioned in points 3-5, SWIG first looks for a subdirectory corresponding to a target language (e.g., python, tcl, etc.). If found, SWIG will search the language specific directory first. This allows for language-specific implementations of library files.

    You can ignore the installed SWIG library by setting the SWIG_LIB environment variable. Set the environment variable to hold an alternative library directory.

    The directories that are searched are displayed when using -verbose commandline option.

    11.2 C arrays and pointers

    This section describes library modules for manipulating low-level C arrays and pointers. The primary use of these modules is in supporting C declarations that manipulate bare pointers such as int *, double *, or void *. The modules can be used to allocate memory, manufacture pointers, dereference memory, and wrap pointers as class-like objects. Since these functions provide direct access to memory, their use is potentially unsafe and you should exercise caution.

    11.2.1 cpointer.i

    The cpointer.i module defines macros that can be used to used to generate wrappers around simple C pointers. The primary use of this module is in generating pointers to primitive datatypes such as int and double.

    %pointer_functions(type, name)

    Generates a collection of four functions for manipulating a pointer type *:

    type *new_name()

    Creates a new object of type type and returns a pointer to it. In C, the object is created using calloc(). In C++, new is used.

    type *copy_name(type value)

    Creates a new object of type type and returns a pointer to it. An initial value is set by copying it from value. In C, the object is created using calloc(). In C++, new is used.

    type *delete_name(type *obj)

    Deletes an object type type.

    void name_assign(type *obj, type value)

    Assigns *obj = value.

    type name_value(type *obj)

    Returns the value of *obj.

    When using this macro, type may be any type and name must be a legal identifier in the target language. name should not correspond to any other name used in the interface file.

    Here is a simple example of using %pointer_functions():

    %module example
    %include "cpointer.i"
    
    /* Create some functions for working with "int *" */
    %pointer_functions(int, intp);
    
    /* A function that uses an "int *" */
    void add(int x, int y, int *result);
    

    Now, in Python:

    >>> import example
    >>> c = example.new_intp()     # Create an "int" for storing result
    >>> example.add(3, 4, c)       # Call function
    >>> example.intp_value(c)      # Dereference
    7
    >>> example.delete_intp(c)     # Delete
    

    %pointer_class(type, name)

    Wraps a pointer of type * inside a class-based interface. This interface is as follows:

    struct name {
      name();                            // Create pointer object
      ~name();                           // Delete pointer object
      void assign(type value);           // Assign value
      type value();                      // Get value
      type *cast();                      // Cast the pointer to original type
      static name *frompointer(type *);  // Create class wrapper from existing
                                         // pointer
    };
    

    When using this macro, type is restricted to a simple type name like int, float, or Foo. Pointers and other complicated types are not allowed. name must be a valid identifier not already in use. When a pointer is wrapped as a class, the "class" may be transparently passed to any function that expects the pointer.

    If the target language does not support proxy classes, the use of this macro will produce the example same functions as %pointer_functions() macro.

    It should be noted that the class interface does introduce a new object or wrap a pointer inside a special structure. Instead, the raw pointer is used directly.

    Here is the same example using a class instead:

    %module example
    %include "cpointer.i"
    
    /* Wrap a class interface around an "int *" */
    %pointer_class(int, intp);
    
    /* A function that uses an "int *" */
    void add(int x, int y, int *result);
    

    Now, in Python (using proxy classes)

    >>> import example
    >>> c = example.intp()         # Create an "int" for storing result
    >>> example.add(3, 4, c)       # Call function
    >>> c.value()                  # Dereference
    7
    

    Of the two macros, %pointer_class is probably the most convenient when working with simple pointers. This is because the pointers are access like objects and they can be easily garbage collected (destruction of the pointer object destroys the underlying object).

    %pointer_cast(type1, type2, name)

    Creates a casting function that converts type1 to type2 . The name of the function is name. For example:

    %pointer_cast(int *, unsigned int *, int_to_uint);
    

    In this example, the function int_to_uint() would be used to cast types in the target language.

    Note: None of these macros can be used to safely work with strings (char * or char **).

    Note: When working with simple pointers, typemaps can often be used to provide more seamless operation.

    11.2.2 carrays.i

    This module defines macros that assist in wrapping ordinary C pointers as arrays. The module does not provide any safety or an extra layer of wrapping--it merely provides functionality for creating, destroying, and modifying the contents of raw C array data.

    %array_functions(type, name)

    Creates four functions.

    type *new_name(int nelements)

    Creates a new array of objects of type type. In C, the array is allocated using calloc(). In C++, new [] is used.

    type *delete_name(type *ary)

    Deletes an array. In C, free() is used. In C++, delete [] is used.

    type name_getitem(type *ary, int index)

    Returns the value ary[index].

    void name_setitem(type *ary, int index, type value)

    Assigns ary[index] = value.

    When using this macro, type may be any type and name must be a legal identifier in the target language. name should not correspond to any other name used in the interface file.

    Here is an example of %array_functions(). Suppose you had a function like this:

    void print_array(double x[10]) {
      int i;
      for (i = 0; i < 10; i++) {
        printf("[%d] = %g\n", i, x[i]);
      }
    }
    

    To wrap it, you might write this:

    %module example
    
    %include "carrays.i"
    %array_functions(double, doubleArray);
    
    void print_array(double x[10]);
    

    Now, in a scripting language, you might write this:

    a = new_doubleArray(10)               # Create an array
    for i in range(0, 10):
        doubleArray_setitem(a, i, 2 * i)  # Set a value
    print_array(a)                        # Pass to C
    delete_doubleArray(a)                 # Destroy array
    

    %array_class(type, name)

    Wraps a pointer of type * inside a class-based interface. This interface is as follows:

    struct name {
      name(int nelements);                  // Create an array
      ~name();                              // Delete array
      type getitem(int index);              // Return item
      void setitem(int index, type value);  // Set item
      type *cast();                         // Cast to original type
      static name *frompointer(type *);     // Create class wrapper from
                                            // existing pointer
    };
    

    When using this macro, type is restricted to a simple type name like int or float. Pointers and other complicated types are not allowed. name must be a valid identifier not already in use. When a pointer is wrapped as a class, it can be transparently passed to any function that expects the pointer.

    When combined with proxy classes, the %array_class() macro can be especially useful. For example:

    %module example
    %include "carrays.i"
    %array_class(double, doubleArray);
    
    void print_array(double x[10]);
    

    Allows you to do this:

    import example
    c = example.doubleArray(10)  # Create double[10]
    for i in range(0, 10):
        c[i] = 2 * i             # Assign values
    example.print_array(c)       # Pass to C
    

    Note: These macros do not encapsulate C arrays inside a special data structure or proxy. There is no bounds checking or safety of any kind. If you want this, you should consider using a special array object rather than a bare pointer.

    Note: %array_functions() and %array_class() should not be used with types of char or char *. SWIG's default handling of these types is to handle them as character strings and the two macros do not do enough to change this.

    11.2.3 cmalloc.i

    This module defines macros for wrapping the low-level C memory allocation functions malloc(), calloc(), realloc(), and free().

    %malloc(type [, name=type])

    Creates a wrapper around malloc() with the following prototype:

    type *malloc_name(int nbytes = sizeof(type));
    

    If type is void, then the size parameter nbytes is required. The name parameter only needs to be specified when wrapping a type that is not a valid identifier (e.g., " int *", "double **", etc.).

    %calloc(type [, name=type])

    Creates a wrapper around calloc() with the following prototype:

    type *calloc_name(int nobj =1, int sz = sizeof(type));
    

    If type is void, then the size parameter sz is required.

    %realloc(type [, name=type])

    Creates a wrapper around realloc() with the following prototype:

    type *realloc_name(type *ptr, int nitems);
    

    Note: unlike the C realloc(), the wrapper generated by this macro implicitly includes the size of the corresponding type. For example, realloc_int(p, 100) reallocates p so that it holds 100 integers.

    %free(type [, name=type])

    Creates a wrapper around free() with the following prototype:

    void free_name(type *ptr);
    

    %sizeof(type [, name=type])

    Creates the constant:

    %constant int sizeof_name = sizeof(type);
    

    %allocators(type [, name=type])

    Generates wrappers for all five of the above operations.

    Here is a simple example that illustrates the use of these macros:

    // SWIG interface
    %module example
    %include "cmalloc.i"
    
    %malloc(int);
    %free(int);
    
    %malloc(int *, intp);
    %free(int *, intp);
    
    %allocators(double);
    

    Now, in a script:

    >>> from example import *
    >>> a = malloc_int()
    >>> a
    '_000efa70_p_int'
    >>> free_int(a)
    >>> b = malloc_intp()
    >>> b
    '_000efb20_p_p_int'
    >>> free_intp(b)
    >>> c = calloc_double(50)
    >>> c
    '_000fab98_p_double'
    >>> c = realloc_double(100000)
    >>> free_double(c)
    >>> print sizeof_double
    8
    >>>
    

    11.2.4 cdata.i

    The cdata.i module defines functions for converting raw C data to and from strings in the target language. The primary applications of this module would be packing/unpacking of binary data structures---for instance, if you needed to extract data from a buffer. The target language must support strings with embedded binary data in order for this to work.

    const char *cdata(void *ptr, size_t nbytes)

    Converts nbytes of data at ptr into a string. ptr can be any pointer.

    void memmove(void *ptr, const char *s)

    Copies all of the string data in s into the memory pointed to by ptr. The string may contain embedded NULL bytes. This is actually a wrapper to the standard C library memmove function, which is declared as void memmove(void *ptr, const void *src, size_t n). The src and length n parameters are extracted from the language specific string s in the underlying wrapper code.

    One use of these functions is packing and unpacking data from memory. Here is a short example:

    // SWIG interface
    %module example
    %include "carrays.i"
    %include "cdata.i"
    
    %array_class(int, intArray);
    

    Python example:

    >>> a = intArray(10)
    >>> for i in range(0, 10):
    ...    a[i] = i
    >>> b = cdata(a, 40)
    >>> b
    '\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04
    \x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t'
    >>> c = intArray(10)
    >>> memmove(c, b)
    >>> print c[4]
    4
    >>>
    

    Since the size of data is not always known, the following macro is also defined:

    %cdata(type [, name=type])

    Generates the following function for extracting C data for a given type.

    char *cdata_name(type* ptr, int nitems)
    

    nitems is the number of items of the given type to extract.

    Note: These functions provide direct access to memory and can be used to overwrite data. Clearly they are unsafe.

    11.3 C string handling

    A common problem when working with C programs is dealing with functions that manipulate raw character data using char *. In part, problems arise because there are different interpretations of char *---it could be a NULL-terminated string or it could point to binary data. Moreover, functions that manipulate raw strings may mutate data, perform implicit memory allocations, or utilize fixed-sized buffers.

    The problems (and perils) of using char * are well-known. However, SWIG is not in the business of enforcing morality. The modules in this section provide basic functionality for manipulating raw C strings.

    11.3.1 Default string handling

    Suppose you have a C function with this prototype:

    char *foo(char *s);
    

    The default wrapping behavior for this function is to set s to a raw char * that refers to the internal string data in the target language. In other words, if you were using a language like Tcl, and you wrote this,

    % foo Hello
    

    then s would point to the representation of "Hello" inside the Tcl interpreter. When returning a char *, SWIG assumes that it is a NULL-terminated string and makes a copy of it. This gives the target language its own copy of the result.

    There are obvious problems with the default behavior. First, since a char * argument points to data inside the target language, it is NOT safe for a function to modify this data (doing so may corrupt the interpreter and lead to a crash). Furthermore, the default behavior does not work well with binary data. Instead, strings are assumed to be NULL-terminated.

    11.3.2 Passing binary data

    If you have a function that expects binary data,

    size_t parity(char *str, size_t len, size_t initial);
    

    you can wrap the parameters (char *str, size_t len) as a single argument using a typemap. Just do this:

    %apply (char *STRING, size_t LENGTH) { (char *str, size_t len) };
    ...
    size_t parity(char *str, size_t len, size_t initial);
    

    Now, in the target language, you can use binary string data like this:

    >>> s = "H\x00\x15eg\x09\x20"
    >>> parity(s, 0)
    

    In the wrapper function, the passed string will be expanded to a pointer and length parameter. The (char *STRING, int LENGTH) multi-argument typemap is also available in addition to (char *STRING, size_t LENGTH).

    11.3.3 Using %newobject to release memory

    If you have a function that allocates memory like this,

    char *foo() {
      char *result = (char *) malloc(...);
      ...
      return result;
    }
    

    then the SWIG generated wrappers will have a memory leak--the returned data will be copied into a string object and the old contents ignored.

    To fix the memory leak, use the %newobject directive.

    %newobject foo;
    ...
    char *foo();
    

    This will release the result if the appropriate target language support is available. SWIG provides the appropriate "newfree" typemap for char * so that the memory is released, however, you may need to provide your own "newfree" typemap for other types. See Object ownership and %newobject for more details.

    11.3.4 cstring.i

    The cstring.i library file provides a collection of macros for dealing with functions that either mutate string arguments or which try to output string data through their arguments. An example of such a function might be this rather questionable implementation:

    void get_path(char *s) {
      // Potential buffer overflow---uh, oh.
      sprintf(s, "%s/%s", base_directory, sub_directory);
    }
    ...
    // Somewhere else in the C program
    {
      char path[1024];
      ...
      get_path(path);
      ...
    }
    

    (Off topic rant: If your program really has functions like this, you would be well-advised to replace them with safer alternatives involving bounds checking).

    The macros defined in this module all expand to various combinations of typemaps. Therefore, the same pattern matching rules and ideas apply.

    %cstring_bounded_output(parm, maxsize)

    Turns parameter parm into an output value. The output string is assumed to be NULL-terminated and smaller than maxsize characters. Here is an example:

    %cstring_bounded_output(char *path, 1024);
    ...
    void get_path(char *path);
    

    In the target language:

    >>> get_path()
    /home/beazley/packages/Foo/Bar
    >>>
    

    Internally, the wrapper function allocates a small buffer (on the stack) of the requested size and passes it as the pointer value. Data stored in the buffer is then returned as a function return value. If the function already returns a value, then the return value and the output string are returned together (multiple return values). If more than maxsize bytes are written, your program will crash with a buffer overflow!

    %cstring_chunk_output(parm, chunksize)

    Turns parameter parm into an output value. The output string is always chunksize and may contain binary data. Here is an example:

    %cstring_chunk_output(char *packet, PACKETSIZE);
    ...
    void get_packet(char *packet);
    

    In the target language:

    >>> get_packet()
    '\xa9Y:\xf6\xd7\xe1\x87\xdbH;y\x97\x7f\xd3\x99\x14V\xec\x06\xea\xa2\x88'
    >>>
    

    This macro is essentially identical to %cstring_bounded_output . The only difference is that the result is always chunksize characters. Furthermore, the result can contain binary data. If more than maxsize bytes are written, your program will crash with a buffer overflow!

    %cstring_bounded_mutable(parm, maxsize)

    Turns parameter parm into a mutable string argument. The input string is assumed to be NULL-terminated and smaller than maxsize characters. The output string is also assumed to be NULL-terminated and less than maxsize characters.

    %cstring_bounded_mutable(char *ustr, 1024);
    ...
    void make_upper(char *ustr);
    

    In the target language:

    >>> make_upper("hello world")
    'HELLO WORLD'
    >>>
    

    Internally, this macro is almost exactly the same as %cstring_bounded_output. The only difference is that the parameter accepts an input value that is used to initialize the internal buffer. It is important to emphasize that this function does not mutate the string value passed---instead it makes a copy of the input value, mutates it, and returns it as a result. If more than maxsize bytes are written, your program will crash with a buffer overflow!

    %cstring_mutable(parm [, expansion])

    Turns parameter parm into a mutable string argument. The input string is assumed to be NULL-terminated. An optional parameter expansion specifies the number of extra characters by which the string might grow when it is modified. The output string is assumed to be NULL-terminated and less than the size of the input string plus any expansion characters.

    %cstring_mutable(char *ustr);
    ...
    void make_upper(char *ustr);
    
    %cstring_mutable(char *hstr, HEADER_SIZE);
    ...
    void attach_header(char *hstr);
    

    In the target language:

    >>> make_upper("hello world")
    'HELLO WORLD'
    >>> attach_header("Hello world")
    'header: Hello world'
    >>>
    

    This macro differs from %cstring_bounded_mutable() in that a buffer is dynamically allocated (on the heap using malloc/new ). This buffer is always large enough to store a copy of the input value plus any expansion bytes that might have been requested. It is important to emphasize that this function does not directly mutate the string value passed---instead it makes a copy of the input value, mutates it, and returns it as a result. If the function expands the result by more than expansion extra bytes, then the program will crash with a buffer overflow!

    %cstring_output_maxsize(parm, maxparm)

    This macro is used to handle bounded character output functions where both a char * and a maximum length parameter are provided. As input, a user simply supplies the maximum length. The return value is assumed to be a NULL-terminated string.

    %cstring_output_maxsize(char *path, int maxpath);
    ...
    void get_path(char *path, int maxpath);
    

    In the target language:

    >>> get_path(1024)
    '/home/beazley/Packages/Foo/Bar'
    >>>
    

    This macro provides a safer alternative for functions that need to write string data into a buffer. User supplied buffer size is used to dynamically allocate memory on heap. Results are placed into that buffer and returned as a string object.

    %cstring_output_withsize(parm, maxparm)

    This macro is used to handle bounded character output functions where both a char * and a pointer int * are passed. Initially, the int * parameter points to a value containing the maximum size. On return, this value is assumed to contain the actual number of bytes. As input, a user simply supplies the maximum length. The output value is a string that may contain binary data.

    %cstring_output_withsize(char *data, int *maxdata);
    ...
    void get_data(char *data, int *maxdata);
    

    In the target language:

    >>> get_data(1024)
    'x627388912'
    >>> get_data(1024)
    'xyzzy'
    >>>
    

    This macro is a somewhat more powerful version of %cstring_output_chunk(). Memory is dynamically allocated and can be arbitrary large. Furthermore, a function can control how much data is actually returned by changing the value of the maxparm argument.

    %cstring_output_allocate(parm, release)

    This macro is used to return strings that are allocated within the program and returned in a parameter of type char **. For example:

    void foo(char **s) {
      *s = (char *) malloc(64);
      sprintf(*s, "Hello world\n");
    }
    

    The returned string is assumed to be NULL-terminated. release specifies how the allocated memory is to be released (if applicable). Here is an example:

    %cstring_output_allocate(char **s, free(*$1));
    ...
    void foo(char **s);
    

    In the target language:

    >>> foo()
    'Hello world\n'
    >>>
    

    %cstring_output_allocate_size(parm, szparm, release)

    This macro is used to return strings that are allocated within the program and returned in two parameters of type char ** and int *. For example:

    void foo(char **s, int *sz) {
      *s = (char *) malloc(64);
      *sz = 64;
      // Write some binary data
      ...
    }
    

    The returned string may contain binary data. release specifies how the allocated memory is to be released (if applicable). Here is an example:

    %cstring_output_allocate_size(char **s, int *slen, free(*$1));
    ...
    void foo(char **s, int *slen);
    

    In the target language:

    >>> foo()
    '\xa9Y:\xf6\xd7\xe1\x87\xdbH;y\x97\x7f\xd3\x99\x14V\xec\x06\xea\xa2\x88'
    >>>
    

    This is the safest and most reliable way to return binary string data in SWIG. If you have functions that conform to another prototype, you might consider wrapping them with a helper function. For example, if you had this:

    char  *get_data(int *len);
    

    You could wrap it with a function like this:

    void my_get_data(char **result, int *len) {
      *result = get_data(len);
    }
    

    Comments:

    • Support for the cstring.i module depends on the target language. Not all SWIG modules currently support this library.
    • Reliable handling of raw C strings is a delicate topic. There are many ways to accomplish this in SWIG. This library provides support for a few common techniques.
    • If used in C++, this library uses new and delete [] for memory allocation. If using C, the library uses malloc() and free().
    • Rather than manipulating char * directly, you might consider using a special string structure or class instead.

    11.4 STL/C++ library

    The library modules in this section provide access to parts of the standard C++ library including the STL. SWIG support for the STL is an ongoing effort. Support is quite comprehensive for some language modules but some of the lesser used modules do not have quite as much library code written.

    The following table shows which C++ classes are supported and the equivalent SWIG interface library file for the C++ library.

    C++ classC++ Library file SWIG Interface library file
    std::array (C++11)arraystd_array.i
    std::auto_ptrmemorystd_auto_ptr.i
    std::complexcomplexstd_complex.i
    std::dequedequestd_deque.i
    std::listliststd_list.i
    std::mapmapstd_map.i
    std::multimap (C++11)multimapstd_multimap.i
    std::multiset (C++11)multisetstd_multiset.i
    std::pairutilitystd_pair.i
    std::setsetstd_set.i
    std::stringstringstd_string.i
    std::unordered_map (C++11)unordered_map std_unordered_map.i
    std::unordered_multimap (C++11)unordered_multimap std_unordered_multimap.i
    std::unordered_multiset (C++11)unordered_multiset std_unordered_multiset.i
    std::unordered_set (C++11)unordered_set std_unordered_set.i
    std::vectorvectorstd_vector.i
    std::wstringwstringstd_wstring.i
    std::shared_ptr (C++11)shared_ptr std_shared_ptr.i

    The list is by no means complete; some language modules support a subset of the above and some support additional STL classes. Please look for the library files in the appropriate language library directory.

    11.4.1 std::string

    The std_string.i library provides typemaps for converting C++ std::string objects to and from strings in the target scripting language. For example:

    %module example
    %include "std_string.i"
    
    std::string foo();
    void        bar(const std::string &x);
    

    In the target language:

    x = foo();                # Returns a string object
    bar("Hello World");       # Pass string as std::string
    

    A common problem that people encounter is that of classes/structures containing a std::string. This can be overcome by defining a typemap. For example:

    %module example
    %include "std_string.i"
    
    %apply const std::string& {std::string* foo};
    
    struct my_struct
    {
      std::string foo;
    };
    

    In the target language:

    x = my_struct();
    x.foo = "Hello World";    # assign with string
    print x.foo;              # print as string
    

    This module only supports types std::string and const std::string &. Pointers and non-const references are left unmodified and returned as SWIG pointers.

    This library file is fully aware of C++ namespaces. If you export std::string or rename it with a typedef, make sure you include those declarations in your interface. For example:

    %module example
    %include "std_string.i"
    
    using namespace std;
    typedef std::string String;
    ...
    void foo(string s, const String &t);     // std_string typemaps still applied
    

    11.4.2 std::vector

    The std_vector.i library provides support for the C++ std::vector class in the STL. Using this library involves the use of the %template directive. All you need to do is to instantiate different versions of vector for the types that you want to use. For example:

    %module example
    %include "std_vector.i"
    
    namespace std {
      %template(vectori) vector<int>;
      %template(vectord) vector<double>;
    };
    

    When a template vector<X> is instantiated a number of things happen:

    • A class that exposes the C++ API is created in the target language . This can be used to create objects, invoke methods, etc. This class is currently a subset of the real STL vector class.
    • Input typemaps are defined for vector<X>, const vector<X> &, and const vector<X> *. For each of these, a pointer vector<X> * may be passed or a native list object in the target language.
    • An output typemap is defined for vector<X>. In this case, the values in the vector are expanded into a list object in the target language.
    • For all other variations of the type, the wrappers expect to receive a vector<X> * object in the usual manner.
    • An exception handler for std::out_of_range is defined.
    • Optionally, special methods for indexing, item retrieval, slicing, and element assignment may be defined. This depends on the target language.

    To illustrate the use of this library, consider the following functions:

    /* File : example.h */
    
    #include <vector>
    #include <algorithm>
    #include <functional>
    #include <numeric>
    
    double average(std::vector<int> v) {
      return std::accumulate(v.begin(), v.end(), 0.0)/v.size();
    }
    
    std::vector<double> half(const std::vector<double>& v) {
      std::vector<double> w(v);
      for (unsigned int i=0; i<w.size(); i++)
        w[i] /= 2.0;
      return w;
    }
    
    void halve_in_place(std::vector<double>& v) {
      for (std::vector<double>::iterator it = v.begin(); it != v.end(); ++it)
        *it /= 2.0;
    }
    

    To wrap with SWIG, you might write the following:

    %module example
    %{
    #include "example.h"
    %}
    
    %include "std_vector.i"
    // Instantiate templates used by example
    namespace std {
      %template(IntVector) vector<int>;
      %template(DoubleVector) vector<double>;
    }
    
    // Include the header file with above prototypes
    %include "example.h"
    

    Now, to illustrate the behavior in the scripting interpreter, consider this Python example:

    >>> from example import *
    >>> iv = IntVector(4)         # Create an vector<int>
    >>> for i in range(0, 4):
    ...      iv[i] = i
    >>> average(iv)               # Call method
    1.5
    >>> average([0, 1, 2, 3])        # Call with list
    1.5
    >>> half([1, 2, 3])             # Half a list
    (0.5, 1.0, 1.5)
    >>> halve_in_place([1, 2, 3])   # Oops
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_std__vectorTdouble_t
    >>> dv = DoubleVector(4)
    >>> for i in range(0, 4):
    ...       dv[i] = i
    >>> halve_in_place(dv)       # Ok
    >>> for i in dv:
    ...       print i
    ...
    0.0
    0.5
    1.0
    1.5
    >>> dv[20] = 4.5
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "example.py", line 81, in __setitem__
        def __setitem__(*args): return apply(examplec.DoubleVector___setitem__, args)
    IndexError: vector index out of range
    >>>
    

    This library module is fully aware of C++ namespaces. If you use vectors with other names, make sure you include the appropriate using or typedef directives. For example:

    %include "std_vector.i"
    
    namespace std {
      %template(IntVector) vector<int>;
    }
    
    using namespace std;
    typedef std::vector Vector;
    
    void foo(vector<int> *x, const Vector &x);
    

    Note: This module makes use of several advanced SWIG features including templatized typemaps and template partial specialization. If you are trying to wrap other C++ code with templates, you might look at the code contained in std_vector.i. Alternatively, you can show them the code if you want to make their head explode.

    Note: This module is defined for all SWIG target languages. However argument conversion details and the public API exposed to the interpreter vary.

    11.4.3 STL exceptions

    Many of the STL wrapper functions add parameter checking and will throw a language dependent error/exception should the values not be valid. The classic example is array bounds checking. The library wrappers are written to throw a C++ exception in the case of error. The C++ exception in turn gets converted into an appropriate error/exception for the target language. By and large this handling should not need customising, however, customisation can easily be achieved by supplying appropriate "throws" typemaps. For example:

    %module example
    %include "std_vector.i"
    %typemap(throws) std::out_of_range {
      // custom exception handler
    }
    %template(VectInt) std::vector<int>;
    

    The custom exception handler might, for example, log the exception then convert it into a specific error/exception for the target language.

    When using the STL it is advisable to add in an exception handler to catch all STL exceptions. The %exception directive can be used by placing the following code before any other methods or libraries to be wrapped:

    %include "exception.i"
    
    %exception {
      try {
        $action
      } catch (const std::exception& e) {
        SWIG_exception(SWIG_RuntimeError, e.what());
      }
    }
    

    Any thrown STL exceptions will then be gracefully handled instead of causing a crash.

    11.4.4 shared_ptr smart pointer

    11.4.4.1 shared_ptr basics

    Some target languages have support for handling the shared_ptr reference counted smart pointer. This smart pointer is available in the standard C++11 library as std::shared_ptr. It was also in TR1 as std::tr1::shared_ptr before it was fully standardized. Support for the widely used boost::shared_ptr is also available.

    In order to use std::shared_ptr, the std_shared_ptr.i library file should be included:

    %include <std_shared_ptr.i>
    

    The pre-standard std::tr1::shared_ptr can be used by including the following macro before including the std_shared_ptr.i library file:

    #define SWIG_SHARED_PTR_SUBNAMESPACE tr1
    %include <std_shared_ptr.i>
    

    In order to use boost::shared_ptr, the boost_shared_ptr.i library file should be included:

    %include <boost_shared_ptr.i>
    

    You can only use one of these variants of shared_ptr in your interface file at a time. and all three variants must be used in conjunction with the %shared_ptr(T) macro, where T is the underlying pointer type equating to usage shared_ptr<T>. The type T must be non-primitive. A simple example demonstrates usage:

    %module example
    %include <boost_shared_ptr.i>
    %shared_ptr(IntValue)
    
    %inline %{
    #include <boost/shared_ptr.hpp>
    
    struct IntValue {
      int value;
      IntValue(int v) : value(v) {}
    };
    
    static int extractValue(const IntValue &t) {
      return t.value;
    }
    
    static int extractValueSmart(boost::shared_ptr<IntValue> t) {
      return t->value;
    }
    %}
    

    Note that the %shared_ptr(IntValue) declaration occurs after the inclusion of the boost_shared_ptr.i library which provides the macro and, very importantly, before any usage or declaration of the type, IntValue. The %shared_ptr macro provides, a few things for handling this smart pointer, but mostly a number of typemaps. These typemaps override the default typemaps so that the underlying proxy class is stored and passed around as a pointer to a shared_ptr instead of a plain pointer to the underlying type. This approach means that any instantiation of the type can be passed to methods taking the type by value, reference, pointer or as a smart pointer. The interested reader might want to look at the generated code, however, usage is simple and no different handling is required from the target language. For example, a simple use case of the above code from Java would be:

    IntValue iv = new IntValue(1234);
    int val1 = example.extractValue(iv);
    int val2 = example.extractValueSmart(iv);
    System.out.println(val1 + " " + val2);
    

    11.4.4.2 shared_ptr and inheritance

    The shared_ptr library works quite differently to SWIG's normal, but somewhat limited, smart pointer handling. The shared_ptr library does not generate extra wrappers, just for smart pointer handling, in addition to the proxy class. The normal proxy class including inheritance relationships is generated as usual. The only real change introduced by the %shared_ptr macro is that the proxy class stores a pointer to the shared_ptr instance instead of a raw pointer to the instance. A proxy class derived from a base which is being wrapped with shared_ptr can and must be wrapped as a shared_ptr too. In other words all classes in an inheritance hierarchy must all be used with the %shared_ptr macro. For example the following code can be used with the base class shown earlier:

    %shared_ptr(DerivedIntValue)
    %inline %{
    struct DerivedIntValue : IntValue {
      DerivedIntValue(int value) : IntValue(value) {}
      ...
    };
    %}
    

    A shared_ptr of the derived class can now be passed to a method where the base is expected in the target language, just as it can in C++:

    DerivedIntValue div = new DerivedIntValue(5678);
    int val3 = example.extractValue(div);
    int val4 = example.extractValueSmart(div);
    

    If the %shared_ptr macro is omitted for any class in the inheritance hierarchy, SWIG will warn about this and the generated code may or may not result in a C++ compilation error. For example, the following input:

    %include "boost_shared_ptr.i"
    %shared_ptr(Parent);
    
    %inline %{
      #include <boost/shared_ptr.hpp>
      struct GrandParent {
        virtual ~GrandParent() {}
      };
    
      struct Parent : GrandParent {
        virtual ~Parent() {}
      };
    
      struct Child : Parent {
        virtual ~Child() {}
      };
    %}
    

    warns about the missing smart pointer information:

    example.i:12: Warning 520: Base class 'GrandParent' of 'Parent' is not similarly marked as a smart pointer.
    example.i:16: Warning 520: Derived class 'Child' of 'Parent' is not similarly marked as a smart pointer.
    

    Adding the missing %shared_ptr macros will fix this:

    %include <boost_shared_ptr.i>
    %shared_ptr(GrandParent);
    %shared_ptr(Parent);
    %shared_ptr(Child);
    
    ... as before ...
    

    11.4.4.3 shared_ptr and method overloading

    A C++ compiler can disambiguate a method overloaded by a shared_ptr and one using the raw underlying type. For example, either one of these methods can be called in C++:

    int age(std::shared_ptr<GrandParent> num);
    int age(GrandParent& num);
    

    When wrapped by SWIG, disambiguation is not possible using the overloaded names as there is just one equivalent type (GrandParent ) in the target language. SWIG will choose to wrap just the first method by default. Ambiguity in overloading discusses ways to control which method(s) gets wrapped using %ignore or %rename. For the interested reader, SWIG detects that they are equivalent types via the typecheck typemaps in the shared_ptr library.

    11.4.4.4 shared_ptr and templates

    The %shared_ptr macro should be used for all the required instantiations of the template before each of the %template instantiations. For example, consider number.h containing the following illustrative template:

    #include <memory>
    
    template<int N> struct Number {
      int num;
      Number() : num(N) {}
      static std::shared_ptr<Number<N>> make() { return std::make_shared<Number<N>>(); }
    };
    

    The SWIG code below shows the required ordering:

    %include <std_shared_ptr.i>
    
    %shared_ptr(Number<10>);
    %shared_ptr(Number<42>);
    
    %{
      #include "number.h"
    %}
    %include "number.h"
    
    %template(Number10) Number<10>;
    %template(Number42) Number<42>;
    

    11.4.4.5 shared_ptr and directors

    The languages that support shared_ptr also have support for using shared_ptr with directors.

    11.4.5 auto_ptr smart pointer

    While std::auto_ptr is deprecated in C++11, some existing code may still be using it, so SWIG provides limited support for this class: std_auto_ptr.i defines the typemaps which apply to the functions returning objects of this type. Any other use of std_auto_ptr.i is not directly supported.

    A typical example of use would be

    %include <std_auto_ptr.i>
    
    %auto_ptr(Klass)
    %inline %{
    class Klass {
    public:
      // Factory function creating objects of this class:
      static std::auto_ptr<Klass> Create(int value) {
        return std::auto_ptr<Klass>(new Klass(value));
      }
    
      int getValue() const { return m_value; }
    
    private:
      DerivedIntValue(int value) : m_value(value) {}
      int m_value;
    };
    %}
    

    The returned objects can be used naturally from the target language, e.g. from C#:

    Klass k = Klass.Create(17);
    int value = k.getValue();
    

    11.5 Utility Libraries

    11.5.1 exception.i

    The exception.i library provides a language-independent function for raising a run-time exception in the target language. This library is largely used by the SWIG library writers. If possible, use the error handling scheme available to your target language as there is greater flexibility in what errors/exceptions can be thrown.

    SWIG_exception(int code, const char *message)

    Raises an exception in the target language. code is one of the following symbolic constants:

    SWIG_MemoryError
    SWIG_IOError
    SWIG_RuntimeError
    SWIG_IndexError
    SWIG_TypeError
    SWIG_DivisionByZero
    SWIG_OverflowError
    SWIG_SyntaxError
    SWIG_ValueError
    SWIG_SystemError
    

    message is a string indicating more information about the problem.

    The primary use of this module is in writing language-independent exception handlers. For example:

    %include "exception.i"
    %exception std::vector::getitem {
      try {
        $action
      } catch (std::out_of_range& e) {
        SWIG_exception(SWIG_IndexError, const_cast<char*>(e.what()));
      }
    }
    

    12 Argument Handling

    In Chapter 5, SWIG's treatment of basic datatypes and pointers was described. In particular, primitive types such as int and double are mapped to corresponding types in the target language. For everything else, pointers are used to refer to structures, classes, arrays, and other user-defined datatypes. However, in certain applications it is desirable to change SWIG's handling of a specific datatype. For example, you might want to return multiple values through the arguments of a function. This chapter describes some of the techniques for doing this.

    12.1 The typemaps.i library

    This section describes the typemaps.i library file--commonly used to change certain properties of argument conversion.

    12.1.1 Introduction

    Suppose you had a C function like this:

    void add(double a, double b, double *result) {
      *result = a + b;
    }
    

    From reading the source code, it is clear that the function is storing a value in the double *result parameter. However, since SWIG does not examine function bodies, it has no way to know that this is the underlying behavior.

    One way to deal with this is to use the typemaps.i library file and write interface code like this:

    // Simple example using typemaps
    %module example
    %include "typemaps.i"
    
    %apply double *OUTPUT { double *result };
    %inline %{
    extern void add(double a, double b, double *result);
    %}
    

    The %apply directive tells SWIG that you are going to apply a special type handling rule to a type. The "double *OUTPUT" specification is the name of a rule that defines how to return an output value from an argument of type double *. This rule gets applied to all of the datatypes listed in curly braces-- in this case " double *result".

    When the resulting module is created, you can now use the function like this (shown for Python):

    >>> a = add(3, 4)
    >>> print a
    7
    >>>
    

    In this case, you can see how the output value normally returned in the third argument has magically been transformed into a function return value. Clearly this makes the function much easier to use since it is no longer necessary to manufacture a special double * object and pass it to the function somehow.

    Once a typemap has been applied to a type, it stays in effect for all future occurrences of the type and name. For example, you could write the following:

    %module example
    %include "typemaps.i"
    
    %apply double *OUTPUT { double *result };
    
    %inline %{
    extern void add(double a, double b, double *result);
    extern void sub(double a, double b, double *result);
    extern void mul(double a, double b, double *result);
    extern void div(double a, double b, double *result);
    %}
    ...
    

    In this case, the double *OUTPUT rule is applied to all of the functions that follow.

    Typemap transformations can even be extended to multiple return values. For example, consider this code:

    %include "typemaps.i"
    %apply int *OUTPUT { int *width, int *height };
    
    // Returns a pair (width, height)
    void getwinsize(int winid, int *width, int *height);
    

    In this case, the function returns multiple values, allowing it to be used like this:

    >>> w, h = genwinsize(wid)
    >>> print w
    400
    >>> print h
    300
    >>>
    

    It should also be noted that although the %apply directive is used to associate typemap rules to datatypes, you can also use the rule names directly in arguments. For example, you could write this:

    // Simple example using typemaps
    %module example
    %include "typemaps.i"
    
    %{
    extern void add(double a, double b, double *OUTPUT);
    %}
    extern void add(double a, double b, double *OUTPUT);
    

    Typemaps stay in effect until they are explicitly deleted or redefined to something else. To clear a typemap, the %clear directive should be used. For example:

    %clear double *result;      // Remove all typemaps for double *result
    

    12.1.2 Input parameters

    The following typemaps instruct SWIG that a pointer really only holds a single input value:

    int *INPUT
    short *INPUT
    long *INPUT
    unsigned int *INPUT
    unsigned short *INPUT
    unsigned long *INPUT
    double *INPUT
    float *INPUT
    

    When used, it allows values to be passed instead of pointers. For example, consider this function:

    double add(double *a, double *b) {
      return *a+*b;
    }
    

    Now, consider this SWIG interface:

    %module example
    %include "typemaps.i"
    ...
    %{
    extern double add(double *, double *);
    %}
    extern double add(double *INPUT, double *INPUT);
    
    

    When the function is used in the scripting language interpreter, it will work like this:

    result = add(3, 4)
    

    12.1.3 Output parameters

    The following typemap rules tell SWIG that pointer is the output value of a function. When used, you do not need to supply the argument when calling the function. Instead, one or more output values are returned.

    int *OUTPUT
    short *OUTPUT
    long *OUTPUT
    unsigned int *OUTPUT
    unsigned short *OUTPUT
    unsigned long *OUTPUT
    double *OUTPUT
    float *OUTPUT
    
    

    These methods can be used as shown in an earlier example. For example, if you have this C function :

    void add(double a, double b, double *c) {
      *c = a+b;
    }
    

    A SWIG interface file might look like this :

    %module example
    %include "typemaps.i"
    ...
    %inline %{
    extern void add(double a, double b, double *OUTPUT);
    %}
    
    

    In this case, only a single output value is returned, but this is not a restriction. An arbitrary number of output values can be returned by applying the output rules to more than one argument (as shown previously).

    If the function also returns a value, it is returned along with the argument. For example, if you had this:

    extern int foo(double a, double b, double *OUTPUT);
    

    The function will return two values like this:

    iresult, dresult = foo(3.5, 2)
    

    12.1.4 Input/Output parameters

    When a pointer serves as both an input and output value you can use the following typemaps :

    int *INOUT
    short *INOUT
    long *INOUT
    unsigned int *INOUT
    unsigned short *INOUT
    unsigned long *INOUT
    double *INOUT
    float *INOUT
    
    

    A C function that uses this might be something like this:

    void negate(double *x) {
      *x = -(*x);
    }
    
    

    To make x function as both and input and output value, declare the function like this in an interface file :

    %module example
    %include "typemaps.i"
    ...
    %{
    extern void negate(double *);
    %}
    extern void negate(double *INOUT);
    
    

    Now within a script, you can simply call the function normally :

    a = negate(3);         # a = -3 after calling this
    

    One subtle point of the INOUT rule is that many scripting languages enforce mutability constraints on primitive objects (meaning that simple objects like integers and strings aren't supposed to change). Because of this, you can't just modify the object's value in place as the underlying C function does in this example. Therefore, the INOUT rule returns the modified value as a new object rather than directly overwriting the value of the original input object.

    Compatibility note : The INOUT rule used to be known as BOTH in earlier versions of SWIG. Backwards compatibility is preserved, but deprecated.

    12.1.5 Using different names

    As previously shown, the %apply directive can be used to apply the INPUT, OUTPUT, and INOUT typemaps to different argument names. For example:

    // Make double *result an output value
    %apply double *OUTPUT { double *result };
    
    // Make Int32 *in an input value
    %apply int *INPUT { Int32 *in };
    
    // Make long *x inout
    %apply long *INOUT {long *x};
    
    

    To clear a rule, the %clear directive is used:

    %clear double *result;
    %clear Int32 *in, long *x;
    

    Typemap declarations are lexically scoped so a typemap takes effect from the point of definition to the end of the file or a matching %clear declaration.

    12.2 Applying constraints to input values

    In addition to changing the handling of various input values, it is also possible to use typemaps to apply constraints. For example, maybe you want to insure that a value is positive, or that a pointer is non-NULL. This can be accomplished including the constraints.i library file.

    12.2.1 Simple constraint example

    The constraints library is best illustrated by the following interface file :

    // Interface file with constraints
    %module example
    %include "constraints.i"
    
    double exp(double x);
    double log(double POSITIVE);         // Allow only positive values
    double sqrt(double NONNEGATIVE);     // Non-negative values only
    double inv(double NONZERO);          // Non-zero values
    void   free(void *NONNULL);          // Non-NULL pointers only
    
    

    The behavior of this file is exactly as you would expect. If any of the arguments violate the constraint condition, a scripting language exception will be raised. As a result, it is possible to catch bad values, prevent mysterious program crashes and so on.

    12.2.2 Constraint methods

    The following constraints are currently available

    POSITIVE                     Any number > 0 (not zero)
    NEGATIVE                     Any number < 0 (not zero)
    NONNEGATIVE                  Any number >= 0
    NONPOSITIVE                  Any number <= 0
    NONZERO                      Nonzero number
    NONNULL                      Non-NULL pointer (pointers only).
    
    

    12.2.3 Applying constraints to new datatypes

    The constraints library only supports the primitive C datatypes, but it is easy to apply it to new datatypes using %apply. For example :

    // Apply a constraint to a Real variable
    %apply Number POSITIVE { Real in };
    
    // Apply a constraint to a pointer type
    %apply Pointer NONNULL { Vector * };
    
    

    The special types of "Number" and "Pointer" can be applied to any numeric and pointer variable type respectively. To later remove a constraint, the %clear directive can be used :

    %clear Real in;
    %clear Vector *;
    

    13 Typemaps

    13.1 Introduction

    Chances are, you are reading this chapter for one of two reasons; you either want to customize SWIG's behavior or you overheard someone mumbling some incomprehensible drivel about "typemaps" and you asked yourself "typemaps, what are those?" That said, let's start with a short disclaimer that "typemaps" are an advanced customization feature that provide direct access to SWIG's low-level code generator. Not only that, they are an integral part of the SWIG C++ type system (a non-trivial topic of its own). Typemaps are generally not a required part of using SWIG. Therefore, you might want to re-read the earlier chapters if you have found your way to this chapter with only a vague idea of what SWIG already does by default.

    13.1.1 Type conversion

    One of the most important problems in wrapper code generation is the conversion or marshalling of datatypes between programming languages. Specifically, for every C/C++ declaration, SWIG must somehow generate wrapper code that allows values to be passed back and forth between languages. Since every programming language represents data differently, this is not a simple of matter of simply linking code together with the C linker. Instead, SWIG has to know something about how data is represented in each language and how it can be manipulated.

    To illustrate, suppose you had a simple C function like this:

    int factorial(int n);
    

    To access this function from Python, a pair of Python API functions are used to convert integer values. For example:

    long PyInt_AsLong(PyObject *obj);      /* Python --> C */
    PyObject *PyInt_FromLong(long x);      /* C --> Python */
    

    The first function is used to convert the input argument from a Python integer object to C long. The second function is used to convert a value from C back into a Python integer object.

    Inside the wrapper function, you might see these functions used like this:

    PyObject *wrap_factorial(PyObject *self, PyObject *args) {
      int       arg1;
      int       result;
      PyObject *obj1;
      PyObject *resultobj;
    
      if (!PyArg_ParseTuple("O:factorial", &obj1)) return NULL;
      arg1 = PyInt_AsLong(obj1);
      result = factorial(arg1);
      resultobj = PyInt_FromLong(result);
      return resultobj;
    }
    

    Every target language supported by SWIG has functions that work in a similar manner. For example, in Perl, the following functions are used:

    IV SvIV(SV *sv);                     /* Perl --> C */
    void sv_setiv(SV *sv, IV val);       /* C --> Perl */
    

    In Tcl:

    int Tcl_GetLongFromObj(Tcl_Interp *interp, Tcl_Obj *obj, long *value);
    Tcl_Obj *Tcl_NewIntObj(long value);
    

    The precise details are not so important. What is important is that all of the underlying type conversion is handled by collections of utility functions and short bits of C code like this---you simply have to read the extension documentation for your favorite language to know how it works (an exercise left to the reader).

    13.1.2 Typemaps

    Since type handling is so central to wrapper code generation, SWIG allows it to be completely defined (or redefined) by the user. To do this, a special %typemap directive is used. For example:

    /* Convert from Python --> C */
    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    
    /* Convert from C --> Python */
    %typemap(out) int {
      $result = PyInt_FromLong($1);
    }
    

    At first glance, this code will look a little confusing. However, there is really not much to it. The first typemap (the "in" typemap) is used to convert a value from the target language to C. The second typemap (the "out" typemap) is used to convert in the other direction. The content of each typemap is a small fragment of code that is inserted directly into the SWIG generated wrapper functions. The code is usually C or C++ code which will be generated into the C/C++ wrapper functions. Note that this isn't always the case as some target language modules allow target language code within the typemaps which gets generated into target language specific files. Within this code, a number of special variables prefixed with a $ are expanded. These are really just placeholders for C/C++ variables that are generated in the course of creating the wrapper function. In this case, $input refers to an input object that needs to be converted to C/C++ and $result refers to an object that is going to be returned by a wrapper function. $1 refers to a C/C++ variable that has the same type as specified in the typemap declaration (an int in this example).

    A short example might make this a little more clear. If you were wrapping a function like this:

    int gcd(int x, int y);
    

    A wrapper function would look approximately like this:

    PyObject *wrap_gcd(PyObject *self, PyObject *args) {
      int arg1;
      int arg2;
      int result;
      PyObject *obj1;
      PyObject *obj2;
      PyObject *resultobj;
    
      if (!PyArg_ParseTuple("OO:gcd", &obj1, &obj2)) return NULL;
    
      /* "in" typemap, argument 1 */
      {
        arg1 = PyInt_AsLong(obj1);
      }
    
      /* "in" typemap, argument 2 */
      {
        arg2 = PyInt_AsLong(obj2);
      }
    
      result = gcd(arg1, arg2);
    
      /* "out" typemap, return value */
      {
        resultobj = PyInt_FromLong(result);
      }
    
      return resultobj;
    }
    

    In this code, you can see how the typemap code has been inserted into the function. You can also see how the special $ variables have been expanded to match certain variable names inside the wrapper function. This is really the whole idea behind typemaps--they simply let you insert arbitrary code into different parts of the generated wrapper functions. Because arbitrary code can be inserted, it possible to completely change the way in which values are converted.

    13.1.3 Pattern matching

    As the name implies, the purpose of a typemap is to "map" C datatypes to types in the target language. Once a typemap is defined for a C datatype, it is applied to all future occurrences of that type in the input file. For example:

    /* Convert from Perl --> C */
    %typemap(in) int {
      $1 = SvIV($input);
    }
    
    ...
    int factorial(int n);
    int gcd(int x, int y);
    int count(char *s, char *t, int max);
    

    The matching of typemaps to C datatypes is more than a simple textual match. In fact, typemaps are fully built into the underlying type system. Therefore, typemaps are unaffected by typedef, namespaces, and other declarations that might hide the underlying type. For example, you could have code like this:

    /* Convert from Ruby--> C */
    %typemap(in) int {
      $1 = NUM2INT($input);
    }
    ...
    typedef int Integer;
    namespace foo {
      typedef Integer Number;
    };
    
    int foo(int x);
    int bar(Integer y);
    int spam(foo::Number a, foo::Number b);
    

    In this case, the typemap is still applied to the proper arguments even though typenames don't always match the text "int". This ability to track types is a critical part of SWIG--in fact, all of the target language modules work merely define a family of typemaps for the basic types. Yet, it is never necessary to write new typemaps for typenames introduced by typedef.

    In addition to tracking typenames, typemaps may also be specialized to match against a specific argument name. For example, you could write a typemap like this:

    %typemap(in) double nonnegative {
      $1 = PyFloat_AsDouble($input);
      if ($1 < 0) {
        PyErr_SetString(PyExc_ValueError, "argument must be nonnegative.");
        SWIG_fail;
      }
    }
    
    ...
    double sin(double x);
    double cos(double x);
    double sqrt(double nonnegative);
    
    typedef double Real;
    double log(Real nonnegative);
    ...
    

    For certain tasks such as input argument conversion, typemaps can be defined for sequences of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = PyString_AsString($input);   /* char *str */
      $2 = PyString_Size($input);       /* int len   */
    }
    ...
    int count(char *str, int len, char c);
    

    In this case, a single input object is expanded into a pair of C arguments. This example also provides a hint to the unusual variable naming scheme involving $1, $2, and so forth.

    13.1.4 Reusing typemaps

    Typemaps are normally defined for specific type and argument name patterns. However, typemaps can also be copied and reused. One way to do this is to use assignment like this:

    %typemap(in) Integer = int;   
    %typemap(in) (char *buffer, int size) = (char *str, int len);
    

    There is a more powerful way to copy a family of typemaps though. Consider the following family of two typemap methods, "in" and "out" for type int:

    %typemap(in) int {
      /* Convert an integer argument */
      ...
    }
    %typemap(out) int {
      /* Return an integer value */
      ...
    }
    

    Each of the two typemap methods could be copied individually for type size_t as follows:

    /* Apply all of the int typemaps to size_t */
    %typemap(in) size_t = int;   
    %typemap(out) size_t = int;   
    

    A more powerful form of copying is available from the %apply directive. The code below is identical to the above:

    /* Apply all of the int typemaps to size_t */
    %apply int { size_t };    
    

    %apply merely takes all of the typemaps that are defined for one type and applies them to other types. Note: you can include a comma separated set of types in the { ... } part of %apply.

    It should be noted that it is not necessary to copy typemaps for types that are related by typedef. For example, if you have this,

    typedef int size_t;
    

    then SWIG already knows that the int typemaps apply. You don't have to do anything.

    13.1.5 What can be done with typemaps?

    The primary use of typemaps is for defining wrapper generation behavior at the level of individual C/C++ datatypes. There are currently six general categories of problems that typemaps address:

    Argument handling

    int foo(int x, double y, char *s);
    
    • Input argument conversion ("in" typemap).
    • Input argument type checking for types used in overloaded methods ("typecheck" typemap).
    • Output argument handling ("argout" typemap).
    • Input argument value checking ("check" typemap).
    • Input argument initialization ("arginit" typemap).
    • Default arguments ("default" typemap).
    • Input argument resource management ("freearg" typemap).

    Return value handling

    int foo(int x, double y, char *s);
    
    • Function return value conversion ("out" typemap).
    • Return value resource management ("ret" typemap).
    • Resource management for newly allocated objects ("newfree" typemap).

    Exception handling

    int foo(int x, double y, char *s) throw(MemoryError, IndexError);
    
    • Handling of C++ exception specifications. ("throw" typemap).

    Global variables

    int foo;
    
    • Assignment of a global variable. ("varin" typemap).
    • Reading a global variable. ("varout" typemap).

    Member variables

    struct Foo {
      int x[20];
    };
    
    • Assignment of data to a class/structure member. ("memberin" typemap).

    Constant creation

    #define FOO 3
    %constant int BAR = 42;
    enum { ALE, LAGER, STOUT };
    
    • Creation of constant values. ("consttab" or "constcode" typemap).

    Details of each of these typemaps will be covered shortly. Also, certain language modules may define additional typemaps that expand upon this list. For example, the Java module defines a variety of typemaps for controlling additional aspects of the Java bindings. Consult language specific documentation for further details.

    13.1.6 What can't be done with typemaps?

    Typemaps can't be used to define properties that apply to C/C++ declarations as a whole. For example, suppose you had a declaration like this,

    Foo *make_Foo(int n);
    

    and you wanted to tell SWIG that make_Foo(int n) returned a newly allocated object (for the purposes of providing better memory management). Clearly, this property of make_Foo(int n) is not a property that would be associated with the datatype Foo * by itself. Therefore, a completely different SWIG customization mechanism (%feature) is used for this purpose. Consult the Customization Features chapter for more information about that.

    Typemaps also can't be used to rearrange or transform the order of arguments. For example, if you had a function like this:

    void foo(int, char *);
    

    you can't use typemaps to interchange the arguments, allowing you to call the function like this:

    foo("hello", 3)          # Reversed arguments
    

    If you want to change the calling conventions of a function, write a helper function instead. For example:

    %rename(foo) wrap_foo;
    %inline %{
    void wrap_foo(char *s, int x) {
      foo(x, s);
    }
    %}
    

    13.1.7 Similarities to Aspect Oriented Programming

    SWIG has parallels to Aspect Oriented Software Development (AOP). The AOP terminology with respect to SWIG typemaps can be viewed as follows:

    • Cross-cutting concerns: The cross-cutting concerns are the modularization of the functionality that the typemaps implement, which is primarily marshalling of types from/to the target language and C/C++.
    • Advice: The typemap body contains code which is executed whenever the marshalling is required.
    • Pointcut: The pointcuts are the positions in the wrapper code that the typemap code is generated into.
    • Aspect: Aspects are the combination of the pointcut and the advice, hence each typemap is an aspect.

    SWIG can also be viewed as has having a second set of aspects based around %feature. Features such as %exception are also cross-cutting concerns as they encapsulate code that can be used to add logging or exception handling to any function.

    13.1.8 The rest of this chapter

    The rest of this chapter provides detailed information for people who want to write new typemaps. This information is of particular importance to anyone who intends to write a new SWIG target language module. Power users can also use this information to write application specific type conversion rules.

    Since typemaps are strongly tied to the underlying C++ type system, subsequent sections assume that you are reasonably familiar with the basic details of values, pointers, references, arrays, type qualifiers (e.g., const), structures, namespaces, templates, and memory management in C/C++. If not, you would be well-advised to consult a copy of "The C Programming Language" by Kernighan and Ritchie or "The C++ Programming Language" by Stroustrup before going any further.

    13.2 Typemap specifications

    This section describes the behavior of the %typemap directive itself.

    13.2.1 Defining a typemap

    New typemaps are defined using the %typemap declaration. The general form of this declaration is as follows (parts enclosed in [ ... ] are optional):

    %typemap(method [, modifiers]) typelist code ;
    

    method is a simply a name that specifies what kind of typemap is being defined. It is usually a name like "in", "out", or "argout". The purpose of these methods is described later.

    modifiers is an optional comma separated list of name="value" values. These are sometimes to attach extra information to a typemap and is often target-language dependent. They are also known as typemap attributes.

    typelist is a list of the C++ type patterns that the typemap will match. The general form of this list is as follows:

    typelist    :  typepattern [, typepattern, typepattern, ... ] ;
    
    typepattern :  type [ (parms) ]
                |  type name [ (parms) ]
                |  ( typelist ) [ (parms) ]
    
    

    Each type pattern is either a simple type, a simple type and argument name, or a list of types in the case of multi-argument typemaps. In addition, each type pattern can be parameterized with a list of temporary variables (parms). The purpose of these variables will be explained shortly.

    code specifies the code used in the typemap. Usually this is C/C++ code, but in the statically typed target languages, such as Java and C#, this can contain target language code for certain typemaps. It can take any one of the following forms:

    code       : { ... }
               | " ... "
               | %{ ... %}
    

    Note that the preprocessor will expand code within the {} delimiters, but not in the last two styles of delimiters, see Preprocessor and Typemaps. Here are some examples of valid typemap specifications:

    /* Simple typemap declarations */
    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    %typemap(in) int "$1 = PyInt_AsLong($input);";
    %typemap(in) int %{ 
      $1 = PyInt_AsLong($input);
    %}
    
    /* Typemap with extra argument name */
    %typemap(in) int nonnegative {
      ...
    }
    
    /* Multiple types in one typemap */
    %typemap(in) int, short, long { 
      $1 = SvIV($input);
    }
    
    /* Typemap with modifiers */
    %typemap(in, doc="integer") int "$1 = scm_to_int($input);";
    
    /* Typemap applied to patterns of multiple arguments */
    %typemap(in) (char *str, int len),
                 (char *buffer, int size)
    {
      $1 = PyString_AsString($input);
      $2 = PyString_Size($input);
    }
    
    /* Typemap with extra pattern parameters */
    %typemap(in, numinputs=0) int *output (int temp),
                              long *output (long temp)
    {
      $1 = &temp;
    }
    

    Admittedly, it's not the most readable syntax at first glance. However, the purpose of the individual pieces will become clear.

    13.2.2 Typemap scope

    Once defined, a typemap remains in effect for all of the declarations that follow. A typemap may be redefined for different sections of an input file. For example:

    // typemap1
    %typemap(in) int {
    ...
    }
    
    int fact(int);                    // typemap1
    int gcd(int x, int y);            // typemap1
    
    // typemap2
    %typemap(in) int {
    ...
    }
    
    int isprime(int);                 // typemap2
    

    One exception to the typemap scoping rules pertains to the %extend declaration. %extend is used to attach new declarations to a class or structure definition. Because of this, all of the declarations in an %extend block are subject to the typemap rules that are in effect at the point where the class itself is defined. For example:

    class Foo {
      ...
    };
    
    %typemap(in) int {
     ...
    }
    
    %extend Foo {
      int blah(int x);    // typemap has no effect.  Declaration is attached to Foo which
                          // appears before the %typemap declaration.
    };
    

    13.2.3 Copying a typemap

    A typemap is copied by using assignment. For example:

    %typemap(in) Integer = int;
    

    or this:

    %typemap(in) Integer, Number, int32_t = int;
    

    Types are often managed by a collection of different typemaps. For example:

    %typemap(in)     int { ... }
    %typemap(out)    int { ... }
    %typemap(varin)  int { ... }
    %typemap(varout) int { ... }
    

    To copy all of these typemaps to a new type, use %apply. For example:

    %apply int { Integer };            // Copy all int typemaps to Integer
    %apply int { Integer, Number };    // Copy all int typemaps to both Integer and Number
    

    The patterns for %apply follow the same rules as for %typemap. For example:

    %apply int *output { Integer *output };                    // Typemap with name
    %apply (char *buf, int len) { (char *buffer, int size) };  // Multiple arguments
    

    13.2.4 Deleting a typemap

    A particular typemap can be deleted / cleared by simply defining no code. For example:

    %typemap(in) int;                 // Clears the "in" typemap for int
    %typemap(in) int, long, short;    // Clears the "in" typemap for int, long, short
    %typemap(in) int *output;       
    

    The above syntax deletes a typemap for just one typemap method - the "in" method in each of the examples above. The %clear directive is more powerful and will delete / clear a family of typemaps, that is, all the typemap methods for a given type. For example:

    %clear int;                       // Delete all typemaps ("in", "out", "varin", ...) for int
    %clear int *output, long *output;
    

    Note: Since SWIG's default behavior is defined by typemaps, clearing a fundamental type like int will make that type unusable unless you also define a new family of typemaps immediately after the clear operation.

    13.2.5 Placement of typemaps

    Typemap declarations can be declared in the global scope, within a C++ namespace, and within a C++ class. For example:

    %typemap(in) int {
      ...
    }
    
    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    
    class Bar {
    public:
      typedef const int & const_reference;
      %typemap(out) const_reference {
        ...
      }
    };
    

    When a typemap appears inside a namespace or class, it stays in effect until the end of the SWIG input (just like before). However, the typemap takes the local scope into account. Therefore, this code

    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    

    is really defining a typemap for the type std::string. You could have code like this:

    namespace std {
      class string;
      %typemap(in) string {          /* std::string */
        ...
      }
    }
    
    namespace Foo {
      class string;
      %typemap(in) string {          /* Foo::string */
        ...
      }
    }
    

    In this case, there are two completely distinct typemaps that apply to two completely different types (std::string and Foo::string).

    It should be noted that for scoping to work, SWIG has to know that string is a typename defined within a particular namespace. In this example, this is done using the forward class declaration class string.

    13.3 Pattern matching rules

    The section describes the pattern matching rules by which C/C++ datatypes are associated with typemaps. The matching rules can be observed in practice by using the debugging options also described.

    13.3.1 Basic matching rules

    Typemaps are matched using both a type and a name (typically the name of a argument). For a given TYPE NAME pair, the following rules are applied, in order, to find a match. The first typemap found is used.

    • Typemaps that exactly match TYPE and NAME.
    • Typemaps that exactly match TYPE only.
    • If TYPE is a C++ template of type T< TPARMS >, where TPARMS are the template parameters, the type is stripped of the template parameters and the following checks are then made:
      • Typemaps that exactly match T and NAME.
      • Typemaps that exactly match T only.

    If TYPE includes qualifiers (const, volatile, etc.), each qualifier is stripped one at a time to form a new stripped type and the matching rules above are repeated on the stripped type. The left-most qualifier is stripped first, resulting in the right-most (or top-level) qualifier being stripped last. For example int const*const is first stripped to int *const then int *.

    If TYPE is an array. The following transformation is made:

    • Replace all dimensions to [ANY] and look for a generic array typemap.

    To illustrate, suppose that you had a function like this:

    int foo(const char *s);
    

    To find a typemap for the argument const char *s, SWIG will search for the following typemaps:

    const char *s           Exact type and name match
    const char *            Exact type match
    char *s                 Type and name match (qualifier stripped)
    char *                  Type match (qualifier stripped)
    

    When more than one typemap rule might be defined, only the first match found is actually used. Here is an example that shows how some of the basic rules are applied:

    %typemap(in) int *x {
      ... typemap 1
    }
    
    %typemap(in) int * {
      ... typemap 2
    }
    
    %typemap(in) const int *z {
      ... typemap 3
    }
    
    %typemap(in) int [4] {
      ... typemap 4
    }
    
    %typemap(in) int [ANY] {
      ... typemap 5
    }
    
    void A(int *x);        // int *x rule       (typemap 1)
    void B(int *y);        // int * rule        (typemap 2)
    void C(const int *x);  // int *x rule       (typemap 1)
    void D(const int *z);  // const int *z rule (typemap 3)
    void E(int x[4]);      // int [4] rule      (typemap 4)
    void F(int x[1000]);   // int [ANY] rule    (typemap 5)
    

    Compatibility note: SWIG-2.0.0 introduced stripping the qualifiers one step at a time. Prior versions stripped all qualifiers in one step.

    13.3.2 Typedef reductions matching

    If no match is found using the rules in the previous section, SWIG applies a typedef reduction to the type and repeats the typemap search for the reduced type. To illustrate, suppose you had code like this:

    %typemap(in) int {
      ... typemap 1
    }
    
    typedef int Integer;
    void blah(Integer x);
    

    To find the typemap for Integer x, SWIG will first search for the following typemaps:

    Integer x
    Integer
    

    Finding no match, it then applies a reduction Integer -> int to the type and repeats the search.

    int x
    int      --> match: typemap 1
    

    Even though two types might be the same via typedef, SWIG allows typemaps to be defined for each typename independently. This allows for interesting customization possibilities based solely on the typename itself. For example, you could write code like this:

    typedef double  pdouble;     // Positive double
    
    // typemap 1
    %typemap(in) double {
      ... get a double ...
    }
    // typemap 2
    %typemap(in) pdouble {
      ... get a positive double ...
    }
    double sin(double x);           // typemap 1
    pdouble sqrt(pdouble x);        // typemap 2
    

    When reducing the type, only one typedef reduction is applied at a time. The search process continues to apply reductions until a match is found or until no more reductions can be made.

    For complicated types, the reduction process can generate a long list of patterns. Consider the following:

    typedef int Integer;
    typedef Integer Row4[4];
    void foo(Row4 rows[10]);
    

    To find a match for the Row4 rows[10] argument, SWIG would check the following patterns, stopping only when it found a match:

    Row4 rows[10]
    Row4 [10]
    Row4 rows[ANY]
    Row4 [ANY]
    
    # Reduce Row4 --> Integer[4]
    Integer rows[10][4]
    Integer [10][4]
    Integer rows[ANY][ANY]
    Integer [ANY][ANY]
    
    # Reduce Integer --> int
    int rows[10][4]
    int [10][4]
    int rows[ANY][ANY]
    int [ANY][ANY]
    

    For parameterized types like templates, the situation is even more complicated. Suppose you had some declarations like this:

    typedef int Integer;
    typedef foo<Integer, Integer> fooii;
    void blah(fooii *x);
    

    In this case, the following typemap patterns are searched for the argument fooii *x:

    fooii *x
    fooii *
    
    # Reduce fooii --> foo<Integer, Integer>
    foo<Integer, Integer> *x
    foo<Integer, Integer> *
    
    # Reduce Integer -> int
    foo<int, Integer> *x
    foo<int, Integer> *
    
    # Reduce Integer -> int
    foo<int, int> *x
    foo<int, int> *
    

    Typemap reductions are always applied to the left-most type that appears. Only when no reductions can be made to the left-most type are reductions made to other parts of the type. This behavior means that you could define a typemap for foo<int, Integer>, but a typemap for foo<Integer, int> would never be matched. Admittedly, this is rather esoteric--there's little practical reason to write a typemap quite like that. Of course, you could rely on this to confuse your coworkers even more.

    As a point of clarification, it is worth emphasizing that typedef matching is a typedef reduction process only, that is, SWIG does not search for every single possible typedef. Given a type in a declaration, it will only reduce the type, it won't build it up looking for typedefs. For example, given the type Struct, the typemap below will not be used for the aStruct parameter, because Struct is fully reduced:

    struct Struct {...};
    typedef Struct StructTypedef;
    
    %typemap(in) StructTypedef { 
      ...
    }
    
    void go(Struct aStruct);
    

    13.3.3 Default typemap matching rules

    If the basic pattern matching rules result in no match being made, even after typedef reductions, the default typemap matching rules are used to look for a suitable typemap match. These rules match a generic typemap based on the reserved SWIGTYPE base type. For example pointers will use SWIGTYPE * and references will use SWIGTYPE &. More precisely, the rules are based on the C++ class template partial specialization matching rules used by C++ compilers when looking for an appropriate partial template specialization. This means that a match is chosen from the most specialized set of generic typemap types available. For example, when looking for a match to int const *, the rules will prefer to match SWIGTYPE const * if available before matching SWIGTYPE *, before matching SWIGTYPE.

    Most SWIG language modules use typemaps to define the default behavior of the C primitive types. This is entirely straightforward. For example, a set of typemaps for primitives marshalled by value or const reference are written like this:

    %typemap(in) int           "... convert to int ...";
    %typemap(in) short         "... convert to short ...";
    %typemap(in) float         "... convert to float ...";
    ...
    %typemap(in) const int &   "... convert ...";
    %typemap(in) const short & "... convert ...";
    %typemap(in) const float & "... convert ...";
    ...
    

    Since typemap matching follows all typedef declarations, any sort of type that is mapped to a primitive type by value or const reference through typedef will be picked up by one of these primitive typemaps. Most language modules also define typemaps for char pointers and char arrays to handle strings, so these non-default types will also be used in preference as the basic typemap matching rules provide a better match than the default typemap matching rules.

    Below is a list of the typical default types supplied by language modules, showing what the "in" typemap would look like:

    %typemap(in) SWIGTYPE &            { ... default reference handling ...                       };
    %typemap(in) SWIGTYPE *            { ... default pointer handling ...                         };
    %typemap(in) SWIGTYPE *const       { ... default pointer const handling ...                   };
    %typemap(in) SWIGTYPE *const&      { ... default pointer const reference handling ...         };
    %typemap(in) SWIGTYPE[ANY]         { ... 1D fixed size arrays handling ...                    };
    %typemap(in) SWIGTYPE []           { ... unknown sized array handling ...                     };
    %typemap(in) enum SWIGTYPE         { ... default handling for enum values ...                 };
    %typemap(in) const enum SWIGTYPE & { ... default handling for const enum reference values ... };
    %typemap(in) SWIGTYPE (CLASS::*)   { ... default pointer member handling ...                  };
    %typemap(in) SWIGTYPE              { ... simple default handling ...                          };
    

    If you wanted to change SWIG's default handling for simple pointers, you would simply redefine the rule for SWIGTYPE *. Note, the simple default typemap rule is used to match against simple types that don't match any other rules:

    %typemap(in) SWIGTYPE              { ... simple default handling ...                          } 
    

    This typemap is important because it is the rule that gets triggered when call or return by value is used. For instance, if you have a declaration like this:

    double dot_product(Vector a, Vector b);
    

    The Vector type will usually just get matched against SWIGTYPE. The default implementation of SWIGTYPE is to convert the value into pointers (as described in this earlier section).

    By redefining SWIGTYPE it may be possible to implement other behavior. For example, if you cleared all typemaps for SWIGTYPE, SWIG simply won't wrap any unknown datatype (which might be useful for debugging). Alternatively, you might modify SWIGTYPE to marshal objects into strings instead of converting them to pointers.

    Let's consider an example where the following typemaps are defined and SWIG is looking for the best match for the enum shown below:

    %typemap(in) const Hello &          { ... }
    %typemap(in) const enum SWIGTYPE &  { ... }
    %typemap(in) enum SWIGTYPE &        { ... }
    %typemap(in) SWIGTYPE &             { ... }
    %typemap(in) SWIGTYPE               { ... }
    
    enum Hello {};
    const Hello &hi;
    

    The typemap at the top of the list will be chosen, not because it is defined first, but because it is the closest match for the type being wrapped. If any of the typemaps in the above list were not defined, then the next one on the list would have precedence.

    The best way to explore the default typemaps is to look at the ones already defined for a particular language module. Typemap definitions are usually found in the SWIG library in a file such as java.swg , csharp.swg etc. However, for many of the target languages the typemaps are hidden behind complicated macros, so the best way to view the default typemaps, or any typemaps for that matter, is to look at the preprocessed output by running swig -E on any interface file. Finally the best way to view the typemap matching rules in action is via the debugging typemap pattern matching options covered later on.

    Compatibility note: The default typemap matching rules were modified in SWIG-2.0.0 from a slightly simpler scheme to match the current C++ class template partial specialization matching rules.

    13.3.4 Multi-arguments typemaps

    When multi-argument typemaps are specified, they take precedence over any typemaps specified for a single type. For example:

    %typemap(in) (char *buffer, int len) {
      // typemap 1
    }
    
    %typemap(in) char *buffer {
      // typemap 2
    }
    
    void foo(char *buffer, int len, int count); // (char *buffer, int len)
    void bar(char *buffer, int blah);           // char *buffer
    

    Multi-argument typemaps are also more restrictive in the way that they are matched. Currently, the first argument follows the matching rules described in the previous section, but all subsequent arguments must match exactly.

    13.3.5 Matching rules compared to C++ templates

    For those intimately familiar with C++ templates, a comparison of the typemap matching rules and template type deduction is interesting. The two areas considered are firstly the default typemaps and their similarities to partial template specialization and secondly, non-default typemaps and their similarities to full template specialization.

    For default (SWIGTYPE) typemaps the rules are inspired by C++ class template partial specialization. For example, given partial specialization for T const& :

    template <typename T> struct X             { void a(); };
    template <typename T> struct X< T const& > { void b(); };
    

    The full (unspecialized) template is matched with most types, such as:

    X< int & >            x1;  x1.a();
    

    and the following all match the T const& partial specialization:

    X< int *const& >      x2;  x2.b();
    X< int const*const& > x3;  x3.b();
    X< int const& >       x4;  x4.b();
    

    Now, given just these two default typemaps, where T is analogous to SWIGTYPE:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) SWIGTYPE const& { ... }
    

    The generic default typemap SWIGTYPE is used with most types, such as

    int &
    

    and the following all match the SWIGTYPE const& typemap, just like the partial template matching:

    int *const&
    int const*const&
    int const&
    

    Note that the template and typemap matching rules are not identical for all default typemaps though, for example, with arrays.

    For non-default typemaps, one might expect SWIG to follow the fully specialized template rules. This is nearly the case, but not quite. Consider a very similar example to the earlier partially specialized template but this time there is a fully specialized template:

    template <typename T> struct Y       { void a(); };
    template <> struct Y< int const & >  { void b(); };
    

    Only the one type matches the specialized template exactly:

    Y< int & >             y1;  y1.a();
    Y< int *const& >       y2;  y2.a();
    Y< int const *const& > y3;  y3.a();
    Y< int const& >        y4;  y4.b(); // fully specialized match
    

    Given typemaps with the same types used for the template declared above, where T is again analogous to SWIGTYPE:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) int const&      { ... }
    

    The comparison between non-default typemaps and fully specialized single parameter templates turns out to be the same, as just the one type will match the non-default typemap:

    int &
    int *const&
    int const*const&
    int const&        // matches non-default typemap int const&
    

    However, if a non-const type is used instead:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) int &           { ... }
    

    then there is a clear difference to template matching as both the const and non-const types match the typemap:

    int &             // matches non-default typemap int &
    int *const&
    int const*const&
    int const&        // matches non-default typemap int &
    

    There are other subtle differences such as typedef handling, but at least it should be clear that the typemap matching rules are similar to those for specialized template handling.

    13.3.6 Debugging typemap pattern matching

    There are two useful debug command line options available for debugging typemaps, -debug-tmsearch and -debug-tmused .

    The -debug-tmsearch option is a verbose option for debugging typemap searches. This can be very useful for watching the pattern matching process in action and for debugging which typemaps are used. The option displays all the typemaps and types that are looked for until a successful pattern match is made. As the display includes searches for each and every type needed for wrapping, the amount of information displayed can be large. Normally you would manually search through the displayed information for the particular type that you are interested in.

    For example, consider some of the code used in the Typedef reductions section already covered:

    typedef int Integer;
    typedef Integer Row4[4];
    void foo(Row4 rows[10]);
    

    A sample of the debugging output is shown below for the "in" typemap:

    swig -perl -debug-tmsearch example.i
    ...
    example.h:3: Searching for a suitable 'in' typemap for: Row4 rows[10]
      Looking for: Row4 rows[10]
      Looking for: Row4 [10]
      Looking for: Row4 rows[ANY]
      Looking for: Row4 [ANY]
      Looking for: Integer rows[10][4]
      Looking for: Integer [10][4]
      Looking for: Integer rows[ANY][ANY]
      Looking for: Integer [ANY][ANY]
      Looking for: int rows[10][4]
      Looking for: int [10][4]
      Looking for: int rows[ANY][ANY]
      Looking for: int [ANY][ANY]
      Looking for: SWIGTYPE rows[ANY][ANY]
      Looking for: SWIGTYPE [ANY][ANY]
      Looking for: SWIGTYPE rows[ANY][]
      Looking for: SWIGTYPE [ANY][]
      Looking for: SWIGTYPE *rows[ANY]
      Looking for: SWIGTYPE *[ANY]
      Looking for: SWIGTYPE rows[ANY]
      Looking for: SWIGTYPE [ANY]
      Looking for: SWIGTYPE rows[]
      Looking for: SWIGTYPE []
      Using: %typemap(in) SWIGTYPE []
    ...
    

    showing that the best default match supplied by SWIG is the SWIGTYPE [] typemap. As the example shows, the successful match displays the used typemap source including typemap method, type and optional name in one of these simplified formats:

    • Using: %typemap(method) type name
    • Using: %typemap(method) type name = type2 name2
    • Using: %apply type2 name2 { type name }

    This information might meet your debugging needs, however, you might want to analyze further. If you next invoke SWIG with the -E option to display the preprocessed output, and search for the particular typemap used, you'll find the full typemap contents (example shown below for Python):

    %typemap(in, noblock=1) SWIGTYPE [] (void *argp = 0, int res = 0) {
      res = SWIG_ConvertPtr($input, &argp, $descriptor, $disown |  0 );
      if (!SWIG_IsOK(res)) { 
        SWIG_exception_fail(SWIG_ArgError(res), "in method '" "$symname" "', argument "
                           "$argnum"" of type '" "$type""'"); 
      } 
      $1 = ($ltype)(argp);
    }
    

    The generated code for the foo wrapper will then contain the snippets of the typemap with the special variables expanded. The rest of this chapter will need reading though to fully understand all of this, however, the relevant parts of the generated code for the above typemap can be seen below:

    SWIGINTERN PyObject *_wrap_foo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
    ...
      void *argp1 = 0 ;
      int res1 = 0 ;
    ...
      res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_a_4__int, 0 |  0 );
      if (!SWIG_IsOK(res1)) {
        SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "foo" "', argument "
                           "1"" of type '" "int [10][4]""'"); 
      } 
      arg1 = (int (*)[4])(argp1);
    ...
    }
    

    Searches for multi-argument typemaps are not mentioned unless a matching multi-argument typemap does actually exist. For example, the output for the code in the earlier multi-arguments section is as follows:

    ...
    example.h:39: Searching for a suitable 'in' typemap for: char *buffer
      Looking for: char *buffer
      Multi-argument typemap found...
      Using: %typemap(in) (char *buffer, int len)
    ...
    

    The second option for debugging is -debug-tmused and this displays the typemaps used. This option is a less verbose version of the -debug-tmsearch option as it only displays each successfully found typemap on a separate single line. The output displays the type, and name if present, the typemap method in brackets and then the actual typemap used in the same simplified format output by the -debug-tmsearch option. Below is the output for the example code at the start of this section on debugging.

    $ swig -perl -debug-tmused example.i
    example.h:3: Typemap for Row4 rows[10] (in) : %typemap(in) SWIGTYPE []
    example.h:3: Typemap for Row4 rows[10] (typecheck) : %typemap(typecheck) SWIGTYPE *
    example.h:3: Typemap for Row4 rows[10] (freearg) : %typemap(freearg) SWIGTYPE []
    example.h:3: Typemap for void foo (out) : %typemap(out) void
    

    Now, consider the following interface file:

    %module example
    
    %{
    void set_value(const char* val) {}
    %}
    
    %typemap(check) char *NON_NULL {
      if (!$1) {
        /* ... error handling ... */
      }
    }
    
    // use default pointer handling instead of strings
    %apply SWIGTYPE * { const char* val, const char* another_value }
    
    %typemap(check) const char* val = char* NON_NULL;
    
    %typemap(arginit, noblock=1) const char* val {
      $1 = "";
    }
    
    void set_value(const char* val);
    
    

    and the output debug:

    swig -perl5 -debug-tmused example.i
    example.i:21: Typemap for char const *val (arginit) : %typemap(arginit) char const *val
    example.i:21: Typemap for char const *val (in) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for char const *val (typecheck) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for char const *val (check) : %typemap(check) char const *val = char *NON_NULL
    example.i:21: Typemap for char const *val (freearg) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for void set_value (out) : %typemap(out) void
    

    The following observations about what is displayed can be noted (the same applies for -debug-tmsearch):

    • The relevant typemap is shown, but for typemap copying, the appropriate %typemap or %apply is displayed, for example, the "check" and "in" typemaps.
    • The typemap modifiers are not shown, eg the noblock=1 modifier in the "arginit" typemap.
    • The exact %apply statement might look different to what is in the actual code. For example, the const char* another_value is not shown as it is not relevant here. Also the types may be displayed slightly differently - char const * and not const char*.

    13.4 Code generation rules

    This section describes rules by which typemap code is inserted into the generated wrapper code.

    13.4.1 Scope

    When a typemap is defined like this:

    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    

    the typemap code is inserted into the wrapper function using a new block scope. In other words, the wrapper code will look like this:

    wrap_whatever() {
      ...
      // Typemap code
      {
        arg1 = PyInt_AsLong(obj1);
      }
      ...
    }
    

    Because the typemap code is enclosed in its own block, it is legal to declare temporary variables for use during typemap execution. For example:

    %typemap(in) short {
      long temp;          /* Temporary value */
      if (Tcl_GetLongFromObj(interp, $input, &temp) != TCL_OK) {
        return TCL_ERROR;
      }
      $1 = (short) temp;
    }
    

    Of course, any variables that you declare inside a typemap are destroyed as soon as the typemap code has executed (they are not visible to other parts of the wrapper function or other typemaps that might use the same variable names).

    Occasionally, typemap code will be specified using a few alternative forms. For example:

    %typemap(in) int "$1 = PyInt_AsLong($input);";
    %typemap(in) int %{
    $1 = PyInt_AsLong($input);
    %}
    %typemap(in, noblock=1) int {
    $1 = PyInt_AsLong($input);
    }
    

    These three forms are mainly used for cosmetics--the specified code is not enclosed inside a block scope when it is emitted. This sometimes results in a less complicated looking wrapper function. Note that only the third of the three typemaps have the typemap code passed through the SWIG preprocessor.

    13.4.2 Declaring new local variables

    Sometimes it is useful to declare a new local variable that exists within the scope of the entire wrapper function. A good example of this might be an application in which you wanted to marshal strings. Suppose you had a C++ function like this

    int foo(std::string *s);
    

    and you wanted to pass a native string in the target language as an argument. For instance, in Perl, you wanted the function to work like this:

    $x = foo("Hello World");
    

    To do this, you can't just pass a raw Perl string as the std::string * argument. Instead, you have to create a temporary std::string object, copy the Perl string data into it, and then pass a pointer to the object. To do this, simply specify the typemap with an extra parameter like this:

    %typemap(in) std::string * (std::string temp) {
      unsigned int len;
      char        *s;
      s = SvPV($input, len);         /* Extract string data */
      temp.assign(s, len);           /* Assign to temp */
      $1 = &temp;                   /* Set argument to point to temp */
    }
    

    In this case, temp becomes a local variable in the scope of the entire wrapper function. For example:

    wrap_foo() {
      std::string temp;    <--- Declaration of temp goes here
      ...
    
      /* Typemap code */
      {
        ...
        temp.assign(s, len);
        ...
      }
      ...
    }
    

    When you set temp to a value, it persists for the duration of the wrapper function and gets cleaned up automatically on exit.

    It is perfectly safe to use more than one typemap involving local variables in the same declaration. For example, you could declare a function as :

    void foo(std::string *x, std::string *y, std::string *z);
    

    This is safely handled because SWIG actually renames all local variable references by appending an argument number suffix. Therefore, the generated code would actually look like this:

    wrap_foo() {
      int *arg1;    /* Actual arguments */
      int *arg2;
      int *arg3;
      std::string temp1;    /* Locals declared in the typemap */
      std::string temp2;
      std::string temp3;
      ...
      {
        char *s;
        unsigned int len;
        ...
        temp1.assign(s, len);
        arg1 = *temp1;
      }
      {
        char *s;
        unsigned int len;
        ...
        temp2.assign(s, len);
        arg2 = &temp2;
      }
      {
        char *s;
        unsigned int len;
        ...
        temp3.assign(s, len);
        arg3 = &temp3;
      }
      ...
    }
    

    There is an exception: if the variable name starts with the _global_ prefix, the argument number is not appended. Such variables can be used throughout the generated wrapper function. For example, the above typemap could be rewritten to use _global_temp instead of temp and the generated code would then contain a single _global_temp variable instead of temp1, temp2 and temp3:

    %typemap(in) std::string * (std::string _global_temp) {
     ... as above ...
    }
    

    Some typemaps do not recognize local variables (or they may simply not apply). At this time, only typemaps that apply to argument conversion support this (input typemaps such as the "in" typemap).

    Note:

    When declaring a typemap for multiple types, each type must have its own local variable declaration.

    %typemap(in) const std::string *, std::string * (std::string temp) // NO!
    // only std::string * has a local variable
    // const std::string * does not (oops)
    ....
    
    %typemap(in) const std::string * (std::string temp), std::string * (std::string temp) // Correct
    ....
    

    13.4.3 Special variables

    Within all typemaps, the following special variables are expanded. This is by no means a complete list as some target languages have additional special variables which are documented in the language specific chapters.

    VariableMeaning
    $n A C local variable corresponding to type n in the typemap pattern.
    $argnumArgument number. Only available in typemaps related to argument conversion
    $n_nameArgument name
    $n_typeReal C datatype of type n.
    $n_ltypeltype of type n
    $n_mangleMangled form of type n. For example _p_Foo
    $n_descriptorType descriptor structure for type n. For example SWIGTYPE_p_Foo. This is primarily used when interacting with the run-time type checker (described later).
    $*n_typeReal C datatype of type n with one pointer removed.
    $*n_ltypeltype of type n with one pointer removed.
    $*n_mangleMangled form of type n with one pointer removed.
    $*n_descriptorType descriptor structure for type n with one pointer removed.
    $&n_typeReal C datatype of type n with one pointer added.
    $&n_ltypeltype of type n with one pointer added.
    $&n_mangleMangled form of type n with one pointer added.
    $&n_descriptorType descriptor structure for type n with one pointer added.
    $n_basetypeBase typename with all pointers and qualifiers stripped.

    Within the table, $n refers to a specific type within the typemap specification. For example, if you write this

    %typemap(in) int *INPUT {
    
    }
    

    then $1 refers to int *INPUT. If you have a typemap like this,

    %typemap(in) (int argc, char *argv[]) {
      ...
    }
    

    then $1 refers to int argc and $2 refers to char *argv[].

    Substitutions related to types and names always fill in values from the actual code that was matched. This is useful when a typemap might match multiple C datatype. For example:

    %typemap(in)  int, short, long {
      $1 = ($1_ltype) PyInt_AsLong($input);
    }
    

    In this case, $1_ltype is replaced with the datatype that is actually matched.

    When typemap code is emitted, the C/C++ datatype of the special variables $1 and $2 is always an "ltype." An "ltype" is simply a type that can legally appear on the left-hand side of a C assignment operation. Here are a few examples of types and ltypes:

    type              ltype
    ------            ----------------
    int               int
    const int         int
    const int *       int *
    int [4]           int *
    int [4][5]        int (*)[5]
    

    In most cases a ltype is simply the C datatype with qualifiers stripped off. In addition, arrays are converted into pointers.

    Variables such as $&1_type and $*1_type are used to safely modify the type by removing or adding pointers. Although not needed in most typemaps, these substitutions are sometimes needed to properly work with typemaps that convert values between pointers and values.

    If necessary, type related substitutions can also be used when declaring locals. For example:

    %typemap(in) int * ($*1_type temp) {
      temp = PyInt_AsLong($input);
      $1 = &temp;
    }
    

    There is one word of caution about declaring local variables in this manner. If you declare a local variable using a type substitution such as $1_ltype temp, it won't work like you expect for arrays and certain kinds of pointers. For example, if you wrote this,

    %typemap(in) int [10][20] {
      $1_ltype temp;
    }
    

    then the declaration of temp will be expanded as

    int (*)[20] temp;
    

    This is illegal C syntax and won't compile. There is currently no straightforward way to work around this problem in SWIG due to the way that typemap code is expanded and processed. However, one possible workaround is to simply pick an alternative type such as void * and use casts to get the correct type when needed. For example:

    %typemap(in) int [10][20] {
      void *temp;
      ...
      (($1_ltype) temp)[i][j] = x;    /* set a value */
      ...
    }
    

    Another approach, which only works for arrays is to use the $1_basetype substitution. For example:

    %typemap(in) int [10][20] {
      $1_basetype temp[10][20];
      ...
      temp[i][j] = x;    /* set a value */
      ...
    }
    

    13.4.4 Special variable macros

    Special variable macros are like macro functions in that they take one or more input arguments which are used for the macro expansion. They look like macro/function calls but use the special variable $ prefix to the macro name. Note that unlike normal macros, the expansion is not done by the preprocessor, it is done during the SWIG parsing/compilation stages. The following special variable macros are available across all language modules.

    13.4.4.1 $descriptor(type)

    This macro expands into the type descriptor structure for any C/C++ type specified in type. It behaves like the $1_descriptor special variable described above except that the type to expand is taken from the macro argument rather than inferred from the typemap type. For example, $descriptor(std::vector<int> *) will expand into SWIGTYPE_p_std__vectorT_int_t. This macro is mostly used in the scripting target languages and is demonstrated later in the Run-time type checker usage section.

    13.4.4.2 $typemap(method, typepattern)

    This macro uses the pattern matching rules described earlier to lookup and then substitute the special variable macro with the code in the matched typemap. The typemap to search for is specified by the arguments, where method is the typemap method name and typepattern is a type pattern as per the %typemap specification in the Defining a typemap section.

    The special variables within the matched typemap are expanded into those for the matched typemap type, not the typemap within which the macro is called. In practice, there is little use for this macro in the scripting target languages. It is mostly used in the target languages that are statically typed as a way to obtain the target language type given the C/C++ type and more commonly only when the C++ type is a template parameter.

    The example below is for C# only and uses some typemap method names documented in the C# chapter, but it shows some of the possible syntax variations.

    %typemap(cstype) unsigned long    "uint"
    %typemap(cstype) unsigned long bb "bool"
    %typemap(cscode) BarClass %{
      void foo($typemap(cstype, unsigned long aa) var1,
               $typemap(cstype, unsigned long bb) var2,
               $typemap(cstype, (unsigned long bb)) var3,
               $typemap(cstype, unsigned long) var4)
      {
        // do something
      }
    %}
    

    The result is the following expansion

    %typemap(cstype) unsigned long    "uint"
    %typemap(cstype) unsigned long bb "bool"
    %typemap(cscode) BarClass %{
      void foo(uint var1,
               bool var2,
               bool var3,
               uint var4)
      {
        // do something
      }
    %}
    

    13.4.5 Special variables and typemap attributes

    As of SWIG-3.0.7 typemap attributes will also expand special variables and special variable macros.

    Example usage showing the expansion in the 'out' attribute (C# specific) as well as the main typemap body:

    %typemap(ctype, out="$*1_ltype") unsigned int& "$*1_ltype"
    

    is equivalent to the following as $*1_ltype expands to unsigned int:

    %typemap(ctype, out="unsigned int") unsigned int& "unsigned int"
    

    13.4.6 Special variables combined with special variable macros

    Special variables can also be used within special variable macros. The special variables are expanded before they are used in the special variable macros.

    Consider the following C# typemaps:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="$typemap(cstype, $*1_ltype)") unsigned int& "$typemap(cstype, $*1_ltype)"
    

    Special variables are expanded first and hence the above is equivalent to:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="$typemap(cstype, unsigned int)") unsigned int& "$typemap(cstype, unsigned int)"
    

    which then expands to:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="uint") unsigned int& "uint"
    

    13.5 Common typemap methods

    The family of typemaps recognized by a language module may vary. However, the following typemap methods are nearly universal:

    13.5.1 "in" typemap

    The "in" typemap is used to convert function arguments from the target language to C. For example:

    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    

    The following special variables are available:

    $input            - Input object holding value to be converted.
    $symname          - Name of function/method being wrapped
    

    This is probably the most commonly redefined typemap because it can be used to implement customized conversions.

    In addition, the "in" typemap allows the number of converted arguments to be specified. The numinputs attributes facilitates this. For example:

    // Ignored argument.
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    

    At this time, only zero or one arguments may be converted. When numinputs is set to 0, the argument is effectively ignored and cannot be supplied from the target language. The argument is still required when making the C/C++ call and the above typemap shows the value used is instead obtained from a locally declared variable called temp. Usually numinputs is not specified, whereupon the default value is 1, that is, there is a one to one mapping of the number of arguments when used from the target language to the C/C++ call. Multi-argument typemaps provide a similar concept where the number of arguments mapped from the target language to C/C++ can be changed for multiple adjacent C/C++ arguments.

    Compatibility note: Specifying numinputs=0 is the same as the old "ignore" typemap.

    13.5.2 "typecheck" typemap

    The "typecheck" typemap is used to support overloaded functions and methods. It merely checks an argument to see whether or not it matches a specific type. For example:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_INTEGER) int {
      $1 = PyInt_Check($input) ? 1 : 0;
    }
    

    For typechecking, the $1 variable is always a simple integer that is set to 1 or 0 depending on whether or not the input argument is the correct type. Set to 1 if the input argument is the correct type otherwise set to 0.

    If you define new "in" typemaps and your program uses overloaded methods, you should also define a collection of "typecheck" typemaps. More details about this follow in the Typemaps and overloading section.

    13.5.3 "out" typemap

    The "out" typemap is used to convert function/method return values from C into the target language. For example:

    %typemap(out) int {
      $result = PyInt_FromLong($1);
    }
    

    The following special variables are available.

    $result           - Result object returned to target language.
    $symname          - Name of function/method being wrapped
    

    The "out" typemap supports an optional attribute flag called "optimal". This is for code optimisation and is detailed in the Optimal code generation when returning by value section.

    13.5.4 "arginit" typemap

    The "arginit" typemap is used to set the initial value of a function argument--before any conversion has occurred. This is not normally necessary, but might be useful in highly specialized applications. For example:

    // Set argument to NULL before any conversion occurs
    %typemap(arginit) int *data {
      $1 = NULL;
    }
    

    13.5.5 "default" typemap

    The "default" typemap is used to turn an argument into a default argument. For example:

    %typemap(default) int flags {
      $1 = DEFAULT_FLAGS;
    }
    ...
    int foo(int x, int y, int flags);
    

    The primary use of this typemap is to either change the wrapping of default arguments or specify a default argument in a language where they aren't supported (like C). Target languages that do not support optional arguments, such as Java and C#, effectively ignore the value specified by this typemap as all arguments must be given.

    Once a default typemap has been applied to an argument, all arguments that follow must have default values. See the Default/optional arguments section for further information on default argument wrapping.

    13.5.6 "check" typemap

    The "check" typemap is used to supply value checking code during argument conversion. The typemap is applied after arguments have been converted. For example:

    %typemap(check) int positive {
      if ($1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected positive value.");
      }
    }
    

    13.5.7 "argout" typemap

    The "argout" typemap is used to return values from arguments. This is most commonly used to write wrappers for C/C++ functions that need to return multiple values. The "argout" typemap is almost always combined with an "in" typemap---possibly to ignore the input value. For example:

    /* Set the input argument to point to a temporary variable */
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    
    %typemap(argout) int *out {
      // Append output value $1 to $result
      ...
    }
    

    The following special variables are available.

    $result           - Result object returned to target language.
    $input            - The original input object passed.
    $symname          - Name of function/method being wrapped
    

    The code supplied to the "argout" typemap is always placed after the "out" typemap. If multiple return values are used, the extra return values are often appended to return value of the function.

    See the typemaps.i library file for examples.

    13.5.8 "freearg" typemap

    The "freearg" typemap is used to cleanup argument data. It is only used when an argument might have allocated resources that need to be cleaned up when the wrapper function exits. The "freearg" typemap usually cleans up argument resources allocated by the "in" typemap. For example:

    // Get a list of integers
    %typemap(in) int *items {
      int nitems = Length($input);
      $1 = (int *) malloc(sizeof(int)*nitems);
    }
    // Free the list 
    %typemap(freearg) int *items {
      free($1);
    }
    

    The "freearg" typemap inserted at the end of the wrapper function, just before control is returned back to the target language. This code is also placed into a special variable $cleanup that may be used in other typemaps whenever a wrapper function needs to abort prematurely.

    13.5.9 "newfree" typemap

    The "newfree" typemap is used in conjunction with the %newobject directive and is used to deallocate memory used by the return result of a function. For example:

    %typemap(newfree) string * {
      delete $1;
    }
    %typemap(out) string * {
      $result = PyString_FromString($1->c_str());
    }
    ...
    
    %newobject foo;
    ...
    string *foo();
    

    See Object ownership and %newobject for further details.

    13.5.10 "ret" typemap

    The "ret" typemap is not used very often, but can be useful for anything associated with the return type, such as resource management, return value error checking, etc. Usually this can all be done in the "out" typemap, but sometimes it is handy to use the "out" typemap code untouched and add to the generated code using the code in the "ret" typemap. One such case is memory clean up. For example, a stringheap_t type is defined indicating that the returned memory must be deleted and a string_t type is defined indicating that the returned memory must not be deleted.

    %typemap(ret) stringheap_t %{
      free($1);
    %}
    
    typedef char * string_t;
    typedef char * stringheap_t;
    
    string_t MakeString1();
    stringheap_t MakeString2();
    

    The "ret" typemap above will only be used for MakeString2, but both functions will use the default "out" typemap for char * provided by SWIG. The code above would ensure the appropriate memory is freed in all target languages as the need to provide custom "out" typemaps (which involve target language specific code) is not necessary.

    This approach is an alternative to using the "newfree" typemap and %newobject as there is no need to list all the functions that require the memory cleanup, it is purely done on types.

    13.5.11 "memberin" typemap

    The "memberin" typemap is used to copy data from an already converted input value into a structure member. It is typically used to handle array members and other special cases. For example:

    %typemap(memberin) int [4] {
      memmove($1, $input, 4*sizeof(int));
    }
    

    It is rarely necessary to write "memberin" typemaps---SWIG already provides a default implementation for arrays, strings, and other objects.

    13.5.12 "varin" typemap

    The "varin" typemap is used to convert objects in the target language to C for the purposes of assigning to a C/C++ global variable. This is implementation specific.

    13.5.13 "varout" typemap

    The "varout" typemap is used to convert a C/C++ object to an object in the target language when reading a C/C++ global variable. This is implementation specific.

    13.5.14 "throws" typemap

    The "throws" typemap is only used when SWIG parses a C++ method with an exception specification or has the %catches feature attached to the method (see Exception handling with %catches). It provides a default mechanism for handling C++ methods that have declared the exceptions they will throw. The purpose of this typemap is to convert a C++ exception into an error or exception in the target language. It is slightly different to the other typemaps as it is based around the exception type rather than the type of a parameter or variable. For example:

    %typemap(throws) const char * %{
      PyErr_SetString(PyExc_RuntimeError, $1);
      SWIG_fail;
    %}
    
    // Either an exception specification on the method
      void bar() throw (const char *);
    
    // Or a %catches feature attached to the method
      %catches(const char *) bar();
      void bar();
    

    As can be seen from the resulting generated code below, SWIG generates an exception handler when wrapping the bar function with the catch block comprising the "throws" typemap content.

    ...
    try {
      bar();
    } catch(char const *_e) {
      PyErr_SetString(PyExc_RuntimeError, _e);
      SWIG_fail;
    }
    ...
    

    Note that if your methods do not have an exception specification but they do throw exceptions and you are not using %catches, SWIG cannot know how to deal with them. Please also see the Exception handling with %exception section for another way to handle exceptions.

    13.6 Some typemap examples

    This section contains a few examples. Consult language module documentation for more examples.

    13.6.1 Typemaps for arrays

    A common use of typemaps is to provide support for C arrays appearing both as arguments to functions and as structure members.

    For example, suppose you had a function like this:

    void set_vector(int type, float value[4]);
    

    If you wanted to handle float value[4] as a list of floats, you might write a typemap similar to this:

    
    %typemap(in) float value[4] (float temp[4]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != 4) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected 4 elements");
        SWIG_fail;
      }
      for (i = 0; i < 4; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          temp[i] = (float) PyFloat_AsDouble(o);
        } else {
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");      
          SWIG_fail;
        }
      }
      $1 = temp;
    }
    

    In this example, the variable temp allocates a small array on the C stack. The typemap then populates this array and passes it to the underlying C function.

    When used from Python, the typemap allows the following type of function call:

    >>> set_vector(type, [ 1, 2.5, 5, 20 ])
    

    If you wanted to generalize the typemap to apply to arrays of all dimensions you might write this:

    %typemap(in) float value[ANY] (float temp[$1_dim0]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected $1_dim0 elements");
        SWIG_fail;
      }
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          temp[i] = (float) PyFloat_AsDouble(o);
        } else {
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");      
          SWIG_fail;
        }
      }
      $1 = temp;
    }
    

    In this example, the special variable $1_dim0 is expanded with the actual array dimensions. Multidimensional arrays can be matched in a similar manner. For example:

    %typemap(in) float matrix[ANY][ANY] (float temp[$1_dim0][$1_dim1]) {
      ... convert a 2d array ...
    }
    

    For large arrays, it may be impractical to allocate storage on the stack using a temporary variable as shown. To work with heap allocated data, the following technique can be used.

    %typemap(in) float value[ANY] {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected $1_dim0 elements");
        SWIG_fail;
      }
      $1 = (float *) malloc($1_dim0*sizeof(float));
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          $1[i] = (float) PyFloat_AsDouble(o);
        } else {
          free($1);
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");
          SWIG_fail;
        }
      }
    }
    %typemap(freearg) float value[ANY] {
      if ($1) free($1);
    }
    

    In this case, an array is allocated using malloc. The freearg typemap is then used to release the argument after the function has been called.

    Another common use of array typemaps is to provide support for array structure members. Due to subtle differences between pointers and arrays in C, you can't just "assign" to a array structure member. Instead, you have to explicitly copy elements into the array. For example, suppose you had a structure like this:

    struct SomeObject {
      float  value[4];
      ...
    };
    

    When SWIG runs, it won't produce any code to set the vec member. You may even get a warning message like this:

    $ swig -python  example.i
    example.i:10: Warning 462: Unable to set variable of type float [4].
    

    These warning messages indicate that SWIG does not know how you want to set the vec field.

    To fix this, you can supply a special "memberin" typemap like this:

    %typemap(memberin) float [ANY] {
      int i;
      for (i = 0; i < $1_dim0; i++) {
          $1[i] = $input[i];
      }
    }
    

    The memberin typemap is used to set a structure member from data that has already been converted from the target language to C. In this case, $input is the local variable in which converted input data is stored. This typemap then copies this data into the structure.

    When combined with the earlier typemaps for arrays, the combination of the "in" and "memberin" typemap allows the following usage:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    

    Related to structure member input, it may be desirable to return structure members as a new kind of object. For example, in this example, you will get very odd program behavior where the structure member can be set nicely, but reading the member simply returns a pointer:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    >>> print s.x
    _1008fea8_p_float
    >>> 
    

    To fix this, you can write an "out" typemap. For example:

    %typemap(out) float [ANY] {
      int i;
      $result = PyList_New($1_dim0);
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PyFloat_FromDouble((double) $1[i]);
        PyList_SetItem($result, i, o);
      }
    }
    

    Now, you will find that member access is quite nice:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    >>> print s.x
    [ 1, 2.5, 5, 10]
    

    Compatibility Note: SWIG1.1 used to provide a special "memberout" typemap. However, it was mostly useless and has since been eliminated. To return structure members, simply use the "out" typemap.

    13.6.2 Implementing constraints with typemaps

    One particularly interesting application of typemaps is the implementation of argument constraints. This can be done with the "check" typemap. When used, this allows you to provide code for checking the values of function arguments. For example:

    %module math
    
    %typemap(check) double posdouble {
      if ($1 < 0) {
        croak("Expecting a positive number");
      }
    }
    
    ...
    double sqrt(double posdouble);
    
    

    This provides a sanity check to your wrapper function. If a negative number is passed to this function, a Perl exception will be raised and your program terminated with an error message.

    This kind of checking can be particularly useful when working with pointers. For example:

    %typemap(check) Vector * {
      if ($1 == 0) {
        PyErr_SetString(PyExc_TypeError, "NULL Pointer not allowed");
        SWIG_fail;
      }
    }
    
    

    will prevent any function involving a Vector * from accepting a NULL pointer. As a result, SWIG can often prevent a potential segmentation faults or other run-time problems by raising an exception rather than blindly passing values to the underlying C/C++ program.

    13.7 Typemaps for multiple target languages

    The code within typemaps is usually language dependent, however, many target languages support the same typemaps. In order to distinguish typemaps across different languages, the preprocessor should be used. For example, the "in" typemap for Perl and Ruby could be written as:

    #if defined(SWIGPERL)
      %typemap(in) int "$1 = ($1_ltype) SvIV($input);"
    #elif defined(SWIGRUBY)
      %typemap(in) int "$1 = NUM2INT($input);"
    #else
      #warning no "in" typemap defined
    #endif
    

    The full set of language specific macros is defined in the Conditional Compilation section. The example above also shows a common approach of issuing a warning for an as yet unsupported language.

    Compatibility note: In SWIG-1.1 different languages could be distinguished with the language name being put within the %typemap directive, for example,
    %typemap(ruby, in) int "$1 = NUM2INT($input);".

    13.8 Optimal code generation when returning by value

    The "out" typemap is the main typemap for return types. This typemap supports an optional attribute flag called "optimal", which is for reducing the number of temporary variables and the amount of generated code, thereby giving the compiler the opportunity to use return value optimization for generating faster executing code. It only really makes a difference when returning objects by value and has some limitations on usage, as explained later on.

    When a function returns an object by value, SWIG generates code that instantiates the default type on the stack then assigns the value returned by the function call to it. A copy of this object is then made on the heap and this is what is ultimately stored and used from the target language. This will be clearer considering an example. Consider running the following code through SWIG:

    %typemap(out) SWIGTYPE %{
      $result = new $1_ltype((const $1_ltype &)$1);
    %}
    
    %inline %{
    #include <iostream>
    using namespace std;
    
    struct XX {
      XX() { cout << "XX()" << endl; }
      XX(int i) { cout << "XX(" << i << ")" << endl; }
      XX(const XX &other) { cout << "XX(const XX &)" << endl; }
      XX & operator =(const XX &other) { cout << "operator=(const XX &)" << endl; return *this; }
      ~XX() { cout << "~XX()" << endl; }
      static XX create() { 
        return XX(0);
      }
    };
    %}
    

    The "out" typemap shown is the default typemap for C# when returning objects by value. When making a call to XX::create() from C#, the output is as follows:

    XX()
    XX(0)
    operator=(const XX &)
    ~XX()
    XX(const XX &)
    ~XX()
    ~XX()
    

    Note that three objects are being created as well as an assignment. Wouldn't it be great if the XX::create() method was the only time a constructor was called? As the method returns by value, this is asking a lot and the code that SWIG generates by default makes it impossible for the compiler to use return value optimisation (RVO) . However, this is where the "optimal" attribute in the "out" typemap can help out. If the typemap code is kept the same and just the "optimal" attribute specified like this:

    %typemap(out, optimal="1") SWIGTYPE %{
      $result = new $1_ltype((const $1_ltype &)$1);
    %}
    

    then when the code is run again, the output is simply:

    XX(0)
    ~XX()
    

    How the "optimal" attribute works is best explained using the generated code. Without "optimal", the generated code is:

    SWIGEXPORT void * SWIGSTDCALL CSharp_XX_create() {
      void * jresult ;
      XX result;
      result = XX::create();
      jresult = new XX((const XX &)result);
      return jresult;
    }
    
    

    With the "optimal" attribute, the code is:

    SWIGEXPORT void * SWIGSTDCALL CSharp_XX_create() {
      void * jresult ;
      jresult = new XX((const XX &)XX::create());
      return jresult;
    }
    

    The major difference is the result temporary variable holding the value returned from XX::create() is no longer generated and instead the copy constructor call is made directly from the value returned by XX::create(). With modern compilers implementing RVO, the copy is not actually done, in fact the object is never created on the stack in XX::create() at all, it is simply created directly on the heap. In the first instance, the $1 special variable in the typemap is expanded into result. In the second instance, $1 is expanded into XX::create() and this is essentially what the "optimal" attribute is telling SWIG to do.

    The "optimal" attribute optimisation is not turned on by default as it has a number of restrictions. Firstly, some code cannot be condensed into a simple call for passing into the copy constructor. One common occurrence is when %exception is used. Consider adding the following %exception to the example:

    %exception XX::create() %{
    try {
      $action
    } catch(const std::exception &e) {
      cout << e.what() << endl;
    }
    %}
    

    SWIG can detect when the "optimal" attribute cannot be used and will ignore it and in this case will issue the following warning:

    example.i:28: Warning 474: Method XX::create() usage of the optimal attribute ignored
    example.i:14: Warning 474: in the out typemap as the following cannot be used to generate
    optimal code: 
    try {
      result = XX::create();
    } catch(const std::exception &e) {
      cout << e.what() << endl;
    }
    

    It should be clear that the above code cannot be used as the argument to the copy constructor call, that is, for the $1 substitution.

    Secondly, if the typemaps uses $1 more than once, then multiple calls to the wrapped function will be made. Obviously that is not very optimal. In fact SWIG attempts to detect this and will issue a warning something like:

    example.i:21: Warning 475: Multiple calls to XX::create() might be generated due to
    example.i:7: Warning 475: optimal attribute usage in the out typemap.
    

    However, it doesn't always get it right, for example when $1 is within some commented out code.

    13.9 Multi-argument typemaps

    So far, the typemaps presented have focused on the problem of dealing with single values. For example, converting a single input object to a single argument in a function call. However, certain conversion problems are difficult to handle in this manner. As an example, consider the example at the very beginning of this chapter:

    int foo(int argc, char *argv[]);
    

    Suppose that you wanted to wrap this function so that it accepted a single list of strings like this:

    >>> foo(["ale", "lager", "stout"])
    

    To do this, you not only need to map a list of strings to char *argv[], but the value of int argc is implicitly determined by the length of the list. Using only simple typemaps, this type of conversion is possible, but extremely painful. Multi-argument typemaps help in this situation.

    A multi-argument typemap is a conversion rule that specifies how to convert a single object in the target language to a set of consecutive function arguments in C/C++. For example, the following multi-argument maps perform the conversion described for the above example:

    %typemap(in) (int argc, char *argv[]) {
      int i;
      if (!PyList_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting a list");
        SWIG_fail;
      }
      $1 = PyList_Size($input);
      $2 = (char **) malloc(($1+1)*sizeof(char *));
      for (i = 0; i < $1; i++) {
        PyObject *s = PyList_GetItem($input, i);
        if (!PyString_Check(s)) {
          free($2);
          PyErr_SetString(PyExc_ValueError, "List items must be strings");
          SWIG_fail;
        }
        $2[i] = PyString_AsString(s);
      }
      $2[i] = 0;
    }
    
    %typemap(freearg) (int argc, char *argv[]) {
      if ($2) free($2);
    }
    
    /* Required for C++ method overloading */
    %typecheck(SWIG_TYPECHECK_STRING_ARRAY) (int argc, char *argv[]) {
      $1 = PyList_Check($input) ? 1 : 0;
    }
    

    A multi-argument map is always specified by surrounding the arguments with parentheses as shown. For example:

    %typemap(in) (int argc, char *argv[]) { ... }
    

    Within the typemap code, the variables $1, $2, and so forth refer to each type in the map. All of the usual substitutions apply--just use the appropriate $1 or $2 prefix on the variable name (e.g., $2_type, $1_ltype, etc.)

    Multi-argument typemaps always have precedence over simple typemaps and SWIG always performs longest-match searching. Therefore, you will get the following behavior:

    %typemap(in) int argc                              { ... typemap 1 ... }
    %typemap(in) (int argc, char *argv[])              { ... typemap 2 ... }
    %typemap(in) (int argc, char *argv[], char *env[]) { ... typemap 3 ... }
    
    int foo(int argc, char *argv[]);                   // Uses typemap 2
    int bar(int argc, int x);                          // Uses typemap 1
    int spam(int argc, char *argv[], char *env[]);     // Uses typemap 3
    

    It should be stressed that multi-argument typemaps can appear anywhere in a function declaration and can appear more than once. For example, you could write this:

    %typemap(in) (int scount, char *swords[]) { ... }
    %typemap(in) (int wcount, char *words[]) { ... }
    
    void search_words(int scount, char *swords[], int wcount, char *words[], int maxcount);
    

    Other directives such as %apply and %clear also work with multi-argument maps. For example:

    %apply (int argc, char *argv[]) {
        (int scount, char *swords[]),
        (int wcount, char *words[])
    };
    ...
    %clear (int scount, char *swords[]), (int wcount, char *words[]);
    ...
    

    Don't forget to also provide a suitable typemap for overloaded functions, such as %typecheck shown for foo above. This is only required if the function is overloaded in C++.

    Although multi-argument typemaps may seem like an exotic, little used feature, there are several situations where they make sense. First, suppose you wanted to wrap functions similar to the low-level read() and write() system calls. For example:

    typedef unsigned int size_t;
    
    int read(int fd, void *rbuffer, size_t len);
    int write(int fd, void *wbuffer, size_t len);
    

    As is, the only way to use the functions would be to allocate memory and pass some kind of pointer as the second argument---a process that might require the use of a helper function. However, using multi-argument maps, the functions can be transformed into something more natural. For example, you might write typemaps like this:

    // typemap for an outgoing buffer
    %typemap(in) (void *wbuffer, size_t len) {
      if (!PyString_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting a string");
        SWIG_fail;
      }
      $1 = (void *) PyString_AsString($input);
      $2 = PyString_Size($input);
    }
    
    // typemap for an incoming buffer
    %typemap(in) (void *rbuffer, size_t len) {
      if (!PyInt_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting an integer");
        SWIG_fail;
      }
      $2 = PyInt_AsLong($input);
      if ($2 < 0) {
        PyErr_SetString(PyExc_ValueError, "Positive integer expected");
        SWIG_fail;
      }
      $1 = (void *) malloc($2);
    }
    
    // Return the buffer.  Discarding any previous return result
    %typemap(argout) (void *rbuffer, size_t len) {
      Py_XDECREF($result);   /* Blow away any previous result */
      if (result < 0) {      /* Check for I/O error */
        free($1);
        PyErr_SetFromErrno(PyExc_IOError);
        return NULL;
      }
      $result = PyString_FromStringAndSize($1, result);
      free($1);
    }
    

    (note: In the above example, $result and result are two different variables. result is the real C datatype that was returned by the function. $result is the scripting language object being returned to the interpreter.).

    Now, in a script, you can write code that simply passes buffers as strings like this:

    >>> f = example.open("Makefile")
    >>> example.read(f, 40)
    'TOP        = ../..\nSWIG       = $(TOP)/.'
    >>> example.read(f, 40)
    './swig\nSRCS       = example.c\nTARGET    '
    >>> example.close(f)
    0
    >>> g = example.open("foo", example.O_WRONLY | example.O_CREAT, 0644)
    >>> example.write(g, "Hello world\n")
    12
    >>> example.write(g, "This is a test\n")
    15
    >>> example.close(g)
    0
    >>>
    

    A number of multi-argument typemap problems also arise in libraries that perform matrix-calculations--especially if they are mapped onto low-level Fortran or C code. For example, you might have a function like this:

    int is_symmetric(double *mat, int rows, int columns);
    

    In this case, you might want to pass some kind of higher-level object as an matrix. To do this, you could write a multi-argument typemap like this:

    %typemap(in) (double *mat, int rows, int columns) {
      MatrixObject *a;
      a = GetMatrixFromObject($input);     /* Get matrix somehow */
    
      /* Get matrix properties */
      $1 = GetPointer(a);
      $2 = GetRows(a);
      $3 = GetColumns(a);
    }
    

    This kind of technique can be used to hook into scripting-language matrix packages such as Numeric Python. However, it should also be stressed that some care is in order. For example, when crossing languages you may need to worry about issues such as row-major vs. column-major ordering (and perform conversions if needed). Note that multi-argument typemaps cannot deal with non-consecutive C/C++ arguments; a workaround such as a helper function re-ordering the arguments to make them consecutive will need to be written.

    13.10 Typemap warnings

    Warnings can be added to typemaps so that SWIG generates a warning message whenever the typemap is used. See the information in the issuing warnings section.

    13.11 Typemap fragments

    The primary purpose of fragments is to reduce code bloat that repeated use of typemap code can lead to. Fragments are snippets of code that can be thought of as code dependencies of a typemap. If a fragment is used by more than one typemap, then the snippet of code within the fragment is only generated once. Code bloat is typically reduced by moving typemap code into a support function and then placing the support function into a fragment.

    For example, if you have a very long typemap

    %typemap(in) MyClass * {
      MyClass *value = 0;
    
      ... many lines of marshalling code  ...
    
      $result = value;
    }
    

    the same marshalling code is often repeated in several typemaps, such as "in", "varin", "directorout", etc. SWIG copies the code for each argument that requires the typemap code, easily leading to code bloat in the generated code. To eliminate this, define a fragment that includes the common marshalling code:

    %fragment("AsMyClass", "header") {
      MyClass *AsMyClass(PyObject *obj) {
        MyClass *value = 0;
    
        ... many lines of marshalling code  ...
    
        return value;
      }
    }
    
    %typemap(in, fragment="AsMyClass") MyClass * {
      $result = AsMyClass($input);
    }
    
    %typemap(varin, fragment="AsMyClass") MyClass * {
      $result = AsMyClass($input);
    }
    

    When the "in" or "varin" typemaps for MyClass are required, the contents of the fragment called "AsMyClass" is added to the "header" section within the generated code, and then the typemap code is emitted. Hence, the method AsMyClass will be generated into the wrapper code before any typemap code that calls it.

    To define a fragment you need a fragment name, a section name for generating the fragment code into, and the code itself. See Code insertion blocks for a full list of section names. Usually the section name used is "header". Different delimiters can be used:

    %fragment("my_name", "header") %{ ... %}
    %fragment("my_name", "header") { ... }
    %fragment("my_name", "header") " ... "
    

    and these follow the usual preprocessing rules mentioned in the Preprocessing delimiters section. The following are some rules and guidelines for using fragments:

    1. A fragment is added to the wrapping code only once. When using the MyClass * typemaps above and wrapping the method:

      void foo(MyClass *a, MyClass *b);
      

      the generated code will look something like:

      MyClass *AsMyClass(PyObject *obj) {
        ...
      }
      
      void _wrap_foo(...) {
        ....
        arg1 = AsMyClass(obj1);
        arg2 = AsMyClass(obj2);
        ...
        foo(arg1, arg2);
      }
      

      even as there is duplicated typemap code to process both a and b, the AsMyClass method will be defined only once.

    2. A fragment should only be defined once. If there is more than one definition, the first definition is the one used. All other definitions are silently ignored. For example, if you have

      %fragment("AsMyClass", "header") { ...definition 1... }
      ....
      %fragment("AsMyClass", "header") { ...definition 2... }
      

      only the first definition is used. In this way you can override the default fragments in a SWIG library by defining your fragment before the library %include. Note that this behavior is the opposite to typemaps, where the last typemap defined/applied prevails. Fragments follow the first-in-first-out convention since they are intended to be global, while typemaps are intended to be locally specialized.

    3. Fragment names cannot contain commas.

    4. A fragment can use one or more additional fragments, for example:

      %fragment("<limits.h>", "header") %{
        #include <limits.h>
      %}
      
      
      %fragment("AsMyClass", "header", fragment="<limits.h>") {
        MyClass *AsMyClass(PyObject *obj) {
          MyClass *value = 0;
      
          ... some marshalling code  ...
      
          if  (ival < CHAR_MIN /*defined in <limits.h>*/) {
            ...
          } else {
            ...
          }
          ...
          return value;
        }
      }
      

      in this case, when the "AsMyClass" fragment is emitted, it also triggers the inclusion of the "<limits.h>" fragment.

    5. A fragment can have dependencies on a number of other fragments, for example:

      %fragment("bigfragment", "header", fragment="frag1", fragment="frag2", fragment="frag3") "";
      

      When the "bigfragment" is used, the three dependent fragments "frag1", "frag2" and "frag3" are also pulled in. Note that as "bigframent" is empty (the empty string - ""), it does not add any code itself, but merely triggers the inclusion of the other fragments.

    6. A typemap can also use more than one fragment, but since the syntax is different, you need to specify the dependent fragments in a comma separated list. Consider:

      %typemap(in, fragment="frag1, frag2, frag3") {...}
      

      which is equivalent to:

      %typemap(in, fragment="bigfragment") {...}
      

      when used with the "bigfragment" defined above.

    7. Finally, you can force the inclusion of a fragment at any point in the generated code as follows:

      %fragment("bigfragment");
      

      which, for example, is very useful inside a template class. Another useful case is when using %extend inside a class where the additional code in the %extend block depends on the contents of the fragment.

      %fragment("<limits.h>", "header") %{
        #include <limits.h>
      %}
      
      struct X {
        ...
        %extend {
          %fragment("<limits.h>");
          bool check(short val) {
            if (val < SHRT_MIN /*defined in <limits.h>*/) {
              return true;
            } else {
              return false;
            }
          }
        }
      };
      

      Forced inclusion of fragments can be used as a replacement for code insertion block, ensuring the code block is only generated once. Consider the contents of FileA.i below which first uses a code insertion block and then a forced fragment inclusion to generate code:

      // FileA.i
      %{
        #include <stdio.h>
      %}
      %fragment("<limits.h>");
      

      and another file including the above:

      // FileB.i
      %include "FileA.i"
      

      The resulting code in the wrappers for FileB.i is:

        #include <stdio.h>
      
        #include <limits.h>
      

      A note of caution must be mentioned when using %fragment forced inclusion or code insertion blocks with %import. If %import is used instead:

      // FileC.i
      %import "FileA.i"
      

      then nothing is generated in the resulting code in the wrappers for FileC.i. This is because %import is for collecting type information and does not result in any code being generated, see File Imports.

    Most readers will probably want to skip the next two sub-sections on advanced fragment usage unless a desire to really get to grips with some powerful but tricky macro and fragment usage that is used in parts of the SWIG typemap library.

    13.11.1 Fragment type specialization

    Fragments can be type specialized. The syntax is as follows:

    %fragment("name", "header") { ...a type independent fragment... }
    %fragment("name"{type}, "header") { ...a type dependent fragment...  }
    

    where type is a C/C++ type. Like typemaps, fragments can also be used inside templates, for example:

    template <class T>
    struct A {
      %fragment("incode"{A<T>}, "header") {
        ... 'incode' specialized fragment ...
      }
    
      %typemap(in, fragment="incode"{A<T>}) {
        ... here we use the 'type specialized' fragment "incode"{A<T>} ...
      }
    };
    

    13.11.2 Fragments and automatic typemap specialization

    Since fragments can be type specialized, they can be elegantly used to specialize typemaps. For example, if you have something like:

    %fragment("incode"{float}, "header") {
      float in_method_float(PyObject *obj) {
        ...
      }
    }
    
    %fragment("incode"{long}, "header") {
      float in_method_long(PyObject *obj) {
        ...
      }
    }
    
    // %my_typemaps macro definition
    %define %my_typemaps(Type) 
    %typemap(in, fragment="incode"{Type}) Type {
      value = in_method_##Type(obj);
    }
    %enddef
    
    %my_typemaps(float);
    %my_typemaps(long);
    

    then the proper "incode"{float} or "incode"{long} fragment will be used, and the in_method_float and in_method_long methods will be called whenever the float or long types are used as input parameters.

    This feature is used a lot in the typemaps shipped in the SWIG library for some scripting languages. The interested (or very brave) reader can take a look at the fragments.swg file shipped with SWIG to see this in action.

    13.12 The run-time type checker

    Most scripting languages need type information at run-time. This type information can include how to construct types, how to garbage collect types, and the inheritance relationships between types. If the language interface does not provide its own type information storage, the generated SWIG code needs to provide it.

    Requirements for the type system:

    • Store inheritance and type equivalence information and be able to correctly re-create the type pointer.
    • Share type information between modules.
    • Modules can be loaded in any order, regardless of actual type dependency.
    • Avoid the use of dynamically allocated memory, and library/system calls in general.
    • Provide a reasonably fast implementation, minimizing the lookup time for all language modules.
    • Custom, language specific information can be attached to types.
    • Modules can be unloaded from the type system.

    13.12.1 Implementation

    The run-time type checker is used by many, but not all, of SWIG's supported target languages. The run-time type checker features are not required and are thus not used for statically typed languages such as Java and C#. The scripting and scheme based languages rely on it and it forms a critical part of SWIG's operation for these languages.

    When pointers, arrays, and objects are wrapped by SWIG, they are normally converted into typed pointer objects. For example, an instance of Foo * might be a string encoded like this:

    _108e688_p_Foo
    

    At a basic level, the type checker simply restores some type-safety to extension modules. However, the type checker is also responsible for making sure that wrapped C++ classes are handled correctly---especially when inheritance is used. This is especially important when an extension module makes use of multiple inheritance. For example:

    class Foo {
    public:
      int x;
    };
    
    class Bar {
    public:
      int y;
    };
    
    class FooBar : public Foo, public Bar {
    public:
      int z;
    };
    

    When the class FooBar is organized in memory, it contains the contents of the classes Foo and Bar as well as its own data members. For example:

    FooBar --> | -----------|  <-- Foo
               |   int x    |
               |------------|  <-- Bar
               |   int y    |
               |------------|
               |   int z    |
               |------------|
    

    Because of the way that base class data is stacked together, the casting of a Foobar * to either of the base classes may change the actual value of the pointer. This means that it is generally not safe to represent pointers using a simple integer or a bare void * ---type tags are needed to implement correct handling of pointer values (and to make adjustments when needed).

    In the wrapper code generated for each language, pointers are handled through the use of special type descriptors and conversion functions. For example, if you look at the wrapper code for Python, you will see code similar to the following (simplified for brevity):

    if (!SWIG_IsOK(SWIG_ConvertPtr(obj0, (void **) &arg1, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method 'GrabVal', expecting type Foo");
    }
    

    In this code, SWIGTYPE_p_Foo is the type descriptor that describes Foo *. The type descriptor is actually a pointer to a structure that contains information about the type name to use in the target language, a list of equivalent typenames (via typedef or inheritance), and pointer value handling information (if applicable). The SWIG_ConvertPtr() function is simply a utility function that takes a pointer object in the target language and a type-descriptor object and uses this information to generate a C++ pointer. The SWIG_IsOK macro checks the return value for errors and SWIG_exception_fail can be called to raise an exception in the target language. However, the exact name and calling conventions of the conversion function depends on the target language (see language specific chapters for details).

    The actual type code is in swigrun.swg, and gets inserted near the top of the generated swig wrapper file. The phrase "a type X that can cast into a type Y" means that given a type X, it can be converted into a type Y. In other words, X is a derived class of Y or X is a typedef of Y. The structure to store type information looks like this:

    /* Structure to store information on one type */
    typedef struct swig_type_info {
      const char *name;             /* mangled name of this type */
      const char *str;              /* human readable name for this type */
      swig_dycast_func dcast;       /* dynamic cast function down a hierarchy */
      struct swig_cast_info *cast;  /* Linked list of types that can cast into this type */
      void *clientdata;             /* Language specific type data */
    } swig_type_info;
    
    /* Structure to store a type and conversion function used for casting */
    typedef struct swig_cast_info {
      swig_type_info *type;          /* pointer to type that is equivalent to this type */
      swig_converter_func converter; /* function to cast the void pointers */
      struct swig_cast_info *next;   /* pointer to next cast in linked list */
      struct swig_cast_info *prev;   /* pointer to the previous cast */
    } swig_cast_info;
    

    Each swig_type_info stores a linked list of types that it is equivalent to. Each entry in this doubly linked list stores a pointer back to another swig_type_info structure, along with a pointer to a conversion function. This conversion function is used to solve the above problem of the FooBar class, correctly returning a pointer to the type we want.

    The basic problem we need to solve is verifying and building arguments passed to functions. So going back to the SWIG_ConvertPtr() function example from above, we are expecting a Foo * and need to check if obj0 is in fact a Foo * . From before, SWIGTYPE_p_Foo is just a pointer to the swig_type_info structure describing Foo *. So we loop through the linked list of swig_cast_info structures attached to SWIGTYPE_p_Foo. If we see that the type of obj0 is in the linked list, we pass the object through the associated conversion function and then return a positive. If we reach the end of the linked list without a match, then obj0 can not be converted to a Foo * and an error is generated.

    Another issue needing to be addressed is sharing type information between multiple modules. More explicitly, we need to have ONE swig_type_info for each type. If two modules both use the type, the second module loaded must lookup and use the swig_type_info structure from the module already loaded. Because no dynamic memory is used and the circular dependencies of the casting information, loading the type information is somewhat tricky, and not explained here. A complete description is in the Lib/swiginit.swg file (and near the top of any generated file).

    Each module has one swig_module_info structure which looks like this:

    /* Structure used to store module information
     * Each module generates one structure like this, and the runtime collects
     * all of these structures and stores them in a circularly linked list.*/
    typedef struct swig_module_info {
      swig_type_info **types;         /* Array of pointers to swig_type_info structs in this module */
      int size;                       /* Number of types in this module */
      struct swig_module_info *next;  /* Pointer to next element in circularly linked list */
      swig_type_info **type_initial;  /* Array of initially generated type structures */
      swig_cast_info **cast_initial;  /* Array of initially generated casting structures */
      void *clientdata;               /* Language specific module data */
    } swig_module_info;
    

    Each module stores an array of pointers to swig_type_info structures and the number of types in this module. So when a second module is loaded, it finds the swig_module_info structure for the first module and searches the array of types. If any of its own types are in the first module and have already been loaded, it uses those swig_type_info structures rather than creating new ones. These swig_module_info structures are chained together in a circularly linked list.

    13.12.2 Usage

    This section covers how to use these functions from typemaps. To learn how to call these functions from external files (not the generated _wrap.c file), see the External access to the run-time system section.

    When pointers are converted in a typemap, the typemap code often looks similar to this:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    The most critical part is the typemap is the use of the $1_descriptor special variable. When placed in a typemap, this is expanded into the SWIGTYPE_* type descriptor object above. As a general rule, you should always use $1_descriptor instead of trying to hard-code the type descriptor name directly.

    There is another reason why you should always use the $1_descriptor variable. When this special variable is expanded, SWIG marks the corresponding type as "in use." When type-tables and type information is emitted in the wrapper file, descriptor information is only generated for those datatypes that were actually used in the interface. This greatly reduces the size of the type tables and improves efficiency.

    Occasionally, you might need to write a typemap that needs to convert pointers of other types. To handle this, the special variable macro $descriptor(type) covered earlier can be used to generate the SWIG type descriptor name for any C datatype. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        Bar *temp;
        if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &temp, $descriptor(Bar *), 0))) {
          SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo or Bar");
        }
        $1 = (Foo *)temp;
      }
    }
    

    The primary use of $descriptor(type) is when writing typemaps for container objects and other complex data structures. There are some restrictions on the argument---namely it must be a fully defined C datatype. It can not be any of the special typemap variables.

    In certain cases, SWIG may not generate type-descriptors like you expect. For example, if you are converting pointers in some non-standard way or working with an unusual combination of interface files and modules, you may find that SWIG omits information for a specific type descriptor. To fix this, you may need to use the %types directive. For example:

    %types(int *, short *, long *, float *, double *);
    

    When %types is used, SWIG generates type-descriptor information even if those datatypes never appear elsewhere in the interface file.

    Further details about the run-time type checking can be found in the documentation for individual language modules. Reading the source code may also help. The file Lib/swigrun.swg in the SWIG library contains all of the source of the generated code for type-checking. This code is also included in every generated wrapped file so you probably just look at the output of SWIG to get a better sense for how types are managed.

    13.13 Typemaps and overloading

    This section does not apply to the statically typed languages like Java and C#, where overloading of the types is handled much like C++ by generating overloaded methods in the target language. In many of the other target languages, SWIG still fully supports C++ overloaded methods and functions. For example, if you have a collection of functions like this:

    int foo(int x);
    int foo(double x);
    int foo(char *s, int y);
    

    You can access the functions in a normal way from the scripting interpreter:

    # Python
    foo(3)           # foo(int)
    foo(3.5)         # foo(double)
    foo("hello", 5)  # foo(char *, int)
    
    # Tcl
    foo 3            # foo(int)
    foo 3.5          # foo(double)
    foo hello 5      # foo(char *, int)
    

    To implement overloading, SWIG generates a separate wrapper function for each overloaded method. For example, the above functions would produce something roughly like this:

    // wrapper pseudocode
    _wrap_foo_0(argc, args[]) {       // foo(int)
      int arg1;
      int result;
      ...
      arg1 = FromInteger(args[0]);
      result = foo(arg1);
      return ToInteger(result);
    }
    
    _wrap_foo_1(argc, args[]) {       // foo(double)
      double arg1;
      int result;
      ...
      arg1 = FromDouble(args[0]);
      result = foo(arg1);
      return ToInteger(result);
    }
    
    _wrap_foo_2(argc, args[]) {       // foo(char *, int)
      char *arg1;
      int   arg2;
      int result;
      ...
      arg1 = FromString(args[0]);
      arg2 = FromInteger(args[1]);
      result = foo(arg1, arg2);
      return ToInteger(result);
    }
    
    

    Next, a dynamic dispatch function is generated:

    _wrap_foo(argc, args[]) {
      if (argc == 1) {
        if (IsInteger(args[0])) {
          return _wrap_foo_0(argc, args);
        }
        if (IsDouble(args[0])) {
          return _wrap_foo_1(argc, args);
        }
      }
      if (argc == 2) {
        if (IsString(args[0]) && IsInteger(args[1])) {
          return _wrap_foo_2(argc, args);
        }
      }
      error("No matching function!\n");
    }
    

    The purpose of the dynamic dispatch function is to select the appropriate C++ function based on argument types---a task that must be performed at runtime in most of SWIG's target languages.

    The generation of the dynamic dispatch function is a relatively tricky affair. Not only must input typemaps be taken into account (these typemaps can radically change the types of arguments accepted), but overloaded methods must also be sorted and checked in a very specific order to resolve potential ambiguity. A high-level overview of this ranking process is found in the "SWIG and C++ " chapter. What isn't mentioned in that chapter is the mechanism by which it is implemented---as a collection of typemaps.

    To support dynamic dispatch, SWIG first defines a general purpose type hierarchy as follows:

    Symbolic Name                   Precedence Value
    ------------------------------  ------------------
    SWIG_TYPECHECK_POINTER           0
    SWIG_TYPECHECK_ITERATOR          5
    SWIG_TYPECHECK_VOIDPTR           10
    SWIG_TYPECHECK_BOOL              15
    SWIG_TYPECHECK_UINT8             20
    SWIG_TYPECHECK_INT8              25
    SWIG_TYPECHECK_UINT16            30
    SWIG_TYPECHECK_INT16             35
    SWIG_TYPECHECK_UINT32            40
    SWIG_TYPECHECK_INT32             45
    SWIG_TYPECHECK_SIZE              47
    SWIG_TYPECHECK_PTRDIFF           48
    SWIG_TYPECHECK_UINT64            50
    SWIG_TYPECHECK_INT64             55
    SWIG_TYPECHECK_UINT128           60
    SWIG_TYPECHECK_INT128            65
    SWIG_TYPECHECK_INTEGER           70
    SWIG_TYPECHECK_FLOAT             80
    SWIG_TYPECHECK_DOUBLE            90
    SWIG_TYPECHECK_CPLXFLT           95
    SWIG_TYPECHECK_CPLXDBL           100
    SWIG_TYPECHECK_COMPLEX           105
    SWIG_TYPECHECK_UNICHAR           110
    SWIG_TYPECHECK_STDUNISTRING      115
    SWIG_TYPECHECK_UNISTRING         120
    SWIG_TYPECHECK_CHAR              130
    SWIG_TYPECHECK_STDSTRING         135
    SWIG_TYPECHECK_STRING            140
    SWIG_TYPECHECK_PAIR              150
    SWIG_TYPECHECK_STDARRAY          155
    SWIG_TYPECHECK_VECTOR            160
    SWIG_TYPECHECK_DEQUE             170
    SWIG_TYPECHECK_LIST              180
    SWIG_TYPECHECK_SET               190
    SWIG_TYPECHECK_MULTISET          200
    SWIG_TYPECHECK_MAP               210
    SWIG_TYPECHECK_MULTIMAP          220
    SWIG_TYPECHECK_STACK             230
    SWIG_TYPECHECK_QUEUE             240
    SWIG_TYPECHECK_BOOL_ARRAY        1015
    SWIG_TYPECHECK_INT8_ARRAY        1025
    SWIG_TYPECHECK_INT16_ARRAY       1035
    SWIG_TYPECHECK_INT32_ARRAY       1045
    SWIG_TYPECHECK_INT64_ARRAY       1055
    SWIG_TYPECHECK_INT128_ARRAY      1065
    SWIG_TYPECHECK_FLOAT_ARRAY       1080
    SWIG_TYPECHECK_DOUBLE_ARRAY      1090
    SWIG_TYPECHECK_CHAR_ARRAY        1130
    SWIG_TYPECHECK_STRING_ARRAY      1140
    SWIG_TYPECHECK_OBJECT_ARRAY      1150
    SWIG_TYPECHECK_BOOL_PTR          2015
    SWIG_TYPECHECK_UINT8_PTR         2020
    SWIG_TYPECHECK_INT8_PTR          2025
    SWIG_TYPECHECK_UINT16_PTR        2030
    SWIG_TYPECHECK_INT16_PTR         2035
    SWIG_TYPECHECK_UINT32_PTR        2040
    SWIG_TYPECHECK_INT32_PTR         2045
    SWIG_TYPECHECK_UINT64_PTR        2050
    SWIG_TYPECHECK_INT64_PTR         2055
    SWIG_TYPECHECK_FLOAT_PTR         2080
    SWIG_TYPECHECK_DOUBLE_PTR        2090
    SWIG_TYPECHECK_CHAR_PTR          2130
    SWIG_TYPECHECK_SWIGOBJECT        5000
    

    (These precedence levels are defined in swig.swg, a library file that's included by all target language modules.)

    In this table, the precedence-level determines the order in which types are going to be checked. Low values are always checked before higher values. For example, integers are checked before floats, single values are checked before arrays, and so forth.

    Using the above table as a guide, each target language defines a collection of "typecheck" typemaps. The following excerpt from the Python module illustrates this:

    /* Python type checking rules */
    /* Note:  %typecheck(X) is a macro for %typemap(typecheck, precedence=X) */
    
    %typecheck(SWIG_TYPECHECK_INTEGER)
      int, short, long,
      unsigned int, unsigned short, unsigned long,
      signed char, unsigned char,
      long long, unsigned long long,
      const int &, const short &, const long &,
      const unsigned int &, const unsigned short &, const unsigned long &,
      const long long &, const unsigned long long &,
      enum SWIGTYPE,
      bool, const bool &
    {
      $1 = (PyInt_Check($input) || PyLong_Check($input)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_DOUBLE)
      float, double,
      const float &, const double &
    {
      $1 = (PyFloat_Check($input) || PyInt_Check($input) || PyLong_Check($input)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_CHAR) char {
      $1 = (PyString_Check($input) && (PyString_Size($input) == 1)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_STRING) char * {
      $1 = PyString_Check($input) ? 1 : 0;
    }
    
    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, noblock=1) SWIGTYPE * {
      void *vptr = 0;
      int res = SWIG_ConvertPtr($input, &vptr, $1_descriptor, 0);
      $1 = SWIG_IsOK(res) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_POINTER) PyObject * {
      $1 = ($input != 0);
    }
    

    It might take a bit of contemplation, but this code has merely organized all of the basic C++ types, provided some simple type-checking code, and assigned each type a precedence value.

    Finally, to generate the dynamic dispatch function, SWIG uses the following algorithm:

    • Overloaded methods are first sorted by the number of required arguments.
    • Methods with the same number of arguments are then sorted by precedence values of argument types.
    • Typecheck typemaps are then emitted to produce a dispatch function that checks arguments in the correct order.

    If you haven't written any typemaps of your own, it is unnecessary to worry about the typechecking rules. However, if you have written new input typemaps, you might have to supply a typechecking rule as well. An easy way to do this is to simply copy one of the existing typechecking rules. Here is an example,

    // Typemap for a C++ string
    %typemap(in) std::string {
      if (PyString_Check($input)) {
        $1 = std::string(PyString_AsString($input));
      } else {
        SWIG_exception(SWIG_TypeError, "string expected");
      }
    }
    // Copy the typecheck code for "char *".  
    %typemap(typecheck) std::string = char *;
    

    The bottom line: If you are writing new typemaps and you are using overloaded methods, you will probably have to write new typecheck code or copy and modify existing typecheck code.

    If you write a typecheck typemap and omit the precedence level, for example commenting it out as shown below:

    %typemap(typecheck /*, precedence=SWIG_TYPECHECK_INTEGER*/) int {
      $1 = PyInt_Check($input) ? 1 : 0;
    }
    

    then the type is given a precedence higher than any other known precedence level and a warning is issued:

    example.i:18: Warning 467: Overloaded method foo(int) not supported (incomplete type
    checking rule - no precedence level in typecheck typemap for 'int').
    

    Notes:

    • Typecheck typemaps are not used for non-overloaded methods. Because of this, it is still always necessary to check types in any "in" typemaps.
    • The dynamic dispatch process is only meant to be a heuristic. There are many corner cases where SWIG simply can't disambiguate types to the same degree as C++. The only way to resolve this ambiguity is to use the %rename directive to rename one of the overloaded methods (effectively eliminating overloading).
    • Typechecking may be partial. For example, if working with arrays, the typecheck code might simply check the type of the first array element and use that to dispatch to the correct function. Subsequent "in" typemaps would then perform more extensive type-checking.
    • Make sure you read the section on overloading in the SWIG and C++ chapter.

    13.13.1 SWIG_TYPECHECK_POINTER precedence level and the typecheck typemap

    When it comes to overloading of a particular type passed by value, pointer or reference (const and non-const), a C++ compiler can disambiguate which overloaded function to call. However, SWIG effectively treats these as pointers in the target language and thus as equivalent types. For example, consider:

    class X { ... };
    void m(X const &c); // equivalent: void m(X *c);
    void m(X &r);       // equivalent: void m(X *r);
    void m(X *p);       // equivalent: void m(X *p);
    

    These cannot be disambiguated in the target languages and so SWIG will choose the first method and ignore the subsequent two methods. The scripting languages do this by using the overload dispatch mechanism described earlier and warnings indicate this:

    example.i:6: Warning 509: Overloaded method m(X &) effectively ignored,
    example.i:5: Warning 509: as it is shadowed by m(X const &).
    example.i:7: Warning 509: Overloaded method m(X *) effectively ignored,
    example.i:5: Warning 509: as it is shadowed by m(X const &).
    

    The statically typed languages like Java and C# automatically ignore all but the first equivalent overloaded methods with warnings:

    example.i:6: Warning 516: Overloaded method m(X &) ignored,
    example.i:5: Warning 516: using m(X const &) instead.
    example.i:7: Warning 516: Overloaded method m(X *) ignored,
    example.i:5: Warning 516: using m(X const &) instead.
    

    You can select the overloaded method you would like to wrap by ignoring the other two with %ignore or rename two of them with %rename and this will of course remove the warnings too. The problem of ambiguity is also discussed in the C++ chapter on overloading.

    So how does this work with respect to typemaps? The typemaps SWIG provides to handle overloading for these three methods are from the SWIGTYPE family. As discussed earlier, in Default typemap matching rules, the SWIGTYPE & typemaps are used for references and SWIGTYPE * typemaps are used for pointers. SWIG uses the special SWIG_TYPECHECK_POINTER (0) precedence level to handle these types in the "typecheck" typemap:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) SWIGTYPE & "..."
    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) SWIGTYPE * "..."
    

    When the SWIGTYPE "typecheck" typemaps use the SWIG_TYPECHECK_POINTER precedence level, SWIG converts the type to a pointer equivalent type and then uses the equivalent type to detect if it can be disambiguated in an overloaded method in the target language. In our example above, the equivalent types for X const & , X & and X * are all X *. As they are the same, they cannot be disambiguated and so just the first overloaded method is chosen.

    The automatic conversion to equivalent types and subsequent type comparison is triggered via the use of the special SWIG_TYPECHECK_POINTER precedence level and works for types passed by value, pointer and reference. Alas, there are more ways to overload a method that also need handling. C++ smart pointers are such a type which can be disambiguated by a C++ compiler but not automatically by SWIG. SWIG does not automatically know that a smart pointer has an equivalent type, but it can be told manually. Just specify the 'equivalent' attribute in the "typecheck" typemap with a pointer to the underlying type.

    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="X *") MySmartPtr<X> " ... "
    
    void m(X &r);            // equivalent: void m(X *r);
    void m(MySmartPtr<X> s); // equivalent: void m(X *s);
    

    Now SWIG will detect the two types are equivalent and generate valid code by wrapping just the first overloaded method. You can of course choose which method to wrap by ignoring one of them with %ignore . Otherwise both can be wrapped by removing the overloading name ambiguity by renaming one of them with %rename.

    The 'equivalent' attribute is used in the implementation for the shared_ptr smart pointer library.

    13.14 More about %apply and %clear

    In order to implement certain kinds of program behavior, it is sometimes necessary to write a family of typemap methods. For example, to support output arguments, one often writes a family of typemaps like this:

    %typemap(in, numinputs=0) int *OUTPUT (int temp) {
      $1 = &temp;
    }
    %typemap(argout) int *OUTPUT {
      // return value somehow
    }
    

    To make it easier to apply the typemap to different argument types and names, the %apply directive performs a copy of all typemaps from a source type to one or more set of target types. For example, if you specify this,

    %apply int *OUTPUT { int *retvalue, int32 *output };
    

    then all of the int *OUTPUT (source) typemap methods are copied to int *retvalue and int32 *output (the targets).

    However, there is a subtle aspect of %apply that needs clarification. Namely, if a target contains a typemap method that the source does not, the target typemap method remains in place and unchanged. This behavior allows you to do two things:

    • You can specialize parts of a complex typemap rule by first defining a few typemaps and then using %apply to incorporate the remaining pieces.
    • Different typemaps can be applied to the same datatype using repeated %apply directives.

    For example:

    %typemap(in) int *INPUT (int temp) {
      temp = ... get value from $input ...;
      $1 = &temp;
    }
    
    %typemap(check) int *POSITIVE {
      if (*$1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected a positive number!\n");
        return NULL;
      }
    }
    
    %typemap(arginit) int *invalue %{
      $1 = NULL;
    %}
    
    ...
    %apply int *INPUT     { int *invalue };
    %apply int *POSITIVE  { int *invalue };
    

    In this example, neither of the two %apply directives will overwrite / delete the "arginit" typemap as neither has an "arginit" typemap. The result is a family of three relevant typemaps for int *invalue. Since %apply does not overwrite / delete any existing rules, the only way to reset behavior is to delete them, such as with the %clear directive. For example:

    %clear int *invalue;
    

    will delete the typemaps for all the typemap methods; namely "in", "check" and "arginit". Alternatively delete each one individually:

    %typemap(in) int *invalue;
    %typemap(check) int *invalue;
    %typemap(arginit) int *invalue;
    

    13.15 Passing data between typemaps

    It is also important to note that the primary use of local variables is to create stack-allocated objects for temporary use inside a wrapper function (this is faster and less-prone to error than allocating data on the heap). In general, the variables are not intended to pass information between different types of typemaps. However, this can be done if you realize that local names have the argument number appended to them. For example, you could do this:

    %typemap(in) int *(int temp) {
      temp = (int) PyInt_AsLong($input);
      $1 = &temp;
    }
    
    %typemap(argout) int * {
      PyObject *o = PyInt_FromLong(temp$argnum);
      ...
    }
    

    In this case, the $argnum variable is expanded into the argument number. Therefore, the code will reference the appropriate local such as temp1 and temp2. It should be noted that there are plenty of opportunities to break the universe here and that accessing locals in this manner should probably be avoided. At the very least, you should make sure that the typemaps sharing information have exactly the same types and names.

    13.16 C++ "this" pointer

    All the rules discussed for typemaps apply to C++ as well as C. However in addition C++ passes an extra parameter into every non-static class method -- the this pointer. Occasionally it can be useful to apply a typemap to this pointer (for example to check and make sure this is non-null before deferencing). Actually, C also has an the equivalent of the this pointer which is used when accessing variables in a C struct.

    In order to customise the this pointer handling, target a variable named self in your typemaps. self is the name SWIG uses to refer to the extra parameter in wrapped functions.

    For example, if wrapping for Java generation:

    %typemap(check) SWIGTYPE *self %{
    if (!$1) {
      SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException,
        "invalid native object; delete() likely already called");
      return $null;
    }
    %}
    

    In the above case, the $1 variable is expanded into the argument name that SWIG is using as the this pointer. SWIG will then insert the check code before the actual C++ class method is called, and will raise an exception rather than crash the Java virtual machine. The generated code will look something like:

      if (!arg1) {
        SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException,
          "invalid native object; delete() likely already called");
        return ;
      }
      (arg1)->wrappedFunction(...);
    

    Note that if you have a parameter named self then it will also match the typemap. One work around is to create an interface file that wraps the method, but gives the argument a name other than self.

    13.17 Where to go for more information?

    The best place to find out more information about writing typemaps is to look in the SWIG library. Most language modules define all of their default behavior using typemaps. These are found in files such as python.swg, perl5.swg, tcl8.swg and so forth. The typemaps.i file in the library also contains numerous examples. You should look at these files to get a feel for how to define typemaps of your own. Some of the language modules support additional typemaps and further information is available in the individual chapters for each target language. There you may also find more hands-on practical examples.


    14 Customization Features

    In many cases, it is desirable to change the default wrapping of particular declarations in an interface. For example, you might want to provide hooks for catching C++ exceptions, add assertions, or provide hints to the underlying code generator. This chapter describes some of these customization techniques. First, a discussion of exception handling is presented. Then, a more general-purpose customization mechanism known as "features" is described.

    14.1 Exception handling with %exception

    The %exception directive allows you to define a general purpose exception handler. For example, you can specify the following:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        ... handle error ...
      }
    }
    

    How the exception is handled depends on the target language, for example, Python:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        PyErr_SetString(PyExc_IndexError, "index out-of-bounds");
        SWIG_fail;
      }
    }
    

    When defined, the code enclosed in braces is inserted directly into the low-level wrapper functions. The special variable $action is one of a few %exception special variables supported and gets replaced with the actual operation to be performed (a function call, method invocation, attribute access, etc.). An exception handler remains in effect until it is explicitly deleted. This is done by using either %exception or %noexception with no code. For example:

    %exception;   // Deletes any previously defined handler
    

    Compatibility note: Previous versions of SWIG used a special directive %except for exception handling. That directive is deprecated--%exception provides the same functionality, but is substantially more flexible.

    14.1.1 Handling exceptions in C code

    C has no formal exception handling mechanism so there are several approaches that might be used. A somewhat common technique is to simply set a special error code. For example:

    /* File : except.c */
    
    static char error_message[256];
    static int error_status = 0;
    
    void throw_exception(char *msg) {
      strncpy(error_message, msg, 256);
      error_status = 1;
    }
    
    void clear_exception() {
      error_status = 0;
    }
    char *check_exception() {
      if (error_status)
        return error_message;
      else
        return NULL;
    }
    
    

    To use these functions, functions simply call throw_exception() to indicate an error occurred. For example :

    double inv(double x) {
      if (x != 0)
        return 1.0/x;
      else {
        throw_exception("Division by zero");
        return 0;
      }
    }
    

    To catch the exception, you can write a simple exception handler such as the following (shown for Perl5) :

    %exception {
      char *err;
      clear_exception();
      $action
      if ((err = check_exception())) {
        croak(err);
      }
    }
    

    In this case, when an error occurs, it is translated into a Perl error. Each target language has its own approach to creating a runtime error/exception in and for Perl it is the croak method shown above.

    14.1.2 Exception handling with longjmp()

    Exception handling can also be added to C code using the <setjmp.h> library. Here is a minimalistic implementation that relies on the C preprocessor :

    /* File : except.c
       Just the declaration of a few global variables we're going to use */
    
    #include <setjmp.h>
    jmp_buf exception_buffer;
    int exception_status;
    
    /* File : except.h */
    #include <setjmp.h>
    extern jmp_buf exception_buffer;
    extern int exception_status;
    
    #define try if ((exception_status = setjmp(exception_buffer)) == 0)
    #define catch(val) else if (exception_status == val)
    #define throw(val) longjmp(exception_buffer, val)
    #define finally else
    
    /* Exception codes */
    
    #define RangeError     1
    #define DivisionByZero 2
    #define OutOfMemory    3
    
    

    Now, within a C program, you can do the following :

    double inv(double x) {
      if (x)
        return 1.0/x;
      else
        throw(DivisionByZero);
    }
    
    

    Finally, to create a SWIG exception handler, write the following :

    %{
    #include "except.h"
    %}
    
    %exception {
      try {
        $action
      } catch(RangeError) {
        croak("Range Error");
      } catch(DivisionByZero) {
        croak("Division by zero");
      } catch(OutOfMemory) {
        croak("Out of memory");
      } finally {
        croak("Unknown exception");
      }
    }
    

    Note: This implementation is only intended to illustrate the general idea. To make it work better, you'll need to modify it to handle nested try declarations.

    14.1.3 Handling C++ exceptions

    Handling C++ exceptions is also straightforward. For example:

    %exception {
      try {
        $action
      } catch(RangeError) {
        croak("Range Error");
      } catch(DivisionByZero) {
        croak("Division by zero");
      } catch(OutOfMemory) {
        croak("Out of memory");
      } catch(...) {
        croak("Unknown exception");
      }
    }
    
    

    The exception types need to be declared as classes elsewhere, possibly in a header file :

    class RangeError {};
    class DivisionByZero {};
    class OutOfMemory {};
    

    14.1.4 Exception handlers for variables

    By default all variables will ignore %exception, so it is effectively turned off for all variables wrappers. This applies to global variables, member variables and static member variables. The approach is certainly a logical one when wrapping variables in C. However, in C++, it is quite possible for an exception to be thrown while the variable is being assigned. To ensure %exception is used when wrapping variables, it needs to be 'turned on' using the %allowexception feature. Note that %allowexception is just a macro for %feature("allowexcept"), that is, it is a feature called "allowexcept". Any variable which has this feature attached to it, will then use the %exception feature, but of course, only if there is a %exception attached to the variable in the first place. The %allowexception feature works like any other feature and so can be used globally or for selective variables.

    %allowexception;                // turn on globally
    %allowexception Klass::MyVar;   // turn on for a specific variable
    
    %noallowexception Klass::MyVar; // turn off for a specific variable
    %noallowexception;              // turn off globally
    

    14.1.5 Defining different exception handlers

    By default, the %exception directive creates an exception handler that is used for all wrapper functions that follow it. Unless there is a well-defined (and simple) error handling mechanism in place, defining one universal exception handler may be unwieldy and result in excessive code bloat since the handler is inlined into each wrapper function.

    To fix this, you can be more selective about how you use the %exception directive. One approach is to only place it around critical pieces of code. For example:

    %exception {
      ... your exception handler ...
    }
    /* Define critical operations that can throw exceptions here */
    
    %exception;
    
    /* Define non-critical operations that don't throw exceptions */
    

    More precise control over exception handling can be obtained by attaching an exception handler to specific declaration name. For example:

    %exception allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    In this case, the exception handler is only attached to declarations named "allocate". This would include both global and member functions. The names supplied to %exception follow the same rules as for %rename described in the section on Renaming and ambiguity resolution. For example, if you wanted to define an exception handler for a specific class, you might write this:

    %exception Object::allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    When a class prefix is supplied, the exception handler is applied to the corresponding declaration in the specified class as well as for identically named functions appearing in derived classes.

    %exception can even be used to pinpoint a precise declaration when overloading is used. For example:

    %exception Object::allocate(int) {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    Attaching exceptions to specific declarations is a good way to reduce code bloat. It can also be a useful way to attach exceptions to specific parts of a header file. For example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    // Define a few exception handlers for specific declarations
    %exception Object::allocate(int) {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    
    %exception Object::getitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Index out of range");
      }
    }
    ...
    // Read a raw header file
    %include "someheader.h"
    

    Compatibility note: The %exception directive replaces the functionality provided by the deprecated "except" typemap. The typemap would allow exceptions to be thrown in the target language based on the return type of a function and was intended to be a mechanism for pinpointing specific declarations. However, it never really worked that well and the new %exception directive is much better.

    14.1.6 Special variables for %exception

    The %exception directive supports a few special variables which are placeholders for code substitution. The following table shows the available special variables and details what the special variables are replaced with.

    $actionThe actual operation to be performed (a function call, method invocation, variable access, etc.)
    $nameThe C/C++ symbol name for the function.
    $symnameThe symbol name used internally by SWIG
    $overnameThe extra mangling used in the symbol name for overloaded method. Expands to nothing if the wrapped method is not overloaded.
    $wrapnameThe language specific wrapper name (usually a C function name exported from the shared object/dll)
    $declThe fully qualified C/C++ declaration of the method being wrapped without the return type
    $fulldeclThe fully qualified C/C++ declaration of the method being wrapped including the return type
    $parentclassnameThe parent class name (if any) for a method.
    $parentclasssymnameThe target language parent class name (if any) for a method.

    The special variables are often used in situations where method calls are logged. Exactly which form of the method call needs logging is up to individual requirements, but the example code below shows all the possible expansions, plus how an exception message could be tailored to show the C++ method declaration:

    %exception Special::something {
      log("symname: $symname");
      log("overname: $overname");
      log("wrapname: $wrapname");
      log("decl: $decl");
      log("fulldecl: $fulldecl");
      try {
        $action
      } 
      catch (MemoryError) {
        croak("Out of memory in $decl");
      }
    }
    void log(const char *message);
    struct Special {
      void something(const char *c);
      void something(int i);
    };
    

    Below shows the expansions for the 1st of the overloaded something wrapper methods for Perl:

      log("symname: Special_something");
      log("overname: __SWIG_0");
      log("wrapname: _wrap_Special_something__SWIG_0");
      log("decl: Special::something(char const *)");
      log("fulldecl: void Special::something(char const *)");
      try {
        (arg1)->something((char const *)arg2);
      } 
      catch (MemoryError) {
        croak("Out of memory in Special::something(char const *)");
      }
    

    14.1.7 Using The SWIG exception library

    The exception.i library file provides support for creating language independent exceptions in your interfaces. To use it, simply put an "%include exception.i" in your interface file. This provides a function SWIG_exception() that can be used to raise common scripting language exceptions in a portable manner. For example :

    // Language independent exception handler
    %include exception.i       
    
    %exception {
      try {
        $action
      } catch(RangeError) {
        SWIG_exception(SWIG_ValueError, "Range Error");
      } catch(DivisionByZero) {
        SWIG_exception(SWIG_DivisionByZero, "Division by zero");
      } catch(OutOfMemory) {
        SWIG_exception(SWIG_MemoryError, "Out of memory");
      } catch(...) {
        SWIG_exception(SWIG_RuntimeError, "Unknown exception");
      }
    }
    
    

    As arguments, SWIG_exception() takes an error type code (an integer) and an error message string. The currently supported error types are :

    SWIG_UnknownError
    SWIG_IOError
    SWIG_RuntimeError
    SWIG_IndexError
    SWIG_TypeError
    SWIG_DivisionByZero
    SWIG_OverflowError
    SWIG_SyntaxError
    SWIG_ValueError
    SWIG_SystemError
    SWIG_AttributeError
    SWIG_MemoryError
    SWIG_NullReferenceError
    

    The SWIG_exception() function can also be used in typemaps.

    14.2 Object ownership and %newobject

    A common problem in some applications is managing proper ownership of objects. For example, consider a function like this:

    Foo *blah() {
      Foo *f = new Foo();
      return f;
    }
    

    If you wrap the function blah(), SWIG has no idea that the return value is a newly allocated object. As a result, the resulting extension module may produce a memory leak (SWIG is conservative and will never delete objects unless it knows for certain that the returned object was newly created).

    To fix this, you can provide an extra hint to the code generator using the %newobject directive. For example:

    %newobject blah;
    Foo *blah();
    

    %newobject works exactly like %rename and %exception. In other words, you can attach it to class members and parameterized declarations as before. For example:

    %newobject ::blah();                   // Only applies to global blah
    %newobject Object::blah(int, double);  // Only blah(int, double) in Object
    %newobject *::copy;                    // Copy method in all classes
    ...
    

    When %newobject is supplied, many language modules will arrange to take ownership of the return value. This allows the value to be automatically garbage-collected when it is no longer in use. However, this depends entirely on the target language (a language module may also choose to ignore the %newobject directive).

    Closely related to %newobject is a special typemap. The "newfree" typemap can be used to deallocate a newly allocated return value. It is only available on methods for which %newobject has been applied and is commonly used to clean-up string results. For example:

    %typemap(newfree) char * "free($1);";
    ...
    %newobject strdup;
    ...
    char *strdup(const char *s);
    

    In this case, the result of the function is a string in the target language. Since this string is a copy of the original result, the data returned by strdup() is no longer needed. The "newfree" typemap in the example simply releases this memory.

    As a complement to the %newobject, from SWIG 1.3.28, you can use the %delobject directive. For example, if you have two methods, one to create objects and one to destroy them, you can use:

    %newobject create_foo;
    %delobject destroy_foo;
    ...
    Foo *create_foo();
    void destroy_foo(Foo *foo);
    

    or in a member method as:

    %delobject Foo::destroy;
    
    class Foo {
    public:
      void destroy() { delete this;}
    
    private:
      ~Foo();
    };
    

    %delobject instructs SWIG that the first argument passed to the method will be destroyed, and therefore, the target language should not attempt to deallocate it twice. This is similar to use the DISOWN typemap in the first method argument, and in fact, it also depends on the target language on implementing the 'disown' mechanism properly.

    The use of %newobject is also integrated with reference counting and is covered in the C++ reference counted objects section.

    Compatibility note: Previous versions of SWIG had a special %new directive. However, unlike %newobject, it only applied to the next declaration. For example:

    %new char *strdup(const char *s);
    

    For now this is still supported but is deprecated.

    How to shoot yourself in the foot: The %newobject directive is not a declaration modifier like the old %new directive. Don't write code like this:

    %newobject
    char *strdup(const char *s);
    

    The results might not be what you expect.

    14.3 Features and the %feature directive

    Both %exception and %newobject are examples of a more general purpose customization mechanism known as "features." A feature is simply a user-definable property that is attached to specific declarations. Features are attached using the %feature directive. For example:

    %feature("except") Object::allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    
    %feature("new", "1") *::copy;
    

    In fact, the %exception and %newobject directives are really nothing more than macros involving %feature:

    #define %exception %feature("except")
    #define %newobject %feature("new", "1")
    

    The name matching rules outlined in the Renaming and ambiguity resolution section applies to all %feature directives. In fact the %rename directive is just a special form of %feature. The matching rules mean that features are very flexible and can be applied with pinpoint accuracy to specific declarations if needed. Additionally, if no declaration name is given, a global feature is said to be defined. This feature is then attached to every declaration that follows. This is how global exception handlers are defined. For example:

    /* Define a global exception handler */
    %feature("except") {
      try {
        $action
      }
      ...
    }
    
    ... bunch of declarations ...
    

    The %feature directive can be used with different syntax. The following are all equivalent:

    %feature("except") Object::method { $action };
    %feature("except") Object::method %{ $action %};
    %feature("except") Object::method " $action ";
    %feature("except", "$action") Object::method;
    

    The syntax in the first variation will generate the { } delimiters used whereas the other variations will not.

    14.3.1 Feature attributes

    The %feature directive also accepts XML style attributes in the same way that typemaps do. Any number of attributes can be specified. The following is the generic syntax for features:

    %feature("name", "value", attribute1="AttributeValue1") symbol;
    %feature("name", attribute1="AttributeValue1") symbol {value};
    %feature("name", attribute1="AttributeValue1") symbol %{value%};
    %feature("name", attribute1="AttributeValue1") symbol "value";
    

    More than one attribute can be specified using a comma separated list. The Java module is an example that uses attributes in %feature("except"). The throws attribute specifies the name of a Java class to add to a proxy method's throws clause. In the following example, MyExceptionClass is the name of the Java class for adding to the throws clause.

    %feature("except", throws="MyExceptionClass") Object::method { 
      try {
        $action
      } catch (...) {
        ... code to throw a MyExceptionClass Java exception ...
      }
    };
    

    Further details can be obtained from the Java exception handling section.

    14.3.2 Feature flags

    Feature flags are used to enable or disable a particular feature. Feature flags are a common but simple usage of %feature and the feature value should be either 1 to enable or 0 to disable the feature.

    %feature("featurename")          // enables feature
    %feature("featurename", "1")     // enables feature
    %feature("featurename", "x")     // enables feature
    %feature("featurename", "0")     // disables feature
    %feature("featurename", "")      // clears feature
    

    Actually any value other than zero will enable the feature. Note that if the value is omitted completely, the default value becomes 1, thereby enabling the feature. A feature is cleared by specifying no value, see Clearing features. The %immutable directive described in the Creating read-only variables section, is just a macro for %feature("immutable"), and can be used to demonstrates feature flags:

                                    // features are disabled by default
    int red;                        // mutable
    
    %feature("immutable");          // global enable
    int orange;                     // immutable
    
    %feature("immutable", "0");     // global disable
    int yellow;                     // mutable
    
    %feature("immutable", "1");     // another form of global enable
    int green;                      // immutable
    
    %feature("immutable", "");      // clears the global feature
    int blue;                       // mutable
    

    Note that features are disabled by default and must be explicitly enabled either globally or by specifying a targeted declaration. The above intersperses SWIG directives with C code. Of course you can target features explicitly, so the above could also be rewritten as:

    %feature("immutable", "1") orange;
    %feature("immutable", "1") green;
    int red;                        // mutable
    int orange;                     // immutable
    int yellow;                     // mutable
    int green;                      // immutable
    int blue;                       // mutable
    

    The above approach allows for the C declarations to be separated from the SWIG directives for when the C declarations are parsed from a C header file. The logic above can of course be inverted and rewritten as:

    %feature("immutable", "1");
    %feature("immutable", "0") red;
    %feature("immutable", "0") yellow;
    %feature("immutable", "0") blue;
    int red;                        // mutable
    int orange;                     // immutable
    int yellow;                     // mutable
    int green;                      // immutable
    int blue;                       // mutable
    

    As hinted above for %immutable, most feature flags can also be specified via alternative syntax. The alternative syntax is just a macro in the swig.swg Library file. The following shows the alternative syntax for the imaginary featurename feature:

    %featurename       // equivalent to %feature("featurename", "1") ie enables feature
    %nofeaturename     // equivalent to %feature("featurename", "0") ie disables feature
    %clearfeaturename  // equivalent to %feature("featurename", "")  ie clears feature
    

    The concept of clearing features is discussed next.

    14.3.3 Clearing features

    A feature stays in effect until it is explicitly cleared. A feature is cleared by supplying a %feature directive with no value. For example %feature("name", ""). A cleared feature means that any feature exactly matching any previously defined feature is no longer used in the name matching rules. So if a feature is cleared, it might mean that another name matching rule will apply. To clarify, let's consider the except feature again (%exception):

    // Define global exception handler
    %feature("except") {
      try {
        $action
      } catch (...) {
        croak("Unknown C++ exception");
      }
    }
    
    // Define exception handler for all clone methods to log the method calls
    %feature("except") *::clone() {
      try {
        logger.info("$action");
        $action
      } catch (...) {
        croak("Unknown C++ exception");
      }
    }
    
    ... initial set of class declarations with clone methods ...
    
    // clear the previously defined feature
    %feature("except", "") *::clone();
    
    ... final set of class declarations with clone methods ...
    

    In the above scenario, the initial set of clone methods will log all method invocations from the target language. This specific feature is cleared for the final set of clone methods. However, these clone methods will still have an exception handler (without logging) as the next best feature match for them is the global exception handler.

    Note that clearing a feature is not always the same as disabling it. Clearing the feature above with %feature("except", "") *::clone() is not the same as specifying %feature("except", "0") *::clone() . The former will disable the feature for clone methods - the feature is still a better match than the global feature. If on the other hand, no global exception handler had been defined at all, then clearing the feature would be the same as disabling it as no other feature would have matched.

    Note that the feature must match exactly for it to be cleared by any previously defined feature. For example the following attempt to clear the initial feature will not work:

    %feature("except") clone() { logger.info("$action"); $action }
    %feature("except", "") *::clone();
    

    but this will:

    %feature("except") clone() { logger.info("$action"); $action }
    %feature("except", "") clone();
    

    SWIG provides macros for disabling and clearing features. Many of these can be found in the swig.swg library file. The typical pattern is to define three macros; one to define the feature itself, one to disable the feature and one to clear the feature. The three macros below show this for the "except" feature:

    #define %exception      %feature("except")
    #define %noexception    %feature("except", "0")
    #define %clearexception %feature("except", "")
    

    14.3.4 Features and default arguments

    SWIG treats methods with default arguments as separate overloaded methods as detailed in the default arguments section. Any %feature targeting a method with default arguments will apply to all the extra overloaded methods that SWIG generates if the default arguments are specified in the feature. If the default arguments are not specified in the feature, then the feature will match that exact wrapper method only and not the extra overloaded methods that SWIG generates. For example:

    %feature("except") hello(int i=0, double d=0.0) { ... }
    void hello(int i=0, double d=0.0);
    

    will apply the feature to all three wrapper methods, that is:

    void hello(int i, double d);
    void hello(int i);
    void hello();
    

    If the default arguments are not specified in the feature:

    %feature("except") hello(int i, double d) { ... }
    void hello(int i=0, double d=0.0);
    

    then the feature will only apply to this wrapper method:

    void hello(int i, double d);
    

    and not these wrapper methods:

    void hello(int i);
    void hello();
    

    If compactdefaultargs are being used, then the difference between specifying or not specifying default arguments in a feature is not applicable as just one wrapper is generated.

    Compatibility note: The different behaviour of features specified with or without default arguments was introduced in SWIG-1.3.23 when the approach to wrapping methods with default arguments was changed.

    14.3.5 Feature example

    As has been shown earlier, the intended use for the %feature directive is as a highly flexible customization mechanism that can be used to annotate declarations with additional information for use by specific target language modules. Another example is in the Python module. You might use %feature to rewrite proxy/shadow class code as follows:

    %module example
    %rename(bar_id) bar(int, double);
    
    // Rewrite bar() to allow some nice overloading
    
    %feature("shadow") Foo::bar(int) %{
    def bar(*args):
        if len(args) == 3:
            return apply(examplec.Foo_bar_id, args)
        return apply(examplec.Foo_bar, args)
    %}
        
    class Foo {
    public:
      int bar(int x);
      int bar(int x, double y);
    }
    

    Further details of %feature usage is described in the documentation for specific language modules.


    15 Contracts

    A common problem that arises when wrapping C libraries is that of maintaining reliability and checking for errors. The fact of the matter is that many C programs are notorious for not providing error checks. Not only that, when you expose the internals of an application as a library, it often becomes possible to crash it simply by providing bad inputs or using it in a way that wasn't intended.

    This chapter describes SWIG's support for software contracts. In the context of SWIG, a contract can be viewed as a runtime constraint that is attached to a declaration. For example, you can easily attach argument checking rules, check the output values of a function and more. When one of the rules is violated by a script, a runtime exception is generated rather than having the program continue to execute.

    15.1 The %contract directive

    Contracts are added to a declaration using the %contract directive. Here is a simple example:

    %contract sqrt(double x) {
    require:
      x >= 0;
    ensure:
      sqrt >= 0;
    }
    
    ...
    double sqrt(double);
    

    In this case, a contract is being added to the sqrt() function. The %contract directive must always appear before the declaration in question. Within the contract there are two sections, both of which are optional. The require: section specifies conditions that must hold before the function is called. Typically, this is used to check argument values. The ensure: section specifies conditions that must hold after the function is called. This is often used to check return values or the state of the program. In both cases, the conditions that must hold must be specified as boolean expressions.

    In the above example, we're simply making sure that sqrt() returns a non-negative number (if it didn't, then it would be broken in some way).

    Once a contract has been specified, it modifies the behavior of the resulting module. For example:

    >>> example.sqrt(2)
    1.4142135623730951
    >>> example.sqrt(-2)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    RuntimeError: Contract violation: require: (arg1>=0)
    >>>
    

    15.2 %contract and classes

    The %contract directive can also be applied to class methods and constructors. For example:

    %contract Foo::bar(int x, int y) {
    require:
      x > 0;
    ensure:
      bar > 0;
    }
    
    %contract Foo::Foo(int a) {
    require:
      a > 0;
    }
    
    class Foo {
    public:
      Foo(int);
      int bar(int, int);
    };
    

    The way in which %contract is applied is exactly the same as the %feature directive. Thus, any contract that you specified for a base class will also be attached to inherited methods. For example:

    class Spam : public Foo {
    public:
      int bar(int, int);    // Gets contract defined for Foo::bar(int, int)
    };
    

    In addition to this, separate contracts can be applied to both the base class and a derived class. For example:

    %contract Foo::bar(int x, int) {
    require:
      x > 0;
    }
    
    %contract Spam::bar(int, int y) {
    require:
      y > 0;
    }
    
    class Foo {
    public:
      int bar(int, int);   // Gets Foo::bar contract.
    };
    
    class Spam : public Foo {
    public:
      int bar(int, int);   // Gets Foo::bar and Spam::bar contract
    };
    

    When more than one contract is applied, the conditions specified in a "require:" section are combined together using a logical-AND operation. In other words conditions specified for the base class and conditions specified for the derived class all must hold. In the above example, this means that both the arguments to Spam::bar must be positive.

    15.3 Constant aggregation and %aggregate_check

    Consider an interface file that contains the following code:

    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    One thing you might want to do is impose a constraint on the direction parameter to make sure it's one of a few accepted values. To do that, SWIG provides an easy to use macro %aggregate_check() that works like this:

    %aggregate_check(int, check_direction, UP, DOWN, LEFT, RIGHT);
    

    This merely defines a utility function of the form

    int check_direction(int x);
    

    That checks the argument x to see if it is one of the values listed. This utility function can be used in contracts. For example:

    %aggregate_check(int, check_direction, UP, DOWN, RIGHT, LEFT);
    
    %contract move(SomeObject *, int direction, in) {
    require:
      check_direction(direction);
    }
    
    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    Alternatively, it can be used in typemaps and other directives. For example:

    %aggregate_check(int, check_direction, UP, DOWN, RIGHT, LEFT);
    
    %typemap(check) int direction {
      if (!check_direction($1)) SWIG_exception(SWIG_ValueError, "Bad direction");
    }
    
    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    Regrettably, there is no automatic way to perform similar checks with enums values. Maybe in a future release.

    15.4 Notes

    Contract support was implemented by Songyan (Tiger) Feng and first appeared in SWIG-1.3.20.


    16 Variable Length Arguments

    (a.k.a, "The horror. The horror.")

    This chapter describes the problem of wrapping functions that take a variable number of arguments. For instance, generating wrappers for the C printf() family of functions.

    This topic is sufficiently advanced to merit its own chapter. In fact, support for varargs is an often requested feature that was first added in SWIG-1.3.12. Most other wrapper generation tools have wisely chosen to avoid this issue.

    16.1 Introduction

    Some C and C++ programs may include functions that accept a variable number of arguments. For example, most programmers are familiar with functions from the C library such as the following:

    int printf(const char *fmt, ...)
    int fprintf(FILE *, const char *fmt, ...);
    int sprintf(char *s, const char *fmt, ...);
    

    Although there is probably little practical purpose in wrapping these specific C library functions in a scripting language (what would be the point?), a library may include its own set of special functions based on a similar API. For example:

    int  traceprintf(const char *fmt, ...);
    

    In this case, you may want to have some kind of access from the target language.

    Before describing the SWIG implementation, it is important to discuss the common uses of varargs that you are likely to encounter in real programs. Obviously, there are the printf() style output functions as shown. Closely related to this would be scanf() style input functions that accept a format string and a list of pointers into which return values are placed. However, variable length arguments are also sometimes used to write functions that accept a NULL-terminated list of pointers. A good example of this would be a function like this:

    int execlp(const char *path, const char *arg1, ...);
    ...
    
    /* Example */
    execlp("ls", "ls", "-l", NULL);
    

    In addition, varargs is sometimes used to fake default arguments in older C libraries. For instance, the low level open() system call is often declared as a varargs function so that it will accept two or three arguments:

    int open(const char *path, int oflag, ...);
    ...
    
    /* Examples */
    f = open("foo", O_RDONLY);
    g = open("bar", O_WRONLY | O_CREAT, 0644);
    

    Finally, to implement a varargs function, recall that you have to use the C library functions defined in <stdarg.h>. For example:

    List make_list(const char *s, ...) {
      va_list ap;
      List    x;
      ...
      va_start(ap, s);
      while (s) {
        x.append(s);
        s = va_arg(ap, const char *);
      }
      va_end(ap);
      return x;
    }
    

    16.2 The Problem

    Generating wrappers for a variable length argument function presents a number of special challenges. Although C provides support for implementing functions that receive variable length arguments, there are no functions that can go in the other direction. Specifically, you can't write a function that dynamically creates a list of arguments and which invokes a varargs function on your behalf.

    Although it is possible to write functions that accept the special type va_list, this is something entirely different. You can't take a va_list structure and pass it in place of the variable length arguments to another varargs function. It just doesn't work.

    The reason this doesn't work has to do with the way that function calls get compiled. For example, suppose that your program has a function call like this:

    printf("Hello %s. Your number is %d\n", name, num);
    

    When the compiler looks at this, it knows that you are calling printf() with exactly three arguments. Furthermore, it knows that the number of arguments as well are their types and sizes is never going to change during program execution. Therefore, this gets turned to machine code that sets up a three-argument stack frame followed by a call to printf().

    In contrast, suppose you attempted to make some kind of wrapper around printf() using code like this:

    int wrap_printf(const char *fmt, ...) {
      va_list ap;
      va_start(ap, fmt);
      ...
      printf(fmt, ap);
      ...
      va_end(ap);
    };
    

    Although this code might compile, it won't do what you expect. This is because the call to printf() is compiled as a procedure call involving only two arguments. However, clearly a two-argument configuration of the call stack is completely wrong if your intent is to pass an arbitrary number of arguments to the real printf(). Needless to say, it won't work.

    Unfortunately, the situation just described is exactly the problem faced by wrapper generation tools. In general, the number of passed arguments will not be known until run-time. To make matters even worse, you won't know the types and sizes of arguments until run-time as well. Needless to say, there is no obvious way to make the C compiler generate code for a function call involving an unknown number of arguments of unknown types.

    In theory, it is possible to write a wrapper that does the right thing. However, this involves knowing the underlying ABI for the target platform and language as well as writing special purpose code that manually constructed the call stack before making a procedure call. Unfortunately, both of these tasks require the use of inline assembly code. Clearly, that's the kind of solution you would much rather avoid.

    With this nastiness in mind, SWIG provides a number of solutions to the varargs wrapping problem. Most of these solutions are compromises that provide limited varargs support without having to resort to assembly language. However, SWIG can also support real varargs wrapping (with stack-frame manipulation) if you are willing to get hands dirty. Keep reading.

    16.3 Default varargs support

    When variable length arguments appear in an interface, the default behavior is to drop the variable argument list entirely, replacing them with a single NULL pointer. For example, if you had this function,

    void traceprintf(const char *fmt, ...);
    

    it would be wrapped as if it had been declared as follows:

    void traceprintf(const char *fmt);
    

    When the function is called inside the wrappers, it is called as follows:

    traceprintf(arg1, NULL);
    

    Arguably, this approach seems to defeat the whole point of variable length arguments. However, this actually provides enough support for many simple kinds of varargs functions to still be useful, however it does come with a caveat. For instance, you could make function calls like this (in Python):

    >>> traceprintf("Hello World")
    >>> traceprintf("Hello %s. Your number is %d\n" % (name, num))
    >>> traceprintf("Your result is 90%%.")
    

    Notice how string formatting is being done in Python instead of C. The caveat is the strings passed must be safe to use in C though. For example if name was to contain a "%" it should be double escaped in order to avoid unpredictable behaviour:

    >>> traceprintf("Your result is 90%.\n")  # unpredictable behaviour
    >>> traceprintf("Your result is 90%%.\n") # good
    

    Read on for further solutions.

    16.4 Argument replacement using %varargs

    Instead of dropping the variable length arguments, an alternative approach is to replace (...) with a set of suitable arguments. SWIG provides a special %varargs directive that can be used to do this. For example,

    %varargs(int mode = 0) open;
    ...
    int open(const char *path, int oflags, ...);
    

    is equivalent to this:

    int open(const char *path, int oflags, int mode = 0);
    

    In this case, %varargs is simply providing more specific information about the extra arguments that might be passed to a function. If the arguments to a varargs function are of uniform type, %varargs can also accept a numerical argument count as follows:

    %varargs(3, char *str = NULL) execlp;
    ...
    int execlp(const char *path, const char *arg, ...);
    

    and is effectively seen as:

    int execlp(const char *path, const char *arg, 
               char *str1 = NULL, 
               char *str2 = NULL, 
               char *str3 = NULL);
    

    This would wrap execlp() as a function that accepted up to 3 optional arguments. Depending on the application, this may be more than enough for practical purposes.

    The handling of default arguments can be changed via the compactdefaultargs feature. If this feature is used, for example

    %feature("compactdefaultargs") execlp;
    %varargs(3, char *str = NULL) execlp;
    ...
    int execlp(const char *path, const char *arg, ...);
    

    a call from the target language which does not provide the maximum number of arguments, such as, execlp("a", "b", "c") will generate C code which includes the missing default values, that is, execlp("a", "b", "c", NULL, NULL). If compactdefaultargs is not used, then the generated code will be execlp("a", "b", "c") . The former is useful for helping providing a sentinel to terminate the argument list. However, this is not guaranteed, for example when a user passes a non-NULL value for all the parameters. When using compactdefaultargs it is possible to guarantee the NULL sentinel is passed through the, numinputs=0 'in' typemap attribute, naming the last parameter. For example,

    %feature("compactdefaultargs") execlp;
    %varargs(3, char *str = NULL) execlp;
    %typemap(in, numinputs=0) char *str3 ""
    ...
    int execlp(const char *path, const char *arg, ...);
    

    Note that str3 is the name of the last argument, as we have used %varargs with 3. Now execlp("a", "b", "c", "d", "e") will result in an error as one too many arguments has been passed, as now only 2 additional 'str' arguments can be passed with the 3rd one always using the specified default NULL.

    Argument replacement is most appropriate in cases where the types of the extra arguments are uniform and the maximum number of arguments are known. Argument replacement is not as useful when working with functions that accept mixed argument types such as printf(). Providing general purpose wrappers to such functions presents special problems (covered shortly).

    16.5 Varargs and typemaps

    Variable length arguments may be used in typemap specifications. For example:

    %typemap(in) (...) {
      // Get variable length arguments (somehow)
      ...
    }
    
    %typemap(in) (const char *fmt, ...) {
        // Multi-argument typemap
    }
    

    However, this immediately raises the question of what "type" is actually used to represent (...). For lack of a better alternative, the type of (...) is set to void *. Since there is no way to dynamically pass arguments to a varargs function (as previously described), the void * argument value is intended to serve as a place holder for storing some kind of information about the extra arguments (if any). In addition, the default behavior of SWIG is to pass the void * value as an argument to the function. Therefore, you could use the pointer to hold a valid argument value if you wanted.

    To illustrate, here is a safer version of wrapping printf() in Python:

    %typemap(in) (const char *fmt, ...) {
        $1 = "%s";                                /* Fix format string to %s */
        $2 = (void *) PyString_AsString($input);  /* Get string argument */
    };
    ...
    int printf(const char *fmt, ...);
    

    In this example, the format string is implicitly set to "%s" . This prevents a program from passing a bogus format string to the extension. Then, the passed input object is decoded and placed in the void * argument defined for the (...) argument. When the actual function call is made, the underlying wrapper code will look roughly like this:

    wrap_printf() {
      char *arg1;
      void *arg2;
      int   result;
    
      arg1 = "%s";
      arg2 = (void *) PyString_AsString(arg2obj);
      ...
      result = printf(arg1, arg2);
      ...
    }
    

    Notice how both arguments are passed to the function and it does what you would expect.

    The next example illustrates a more advanced kind of varargs typemap. Disclaimer: this requires special support in the target language module and is not guaranteed to work with all SWIG modules at this time. It also starts to illustrate some of the more fundamental problems with supporting varargs in more generality.

    If a typemap is defined for any form of (...), many SWIG modules will generate wrappers that accept a variable number of arguments as input and will make these arguments available in some form. The precise details of this depends on the language module being used (consult the appropriate chapter for more details). However, suppose that you wanted to create a Python wrapper for the execlp() function shown earlier. To do this using a typemap instead of using %varargs, you might first write a typemap like this:

    %typemap(in) (...)(char *vargs[10]) {
      int i;
      int argc;
      for (i = 0; i < 10; i++) vargs[i] = 0;
      argc = PyTuple_Size(varargs);
      if (argc > 10) {
        PyErr_SetString(PyExc_ValueError, "Too many arguments");
        SWIG_fail;
      }
      for (i = 0; i < argc; i++) {
        PyObject *pyobj = PyTuple_GetItem(varargs, i);
        char *str = 0;
    %#if PY_VERSION_HEX>=0x03000000
        PyObject *pystr;
        if (!PyUnicode_Check(pyobj)) {
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        pystr = PyUnicode_AsUTF8String(pyobj);
        if (!pystr) {
          SWIG_fail;
        }
        str = strdup(PyBytes_AsString(pystr));
        Py_DECREF(pystr);
    %#else  
        if (!PyString_Check(pyobj)) {
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        str = PyString_AsString(pyobj);
    %#endif
        vargs[i] = str;
      }
      $1 = (void *)vargs;
    }
    
    %typemap(freearg) (...) {
    %#if PY_VERSION_HEX>=0x03000000
      int i;
      for (i = 0; i < 10; i++) {
        free(vargs$argnum[i]);
      }
    %#endif
    }
    

    In the 'in' typemap, the special variable varargs is a tuple holding all of the extra arguments passed (this is specific to the Python module). The typemap then pulls this apart and sticks the values into the array of strings args. Then, the array is assigned to $1 (recall that this is the void * variable corresponding to (...)). However, this assignment is only half of the picture----clearly this alone is not enough to make the function work. The 'freearg' typemap cleans up memory allocated in the 'in' typemap; this code is generated to be called after the execlp function is called. To patch everything up, you have to rewrite the underlying action code using the %feature directive like this:

    %feature("action") execlp {
      char **vargs = (char **) arg3;
      result = execlp(arg1, arg2, vargs[0], vargs[1], vargs[2], vargs[3], vargs[4],
                      vargs[5], vargs[6], vargs[7], vargs[8], vargs[9], NULL);
    }
    
    int execlp(const char *path, const char *arg, ...);
    

    This patches everything up and creates a function that more or less works. However, don't try explaining this to your coworkers unless you know for certain that they've had several cups of coffee. If you really want to elevate your guru status and increase your job security, continue to the next section.

    16.6 Varargs wrapping with libffi

    All of the previous examples have relied on features of SWIG that are portable and which don't rely upon any low-level machine-level details. In many ways, they have all dodged the real issue of variable length arguments by recasting a varargs function into some weaker variation with a fixed number of arguments of known types. In many cases, this works perfectly fine. However, if you want more generality than this, you need to bring out some bigger guns.

    One way to do this is to use a special purpose library such as libffi ( http://www.sourceware.org/libffi/). libffi is a library that allows you to dynamically construct call-stacks and invoke procedures in a relatively platform independent manner. Details about the library can be found in the libffi distribution and are not repeated here.

    To illustrate the use of libffi, suppose that you really wanted to create a wrapper for execlp() that accepted any number of arguments. To do this, you might make a few adjustments to the previous example. For example:

    /* Take an arbitrary number of extra arguments and place into an array
       of strings */
    
    %typemap(in) (...) {
      char **argv;
      int    argc;
      int    i;
    
      argc = PyTuple_Size(varargs);
      argv = (char **) malloc(sizeof(char *)*(argc+1));
      for (i = 0; i < argc; i++) {
        PyObject *o = PyTuple_GetItem(varargs, i);
        if (!PyString_Check(o)) {
          free(argv);
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        argv[i] = PyString_AsString(o);
      }
      argv[i] = NULL;
      $1 = (void *) argv;
    }
    
    /* Rewrite the function call, using libffi */    
    
    %feature("action") execlp {
      int       i, vc;
      ffi_cif   cif;
      ffi_type  **types;
      void      **values;
      char      **args;
    
      vc = PyTuple_Size(varargs);
      types  = (ffi_type **) malloc((vc+3)*sizeof(ffi_type *));
      values = (void **) malloc((vc+3)*sizeof(void *));
      args   = (char **) arg3;
    
      /* Set up path parameter */
      types[0] = &ffi_type_pointer;
      values[0] = &arg1;
      
      /* Set up first argument */
      types[1] = &ffi_type_pointer;
      values[1] = &arg2;
    
      /* Set up rest of parameters */
      for (i = 0; i <= vc; i++) {
        types[2+i] = &ffi_type_pointer;
        values[2+i] = &args[i];
      }
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, vc+3,
                       &ffi_type_uint, types) == FFI_OK) {
        ffi_call(&cif, (void (*)()) execlp, &result, values);
      } else {
        free(types);
        free(values);
        free(arg3);
        PyErr_SetString(PyExc_RuntimeError, "Whoa!!!!!");
        SWIG_fail;
      }
      free(types);
      free(values);
      free(arg3);
    }
    
    /* Declare the function. Whew! */
    int execlp(const char *path, const char *arg1, ...);
    

    Looking at this example, you may start to wonder if SWIG is making life any easier. Given the amount of code involved, you might also wonder why you didn't just write a hand-crafted wrapper! Either that or you're wondering "why in the hell am I trying to wrap this varargs function in the first place?!?" Obviously, those are questions you'll have to answer for yourself.

    As a more extreme example of libffi, here is some code that attempts to wrap printf(),

    /* A wrapper for printf() using libffi */
    
    %{
    /* Structure for holding passed arguments after conversion */
      typedef struct {
        int type;
        union {
          int    ivalue;
          double dvalue;
          void   *pvalue;
        } val;
      } vtype;
      enum { VT_INT, VT_DOUBLE, VT_POINTER };
    %}
    
    %typemap(in) (const char *fmt, ...) {
      vtype *argv;
      int    argc;
      int    i;
    
      /* Format string */
      $1 = PyString_AsString($input);
    
      /* Variable length arguments */
      argc = PyTuple_Size(varargs);
      argv = (vtype *) malloc(argc*sizeof(vtype));
      for (i = 0; i < argc; i++) {
        PyObject *o = PyTuple_GetItem(varargs, i);
        if (PyInt_Check(o)) {
          argv[i].type = VT_INT;
          argv[i].val.ivalue = PyInt_AsLong(o);
        } else if (PyFloat_Check(o)) {
          argv[i].type = VT_DOUBLE;
          argv[i].val.dvalue = PyFloat_AsDouble(o);
        } else if (PyString_Check(o)) {
          argv[i].type = VT_POINTER;
          argv[i].val.pvalue = (void *) PyString_AsString(o);
        } else {
          free(argv);
          PyErr_SetString(PyExc_ValueError, "Unsupported argument type");
          return NULL;
        }
      }
      $2 = (void *) argv;
    }
    
    /* Rewrite the function call using libffi */    
    %feature("action") printf {
      int       i, vc;
      ffi_cif   cif;
      ffi_type  **types;
      void      **values;
      vtype     *args;
    
      vc = PyTuple_Size(varargs);
      types  = (ffi_type **) malloc((vc+1)*sizeof(ffi_type *));
      values = (void **) malloc((vc+1)*sizeof(void *));
      args   = (vtype *) arg2;
    
      /* Set up fmt parameter */
      types[0] = &ffi_type_pointer;
      values[0] = &arg1;
    
      /* Set up rest of parameters */
      for (i = 0; i < vc; i++) {
        switch(args[i].type) {
        case VT_INT:
          types[1+i] = &ffi_type_uint;
          values[1+i] = &args[i].val.ivalue;
          break;
        case VT_DOUBLE:
          types[1+i] = &ffi_type_double;
          values[1+i] = &args[i].val.dvalue;
          break;
        case VT_POINTER:
          types[1+i] = &ffi_type_pointer;
          values[1+i] = &args[i].val.pvalue;
          break;
        default:
          abort();    /* Whoa! We're seriously hosed */
          break;   
        }
      }
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, vc+1,
                       &ffi_type_uint, types) == FFI_OK) {
        ffi_call(&cif, (void (*)()) printf, &result, values);
      } else {
        free(types);
        free(values);
        free(args);
        PyErr_SetString(PyExc_RuntimeError, "Whoa!!!!!");
        SWIG_fail;
      }
      free(types);
      free(values);
      free(args);
    }
    
    /* The function */
    int printf(const char *fmt, ...);
    

    Much to your amazement, it even seems to work if you try it:

    >>> import example
    >>> example.printf("Grade: %s   %d/60 = %0.2f%%\n", "Dave", 47, 47.0*100/60)
    Grade: Dave   47/60 = 78.33%
    >>>
    

    Of course, there are still some limitations to consider:

    >>> example.printf("la de da de da %s", 42)
    Segmentation fault (core dumped)
    

    And, on this note, we leave further exploration of libffi to the reader as an exercise. Although Python has been used as an example, most of the techniques in this section can be extrapolated to other language modules with a bit of work. The only details you need to know is how the extra arguments are accessed in each target language. For example, in the Python module, we used the special varargs variable to get these arguments. Modules such as Tcl8 and Perl5 simply provide an argument number for the first extra argument. This can be used to index into an array of passed arguments to get values. Please consult the chapter on each language module for more details.

    16.7 Wrapping of va_list

    Closely related to variable length argument wrapping, you may encounter functions that accept a parameter of type va_list. For example:

    int vprintf(const char *fmt, va_list ap);
    

    As far as we know, there is no obvious way to wrap these functions with SWIG. This is because there is no documented way to assemble the proper va_list structure (there are no C library functions to do it and the contents of va_list are opaque). Not only that, the contents of a va_list structure are closely tied to the underlying call-stack. It's not clear that exporting a va_list would have any use or that it would work at all.

    A workaround can be implemented by writing a simple varargs C wrapper and then using the techniques discussed earlier in this chapter for varargs. Below is a simple wrapper for vprintf renamed so that it can still be called as vprintf from your target language. The %varargs used in the example restricts the function to taking one string argument.

    %{
    int vprintf(const char *fmt, va_list ap);
    %}
    
    %varargs(const char *) my_vprintf;
    %rename(vprintf) my_vprintf;
    
    %inline %{
    int my_vprintf(const char *fmt, ...) {
      va_list ap;
      int result;
    
      va_start(ap, fmt);
      result = vprintf(fmt, ap);
      va_end(ap);
      return result;
    }
    %}
    

    16.8 C++ Issues

    Wrapping of C++ member functions that accept a variable number of arguments presents a number of challenges. By far, the easiest way to handle this is to use the %varargs directive. This is portable and it fully supports classes much like the %rename directive. For example:

    %varargs (10, char * = NULL) Foo::bar;
    
    class Foo {
    public:
      virtual void bar(char *arg, ...);   // gets varargs above
    };
    
    class Spam: public Foo {
    public:
      virtual void bar(char *arg, ...);   // gets varargs above
    };
    

    %varargs also works with constructors, operators, and any other C++ programming construct that accepts variable arguments.

    Doing anything more advanced than this is likely to involve a serious world of pain. In order to use a library like libffi, you will need to know the underlying calling conventions and details of the C++ ABI. For instance, the details of how this is passed to member functions as well as any hidden arguments that might be used to pass additional information. These details are implementation specific and may differ between compilers and even different versions of the same compiler. Also, be aware that invoking a member function is further complicated if it is a virtual method. In this case, invocation might require a table lookup to obtain the proper function address (although you might be able to obtain an address by casting a bound pointer to a pointer to function as described in the C++ ARM section 18.3.4).

    If you do decide to change the underlying action code, be aware that SWIG always places the this pointer in arg1. Other arguments are placed in arg2, arg3, and so forth. For example:

    %feature("action") Foo::bar {
      ...
      result = arg1->bar(arg2, arg3, etc.);
      ...
    }
    

    Given the potential to shoot yourself in the foot, it is probably easier to reconsider your design or to provide an alternative interface using a helper function than it is to create a fully general wrapper to a varargs C++ member function.

    16.9 Discussion

    This chapter has provided a number of techniques that can be used to address the problem of variable length argument wrapping. If you care about portability and ease of use, the %varargs directive is probably the easiest way to tackle the problem. However, using typemaps, it is possible to do some very advanced kinds of wrapping.

    One point of discussion concerns the structure of the libffi examples in the previous section. Looking at that code, it is not at all clear that this is the easiest way to solve the problem. However, there are a number of subtle aspects of the solution to consider--mostly concerning the way in which the problem has been decomposed. First, the example is structured in a way that tries to maintain separation between wrapper-specific information and the declaration of the function itself. The idea here is that you might structure your interface like this:

    %typemap(const char *fmt, ...) {
      ...
    }
    %feature("action") traceprintf {
      ...
    }
    
    /* Include some header file with traceprintf in it */
    %include "someheader.h"
    

    Second, careful scrutiny will reveal that the typemaps involving (...) have nothing whatsoever to do with the libffi library. In fact, they are generic with respect to the way in which the function is actually called. This decoupling means that it will be much easier to consider other library alternatives for making the function call. For instance, if libffi wasn't supported on a certain platform, you might be able to use something else instead. You could use conditional compilation to control this:

    #ifdef USE_LIBFFI
    %feature("action") printf {
      ...
    }
    #endif
    #ifdef USE_OTHERFFI
    %feature("action") printf {
    ...
    }
    #endif
    

    Finally, even though you might be inclined to just write a hand-written wrapper for varargs functions, the techniques used in the previous section have the advantage of being compatible with all other features of SWIG such as exception handling.

    As a final word, some C programmers seem to have the assumption that the wrapping of variable length argument functions is an easily solved problem. However, this section has hopefully dispelled some of these myths. All things being equal, you are better off avoiding variable length arguments if you can. If you can't avoid them, please consider some of the simple solutions first. If you can't live with a simple solution, proceed with caution. At the very least, make sure you carefully read the section "A7.3.2 Function Calls" in Kernighan and Ritchie and make sure you fully understand the parameter passing conventions used for varargs. Also, be aware of the platform dependencies and reliability issues that this will introduce. Good luck.


    17 SWIG and Doxygen Translation

    This chapter describes SWIG's support for translating Doxygen comments found in interface and header files into a target language's normal documentation language. Currently only Javadoc and Pydoc is supported.

    17.1 Doxygen translation overview

    The Doxygen Translation module of SWIG adds an extra layer of functionality to SWIG, allowing automated translation of Doxygen formatted comments from input files into a documentation language more suited for the target language. Currently this module only translates into Javadoc and Pydoc for the SWIG Java and Python modules. Other extensions could be added at a later date. The Doxygen Translation module originally started as a Google Summer of Code proposal from Summer 2008.

    17.2 Preparations

    To make use of the comment translation system, your documentation comments must be in properly formatted Doxygen. Doxygen comments can be present in your main SWIG interface file or any header file that it imports. You are advised to be validate that your comments compile properly with Doxygen before you try to translate them. Doxygen itself is a more comprehensive tool and can provide you better feedback for correcting any syntax errors that may be present. Please look at Doxygen's Documenting the code for the full comment format specifications. However, SWIG's Doxygen parser will still report many errors and warnings found in comments (like unterminated strings or missing ending tags).

    Currently, the whole subset of Doxygen comment styles is supported (See Documenting the code). Here they are:

    /**
     * Javadoc style comment, multiline
     */
    /*!
     * QT-style comment, multiline
     */
    /**
     Any of the above, but without intermediate *'s
     */
    /// Single-line comment
    //! Another single-line comment
    

    Also any of the above with '<' added after comment-starting symbol, like /**<, /*!<, ///<, or //!< will be treated as a post-comment and will be assigned to the code before the comment. Any number of '*' or '/' within a Doxygen comment is considered to be a separator and is not included in the final comment, so you may safely use comments like /*********/ or //////////.

    Please note, as SWIG parses the input file by itself with strict grammar, there is only a limited support for various cases of comment placement in the file.

    Comments can be placed before C/C++ expressions on separate lines:

    /**
     * Some comment
     */
    void someOtherFunction();
    /**
     * Some comment
     */
    void someFunction();
    
    class Shape {
      /*
       * Calculate the area in cm^2
       */
      int getArea();
    }
    

    After C/C++ expressions at the end of the line:

    int someVariable = 9; ///< This is a var holding magic number 9
    void doNothing(); ///< This does nothing, nop
    

    and in some special cases, like function parameter comments:

    void someFunction(
             int a ///< Some parameter 
         );
    

    or enum element comments:

    enum E_NUMBERS
    {
        EN_ZERO, ///< The first enum item, gets zero as it's value
        EN_ONE, ///< The second, EN_ONE=1
        EN_THREE
    };
    

    Currently only comments directly before or after the code items are supported. Doxygen also supports comments containing structural commands, where the comments for a code item are not put directly before or after the code item. These structural commands are stripped out by SWIG and are not assigned to anything.

    17.2.1 Enabling Doxygen translation

    Doxygen comments translation is disabled by default and needs to be explicitly enabled using the command line -doxygen option for the languages that do support it (currently Java and Python).

    17.2.2 Doxygen-specific %feature directives

    Translation of Doxygen comments is influenced by the following %feature directives:

    17.2.2.1 doxygen:notranslate

    Turns off translation of Doxygen comments to the target language syntax: the original comment will be copied to the output unchanged. This is useful if you want to use Doxygen itself to generate documentation for the target language instead of the corresponding language tool (javadoc, sphinx, ...).

    17.2.2.2 doxygen:alias:<command-name>

    Specify an alias for a Doxygen command with the given name. This can be useful for custom Doxygen commands which can be defined using ALIASES option for Doxygen itself but which are unknown to SWIG. "command-name" is the name of the command in the Doxyfile, e.g. if it contains

    ALIASES = "sideeffect=\par Side Effects:\n"
    

    Then you could also specify the same expansion for SWIG with:

    %feature("doxygen:alias:sideeffect") "\par Side Effects:\n"
    

    Please note that command arguments are not currently supported with this feature.

    Notice that it is perfectly possible and potentially useful to define the alias expansion differently depending on the target language, e.g. with

    #ifdef SWIGJAVA
    %feature("doxygen:alias:not_for_java") "This functionality is not available for Java"
    #else
    %feature("doxygen:alias:not_for_java") ""
    #endif
    

    you could use @not_for_java in the documentation comments of all functions which can't, for whatever reason, be currently exposed in Java wrappers of the C++ API.

    17.2.2.3 doxygen:ignore:<command-name>

    This feature makes it possible to just ignore an unknown Doxygen command, instead of replacing it with the predefined text that doxygen:alias does. For example, you could use

    %feature("doxygen:ignore:transferfull") Fantastic();
    /**
        A fantastic function.
    
        @transferfull Command ignored, but anything here is still included.
     */
    int * Fantastic();
    

    if you use a custom Doxygen transferfull command to indicate that the return value ownership is transferred to the caller, as this information doesn't make much sense for the other languages without explicit ownership management.

    Doxygen syntax is rather rich and, in addition to simple commands such as @transferfull, it is also possible to define commands with arguments. As explained in Doxygen documentation, the arguments can have a range of a single word, everything until the end of line or everything until the end of the next paragraph. Currently, only the "end of line" case is supported using the range="line" argument of the feature directive:

    // Ignore occurrences of
    //
    //    @compileroptions Some special C++ compiler options.
    //
    // in Doxygen comments as C++ options are not interesting for the target language
    // developers.
    %feature("doxygen:ignore:compileroptions", range="line") Amazing();
    
    /**
        An amazing function.
    
        @compileroptions This function must be compiled with /EHa when using MSVC.
     */
    void Amazing();
    
    

    In addition, it is also possible to have custom pairs of begin/end tags, similarly to the standard Doxygen @code/@endcode, for example. Such tags can also be ignored using the special value of range starting with end to indicate that the range is an interval, for example:

    %feature("doxygen:ignore:forcpponly", range="end"); // same as "end:endforcpponly"
    /**
        An incredible function.
    
        @forcpponly
        This is C++-specific.
        @endforcpponly
     */
    void Incredible();
    

    would ignore everything between @forcpponly and @endforcpponly commands in Doxygen comments. By default, the name of the end command is the same as of the start one with "end" prefix, following Doxygen conventions, but this can be overridden by providing the end command name after the colon.

    This example shows how custom tags can be used to bracket anything specific to C++ and prevent it from appearing in the target language documentation. Conversely, another pair of custom tags could be used to put target language specific information in the C++ comments. In this case, only the custom tags themselves should be ignored, but their contents should be parsed as usual and contents="parse" can be used for this:

    %feature("doxygen:ignore:beginPythonOnly", range="end:endPythonOnly", contents="parse");
    /**
        A splendid function.
    
        @beginPythonOnly
        This is specific to @b Python.
        @endPythonOnly
     */
    void Splendid();
    
    

    Putting everything together, if these directives are in effect:

    %feature("doxygen:ignore:transferfull");
    %feature("doxygen:ignore:compileroptions", range="line");
    %feature("doxygen:ignore:forcpponly", range="end");
    %feature("doxygen:ignore:beginPythonOnly", range="end:endPythonOnly", contents="parse");
    

    then the following C++ Doxygen comment:

    /**
        A contrived example of ignoring too many commands in one comment.
    
        @forcpponly
        This is C++-specific.
        @endforcpponly
    
        @beginPythonOnly
        This is specific to @b Python.
        @endPythonOnly
    
        @transferfull Command ignored, but anything here is still included.
    
        @compileroptions This function must be compiled with /EHa when using MSVC.
     */
    int * Contrived();
    

    would be translated to this comment in Python:

    def func():
        r"""
        A contrived example of ignoring too many commands in one comment.
    
        This is specific to **Python**.
    
        Command ignored, but anything here is still included.
        """
        ...
    

    17.2.2.4 doxygen:nolinktranslate

    Turn off automatic link-objects translation. This is only applicable to Java at the moment.

    17.2.2.5 doxygen:nostripparams

    Turn off stripping of @param and @tparam Doxygen commands if the parameter is not found in the function signature. This is only applicable to Java at the moment.

    17.2.3 Additional command line options

    ALSO TO BE ADDED (Javadoc auto brief?)

    17.3 Doxygen to Javadoc

    If translation is enabled, Javadoc formatted comments should be automatically placed in the correct locations in the resulting module and proxy files.

    17.3.1 Basic example

    Here is an example segment from an included header file

    /*! This is describing class Shape
     \author Bob
     */
    
    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      };
      double  x, y; /*!< Important Variables */
      void    move(double dx, double dy); /*!< Moves the Shape */
      virtual double area(void) = 0; /*!< \return the area */
      virtual double perimeter(void) = 0; /*!< \return the perimeter */
      static  int nshapes;
    };
    

    Simply running SWIG should result in the following code being present in Shapes.java

    
    /**
     * This is describing class Shape 
     * @author Bob 
     * 
     */
    
    public class Shape {
    
    ...
    
    /**
     * Important Variables 
     */
      public void setX(double value) {
        ShapesJNI.Shape_x_set(swigCPtr, this, value);
      }
    
    /**
     * Important Variables 
     */
      public double getX() {
        return ShapesJNI.Shape_x_get(swigCPtr, this);
      }
    
    /**
     * Moves the Shape 
     */
      public void move(double dx, double dy) {
        ShapesJNI.Shape_move(swigCPtr, this, dx, dy);
      }
    
    /**
     * @return the area 
     */
      public double area() {
        return ShapesJNI.Shape_area(swigCPtr, this);
      }
    
    /**
     * @return the perimeter 
     */
      public double perimeter() {
        return ShapesJNI.Shape_perimeter(swigCPtr, this);
      }
    }
    
    

    The code Java-wise should be identical to what would have been generated without the doxygen functionality enabled. When the Doxygen Translator module encounters a comment that contains nothing useful or a doxygen comment that it cannot parse, it will not affect the functionality of the SWIG generated code.

    The Javadoc translator will handle most of the tags conversions (see the table below). It will also automatically translate link-objects params, in \see and \link...\endlink commands. For example, 'someFunction(std::string)' will be converted to 'someFunction(String)'. If you don't want such behaviour, you could turn this off by using the 'doxygen:nolinktranslate' feature. Also all '\param' and '\tparam' commands are stripped out, if the specified parameter is not present in the function. Use 'doxygen:nostripparams' to avoid.

    Javadoc translator features summary (see %feature directives):

    17.3.2 Javadoc tags

    Here is the list of all Doxygen tags and the description of how they are translated to Javadoc

    Doxygen tags
    \awrapped with <i> html tag
    \argwrapped with <li> html tag
    \authortranslated to @author
    \authorstranslated to @author
    \bwrapped with <b> html tag
    \cwrapped with <code> html tag
    \citewrapped with <i> html tag
    \codetranslated to {@code ...}
    \code{<ext>}translated to {@code ...}; code language extension is ignored
    \condtranslated to 'Conditional comment: <condition>'
    \copyrightreplaced with 'Copyright:'
    \deprecatedtranslated to @deprecated
    \ewrapped with <i> html tag
    \elsereplaced with '}Else:{'
    \elseifreplaced with '}Else if: <condition>{'
    \emwrapped with <i> html tag
    \endcodesee note for \code
    \endcondreplaced with 'End of conditional comment.'
    \endifreplaced with '}'
    \endlinksee note for \link
    \endverbatimsee note for \verbatim
    \exceptiontranslated to @exception
    \f$, \f[, \f], \f{, \f}LateX formulas are left unchanged
    \ifreplaced with 'If: <condition> {'
    \ifnotreplaced with 'If not: <condition> {'
    \imagetranslated to <img/> html tag only if target=HTML
    \liwrapped with <li> html tag
    \linktranslated to {@link ...}
    \nreplaced with newline char
    \notereplaced with 'Note:'
    \overloadprints 'This is an overloaded ...' according to Doxygen docs
    \pwrapped with <code> html tag
    \parreplaced with <p alt='title'>...</p>
    \paramtranslated to @param
    \param[<dir>]translated to @param; parameter direction ('in'; 'out'; or 'in,out') is ignored
    \remarkreplaced with 'Remarks:'
    \remarksreplaced with 'Remarks:'
    \resulttranslated to @return
    \returntranslated to @return
    \returnstranslated to @return
    \satranslated to @see
    \seetranslated to @see
    \sincetranslated to @since
    \throwtranslated to @throws
    \throwstranslated to @throws
    \todoreplaced with 'TODO:'
    \tparamtranslated to @param
    \verbatimtranslated to {@literal ...}
    \versiontranslated to @version
    \warningtranslated to 'Warning:'
    \$prints $ char
    \@prints @ char
    \\prints \ char
    \&prints & char
    \~prints ~ char
    \<prints < char
    \>prints > char
    \#prints # char
    \%prints % char
    \"prints " char
    \.prints . char
    \::prints ::

    17.3.3 Unsupported tags

    Doxygen has a wealth of tags such as @latexonly that have no equivalent in Javadoc (all supported tags are listed in Javadoc documentation). As a result several tags have no translation or particular use, such as some linking and section tags. These are suppressed with their content just printed out (if the tag has any sense, typically text content). Here is the list of these tags:

    Unsupported Doxygen tags
    • \addindex
    • \addtogroup
    • \anchor
    • \attention
    • \brief
    • \bug
    • \callergraph
    • \callgraph
    • \category
    • \class
    • \copybrief
    • \copydetails
    • \copydoc
    • \date
    • \def
    • \defgroup
    • \details
    • \dir
    • \dontinclude
    • \dot
    • \dotfile
    • \enddot
    • \endhtmlonly
    • \endinternal
    • \endlatexonly
    • \endmanonly
    • \endmsc
    • \endrtfonly
    • \endxmlonly
    • \enum
    • \example
    • \extends
    • \file
    • \fn
    • \headerfile
    • \hideinitializer
    • \htmlinclude
    • \htmlonly
    • \implements
    • \include
    • \includelineno
    • \ingroup
    • \interface
    • \internal
    • \invariant
    • \latexonly
    • \line
    • \mainpage
    • \manonly
    • \memberof
    • \msc
    • \mscfile
    • \name
    • \namespace
    • \nosubgrouping
    • \package
    • \page
    • \paragraph
    • \post
    • \pre
    • \private
    • \privatesection
    • \property
    • \protected
    • \protectedsection
    • \protocol
    • \public
    • \publicsection
    • \ref
    • \related
    • \relatedalso
    • \relates
    • \relatesalso
    • \retval
    • \rtfonly
    • \section
    • \short
    • \showinitializer
    • \skip
    • \skipline
    • \snippet
    • \struct
    • \subpage
    • \subsection
    • \subsubsection
    • \tableofcontents
    • \test
    • \typedef
    • \union
    • \until
    • \var
    • \verbinclude
    • \weakgroup
    • \xmlonly
    • \xrefitem

    If one of the following Doxygen tags appears as the first tag in a comment, the whole comment block is ignored:

    Ignored Doxygen tags
    • \addtogroup
    • \callergraph
    • \callgraph
    • \category
    • \class
    • \def
    • \defgroup
    • \dir
    • \enum
    • \example
    • \file
    • \fn
    • \headerfile
    • \hideinitializer
    • \interface
    • \internal
    • \mainpage
    • \name
    • \namespace
    • \nosubgrouping
    • \overload
    • \package
    • \page
    • \property
    • \protocol
    • \relates
    • \relatesalso
    • \showinitializer
    • \struct
    • \typedef
    • \union
    • \var
    • \weakgroup

    17.3.4 Further details

    TO BE ADDED.

    17.4 Doxygen to Pydoc

    If translation is enabled, Pydoc formatted comments should be automatically placed in the correct locations in the resulting module and proxy files. The problem is that Pydoc has no tag mechanism like Doxygen or Javadoc, so most of Doxygen commands are translated by merely copying the appropriate command text.

    17.4.1 Basic example

    Here is an example segment from an included header file

    /*! This is describing class Shape
     \author Bob
     */
    
    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      };
      double  x, y; /*!< Important Variables */
      void    move(double dx, double dy); /*!< Moves the Shape */
      virtual double area(void) = 0; /*!< \return the area */
      virtual double perimeter(void) = 0; /*!< \return the perimeter */
      static  int nshapes;
    };
    

    Simply running SWIG should result in the following code being present in Shapes.py

    
    ...
    
    class Shape(_object):
        """
        This is describing class Shape 
        Authors:
        Bob 
    
        """
        
        ...
        
        def move(self, *args):
            """
            Moves the Shape 
            """
            return _Shapes.Shape_move(self, *args)
    
        def area(self):
            """
            Return:
            the area 
            """
            return _Shapes.Shape_area(self)
    
        def perimeter(self):
            """
            Return:
            the perimeter 
            """
            return _Shapes.Shape_perimeter(self)
    

    If any parameters of a function or a method are documented in the Doxygen comment, their description is copied into the generated output using Sphinx documentation conventions. For example

    /**
        Set a breakpoint at the given location.
    
        @param filename The full path to the file.
        @param line_number The line number in the file.
     */
    bool SetBreakpoint(const char* filename, int line_number);
    

    would be translated to

    def SetBreakpoint(filename, line_number):
        r"""
        Set a breakpoint at the given location.
    
        :type filename: string
        :param filename: The full path to the file.
        :type line_number: int
        :param line_number: The line number in the file.
        """
    

    The types used for the parameter documentation come from the "doctype" typemap which is defined for all the primitive types and a few others (e.g. std::string and shared_ptr<T>) but for non-primitive types is taken to be just the C++ name of the type with namespace scope delimiters (::) replaced with a dot. To change this, you can define your own typemaps for the custom types, e.g:

    %typemap(doctype) MyDate "datetime.date";
    

    Currently Doxygen comments assigned to global variables and static member variables are not present in generated code, so they have no comment translated for them.

    Whitespace and tables Whitespace is preserved when translating comments, so it makes sense to have Doxygen comments formatted in a readable way. This includes tables, where tags <th>, <td> and </tr>are translated to '|'. The line after line with <th> tags contains dashes. If we take care about whitespace, comments in Python are much more readable. Example:

    /**
     * <table border = '1'>
     * <caption>Animals</caption>
     * <tr><th> Column 1 </th><th> Column 2 </th></tr>
     * <tr><td> cow      </td><td> dog      </td></tr>
     * <tr><td> cat      </td><td> mouse    </td></tr>
     * <tr><td> horse    </td><td> parrot   </td></tr>
     * </table>
     */
    

    translates to Python as:

      Animals
      | Column 1 | Column 2 |
      -----------------------
      | cow      | dog      |
      | cat      | mouse    |
      | horse    | parrot   |
    

    Overloaded functions Since all the overloaded functions in c++ are wrapped into one Python function, Pydoc translator will combine every comment of every overloaded function and put it into the comment for the one wrapper function.

    If you intend to use resulting generated Python file with the Doxygen docs generator, rather than Pydoc, you may want to turn off translation completely (doxygen:notranslate feature). Then SWIG will just copy the comments to the proxy file and reformat them if needed, but all the comment content will be left as is. As Doxygen doesn't support special commands in Python comments (see Doxygen docs), you may want to use some tool like doxypy ( doxypy) to do the work.

    17.4.2 Pydoc translator

    Here is the list of all Doxygen tags and the description of how they are translated to Pydoc

    Doxygen tags
    \awrapped with '*'
    \argprepended with '* '
    \authorprints 'Author:'
    \authorsprints 'Authors:'
    \bwrapped with '**'
    \cwrapped with '``'
    \citewrapped with single quotes
    \codereplaced with '.. code-block:: c++'
    \code{<ext>}replaced with '.. code-block:: <lang>', where the following doxygen code languages are recognized: .c -> C, .py -> python, .java > java
    \condtranslated to 'Conditional comment: <condition>'
    \copyrightprints 'Copyright:'
    \deprecatedprints 'Deprecated:'
    \ewrapped with '*'
    \elsereplaced with '}Else:{'
    \elseifreplaced with '}Else if: <condition>{'
    \emwrapped with '*'
    \endcondreplaced with 'End of conditional comment.'
    \endifreplaced with '}'
    \examplereplaced with 'Example:'
    \exceptionreplaced with ':raises:'
    \f$rendered using ':math:``'
    \f[rendered using '.. math::'
    \f{rendered using '.. math::'
    \ifreplaced with 'If: <condition> {'
    \ifnotreplaced with 'If not: <condition> {'
    \liprepended with '* '
    \nreplaced with newline char
    \notereplaced with 'Note:'
    \overloadprints 'This is an overloaded ...' according to Doxygen docs
    \pwrapped with '``'
    \parreplaced with 'Title: ...'
    \paramadd ':type:' and ':param:' directives
    \param[<dir>]same as \param, but direction ('in'; 'out'; 'in,out') is included in ':type:' directive
    \remarkreplaced with 'Remarks:'
    \remarksreplaced with 'Remarks:'
    \resultadd ':rtype:' and ':return:' directives
    \returnadd ':rtype:' and ':return:' directives
    \returnsadd ':rtype:' and ':return:' directives
    \sareplaced with 'See also:'
    \seereplaced with 'See also:'
    \sincereplaced with 'Since:'
    \throwreplaced with ':raises:'
    \throwsreplaced wih ':raises:'
    \todoreplaced with 'TODO:'
    \tparamadd ':type:' and ':param:' directives
    \verbatimcontent copied verbatim
    \versionreplaced with 'Version:'
    \warningtranslated to 'Warning:'
    \$prints $ char
    \@prints @ char
    \\prints \ char
    \&prints & char
    \~prints ~ char
    \<prints < char
    \>prints > char
    \#prints # char
    \%prints % char
    \"prints " char
    \.prints . character
    \::prints ::

    17.4.3 Unsupported tags

    Doxygen has a wealth of tags such as @latexonly that have no equivalent in Pydoc. As a result several tags that have no translation (or particular use, such as some linking and section tags) are suppressed with their content just printed out (if it has any sense, typically text content). Here is the list of these tags:

    Unsupported Python Doxygen tags
    • \addindex
    • \addtogroup
    • \anchor
    • \attention
    • \brief
    • \bug
    • \callergraph
    • \callgraph
    • \category
    • \class
    • \copybrief
    • \copydetails
    • \copydoc
    • \date
    • \def
    • \defgroup
    • \details
    • \dir
    • \dontinclude
    • \dot
    • \dotfile
    • \enddot
    • \endhtmlonly
    • \endinternal
    • \endlatexonly
    • \endlink
    • \endmanonly
    • \endmsc
    • \endrtfonly
    • \endxmlonly
    • \enum
    • \extends
    • \file
    • \fn
    • \headerfile
    • \hideinitializer
    • \htmlinclude
    • \htmlonly
    • \image
    • \implements
    • \include
    • \includelineno
    • \ingroup
    • \interface
    • \internal
    • \invariant
    • \latexonly
    • \line
    • \link
    • \mainpage
    • \manonly
    • \memberof
    • \msc
    • \mscfile
    • \name
    • \namespace
    • \nosubgrouping
    • \package
    • \page
    • \paragraph
    • \post
    • \pre
    • \private
    • \privatesection
    • \property
    • \protected
    • \protectedsection
    • \protocol
    • \public
    • \publicsection
    • \ref
    • \related
    • \relatedalso
    • \relates
    • \relatesalso
    • \retval
    • \rtfonly
    • \section
    • \short
    • \showinitializer
    • \skip
    • \skipline
    • \snippet
    • \struct
    • \subpage
    • \subsection
    • \subsubsection
    • \tableofcontents
    • \test
    • \typedef
    • \union
    • \until
    • \var
    • \verbinclude
    • \weakgroup
    • \xmlonly
    • \xrefitem

    17.4.4 Further details

    TO BE ADDED.

    17.5 Troubleshooting

    When running SWIG with command line option -doxygen, it may happen that SWIG will fail to parse the code, which is valid C++ code and is parsed without problems without the option. The problem is, that Doxygen comments are not tokens (the C/C++ compiler actually never sees them) and that they can appear anywhere in the code. That's why it is practically impossible to handle all corner cases with the parser. However, these problems can usually be avoided by minor changes in the code or comment. Known problems and solutions are shown in this section.

    Recommended approach is to first run SWIG without command line option -doxygen. When it successfully processes the code, include the option and fix problems with Doxygen comments.

    17.5.1 Problem with conditional compilation

    Inserting a conditional compilation preprocessor directive between a Doxygen comment and a commented item may break parsing:

    class A {
      /**
       * Some func.
       */
      #ifndef SWIG
      void myfunc()
      {
      }
      #endif
    };
    

    The solution is to move the directive above the comment:

    class A {
      #ifndef SWIG
      /**
       * Some func.
       */
      void myfunc()
      {
      }
      #endif
    };
    

    17.6 Developer information

    This section contains information for developers enhancing the Doxygen translator.

    17.6.1 Doxygen translator design

    If this functionality is turned on, SWIG places all comments found into the SWIG parse tree. Nodes contain an additional attribute called doxygen when a comment is present. Individual nodes containing Doxygen with Structural Indicators, such as @file, as their first command, are also present in the parse tree. These individual "blobs" of Doxygen such as :

    /*! This is describing function Foo
     \param x some random variable
     \author Bob
     \return Foo
     */
    

    are passed on individually to the Doxygen Translator module. This module builds its own private parse tree and hands it to a separate class for translation into the target documentation language. For example, JavaDocConverter is the Javadoc module class.

    17.6.2 Debugging the Doxygen parser and translator

    There are two handy command line options, that enable lots of detailed debug information printing.

      -debug-doxygen-parser     - Display Doxygen parser module debugging information
      -debug-doxygen-translator - Display Doxygen translator module debugging information
    

    17.6.3 Tests

    Doxygen tests have been added to the regular SWIG test-suite. There are a number of tests beginning doxygen_ in the Examples/test-suite sub-directory.

    Like any other SWIG test case, the tests are included in Examples/test-suite/common.mk and can be tested with commands like make check-test-suite or make check-python-test-suite. To run them individually, type make -s <testname>.cpptest in the language-specific sub-directory in Examples/test-suite directory. For example:

      Examples/test-suite/java $ make -s doxygen_parsing.cpptest
    

    If the test fails, both expected and translated comments are printed to std out, but also written to files expected.txt and got.txt. Since it is often difficult to find a single character difference in several lines of text, we can use some diff tool, for example:

      Examples/test-suite/java $ kdiff3 expected.txt got.txt
    

    Runtime tests in Java are implemented using Javadoc doclets. To make that work, you should have tools.jar from the JDK in your classpath. Or you should have JAVA_HOME environment variable defined and pointing to the JDK location.

    The Java's comment parsing code (the testing part) is located in commentParser.java. It checks the generated code. It is possible to run this file as a stand-alone program, with java commentParser <some java package>, and it will print the list of comments found in the specified directory (in the format it has used in the runtime tests). So, when you want to create a new Doxygen test case, just copy an existing one and replace the actual comment content (section of entries in form 'wantedComments.put(...)' with the output of the above command.

    Runtime tests in Python are just plain string comparisons of the __doc__ properties.

    17.7 Extending to other languages

    In general, an extension to another language requires a fairly deep understanding of the target language module, such as Modules/python.cxx for Python. Searching for "doxygen" in the java.cxx module can give you a good idea of the process for placing documentation comments into the correct areas. The basic gist is that anywhere a comment may reside on a node, there needs to be a catch for it in front of where that function, class, or other object is written out to a target language file. The other half of extension is building a target documentation language comment generator that handles one blob at a time. However, this is relatively simple and nowhere near as complex as the wrapper generating modules in SWIG. See Source/Doxygen/javadoc.cxx for a good example. The target language module passes the Doxygen Translator the blob to translate, and receives back the translated text.

    What is given to the Doxygen Translator

    /*! This is describing function Foo
     \param x some random variable
     \author Bob
     \return Foo
     */
    

    What is received back by java.cxx

    /** This is describing function Foo
     *
     * @param x some random variable
     * @author Bob
     * @return Foo
     */
    

    Development of the comment translator itself is simplified by the fact that the Doxygen Translator module can easily include a main function and thus be developed, compiled, and tested independently of SWIG.


    18 Warning Messages

    18.1 Introduction

    During compilation, SWIG may generate a variety of warning messages. For example:

    example.i:16: Warning 501: Overloaded declaration ignored.  bar(double)
    example.i:15: Warning 501: Previous declaration is bar(int)
    

    Typically, warning messages indicate non-fatal problems with the input where the generated wrapper code will probably compile, but it may not work like you expect.

    18.2 Warning message suppression

    All warning messages have a numeric code that is shown in the warning message itself. To suppress the printing of a warning message, a number of techniques can be used. First, you can run SWIG with the -w command line option. For example:

    % swig -python -w501 example.i
    % swig -python -w501,505,401 example.i
    

    Alternatively, warnings can be suppressed by inserting a special preprocessor pragma into the input file:

    %module example
    #pragma SWIG nowarn=501
    #pragma SWIG nowarn=501,505,401
    

    Finally, code-generation warnings can be disabled on a declaration by declaration basis using the %warnfilter directive. For example:

    %module example
    %warnfilter(501) foo;
    ...
    int foo(int);
    int foo(double);              // Silently ignored.
    

    The %warnfilter directive has the same semantics as other declaration modifiers like %rename, %ignore and %feature, see the %feature directive section. For example, if you wanted to suppress a warning for a method in a class hierarchy, you could do this:

    %warnfilter(501) Object::foo;
    class Object {
    public:
      int foo(int);
      int foo(double);      // Silently ignored
      ...
    };
    
    class Derived : public Object {
    public:
      int foo(int);
      int foo(double);      // Silently ignored
      ...
    };
    

    Warnings can be suppressed for an entire class by supplying a class name. For example:

    %warnfilter(501) Object;
    
    class Object {
    public:
      ...                      // All 501 warnings ignored in class
    };
    

    There is no option to suppress all SWIG warning messages. The warning messages are there for a reason---to tell you that something may be broken in your interface. Ignore the warning messages at your own peril.

    18.3 Enabling extra warnings

    Some warning messages are disabled by default and are generated only to provide additional diagnostics. These warnings can be turned on using the -Wextra option. For example:

    % swig -Wextra -python example.i
    

    To selectively turn on extra warning messages, you can use the directives and options in the previous section--simply add a "+" to all warning numbers. For example:

    % swig -w+309,+452 example.i
    

    or in your interface file use either

    #pragma SWIG nowarn=+309,+452
    

    or

    %warnfilter(+309,+452) foo;
    

    Note: selective enabling of warnings with %warnfilter overrides any global settings you might have made using -w or #pragma.

    You can of course also enable all warnings and suppress a select few, for example:

    % swig -Wextra -w309,452 example.i
    

    The warnings on the right take precedence over the warnings on the left, so in the above example -Wextra adds numerous warnings including 452, but then -w309,452 overrides this and so 452 is suppressesed.

    If you would like all warnings to appear, regardless of the warning filters used, then use the -Wall option. The -Wall option also turns on the extra warnings that -Wextra adds, however, it is subtely different. When -Wall is used, it also disables all other warning filters, that is, any warnings suppressed or added in %warnfilter, #pragma SWIG nowarn or the -w option.

    18.4 Issuing a warning message

    Warning messages can be issued from an interface file using a number of directives. The %warn directive is the most simple:

    %warn "900:This is your last warning!"
    

    All warning messages are optionally prefixed by the warning number to use. If you are generating your own warnings, make sure you don't use numbers defined in the table at the end of this section.

    The %ignorewarn directive is the same as %ignore except that it issues a warning message whenever a matching declaration is found. For example:

    %ignorewarn("362:operator= ignored") operator=;
    

    Warning messages can be associated with typemaps using the warning attribute of a typemap declaration. For example:

    %typemap(in, warning="901:You are really going to regret this usage of $1_type $1_name") blah * {
      ...
    }
    

    In this case, the warning message will be printed whenever the typemap is actually used and the special variables will be expanded as appropriate, for example:

    example.i:23: Warning 901: You are really going to regret this usage of blah * self
    example.i:24: Warning 901: You are really going to regret this usage of blah * stuff
    

    18.5 Symbolic symbols

    The swigwarn.swg file that is installed with SWIG contains symbol constants that could also be used in %warnfilter and #pragma SWIG nowarn. For example this file contains the following line:

    %define SWIGWARN_TYPE_UNDEFINED_CLASS 401 %enddef
    

    so SWIGWARN_TYPE_UNDEFINED_CLASS could be used instead of 401, for example:

    #pragma SWIG nowarn=SWIGWARN_TYPE_UNDEFINED_CLASS
    

    or

    %warnfilter(SWIGWARN_TYPE_UNDEFINED_CLASS) Foo;
    

    18.6 Commentary

    The ability to suppress warning messages is really only provided for advanced users and is not recommended in normal use. You are advised to modify your interface to fix the problems highlighted by the warnings wherever possible instead of suppressing warnings.

    Certain types of SWIG problems are errors. These usually arise due to parsing errors (bad syntax) or semantic problems for which there is no obvious recovery. There is no mechanism for suppressing error messages.

    18.7 Warnings as errors

    Warnings can be handled as errors by using the -Werror command line option. This will cause SWIG to exit with a non successful exit code if a warning is encountered.

    18.8 Message output format

    The output format for both warnings and errors can be selected for integration with your favourite IDE/editor. Editors and IDEs can usually parse error messages and if in the appropriate format will easily take you directly to the source of the error. The standard format is used by default except on Windows where the Microsoft format is used by default. These can be overridden using command line options, for example:

    $ swig -python -Fstandard example.i
    example.i:4: Syntax error in input(1).
    $ swig -python -Fmicrosoft example.i
    example.i(4) : Syntax error in input(1).
    

    18.9 Warning number reference

    18.9.1 Deprecated features (100-199)

    • 101. Deprecated %extern directive.
    • 102. Deprecated %val directive.
    • 103. Deprecated %out directive.
    • 104. Deprecated %disabledoc directive.
    • 105. Deprecated %enabledoc directive.
    • 106. Deprecated %doconly directive.
    • 107. Deprecated %style directive.
    • 108. Deprecated %localstyle directive.
    • 109. Deprecated %title directive.
    • 110. Deprecated %section directive.
    • 111. Deprecated %subsection directive.
    • 112. Deprecated %subsubsection directive.
    • 113. Deprecated %addmethods directive.
    • 114. Deprecated %readonly directive.
    • 115. Deprecated %readwrite directive.
    • 116. Deprecated %except directive.
    • 117. Deprecated %new directive.
    • 118. Deprecated %typemap(except).
    • 119. Deprecated %typemap(ignore).
    • 120. Deprecated command line option (-runtime, -noruntime).
    • 121. Deprecated %name directive.
    • 126. The 'nestedworkaround' feature is deprecated.

    18.9.2 Preprocessor (200-299)

    • 201. Unable to find filename.
    • 202. Could not evaluate expression expr.
    • 203. Both includeall and importall are defined: using includeall.
    • 204. CPP #warning, "warning".
    • 205. CPP #error, "error".
    • 206. Unexpected tokens after #directive directive.

    18.9.3 C/C++ Parser (300-399)

    • 301. class keyword used, but not in C++ mode.
    • 302. Identifier 'name' redefined (ignored).
    • 303. %extend defined for an undeclared class 'name '.
    • 304. Unsupported constant value (ignored).
    • 305. Bad constant value (ignored).
    • 306. 'identifier' is private in this context.
    • 307. Can't set default argument value (ignored)
    • 308. Namespace alias 'name' not allowed here. Assuming ' name'
    • 309. [private | protected] inheritance ignored.
    • 310. Template 'name' was already wrapped as 'name' (ignored)
    • 312. Unnamed nested class not currently supported (ignored).
    • 313. Unrecognized extern type "name" (ignored).
    • 314. 'identifier' is a lang keyword.
    • 315. Nothing known about 'identifier'.
    • 316. Repeated %module directive.
    • 317. Specialization of non-template 'name'.
    • 318. Instantiation of template 'name' is ambiguous, instantiation templ used, instantiation templ ignored.
    • 319. No access specifier given for base class name (ignored).
    • 320. Explicit template instantiation ignored.
    • 321. identifier conflicts with a built-in name.
    • 322. Redundant redeclaration of 'name'.
    • 323. Recursive scope inheritance of 'name'.
    • 324. Named nested template instantiations not supported. Processing as if no name was given to %template().
    • 325. Nested kind not currently supported (name ignored).
    • 326. Deprecated %extend name used - the kind name 'name ' should be used instead of the typedef name 'name'.
    • 350. operator new ignored.
    • 351. operator delete ignored.
    • 352. operator+ ignored.
    • 353. operator- ignored.
    • 354. operator* ignored.
    • 355. operator/ ignored.
    • 356. operator% ignored.
    • 357. operator^ ignored.
    • 358. operator& ignored.
    • 359. operator| ignored.
    • 360. operator~ ignored.
    • 361. operator! ignored.
    • 362. operator= ignored.
    • 363. operator< ignored.
    • 364. operator> ignored.
    • 365. operator+= ignored.
    • 366. operator-= ignored.
    • 367. operator*= ignored.
    • 368. operator/= ignored.
    • 369. operator%= ignored.
    • 370. operator^= ignored.
    • 371. operator&= ignored.
    • 372. operator|= ignored.
    • 373. operator<< ignored.
    • 374. operator>>ignored.
    • 375. operator<<= ignored.
    • 376. operator>>= ignored.
    • 377. operator== ignored.
    • 378. operator!= ignored.
    • 379. operator<= ignored.
    • 380. operator>= ignored.
    • 381. operator&& ignored.
    • 382. operator|| ignored.
    • 383. operator++ ignored.
    • 384. operator-- ignored.
    • 385. operator, ignored.
    • 386. operator-<* ignored.
    • 387. operator-< ignored.
    • 388. operator() ignored.
    • 389. operator[] ignored.
    • 390. operator+ ignored (unary).
    • 391. operator- ignored (unary).
    • 392. operator* ignored (unary).
    • 393. operator& ignored (unary).
    • 394. operator new[] ignored.
    • 395. operator delete[] ignored.

    18.9.4 Types and typemaps (400-499)

    • 401. Nothing known about class 'name'. Ignored.
    • 402. Base class 'name' is incomplete.
    • 403. Class 'name' might be abstract.
    • 450. Deprecated typemap feature ($source/$target).
    • 451. Setting const char * variable may leak memory.
    • 452. Reserved
    • 453. Can't apply (pattern). No typemaps are defined.
    • 460. Unable to use type type as a function argument.
    • 461. Unable to use return type type in function name .
    • 462. Unable to set variable of type type.
    • 463. Unable to read variable of type type.
    • 464. Unsupported constant value.
    • 465. Unable to handle type type.
    • 466. Unsupported variable type type.
    • 467. Overloaded declaration not supported (incomplete type checking rule - no precedence level in typecheck typemap for 'type ')
    • 468. No 'throw' typemap defined for exception type type
    • 469. No or improper directorin typemap defined for type
    • 470. Thread/reentrant unsafe wrapping, consider returning by value instead.
    • 471. Unable to use return type type in director method
    • 474. Method method usage of the optimal attribute ignored in the out typemap as the following cannot be used to generate optimal code: code
    • 475. Multiple calls to method might be generated due to optimal attribute usage in the out typemap.
    • 476. Initialization using std::initializer_list.
    • 477. No directorthrows typemap defined for type

    18.9.5 Code generation (500-559)

    • 501. Overloaded declaration ignored. decl. Previous declaration is decl.
    • 502. Overloaded constructor ignored. decl. Previous declaration is decl.
    • 503. Can't wrap 'identifier' unless renamed to a valid identifier.
    • 504. Function name must have a return type. Ignored.
    • 505. Variable length arguments discarded.
    • 506. Can't wrap varargs with keyword arguments enabled.
    • 507. Adding native function name not supported (ignored).
    • 508. Declaration of 'name' shadows declaration accessible via operator->(), previous declaration of'declaration'.
    • 509. Overloaded method declaration effectively ignored, as it is shadowed by declaration.
    • 510. Friend function 'name' ignored.
    • 511. Can't use keyword arguments with overloaded functions.
    • 512. Overloaded method declaration ignored, using non-const method declaration instead.
    • 513. Can't generate wrappers for unnamed struct/class.
    • 514.
    • 515.
    • 516. Overloaded method declaration ignored, using declaration instead.
    • 517.
    • 518. Portability warning: File file1 will be overwritten by file2 on case insensitive filesystems such as Windows' FAT32 and NTFS unless the class/module name is renamed.
    • 519. %template() contains no name. Template method ignored: declaration
    • 520. Base/Derived class 'classname1' of ' classname2' is not similarly marked as a smart pointer.
    • 521. Illegal destructor name name. Ignored.
    • 522. Use of an illegal constructor name 'name' in %extend is deprecated, the constructor name should be 'name'.
    • 523. Use of an illegal destructor name 'name' in %extend is deprecated, the destructor name should be 'name'.
    • 524. Experimental target language. Target language language specified by lang is an experimental language. Please read about SWIG experimental languages, htmllink.
    • 525. Destructor declaration is final, name cannot be a director class.

    18.9.6 Doxygen comments (560-599)

    • 560: Unknown Doxygen command: command.
    • 561: Unexpected end of Doxygen comment encountered.
    • 562: Expected Doxygen command: command
    • 563: Doxygen HTML error for tag tag: error text.
    • 564: Error parsing Doxygen command command: error text . Command ignored."

    18.9.7 Language module specific (700-899)

    • 801. Wrong name (corrected to 'name'). (Ruby).
    • 810. No jni typemap defined for type (Java).
    • 811. No jtype typemap defined for type (Java).
    • 812. No jstype typemap defined for type (Java).
    • 813. Warning for classname, base baseclass ignored. Multiple inheritance is not supported in Java. (Java).
    • 814.
    • 815. No javafinalize typemap defined for type (Java).
    • 816. No javabody typemap defined for type (Java).
    • 817. No javaout typemap defined for type (Java).
    • 818. No javain typemap defined for type (Java).
    • 819. No javadirectorin typemap defined for type (Java).
    • 820. No javadirectorout typemap defined for type (Java).
    • 821.
    • 822. Covariant return types not supported in Java. Proxy method will return basetype (Java).
    • 823. No javaconstruct typemap defined for type (Java).
    • 824. Missing JNI descriptor in directorin typemap defined for type (Java).
    • 825. "directorconnect" attribute missing in type "javaconstruct" typemap. (Java).
    • 826. The nspace feature is used on 'type' without -package. The generated code may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package. (Java).
    • 830. No ctype typemap defined for type (C#).
    • 831. No cstype typemap defined for type (C#).
    • 832. No cswtype typemap defined for type (C#).
    • 833. Warning for classname, base baseclass ignored. Multiple inheritance is not supported in C#. (C#).
    • 834.
    • 835. No csfinalize typemap defined for type (C#).
    • 836. No csbody typemap defined for type (C#).
    • 837. No csout typemap defined for type (C#).
    • 838. No csin typemap defined for type (C#).
    • 839.
    • 840.
    • 841.
    • 842. Covariant return types not supported in C#. Proxy method will return basetype (C#).
    • 843. No csconstruct typemap defined for type (C#).
    • 844. C# exception may not be thrown - no $excode or excode attribute in typemap typemap. (C#).
    • 845. Unmanaged code contains a call to a SWIG_CSharpSetPendingException method and C# code does not handle pending exceptions via the canthrow attribute. (C#).
    • 870. Warning for classname: Base baseclass ignored. Multiple inheritance is not supported in PHP. (Php).
    • 871. Unrecognized pragma pragma. (Php).

    18.9.8 User defined (900-999)

    These numbers can be used by your own application.

    18.10 History

    The ability to control warning messages was first added to SWIG-1.3.12.


    19 Working with Modules

    19.1 Modules Introduction

    Each invocation of SWIG requires a module name to be specified. The module name is used to name the resulting target language extension module. Exactly what this means and what the name is used for depends on the target language, for example the name can define a target language namespace or merely be a useful name for naming files or helper classes. Essentially, a module comprises target language wrappers for a chosen collection of global variables/functions, structs/classes and other C/C++ types.

    The module name can be supplied in one of two ways. The first is to specify it with the special %module directive. This directive must appear at the beginning of the interface file. The general form of this directive is:

    %module(option1="value1", option2="value2", ...) modulename
    

    where the modulename is mandatory and the options add one or more optional additional features. Typically no options are specified, for example:

    %module mymodule
    

    The second way to specify the module name is with the -module command line option, for example -module mymodule. If the module name is supplied on the command line, it overrides the name specified by the %module directive.

    When first working with SWIG, users commonly start by creating a single module. That is, you might define a single SWIG interface that wraps some set of C/C++ code. You then compile all of the generated wrapper code together and use it. For large applications, however, this approach is problematic---the size of the generated wrapper code can be rather large. Moreover, it is probably easier to manage the target language interface when it is broken up into smaller pieces.

    This chapter describes the problem of using SWIG in programs where you want to create a collection of modules. Each module in the collection is created via separate invocations of SWIG.

    19.2 Basics

    The basic usage case with multiple modules is when modules do not have cross-references (ie. when wrapping multiple independent C APIs). In that case, swig input files should just work out of the box - you simply create multiple wrapper .cxx files, link them into your application, and insert/load each in the scripting language runtime as you would do for the single module case.

    A bit more complex is the case in which modules need to share information. For example, when one module extends the class of another by deriving from it:

    // File: base.h
    class base {
    public:
      int foo();
    };
    
     
    // File: base_module.i
    %module base_module
    
    %{
    #include "base.h"
    %}
    %include "base.h"
    
     
    // File: derived_module.i
    %module derived_module
    
    %import "base_module.i"
    
    %inline %{
    class derived : public base {
    public:
      int bar();
    };
    %}
    

    To create the wrapper properly, module derived_module needs to know about the base class and that its interface is covered in another module. The line %import "base_module.i" lets SWIG know exactly that. Often the .h file is passed to %import instead of the .i, which unfortunately doesn't work for all language modules. For example, Python requires the name of module that the base class exists in so that the proxy classes can fully inherit the base class's methods. Typically you will get a warning when the module name is missing, eg:

    derived_module.i:8: Warning 401: Base class 'base' ignored - unknown module name for base. Either
    import
    the appropriate module interface file or specify the name of the module in the %import directive.
    

    It is sometimes desirable to import the header file rather than the interface file and overcome the above warning. For example in the case of the imported interface being quite large, it may be desirable to simplify matters and just import a small header file of dependent types. This can be done by specifying the optional module attribute in the %import directive. The derived_module.i file shown above could be replaced with the following:

    // File: derived_module.i
    %module derived_module
    
    %import(module="base_module") "base.h"
    
    %inline %{
    class derived : public base {
    public:
      int bar();
    };
    

    Note that "base_module" is the module name and is the same as that specified in %module in base_module.i as well as the %import in derived_module.i.

    Another issue to beware of is that multiple dependent wrappers should not be linked/loaded in parallel from multiple threads as SWIG provides no locking - for more on that issue, read on.

    19.3 The SWIG runtime code

    Many of SWIG's target languages generate a set of functions commonly known as the "SWIG runtime." These functions are primarily related to the runtime type system which checks pointer types and performs other tasks such as proper casting of pointer values in C++. As a general rule, the statically typed target languages, such as Java, use the language's built in static type checking and have no need for a SWIG runtime. All the dynamically typed / interpreted languages rely on the SWIG runtime.

    The runtime functions are private to each SWIG-generated module. That is, the runtime functions are declared with "static" linkage and are visible only to the wrapper functions defined in that module. The only problem with this approach is that when more than one SWIG module is used in the same application, those modules often need to share type information. This is especially true for C++ programs where SWIG must collect and share information about inheritance relationships that cross module boundaries.

    To solve the problem of sharing information across modules, a pointer to the type information is stored in a global variable in the target language namespace. During module initialization, type information is loaded into the global data structure of type information from all modules.

    There are a few trade offs with this approach. This type information is global across all SWIG modules loaded, and can cause type conflicts between modules that were not designed to work together. To solve this approach, the SWIG runtime code uses a define SWIG_TYPE_TABLE to provide a unique type table. This behavior can be enabled when compiling the generated _wrap.cxx or _wrap.c file by adding -DSWIG_TYPE_TABLE=myprojectname to the command line argument.

    Then, only modules compiled with SWIG_TYPE_TABLE set to myprojectname will share type information. So if your project has three modules, all three should be compiled with -DSWIG_TYPE_TABLE=myprojectname, and then these three modules will share type information. But any other project's types will not interfere or clash with the types in your module.

    Another issue relating to the global type table is thread safety. If two modules try and load at the same time, the type information can become corrupt. SWIG currently does not provide any locking, and if you use threads, you must make sure that modules are loaded serially. Be careful if you use threads and the automatic module loading that some scripting languages provide. One solution is to load all modules before spawning any threads, or use SWIG_TYPE_TABLE to separate type tables so they do not clash with each other.

    Lastly, SWIG uses a #define SWIG_RUNTIME_VERSION, located in Lib/swigrun.swg and near the top of every generated module. This number gets incremented when the data structures change, so that SWIG modules generated with different versions can peacefully coexist. So the type structures are separated by the (SWIG_TYPE_TABLE, SWIG_RUNTIME_VERSION) pair, where by default SWIG_TYPE_TABLE is empty. Only modules compiled with the same pair will share type information.

    19.4 External access to the runtime

    As described in The run-time type checker, the functions SWIG_TypeQuery, SWIG_NewPointerObj, and others sometimes need to be called. Calling these functions from a typemap is supported, since the typemap code is embedded into the _wrap.c file, which has those declarations available. If you need to call the SWIG run-time functions from another C file, there is one header you need to include. To generate the header that needs to be included, SWIG can be run in a different mode via -external-runtime to generate the run-time instead of the normal mode of processing an input interface file. For example:

    $ swig -python -external-runtime <filename>
    

    The filename argument is optional and if it is not passed, then the default filename will be something like swigpyrun.h, depending on the language. This header file should be treated like any of the other _wrap.c output files, and should be regenerated when the _wrap files are. After including this header, your code will be able to call SWIG_TypeQuery, SWIG_NewPointerObj, SWIG_ConvertPtr and others. The exact argument parameters for these functions might differ between language modules; please check the language module chapters for more information.

    Inside this header the functions are declared static and are included inline into the file, and thus the file does not need to be linked against any SWIG libraries or code (you might still need to link against the language libraries like libpython-2.3). Data is shared between this file and the _wrap.c files through a global variable in the scripting language. It is also possible to copy this header file along with the generated wrapper files into your own package, so that you can distribute a package that can be compiled without SWIG installed (this works because the header file is self-contained, and does not need to link with anything).

    This header will also use the -DSWIG_TYPE_TABLE described above, so when compiling any code which includes the generated header file should define the SWIG_TYPE_TABLE to be the same as the module whose types you are trying to access.

    19.5 A word of caution about static libraries

    When working with multiple SWIG modules, you should take care not to use static libraries. For example, if you have a static library libfoo.a and you link a collection of SWIG modules with that library, each module will get its own private copy of the library code inserted into it. This is very often NOT what you want and it can lead to unexpected or bizarre program behavior. When working with dynamically loadable modules, you should try to work exclusively with shared libraries.

    19.6 References

    Due to the complexity of working with shared libraries and multiple modules, it might be a good idea to consult an outside reference. John Levine's "Linkers and Loaders" is highly recommended.

    19.7 Reducing the wrapper file size

    Using multiple modules with the %import directive is the most common approach to modularising large projects. In this way a number of different wrapper files can be generated, thereby avoiding the generation of a single large wrapper file. There are a couple of alternative solutions for reducing the size of a wrapper file through the use of command line options and features.

    -fcompact
    This command line option will compact the size of the wrapper file without changing the code generated into the wrapper file. It simply removes blank lines and joins lines of code together. This is useful for compilers that have a maximum file size that can be handled.

    -fvirtual
    This command line option will remove the generation of superfluous virtual method wrappers. Consider the following inheritance hierarchy:

    struct Base {
      virtual void method();
      ...
    };
    
    struct Derived : Base {
      virtual void method();
      ...
    };
    

    Normally wrappers are generated for both methods, whereas this command line option will suppress the generation of a wrapper for Derived::method. Normal polymorphic behaviour remains as Derived::method will still be called should you have a Derived instance and call the wrapper for Base::method.

    %feature("compactdefaultargs")
    This feature can reduce the number of wrapper methods when wrapping methods with default arguments. The section on default arguments discusses the feature and its limitations.


    20 Using SWIG with ccache - ccache-swig(1) manpage

    20.1 NAME

    ccache-swig - a fast compiler cache

    20.2 SYNOPSIS

    ccache-swig [OPTION]

    ccache-swig <compiler> [COMPILER OPTIONS]

    <compiler> [COMPILER OPTIONS]

    20.3 DESCRIPTION

    ccache-swig is a compiler cache. It speeds up re-compilation of C/C++/SWIG code by caching previous compiles and detecting when the same compile is being done again. ccache-swig is ccache plus support for SWIG. ccache and ccache-swig are used interchangeably in this document.

    20.4 OPTIONS SUMMARY

    Here is a summary of the options to ccache-swig.

    
    -s                      show statistics summary
    -z                      zero statistics
    -c                      run a cache cleanup
    -C                      clear the cache completely
    -F <n>                  set maximum files in cache
    -M <n>                  set maximum size of cache (use G, M or K)
    -h                      this help page
    -V                      print version number
    
    

    20.5 OPTIONS

    These options only apply when you invoke ccache as "ccache-swig". When invoked as a compiler none of these options apply. In that case your normal compiler options apply and you should refer to your compilers documentation.

    -h
    Print a options summary page

    -s
    Print the current statistics summary for the cache. The statistics are stored spread across the subdirectories of the cache. Using "ccache-swig -s" adds up the statistics across all subdirectories and prints the totals.

    -z
    Zero the cache statistics.

    -V
    Print the ccache version number

    -c
    Clean the cache and re-calculate the cache file count and size totals. Normally the -c option should not be necessary as ccache keeps the cache below the specified limits at runtime and keeps statistics up to date on each compile. This option is mostly useful if you manually modify the cache contents or believe that the cache size statistics may be inaccurate.

    -C
    Clear the entire cache, removing all cached files.

    -F <maxfiles>
    This sets the maximum number of files allowed in the cache. The value is stored inside the cache directory and applies to all future compiles. Due to the way the value is stored the actual value used is always rounded down to the nearest multiple of 16.

    -M <maxsize>
    This sets the maximum cache size. You can specify a value in gigabytes, megabytes or kilobytes by appending a G, M or K to the value. The default is gigabytes. The actual value stored is rounded down to the nearest multiple of 16 kilobytes.

    20.6 INSTALLATION

    There are two ways to use ccache. You can either prefix your compile commands with "ccache-swig" or you can create a symbolic link between ccache-swig and the names of your compilers. The first method is most convenient if you just want to try out ccache or wish to use it for some specific projects. The second method is most useful for when you wish to use ccache for all your compiles.

    To install for usage by the first method just copy ccache-swig to somewhere in your path.

    To install for the second method do something like this:

    
      cp ccache-swig /usr/local/bin/
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/gcc
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/g++
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/cc
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/swig
    
    
    This will work as long as /usr/local/bin comes before the path to gcc (which is usually in /usr/bin). After installing you may wish to run "which gcc" to make sure that the correct link is being used.

    Note! Do not use a hard link, use a symbolic link. A hardlink will cause "interesting" problems.

    20.7 EXTRA OPTIONS

    When run as a compiler front end ccache usually just takes the same command line options as the compiler you are using. The only exception to this is the option '--ccache-skip'. That option can be used to tell ccache that the next option is definitely not a input filename, and should be passed along to the compiler as-is.

    The reason this can be important is that ccache does need to parse the command line and determine what is an input filename and what is a compiler option, as it needs the input filename to determine the name of the resulting object file (among other things). The heuristic ccache uses in this parse is that any string on the command line that exists as a file is treated as an input file name (usually a C file). By using --ccache-skip you can force an option to not be treated as an input file name and instead be passed along to the compiler as a command line option.

    20.8 ENVIRONMENT VARIABLES

    ccache uses a number of environment variables to control operation. In most cases you won't need any of these as the defaults will be fine.

    CCACHE_DIR
    the CCACHE_DIR environment variable specifies where ccache will keep its cached compiler output. The default is "$HOME/.ccache".

    CCACHE_TEMPDIR
    the CCACHE_TEMPDIR environment variable specifies where ccache will put temporary files. The default is the same as CCACHE_DIR. Note that the CCACHE_TEMPDIR path must be on the same filesystem as the CCACHE_DIR path, so that renames of files between the two directories can work.

    CCACHE_LOGFILE
    If you set the CCACHE_LOGFILE environment variable then ccache will write some log information on cache hits and misses in that file. This is useful for tracking down problems.

    CCACHE_VERBOSE
    If you set the CCACHE_VERBOSE environment variable then ccache will display on stdout all the compiler invocations that it makes. This can useful for debugging unexpected problems.

    CCACHE_PATH
    You can optionally set CCACHE_PATH to a colon separated path where ccache will look for the real compilers. If you don't do this then ccache will look for the first executable matching the compiler name in the normal PATH that isn't a symbolic link to ccache itself.

    CCACHE_CC
    You can optionally set CCACHE_CC to force the name of the compiler to use. If you don't do this then ccache works it out from the command line.

    CCACHE_PREFIX
    This option adds a prefix to the command line that ccache runs when invoking the compiler. Also see the section below on using ccache with distcc.

    CCACHE_DISABLE
    If you set the environment variable CCACHE_DISABLE then ccache will just call the real compiler, bypassing the cache completely.

    CCACHE_READONLY
    the CCACHE_READONLY environment variable tells ccache to attempt to use existing cached object files, but not to try to add anything new to the cache. If you are using this because your CCACHE_DIR is read-only, then you may find that you also need to set CCACHE_TEMPDIR as otherwise ccache will fail to create the temporary files.

    CCACHE_CPP2
    If you set the environment variable CCACHE_CPP2 then ccache will not use the optimisation of avoiding the 2nd call to the pre-processor by compiling the pre-processed output that was used for finding the hash in the case of a cache miss. This is primarily a debugging option, although it is possible that some unusual compilers will have problems with the intermediate filename extensions used in this optimisation, in which case this option could allow ccache to be used.

    CCACHE_NOCOMPRESS
    If you set the environment variable CCACHE_NOCOMPRESS then there is no compression used on files that go into the cache. However, this setting has no effect on how files are retrieved from the cache, compressed results will still be usable.

    CCACHE_NOSTATS
    If you set the environment variable CCACHE_NOSTATS then ccache will not update the statistics files on each compile.

    CCACHE_NLEVELS
    The environment variable CCACHE_NLEVELS allows you to choose the number of levels of hash in the cache directory. The default is 2. The minimum is 1 and the maximum is 8.

    CCACHE_HARDLINK
    If you set the environment variable CCACHE_HARDLINK then ccache will attempt to use hard links from the cache directory when creating the compiler output rather than using a file copy. Using hard links is faster, but can confuse programs like 'make' that rely on modification times. Hard links are never made for compressed cache files.

    CCACHE_RECACHE
    This forces ccache to not use any cached results, even if it finds them. New results are still cached, but existing cache entries are ignored.

    CCACHE_UMASK
    This sets the umask for ccache and all child processes (such as the compiler). This is mostly useful when you wish to share your cache with other users. Note that this also affects the file permissions set on the object files created from your compilations.

    CCACHE_HASHDIR
    This tells ccache to hash the current working directory when calculating the hash that is used to distinguish two compiles. This prevents a problem with the storage of the current working directory in the debug info of a object file, which can lead ccache to give a cached object file that has the working directory in the debug info set incorrectly. This option is off by default as the incorrect setting of this debug info rarely causes problems. If you strike problems with gdb not using the correct directory then enable this option.

    CCACHE_UNIFY
    If you set the environment variable CCACHE_UNIFY then ccache will use the C/C++ unifier when hashing the pre-processor output if -g is not used in the compile. The unifier is slower than a normal hash, so setting this environment variable loses a little bit of speed, but it means that ccache can take advantage of not recompiling when the changes to the source code consist of reformatting only. Note that using CCACHE_UNIFY changes the hash, so cached compiles with CCACHE_UNIFY set cannot be used when CCACHE_UNIFY is not set and vice versa. The reason the unifier is off by default is that it can give incorrect line number information in compiler warning messages.

    CCACHE_EXTENSION
    Normally ccache tries to automatically determine the extension to use for intermediate C pre-processor files based on the type of file being compiled. Unfortunately this sometimes doesn't work, for example when using the aCC compiler on HP-UX. On systems like this you can use the CCACHE_EXTENSION option to override the default. On HP-UX set this environment variable to "i" if you use the aCC compiler.

    CCACHE_STRIPC
    If you set the environment variable CCACHE_STRIPC then ccache will strip the -c option when invoking the preprocessor. This option is primarily for the Sun Workshop C++ compiler as without this option an unwarranted warning is displayed: CC: Warning: "-E" redefines product from "object" to "source (stdout)" when -E and -c is used together.

    CCACHE_SWIG
    When using SWIG as the compiler and it does not have 'swig' in the executable name, then the CCACHE_SWIG environment variable needs to be set in order for ccache to work correctly with SWIG. The use of CCACHE_CPP2 is also recommended for SWIG due to some preprocessor quirks, however, use of CCACHE_CPP2 can often be skipped -- check your generated code with and without this option set. Known problems are using preprocessor directives within %inline blocks and the use of '#pragma SWIG'.

    20.9 CACHE SIZE MANAGEMENT

    By default ccache has a one gigabyte limit on the cache size and no maximum number of files. You can set a different limit using the "ccache -M" and "ccache -F" options, which set the size and number of files limits.

    When these limits are reached ccache will reduce the cache to 20% below the numbers you specified in order to avoid doing the cache clean operation too often.

    20.10 CACHE COMPRESSION

    By default on most platforms ccache will compress all files it puts into the cache using the zlib compression. While this involves a negligible performance slowdown, it significantly increases the number of files that fit in the cache. You can turn off compression setting the CCACHE_NOCOMPRESS environment variable.

    20.11 HOW IT WORKS

    The basic idea is to detect when you are compiling exactly the same code a 2nd time and use the previously compiled output. You detect that it is the same code by forming a hash of:

    • the pre-processor output from running the compiler with -E
    • the command line options
    • the real compilers size and modification time
    • any stderr output generated by the compiler

    These are hashed using md4 (a strong hash) and a cache file is formed based on that hash result. When the same compilation is done a second time ccache is able to supply the correct compiler output (including all warnings etc) from the cache.

    ccache has been carefully written to always produce exactly the same compiler output that you would get without the cache. If you ever discover a case where ccache changes the output of your compiler then please let me know.

    20.12 USING CCACHE WITH DISTCC

    distcc is a very useful program for distributing compilation across a range of compiler servers. It is often useful to combine distcc with ccache, so that compiles that are done are sped up by distcc, but that ccache avoids the compile completely where possible.

    To use distcc with ccache I recommend using the CCACHE_PREFIX option. You just need to set the environment variable CCACHE_PREFIX to 'distcc' and ccache will prefix the command line used with the compiler with the command 'distcc'.

    20.13 SHARING A CACHE

    A group of developers can increase the cache hit rate by sharing a cache directory. The hard links however cause unwanted side effects, as all links to a cached file share the file's modification timestamp. This results in false dependencies to be triggered by timestamp-based build systems whenever another user links to an existing file. Typically, users will see that their libraries and binaries are relinked without reason. To share a cache without side effects, the following conditions need to be met:

    • Use the same CCACHE_DIR environment variable setting
    • Unset the CCACHE_HARDLINK environment variable
    • Make sure everyone sets the CCACHE_UMASK environment variable to 002, this ensures that cached files are accessible to everyone in the group.
    • Make sure that all users have write permission in the entire cache directory (and that you trust all users of the shared cache).
    • Make sure that the setgid bit is set on all directories in the cache. This tells the filesystem to inherit group ownership for new directories. The command "chmod g+s `find $CCACHE_DIR -type d`" might be useful for this.
    • Set CCACHE_NOCOMPRESS for all users, if there are users with versions of ccache that do not support compression.

    20.14 HISTORY

    ccache was inspired by the compilercache shell script written by Erik Thiele and I would like to thank him for an excellent piece of work. See http://www.erikyyy.de/compilercache/ for the Erik's scripts. ccache-swig is a port of the original ccache with support added for use with SWIG.

    I wrote ccache because I wanted to get a bit more speed out of a compiler cache and I wanted to remove some of the limitations of the shell-script version.

    20.15 DIFFERENCES FROM COMPILERCACHE

    The biggest differences between Erik's compilercache script and ccache are:

    • ccache is written in C, which makes it a bit faster (calling out to external programs is mostly what slowed down the scripts).
    • ccache can automatically find the real compiler
    • ccache keeps statistics on hits/misses
    • ccache can do automatic cache management
    • ccache can cache compiler output that includes warnings. In many cases this gives ccache a much higher cache hit rate.
    • ccache can handle a much wider ranger of compiler options
    • ccache avoids a double call to cpp on a cache miss

    20.16 CREDITS

    Thanks to the following people for their contributions to ccache

    • Erik Thiele for the original compilercache script
    • Luciano Rocha for the idea of compiling the pre-processor output to avoid a 2nd cpp pass
    • Paul Russell for many suggestions and the debian packaging

    20.17 AUTHOR

    ccache was written by Andrew Tridgell https://www.samba.org/~tridge/. ccache was adapted to create ccache-swig for use with SWIG by William Fulton.

    If you wish to report a problem or make a suggestion then please email the SWIG developers on the swig-devel mailing list, see http://www.swig.org/mail.html

    ccache is released under the GNU General Public License version 2 or later. Please see the file COPYING for license details.


    21 SWIG and Android

    This chapter describes SWIG's support of Android.

    21.1 Overview

    The Android chapter is fairly short as support for Android is the same as for Java, where the Java Native Interface (JNI) is used to call from Android Java into C or C++ compiled code. Everything in the Java chapter applies to generating code for access from Android Java code. This chapter contains a few Android specific notes and examples.

    21.2 Android examples

    21.2.1 Examples introduction

    The examples require the Android SDK and Android NDK which can be installed as per instructions in the links. The Eclipse version is not required for these examples as just the command line tools are used (shown for Linux as the host, but Windows will be very similar, if not identical in most places). Add the SDK tools and NDK tools to your path and create a directory somewhere for your Android projects (adjust PATH as necessary to where you installed the tools):

    $ export PATH=$HOME/android/android-sdk-linux_x86/tools:$HOME/android/android-sdk-linux_x86/platform-tools:$HOME/android/android-ndk-r6b:$PATH
    $ mkdir AndroidApps 
    $ cd AndroidApps
    

    The examples use a target id of 1. This might need changing depending on your setup. After installation of the Android SDK, the available target ids can be viewed by running the command below. Please adjust the id to suit your target device.

    $ android list targets
    

    The following examples are shipped with SWIG under the Examples/android directory and include a Makefile to build and install each example.

    21.2.2 Simple C example

    This simple C example shows how to call a C function as well as read and modify a global variable. First we'll create and build a pure Java Android app. Afterwards the JNI code will be generated by SWIG and built into the app. First create and build an app called SwigSimple in a subdirectory called simple using the commands below. Adjust the --target id as mentioned earlier in the Examples introduction. Managing Projects from the Command Line on the Android developer's site is a useful reference for these steps.

    $ android create project --target 1 --name SwigSimple --path ./simple --activity SwigSimple --package org.swig.simple
    $ cd simple
    $ ant debug
    

    Modify src/org/swig/simple/SwigSimple.java from the default to:

    package org.swig.simple;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.ScrollView;
    import android.text.method.ScrollingMovementMethod;
    
    public class SwigSimple extends Activity
    {
        TextView outputText = null;
        ScrollView scroller = null;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            outputText = (TextView)findViewById(R.id.OutputText);
            outputText.setText("Press 'Run' to start...\n");
            outputText.setMovementMethod(new ScrollingMovementMethod());
    
            scroller = (ScrollView)findViewById(R.id.Scroller);
        }
    
        public void onRunButtonClick(View view)
        {
          outputText.append("Started...\n");
          nativeCall();
          outputText.append("Finished!\n");
          
          // Ensure scroll to end of text
          scroller.post(new Runnable() {
            public void run() {
              scroller.fullScroll(ScrollView.FOCUS_DOWN);
            }
          });
        }
    
        /** Calls into C/C++ code */
        public void nativeCall()
        {
            // TODO
        }
    }
    

    The above simply adds a Run button and scrollable text view as the GUI aspects of the program. The associated resources need to be created, modify res/layout/main.xml as follows:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <Button
        android:id="@+id/RunButton"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="Run..."  
        android:onClick="onRunButtonClick"
        />
    <ScrollView
        android:id="@+id/Scroller"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView
        android:id="@+id/OutputText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    </ScrollView>
    </LinearLayout>
    

    Rebuild the project with your changes:

    $ ant debug
    

    Although there are no native function calls in the code, yet, you may want to check that this simple pure Java app runs before adding in the native calls. First, set up your Android device for hardware debugging, see Using hardware devices on the Android developer's site. When complete your device should be listed in those attached, something like:

    $ adb devices
    List of devices attached 
    A32-6DBE0001-9FF80000-015D62C3-02018028 device
    

    This means you are now ready to install the application...

    $ adb install bin/SwigSimple-debug.apk 
    95 KB/s (4834 bytes in 0.049s)
            pkg: /data/local/tmp/SwigSimple-debug.apk
    Success
    

    The newly installed 'SwigSimple' app will be amongst all your other applications on the home screen. Run the app and it will show a Run button text box below it. Press the Run button to see the simple text output.

    The application can be uninstalled like any other application and in fact must be uninstalled before installing an updated version. Uninstalling is quite easy too from your host computer:

    $ adb uninstall org.swig.simple
    Success
    

    Now that you have a pure Java Android app working, let's add some JNI code generated from SWIG.

    First create a jni subdirectory and then create some C source code in jni/example.c:

    /* File : example.c */
    
    /* A global variable */
    double Foo = 3.0;
    
    /* Compute the greatest common divisor of positive integers */
    int gcd(int x, int y) {
      int g;
      g = y;
      while (x > 0) {
        g = x;
        x = y % x;
        y = g;
      }
      return g;
    }
    

    Create a SWIG interface file for this C code, jni/example.i :

    /* File : example.i */
    %module example
    
    %inline %{
    extern int    gcd(int x, int y);
    extern double Foo;
    %}
    

    Invoke SWIG as follows:

    $ swig -java -package org.swig.simple -outdir src/org/swig/simple -o jni/example_wrap.c jni/example.i
    

    SWIG generates the following files:

    • src/org/swig/simple/exampleJNI.java
    • src/org/swig/simple/example.java
    • jni/example_wrap.c

    Next we need to create a standard Android NDK build system file jni/Android.mk:

    # File: Android.mk
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := example
    LOCAL_SRC_FILES := example_wrap.c example.c
    
    include $(BUILD_SHARED_LIBRARY)
    

    See the Android NDK documentation for more on the NDK build system and getting started with the NDK. A simple invocation of ndk-build will compile the .c files and generate a shared object/system library. Output will be similar to:

    $ ndk-build
    Compile thumb  : example <= example_wrap.c
    Compile thumb  : example <= example.c
    SharedLibrary  : libexample.so
    Install        : libexample.so => libs/armeabi/libexample.so
    

    Now that the C JNI layer has been built, we can write Java code to call into the this layer. Modify the nativeCall method in src/org/swig/simple/SwigSimple.java to call the JNI code as follows and add the static constructor to load the system library containing the compiled JNI C code:

        /** Calls into C/C++ code */
        public void nativeCall()
        {
          // Call our gcd() function
          
          int x = 42;
          int y = 105;
          int g = example.gcd(x, y);
          outputText.append("The greatest common divisor of " + x + " and " + y + " is " + g + "\n");
    
          // Manipulate the Foo global variable
    
          // Output its current value
          double foo = example.getFoo();
          outputText.append("Foo = " + foo + "\n");
    
          // Change its value
          example.setFoo(3.1415926);
    
          // See if the change took effect
          outputText.append("Foo = " + example.getFoo() + "\n");
    
          // Restore value
          example.setFoo(foo);
        }
    
        /** static constructor */
        static {
            System.loadLibrary("example");
        }
    

    Compile the Java code as usual, uninstall the old version of the app if still installed and re-install the new app:

    $ ant debug
    $ adb uninstall org.swig.simple
    $ adb install bin/SwigSimple-debug.apk 
    

    Run the app again and this time you will see the output pictured below, showing the result of calls into the C code:

    Android screenshot of SwigSimple example

    21.2.3 C++ class example

    The steps for calling C++ code are almost identical to those in the previous C code example. All the steps required to compile and use a simple hierarchy of classes for shapes are shown in this example.

    First create an Android project called SwigClass in a subdirectory called class. The steps below create and build the JNI C++ app. Adjust the --target id as mentioned earlier in the Examples introduction.

    $ android create project --target 1 --name SwigClass --path ./class --activity SwigClass --package org.swig.classexample
    $ cd class
    

    Now create a jni subdirectory and then create a C++ header file jni/example.h which defines our hierarchy of shape classes:

    /* File : example.h */
    
    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      }
      double  x, y;   
      void    move(double dx, double dy);
      virtual double area() = 0;
      virtual double perimeter() = 0;
      static  int nshapes;
    };
    
    class Circle : public Shape {
    private:
      double radius;
    public:
      Circle(double r) : radius(r) { }
      virtual double area();
      virtual double perimeter();
    };
    
    class Square : public Shape {
    private:
      double width;
    public:
      Square(double w) : width(w) { }
      virtual double area();
      virtual double perimeter();
    };
    

    and create the implementation in the jni/example.cpp file:

    /* File : example.cpp */
    
    #include "example.h"
    #define M_PI 3.14159265358979323846
    
    /* Move the shape to a new location */
    void Shape::move(double dx, double dy) {
      x += dx;
      y += dy;
    }
    
    int Shape::nshapes = 0;
    
    double Circle::area() {
      return M_PI*radius*radius;
    }
    
    double Circle::perimeter() {
      return 2*M_PI*radius;
    }
    
    double Square::area() {
      return width*width;
    }
    
    double Square::perimeter() {
      return 4*width;
    }
    

    Create a SWIG interface file for this C++ code in jni/example.i :

    /* File : example.i */
    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Let's just grab the original header file here */
    %include "example.h"
    

    Invoke SWIG as follows, note that the -c++ option is required for C++ code:

    $ swig -c++ -java -package org.swig.classexample -outdir src/org/swig/classexample -o jni/example_wrap.cpp jni/example.i
    

    SWIG generates the following files:

    • src/org/swig/classexample/Square.java
    • src/org/swig/classexample/exampleJNI.java
    • src/org/swig/classexample/example.java
    • src/org/swig/classexample/Circle.java
    • src/org/swig/classexample/Shape.java
    • jni/example_wrap.cpp

    Next we need to create an Android NDK build system file for compiling the C++ code jni/Android.mk. The -frtti compiler flag isn't strictly needed for this example, but is needed for any code that uses C++ RTTI:

    # File: Android.mk
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := example
    LOCAL_SRC_FILES := example_wrap.cpp example.cpp
    LOCAL_CFLAGS    := -frtti
    
    include $(BUILD_SHARED_LIBRARY)
    

    A simple invocation of ndk-build will compile the .cpp files and generate a shared object/system library. Output will be similar to:

    $ ndk-build
    Compile++ thumb  : example <= example_wrap.cpp
    Compile++ thumb  : example <= example.cpp
    StaticLibrary  : libstdc++.a
    SharedLibrary  : libexample.so
    Install        : libexample.so => libs/armeabi/libexample.so
    

    Now that the C JNI layer has been built, we can write Java code to call into this layer. Modify src/org/swig/classexample/SwigClass.java from the default to:

    package org.swig.classexample;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.ScrollView;
    import android.text.method.ScrollingMovementMethod;
    
    public class SwigClass extends Activity
    {
        TextView outputText = null;
        ScrollView scroller = null;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            outputText = (TextView)findViewById(R.id.OutputText);
            outputText.setText("Press 'Run' to start...\n");
            outputText.setMovementMethod(new ScrollingMovementMethod());
    
            scroller = (ScrollView)findViewById(R.id.Scroller);
        }
    
        public void onRunButtonClick(View view)
        {
          outputText.append("Started...\n");
          nativeCall();
          outputText.append("Finished!\n");
          
          // Ensure scroll to end of text
          scroller.post(new Runnable() {
            public void run() {
              scroller.fullScroll(ScrollView.FOCUS_DOWN);
            }
          });
        }
    
        /** Calls into C/C++ code */
        public void nativeCall()
        {
          // ----- Object creation -----
    
          outputText.append( "Creating some objects:\n" );
          Circle c = new Circle(10);
          outputText.append( "    Created circle " + c + "\n");
          Square s = new Square(10);
          outputText.append( "    Created square " + s + "\n");
    
          // ----- Access a static member -----
    
          outputText.append( "\nA total of " + Shape.getNshapes() + " shapes were created\n" );
    
          // ----- Member data access -----
    
          // Notice how we can do this using functions specific to
          // the 'Circle' class.
          c.setX(20);
          c.setY(30);
    
          // Now use the same functions in the base class
          Shape shape = s;
          shape.setX(-10);
          shape.setY(5);
    
          outputText.append( "\nHere is their current position:\n" );
          outputText.append( "    Circle = (" + c.getX() + " " + c.getY() + ")\n" );
          outputText.append( "    Square = (" + s.getX() + " " + s.getY() + ")\n" );
    
          // ----- Call some methods -----
    
          outputText.append( "\nHere are some properties of the shapes:\n" );
          Shape[] shapes = {c, s};
          for (int i=0; i<shapes.length; i++)
          {
            outputText.append( "   " + shapes[i].toString() + "\n" );
            outputText.append( "        area      = " + shapes[i].area() + "\n" );
            outputText.append( "        perimeter = " + shapes[i].perimeter() + "\n" );
          }
    
          // Notice how the area() and perimeter() functions really
          // invoke the appropriate virtual method on each object.
    
          // ----- Delete everything -----
    
          outputText.append( "\nGuess I'll clean up now\n" );
    
          // Note: this invokes the virtual destructor
          // You could leave this to the garbage collector
          c.delete();
          s.delete();
    
          outputText.append( Shape.getNshapes() + " shapes remain\n" );
          outputText.append( "Goodbye\n" );
        }
    
        /** static constructor */
        static {
            System.loadLibrary("example");
        }
    }
    

    Note the static constructor and the interesting JNI code is in the nativeCall method. The remaining code deals with the GUI aspects which are identical to the previous C simple example. Modify res/layout/main.xml to contain the xml for the 'Run' button and scrollable text view:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <Button
        android:id="@+id/RunButton"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="Run..."  
        android:onClick="onRunButtonClick"
        />
    <ScrollView
        android:id="@+id/Scroller"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView
        android:id="@+id/OutputText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    </ScrollView>
    </LinearLayout>
    

    Compile the Java code as usual, uninstall the old version of the app if installed and re-install the new app:

    $ ant debug
    $ adb uninstall org.swig.classexample
    $ adb install bin/SwigClass-debug.apk 
    

    Run the app to see the result of calling the C++ code from Java:

    Android screenshot of SwigClass example

    21.2.4 Other examples

    The Examples/android directory contains further examples which can be run and installed in a similar manner to the previous two examples.

    Note that the 'extend' example is demonstrates the directors feature. Normally C++ exception handling and the STL is not available by default in the version of g++ shipped with Android, but this example turns these features on as described in the next section.

    21.3 C++ STL

    Should the C++ Standard Template Library (STL) be required, an Application.mk file needs to be created in the same directory as the Android.mk directory containing information about the STL to use. See the NDK documentation in the $NDKROOT/docs folder especially CPLUSPLUS-SUPPORT.html. Below is an example of the Application.mk file to make the STLport static library available for use:

    # File: Application.mk
    APP_STL := gnustl_static
    

    22 SWIG and C#

    22.1 Introduction

    The purpose of the C# module is to offer an automated way of accessing existing C/C++ code from .NET languages. The wrapper code implementation uses C# and the Platform Invoke (PInvoke) interface to access natively compiled C/C++ code. The PInvoke interface has been chosen over Microsoft's Managed C++ interface as it is portable to both Microsoft Windows and non-Microsoft platforms. PInvoke is part of the ECMA/ISO C# specification. It is also better suited for robust production environments due to the Managed C++ flaw called the Mixed DLL Loading Problem. SWIG C# works equally well on non-Microsoft operating systems such as Linux, Solaris and Apple Mac using Mono.

    SWIG 3 and later requires .NET 2.0 at a minimum. There are some minor exceptions, where the minimum required is .NET 4.0. This is when using the std::complex and std::list STL containers.

    To get the most out of this chapter an understanding of interop is required. The Microsoft Developer Network (MSDN) has a good reference guide in a section titled "Interop Marshaling". Monodoc, available from the Mono project, has a very useful section titled Interop with native libraries.

    22.1.1 SWIG 2 Compatibility

    In order to minimize name collisions between names generated based on input to SWIG and names used in the generated code from the .NET framework, SWIG 3 fully qualifies the use of all .NET types. Furthermore, SWIG 3 avoids using directives in generated code. This breaks backwards compatibility with typemaps, pragmas, etc written for use with SWIG 2 that assume the presence of using System; or using System.Runtime.InteropServices; directives in the intermediate class imports, module imports, or proxy imports. SWIG 3 supports backwards compatibility though the use of the SWIG2_CSHARP macro. If SWIG2_CSHARP is defined, SWIG 3 generates using directives in the intermediate class, module class, and proxy class code similar to those generated by SWIG 2. This can be done without modifying any of the input code by passing the -DSWIG2_CSHARP commandline parameter when executing swig.

    22.1.2 Additional command line options

    The following table lists the additional commandline options available for the C# module. They can also be seen by using:

    swig -csharp -help 
    
    C# specific options
    -dllimport <dl>Override DllImport attribute name to <dl>
    -namespace <nm>Generate wrappers into C# namespace <nm>
    -noproxyGenerate the low-level functional interface instead of proxy classes
    -oldvarnamesOld intermediary method names for variable wrappers
    -outfile <file>Write all C# into a single <file> located in the output directory

    The -outfile option combines all the generated C# code into a single output file instead of creating multiple C# files. The default, when this option is not provided, is to generate separate .cs files for the module class, intermediary class and each of the generated proxy and type wrapper classes. Note that the file extension (.cs) will not be automatically added and needs to be provided. Due to possible compiler limits it is not advisable to use -outfile for large projects.

    22.2 Differences to the Java module

    The C# module is very similar to the Java module, so until some more complete documentation has been written, please use the Java documentation as a guide to using SWIG with C#. The C# module has the same major SWIG features as the Java module. The rest of this section should be read in conjunction with the Java documentation as it lists the main differences. The most notable differences to Java are the following:

    • When invoking SWIG use the -csharp command line option instead of -java.
    • The -nopgcpp command line option does not exist.
    • The -package command line option does not exist.
    • The -namespace <name> commandline option will generate all code into the namespace specified by <name>. C# supports nested namespaces that are not lexically nested, so nested namespaces will of course also work. For example: -namespace com.bloggs.widget , will generate code into C# namespaces:
      namespace com.bloggs.widget {
        ...
      }
      
      Note that by default, the generated C# classes have no namespace and the module name is unrelated to namespaces. The module name is just like in Java and is merely used to name some of the generated classes.
    • The nspace feature is also supported as described in this general section with a C# example. Unlike Java which requires the use of the -package option when using the nspace feature, the -namespace option is not mandatory for C#.
    • The -dllimport <name> commandline option specifies the name of the DLL for the DllImport attribute for every PInvoke method. If this commandline option is not given, the DllImport DLL name is the same as the module name. This option is useful for when one wants to invoke SWIG multiple times on different modules, yet compile all the resulting code into a single DLL.
    • C/C++ variables are wrapped with C# properties and not JavaBean style getters and setters.
    • Global constants are generated into the module class. There is no constants interface.
    • There is no implementation for type unsafe enums - not deemed necessary.
    • The default enum wrapping approach is proper C# enums, not typesafe enums.
      Note that %csconst(0) will be ignored when wrapping C/C++ enums with proper C# enums. This is because C# enum items must be initialised from a compile time constant. If an enum item has an initialiser and the initialiser doesn't compile as C# code, then the %csconstvalue directive must be used as %csconst(0) will have no effect. If it was used, it would generate an illegal runtime initialisation via a PInvoke call.
    • C# doesn't support the notion of throws clauses. Therefore there is no 'throws' typemap attribute support for adding exception classes to a throws clause. Likewise there is no need for an equivalent to %javaexception. In fact, throwing C# exceptions works quite differently, see C# Exceptions below.
    • The majority of the typemaps are in csharp.swg, not java.swg.
    • Typemap equivalent names:

      jni                         -> ctype
      jtype                       -> imtype
      jstype                      -> cstype
      javain                      -> csin
      javaout                     -> csout
      javadirectorin              -> csdirectorin
      javadirectorout             -> csdirectorout
      javainterfaces              -> csinterfaces and csinterfaces_derived
      javabase                    -> csbase
      javaclassmodifiers          -> csclassmodifiers
      javacode                    -> cscode
      javaimports                 -> csimports
      javabody                    -> csbody
      javafinalize                -> csfinalize
      javadestruct                -> csdisposing and csdispose
      javadestruct_derived        -> csdisposing_derived and csdispose_derived
      javainterfacecode           -> csinterfacecode
      
    • Typemap macros:

      SWIG_JAVABODY_PROXY         -> SWIG_CSBODY_PROXY
      SWIG_JAVABODY_TYPEWRAPPER   -> SWIG_CSBODY_TYPEWRAPPER
      
    • Additional typemaps:

      csvarin                     C# code property set typemap
      csvarout                    C# code property get typemap
      csattributes                C# attributes for attaching to proxy classes/enums
      
    • Additional typemap attributes:

      The "null" attribute in the "out" typemap can be specified to provide a value for $null to expand into for wrapped functions that return non-void. Normally the default value of 0 is used. For example this is needed if you change the return type to void:

      %typemap(ctype) Status "void"
      %typemap(out, null="") Status { ... }
      
    • Feature equivalent names:

      %javaconst                  -> %csconst
      %javaconstvalue             -> %csconstvalue
      %javamethodmodifiers        -> %csmethodmodifiers
      
    • Pragma equivalent names:

      %pragma(java)               -> %pragma(csharp)
      jniclassbase                -> imclassbase
      jniclassclassmodifiers      -> imclassclassmodifiers
      jniclasscode                -> imclasscode
      jniclassimports             -> imclassimports
      jniclassinterfaces          -> imclassinterfaces
      
    • Special variable equivalent names:

      $javaclassname              -> $csclassname
      $&javaclassname             -> $&csclassname
      $*javaclassname             -> $*csclassname
      $javaclazzname              -> $csclazzname
      $javainput                  -> $csinput
      $jnicall                    -> $imcall
      $javainterfacename          -> $csinterfacename
      $&javainterfacename         -> $&csinterfacename
      $*javainterfacename         -> $*csinterfacename
      
    • Unlike the "javain" typemap, the "csin" typemap does not support the 'pgcpp' attribute as the C# module does not have a premature garbage collection prevention parameter. The "csin" typemap supports additional optional attributes called 'cshin' and 'terminator'. The "csdirectorin" typemap supports additional optional attributes called 'terminator'. The 'cshin' attribute should contain the parameter type and name whenever a constructor helper function is generated due to the 'pre' or 'post' attributes. The 'terminator' attribute normally just contains a closing brace for when the 'pre' attribute contains an opening brace, such as when a C# using or fixed block is started. Note that 'pre', 'post', 'terminator' and 'cshin' attributes are not used for marshalling the property set. Please see the Date marshalling example and Date marshalling of properties example for further understanding of these "csin" applicable attributes. Please see the Date marshalling director example for further understanding of the "csdirectorin" attributes.

    • Support for asymmetric type marshalling. The 'ctype', 'imtype' and 'cstype' typemaps support an optional out attribute which is used for output types. If this typemap attribute is specified, then the type specified in the attribute is used for output types and the type specified in the typemap itself is used for the input type. If this typemap attribute is not specified, then the type used for both input and output is the type specified in the typemap. An example shows that char * could be marshalled in different ways,

      %typemap(imtype, out="global::System.IntPtr") char * "string"
      char * function(char *);
      

      The output type is thus IntPtr and the input type is string. The resulting intermediary C# code is:

      public static extern global::System.IntPtr function(string jarg1);
      
    • Support for type attributes. The 'imtype' and 'cstype' typemaps can have an optional inattributes and outattributes typemap attribute. The 'imtype' typemap can also have an optional directorinattributes and directoroutattributes typemap attribute which attaches to director delegates, an implementation detail of directors, see directors implementation. Note that there are C# attributes and typemap attributes, don't get confused between the two!! The C# attributes specified in these typemap attributes are generated wherever the type is used in the C# wrappers. These can be used to specify any C# attribute associated with a C/C++ type, but are more typically used for the C# MarshalAs attribute. For example:

      %typemap(imtype,
               inattributes="[global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]",
               outattributes="[return: global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]") const char * "String"
      
      const char * GetMsg() {}
      void SetMsg(const char *msg) {}
      

      The intermediary class will then have the marshalling as specified by everything in the 'imtype' typemap:

      class examplePINVOKE {
        ...
        [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_GetMsg")]
        [return: global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]
        public static extern String GetMsg();
      
        [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_SetMsg")]
        public static extern void SetMsg([global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]String jarg1);
      }
      

      Note that the DllImport attribute is always generated, irrespective of any additional attributes specified.

      These attributes are associated with the C/C++ parameter type or return type, which is subtly different to the attribute features and typemaps covered next. Note that all these different C# attributes can be combined so that a method has more than one attribute.

      The directorinattributes and directoroutattributes typemap attribute are attached to the delegates in the director class, for example, the SwigDelegateBase_0

    • Support for attaching C# attributes to wrapped methods, variables and enum values. This is done using the %csattributes feature, see %feature directives. Note that C# attributes are attached to proxy classes and enums using the csattributes typemap. For example, imagine we have a custom attribute class, ThreadSafeAttribute, for labelling thread safety. The following SWIG code shows how to attach this C# attribute to some methods and the class declaration itself:

      %typemap(csattributes) AClass          "[ThreadSafe]"
      %csattributes AClass::AClass(double d) "[ThreadSafe(false)]"
      %csattributes AClass::AMethod()        "[ThreadSafe(true)]"
      
      %inline %{
      class AClass {
      public:
        AClass(double a) {}
        void AMethod() {}
      };
      %}
      

      will generate a C# proxy class:

      [ThreadSafe]
      public class AClass : global::System.IDisposable {
        ...
        [ThreadSafe(false)]
        public AClass(double a) ...
      
        [ThreadSafe(true)]
        public void AMethod() ...
      }
      

      If C# attributes need adding to the set or get part of C# properties, when wrapping C/C++ variables, they can be added using the 'csvarin' and 'csvarout' typemaps respectively. Note that the type used for the property is specified in the 'cstype' typemap. If the 'out' attribute exists in this typemap, then the type used is from the 'out' attribute.

      An example for attaching attributes to the enum and enum values is shown below.

      %typemap(csattributes) Couleur "[global::System.ComponentModel.Description(\"Colours\")]"
      %csattributes Rouge "[global::System.ComponentModel.Description(\"Red\")]"
      %csattributes Vert "[global::System.ComponentModel.Description(\"Green\")]"
      %inline %{
        enum Couleur { Rouge, Orange, Vert };
      %}
      

      which will result in the following C# enum:

      [global::System.ComponentModel.Description("Colours")]
      public enum Couleur {
        [global::System.ComponentModel.Description("Red")]
        Rouge,
        Orange,
        [global::System.ComponentModel.Description("Green")]
        Vert
      }
      
    • The intermediary classname has PINVOKE appended after the module name instead of JNI, for example modulenamePINVOKE .

    • The %csmethodmodifiers feature can also be applied to variables as well as methods. In addition to the default public modifier that SWIG generates when %csmethodmodifiers is not specified, the feature will also replace the virtual/new /override modifiers that SWIG thinks is appropriate. This feature is useful for some obscure cases where SWIG might get the virtual/new/override modifiers incorrect, for example with multiple inheritance.

    • The name of the intermediary class can be changed from its default, that is, the module name with PINVOKE appended after it. The module directive attribute imclassname is used to achieve this:

      %module (imclassname="name") modulename
      

      If name is the same as modulename then the module class name gets changed from modulename to modulenameModule.

    • There is no additional 'premature garbage collection prevention parameter' as the marshalling of the HandleRef object takes care of ensuring a reference to the proxy class is held until the unmanaged call completed.

    $dllimport
    This is a C# only special variable that can be used in typemaps, pragmas, features etc. The special variable will get translated into the value specified by the -dllimport commandline option if specified, otherwise it is equivalent to the $module special variable.

    $imclassname
    This special variable expands to the intermediary class name. For C# this is usually the same as '$modulePINVOKE' ('$moduleJNI' for Java), unless the imclassname attribute is specified in the %module directive.

    The directory Examples/csharp has a number of simple examples. Visual Studio .NET 2003 solution and project files are available for compiling with the Microsoft .NET C# compiler on Windows. This also works with newer versions of Visual Studio if you allow it to convert the solution to the latest version. If your SWIG installation went well on a Unix environment and your C# compiler was detected, you should be able to type make in each example directory. After SWIG has run and both the C# and C/C++ compilers have finished building, the examples will be run, by either running runme.exe or by running mono runme.exe (Mono C# compiler). Windows users can also get the examples working using a Cygwin or MinGW environment for automatic configuration of the example makefiles. Any one of the C# compilers (Mono or Microsoft) can be detected from within a Cygwin or Mingw environment if installed in your path.

    22.3 Void pointers

    By default SWIG treats void * as any other pointer and hence marshalls it as a type wrapper class called SWIGTYPE_p_void . If you want to marshall with the .NET System.IntPtr type instead, there is a simple set of named typemaps called void *VOID_INT_PTR that can be used. They can be applied like any other named typemaps:

    %apply void *VOID_INT_PTR { void * }
    void * f(void *v);
    

    22.4 C# Arrays

    There are various ways to pass arrays from C# to C/C++. The default wrapping treats arrays as pointers and as such simple type wrapper classes are generated, eg SWIGTYPE_p_int when wrapping the C type int [] or int *. This gives a rather restricted use of the underlying unmanaged code and the most practical way to use arrays is to enhance or customise with one of the following three approaches; namely the SWIG C arrays library, P/Invoke default array marshalling or pinned arrays.

    22.4.1 The SWIG C arrays library

    The C arrays library keeps all the array memory in the unmanaged layer. The library is available to all language modules and is documented in the carrays.i library section. Please refer to this section for details, but for convenience, the C# usage for the two examples outlined there is shown below.

    For the %array_functions example, the equivalent usage would be:

    SWIGTYPE_p_double a = example.new_doubleArray(10);  // Create an array
    for (int i=0; i<10; i++)
      example.doubleArray_setitem(a, i, 2*i);           // Set a value
    example.print_array(a);                             // Pass to C
    example.delete_doubleArray(a);                      // Destroy array
    

    and for the %array_class example, the equivalent usage would be:

    doubleArray c = new doubleArray(10);    // Create double[10]
    for (int i=0; i<10; i++)
      c.setitem(i, 2*i);                    // Assign values
    example.print_array(c.cast());          // Pass to C
    

    22.4.2 Managed arrays using P/Invoke default array marshalling

    In the P/Invoke default marshalling scheme, one needs to designate whether the invoked function will treat a managed array parameter as input, output, or both. When the function is invoked, the CLR allocates a separate chunk of memory as big as the given managed array, which is automatically released at the end of the function call. If the array parameter is marked as being input, the content of the managed array is copied into this buffer when the call is made. Correspondingly, if the array parameter is marked as being output, the contents of the reserved buffer are copied back into the managed array after the call returns. A pointer to this buffer is passed to the native function.

    The reason for allocating a separate buffer is to leave the CLR free to relocate the managed array object during garbage collection. If the overhead caused by the copying is causing a significant performance penalty, consider pinning the managed array and passing a direct reference as described in the next section.

    For more information on the subject, see the Default Marshaling for Arrays article on MSDN.

    The P/Invoke default marshalling is supported by the arrays_csharp.i library via the INPUT, OUTPUT and INOUT typemaps. Let's look at some example usage. Consider the following C function:

    void myArrayCopy(int *sourceArray, int *targetArray, int nitems);
    

    We can now instruct SWIG to use the default marshalling typemaps by

    %include "arrays_csharp.i"
    
    %apply int INPUT[]  {int *sourceArray}
    %apply int OUTPUT[] {int *targetArray}
    

    As a result, we get the following method in the module class:

    public static void myArrayCopy(int[] sourceArray, int[] targetArray, int nitems) {
      examplePINVOKE.myArrayCopy(sourceArray, targetArray, nitems);
    }
    

    If we look beneath the surface at the corresponding intermediary class code, we see that SWIG has generated code that uses attributes (from the System.Runtime.InteropServices namespace) to tell the CLR to use default marshalling for the arrays:

    [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArrayCopy")]
    public static extern void myArrayCopy([global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg1, 
                                          [global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg2,
                                           int jarg3);
    

    As an example of passing an inout array (i.e. the target function will both read from and write to the array), consider this C function that swaps a given number of elements in the given arrays:

    void myArraySwap(int *array1, int *array2, int nitems);
    

    Now, we can instruct SWIG to wrap this by

    %include "arrays_csharp.i"
    
    %apply int INOUT[] {int *array1}
    %apply int INOUT[] {int *array2}
    

    This results in the module class method

      public static void myArraySwap(int[] array1, int[] array2, int nitems) {
        examplePINVOKE.myArraySwap(array1, array2, nitems);
      }
    

    and intermediary class method

      [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArraySwap")]
      public static extern void myArraySwap([global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg1, 
                                            [global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg2,
                                             int jarg3);
    

    22.4.3 Managed arrays using pinning

    It is also possible to pin a given array in memory (i.e. fix its location in memory), obtain a direct pointer to it, and then pass this pointer to the wrapped C/C++ function. This approach involves no copying, but it makes the work of the garbage collector harder as the managed array object can not be relocated before the fix on the array is released. You should avoid fixing arrays in memory in cases where the control may re-enter the managed side via a callback and/or another thread may produce enough garbage to trigger garbage collection.

    For more information, see the fixed statement in the C# language reference.

    Now let's look at an example using pinning, thus avoiding the CLR making copies of the arrays passed as parameters. The arrays_csharp.i library file again provides the required support via the FIXED typemaps. Let's use the same function from the previous section:

    void myArrayCopy(int *sourceArray, int *targetArray, int nitems);
    

    We now need to declare the module class method unsafe, as we are using pointers:

    %csmethodmodifiers myArrayCopy "public unsafe";
     

    Apply the appropriate typemaps to the array parameters:

    %include "arrays_csharp.i"
    
    %apply int FIXED[] {int *sourceArray}
    %apply int FIXED[] {int *targetArray}
    

    Notice that there is no need for separate in, out or inout typemaps as is the case when using P/Invoke default marshalling.

    As a result, we get the following method in the module class:

      public unsafe static void myArrayCopy(int[] sourceArray, int[] targetArray, int nitems) {
        fixed ( int *swig_ptrTo_sourceArray = sourceArray ) {
        fixed ( int *swig_ptrTo_targetArray = targetArray ) {
        {
          examplePINVOKE.myArrayCopy((global::System.IntPtr)swig_ptrTo_sourceArray, (global::System.IntPtr)swig_ptrTo_targetArray,
                                     nitems);
        }
        }
        }
      }
    

    On the method signature level the only difference to the version using P/Invoke default marshalling is the "unsafe" quantifier, which is required because we are handling pointers.

    Also the intermediary class method looks a little different from the default marshalling example - the method is expecting an IntPtr as the parameter type.

    [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArrayCopy")]
    public static extern void myArrayCopy(global::System.IntPtr jarg1, global::System.IntPtr jarg2, int jarg3);
    

    22.5 C# Exceptions

    It is possible to throw a C# Exception from C/C++ code. SWIG already provides the framework for throwing C# exceptions if it is able to detect that a C++ exception could be thrown. Automatically detecting that a C++ exception could be thrown is only possible when a C++ exception specification is used, see Exception specifications. The Exception handling with %exception section details the %exception feature. Customised code for handling exceptions with or without a C++ exception specification is possible and the details follow. However anyone wishing to do this should be familiar with the contents of the sections referred to above.

    Unfortunately a C# exception cannot simply be thrown from unmanaged code for a variety of reasons. Most notably being that throwing a C# exception results in exceptions being thrown across the C PInvoke interface and C does not understand exceptions. The design revolves around a C# exception being constructed and stored as a pending exception, to be thrown only when the unmanaged code has completed. Implementing this is a tad involved and there are thus some unusual typemap constructs. Some practical examples follow and they should be read in conjunction with the rest of this section.

    First some details about the design that must be followed. Each typemap or feature that generates unmanaged code supports an attribute called canthrow. This is simply a flag which when set indicates that the code in the typemap/feature has code which might want to throw a C# exception. The code in the typemap/feature can then raise a C# exception by calling one of the C functions, SWIG_CSharpSetPendingException() or SWIG_CSharpSetPendingExceptionArgument(). When called, the function makes a callback into the managed world via a delegate. The callback creates and stores an exception ready for throwing when the unmanaged code has finished. The typemap/feature unmanaged code is then expected to force an immediate return from the unmanaged wrapper function, so that the pending managed exception can then be thrown. The support code has been carefully designed to be efficient as well as thread-safe. However to achieve the goal of efficiency requires some optional code generation in the managed code typemaps. Code to check for pending exceptions is generated if and only if the unmanaged code has code to set a pending exception, that is if the canthrow attribute is set. The optional managed code is generated using the excode typemap attribute and $excode special variable in the relevant managed code typemaps. Simply, if any relevant unmanaged code has the canthrow attribute set, then any occurrences of $excode is replaced with the code in the excode attribute. If the canthrow attribute is not set, then any occurrences of $excode are replaced with nothing.

    The prototypes for the SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() functions are

    static void SWIG_CSharpSetPendingException(SWIG_CSharpExceptionCodes code,
                                               const char *msg);
    
    static void SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpExceptionArgumentCodes code,
                                                       const char *msg,
                                                       const char *param_name);
    

    The first parameter defines which .NET exceptions can be thrown:

    typedef enum {
      SWIG_CSharpApplicationException,
      SWIG_CSharpArithmeticException,
      SWIG_CSharpDivideByZeroException,
      SWIG_CSharpIndexOutOfRangeException,
      SWIG_CSharpInvalidCastException,
      SWIG_CSharpInvalidOperationException,
      SWIG_CSharpIOException,
      SWIG_CSharpNullReferenceException,
      SWIG_CSharpOutOfMemoryException,
      SWIG_CSharpOverflowException,
      SWIG_CSharpSystemException
    } SWIG_CSharpExceptionCodes;
    
    typedef enum {
      SWIG_CSharpArgumentException,
      SWIG_CSharpArgumentNullException,
      SWIG_CSharpArgumentOutOfRangeException,
    } SWIG_CSharpExceptionArgumentCodes;
    

    where, for example, SWIG_CSharpApplicationException corresponds to the .NET exception, ApplicationException. The msg and param_name parameters contain the C# exception message and parameter name associated with the exception.

    The %exception feature in C# has the canthrow attribute set. The %csnothrowexception feature is like %exception, but it does not have the canthrow attribute set so should only be used when a C# exception is not created.

    22.5.1 C# exception example using "check" typemap

    Let's say we have the following simple C++ method:

    void positivesonly(int number);
    

    and we want to check that the input number is always positive and if not throw a C# ArgumentOutOfRangeException. The "check" typemap is designed for checking input parameters. Below you will see the canthrow attribute is set because the code contains a call to SWIG_CSharpSetPendingExceptionArgument(). The full example follows:

    %module example
    
    %typemap(check, canthrow=1) int number %{
    if ($1 < 0) {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
                                             "only positive numbers accepted", "number");
      return $null;
    }
    // SWIGEXCODE is a macro used by many other csout typemaps
    %define SWIGEXCODE
     "\n    if ($modulePINVOKE.SWIGPendingException.Pending)"
     "\n      throw $modulePINVOKE.SWIGPendingException.Retrieve();"
    %enddef
    %typemap(csout, excode=SWIGEXCODE) void {
        $imcall;$excode
      }
    %}
    
    %inline %{
    
    void positivesonly(int number) {
    }
    
    %}
    

    When the following C# code is executed:

    public class runme {
      static void Main() {
        example.positivesonly(-1);
      }
    }
    

    The exception is thrown:

    Unhandled Exception: System.ArgumentOutOfRangeException: only positive numbers accepted
    Parameter name: number
    in <0x00034> example:positivesonly (int)
    in <0x0000c> runme:Main ()
    

    Now let's analyse the generated code to gain a fuller understanding of the typemaps. The generated unmanaged C++ code is:

    SWIGEXPORT void SWIGSTDCALL CSharp_positivesonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
    
      if (arg1 < 0) {
        SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
          "only positive numbers accepted", "number");
        return ;
      }
    
      positivesonly(arg1);
    
    }
    

    This largely comes from the "check" typemap. The managed code in the module class is:

    public class example {
      public static void positivesonly(int number) {
        examplePINVOKE.positivesonly(number);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
    }
    

    This comes largely from the "csout" typemap.

    The "csout" typemap is the same as the default void "csout" typemap so is not strictly necessary for the example. However, it is shown to demonstrate what managed output code typemaps should contain, that is, a $excode special variable and an excode attribute. Also note that $excode is expanded into the code held in the excode attribute. The $imcall as always expands into examplePINVOKE.positivesonly(number). The exception support code in the intermediary class, examplePINVOKE, is not shown, but is contained within the inner classes, SWIGPendingException and SWIGExceptionHelper and is always generated. These classes can be seen in any of the generated wrappers. However, all that is required of a user is as demonstrated in the "csin" typemap above. That is, is to check SWIGPendingException.Pending and to throw the exception returned by SWIGPendingException.Retrieve().

    If the "check" typemap did not exist, then the following module class would instead be generated:

    public class example {
      public static void positivesonly(int number) {
        examplePINVOKE.positivesonly(number);
      }
    
    }
    

    Here we see the pending exception checking code is omitted. In fact, the code above would be generated if the canthrow attribute was not in the "check" typemap, such as:

    %typemap(check) int number %{
    if ($1 < 0) {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
                                             "only positive numbers accepted", "number");
      return $null;
    }
    %}
    

    Note that if SWIG detects you have used SWIG_CSharpSetPendingException() or SWIG_CSharpSetPendingExceptionArgument() without setting the canthrow attribute you will get a warning message similar to

    example.i:21: Warning 845: Unmanaged code contains a call to a SWIG_CSharpSetPendingException
    method and C# code does not handle pending exceptions via the canthrow attribute.
    

    Actually it will issue this warning for any function beginning with SWIG_CSharpSetPendingException.

    22.5.2 C# exception example using %exception

    Let's consider a similar, but more common example that throws a C++ exception from within a wrapped function. We can use %exception as mentioned in Exception handling with %exception.

    %exception negativesonly(int value) %{
    try {
      $action
    } catch (std::out_of_range e) {
      SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what());
      return $null;
    }
    %}
    
    %inline %{
    #include <stdexcept>
    void negativesonly(int value) {
      if (value >= 0)
        throw std::out_of_range("number should be negative");
    }
    %}
    

    The generated unmanaged code this time catches the C++ exception and converts it into a C# ApplicationException.

    SWIGEXPORT void SWIGSTDCALL CSharp_negativesonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
    
      try {
        negativesonly(arg1);
    
      } catch (std::out_of_range e) {
        SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what());
        return ;
      }
    }
    

    The managed code generated does check for the pending exception as mentioned earlier as the C# version of %exception has the canthrow attribute set by default:

      public static void negativesonly(int value) {
        examplePINVOKE.negativesonly(value);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    

    22.5.3 C# exception example using exception specifications

    When C++ exception specifications are used, SWIG is able to detect that the method might throw an exception. By default SWIG will automatically generate code to catch the exception and convert it into a managed ApplicationException, as defined by the default "throws" typemaps. The following example has a user supplied "throws" typemap which is used whenever an exception specification contains a std::out_of_range, such as the evensonly method below.

    %typemap(throws, canthrow=1) std::out_of_range {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, $1.what(), NULL);
      return $null;
    }
    
    %inline %{
    #include <stdexcept>
    void evensonly(int input) throw (std::out_of_range) {
      if (input%2 != 0)
        throw std::out_of_range("number is not even");
    }
    %}
    

    Note that the type for the throws typemap is the type in the exception specification. SWIG generates a try catch block with the throws typemap code in the catch handler.

    SWIGEXPORT void SWIGSTDCALL CSharp_evensonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
      try {
        evensonly(arg1);
      }
      catch(std::out_of_range &_e) {
        {
          SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, (&_e)->what(), NULL);
          return ;
        }
      }
    }
    

    Multiple catch handlers are generated should there be more than one exception specifications declared.

    22.5.4 Custom C# ApplicationException example

    This example involves a user defined exception. The conventional .NET exception handling approach is to create a custom ApplicationException and throw it in your application. The goal in this example is to convert the STL std::out_of_range exception into one of these custom .NET exceptions.

    The default exception handling is quite easy to use as the SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() methods are provided by SWIG. However, for a custom C# exception, the boiler plate code that supports these functions needs replicating. In essence this consists of some C/C++ code and C# code. The C/C++ code can be generated into the wrapper file using the %insert(runtime) directive and the C# code can be generated into the intermediary class using the imclasscode pragma as follows:

    %insert(runtime) %{
      // Code to handle throwing of C# CustomApplicationException from C/C++ code.
      // The equivalent delegate to the callback, CSharpExceptionCallback_t, is CustomExceptionDelegate
      // and the equivalent customExceptionCallback instance is customDelegate
      typedef void (SWIGSTDCALL* CSharpExceptionCallback_t)(const char *);
      CSharpExceptionCallback_t customExceptionCallback = NULL;
    
      extern "C" SWIGEXPORT
      void SWIGSTDCALL CustomExceptionRegisterCallback(CSharpExceptionCallback_t customCallback) {
        customExceptionCallback = customCallback;
      }
    
      // Note that SWIG detects any method calls named starting with
      // SWIG_CSharpSetPendingException for warning 845
      static void SWIG_CSharpSetPendingExceptionCustom(const char *msg) {
        customExceptionCallback(msg);
      }
    %}
    
    %pragma(csharp) imclasscode=%{
      class CustomExceptionHelper {
        // C# delegate for the C/C++ customExceptionCallback
        public delegate void CustomExceptionDelegate(string message);
        static CustomExceptionDelegate customDelegate =
                                       new CustomExceptionDelegate(SetPendingCustomException);
    
        [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="CustomExceptionRegisterCallback")]
        public static extern
               void CustomExceptionRegisterCallback(CustomExceptionDelegate customCallback);
    
        static void SetPendingCustomException(string message) {
          SWIGPendingException.Set(new CustomApplicationException(message));
        }
    
        static CustomExceptionHelper() {
          CustomExceptionRegisterCallback(customDelegate);
        }
      }
      static CustomExceptionHelper exceptionHelper = new CustomExceptionHelper();
    %}
    

    The method stored in the C# delegate instance, customDelegate is what gets called by the C/C++ callback. However, the equivalent to the C# delegate, that is the C/C++ callback, needs to be assigned before any unmanaged code is executed. This is achieved by putting the initialisation code in the intermediary class. Recall that the intermediary class contains all the PInvoke methods, so the static variables in the intermediary class will be initialised before any of the PInvoke methods in this class are called. The exceptionHelper static variable ensures the C/C++ callback is initialised with the value in customDelegate by calling the CustomExceptionRegisterCallback method in the CustomExceptionHelper static constructor. Once this has been done, unmanaged code can make callbacks into the managed world as customExceptionCallback will be initialised with a valid callback/delegate. Any calls to SWIG_CSharpSetPendingExceptionCustom() will make the callback to create the pending exception in the same way that SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() does. In fact the method has been similarly named so that SWIG can issue the warning about missing canthrow attributes as discussed earlier. It is an invaluable warning as it is easy to forget the canthrow attribute when writing typemaps/features.

    The SWIGPendingException helper class is not shown, but is generated as an inner class into the intermediary class. It stores the pending exception in Thread Local Storage so that the exception handling mechanism is thread safe.

    The boiler plate code above must be used in addition to a handcrafted CustomApplicationException:

    // Custom C# Exception
    class CustomApplicationException : global::System.ApplicationException {
      public CustomApplicationException(string message) 
        : base(message) {
      }
    }
    

    and the SWIG interface code:

    %typemap(throws, canthrow=1) std::out_of_range {
      SWIG_CSharpSetPendingExceptionCustom($1.what());
      return $null;
    }
    
    %inline %{
    void oddsonly(int input) throw (std::out_of_range) {
      if (input%2 != 1)
        throw std::out_of_range("number is not odd");
    }
    %}
    

    The "throws" typemap now simply calls our new SWIG_CSharpSetPendingExceptionCustom() function so that the exception can be caught, as such:

    try {
      example.oddsonly(2);
    } catch (CustomApplicationException e) {
      ...
    }
    

    22.6 C# Directors

    The SWIG directors feature adds extra code to the generated C# proxy classes that enable these classes to be used in cross-language polymorphism. Essentially, it enables unmanaged C++ code to call back into managed code for virtual methods so that a C# class can derive from a wrapped C++ class.

    The following sections provide information on the C# director implementation and contain most of the information required to use the C# directors. However, the Java directors section should also be read in order to gain more insight into directors.

    22.6.1 Directors example

    Imagine we are wrapping a C++ base class, Base, from which we would like to inherit in C#. Such a class is shown below as well as another class, Caller, which calls the virtual method UIntMethod from pure unmanaged C++ code.

    // file: example.h
    class Base {
    public:
      virtual ~Base() {}
    
      virtual unsigned int UIntMethod(unsigned int x) {
        std::cout << "Base - UIntMethod(" << x << ")" << std::endl;
        return x;
      }
      virtual void BaseBoolMethod(const Base &b, bool flag) {}
    };
    
    class Caller {
    public:
      Caller(): m_base(0) {}
      ~Caller() { delBase(); }
      void set(Base *b) { delBase(); m_base = b; }
      void reset() { m_base = 0; }
      unsigned int UIntMethodCall(unsigned int x) { return m_base->UIntMethod(x); }
    
    private:
      Base *m_base;
      void delBase() { delete m_base; m_base = 0; }
    };
    

    The director feature is turned off by default and the following simple interface file shows how directors are enabled for the class Base.

    /* File : example.i */
    %module(directors="1") example
    %{
    #include "example.h"
    %}
    
    %feature("director") Base;
    
    %include "example.h"
    

    The following is a C# class inheriting from Base:

    public class CSharpDerived : Base
    {
      public override uint UIntMethod(uint x)
      {
        Console.WriteLine("CSharpDerived - UIntMethod({0})", x);
        return x;
      }
    }
    

    The Caller class can demonstrate the UIntMethod method being called from unmanaged code using the following C# code:

    public class runme
    {
      static void Main() 
      {
        Caller myCaller = new Caller();
    
        // Test pure C++ class
        using (Base myBase = new Base())
        {
          makeCalls(myCaller, myBase);
        }
    
        // Test director / C# derived class
        using (Base myBase = new CSharpDerived())
        {
          makeCalls(myCaller, myBase);
        }
      }
    
      static void makeCalls(Caller myCaller, Base myBase)
      {
        myCaller.set(myBase);
        myCaller.UIntMethodCall(123);
        myCaller.reset();
      }
    }
    

    If the above is run, the output is then:

    Base - UIntMethod(123)
    CSharpDerived - UIntMethod(123)
    

    22.6.2 Directors implementation

    The previous section demonstrated a simple example where the virtual UIntMethod method was called from C++ code, even when the overridden method is implemented in C#. The intention of this section is to gain an insight into how the director feature works. It shows the generated code for the two virtual methods, UIntMethod and BaseBoolMethod, when the director feature is enabled for the Base class.

    Below is the generated C# Base director class.

    public class Base : global::System.IDisposable {
      private global::System.Runtime.InteropServices.HandleRef swigCPtr;
      protected bool swigCMemOwn;
    
      internal Base(global::System.IntPtr cPtr, bool cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
      }
    
      internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Base obj) {
        return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
      }
    
      ~Base() {
        Dispose();
      }
    
      public virtual void Dispose() {
        lock(this) {
          if(swigCPtr.Handle != global::System.IntPtr.Zero && swigCMemOwn) {
            swigCMemOwn = false;
            examplePINVOKE.delete_Base(swigCPtr);
          }
          swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
          global::System.GC.SuppressFinalize(this);
        }
      }
    
      public virtual uint UIntMethod(uint x) {
        uint ret = examplePINVOKE.Base_UIntMethod(swigCPtr, x);
        return ret;
      }
    
      public virtual void BaseBoolMethod(Base b, bool flag) {
        examplePINVOKE.Base_BaseBoolMethod(swigCPtr, Base.getCPtr(b), flag);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
      public Base() : this(examplePINVOKE.new_Base(), true) {
        SwigDirectorConnect();
      }
    
      private void SwigDirectorConnect() {
        if (SwigDerivedClassHasMethod("UIntMethod", swigMethodTypes0))
          swigDelegate0 = new SwigDelegateBase_0(SwigDirectorMethodUIntMethod);
        if (SwigDerivedClassHasMethod("BaseBoolMethod", swigMethodTypes1))
          swigDelegate1 = new SwigDelegateBase_1(SwigDirectorMethodBaseBoolMethod);
        examplePINVOKE.Base_director_connect(swigCPtr, swigDelegate0, swigDelegate1);
      }
    
      private bool SwigDerivedClassHasMethod(string methodName, global::System.global::System.Type[] methodTypes) {
        System.Reflection.MethodInfo methodInfo = this.GetType().GetMethod(methodName, methodTypes);
        bool hasDerivedMethod = methodInfo.DeclaringType.IsSubclassOf(typeof(Base));
        return hasDerivedMethod;
      }
    
      private uint SwigDirectorMethodUIntMethod(uint x) {
        return UIntMethod(x);
      }
    
      private void SwigDirectorMethodBaseBoolMethod(global::System.IntPtr b, bool flag) {
        BaseBoolMethod(new Base(b, false), flag);
      }
    
      public delegate uint SwigDelegateBase_0(uint x);
      public delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    
      private SwigDelegateBase_0 swigDelegate0;
      private SwigDelegateBase_1 swigDelegate1;
    
      private static global::System.Type[] swigMethodTypes0 = new global::System.Type[] { typeof(uint) };
      private static global::System.Type[] swigMethodTypes1 = new global::System.Type[] { typeof(Base), typeof(bool) };
    }
    

    Everything from the SwigDirectorConnect() method and below is code that is only generated when directors are enabled. The design comprises a C# delegate being initialised for each virtual method on construction of the class. Let's examine the BaseBoolMethod.

    In the Base constructor a call is made to SwigDirectorConnect() which contains the initialisation code for all the virtual methods. It uses a support method, SwigDerivedClassHasMethod(), which simply uses reflection to determine if the named method, BaseBoolMethod, with the list of required parameter types, exists in a subclass. If it does not exist, the delegate is not initialised as there is no need for unmanaged code to call back into managed C# code. However, if there is an overridden method in any subclass, the delegate is required. It is then initialised to the SwigDirectorMethodBaseBoolMethod which in turn will call BaseBoolMethod if invoked. The delegate is not initialised to the BaseBoolMethod directly as quite often types will need marshalling from the unmanaged type to the managed type in which case an intermediary method ( SwigDirectorMethodBaseBoolMethod) is required for the marshalling. In this case, the C# Base class needs to be created from the unmanaged IntPtr type.

    The last thing that SwigDirectorConnect() does is to pass the delegates to the unmanaged code. It calls the intermediary method Base_director_connect() which is really a call to the C function CSharp_Base_director_connect(). This method simply maps each C# delegate onto a C function pointer.

    SWIGEXPORT void SWIGSTDCALL CSharp_Base_director_connect(void *objarg, 
                                            SwigDirector_Base::SWIG_Callback0_t callback0,
                                            SwigDirector_Base::SWIG_Callback1_t callback1) {
      Base *obj = (Base *)objarg;
      SwigDirector_Base *director = dynamic_cast<SwigDirector_Base *>(obj);
      if (director) {
        director->swig_connect_director(callback0, callback1);
      }
    }
    
    class SwigDirector_Base : public Base, public Swig::Director {
    public:
      SwigDirector_Base();
      virtual unsigned int UIntMethod(unsigned int x);
      virtual ~SwigDirector_Base();
      virtual void BaseBoolMethod(Base const &b, bool flag);
    
      typedef unsigned int (SWIGSTDCALL* SWIG_Callback0_t)(unsigned int);
      typedef void (SWIGSTDCALL* SWIG_Callback1_t)(void *, unsigned int);
      void swig_connect_director(SWIG_Callback0_t callbackUIntMethod,
                                 SWIG_Callback1_t callbackBaseBoolMethod);
    
    private:
      SWIG_Callback0_t swig_callbackUIntMethod;
      SWIG_Callback1_t swig_callbackBaseBoolMethod;
      void swig_init_callbacks();
    };
    
    void SwigDirector_Base::swig_connect_director(SWIG_Callback0_t callbackUIntMethod, 
                                                  SWIG_Callback1_t callbackBaseBoolMethod) {
      swig_callbackUIntMethod = callbackUIntMethod;
      swig_callbackBaseBoolMethod = callbackBaseBoolMethod;
    }
    

    Note that for each director class SWIG creates an unmanaged director class for making the callbacks. For example Base has SwigDirector_Base and SwigDirector_Base is derived from Base. Should a C# class be derived from Base, the underlying C++ SwigDirector_Base is created rather than Base. The SwigDirector_Base class then implements all the virtual methods, redirecting calls up to managed code if the callback/delegate is non-zero. The implementation of SwigDirector_Base::BaseBoolMethod shows this - the callback is made by invoking the swig_callbackBaseBoolMethod function pointer:

    void SwigDirector_Base::BaseBoolMethod(Base const &b, bool flag) {
      void * jb = 0 ;
      unsigned int jflag  ;
      
      if (!swig_callbackBaseBoolMethod) {
        Base::BaseBoolMethod(b, flag);
        return;
      } else {
        jb = (Base *) &b; 
        jflag = flag;
        swig_callbackBaseBoolMethod(jb, jflag);
      }
    }
    

    The delegates from the above example are public by default:

      public delegate uint SwigDelegateBase_0(uint x);
      public delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    

    These can be changed if desired via the csdirectordelegatemodifiers %feature directive. For example, using %feature("csdirectordelegatemodifiers") "internal" before SWIG parses the Base class will change all the delegates to internal :

      internal delegate uint SwigDelegateBase_0(uint x);
      internal delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    

    22.6.3 Director caveats

    There is a subtle gotcha with directors. If default parameters are used, it is recommended to follow a pattern of always calling a single method in any C# derived class. An example will clarify this and the reasoning behind the recommendation. Consider the following C++ class wrapped as a director class:

    class Defaults {
    public:
      virtual ~Defaults();
      virtual void DefaultMethod(int a=-100);
    };
    

    Recall that C++ methods with default parameters generate overloaded methods for each defaulted parameter, so a C# derived class can be created with two DefaultMethod override methods:

    public class CSharpDefaults : Defaults
    {
      public override void DefaultMethod()
      {
        DefaultMethod(-100); // note C++ default value used
      }
      public override void DefaultMethod(int x)
      {
      }
    }
    

    It may not be clear at first, but should a user intend to call CSharpDefaults.DefaultMethod() from C++, a call is actually made to CSharpDefaults.DefaultMethod(int). This is because the initial call is made in C++ and therefore the DefaultMethod(int) method will be called as is expected with C++ calls to methods with defaults, with the default being set to -100. The callback/delegate matching this method is of course the overloaded method DefaultMethod(int). However, a call from C# to CSharpDefaults.DefaultMethod() will of course call this exact method and in order for behaviour to be consistent with calls from C++, the implementation should pass the call on to CSharpDefaults.DefaultMethod(int)using the C++ default value, as shown above.

    22.7 Multiple modules

    When using multiple modules it is possible to compile each SWIG generated wrapper into a different assembly. However, by default the generated code may not compile if generated classes in one assembly use generated classes in another assembly. The visibility of the getCPtr() and pointer constructor generated from the csbody typemaps needs changing. The default visibility is internal but it needs to be public for access from a different assembly. Just changing 'internal' to 'public' in the typemap achieves this. Two macros are available in csharp.swg to make this easier and using them is the preferred approach over simply copying the typemaps and modifying as this is forward compatible with any changes in the csbody typemap in future versions of SWIG. The macros are for the proxy and typewrapper classes and can respectively be used to to make the method and constructor public:

      SWIG_CSBODY_PROXY(public, public, SWIGTYPE)
      SWIG_CSBODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    

    Alternatively, instead of exposing these as public, consider using the [assembly:InternalsVisibleTo("Name")] attribute available in the .NET framework when you know which assemblies these can be exposed to. Another approach would be to make these public, but also to hide them from intellisense by using the [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] attribute if you don't want users to easily stumble upon these so called 'internal workings' of the wrappers.

    22.8 C# Typemap examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "csharp.swg" and "typemaps.i " in the SWIG library.

    22.8.1 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable. The example is a direct equivalent to this Java equivalent.

    Consider the following C++ code:

    struct Wheel {
      int size;
      Wheel(int sz = 0) : size(sz) {}
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from C# after running the code through SWIG:

      Wheel wheel = new Bike(10).getWheel();
      Console.WriteLine("wheel size: " + wheel.size);
      // Simulate a garbage collection
      global::System.GC.Collect();
      global::System.GC.WaitForPendingFinalizers();
      global::System.Console.WriteLine("wheel size: " + wheel.size);
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance a reference to the Bike must be added to the wheel instance. You can do this by adding the reference when the getWheel() method is called using the following typemaps.

    %typemap(cscode) Wheel %{
      // Ensure that the GC doesn't collect any Bike instance set from C#
      private Bike bikeReference;
      internal void addReference(Bike bike) {
        bikeReference = bike;
      }
    %}
    
    // Add a C# reference to prevent premature garbage collection and resulting use
    // of dangling C++ pointer. Intended for methods that return pointers or
    // references to a member variable.
    %typemap(csout, excode=SWIGEXCODE) Wheel& getWheel {
        global::System.IntPtr cPtr = $imcall;$excode
        $csclassname ret = null;
        if (cPtr != global::System.IntPtr.Zero) {
          ret = new $csclassname(cPtr, $owner);
          ret.addReference(this);
        }
        return ret;
      }
    

    The code in the first typemap gets added to the Wheel proxy class. The code in the second typemap constitutes the bulk of the code in the generated getWheel() function:

    public class Wheel : global::System.IDisposable {
      ...
      // Ensure that the GC doesn't collect any Bike instance set from C#
      private Bike bikeReference;
      internal void addReference(Bike bike) {
        bikeReference = bike;
      }
    }
    
    public class Bike : global::System.IDisposable {
      ...
      public Wheel getWheel() {
        global::System.IntPtr cPtr = examplePINVOKE.Bike_getWheel(swigCPtr);
        Wheel ret = null;
        if (cPtr != global::System.IntPtr.Zero) {
          ret = new Wheel(cPtr, false);
          ret.addReference(this);
        }
        return ret;
      }
    }
    

    Note the addReference call.

    22.8.2 Memory management for objects passed to the C++ layer

    The example is a direct equivalent to this Java equivalent. Managing memory can be tricky when using C++ and C# proxy classes. The previous example shows one such case and this example looks at memory management for a class passed to a C++ method which expects the object to remain in scope after the function has returned. Consider the following two C++ classes:

    struct Element {
      int value;
      Element(int val) : value(val) {}
    };
    class Container {
      Element* element;
    public:
      Container() : element(0) {}
      void setElement(Element* e) { element = e; }
      Element* getElement() { return element; }
    };
    

    and usage from C++

      Container container;
      Element element(20);
      container.setElement(&element);
      cout << "element.value: " << container.getElement()->value << endl;
    

    and more or less equivalent usage from C#

      Container container = new Container();
      Element element = new Element(20);
      container.setElement(element);
    

    The C++ code will always print out 20, but the value printed out may not be this in the C# equivalent code. In order to understand why, consider a garbage collection occurring...

      Container container = new Container();
      Element element = new Element(20);
      container.setElement(element);
      Console.WriteLine("element.value: " + container.getElement().value);
      // Simulate a garbage collection
      global::System.GC.Collect();
      global::System.GC.WaitForPendingFinalizers();
      global::System.Console.WriteLine("element.value: " + container.getElement().value);
    

    The temporary element created with new Element(20) could get garbage collected which ultimately means the container variable is holding a dangling pointer, thereby printing out any old random value instead of the expected value of 20. One solution is to add in the appropriate references in the C# layer...

    public class Container : global::System.IDisposable {
    
      ...
    
      // Ensure that the GC doesn't collect any Element set from C#
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    
      public void setElement(Element e) {
        examplePINVOKE.Container_setElement(swigCPtr, Element.getCPtr(e));
        elementReference = e;
      }
    }
    

    The following typemaps can be used to generate this code:

    %typemap(cscode) Container %{
      // Ensure that the GC doesn't collect any Element set from C#
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    %}
    
    %typemap(csin,
             post="      elementReference = $csinput;"
             ) Element *e "Element.getCPtr($csinput)"
    

    The 'cscode' typemap simply adds in the specified code into the C# proxy class. The 'csin' typemap matches the input parameter type and name for the setElement method and the 'post' typemap attribute allows adding code after the PInvoke call. The 'post' code is generated into a finally block after the PInvoke call so the resulting code isn't quite as mentioned earlier, setElement is actually:

      public void setElement(Element e) {
        try {
          examplePINVOKE.Container_setElement(swigCPtr, Element.getCPtr(e));
        } finally {
          elementReference = e;
        }
      }
    

    22.8.3 Date marshalling using the csin typemap and associated attributes

    The NaN Exception example is a simple example of the "javain" typemap and its 'pre' attribute. This example demonstrates how a C++ date class, say CDate, can be mapped onto the standard .NET date class, System.DateTime by using the 'pre', 'post' and 'pgcppname' attributes of the "csin" typemap (the C# equivalent to the "javain" typemap). The example is an equivalent to the Java Date marshalling example. The idea is that the System.DateTime is used wherever the C++ API uses a CDate. Let's assume the code being wrapped is as follows:

    class CDate {
    public:
      CDate();
      CDate(int year, int month, int day);
      int getYear();
      int getMonth();
      int getDay();
      ...
    };
    struct Action {
      static int doSomething(const CDate &dateIn, CDate &dateOut);
      Action(const CDate &date, CDate &dateOut);
    };
    

    Note that dateIn is const and therefore read only and dateOut is a non-const output type.

    First let's look at the code that is generated by default, where the C# proxy class CDate is used in the proxy interface:

    public class Action : global::System.IDisposable {
      ...
      public Action(CDate dateIn, CDate dateOut) 
          : this(examplePINVOKE.new_Action(CDate.getCPtr(dateIn), CDate.getCPtr(dateOut)), true) {
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
      public int doSomething(CDate dateIn, CDate dateOut) {
        int ret = examplePINVOKE.Action_doSomething(swigCPtr, 
                                                    CDate.getCPtr(dateIn), 
                                                    CDate.getCPtr(dateOut));
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
        return ret;
      }
    }
    

    The CDate & and const CDate & C# code is generated from the following two default typemaps:

    %typemap(cstype) SWIGTYPE & "$csclassname"
    %typemap(csin) SWIGTYPE & "$csclassname.getCPtr($csinput)"
    

    where '$csclassname' is translated into the proxy class name, CDate and '$csinput' is translated into the name of the parameter, eg dateIn. From C#, the intention is then to call into a modified API with something like:

    System.DateTime dateIn = new System.DateTime(2011, 4, 13);
    System.DateTime dateOut = new System.DateTime();
    
    // Note in calls below, dateIn remains unchanged and dateOut 
    // is set to a new value by the C++ call
    Action action = new Action(dateIn, out dateOut);
    dateIn = new System.DateTime(2012, 7, 14);
    

    To achieve this mapping, we need to alter the default code generation slightly so that at the C# layer, a System.DateTime is converted into a CDate. The intermediary layer will still take a pointer to the underlying CDate class. The typemaps to achieve this are shown below.

    %typemap(cstype) const CDate & "System.DateTime"
    %typemap(csin, 
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);"
            ) const CDate &
             "$csclassname.getCPtr(temp$csinput)"
    
    %typemap(cstype) CDate & "out System.DateTime"
    %typemap(csin, 
             pre="    CDate temp$csinput = new CDate();", 
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="out $csinput"
            ) CDate &
             "$csclassname.getCPtr(temp$csinput)"
    
    

    The resulting generated proxy code in the Action class follows:

    public class Action : global::System.IDisposable {
      ...
      public int doSomething(System.DateTime dateIn, out System.DateTime dateOut) {
        CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day);
        CDate tempdateOut = new CDate();
        try {
          int ret = examplePINVOKE.Action_doSomething(swigCPtr, 
                                                      CDate.getCPtr(tempdateIn), 
                                                      CDate.getCPtr(tempdateOut));
          if (examplePINVOKE.SWIGPendingException.Pending) 
            throw examplePINVOKE.SWIGPendingException.Retrieve();
          return ret;
        } finally {
          dateOut = new System.DateTime(tempdateOut.getYear(), 
                                        tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      static private global::System.IntPtr SwigConstructAction(System.DateTime dateIn, out System.DateTime dateOut) {
        CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day);
        CDate tempdateOut = new CDate();
        try {
          return examplePINVOKE.new_Action(CDate.getCPtr(tempdateIn), CDate.getCPtr(tempdateOut));
        } finally {
          dateOut = new System.DateTime(tempdateOut.getYear(), 
                                        tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      public Action(System.DateTime dateIn, out System.DateTime dateOut) 
          : this(Action.SwigConstructAction(dateIn, out dateOut), true) {
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    }
    

    A few things to note:

    • The "cstype" typemap has changed the parameter type to System.DateTime instead of the default generated CDate proxy.
    • The non-const CDate & type is marshalled as a reference parameter in C# as the date cannot be explicitly set once the object has been created, so a new object is created instead.
    • The code in the 'pre' attribute appears before the intermediary call (examplePINVOKE.new_Action / examplePINVOKE.Action_doSomething).
    • The code in the 'post' attribute appears after the intermediary call.
    • A try .. finally block is generated with the intermediary call in the try block and 'post' code in the finally block. The alternative of just using a temporary variable for the return value from the intermediary call and the 'post' code being inserted before the return statement is not possible given that the intermediary call and method return comes from a single source (the "csout" typemap).
    • The temporary variables in the "csin" typemaps are called temp$csin, where "$csin" is replaced with the parameter name. "$csin" is used to mangle the variable name so that more than one CDate & type can be used as a parameter in a method, otherwise two or more local variables with the same name would be generated.
    • The use of the "csin" typemap causes a constructor helper function (SwigConstructAction) to be generated. This allows C# code to be called before the intermediary call made in the constructor initialization list.
    • The 'cshin' attribute is required for the SwigConstructAction constructor helper function so that the 2nd parameter is declared as out dateOut instead of just dateOut.

    So far we have considered the date as an input only and an output only type. Now let's consider CDate * used as an input/output type. Consider the following C++ function which modifies the date passed in:

    void addYears(CDate *pDate, int years) {
      *pDate = CDate(pDate->getYear() + years, pDate->getMonth(), pDate->getDay());
    }
    

    If usage of CDate * commonly follows this input/output pattern, usage from C# like the following

    System.DateTime christmasEve = new System.DateTime(2000, 12, 24);
    example.addYears(ref christmasEve, 10); // christmasEve now contains 2010-12-24
    

    will be possible with the following CDate * typemaps

    %typemap(cstype, out="System.DateTime") CDate * "ref System.DateTime"
    
    %typemap(csin,
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);",
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="ref $csinput"
            ) CDate *
             "$csclassname.getCPtr(temp$csinput)"
    

    Globals are wrapped by the module class and for a module called example, the typemaps result in the following code:

    public class example {
      public static void addYears(ref System.DateTime pDate, int years) {
        CDate temppDate = new CDate(pDate.Year, pDate.Month, pDate.Day);
        try {
          examplePINVOKE.addYears(CDate.getCPtr(temppDate), years);
        } finally {
          pDate = new System.DateTime(temppDate.getYear(), temppDate.getMonth(), temppDate.getDay(),
                                      0, 0, 0);
        }
      }
      ...
    }
    

    The following typemap is the same as the previous but demonstrates how a using block can be used for the temporary variable. The only change to the previous typemap is the introduction of the 'terminator' attribute to terminate the using block. The subtractYears method is nearly identical to the above addYears method.

    %typemap(csin,
      pre="    using (CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day)) {",
      post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
           " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
      terminator="    } // terminate temp$csinput using block",
      cshin="ref $csinput"
     ) CDate *
      "$csclassname.getCPtr(temp$csinput)"
    
    void subtractYears(CDate *pDate, int years) {
      *pDate = CDate(pDate->getYear() - years, pDate->getMonth(), pDate->getDay());
    }
    

    The resulting generated code shows the termination of the using block:

    public class example {
      public static void subtractYears(ref System.DateTime pDate, int years) {
        using (CDate temppDate = new CDate(pDate.Year, pDate.Month, pDate.Day)) {
        try {
          examplePINVOKE.subtractYears(CDate.getCPtr(temppDate), years);
        } finally {
          pDate = new System.DateTime(temppDate.getYear(), temppDate.getMonth(), temppDate.getDay(),
                                      0, 0, 0);
        }
        } // terminate temppDate using block
      }
      ...
    }
    

    22.8.4 A date example demonstrating marshalling of C# properties

    The previous section looked at converting a C++ date class to System.DateTime for parameters. This section extends this idea so that the correct marshalling is obtained when wrapping C++ variables. Consider the same CDate class from the previous section and a global variable:

    CDate ImportantDate = CDate(1999, 12, 31);
    

    The aim is to use System.DateTime from C# when accessing this date as shown in the following usage where the module name is 'example':

    example.ImportantDate = new System.DateTime(2000, 11, 22);
    System.DateTime importantDate = example.ImportantDate;
    Console.WriteLine("Important date: " + importantDate);
    

    When SWIG wraps a variable that is a class/struct/union, it is wrapped using a pointer to the type for the reasons given in Structure data members. The typemap type required is thus CDate *. Given that the previous section already designed CDate * typemaps, we'll use those same typemaps plus the 'csvarin' and 'csvarout' typemaps.

    %typemap(cstype, out="System.DateTime") CDate * "ref System.DateTime"
    
    %typemap(csin,
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);",
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="ref $csinput"
            ) CDate *
             "$csclassname.getCPtr(temp$csinput)"
    
    %typemap(csvarin, excode=SWIGEXCODE2) CDate * %{
        /* csvarin typemap code */
        set {
          CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);
          $imcall;$excode
        } %}
    
    %typemap(csvarout, excode=SWIGEXCODE2) CDate * %{
        /* csvarout typemap code */
        get {
          global::System.IntPtr cPtr = $imcall;
          CDate tempDate = (cPtr == global::System.IntPtr.Zero) ? null : new CDate(cPtr, $owner);$excode
          return new System.DateTime(tempDate.getYear(), tempDate.getMonth(), tempDate.getDay(),
                                     0, 0, 0);
        } %}
    

    For a module called example, the typemaps result in the following code:

    public class example {
      public static System.DateTime ImportantDate {
        /* csvarin typemap code */
        set {
          CDate tempvalue = new CDate(value.Year, value.Month, value.Day);
          examplePINVOKE.ImportantDate_set(CDate.getCPtr(tempvalue));
        } 
        /* csvarout typemap code */
        get {
          global::System.IntPtr cPtr = examplePINVOKE.ImportantDate_get();
          CDate tempDate = (cPtr == global::System.IntPtr.Zero) ? null : new CDate(cPtr, false);
          return new System.DateTime(tempDate.getYear(), tempDate.getMonth(), tempDate.getDay(),
                                     0, 0, 0);
        } 
      }
      ...
    }
    

    Some points to note:

    • The property set comes from the 'csvarin' typemap and the property get comes from the 'csvarout' typemap.
    • The type used for the property comes from the 'cstype' typemap. This particular example has the 'out' attribute set in the typemap and as it is specified, it is used in preference to the type in the typemap body. This is because the type in the 'out' attribute can never include modifiers such as 'ref', thereby avoiding code such as public static ref System.DateTime ImportantDate { ..., which would of course not compile.
    • The $excode special variable expands to nothing as there are no exception handlers specified in any of the unmanaged code typemaps (in fact the marshalling was done using the default unmanaged code typemaps.)
    • The $imcall typemap expands to the appropriate intermediary method call in the examplePINVOKE class.
    • The $csinput special variable in the 'csin' typemap always expands to value for properties. In this case $csclassname.getCPtr(temp$csinput) expands to CDate.getCPtr(tempvalue).
    • The 'csin' typemap has 'pre', 'post' and 'cshin' attributes, and these are all ignored in the property set. The code in these attributes must instead be replicated within the 'csvarin' typemap. The line creating the temp$csinput variable is such an example; it is identical to what is in the 'pre' attribute.

    22.8.5 Date example demonstrating the 'pre' and 'post' typemap attributes for directors

    The 'pre' and 'post' attributes in the "csdirectorin" typemap act like the attributes of the same name in the "csin" typemap. For example if we modify the Date marshalling example like this:

    class CDate {
      ...
      void setYear(int);
      void setMonth(int);
      void setDay(int);
    };
    struct Action {
      virtual void someCallback(CDate &date);
      virtual ~Action();
      ...
    };
    

    and declare %feature ("director") for the Action class, we would have to define additional marshalling rules for CDate & parameter. The typemap may look like this:

    %typemap(csdirectorin,
             pre="System.DateTime temp$iminput = new System.DateTime();",
             post="CDate temp2$iminput = new CDate($iminput, false);\n"
                  "temp2$iminput.setYear(tempdate.Year);\n"
                  "temp2$iminput.setMonth(tempdate.Month);\n"
                  "temp2$iminput.setDay(tempdate.Day);"
             ) CDate &date "out temp$iminput"
    

    The generated proxy class code will then contain the following wrapper for calling user-overloaded someCallback():

    ...
      private void SwigDirectorMethodsomeCallback(global::System.IntPtr date) {
        System.DateTime tempdate = new System.DateTime();
        try {
          someCallback(out tempdate);
        } finally {
          // we create a managed wrapper around the existing C reference, just for convenience
          CDate temp2date = new CDate(date, false);
          temp2date.setYear(tempdate.Year);
          temp2date.setMonth(tempdate.Month);
          temp2date.setDay(tempdate.Day);
        }
      }
    ...
    

    Pay special attention to the memory management issues, using these attributes.

    22.8.6 Turning proxy classes into partial classes

    C# supports the notion of partial classes whereby a class definition can be split into more than one file. It is possible to turn the wrapped C++ class into a partial C# class using the csclassmodifiers typemap. Consider a C++ class called ExtendMe :

    class ExtendMe {
    public:
      int Part1() { return 1; }
    };
    

    The default C# proxy class generated is:

    public class ExtendMe : global::System.IDisposable {
      ...
      public int Part1() {
        ...
      }
    }
    

    The default csclassmodifiers typemap shipped with SWIG is

    %typemap(csclassmodifiers) SWIGTYPE "public class"
    

    Note that the type used is the special catch all type SWIGTYPE . If instead we use the following typemap to override this for just the ExtendMe class:

    %typemap(csclassmodifiers) ExtendMe "public partial class"
    

    The C# proxy class becomes a partial class:

    public partial class ExtendMe : global::System.IDisposable {
      ...
      public int Part1() {
        ...
      }
    }
    

    You can then of course declare another part of the partial class elsewhere, for example:

    public partial class ExtendMe : global::System.IDisposable {
      public int Part2() {
        return 2;
      }
    }
    

    and compile the following code:

    ExtendMe em = new ExtendMe();
    Console.WriteLine("part1: {0}", em.Part1());
    Console.WriteLine("part2: {0}", em.Part2());
    

    demonstrating that the class contains methods calling both unmanaged code - Part1() and managed code - Part2(). The following example is an alternative approach to adding managed code to the generated proxy class.

    22.8.7 Turning proxy classes into sealed classes

    The technique in the previous section can be used to make the proxy class a sealed class. Consider a C++ class NotABaseClass that you don't want to be derived from in C#:

    struct NotABaseClass {
      NotABaseClass();
      ~NotABaseClass();
    };
    

    The default C# proxy class method generated with Dispose method is:

    public class NotABaseClass : global::System.IDisposable {
      ...
      public virtual void Dispose() {
        ...
      }
    }
    

    The csclassmodifiers typemap can be used to modify the class modifiers and the csmethodmodifiers feature can be used on the destructor to modify the proxy's Dispose method:

    %typemap(csclassmodifiers) NotABaseClass "public sealed class"
    %csmethodmodifiers NotABaseClass::~NotABaseClass "public /*virtual*/";
    

    The relevant generated code is thus:

    public sealed class NotABaseClass : global::System.IDisposable {
      ...
      public /*virtual*/ void Dispose() {
        ...
      }
    }
    

    Any attempt to derive from the NotABaseClass in C# will result in a C# compiler error, for example:

    public class Derived : NotABaseClass {
    };
    
    runme.cs(6,14): error CS0509: `Derived': cannot derive from sealed type `NotABaseClass'
    

    Finally, if you get a warning about use of 'protected' in the generated base class:

    NotABaseClass.cs(14,18): warning CS0628: `NotABaseClass.swigCMemOwn': new protected member declared in sealed class
    

    Either suppress the warning or modify the generated code by copying and tweaking the default 'csbody' typemap code in csharp.swg by modifying swigCMemOwn to not be protected.

    22.8.8 Extending proxy classes with additional C# code

    The previous example showed how to use partial classes to add functionality to a generated C# proxy class. It is also possible to extend a wrapped struct/class with C/C++ code by using the %extend directive. A third approach is to add some C# methods into the generated proxy class with the cscode typemap. If we declare the following typemap before SWIG parses the ExtendMe class used in the previous example

    %typemap(cscode) ExtendMe %{
      public int Part3() {
        return 3;
      }
    %}
    
    

    The generated C# proxy class will instead be:

    public class ExtendMe : global::System.IDisposable {
      ...
      public int Part3() {
        return 3;
      }
      public int Part1() {
        ...
      }
    }
    

    22.8.9 Underlying type for enums

    C# enums use int as the underlying type for each enum item. If you wish to change the underlying type to something else, then use the csbase typemap. For example when your C++ code uses a value larger than int, this is necessary as the C# compiler will not compile values which are too large to fit into an int. Here is an example:

    %typemap(csbase) BigNumbers "uint"
    %inline %{
      enum BigNumbers { big=0x80000000, bigger };
    %}
    

    The generated enum will then use the given underlying type and compile correctly:

    public enum BigNumbers : uint {
      big = 0x80000000,
      bigger
    }
    

    23 SWIG and D

    23.1 Introduction

    From the D Programming Language web site: D is a systems programming language. Its focus is on combining the power and high performance of C and C++ with the programmer productivity of modern languages like Ruby and Python. [...] The D language is statically typed and compiles directly to machine code. As such, it is not very surprising that D is able to directly interface with C libraries. Why would a SWIG module for D be needed then in the first place?

    Well, besides the obvious downside that the C header files have to be manually converted to D modules for this to work, there is one major inconvenience with this approach: D code usually is on a higher abstraction level than C, and many of the features that make D interesting are simply not available when dealing with C libraries, requiring you e.g. to manually convert strings between pointers to \0-terminated char arrays and D char arrays, making the algorithms from the D2 standard library unusable with C arrays and data structures, and so on.

    While these issues can be worked around relatively easy by hand-coding a thin wrapper layer around the C library in question, there is another issue where writing wrapper code per hand is not feasible: C++ libraries. D did not support interfacing to C++ in version 1 at all, and even if extern(C++) has been added to D2, the support is still very limited, and a custom wrapper layer is still required in many cases.

    To help addressing these issues, the SWIG C# module has been forked to support D. Is has evolved quite a lot since then, but there are still many similarities, so if you do not find what you are looking for on this page, it might be worth having a look at the chapter on C# (and also on Java, since the C# module was in turn forked from it).

    23.2 Command line invocation

    To activate the D module, pass the -d option to SWIG at the command line. The same standard command line options as with any other language module are available, plus the following D specific ones:

    -d2

    By default, SWIG generates code for D1/Tango. Use the -d2 flag to target D2/Phobos instead.

    -splitproxy

    By default, SWIG generates two D modules: the proxy module, named like the source module (either specified via the %module directive or via the module command line option), which contains all the proxy classes, functions, enums, etc., and the intermediary module (named like the proxy module, but suffixed with _im), which contains all the extern(C) function declarations and other private parts only used internally by the proxy module.

    If the split proxy mode is enabled by passing this option at the command line, all proxy classes and enums are emitted to their own D module instead. The main proxy module only contains free functions and constants in this case.

    -package <pkg>

    By default, the proxy D modules and the intermediary D module are written to the root package. Using this option, you can specify another target package instead.

    -wrapperlibrary <wl>

    The code SWIG generates to dynamically load the C/C++ wrapper layer looks for a library called $module_wrap by default. With this option, you can override the name of the file the wrapper code loads at runtime (the lib prefix and the suffix for shared libraries are appended automatically, depending on the OS).

    This might especially be useful if you want to invoke SWIG several times on separate modules, but compile the resulting code into a single shared library.

    23.3 Typemaps

    23.3.1 C# <-> D name comparison

    If you already know the SWIG C# module, you might find the following name comparison table useful:

     ctype                  <->  ctype
     imtype                 <->  imtype
     cstype                 <->  dtype
     csin                   <->  din
     csout                  <->  dout
     csdirectorin           <->  ddirectorin
     csdirectorout          <->  ddirectorout
     csinterfaces           <->  dinterfaces
     csinterfaces_derived   <->  dinterfaces_derived
     csbase                 <->  dbase
     csclassmodifiers       <->  dclassmodifiers
     cscode                 <->  dcode
     csimports              <->  dimports
     csbody                 <->  dbody
     csfinalize             <->  ddestructor
     csdisposing            <->  ddispose
     csdisposing_derived    <->  ddispose_derived
    

    23.3.2 ctype, imtype, dtype

    Mapping of types between the C/C++ library, the C/C++ library wrapper exposing the C functions, the D wrapper module importing these functions and the D proxy code.

    The ctype typemap is used to determine the types to use in the C wrapper functions. The types from the imtype typemap are used in the extern(C) declarations of these functions in the intermediary D module. The dtype typemap contains the D types used in the D proxy module/class.

    23.3.3 in, out, directorin, directorout

    Used for converting between the types for C/C++ and D when generating the code for the wrapper functions (on the C++ side).

    The code from the in typemap is used to convert arguments to the C wrapper function to the type used in the wrapped code (ctype ->original C++ type), the out typemap is utilized to convert values from the wrapped code to wrapper function return types (original C++ type->ctype).

    The directorin typemap is used to convert parameters to the type used in the D director callback function, its return value is processed by directorout (see below).

    23.3.4 din, dout, ddirectorin, ddirectorout

    Typemaps for code generation in D proxy and type wrapper classes.

    The din typemap is used for converting function parameter types from the type used in the proxy module or class to the type used in the intermediary D module (the $dinput macro is replaced). To inject further parameter processing code before or after the call to the intermediary layer, the pre , post and terminator attributes can be used (please refer to the C# date marshalling example for more information on these).

    The dout typemap is used for converting function return values from the return type used in the intermediary D module to the type returned by the proxy function. The $excode special variable in dout typemaps is replaced by the excode typemap attribute code if the method can throw any exceptions from unmanaged code, otherwise by nothing (the $imcall and $owner macros are replaced).

    The code from the ddirectorin and ddirectorout typemaps is used for conversion in director callback functions. Arguments are converted to the type used in the proxy class method they are calling by using the code from ddirectorin, the proxy class method return value is converted to the type the C++ code expects via the ddirectorout typemap (the $dcall and $winput macros are replaced).

    The full chain of type conversions when a director callback is invoked looks like this:

          type              CPPClass::method(type a)
            ↑                       ↓
       <directorout>          <directorin>
            ↑                       ↓
          ctype             methodCallback(ctype a)           C++
     :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
          imtype            methodCallback(imtype a)           D
            ↑                       ↓
      <ddirectorout>          <ddirectorin>
            ↑                       ↓
          dtype             DClass.method(dtype a)

    23.3.5 typecheck typemaps

    Because, unlike many scripting languages supported by SWIG, D does not need any dynamic dispatch helper to access an overloaded function, the purpose of these is merely to issue a warning for overloaded C++ functions that cannot be overloaded in D (as more than one C++ type maps to a single D type).

    23.3.6 Code injection typemaps

    These typemaps are used for generating the skeleton of proxy classes for C++ types.

    By overriding dbase, dinterfaces or dinterfaces_derived, the inheritance chain of the generated proxy class for a type can be modified. dclassmodifiers allows you to add any custom modifiers around the class keyword.

    Using dcode and dimports, you can specify additional D code which will be emitted into the class body respectively the imports section of the D module the class is written to.

    dconstructor, ddestructor, ddispose and ddispose_derived are used to generate the class constructor, destructor and dispose() method, respectively. The auxiliary code for handling the pointer to the C++ object is stored in dbody and dbody_derived. You can override them for specific types.

    Code can also be injected into the D proxy class using %proxycode.

    23.3.7 Special variable macros

    The standard SWIG special variables are available for use within typemaps as described in the Typemaps documentation , for example $1, $input, $result etc.

    When generating D wrappers, a few additional macros are available:

    $dclassname (C#: $csclassname)

    This special variable works similar to $n_type in that it returns the name of a type - it expands to the D proxy class name of the type being wrapped. If the type does not have an associated proxy class, it expands to the type wrapper class name, for example, SWIGTYPE_p_p_SomeCppClass is generated when wrapping SomeCppClass **.

    There are two other variants available, $&dclassname and $*dclassname. The former adds a level of indirection, while the latter removes one. For instance, when wrapping Foo **, $*dclassname would be replaced by the proxy class name corresponding to Foo *.

    $dclazzname (C#: $csclazzname)

    This special variable expands the fully qualified C++ class into the package name, if used by the nspace feature, and the proxy class name, mangled for use as a function name. For example, Namespace1::Namespace2::Klass is expanded into Namespace1_Namespace2_Klass_.

    This special variable might be useful for calling certain functions in the wrapper layer (e.g. upcast wrappers) which are mangled like this.

    $null

    In code inserted into the generated C/C++ wrapper functions, this variable is replaced by either 0 or nothing at all, depending on whether the function has a return value or not. It can be used to bail out early e.g. in case of errors (return $null;).

    $dinput (C#: $csinput)

    This variable is used in din typemaps and is replaced by the expression which is to be passed to C/C++.

    For example, this input

    %typemap(din) SomeClass * "SomeClass.getCPointer($dinput)"
    
    %inline %{
      class SomeClass {};
      void foo(SomeClass *arg);
    %}

    leads to the following D proxy code being generated:

    void foo(SomeClass arg) {
      example_im.foo(SomeClass.getCPointer(arg));
    }
    $imcall and $owner (C#: $imcall)

    These variables are used in dout typemaps. $imcall contains the call to the intermediary module which provides the value to be used, and $owner signals if the caller is responsible for managing the object lifetime (that is, if the called method is a constructor or has been marked via %newobject ).

    Consider the following example:

    %typemap(dout) SomeClass * {
      return new SomeClass($imcall, $owner);
    }
    
    %inline %{
      class SomeClass;
      SomeClass *foo();
    
      %newobject bar();
      SomeClass *bar();
    %}
    

    The code generated for foo() and bar() looks like this:

    SomeClass foo() {
      return new SomeClass(example_im.foo(), false);
    }
    
    SomeClass bar() {
      return new SomeClass(example_im.bar(), true);
    }
    
    $dcall and $winput (C#: $cscall, $iminput)

    These variables are used in the director-specific typemaps ddirectorin and ddirectorout. They are more or less the reverse of the $imcall and $dinput macros: $dcall contains the invocation of the D proxy method of which the return value is to be passed back to C++, $winput contains the parameter value from C++.

    $excode

    This variable is used in dout and dconstructor typemaps and is filled with the contents of the excode typemap attribute if an exception could be thrown from the C++ side. See the C# documentation for details.

    $dbaseclass

    Currently for internal use only, it contains the D name of the C++ base class (if any) inside proxy classes.

    $directorconnect

    This macro is only valid inside the dconstructor typemap and contains the value of the dconstructor typemap attribute if the currently wrapped class has directors enabled.

    This is how the default dconstructor typemap looks like (you usually do not want to specify a custom one):

    %typemap(dconstructor, excode=SWIGEXCODE,
             directorconnect="\n  swigDirectorConnect();") SWIGTYPE {
      this($imcall, true);$excode$directorconnect
    }
    
    $importtype(SomeDType)

    This macro is used in the dimports typemap if a dependency on another D type generated by SWIG is added by a custom typemap.

    Consider the following code snippet:

    %typemap(dinterfaces) SomeClass "AnInterface, AnotherInterface";
    

    This causes SWIG to add AnInterface and AnotherInterface to the base class list of SomeClass:

    class SomeClass : AnInterface, AnotherInterface {
      ...
    }
    

    For this to work, AnInterface and AnotherInterface have to be in scope. If SWIG is not in split proxy mode, this is already the case, but if it is, they have to be added to the import list via the dimports typemap. Additionally, the import statement depends on the package SWIG is configured to emit the modules to.

    The $importtype macro helps you to elegantly solve this problem:

    %typemap(dimports) RemoteMpe %{
    $importtype(AnInterface)
    $importtype(AnotherInterface)
    %}
    

    If SWIG is in split proxy mode, it expands to an import statement for the specified type, to nothing if not.

    $module

    Expands to the name of the main proxy D module.

    $imdmodule

    Contains the fully qualified name of the intermediary D module.

    23.4 D and %feature

    The D module defines a number of directives which modify the SWIG features set globally or for a specific declaration:

    %dmanifestconst and %dconstvalue(value)

    Out of the box, SWIG generates accessor methods for C #defines and C++ constants. The %dmanifestconst directive enables wrapping these constants as D manifest constants (const in D1, enum in D2).

    For this to work, the C/C++ code for the constant value must directly compile as D code, though. If this is not the case, you can manually override the expression written to the D proxy module using the %dconstvalue directive, passing the new value as parameter.

    For enums, again %dconstvalue can be used to override the value of an enum item if the initializer should not compile in D.

    %dmethodmodifiers

    This directive can be used to override the modifiers for a proxy function. For instance, you could make a public C++ member function private in D like this:

    %dmethodmodifiers A::foo "private";
    
    %inline %{
    struct A {
      void foo();
    };
    %}
    

    23.5 Pragmas

    There are a few SWIG pragmas specific to the D module, which you can use to influence the D code SWIG generates:

    %pragma(d) imdmodulecode

    The passed text (D code) is copied verbatim to the intermediary D module. For example, it can be (and is, internally) used to emit additional private helper code for the use by proxy typemaps.

    %pragma(d) imdmoduleimports

    Additional code to be emitted to the imports section of the intermediary D module (the $importtype macro can be used here). You probably want to use this in conjunction with the imdmodulecode pragma.

    %pragma(d) proxydmodulecode

    Just like proxydmodulecode, the argument is copied to the proxy D module (if SWIG is in split proxy mode and/or the nspace feature is used, it is emitted to the main proxy D module only).

    %pragma(d) globalproxyimports

    The D module currently does not support specifying dependencies on external modules (e.g. from the standard library) for the D typemaps. To add the import statements to the proxy modules (resp. to all proxy modules if in split proxy mode), you can use the globalproxyimports directive.

    For example:

    %typemap(din) char[] "($dinput ? tango.stdc.stringz.toStringz($dinput) : null)"
    %pragma(d) globalproxyimports = "static import tango.stdc.stringz;";
    
    %pragma(d) wrapperloadercode

    The D code for loading the wrapper library (it is copied to the intermediary D module). The $wrapperloaderbindcode variable is replaced by the list of commands for binding the functions from the wrapper library to the symbols in the intermediary D module.

    Each time this pragma is specified, the previous value is overwritten.

    %pragma(d) wrapperloaderbindcommand

    The D command to use for binding the wrapper functions from the C/C++ library to the symbols in the intermediary D module. The $function variable contains the name of the D function in the wrap module, the $symbol variable is replaced by the name of the symbol in the library.

    Each time this pragma is specified, the previous value is overwritten.

    23.6 D Exceptions

    Out of the box, C++ exceptions are fundamentally incompatible to their equivalent in the D world and cannot simply be propagated to a calling D method. There is, however, an easy way to solve this problem: Just catch the exception in the C/C++ wrapper layer, pass the contents to D, and make the wrapper code rethrow the exception in the D world.

    The implementation details of this are a bit crude, but the SWIG D module automatically takes care of this, as long as it is able to detect that an exception could potentially be thrown (e.g. because the C++ method has a throw(...) exception specification).

    As this feature is implemented in exactly the same way it is for C#, please see the C# documentation for a more detailed explanation.

    23.7 D Directors

    When the directors feature is activated, SWIG generates extra code on both the C++ and the D side to enable cross-language polymorphism. Essentially, this means that if you subclass a proxy class in D, C++ code can access any overridden virtual methods just as if you created a derived class in C++.

    There is no D specific documentation yet, but the way the feature is implemented is very similar to how it is done in Java and C#.

    23.8 Other features

    23.8.1 Extended namespace support (nspace)

    By default, SWIG flattens all C++ namespaces into a single target language namespace, but as for Java and C#, the nspace feature is supported for D. If it is active, C++ namespaces are mapped to D packages/modules. Note, however, that like for the other languages, free variables and functions are not supported yet; currently, they are all allows written to the main proxy D module.

    23.8.2 Native pointer support

    Contrary to many of the scripting languages supported by SWIG, D fully supports C-style pointers. The D module thus includes a custom mechanism to wrap C pointers directly as D pointers where applicable, that is, if the type that is pointed to is represented the same in C and D (on the bit-level), dubbed a primitive type below.

    Central to this custom pointer handling scheme are two typemap attributes: the cprimitive attribute on the dtype typemap and the nativepointer attribute on all the typemaps which influence the D side of the code (dtype, din, dout, ...). When a D typemap is looked up, the following happens behind the scenes:

    First, the matching typemap is determined by the usual typemap lookup rules. Then, it is checked if the result has the nativepointer attribute set. If it is present, it means that its value should replace the typemap value if and only if the actual type the typemap is looked up for is a primitive type, a pointer to a primitive type (through an arbitrary level of indirections), or a function pointer with only primitive types in its signature.

    To determine if a type should be considered primitive, the cprimitive attribute on its dtype attribute is used. For example, the dtype typemap for float has cprimitive="1", so the code from the nativepointer attribute is taken into account e.g. for float ** or the function pointer float (*)(float *).

    23.8.3 Operator overloading

    The D module comes with basic operator overloading support for both D1 and D2. There are, however, a few limitations arising from conceptual differences between C++ and D:

    The first key difference is that C++ supports free functions as operators (along with argument-dependent lookup), while D requires operators to be member functions of the class they are operating on. SWIG can only automatically generate wrapping code for member function operators; if you want to use operators defined as free functions in D, you need to handle them manually.

    Another set of differences between C++ and D concerns individual operators. For example, there are quite a few operators which are overloadable in C++, but not in D, for example && and || , but also !, and prefix increment/decrement operators in D1 resp. their postfix pendants in D2.

    There are also some cases where the operators can be translated to D, but the differences in the implementation details are big enough that a rather involved scheme would be required for automatic wrapping them, which has not been implemented yet. This affects, for example, the array subscript operator, [], in combination with assignments - while operator [] in C++ simply returns a reference which is then written to, D resorts to a separate opIndexAssign method -, or implicit casting (which was introduced in D2 via alias this ). Despite the lack of automatic support, manually handling these cases should be perfectly possible.

    23.8.4 Running the test-suite

    As with any other language, the SWIG test-suite can be built for D using the *-d-test-suite targets of the top-level Makefile. By default, D1 is targeted, to build it with D2, use the optional D_VERSION variable, e.g. make check-d-test-suite D_VERSION=2 .

    Note: If you want to use GDC on Linux or another platform which requires you to link libdl for dynamically loading the shared library, you might have to add -ldl manually to the d_compile target in Examples/Makefile, because GDC does not currently honor the pragma(lib, ...) statement.

    23.9 D Typemap examples

    There are no D-specific typemap examples yet. However, with the above name comparison table, you should be able to get an idea what can be done by looking at the corresponding C# section.

    23.10 Work in progress and planned features

    There are a couple of features which are not implemented yet, but would be very useful and might be added in the near future:

    • Static linking: Currently, the C wrapper code is compiled into a dynamic library, out of which the symbol addresses are looked up at runtime by the D part. If statically linking the different languages into one binary was supported, a tool-chain capable of performing IPO at link time could inline the wrapping code, effectively reducing the overhead for simple calls to zero.
    • C array handling: Many data structures in some C/C++ libraries contain array containing of a pointer to the first element and the element count. Currently, one must manually writing wrapper code to be able to access these from D. It should be possible to add a set of SWIG macros to semi-automatically generate conversion code.

    Some generated code might also be a bit rough around the edges, particularly in the following areas:

    • Memory management: Although the currently generated wrapper code works fine with regard to the GC for the test-suite, there might be issues coming up in real-world multi-threaded usage.
    • D2 support: Originally, the module has been developed for the use with D1, D2/Phobos support has been added in later. The basic features should work equally well for both, but there could be issues concerning const-correctness etc.

    24 SWIG and Go

    This chapter describes SWIG's support of Go. For more information on the Go programming language see golang.org .

    24.1 Overview

    Go does not support direct calling of functions written in C/C++. The cgo program may be used to generate wrappers to call C code from Go, but there is no convenient way to call C++ code. SWIG fills this gap.

    There are (at least) two different Go compilers. The first is the gc compiler of the Go distribution, normally invoked via the go tool. The second Go compiler is the gccgo compiler, which is a frontend to the GCC compiler suite. The interface to C/C++ code is completely different for the two Go compilers. SWIG supports both Go compilers, selected by the -gccgo command line option.

    Go is a type-safe compiled language and the wrapper code generated by SWIG is type-safe as well. In case of type issues the build will fail and hence SWIG's runtime library and runtime type checking are not used.

    24.2 Examples

    Working examples can be found in the SWIG source tree .

    Please note that the examples in the SWIG source tree use makefiles with the .i SWIG interface file extension for backwards compatibility with Go 1.

    24.3 Running SWIG with Go

    Most Go programs are built using the go tool. Since Go 1.1 the go tool has support for SWIG. To use it, give your SWIG interface file the extension .swig (for C code) or .swigcxx (for C++ code). Put that file in a GOPATH/src directory as usual for Go sources. Put other C/C++ code in the same directory with extensions of .c and .cxx. The go build and go install commands will automatically run SWIG for you and compile the generated wrapper code. To check the SWIG command line options the go tool uses run go build -x. To access the automatically generated files run go build -work. You'll find the files under the temporary WORK directory.

    To manually generate and compile C/C++ wrapper code for Go, use the -go option with SWIG. By default SWIG will generate code for the Go compiler of the Go distribution. To generate code for gccgo, you should also use the -gccgo option.

    By default SWIG will generate files that can be used directly by go build. This requires Go 1.2 or later. Put your SWIG interface file in a directory under GOPATH/src, and give it a name that does not end in the .swig or .swigcxx extension. Typically the SWIG interface file extension is .i in this case.

    % swig -go example.i
    % go install
    

    You will now have a Go package that you can import from other Go packages as usual.

    SWIG can be used without cgo, via the -no-cgo option, but more steps are required. This only works with Go versions before 1.5. When using Go version 1.2 or later, or when using gccgo, the code generated by SWIG can be linked directly into the Go program. A typical command sequence when using the Go compiler of the Go distribution would look like this:

    % swig -go -no-cgo example.i
    % gcc -c code.c    # The C library being wrapped.
    % gcc -c example_wrap.c
    % go tool 6g example.go
    % go tool 6c example_gc.c
    % go tool pack grc example.a example.6 example_gc.6 code.o example_wrap.o
    % go tool 6g main.go
    % go tool 6l main.6
    

    You can also put the wrapped code into a shared library, and when using the Go versions before 1.2 this is the only supported option. A typical command sequence for this approach would look like this:

    % swig -go -no-cgo -use-shlib example.i
    % gcc -c -fpic example.c
    % gcc -c -fpic example_wrap.c
    % gcc -shared example.o example_wrap.o -o example.so
    % go tool 6g example.go
    % go tool 6c example_gc.c
    % go tool pack grc example.a example.6 example_gc.6
    % go tool 6g main.go  # your code, not generated by SWIG
    % go tool 6l main.6
    

    24.3.1 Go-specific Commandline Options

    These are the command line options for SWIG's Go module. They can also be seen by using:

    swig -go -help
    
    Go-specific options
    -cgoGenerate files to be used as input for the Go cgo tool. This is the default.
    -no-cgoGenerate files that can be used directly, rather than via the Go cgo tool. This option does not work with Go 1.5 or later. It is required for versions of Go before 1.2.
    -intgosize <s>Set the size for the Go type int . This controls the size that the C/C++ code expects to see. The <s> argument should be 32 or 64. This option is currently required during the transition from Go 1.0 to Go 1.1, as the size of int on 64-bit x86 systems changes between those releases (from 32 bits to 64 bits). In the future the option may become optional, and SWIG will assume that the size of int is the size of a C pointer.
    -gccgoGenerate code for gccgo. The default is to generate code for the Go compiler of the Go distribution.
    -package <name>Set the name of the Go package to <name>. The default package name is the SWIG module name.
    -use-shlibTell SWIG to emit code that uses a shared library. This is only meaningful for the Go compiler of the Go distribution, which needs to know at compile time whether a shared library will be used.
    -soname <name>Set the runtime name of the shared library that the dynamic linker should include at runtime. The default is the package name with ".so" appended. This is only used when generating code for the Go compiler of the Go distribution; when using gccgo, the equivalent name will be taken from the -soname option passed to the linker. Using this option implies the -use-shlib option.
    -go-pkgpath <pkgpath>When generating code for gccgo, set the pkgpath to use. This corresponds to the -fgo-pkgpath option to gccgo.
    -go-prefix <prefix>When generating code for gccgo, set the prefix to use. This corresponds to the -fgo-prefix option to gccgo. If -go-pkgpath is used, -go-prefix will be ignored.
    -import-prefix <prefix>A prefix to add when turning a %import prefix in the SWIG interface file into an import statement in the Go file. For example, with -import-prefix mymodule, a SWIG interface file %import mypackage will become a Go import statement import "mymodule/mypackage".

    24.3.2 Generated Wrapper Files

    There are two different approaches to generating wrapper files, controlled by SWIG's -no-cgo option. The -no-cgo option only works with version of Go before 1.5. It is required when using versions of Go before 1.2.

    With or without the -no-cgo option, SWIG will generate the following files when generating wrapper code:

    • MODULE.go will contain the Go functions that your Go code will call. These functions will be wrappers for the C++ functions defined by your module. This file should, of course, be compiled with the Go compiler.
    • MODULE_wrap.c or MODULE_wrap.cxx will contain C/C++ functions will be invoked by the Go wrapper code. This file should be compiled with the usual C or C++ compiler.
    • MODULE_wrap.h will be generated if you use the directors feature. It provides a definition of the generated C++ director classes. It is generally not necessary to use this file, but in some special cases it may be helpful to include it in your code, compiled with the usual C or C++ compiler.

    When the -no-cgo option is used, and the -gccgo option is not used, SWIG will also generate an additional file:

    • MODULE_gc.c will contain C code which should be compiled with the C compiler distributed as part of the gc compiler. It should then be combined with the compiled MODULE.go using go tool pack.

    24.4 A tour of basic C/C++ wrapping

    By default, SWIG attempts to build a natural Go interface to your C/C++ code. However, the languages are somewhat different, so some modifications have to occur. This section briefly covers the essential aspects of this wrapping.

    24.4.1 Go Package Name

    All Go source code lives in a package. The name of this package will default to the name of the module from SWIG's %module directive. You may override this by using SWIG's -package command line option.

    24.4.2 Go Names

    In Go, a function is only visible outside the current package if the first letter of the name is uppercase. This is quite different from C/C++. Because of this, C/C++ names are modified when generating the Go interface: the first letter is forced to be uppercase if it is not already. This affects the names of functions, methods, variables, constants, enums, and classes.

    C/C++ variables are wrapped with setter and getter functions in Go. First the first letter of the variable name will be forced to uppercase, and then Get or Set will be prepended. For example, if the C/C++ variable is called var, then SWIG will define the functions GetVar and SetVar. If a variable is declared as const, or if SWIG's %immutable directive is used for the variable, then only the getter will be defined.

    C++ classes will be discussed further below. Here we'll note that the first letter of the class name will be forced to uppercase to give the name of a type in Go. A constructor will be named New followed by that name, and the destructor will be named Delete followed by that name.

    24.4.3 Go Constants

    C/C++ constants created via #define or the %constant directive become Go constants, declared with a const declaration.

    24.4.4 Go Enumerations

    C/C++ enumeration types will cause SWIG to define an integer type with the name of the enumeration (with first letter forced to uppercase as usual). The values of the enumeration will become variables in Go; code should avoid modifying those variables.

    24.4.5 Go Classes

    Go has interfaces, methods and inheritance, but it does not have classes in the same sense as C++. This sections describes how SWIG represents C++ classes represented in Go.

    For a C++ class ClassName, SWIG will define two types in Go: an underlying type, which will just hold a pointer to the C++ type, and an interface type. The interface type will be named ClassName . SWIG will define a function NewClassName which will take any constructor arguments and return a value of the interface type ClassName. SWIG will also define a destructor DeleteClassName .

    SWIG will represent any methods of the C++ class as methods on the underlying type, and also as methods of the interface type. Thus C++ methods may be invoked directly using the usual val.MethodName syntax. Public members of the C++ class will be given getter and setter functions defined as methods of the class.

    SWIG will represent static methods of C++ classes as ordinary Go functions. SWIG will use names like ClassNameMethodName. SWIG will give static members getter and setter functions with names like GetClassName_VarName.

    Given a value of the interface type, Go code can retrieve the pointer to the C++ type by calling the Swigcptr method. This will return a value of type SwigcptrClassName, which is just a name for uintptr. A Go type conversion can be used to convert this value to a different C++ type, but note that this conversion will not be type checked and is essentially equivalent to reinterpret_cast. This should only be used for very special cases, such as where C++ would use a dynamic_cast.

    Note that C++ pointers to compound objects are represented in go as objects themselves, not as go pointers. So, for example, if you wrap the following function:

    class MyClass {
      int MyMethod();
      static MyClass *MyFactoryFunction();
    };
    
    

    You will get go code that looks like this:

    type MyClass interface {
      Swigcptr() uintptr
      SwigIsMyClass()
      MyMethod() int
    }
    
    func MyClassMyFactoryFunction() MyClass {
      // swig magic here
    }
    

    Note that the factory function does not return a go pointer; it actually returns a go interface. If the returned pointer can be null, you can check for this by calling the Swigcptr() method.

    24.4.5.1 Go Class Memory Management

    Calling NewClassName for a C++ class ClassName will allocate memory using the C++ memory allocator. This memory will not be automatically freed by Go's garbage collector as the object ownership is not tracked. When you are done with the C++ object you must free it using DeleteClassName.

    The most Go idiomatic way to manage the memory for some C++ class is to call NewClassName followed by a defer of the DeleteClassName call. Using defer ensures that the memory of the C++ object is freed as soon as the function containing the defer statement returns. Furthermore defer works great for short-lived objects and fits nicely C++'s RAII idiom. Example:

    func UseClassName(...) ... {
      o := NewClassName(...)
      defer DeleteClassName(o)
      // Use the ClassName object
      return ...
    }
    

    With increasing complexity, especially complex C++ object hierarchies, the correct placement of defer statements becomes harder and harder as C++ objects need to be freed in the correct order. This problem can be eased by keeping a C++ object function local so that it is only available to the function that creates a C++ object and functions called by this function. Example:

    func WithClassName(constructor args, f func(ClassName, ...interface{}) error, data ...interface{}) error {
      o := NewClassName(constructor args)
      defer DeleteClassName(o)
      return f(o, data...)
    }
    
    func UseClassName(o ClassName, data ...interface{}) (err error) {
      // Use the ClassName object and additional data and return error.
    }
    
    func main() {
      WithClassName(constructor args, UseClassName, additional data)
    }
    

    Using defer has limitations though, especially when it comes to long-lived C++ objects whose lifetimes are hard to predict. For such C++ objects a common technique is to store the C++ object into a Go object, and to use the Go function runtime.SetFinalizer to add a finalizer which frees the C++ object when the Go object is freed. It is strongly recommended to read the runtime.SetFinalizer documentation before using this technique to understand the runtime.SetFinalizer limitations.

    Common pitfalls with runtime.SetFinalizer are:

    • If a hierarchy of C++ objects will be automatically freed by Go finalizers then the Go objects that store the C++ objects need to replicate the hierarchy of the C++ objects to prevent that C++ objects are freed prematurely while other C++ objects still rely on them.
    • The usage of Go finalizers is problematic with C++'s RAII idiom as it isn't predictable when the finalizer will run and this might require a Close or Delete method to be added the Go object that stores a C++ object to mitigate.
    • The Go finalizer function typically runs in a different OS thread which can be problematic with C++ code that uses thread-local storage.

    runtime.SetFinalizer Example:

    import (
      "runtime"
      "wrap" // SWIG generated wrapper code
    )
    
    type GoClassName struct {
      wcn wrap.ClassName
    }
    
    func NewGoClassName() *GoClassName {
      o := &GoClassName{wcn: wrap.NewClassName()}
      runtime.SetFinalizer(o, deleteGoClassName)
      return o
    }
    
    func deleteGoClassName(o *GoClassName) {
      // Runs typically in a different OS thread!
      wrap.DeleteClassName(o.wcn)
      o.wcn = nil
    }
    
    func (o *GoClassName) Close() {
      // If the C++ object has a Close method.
      o.wcn.Close()
    
      // If the GoClassName object is no longer in an usable state.
      runtime.SetFinalizer(o, nil) // Remove finalizer.
      deleteGoClassName() // Free the C++ object.
    }
    

    24.4.5.2 Go Class Inheritance

    C++ class inheritance is automatically represented in Go due to its use of interfaces. The interface for a child class will be a superset of the interface of its parent class. Thus a value of the child class type in Go may be passed to a function which expects the parent class. Doing the reverse will require an explicit type assertion, which will be checked dynamically.

    24.4.6 Go Templates

    In order to use C++ templates in Go, you must tell SWIG to create wrappers for a particular template instantiation. To do this, use the %template directive.

    24.4.7 Go Director Classes

    SWIG's director feature permits a Go type to act as the subclass of a C++ class. This is complicated by the fact that C++ and Go define inheritance differently. SWIG normally represents the C++ class inheritance automatically in Go via interfaces but with a Go type representing a subclass of a C++ class some manual work is necessary.

    This subchapter gives a step by step guide how to properly subclass a C++ class with a Go type. In general it is strongly recommended to follow this guide completely to avoid common pitfalls with directors in Go.

    24.4.7.1 Example C++ code

    The step by step guide is based on two example C++ classes. FooBarAbstract is an abstract C++ class and the FooBarCpp class inherits from it. This guide explains how to implement a FooBarGo class similar to the FooBarCpp class.

    FooBarAbstract abstract C++ class:

    class FooBarAbstract
    {
    public:
      FooBarAbstract() {};
      virtual ~FooBarAbstract() {};
    
      std::string FooBar() {
        return this->Foo() + ", " + this->Bar();
      };
    
    protected:
      virtual std::string Foo() {
        return "Foo";
      };
    
      virtual std::string Bar() = 0;
    };
    

    FooBarCpp C++ class:

    class FooBarCpp : public FooBarAbstract
    {
    protected:
      virtual std::string Foo() {
        return "C++ " + FooBarAbstract::Foo();
      }
    
      virtual std::string Bar() {
        return "C++ Bar";
      }
    };
    

    Returned string by the FooBarCpp::FooBar method is:

    C++ Foo, C++ Bar
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide.

    24.4.7.2 Enable director feature

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Second, you must use the %feature("director") directive to tell SWIG which classes should get directors. In the example the FooBarAbstract class needs the director feature enabled so that the FooBarGo class can inherit from it, like this:

    %feature("director") FooBarAbstract;
    

    For a more detailed documentation of the director feature and how to enable or disable it for specific classes and virtual methods see SWIG's Java documentation on directors.

    24.4.7.3 Constructor and destructor

    SWIG creates an additional set of constructor and destructor functions once the director feature has been enabled for a C++ class. NewDirectorClassName allows overriding virtual methods on the new object instance and DeleteDirectorClassName needs to be used to free a director object instance created with NewDirectorClassName. More on overriding virtual methods follows later in this guide under overriding virtual methods.

    The default constructor and destructor functions NewClassName and DeleteClassName can still be used as before so that existing code doesn't break just because the director feature has been enabled for a C++ class. The behavior is undefined if the default and director constructor and destructor functions get mixed and so great care needs to be taken that only one of the constructor and destructor function pairs is used for any object instance. Both constructor functions, the default and the director one, return the same interface type. This makes it potentially hard to know which destructor function, the default or the director one, needs to be called to delete an object instance.

    In theory the DirectorInterface method could be used to determine if an object instance was created via NewDirectorClassName:

    if o.DirectorInterface() != nil {
      DeleteDirectorClassName(o)
    } else {
      DeleteClassName(o)
    }
    

    In practice it is strongly recommended to embed a director object instance in a Go struct so that a director object instance will be represented as a distinct Go type that subclasses a C++ class. For this Go type custom constructor and destructor functions take care of the director constructor and destructor function calls and the resulting Go class will appear to the user as any other SWIG wrapped C++ class. More on properly subclassing a C++ class follows later in this guide under subclass via embedding .

    24.4.7.4 Override virtual methods

    In order to override virtual methods on a C++ class with Go methods the NewDirectorClassName constructor functions receives a DirectorInterface argument. The methods in the DirectorInterface are a subset of the public and protected virtual methods of the C++ class. Virtual methods that have a final specifier are unsurprisingly excluded. If the DirectorInterface contains a method with a matching signature to a virtual method of the C++ class then the virtual C++ method will be overwritten with the Go method. As Go doesn't support protected methods all overridden protected virtual C++ methods will be public in Go.

    As an example see part of the FooBarGo class:

    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      ...
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
      ...
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb
      ...
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide. In this part of the example the virtual methods FooBarAbstract::Foo and FooBarAbstract::Bar have been overwritten with Go methods similarly to how the FooBarAbstract virtual methods are overwritten by the FooBarCpp class.

    The DirectorInterface in the example is implemented by the overwrittenMethodsOnFooBarAbstract Go struct type. A pointer to a overwrittenMethodsOnFooBarAbstract struct instance will be given to the NewDirectorFooBarAbstract constructor function. The constructor return value implements the FooBarAbstract interface. overwrittenMethodsOnFooBarAbstract could in theory be any Go type but in practice a struct is used as it typically contains at least a value of the C++ class interface so that the overwritten methods can use the rest of the C++ class. If the FooBarGo class would receive additional constructor arguments then these would also typically be stored in the overwrittenMethodsOnFooBarAbstract struct so that they can be used by the Go methods.

    24.4.7.5 Call base methods

    Often a virtual method will be overwritten to extend the original behavior of the method in the base class. This is also the case for the FooBarCpp::Foo method of the example code:

    virtual std::string Foo() {
      return "C++ " + FooBarAbstract::Foo();
    }
    

    To use base methods the DirectorClassNameMethodName wrapper functions are automatically generated by SWIG for public and protected virtual methods. The FooBarGo.Foo implementation in the example looks like this:

    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      return "Go " + DirectorFooBarAbstractFoo(om.fb)
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide.

    24.4.7.6 Subclass via embedding

    As previously mentioned in this guide the default and director constructor functions return the same interface type. To properly subclass a C++ class with a Go type the director object instance returned by the NewDirectorClassName constructor function should be embedded into a Go struct so that it represents a distinct but compatible type in Go's type system. This Go struct should be private and the constructor and destructor functions should instead work with a public interface type so that the Go class that subclasses a C++ class can be used as a compatible drop in.

    The subclassing part of the FooBarGo class for an example looks like this:

    type FooBarGo interface {
      FooBarAbstract
      deleteFooBarAbstract()
      IsFooBarGo()
    }
    
    type fooBarGo struct {
      FooBarAbstract
    }
    
    func (fbgs *fooBarGo) deleteFooBarAbstract() {
      DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
    }
    
    func (fbgs *fooBarGo) IsFooBarGo() {}
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb
    
      return &fooBarGo{FooBarAbstract: fb}
    }
    
    func DeleteFooBarGo(fbg FooBarGo) {
      fbg.deleteFooBarAbstract()
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide. In this part of the example the private fooBarGo struct embeds FooBarAbstract which lets the fooBarGo Go type "inherit" all the methods of the FooBarAbstract C++ class by means of embedding. The public FooBarGo interface type includes the FooBarAbstract interface and hence FooBarGo can be used as a drop in replacement for FooBarAbstract while the reverse isn't possible and would raise a compile time error. Furthermore the constructor and destructor functions NewFooBarGo and DeleteFooBarGo take care of all the director specifics and to the user the class appears as any other SWIG wrapped C++ class.

    24.4.7.7 Memory management with runtime.SetFinalizer

    In general all guidelines for C++ class memory management apply as well to director classes. One often overlooked limitation with runtime.SetFinalizer is that a finalizer doesn't run in case of a cycle and director classes typically have a cycle. The cycle in the FooBarGo class is here:

    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om) // fb.v = om
      om.fb = fb // Backlink causes cycle as fb.v = om!
      ...
    }
    

    In order to be able to use runtime.SetFinalizer nevertheless the finalizer needs to be set on something that isn't in a cycle and that references the director object instance. In the FooBarGo class example the FooBarAbstract director instance can be automatically deleted by setting the finalizer on fooBarGo:

    type fooBarGo struct {
      FooBarAbstract
    }
    
    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb // Backlink causes cycle as fb.v = om!
    
      fbgs := &fooBarGo{FooBarAbstract: fb}
      runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
      return fbgs
    }
    

    Furthermore if runtime.SetFinalizer is in use either the DeleteClassName destructor function needs to be removed or the fooBarGo struct needs additional data to prevent double deletion. Please read the C++ class memory management subchapter before using runtime.SetFinalizer to know all of its gotchas.

    24.4.7.8 Complete FooBarGo example class

    The complete and annotated FooBarGo class looks like this:

    // FooBarGo is a superset of FooBarAbstract and hence FooBarGo can be used as a
    // drop in replacement for FooBarAbstract but the reverse causes a compile time
    // error.
    type FooBarGo interface {
      FooBarAbstract
      deleteFooBarAbstract()
      IsFooBarGo()
    }
    
    // Via embedding fooBarGo "inherits" all methods of FooBarAbstract.
    type fooBarGo struct {
      FooBarAbstract
    }
    
    func (fbgs *fooBarGo) deleteFooBarAbstract() {
      DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
    }
    
    // The IsFooBarGo method ensures that FooBarGo is a superset of FooBarAbstract.
    // This is also how the class hierarchy gets represented by the SWIG generated
    // wrapper code.  For an instance FooBarCpp has the IsFooBarAbstract and
    // IsFooBarCpp methods.
    func (fbgs *fooBarGo) IsFooBarGo() {}
    
    // Go type that defines the DirectorInterface. It contains the Foo and Bar
    // methods that overwrite the respective virtual C++ methods on FooBarAbstract.
    type overwrittenMethodsOnFooBarAbstract struct {
      // Backlink to FooBarAbstract so that the rest of the class can be used by
      // the overridden methods.
      fb FooBarAbstract
    
      // If additional constructor arguments have been given they are typically
      // stored here so that the overridden methods can use them.
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      // DirectorFooBarAbstractFoo calls the base method FooBarAbstract::Foo.
      return "Go " + DirectorFooBarAbstractFoo(om.fb)
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
      return "Go Bar"
    }
    
    func NewFooBarGo() FooBarGo {
      // Instantiate FooBarAbstract with selected methods overridden.  The methods
      // that will be overwritten are defined on
      // overwrittenMethodsOnFooBarAbstract and have a compatible signature to the
      // respective virtual C++ methods. Furthermore additional constructor
      // arguments will be typically stored in the
      // overwrittenMethodsOnFooBarAbstract struct.
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb // Backlink causes cycle as fb.v = om!
    
      fbgs := &fooBarGo{FooBarAbstract: fb}
      // The memory of the FooBarAbstract director object instance can be
      // automatically freed once the FooBarGo instance is garbage collected by
      // uncommenting the following line.  Please make sure to understand the
      // runtime.SetFinalizer specific gotchas before doing this.  Furthermore
      // DeleteFooBarGo should be deleted if a finalizer is in use or the fooBarGo
      // struct needs additional data to prevent double deletion.
      // runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
      return fbgs
    }
    
    // Recommended to be removed if runtime.SetFinalizer is in use.
    func DeleteFooBarGo(fbg FooBarGo) {
      fbg.deleteFooBarAbstract()
    }
    

    Returned string by the FooBarGo.FooBar method is:

    Go Foo, Go Bar
    

    For comparison the FooBarCpp class looks like this:

    class FooBarCpp : public FooBarAbstract
    {
    protected:
      virtual std::string Foo() {
        return "C++ " + FooBarAbstract::Foo();
      }
    
      virtual std::string Bar() {
        return "C++ Bar";
      }
    };
    

    For comparison the returned string by the FooBarCpp::FooBar method is:

    C++ Foo, C++ Bar
    

    The complete source of this example can be found under SWIG/Examples/go/director/.

    24.4.8 Default Go primitive type mappings

    The following table lists the default type mapping from C/C++ to Go. This table will tell you which Go type to expect for a function which uses a given C/C++ type.

    C/C++ typeGo type
    boolbool
    charbyte
    signed charint8
    unsigned charbyte
    shortint16
    unsigned shortuint16
    intint
    unsigned intuint
    longint64
    unsigned longuint64
    long longint64
    unsigned long longuint64
    floatfloat32
    doublefloat64
    char *
    char []
    string

    Note that SWIG wraps the C char type as a character. Pointers and arrays of this type are wrapped as strings. The signed char type can be used if you want to treat char as a signed number rather than a character. Also note that all const references to primitive types are treated as if they are passed by value.

    These type mappings are defined by the "gotype" typemap. You may change that typemap, or add new values, to control how C/C++ types are mapped into Go types.

    24.4.9 Output arguments

    Because of limitations in the way output arguments are processed in swig, a function with output arguments will not have multiple return values. Instead, you must pass a pointer into the C++ function to tell it where to store the output value. In go, you supply a slice in the place of the output argument.

    For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters):

    double modf(double x, double *ip);
    

    You could wrap it with SWIG as follows:

    %include <typemaps.i>
    double modf(double x, double *OUTPUT);
    

    or you can use the %apply directive:

    %include <typemaps.i>
    %apply double *OUTPUT { double *ip };
    double modf(double x, double *ip);
    

    In Go you would use it like this:

    ptr := []float64{0.0}
    fraction := modulename.Modf(5.0, ptr)
    

    Since this is ugly, you may want to wrap the swig-generated API with some additional functions written in go that hide the ugly details.

    There are no char *OUTPUT typemaps. However you can apply the signed char * typemaps instead:

    %include <typemaps.i>
    %apply signed char *OUTPUT {char *output};
    void f(char *output);
    

    24.4.10 Adding additional go code

    Often the APIs generated by swig are not very natural in go, especially if there are output arguments. You can insert additional go wrapping code to add new APIs with %insert(go_wrapper), like this:

    %include <typemaps.i>
    // Change name of what swig generates to Wrapped_modf.  This function will
    // have the following signature in go:
    //   func Wrapped_modf(float64, []float64) float64
    %rename(wrapped_modf) modf(double x, double *ip);
    
    %apply double *OUTPUT { double *ip };
    double modf(double x, double *ip);
    
    %insert(go_wrapper) %{
    
    // The improved go interface to this function, which has two return values,
    // in the more natural go idiom:
    func Modf(x float64) (fracPart float64, intPart float64) {
      ip := []float64{0.0}
      fracPart = Wrapped_modf(x, ip)
      intPart = ip[0]
      return
    }
    
    %}
    

    For classes, since swig generates an interface, you can add additional methods by defining another interface that includes the swig-generated interface. For example,

    %rename(Wrapped_MyClass) MyClass;
    %rename(Wrapped_GetAValue) MyClass::GetAValue(int *x);
    %apply int *OUTPUT { int *x };
    
    class MyClass {
     public:
      MyClass();
      int AFineMethod(const char *arg); // Swig's wrapping is fine for this one.
      bool GetAValue(int *x);
    };
    
    %insert(go_wrapper) %{
    
    type MyClass interface {
      Wrapped_MyClass
      GetAValue() (int, bool)
    }
    
    func (arg SwigcptrWrapped_MyClass) GetAValue() (int, bool) {
      ip := []int{0}
      ok := arg.Wrapped_GetAValue(ip)
      return ip[0], ok
    }
    
    %}
    

    Of course, if you have to rewrite most of the methods, instead of just a few, then you might as well define your own struct that includes the swig-wrapped object, instead of adding methods to the swig-generated object.

    If you need to import other go packages, you can do this with %go_import. For example,

    %go_import("fmt", _ "unusedPackage", rp "renamed/package")
    
    %insert(go_wrapper) %{
    
    func foo() {
      fmt.Println("Some string:", rp.GetString())
    }
    
    // Importing the same package twice is permitted,
    // Go code will be generated with only the first instance of the import.
    %go_import("fmt")
    
    %insert(go_wrapper) %{
    
    func bar() {
      fmt.Println("Hello world!")
    }
    
    %}
    

    24.4.11 Go typemaps

    You can use the %typemap directive to modify SWIG's default wrapping behavior for specific C/C++ types. You need to be familiar with the material in the general "Typemaps" chapter. That chapter explains how to define a typemap. This section describes some specific typemaps used for Go.

    In general type conversion code may be written either in C/C++ or in Go. The choice to make normally depends on where memory should be allocated. To allocate memory controlled by the Go garbage collector, write Go code. To allocate memory in the C/C++ heap, write C code.

    TypemapDescription
    gotype The Go type to use for a C++ type. This type will appear in the generated Go wrapper function. If this is not defined SWIG will use a default as described above.
    imtype An intermediate Go type used by the "goin", "goout", "godirectorin", and "godirectorout" typemaps. If this typemap is not defined for a C/C++ type, the gotype typemape will be used. This is useful when gotype is best converted to C/C++ using Go code.
    goin Go code to convert from gotype to imtype when calling a C/C++ function. SWIG will then internally convert imtype to a C/C++ type and pass it down. If this is not defined, or is the empty string, no conversion is done.
    in C/C++ code to convert the internally generated C/C++ type, based on imtype, into the C/C++ type that a function call expects. If this is not defined the value will simply be cast to the desired type.
    out C/C++ code to convert the C/C++ type that a function call returns into the internally generated C/C++ type, based on imtype, that will be returned to Go. If this is not defined the value will simply be cast to the desired type.
    goout Go code to convert a value returned from a C/C++ function from imtype to gotype. If this is not defined, or is the empty string, no conversion is done.
    argout C/C++ code to adjust an argument value when returning from a function. This is called after the real C/C++ function has run. This uses the internally generated C/C++ type, based on imtype. This is only useful for a pointer type of some sort. If this is not defined nothing will be done.
    goargout Go code to adjust an argument value when returning from a function. This is called after the real C/C++ function has run. The value will be in imtype. This is only useful for a pointer type of some sort. If this is not defined, or is the empty string, nothing will be done.
    directorin C/C++ code to convert the C/C++ type used to call a director method into the internally generated C/C++ type, based on imtype, that will be passed to Go. If this is not defined the value will simply be cast to the desired type.
    godirectorin Go code to convert a value used to call a director method from imtype to gotype. If this is not defined, or is the empty string, no conversion is done.
    godirectorout Go code to convert a value returned from a director method from gotype to imtype. If this is not defined, or is the empty string, no conversion is done.
    directorout C/C++ code to convert a value returned from a director method from the internally generated C/C++ type, based on imtype, into the type that the method should return If this is not defined the value will simply be cast to the desired type.

    25 SWIG and Guile

    This section details guile-specific support in SWIG.

    25.1 Supported Guile Versions

    SWIG works with Guile versions 1.8.x and 2.0.x. Support for version 1.6.x has been dropped. The last version of SWIG that still works with Guile version 1.6.x is SWIG 2.0.9.

    Note that starting with guile 2.0, the guile sources can be compiled for improved performance. This is currently not tested with swig so your mileage may vary. To be safe set environment variable GUILE_AUTO_COMPILE to 0 when using swig generated guile code.

    25.2 Meaning of "Module"

    There are three different concepts of "module" involved, defined separately for SWIG, Guile, and Libtool. To avoid horrible confusion, we explicitly prefix the context, e.g., "guile-module".

    25.3 Old GH Guile API

    Guile 1.8 and older could be interfaced using two different api's, the SCM or the GH API. The GH interface to guile is deprecated. Read more about why in the Guile manual.

    Support for the guile GH wrapper code generation has been dropped from SWIG. The last version of SWIG that can still generate guile GH wrapper code is 2.0.9. Please use that version if you really need the GH wrapper code.

    25.4 Linkage

    Guile support is complicated by a lack of user community cohesiveness, which manifests in multiple shared-library usage conventions. A set of policies implementing a usage convention is called a linkage.

    25.4.1 Simple Linkage

    The default linkage is the simplest; nothing special is done. In this case the function SWIG_init() is exported. Simple linkage can be used in several ways:

    • Embedded Guile, no modules. You want to embed a Guile interpreter into your program; all bindings made by SWIG shall show up in the root module. Then call SWIG_init() in the inner_main() function. See the "simple" and "matrix" examples under Examples/guile.
    • Dynamic module mix-in. You want to create a Guile module using define-module, containing both Scheme code and bindings made by SWIG; you want to load the SWIG modules as shared libraries into Guile.

      (define-module (my module))
      (define my-so (dynamic-link "./libexample.so"))
      (dynamic-call "SWIG_init" my-so) ; make SWIG bindings
      ;; Scheme definitions can go here
      

      Newer Guile versions provide a shorthand for dynamic-link and dynamic-call:

      (load-extension "./libexample.so" "SWIG_init")
      

      A more portable approach would be to drop the shared library extension:

      (load-extension "./libexample" "SWIG_init")
      

      You need to explicitly export those bindings made by SWIG that you want to import into other modules:

      (export foo bar)
      

      In this example, the procedures foo and bar would be exported. Alternatively, you can export all bindings with the following module-system hack:

      (module-map (lambda (sym var)
                    (module-export! (current-module) (list sym)))
                  (current-module))
      

      SWIG can also generate this Scheme stub (from define-module up to export) semi-automagically if you pass it the command-line argument -scmstub. The code will be exported in a file called module.scm in the directory specified by -outdir or the current directory if -outdir is not specified. Since SWIG doesn't know how to load your extension module (with dynamic-link or load-extension), you need to supply this information by including a directive like this in the interface file:

      %scheme %{ (load-extension "./libexample.so" "SWIG_init") %}
      

      (The %scheme directive allows to insert arbitrary Scheme code into the generated file module.scm; it is placed between the define-module form and the export form.)

    If you want to include several SWIG modules, you would need to rename SWIG_init via a preprocessor define to avoid symbol clashes. For this case, however, passive linkage is available.

    25.4.2 Passive Linkage

    Passive linkage is just like simple linkage, but it generates an initialization function whose name is derived from the module and package name (see below).

    You should use passive linkage rather than simple linkage when you are using multiple modules.

    25.4.3 Native Guile Module Linkage

    SWIG can also generate wrapper code that does all the Guile module declarations on its own if you pass it the -Linkage module command-line option.

    The module name is set with the -package and -module command-line options. Suppose you want to define a module with name (my lib foo); then you would have to pass the options -package my/lib -module foo . Note that the last part of the name can also be set via the SWIG directive %module.

    You can use this linkage in several ways:

    • Embedded Guile with SWIG modules. You want to embed a Guile interpreter into your program; the SWIG bindings shall be put into different modules. Simply call the function scm_init_my _modules_foo_module in the inner_main() function.
    • Dynamic Guile modules. You want to load the SWIG modules as shared libraries into Guile; all bindings are automatically put in newly created Guile modules.
      (define my-so (dynamic-link "./libfoo"))
      ;; create new module and put bindings there:
      (dynamic-call "scm_init_my_modules_foo_module" my-so) 
      
      Newer Guile versions have a shorthand procedure for this:
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module")
      

    25.4.4 Old Auto-Loading Guile Module Linkage

    Guile used to support an autoloading facility for object-code modules. This support has been marked deprecated in version 1.4.1 and is going to disappear sooner or later. SWIG still supports building auto-loading modules if you pass it the -Linkage ltdlmod command-line option.

    Auto-loading worked like this: Suppose a module with name (my lib foo) is required and not loaded yet. Guile will then search all directories in its search path for a Scheme file my/modules/foo.scm or a shared library my/ modules/libfoo.so (or my/ modules/libfoo.la; see the GNU libtool documentation). If a shared library is found that contains the symbol scm_init_my_modules_foo_module, the library is loaded, and the function at that symbol is called with no arguments in order to initialize the module.

    When invoked with the -Linkage ltdlmod command-line option, SWIG generates an exported module initialization function with an appropriate name.

    25.4.5 Hobbit4D Linkage

    The only other linkage supported at this time creates shared object libraries suitable for use by hobbit's (hobbit4d link) guile module. This is called the "hobbit" linkage, and requires also using the "-package" command line option to set the part of the module name before the last symbol. For example, both command lines:

    swig -guile -package my/lib foo.i
    swig -guile -package my/lib -module foo foo.i
    

    would create module (my lib foo) (assuming in the first case foo.i declares the module to be "foo"). The installed files are my/lib/libfoo.so.X.Y.Z and friends. This scheme is still very experimental; the (hobbit4d link) conventions are not well understood.

    25.5 Underscore Folding

    Underscores are converted to dashes in identifiers. Guile support may grow an option to inhibit this folding in the future, but no one has complained so far.

    You can use the SWIG directives %name and %rename to specify the Guile name of the wrapped functions and variables (see CHANGES).

    25.6 Typemaps

    The Guile module handles all types via typemaps. This information is read from Lib/guile/typemaps.i. Some non-standard typemap substitutions are supported:

    • $descriptor expands to a type descriptor for use with the SWIG_NewPointerObj() and SWIG_ConvertPtr functions.
    • For pointer types, $*descriptor expands to a descriptor for the direct base type (i.e., one pointer is stripped), whereas $basedescriptor expands to a descriptor for the base type (i.e., all pointers are stripped).

    A function returning void (more precisely, a function whose out typemap returns SCM_UNSPECIFIED) is treated as returning no values. In argout typemaps, one can use the macro GUILE_APPEND_RESULT in order to append a value to the list of function return values.

    Multiple values can be passed up to Scheme in one of three ways:

    • Multiple values as lists. By default, if more than one value is to be returned, a list of the values is created and returned; to switch back to this behavior, use

      %values_as_list;
    • Multiple values as vectors. By issuing

      %values_as_vector;

      vectors instead of lists will be used.

    • Multiple values for multiple-value continuations. This is the most elegant way. By issuing

      %multiple_values;

      multiple values are passed to the multiple-value continuation, as created by call-with-values or the convenience macro receive. The latter is available if you issue (use-modules (srfi srfi-8)). Assuming that your divide function wants to return two values, a quotient and a remainder, you can write:

      (receive (quotient remainder)
          (divide 35 17)
        body...)
      

      In body, the first result of divide will be bound to the variable quotient, and the second result to remainder.

    See also the "multivalue" example.

    Constants are exported as a function that returns the value. The %feature("constasvar") can be applied to any constant, immutable variable, or enum. Instead of exporting the constant as a function that must be called, the constant will appear as a scheme variable. See Features and the %feature directive for info on how to apply the %feature.

    25.7 Representation of pointers as smobs

    For pointer types, SWIG uses Guile smobs. SWIG smobs print like this: #<swig struct xyzzy * 0x1234affe> Two of them are equal? if and only if they have the same type and value.

    To construct a Scheme object from a C pointer, the wrapper code calls the function SWIG_NewPointerObj(), passing a pointer to a struct representing the pointer type. The type index to store in the upper half of the CAR is read from this struct. To get the pointer represented by a smob, the wrapper code calls the function SWIG_ConvertPtr(), passing a pointer to a struct representing the expected pointer type. See also The run-time type checker. If the Scheme object passed was not a SWIG smob representing a compatible pointer, a wrong-type-arg exception is raised.

    25.7.1 Smobs

    In earlier versions of SWIG, C pointers were represented as Scheme strings containing a hexadecimal rendering of the pointer value and a mangled type name. As Guile allows registering user types, so-called "smobs" (small objects), a much cleaner representation has been implemented now. The details will be discussed in the following.

    The whole type system, when it is first initialized, creates two smobs named "swig" and "collected_swig". The swig smob is used for non-garbage collected smobs, while the collected_swig smob is used as described below. Each smob has the same format, which is a double cell created by SCM_NEWSMOB2() The first word of data is the pointer to the object and the second word of data is the swig_type_info * structure describing this type. If a generated GOOPS module has been loaded, smobs will be wrapped by the corresponding GOOPS class.

    25.7.2 Garbage Collection

    Garbage collection is a feature of Guile since version 1.6. As SWIG now requires Guile > 1.8, it is automatically included. Garbage collection works like this. Every swig_type_info structure stores in its clientdata field a pointer to the destructor for this type. The destructor is the generated wrapper around the delete function. So swig still exports a wrapper for the destructor, it just does not call scm_c_define_gsubr() for the wrapped delete function. So the only way to delete an object is from the garbage collector, since the delete function is not available to scripts. How swig determines if a type should be garbage collected is exactly like described in Object ownership and %newobject in the SWIG manual. All typemaps use an $owner var, and the guile module replaces $owner with 0 or 1 depending on feature:new.

    25.8 Native Guile pointers

    In addition to SWIG smob pointers, Guile's native pointer type are accepted as arguments to wrapped SWIG functions. This can be useful for passing pointers to bytevector data to wrapped functions.

    25.9 Exception Handling

    SWIG code calls scm_error on exception, using the following mapping:

          MAP(SWIG_MemoryError,     "swig-memory-error");
          MAP(SWIG_IOError,         "swig-io-error");
          MAP(SWIG_RuntimeError,    "swig-runtime-error");
          MAP(SWIG_IndexError,      "swig-index-error");
          MAP(SWIG_TypeError,       "swig-type-error");
          MAP(SWIG_DivisionByZero,  "swig-division-by-zero");
          MAP(SWIG_OverflowError,   "swig-overflow-error");
          MAP(SWIG_SyntaxError,     "swig-syntax-error");
          MAP(SWIG_ValueError,      "swig-value-error");
          MAP(SWIG_SystemError,     "swig-system-error");
    

    The default when not specified here is to use "swig-error". See Lib/exception.i for details.

    25.10 Procedure documentation

    If invoked with the command-line option -procdoc file , SWIG creates documentation strings for the generated wrapper functions, describing the procedure signature and return value, and writes them to file.

    SWIG can generate documentation strings in three formats, which are selected via the command-line option -procdocformat format :

    • guile-1.4 (default): Generates a format suitable for Guile 1.4.
    • plain: Generates a format suitable for Guile 1.4.1 and later.
    • texinfo: Generates texinfo source, which must be run through texinfo in order to get a format suitable for Guile 1.4.1 and later.

    You need to register the generated documentation file with Guile like this:

    (use-modules (ice-9 documentation))
    (set! documentation-files 
          (cons "file" documentation-files))
    

    Documentation strings can be configured using the Guile-specific typemap argument doc. See Lib/guile/typemaps.i for details.

    25.11 Procedures with setters

    For global variables, SWIG creates a single wrapper procedure ( variable :optional value), which is used for both getting and setting the value. For struct members, SWIG creates two wrapper procedures (struct-member-get pointer) and (struct-member-set pointer value).

    If invoked with the command-line option -emit-setters ( recommended), SWIG will additionally create procedures with setters. For global variables, the procedure-with-setter variable is created, so you can use (variable ) to get the value and (set! (variable) value) to set it. For struct members, the procedure-with-setter struct-member is created, so you can use (struct-member pointer) to get the value and (set! (struct -member pointer) value) to set it.

    If invoked with the command-line option -only-setters, SWIG will only create procedures with setters, i.e., for struct members, the procedures (struct-member -get pointer) and (struct-member-set pointer value) are not generated.

    25.12 GOOPS Proxy Classes

    SWIG can also generate classes and generic functions for use with Guile's Object-Oriented Programming System (GOOPS). GOOPS is a sophisticated object system in the spirit of the Common Lisp Object System (CLOS).

    To enable GOOPS support, pass the -proxy argument to swig. This will export the GOOPS wrapper definitions into the module.scm file in the directory specified by -outdir or the current directory. GOOPS support requires either passive or module linkage.

    The generated file will contain definitions of GOOPS classes mimicking the C++ class hierarchy.

    Enabling GOOPS support implies -emit-setters.

    If -emit-slot-accessors is also passed as an argument, then the generated file will contain accessor methods for all the slots in the classes and for global variables. The input class

      class Foo {
        public:
          Foo(int i) : a(i) {}
          int a;
          int getMultBy(int i) { return a * i; }
          Foo getFooMultBy(int i) { return Foo(a * i); }
      }; 
      Foo getFooPlus(int i) { return Foo(a + i); }
    

    will produce (if -emit-slot-accessors is not passed as a parameter)

    (define-class <Foo> (<swig>)
      (a #:allocation #:swig-virtual 
         #:slot-ref primitive:Foo-a-get 
         #:slot-set! primitive:Foo-a-set)
      #:metaclass <swig-metaclass>
      #:new-function primitive:new-Foo
    )
    (define-method (getMultBy (swig_smob <Foo>) i)
      (primitive:Foo-getMultBy  (slot-ref swig_smob 'smob) i))
    (define-method (getFooMultBy (swig_smob <Foo>) i)
      (make <Foo> #:init-smob (primitive:Foo-getFooMultBy  (slot-ref swig_smob 'smob) i)))
    
    (define-method (getFooPlus i)
      (make <Foo> #:init-smob (primitive:getFooPlus i)))
    
    (export <Foo> getMultBy getFooMultBy getFooPlus )
    

    and will produce (if -emit-slot-accessors is passed as a parameter)

    (define-class <Foo> (<swig>)
      (a #:allocation #:swig-virtual 
         #:slot-ref primitive:Foo-a-get 
         #:slot-set! primitive:Foo-a-set 
         #:accessor a)
      #:metaclass <swig-metaclass>
      #:new-function primitive:new-Foo
    )
    (define-method (getMultBy (swig_smob <Foo>) i)
      (primitive:Foo-getMultBy  (slot-ref swig_smob 'smob) i))
    (define-method (getFooMultBy (swig_smob <Foo>) i)
      (make <Foo> #:init-smob (primitive:Foo-getFooMultBy  (slot-ref swig_smob 'smob) i)))
    
    (define-method (getFooPlus i)
      (make <Foo> #:init-smob (primitive:getFooPlus i)))
    
    (export <Foo> a getMultBy getFooMultBy getFooPlus )
    

    which can then be used by this code

    ;; not using getters and setters
    (define foo (make <Foo> #:args '(45)))
    (slot-ref foo 'a)
    (slot-set! foo 'a 3)
    (getMultBy foo 4)
    (define foo2 (getFooMultBy foo 7))
    (slot-ref foo 'a)
    (slot-ref (getFooPlus foo 4) 'a)
    
    ;; using getters and setters
    (define foo (make <Foo> #:args '(45)))
    (a foo)
    (set! (a foo) 5)
    (getMultBy foo 4)
    (a (getFooMultBy foo 7))
    

    Notice that constructor arguments are passed as a list after the #:args keyword. Hopefully in the future the following will be valid (make <Foo> #:a 5 #:b 4)

    Also note that the order the declarations occur in the .i file make a difference. For example,

    %module test
    
    %{ #include "foo.h" %}
    
    %inline %{
      int someFunc(Foo &a) {
        ...
      }
    %}
    
    %include "foo.h"
    

    This is a valid SWIG file it will work as you think it will for primitive support, but the generated GOOPS file will be broken. Since the someFunc definition is parsed by SWIG before all the declarations in foo.h, the generated GOOPS file will contain the definition of someFunc() before the definition of <Foo>. The generated GOOPS file would look like

    ;;...
    
    (define-method (someFunc (swig_smob <Foo>))
      (primitive:someFunc (slot-ref swig_smob 'smob)))
    
    ;;...
    
    (define-class <Foo> (<swig>)
      ;;...
    )
    
    ;;...
    

    Notice that <Foo> is used before it is defined. The fix is to just put the %import "foo.h" before the %inline block.

    25.12.1 Naming Issues

    As you can see in the example above, there are potential naming conflicts. The default exported accessor for the Foo::a variable is named a. The name of the wrapper global function is getFooPlus. If the -useclassprefix option is passed to swig, the name of all accessors and member functions will be prepended with the class name. So the accessor will be called Foo-a and the member functions will be called Foo-getMultBy. Also, if the -goopsprefix goops: argument is passed to swig, every identifier will be prefixed by goops:

    Two guile-modules are created by SWIG. The first module contains the primitive definitions of all the wrapped functions and variables, and is located either in the _wrap.cxx file (with -Linkage module ) or in the scmstub file (if -Linkage passive -scmstub). The name of this guile-module is the swig-module name (given on the command line with the -module argument or with the %module directive) concatenated with the string "-primitive". For example, if %module Test is set in the swig interface file, the name of the guile-module in the scmstub or -Linkage module will be Test-primitive. Also, the scmstub file will be named Test-primitive.scm. The string "primitive" can be changed by the -primsuffix swig argument. So the same interface, with the -primsuffix base will produce a module called Test-base . The second generated guile-module contains all the GOOPS class definitions and is located in a file named module.scm in the directory specified with -outdir or the current directory. The name of this guile-module is the name of the swig-module (given on the command line or with the %module directive). In the previous example, the GOOPS definitions will be in a file named Test.scm.

    Because of the naming conflicts, you can't in general use both the -primitive and the GOOPS guile-modules at the same time. To do this, you need to rename the exported symbols from one or both guile-modules. For example,

    (use-modules ((Test-primitive) #:renamer (symbol-prefix-proc 'primitive:)))
    (use-modules ((Test) #:renamer (symbol-prefix-proc 'goops:)))
    

    25.12.2 Linking

    The guile-modules generated above all need to be linked together. GOOPS support requires either passive or module linkage. The exported GOOPS guile-module will be the name of the swig-module and should be located in a file called Module.scm. This should be installed on the autoload path for guile, so that (use-modules (Package Module)) will load everything needed. Thus, the top of the GOOPS guile-module will contain code to load everything needed by the interface (the shared library, the scmstub module, etc.). The %goops directive inserts arbitrary code into the generated GOOPS guile-module, and should be used to load the dependent libraries.

    This breaks up into three cases

    • Passive Linkage without -scmstub: Note that this linkage style has the potential for naming conflicts, since the primitive exported function and variable names are not wrapped in a guile-module and might conflict with names from the GOOPS guile-module (see above). Pass the -goopsprefix argument to solve this problem. If the -exportprimitive option is passed to SWIG the (export ...) code that would be exported into the scmstub file is exported at the bottom of the generated GOOPS guile-module. The %goops directive should contain code to load the shared library.
      %goops %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      

      Produces the following code at the top of the generated GOOPS guile-module (with the -package my/modules -module foo command line arguments)

      (define-module (my modules foo))
      
      ;; %goops directive goes here
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") 
      
      (use-modules (oop goops) (Swig common))
      
    • Passive Linkage with -scmstub: Here, the name of the scmstub file should be Module-primitive.scm (with primitive replaced with whatever is given with the -primsuffix argument. The code to load the shared library should be located in the %scheme directive, which will then be added to the scmstub file. SWIG will automatically generate the line (use-modules ( Package Module-primitive)) into the GOOPS guile-module. So if Module-primitive.scm is on the autoload path for guile, the %goops directive can be empty. Otherwise, the %goops directive should contain whatever code is needed to load the Module-primitive.scm file into guile.

      %scheme %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      // only include the following definition if (my modules foo) cannot
      // be loaded automatically
      %goops %{ 
        (primitive-load "/path/to/foo-primitive.scm") 
        (primitive-load "/path/to/Swig/common.scm")
      %}
      

      Produces the following code at the top of the generated GOOPS guile-module

      (define-module (my modules foo))
      
      ;; %goops directive goes here (if any)
      (primitive-load "/path/to/foo-primitive.scm")
      (primitive-load "/path/to/Swig/common.scm")
      
      (use-modules (oop goops) (Swig common))
      (use-modules ((my modules foo-primitive) :renamer (symbol-prefix-proc
                                                             'primitive:)))
      
      
    • Module Linkage: This is very similar to passive linkage with a scmstub file. SWIG will also automatically generate the line (use-modules (Package Module-primitive)) into the GOOPS guile-module. Again the %goops directive should contain whatever code is needed to get that module loaded into guile.

      %goops %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      

      Produces the following code at the top of the generated GOOPS guile-module

      (define-module (my modules foo))
      
      ;; %goops directive goes here (if any)
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") 
      
      (use-modules (oop goops) (Swig common))
      (use-modules ((my modules foo-primitive) :renamer (symbol-prefix-proc
                                                               'primitive:)))
      
      

    (Swig common): The generated GOOPS guile-module also imports definitions from the (Swig common) guile-module. This module is included with SWIG and should be installed by SWIG into the autoload path for guile (based on the configure script and whatever arguments are passed). If it is not, then the %goops directive also needs to contain code to load the common.scm file into guile. Also note that if you are trying to install the generated wrappers on a computer without SWIG installed, you will need to include the common.swg file along with the install.

    Multiple Modules: Type dependencies between modules is supported. For example, if mod1 includes definitions of some classes, and mod2 includes some classes derived from classes in mod1, the generated GOOPS file for mod2 will declare the correct superclasses. The only problem is that since mod2 uses symbols from mod1, the mod2 GOOPS file must include a (use-modules (mod2)). Currently, SWIG does not automatically export this line; it must be included in the %goops directive of mod2. Maybe in the future SWIG can detect dependencies and export this line. (how do other language modules handle this problem?)


    26 SWIG and Java

    This chapter describes SWIG's support of Java. It covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters.

    26.1 Overview

    The 100% Pure Java effort is a commendable concept, however in the real world programmers often either need to re-use their existing code or in some situations want to take advantage of Java but are forced into using some native (C/C++) code. The Java extension to SWIG makes it very easy to plumb in existing C/C++ code for access from Java, as SWIG writes the Java Native Interface (JNI) code for you. It is different to using the 'javah' tool as SWIG will wrap existing C/C++ code, whereas javah takes 'native' Java function declarations and creates C/C++ function prototypes. SWIG wraps C/C++ code using Java proxy classes and is very useful if you want to have access to large amounts of C/C++ code from Java. If only one or two JNI functions are needed then using SWIG may be overkill. SWIG enables a Java program to easily call into C/C++ code from Java. Historically, SWIG was not able to generate any code to call into Java code from C++. However, SWIG now supports full cross language polymorphism and code is generated to call up from C++ to Java when wrapping C++ virtual methods via the director feature.

    Java is one of the few non-scripting language modules in SWIG. As SWIG utilizes the type safety that the Java language offers, it takes a somewhat different approach to that used for scripting languages. In particular runtime type checking and the runtime library are not used by Java. This should be borne in mind when reading the rest of the SWIG documentation. This chapter on Java is relatively self contained and will provide you with nearly everything you need for using SWIG and Java. However, the "SWIG Basics" chapter will be a useful read in conjunction with this one.

    This chapter starts with a few practicalities on running SWIG and compiling the generated code. If you are looking for the minimum amount to read, have a look at the sections up to and including the tour of basic C/C++ wrapping section which explains how to call the various C/C++ code constructs from Java. Following this section are details of the C/C++ code and Java classes that SWIG generates. Due to the complexities of C and C++ there are different ways in which C/C++ code could be wrapped and called from Java. SWIG is a powerful tool and the rest of the chapter details how the default code wrapping can be tailored. Various customisation tips and techniques using SWIG directives are covered. The latter sections cover the advanced techniques of using typemaps for complete control of the wrapping process.

    26.2 Preliminaries

    SWIG 1.1 works with JDKs from JDK 1.1 to JDK1.4 (Java 2 SDK1.4) and should also work with any later versions. Given the choice, you should probably use the latest version of Sun's JDK. The SWIG Java module is known to work using Sun's JVM on Solaris, Linux and the various flavours of Microsoft Windows including Cygwin. The Kaffe JVM is known to give a few problems and at the time of writing was not a fully fledged JVM with full JNI support. The generated code is also known to work on vxWorks using WindRiver's PJava 3.1. The best way to determine whether your combination of operating system and JDK will work is to test the examples and test-suite that comes with SWIG. Run make -k check from the SWIG root directory after installing SWIG on Unix systems.

    The Java module requires your system to support shared libraries and dynamic loading. This is the commonly used method to load JNI code so your system will more than likely support this.

    Android uses Java JNI and also works with SWIG. Please read the Android chapter in conjunction with this one if you are targeting Android.

    26.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    /* File: example.i */
    %module test
    %{
    #include "stuff.h"
    %}
    int fact(int n);
    

    To build a Java module, run SWIG using the -java option :

    %swig -java example.i
    

    If building C++, add the -c++ option:

    $ swig -c++ -java example.i
    

    This creates two different files; a C/C++ source file example_wrap.c or example_wrap.cxx and numerous Java files. The generated C/C++ source file contains the JNI wrapper code that needs to be compiled and linked with the rest of your C/C++ application.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. It is also possible to change the output directory that the Java files are generated into using -outdir.

    The module name, specified with %module, determines the name of various generated classes as discussed later. Note that the module name does not define a Java package and by default, the generated Java classes do not have a Java package. The -package option described below can specify a Java package name to use.

    The following sections have further practical examples and details on how you might go about compiling and using the generated files.

    26.2.2 Additional Commandline Options

    The following table lists the additional commandline options available for the Java module. They can also be seen by using:

    swig -java -help 
    
    Java specific options
    -nopgcppsuppress the premature garbage collection prevention parameter
    -noproxygenerate the low-level functional interface instead of proxy classes
    -package <name>set name of the Java package to <name>

    Their use will become clearer by the time you have finished reading this section on SWIG and Java.

    26.2.3 Getting the right header files

    In order to compile the C/C++ wrappers, the compiler needs the jni.h and jni_md.h header files which are part of the JDK. They are usually in directories like this:

    /usr/java/include
    /usr/java/include/<operating_system>
    

    The exact location may vary on your machine, but the above locations are typical.

    26.2.4 Compiling a dynamic module

    The JNI code exists in a dynamic module or shared library (DLL on Windows) and gets loaded by the JVM. Assuming you have code you need to link to in a file called example.c, in order to build a shared library file, you need to compile your module in a manner similar to the following (shown for Solaris):

    $ swig -java example.i
    $ gcc -fPIC -c example_wrap.c -I/usr/java/include -I/usr/java/include/solaris
    $ gcc -fPIC -c example.c
    $ ld -G example_wrap.o example.o -o libexample.so
    

    The exact commands for doing this vary from platform to platform. However, SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the Examples/java directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    Important
    If you are going to use optimisations turned on with gcc (for example -O2), ensure you also compile with -fno-strict-aliasing. The GCC optimisations have become more aggressive from gcc-4.0 onwards and will result in code that fails with strict aliasing optimisations turned on. See the C/C++ to Java typemaps section for more details.

    The name of the shared library output file is important. If the name of your SWIG module is "example", the name of the corresponding shared library file should be "libexample.so" (or equivalent depending on your machine, see Dynamic linking problems for more information). The name of the module is specified using the %module directive or -module command line option.

    26.2.5 Using your module

    To load your shared native library module in Java, simply use Java's System.loadLibrary method in a Java class:

    // runme.java
    
    public class runme {
      static {
        System.loadLibrary("example");
      }
    
      public static void main(String argv[]) {
        System.out.println(example.fact(4));
      }
    }
    

    Compile all the Java files and run:

    $ javac *.java
    $ java runme
    24
    $
    

    If it doesn't work have a look at the following section which discusses problems loading the shared library.

    26.2.6 Dynamic linking problems

    As shown in the previous section the code to load a native library (shared library) is System.loadLibrary("name"). This can fail with an UnsatisfiedLinkError exception and can be due to a number of reasons.

    You may get an exception similar to this:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: no example in java.library.path
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1312)
            at java.lang.Runtime.loadLibrary0(Runtime.java:749)
            at java.lang.System.loadLibrary(System.java:820)
            at runme.<clinit>(runme.java:5)
    

    The most common cause for this is an incorrect naming of the native library for the name passed to the loadLibrary function. The string passed to the loadLibrary function must not include the file extension name in the string, that is .dll or .so. The string must be name and not libname for all platforms. On Windows the native library must then be called name.dll and on most Unix systems it must be called libname.so .

    Another common reason for the native library not loading is because it is not in your path. On Windows make sure the path environment variable contains the path to the native library. On Unix make sure that your LD_LIBRARY_PATH contains the path to the native library. Adding paths to LD_LIBRARY_PATH can slow down other programs on your system so you may want to consider alternative approaches. For example you could recompile your native library with extra path information using -rpath if you're using GNU, see the GNU linker documentation (ld man page). You could use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    The native library will also not load if there are any unresolved symbols in the compiled C/C++ code. The following exception is indicative of this:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: libexample.so: undefined
    symbol: fact
            at java.lang.ClassLoader$NativeLibrary.load(Native Method)
            at java.lang.ClassLoader.loadLibrary0(ClassLoader.java, Compiled Code)
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java, Compiled Code)
            at java.lang.Runtime.loadLibrary0(Runtime.java, Compiled Code)
            at java.lang.System.loadLibrary(System.java, Compiled Code)
            at runme.<clinit>(runme.java:5)
    $
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the native library file. Make sure you compile both the SWIG wrapper file and the code you are wrapping into the native library file. If you forget to compile and link in the SWIG wrapper file into your native library file, you will get a message similar to the following:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: exampleJNI.gcd(II)I
            at exampleJNI.gcd(Native Method)
            at example.gcd(example.java:12)
            at runme.main(runme.java:18)
    

    where gcd is the missing JNI function that SWIG generated into the wrapper file. Also make sure you pass all of the required libraries to the linker. The java -verbose:jni commandline option is also a great way to get more information on unresolved symbols. One last piece of advice is to beware of the common faux pas of having more than one native library version in your path.

    In summary, ensure that you are using the correct C/C++ compiler and linker combination and options for successful native library loading. If you are using the examples that ship with SWIG, then the Examples/Makefile must have these set up correctly for your system. The SWIG installation package makes a best attempt at getting these correct but does not get it right 100% of the time. The SWIG Wiki also has some settings for commonly used compiler and operating system combinations. The following section also contains some C++ specific linking problems and solutions.

    26.2.7 Compilation problems and compiling with C++

    On most machines, shared library files should be linked using the C++ compiler. For example:

    % swig -c++ -java example.i
    % g++ -c -fpic example.cxx
    % g++ -c -fpic example_wrap.cxx -I/usr/java/j2sdk1.4.1/include -I/usr/java/j2sdk1.4.1/include/linux
    % g++ -shared example.o example_wrap.o -o libexample.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    % swig -c++ -java example.i
    % CC -c example.cxx
    % CC -c example_wrap.cxx -I/usr/java/include -I/usr/java/include/solaris
    % CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o libexample.so -lCrun
    

    If you aren't entirely sure about the linking for C++, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your shared library. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    Finally make sure the version of JDK header files matches the version of Java that you are running as incompatibilities could lead to compilation problems or unpredictable behaviour.

    26.2.8 Building on Windows

    Building on Windows is roughly similar to the process used with Unix. You will want to produce a DLL that can be loaded by the Java Virtual Machine. This section covers the process of using SWIG with Microsoft Visual C++ 6 although the procedure may be similar with other compilers. In order for everything to work, you will need to have a JDK installed on your machine in order to read the JNI header files.

    26.2.8.1 Running SWIG from Visual Studio

    If you are developing your application within Microsoft Visual studio, SWIG can be invoked as a custom build option. The Examples\java directory has a few Windows Examples containing Visual Studio project (.dsp) files. The process to re-create the project files for a C project are roughly:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Don't worry if the wrapper file doesn't exist yet--Visual Studio will keep a reference to it.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -java -o $(ProjDir)\$(InputName)_wrap.c $(InputPath) " in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to C/C++ tab and select the Preprocessor category. Add the include directories to the JNI header files under "Additional include directories", eg "C:\jdk1.3\include, C:\jdk1.3\include\win32".
    • Next, select the settings for the entire project and go to Link tab and select the General category. Set the name of the output file to match the name of your Java module (ie. example.dll).
    • Next, select the example.c and example_wrap.c files and go to the C/C++ tab and select the Precompiled Headers tab in the project settings. Disabling precompiled headers for these files will overcome any precompiled header errors while building.
    • Finally, add the java compilation as a post build rule in the Post-build step tab in project settings, eg, "c:\jdk1.3\bin\javac *.java"
    • Build your project.

    Note: If using C++, choose a C++ suffix for the wrapper file, for example example_wrap.cxx. Use _wrap.cxx instead of _wrap.c in the instructions above and add -c++ when invoking swig.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. When doing a build, any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file.

    The Java classes that SWIG output should also be compiled into .class files. To run the native code in the DLL (example.dll), make sure that it is in your path then run your Java program which uses it, as described in the previous section. If the library fails to load have a look at Dynamic linking problems.

    26.2.8.2 Using NMAKE

    Alternatively, a Makefile for use by NMAKE can be written. Make sure the environment variables for MSVC++ are available and the MSVC++ tools are in your path. Now, just write a short Makefile like this :

    # Makefile for using SWIG and Java for C code
    
    SRCS          = example.c
    IFILE         = example
    INTERFACE     = $(IFILE).i
    WRAPFILE      = $(IFILE)_wrap.c
    
    # Location of the Visual C++ tools (32 bit assumed)
    
    TOOLS         = c:\msdev
    TARGET        = example.dll
    CC            = $(TOOLS)\bin\cl.exe
    LINK          = $(TOOLS)\bin\link.exe
    INCLUDE32     = -I$(TOOLS)\include
    MACHINE       = IX86
    
    # C Library needed to build a DLL
    
    DLLIBC        = msvcrt.lib oldnames.lib  
    
    # Windows libraries that are apparently needed
    WINLIB        = kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib
    
    # Libraries common to all DLLs
    LIBS          = $(DLLIBC) $(WINLIB) 
    
    # Linker options
    LOPT      = -debug:full -debugtype:cv /NODEFAULTLIB /RELEASE /NOLOGO \
                 /MACHINE:$(MACHINE) -entry:_DllMainCRTStartup@12 -dll
    
    # C compiler flags
    
    CFLAGS        = /Z7 /Od /c /nologo
    JAVA_INCLUDE    = -ID:\jdk1.3\include -ID:\jdk1.3\include\win32
    
    java::
            swig -java -o $(WRAPFILE) $(INTERFACE)
            $(CC) $(CFLAGS) $(JAVA_INCLUDE) $(SRCS) $(WRAPFILE)
            set LIB=$(TOOLS)\lib
            $(LINK) $(LOPT) -out:example.dll $(LIBS) example.obj example_wrap.obj
            javac *.java
    

    To build the DLL and compile the java code, run NMAKE (you may need to run vcvars32 first). This is a pretty simplistic Makefile, but hopefully its enough to get you started. Of course you may want to make changes for it to work for C++ by adding in the -c++ command line option for swig and replacing .c with .cxx.

    26.3 A tour of basic C/C++ wrapping

    By default, SWIG attempts to build a natural Java interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped as classes, variables are wrapped with JavaBean type getters and setters and so forth. This section briefly covers the essential aspects of this wrapping.

    26.3.1 Modules, packages and generated Java classes

    The SWIG %module directive specifies the name of the Java module. When you specify `%module example', the module name determines the name of some of the generated files in the module. The generated code consists of a module class file example.java , an intermediary JNI class file, exampleJNI.java as well as numerous other Java proxy class files. Each proxy class is named after the structs, unions and classes you are wrapping. You may also get a constants interface file if you are wrapping any unnamed enumerations or constants, for example exampleConstants.java. When choosing a module name, make sure you don't use the same name as one of the generated proxy class files nor a Java keyword. Sometimes a C/C++ type cannot be wrapped by a proxy class, for example a pointer to a primitive type. In these situations a type wrapper class is generated. Wrapping an enum generates an enum class, either a proper Java enum or a Java class that simulates the enums pattern. Details of all these generated classes will unfold as you read this section.

    The JNI (C/C++) code is generated into a file which also contains the module name, for example example_wrap.cxx or example_wrap.c. These C or C++ files complete the contents of the module.

    The generated Java classes can be placed into a Java package by using the -package commandline option. This is often combined with the -outdir to specify a package directory for generating the Java files.

    swig -java -package com.bloggs.swig -outdir com/bloggs/swig example.i
    

    SWIG won't create the directory, so make sure it exists beforehand.

    26.3.2 Functions

    There is no such thing as a global Java function so global C functions are wrapped as static methods in the module class. For example,

    %module example
    int fact(int n);
    
    

    creates a static function that works exactly like you think it might:

    public class example {
      public static int fact(int n) {
        // makes call using JNI to the C function
      }
    }
    

    The Java class example is the module class. The function can be used as follows from Java:

    System.out.println(example.fact(4));
    

    26.3.3 Global variables

    C/C++ global variables are fully supported by SWIG. Java does not allow the overriding of the dot operator so all variables are accessed through getters and setters. Again because there is no such thing as a Java global variable, access to C/C++ global variables is done through static getter and setter functions in the module class.

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern int My_variable;
    extern double density;
    %}
    ...
    

    Now in Java :

    // Print out value of a C global variable
    System.out.println("My_variable = " + example.getMy_variable());
    // Set the value of a C global variable
    example.setDensity(0.8442);
    

    The value returned by the getter will always be up to date even if the value is changed in C. Note that the getters and setters produced follow the JavaBean property design pattern. That is the first letter of the variable name is capitalized and preceded with set or get. If you have the misfortune of wrapping two variables that differ only in the capitalization of their first letters, use %rename to change one of the variable names. For example:

    %rename Clash RenamedClash;
    float Clash;
    int clash;
    

    If a variable is declared as const, it is wrapped as a read-only variable. That is only a getter is produced.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    26.3.4 Constants

    C/C++ constants are wrapped as Java static final variables. To create a constant, use #define or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    By default the generated static final variables are initialized by making a JNI call to get their value. The constants are generated into the constants interface and look like this:

    public interface exampleConstants {
      public final static double PI = exampleJNI.PI_get();
      public final static String VERSION = exampleJNI.VERSION_get();
      public final static int FOO = exampleJNI.FOO_get();
      public final static String path = exampleJNI.path_get();
    }
    

    Note that SWIG has inferred the C type and used an appropriate Java type that will fit the range of all possible values for the C type. By default SWIG generates runtime constants. They are not compiler constants that can, for example, be used in a switch statement. This can be changed by using the %javaconst(flag) directive. It works like all the other %feature directives. The default is %javaconst(0). It is possible to initialize all wrapped constants from pure Java code by placing a %javaconst(1) before SWIG parses the constants. Putting it at the top of your interface file would ensure this. Here is an example:

    %javaconst(1);
    %javaconst(0) BIG;
    %javaconst(0) LARGE;
    
    #define EXPRESSION (0x100+5)
    #define BIG 1000LL
    #define LARGE 2000ULL
    

    generates:

    public interface exampleConstants {
      public final static int EXPRESSION = (0x100+5);
      public final static long BIG = exampleJNI.BIG_get();
      public final static java.math.BigInteger LARGE = exampleJNI.LARGE_get();
    }
    

    Note that SWIG has inferred the C long long type from BIG and used an appropriate Java type (long) as a Java long is the smallest sized Java type that will take all possible values for a C long long. Similarly for LARGE.

    Be careful using the %javaconst(1) directive as not all C code will compile as Java code. For example neither the 1000LL value for BIG nor 2000ULL for LARGE above would generate valid Java code. The example demonstrates how you can target particular constants (BIG and LARGE) with %javaconst. SWIG doesn't use %javaconst(1) as the default as it tries to generate code that will always compile. However, using a %javaconst(1) at the top of your interface file is strongly recommended as the preferred compile time constants will be generated and most C constants will compile as Java code and in any case the odd constant that doesn't can be fixed using %javaconst(0).

    There is an alternative directive which can be used for these rare constant values that won't compile as Java code. This is the %javaconstvalue(value) directive, where value is a Java code replacement for the C constant and can be either a string or a number. This is useful if you do not want to use either the parsed C value nor a JNI call, such as when the C parsed value will not compile as Java code and a compile time constant is required. The same example demonstrates this:

    %javaconst(1);
    %javaconstvalue("new java.math.BigInteger(\"2000\")") LARGE;
    %javaconstvalue(1000) BIG;
    
    #define EXPRESSION (0x100+5)
    #define BIG 1000LL
    #define LARGE 2000ULL
    

    Note the string quotes for "2000" are escaped. The following is then generated:

    public interface exampleConstants {
      public final static int EXPRESSION = (0x100+5);
      public final static long BIG = 1000;
      public final static java.math.BigInteger LARGE = new java.math.BigInteger("2000");
    }
    

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using a getter as described in the previous section. They are not wrapped as constants. The exception to this rule are static const integral values defined within a class/struct, where they are wrapped as constants, eg:.

    struct Maths {
      static const int FIVE = 5;
    };
    

    Compatibility Note: In SWIG-1.3.19 and earlier releases, the constants were generated into the module class and the constants interface didn't exist. Backwards compatibility is maintained as the module class implements the constants interface (even though some consider this type of interface implementation to be bad practice):

    public class example implements exampleConstants {
    }
    

    You thus have the choice of accessing these constants from either the module class or the constants interface, for example, example.EXPRESSION or exampleConstants.EXPRESSION. Or if you decide this practice isn't so bad and your own class implements exampleConstants, you can of course just use EXPRESSION.

    26.3.5 Enumerations

    SWIG handles both named and unnamed (anonymous) enumerations. There is a choice of approaches to wrapping named C/C++ enums. This is due to historical reasons as SWIG's initial support for enums was limited and Java did not originally have support for enums. Each approach has advantages and disadvantages and it is important for the user to decide which is the most appropriate solution. There are four approaches of which the first is the default approach based on the so called Java typesafe enum pattern. The second generates proper Java enums. The final two approaches use simple integers for each enum item. Before looking at the various approaches for wrapping named C/C++ enums, anonymous enums are considered.

    26.3.5.1 Anonymous enums

    There is no name for anonymous enums and so they are handled like constants. For example:

    enum { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    is wrapped into the constants interface, in a similar manner as constants (see previous section):

    public interface exampleConstants {
      public final static int ALE = exampleJNI.ALE_get();
      public final static int LAGER = exampleJNI.LAGER_get();
      public final static int STOUT = exampleJNI.STOUT_get();
      public final static int PILSNER = exampleJNI.PILSNER_get();
      public final static int PILZ = exampleJNI.PILZ_get();
    }
    

    The %javaconst(flag) and %javaconstvalue(value) directive introduced in the previous section on constants can also be used with enums. As is the case for constants, the default is %javaconst(0) as not all C values will compile as Java code. However, it is strongly recommended to add in a %javaconst(1) directive at the top of your interface file as it is only on very rare occasions that this will produce code that won't compile under Java. Using %javaconst(1) will ensure compile time constants are generated, thereby allowing the enum values to be used in Java switch statements. Example usage:

    %javaconst(1);
    %javaconst(0) PILSNER;
    enum { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    generates:

    public interface exampleConstants {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = exampleJNI.PILSNER_get();
      public final static int PILZ = PILSNER;
    }
    

    As in the case of constants, you can access them through either the module class or the constants interface, for example, example.ALE or exampleConstants.ALE.

    26.3.5.2 Typesafe enums

    This is the default approach to wrapping named enums. The typesafe enum pattern is a relatively well known construct to work around the lack of enums in versions of Java prior to JDK 1.5. It basically defines a class for the enumeration and permits a limited number of final static instances of the class. Each instance equates to an enum item within the enumeration. The implementation is in the "enumtypesafe.swg" file. Let's look at an example:

    %include "enumtypesafe.swg" // optional as typesafe enums are the default
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", exampleJNI.LAGER_get());
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", exampleJNI.PILZ_get());
      [... additional support methods omitted for brevity ...]
    }
    

    See Typesafe enum classes to see the omitted support methods. Note that the enum item with an initializer (LAGER) is initialized with the enum value obtained via a JNI call. However, as with anonymous enums and constants, use of the %javaconst directive is strongly recommended to change this behaviour:

    %include "enumtypesafe.swg" // optional as typesafe enums are the default
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", 10);
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", PILSNER);
      [... additional support methods omitted for brevity ...]
    }
    

    The generated code is easier to read and more efficient as a true constant is used instead of a JNI call. As is the case for constants, the default is %javaconst(0) as not all C values will compile as Java code. However, it is recommended to add in a %javaconst(1) directive at the top of your interface file as it is only on very rare occasions that this will produce code that won't compile under Java. The %javaconstvalue(value) directive can also be used for typesafe enums. Note that global enums are generated into a Java class within whatever package you are using. C++ enums defined within a C++ class are generated into a static final inner Java class within the Java proxy class.

    Typesafe enums have their advantages over using plain integers in that they can be used in a typesafe manner. However, there are limitations. For example, they cannot be used in switch statements and serialization is an issue. Please look at the following references for further information: Replace Enums with Classes in Effective Java Programming on the Sun website, Create enumerated constants in Java JavaWorld article, Java Tip 133: More on typesafe enums and Java Tip 122: Beware of Java typesafe enumerations JavaWorld tips.

    Note that the syntax required for using typesafe enums is the same as that for proper Java enums. This is useful during the period that a project has to support legacy versions of Java. When upgrading to JDK 1.5 or later, proper Java enums could be used instead, without users having to change their code. The following section details proper Java enum generation.

    26.3.5.3 Proper Java enums

    Proper Java enums were only introduced in JDK 1.5 so this approach is only compatible with more recent versions of Java. Java enums have been designed to overcome all the limitations of both typesafe and type unsafe enums and should be the choice solution, provided older versions of Java do not have to be supported. In this approach, each named C/C++ enum is wrapped by a Java enum. Java enums, by default, do not support enums with initializers. Java enums are in many respects similar to Java classes in that they can be customised with additional methods. SWIG takes advantage of this feature to facilitate wrapping C/C++ enums that have initializers. In order to wrap all possible C/C++ enums using proper Java enums, the "enums.swg" file must be used. Let's take a look at an example.

    %include "enums.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public enum Beverage {
      ALE,
      LAGER(10),
      STOUT,
      PILSNER,
      PILZ(PILSNER);
      [... additional support methods omitted for brevity ...]
    }
    

    See Proper Java enum classes to see the omitted support methods. The generated Java enum has numerous additional methods to support enums with initializers, such as LAGER above. Note that as with the typesafe enum pattern, enum items with initializers are by default initialized with the enum value obtained via a JNI call. However, this is not the case above as we have used the recommended %javaconst(1) to avoid the JNI call. The %javaconstvalue(value) directive covered in the Constants section can also be used for proper Java enums.

    The additional support methods need not be generated if none of the enum items have initializers and this is covered later in the Simpler Java enums for enums without initializers section.

    26.3.5.4 Type unsafe enums

    In this approach each enum item in a named enumeration is wrapped as a static final integer in a class named after the C/C++ enum name. This is a commonly used pattern in Java to simulate C/C++ enums, but it is not typesafe. However, the main advantage over the typesafe enum pattern is enum items can be used in switch statements. In order to use this approach, the "enumtypeunsafe.swg" file must be used. Let's take a look at an example.

    %include "enumtypeunsafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = STOUT + 1;
      public final static int PILZ = PILSNER;
    }
    

    As is the case previously, the default is %javaconst(0) as not all C/C++ values will compile as Java code. However, again it is recommended to add in a %javaconst(1) directive. and the %javaconstvalue(value) directive covered in the Constants section can also be used for type unsafe enums. Note that global enums are generated into a Java class within whatever package you are using. C++ enums defined within a C++ class are generated into a static final inner Java class within the Java proxy class.

    Note that unlike typesafe enums, this approach requires users to mostly use different syntax compared with proper Java enums. Thus the upgrade path to proper enums provided in JDK 1.5 is more painful.

    26.3.5.5 Simple enums

    This approach is similar to the type unsafe approach. Each enum item is also wrapped as a static final integer. However, these integers are not generated into a class named after the C/C++ enum. Instead, global enums are generated into the constants interface. Also, enums defined in a C++ class have their enum items generated directly into the Java proxy class rather than an inner class within the Java proxy class. In fact, this approach is effectively wrapping the enums as if they were anonymous enums and the resulting code is as per anonymous enums. The implementation is in the "enumsimple.swg" file.

    Compatibility Note: SWIG-1.3.21 and earlier versions wrapped all enums using this approach. The type unsafe approach is preferable to this one and this simple approach is only included for backwards compatibility with these earlier versions of SWIG.

    26.3.6 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Java. For example:

    SWIGTYPE_p_FILE f = example.fopen("junk", "w");
    example.fputs("Hello World\n", f);
    example.fclose(f);
    

    C pointers in the Java module are stored in a Java long and cross the JNI boundary held within this 64 bit number. Many other SWIG language modules use an encoding of the pointer in a string. These scripting languages use the SWIG runtime type checker for dynamic type checking as they do not support static type checking by a compiler. In order to implement static type checking of pointers within Java, they are wrapped by a simple Java class. In the example above the FILE * pointer is wrapped with a type wrapper class called SWIGTYPE_p_FILE.

    Once obtained, a type wrapper object can be freely passed around to different C functions that expect to receive an object of that type. The only thing you can't do is dereference the pointer from Java. Of course, that isn't much of a concern in this example.

    As much as you might be inclined to modify a pointer value directly from Java, don't. The value is not necessarily the same as the logical memory address of the underlying object. The value will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Most JVMs are 32 bit applications so any JNI code must also be compiled as 32 bit. The net result is pointers in JNI code are also 32 bits and are stored in the high order 4 bytes on big-endian machines and in the low order 4 bytes on little-endian machines. By design it is also not possible to manually cast a pointer to a new type by using Java casts as it is particularly dangerous especially when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return a NULL pointer if the conversion can't be performed.

    26.3.7 Structures

    If you wrap a C structure, it is wrapped by a Java class with getters and setters for access to the member variables. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    Vector v = new Vector();
    v.setX(3.5);
    v.setY(7.2);
    double x = v.getX();
    double y = v.getY();
    

    The variable setters and getters are also based on the JavaBean design pattern already covered under the Global variables section. Similar access is provided for unions and the public data members of C++ classes.

    This object is actually an instance of a Java class that has been wrapped around a pointer to the C structure. This instance doesn't actually do anything--it just serves as a proxy. The pointer to the C object is held in the Java proxy class in much the same way as pointers are held by type wrapper classes. Further details about Java proxy classes are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Java, you will see behavior like this:

    Bar b = new Bar();
    SWIGTYPE_p_int x = b.getX();
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    Bar b = new Bar();
    SWIGTYPE_p_int x = b.getX();
    Bar c = new Bar();
    c.setX(x);                    // Copy contents of b.x to c.x
    

    For array assignment (setters not getters), SWIG copies the entire contents of the array starting with the data pointed to by b.x . In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation. The default wrapping makes it hard to set or get just one element of the array and so array access from Java is somewhat limited. This can be changed easily though by using the approach outlined later in the Wrapping C arrays with Java arrays and Unbounded C Arrays sections.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f member of Bar like this:

    Bar b = new Bar();
    Foo x = b.getF();
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    Bar b = new Bar();
    b.getF().setA(3);   // Modify b.f.a
    Foo x = b.getF();                   
    x.setA(3);          // Modify x.a - this is the same as b.f.a
    

    26.3.8 C++ classes

    C++ classes are wrapped by Java classes as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Java like this:

    List l = new List();
    l.insert("Ale");
    l.insert("Stout");
    l.insert("Lager");
    String item = l.get(2);
    int length = l.getLength();
    

    Class data members are accessed in the same manner as C structures.

    Static class members are unsurprisingly wrapped as static members of the Java class:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    The static members work like any other Java static member:

    Spam.foo();
    int bar = Spam.getBar();
    

    26.3.9 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    those classes are wrapped into a hierarchy of Java classes that reflect the same inheritance structure:

    Bar b = new Bar();
    Class c = b.getClass();
    System.out.println(c.getSuperclass().getName());
    

    will of course display:

    Foo
    

    Furthermore, if you have functions like this

    void spam(Foo *f);
    

    then the Java function spam() accepts instances of Foo or instances of any other proxy classes derived from Foo.

    Note that Java does not support multiple inheritance so any multiple inheritance in the C++ code is not going to work. A warning is given when multiple inheritance is detected and only the first base class is used.

    26.3.10 Pointers, references, arrays and pass by value

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In Java, there is no detailed distinction like this--specifically, there are only instances of classes. There are no pointers nor references. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this from Java:

    Foo f = new Foo();  // Create a Foo
    example.spam1(f);   // Ok. Pointer
    example.spam2(f);   // Ok. Reference
    example.spam3(f);   // Ok. Value.
    example.spam4(f);   // Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Java will release this memory when the returned object's finalizer is run by the garbage collector).

    26.3.10.1 Null pointers

    Working with null pointers is easy. A Java null can be used whenever a method expects a proxy class or typewrapper class. However, it is not possible to pass null to C/C++ functions that take parameters by value or by reference. If you try you will get a NullPointerException.

    example.spam1(null);   // Pointer - ok
    example.spam2(null);   // Reference - NullPointerException
    example.spam3(null);   // Value - NullPointerException
    example.spam4(null);   // Array - ok
    

    For spam1 and spam4 above the Java null gets translated into a NULL pointer for passing to the C/C++ function. The converse also occurs, that is, NULL pointers are translated into null Java objects when returned from a C/C++ function.

    26.3.11 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    %module example
    
    void foo(int);
    void foo(char *c);
    

    You can use them in Java in a straightforward manner:

    example.foo(3);           // foo(int)
    example.foo("Hello");     // foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Java code like this:

    Foo f = new Foo();        // Create a Foo
    Foo g = new Foo(f);       // Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG cannot disambiguate as there can be more than one C++ type mapping onto a single Java type. For example:

    void spam(int);
    void spam(unsigned short);
    

    Here both int and unsigned short map onto a Java int. Here is another example:

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 515: Overloaded method spam(unsigned short) ignored.
    Method spam(int) at example.i:11 used.
    

    To fix this, you either need to either rename or ignore one of the methods. For example:

    %rename(spam_ushort) spam(unsigned short);
    ...
    void spam(int);    
    void spam(unsigned short);   // Now renamed to spam_ushort
    

    or

    %ignore spam(unsigned short);
    ...
    void spam(int);    
    void spam(unsigned short);   // Ignored
    

    26.3.12 C++ default arguments

    Any function with a default argument is wrapped by generating an additional function for each argument that is defaulted. For example, if we have the following C++:

    %module example
    
    void defaults(double d=10.0, int i=0);
    

    The following methods are generated in the Java module class:

    public class example {
      public static void defaults(double d, int i) { ... }
      public static void defaults(double d) { ... }
      public static void defaults() { ... }
    }
    

    It is as if SWIG had parsed three separate overloaded methods. The same approach is taken for static methods, constructors and member methods.

    Compatibility note: Versions of SWIG prior to SWIG-1.3.23 wrapped these with a single wrapper method and so the default values could not be taken advantage of from Java. Further details on default arguments and how to restore this approach are given in the more general Default arguments section.

    26.3.13 C++ namespaces

    SWIG is aware of named C++ namespaces and they can be mapped to Java packages, however, the default wrapping flattens the namespaces, effectively ignoring them. So by default, the namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Java as follows:

    int f = example.fact(3);
    Vector v = new Vector();
    v.setX(3.4);
    double y = v.getY();
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and you want to keep their symbols separate, consider wrapping them as separate SWIG modules. Each SWIG module can be placed into a separate package.

    The default behaviour described above can be improved via the nspace feature. Note that it only works for classes, structs, unions and enums declared within a named C++ namespace. When the nspace feature is used, the C++ namespaces are converted into Java packages of the same name. Proxy classes are thus declared within a package and this proxy makes numerous calls to the JNI intermediary class which is declared in the unnamed package by default. As Java does not support types declared in a named package accessing types declared in an unnamed package, the -package commandline option described earlier generally should be used to provide a parent package. So if SWIG is run using the -package com.myco option, a wrapped class, MyWorld::Material::Color, can then be accessed as com.myco.MyWorld.Material.Color. If you don't specify a package, you will get the following warning:

    example.i:16: Warning 826: The nspace feature is used on 'MyWorld::Material::Color' without -package. The generated code 
    may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package.
    

    If it is undesirable to have a single top level package, the nspace feature may be used without the -package commandline option (and the resulting warning ignored) if all of the types exposed using SWIG are placed in a package using the nspace feature and the 'jniclasspackage' pragma is used to specify a package for the JNI intermediary class.

    If the resulting use of the nspace feature and hence packages results in a proxy class in one package deriving or using a proxy class from another package, you will need to open up the visibility for the pointer constructor and getCPtr method from the default 'protected' to 'public' with the SWIG_JAVABODY_PROXY macro. See Java code typemaps.

    26.3.14 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include <utility>
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Java:

    pairii p = new pairii(3, 4);
    int first = p.getFirst();
    int second = p.getSecond();
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter.

    26.3.15 C++ Smart Pointers

    26.3.15.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Java in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    26.3.15.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Java, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Java, everything should just "work":

    SmartPtrFoo p = example.CreateFoo(); // Create a smart-pointer somehow
    p.setX(3);                           // Foo::x
    int y = p.bar();                     // Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    Foo f = p.__deref__();               // Returns underlying Foo *
    

    26.4 Further details on the generated Java classes

    In the previous section, a high-level view of Java wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Java proxy classes and type wrapper classes are used in situations where no proxies are generated. This provides a very natural, type safe Java interface to the C/C++ code and fits in with the Java programming paradigm. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work and then covers the type wrapper classes. Finally enum classes are covered. First, the crucial intermediary JNI class is considered.

    26.4.1 The intermediary JNI class

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a global function and class like this

    class Foo {
    public:
      int x;
      int spam(int num, Foo* foo);
    };
    void egg(Foo* chips);
    

    then SWIG transforms the class into a set of low-level procedural wrappers. These procedural wrappers essentially perform the equivalent of this C++ code:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int num, Foo* foo) {
      return f->spam(num, foo);
    }
    

    These procedural function names don't actually exist, but their functionality appears inside the generated JNI functions. The JNI functions have to follow a particular naming convention so the function names are actually:

    SWIGEXPORT jlong JNICALL Java_exampleJNI_new_1Foo(JNIEnv *jenv, jclass jcls);
    SWIGEXPORT void JNICALL Java_exampleJNI_delete_1Foo(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1);
    SWIGEXPORT void JNICALL Java_exampleJNI_Foo_1x_1set(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1, jobject jarg1_, jint jarg2);
    SWIGEXPORT jint JNICALL Java_exampleJNI_Foo_1x_1get(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1, jobject jarg1_);
    SWIGEXPORT jint JNICALL Java_exampleJNI_Foo_1spam(JNIEnv *jenv, jclass jcls,
                                                      jlong jarg1, jobject jarg1_, jint jarg2,
                                                      jlong jarg3, jobject jarg3_);
    SWIGEXPORT void JNICALL Java_exampleJNI_egg(JNIEnv *jenv, jclass jcls,
                                                jlong jarg1, jobject jarg1_);
    

    For every JNI C function there has to be a static native Java function. These appear in the intermediary JNI class:

    class exampleJNI {
      public final static native long new_Foo();
      public final static native void delete_Foo(long jarg1);
      public final static native void Foo_x_set(long jarg1, Foo jarg1_, int jarg2);
      public final static native int Foo_x_get(long jarg1, Foo jarg1_);
      public final static native int Foo_spam(long jarg1, Foo jarg1_, int jarg2,
                                              long jarg3, Foo jarg3_);
      public final static native void egg(long jarg1, Foo jarg1_);
    }
    

    This class contains the complete Java - C/C++ interface so all function calls go via this class. As this class acts as a go-between for all JNI calls to C/C++ code from the Java proxy classes, type wrapper classes and module class, it is known as the intermediary JNI class.

    You may notice that SWIG uses a Java long wherever a pointer or class object needs to be marshalled across the Java-C/C++ boundary. This approach leads to minimal JNI code which makes for better performance as JNI code involves a lot of string manipulation. SWIG favours generating Java code over JNI code as Java code is compiled into byte code and avoids the costly string operations needed in JNI code. This approach has a downside though as the proxy class might get collected before the native method has completed. You might notice above that there is an additional parameters with a underscore postfix, eg jarg1_. These are added in order to prevent premature garbage collection when marshalling proxy classes.

    The functions in the intermediary JNI class cannot be accessed outside of its package. Access to them is gained through the module class for globals otherwise the appropriate proxy class.

    The name of the intermediary JNI class can be changed from its default, that is, the module name with JNI appended after it. The module directive attribute jniclassname is used to achieve this:

    %module (jniclassname="name") modulename
    

    If name is the same as modulename then the module class name gets changed from modulename to modulenameModule.

    26.4.1.1 The intermediary JNI class pragmas

    The intermediary JNI class can be tailored through the use of pragmas, but is not commonly done. The pragmas for this class are:

    PragmaDescription
    jniclassbaseBase class for the intermediary JNI class
    jniclasspackagePackage in which to place the intermediary JNI class
    jniclassclassmodifiersClass modifiers and class type for the intermediary JNI class
    jniclasscodeJava code is copied verbatim into the intermediary JNI class
    jniclassimportsJava code, usually one or more import statements, placed before the intermediary JNI class definition
    jniclassinterfacesComma separated interface classes for the intermediary JNI class

    The pragma code appears in the generated intermediary JNI class where you would expect:

    [ jniclassimports pragma ]
    [ jniclassclassmodifiers pragma ] jniclassname extends [ jniclassbase pragma ]
                                              implements [ jniclassinterfaces pragma ] {
    [ jniclasscode pragma ]
    ... SWIG generated native methods ...
    }
    

    The jniclasscode pragma is quite useful for adding in a static block for loading the shared library / dynamic link library and demonstrates how pragmas work:

    %pragma(java) jniclasscode=%{
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. \n" + e);
          System.exit(1);
        }
      }
    %}
    

    Pragmas will take either "" or %{ %} as delimiters. For example, let's change the intermediary JNI class access to just the default package-private access.

    %pragma(java) jniclassclassmodifiers="class"
    

    All the methods in the intermediary JNI class will then not be callable outside of the package as the method modifiers have been changed from public access to default access. This is useful if you want to prevent users calling these low level functions.

    26.4.2 The Java module class

    All global functions and variable getters/setters appear in the module class. For our example, there is just one function:

    public class example {
      public static void egg(Foo chips) {
        exampleJNI.egg(Foo.getCPtr(chips), chips);
      }
    }
    

    The module class is necessary as there is no such thing as a global in Java so all the C globals are put into this class. They are generated as static functions and so must be accessed as such by using the module name in the static function call:

    example.egg(new Foo());
    

    The primary reason for having the module class wrapping the calls in the intermediary JNI class is to implement static type checking. In this case only a Foo can be passed to the egg function, whereas any long can be passed to the egg function in the intermediary JNI class.

    26.4.2.1 The Java module class pragmas

    The module class can be tailored through the use of pragmas, in the same manner as the intermediary JNI class. The pragmas are similarly named and are used in the same way. The complete list follows:

    PragmaDescription
    modulebaseBase class for the module class
    moduleclassmodifiersClass modifiers and class type for the module class
    modulecodeJava code is copied verbatim into the module class
    moduleimportsJava code, usually one or more import statements, placed before the module class definition
    moduleinterfacesComma separated interface classes for the module class

    The pragma code appears in the generated module class like this:

    [ moduleimports pragma ]
    [ modulemodifiers pragma ] modulename extends [ modulebase pragma ]
                                          implements [ moduleinterfaces pragma ] {
    [ modulecode pragma ]
    ... SWIG generated wrapper functions ...
    }
    

    See The intermediary JNI class pragmas section for further details on using pragmas.

    26.4.3 Java proxy classes

    A Java proxy class is generated for each structure, union or C++ class that is wrapped. Proxy classes have also been called peer classes. The default proxy class for our previous example looks like this:

    public class Foo {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Foo(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Foo obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Foo(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      public void setX(int value) {
        exampleJNI.Foo_x_set(swigCPtr, this, value);
      }
    
      public int getX() {
        return exampleJNI.Foo_x_get(swigCPtr, this);
      }
    
      public int spam(int num, Foo foo) {
        return exampleJNI.Foo_spam(swigCPtr, this, num, Foo.getCPtr(foo), foo);
      }
    
      public Foo() {
        this(exampleJNI.new_Foo(), true);
      }
    
    }
    

    This class merely holds a pointer to the underlying C++ object ( swigCPtr). It also contains all the methods in the C++ class it is proxying plus getters and setters for public member variables. These functions call the native methods in the intermediary JNI class. The advantage of having this extra layer is the type safety that the proxy class functions offer. It adds static type checking which leads to fewer surprises at runtime. For example, you can see that if you attempt to use the spam() function it will only compile when the parameters passed are an int and a Foo. From a user's point of view, it makes the class work as if it were a Java class:

    Foo f = new Foo();
    f.setX(3);
    int y = f.spam(5, new Foo());
    

    26.4.3.1 Memory management

    Each proxy class has an ownership flag swigCMemOwn. The value of this flag determines who is responsible for deleting the underlying C++ object. If set to true, the proxy class's finalizer will destroy the C++ object when the proxy class is garbage collected. If set to false, then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Java automatically takes ownership of the result. On the other hand, when pointers or references are returned to Java, there is often no way to know where they came from. Therefore, the ownership is set to false. For example:

    class Foo {
    public:
      Foo();
      Foo bar1();
      Foo &bar2();
      Foo *bar2();
    };
    

    In Java:

    Foo f = new Foo();   //  f.swigCMemOwn = true
    Foo f1 = f.bar1();   // f1.swigCMemOwn = true
    Foo f2 = f.bar2();   // f2.swigCMemOwn = false
    Foo f3 = f.bar3();   // f3.swigCMemOwn = false
    

    This behavior for pointers and references is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Java to assume ownership and destroy it!

    For the most part, memory management issues remain hidden. However, there are situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Obj {};
    class Node {
      Obj *value;
    public:
      void set_value(Obj *v) { value = v; }
    };
    

    Now, consider the following Java code:

    Node n = new Node();    // Create a node
    {
      Obj o = new Obj();    // Create an object
      n.set_value(o);       // Set value
    }                       // o goes out of scope
    

    In this case, the Node n is holding a reference to o internally. However, SWIG has no way to know that this has occurred. The Java proxy class still thinks that it has ownership of o. As o has gone out of scope, it could be garbage collected in which case the C++ destructor will be invoked and n will then be holding a stale-pointer to o. If you're lucky, you will only get a segmentation fault.

    To work around this, the ownership flag of o needs changing to false. The ownership flag is a private member variable of the proxy class so this is not possible without some customization of the proxy class. This can be achieved by using a typemap to customise the proxy class with pure Java code as detailed later in the section on Java typemaps.

    Sometimes a function will create memory and return a pointer to a newly allocated object. SWIG has no way of knowing this so by default the proxy class does not manage the returned object. However, you can tell the proxy class to manage the memory if you specify the %newobject directive. Consider:

    class Obj {...};
    class Factory {
    public:
      static Obj *createObj() { return new Obj(); }
    };
    

    If we call the factory function, then we have to manually delete the memory:

    Obj obj = Factory.createObj();   // obj.swigCMemOwn = false
    ...
    obj.delete();
    

    Now add in the %newobject directive:

    %newobject Factory::createObj();
    
    class Obj {...};
    class Factory {
    public:
      static Obj *createObj() { return new Obj(); }
    };
    

    A call to delete() is no longer necessary as the garbage collector will make the C++ destructor call because swigCMemOwn is now true.

    Obj obj = Factory.createObj();   // obj.swigCMemOwn = true;
    ...
    

    Some memory management issues are quite tricky to fix and may only be noticeable after using for a long time. One such issue is premature garbage collection of an object created from Java and resultant usage from C++ code. The section on typemap examples cover two such scenarios, Memory management for objects passed to the C++ layer and Memory management when returning references to member variables

    26.4.3.2 Inheritance

    Java proxy classes will mirror C++ inheritance chains. For example, given the base class Base and its derived class Derived :

    class Base {
    public:
      virtual double foo();
    };
    
    class Derived : public Base {
    public:
      virtual double foo();
    };
    

    The base class is generated much like any other proxy class seen so far:

    public class Base {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Base(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Base obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Base(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      public double foo() {
        return exampleJNI.Base_foo(swigCPtr, this);
      }
    
      public Base() {
        this(exampleJNI.new_Base(), true);
      }
    
    }
    

    The Derived class extends Base mirroring the C++ class inheritance hierarchy.

    public class Derived extends Base {
      private transient long swigCPtr;
    
      protected Derived(long cPtr, boolean cMemoryOwn) {
        super(exampleJNI.SWIGDerivedUpcast(cPtr), cMemoryOwn);
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Derived obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Derived(swigCPtr);
        }
        swigCPtr = 0;
        super.delete();
      }
    
      public double foo() {
        return exampleJNI.Derived_foo(swigCPtr, this);
      }
    
      public Derived() {
        this(exampleJNI.new_Derived(), true);
      }
    
    }
    

    Note the memory ownership is controlled by the base class. However each class in the inheritance hierarchy has its own pointer value which is obtained during construction. The SWIGDerivedUpcast() call converts the pointer from a Derived * to a Base *. This is a necessity as C++ compilers are free to implement pointers in the inheritance hierarchy with different values.

    It is of course possible to extend Base using your own Java classes. If Derived is provided by the C++ code, you could for example add in a pure Java class Extended derived from Base. There is a caveat and that is any C++ code will not know about your pure Java class Extended so this type of derivation is restricted. However, true cross language polymorphism can be achieved using the directors feature.

    26.4.3.3 Proxy classes and garbage collection

    By default each proxy class has a delete() and a finalize() method. The finalize() method calls delete() which frees any malloc'd memory for wrapped C structs or calls the C++ class destructors. The idea is for delete() to be called when you have finished with the C/C++ object. Ideally you need not call delete(), but rather leave it to the garbage collector to call it from the finalizer. When a program exits, the garbage collector does not guarantee to call all finalizers. An insight into the reasoning behind this can be obtained from Hans Boehm's Destructors, Finalizers, and Synchronization paper. Depending on what the finalizers do and which operating system you use, this may or may not be a problem.

    If the delete() call into JNI code is just for memory handling, there is not a problem when run on most operating systems, for example Windows and Unix. Say your JNI code creates memory on the heap which your finalizers should clean up, the finalizers may or may not be called before the program exits. In Windows and Unix all memory that a process uses is returned to the system on exit, so this isn't a problem. This is not the case in some operating systems like vxWorks. If however, your finalizer calls into JNI code invoking the C++ destructor which in turn releases a TCP/IP socket for example, there is no guarantee that it will be released. Note that with long running programs the garbage collector will eventually run, thereby calling any unreferenced object's finalizers.

    Some not so ideal solutions are:

    1. Call the System.runFinalizersOnExit(true) or Runtime.getRuntime().runFinalizersOnExit(true) to ensure the finalizers are called before the program exits. The catch is that this is a deprecated function call as the documentation says:

      This method is inherently unsafe. It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock.

      In many cases you will be lucky and find that it works, but it is not to be advocated. Have a look at Java web site and search for runFinalizersOnExit.

    2. From jdk1.3 onwards a new function, addShutdownHook(), was introduced which is guaranteed to be called when your program exits. You can encourage the garbage collector to call the finalizers, for example, add this static block to the class that has the main() function:

        static {
          Runtime.getRuntime().addShutdownHook( 
            new Thread() {
              public void run() { System.gc(); System.runFinalization(); }
            }
          );
        }
      

      Although this usually works, the documentation doesn't guarantee that runFinalization() will actually call the finalizers. As the shutdown hook is guaranteed you could also make a JNI call to clean up any resources that are being tracked by the C/C++ code.

    3. Call the delete() function manually which will immediately invoke the C++ destructor. As a suggestion it may be a good idea to set the object to null so that should the object be inadvertently used again a Java null pointer exception is thrown, the alternative would crash the JVM by using a null C pointer. For example given a SWIG generated class A:

      A myA = new A();
      // use myA ...
      myA.delete();
      // any use of myA here would crash the JVM 
      myA=null;
      // any use of myA here would cause a Java null pointer exception to be thrown
      

      The SWIG generated code ensures that the memory is not deleted twice, in the event the finalizers get called in addition to the manual delete() call.

    4. Write your own object manager in Java. You could derive all SWIG classes from a single base class which could track which objects have had their finalizers run, then call the rest of them on program termination. The section on Java typemaps details how to specify a pure Java base class.

    See the How to Handle Java Finalization's Memory-Retention Issues article for alternative approaches to managing memory by avoiding finalizers altogether.

    26.4.3.4 The premature garbage collection prevention parameter for proxy class marshalling

    As covered earlier, the C/C++ struct/class pointer is stored in the proxy class as a Java long and when needed is passed into the native method where it is cast into the appropriate type. This approach provides very fast marshalling but could be susceptible to premature garbage collection. Consider the following C++ code:

    class Wibble {
    };
    void wobble(Wibble &w);
    

    The module class contains the Java wrapper for the global wobble method:

    public class example {
      ...
      public static void wobble(Wibble w) {
        exampleJNI.wobble(Wibble.getCPtr(w), w);
      }
    }
    

    where example is the name of the module. All native methods go through the intermediary class which has the native method declared as such:

    public class exampleJNI {
      ...
      public final static native void wobble(long jarg1, Wibble jarg1_);
    }
    

    The second parameter, jarg1_, is the premature garbage collection prevention parameter and is added to the native method parameter list whenever a C/C++ struct or class is marshalled as a Java long. In order to understand why, consider the alternative where the intermediary class method is declared without the additional parameter:

    public class exampleJNI {
      ...
      public final static native void wobble(long jarg1);
    }
    

    and the following simple call to wobble:

    {
      Wibble w = new Wibble();
      example.wobble(w);
    }
    

    The hotspot compiler effectively sees something like:

    {
      Wibble w = new Wibble();
      long w_ptr = Wibble.getCPtr(w);
      // w is no longer reachable
      exampleJNI.wobble(w_ptr);
    }
    

    The Wibble object is no longer reachable after the point shown as in this bit of code, the Wibble object is not referenced again after this point. This means that it is a candidate for garbage collection. Should wobble be a long running method, it is quite likely that the finalizer for the Wibble instance will be called. This in turn will call its underlying C++ destructor which is obviously disastrous while the method wobble is running using this object. Even if wobble is not a long running method, it is possible for the Wibble instance to be finalized. By passing the Wibble instance into the native method, it will not be finalized as the JVM guarantees not to finalize any objects until the native method returns. Effectively, the code then becomes

    {
      Wibble w = new Wibble();
      long w_ptr = Wibble.getCPtr(w);
      exampleJNI.wobble(w_ptr, w);
      // w is no longer reachable
    }
    

    and therefore there is no possibility of premature garbage collection. In practice, this premature garbage collection was only ever observed in Sun's server JVM from jdk-1.3 onwards and in Sun's client JVM from jdk-1.6 onwards.

    The premature garbage collection prevention parameter for proxy classes is generated by default whenever proxy classes are passed by value, reference or with a pointer. The implementation for this extra parameter generation requires the "jtype" typemap to contain long and the "jstype" typemap to contain the name of a proxy class.

    The additional parameter does impose a slight performance overhead and the parameter generation can be suppressed globally with the -nopgcpp commandline option. More selective suppression is possible with the 'nopgcpp' attribute in the "jtype" Java typemap. The attribute is a flag and so should be set to "1" to enable the suppression, or it can be omitted or set to "0" to disable. For example:

    %typemap(jtype, nopgcpp="1") Wibble & "long"
    

    Compatibility note: The generation of this additional parameter did not occur in versions prior to SWIG-1.3.30.

    26.4.3.5 Single threaded applications and thread safety

    Single threaded Java applications using JNI need to consider thread safety. The same applies for the C# module where the .NET wrappers use PInvoke. Consider the C++ class:

    class Test {
      string str;
    public:
      Test() : str("initial") {}
    };
    

    and the Java proxy class generated by SWIG:

    public class Test {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Test(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Test obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      // Call C++ destructor
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Test(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      // Call C++ constructor
      public Test() {
        this(exampleJNI.new_Test(), true);
      }
    
    }
    

    It has two methods that call JNI methods, namely, exampleJNI.new_Test() for the C++ constructor and exampleJNI.delete_Test() for the C++ destructor. If the garbage collector collects an instance of this class, ie delete() is not explicitly called, then the C++ destructor will be run in a different thread to the main thread. This is because when an object is marked for garbage collection, any objects with finalizers are added to a finalization queue and the objects in the finalization queue have their finalize() methods run in a separate finalization thread. Therefore, if the C memory allocator is not thread safe, then the heap will get corrupted sooner or later, when a concurrent C++ delete and new are executed. It is thus essential, even in single threaded usage, to link to the C multi-thread runtime libraries, for example, use the /MD option for Visual C++ on Windows. Alternatively, lock all access to C++ functions that have heap allocation/deallocation.

    Note that some of the STL in Visual C++ 6 is not thread safe, so although code might be linked to the multithread runtime libraries, undefined behaviour might still occur in a single threaded Java program. Similarly some older versions of Sun Studio have bugs in the multi-threaded implementation of the std::string class and so will lead to undefined behaviour in these supposedly single threaded Java applications.

    The following innocuous Java usage of Test is an example that will crash very quickly on a multiprocessor machine if the JNI compiled code is linked against the single thread C runtime libraries.

    for (int i=0; i<100000; i++) {
      System.out.println("Iteration " + i);
      for (int k=0; k<10; k++) {
        Test test = new Test();
      }
      System.gc();
    }
    

    26.4.4 Type wrapper classes

    The generated type wrapper class, for say an int *, looks like this:

    public class SWIGTYPE_p_int {
      private transient long swigCPtr;
    
      protected SWIGTYPE_p_int(long cPtr, boolean bFutureUse) {
        swigCPtr = cPtr;
      }
    
      protected SWIGTYPE_p_int() {
        swigCPtr = 0;
      }
    
      protected static long getCPtr(SWIGTYPE_p_int obj) {
        return obj.swigCPtr;
      }
    }
    

    The methods do not have public access, so by default it is impossible to do anything with objects of this class other than pass them around. The methods in the class are part of the inner workings of SWIG. If you need to mess around with pointers you will have to use some typemaps specific to the Java module to achieve this. The section on Java typemaps details how to modify the generated code.

    Note that if you use a pointer or reference to a proxy class in a function then no type wrapper class is generated because the proxy class can be used as the function parameter. If however, you need anything more complicated like a pointer to a pointer to a proxy class then a typewrapper class is generated for your use.

    Note that SWIG generates a type wrapper class and not a proxy class when it has not parsed the definition of a type that gets used. For example, say SWIG has not parsed the definition of class Snazzy because it is in a header file that you may have forgotten to use the %include directive on. Should SWIG parse Snazzy * being used in a function parameter, it will then generates a type wrapper class around a Snazzy pointer. Also recall from earlier that SWIG will use a pointer when a class is passed by value or by reference:

    void spam(Snazzy *x, Snazzy &y, Snazzy z);
    

    Should SWIG not know anything about Snazzy then a SWIGTYPE_p_Snazzy must be used for all 3 parameters in the spam function. The Java function generated is:

    public static void spam(SWIGTYPE_p_Snazzy x, SWIGTYPE_p_Snazzy y, SWIGTYPE_p_Snazzy z) {
     ...
    }
    

    Note that typedefs are tracked by SWIG and the typedef name is used to construct the type wrapper class name. For example, consider the case where Snazzy is a typedef to an int which SWIG does parse:

    typedef int Snazzy;
    void spam(Snazzy *x, Snazzy &y, Snazzy z);
    

    Because the typedefs have been tracked the Java function generated is:

    public static void spam(SWIGTYPE_p_int x, SWIGTYPE_p_int y, int z) { ... }
    

    26.4.5 Enum classes

    SWIG can generate three types of enum classes. The Enumerations section discussed these but omitted all the details. The following sub-sections detail the various types of enum classes that can be generated.

    26.4.5.1 Typesafe enum classes

    The following example demonstrates the typesafe enum classes which SWIG generates:

    %include "enumtypesafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    The following is the code that SWIG generates:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", 10);
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", PILSNER);
    
      public final int swigValue() {
        return swigValue;
      }
    
      public String toString() {
        return swigName;
      }
    
      public static Beverage swigToEnum(int swigValue) {
        if (swigValue < swigValues.length && swigValue >= 0 &&
            swigValues[swigValue].swigValue == swigValue)
          return swigValues[swigValue];
        for (int i = 0; i < swigValues.length; i++)
          if (swigValues[i].swigValue == swigValue)
            return swigValues[i];
        throw new IllegalArgumentException("No enum " + Beverage.class + " with value " +
                                                                             swigValue);
      }
    
      private Beverage(String swigName) {
        this.swigName = swigName;
        this.swigValue = swigNext++;
      }
    
      private Beverage(String swigName, int swigValue) {
        this.swigName = swigName;
        this.swigValue = swigValue;
        swigNext = swigValue+1;
      }
    
      private Beverage(String swigName, Beverage swigEnum) {
        this.swigName = swigName;
        this.swigValue = swigEnum.swigValue;
        swigNext = this.swigValue+1;
      }
    
      private static Beverage[] swigValues = { ALE, LAGER, STOUT, PILSNER, PILZ };
      private static int swigNext = 0;
      private final int swigValue;
      private final String swigName;
    }
    

    As can be seen, there are a fair number of support methods for the typesafe enum pattern. The typesafe enum pattern involves creating a fixed number of static instances of the enum class. The constructors are private to enforce this. Three constructors are available - two for C/C++ enums with an initializer and one for those without an initializer. Note that the two enums with initializers, LAGER and PILZ, each call one the two different initializer constructors. In order to use one of these typesafe enums, the swigToEnum static method must be called to return a reference to one of the static instances. The JNI layer returns the enum value from the C/C++ world as an integer and this method is used to find the appropriate Java enum static instance. The swigValue method is used for marshalling in the other direction. The toString method is overridden so that the enum name is available.

    26.4.5.2 Proper Java enum classes

    The following example demonstrates the Java enums approach:

    %include "enums.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    SWIG will generate the following Java enum:

    public enum Beverage {
      ALE,
      LAGER(10),
      STOUT,
      PILSNER,
      PILZ(PILSNER);
    
      public final int swigValue() {
        return swigValue;
      }
    
      public static Beverage swigToEnum(int swigValue) {
        Beverage[] swigValues = Beverage.class.getEnumConstants();
        if (swigValue < swigValues.length && swigValue >= 0 &&
            swigValues[swigValue].swigValue == swigValue)
          return swigValues[swigValue];
        for (Beverage swigEnum : swigValues)
          if (swigEnum.swigValue == swigValue)
            return swigEnum;
        throw new IllegalArgumentException("No enum " + Beverage.class +
                                           " with value " + swigValue);
      }
    
      private Beverage() {
        this.swigValue = SwigNext.next++;
      }
    
      private Beverage(int swigValue) {
        this.swigValue = swigValue;
        SwigNext.next = swigValue+1;
      }
    
      private Beverage(Beverage swigEnum) {
        this.swigValue = swigEnum.swigValue;
        SwigNext.next = this.swigValue+1;
      }
    
      private final int swigValue;
    
      private static class SwigNext {
        private static int next = 0;
      }
    }
    

    The enum items appear first. Like the typesafe enum pattern, the constructors are private. The constructors are required to handle C/C++ enums with initializers. The next variable is in the SwigNext inner class rather than in the enum class as static primitive variables cannot be modified from within enum constructors. Marshalling between Java enums and the C/C++ enum integer value is handled via the swigToEnum and swigValue methods. All the constructors and methods in the Java enum are required just to handle C/C++ enums with initializers. These needn't be generated if the enum being wrapped does not have any initializers and the Simpler Java enums for enums without initializers section describes how typemaps can be used to achieve this.

    26.4.5.3 Type unsafe enum classes

    The following example demonstrates type unsafe enums:

    %include "enumtypeunsafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    SWIG will generate the following simple class:

    public final class Beverage {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = STOUT + 1;
      public final static int PILZ = PILSNER;
    }
    

    26.4.6 Interfaces

    By default SWIG wraps all C++ classes as Java classes. As Java only supports derivation from a single base class, SWIG has to ignore all bases except the first when a C++ class inherits from more than one base class. However, there is a family of SWIG macros that change the default wrapping and allows a C++ class to be wrapped as a Java interface instead of a Java class. These macros provide a way to support some sort of multiple inheritance as there is no limit to the number of interfaces that a Java class can inherit from.

    When a C++ class is wrapped as a Java interface, a Java proxy class is still needed. The swiginterface.i library file provides three macros for marking a C++ class to be wrapped as a Java interface. There is more than one macro in order to provide a choice for choosing the Java interface and Java proxy names.

    Interface Macro NameDescription
    %interface(CTYPE)For C++ class CTYPE, proxy class name is unchanged without any suffix added, interface name has SwigInterface added as a suffix.
    %interface_impl(CTYPE)For C++ class CTYPE , proxy class name has SwigImpl added as a suffix, interface name has no added suffix.
    %interface_custom("PROXY", "INTERFACE", CTYPE) For C++ class CTYPE, proxy class name is given by the string PROXY, interface name is given by the string INTERFACE. The PROXY and INTERFACE names can use the string formatting functions used in %rename.

    The table below has a few examples showing the resulting proxy and interface names for a C++ class called Base.

    Example UsageProxy Class Name Interface Class Name
    %interface(Base)Base BaseSwigInterface
    %interface_impl(Base)BaseSwigImpl Base
    %interface_custom("BaseProxy", "IBase", Base) BaseProxyIBase
    %interface_custom("%sProxy", "IBase", Base) BaseProxyIBase
    %interface_custom("%sProxy", "%sInterface", Base) BaseProxyBaseProxyInterface
    %interface_custom("%sProxy", "%(rstrip:[Proxy])sInterface", Base)BaseProxyBaseInterface

    The 2nd last example shows the names used in the string formatting functions. The input for PROXY that "%s" expands to is the proxy name, that is, Base. The input for INTERFACE that "%s" expands to is the proxy name, that is, BaseProxy .

    The last example shows rstrip and in this case strips the Proxy suffix and then adds on Interface.

    Consider the following C++ code:

    namespace Space {
      struct Base1 {
        virtual void Method1();
      };
      struct Base2 {
        virtual void Method2();
      };
      struct Derived : Base1, Base2 {
      };
      void UseBases(const Base1 &b1, const Base2 &b2);
    }
    

    By default all classes are wrapped and are available in Java, but, Derived has all bases ignored except the first. SWIG generates a warning for the above code:

    example.i:10: Warning 813: Warning for Derived, base Base2 ignored. 
    Multiple inheritance is not supported in Java.
    

    If we decide to wrap the two base classes as interfaces and add the following before SWIG parses the above example code:

    %include <swiginterface.i>
    %interface_impl(Space::Base1);
    %interface_impl(Space::Base2);
    

    then two interface files are generated, Base1.java and Base2.java in addition to proxy class files, Base1SwigImpl.java and Base2SwigImpl.java. The contents of interface file Base1.java for Base1 is shown below:

    public interface Base1 {
      long Base1_GetInterfaceCPtr();
      void Method1();
    }
    

    The proxy class in Base1SwigImpl.java for Base1 is as it would have been if %interface was not used, except the name has changed to Base1SwigImpl and it implements the appropriate base:

    public class Base1SwigImpl implements Base1 {
    ...
      public long Base1_GetInterfaceCPtr() {
        return exampleJNI.Base1SwigImpl_Base1_GetInterfaceCPtr(swigCPtr);
      }
    
      public void Method1() {
        exampleJNI.Base1SwigImpl_Method1(swigCPtr, this);
      }
    ...
    }
    

    In fact any class deriving from Base will now implement the interface instead of deriving from it (or ignoring the base in the case of multiple base classes). Hence the Derived proxy class will now implement both bases:

    public class Derived implements Base1, Base2 {
    ...
      public long Base1_GetInterfaceCPtr() {
        return exampleJNI.Derived_Base1_GetInterfaceCPtr(swigCPtr);
      }
    
      public long Base2_GetInterfaceCPtr() {
        return exampleJNI.Derived_Base2_GetInterfaceCPtr(swigCPtr);
      }
    
      public void Method1() {
        exampleJNI.Derived_Method1(swigCPtr, this);
      }
    
      public void Method2() {
        exampleJNI.Derived_Method2(swigCPtr, this);
      }
    ...
    }
    

    Wherever a class marked as an interface is used, such as the UseBases method in the example, the interface name is used as the type in the Java layer:

      public static void UseBases(Base1 b1, Base2 b2) {
        exampleJNI.UseBases(b1.Base1_GetInterfaceCPtr(), b1, b2.Base2_GetInterfaceCPtr(), b2);
      }
    

    Note that each Java interface has a method added to obtain the correct C++ pointer for passing to the native function - Base1_GetInterfaceCPtr for Base1. This method is similar to the getCPtr method in the proxy classes. In fact, as shown above in the Derived class, the proxy classes implement this generated interface by calling a native method ( Derived_Base1_GetInterfaceCPtr) which calls an appropriate C++ cast of the pointer up the inheritance chain.

    The interface macros are implemented using the interface feature and typemaps. For example:

    %define %interface(CTYPE...)
    %feature("interface", name="%sSwigInterface") CTYPE;
    INTERFACE_TYPEMAPS(CTYPE)
    %enddef
    

    The feature accepts one attribute called name, which is the name of the Java interface mentioned earlier. The INTERFACE_TYPEMAPS macro implements the typemaps and can be viewed in the swiginterface.i file and contain the usual Java typemaps for generating code plus the javainterfacecode typemap which is only used when a class is marked with the interface feature. See Java code typemaps for details.

    26.5 Cross language polymorphism using directors

    Proxy classes provide a natural, object-oriented way to wrap C++ classes. as described earlier, each proxy instance has an associated C++ instance, and method calls from Java to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Java. In particular, if a C++ class has been extended in Java (by deriving from the proxy class), these classes will not be visible from C++ code. Virtual method calls from C++ are thus not able to access the lowest implementation in the inheritance chain.

    SWIG can address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Java implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Java and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Java code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions transparently takes care of all the cross-language method routing.

    26.5.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    26.5.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Java proxy classes. The director classes store a pointer to their underlying Java proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in Java via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its Java derived classes were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy JNI glue code that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Java. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Java, the Java API is used to call the method of the underlying Java object (after which the usual virtual method resolution in Java automatically finds the right implementation).

    26.5.3 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from Java types can result in large director methods. For this reason it is recommended that directors are selectively enabled only for specific classes that are likely to be extended in Java and used in C++.

    Although directors make it natural to mix native C++ objects with Java objects (as director objects), one should be aware of the obvious fact that method calls to Java objects from C++ will be much slower than calls to C++ objects. Additionally, compared to classes that do not use directors, the call routing in the director methods adds a small overhead. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Java.

    26.5.4 Simple directors example

    Consider the following SWIG interface file:

    %module(directors="1") example;
    
    %feature("director") DirectorBase;
    
    class DirectorBase {
    public:
      virtual ~DirectorBase() {}
      virtual void upcall_method() {}
    };
    
    void callup(DirectorBase *director) {
      director->upcall_method();
    }
    

    The following DirectorDerived Java class is derived from the Java proxy class DirectorBase and overrides upcall_method(). When C++ code invokes upcall_method() , the SWIG-generated C++ code redirects the call via JNI to the Java DirectorDerived subclass. Naturally, the SWIG generated C++ code and the generated Java intermediary class marshal and convert arguments between C++ and Java when needed.

    class DirectorDerived extends DirectorBase {
      @Override
      public void upcall_method() {
        System.out.println("DirectorDerived.upcall_method() invoked.");
      }
    }
    

    Running the following Java code

    DirectorDerived director = new DirectorDerived();
    example.callup(director);
    

    will result in the following being output:

    DirectorDerived.upcall_method() invoked.
    

    26.5.5 Director threading issues

    Depending on your operating system and version of Java and how you are using threads, you might find the JVM hangs on exit. There are a couple of solutions to try out. The preferred solution requires jdk-1.4 and later and uses AttachCurrentThreadAsDaemon instead of AttachCurrentThread whenever a call into the JVM is required. This can be enabled by defining the SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON macro when compiling the C++ wrapper code. For older JVMs define SWIG_JAVA_NO_DETACH_CURRENT_THREAD instead, to avoid the DetachCurrentThread call but this will result in a memory leak instead. For further details inspect the source code in the java/director.swg library file.

    Macros can be defined on the commandline when compiling your C++ code, or alternatively added to the C++ wrapper file as shown below:

    %insert("runtime") %{
    #define SWIG_JAVA_NO_DETACH_CURRENT_THREAD
    %}
    

    26.5.6 Director performance tuning

    When a new instance of a director (or subclass) is created in Java, the C++ side of the director performs a runtime check per director method to determine if that particular method is overridden in Java or if it should invoke the C++ base implementation directly. Although this makes initialization slightly more expensive, it is generally a good overall tradeoff.

    However, if all director methods are expected to usually be overridden by Java subclasses, then initialization can be made faster by avoiding these checks via the assumeoverride attribute. For example:

    %feature("director", assumeoverride=1) Foo;
    

    The disadvantage is that invocation of director methods from C++ when Java doesn't actually override the method will require an additional call up into Java and back to C++. As such, this option is only useful when overrides are extremely common and instantiation is frequent enough that its performance is critical.

    26.5.7 Java exceptions from directors

    With directors routing method calls to Java, and proxies routing them to C++, the handling of exceptions is an important concern. The default behavior for Java exceptions thrown in a director method overridden in Java is to store the thrown Java exception into a SWIG defined Swig::DirectorException C++ class exception in the C++ layer and then throw this C++ exception.

    Of course, should this exception be thrown, your C++ code must catch it and handle it before returning back to Java. The default generated code does not attempt to handle the C++ exception, but there is a simple way to make this all work by catching the C++ exception and extracting the original Java exception by using %catches for Swig::DirectorException. Consider the example shown earlier with a modification to the upcall_method Java method to throw a Java exception:

    class DirectorDerived extends DirectorBase {
      @Override
      public void upcall_method() {
        System.out.println("DirectorDerived.upcall_method() invoked.");
        throw new RuntimeException("There was a problem!");
      }
    }
    

    Now, by default, the JVM will abort when example.callup(director) is called as the C++ Swig::DirectorException (storing the Java exception) is thrown and not handled by the callup method. Needless to say this is not very user friendly and so the recommendation is to add the following simple %catches directive before SWIG parses the callup function:

    %catches(Swig::DirectorException) callup;
    

    Or target all wrapped methods using:

    %catches(Swig::DirectorException);
    

    This tells SWIG to generate a C++ catch handler using some code from the throws typemap for Swig::DirectorException that SWIG supplies by default, see Exception handling with %catches. This typemap code is written to simply catch the C++ Swig::DirectorException class and immediately return to Java throwing the original Java exception that it has stored. The net result is a stack trace containing the original Java exception including the location that the exception was thrown from.

    DirectorDerived.upcall_method() invoked.
    Exception in thread "main" java.lang.RuntimeException: There was a problem!
        at DirectorDerived.upcall_method(runme.java:4)
        at exampleJNI.SwigDirector_DirectorBase_upcall_method(exampleJNI.java:20)
        at exampleJNI.callup(Native Method)
        at example.callup(example.java:12)
        at runme.main(runme.java:21)
    

    More on the Swig::DirectorException class can be found in the next section which details how to customize the handling of director exceptions.

    26.5.7.1 Customizing director exceptions

    This section is for advanced customization of director exceptions. The recommendation for most users is to use the simple %catches directive described above as it should be sufficient for most users needs.

    The conversion of Java exceptions into C++ exceptions can be customized in two different ways using the director:except feature. In the first approach, a code block is attached to each director method to handle the mapping of Java exceptions into C++ exceptions. The code block is generated just after the call up from the C++ director method into the overloaded method in Java. Its primary function is to check if a Java exception has been thrown and then handle it in C++. The example below converts a java.lang.IndexOutOfBoundsException into a C++ std::out_of_range exception and converts a user's Java MyJavaException into a C++ MyCppException exception. If the Java exception doesn't match either of these, a fallback std::runtime_error C++ exception is thrown.

    %feature("director:except") MyClass::dirmethod(int x) {
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException"))
          throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
        if (Swig::ExceptionMatches(jenv, $error, "$packagepath/MyJavaException"))
          throw MyCppException(Swig::JavaExceptionMessage(jenv, $error).message());
        throw std::runtime_error("Unexpected exception thrown in MyClass::dirmethod");
      }
    }
    
    class MyClass {
    public:
      /** Throws either a std::out_of_range or MyCppException on error */
      virtual void dirmethod(int x);
      virtual ~MyClass();
    };
    

    A few special variables are expanded within the director:except feature.

    • The special variable $error is expanded into a unique variable name (swigerror) and should be used for the assignment of the jthrowable exception that occurred.
    • The special variable $packagepath is replaced by the outer package provided for SWIG generation by the -package option.
    • The special variable $directorthrowshandlers is not shown above, but is replaced by applicable "directorthrows" typemap contents (covered later in this section).
    • The special variable $null is not shown above, but is replaced by a suitable default constructed object for returning from the director method (or nothing if the director method has a void return).

    Utility functions/classes in director.swg are provided to aid the exception conversion as follows:

    namespace Swig {
    
      // Helper method to determine if a Java throwable matches a particular Java class type
      // Note side effect of clearing any pending exceptions
      bool ExceptionMatches(JNIEnv *jenv, jthrowable throwable, const char *classname);
    
      // Helper class to extract the exception message from a Java throwable
      class JavaExceptionMessage {
      public:
        JavaExceptionMessage(JNIEnv *jenv, jthrowable throwable);
    
        // Return a C string of the exception message in the jthrowable passed in the constructor
        // If no message is available, null_string is return instead
        const char *message(const char *null_string = 
                            "Could not get exception message in JavaExceptionMessage") const;
      };
    
      // C++ Exception class for handling Java exceptions thrown during a director method Java upcall
      class DirectorException : public std::exception {
      public:
    
        // Construct exception from a Java throwable
        DirectorException(JNIEnv *jenv, jthrowable throwable);
    
        // More general constructor for handling as a java.lang.RuntimeException
        DirectorException(const char *msg);
    
        // Return exception message extracted from the Java throwable
        const char *what() const throw();
    
        // Reconstruct and raise/throw the Java Exception that caused the DirectorException
        // Note that any error in the JNI exception handling results in a Java RuntimeException
        void throwException(JNIEnv *jenv) const;
    
        // Create and throw the DirectorException
        static void raise(JNIEnv *jenv, jthrowable throwable) {
          throw DirectorException(jenv, throwable);
        }
      };
    
    }
    

    The utility function Swig::ExceptionMatches and class Swig::JavaExceptionMessage are provided to simplify writing code for wrappers that use the director:except feature. The function Swig::ExceptionMatches matches the type of the jthrowable thrown against a fully qualified JNI style class name, such as "java/lang/IOError". If the throwable class is the same type, or derives from the given type, Swig::ExceptionMatches will return true. Care must be taken to provide the correct fully qualified name, since for wrapped exceptions the generated proxy class will have an additional package qualification, depending on the '-package' argument and use of the nspace feature. The utility class Swig::JavaExceptionMessage is a holder providing access to the message from the thrown Java exception. The message() method returns the exception message as a const char *, which is only valid during the lifetime of the holder. Any code using this message needs to copy it, for example into a std::string or a newly constructed C++ exception.

    Using the first approach above to write handlers for a large number of methods will require repetitive duplication of the director:except feature code for each director method. To mitigate this, a second approach is provided via typemaps in a fashion analogous to the "throws" typemap. The "throws" typemap provides a way to map all the C++ exceptions listed in a method's defined exceptions (either from a C++ exception specification or a %catches feature) into Java exceptions. The "directorthrows" typemap provides the inverse mapping and should contain code to convert a suitably matching Java exception into a C++ exception. Only use this typemap if you wish to write custom conversions of Java exceptions into C++ exceptions and apply them to many different methods. The default handling which uses the Swig::DirectorException class should otherwise meet your needs.

    The example below converts a Java java.lang.IndexOutOfBoundsException exception to the typemap's type, that is a std::out_of_range C++ exception:

    %typemap(directorthrows) std::out_of_range %{
      if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    

    The "directorthrows" typemap is then used in conjunction with the director:except feature if the $directorthrowshandlers special variable is used in the code block. Consider the following, which also happens to be the default:

    %feature("director:except") %{
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        $directorthrowshandlers
        Swig::DirectorException::raise(jenv, $error);
      }
    %}
    

    where Swig::DirectorException::raise is the helper method to throw a C++ Swig::DirectorException, see above. The code generated from the director:except feature has the $directorthrowshandlers special variable replaced with the code in the relevant "directorthrows" typemaps, for each and every exception defined for the method. The relevant exceptions can be defined either with a C++ exception specification or %catches as described for the "throws" typemap.

    Let's try and put all this together by considering the following director method:

    struct X {
      virtual void doSomething(int index) throw (std::out_of_range);
      ...
    };
    
    OR
    
    %catches(std::out_of_range) X::doSomething;
    struct X {
      virtual void doSomething(int index);
      ...
    };
    

    When combined with the default director:except feature and the "directorthrows" typemap above, the resulting code generated in the director method after calling up to Java will be:

    jthrowable swigerror = jenv->ExceptionOccurred();
    if (swigerror) {
      if (Swig::ExceptionMatches(jenv, swigerror, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, swigerror).message());
      }
      Swig::DirectorException::raise(jenv, swigerror);
    }
    

    Note: Beware of using exception specifications as the SWIG director methods will be generated with the same exception specifications and if the director method throws an exception that is not specified in the exception specifications list it is likely to terminate your program. See the C++ standard for more details. Using the %catches feature instead to define the handled exceptions does not suffer this potential fate.

    Because the default code generation maps any unhandled Java exceptions to Swig::DirectorException, any director methods that have exception specifications may cause program termination as this exception class won't be in the exception specifications list. You can avoid throwing Swig::DirectorException by changing the default handling for all methods by adding a director:except feature without any method name. For example, you can just ignore them:

    %feature("director:except") %{
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        $directorthrowshandlers
        jenv->ExceptionClear();
        return $null; // exception is ignored
      }
    %}
    

    Alternatively an exception compatible with the existing director method exception specifications can be thrown. Assuming that all methods allow std::runtime_error to be thrown, the return $null line above could be changed to:

      throw std::runtime_error(Swig::JavaExceptionMessage(jenv, $error).message());
    

    In more complex situations, a separate director:except feature may need to be attached to specific methods by providing a method name to the director:except feature.

    This is all no doubt quite hard to follow without seeing a full example and some code. Below is a complete example demonstrating the use of most of the exception customizations one can use, that is, "directorthrows" and "throws" typemaps, %exception and %catches. See the Exception handling with %exception and %javaexception section for more on converting C++ exceptions to Java exceptions. The example also has a user defined C++ exception class called MyNS::MyException and this is wrapped as a Java exception. The director class being wrapped is MyClass and the director method is called MyClass::dirmethod. A number of std::cout calls have been added to help understand code flow. You can copy the code below into an interface file and run SWIG on it and examine the generated code.

    %module(directors="1") example
    
    %{
      #include <stdexcept>
      #include <iostream>
    %}
    
    // Generic catch handler for all wrapped methods
    %exception %{
      try {
        $action
      } catch (const std::exception &e) {
        std::cout << "Generic std::exception catch handler" << std::endl;
        jclass clazz = jenv->FindClass("java/lang/RuntimeException");
        jenv->ThrowNew(clazz, e.what()); 
        return $null;
      }
    %}
    
    // Expose C++ exception as a Java Exception by changing the Java base class and providing a getMessage()
    %typemap(javabase) MyNS::MyException "java.lang.RuntimeException";
    %rename(getMessage) MyNS::MyException::whatsup;
    
    %inline %{
    namespace MyNS {
      class MyException {
        std::string msg;
      public:
        MyException(const char *msg) : msg(msg) {}
        const char * whatsup() const { return msg.c_str(); }
      };
    }
    %}
    
    %typemap(directorthrows) MyNS::MyException %{
      if (Swig::ExceptionMatches(jenv, $error, "$packagepath/MyException")) {
        std::cout << "$1_type exception matched (directorthrows typemap)" << std::endl;
        throw $1_type(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    
    %typemap(throws) MyNS::MyException %{
      std::cout << "$1_type caught (throws typemap)" << std::endl;
      jclass excep = jenv->FindClass("MyException");
      if (excep) {
        std::cout << "$1_type class found (throws typemap)" << std::endl;
        jenv->ThrowNew(excep, $1.whatsup());
      }
      return $null;
    %}
    
    // These are the exceptions that the director method MyClass::dirmethod will have catch handlers for.
    // Note that this is also a virtual method / director method and the C++ exceptions listed can be
    // thrown after converting them from Java exceptions.
    %catches(MyNS::MyException, Swig::DirectorException) MyClass::dirmethod;
    
    // These are the exceptions that call_dirmethod C++ wrapper will have catch handlers for.
    // Note that this is not a virtual method, hence not a director method.
    %catches(MyNS::MyException, Swig::DirectorException) call_dirmethod;
    
    %feature("director") MyClass;
    
    %feature("director:except") MyClass::dirmethod(int x) {
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        std::cout << "Upcall finished, an exception was thrown in Java" << std::endl;
        $directorthrowshandlers
        std::cout << "Upcall finished, no exception conversion, throwing DirectorException" << std::endl;
        Swig::DirectorException::raise(jenv, $error);
      }
    }
    
    %inline %{
    class MyClass {
    public:
      /** Throws either a std::out_of_range or MyException on error */
      virtual void dirmethod(int x) {
        if (x <= 0)
          throw std::out_of_range("MyClass::dirmethod index is out of range");
        else if (x == 1)
          throw MyNS::MyException("MyClass::dirmethod some problem!");
      }
      virtual ~MyClass() {}
      static void call_dirmethod(MyClass& c, int x) {
        return c.dirmethod(x);
      }
    };
    %}
    

    The generated code for the call_dirmethod wrapper contains the various exception handlers. The outer exception handler is from the %exception directive and the others are from the "throws" typemaps.

    SWIGEXPORT void JNICALL Java_exampleJNI_MyClass_1call_1dirmethod(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2) {
      ...
      try {
        try {
          MyClass::call_dirmethod(*arg1,arg2);
        } catch(MyNS::MyException &_e) {
          std::cout << "MyNS::MyException caught (throws typemap)" << std::endl;
          jclass excep = jenv->FindClass("MyException");
          if (excep) {
            std::cout << "MyNS::MyException class found (throws typemap)" << std::endl;
            jenv->ThrowNew(excep, (&_e)->whatsup());
          }
          return ;
          
        } catch(Swig::DirectorException &_e) {
          (&_e)->throwException(jenv);
          return ; 
        }
      } catch (const std::exception &e) {
        std::cout << "Generic std::exception catch handler" << std::endl;
        jclass clazz = jenv->FindClass("java/lang/RuntimeException");
        jenv->ThrowNew(clazz, e.what()); 
        return ;
      }
    

    The director method calling up to Java contains the exception handling code from the "directorthrows" typemaps and director:except feature.

    void SwigDirector_MyClass::dirmethod(int x) {
          ... [call up to Java using CallStaticVoidMethod]
          jthrowable swigerror = jenv->ExceptionOccurred();
          if (swigerror) {
            std::cout << "Upcall finished, an exception was thrown in Java" << std::endl;
            
            if (Swig::ExceptionMatches(jenv, swigerror, "MyException")) {
              std::cout << "MyNS::MyException exception matched (directorthrows typemap)" << std::endl;
              throw MyNS::MyException(Swig::JavaExceptionMessage(jenv, swigerror).message());
            }
            
            std::cout << "Upcall finished, no exception conversion, throwing DirectorException" << std::endl;
            Swig::DirectorException::raise(jenv, swigerror);
          }
    

    Let's use the following Java class to override the director method.

    class DerivedClass extends MyClass {
      @Override
      public void dirmethod(int x) {
        if (x < 0)
          throw new IndexOutOfBoundsException("Index is negative");
        else if (x == 0)
          throw new MyException("MyException: bad dirmethod");
      }
    }
    public class runme {
      public static void main(String argv[]) {
        System.loadLibrary("example");
        ... code snippets shown below ...
      }
    }
    

    Consider the output using the Java code in the four slightly different scenarios below.

    1. Non-director C++ class is used, thus, no upcall to a Java director method is made. A std::out_of_range exception is thrown, which is derived from std::exception, and hence caught by the generic exception handler in the call_dirmethod wrapper. The Java code snippet and resulting output is:

    MyClass.call_dirmethod(new MyClass(), 0);
    
    Generic std::exception catch handler
    Exception in thread "main" java.lang.RuntimeException: MyClass::dirmethod index is out of range
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:14)
    

    2. Non-director C++ class again but this time the MyNS::MyException class is thrown and caught:

    MyClass.call_dirmethod(new MyClass(), 1);
    
    MyNS::MyException caught (throws typemap)
    MyNS::MyException class found (throws typemap)
    Exception in thread "main" MyException: MyClass::dirmethod some problem!
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:15)
    

    3. The DerivedClass director class is used so the upcall to Java occurs, but it throws a Java MyException, which gets converted into a C++ MyNS::MyException, then caught and converted back into a Java MyException:

    MyClass.call_dirmethod(new DerivedClass(), 0);
    
    Upcall finished, an exception was thrown in Java
    MyNS::MyException exception matched (directorthrows typemap)
    MyNS::MyException caught (throws typemap)
    MyNS::MyException class found (throws typemap)
    Exception in thread "main" MyException: MyException: bad dirmethod
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:16)
    

    4. The director class is used again, but this time the director method throws a Java IndexOutOfBoundsException exception which is converted into a C++ Swig::DirectorException, thrown and caught again. This time the original Java exception is extracted from the Swig::DirectorException and rethrown. Note that this approach keeps the stack trace information of the original exception, so it has the exact location of where the IndexOutOfBoundsException exception was thrown. This is arguably an improvement over the approach above that converts from a Java excepton to C++ exception and then back to a new Java exception, losing the location of the original exception.

    MyClass.call_dirmethod(new DerivedClass(), -1);
    
    Upcall finished, an exception was thrown in Java
    Upcall finished, no exception conversion, throwing DirectorException
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index is negative
            at DerivedClass.dirmethod(runme.java:5)
            at exampleJNI.SwigDirector_MyClass_dirmethod(exampleJNI.java:23)
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:17)
    

    26.6 Accessing protected members

    When using directors, the protected virtual methods are also wrapped. These methods are wrapped with a protected Java proxy method, so the only way that Java code can access these is from within a Java class derived from the director class.

    Members which are protected and non-virtual can also be accessed when using the 'allprotected' mode. The allprotected mode requires directors and is turned on by setting the allprotected option in addition to the directors option in the %module directive, like this:

    %module(directors="1", allprotected="1") modulename
    

    Protected member variables and methods (both static and non-static) will then be wrapped with protected access in the Java proxy class.

    Note: Neither the directors option nor the allprotected mode support types defined with protected scope. This includes any enums or typedefs declared in the protected section of the C++ class.

    The following simple example is a class with numerous protected members, including the constructor and destructor:

    %module(directors="1", allprotected="1") example
    
    %feature("director") ProtectedBase;
    
    // Ignore use of unsupported types (those defined in the protected section)
    %ignore ProtectedBase::typedefs;
    
    %inline %{
    
    class ProtectedBase {
    protected:
      ProtectedBase() {}
      virtual ~ProtectedBase() {}
      virtual void virtualMethod() const {}
      void nonStaticMethod(double d) const {}
      static void staticMethod(int i) {}
      int instanceMemberVariable;
      static int staticMemberVariable;
    
      // unsupported: types defined with protected access and the methods/variables which use them
      typedef int IntegerType;
      IntegerType typedefs(IntegerType it) { return it; }
    };
    int ProtectedBase::staticMemberVariable = 10;
    
    %}
    
    

    Note that the IntegerType has protected scope and the members which use this type must be ignored as they cannot be wrapped.

    The proxy methods are protected, so the only way the protected members can be accessed is within a class that derives from the director class, such as the following:

    class MyProtectedBase extends ProtectedBase
    {
      public MyProtectedBase() {
      }
    
      public void accessProtected() {
        virtualMethod();
        nonStaticMethod(1.2);
        staticMethod(99);
    
        setInstanceMemberVariable(5);
        int i = getInstanceMemberVariable();
    
        setStaticMemberVariable(10);
        i = getStaticMemberVariable();
      }
    }
    

    26.7 Common customization features

    An earlier section presented the absolute basics of C/C++ wrapping. If you do nothing but feed SWIG a header file, you will get an interface that mimics the behavior described. However, sometimes this isn't enough to produce a nice module. Certain types of functionality might be missing or the interface to certain functions might be awkward. This section describes some common SWIG features that are used to improve the interface to existing C/C++ code.

    26.7.1 C/C++ helper functions

    Sometimes when you create a module, it is missing certain bits of functionality. For example, if you had a function like this

    typedef struct Image {...};
    void set_transform(Image *im, double m[4][4]);
    

    it would be accessible from Java, but there may be no easy way to call it. The problem here is that a type wrapper class is generated for the two dimensional array parameter so there is no easy way to construct and manipulate a suitable double [4][4] value. To fix this, you can write some extra C helper functions. Just use the %inline directive. For example:

    %inline %{
    /* Note: double[4][4] is equivalent to a pointer to an array double (*)[4] */
    double (*new_mat44())[4] {
      return (double (*)[4]) malloc(16*sizeof(double));
    }
    void free_mat44(double (*x)[4]) {
      free(x);
    }
    void mat44_set(double x[4][4], int i, int j, double v) {
      x[i][j] = v;
    }
    double mat44_get(double x[4][4], int i, int j) {
      return x[i][j];
    }
    %}
    

    From Java, you could then write code like this:

    Image im = new Image();
    SWIGTYPE_p_a_4__double a = example.new_mat44();
    example.mat44_set(a, 0, 0, 1.0);
    example.mat44_set(a, 1, 1, 1.0);
    example.mat44_set(a, 2, 2, 1.0);
    ...
    example.set_transform(im, a);
    example.free_mat44(a);
    

    Admittedly, this is not the most elegant looking approach. However, it works and it wasn't too hard to implement. It is possible to improve on this using Java code, typemaps, and other customization features as covered in later sections, but sometimes helper functions are a quick and easy solution to difficult cases.

    26.7.2 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods or constructors. Here is a simple example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    struct Vector {
      double x, y, z;
    };
    
    %extend Vector {
      char *toString() {
        static char tmp[1024];
        sprintf(tmp, "Vector(%g, %g, %g)", $self->x, $self->y, $self->z);
        return tmp;
      }
      Vector(double x, double y, double z) {
        Vector *v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
    };
    

    Now, in Java

    Vector v = new Vector(2, 3, 4);
    System.out.println(v);
    

    will display

    Vector(2, 3, 4)
    

    %extend works with both C and C++ code. It does not modify the underlying object in any way---the extensions only show up in the Java interface.

    26.7.3 Class extension with %proxycode

    The previous section described how to extend a wrapped class with C or C++ code. This section describes how to extend a wrapped class with Java code instead of C/C++ code. The %proxycode directive is used and is just a macro for %insert("proxycode"). The Code insertion block section describes the %insert directive. The section of code for insertion is "proxycode", that is, the Java proxy class. This directive must hence only be used within the scope of a class, otherwise it is silently ignored. There are two common ways to get the scope correct.

    The first is to use %proxycode inside a class that SWIG parses, for example a toString() method can be added to a C++ class using pure Java code. A C++ header file can mix C++ and Java code inside the C++ class as follows:

    // flag.h header file
    class Flag {
      bool flag;
    public:
      Flag(bool flag) : flag(flag) {}
      bool FetchFlag() { return flag; }
    #if defined(SWIG)
    %proxycode %{
      public String toString() {
        boolean flag = FetchFlag();
        return Boolean.toString(flag);
      }
    %}
    #endif
    };
    

    and wrapped using:

    %{
    #include "flag.h"
    %}
    %include "flag.h"
    

    The second is to use %proxycode within %extend as everything within a %extend block is effectively within the scope of the class, for example:

    // flag.h header file
    class Flag {
      bool flag;
    public:
      Flag(bool flag) : flag(flag) {}
      bool FetchFlag() { return flag; }
    };
    

    and wrapped using:

    %{
    #include "flag.h"
    %}
    %include "flag.h"
    
    %extend Flag {
    #if defined(SWIG)
    %proxycode %{
      public String toString() {
        boolean flag = FetchFlag();
        return Boolean.toString(flag);
      }
    %}
    #endif
    }
    

    There is some very limited support of typemaps within a %proxycode block. A useful trick is to obtain the Java type for a given C/C++ type using the $typemap special macro. The following C++ template demonstrates this:

    %inline %{
    template<typename T> struct Value {
      T value;
      Value(const T& val) : value(val) {}
    };
    %}
    
    %extend Value {
    %proxycode %{
      public String toString() {
        // Note template type expansion is supported, so T is expanded to 'unsigned int' in this example
        // and $typemap(jstype, unsigned int) in turn is expanded to 'long'
        $typemap(jstype, T) val = getValue();
        return "$javaclassname value: " + val + " Java type: $typemap(jstype, T) JNI type: $typemap(jni, T)";
      }
    %}
    }
    %template(ValueUnsignedInt) Value<unsigned int>;
    

    The generated Java contains the expanded special variable and macro resulting in Java proxy code:

    public class ValueUnsignedInt {
      ...
      public String toString() {
        long val = getValue();
        return "ValueUnsignedInt value: " + val + " Java type: long JNI type: jlong";
      }
    
    }
    

    26.7.4 Exception handling with %exception and %javaexception

    If a C or C++ function throws an error, you may want to convert that error into a Java exception. To do this, you can use the %exception directive. The %exception directive simply lets you rewrite part of the generated wrapper code to include an error check. It is detailed in full in the Exception handling with %exception section.

    In C, a function often indicates an error by returning a status code (a negative number or a NULL pointer perhaps). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (!result) {
        jclass clazz = (*jenv)->FindClass(jenv, "java/lang/OutOfMemoryError");
        (*jenv)->ThrowNew(jenv, clazz, "Not enough memory");
        return $null;
      }
    }
    void *malloc(size_t nbytes);
    

    In Java,

    SWIGTYPE_p_void a = example.malloc(2000000000);
    

    will produce a familiar looking Java exception:

    Exception in thread "main" java.lang.OutOfMemoryError: Not enough memory
            at exampleJNI.malloc(Native Method)
            at example.malloc(example.java:16)
            at runme.main(runme.java:112)
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception malloc {
      $action
      if (err_occurred()) {
        jclass clazz = (*jenv)->FindClass(jenv, "java/lang/OutOfMemoryError");
        (*jenv)->ThrowNew(jenv, clazz, "Not enough memory");
        return $null;
      }
    }
    void *malloc(size_t nbytes);
    

    If no declaration name is given to %exception, it is applied to all wrapper functions. The $action is a SWIG special variable and is replaced by the C/C++ function call being wrapped. The return $null; handles all native method return types, namely those that have a void return and those that do not. This is useful for typemaps that will be used in native method returning all return types. See the section on Java special variables for further explanation.

    C++ exceptions are also easy to handle. We can catch the C++ exception and rethrow it as a Java exception like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        jclass clazz = jenv->FindClass("java/lang/Exception");
        jenv->ThrowNew(clazz, "Range error");
        return $null;
      }
    }
    
    class FooClass {
      public:
        FooClass *getitem(int index);      // Might throw std::out_of_range exception
        ...
    };
    

    In the example above, java.lang.Exception is a checked exception class and so ought to be declared in the throws clause of getitem. Classes can be specified for adding to the throws clause using %javaexception(classes) instead of %exception, where classes is a string containing one or more comma separated Java classes. The %clearjavaexception feature is the equivalent to %clearexception and clears previously declared exception handlers. The %nojavaexception feature is the equivalent to %noexception and disables the exception handler. See Clearing features for the difference on disabling and clearing features.

    %javaexception("java.lang.Exception") getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        jclass clazz = jenv->FindClass("java/lang/Exception");
        jenv->ThrowNew(clazz, "Range error");
        return $null;
      }
    }
    
    class FooClass {
    public:
      FooClass *getitem(int index);      // Might throw std::out_of_range exception
      ...
    };
    

    The generated proxy method now generates a throws clause containing java.lang.Exception:

    public class FooClass {
      ...
      public FooClass getitem(int index) throws java.lang.Exception { ... }
      ...
    }
    

    The examples above first use the C JNI calling syntax then the C++ JNI calling syntax. The C++ calling syntax will not compile as C and also vice versa. It is however possible to write JNI calls which will compile under both C and C++ and is covered in the Typemaps for both C and C++ compilation section.

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter. The typemap example Handling C++ exception specifications as Java exceptions provides further exception handling capabilities.

    26.7.5 Method access with %javamethodmodifiers

    A Java feature called %javamethodmodifiers can be used to change the method modifiers from the default public. It applies to both module class methods and proxy class methods. For example:

    %javamethodmodifiers protect_me() "protected";
    void protect_me();
    

    Will produce the method in the module class with protected access.

    protected static void protect_me() {
      exampleJNI.protect_me();
    }
    

    26.8 Tips and techniques

    Although SWIG is largely automatic, there are certain types of wrapping problems that require additional user input. Examples include dealing with output parameters, strings and arrays. This chapter discusses the common techniques for solving these problems.

    26.8.1 Input and output parameters using primitive pointers and references

    A common problem in some C programs is handling parameters passed as simple pointers or references. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x-*y;
    }
    

    The typemaps.i library file will help in these situations. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Java, this allows you to pass simple values. For example:

    int result = example.sub(7, 4);
    System.out.println("7 - 4 = " + result);
    int[] sum = {0};
    example.add(3, 4, sum);
    System.out.println("3 + 4 = " + sum[0]);
    

    Which will display:

    7 - 4 = 3
    3 + 4 = 7
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter will return the result in the first element of the integer array.

    If you don't want to use the names INPUT or OUTPUT , use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Java, the input parameter is the first element in a 1 element array and is replaced by the output of the function. For example:

    int[] neg = {3};
    example.negate(neg);
    System.out.println("Negative of 3 = " + neg[0]);
    

    And no prizes for guessing the output:

    Negative of 3 = -3
    

    These typemaps can also be applied to C++ references. The above examples would work the same if they had been defined using references instead of pointers. For example, the Java code to use the negate function would be the same if it were defined either as it is above:

    void negate(int *INOUT);
    

    or using a reference:

    void negate(int &INOUT);
    

    Note: Since most Java primitive types are immutable and are passed by value, it is not possible to perform in-place modification of a type passed as a parameter.

    Be aware that the primary purpose of the typemaps.i file is to support primitive datatypes. Writing a function like this

    void foo(Bar *OUTPUT);
    

    will not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    26.8.2 Simple pointers

    If you must work with simple pointers such as int * or double * another approach to using typemaps.i is to use the cpointer.i pointer library file. For example:

    %module example
    %include "cpointer.i"
    
    %inline %{
    extern void add(int x, int y, int *result);
    %}
    
    %pointer_functions(int, intp);
    

    The %pointer_functions(type, name) macro generates five helper functions that can be used to create, destroy, copy, assign, and dereference a pointer. In this case, the functions are as follows:

    int  *new_intp();
    int  *copy_intp(int *x);
    void  delete_intp(int *x);
    void  intp_assign(int *x, int value);
    int   intp_value(int *x);
    

    In Java, you would use the functions like this:

    SWIGTYPE_p_int intPtr = example.new_intp();
    example.add(3, 4, intPtr);
    int result = example.intp_value(intPtr);
    System.out.println("3 + 4 = " + result);
    

    If you replace %pointer_functions(int, intp) by %pointer_class(int, intp), the interface is more class-like.

    intp intPtr = new intp();
    example.add(3, 4, intPtr.cast());
    int result = intPtr.value();
    System.out.println("3 + 4 = " + result);
    

    See the SWIG Library chapter for further details.

    26.8.3 Wrapping C arrays with Java arrays

    SWIG can wrap arrays in a more natural Java manner than the default by using the arrays_java.i library file. Let's consider an example:

    %include "arrays_java.i";
    int array[4];
    void populate(int x[]) {
      int i;
      for (i=0; i<4; i++)
        x[i] = 100 + i;
    }
    

    These one dimensional arrays can then be used as if they were Java arrays:

    int[] array = new int[4];
    example.populate(array);
    
    System.out.print("array: ");
    for (int i=0; i<array.length; i++)
      System.out.print(array[i] + " ");
    
    example.setArray(array);
    
    int[] global_array = example.getArray();
    
    System.out.print("\nglobal_array: ");
    for (int i=0; i<array.length; i++)
      System.out.print(global_array[i] + " ");
    

    Java arrays are always passed by reference, so any changes a function makes to the array will be seen by the calling function. Here is the output after running this code:

    array: 100 101 102 103
    global_array: 100 101 102 103
    

    Note that for assigning array variables the length of the C variable is used, so it is possible to use a Java array that is bigger than the C code will cope with. Only the number of elements in the C array will be used. However, if the Java array is not large enough then you are likely to get a segmentation fault or access violation, just like you would in C. When arrays are used in functions like populate, the size of the C array passed to the function is determined by the size of the Java array.

    Please be aware that the typemaps in this library are not efficient as all the elements are copied from the Java array to a C array whenever the array is passed to and from JNI code. There is an alternative approach using the SWIG array library and this is covered in the next section.

    26.8.4 Unbounded C Arrays

    Sometimes a C function expects an array to be passed as a pointer. For example,

    int sumitems(int *first, int nitems) {
      int i, sum = 0;
      for (i = 0; i < nitems; i++) {
        sum += first[i];
      }
      return sum;
    }
    

    One of the ways to wrap this is to apply the Java array typemaps that come in the arrays_java.i library file:

    %include "arrays_java.i"
    %apply int[] {int *};
    

    The ANY size will ensure the typemap is applied to arrays of all sizes. You could narrow the typemap matching rules by specifying a particular array size. Now you can use a pure Java array and pass it to the C code:

    int[] array = new int[10000000];          // Array of 10-million integers
    for (int i=0; i<array.length; i++) {      // Set some values
      array[i] = i;
    }
    int sum = example.sumitems(array, 10000);
    System.out.println("Sum = " + sum);
    

    and the sum would be displayed:

    Sum = 49995000
    

    This approach is probably the most natural way to use arrays. However, it suffers from performance problems when using large arrays as a lot of copying of the elements occurs in transferring the array from the Java world to the C++ world. An alternative approach to using Java arrays for C arrays is to use an alternative SWIG library file carrays.i. This approach can be more efficient for large arrays as the array is accessed one element at a time. For example:

    %include "carrays.i"
    %array_functions(int, intArray);
    

    The %array_functions(type, name) macro generates four helper functions that can be used to create and destroy arrays and operate on elements. In this case, the functions are as follows:

    int *new_intArray(int nelements);
    void delete_intArray(int *x);
    int intArray_getitem(int *x, int index);
    void intArray_setitem(int *x, int index, int value);
    

    In Java, you would use the functions like this:

    SWIGTYPE_p_int array = example.new_intArray(10000000);  // Array of 10-million integers
    for (int i=0; i<10000; i++) {                           // Set some values
      example.intArray_setitem(array, i, i);
    }
    int sum = example.sumitems(array, 10000);
    System.out.println("Sum = " + sum);
    

    If you replace %array_functions(int, intp) by %array_class(int, intp), the interface is more class-like and a couple more helper functions are available for casting between the array and the type wrapper class.

    %include "carrays.i"
    %array_class(int, intArray);
    

    The %array_class(type, name) macro creates wrappers for an unbounded array object that can be passed around as a simple pointer like int * or double *. For instance, you will be able to do this in Java:

    intArray array = new intArray(10000000);  // Array of 10-million integers
    for (int i=0; i<10000; i++) {             // Set some values
      array.setitem(i, i);
    }
    int sum = example.sumitems(array.cast(), 10000);
    System.out.println("Sum = " + sum);
    

    The array "object" created by %array_class() does not encapsulate pointers inside a special array object. In fact, there is no bounds checking or safety of any kind (just like in C). Because of this, the arrays created by this library are extremely low-level indeed. You can't iterate over them nor can you even query their length. In fact, any valid memory address can be accessed if you want (negative indices, indices beyond the end of the array, etc.). Needless to say, this approach is not going to suit all applications. On the other hand, this low-level approach is extremely efficient and well suited for applications in which you need to create buffers, package binary data, etc.

    26.8.5 Binary data vs Strings

    By default SWIG handles char * as a string but there is a handy multi-argument typemap available as mentioned in Passing binary data. The following simple example demonstrates using a byte array instead of passing the default string type and length to the wrapped function.

    %apply (char *STRING, size_t LENGTH) { (const char data[], size_t len) }
    %inline %{
    void binaryChar1(const char data[], size_t len) {
      printf("len: %d data: ", len);
      for (size_t i=0; i<len; ++i)
        printf("%x ", data[i]);
      printf("\n");
    }
    %}
    

    Calling from Java requires just the byte array to be passed in as the multi-argument typemap being applied reduces the number of arguments in the target language to one, from the original two:

    byte[] data = "hi\0jk".getBytes();
    example.binaryChar1(data);     
    

    resulting in the output

    $ java runme
    len: 5 data: 68 69 0 6a 6b
    

    26.8.6 Overriding new and delete to allocate from Java heap

    Unlike some languages supported by SWIG, Java has a true garbage collection subsystem. Other languages will free SWIG wrapped objects when their reference count reaches zero. Java only schedules these objects for finalization, which may not occur for some time. Because SWIG objects are allocated on the C heap, Java users may find the JVM memory use quickly exceeds the assigned limits, as memory fills with unfinalized proxy objects. Forcing garbage collection is clearly an undesirable solution.

    An elegant fix for C++ users is to override new and delete using the following code (here shown included in a SWIG interface file)

    /* File: java_heap.i */
    %module test
    %{
    #include <stdexcept>
    #include "jni.h"
    
    /**
     *  A stash area embedded in each allocation to hold java handles
     */
    struct Jalloc {
      jbyteArray jba;
      jobject ref;
    };
    
    static JavaVM *cached_jvm = 0;
    
    JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
      cached_jvm = jvm;
      return JNI_VERSION_1_2;
    }
    
    static JNIEnv * JNU_GetEnv() {
      JNIEnv *env;
      jint rc = cached_jvm->GetEnv((void **)&env, JNI_VERSION_1_2);
      if (rc == JNI_EDETACHED)
        throw std::runtime_error("current thread not attached");
      if (rc == JNI_EVERSION)
        throw std::runtime_error("jni version not supported");
      return env;
    }
    
    void * operator new(size_t t) {
      if (cached_jvm != 0) {
        JNIEnv *env = JNU_GetEnv();
        jbyteArray jba = env->NewByteArray((int) t + sizeof(Jalloc));
        if (env->ExceptionOccurred())
          throw bad_alloc();
        void *jbuffer = static_cast<void *>(env->GetByteArrayElements(jba, 0));
        if (env->ExceptionOccurred())
          throw bad_alloc();
        Jalloc *pJalloc = static_cast<Jalloc *>(jbuffer);
        pJalloc->jba = jba;
        /* Assign a global reference so byte array will persist until delete'ed */
        pJalloc->ref = env->NewGlobalRef(jba);
        if (env->ExceptionOccurred())
          throw bad_alloc();
        return static_cast<void *>(static_cast<char *>(jbuffer) + sizeof(Jalloc));
      }
      else { /* JNI_OnLoad not called, use malloc and mark as special */
        Jalloc *pJalloc = static_cast<Jalloc *>(malloc((int) t + sizeof(Jalloc)));
        if (!pJalloc)
          throw bad_alloc();
        pJalloc->ref = 0;
        return static_cast<void *>(
          static_cast<char *>(static_cast<void *>(pJalloc)) + sizeof(Jalloc));
      }
    }
    
    void operator delete(void *v) {
      if (v != 0) {
        void *buffer = static_cast<void *>( static_cast<char *>(v) - sizeof(Jalloc));
        Jalloc *pJalloc = static_cast<Jalloc *>(buffer);
        if (pJalloc->ref) {
          JNIEnv *env = JNU_GetEnv();
          env->DeleteGlobalRef(pJalloc->ref);
          env->ReleaseByteArrayElements(pJalloc->jba, static_cast<jbyte *>(buffer), 0);
        }
        else {
          free(buffer);
        }
      }
    }
    %}
    ...
    

    This code caches the Java environment during initialization, and when new is called, a Java ByteArray is allocated to provide the SWIG objects with space in the Java heap. This has the combined effect of re-asserting the Java virtual machine's limit on memory allocation, and puts additional pressure on the garbage collection system to run more frequently. This code is made slightly more complicated because allowances must be made if new is called before the JNI_OnLoad is executed. This can happen during static class initialization, for example.

    Unfortunately, because most Java implementations call malloc and free, this solution will not work for C wrapped structures. However, you are free to make functions that allocate and free memory from the Java heap using this model and use these functions in place of malloc and free in your own code.

    26.9 Java typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. You are advised to be familiar with the material in the " Typemaps" chapter. While not absolutely essential knowledge, this section assumes some familiarity with the Java Native Interface (JNI). JNI documentation can be consulted either online at the Java web site or from a good JNI book. The following two books are recommended:

    • Title: 'Essential JNI: Java Native Interface.' Author: Rob Gordon. Publisher: Prentice Hall. ISBN: 0-13-679895-0.
    • Title: 'The Java Native Interface: Programmer's Guide and Specification.' Author: Sheng Liang. Publisher: Addison-Wesley. ISBN: 0-201-32577-2. Also available online at the Sun Developer Network.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the generated code.

    26.9.1 Default primitive type mappings

    The following table lists the default type mapping from Java to C/C++.

    C/C++ typeJava typeJNI type
    bool
    const bool &
    booleanjboolean
    char
    const char &
    charjchar
    signed char
    const signed char &
    bytejbyte
    unsigned char
    const unsigned char &
    shortjshort
    short
    const short &
    shortjshort
    unsigned short
    const unsigned short &
    intjint
    int
    const int &
    intjint
    unsigned int
    const unsigned int &
    longjlong
    long
    const long &
    intjint
    unsigned long
    const unsigned long &
    longjlong
    long long
    const long long &
    longjlong
    unsigned long long
    const unsigned long long &
    java.math.BigInteger jobject
    float
    const float &
    floatjfloat
    double
    const double &
    doublejdouble
    char *
    char []
    Stringjstring

    Note that SWIG wraps the C char type as a character. Pointers and arrays of this type are wrapped as strings. The signed char type can be used if you want to treat char as a signed number rather than a character. Also note that all const references to primitive types are treated as if they are passed by value.

    Given the following C function:

    void func(unsigned short a, char *b, const long &c, unsigned long long d);
    

    The module class method would be:

    public static void func(int a, String b, int c, java.math.BigInteger d) {...}
    

    The intermediary JNI class would use the same types:

    public final static native void func(int jarg1, String jarg2, int jarg3,
                                         java.math.BigInteger jarg4);
    

    and the JNI function would look like this:

    SWIGEXPORT void JNICALL Java_exampleJNI_func(JNIEnv *jenv, jclass jcls,
                    jint jarg1, jstring jarg2, jint jarg3, jobject jarg4) {...}
    

    The mappings for C int and C long are appropriate for 32 bit applications which are used in the 32 bit JVMs. There is no perfect mapping between Java and C as Java doesn't support all the unsigned C data types. However, the mappings allow the full range of values for each C type from Java.

    26.9.2 Default typemaps for non-primitive types

    The previous section covered the primitive type mappings. Non-primitive types such as classes and structs are mapped using pointers on the C/C++ side and storing the pointer into a Java long variable which is held by the proxy class or type wrapper class. This applies whether the type is marshalled as a pointer, by reference or by value. It also applies for any unknown/incomplete types which use type wrapper classes.

    So in summary, the C/C++ pointer to non-primitive types is cast into the 64 bit Java long type and therefore the JNI type is a jlong. The Java type is either the proxy class or type wrapper class.

    26.9.3 Sixty four bit JVMs

    If you are using a 64 bit JVM you may have to override the C long, but probably not C int default mappings. Mappings will be system dependent, for example long will need remapping on Unix LP64 systems (long, pointer 64 bits, int 32 bits), but not on Microsoft 64 bit Windows which will be using a P64 IL32 (pointer 64 bits and int, long 32 bits) model. This may be automated in a future version of SWIG. Note that the Java write once run anywhere philosophy holds true for all pure Java code when moving to a 64 bit JVM. Unfortunately it won't of course hold true for JNI code.

    26.9.4 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Java to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variables prefaced by a $ are used. The $1 variable is a placeholder for a local variable of type int. The $input variable contains the Java data, the JNI jint in this case.

    When this example is compiled into a Java module, it can be used as follows:

    System.out.println(example.fact(6));
    

    and the output will be:

    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int nonnegative {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int nonnegative.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG C++ type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int nonnegative {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer nonnegative);    // Above typemap is applied
    %}
    

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
    ...
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Java parameter. This allows the function to be used like this (notice how the length parameter is omitted):

    int c = example.count('e', "Hello World");
    

    26.9.5 Typemaps for mapping C/C++ types to Java types

    The typemaps available to the Java module include the common typemaps listed in the main typemaps section. There are a number of additional typemaps which are necessary for using SWIG with Java. The most important of these implement the mapping of C/C++ types to Java types:


     
    TypemapDescription
    jniJNI C types. These provide the default mapping of types from C/C++ to JNI for use in the JNI (C/C++) code.
    jtypeJava intermediary types. These provide the default mapping of types from C/C++ to Java for use in the native functions in the intermediary JNI class. The type must be the equivalent Java type for the JNI C type specified in the "jni" typemap.
    jstypeJava types. These provide the default mapping of types from C/C++ to Java for use in the Java module class, proxy classes and type wrapper classes.
    javainConversion from jstype to jtype. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). In other words the typemap provides the conversion to the native method call parameter types.
    javaoutConversion from jtype to jstype. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). In other words the typemap provides the conversion from the native method call return type.
    jboxtypeJava boxed type. These are Java code typemaps to provide the Java boxed type, such as, Integer for C type int. As autoboxing is only relevant to the Java primitive types, these are only provided for the C types that map to Java primitive types. This typemap is usually only used by C++ STL container wrappers that are wrapped by Java generic types as the boxed type must be used instead of the unboxed/primitive type when declaring a Java generic type.
    javadirectorinConversion from jtype to jstype for director methods. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). This typemap provides the conversion for the parameters in the director methods when calling up from C++ to Java. See Director typemaps.
    javadirectoroutConversion from jstype to jtype for director methods. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). This typemap provides the conversion for the return type in the director methods when returning from the C++ to Java upcall. See Director typemaps.
    directorinConversion from C++ type to jni type for director methods. These are C++ typemaps which convert the parameters used in the C++ director method to the appropriate JNI intermediary type. The conversion is done in JNI code prior to calling the Java function from the JNI code. See Director typemaps.
    directoroutConversion from jni type to C++ type for director methods. These are C++ typemaps which convert the JNI return type used in the C++ director method to the appropriate C++ return type. The conversion is done in JNI code after calling the Java function from the JNI code. See Director typemaps.

    If you are writing your own typemaps to handle a particular type, you will normally have to write a collection of them. The default typemaps are in "java.swg" and so might be a good place for finding typemaps to base any new ones on.

    The "jni", "jtype" and "jstype" typemaps are usually defined together to handle the Java to C/C++ type mapping. An "in" typemap should be accompanied by a "javain" typemap and likewise an "out" typemap by a "javaout" typemap. If an "in" typemap is written, a "freearg" and "argout" typemap may also need to be written as some types have a default "freearg" and/or "argout" typemap which may need overriding. The "freearg" typemap sometimes releases memory allocated by the "in" typemap. The "argout" typemap sometimes sets values in function parameters which are passed by reference in Java.

    Note that the "in" typemap marshals the JNI type held in the "jni" typemap to the real C/C++ type and for the opposite direction, the "out" typemap marshals the real C/C++ type to the JNI type held in the "jni" typemap. For non-primitive types the "in" and "out" typemaps are responsible for casting between the C/C++ pointer and the 64 bit jlong type. There is no portable way to cast a pointer into a 64 bit integer type and the approach taken by SWIG is mostly portable, but breaks C/C++ aliasing rules. In summary, these rules state that a pointer to any type must never be dereferenced by a pointer to any other incompatible type. The following code snippet might aid in understand aliasing rules better:

    short a;
    short* pa = 0;
    int i = 0x1234;
    
    a = (short)i;    /* okay */
    a = *(short*)&i; /* breaks aliasing rules */
    

    An email posting, Aliasing, pointer casts and gcc 3.3 elaborates further on the subject. In SWIG, the "in" and "out" typemaps for pointers are typically

    %typemap(in) struct Foo * %{
      $1 = *(struct Foo **)&$input; /* cast jlong into C ptr */
    %}
    %typemap(out) struct Bar * %{
      *(struct Bar **)&$result = $1; /* cast C ptr into jlong */
    %}
    struct Bar {...};
    struct Foo {...};
    struct Bar * FooBar(struct Foo *f);
    

    resulting in the following code which breaks the aliasing rules:

    SWIGEXPORT jlong JNICALL Java_exampleJNI_FooBar(JNIEnv *jenv, jclass jcls,
                                                    jlong jarg1, jobject jarg1_) {
      jlong jresult = 0 ;
      struct Foo *arg1 = (struct Foo *) 0 ;
      struct Bar *result = 0 ;
      
      (void)jenv;
      (void)jcls;
      (void)jarg1_;
      arg1 = *(struct Foo **)&jarg1; 
      result = (struct Bar *)FooBar(arg1);
      *(struct Bar **)&jresult = result; 
      return jresult;
    }
    

    If you are using gcc as your C compiler, you might get a "dereferencing type-punned pointer will break strict-aliasing rules" warning about this. Please see Compiling a dynamic module to avoid runtime problems with these strict aliasing rules.

    The default code generated by SWIG for the Java module comes from the typemaps in the "java.swg" library file which implements the Default primitive type mappings and Default typemaps for non-primitive types covered earlier. There are other type mapping typemaps in the Java library. These are listed below:


     
    C TypeTypemap FileKindJava Type Function
    primitive pointers and referencesINPUT typemaps.iinputJava basic typesAllows values to be used for C functions taking pointers for data input.
    primitive pointers and referencesOUTPUT typemaps.ioutputJava basic type arraysAllows values held within an array to be used for C functions taking pointers for data output.
    primitive pointers and referencesINOUT typemaps.iinput
    output
    Java basic type arraysAllows values held within an array to be used for C functions taking pointers for data input and output.
    string
    wstring
    [unnamed]std_string.iinput
    output
    StringUse for std::string mapping to Java String.
    arrays of primitive types[unnamed] arrays_java.iinput
    output
    arrays of primitive Java typesUse for mapping C arrays to Java arrays.
    arrays of classes/structs/unionsJAVA_ARRAYSOFCLASSES macroarrays_java.iinput
    output
    arrays of proxy classesUse for mapping C arrays to Java arrays.
    arrays of enumsARRAYSOFENUMSarrays_java.i input
    output
    int[]Use for mapping C arrays to Java arrays (typeunsafe and simple enum wrapping approaches only).
    char *BYTEvarious.iinput byte[]Java byte array is converted to char array
    char **STRING_ARRAYvarious.iinput
    output
    String[]Use for mapping NULL terminated arrays of C strings to Java String arrays
    unsigned char *NIOBUFFERvarious.i input
    output
    java.nio.BufferUse for mapping directly allocated buffers to c/c++. useful with directors and long lived memory objects

    26.9.6 Java typemap attributes

    There are a few additional typemap attributes that the Java module supports.

    The first of these is the 'throws' attribute. The throws attribute is optional and specified after the typemap name and contains one or more comma separated classes for adding to the throws clause for any methods that use that typemap. It is analogous to the %javaexception feature's throws attribute.

    %typemap(typemapname, throws="ExceptionClass1, ExceptionClass2") type { ... }
    

    The attribute is necessary for supporting Java checked exceptions and can be added to just about any typemap. The list of typemaps include all the C/C++ (JNI) typemaps in the " Typemaps" chapter and the Java specific typemaps listed in the previous section, barring the "jni", "jtype" and "jstype" typemaps as they could never contain code to throw an exception.

    The throws clause is generated for the proxy method as well as the JNI method in the JNI intermediary class. If a method uses more than one typemap and each of those typemaps have classes specified in the throws clause, the union of the exception classes is added to the throws clause ensuring there are no duplicate classes. See the NaN exception example for further usage.

    The "jtype" typemap has the optional 'nopgcpp' attribute which can be used to suppress the generation of the premature garbage collection prevention parameter.

    The "javain" typemap has the optional 'pre', 'post' and 'pgcppname' attributes. These are used for generating code before and after the JNI call in the proxy class or module class. The 'pre' attribute contains code that is generated before the JNI call and the 'post' attribute contains code generated after the JNI call. The 'pgcppname' attribute is used to change the premature garbage collection prevention parameter name passed to the JNI function. This is sometimes needed when the 'pre' typemap creates a temporary variable which is then passed to the JNI function.

    Note that when the 'pre' or 'post' attributes are specified and the associated type is used in a constructor, a constructor helper function is generated. This is necessary as the Java proxy constructor wrapper makes a call to a support constructor using a this call. In Java the this call must be the first statement in the constructor body. The constructor body thus calls the helper function and the helper function instead makes the JNI call, ensuring the 'pre' code is called before the JNI call is made. There is a Date marshalling example showing 'pre', 'post' and 'pgcppname' attributes in action.

    26.9.7 Java special variables

    The standard SWIG special variables are available for use within typemaps as described in the Typemaps documentation , for example $1, $input, $result etc.

    The Java module uses a few additional special variables:

    $javaclassname
    This special variable works like the other special variables and $javaclassname is similar to $1_type. It expands to the class name for use in Java given a pointer. SWIG wraps unions, structs and classes using pointers and in this case it expands to the Java proxy class name. For example, $javaclassname is replaced by the proxy classname Foo when wrapping a Foo * and $&javaclassname expands to the proxy classname when wrapping the C/C++ type Foo and $*javaclassname expands to the proxy classname when wrapping Foo *&. If the type does not have an associated proxy class, it expands to the type wrapper class name, for example, SWIGTYPE_p_unsigned_short is generated when wrapping unsigned short *. The class name is fully qualified with the package name when using the nspace feature.

    $javaclazzname
    This special variable works like $javaclassname, but expands the fully qualified C++ class into the package name, if used by the nspace feature, and the proxy class name, mangled for use as a function name. For example, Namespace1::Namespace2::Klass is expanded into Namespace1_Namespace2_Klass_. This special variable is usually used for making calls to a function in the intermediary JNI class, as they are mangled with this prefix.

    $null
    Used in input typemaps to return early from JNI functions that have either void or a non-void return type. Example:

    %typemap(check) int * %{ 
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return $null;
      }
    %}
    

    If the typemap gets put into a function with void as return, $null will expand to nothing:

    SWIGEXPORT void JNICALL Java_jnifn(...) {
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return ;
      }
      ...
    }
    

    otherwise $null expands to NULL

    SWIGEXPORT jobject JNICALL Java_jnifn(...) {
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return NULL;
      }
      ...
    }
    

    $javainput, $jnicall and $owner
    The $javainput special variable is used in "javain" typemaps and $jnicall and $owner are used in "javaout" typemaps. $jnicall is analogous to $action in %exception. It is replaced by the call to the native method in the intermediary JNI class. $owner is replaced by either true if %newobject has been used, otherwise false . $javainput is analogous to the $input special variable. It is replaced by the parameter name.

    Here is an example:

    %typemap(javain) Class "Class.getCPtr($javainput)"
    %typemap(javain) unsigned short "$javainput"
    %typemap(javaout) Class * {
        return new Class($jnicall, $owner);
      }
    
    %inline %{
      class Class {...};
      Class * bar(Class cls, unsigned short ush) { return new Class(); };
    %}
    

    The generated proxy code is then:

    public static Class bar(Class cls, int ush) {
      return new Class(exampleJNI.bar(Class.getCPtr(cls), cls, ush), false);
    }
    

    Here $javainput has been replaced by cls and ush. $jnicall has been replaced by the native method call, exampleJNI.bar(...) and $owner has been replaced by false. If %newobject is used by adding the following at the beginning of our example:

    %newobject bar(Class cls, unsigned short ush);
    

    The generated code constructs the return type using true indicating the proxy class Class is responsible for destroying the C++ memory allocated for it in bar:

    public static Class bar(Class cls, int ush) {
      return new Class(exampleJNI.bar(Class.getCPtr(cls), cls, ush), true);
    }
    

    $static
    This special variable expands to either static or nothing depending on whether the class is an inner Java class or not. It is used in the "javaclassmodifiers" typemap so that global classes can be wrapped as Java proxy classes and nested C++ classes/enums can be wrapped with the Java equivalent, that is, static inner proxy classes.

    $error, $jniinput, $javacall and $packagepath
    These special variables are used in the directors typemaps. See Director specific typemaps for details.

    $module
    This special variable expands to the module name, as specified by %module or the -module commandline option.

    $imclassname
    This special variable expands to the intermediary class name. Usually this is the same as '$moduleJNI', unless the jniclassname attribute is specified in the %module directive.

    $javainterfacename
    This special variable is only expanded when the interface feature is applied to a class. It works much like $javaclassname , but instead of expanding to the proxy classname, it expands to the value in the name attribute in the interface feature. For example:

    %feature("interface", name="MyInterface") MyClass;
    %typemap(jstype) MyClass  "$&javainterfacename"
    %typemap(jstype) MyClass * "$javainterfacename"
    

    will result in the jstype typemap expanding to MyInterface for both MyClass and MyClass *. The interface name is fully qualified with the package name when using the nspace feature.

    $interfacename
    This special variable is only expanded when the interface feature is applied to a class. It expands to just the interface name and is thus different to $javainterfacename in that it is not fully qualified with the package name when using the nspace feature.

    26.9.8 Typemaps for both C and C++ compilation

    JNI calls must be written differently depending on whether the code is being compiled as C or C++. For example C compilation requires the pointer to a function pointer struct member syntax like

    const jclass clazz = (*jenv)->FindClass(jenv, "java/lang/String");
    

    whereas C++ code compilation of the same function call is a member function call using a class pointer like

    const jclass clazz = jenv->FindClass("java/lang/String");
    

    To enable typemaps to be used for either C or C++ compilation, a set of JCALLx macros have been defined in Lib/java/javahead.swg, where x is the number of arguments in the C++ version of the JNI call. The above JNI calls would be written in a typemap like this

    const jclass clazz = JCALL1(FindClass, jenv, "java/lang/String");
    

    Note that the SWIG preprocessor expands these into the appropriate C or C++ JNI calling convention. The C calling convention is emitted by default and the C++ calling convention is emitted when using the -c++ SWIG commandline option. If you do not intend your code to be targeting both C and C++ then your typemaps can use the appropriate JNI calling convention and need not use the JCALLx macros.

    26.9.9 Java code typemaps

    Most of SWIG's typemaps are used for the generation of C/C++ code. The typemaps in this section are used solely for the generation of Java code. Elements of proxy classes and type wrapper classes come from the following typemaps (the defaults).

    %typemap(javabase)

    base (extends) for Java class: empty default
    Note that this typemap accepts a replace attribute as an optional flag. When set to "1", it will replace/override any C++ base classes that might have been parsed. If this flag is not specified and there are C++ base classes, then a multiple inheritance warning is issued and the code in the typemap is ignored. The typemap also accepts a notderived attribute as an optional flag. When set to "1", it will not apply to classes that are derived from a C++ base. When used with the SWIGTYPE type, it is useful for giving a common base for all proxy classes, that is, providing a base class that sits in between all proxy classes and the Java base class Object for example: %typemap(javabase, notderived="1") SWIGTYPE "CommonBase".

    %typemap(javabody)

    the essential support body for proxy classes (proxy base classes only), typewrapper classes and enum classes. Default contains extra constructors, memory ownership control member variables (swigCMemOwn, swigCPtr), the getCPtr method etc.

    %typemap(javabody_derived)

    the essential support body for proxy classes (derived classes only). Same as "javabody" typemap, but only used for proxy derived classes.

    %typemap(javaclassmodifiers)

    class modifiers for the Java class: default is "public class"

    %typemap(javacode)

    Java code is copied verbatim to the Java class: empty default As there can only be one "javacode" typemap per class, also consider using the %proxycode directive which can be used multiple times per class and offers nearly identical functionality.

    %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized", parameters="")

    destructor wrapper - the delete() method (proxy classes only), used for all proxy classes except those which have a base class : default calls C++ destructor (or frees C memory) and resets swigCPtr and swigCMemOwn flags

    Note that the delete() method name is configurable and is specified by the methodname attribute. The method modifiers are also configurable via the methodmodifiers attribute. If a %javamethodmodifiers is attached to the class' destructor, it will be used in preference to the methodmodifiers typemap attribute for the class. The delete method's parameters declaration can be provided in the optional parameters typemap attribute.

    %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized", parameters="")

    destructor wrapper - the delete() method (proxy classes only), same as "javadestruct" but only used for derived proxy classes : default calls C++ destructor (or frees C memory) and resets swigCPtr and swigCMemOwn flags

    Note that the delete() method name is configurable and is specified by the methodname attribute. The method modifiers are also configurable via the methodmodifiers attribute. If a %javamethodmodifiers is attached to the class' destructor, it will be used in preference to the methodmodifiers typemap attribute for the class. The delete method's parameters declaration can be provided in the optional parameters typemap attribute.

    %typemap(javaimports)

    import statements for Java class: empty default

    %typemap(javainterfaces)

    interfaces (implements) for Java class: empty default

    %typemap(javafinalize)

    the finalize() method (proxy classes only): default calls the delete() method

    Note that the default javafinalize typemap must contain the full implementation of the finalize method. Any customization to this typemap must still declare a java finalize method with the correct signature. Note also that the name of the generated "delete" method may be affected by javadestruct and javadestruct_derived typemaps. Below shows an example modifying the finalizer, assuming the delete method has been renamed to swig_delete.

    %typemap(javafinalize) SWIGTYPE %{
      protected void finalize() {
        swig_delete();  // renamed to prevent conflict with existing delete method
      }
    ]%
    

    %typemap(javainterfacecode, declaration="...", cptrmethod="...")

    The code in this typemap is added to the body of a Java proxy class but only when a class is marked with the interface feature. The typemap is used in the proxy class marked with the interface feature as well as all proxy classes derived from the marked C++ class, as they are all generated as implementing the Java interface. The default typemap used in the %interface family of macros mentioned in the Java interfaces section, where CTYPE is the C++ class macro argument, is as follows:

    %typemap(javainterfacecode,
             declaration="  long $interfacename_GetInterfaceCPtr();\n",
             cptrmethod="$interfacename_GetInterfaceCPtr") CTYPE %{
      public long $interfacename_GetInterfaceCPtr() {
        return $imclassname.$javaclazzname$interfacename_GetInterfaceCPtr(swigCPtr);
      }
    %}
    

    The special variable $interfacename is expanded into the name specified in the interface feature.

    Compatibility Note: In SWIG-1.3.21 and earlier releases, typemaps called "javagetcptr" and "javaptrconstructormodifiers" were available. These are deprecated and the "javabody" typemap can be used instead. The javainterfacecode typemap and interface feature was introduced in SWIG-3.0.9.

    In summary the contents of the typemaps make up a proxy class like this:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    [ javabody or javabody_derived typemap ]
    [ javafinalize typemap ]
    public synchronized void delete() [ javadestruct OR javadestruct_derived typemap ]
    [ javacode typemap ]
    [ javainterfacecode typemap]
    ... proxy functions ...
    }
    

    Note the delete() methodname and method modifiers are configurable, see "javadestruct" and "javadestruct_derived" typemaps above.

    The javainterfacecode typemap is only used when bases are marked by the interface feature and the implements list will also then be expanded to include these Java interfaces.

    The type wrapper class is similar in construction:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    [ javabody typemap ]
    [ javacode typemap ]
    }
    

    The enum class is also similar in construction:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    ... Enum values ...
    [ javabody typemap ]
    [ javacode typemap ]
    }
    

    The "javaimports" typemap is ignored if the enum class is wrapped by an inner Java class, that is when wrapping an enum declared within a C++ class.

    The Java interface turned on by the interface feature is fairly simple:

    [ javaimports typemap ]
    public interface [ javainterfacename ] {
    [ javainterfacecode:cptrmethod typemap attribute ]
    ... interface declarations ...
    }
    

    where javainterfacename is the name attribute in the interface feature.

    The defaults can be overridden to tailor the generated classes. Here is an example which will change the getCPtr method and constructor from the default public access to protected access. If the classes in one package are not using the classes in another package, then these methods need not be public and removing access to these low level implementation details, is a good thing. If you are invoking SWIG more than once and generating the wrapped classes into different packages in each invocation, then you cannot do this as you will then have different packages.

    %typemap(javabody) SWIGTYPE %{
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected $javaclassname(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr($javaclassname obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    %}
    

    The typemap code is the same that is in "java.swg", barring the last two method modifiers. Note that SWIGTYPE will target all proxy classes, but not the type wrapper classes. Also the above typemap is only used for proxy classes that are potential base classes. To target proxy classes that are derived from a wrapped class as well, the "javabody_derived" typemap should also be overridden.

    For the typemap to be used in all type wrapper classes, all the different types that type wrapper classes could be used for should be targeted:

    %typemap(javabody) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) %{
      private transient long swigCPtr;
    
      protected $javaclassname(long cPtr, boolean bFutureUse) {
        swigCPtr = cPtr;
      }
    
      protected $javaclassname() {
        swigCPtr = 0;
      }
    
      protected static long getCPtr($javaclassname obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    %}
    

    Again this is the same that is in "java.swg", barring the method modifier for getCPtr.

    When using multiple modules or the nspace feature it is common to invoke SWIG with a different -package command line option for each module. However, by default the generated code may not compile if generated classes in one package use generated classes in another package. The visibility of the getCPtr() and pointer constructor generated from the javabody typemaps needs changing. The default visibility is protected but it needs to be public for access from a different package. Just changing 'protected' to 'public' in the typemap achieves this. Two macros are available in java.swg to make this easier and using them is the preferred approach over simply copying the typemaps and modifying as this is forward compatible with any changes in the javabody typemap in future versions of SWIG. The macros are for the proxy and typewrapper classes and can respectively be used to to make the method and constructor public:

      SWIG_JAVABODY_PROXY(public, public, SWIGTYPE)
      SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    

    26.9.10 Director specific typemaps

    The Java directors feature requires the "javadirectorin", "javadirectorout", "directorin" and the "directorout" typemaps in order to work properly. The "javapackage" typemap is an optional typemap used to identify the Java package path for individual SWIG generated proxy classes used in director methods.

    %typemap(directorin)

    The "directorin" typemap is used for converting arguments in the C++ director class to the appropriate JNI type before the upcall to Java. This typemap also specifies the JNI field descriptor for the type in the "descriptor" attribute. For example, integers are converted as follows:

    %typemap(directorin, descriptor="I") int "$input = (jint) $1;"
    

    $input is the SWIG name of the JNI temporary variable passed to Java in the upcall. The descriptor="I" will put an I into the JNI field descriptor that identifies the Java method that will be called from C++. For more about JNI field descriptors and their importance, refer to the JNI documentation mentioned earlier. A typemap for C character strings is:

    %typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * {
      $input = 0;
      if ($1) {
        $input = JCALL1(NewStringUTF, jenv, (const char *)$1);
        if (!$input) return $null;
      }
      Swig::LocalRefGuard $1_refguard(jenv, $input);
    }
    

    The Swig::LocalRefGuard class should be used in directorin typemaps for newly allocated objects. It is used to control local reference counts ensuring the count is decremented after the call up into Java has completed. Its destructor simply calls jenv->DeleteLocalRef(obj) on the obj passed in during construction.

    User-defined types have the default "descriptor" attribute " L$packagepath/$javaclassname;" where $packagepath is the package name passed from the SWIG command line and $javaclassname is the Java proxy class' name. If the -package commandline option is not used to specify the package, then '$packagepath/' will be removed from the resulting output JNI field descriptor. Do not forget the terminating ';' for JNI field descriptors starting with 'L'. If the ';' is left out, Java will generate a "method not found" runtime error. Note that the $packagepath substitution always uses the path separator '/' when expanded. The $javaclassname expansion can be confusing as it is normally expanded using the '.' separator. However, $javaclassname is expanded using the path separator '/' in typemap's "descriptor" attribute as well as in the "directorthrows" typemap.

    %typemap(directorout)

    The "directorout" typemap is used for converting the JNI return type in the C++ director class to the appropriate C++ type after the upcall to Java. For example, integers are converted as follows:

    %typemap(directorout) int %{ $result = (int)$input; %}
    

    $input is the SWIG name of the JNI temporary variable returned from Java after the upcall. $result is the resulting output. A typemap for C character strings is:

    %typemap(directorout) char * {
      $1 = 0;
      if ($input) {
        $result = (char *)jenv->GetStringUTFChars($input, 0);
        if (!$1) return $null;
      }
    }
    

    %typemap(javadirectorin)

    Conversion from jtype to jstype for director methods. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). This typemap provides the conversion for the parameters in the director methods when calling up from C++ to Java.

    For primitive types, this typemap is usually specified as:

    %typemap(javadirectorin) int "$jniinput"
    

    The $jniinput special variable is analogous to $javainput special variable. It is replaced by the input parameter name.

    %typemap(javadirectorout)

    Conversion from jstype to jtype for director methods. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). This typemap provides the conversion for the return type in the director methods when returning from the C++ to Java upcall.

    For primitive types, this typemap is usually specified as:

    %typemap(javadirectorout) int "$javacall"
    

    The $javacall special variable is analogous to the $jnicall special variable. It is replaced by the call to the target Java method. The target method is the method in the Java proxy class which overrides the virtual C++ method in the C++ base class.

    %typemap(directorthrows)

    Conversion of Java exceptions to C++ exceptions in director method's exception handling. This typemap is expected to test the $error special variable for a matching Java exception and if successful convert and throw it into a C++ exception given by the typemap's type. The $error special variable is of type jthrowable and is substituted with a unique variable name in the generated code.

    The example below converts a Java java.lang.IndexOutOfBoundsException exception to the typemap's type, that is std::out_of_range:

    %typemap(directorthrows) std::out_of_range %{
      if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    

    The utility function Swig::ExceptionMatches and class Swig::JavaExceptionMessage are helpers available when using directors and are described in the Java Exceptions from Directors section.

    %typemap(javapackage)

    The "javapackage" typemap is optional; it serves to identify a class's Java package. This typemap should be used in conjunction with classes that are defined outside of the current SWIG interface file. The typemap is only used if the type is used in a director method, that is, in a virtual method in a director class. For example:

    // class Foo is handled in a different interface file:
    %import "Foo.i"
    
    %feature("director") Example;
    
    %inline {
      class Bar { };
    
      class Example {
      public:
        virtual ~Example();
        virtual void ping(Foo *arg1, Bar *arg2);
      };
    }
    

    Assume that the Foo class is part of the Java package com.wombat.foo but the above interface file is part of the Java package com.wombat.example. Without the "javapackage" typemap, SWIG will assume that the Foo class belongs to com.wombat.example class. The corrected interface file looks like:

    // class Foo is handled in a different interface file:
    %import "Foo.i"
    %typemap("javapackage") Foo, Foo *, Foo & "com.wombat.foo";
    %feature("director") Example;
    
    %inline {
      class Bar { };
    
      class Example {
      public:
        virtual ~Example();
        virtual void ping(Foo *arg1, Bar *arg2);
      };
    }
    

    SWIG looks up the package based on the actual type (plain Foo, Foo pointer and Foo reference), so it is important to associate all three types with the desired package. Practically speaking, you should create a separate SWIG interface file, which is %import-ed into each SWIG interface file, when you have multiple Java packages. Note the helper macros below, OTHER_PACKAGE_SPEC and ANOTHER_PACKAGE_SPEC, which reduce the amount of extra typing. " TYPE..." is useful when passing templated types to the macro, since multiargument template types appear to the SWIG preprocessor as multiple macro arguments.

    %typemap("javapackage") SWIGTYPE, SWIGTYPE *, SWIGTYPE &
                                                "package.for.most.classes";
    
    %define OTHER_PACKAGE_SPEC(TYPE...)
    %typemap("javapackage") TYPE, TYPE *, TYPE & "package.for.other.classes";
    %enddef
    
    %define ANOTHER_PACKAGE_SPEC(TYPE...)
    %typemap("javapackage") TYPE, TYPE *, TYPE & "package.for.another.set";
    %enddef
    
    OTHER_PACKAGE_SPEC(Package_2_class_one)
    ANOTHER_PACKAGE_SPEC(Package_3_class_two)
    /* etc */
    

    The basic strategy here is to provide a default package typemap for the majority of the classes, only providing "javapackage" typemaps for the exceptions.

    26.10 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "java.swg" and "typemaps.i " in the SWIG library.

    26.10.1 Simpler Java enums for enums without initializers

    The default Proper Java enums approach to wrapping enums is somewhat verbose. This is to handle all possible C/C++ enums, in particular enums with initializers. The generated code can be simplified if the enum being wrapped does not have any initializers.

    The following shows how to remove the support methods that are generated by default and instead use the methods in the Java enum base class java.lang.Enum and java.lang.Class for marshalling enums between C/C++ and Java. The type used for the typemaps below is enum SWIGTYPE which is the default type used for all enums. The "enums.swg" file should be examined in order to see the original overridden versions of the typemaps.

    %include "enums.swg"
    
    %typemap(javain) enum SWIGTYPE "$javainput.ordinal()"
    %typemap(javaout) enum SWIGTYPE {
        return $javaclassname.class.getEnumConstants()[$jnicall];
      }
    %typemap(javabody) enum SWIGTYPE ""
    
    %inline %{
      enum HairType { blonde, ginger, brunette };
      void setHair(HairType h);
      HairType getHair();
    %}
    

    SWIG will generate the following Java enum, which is somewhat simpler than the default:

    public enum HairType {
      blonde,
      ginger,
      brunette;
    }
    

    and the two Java proxy methods will be:

    public static void setHair(HairType h) {
      exampleJNI.setHair(h.ordinal());
    }
    
    public static HairType getHair() {
      return HairType.class.getEnumConstants()[exampleJNI.getHair()];
    }
    

    For marshalling Java enums to C/C++ enums, the ordinal method is used to convert the Java enum into an integer value for passing to the JNI layer, see the "javain" typemap. For marshalling C/C++ enums to Java enums, the C/C++ enum value is cast to an integer in the C/C++ typemaps (not shown). This integer value is then used to index into the array of enum constants that the Java language provides. See the getEnumConstants method in the "javaout" typemap.

    These typemaps can often be used as the default for wrapping enums as in many cases there won't be any enum initializers. In fact a good strategy is to always use these typemaps and to specifically handle enums with initializers using %apply. This would be done by using the original versions of these typemaps in "enums.swg" under another typemap name for applying using %apply.

    26.10.2 Handling C++ exception specifications as Java exceptions

    This example demonstrates various ways in which C++ exceptions can be tailored and converted into Java exceptions. Let's consider a simple file class SimpleFile and an exception class FileException which it may throw on error:

    %include "std_string.i" // for std::string typemaps
    #include <string>
    
    class FileException {
      std::string message;
    public:
      FileException(const std::string& msg) : message(msg) {}
      std::string what() {
        return message;
      }
    };
    
    class SimpleFile {
      std::string filename;
    public:
      SimpleFile(const std::string& filename) : filename(filename) {}
      void open() throw(FileException) {
      ...
      }
    };
    

    As the open method has a C++ exception specification, SWIG will parse this and know that the method can throw an exception. The "throws" typemap is then used when SWIG encounters an exception specification. The default generic "throws" typemap looks like this:

    %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE *, SWIGTYPE [ANY] %{
      SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException,
                              "C++ $1_type exception thrown");
      return $null;
    %}
    

    Basically SWIG will generate a C++ try catch block and the body of the "throws" typemap constitutes the catch block. The above typemap calls a SWIG supplied method which throws a java.lang.RuntimeException. This exception class is a runtime exception and therefore not a checked exception. If, however, we wanted to throw a checked exception, say java.io.IOException, then we could use the following typemap:

    %typemap(throws, throws="java.io.IOException") FileException {
      jclass excep = jenv->FindClass("java/io/IOException");
      if (excep)
        jenv->ThrowNew(excep, $1.what().c_str());
      return $null;
    }
    

    Note that this typemap uses the 'throws' typemap attribute to ensure a throws clause is generated. The generated proxy method then specifies the checked exception by containing java.io.IOException in the throws clause:

    public class SimpleFile {
      ...
      public void open() throws java.io.IOException { ... }
    }
    

    Lastly, if you don't want to map your C++ exception into one of the standard Java exceptions, the C++ class can be wrapped and turned into a custom Java exception class. If we go back to our example, the first thing we must do is get SWIG to wrap FileException and ensure that it derives from java.lang.Exception. Additionally, we might want to override the java.lang.Exception.getMessage() method. The typemaps to use then are as follows:

    %typemap(javabase) FileException "java.lang.Exception";
    %typemap(javacode) FileException %{
      public String getMessage() {
        return what();
      }
    %}
    

    This generates:

    public class FileException extends java.lang.Exception {
      ...
      public String getMessage() {
        return what();
      }
    
      public FileException(String msg) { ... }
    
      public String what() {
        return exampleJNI.FileException_what(swigCPtr, this);
      }
    }
    

    We could alternatively have used %rename to rename what() into getMessage().

    26.10.3 NaN Exception - exception handling for a particular type

    A Java exception can be thrown from any Java or JNI code. Therefore, as most typemaps contain either Java or JNI code, just about any typemap could throw an exception. The following example demonstrates exception handling on a type by type basis by checking for 'Not a number' (NaN) whenever a parameter of type float is wrapped.

    Consider the following C++ code:

    bool calculate(float first, float second);
    

    To validate every float being passed to C++, we could precede the code being wrapped by the following typemap which throws a runtime exception whenever the float is 'Not a Number':

    %module example
    %typemap(javain) float "$module.CheckForNaN($javainput)"
    %pragma(java) modulecode=%{
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    %}
    

    Note that the CheckForNaN support method has been added to the module class using the modulecode pragma. The following shows the generated code of interest:

    public class example {
      ...
    
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    
      public static boolean calculate(float first, float second) {
        return exampleJNI.calculate(example.CheckForNaN(first), example.CheckForNaN(second));
      }
    }
    

    Note that the "javain" typemap is used for every occurrence of a float being used as an input. Of course, we could have targeted the typemap at a particular parameter by using float first, say, instead of just float.

    The exception checking could alternatively have been placed into the 'pre' attribute that the "javain" typemap supports. The "javain" typemap above could be replaced with the following:

    %typemap(javain, pre="    $module.CheckForNaN($javainput);") float "$javainput"
    

    which would modify the calculate function to instead be generated as:

    public class example {
      ...
      public static boolean calculate(float first, float second) {
        example.CheckForNaN(first);
        example.CheckForNaN(second);
        {
          return exampleJNI.calculate(first, second);
        }
      }
    }
    

    See the Date marshalling example for an example using further "javain" typemap attributes.

    If we decide that what we actually want is a checked exception instead of a runtime exception, we can change this easily enough. The proxy method that uses float as an input, must then add the exception class to the throws clause. SWIG can handle this as it supports the 'throws' typemap attribute for specifying classes for the throws clause. Thus we can modify the pragma and the typemap for the throws clause:

    %typemap(javain, throws="java.lang.Exception") float "$module.CheckForNaN($javainput)"
    %pragma(java) modulecode=%{
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) throws java.lang.Exception {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    %}
    

    The calculate method now has a throws clause and even though the typemap is used twice for both float first and float second, the throws clause contains a single instance of java.lang.Exception:

    public class example {
      ...
    
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) throws java.lang.Exception {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    
      public static boolean calculate(float first, float second) throws java.lang.Exception {
        return exampleJNI.calculate(example.CheckForNaN(first), example.CheckForNaN(second));
      }
    }
    

    If we were a martyr to the JNI cause, we could replace the succinct code within the "javain" typemap with a few pages of JNI code. If we had, we would have put it in the "in" typemap which, like all JNI and Java typemaps, also supports the 'throws' attribute.

    26.10.4 Converting Java String arrays to char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Java String array to be used as a char ** object.

    %module example
    
    /* This tells SWIG to treat char ** as a special case when used as a parameter
       in a function call */
    %typemap(in) char ** (jint size) {
      int i = 0;
      size = (*jenv)->GetArrayLength(jenv, $input);
      $1 = (char **) malloc((size+1)*sizeof(char *));
      /* make a copy of each string */
      for (i = 0; i<size; i++) {
        jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i);
        const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0);
        $1[i] = malloc((strlen(c_string)+1)*sizeof(char));
        strcpy($1[i], c_string);
        (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string);
        (*jenv)->DeleteLocalRef(jenv, j_string);
      }
      $1[i] = 0;
    }
    
    /* This cleans up the memory we malloc'd before the function call */
    %typemap(freearg) char ** {
      int i;
      for (i=0; i<size$argnum-1; i++)
        free($1[i]);
      free($1);
    }
    
    /* This allows a C function to return a char ** as a Java String array */
    %typemap(out) char ** {
      int i;
      int len=0;
      jstring temp_string;
      const jclass clazz = (*jenv)->FindClass(jenv, "java/lang/String");
    
      while ($1[len]) len++;
      jresult = (*jenv)->NewObjectArray(jenv, len, clazz, NULL);
      /* exception checking omitted */
    
      for (i=0; i<len; i++) {
        temp_string = (*jenv)->NewStringUTF(jenv, *result++);
        (*jenv)->SetObjectArrayElement(jenv, jresult, i, temp_string);
        (*jenv)->DeleteLocalRef(jenv, temp_string);
      }
    }
    
    /* These 3 typemaps tell SWIG what JNI and Java types to use */
    %typemap(jni) char ** "jobjectArray"
    %typemap(jtype) char ** "String[]"
    %typemap(jstype) char ** "String[]"
    
    /* These 2 typemaps handle the conversion of the jtype to jstype typemap type
       and vice versa */
    %typemap(javain) char ** "$javainput"
    %typemap(javaout) char ** {
        return $jnicall;
      }
    
    /* Now a few test functions */
    %inline %{
    
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    
    char **get_args() {
      static char *values[] = { "Dave", "Mike", "Susan", "John", "Michelle", 0};
      return &values[0];
    }
    
    %}
    

    Note that the 'C' JNI calling convention is used. Checking for any thrown exceptions after JNI function calls has been omitted. When this module is compiled, our wrapped C functions can be used by the following Java program:

    // File runme.java
    
    public class runme {
    
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. " + e);
          System.exit(1);
        }
      }
    
      public static void main(String argv[]) {
        String animals[] = {"Cat", "Dog", "Cow", "Goat"};
        example.print_args(animals);
        String args[] = example.get_args();
        for (int i=0; i<args.length; i++)
          System.out.println(i + ":" + args[i]);
      }
    }
    

    When compiled and run we get:

    $ java runme
    argv[0] = Cat
    argv[1] = Dog
    argv[2] = Cow
    argv[3] = Goat
    0:Dave
    1:Mike
    2:Susan
    3:John
    4:Michelle
    

    In the example, a few different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function. The "out" typemap is used for function return values. Lastly the "jni", "jtype" and "jstype" typemaps are also required to specify what Java types to use.

    26.10.5 Expanding a Java object to multiple arguments

    Suppose that you had a collection of C functions with arguments such as the following:

    int foo(int argc, char **argv);
    

    In the previous example, a typemap was written to pass a Java String array as the char **argv. This allows the function to be used from Java as follows:

    example.foo(4, new String[]{"red", "green", "blue", "white"});
    

    Although this works, it's a little awkward to specify the argument count. To fix this, a multi-argument typemap can be defined. This is not very difficult--you only have to make slight modifications to the previous example's typemaps:

    %typemap(in) (int argc, char **argv) {
      int i = 0;
      $1 = (*jenv)->GetArrayLength(jenv, $input);
      $2 = (char **) malloc(($1+1)*sizeof(char *));
      /* make a copy of each string */
      for (i = 0; i<$1; i++) {
        jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i);
        const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0);
        $2[i] = malloc((strlen(c_string)+1)*sizeof(char));
        strcpy($2[i], c_string);
        (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string);
        (*jenv)->DeleteLocalRef(jenv, j_string);
      }
      $2[i] = 0;
    }
    
    %typemap(freearg) (int argc, char **argv) {
      int i;
      for (i=0; i<$1-1; i++)
        free($2[i]);
      free($2);
    }
    
    %typemap(jni) (int argc, char **argv) "jobjectArray"
    %typemap(jtype) (int argc, char **argv) "String[]"
    %typemap(jstype) (int argc, char **argv) "String[]"
    
    %typemap(javain) (int argc, char **argv) "$javainput"
    

    When writing a multiple-argument typemap, each of the types is referenced by a variable such as $1 or $2. The typemap code simply fills in the appropriate values from the supplied Java parameter.

    With the above typemap in place, you will find it no longer necessary to supply the argument count. This is automatically set by the typemap code. For example:

    example.foo(new String[]{"red", "green", "blue", "white"});
    

    26.10.6 Using typemaps to return arguments

    A common problem in some C programs is that values may be returned in function parameters rather than in the return value of a function. The typemaps.i file defines INPUT, OUTPUT and INOUT typemaps which can be used to solve some instances of this problem. This library file uses an array as a means of moving data to and from Java when wrapping a C function that takes non const pointers or non const references as parameters.

    Now we are going to outline an alternative approach to using arrays for C pointers. The INOUT typemap uses a double[] array for receiving and returning the double* parameters. In this approach we are able to use a Java class myDouble instead of double[] arrays where the C pointer double* is required.

    Here is our example function:

    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2);
    

    If we define a structure MyDouble containing a double member variable and use some typemaps we can solve this problem. For example we could put the following through SWIG:

    %module example
    
    /* Define a new structure to use instead of double * */
    %inline %{
    typedef struct {
      double value;
    } MyDouble;
    %}
    
    
    %{
    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2) {
      int status = 1;
      *out1 = a*10.0;
      *out2 = b*100.0;
      return status;
    }
    %}
    
    /* 
    This typemap will make any double * function parameters with name OUTVALUE take an
    argument of MyDouble instead of double *. This will 
    allow the calling function to read the double * value after returning from the function.
    */
    %typemap(in) double *OUTVALUE {
      jclass clazz = jenv->FindClass("MyDouble");
      jfieldID fid = jenv->GetFieldID(clazz, "swigCPtr", "J");
      jlong cPtr = jenv->GetLongField($input, fid);
      MyDouble *pMyDouble = NULL;
      *(MyDouble **)&pMyDouble = *(MyDouble **)&cPtr;
      $1 = &pMyDouble->value;
    }
    
    %typemap(jtype) double *OUTVALUE "MyDouble"
    %typemap(jstype) double *OUTVALUE "MyDouble"
    %typemap(jni) double *OUTVALUE "jobject"
    
    %typemap(javain) double *OUTVALUE "$javainput"
    
    /* Now we apply the typemap to the named variables */
    %apply double *OUTVALUE { double *out1, double *out2 };
    int spam(double a, double b, double *out1, double *out2);
    

    Note that the C++ JNI calling convention has been used this time and so must be compiled as C++ and the -c++ commandline must be passed to SWIG. JNI error checking has been omitted for clarity.

    What the typemaps do are make the named double* function parameters use our new MyDouble wrapper structure. The "in" typemap takes this structure, gets the C++ pointer to it, takes the double value member variable and passes it to the C++ spam function. In Java, when the function returns, we use the SWIG created getValue() function to get the output value. The following Java program demonstrates this:

    // File: runme.java
    
    public class runme {
    
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. " + e);
          System.exit(1);
        }
      }
    
      public static void main(String argv[]) {
        MyDouble out1 = new MyDouble();
        MyDouble out2 = new MyDouble();
        int ret = example.spam(1.2, 3.4, out1, out2);
        System.out.println(ret + "  " + out1.getValue() + "  " + out2.getValue());
      }
    }
    

    When compiled and run we get:

    $ java runme
    1 12.0  340.0
    

    26.10.7 Adding Java downcasts to polymorphic return types

    SWIG support for polymorphism works in that the appropriate virtual function is called. However, the default generated code does not allow for downcasting. Let's examine this with the following code:

    %include "std_string.i"
    
    #include <iostream>
    using namespace std;
    class Vehicle {
    public:
      virtual void start() = 0;
    ...
    };
    
    class Ambulance : public Vehicle {
      string vol;
    public:
      Ambulance(string volume) : vol(volume) {}
      virtual void start() {
        cout << "Ambulance started" << endl;
      }
      void sound_siren() {
        cout << vol << " siren sounded!" << endl;
      }
    ...
    };
    
    Vehicle *vehicle_factory() {
      return new Ambulance("Very loud");
    }
    

    If we execute the following Java code:

    Vehicle vehicle = example.vehicle_factory();
    vehicle.start();
    
    Ambulance ambulance = (Ambulance)vehicle;
    ambulance.sound_siren();
    

    We get:

    Ambulance started
    java.lang.ClassCastException
            at runme.main(runme.java:16)
    

    Even though we know from examination of the C++ code that vehicle_factory returns an object of type Ambulance, we are not able to use this knowledge to perform the downcast in Java. This occurs because the runtime type information is not completely passed from C++ to Java when returning the type from vehicle_factory(). Usually this is not a problem as virtual functions do work by default, such as in the case of start(). There are a few solutions to getting downcasts to work.

    The first is not to use a Java cast but a call to C++ to make the cast. Add this to your code:

    %exception Ambulance::dynamic_cast(Vehicle *vehicle) {
      $action
        if (!result) {
          jclass excep = jenv->FindClass("java/lang/ClassCastException");
          if (excep) {
            jenv->ThrowNew(excep, "dynamic_cast exception");
          }
        }
    }
    %extend Ambulance {
      static Ambulance *dynamic_cast(Vehicle *vehicle) {
        return dynamic_cast<Ambulance *>(vehicle);
      }
    };
    

    It would then be used from Java like this

    Ambulance ambulance = Ambulance.dynamic_cast(vehicle);
    ambulance.sound_siren();
    

    Should vehicle not be of type ambulance then a Java ClassCastException is thrown. The next solution is a purer solution in that Java downcasts can be performed on the types. Add the following before the definition of vehicle_factory:

    %typemap(out) Vehicle * {
      Ambulance *downcast = dynamic_cast<Ambulance *>($1);
      *(Ambulance **)&$result = downcast;
    }
    
    %typemap(javaout) Vehicle * {
        return new Ambulance($jnicall, $owner);
      }
    

    Here we are using our knowledge that vehicle_factory always returns type Ambulance so that the Java proxy is created as a type Ambulance. If vehicle_factory can manufacture any type of Vehicle and we want to be able to downcast using Java casts for any of these types, then a different approach is needed. Consider expanding our example with a new Vehicle type and a more flexible factory function:

    class FireEngine : public Vehicle {
    public:
      FireEngine() {}
      virtual void start() {
        cout << "FireEngine started" << endl;
      }
      void roll_out_hose() {
        cout << "Hose rolled out" << endl;
      }
      ...
    };
    Vehicle *vehicle_factory(int vehicle_number) {
      if (vehicle_number == 0)
        return new Ambulance("Very loud");
      else
        return new FireEngine();
    }
    

    To be able to downcast with this sort of Java code:

    FireEngine fireengine = (FireEngine)example.vehicle_factory(1);
    fireengine.roll_out_hose();
    Ambulance ambulance = (Ambulance)example.vehicle_factory(0);
    ambulance.sound_siren();
    

    the following typemaps targeted at the vehicle_factory function will achieve this. Note that in this case, the Java class is constructed using JNI code rather than passing a pointer across the JNI boundary in a Java long for construction in Java code.

    %typemap(jni) Vehicle *vehicle_factory "jobject"
    %typemap(jtype) Vehicle *vehicle_factory "Vehicle"
    %typemap(jstype) Vehicle *vehicle_factory "Vehicle"
    %typemap(javaout) Vehicle *vehicle_factory {
        return $jnicall;
      }
    
    %typemap(out) Vehicle *vehicle_factory {
      Ambulance *ambulance = dynamic_cast<Ambulance *>($1);
      FireEngine *fireengine = dynamic_cast<FireEngine *>($1);
      if (ambulance) {
        // call the Ambulance(long cPtr, boolean cMemoryOwn) constructor
        jclass clazz = jenv->FindClass("Ambulance");
        if (clazz) {
          jmethodID mid = jenv->GetMethodID(clazz, "<init>", "(JZ)V");
          if (mid) {
            jlong cptr = 0;
            *(Ambulance **)&cptr = ambulance;
            $result = jenv->NewObject(clazz, mid, cptr, false);
          }
        }
      } else if (fireengine) {
        // call the FireEngine(long cPtr, boolean cMemoryOwn) constructor
        jclass clazz = jenv->FindClass("FireEngine");
        if (clazz) {
          jmethodID mid = jenv->GetMethodID(clazz, "<init>", "(JZ)V");
          if (mid) {
            jlong cptr = 0;
            *(FireEngine **)&cptr = fireengine;
            $result = jenv->NewObject(clazz, mid, cptr, false);
          }
        }
      }
      else {
        cout << "Unexpected type " << endl;
      }
    
      if (!$result)
        cout << "Failed to create new java object" << endl;
    }
    

    Better error handling would need to be added into this code. There are other solutions to this problem, but this last example demonstrates some more involved JNI code. SWIG usually generates code which constructs the proxy classes using Java code as it is easier to handle error conditions and is faster. Note that the JNI code above uses a number of string lookups to call a constructor, whereas this would not occur using byte compiled Java code.

    26.10.8 Adding an equals method to the Java classes

    When a pointer is returned from a JNI function, it is wrapped using a new Java proxy class or type wrapper class. Even when the pointers are the same, it will not be possible to know that the two Java classes containing those pointers are actually the same object. It is common in Java to use the equals() method to check whether two objects are equivalent. The equals() method is usually accompanied by a hashCode() method in order to fulfill the requirement that the hash code is equal for equal objects. Pure Java code methods like these can be easily added:

    %typemap(javacode) SWIGTYPE %{
      public boolean equals(Object obj) {
        boolean equal = false;
        if (obj instanceof $javaclassname)
          equal = ((($javaclassname)obj).swigCPtr == this.swigCPtr);
        return equal;
      }
      public int hashCode() {
        return (int)getPointer();
      }
    %}
    
    class Foo { };
    Foo* returnFoo(Foo *foo) { return foo; }
    

    The following would display false without the javacode typemap above. With the typemap defining the equals method the result is true.

    Foo foo1 = new Foo();
    Foo foo2 = example.returnFoo(foo1);
    System.out.println("foo1? " + foo1.equals(foo2));
    

    26.10.9 Void pointers and a common Java base class

    One might wonder why the common code that SWIG emits for the proxy and type wrapper classes is not pushed into a base class. The reason is that although swigCPtr could be put into a common base class for all classes wrapping C structures, it would not work for C++ classes involved in an inheritance chain. Each class derived from a base needs a separate swigCPtr because C++ compilers sometimes use a different pointer value when casting a derived class to a base. Additionally as Java only supports single inheritance, it would not be possible to derive wrapped classes from your own pure Java classes if the base class has been 'used up' by SWIG. However, you may want to move some of the common code into a base class. Here is an example which uses a common base class for all proxy classes and type wrapper classes:

    %typemap(javabase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], 
                                                             SWIGTYPE (CLASS::*) "SWIG"
    
    %typemap(javacode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], 
                                                             SWIGTYPE (CLASS::*) %{
      protected long getPointer() {
        return swigCPtr;
      }
    %}
    

    Define new base class called SWIG:

    public abstract class SWIG {
      protected abstract long getPointer();
    
      public boolean equals(Object obj) {
        boolean equal = false;
        if (obj instanceof SWIG)
          equal = (((SWIG)obj).getPointer() == this.getPointer());
        return equal;
      }
      
      SWIGTYPE_p_void getVoidPointer() {
        return new SWIGTYPE_p_void(getPointer(), false);
      }
    }
    

    This example contains some useful functionality which you may want in your code.

    • It has an equals() method. Unlike the previous example, the method code isn't replicated in all classes.
    • It also has a function which effectively implements a cast from the type of the proxy/type wrapper class to a void pointer. This is necessary for passing a proxy class or a type wrapper class to a function that takes a void pointer.

    26.10.10 Struct pointer to pointer

    Pointers to pointers are often used as output parameters in C factory type functions. These are a bit more tricky to handle. Consider the following situation where a Butler can be hired and fired:

    typedef struct {
      int hoursAvailable;
      char *greeting;
    } Butler;
    
    // Note: HireButler will allocate the memory 
    // The caller must free the memory by calling FireButler()!!
    extern int HireButler(Butler **ppButler);
    extern void FireButler(Butler *pButler);
    

    C code implementation:

    int HireButler(Butler **ppButler) {
      Butler *pButler = (Butler *)malloc(sizeof(Butler));
      pButler->hoursAvailable = 24;
      pButler->greeting = (char *)malloc(32);
      strcpy(pButler->greeting, "At your service Sir");
      *ppButler = pButler;
      return 1;
    }
    void FireButler(Butler *pButler) {
      free(pButler->greeting);
      free(pButler);
    }
    

    Let's take two approaches to wrapping this code. The first is to provide a functional interface, much like the original C interface. The following Java code shows how we intend the code to be used:

    Butler jeeves = new Butler();
    example.HireButler(jeeves);
    System.out.println("Greeting:     " + jeeves.getGreeting());
    System.out.println("Availability: " + jeeves.getHoursAvailable() + " hours per day");
    example.FireButler(jeeves);
    

    Resulting in the following output when run:

    Greeting:     At your service Sir
    Availability: 24 hours per day
    

    Note the usage is very much like it would be used if we were writing C code, that is, explicit memory management is needed. No C memory is allocated in the construction of the Butler proxy class and the proxy class will not destroy the underlying C memory when it is collected. A number of typemaps and features are needed to implement this approach. The following interface file code should be placed before SWIG parses the above C code.

    %module example
    
    // Do not generate the default proxy constructor or destructor
    %nodefaultctor Butler;
    %nodefaultdtor Butler;
    
    // Add in pure Java code proxy constructor
    %typemap(javacode) Butler %{
      /** This constructor creates the proxy which initially does not create nor own any C memory */
      public Butler() {
        this(0, false);
      }
    %}
    
    // Type typemaps for marshalling Butler **
    %typemap(jni) Butler ** "jobject"
    %typemap(jtype) Butler ** "Butler"
    %typemap(jstype) Butler ** "Butler"
    
    // Typemaps for Butler ** as a parameter output type
    %typemap(in) Butler ** (Butler *ppButler = 0) %{
      $1 = &ppButler;
    %}
    %typemap(argout) Butler ** {
      // Give Java proxy the C pointer (of newly created object)
      jclass clazz = (*jenv)->FindClass(jenv, "Butler");
      jfieldID fid = (*jenv)->GetFieldID(jenv, clazz, "swigCPtr", "J");
      jlong cPtr = 0;
      *(Butler **)&cPtr = *$1;
      (*jenv)->SetLongField(jenv, $input, fid, cPtr);
    }
    %typemap(javain) Butler ** "$javainput"
    

    Note that the JNI code sets the proxy's swigCPtr member variable to point to the newly created object. The swigCMemOwn remains unchanged (at false), so that the proxy does not own the memory.

    Note: The old %nodefault directive disabled the default constructor and destructor at the same time. This is unsafe in most of the cases, and you can use the explicit %nodefaultctor and %nodefaultdtor directives to achieve the same result if needed.

    The second approach offers a more object oriented interface to the Java user. We do this by making the Java proxy class's constructor call the HireButler() method to create the underlying C object. Additionally we get the proxy to take ownership of the memory so that the finalizer will call the FireButler() function. The proxy class will thus take ownership of the memory and clean it up when no longer needed. We will also prevent the user from being able to explicitly call the HireButler() and FireButler() functions. Usage from Java will simply be:

    Butler jeeves = new Butler();
    System.out.println("Greeting:     " + jeeves.getGreeting());
    System.out.println("Availability: " + jeeves.getHoursAvailable() + " hours per day");
    

    Note that the Butler class is used just like any other Java class and no extra coding by the user needs to be written to clear up the underlying C memory as the finalizer will be called by the garbage collector which in turn will call the FireButler() function. To implement this, we use the above interface file code but remove the javacode typemap and add the following:

    // Don't expose the memory allocation/de-allocation functions
    %ignore FireButler(Butler *pButler);
    %ignore HireButler(Butler **ppButler);
    
    // Add in a custom proxy constructor and destructor
    %extend Butler {
      Butler() {
        Butler *pButler = 0;
        HireButler(&pButler);
        return pButler;
      }
      ~Butler() {
        FireButler($self);
      }
    }
    

    Note that the code in %extend is using a C++ type constructor and destructor, yet the generated code will still compile as C code, see Adding member functions to C structures. The C functional interface has been completely morphed into an object-oriented interface and the Butler class would behave much like any pure Java class and feel more natural to Java users.

    26.10.11 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable.

    Consider the following C++ code:

    struct Wheel {
      int size;
      Wheel(int sz = 0) : size(sz) {}
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from Java after running the code through SWIG:

    Wheel wheel = new Bike(10).getWheel();
    System.out.println("wheel size: " + wheel.getSize());
    // Simulate a garbage collection
    System.gc();
    System.runFinalization();
    System.out.println("wheel size: " + wheel.getSize());
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance a reference to the Bike must be added to the wheel instance. You can do this by adding the reference when the getWheel() method is called using the following typemaps.

    %typemap(javacode) Wheel %{
      // Ensure that the GC doesn't collect any Bike instance set from Java
      private Bike bikeReference;
      protected void addReference(Bike bike) {
        bikeReference = bike;
      }
    %}
    
    // Add a Java reference to prevent premature garbage collection and resulting use
    // of dangling C++ pointer. Intended for methods that return pointers or
    // references to a member variable.
    %typemap(javaout) Wheel& getWheel {
      long cPtr = $jnicall;
      $javaclassname ret = null;
      if (cPtr != 0) {
        ret = new $javaclassname(cPtr, $owner);
        ret.addReference(this);
      }
      return ret;
      }
    

    The code in the first typemap gets added to the Wheel proxy class. The code in the second typemap constitutes the bulk of the code in the generated getWheel() function:

    public class Wheel {
      ...
      // Ensure that the GC doesn't collect any bike set from Java 
      private Bike bikeReference;
      protected void addReference(Bike bike) {
        bikeReference = bike;
      }
    }
    
    public class Bike {
      ...
      public Wheel getWheel() {
        long cPtr = exampleJNI.Bike_getWheel(swigCPtr, this);
        Wheel ret = null;
        if (cPtr != 0) {
          ret = new Wheel(cPtr, false);
          ret.addReference(this);
        }
        return ret;
      }
    }
    

    Note the addReference call.

    26.10.12 Memory management for objects passed to the C++ layer

    Managing memory can be tricky when using C++ and Java proxy classes. The previous example shows one such case and this example looks at memory management for a class passed to a C++ method which expects the object to remain in scope after the function has returned. Consider the following two C++ classes:

    struct Element {
      int value;
      Element(int val) : value(val) {}
    };
    class Container {
      Element* element;
    public:
      Container() : element(0) {}
      void setElement(Element* e) { element = e; }
      Element* getElement() { return element; }
    };
    

    and usage from C++

    Container container;
    Element element(20);
    container.setElement(&element);
    cout << "element.value: " << container.getElement()->value << endl;
    

    and more or less equivalent usage from Java

    Container container = new Container();
    container.setElement(new Element(20));
    System.out.println("element value: " + container.getElement().getValue());
    

    The C++ code will always print out 20, but the value printed out may not be this in the Java equivalent code. In order to understand why, consider a garbage collection occurring...

    Container container = new Container();
    container.setElement(new Element(20));
    // Simulate a garbage collection
    System.gc();
    System.runFinalization();
    System.out.println("element value: " + container.getElement().getValue());
    

    The temporary element created with new Element(20) could get garbage collected which ultimately means the container variable is holding a dangling pointer, thereby printing out any old random value instead of the expected value of 20. One solution is to add in the appropriate references in the Java layer...

    public class Container {
    
      ...
    
      // Ensure that the GC doesn't collect any Element set from Java
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    
      public void setElement(Element e) {
        exampleJNI.Container_setElement(swigCPtr, this, Element.getCPtr(e), e);
        elementReference = e;
      }
    }
    

    The following typemaps can be used to generate this code:

    %typemap(javacode) Container %{
      // Ensure that the GC doesn't collect any element set from Java
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    %}
    
    %typemap(javain, 
             post="      elementReference = $javainput;"
             ) Element *e "Element.getCPtr($javainput)"
    

    The 'javacode' typemap simply adds in the specified code into the Java proxy class. The 'javain' typemap matches the input parameter type and name for the setElement method and the 'post' typemap attribute allows adding code after the JNI call. The 'post' code is generated into a finally block after the JNI call so the resulting code isn't quite as mentioned earlier, setElement is actually:

      public void setElement(Element e) {
        try {
          exampleJNI.Container_setElement(swigCPtr, this, Element.getCPtr(e), e);
        } finally {
          elementReference = e;
        }
      }
    

    26.10.13 Date marshalling using the javain typemap and associated attributes

    The NaN Exception example is a simple example of the "javain" typemap and its 'pre' attribute. This example demonstrates how a C++ date class, say CDate, can be mapped onto the standard Java date class, java.util.GregorianCalendar by using the 'pre', 'post' and 'pgcppname' attributes of the "javain" typemap. The idea is that the GregorianCalendar is used wherever the C++ API uses a CDate . Let's assume the code being wrapped is as follows:

    class CDate {
    public:
      CDate(int year, int month, int day);
      int getYear();
      int getMonth();
      int getDay();
      ...
    };
    struct Action {
      static int doSomething(const CDate &dateIn, CDate &dateOut);
      Action(const CDate &date, CDate &dateOut);
    };
    

    Note that dateIn is const and therefore read only and dateOut is a non-const output type.

    First let's look at the code that is generated by default, where the Java proxy class CDate is used in the proxy interface:

    public class Action {
      ...
      public static int doSomething(CDate dateIn, CDate dateOut) {
        return exampleJNI.Action_doSomething(CDate.getCPtr(dateIn), dateIn, 
                                             CDate.getCPtr(dateOut), dateOut);
      }
    
      public Action(CDate date, CDate dateOut) {
        this(exampleJNI.new_Action(CDate.getCPtr(date), date, 
                                   CDate.getCPtr(dateOut), dateOut), true);
      }
    }
    

    The CDate & and const CDate & Java code is generated from the following two default typemaps:

    %typemap(jstype) SWIGTYPE & "$javaclassname"
    %typemap(javain) SWIGTYPE & "$javaclassname.getCPtr($javainput)"
    

    where '$javaclassname' is translated into the proxy class name, CDate and '$javainput' is translated into the name of the parameter, eg dateIn. From Java, the intention is then to call into a modified API with something like:

    java.util.GregorianCalendar calendarIn = 
      new java.util.GregorianCalendar(2011, java.util.Calendar.APRIL, 13, 0, 0, 0);
    java.util.GregorianCalendar calendarOut = new java.util.GregorianCalendar();
    
    // Note in calls below, calendarIn remains unchanged and calendarOut 
    // is set to a new value by the C++ call
    Action.doSomething(calendarIn, calendarOut);
    Action action = new Action(calendarIn, calendarOut);
    

    To achieve this mapping, we need to alter the default code generation slightly so that at the Java layer, a GregorianCalendar is converted into a CDate. The JNI intermediary layer will still take a pointer to the underlying CDate class. The typemaps to achieve this are shown below.

    %typemap(jstype) const CDate& "java.util.GregorianCalendar"
    %typemap(javain, 
             pre="    CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), "
                 "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", 
             pgcppname="temp$javainput") const CDate &
             "$javaclassname.getCPtr(temp$javainput)"
    
    %typemap(jstype) CDate& "java.util.Calendar"
    %typemap(javain, 
             pre="    CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), "
                 "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", 
             post="      $javainput.set(temp$javainput.getYear(), temp$javainput.getMonth(), "
                  "temp$javainput.getDay(), 0, 0, 0);", 
             pgcppname="temp$javainput") CDate &
             "$javaclassname.getCPtr(temp$javainput)"
    

    The resulting generated proxy code in the Action class follows:

    public class Action {
      ...
      public static int doSomething(java.util.GregorianCalendar dateIn, 
                                    java.util.Calendar dateOut) {
        CDate tempdateIn = new CDate(dateIn.get(java.util.Calendar.YEAR), 
                                     dateIn.get(java.util.Calendar.MONTH), 
                                     dateIn.get(java.util.Calendar.DATE));
        CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), 
                                      dateOut.get(java.util.Calendar.MONTH), 
                                      dateOut.get(java.util.Calendar.DATE));
        try {
          return exampleJNI.Action_doSomething(CDate.getCPtr(tempdateIn), tempdateIn, 
                                               CDate.getCPtr(tempdateOut), tempdateOut);
        } finally {
          dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      static private long SwigConstructAction(java.util.GregorianCalendar date, 
                                              java.util.Calendar dateOut) {
        CDate tempdate = new CDate(date.get(java.util.Calendar.YEAR), 
                                   date.get(java.util.Calendar.MONTH), 
                                   date.get(java.util.Calendar.DATE));
        CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), 
                                      dateOut.get(java.util.Calendar.MONTH), 
                                      dateOut.get(java.util.Calendar.DATE));
        try {
          return exampleJNI.new_Action(CDate.getCPtr(tempdate), tempdate, 
                                       CDate.getCPtr(tempdateOut), tempdateOut);
        } finally {
          dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      public Action(java.util.GregorianCalendar date, java.util.Calendar dateOut) {
        this(Action.SwigConstructAction(date, dateOut), true);
      }
    }
    

    A few things to note:

    • The "javatype" typemap has changed the parameter type to java.util.GregorianCalendar or java.util.Calendar instead of the default generated CDate proxy.
    • The code in the 'pre' attribute appears before the JNI call ( exampleJNI.new_Action / exampleJNI.Action_doSomething).
    • The code in the 'post' attribute appears after the JNI call.
    • A try .. finally block is generated with the JNI call in the try block and 'post' code in the finally block. The alternative of just using a temporary variable for the return value from the JNI call and the 'post' code being generated before the return statement is not possible given that the JNI call is in one line and comes from the "javaout" typemap.
    • The temporary variables in the "javain" typemaps are called temp$javain, where "$javain" is replaced with the parameter name. "$javain" is used to mangle the variable name so that more than one CDate & type can be used as a parameter in a method, otherwise two or more local variables with the same name would be generated.
    • The use of the "javain" typemap causes a constructor helper function (SwigConstructAction) to be generated. This allows Java code to be called before the JNI call and is required as the Java compiler won't compile code inserted before the 'this' call.
    • The 'pgcppname' attribute is used to modify the object being passed as the premature garbage collection prevention parameter (the 2nd and 4th parameters in the JNI calls).

    26.11 Living with Java Directors

    This section is intended to address frequently asked questions and frequently encountered problems when using Java directors.

    1. When my program starts up, it complains that method_foo cannot be found in a Java method called swig_module_init. How do I fix this?

      Open up the C++ wrapper source code file and look for "method_foo" (include the double quotes, they are important!) Look at the JNI field descriptor and make sure that each class that occurs in the descriptor has the correct package name in front of it. If the package name is incorrect, put a "javapackage" typemap in your SWIG interface file.

    2. I'm compiling my code and I'm using templates. I provided a javapackage typemap, but SWIG doesn't generate the right JNI field descriptor.

      Use the template's renamed name as the argument to the "javapackage" typemap:

      %typemap(javapackage)  std::vector<int>  "your.package.here"
      %template(VectorOfInt) std::vector<int>;
      
    3. When I pass class pointers or references through a C++ upcall and I try to type cast them, Java complains with a ClassCastException. What am I doing wrong?

      Normally, a non-director generated Java proxy class creates temporary Java objects as follows:

      public static void MyClass_method_upcall(MyClass self, long jarg1)
      {
        Foo darg1 = new Foo(jarg1, false);
      
        self.method_upcall(darg1);
      }
      

      Unfortunately, this loses the Java type information that is part of the underlying Foo director proxy class's Java object pointer causing the type cast to fail. The SWIG Java module's director code attempts to correct the problem, but only for director-enabled classes, since the director class retains a global reference to its Java object. Thus, for director-enabled classes and only for director-enabled classes, the generated proxy Java code looks something like:

      public static void MyClass_method_upcall(MyClass self, long jarg1,
                                               Foo jarg1_object)
      {
        Foo darg1 = (jarg1_object != null ? jarg1_object : new Foo(jarg1, false));
      
        self.method_upcall(darg1);
      }
      

      When you import a SWIG interface file containing class definitions, the classes you want to be director-enabled must be have the feature("director") enabled for type symmetry to work. This applies even when the class being wrapped isn't a director-enabled class but takes parameters that are director-enabled classes.

      The current "type symmetry" design will work for simple C++ inheritance, but will most likely fail for anything more complicated such as tree or diamond C++ inheritance hierarchies. Those who are interested in challenging problems are more than welcome to hack the Java::Java_director_declaration method in Source/Modules/java.cxx.

      If all else fails, you can use the downcastXXXXX() method to attempt to recover the director class's Java object pointer. For the Java Foo proxy class, the Foo director class's java object pointer can be accessed through the javaObjectFoo() method. The generated method's signature is:

        public static Foo javaObjectFoo(Foo obj);
      

      From your code, this method is invoked as follows:

      public class MyClassDerived {
        public void method_upcall(Foo foo_object)
        {
          FooDerived    derived = (foo_object != null ?
                       (FooDerived) Foo.downcastFoo(foo_object) : null);
          /* rest of your code here */
        }
      }
      

      An good approach for managing downcasting is placing a static method in each derived class that performs the downcast from the superclass, e.g.,

      public class FooDerived extends Foo {
        /* ... */
        public static FooDerived downcastFooDerived(Foo foo_object)
        {
          try {
            return foo_object != null ? (FooDerived) Foo.downcastFoo(foo_object);
          }
      
          catch (ClassCastException exc) {
            // Wasn't a FooDerived object, some other subclass of Foo
            return null;
          }
        }
      }
      

      Then change the code in MyClassDerived as follows:

      public class MyClassDerived extends MyClass {
        /* ... */
        public void method_upcall(Foo foo_object)
        {
          FooDerived    derived = FooDerived.downcastFooDerived(foo_object);
          /* rest of your code here */
        }
      }
      
    4. Why isn't the proxy class declared abstract? Why aren't the director upcall methods in the proxy class declared abstract?

      Declaring the proxy class and its methods abstract would break the JNI argument marshalling and SWIG's downcall functionality (going from Java to C++.) Create an abstract Java subclass that inherits from the director-enabled class instead. Using the previous Foo class example:

      public abstract class UserVisibleFoo extends Foo {
        /** Make sure user overrides this method, it's where the upcall
         * happens.
         */
        public abstract void method_upcall(Foo foo_object);
      
        /// Downcast from Foo to UserVisibleFoo
        public static UserVisibleFoo downcastUserVisibleFoo(Foo foo_object)
        {
          try {
            return foo_object != null ? (FooDerived) Foo.downcastFoo(foo_object) : null;
          } catch (ClassCastException exc) {
            // Wasn't a FooDerived object, some other subclass of Foo
            return null;
          }
        }
      }
      

      This doesn't prevent the user from creating subclasses derived from Foo, however, UserVisibleFoo provides the safety net that reminds the user to override the method_upcall() method.

    26.12 Odds and ends

    26.12.1 JavaDoc comments

    The SWIG documentation system is currently deprecated. When it is resurrected JavaDoc comments will be fully supported. If you can't wait for the full documentation system a couple of workarounds are available. The %javamethodmodifiers feature can be used for adding proxy class method comments and module class method comments. The "javaimports" typemap can be hijacked for adding in proxy class JavaDoc comments. The jniclassimports or jniclassclassmodifiers pragmas can also be used for adding intermediary JNI class comments and likewise the moduleimports or moduleclassmodifiers pragmas for the module class. Here is an example adding in a proxy class and method comment:

    %javamethodmodifiers Barmy::lose_marbles() "
      /**
        * Calling this method will make you mad.
        * Use with <b>utmost</b> caution. 
        */
      public";
    
    %typemap(javaimports) Barmy "
    /** The crazy class. Use as a last resort. */"
    
    class Barmy {
    public:
      void lose_marbles() {}
    };
    

    Note the "public" added at the end of the %javamethodmodifiers as this is the default for this feature. The generated proxy class with JavaDoc comments is then as follows:

    /** The crazy class. Use as a last resort. */
    public class Barmy {
    ...
      /**
        * Calling this method will make you mad.
        * Use with <b>utmost</b> caution. 
        */
      public void lose_marbles() {
        ...
      }
    ...
    }
    

    26.12.2 Functional interface without proxy classes

    It is possible to run SWIG in a mode that does not produce proxy classes by using the -noproxy commandline option. The interface is rather primitive when wrapping structures or classes and is accessed through function calls to the module class. All the functions in the module class are wrapped by functions with identical names as those in the intermediary JNI class.

    Consider the example we looked at when examining proxy classes:

    class Foo {
    public:
      int x;
      int spam(int num, Foo* foo);
    };
    

    When using -noproxy, type wrapper classes are generated instead of proxy classes. Access to all the functions and variables is through a C like set of functions where the first parameter passed is the pointer to the class, that is an instance of a type wrapper class. Here is what the module class looks like:

    public class example {
      public static void Foo_x_get(SWIGTYPE_p_Foo self, int x) {...}
      public static int Foo_x_get(SWIGTYPE_p_Foo self) {...}
      public static int Foo_spam(SWIGTYPE_p_Foo self, int num, SWIGTYPE_p_Foo foo) {...}
      public static SWIGTYPE_p_Foo new_Foo() {...}
      public static void delete_Foo(SWIGTYPE_p_Foo self) {...}
    }
    

    This approach is not nearly as natural as using proxy classes as the functions need to be used like this:

    SWIGTYPE_p_Foo foo = example.new_Foo();
    example.Foo_x_set(foo, 10);
    int var = example.Foo_x_get(foo);
    example.Foo_spam(foo, 20, foo);
    example.delete_Foo(foo);
    

    Unlike proxy classes, there is no attempt at tracking memory. All destructors have to be called manually for example the delete_Foo(foo) call above.

    26.12.3 Using your own JNI functions

    You may have some hand written JNI functions that you want to use in addition to the SWIG generated JNI functions. Adding these to your SWIG generated package is possible using the %native directive. If you don't want SWIG to wrap your JNI function then of course you can simply use the %ignore directive. However, if you want SWIG to generate just the Java code for a JNI function then use the %native directive. The C types for the parameters and return type must be specified in place of the JNI types and the function name must be the native method name. For example:

    %native (HandRolled) void HandRolled(int, char *);
    %{
    JNIEXPORT void JNICALL Java_packageName_moduleName_HandRolled(JNIEnv *, jclass,
                                                                  jlong, jstring);
    %}
    

    No C JNI function will be generated and the Java_packageName_moduleName_HandRolled function will be accessible using the SWIG generated Java native method call in the intermediary JNI class which will look like this:

      public final static native void HandRolled(int jarg1, String jarg2);
    

    and as usual this function is wrapped by another which for a global C function would appear in the module class:

      public static void HandRolled(int arg0, String arg1) {
        exampleJNI.HandRolled(arg0, arg1);
      }
    

    The packageName and moduleName must of course be correct else you will get linker errors when the JVM dynamically loads the JNI function. You may have to add in some "jtype", "jstype", "javain" and "javaout" typemaps when wrapping some JNI types. Here the default typemaps work for int and char *.

    In summary the %native directive is telling SWIG to generate the Java code to access the JNI C code, but not the JNI C function itself. This directive is only really useful if you want to mix your own hand crafted JNI code and the SWIG generated code into one Java class or package.

    26.12.4 Performance concerns and hints

    If you're directly manipulating huge arrays of complex objects from Java, performance may suffer greatly when using the array functions in arrays_java.i. Try and minimise the expensive JNI calls to C/C++ functions, perhaps by using temporary Java variables instead of accessing the information directly from the C/C++ object.

    Java classes without any finalizers generally speed up code execution as there is less for the garbage collector to do. Finalizer generation can be stopped by using an empty javafinalize typemap:

    %typemap(javafinalize) SWIGTYPE ""
    

    However, you will have to be careful about memory management and make sure that you code in a call to the delete() member function. This method normally calls the C++ destructor or free() for C code.

    26.12.5 Debugging

    The generated code can be debugged using both a Java debugger and a C++ debugger using the usual debugging techniques. Breakpoints can be set in either Java or C++ code and so both can be debugged simultaneously. Most debuggers do not understand both Java and C++, with one noteable exception of Sun Studio, where it is possible to step from Java code into a JNI method within one environment.

    Alternatively, debugging can involve placing debug printout statements in the JNI layer using the %exception directive. See the special variables for %exception section. Many of the default typemaps can also be overridden and modified for adding in extra logging/debug display information.

    The -Xcheck:jni and -Xcheck:nabounds Java executable options are useful for debugging to make sure the JNI code is behaving. The -verbose:jni and -verbose:gc are also useful options for monitoring code behaviour.

    26.13 Java Examples

    The directory Examples/java has a number of further examples. Take a look at these if you want to see some of the techniques described in action. The Examples/index.html file in the parent directory contains the SWIG Examples Documentation and is a useful starting point. If your SWIG installation went well Unix users should be able to type make in each example directory, then java main to see them running. For the benefit of Windows users, there are also Visual C++ project files in a couple of the Windows Examples . There are also many regression tests in the Examples/test-suite directory. Many of these have runtime tests in the java subdirectory.


    27 SWIG and Javascript

    This chapter describes SWIG's support of Javascript. It does not cover SWIG basics, but only information that is specific to this module.

    27.1 Overview

    Javascript is a prototype-based scripting language that is dynamic, weakly typed and has first-class functions. Its arguably the most popular language for web development. Javascript has gone beyond being a browser-based scripting language and with node.js, it is also used as a backend development language.

    Native Javascript extensions can be used for applications that embed a web-browser view or that embed a Javascript engine (such as node.js). Extending a general purpose web-browser is not possible as this would be a severe security issue.

    SWIG Javascript currently supports JavascriptCore, the Javascript engine used by Safari/Webkit, and v8, which is used by Chromium and node.js.

    WebKit is a modern browser implementation available as open-source which can be embedded into an application. With node-webkit there is a platform which uses Google's Chromium as Web-Browser widget and node.js for javascript extensions.

    27.2 Preliminaries

    27.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    %module example
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo;

    To build a Javascript module, run SWIG using the -javascript option and a desired target engine -jsc, -v8, or -node. The generator for node is essentially delegating to the v8 generator and adds some necessary preprocessor definitions.

    $ swig -javascript -jsc example.i

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -javascript -jsc example.i

    The V8 code that SWIG generates should work with most versions from 3.11.10 up to 3.29.14 and later.

    The API headers for V8 >= 4.3.0 define constants which SWIG can use to determine the V8 version it is compiling for. For versions < 4.3.0, you need to specify the V8 version when running SWIG. This is specified as a hex constant, but the constant is read as pairs of decimal digits, so for V8 3.25.30 use constant 0x032530. This scheme can't represent components > 99, but this constant is only useful for V8 < 4.3.0, and no V8 versions from that era had a component > 99. For example:

    $ swig -c++ -javascript -v8 -DV8_VERSION=0x032530 example.i

    If you're targeting V8 >= 4.3.0, you would just run swig like so:

    $ swig -c++ -javascript -v8 example.i

    This creates a C/C++ source file example_wrap.c or example_wrap.cxx. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The wrapped module will export one function which must be called to register the module with the Javascript interpreter. For example, if your module is named example the corresponding initializer for JavascriptCore would be

    bool example_initialize(JSGlobalContextRef context, JSObjectRef *exports)

    and for v8:

    void example_initialize(v8::Handle<v8::Object> exports)

    Note: be aware that v8 has a C++ API, and thus, the generated modules must be compiled as C++.

    27.2.2 Running Tests and Examples

    The configuration for tests and examples currently supports Linux and Mac only and not MinGW (Windows) yet.

    The default interpreter is node.js as it is available on all platforms and convenient to use.

    Running the examples with JavascriptCore requires libjavascriptcoregtk-1.0 to be installed, e.g., under Ubuntu with

    $ sudo apt-get install libjavascriptcoregtk-1.0-dev

    Running with V8 requires libv8:

    $ sudo apt-get install libv8-dev

    Examples can be run using

    $ make check-javascript-examples ENGINE=jsc

    ENGINE can be node, jsc, or v8.

    The test-suite can be run using

    $ make check-javascript-test-suite ENGINE=jsc

    You can specify a specific V8 version for running the examples and tests

    $ make check-javascript-examples V8_VERSION=0x032530 ENGINE=v8

    27.2.3 Known Issues

    At the moment, the Javascript generators pass all tests syntactically, i.e., the generated source code compiles. However, there are still remaining runtime issues.

    • Default optional arguments do not work for all targeted interpreters

    • Multiple output arguments do not work for JSC

    • C89 incompatibility: the JSC generator might still generate C89 violating code

    • long long is not supported

    • Javascript callbacks are not supported

    • instanceOf does not work under JSC

    The primary development environment has been Linux (Ubuntu 12.04). Windows and Mac OS X have been tested sporadically. Therefore, the generators might have more issues on those platforms. Please report back any problem you observe to help us improving this module quickly.

    27.3 Integration

    This chapter gives a short introduction how to use a native Javascript extension: as a node.js module, and as an extension for an embedded Webkit.

    27.3.1 Creating node.js Extensions

    To install node.js you can download an installer from their web-site for Mac OS X and Windows. For Linux you can either build the source yourself and run sudo checkinstall or keep to the (probably stone-age) packaged version. For Ubuntu there is a PPA available.

    $ sudo add-apt-repository ppa:chris-lea/node.js
    $ sudo apt-get update
    $ sudo apt-get install nodejs

    As v8 is written in C++ and comes as a C++ library it is crucial to compile your module using the same compiler flags as used for building v8. To make things easier, node.js provides a build tool called node-gyp.

    You have to install it using npm:

    $ sudo npm install -g node-gyp

    node-gyp expects a configuration file named binding.gyp which is basically in JSON format and conforms to the same format that is used with Google's build-tool gyp.

    binding.gyp:

    {
      "targets": [
        {
          "target_name": "example",
          "sources": [ "example.cxx", "example_wrap.cxx" ]
        }
      ]
    }

    First create the wrapper using SWIG:

    $ swig -javascript -node -c++ example.i

    Then run node-gyp build to actually create the module:

    $ node-gyp build

    This will create a build folder containing the native module. To use the extension you need to 'require' it in your Javascript source file:

    require("./build/Release/example")

    A more detailed explanation is given in the Examples section.

    27.3.1.1 Troubleshooting

    • 'module' object has no attribute 'script_main'

    This error happens when gyp is installed as a distribution package. It seems to be outdated. Removing it resolves the problem.

    $ sudo apt-get remove gyp

    27.3.2 Embedded Webkit

    Webkit is pre-installed on Mac OS X and available as a library for GTK.

    27.3.2.1 Mac OS X

    There is general information about programming with WebKit on Apple Developer Documentation. Details about Cocoa programming are not covered here.

    An integration of a native extension 'example' would look like this:

    #import "appDelegate.h"
    
    extern bool example_initialize(JSGlobalContextRef context, JSObjectRef* exports);
    
    
    @implementation ExampleAppDelegate
    
    @synthesize webView;
    
    - (void)addGlobalObject:(JSContextRef) context:(NSString *)objectName:(JSObjectRef) theObject {
      JSObjectRef global = JSContextGetGlobalObject(context);
      JSStringRef objectJSName = JSStringCreateWithCFString( (CFStringRef) objectName )
      if ( objectJSName != NULL ) {
        JSObjectSetProperty(context, global, objectJSName, theObject, kJSPropertyAttributeReadOnly, NULL);
        JSStringRelease( objectJSName );
      }
    }
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    
      // Start a webview with the bundled index.html file
      NSString *path = [[NSBundle mainBundle] bundlePath];
      NSString *url =  [NSString stringWithFormat: @"file://%@/Contents/Assets/index.html", path];
    
      WebFrame *webframe = [webView mainFrame];
      JSGlobalContextRef context = [webframe globalContext];
    
      JSObjectRef example;
      example_initialize(context, &example);
      [self addGlobalObject:context:@"example":example]
    
      JSObjectSetProperty(context, global, JSStringRef propertyName, example, JSPropertyAttributes attributes, NULL);
    
      [ [webView mainFrame] loadRequest:
        [NSURLRequest requestWithURL: [NSURL URLWithString:url] ]
      ];
    }
    
    @end

    27.3.2.2 GTK

    There is general information about programming GTK at GTK documentation and in the GTK tutorial, and for Webkit there is a Webkit GTK+ API Reference.

    An integration of a native extension 'example' would look like this:

    #include <gtk/gtk.h>
    #include <webkit/webkit.h>
    
    extern bool example_initialize(JSGlobalContextRef context);
    
    int main(int argc, char* argv[])
    {
      // Initialize GTK+
      gtk_init(&argc, &argv);
    
      ...
    
      // Create a browser instance
      WebKitWebView *webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
      WebFrame *webframe = webkit_web_view_get_main_frame(webView);
      JSGlobalContextRef context = webkit_web_frame_get_global_context(webFrame);
      JSObjectRef global = JSContextGetGlobalObject(context);
    
      JSObjectRef exampleModule;
      example_initialize(context, &exampleModule);
      JSStringRef jsName = JSStringCreateWithUTF8CString("example");
      JSObjectSetProperty(context, global, jsName, exampleModule, kJSPropertyAttributeReadOnly, NULL);
      JSStringRelease(jsName);
    
      ...
    
      // Load a web page into the browser instance
      webkit_web_view_load_uri(webView, "http://www.webkitgtk.org/");
    
      ...
    
      // Run the main GTK+ event loop
      gtk_main();
    
      return 0;
    }

    27.3.3 Creating Applications with node-webkit

    To get started with node-webkit there is a very informative set of wiki pages.

    Similar to node.js, node-webkit is started from command line within a node.js project directory. Native extensions are created in the very same way as for node.js , except that a customized gyp derivate has to be used: nw-gyp.

    A simple example would have the following structure:

    - package.json
    - app.html
    - app.js
    - node_modules
      / example
      ... (as known from node.js)
    

    The configuration file essentially conforms to node.js syntax. It has some extras to configure node-webkit. See the Manifest specification for more details.

    package.json:

    {
      "name": "example",
      "main": "app.html",
      "window": {
        "show": true,
        "width": 800,
        "height": 600
      }
    }

    The 'main' property of package.json specifies a web-page to be rendered in the main window.

    app.html:

    <html>
      <head>
        <script src="app.js"></script>
      </head>
      <body>
        <div>
          The greatest common divisor of
          <span id="x"></span> and
          <span id="y"></span> is
          <span id="z"></span>.
        </div>
      </body>
    </html>

    As known from node.js one can use require to load javascript modules. Additionally, node-webkit provides an API that allows to manipulate the window's menu, open new windows, and many more things.

    app.js:

    window.onload = function() {
      var example = require("example");
      var x = 18;
      var y = 24;
      var z = example.gcd(x, y);
      document.querySelector('#x').innerHTML = x;
      document.querySelector('#y').innerHTML = y;
      document.querySelector('#z').innerHTML = z;
    };

    27.4 Examples

    Some basic examples are shown here in more detail.

    27.4.1 Simple

    The common example simple looks like this:

    /* File : example.i */
    %module example
    
    %inline %{
    extern int    gcd(int x, int y);
    extern double Foo;
    %}

    To make this available as a node extension a binding.gyp has to be created:

    {
      "targets": [
        {
          "target_name": "example",
          "sources": [ "example.cxx", "example_wrap.cxx" ]
        }
      ]
    }

    Then node-gyp is used to build the extension:

    $ node-gyp configure build

    From a 'nodejs` application the extension would be used like this:

    // import the extension via require
    var example = require("./build/Release/example");
    
    // calling the global method
    var x = 42;
    var y = 105;
    var g = example.gcd(x, y);
    
    // Accessing the global variable
    var f = example.Foo;
    example.Foo = 3.1415926;

    First the module example is loaded from the previously built extension. Global methods and variables are available in the scope of the module.

    Note: ECMAScript 5, the currently implemented Javascript standard, does not have modules. node.js and other implementations provide this mechanism defined by the CommonJS group. For browsers this is provided by Browserify, for instance.

    27.4.2 Class

    The common example class defines three classes, Shape, Circle, and Square:

    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      }
      double  x, y;
      void    move(double dx, double dy);
      virtual double area(void) = 0;
      virtual double perimeter(void) = 0;
      static  int nshapes;
    };
    
    class Circle : public Shape {
    private:
      double radius;
    public:
      Circle(double r) : radius(r) { }
      virtual double area(void);
      virtual double perimeter(void);
    };
    
    class Square : public Shape {
    private:
      double width;
    public:
      Square(double w) : width(w) { }
      virtual double area(void);
      virtual double perimeter(void);
    };

    Circle and Square inherit from Shape . Shape has a static variable nshapes, a function move that can't be overridden (non-virtual), and two abstract functions area and perimeter (pure virtual) that must be overridden by the sub-classes.

    A nodejs extension is built the same way as for the simple example.

    In Javascript it can be used as follows:

    var example = require("./build/Release/example");
    
    // local aliases for convenience
    var Shape = example.Shape;
    var Circle = example.Circle;
    var Square = example.Square;
    
    // creating new instances using the 'new' operator
    var c = new Circle(10);
    var s = new Square(10);
    
    // accessing a static member
    Shape.nshapes;
    
    // accessing member variables
    c.x = 20;
    c.y = 30;
    s.x = -10;
    s.y = 5;
    
    // calling some methods
    c.area();
    c.perimeter();
    s.area();
    s.perimeter();
    
    // instantiation of Shape is not permitted
    new Shape();

    Running these commands in an interactive node shell results in the following output:

    $ node -i
    & var example = require("./build/Release/example");
    undefined
    & var Shape = example.Shape;
    undefined
    & var Circle = example.Circle;
    undefined
    & var Square = example.Square;
    undefined
    & var c = new Circle(10);
    undefined
    & var s = new Square(10);
    undefined
    & Shape.nshapes;
    2
    & c.x = 20;
    20
    & c.y = 30;
    30
    & s.x = -10;
    -10
    & s.y = 5;
    5
    & c.area();
    314.1592653589793
    & c.perimeter();
    62.83185307179586
    & s.area();
    100
    & s.perimeter();
    40
    & c.move(40, 40)
    undefined
    & c.x
    60
    & c.y
    70
    & new Shape()
    Error: Class Shape can not be instantiated
    at repl:1:2
    at REPLServer.self.eval (repl.js:110:21)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.EventEmitter.emit (events.js:95:17)
    at Interface._onLine (readline.js:202:10)
    at Interface._line (readline.js:531:8)
    at Interface._ttyWrite (readline.js:760:14)
    at ReadStream.onkeypress (readline.js:99:10)
    at ReadStream.EventEmitter.emit (events.js:98:17)
    at emitKey (readline.js:1095:12)

    Note: In ECMAScript 5 there is no concept for classes. Instead each function can be used as a constructor function which is executed by the 'new' operator. Furthermore, during construction the key property prototype of the constructor function is used to attach a prototype instance to the created object. A prototype is essentially an object itself that is the first-class delegate of a class used whenever the access to a property of an object fails. The very same prototype instance is shared among all instances of one type. Prototypal inheritance is explained in more detail on in Inheritance and the prototype chain, for instance.

    27.5 Implementation

    The Javascript Module implementation has taken a very different approach compared to other language modules in order to support different Javascript interpreters.

    27.5.1 Source Code

    The Javascript module is implemented in Source/Modules/javascript.cxx. It dispatches the code generation to a JSEmitter instance, V8Emitter or JSCEmitter. Additionally there are some helpers: Template , for templated code generation, and JSEmitterState, which is used to manage state information during AST traversal. This rough map shall make it easier to find a way through this huge source file:

    // module wide defines
    
    #define NAME "name"
    ...
    
    // ###############################
    // #  Helper class declarations
    
    class JSEmitterState { ... };
    
    class Template { ... };
    
    // ###############################
    // # JSEmitter declaration
    
    class JSEmitter { ... };
    
    // Emitter factory declarations
    
    JSEmitter *swig_javascript_create_JSCEmitter();
    JSEmitter *swig_javascript_create_V8Emitter();
    
    // ###############################
    // # Javascript module
    
    // Javascript module declaration
    
    class JAVASCRIPT:public Language { ... };
    
    // Javascript module implementation
    
    int JAVASCRIPT::functionWrapper(Node *n) { ... }
    ...
    
    // Module factory implementation
    
    static Language *new_swig_javascript() { ... }
    
    extern "C" Language *swig_javascript(void) { ... }
    
    // ###############################
    // # JSEmitter base implementation
    
    JSEmitter::JSEmitter() { ... }
    
    Template JSEmitter::getTemplate(const String *name) { ... }
    ...
    
    // ###############################
    // # JSCEmitter
    
    // JSCEmitter declaration
    
    class JSCEmitter: public JSEmitter { ... };
    
    // JSCEmitter implementation
    
    JSCEmitter::JSCEmitter() { ... }
    
    void JSCEmitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) { ... }
    ...
    
    // JSCEmitter factory
    
    JSEmitter *swig_javascript_create_JSCEmitter() { ... }
    
    
    // ###############################
    // # V8Emitter
    
    // V8Emitter declaration
    
    class V8Emitter: public JSEmitter { ... };
    
    // V8Emitter implementation
    
    V8Emitter::V8Emitter() { ... }
    
    int V8Emitter::initialize(Node *n) { ... }
    
    // V8Emitter factory
    
    JSEmitter *swig_javascript_create_V8Emitter() { ... }
    
    
    // ###############################
    // # Helper implementation (JSEmitterState, Template)
    
    JSEmitterState::JSEmitterState() { ... }
    ...
    
    Template::Template(const String *code_) { ... }
    ...

    27.5.2 Code Templates

    All generated code is created on the basis of code templates. The templates for JavascriptCore can be found in Lib/javascript/jsc/javascriptcode.swg, for v8 in Lib/javascript/v8/javascriptcode.swg.

    To track the originating code template for generated code you can run

    $ swig -javascript -jsc -debug-codetemplates

    which wraps generated code with a descriptive comment

    /* begin fragment("template_name") */
    
    ...generated code ...
    
    /* end fragment("template_name") */

    The Template class is used like this:

    Template t_register = getTemplate("jsv8_register_static_variable");
    t_register.replace("$jsparent", state.clazz(NAME_MANGLED))
        .replace("$jsname", state.variable(NAME))
        .replace("$jsgetter", state.variable(GETTER))
        .replace("$jssetter", state.variable(SETTER))
        .trim().
        print(f_init_static_wrappers);

    A code template is registered with the JSEmitter via fragment(name, "template"), e.g.,

    %fragment ("jsc_variable_declaration", "templates")
    %{
      {"$jsname", $jsgetter, $jssetter, kJSPropertyAttributeNone},
    %}

    Template creates a copy of that string and Template::replace uses Swig's Replaceall to replace variables in the template. Template::trim can be used to eliminate leading and trailing whitespaces. Template::print is used to write the final template string to a Swig DOH (based on Printv). All methods allow chaining.

    27.5.3 Emitter

    The Javascript module delegates code generation to a JSEmitter instance. The following extract shows the essential interface:

    class JSEmitter {
      ...
    
      /**
       * Opens output files and temporary output DOHs.
       */
      virtual int initialize(Node *n);
    
      /**
       * Writes all collected code into the output file(s).
       */
      virtual int dump(Node *n) = 0;
    
      /**
       * Cleans up all open output DOHs.
       */
      virtual int close() = 0;
    
      ...
    
      /**
       * Invoked at the beginning of the classHandler.
       */
      virtual int enterClass(Node *);
    
      /**
       * Invoked at the end of the classHandler.
       */
      virtual int exitClass(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked at the beginning of the variableHandler.
       */
      virtual int enterVariable(Node *);
    
      /**
       * Invoked at the end of the variableHandler.
       */
      virtual int exitVariable(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked at the beginning of the functionHandler.
       */
      virtual int enterFunction(Node *);
    
      /**
       * Invoked at the end of the functionHandler.
       */
      virtual int exitFunction(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked by functionWrapper callback after call to Language::functionWrapper.
       */
      virtual int emitWrapperFunction(Node *n);
    
      /**
       * Invoked from constantWrapper after call to Language::constantWrapper.
       **/
      virtual int emitConstant(Node *n);
    
      /**
       * Registers a given code snippet for a given key name.
       *
       * This method is called by the fragmentDirective handler
       * of the JAVASCRIPT language module.
       **/
      int registerTemplate(const String *name, const String *code);
    
      /**
       * Retrieve the code template registered for a given name.
       */
      Template getTemplate(const String *name);
    
      State &getState();
    
      ...
    
    }

    The module calls initialize, dump, and close from within the top method:

    int JAVASCRIPT::top(Node *n) {
      emitter->initialize(n);
    
      Language::top(n);
    
      emitter->dump(n);
      emitter->close();
    
      return SWIG_OK;
    }

    The methods enterClass and exitClass are called from within the classHandler method:

    int JAVASCRIPT::classHandler(Node *n) {
    
      emitter->enterClass(n);
      Language::classHandler(n);
      emitter->exitClass(n);
    
      return SWIG_OK;
    }

    In enterClass the emitter stores state information that is necessary when processing class members. In exitClass the wrapper code for the whole class is generated.

    27.5.4 Emitter states

    For storing information during the AST traversal the emitter provides a JSEmitterState with different slots to store data representing the scopes global, class, function, and variable.

    class JSEmitterState {
    
    public:
    
      JSEmitterState();
    
      ~JSEmitterState();
    
      DOH *global();
    
      DOH *global(const char* key, DOH *initial = 0);
    
      DOH *clazz(bool reset = false);
    
      DOH *clazz(const char* key, DOH *initial = 0);
    
      DOH *function(bool reset = false);
    
      DOH *function(const char* key, DOH *initial = 0);
    
      DOH *variable(bool reset = false);
    
      DOH *variable(const char* key, DOH *initial = 0);
    
      static int IsSet(DOH *val);
    
      ...
    };

    When entering a scope, such as in enterClass, the corresponding state is reset and new data is stored:

    state.clazz(RESET);
    state.clazz(NAME, Getattr(n, "sym:name"));

    State information can be retrieved using state.clazz(NAME) or with Getattr on state.clazz() which actually returns a Hash instance.

    27.5.5 Handling Exceptions in JavascriptCore

    Applications with an embedded JavascriptCore should be able to present detailed exception messages that occur in the Javascript engine. Below is an example derived from code provided by Brian Barnes on how these exception details can be extracted.

    void script_exception_to_string(JSContextRef js_context, JSValueRef exception_value_ref, char* return_error_string, int return_error_string_max_length)
    {
      JSObjectRef exception_object;
      JSValueRef value_ref;
      JSStringRef jsstring_property_name = NULL;
      JSValueRef temporary_exception = NULL;
      JSStringRef js_return_string = NULL;
      size_t bytes_needed;
      char* c_result_string = NULL;
      exception_object = JSValueToObject(js_context, exception_value_ref, NULL);
    
      /* source url */
      strcpy(return_error_string, "[");
      jsstring_property_name = JSStringCreateWithUTF8CString("sourceURL");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
      bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
      c_result_string = (char*)calloc(bytes_needed, sizeof(char));
      JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
      JSStringRelease(js_return_string);
      strncat(return_error_string, c_result_string, return_error_string_max_length-1);
      free(c_result_string);
    
      strncat(return_error_string, ":", return_error_string_max_length-1);
    
      /* line number */
    
      jsstring_property_name = JSStringCreateWithUTF8CString("line");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
      bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
      c_result_string = (char*)calloc(bytes_needed, sizeof(char));
      JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
      JSStringRelease(js_return_string);
      strncat(return_error_string, c_result_string, return_error_string_max_length-1);
      free(c_result_string);
    
      strncat(return_error_string, "]", return_error_string_max_length-1);
    
      /* error message */
    
      jsstring_property_name = JSStringCreateWithUTF8CString("message");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      if(NULL == value_ref)
      {
        strncat(return_error_string, "Unknown Error", return_error_string_max_length-1);
      }
      else
      {
        js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
        bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
        c_result_string = (char*)calloc(bytes_needed, sizeof(char));
        JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
        JSStringRelease(js_return_string);
        strncat(return_error_string, c_result_string, return_error_string_max_length-1);
        free(c_result_string);
      }
    }

    It would be used in the following way:

    if(js_exception)
    {
      char return_error_string[256];
      script_exception_to_string(js_context, js_exception, return_error_string, 256);
      printf("Compile error is %s", return_error_string);
    }

    28 SWIG and Lua

    Lua is an extension programming language designed to support general procedural programming with data description facilities. It also offers good support for object-oriented programming, functional programming, and data-driven programming. Lua is intended to be used as a powerful, light-weight configuration language for any program that needs one. Lua is implemented as a library, written in clean C (that is, in the common subset of ISO C and C++). It's also a really tiny language, less than 6000 lines of code, which compiles to <100 kilobytes of binary code. It can be found at http://www.lua.org

    eLua stands for Embedded Lua (can be thought of as a flavor of Lua) and offers the full implementation of the Lua programming language to the embedded world, extending it with specific features for efficient and portable software embedded development. eLua runs on smaller devices like microcontrollers and provides the full features of the regular Lua desktop version. More information on eLua can be found here: http://www.eluaproject.net

    28.1 Preliminaries

    The current SWIG implementation is designed to work with Lua 5.0.x, 5.1.x and 5.2.x. It should work with later versions of Lua, but certainly not with Lua 4.0 due to substantial API changes. It is possible to either static link or dynamic link a Lua module into the interpreter (normally Lua static links its libraries, as dynamic linking is not available on all platforms). SWIG also has support for eLua starting from eLua 0.8. Due to substantial changes between SWIG 2.x and SWIG 3.0 and unavailability of testing platform, eLua status was downgraded to 'experimental'.

    28.2 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    %module example
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo;
    

    To build a Lua module, run SWIG using the -lua option.

    $ swig -lua example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -lua example.i
    

    This creates a C/C++ source file example_wrap.c or example_wrap.cxx. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The wrapped module will export one function "int luaopen_example(lua_State* L)" which must be called to register the module with the Lua interpreter. The name "luaopen_example" depends upon the name of the module.

    To build an eLua module, run SWIG using -lua and add either -elua or -eluac.

    $ swig -lua -elua example.i
    

    or

    $ swig -lua -eluac example.i
    

    The -elua option puts all the C function wrappers and variable get/set wrappers in rotables. It also generates a metatable which will control the access to these variables from eLua. It also offers a significant amount of module size compression. On the other hand, the -eluac option puts all the wrappers in a single rotable. With this option, no matter how huge the module, it will consume no additional microcontroller SRAM (crass compression). There is a catch though: Metatables are not generated with -eluac. To access any value from eLua, one must directly call the wrapper function associated with that value.

    28.2.1 Additional command line options

    The following table list the additional commandline options available for the Lua module. They can also be seen by using:

    swig -lua -help 
    
    Lua specific options
    -eluaGenerates LTR compatible wrappers for smaller devices running elua.
    -eluacLTR compatible wrappers in "crass compress" mode for elua.
    -nomoduleglobalDo not register the module name as a global variable but return the module table from calls to require.
    -no-old-metatable-bindingsDisable backward compatibility: old-style binding names generations and a few other things. Explanations are included in appropriate later sections.
    -squash-basesSquashes symbols from all inheritance tree of a given class into itself. Emulates pre-SWIG3.0 inheritance. Insignificantly speeds things up, but increases memory consumption.

    28.2.2 Compiling and Linking and Interpreter

    Normally Lua is embedded into another program and will be statically linked. An extremely simple stand-alone interpreter (min.c) is given below:

    #include <stdio.h>
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
    
    extern int luaopen_example(lua_State* L); // declare the wrapped module
    
    int main(int argc, char* argv[])
    {
     lua_State *L;
     if (argc<2)
     {
      printf("%s: <filename.lua>\n", argv[0]);
      return 0;
     }
     L=lua_open();
     luaopen_base(L);       // load basic libs (eg. print)
     luaopen_example(L);    // load the wrapped module
     if (luaL_loadfile(L, argv[1])==0) // load and run the file
      lua_pcall(L, 0, 0, 0);
     else
      printf("unable to load %s\n", argv[1]);
     lua_close(L);
     return 0;
    }
    

    A much improved set of code can be found in the Lua distribution src/lua/lua.c. Include your module, just add the external declaration & add a #define LUA_EXTRALIBS {"example", luaopen_example}, at the relevant place.

    The exact commands for compiling and linking vary from platform to platform. Here is a possible set of commands of doing this:

    $ swig -lua example.i -o example_wrap.c
    $ gcc -I/usr/include/lua -c min.c -o min.o
    $ gcc -I/usr/include/lua -c example_wrap.c -o example_wrap.o
    $ gcc -c example.c -o example.o
    $ gcc -I/usr/include/lua -L/usr/lib/lua min.o example_wrap.o example.o -o my_lua
    

    For eLua, the source must be built along with the wrappers generated by SWIG. Make sure the eLua source files platform_conf.h and auxmods.h are updated with the entries of your new module. Please note: "mod" is the module name.

    /* Sample platform_conf.h */
    #define LUA_PLATFORM_LIBS_ROM\
      _ROM( AUXLIB_PIO, luaopen_pio, pio_map )\
      _ROM( AUXLIB_TMR, luaopen_tmr, tmr_map )\
      _ROM( AUXLIB_MOD, luaopen_mod, mod_map )\
      ....
    
    /* Sample auxmods.h */
    #define AUXLIB_PIO       "pio"
    LUALIB_API int ( luaopen_pio )(lua_State *L );
    
    #define AUXLIB_MOD       "mod"
    LUALIB_API int ( luaopen_mod )(lua_State *L );
    ....
    

    More information on building and configuring eLua can be found here: http://www.eluaproject.net/doc/v0.8/en_building.html

    28.2.3 Compiling a dynamic module

    Most, but not all platforms support the dynamic loading of modules (Windows & Linux do). Refer to the Lua manual to determine if your platform supports it. For compiling a dynamically loaded module the same wrapper can be used. Assuming you have code you need to link to in a file called example.c, the commands will be something like this:

    $ swig -lua example.i -o example_wrap.c
    $ gcc -fPIC -I/usr/include/lua -c example_wrap.c -o example_wrap.o
    $ gcc -fPIC -c example.c -o example.o
    $ gcc -shared -I/usr/include/lua -L/usr/lib/lua example_wrap.o example.o -o example.so
    

    The wrappers produced by SWIG can be compiled and linked with Lua 5.1.x and later. The loading is extremely simple.

    require("example")
    

    For those using Lua 5.0.x, you will also need an interpreter with the loadlib function (such as the default interpreter compiled with Lua). In order to dynamically load a module you must call the loadlib function with two parameters: the filename of the shared library, and the function exported by SWIG. Calling loadlib should return the function, which you then call to initialise the module

    my_init=loadlib("example.so", "luaopen_example") -- for Unix/Linux
    --my_init=loadlib("example.dll", "luaopen_example") -- for Windows
    assert(my_init) -- make sure it's not nil
    my_init()       -- call the init fn of the lib
    

    Or can be done in a single line of Lua code

    assert(loadlib("example.so", "luaopen_example"))()
    

    If the code didn't work, don't panic. The best thing to do is to copy the module and your interpreter into a single directory and then execute the interpreter and try to manually load the module (take care, all this code is case sensitive).

    a, b, c=package.loadlib("example.so", "luaopen_example") -- for Unix/Linux
    --a, b, c=package.loadlib("example.dll", "luaopen_example") -- for Windows
    print(a, b, c)
    

    Note: for Lua 5.0:
    The loadlib() function is in the global namespace, not in a package. So it's just loadlib().

    if 'a' is a function, this is all working fine, all you need to do is call it

      a()
    

    to load your library which will add a table 'example' with all the functions added.

    If it doesn't work, look at the error messages, in particular message 'b'
    The specified module could not be found.
    Means that is cannot find the module, check your the location and spelling of the module.
    The specified procedure could not be found.
    Means that it loaded the module, but cannot find the named function. Again check the spelling, and if possible check to make sure the functions were exported correctly.
    'loadlib' not installed/supported
    Is quite obvious (Go back and consult the Lua documents on how to enable loadlib for your platform).

    28.2.4 Using your module

    Assuming all goes well, you will be able to this:

    $ ./my_lua
    > print(example.gcd(4, 6))
    2
    > print(example.Foo)
    3
    > example.Foo=4
    > print(example.Foo)
    4
    >
    

    28.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Lua interface to your C/C++ code. This section briefly covers the essential aspects of this wrapping.

    28.3.1 Modules

    The SWIG module directive specifies the name of the Lua module. If you specify `module example', then everything is wrapped into a Lua table 'example' containing all the functions and variables. When choosing a module name, make sure you don't use the same name as a built-in Lua command or standard module name.

    28.3.2 Functions

    Global functions are wrapped as new Lua built-in functions. For example,

    %module example
    int fact(int n);

    creates a built-in function example.fact(n) that works exactly like you think it does:

    > print example.fact(4)
    24
    >
    

    To avoid name collisions, SWIG create a Lua table which keeps all the functions, constants, classes and global variables in. It is possible to copy the functions, constants and classes (but not variables) out of this and into the global environment with the following code. This can easily overwrite existing functions, so this must be used with care. This option is considered deprecated and will be removed in the near future.

    > for k, v in pairs(example) do _G[k]=v end
    > print(fact(4))
    24
    >
    

    It is also possible to rename the module with an assignment.

    > e=example
    > print(e.fact(4))
    24
    > print(example.fact(4))
    24
    

    28.3.3 Global variables

    Global variables (which are linked to C code) are supported, and appear to be just another variable in Lua. However the actual mechanism is more complex. Given a global variable:

    %module example
    extern double Foo;
    

    SWIG will effectively generate two functions example.Foo_set() and example.Foo_get(). It then adds a metatable to the table 'example' to call these functions at the correct time (when you attempt to set or get examples.Foo). Therefore if you were to attempt to assign the global to another variable, you will get a local copy within the interpreter, which is no longer linked to the C code.

    > print(example.Foo)
    3
    > c=example.Foo   -- c is a COPY of example.Foo, not the same thing
    > example.Foo=4
    > print(c)
    3
    > c=5 -- this will not effect the original example.Foo
    > print(example.Foo, c)
    4    5
    

    It is therefore not possible to 'move' the global variable into the global namespace as it is with functions. It is however, possible to rename the module with an assignment, to make it more convenient.

    > e=example
    > -- e and example are the same table
    > -- so e.Foo and example.Foo are the same thing
    > example.Foo=4
    > print(e.Foo)
    4
    

    If a variable is marked with the %immutable directive then any attempts to set this variable will cause a Lua error. Given a global variable:

    %module example
    %immutable;
    extern double Foo;
    %mutable;
    

    SWIG will allow the reading of Foo but when a set attempt is made, an error function will be called.

    > print(e.Foo) -- reading works ok
    4
    > example.Foo=40 -- but writing does not
    This variable is immutable
    stack traceback:
            [C]: ?
            [C]: ?
            stdin:1: in main chunk
            [C]: ?
    

    For those people who would rather that SWIG silently ignore the setting of immutables (as previous versions of the Lua bindings did), adding a -DSWIGLUA_IGNORE_SET_IMMUTABLE compile option will remove this.

    Unlike earlier versions of the binding, it is now possible to add new functions or variables to the module, just as if it were a normal table. This also allows the user to rename/remove existing functions and constants (but not linked variables, mutable or immutable). Therefore users are recommended to be careful when doing so.

    > -- example.PI does not exist
    > print(example.PI)
    nil
    > example.PI=3.142 -- new value added
    > print(example.PI)
    3.142
    

    If you have used the -eluac option for your eLua module, you will have to follow a different approach while manipulating global variables. (This is not applicable for wrappers generated with -elua)

    > -- Applicable only with -eluac. (num is defined)
    > print(example.num_get())
    20
    > example.num_set(50) -- new value added
    > print(example.num_get())
    50
    

    In general, functions of the form "variable_get()" and "variable_set()" are automatically generated by SWIG for use with -eluac.

    28.3.4 Constants and enums

    Because Lua doesn't really have the concept of constants, C/C++ constants are not really constant in Lua. They are actually just a copy of the value into the Lua interpreter. Therefore they can be changed just as any other value. For example given some constants:

    %module example
    %constant int ICONST=42;
    #define    SCONST      "Hello World"
    enum Days{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
    

    This is 'effectively' converted into the following Lua code:

    example.ICONST=42
    example.SCONST="Hello World"
    example.SUNDAY=0
    ....
    

    Constants are not guaranteed to remain constant in Lua. The name of the constant could be accidentally reassigned to refer to some other object. Unfortunately, there is no easy way for SWIG to generate code that prevents this. You will just have to be careful.

    If you're using eLua and have used -elua or -eluac to generate your wrapper, macro constants and enums should be accessed through a rotable called "const". In eLua, macro constants and enums are guaranteed to remain constants since they are all contained within a rotable. A regular C constant is accessed from eLua just as if it were a regular global variable, just that the property of value immutability is demonstrated if an attempt at modifying a C constant is made.

    > print(example.ICONST)
    10
    > print(example.const.SUNDAY)
    0
    > print(example.const.SCONST)
    Hello World
    

    28.3.4.1 Constants/enums and classes/structures

    Enums are exported into a class table. For example, given some enums:

    %module example
    enum Days { SUNDAY = 0, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY };
    struct Test {
      enum { TEST1 = 10, TEST2 = 20 };
    #ifdef __cplusplus // There are no static members in C
      static const int ICONST = 12;
    #endif
    };
    

    There is a slight difference in behaviour wrapping C and C++ code due to the different scoping rules of C and C++. The wrapped C++ code is used as follows from Lua code:

    > print(example.SUNDAY)
    0
    > print(example.Test.TEST1)
    10
    > print(example.Test.ICONST)
    12
    

    Enums within a C struct are in the global namespace and are used as follows from Lua

    > print(example.SUNDAY)
    0
    > -- See the difference here
    > print(example.TEST1)
    10
    

    Compatibility Note: Versions of SWIG prior to SWIG-3.0.0 did not generate the class table members above. There is no change in the C wrappers, but the following code was the only way to access these constants/enums when wrapping C++ member constants:

    > print(example.Test_TEST1)
    10
    > print(example.Test_ICONST)
    12
    

    The old-style bindings are still generated in addition to the new ones. If the -no-old-metatable-bindings option is used, then these old-style bindings are not generated.

    It is worth mentioning, that example.Test.TEST1 and example.Test_TEST1 are different entities and changing one does not change the other. Given the fact that these are constantes and they are not supposed to be changed, it is up to you to avoid such issues.

    28.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Lua. For example:

    > f=example.fopen("junk", "w")
    > example.fputs("Hello World", f)
    > example.fclose(f)
    

    Unlike many scripting languages, Lua has had support for pointers to C/C++ object built in for a long time. They are called 'userdata'. Unlike many other SWIG versions which use some kind of encoded character string, all objects will be represented as a userdata. The SWIG-Lua bindings provides a special function swig_type(), which if given a userdata object will return the type of object pointed to as a string (assuming it was a SWIG wrapped object).

    > print(f)
    userdata: 003FDA80
    > print(swig_type(f))
    FILE * -- it's a FILE*
    

    Lua enforces the integrity of its userdata, so it is virtually impossible to corrupt the data. But as the user of the pointer, you are responsible for freeing it, or closing any resources associated with it (just as you would in a C program). This does not apply so strictly to classes & structs (see below). One final note: if a function returns a NULL pointer, this is not encoded as a userdata, but as a Lua nil.

    > f=example.fopen("not there", "r") -- this will return a NULL in C
    > print(f)
    nil
    

    28.3.6 Structures

    If you wrap a C structure, it is also mapped to a Lua userdata. By adding a metatable to the userdata, this provides a very natural interface. For example,

    struct Point{
      int x, y;
    };
    

    is used as follows:

    > p=example.new_Point()
    > p.x=3
    > p.y=5
    > print(p.x, p.y)
    3       5
    >
    

    Similar access is provided for unions and the data members of C++ classes.
    C structures can be created using a function new_Point(), and both C structures and C++ classes can be created using just the name Point().

    If you print out the value of p in the above example, you will see something like this:

    > print(p)
    userdata: 003FA320
    

    Like the pointer in the previous section, this is held as a userdata. However, additional features have been added to make this more usable. SWIG effectively creates some accessor/mutator functions to get and set the data. These functions will be added to the userdata's metatable. This provides the natural access to the member variables that were shown above (see end of the document for full details).

    const members of a structure are read-only. Data members can also be forced to be read-only using the immutable directive. As with other immutables, setting attempts will be cause an error. For example:

    struct Foo {
      ...
      %immutable;
      int x;        // Read-only members
      char *name;
      %mutable;
      ...
    };
    

    The mechanism for managing char* members as well as array members is similar to other languages. It is somewhat cumbersome and should probably be better handled by defining of typemaps (described later).

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    > b = Bar()
    > x = b.f
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       // Points inside b
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    > b = Bar()
    > b.f.a = 3               -- Modify attribute of structure member
    > x = b.f
    > x.a = 3                 -- Modifies the same structure
    

    For eLua with the -eluac option, structure manipulation has to be performed with specific structure functions generated by SWIG. Let's say you have the following structure definition:

    struct data {
      int x, y;
      double z;
    };
    
    > --From eLua
    > a = example.new_data()
    > example.data_x_set(a, 10)
    > example.data_y_set(a, 20)
    > print(example.data_x_get(a), example.data_y_get(a))
    10 20
    

    In general, functions of the form "new_struct()", "struct_member_get()", "struct_member_set()" and "free_struct()" are automatically generated by SWIG for each structure defined in C. (Please note: This doesn't apply for modules generated with the -elua option)

    28.3.7 C++ classes

    C++ classes are wrapped by a Lua userdata as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Lua like this:

    > l = example.List()
    > l:insert("Ale")
    > l:insert("Stout")
    > l:insert("Lager")
    > print(l:get(1))
    Stout
    > print(l:length)
    3
    >
    

    (Note: for calling methods of a class, you use class:method(args), not class.method(args), it's an easy mistake to make. However for data attributes it is class.attribute )

    Class data members are accessed in the same manner as C structures. Static class members present a special problem for Lua, as Lua doesn't have support for such features. Therefore, SWIG generates wrappers that try to work around some of these issues. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Lua, C++ static members can be accessed as follows:

    > example.Spam.foo()            -- calling Spam::foo()
    > a=example.Spam.bar            -- reading Spam::bar 
    > example.Spam.bar=b            -- writing to Spam::bar
    

    It is not (currently) possible to access static members of an instance:

    > s=example.Spam()              -- s is a Spam instance
    > s.foo()                       -- Spam::foo() via an instance
                                    -- does NOT work
    

    Compatibility Note: In versions prior to SWIG-3.0.0 only the following names would work:

    > example.Spam_foo()            -- calling Spam::foo()
    > a=example.Spam_bar            -- reading Spam::bar 
    > example.Spam_bar=b            -- writing to Spam::bar
    

    Both style names are generated by default now. However, if the -no-old-metatable-bindings option is used, then the backward compatible names are not generated in addition to ordinary ones.

    28.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    And if you have functions like this

    void spam(Foo *f);
    

    then the function spam() accepts a Foo pointer or a pointer to any class derived from Foo.

    It is safe to use multiple inheritance with SWIG.

    28.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In SWIG, there is no detailed distinction like this--specifically, there are only "objects". There are no pointers, references, arrays, and so forth. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    > f = Foo()           -- Create a Foo
    > spam1(f)            -- Ok. Pointer
    > spam2(f)            -- Ok. Reference
    > spam3(f)            -- Ok. Value.
    > spam4(f)            -- Ok. Array (1 element)
    

    Similar behaviour occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Lua will release this memory when the return value is garbage collected). The other two are pointers which are assumed to be managed by the C code and so will not be garbage collected.

    28.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Lua in a straightforward manner:

    > foo(3)           -- foo(int)
    > foo("Hello")     -- foo(char *c)
    

    However due to Lua's coercion mechanism is can sometimes do strange things.

    > foo("3")           -- "3" can be coerced into an int, so it calls foo(int)!
    

    As this coercion mechanism is an integral part of Lua, there is no easy way to get around this other than renaming of functions (see below).

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Lua code like this:

    > f = Foo()          -- Create a Foo
    > g = Foo(f)         -- Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    Dealing with the Lua coercion mechanism, the priority is roughly (integers, floats, strings, userdata). But it is better to rename the functions rather than rely upon the ordering.

    28.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
    
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like you expect:

    > c = Complex(3, 4)
    > d = Complex(7, 8)
    > e = c + d
    > e:re()
    10.0
    > e:im()
    12.0
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG doesn't know what to do with the friend function--in fact, it simply ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    ...
    Complex operator+(double, const Complex &c);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    Also, be aware that certain operators don't map cleanly to Lua, and some Lua operators don't map cleanly to C++ operators. For instance, overloaded assignment operators don't map to Lua semantics and will be ignored, and C++ doesn't support Lua's concatenation operator (.. ).

    In order to keep maximum compatibility within the different languages in SWIG, the Lua bindings uses the same set of operator names as Python. Although internally it renames the functions to something else (on order to work with Lua).

    The current list of operators which can be overloaded (and the alternative function names) are:

    • __add__ operator+
    • __sub__ operator-
    • __mul__ operator *
    • __div__ operator/
    • __unm__ unary minus
    • __call__ operator() (often used in functor classes)
    • __pow__ the exponential fn (no C++ equivalent, Lua uses ^)
    • __concat__ the concatenation operator (Lua's ..)
    • __eq__ operator==
    • __lt__ operator<
    • __le__ operator<=

    Note: in Lua, only the equals, less than, and less than equals operators are defined. The other operators (!=, >, >=) are achieved by using a logical not applied to the results of other operators.

    The following operators cannot be overloaded (mainly because they are not supported in Lua)

    • ++ and --
    • +=, -=, *= etc
    • % operator (you have to use math.mod)
    • assignment operator
    • all bitwise/logical operations

    SWIG also accepts the __str__() member function which converts an object to a string. This function should return a const char*, preferably to static memory. This will be used for the print() and tostring() functions in Lua. Assuming the complex class has a function

    const char* __str__() {
      static char buffer[255];
      sprintf(buffer, "Complex(%g, %g)", this->re(), this->im());
      return buffer;
    }
    

    Then this will support the following code in Lua

    > c = Complex(3, 4)
    > d = Complex(7, 8)
    > e = c + d
    > print(e)
    Complex(10, 12)
    > s=tostring(e) -- s is the number in string form
    > print(s)
    Complex(10, 12)
    

    It is also possible to overload the operator[], but currently this cannot be automatically performed. To overload the operator[] you need to provide two functions, __getitem__() and __setitem__()

    class Complex {
      //....
      double __getitem__(int i)const; // i is the index, returns the data
      void __setitem__(int i, double d); // i is the index, d is the data
    };
    

    C++ operators are mapped to Lua predefined metafunctions. Class inherits from its bases the following list of metafunctions ( thus inheriting the folloging operators and pseudo-operators):

    • __add__
    • __sub__
    • __mul__
    • __div__
    • __unm__
    • __mod__
    • __call__
    • __pow__
    • __concat__
    • __eq__
    • __lt__
    • __le__
    • __len__
    • __getitem__
    • __setitem__
    • __tostring used internally by Lua for tostring() function. __str__ is mapped to this function

    No other lua metafunction is inherited. For example, __gc is not inherited and must be redefined in every class. __tostring is subject to a special handling. If absent in class and in class bases, a default one will be provided by SWIG.

    28.3.12 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods. In the previous section, the Complex class would have benefited greatly from an __str__() method as well as some repairs to the operator overloading. It can also be used to add additional functions to the class if they are needed.

    Take the original Complex class

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
    
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    Now we extend it with some new code

    %extend Complex {
      const char *__str__() {
        static char tmp[1024];
        sprintf(tmp, "Complex(%g, %g)", $self->re(), $self->im());
        return tmp;
      }
      bool operator==(const Complex& c) {
        return ($self->re()==c.re() && $self->im()==c.im());
      }
    };
    

    Now, in Lua

    > c = Complex(3, 4)
    > d = Complex(7, 8)
    > e = c + d
    > print(e)      -- print uses __str__ to get the string form to print
    Complex(10, 12)
    > print(e==Complex(10, 12))  -- testing the == operator
    true
    > print(e!=Complex(12, 12))  -- the != uses the == operator
    true
    

    Extend works with both C and C++ code, on classes and structs. It does not modify the underlying object in any way---the extensions only show up in the Lua interface. The only item to take note of is the code has to use the '$self' instead of 'this', and that you cannot access protected/private members of the code (as you are not officially part of the class).

    28.3.13 Using %newobject to release memory

    If you have a function that allocates memory like this,

    char *foo() {
      char *result = (char *) malloc(...);
      ...
      return result;
    }
    

    then the SWIG generated wrappers will have a memory leak--the returned data will be copied into a string object and the old contents ignored.

    To fix the memory leak, use the %newobject directive.

    %newobject foo;
    ...
    char *foo();
    

    This will release the allocated memory.

    28.3.14 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Lua:

    > p = example.pairii(3, 4)
    > print(p.first, p.second)
    3    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    28.3.15 C++ Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Lua, everything should just "work":

    > p = example.CreateFoo()          -- Create a smart-pointer somehow
    > p.x = 3                          -- Foo::x
    > print(p:bar())                   -- Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    > f = p:__deref__()     -- Returns underlying Foo *
    

    28.3.16 C++ Exceptions

    Lua does not natively support exceptions, but it has errors which are similar. When a Lua function terminates with an error it returns one value back to the caller. SWIG automatically maps any basic type which is thrown into a Lua error. Therefore for a function:

    int message() throw(const char *) {
      throw("I died.");
      return 1;
    }
    

    SWIG will automatically convert this to a Lua error.

    > message()
    I died.
    stack traceback:
            [C]: in function 'message'
            stdin:1: in main chunk
            [C]: ?
    >
    

    If you want to catch an exception, you must use either pcall() or xpcall(), which are documented in the Lua manual. Using xpcall will allow you to obtain additional debug information (such as a stacktrace).

    > function a() b() end -- function a() calls function b()
    > function b() message() end -- function b() calls C++ function message(), which throws 
    > ok, res=pcall(a)  -- call the function
    > print(ok, res)
    false   I died.
    > ok, res=xpcall(a, debug.traceback)  -- call the function
    > print(ok, res)
    false   I died.
    stack traceback:
            [C]: in function 'message'
            runme.lua:70: in function 'b'
            runme.lua:67: in function <runme.lua:66>
            [C]: in function 'xpcall'
            runme.lua:95: in main chunk
            [C]: ?
    

    SWIG is able to throw numeric types, enums, chars, char*'s and std::string's without problem. It has also written typemaps for std::exception and its derived classes, which convert the exception into an error string.

    However it's not so simple to throw other types of objects. Thrown objects are not valid outside the 'catch' block. Therefore they cannot be returned to the interpreter. The obvious ways to overcome this would be to either return a copy of the object, or to convert the object to a string and return that. Though it seems obvious to perform the former, in some cases this is not possible, most notably when SWIG has no information about the object, or the object is not copyable/creatable.

    Therefore by default SWIG converts all thrown object into strings and returns them. So given a function:

    void throw_A() throw(A*) {
      throw new A();
    }
    

    SWIG will just convert it (poorly) to a string and use that as its error. (This is not that useful, but it always works).

    > throw_A()
    object exception:A *
    stack traceback:
            [C]: in function 'unknown'
            stdin:1: in main chunk
            [C]: ?
    >
    

    To get a more useful behaviour out of SWIG you must either: provide a way to convert your exceptions into strings, or throw objects which can be copied.

    If you have your own class which you want output as a string you will need to add a typemap something like this:

    %typemap(throws) my_except
    %{ 
      lua_pushstring(L, $1.what()); // assuming my_except::what() returns a const char* message
      SWIG_fail; // trigger the error handler
    %}
    

    If you wish your exception to be returned to the interpreter, it must firstly be copyable. Then you must have an additional %apply statement, to tell SWIG to return a copy of this object to the interpreter. For example:

    %apply SWIGTYPE EXCEPTION_BY_VAL {Exc}; // tell SWIG to return Exc by value to interpreter
    
    class Exc {
    public:
      Exc(int c, const char *m) {
        code = c;
        strncpy(msg, m, 256);
      }
      int code;
      char msg[256];
    };
    
    void throw_exc() throw(Exc) {
      throw(Exc(42, "Hosed"));
    } 
    

    Then the following code can be used (note: we use pcall to catch the error so we can process the exception).

    > ok, res=pcall(throw_exc)
    > print(ok)
    false
    > print(res)
    userdata: 0003D880
    > print(res.code, res.msg)
    42      Hosed
    >
    

    Note: it is also possible (though tedious) to have a function throw several different kinds of exceptions. To process this will require a pcall, followed by a set of if statements checking the type of the error.

    All of this code assumes that your C++ code uses exception specification (which a lot doesn't). If it doesn't consult the " Exception handling with %catches" section and the " Exception handling with %exception" section, for more details on how to add exception specification to functions or globally (respectively).

    28.3.17 Namespaces

    Since SWIG-3.0.0 C++ namespaces are supported via the %nspace feature.

    Namespaces are mapped into Lua tables. Each of those tables contains names that were defined within appropriate namespace. Namespaces structure (a.k.a nested namespaces) is preserved. Consider the following C++ code:

    %module example
    %nspace MyWorld::Nested::Dweller;
    %nspace MyWorld::World;
    
    int module_function() { return 7; }
    int module_variable = 9;
    
    namespace MyWorld {
      class World {
      public:
        World() : world_max_count(9) {}
        int create_world() { return 17; }
        const int world_max_count; // = 9
      };
      namespace Nested {
        class Dweller {
          public:
            enum Gender { MALE = 0, FEMALE = 1 };
            static int count() { return 19; }
        };
      }
    }
    

    Now, from Lua usage is as follows:

    > print(example.module_function())
    7
    > print(example.module_variable)
    9
    > print(example.MyWorld.World():create_world())
    17
    > print(example.MyWorld.World.world_max_count)
    9
    > print(example.MyWorld.Nested.Dweller.MALE)
    0
    > print(example.MyWorld.Nested.Dweller.count())
    19
    >
    

    28.3.17.1 Compatibility Note

    If SWIG is running in a backwards compatible way, i.e. without the -no-old-metatable-bindings option, then additional old-style names are generated (notice the underscore):

    9
    > print(example.MyWorld.Nested.Dweller_MALE)
    0
    > print(example.MyWorld.Nested.Dweller_count())
    11
    >
    

    28.3.17.2 Names

    If SWIG is launched without -no-old-metatable-bindings option, then it enters backward-compatible mode. While in this mode, it tries to generate additional names for static functions, class static constants and class enums. Those names are in a form $classname_$symbolname and are added to the scope surrounding the class. If %nspace is enabled, then class namespace is taken as scope. If there is no namespace, or %nspace is disabled, then module is considered a class namespace.

    Consider the following C++ code

    %module example
    %nspace MyWorld::Test;
    namespace MyWorld {
    class Test {
      public:
      enum { TEST1 = 10, TEST2 }
      static const int ICONST = 12;
    };
    class Test2 {
      public:
      enum { TEST3 = 20, TEST4 }
      static const int ICONST2 = 23;
    }
    

    When in backward compatible mode, in addition to the usual names, the following ones will be generated (notice the underscore):

    9
    > print(example.MyWorld.Test_TEST1) -- Test has %nspace enabled
    10
    > print(example.MyWorld.Test_ICONST) -- Test has %nspace enabled
    12
    > print(example.Test2_TEST3) -- Test2 doesn't have %nspace enabled
    20
    > print(example.Test2_ICONST2) -- Test2 doesn't have %nspace enabled
    23
    >
    

    There is a slight difference with enums when in C mode. As per C standard, enums from C structures are exported to surrounding scope without any prefixing. Pretending that Test2 is a struct, not class, that would be:

    > print(example.TEST3) -- NOT Test2_TEST3
    20
    >
    

    28.3.17.3 Inheritance

    The internal organization of inheritance has changed. Consider the following C++ code:

    %module example
    class Base {
      public:
      int base_func()
    };
    class Derived : public Base {
      public:
      int derived_func()
    }
    

    Lets assume for a moment that class member functions are stored in .fn table. Previously, when classes were exported to Lua during module initialization, for every derived class all service tables ST(i.e. ".fn") were squashed and added to corresponding derived class ST: Everything from .fn table of class Base was copied to .fn table of class Derived and so on. This was a recursive procedure, so in the end the whole inheritance tree of derived class was squashed into derived class.

    That means that any changes done to class Base after module initialization wouldn't affect class Derived:

    base = example.Base()
    der = example.Derived()
    > print(base.base_func)
    function: 0x1367940
    > getmetatable(base)[".fn"].new_func = function (x) return x -- Adding new function to class Base (to class, not to an instance!)
    > print(base.new_func) -- Checking this function
    function
    > print(der.new_func) -- Wouldn't work. Derived doesn't check Base any more.
    nil
    >
    

    This behaviour was changed. Now unless -squash-bases option is provided, Derived store a list of it's bases and if some symbol is not found in it's own service tables then its bases are searched for it. Option -squash-bases will effectively return old behaviour.

    > print(der.new_func) -- Now it works
    function
    >
    

    28.4 Typemaps

    This section explains what typemaps are and how to use them. The default wrapping behaviour of SWIG is enough in most cases. However sometimes SWIG may need a little additional assistance to know which typemap to apply to provide the best wrapping. This section will be explaining how to use typemaps to best effect

    28.4.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Lua to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) lua_tonumber(L, $input);
      printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Note: you shouldn't use this typemap, as SWIG already has a typemap for this task. This is purely for example.

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input is the index on the Lua stack for the value to be used.

    When this example is compiled into a Lua module, it operates as follows:

    > require "example"
    > print(example.fact(6))
    Received an integer : 6
    720
    

    28.4.2 Using typemaps

    There are many ready written typemaps built into SWIG for all common types (int, float, short, long, char*, enum and more), which SWIG uses automatically, with no effort required on your part.

    However for more complex functions which use input/output parameters or arrays, you will need to make use of <typemaps.i>, which contains typemaps for these situations. For example, consider these functions:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    
    int sub(int *x1, int *y1) {
      return *x1-*y1;
    }
    
    void swap(int *sx, int *sy) {
      int t=*sx;
      *sx=*sy;
      *sy=t;
    }
    

    It is clear to the programmer, that 'result' is an output parameter, 'x1' and 'y1' are input parameters and 'sx' and 'sy' are input/output parameters. However is not apparent to SWIG, so SWIG must to informed about which kind they are, so it can wrapper accordingly.

    One means would be to rename the argument name to help SWIG, eg void add(int x, int y, int *OUTPUT), however it is easier to use the %apply to achieve the same result, as shown below.

    %include <typemaps.i>
    %apply int* OUTPUT {int *result}; // int *result is output
    %apply int* INPUT {int *x1, int *y1}; // int *x1 and int *y1 are input
    %apply int* INOUT {int *sx, int *sy}; // int *sx and int *sy are input and output
    
    void add(int x, int y, int *result);
    int sub(int *x1, int *y1);
    void swap(int *sx, int *sy);
    

    When wrapped, it gives the following results:

    > require "example"
    > print(example.add(1, 2))
    3
    > print(demo.sub(1, 2))
    -1
    > a, b=1, 2
    > c, d=demo.swap(a, b)
    > print(a, b, c, d)
    1       2       2       1
    

    Notice, that 'result' is not required in the arguments to call the function, as it an output parameter only. For 'sx' and 'sy' they must be passed in (as they are input), but the original value is not modified (Lua does not have a pass by reference feature). The modified results are then returned as two return values. All INPUT/OUTPUT/INOUT arguments will behave in a similar manner.

    Note: C++ references must be handled exactly the same way. However SWIG will automatically wrap a const int& as an input parameter (since that it obviously input).

    28.4.3 Typemaps and arrays

    Arrays present a challenge for SWIG, because like pointers SWIG does not know whether these are input or output values, nor does SWIG have any indication of how large an array should be. However with the proper guidance SWIG can easily wrapper arrays for convenient usage.

    Given the functions:

    extern void sort_int(int* arr, int len);
    extern void sort_double(double* arr, int len);
    

    There are basically two ways that SWIG can deal with this. The first way, uses the <carrays.i> library to create an array in C/C++ then this can be filled within Lua and passed into the function. It works, but it's a bit tedious. More details can be found in the carrays.i documentation.

    The second and more intuitive way, would be to pass a Lua table directly into the function, and have SWIG automatically convert between Lua-table and C-array. Within the <typemaps.i> file there are typemaps ready written to perform this task. To use them is again a matter of using %apply in the correct manner.

    The wrapper file below, shows both the use of carrays as well as the use of the typemap to wrap arrays.

    // using the C-array
    %include <carrays.i>
    // this declares a batch of function for manipulating C integer arrays
    %array_functions(int, int)
    
    extern void sort_int(int* arr, int len); // the function to wrap
    
    // using typemaps
    %include <typemaps.i>
    %apply (double *INOUT, int) {(double* arr, int len)};
    
    extern void sort_double(double* arr, int len); // the function to wrap
    

    Once wrapped, the functions can both be called, though with different ease of use:

    require "example"
    ARRAY_SIZE=10
    
    -- passing a C array to the sort_int()
    arr=example.new_int(ARRAY_SIZE) -- create the array
    for i=0, ARRAY_SIZE-1 do -- index 0..9 (just like C)
        example.int_setitem(arr, i, math.random(1000))
    end
    example.sort_int(arr, ARRAY_SIZE)  -- call the function
    example.delete_int(arr) -- must delete the allocated memory
    
    -- use a typemap to call with a Lua-table
    -- one item of note: the typemap creates a copy, rather than edit-in-place
    t={} -- a Lua table
    for i=1, ARRAY_SIZE do -- index 1..10 (Lua style)
        t[i]=math.random(1000)/10
    end
    t=example.sort_double(t) -- replace t with the result
    

    Obviously the first version could be made less tedious by writing a Lua function to perform the conversion from a table to a C-array. The %luacode directive is good for this. See SWIG\Examples\lua\arrays for an example of this.

    Warning: in C indexes start at ZERO, in Lua indexes start at ONE. SWIG expects C-arrays to be filled for 0..N-1 and Lua tables to be 1..N, (the indexing follows the norm for the language). In the typemap when it converts the table to an array it quietly changes the indexing accordingly. Take note of this behaviour if you have a C function which returns indexes.

    Note: SWIG also can support arrays of pointers in a similar manner.

    28.4.4 Typemaps and pointer-pointer functions

    Several C++ libraries use a pointer-pointer functions to create its objects. These functions require a pointer to a pointer which is then filled with the pointer to the new object. Microsoft's COM and DirectX as well as many other libraries have this kind of function. An example is given below:

    struct iMath;    // some structure
    int Create_Math(iMath** pptr); // its creator (assume it mallocs)
    

    Which would be used with the following C code:

    iMath* ptr;
    int ok;
    ok=Create_Math(&ptr);
    // do things with ptr
    //...
    free(ptr); // dispose of iMath
    

    SWIG has a ready written typemap to deal with such a kind of function in <typemaps.i>. It provides the correct wrapping as well as setting the flag to inform Lua that the object in question should be garbage collected. Therefore the code is simply:

    %include <typemaps.i>
    %apply SWIGTYPE** OUTPUT{iMath **pptr }; // tell SWIG it's an output
    
    struct iMath;    // some structure
    int Create_Math(iMath** pptr); // its creator (assume it mallocs)
    

    The usage is as follows:

    ok, ptr=Create_Math() -- ptr is an iMath* which is returned with the int (ok)
    ptr=nil -- the iMath* will be GC'ed as normal
    

    28.5 Writing typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Lua C API as well as the material in the "Typemaps " chapter.

    Before proceeding, it should be stressed that writing typemaps is rarely needed unless you want to change some aspect of the wrapping, or to achieve an effect which in not available with the default bindings.

    Before proceeding, you should read the previous section on using typemaps, and look at the existing typemaps found in luatypemaps.swg and typemaps.i. These are both well documented and fairly easy to read. You should not attempt to write your own typemaps until you have read and can understand both of these files (they may well also give you an idea to base your work on).

    28.5.1 Typemaps you can write

    There are many different types of typemap that can be written, the full list can be found in the "Typemaps" chapter. However the following are the most commonly used ones.

    • in this is for input arguments to functions
    • out this is for return types from functions
    • argout this is for a function argument which is actually returning something
    • typecheck this is used to determine which overloaded function should be called (the syntax for the typecheck is different from the typemap, see typemaps for details).

    28.5.2 SWIG's Lua-C API

    This section explains the SWIG specific Lua-C API. It does not cover the main Lua-C api, as this is well documented and not worth covering.

    int SWIG_ConvertPtr(lua_State* L, int index, void** ptr, swig_type_info *type, int flags);

    This is the standard function used for converting a Lua userdata to a void*. It takes the value at the given index in the Lua state and converts it to a userdata. It will then provide the necessary type checks, confirming that the pointer is compatible with the type given in 'type'. Then finally setting '*ptr' to the pointer. If flags is set to SWIG_POINTER_DISOWN, this is will clear any ownership flag set on the object.
    This returns a value which can be checked with the macro SWIG_IsOK()

    void SWIG_NewPointerObj(lua_State* L, void* ptr, swig_type_info *type, int own);

    This is the opposite of SWIG_ConvertPtr, as it pushes a new userdata which wrappers the pointer 'ptr' of type 'type'. The parameter 'own' specifies if the object is owned be Lua and if it is 1 then Lua will GC the object when the userdata is disposed of.

    void* SWIG_MustGetPtr(lua_State* L, int index, swig_type_info *type, int flags, int argnum, const char* func_name);

    This function is a version of SWIG_ConvertPtr(), except that it will either work, or it will trigger a lua_error() with a text error message. This function is rarely used, and may be deprecated in the future.

    SWIG_fail

    This macro, when called within the context of a SWIG wrapped function, will jump to the error handler code. This will call any cleanup code (freeing any temp variables) and then triggers a lua_error.
    A common use for this code is:
    if (!SWIG_IsOK(SWIG_ConvertPtr( .....)){
     lua_pushstring(L, "something bad happened");
     SWIG_fail;
    }

    SWIG_fail_arg(char* func_name, int argnum, char* type)

    This macro, when called within the context of a SWIG wrapped function, will display the error message and jump to the error handler code. The error message is of the form
    "Error in func_name (arg argnum), expected 'type' got 'whatever the type was'"
    

    SWIG_fail_ptr(const char* fn_name, int argnum, swig_type_info* type);

    Similar to SWIG_fail_arg, except that it will display the swig_type_info information instead.

    28.6 Customization of your Bindings

    This section covers adding of some small extra bits to your module to add the last finishing touches.

    28.6.1 Writing your own custom wrappers

    Sometimes, it may be necessary to add your own special functions, which bypass the normal SWIG wrapper method, and just use the native Lua API calls. These 'native' functions allow direct adding of your own code into the module. This is performed with the %native directive as follows:

    %native(my_func) int native_function(lua_State*L);  // registers native_function() with SWIG
    ...
    %{
    int native_function(lua_State*L) // my native code
    {
     ...
    }
    %}
    

    The %native directive in the above example, tells SWIG that there is a function int native_function(lua_State*L); which is to be added into the module under the name 'my_func'. SWIG will not add any wrapper for this function, beyond adding it into the function table. How you write your code is entirely up to you.

    28.6.2 Adding additional Lua code

    As well as adding additional C/C++ code, it's also possible to add your own Lua code to the module as well. This code is executed once all other initialisation, including the %init code has been called.

    The directive %luacode adds code into the module which is executed upon loading. Normally you would use this to add your own functions to the module. Though you could easily perform other tasks.

    %module example;
    
    %luacode {
      function example.greet() 
        print "hello world" 
      end
    
      print "Module loaded ok"
    }
    ...
    %}
    

    Notice that the code is not part of the module table. Therefore any references to the module must have the module name added.

    Should there be an error in the Lua code, this will not stop loading of the module. The default behaviour of SWIG is to print an error message to stderr and then continue. It is possible to change this behaviour by using a #define SWIG_DOSTRING_FAIL(STR) to define a different behaviour should the code fail.

    Good uses for this feature is adding of new code, or writing helper functions to simplify some of the code. See Examples/lua/arrays for an example of this code.

    28.7 Details on the Lua binding

    In the previous section, a high-level view of Lua wrapping was presented. Obviously a lot of stuff happens behind the scenes to make this happen. This section will explain some of the low-level details on how this is achieved.

    If you just want to use SWIG and don't care how it works, then stop reading here. This is going into the guts of the code and how it works. It's mainly for people who need to know what's going on within the code.

    28.7.1 Binding global data into the module.

    Assuming that you had some global data that you wanted to share between C and Lua. How does SWIG do it?

    %module example;
    extern double Foo;
    

    SWIG will effectively generate the pair of functions

    void Foo_set(double);
    double Foo_get();
    

    At initialisation time, it will then add to the interpreter a table called 'example', which represents the module. It will then add all its functions to the module. (Note: older versions of SWIG actually added the Foo_set() and Foo_get() functions, current implementation does not add these functions any more.) But it also adds a metatable to this table, which has two functions (__index and __newindex ) as well as two tables (.get and .set) The following Lua code will show these hidden features.

    > print(example)
    table: 003F8F90
    > m=getmetatable(example)
    > table.foreach(m, print)
    .set    table: 003F9088
    .get    table: 003F9038
    __index function: 003F8FE0
    __newindex      function: 003F8FF8
    > g=m['.get']
    > table.foreach(g, print)
    Foo     function: 003FAFD8
    >
    

    The .get and .set tables are lookups connecting the variable name 'Foo' to the accessor/mutator functions (Foo_set, Foo_get)

    The Lua equivalent of the code for the __index and __newindex looks a bit like this

    function __index(mod, name)
            local g=getmetatable(mod)['.get'] -- gets the table
            if not g then return nil end
            local f=g[name] -- looks for the function
            -- calls it & returns the value
            if type(f)=="function" then return f() end
            return nil
    end
    
    function __newindex(mod, name, value)
            local s=getmetatable(mod)['.set'] -- gets the table
            if not s then return end
            local f=s[name] -- looks for the function
            -- calls it to set the value
            if type(f)=="function" then f(value)
            else rawset(mod, name, value) end
    end
    

    That way when you call 'a=example.Foo', the interpreter looks at the table 'example' sees that there is no field 'Foo' and calls __index. This will in turn check in '.get' table and find the existence of 'Foo' and then return the value of the C function call 'Foo_get()'. Similarly for the code 'example.Foo=10', the interpreter will check the table, then call the __newindex which will then check the '.set' table and call the C function 'Foo_set(10)'.

    28.7.2 Userdata and Metatables

    As mentioned earlier, classes and structures, are all held as pointer, using the Lua 'userdata' structure. This structure is actually a pointer to a C structure 'swig_lua_userdata', which contains the pointer to the data, a pointer to the swig_type_info (an internal SWIG struct) and a flag which marks if the object is to be disposed of when the interpreter no longer needs it. The actual accessing of the object is done via the metatable attached to this userdata.

    The metatable is a Lua 5.0 feature (which is also why SWIG cannot wrap Lua 4.0). It's a table which holds a list of functions, operators and attributes. This is what gives the userdata the feeling that it is a real object and not just a hunk of memory.

    Given a class

    %module excpp;
    
    class Point
    {
    public:
     int x, y;
     Point(){x=y=0;}
     ~Point(){}
     virtual void Print(){printf("Point @%p (%d, %d)\n", this, x, y);}
    };
    

    SWIG will create a module excpp, with all the various functions inside. However to allow the intuitive use of the userdata, SWIG also creates up a set of metatables. As seen in the above section on global variables, use of the metatables allows for wrappers to be used intuitively. To save effort, the code creates one metatable per class and stores it inside Lua's registry. Then when a new object is instantiated, the metatable is found in the registry and the userdata associated with the metatable. Currently, derived classes make a complete copy of the base class' table and then add on their own additional functions.

    Some of the internals can be seen by looking at the metatable of a class:

    > p=excpp.Point()
    > print(p)
    userdata: 003FDB28
    > m=getmetatable(p)
    > table.foreach(m, print)
    .type   Point
    __gc    function: 003FB6C8
    __newindex      function: 003FB6B0
    __index function: 003FB698
    .get    table: 003FB4D8
    .set    table: 003FB500
    .fn     table: 003FB528
    

    The '.type' attribute is the name of the class. The '.get' and '.set' tables work in a similar manner to the modules, the main difference is the '.fn' table which also holds all the member functions. (The '__gc' function is the class' destructor function)

    The Lua equivalent of the code for enabling functions looks a little like this

    function __index(obj, name)
            local m=getmetatable(obj) -- gets the metatable
            if not m then return nil end
            local g=m['.get'] -- gets the attribute table
            if not g then return nil end
            local f=g[name] -- looks for the get_attribute function
            -- calls it & returns the value
            if type(f)=="function" then return f() end
            -- ok, so it not an attribute, maybe it's a function
            local fn=m['.fn'] -- gets the function table
            if not fn then return nil end
            local f=fn[name] -- looks for the function
            -- if found the fn then return the function
            -- so the interpreter can call it
            if type(f)=="function" then return f end
            return nil
    end
    

    So when 'p:Print()' is called, the __index looks on the object metatable for a 'Print' attribute, then looks for a 'Print' function. When it finds the function, it returns the function, and then interpreter can call 'Point_Print(p)'

    In theory, you can play with this usertable & add new features, but remember that it is a shared table between all instances of one class, and you could very easily corrupt the functions in all the instances.

    Note: Both the opaque structures (like the FILE*) and normal wrapped classes/structs use the same 'swig_lua_userdata' structure. Though the opaque structures has do not have a metatable attached, or any information on how to dispose of them when the interpreter has finished with them.

    Note: Operator overloads are basically done in the same way, by adding functions such as '__add' & '__call' to the class' metatable. The current implementation is a bit rough as it will add any member function beginning with '__' into the metatable too, assuming its an operator overload.

    28.7.3 Memory management

    Lua is very helpful with the memory management. The 'swig_lua_userdata' is fully managed by the interpreter itself. This means that neither the C code nor the Lua code can damage it. Once a piece of userdata has no references to it, it is not instantly collected, but will be collected when Lua deems is necessary. (You can force collection by calling the Lua function collectgarbage() ). Once the userdata is about to be free'ed, the interpreter will check the userdata for a metatable and for a function '__gc'. If this exists this is called. For all complete types (ie normal wrapped classes & structs) this should exist. The '__gc' function will check the 'swig_lua_userdata' to check for the 'own' field and if this is true (which is will be for all owned data) it will then call the destructor on the pointer.

    It is currently not recommended to edit this field or add some user code, to change the behaviour. Though for those who wish to try, here is where to look.

    It is also currently not possible to change the ownership flag on the data (unlike most other scripting languages, Lua does not permit access to the data from within the interpreter).


    29 SWIG and Octave

    Octave is a high-level language intended for numerical programming that is mostly compatible with MATLAB. More information can be found at Octave web site.

    This chapter is intended to give an introduction to using the module. You should also read the SWIG documentation that is not specific to Octave. Also, there are a dozen or so examples in the Examples/octave directory, and hundreds in the test suite (Examples/test-suite and Examples/test-suite/octave).

    29.1 Preliminaries

    SWIG is regularly tested against the following versions of Octave: 3.8, 4.0, 4.2.

    Every effort is made to maintain backward compatibility with older versions of Octave. This cannot be guaranteed however, as in recent times new Octave releases have required nontrivial updates to SWIG, which may break backward compatibility for older Octave versions against which SWIG is not regularly tested.

    The SWIG runtime exports the function swig_octave_prereq() for checking the version of Octave.

    29.2 Running SWIG

    Let's start with a very simple SWIG interface file, example.i:

    %module swigexample
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo; 

    To build an Octave module when wrapping C code, run SWIG using the -octave option:

    $ swig -octave -o example_wrap.cpp example.i 

    The -c++ option is also required when wrapping C++ code:

    $ swig -octave -c++ -o example_wrap.cpp example.i 

    This creates a C++ source file "example_wrap.cpp". A C++ file is generated even when wrapping C code as Octave is itself written in C++ and requires wrapper code to be in the same language. The generated C++ source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application (in this case, the gcd implementation) to create an extension module.

    29.2.1 Command-line options

    The swig command line has a number of options you can use, like to redirect its output. Use swig -help to learn about these. Options specific to the Octave module are:

    $ swig -octave -help
    ...
    Octave Options (available with -octave)
         -globals name - Set name used to access C global variables [default: 'cvar']
                         Use '.' to load C global variables into module namespace
         -opprefix str - Prefix str for global operator functions [default: 'op_']
    

    The -globals option sets the name of the variable which is the namespace for C global variables exported by the module. The special name "." loads C global variables into the module namespace, i.e. alongside C functions and structs exported by the module. The -opprefix options sets the prefix of the names of global/friend operator functions.

    29.2.2 Compiling a dynamic module

    Octave modules are DLLs/shared objects having the ".oct" suffix. Building an oct file is usually done with the mkoctfile command (either within Octave itself, or from the shell). For example,

    $ swig -octave -c++ -o example_wrap.cpp example.i
    $ mkoctfile example_wrap.cpp example.c
    

    where "example.c" is the file containing the gcd() implementation.

    mkoctfile can also be used to extract the build parameters required to invoke the compiler and linker yourself. See the Octave manual and mkoctfile man page.

    mkoctfile will produce "swigexample.oct", which contains the compiled extension module. Loading it into Octave is then a matter of invoking

    octave:1> swigexample

    29.2.3 Using your module

    Assuming all goes well, you will be able to do this:

    $ octave -q
    octave:1> swigexample
    octave:2> swigexample.gcd(4, 6)
    ans =  2
    octave:3> swigexample.cvar.Foo
    ans =  3
    octave:4> swigexample.cvar.Foo=4;
    octave:5> swigexample.cvar.Foo
    ans =  4 

    29.3 A tour of basic C/C++ wrapping

    29.3.1 Modules

    The SWIG module directive specifies the name of the Octave module. If you specify "module swigexample", then in Octave everything in the module will be accessible under "swigexample", as in the above example. When choosing a module name, make sure you don't use the same name as a built-in Octave command or standard module name.

    When Octave is asked to invoke swigexample, it will try to find the ".m" or ".oct" file that defines the function "swigexample". You therefore need to make sure that "swigexample.oct" is in Octave's search path, which can be specified with the environment variable "OCTAVE_PATH".

    To load an Octave module, simply type its name:

    octave:1> swigexample;
    octave:2> gcd(4, 6)
    ans =  2
    octave:3> cvar.Foo
    ans =  3
    octave:4> cvar.Foo=4;
    octave:5> cvar.Foo
    ans =  4
    

    Modules can also be loaded from within functions, even before being loaded in the base context. If the module is also used in the base context, however, it must first be loaded again:

    octave:1> function l = my_lcm(a, b)
    > swigexample
    > l = abs(a*b)/swigexample.gcd(a, b);
    > endfunction
    octave:2> my_lcm(4, 6)
    ans =  12
    octave:3> swigexample.gcd(4, 6)
    error: can't perform indexing operations for <unknown type> type
    octave:3> swigexample;
    octave:4> swigexample.gcd(4, 6)
    ans =  2
    

    29.3.2 Functions

    Global functions are wrapped as new Octave built-in functions. For example,

    %module swigexample
    int fact(int n); 

    creates a built-in function swigexample.fact(n) that works exactly like you think it does:

    octave:1> swigexample.fact(4)
    24 

    29.3.3 Global variables

    Global variables are a little special in Octave. Given a global variable:

    %module swigexample
    extern double Foo;
    

    To expose variables, SWIG actually generates two functions, to get and set the value. In this case, Foo_set and Foo_set would be generated. SWIG then automatically calls these functions when you get and set the variable-- in the former case creating a local copy in the interpreter of the C variables, and in the latter case copying an interpreter variables onto the C variable.

    octave:1> swigexample;
    octave:2> c=swigexample.cvar.Foo
    c =  3
    octave:3> swigexample.cvar.Foo=4;
    octave:4> c
    c =  3
    octave:5> swigexample.cvar.Foo
    ans =  4

    If a variable is marked with the %immutable directive then any attempts to set this variable will cause an Octave error. Given a global variable:

    %module swigexample
    %immutable;
    extern double Foo;
    %mutable;
    

    SWIG will allow the reading of Foo but when a set attempt is made, an error function will be called.

    octave:1> swigexample
    octave:2> swigexample.Foo=4
    error: attempt to set immutable member variable
    error: assignment failed, or no method for `swig_type = scalar'
    error: evaluating assignment expression near line 2, column 12 

    It is possible to add new functions or variables to the module. This also allows the user to rename/remove existing functions and constants (but not linked variables, mutable or immutable). Therefore users are recommended to be careful when doing so.

    octave:1> swigexample;
    octave:2> swigexample.PI=3.142;
    octave:3> swigexample.PI
    ans =  3.1420 

    29.3.4 Constants and enums

    Because Octave doesn't really have the concept of constants, C/C++ constants are not really constant in Octave. They are actually just a copy of the value into the Octave interpreter. Therefore they can be changed just as any other value. For example given some constants:

    %module swigexample
    %constant int ICONST=42;
    #define    SCONST      "Hello World"
    enum Days{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
    

    This is 'effectively' converted into the following Octave code:

    swigexample.ICONST=42
    swigexample.SCONST="Hello World"
    swigexample.SUNDAY=0
    .... 

    29.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface: C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface:

    %module swigexample
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Octave. For example:

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("w", "junk");
    octave:3> swigexample.fputs("Hello world", f);
    octave:4> swigexample.fclose(f);
    

    Simply printing the value of a wrapped C++ type will print its typename. E.g.,

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("junk", "w");
    octave:3> f
    f =
    
    {
      _p_FILE, ptr = 0x9b0cd00
    } 

    As the user of the pointer, you are responsible for freeing it, or closing any resources associated with it (just as you would in a C program). This does not apply so strictly to classes and structs (see below).

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("not there", "r");
    error: value on right hand side of assignment is undefined
    error: evaluating assignment expression near line 2, column 2 

    29.3.6 Structures and C++ classes

    SWIG wraps C structures and C++ classes by using a special Octave type called a swig_ref. A swig_ref contains a reference to one or more instances of C/C++ objects, or just the type information for an object. For each wrapped structure and class, a swig_ref will be exposed that has the name of the type. When invoked as a function, it creates a new object of its type and returns a swig_ref that points to that instance. This provides a very natural interface. For example,

    struct Point{
      int x, y;
    };
    

    is used as follows:

    octave:1> swigexample;
    octave:2> p=swigexample.Point();
    octave:3> p.x=3;
    octave:4> p.y=5;
    octave:5> p.x, p.y
    ans =  3
    ans =  5 
    

    In C++, invoking the type object in this way calls the object's constructor. swig_ref objects can also be acquired by having a wrapped function return a pointer, reference, or value of a non-primitive type.

    The swig_ref type handles indexing operations such that usage maps closely to what you would have in C/C++. Structure members are accessed as in the above example, by calling set and get methods for C++ variables. Methods also work as expected. For example, code wrapped in the following way

    class Point{
    public:
      int x, y;
      Point(int _x, int _y) : x(_x), y(_y) {}
      double distance(const Point& rhs) {
        return sqrt(pow(x-rhs.x, 2)+pow(y-rhs.y, 2));
      }
      void set(int _x, int _y) {
        x=_x; y=_y;
      }
    };
    

    can be used from Octave like this

    octave:1> swigexample;
    octave:2> p1=swigexample.Point(3, 5);
    octave:3> p2=swigexample.Point(1, 2);
    octave:4> p1.distance(p2)
    ans =  3.6056
    

    By using the swig_this() and swig_type() functions, one can discover the pointers to and types of the underlying C/C++ object.

    octave:5> swig_this(p1)
    ans = 162504808
    octave:6> swig_type(p1)
    ans = Point
    

    Note that swig_ref is a reference-counted pointer to a C/C++ object/type, and as such has pass-by-reference semantics. For example if one has a allocated a single object but has two swig_ref 's pointing to it, modifying the object through either of them will change the single allocated object. This differs from the usual pass-by-value (copy-on-write) semantics that Octave maintains for built-in types. For example, in the following snippet, modifying b does not modify a,

    octave:7> a=struct('x', 4)
    a =
    {
      x =  4
    }
    
    octave:8> b=a
    b =
    {
      x =  4
    }
    
    octave:9> b.y=4
    b =
    {
      x =  4
      y =  4
    }
    
    octave:10> a
    a =
    {
      x =  4
    }
    

    However, when dealing with wrapped objects, one gets the behavior

    octave:2> a=Point(3, 5)
    a =
    
    {
      Point, ptr = 0x9afbbb0
    }
    
    octave:3> b=a
    b =
    
    {
      Point, ptr = 0x9afbbb0
    }
    
    octave:4> b.set(2, 1);
    octave:5> b.x, b.y
    ans =  2
    ans =  1
    octave:6> a.x, a.y
    ans =  2
    ans =  1
    

    Depending on the ownership setting of a swig_ref, it may call C++ destructors when its reference count goes to zero. See the section on memory management below for details.

    29.3.7 C++ inheritance

    Single and multiple inheritance are fully supported. The swig_ref type carries type information along with any C++ object pointer it holds. This information contains the full class hierarchy. When an indexing operation (such as a method invocation) occurs, the tree is walked to find a match in the current class as well as any of its bases. The lookup is then cached in the swig_ref.

    29.3.8 C++ overloaded functions

    Overloaded functions are supported, and handled as in other modules. That is, each overload is wrapped separately (under internal names), and a dispatch function is also emitted under the external/visible name. The dispatch function selects which overload to call (if any) based on the passed arguments. typecheck typemaps are used to analyze each argument, as well as assign precedence. See the chapter on typemaps for details.

    29.3.9 C++ operators

    C++ operator overloading is supported, in a way similar to other modules. The swig_ref type supports all unary and binary operators between itself and all other types that exist in the system at module load time. When an operator is used (where one of the operands is a swig_ref), the runtime routes the call to either a member function of the given object, or to a global function whose named is derived from the types of the operands (either both or just the lhs or rhs).

    For example, if a and b are SWIG variables in Octave, a+b becomes a.__add__(b). The wrapper is then free to implement __add__ to do whatever it wants. A wrapper may define the __add__ function manually, %rename some other function to it, or %rename a C++ operator to it.

    By default the C++ operators are renamed to their corresponding Octave operators. So without doing any work, the following interface

    %inline {
    struct A {
      int value;
      A(int _value) : value(_value) {}
      A operator+ (const A& x) {
        return A(value+x.value);
      }
    };
    }
    

    is usable from Octave like this:

    a=A(2), b=A(3), c=a+b
    assert(c.value==5);
    

    Octave operators are mapped in the following way:

    __brace__      a{args}
    __brace_asgn__ a{args} = rhs
    __paren__      a(args)
    __paren_asgn__ a(args) = rhs
    __str__        generates string rep
    __not__        !a
    __uplus__      +a
    __uminus__     -a
    __transpose__  a.'
    __hermitian__  a'
    __incr__       a++
    __decr__       a--
    __add__        a + b
    __sub__        a - b
    __mul__        a * b
    __div__        a / b
    __pow__        a ^ b
    __ldiv__       a \ b
    __lshift__     a <<b
    __rshift__     a >> b
    __lt__         a  <b
    __le__         a  <= b
    __eq__         a == b
    __ge__         a >= b
    __gt__         a > b
    __ne__         a != b
    __el_mul__     a .* b
    __el_div__     a ./ b
    __el_pow__     a .^ b
    __el_ldiv__    a .\ b
    __el_and__     a & b
    __el_or__      a | b
    

    On the C++ side, the default mappings are as follows:

    %rename(__add__)       *::operator+;
    %rename(__add__)       *::operator+();
    %rename(__add__)       *::operator+() const;
    %rename(__sub__)       *::operator-;
    %rename(__uminus__)    *::operator-();
    %rename(__uminus__)    *::operator-() const;
    %rename(__mul__)       *::operator*;
    %rename(__div__)       *::operator/;
    %rename(__mod__)       *::operator%;
    %rename(__lshift__)    *::operator<
    
    >;
    %rename(__el_and__)    *::operator&&;
    %rename(__el_or__)     *::operator||;
    %rename(__xor__)       *::operator^;
    %rename(__invert__)    *::operator~;
    %rename(__lt__)        *::operator
    
    ;
    %rename(__ge__)        *::operator>=;
    %rename(__eq__)        *::operator==;
    %rename(__ne__)        *::operator!=;
    %rename(__not__)       *::operator!;
    %rename(__incr__)      *::operator++;
    %rename(__decr__)      *::operator--;
    %rename(__paren__)     *::operator();
    %rename(__brace__)     *::operator[];
    

    Octave can also utilise friend (i.e. non-member) operators with a simple %rename: see the example in the Examples/octave/operator directory.

    29.3.10 Class extension with %extend

    The %extend directive works the same as in other modules.

    You can use it to define special behavior, like for example defining Octave operators not mapped to C++ operators, or defining certain Octave mechanisms such as how an object prints. For example, the octave_value::{is_string, string_value, print} functions are routed to a special method __str__ that can be defined inside an %extend.

    %extend A {
    string __str__() {
      stringstream sout;
      sout<<$self->value;
      return sout.str();
    }
    }
    

    Then in Octave one gets,

    octave:1> a=A(4);
    octave:2> a
    a = 4
    octave:3> printf("%s\n", a);
    4
    octave:4> a.__str__()
    4
    

    Similarly, Octave can use the __float__ method to convert an object to a numeric value.

    Octave 3.8.0 and later versions will also map unary functions X() to the corresponding __X__ method, where X includes: abs(), acos(), acosh(), angle(), arg(), asin(), asinh(), atan(), atanh(), cbrt(), ceil(), conj(), cos(), cosh(), dawson(), erf(), erfc(), erfcinv(), erfcx(), erfi(), erfinv(), exp(), expm1(), finite(), fix(), floor(), gamma(), imag(), isalnum(), isalpha(), isascii(), iscntrl(), isdigit(), isgraph(), isinf(), islower(), isna(), isnan(), isprint(), ispunct(), isspace(), isupper(), isxdigit(), lgamma(), log(), log10(), log1p(), log2(), real(), round(), roundb(), signbit(), signum(), sin(), sinh(), sqrt(), tan(), tanh(), toascii(), tolower(), toupper()

    29.3.11 C++ templates

    C++ class and function templates are fully supported as in other modules, in that the %template directive may used to create explicit instantiations of templated types. For example, function templates can be instantiated as follows:

    %module swigexample
    %inline {
      template<class __scalar>
        __scalar mul(__scalar a, __scalar b) {
        return a*b;
      }
    }
    %include <std_complex.i>
    %template(mul) mul<std::complex<double> >
    %template(mul) mul<double>
    

    and then used from Octave

    octave:1> mul(4, 3)
    ans =  12
    octave:2> mul(4.2, 3.6)
    ans =  15.120
    octave:3> mul(3+4i, 10+2i)
    ans =  22 + 46i
    

    Similarly, class templates can be instantiated as in the following example,

    %module swigexample
    %include <std_complex.i>
    %include <std_string.i>
    %inline {
      #include <sstream>
      template<class __scalar> class sum {
        __scalar s;
      public:
        sum(__scalar _s=0) : s(_s) {}
        sum& add(__scalar _s) {
          s+=_s;
          return *this;
        }
        std::string __str__() const {
          std::stringstream sout;
          sout<<s;
          return sout.str();
        }
      };
    }
    %template(sum_complex) sum<std::complex<double> >;
    %template(sum_double) sum<double>;
    

    and then used from Octave

    octave:2> a=sum_complex(2+3i);
    octave:3> a.add(2)
    ans =
    
    (4, 3)
    octave:4> a.add(3+i)
    ans =
    
    (7, 4)
    

    29.3.12 C++ Smart Pointers

    29.3.12.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Octave in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    29.3.12.2 Generic Smart Pointers

    C++ smart pointers are fully supported as in other modules.

    29.3.13 Directors (calling Octave from C++ code)

    There is full support for SWIG Directors, which permits Octave code to subclass C++ classes, and implement their virtual methods.

    Octave has no direct support for object oriented programming, however the swig_ref type provides some of this support. You can manufacture a swig_ref using the subclass function (provided by the SWIG/Octave runtime).

    For example,

    octave:1> a=subclass();
    octave:2> a.my_var = 4;
    octave:3> a.my_method = @(self) printf("my_var = ", self.my_var);
    octave:4> a.my_method();
    my_var = 4
    

    subclass() can also be used to subclass one or more C++ types. Suppose you have an interface defined by

    %inline {
    class A {
    public:
      virtual my_method() {
        printf("c-side routine called\n");
      }
    };
    void call_your_method(A& a) {
      a.my_method();
    }
    }
    

    Then from Octave you can say:

    octave:1> B=@() subclass(A(), @my_method);
    octave:2> function my_method(self)
    octave:3>   printf("octave-side routine called\n");
    octave:4> end
    octave:5> call_your_method(B());
    octave-side routine called
    

    or more concisely,

    octave:1> B=@() subclass(A(), 'my_method', @(self) printf("octave-side routine called\n"));
    octave:2> call_your_method(B());
    octave-side routine called
    

    Note that you have to enable directors via the %feature directive (see other modules for this).

    subclass() will accept any number of C++ bases or other subclass()'ed objects, (string, octave_value) pairs, and function_handles. In the first case, these are taken as base classes; in the second case, as named members (either variables or functions, depending on whether the given value is a function handle); in the third case, as member functions whose name is taken from the given function handle. E.g.,

    octave:1> B=@(some_var=2) subclass(A(), 'some_var', some_var, @some_func, 'another_func',
    @(self) do_stuff())
    

    You can also assign non-C++ member variables and functions after construct time. There is no support for non-C++ static members.

    There is limited support for explicitly referencing C++ bases. So, in the example above, we could have

    octave:1> B=@() subclass(A(), @my_method);
    octave:2> function my_method(self)
    octave:3>   self.A.my_method();
    octave:4>   printf("octave-side routine called\n");
    octave:5> end
    octave:6> call_your_method(B());
    c-side routine called
    octave-side routine called
    

    29.3.14 Threads

    The use of threads in wrapped Director code is not supported; i.e., an Octave-side implementation of a C++ class must be called from the Octave interpreter's thread. Anything fancier (apartment/queue model, whatever) is left to the user. Without anything fancier, this amounts to the limitation that Octave must drive the module... like, for example, an optimization package that calls Octave to evaluate an objective function.

    29.3.15 Memory management

    As noted above, swig_ref represents a reference counted pointer to a C/C++-side object. It also contains a flag indicating whether Octave or the C/C++ code owns the object. If Octave owns it, any destructors will be called when the reference count reaches zero. If the C/C++ side owns the object, then destructors will not be called when the reference count goes to zero.

    For example,

    %inline {
    class A {
    public:
      A() { printf("A constructing\n"); }
      ~A() { printf("A destructing\n"); }
    };
    }
    

    Would produce this behavior in Octave:

    octave:1> a=A();
    A constructing
    octave:2> b=a;
    octave:3> clear a;
    octave:4> b=4;
    A destructing
    

    The %newobject directive may be used to control this behavior for pointers returned from functions.

    In the case where one wishes for the C++ side to own an object that was created in Octave (especially a Director object), one can use the __disown() method to invert this logic. Then letting the Octave reference count go to zero will not destroy the object, but destroying the object will invalidate the Octave-side object if it still exists (and call destructors of other C++ bases in the case of multiple inheritance/subclass()'ing).

    29.3.16 STL support

    Various STL library files are provided for wrapping STL containers.

    29.3.17 Matrix typemaps

    Octave provides a rich set of classes for dealing with matrices. Currently there are no built-in typemaps to deal with those. However, these are relatively straight forward for users to add themselves (see the docs on typemaps). Without much work (a single typemap decl-- say, 5 lines of code in the interface file), it would be possible to have a function

    double my_det(const double* mat, int m, int n);
    

    that is accessed from Octave as,

    octave:1> my_det(rand(4));
    ans = -0.18388
    


    30 SWIG and Perl5

    Caution: This chapter is under repair!

    This chapter describes SWIG's support of Perl5. Although the Perl5 module is one of the earliest SWIG modules, it has continued to evolve and has been improved greatly with the help of SWIG users. For the best results, it is recommended that SWIG be used with Perl 5.8 or later. We're no longer testing regularly with older versions, but Perl 5.6 seems to mostly work, while older versions don't.

    30.1 Overview

    To build Perl extension modules, SWIG uses a layered approach. At the lowest level, simple procedural wrappers are generated for functions, classes, methods, and other declarations in the input file. Then, for structures and classes, an optional collection of Perl proxy classes can be generated in order to provide a more natural object oriented Perl interface. These proxy classes simply build upon the low-level interface.

    In describing the Perl interface, this chapter begins by covering the essentials. First, the problem of configuration, compiling, and installing Perl modules is discussed. Next, the low-level procedural interface is presented. Finally, proxy classes are described. Advanced customization features, typemaps, and other options are found near the end of the chapter.

    30.2 Preliminaries

    To build a Perl5 module, run SWIG using the -perl or -perl5 option as follows:

    swig -perl example.i
    
    

    This produces two files. The first file, example_wrap.c contains all of the C code needed to build a Perl5 module. The second file, example.pm contains supporting Perl code needed to properly load the module.

    To build the module, you will need to compile the file example_wrap.c and link it with the rest of your program.

    30.2.1 Getting the right header files

    In order to compile, SWIG extensions need the following Perl5 header files:

    #include "Extern.h"
    #include "perl.h"
    #include "XSUB.h"
    

    These are typically located in a directory like this

    /usr/lib/perl/5.14/CORE
    

    The SWIG configuration script automatically tries to locate this directory so that it can compile examples. However, if you need to find out where the directory is located, an easy way to find out is to ask Perl itself:

    $ perl -e 'use Config; print "$Config{archlib}\n";'
    /usr/lib/perl/5.14
    

    30.2.2 Compiling a dynamic module

    The preferred approach to building an extension module is to compile it into a shared object file or DLL. Assuming you have code you need to link to in a file called example.c, you will need to compile your program using commands like this (shown for Linux):

    $ swig -perl example.i
    $ gcc -fPIC example.c
    $ gcc -fPIC -c example_wrap.c -I/usr/lib/perl/5.14/CORE -Dbool=char
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The exact compiler options vary from platform to platform. SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/perl5 directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the shared object file must match the module name used in the SWIG interface file. If you used ` %module example', then the target should be named `example.so ', `example.sl', or the appropriate dynamic module name on your system.

    30.2.3 Building a dynamic module with MakeMaker

    It is also possible to use Perl to build dynamically loadable modules for you using the MakeMaker utility. To do this, write a Perl script such as the following:

    # File : Makefile.PL
    use ExtUtils::MakeMaker;
    WriteMakefile(
            `NAME'    => `example',                  # Name of package
            `LIBS'    => [`-lm'],                    # Name of custom libraries
            `OBJECT'  => `example.o example_wrap.o'  # Object files
    );
    
    

    Now, to build a module, simply follow these steps:

    $ perl Makefile.PL
    $ make
    $ make install
    

    If you are planning to distribute a SWIG-generated module, this is the preferred approach to compilation. More information about MakeMaker can be found in "Programming Perl, 2nd ed." by Larry Wall, Tom Christiansen, and Randal Schwartz.

    30.2.4 Building a static version of Perl

    If you machine does not support dynamic loading or if you've tried to use it without success, you can build a new version of the Perl interpreter with your SWIG extensions added to it. To build a static extension, you first need to invoke SWIG as follows:

    $ swig -perl -static example.i
    

    By default SWIG includes code for dynamic loading, but the -static option takes it out.

    Next, you will need to supply a main() function that initializes your extension and starts the Perl interpreter. While, this may sound daunting, SWIG can do this for you automatically as follows:

    %module example
    
    %inline %{
    extern double My_variable;
    extern int fact(int);
    %}
    
    // Include code for rebuilding Perl
    %include <perlmain.i>
    

    The same thing can be accomplished by running SWIG as follows:

    $ swig -perl -static -lperlmain.i example.i
    

    The perlmain.i file inserts Perl's main() function into the wrapper code and automatically initializes the SWIG generated module. If you just want to make a quick a dirty module, this may be the easiest way. By default, the perlmain.i code does not initialize any other Perl extensions. If you need to use other packages, you will need to modify it appropriately. You can do this by just copying perlmain.i out of the SWIG library, placing it in your own directory, and modifying it to suit your purposes.

    To build your new Perl executable, follow the exact same procedure as for a dynamic module, but change the link line to something like this:

    $ gcc example.o example_wrap.o -L/usr/lib/perl/5.14/CORE \
            -lperl -lsocket -lnsl -lm -o myperl
    

    This will produce a new version of Perl called myperl. It should be functionality identical to Perl with your C/C++ extension added to it. Depending on your machine, you may need to link with additional libraries such as -lsocket, -lnsl, -ldl, etc.

    30.2.5 Using the module

    To use the module, simply use the Perl use statement. If all goes well, you will be able to do this:

    $ perl
    use example;
    print example::fact(4), "\n";
    24
    

    A common error received by first-time users is the following:

    use example;
    Can't locate example.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at - line 1.
    BEGIN failed--compilation aborted at - line 1.
    

    This error is almost caused when the name of the shared object file you created doesn't match the module name you specified with the %module directive.

    A somewhat related, but slightly different error is this:

    use example;
    Can't find 'boot_example' symbol in ./example.so
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    

    This error is generated because Perl can't locate the module bootstrap function in the SWIG extension module. This could be caused by a mismatch between the module name and the shared library name. However, another possible cause is forgetting to link the SWIG-generated wrapper code with the rest of your application when you linked the extension module.

    Another common error is the following:

    use example;
    Can't load './example.so' for module example: ./example.so: 
    undefined symbol: Foo at /usr/lib/perl/5.14/i386-linux/DynaLoader.pm line 169.
    
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration. Better yet, update the header file so that it doesn't have an undefined declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o example.so
    

    If the foo library is compiled as a shared library, you might get the following error when you try to use your module:

    use example;
    Can't load './example.so' for module example: libfoo.so: cannot open shared object file: 
    No such file or directory at /usr/lib/perl/5.14/i386-linux/DynaLoader.pm line 169.
    
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    >>>                 
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To get the loader to look in other locations, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib \
          -o example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Perl, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib perl
    

    Finally, you can use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    30.2.6 Compilation problems and compiling with C++

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Perl interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -perl example.i
    $ g++ -fPIC -c example.cxx
    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.14/i386-linux/CORE
    $ g++ -shared example.o example_wrap.o -o example.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    $ swig -c++ -perl example.i
    $ CC -Kpic -c example.cxx
    $ CC -Kpic -c example_wrap.cxx -I/usr/lib/perl/5.14/i386-linux/CORE
    $ CC -shared example.o example_wrap.o -o example.so -lCrun
    

    Of course, the names of the extra libraries are completely non-portable---you will probably need to do some experimentation.

    Another possible compile problem comes from recent versions of Perl (5.8.0) and the GNU tools. If you see errors having to do with _crypt_struct, that means _GNU_SOURCE is not defined and it needs to be. So you should compile the wrapper like:

    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.8.0/CORE -D_GNU_SOURCE
    

    -D_GNU_SOURCE is also included in the Perl ccflags, which can be found by running

    $ perl -e 'use Config; print "$Config{ccflags}\n";'
    

    So you could also compile the wrapper like

    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.8.0/CORE \
    `perl -MConfig -e 'print $Config{ccflags}'`
    

    Sometimes people have suggested that it is necessary to relink the Perl interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary on most platforms. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Perl.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example, notice the first line of output here:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    If linking wasn't enough of a problem, another major complication of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Perl, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. Also, be aware that certain C++ features, especially RTTI, can behave strangely when working with multiple modules.

    It should be noted that you may get a lot of error messages about the 'bool' datatype when compiling a C++ Perl module. If you experience this problem, you can try the following:

    • Use -DHAS_BOOL when compiling the SWIG wrapper code
    • Or use -Dbool=char when compiling.

    Finally, recent versions of Perl (5.8.0) have namespace conflict problems. Perl defines a bunch of short macros to make the Perl API function names shorter. For example, in /usr/lib/perl/5.8.0/CORE/embed.h there is a line:

    #define do_open Perl_do_open
    

    The problem is, in the <iostream> header from GNU libstdc++v3 there is a private function named do_open. If <iostream> is included after the perl headers, then the Perl macro causes the iostream do_open to be renamed, which causes compile errors. Hopefully in the future Perl will support a PERL_NO_SHORT_NAMES flag, but for now the only solution is to undef the macros that conflict. Lib/perl5/noembed.h in the SWIG source has a list of macros that are known to conflict with either standard headers or other headers. But if you get macro type conflicts from other macros not included in Lib/perl5/noembed.h while compiling the wrapper, you will have to find the macro that conflicts and add an #undef into the .i file. Please report any conflicting macros you find to swig-user mailing list.

    30.2.7 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Perl executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    30.3 Building Perl Extensions under Windows

    Building a SWIG extension to Perl under Windows is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into the Perl interpreter. This section assumes you are using SWIG with Microsoft Visual C++ although the procedure may be similar with other compilers.

    30.3.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly requires these steps:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note: If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -perl5 -o $(ProjDir)\$(InputName)_wrap.cxx $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.cxx" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Perl 5 installation under "Additional include directories".
    • Define the symbols WIN32 and MSWIN32 under preprocessor options. If using the ActiveWare port, also define the symbol PERL_OBJECT. Note that all extensions to the ActiveWare port must be compiled with the C++ compiler since Perl has been encapsulated in a C++ class.
    • Finally, select the settings for the entire project and go to "Link Options". Add the Perl library file to your link libraries. For example "perl.lib". Also, set the name of the output file to match the name of your Perl module (ie. example.dll).
    • Build your project.

    Now, assuming you made it this far, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Perl extension, simply run Perl and use the use command as normal. For example:

    DOS > perl
    use example;
    $a = example::fact(4);
    print "$a\n";
    
    

    30.3.2 Using other compilers

    SWIG is known to work with Cygwin and may work with other compilers on Windows. For general hints and suggestions refer to the Windows chapter.

    30.4 The low-level interface

    At its core, the Perl module uses a simple low-level interface to C function, variables, constants, and classes. This low-level interface can be used to control your application. However, it is also used to construct more user-friendly proxy classes as described in the next section.

    30.4.1 Functions

    C functions are converted into new Perl built-in commands (or subroutines). For example:

    %module example
    int fact(int a);
    ...
    

    Now, in Perl:

    use example;
    $a = &example::fact(2);
    

    30.4.2 Global variables

    Global variables are handled using Perl's magic variable mechanism. SWIG generates a pair of functions that intercept read/write operations and attaches them to a Perl variable with the same name as the C global variable. Thus, an interface like this

    %module example;
    ...
    double Spam;
    ...
    

    is accessed as follows:

    use example;
    print $example::Spam, "\n";
    $example::Spam = $example::Spam + 4
    # ... etc ...
    
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can also use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    It is also possible to tag a specific variable as read-only like this:

    %{
    extern char *path;
    %}
    %immutable path; 
    ...
    ...
    extern char *path;       // Declared later in the input
    

    30.4.3 Constants

    By default, constants are wrapped as read-only Perl variables. For example:

    %module example
    
    #define FOO 42
    

    In Perl:

    use example;
    print $example::FOO, "\n";   # OK
    $example::FOO = 2;           # Error
    

    Alternatively, if you use swig's -const option, constants are wrapped such that the leading $ isn't required (by using a constant subroutine), which usually gives a more natural Perl interface, for example:

    use example;
    print example::FOO, "\n";
    

    30.4.4 Pointers

    SWIG represents pointers as blessed references. A blessed reference is the same as a Perl reference except that it has additional information attached to it indicating what kind of reference it is. That is, if you have a C declaration like this:

    Matrix *new_Matrix(int n, int m);
    

    The module returns a value generated as follows:

    $ptr = new_Matrix(int n, int m);     # Save pointer return result
    bless $ptr, "p_Matrix";              # Bless it as a pointer to Matrix
    

    SWIG uses the "blessing" to check the datatype of various pointers. In the event of a mismatch, an error or warning message is generated.

    To check to see if a value is the NULL pointer, use the defined() command:

    if (defined($ptr)) {
      print "Not a NULL pointer.";
    } else {
      print "Is a NULL pointer.";
    }
    
    

    To create a NULL pointer, you should pass the undef value to a function.

    The "value" of a Perl reference is not the same as the underlying C pointer that SWIG wrapper functions return. Suppose that $a and $b are two references that point to the same C object. In general, $a and $b will be different--since they are different references. Thus, it is a mistake to check the equality of $a and $b to check the equality of two C pointers. The correct method to check equality of C pointers is to dereference them as follows:

    if ($$a == $$b) {
      print "a and b point to the same thing in C";
    } else {
      print "a and b point to different objects.";
    }
    
    

    As much as you might be inclined to modify a pointer value directly from Perl, don't. Manipulating pointer values is architecture dependent and could cause your program to crash. Similarly, don't try to manually cast a pointer to a new type by reblessing a pointer. This may not work like you expect and it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return NULL if the conversion can't be performed.

    Compatibility Note: In earlier versions, SWIG tried to preserve the same pointer naming conventions as XS and xsubpp. Given the advancement of the SWIG typesystem and the growing differences between SWIG and XS, this is no longer supported.

    30.4.5 Structures

    Access to the contents of a structure are provided through a set of low-level accessor functions as described in the "SWIG Basics" chapter. For example,

    struct Vector {
      double x, y, z;
    };
    

    gets mapped into the following collection of accessor functions:

    struct Vector *new_Vector();
    void           delete_Vector(Vector *v);
    double         Vector_x_get(Vector *obj)
    void           Vector_x_set(Vector *obj, double x)
    double         Vector_y_get(Vector *obj)
    void           Vector_y_set(Vector *obj, double y)
    double         Vector_z_get(Vector *obj)
    void           Vector_z_set(Vector *obj, double z)
    
    

    These functions are then used to access structure data from Perl as follows:

    $v = example::new_Vector();
    print example::Vector_x_get($v), "\n";   # Get x component
    example::Vector_x_set($v, 7.8);          # Change x component
    

    Similar access is provided for unions and the data members of C++ classes.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    Array members are normally wrapped as read-only. For example,

    struct Foo {
      int x[50];
    };
    

    produces a single accessor function like this:

    int *Foo_x_get(Foo *self) {
      return self->x;
    };
    

    If you want to set an array member, you will need to supply a "memberin" typemap described later in this chapter. As a special case, SWIG does generate code to set array members of type char (allowing you to store a Python string in the structure).

    When structure members are wrapped, they are handled as pointers. For example,

    struct Foo {
      ...
    };
    
    struct Bar {
      Foo f;
    };
    

    generates accessor functions such as this:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    
    void Bar_f_set(Bar *b, Foo *val) {
      b->f = *val;
    }
    

    30.4.6 C++ classes

    C++ classes are wrapped by building a set of low level accessor functions. Consider the following class:

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    static void print(List *l);
    };
    

    When wrapped by SWIG, the following functions are created:

    List    *new_List();
    void     delete_List(List *l);
    int      List_search(List *l, char *item);
    void     List_insert(List *l, char *item);
    void     List_remove(List *l, char *item);
    char    *List_get(List *l, int n);
    int      List_length_get(List *l);
    void     List_length_set(List *l, int n);
    void     List_print(List *l);
    
    

    In Perl, these functions are used in a straightforward manner:

    use example;
    $l = example::new_List();
    example::List_insert($l, "Ale");
    example::List_insert($l, "Stout");
    example::List_insert($l, "Lager")
    example::List_print($l)
    Lager
    Stout
    Ale
    print example::List_length_get($l), "\n";
    3
    

    At this low level, C++ objects are really just typed pointers. Member functions are accessed by calling a C-like wrapper with an instance pointer as the first argument. Although this interface is fairly primitive, it provides direct access to C++ objects. A higher level interface using Perl proxy classes can be built using these low-level accessors. This is described shortly.

    30.4.7 C++ classes and type-checking

    The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    and a function

    void spam(Foo *f);
    

    then the function spam() accepts Foo * or a pointer to any class derived from Foo. If necessary, the type-checker also adjusts the value of the pointer (as is necessary when multiple inheritance is used).

    30.4.8 C++ overloaded functions

    If you have a C++ program with overloaded functions or methods, you will need to disambiguate those methods using %rename. For example:

    /* Forward renaming declarations */
    %rename(foo_i) foo(int); 
    %rename(foo_d) foo(double);
    ...
    void foo(int);           // Becomes 'foo_i'
    void foo(char *c);       // Stays 'foo' (not renamed)
    
    class Spam {
    public:
      void foo(int);      // Becomes 'foo_i'
      void foo(double);   // Becomes 'foo_d'
      ...
    };
    

    Now, in Perl, the methods are accessed as follows:

    use example;
    example::foo_i(3);
    $s = example::new_Spam();
    example::Spam_foo_i($s, 3);
    example::Spam_foo_d($s, 3.14);
    

    Please refer to the "SWIG Basics" chapter for more information.

    30.4.9 Operators

    As of version 1.3.27 SWIG automatically renames the most common C++ operators, and maps them into the perl module with the proper 'use overload ...' so you don't need to do any work.

    The following C++ operators are currently supported by the Perl module:

    • operator++
    • operator--
    • operator+
    • operator-
    • operator*
    • operator/
    • operator==
    • operator!=
    • operator%
    • operator>
    • operator<
    • operator and
    • operator or

    30.4.10 Modules and packages

    When you create a SWIG extension, everything gets placed into a single Perl module. The name of the module is determined by the %module directive. To use the module, do the following:

    $ perl5
    use example;                      # load the example module
    print example::fact(4), "\n"      # Call a function in it
    24
    

    Usually, a module consists of a collection of code that is contained within a single file. A package, on the other hand, is the Perl equivalent of a namespace. A package is a lot like a module, except that it is independent of files. Any number of files may be part of the same package--or a package may be broken up into a collection of modules if you prefer to think about it in this way.

    SWIG installs its functions into a package with the same name as the module.

    Incompatible Change: previous versions of SWIG enabled you to change the name of the package by using the -package option, this feature has been removed in order to properly support modules that used nested namespaces, e.g. Foo::Bar::Baz. To give your module a nested namespace simply provide the fully qualified name in your %module directive:

    %module "Foo::Bar::Baz"
    

    NOTE: the double quotes are necessary.

    Using the package option of the %module directive allows you to specify what Perl namespace that the module will be living in when installed. This is useful in the situation where a module maintainer wants to split a large module into smaller pieces to make maintenance easier, but doesn't want to have that affect the module name used by applications. So for example, if I wanted to split XML::Xerces into XML::Xerces::SAX, etc. , but I wanted all the applications to be able to access the classes using the XML::Xerces namespace I could use:

    %module(package="XML::Xerces") "XML::Xerces::SAX
    

    And now all the applications could use the class XML::Xerces::SAXParser. Without the package directive splitting the module would force applications to use the class XML::Xerces::SAX::SAXParser. This could break compatibility for existing applications that are already using the class under the name XML::Xerces::SAXParser.

    30.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x+*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Perl, this allows you to pass simple values. For example:

    $a = example::add(3, 4);
    print "$a\n";
    7
    $b = example::sub(7, 4);
    print "$b\n";
    3
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT , use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Perl, a mutated parameter shows up as a return value. For example:

    $a = example::negate(3);
    print "$a\n";
    -3
    

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Perl, the function will return multiple values.

    ($bytes, $success) = example::send_message("Hello World");
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Perl:

    ($r, $c) = example::get_dimensions($m);
    

    In certain cases, it is possible to treat Perl references as C pointers. To do this, use the REFERENCE typemap. For example:

    %module example
    %include "typemaps.i"
    
    void add(int x, int y, int *REFERENCE);
    

    In Perl:

    use example;
    $c = 0.0;
    example::add(3, 4, \$c);
    print "$c\n";
    7
    

    Note: The REFERENCE feature is only currently supported for numeric types (integers and floating point).

    30.6 Exception handling

    The SWIG %exception directive can be used to create a user-definable exception handler for converting exceptions in your C/C++ program into Perl exceptions. The chapter on customization features contains more details, but suppose you have a C++ class like the following:

    class RangeError {};   // Used for an exception
    
    class DoubleArray {
      private:
        int n;
        double *ptr;
      public:
        // Create a new array of fixed size
        DoubleArray(int size) {
          ptr = new double[size];
          n = size;
        }
        // Destroy an array
        ~DoubleArray() {
          delete ptr;
        }
        // Return the length of the array
        int   length() {
          return n;
        }
    
        // Get an item from the array and perform bounds checking.
        double getitem(int i) {
          if ((i >= 0) && (i < n))
            return ptr[i];
          else
            throw RangeError();
        }
    
        // Set an item in the array and perform bounds checking.
        void setitem(int i, double val) {
          if ((i >= 0) && (i < n))
            ptr[i] = val;
          else
            throw RangeError();
        }
      };
    

    Since several methods in this class can throw an exception for an out-of-bounds access, you might want to catch this in the Perl extension by writing the following in an interface file:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    
    class DoubleArray {
    ...
    };
    

    The exception handling code is inserted directly into generated wrapper functions. The $action variable is replaced with the C/C++ code being executed by the wrapper. When an exception handler is defined, errors can be caught and used to gracefully generate a Perl error instead of forcing the entire program to terminate with an uncaught error.

    As shown, the exception handling code will be added to every wrapper function. Since this is somewhat inefficient. You might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    
    %exception setitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    If you had a lot of different methods, you can avoid extra typing by using a macro. For example:

    %define RANGE_ERROR
    {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    %enddef
    
    %exception getitem RANGE_ERROR;
    %exception setitem RANGE_ERROR;
    

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on " Customization features" for more examples.

    Compatibility note: In SWIG1.1, exceptions were defined using the older %except directive:

    %except(python) {
      try {
        $function
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    

    This is still supported, but it is deprecated. The newer %exception directive provides the same functionality, but it has additional capabilities that make it more powerful.

    30.7 Remapping datatypes with typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Perl C API as well as the material in the "Typemaps " chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Perl interface.

    30.7.1 A simple typemap example

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Perl to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) SvIV($input);
      printf("Received an integer : %d\n", $1);
    }
    ...
    %inline %{
    extern int fact(int n);
    %}
    
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object (usually a SV *).

    When this example is used in Perl5, it will operate as follows:

    use example;
    $n = example::fact(6);
    print "$n\n";
    ...
    
    Output:
    Received an integer : 6
    720
    

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) SvIV($input);
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    It should be noted that the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, unsigned len) {
        $1 = SvPV($input, $2);
    };
    
    int count(char c, char *str, unsigned len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Perl object. This allows the function to be used like this (notice how the length parameter is omitted):

    example::count("e", "Hello World");
    1
    >>>
    

    30.7.2 Perl5 typemaps

    The previous section illustrated an "in" typemap for converting Perl objects to C. A variety of different typemap methods are defined by the Perl module. For example, to convert a C integer back into a Perl object, you might define an "out" typemap like this:

    %typemap(out) int {
      $result = sv_newmortal();
      sv_setiv($result, (IV) $1);
      argvi++;
    }
    

    The following typemap methods are available:

    %typemap(in)

    Converts Perl5 object to input function arguments.

    %typemap(out)

    Converts function return value to a Perl5 value.

    %typemap(varin)

    Converts a Perl5 object to a global variable.

    %typemap(varout)

    Converts a global variable to a Perl5 object.

    %typemap(freearg)

    Cleans up a function argument after a function call

    %typemap(argout)

    Output argument handling

    %typemap(ret)

    Clean up return value from a function.

    %typemap(memberin)

    Setting of C++ member data (all languages).

    %typemap(memberout)

    Return of C++ member data (all languages).

    %typemap(check)

    Check value of input parameter.

    30.7.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the " Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Perl.

    $input

    A Perl object holding the value of an argument of variable value.

    $result

    A Perl object that holds the result to be returned to Perl.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Perl name of the wrapper function being created.

    30.7.4 Useful functions

    When writing typemaps, it is necessary to work directly with Perl5 objects. This, unfortunately, can be a daunting task. Consult the "perlguts" man-page for all of the really ugly details. A short summary of commonly used functions is provided here for reference. It should be stressed that SWIG can be used quite effectively without knowing any of these details--especially now that there are typemap libraries that can already been written.

    Perl Integer Functions

    int   SvIV(SV *);
    void  sv_setiv(SV *sv, IV value);
    SV   *newSViv(IV value);
    int   SvIOK(SV *);
    

    Perl Floating Point Functions

    double SvNV(SV *);
    void   sv_setnv(SV *, double value);
    SV    *newSVnv(double value);
    int    SvNOK(SV *);
    

    Perl String Functions

    char     *SvPV(SV *, STRLEN len);
    void      sv_setpv(SV *, char *val);
    void      sv_setpvn(SV *, char *val, STRLEN len);
    SV       *newSVpv(char *value, STRLEN len);
    int       SvPOK(SV *);
    void      sv_catpv(SV *, char *);
    void      sv_catpvn(SV *, char *, STRLEN);
    

    Perl References

    void      sv_setref_pv(SV *, char *, void *ptr);
    int       sv_isobject(SV *);
    SV       *SvRV(SV *);
    int       sv_isa(SV *, char *0;
    

    30.8 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "perl5.swg" and "typemaps.i " in the SWIG library.

    30.8.1 Converting a Perl5 array to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Perl5 array reference to be used as a char ** datatype.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      AV *tempav;
      I32 len;
      int i;
      SV  **tv;
      if (!SvROK($input))
        croak("Argument $argnum is not a reference.");
      if (SvTYPE(SvRV($input)) != SVt_PVAV)
        croak("Argument $argnum is not an array.");
      tempav = (AV*)SvRV($input);
      len = av_len(tempav);
      $1 = (char **) malloc((len+2)*sizeof(char *));
      for (i = 0; i <= len; i++) {
        tv = av_fetch(tempav, i, 0);
        $1[i] = (char *) SvPV(*tv, PL_na);
      }
      $1[i] = NULL;
    };
    
    // This cleans up the char ** array after the function call
    %typemap(freearg) char ** {
      free($1);
    }
    
    // Creates a new Perl array and places a NULL-terminated char ** into it
    %typemap(out) char ** {
      AV *myav;
      SV **svs;
      int i = 0, len = 0;
      /* Figure out how many elements we have */
      while ($1[len])
        len++;
      svs = (SV **) malloc(len*sizeof(SV *));
      for (i = 0; i < len ; i++) {
        svs[i] = sv_newmortal();
        sv_setpv((SV*)svs[i], $1[i]);
      };
      myav = av_make(len, svs);
      free(svs);
      $result = newRV_noinc((SV*)myav);
      sv_2mortal($result);
      argvi++;
    }
    
    // Now a few test functions
    %inline %{
      int print_args(char **argv) {
        int i = 0;
        while (argv[i]) {
          printf("argv[%d] = %s\n", i, argv[i]);
          i++;
        }
        return i;
      }
    
      // Returns a char ** list
      char **get_args() {
        static char *values[] = { "Dave", "Mike", "Susan", "John", "Michelle", 0};
        return &values[0];
      }
    %}
    
    

    When this module is compiled, the wrapped C functions can be used in a Perl script as follows:

    use argv;
    @a = ("Dave", "Mike", "John", "Mary");           # Create an array of strings
    argv::print_args(\@a);                           # Pass it to our C function
    $b = argv::get_args();                           # Get array of strings from C
    print @$b, "\n";                                 # Print it out
    

    30.8.2 Return values

    Return values are placed on the argument stack of each wrapper function. The current value of the argument stack pointer is contained in a variable argvi. Whenever a new output value is added, it is critical that this value be incremented. For multiple output values, the final value of argvi should be the total number of output values.

    The total number of return values should not exceed the number of input values unless you explicitly extend the argument stack. This can be done using the EXTEND() macro as in:

    %typemap(argout) int *OUTPUT {
      if (argvi >= items) {
        EXTEND(sp, 1);              /* Extend the stack by 1 object */
      }
      $result = sv_newmortal();
      sv_setiv($target, (IV) *($1));
      argvi++;
    }
    

    30.8.3 Returning values from arguments

    Sometimes it is desirable for a function to return a value in one of its arguments. This example describes the implementation of the OUTPUT typemap.

    %module return
    
    // This tells SWIG to treat an double * argument with name 'OutDouble' as
    // an output value.  
    
    %typemap(argout) double *OUTPUT {
      $result = sv_newmortal();
      sv_setnv($result, *$input);
      argvi++;                     /* Increment return count -- important! */
    }
    
    // We don't care what the input value is. Ignore, but set to a temporary variable
    
    %typemap(in, numinputs=0) double *OUTPUT(double junk) {
      $1 = &junk;
    }
    
    // Now a function to test it
    %{
    /* Returns the first two input arguments */
    int multout(double a, double b, double *out1, double *out2) {
      *out1 = a;
      *out2 = b;
      return 0;
    };
    %}
    
    // If we name both parameters OutDouble both will be output
    
    int multout(double a, double b, double *OUTPUT, double *OUTPUT);
    ...
    

    When this function is called, the output arguments are appended to the stack used to return results. This shows up an array in Perl. For example:

    @r = multout(7, 13);
    print "multout(7, 13) = @r\n";
    ($x, $y) = multout(7, 13);
    

    30.8.4 Accessing array structure members

    Consider the following data structure:

    #define SIZE  8
    typedef struct {
      int   values[SIZE];
      ...
    } Foo;
    
    

    By default, SWIG doesn't know how to the handle the values structure member it's an array, not a pointer. In this case, SWIG makes the array member read-only. Reading will simply return a pointer to the first item in the array. To make the member writable, a "memberin" typemap can be used.

    %typemap(memberin) int [SIZE] {
      int i;
      for (i = 0; i < SIZE; i++) {
        $1[i] = $input[i];
      }
    }
    
    

    Whenever a int [SIZE] member is encountered in a structure or class, this typemap provides a safe mechanism for setting its value.

    As in the previous example, the typemap can be generalized for any dimension. For example:

    %typemap(memberin) int [ANY] {
      int i;
      for (i = 0; i < $1_dim0; i++) {
        $1[i] = $input[i];
      }
    }
    

    When setting structure members, the input object is always assumed to be a C array of values that have already been converted from the target language. Because of this, the memberin typemap is almost always combined with the use of an "in" typemap. For example, the "in" typemap in the previous section would be used to convert an int[] array to C whereas the "memberin" typemap would be used to copy the converted array into a C data structure.

    30.8.5 Turning Perl references into C pointers

    A frequent confusion on the SWIG mailing list is errors caused by the mixing of Perl references and C pointers. For example, suppose you have a C function that modifies its arguments like this:

    void add(double a, double b, double *c) {
      *c = a + b;
    }
    

    A common misinterpretation of this function is the following Perl script:

    # Perl script
    $a = 3.5;
    $b = 7.5;
    $c = 0.0;          # Output value
    add($a, $b, \$c);    # Place result in c (Except that it doesn't work)
    

    To make this work with a reference, you can use a typemap such as this:

    %typemap(in) double * (double dvalue) {
      SV* tempsv;
      if (!SvROK($input)) {
        croak("expected a reference\n");
      }
      tempsv = SvRV($input);
      if ((!SvNOK(tempsv)) && (!SvIOK(tempsv))) {
        croak("expected a double reference\n");
      }
      dvalue = SvNV(tempsv);
      $1 = &dvalue;
    }
    
    %typemap(argout) double * {
      SV *tempsv;
      tempsv = SvRV($input);
      sv_setnv(tempsv, *$1);
    }
    

    Now, if you place this before the add function, you can do this:

    $a = 3.5;
    $b = 7.5;
    $c = 0.0;
    add($a, $b, \$c);            # Now it works!
    print "$c\n";
    
    

    30.8.6 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. To convert a pointer from Perl to C, the following function is used:

    int SWIG_ConvertPtr(SV *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Perl object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. flags is currently undefined and reserved for future expansion. Returns 0 on success and -1 on error.

    void *SWIG_MakePtr(SV *obj, void *ptr, swig_type_info *ty, int flags)

    Creates a new Perl pointer object. obj is a Perl SV that has been initialized to hold the result, ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and flags is a flag that controls properties of the conversion. flags is currently undefined and reserved.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    SV *sv = sv_newmortal();
    SWIG_MakePtr(sv, f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    30.9 Proxy classes

    Out of date. Needs update.

    Using the low-level procedural interface, SWIG can also construct a high-level object oriented interface to C structures and C++ classes. This is done by constructing a Perl proxy class (also known as a shadow class) that provides an OO wrapper to the underlying code. This section describes the implementation details of the proxy interface.

    30.9.1 Preliminaries

    Proxy classes, are generated by default. If you want to turn them off, use the -noproxy command line option. For example:

    $ swig -c++ -perl -noproxy example.i
    

    When proxy classes are used, SWIG moves all of the low-level procedural wrappers to another package name. By default, this package is named 'modulec' where 'module' is the name of the module you provided with the %module directive. Then, in place of the original module, SWIG creates a collection of high-level Perl wrappers. In your scripts, you will use these high level wrappers. The wrappers, in turn, interact with the low-level procedural module.

    30.9.2 Structure and class wrappers

    Suppose you have the following SWIG interface file:

    %module example
    struct Vector {
      Vector(double x, double y, double z);
      ~Vector();
      double x, y, z;
    };
    
    

    When wrapped, SWIG creates the following set of low-level accessor functions as described in previous sections.

    Vector *new_Vector(double x, double y, double z);
    void    delete_Vector(Vector *v);
    double  Vector_x_get(Vector *v);
    double  Vector_x_set(Vector *v, double value);
    double  Vector_y_get(Vector *v);
    double  Vector_y_set(Vector *v, double value);
    double  Vector_z_get(Vector *v);
    double  Vector_z_set(Vector *v, double value);
    
    

    However, when proxy classes are enabled, these accessor functions are wrapped inside a Perl class like this:

    package example::Vector;
    @ISA = qw( example );
    %OWNER = ();
    %BLESSEDMEMBERS = ();
    
    sub new () {
      my $self = shift;
      my @args = @_;
      $self = vectorc::new_Vector(@args);
      return undef if (!defined($self));
      bless $self, "example::Vector";
      $OWNER{$self} = 1;
      my %retval;
      tie %retval, "example::Vector", $self;
      return bless \%retval, "Vector";
    }
    
    sub DESTROY {
      return unless $_[0]->isa('HASH');
      my $self = tied(%{$_[0]});
      delete $ITERATORS{$self};
      if (exists $OWNER{$self}) {
        examplec::delete_Vector($self));
        delete $OWNER{$self};
      }
    }
    
    sub FETCH {
      my ($self, $field) = @_;
      my $member_func = "vectorc::Vector_${field}_get";
      my $val = &$member_func($self);
      if (exists $BLESSEDMEMBERS{$field}) {
        return undef if (!defined($val));
        my %retval;
        tie %retval, $BLESSEDMEMBERS{$field}, $val;
        return bless \%retval, $BLESSEDMEMBERS{$field};
      }
      return $val;
    }
    
    sub STORE {
      my ($self, $field, $newval) = @_;
      my $member_func = "vectorc::Vector_${field}_set";
      if (exists $BLESSEDMEMBERS{$field}) {
        &$member_func($self, tied(%{$newval}));
      } else {
        &$member_func($self, $newval);
      }
    }
    

    Each structure or class is mapped into a Perl package of the same name. The C++ constructors and destructors are mapped into constructors and destructors for the package and are always named "new" and "DESTROY". The constructor always returns a tied hash table. This hash table is used to access the member variables of a structure in addition to being able to invoke member functions. The %OWNER and %BLESSEDMEMBERS hash tables are used internally and described shortly.

    To use our new proxy class we can simply do the following:

    # Perl code using Vector class
    $v = new Vector(2, 3, 4);
    $w = Vector->new(-1, -2, -3);
    
    # Assignment of a single member
    $v->{x} = 7.5;
    
    # Assignment of all members
    %$v = ( x=>3,
            y=>9,
            z=>-2);
    
    # Reading members
    $x = $v->{x};
    
    # Destruction
    $v->DESTROY();
    
    

    30.9.3 Object Ownership

    In order for proxy classes to work properly, it is necessary for Perl to manage some mechanism of object ownership. Here's the crux of the problem---suppose you had a function like this:

    Vector *Vector_get(Vector *v, int index) {
      return &v[i];
    }
    

    This function takes a Vector pointer and returns a pointer to another Vector. Such a function might be used to manage arrays or lists of vectors (in C). Now contrast this function with the constructor for a Vector object:

    Vector *new_Vector(double x, double y, double z) {
      Vector *v;
      v = new Vector(x, y, z);        // Call C++ constructor
      return v;
    }
    

    Both functions return a Vector, but the constructor is returning a brand-new Vector while the other function is returning a Vector that was already created (hopefully). In Perl, both vectors will be indistinguishable---clearly a problem considering that we would probably like the newly created Vector to be destroyed when we are done with it.

    To manage these problems, each class contains two methods that access an internal hash table called %OWNER. This hash keeps a list of all of the objects that Perl knows that it has created. This happens in two cases: (1) when the constructor has been called, and (2) when a function implicitly creates a new object (as is done when SWIG needs to return a complex datatype by value). When the destructor is invoked, the Perl proxy class module checks the %OWNER hash to see if Perl created the object. If so, the C/C++ destructor is invoked. If not, we simply destroy the Perl object and leave the underlying C object alone (under the assumption that someone else must have created it).

    This scheme works remarkably well in practice but it isn't foolproof. In fact, it will fail if you create a new C object in Perl, pass it on to a C function that remembers the object, and then destroy the corresponding Perl object (this situation turns out to come up frequently when constructing objects like linked lists and trees). When C takes possession of an object, you can change Perl's ownership by simply deleting the object from the %OWNER hash. This is done using the DISOWN method.

    # Perl code to change ownership of an object
    $v = new Vector(x, y, z);
    $v->DISOWN();     
    

    To acquire ownership of an object, the ACQUIRE method can be used.

    # Given Perl ownership of a file
    $u = Vector_get($v);
    $u->ACQUIRE();
    
    

    As always, a little care is in order. SWIG does not provide reference counting, garbage collection, or advanced features one might find in sophisticated languages.

    30.9.4 Nested Objects

    Suppose that we have a new object that looks like this:

    struct Particle {
      Vector r;
      Vector v;
      Vector f;
      int type;
    }
    
    

    In this case, the members of the structure are complex objects that have already been encapsulated in a Perl proxy class. To handle these correctly, we use the %BLESSEDMEMBERS hash which would look like this (along with some supporting code):

    package Particle;
    ...
    %BLESSEDMEMBERS = (
            r => `Vector',
            v => `Vector',
            f => `Vector',
    );
    
    

    When fetching members from the structure, %BLESSEDMEMBERS is checked. If the requested field is present, we create a tied-hash table and return it. If not, we just return the corresponding member unmodified.

    This implementation allows us to operate on nested structures as follows:

    # Perl access of nested structure
    $p = new Particle();
    $p->{f}->{x} = 0.0;
    %${$p->{v}} = ( x=>0, y=>0, z=>0);         
    

    30.9.5 Proxy Functions

    When functions take arguments involving a complex object, it is sometimes necessary to write a proxy function. For example:

    double dot_product(Vector *v1, Vector *v2);
    

    Since Vector is an object already wrapped into a proxy class, we need to modify this function to accept arguments that are given in the form of tied hash tables. This is done by creating a Perl function like this:

    sub dot_product {
      my @args = @_;
      $args[0] = tied(%{$args[0]});         # Get the real pointer values
      $args[1] = tied(%{$args[1]});
      my $result = vectorc::dot_product(@args);
      return $result;
    }
    

    This function replaces the original function, but operates in an identical manner.

    30.9.6 Inheritance

    Simple C++ inheritance is handled using the Perl @ISA array in each class package. For example, if you have the following interface file:

    // shapes.i
    // SWIG interface file for shapes class
    %module shapes
    %{
    #include "shapes.h"
    %}
    
    class Shape {
    public:
      virtual double area() = 0;
      virtual double perimeter() = 0;
      void    set_location(double x, double y);
    };
    class Circle : public Shape {
    public:
      Circle(double radius);
      ~Circle();
      double area();
      double perimeter();
    };
    class Square : public Shape {
    public:
      Square(double size);
      ~Square();
      double area();
      double perimeter();
    }
    
    

    The resulting, Perl wrapper class will create the following code:

    Package Shape;
    @ISA = (shapes);
    ...
    Package Circle;
    @ISA = (shapes Shape);
    ...
    Package Square;
    @ISA = (shapes Shape);
    
    

    The @ISA array determines where to look for methods of a particular class. In this case, both the Circle and Square classes inherit functions from Shape so we'll want to look in the Shape base class for them. All classes also inherit from the top-level module shapes. This is because certain common operations needed to implement proxy classes are implemented only once and reused in the wrapper code for various classes and structures.

    Since SWIG proxy classes are implemented in Perl, it is easy to subclass from any SWIG generated class. To do this, simply put the name of a SWIG class in the @ISA array for your new class. However, be forewarned that this is not a trivial problem. In particular, inheritance of data members is extremely tricky (and I'm not even sure if it really works).

    30.9.7 Modifying the proxy methods

    It is possible to override the SWIG generated proxy/shadow methods, using %feature("shadow"). It works like all the other %feature directives. Here is a simple example showing how to add some Perl debug code to the constructor:

    /* Let's make the constructor of the class Square more verbose */
    %feature("shadow") Square(double w)
    %{
      sub new {
        my $pkg = shift;
        my $self = examplec::new_Square(@_);
        print STDERR "Constructed an @{[ref($self)]}\n";
        bless $self, $pkg if defined($self);
      }
    %}
    
    class Square {
    public:
      Square(double w);
      ...
    };
    

    30.10 Adding additional Perl code

    If writing support code in C isn't enough, it is also possible to write code in Perl. This code gets inserted in to the .pm file created by SWIG. One use of Perl code might be to supply a high-level interface to certain functions. For example:

    void set_transform(Image *im, double x[4][4]);
    
    ...
    /* Rewrite the high level interface to set_transform */
    %perlcode %{
    sub set_transform
    {
      my ($im, $x) = @_;
      my $a = new_mat44();
      for (my $i = 0; $i < 4, $i++)
      {
        for (my $j = 0; $j < 4, $j++)
        {
          mat44_set($a, $i, $j, $x->[i][j])
        }
      }
      example.set_transform($im, $a);
      free_mat44($a);
    }
    %}
    

    In this example, set_transform() provides a high-level Perl interface built on top of low-level helper functions. For example, this code now seems to work:

    my $a =
      [[1, 0, 0, 0],
      [0, 1, 0, 0],
      [0, 0, 1, 0],
      [0, 0, 0, 1]];
    set_transform($im, $a);
    

    30.11 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Perl. In particular, if a C++ class has been extended in Perl (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Perl implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Perl and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Perl code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    30.11.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      Foo(int foo);
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    then at the Perl side you can define

    use mymodule;
    
    package MyFoo;
    use base 'mymodule::Foo';
    
    sub one {
      print "one from Perl\n";
    }
    

    30.11.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Perl proxy classes. The director classes store a pointer to their underlying Perl object and handle various issues related to object ownership.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in Perl via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in Perl were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Perl. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Perl, the Perl API is used to call the method of the underlying Perl object (after which the usual virtual method resolution in Perl automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in Perl, unless there's a good reason not to. The reason for this is simple: Perl has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the Perl proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the Perl method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the pointer to the Perl object that called the wrapper function to the pointer stored by the director. If these are the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in Perl, SWIG creates an instance of the original C++ class. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through Perl.

    30.11.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. Perl instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to a Perl object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special DISOWN() method of the proxy class. After calling this method the director class increments the reference count of the Perl object. When the director class is deleted it decrements the reference count. Assuming no outstanding references to the Perl object remain, the Perl object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    Also note that due to the proxy implementation, the DESTROY() method on directors can be called for several reasons, many of which have little to do with the teardown of an object instance. To help disambiguate this, a second argument is added to the DESTROY() call when a C++ director object is being released. So, to avoid running your clean-up code when an object is not really going away, or after it has already been reclaimed, it is suggested that custom destructors in Perl subclasses looks something like:

    sub DESTROY {
      my($self, $final) = @_;
      if($final) {
        # real teardown code
      }
      shift->SUPER::DESTROY(@_);
    }
    

    30.11.4 Exception unrolling

    With directors routing method calls to Perl, and proxies routing them to C++, the handling of exceptions is an important concern. By default, the directors ignore exceptions that occur during method calls that are resolved in Perl. To handle such exceptions correctly, it is necessary to temporarily translate them into C++ exceptions. This can be done with the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
      if ($error != NULL) {
        throw Swig::DirectorMethodException();
      }
    }
    

    This code will check the Perl error state after each method call from a director into Perl, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler.

    It may be the case that a method call originates in Perl, travels up to C++ through a proxy class, and then back into Perl via a director method. If an exception occurs in Perl at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
      try { $action }
      catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the Perl error state is still set when Swig::DirectorMethodException is thrown, Perl will register the exception as soon as the C wrapper function returns.

    30.11.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in Perl and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from Perl. Relative to the speed of Perl execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through Perl in order to ensure that the method does not have an extended Perl implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with Perl objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to Perl objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Perl.

    30.11.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.


    31 SWIG and PHP

    In this chapter, we discuss SWIG's support of PHP. SWIG currently supports generating wrappers for PHP7. Support for PHP5 was removed in SWIG 4.0.0 and support for PHP4 was removed in SWIG 1.3.37.

    Currently any PHP7 release should work.

    In order to use this module, you will need to have a copy of the PHP include files to compile the SWIG generated files. If you installed PHP from a binary package, you may need to install a "php-dev" or "php-devel" package for these to be installed. You can find out where these files are by running php-config --includes. To use the built PHP module you will need either the php binary or the Apache php module. If you want to build your extension into php directly, you will need the complete PHP source tree available.

    31.1 Generating PHP Extensions

    To build a PHP extension, run swig using the -php7 option as follows (-php is also supported and currently is an alias for -php7 but prior to SWIG 4.0.0 it was an alias for -php5):

    swig -php7 example.i
    

    This will produce 3 files example_wrap.c, php_example.h and example.php. The first file, example_wrap.c contains all of the C code needed to build a PHP extension. The second file, php_example.h contains the header information needed if you wish to statically link the extension into the php interpreter. The third file, example.php can be included by PHP scripts. It attempts to dynamically load the extension and contains extra php code specified in the interface file. If wrapping C++ code with PHP classes, it will also contain PHP class wrappers.

    SWIG can generate PHP extensions from C++ libraries as well when given the -c++ option. The support for C++ is discussed in more detail in section 27.2.6. The generated C++ wrapper will be called example_wrap.cxx. You can specify a different extension for the C++ wrapper using -cppext - e.g. if you want example_wrap.cc use -cppext cc.

    The usual (and recommended) way is to build the extension as a separate dynamically loaded module (which is supported by all modern operating systems).

    It is also possible to rebuild PHP from source so that your module is statically linked into the php executable/library. This is a lot more work, and also requires a full rebuild of PHP to update your module, and it doesn't play nicely with package system. We don't recommend this approach, or provide explicit support for it.

    31.1.1 Building a loadable extension

    To build your module as a dynamically loadable extension, use compilation commands like these (if you aren't using GCC, the commands will be different, and there may be some variation between platforms - these commands should at least work for Linux though):

            gcc `php-config --includes` -fpic -c example_wrap.c example.c
            gcc -shared example_wrap.o example.o -o example.so
    

    31.1.2 Using PHP Extensions

    To test the extension from a PHP script, you first need to tell PHP to load it. To do this, add a line like this to the [PHP] section of php.ini:

            extension=/path/to/modulename.so
    

    If the module is in PHP's default extension directory, you can omit the path.

    For some SAPIs (for example, the CLI SAPI) you can instead use the dl() function to load an extension at run time, by adding a line like this to the start of each PHP script which uses your extension:

            dl("/path/to/modulename.so"); // Load the module
    

    But note that dl() isn't supported when running PHP through a webserver - you'll need to use extension in php.ini as described above.

    The PHP module which SWIG generates will also attempt to do the dl() call for you if the extension isn't already loaded:

            include("example.php");
    

    This PHP module also defines the PHP classes for the wrapped API, so you'll almost certainly want to include it anyway.

    31.2 Basic PHP interface

    It is important to understand that PHP uses a single global namespace into which all symbols from extension modules are loaded. It is quite possible for names of symbols in one extension module to clash with other symbols unless care is taken to %rename them. At present SWIG doesn't have support for generating wrappers which make use of PHP's namespace feature.

    31.2.1 Constants

    These work in much the same way as in C/C++. Constants can be defined by using either the normal C pre-processor declarations, or the %constant SWIG directive. These will then be available from your PHP script as a PHP constant, (i.e. no dollar sign is needed to access them.) For example, with a swig interface file like this,

    %module example
    
    #define PI 3.14159
    
    %constant int E  = 2.71828
    

    you can access the constants in your PHP script like this,

    include("example.php");
    
    echo "PI = " . PI . "\n";
    
    echo "E = " . E . "\n";
    
    

    There's one peculiarity of how constants work in PHP which it is useful to note (this is not specific to SWIG though) - if you try to use an undeclared constant, PHP will emit a warning (or a notice in PHP 7.1 and earlier) and then expand the constant to a string version of the constant's name. Unfortunately it is easy to miss the warning message if you're using PHP in a webserver as it will probably end up in error.log or similar. Apparently this will throw an Error in a future version of PHP, but until then it's something to be aware of.

    For example,

    %module example
    
    #define EASY_TO_MISPELL 0
    

    accessed incorrectly in PHP,

    include("example.php");
    
    if(EASY_TO_MISPEL) {
      ...
    } else {
      ...
    }
    
    

    The mis-spelled constant will become the string 'EASY_TO_MISPEL', which is treated as true by the if test, when the value of the intended constant would be treated as false!

    31.2.2 Global Variables

    Because PHP does not provide a mechanism to intercept access and assignment of global variables, global variables are supported through the use of automatically generated accessor functions.

    %module example;
    
    %inline %{
      double seki = 2;
      void print_seki() {
        zend_printf("seki is now %f\n", seki);
      }
    %}
    

    is accessed as follows:

    include("example.php");
    print seki_get();
    seki_set( seki_get() * 2); # The C variable is now 4.
    print seki_get();
    

    SWIG supports global variables of all C datatypes including pointers and complex objects. Additional types can be supported by using the varinit typemap.

    SWIG honors the %immutable modifier by not generating code for the _set method. This provides read-only access to the variable from the php script. Attempting to access the _set method will result in a php fatal error because the function is undefined.

    At this time SWIG does not support custom accessor methods.

    31.2.3 Functions

    C functions are converted into PHP functions. Default/optional arguments are also allowed. An interface file like this :

    %module example
    int foo(int a);
    double bar(double, double b = 3.0);
    ...
    

    Will be accessed in PHP like this :

    include("example.php");
    $a = foo(2);
    $b = bar(3.5, -1.5);
    $c = bar(3.5);  # Use default argument for 2nd parameter
    
    

    31.2.4 Overloading

    Although PHP does not support overloading functions natively, swig will generate dispatch functions which will use %typecheck typemaps to allow overloading. This dispatch function's operation and precedence is described in Overloaded functions and methods.

    31.2.5 Pointers and References

    Pointers to C/C++ objects are represented as PHP resources, rather like MySQL connection handles.

    There are multiple ways to wrap pointers to simple types. Given the following C method:

      void add( int *in1, int *in2, int *result);
    

    One can include cpointer.i to generate PHP wrappers to int *.

    %module example
    %include "cpointer.i"
    %pointer_functions(int, intp)
    
    void add( int *in1, int *in2, int *result);
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1=copy_intp(3);
    $in2=copy_intp(5);
    $result=new_intp();
    
    add( $in1, $in2, $result );
    
    echo "The sum " . intp_value($in1) . " + " . intp_value($in2) . " = " . intp_value( $result) . "\n";
    ?>
    

    An alternative would be to use the include typemaps.i which defines named typemaps for INPUT, OUTPUT and INOUT variables. One needs to either %apply the appropriate typemap or adjust the parameter names as appropriate.

    %module example
    %include "typemaps.i"
    
    void add( int *INPUT, int *INPUT, int *OUTPUT);
    
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1 = 3;
    $in2 = 5;
    $result= add($in1, $in2);  # Note using variables for the input is unnecessary.
    
    echo "The sum $in1 + $in2 = $result\n";
    ?>
    

    Because PHP has a native concept of reference, it may seem more natural to the PHP developer to use references to pass pointers. To enable this, one needs to include phppointers.i which defines the named typemap REF.

    In case you write your own typemaps, SWIG supports an attribute called byref: if you set that, then SWIG will make sure that the generated wrapper function will want the input parameter as a reference.

    %module example
    %include "phppointers.i"
    
    void add( int *REF, int *REF, int *REF);
    
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1 = 3;
    $in2 = 5;
    $result = 0;
    add($in1, $in2, $result);
    
    echo "The sum $in1 + $in2 = $result\n";
    ?>
    

    It is important to note that a php variable which is NULL when passed by reference would end up passing a NULL pointer into the function. In PHP, an unassigned variable (i.e. where the first reference to the variable is not an assignment) is NULL. In the above example, if any of the three variables had not been assigned, a NULL pointer would have been passed into add. Depending on the implementation of the function, this may or may not be a good thing.

    We chose to allow passing NULL pointers into functions because that is sometimes required in C libraries. A NULL pointer can be created in PHP in a number of ways: by using unset on an existing variable, or assigning NULL to a variable.

    31.2.6 Structures and C++ classes

    SWIG defaults to wrapping C++ structs and classes with PHP classes - this is done by generating a PHP wrapper script which defines proxy classes which calls a set of flat functions which actually wrap the C++ class. You can disable this wrapper layer by passing the command-line option "-noproxy" in which case you'll just get the flat functions.

    This interface file

    %module vector
    
    class Vector {
    public:
      double x, y, z;
      Vector();
      ~Vector();
      double magnitude();
    };
    
    struct Complex {
     double re, im;
    };
    

    Would be used in the following way from PHP:

    <?php
      require "vector.php";
    
      $v = new Vector();
      $v->x = 3;
      $v->y = 4;
      $v->z = 5;
    
      echo "Magnitude of ($v->x, $v->y, $v->z) = " . $v->magnitude() . "\n";
    
      $v = NULL;   # destructor called.
    
      $c = new Complex();
    
      $c->re = 0;
      $c->im = 0;
    
      # $c destructor called when $c goes out of scope.
    ?>
    

    Member variables and methods are accessed using the -> operator.

    31.2.6.1 Using -noproxy

    The -noproxy option flattens the object structure and generates collections of named functions (these are the functions which the PHP class wrappers call). The above example results in the following PHP functions:

    new_Vector();
    Vector_x_set($obj, $d);
    Vector_x_get($obj);
    Vector_y_set($obj, $d);
    Vector_y_get($obj);
    Vector_z_set($obj, $d);
    Vector_z_get($obj);
    Vector_magnitude($obj);
    new_Complex();
    Complex_re_set($obj, $d);
    Complex_re_get($obj);
    Complex_im_set($obj, $d);
    Complex_im_get($obj);
    

    31.2.6.2 Constructors and Destructors

    The constructor is called when new Object() (or new_Object() if using -noproxy) is used to create an instance of the object. If multiple constructors are defined for an object, function overloading will be used to determine which constructor to execute.

    Because PHP uses reference counting to manage resources, simple assignment of one variable to another such as:

    $ref = $v;
    

    causes the symbol $ref to refer to the same underlying object as $v. This does not result in a call to the C++ copy constructor or copy assignment operator.

    One can force execution of the copy constructor by using:

    $o_copy = new Object($o);
    

    Destructors are automatically called when all variables referencing the instance are reassigned or go out of scope. The destructor is not available to be called manually. To force a destructor to be called the programmer can either reassign the variable or call unset($v)

    31.2.6.3 Static Member Variables

    Static member variables in C++ are not wrapped as such in PHP as it does not appear to be possible to intercept accesses to such variables. Therefore, static member variables are wrapped using a class function with the same name, which returns the current value of the class variable. For example

    %module example
    
    class Ko {
      static int threats;
    };
    
    

    would be accessed in PHP as,

    include("example.php");
    
    echo "There have now been " . Ko::threats() . " threats\n";
    
    

    To set the static member variable, pass the value as the argument to the class function, e.g.

    
    Ko::threats(10);
    
    echo "There have now been " . Ko::threats() . " threats\n";
    
    

    31.2.6.4 Static Member Functions

    Static member functions are supported in PHP using the class::function() syntax. For example

    %module example
    class Ko {
      static void threats();
    };
    
    would be executed in PHP as,
    include("example.php");
    Ko::threats();
    

    31.2.6.5 Specifying Implemented Interfaces

    PHP supports the concept of abstract interfaces which a class can implement. Since SWIG 3.0.3, you can tell SWIG that a wrapped class (for example MyIterator) implements the Iterator interface like so:

    %typemap("phpinterfaces") MyIterator "Iterator";
    

    If there are multiple interfaces, just list them separated by commas.

    31.2.7 PHP Pragmas, Startup and Shutdown code

    To place PHP code in the generated "example.php" file one can use the code pragma. The code is inserted after loading the shared object.

    %module example
    %pragma(php) code="
    # This code is inserted into example.php
    echo \"example.php execution\\n\";
    "
    

    Results in the following in "example.php"

    # This code is inserted into example.php
    echo "example.php execution\n";
    

    The version pragma can be used to add version to generated PHP extension module. The version is inserted in the zend_module_entry block.

    %module example
    %pragma(php) version="1.5"
    

    The include pragma is a short cut to add include statements to the example.php file.

    %module example
    %pragma(php) code="
    include \"include.php\";
    "
    %pragma(php) include="include.php"   // equivalent.
    

    The phpinfo pragma inserts code in the PHP_MINFO_FUNCTION which is called from PHP's phpinfo() function.

    %module example;
    %pragma(php) phpinfo="
      zend_printf("An example of PHP support through SWIG\n");
      php_info_print_table_start();
      php_info_print_table_header(2, \"Directive\", \"Value\");
      php_info_print_table_row(2, \"Example support\", \"enabled\");
      php_info_print_table_end();
    "
    

    To insert code into the PHP_MINIT_FUNCTION, one can use either %init or %minit.

    %module example;
    %init {
      zend_printf("Inserted into PHP_MINIT_FUNCTION\n");
    }
    %minit {
      zend_printf("Inserted into PHP_MINIT_FUNCTION\n");
    }
    

    To insert code into the PHP_MSHUTDOWN_FUNCTION, one can use either %shutdown or %mshutdown.

    %module example;
    %mshutdown {
      zend_printf("Inserted into PHP_MSHUTDOWN_FUNCTION\n");
    }
    

    The %rinit and %rshutdown statements are very similar but insert code into the request init (PHP_RINIT_FUNCTION) and request shutdown (PHP_RSHUTDOWN_FUNCTION) code respectively.

    31.3 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to PHP. In particular, if a C++ class has been extended in PHP (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG 1.3.18 to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. Support for generating PHP classes has been added in SWIG 1.3.40. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to PHP implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in PHP and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor PHP code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    31.3.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      Foo(int foo);
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    then at the PHP side you can define

    require("mymodule.php");
    
    class MyFoo extends Foo {
      function one() {
        print "one from php\n";
      }
    }
    

    31.3.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the PHP proxy classes. The director classes store a pointer to their underlying PHP object. Indeed, this is quite similar to the "_cPtr" and "thisown" members of the PHP proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in PHP via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in PHP were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or PHP. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in PHP, the Zend API is used to call the method of the underlying PHP object (after which the usual virtual method resolution in PHP automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in PHP, unless there's a good reason not to. The reason for this is simple: PHP has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the PHP proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the PHP method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the called and the declaring class name of the given method. If these are not the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in PHP, SWIG creates an instance of the original C++ class and assigns it to ->_cPtr. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through PHP.

    31.3.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. PHP instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to the PHP object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special ->thisown property of the proxy class. After setting this property to 0, the director class no longer destroys the PHP object. Assuming no outstanding references to the PHP object remain, the PHP object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    Here is an example:

    class Foo {
    public:
      ...
    };
    class FooContainer {
    public:
      void addFoo(Foo *);
      ...
    };
    

    $c = new FooContainer();
    $a = new Foo();
    $a->thisown = 0;
    $c->addFoo($a);
    

    In this example, we are assuming that FooContainer will take care of deleting all the Foo pointers it contains at some point.

    31.3.4 Exception unrolling

    With directors routing method calls to PHP, and proxies routing them to C++, the handling of exceptions is an important concern. By default, an exception thrown in PHP code called from C++ causes the PHP interpreter to flag that an exception is thrown, then return passes to C++ as if the PHP function had returned Null. Assuming the directorout typemaps handle this (those SWIG defines by default should) then once control returns to PHP code again, the PHP exception will actually propagate.

    Sometimes this control flow is problematic, and you want to skip any handling in the C++ code. To achieve this, it is necessary to temporarily translate the PHP exception into a C++ exception. This can be achieved using the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
      if ($error == FAILURE) {
        throw Swig::DirectorMethodException();
      }
    }
    

    This code will check the PHP error state after each method call from a director into PHP, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler. Currently no information about the PHP error is stored in the Swig::DirectorMethodException object, but this will likely change in the future.

    It may be the case that a method call originates in PHP, travels up to C++ through a proxy class, and then back into PHP via a director method. If an exception occurs in PHP at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
      try { $action }
      catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the PHP error state is still set when Swig::DirectorMethodException is thrown, PHP will register the exception as soon as the C wrapper function returns.

    31.3.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in PHP and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from PHP. Relative to the speed of PHP execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through PHP in order to ensure that the method does not have an extended PHP implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with PHP objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to PHP objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in PHP.

    31.3.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    31.3.7 Miscellaneous

    Director typemaps for STL classes are mostly in place, and hence you should be able to use std::string, etc., as you would any other type.


    32 SWIG and Python

    Caution: This chapter is under repair!

    This chapter describes SWIG's support of Python. SWIG is compatible with all recent Python versions (Python 2.7 and Python >= 3.2). If you still need to generate bindings which work with older versions of Python, you'll have to use SWIG 3.0.x.

    This chapter covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters. At the very least, make sure you read the "SWIG Basics" chapter.

    32.1 Overview

    To build Python extension modules, SWIG uses a layered approach in which parts of the extension module are defined in C and other parts are defined in Python. The C layer contains low-level wrappers whereas Python code is used to define high-level features.

    This layered approach recognizes the fact that certain aspects of extension building are better accomplished in each language (instead of trying to do everything in C or C++). Furthermore, by generating code in both languages, you get a lot more flexibility since you can enhance the extension module with support code in either language.

    In describing the Python interface, this chapter starts by covering the basics of configuration, compiling, and installing Python modules. Next, the Python interface to common C and C++ programming features is described. Advanced customization features such as typemaps are then described followed by a discussion of low-level implementation details.

    32.2 Preliminaries

    32.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    /* File: example.i */
    %module example
    
    %{
    #define SWIG_FILE_WITH_INIT
    #include "example.h"
    %}
    
    int fact(int n);
    

    The #define SWIG_FILE_WITH_INIT line inserts a macro that specifies that the resulting C file should be built as a Python extension, inserting the module init code. This .i file wraps the following simple C file:

    /* File: example.c */
    
    #include "example.h"
    
    int fact(int n) {
      if (n < 0) { /* This should probably return an error, but this is simpler */
        return 0;
      }
      if (n == 0) {
        return 1;
      } else {
        /* testing for overflow would be a good idea here */
        return n * fact(n-1);
      }
    }
    
    

    With the header file:

    /* File: example.h */
    
    int fact(int n);
    

    To build a Python module, run SWIG using the -python option:

    $ swig -python example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -python example.i
    

    This creates two different files; a C/C++ source file example_wrap.c or example_wrap.cxx and a Python source file example.py. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module. The Python source file contains high-level support code. This is the file that you will import to use the module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The name of the Python file is derived from the module name specified with %module. If the module name is example, then a file example.py is created.

    The following sections have further practical examples and details on how you might go about compiling and using the generated files.

    32.2.2 Using distutils

    The preferred approach to building an extension module for Python is to compile it with distutils, which comes with all recent versions of Python ( Distutils Docs).

    Distutils takes care of making sure that your extension is built with all the correct flags, headers, etc. for the version of Python it is run with. Distutils will compile your extension into a shared object file or DLL (.so on Linux, .pyd on Windows, etc). In addition, distutils can handle installing your package into site-packages, if that is desired. A configuration file (conventionally called: setup.py) describes the extension (and related Python modules). The distutils will then generate all the right compiler directives to build it for you.

    Here is a sample setup.py file for the above example:

    #!/usr/bin/env python
    
    """
    setup.py file for SWIG example
    """
    
    from distutils.core import setup, Extension
    
    
    example_module = Extension('_example',
                               sources=['example_wrap.c', 'example.c'],
                               )
    
    setup (name = 'example',
           version = '0.1',
           author      = "SWIG Docs",
           description = """Simple swig example from docs""",
           ext_modules = [example_module],
           py_modules = ["example"],
           )
    

    In this example, the line: example_module = Extension(....) creates an Extension module object, defining the name as _example , and using the source code files: example_wrap.c, generated by swig, and example.c, your original c source. The swig (and other Python extension modules) tradition is for the compiled extension to have the name of the Python portion, prefixed by an underscore. If the name of your Python module is "example.py", then the name of the corresponding object file will be"_example.so"

    The setup call then sets up distutils to build your package, defining some meta data, and passing in your extension module object. Once this is saved as setup.py, you can build your extension with these commands:

    $ swig -python example.i
    $ python setup.py build_ext --inplace
    

    And a .so, or .pyd or... will be created for you. It will build a version that matches the Python that you run the command with. Taking apart the command line:

    • python -- the version of Python you want to build for
    • setup.py -- the name of your setup script (it can be called anything, but setup.py is the tradition)
    • build_ext -- telling distutils to build extensions
    • --inplace -- this tells distutils to put the extension lib in the current dir. Otherwise, it will put it inside a build hierarchy, and you'd have to move it to use it.

    The distutils have many other features, consult the Python distutils docs for details.

    This same approach works on all platforms if the appropriate compiler is installed. (it can even build extensions to the standard Windows Python using MingGW)

    32.2.3 Hand compiling a dynamic module

    While the preferred approach to building an extension module is to use the distutils, some people like to integrate building extensions with a larger build system, and thus may wish to compile their modules without the distutils. To do this, you need to compile your program using commands like this (shown for Linux):

    $ swig -python example.i
    $ gcc -O2 -fPIC -c example.c
    $ gcc -O2 -fPIC -c example_wrap.c -I/usr/local/include/python2.5
    $ gcc -shared example.o example_wrap.o -o _example.so
    

    The exact commands for doing this vary from platform to platform. However, SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/python directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the output file has to match the name of the module prefixed by an underscore. If the name of your module is "example", then the name of the corresponding object file should be "_example.so" or "_examplemodule.so ". The name of the module is specified using the %module directive or the -module command line option.

    Compatibility Note: In SWIG-1.3.13 and earlier releases, module names did not include the leading underscore. This is because modules were normally created as C-only extensions without the extra Python support file (instead, creating Python code was supported as an optional feature). This has been changed in SWIG-1.3.14 and is consistent with other Python extension modules. For example, the socket module actually consists of two files; socket.py and _socket.so. Many other built-in Python modules follow a similar convention.

    32.2.4 Static linking

    An alternative approach to dynamic linking is to rebuild the Python interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Python involves finding the Python source, adding an entry to the Modules/Setup file, and rebuilding the interpreter using the Python Makefile. However, newer Python versions have changed the build process. You may need to edit the 'setup.py' file in the Python distribution instead.

    In earlier versions of SWIG, the embed.i library file could be used to rebuild the interpreter. For example:

    %module example
    
    %inline %{
    extern int fact(int);
    extern int mod(int, int);
    extern double My_variable;
    %}
    
    %include "embed.i"       // Include code for a static version of Python
    
    

    The embed.i library file includes supporting code that contains everything needed to rebuild Python. To rebuild the interpreter, you simply do something like this:

    $ swig -python -lembed.i example.i
    $ gcc example.c example_wrap.c \
            -Xlinker -export-dynamic \
            -DHAVE_CONFIG_H -I/usr/include/python2.7 \
            -I/usr/lib/python2.7/config-x86_64-linux-gnu \
            -I/usr/lib/python2.7/config \
            -L/usr/lib/python2.7/config -lpython2.7 -lm -ldl \
            -o mypython
    

    You will need to supply the same libraries that were used to build Python the first time. This may include system libraries such as -lsocket, -lnsl, and -lpthread. Assuming this actually works, the new version of Python should be identical to the default version except that your extension module will be a built-in part of the interpreter.

    Comment: In practice, you should probably try to avoid static linking if possible. Some programmers may be inclined to use static linking in the interest of getting better performance. However, the performance gained by static linking tends to be rather minimal in most situations (and quite frankly not worth the extra hassle in the opinion of this author).

    Compatibility note: The embed.i library file is deprecated and has not been actively maintained for many years. Even though it appears to "work" with Python 2.7, no future support is guaranteed. If using static linking, you might want to rely on a different approach (perhaps using distutils).

    32.2.5 Using your module

    To use your module, simply use the Python import statement. If all goes well, you will be able to run this:

    $ python
    >>> import example
    >>> example.fact(4)
    24
    >>>
    

    A common error received by first-time users is the following:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "example.py", line 2, in ?
        import _example
    ImportError: No module named _example
    

    If you get this message, it means that you either forgot to compile the wrapper code into an extension module or you didn't give the extension module the right name. Make sure that you compiled the wrappers into a module called _example.so. And don't forget the leading underscore (_).

    Another possible error is the following:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ImportError: dynamic module does not define init function (init_example)
    >>>
    

    This error is almost always caused when a bad name is given to the shared object file. For example, if you created a file example.so instead of _example.so you would get this error. Alternatively, this error could arise if the name of the module is inconsistent with the module name supplied with the %module directive. Double-check the interface to make sure the module name and the shared object filename match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

    Another common error is something similar to the following:

    Traceback (most recent call last):
      File "example.py", line 3, in ?
        import example
    ImportError: ./_example.so: undefined symbol: fact
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o _example.so
    

    If the foo library is compiled as a shared library, you might encounter the following problem when you try to use your module:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ImportError: libfoo.so: cannot open shared object file: No such file or directory
    >>>
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To fix this problem, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib  \
          -o _example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Python, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib python
    

    Finally, you can use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    32.2.6 Compilation of C++ extensions

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Python interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly. This should be a non-issue if you're using distutils, as it takes care of all that for you. The following is included for historical reasons, and in case you need to compile on your own.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -python example.i
    $ g++ -O2 -fPIC -c example.cxx
    $ g++ -O2 -fPIC -c example_wrap.cxx -I/usr/local/include/python2.5
    $ g++ -shared example.o example_wrap.o -o _example.so
    

    The -fPIC option tells GCC to generate position-independent code (PIC) which is required for most architectures (it's not vital on x86, but still a good idea as it allows code pages from the library to be shared between processes). Other compilers may need a different option specified instead of -fPIC.

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    $ swig -c++ -python example.i
    $ CC -c example.cxx
    $ CC -c example_wrap.cxx -I/usr/local/include/python2.5
    $ CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o _example.so -lCrun
    

    Of course, the extra libraries to use are completely non-portable---you will probably need to do some experimentation.

    Sometimes people have suggested that it is necessary to relink the Python interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Python.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    

    As a final complication, a major weakness of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Python, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. If working with lots of software components, you might want to investigate using a more formal standard such as COM.

    32.2.7 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Python executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    On the Linux x86_64 platform (Opteron or EM64T), besides of the required compiler option -fPIC discussed above, you will need to be careful about the libraries you link with or the library path you use. In general, a Linux distribution will have two set of libraries, one for native x86_64 programs (under /usr/lib64), and another for 32 bits compatibility (under /usr/lib). Also, the compiler options -m32 and -m64 allow you to choose the desired binary format for your Python extension.

    32.2.8 Building Python extensions under Windows

    Building a SWIG extension to Python under Windows is roughly similar to the process used with Unix. Using the distutils, it is essentially identical. If you have the same version of the MS compiler that Python was built with (the python2.4 and python2.5 distributed by python.org are built with Visual Studio 2003), the standard python setup.py build should just work.

    As of python2.5, the distutils support building extensions with MingGW out of the box. Following the instruction here: Building Python extensions for Windows with only free tools should get you started.

    If you need to build it on your own, the following notes are provided:

    You will need to create a DLL that can be loaded into the interpreter. This section briefly describes the use of SWIG with Microsoft Visual C++. As a starting point, many of SWIG's examples include project files (.dsp files) for Visual C++ 6. These can be opened by more recent versions of Visual Studio. You might want to take a quick look at these examples in addition to reading this section.

    In Developer Studio, SWIG should be invoked as a custom build option. This is usually done as follows:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer Studio keeps a reference to it.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -python -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Python installation under "Additional include directories".
    • Define the symbol __WIN32__ under preprocessor options.
    • Finally, select the settings for the entire project and go to "Link Options". Add the Python library file to your link libraries. For example "python27.lib". Also, set the name of the output file to match the name of your Python module, i.e. _example.pyd
    • Build your project.

    If all went well, SWIG will be automatically invoked whenever you build your project. Any changes made to the interface file will result in SWIG being automatically executed to produce a new version of the wrapper file.

    To run your new Python extension, simply run Python and use the import command as normal. For example :

    $ python
    >>> import example
    >>> print example.fact(4)
    24
    >>>
    

    If you get an ImportError exception when importing the module, you may have forgotten to include additional library files when you built your module. If you get an access violation or some kind of general protection fault immediately upon import, you have a more serious problem. This is often caused by linking your extension module against the wrong set of Win32 debug or thread libraries. You will have to fiddle around with the build options of project to try and track this down.

    A 'Debug' build of the wrappers requires a debug build of the Python interpreter. This normally requires building the Python interpreter from source, which is not a job for the feint-hearted. Alternatively you can use the 'Release' build of the Python interpreter with a 'Debug' build of your wrappers by defining the SWIG_PYTHON_INTERPRETER_NO_DEBUG symbol under the preprocessor options. Or you can ensure this macro is defined at the beginning of the wrapper code using the following in your interface file, where _MSC_VER ensures it is only used by the Visual Studio compiler:

    %begin %{
    #ifdef _MSC_VER
    #define SWIG_PYTHON_INTERPRETER_NO_DEBUG
    #endif
    %}
    

    Some users have reported success in building extension modules using Cygwin and other compilers. However, the problem of building usable DLLs with these compilers tends to be rather problematic. For the latest information, you may want to consult the SWIG Wiki.

    32.2.9 Additional Python commandline options

    The following table lists the additional commandline options available for the Python module. They can also be seen by using:

    swig -python -help
    
    Python specific options
    -builtinCreate Python built-in types rather than proxy classes, for better performance
    -castmodeEnable the casting mode, which allows implicit cast between types in Python
    -debug-doxygen-parserDisplay doxygen parser module debugging information
    -debug-doxygen-translatorDisplay doxygen translator module debugging information
    -dirvtableGenerate a pseudo virtual table for directors for faster dispatch
    -doxygenConvert C++ doxygen comments to pydoc comments in proxy classes
    -extranativeReturn extra native wrappers for C++ std containers wherever possible
    -fastproxyUse fast proxy mechanism for member methods
    -globals <name>Set <name> used to access C global variable (default: 'cvar')
    -interface <mod>Set low-level C/C++ module name to <mod> (default: module name prefixed by '_')
    -keywordUse keyword arguments
    -nofastunpackUse traditional UnpackTuple method to parse the argument functions
    -nohDon't generate the output header file
    -noproxyDon't generate proxy classes
    -norttiDisable the use of the native C++ RTTI with directors
    -nothreadsDisable thread support for the entire interface
    -olddefsKeep the old method definitions when using -fastproxy
    -py3Generate code with Python 3 specific features and syntax
    -relativeimportUse relative Python imports
    -threadsAdd thread support for all the interface
    -OEnable the following optimization options: -fastdispatch -fastproxy -fvirtual

    Many of these options are covered later on and their use should become clearer by the time you have finished reading this section on SWIG and Python.

    32.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Python interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped as classes, and so forth. This section briefly covers the essential aspects of this wrapping.

    32.3.1 Modules

    The SWIG %module directive specifies the name of the Python module. If you specify `%module example', then everything is wrapped into a Python 'example' module. Underneath the covers, this module consists of a Python source file example.py and a low-level extension module _example.so. When choosing a module name, make sure you don't use the same name as a built-in Python command or standard module name.

    32.3.2 Functions

    Global functions are wrapped as new Python built-in functions. For example,

    %module example
    int fact(int n);
    

    creates a built-in function example.fact(n) that works exactly like you think it does:

    >>> import example
    >>> print example.fact(4)
    24
    >>>
    

    32.3.3 Global variables

    C/C++ global variables are fully supported by SWIG. However, the underlying mechanism is somewhat different than you might expect due to the way that Python assignment works. When you type the following in Python

    a = 3.4
    

    "a" becomes a name for an object containing the value 3.4. If you later type

    b = a
    

    then "a" and "b" are both names for the object containing the value 3.4. Thus, there is only one object containing 3.4 and "a" and "b" are both names that refer to it. This is quite different than C where a variable name refers to a memory location in which a value is stored (and assignment copies data into that location). Because of this, there is no direct way to map variable assignment in C to variable assignment in Python.

    To provide access to C global variables, SWIG creates a special object called `cvar' that is added to each SWIG generated module. Global variables are then accessed as attributes of this object. For example, consider this interface

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern int My_variable;
    extern double density;
    %}
    ...
    

    Now look at the Python interface:

    >>> import example
    >>> # Print out value of a C global variable
    >>> print example.cvar.My_variable
    4
    >>> # Set the value of a C global variable
    >>> example.cvar.density = 0.8442
    >>> # Use in a math operation
    >>> example.cvar.density = example.cvar.density*1.10
    

    If you make an error in variable assignment, you will receive an error message. For example:

    >>> example.cvar.density = "Hello"
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: C variable 'density (double )'
    >>>
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    If you would like to access variables using a name other than " cvar", it can be changed using the -globals option :

    $ swig -python -globals myvar example.i
    

    Some care is in order when importing multiple SWIG modules. If you use the "from <file> import *" style of importing, you will get a name clash on the variable `cvar' and you will only be able to access global variables from the last module loaded. To prevent this, you might consider renaming cvar or making it private to the module by giving it a name that starts with a leading underscore. SWIG does not create cvar if there are no global variables in a module.

    32.3.4 Constants and enums

    C/C++ constants are installed as Python objects containing the appropriate value. To create a constant, use #define, enum , or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    enum Beverage { ALE, LAGER, STOUT, PILSNER };
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    For enums, make sure that the definition of the enumeration actually appears in a header file or in the wrapper file somehow---if you just stick an enum in a SWIG interface without also telling the C compiler about it, the wrapper code won't compile.

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using the cvar object described in the previous section. They are not wrapped as constants. For further discussion about this, see the SWIG Basics chapter.

    Constants are not guaranteed to remain constant in Python---the name of the constant could be accidentally reassigned to refer to some other object. Unfortunately, there is no easy way for SWIG to generate code that prevents this. You will just have to be careful.

    32.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Python. For example:

    >>> import example
    >>> f = example.fopen("junk", "w")
    >>> example.fputs("Hello World\n", f)
    >>> example.fclose(f)
    

    If this makes you uneasy, rest assured that there is no deep magic involved. Underneath the covers, pointers to C/C++ objects are simply represented as opaque values using an especial Python container object:

    >>> print f
    <Swig Object of type 'FILE *' at 0xb7d6f470>
    

    This pointer value can be freely passed around to different C functions that expect to receive an object of type FILE *. The only thing you can't do is dereference the pointer from Python. Of course, that isn't much of a concern in this example.

    In older versions of SWIG (1.3.22 or older), pointers were represented using a plain string object. If you have an old package that still requires that representation, or you just feel nostalgic, you can always retrieve it by casting the pointer object to a string:

    >>> print str(f)
    _c0671108_p_FILE
    

    Also, if you need to pass the raw pointer value to some external Python library, you can do it by casting the pointer object to an integer:

    >>> print int(f)
    135833352
    

    However, the inverse operation is not possible, i.e., you can't build a SWIG pointer object from a raw integer value.

    Note also that the '0' or NULL pointer is always represented by None, no matter what type swig is addressing. In the previous example, you can call:

    >>> example.fclose(None)
    

    and that will be equivalent to the following, but not really useful, C code:

    FILE *f = NULL;
    fclose(f);
    

    As much as you might be inclined to modify a pointer value directly from Python, don't. The hexadecimal encoding is not necessarily the same as the logical memory address of the underlying object. Instead it is the raw byte encoding of the pointer value. The encoding will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Similarly, don't try to manually cast a pointer to a new type by simply replacing the type-string. This may not work like you expect, it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return None if the conversion can't be performed.

    32.3.6 Structures

    If you wrap a C structure, it is wrapped by a Python class. This provides a very natural interface. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    >>> v = example.Vector()
    >>> v.x = 3.5
    >>> v.y = 7.2
    >>> print v.x, v.y, v.z
    3.5 7.2 0.0
    >>>
    

    Similar access is provided for unions and the data members of C++ classes.

    If you print out the value of v in the above example, you will see something like this:

    >>> print v
    <C Vector instance at _18e31408_p_Vector>
    

    This object is actually a Python instance that has been wrapped around a pointer to the low-level C structure. This instance doesn't actually do anything--it just serves as a proxy. The pointer to the C object can be found in the .this attribute. For example:

    >>> print v.this
    _18e31408_p_Vector
    >>>
    

    Further details about the Python proxy class are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Python, you will see behavior like this:

    >>> b = example.Bar()
    >>> print b.x
    _801861a4_p_int
    >>>
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    >>> c = example.Bar()
    >>> c.x = b.x             # Copy contents of b.x to c.x
    

    For array assignment, SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    >>> b = Bar()
    >>> x = b.f
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    >>> b = Bar()
    >>> b.f.a = 3               # Modify attribute of structure member
    >>> x = b.f
    >>> x.a = 3                 # Modifies the same structure
    

    Note that there is a limitation with structs within structs that will cause a problem if the outer struct is not a named variable in Python. The following will cause a segfault:

    Bar().f.a = 3
    

    because the unnamed Python proxy class for Bar() has its reference count decremented by the Python interpreter after f has been obtained from it and before f is used to obtain a . This results in the underlying Bar instance being deleted, which of course also deletes f inside it. Hence the pointer to f points to deleted memory and use of it results in a segfault or some sort of other undefined behaviour.

    32.3.7 C++ classes

    C++ classes are wrapped by Python classes as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Python like this:

    >>> l = example.List()
    >>> l.insert("Ale")
    >>> l.insert("Stout")
    >>> l.insert("Lager")
    >>> l.get(1)
    'Stout'
    >>> print l.length
    3
    >>>
    

    Class data members are accessed in the same manner as C structures.

    Static class members present a special problem for Python. Prior to Python-2.2, Python classes had no support for static methods and no version of Python supports static member variables in a manner that SWIG can utilize. Therefore, SWIG generates wrappers that try to work around some of these issues. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Python, the static member can be access in three different ways:

    >>> example.Spam_foo()    # Spam::foo()
    >>> s = example.Spam()
    >>> s.foo()               # Spam::foo() via an instance
    >>> example.Spam.foo()    # Spam::foo(). Python-2.2 only
    

    The first two methods of access are supported in all versions of Python. The last technique is only available in Python-2.2 and later versions.

    Static member variables are currently accessed as global variables. This means, they are accessed through cvar like this:

    >>> print example.cvar.Spam_bar
    7
    

    32.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    those classes are wrapped into a hierarchy of Python classes that reflect the same inheritance structure. All of the usual Python utility functions work normally:

    >>> b = Bar()
    >>> instance(b, Foo)
    1
    >>> issubclass(Bar, Foo)
    1
    >>> issubclass(Foo, Bar)
    0
    

    Furthermore, if you have functions like this

    void spam(Foo *f);
    

    then the function spam() accepts Foo * or a pointer to any class derived from Foo.

    It is safe to use multiple inheritance with SWIG.

    32.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(const Foo &x);// Pass by const reference
    void spam4(Foo x);       // Pass by value
    void spam5(Foo x[]);     // Array of objects
    

    In Python, there is no detailed distinction like this--specifically, there are only "objects". There are no pointers, references, arrays, and so forth. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    >>> f = Foo()           # Create a Foo
    >>> spam1(f)            # Ok. Pointer
    >>> spam2(f)            # Ok. Reference
    >>> spam3(f)            # Ok. Const reference
    >>> spam4(f)            # Ok. Value.
    >>> spam5(f)            # Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam6();
    Foo &spam7();
    Foo  spam8();
    const Foo &spam9();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam8) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Python will release this memory when the return value is garbage collected). The fourth case (spam9) which returns a const reference, in most of the cases will be treated as a returning value, and it will follow the same allocation/deallocation process.

    32.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Python in a straightforward manner:

    >>> foo(3)           # foo(int)
    >>> foo("Hello")     # foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Python code like this:

    >>> f = Foo()          # Create a Foo
    >>> g = Foo(f)         # Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    32.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
    
      Complex operator+=(const Complex &c) const;
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
    
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like you expect:

    >>> c = Complex(3, 4)
    >>> d = Complex(7, 8)
    >>> e = c + d
    >>> e.re()
    10.0
    >>> e.im()
    12.0
    >>> c += d
    >>> c.re()
    10.0
    >>> c.im()
    12.0
    
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    Also, be aware that certain operators don't map cleanly to Python. For instance, overloaded assignment operators don't map to Python semantics and will be ignored.

    Operator overloading is implemented in the pyopers.swg library file. In particular overloaded operators are marked with the python:maybecall feature, also known as %pythonmaybecall. This feature forces SWIG to generate code that return an instance of Python's NotImplemented instead of raising an exception when the comparison fails, that is, on any kind of error. This follows the guidelines in PEP 207 - Rich Comparisons and NotImplemented Python constant.

    32.3.12 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Python as follows:

    >>> import example
    >>> example.fact(3)
    6
    >>> v = example.Vector()
    >>> v.x = 3.4
    >>> print v.y
    0.0
    >>>
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    32.3.13 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
     ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Python:

    >>> import example
    >>> p = example.pairii(3, 4)
    >>> p.first
    3
    >>> p.second
    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    32.3.14 C++ Smart Pointers

    32.3.14.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Python in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    32.3.14.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Python, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Python, everything should just "work":

    >>> p = example.CreateFoo()          # Create a smart-pointer somehow
    >>> p.x = 3                          # Foo::x
    >>> p.bar()                          # Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    >>> f = p.__deref__()     # Returns underlying Foo *
    

    32.3.15 C++ reference counted objects

    The C++ reference counted objects section contains Python examples of memory management using referencing counting.

    32.4 Further details on the Python class interface

    In the previous section, a high-level view of Python wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Python proxy classes. This provides a very natural Python interface and allows SWIG to support a number of advanced features such as operator overloading. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work.

    New in SWIG version 2.0.4: The use of Python proxy classes has performance implications that may be unacceptable for a high-performance library. The new -builtin option instructs SWIG to forego the use of proxy classes, and instead create wrapped types as new built-in Python types. When this option is used, the following section ("Proxy classes") does not apply. Details on the use of the -builtin option are in the Built-in Types section.

    32.4.1 Proxy classes

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a class like this

    class Foo {
    public:
      int x;
      int spam(int);
      ...
    

    then SWIG transforms it into a set of low-level procedural wrappers. For example:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int arg1) {
      return f->spam(arg1);
    }
    

    These wrappers can be found in the low-level extension module (e.g., _example).

    Using these wrappers, SWIG generates a high-level Python proxy class (also known as a shadow class) like this (shown for Python 2.2):

    import _example
    
    class Foo(object):
        def __init__(self):
            self.this = _example.new_Foo()
            self.thisown = 1
        def __del__(self):
            if self.thisown:
                _example.delete_Foo(self.this)
        def spam(self, arg1):
            return _example.Foo_spam(self.this, arg1)
        x = property(_example.Foo_x_get, _example.Foo_x_set)
    

    This class merely holds a pointer to the underlying C++ object ( .this) and dispatches methods and member variable access to that object using the low-level accessor functions. From a user's point of view, it makes the class work normally:

    >>> f = example.Foo()
    >>> f.x = 3
    >>> y = f.spam(5)
    

    The fact that the class has been wrapped by a real Python class offers certain advantages. For instance, you can attach new Python methods to the class and you can even inherit from it (something not supported by Python built-in types until Python 2.2).

    32.4.2 Built-in Types

    The -builtin option provides a significant performance improvement in the wrapped code. To understand the difference between proxy classes and built-in types, let's take a look at what a wrapped object looks like under both circumstances.

    When proxy classes are used, each wrapped object in Python is an instance of a pure Python class. As a reminder, here is what the __init__ method looks like in a proxy class:

    class Foo(object):
        def __init__(self):
            self.this = _example.new_Foo()
            self.thisown = 1
    

    When a Foo instance is created, the call to _example.new_Foo() creates a new C++ Foo instance; wraps that C++ instance inside an instance of a Python built-in type called SwigPyObject; and stores the SwigPyObject instance in the 'this' field of the Python Foo object. Did you get all that? So, the Python Foo object is composed of three parts:

    • The Python Foo instance, which contains...
    • ... an instance of struct SwigPyObject, which contains...
    • ... a C++ Foo instance

    When -builtin is used, the pure Python layer is stripped off. Each wrapped class is turned into a new Python built-in type which inherits from SwigPyObject, and SwigPyObject instances are returned directly from the wrapped methods. For more information about Python built-in extensions, please refer to the Python documentation:

    https://docs.python.org/3/extending/newtypes.html

    32.4.2.1 Limitations

    Use of the -builtin option implies a couple of limitations:

    • Some legacy syntax is no longer supported; in particular:

      • The functional interface is no longer exposed. For example, you may no longer call Whizzo.new_CrunchyFrog(). Instead, you must use Whizzo.CrunchyFrog().
      • Static member variables are no longer accessed through the 'cvar' field (e.g., Dances.cvar.FishSlap). They are instead accessed in the idiomatic way (Dances.FishSlap).
    • Wrapped types may not be raised as Python exceptions. Here's why: the Python internals expect that all sub-classes of Exception will have this struct layout:

      typedef struct {
        PyObject_HEAD
        PyObject *dict;
        PyObject *args;
        PyObject *message;
      } PyBaseExceptionObject;
      

      But swig-generated wrappers expect that all swig-wrapped classes will have this struct layout:

      typedef struct {
        PyObject_HEAD
        void *ptr;
        swig_type_info *ty;
        int own;
        PyObject *next;
        PyObject *dict;
      } SwigPyObject;
      

      There are workarounds for this. For example, if you wrap this class:

      class MyException {
      public:
        MyException (const char *msg_);
        ~MyException ();
      
        const char *what () const;
      
      private:
        char *msg;
      };
      

      ... you can define this Python class, which may be raised as an exception:

      class MyPyException(Exception):
          def __init__(self, msg, *args):
              Exception.__init__(self, *args)
              self.myexc = MyException(msg)
          def what(self):
              return self.myexc.what()
      
    • Reverse binary operators (e.g., __radd__) are not supported.

      To illustrate this point, if you have a wrapped class called MyString, and you want to use instances of MyString interchangeably with native Python strings, you can define an 'operator+ (const char*)' method :

      class MyString {
      public:
        MyString (const char *init);
        MyString operator+ (const char *other) const;
        ...
      };
      

      SWIG will automatically create an operator overload in Python that will allow this:

      from MyModule import MyString
      
      mystr = MyString("No one expects")
      episode = mystr + " the Spanish Inquisition"
      

      This works because the first operand (mystr) defines a way to add a native string to itself. However, the following will not work:

      from MyModule import MyString
      
      mystr = MyString("Parrot")
      episode = "Dead " + mystr
      

      The above code fails, because the first operand -- a native Python string -- doesn't know how to add an instance of MyString to itself.

    • If you have multiple SWIG modules that share type information ( more info), the -builtin option requires a bit of extra discipline to ensure that base classes are initialized before derived classes. Specifically:

      • There must be an unambiguous dependency graph for the modules.

      • Module dependencies must be explicitly stated with %import statements in the SWIG interface file.

      As an example, suppose module A has this interface in A.i :

      %module "A";
      
      class Base {
      ...
      };
      

      If you want to wrap another module containing a class that inherits from A, this is how it would look :

      %module "B";
      
      %import "A.i"
      
      class Derived : public Base {
      ...
      };
      

      The import "A.i" statement is required, because module B depends on module A.

      As long as you obey these requirements, your Python code may import the modules in any order :

      import B
      import A
      
      assert(issubclass(B.Derived, A.Base))
      

    32.4.2.2 Operator overloads and slots -- use them!

    The entire justification for the -builtin option is improved performance. To that end, the best way to squeeze maximum performance out of your wrappers is to use operator overloads. Named method dispatch is slow in Python, even when compared to other scripting languages. However, Python built-in types have a large number of "slots", analogous to C++ operator overloads, which allow you to short-circuit named method dispatch for certain common operations.

    By default, SWIG will translate most C++ arithmetic operator overloads into Python slot entries. For example, suppose you have this class:

    class Twit {
    public:
      Twit operator+ (const Twit& twit) const;
    
      // Forward to operator+
      Twit add (const Twit& twit) const {
        return *this + twit;
      }
    };
    

    SWIG will automatically register operator+ as a Python slot operator for addition. You may write Python code like this:

    from MyModule import Twit
    
    nigel = Twit()
    emily = Twit()
    percival = nigel + emily
    percival = nigel.add(emily)
    

    The last two lines of the Python code are equivalent, but the line that uses the '+' operator is much faster.

    In-place operators (e.g., operator+=) and comparison operators (operator==, operator<, etc.) are also converted to Python slot operators. For a complete list of C++ operators that are automatically converted to Python slot operators, refer to the file python/pyopers.swig in the SWIG library.

    Read about all of the available Python slots here: https://docs.python.org/3/c-api/typeobj.html

    There are two ways to define a Python slot function: dispatch to a statically defined function; or dispatch to a method defined on the operand.

    To dispatch to a statically defined function, use %feature("python:<slot>"), where <slot> is the name of a field in a PyTypeObject, PyNumberMethods, PyMappingMethods, PySequenceMethods or PyBufferProcs. You may override (almost) all of these slots.

    Let's consider an example setting the tp_hash slot for the MyClass type. This is akin to providing a __hash__ method (for non-builtin types) to make a type hashable. The hashable type can then for example be added to a Python dict.

    %feature("python:tp_hash") MyClass "myHashFunc";
    
    class MyClass {
    public:
      long field1;
      long field2;
      ...
    };
    
    %{
    #if PY_VERSION_HEX >= 0x03020000
      static Py_hash_t myHashFunc(PyObject *pyobj)
    #else
      static long myHashFunc(PyObject *pyobj)
    #endif
      {
        MyClass *cobj;
        // Convert pyobj to cobj
        return (cobj->field1 * (cobj->field2 << 7));
      }
    %}
    

    If you examine the generated code, the supplied hash function will now be the function callback in the tp_hash slot for the builtin type for MyClass:

    static PyHeapTypeObject SwigPyBuiltin__MyClass_type = {
      ...
      (hashfunc) myHashFunc,       /* tp_hash */
      ...
    

    NOTE: It is the responsibility of the programmer (that's you!) to ensure that a statically defined slot function has the correct signature, the hashfunc typedef in this case.

    If, instead, you want to dispatch to an instance method, you can use %feature("python:slot"). For example:

    %feature("python:slot", "tp_hash", functype="hashfunc") MyClass::myHashFunc;
    
    #if PY_VERSION_HEX < 0x03020000
      #define Py_hash_t long
    #endif
    
    class MyClass {
      public:
        Py_hash_t myHashFunc() const;
        ...
    };
    

    NOTE: Some Python slots use a method signature which does not match the signature of SWIG-wrapped methods. For those slots, SWIG will automatically generate a "closure" function to re-marshal the arguments before dispatching to the wrapped method. Setting the "functype" attribute of the feature enables SWIG to generate the chosen closure function.

    There is further information on %feature("python:slot") in the file python/pyopers.swig in the SWIG library.

    32.4.3 Memory management

    NOTE: Although this section refers to proxy objects, everything here also applies when the -builtin option is used.

    Associated with proxy object, is an ownership flag .thisown The value of this flag determines who is responsible for deleting the underlying C++ object. If set to 1, the Python interpreter will destroy the C++ object when the proxy class is garbage collected. If set to 0 (or if the attribute is missing), then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Python automatically takes ownership of the result. For example:

    class Foo {
    public:
      Foo();
      Foo bar();
    };
    

    In Python:

    >>> f = Foo()
    >>> f.thisown
    1
    >>> g = f.bar()
    >>> g.thisown
    1
    

    On the other hand, when pointers are returned to Python, there is often no way to know where they came from. Therefore, the ownership is set to zero. For example:

    class Foo {
    public:
      ...
      Foo *spam();
      ...
    };
    

    >>> f = Foo()
    >>> s = f.spam()
    >>> print s.thisown
    0
    >>>
    

    This behavior is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Python to assume ownership and destroy it!

    A good way to indicate that ownership should be set for a returned pointer is to use the %newobject directive.

    Related to containers, ownership issues can arise whenever an object is assigned to a member or global variable. For example, consider this interface:

    %module example
    
    struct Foo {
      int  value;
      Foo  *next;
    };
    
    Foo *head = 0;
    

    When wrapped in Python, careful observation will reveal that ownership changes whenever an object is assigned to a global variable. For example:

    >>> f = example.Foo()
    >>> f.thisown
    1
    >>> example.cvar.head = f
    >>> f.thisown
    0
    >>>
    

    In this case, C is now holding a reference to the object---you probably don't want Python to destroy it. Similarly, this occurs for members. For example:

    >>> f = example.Foo()
    >>> g = example.Foo()
    >>> f.thisown
    1
    >>> g.thisown
    1
    >>> f.next = g
    >>> g.thisown
    0
    >>>
    

    For the most part, memory management issues remain hidden. However, there are occasionally situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Node {
      Object *value;
    public:
      void set_value(Object *v) { value = v; }
      ...
    };
    

    Now, consider the following Python code:

    >>> v = Object()           # Create an object
    >>> n = Node()             # Create a node
    >>> n.set_value(v)         # Set value
    >>> v.thisown
    1
    >>> del v
    

    In this case, the object n is holding a reference to v internally. However, SWIG has no way to know that this has occurred. Therefore, Python still thinks that it has ownership of the object. Should the proxy object be destroyed, then the C++ destructor will be invoked and n will be holding a stale-pointer. If you're lucky, you will only get a segmentation fault.

    To work around this, it is always possible to flip the ownership flag. For example,

    >>> v.thisown = 0
    

    It is also possible to deal with situations like this using typemaps--an advanced topic discussed later.

    32.5 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Python. In particular, if a C++ class has been extended in Python (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG 1.3.18 to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Python implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Python and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Python code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    32.5.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      Foo(int foo);
      virtual ~Foo();
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    then at the Python side you can define

    import mymodule
    
    class MyFoo(mymodule.Foo):
        def __init__(self, foo):
            mymodule.Foo.__init__(self, foo)
    #       super().__init__(foo) # Alternative construction for Python3
    
        def one(self):
            print "one from Python"
    

    32.5.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Python proxy classes. The director classes store a pointer to their underlying Python object and handle various issues related to object ownership. Indeed, this is quite similar to the "this" and "thisown" members of the Python proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in Python via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in Python were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Python. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Python, the Python API is used to call the method of the underlying Python object (after which the usual virtual method resolution in Python automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in Python, unless there's a good reason not to. The reason for this is simple: Python has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the Python proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the Python method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the pointer to the Python object that called the wrapper function to the pointer stored by the director. If these are the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in Python, SWIG creates an instance of the original C++ class and assigns it to .this. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through Python.

    32.5.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. Python instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to the Python object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special __disown__() method of the proxy class. After calling this method, the .thisown flag is set to zero, and the director class increments the reference count of the Python object. When the director class is deleted it decrements the reference count. Assuming no outstanding references to the Python object remain, the Python object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    To help ensure that no references to the Python object remain after calling __disown__(), this method returns a weak reference to the Python object. Weak references are only available in Python versions 2.1 and higher, so for older versions you must explicitly delete all references. Here is an example:

    class Foo {
    public:
      ...
    };
    class FooContainer {
    public:
      void addFoo(Foo *);
      ...
    };
    

    >>> c = FooContainer()
    >>> a = Foo().__disown__()
    >>> c.addFoo(a)
    >>> b = Foo()
    >>> b = b.__disown__()
    >>> c.addFoo(b)
    >>> c.addFoo(Foo().__disown__())
    

    In this example, we are assuming that FooContainer will take care of deleting all the Foo pointers it contains at some point. Note that no hard references to the Foo objects remain in Python.

    32.5.4 Exception unrolling

    With directors routing method calls to Python, and proxies routing them to C++, the handling of exceptions is an important concern. By default, the directors ignore exceptions that occur during method calls that are resolved in Python. To handle such exceptions correctly, it is necessary to temporarily translate them into C++ exceptions. This can be done with the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
      if ($error != NULL) {
        throw Swig::DirectorMethodException();
      }
    }
    

    This code will check the Python error state after each method call from a director into Python, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler. Currently no information about the Python error is stored in the Swig::DirectorMethodException object, but this will likely change in the future.

    It may be the case that a method call originates in Python, travels up to C++ through a proxy class, and then back into Python via a director method. If an exception occurs in Python at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
      try { $action }
      catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the Python error state is still set when Swig::DirectorMethodException is thrown, Python will register the exception as soon as the C wrapper function returns.

    32.5.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in Python and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from Python. Relative to the speed of Python execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through Python in order to ensure that the method does not have an extended Python implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with Python objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to Python objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Python.

    32.5.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    32.5.7 Miscellaneous

    Director typemaps for STL classes are in place, and hence you should be able to use std::vector, std::string, etc., as you would any other type.

    Note: The director typemaps for return types based in const references, such as

    class Foo {
    …
      virtual const int& bar();
    …
    };
    

    will work only for simple call scenarios. Usually the resulting code is neither thread or reentrant safe. Hence, the user is advised to avoid returning const references in director methods. For example, the user could modify the method interface to use lvalue return types, wherever possible, for example

    class Foo {
    …
      virtual int bar();
    …
    };
    

    If that is not possible, the user should avoid enabling the director feature for reentrant, recursive or threaded member methods that return const references.

    32.6 Common customization features

    The last section presented the absolute basics of C/C++ wrapping. If you do nothing but feed SWIG a header file, you will get an interface that mimics the behavior described. However, sometimes this isn't enough to produce a nice module. Certain types of functionality might be missing or the interface to certain functions might be awkward. This section describes some common SWIG features that are used to improve your the interface to an extension module.

    32.6.1 C/C++ helper functions

    Sometimes when you create a module, it is missing certain bits of functionality. For example, if you had a function like this

    void set_transform(Image *im, double m[4][4]);
    

    it would be accessible from Python, but there may be no easy way to call it. For example, you might get errors like this:

    >>> a = [
    ...   [1, 0, 0, 0],
    ...   [0, 1, 0, 0],
    ...   [0, 0, 1, 0],
    ...   [0, 0, 0, 1]]
    >>> set_transform(im, a)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_a_4__double
    

    The problem here is that there is no easy way to construct and manipulate a suitable double [4][4] value to use. To fix this, you can write some extra C helper functions. Just use the %inline directive. For example:

    %inline %{
    /* Note: double[4][4] is equivalent to a pointer to an array double (*)[4] */
    double (*new_mat44())[4] {
      return (double (*)[4]) malloc(16*sizeof(double));
    }
    void free_mat44(double (*x)[4]) {
      free(x);
    }
    void mat44_set(double x[4][4], int i, int j, double v) {
      x[i][j] = v;
    }
    double mat44_get(double x[4][4], int i, int j) {
      return x[i][j];
    }
    %}
    

    From Python, you could then write code like this:

    >>> a = new_mat44()
    >>> mat44_set(a, 0, 0, 1.0)
    >>> mat44_set(a, 1, 1, 1.0)
    >>> mat44_set(a, 2, 2, 1.0)
    ...
    >>> set_transform(im, a)
    >>>
    

    Admittedly, this is not the most elegant looking approach. However, it works and it wasn't too hard to implement. It is possible to clean this up using Python code, typemaps, and other customization features as covered in later sections.

    32.6.2 Adding additional Python code

    If writing support code in C isn't enough, it is also possible to write code in Python. This code gets inserted in to the .py file created by SWIG. One use of Python code might be to supply a high-level interface to certain functions. For example:

    void set_transform(Image *im, double x[4][4]);
    
    ...
    /* Rewrite the high level interface to set_transform */
    %pythoncode %{
    def set_transform(im, x):
        a = new_mat44()
        for i in range(4):
            for j in range(4):
                mat44_set(a, i, j, x[i][j])
        _example.set_transform(im, a)
        free_mat44(a)
    %}
    

    In this example, set_transform() provides a high-level Python interface built on top of low-level helper functions. For example, this code now seems to work:

    >>> a = [
    ...   [1, 0, 0, 0],
    ...   [0, 1, 0, 0],
    ...   [0, 0, 1, 0],
    ...   [0, 0, 0, 1]]
    >>> set_transform(im, a)
    >>>
    

    Admittedly, this whole scheme for wrapping the two-dimension array argument is rather ad-hoc. Besides, shouldn't a Python list or a Numeric Python array just work normally? We'll get to those examples soon enough. For now, think of this example as an illustration of what can be done without having to rely on any of the more advanced customization features.

    There is also %pythonbegin which is another directive very similar to %pythoncode, but generates the given Python code at the beginning of the .py file. This directive works in the same way as %pythoncode, except the code is copied just after the SWIG banner (comment) at the top of the file, before any real code. This provides an opportunity to add your own description in a comment near the top of the file as well as Python imports that have to appear at the top of the file, such as "from __future__ import" statements.

    The following example for Python 2.x shows how to insert code into the generated wrapper to enable print to be used as a Python3-compatible function instead of a statement:

    %pythonbegin %{
    # This module provides wrappers to the Whizz Bang library
    %}
    
    %pythonbegin %{
    from __future__ import print_function
    print("Loading", "Whizz", "Bang", sep=' ... ')
    %}
    

    The insert code can be seen at the start of the generated .py file:

    # This file was automatically generated by SWIG (http://www.swig.org).
    # Version 4.0.0
    #
    # Do not make changes to this file unless you know what you are doing--modify
    # the SWIG interface file instead.
    
    # This module provides wrappers to the Whizz Bang library
    
    from __future__ import print_function
    print("Loading", "Whizz", "Bang", sep=' ... ')
    
    

    When using %pythoncode and %pythonbegin you generally want to make sure that the block is delimited by %{ and %}. If you delimit it with { and } then any lines with a leading # will be handled by SWIG as preprocessor directives, when you probably meant them as Python comments. Prior to SWIG 3.0.3, invalid preprocessor directives were silently ignored, so generally using the wrong delimiters resulted in such comments not appearing in the generated output (though a comment starting with a valid preprocessor directive could cause problems, for example: # error handling). SWIG 3.0.3 and later report an error for invalid preprocessor directives, so you may have to update existing interface files to delimit blocks of Python code correctly.

    As an alternative to providing a block containing Python code, you can include Python code from a file. The code is inserted exactly as in the file, so this avoids any issues with the SWIG preprocessor. It's a good approach if you have a non-trivial chunk of Python code to insert. To use this feature you specify a filename in double quotes, for example:

    %pythoncode "somecode.py"
    

    Sometimes you may want to replace or modify the wrapper function that SWIG creates in the proxy .py file. The Python module in SWIG provides some features that enable you to do this. First, to entirely replace a proxy function you can use %feature("shadow"). For example:

    %module example
    
    // Rewrite bar() Python code
    
    %feature("shadow") Foo::bar(int) %{
    def bar(*args):
        #do something before
        $action
        #do something after
    %}
    
    class Foo {
    public:
      int bar(int x);
    };
    

    where $action will be replaced by the call to the C/C++ proper method.

    Often the proxy function created by SWIG is fine, but you simply want to add code to it without touching the rest of the generated function body. For these cases SWIG provides the pythonprepend and pythonappend features which do exactly as their names suggest. The pythonprepend feature will insert its value at the beginning of the proxy function, and pythonappend will insert code at the end of the proxy, just before the return statement.

    %module example
    
    // Add Python code to bar()
    
    %feature("pythonprepend") Foo::bar(int) %{
        #do something before C++ call
    %}
    
    %feature("pythonappend") Foo::bar(int) %{
        #do something after C++ call
        #the 'val' variable holds the return value
    %}
    
    
    class Foo {
    public:
      int bar(int x);
    };
    

    Notes: Usually the pythonappend and pythonprepend features are safer to use than the shadow feature. Also, from SWIG version 1.3.28 you can use the directive forms %pythonappend and %pythonprepend as follows:

    %module example
    
    // Add Python code to bar()
    
    %pythonprepend Foo::bar(int) %{
        #do something before C++ call
    %}
    
    %pythonappend Foo::bar(int) %{
        #do something after C++ call
        #the 'val' variable holds the return value
    %}
    
    
    class Foo {
    public:
      int bar(int x);
    };
    

    Note that when the underlying C++ method is overloaded, there is only one proxy Python method for multiple C++ methods. In this case, only one of parsed methods is examined for the feature. You are better off specifying the feature without the argument list to ensure it will get used, as it will then get attached to all the overloaded C++ methods. For example:

    %module example
    
    // Add Python code to bar()
    
    %pythonprepend Foo::bar %{
        #do something before C++ call
    %}
    
    %pythonappend Foo::bar %{
        #do something after C++ call
    %}
    
    
    class Foo {
    public:
      int bar(int x);
      int bar();
    };
    

    The same applies for overloaded constructors.

    32.6.3 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods--at least in the Python interface. Here is a simple example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    struct Vector {
      double x, y, z;
    };
    
    %extend Vector {
      char *__str__() {
        static char tmp[1024];
        sprintf(tmp, "Vector(%g, %g, %g)", $self->x, $self->y, $self->z);
        return tmp;
      }
      Vector(double x, double y, double z) {
        Vector *v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
    };
    

    Now, in Python

    >>> v = example.Vector(2, 3, 4)
    >>> print v
    Vector(2, 3, 4)
    >>>
    

    %extend can be used for many more tasks than this. For example, if you wanted to overload a Python operator, you might do this:

    %extend Vector {
      Vector __add__(Vector *other) {
        Vector v;
        v.x = $self->x + other->x;
        v.y = $self->y + other->y;
        v.z = $self->z + other->z;
        return v;
      }
    };
    

    Use it like this:

    >>> import example
    >>> v = example.Vector(2, 3, 4)
    >>> w = example.Vector(10, 11, 12)
    >>> print v+w
    Vector(12, 14, 16)
    >>>
    

    %extend works with both C and C++ code. It does not modify the underlying object in any way---the extensions only show up in the Python interface.

    32.6.4 Exception handling with %exception

    If a C or C++ function throws an error, you may want to convert that error into a Python exception. To do this, you can use the %exception directive. %exception simply lets you rewrite part of the generated wrapper code to include an error check.

    In C, a function often indicates an error by returning a status code (a negative number or a NULL pointer perhaps). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (!result) {
        PyErr_SetString(PyExc_MemoryError, "Not enough memory");
        SWIG_fail;
      }
    }
    void *malloc(size_t nbytes);
    

    In Python,

    >>> a = example.malloc(2000000000)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    MemoryError: Not enough memory
    >>>
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception {
      $action
      if (err_occurred()) {
        PyErr_SetString(PyExc_RuntimeError, err_message());
        SWIG_fail;
      }
    }
    

    No declaration name is given to %exception, it is applied to all wrapper functions.

    C++ exceptions are also easy to handle. For example, you can write code like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        PyErr_SetString(PyExc_IndexError, const_cast<char*>(e.what()));
        SWIG_fail;
      }
    }
    
    class Base {
    public:
      Foo *getitem(int index);      // Exception handled added
      ...
    };
    

    When raising a Python exception from C, use the PyErr_SetString() function as shown above followed by SWIG_fail . The following exception types can be used as the first argument.

    PyExc_ArithmeticError
    PyExc_AssertionError
    PyExc_AttributeError
    PyExc_EnvironmentError
    PyExc_EOFError
    PyExc_Exception
    PyExc_FloatingPointError
    PyExc_ImportError
    PyExc_IndexError
    PyExc_IOError
    PyExc_KeyError
    PyExc_KeyboardInterrupt
    PyExc_LookupError
    PyExc_MemoryError
    PyExc_NameError
    PyExc_NotImplementedError
    PyExc_OSError
    PyExc_OverflowError
    PyExc_RuntimeError
    PyExc_StandardError
    PyExc_SyntaxError
    PyExc_SystemError
    PyExc_TypeError
    PyExc_UnicodeError
    PyExc_ValueError
    PyExc_ZeroDivisionError
    

    SWIG_fail is a C macro which when called within the context of SWIG wrapper function, will jump to the error handler code. This will call any cleanup code (freeing any temp variables) and then return from the wrapper function so that the Python interpreter can raise the Python exception. This macro should always be called after setting a Python error in code snippets, such as typemaps and %exception , that are ultimately generated into the wrapper function.

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter.

    32.6.5 Optimization options

    32.6.5.1 -fastproxy

    The -fastproxy command line option enables faster method calling as the call is made directly into the C/C++ layer rather than going through a method wrapper.

    Consider wrapping a C++ class:

    struct Go {
      void callme0() {}
      void callme4(int a, int b, int c, int d) {}
      void callme8(double a, double b, double c, double d, double e, double f, double g, double i) {}
    };
    

    The default generated proxy class is:

    class Go(object):
        def callme0(self):
            return _example.Go_callme0(self)
    
        def callme4(self, a, b, c, d):
            return _example.Go_callme4(self, a, b, c, d)
    
        def callme8(self, a, b, c, d, e, f, g, i):
            return _example.Go_callme8(self, a, b, c, d, e, f, g, i)
        ...
    

    Each method in the Python class contains a Python proxy method which passes the arguments on to the underlying function in the low-level C/C++ module (_example in this case). The generated proxy class when using -fastproxy is:

    %module example
    class Go(object):
        callme0 = _swig_new_instance_method(_example.Go_callme0)
        callme4 = _swig_new_instance_method(_example.Go_callme4)
        callme8 = _swig_new_instance_method(_example.Go_callme8)
        ...
    

    where _swig_new_instance_method adds the method to the proxy class via C API calls for direct access to the underlying function in the low-level C/C++ module. Note that for some methods it is not possible to generate the direct access call and so -fastproxy is ignored. This happens, for example, when adding additional code to Python proxy methods, such as using %pythonprepend.

    The overhead calling into C/C++ from Python is reduced slightly using -fastproxy. Below are some timings in microseconds calling the 3 functions in the example above. Also included in the table for comparison is using the -builtin option covered in the Built-in Types.

    Method nameDefault-fastproxy-builtin
    callme00.150.090.07
    callme40.260.160.14
    callme80.320.200.17

    Although the -fastproxy option results in faster code over the default, the generated proxy code is not as user-friendly as docstring/doxygen comments and functions with default values are not visible in the generated Python proxy class. The -olddefs option can rectify this.

    The generated proxy class for the example above when using -fastproxy -olddefs is:

    class Go(object):
        def callme0(self):
            return _example.Go_callme0(self)
        callme0 = _swig_new_instance_method(_example.Go_callme0)
    
        def callme4(self, a, b, c, d):
            return _example.Go_callme4(self, a, b, c, d)
        callme4 = _swig_new_instance_method(_example.Go_callme4)
    
        def callme8(self, a, b, c, d, e, f, g, i):
            return _example.Go_callme8(self, a, b, c, d, e, f, g, i)
        callme8 = _swig_new_instance_method(_example.Go_callme8)
        ...
    

    The class defines each method in two different ways. The first definition is replaced by the second definition and so the second definition is the one used when the method is called. While this possibly provides the best of both worlds, the time to import the module will be slightly slower when the class is defined due to the additional method definitions.

    The command line options mentioned above also apply to wrapped C/C++ global functions, not just class methods.

    32.7 Tips and techniques

    Although SWIG is largely automatic, there are certain types of wrapping problems that require additional user input. Examples include dealing with output parameters, strings, binary data, and arrays. This chapter discusses the common techniques for solving these problems.

    32.7.1 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x-*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Python, this allows you to pass simple values. For example:

    >>> a = add(3, 4)
    >>> print a
    7
    >>> b = sub(7, 4)
    >>> print b
    3
    >>>
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT , use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Python, a mutated parameter shows up as a return value. For example:

    >>> a = negate(3)
    >>> print a
    -3
    >>>
    

    Note: Since most primitive Python objects are immutable, it is not possible to perform in-place modification of a Python object passed as a parameter.

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Python, the function will return multiple values.

    bytes, success = send_message("Hello World")
    if not success:
        print "Whoa!"
    else:
        print "Sent", bytes
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Python:

    >>> r, c = get_dimensions(m)
    

    Be aware that the primary purpose of the typemaps.i file is to support primitive datatypes. Writing a function like this

    void foo(Bar *OUTPUT);
    

    may not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    32.7.2 Simple pointers

    If you must work with simple pointers such as int * or double * and you don't want to use typemaps.i, consider using the cpointer.i library file. For example:

    %module example
    %include "cpointer.i"
    
    %inline %{
    extern void add(int x, int y, int *result);
    %}
    
    %pointer_functions(int, intp);
    

    The %pointer_functions(type, name) macro generates five helper functions that can be used to create, destroy, copy, assign, and dereference a pointer. In this case, the functions are as follows:

    int  *new_intp();
    int  *copy_intp(int *x);
    void  delete_intp(int *x);
    void  intp_assign(int *x, int value);
    int   intp_value(int *x);
    

    In Python, you would use the functions like this:

    >>> result = new_intp()
    >>> print result
    _108fea8_p_int
    >>> add(3, 4, result)
    >>> print intp_value(result)
    7
    >>>
    

    If you replace %pointer_functions() by %pointer_class(type, name), the interface is more class-like.

    >>> result = intp()
    >>> add(3, 4, result)
    >>> print result.value()
    7
    

    See the SWIG Library chapter for further details.

    32.7.3 Unbounded C Arrays

    Sometimes a C function expects an array to be passed as a pointer. For example,

    int sumitems(int *first, int nitems) {
      int i, sum = 0;
      for (i = 0; i < nitems; i++) {
        sum += first[i];
      }
      return sum;
    }
    

    To wrap this into Python, you need to pass an array pointer as the first argument. A simple way to do this is to use the carrays.i library file. For example:

    %include "carrays.i"
    %array_class(int, intArray);
    

    The %array_class(type, name) macro creates wrappers for an unbounded array object that can be passed around as a simple pointer like int * or double *. For instance, you will be able to do this in Python:

    >>> a = intArray(10000000)         # Array of 10-million integers
    >>> for i in xrange(10000):        # Set some values
    ...     a[i] = i
    >>> sumitems(a, 10000)
    49995000
    >>>
    

    The array "object" created by %array_class() does not encapsulate pointers inside a special array object. In fact, there is no bounds checking or safety of any kind (just like in C). Because of this, the arrays created by this library are extremely low-level indeed. You can't iterate over them nor can you even query their length. In fact, any valid memory address can be accessed if you want (negative indices, indices beyond the end of the array, etc.). Needless to say, this approach is not going to suit all applications. On the other hand, this low-level approach is extremely efficient and well suited for applications in which you need to create buffers, package binary data, etc.

    32.7.4 String handling

    If a C function has an argument of char *, then a Python string can be passed as input. For example:

    // C
    void foo(char *s);
    
    # Python
    >>> foo("Hello")
    

    When a Python string is passed as a parameter, the C function receives a pointer to the raw data contained in the string. Since Python strings are immutable, it is illegal for your program to change the value. In fact, doing so will probably crash the Python interpreter.

    If your program modifies the input parameter or uses it to return data, consider using the cstring.i library file described in the SWIG Library chapter.

    When functions return a char *, it is assumed to be a NULL-terminated string. Data is copied into a new Python string and returned.

    If your program needs to work with binary data, you can use a typemap to expand a Python string into a pointer/length argument pair. As luck would have it, just such a typemap is already defined. Just do this:

    %apply (char *STRING, int LENGTH) { (char *data, int size) };
    ...
    int parity(char *data, int size, int initial);
    

    Now in Python:

    >>> parity("e\x09ffss\x00\x00\x01\nx", 0)
    

    If you need to return binary data, you might use the cstring.i library file. The cdata.i library can also be used to extra binary data from arbitrary pointers.

    32.7.5 Default arguments

    C++ default argument code generation is documented in the main Default arguments section. There is also an optional Python specific feature that can be used called the python:cdefaultargs feature flag. By default, SWIG attempts to convert C++ default argument values into Python values and generates code into the Python layer containing these values. For example:

    struct CDA {
      int fff(int a = 1, bool b = false);
    };
    

    From Python this can be called as follows:

    >>> CDA().fff()        # C++ layer receives a=1 and b=false
    >>> CDA().fff(2)       # C++ layer receives a=2 and b=false
    >>> CDA().fff(3, True) # C++ layer receives a=3 and b=true
    

    The default code generation in the Python layer is:

    class CDA(object):
        ...
        def fff(self, a=1, b=False):
            return _default_args.CDA_fff(self, a, b)
    

    Adding the feature:

    %feature("python:cdefaultargs") CDA::fff;
    struct CDA {
      int fff(int a = 1, bool b = false);
    

    results in identical behaviour when called from Python, however, it results in different code generation:

    class CDA(object):
        ...
        def fff(self, *args):
            return _default_args.CDA_fff(self, *args)
    

    The default arguments are obtained in the C++ wrapper layer instead of the Python layer. Some code generation modes are quite different, eg -builtin and -fastproxy, and are unaffected by python:cdefaultargs as the default values are always obtained from the C++ layer.

    Note that not all default arguments can be converted into a Python equivalent. When SWIG does not convert them, it will generate code to obtain them from the C++ layer as if python:cdefaultargs was specified. This will happen if just one argument cannot be converted into a Python equivalent. This occurs typically when the argument is not fully numeric, such as int(1):

    struct CDA {
      int fff(int a = int(1), bool b = false);
    };
    

    Compatibility Note: SWIG-3.0.6 introduced the python:cdefaultargs feature. Versions of SWIG prior to this varied in their ability to convert C++ default values into equivalent Python default argument values.

    32.8 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Python C API as well as the material in the " Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Python interface or if you want to elevate your guru status.

    32.8.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Python to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) PyLong_AsLong($input);
      printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object of type PyObject *.

    When this example is compiled into a Python module, it operates as follows:

    >>> from example import *
    >>> fact(6)
    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int nonnegative {
      $1 = (int) PyLong_AsLong($input);
      if ($1 < 0) {
        PyErr_SetString(PyExc_ValueError, "Expected a nonnegative value.");
        SWIG_fail;
      }
    }
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int nonnegative.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG C++ type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) PyLong_AsLong($input);
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = PyString_AsString($input);
      $2 = PyString_Size($input);
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Python object. This allows the function to be used like this (notice how the length parameter is omitted):

    >>> example.count('e', 'Hello World')
    1
    >>>
    

    32.8.2 Python typemaps

    The previous section illustrated an "in" typemap for converting Python objects to C. A variety of different typemap methods are defined by the Python module. For example, to convert a C integer back into a Python object, you might define an "out" typemap like this:

    %typemap(out) int {
        $result = PyInt_FromLong((long) $1);
    }
    

    A detailed list of available methods can be found in the " Typemaps" chapter.

    However, the best source of typemap information (and examples) is probably the Python module itself. In fact, all of SWIG's default type handling is defined by typemaps. You can view these typemaps by looking at the files in the SWIG library. Just take into account that in the latest versions of swig (1.3.22+), the library files are not very pristine clear for the casual reader, as they used to be. The extensive use of macros and other ugly techniques in the latest version produce a very powerful and consistent Python typemap library, but at the cost of simplicity and pedagogic value.

    To learn how to write a simple or your first typemap, you better take a look at the SWIG library version 1.3.20 or so.

    32.8.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the " Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Python.

    $input

    A PyObject * holding a raw Python object with an argument or variable value.

    $result

    A PyObject * that holds the result to be returned to Python.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Python name of the wrapper function being created.

    32.8.4 Useful Python Functions

    When you write a typemap, you usually have to work directly with Python objects. The following functions may prove to be useful.

    Python Integer Functions

    PyObject *PyInt_FromLong(long l);
    long      PyInt_AsLong(PyObject *);
    int       PyInt_Check(PyObject *);
    

    Python Floating Point Functions

    PyObject *PyFloat_FromDouble(double);
    double    PyFloat_AsDouble(PyObject *);
    int       PyFloat_Check(PyObject *);
    

    Python String Functions

    PyObject *PyString_FromString(char *);
    PyObject *PyString_FromStringAndSize(char *, lint len);
    int       PyString_Size(PyObject *);
    char     *PyString_AsString(PyObject *);
    int       PyString_Check(PyObject *);
    

    Python List Functions

    PyObject *PyList_New(int size);
    int       PyList_Size(PyObject *list);
    PyObject *PyList_GetItem(PyObject *list, int i);
    int       PyList_SetItem(PyObject *list, int i, PyObject *item);
    int       PyList_Insert(PyObject *list, int i, PyObject *item);
    int       PyList_Append(PyObject *list, PyObject *item);
    PyObject *PyList_GetSlice(PyObject *list, int i, int j);
    int       PyList_SetSlice(PyObject *list, int i, int , PyObject *list2);
    int       PyList_Sort(PyObject *list);
    int       PyList_Reverse(PyObject *list);
    PyObject *PyList_AsTuple(PyObject *list);
    int       PyList_Check(PyObject *);
    

    Python Tuple Functions

    PyObject *PyTuple_New(int size);
    int       PyTuple_Size(PyObject *);
    PyObject *PyTuple_GetItem(PyObject *, int i);
    int       PyTuple_SetItem(PyObject *, int i, PyObject *item);
    PyObject *PyTuple_GetSlice(PyObject *t, int i, int j);
    int       PyTuple_Check(PyObject *);
    

    Python Dictionary Functions

    PyObject *PyDict_New();
    int       PyDict_Check(PyObject *);
    int       PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val);
    int       PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);
    int       PyDict_DelItem(PyObject *p, PyObject *key);
    int       PyDict_DelItemString(PyObject *p, char *key);
    PyObject* PyDict_Keys(PyObject *p);
    PyObject* PyDict_Values(PyObject *p);
    PyObject* PyDict_GetItem(PyObject *p, PyObject *key);
    PyObject* PyDict_GetItemString(PyObject *p, const char *key);
    int       PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);
    Py_ssize_t PyDict_Size(PyObject *p);
    int       PyDict_Update(PyObject *a, PyObject *b);
    int       PyDict_Merge(PyObject *a, PyObject *b, int override);
    PyObject* PyDict_Items(PyObject *p);
    

    Python File Conversion Functions

    PyObject *PyFile_FromFile(FILE *f);
    FILE     *PyFile_AsFile(PyObject *);
    int       PyFile_Check(PyObject *);
    

    Abstract Object Interface

    write me
    

    32.9 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "python.swg" and "typemaps.i " in the SWIG library.

    32.9.1 Converting Python list to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Python list object to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      /* Check if is a list */
      if (PyList_Check($input)) {
        int size = PyList_Size($input);
        int i = 0;
        $1 = (char **) malloc((size+1)*sizeof(char *));
        for (i = 0; i < size; i++) {
          PyObject *o = PyList_GetItem($input, i);
          if (PyString_Check(o)) {
            $1[i] = PyString_AsString(PyList_GetItem($input, i));
          } else {
            free($1);
            PyErr_SetString(PyExc_TypeError, "list must contain strings");
            SWIG_fail;
          }
        }
        $1[i] = 0;
      } else {
        PyErr_SetString(PyExc_TypeError, "not a list");
        SWIG_fail;
      }
    }
    
    // This cleans up the char ** array we malloc'd before the function call
    %typemap(freearg) char ** {
      free((char *) $1);
    }
    
    // Now a test function
    %inline %{
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    %}
    
    

    When this module is compiled, the wrapped C function now operates as follows :

    >>> from argv import *
    >>> print_args(["Dave", "Mike", "Mary", "Jane", "John"])
    argv[0] = Dave
    argv[1] = Mike
    argv[2] = Mary
    argv[3] = Jane
    argv[4] = John
    5
    

    In the example, two different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function.

    32.9.2 Expanding a Python object into multiple arguments

    Suppose that you had a collection of C functions with arguments such as the following:

    int foo(int argc, char **argv);
    

    In the previous example, a typemap was written to pass a Python list as the char **argv. This allows the function to be used from Python as follows:

    >>> foo(4, ["foo", "bar", "spam", "1"])
    

    Although this works, it's a little awkward to specify the argument count. To fix this, a multi-argument typemap can be defined. This is not very difficult--you only have to make slight modifications to the previous example:

    %typemap(in) (int argc, char **argv) {
      /* Check if is a list */
      if (PyList_Check($input)) {
        int i;
        $1 = PyList_Size($input);
        $2 = (char **) malloc(($1+1)*sizeof(char *));
        for (i = 0; i < $1; i++) {
          PyObject *o = PyList_GetItem($input, i);
          if (PyString_Check(o)) {
            $2[i] = PyString_AsString(PyList_GetItem($input, i));
          } else {
            free($2);
            PyErr_SetString(PyExc_TypeError, "list must contain strings");
            SWIG_fail;
          }
        }
        $2[i] = 0;
      } else {
        PyErr_SetString(PyExc_TypeError, "not a list");
        SWIG_fail;
      }
    }
    
    %typemap(freearg) (int argc, char **argv) {
      free((char *) $2);
    }
    

    When writing a multiple-argument typemap, each of the types is referenced by a variable such as $1 or $2. The typemap code simply fills in the appropriate values from the supplied Python object.

    With the above typemap in place, you will find it no longer necessary to supply the argument count. This is automatically set by the typemap code. For example:

    >>> foo(["foo", "bar", "spam", "1"])
    

    If your function is overloaded in C++, for example:

    int foo(int argc, char **argv);
    int foo();
    

    don't forget to also provide a suitable typecheck typemap for overloading such as:

    %typecheck(SWIG_TYPECHECK_STRING_ARRAY) (int argc, char **argv) {
      $1 = PyList_Check($input) ? 1 : 0;
    }
    

    If you don't you'll get an error message along the lines of:

    Traceback (most recent call last):
      File "runme.py", line 3, in >module<
        example.foo(["foo", "bar", "spam", "1"])
    TypeError: Wrong number or type of arguments for overloaded function 'foo'.
      Possible C/C++ prototypes are:
        foo(int, char **)
        foo()
    

    32.9.3 Using typemaps to return arguments

    A common problem in some C programs is that values may be returned in arguments rather than in the return value of a function. For example:

    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2) {
      ... Do a bunch of stuff ...
      *out1 = result1;
      *out2 = result2;
      return status;
    }
    

    A typemap can be used to handle this case as follows :

    %module outarg
    
    // This tells SWIG to treat an double * argument with name 'OutValue' as
    // an output value.  We'll append the value to the current result which
    // is guaranteed to be a List object by SWIG.
    
    %typemap(argout) double *OutValue {
      PyObject *o, *o2, *o3;
      o = PyFloat_FromDouble(*$1);
      if ((!$result) || ($result == Py_None)) {
        $result = o;
      } else {
        if (!PyTuple_Check($result)) {
          PyObject *o2 = $result;
          $result = PyTuple_New(1);
          PyTuple_SetItem($result, 0, o2);
        }
        o3 = PyTuple_New(1);
        PyTuple_SetItem(o3, 0, o);
        o2 = $result;
        $result = PySequence_Concat(o2, o3);
        Py_DECREF(o2);
        Py_DECREF(o3);
      }
    }
    
    int spam(double a, double b, double *OutValue, double *OutValue);
    
    

    The typemap works as follows. First, a check is made to see if any previous result exists. If so, it is turned into a tuple and the new output value is concatenated to it. Otherwise, the result is returned normally. For the sample function spam(), there are three output values--meaning that the function will return a 3-tuple of the results.

    As written, the function must accept 4 arguments as input values, last two being pointers to doubles. If these arguments are only used to hold output values (and have no meaningful input value), an additional typemap can be written. For example:

    %typemap(in, numinputs=0) double *OutValue(double temp) {
      $1 = &temp;
    }
    
    

    By specifying numinputs=0, the input value is ignored. However, since the argument still has to be set to some meaningful value before calling C, it is set to point to a local variable temp. When the function stores its output value, it will simply be placed in this local variable. As a result, the function can now be used as follows:

    >>> a = spam(4, 5)
    >>> print a
    (0, 2.45, 5.0)
    >>> x, y, z = spam(4, 5)
    >>>
    

    32.9.4 Mapping Python tuples into small arrays

    In some applications, it is sometimes desirable to pass small arrays of numbers as arguments. For example :

    extern void set_direction(double a[4]);       // Set direction vector
    

    This too, can be handled used typemaps as follows :

    // Grab a 4 element array as a Python 4-tuple
    %typemap(in) double[4](double temp[4]) {   // temp[4] becomes a local variable
      int i;
      if (PyTuple_Check($input)) {
        if (!PyArg_ParseTuple($input, "dddd", temp, temp+1, temp+2, temp+3)) {
          PyErr_SetString(PyExc_TypeError, "tuple must have 4 elements");
          SWIG_fail;
        }
        $1 = &temp[0];
      } else {
        PyErr_SetString(PyExc_TypeError, "expected a tuple.");
        SWIG_fail;
      }
    }
    
    

    This allows our set_direction function to be called from Python as follows :

    >>> set_direction((0.5, 0.0, 1.0, -0.25))
    

    Since our mapping copies the contents of a Python tuple into a C array, such an approach would not be recommended for huge arrays, but for small structures, this approach works fine.

    32.9.5 Mapping sequences to C arrays

    Suppose that you wanted to generalize the previous example to handle C arrays of different sizes. To do this, you might write a typemap as follows:

    // Map a Python sequence into any sized C double array
    %typemap(in) double[ANY](double temp[$1_dim0]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_TypeError, "Expecting a sequence");
        SWIG_fail;
      }
      if (PyObject_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Expecting a sequence with $1_dim0 elements");
        SWIG_fail;
      }
      for (i =0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (!PyFloat_Check(o)) {
          Py_XDECREF(o);
          PyErr_SetString(PyExc_ValueError, "Expecting a sequence of floats");
          SWIG_fail;
        }
        temp[i] = PyFloat_AsDouble(o);
        Py_DECREF(o);
      }
      $1 = &temp[0];
    }
    

    In this case, the variable $1_dim0 is expanded to match the array dimensions actually used in the C code. This allows the typemap to be applied to types such as:

    void foo(double x[10]);
    void bar(double a[4], double b[8]);
    

    Since the above typemap code gets inserted into every wrapper function where used, it might make sense to use a helper function instead. This will greatly reduce the amount of wrapper code. For example:

    %{
    static int convert_darray(PyObject *input, double *ptr, int size) {
      int i;
      if (!PySequence_Check(input)) {
        PyErr_SetString(PyExc_TypeError, "Expecting a sequence");
        return 0;
      }
      if (PyObject_Length(input) != size) {
        PyErr_SetString(PyExc_ValueError, "Sequence size mismatch");
        return 0;
      }
      for (i =0; i < size; i++) {
        PyObject *o = PySequence_GetItem(input, i);
        if (!PyFloat_Check(o)) {
          Py_XDECREF(o);
          PyErr_SetString(PyExc_ValueError, "Expecting a sequence of floats");
          return 0;
        }
        ptr[i] = PyFloat_AsDouble(o);
        Py_DECREF(o);
      }
      return 1;
    }
    %}
    
    %typemap(in) double [ANY](double temp[$1_dim0]) {
      if (!convert_darray($input, temp, $1_dim0)) {
        SWIG_fail;
      }
      $1 = &temp[0];
    }
    

    32.9.6 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. Since there are several ways in which pointers can be represented, the following two functions are used to safely perform this conversion:

    int SWIG_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Python object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. It is the bitwise-or of several flag values including SWIG_POINTER_EXCEPTION and SWIG_POINTER_DISOWN . The first flag makes the function raise an exception on type error. The second flag additionally steals ownership of an object. Returns 0 on success and -1 on error.

    PyObject *SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int own)

    Creates a new Python pointer object. ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag that indicates whether or not Python should take ownership of the pointer.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    PyObject *obj;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    Although the pointer handling functions are primarily intended for manipulating low-level pointers, both functions are fully aware of Python proxy classes. Specifically, SWIG_ConvertPtr() will retrieve a pointer from any object that has a this attribute. In addition, SWIG_NewPointerObj() can automatically generate a proxy class object (if applicable).

    32.9.7 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable. The example is a direct equivalent to this Java equivalent.

    Consider the following C++ code:

    #include <iostream>
    struct Wheel {
      int size;
      Wheel(int sz = 0) : size(sz) {}
      ~Wheel() { std::cout << "~Wheel" << std::endl; }
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from Python after running the code through SWIG:

    bike = Bike(10)
    wheel = bike.getWheel()
    print("wheel size: {}".format(wheel.size))
    
    del bike  # Allow bike to be garbage collected
    print("wheel size: {}".format(wheel.size))
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    ~Wheel
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance, a reference to the Bike must be added to the wheel instance.

    You can do this by adding the reference when the getWheel() method is called using one of three approaches:

    The easier, but less optimized, way is to use the %pythonappend directive (see Adding additional Python code ):

    %pythonappend getWheel %{
      # val is the Wheel proxy, self is the Bike instance
      val.__bike_reference = self
    %}
    

    The code gets appended to the Python code generated for the Bike::getWheel wrapper function, where we store the Bike proxy instance onto the Wheel proxy instance before it is returned to the caller as follows.

    class Bike(object):
        ...
        def getWheel(self):
            val = _example.Bike_getWheel(self)
    
            # val is the Wheel proxy, self is the Bike instance
            val.__bike_reference = self
    
            return val
    

    The second option, which performs better and is required if you use the -builtin option, is to set the reference in the CPython implementation:

    %extend Wheel {
    // A reference to the parent class is added to ensure the underlying C++
    // object is not deleted while the item is in use
    %typemap(ret) Wheel& getWheel {
      PyObject *bike_reference_string = SWIG_Python_str_FromChar("__bike_reference");
      PyObject_SetAttr($result, bike_reference_string, $self);
      Py_DecRef(bike_reference_string);
    }
    }
    

    The third approach, shown below, is an optimization of the above approach and creates the "__bike_reference" Python string object just once. While this looks more complex, it is just a small variation on the above typemap plus a support function bike_reference() in a fragment called bike_reference_function. The bike_reference_init typemap generates code into the "init" section for an initial call to bike_reference() when the module is initialized and is done to create the "__bike_reference" Python string singleton in a thread-safe manner.

    %fragment("bike_reference_init", "init") {
      // Thread-safe initialization - initialize during Python module initialization
      bike_reference();
    }
    
    %fragment("bike_reference_function", "header", fragment="bike_reference_init") {
    
    static PyObject *bike_reference() {
      static PyObject *bike_reference_string = SWIG_Python_str_FromChar("__bike_reference");
      return bike_reference_string;
    }
    
    }
    
    %extend Wheel {
    // A reference to the parent class is added to ensure the underlying C++
    // object is not deleted while the item is in use
    %typemap(ret, fragment="bike_reference_function") Wheel& getWheel %{
      PyObject_SetAttr($result, bike_reference(), $self);
    %}
    }
    

    32.10 Docstring Features

    Using docstrings in Python code is becoming more and more important and more tools are coming on the scene that take advantage of them, everything from full-blown documentation generators to class browsers and popup call-tips in Python-aware IDEs. Given the way that SWIG generates the proxy code by default, your users will normally get something like "function_name(*args)" in the popup calltip of their IDE which is next to useless when the real function prototype might be something like this:

    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    The features described in this section make it easy for you to add docstrings to your modules, functions and methods that can then be used by the various tools out there to make the programming experience of your users much simpler.

    32.10.1 Module docstring

    Python allows a docstring at the beginning of the .py file before any other statements, and it is typically used to give a general description of the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example
    

    When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus,
    layout of controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc
    

    32.10.2 %feature("autodoc")

    As alluded to above SWIG will generate all the function and method proxy wrappers with just "*args" (or "*args, **kwargs" if the -keyword option is used) for a parameter list and will then sort out the individual parameters in the C wrapper code. This is nice and simple for the wrapper code, but makes it difficult to be programmer and tool friendly as anyone looking at the .py file will not be able to find out anything about the parameters that the functions accept.

    But since SWIG does know everything about the function it is possible to generate a docstring containing the parameter types, names and default values. Since many of the docstring tools are adopting a standard of recognizing if the first thing in the docstring is a function prototype then using that instead of what they found from introspection, then life is good once more.

    SWIG's Python module provides support for the "autodoc" feature, which when attached to a node in the parse tree will cause a docstring to be generated that includes the name of the function, parameter names, default values if any, and return type if any. There are also four levels for autodoc controlled by the value given to the feature, %feature("autodoc", "level"). The four values for level are covered in the following sub-sections.

    32.10.2.1 %feature("autodoc", "0")

    When level "0" is used then the types of the parameters will not be included in the autodoc string. For example, given this function prototype:

    %feature("autodoc", "0");
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    Then Python code like this will be generated:

    def function_name(*args, **kwargs):
        """function_name(x, y, foo=None, bar=None) -> bool"""
        ...
    

    32.10.2.2 %feature("autodoc", "1")

    When level "1" is used then the parameter types will be used in the autodoc string. In addition, an attempt is made to simplify the type name such that it makes more sense to the Python user. Pointer, reference and const info is removed if the associated type is has an associated Python type (%rename's are thus shown correctly). This works most of the time, otherwise a C/C++ type will be used. See the next section for the "docstring" feature for tweaking the docstrings to your liking. Given the example above, then turning on the parameter types with level "1" will result in Python code like this:

    def function_name(*args, **kwargs):
        """function_name(int x, int y, Foo foo=None, Bar bar=None) -> bool"""
        ...
    

    32.10.2.3 %feature("autodoc", "2")

    Level "2" results in the function prototype as per level "0". In addition, a line of documentation is generated for each parameter using numpydoc style. Using the previous example, the generated code will be:

    def function_name(*args, **kwargs):
        """
        function_name(x, y, foo=None, bar=None) -> bool
    
        Parameters
        ----------
        x: int
        y: int
        foo: Foo *
        bar: Bar *
    
        """
        ...
    

    Note that the documentation for each parameter is sourced from the "doc" typemap which by default shows the C/C++ type rather than the simplified Python type name described earlier for level "1". Typemaps can of course change the output for any particular type, for example the int x parameter:

    %feature("autodoc", "2");
    %typemap("doc") int x "$1_name (C++ type: $1_type) -- Input $1_name dimension"
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    resulting in

    def function_name(*args, **kwargs):
        """
        function_name(x, y, foo=None, bar=None) -> bool
    
        Parameters
        ----------
        x (C++ type: int) -- Input x dimension
        y: int
        foo: Foo *
        bar: Bar *
    
        """
    

    32.10.2.4 %feature("autodoc", "3")

    Level "3" results in the function prototype as per level "1" but also contains the same additional line of documentation for each parameter as per level "2". Using our earlier example again, the generated code will be:

    def function_name(*args, **kwargs):
        """
        function_name(int x, int y, Foo foo=None, Bar bar=None) -> bool
    
        Parameters
        ----------
        x: int
        y: int
        foo: Foo *
        bar: Bar *
    
        """
        ...
    

    32.10.2.5 %feature("autodoc", "docstring")

    Finally, there are times when the automatically generated autodoc string will make no sense for a Python programmer, particularly when a typemap is involved. So if you give an explicit value for the autodoc feature then that string will be used in place of the automatically generated string. For example:

    %feature("autodoc", "GetPosition() -> (x, y)") GetPosition;
    void GetPosition(int* OUTPUT, int* OUTPUT);
    

    32.10.3 %feature("docstring")

    In addition to the autodoc strings described above, you can also attach any arbitrary descriptive text to a node in the parse tree with the "docstring" feature. When the proxy module is generated then any docstring associated with classes, function or methods are output. If an item already has an autodoc string then it is combined with the docstring and they are output together. If the docstring is all on a single line then it is output like this::

    """This is the docstring"""
    

    Otherwise, to aid readability it is output like this:

    """
    This is a multi-line docstring
    with more than one line.
    """
    

    32.11 Python Packages

    Python has concepts of modules and packages. Modules are separate units of code and may be grouped together to form a package. Packages may be nested, that is they may contain subpackages. This leads to tree-like hierarchy, with packages as intermediate nodes and modules as leaf nodes.

    The hierarchy of Python packages/modules follows the hierarchy of *.py files found in a source tree (or, more generally, in the Python path). Normally, the developer creates new module by placing a *.py file somewhere under Python path; the module is then named after that *.py file. A package is created by placing an __init__.py file within a directory; the package is then named after that directory. For example, the following source tree:

    mod1.py
    pkg1/__init__.py
    pkg1/mod2.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/mod3.py
    

    defines the following Python packages and modules:

    pkg1            # package
    pkg1.pkg2       # package
    mod1            # module
    pkg1.mod2       # module
    pkg1.pkg2.mod3  # module
    

    The purpose of an __init__.py file is two-fold. First, the existence of __init__.py in a directory informs the Python interpreter that this directory contains a Python package. Second, the code in __init__.py is loaded/executed automatically when the package is initialized (when it or its submodule/subpackage gets import'ed). By default, SWIG generates proxy Python code – one *.py file for each *.i interface. The __init__.py files, however, are not generated by SWIG. They should be created by other means. Both files (module *.py and __init__.py) should be installed in appropriate destination directories in order to obtain a desirable package/module hierarchy.

    Python3 adds another option for packages with PEP 0420 (implicit namespace packages). Implicit namespace packages no longer use __init__.py files. SWIG generated Python modules support implicit namespace packages. See Implicit namespace packages for more information.

    You can place a SWIG generated module into a Python package or keep as a global module, details are covered a little later in Location of modules.

    The way Python defines its modules and packages impacts SWIG users. Some users may need to use special features such as the package option in the %module directive or import related command line options. These are explained in the following sections.

    32.11.1 Setting the Python package

    Using the package option in the %module directive allows you to specify a Python package that the module will be in when installed.

    %module(package="wx") xrc
    

    This is useful when the .i file is %imported by another .i file. By default SWIG will assume that the importer is able to find the importee with just the module name, but if they live in separate Python packages then this won't work. However if the importee specifies what its package is with the %module option then the Python code generated for the importer will use that package name when importing the other module and in base class declarations, etc..

    SWIG assumes that the package option provided to %module together with the module name (that is, wx.xrc in the above example) forms a fully qualified (absolute) name of a module (in Python terms). This is important especially for Python 3, where absolute imports are used by default. It's up to you to place the generated module files (.py, .so) in appropriate subdirectories. For example, if you have an interface file foo.i with:

    %module(package="pkg1.pkg2") foo
    

    then the resulting directory layout should be

    pkg1/
    pkg1/__init__.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/foo.py        # (generated by SWIG)
    pkg1/pkg2/_foo.so       # (shared library built from C/C++ code generated by SWIG)
    

    32.11.2 Absolute and relative imports

    Suppose, we have the following hierarchy of files:

    pkg1/
    pkg1/__init__.py
    pkg1/mod2.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/mod3.py
    

    Let the contents of pkg1/pkg2/mod3.py be

    class M3: pass
    

    We edit pkg1/mod2.py and want to import module pkg1/pkg2/mod3.py in order to derive from class M3. We can write appropriate Python code in several ways, for example:

    1. Using "import <>" syntax with absolute package name:

      # pkg1/mod2.py
      import pkg1.pkg2.mod3
      class M2(pkg1.pkg2.mod3.M3): pass
      
    2. Using "import <>" syntax with package name relative to pkg1 (only in Python 2.7 and earlier):

      # pkg1/mod2.py
      import pkg2.mod3
      class M2(pkg2.mod3.M3): pass
      
    3. Using "from <> import <>" syntax (relative import syntax, only in Python 2.5 and later):

      # pkg1/mod2.py
      from .pkg2 import mod3
      class M2(mod3.M3): pass
      
    4. Other variants, for example the following construction in order to have the pkg2.mod3.M3 symbol available in mod2 as in point 2 above (but now under Python 3):

      # pkg1/mod2.py
      from . import pkg2
      from .pkg2 import mod3
      class M2(pkg2.mod3.M3): pass
      

    Now suppose we have mod2.i with

    // mod2.i
    %module (package="pkg1") mod2
    %import "mod3.i"
    // ...
    

    and mod3.i with

    // mod3.i
    %module (package="pkg1.pkg2") mod3
    // ...
    

    By default, SWIG will generate mod2.py proxy file with import directive as in point 1. This can be changed with the -relativeimport command line option. The -relativeimport instructs SWIG to organize imports as in point 4 for Python 2.7.0 and newer.

    Compatibility Note: Versions of SWIG prior to SWIG-4.0.0 supported Python < 2.7.0 and would organize the imports as in point 2 if an older version of Python was detected at runtime.

    In short, if you have mod2.i and mod3.i as above, then without -relativeimport SWIG will write

    import pkg1.pkg2.mod3
    

    to mod2.py proxy file, and with -relativeimport it will write

    from . import pkg2
    from .pkg2 import mod3
    

    You should avoid using relative imports and use absolute ones whenever possible. There are some cases, however, when relative imports may be necessary. The first example is, when some (legacy) Python code refers entities imported by proxy files generated by SWIG, and it assumes that the proxy file uses relative imports. Second case is, when one puts import directives in __init__.py to import symbols from submodules or subpackages and the submodule depends on other submodules (discussed later).

    32.11.3 Enforcing absolute import semantics

    As you may know, there is an incompatibility in import semantics (for the import <> syntax) between Python 2 and 3. In Python 2.4 and earlier it is not clear whether

    import foo
    

    refers to a top-level module or to another module inside the current package. In Python 3 it always refers to a top-level module (see PEP 328). To instruct Python 2.5 through 2.7 to use new semantics (that is import foo is interpreted as absolute import), one has to put the following line

    from __future__ import absolute_import
    

    at the very beginning of your proxy *.py file. In SWIG, it may be accomplished with %pythonbegin directive as follows:

    %pythonbegin %{
    from __future__ import absolute_import
    %}
    

    32.11.4 Importing from __init__.py

    Imports in __init__.py are handy when you want to populate a package's namespace with names imported from other modules. In SWIG based projects this approach may also be used to split large pieces of code into smaller modules, compile them in parallel and then re-assemble everything at runtime by importing submodules' contents in __init__.py, for example.

    Unfortunately import directives in __init__.py may cause problems, especially if they refer to a package's submodules. This is caused by the way Python initializes packages. If you spot problems with imports from __init__.py try using -relativeimport option. Below we explain in detail one issue, for which the -relativeimport workaround may be helpful.

    Consider the following example (Python 3):

    pkg1/__init__.py        # (empty)
    pkg1/pkg2/__init__.py   # (imports something from bar.py)
    pkg1/pkg2/foo.py
    pkg1/pkg2/bar.py        # (imports foo.py)
    

    If the file contents are:

    • pkg1/pkg2/__init__.py:

      # pkg1/pkg2/__init__.py
      from .bar import Bar
      
    • pkg1/pkg2/foo.py:

      # pkg1/pkg2/foo.py
      class Foo: pass
      
    • pkg1/pkg2/bar.py:

      # pkg1/pkg2/bar.py
      import pkg1.pkg2.foo
      class Bar(pkg1.pkg2.foo.Foo): pass
      

    Now if one simply used import pkg1.pkg2, it will usually fail:

    >>> import pkg1.pkg2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "./pkg1/pkg2/__init__.py", line 2, in <module>
        from .bar import Bar
      File "./pkg1/pkg2/bar.py", line 3, in <module>
        class Bar(pkg1.pkg2.foo.Foo): pass
    AttributeError: 'module' object has no attribute 'pkg2'
    

    Surprisingly, if we execute the import pkg1.pkg2 directive for the second time, it succeeds. The reason seems to be following: when Python spots the from .bar import Bar directive in pkg1/pkg2/__init__.py it starts loading pkg1/pkg2/bar.py. This module imports pkg1.pkg2.foo in turn and tries to use pkg1.pkg2.foo.Foo, but the package pkg1 is not fully initialized yet (the initialization procedure is actually in progress) and it seems like the effect of the already seen import pkg1.pkg2.pkg3.foo is "delayed" or ignored. Exactly the same may happen to a proxy module generated by SWIG.

    One workaround for this case is to use a relative import in pkg1/pkg2/bar.py. If we change bar.py to be:

    from .pkg3 import foo
    class Bar(foo.Foo): pass
    

    or

    from . import pkg3
    from .pkg3 import foo
    class Bar(pkg3.foo.Foo): pass
    

    then the example works again. With SWIG, you need to enable the -relativeimport option in order to have the above workaround in effect (note, that the Python 2 case also needs the -relativeimport workaround).

    32.11.5 Implicit namespace packages

    Python 3.3 introduced PEP 0420 which implements implicit namespace packages. In a nutshell, implicit namespace packages remove the requirement of an __init__.py file and allow packages to be split across multiple PATH elements. For example:

    /fragment1/pkg1/mod1.py
    /fragment2/pkg1/mod2.py
    /fragment3/pkg1/mod3.py
    

    If PYTHONPATH is set to "/fragment1:/fragment2:/fragment3", then mod1, mod2 and mod3 will be part of pkg1. This allows for splitting of packages into separate pieces. This can be useful for SWIG generated wrappers in the following way.

    Suppose you create a SWIG wrapper for a module called robin. The SWIG generated code consists of two files robin.py and _robin.so. You wish to make these modules part of a subpackage (brave.sir). With implicit namespace packages you can place these files in the following configurations:

    Using PYTHONPATH="/some/path"

    /some/path/brave/sir/robin.py
    /some/path/brave/sir/_robin.so
    

    Using PYTHONPATH="/some/path:/some/other/path"

    /some/path/brave/sir/robin.py
    /some/other/path/brave/sir/_robin.so
    

    Finally suppose that your pure Python code is stored in a .zip file or some other way (database, web service connection, etc). Python can load the robin.py module using a custom importer. But the _robin.so module will need to be located on a file system. Implicit namespace packages make this possible. For example, using PYTHONPATH="/some/path/foo.zip:/some/other/path"

    Contents of foo.zip

    brave/
    brave/sir/
    brave/sir/robin.py
    

    File system contents

    /some/other/path/brave/sir/_robin.so
    

    Support for implicit namespace packages was added to python-3.3. The zipimporter requires python-3.5.1 or newer to work with subpackages.

    Compatibility Note: Support for implicit namespace packages was added in SWIG-3.0.9.

    32.11.6 Location of modules

    When SWIG creates wrappers from an interface file, say foo.i, two Python modules are created. There is a pure Python module (foo.py) and C/C++ code which is compiled and linked into a dynamically (or statically) loaded low-level module _foo (see the Preliminaries section for details). So, the interface file really defines two Python modules. How these two modules are loaded is covered next.

    The pure Python module needs to load the C/C++ module in order to call the wrapped C/C++ methods. To do this it must make some assumptions about the location of the C/C++ module. There are two configurations that are supported by default.

    1. Both modules in the same package

    2. Both modules are global

    Additional configurations are supported but require custom import code.

    The following sub-sections look more closely at the two default configurations as well as some customized configurations. An input interface file, foo.i, results in the two modules foo.py and _foo.so for each of the configurations.

    32.11.6.1 Both modules in the same package

    In this configuration, the pure Python module, foo.py, tries to load the C/C++ module, _foo, from the same package foo.py is located in. The package name is determined from the __package__ attribute if available, see PEP 366. Otherwise it is derived from the __name__ attribute given to foo.py by the Python loader that imported foo.py. The interface file for this configuration would contain:

    %module(package="mypackage") foo
    

    The location of the files could be as follows:

    /dir/mypackage/foo.py
    /dir/mypackage/__init__.py
    /dir/mypackage/_foo.so
    

    Assuming /dir/ is in PYTHONPATH, the module can be imported using

    from mypackage import foo
    

    32.11.6.2 Both modules are global

    In this configuration, there are no packages. If foo.py is not in a package, that is, it is a global module, then _foo is loaded as a global module. The interface file for this configuration would contain:

    %module foo
    

    The location of the files could be as follows:

    /dir/foo.py
    /dir/_foo.so
    

    Assuming /dir/ is in PYTHONPATH, the module can be imported using

    import foo
    

    32.11.6.3 Split modules custom configuration

    In this non-standard 'split module' configuration, the pure Python module is in a package and the low level C/C++ module is global. This configuration is not generally recommended and is not supported by default as it needs a custom configuration. The module import code customization required is via the moduleimport attribute in the %module directive. The next sub-section elaborates further on this. The interface file for this split module configuration would contain:

    %module(package="mypackage", moduleimport="import _foo") foo
    

    When using -builtin, use the following instead (the reasons are also covered shortly in the next sub-section):

    %module(package="mypackage", moduleimport="from _foo import *") foo
    

    The location of the files could be as follows:

    /dir/mypackage/foo.py
    /dir/mypackage/__init__.py
    /dir/_foo.so
    

    Assuming /dir/ is in PYTHONPATH, the module can be imported using

    from mypackage import foo
    

    Compatibility Note: Versions of SWIG prior to SWIG-4.0.0 supported split modules without the above customization. However, this had to be removed as the default import code often led to confusion due to obfuscation of genuine Python ImportError problems. Using one of the two default configurations is the recommended approach now.

    32.11.6.4 More on customizing the module import code

    The Python code implementing the default import logic is shown below. It supports the two configurations described earlier, that is, either both modules are in a package or loading both as global modules. The code is generated into the pure Python module, foo.py, and merely imports the low-level _foo module.

    if __package__ or '.' in __name__:
        from . import _foo
    else:
        import _foo
    

    This import code implementation is non-trivial but it can be replaced with custom code providing opportunities to make it simpler and/or more flexible. This is not normally recommended though unless you have a good understanding of the intricacies of importing Python modules. The custom code can be specified by setting the moduleimport option of the %module directive with the appropriate import code. For example:

    %module(moduleimport="import _foo") foo
    

    This will replace the default import logic above and generate the following into the pure Python module, foo.py:

    import _foo
    

    In fact the above is a simplification customization for the configuration where both modules are global; it removes the logic for also handling the modules being in a package.

    There is a special variable, $module, which is expanded into the low-level C/C++ module name, _foo in the case above. The identical output would be generated if instead the following had been used:

    %module(moduleimport="import $module") foo
    

    When you have many lines you can retain the easy readability of the %module directive by using a macro. For example:

    %define MODULEIMPORT
    "
    print 'Loading low-level module $module'
    import $module
    print 'Module has loaded'
    "
    %enddef
    
    %module(moduleimport=MODULEIMPORT) foo
    

    This will of course generate the following into the pure Python module:

    print 'Loading low-level module $module'
    import _foo
    print 'Module has loaded'
    

    When using the -builtin option, the link between the pure Python module and the low-level C/C++ module is slightly different as all the objects from the low-level module are imported directly into the pure Python module. The default import loading code is thus different:

    if __package__ or '.' in __name__:
        from ._foo import *
    else:
        from _foo import *
    

    Any customizations must import the code in a similar manner. The best way to support both with and without -builtin is to make use of the SWIGPYTHON_BUILTIN macro which is defined when -builtin is specified. The following will do this for the split modules case above.

    #if defined(SWIGPYTHON_BUILTIN) /* defined when using -builtin */
    %module(package="mypackage", moduleimport="from $module import *") foo
    #else
    %module(package="mypackage", moduleimport="import $module") foo
    #endif
    

    32.11.6.5 Statically linked C modules

    It is strongly recommended to use dynamically linked modules for the C portion of your pair of Python modules. If for some reason you still need to link the C module of the pair of Python modules generated by SWIG into your interpreter, then this section provides some details on how this impacts the pure Python modules ability to locate the other part of the pair. Please also see the Static Linking section.

    When Python is extended with C code the Python interpreter needs to be informed about details of the new C functions that have been linked into the executable. The code to do this is created by SWIG and is automatically called in the correct way when the module is dynamically loaded. However when the code is not dynamically loaded (because it is statically linked) Then the initialization method for the module created by SWIG is not called automatically and the Python interpreter has no idea that the new SWIG C module exists.

    Before Python 3, one could simply call the init method created by SWIG which would have normally been called when the shared object was dynamically loaded. The specific name of this method is not given here because statically linked modules are not encouraged with SWIG ( Static Linking). However one can find this init function in the C file generated by SWIG.

    If you are really keen on static linking there are two ways to initialize the SWIG generated C module with the init method. Which way you use depends on what version of Python your module is being linked with. Python 2 and Python 3 treat this init function differently. And the way they treat it affects how the pure Python module will be able to locate the C module.

    The details concerning this are covered completely in the documentation for Python itself. Links to the relevant sections follow:

    There are two keys things to understand. The first is that in Python 2 the init() function returns void. In Python 3 the init() function returns a PyObject * which points to the new module. Secondly, when you call the init() method manually, you are the Python importer. So, you determine which package the C module will be located in.

    So, if you are using Python 3 it is important that you follow what is described in the Python documentation linked above. In particular, you can't simply call the init() function generated by SWIG and cast the PyObject pointer it returns over the side. If you do then Python 3 will have no idea that your C module exists and the pure Python half of your wrapper will not be able to find it. You need to register your module with the Python interpreter as described in the Python docs.

    With Python 2 things are somewhat more simple. In this case the init() function returns void. Calling it will register your new C module as a global module. The pure Python part of the SWIG wrapper will be able to find it because it tries both the pure Python module it is part of and the global module. If you wish not to have the statically linked module be a global module then you will either need to refer to the Python documentation on how to do this (remember you are now the Python importer) or use dynamic linking.

    32.12 Python 3 Support

    SWIG is able to support Python 3.x. The wrapper code generated by SWIG can be compiled with both Python 2.x or 3.x. Further more, by passing the -py3 command line option to SWIG, wrapper code with some Python 3 specific features can be generated (see below subsections for details of these features).

    There is a list of known-to-be-broken features in Python 3:

    • No more support for FILE* typemaps, because PyFile_AsFile has been dropped in Python 3.
    • The -apply command line option is removed and generating code using apply() is no longer supported.

    The following are Python 3 new features that are currently supported by SWIG.

    32.12.1 Function annotation

    The -py3 option will enable function annotation support. When used SWIG is able to generate proxy method definitions like this:

      def foo(self, bar : "int"=0) -> "void" : ...
    

    Also, even if without passing SWIG the -py3 option, the parameter list still could be generated:

      def foo(self, bar=0): ...
    

    But for overloaded function or method, the parameter list would fallback to *args or self, *args, and **kwargs may be append depend on whether you enabled the keyword argument. This fallback is due to all overloaded functions share the same function in SWIG generated proxy class.

    For detailed usage of function annotation, see PEP 3107.

    32.12.2 Buffer interface

    SWIG has a series of typemaps to support buffer interfaces. These typemap macros are defined in pybuffer.i, which must be included in order to use them. By using these typemaps, your wrapped function will be able to accept any Python object that exposes a suitable buffer interface.

    For example, the get_path() function puts the path string into the memory pointed to by its argument:

    void get_path(char *s);
    

    Then you can write a typemap like this: (the following example is applied to both Python 2 and 3, since the bytearray type was backported to 2.6.

    %include <pybuffer.i>
    %pybuffer_mutable_string(char *str);
    void get_path(char *str);
    

    And then on the Python side the wrapped get_path could be used in this way:

    >>> p = bytearray(10)
    >>> get_path(p)
    >>> print(p)
    bytearray(b'/Foo/Bar/\x00')
    

    The macros defined in pybuffer.i are similar to those in cstring.i:

    %pybuffer_mutable_binary(parm, size_parm)

    The macro can be used to generate a typemap which maps a buffer of an object to a pointer provided by parm and a size argument provided by size_parm. For example:

    %pybuffer_mutable_binary(char *str, size_t size);
    ...
    int snprintf(char *str, size_t size, const char *format, ...);
    

    In Python:

    >>> buf = bytearray(6)
    >>> snprintf(buf, "Hello world!")
    >>> print(buf)
    bytearray(b'Hello\x00')
    >>>
    

    %pybuffer_mutable_string(parm)

    This typemap macro requires the buffer to be a zero terminated string, and maps the pointer of the buffer to parm. For example:

    %pybuffer_mutable_string(char *str);
    ...
    size_t make_upper(char *str);
    

    In Python:

    >>> buf = bytearray(b'foo\x00')
    >>> make_upper(buf)
    >>> print(buf)
    bytearray(b'FOO\x00')
    >>>
    

    Both %pybuffer_mutable_binary and %pybuffer_mutable_string require the provided buffer to be mutable, eg. they can accept a bytearray type but can't accept an immutable byte type.

    %pybuffer_binary(parm, size_parm)

    This macro maps an object's buffer to a pointer parm and a size size_parm. It is similar to %pybuffer_mutable_binary , except the %pybuffer_binary can accept both mutable and immutable buffers. As a result, the wrapped function should not modify the buffer.

    %pybuffer_string(parm)

    This macro maps an object's buffer as a string pointer parm . It is similar to %pybuffer_mutable_string but the buffer could be both mutable and immutable. And your function should not modify the buffer.

    32.12.3 Abstract base classes

    By including pyabc.i and using the -py3 command line option when calling SWIG, the proxy classes of the STL containers will automatically gain an appropriate abstract base class from the collections.abc module. For example, the following SWIG interface:

    %include <pyabc.i>
    %include <std_map.i>
    %include <std_list.i>
    
    namespace std {
      %template(Mapii) map<int, int>;
      %template(IntList) list<int>;
    }
    

    will generate a Python proxy class Mapii inheriting from collections.abc.MutableMap and a proxy class IntList inheriting from collections.abc.MutableSequence.

    pyabc.i also provides a macro %pythonabc that could be used to define an abstract base class for your own C++ class:

    %pythonabc(MySet, collections.abc.MutableSet);
    

    For details of abstract base class, please see PEP 3119.

    Compatibility Note: SWIG-4.0.0 changed the base classes to use the collections.abc module instead of collections due to the deprecation of the classes in the collections module in Python 3.7. The collections.abc module was introduced in Python 3.3 and hence this feature requires Python 3.3 or later.

    32.12.4 Byte string output conversion

    By default, any byte string (char* or std::string) returned from C or C++ code is decoded to text as UTF-8. This decoding uses the surrogateescape error handler under Python 3.1 or higher -- this error handler decodes invalid byte sequences to high surrogate characters in the range U+DC80 to U+DCFF. As an example, consider the following SWIG interface, which exposes a byte string that cannot be completely decoded as UTF-8:

    %module example
    
    %inline %{
    
    const char * non_utf8_c_str(void) {
      return "h\xe9llo w\xc3\xb6rld";
    }
    
    void instring(const char *s) {
      ...
    }
    
    %}
    

    Note that "\xe9" is an invalid UTF-8 encoding, but "\xc3\xb6" is valid. When this method is called from Python 3, the return value is the following text string:

    >>> s = example.non_utf8_c_str()
    >>> s
    'h\udce9llo wörld'
    

    Since the C string contains bytes that cannot be decoded as UTF-8, those raw bytes are represented as high surrogate characters that can be used to obtain the original byte sequence:

    >>> b = s.encode('utf-8', errors='surrogateescape')
    >>> b
    b'h\xe9llo w\xc3\xb6rld'
    

    One can then attempt a different encoding, if desired (or simply leave the byte string as a raw sequence of bytes for use in binary protocols):

    >>> b.decode('latin-1')
    'héllo wörld'
    

    Note, however, that text strings containing surrogate characters are rejected with the default strict codec error handler. For example:

    >>> with open('test', 'w') as f:
    ...     print(s, file=f)
    ...
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    UnicodeEncodeError: 'utf-8' codec can't encode character '\udce9' in position 1: surrogates not allowed
    

    This requires the user to check most strings returned by SWIG bindings, but the alternative is for a non-UTF8 byte string to be completely inaccessible in Python 3 code.

    For more details about the surrogateescape error handler, please see PEP 383 .

    When Python 3 strings are passed to the C/C++ layer, they are expected to be valid UTF8 Unicode strings too. For example, when the instring method above is wrapped and called, any invalid UTF8 Unicode code strings will result in a TypeError because the attempted conversion fails:

    >>> example.instring('h\xe9llo')
    >>> example.instring('h\udce9llo')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: in method 'instring', argument 1 of type 'char const *'
    

    In some cases, users may wish to instead handle all byte strings as bytes objects in Python 3. This can be accomplished by adding SWIG_PYTHON_STRICT_BYTE_CHAR to the generated code:

    %module char_to_bytes
    %begin %{
    #define SWIG_PYTHON_STRICT_BYTE_CHAR
    %}
    
    char *charstring(char *s) {
      return s;
    }
    

    This will modify the behavior so that only Python 3 bytes objects will be accepted and converted to a C/C++ string, and any string returned from C/C++ will be converted to a bytes object in Python 3:

    >>> from char_to_bytes import *
    >>> charstring(b"hi") # Byte string
    b'hi'
    >>> charstring("hi")  # Unicode string
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'char *'
    

    Note that in Python 2, defining SWIG_PYTHON_STRICT_BYTE_CHAR has no effect, since strings in Python 2 are equivalent to Python 3 bytes objects. However, there is a similar capability to force unicode-only handling for wide characters C/C++ strings (wchar_t * or std::wstring types) in Python 2. By default, in Python 2 both strings and unicode strings are converted to C/C++ wide strings, and returned wide strings are converted to a Python unicode string. To instead only convert unicode strings to wide strings, users can add SWIG_PYTHON_STRICT_UNICODE_WCHAR to the generated code:

    %module wchar_to_unicode
    %begin %{
    #define SWIG_PYTHON_STRICT_UNICODE_WCHAR
    %}
    
    wchar_t *wcharstring(wchar_t *s) {
      return s;
    }
    

    This ensures that only unicode strings are accepted by wcharstring in both Python 2 and Python 3:

    >>> from wchar_to_unicode import *
    >>> wcharstring(u"hi") # Unicode string
    u'hi'
    >>> wcharstring(b"hi") # Byte string
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'wchar_t *'
    

    By defining both SWIG_PYTHON_STRICT_BYTE_CHAR and SWIG_PYTHON_STRICT_UNICODE_WCHAR, Python wrapper code can support overloads taking both std::string (as Python bytes) and std::wstring (as Python unicode).

    32.12.5 Python 2 Unicode

    A Python 3 string is a Unicode string so by default a Python 3 string that contains Unicode characters passed to C/C++ will be accepted and converted to a C/C++ string (char * or std::string types). A Python 2 string is not a unicode string by default and should a Unicode string be passed to C/C++ it will fail to convert to a C/C++ string (char * or std::string types). The Python 2 behavior can be made more like Python 3 by defining SWIG_PYTHON_2_UNICODE when compiling the generated C/C++ code. By default when the following is wrapped:

    %module unicode_strings
    char *charstring(char *s) {
      return s;
    }
    

    An error will occur when using Unicode strings in Python 2:

    >>> from unicode_strings import *
    >>> charstring("hi")
    'hi'
    >>> charstring(u"hi")
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'char *'
    

    When the SWIG_PYTHON_2_UNICODE macro is added to the generated code:

    %module unicode_strings
    %begin %{
    #define SWIG_PYTHON_2_UNICODE
    %}
    
    char *charstring(char *s) {
      return s;
    }
    

    Unicode strings will be successfully accepted and converted from UTF-8, but note that they are returned as a normal Python 2 string:

    >>> from unicode_strings import *
    >>> charstring("hi")
    'hi'
    >>> charstring(u"hi")
    'hi'
    >>>
    

    Note that defining both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at the same time is not allowed, since the first is allowing unicode conversion and the second is explicitly prohibiting it.

    32.13 Support for Multithreaded Applications

    By default, SWIG does not enable support for multithreaded Python applications. More specifically, the Python wrappers generated by SWIG will not release the Python's interpreter's Global Interpreter Lock (GIL) when wrapped C/C++ code is entered. Hence, while any of the wrapped C/C++ code is executing, the Python interpreter will not be able to run any other threads, even if the wrapped C/C++ code is waiting in a blocking call for something like network or disk IO. Fortunately, SWIG does have the ability to enable multithreaded support and automatic release of the GIL either for all wrapped code in a module or on a more selective basis. The user interface for this is described in the next section.

    32.13.1 UI for Enabling Multithreading Support

    The user interface is as follows:

    1. Module thread support can be enabled in two ways:

      • The -threads SWIG Python option at the command line (or in setup.py):

        $ swig -python -threads example.i
      • The threads module option in the *.i template file:

        %module("threads"=1)
    2. You can disable thread support for a given method:

      %feature("nothread") method;
      or
      %nothread method;
    3. You can partially disable thread support for a given method:

      • To disable the C++/Python thread protection:

        %feature("nothreadblock") method;
        or
        %nothreadblock method;
      • To disable the Python/C++ thread protection

        %feature("nothreadallow") method;
        or
        %nothreadallow method;

    32.13.2 Multithread Performance

    For the curious about performance, here are some numbers for the profiletest.i test, which is used to check the speed of the wrapped code:

    Thread ModeExecution Time (sec)Comment
    Single Threaded9.6no "-threads" option given
    Fully Multithreaded15.5"-threads" option = 'allow' + 'block'
    No Thread block12.2only 'allow'
    No Thread Allow13.6only block'

    Fully threaded code decreases the wrapping performance by around 60%. If that is important to your application, you can tune each method using the different 'nothread', 'nothreadblock' or 'nothreadallow' features as needed. Note that for some methods deactivating the 'thread block' or 'thread allow' code is not an option, so, be careful.


    33 SWIG and R

    R is a GPL'ed open source statistical and plotting environment. Information about R can be found at www.r-project.org.

    The R bindings are under active development. They have been used to compile and run an R interface to QuantLib running on Mandriva Linux with gcc. They are also used to create the SimpleITK R package, which runs on Linux and MacOS. SWIG is used to create all wrapper interfaces to SimpleITK. The R bindings also work on Microsoft Windows using Visual C++.

    33.1 Bugs

    Currently the following features are not implemented or broken:

    • Garbage collection of some created objects. Finalizers are available for wrapped C++ classes and are called by the garbage collection system.
    • C Array wrappings

    33.2 Using R and SWIG

    To use R and SWIG in C mode, execute the following commands where example.c is the name of the file with the functions in them

    swig -r example.i
    R CMD SHLIB example_wrap.c example.c
    

    The corresponding options for C++ mode are

    swig -c++ -r -o example_wrap.cpp example.i
    R CMD SHLIB example_wrap.cpp example.cpp
    

    Note that R is sensitive to the names of the files. The name of the wrapper file must be the name of the library unless you use the -o option to R when building the library, for example:

    swig -c++ -r -o example_wrap.cpp example.i
    R CMD SHLIB -o example.so example_wrap.cpp example.cpp
    

    R is also sensitive to the name of the file extension in C and C++ mode. In C++ mode, the file extension must be .cpp rather than .cxx for the R compile command to recognize it. If your C++ code is in a file using something other than a .cpp extension, then it may still work using PKG_LIBS:

    swig -c++ -r -o example_wrap.cpp example.i
    PKG_LIBS="example.cxx" R CMD SHLIB -o example example_wrap.cpp
    

    The commands produces two files. A dynamic shared object file called example.so, or example.dll, and an R wrapper file called example.R. To load these files, start up R and type in the following commands

    dyn.load(paste("example", .Platform$dynlib.ext, sep=""))
    source("example.R")
    cacheMetaData(1)
    

    The cacheMetaData(1) will cause R to refresh its object tables. Without it, inheritance of wrapped objects may fail. These two files can be loaded in any order.

    If you are compiling code yourself (not using R itself), there are a few things to watch out for:

    • The output shared library name (to the left of the file extension) MUST match the module name, or alternatively, you can also set the -package NAME command line argument. See swig -r -help for more information
    • If you do not set the output file name appropriately, you might see errors like
      > fact(4)
      Error in .Call("R_swig_fact", s_arg1, as.logical(.copy), PACKAGE = "example") :
        "R_swig_fact" not available for .Call() for package "example"
      
    • Make sure the architecture of the shared library(x64 for instance), matches the architecture of the R program you want to load your shared library into

    33.3 Precompiling large R files

    In cases where the R file is large, one make save a lot of loading time by precompiling the R wrapper. This can be done by creating the file makeRData.R which contains the following

    source('BigFile.R')
    save(list=ls(all=TRUE), file="BigFile.RData", compress=TRUE)
    q(save="no")
    

    This will generate a compiled R file called BigFile.RData that will save a large amount of loading time.

    There is no need to precompile large R files if the SWIG-generated code is being included in an R package. The package infrastructure provides this service during package installation.

    33.4 General policy

    The general policy of the module is to treat the C/C++ as a basic wrapping over the underlying functions and rely on the R type system to provide R syntax.

    33.5 Language conventions

    getitem and setitem use C++ conventions (i.e. zero based indices). [<- and [ are overloaded to allow for R syntax (one based indices and slices)

    33.6 C++ classes

    Wrapping of C++ classes for R works quite well. R has a special type, known as an external reference, that can be used as a pointer to arbitary things, including C++ classes. The proxy layers generated for other classes are not required.

    SWIG currently creates a custom hierarchy of R classes derived from the external reference type and implements type checking and function overloading in the R code it generates. In the future we hope to utilise the built in R6 class structures.

    The R interface has the following capabilities:

    • Destructor methods are registered and called automatically by the R garbage collector.
    • A range of std::vector types are converted automatically to R equivalents via the std_vector.i library.
    • The $ operator is used for method access.
    • Variable accessors are automatically generated and called via the $, [, [[, $<-, [<-, [[<- operators.

    33.6.1 Examples

    Consider the following simple example:

    class Vehicle {
    private:
      int m_axles;
    
    public:
      int Axles() {
        return(m_axles);
      }
    
      bool Available;
    
      Vehicle() {
        Available=false;
        m_axles=2;
      }
    
      Vehicle(int ax) {
        Available=false;
        m_axles=ax;
      }
    };
    

    The following options are available in R:

    v1 <- Vehicle()
    v2 <- Vehicle(4)
    # access members
    v1$Axles()
    [1] 2
    v2$Axles
    [1] 4
    v1$Available
    [1] FALSE
    # Set availabilty
    v1$Available <- TRUE
    v1$Available
    [1] TRUE
    

    A useful trick to determine the methods that are available is to query the R method definition as follows:

    # display the methods for the class
    getMethod("$", class(v1))
        
    Method Definition:
    
    function (x, name) 
    {
        accessorFuns = list(Axles = Vehicle_Axles, Available = Vehicle_Available_get)
        vaccessors = c("Available")
        idx = pmatch(name, names(accessorFuns))
        if (is.na(idx)) 
            return(callNextMethod(x, name))
        f = accessorFuns[[idx]]
        if (is.na(match(name, vaccessors))) 
            function(...) {
                f(x, ...)
            }
        else f(x)
    }
    
    Signatures:
            x           
    target  "_p_Vehicle"
    defined "_p_Vehicle"
    
    

    The names in the accessorFuns list correspond to class methods while names in the vaccessors section correspond to variables that may be modified.

    33.7 Enumerations

    R doesn't have a native enumeration type. Enumerations are represented as character strings in R, with calls to R functions that convert back and forth between integers.

    The details of enumeration names and contents are stored in hidden R environments, which are named according the the enumeration name - for example, an enumeration colour:

    enum colour { red=-1, blue, green = 10 };
    

    will be initialized by the following call in R:

    defineEnumeration("_colour",
     .values=c("red" = .Call('R_swig_colour_red_get',FALSE, PACKAGE='enum_thorough'),
    "blue" = .Call('R_swig_colour_blue_get',FALSE, PACKAGE='enum_thorough'),
    "green" = .Call('R_swig_colour_green_get',FALSE, PACKAGE='enum_thorough')))
    

    which will create an environment named .__E___colour. The enumeration values are initialised via calls to C/C++ code, allowing complex values for enumerations to be used. Calls to the C/C++ code require the compiled library to be loaded, so a delayedAssign is employed within defineEnumeration in order to allow the code to be easily used in R packages.

    The user typically does not need to access the enumeration lookup functions or know the name of the enumeration type used by R. Attributes containing the type information are attached by swig to functions requiring enumeration arguments or returning enumeration values, and those attributes are used to identify and access the appropriate environments and thus translate between characters and integers.

    The relevant functions, for debugging purposes, are enumToInteger and enumFromInteger.

    Anonymous enumerations are ignored by the binding generation process, leaving no way of accessing the value of anonymous enumerations from R code.


    34 SWIG and Ruby

    This chapter describes SWIG's support of Ruby.

    34.1 Preliminaries

    SWIG 4.0 is known to work with Ruby versions 1.9 and later. Given the choice, you should use the latest stable version of Ruby. You should also determine if your system supports shared libraries and dynamic loading. SWIG will work with or without dynamic loading, but the compilation process will vary.

    This chapter covers most SWIG features, but in less depth than is found in earlier chapters. At the very least, make sure you also read the "SWIG Basics" chapter. It is also assumed that the reader has a basic understanding of Ruby.

    34.1.1 Running SWIG

    To build a Ruby module, run SWIG using the -ruby option:

    $ swig -ruby example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -ruby example.i
    

    This creates a file example_wrap.c (example_wrap.cxx if compiling a C++ extension) that contains all of the code needed to build a Ruby extension module. To finish building the module, you need to compile this file and link it with the rest of your program.

    34.1.2 Getting the right header files

    In order to compile the wrapper code, the compiler needs the ruby.h header file and its dependencies, notably ruby/config.h which is found in a different, architecture-dependent, directory. The best way to find the compiler options needed to compile the code is to ask Ruby itself:

    $ ruby -rrbconfig -e 'puts "-I#{RbConfig::CONFIG[%q{rubyhdrdir}]} -I#{RbConfig::CONFIG[%q{rubyarchhdrdir}]}"'
    -I/usr/include/ruby-2.1.0 -I/usr/include/x86_64-linux-gnu/ruby-2.1.0
    

    34.1.3 Compiling a dynamic module

    Ruby extension modules are typically compiled into shared libraries that the interpreter loads dynamically at runtime. Since the exact commands for doing this vary from platform to platform, your best bet is to follow the steps described in the README.EXT file from the Ruby distribution:

    1. Create a file called extconf.rb that looks like the following:

      require 'mkmf'
      create_makefile('example')
    2. Type the following to build the extension:

      $ ruby extconf.rb
      $ make
      $ make install
          

    Of course, there is the problem that mkmf does not work correctly on all platforms, e.g, HPUX. If you need to add your own make rules to the file that extconf.rb produces, you can add this:

    open("Makefile", "a") { |mf|
     puts <<EOM
     # Your make rules go here
     EOM
    }
    

    to the end of the extconf.rb file. If for some reason you don't want to use the standard approach, you'll need to determine the correct compiler and linker flags for your build platform. For example, assuming you have code you need to link to in a file called example.c, a typical sequence of commands for the Linux operating system would look something like this:

    $ swig -ruby example.i
    $ gcc -O2 -fPIC -c example.c
    $ gcc -O2 -fPIC -c example_wrap.c -I/usr/include/ruby-2.1.0
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The -fPIC option tells GCC to generate position-independent code (PIC) which is required for most architectures (it's not vital on x86, but still a good idea as it allows code pages from the library to be shared between processes). Other compilers may need a different option specified instead of -fPIC.

    If in doubt, consult the manual pages for your compiler and linker to determine the correct set of options. You might also check the SWIG Wiki for additional information.

    34.1.4 Using your module

    Ruby module names must be capitalized, but the convention for Ruby feature names is to use lowercase names. So, for example, the Etc extension module is imported by requiring the etc feature:

    # The feature name begins with a lowercase letter...
    require 'etc'
    
    # ... but the module name begins with an uppercase letter
    puts "Your login name: #{Etc.getlogin}"
    

    To stay consistent with this practice, you should always specify a lowercase module name with SWIG's %module directive. SWIG will automatically correct the resulting Ruby module name for your extension. So for example, a SWIG interface file that begins with:

    %module example

    will result in an extension module using the feature name "example" and Ruby module name "Example".

    34.1.5 Static linking

    An alternative approach to dynamic linking is to rebuild the Ruby interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Ruby involves finding the Ruby source, adding an entry to the ext/Setup file, adding your directory to the list of extensions in the file, and finally rebuilding Ruby.

    34.1.6 Compilation of C++ extensions

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -ruby example.i
    $ g++ -fPIC -c example.cxx
    $ g++ -fPIC -c example_wrap.cxx -I/usr/include/ruby-2.1.0
    $ g++ -shared example.o example_wrap.o -o example.so
    

    If you've written an extconf.rb script to automatically generate a Makefile for your C++ extension module, keep in mind that (as of this writing) Ruby still uses gcc and not g++ as its linker. As a result, the required C++ runtime library support will not be automatically linked into your extension module and it may fail to load on some platforms. A workaround for this problem is use the mkmf module's append_library() method to add one of the C++ runtime libraries to the list of libraries linked into your extension, e.g.

    require 'mkmf'
    $libs = append_library($libs, "supc++")
    create_makefile('example')

    34.2 Building Ruby Extensions under Windows 95/NT

    Building a SWIG extension to Ruby under Windows 95/NT is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into the Ruby interpreter. For all recent versions of Ruby, the procedure described above (i.e. using an extconf.rb script) will work with Windows as well; you should be able to build your code into a DLL by typing:

    C:\swigtest> ruby extconf.rb
    C:\swigtest> nmake
    C:\swigtest> nmake install
    

    The remainder of this section covers the process of compiling SWIG-generated Ruby extensions with Microsoft Visual C++ 6 (i.e. within the Developer Studio IDE, instead of using the command line tools). In order to build extensions, you may need to download the source distribution to the Ruby package, as you will need the Ruby header files.

    34.2.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly follows these steps :

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (i.e. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer Studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -ruby -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field". You may have to include the path to swig.exe.
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to the C/C++ tab and select the Preprocessor category. Add NT=1 to the Preprocessor definitions. This must be set else you will get compilation errors. Also add IMPORT to the preprocessor definitions, else you may get runtime errors. Also add the include directories for your Ruby installation under "Additional include directories".
    • Next, select the settings for the entire project and go to the Link tab and select the General category. Set the name of the output file to match the name of your Ruby module (i.e.. example.dll). Next add the Ruby library file to your link libraries under Object/Library modules. For example "mswin32-ruby16.lib. You also need to add the path to the library under the Input tab - Additional library path.
    • Build your project.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Ruby extension, simply run Ruby and use the require command as normal. For example if you have this ruby file run.rb:

    # file: run.rb
    require 'Example'
    
    # Call a c function
    print "Foo = ", Example.Foo, "\n"

    Ensure the dll just built is in your path or current directory, then run the Ruby script from the DOS/Command prompt:

    C:\swigtest> ruby run.rb
    Foo = 3.0
    

    34.3 The Ruby-to-C/C++ Mapping

    This section describes the basics of how SWIG maps C or C++ declarations in your SWIG interface files to Ruby constructs.

    34.3.1 Modules

    The SWIG %module directive specifies the name of the Ruby module. If you specify:

    %module example

    then everything is wrapped into a Ruby module named Example that is nested directly under the global module. You can specify a more deeply nested module by specifying the fully-qualified module name in quotes, e.g.

    %module "foo::bar::spam"

    An alternate method of specifying a nested module name is to use the -prefix option on the SWIG command line. The prefix that you specify with this option will be prepended to the module name specified with the %module directive in your SWIG interface file. So for example, this declaration at the top of your SWIG interface file:

    %module "foo::bar::spam"

    will result in a nested module name of Foo::Bar::Spam, but you can achieve the same effect by specifying:

    %module spam

    and then running SWIG with the -prefix command line option:

    $ swig -ruby -prefix "foo::bar::" example.i
    

    Starting with SWIG 1.3.20, you can also choose to wrap everything into the global module by specifying the -globalmodule option on the SWIG command line, i.e.

    $ swig -ruby -globalmodule example.i
    

    Note that this does not relieve you of the requirement of specifying the SWIG module name with the %module directive (or the -module command-line option) as described earlier.

    When choosing a module name, do not use the same name as a built-in Ruby command or standard module name, as the results may be unpredictable. Similarly, if you're using the -globalmodule option to wrap everything into the global module, take care that the names of your constants, classes and methods don't conflict with any of Ruby's built-in names.

    34.3.2 Functions

    Global functions are wrapped as Ruby module methods. For example, given the SWIG interface file example.i:

    %module example
    
    int fact(int n);

    and C source file example.c:

    int fact(int n) {
      if (n == 0)
      return 1;
      return (n * fact(n-1));
    }

    SWIG will generate a method fact in the Example module that can be used like so:

    $ irb
    irb(main):001:0> require 'example'
    true
    irb(main):002:0> Example.fact(4)
    24

    34.3.3 Variable Linking

    C/C++ global variables are wrapped as a pair of singleton methods for the module: one to get the value of the global variable and one to set it. For example, the following SWIG interface file declares two global variables:

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
      extern int variable1;
      extern double Variable2;
    %}
    ...

    Now look at the Ruby interface:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> Example.variable1 = 2
    2
    irb(main):003:0> Example.Variable2 = 4 * 10.3
    41.2
    irb(main):004:0> Example.Variable2
    41.2

    If you make an error in variable assignment, you will receive an error message. For example:

    irb(main):005:0> Example.Variable2 = "hello"
    TypeError: no implicit conversion to float from string
    from (irb):5:in `Variable2='
    from (irb):5

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can also use the %immutable directive. For example:

    %immutable;
    %inline %{
      extern char *path;
    %}
    %mutable;

    The %immutable directive stays in effect until it is explicitly disabled using %mutable.

    Note: When SWIG is invoked with the -globalmodule option in effect, the C/C++ global variables will be translated into Ruby global variables. Type-checking and the optional read-only characteristic are available in the same way as described above. However the example would then have to be modified and executed in the following way:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> $variable1 = 2
    2
    irb(main):003:0> $Variable2 = 4 * 10.3
    41.2
    irb(main):004:0> $Variable2
    41.2

    34.3.4 Constants

    C/C++ constants are wrapped as module constants initialized to the appropriate value. To create a constant, use #define or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    
    const int BAR = 32;

    Remember to use the :: operator in Ruby to get at these constant values, e.g.

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> Example::PI
    3.14159

    34.3.5 Pointers

    "Opaque" pointers to arbitrary C/C++ types (i.e. types that aren't explicitly declared in your SWIG interface file) are wrapped as data objects. So, for example, consider a SWIG interface file containing only the declarations:

    Foo *get_foo();
    void set_foo(Foo *foo);

    For this case, the get_foo() method returns an instance of an internally generated Ruby class:

    irb(main):001:0> foo = Example::get_foo()
    #<SWIG::TYPE_p_Foo:0x402b1654>

    A NULL pointer is always represented by the Ruby nil object.

    34.3.6 Structures

    C/C++ structs are wrapped as Ruby classes, with accessor methods (i.e. "getters" and "setters") for all of the struct members. For example, this struct declaration:

    struct Vector {
      double x, y;
    };

    gets wrapped as a Vector class, with Ruby instance methods x, x=, y and y=. These methods can be used to access structure data from Ruby as follows:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> f = Example::Vector.new
    #<Example::Vector:0x4020b268>
    irb(main):003:0> f.x = 10
    nil
    irb(main):004:0> f.x
    10.0

    Similar access is provided for unions and the public data members of C++ classes.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive (in C++, private may also be used). For example:

    struct Foo {
      ...
      %immutable;
      int x; /* Read-only members */
      char *name;
      %mutable;
      ...
    };

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described shortly).

    Array members are normally wrapped as read-only. For example, this code:

    struct Foo {
      int x[50];
    };

    produces a single accessor function like this:

    int *Foo_x_get(Foo *self) {
      return self->x;
    };

    If you want to set an array member, you will need to supply a "memberin" typemap described in the section on typemaps. As a special case, SWIG does generate code to set array members of type char (allowing you to store a Ruby string in the structure).

    When structure members are wrapped, they are handled as pointers. For example,

    struct Foo {
      ...
    };
    
    struct Bar {
      Foo f;
    };

    generates accessor functions such as this:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    
    void Bar_f_set(Bar *b, Foo *val) {
      b->f = *val;
    }

    34.3.7 C++ classes

    Like structs, C++ classes are wrapped by creating a new Ruby class of the same name with accessor methods for the public class member data. Additionally, public member functions for the class are wrapped as Ruby instance methods, and public static member functions are wrapped as Ruby singleton methods. So, given the C++ class declaration:

    class List {
    public:
      List();
      ~List();
      int search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int length;
      static void print(List *l);
    };

    SWIG would create a List class with:

    • instance methods search, insert, remove, and get;
    • instance methods length and length= (to get and set the value of the length data member); and,
    • a print singleton method for the class.

    In Ruby, these functions are used as follows:

    require 'Example'
    
    l = Example::List.new
    
    l.insert("Ale")
    l.insert("Stout")
    l.insert("Lager")
    Example.print(l)
    l.length()
    ----- produces the following output 
    Lager
    Stout
    Ale
    3

    34.3.8 C++ Inheritance

    The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have classes like this:

    class Parent {
      ...
    };
    
    class Child : public Parent {
      ...
    };

    those classes are wrapped into a hierarchy of Ruby classes that reflect the same inheritance structure. All of the usual Ruby utility methods work normally:

    irb(main):001:0> c = Child.new
    #<Bar:0x4016efd4>
    irb(main):002:0> c.instance_of? Child
    true
    irb(main):003:0> b.instance_of? Parent
    false
    irb(main):004:0> b.is_a? Child
    true
    irb(main):005:0> b.is_a? Parent
    true
    irb(main):006:0> Child < Parent
    true
    irb(main):007:0> Child > Parent
    false

    Furthermore, if you have a function like this:

    void spam(Parent *f);

    then the function spam() accepts Parent* or a pointer to any class derived from Parent.

    Until recently, the Ruby module for SWIG didn't support multiple inheritance, and this is still the default behavior. This doesn't mean that you can't wrap C++ classes which inherit from multiple base classes; it simply means that only the first base class listed in the class declaration is considered, and any additional base classes are ignored. As an example, consider a SWIG interface file with a declaration like this:

    class Derived : public Base1, public Base2
    {
      ...
    };

    For this case, the resulting Ruby class (Derived) will only consider Base1 as its superclass. It won't inherit any of Base2's member functions or data and it won't recognize Base2 as an "ancestor" of Derived (i.e. the is_a? relationship would fail). When SWIG processes this interface file, you'll see a warning message like:

    example.i:5: Warning 802: Warning for Derived: Base Base2 ignored.
    Multiple inheritance is not supported in Ruby.

    Starting with SWIG 1.3.20, the Ruby module for SWIG provides limited support for multiple inheritance. Because the approach for dealing with multiple inheritance introduces some limitations, this is an optional feature that you can activate with the -minherit command-line option:

    $ swig -c++ -ruby -minherit example.i
    

    Using our previous example, if your SWIG interface file contains a declaration like this:

    class Derived : public Base1, public Base2
    {
      ...
    };

    and you run SWIG with the -minherit command-line option, then you will end up with a Ruby class Derived that appears to "inherit" the member data and functions from both Base1 and Base2. What actually happens is that three different top-level classes are created, with Ruby's Object class as their superclass. Each of these classes defines a nested module named Impl, and it's in these nested Impl modules that the actual instance methods for the classes are defined, i.e.

    class Base1
      module Impl
      # Define Base1 methods here
      end
      include Impl
    end
    
    class Base2
      module Impl
      # Define Base2 methods here
      end
      include Impl
    end
    
    class Derived
      module Impl
      include Base1::Impl
      include Base2::Impl
      # Define Derived methods here
      end
      include Impl
    end

    Observe that after the nested Impl module for a class is defined, it is mixed-in to the class itself. Also observe that the Derived::Impl module first mixes-in its base classes' Impl modules, thus "inheriting" all of their behavior.

    The primary drawback is that, unlike the default mode of operation, neither Base1 nor Base2 is a true superclass of Derived anymore:

    obj = Derived.new
    obj.is_a? Base1 # this will return false...
    obj.is_a? Base2 # ... and so will this

    In most cases, this is not a serious problem since objects of type Derived will otherwise behave as though they inherit from both Base1 and Base2 (i.e. they exhibit "Duck Typing").

    34.3.9 C++ Overloaded Functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);

    You can use them in Ruby in a straightforward manner:

    irb(main):001:0> foo(3) # foo(int)
    irb(main):002:0> foo("Hello") # foo(char *c)

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };

    you can write Ruby code like this:

    irb(main):001:0> f = Foo.new # Create a Foo
    irb(main):002:0> g = Foo.new(f) # Copy f

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);

    or

    void foo(Bar *b);
    void foo(Bar &b);

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int); 
    void spam(short); // Accessed as spam_short

    or

    %ignore spam(short);
    ...
    void spam(int); 
    void spam(short); // Ignored

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    34.3.10 C++ Operators

    For the most part, overloaded operators are handled automatically by SWIG and do not require any special treatment on your part. So if your class declares an overloaded addition operator, e.g.

    class Complex {
      ...
      Complex operator+(Complex &);
      ...
    };

    the resulting Ruby class will also support the addition (+) method correctly.

    For cases where SWIG's built-in support is not sufficient, C++ operators can be wrapped using the %rename directive (available on SWIG 1.3.10 and later releases). All you need to do is give the operator the name of a valid Ruby identifier. For example:

    %rename(add_complex) operator+(Complex &, Complex &);
    ...
    Complex operator+(Complex &, Complex &);

    Now, in Ruby, you can do this:

    a = Example::Complex.new(2, 3)
    b = Example::Complex.new(4, -1)
    c = Example.add_complex(a, b)

    More details about wrapping C++ operators into Ruby operators is discussed in the section on operator overloading.

    34.3.11 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };

    it works in Ruby as follows:

    irb(main):001:0> require 'example'
    true
    irb(main):002:0> Example.fact(3)
    6
    irb(main):003:0> v = Example::Vector.new
    #<Example::Vector:0x4016f4d4>
    irb(main):004:0> v.x = 3.4
    3.4
    irb(main):004:0> v.y
    0.0

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    34.3.12 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(Pairii) pair<int, int>;

    In Ruby:

    irb(main):001:0> require 'example'
    true
    irb(main):002:0> p = Example::Pairii.new(3, 4)
    #<Example:Pairii:0x4016f4df>
    irb(main):003:0> p.first
    3
    irb(main):004:0> p.second
    4

    34.3.13 C++ Standard Template Library (STL)

    On a related note, the standard SWIG library contains a number of modules that provide typemaps for standard C++ library classes (such as std::pair, std::string and std::vector). These library modules don't provide wrappers around the templates themselves, but they do make it convenient for users of your extension module to pass Ruby objects (such as arrays and strings) to wrapped C++ code that expects instances of standard C++ templates. For example, suppose the C++ library you're wrapping has a function that expects a vector of floats:

    %module example
    
    float sum(const std::vector<float>& values);

    Rather than go through the hassle of writing an "in" typemap to convert an array of Ruby numbers into a std::vector<float>, you can just use the std_vector.i module from the standard SWIG library:

    %module example
    
    %include std_vector.i
    float sum(const std::vector<float>& values);

    Ruby's STL wrappings provide additional methods to make them behave more similarly to Ruby's native classes.

    Thus, you can do, for example:

    v = IntVector.new
    v << 2
    v << 3
    v << 4
    v.each { |x| puts x }
    
    => 2
    3
    4
    v.delete_if { |x| x == 3 }
    => [2, 4]

    The SWIG Ruby module provides also the ability for all the STL containers to carry around Ruby native objects (Fixnum, Classes, etc) making them act almost like Ruby's own Array, Hash, etc. To do that, you need to define a container that contains a swig::GC_VALUE, like:

    %module nativevector
    
    %{
    std::vector< swig::GC_VALUE > NativeVector;
    %}
    
    %template(NativeVector) std::vector< swig::GC_VALUE >;
    

    This vector can then contain any Ruby object, making them almost identical to Ruby's own Array class.

    require 'nativevector'
    include NativeVector
    
    v = NativeVector.new
    v << 1
    v << [1, 2]
    v << 'hello'
    
    class A; end
    
    v << A.new
    
    puts v
    => [1, [1, 2], 'hello', #<A:0x245325>]
    

    Obviously, there is a lot more to template wrapping than shown in these examples. More details can be found in the SWIG and C++ chapter.

    34.3.14 C++ STL Functors

    Some containers in the STL allow you to modify their default behavior by using so called functors or function objects. Functors are often just a very simple struct with operator() redefined or an actual C/C++ function. This allows you, for example, to always keep the sort order of a STL container to your liking.

    The Ruby STL mappings allows you to modify those containers that support functors using Ruby procs or methods, instead. Currently, this includes std::set, set::map, std::multiset and std::multimap.

    The functors in swig are called swig::UnaryFunction and swig::BinaryFunction. For C++ predicates (ie. functors that must return bool as a result) swig::UnaryPredicate and swig::BinaryPredicate are provided.

    As an example, if given this swig file:

    %module intset;
    
    %include <std_set.i>
    
    %template(IntSet) std::set< int, swig::BinaryPredicate >;
    

    You can then use the set from Ruby with or without a proc object as a predicate:

    require 'intset'
    include Intset
    
    # Default sorting behavior defined in C++
    a = IntSet.new
    a << 1
    a << 2
    a << 3
    a
    => [1, 2, 3]
    
    # Custom sorting behavior defined by a Ruby proc
    b = IntSet.new( proc { |a, b| a > b } )
    b << 1
    b << 2
    b << 3
    b
    =>  [3, 2, 1]
    

    34.3.15 C++ STL Iterators

    The STL is well known for the use of iterators. There are a number of iterators possible with different properties, but in general there are two main categories: const iterators and non-const iterators. The const iterators can access and not modify the values they point at, while the non-const iterators can both read and modify the values.

    The Ruby STL wrappings support both type of iterators by using a proxy class in-between. This proxy class is swig::Iterator or swig::ConstIterator. Derived from them are template classes that need to be initialized with the actual iterator for the container you are wrapping and often times with the beginning and ending points of the iteration range.

    The SWIG STL library already provides typemaps to all the standard containers to do this wrapping automatically for you, but if you have your own STL-like iterator, you will need to write your own typemap for them. For out typemaps, the special functions make_const_iterator and make_nonconst_iterator are provided.

    These can be used either like:

    make_const_iterator( iterator, rubyclass );
    make_const_iterator( iterator, iterator_begin, iterator_end, rubyclass );
    

    The iterators support a next() and previous() member function to just change the iterator without returning anything. previous() should obviously only be used for bidirectional iterators. You can also advance the iterator multiple steps by using standard math operations like +=.

    The value the iterator points at can be accessed with value() -- this is equivalent to dereferencing it with *i. For non-const iterators, a value=() function is also provided which allows you to change the value pointed by the iterator. This is equivalent to the C++ construct of dereferencing and assignment, like *i = something.

    Thus, given say a vector class of doubles defined as:

    %module doublevector
    
    %include std_vector.i
    
    %template(DoubleVector) std::vector<double>;
    

    Its iterator can then be used from Ruby like:

    require 'doublevector'
    include Doublevector
    
    v = DoubleVector.new
    v << 1
    v << 2
    v << 3
    
    #
    # an elaborate and less efficient way of doing v.map! { |x| x+2 }
    #
    i = v.begin
    e = v.end
    while i != e
      val = i.value
      val += 2
      i.value = val
      i.next
    end
    i
    >> [3, 4, 5 ]
    

    If you'd rather have STL classes without any iterators, you should define -DSWIG_NO_EXPORT_ITERATOR_METHODS when running swig.

    34.3.16 C++ Smart Pointers

    34.3.16.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Ruby in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    34.3.16.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo(); // Created somehow (not shown)
    ...
    p->x = 3; // Foo::x
    int y = p->bar(); // Foo::bar

    To wrap this in Ruby, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...

    Now, in Ruby, everything should just "work":

    irb(main):001:0> p = Example::CreateFoo() # Create a smart-pointer somehow
    #<Example::SmartPtrFoo:0x4016f4df>
    irb(main):002:0> p.x = 3 # Foo::x
    3
    irb(main):003:0> p.bar() # Foo::bar

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    irb(main):004:0> f = p.__deref__() # Returns underlying Foo *

    34.3.17 Cross-Language Polymorphism

    SWIG's Ruby module supports cross-language polymorphism (a.k.a. the "directors" feature) similar to that for SWIG's Python module. Rather than duplicate the information presented in the Python chapter, this section just notes the differences that you need to be aware of when using this feature with Ruby.

    34.3.17.1 Exception Unrolling

    Whenever a C++ director class routes one of its virtual member function calls to a Ruby instance method, there's always the possibility that an exception will be raised in the Ruby code. By default, those exceptions are ignored, which simply means that the exception will be exposed to the Ruby interpreter. If you would like to change this behavior, you can use the %feature("director:except") directive to indicate what action should be taken when a Ruby exception is raised. The following code should suffice in most cases:

    %feature("director:except") {
      throw Swig::DirectorMethodException($error);
    }

    When this feature is activated, the call to the Ruby instance method is "wrapped" using the rb_rescue2() function from Ruby's C API. If any Ruby exception is raised, it will be caught here and a C++ exception is raised in its place.

    34.4 Naming

    Ruby has several common naming conventions. Constants are generally in upper case, module and class names are in camel case and methods are in lower case with underscores. For example:

    • MATH::PI is a constant name
    • MyClass is a class name
    • my_method is a method name

    Prior to version 1.3.28, SWIG did not support these Ruby conventions. The only modifications it made to names was to capitalize the first letter of constants (which includes module and class names).

    SWIG 1.3.28 introduces the new -autorename command line parameter. When this parameter is specified, SWIG will automatically change constant, class and method names to conform with the standard Ruby naming conventions. For example:

    $ swig -ruby -autorename example.i
    

    To disable renaming use the -noautorename command line option.

    Since this change significantly changes the wrapper code generated by SWIG, it is turned off by default in SWIG 1.3.28. However, it is planned to become the default option in future releases.

    34.4.1 Defining Aliases

    It's a fairly common practice in the Ruby built-ins and standard library to provide aliases for method names. For example, Array#size is an alias for Array#length. If you would like to provide an alias for one of your class' instance methods, one approach is to use SWIG's %extend directive to add a new method of the aliased name that calls the original function. For example:

    class MyArray {
    public:
      // Construct an empty array
      MyArray();
    
      // Return the size of this array
      size_t length() const;
    };
    
    %extend MyArray {
      // MyArray#size is an alias for MyArray#length
      size_t size() const {
        return $self->length();
      }
    }
     

    A better solution is to use the %alias directive (unique to SWIG's Ruby module). The previous example could then be rewritten as:

    // MyArray#size is an alias for MyArray#length
    %alias MyArray::length "size";
    
    class MyArray {
    public:
      // Construct an empty array
      MyArray();
     
      // Return the size of this array
      size_t length() const;
    };

    Multiple aliases can be associated with a method by providing a comma-separated list of aliases to the %alias directive, e.g.

    %alias MyArray::length "amount, quantity, size";

    From an end-user's standpoint, there's no functional difference between these two approaches; i.e. they should get the same result from calling either MyArray#size or MyArray#length. However, when the %alias directive is used, SWIG doesn't need to generate all of the wrapper code that's usually associated with added methods like our MyArray::size() example.

    Note that the %alias directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.4.2 Predicate Methods

    Ruby methods that return a boolean value and end in a question mark are known as predicate methods. Examples of predicate methods in standard Ruby classes include Array#empty? (which returns true for an array containing no elements) and Object#instance_of? (which returns true if the object is an instance of the specified class). For consistency with Ruby conventions, methods that return boolean values should be marked as predicate methods.

    One cumbersome solution to this problem is to rename the method (using SWIG's %rename directive) and provide a custom typemap that converts the function's actual return type to Ruby's true or false. For example:

    %rename("is_it_safe?") is_it_safe();
    
    %typemap(out) int is_it_safe "$result = ($1 != 0) ? Qtrue : Qfalse;";
    
    int is_it_safe();

    A better solution is to use the %predicate directive (unique to SWIG's Ruby module) to designate a method as a predicate method. For the previous example, this would look like:

    %predicate is_it_safe();
    
    int is_it_safe();

    This method would be invoked from Ruby code like this:

    irb(main):001:0> Example::is_it_safe?
    true

    The %predicate directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.4.3 Bang Methods

    Ruby methods that modify an object in-place and end in an exclamation mark are known as bang methods. An example of a bang method is Array#sort! which changes the ordering of items in an array. Contrast this with Array#sort, which returns a copy of the array with the items sorted instead of modifying the original array. For consistency with Ruby conventions, methods that modify objects in place should be marked as bang methods.

    Bang methods can be marked using the %bang directive which is unique to the Ruby module and was introduced in SWIG 1.3.28. For example:

    %bang sort(int arr[]);
    
    int sort(int arr[]); 

    This method would be invoked from Ruby code like this:

    irb(main):001:0> Example::sort!(arr)

    The %bang directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.4.4 Getters and Setters

    Often times a C++ library will expose properties through getter and setter methods. For example:

    class Foo {
      Foo() {}
      int getValue() { return value_; }
      void setValue(int value) { value_ = value; }
    
    private:
      int value_;
    };

    By default, SWIG will expose these methods to Ruby as get_value and set_value. However, it more natural for these methods to be exposed in Ruby as value and value=. That allows the methods to be used like this:

    irb(main):001:0> foo = Foo.new()
    irb(main):002:0> foo.value = 5
    irb(main):003:0> puts foo.value

    This can be done by using the %rename directive:

    %rename("value") Foo::getValue();
    %rename("value=") Foo::setValue(int value);

    34.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }

    or

    int sub(int *x, int *y) {
      return *x-*y;
    }

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module Example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int sub(int *INPUT, int *INPUT);

    In Ruby, this allows you to pass simple values. For example:

    a = Example.add(3, 4)
    puts a
    7
    b = Example.sub(7, 4)
    puts b
    3

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module Example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT { int *x, int *y};
    
    void add(int x, int y, int *result);
    int sub(int *x, int *y);

    If a function mutates one of its parameters like this,

    void negate(int *x) {
     *x = -(*x);
    }

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);

    In Ruby, a mutated parameter shows up as a return value. For example:

    a = Example.negate(3)
    print a
    -3

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, success code, and error_code */
    int send_message(char *text, int *success, int *error_code);

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    ...
    int send_message(char *, int *OUTPUT, int *OUTPUT);

    When used in Ruby, the function will return an array of multiple values.

    bytes, success, error_code = send_message("Hello World")
    if not success
      print "error #{error_code} : in send_message"
    else
      print "Sent", bytes
    end

    Another way to access multiple return values is to use the %apply rule. In the following example, the parameters rows and columns are related to SWIG as OUTPUT values through the use of %apply

    %module Example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, int*columns);

    In Ruby:

    r, c = Example.get_dimensions(m)

    34.6 Exception handling

    34.6.1 Using the %exception directive

    The SWIG %exception directive can be used to define a user-definable exception handler that can convert C/C++ errors into Ruby exceptions. The chapter on Customization Features contains more details, but suppose you have a C++ class like the following :

    class DoubleArray {
    private:
      int n;
      double *ptr;
    public:
      // Create a new array of fixed size
      DoubleArray(int size) {
        ptr = new double[size];
        n = size;
      }
     
      // Destroy an array
      ~DoubleArray() {
        delete ptr;
      } 
     
      // Return the length of the array
      int length() {
        return n;
      }
     
      // Get an array item and perform bounds checking.
      double getitem(int i) {
        if ((i >= 0) && (i < n))
          return ptr[i];
        else
          throw RangeError();
      }
     
      // Set an array item and perform bounds checking.
      void setitem(int i, double val) {
        if ((i >= 0) && (i < n))
          ptr[i] = val;
        else {
          throw RangeError();
        }
      }
    };

    Since several methods in this class can throw an exception for an out-of-bounds access, you might want to catch this in the Ruby extension by writing the following in an interface file:

    %exception {
      try {
        $action
      }
      catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error.");
      }
    }
    
    class DoubleArray {
      ...
    };

    The exception handling code is inserted directly into generated wrapper functions. When an exception handler is defined, errors can be caught and used to gracefully raise a Ruby exception instead of forcing the entire program to terminate with an uncaught error.

    As shown, the exception handling code will be added to every wrapper function. Because this is somewhat inefficient, you might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      } catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error in getitem.");
      }
    }
     
    %exception setitem {
      try {
        $action
      } catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error in setitem.");
      }
    }

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on Customization Features for more examples.

    34.6.2 Handling Ruby Blocks

    One of the highlights of Ruby and most of its standard library is the use of blocks, which allow the easy creation of continuations and other niceties. Blocks in ruby are also often used to simplify the passing of many arguments to a class.

    In order to make your class constructor support blocks, you can take advantage of the %exception directive, which will get run after the C++ class' constructor was called.

    For example, this yields the class over after its construction:

    class Window
    {
    public:
      Window(int x, int y, int w, int h);
      // .... other methods here ....
    };
    
    // Add support for yielding self in the Class' constructor.
    %exception Window::Window {
      $action
      if (rb_block_given_p()) {
        rb_yield(self);
      }
    }

    Then, in ruby, it can be used like:

    Window.new(0, 0, 360, 480) { |w|
      w.color = Fltk::RED
      w.border = false
    }
    

    For other methods, you can usually use a dummy parameter with a special in typemap, like:

    //
    // original function was:
    //
    // void func(int x);
    
    %typemap(in, numinputs=0) int RUBY_YIELD_SELF {
      if ( !rb_block_given_p() )
        rb_raise("No block given");
      return rb_yield(self);
    }
    
    %extend {
      void func(int x, int RUBY_YIELD_SELF );
    }
    

    For more information on typemaps, see Typemaps .

    34.6.3 Raising exceptions

    There are three ways to raise exceptions from C++ code to Ruby.

    The first way is to use SWIG_exception(int code, const char *msg) . The following table shows the mappings from SWIG error codes to Ruby exceptions:

    SWIG_MemoryError
    rb_eNoMemError
    SWIG_IOError
    rb_eIOError
    SWIG_RuntimeError
    rb_eRuntimeError
    SWIG_IndexError
    rb_eIndexError
    SWIG_TypeError
    rb_eTypeError
    SWIG_DivisionByZero
    rb_eZeroDivError
    SWIG_OverflowError
    rb_eRangeError
    SWIG_SyntaxError
    rb_eSyntaxError
    SWIG_ValueError
    rb_eArgError
    SWIG_SystemError
    rb_eFatal
    SWIG_AttributeError
    rb_eRuntimeError
    SWIG_NullReferenceError
    rb_eNullReferenceError*
    SWIG_ObjectPreviouslyDeletedError
    rb_eObjectPreviouslyDeleted*
    SWIG_UnknownError
    rb_eRuntimeError
    * These error classes are created by SWIG and are not built-in Ruby exception classes

    The second way to raise errors is to use SWIG_Raise(obj, type, desc). Obj is a C++ instance of an exception class, type is a string specifying the type of exception (for example, "MyError") and desc is the SWIG description of the exception class. For example:

    %raise(SWIG_NewPointerObj(e, SWIGTYPE_p_AssertionFailedException, 0), ":AssertionFailedException", SWIGTYPE_p_AssertionFailedException);
    

    This is useful when you want to pass the current exception object directly to Ruby, particularly when the object is an instance of class marked as an %exceptionclass (see the next section for more information).

    Last, you can raise an exception by directly calling Ruby's C api. This is done by invoking the rb_raise() function. The first argument passed to rb_raise() is the exception type. You can raise a custom exception type or one of the built-in Ruby exception types.

    34.6.4 Exception classes

    Starting with SWIG 1.3.28, the Ruby module supports the %exceptionclass directive, which is used to identify C++ classes that are used as exceptions. Classes that are marked with the %exceptionclass directive are exposed in Ruby as child classes of rb_eRuntimeError. This allows C++ exceptions to be directly mapped to Ruby exceptions, providing for a more natural integration between C++ code and Ruby code.

    %exceptionclass CustomError;
    
    %inline %{
      class CustomError { };
    
      class Foo { 
      public:
        void test() { throw CustomError; }
      };
    %}

    From Ruby you can now call this method like this:

    foo = Foo.new
    begin
      foo.test()
    rescue CustomError => e
      puts "Caught custom error"
    end 

    For another example look at swig/Examples/ruby/exception_class.

    34.7 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Ruby C API as well as the material in the "Typemaps " chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Ruby interface.

    34.7.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. The general form of this declaration is as follows ( parts enclosed in [...] are optional ):

    %typemap( method [, modifiers...] ) typelist code;
    

    method is a simply a name that specifies what kind of typemap is being defined. It is usually a name like "in", "out", or "argout" (or its director variations). The purpose of these methods is described later.

    modifiers is an optional comma separated list of name="value" values. These are sometimes to attach extra information to a typemap and is often target-language dependent.

    typelist is a list of the C++ type patterns that the typemap will match. The general form of this list is as follows:

    typelist : typepattern [, typepattern, typepattern, ... ] ;
    
    typepattern : type [ (parms) ]
      | type name [ (parms) ]
      | ( typelist ) [ (parms) ]

    Each type pattern is either a simple type, a simple type and argument name, or a list of types in the case of multi-argument typemaps. In addition, each type pattern can be parameterized with a list of temporary variables (parms). The purpose of these variables will be explained shortly.

    code specifies the C code used in the typemap. It can take any one of the following forms:

    code : { ... }
      | " ... "
      | %{ ... %}

    For example, to convert integers from Ruby to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) NUM2INT($input);
      printf("Received an integer : %d\n", $1);
    }
    
    %inline %{
      extern int fact(int n);
    %}

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variables prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input Ruby object.

    When this example is compiled into a Ruby module, the following sample code:

    require 'example'
    
    puts Example.fact(6)

    prints the result:

    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int n {
      $1 = (int) NUM2INT($input);
      printf("n = %d\n", $1);
    }
    
    %inline %{
      extern int fact(int n);
    %}

    In this case, the typemap code is only attached to arguments that exactly match "int n".

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) NUM2INT($input);
      printf("n = %d\n", $1);
    }
    
    typedef int Integer;
    extern int fact(Integer n); // Above typemap is applied

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = StringValuePtr($input);
      $2 = (int) RSTRING($input)->len;
    };
    
    int count(char c, char *str, int len);

    When a multi-argument typemap is defined, the arguments are always handled as a single Ruby object. This allows the function count to be used as follows (notice how the length parameter is omitted):

    puts Example.count('o', 'Hello World')
    2

    34.7.2 Typemap scope

    Once defined, a typemap remains in effect for all of the declarations that follow. A typemap may be redefined for different sections of an input file. For example:

    // typemap1
    %typemap(in) int {
      ...
    }
    
    int fact(int); // typemap1
    int gcd(int x, int y); // typemap1
    
    // typemap2
    %typemap(in) int {
      ...
    }
    
    int isprime(int); // typemap2

    One exception to the typemap scoping rules pertains to the %extend declaration. %extend is used to attach new declarations to a class or structure definition. Because of this, all of the declarations in an %extend block are subject to the typemap rules that are in effect at the point where the class itself is defined. For example:

    class Foo {
      ...
    };
    
    %typemap(in) int {
      ...
    }
    
    %extend Foo {
      int blah(int x); // typemap has no effect. Declaration is attached to Foo which 
      // appears before the %typemap declaration.
    };

    34.7.3 Copying a typemap

    A typemap is copied by using assignment. For example:

    %typemap(in) Integer = int;

    or this:

    %typemap(in) Integer, Number, int32_t = int;

    Types are often managed by a collection of different typemaps. For example:

    %typemap(in) int { ... }
    %typemap(out) int { ... }
    %typemap(varin) int { ... }
    %typemap(varout) int { ... }

    To copy all of these typemaps to a new type, use %apply. For example:

    %apply int { Integer }; // Copy all int typemaps to Integer
    %apply int { Integer, Number }; // Copy all int typemaps to both Integer and Number

    The patterns for %apply follow the same rules as for %typemap. For example:

    %apply int *output { Integer *output }; // Typemap with name
    %apply (char *buf, int len) { (char *buffer, int size) }; // Multiple arguments

    34.7.4 Deleting a typemap

    A typemap can be deleted by simply defining no code. For example:

    %typemap(in) int; // Clears typemap for int
    %typemap(in) int, long, short; // Clears typemap for int, long, short
    %typemap(in) int *output; 

    The %clear directive clears all typemaps for a given type. For example:

    %clear int; // Removes all types for int
    %clear int *output, long *output;

    Note: Since SWIG's default behavior is defined by typemaps, clearing a fundamental type like int will make that type unusable unless you also define a new set of typemaps immediately after the clear operation.

    34.7.5 Placement of typemaps

    Typemap declarations can be declared in the global scope, within a C++ namespace, and within a C++ class. For example:

    %typemap(in) int {
      ...
    }
    
    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    
    class Bar {
    public:
      typedef const int & const_reference;
      %typemap(out) const_reference {
        ...
      }
    };

    When a typemap appears inside a namespace or class, it stays in effect until the end of the SWIG input (just like before). However, the typemap takes the local scope into account. Therefore, this code

    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }

    is really defining a typemap for the type std::string. You could have code like this:

    namespace std {
      class string;
      %typemap(in) string { /* std::string */
      ...
      }
    }
    
    namespace Foo {
      class string;
      %typemap(in) string { /* Foo::string */
      ...
      }
    }

    In this case, there are two completely distinct typemaps that apply to two completely different types (std::string and Foo::string).

    It should be noted that for scoping to work, SWIG has to know that string is a typename defined within a particular namespace. In this example, this is done using the class declaration class string .

    34.7.6 Ruby typemaps

    The following list details all of the typemap methods that can be used by the Ruby module:

    34.7.6.1 "in" typemap

    Converts Ruby objects to input function arguments. For example:

    %typemap(in) int {
      $1 = NUM2INT($input);
    }

    The following special variables are available:

    $input Input object holding value to be converted.
    $symname Name of function/method being wrapped
    $1...n Argument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.

    This is probably the most commonly redefined typemap because it can be used to implement customized conversions.

    In addition, the "in" typemap allows the number of converted arguments to be specified. For example:

    // Ignored argument.
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }

    At this time, only zero or one arguments may be converted.

    34.7.6.2 "typecheck" typemap

    The "typecheck" typemap is used to support overloaded functions and methods. It merely checks an argument to see whether or not it matches a specific type. For example:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_INTEGER) int {
      $1 = FIXNUM_P($input) ? 1 : 0;
    }

    For typechecking, the $1 variable is always a simple integer that is set to 1 or 0 depending on whether or not the input argument is the correct type.

    If you define new "in" typemaps and your program uses overloaded methods, you should also define a collection of "typecheck" typemaps. More details about this follow in a later section on "Typemaps and Overloading."

    34.7.6.3 "out" typemap

    Converts return value of a C function to a Ruby object.

    %typemap(out) int {
      $result = INT2NUM( $1 );
    }
    

    The following special variables are available.

    $result Result object returned to target language.
    $symname Name of function/method being wrapped
    $1...n Argument being wrapped
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.

    34.7.6.4 "arginit" typemap

    The "arginit" typemap is used to set the initial value of a function argument--before any conversion has occurred. This is not normally necessary, but might be useful in highly specialized applications. For example:

    // Set argument to NULL before any conversion occurs
    %typemap(arginit) int *data {
      $1 = NULL;
    }

    34.7.6.5 "default" typemap

    The "default" typemap is used to turn an argument into a default argument. For example:

    %typemap(default) int flags {
      $1 = DEFAULT_FLAGS;
    }
    ...
    int foo(int x, int y, int flags);

    The primary use of this typemap is to either change the wrapping of default arguments or specify a default argument in a language where they aren't supported (like C). Target languages that do not support optional arguments, such as Java and C#, effectively ignore the value specified by this typemap as all arguments must be given.

    Once a default typemap has been applied to an argument, all arguments that follow must have default values. See the Default/optional arguments section for further information on default argument wrapping.

    34.7.6.6 "check" typemap

    The "check" typemap is used to supply value checking code during argument conversion. The typemap is applied after arguments have been converted. For example:

    %typemap(check) int positive {
      if ($1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected positive value.");
      }
    }

    34.7.6.7 "argout" typemap

    The "argout" typemap is used to return values from arguments. This is most commonly used to write wrappers for C/C++ functions that need to return multiple values. The "argout" typemap is almost always combined with an "in" typemap---possibly to ignore the input value. For example:

    /* Set the input argument to point to a temporary variable */
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    
    %typemap(argout, fragment="output_helper") int *out {
      // Append output value $1 to $result (assuming a single integer in this case)
      $result = output_helper( $result, INT2NUM(*$1) );
    }

    The following special variables are available.

    $result Result object returned to target language.
    $input The original input object passed.
    $symname Name of function/method being wrapped.

    The code supplied to the "argout" typemap is always placed after the "out" typemap. If multiple return values are used, the extra return values are often appended to return value of the function.

    Output helper is a fragment that usually defines a macro to some function like SWIG_Ruby_AppendOutput.

    See the typemaps.i library for examples.

    34.7.6.8 "freearg" typemap

    The "freearg" typemap is used to cleanup argument data. It is only used when an argument might have allocated resources that need to be cleaned up when the wrapper function exits. The "freearg" typemap usually cleans up argument resources allocated by the "in" typemap. For example:

    // Get a list of integers
    %typemap(in) int *items {
      int nitems = Length($input); 
      $1 = (int *) malloc(sizeof(int)*nitems);
    }
    // Free the list 
    %typemap(freearg) int *items {
      free($1);
    }

    The "freearg" typemap inserted at the end of the wrapper function, just before control is returned back to the target language. This code is also placed into a special variable $cleanup that may be used in other typemaps whenever a wrapper function needs to abort prematurely.

    34.7.6.9 "newfree" typemap

    The "newfree" typemap is used in conjunction with the %newobject directive and is used to deallocate memory used by the return result of a function. For example:

    %typemap(newfree) string * {
      delete $1;
    }
    %typemap(out) string * {
      $result = PyString_FromString($1->c_str());
    }
    ...
    
    %newobject foo;
    ...
    string *foo();

    See Object ownership and %newobject for further details.

    34.7.6.10 "memberin" typemap

    The "memberin" typemap is used to copy data from an already converted input value into a structure member. It is typically used to handle array members and other special cases. For example:

    %typemap(memberin) int [4] {
      memmove($1, $input, 4*sizeof(int));
    }

    It is rarely necessary to write "memberin" typemaps---SWIG already provides a default implementation for arrays, strings, and other objects.

    34.7.6.11 "varin" typemap

    The "varin" typemap is used to convert objects in the target language to C for the purposes of assigning to a C/C++ global variable. This is implementation specific.

    34.7.6.12 "varout" typemap

    The "varout" typemap is used to convert a C/C++ object to an object in the target language when reading a C/C++ global variable. This is implementation specific.

    34.7.6.13 "throws" typemap

    The "throws" typemap is only used when SWIG parses a C++ method with an exception specification or has the %catches feature attached to the method. It provides a default mechanism for handling C++ methods that have declared the exceptions they will throw. The purpose of this typemap is to convert a C++ exception into an error or exception in the target language. It is slightly different to the other typemaps as it is based around the exception type rather than the type of a parameter or variable. For example:

    %typemap(throws) const char * %{
      rb_raise(rb_eRuntimeError, $1);
      SWIG_fail;
    %}
    void bar() throw (const char *);

    As can be seen from the generated code below, SWIG generates an exception handler with the catch block comprising the "throws" typemap content.

    ...
    try {
      bar();
    }
    catch(char const *_e) {
      rb_raise(rb_eRuntimeError, _e);
      SWIG_fail;
    }
    ...

    Note that if your methods do not have an exception specification yet they do throw exceptions, SWIG cannot know how to deal with them. For a neat way to handle these, see the Exception handling with %exception section.

    34.7.6.14 directorin typemap

    Converts C++ objects in director member functions to ruby objects. It is roughly the opposite of the "in" typemap, making its typemap rule often similar to the "out" typemap.

    %typemap(directorin) int {
      $result = INT2NUM($1);
    }
    

    The following special variables are available.

    $result Result object returned to target language.
    $symname Name of function/method being wrapped
    $1...n Argument being wrapped
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.
    this C++ this, referring to the class itself.

    34.7.6.15 directorout typemap

    Converts Ruby objects in director member functions to C++ objects. It is roughly the opposite of the "out" typemap, making its rule often similar to the "in" typemap.

    %typemap(directorout) int {
      $result = NUM2INT($1);
    }
    

    The following special variables are available:

    $inputRuby object being sent to the function
    $symnameName of function/method being wrapped
    $1...nArgument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.
    this C++ this, referring to the class itself.

    Currently, the directorout nor the out typemap support the option numoutputs, but the Ruby module provides that functionality through a %feature directive. Thus, a function can be made to return "nothing" if you do:

    %feature("numoutputs", "0") MyClass::function;
    

    This feature can be useful if a function returns a status code, which you want to discard but still use the typemap to raise an exception.

    34.7.6.16 directorargout typemap

    Output argument processing in director member functions.

    %typemap(directorargout,
    fragment="output_helper") int {
      $result = output_helper( $result, NUM2INT($1) );
    }
    

    The following special variables are available:

    $resultResult that the director function returns
    $inputRuby object being sent to the function
    $symnamename of the function/method being wrapped
    $1...nArgument being sent to the function
    $1_nameName of the argument (if provided)
    $1_typeThe actual C datatype matched by the typemap
    $1_ltypeThe assignable version of the C datatype matched by the typemap
    thisC++ this, referring to the instance of the class itself

    34.7.6.17 ret typemap

    Cleanup of function return values

    34.7.6.18 globalin typemap

    Setting of C global variables

    34.7.7 Typemap variables

    Within a typemap, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the " Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that is supposed to hold an argument value. For output values, this is the raw result that is supposed to be returned to Ruby.

    $input

    A VALUE holding a raw Ruby object with an argument or variable value.

    $result

    A VALUE that holds the result to be returned to Ruby.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Ruby name of the wrapper function being created.

    34.7.8 Useful Functions

    When you write a typemap, you usually have to work directly with Ruby objects. The following functions may prove to be useful. (These functions plus many more can be found in Programming Ruby book, by David Thomas and Andrew Hunt.)

    In addition, we list equivalent functions that SWIG defines, which provide a language neutral conversion (these functions are defined for each swig language supported). If you are trying to create a swig file that will work under multiple languages, it is recommended you stick to the swig functions instead of the native Ruby functions. That should help you avoid having to rewrite a lot of typemaps across multiple languages.

    34.7.8.1 C Datatypes to Ruby Objects

    RUBYSWIG
    INT2NUM(long or int)SWIG_From_int(int x) int to Fixnum or Bignum
    INT2FIX(long or int) int to Fixnum (faster than INT2NUM)
    CHR2FIX(char)SWIG_From_char(char x) char to Fixnum
    rb_str_new2(char*)SWIG_FromCharPtrAndSize(char*, size_t) char* to String
    rb_float_new(double)SWIG_From_double(double),
    SWIG_From_float(float)
    float/double to Float

    34.7.8.2 Ruby Objects to C Datatypes

    Here, while the Ruby versions return the value directly, the SWIG versions do not, but return a status value to indicate success ( SWIG_OK). While more awkward to use, this allows you to write typemaps that report more helpful error messages, like:

    %typemap(in) size_t (int ok)
      ok = SWIG_AsVal_size_t($input, &$1);
      if (!SWIG_IsOK(ok)) {
        SWIG_exception_fail(SWIG_ArgError(ok), Ruby_Format_TypeError( "$1_name", "$1_type", "$symname", $argnum, $input));
      }
    }
    
    int NUM2INT(Numeric)SWIG_AsVal_int(VALUE, int*)
    int FIX2INT(Numeric)SWIG_AsVal_int(VALUE, int*)
    unsigned int NUM2UINT(Numeric) SWIG_AsVal_unsigned_SS_int(VALUE, int*)
    unsigned int FIX2UINT(Numeric) SWIG_AsVal_unsigned_SS_int(VALUE, int*)
    long NUM2LONG(Numeric)SWIG_AsVal_long(VALUE, long*)
    long FIX2LONG(Numeric)SWIG_AsVal_long(VALUE, long*)
    unsigned long FIX2ULONG(Numeric) SWIG_AsVal_unsigned_SS_long(VALUE, unsigned long*)
    char NUM2CHR(Numeric or String)SWIG_AsVal_char(VALUE, int*)
    char * StringValuePtr(String) SWIG_AsCharPtrAndSize(VALUE, char*, size_t, int* alloc)
    char * rb_str2cstr(String, int*length)
    double NUM2DBL(Numeric)(double) SWIG_AsVal_int(VALUE) or similar

    34.7.8.3 Macros for VALUE

    RSTRING_LEN(str)

    length of the Ruby string

    RSTRING_PTR(str)

    pointer to string storage

    RARRAY_LEN(arr)

    length of the Ruby array

    RARRAY(arr)->capa

    capacity of the Ruby array

    RARRAY_PTR(arr)

    pointer to array storage

    34.7.8.4 Exceptions

    void rb_raise(VALUE exception, const char *fmt, ...)

    Raises an exception. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_fatal(const char *fmt, ...)

    Raises a fatal exception, terminating the process. No rescue blocks are called, but ensure blocks will be called. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_bug(const char *fmt, ...)

    Terminates the process immediately -- no handlers of any sort will be called. The given format string fmt and remaining arguments are interpreted as with printf(). You should call this function only if a fatal bug has been exposed.

    void rb_sys_fail(const char *msg)

    Raises a platform-specific exception corresponding to the last known system error, with the given string msg.

    VALUE rb_rescue(VALUE (*body)(VALUE), VALUE args, VALUE(*rescue)(VALUE, VALUE), VALUE rargs)

    Executes body with the given args. If a StandardError exception is raised, then execute rescue with the given rargs.

    VALUE rb_ensure(VALUE(*body)(VALUE), VALUE args, VALUE(*ensure)(VALUE), VALUE eargs)

    Executes body with the given args. Whether or not an exception is raised, execute ensure with the given rargs after body has completed.

    VALUE rb_protect(VALUE (*body)(VALUE), VALUE args, int *result)

    Executes body with the given args and returns nonzero in result if any exception was raised.

    void rb_notimplement()

    Raises a NotImpError exception to indicate that the enclosed function is not implemented yet, or not available on this platform.

    void rb_exit(int status)

    Exits Ruby with the given status. Raises a SystemExit exception and calls registered exit functions and finalizers.

    void rb_warn(const char *fmt, ...)

    Unconditionally issues a warning message to standard error. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_warning(const char *fmt, ...)

    Conditionally issues a warning message to standard error if Ruby was invoked with the -w flag. The given format string fmt and remaining arguments are interpreted as with printf().

    34.7.8.5 Iterators

    void rb_iter_break()

    Breaks out of the enclosing iterator block.

    VALUE rb_each(VALUE obj)

    Invokes the each method of the given obj.

    VALUE rb_yield(VALUE arg)

    Transfers execution to the iterator block in the current context, passing arg as an argument. Multiple values may be passed in an array.

    int rb_block_given_p()

    Returns true if yield would execute a block in the current context; that is, if a code block was passed to the current method and is available to be called.

    VALUE rb_iterate(VALUE (*method)(VALUE), VALUE args, VALUE (*block)(VALUE, VALUE), VALUE arg2)

    Invokes method with argument args and block block. A yield from that method will invoke block with the argument given to yield, and a second argument arg2.

    VALUE rb_catch(const char *tag, VALUE (*proc)(VALUE, VALUE), VALUE value)

    Equivalent to Ruby's catch.

    void rb_throw(const char *tag, VALUE value)

    Equivalent to Ruby's throw.

    34.7.9 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the examples in the Example/ruby directory.

    34.7.10 Converting a Ruby array to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Ruby Array instance to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      /* Get the length of the array */
      int size = RARRAY($input)->len; 
      int i;
      $1 = (char **) malloc((size+1)*sizeof(char *));
      /* Get the first element in memory */
      VALUE *ptr = RARRAY($input)->ptr; 
      for (i=0; i < size; i++, ptr++) {
        /* Convert Ruby Object String to char* */
        $1[i]= StringValuePtr(*ptr); 
      }
      $1[i]=NULL; /* End of list */
    }
    
    // This cleans up the char ** array created before 
    // the function call
    
    %typemap(freearg) char ** {
      free((char *) $1);
    }
    
    // Now a test function
    %inline %{
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    %}

    When this module is compiled, the wrapped C function now operates as follows :

    require 'Argv'
    Argv.print_args(["Dave", "Mike", "Mary", "Jane", "John"])
    argv[0] = Dave
    argv[1] = Mike
    argv[2] = Mary
    argv[3] = Jane
    argv[4] = John

    In the example, two different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function.

    34.7.11 Collecting arguments in a hash

    Ruby's solution to the "keyword arguments" capability of some other languages is to allow the programmer to pass in one or more key-value pairs as arguments to a function. All of those key-value pairs are collected in a single Hash argument that's presented to the function. If it makes sense, you might want to provide similar functionality for your Ruby interface. For example, suppose you'd like to wrap this C function that collects information about people's vital statistics:

    void setVitalStats(const char *person, int nattributes, const char **names, int *values);

    and you'd like to be able to call it from Ruby by passing in an arbitrary number of key-value pairs as inputs, e.g.

    setVitalStats("Fred", 
      'weight' => 270, 
      'age' => 42 
    )

    To make this work, you need to write a typemap that expects a Ruby Hash as its input and somehow extracts the last three arguments ( nattributes, names and values) needed by your C function. Let's start with the basics:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
    }
     

    This %typemap directive tells SWIG that we want to match any function declaration that has the specified types and names of arguments somewhere in the argument list. The fact that we specified the argument names (nattributes, names and values) in our typemap is significant; this ensures that SWIG won't try to apply this typemap to other functions it sees that happen to have a similar declaration with different argument names. The arguments that appear in the second set of parentheses (keys_arr, i , key and val) define local variables that our typemap will need.

    Since we expect the input argument to be a Hash, let's next add a check for that:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
    }

    Check_Type() is just a macro (defined in the Ruby header files) that confirms that the input argument is of the correct type; if it isn't, an exception will be raised.

    The next task is to determine how many key-value pairs are present in the hash; we'll assign this number to the first typemap argument ( $1). This is a little tricky since the Ruby/C API doesn't provide a public function for querying the size of a hash, but we can get around that by calling the hash's size method directly and converting its result to a C int value:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
    }

    So now we know the number of attributes. Next we need to initialize the second and third typemap arguments (i.e. the two C arrays) to NULL and set the stage for extracting the keys and values from the hash:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
        }
    }

    There are a number of ways we could extract the keys and values from the input hash, but the simplest approach is to first call the hash's keys method (which returns a Ruby array of the keys) and then start looping over the elements in that array:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
          for (i = 0; i < $1; i++) {
          }
        }
    }

    Recall that keys_arr and i are local variables for this typemap. For each element in the keys_arr array, we want to get the key itself, as well as the value corresponding to that key in the hash:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
          for (i = 0; i < $1; i++) {
            key = rb_ary_entry(keys_arr, i);
            val = rb_hash_aref($input, key);
          }
        }
    }

    To be safe, we should again use the Check_Type() macro to confirm that the key is a String and the value is a Fixnum :

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
          for (i = 0; i < $1; i++) {
            key = rb_ary_entry(keys_arr, i);
            val = rb_hash_aref($input, key);
            Check_Type(key, T_STRING);
            Check_Type(val, T_FIXNUM);
          }
        }
    }

    Finally, we can convert these Ruby objects into their C equivalents and store them in our local C arrays:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
      Check_Type($input, T_HASH);
      $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
      $2 = NULL;
      $3 = NULL;
      if ($1 > 0) {
        $2 = (char **) malloc($1*sizeof(char *));
        $3 = (int *) malloc($1*sizeof(int));
        keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
        for (i = 0; i < $1; i++) {
          key = rb_ary_entry(keys_arr, i);
          val = rb_hash_aref($input, key);
          Check_Type(key, T_STRING);
          Check_Type(val, T_FIXNUM);
          $2[i] = StringValuePtr(key);
          $3[i] = NUM2INT(val);
        }
      }
    }

    We're not done yet. Since we used malloc() to dynamically allocate the memory used for the names and values arguments, we need to provide a corresponding "freearg" typemap to free that memory so that there is no memory leak. Fortunately, this typemap is a lot easier to write:

    %typemap(freearg) (int nattributes, const char **names, const int *values) {
      free((void *) $2);
      free((void *) $3);
    }

    All of the code for this example, as well as a sample Ruby program that uses the extension, can be found in the Examples/ruby/hashargs directory of the SWIG distribution.

    34.7.12 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. Since there are several ways in which pointers can be represented, the following two functions are used to safely perform this conversion:

    int SWIG_ConvertPtr(VALUE obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Ruby object obj to a C pointer whose address is ptr (i.e. ptr is a pointer to a pointer). The third argument, ty, is a pointer to a SWIG type descriptor structure. If ty is not NULL, that type information is used to validate type compatibility and other aspects of the type conversion. If flags is non-zero, any type errors encountered during this validation result in a Ruby TypeError exception being raised; if flags is zero, such type errors will cause SWIG_ConvertPtr() to return -1 but not raise an exception. If ty is NULL, no type-checking is performed.

    VALUE SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int own)

    Creates a new Ruby pointer object. Here, ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag that indicates whether or not Ruby should take ownership of the pointer (i.e. whether Ruby should free this data when the corresponding Ruby instance is garbage-collected).

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *foo;
    SWIG_ConvertPtr($input, (void **) &foo, SWIGTYPE_p_Foo, 1);
    
    VALUE obj;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 1);
    }

    34.7.12.1 Ruby Datatype Wrapping

    VALUE Data_Wrap_Struct(VALUE class, void (*mark)(void *), void (*free)(void *), void *ptr)

    Given a pointer ptr to some C data, and the two garbage collection routines for this data (mark and free ), return a VALUE for the Ruby object.

    VALUE Data_Make_Struct(VALUE class, c-type, void (*mark)(void *), void (*free)(void *), c-type *ptr)

    Allocates a new instance of a C data type c-type , assigns it to the pointer ptr, then wraps that pointer with Data_Wrap_Struct() as above.

    Data_Get_Struct(VALUE obj, c-type, c-type *ptr)

    Retrieves the original C pointer of type c-type from the data object obj and assigns that pointer to ptr.

    34.7.13 Example: STL Vector to Ruby Array

    Another use for macros and type maps is to create a Ruby array from a STL vector of pointers. In essence, copy of all the pointers in the vector into a Ruby array. The use of the macro is to make the typemap so generic that any vector with pointers can use the type map. The following is an example of how to construct this type of macro/typemap and should give insight into constructing similar typemaps for other STL structures:

    %define PTR_VECTOR_TO_RUBY_ARRAY(vectorclassname, classname)
    %typemap(out) vectorclassname &, const vectorclassname & {
      VALUE arr = rb_ary_new2($1->size());
      vectorclassname::iterator i = $1->begin(), iend = $1->end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, *i));
      $result = arr;
    }
    %typemap(out) vectorclassname, const vectorclassname {
      VALUE arr = rb_ary_new2($1.size());
      vectorclassname::iterator i = $1.begin(), iend = $1.end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, *i));
      $result = arr;
    }
    %enddef

    Note, that the "c ## classname.klass" is used in the preprocessor step to determine the actual object from the class name.

    To use the macro with a class Foo, the following is used:

    PTR_VECTOR_TO_RUBY_ARRAY(vector<foo *="">, Foo)

    It is also possible to create a STL vector of Ruby objects:

    %define RUBY_ARRAY_TO_PTR_VECTOR(vectorclassname, classname)
    %typemap(in) vectorclassname &, const vectorclassname & {
      Check_Type($input, T_ARRAY);
      vectorclassname *vec = new vectorclassname;
      int len = RARRAY($input)->len;
      for (int i=0; i!=len; i++) {
        VALUE inst = rb_ary_entry($input, i);
        //The following _should_ work but doesn't on HPUX
        // Check_Type(inst, T_DATA);
        classname *element = NULL;
        Data_Get_Struct(inst, classname, element);
        vec->push_back(element);
      }
      $1 = vec;
    }
    
    %typemap(freearg) vectorclassname &, const vectorclassname & {
      delete $1;
    }
    %enddef

    It is also possible to create a Ruby array from a vector of static data types:

    %define VECTOR_TO_RUBY_ARRAY(vectorclassname, classname)
    %typemap(out) vectorclassname &, const vectorclassname & {
      VALUE arr = rb_ary_new2($1->size()); 
      vectorclassname::iterator i = $1->begin(), iend = $1->end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, &(*i)));
      $result = arr;
    }
    %typemap(out) vectorclassname, const vectorclassname {
      VALUE arr = rb_ary_new2($1.size()); 
      vectorclassname::iterator i = $1.begin(), iend = $1.end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, &(*i)));
      $result = arr;
    }
    %enddef
    Note that this is mostly an example of typemaps. If you want to use the STL with ruby, you are advised to use the standard swig STL library, which does much more than this. Refer to the section called the C++ Standard Template Library.

    34.8 Docstring Features

    Using ri and rdoc web pages in Ruby libraries is a common practice. Given the way that SWIG generates the extensions by default, your users will normally not get any documentation for it, even if they run 'rdoc' on the resulting .c or .cxx file.

    The features described in this section make it easy for you to add rdoc strings to your modules, functions and methods that can then be read by Ruby's rdoc tool to generate html web pages, ri documentation, Windows chm file and an .xml description.

    rdoc can then be run from a console or shell window on a swig generated file.

    For example, to generate html web pages from a C++ file, you'd do:

    $ rdoc -E cxx=c -f html file_wrap.cxx
    

    To generate ri documentation from a c wrap file, you could do:

    $ rdoc -r file_wrap.c
    

    34.8.1 Module docstring

    Ruby allows a docstring at the beginning of the file before any other statements, and it is typically used to give a general description of the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example

    When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus, 
    layout of controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc

    34.8.2 %feature("autodoc")

    Since SWIG does know everything about the function it wraps, it is possible to generate an rdoc containing the parameter types, names and default values. Since Ruby ships with one of the best documentation systems of any language, it makes sense to take advantage of it.

    SWIG's Ruby module provides support for the "autodoc" feature, which when attached to a node in the parse tree will cause an rdoc comment to be generated in the wrapper file that includes the name of the function, parameter names, default values if any, and return type if any. There are also several options for autodoc controlled by the value given to the feature, described below.

    34.8.2.1 %feature("autodoc", "0")

    When the "0" option is given then the types of the parameters will not be included in the autodoc string. For example, given this function prototype:

    %feature("autodoc", "0");
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);

    Then Ruby code like this will be generated:

    function_name(x, y, foo=nil, bar=nil) -> bool
      ...

    34.8.2.2 %feature("autodoc", "1")

    When the "1" option is used then the parameter types will be used in the rdoc string. In addition, an attempt is made to simplify the type name such that it makes more sense to the Ruby user. Pointer, reference and const info is removed, %rename's are evaluated, etc. (This is not always successful, but works most of the time. See the next section for what to do when it doesn't.) Given the example above, then turning on the parameter types with the "1" option will result in rdoc code like this:

    function_name(int x, int y, Foo foo=nil, Bar bar=nil) -> bool
      ...

    34.8.2.3 %feature("autodoc", "2")

    When the "2" option is used then the parameter types will not be used in the rdoc string. However, they will be listed in full after the function. Given the example above, then turning on the parameter types with the "2" option will result in Ruby code like this:

    34.8.2.4 %feature("autodoc", "3")

    When the "3" option is used then the function will be documented using a combination of "1" and "2" above. Given the example above, then turning on the parameter types with the "2" option will result in Ruby code like this:

    function_name(int x, int y, Foo foo=nil, Bar bar=nil) -> bool
    
    Parameters:
            x - int
            y - int
            foo - Foo
            bar - Bar

    34.8.2.5 %feature("autodoc", "docstring")

    Finally, there are times when the automatically generated autodoc string will make no sense for a Ruby programmer, particularly when a typemap is involved. So if you give an explicit value for the autodoc feature then that string will be used in place of the automatically generated string. For example:

    %feature("autodoc", "GetPosition() -> (x, y)") GetPosition;
    void GetPosition(int* OUTPUT, int* OUTPUT);

    34.8.3 %feature("docstring")

    In addition to the autodoc strings described above, you can also attach any arbitrary descriptive text to a node in the parse tree with the "docstring" feature. When the proxy module is generated then any docstring associated with classes, function or methods are output. If an item already has an autodoc string then it is combined with the docstring and they are output together.

    34.9 Advanced Topics

    34.9.1 Operator overloading

    SWIG allows operator overloading with, by using the %extend or %rename commands in SWIG and the following operator names (derived from Python):

    General
    __repr__ inspect
    __str__ to_s
    __cmp__ <=>
    __hash__ hash
    __nonzero__ nonzero?
    Callable
    __call__ call
    Collection
    __len__ length
    __getitem__ []
    __setitem__ []=
    Numeric
    __add__ +
    __sub__ -
    __mul__ *
    __div__ /
    __mod__ %
    __divmod__ divmod
    __pow__ **
    __lshift__ <<
    __rshift__ >>
    __and__ &
    __xor__ ^
    __or__ |
    __neg__ -@
    __pos__ +@
    __abs__ abs
    __invert__ ~
    __int__ to_i
    __float__ to_f
    __coerce__ coerce
    Additions in 1.3.13
    __lt__ <
    __le__ <=
    __eq__ ==
    __gt__ >
    __ge__ >=

    Note that although SWIG supports the __eq__ magic method name for defining an equivalence operator, there is no separate method for handling inequality since Ruby parses the expression a != b as !(a == b).

    34.9.2 Creating Multi-Module Packages

    The chapter on Working with Modules discusses the basics of creating multi-module extensions with SWIG, and in particular the considerations for sharing runtime type information among the different modules.

    As an example, consider one module's interface file (shape.i ) that defines our base class:

    %module shape
    
    %{
    #include "Shape.h"
    %}
    
    class Shape {
    protected:
      double xpos;
      double ypos;
    protected:
      Shape(double x, double y);
    public:
      double getX() const;
      double getY() const;
    };

    We also have a separate interface file (circle.i) that defines a derived class:

    %module circle
    
    %{
    #include "Shape.h"
    #include "Circle.h"
    %}
    
    // Import the base class definition from Shape module
    %import shape.i
    
    class Circle : public Shape {
    protected:
      double radius;
    public:
      Circle(double x, double y, double r);
      double getRadius() const;
    };

    We'll start by building the Shape extension module:

    $ swig -c++ -ruby shape.i
    

    SWIG generates a wrapper file named shape_wrap.cxx. To compile this into a dynamically loadable extension for Ruby, prepare an extconf.rb script using this template:

    require 'mkmf'
    
    # Since the SWIG runtime support library for Ruby
    # depends on the Ruby library, make sure it's in the list
    # of libraries.
    $libs = append_library($libs, Config::CONFIG['RUBY_INSTALL_NAME'])
    
    # Create the makefile
    create_makefile('shape')

    Run this script to create a Makefile and then type make to build the shared library:

    $ ruby extconf.rb
    creating Makefile
    $ make
    g++ -fPIC -g -O2 -I. -I/usr/include/ruby-2.1.0 \
    -I. -c shape_wrap.cxx
    gcc -shared -L/usr/local/lib -o shape.so shape_wrap.o -L. \
    -lruby -lruby -lc

    Note that depending on your installation, the outputs may be slightly different; these outputs are those for a Linux-based development environment. The end result should be a shared library (here, shape.so) containing the extension module code. Now repeat this process in a separate directory for the Circle module:

    1. Run SWIG to generate the wrapper code (circle_wrap.cxx);
    2. Write an extconf.rb script that your end-users can use to create a platform-specific Makefile for the extension;
    3. Build the shared library for this extension by typing make .

    Once you've built both of these extension modules, you can test them interactively in IRB to confirm that the Shape and Circle modules are properly loaded and initialized:

    $ irb
    irb(main):001:0> require 'shape'
    true
    irb(main):002:0> require 'circle'
    true
    irb(main):003:0> c = Circle::Circle.new(5, 5, 20)
    #<Circle::Circle:0xa097208>
    irb(main):004:0> c.kind_of? Shape::Shape
    true
    irb(main):005:0> c.getX()
    5.0

    34.9.3 Specifying Mixin Modules

    The Ruby language doesn't support multiple inheritance, but it does allow you to mix one or more modules into a class using Ruby's include method. For example, if you have a Ruby class that defines an each instance method, e.g.

    class Set
      def initialize
      @members = []
      end
     
      def each
      @members.each { |m| yield m }
      end
    end

    then you can mix-in Ruby's Enumerable module to easily add a lot of functionality to your class:

    class Set
      include Enumerable
      def initialize
        @members = []
      end
      def each
        @members.each { |m| yield m }
      end
    end

    To get the same benefit for your SWIG-wrapped classes, you can use the %mixin directive to specify the names of one or more modules that should be mixed-in to a class. For the above example, the SWIG interface specification might look like this:

    %mixin Set "Enumerable";
    
    class Set {
    public:
      // Constructor
      Set();
     
      // Iterates through set members
      void each();
    };

    Multiple modules can be mixed into a class by providing a comma-separated list of module names to the %mixin directive, e.g.

    %mixin Set "Fee, Fi, Fo, Fum";

    Note that the %mixin directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.10 Memory Management

    One of the most common issues in generating SWIG bindings for Ruby is proper memory management. The key to proper memory management is clearly defining whether a wrapper Ruby object owns the underlying C struct or C++ class. There are two possibilities:

    • The Ruby object is responsible for freeing the C struct or C++ object
    • The Ruby object should not free the C struct or C++ object because it will be freed by the underlying C or C++ code

    To complicate matters, object ownership may transfer from Ruby to C++ (or vice versa) depending on what function or methods are invoked. Clearly, developing a SWIG wrapper requires a thorough understanding of how the underlying library manages memory.

    34.10.1 Mark and Sweep Garbage Collector

    Ruby uses a mark and sweep garbage collector. When the garbage collector runs, it finds all the "root" objects, including local variables, global variables, global constants, hardware registers and the C stack. For each root object, the garbage collector sets its mark flag to true and calls rb_gc_mark on the object. The job of rb_gc_mark is to recursively mark all the objects that a Ruby object has a reference to (ignoring those objects that have already been marked). Those objects, in turn, may reference other objects. This process will continue until all active objects have been "marked." After the mark phase comes the sweep phase. In the sweep phase, all objects that have not been marked will be garbage collected.

    The Ruby C/API provides extension developers two hooks into the garbage collector - a "mark" function and a "sweep" function. By default these functions are set to NULL.

    If a C struct or C++ class references any other Ruby objects, then it must provide a "mark" function. The "mark" function should identify any referenced Ruby objects by calling the rb_gc_mark function for each one. Unsurprisingly, this function will be called by the Ruby garbage during the "mark" phase.

    During the sweep phase, Ruby destroys any unused objects. If any memory has been allocated in creating the underlying C struct or C++ struct, then a "free" function must be defined that deallocates this memory.

    34.10.2 Object Ownership

    As described above, memory management depends on clearly defining who is responsible for freeing the underlying C struct or C++ class. If the Ruby object is responsible for freeing the C++ object, then a "free" function must be registered for the object. If the Ruby object is not responsible for freeing the underlying memory, then a "free" function must not be registered for the object.

    For the most part, SWIG takes care of memory management issues. The rules it uses are:

    • When calling a C++ object's constructor from Ruby, SWIG will assign a "free" function thereby making the Ruby object responsible for freeing the C++ object
    • When calling a C++ member function that returns a pointer, SWIG will not assign a "free" function thereby making the underlying library responsible for freeing the object.

    To make this clearer, let's look at an example. Assume we have a Foo and a Bar class.

    /* File "RubyOwernshipExample.h" */
    
    class Foo
    {
    public:
      Foo() {}
      ~Foo() {}
    };
    
    class Bar
    {
      Foo *foo_;
    public:
      Bar(): foo_(new Foo) {}
      ~Bar() { delete foo_; }
      Foo* get_foo() { return foo_; }
      Foo* get_new_foo() { return new Foo; }
      void set_foo(Foo *foo) { delete foo_; foo_ = foo; }
    };

    First, consider this Ruby code:

    foo = Foo.new

    In this case, the Ruby code calls the underlying Foo C++ constructor, thus creating a new foo object. By default, SWIG will assign the new Ruby object a "free" function. When the Ruby object is garbage collected, the "free" function will be called. It in turn will call Foo's destructor.

    Next, consider this code:

    bar = Bar.new
    foo = bar.get_foo()

    In this case, the Ruby code calls a C++ member function, get_foo . By default, SWIG will not assign the Ruby object a "free" function. Thus, when the Ruby object is garbage collected the underlying C++ foo object is not affected.

    Unfortunately, the real world is not as simple as the examples above. For example:

    bar = Bar.new
    foo = bar.get_new_foo()

    In this case, the default SWIG behavior for calling member functions is incorrect. The Ruby object should assume ownership of the returned object. This can be done by using the %newobject directive. See Object ownership and %newobject for more information.

    The SWIG default mappings are also incorrect in this case:

    foo = Foo.new
    bar = Bar.new
    bar.set_foo(foo)

    Without modification, this code will cause a segmentation fault. When the Ruby foo object goes out of scope, it will free the underlying C++ foo object. However, when the Ruby bar object goes out of scope, it will call the C++ bar destructor which will also free the C++ foo object. The problem is that object ownership is transferred from the Ruby object to the C++ object when the set_foo method is called. This can be done by using the special DISOWN type map, which was added to the Ruby bindings in SWIG-1.3.26.

    Thus, a correct SWIG interface file correct mapping for these classes is:

    /* File RubyOwnershipExample.i */
    
    %module RubyOwnershipExample
    
    %{
    #include "RubyOwnershipExample.h"
    %}
    
    class Foo
    {
    public:
      Foo();
      ~Foo();
    };
    
    class Bar
    {
      Foo *foo_;
    public:
      Bar();
      ~Bar();
      Foo* get_foo();
    
      %newobject get_new_foo;
      Foo* get_new_foo();
    
      %apply SWIGTYPE *DISOWN {Foo *foo};
      void set_foo(Foo *foo);
      %clear Foo *foo;
    };
    

    This code can be seen in swig/examples/ruby/tracking.

    34.10.3 Object Tracking

    The remaining parts of this section will use the class library shown below to illustrate different memory management techniques. The class library models a zoo and the animals it contains.

    %module zoo
    
    %{
    #include <string>
    #include <vector>
    
    #include "zoo.h"
    %}
    
    class Animal
    {
    private:
      typedef std::vector<Animal*> AnimalsType;
      typedef AnimalsType::iterator IterType;
    protected:
      AnimalsType animals;
    protected:
      std::string name_;
    public:
      // Construct an animal with this name
      Animal(const char* name) : name_(name) {}
     
      // Return the animal's name
      const char* get_name() const { return name.c_str(); }
    };
    
    class Zoo
    {
    protected:
     std::vector<Animal *> animals;
     
    public:
      // Construct an empty zoo
      Zoo() {}
      
      /* Create a new animal. */
      static Animal* Zoo::create_animal(const char* name) {
        return new Animal(name);
      }
     
      // Add a new animal to the zoo
      void add_animal(Animal* animal) {
        animals.push_back(animal); 
      }
     
      Animal* remove_animal(size_t i) {
        Animal* result = this->animals[i];
        IterType iter = this->animals.begin();
        std::advance(iter, i);
        this->animals.erase(iter);
       
        return result;
      }
      
      // Return the number of animals in the zoo
      size_t get_num_animals() const {
        return animals.size(); 
      }
      
      // Return a pointer to the ith animal
      Animal* get_animal(size_t i) const {
        return animals[i]; 
      }
    };

    Let's say you SWIG this code and then run IRB:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be3820>
    
    irb(main):004:0> tiger1.get_name()
    => "tiger1"
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0a60>
    
    irb(main):006:0> zoo.add_animal(tiger)
    => nil
    
    irb(main):007:0> zoo.get_num_animals()
    => 1
    
    irb(main):007:0> tiger2 = zoo.remove_animal(0)
    => #<Example::Animal:0x2bd4a18>
    
    irb(main):008:0> tiger2.get_name()
    => "tiger1"
    
    irb(main):009:0> tiger1.equal?(tiger2)
    => false
    

    Pay particular attention to the code tiger1.equal?(tiger2). Note that the two Ruby objects are not the same - but they reference the same underlying C++ object. This can cause problems. For example:

    irb(main):010:0> tiger1 = nil
    => nil
    
    irb(main):011:0> GC.start
    => nil
    
    irb(main):012:0> tiger2.get_name()
    (irb):12: [BUG] Segmentation fault
    

    After the garbage collector runs, as a result of our call to GC.start, callingtiger2.get_name() causes a segmentation fault. The problem is that when tiger1 is garbage collected, it frees the underlying C++ object. Thus, when tiger2 calls the get_name() method it invokes it on a destroyed object.

    This problem can be avoided if SWIG enforces a one-to-one mapping between Ruby objects and C++ classes. This can be done via the use of the %trackobjects functionality available in SWIG-1.3.26. and later.

    When the %trackobjects is turned on, SWIG automatically keeps track of mappings between C++ objects and Ruby objects. Note that enabling object tracking causes a slight performance degradation. Test results show this degradation to be about 3% to 5% when creating and destroying 100,000 animals in a row.

    Since %trackobjects is implemented as a %feature, it uses the same name matching rules as other kinds of features (see the chapter on "Customization Features") . Thus it can be applied on a class-by-class basis if needed. To fix the example above:

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Tell SWIG that create_animal creates a new object */
    %newobject Zoo::create_animal;
    
    /* Tell SWIG to keep track of mappings between C/C++ structs/classes. */
    %trackobjects;
    
    %include "example.h"

    When this code runs we see:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be37d8>
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0a18>
    
    irb(main):004:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):006:0> tiger2 = zoo.remove_animal(0)
    => #<Example::Animal:0x2be37d8>
    
    irb(main):007:0> tiger1.equal?(tiger2)
    => true
    
    irb(main):008:0> tiger1 = nil
    => nil
    
    irb(main):009:0> GC.start
    => nil
    
    irb(main):010:0> tiger.get_name()
    => "tiger1"
    irb(main):011:0>

    For those who are interested, object tracking is implemented by storing Ruby objects in a hash table and keying them on C++ pointers. The underlying API is:

    static void SWIG_RubyAddTracking(void* ptr, VALUE object);
    static VALUE SWIG_RubyInstanceFor(void* ptr) ;
    static void SWIG_RubyRemoveTracking(void* ptr);
    static void SWIG_RubyUnlinkObjects(void* ptr);

    When an object is created, SWIG will automatically call the SWIG_RubyAddTracking method. Similarly, when an object is deleted, SWIG will call the SWIG_RubyRemoveTracking. When an object is returned to Ruby from C++, SWIG will use the SWIG_RubyInstanceFor method to ensure a one-to-one mapping from Ruby to C++ objects. Last, the RubyUnlinkObjects method unlinks a Ruby object from its underlying C++ object.

    In general, you will only need to use the SWIG_RubyInstanceFor , which is required for implementing mark functions as shown below. However, if you implement your own free functions (see below) you may also have to call the SWIG_RubyRemoveTracking and RubyUnlinkObjects methods.

    34.10.4 Mark Functions

    With a bit more testing, we see that our class library still has problems. For example:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bea6a8>
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be7960>
    
    irb(main):004:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> tiger1 = nil
    => nil
    
    irb(main):007:0> GC.start
    => nil
    
    irb(main):005:0> tiger2 = zoo.get_animal(0)
    (irb):12: [BUG] Segmentation fault

    The problem is that Ruby does not know that the zoo object contains a reference to a Ruby object. Thus, when Ruby garbage collects tiger1 it frees the underlying C++ object.

    This can be fixed by implementing a mark function as described above in the Mark and Sweep Garbage Collector section. You can specify a mark function by using the %markfunc directive. Since the %markfunc directive is implemented using SWIG's' "features" mechanism it uses the same name matching rules as other kinds of features (see the chapter on "Customization Features" for more details).

    A mark function takes a single argument, which is a pointer to the C++ object being marked; it should, in turn, call rb_gc_mark() for any instances that are reachable from the current object. The mark function for our Zoo class should therefore loop over all of the C++ animal objects in the zoo object, look up their Ruby object equivalent, and then call rb_gc_mark(). One possible implementation is:

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Keep track of mappings between C/C++ structs/classes
     and Ruby objects so we can implement a mark function. */
    %trackobjects;
    
    /* Specify the mark function */
    %markfunc Zoo "mark_Zoo";
    
    %include "example.h"
    
    %header %{
    
    static void mark_Zoo(void* ptr) {
      Zoo* zoo = (Zoo*) ptr;
     
      /* Loop over each object and tell the garbage collector
      that we are holding a reference to them. */
      int count = zoo->get_num_animals();
     
      for(int i = 0; i < count; ++i) {
        Animal* animal = zoo->get_animal(i);
        VALUE object = SWIG_RubyInstanceFor(animal);
     
        if (object != Qnil) {
          rb_gc_mark(object);
        }
      }
    }
    %}

    Note the mark function is dependent on the SWIG_RUBY_InstanceFor method, and thus requires that %trackobjects is enabled. For more information, please refer to the ruby_track_objects.i test case in the SWIG test suite.

    When this code is compiled we now see:

    $ irb
    irb(main):002:0> tiger1=Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be3bf8>
    
    irb(main):003:0> Example::Zoo.new()
    => #<Example::Zoo:0x2be1780>
    
    irb(main):004:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2bde9c0>
    
    irb(main):005:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):009:0> tiger1 = nil
    => nil
    
    irb(main):010:0> GC.start
    => nil
    irb(main):014:0> tiger2 = zoo.get_animal(0)
    => #<Example::Animal:0x2be3bf8>
    
    irb(main):015:0> tiger2.get_name()
    => "tiger1"
    irb(main):016:0>

    This code can be seen in swig/examples/ruby/mark_function.

    34.10.5 Free Functions

    By default, SWIG creates a "free" function that is called when a Ruby object is garbage collected. The free function simply calls the C++ object's destructor.

    However, sometimes an appropriate destructor does not exist or special processing needs to be performed before the destructor is called. Therefore, SWIG allows you to manually specify a "free" function via the use of the %freefunc directive. The %freefunc directive is implemented using SWIG's' "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    IMPORTANT ! - If you define your own free function, then you must ensure that you call the underlying C++ object's destructor. In addition, if object tracking is activated for the object's class, you must also call the SWIG_RubyRemoveTracking function (of course call this before you destroy the C++ object). Note that it is harmless to call this method if object tracking if off so it is advised to always call it.

    Note there is a subtle interaction between object ownership and free functions. A custom defined free function will only be called if the Ruby object owns the underlying C++ object. This also to Ruby objects which are created, but then transfer ownership to C++ objects via the use of the disown typemap described above.

    To show how to use the %freefunc directive, let's slightly change our example. Assume that the zoo object is responsible for freeing any animal that it contains. This means that the Zoo::add_animal function should be marked with a DISOWN typemap and the destructor should be updated as below:

    Zoo::~Zoo() {
      IterType iter = this->animals.begin();
      IterType end = this->animals.end();
     
      for(iter; iter != end; ++iter) {
        Animal* animal = *iter;
        delete animal;
      }
    }
    

    When we use these objects in IRB we see:

    $irb
    irb(main):002:0> require 'example'
    => true
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0fe8>
    
    irb(main):005:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bda760>
    
    irb(main):006:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> zoo = nil
    => nil
    
    irb(main):008:0> GC.start
    => nil
    
    irb(main):009:0> tiger1.get_name()
    (irb):12: [BUG] Segmentation fault
    

    The error happens because the C++ animal object is freed when the zoo object is freed. Although this error is unavoidable, we can at least prevent the segmentation fault. To do this requires enabling object tracking and implementing a custom free function that calls the SWIG_RubyUnlinkObjects function for each animal object that is destroyed. The SWIG_RubyUnlinkObjects function notifies SWIG that a Ruby object's underlying C++ object is no longer valid. Once notified, SWIG will intercept any calls from the existing Ruby object to the destroyed C++ object and raise an exception.

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Specify that ownership is transferred to the zoo when calling add_animal */
    %apply SWIGTYPE *DISOWN { Animal* animal };
    
    /* Track objects */
    %trackobjects;
    
    /* Specify the mark function */
    %freefunc Zoo "free_Zoo";
    
    %include "example.h"
    
    %header %{
      static void free_Zoo(void* ptr) {
        Zoo* zoo = (Zoo*) ptr;
    
        /* Loop over each animal */
        int count = zoo->get_num_animals();
    
        for(int i = 0; i < count; ++i) {
          /* Get an animal */
          Animal* animal = zoo->get_animal(i);
    
          /* Unlink the Ruby object from the C++ object */
          SWIG_RubyUnlinkObjects(animal);
    
          /* Now remove the tracking for this animal */
          SWIG_RubyRemoveTracking(animal);
        }
    
        /* Now call SWIG_RubyRemoveTracking for the zoo */
        SWIG_RubyRemoveTracking(ptr);
        /* Now free the zoo which will free the animals it contains */
        delete zoo;
      }
    %} 

    Now when we use these objects in IRB we see:

    $irb
    irb(main):002:0> require 'example'
    => true
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0fe8>
    
    irb(main):005:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bda760>
    
    irb(main):006:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> zoo = nil
    => nil
    
    irb(main):008:0> GC.start
    => nil
    
    irb(main):009:0> tiger1.get_name()
    RuntimeError: This Animal * already released
     from (irb):10:in `get_name'
     from (irb):10
    irb(main):011:0>

    Notice that SWIG can now detect the underlying C++ object has been freed, and thus raises a runtime exception.

    This code can be seen in swig/examples/ruby/free_function.

    34.10.6 Embedded Ruby and the C++ Stack

    As has been said, the Ruby GC runs and marks objects before its sweep phase. When the garbage collector is called, it will also try to mark any Ruby objects (VALUE) it finds in the machine registers and in the C++ stack.

    The stack is basically the history of the functions that have been called and also contains local variables, such as the ones you define whenever you do inside a function:

    VALUE obj;

    For ruby to determine where its stack space begins, during initialization a normal Ruby interpreter will call the ruby_init() function which in turn will call a function called Init_stack or similar. This function will store a pointer to the location where the stack points at that point in time.

    ruby_init() is presumed to always be called within the main() function of your program and whenever the GC is called, ruby will assume that the memory between the current location in memory and the pointer that was stored previously represents the stack, which may contain local (and temporary) VALUE ruby objects. Ruby will then be careful not to remove any of those objects in that location.

    So far so good. For a normal Ruby session, all the above is completely transparent and magic to the extensions developer.

    However, with an embedded Ruby, it may not always be possible to modify main() to make sure ruby_init() is called there. As such, ruby_init() will likely end up being called from within some other function. This can lead Ruby to measure incorrectly where the stack begins and can result in Ruby incorrectly collecting those temporary VALUE objects that are created once another function is called. The end result: random crashes and segmentation faults.

    This problem will often be seen in director functions that are used for callbacks, for example.

    To solve the problem, SWIG can now generate code with director functions containing the optional macros SWIG_INIT_STACK and SWIG_RELEASE_STACK. These macros will try to force Ruby to reinitialize the beginning of the stack the first time a director function is called. This will lead Ruby to measure and not collect any VALUE objects defined from that point on.

    To mark functions to either reset the ruby stack or not, you can use:

    %initstack Class::memberfunction;   // only re-init the stack in this director method
    %ignorestack Class::memberfunction; // do not re-init the stack in this director method
    %initstack Class;                   // init the stack on all the methods of this class
    %initstack;                         // all director functions will re-init the stack
    

    35 SWIG and Scilab

    Scilab is a scientific software package for numerical computations providing a powerful open computing environment for engineering and scientific applications that is mostly compatible with MATLAB. More information can be found at www.scilab.org.

    This chapter explains how to use SWIG for Scilab. After this introduction, you should be able to generate with SWIG a Scilab external module from a C/C++ library.

    35.1 Preliminaries

    SWIG for Scilab supports Linux. Other operating systems haven't been tested.

    Scilab is supported from version 5.3.3 onwards. The forthcoming version 6, as of January 2015, is also supported.

    SWIG for Scilab supports C language. C++ is partially supported. See A basic tour of C/C++ wrapping for further details.

    35.2 Running SWIG

    Let's see how to use SWIG for Scilab on a small example.
    In this example we bind from C a function and a global variable into Scilab. The SWIG interface (stored in a file named example.i ), is the following:

    %module example
    
    %inline %{
    double Foo = 3.0;
    
    int fact(int n) {
      if (n < 0) {
        return 0;
      }
      else if (n == 0) {
        return 1;
      }
      else {
        return n * fact(n-1);
      }
    }
    %}
    

    Note: a code in an %inline section is both parsed and wrapped by SWIG, and inserted as is in the wrapper source file.

    35.2.1 Generating the module

    The module is generated using the swig executable and its -scilab option.

    $ swig -scilab example.i
    

    This command generates two files:

    • example_wrap.c: a C source file containing the wrapping code and also here the wrapped code (the fact() and Foo definitions)
    • loader.sce: a Scilab script used to load the module into Scilab

    Note: if the following error is returned:

    :1: Error: Unable to find 'swig.swg'
    :3: Error: Unable to find 'scilab.swg'
    

    it may be because the SWIG library is not found. Check the SWIG_LIB environment variable or your SWIG installation.

    Note: SWIG for Scilab can work in two modes related to the way the module is built, see the Building modes section for details. This example uses the builder mode.

    The swig executable has several other command line options you can use. See Scilab command line options for further details.

    35.2.2 Building the module

    To be loaded in Scilab, the wrapper has to be built into a dynamic module (or shared library).

    The commands to compile and link the wrapper (with gcc) into the shared library libexample.so are:

    $ gcc -fPIC -c -I/usr/local/include/scilab example_wrap.c
    $ gcc -shared example_wrap.o -o libexample.so
    

    Note: we supposed in this example that the path to the Scilab include directory is /usr/local/include/scilab (which is the case in a Debian environment), this should be changed for another environment.

    35.2.3 Loading the module

    Loading a module is done by running the loader script in Scilab:

    --> exec loader.sce
    

    Scilab should output the following messages:

    Shared archive loaded.
    Link done.
    

    which means that Scilab has successfully loaded the shared library. The module functions and other symbols are now available in Scilab.

    35.2.4 Using the module

    In Scilab, the function fact() is simply called as following:

    --> fact(5)
    ans  =
    
        120.
    

    For the Foo global variable, the accessors need to be used:

    --> Foo_get
    ans  =
    
        3.
    
    --> Foo_set(4);
    
    --> Foo_get
    ans  =
    
        4.
    

    Note: for conciseness, we assume in the subsequent Scilab code examples that the modules have been beforehand built and loaded in Scilab.

    35.2.5 Scilab command line options

    The following table lists the Scilab specific command line options in addition to the generic SWIG options:

    -builderGenerate the Scilab builder script
    -buildercflags <cflags>Add <cflags> to the builder compiler flags
    -builderldflags <ldflags>Add <ldlags> to the builder linker flags
    -buildersources <files>Add the (comma separated) files <files> to the builder sources
    -builderverbositylevel <level>Set the build verbosity level to <level> (default 0: off, 2: high)
    -builderflagscript <file>Use the Scilab script <file> to configure the compiler and linker flags
    -gatewayxml <gateway_id>Generate the gateway XML with the given <gateway_id>
    -targetversionGenerate for Scilab target (major) version

    These options can be displayed with:

    $ swig -scilab -help
    

    35.3 A basic tour of C/C++ wrapping

    35.3.1 Overview

    SWIG for Scilab provides only a low-level C interface for Scilab (see Scripting Languages for the general approach to wrapping). This means that functions, structs, classes, variables, etc... are interfaced through C functions. These C functions are mapped as Scilab functions. There are a few exceptions, such as constants and enumerations, which can be wrapped directly as Scilab variables.

    35.3.2 Identifiers

    In Scilab 5.x, identifier names are composed of 24 characters maximum (this limitation disappears from Scilab 6.0 onwards).
    By default, variable, member, and function names longer than 24 characters are truncated, and a warning is produced for each truncation.

    This can cause ambiguities, especially when wrapping structs/classes, for which the wrapped function name is composed of the struct/class name and field names. In these cases, the %rename directive can be used to choose a different Scilab name.

    Note: truncations can be disabled by specifying the target version 6 of Scilab in the targetversion argument (i.e. -targetversion 6).

    35.3.3 Functions

    Functions are wrapped as new Scilab built-in functions. For example:

    %module example
    
    %inline %{
    int fact(int n) {
      if (n > 1)
        return n * fact(n - 1);
      else
        return 1;
    }
    %}
    

    creates a built-in function fact(n) in Scilab:

    --> fact(4)
    ans  =
    
        24.
    

    35.3.3.1 Argument passing

    In the above example, the function parameter is a primitive type and is marshalled by value. So this function is wrapped without any additional customization. Argument values are converted between C types and Scilab types through type mappings. There are several default type mappings for primitive and complex types, described later in the Scilab typemaps section.

    When a parameter is not passed by value, such as a pointer or reference, SWIG does not know if it is an input, output (or both) parameter. The INPUT, OUTPUT, INOUT typemaps defined in the typemaps.i library can be used to specify this.

    Let's see this on two simple functions: sub() which has an output parameter, and inc(), which as input/output parameter:

    %module example
    
    %include <typemaps.i>
    
    extern void sub(int *INPUT, int *INPUT, int *OUTPUT);
    extern void inc(int *INOUT, int *INPUT);
    
    %{
    void sub(int *x, int *y, int *result) {
      *result = *x - *y;
    }
    void inc(int *x, int *delta) {
      *x = *x + *delta;
    }
    %}
    

    In Scilab, parameters are passed by value. The output (and inout) parameters are returned as the result of the functions:

    --> sub(5, 3)
     ans  =
    
        2.
    
    --> inc(4, 3)
     ans  =
    
        7.
    

    35.3.3.2 Multiple output arguments

    A C function can have several output parameters. They can all be returned as results of the wrapped function as Scilab supports multiple return values from a function when using the typemaps.i library. If the C function itself returns a result, this is returned first before the parameter outputs.

    The example below shows this for a C function returning 2 values and a result:

    %module example
    
    %include <typemaps.i>
    
    int divide(int n, int d, int *OUTPUT, int *OUTPUT);
    
    %{
      int divide(int n, int d, int q*, int *r) {
        if (d != 0) {
          *q = n / d;
          *r = n % d;
          return 1;
        } else {
          return 0;
        }
      }
    %}
    

    --> [ret, q, r] = divide(20, 6)
     r  =
    
        2.
     q  =
    
        3.
     ret  =
    
        1.
    

    35.3.4 Global variables

    Global variables are manipulated through generated accessor functions. For example, for a given Foo global variable, SWIG actually generates two functions: Foo_get() to get the value of Foo, and Foo_set() to set the value. These functions are used as following:

    --> exec loader.sce;
    --> c = Foo_get();
    
    --> Foo_set(4);
    
    --> c
    c =
    
        3.
    
    --> Foo_get()
    ans  =
    
        4.
    

    It works for variables of primitive type, but also for non-primitive types: arrays, and structs/classes which are described later. For now, an example with two global primitive arrays x and y is shown:

    %module example
    
    %inline %{
    int x[10];
    double y[7];
    
    void initArrays()
    {
      int i;
      for (i = 0; i < 10; i++)
        x[i] = 1;
      for (i = 0; i < 7; i++)
        y[i] = 1.0f;
    }
    %}
    

    It works the same:

    --> exec loader.sce
    
    --> initArrays();
    --> x_get()
     ans  =
    
        1.    1.    1.    1.    1.    1.    1.    1.    1.    1.
    
    --> y_set([0:6] / 10);
    --> y_get()
     ans  =
    
        0.    0.1    0.2    0.3    0.4    0.5    0.6
    

    35.3.5 Constants and enumerations

    35.3.5.1 Constants

    There is not any constant in Scilab. By default, C/C++ constants are wrapped as getter functions. For example, for the following constants:

    %module example
    #define    ICONST      42
    #define    FCONST      2.1828
    #define    CCONST      'x'
    #define    CCONST2     '\n'
    #define    SCONST      "Hello World"
    #define    SCONST2     "\"Hello World\""
    

    the following getter functions are generated:

    --> exec loader.sce;
    --> ICONST_get();
     ans  =
    
        42.
    
    --> FCONST_get();
     ans  =
    
        2.1828
    
    --> CCONST_get();
     ans  =
    
        x
    
    --> CCONST2_get();
     ans  =
    
    --> SCONST_get();
     ans  =
    
        Hello World
    
    --> SCONST2_get();
     ans  =
    
        "Hello World"
    
    --> EXPR_get();
     ans  =
    
        48.5484
    
    --> iconst_get();
     ans  =
    
        37.
    
    --> fconst_get();
     ans  =
    
        3.14
    

    There is another mode in which constants are wrapped as Scilab variables. The variables are easier to use than functions, but the drawback is that variables are not constant and so can be modified.

    This mode can be enabled/disabled at any time in the interface file with %scilabconst(), which works like all the other %feature directives. Use the argument value "1" to enable and "0" to disable this mode. For example in this mode the previous constants:

    %module example
    
    %scilabconst(1);
    #define    ICONST      42
    #define    FCONST      2.1828
    #define    CCONST      'x'
    #define    CCONST2     '\n'
    #define    SCONST      "Hello World"
    #define    SCONST2     "\"Hello World\""
    

    are mapped to Scilab variables, with the same name:

    --> exec loader.sce;
    --> ICONST
     ans  =
    
        42
    
    --> FCONST
     ans  =
    
        2.1828
    
    --> CCONST
     ans  =
    
        x
    
    --> CCONST2
     ans  =
    
    --> SCONST
     ans  =
    
        Hello World
    
    --> SCONST2
     ans  =
    
        "Hello World"
    
    --> EXPR
     ans  =
    
        48.5484
    
    --> iconst
     ans  =
    
        37
    
    --> fconst
     ans  =
    
        3.14
    

    35.3.5.2 Enumerations

    The wrapping of enums is the same as for constants. By default, enums are wrapped as getter functions. For example, with the following enumeration:

    %module example
    typedef enum { RED, BLUE, GREEN } color;
    

    a getter function will be generated for each value of the enumeration:

    --> exec loader.sce;
    --> RED_get()
     ans  =
    
        0.
    
    --> BLUE_get()
     ans  =
    
        1.
    
    --> GREEN_get()
     ans  =
    
        2.
    

    The %scilabconst() feature is also available for enumerations:

    %module example
    %scilabconst(1) color;
    typedef enum { RED, BLUE, GREEN } color;
    

    --> exec loader.sce;
    --> RED
     ans  =
    
        0.
    
    --> BLUE
     ans  =
    
        1.
    
    --> GREEN
     ans  =
    
        2.
    
    

    35.3.6 Pointers

    Pointers are supported by SWIG. A pointer can be returned from a wrapped C/C++ function, stored in a Scilab variable, and used in input argument of another C/C++ function.

    Also, thanks to the SWIG runtime which stores information about types, pointer types are tracked between exchanges Scilab and the native code. Indeed pointer types are stored alongside the pointer address. A pointer is mapped to a Scilab structure ( tlist), which contains as fields the pointer address and the pointer type (in fact a pointer to the type information structure in the SWIG runtime).
    Why a native pointer is not mapped to a Scilab pointer (type name: "pointer", type ID: 128) ? The big advantage of mapping to a tlist is that it exposes a new type for the pointer in Scilab, type which can be acessed in Scilab with the typeof function, and manipulated using the overloading mechanism.

    Notes:

    • type tracking needs the SWIG runtime to be first initialized with the appropriate function (see the Module initialization section).
    • for any reason, if a wrapped pointer type is unknown (or if the SWIG runtime is not initialized), SWIG maps it to a Scilab pointer. Also, a Scilab pointer is always accepted as a pointer argument of a wrapped function. The drawaback is that pointer type is lost.

    Following is an example of the wrapping of the C FILE* pointer:

    %module example
    
    %{
    #include <stdio.h>
    %}
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    These functions can be used the same way as in C from Scilab:

    --> example_Init();
    
    --> f = fopen("junk", "w");
    --> typeof(f)
     ans  =
    
      _p_FILE
    
    --> fputs("Hello World", f);
    --> fclose(f);
    

    Note: the type name _p_FILE which means "pointer to FILE".

    The user of a pointer is responsible for freeing it or, like in the example, closing any resources associated with it (just as is required in a C program).

    35.3.6.1 Utility functions

    As a scripting language, Scilab does not provide functions to manipulate pointers. However, in some cases it can be useful, such as for testing or debugging.

    SWIG comes with two pointer utility functions:

    • SWIG_this(): returns the address value of a pointer
    • SWIG_ptr(): creates a pointer from an address value

    Note: a pointer created by SWIG_ptr() does not have any type and is mapped as a Scilab pointer.

    Following we use the utility functions on the previous example:

    --> f = fopen("junk", "w");
    --> fputs("Hello", f);
    --> addr = SWIG_this(f)
     ans  =
    
        8219088.
    
    --> p = SWIG_ptr(addr);
    --> typeof(p)
    ans  =
    
      pointer
    
    --> fputs(" World", p);
    --> fclose(f);
    

    35.3.6.2 Null pointers:

    Using the previous SWIG_this() and SWIG_ptr(), it is possible to create and check null pointers:

    --> p = SWIG_ptr(0);
    --> SWIG_this(p) == 0
     ans  =
    
        T
    

    35.3.7 Structures

    Structs exist in Scilab, but C structs are not (at least in this version of SWIG) mapped to Scilab structs. A C structure is wrapped through low-level accessor functions, i.e. functions that give access to the member variables of this structure. In Scilab, a structure is manipulated through a pointer which is passed as an argument to the accessor functions.

    Let's see it on an example of a struct with two members:

    %module example
    
    %inline %{
    
    typedef struct {
      int x;
      int arr[4];
    } Foo;
    
    %}
    

    Several functions are generated:

    • a constructor function new_Foo() which returns a pointer to a newly created struct Foo.
    • two member getter functions Foo_x_get(), Foo_arr_get() , to get the values of x and y for the struct pointer (provided as the first parameter to these functions)
    • two member setter functions Foo_x_set(), Foo_arr_set() , to set the values of x and y for the struct pointer (provided as the first parameter to these functions).
    • a destructor function delete_Foo() to release the struct pointer.

    Usage example:

    --> f = new_Foo();
    --> Foo_x_set(f, 100);
    --> Foo_x_get(f)
    ans  =
    
        100.
    
    --> Foo_arr_set(f, [0:3]);
    --> Foo_arr_get(f)
    ans  =
    
        0.    1.    2.    3.
    
    --> delete_Foo(f);
    

    Members of a structure that are also structures are also accepted and wrapped as a pointer:

    %module example
    
    %inline %{
    
    typedef struct {
      int x;
    } Bar;
    
    typedef struct {
      Bar b;
    } Foo;
    
    %}
    

    --> b = new_Bar();
    --> Bar_x_set(b, 20.);
    
    --> f = new_Foo();
    --> Foo_b_set(f, b);
    
    --> b2 = Foo_b_get(f);
    --> Bar_x_get(b2);
    ans  =
    
        20.
    

    Note: the pointer to the struct works as described in Pointers. For example, the type of the struct pointer can be get with typeof, as following:

    --> example_Init();
    --> b = new_Bar();
    --> typeof(b)
     ans  =
    
        _p_Bar
    --> delete_Bar(b);
    

    35.3.8 C++ classes

    Classes do not exist in Scilab. The classes are wrapped the same way as structs. Low-level accessor functions are generated for class members. Also, constructor and destructor functions are generated to create and destroy an instance of the class.

    For example, the following class:

    %module example
    
    %inline %{
    
    class Point {
    public:
      int x, y;
      Point(int _x, int _y) : x(_x), y(_y) {}
      double distance(const Point& rhs) {
        return sqrt(pow(x-rhs.x, 2) + pow(y-rhs.y, 2));
      }
      void set(int _x, int _y) {
        x=_x;
        y=_y;
      }
    };
    
    %}
    

    can be used in Scilab like this:

    --> p1 = Point_new(3, 5);
    --> p2 = Point_new(1, 2);
    --> p1.distance(p2)
    ans  =
    
        3.6056
    
    --> delete_Point(p1);
    --> delete_Point(p2);
    

    Note: like structs, class pointers are mapped as described in Pointers. Let's give an example which shows that each class pointer type is a new type in Scilab that can be used for example (through overloading) to implement a custom print for the Point class:

    --> function %_p_Point_p(p)
    -->     mprintf('[%d, %d]\n', Point_x_get(p), Point_y_get(p));
    --> endfunction
    
    --> example_Init();
    --> p = new_Point(1, 2)
     p  =
    
    [1, 2]
    
    --> delete_Point(p);
    

    35.3.9 C++ inheritance

    Inheritance is supported. SWIG knows the inheritance relationship between classes.

    A function is only generated for the class in which it is actually declared. But if one of its parameters is a class, any instance of a derived class is accepted as the argument.

    This mechanism also applies for accessor functions: they are generated only in the class in which they are defined. But any instance of a derived class can be used as the argument to these accessor functions.

    For example, let's take a base class Shape and two derived classes Circle and Square:

    %module example
    
    %inline %{
    
    class Shape {
    public:
      double x, y;
      void set_location(double _x, double _y) { x = _x; y = _y; }
      virtual double get_perimeter() { return 0; };
    };
    
    class Circle : public Shape {
    public:
      int radius;
      Circle(int _radius): radius(_radius) {};
      virtual double get_perimeter() { return 6.28 * radius; }
    };
    
    class Square : public Shape {
    public:
      int size;
      Square(int _size): size(_size) {};
      virtual double get_perimeter() { return 4 * size; }
    };
    
    %}
    

    To set the location of the Circle, we have to use the function set_location() of the parent Shape. But we can use either use the get_perimeter() function of the parent class or the derived class:

    --> c = new_Circle(3);
    
    --> Shape_set_location(c, 2, 3);
    --> Shape_x_get(c)
     ans  =
    
        2.
    
    --> Circle_get_perimeter(c)
     ans  =
    
        18.84
    
    --> Shape_get_perimeter(c)
     ans  =
    
        18.84
    

    35.3.10 C++ overloading

    As explained in Overloaded functions and methods SWIG provides support for overloaded functions and constructors.

    As SWIG knows pointer types, the overloading works also with pointer types, here is an example with a function magnify overloaded for the previous classes Shape and Circle:

    %module example
    
    void magnify(Square *square, double factor) {
      square->size *= factor;
    };
    
    void magnify(Circle *circle, double factor) {
      square->radius *= factor;
    };
    
    --> example_Init();
    --> c = new_Circle(3);
    --> s = new_Square(2);
    
    --> magnify(c, 10);
    --> Circle_get_radius(c)
     ans  =
    
       30;
    --> magnify(s, 10);
    --> Square_get_size(s)
     ans  =
    
       20;
    

    35.3.11 Pointers, references, values, and arrays

    In C++ objects can be passed by value, pointer, reference, or by an array:

    %module example
    
    %{
    #include <sciprint.h>
    %}
    
    %inline %{
    
    class Foo {
    public:
      Foo(int _x) : x(_x) {}
      int x;
    };
    
    void spam1(Foo *f)  { sciprint("%d\n", f->x); }   // Pass by pointer
    void spam2(Foo &f)  { sciprint("%d\n", f.x); }    // Pass by reference
    void spam3(Foo f)   { sciprint("%d\n", f.x); }    // Pass by value
    void spam4(Foo f[]) { sciprint("%d\n", f[0].x); } // Array of objects
    
    %}
    

    In SWIG, there is no real distinction between these. So in Scilab, it is perfectly legal to do this:

    --> f = new_Foo()
    --> spam1(f)
    3
    --> spam2(f)
    3
    --> spam3(f)
    3
    --> spam4(f)
    3
    

    Similar behaviour occurs for return values. For example, if you had functions like this:

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    All these functions will return a pointer to an instance of Foo . As the function spam7 returns a value, new instance of Foo has to be allocated, and a pointer on this instance is returned.

    35.3.12 C++ templates

    As in other languages, function and class templates are supported in SWIG Scilab.

    You have to tell SWIG to create wrappers for a particular template instantiation. The %template directive is used for this purpose. For example:

    %module example
    
    template<class T1, class T2, class T3>
    struct triplet {
      T1 first;
      T2 second;
      T3 third;
      triplet(const T1& a, const T2& b, const T3& c) {
        third = a; second = b; third = c;
      }
    };
    
    %template(IntTriplet) triplet<int, int, int>;
    

    Then in Scilab:

    --> t = new_IntTriplet(3, 4, 1);
    
    --> IntTriplet_first_get(t)
     ans  =
    
        3.
    
    --> IntTriplet_second_get(t)
     ans  =
    
        4.
    
    --> IntTriplet_third_get(t)
     ans  =
    
        1.
    
    --> delete_IntTriplet(t);
    

    More details on template support can be found in the templates documentation.

    35.3.13 C++ operators

    C++ operators are partially supported. Operator overloading exists in Scilab, but a C++ operator is not (in this version) wrapped by SWIG as a Scilab operator, but as a function. It is not automatic, you have to rename each operator (with the instruction %rename) with the suitable wrapper name.

    Let's see it with an example of class with two operators + and double():

    %module example
    
    %rename(plus) operator +;
    %rename(toDouble) operator double();
    
    %inline %{
    
    class Complex {
    public:
      Complex(double re, double im) : real(re), imag(im) {};
    
      Complex operator+(const Complex& other) {
        double result_real = real + other.real;
        double result_imaginary = imag + other.imag;
        return Complex(result_real, result_imaginary);
      }
      operator double() { return real; }
    private:
      double real;
      double imag;
    };
    
    %}
    

    --> c1 = new_Complex(3, 7);
    
    --> c2 = Complex_plus(c, new_Complex(1, 1));
    
    --> Complex_toDouble(c2)
     ans  =
    
        4.
    

    35.3.14 C++ namespaces

    SWIG is aware of C++ namespaces, but does not use it for wrappers. The module is not broken into submodules, nor do namespace appear in functions names. All the namespaces are all flattened in the module. For example with one namespace Foo:

    %module example
    
    %inline %{
    
    namespace foo {
      int fact(int n) {
        if (n > 1)
          return n * fact(n-1);
        else
          return 1;
      }
    
      struct Vector {
        double x, y, z;
      };
    };
    
    %}
    
    

    In Scilab, there is no need to the specify the Foo namespace:

    --> fact(3)
     ans  =
    
       6.
    
    --> v = new_Vector();
    --> Vector_x_set(v, 3.4);
    --> Vector_y_get(v)
     ans  =
    
       0.
    

    If your program has more than one namespace, name conflicts can be resolved using %rename. For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    Note: the nspace feature is not supported.

    35.3.15 C++ exceptions

    Scilab does not natively support exceptions, but has errors. When an exception is thrown, SWIG catches it, and sets a Scilab error. An error message is displayed in Scilab. For example:

    %module example
    
    %inline %{
    void throw_exception() throw(char const *) {
      throw "Bye world !";
    }
    %}
    

    -->throw_exception()
      !--error 999
    SWIG/Scilab: Exception (char const *) occurred: Bye world !
    

    Scilab has a try-catch mechanism (and a similar instruction execstr()) to handle exceptions. It can be used with the lasterror() function as following:

    --> execstr('throw_exception()', 'errcatch');
     ans  =
    
        999.
    
    --> lasterror()
     ans  =
    
        SWIG/Scilab: Exception (char const *) occurred: Bye world !
    

    If the function has a throw exception specification, SWIG can automatically map the exception type and set an appropriate Scilab error message. It works for a few primitive types, and also for STL exceptions (the library std_except.i has to be included to get the STL exception support):

    %module example
    
    %include <std_except.i>
    
    %inline %{
    void throw_int() throw(int) {
      throw 12;
    }
    
    void throw_stl_invalid_arg(int i) throw(std::invalid_argument) {
      if (i < 0)
        throw std::invalid_argument("argument is negative.");
    }
    %}
    

    --> throw_int();
                !--error 999
    SWIG/Scilab: Exception (int) occurred: 12
    
    -->throw_stl_invalid_arg(-1);
                              !--error 999
    SWIG/Scilab: ValueError: argument is negative.
    

    More complex or custom exception types require specific exception typemaps to be implemented in order to specifically handle a thrown type. See the SWIG C++ documentation for more details.

    35.3.16 C++ STL

    The Standard Template Library (STL) is partially supported. See STL for more details.

    35.4 Type mappings and libraries

    35.4.1 Default primitive type mappings

    The following table provides the equivalent Scilab type for C/C++ primitive types.

    C/C++ typeScilab type
    boolboolean
    charstring
    signed chardouble or int8
    unsigned chardouble or uint8
    shortdouble or int16
    unsigned shortdouble or uint16
    intdouble or int32
    unsigned intdouble or uint32
    longdouble or int32
    unsigned longdouble or uint32
    signed long longnot supported in Scilab 5.x
    unsigned long longnot supported in Scilab 5.x
    floatdouble
    doubledouble
    char * or char[]string

    Notes:

    • In Scilab the double type is far more used than any integer type. This is why integer values (int32, uint32, ...) are automatically converted to Scilab double values when marshalled from C into Scilab. Additionally on input to a C function, Scilab double values are converted into the related integer type.
    • When an integer is expected, if the input is a double, the value must be an integer, i.e. it must not have any decimal part, otherwise a SWIG value error occurs.
    • In SWIG for Scilab 5.x, the long long type is not supported, since Scilab 5.x does not have a 64-bit integer type. The default behaviour is for SWIG to generate code that will give a runtime error if long long type arguments are used from Scilab.

    35.4.2 Arrays

    Typemaps are available by default for arrays. Primitive type arrays are automatically converted to/from Scilab matrices. Typemaps are also provided to handle members of a struct or class that are arrays.

    In input, the matrix is usually one-dimensional (it can be either a row or column vector). But it can also be a two-dimensional matrix. Warning: in Scilab, the values are column-major ordered, unlike in C, which is row-major ordered.

    The type mappings used for arrays is the same for primitive types, described earlier. This means that, if needed, a Scilab double vector is converted in input into the related C integer array and this C integer array is automatically converted on output into a Scilab double vector. Note that unlike scalars, no control is done for arrays when a double is converted into an integer.

    The following example illustrates all this:

    %module example
    
    %#include <stdio.h>
    
    %inline %{
    
    void printArray(int values[], int len) {
      int i = 0;
      for (i = 0; i < len; i++) {
        printf("%s %d %s", i==0?"[":"", values[i], i==len-1?"]\n":"");
      }
    }
    %}
    

    --> printArray([0 1 2 3], 4)
    [ 0  1  2  3 ]
    
    --> printArray([0.2; -1.8; 2; 3.7], 4)
    [ 0  -1  2  3 ]
    
    --> printArray([0 1; 2 3], 4)
    [ 0  2  1  3 ]
    
    --> printArray([0; 1; 2; 3], 4)
    [ 0  1  2  3 ]
    

    35.4.3 Pointer-to-pointers

    There are no specific typemaps for pointer-to-pointers, they are mapped as pointers in Scilab.

    Pointer-to-pointers are sometimes used to implement matrices in C. The following is an example of this:

    %module example
    %inline %{
    
    // Returns the matrix [1 2; 3 4];
    double **create_matrix() {
      double **M;
      int i;
      M = (double **) malloc(2 * sizeof(double *));
      for (i = 0; i < 2; i++) {
        M[i] = (double *) malloc(2 * sizeof(double));
        M[i][0] = 2 * i + 1;
        M[i][1] = 2 * i + 2;
      }
      return M;
    }
    
    // Gets the item M(i, j) value
    double get_matrix(double **M, int i, int j) {
      return M[i][j];
    }
    
    // Sets the item M(i, j) value to be val
    void set_matrix(double **M, int i, int j, double val) {
      M[i][j] = val;
    }
    
    // Prints a matrix (2, 2) to console
    void print_matrix(double **M, int nbRows, int nbCols) {
      int i, j;
      for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++) {
          printf("%3g ", M[i][j]);
        }
        printf("\n");
      }
    }
    
    %}
    

    These functions are used like this in Scilab:

    --> m = create_matrix();
    
    --> print_matrix(m);
       1.   2.
       3.   4.
    
    --> set_matrix(m, 1, 1, 5.);
    
    --> get_matrix(m, 1, 1)
     ans  =
    
        5.
    

    35.4.4 Matrices

    The matrix.i library provides a set of typemaps which can be useful when working with one-dimensional and two-dimensional matrices.

    In order to use this library, just include it in the interface file:

      %include <matrix.i>
    

    Several typemaps are available for the common Scilab matrix types:

    • double
    • int
    • char *
    • bool

    For example: for a matrix of int, we have the typemaps, for input:

    • (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT)
    • (int IN_ROWCOUNT, int IN_COLCOUNT, int *IN)
    • (int *IN, int IN_SIZE)
    • (int IN_SIZE, int *IN)

    and output:

    • (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT)
    • (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT)
    • (int **OUT, int *OUT_SIZE)
    • (int *OUT_SIZE, int **OUT)

    They marshall a Scilab matrix type into the appropriate 2 or 3 C parameters. The following is an example using the typemaps in this library:

    %module example
    
    %include <matrix.i>
    
    %apply (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { (int *matrix, int matrixNbRow, int matrixNbCol) };
    %apply (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { (int **outMatrix, int *outMatrixNbRow, int *outMatrixNbCol) };
    
    %inline %{
    
    void absolute(int *matrix, int matrixNbRow, int matrixNbCol,
      int **outMatrix, int *outMatrixNbRow, int *outMatrixNbCol) {
      int i, j;
      *outMatrixNbRow = matrixNbRow;
      *outMatrixNbCol = matrixNbCol;
      *outMatrix = malloc(matrixNbRow * matrixNbCol * sizeof(int));
      for (i=0; i < matrixNbRow * matrixNbCol; i++) {
        (*outMatrix)[i] = matrix[i] > 0 ? matrix[i]:-matrix[i];
      }
    }
    
    %}
    

    --> absolute([-0 1 -2; 3 4 -5])
     ans  =
    
        0.    1.    2.
        3.    4.    5.
    

    The remarks made earlier for arrays also apply here:

    • The values of matrices in Scilab are column-major orderered,
    • There is no control while converting double values to integers, double values are truncated without any checking or warning.

    35.4.5 STL

    The STL library wraps some containers defined in the STL (Standard Template Library), so that they can be manipulated in Scilab. This library also provides the appropriate typemaps to use the containers in functions and variables.

    The list of wrapped sequence containers are:

    • std::vector
    • std::list
    • std::deque

    And associative containers are:

    • std::set
    • std::multiset

    Typemaps are available for the following container types:

    • double
    • float
    • int
    • string
    • bool
    • pointer

    Containers of other item types are not supported. Using them does not break compilation, but provokes a runtime error. Containers of enum are not supported yet.

    In order to use the STL, the library must first be included in the SWIG interface file:

    %include <stl.i>
    

    Then for each container used, the appropriate template must be instantiated, in the std namespace:

    namespace std {
        %template(IntVector)    vector<int>;
        %template(DoubleVector) vector<double>;
    }
    

    Additionally, the module initialization function has to be executed first in Scilab, so that all the types are known to Scilab. See the Module initialization section for more details.

    Because in Scilab matrices exist for basic types only, a sequence container of pointers is mapped to a Scilab list. For other item types (double, int, string...) the sequence container is mapped to a Scilab matrix.

    The first example below shows how to create a vector (of int ) in Scilab, add some values to the vector and pass it as an argument of a function. It also shows, thanks to the typemaps, that we can also pass a Scilab matrix of values directly into the function:

    %module example
    
    %include <stl.i>
    
    namespace std {
      %template(IntVector) vector<int>;
    }
    
    %{
    #include <numeric>
    %}
    
    %inline %{
    
    double average(std::vector<int> v) {
      return std::accumulate(v.begin(), v.end(), 0.0) / v.size();
    }
    
    %}
    

    --> example_Init();
    
    --> v = new_IntVector();
    
    --> for i = 1:4
    -->     IntVector_push_back(v, i);
    --> end;
    
    --> average(v)
     ans  =
    
        2.5
    
    --> average([0 1 2 3])
     ans  =
    
        2.5
    
    --> delete_IntVector();
    

    In the second example, a set of struct (Person) is wrapped. A function performs a search in this set, and returns a subset. As one can see, the result in Scilab is a list of pointers:

    %module example
    
    %include <stl.i>
    
    %{
    #include <string>
    %}
    
    %inline %{
    
    struct Person {
      Person(std::string _name, int _age) : name(_name), age(_age) {};
      std::string name;
      int age;
    };
    typedef Person * PersonPtr;
    
    %}
    
    namespace std {
      %template(PersonPtrSet) set<PersonPtr>;
    }
    
    %inline %{
    
    std::set<PersonPtr> findPersonsByAge(std::set<PersonPtr> persons, int minAge, int maxAge) {
      std::set<PersonPtr> foundPersons;
      for (std::set<PersonPtr>::iterator it = persons.begin(); it != persons.end(); it++) {
        if (((*it)->age >= minAge) && ((*it)->age <= maxAge)) {
          foundPersons.insert(*it);
        }
      }
      return foundPersons;
    }
    
    %}
    

    --> example_Init();
    
    --> joe = new_Person("Joe", 25);
    --> susan = new_Person("Susan", 32);
    --> bill = new_Person("Bill", 50);
    
    --> p = new_PersonPtrSet();
    --> PersonPtrSet_insert(p, susan);
    --> PersonPtrSet_insert(p, joe);
    --> PersonPtrSet_insert(p, bill);
    
    --> l = findPersonsByAge(p, 20, 40);
    
    --> size(l)
     ans  =
    
        2.
    
    --> Person_name_get(l(1))
    ans  =
    
        Susan
    
    --> Person_name_get(l(2))
     ans  =
    
        Joe
    
    --> delete_PersonPtrSet(p);
    

    35.5 Module initialization

    The wrapped module contains an initialization function to:

    • initialize the SWIG runtime, needed for pointer type tracking or when working with the STL
    • initialize the module constants and enumerations declared with %scilabconst()

    This initialization function should be executed at the start of a script, before the wrapped library has to be used.

    The function has the name of the module suffixed by _Init. For example, to initialize the module example:

    --> example_Init();
    

    35.6 Building modes

    The mechanism to load an external module in Scilab is called Dynamic Link and works with dynamic modules (or shared libraries, .so files).

    To produce a dynamic module, when generating the wrapper, there are two possibilities, or build modes:

    • the nobuilder mode, this is the default mode in SWIG. The user is responsible of the build.
    • the builder mode. In this mode, Scilab is responsible of building.

    35.6.1 No-builder mode

    In this mode, used by default, SWIG generates the wrapper sources, which have to be manually compiled and linked. A loader script loader.sce is also produced, this one is executed further in Scilab to load the module.

    This mode is the best option to use when you have to integrate the module build into a larger build process.

    35.6.2 Builder mode

    In this mode, in addition to the wrapper sources, SWIG produces a builder Scilab script (builder.sce), which is executed in Scilab to build the module. In a few words, the Scilab ilib_build() command is used, which produces the shared library file, and the loader script loader.sce (and also a cleaner script cleaner.sce ).

    An advantage of this mode is that it hides all the complexity of the build and other platform issues. Also it allows the module to conform to a Scilab external module convention which is that an external module should be simply built by calling a builder script.

    The builder mode is activated with the -builder SWIG option. In this mode, the following SWIG options may be used to setup the build:

    • -buildersources: to add sources to the build (several files must be separated by a comma)
    • -buildercflags: to add flags to the builder compiler flags, for example to set library dependencies include paths
    • -builderldflags: to add flags to the linker flags, for example to set library dependency names and paths

    Let's give an example how to build a module example, composed of two sources, and using a library dependency:

    • the sources are baa1.c and baa2.c (and are stored in the current directory)
    • the library is libfoo in /opt/foo (headers stored in /opt/foo/include, and shared library in /opt/foo/lib )

    The command is:

    $ swig -scilab -builder -buildercflags -I/opt/foo/include -builderldflags "-L/opt/foo/lib -lfoo" -buildersources baa1.cxx, baa2.cxx example.i
    

    35.7 Generated scripts

    In this part we give some details about the generated Scilab scripts.

    35.7.1 Builder script

    builder.sce is the name of the builder script generated by SWIG in builder mode. It contains code like this:

    ilib_name = "examplelib";
    files = ["example_wrap.c"];
    libs = [];
    table = ["fact", "_wrap_fact";"Foo_set", "_wrap_Foo_set";"Foo_get", "_wrap_Foo_get";];
    ilib_build(ilib_name, table, files, libs);
    

    ilib_build(lib_name, table, files, libs) is used to create shared libraries, and to generate a loader file used to dynamically load the shared library into Scilab.

    • ilib_name: a character string, the generic name of the library without path and extension.
    • files: string matrix containing objects files needed for shared library creation.
    • libs: string matrix containing extra libraries needed for shared library creation.
    • table: two column string matrix containing a table of pairs of 'scilab function name', 'C function name'.

    35.7.2 Loader script

    The loader script is used to load in Scilab all the module functions. When loaded, these functions can be used as other Scilab functions.

    The loader script loader.sce contains code similar to:

    // ------------------------------------------------------
    // generated by builder.sce: Please do not edit this file
    // ------------------------------------------------------
    
    libexamplelib_path = get_file_path('loader.sce');
    list_functions = [             'fact';
                'Foo_set';
                'Foo_get';
    ];
    addinter(libexamplelib_path+'/libexamplelib.so', 'libexamplelib', list_functions);
    // remove temp. variables on stack
    clear libexamplelib_path;
    clear list_functions;
    clear get_file_path;
    // ------------------------------------------------------
    

    addinter(files, spname, fcts) performs dynamic linking of a compiled C interface function.

    • files: a character string or a vector of character strings defining the object files (containing the C interface functions) to link with.
    • spname: a character string. Name of interface routine entry point.
    • fcts: vector of character strings. The name of new Scilab function.

    35.8 Other resources

    • Example use cases can be found in the Examples/scilab directory.
    • The test suite in the Examples/test-suite/scilab can be another source of useful use cases.
    • The Scilab API is used in the generated code and is a useful reference when examining the output.
    • This guide describes the Scilab external modules structure and files, in particular the files that are generated by SWIG for Scilab.

    36 SWIG and Tcl

    Caution: This chapter is under repair!

    This chapter discusses SWIG's support of Tcl. SWIG currently requires Tcl 8.0 or a later release. Earlier releases of SWIG supported Tcl 7.x, but this is no longer supported.

    36.1 Preliminaries

    To build a Tcl module, run SWIG using the -tcl or -tcl8 option :

    $ swig -tcl example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -tcl example.i
    

    This creates a file example_wrap.c or example_wrap.cxx that contains all of the code needed to build a Tcl extension module. To finish building the module, you need to compile this file and link it with the rest of your program.

    36.1.1 Getting the right header files

    In order to compile the wrapper code, the compiler needs the tcl.h header file. This file is usually contained in the directory

    /usr/local/include
    

    Be aware that some Tcl versions install this header file with a version number attached to it. If this is the case, you should probably make a symbolic link so that tcl.h points to the correct header file.

    36.1.2 Compiling a dynamic module

    The preferred approach to building an extension module is to compile it into a shared object file or DLL. Assuming you have code you need to link to in a file called example.c, you will need to compile your program using commands like this (shown for Linux):

    $ swig -tcl example.i
    $ gcc -fPIC -c example.c
    $ gcc -fPIC -c example_wrap.c -I/usr/local/include
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The exact commands for doing this vary from platform to platform. SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/tcl directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the output file has to match the name of the module. If the name of your SWIG module is "example ", the name of the corresponding object file should be "example.so ". The name of the module is specified using the %module directive or the -module command line option.

    36.1.3 Static linking

    An alternative approach to dynamic linking is to rebuild the Tcl interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Tcl involves writing a special function Tcl_AppInit() and using it to initialize the interpreter and your module. With SWIG, the tclsh.i and wish.i library files can be used to rebuild the tclsh and wish interpreters respectively. For example:

    %module example
    
    %inline %{
    extern int fact(int);
    extern int mod(int, int);
    extern double My_variable;
    %}
    
    %include "tclsh.i"       // Include code for rebuilding tclsh
    
    

    The tclsh.i library file includes supporting code that contains everything needed to rebuild tclsh. To rebuild the interpreter, you simply do something like this:

    $ swig -tcl example.i
    $ gcc example.c example_wrap.c \
            -Xlinker -export-dynamic \
            -DHAVE_CONFIG_H -I/usr/local/include/ \
            -L/usr/local/lib -ltcl -lm -ldl \
            -o mytclsh
    
    

    You will need to supply the same libraries that were used to build Tcl the first time. This may include system libraries such as -lsocket, -lnsl, and -lpthread. If this actually works, the new version of Tcl should be identical to the default version except that your extension module will be a built-in part of the interpreter.

    Comment: In practice, you should probably try to avoid static linking if possible. Some programmers may be inclined to use static linking in the interest of getting better performance. However, the performance gained by static linking tends to be rather minimal in most situations (and quite frankly not worth the extra hassle in the opinion of this author).

    36.1.4 Using your module

    To use your module, simply use the Tcl load command. If all goes well, you will be able to this:

    $ tclsh
    % load ./example.so
    % fact 4
    24
    %
    

    A common error received by first-time users is the following:

    % load ./example.so
    couldn't find procedure Example_Init
    % 
    

    This error is almost always caused when the name of the shared object file doesn't match the name of the module supplied using the SWIG %module directive. Double-check the interface to make sure the module name and the shared object file match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

    Another common error is something similar to the following:

    % load ./example.so
    couldn't load file "./example.so": ./example.so: undefined symbol: fact
    % 
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o example.so
    

    If the foo library is compiled as a shared library, you might get the following problem when you try to use your module:

    % load ./example.so
    couldn't load file "./example.so": libfoo.so: cannot open shared object file:
    No such file or directory
    %        
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To fix this problem, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib \
          -o example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Tcl, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib tclsh
    

    Finally, you can use a command such as ldconfig to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    36.1.5 Compilation of C++ extensions

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Tcl interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    % swig -c++ -tcl example.i
    % g++ -fPIC -c example.cxx
    % g++ -fPIC -c example_wrap.cxx -I/usr/local/include
    % g++ -shared example.o example_wrap.o -o example.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    % swig -c++ -tcl example.i
    % CC -KPIC -c example.cxx
    % CC -KPIC -c example_wrap.cxx -I/usr/local/include
    % CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o example.so -lCrun
    

    Of course, the extra libraries to use are completely non-portable---you will probably need to do some experimentation.

    Sometimes people have suggested that it is necessary to relink the Tcl interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Tcl.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    As a final complication, a major weakness of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Tcl, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. If working with lots of software components, you might want to investigate using a more formal standard such as COM.

    36.1.6 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Tcl executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    36.1.7 Setting a package prefix

    To avoid namespace problems, you can instruct SWIG to append a package prefix to all of your functions and variables. This is done using the -prefix option as follows :

    swig -tcl -prefix Foo example.i
    

    If you have a function "bar" in the SWIG file, the prefix option will append the prefix to the name when creating a command and call it "Foo_bar".

    36.1.8 Using namespaces

    Alternatively, you can have SWIG install your module into a Tcl namespace by specifying the -namespace option :

    swig -tcl -namespace example.i
    

    By default, the name of the namespace will be the same as the module name, but you can override it using the -prefix option.

    When the -namespace option is used, objects in the module are always accessed with the namespace name such as Foo::bar.

    36.2 Building Tcl/Tk Extensions under Windows 95/NT

    Building a SWIG extension to Tcl/Tk under Windows 95/NT is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into tclsh or wish. This section covers the process of using SWIG with Microsoft Visual C++. although the procedure may be similar with other compilers.

    36.2.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly follows these steps :

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -tcl -o $(ProjDir)\$(InputName)_wrap.c $(InputPath) " in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Tcl installation under "Additional include directories".
    • Finally, select the settings for the entire project and go to "Link Options". Add the Tcl library file to your link libraries. For example "tcl80.lib". Also, set the name of the output file to match the name of your Tcl module (ie. example.dll).
    • Build your project.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Tcl extension, simply run tclsh or wish and use the load command. For example :

    MSDOS > tclsh80
    % load example.dll
    % fact 4
    24
    %
    

    36.2.2 Using NMAKE

    Alternatively, SWIG extensions can be built by writing a Makefile for NMAKE. To do this, make sure the environment variables for MSVC++ are available and the MSVC++ tools are in your path. Now, just write a short Makefile like this :

    # Makefile for building various SWIG generated extensions
    
    SRCS          = example.c
    IFILE         = example
    INTERFACE     = $(IFILE).i
    WRAPFILE      = $(IFILE)_wrap.c
    
    # Location of the Visual C++ tools (32 bit assumed)
    
    TOOLS         = c:\msdev
    TARGET        = example.dll
    CC            = $(TOOLS)\bin\cl.exe
    LINK          = $(TOOLS)\bin\link.exe
    INCLUDE32     = -I$(TOOLS)\include
    MACHINE       = IX86
    
    # C Library needed to build a DLL
    
    DLLIBC        = msvcrt.lib oldnames.lib  
    
    # Windows libraries that are apparently needed
    WINLIB        = kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib 
    winspool.lib
    
    # Libraries common to all DLLs
    LIBS          = $(DLLIBC) $(WINLIB) 
    
    # Linker options
    LOPT      = -debug:full -debugtype:cv /NODEFAULTLIB /RELEASE /NOLOGO /
    MACHINE:$(MACHINE) -entry:_DllMainCRTStartup@12 -dll
    
    # C compiler flags
    
    CFLAGS    = /Z7 /Od /c /nologo
    TCL_INCLUDES  = -Id:\tcl8.0a2\generic -Id:\tcl8.0a2\win
    TCLLIB        = d:\tcl8.0a2\win\tcl80.lib
    
    tcl:
            ..\..\swig -tcl -o $(WRAPFILE) $(INTERFACE)
            $(CC) $(CFLAGS) $(TCL_INCLUDES) $(SRCS) $(WRAPFILE)
            set LIB=$(TOOLS)\lib
            $(LINK) $(LOPT) -out:example.dll $(LIBS) $(TCLLIB) example.obj example_wrap.obj
    
    

    To build the extension, run NMAKE (you may need to run vcvars32 first). This is a pretty minimal Makefile, but hopefully its enough to get you started. With a little practice, you'll be making lots of Tcl extensions.

    36.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Tcl interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped in an interface that mimics the style of Tk widgets and [incr Tcl] classes. This section briefly covers the essential aspects of this wrapping.

    36.3.1 Modules

    The SWIG %module directive specifies the name of the Tcl module. If you specify `%module example', then everything is compiled into an extension module example.so. When choosing a module name, make sure you don't use the same name as a built-in Tcl command.

    One pitfall to watch out for is module names involving numbers. If you specify a module name like %module md5, you'll find that the load command no longer seems to work:

    % load ./md5.so
    couldn't find procedure Md_Init
    

    To fix this, supply an extra argument to load like this:

    % load ./md5.so md5
    

    36.3.2 Functions

    Global functions are wrapped as new Tcl built-in commands. For example,

    %module example
    int fact(int n);
    

    creates a built-in function fact that works exactly like you think it does:

    % load ./example.so
    % fact 4
    24
    % set x [fact 6]
    %
    

    36.3.3 Global variables

    C/C++ global variables are wrapped by Tcl global variables. For example:

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern double density;
    %}
    ...
    

    Now look at the Tcl interface:

    % puts $density          # Output value of C global variable
    1.0
    % set density 0.95       # Change value
    

    If you make an error in variable assignment, you will get an error message. For example:

    % set density "hello"
    can't set "density": Type error. expected a double.
    %
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    36.3.4 Constants and enums

    C/C++ constants are installed as global Tcl variables containing the appropriate value. To create a constant, use #define, enum , or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    enum Beverage { ALE, LAGER, STOUT, PILSNER };
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    For enums, make sure that the definition of the enumeration actually appears in a header file or in the wrapper file somehow---if you just stick an enum in a SWIG interface without also telling the C compiler about it, the wrapper code won't compile.

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using the cvar object described in the previous section. They are not wrapped as constants. For further discussion about this, see the SWIG Basics chapter.

    Constants are not guaranteed to remain constant in Tcl---the value of the constant could be accidentally reassigned.You will just have to be careful.

    A peculiarity of installing constants as variables is that it is necessary to use the Tcl global statement to access constants in procedure bodies. For example:

    proc blah {} {
      global FOO
      bar $FOO
    }
    

    If a program relies on a lot of constants, this can be extremely annoying. To fix the problem, consider using the following typemap rule:

    %apply int CONSTANT { int x };
    #define FOO 42
    ...
    void bar(int x);
    

    When applied to an input argument, the CONSTANT rule allows a constant to be passed to a function using its actual value or a symbolic identifier name. For example:

    proc blah {} {
      bar FOO
    }
    

    When an identifier name is given, it is used to perform an implicit hash-table lookup of the value during argument conversion. This allows the global statement to be omitted.

    36.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Tcl. For example:

    % load ./example.so
    % set f [fopen junk w]
    % fputs "Hello World\n" $f
    % fclose $f
    

    If this makes you uneasy, rest assured that there is no deep magic involved. Underneath the covers, pointers to C/C++ objects are simply represented as opaque values--normally an encoded character string like this:

    % puts $f
    _c0671108_p_FILE
    % 
    

    This pointer value can be freely passed around to different C functions that expect to receive an object of type FILE *. The only thing you can't do is dereference the pointer from Tcl.

    The NULL pointer is represented by the string NULL.

    As much as you might be inclined to modify a pointer value directly from Tcl, don't. The hexadecimal encoding is not necessarily the same as the logical memory address of the underlying object. Instead it is the raw byte encoding of the pointer value. The encoding will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Similarly, don't try to manually cast a pointer to a new type by simply replacing the type-string. This may not work like you expect and it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return None if the conversion can't be performed.

    36.3.6 Structures

    If you wrap a C structure, it is wrapped by a Tcl interface that somewhat resembles a Tk widget. This provides a very natural interface. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    % Vector v
    % v configure -x 3.5 -y 7.2
    % puts "[v cget -x] [v cget -y] [v cget -z]"
    3.5 7.2 0.0
    % 
    

    Similar access is provided for unions and the data members of C++ classes.

    In the above example, v is a name that's used for the object. However, underneath the covers, there's a pointer to a raw C structure. This can be obtained by looking at the -this attribute. For example:

    % puts [v cget -this]
    _88e31408_p_Vector
    

    Further details about the relationship between the Tcl and the underlying C structure are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Tcl, you will see behavior like this:

    % Bar b
    % puts [b cget -x]
    _801861a4_p_int
    % 
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    % Bar c
    % c configure -x [b cget -x]   # Copy contents of b.x to c.x
    

    For array assignment, SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    % Bar b
    % set x [b cget -f]
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    However, one peculiarity of accessing a substructure like this is that the returned value does work quite like you might expect. For example:

    % Bar b
    % set x [b cget -f]
    % x cget -a
    invalid command name "x"
    

    This is because the returned value was not created in a normal way from the interpreter (x is not a command object). To make it function normally, just evaluate the variable like this:

    % Bar b
    % set x [b cget -f]
    % $x cget -a
    0
    %
    

    In this example, x points inside the original structure. This means that modifications work just like you would expect. For example:

    
    % Bar b
    % set x [b cget -f]
    % $x configure -a 3            # Modifies contents of f (inside b)
    % [b cget -f] -configure -a 3  # Same thing
    

    In many of these structure examples, a simple name like "v" or "b" has been given to wrapped structures. If necessary, this name can be passed to functions that expect to receive an object. For example, if you have a function like this,

    void blah(Foo *f);
    

    you can call the function in Tcl as follows:

    % Foo x            # Create a Foo object 
    % blah x           # Pass the object to a function
    

    It is also possible to call the function using the raw pointer value. For instance:

    % blah [x cget -this]   # Pass object to a function
    

    It is also possible to create and use objects using variables. For example:

    % set b [Bar]            # Create a Bar
    % $b cget -f             # Member access
    % puts $b
    _108fea88_p_Bar
    %
    

    Finally, to destroy objects created from Tcl, you can either let the object name go out of scope or you can explicitly delete the object. For example:

    % Foo f                 # Create object f
    % rename f ""
    

    or

    % Foo f                 # Create object f
    % f -delete
    

    Note: Tcl only destroys the underlying object if it has ownership. See the memory management section that appears shortly.

    36.3.7 C++ classes

    C++ classes are wrapped as an extension of structure wrapping. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Tcl like this:

    % List x
    % x insert Ale
    % x insert Stout
    % x insert Lager
    % x get 1
    Stout
    % puts [x cget -length]
    3
    %
    

    Class data members are accessed in the same manner as C structures.

    Static class members are accessed as global functions or variables. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Tcl, the static member is accessed as follows:

    % Spam_foo        # Spam::foo()
    % puts $Spam_bar  # Spam::bar
    

    36.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    An object of type Bar can be used where a Foo is expected. For example, if you have this function:

    void spam(Foo *f);
    

    then the function spam() accepts a Foo * or a pointer to any class derived from Foo. For instance:

    % Foo f      # Create a Foo
    % Bar b      # Create a Bar
    % spam f     # OK
    % spam b     # OK
    

    It is safe to use multiple inheritance with SWIG.

    36.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In Tcl, there is no detailed distinction like this. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    % Foo f             # Create a Foo
    % spam1 f           # Ok. Pointer
    % spam2 f           # Ok. Reference
    % spam3 f           # Ok. Value.
    % spam4 f           # Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Tcl will release this memory when the return value is garbage collected).

    36.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Tcl in a straightforward manner:

    % foo 3            # foo(int)
    % foo Hello        # foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Tcl code like this:

    % Foo f                # Create a Foo
    % Foo g f              # Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);    
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);    
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    36.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
      
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like this:

    % Complex c 3 4
    % Complex d 7 8
    % set e [c + d]
    % $e re
    10.0
    % $e im
    12.0
    

    It should be stressed that operators in SWIG have no relationship to operators in Tcl. In fact, the only thing that's happening here is that an operator like operator + has been renamed to a method + . Therefore, the statement [c + d] is really just invoking the + method on c. When more than operator is defined (with different arguments), the standard method overloading facilities are used. Here is a rather odd looking example:

    % Complex c 3 4
    % Complex d 7 8
    % set e [c - d]       # operator-(const Complex &)
    % puts "[$e re] [$e im]"
    10.0 12.0
    % set f [c -]         # operator-()
    % puts "[$f re] [$f im]"
    -3.0 -4.0
    %
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG doesn't know what to do with the friend function--in fact, it simply ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    ...
    Complex operator+(double, const Complex &c);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    36.3.12 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Tcl as follows:

    % load ./example.so
    % fact 3
    6
    % Vector v
    % v configure -x 3.4
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    36.3.13 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Tcl:

    % pairii p 3 4
    % p cget -first
    3
    % p cget -second
    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    36.3.14 C++ Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Tcl, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Tcl, everything should just "work":

    % set p [CreateFoo]                  # Create a smart-pointer somehow
    % $p configure -x 3                  # Foo::x
    % $p bar                             # Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    % set f [$p __deref__]    # Returns underlying Foo *
    

    36.4 Further details on the Tcl class interface

    In the previous section, a high-level view of Tcl wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Tcl class-like objects. This provides a very natural Tcl interface and allows SWIG to support a number of advanced features such as operator overloading. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work.

    36.4.1 Proxy classes

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a class like this

    class Foo {
    public:
      int x;
      int spam(int);
      ...
    

    then SWIG transforms it into a set of low-level procedural wrappers. For example:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int arg1) {
      return f->spam(arg1);
    }
    

    These wrappers are actually found in the Tcl extension module. For example, you can certainly do this:

    % load ./example.so
    % set f [new_Foo]
    % Foo_x_get $f
    0
    % Foo_spam $f 3
    1
    %
    

    However, in addition to this, the classname Foo is used as an object constructor function. This allows objects to be encapsulated objects that look a lot like Tk widgets as shown in the last section.

    36.4.2 Memory management

    Associated with each wrapped object, is an ownership flag thisown The value of this flag determines who is responsible for deleting the underlying C++ object. If set to 1, the Tcl interpreter destroys the C++ object when the proxy class is garbage collected. If set to 0 (or if the attribute is missing), then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Tcl automatically takes ownership of the result. For example:

    class Foo {
    public:
      Foo();
      Foo bar();
    };
    

    In Tcl:

    % Foo f
    % f cget -thisown
    1
    % set g [f bar]
    % $g cget -thisown
    1
    

    On the other hand, when pointers are returned to Tcl, there is often no way to know where they came from. Therefore, the ownership is set to zero. For example:

    class Foo {
    public:
      ...
      Foo *spam();
      ...
    };
    

    % Foo f
    % set s [f spam]
    % $s cget -thisown
    0
    % 
    

    This behavior is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Tcl to assume ownership and destroy it!

    Related to containers, ownership issues can arise whenever an object is assigned to a member or global variable. For example, consider this interface:

    %module example
    
    struct Foo {
      int  value;
      Foo  *next;
    };
    
    Foo *head = 0;
    

    When wrapped in Tcl, careful observation will reveal that ownership changes whenever an object is assigned to a global variable. For example:

    % Foo f
    % f cget -thisown
    1
    % set head f
    % f cget -thisown
    0
    

    In this case, C is now holding a reference to the object---you probably don't want Tcl to destroy it. Similarly, this occurs for members. For example:

    % Foo f
    % Foo g
    % f cget -thisown
    1
    % g cget -thisown
    1
    % f configure -next g
    % g cget -thisown 
    0
    %
    

    For the most part, memory management issues remain hidden. However, there are occasionally situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Node {
      Object *value;
    public:
      void set_value(Object *v) { value = v; }
      ...
    };
    

    Now, consider the following Tcl code:

    % Object v                 # Create an object
    % Node n                   # Create a node
    % n setvalue v             # Set value
    % v cget -thisown
    1
    % 
    

    In this case, the object n is holding a reference to v internally. However, SWIG has no way to know that this has occurred. Therefore, Tcl still thinks that it has ownership of the object. Should the proxy object be destroyed, then the C++ destructor will be invoked and n will be holding a stale-pointer. If you're lucky, you will only get a segmentation fault.

    To work around this, it is always possible to flip the ownership flag. For example,

    % v -disown              # Give ownership to C/C++
    % v -acquire             # Acquire ownership
    

    It is also possible to deal with situations like this using typemaps--an advanced topic discussed later.

    36.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x+*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Tcl, this allows you to pass simple values instead of pointer. For example:

    set a [add 3 4]
    puts $a
    7
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT , use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Tcl, a mutated parameter shows up as a return value. For example:

    set a [negate 3]
    puts $a
    -3
    

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Tcl, the function will return multiple values as a list.

    set r [send_message "Hello World"]
    set bytes [lindex $r 0]
    set success [lindex $r 1]
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Perl:

    set dim [get_dimensions $m]
    set r  [lindex $dim 0]
    set c  [lindex $dim 1]
    

    36.6 Exception handling

    The %exception directive can be used to create a user-definable exception handler in charge of converting exceptions in your C/C++ program into Tcl exceptions. The chapter on customization features contains more details, but suppose you extended the array example into a C++ class like the following :

    class RangeError {};   // Used for an exception
    
    class DoubleArray {
      private:
        int n;
        double *ptr;
      public:
        // Create a new array of fixed size
        DoubleArray(int size) {
          ptr = new double[size];
          n = size;
        }
        // Destroy an array
        ~DoubleArray() {
          delete ptr;
        }
        // Return the length of the array
        int   length() {
          return n;
        }
    
        // Get an item from the array and perform bounds checking.
        double getitem(int i) {
          if ((i >= 0) && (i < n))
            return ptr[i];
          else
            throw RangeError();
        }
    
        // Set an item in the array and perform bounds checking.
        void setitem(int i, double val) {
          if ((i >= 0) && (i < n))
            ptr[i] = val;
          else {
            throw RangeError();
          }
        }
      };
    

    The functions associated with this class can throw a C++ range exception for an out-of-bounds array access. We can catch this in our Tcl extension by specifying the following in an interface file :

    %exception {
      try {
        $action                // Gets substituted by actual function call
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    

    As shown, the exception handling code will be added to every wrapper function. Since this is somewhat inefficient. You might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    
    %exception setitem {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    If you had a lot of different methods, you can avoid extra typing by using a macro. For example:

    %define RANGE_ERROR
    {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    %enddef
    
    %exception getitem RANGE_ERROR;
    %exception setitem RANGE_ERROR;
    

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on " Customization Features" for more examples.

    36.7 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Tcl C API as well as the material in the "Typemaps " chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Tcl interface.

    36.7.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Tcl to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object of type Tcl_Obj *.

    When this example is compiled into a Tcl module, it operates as follows:

    % load ./example.so
    % fact 6
    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int n {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("n = %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int n.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
        $1 = Tcl_GetStringFromObj($input, &$2);
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Tcl object. This allows the function to be used like this (notice how the length parameter is omitted):

    % count e "Hello World"
    1
    

    36.7.2 Tcl typemaps

    The previous section illustrated an "in" typemap for converting Tcl objects to C. A variety of different typemap methods are defined by the Tcl module. For example, to convert a C integer back into a Tcl object, you might define an "out" typemap like this:

    %typemap(out) int {
      Tcl_SetObjResult(interp, Tcl_NewIntObj($1));
    }
    

    The following list details all of the typemap methods that can be used by the Tcl module:

    %typemap(in)

    Converts Tcl objects to input function arguments

    %typemap(out)

    Converts return value of a C function to a Tcl object

    %typemap(varin)

    Assigns a C global variable from a Tcl object

    %typemap(varout)

    Returns a C global variable as a Tcl object

    %typemap(freearg)

    Cleans up a function argument (if necessary)

    %typemap(argout)

    Output argument processing

    %typemap(ret)

    Cleanup of function return values

    %typemap(consttab)

    Creation of Tcl constants (constant table)

    %typemap(constcode)

    Creation of Tcl constants (init function)

    %typemap(memberin)

    Setting of structure/class member data

    %typemap(globalin)

    Setting of C global variables

    %typemap(check)

    Checks function input values.

    %typemap(default)

    Set a default value for an argument (making it optional).

    %typemap(arginit)

    Initialize an argument to a value before any conversions occur.

    Examples of these methods will appear shortly.

    36.7.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the " Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Tcl.

    $input

    A Tcl_Obj * holding a raw Tcl object with an argument or variable value.

    $result

    A Tcl_Obj * that holds the result to be returned to Tcl.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Tcl name of the wrapper function being created.

    36.7.4 Converting a Tcl list to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Tcl list to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      Tcl_Obj **listobjv;
      int       nitems;
      int       i;
      if (Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) {
        return TCL_ERROR;
      }
      $1 = (char **) malloc((nitems+1)*sizeof(char *));
      for (i = 0; i < nitems; i++) {
        $1[i] = Tcl_GetStringFromObj(listobjv[i], 0);
      }
      $1[i] = 0;
    }
    
    // This gives SWIG some cleanup code that will get called after the function call
    %typemap(freearg) char ** {
      if ($1) {
        free($1);
      }
    }
    
    // Now a test functions
    %inline %{
      int print_args(char **argv) {
        int i = 0;
        while (argv[i]) {
          printf("argv[%d] = %s\n", i, argv[i]);
          i++;
        }
        return i;
      }
    %}
    %include "tclsh.i"
    
    

    In Tcl:

    % print_args {John Guido Larry}
    argv[0] = John
    argv[1] = Guido
    argv[2] = Larry
    3
    

    36.7.5 Returning values in arguments

    The "argout" typemap can be used to return a value originating from a function argument. For example :

    // A typemap defining how to return an argument by appending it to the result
    %typemap(argout) double *outvalue {
      Tcl_Obj *o = Tcl_NewDoubleObj($1);
      Tcl_ListObjAppendElement(interp, $result, o);
    }
    
    // A typemap telling SWIG to ignore an argument for input
    // However, we still need to pass a pointer to the C function
    %typemap(in, numinputs=0) double *outvalue (double temp) {
      $1 = &temp;
    }
    
    // Now a function returning two values
    int mypow(double a, double b, double *outvalue) {
      if ((a < 0) || (b < 0)) return -1;
      *outvalue = pow(a, b);
      return 0;
    };
    

    When wrapped, SWIG matches the argout typemap to the " double *outvalue" argument. The numinputs=0 specification tells SWIG to simply ignore this argument when generating wrapper code. As a result, a Tcl function using these typemaps will work like this :

    % mypow 2 3     # Returns two values, a status value and the result
    0 8
    %
    

    36.7.6 Useful functions

    The following tables provide some functions that may be useful in writing Tcl typemaps.

    Integers

    Tcl_Obj   *Tcl_NewIntObj(int Value);
    void       Tcl_SetIntObj(Tcl_Obj *obj, int Value);
    int        Tcl_GetIntFromObj(Tcl_Interp *, Tcl_Obj *obj, int *ip);
    

    Floating Point

    Tcl_Obj  *Tcl_NewDoubleObj(double Value);
    void      Tcl_SetDoubleObj(Tcl_Obj *obj, double value);
    int       Tcl_GetDoubleFromObj(Tcl_Interp *, Tcl_Obj *o, double *dp);
    

    Strings

    Tcl_Obj  *Tcl_NewStringObj(char *str, int len);
    char     *Tcl_GetStringFromObj(Tcl_Obj *obj, int *len);
    void      Tcl_AppendToObj(Tcl_Obj *obj, char *str, int len);
    

    Lists

    Tcl_Obj  *Tcl_NewListObj(int objc, Tcl_Obj *objv);
    int       Tcl_ListObjAppendList(Tcl_Interp *, Tcl_Obj *listPtr, Tcl_Obj *elemListPtr);
    int       Tcl_ListObjAppendElement(Tcl_Interp *, Tcl_Obj *listPtr, Tcl_Obj *element);
    int       Tcl_ListObjGetElements(Tcl_Interp *, Tcl_Obj *listPtr, int *objcPtr,
                                     Tcl_Obj ***objvPtr);
    int       Tcl_ListObjLength(Tcl_Interp *, Tcl_Obj *listPtr, int *intPtr);
    int       Tcl_ListObjIndex(Tcl_Interp *, Tcl_Obj *listPtr, int index,
                               Tcl_Obj_Obj **objptr);
    int       Tcl_ListObjReplace(Tcl_Interp *, Tcl_Obj *listPtr, int first, int count,
                                 int objc, Tcl_Obj *objv);
    

    Objects

    Tcl_Obj *Tcl_DuplicateObj(Tcl_Obj *obj);
    void     Tcl_IncrRefCount(Tcl_Obj *obj);
    void     Tcl_DecrRefCount(Tcl_Obj *obj);
    int      Tcl_IsShared(Tcl_Obj *obj);
    

    36.7.7 Standard typemaps

    The following typemaps show how to convert a few common kinds of objects between Tcl and C (and to give a better idea of how typemaps work)

    Integer conversion

    %typemap(in) int, short, long {
      int temp;
      if (Tcl_GetIntFromObj(interp, $input, &temp) == TCL_ERROR)
        return TCL_ERROR;
      $1 = ($1_ltype) temp;
    }
    

    %typemap(out) int, short, long {
      Tcl_SetIntObj($result, (int) $1);
    }
    

    Floating point conversion

    %typemap(in) float, double {
      double temp;
      if (Tcl_GetDoubleFromObj(interp, $input, &temp) == TCL_ERROR)
        return TCL_ERROR;
      $1 = ($1_ltype) temp;
    }
    

    %typemap(out) float, double {
      Tcl_SetDoubleObj($result, $1);
    }
    

    String Conversion

    %typemap(in) char * {
      int len;
      $1 = Tcl_GetStringFromObj(interp, &len);
    }
    

    %typemap(out, noblock=1, fragment="SWIG_FromCharPtr") char *, const char * {
      Tcl_SetObjResult(interp, SWIG_FromCharPtr((const char *)$1));
    }
    
    

    36.7.8 Pointer handling

    SWIG pointers are mapped into Tcl strings containing the hexadecimal value and type. The following functions can be used to create and read pointer values.

    int SWIG_ConvertPtr(Tcl_Obj *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Tcl object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. It is currently reserved for future expansion. Returns 0 on success and -1 on error.

    Tcl_Obj *SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int flags)

    Creates a new Tcl pointer object. ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag reserved for future expansion.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    Tcl_Obj *;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    36.8 Turning a SWIG module into a Tcl Package.

    Tcl 7.4 introduced the idea of an extension package. By default, SWIG generates all of the code necessary to create a package. To set the package version, simply use the -pkgversion option. For example:

    % swig -tcl -pkgversion 2.3 example.i
    

    After building the SWIG generated module, you need to execute the " pkg_mkIndex" command inside tclsh. For example :

    unix > tclsh
    % pkg_mkIndex . example.so
    % exit
    

    This creates a file "pkgIndex.tcl" with information about the package. To use your package, you now need to move it to its own subdirectory which has the same name as the package. For example :

    ./example/
               pkgIndex.tcl           # The file created by pkg_mkIndex
               example.so             # The SWIG generated module
    

    Finally, assuming that you're not entirely confused at this point, make sure that the example subdirectory is visible from the directories contained in either the tcl_library or auto_path variables. At this point you're ready to use the package as follows :

    unix > tclsh
    % package require example
    % fact 4
    24
    %
    

    If you're working with an example in the current directory and this doesn't work, do this instead :

    unix > tclsh
    % lappend auto_path .
    % package require example
    % fact 4
    24
    

    As a final note, most SWIG examples do not yet use the package commands. For simple extensions it may be easier just to use the load command instead.

    36.9 Building new kinds of Tcl interfaces (in Tcl)

    One of the most interesting aspects of Tcl and SWIG is that you can create entirely new kinds of Tcl interfaces in Tcl using the low-level SWIG accessor functions. For example, suppose you had a library of helper functions to access arrays :

    /* File : array.i */
    %module array
    
    %inline %{
    double *new_double(int size) {
      return (double *) malloc(size*sizeof(double));
    }
    void delete_double(double *a) {
      free(a);
    }
    double get_double(double *a, int index) {
      return a[index];
    }
    void set_double(double *a, int index, double val) {
      a[index] = val;
    }
    int *new_int(int size) {
      return (int *) malloc(size*sizeof(int));
    }
    void delete_int(int *a) {
      free(a);
    }
    int get_int(int *a, int index) {
      return a[index];
    }
    int set_int(int *a, int index, int val) {
      a[index] = val;
    }
    %}
    
    

    While these could be called directly, we could also write a Tcl script like this :

    proc Array {type size} {
        set ptr [new_$type $size]
        set code {
            set method [lindex $args 0]
            set parms [concat $ptr [lrange $args 1 end]]
            switch $method {
                get {return [eval "get_$type $parms"]}
                set {return [eval "set_$type $parms"]}
                delete {eval "delete_$type $ptr; rename $ptr {}"}
            }
        }
        # Create a procedure
        uplevel "proc $ptr args {set ptr $ptr; set type $type;$code}"
        return $ptr
    }
    

    Our script allows easy array access as follows :

    set a [Array double 100]                   ;# Create a double [100]
    for {set i 0} {$i < 100} {incr i 1} {      ;# Clear the array
            $a set $i 0.0
    }
    $a set 3 3.1455                            ;# Set an individual element
    set b [$a get 10]                          ;# Retrieve an element
    
    set ia [Array int 50]                      ;# Create an int[50]
    for {set i 0} {$i < 50} {incr i 1} {       ;# Clear it
            $ia set $i 0
    }
    $ia set 3 7                                ;# Set an individual element
    set ib [$ia get 10]                        ;# Get an individual element
    
    $a delete                                  ;# Destroy a
    $ia delete                                 ;# Destroy ia
    

    The cool thing about this approach is that it makes a common interface for two different types of arrays. In fact, if we were to add more C datatypes to our wrapper file, the Tcl code would work with those as well--without modification. If an unsupported datatype was requested, the Tcl code would simply return with an error so there is very little danger of blowing something up (although it is easily accomplished with an out of bounds array access).

    36.9.1 Proxy classes

    A similar approach can be applied to proxy classes (also known as shadow classes). The following example is provided by Erik Bierwagen and Paul Saxe. To use it, run SWIG with the -noobject option (which disables the builtin object oriented interface). When running Tcl, simply source this file. Now, objects can be used in a more or less natural fashion.

    # swig_c++.tcl
    # Provides a simple object oriented interface using
    # SWIG's low level interface.
    #
    
    proc new {objectType handle_r args} {
        # Creates a new SWIG object of the given type,
        # returning a handle in the variable "handle_r".
        #
        # Also creates a procedure for the object and a trace on
        # the handle variable that deletes the object when the
        # handle variable is overwritten or unset
        upvar $handle_r handle
        #
        # Create the new object
        #
        eval set handle \[new_$objectType $args\]
        #
        # Set up the object procedure
        #
        proc $handle {cmd args} "eval ${objectType}_\$cmd $handle \$args"
        #
        # And the trace ...
        #
        uplevel trace variable $handle_r uw "{deleteObject $objectType $handle}"
        #
        # Return the handle so that 'new' can be used as an argument to a procedure
        #
        return $handle
    }
    
    proc deleteObject {objectType handle name element op} {
        #
        # Check that the object handle has a reasonable form
        #
        if {![regexp {_[0-9a-f]*_(.+)_p} $handle]} {
            error "deleteObject: not a valid object handle: $handle"
        }
        #
        # Remove the object procedure
        #
        catch {rename $handle {}}
        #
        # Delete the object
        #
        delete_$objectType $handle
    }
    
    proc delete {handle_r} {
        #
        # A synonym for unset that is more familiar to C++ programmers
        #
        uplevel unset $handle_r
    }
    

    To use this file, we simply source it and execute commands such as "new" and "delete" to manipulate objects. For example :

    // list.i
    %module List
    %{
    #include "list.h"
    %}
    
    // Very simple C++ example
    
    class List {
    public:
      List();  // Create a new list
      ~List(); // Destroy a list
      int  search(char *value);
      void insert(char *);  // Insert a new item into the list
      void remove(char *);  // Remove item from list
      char *get(int n);     // Get the nth item in the list
      int  length;          // The current length of the list
    static void print(List *l);  // Print out the contents of the list
    };
    

    Now a Tcl script using the interface...

    load ./list.so list       ; # Load the module
    source swig_c++.tcl       ; # Source the object file
    
    new List l
    $l insert Dave
    $l insert John
    $l insert Guido
    $l remove Dave
    puts $l length_get
    
    delete l
    

    The cool thing about this example is that it works with any C++ object wrapped by SWIG and requires no special compilation. Proof that a short, but clever Tcl script can be combined with SWIG to do many interesting things.

    36.10 Tcl/Tk Stubs

    For background information about the Tcl Stubs feature, see http://www.tcl.tk/doc/howto/stubs.html.

    As of SWIG 1.3.10, the generated C/C++ wrapper will use the Tcl Stubs feature if compiled with -DUSE_TCL_STUBS.

    As of SWIG 1.3.40, the generated C/C++ wrapper will use the Tk Stubs feature if compiled with -DUSE_TK_STUBS. Also, you can override the minimum version to support which is passed to Tcl_InitStubs() and Tk_InitStubs() with -DSWIG_TCL_STUBS_VERSION="8.3" or the version being compiled with using -DSWIG_TCL_STUBS_VERSION=TCL_VERSION.


    37 SWIG and MzScheme/Racket

    This section contains information on SWIG's support of Racket, formally known as MzScheme.

    37.1 Creating native structures

    Example interface file:

    /* define a macro for the struct creation */
    %define handle_ptr(TYPE, NAME)
    %typemap(argout) TYPE *NAME{
      Scheme_Object *o = SWIG_NewStructFromPtr($1, $*1_mangle);
      SWIG_APPEND_VALUE(o);
    }
    
    %typemap(in, numinputs=0) TYPE *NAME (TYPE temp) {
      $1 = &temp;
    }
    %enddef
    
    /* setup the typemaps for the pointer to an output parameter cntrs */
    handle_ptr(struct diag_cntrs, cntrs);
    

    Then in scheme, you can use regular struct access procedures like

            ; suppose a function created a struct foo as
            ; (define foo (make-diag-cntrs (#x1 #x2 #x3) (make-inspector))
            ; Then you can do
            (format "0x~x" (diag-cntrs-field1 foo))
            (format "0x~x" (diag-cntrs-field2 foo))
            ;etc...
    

    37.2 Simple example

    A few examples are available in the Examples/mzscheme directory. The code and log of a session using SWIG below should help getting started.

    C header file:

    // example.h
    int fact(int n);
    

    C source code:

    // File: example.c
    #include "example.h"
    
    int fact(int n) {
      if (n < 0) { /* This should probably return an error, but this is simpler */
        return 0;
      }
      if (n == 0) {
        return 1;
      }
      else {
        /* testing for overflow would be a good idea here */
        return n * fact(n-1);
      }
    }
    

    SWIG interface file:

    /* File: example.i */
    %module example
    
    %{
    #include "example.h"
    %}
    
    int fact(int n);
    

    The session below using the above files is on an OS X machine, but the points to be made are more general. On OS X, libtool is the tool which creates libraries, which are named .dylib, rather than .so on other unixes, or .dll on Windows.

    % swig -mzscheme -declaremodule example.i
    % gcc -c -m32 -o example.o example.c # force 32-bit object file (mzscheme is 32-bit only)
    % libtool -dynamic -o libexample.dylib example.o # make it into a library
    % ls # what've we got so far?
    example.c example.o
    example.h example_wrap.c
    example.i libexample.dylib*
    % mzc --cgc --cc example_wrap.c # compile the wrapping code
    % LDFLAGS="-L. -lexample" mzc --ld example_wrap.dylib example_wrap.o # ...and link it
    % mzscheme -e '(path->string (build-path "compiled" "native" (system-library-subpath)))'
    "compiled/native/i386-macosx/3m"
    % mkdir -p compiled/native/i386-macosx/3m # move the extension library to a magic place
    % mv example_wrap.dylib compiled/native/i386-macosx/3m/example_ss.dylib
    % mzscheme
    Welcome to MzScheme v4.2.4 [3m], Copyright (c) 2004-2010 PLT Scheme Inc.
    > (require "example.ss")
    > (fact 5)
    120
    > ^D
    % echo 'It works!'
    

    Some points of interest:

    • This is on a 64-bit machine, so we have to include the -m32 option when building the object file
    • If you want to declare a scheme module (and you probably do), it's important that you include the -declaremodule option to swig (if you miss this out, it'll appear to work, but fail later).
    • Use mzc to compile and then link the wrapped code. You'll probably need to adjust the link flags to refer to the library you're wrapping (you can either do this with an LDFLAGS declaration, as here, or with multiple ++ldf options to mzc).
    • Create the directory with path (build-path "compiled" "native" (system-library-subpath)) and move the freshly-generated .dylib to there, changing its name to module-name_ss.dylib. After that, you can REQUIRE the new module with (require "module-name.ss").
    • The above requests mzc to create an extension using the CGC garbage-collector. The alternative -- the 3m collector -- has generally better performance, but work is still required for SWIG to emit code which is compatible with it.

    37.3 External documentation

    See the C API for more description of using the mechanism for adding extensions. The main documentation is here.

    Tip: mzc's --vv option is very useful for debugging the inevitable library problems you'll encounter.


    38 SWIG and OCaml

    This chapter describes SWIG's support of Ocaml.

    Ocaml is a relatively recent addition to the ML family, and is a recent addition to SWIG. It's the second compiled, typed language to be added. Ocaml has widely acknowledged benefits for engineers, mostly derived from a sophisticated type system, compile-time checking which eliminates several classes of common programming errors, and good native performance. While all of this is wonderful, there are well-written C and C++ libraries that Ocaml users will want to take advantage of as part of their arsenal (such as SSL and gdbm), as well as their own mature C and C++ code. SWIG allows this code to be used in a natural, type-safe way with Ocaml, by providing the necessary, but repetitive glue code which creates and uses Ocaml values to communicate with C and C++ code. In addition, SWIG also produces the needed Ocaml source that binds variants, functions, classes, etc.

    If you're not familiar with the Objective Caml language, you can visit The Ocaml Website.

    38.1 Preliminaries

    SWIG is compatible with OCaml 3.12.0 and above. Given the choice, you should use the latest stable release. The SWIG Ocaml module has been tested on Linux (x86, PPC, Sparc) and Cygwin on Windows. The best way to determine whether your system will work is to compile the examples and test-suite which come with SWIG. You can do this by running make check from the SWIG root directory after installing SWIG. The Ocaml module has been tested using the system's dynamic linking (the usual -lxxx against libxxx.so, as well as with Gerd Stolpmann's Dl package. The ocaml_dynamic and ocaml_dynamic_cpp targets in the file Examples/Makefile illustrate how to compile and link SWIG modules that will be loaded dynamically. This has only been tested on Linux so far.

    38.1.1 Running SWIG

    The basics of getting a SWIG Ocaml module up and running can be seen from one of SWIG's example Makefiles, but is also described here. To build an Ocaml module, run SWIG using the -ocaml option.

    %swig -ocaml example.i
    

    This will produce 3 files. The file example_wrap.c contains all of the C code needed to build an Ocaml module. To build the module, you will compile the file example_wrap.c with ocamlc or ocamlopt to create the needed .o file. You will need to compile the resulting .ml and .mli files as well, and do the final link with -custom (not needed for native link).

    38.1.2 Compiling the code

    The OCaml SWIG module now requires you to compile a module (Swig ) separately. In addition to aggregating common SWIG functionality, the Swig module contains the data structure that represents C/C++ values. This allows easier data sharing between modules if two or more are combined, because the type of each SWIG'ed module's c_obj is derived from Swig.c_obj_t. This also allows SWIG to acquire new conversions painlessly, as well as giving the user more freedom with respect to custom typing. Use ocamlc or ocamlopt to compile your SWIG interface like:

    % swig -ocaml -co swig.mli ; swig -ocaml -co swig.ml
    % ocamlc -c swig.mli ; ocamlc -c swig.ml
    % ocamlc -c -ccopt "-I/usr/include/foo" example_wrap.c
    % ocamlc -c example.mli
    % ocamlc -c example.ml
    

    ocamlc is aware of .c files and knows how to handle them. Unfortunately, it does not know about .cxx, .cc, or .cpp files, so when SWIG is invoked in C++ mode, you must:

    % cp example_wrap.cxx example_wrap.cxx.c
    % ocamlc -c ... -ccopt -xc++ example_wrap.cxx.c
    % ...
    

    38.1.3 The camlp4 module

    The camlp4 module (swigp4.ml -> swigp4.cmo) contains a simple rewriter which makes C++ code blend more seamlessly with objective caml code. Its use is optional, but encouraged. The source file is included in the Lib/ocaml directory of the SWIG source distribution. You can checkout this file with "swig -ocaml -co swigp4.ml". You should compile the file with "ocamlc -I `camlp4 -where` -pp 'camlp4o pa_extend.cmo q_MLast.cmo' -c swigp4.ml"

    The basic principle of the module is to recognize certain non-caml expressions and convert them for use with C++ code as interfaced by SWIG. The camlp4 module is written to work with generated SWIG interfaces, and probably isn't great to use with anything else.

    Here are the main rewriting rules:

    InputRewritten to
    f'( ... ) as in
    atoi'("0") or
    _exit'(0)
    f(C_list [ ... ]) as in
    atoi (C_list [ C_string "0" ]) or
    _exit (C_list [ C_int 0 ])
    object -> method ( ... )(invoke object) "method" (C_list [ ... ])
    object 'binop argument as in
    a '+= b
    (invoke object) "+=" argument as in
    (invoke a) "+=" b
    Note that because camlp4 always recognizes << and >>, they are replaced by lsl and lsr in operator names.
    'unop object as in
    '! a
    (invoke a) "!" C_void
    Smart pointer access like this
    object '-> method ( args )
    (invoke (invoke object "->" C_void))
    Invoke syntax
    object . '( ... )
    (invoke object) "()" (C_list [ ... ])
    Array syntax
    object '[ 10 ]
    (invoke object) "[]" (C_int 10)
    Assignment syntax
    let a = '10 and b = '"foo" and c = '1.0 and d = 'true
    let a = C_int 10 and b = C_string "foo" and c = C_double 1.0 and d = C_bool true
    Cast syntax
    let a = _atoi '("2") as int
    let b = (getenv "PATH") to string
    This works for int, string, float, bool
    let a = get_int (_atoi (C_string "2"))
    let b = C_string (getenv "PATH")

    38.1.4 Using your module

    You can test-drive your module by building a toplevel ocaml interpreter. Consult the ocaml manual for details.

    When linking any ocaml bytecode with your module, use the -custom option to build your functions into the primitive list. This option is not needed when you build native code.

    38.1.5 Compilation problems and compiling with C++

    As mentioned above, .cxx files need special handling to be compiled with ocamlc. Other than that, C code that uses class as a non-keyword, and C code that is too liberal with pointer types may not compile under the C++ compiler. Most code meant to be compiled as C++ will not have problems.

    38.2 The low-level Ocaml/C interface

    In order to provide access to overloaded functions, and provide sensible outputs from them, all C entities are represented as members of the c_obj type:

    In the code as seen by the typemap writer, there is a value, swig_result, that always contains the current return data. It is a list, and must be appended with the caml_list_append function, or with functions and macros provided by objective caml.

    type c_obj =
        C_void
      | C_bool of bool
      | C_char of char
      | C_uchar of char
      | C_short of int
      | C_ushort of int
      | C_int of int
      | C_uint of int32
      | C_int32 of int32
      | C_int64 of int64
      | C_float of float
      | C_double of float
      | C_ptr of int64 * int64
      | C_array of c_obj array
      | C_list of c_obj list
      | C_obj of (string -> c_obj -> c_obj)
      | C_string of string
      | C_enum of c_enum_t
    

    A few functions exist which generate and return these:

    • caml_ptr_val receives a c_obj and returns a void *. This should be used for all pointer purposes.
    • caml_long_val receives a c_obj and returns a long. This should be used for most integral purposes.
    • caml_val_ptr receives a void * and returns a c_obj.
    • caml_val_bool receives a C int and returns a c_obj representing its bool value.
    • caml_val_(u)?(char|short|int|long|float|double) receives an appropriate C value and returns a c_obj representing it.
    • caml_val_string receives a char * and returns a string value.
    • caml_val_string_len receives a char * and a length and returns a string value.
    • caml_val_obj receives a void * and an object type and returns a C_obj, which contains a closure giving method access.

    Because of this style, a typemap can return any kind of value it wants from a function. This enables out typemaps and inout typemaps to work well. The one thing to remember about outputting values is that you must append them to the return list with swig_result = caml_list_append(swig_result, v).

    This function will return a new list that has your element appended. Upon return to caml space, the fnhelper function beautifies the result. A list containing a single item degrades to only that item (i.e. [ C_int 3 ] -> C_int 3), and a list containing more than one item is wrapped in C_list (i.e. [ C_char 'a' ; C_char 'b' ] -> C_list [ C_char 'a' ; C_char 'b' ]). This is in order to make return values easier to handle when functions have only one return value, such as constructors, and operators. In addition, string, pointer, and object values are interchangeable with respect to caml_ptr_val, so you can allocate memory as caml strings and still use the resulting pointers for C purposes, even using them to construct simple objects on. Note, though, that foreign C++ code does not respect the garbage collector, although the SWIG interface does.

    The wild card type that you can use in lots of different ways is C_obj. It allows you to wrap any type of thing you like as an object using the same mechanism that the ocaml module does. When evaluated in caml_ptr_val, the returned value is the result of a call to the object's "&" operator, taken as a pointer.

    You should only construct values using objective caml, or using the functions caml_val_* functions provided as static functions to a SWIG ocaml module, as well as the caml_list_* functions. These functions provide everything a typemap needs to produce values. In addition, value items pass through directly, but you must make your own type signature for a function that uses value in this way.

    38.2.1 The generated module

    The SWIG %module directive specifies the name of the Ocaml module to be generated. If you specified `%module example', then your Ocaml code will be accessible in the module Example. The module name is always capitalized as is the ocaml convention. Note that you must not use any Ocaml keyword to name your module. Remember that the keywords are not the same as the C++ ones.

    You can introduce extra code into the output wherever you like with SWIG. These are the places you can introduce code:

    "header"This code is inserted near the beginning of the C wrapper file, before any function definitions.
    "wrapper"This code is inserted in the function definition section.
    "runtime"This code is inserted near the end of the C wrapper file.
    "mli"This code is inserted into the caml interface file. Special signatures should be inserted here.
    "ml"This code is inserted in the caml code defining the interface to your C code. Special caml code, as well as any initialization which should run when the module is loaded may be inserted here.
    "classtemplate"The "classtemplate" place is special because it describes the output SWIG will generate for class definitions.

    38.2.2 Enums

    SWIG will wrap enumerations as polymorphic variants in the output Ocaml code, as above in C_enum. In order to support all C++-style uses of enums, the function int_to_enum and enum_to_int are provided for ocaml code to produce and consume these values as integers. Other than that, correct uses of enums will not have a problem. Since enum labels may overlap between enums, the enum_to_int and int_to_enum functions take an enum type label as an argument. Example:

    %module enum_test
    %{
    enum c_enum_type { a = 1, b, c = 4, d = 8 };
    %}
    enum c_enum_type { a = 1, b, c = 4, d = 8 };
    

    The output mli contains:

    type c_enum_type = [
      `unknown
    | `c_enum_type
    ]
    type c_enum_tag = [
      `int of int
    | `a
    | `b
    | `c
    | `d
    ]
    val int_to_enum c_enum_type -> int -> c_obj
    val enum_to_int c_enum_type -> c_obj -> c_obj
    

    So it's possible to do this:

    bash-2.05a$ ocamlmktop -custom enum_test_wrap.o enum_test.cmo -o enum_test_top
    bash-2.05a$ ./enum_test_top
            Objective Caml version 3.04
    
    # open Enum_test ;;
    # let x = C_enum `a ;;
    val x : Enum_test.c_obj = C_enum `a
    # enum_to_int `c_enum_type x ;;
    - : Enum_test.c_obj = C_int 1
    # int_to_enum `c_enum_type 4 ;;
    - : Enum_test.c_obj = C_enum `c
    

    38.2.2.1 Enum typing in Ocaml

    The ocaml SWIG module now has support for loading and using multiple SWIG modules at the same time. This enhances modularity, but presents problems when used with a language which assumes that each module's types are complete at compile time. In order to achieve total soundness enum types are now isolated per-module. The type issue matters when values are shared between functions imported from different modules. You must convert values to master values using the swig_val function before sharing them with another module.

    38.2.3 Arrays

    38.2.3.1 Simple types of bounded arrays

    SWIG has support for array types, but you generally will need to provide a typemap to handle them. You can currently roll your own, or expand some of the macros provided (but not included by default) with the SWIG distribution.

    By including "carray.i", you will get access to some macros that help you create typemaps for array types fairly easily.

    %make_simple_array_typemap is the easiest way to get access to arrays of simple types with known bounds in your code, but this only works for arrays whose bounds are completely specified.

    38.2.3.2 Complex and unbounded arrays

    Unfortunately, unbounded arrays and pointers can't be handled in a completely general way by SWIG, because the end-condition of such an array can't be predicted. In some cases, it will be by consent (e.g. an array of four or more chars), sometimes by explicit length (char *buffer, int len), and sometimes by sentinel value (0, -1, etc.). SWIG can't predict which of these methods will be used in the array, so you have to specify it for yourself in the form of a typemap.

    38.2.3.3 Using an object

    It's possible to use C++ to your advantage by creating a simple object that provides access to your array. This may be more desirable in some cases, since the object can provide bounds checking, etc., that prevents crashes.

    Consider writing an object when the ending condition of your array is complex, such as using a required sentinel, etc.

    38.2.3.4 Example typemap for a function taking float * and int

    This is a simple example in typemap for an array of float, where the length of the array is specified as an extra parameter. Other such typemaps will work similarly. In the example, the function printfloats is called with a float array, and specified length. The actual length reported in the len argument is the length of the array passed from ocaml, making passing an array into this type of function convenient.

    tarray.i
    %module tarray
    %{
    #include <stdio.h>
    
    void printfloats( float *tab, int len ) {
      int i;
    
      for( i = 0; i < len; i++ ) {
        printf( "%f ", tab[i] );
      }
    
      printf( "\n" );
    }
    %}
    
    %typemap(in) (float *tab, int len) {
      int i;
      /* $*1_type */
      $2 = caml_array_len($input);
      $1 = ($*1_type *)malloc( $2 * sizeof( float ) );
      for( i = 0; i < $2; i++ ) {
        $1[i] = caml_double_val(caml_array_nth($input, i));
      }
    }
    
    void printfloats( float *tab, int len );
    
    Sample Run
    # open Tarray ;;
    # _printfloats (C_array [| C_double 1.0 ; C_double 3.0 ; C_double 5.6666 |]) ;;
    1.000000 3.000000 5.666600
    - : Tarray.c_obj = C_void
    

    38.2.4 C++ Classes

    C++ classes, along with structs and unions are represented by C_obj (string -> c_obj -> c_obj) wrapped closures. These objects contain a method list, and a type, which allow them to be used like C++ objects. When passed into typemaps that use pointers, they degrade to pointers through their "&" method. Every method an object has is represented as a string in the object's method table, and each method table exists in memory only once. In addition to any other operators an object might have, certain builtin ones are provided by SWIG: (all of these take no arguments (C_void))

    "~"Delete this object
    "&"Return an ordinary C_ptr value representing this object's address
    "sizeof"If enabled with ("sizeof"="1") on the module node, return the object's size in char.
    ":methods"Returns a list of strings containing the names of the methods this object contains
    ":classof"Returns the name of the class this object belongs to.
    ":parents"Returns a list of all direct parent classes which have been wrapped by SWIG.
    "::[parent-class]"Returns a view of the object as the indicated parent class. This is mainly used internally by the SWIG module, but may be useful to client programs.
    "[member-variable]"Each member variable is wrapped as a method with an optional parameter. Called with one argument, the member variable is set to the value of the argument. With zero arguments, the value is returned.

    Note that this string belongs to the wrapper object, and not the underlying pointer, so using create_[x]_from_ptr alters the returned value for the same object.

    38.2.4.1 STL vector and string Example

    Standard typemaps are now provided for STL vector and string. More are in the works. STL strings are passed just like normal strings, and returned as strings. STL string references don't mutate the original string, (which might be surprising), because Ocaml strings are mutable but have fixed length. Instead, use multiple returns, as in the argout_ref example.

    example.i
    %module example
    %{
    #include "example.h"
    %}
    
    %include <stl.i>
    
    namespace std {
      %template(StringVector) std::vector < string >;
    };
    
    %include "example.h"
    
    This example is in Examples/ocaml/stl

    Since there's a makefile in that directory, the example is easy to build.

    Here's a sample transcript of an interactive session using a string vector after making a toplevel (make toplevel). This example uses the camlp4 module.

    bash-2.05a$ ./runme_top
            Objective Caml version 3.06
    
            Camlp4 Parsing version 3.06
    
    # open Swig ;;
    # open Example ;;
    # let x = new_StringVector '() ;;
    val x : Example.c_obj = C_obj <fun>
    # x -> ":methods" () ;;
    - : Example.c_obj =
    C_list
     [C_string "nop"; C_string "size"; C_string "empty"; C_string "clear";
      C_string "push_back"; C_string "[]"; C_string "="; C_string "set";
      C_string "~"; C_string "&"; C_string ":parents"; C_string ":classof";
      C_string ":methods"]
    # x -> push_back ("foo") ;;
    - : Example.c_obj = C_void
    # x -> push_back ("bar") ;;
    - : Example.c_obj = C_void
    # x -> push_back ("baz") ;;
    - : Example.c_obj = C_void
    # x '[1] ;;
    - : Example.c_obj = C_string "bar"
    # x -> set (1, "spam") ;;
    - : Example.c_obj = C_void
    # x '[1] ;;
    - : Example.c_obj = C_string "spam"
    # for i = 0 to (x -> size() as int) - 1 do
        print_endline ((x '[i to int]) as string)
      done ;;
    foo
    bar
    baz
    - : unit = ()
    #
    

    38.2.4.2 C++ Class Example

    Here's a simple example using Trolltech's Qt Library:

    qt.i
    %module qt
    %{
    #include <qapplication.h>
    #include <qpushbutton.h>
    %}
    class QApplication {
    public:
      QApplication( int argc, char **argv );
      void setMainWidget( QWidget *widget );
      void exec();
    };
    
    class QPushButton {
    public:
      QPushButton( char *str, QWidget *w );
      void resize( int x, int y );
      void show();
    };
    

    38.2.4.3 Compiling the example

    bash-2.05a$ QTPATH=/your/qt/path
    bash-2.05a$ for file in swig.mli swig.ml swigp4.ml ; do swig -ocaml -co $file ; done
    bash-2.05a$ ocamlc -c swig.mli ; ocamlc -c swig.ml
    bash-2.05a$ ocamlc -I `camlp4 -where` -pp "camlp4o pa_extend.cmo q_MLast.cmo" -c swigp4.ml
    bash-2.05a$ swig -ocaml -c++ -I$QTPATH/include qt.i
    bash-2.05a$ mv qt_wrap.cxx qt_wrap.c
    bash-2.05a$ ocamlc -c -ccopt -xc++ -ccopt -g -g -ccopt -I$QTPATH/include qt_wrap.c
    bash-2.05a$ ocamlc -c qt.mli
    bash-2.05a$ ocamlc -c qt.ml
    bash-2.05a$ ocamlmktop -custom swig.cmo -I `camlp4 -where` \
      camlp4o.cma swigp4.cmo qt_wrap.o qt.cmo -o qt_top -cclib \
      -L$QTPATH/lib -cclib -lqt
    

    38.2.4.4 Sample Session

    bash-2.05a$ ./qt_top
            Objective Caml version 3.06
    
            Camlp4 Parsing version 3.06
    
    # open Swig ;;
    # open Qt ;;
    # let a = new_QApplication '(0, 0) ;;
    val a : Qt.c_obj = C_obj <fun>
    # let hello = new_QPushButton '("hi", 0) ;;
    val hello : Qt.c_obj = C_obj <fun>
    # hello -> resize (100, 30) ;;
    - : Qt.c_obj = C_void
    # hello -> show () ;;
    - : Qt.c_obj = C_void
    # a -> exec () ;;
    

    Assuming you have a working installation of QT, you will see a window containing the string "hi" in a button.

    38.2.5 Director Classes

    38.2.5.1 Director Introduction

    Director classes are classes which allow Ocaml code to override the public methods of a C++ object. This facility allows the user to use C++ libraries that require a derived class to provide application specific functionality in the context of an application or utility framework.

    You can turn on director classes by using an optional module argument like this:

    %module(directors="1")
    
    ...
    
    // Turn on the director class for a specific class like this:
    %feature("director")
    class foo {
      ...
    };
    

    38.2.5.2 Overriding Methods in Ocaml

    Because the Ocaml language module treats C++ method calls as calls to a certain function, all you need to do is to define the function that will handle the method calls in terms of the public methods of the object, and any other relevant information. The function new_derived_object uses a stub class to call your methods in place of the ones provided by the underlying implementation. The object you receive is the underlying object, so you are free to call any methods you want from within your derived method. Note that calls to the underlying object do not invoke Ocaml code. You need to handle that yourself.

    new_derived_object receives your function, the function that creates the underlying object, and any constructor arguments, and provides an object that you can use in any usual way. When C++ code calls one of the object's methods, the object invokes the Ocaml function as if it had been invoked from Ocaml, allowing any method definitions to override the C++ ones.

    In this example, I'll examine the objective caml code involved in providing an overloaded class. This example is contained in Examples/ocaml/shapes.

    38.2.5.3 Director Usage Example

    runme.ml
    open Swig
    open Example
    
    ...
    
    let triangle_class pts ob meth args =
      match meth with
          "cover" ->
            (match args with
                 C_list [ x_arg ; y_arg ] ->
                 let xa = x_arg as float
                 and ya = y_arg as float in
                   (point_in_triangle pts xa ya) to bool
               | _ -> raise (Failure "cover needs two double arguments."))
        | _ -> (invoke ob) meth args ;;
    
    ...
    
    let triangle =
      new_derived_object
        new_shape
        (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.6)))
        '() ;;
    
    let _ = _draw_shape_coverage '(triangle, 60, 20) ;;
    

    This is the meat of what you need to do. The actual "class" definition containing the overloaded method is defined in the function triangle_class. This is a lot like the class definitions emitted by SWIG, if you look at example.ml, which is generated when SWIG consumes example.i. Basically, you are given the arguments as a c_obj and the method name as a string, and you must intercept the method you are interested in and provide whatever return value you need. Bear in mind that the underlying C++ code needs the right return type, or an exception will be thrown. This exception will generally be Failure, or NotObject. You must call other ocaml methods that you rely on yourself. Due to the way directors are implemented, method calls on your object from with ocaml code will always invoke C++ methods even if they are overridden in ocaml.

    In the example, the draw_shape_coverage function plots the indicated number of points as either covered (x) or uncovered ( ) between 0 and 1 on the X and Y axes. Your shape implementation can provide any coverage map it likes, as long as it responds to the "cover" method call with a boolean return (the underlying method returns bool). This might allow a tricky shape implementation, such as a boolean combination, to be expressed in a more effortless style in ocaml, while leaving the "engine" part of the program in C++.

    38.2.5.4 Creating director objects

    The definition of the actual object triangle can be described this way:

    let triangle =
      new_derived_object
        new_shape
        (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.0)))
        '()
    

    The first argument to new_derived_object, new_shape is the method which returns a shape instance. This function will be invoked with the third argument will be appended to the argument list [ C_void ]. In the example, the actual argument list is sent as (C_list [ C_void ; C_void ]). The augmented constructor for a director class needs the first argument to determine whether it is being constructed as a derived object, or as an object of the indicated type only (in this case shape). The Second argument is a closure that will be added to the final C_obj.

    The actual object passed to the self parameter of the director object will be a C_director_core, containing a c_obj option ref and a c_obj. The c_obj provided is the same object that will be returned from new_derived object, that is, the object exposing the overridden methods. The other part is an option ref that will have its value extracted before becoming the ob parameter of your class closure. This ref will contain None if the C++ object underlying is ever destroyed, and will consequently trigger an exception when any method is called on the object after that point (the actual raise is from an inner function used by new_derived_object, and throws NotObject). This prevents a deleted C++ object from causing a core dump, as long as the object is destroyed properly.

    38.2.5.5 Typemaps for directors, directorin, directorout, directorargout

    Special typemaps exist for use with directors, the directorin, directorout, directorargout are used in place of in, out, argout typemaps, except that their direction is reversed. They provide for you to provide argout values, as well as a function return value in the same way you provide function arguments, and to receive arguments the same way you normally receive function returns.

    38.2.5.6 directorin typemap

    The directorin typemap is used when you will receive arguments from a call made by C++ code to you, therefore, values will be translated from C++ to ocaml. You must provide some valid C_obj value. This is the value your ocaml code receives when you are called. In general, a simple directorin typemap can use the same body as a simple out typemap.

    38.2.5.7 directorout typemap

    The directorout typemap is used when you will send an argument from your code back to the C++ caller. That is; directorout specifies a function return conversion. You can usually use the same body as an in typemap for the same type, except when there are special requirements for object ownership, etc.

    38.2.5.8 directorargout typemap

    C++ allows function arguments which are by pointer (*) and by reference (&) to receive a value from the called function, as well as sending one there. Sometimes, this is the main purpose of the argument given. directorargout typemaps allow your caml code to emulate this by specifying additional return values to be put into the output parameters. The SWIG ocaml module is a bit loose in order to make code easier to write. In this case, your return to the caller must be a list containing the normal function return first, followed by any argout values in order. These argout values will be taken from the list and assigned to the values to be returned to C++ through directorargout typemaps. In the event that you don't specify all of the necessary values, integral values will read zero, and struct or object returns have undefined results.

    38.2.6 Exceptions

    If an error occurs in a C or C++ function, you may want to convert that error into an OCaml exception. To do this, you can use the %exception directive. The %exception directive simply lets you rewrite part of the generated wrapper code to include an error check. It is detailed in full in the Exception handling with %exception section.

    In C, a function often indicates an error by returning a status code (e.g. a negative number or a NULL pointer). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (result == NULL) {
        caml_failwith("Not enough memory");
      }
    }
    void *malloc(size_t nbytes);
    

    In OCaml:

    # let a = _malloc (C_int 20000000000);;
    Exception: Failure "Not enough memory".
    #
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception {
      $action
      if (err_occurred()) {
        caml_failwith(err_message());
      }
    }
    

    If no declaration name is given to %exception, it is applied to all wrapper functions. $action is a SWIG special variable and is replaced by the C/C++ function call being wrapped.

    C++ exceptions are also easy to handle. We can catch a C++ exception and rethrow it as an OCaml exception like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        caml_failwith(e.what());
      }
    }
    
    class FooClass {
      public:
        int getitem(int index);      // Exception handling added
        ...
    };
    

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter.

    38.3 Documentation Features

    The features described in this section can be used to generate documentation comments (colloquially referred to as "docstrings") that can be read by OCamldoc.

    38.3.1 Module docstring

    The first documentation comment of an mli file is the comment associated with the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example
    

    When you have more than just a line or so, you can retain the readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus,
    controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc
    

    39 Extending SWIG to support new languages

    39.1 Introduction

    This chapter describes SWIG's internal organization and the process by which new target languages can be developed. First, a brief word of warning---SWIG is continually evolving. The information in this chapter is mostly up to date, but changes are ongoing. Expect a few inconsistencies.

    Also, this chapter is not meant to be a hand-holding tutorial. As a starting point, you should probably look at one of SWIG's existing modules.

    39.2 Prerequisites

    In order to extend SWIG, it is useful to have the following background:

    • An understanding of the C API for the target language.
    • A good grasp of the C++ type system.
    • An understanding of typemaps and some of SWIG's advanced features.
    • Some familiarity with writing C++ (language modules are currently written in C++).

    Since SWIG is essentially a specialized C++ compiler, it may be useful to have some prior experience with compiler design (perhaps even a compilers course) to better understand certain parts of the system. A number of books will also be useful. For example, "The C Programming Language" by Kernighan and Ritchie (a.k.a, "K&R") and the C++ standard, "ISO/IEC 14882 Programming Languages - C++" will be of great use.

    Also, it is useful to keep in mind that SWIG primarily operates as an extension of the C++ type system. At first glance, this might not be obvious, but almost all SWIG directives as well as the low-level generation of wrapper code are driven by C++ datatypes.

    39.3 The Big Picture

    SWIG is a special purpose compiler that parses C++ declarations to generate wrapper code. To make this conversion possible, SWIG makes three fundamental extensions to the C++ language:

    • Typemaps. Typemaps are used to define the conversion/marshalling behavior of specific C++ datatypes. All type conversion in SWIG is based on typemaps. Furthermore, the association of typemaps to datatypes utilizes an advanced pattern matching mechanism that is fully integrated with the C++ type system.
    • Declaration Annotation. To customize wrapper code generation, most declarations can be annotated with special features. For example, you can make a variable read-only, you can ignore a declaration, you can rename a member function, you can add exception handling, and so forth. Virtually all of these customizations are built on top of a low-level declaration annotator that can attach arbitrary attributes to any declaration. Code generation modules can look for these attributes to guide the wrapping process.
    • Class extension. SWIG allows classes and structures to be extended with new methods and attributes (the %extend directive). This has the effect of altering the API in the target language and can be used to generate OO interfaces to C libraries.

    It is important to emphasize that virtually all SWIG features reduce to one of these three fundamental concepts. The type system and pattern matching rules also play a critical role in making the system work. For example, both typemaps and declaration annotation are based on pattern matching and interact heavily with the underlying type system.

    39.4 Execution Model

    When you run SWIG on an interface, processing is handled in stages by a series of system components:

    • An integrated C preprocessor reads a collection of configuration files and the specified interface file into memory. The preprocessor performs the usual functions including macro expansion and file inclusion. However, the preprocessor also performs some transformations of the interface. For instance, #define statements are sometimes transformed into %constant declarations. In addition, information related to file/line number tracking is inserted.
    • A C/C++ parser reads the preprocessed input and generates a full parse tree of all of the SWIG directives and C declarations found. The parser is responsible for many aspects of the system including renaming, declaration annotation, and template expansion. However, the parser does not produce any output nor does it interact with the target language module as it runs. SWIG is not a one-pass compiler.
    • A type-checking pass is made. This adjusts all of the C++ typenames to properly handle namespaces, typedefs, nested classes, and other issues related to type scoping.
    • A semantic pass is made on the parse tree to collect information related to properties of the C++ interface. For example, this pass would determine whether or not a class allows a default constructor.
    • A code generation pass is made using a specific target language module. This phase is responsible for generating the actual wrapper code. All of SWIG's user-defined modules are invoked during this latter stage of compilation.

    The next few sections briefly describe some of these stages.

    39.4.1 Preprocessing

    The preprocessor plays a critical role in the SWIG implementation. This is because a lot of SWIG's processing and internal configuration is managed not by code written in C, but by configuration files in the SWIG library. In fact, when you run SWIG, parsing starts with a small interface file like this (note: this explains the cryptic error messages that new users sometimes get when SWIG is misconfigured or installed incorrectly):

    %include "swig.swg"             // Global SWIG configuration
    %include "langconfig.swg"       // Language specific configuration
    %include "yourinterface.i"      // Your interface file
    

    The swig.swg file contains global configuration information. In addition, this file defines many of SWIG's standard directives as macros. For instance, part of of swig.swg looks like this:

    ...
    /* Code insertion directives such as %wrapper %{ ... %} */
    
    #define %begin       %insert("begin")
    #define %runtime     %insert("runtime")
    #define %header      %insert("header")
    #define %wrapper     %insert("wrapper")
    #define %init        %insert("init")
    
    /* Access control directives */
    
    #define %immutable   %feature("immutable", "1")
    #define %mutable     %feature("immutable")
    
    /* Directives for callback functions */
    
    #define %callback(x) %feature("callback") `x`;
    #define %nocallback  %feature("callback");
    
    /* %ignore directive */
    
    #define %ignore         %rename($ignore)
    #define %ignorewarn(x)  %rename("$ignore:" x)
    ...
    

    The fact that most of the standard SWIG directives are macros is intended to simplify the implementation of the internals. For instance, rather than having to support dozens of special directives, it is easier to have a few basic primitives such as %feature or %insert.

    The langconfig.swg file is supplied by the target language. This file contains language-specific configuration information. More often than not, this file provides run-time wrapper support code (e.g., the type-checker) as well as a collection of typemaps that define the default wrapping behavior. Note: the name of this file depends on the target language and is usually something like python.swg or perl5.swg.

    As a debugging aid, the text that SWIG feeds to its C++ parser can be obtained by running swig -E interface.i. This output probably isn't too useful in general, but it will show how macros have been expanded as well as everything else that goes into the low-level construction of the wrapper code.

    39.4.2 Parsing

    The current C++ parser handles a subset of C++. Most incompatibilities with C are due to subtle aspects of how SWIG parses declarations. Specifically, SWIG expects all C/C++ declarations to follow this general form:

    storage type declarator initializer;
    

    storage is a keyword such as extern, static, typedef, or virtual. type is a primitive datatype such as int or void. type may be optionally qualified with a qualifier such as const or volatile. declarator is a name with additional type-construction modifiers attached to it (pointers, arrays, references, functions, etc.). Examples of declarators include *x, **x, x[20], and (*x)(int, double). The initializer may be a value assigned using = or body of code enclosed in braces { ... }.

    This declaration format covers most common C++ declarations. However, the C++ standard is somewhat more flexible in the placement of the parts. For example, it is technically legal, although uncommon to write something like int typedef const a in your program. SWIG simply doesn't bother to deal with this case.

    The other significant difference between C++ and SWIG is in the treatment of typenames. In C++, if you have a declaration like this,

    int blah(Foo *x, Bar *y);
    

    it won't parse correctly unless Foo and Bar have been previously defined as types either using a class definition or a typedef. The reasons for this are subtle, but this treatment of typenames is normally integrated at the level of the C tokenizer---when a typename appears, a different token is returned to the parser instead of an identifier.

    SWIG does not operate in this manner--any legal identifier can be used as a type name. The reason for this is primarily motivated by the use of SWIG with partially defined data. Specifically, SWIG is supposed to be easy to use on interfaces with missing type information.

    Because of the different treatment of typenames, the most serious limitation of the SWIG parser is that it can't process type declarations where an extra (and unnecessary) grouping operator is used. For example:

    int (x);         /* A variable x */
    int (y)(int);    /* A function y */
    

    The placing of extra parentheses in type declarations like this is already recognized by the C++ community as a potential source of strange programming errors. For example, Scott Meyers "Effective STL" discusses this problem in a section on avoiding C++'s "most vexing parse."

    The parser is also unable to handle declarations with no return type or bare argument names. For example, in an old C program, you might see things like this:

    foo(a, b) {
    ...
    }
    

    In this case, the return type as well as the types of the arguments are taken by the C compiler to be an int. However, SWIG interprets the above code as an abstract declarator for a function returning a foo and taking types a and b as arguments).

    39.4.3 Parse Trees

    The SWIG parser produces a complete parse tree of the input file before any wrapper code is actually generated. Each item in the tree is known as a "Node". Each node is identified by a symbolic tag. Furthermore, a node may have an arbitrary number of children. The parse tree structure and tag names of an interface can be displayed using swig -debug-tags. For example:

    $ swig -c++ -python -debug-tags example.i
     . top (example.i:1)
     . top . include (example.i:1)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/swig.swg:71)
     . top . include . typemap . typemapitem (/r0/beazley/Projects/lib/swig1.3/swig.swg:71)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/swig.swg:83)
     . top . include . typemap . typemapitem (/r0/beazley/Projects/lib/swig1.3/swig.swg:83)
     . top . include (example.i:4)
     . top . include . insert (/r0/beazley/Projects/lib/swig1.3/python/python.swg:7)
     . top . include . insert (/r0/beazley/Projects/lib/swig1.3/python/python.swg:8)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/python/python.swg:19)
    ...
     . top . include (example.i:6)
     . top . include . module (example.i:2)
     . top . include . insert (example.i:6)
     . top . include . include (example.i:9)
     . top . include . include . class (example.h:3)
     . top . include . include . class . access (example.h:4)
     . top . include . include . class . constructor (example.h:7)
     . top . include . include . class . destructor (example.h:10)
     . top . include . include . class . cdecl (example.h:11)
     . top . include . include . class . cdecl (example.h:11)
     . top . include . include . class . cdecl (example.h:12)
     . top . include . include . class . cdecl (example.h:13)
     . top . include . include . class . cdecl (example.h:14)
     . top . include . include . class . cdecl (example.h:15)
     . top . include . include . class (example.h:18)
     . top . include . include . class . access (example.h:19)
     . top . include . include . class . cdecl (example.h:20)
     . top . include . include . class . access (example.h:21)
     . top . include . include . class . constructor (example.h:22)
     . top . include . include . class . cdecl (example.h:23)
     . top . include . include . class . cdecl (example.h:24)
     . top . include . include . class (example.h:27)
     . top . include . include . class . access (example.h:28)
     . top . include . include . class . cdecl (example.h:29)
     . top . include . include . class . access (example.h:30)
     . top . include . include . class . constructor (example.h:31)
     . top . include . include . class . cdecl (example.h:32)
     . top . include . include . class . cdecl (example.h:33)
    

    Even for the most simple interface, the parse tree structure is larger than you might expect. For example, in the above output, a substantial number of nodes are actually generated by the python.swg configuration file which defines typemaps and other directives. The contents of the user-supplied input file don't appear until the end of the output.

    The contents of each parse tree node consist of a collection of attribute/value pairs. Internally, the nodes are simply represented by hash tables. A display of the entire parse-tree structure can be obtained using swig -debug-top <n>, where n is the stage being processed. There are a number of other parse tree display options, for example, swig -debug-module <n> will avoid displaying system parse information and only display the parse tree pertaining to the user's module at stage n of processing.

    $ swig -c++ -python -debug-module 4 example.i
          +++ include ----------------------------------------
          | name         - "example.i"
    
                +++ module ----------------------------------------
                | name         - "example"
                |
                +++ insert ----------------------------------------
                | code         - "\n#include \"example.h\"\n"
                |
                +++ include ----------------------------------------
                | name         - "example.h"
    
                      +++ class ----------------------------------------
                      | abstract     - "1"
                      | sym:name     - "Shape"
                      | name         - "Shape"
                      | kind         - "class"
                      | symtab       - 0x40194140
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Shape"
                            | name         - "Shape"
                            | decl         - "f()."
                            | code         - "{\n    nshapes++;\n  }"
                            | sym:symtab   - 0x40194140
                            |
                            +++ destructor ----------------------------------------
                            | sym:name     - "~Shape"
                            | name         - "~Shape"
                            | storage      - "virtual"
                            | code         - "{\n    nshapes--;\n  }"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "x"
                            | name         - "x"
                            | decl         - ""
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "y"
                            | name         - "y"
                            | decl         - ""
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "move"
                            | name         - "move"
                            | decl         - "f(double, double)."
                            | parms        - double, double
                            | type         - "void"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | value        - "0"
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | value        - "0"
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "nshapes"
                            | name         - "nshapes"
                            | decl         - ""
                            | storage      - "static"
                            | type         - "int"
                            | sym:symtab   - 0x40194140
                            |
                      +++ class ----------------------------------------
                      | sym:name     - "Circle"
                      | name         - "Circle"
                      | kind         - "class"
                      | bases        - 0x40194510
                      | symtab       - 0x40194538
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "private"
                            |
                            +++ cdecl ----------------------------------------
                            | name         - "radius"
                            | decl         - ""
                            | type         - "double"
                            |
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Circle"
                            | name         - "Circle"
                            | parms        - double
                            | decl         - "f(double)."
                            | code         - "{ }"
                            | sym:symtab   - 0x40194538
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194538
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194538
                            |
                      +++ class ----------------------------------------
                      | sym:name     - "Square"
                      | name         - "Square"
                      | kind         - "class"
                      | bases        - 0x40194760
                      | symtab       - 0x40194788
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "private"
                            |
                            +++ cdecl ----------------------------------------
                            | name         - "width"
                            | decl         - ""
                            | type         - "double"
                            |
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Square"
                            | name         - "Square"
                            | parms        - double
                            | decl         - "f(double)."
                            | code         - "{ }"
                            | sym:symtab   - 0x40194788
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194788
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194788
    

    39.4.4 Attribute namespaces

    Attributes of parse tree nodes are often prepended with a namespace qualifier. For example, the attributes sym:name and sym:symtab are attributes related to symbol table management and are prefixed with sym:. As a general rule, only those attributes which are directly related to the raw declaration appear without a prefix (type, name, declarator, etc.).

    Target language modules may add additional attributes to nodes to assist the generation of wrapper code. The convention for doing this is to place these attributes in a namespace that matches the name of the target language. For example, python:foo or perl:foo.

    39.4.5 Symbol Tables

    During parsing, all symbols are managed in the space of the target language. The sym:name attribute of each node contains the symbol name selected by the parser. Normally, sym:name and name are the same. However, the %rename directive can be used to change the value of sym:name. You can see the effect of %rename by trying it on a simple interface and dumping the parse tree. For example:

    %rename(foo_i) foo(int);
    %rename(foo_d) foo(double);
    
    void foo(int);
    void foo(double);
    void foo(Bar *b);
    

    There are various debug- options that can be useful for debugging and analysing the parse tree. For example, the debug-top <n> or debug-module <n> options will dump the entire/top of the parse tree or the module subtree at one of the four n stages of processing. The parse tree can be viewed after the final stage of processing by running SWIG:

    $ swig -debug-top 4 example.i
    ...
                +++ cdecl ----------------------------------------
                | sym:name     - "foo_i"
                | name         - "foo"
                | decl         - "f(int)."
                | parms        - int
                | type         - "void"
                | sym:symtab   - 0x40165078
                |
                +++ cdecl ----------------------------------------
                | sym:name     - "foo_d"
                | name         - "foo"
                | decl         - "f(double)."
                | parms        - double
                | type         - "void"
                | sym:symtab   - 0x40165078
                |
                +++ cdecl ----------------------------------------
                | sym:name     - "foo"
                | name         - "foo"
                | decl         - "f(p.Bar)."
                | parms        - Bar *
                | type         - "void"
                | sym:symtab   - 0x40165078
    

    All symbol-related conflicts and complaints about overloading are based on sym:name values. For instance, the following example uses %rename in reverse to generate a name clash.

    %rename(foo) foo_i(int);
    %rename(foo) foo_d(double);
    
    void foo_i(int);
    void foo_d(double);
    void foo(Bar *b);
    

    When you run SWIG on this you now get:

    $ ./swig example.i
    example.i:6. Overloaded declaration ignored.  foo_d(double )
    example.i:5. Previous declaration is foo_i(int )
    example.i:7. Overloaded declaration ignored.  foo(Bar *)
    example.i:5. Previous declaration is foo_i(int )
    

    39.4.6 The %feature directive

    A number of SWIG directives such as %exception are implemented using the low-level %feature directive. For example:

    %feature("except") getitem(int) {
      try {
         $action
      } catch (badindex) {
         ...
      }
    }
    
    ...
    class Foo {
    public:
      Object *getitem(int index) throws(badindex);
      ...
    };
    

    The behavior of %feature is very easy to describe--it simply attaches a new attribute to any parse tree node that matches the given prototype. When a feature is added, it shows up as an attribute in the feature: namespace. You can see this when running with the -debug-top 4 option. For example:

     +++ cdecl ----------------------------------------
     | sym:name     - "getitem"
     | name         - "getitem"
     | decl         - "f(int).p."
     | parms        - int
     | type         - "Object"
     | feature:except - "{\n    try {\n       $action\n    } catc..."
     | sym:symtab   - 0x40168ac8
     |
    

    Feature names are completely arbitrary and a target language module can be programmed to respond to any feature name that it wants to recognize. The data stored in a feature attribute is usually just a raw unparsed string. For example, the exception code above is simply stored without any modifications.

    39.4.7 Code Generation

    Language modules work by defining handler functions that know how to respond to different types of parse-tree nodes. These handlers simply look at the attributes of each node in order to produce low-level code.

    In reality, the generation of code is somewhat more subtle than simply invoking handler functions. This is because parse-tree nodes might be transformed. For example, suppose you are wrapping a class like this:

    class Foo {
    public:
      virtual int *bar(int x);
    };
    

    When the parser constructs a node for the member bar, it creates a raw "cdecl" node with the following attributes:

    nodeType    : cdecl
    name        : bar
    type        : int
    decl        : f(int).p
    parms       : int x
    storage     : virtual
    sym:name    : bar
    

    To produce wrapper code, this "cdecl" node undergoes a number of transformations. First, the node is recognized as a function declaration. This adjusts some of the type information--specifically, the declarator is joined with the base datatype to produce this:

    nodeType    : cdecl
    name        : bar
    type        : p.int        <-- Notice change in return type
    decl        : f(int).p
    parms       : int x
    storage     : virtual
    sym:name    : bar
    

    Next, the context of the node indicates that the node is really a member function. This produces a transformation to a low-level accessor function like this:

    nodeType    : cdecl
    name        : bar
    type        : int.p
    decl        : f(int).p
    parms       : Foo *self, int x            <-- Added parameter
    storage     : virtual
    wrap:action : result = (arg1)->bar(arg2)  <-- Action code added
    sym:name    : Foo_bar                     <-- Symbol name changed
    

    In this transformation, notice how an additional parameter was added to the parameter list and how the symbol name of the node has suddenly changed into an accessor using the naming scheme described in the "SWIG Basics" chapter. A small fragment of "action" code has also been generated--notice how the wrap:action attribute defines the access to the underlying method. The data in this transformed node is then used to generate a wrapper.

    Language modules work by registering handler functions for dealing with various types of nodes at different stages of transformation. This is done by inheriting from a special Language class and defining a collection of virtual methods. For example, the Python module defines a class as follows:

    class PYTHON : public Language {
    protected:
    public :
      virtual void main(int, char *argv[]);
      virtual int  top(Node *);
      virtual int  functionWrapper(Node *);
      virtual int  constantWrapper(Node *);
      virtual int  variableWrapper(Node *);
      virtual int  nativeWrapper(Node *);
      virtual int  membervariableHandler(Node *);
      virtual int  memberconstantHandler(Node *);
      virtual int  memberfunctionHandler(Node *);
      virtual int  constructorHandler(Node *);
      virtual int  destructorHandler(Node *);
      virtual int  classHandler(Node *);
      virtual int  classforwardDeclaration(Node *);
      virtual int  insertDirective(Node *);
      virtual int  importDirective(Node *);
    };
    

    The role of these functions is described shortly.

    39.4.8 SWIG and XML

    Much of SWIG's current parser design was originally motivated by interest in using XML to represent SWIG parse trees. Although XML is not currently used in any direct manner, the parse tree structure, use of node tags, attributes, and attribute namespaces are all influenced by aspects of XML parsing. Therefore, in trying to understand SWIG's internal data structures, it may be useful to keep XML in the back of your mind as a model.

    39.5 Primitive Data Structures

    Most of SWIG is constructed using three basic data structures: strings, hashes, and lists. These data structures are dynamic in same way as similar structures found in many scripting languages. For instance, you can have containers (lists and hash tables) of mixed types and certain operations are polymorphic.

    This section briefly describes the basic structures so that later sections of this chapter make more sense.

    When describing the low-level API, the following type name conventions are used:

    • String. A string object.
    • Hash. A hash object.
    • List. A list object.
    • String_or_char. A string object or a char *.
    • Object_or_char. An object or a char *.
    • Object. Any object (string, hash, list, etc.)

    In most cases, other typenames in the source are aliases for one of these primitive types. Specifically:

    typedef String SwigType;
    typedef Hash   Parm;
    typedef Hash   ParmList;
    typedef Hash   Node;
    typedef Hash   Symtab;
    typedef Hash   Typetab;
    

    39.5.1 Strings

    String *NewString(const String_or_char *val)

    Creates a new string with initial value val . val may be a char * or another String object. If you want to create an empty string, use "" for val.

    String *NewStringf(const char *fmt, ...)

    Creates a new string whose initial value is set according to a C printf style format string in fmt. Additional arguments follow depending on fmt.

    String *Copy(String *s)

    Make a copy of the string s.

    void Delete(String *s)

    Deletes s.

    int Len(const String_or_char *s)

    Returns the length of the string.

    char *Char(const String_or_char *s)

    Returns a pointer to the first character in a string.

    void Append(String *s, const String_or_char *t)

    Appends t to the end of string s.

    void Insert(String *s, int pos, const String_or_char *t)

    Inserts t into s at position pos. The contents of s are shifted accordingly. The special value DOH_END can be used for pos to indicate insertion at the end of the string (appending).

    int Strcmp(const String_or_char *s, const String_or_char *t)

    Compare strings s and t. Same as the C strcmp() function.

    int Strncmp(const String_or_char *s, const String_or_char *t, int len)

    Compare the first len characters of strings s and t. Same as the C strncmp() function.

    char *Strstr(const String_or_char *s, const String_or_char *pat)

    Returns a pointer to the first occurrence of pat in s. Same as the C strstr() function.

    char *Strchr(const String_or_char *s, char ch)

    Returns a pointer to the first occurrence of character ch in s. Same as the C strchr() function.

    void Chop(String *s)

    Chops trailing whitespace off the end of s .

    int Replace(String *s, const String_or_char *pat, const String_or_char *rep, int flags)

    Replaces the pattern pat with rep in string s . flags is a combination of the following flags:

    DOH_REPLACE_ANY       - Replace all occurrences
    DOH_REPLACE_ID        - Valid C identifiers only
    DOH_REPLACE_NOQUOTE   - Don't replace in quoted strings
    DOH_REPLACE_FIRST     - Replace first occurrence only.
    

    Returns the number of replacements made (if any).

    39.5.2 Hashes

    Hash *NewHash()

    Creates a new empty hash table.

    Hash *Copy(Hash *h)

    Make a shallow copy of the hash h.

    void Delete(Hash *h)

    Deletes h.

    int Len(Hash *h)

    Returns the number of items in h.

    Object *Getattr(Hash *h, const String_or_char *key)

    Gets an object from h. key may be a string or a simple char * string. Returns NULL if not found.

    int Setattr(Hash *h, const String_or_char *key, const Object_or_char *val)

    Stores val in h. key may be a string or a simple char *. If val is not a standard object (String, Hash, or List) it is assumed to be a char * in which case it is used to construct a String that is stored in the hash. If val is NULL, the object is deleted. Increases the reference count of val. Returns 1 if this operation replaced an existing hash entry, 0 otherwise.

    int Delattr(Hash *h, const String_or_char *key)

    Deletes the hash item referenced by key. Decreases the reference count on the corresponding object (if any). Returns 1 if an object was removed, 0 otherwise.

    List *Keys(Hash *h)

    Returns the list of hash table keys.

    39.5.3 Lists

    List *NewList()

    Creates a new empty list.

    List *Copy(List *x)

    Make a shallow copy of the List x.

    void Delete(List *x)

    Deletes x.

    int Len(List *x)

    Returns the number of items in x.

    Object *Getitem(List *x, int n)

    Returns an object from x with index n . If n is beyond the end of the list, the last item is returned. If n is negative, the first item is returned.

    int *Setitem(List *x, int n, const Object_or_char *val)

    Stores val in x. If val is not a standard object (String, Hash, or List) it is assumed to be a char * in which case it is used to construct a String that is stored in the list. n must be in range. Otherwise, an assertion will be raised.

    int *Delitem(List *x, int n)

    Deletes item n from the list, shifting items down if necessary. To delete the last item in the list, use the special value DOH_END for n.

    void Append(List *x, const Object_or_char *t)

    Appends t to the end of x. If t is not a standard object, it is assumed to be a char * and is used to create a String object.

    void Insert(String *s, int pos, const Object_or_char *t)

    Inserts t into s at position pos. The contents of s are shifted accordingly. The special value DOH_END can be used for pos to indicate insertion at the end of the list (appending). If t is not a standard object, it is assumed to be a char * and is used to create a String object.

    39.5.4 Common operations

    The following operations are applicable to all datatypes.

    Object *Copy(Object *x)

    Make a copy of the object x.

    void Delete(Object *x)

    Deletes x.

    void Setfile(Object *x, String_or_char *f)

    Sets the filename associated with x. Used to track objects and report errors.

    String *Getfile(Object *x)

    Gets the filename associated with x.

    void Setline(Object *x, int n)

    Sets the line number associated with x. Used to track objects and report errors.

    int Getline(Object *x)

    Gets the line number associated with x.

    39.5.5 Iterating over Lists and Hashes

    To iterate over the elements of a list or a hash table, the following functions are used:

    Iterator First(Object *x)

    Returns an iterator object that points to the first item in a list or hash table. The item attribute of the Iterator object is a pointer to the item. For hash tables, the key attribute of the Iterator object additionally points to the corresponding Hash table key. The item and key attributes are NULL if the object contains no items or if there are no more items.

    Iterator Next(Iterator i)

    Returns an iterator that points to the next item in a list or hash table. Here are two examples of iteration:

    List *l = (some list);
    Iterator i;
    
    for (i = First(l); i.item; i = Next(i)) {
      Printf(stdout, "%s\n", i.item);
    }
    
    Hash *h = (some hash);
    Iterator j;
    
    for (j = First(j); j.item; j= Next(j)) {
      Printf(stdout, "%s : %s\n", j.key, j.item);
    }
    

    39.5.6 I/O

    Special I/O functions are used for all internal I/O. These operations work on C FILE * objects, String objects, and special File objects (which are merely a wrapper around FILE *).

    int Printf(String_or_FILE *f, const char *fmt, ...)

    Formatted I/O. Same as the C fprintf() function except that output can also be directed to a string object. Note: the %s format specifier works with both strings and char *. All other format operators have the same meaning.

    int Printv(String_or_FILE *f, String_or_char *arg1, ..., NULL)

    Prints a variable number of strings arguments to the output. The last argument to this function must be NULL. The other arguments can either be char * or string objects.

    int Putc(int ch, String_or_FILE *f)

    Same as the C fputc() function.

    int Write(String_or_FILE *f, void *buf, int len)

    Same as the C write() function.

    int Read(String_or_FILE *f, void *buf, int maxlen)

    Same as the C read() function.

    int Getc(String_or_FILE *f)

    Same as the C fgetc() function.

    int Ungetc(int ch, String_or_FILE *f)

    Same as the C ungetc() function.

    int Seek(String_or_FILE *f, int offset, int whence)

    Same as the C seek() function. offset is the number of bytes. whence is one of SEEK_SET, SEEK_CUR, or SEEK_END..

    long Tell(String_or_FILE *f)

    Same as the C tell() function.

    File *NewFile(const char *filename, const char *mode, List *newfiles)

    Create a File object using the fopen() library call. This file differs from FILE * in that it can be placed in the standard SWIG containers (lists, hashes, etc.). The filename is added to the newfiles list if newfiles is non-zero and the file was created successfully.

    File *NewFileFromFile(FILE *f)

    Create a File object wrapper around an existing FILE * object.

    There's no explicit function to close a file, just call Delete(f) - this decreases the reference count, and the file will be closed when the reference count reaches zero.

    The use of the above I/O functions and strings play a critical role in SWIG. It is common to see small code fragments of code generated using code like this:

    /* Print into a string */
    String *s = NewString("");
    Printf(s, "Hello\n");
    for (i = 0; i < 10; i++) {
      Printf(s, "%d\n", i);
    }
    ...
    /* Print string into a file */
    Printf(f, "%s\n", s);
    

    Similarly, the preprocessor and parser all operate on string-files.

    39.6 Navigating and manipulating parse trees

    Parse trees are built as collections of hash tables. Each node is a hash table in which arbitrary attributes can be stored. Certain attributes in the hash table provide links to other parse tree nodes. The following macros can be used to move around the parse tree.

    String *nodeType(Node *n)

    Returns the node type tag as a string. The returned string indicates the type of parse tree node.

    Node *nextSibling(Node *n)

    Returns the next node in the parse tree. For example, the next C declaration.

    Node *previousSibling(Node *n)

    Returns the previous node in the parse tree. For example, the previous C declaration.

    Node *firstChild(Node *n)

    Returns the first child node. For example, if n was a C++ class node, this would return the node for the first class member.

    Node *lastChild(Node *n)

    Returns the last child node. You might use this if you wanted to append a new node to the children of a class.

    Node *parentNode(Node *n)

    Returns the parent of node n. Use this to move up the pass tree.

    The following macros can be used to change all of the above attributes. Normally, these functions are only used by the parser. Changing them without knowing what you are doing is likely to be dangerous.

    void set_nodeType(Node *n, const String_or_char)

    Change the node type. tree node.

    void set_nextSibling(Node *n, Node *s)

    Set the next sibling.

    void set_previousSibling(Node *n, Node *s)

    Set the previous sibling.

    void set_firstChild(Node *n, Node *c)

    Set the first child node.

    void set_lastChild(Node *n, Node *c)

    Set the last child node.

    void set_parentNode(Node *n, Node *p)

    Set the parent node.

    The following utility functions are used to alter the parse tree (at your own risk)

    void appendChild(Node *parent, Node *child)

    Append a child to parent. The appended node becomes the last child.

    void deleteNode(Node *node)

    Deletes a node from the parse tree. Deletion reconnects siblings and properly updates the parent so that sibling nodes are unaffected.

    39.7 Working with attributes

    Since parse tree nodes are just hash tables, attributes are accessed using the Getattr(), Setattr(), and Delattr() operations. For example:

    int functionHandler(Node *n) {
      String *name    = Getattr(n, "name");
      String *symname = Getattr(n, "sym:name");
      SwigType *type  = Getattr(n, "type");
      ...
    }
    

    New attributes can be freely attached to a node as needed. However, when new attributes are attached during code generation, they should be prepended with a namespace prefix. For example:

    ...
    Setattr(n, "python:docstring", doc);     /* Store docstring */
    ...
    

    A quick way to check the value of an attribute is to use the checkAttribute() function like this:

    if (checkAttribute(n, "storage", "virtual")) {
      /* n is virtual */
      ...
    }
    

    Changing the values of existing attributes is allowed and is sometimes done to implement node transformations. However, if a function/method modifies a node, it is required to restore modified attributes to their original values. To simplify the task of saving/restoring attributes, the following functions are used:

    int Swig_save(const char *ns, Node *n, const char *name1, const char *name2, ..., NIL)

    Saves a copy of attributes name1, name2, etc. from node n. Copies of the attributes are actually resaved in the node in a different namespace which is set by the ns argument. For example, if you call Swig_save("foo", n, "type", NIL), then the "type" attribute will be copied and saved as "foo:type". The namespace name itself is stored in the "view" attribute of the node. If necessary, this can be examined to find out where previous values of attributes might have been saved.

    int Swig_restore(Node *n)

    Restores the attributes saved by the previous call to Swig_save(). Those attributes that were supplied to Swig_save() will be restored to their original values.

    The Swig_save() and Swig_restore() functions must always be used as a pair. That is, every call to Swig_save() must have a matching call to Swig_restore(). Calls can be nested if necessary. Here is an example that shows how the functions might be used:

    int variableHandler(Node *n) {
      Swig_save("variableHandler", n, "type", "sym:name", NIL);
      String *symname = Getattr(n, "sym:name");
      SwigType *type  = Getattr(n, "type");
      ...
      Append(symname, "_global");        // Change symbol name
      SwigType_add_pointer(type);        // Add pointer
      ...
      generate wrappers
      ...
      Swig_restore(n);                  // Restore original values
      return SWIG_OK;
    }
    

    int Swig_require(const char *ns, Node *n, const char *name1, const char *name2, ..., NIL)

    This is an enhanced version of Swig_save() that adds error checking. If an attribute name is not present in n , a failed assertion results and SWIG terminates with a fatal error. Optionally, if an attribute name is specified as "*name", a copy of the attribute is saved as with Swig_save(). If an attribute is specified as "?name", the attribute is optional. Swig_restore() must always be called after using this function.

    39.8 Type system

    SWIG implements the complete C++ type system including typedef, inheritance, pointers, references, and pointers to members. A detailed discussion of type theory is impossible here. However, let's cover the highlights.

    39.8.1 String encoding of types

    All types in SWIG consist of a base datatype and a collection of type operators that are applied to the base. A base datatype is almost always some kind of primitive type such as int or double . The operators consist of things like pointers, references, arrays, and so forth. Internally, types are represented as strings that are constructed in a very precise manner. Here are some examples:

    C datatype                     SWIG encoding (strings)
    -----------------------------  --------------------------
    int                            "int"
    int *                          "p.int"
    const int *                    "p.q(const).int"
    int (*x)(int, double)          "p.f(int, double).int"
    int [20][30]                   "a(20).a(30).int"
    int (F::*)(int)                "m(F).f(int).int"
    vector<int> *                  "p.vector<(int)>"
    

    Reading the SWIG encoding is often easier than figuring out the C code---just read it from left to right. For a type of "p.f(int, double).int" is a "pointer to a function(int, double) that returns int".

    The following operator encodings are used in type strings:

    Operator              Meaning
    -------------------   -------------------------------
    p.                    Pointer to
    a(n).                 Array of dimension n
    r.                    C++ reference
    m(class).             Member pointer to class
    f(args).              Function.
    q(qlist).             Qualifiers
    

    In addition, type names may be parameterized by templates. This is represented by enclosing the template parameters in <( ... )>. Variable length arguments are represented by the special base type of v(...).

    If you want to experiment with type encodings, the raw type strings can be inserted into an interface file using backticks `` wherever a type is expected. For instance, here is an extremely perverted example:

    `p.a(10).p.f(int, p.f(int).int)` foo(int, int (*x)(int));
    

    This corresponds to the immediately obvious C declaration:

    (*(*foo(int, int (*)(int)))[10])(int, int (*)(int));
    

    Aside from the potential use of this declaration on a C programming quiz, it motivates the use of the special SWIG encoding of types. The SWIG encoding is much easier to work with because types can be easily examined, modified, and constructed using simple string operations (comparison, substrings, concatenation, etc.). For example, in the parser, a declaration like this

    int *a[30];
    

    is processed in a few pieces. In this case, you have the base type " int" and the declarator of type "a(30).p.". To make the final type, the two parts are just joined together using string concatenation.

    39.8.2 Type construction

    The following functions are used to construct types. You should use these functions instead of trying to build the type strings yourself.

    void SwigType_add_pointer(SwigType *ty)

    Adds a pointer to ty.

    void SwigType_del_pointer(SwigType *ty)

    Removes a single pointer from ty.

    void SwigType_add_reference(SwigType *ty)

    Adds a reference to ty.

    void SwigType_add_array(SwigType *ty, const String_or_char *size)

    Adds an array with dimension dim to ty .

    void SwigType_del_array(SwigType *ty)

    Removes a single array dimension from ty.

    int SwigType_array_ndim(SwigType *ty)

    Returns number of array dimensions of ty.

    String* SwigType_array_getdim(SwigType *ty, int n)

    Returns nth array dimension of ty .

    void SwigType_array_setdim(SwigType *ty, int n, const String_or_char *rep)

    Sets nth array dimensions of ty to rep.

    void SwigType_add_qualifier(SwigType *ty, const String_or_char *q)

    Adds a type qualifier q to ty. q is typically "const" or "volatile".

    void SwigType_add_memberpointer(SwigType *ty, const String_or_char *cls)

    Adds a pointer to a member of class cls to ty.

    void SwigType_add_function(SwigType *ty, ParmList *p)

    Adds a function to ty. p is a linked-list of parameter nodes as generated by the parser. See the section on parameter lists for details about the representation.

    void SwigType_add_template(SwigType *ty, ParmList *p)

    Adds a template to ty. p is a linked-list of parameter nodes as generated by the parser. See the section on parameter lists for details about the representation.

    SwigType *SwigType_pop(SwigType *ty)

    Removes the last type constructor from ty and returns it. ty is modified.

    void SwigType_push(SwigType *ty, SwigType *op)

    Pushes the type operators in op onto type ty. The opposite of SwigType_pop().

    SwigType *SwigType_pop_arrays(SwigType *ty)

    Removes all leading array operators from ty and returns them. ty is modified. For example, if ty is "a(20).a(10).p.int", then this function would return "a(20).a(10)." and modify ty so that it has the value "p.int".

    SwigType *SwigType_pop_function(SwigType *ty)

    Removes a function operator from ty including any qualification. ty is modified. For example, if ty is "f(int).int", then this function would return "f(int)." and modify ty so that it has the value "int" .

    SwigType *SwigType_base(SwigType *ty)

    Returns the base type of a type. For example, if ty is "p.a(20).int", this function would return "int" . ty is unmodified.

    SwigType *SwigType_prefix(SwigType *ty)

    Returns the prefix of a type. For example, if ty is "p.a(20).int", this function would return "p.a(20).". ty is unmodified.

    39.8.3 Type tests

    The following functions can be used to test properties of a datatype.

    int SwigType_ispointer(SwigType *ty)

    Checks if ty is a standard pointer.

    int SwigType_ismemberpointer(SwigType *ty)

    Checks if ty is a member pointer.

    int SwigType_isreference(SwigType *ty)

    Checks if ty is a C++ reference.

    int SwigType_isarray(SwigType *ty)

    Checks if ty is an array.

    int SwigType_isfunction(SwigType *ty)

    Checks if ty is a function.

    int SwigType_isqualifier(SwigType *ty)

    Checks if ty is a qualifier.

    int SwigType_issimple(SwigType *ty)

    Checks if ty is a simple type. No operators applied.

    int SwigType_isconst(SwigType *ty)

    Checks if ty is a const type.

    int SwigType_isvarargs(SwigType *ty)

    Checks if ty is a varargs type.

    int SwigType_istemplate(SwigType *ty)

    Checks if ty is a templatized type.

    39.8.4 Typedef and inheritance

    The behavior of typedef declaration is to introduce a type alias. For instance, typedef int Integer makes the identifier Integer an alias for int. The treatment of typedef in SWIG is somewhat complicated due to the pattern matching rules that get applied in typemaps and the fact that SWIG prefers to generate wrapper code that closely matches the input to simplify debugging (a user will see the typedef names used in their program instead of the low-level primitive C datatypes).

    To handle typedef, SWIG builds a collection of trees containing typedef relations. For example,

    typedef int Integer;
    typedef Integer *IntegerPtr;
    typedef int Number;
    typedef int Size;
    

    produces two trees like this:

                     int               p.Integer
                   ^  ^  ^                 ^
                  /   |   \                |
                 /    |    \               |
            Integer  Size   Number    IntegerPtr
    

    To resolve a single typedef relationship, the following function is used:

    SwigType *SwigType_typedef_resolve(SwigType *ty)

    Checks if ty can be reduced to a new type via typedef. If so, returns the new type. If not, returns NULL.

    Typedefs are only resolved in simple typenames that appear in a type. For example, the type base name and in function parameters. When resolving types, the process starts in the leaf nodes and moves up the tree towards the root. Here are a few examples that show how it works:

    Original type            After typedef_resolve()
    ------------------------ -----------------------
    Integer                  int
    a(30).Integer            int
    p.IntegerPtr             p.p.Integer
    p.p.Integer              p.p.int
    

    For complicated types, the process can be quite involved. Here is the reduction of a function pointer:

    p.f(Integer, p.IntegerPtr, Size).Integer          : Start
    p.f(Integer, p.IntegerPtr, Size).int
    p.f(int, p.IntegerPtr, Size).int
    p.f(int, p.p.Integer, Size).int
    p.f(int, p.p.int, Size).int
    p.f(int, p.p.int, int).int                        : End
    

    Two types are equivalent if their full type reductions are the same. The following function will fully reduce a datatype:

    SwigType *SwigType_typedef_resolve_all(SwigType *ty)

    Fully reduces ty according to typedef rules. Resulting datatype will consist only of primitive typenames.

    39.8.5 Lvalues

    When generating wrapper code, it is necessary to emit datatypes that can be used on the left-hand side of an assignment operator (an lvalue). However, not all C datatypes can be used in this way---especially arrays and const-qualified types. To generate a type that can be used as an lvalue, use the following function:

    SwigType *SwigType_ltype(SwigType *ty)

    Converts type ty to a type that can be used as an lvalue in assignment. The resulting type is stripped of qualifiers and arrays are converted to a pointers.

    The creation of lvalues is fully aware of typedef and other aspects of the type system. Therefore, the creation of an lvalue may result in unexpected results. Here are a few examples:

    typedef double Matrix4[4][4];
    Matrix4 x;    // type = 'Matrix4', ltype='p.a(4).double'
    
    typedef const char * Literal;
    Literal y;    // type = 'Literal', ltype='p.char'
    

    39.8.6 Output functions

    The following functions produce strings that are suitable for output.

    String *SwigType_str(SwigType *ty, const String_or_char *id = 0)

    Generates a C string for a datatype. id is an optional declarator. For example, if ty is "p.f(int).int" and id is "foo", then this function produces "int (*foo)(int)". This function is used to convert string-encoded types back into a form that is valid C syntax.

    String *SwigType_lstr(SwigType *ty, const String_or_char *id = 0)

    This is the same as SwigType_str() except that the result is generated from the type's lvalue (as generated from SwigType_ltype).

    String *SwigType_lcaststr(SwigType *ty, const String_or_char *id = 0)

    Generates a casting operation that converts from type ty to its lvalue. id is an optional name to include in the cast. For example, if ty is " q(const).p.char" and id is "foo", this function produces the string "(char *) foo".

    String *SwigType_rcaststr(SwigType *ty, const String_or_char *id = 0)

    Generates a casting operation that converts from a type's lvalue to a type equivalent to ty. id is an optional name to include in the cast. For example, if ty is " q(const).p.char" and id is "foo", this function produces the string "(const char *) foo".

    String *SwigType_manglestr(SwigType *ty)

    Generates a mangled string encoding of type ty . The mangled string only contains characters that are part of a valid C identifier. The resulting string is used in various parts of SWIG, but is most commonly associated with type-descriptor objects that appear in wrappers (e.g., SWIGTYPE_p_double).

    39.9 Parameters

    Several type-related functions involve parameter lists. These include functions and templates. Parameter list are represented as a list of nodes with the following attributes:

    "type"        -  Parameter type  (required)
    "name"        -  Parameter name  (optional)
    "value"       -  Initializer     (optional)
    

    Typically parameters are denoted in the source by using a typename of Parm * or ParmList *. To walk a parameter list, simply use code like this:

    Parm *parms;
    Parm *p;
    for (p = parms; p; p = nextSibling(p)) {
      SwigType *type  = Getattr(p, "type");
      String   *name  = Getattr(p, "name");
      String   *value = Getattr(p, "value");
      ...
    }
    

    Note: this code is exactly the same as what you would use to walk parse tree nodes.

    An empty list of parameters is denoted by a NULL pointer.

    Since parameter lists are fairly common, the following utility functions are provided to manipulate them:

    Parm *CopyParm(Parm *p);

    Copies a single parameter.

    ParmList *CopyParmList(ParmList *p);

    Copies an entire list of parameters.

    int ParmList_len(ParmList *p);

    Returns the number of parameters in a parameter list.

    String *ParmList_str(ParmList *p);

    Converts a parameter list into a C string. For example, produces a string like "(int *p, int n, double x);".

    String *ParmList_protostr(ParmList *p);

    The same as ParmList_str() except that parameter names are not included. Used to emit prototypes.

    int ParmList_numrequired(ParmList *p);

    Returns the number of required (non-optional) arguments in p.

    39.10 Writing a Language Module

    One of the easiest routes to supporting a new language module is to copy an already supported language module implementation and modify it. Be sure to choose a language that is similar in nature to the new language. All language modules follow a similar structure and this section briefly outlines the steps needed to create a bare-bones language module from scratch. Since the code is relatively easy to read, this section describes the creation of a minimal Python module. You should be able to extrapolate this to other languages.

    39.10.1 Execution model

    Code generation modules are defined by inheriting from the Language class, currently defined in the Source/Modules directory of SWIG. Starting from the parsing of command line options, all aspects of code generation are controlled by different methods of the Language that must be defined by your module.

    39.10.2 Starting out

    To define a new language module, first create a minimal implementation using this example as a guide:

    #include "swigmod.h"
    
    class PYTHON : public Language {
    public:
    
      virtual void main(int argc, char *argv[]) {
        printf("I'm the Python module.\n");
      }
    
      virtual int top(Node *n) {
        printf("Generating code.\n");
        return SWIG_OK;
      }
    
    };
    
    extern "C" Language *
    swig_python(void) {
      return new PYTHON();
    }
    

    The "swigmod.h" header file contains, among other things, the declaration of the Language base class and so you should include it at the top of your language module's source file. Similarly, the "swigconfig.h" header file contains some other useful definitions that you may need. Note that you should not include any header files that are installed with the target language. That is to say, the implementation of the SWIG Python module shouldn't have any dependencies on the Python header files. The wrapper code generated by SWIG will almost always depend on some language-specific C/C++ header files, but SWIG itself does not.

    Give your language class a reasonable name, usually the same as the target language. By convention, these class names are all uppercase (e.g. "PYTHON" for the Python language module) but this is not a requirement. This class will ultimately consist of a number of overrides of the virtual functions declared in the Language base class, in addition to any language-specific member functions and data you need. For now, just use the dummy implementations shown above.

    The language module ends with a factory function, swig_python() , that simply returns a new instance of the language class. As shown, it should be declared with the extern "C" storage qualifier so that it can be called from C code. It should also return a pointer to the base class (Language) so that only the interface (and not the implementation) of your language module is exposed to the rest of SWIG.

    Save the code for your language module in a file named " python.cxx" and place this file in the Source/Modules directory of the SWIG distribution. To ensure that your module is compiled into SWIG along with the other language modules, modify the file Source/Makefile.am to include the additional source files. In addition, modify the file Source/Modules/swigmain.cxx with an additional command line option that activates the module. Read the source---it's straightforward.

    Next, at the top level of the SWIG distribution, re-run the autogen.sh script to regenerate the various build files:

    $ ./autogen.sh
    

    Next re-run configure to regenerate all of the Makefiles:

    $ ./configure
    

    Finally, rebuild SWIG with your module added:

    $ make
    

    Once it finishes compiling, try running SWIG with the command-line option that activates your module. For example, swig -python foo.i . The messages from your new module should appear.

    39.10.3 Command line options

    When SWIG starts, the command line options are passed to your language module. This occurs before any other processing occurs (preprocessing, parsing, etc.). To capture the command line options, simply use code similar to this:

    void Language::main(int argc, char *argv[]) {
      for (int i = 1; i < argc; i++) {
        if (argv[i]) {
          if (strcmp(argv[i], "-interface") == 0) {
            if (argv[i+1]) {
              interface = NewString(argv[i+1]);
              Swig_mark_arg(i);
              Swig_mark_arg(i+1);
              i++;
            } else {
              Swig_arg_error();
            }
          } else if (strcmp(argv[i], "-globals") == 0) {
            if (argv[i+1]) {
              global_name = NewString(argv[i+1]);
              Swig_mark_arg(i);
              Swig_mark_arg(i+1);
              i++;
            } else {
              Swig_arg_error();
            }
          } else if ((strcmp(argv[i], "-proxy") == 0)) {
            proxy_flag = 1;
            Swig_mark_arg(i);
          } else if (strcmp(argv[i], "-keyword") == 0) {
            use_kw = 1;
            Swig_mark_arg(i);
          } else if (strcmp(argv[i], "-help") == 0) {
            fputs(usage, stderr);
          }
          ...
        }
      }
    }
    

    The exact set of options depends on what you want to do in your module. Generally, you would use the options to change code generation modes or to print diagnostic information.

    If a module recognizes an option, it should always call Swig_mark_arg() to mark the option as valid. If you forget to do this, SWIG will terminate with an unrecognized command line option error.

    39.10.4 Configuration and preprocessing

    In addition to looking at command line options, the main() method is responsible for some initial configuration of the SWIG library and preprocessor. To do this, insert some code like this:

    void main(int argc, char *argv[]) {
      ... command line options ...
    
      /* Set language-specific subdirectory in SWIG library */
      SWIG_library_directory("python");
    
      /* Set language-specific preprocessing symbol */
      Preprocessor_define("SWIGPYTHON 1", 0);
    
      /* Set language-specific configuration file */
      SWIG_config_file("python.swg");
    
      /* Set typemap language (historical) */
      SWIG_typemap_lang("python");
    }
    

    The above code does several things--it registers the name of the language module with the core, it supplies some preprocessor macro definitions for use in input files (so that they can determine the target language), and it registers a start-up file. In this case, the file python.swg will be parsed before any part of the user-supplied input file.

    Before proceeding any further, create a directory for your module in the SWIG library (The Lib directory). Now, create a configuration file in the directory. For example, python.swg.

    Just to review, your language module should now consist of two files-- an implementation file python.cxx and a configuration file python.swg.

    39.10.5 Entry point to code generation

    SWIG is a multi-pass compiler. Once the main() method has been invoked, the language module does not execute again until preprocessing, parsing, and a variety of semantic analysis passes have been performed. When the core is ready to start generating wrappers, it invokes the top() method of your language class. The argument to top is a single parse tree node that corresponds to the top of the entire parse tree.

    To get the code generation process started, the top() procedure needs to do several things:

    • Initialize the wrapper code output.
    • Set the module name.
    • Emit common initialization code.
    • Emit code for all of the child nodes.
    • Finalize the wrapper module and cleanup.

    An outline of top() might be as follows:

    int Python::top(Node *n) {
    
      /* Get the module name */
      String *module = Getattr(n, "name");
    
      /* Get the output file name */
      String *outfile = Getattr(n, "outfile");
    
      /* Initialize I/O (see next section) */
      ...
    
      /* Output module initialization code */
      ...
    
      /* Emit code for children */
      Language::top(n);
    
      ...
      /* Cleanup files */
      ...
    
      return SWIG_OK;
    }
    

    39.10.6 Module I/O and wrapper skeleton

    Within SWIG wrappers, there are five main sections. These are (in order)

    • begin: This section is a placeholder for users to put code at the beginning of the C/C++ wrapper file.
    • runtime: This section has most of the common SWIG runtime code.
    • header: This section holds declarations and inclusions from the .i file.
    • wrapper: This section holds all the wrapper code.
    • init: This section holds the module initialisation function (the entry point for the interpreter).

    Different parts of the SWIG code will fill different sections, then upon completion of the wrappering all the sections will be saved to the wrapper file.

    To perform this will require several additions to the code in various places, such as:

    class PYTHON : public Language {
    protected:
      /* General DOH objects used for holding the strings */
      File *f_begin;
      File *f_runtime;
      File *f_header;
      File *f_wrappers;
      File *f_init;
    
    public:
      ...
    
    };
    
    int Python::top(Node *n) {
    
      ...
    
      /* Initialize I/O */
      f_begin = NewFile(outfile, "w", SWIG_output_files());
      if (!f_begin) {
        FileErrorDisplay(outfile);
        SWIG_exit(EXIT_FAILURE);
      }
      f_runtime = NewString("");
      f_init = NewString("");
      f_header = NewString("");
      f_wrappers = NewString("");
    
      /* Register file targets with the SWIG file handler */
      Swig_register_filebyname("begin", f_begin);
      Swig_register_filebyname("header", f_header);
      Swig_register_filebyname("wrapper", f_wrappers);
      Swig_register_filebyname("runtime", f_runtime);
      Swig_register_filebyname("init", f_init);
    
      /* Output module initialization code */
      Swig_banner(f_begin);
      ...
    
      /* Emit code for children */
      Language::top(n);
    
      ...
      /* Write all to the file */
      Dump(f_runtime, f_begin);
      Dump(f_header, f_begin);
      Dump(f_wrappers, f_begin);
      Wrapper_pretty_print(f_init, f_begin);
    
      /* Cleanup files */
      Delete(f_runtime);
      Delete(f_header);
      Delete(f_wrappers);
      Delete(f_init);
      Delete(f_begin);
    
      return SWIG_OK;
    }
    

    Using this to process a file will generate a wrapper file, however the wrapper will only consist of the common SWIG code as well as any inline code which was written in the .i file. It does not contain any wrappers for any of the functions or classes.

    The code to generate the wrappers are the various member functions, which currently have not been touched. We will look at functionWrapper() as this is the most commonly used function. In fact many of the other wrapper routines will call this to do their work.

    A simple modification to write some basic details to the wrapper looks like this:

    int Python::functionWrapper(Node *n) {
      /* Get some useful attributes of this function */
      String   *name   = Getattr(n, "sym:name");
      SwigType *type   = Getattr(n, "type");
      ParmList *parms  = Getattr(n, "parms");
      String   *parmstr= ParmList_str_defaultargs(parms); // to string
      String   *func   = SwigType_str(type, NewStringf("%s(%s)", name, parmstr));
      String   *action = Getattr(n, "wrap:action");
    
      Printf(f_wrappers, "functionWrapper   : %s\n", func);
      Printf(f_wrappers, "           action : %s\n", action);
      return SWIG_OK;
    }
    

    This will now produce some useful information within your wrapper file.

    functionWrapper   : void delete_Shape(Shape *self)
               action : delete arg1;
    
    functionWrapper   : void Shape_x_set(Shape *self, double x)
               action : if (arg1) (arg1)->x = arg2;
    
    functionWrapper   : double Shape_x_get(Shape *self)
               action : result = (double) ((arg1)->x);
    
    functionWrapper   : void Shape_y_set(Shape *self, double y)
               action : if (arg1) (arg1)->y = arg2;
    ...
    

    39.10.7 Low-level code generators

    As ingenious as SWIG is, and despite all its capabilities and the power of its parser, the Low-level code generation takes a lot of work to write properly. Mainly because every language insists on its own manner of interfacing to C/C++. To write the code generators you will need a good understanding of how to manually write an interface to your chosen language, so make sure you have your documentation handy.

    At this point it is also probably a good idea to take a very simple file (just one function), and try letting SWIG generate wrappers for many different languages. Take a look at all of the wrappers generated, and decide which one looks closest to the language you are trying to wrap. This may help you to decide which code to look at.

    In general most language wrappers look a little like this:

    /* wrapper for TYPE3 some_function(TYPE1, TYPE2); */
    RETURN_TYPE _wrap_some_function(ARGS){
      TYPE1 arg1;
      TYPE2 arg2;
      TYPE3 result;
    
      if(ARG1 is not of TYPE1) goto fail;
      arg1=(convert ARG1);
      if(ARG2 is not of TYPE2) goto fail;
      arg2=(convert ARG2);
    
      result=some_function(arg1, arg2);
    
      convert 'result' to whatever the language wants;
    
      do any tidy up;
    
      return ALL_OK;
    
      fail:
      do any tidy up;
      return ERROR;
    }
    

    Yes, it is rather vague and not very clear. But each language works differently so this will have to do for now.

    Tackling this problem will be done in two stages:

    • The skeleton: the function wrapper, and call, but without the conversion
    • The conversion: converting the arguments to-from what the language wants

    The first step will be done in the code, the second will be done in typemaps.

    Our first step will be to write the code for functionWrapper() . What is shown below is NOT the solution, merely a step in the right direction. There are a lot of issues to address.

    • Variable length and default parameters
    • Typechecking and number of argument checks
    • Overloaded functions
    • Inout and Output only arguments
    virtual int functionWrapper(Node *n) {
      /* get useful attributes */
      String   *name   = Getattr(n, "sym:name");
      SwigType *type   = Getattr(n, "type");
      ParmList *parms  = Getattr(n, "parms");
      ...
    
      /* create the wrapper object */
      Wrapper *wrapper = NewWrapper();
    
      /* create the functions wrappered name */
      String *wname = Swig_name_wrapper(iname);
    
      /* deal with overloading */
      ....
    
      /* write the wrapper function definition */
      Printv(wrapper->def, "RETURN_TYPE ", wname, "(ARGS) {", NIL);
    
      /* if any additional local variable needed, add them now */
      ...
    
      /* write the list of locals/arguments required */
      emit_args(type, parms, wrapper);
    
      /* check arguments */
      ...
    
      /* write typemaps(in) */
      ....
    
      /* write constraints */
      ....
    
      /* Emit the function call */
      emit_action(n, wrapper);
    
      /* return value if necessary  */
      ....
    
      /* write typemaps(out) */
      ....
    
      /* add cleanup code */
      ....
    
      /* Close the function(ok) */
      Printv(wrapper->code, "return ALL_OK;\n", NIL);
    
      /* add the failure cleanup code */
      ...
    
      /* Close the function(error) */
      Printv(wrapper->code, "return ERROR;\n", "}\n", NIL);
    
      /* final substitutions if applicable */
      ...
    
      /* Dump the function out */
      Wrapper_print(wrapper, f_wrappers);
    
      /* tidy up */
      Delete(wname);
      DelWrapper(wrapper);
    
      return SWIG_OK;
    }
    

    Executing this code will produce wrappers which have our basic skeleton but without the typemaps, there is still work to do.

    39.10.8 Configuration files

    At the time of this writing, SWIG supports nearly twenty languages, which means that for continued sanity in maintaining the configuration files, the language modules need to follow some conventions. These are outlined here along with the admission that, yes it is ok to violate these conventions in minor ways, as long as you know where to apply the proper kludge to keep the overall system regular and running. Engineering is the art of compromise, see...

    Much of the maintenance regularity depends on choosing a suitable nickname for your language module (and then using it in a controlled way). Nicknames should be all lower case letters with an optional numeric suffix (no underscores, no dashes, no spaces). Some examples are: foo, bar, qux99.

    The numeric suffix variant, as in the last example, is somewhat tricky to work with because sometimes people expect to refer to the language without this number but sometimes that number is extremely relevant (especially when it corresponds to language implementation versions with incompatible interfaces). New language modules that unavoidably require a numeric suffix in their nickname should include that number in all uses, or be prepared to kludge.

    The nickname is used in four places:

    usagetransform
    "skip" tag(none)
    Examples/ subdir name(none)
    Examples/test-suite/ subdir name(none)

    As you can see, most usages are direct.

    configure.ac
    This file is processed by

    autoconf to generate the configure script. This is where you need to add shell script fragments and autoconf macros to detect the presence of whatever development support your language module requires, typically directories where headers and libraries can be found, and/or utility programs useful for integrating the generated wrapper code.

    Use the AC_ARG_WITH, AC_MSG_CHECKING, AC_SUBST macros and so forth (see other languages for examples). Avoid using the [ and ] character in shell script fragments. The variable names passed to AC_SUBST should begin with the nickname, entirely upcased.

    At the end of the new section is the place to put the aforementioned nickname kludges (should they be needed). See Perl5 for examples of what to do. [If this is still unclear after you've read the code, ping me and I'll expand on this further. --ttn]

    Makefile.in

    Some of the variables AC_SUBSTituted are essential to the support of your language module. Fashion these into a shell script "test" clause and assign that to a skip tag using "-z" and "-o":

    skip-qux99 = [ -z "@QUX99INCLUDE@" -o -z "@QUX99LIBS" ]

    This means if those vars should ever be empty, qux99 support should be considered absent and so it would be a good idea to skip actions that might rely on it.

    Here is where you may also define an alias (but then you'll need to kludge --- don't do this):

    skip-qux = $(skip-qux99)

    Lastly, you need to modify each of check-aliveness, check-examples, check-test-suite and lib-languages (var). Use the nickname for these, not the alias. Note that you can do this even before you have any tests or examples set up; the Makefile rules do some sanity checking and skip around these kinds of problems.

    Examples/Makefile.in
    Nothing special here; see comments at the top of this file and look to the existing languages for examples.
    Examples/qux99/check.list
    Do cp ../python/check.list . and modify to taste. One subdir per line.
    Lib/qux99/extra-install.list
    If you add your language to the top-level Makefile.in var lib-languages, then make install will install all *.i and *.swg files from the language-specific subdirectory of Lib. Use (optional) file extra-install.list in that directory to name additional files to install (see ruby for example).
    Source/Modules/Makefile.am
    Add appropriate files to this Automake file. That's it!

    When you have modified these files, please make sure that the new language module is completely ignored if it is not installed and detected on a box, that is, make check-examples and make check-test-suite politely displays the ignoring language message.

    39.10.9 Runtime support

    Discuss the kinds of functions typically needed for SWIG runtime support (e.g. SWIG_ConvertPtr() and SWIG_NewPointerObj() ) and the names of the SWIG files that implement those functions.

    39.10.10 Standard library files

    The standard library files that most languages supply keeps growing as SWIG matures. The following are the minimum that are usually supported:

    • typemaps.i
    • std_string.i
    • std_vector.i
    • stl.i

    Please copy these and modify for any new language.

    39.10.11 User examples

    Each of the language modules provides one or more examples. These examples are used to demonstrate different features of the language module to SWIG end-users, but you'll find that they're useful during development and testing of your language module as well. You can use examples from the existing SWIG language modules for inspiration.

    Each example is self-contained and consists of (at least) a Makefile, a SWIG interface file for the example module, and a 'runme' script that demonstrates the functionality for that module. All of these files are stored in the same subdirectory under the Examples/[lang] directory. There are two classic examples which should be the first to convert to a new language module. These are the "simple" C example and the "class" C++ example. These can be found, for example for Python, in Examples/python/simple and Examples/python/class.

    By default, all of the examples are built and run when the user types make check. To ensure that your examples are automatically run during this process, see the section on configuration files.

    39.10.12 Test driven development and the test-suite

    A test driven development approach is central to the improvement and development of SWIG. Most modifications to SWIG are accompanied by additional regression tests and checking all tests to ensure that no regressions have been introduced.

    The regression testing is carried out by the SWIG test-suite. The test-suite consists of numerous testcase interface files in the Examples/test-suite directory as well as target language specific runtime tests in the Examples/test-suite/[lang] directory. When a testcase is run, it will execute the following steps for each testcase:

    1. Execute SWIG passing it the testcase interface file.
    2. Compile the resulting generated C/C++ code with either the C or C++ compiler into object files.
    3. Link the object files into a dynamic library (dll/shared object).
    4. Compile any generated and any runtime test target language code with the target language compiler, if the target language supports compilation. This step thus does not apply to the interpreted languages.
    5. Execute a runtime test if one exists.

    For example, the ret_by_value testcase consists of two components. The first component is the Examples/test-suite/ret_by_value.i interface file. The name of the SWIG module must always be the name of the testcase, so the ret_by_value.i interface file thus begins with:

    %module ret_by_value
    

    The testcase code will then follow the module declaration, usually within a %inline %{ ... %} section for the majority of the tests.

    The second component is the optional runtime tests. Any runtime tests are named using the following convention: [testcase]_runme.[ext], where [testcase] is the testcase name and [ext] is the normal extension for the target language file. In this case, the Java and Python target languages implement a runtime test, so their files are respectively, Examples/test-suite/java/ret_by_value_runme.java and Examples/test-suite/python/ret_by_value_runme.py.

    The goal of the test-suite is to test as much as possible in a silent manner. This way any SWIG or compiler errors or warnings are easily visible. Should there be any warnings, changes must be made to either fix them (preferably) or suppress them. Compilation or runtime errors result in a testcase failure and will be immediately visible. It is therefore essential that the runtime tests are written in a manner that displays nothing to stdout/stderr on success but error/exception out with an error message on stderr on failure.

    39.10.12.1 Running the test-suite

    In order for the test-suite to work for a particular target language, the language must be correctly detected and configured during the configure stage so that the correct Makefiles are generated. Most development occurs on Linux, so usually it is a matter of installing the development packages for the target language and simply configuring as outlined earlier.

    If when running the test-suite commands that follow, you get a message that the test was skipped, it indicates that the configure stage is missing information in order to compile and run everything for that language.

    The test-suite can be run in a number of ways. The first group of commands are for running multiple testcases in one run and should be executed in the top level directory. To run the entire test-suite (can take a long time):

    make -k check-test-suite
    

    To run the test-suite just for target language [lang], replace [lang] with one of csharp, java, perl5, python, ruby, tcl etc:

    make check-[lang]-test-suite
    

    Note that if a runtime test is available, a message "(with run test)" is displayed when run. For example:

    $ make check-python-test-suite
    checking python test-suite
    checking python testcase argcargvtest (with run test)
    checking python testcase python_autodoc
    checking python testcase python_append (with run test)
    checking python testcase callback (with run test)
    

    The files generated on a previous run can be deleted using the clean targets, either the whole test-suite or for a particular language:

    make clean-test-suite
    make clean-[lang]-test-suite
    

    The test-suite can be run in a partialcheck mode where just SWIG is executed, that is, the compile, link and running of the testcases is not performed. Note that the partialcheck does not require the target language to be correctly configured and detected and unlike the other test-suite make targets, is never skipped. Once again, either all the languages can be executed or just a chosen language:

    make partialcheck-test-suite
    make partialcheck-[lang]-test-suite
    

    If your computer has more than one CPU, you are strongly advised to use parallel make to speed up the execution speed. This can be done with any of the make targets that execute more than one testcase. For example, a dual core processor can efficiently use 2 parallel jobs:

    make -j2 check-test-suite
    make -j2 check-python-test-suite
    make -j2 partialcheck-java-test-suite
    

    The second group of commands are for running individual testcases and should be executed in the appropriate target language directory, Examples/test-suite/[lang]. Testcases can contain either C or C++ code and when one is written, a decision must be made as to which of these input languages is to be used. Replace [testcase] in the commands below with the name of the testcase.

    For a C language testcase, add the testcase under the C_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].ctest
    

    For a C++ language testcase, add the testcase under the CPP_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].cpptest
    

    A third category of tests are C++ language testcases testing multiple modules (the %import directive). These require more than one shared library (dll/shared object) to be built and so are separated out from the normal C++ testcases. Add the testcase under the MULTI_CPP_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].multicpptest
    

    To delete the generated files, execute:

    make -s [testcase].clean
    

    If you would like to see the exact commands being executed, drop the -s option:

    make [testcase].ctest
    make [testcase].cpptest
    make [testcase].multicpptest
    

    Some real examples of each:

    make -s ret_by_value.clean
    make -s ret_by_value.ctest
    make -s bools.cpptest
    make -s imports.multicpptest
    

    Advanced usage of the test-suite facilitates running tools on some of the five stages. The make variables SWIGTOOL and RUNTOOL are used to specify a tool to respectively, invoke SWIG and the execution of the runtime test. You are advised to view the Examples/test-suite/common.mk file for details but for a short summary, the classic usage is to use Valgrind for memory checking. For example, checking for memory leaks when running the runtime test in the target language interpreter:

    make ret_by_value.ctest RUNTOOL="valgrind --leak-check=full"
    

    This will probably make more sense if you look at the output of the above as it will show the exact commands being executed. SWIG can be analyzed for bad memory accesses using:

    make ret_by_value.ctest SWIGTOOL="valgrind --tool=memcheck --trace-children=yes"
    

    A debugger can also be invoked easily on an individual test, for example gdb:

    make ret_by_value.ctest RUNTOOL="gdb --args"
    

    SWIG reads the SWIG_FEATURES environment variable to obtain options in addition to those passed on the command line. This is particularly useful as the entire test-suite or a particular testcase can be run customized by using additional arguments, for example the -O optimization flag can be added in, as shown below for the bash shell:

    env SWIG_FEATURES=-O make check-python-test-suite
    

    The syntax for setting environment variables varies from one shell to the next, but it also works as shown in the example below, where some typemap debugging is added in:

    make ret_by_value.ctest SWIG_FEATURES="-debug-tmsearch"
    

    There is also a special 'errors' test-suite which is a set of regression tests checking SWIG warning and error messages. It can be run in the same way as the other language test-suites, replacing [lang] with errors, such as make check-errors-test-suite. The test cases used and the way it works is described in Examples/test-suite/errors/Makefile.in.

    39.10.13 Documentation

    Don't forget to write end-user documentation for your language module. Currently, each language module has a dedicated chapter You shouldn't rehash things that are already covered in sufficient detail in the SWIG Basics and SWIG and C++ chapters. There is no fixed format for what, exactly, you should document about your language module, but you'll obviously want to cover issues that are unique to your language.

    Some topics that you'll want to be sure to address include:

    • Command line options unique to your language module.
    • Non-obvious mappings between C/C++ and target language concepts. For example, if your target language provides a single floating point type, it should be no big surprise to find that C/C++ float and double types are mapped to it. On the other hand, if your target language doesn't provide support for "classes" or something similar, you'd want to discuss how C++ classes are handled.
    • How to compile the SWIG-generated wrapper code into shared libraries that can actually be used. For some languages, there are well-defined procedures for doing this, but for others it's an ad hoc process. Provide as much detail as appropriate, and links to other resources if available.

    39.10.14 Coding style guidelines

    The coding guidelines for the C/C++ source code are pretty much K&R C style. The style can be inferred from the existing code base and is largely dictated by the indent code beautifier tool set to K&R style. The code can formatted using the make targets in the Source directory. Below is an example of how to format the emit.cxx file:

    $ cd Source
    $ make beautify-file INDENTFILE=Modules/emit.cxx
    

    Of particular note is indentation is set to 2 spaces and a tab is used instead of 8 spaces. The generated C/C++ code should also follow this style as close as possible. However, tabs should be avoided as unlike the SWIG developers, users will never have consistent tab settings.

    39.10.15 Target language status

    Target languages are given a status of either 'Supported' or 'Experimental' depending on their maturity as broadly outlined in the Target language introduction. This section provides more details on how this status is given.

    39.10.15.1 Supported status

    A target language is given the 'Supported' status when

    • It is in a mature, well functioning state.
    • It has its own comprehensive chapter in the documentation. The level of documentation should be comprehensive and match the standard of the other mature modules. Python and Java are good references.
    • It passes all of the main SWIG test-suite. The main test-suite is defined by the tests in the C_TEST_CASES, CPP_TEST_CASES and MULTI_CPP_TEST_CASES lists in Examples/test-suite/common.mk. The tests in CPP11_TEST_CASES will also be required in the near future.
    • The test-suite must also include at least twenty wide-ranging runtime tests. The most mature languages have a few hundred runtime tests. Note that porting runtime tests from another language module is a quick and easy way to achieve this.
    • It supports the vast majority of SWIG features. Some more advanced features, such as, directors, full nested class support and target language namespaces (nspace) may be unimplemented. A few support libraries may be missing, for example, a small number of STL libraries.
    • It provides strong backwards compatibility between releases. Each point release must aim to be fully backwards compatible. A point release version is the 3rd version digit, so each of the x.y.* versions should be backwards compatible. Backwards compatibility breakages can occur in a new major or minor version if absolutely necessary and if documented. A major or minor version is the first or second digit in the three digit version.
    • Fixing unintended regressions in the Supported languages will be given higher priority over experimental languages by the core SWIG developers.
    • Examples must be available and run successfully.
    • The examples and test-suite must be fully functioning on the Travis Continuous Integration platform.

    39.10.15.2 Experimental status

    A target language is given the 'Experimental' status when

    • It is of sub-standard quality, failing to meet the above 'Supported' status.
    • It is somewhere between the mid to mature stage of development.
    • It is in need of help to finish development.

    Some minimum requirements and notes about languages with the 'Experimental' status:

    • Will at least implement basic functionality - support wrapping C functions and simple C++ classes and templates.
    • Have its own documentation chapter containing a reasonable level of detail. The documentation must provide enough basic functionality for a user to get started.
    • Have fully functional examples of basic functionality (the simple and class examples).
    • The test-suite must be implemented and include a few runtime tests for both C and C++ test cases.
    • Failing tests must be put into one of the FAILING_CPP_TESTS or FAILING_C_TESTS lists in the test-suite. This will ensure the test-suite can be superficially made to pass by ignoring failing tests. The number of tests in these lists should be no greater than half of the number of tests in the full test-suite.
    • The examples and test-suite must also be fully functioning on the Travis Continuous Integration platform. However, experimental languages will be set as 'allow_failures'. This means that pull requests and normal development commits will not break the entire Travis build should an experimental language fail.
    • Any new failed tests will be fixed on a 'best effort' basis by core developers with no promises made.
    • If a language module has an official maintainer, then the maintainer will be requested to focus on fixing test-suite regressions and commit to migrating the module to become a 'Supported' module.
    • If a module does not have an official maintainer, then, as maintenance will be on a 'best efforts' basis by the core maintainers, no guarantees will be provided from one release to the next and regressions may creep in.
    • Experimental target languages will have a (suppressible) warning explaining the Experimental sub-standard status and encourage users to help improve it.
    • No backwards compatibility is guaranteed as the module is effectively 'in development'. If a language module has an official maintainer, then a backwards compatibility guarantee may be provided at the maintainer's discretion and should be documented as such.

    39.10.16 Prerequisites for adding a new language module to the SWIG distribution

    New target language modules can be included in SWIG and contributions are encouraged for popular languages. In order to be considered for inclusion, a language must at a minimum fit the 'Experimental' status described above.

    Below are some practical steps that should help meet these requirements.

    1. The "simple" example needs to be working to demonstrate basic C code wrappers. Port the example from another language, such as from Examples/python/simple.
    2. The "class" example needs to be working to demonstrate basic C++ code wrappers. Port the example from another language, such as from Examples/python/class.
    3. Modify configure.ac, Makefile.in and Examples/Makefile.in to run these examples. Please make sure that if the new language is not installed properly on a box, make -k check should still work by skipping the tests and examples for the new language module.
    4. Copying an existing language module and adapting the source for it is likely to be the most efficient approach to fully developing a new module as a number of corner cases are covered in the existing implementations. The most advanced scripting languages are Python and Ruby. The most advanced compiled target languages are Java and C#.
    5. Get the test-suite running for the new language (make check-[lang]-test-suite). While the test-suite tests many corner cases, we'd expect the majority of it to work without much effort once the generated code is compiling correctly for basic functionality as most of the corner cases are covered in the SWIG core. Aim to first get one C and one C++ runtime test running in the test-suite. Adding further runtime tests should be a lot easier afterwards by porting existing runtime tests from another language module.
    6. The structure and contents of the html documentation chapter can be copied and adapted from one of the other language modules.
    7. Source code can be formatted correctly using the info in the coding style guidelines section.
    8. When ready, post a patch on Github, join the swig-devel mailing list and email the SWIG developers with a demonstration of commitment to maintaining the language module, certainly in the short term and ideally long term.

    Once accepted into the official Git repository, development efforts should concentrate on getting the entire test-suite to work in order to migrate the language module to the 'Supported' status. Runtime tests should be added for existing testcases and new test cases can be added should there be an area not already covered by the existing tests.

    39.11 Debugging Options

    There are various command line options which can aid debugging a SWIG interface as well as debugging the development of a language module. These are as follows:

    -debug-classes    - Display information about the classes found in the interface
    -debug-module <n> - Display module parse tree at stages 1-4, <n> is a csv list of stages
    -debug-symtabs    - Display symbol tables information
    -debug-symbols    - Display target language symbols in the symbol tables
    -debug-csymbols   - Display C symbols in the symbol tables
    -debug-lsymbols   - Display target language layer symbols
    -debug-tags       - Display information about the tags found in the interface
    -debug-template   - Display information for debugging templates
    -debug-top <n>    - Display entire parse tree at stages 1-4, <n> is a csv list of stages
    -debug-typedef    - Display information about the types and typedefs in the interface
    -debug-typemap    - Display information for debugging typemaps
    -debug-tmsearch   - Display typemap search debugging information
    -debug-tmused     - Display typemaps used debugging information
    

    The complete list of command line options for SWIG are available by running swig -help.

    39.12 Guide to parse tree nodes

    This section describes the different parse tree nodes and their attributes.

    cdecl

    Describes general C declarations including variables, functions, and typedefs. A declaration is parsed as "storage T D" where storage is a storage class, T is a base type, and D is a declarator.

    "name"          - Declarator name
    "type"          - Base type T
    "decl"          - Declarator type (abstract)
    "storage"       - Storage class (static, extern, typedef, etc.)
    "parms"         - Function parameters (if a function)
    "code"          - Function body code (if supplied)
    "value"         - Default value (if supplied)
    

    constructor

    C++ constructor declaration.

    "name"          - Name of constructor
    "parms"         - Parameters
    "decl"          - Declarator (function with parameters)
    "code"          - Function body code (if any)
    "feature:new"   - Set to indicate return of new object.
    

    destructor

    C++ destructor declaration.

    "name"          - Name of destructor
    "code"          - Function body code (if any)
    "storage"       - Storage class (set if virtual)
    "value"         - Default value (set if pure virtual).
    

    access

    C++ access change.

    "kind"          - public, protected, private
    

    constant

    Constant created by %constant or #define.

    "name"          - Name of constant.
    "type"          - Base type.
    "value"         - Value.
    "storage"       - Set to %constant
    "feature:immutable" - Set to indicate read-only
    

    class

    C++ class definition or C structure definition.

    "name"          - Name of the class.
    "kind"          - Class kind ("struct", "union", "class")
    "symtab"        - Enclosing symbol table.
    "tdname"        - Typedef name. Use for typedef struct { ... } A.
    "abstract"      - Set if class has pure virtual methods.
    "baselist"      - List of base class names.
    "storage"       - Storage class (if any)
    "unnamed"       - Set if class is unnamed.
    

    enum

    Enumeration.

    "name"          - Name of the enum (if supplied).
    "storage"       - Storage class (if any)
    "tdname"        - Typedef name (typedef enum { ... } name).
    "unnamed"       - Set if enum is unnamed.
    

    enumitem

    Enumeration value.

    "name"          - Name of the enum value.
    "type"          - Type (integer or char)
    "value"         - Enum value (if given)
    "feature:immutable" - Set to indicate read-only
    

    namespace

    C++ namespace.

    "name"          - Name of the namespace.
    "symtab"        - Symbol table for enclosed scope.
    "unnamed"       - Set if unnamed namespace
    "alias"         - Alias name. Set for namespace A = B;
    

    using

    C++ using directive.

    "name"          - Name of the object being referred to.
    "uname"         - Qualified name actually given to using.
    "node"          - Node being referenced.
    "namespace"     - Namespace name being reference (using namespace name)
    

    classforward

    A forward C++ class declaration.

    "name"          - Name of the class.
    "kind"          - Class kind ("union", "struct", "class")
    

    insert

    Code insertion directive. For example, %{ ... %} or %insert(section).

    "code"          - Inserted code
    "section"       - Section name ("header", "wrapper", etc.)
    

    top

    Top of the parse tree.

    "module"        - Module name
    

    extend

    %extend directive.

    "name"          - Module name
    "symtab"        - Symbol table of enclosed scope.
    

    apply

    %apply pattern { patternlist }.

    "pattern"       - Source pattern.
    "symtab"        - Symbol table of enclosed scope.
    

    clear

    %clear patternlist;

    "firstChild"    - Patterns to clear
    

    include

    %include directive.

    "name"         - Filename
    "firstChild"   - Children
    

    import

    %import directive.

    "name"         - Filename
    "firstChild"   - Children
    

    module

    %module directive.

    "name"         - Name of the module
    

    typemap

    %typemap directive.

    "method"       - Typemap method name.
    "code"         - Typemap code.
    "kwargs"       - Keyword arguments (if any)
    "firstChild"   - Typemap patterns
    

    typemapcopy

    %typemap directive with copy.

    "method"       - Typemap method name.
    "pattern"      - Typemap source pattern.
    "firstChild"   - Typemap patterns
    

    typemapitem

    %typemap pattern. Used with %apply, %clear, %typemap.

    "pattern"      - Typemap pattern (a parameter list)
    "parms"        - Typemap parameters.
    

    types

    %types directive.

    "parms"        - List of parameter types.
    "convcode"     - Code which replaces the default casting / conversion code
    

    extern

    extern "X" { ... } declaration.

    "name"       - Name "C", "Fortran", etc.
    

    39.13 Further Development Information

    There is further documentation available on the internals of SWIG, API documentation and debugging information. This is shipped with SWIG in the Doc/Devel directory.

    swig-4.0.2/Doc/Manual/Introduction.html0000644000175000017500000005156713667507562017674 0ustar williamwilliam Introduction

    2 Introduction

    2.1 What is SWIG?

    SWIG is a software development tool that simplifies the task of interfacing different languages to C and C++ programs. In a nutshell, SWIG is a compiler that takes C/C++ declarations and creates the wrappers needed to access those declarations from other languages including Perl, Python, Tcl, Ruby, Guile, and Java. SWIG normally requires no modifications to existing code and can often be used to build a usable interface in only a few minutes. Possible applications of SWIG include:

    • Building interpreted interfaces to existing C programs.
    • Rapid prototyping and application development.
    • Interactive debugging.
    • Reengineering or refactoring of legacy software into scripting language components.
    • Making a graphical user interface (using Tk for example).
    • Testing of C libraries and programs (using scripts).
    • Building high performance C modules for scripting languages.
    • Making C programming more enjoyable (or tolerable depending on your point of view).
    • Impressing your friends.
    • Obtaining vast sums of research funding (although obviously not applicable to the author).

    SWIG was originally designed to make it extremely easy for scientists and engineers to build extensible scientific software without having to get a degree in software engineering. Because of this, the use of SWIG tends to be somewhat informal and ad-hoc (e.g., SWIG does not require users to provide formal interface specifications as you would find in a dedicated IDL compiler). Although this style of development isn't appropriate for every project, it is particularly well suited to software development in the small; especially the research and development work that is commonly found in scientific and engineering projects. However, nowadays SWIG is known to be used in many large open source and commercial projects.

    2.2 Why use SWIG?

    As stated in the previous section, the primary purpose of SWIG is to simplify the task of integrating C/C++ with other programming languages. However, why would anyone want to do that? To answer that question, it is useful to list a few strengths of C/C++ programming:

    • Excellent support for writing programming libraries.
    • High performance (number crunching, data processing, graphics, etc.).
    • Systems programming and systems integration.
    • Large user community and software base.

    Next, let's list a few problems with C/C++ programming

    • Writing a user interface is rather painful (i.e., consider programming with MFC, X11, GTK, or any number of other libraries).
    • Testing is time consuming (the compile/debug cycle).
    • Not easy to reconfigure or customize without recompilation.
    • Modularization can be tricky.
    • Security concerns (buffer overflows for instance).

    To address these limitations, many programmers have arrived at the conclusion that it is much easier to use different programming languages for different tasks. For instance, writing a graphical user interface may be significantly easier in a scripting language like Python or Tcl (consider the reasons why millions of programmers have used languages like Visual Basic if you need more proof). An interactive interpreter might also serve as a useful debugging and testing tool. Other languages like Java might greatly simplify the task of writing distributed computing software. The key point is that different programming languages offer different strengths and weaknesses. Moreover, it is extremely unlikely that any programming is ever going to be perfect. Therefore, by combining languages together, you can utilize the best features of each language and greatly simplify certain aspects of software development.

    From the standpoint of C/C++, a lot of people use SWIG because they want to break out of the traditional monolithic C programming model which usually results in programs that resemble this:

    • A collection of functions and variables that do something useful.
    • A main() program that starts everything.
    • A horrible collection of hacks that form some kind of user interface (but which no-one really wants to touch).

    Instead of going down that route, incorporating C/C++ into a higher level language often results in a more modular design, less code, better flexibility, and increased programmer productivity.

    SWIG tries to make the problem of C/C++ integration as painless as possible. This allows you to focus on the underlying C program and using the high-level language interface, but not the tedious and complex chore of making the two languages talk to each other. At the same time, SWIG recognizes that all applications are different. Therefore, it provides a wide variety of customization features that let you change almost every aspect of the language bindings. This is the main reason why SWIG has such a large user manual ;-).

    2.3 Target languages

    SWIG in essence is a tool to generate code for making C/C++ code available to various other programming languages. These higher level programming languages are the target languages for the SWIG code generator and C or C++ are the input languages. A single target language must be specified when SWIG is run. This results in generating code for C/C++ and the specified target language to interface with each other. SWIG can be invoked multiple times, but with a different target language specified on each invocation. This ability to interface C/C++ to many different target languages is one of SWIG's core strengths and features.

    SWIG is very broadly composed of two components. A core component creates a parse tree from the input ISO C/C++ and SWIG directives (extensions to the C/C++ standards). The parse tree is then passed to a second component, one of the target language modules for generating code specific to a higher level language. SWIG supports many different target languages. These target languages are given a status of either Supported or Experimental. This status is provided to indicate the level of maturity to expect when using a particular target language as not all target languages are fully developed.

    The second part of the SWIG documentation contains a chapter for each target level language. Each chapter will state the status (Supported or Experimental) for that language.

    2.3.1 Supported status

    A target language is given the 'Supported' status when

    • It is in a mature, well functioning state.
    • It has its own comprehensive chapter in the documentation.
    • It passes all of the main SWIG test-suite and has a range of working examples.
    • It supports the vast majority of SWIG features.
    • It provides strong backwards compatibility between releases.

    The above is a short summary and further details are outlined in the Supported status section in the Extending chapter. The good news is that all the well-known and most popular languages have this status.

    2.3.2 Experimental status

    A target language is given the 'Experimental' status when

    • It is of sub-standard quality, failing to meet the above 'Supported' status.
    • It is somewhere between the mid to mature stage of development.
    • It does not guarantee any backwards compatibility between releases.
    • It is in need of help to finish development.

    Anyone using an experimental target language is strongly urged to assist with development of the target language module if they wish to use it.

    SWIG displays a warning when an experimental target language is used in order to set expectations and emphasize the experimental status of the target language. The usual warning suppression techniques can be used if required.

    The above is a short summary and further details are outlined in the Experimental status section in the Extending chapter.

    2.4 A SWIG example

    The best way to illustrate SWIG is with a simple example. Consider the following C code:

    /* File : example.c */
    
    double My_variable = 3.0;
    
    /* Compute factorial of n */
    int fact(int n) {
      if (n <= 1)
        return 1;
      else
        return n*fact(n-1);
    }
    
    /* Compute n mod m */
    int my_mod(int n, int m) {
      return(n % m);
    }
    

    Suppose that you wanted to access these functions and the global variable My_variable from Tcl. You start by making a SWIG interface file as shown below (by convention, these files carry a .i suffix) :

    2.4.1 SWIG interface file

    /* File : example.i */
    %module example
    %{
    /* Put headers and other declarations here */
    extern double My_variable;
    extern int    fact(int);
    extern int    my_mod(int n, int m);
    %}
    
    extern double My_variable;
    extern int    fact(int);
    extern int    my_mod(int n, int m);
    

    The interface file contains ISO C function prototypes and variable declarations. The %module directive defines the name of the module that will be created by SWIG. The %{ %} block provides a location for inserting additional code, such as C header files or additional C declarations, into the generated C wrapper code.

    2.4.2 The swig command

    SWIG is invoked using the swig command. We can use this to build a Tcl module (under Linux) as follows :

    unix > swig -tcl example.i
    unix > gcc -c -fpic example.c example_wrap.c -I/usr/local/include
    unix > gcc -shared example.o example_wrap.o -o example.so
    unix > tclsh
    % load ./example.so
    % fact 4
    24
    % my_mod 23 7
    2
    % expr $My_variable + 4.5
    7.5
    %
    

    The swig command produced a new file called example_wrap.c that should be compiled along with the example.c file. Most operating systems and scripting languages now support dynamic loading of modules. In our example, our Tcl module has been compiled into a shared library that can be loaded into Tcl. When loaded, Tcl can now access the functions and variables declared in the SWIG interface. A look at the file example_wrap.c reveals a hideous mess. However, you almost never need to worry about it.

    2.4.3 Building a Perl5 module

    Now, let's turn these functions into a Perl5 module. Without making any changes type the following (shown for Solaris):

    unix > swig -perl5 example.i
    unix > gcc -c example.c example_wrap.c \
            -I/usr/local/lib/perl5/sun4-solaris/5.003/CORE
    unix > ld -G example.o example_wrap.o -o example.so # This is for Solaris
    unix > perl5.003
    use example;
    print example::fact(4), "\n";
    print example::my_mod(23, 7), "\n";
    print $example::My_variable + 4.5, "\n";
    <ctrl-d>
    24
    2
    7.5
    unix >
    

    2.4.4 Building a Python module

    Finally, let's build a module for Python (shown for Irix).

    unix > swig -python example.i
    unix > gcc -c -fpic example.c example_wrap.c -I/usr/local/include/python2.0
    unix > gcc -shared example.o example_wrap.o -o _example.so
    unix > python
    Python 2.0 (#6, Feb 21 2001, 13:29:45)
    [GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2
    Type "copyright", "credits" or "license" for more information.     
    >>> import example
    >>> example.fact(4)
    24
    >>> example.my_mod(23, 7)
    2
    >>> example.cvar.My_variable + 4.5
    7.5
    

    2.4.5 Shortcuts

    To the truly lazy programmer, one may wonder why we needed the extra interface file at all. As it turns out, you can often do without it. For example, you could also build a Perl5 module by just running SWIG on the C header file and specifying a module name as follows

    unix > swig -perl5 -module example example.h
    unix > gcc -c example.c example_wrap.c \
            -I/usr/local/lib/perl5/sun4-solaris/5.003/CORE
    unix > ld -G example.o example_wrap.o -o example.so
    unix > perl5.003
    use example;
    print example::fact(4), "\n";
    print example::my_mod(23, 7), "\n";
    print $example::My_variable + 4.5, "\n";
    <ctrl-d>
    24
    2
    7.5
    

    2.5 Supported C/C++ language features

    A primary goal of the SWIG project is to make the language binding process extremely easy. Although a few simple examples have been shown, SWIG is quite capable in supporting most of C++. Some of the major features include:

    • Full C99 preprocessing.
    • All ISO C and C++ datatypes.
    • Functions, variables, and constants.
    • Classes.
    • Single and multiple inheritance.
    • Overloaded functions and methods.
    • Overloaded operators.
    • C++ templates (including member templates, specialization, and partial specialization).
    • Namespaces.
    • Variable length arguments.
    • C++ smart pointers.

    Most of C++11 is also supported. Details are in the C++11 chapter. C++14 support is covered in the C++14 chapter. C++17 support is covered in the C++17 chapter.

    It is important to stress that SWIG is not a simplistic C++ lexing tool like several apparently similar wrapper generation tools. SWIG not only parses C++, it implements the full C++ type system and it is able to understand C++ semantics. SWIG generates its wrappers with full knowledge of this information. As a result, you will find SWIG to be just as capable of dealing with nasty corner cases as it is in wrapping simple C++ code. In fact, SWIG is able to handle C++ code that stresses the very limits of many C++ compilers.

    2.6 Non-intrusive interface building

    When used as intended, SWIG requires minimal (if any) modification to existing C or C++ code. This makes SWIG extremely easy to use with existing packages and promotes software reuse and modularity. By making the C/C++ code independent of the high level interface, you can change the interface and reuse the code in other applications. It is also possible to support different types of interfaces depending on the application.

    2.7 Incorporating SWIG into a build system

    SWIG is a command line tool and as such can be incorporated into any build system that supports invoking external tools/compilers. SWIG is most commonly invoked from within a Makefile, but is also known to be invoked from popular IDEs such as Microsoft Visual Studio.

    If you are using the GNU Autotools (Autoconf/ Automake/ Libtool) to configure SWIG use in your project, the SWIG Autoconf macros can be used. The primary macro is ax_pkg_swig, see http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html#ax_pkg_swig. The ax_python_devel macro is also helpful for generating Python extensions. See the Autoconf Archive for further information on this and other Autoconf macros.

    There is growing support for SWIG in some build tools, for example CMake is a cross-platform, open-source build manager with built in support for SWIG. CMake can detect the SWIG executable and many of the target language libraries for linking against. CMake knows how to build shared libraries and loadable modules on many different operating systems. This allows easy cross platform SWIG development. It can also generate the custom commands necessary for driving SWIG from IDEs and makefiles. All of this can be done from a single cross platform input file. The following example is a CMake input file for creating a Python wrapper for the SWIG interface file, example.i:

    
    # This is a CMake example for Python
    
    FIND_PACKAGE(SWIG REQUIRED)
    INCLUDE(${SWIG_USE_FILE})
    
    FIND_PACKAGE(PythonLibs)
    INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
    
    INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
    
    SET(CMAKE_SWIG_FLAGS "")
    
    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES CPLUSPLUS ON)
    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES SWIG_FLAGS "-includeall")
    SWIG_ADD_MODULE(example python example.i example.cxx)
    SWIG_LINK_LIBRARIES(example ${PYTHON_LIBRARIES})
    
    

    The above example will generate native build files such as makefiles, nmake files and Visual Studio projects which will invoke SWIG and compile the generated C++ files into _example.so (UNIX) or _example.pyd (Windows). For other target languages on Windows a dll, instead of a .pyd file, is usually generated.

    2.8 Hands off code generation

    SWIG is designed to produce working code that needs no hand-modification (in fact, if you look at the output, you probably won't want to modify it). You should think of your target language interface being defined entirely by the input to SWIG, not the resulting output file. While this approach may limit flexibility for hard-core hackers, it allows others to forget about the low-level implementation details.

    2.9 SWIG and freedom

    No, this isn't a special section on the sorry state of world politics. However, it may be useful to know that SWIG was written with a certain "philosophy" about programming---namely that programmers are smart and that tools should just stay out of their way. Because of that, you will find that SWIG is extremely permissive in what it lets you get away with. In fact, you can use SWIG to go well beyond "shooting yourself in the foot" if dangerous programming is your goal. On the other hand, this kind of freedom may be exactly what is needed to work with complicated and unusual C/C++ applications.

    Ironically, the freedom that SWIG provides is countered by an extremely conservative approach to code generation. At its core, SWIG tries to distill even the most advanced C++ code down to a small well-defined set of interface building techniques based on ISO C programming. Because of this, you will find that SWIG interfaces can be easily compiled by virtually every C/C++ compiler and that they can be used on any platform. Again, this is an important part of staying out of the programmer's way----the last thing any developer wants to do is to spend their time debugging the output of a tool that relies on non-portable or unreliable programming features. Dependencies are often a source of incompatibilities and problems and so additional third party libraries are not used in the generated code. SWIG will also generally avoid generating code that introduces a dependency on the C++ Standard Template Library (STL). SWIG will generate code that depends on the C libraries though.

    swig-4.0.2/Doc/Manual/SWIG.html0000644000175000017500000034227513667507562015763 0ustar williamwilliam SWIG Basics

    5 SWIG Basics

    This chapter describes the basic operation of SWIG, the structure of its input files, and how it handles standard ISO C declarations. C++ support is described in the next chapter. However, C++ programmers should still read this chapter to understand the basics. Specific details about each target language are described in later chapters.

    5.1 Running SWIG

    To run SWIG, use the swig command with options and a filename like this:

    swig [ options ] filename
    

    where filename is a SWIG interface file or a C/C++ header file. Full help can be seen by running swig -help. Below is the common set of options that can be used. Additional options are also defined for each target language. A full list can be obtained by running swig -<lang> -help for language <lang> specific options, for example, swig -ruby -help for Ruby.

    Supported Target Language Options
         -csharp         - Generate C# wrappers
         -d              - Generate D wrappers
         -go             - Generate Go wrappers
         -guile          - Generate Guile wrappers
         -java           - Generate Java wrappers
         -javascript     - Generate Javascript wrappers
         -lua            - Generate Lua wrappers
         -octave         - Generate Octave wrappers
         -perl5          - Generate Perl 5 wrappers
         -php7           - Generate PHP 7 wrappers
         -python         - Generate Python wrappers
         -r              - Generate R (aka GNU S) wrappers
         -ruby           - Generate Ruby wrappers
         -scilab         - Generate Scilab wrappers
         -tcl8           - Generate Tcl 8 wrappers
         -xml            - Generate XML wrappers
    
    Experimental Target Language Options
         -mzscheme       - Generate MzScheme/Racket wrappers
         -ocaml          - Generate OCaml wrappers
    
    General Options
         -addextern      - Add extra extern declarations
         -c++            - Enable C++ processing
         -co <file>      - Check <file> out of the SWIG library
         -copyctor       - Automatically generate copy constructors wherever possible
         -cpperraswarn   - Treat the preprocessor #error statement as #warning (default)
         -cppext <ext>   - Change file extension of generated C++ files to <ext>
                           (default is cxx)
         -copyright      - Display copyright notices
         -debug-classes  - Display information about the classes found in the interface
         -debug-module <n>- Display module parse tree at stages 1-4, <n> is a csv list of stages
         -debug-symtabs  - Display symbol tables information
         -debug-symbols  - Display target language symbols in the symbol tables
         -debug-csymbols - Display C symbols in the symbol tables
         -debug-lsymbols - Display target language layer symbols
         -debug-tags     - Display information about the tags found in the interface
         -debug-template - Display information for debugging templates
         -debug-top <n>  - Display entire parse tree at stages 1-4, <n> is a csv list of stages
         -debug-typedef  - Display information about the types and typedefs in the interface
         -debug-typemap  - Display typemap debugging information
         -debug-tmsearch - Display typemap search debugging information
         -debug-tmused   - Display typemaps used debugging information
         -directors      - Turn on director mode for all the classes, mainly for testing
         -dirprot        - Turn on wrapping of protected members for director classes (default)
         -D<symbol>      - Define a symbol <symbol> (for conditional compilation)
         -E              - Preprocess only, does not generate wrapper code
         -external-runtime [file] - Export the SWIG runtime stack
         -fakeversion <v>- Make SWIG fake the program version number to <v>
         -fcompact       - Compile in compact mode
         -features <list>- Set global features, where <list> is a comma separated list of
                           features, eg -features directors,autodoc=1
                           If no explicit value is given to the feature, a default of 1 is used
         -fastdispatch   - Enable fast dispatch mode to produce faster overload dispatcher code
         -Fmicrosoft     - Display error/warning messages in Microsoft format
         -Fstandard      - Display error/warning messages in commonly used format
         -fvirtual       - Compile in virtual elimination mode
         -help           - Display help
         -I-             - Don't search the current directory
         -I<dir>         - Look for SWIG files in directory <dir>
         -ignoremissing  - Ignore missing include files
         -importall      - Follow all #include statements as imports
         -includeall     - Follow all #include statements
         -l<ifile>       - Include SWIG library file <ifile>
         -macroerrors    - Report errors inside macros
         -makedefault    - Create default constructors/destructors (the default)
         -M              - List all dependencies
         -MD             - Is equivalent to `-M -MF <file>', except `-E' is not implied
         -MF <file>      - Generate dependencies into <file> and continue generating wrappers
         -MM             - List dependencies, but omit files in SWIG library
         -MMD            - Like `-MD', but omit files in SWIG library
         -module <name>  - Set module name to <name>
         -MP             - Generate phony targets for all dependencies
         -MT <target>    - Set the target of the rule emitted by dependency generation
         -nocontract     - Turn off contract checking
         -nocpperraswarn - Do not treat the preprocessor #error statement as #warning
         -nodefault      - Do not generate default constructors nor default destructors
         -nodefaultctor  - Do not generate implicit default constructors
         -nodefaultdtor  - Do not generate implicit default destructors
         -nodirprot      - Do not wrap director protected members
         -noexcept       - Do not wrap exception specifiers
         -nofastdispatch - Disable fast dispatch mode (default)
         -nopreprocess   - Skip the preprocessor step
         -notemplatereduce - Disable reduction of the typedefs in templates
         -O              - Enable the optimization options:
                            -fastdispatch -fvirtual
         -o <outfile>    - Set name of C/C++ output file to <outfile>
         -oh <headfile>  - Set name of C++ output header file for directors to <headfile>
         -outcurrentdir  - Set default output dir to current dir instead of input file's path
         -outdir <dir>   - Set language specific files output directory to <dir>
         -pcreversion    - Display PCRE version information
         -small          - Compile in virtual elimination and compact mode
         -swiglib        - Report location of SWIG library and exit
         -templatereduce - Reduce all the typedefs in templates
         -v              - Run in verbose mode
         -version        - Display SWIG version number
         -Wall           - Remove all warning suppression, also implies -Wextra
         -Wallkw         - Enable keyword warnings for all the supported languages
         -Werror         - Treat warnings as errors
         -Wextra         - Adds the following additional warnings: 202,309,403,405,512,321,322
         -w<list>        - Suppress/add warning messages, eg -w401,+321 - see Warnings.html
         -xmlout <file>  - Write XML version of the parse tree to <file> after normal processing
    

    Arguments may also be passed in a command-line options file (also known as a response file) which is useful if they exceed the system command line length limit. To do this, put the arguments in a file, then provide the file name prefixed with @ like so:

    swig @file
    

    The options read from the file are inserted in place of the file option. If the file does not exist, or cannot be read, then the option will be treated literally and not removed.

    Options in the file are separated by whitespace. A whitespace character may be included in an option by surrounding the entire option in either single or double quotes. Any character (including a backslash) may be included by prefixing the character to be included with a backslash. The file may itself contain additional @file options; any such options will be processed recursively.

    5.1.1 Input format

    As input, SWIG expects a file containing ISO C/C++ declarations and special SWIG directives. More often than not, this is a special SWIG interface file which is usually denoted with a special .i or .swg suffix. In certain cases, SWIG can be used directly on raw header files or source files. However, this is not the most typical case and there are several reasons why you might not want to do this (described later).

    The most common format of a SWIG interface is as follows:

    %module mymodule 
    %{
    #include "myheader.h"
    %}
    // Now list ISO C/C++ declarations
    int foo;
    int bar(int x);
    ...
    

    The module name is supplied using the special %module directive. Modules are described further in the Modules Introduction section.

    Everything in the %{ ... %} block is simply copied verbatim to the resulting wrapper file created by SWIG. This section is almost always used to include header files and other declarations that are required to make the generated wrapper code compile. It is important to emphasize that just because you include a declaration in a SWIG input file, that declaration does not automatically appear in the generated wrapper code---therefore you need to make sure you include the proper header files in the %{ ... %} section. It should be noted that the text enclosed in %{ ... %} is not parsed or interpreted by SWIG. The %{...%} syntax and semantics in SWIG is analogous to that of the declarations section used in input files to parser generation tools such as yacc or bison.

    5.1.2 SWIG Output

    The output of SWIG is a C/C++ file that contains all of the wrapper code needed to build an extension module. SWIG may generate some additional files depending on the target language. By default, an input file with the name file.i is transformed into a file file_wrap.c or file_wrap.cxx (depending on whether or not the -c++ option has been used). The name of the output C/C++ file can be changed using the -o option. In certain cases, file suffixes are used by the compiler to determine the source language (C, C++, etc.). Therefore, you have to use the -o option to change the suffix of the SWIG-generated wrapper file if you want something different than the default. For example:

    $ swig -c++ -python -o example_wrap.cpp example.i
    

    The C/C++ output file created by SWIG often contains everything that is needed to construct an extension module for the target scripting language. SWIG is not a stub compiler nor is it usually necessary to edit the output file (and if you look at the output, you probably won't want to). To build the final extension module, the SWIG output file is compiled and linked with the rest of your C/C++ program to create a shared library.

    For many target languages SWIG will also generate proxy class files in the target language. The default output directory for these language specific files is the same directory as the generated C/C++ file. This can be modified using the -outdir option. For example:

    $ swig -c++ -python -outdir pyfiles -o cppfiles/example_wrap.cpp example.i
    

    If the directories cppfiles and pyfiles exist, the following will be generated:

    cppfiles/example_wrap.cpp
    pyfiles/example.py
    

    If the -outcurrentdir option is used (without -o) then SWIG behaves like a typical C/C++ compiler and the default output directory is then the current directory. Without this option the default output directory is the path to the input file. If -o and -outcurrentdir are used together, -outcurrentdir is effectively ignored as the output directory for the language files is the same directory as the generated C/C++ file if not overridden with -outdir.

    5.1.3 Comments

    C and C++ style comments may appear anywhere in interface files. In previous versions of SWIG, comments were used to generate documentation files. However, this feature is currently under repair and will reappear in a later SWIG release.

    5.1.4 C Preprocessor

    Like C, SWIG preprocesses all input files through an enhanced version of the C preprocessor. All standard preprocessor features are supported including file inclusion, conditional compilation and macros. However, #include statements are ignored unless the -includeall command line option has been supplied. The reason for disabling includes is that SWIG is sometimes used to process raw C header files. In this case, you usually only want the extension module to include functions in the supplied header file rather than everything that might be included by that header file (i.e., system headers, C library functions, etc.).

    It should also be noted that the SWIG preprocessor skips all text enclosed inside a %{...%} block. In addition, the preprocessor includes a number of macro handling enhancements that make it more powerful than the normal C preprocessor. These extensions are described in the "Preprocessor" chapter.

    5.1.5 SWIG Directives

    Most of SWIG's operation is controlled by special directives that are always preceded by a "%" to distinguish them from normal C declarations. These directives are used to give SWIG hints or to alter SWIG's parsing behavior in some manner.

    Since SWIG directives are not legal C syntax, it is generally not possible to include them in header files. However, SWIG directives can be included in C header files using conditional compilation like this:

    /* header.h  --- Some header file */
    
    /* SWIG directives -- only seen if SWIG is running */ 
    #ifdef SWIG
    %module foo
    #endif
    

    SWIG is a special preprocessing symbol defined by SWIG when it is parsing an input file.

    5.1.6 Parser Limitations

    Although SWIG can parse most C/C++ declarations, it does not provide a complete C/C++ parser implementation. Most of these limitations pertain to very complicated type declarations and certain advanced C++ features. Specifically, the following features are not currently supported:

    • Non-conventional type declarations. For example, SWIG does not support declarations such as the following (even though this is legal C):

      /* Non-conventional placement of storage specifier (extern) */
      const int extern Number;
      
      /* Extra declarator grouping */
      Matrix (foo);    // A global variable
      
      /* Extra declarator grouping in parameters */
      void bar(Spam (Grok)(Doh));
      
      

      In practice, few (if any) C programmers actually write code like this since this style is never featured in programming books. However, if you're feeling particularly obfuscated, you can certainly break SWIG (although why would you want to?).

    • Running SWIG on C++ source files (the code in a .C, .cpp or .cxx file) is not recommended. The usual approach is to feed SWIG header files for parsing C++ definitions and declarations. The main reason is if SWIG parses a scoped definition or declaration (as is normal for C++ source files), it is ignored, unless a declaration for the symbol was parsed earlier. For example

      /* bar not wrapped unless foo has been defined and 
         the declaration of bar within foo has already been parsed */
      int foo::bar(int) {
        ... whatever ...
      }
      
    • Certain advanced features of C++ such as nested classes are not yet fully supported. Please see the C++ Nested classes section for more information.

    In the event of a parsing error, conditional compilation can be used to skip offending code. For example:

    #ifndef SWIG
    ... some bad declarations ...
    #endif
    

    Alternatively, you can just delete the offending code from the interface file.

    One of the reasons why SWIG does not provide a full C++ parser implementation is that it has been designed to work with incomplete specifications and to be very permissive in its handling of C/C++ datatypes (e.g., SWIG can generate interfaces even when there are missing class declarations or opaque datatypes). Unfortunately, this approach makes it extremely difficult to implement certain parts of a C/C++ parser as most compilers use type information to assist in the parsing of more complex declarations (for the truly curious, the primary complication in the implementation is that the SWIG parser does not utilize a separate typedef-name terminal symbol as described on p. 234 of K&R).

    5.2 Wrapping Simple C Declarations

    SWIG wraps simple C declarations by creating an interface that closely matches the way in which the declarations would be used in a C program. For example, consider the following interface file:

    %module example
    
    %inline %{
    extern double sin(double x);
    extern int strcmp(const char *, const char *);
    extern int Foo;
    %}
    #define STATUS 50
    #define VERSION "1.1"
    

    In this file, there are two functions sin() and strcmp(), a global variable Foo, and two constants STATUS and VERSION. When SWIG creates an extension module, these declarations are accessible as scripting language functions, variables, and constants respectively. For example, in Tcl:

    % sin 3
    5.2335956
    % strcmp Dave Mike
    -1
    % puts $Foo
    42
    % puts $STATUS
    50
    % puts $VERSION
    1.1
    

    Or in Python:

    >>> example.sin(3)
    5.2335956
    >>> example.strcmp('Dave', 'Mike')
    -1
    >>> print example.cvar.Foo
    42
    >>> print example.STATUS
    50
    >>> print example.VERSION
    1.1
    

    Whenever possible, SWIG creates an interface that closely matches the underlying C/C++ code. However, due to subtle differences between languages, run-time environments, and semantics, it is not always possible to do so. The next few sections describe various aspects of this mapping.

    5.2.1 Basic Type Handling

    In order to build an interface, SWIG has to convert C/C++ datatypes to equivalent types in the target language. Generally, scripting languages provide a more limited set of primitive types than C. Therefore, this conversion process involves a certain amount of type coercion.

    Most scripting languages provide a single integer type that is implemented using the int or long datatype in C. The following list shows all of the C datatypes that SWIG will convert to and from integers in the target language:

    int
    short
    long
    unsigned
    signed
    unsigned short
    unsigned long
    unsigned char
    signed char
    bool
    

    When an integral value is converted from C, a cast is used to convert it to the representation in the target language. Thus, a 16 bit short in C may be promoted to a 32 bit integer. When integers are converted in the other direction, the value is cast back into the original C type. If the value is too large to fit, it is silently truncated.

    unsigned char and signed char are special cases that are handled as small 8-bit integers. Normally, the char datatype is mapped as a one-character ASCII string.

    The bool datatype is cast to and from an integer value of 0 and 1 unless the target language provides a special boolean type.

    Some care is required when working with large integer values. Most scripting languages use 32-bit integers so mapping a 64-bit long integer may lead to truncation errors. Similar problems may arise with 32 bit unsigned integers (which may appear as large negative numbers). As a rule of thumb, the int datatype and all variations of char and short datatypes are safe to use. For unsigned int and long datatypes, you will need to carefully check the correct operation of your program after it has been wrapped with SWIG.

    Although the SWIG parser supports the long long datatype, not all language modules support it. This is because long long usually exceeds the integer precision available in the target language. In certain modules such as Tcl and Perl5, long long integers are encoded as strings. This allows the full range of these numbers to be represented. However, it does not allow long long values to be used in arithmetic expressions. It should also be noted that although long long is part of the ISO C99 standard, it is not universally supported by all C compilers. Make sure you are using a compiler that supports long long before trying to use this type with SWIG.

    SWIG recognizes the following floating point types :

    float
    double
    

    Floating point numbers are mapped to and from the natural representation of floats in the target language. This is almost always a C double. The rarely used datatype of long double is not supported by SWIG.

    The char datatype is mapped into a NULL terminated ASCII string with a single character. When used in a scripting language it shows up as a tiny string containing the character value. When converting the value back into C, SWIG takes a character string from the scripting language and strips off the first character as the char value. Thus if the value "foo" is assigned to a char datatype, it gets the value `f'.

    The char * datatype is handled as a NULL-terminated ASCII string. SWIG maps this into a 8-bit character string in the target scripting language. SWIG converts character strings in the target language to NULL terminated strings before passing them into C/C++. The default handling of these strings does not allow them to have embedded NULL bytes. Therefore, the char * datatype is not generally suitable for passing binary data. However, it is possible to change this behavior by defining a SWIG typemap. See the chapter on Typemaps for details about this.

    At this time, SWIG provides limited support for Unicode and wide-character strings (the C wchar_t type). Some languages provide typemaps for wchar_t, but bear in mind these might not be portable across different operating systems. This is a delicate topic that is poorly understood by many programmers and not implemented in a consistent manner across languages. For those scripting languages that provide Unicode support, Unicode strings are often available in an 8-bit representation such as UTF-8 that can be mapped to the char * type (in which case the SWIG interface will probably work). If the program you are wrapping uses Unicode, there is no guarantee that Unicode characters in the target language will use the same internal representation (e.g., UCS-2 vs. UCS-4). You may need to write some special conversion functions.

    5.2.2 Global Variables

    Whenever possible, SWIG maps C/C++ global variables into scripting language variables. For example,

    %module example
    double foo;
    
    

    results in a scripting language variable like this:

    # Tcl
    set foo [3.5]                   ;# Set foo to 3.5
    puts $foo                       ;# Print the value of foo
    
    # Python
    cvar.foo = 3.5                  # Set foo to 3.5
    print cvar.foo                  # Print value of foo
    
    # Perl
    $foo = 3.5;                     # Set foo to 3.5
    print $foo, "\n";               # Print value of foo
    
    # Ruby
    Module.foo = 3.5               # Set foo to 3.5
    print Module.foo, "\n"         # Print value of foo
    

    Whenever the scripting language variable is used, the underlying C global variable is accessed. Although SWIG makes every attempt to make global variables work like scripting language variables, it is not always possible to do so. For instance, in Python, all global variables must be accessed through a special variable object known as cvar (shown above). In Ruby, variables are accessed as attributes of the module. Other languages may convert variables to a pair of accessor functions. For example, the Java module generates a pair of functions double get_foo() and set_foo(double val) that are used to manipulate the value.

    Finally, if a global variable has been declared as const, it only supports read-only access. Note: this behavior is new to SWIG-1.3. Earlier versions of SWIG incorrectly handled const and created constants instead.

    5.2.3 Constants

    Constants can be created using #define, enumerations, or a special %constant directive. The following interface file shows a few valid constant declarations :

    #define I_CONST       5               // An integer constant
    #define PI            3.14159         // A Floating point constant
    #define S_CONST       "hello world"   // A string constant
    #define NEWLINE       '\n'            // Character constant
    
    enum boolean {NO=0, YES=1};
    enum months {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG,
                 SEP, OCT, NOV, DEC};
    %constant double BLAH = 42.37;
    #define PI_4 PI/4
    #define FLAGS 0x04 | 0x08 | 0x40
    
    

    In #define declarations, the type of a constant is inferred by syntax. For example, a number with a decimal point is assumed to be floating point. In addition, SWIG must be able to fully resolve all of the symbols used in a #define in order for a constant to actually be created. This restriction is necessary because #define is also used to define preprocessor macros that are definitely not meant to be part of the scripting language interface. For example:

    #define EXTERN extern
    
    EXTERN void foo();
    

    In this case, you probably don't want to create a constant called EXTERN (what would the value be?). In general, SWIG will not create constants for macros unless the value can be completely determined by the preprocessor. For instance, in the above example, the declaration

    #define PI_4  PI/4
    

    defines a constant because PI was already defined as a constant and the value is known. However, for the same conservative reasons even a constant with a simple cast will be ignored, such as

    #define F_CONST (double) 5            // A floating point constant with cast
    

    This logic can lead to false attempts at converting #define into %constant though. For example the following case does not have any undefined symbols within the macro:

    // For indicating pure virtual functions such as: virtual void f() PURE;
    #define PURE = 0
    

    A warning is issued:

    pure.h:1: Warning 305: Bad constant value (ignored).
    

    In such cases simply ignore the warning or suppress it using the normal warning suppression techniques.

    The use of constant expressions is allowed, but SWIG does not evaluate them. Rather, it passes them through to the output file and lets the C compiler perform the final evaluation (SWIG does perform a limited form of type-checking however).

    For enumerations, it is critical that the original enum definition be included somewhere in the interface file (either in a header file or in the %{ %} block). SWIG only translates the enumeration into code needed to add the constants to a scripting language. It needs the original enumeration declaration in order to get the correct enum values as assigned by the C compiler.

    The %constant directive is used to more precisely create constants corresponding to different C datatypes. Although it is not usually needed for simple values, it is more useful when working with pointers and other more complex datatypes. Typically, %constant is only used when you want to add constants to the scripting language interface that are not defined in the original header file.

    5.2.4 A brief word about const

    A common confusion with C programming is the semantic meaning of the const qualifier in declarations--especially when it is mixed with pointers and other type modifiers. In fact, previous versions of SWIG handled const incorrectly--a situation that SWIG-1.3.7 and newer releases have fixed.

    Starting with SWIG-1.3, all variable declarations, regardless of any use of const, are wrapped as global variables. If a declaration happens to be declared as const, it is wrapped as a read-only variable. To tell if a variable is const or not, you need to look at the right-most occurrence of the const qualifier (that appears before the variable name). If the right-most const occurs after all other type modifiers (such as pointers), then the variable is const. Otherwise, it is not.

    Here are some examples of const declarations.

    const char a;           // A constant character
    char const b;           // A constant character (the same)
    char *const c;          // A constant pointer to a character
    const char *const d;    // A constant pointer to a constant character
    

    Here is an example of a declaration that is not const:

    const char *e;          // A pointer to a constant character.  The pointer
                            // may be modified.
    

    In this case, the pointer e can change---it's only the value being pointed to that is read-only.

    Please note that for const parameters or return types used in a function, SWIG pretty much ignores the fact that these are const, see the section on const-correctness for more information.

    Compatibility Note: One reason for changing SWIG to handle const declarations as read-only variables is that there are many situations where the value of a const variable might change. For example, a library might export a symbol as const in its public API to discourage modification, but still allow the value to change through some other kind of internal mechanism. Furthermore, programmers often overlook the fact that with a constant declaration like char *const, the underlying data being pointed to can be modified--it's only the pointer itself that is constant. In an embedded system, a const declaration might refer to a read-only memory address such as the location of a memory-mapped I/O device port (where the value changes, but writing to the port is not supported by the hardware). Rather than trying to build a bunch of special cases into the const qualifier, the new interpretation of const as "read-only" is simple and exactly matches the actual semantics of const in C/C++. If you really want to create a constant as in older versions of SWIG, use the %constant directive instead. For example:

    %constant double PI = 3.14159;
    

    or

    #ifdef SWIG
    #define const %constant
    #endif
    const double foo = 3.4;
    const double bar = 23.4;
    const int    spam = 42;
    #ifdef SWIG
    #undef const
    #endif
    ...
    
    

    5.2.5 A cautionary tale of char *

    Before going any further, there is one bit of caution involving char * that must now be mentioned. When strings are passed from a scripting language to a C char *, the pointer usually points to string data stored inside the interpreter. It is almost always a really bad idea to modify this data. Furthermore, some languages may explicitly disallow it. For instance, in Python, strings are supposed to be immutable. If you violate this, you will probably receive a vast amount of wrath when you unleash your module on the world.

    The primary source of problems are functions that might modify string data in place. A classic example would be a function like this:

    char *strcat(char *s, const char *t)
    

    Although SWIG will certainly generate a wrapper for this, its behavior will be undefined. In fact, it will probably cause your application to crash with a segmentation fault or other memory related problem. This is because s refers to some internal data in the target language---data that you shouldn't be touching.

    The bottom line: don't rely on char * for anything other than read-only input values. However, it must be noted that you could change the behavior of SWIG using typemaps.

    5.3 Pointers and complex objects

    Most C programs manipulate arrays, structures, and other types of objects. This section discusses the handling of these datatypes.

    5.3.1 Simple pointers

    Pointers to primitive C datatypes such as

    int *
    double ***
    char **
    

    are fully supported by SWIG. Rather than trying to convert the data being pointed to into a scripting representation, SWIG simply encodes the pointer itself into a representation that contains the actual value of the pointer and a type-tag. Thus, the SWIG representation of the above pointers (in Tcl), might look like this:

    _10081012_p_int
    _1008e124_ppp_double
    _f8ac_pp_char
    

    A NULL pointer is represented by the string "NULL" or the value 0 encoded with type information.

    All pointers are treated as opaque objects by SWIG. Thus, a pointer may be returned by a function and passed around to other C functions as needed. For all practical purposes, the scripting language interface works in exactly the same way as you would use the pointer in a C program. The only difference is that there is no mechanism for dereferencing the pointer since this would require the target language to understand the memory layout of the underlying object.

    The scripting language representation of a pointer value should never be manipulated directly. Even though the values shown look like hexadecimal addresses, the numbers used may differ from the actual machine address (e.g., on little-endian machines, the digits may appear in reverse order). Furthermore, SWIG does not normally map pointers into high-level objects such as associative arrays or lists (for example, converting an int * into an list of integers). There are several reasons why SWIG does not do this:

    • There is not enough information in a C declaration to properly map pointers into higher level constructs. For example, an int * may indeed be an array of integers, but if it contains ten million elements, converting it into a list object is probably a bad idea.
    • The underlying semantics associated with a pointer is not known by SWIG. For instance, an int * might not be an array at all--perhaps it is an output value!
    • By handling all pointers in a consistent manner, the implementation of SWIG is greatly simplified and less prone to error.

    5.3.2 Run time pointer type checking

    By allowing pointers to be manipulated from a scripting language, extension modules effectively bypass compile-time type checking in the C/C++ compiler. To prevent errors, a type signature is encoded into all pointer values and is used to perform run-time type checking. This type-checking process is an integral part of SWIG and can not be disabled or modified without using typemaps (described in later chapters).

    Like C, void * matches any kind of pointer. Furthermore, NULL pointers can be passed to any function that expects to receive a pointer. Although this has the potential to cause a crash, NULL pointers are also sometimes used as sentinel values or to denote a missing/empty value. Therefore, SWIG leaves NULL pointer checking up to the application.

    5.3.3 Derived types, structs, and classes

    For everything else (structs, classes, arrays, etc...) SWIG applies a very simple rule :

    Everything else is a pointer

    In other words, SWIG manipulates everything else by reference. This model makes sense because most C/C++ programs make heavy use of pointers and SWIG can use the type-checked pointer mechanism already present for handling pointers to basic datatypes.

    Although this probably sounds complicated, it's really quite simple. Suppose you have an interface file like this :

    %module fileio
    FILE *fopen(char *, char *);
    int fclose(FILE *);
    unsigned fread(void *ptr, unsigned size, unsigned nobj, FILE *);
    unsigned fwrite(void *ptr, unsigned size, unsigned nobj, FILE *);
    void *malloc(int nbytes);
    void free(void *);
    
    

    In this file, SWIG doesn't know what a FILE is, but since it's used as a pointer, so it doesn't really matter what it is. If you wrapped this module into Python, you can use the functions just like you expect :

    # Copy a file 
    def filecopy(source, target):
        f1 = fopen(source, "r")
        f2 = fopen(target, "w")
        buffer = malloc(8192)
        nbytes = fread(buffer, 8192, 1, f1)
        while (nbytes > 0):
            fwrite(buffer, 8192, 1, f2)
                nbytes = fread(buffer, 8192, 1, f1)
        free(buffer)
    

    In this case f1, f2, and buffer are all opaque objects containing C pointers. It doesn't matter what value they contain--our program works just fine without this knowledge.

    5.3.4 Undefined datatypes

    When SWIG encounters an undeclared datatype, it automatically assumes that it is a structure or class. For example, suppose the following function appeared in a SWIG input file:

    void matrix_multiply(Matrix *a, Matrix *b, Matrix *c);
    

    SWIG has no idea what a "Matrix" is. However, it is obviously a pointer to something so SWIG generates a wrapper using its generic pointer handling code.

    Unlike C or C++, SWIG does not actually care whether Matrix has been previously defined in the interface file or not. This allows SWIG to generate interfaces from only partial or limited information. In some cases, you may not care what a Matrix really is as long as you can pass an opaque reference to one around in the scripting language interface.

    An important detail to mention is that SWIG will gladly generate wrappers for an interface when there are unspecified type names. However, all unspecified types are internally handled as pointers to structures or classes! For example, consider the following declaration:

    void foo(size_t num);
    

    If size_t is undeclared, SWIG generates wrappers that expect to receive a type of size_t * (this mapping is described shortly). As a result, the scripting interface might behave strangely. For example:

    foo(40);
    TypeError: expected a _p_size_t.
    

    The only way to fix this problem is to make sure you properly declare type names using typedef.

    5.3.5 Typedef

    Like C, typedef can be used to define new type names in SWIG. For example:

    typedef unsigned int size_t;
    

    typedef definitions appearing in a SWIG interface are not propagated to the generated wrapper code. Therefore, they either need to be defined in an included header file or placed in the declarations section like this:

    %{
    /* Include in the generated wrapper file */
    typedef unsigned int size_t;
    %}
    /* Tell SWIG about it */
    typedef unsigned int size_t;
    

    or

    %inline %{
    typedef unsigned int size_t;
    %}
    

    In certain cases, you might be able to include other header files to collect type information. For example:

    %module example
    %import "sys/types.h"
    

    In this case, you might run SWIG as follows:

    $ swig -I/usr/include -includeall example.i
    

    It should be noted that your mileage will vary greatly here. System headers are notoriously complicated and may rely upon a variety of non-standard C coding extensions (e.g., such as special directives to GCC). Unless you exactly specify the right include directories and preprocessor symbols, this may not work correctly (you will have to experiment).

    SWIG tracks typedef declarations and uses this information for run-time type checking. For instance, if you use the above typedef and had the following function declaration:

    void foo(unsigned int *ptr);
    

    The corresponding wrapper function will accept arguments of type unsigned int * or size_t *.

    5.4 Other Practicalities

    So far, this chapter has presented almost everything you need to know to use SWIG for simple interfaces. However, some C programs use idioms that are somewhat more difficult to map to a scripting language interface. This section describes some of these issues.

    5.4.1 Passing structures by value

    Sometimes a C function takes structure parameters that are passed by value. For example, consider the following function:

    double dot_product(Vector a, Vector b);
    

    To deal with this, SWIG transforms the function to use pointers by creating a wrapper equivalent to the following:

    double wrap_dot_product(Vector *a, Vector *b) {
      Vector x = *a;
      Vector y = *b;
      return dot_product(x, y);
    }
    

    In the target language, the dot_product() function now accepts pointers to Vectors instead of Vectors. For the most part, this transformation is transparent so you might not notice.

    5.4.2 Return by value

    C functions that return structures or classes datatypes by value are more difficult to handle. Consider the following function:

    Vector cross_product(Vector v1, Vector v2);
    

    This function wants to return Vector, but SWIG only really supports pointers. As a result, SWIG creates a wrapper like this:

    Vector *wrap_cross_product(Vector *v1, Vector *v2) {
      Vector x = *v1;
      Vector y = *v2;
      Vector *result;
      result = (Vector *) malloc(sizeof(Vector));
      *(result) = cross(x, y);
      return result;
    }
    

    or if SWIG was run with the -c++ option:

    Vector *wrap_cross(Vector *v1, Vector *v2) {
      Vector x = *v1;
      Vector y = *v2;
      Vector *result = new Vector(cross(x, y)); // Uses default copy constructor
      return result;
    }
    

    In both cases, SWIG allocates a new object and returns a reference to it. It is up to the user to delete the returned object when it is no longer in use. Clearly, this will leak memory if you are unaware of the implicit memory allocation and don't take steps to free the result. That said, it should be noted that some language modules can now automatically track newly created objects and reclaim memory for you. Consult the documentation for each language module for more details.

    It should also be noted that the handling of pass/return by value in C++ has some special cases. For example, the above code fragments don't work correctly if Vector doesn't define a default constructor. The section on SWIG and C++ has more information about this case.

    5.4.3 Linking to structure variables

    When global variables or class members involving structures are encountered, SWIG handles them as pointers. For example, a global variable like this

    Vector unit_i;
    

    gets mapped to an underlying pair of set/get functions like this :

    Vector *unit_i_get() {
      return &unit_i;
    }
    void unit_i_set(Vector *value) {
      unit_i = *value;
    }
    

    Again some caution is in order. A global variable created in this manner will show up as a pointer in the target scripting language. It would be an extremely bad idea to free or destroy such a pointer. Also, C++ classes must supply a properly defined copy constructor in order for assignment to work correctly.

    5.4.4 Linking to char *

    When a global variable of type char * appears, SWIG uses malloc() or new to allocate memory for the new value. Specifically, if you have a variable like this

    char *foo;
    

    SWIG generates the following code:

    /* C mode */
    void foo_set(char *value) {
      if (foo) free(foo);
      foo = (char *) malloc(strlen(value)+1);
      strcpy(foo, value);
    }
    
    /* C++ mode.  When -c++ option is used */
    void foo_set(char *value) {
      if (foo) delete [] foo;
      foo = new char[strlen(value)+1];
      strcpy(foo, value);
    }
    

    If this is not the behavior that you want, consider making the variable read-only using the %immutable directive. Alternatively, you might write a short assist-function to set the value exactly like you want. For example:

    %inline %{
      void set_foo(char *value) {
        strncpy(foo, value, 50);
      }
    %}
    

    Note: If you write an assist function like this, you will have to call it as a function from the target scripting language (it does not work like a variable). For example, in Python you will have to write:

    >>> set_foo("Hello World")
    

    A common mistake with char * variables is to link to a variable declared like this:

    char *VERSION = "1.0";
    

    In this case, the variable will be readable, but any attempt to change the value results in a segmentation or general protection fault. This is due to the fact that SWIG is trying to release the old value using free or delete when the string literal value currently assigned to the variable wasn't allocated using malloc() or new. To fix this behavior, you can either mark the variable as read-only, write a typemap (as described in Chapter 6), or write a special set function as shown. Another alternative is to declare the variable as an array:

    char VERSION[64] = "1.0";
    

    When variables of type const char * are declared, SWIG still generates functions for setting and getting the value. However, the default behavior does not release the previous contents (resulting in a possible memory leak). In fact, you may get a warning message such as this when wrapping such a variable:

    example.i:20. Typemap warning. Setting const char * variable may leak memory
    

    The reason for this behavior is that const char * variables are often used to point to string literals. For example:

    const char *foo = "Hello World\n";
    

    Therefore, it's a really bad idea to call free() on such a pointer. On the other hand, it is legal to change the pointer to point to some other value. When setting a variable of this type, SWIG allocates a new string (using malloc or new) and changes the pointer to point to the new value. However, repeated modifications of the value will result in a memory leak since the old value is not released.

    5.4.5 Arrays

    Arrays are fully supported by SWIG, but they are always handled as pointers instead of mapping them to a special array object or list in the target language. Thus, the following declarations :

    int foobar(int a[40]);
    void grok(char *argv[]);
    void transpose(double a[20][20]);
    

    are processed as if they were really declared like this:

    int foobar(int *a);
    void grok(char **argv);
    void transpose(double (*a)[20]);
    

    Like C, SWIG does not perform array bounds checking. It is up to the user to make sure the pointer points to a suitably allocated region of memory.

    Multi-dimensional arrays are transformed into a pointer to an array of one less dimension. For example:

    int [10];         // Maps to int *
    int [10][20];     // Maps to int (*)[20]
    int [10][20][30]; // Maps to int (*)[20][30]
    

    It is important to note that in the C type system, a multidimensional array a[][] is NOT equivalent to a single pointer *a or a double pointer such as **a. Instead, a pointer to an array is used (as shown above) where the actual value of the pointer is the starting memory location of the array. The reader is strongly advised to dust off their C book and re-read the section on arrays before using them with SWIG.

    Array variables are supported, but are read-only by default. For example:

    int   a[100][200];
    

    In this case, reading the variable 'a' returns a pointer of type int (*)[200] that points to the first element of the array &a[0][0]. Trying to modify 'a' results in an error. This is because SWIG does not know how to copy data from the target language into the array. To work around this limitation, you may want to write a few simple assist functions like this:

    %inline %{
    void a_set(int i, int j, int val) {
      a[i][j] = val;
    }
    int a_get(int i, int j) {
      return a[i][j];
    }
    %}
    

    To dynamically create arrays of various sizes and shapes, it may be useful to write some helper functions in your interface. For example:

    // Some array helpers
    %inline %{
      /* Create any sort of [size] array */
      int *int_array(int size) {
        return (int *) malloc(size*sizeof(int));
      }
      /* Create a two-dimension array [size][10] */
      int (*int_array_10(int size))[10] {
        return (int (*)[10]) malloc(size*10*sizeof(int));
      }
    %}
    

    Arrays of char are handled as a special case by SWIG. In this case, strings in the target language can be stored in the array. For example, if you have a declaration like this,

    char pathname[256];
    

    SWIG generates functions for both getting and setting the value that are equivalent to the following code:

    char *pathname_get() {
      return pathname;
    }
    void pathname_set(char *value) {
      strncpy(pathname, value, 256);
    }
    

    In the target language, the value can be set like a normal variable.

    5.4.6 Creating read-only variables

    A read-only variable can be created by using the %immutable directive as shown :

    // File : interface.i
    
    int a;       // Can read/write
    %immutable;
    int b, c, d;   // Read only variables
    %mutable;
    double x, y;  // read/write
    

    The %immutable directive enables read-only mode until it is explicitly disabled using the %mutable directive. As an alternative to turning read-only mode off and on like this, individual declarations can also be tagged as immutable. For example:

    %immutable x;                   // Make x read-only
    ...
    double x;                       // Read-only (from earlier %immutable directive)
    double y;                       // Read-write
    ...
    

    The %mutable and %immutable directives are actually %feature directives defined like this:

    #define %immutable   %feature("immutable")
    #define %mutable     %feature("immutable", "")
    

    If you wanted to make all wrapped variables read-only, barring one or two, it might be easier to take this approach:

    %immutable;                     // Make all variables read-only
    %feature("immutable", "0") x;   // except, make x read/write
    ...
    double x;
    double y;
    double z;
    ...
    

    Read-only variables are also created when declarations are declared as const. For example:

    const int foo;               /* Read only variable */
    char * const version="1.0";  /* Read only variable */
    

    Compatibility note: Read-only access used to be controlled by a pair of directives %readonly and %readwrite. Although these directives still work, they generate a warning message. Simply change the directives to %immutable; and %mutable; to silence the warning. Don't forget the extra semicolon!

    5.4.7 Renaming and ignoring declarations

    5.4.7.1 Simple renaming of specific identifiers

    Normally, the name of a C declaration is used when that declaration is wrapped into the target language. However, this may generate a conflict with a keyword or already existing function in the scripting language. To resolve a name conflict, you can use the %rename directive as shown :

    // interface.i
    
    %rename(my_print) print;
    extern void print(const char *);
    
    %rename(foo) a_really_long_and_annoying_name;
    extern int a_really_long_and_annoying_name;
    
    

    SWIG still calls the correct C function, but in this case the function print() will really be called "my_print()" in the target language.

    The placement of the %rename directive is arbitrary as long as it appears before the declarations to be renamed. A common technique is to write code for wrapping a header file like this:

    // interface.i
    
    %rename(my_print) print;
    %rename(foo) a_really_long_and_annoying_name;
    
    %include "header.h"
    

    %rename applies a renaming operation to all future occurrences of a name. The renaming applies to functions, variables, class and structure names, member functions, and member data. For example, if you had two-dozen C++ classes, all with a member function named `print' (which is a keyword in Python), you could rename them all to `output' by specifying :

    %rename(output) print; // Rename all `print' functions to `output'
    

    SWIG does not normally perform any checks to see if the functions it wraps are already defined in the target scripting language. However, if you are careful about namespaces and your use of modules, you can usually avoid these problems.

    When wrapping C code, simple use of identifiers/symbols with %rename usually suffices. When wrapping C++ code, simple use of simple identifiers/symbols with %rename might be too limiting when using C++ features such as function overloading, default arguments, namespaces, template specialization etc. If you are using the %rename directive and C++, make sure you read the SWIG and C++ chapter and in particular the section on Renaming and ambiguity resolution for method overloading and default arguments.

    Closely related to %rename is the %ignore directive. %ignore instructs SWIG to ignore declarations that match a given identifier. For example:

    %ignore print;         // Ignore all declarations named print
    %ignore MYMACRO;       // Ignore a macro
    ...
    #define MYMACRO 123
    void print(const char *);
    ...
    

    Any function, variable etc which matches %ignore will not be wrapped and therefore will not be available from the target language. A common usage of %ignore is to selectively remove certain declarations from a header file without having to add conditional compilation to the header. However, it should be stressed that this only works for simple declarations. If you need to remove a whole section of problematic code, the SWIG preprocessor should be used instead.

    Compatibility note: Older versions of SWIG provided a special %name directive for renaming declarations. For example:

    %name(output) extern void print(const char *);
    

    This directive is still supported, but it is deprecated and should probably be avoided. The %rename directive is more powerful and better supports wrapping of raw header file information.

    5.4.7.2 Advanced renaming support

    While writing %rename for specific declarations is simple enough, sometimes the same renaming rule needs to be applied to many, maybe all, identifiers in the SWIG input. For example, it may be necessary to apply some transformation to all the names in the target language to better follow its naming conventions, like adding a specific prefix to all wrapped functions. Doing it individually for each function is impractical so SWIG supports applying a renaming rule to all declarations if the name of the identifier to be renamed is not specified:

    %rename("myprefix_%s") ""; // print -> myprefix_print
    

    This also shows that the argument of %rename doesn't have to be a literal string but can be a printf()-like format string. In the simplest form, "%s" is replaced with the name of the original declaration, as shown above. However this is not always enough and SWIG provides extensions to the usual format string syntax to allow applying a (SWIG-defined) function to the argument. For example, to wrap all C functions do_something_long() as more Java-like doSomethingLong() you can use the "lowercamelcase" extended format specifier like this:

    %rename("%(lowercamelcase)s") ""; // foo_bar -> fooBar; FooBar -> fooBar
    

    Some functions can be parametrized, for example the "strip" one strips the provided prefix from its argument. The prefix is specified as part of the format string, following a colon after the function name:

    %rename("%(strip:[wx])s") ""; // wxHello -> Hello; FooBar -> FooBar
    

    Below is the table summarizing all currently defined functions with an example of applying each one. Note that some of them have two names, a shorter one and a more descriptive one, but the two functions are otherwise equivalent:

    FunctionReturnsExample (in/out)
    uppercase or upper Upper case version of the string. PrintPRINT
    lowercase or lower Lower case version of the string. Printprint
    title String with first letter capitalized and the rest in lower case. printPrint
    firstuppercase String with the first letter capitalized and the rest unchanged. printItPrintIt
    firstlowercase String with the first letter in lower case and the rest unchanged. PrintItprintIt
    camelcase or ctitle String with capitalized first letter and any letter following an underscore (which are removed in the process) and rest in lower case. print_itPrintIt
    lowercamelcase or lctitle String with every letter following an underscore (which is removed in the process) capitalized and rest, including the first letter, in lower case. print_itprintIt
    undercase or utitle Lower case string with underscores inserted before every upper case letter in the original string and any number not at the end of string. Logically, this is the reverse of camelcase. PrintItprint_it
    schemify String with all underscores replaced with dashes, resulting in more Lispers/Schemers-pleasing name. print_itprint-it
    strip:[prefix] String without the given prefix or the original string if it doesn't start with this prefix. Note that square brackets should be used literally, e.g. %rename("strip:[wx]") wxPrintPrint
    rstrip:[suffix] String without the given suffix or the original string if it doesn't end with this suffix. Note that square brackets should be used literally, e.g. %rename("rstrip:[Cls]") PrintClsPrint
    regex:/pattern/subst/ String after (Perl-like) regex substitution operation. This function allows to apply arbitrary regular expressions to the identifier names. The pattern part is a regular expression in Perl syntax (as supported by the Perl Compatible Regular Expressions (PCRE)) library and the subst string can contain back-references of the form \N where N is a digit from 0 to 9, or one of the following escape sequences: \l, \L, \u, \U or \E. The back-references are replaced with the contents of the corresponding capture group while the escape sequences perform the case conversion in the substitution string: \l and \L convert to the lower case, while \u and \U convert to the upper case. The difference between the elements of each pair is that \l and \u change the case of the next character only, while \L and \U do it for all the remaining characters or until \E is encountered. Finally please notice that backslashes need to be escaped in C strings, so in practice "\\" must be used in all these escape sequences. For example, to remove any alphabetic prefix before an underscore and capitalize the remaining part you could use the following directive: %rename("regex:/(\\w+)_(.*)/\\u\\2/") prefix_printPrint
    command:cmd Output of an external command cmd with the string passed to it as input. Notice that this function is extremely slow compared to all the other ones as it involves spawning a separate process and using it for many declarations is not recommended. The cmd is not enclosed in square brackets but must be terminated with a triple '<' sign, e.g. %rename("command:tr -d aeiou <<<") (nonsensical example removing all vowels) PrintPrnt

    The most general function of all of the above ones (not counting command which is even more powerful in principle but which should generally be avoided because of performance considerations) is the regex one. Here are some more examples of its use:

    // Strip the wx prefix from all identifiers except those starting with wxEVT
    %rename("%(regex:/wx(?!EVT)(.*)/\\1/)s") ""; // wxSomeWidget -> SomeWidget
                                                 // wxEVT_PAINT -> wxEVT_PAINT
    
    // Apply a rule for renaming the enum elements to avoid the common prefixes
    // which are redundant in C#/Java
    %rename("%(regex:/^([A-Z][a-z]+)+_(.*)/\\2/)s", %$isenumitem) ""; // Colour_Red -> Red
    
    // Remove all "Set/Get" prefixes.
    %rename("%(regex:/^(Set|Get)(.*)/\\2/)s") ""; // SetValue -> Value
                                                  // GetValue -> Value
    

    As before, everything that was said above about %rename also applies to %ignore. In fact, the latter is just a special case of the former and ignoring an identifier is the same as renaming it to the special "$ignore" value. So the following snippets

    %ignore print;
    

    and

    %rename("$ignore") print;
    

    are exactly equivalent and %rename can be used to selectively ignore multiple declarations using the previously described matching possibilities.

    5.4.7.3 Limiting global renaming rules

    As explained in the previous sections, it is possible to either rename individual declarations or apply a rename rule to all of them at once. In practice, the latter is however rarely appropriate as there are always some exceptions to the general rules. To deal with them, the scope of an unnamed %rename can be limited using subsequent match parameters. They can be applied to any of the attributes associated by SWIG with the declarations appearing in its input. For example:

    %rename("foo", match$name="bar") "";
    

    can be used to achieve the same effect as the simpler

    %rename("foo") bar;
    

    and so is not very interesting on its own. However match can also be applied to the declaration type, for example match="class" restricts the match to class declarations only (in C++) and match="enumitem" restricts it to the enum elements. SWIG also provides convenience macros for such match expressions, for example

    %rename("%(title)s", %$isenumitem) "";
    

    will capitalize the names of all the enum elements but not change the case of the other declarations. Similarly, %$isclass, %$isfunction, %$isconstructor, %$isunion, %$istemplate, and %$isvariable can be used. Many other checks are possible and this documentation is not exhaustive, see the "%rename predicates" section in swig.swg for the full list of supported match expressions.

    In addition to literally matching some string with match you can also use regexmatch or notregexmatch to match a string against a regular expression. For example, to ignore all functions having "Old" as a suffix you could use

    %rename("$ignore", regexmatch$name="Old$") "";
    

    For simple cases like this, specifying the regular expression for the declaration name directly can be preferable and can also be done using regextarget:

    %rename("$ignore", regextarget=1) "Old$";
    

    Notice that the check is done only against the name of the declaration itself, if you need to match the full name of a C++ declaration you must use fullname attribute:

    %rename("$ignore", regextarget=1, fullname=1) "NameSpace::ClassName::.*Old$";
    

    As for notregexmatch, it restricts the match only to the strings not matching the specified regular expression. So to rename all declarations to lower case except those consisting of capital letters only:

    %rename("$(lower)s", notregexmatch$name="^[A-Z]+$") "";
    

    Finally, variants of %rename and %ignore directives can be used to help wrap C++ overloaded functions and methods or C++ methods which use default arguments. This is described in the Renaming and ambiguity resolution section in the C++ chapter.

    5.4.7.4 Ignoring everything then wrapping a few selected symbols

    Using the techniques described above it is possible to ignore everything in a header and then selectively wrap a few chosen methods or classes. For example, consider a header, myheader.h which has many classes in it and just the one class called Star is wanted within this header, the following approach could be taken:

    %ignore ""; // Ignore everything
    
    // Unignore chosen class 'Star'
    %rename("%s") Star;
    
    // As the ignore everything will include the constructor, destructor, methods etc
    // in the class, these have to be explicitly unignored too:
    %rename("%s") Star::Star;
    %rename("%s") Star::~Star;
    %rename("%s") Star::shine; // named method
    
    %include "myheader.h"
    

    Another approach which might be more suitable as it does not require naming all the methods in the chosen class is to begin by ignoring just the classes. This does not add an explicit ignore to any members of the class, so when the chosen class is unignored, all of its methods will be wrapped.

    %rename($ignore, %$isclass) ""; // Only ignore all classes
    %rename("%s") Star; // Unignore 'Star'
    %include "myheader.h"
    

    5.4.8 Default/optional arguments

    SWIG supports default arguments in both C and C++ code. For example:

    int plot(double x, double y, int color=WHITE);
    

    In this case, SWIG generates wrapper code where the default arguments are optional in the target language. For example, this function could be used in Tcl as follows :

    % plot -3.4 7.5    # Use default value
    % plot -3.4 7.5 10 # set color to 10 instead
    
    

    Although the ISO C standard does not allow default arguments, default arguments specified in a SWIG interface work with both C and C++.

    Note: There is a subtle semantic issue concerning the use of default arguments and the SWIG generated wrapper code. When default arguments are used in C code, the default values are emitted into the wrappers and the function is invoked with a full set of arguments. This is different to when wrapping C++ where an overloaded wrapper method is generated for each defaulted argument. Please refer to the section on default arguments in the C++ chapter for further details.

    5.4.9 Pointers to functions and callbacks

    Occasionally, a C library may include functions that expect to receive pointers to functions--possibly to serve as callbacks. SWIG provides full support for function pointers when the callback functions are defined in C and not in the target language. For example, consider a function like this:

    int binary_op(int a, int b, int (*op)(int, int));
    

    When you first wrap something like this into an extension module, you may find the function to be impossible to use. For instance, in Python:

    >>> def add(x, y):
    ...     return x+y
    ...
    >>> binary_op(3, 4, add)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_f_int_int__int
    >>>
    

    The reason for this error is that SWIG doesn't know how to map a scripting language function into a C callback. However, existing C functions can be used as arguments provided you install them as constants. One way to do this is to use the %constant directive like this:

    /* Function with a callback */
    int binary_op(int a, int b, int (*op)(int, int));
    
    /* Some callback functions */
    %constant int add(int, int);
    %constant int sub(int, int);
    %constant int mul(int, int);
    

    In this case, add, sub, and mul become function pointer constants in the target scripting language. This allows you to use them as follows:

    >>> binary_op(3, 4, add)
    7
    >>> binary_op(3, 4, mul)
    12
    >>>
    

    Unfortunately, by declaring the callback functions as constants, they are no longer accessible as functions. For example:

    >>> add(3, 4)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: object is not callable: '_ff020efc_p_f_int_int__int'
    >>>
    

    If you want to make a function available as both a callback function and a function, you can use the %callback and %nocallback directives like this:

    /* Function with a callback */
    int binary_op(int a, int b, int (*op)(int, int));
    
    /* Some callback functions */
    %callback("%s_cb");
    int add(int, int);
    int sub(int, int);
    int mul(int, int);
    %nocallback;
    

    The argument to %callback is a printf-style format string that specifies the naming convention for the callback constants (%s gets replaced by the function name). The callback mode remains in effect until it is explicitly disabled using %nocallback. When you do this, the interface now works as follows:

    >>> binary_op(3, 4, add_cb)
    7
    >>> binary_op(3, 4, mul_cb)
    12
    >>> add(3, 4)
    7
    >>> mul(3, 4)
    12
    

    Notice that when the function is used as a callback, special names such as add_cb are used instead. To call the function normally, just use the original function name such as add().

    SWIG provides a number of extensions to standard C printf formatting that may be useful in this context. For instance, the following variation installs the callbacks as all upper case constants such as ADD, SUB, and MUL:

    /* Some callback functions */
    %callback("%(uppercase)s");
    int add(int, int);
    int sub(int, int);
    int mul(int, int);
    %nocallback;
    

    A format string of "%(lowercase)s" converts all characters to lower case. A string of "%(title)s" capitalizes the first character and converts the rest to lower case.

    And now, a final note about function pointer support. Although SWIG does not normally allow callback functions to be written in the target language, this can be accomplished with the use of typemaps and other advanced SWIG features. See the Typemaps chapter for more about typemaps and individual target language chapters for more on callbacks. The 'director' feature can be used to make callbacks from C/C++ into the target language, see Callbacks to the target language.

    5.5 Structures and unions

    This section describes the behavior of SWIG when processing ISO C structures and union declarations. Extensions to handle C++ are described in the next section.

    If SWIG encounters the definition of a structure or union, it creates a set of accessor functions. Although SWIG does not need structure definitions to build an interface, providing definitions makes it possible to access structure members. The accessor functions generated by SWIG simply take a pointer to an object and allow access to an individual member. For example, the declaration :

    struct Vector {
      double x, y, z;
    }
    
    

    gets transformed into the following set of accessor functions :

    double Vector_x_get(struct Vector *obj) {
      return obj->x;
    }
    double Vector_y_get(struct Vector *obj) { 
      return obj->y;
    }
    double Vector_z_get(struct Vector *obj) { 
      return obj->z;
    }
    void Vector_x_set(struct Vector *obj, double value) {
      obj->x = value;
    }
    void Vector_y_set(struct Vector *obj, double value) {
      obj->y = value;
    }
    void Vector_z_set(struct Vector *obj, double value) {
      obj->z = value;
    }
    

    In addition, SWIG creates default constructor and destructor functions if none are defined in the interface. For example:

    struct Vector *new_Vector() {
      return (Vector *) calloc(1, sizeof(struct Vector));
    }
    void delete_Vector(struct Vector *obj) {
      free(obj);
    }
    

    Using these low-level accessor functions, an object can be minimally manipulated from the target language using code like this:

    v = new_Vector()
    Vector_x_set(v, 2)
    Vector_y_set(v, 10)
    Vector_z_set(v, -5)
    ...
    delete_Vector(v)
    

    However, most of SWIG's language modules also provide a high-level interface that is more convenient. Keep reading.

    5.5.1 Typedef and structures

    SWIG supports the following construct which is quite common in C programs :

    typedef struct {
      double x, y, z;
    } Vector;
    
    

    When encountered, SWIG assumes that the name of the object is `Vector' and creates accessor functions like before. The only difference is that the use of typedef allows SWIG to drop the struct keyword on its generated code. For example:

    double Vector_x_get(Vector *obj) {
      return obj->x;
    }
    

    If two different names are used like this :

    typedef struct vector_struct {
      double x, y, z;
    } Vector;
    
    

    the name Vector is used instead of vector_struct since this is more typical C programming style. If declarations defined later in the interface use the type struct vector_struct, SWIG knows that this is the same as Vector and it generates the appropriate type-checking code.

    5.5.2 Character strings and structures

    Structures involving character strings require some care. SWIG assumes that all members of type char * have been dynamically allocated using malloc() and that they are NULL-terminated ASCII strings. When such a member is modified, the previous contents will be released, and the new contents allocated. For example :

    %module mymodule
    ...
    struct Foo {
      char *name;
      ...
    }
    
    

    This results in the following accessor functions :

    char *Foo_name_get(Foo *obj) {
      return Foo->name;
    }
    
    char *Foo_name_set(Foo *obj, char *c) {
      if (obj->name)
        free(obj->name);
      obj->name = (char *) malloc(strlen(c)+1);
      strcpy(obj->name, c);
      return obj->name;
    }
    

    If this behavior differs from what you need in your applications, the SWIG "memberin" typemap can be used to change it. See the typemaps chapter for further details.

    Note: If the -c++ option is used, new and delete are used to perform memory allocation.

    5.5.3 Array members

    Arrays may appear as the members of structures, but they will be read-only. SWIG will write an accessor function that returns the pointer to the first element of the array, but will not write a function to change the contents of the array itself. When this situation is detected, SWIG may generate a warning message such as the following :

    interface.i:116. Warning. Array member will be read-only
    

    To eliminate the warning message, typemaps can be used, but this is discussed in a later chapter. In many cases, the warning message is harmless.

    5.5.4 Structure data members

    Occasionally, a structure will contain data members that are themselves structures. For example:

    typedef struct Foo {
      int x;
    } Foo;
    
    typedef struct Bar {
      int y;
      Foo f;           /* struct member */
    } Bar;
    

    When a structure member is wrapped, it is handled as a pointer, unless the %naturalvar directive is used where it is handled more like a C++ reference (see C++ Member data). The accessors to the member variable as a pointer are effectively wrapped as follows:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    void Bar_f_set(Bar *b, Foo *value) {
      b->f = *value;
    }
    

    The reasons for this are somewhat subtle but have to do with the problem of modifying and accessing data inside the data member. For example, suppose you wanted to modify the value of f.x of a Bar object like this:

    Bar *b;
    b->f.x = 37;
    

    Translating this assignment to function calls (as would be used inside the scripting language interface) results in the following code:

    Bar *b;
    Foo_x_set(Bar_f_get(b), 37);
    

    In this code, if the Bar_f_get() function were to return a Foo instead of a Foo *, then the resulting modification would be applied to a copy of f and not the data member f itself. Clearly that's not what you want!

    It should be noted that this transformation to pointers only occurs if SWIG knows that a data member is a structure or class. For instance, if you had a structure like this,

    struct Foo {
      WORD   w;
    };
    

    and nothing was known about WORD, then SWIG will generate more normal accessor functions like this:

    WORD Foo_w_get(Foo *f) {
      return f->w;
    }
    void Foo_w_set(FOO *f, WORD value) {
      f->w = value;
    }
    

    Compatibility Note: SWIG-1.3.11 and earlier releases transformed all non-primitive member datatypes to pointers. Starting in SWIG-1.3.12, this transformation only occurs if a datatype is known to be a structure, class, or union. This is unlikely to break existing code. However, if you need to tell SWIG that an undeclared datatype is really a struct, simply use a forward struct declaration such as "struct Foo;".

    5.5.5 C constructors and destructors

    When wrapping structures, it is generally useful to have a mechanism for creating and destroying objects. If you don't do anything, SWIG will automatically generate functions for creating and destroying objects using malloc() and free(). Note: the use of malloc() only applies when SWIG is used on C code (i.e., when the -c++ option is not supplied on the command line). C++ is handled differently.

    If you don't want SWIG to generate default constructors for your interfaces, you can use the %nodefaultctor directive or the -nodefaultctor command line option. For example:

    swig -nodefaultctor example.i 
    

    or

    %module foo
    ...
    %nodefaultctor;        // Don't create default constructors
    ... declarations ...
    %clearnodefaultctor;   // Re-enable default constructors
    

    If you need more precise control, %nodefaultctor can selectively target individual structure definitions. For example:

    %nodefaultctor Foo;      // No default constructor for Foo
    ...
    struct Foo {             // No default constructor generated.
    };
    
    struct Bar {             // Default constructor generated.
    };
    

    Since ignoring the implicit or default destructors most of the time produces memory leaks, SWIG will always try to generate them. If needed, however, you can selectively disable the generation of the default/implicit destructor by using %nodefaultdtor

    %nodefaultdtor Foo; // No default/implicit destructor for Foo
    ...
    struct Foo {              // No default destructor is generated.
    };
    
    struct Bar {              // Default destructor generated.
    };
    

    Compatibility note: Prior to SWIG-1.3.7, SWIG did not generate default constructors or destructors unless you explicitly turned them on using -make_default. However, it appears that most users want to have constructor and destructor functions so it has now been enabled as the default behavior.

    Note: There are also the -nodefault option and %nodefault directive, which disable both the default or implicit destructor generation. This could lead to memory leaks across the target languages, and it is highly recommended you don't use them.

    5.5.6 Adding member functions to C structures

    Most languages provide a mechanism for creating classes and supporting object oriented programming. From a C standpoint, object oriented programming really just boils down to the process of attaching functions to structures. These functions normally operate on an instance of the structure (or object). Although there is a natural mapping of C++ to such a scheme, there is no direct mechanism for utilizing it with C code. However, SWIG provides a special %extend directive that makes it possible to attach methods to C structures for purposes of building an object oriented interface. Suppose you have a C header file with the following declaration :

    /* file : vector.h */
    ...
    typedef struct Vector {
      double x, y, z;
    } Vector;
    
    

    You can make a Vector look a lot like a class by writing a SWIG interface like this:

    // file : vector.i
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    %include "vector.h"          // Just grab original C header file
    %extend Vector {             // Attach these functions to struct Vector
      Vector(double x, double y, double z) {
        Vector *v;
        v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
      ~Vector() {
        free($self);
      }
      double magnitude() {
        return sqrt($self->x*$self->x+$self->y*$self->y+$self->z*$self->z);
      }
      void print() {
        printf("Vector [%g, %g, %g]\n", $self->x, $self->y, $self->z);
      }
    };
    
    

    Note the usage of the $self special variable. Its usage is identical to a C++ 'this' pointer and should be used whenever access to the struct instance is required. Also note that C++ constructor and destructor syntax has been used to simulate a constructor and destructor, even for C code. There is one subtle difference to a normal C++ constructor implementation though and that is although the constructor declaration is as per a normal C++ constructor, the newly constructed object must be returned as if the constructor declaration had a return value, a Vector * in this case.

    Now, when used with proxy classes in Python, you can do things like this :

    >>> v = Vector(3, 4, 0)                 # Create a new vector
    >>> print v.magnitude()                # Print magnitude
    5.0
    >>> v.print()                  # Print it out
    [ 3, 4, 0 ]
    >>> del v                      # Destroy it
    

    The %extend directive can also be used inside the definition of the Vector structure. For example:

    // file : vector.i
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    typedef struct Vector {
      double x, y, z;
      %extend {
        Vector(double x, double y, double z) { ... }
        ~Vector() { ... }
        ...
      }
    } Vector;
    

    Note that %extend can be used to access externally written functions provided they follow the naming convention used in this example :

    /* File : vector.c */
    /* Vector methods */
    #include "vector.h"
    Vector *new_Vector(double x, double y, double z) {
      Vector *v;
      v = (Vector *) malloc(sizeof(Vector));
      v->x = x;
      v->y = y;
      v->z = z;
      return v;
    }
    void delete_Vector(Vector *v) {
      free(v);
    }
    
    double Vector_magnitude(Vector *v) {
      return sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
    }
    
    // File : vector.i
    // Interface file
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    typedef struct Vector {
      double x, y, z;
      %extend {
        Vector(int, int, int); // This calls new_Vector()
        ~Vector();           // This calls delete_Vector()
        double magnitude();  // This will call Vector_magnitude()
        ...
      }
    } Vector;
    

    The name used for %extend should be the name of the struct and not the name of any typedef to the struct. For example:

    typedef struct Integer {
      int value;
    } Int;
    %extend Integer { ...  } /* Correct name */
    %extend Int { ...  } /* Incorrect name */
    
    struct Float {
      float value;
    };
    typedef struct Float FloatValue;
    %extend Float { ...  } /* Correct name */
    %extend FloatValue { ...  } /* Incorrect name */
    

    There is one exception to this rule and that is when the struct is anonymously named such as:

    typedef struct {
      double value;
    } Double;
    %extend Double { ...  } /* Okay */
    

    A little known feature of the %extend directive is that it can also be used to add synthesized attributes or to modify the behavior of existing data attributes. For example, suppose you wanted to make magnitude a read-only attribute of Vector instead of a method. To do this, you might write some code like this:

    // Add a new attribute to Vector
    %extend Vector {
      const double magnitude;
    }
    // Now supply the implementation of the Vector_magnitude_get function
    %{
    const double Vector_magnitude_get(Vector *v) {
      return (const double) sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
    }
    %}
    
    

    Now, for all practical purposes, magnitude will appear like an attribute of the object.

    A similar technique can also be used to work with data members that you want to process. For example, consider this interface:

    typedef struct Person {
      char name[50];
      ...
    } Person;
    

    Say you wanted to ensure name was always upper case, you can rewrite the interface as follows to ensure this occurs whenever a name is read or written to:

    typedef struct Person {
      %extend {
        char name[50];
      }
      ...
    } Person;
    
    %{
    #include <string.h>
    #include <ctype.h>
    
    void make_upper(char *name) {
      char *c;
      for (c = name; *c; ++c)
        *c = (char)toupper((int)*c);
    }
    
    /* Specific implementation of set/get functions forcing capitalization */
    
    char *Person_name_get(Person *p) {
      make_upper(p->name);
      return p->name;
    }
    
    void Person_name_set(Person *p, char *val) {
      strncpy(p->name, val, 50);
      make_upper(p->name);
    }
    %}
    

    Finally, it should be stressed that even though %extend can be used to add new data members, these new members can not require the allocation of additional storage in the object (e.g., their values must be entirely synthesized from existing attributes of the structure or obtained elsewhere).

    Compatibility note: The %extend directive is a new name for the %addmethods directive. Since %addmethods could be used to extend a structure with more than just methods, a more suitable directive name has been chosen.

    5.5.7 Nested structures

    Occasionally, a C program will involve structures like this :

    typedef struct Object {
      int objtype;
      union {
        int ivalue;
        double dvalue;
        char *strvalue;
        void *ptrvalue;
      } intRep;
    } Object;
    
    

    When SWIG encounters this, it performs a structure splitting operation that transforms the declaration into the equivalent of the following:

    typedef union {
      int ivalue;
      double dvalue;
      char *strvalue;
      void *ptrvalue;
    } Object_intRep;
    
    typedef struct Object {
      int objType;
      Object_intRep intRep;
    } Object;
    
    

    SWIG will then create an Object_intRep structure for use inside the interface file. Accessor functions will be created for both structures. In this case, functions like this would be created :

    Object_intRep *Object_intRep_get(Object *o) {
      return (Object_intRep *) &o->intRep;
    }
    int Object_intRep_ivalue_get(Object_intRep *o) {
      return o->ivalue;
    }
    int Object_intRep_ivalue_set(Object_intRep *o, int value) {
      return (o->ivalue = value);
    }
    double Object_intRep_dvalue_get(Object_intRep *o) {
      return o->dvalue;
    }
    ... etc ...
    
    

    Although this process is a little hairy, it works like you would expect in the target scripting language--especially when proxy classes are used. For instance, in Perl:

    # Perl5 script for accessing nested member
    $o = CreateObject();                    # Create an object somehow
    $o->{intRep}->{ivalue} = 7              # Change value of o.intRep.ivalue
    

    If you have a lot of nested structure declarations, it is advisable to double-check them after running SWIG. Although, there is a good chance that they will work, you may have to modify the interface file in certain cases.

    Finally, note that nesting is handled differently in C++ mode, see Nested classes.

    5.5.8 Other things to note about structure wrapping

    SWIG doesn't care if the declaration of a structure in a .i file exactly matches that used in the underlying C code (except in the case of nested structures). For this reason, there are no problems omitting problematic members or simply omitting the structure definition altogether. If you are happy passing pointers around, this can be done without ever giving SWIG a structure definition.

    Starting with SWIG1.3, a number of improvements have been made to SWIG's code generator. Specifically, even though structure access has been described in terms of high-level accessor functions such as this,

    double Vector_x_get(Vector *v) {
      return v->x;
    }
    

    most of the generated code is actually inlined directly into wrapper functions. Therefore, no function Vector_x_get() actually exists in the generated wrapper file. For example, when creating a Tcl module, the following function is generated instead:

    static int
    _wrap_Vector_x_get(ClientData clientData, Tcl_Interp *interp, 
                       int objc, Tcl_Obj *CONST objv[]) {
      struct Vector *arg1 ;
      double result ;
    
      if (SWIG_GetArgs(interp, objc, objv, "p:Vector_x_get self ", &arg0,
                       SWIGTYPE_p_Vector) == TCL_ERROR)
        return TCL_ERROR;
      result = (double ) (arg1->x);
      Tcl_SetObjResult(interp, Tcl_NewDoubleObj((double) result));
      return TCL_OK;
    }
    

    The only exception to this rule are methods defined with %extend. In this case, the added code is contained in a separate function.

    Finally, it is important to note that most language modules may choose to build a more advanced interface. Although you may never use the low-level interface described here, most of SWIG's language modules use it in some way or another.

    5.6 Code Insertion

    Sometimes it is necessary to insert special code into the resulting wrapper file generated by SWIG. For example, you may want to include additional C code to perform initialization or other operations. There are four common ways to insert code, but it's useful to know how the output of SWIG is structured first.

    5.6.1 The output of SWIG

    When SWIG creates its output C/C++ file, it is broken up into five sections corresponding to runtime code, headers, wrapper functions, and module initialization code (in that order).

    • Begin section.
      A placeholder for users to put code at the beginning of the C/C++ wrapper file. This is most often used to define preprocessor macros that are used in later sections.
    • Runtime code.
      This code is internal to SWIG and is used to include type-checking and other support functions that are used by the rest of the module.
    • Header section.
      This is user-defined support code that has been included by the %{ ... %} directive. Usually this consists of header files and other helper functions.
    • Wrapper code.
      These are the wrappers generated automatically by SWIG.
    • Module initialization.
      The function generated by SWIG to initialize the module upon loading.

    5.6.2 Code insertion blocks

    The %insert directive enables inserting blocks of code into a given section of the generated code. It can be used in one of two ways:

    %insert("section") "filename"
    %insert("section") %{ ... %}
    

    The first will dump the contents of the file in the given filename into the named section. The second inserts the code between the braces into the named section. For example, the following adds code into the runtime section:

    %insert("runtime") %{
      ... code in runtime section ...
    %}
    

    There are the 5 sections, however, some target languages add in additional sections and some of these result in code being generated into a target language file instead of the C/C++ wrapper file. These are documented when available in the target language chapters. Macros named after the code sections are available as additional directives and these macro directives are normally used instead of %insert. For example, %runtime is used instead of %insert("runtime"). The valid sections and order of the sections in the generated C/C++ wrapper file is as shown:

    %begin %{
      ... code in begin section ...
    %}
    
    %runtime %{
      ... code in runtime section ...
    %}
    
    %header %{
      ... code in header section ...
    %}
    
    %wrapper %{
      ... code in wrapper section ...
    %}
    
    %init %{
      ... code in init section ...
    %}
    

    The bare %{ ... %} directive is a shortcut that is the same as %header %{ ... %}.

    The %begin section is effectively empty as it just contains the SWIG banner by default. This section is provided as a way for users to insert code at the top of the wrapper file before any other code is generated. Everything in a code insertion block is copied verbatim into the output file and is not parsed by SWIG. Most SWIG input files have at least one such block to include header files and support C code. Additional code blocks may be placed anywhere in a SWIG file as needed.

    %module mymodule
    %{
    #include "my_header.h"
    %}
    ... Declare functions here
    %{
    
    void some_extra_function() {
      ...
    }
    %}
    

    A common use for code blocks is to write "helper" functions. These are functions that are used specifically for the purpose of building an interface, but which are generally not visible to the normal C program. For example :

    %{
    /* Create a new vector */
    static Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    
    %}
    // Now wrap it 
    Vector *new_Vector();
    

    5.6.3 Inlined code blocks

    Since the process of writing helper functions is fairly common, there is a special inlined form of code block that is used as follows :

    %inline %{
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    %}
    

    This is the same as writing:

    %{
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    %}
    
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    

    In other words, the %inline directive inserts all of the code that follows verbatim into the header portion of an interface file. The code is then parsed by both the SWIG preprocessor and parser. Thus, the above example creates a new command new_Vector using only one declaration. Since the code inside an %inline %{ ... %} block is given to both the C compiler and SWIG, it is illegal to include any SWIG directives inside a %{ ... %} block.

    Note: The usual SWIG C preprocessor rules apply to code in %apply blocks when SWIG parses this code. For example, as mentioned earlier, SWIG's C Preprocessor does not follow #include directives by default.

    5.6.4 Initialization blocks

    When code is included in the %init section, it is copied directly into the module initialization function. For example, if you needed to perform some extra initialization on module loading, you could write this:

    %init %{
      init_variables();
    %}
    

    Please note that some language backends (e.g. C# or Java) don't have any initialization function, hence you should define a global object performing the necessary initialization for them instead:

    %init %{
      static struct MyInit { MyInit() { init_variables(); } } myInit;
    %}
    

    5.7 An Interface Building Strategy

    This section describes the general approach for building interfaces with SWIG. The specifics related to a particular scripting language are found in later chapters.

    5.7.1 Preparing a C program for SWIG

    SWIG doesn't require modifications to your C code, but if you feed it a collection of raw C header files or source code, the results might not be what you expect---in fact, they might be awful. Here's a series of steps you can follow to make an interface for a C program :

    • Identify the functions that you want to wrap. It's probably not necessary to access every single function of a C program--thus, a little forethought can dramatically simplify the resulting scripting language interface. C header files are a particularly good source for finding things to wrap.
    • Create a new interface file to describe the scripting language interface to your program.
    • Copy the appropriate declarations into the interface file or use SWIG's %include directive to process an entire C source/header file.
    • Make sure everything in the interface file uses ISO C/C++ syntax.
    • Make sure all necessary `typedef' declarations and type-information is available in the interface file. In particular, ensure that the type information is specified in the correct order as required by a C/C++ compiler. Most importantly, define a type before it is used! A C compiler will tell you if the full type information is not available if it is needed, whereas SWIG will usually not warn or error out as it is designed to work without full type information. However, if type information is not specified correctly, the wrappers can be sub-optimal and even result in uncompilable C/C++ code.
    • If your program has a main() function, you may need to rename it (read on).
    • Run SWIG and compile.

    Although this may sound complicated, the process turns out to be fairly easy once you get the hang of it.

    In the process of building an interface, SWIG may encounter syntax errors or other problems. The best way to deal with this is to simply copy the offending code into a separate interface file and edit it. However, the SWIG developers have worked very hard to improve the SWIG parser--you should report parsing errors to the swig-devel mailing list or to the SWIG bug tracker.

    5.7.2 The SWIG interface file

    The preferred method of using SWIG is to generate a separate interface file. Suppose you have the following C header file :

    /* File : header.h */
    
    #include <stdio.h>
    #include <math.h>
    
    extern int foo(double);
    extern double bar(int, int);
    extern void dump(FILE *f);
    
    

    A typical SWIG interface file for this header file would look like the following :

    /* File : interface.i */
    %module mymodule
    %{
    #include "header.h"
    %}
    extern int foo(double);
    extern double bar(int, int);
    extern void dump(FILE *f);
    
    

    Of course, in this case, our header file is pretty simple so we could use a simpler approach and use an interface file like this:

    /* File : interface.i */
    %module mymodule
    %{
    #include "header.h"
    %}
    %include "header.h"
    

    The main advantage of this approach is minimal maintenance of an interface file for when the header file changes in the future. In more complex projects, an interface file containing numerous %include and #include statements like this is one of the most common approaches to interface file design due to lower maintenance overhead.

    5.7.3 Why use separate interface files?

    Although SWIG can parse many header files, it is more common to write a special .i file defining the interface to a package. There are several reasons why you might want to do this:

    • It is rarely necessary to access every single function in a large package. Many C functions might have little or no use in a scripted environment. Therefore, why wrap them?
    • Separate interface files provide an opportunity to provide more precise rules about how an interface is to be constructed.
    • Interface files can provide more structure and organization.
    • SWIG can't parse certain definitions that appear in header files. Having a separate file allows you to eliminate or work around these problems.
    • Interface files provide a more precise definition of what the interface is. Users wanting to extend the system can go to the interface file and immediately see what is available without having to dig it out of header files.

    5.7.4 Getting the right header files

    Sometimes, it is necessary to use certain header files in order for the code generated by SWIG to compile properly. Make sure you include certain header files by using a %{ %} block like this:

    %module graphics
    %{
    #include <GL/gl.h>
    #include <GL/glu.h>
    %}
    
    // Put the rest of the declarations here
    ...
    

    5.7.5 What to do with main()

    If your program defines a main() function, you may need to get rid of it or rename it in order to use a scripting language. Most scripting languages define their own main() procedure that is called instead. main() also makes no sense when working with dynamic loading. There are a few approaches to solving the main() conflict :

    • Get rid of main() entirely.
    • Rename main() to something else. You can do this by compiling your C program with an option like -Dmain=oldmain.
    • Use conditional compilation to only include main() when not using a scripting language.

    Getting rid of main() may cause potential initialization problems of a program. To handle this problem, you may consider writing a special function called program_init() that initializes your program upon startup. This function could then be called either from the scripting language as the first operation, or when the SWIG generated module is loaded.

    As a general note, many C programs only use the main() function to parse command line options and to set parameters. However, by using a scripting language, you are probably trying to create a program that is more interactive. In many cases, the old main() program can be completely replaced by a Perl, Python, or Tcl script.

    Note: In some cases, you might be inclined to create a scripting language wrapper for main(). If you do this, the compilation will probably work and your module might even load correctly. The only trouble is that when you call your main() wrapper, you will find that it actually invokes the main() of the scripting language interpreter itself! This behavior is a side effect of the symbol binding mechanism used in the dynamic linker. The bottom line: don't do this.

    swig-4.0.2/Doc/Manual/SWIGDocumentation.pdf0000644000175000017500002214657113667507602020322 0ustar williamwilliam%PDF-1.4 1 0 obj << /Title (þÿSWIG-4.0 Documentation) /Creator (þÿwkhtmltopdf 0.12.5) /Producer (þÿQt 4.8.7) /CreationDate (D:20200608202029+01'00') >> endobj 3 0 obj << /Type /ExtGState /SA true /SM 0.02 /ca 1.0 /CA 1.0 /AIS false /SMask /None>> endobj 4 0 obj [/Pattern /DeviceRGB] endobj 6 0 obj << /Type /XObject /Subtype /Image /Width 167 /Height 85 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 7 0 R /Filter /FlateDecode >> stream xœí?hWׯË)Ö00… ¸pcH#ìÊMЍPT7®Ò5†HÔ ÁàJÀ*W5UÁ0¤ ¸ PBã"ìûûæùöpæœ;£u,íÈÖžbÍÎܹ÷>ç<çϽ³šN—²”¥,e)‹–;wî|ùå—_}õÕØ}YÊyÉñññƒnß¾}óæÍ3¹víÚõë×ÇîÚRÎRö÷÷ïß¿ÐÂ÷‹/¾Ð§èswwwìž.å£D¼nf¢cûäÛµµµ±{½”–íííG}óÍ7P7t}­•«W¯z¬N†c]†g{K9]^¿~ ÊE_o%uº®óI®÷±´”²¼|ù ¡î[·n hc@Ÿ}èëöW¯^=¾¥ü¿¼}ûöÙ³gwïÞÊÞ–Žög¶tA<™L8à³hòÆØc½ÔrxxHnEúl¼-=?o×­p½€6Äñ¿keeeìq_:yþü9¶¦[(ãgû ökÇSn>ð×É=—BÈ­îÝ»§x±ÉZ>ºÏxýÁ•+WŠˆÏë^{âÞÞÞØSòy ýí·ß®®®Z6ÀÕv`æ¬Ø«Apܼ½?éU%X=‰ÀØÓóùQ7@r hfêžÇGÏÃÒWUe¦õǺÌ.ÎAݲû‘²½½­R‰•łΡWÑ–3‡Yºø©¡LŠ*ái„kÆž¶OOlÝʨ»/{ @gî |n‰ZÈ S;ðŸÃZ!mmm=‹Ÿ€DcѺˆrŸ-x¸Ì02…lÕJ w#ü ý•VÔ‚®4í²ž,—Y‹òîÝ;Ì!T¹ûPî×su°>á¾õ ÷·x>÷-ø6íÛà÷ÕÉ¥[7yûö­–3Ì¢3Й«Í]fêgLf†á+™¶§qÃKº—ûP»ø-hN¸¬žùþùgìùMNNN¬ÐíëŸÅ"vp—è@Ô‹`¶vÞSwø4ãåAèáÆÆqão¿ývttDJøÃ?ÀÒÊã²[ fjc<¿¹¹9öÜ/T~ÿýw|ôýû÷uûúg®p3ôáOÅÏEWëq Ÿ¦žÌÕ8Ý#|ñâEq,èCÀºïÏÚù KâÖŸ>} u¯¬¬øZ·£½iÖ)Ö äìƒÁú ÔÎíÛ·íJ±{·3BüÔ¡¡½A }™.óRóùfëР8Ð,Ú/S^m¥èµ³ý§¨t>" ¾¶¶¬¾Nî;X:ýÌöG=|øðÉ“'ýõ—„ö›¶(g~$8—¢±/s”÷ïß4“¬`,-‡÷¥]~Òø9 –½³·ßŒiŽÖ|;ºE…½mh?þø#.‰OøàÁƒ¯¿þ/OðÉWœ©»1üpæ.ÜQ•ñ€úXùù矵tåw(*kf;Ftl{‡2ÖuJ¥ÃìõYq>¼î –Š-vž>{3k¬'æîÕÕÕ{÷î¡ëëë>œøô<¯‘ÒΈ¨ýÙßßG½-ÄÁ¨ýö°,Û(½qyP°GÐwÞÛ²7doøùÓ²nKg˜³»Ý ŠM@â ¸µ"Ï$ðgà–"ô«Ç~n I¯ü®3jƒÕ"poà>&Û€iTݨ,ã•A ül¬BoÑY£ƒ1F‹Ø·¶¶°qÎ4©ÖÇpì|ÕõÝ![7Ðý½$€£BZ–ããc€Ví¶ B0¸i³ë`àö§EkMªŽfú5ë.ZtQÔàãÇ_¿~1òÜ¢™I@6ˆQË_¿|ù3‡Þid⊱MÚYQôJ6.m°i\ªŽ|÷Ýwc#üBPjõOruûõnzxgBƺqÏÉöY=ÝCcÑ¿ÿþ‹÷ÔSú€öj¦§3^ÅçD,»»»ð[ˆÄ4'èþ´NÑÏÝÔÛ0ÀÚEïͨ»§¹Z¨–iû%iíáΰÿôƒõyw“ªjU7eö¬;€uøVN™ Kä€>g¸C²æOrûÉÉ ÷þòË/X:aªõŠ>“b|ø™hŸ9 fÞÉkf 4#‚ýTèÖûVÞ–=¸ñ©Ûɸá3èù@É¥*•F‹ÊЧ\ƒ14Ì|Ú¦T{”û‚@‰F-¢ÀÀgýÄ´ŽŽú&vss3ã>5WÂ}1ˬäV»Ö•LÔkï”û Ù3ùÀ•Þ3ÖN,CÆè™Ág^}Âé­€ÛÙÙÁ6‹Ôѧ3<èÙ³gÓvˆ(¡óÌÆpÙógb‡Kñ=e1‰Šê}´Áê?û{Ç&q»¿Ò{´IÚYjSáç'„CtàðAx¢.¦í|j¤ö™Œ¡êM›Ue>/>[ÊF‡×ÖÊß!Ib4Š+™U]LÌ-x÷# Æ.7´Ð‰-w.úhoÝEXÚŽÍû‡¯2«7]W¢37pm)¸ÛLö™ªœ2ÁOÛXÐi$]´wëªáâà®Ç5mz¾¾¾Nƒœn|Ç­‹QBˆSÞ|: Xf¥W¾`2wœQž¸e/»qX1ôëóx3gJÍB¶P÷@UÇM»¨(ӫħ:Ó™¦]NÕ¿ÿþû'OžàMàä;­@>4‹Kïïÿè^Õ¥÷`ï$Åç :Âp†áú? ¦|×Þ¢ ÓsâžáÃSúÓO?MÛ7 ™g&¹ô˺] ¯ ·›”w¼½3?ø™ <õFzu&Ó2Je: è™Ï‹Ì¦ å€A"¶$Àêñõš,Ý&¡î:‚ wøD`E¦KEG~(WÊþ{÷«gVC%ãÈ¥i²# 7¿àQ.ÞXÍb9[W…ÃñÝ4èMØFÄ(ÀZWr S¶âÐ<¥œ«ÞôYzÓeu‚1¯*M—±çióùóçꌰð1|Õ­g2Õr ºnç–Scx¾’êå´,‚[ŸtWßÂɺ-Æê¡0<1&™QS÷P ]‰rúË*W‡ïóìð¿RËs&< L»éÖÊ2ôÙ~­<µÞ $¬¢tq.†¨ÕUÕ»2û逮Št=÷2±M7–+ÆðRlŽèa¾¬O4:%nè ¶ î´`“¦5&\™¹@‡‹Lo‹«xÙØ°Ìúþý{{«+Cß”¼pæg»EDýæÍ›ð”ƒƒ(%k—4Äœ V-›Tš3iZþ´H 24ЫR ï73¨®(ƒ+¤]UÊÖHÞÂrÕß~ýõWz¢B_1 Î|ê¢8•ú=ŸÐU·¾äYq1ÙºV}ÁF0=¯Œ]áqŸ0Õy¹Y¨ –àÆ\Ü65@·Õm&Ü–?lÖb9|úôé´]!U06)¥êÅF4F¸]÷?ÿü“’,2'£è¿HåèÝ×á/f™•á÷9\oõÁî‚zä®â80[½’ããc±Jˆ÷üö3èQ;Žì‰š €XL,]ÞÙfquUnÛ§í†LÔÃÚpçUö$f×Aè¡ê½9xSS! $Ÿ©òÌess3Ó»÷æ“n”³v…Êik­k­(âÂ*‹L‡¯?~ìUÅ>½·…6¹X‹|ËyÓ¾¢YÜ„Nã¾.—éÝ[ºžk­½ÖÞÒû¬Þ šC—†×¾¸6NÜÚÇפc_‘Ðü̳ó#¦²íLÙ„3Ûî­]d ¬Læîî.ÀáÔ´ÏcwpôÜ^w£€³~±7iÁ7J–moø‚> +$ ð]n]‹ãÚÛVw³¼c·©¨ñ¼½[â¦NYƒÔ¥Ý5‹Yf•±dŸX½½qæ´Uò½½=½® GŽrðÀþq|k)*1<àj[N؃ !ˆL!_iÅ;w¯š[ÁƒäÖÍyè>Qƒ«ƒþ(§à…d2ÏÊÁ›‡¯¼W]èô?{`õ¢™[1ði»…‘bãÊÑlG(Q.5´c>B|6óº”ÂË!ž«¨†c¹´u¸vÙG3{1‡–®â,lKUØéÛ©Ý‹œfì1ˆcì¾¹`ÚtŇ¢h$£ì7EÕÓzeì¡x`ÙâŸþd¶_‰‡~ 5¯¥ÁØP}ôè‘ÿõ³àbügX®g»GÔönïŒcÜj…ûÕŽ`éfì€bÑ>à¢DÈÿý·çHÓ¿§mqLk9.N¸Ü:½¢Ái[„W<0§ÌCâ]‰×_p¶¹]@âvtt$ŸëÍ<¸ò*í7°|ؤÜ1UÌ_« fä³$4Æðöîw˜cÑô +†Ò‰ ¯µ¿§JS/^¼Põ{ÚsT~/Fqa¶%Ú< \³xàcÐìkaødvîÞ§/Æ­[¥´)Õgªn-Ñ›¼\@øÖ@Gµ /ÊjÑÅÖ¾Wô«ñ¹`M€DÜEÌ:«««0p,É¡ÈT!¯Þس‡µ²mÒT‘ÞÏCB¾æ»——–„ÍyƒnËmq}0óÊù÷•Væü9k,—+17kГ†Êéºô9å}wïÞåóøøx§•i«?¶æ’g8Û”¤nsL•OœopÃgŠ’£‹Êñ|16Æ.À­£üÞÒ±{Ü«v6mÅcÜØØ8<<~$usenß|®®$,eHÉ )ÌßšâX¥ûföÎ`6íPˆLæì#%gú6‡k 5¯å2ç'Vɉ•‡Ø&Ê®Ìö C³('Ðë]6h­M% #R•2¨ºJZi¨UÐ~u|: ûŸT%`è>F “Ü·ŒòP›ó‚Ðo&!¶ð•QܼyS³‰)!]€h…ô*¨bÆ=Ø)=§ÛWz×ÏËI%ÔzÆ«‚F°;}Jat¥ÒUí—àítâOº8ªêšR ô3zžkL ƒi׳•A1-¿S>²x±W±rE.s{ŽÌ)k,(°t©¯:¼üõÉɉ¶³6n³=H‚mEè4‹þuÓ²l9(eópvg"9_ȉ­€fhŒd fÑ×îM«lã9’ø9·8\¬e¢ÁZFƶ¯ø–'³e5•\¬cäæ\‰0Qð÷ÚïЦ~ôcN\úÔ`~õ¸2'³boÆŽfBwôÿ¢½¨¨­SÖ[}ÎÐsùKq¸¯éÙ¨µ»°ŒáŶ¸Ò@½Þn+w Øôs¾Øˆ¨ƒ¨žx^kµ§‚b¹á©WÎSŽ«ºŽ;Çc,T;]‹îhã¤HïÁOù)åLEKÕ>ÕÞ¨^uo&3*ÔX ¾ÝeÛ¢ðwÚ‰¤”´ÙÉ:9ÏÙYI(¢†3|H?™É\¦¸˜¢­SÁ†îKÐÜ ƒI«IÆÁhDãh‚~zKâ@o©xÕ2E²t€k s•hÐ{÷P+8áõ–SážS² …,À»i0 _ºoOÅmƒÏ¹›?«n_¹è]à¶´}Èo"òš¯ŒÛ‹¦*píÝ:¾‡&T·BÕ}N)>º¯?FÝX4z¨%ÅOh/¶uª˜ª‡@Î;ô:½ŠÕçȘ.®äAú}€œ[ù¤Àûˆ9k)óØø@fm´veökZëeôÞÞÞg´ˆ7ÄrÁ­PüŸ2áöIÙ@P5¯B!V´“á ¬y –ó$o“ Ór§6´ ³ŠÀ¥Hþöº[Ì?ë¢IÛJ¡,¦[ïÄ]ÀjÉ(^¹8cŸÙºýlÛW6½kÇŠ0U—7ÖÙ‰„'zGŒÚkiíV4r«Ð}‘«%£VYLÙÜŽ`hþ«œU¢ð&Ÿý{P`à™·ƒE+ä†j¹?•jÉ(Âäh¹mâ^W ±J¡o íª¡YZí/+ƇáÛ¾63ܲhåV–D_æßÏÿPцÏÚ|¶ž!¶ó9- ¥¶*Qth$/WyÈÔ­ÂÔMRЗ*ä>[Ñr[ÑÌ:}“%­I©Œï£XðÁ˜m/Q}iCî³ýþ’É$-·¸‹n:Ä{™%|Sk´ Éûô:óç]-Eˆo›ôþZÕõ¿ž±ûl<`Ê*yó[©ðNö§ÖFÜ[rIäÍ›7á‡÷Mú²õŒ¯g€`¼boÎÍlËj;K ,ú=Û\Þ¶JQÜÄÕëÌG‡Þ¢·[L@/“è±Ä»›´#:ZÁ‰{¬ÃeÕ?õò>Iôè‹ !– –î£/û¯|xV\‰þ­’¥,^H…¼[Ÿ¤ÿlXu“è>ê&å×{ÜÚ[²,‹]dÿD¾:WdûD«ZòðáÃeµäÓ[yñ ߤŸ Ð7nÜÀA[Ylì¾/å?ŠvD7Ýÿ›f¿ƒ*s&ä&‰ÞÙÙYæVŸ‡ºÿ[~«˜Ö­–!÷ç'¤ÌöŽ!÷ÖÖÖ2» ¢½ŒÄ–²” +ÿ­/›Ä endstream endobj 7 0 obj 5043 endobj 10 0 obj [0 /XYZ 31.5000000 743.750000 0] endobj 11 0 obj [0 /XYZ 28.5000000 785 0] endobj 12 0 obj [0 /XYZ 28.5000000 785 0] endobj 13 0 obj [0 /XYZ 28.5000000 785 0] endobj 14 0 obj [0 /XYZ 31.5000000 703.250000 0] endobj 15 0 obj [0 /XYZ 28.5000000 785 0] endobj 16 0 obj [0 /XYZ 28.5000000 785 0] endobj 17 0 obj [0 /XYZ 28.5000000 785 0] endobj 18 0 obj [0 /XYZ 28.5000000 785 0] endobj 19 0 obj [0 /XYZ 28.5000000 785 0] endobj 20 0 obj [0 /XYZ 246 703.250000 0] endobj 21 0 obj [0 /XYZ 28.5000000 785 0] endobj 22 0 obj [0 /XYZ 28.5000000 785 0] endobj 23 0 obj [0 /XYZ 28.5000000 785 0] endobj 24 0 obj [0 /XYZ 28.5000000 785 0] endobj 25 0 obj [0 /XYZ 28.5000000 785 0] endobj 26 0 obj << /Type /Annot /Subtype /Link /Rect [28.5000000 785 28.5000000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CONTENTS >> endobj 27 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 660.500000 102.750000 667.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections >> endobj 28 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 647.750000 81 654.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_Sections >> endobj 29 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 640.250000 158.250000 647 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_core_docs >> endobj 30 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 633.500000 207.750000 640.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_language_modules >> endobj 31 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 626 215.250000 632.750000 ] /Border [0 0 0] /Dest /w#b1#b2#95#80#3d#b3#07Z#e2#16JT#206#7cy#f0#c7S >> endobj 32 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 619.250000 154.500000 626 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_developers_docs >> endobj 33 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 605.750000 57.7500000 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface >> endobj 34 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 593 99.7500000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn2 >> endobj 35 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 585.500000 108.750000 592.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn4 >> endobj 36 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 578.750000 106.500000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_license >> endobj 37 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 571.250000 111.750000 578 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn5 >> endobj 38 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 564.500000 102.750000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn6 >> endobj 39 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 557 140.250000 563.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn7 >> endobj 40 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 550.250000 154.500000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn8 >> endobj 41 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 542.750000 132 549.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn9 >> endobj 42 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 536 106.500000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_release_notes >> endobj 43 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 528.500000 90.7500000 535.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn10 >> endobj 44 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 521.750000 102 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn11 >> endobj 45 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 514.250000 99.7500000 521 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_installation >> endobj 46 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 507.500000 157.500000 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_windows_installation >> endobj 47 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 500 145.500000 506.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_unix_installation >> endobj 48 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 493.250000 177 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_osx_installation >> endobj 49 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 485.750000 123 492.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_testing >> endobj 50 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 479 129.750000 485.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_examples >> endobj 51 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 465.500000 71.2500000 472.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction >> endobj 52 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 452.750000 108.750000 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn2 >> endobj 53 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 445.250000 112.500000 452 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn3 >> endobj 54 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 438.500000 114.750000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_target_languages >> endobj 55 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 431 145.500000 437.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_supported_status >> endobj 56 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 424.250000 153 431 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_experimental_status >> endobj 57 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 416.750000 114 423.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn4 >> endobj 58 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 410 150 416.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn5 >> endobj 59 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 402.500000 152.250000 409.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn6 >> endobj 60 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 395.750000 162.750000 402.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn7 >> endobj 61 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 388.250000 168 395 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn8 >> endobj 62 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 381.500000 126 388.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn9 >> endobj 63 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 374 164.250000 380.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn10 >> endobj 64 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 367.250000 150 374 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn11 >> endobj 65 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 359.750000 172.500000 366.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_build_system >> endobj 66 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 353 138 359.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn12 >> endobj 67 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 345.500000 119.250000 352.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn13 >> endobj 68 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 332.750000 115.500000 339.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows >> endobj 69 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 319.250000 130.500000 326 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_installation >> endobj 70 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 312.500000 156 319.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_executable >> endobj 71 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 305 138 311.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 72 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 298.250000 243 305 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_visual_studio >> endobj 73 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 290.750000 139.500000 297.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_csharp >> endobj 74 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 284 144.750000 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_java >> endobj 75 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 276.500000 142.500000 283.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_perl >> endobj 76 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 269.750000 150.750000 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_python >> endobj 77 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 262.250000 143.250000 269 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_tcl >> endobj 78 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 255.500000 136.500000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_r >> endobj 79 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 248 146.250000 254.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_ruby >> endobj 80 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 241.250000 249 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_other_compilers >> endobj 81 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 233.750000 146.250000 240.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin_mingw >> endobj 82 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 227 180.750000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_swig_exe >> endobj 83 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 219.500000 246.750000 226.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_mingw_msys >> endobj 84 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 212.750000 215.250000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin >> endobj 85 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 205.250000 210.750000 212 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_building_alternatives >> endobj 86 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 198.500000 231.750000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples_cygwin >> endobj 87 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 191 193.500000 197.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_interface_file >> endobj 88 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 178.250000 95.2500000 185 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting >> endobj 89 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 164.750000 161.250000 171.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn2 >> endobj 90 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 158 177 164.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn3 >> endobj 91 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 150.500000 148.500000 157.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn4 >> endobj 92 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 143.750000 141 150.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn5 >> endobj 93 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 136.250000 127.500000 143 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn6 >> endobj 94 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 129.500000 160.500000 136.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn7 >> endobj 95 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 122 137.250000 128.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn8 >> endobj 96 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 115.250000 169.500000 122 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn9 >> endobj 97 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 107.750000 198.750000 114.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn10 >> endobj 98 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 101 174 107.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn11 >> endobj 99 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 93.5000000 133.500000 100.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn12 >> endobj 100 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 80.7500000 73.5000000 87.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 101 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 67.2500000 108 74 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn2 >> endobj 102 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 60.5000000 132 67.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn3 >> endobj 5 0 obj << /Type /Page /Parent 2 0 R /Contents 103 0 R /Resources 105 0 R /Annots 106 0 R /MediaBox [0 0 595 842] >> endobj 105 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R >> /XObject << /Im6 6 0 R >> >> endobj 106 0 obj [ 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R 74 0 R 75 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 102 0 R ] endobj 103 0 obj << /Length 104 0 R /Filter /FlateDecode >> stream xœí]MÏä¸q¾¿¿¢Ïö]’ÅâØù ’C€Á àCC°¶c'cò÷#’êî*6K-QêV¿³íwF¤X”Zõ<,‹ÅŸÿåËþû‡ŸßùßïãߨWªüïþüD Lxÿ}ð¿~{ù~øþòùåóðßãߩѷ¯ýð÷_óßÑëá_êôw*ÿóËïwøÛÐèØ¿Îþñëß^~.O6Ô©coã³Ô×Cÿé/mÁt´æð÷?¾üixŒ£Ìt¿ŽNù`Å/î1 ]áЧ‡»w¨ïÖ¡»w‡ÃÞé÷ÔÖ`Ýá÷“ˆ)•zÑû|Úùª<êtøù_¿¹ÃáÃÿ$øÌ{SïI÷™üRòåý¿ÿú¿áíþmøÿ_ÿñŸCñÖ.¾ûúòó§psøú§¡*?cùëë·4n¸‚xøú‡Ã? Ï¡ÿùðõ//F¿‚…Ä é®Rcr ¨W£@$5kÂkˆÊÖÆiöXu®Á\£Õ«Ãª+5þÕG½dGmŽU5;â+˜ [ìØR/öÄ6QlSØQëK>+Š_ýÅG/öóAlSØQÛW“Ð j)±’¤*ÔøÝF ·¤Émä/'þ³Ùq`( ܨ#+˜Ë Án„á,9_Ç×”×úàÜø¯¡Ô —x²ùÓå¯/ξjMºÔk TôpsºöcƒmŠŽ‰.‡»Iש>°Æ‹þóË»ßÝ ëQÂúpÎÎ{KÑǵÆxK‡ Æá°—- z—¾4ųš$Å›T¯a?€÷T@*GÑpú' }i8Ýš.}ÑàŽß¼Ô#oTzº=œšÐÖ™ôá2Ý~î=Õçg;·æÏž´ìËÝ•L£´,Àu-‹âòËbj )ïÅ6Dª—ñ£8@ÉØŸàSÇÔH™Wfx ǧó°2ÒDDËcÌMXà:Ö“ªA°g¬‚u´`Ø£«À} ì128—ì¹yk¤ÒG°Gl=Z.ÝV`OõùÙJß ìV™«`ŸÐ^qŽ61{뮬£²íd—ƒ}œ8µ¤u QžlMü¢òûÈ¿[­'h Þ‘ŸZüE'Þ'ˆ"?u¨ •÷ HÅ* ¤â5-8’Êö`JQ0=G›ŒÕ÷üöb}l}àÉQÃj䣆ծ1jd7ô™×Ó%5J=òÖH¥—QÃjÛ5¬.ø¨‘ëó³Y:j0éûFs÷GkÔø¥VgyHÕLD5Û¤·ˆÉŒ9ëizRp;&KÑüxH|NXî6ôT†žZˆœzÀVC`kèχá’=¹yk¤ÒÇ¡ 5ô€áÒM5ô¤úülÀ†*}¿¡ÇÎPt™1ÞÕ8ê!q™¶âžßÁ)a­&ó‡h¤`ý¨;±”c=V¦Ó’E‘Q³[†XQ#w\ŸP£–xI)'¾™¼Äòiæï?p“'dÛŸ¯×­; "Ì›¯±±î€ÊÓÅtÉÖr=°Æ@EçuTÐXwÀarÈD¾îëk¸èÝÖPWºÔÒ˜¢fÊz!œìEîà™ ŠÝÔ²»Ï ˬuÔ„Åtd+d€)EÐ\ɰU¶tÉ”ê5*ºi°®@2š‹ÖR}`½N«õ]@úؤݗpô'ñ zl¢‹‰ÐnK•H×ÈFZ°bÖpˆYhAÌ"ÃÅ b©Xc ¢ Ä㦱ÁÈf¢U±TXãÀEï1V@ÌÈÜþÈ}4踫zLû 4𸱑àGZ°?Nsü8Ó³LÉ­ð“ê5*ºàÇ©~02Ñ+ü¤úÀ.z?ü8¿?ú-â§+bàBõ;\›/€ç’1Ë‘è+c€¬Ä\PsA·0€#@…¹T¬1PÑs>¶0çíC…9_PF.z?Ì·s¾n"æz°ÐÑÆô̯äÑlYØK°b ÅH VB,F1§TbŽû\ñ3œq’ë5*º@,†Ä"÷ŽD_A,ÕÖ8pÑ»AÌ)\1ÙÀ’!æÄH„ËÄòXu&bÀøÚ|_Oì2û@”f‚ØF–&¾‘÷9,àÙHê] ©=Ë¥ XÌ)â‡5‹‘‚u,æ4wºǙ*<×k Ttf1§[àN3×Tºd,–ëk¸èýXÌØ5,&/+È,6šÓKVšÌ{±M,'ÈDÆÚ‚@Y¼aÒZØc#M¼†ü2WuDelÌ£=Qo‹6 -p´`%m‚ç´y^¯§ÜÅw®8î÷¥z`Š.´y M¹Ó%§ÍTXãÀEïG›ö¸£¡‹6?tÐæGi~5¡µõ”ß|ª Db*›2‡,ˆ6ºðSÈ&¬Œd9Œ|S»:f–a SLÐ ¸Ä’kã-XÉ%è8— oq wbºâÄ$„ê5*ºp b‹KÐrѶâ’TXãÀEïÇ%άàèDsª'x©ÃÚÜüË yê'›7öÕ8GÖ²Ó)X 1bÞµ Æ}–®ø, NR=°Æ@EˆyÛ‚˜.*ˆ¥úÀ.z?ˆ½brè1Ûå ˆ=}Ù.c`‰¦²¤¬£+5=òÀ*[UŽ»]¬«r=°Æ@EM­À*¹Ã3VU¹>°Æ‹ÞMÓ½º®µ=šÞr5a²Ê“¦ž‰cnîµ›p¢¼bVž¬C”×<ÂÊëV„•çn,¯««\¬1PÑQ^·"¬òÍTta•ëk¸èý¥WEXÉmzb¯z‚/L­M÷MÔ?Û¹5ö·[xXNÕƒ§‰å’G©l¿õxøY:öI%t[‡²xiÁ<.A]q š— ËáÑV\’ë‘·F*}äT-.±,“Eºä\’êó³)Æ%¨KpMhÙÆ\Ò1žŠHîXƒ¿ØýDÿ ÑO³ŽfóÐïU…~¯[è÷lW¿÷P¡?×#oTúˆ~[èw,#Aºäèw#ÜIkþì{¢ß¯ rÛý=aÞòöðK:]HîY¯Ñ?±(ÛÁ$‡ìÊìé®´™‰dšß Œ¦7Lï2tD4øIÈk¹új'—ŸqšC¬9ª!G¶×ÝGSr®GÞ©ô‘Chr`ûôÓ%'äTŸ60Bñ9® ‰Ü˜;ö @Ñ·VâÖ+Y=¸H3“Éhò:à fA ¨À!Tl@ äË“’†ìÍ#JFg­‘J/ªÊ1éÊqäúülžB€Iß A¯‰§Û=ÁQ ²/]K2¼,.£?‡Í°Æ‹ÞYƬ@VËPž¡vÅk÷d»ìðº_U¿LÚB õOµbòày\qô­¸âÈÝSÑWqŹXc ¢ËäÁ·âŠÓ9ÌLtWœëk¸èý&>®¡°žå-‘ŽöŸ O<Ì$;¯H̳ÿi+c-˜g,Ä*â8ÆVÄqŒ,â8Æ*â¸Ô#oTúh,ÄVÄqŒŠK¯"Žs}~6q̤ïg,Äp¤ÝËþ¿Ò¶ %ê°[äô;K"¢z²—ÉyzöqÏå‡lÈÐ\\{qY±VÇDÌ#A c$0%ˆ¡”ÅçkFãÈ í pÄP0XsyªŠ%.w”'< ào°#M OáïÍ=1â pÛ4)—ò¶#=Ûù6I±m’»Ðƒ…-˜ ècÚç A·Írùº4Àˆ`"iG@›Ø´ ¼j@Ÿ|Àß`W@ƒ»3 {|ú=Ûd{F¥ý3<]=écY^Ñžñ×é –’)÷=ßk.1±œˆ #-˜ILÇ|Ú'bBÕ"&îZÌ×1¡™ˆ@ÚÁ‘˜lh“õ¼ëkb²~d¢³þ»⽉©Ã_ð$¦>bº eèÉl·iÆÓ7ÇTÇÌLùÄ]V0“©\¨˜ÊÅSy͉Äëš©NÔD íàÈTη˜Ê9Þs5S97RÓYƒ]™Ê¯‰ÏëbªMCvºÖ³:ÿ,¼ ’…ŒS+%Ç¢S´`W_«p¶Êõ¨®Ô«¯UdÑvùšùõËÀÚ•žûÃõ—kKUÄ]¹#°öKßÍ·?¼ùš˜»m!ð Skì(•Û£Îá"rO¬ù Å@õøR{2ö¬ŽöŸ¾2kMg€·=›'ÎЂ•Ô«•cÔ;zƒz‡þ9jUÅc–;€µ*½Pï`V5¨w˜$UÒ«ÌrG`í—¾õj½*(³ã\£F<|•wÛõÙI² ¾ZžîÍ?ù¹"ÕR*™Çò=Eõ1¿[^øBZ°–E r5®Å¢&pž3¡fQ ožÛ•>²¨±-5PI‡šE Þ<·\úŽ, «bf;Î…èÊm7©h‚î6µu7ΰí ?ZˆÁ-\}3¹ë˜K/G"-¸eô!2h>À1ùøÒ+º sµÀ®9È¿[µ5#޵|ıØq¬çc‚õõˆc}cÎíJG ­ÇšJº©GkÊsn¸ôG<}Óž§çH ñ$¢1³¬æMO&ë:³lAŒ…ü^=K¦=®yhèY~´äEy8AM† k‰É'&g[Ää§çjbr®Pѹ=Pé#19Ó"&§+éº&&§ Û.}Gbrkµ{ÎçØßNÛ˜{|…=>¼oòµà²™öç-cÜ4¹Œ6ê´@÷I|G9»ŒuC”6‘Á¥#·‹œÅƈ5òûh9…‡ül²ÖˆÙrdi¿›œGGþ>×2ß,“f$öèù>ï#>õ¸ ÜзñËÍÉä3èao%Sæ„ÿs£8Dƒç€g(HˆY^sKÛ–¥áùR|º®,t°ö@¥–†W-KÃñ0‚t]YéŽÀÚ.}GKÃû5tГ×l÷yùo\ÞP–Ùl,ø@y†Ì4bµ÷ËÄÖÞ¯ì$¤cy¬÷~•; @ÚÁÑX­½_e8é Ô{¿Ž›¼©þ» ÑÝ„ÞÔÜ¥+Æçbià^“ùü1á6ì OÝ$Óä½Öð{ö’¬_ó.ÖP$ûǼ¦7<(cèˆÂù-޳tºc{u—2ÈÚþI4oæg,îŠ?¾–j™-Ö1Ü77Ö­‚Ê·ô¦ÆNçL¨´røþþÇ—wwmS2ÚŸ4èã†ÆýGÛGhyÀÇ™ß?ýDÃ/äˆaèiÁêïoÜîßì[øþ=é6>ÍTêg=××P4ΫÓ3Á«EC,î®!o@Cºò7Ü"CÁ\A²E!-X­3Îî®3Þ¼éÙZ¿óæñ¹êåi„¾§«Õ+Àîêõ[P¯žÍ#òAf¢9£q‘fDI›¿gÜ ’6k†UfoͰúú€ðšÑ³W –|eK2Ë™iÁê¯lôî_Ù¬ U¸×WîØK3~åÊÅ7•Ó`vŒ}Ö’¼ 4+˜ç·¶Z.·¶µ\n-_.O×Ü^î@.i£ÜÚÖr¹µªê ^.Ïw”'dËå´ƒý<àÖ®Z.¿×YAOøÄ{==àå·$Zvë ní?Ãùé_© =pÛ*]·I‹*ïuíÏs¼ìçú7*x}{Á2(oc¿±®c¿I×<þ&߬=Pé%þƺVüE“®yüM¾#°öKß/þƺ5ñ7=ž¶ˆ¿Ù6DV^[¨½@ò@ÙÅš=)ï´%H{‰¼ºÞGþȳ7dÜ“”ÎiÁÌIM¨Âzlh…õØÀÃzÒu5© cX€´ƒã¤Æ·Âz¬ça=éºšÔøã,Ƴ°ÚÁŽ“š°&¬ç^[~;™Soœ%^þ, Ž…éÊ<ôÜ Ñž‘ÔV9Z°Ú#wc@µ&Œá‘w%<é­3Òzbîlªµès®÷&»¦‘$WÄD^ç‚ÛyoRG”YÀާQV‰¬¹kÕí¦þ¡×Œ¨wvB³&Øén£D‡3þ9Jè'ßXûÀ¥ïÈÅþúÜxã°ñ Ÿ.ƒ[fŽÃ~7éÕCÍæ¬&.ñ È Iò£Ý¿ûí aÛf³¿œÎut|Õæ˜Iì$m2xO né®÷Œ·&œÊów·ùêebóe¦G]8»ÇÛXuÁ±µËtÍGËÈ í`\uÁ4G]•XºZÍw”'4tq”v°ß⨠§L›IwË,ßqÚÙÄšžÌá›îh8[¹g±wç]û3×Éï FÓ‚y˜÷ªJáU+=†W<=Fºæ˜/w €´ƒó^µÒcx¥ªêôùŽò„,=í`?Ì{îùÓUÎÉ:a³ôØm·8da#ë¬Ç>¼´YnyšyF¶W$7DADâ ²®mL Ù†G"¥ë Ù%5 €´ƒ#²j![óXªt]!;ÝQžP1dýÈ6þÎÈîÚÌ.‘Û,4vLºÎà^4úyCŽGp–ÌĈ­öQ{ÛÚGí-ßGím½ºÜ\ÒŽÖ>j|uº®0GPÛGM;Ø#ÖÝ#=I¾oœñiBHω¥pqfSÛäâ½. ÖF±äLZ0“QÈO¥À©£8ß}®ŒòÈ íàÈ(ZŒ‚žw€¾fô#…œð7Ø•QÞ›QzV+ädÍñRÁI—Ù{œ9š¿^Ñ‚•+*ž™T®ccEÅ~*ªÏ.&º*’ïÖ¨ô²¢â½o¬¨xÏOtM×|E%ßXûÀ¥ï·¢âƒ]½ç¦«I˜>—IÖ™ ¼LòcGÎ[Qñ;‘V%Î3 (r²ÍXTPÜ_Fƒèl•; @ÚÁÑ€Š®e@ÅÊã±6 Òå 3 HûPA¶ènÊâ/BˆS29¬¤ËU)c³'F‡sQv|ö,·ôŒojÞ(·¹4Š;vµÊ›Ó–ì‰èQyëQÑ›»¡ƒ";nÓáç‚y|tµã6èÖŽÛPy‰ƒ®wÜ–; @ÚÁÈçA·vÜm«ê·ùŽò„lÇ-í`G>7§·÷âóž&ù‰—]¶ŠB¼Wîè‹ì ÏñðÞãá\Š4dÏo¦šSÁLŠ$Gµ®E‘Õ"A Çå; @ÚÁ‘"Á¶( êjŠLw”'´Œ""íš°üH;ݳÈÖ3ÁßÄyËèÿb’oî\pÛÝ_ÁŸ–ÄdFíÙýUT¡¶%îÊ•DÎ…ØRm”†À CU£äg“w³-Ø-<ñE Vú“£â»¥†§lø“£â»¥Ò5÷'ç;€µ*½ø“£jí–Š *éõn©|G`í—¾Ÿ?9ê-Ëš³ín©-ïË-N*˜çÏ‹šð§Z0ϸ‰Ærã&l7ÑðõÊtÍ›rrH;›h aÜDcªLeÜä;Ê5nhû7ÔMP´±?¯ãü­‰Ða­Y!¶=äj"½Ñ5cm¦é—˜\é炽Ï/Ÿß­:C°¡tŸ¯Ýð}blµ2471 /®RÎ!<œò×*qÃøHS¾A”EaÌå–õ‘¦›ÙáÃØfÜ K>±•ùƒÔ\S¥Ö³}ßôró·¥&P­Ý­‡Õã«_¼àhýÉø’­¿ÆkhYšØfóô¢W'Ù‹zΧq§tø““T}UÙ?>¿ü?‘¿’œ endstream endobj 104 0 obj 7186 endobj 108 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 135.750000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_output >> endobj 109 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 129 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn5 >> endobj 110 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 764 141.750000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn6 >> endobj 111 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 757.250000 144 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn7 >> endobj 112 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 749.750000 147.750000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn8 >> endobj 113 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 743 154.500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn9 >> endobj 114 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 735.500000 155.250000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn10 >> endobj 115 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 728.750000 144 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn11 >> endobj 116 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 721.250000 127.500000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn12 >> endobj 117 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 714.500000 164.250000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn13 >> endobj 118 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 707 168 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn14 >> endobj 119 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 700.250000 146.250000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn15 >> endobj 120 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 692.750000 141.750000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn16 >> endobj 121 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 686 181.500000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn17 >> endobj 122 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 678.500000 192.750000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn18 >> endobj 123 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 671.750000 155.250000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn19 >> endobj 124 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 664.250000 122.250000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn20 >> endobj 125 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 657.500000 118.500000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn21 >> endobj 126 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 650 173.250000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn22 >> endobj 127 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 643.250000 141.750000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn23 >> endobj 128 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 635.750000 176.250000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn24 >> endobj 129 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 629 142.500000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn25 >> endobj 130 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 621.500000 117.750000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn26 >> endobj 131 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 614.750000 175.500000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 132 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 607.250000 196.500000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore >> endobj 133 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 600.500000 231.750000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn29 >> endobj 134 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 593 207 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_advanced_renaming >> endobj 135 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 586.250000 212.250000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_limiting_renaming >> endobj 136 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 578.750000 286.500000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_chosen_unignore >> endobj 137 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 572 171.750000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 138 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 564.500000 192 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 >> endobj 139 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 557.750000 126 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn31 >> endobj 140 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 550.250000 161.250000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn32 >> endobj 141 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 543.500000 185.250000 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn33 >> endobj 142 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 536 141 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn34 >> endobj 143 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 529.250000 164.250000 536 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_structure_data_members >> endobj 144 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 521.750000 181.500000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn36 >> endobj 145 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 515 208.500000 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions >> endobj 146 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 507.500000 147 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nested_structs >> endobj 147 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 500.750000 220.500000 507.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn39 >> endobj 148 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 493.250000 106.500000 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn40 >> endobj 149 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 486.500000 153 493.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn41 >> endobj 150 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 479 156.750000 485.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 >> endobj 151 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 472.250000 150.750000 479 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn43 >> endobj 152 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 464.750000 150 471.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn44 >> endobj 153 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 458 147 464.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn45 >> endobj 154 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 450.500000 187.500000 457.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn46 >> endobj 155 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 443.750000 162 450.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn47 >> endobj 156 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 436.250000 188.250000 443 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn48 >> endobj 157 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 429.500000 174.750000 436.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn49 >> endobj 158 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 422 159 428.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn50 >> endobj 159 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 409.250000 77.2500000 416 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 160 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 395.750000 144.750000 402.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn2 >> endobj 161 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 389 93.7500000 395.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn3 >> endobj 162 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 381.500000 132 388.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn4 >> endobj 163 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 374.750000 171 381.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn5 >> endobj 164 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 367.250000 105 374 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn38 >> endobj 165 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 360.500000 177.750000 367.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn39 >> endobj 166 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 353 189 359.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn40 >> endobj 167 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 346.250000 167.250000 353 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn41 >> endobj 168 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 338.750000 125.250000 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn6 >> endobj 169 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 332 177 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn7 >> endobj 170 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 324.500000 267 331.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn8 >> endobj 171 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 317.750000 211.500000 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn9 >> endobj 172 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 310.250000 148.500000 317 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn10 >> endobj 173 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 303.500000 147.750000 310.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn11 >> endobj 174 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 296 141.750000 302.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn12 >> endobj 175 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 289.250000 135.750000 296 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_member_data >> endobj 176 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 281.750000 95.2500000 288.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn15 >> endobj 177 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 275 125.250000 281.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn16 >> endobj 178 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 267.500000 87.7500000 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn17 >> endobj 179 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 260.750000 136.500000 267.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn18 >> endobj 180 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 253.250000 137.250000 260 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn19 >> endobj 181 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 246.500000 101.250000 253.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn20 >> endobj 182 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 239 255 245.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn21 >> endobj 183 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 232.250000 120.750000 239 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 184 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 224.750000 164.250000 231.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 185 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 218 179.250000 224.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn24 >> endobj 186 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 210.500000 168 217.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn25 >> endobj 187 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 203.750000 197.250000 210.500000 ] /Border [0 0 0] /Dest /#8d#21#08_#eclM#0a#f2#2b#dd#13#ab#21#a7N!#19#9e#0e >> endobj 188 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 196.250000 173.250000 203 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn27 >> endobj 189 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 189.500000 129.750000 196.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn28 >> endobj 190 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 182 113.250000 188.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_class_extension >> endobj 191 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 175.250000 99.7500000 182 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 >> endobj 192 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 167.750000 168 174.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_directive >> endobj 193 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 161 153.750000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_functions >> endobj 194 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 153.500000 177.750000 160.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_classes >> endobj 195 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 146.750000 165 153.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_class_inheritance >> endobj 196 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 139.250000 166.500000 146 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_specialization >> endobj 197 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 132.500000 153 139.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_member >> endobj 198 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 125 164.250000 131.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_scoping >> endobj 199 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 118.250000 152.250000 125 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_more >> endobj 200 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 110.750000 106.500000 117.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_namespaces >> endobj 201 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 104 199.500000 110.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 202 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 96.5000000 185.250000 103.250000 ] /Border [0 0 0] /Dest /#7c#27y#ef#e7R#1e#b9#0e#60#a4d#04#ec#27#d2#27#15#d3#8b >> endobj 203 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 89.7500000 135.750000 96.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_exception_specifications >> endobj 204 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 82.2500000 161.250000 89 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches >> endobj 205 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 75.5000000 126.750000 82.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn33 >> endobj 206 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 68 156 74.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_smart_pointers >> endobj 207 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 61.2500000 201.750000 68 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_ref_unref >> endobj 107 0 obj << /Type /Page /Parent 2 0 R /Contents 208 0 R /Resources 210 0 R /Annots 211 0 R /MediaBox [0 0 595 842] >> endobj 210 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 211 0 obj [ 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 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R 173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R 201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R ] endobj 208 0 obj << /Length 209 0 R /Filter /FlateDecode >> stream xœí}]í¸ŽÝ{ýŠzàž+‰¢>€ @Ÿþ‡Û@yzf2ܤgò÷#[Þe’[rÙ´·½«Î™ÆÜn«dJö—hj‘üëûÛÿ~ý?ÿùú×ÿö_Ÿþýãß^Ì—ˆ¦þßëðÏ_hƒK_¦ÿ~ _ÿãåÏ×?_~}ùµüïŸ/õ†¿ýø?Êý¿W÷úßËÿÿÛë?þ¯ÒøOS§¡Ã/ÑÆòï¿ÿÎÑ–ÿ2oÿÚÿõåþÃë¿oÃM“á×î)sxgÜ?_nÏhÇþó÷ùk}ú CØìÝ«õàëýÇ?¿üËðLŠIÚûIZ? €¶ÞYÞÐÔྤdÊýRý/;´–)@œ©×¿¿X_¬Í.¥[ä0ôL½é•Ýî3 \7) =ê ßð'ø½ü†{{ïÓó÷^[:?ÙŸ 7~ýí寿”ÑÃëoÿRþ4¾áú¯ßÊ[CW®2Æ×ßþéõ¿ãÜ}ýíß^Êij ÇߣþÅþ4þÅñPW÷ü—÷üÜ»ÇüØ»ÇØñ/Ö| ѦòÇù/¹þ¿˜<Þ5ÿ凮´¯õwûÓŠ¸Ð»Çšîóøî;€î{{OÚÏ¿=šWDK?Ê[~×ô¦.EÚð÷²ØV(X4BÁ¢m)X¾þ˵P°±rH¸)XÈ- ‰P®…‚…›FÍø\ª`1œ¬`®¿„ú V¥ÙI>p ÝLJ _À%ëpÍ_L÷˜¸]LÚ¤1Î*2mX©) •Ȧ¥Ùñ[®…JŒ= @:ÀM%Rj©Ä Ït€r-TbèQ§œ˜J.T‰Œg«„=T%ú»t÷©ºëáM#Ö¨D—XÖUW3I[£‹Iv½kèóó&ÌáM¥ÀmX¥“®LédiÈ÷:éÌ ³ÊŒ×L'§È  êdiˆ÷:YZ \3¬=ê #ÑI6Àe:Yߟ­“ýå÷Äv ù¥‹ 8þnاû÷ÚÚ߻ۯ[U~Ú–Õ‚Dm3mX©¶. µu©¥¶`¸V‘j;ö@.é7µu¡¥¶ùåZ¨íУÎ00µ%\¨¶g«-nWÛþ¶hû ²¯4w›‘FHw²¶ÿ€}Eë¼}TèöŸG [ußäÞ†àg4°™6ü]h†¹ÓŒ.N„A=ýlÔë8)y“†Ž­ù5à›³m¼þý%øIËíÔØý@¥—Þã5NÎïõBúàBâ㗉ݟ¸ô}ùú§#D2@”h@h|5ý¸«ý¿à)é[Ç}]è®xÛ×5¢@Š…'MÝçÑØPŠïš«g½Ó Í.ð@2 ¨0c$Ú°Òb (,¦q‹‰»ËÆka1= @:ÀÍbº¡ ·˜ˆ@ZLC:CÏ,&2À…SyÞG¢ÆÊZ°˜~VXLwvQ¹ß}]tguýç/1 ¬Tð>"+pÊ}íaÎÂ+èã»W «~Yk9EGP!ц•¨¼@…„-TàÃñZ Âع¤ÜP!A ’8‰ C:C`¨@¸òûn‰ƒQAcZu ‹¸»³A÷œ`ÁëÓÿ úåЯ¿¾iÕ•¶ð¤ÓjÛÇQ¶ÂUòÖ°NÅ­®âÖø†Š[ဴ“rÖÑÚ¹¤L*nk¨¸5V `…Š=ê Uq:Àu*nËË?WÅÏ:ˆ{×D]ãEÔlªÌ9kç³fûvìÁËÇ<Ó]8yy~¬^k$Je +9 ª¨Í-ª¨~Ng$U´ö@.é7EÎ-ª¨ÍÂS›%UtìQgȨ¢t€ëÙ™=TQ•"+ÎJzN•…ϧþÂW|«¨èbߎò+ÞèƒOœ7|¦m°cÜ/Ò°yø±²33WÄgNsÃ:¨,&‡Ê¶-¨înç$=·ö@.éT³¬•åSŒ`%=wìQgÈè¹t€ ¡Òí¡çj Ruæ¤awih×ÓÑUßYÆ ùeéAá Z ·àáïÿÆ›?¢ö=ÎeŸÐ*.áûQMù;7³r<$Ú°!ü…ØÂ_áÍw“7Ÿèع¤Üð°…¿àÅ^âïУÎþBxüõ{ØÏ*üÕœgb5Z¤9›Ô˜ƒ‡‚÷?OAôÕÜsä&±'<%'Ú°'P‚¶HÁ9)Ø¡$×È à†Ø";1€$=ê )˜p!N„=¤`NhŽKÅÝ)k×{˜i:ÃW/iØyÀäâ¼ãÖkl0¹Ù]¨ôhìì~ Òë“‹Ð8`rÑ éN0=»?qé×0¹ôþÒÑÒÊ}¡Ãµ€JÃFŸTâä-³ØEÖ@¥Â·ó*?n a̤ +U=Æ,Äc"gÌB”ŒÙÚ¹¤ÜT=´³8cv¸ª&Æ,ÀŸàRU»³U?6Ø©¿TNÔûŒmXœÔ$Ú°rU'A…Ô¢‚ðB–ôÑÚ¹¤ÜVujÑGÿ IúèØ£ÎÑGé®ê¼‹>ªYÕŠ”… qøšL¾Ç&«:v;ôyú‡ˆðSwMb×âí9#ÖâD&©M]¢ 7œ8^3†¨f|kŸâEŸ®õæ—ÚÁZõ¦ÅZõÂÇé­d­ÖÈ `BhoZ¬Uo¸—v¸æ=ö¨3d¬U:Àuíí.Öª¡8ɉªˆhVåv=¡OcYöC“rA‘»â!ot%ð{K²ØÖð@à\á4œï‰6ß¶‘ ~Gï“ü•$#gb‘äü+–þãŸ_¾žŽÍ® ^– ìb´ŠÍß#/uÖóÇÜ…N‰! TlÛ»Ãî»PqŸ×gI]X¢D×Äàûè ç¬ÙÌÙB´a7LqWÃ4î"ŸÓîB×Ý·@áßð9Û_úë멌ßoÈï ·ÿѯɾ¯±û×fc«Ð3YÊÇ@vCG± ¯†Žø¦ÒO gñ'Ž­¬rÚ{?ÃÏ'jþ¤¸UâÌåòˆ´áqßÿÃ@Tå5™‡zfÅ›(3ÎF¾š]€›ì倛Îf½«WS²[úîC;ô6e ÙRoCîJM„Òå¤UôÔ{Láµðš W  „Wà ÞÏ´üÉjS-|aõkúŽ‚~hÿn Œ›ÕuC´Ý±Ÿò¹îÃr»–*Ïvÿå¬ßÞ«f0ïTsùàˆ^AÓŠ^Aq.ŠFF¯ÔÈ `:xEÓŠ^^@F¯Œ=ê Yô ຃W4gG¯¸ŸË\‘.¨-š4× ¿ŸÞ¡_¸¯`}¿<ѶªæøO‘æ_•ßîáUFÐhŸ´a%Ì9탮탎Gû ׿ÜíC às®탖Gû ׿ìíCð'¸æÜÙÑ> ±†>{þëcÉí ¯É·yHÆ„C …\OË9"ñÃ_Rá]\‘är4»™[]žŸ6ìL ƒžW@ߪ<0@ÒÔ-Ã5O 3öv?Pé51 B«ò¯<0\óÄ0cÄîO\úu‰aʂكÖNEŸ òIb ŸdT }]9eô3ÕwHÞEVÚr(b”0´b”0ð¥áZØraŠQ¢p³å°£„Èc”†kaËá£Dð'¸Ô– »b”4EœܲçÍœ¶‰4ušÅñYcº·%@¤ +1&Šˆ1Œ­ˆ1L¯= @:À B‹|ž‚HòùأΑÏéâQØE>?©òP úx´%#DJÎÛÉ—¨åyì—Ýw= D×,DØärL‘Tïp6¬ÄÛ$BRj…$q¶’ ¨= @:À oS+ Ü!¡c:C @¸oÓ®P€³ õ-) ¤\^ÏíàM6Emö…¹)˜^š']øÐÖœü*>šOÆ×µpšH)‚liÃ:8ÍF”"ȦUŠ ž)YŠ ö@.éœfÓ*E2Ïì4\ 8ÍS)"€?Á•pšÍ.ηN5° 0_U¶ÛI!I ʯ©<ÐQœ‡/Àœ"§Á¯ Øº¼ï Ç-ð“ÍÌ/ŸiÃþpŸÔ;ÔÍ¿Žöè¬ðö¸®·ÞYÒ-¥;ƒw‹5<^“ÿ¬ñ—…qRoI»›g ä¬Ýêˆò{{âýCv2räaH9¶ÂrägüÃ5gŒ=€ÝTzeäØ CÊó†kÎ {$vâÒ¯cäø¶%á ¢2÷!ïÜâO«j%õ_|í)gÿ/š]ÿSÄC¦QïÉF4¬ñ º/9óº/9·ê¾äÌë¾ ×‡r­ûBî*}¡Ԫû’¯û2\ Jò$Z÷…J¿‡r؃CšS£~B+ÍâÕ&o¨x”·¬sš³ºìl¤aß:CŠÚ×ÖܯóÒêèJ¯Ù:¯=€ÝTú¸ÎËuº_ç¥5ré&òu^{$vâÒ/[çå‰qÇ:WFtíØ…’Š ÐÐÎʰsÒ&ª©i¬Jé{Mžž4*óLÚu1І½àBʲÕëܰ\ýÁJp NæûJŸÀÅŸ¸À¥» Áeè‘Øý‰K¿\Àïëý$cþ´¤±'E:©³/¯ü„Y~·„õW—â›dq}n¨ÉJØ&YÌ¡¢$Û¤8^½N-Ø.¯›+ ÛC`÷•>Á¶-ØöÈ¥{”°=ôHìþÄ¥_Ûø"¦íc« k¾c~:¸Ìr_nV£Ww¸´³Éø!)¯ñ´aÕI˜ÀK˜”†F “ÒʺÆkv’6õ@.éõ$­44J˜”V/%Lj:CZ„ pÙI˜è¢2×»:?D…€“#M÷r°ó曽AÛŠ²‘覜iÃJÔK(P/5¢›Jkâ ”’D½”&˜K¡^Bz©ÝTZA õL0—×úv“Æyó½‚ñÝì}?–ã6B×´ë$¬…2’Îy<éŸX(´ D•÷û‚zF+à´O· žMÙïfÎv3G@Á/B Þ1s’fNj£)­ü Í&fN‚É®I–™9É3'6ŠÑ”V~T8\ 3'Þ욘™™“ž M™Åžp‡Ó¨ãŠH`ÕyÓwÃD•màz/”&{Â!û¢†æÞtÓ&d6oBk2’MßÀ›âòa 5÷ U“môØü»~å[/m(ž[oñí+ó¢IàL£hRiågžÎˆ¢ISäpÛ¾r£hRi§¶9Êí+Çi¿Ê‰m_ù Š&•§ÞÅôÌÁ ›?˾ïZûÝoŽT(´ab;›„bÛF #pÎrÅvV*¶›4™ @:À¤ØÎ6j•ÖÀ°¢†QíQgHk±.Tl·+‚è$úº½¯U Cj¡,ôIÉ¡´´—Ñu·i6Il_6/Ú°R³I¡Ä©!µ4[œò9o¤f{3©2€t€›fC£Qiåç”õÐlÀI•!0͆ø šíw™\O;Ðf4*±û£ ]žCÛ´”äK´a¥–¢ˆkqØŠkqâtÊ¡Œk©= @:ÀMK±×âЋd\ËØ£ÎŵÐ.ÔÒ°+®Es¢ÐÇÜûÎaUþ– âåw)p®|“†ä:G ýÕëР׹ȒÌל\7öv?Pé•\ç¢oë\!¹nì‘Øý‰K¿Ž\WVÐÉúslø¥*7õ)Öã:¦™£Éšc¢ {uƒ”®«×ØÒÌʸÑÃÖ÷ÐØý@¥Oº‘¡¥Ù éNêÆÐ#±û—~n€Ùµ·ü¤Ø[æh}í gOvižëÝ yëtHFáÁä# ;u,'›ƒm‘ÍÁr²9XI6{»¨ôªó`[dó!¹—.ÉæcÄîO\ú…:o÷ÍAáÏñÝ>ª:eǪë¦eíÈñø¸¬9hY“’XõZËx li=€ÝTú´¬Á¶–5!ÝÈe=ôHìþÄ¥_¸¬aºÏ‰ÒkBd5¹ÅŽ=&ÝEû|»«*sÝå¥b¶Ádò•™iÃ^øAËቖK«ç^Âú 8è(ü åðƒDË0ägÒ}–ðãs4~ð -—Y<&Ñò±õGw¥›¸\ÅUpwl’ÅCË¿o) öUt] úô“¼ç‰[ C8ƺliÃ^ІÃPläY.­Ü$ E¨À-…¡h8 …FžåÒÊ]iõ€¡0OȆâäY.³Ø•g¹Cš( EõwñPóqìWsÇrZ©O‘fOöêSâùœ!·ò9ƒpaA–ùœÇÀî*}Ò§ÔÊç ‰»ß†k¡O©æs&÷'.ýB}Ê{˜P}}ÒÐuûÍ5›Ï±ŸÞª„]} ?ƒ;«ä.×Ö†ò™w 3ñY?¸ãØø²~xÉ#âÿW‚g¦Ô2   ‡*QlÐ|G~®®ÅºVØ}èø}±…§}DuýîsD°þøC¥wB~Yáû3g„)V•A 9;ì5oxŠ|oZ)ò½8~ðV¦È{»¨ôj¯yÓJ‘ï ?:®¹½6öHìþÄ¥_g¯y»‡àº`¯iøéŸ,Š\Uô[“ªìÜš_ëì ogŽó6ìUzǬ{—ZJ/g<Èëc`÷•>)½k%X÷Ž, ×Bé]M°NîO\ú…J{¸¯ J¯I½^|£ä Ocj,h´¢•&žZcs|.jüe.ñ•H”ìëhÿˆŒcЍÂpMÝþªßä/Þ^yÊAï^ç2wÚ{Áö¾Åöžs§½—ÜéÚ¹¤LÜiï[Üiï½@r§Çu†Œ;M¸Ž;íqwZƒò§P뛃ëÝ] žM˜Ä†O²Oî},×$ÈÕRDõ_ÄëIïg*ž7¬a%2Q7À‡VÝ€2\AÖ ¨= @:À C«n€ uÆu†¬nàBdŒ{î#ã±¥Z5Q%}7µ¦è€Â±º%”üдú ÖЇúøx¤ ¯BWœé–Y€4¬„®$Ò÷ûÔJßïOá“Lß_{ €t€t¥Vú~Ÿœ@¦ï{Ô²ôýt€ ¡+›§.Õ™¬¦ЦhHÿ{J¯,{¾4«eBóB{æ†Ç}jÑ…sÁôØØÇµK髯ʕ©a¬]cøŠU^ _´­e¿¼{ ¾{ ñÝ Ï6‚&ˆÝ£ö@.éÓîÆ5v4V `Åî1ö¨3tt÷ \·{ ÙÊrðîñÄå•rn² 8N¢Í|7oÙ¾ŒvæÑÂŽ>7ì<¬BÇã”еâ”P'¡“qJc`÷•^«Ðµâ”Ð!]Æ)=»?qé×V¡{Lœ’&Ë÷êm(sh¢L•Sï‘©ÚÒ¨K$Ä(²†½ÈáyˆúVˆzb„^†=€ÝTú„¾b„ÀCŒ†kPCŒÈý‰K¿9ücBŒ4).ú–˃jÝögÒWþ»²Ö߆ÓàGgÒ@Oo\¤ {•3ðÀ ­À <ðƒ ¼{»¨ôI9±xƒÈo†k¡œ8©#ÒÀ*ýBå ¼Ñ䨀~¼½Â‡¡!w›ExÛh4 kXùqEaL­$Â(<¯˜dáÚ¹¤Ü>Îc+‰0Fî;®ÅÇyœ’ü .ý8O éjıçõ}-R—ûÙ1êê¶þ‹³«IšS79—1‘È ´á<& l骾â5ÞÒ#h½¶L'þ~§C±ûþrf‘¥s+Ks^Ç`d–æÚ¹¤Ü3·²4c~Ó,³4=ê Y–f:ÀuÈ̃HìäTœç÷óý|FЧæMÙdƒ!9ŸÁÓ†u8¬Èùljá„ã9Ÿƒ“9Ÿkä0áD°­œÏÁòœÏÃ5lj±G!ËùL¸'܃xï œPÕúd2Ÿ6ÙkÁ¢´c ŒÄåŠðÍÆ(‰7>”¹M­ŸàdÁUÐâªà\õ’«^{ €t€2C‹«À‹$W}ìQgȸêt€ ‘Ù?ˆ«®AfÅÁô§ó )dlqW¡È'¯¥ üäµlÅÞgÔxŒG¿5*^ÑŸã[ïìÌCÁB/K¾…yÈYè% ½ö@.é7Ìà = ˆ$ }ìQgÈXèt€ 1/<ˆ…®Á< |NÌ[ =a&v¸ÈIåä gC¸ÓWZßa¦H¢×—梜ý³…íˆvÌÔú¥ßÌ(¸ï!¶¸ïAœ_„(¹ïµrH¸flqßCtbÉ}{Ô2î;àBÀLæySÁú˜eb>ÝGú6ß]šY8¬a¥ògA]¹E]²¤.×È à¦ü¹E]Y"dI]{Ô2ê2àBåÏ¢.k”_CêWr[_æba{DTËSfÝúP'ÂG¬aêDë8êD ԉ¡'‡þ µrH˜P§Èk N´F `êŒ=ê -E:Àu¨STõyPGS=¨orh˜±š,v߃›‰1biÃN>cN6ŽÐ"Gàdã’l<öv?Pé•Ï¡E6ŽŽ“‡kÎg{$vâÒ¯ã3Fx ÙXS?ê_ZdcMÀìz§¥*ÛÊæ**ëxù×$Ú°rE#öP´­=T¸!ãä†$›àع¤ÜöPŸ[{¨çŽÔáZì¡þ¶iÎø\º‡âc˜¾}Íø˜¼Æ ÌùGë™"wÑÂþ{V­‘cŸGc)~Ûo‘«ý‚3ÉT {í—À 7ÄØ*Ü#/Ü£,Ü0öv?Pé“ýZ…bà…†ka¿„Z¸ÜŸ¸ô í—¸‹}Þe=¾[nån ÑÂÚð¸ã–a úf>iò’oà;ë¿oÙ;6éÕ7¿qü({QÝJJOJS+)}Ì<)}Ì2)ýØØý@¥O{Qj%¥‰'¥®Å^”jRzrâÒ/Ü‹ò.>w/ÒXÿýúÛ÷á²ë×ê`œKÖ_¹ûfBùɬá»oækál²Ã·Aÿ—¸ã‚KiØ‹YüÒnÈ„Âé°X€‡Áb2©‹Éò\%ÉÊ´ýc`÷•^a1™VÚþdxž•ášÃâØ#±û—~,&»+|¡‹Š¥O‹›rª{&ªaRkü»®ûX“6O“"{!Ä÷€=¤²Ògt²$Ð=mØ «.pXu±«âl%Õ³ C`÷•>ÁªÃ¬:/¤{ «CÄîO\ú…° »bºà©‰ðêW¢þPõÜTŽ å™u›ðf–˜sÃ^|ðÈñÁ‡>xžK&gLLLJÀî*}Âï[øàAH‰CÄîO\ú…ø€»xú}|Ð$Àì²È¼ošÅ«)wö9jQ>e¢„$Ú‘6<0Ú  D—ÿgKô?õþâ«=˜¿€Ìóè}÷\ù{Šß¯„ÞÈtàÏ?` ðÅaUª‡U´‡Àî*}ü-ÀNHwð‡‰ÝŸ¸ô ?¾Aô±€¯!tóÂ×ÞíÿåØŒå2€êøþˆêÊêì.àœ&ËYÇUÝY÷íZïºÛï!™—Öï­},Þ¶OF®ámx`@°O 5ŽÕ%ø¡‹4šÕx¬žd¢ÐŠxi¾‚þxñã§[R¿¾üúúgY;ó¾ÜXZ¿¾×áÏ…Z{©“~틱-íÕ½“ØîƒW³&6Ô½.2wó·‘¿ÔÍ$ÜÿeRY÷e¢ÅÝ}Ù´~®ŸzãÀ{_­¹ý2=é}rxí½\A­ÉÚéÑïpZAýÃõ¾ç£ñ¶/­{Ïôád7=: {Õ.¸1,£ø[¦ÎžQô»‹ý××__þ?“á endstream endobj 209 0 obj 9980 endobj 213 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 778.250000 162.750000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn35 >> endobj 214 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 771.500000 111.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nested_classes >> endobj 215 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 764 166.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_const >> endobj 216 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 757.250000 157.500000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_target_language_callbacks >> endobj 217 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 749.750000 185.250000 756.500000 ] /Border [0 0 0] /Dest /#0a#23#2c#c6j#c6#c3x#8bk#3f#86#95q#db#b6#f6#0fU#ee >> endobj 218 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 743 225 749.750000 ] /Border [0 0 0] /Dest /eN#5d#f6#5d#d8#3d#7f#e0#82#e6#a64#a6#19#e6#1c#c53n >> endobj 219 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 735.500000 158.250000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn42 >> endobj 220 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 722.750000 84 729.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11 >> endobj 221 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 709.250000 99.7500000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_introduction >> endobj 222 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 702.500000 132 709.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_core_language_changes >> endobj 223 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 695 202.500000 701.750000 ] /Border [0 0 0] /Dest /#ab#17#9f#f0H#e6k#0c#c0f#3f#0b#1d#9aI#b9#20#c8#04#bc >> endobj 224 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 688.250000 190.500000 695 ] /Border [0 0 0] /Dest /#2c#ca#e9#ab#29#ee#df#be#97#99W#88H#e3C#d8#ef#90#bd#0f >> endobj 225 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 680.750000 141.750000 687.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_extern_template >> endobj 226 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 674 135.750000 680.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_initializer_lists >> endobj 227 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 666.500000 153.750000 673.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_uniform_initialization >> endobj 228 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 659.750000 140.250000 666.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_inference >> endobj 229 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 652.250000 158.250000 659 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_range_based_for_loop >> endobj 230 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 645.500000 192.750000 652.250000 ] /Border [0 0 0] /Dest /#e7#81#3e0#26#cd#23#ce#5e#e6#c5#2c#d9#b8#cdr#89#ca#ea1 >> endobj 231 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 638 165.750000 644.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alternate_function_syntax >> endobj 232 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 631.250000 191.250000 638 ] /Border [0 0 0] /Dest /#f3#0e#d4U#c8#191ood#dd#d3#e1#d2#af#a7#e2J0#81 >> endobj 233 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 623.750000 173.250000 630.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_explicit_overrides_final >> endobj 234 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 617 158.250000 623.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_null_pointer_constant >> endobj 235 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 609.500000 180 616.250000 ] /Border [0 0 0] /Dest /#7c!#04#95#b8#b8#abEM#bf#0b#1b#975#ca#cc#80#b8E#da >> endobj 236 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 602.750000 163.500000 609.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_double_angle_brackets >> endobj 237 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 595.250000 180 602 ] /Border [0 0 0] /Dest /#c0c#11#b1#04#a2e#ad#fd#3a#8c#cfS#9a#3b#9d#e6#f6oH >> endobj 238 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 588.500000 184.500000 595.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alias_templates >> endobj 239 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 581 155.250000 587.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_unrestricted_unions >> endobj 240 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 574.250000 152.250000 581 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_variadic_templates >> endobj 241 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 566.750000 161.250000 573.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_new_char_literals >> endobj 242 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 560 150.750000 566.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_new_string_literals >> endobj 243 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 552.500000 156.750000 559.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_user_defined_literals >> endobj 244 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 545.750000 158.250000 552.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_thread_local_storage >> endobj 245 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 538.250000 237.750000 545 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_defaulted_deleted >> endobj 246 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 531.500000 150 538.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_long_long_int >> endobj 247 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 524 147 530.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_static_assertions >> endobj 248 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 517.250000 286.500000 524 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_sizeof >> endobj 249 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 509.750000 205.500000 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_noexcept >> endobj 250 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 503 196.500000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alignment >> endobj 251 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 495.500000 129 502.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_attributes >> endobj 252 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 488.750000 174 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_ref_qualifiers >> endobj 253 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 481.250000 135 488 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_standard_library_changes >> endobj 254 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 474.500000 150 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_threading_facilities >> endobj 255 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 467 131.250000 473.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_tuple_types >> endobj 256 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 460.250000 132 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_hash_tables >> endobj 257 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 452.750000 154.500000 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_regular_expressions >> endobj 258 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 446 185.250000 452.750000 ] /Border [0 0 0] /Dest /N#c1#a6V#e9#c8u#98#87#dd#c4#2dW#f4#2a#bb#d8lX#b9 >> endobj 259 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 438.500000 190.500000 445.250000 ] /Border [0 0 0] /Dest /#e6D#cfa5#ac#3bs#80#16#3ed#ca#2a#a6#f8e#94#faF >> endobj 260 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 431.750000 150 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_wrapper_reference >> endobj 261 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 424.250000 211.500000 431 ] /Border [0 0 0] /Dest /#9bo#fd#c1#a7#9f#c9t#a1#f3#bdZ#93#f4#d6b#07x#2d#8e >> endobj 262 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 417.500000 187.500000 424.250000 ] /Border [0 0 0] /Dest /#3b#c81#ee7#ea#9a#c0l#5e#e1F#a3#fa#7c3d#22#3f#06 >> endobj 263 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 410 264.750000 416.750000 ] /Border [0 0 0] /Dest /#d67#10#96f#fe#06X#e1V#5eS#d5#1d4#5d#91#ee#28#aa >> endobj 264 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 397.250000 84 404 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14 >> endobj 265 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 383.750000 99.7500000 390.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_introduction >> endobj 266 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 377 132 383.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_core_language_changes >> endobj 267 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 369.500000 156 376.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_binary_literals >> endobj 268 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 362.750000 135 369.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_standard_library_changes >> endobj 269 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 349.250000 84 356 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17 >> endobj 270 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 336.500000 99.7500000 343.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_introduction >> endobj 271 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 329 132 335.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_core_language_changes >> endobj 272 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 322.250000 180.750000 329 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_nested_namespaces >> endobj 273 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 314.750000 162.750000 321.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_u8_char_literals >> endobj 274 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 308 174.750000 314.750000 ] /Border [0 0 0] /Dest /#95b#3e#15OH#1a#13Sa#12#bc#c5#e0#27#21k#a3#3f#0c >> endobj 275 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 300.500000 135 307.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_standard_library_changes >> endobj 276 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 287.750000 81 294.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor >> endobj 277 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 274.250000 105.750000 281 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn2 >> endobj 278 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 267.500000 102 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn3 >> endobj 279 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 260 135 266.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_condition_compilation >> endobj 280 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 253.250000 117.750000 260 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn5 >> endobj 281 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 245.750000 108.750000 252.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn6 >> endobj 282 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 239 139.500000 245.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn7 >> endobj 283 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 231.500000 148.500000 238.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters >> endobj 284 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 224.750000 225.750000 231.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn8 >> endobj 285 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 217.250000 195 224 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn9 >> endobj 286 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 210.500000 148.500000 217.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_typemap_delimiters >> endobj 287 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 203 147 209.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn10 >> endobj 288 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 196.250000 168 203 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_warning_error >> endobj 289 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 182.750000 75.7500000 189.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 290 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 170 195 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn2 >> endobj 291 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 162.500000 128.250000 169.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn3 >> endobj 292 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 155.750000 127.500000 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn4 >> endobj 293 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 148.250000 126 155 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_carrays >> endobj 294 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 141.500000 126.750000 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn6 >> endobj 295 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 134 120.750000 140.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn7 >> endobj 296 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 127.250000 116.250000 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn8 >> endobj 297 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 119.750000 162.750000 126.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn9 >> endobj 298 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 113 156 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn10 >> endobj 299 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 105.500000 203.250000 112.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn11 >> endobj 300 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 98.7500000 123.750000 105.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn12 >> endobj 301 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 91.2500000 113.250000 98 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_cpp_library >> endobj 302 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 84.5000000 129 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_string >> endobj 303 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 77 131.250000 83.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_vector >> endobj 304 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 70.2500000 144 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_exceptions >> endobj 305 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 62.7500000 168 69.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 212 0 obj << /Type /Page /Parent 2 0 R /Contents 306 0 R /Resources 308 0 R /Annots 309 0 R /MediaBox [0 0 595 842] >> endobj 308 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 309 0 obj [ 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R ] endobj 306 0 obj << /Length 307 0 R /Filter /FlateDecode >> stream xœí]M¯å6rÝ¿_ñÖL[d±øÜmw€,6Å ‹À“É`0=ˆ3‹üýH¢ônU]Ru)龞¶aw‹—,RëU¬Süî_~þÏ×ÿþûëwŸ~þŸ×_§??ýüÒ}Øå^‡O lü0ýý5D|ýõËËo¯¿½üôòSÿÿß^rƒŸ?ý[ÿ·ÿ{µ¯ÿÚÿ÷—×?üG_øÇ©ÒPáËK0¡ÿó¯ãŸ)˜þoÝÛŸCùŸ_þýw¯$ÎÝMƒá׿7ÉÙa+ÿö2ߤÿýû¯{ù.ßþž> F÷jôÿÊþ÷¿^þ4ÜÕvó(r%:ŠÛ ˜ûð±ï:A–Ù?½|í>ÄØõÏÌûü3–úWo¯h¼þõÅ»Æ$£™jkTz_{¼¶¹É+ok„t3Ôgý÷5"k¹ô?¿|ü{æî9˜Ú‹üm¡áÇ_^¾ûœ^ýåOýOù±üòå%öý(Òë/|ý§®³øÏ¯¿üå%~ˆ©óÇw”1?Œ¿¸òœ¿ýòc­M]Z÷©& rc> ó±ÿñÖ&fi·‚\暤j¨Þ†ß?$ãªmlõƒ5±6XS’Ÿ,~ÝØÆÕncáqÕJõAÞ¿úó«¶þžêϼÚf>ؤx·Õײ0‚êkÑ<»Ù5 öÇ_z̽E0{}‡Ôuo€ ˜hÁ__~~Š“± Š“'ƒ ,‡kÅc `íJÏPœz¸‡âd:!½P<Öˆ¬}äÒ¯ƒâÔð(þ^ÅŸªP\Ÿ³w°PÇ£ª•ò7Ü»Ñ߬µÝ¨‚&½)е@ UA0\Á–T°_©1%鯅 5€µ*}RAèJ*h—Þ_ jDÖ>réª „cTð… fódº>®‚õ6]SÃUð6Vu±®¥šMÝ Ö±E±YxnÕõ‘©·QŒíÞ¬7Y˜UG?TçÃŽ‘Ô'Uý—íëæ…çX»~#jC¼-œ2`ÅF¨Gm4%ÔFà¸Ú_ ÔjkTú„Ú.•PÛE.½¿¨í&œ¾µ\ú…¨þÔ†ú\ªëñµ…S}–+Õ_ꈵ€¦RÁìçÕ5OýFëÊ©øÎ®KS}¥}Ú£Ùnë±~åC Í>fÞщ«úF¬ÔúÐ8êU³ÎVøgê¦vA©ÖžÁú쳡~‡¥éQ…wã†ùåoëý\º  MoC2Â¥¶¿žDwùú×~Bé¹rH;êqÂhÖÜÞA=4 Cjä!¿ àw0 üϧƒ¼A;(KÀ“Q~AÚ§‡¡g¸©þžü {:C Äž¾#ú8»ïˬ:ZÔW~uý®~ô/,²w¬Ûz?O2‰ žúý¼ìÖ| |n¡š_^ܸ$¾ÓÕC£01• A2§Çý$†äiF~"i³!ˆ¡d¢çD/ ÁP#00C@:¸Ð$÷<† *íy·¹¶Ú¦„7Ûä<-8Ð6õÑ7üµ€àî˜}ûâ8û‹ãÁM÷ã?Ø`Q9 |yAë$Âè}j®çÔ§Ö_Ç{ŸšëøváxÍ|j¹°ö@¥>µþÚßûÔúRäÒ;ä>µ\#²ö‘K¿Ì§Öß9<`dmuvª¦üÐ%`³¸ñ¾FMÛ®ùëmÒviš.äÉïæFõ£y šð¦O§þ NŽ×ÙäôìÕÛ¯V /îb X\q‘?ÿÒ¤ês™žraOÔÖ0b²ZuÝ5vþiìpƼô!x¿üXûe¡ŸXûH°a’rÔõ_L5dúeìé爣žLVð¨½Â^‡¢½ŽÂ^Ç;{'{˜½Â^‡¢½Â^‡;{&{˜½Oa¯ã›½®¿k½?³¤=ß܆‚p¼°I¬àQ}JžëS %}J‰Ïø”¤> 5€µ*}Ò§~Ù^Чä„t'õi¨YûÈ¥_§O¦³è“Â-Tß9>kõ•~\oSFÓݨ¶Ÿ¤à@wW_LçÚývõ§í+iá$ç­¿¹P|Š‹Nrg ’5ÆXàïänÀâ|ª\Ò²“¼/p÷Nò¾DÀä¹F¡#NrÖÁeNrg¬9¿ßíGn‰UdÇ)âÐ}h506[øåêëÍׯ ,|ý¶õœì&2ì3Y'yË5.Ž»™¢z·Û·3U.ÍR½¾.¾{¥[‡Pô//ÎcIóWŒ8a<KÆÇvÒxŒ5 @ÚÁl<JƬèÀJã1ÔÈ#fèV”'*êJ*º‚òåÑ•P=aôåÇÈ í`Fy´%”G#:0å‡y„–¡<éàB”Ç7ê÷I(_ß\XyUiPwZ¤á.èWÛ@Ͳ­Š *OÍÚØ¶šXO(ÄЂú¬Ðß%ý ÈÕkôÇ3k €´ƒYƒ)éoèDÔß¡F¡aúì3èoˆgë¯Q¨„f›@Á¥¯·¹l1¤ÚKW iñz³©U=ªr ´`£ª'#T=Ù’ª'Ç5qÜ*`º:Ö@.i³ª§®¤ê1ñb’ª>ÔÈ#옪'ó ªžÂÙª®ðU,¶*Tý¬øŒ˜éÄmyÁÛbhÂ]Þ¦>]ÌŒ•ï2ØÈw¿ ‡Öt­18´bïÁN{7<Ë5 @ÚÁ‡¶K8´ß=®9Ž5ÆÞð;¸‡­¦“áP“Îjǹ û³ýûÿúh¸‹÷6³5„Æ›"-بœ6 å„O³/å¾] V*'ØI¡cÊi“PN[àiö¥Ü;=\ å´aÒF™rÚ'àiöwg+§&ÁQ}ƒï¤õzUlþŽ}¢5íVB^M¬àÀ¥Ps¬é*±þN–5Š˜í ï7¬;’xÐà|éA¯@›‹Ú\yè¬phZ4ÚpÆ2—´¹( Í˜‡n`}°œ—Ðæü„e.0hsOÀ<ìoß mŠÄQ¦NØP8!À¨~ùxHVF$ÄþÙ“‚#?¶ÕU„YˆâرÊùNÚùmƒìî3ÓñYï •fý Üû àÞÇÜ ÿ·ü߯ÇÈ í`†{ïKpﹸp?ÔÈ#ô î}x¸ÅÔ+à^“qªž'paÍrÒNÙ»Qp ²¾£ßñ‰ó•íñiw¾ MPÅÂBe+_I¼ò!k_(Í(^@i %(û vÚ_ X8Ö@.i3”F,Ait¢'¡tÌÂß1ü.…Òt Bެ¡ Û¬4…®úúØÙª 6ÉC± ÉI –½oq{÷gGz-l½«¼RõmE숊i·=”ya£Mw·qƒ†Nr7‚éÝ$_†{èûºûÄþ t’}’k €´ƒ î¡+±O†¸ÞdŸŒ5òû„vp܃yö‰†Ûº#èL¤µ'‚^³m»Ë29¸Á¢§GZϦI…&u[5G¿<Ÿ“eÁA®I.¶¶ï¿©=Ÿt0DÝOº¤¶‚ê¶Dõ±™VR=r äv0#µ-Q=ÀZѤzŒ5òÕƒvp!RÃÛD¹©5Éôª•,°Œù²¹¾Òª¯5×Ö©š¦‚2ê+سÒ+(,A«=? gm@žæ’°Ò~‚Ñ ª9„í¡¤»LÝŠ‚â)ÛhÅǺ‚‚Qð€ –x@ v¹ JP®\ÒfŒ%¾O7\  ˆàwp) Ƴy@ (¨Á“$¿j¤L!O ÷«¾M“&ßÌm\°‡XÕ-ïZî>oÛ¥­þ,­ŽV2 ]‡¥Y¸ Ý®œ%ו8KNìX¹Nr–r äv0Cw*q– ‰=·$9Kc«ã,Ñ®ƒn×ÍYZ€î÷ÄfjK5Üà¸|ïæê[ßhé9maL&~+8pÕÝwDµê]§ÞxÄO!žøp8•/½‚˜7‚ýæl‰ýæÄv—³’ý–k €´ƒ æ)±ßœávÃ5‡ù±F2c¿Ñ.„y{6ûmæ5¼8 ‡¿I¾ÆQ½c½¯‡FD9gQîVp4Qî6UñÆy^“xh0° îÚ ¢ ½õ뢉­+ç$é-×@.i3¢A‰ôæ€o¾ ×Ñ`"½ü.E4w6émÑ4t¸ÏUŸƒæ3V“CsˆÝ€}IÇÁ‰ ® NZ°'P°¥ÆNˆ ç%[*×@.i3N`‰-åo ×'pbKü.Å 6[j!Ä_ãªF-dÑ®·ÙžîT•ã¿ÅN•EÎfNiÁ‘;5‘MT•'¹éCS}áoß»‰âAôÒû½‚AP \(Q œØZqAR r äv0ãc(Q \p¢Ikä2 íàB|Œ§S êG+œQ§áãÁ_†GœÜ¿hBµNBº,iØûÊ¡M<×Úl(=èhK‚îãR‰îãÄÖƒK’î“k €´ƒÚR‰îã’Ø^ä #÷skJBš.BWHß÷ü.ܶEG:H tQBäZõ•$zÂà*Å´W1Ž˜Â»ˆþïq¦lðns•üò‚XÔÑ•u ~b‰Ÿ…bsQò³r äv0¯°ÄÏBìD’Ÿ5ÖÈ#dü,ÚÁ…ë<ŸU_(øY×…·j>[ô>ì§Áé¶Úr$ &‹´`#NÁ`ÂPb0¡Ø¤Â L¹rH;˜q"”Lèù6Ûp-pÂO &"€ßÁ¥8Ng0ÕqBs¶†‚iߘô¼=2hOÄw G÷Ó­²îrl ´`£î'AÁT¢À ØÅÁ$)0¹rH;˜u?–(0ù>Ôp-t?Îʆvp¡î§Ó)0uÝ×P`™–5Ƶͮy“ ëc¬ïBi‹†…§¤pYÞ³ª„B =Q“_CsZCÎæ>J"¤”!„ûVpœeèˆBMã)|·a  Š}Äønw¤,(ˆÂÕ¸°õ£H`¡9O]•ëØÃ'®¦¢ïB§s2U¯cƒ€‚//>¯öÖ|'kÞ”k^ì%{# k¹rH;˜e¾+Ö|ÇwÇk¾(kä!3ÂíàºE™7§Öê‹2amÏùð•K£¯ûx®O.M€Ê!µ…TGÛ7ÖÿQ¶ 6.š¼¹…[»9HÁ‹¦.0(XxŠŠ“UÄ ö†?Åþnƒ-=Ö{cÐÛЋý|’N˜k €´ƒÙÞØÐ[‘0\ {c':!ÀïàR{§Ó ëöFA'ì~P|vj’újŽiФ/>+yý´À¦ß¬;®^*?œbÊá>†D ŒP‰©qã$%š-§kŽO¼·+.–^ÁŠ]q‚~ê],Ù±?ìQÒOs äv0ÛW¢ŸzÇw¸‡kaWÜD?%ø\jWðtúi^Õô¿´hÊŒZH*ªñã4âw{¤ÇøEZ°QÁ¼à/z_â/z±±ê½ä/æÈ í`V0_â/zïD’¿8ÖÈ#düEÚÁ… Îæ/Öã95üEV¢­;´>ê'ôêî[‰BÅg÷[ÁщwoóRÃA¨;7êLÍR¶í*Iå’ÑomLÌ&ÁylзÜÝÁVÄGÌ·UV¾ži–~ú‹K㫟*Žã÷ÇýD˜£c `íJïk×3Ç’·!}ØÞçý÷5"k¹ô?¿|üÝéðG-IP4Ï:“¢íǨ*}†Æ²(4¸q’ðÝŸÃë*‡9žwÓ:Zp YÉ:6aÛ$LÑ,>¾„màéŸâò6t‚˜º13ˆ­¨ÐIbf®\Ò¦%lèJÄÌÐYÑ$fŽ5ò1“vpÝ6˜îÔ¤(zŸôË+ójcø—à­àÈó~"Ÿ8 âÓŽ½¶Æj«. ÿæ~ ©¾ŒÐ$Ü­Ç‚S¿E†¡…hÔgFÆá¶uØÓœÝýÕgo|Wd«]NâènAX.&Z°Ñ~  "D,¢ØÙ‰(‰¹rH;˜í–ˆè@Æy„Œˆ@;¸Ð~øGˆû¡âóœ’PrëÜõäH"`†N[¶Ò—¦&êùp_Å]Tlº«¶óê ¶‡ÔÝáõ§£DÜÚBgÜÆ{¯3+xÄéR1”N—ŠbÏ.yºT®\Òf¼¥Ó¥bÑ<]j¬‘GÈN—¢\ˆ÷ñê‚ê`QÍÁyš#Õ5ÔR*¼™m!«1‘îr@¿_*\ɪOÍ¿mg»§nË[¼ª“ƒã>_DšÌ„ß> Ÿþ2ÞBr=t´àñEx¬‘ÿzšÌ[TMlSõ&ë<¾ü KnqXѶRˆJu«GÊ”âɬý²ÐO¬j;ÌuýSßhغíoÉP§3+xS›çÔ&WâÔ&Ç9µÃ5çÔŽ5€µ*=sj“+qj“!]rjÇ‘µ\úuœÚ„o Óªƒ¹-5¬û¾úËY)¦4iœN1&Û­‰ž÷’XÁ£úDZÏ×XÒ'øŒ÷AêÓPX{ Ò'}òPÒ'o…t+õi¨YûÈ¥_¨O¡{DŸ|$U27Í*WÁoËeVe¦Ð0£÷ÐË9TÅöƒè–ì‹é\{×ôrþÐ&NËýS\vT¥(8˜)–8˜)òX“áš;ªr äv09ªR,q0S4¢ÉÁkä2&íà:GUŠéüj»†°?V×ó?ÁÁ)OŠ9Vi©ÆÝÿuŸC>~ç&r\ŒÚ™º&K¬^†¥K¬þ¯p¿ÄêK‘.‚Æk¶ÄÊ5€µ*}\bõ5÷K¬ñKïø+׈¬}äÒ/[bõˆ@Ô·4@­uû]¤êÖ¬u´àà4@d¾ëuh9 PÓ§¸àÿÃnCÀÝ7ÿßyþ?»uÚ fÃÑÔO¬àQc„1 Ec„1 wÆ4LÆ40c„1 Ec„1 wÆ4LÆ40cžÂ˜†›êBßüä¾Îÿ׿3ÂéK¬àQ}J†ëS²%}JŽÏøä¤> 5€µ*}Ò§Ô•ô©ÿeÒc’ú4Ôˆ¬}äÒ/Ô§ѧoþ¿wæÿë_øE5¸²HÁÁþ?2×Þõº’?´ìÿ+<ÅEÿóWô…ì})‹#¯™ÿoª\Ò²ÿMWÈ^Ñ—FÞA'²Wäã;š½‚up™ÿ¯…?¿§—¬S6v¤oÑøØßÔÇ£*>mû™j{ȯm·û‰u p´àÀìêàØœ^x}ҠƱÛ6æ‘i…Ä[NXó¥×¶Ì6 `†BоÔrÜ+ì„ÄÐ1`¶I³-$ èKïÀ Ì6LHl#fû (p¸µ“Y“³'\ç’¸:ˤ~|æÔ³&‹$KsÇ·£~§f+ÃÁýZ‡ˆÃ}Gt å[Hâ¹ö÷©ô WÓEœ®Ÿ lh$râ •.1ätQ §+ägèK=ïÀy‰œÎOPéCN÷ùúÛw'#çêÓV]E¾I¬ààÔ=ä¡Õó²îÉĨYQ7ÉТHS¦9‚r!t½.­îéh{ÒpS†ÄWŽÝBÏzìNF*ÞVãé™ñÃu,xXØS0yOxIÇÀÚ•ž=¬Æû‚‡Õx¾2\sëX#²ö‘K¿ÎÃj¼¨óoÛÿ­uû}lÿ›@Ž`v²oGoÿß&ì»vÓò‡6mÿ·|ŠKÛÿö-„b’«¿Ô·Ë?ÖT{rKúv,§Ò>W]E¶ö%» íc­MWwŒVG`êªþK5Сš0Áè¦íÛQ¡S ܘZ(Së¸1µNÓ±°ö@¥gcj¡dL-pcjAÓ±Fdí#—~1µoa5¾x[§~ݤJÀ¨a³jºÓvCë–²a&ùmöÐ’˜ÛZð¨R’Aù:””ù.¿31ÅjkTú¤”oÙ}x['¤;©”CÈÚG.ýB¥|K7ÓX)ÝgVJMîULÄãäéQåH2“-xTår• l_¹R„(U.ĬdÁS• ÈU.h°})é U.@V²à¨Ê…' Á¢}ËÏÒVåTŸ›š€M~èË·"pÁmT9’®Àv¬àÀ¯¾ŽÏ(ÍûTA›;_›ˆ·4}fò×öR&Ç‘2Î}iàX–‚DÊ26&¤H™GÊT 8÷¥VH·)“ÍØ˜€"ez‚3§¤‚”Š£­L¨jÉŽ½Eñ¶t  ÏiqÐA£Oèg"-xPKÁÓR0® ¥ÐÏRªG0æ§š6ÖÖ¨ô¬¥`lAKÁ!Ý-kDÖ>réj©IÇh©f_wŸ×sÒ×Iõó¡ž'ö|€%ç¥G Õ'à4€M„' @ÒdÆÀÚ•>é”h2.i2cÈÚG.ýB}‚xŒ>­ò³ëû ¾!¦ÉþÛø4šúýT5º滲…i¾ì ¢C:GBàœ·‚GA9w°Äᙔܡ±°ö@¥O ƒ%î8îU®ȸÌ"í#—~!È`8dÇÅ,¡àµÍܼ'Fý‘3[ۆ͜„¦šx*Ͷ¿*­õ5')ޏ‡äx\Ë ¶EcB#%‚ðDÕã5ÆÌ5 @ÚÁ ¾D0Ï FÃ5ÆkŒ#ôŒ`D;¸.Âã$kœzè0¾O`tSf7Ç`Ü~ù~~Ô;>)ë“Jñ‹jÔ÷Ú}ªNÞz›™„15¹k³1˜aAG ŽóÅ1Ì9ëµ­=´o–{ËÄóäË Z_š8+¦; ¤ § A’´\¹¤̦;–(h9m¸¦;N4"€ßÁ¥¦;½ñw®7ÝŠX†o¦û½šîg6Ðkfx«yL„.6d@¸ÈË žëõ7tÇåãï¢_R8'_Î^3×Eæ5s]*x͜،ry3Šx¾ÆÀÚ•ž½f® ¯ÙÀëfÒ;/¼fcÈÚG.ý:¯™33S­±Uj{àêWfaÚ w„Ùæræ:g§F9Ï&îÁç,ª8õ~63FøãünF>ßGÓòàgKÁÿNl;:Áÿc `íJŸÓ–‚ÿå[¦Ãµ@N›ƒÿIûÈ¥_ˆœpLð¿j³ñs9ë+‚zΖz~ ³–Æìþf ""‡Æ=pÝFë·pÂ!؈<Šn޳(œ+±(œØïtN²(ÆÀÚ•>¡›+±(†•.—.YcÈÚG.ýBtÃXmÖ¬šþ…sÎ4G9×ý%š¯' ê<ËÂp×Ó©[ ‡Y•Lo—6‚Þ¢-¡s´à@ÏC縎jh š,¦-òøN¬átƒŸ?ùÁ7cÛ¾Š%~µ‹o¡'ugìûL¼îWV¥_°Êu÷§TµÍ”Zg‹ÚE’ jع<¸Ô@×hJK 4|©1\ó¥ÆXX{ ÒóRMi©Æ ér©1Öˆ¬}äÒ¯[j ]_j,üÒ65êI ŠúÆôe,jU*)Ívìû¶H—¯¶¾Þ,3h‰ýö¬àÀ¥”çtÿ‰^7Mš5ìö$6÷ˆ†‘8`Ã"Ë‹—4næð—ôˆ%ÎÃF(ñ°8{¸–2›´*}²¤Pâa#€.yØcÈÚG.ýBKêÖyØ*KÚö` „*>¦ëÒîaêN鯇yM†“ÎJlUŒŽ•} ÛB“ú<4©ÿ§š„È#‡†kš”k €´ƒ)4©WôBhR¢+B“Æy„@C“h×…&¡ß€Mq£ñ¡Hwëßw©< 4¸Q­Æ`ô„Zì‘lÔ«B¯Bá8ྔ§6®…^?)RpL¯Þ:˜õ*ŽîKèÀH½ fR¤`™^‘.Ô«°Î#>M¯46üN¯žÆ@7Ó•HhÃãú6vût%Y¡+ Jº’Oå„RWÆÈ í`Ö•dJº’:ÑA'ue¨‘Gh˜®$û º’Ö9ÂgéŠ*ïЮ4ͭɃ}?¤VJ“ Ö³‚mJãáJã-(7ŽÍi?ú5é¬Ï5 @ÚÁ¤4Þt¥ñ]âtI(ÍX#°£JC;¸Ni¼Y缞¦4Š4÷3T“ÄY‘Fº•&xCN^s<è ñp3LùÚ¼!^ø+|öWÆXX{ Ò³7ÄÛTð†xË}-Ã5÷†øÉÿAÚG.ý:oˆ‡u®¤F9g¥«·ÙqäZ}õuRÄVã\ÜuМŸ°v§ÛÜžäK¶Ãé^·‚VÏ &•Ç“Ê o‚GɤÊ5 @ÚÁlõ\‰Iå÷‡ ×Â깉IEð;¸Ôêá:“ª­b7vW|®‚â½Õ³Ñ÷iQc¾Õ;ª¼*AzxV¤‘ʋó¼/žå…Æyx–ƒ&ÏϺu0#•/žå=÷0 שütxÀïàR¤ ëìšÓª)çsAYž†`¹°ë­AÃýð]|ùlÅ ’Fí ’Æ³‚1¼ˆ±„ÂGå'Qø±rH;˜ñ"ú^Dîe®^ 5ò=Ëž/Ò:§ä,¼Ð|æ,$–» "­êÛ:jLulur¶ú š<ÕWlõ6ŠG¬âä(N9Øcs4\ŠSÃÚ(Bù's±µI6n×/ƒHÁ6Ô稺P@í œ¤ar’Þ`7×@.ij‡ ¨:':pµÇy„HQ›vpjsL« µ[xaŸðƒ®•Ã6䨑<è° –‡¯[ _ Â¥¬ _kkTzvØ[ _ „t¾6Öˆ¬}äÒ¯sØ8&|M¥UêE=DÜTÓC=!w=ñ|´Ý]j”ú/ï:jx›6lÜÖZ°Ñê94\)h,'ip2h,×@.i³Õs¥ ±à¬è@5òYÐíàB«‡t²©¶6öÂn7rõos÷cõ»£úËÕÖu«¥DE–hÁFEó"Š,øRY>¾àeY®\ÒfEó¥(²àè@F‘5òYíàBEóÇD‘©MEv•¢í¡õìøª^û°Ûª_$%² ŽlÔ¯("ÏB,Ežá QFžåÈ í`Ö¯XŠ< ±Èȳ±F!‹<£\¨_ñ˜È3~µ=`]³T]è§î¹;b{Ž”…Pí“ÎÑÛÌYÈjKÒ¡B—hÁ6µˆ}‹])ö- §Hìdì[®\Ò&µ])ö-$áÖI2öm¬‘GÈbßhשm?ÈçQ[ͦ4‹ªiëµndë'£k´T“Áè.Î[E«:‹ö=±6BW$Ù2‡sHÁ]?½üôú[¯•7+(íOk~[ð¡MZ‹<Üþ÷f©¿¿W;ošO–­ô"³®„ÂζÈÞ狘NJ*d’€¦6“™¼Sìz¶ÛB?°6ÉJcû<ÝéýAÑÕ s¦Ûºê`Ítëw78Í­’øPýÅÕnÃÔ¥UÛLºbvÝ:9iQ;á‚韹Ãß›~è|6Š^ì?½þôòÿfêæ endstream endobj 307 0 obj 9884 endobj 311 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 778.250000 182.250000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_basics >> endobj 312 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 771.500000 207 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_inheritance >> endobj 313 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 764 230.250000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_overloading >> endobj 314 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 757.250000 203.250000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_templates >> endobj 315 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 749.750000 200.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_directors >> endobj 316 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 743 162 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_auto_ptr >> endobj 317 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 735.500000 110.250000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn16 >> endobj 318 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 728.750000 132 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn17 >> endobj 319 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 715.250000 95.2500000 722 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments >> endobj 320 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 702.500000 130.500000 709.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn2 >> endobj 321 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 695 135 701.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn3 >> endobj 322 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 688.250000 148.500000 695 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn4 >> endobj 323 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 680.750000 153 687.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn5 >> endobj 324 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 674 168 680.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn6 >> endobj 325 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 666.500000 161.250000 673.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn7 >> endobj 326 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 659.750000 164.250000 666.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn8 >> endobj 327 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 652.250000 173.250000 659 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn9 >> endobj 328 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 645.500000 155.250000 652.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn10 >> endobj 329 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 638 204 644.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn11 >> endobj 330 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 625.250000 69 632 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 331 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 611.750000 102.750000 618.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn2 >> endobj 332 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 605 147 611.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn3 >> endobj 333 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 597.500000 131.250000 604.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn4 >> endobj 334 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 590.750000 148.500000 597.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn5 >> endobj 335 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 583.250000 153 590 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn6 >> endobj 336 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 576.500000 194.250000 583.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn7 >> endobj 337 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 569 197.250000 575.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn8 >> endobj 338 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 562.250000 221.250000 569 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_aspects >> endobj 339 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 554.750000 164.250000 561.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn9 >> endobj 340 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 548 134.250000 554.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn10 >> endobj 341 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 540.500000 154.500000 547.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_defining >> endobj 342 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 533.750000 146.250000 540.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn12 >> endobj 343 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 526.250000 154.500000 533 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn13 >> endobj 344 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 519.500000 154.500000 526.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn14 >> endobj 345 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 512 165.750000 518.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn15 >> endobj 346 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 505.250000 131.250000 512 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_pattern_matching >> endobj 347 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 497.750000 158.250000 504.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn17 >> endobj 348 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 491 180.750000 497.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typedef_reductions >> endobj 349 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 483.500000 187.500000 490.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn19 >> endobj 350 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 476.750000 174 483.500000 ] /Border [0 0 0] /Dest /Z#18#b3#02#ab#13#f1#c5#c0#f6#5c#3em#1d#908#be#06#83#b2 >> endobj 351 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 469.250000 218.250000 476 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_matching_template_comparison >> endobj 352 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 462.500000 203.250000 469.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_debugging_search >> endobj 353 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 455 130.500000 461.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn21 >> endobj 354 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 448.250000 120 455 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn22 >> endobj 355 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 440.750000 180.750000 447.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn23 >> endobj 356 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 434 148.500000 440.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 357 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 426.500000 167.250000 433.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_macros >> endobj 358 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 419.750000 180.750000 426.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_descriptor >> endobj 359 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 412.250000 219 419 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_typemap >> endobj 360 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 405.500000 211.500000 412.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_attributes >> endobj 361 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 398 253.500000 404.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables_and_macros >> endobj 362 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 391.250000 144.750000 398 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn25 >> endobj 363 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 383.750000 136.500000 390.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn26 >> endobj 364 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 377 159 383.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn27 >> endobj 365 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 369.500000 140.250000 376.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn28 >> endobj 366 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 362.750000 148.500000 369.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn29 >> endobj 367 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 355.250000 150 362 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn30 >> endobj 368 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 348.500000 147.750000 355.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn31 >> endobj 369 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 341 149.250000 347.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn32 >> endobj 370 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 334.250000 150.750000 341 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn33 >> endobj 371 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 326.750000 153 333.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn34 >> endobj 372 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 320 142.500000 326.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_ret >> endobj 373 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 312.500000 162 319.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn35 >> endobj 374 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 305.750000 148.500000 312.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn36 >> endobj 375 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 298.250000 152.250000 305 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn37 >> endobj 376 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 291.500000 153 298.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_throws_typemap >> endobj 377 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 284 138.750000 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn39 >> endobj 378 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 277.250000 158.250000 284 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn40 >> endobj 379 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 269.750000 210 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn41 >> endobj 380 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 263 176.250000 269.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn43 >> endobj 381 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 255.500000 202.500000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_optimal >> endobj 382 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 248.750000 139.500000 255.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_multi_argument_typemaps >> endobj 383 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 241.250000 125.250000 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_warnings >> endobj 384 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 234.500000 128.250000 241.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_fragments >> endobj 385 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 227 183.750000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_fragment_type_specialization >> endobj 386 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 220.250000 237 227 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_automatic_specialization >> endobj 387 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 212.750000 144.750000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 388 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 206 147.750000 212.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn45 >> endobj 389 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 198.500000 123.750000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker_usage >> endobj 390 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 191.750000 147 198.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 391 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 184.250000 315 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typecheck_pointer >> endobj 392 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 177.500000 157.500000 184.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn48 >> endobj 393 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 170 160.500000 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn47 >> endobj 394 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 163.250000 120.750000 170 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn52 >> endobj 395 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 155.750000 165 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn51 >> endobj 396 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 143 107.250000 149.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 397 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 129.500000 167.250000 136.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 398 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 122.750000 183.750000 129.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn3 >> endobj 399 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 115.250000 193.500000 122 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn4 >> endobj 400 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 108.500000 169.500000 115.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn5 >> endobj 401 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 101 189 107.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_allowexcept >> endobj 402 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 94.2500000 201 101 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn6 >> endobj 403 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 86.7500000 190.500000 93.5000000 ] /Border [0 0 0] /Dest /#1c#17#e6_#0c#8f#86#cb#db#8b#17p#18#0e#b5#f1#f5.Q#f7 >> endobj 404 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 80 193.500000 86.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn7 >> endobj 405 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 72.5000000 163.500000 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 406 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 65.7500000 166.500000 72.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 407 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 58.2500000 150.750000 65 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_attributes >> endobj 310 0 obj << /Type /Page /Parent 2 0 R /Contents 408 0 R /Resources 410 0 R /Annots 411 0 R /MediaBox [0 0 595 842] >> endobj 410 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 411 0 obj [ 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R 343 0 R 344 0 R 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R ] endobj 408 0 obj << /Length 409 0 R /Filter /FlateDecode >> stream xœí][¯$7n~?¿â<ðqIu‚  ÈC‡À»›Åbg‘Ù}ÈߪT=M²¥j5».}.;XÏ”ZEªªÄO”Äúþ_ýïçÿùÇó÷?þú¿Ï¿ÏÿøëÓðp(ÿ{ÿ|G l|™ÿý">ÿþåéëó×§_ž~ÉÿýúTnøõÇÏÿú¿gûüoùÿyþÏÿÊ…˜+¾<òßþNÁä ßþËÿüôÿôü·QâIÝÜ~ýMÆF\Qüõéôfúóßÿöô}yü[t`´þÙ8pÏ&9ûü÷?>ýi|ª~§V”J´ç0—`‡uO¿¸¥?}ûÅš}îi·mø±uÏË=gÅ©©Ø6Åÿ4ý‚/`£á¿4ï1®õ‹û¹y4[àšØn[ó¥À xòE8À :« ²j¹÷§ß²±;xÍRr?ÍÝÔóË@㌡}úõ>#D{¸úS{d#üéÃW1Â…' ·?Ϭ§×ļùfb"-Ml›þ?*¢ý@š/ ÝqÚ`áã´[ÐüÔšÏv ˆ¶ók‰“1xùµîÄì´ ˆ!½j@´ÍÁô_ ÆAâ·‚ÍñÜÿKï3pzk=àÖü PéÕ¯³ö©ÛÒ>Õa料lb£ÛŠý_3Œ“>†pÑÇî‚ñ4ãù_5Œ7ïù€ñ×ã) ÿV°9Œëÿ ¯³ýA›Ðßþlmd\øжuÏÞÅÏΪò܃riHG£\2áu£\û+ ÜkA¹d"G¹sÁÖ(Gú¿Æ“Rt‚˹sû;6ÂÅ7}óSíÍ7!̸ì£%8û€syÉ~`ž†ˆå_f,…|æ]ˆrý{ü‹1ÉÆxª\Rcý±À¦rÓ3»}º& òõxiÂXcjáY‚ߟþ,}6hÇ~þqpX© 3”ör‚¢ã”£Ç‚«£=Úm¿üö£·D1=T9[?uâÑhÙ Ây$@O îp¶üîìÆM×8Ì0ãýŒS©}öømKyºþýÉ»gÌ\Øý@¥çÚÓuœ1†Ýë—ž¯s}ª¬Ùý‘KÿóÓ§Ú£â0Bâ6¥€(½×˜S÷íé£Í¿°$£XP#ø¶áâíæÙÞë\XsZw/áþ™Uœl˳Hk-èô=|¾‡O5ßcº&®A¾¾Ç7gƒ@ªàä{øPó=¼ç òµð=Æ¥…ùDÁ¾Gp;öÊ!m=?HSll\­åO´m¦=·§WÍ·4ëéTž mÜn;Ü?½Š­!ãù;? I|ˆæCÖ^Ljv¬[è?wÿbÍôþÉ=6ÓKð(ô|nþRÀѸ“¸ó/m7´©gökPÛ~ÒÏÍ'½æp×ZðSóÅ·¬ýÒÔ3¿ëŽaàÙg1g¬à>ϩǗ¯Ó¥Ççg¨O6]3¯Ôv?Pé“Ç—¯Ã¥Ç—K=—ž{|¥Fd÷G.ý0/?yÇÀÐ ŸYä!4{›&„¢=˜ôûu #„f]\3]ÌE¯ µ¡©íž*üâ½ÜÓùkt¹š¹#ÓÐÒ‚.WÓ˜«™ ⥫é?POpºf®æ\¹¤ Š«™ ü¥«™K‘+È×ÌÕ,5J =q5™‚Ã\Íüø°3¢¬ìjþÐüE³jÒž|)"ÚnXrÖ{°}Þhîîl‹ÑÑ‚N[ ^Øb5[ ‰›J¾¶8Õ@.©‚“-f¹b‹yÚÄ8i‹cÒBd¶Hh‹Ñ>Ž-j‚p¶¸°ù¬Y¦V¬Èjƺ×`Õ+UÈiï’O1þçõ]khA§ñ'ÆŸ|ÍøSä¶™¢4þ©rHœŒ?¹šñ' @ÿX£´Ð1ã' Ž3~3tPgv2~MÀ©-£‘±§Ÿî2äX8ÌpfÈ-èƒc‡c° Æfµã5‡…R¹¤ fX0ùå^‚1V(°¦¥…@a*8l‡!ï šÆÃ}h¶à²ÞdYÂ8 @ :! @@¸dçˆ^BÖT¹¤ N¶Y`„#!k¬QZhdBtÐmö‚¬u·²o`¨^ é¿-˜G gcó¥4QY©†®¦À½…7º.†Ý†:ŽÐziÁ»%Y<Û-1•Ý3ê$ûfZ¤;S `÷•^vK šÊn‰ÉoŒKÄnÉT#²û#—~Ün‰Áˆˆk#PöDÌðâƒáû†íñ\˜ë²D].i*6Ø/V±T»à­bwÑXÅÖÂ[jKÓ|Ò½¼SÉÈ[ç6»¤Ý¤U"22O?Éâ¹â+#|Å`k¾¢X‘6óŠ4qö¦È UpòÃPó=_S¯…¯8Ö(-˜¯Hè+†¶Ëª½òö“iÁúBpãªL,Õ–úûÃê5bÕ4~æŸ´× „«=-èIJ4,KÆH.å ì&IJ3x%ð, Ëb…1’KùÁx-°,žÀ+&†eé#¹Œ‘½°L³}× m{ÇððÐn›©&Âä€H úp‰ã„5C'¬Xq·óŠûÙÐK ä*˜q±‚#S—)‚À‰©Fir¤8A‡ÖtÐ6v ÍNßÇTöíáßaSÙvc›Þ6ï&9O€hÍ9lɤ’t—õ!`TÄ  =¦_4÷¬EÛ=‰=fpHë¾ù%þÃ8~sç¾òÞ›L‚6+`þеXèOÍnl[÷´¹ mþCûË·õ˜Ô»d’¿’!Ñ‚;×¹m`Û•5ËAšåÄÖIÍ*5 @ªà4pBšå,ß|¯ÅÀigjÀŸàЮS³v8Û9‰ÏOªaÆß¬8qà¯U»F7ŒËý»T*?~ë#2²¡–gw†Fæ‰ txâUÑÐD‡À‚Ý´!EçÀî*½„F:w"U±{]äÒ]¡‘SÈî\úq¡‘¯s²T öæ:n8ngÿV‘Çd~nXNÚé쀛øéŽd7žâšÏN\-j\-'6¸\\­R¹¤ NN¯qµÆó™/¹ZSÒdÆÕ¢ t‚ÂF¡Õ{ñÓ •à¦Ír•Áµûý^)’ÞTjù^׃d^†ì¯“‚Nœˆ"VÜÅZ¬¸4.ÉXñR¹¤ N8k±â.ò-¦ñZàDœcʼnþ‡âDÚ(V|¯ôDoÔ7¹!ýêsõÚd¢àŽôÙ$"‡X±I óhdx©\R³MâP Ço-Œ×Ü&§¥…,œ*8Î&Ñl¾ÏZ“¡Ý‰cS¿ËIúãi`>t‚€îhkî(ÑÊ÷R¹¤ N `kîhP #ܧ¥…,Â*8`£w hò'+xU²(Í4ø'îÆ ’s¸àÜNDÅç¯Tà ǣâÑɨøR¹¤ N8ájQñè@(QñSÒBOˆ¸QT¼'4Ñ=m&Œfcÿ†S95 ’ÖÍà¶Ó>ÈÑrÏ¢b’Q¼§wnT 9Bª\ce£=ϲ€Ób Ýl˜j»¨ô²Q*è­nÅFÅT#²û#—~ÜF†ëË|üù`Õ½NVÝJ[Ðmâ“ÊI¼eIŠÜ‰ä{.ètm¢ˆNÇX‹NG±tˆQF§—È Uprmb-:£ dtúT£´E§Sº6q›èô½RÊØŸpt­ïÂ×ù’‡’â·µà-èC?ˆXj?Ôb©½XðôƒŒ¥.5 @ª`F?Ôb©ý02–zªQZÈb©©‚ãÄÛÄR¿•Œväªf³uÕˆ³ÇÍŠÕ…Þ7Eþz’¨œ¡ÛEþŽŠ˜…¼Â±âúû¯sÌgékï÷ [¢ëm-D׋µgoeˆn©\R'<¶µ]oøêùx-ðØÌ!ºD‚CñØn¢»×DsÝè”…ó¢Y‰zUkGnîc¹¹Þžcq\6RÐ «Näà]í /–꽓9”È Up‚U¨äào6Œ×Vá„£Àr  „U·Mаêžk{†½Ë‘ˆÒÁЂí|¢Q{¡ ,ë"tGàsÓò5‡§¶ã0Úϳ×~ÉÌÈG¶z1UôòñpœTëöW0E uvvk˜êy µ÷2ºÔ@.©‚¦b-Ú#¤¯¦âHMð'8Sý6Ôª{4ùÚÐõ }¢ÞA߃lhÁ†ƒFXÙÙYSQÖò4'ƒ­z ïU>õæ\ùv #”$Ïé$C½ý‹ªÕ;ܦ‚û§Â6¿<á´*sa¬W†º ¸>Ô¸^l‡ù(¹¥rHœ†ºPãøÀ7ôÆk1Ô…™ @ð'8t¨‹ÛpT÷h²A)VeÚÉ’@Z“çà#;ç݃z$üiÁ–«ã‘[†fðû1Ù}µ?òþ2’5E¹#jÌ“ Ëu¬D…q q]a‚wù5Õv?Pé%jÌ'_‰ó ™ôñšGM5"»?réÇE…aŠ‹*R]CWQì˜.aè5K+š¡ãiæ¯gÑ;NÆLO‚°´ Ïi Fðd‚©ñd‚Øé FòdJ ä*˜Ö`j<™`œP y2SÒBÆ“¡ ŽsZƒÝ†'ÓF’Ýbߟì9rÑ:¤½«#@ÕÄFKÉê(5 @ªàÔ«¡ÆêBduL5J «ƒ*8°W»mXª^­9’[1»Ì}²WfÇug`[œ [û,í!®Ýêþô2 âÛM’GŸ­ûÚÒfñ›ï~wŽÑœ‚ŠÎ˜‰âЈ€µC#‚ØH ((5 @ªà„™X;4"  ä¡SÒBvhUp fúëãð^˜© *jz'ªúûAÀŸÇã IA'Á ¡Æ b‰9É)5 @ªà¡Æ Á’32Õ(-dœªà@qF4  YŒøG›¨C$ti0JºÇ Ô&òn¯Yнè&ŠÏÝ€)^M~„q¿+åâ¬B–”†gÌþþǧO»£µnüi#¾Éª(tÇBFÇÖîÒ9ÉFO 6ŒÃÈŠè'Àö‹Ö¬â^ÏÔ¥4M`ERuçšmÛvãÐao¿áÝä4§býætˆC:¢Ùˆý°:(„ÚFøªv¬Ûö£ Õ¤.WìI9hbÈMpô?lx2…°™­ûË«Üàï†W'¿#f<¬|ÇåÙjA؈P#lD± A6J ä*˜g«ÑÖÑò}„ñšÏVãizJð'8r¶a#†f$Ф1{…³ÕÎÉ\Â;ÁH 6t]1ò^ñF¦ÑýÊšã× ~@¯Cõº4c’¢i(·)æÆšˆ‘>si½WF8'è3kô™(öL"JúL©\R§ÎÕè3Ññ]ŸñZŒpn¦Ïü áp#úŒf„ÓÄ¿á½áp’LáνâÝp«ppÎøÕu±*çÎëÝù¤Ÿ½“Ûœ–‡ß¢pøåÉ—ÁÝß¿9Æ`Gž—ëT‰ã5‰ðŽÓV,sÄ8¹¨ô?}¨ÄÇ)*‘ŸjDväÒ‹a#ª’f¬‰×aºnTõ™=ð²ëMå¹ãÍcVÐ9c‰âô•cmÆ’x*¿ñZÌXÒ|ú €TÁiÆk§¯ÄÈ“Ž×bÆçÓWˆþ‡ÎXÒFÔ”v¿_5 Ü2…Ì–û\Ãi¯ZzgF‰;¦Õƒt¹#«ç¶˜†¹# œÜ1^s[,5 @ª`¶Å4ÔÈipB$wL5J ¹ƒ*8Γوܡ±EÅ®ç‚õlk#·1oò³(x—è 9úd$šž :ÑÁ ’L²5’L›[ÉJ’L©\R't°5’L² H’ÌT£´‘d¨‚Ñ6"É(ÐAð½`=Šü\m»zŸV gZ†M‰tZ©´Œäj´Œ$è““´ŒR¹¤ NVêj´Œä¬P iSÒBFË  ´R¼îÍîf¥Šˆì¶õ¬›yoå3Š?Ѐ¡ ~ƹ  ¼àg$_ãg$ÏùÉK~F©\R'4ð5~FòF(üŒ©Fi!ãgP¢ßˆŸ¡AÅb߬šD¯œÐï !Œqç‚N4ˆâ\Žkçr$±–¢<—£Ô@.©‚ÄÚ¹)B<—cªQZÈÎå  Dƒ¸OBƒŠè€ëù˜€og¾‘“a"-è2ß2óÍ•cr)[=›®™ùÎ5 @ª ˜o.¨ã’XÿKò‡©Fi!=Æ)8Ì|s+6"2hÌ÷‡ví?¦ówÚ|îj‘ Ù¬ Óæí lÞVBÖs)p›· mÞÂläÖ0›·ƒ°yS YÏ¥‘+0"d½Ô˜Zh³yû!ë¹…¬klþóš6¿p¢•"{ñ‚±¬Š-ï ,ÉŽo-èDH \%¼7—Zn¬ÎJ4pv6704€$Ð*á½¹4p$@˜Í"Cx€ðÞüÔ…÷*ÐVί›Æi/lyŸhàλí@ :Ñ£@¬$_{›®ø“ùcbh€Q VˆçRÏ —h€~6 ðˆçÇß;*O:Š˜æ»ÒØï‡oÏìדз<£&ö‚°ßP } _-›®…ýÆa6X"©‚“ý†Jè[.E®  ´ß€³ÁÏì7<@è[~ü×ú¶nPœ&€TÅËØ)eåûDxÞ«‡Öv?Péó `cm°K·AcÈî\úƒlE­àGØÒ=ýԃŨҌŠlª·¤ÛÕÕFE+‚ÎUÍ4mÕô“ ¡ò¢ìµtb$Ð@ò@ 6<À/+¢°n@ñBH☙½&ñí0ÊË…»5ò(/x×:;Î;ä=)ÏÁ¼“]ëžá×E>üºJ2á`Åv¢E#‡_œ\—èðë"~]%™p.å[¡ãµ~/® tøuL8?ù6´ !É„£çð¹… ëúö ϳגäMcžÃG_’lxZ‚ ¬¾ÍE*ñ:Ç-X/ßï=éHk9BK!lÚ9e 7Öv?Pé3@z_H\ºG cÈî\ú¶á…¬ËÑz]ËW ÏXµ9º—/wÓZD ù•1Ñ‚{m=znë1Ôl}ÌéL­qÚõdö:Öv?Pé³­G¬ÙztBº“¶>ÖˆìþÈ¥hëiǺ|®·bë Z¸f q7ê&Hç(Ë<êÑ‚¾ “†“Îä€A29J ä*˜ƒ(`¨19`¡@29¦¥…ŒÉADf&‡ÆäW> ¡ ¯Ô¾nÚWCR G NY²"Ú¥¶NtÿºkJ³¡{ñj“ÅÜŽYïQcD…«u±+nlˆ3&ùak%§Ô@.©‚†ÛgÌ)ÆH"ÎT£´q¨‚1®ãä`¸†xûÖ0üàÃ{ ³YÁ†{!VôeEä…7¯9Žm]ؽNÞó­°fÜÏÍÕ‹&˜º¡Õ6 ­_Lj>Ïç–b?µ~ÑHÃæm¿ƒöó´yHí¯Íйö»n?)@Ów»i'ÅYúï€lHowÀÍ·=Ljø& òšQD3ÅìW¬á.œjDväÒœ ºmøHë&Hm3•TY48ÞNïÕžÛ®š|y!j¥ ƽØî£%Öv«¾·0%w}Ú/å‹Ucôý[?ÓäÓ‘ãhœ£÷B#r&’ÃXƒFÏ™HÎK&ÒTØý@¥ÏЈ5&’CÎD¯4ba"‘û#—~ 4ú½™HšCâfi×’y\d$ì zY—|ݶlÍ6ÎÂ= ú·†¿ôLqž&ÙÁãz‹íŽØ‰•ž¼´à^¬ œÉåBÉågr¹ ™\S `÷•>ce¨1¹\pBºdrM5"»?rébeܛɥÊÎÝ\O‚Oóš È ö/»åóocñ¹ù¬³ èë&•\É—Š„ãå-¸r|H¾†bSЕMAjãc `÷•>ãCr5|HbC3ć±Fd÷G.ý8|ÀaoÚ—&)a{5^µæ³êTj®J¥v|Òý–4À·îÛÙ> HÁ·¸s8s•<Ò‚û·*b ŒF,‚oámŒh?}jöÎØôý?Ï>DkG¨íh×úí§–´¹×Ô‚ i»?ÉYÁ5ß¿Ö)›âÛ×ÀjÑ|Åóªyížæ¶Ÿæy>XzÃ]-H½f‘ÎË6vܳ?ÜéÄ çN úšƒž;1ã5wb¦Àî*½81èkN zÒ¥3ÕˆìþÈ¥èÄ„'¦¹º½nHA{+ùâ|œ[6PWM»¹rÇ6T®º¤¬án­»(öp™ó§á:P‚¤[ü#³»…Eýþó¢×zˆð‘ ¦ö)–#Ö0 "<Æ#(¯yÄZ©\RsÄÆ£ $~ªQZȈðTÁqk˜:æ¡«ë" 1Yo Rߥ÷{r§o¶<=·4Ñ‚ ‡­¬ˆÂÅ«vL:F)þ^Çê†Ú‹¾2J‘sÃÇZÎ /6}”97J ä*8R¡–sþE:^‹Q*Ì97ˆþ‡ŽR±#çÆ^£”&¢¿™âsÿÞFäx!‹‘l™H3ò^ñ¦|èG:Àý#”…÷é<€­uò+AŠb H©2±}æíÓ3’—È UpR¨ Il'/‚±Fia`AŠ0„¡#À^‚ºqCòÃÝÞ+ÏõNÙ¥Þíìá¶´>íÃnÇck†Û™çÛéfr°Ù´Çy.¸3à<ž wÎJÀy°<A°2ÁTØý@¥—€ó`j‚áÆkp>ÕˆìþÈ¥plG (+`Ú9ÒÚýº½«‹®YÎhûB¬GÖX¨×ð{5‡ tŽOœL—µl8cÉŠ¨¥,øÕмÐ]š]l{èp°ù'7HŒü&÷À;ð¤ jIð¤ dÒ„©°ûJŸájI8!]&M˜jDväÒ„wב4Aïš•…“Ï49Ú)ZNÐ*óú·–õ°sšˆø”74ä¨(-Øp¡~HÜh59«WI€ª9p¨‘S´cÁž¿ßq©¾ðåuš€âüä€µó“ƒØõ (ÏO.5 @ª`^§ X;?9 òüä©Fi!;?™*8pÆoÃAÝ+ö+gnZ¹ä4&;în 6ôƒýÀ»‡&DûÅâþ¾&ýåý2â[ŒG€zùq~yúåùkþ gD«|¤_®UøºàXÏ_1V‡/ƒ ãÙžÖc‡v–‚âP„Ê0S–Ýl%KA*ù æîìËl˜xR³²Ï-=pmÖ^kÛÏó“^bƒoJ›3OȾÕÎã/pî[5ñክTô¥5ï™­ÈÜôèd§EÛáÂx„vQø¾%i²d ñjgÿåù—§ÿg•¶ endstream endobj 409 0 obj 9697 endobj 413 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 138 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 414 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 149.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features >> endobj 415 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 764 189 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_default_args >> endobj 416 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 757.250000 147.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_example >> endobj 417 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 743.750000 67.5000000 750.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract >> endobj 418 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 731 134.250000 737.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn2 >> endobj 419 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 723.500000 131.250000 730.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn3 >> endobj 420 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 716.750000 193.500000 723.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn4 >> endobj 421 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 709.250000 87 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn5 >> endobj 422 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 696.500000 117 703.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs >> endobj 423 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 683 102.750000 689.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn2 >> endobj 424 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 676.250000 105.750000 683 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn3 >> endobj 425 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 668.750000 133.500000 675.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn4 >> endobj 426 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 662 174.750000 668.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn5 >> endobj 427 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 654.500000 131.250000 661.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn6 >> endobj 428 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 647.750000 142.500000 654.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn7 >> endobj 429 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 640.250000 121.500000 647 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn8 >> endobj 430 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 633.500000 101.250000 640.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn9 >> endobj 431 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 626 100.500000 632.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn10 >> endobj 432 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 613.250000 128.250000 620 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen >> endobj 433 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 599.750000 150 606.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_translation_overview >> endobj 434 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 593 105.750000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_file_preparation >> endobj 435 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 585.500000 180.750000 592.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_running_swig >> endobj 436 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 578.750000 201.750000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_features >> endobj 437 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 571.250000 189.750000 578 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_notranslate >> endobj 438 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 564.500000 224.250000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_alias >> endobj 439 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 557 228.750000 563.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_ignore >> endobj 440 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 550.250000 198.750000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_nolinktranslate >> endobj 441 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 542.750000 198 549.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_nostripparams >> endobj 442 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 536 189.750000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_additional_options >> endobj 443 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 528.500000 125.250000 535.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_to_javadoc >> endobj 444 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 521.750000 141.750000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_basic_example >> endobj 445 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 514.250000 138.750000 521 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_javadoc_tags >> endobj 446 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 507.500000 150.750000 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_unsupported_tags >> endobj 447 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 500 141.750000 506.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_further_details >> endobj 448 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 493.250000 119.250000 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_to_pydoc >> endobj 449 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 485.750000 141.750000 492.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_basic_example >> endobj 450 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 479 146.250000 485.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_pydoc_tags >> endobj 451 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 471.500000 150.750000 478.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_unsupported_tags >> endobj 452 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 464.750000 141.750000 471.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_further_details >> endobj 453 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 457.250000 114.750000 464 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_troubleshooting >> endobj 454 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 450.500000 201 457.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23troubleshooting_ifndef >> endobj 455 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 443 129.750000 449.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_developer_details >> endobj 456 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 436.250000 173.250000 443 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_translator_design >> endobj 457 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 428.750000 225 435.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_debugging_commands >> endobj 458 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 422 117.750000 428.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_tests >> endobj 459 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 414.500000 150 421.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_language_extension >> endobj 460 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 401.750000 93.7500000 408.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings >> endobj 461 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 388.250000 102.750000 395 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn2 >> endobj 462 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 381.500000 153.750000 388.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_suppression >> endobj 463 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 374 135 380.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn4 >> endobj 464 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 367.250000 144 374 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn5 >> endobj 465 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 359.750000 119.250000 366.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_symbolic_symbols >> endobj 466 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 353 105.750000 359.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn6 >> endobj 467 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 345.500000 122.250000 352.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn7 >> endobj 468 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 338.750000 132 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn8 >> endobj 469 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 331.250000 142.500000 338 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn9 >> endobj 470 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 324.500000 185.250000 331.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn10 >> endobj 471 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 317 166.500000 323.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn11 >> endobj 472 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 310.250000 167.250000 317 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn12 >> endobj 473 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 302.750000 186 309.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn13 >> endobj 474 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 296 174.750000 302.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn14 >> endobj 475 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 288.500000 183.750000 295.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_doxygen >> endobj 476 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 281.750000 199.500000 288.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn15 >> endobj 477 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 274.250000 164.250000 281 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn16 >> endobj 478 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 267.500000 93.7500000 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn17 >> endobj 479 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 254 102.750000 260.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 480 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 241.250000 126.750000 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_introduction >> endobj 481 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 233.750000 89.2500000 240.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn1 >> endobj 482 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 227 135.750000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 >> endobj 483 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 219.500000 152.250000 226.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_external_run_time >> endobj 484 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 212.750000 171.750000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn4 >> endobj 485 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 205.250000 102 212 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn5 >> endobj 486 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 198.500000 150.750000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn6 >> endobj 487 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 185 184.500000 191.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache >> endobj 488 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 172.250000 88.5000000 179 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn2 >> endobj 489 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 164.750000 102 171.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn3 >> endobj 490 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 158 112.500000 164.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn4 >> endobj 491 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 150.500000 130.500000 157.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn5 >> endobj 492 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 143.750000 98.2500000 150.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn6 >> endobj 493 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 136.250000 114 143 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn7 >> endobj 494 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 129.500000 120 136.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn8 >> endobj 495 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 122 150.750000 128.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn9 >> endobj 496 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 115.250000 152.250000 122 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn10 >> endobj 497 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 107.750000 142.500000 114.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn11 >> endobj 498 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 101 120 107.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn12 >> endobj 499 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 93.5000000 162 100.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn13 >> endobj 500 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 86.7500000 130.500000 93.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn14 >> endobj 501 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 79.2500000 101.250000 86 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn15 >> endobj 502 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 72.5000000 190.500000 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn16 >> endobj 503 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 65 101.250000 71.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn17 >> endobj 504 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 58.2500000 100.500000 65 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn18 >> endobj 412 0 obj << /Type /Page /Parent 2 0 R /Contents 505 0 R /Resources 507 0 R /Annots 508 0 R /MediaBox [0 0 595 842] >> endobj 507 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 508 0 obj [ 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R 503 0 R 504 0 R ] endobj 505 0 obj << /Length 506 0 R /Filter /FlateDecode >> stream xœí]MÏä8n¾¿¿â=˜KÔ'˜žîC€Á CC0»›Åbg‘Þ=äïDz\]$KtÉ´]®·§·±Óm–D¹\zÑI}ÿ¯?ÿ÷ëÿüãõûþß×_ç¿üùexýPÿ÷Zþ|‡6½›ÿý“ýõ·—ϯŸ_~zùiüïç—Úáçÿ}ü×ÿ½Ú×ÿÿ—×ÿü¯Qø‡¹QiðÛK4qüû¯Óß9šñ_׿‹üÏ/ÿñO¯+/ÃÍ7C¯¿ƒ”\¹‰;~¹|I3ýùǯ{ù¾~ý5cÄÒ«qà^Mvöõï|ùSùVšÛ4··i\!ÆÚu|H³ ½KiŸù_f”¦a¼ž›õú×á1Ù¦tiá©(í'ÁÜé•tž0^—èJ‹z‡_Ðoðëø3þüåÉ—oNŸ|•?Úç…ŽïyùþS~5áõ—?M¸þõËøÔ¼}ýnüÒðúË^ÿyÌÿòúË_^ÆÏC°~úAê'ÖHŸ˜Ó'îƒ:õ¯}†õ}ÌG©Ïð£ÔÇÅé“ü.ÏúXñÄO'Þ›ø}†z×þØd:ï@þ>6‰wP?wÞ…û¾ âTmay_-´Ódœ%î Úl,øë8u;àšƒkŽ-¸æLÑ4^3¸N-ñ+^wÞ(ñËö­|×?°ÅbÃDÌP°›]µX8s],LÆ‚í‹Eær*39zö¤3Y^Dò׿ÆÇð^š{óli}bDr¯s"¼³fzþ]óUÄìÂ8¹óç,ìÑ[÷à±à¯Œ²†Ê <Œšópåïz}aß0Ûßf’Æ×௎ÐrýëK˜ èdæ@úÖ>¶ž®/ÔKûZ¦½p7l‘HÿDµÿùåý?=œºS1²é`n™"d'š¨Mf-YØæõfÛÛÏXt\û7¥åWnu#Ûdò׸¹%™(3–ì‡Ð¬H+nVؼçJz—ŽTàg®+‡M ¶’J6ÖµÈÆJã5#›ÒHÀÚg²MÙÙŒo2T»ádSZ$Ò?Qí'’ÍÇÆcÿû##^þ[wÀoV³epëÔ¸l÷N|Õ/¢Ã‚­|á,å -¾pž"ÚyÎ¥þ€µÏ|1È ¾_̨öóEi‘HÿDµŸÈ.Âûn¨èáf6ËïŒû:Xô°à0’¿ºÂzXGñ®½`Ùh~°gó©NÜå2r©:,8Ò¥ê4å…ô«›Qb÷©{åV½ÊÜ(ùÔ9KجøíÅ9çɖ%.ºÄÛZâ‚£‹Pp|‰+-€ô¬}^âÂÐZâ|¦Ú}æK\i‘HÿDµŸ¸Ä…x̧Øþ‚Kœ-ëì³®Î#±àPO`®1²'P~.¢'ªña†w!{ ÿβWë¹ýŠAü5e†¿©iY›ìó´ o(ñä»Q ÿ ò½Ífcë“â ¨âéìâ©çüÕÅa!bÁ¶•"?^)ÆëÆJ1JÉJ1]“•¢¶Ò°öi¥¯+E×^ªÝ²•¢¶H¤¢ÚO[)Æ»èX)¼Ây¢ðÔ?ˆŸìê‘×Ù‚^ØcÛÃ;y÷å¡kYM´¬åŒ[‘æŠ4oZHó@±à#­´Ò°öi£)Ù@Úøv@´»Ä‘æfl]û'ªýD¤ùp ÒnÊGí‰ÌkuÃ*Ñ 4á/÷6¢;å¯ùvˆX°X!S`Å¡¬héÔ–«´Ò°öX£™ÛVˆT{ˆX¥E"ýÕ~"°®›ë»KåÏû$¾ì¼ÍH0¾k¦ Û5œlE`âMÓ…Ç&ŸˆŸ,,Ú2»¹5¬ƒB,le”(ë¤Übl(/dÃY'Ï(udÁ±ÿ´kM'[çk¾d"ØÈÖfˆ„­Ílm Ù•®)[O-€ô¬½²µBƒ­KˆÑ>xÆÖS‹Dú'ªý<¶6¦#TÃÖŠ—"óIbë§™ð§e}´ØMä½Ù‹C6Õ4ñÈŠeaƒOÇ—$ØJ6P°±EÌsiªçƒ¾´Ò°ö™0¬o†uL»ã„QZ$Ò?Qí'tä¢jCìóÕ†¼¢¹YÕ Û£Òcåo*ßHs .9yÊÈ^ñd÷šì¡XHök˜P®íà°`+:O™Ð…2ϲ©žeÌf¥þ€µÏLè\‹ 0íÀ™°´H¤¢ÚOdBß‘~«aBqÿ{Á˜_tý»!Cg\ùÛ¤Ù·´¹=ÜxrБ†S¤ˆÄNZð×XWë2l¥…à(-„FŠÏ(¥~q"§…+i!8J ¡‘â3J-Ón9-[‰ ¦…ð)>ÉÄáZø ‹E —48˜;u|¢Ú ¾X¾àŠÙ%¤iüA®±&{,Ø –,©‘¢2J©;פÀÁ’B…Gr, (XR#Ee”¦Ýp°$Sá‘,Kz‚•ñ.:RT`M¯¼Eµ‚Æo²1VxW¸÷ ‹0y@аXpl´Ÿµ_6 äh¿$~G1šl0ÒáL&- IŒé›×dcßÝP¡œy|ok²MöQúdá›þ ÎV1ÃYF…}/~"ÇÚ)âæž›ŸŽ"ÇzáY‹/r4æÝ¤ý–u-Ϫ{è]±ƒÖ^ßßìhl!ÁÆUÍzºªYßZÕ¬§«Z¹¦«ÚÔHÀÚëªf}kU³Þ0í|U›Z$Ò?Qíç­jÖw¬j"ïí;(¯jòF'¯ZqëP–×ÍžÂÇ­òãõ'ˆ©v@›Õ·ÄÛ€.ƒÁ‚ã’–Ê@ SMÈ>_ç…½Q"?oy ì}ªì)–"xŽ?Ö-ô-¥ßØÈcMe[„dôœ~£¯„Óo´”~c#u”LûÀé7•p£ÁôŸ u¼‹Ž¼\3LÆ9>) ßàTL¦câÃU˜Ô¶5© ¾ŠÍv¨ïX‘‡Šæ–Ü$èCÞØ–"Ï­øc?ÐøãrM‘W[xªÀã.ÈË­øc—iüq¹fÈ˨eŒ8y~8&þXu0¼ÆâEËxÅÀ³Ô²^·ÈîZòxÌ{TzlÀ‚NÌ›Ì0o‡æ™{ÒÏîI„ù©…§ <`Ƽ7©yo¨ƒµ\SÌO-ê-'‚y“Ÿóö˜øUæ{¯Nò&‹lP¯ƒ8*– lôgy Uö=´ªì{æqòŽWÙŸZéX{õgyhUÙ÷@½eåšú³¦‰ôOTûyþ,ïŽ ~Õ ø›? =?1ßûö í¤ò¨Ä§u€K4:Üg¤ÖÍ|H~ö!¡5vj᩸,Ñ>´–hO½`åš-Ñ¥E½Ã@–hŸa‰ÇăÊ`ýæ¤zR'•Gõ5''ÕUЉItôÍ,ˆ-L2’Ÿ}HTS Ox<À“Ñ·0ÀqL–õ=Ád Ï€ÉtL˜£ “»Ùs¡Ùæyz[±~÷^ô{ŽŠ‚‚ñXЉpt\Ê,-„3_•Ÿ}U¢S Ox<ÀáÙµž™·-GxiQïЄgÿÃ1‹„s†}Õΰ0\ws'gØUЇù`X0`0­`ÀÀ|UÁð`ÀÚÂS0c>˜V0`0– Àƒ§õI0 àDÌÛûvîÃ0ÿÍö9ÂE±rlt† Á]ZÁ]¹«ðனþ€µWgX€VpWôóனE"ýÕ~ž3,ÀAÁ]Š”ùiÕ¹ë"ê÷=óùÆnX yÍÔT_ÐWBës‚‡"µ€:—fÏ"µ‚oEjæ£ žGjÕž*ðx€ËÒì[‘ZÁl©5µ¨wH"µð'.Íþ H-ÙºÛ× öüG¶·’Zžø,®±ýªhü·œ Ñk•xóVbЯ‚£#ø¯xÞ'GCq²ÔªÓÈ~œRHkà¿ÖqS¯mˆŒôäÉ0ùl‰XZéXûlCÆ¡eCzjf¹f6di‘HÿDµŸhCƃ‚çZ.l¨öG".4•ÉG“‹³ë £*û\.‡¨ðW©’ÅÎ!•ɾ(ö2,è´o3‹½ ¹{˜78d{Y[xªÀã.ömjÅ^†DýÙåšÙ·ébÐ&{‰8ѾÍÅ^*Ž¿úvPHÒßà&”L¦½cFq›=¨«êŠ[°? ànͦ{>šñ+¤ØzVËÜãM+Æ52¯{4<Ƶ¶ðTÇÌ܇VŒkè¾A¹¦Ü:µ¨·Lb\ñçqk4Ÿj¸uߺښsäOd¦–!ñ¨³öÝŒøÖ±NÊŽÅᎯ)HpäK~¤ÀÛµ>Ë-™ï»íô ²¿«£Ç¿éD-i ‰zg½´‰­—6·ÖK0t9›v«È‚—)ðx€Ëzick½´`_/K‹z‡‘¬—6=Ãz E‡kέք¾È›h+ìCy¾¯Úù€Â¨!cÁF¯]t‘xí¢K ¯]Y°_-N?Øó6µÒ°ö굋.4¼vÑуäÊ5õÚM-韨öó¼vÑY-öÑ+uc^hb¢vÞym§É¡Ðì#ÐÒç‹þ»UÜ…Hpà ›žMA ˜ ïš(»í'”°'>ŸÆ¹çO°tŽyL‰a¼Á?òÔ”O÷O+_xÌò9ÙòiØâ)ÕrŸ…ÁÅïóæycƒZ>E\>©[þD>ÞUsŽyoYè²&äê‰ 6Z ÉP+!™–•,µÊ5µ¦@úÖ^­„dZVB2ÔJ(×ÔJ˜Z$Ò?QíçY ÉvX ® ›ýñùõOSƒU¦p¹¬¤lªïq@ÕN;^ NÍ ¶" —S¯c i@÷¹Ë5CZi¤?`í3ÒÀ·Žiwi¥E"ýÕ~"Ò\GV•i§k^¿†.àIF烌lÍÁ·/Å7ž¤}Í6ù×883EsêÞ݇s<—¡ÂžPŽ’¸ ¶r:a§^‡—ùDÙÆ'Îe¥þ€µÏ\æ]‹ËÆ×ª8—•‰ôOTû‰\:òÇ\¦:]ç÷sdu†÷ÎÞwE¤ìS/$½oСr¤6y,ØÊCè°œzí[<#eŠ9•@úÖ>óP„EË´[ÎC¥E"ýÕ~"¥ûï*Ò”z‘ß^î[2ï=Ê‚úý€ÿíX‘•pú]‚­•iú]Ê­ô»”iú]¹f•kúêXûLP¹•~—²aÚyúÝÔ"‘þ‰j?‘ rGú† 4¯F2”nC:D$ÈöÑÎj­(²ÁwÞ×YcWdTØu*Aul„mFçïÔkhÀ63¿e®~K½©þ€µWØfc°Íf`ÚÛ©E"ýÕ~l³éHÈÓÀV“ñðAZe÷=ïE¬¥ÉG-€·ðA5R§sஂ­ðš0”¡•0”™32OšZéXû h% eK©åšÁÇÖ„!Ô?Qí'Â:†4ðQ„¼QWçY©±Üû•¨",wÃ;ÁФN»ÜWÁVð£ÓKêµiŸyïrõÞa—@úÖ>ƒßåøõ<–k~7ÃýÚ?Qí'‚ßw$ûhÀ/öYÀF|²7º‚}üòŠ,o(´-xž%å°“JP!W["u¯‚­T‚]™®ãТæ€ËՇ頴Ұö™JBjQI ÎÃrͨ¤´H¤¢ÚO¤’ؑۢ ЀñmÚò÷‘µÉ[ š÷è}s {™ „¤¹7ÍkÒ3c/G\kÞcA_ê@N,u §Vê@Î4u gž:P[xªÀãæÔœZ©9ÑÔrMS¦õIêà¼Ôœ;Rv¥£‡¥1Ëw°oX†“çW…o©ÌyM>M‘Â=^íœm+qø >ù GÞ‡?q¾“;§ •Œ*»ÉÞÉ~ yææ3 Ò-yæñ÷ÅÜ6]òœ[xªÀã*yŽ‚F¡ÿQêé+ô_[Ô;Ä…þɧ‘çøõ 4U‘ç®EÅ5øUÑꊊä[»ôuÖ±ø#ìÌ>ò8G³Ï8éQòEHXÐÉ>60ö±# Fi¦ä`3g›gº±‘° Œ}lãHƒQêØŽ³u3ÝXOØÇ>Á‘yüEŸ†}Tçb‹›@ ‡È}jA¬üæNŸh˜ñ Óße>’–}ùhaœãùÕS†8`A'¡s“fAã†Qš(]¸ÄùÈ¥™€\ |ä<ã#×8€a”89˜ È9ÂGÎ?ùchU|¤v“³Ðoƒ/4åñvÙþzP=‹]¾±ÆÏ½0ί‡ò¼Ø™åqŽ'DTÁÚYƒ„#ÄÐ8b”FÊW!rB qfÀà !Ç14N§(O `9!;3`Bˆá N§ÈC¼ï-x!j¶4Q:šRo2î[†Iau=¸誧³@s2ÉìKsòÅñ4‡j C6XÐIsèä®YàZ4G=üÓ5£¹©…§ <àBsɶh.6€á4WZÔ;´„æ<Í¥câU4·oùåg« ·­ªþù”ûØp2鈿þ¾äöUivÆaA¹™c2 ǘŒRê7;ÆdnᩘÉÍ cLFéÀ`ǘÔõñ1&d€óÈÍ ÇDM«ÈMS¥J.áö6 i2v­¡:oiEž¼Æµp³ˆèÂÖðy+ ¬-NÞMRŒÇ³¶AõŸXÐÉÚèÔ¹Y`[¬Ív.̼shwj᩸°¶Z¬mèÞK¹f¬]ZÔ;k[ó ¬m ÖW±¶"Æwá,؃+é*^ßU”¢xI×x8e>Z`ƒ]ùHÃ:»ñª¯ °`[p6ޤŒ×”‚QJR ¦k\[éXûœ 4R Fi¢Ú¥Ô‰ôOTûiqÀã]“R  €ZØ}/‘Œí•yqk2êÆ§Œ"¢Ã‚C+Ef“¾l†É•"e{^Q)r¸lsßV}+EÊSâQ•"çc/õܹ37öªU)?Ñâ8Ä>AüM÷¨H9Î8ôÆŸ3l${k(Ù[Ó"{k(Ù—kJöS ýk¯do‡ÙÛ’}¹¦d?µH¤¢ÚÏ#{kî“ý£"¦òÇÎO^‘Ýù­°¦è¹é[-*4k+÷ÉËÖfJÐÈ¥–B,' °•"`À„a3% ÛÈ¥‘j·‘†•"l„aŸ KlüÆ÷³Ä%\û¬‹…[QZñ+²¦Ç…‚IƒÅ‚­“Ø%:‰]nMboè4ó†Ob?OÛkÀÚçIìbk»@µ»À'qi‘HÿDµŸ8‰ýýÜ¢G›ÊÁ];G%$’“-–²÷’u¬I'\X–4K¦|Ÿf7q— Î{Þ«NNAµTm X°•SB¤œR‹Sâ@QÎ)q¨,ríXûÌ)¡QÛ}”zª=xÎ)ÁW sJx‚Úîã7¿Ÿró¨€Ñ£O€QdZo8‚~]ê (wM×yÔÉ3GœQØÉ1¨Nj)Ñ€ž"SùCzKElj0ôé•ÂÚœ[(;JÙ©qHÀ(Í”TSæ”r%é1e§@);5 ÿë˜vÇ);¹JÒÉcÊNOpH@¶ù~žÒ£BZA.¬­( «*þ¢‰ÓÇYØ{ë7¨ ME¿jêï[}hET‡ª¨ æ÷‡jh*˜.(ŠdÁë.Çˈ÷6£»åuâ8–á^,À*w¡ÜgáÞÄ8–…»ö"‹¼Ío*~%š¹#£‚xr~Tü ó¶°»„•õ¬@2ê­ôɆ3~»â¦ \|ÎD,ØjÔffÔæ¦Q›™Q›oŒÚ<µ™µ™µ¹iÔffÔæ£6ÏFm&Fm~£Ö _f¢²Ö¾qS Úb²SQ޵êì47 ´`°`ãu†œ†4^7NC¥4 ¡\Ó):µÒ°ö:Eiœ†4J ÓÎNCª-韨ö§¨ÉÇLQ͸¢äéyZÛ -K ueCLrXÐíì@]WÁV(€¥P€Æ C£”îž—kðuò`(€¥P€Æ C£t`Úê䃡OpÂÐxé(¨ŠË‰Iý g«Ê“W.;'»:Ä /ÃGŽRZÐ&ÂÖlH;@gY‡[å –oœ=4Jég¹fÀò®BÉ[ ,o(°|ãì¡ìÝŸ-× X.W(ùË?ÁÙC¹ä’,EЋfU8dZ· 'Xs‚ ìðÍ:ñÙH”)d^µ;ìÑùA°`+€#Íÿp±•ÿá"Ýt*× À±æ þ€µÏ­üñÉPíçL-韨öÃ1Öø”ŸÀ>¢Ü¾±`ë„O4ÁåVþ‚c¯Ö.óü…©þ€µÏ>µò\¢nrÍ&|ªù ¨¢ÚOœðÙ3á5õÄ)ªYIª„Ên¹‹\±H^/N4s@FbÆ‚óͶðC+ÛÂ3W7<Ûbj¤?`ír~he[øº9Ê5…ÜÔ"‘þ‰j?rÞ¸c §©:$OÞ –h ©Âù¾–õÏ”¦àl£¥i Þ¶ÒCÛµâÔP·g¹fІ§†ú'ªýDh»câÔ ­‰`“׿]×2¿*â+  …&{,Ø …@#¾BhE|æè G|M-€ô¬}†‚oE|OtåšAÁÏ“ßãˆ/¬ýD(„c"¾  ñÞ+Ì:'Nxù“²Â‰µ°2Š«Ê%&+¡ˆUÐ8ÿÎw2Êó@³¹`=¥­Ê5:°X°•`#0 ©a˜ë0$a8µÒ°ö™`c+Â0Dêö,׌`c0DýÕ~"Á¦c" V{¨HY *]/¼k¯q TÏd‡[¡iä_È­È¿Èwqà‘S ýkŸ¡[‘!3§cæ‘S‹Dú'ªý<(Äá˜È¿(hŠÂÈ«‚è0Ô8±îšÝ}>¢:^ãïeÂÿôòÓëçñw»NïÆÏúÓ½Ÿ€3ÿî©õ³Ã¸† pq"YGá,çðÇF•ú;ÚÛ“afCë̘sŸù'¹ykͤÒ8p¯º^ëÞ>Íßô–Òä3VæJ ×[Ä›5óW¿ù‚s1‘–ú(~⤯admbŸ¹¼„YõÕQh†vÂÅRè«øo¾sLªïNöŸ^zù¾1¸$ endstream endobj 506 0 obj 8885 endobj 510 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 778.250000 92.2500000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android >> endobj 511 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 765.500000 96.7500000 772.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_overview >> endobj 512 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 758 119.250000 764.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples >> endobj 513 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 751.250000 162 758 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_intro >> endobj 514 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 743.750000 151.500000 750.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_simple >> endobj 515 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 737 153.750000 743.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_class >> endobj 516 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 729.500000 145.500000 736.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_other >> endobj 517 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 722.750000 95.2500000 729.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_stl >> endobj 518 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 709.250000 76.5000000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp >> endobj 519 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 696.500000 102.750000 703.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_introduction >> endobj 520 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 689 160.500000 695.750000 ] /Border [0 0 0] /Dest /#97#a2#b1a#8e#a6#3e#85#83#e3#fe#0c#c6#8cN#60#f0cv#aa >> endobj 521 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 682.250000 189 689 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_commandline >> endobj 522 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 674.750000 153.750000 681.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_differences_java >> endobj 523 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 668 106.500000 674.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_void_pointers >> endobj 524 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 660.500000 97.5000000 667.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays >> endobj 525 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 653.750000 174 660.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_swig_library >> endobj 526 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 646.250000 255 653 ] /Border [0 0 0] /Dest /jlP#7c#e2#f7#3b#c7#9c#8e#92#b5#d7#ab#7f#d6#bfJ#b2#2f >> endobj 527 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 639.500000 183 646.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_pinning >> endobj 528 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 632 109.500000 638.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 529 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 625.250000 225 632 ] /Border [0 0 0] /Dest /#b8#10#d9#16#cetK#a9#2d#da#88#8d#06#94#15#e7#7e#40#02x >> endobj 530 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 617.750000 211.500000 624.500000 ] /Border [0 0 0] /Dest /#189#8c#efS#2f#bef#93#d7#7b#1b#ea#d8#a6#13#9a#bb#ee#a2 >> endobj 531 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 611 243.750000 617.750000 ] /Border [0 0 0] /Dest /Y5n#905#caw#b0#e3#91#3b#cc#21#abU#87#ca#fa#0a#a5 >> endobj 532 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 603.500000 215.250000 610.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_custom_application_exception >> endobj 533 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 596.750000 104.250000 603.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors >> endobj 534 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 589.250000 151.500000 596 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_example >> endobj 535 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 582.500000 169.500000 589.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_implementation >> endobj 536 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 575 146.250000 581.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_director_caveats >> endobj 537 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 568.250000 116.250000 575 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_multiple_modules >> endobj 538 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 560.750000 132.750000 567.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_typemap_examples >> endobj 539 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 554 289.500000 560.750000 ] /Border [0 0 0] /Dest /#f9fqFI#11J#0a#ac#06#1f#ad#aa#20#2c#ef#93#96#fe#02 >> endobj 540 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 546.500000 256.500000 553.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_memory_management_objects >> endobj 541 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 539.750000 279.750000 546.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 542 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 532.250000 261.750000 539 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_properties >> endobj 543 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 525.500000 314.250000 532.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_pre_post_directors >> endobj 544 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 518 213 524.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_partial_classes >> endobj 545 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 511.250000 214.500000 518 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_sealed_proxy_class >> endobj 546 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 503.750000 231.750000 510.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_extending_proxy_class >> endobj 547 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 497 173.250000 503.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_enum_underlying_type >> endobj 548 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 483.500000 73.5000000 490.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D >> endobj 549 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 470.750000 102.750000 477.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_introduction >> endobj 550 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 463.250000 138.750000 470 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_command_line_invocation >> endobj 551 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 456.500000 99.7500000 463.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemaps >> endobj 552 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 449 176.250000 455.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_name_comparison >> endobj 553 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 442.250000 156.750000 449 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ctype_imtype_dtype >> endobj 554 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 434.750000 179.250000 441.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_in_out_directorin_direcetorout >> endobj 555 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 428 192.750000 434.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_din_dout_ddirectorin_ddirectorout >> endobj 556 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 420.500000 157.500000 427.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typecheck_typemaps >> endobj 557 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 413.750000 168.750000 420.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_code_injection_typemaps >> endobj 558 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 406.250000 166.500000 413 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_special_variables >> endobj 559 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 399.500000 113.250000 406.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_features >> endobj 560 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 392 95.2500000 398.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_pragmas >> endobj 561 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 385.250000 106.500000 392 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_exceptions >> endobj 562 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 377.750000 101.250000 384.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_directors >> endobj 563 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 371 109.500000 377.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_other_features >> endobj 564 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 363.500000 207.750000 370.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_nspace >> endobj 565 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 356.750000 161.250000 363.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_native_pointer_support >> endobj 566 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 349.250000 159.750000 356 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_operator_overloading >> endobj 567 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 342.500000 161.250000 349.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_test_suite >> endobj 568 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 335 129.750000 341.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_examples >> endobj 569 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 328.250000 178.500000 335 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_planned_features >> endobj 570 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 314.750000 77.2500000 321.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go >> endobj 571 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 302 96.7500000 308.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_overview >> endobj 572 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 294.500000 97.5000000 301.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_examples >> endobj 573 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 287.750000 132.750000 294.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_running_swig >> endobj 574 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 280.250000 194.250000 287 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_commandline >> endobj 575 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 273.500000 170.250000 280.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_outputs >> endobj 576 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 266 153.750000 272.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_basic_tour >> endobj 577 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 259.250000 153.750000 266 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_package >> endobj 578 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 251.750000 132 258.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_names >> endobj 579 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 245 139.500000 251.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_constants >> endobj 580 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 237.500000 150 244.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_enumerations >> endobj 581 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 230.750000 134.250000 237.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_classes >> endobj 582 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 223.250000 219.750000 230 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory >> endobj 583 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 216.500000 191.250000 223.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_inheritance >> endobj 584 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 209 141 215.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_templates >> endobj 585 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 202.250000 156.750000 209 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_classes >> endobj 586 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 194.750000 186 201.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_example_cpp_code >> endobj 587 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 188 195.750000 194.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_enable >> endobj 588 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 180.500000 206.250000 187.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_ctor_dtor >> endobj 589 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 173.750000 200.250000 180.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_overriding >> endobj 590 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 166.250000 185.250000 173 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_base_methods >> endobj 591 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 159.500000 200.250000 166.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_subclass >> endobj 592 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 152 261 158.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_finalizer >> endobj 593 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 145.250000 230.250000 152 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 594 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 137.750000 197.250000 144.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_primitive_type_mappings >> endobj 595 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 131 151.500000 137.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_output_arguments >> endobj 596 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 123.500000 176.250000 130.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_adding_additional_code >> endobj 597 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 116.750000 141.750000 123.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_typemaps >> endobj 598 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 103.250000 84 110 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile >> endobj 599 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 90.5000000 139.500000 97.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn1 >> endobj 600 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 83 126 89.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn2 >> endobj 601 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 76.2500000 117.750000 83 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn3 >> endobj 602 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 68.7500000 92.2500000 75.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn4 >> endobj 603 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 62 144 68.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn5 >> endobj 509 0 obj << /Type /Page /Parent 2 0 R /Contents 604 0 R /Resources 606 0 R /Annots 607 0 R /MediaBox [0 0 595 842] >> endobj 606 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 607 0 obj [ 510 0 R 511 0 R 512 0 R 513 0 R 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R 565 0 R 566 0 R 567 0 R 568 0 R 569 0 R 570 0 R 571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R 577 0 R 578 0 R 579 0 R 580 0 R 581 0 R 582 0 R 583 0 R 584 0 R 585 0 R 586 0 R 587 0 R 588 0 R 589 0 R 590 0 R 591 0 R 592 0 R 593 0 R 594 0 R 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R ] endobj 604 0 obj << /Length 605 0 R /Filter /FlateDecode >> stream xœí][¯ä8n~?¿¢žÌKÔLwOÈC€Æ ‡ Áìn‹íEz÷!?–-Û"%¹d–/uÎô6vº‹¥"å*ñ"Šüôã¿þòß·ÿùÇíÇ¿üïí·ø÷Ç_^ºW«»ñ·ð燔 Ýkü÷Í:}ûíëË·Û·—//_úÿ~{?ðËÇïÿõ7yû·þÿ¹ýçõÄ?ÄAaÀ×+lÿ÷_‡¿½ý¿ºùï@ÿóËüÓíoã$.N¿þA9=LâŽào/ÓCŠáÏ?~ûÛËãão‘Ñϰ» ê&¼’·¿ÿñåOá©ÚYL³D<‹‘Ry€o+üðëËŸÝM˜Û¯êßÄýúõÅÝ~ðVêÛ¯¸ýs׉Oÿrûõ//îÕùÎH=L-¾óSíÎï¨Wã"XÞÃ;¢{5V¸þÍå9¾£_;?|jyªÜÔø9½Õ0!«ÏÓ ïøWk4yççÚ;u9òã87ñª•AOÊ‘#FnæUßZ:ƒÕÏT¿·(çç_ûe¸¬!‘¯!ׯ^iÆeÙ+ °]JøëË/huÙâìjŒMà¬ÕÌy|­_ëz…6fü‡¨öfôl?†×¿½õ*„—Ή8Ðç!åÞ^Ãø‘þ¬$Üeä÷#ú¼ÃÜÿüòáŸSR_SÒ.h©!¿hiU¬¾ó©º>ªŸé>V×»©é¢W¨£ª^b?>†~éžlÆD˜Ô+³$öQ'Ö}X F, ßÉ”ðè·€¾U¥…o ^šýk²ðÃ@Ÿ‡”{\øV–~¸ ºðÇ>ï0÷ ¾õÇ,ü*·úÂ_ui¶:µ]:SýLUVäTŸ§®>“Ãoñ¥ÑÏÃôÔ+•>ã¶ktç¶h´ëf½“J¦„ Ñ«z+T`àåbFDÍà¢êªî_Û¨\ãëßúïÂDõ›FhÌ@§Âø ¢òáwDÀøt !æìüA}9]{EïM{õõîdõÝ×׉ªÊ?¯Š¸†çZñ©UScð7†)«¬5—fôëSª?`ݺÚFÖv¿´ýl"@Û”ÐfcœØÆôß]ÁÆ8¡ ¯±GhÌ@§¢qý:ÎmŒë<пÆ6f1ΰKmL*à:ã„}Ã+VvÊuw–I©ÏúSm×ûŽFwÂ-:/}JhÔyèˆÎƒ(é<VÉþ5Ñùa„Æ t*`ÒyéK:?¼Nô¯‰ÎÏJ¾0ÀOp©Îƒy—uÅИ²<@w×õwVäPYׄºÆåqņ@ãÍ«ü¤%AåA¥„F•Wž¨¼îJ*ß C9ä§Î#4f S“Ê+WRye±e©Ê‡ã”RùDÀ…*¯õ󍼨3mVb¥¯ÊadÖÞ¢–>’ õW/Ymˆð`rÏ™%_ûBrÏ‘ô›ÓoI‚ÎÅt^òyH¹É=gl!¹ç N†×8¹7Œpèós¿.¹ç¬:D¥ŸÚ#W£}°‘[~¾£7ä¾zžÉ1ŽK “Ã:æ$Ñwÿ2õßìûIbYŽ«®ÁæìçÍ{‘ì1Â&e!)÷¸Ãóª´Ãó@¸Ýá…}Þaî—íðD掱Ɯ£åÏÕ@¨º|¥«¦Õªï°²Ñ ÓÛÂ]ŠaêJ^We7V6¿î5?“\q;´¤vÅèo(œ k},2 Á¾ƒ”p`°ß ÂjVõmûfv8Q$_R8QÔô[ã[ožkâ_…ò©õTTh?ýŽc±€TÀ`ÀÃë±VþF>,©RlÇ8ÄÂaWÚpÙ`©O*Ÿ«¹“ê„WÂ#Æ XÉEŽÙP0~q1[²Î¥„‡uë$¨’Nâ´öH : &jáÌR“N‚,é$*@d: "jáÌÂaWê$4tœt–¿rX¸o_A}u×ûgªºÓ;YO«Š¨nZÈÂé”ДîéÇëÙïM„±&>M÷*JF”ð™ÆhÌC§2ÆŒO Œeñ7òùŽÊ …õqLœçÄ?Ç…IŸ0‹†Òú]õaßœwý¸{ß8ùúÜ:§Tv%B?Å&dû¦¶ÔDX–~n•N Çm ‚ ¬ŒdÓJúñ½Ö?Óœd'__ÿ˜Î—¾Ï{V× bu­,Y]œ ÔêZ5™Ù…‡NeÌV×v%«k<‘a|fuŸÌìÌ?ǵV×64œeu÷9³ å–àW¤„·ñ½ ü}Ú]SÔõdH}ÏRÿ g×ôl¼4Ǻ͢06t+_u½LjîêN™QÉ’·™W'+i¦†¬,¡z{5áz·"m[þª¾ñ~Âå]Ÿçë^þ`\K9~ûž‡EMkÈ@bûþõÅtºdðï¾#A…¥ Âqø² ÂÃE,¦·ˆåù85 'x>­ˆç›Ç{¾ù×ùîù¾{¾Ý<_lÄV 3ç;ÞUÖ쉽VÃÙs¦×÷<‘1Ä[òDô\XŸy"ã'׳ðЩŒÙ]òDFQ*óDFM®gæŸãZOdéóâx¢»iâfßaçòÈñlb&~ö¼|Ÿû&pÞ…øî‰žÂý×ýª9Û´ü»`ô;­ dÛ#ic¦Ä͵–TJxXÃ=n‚®Ô(4s]Ö(4ŒÄR“†ûR£ô4÷é³F¡aŒC,p¡†CwP£Pý*“³p£ª:W—:¿“󉇭tK“u)¡1ÐAš˜@”š˜€æ8AfMLãyèTÆèƒ(51 ¹Ú@ þ0&Î51%2. ôAÔÄtï¾£ò¨õµÕfÄè54†Ö€äÒ#5º$y|”òãï †¾o»úI™‘–5ÅjòáXsö¦õ×ëÞóÿƒïøÜî=Z¹‚·ë [ ¼ëìë¿:FÅ5›+âú=7%wq/~Ò 1\!ñ= •µÂc4æ¡Ssü¥V¸êÉ€¬nç‰ZáWÆOê V8NüÄAVxÚøi/4«÷¥4G—j®æ#RÂØ£F`ÕXñÂû&Å«Üê&[I†ÉÞõß_ĹTíþ=ô»Â@½Í{AκÈxÚnàÕ½(¦&kz@´ó%Õ¿)hÒªºÔªô¸tÖª8ŽÑ˜‡NeÌ‘‚.µ*‚VTFÖª8Œ‰óD­Š‰Œ+#sP«"#RØ÷H•uj¸ëÉïÌrÛ×õ„­{GüæPÈ̸àuJ80òë~:ìñ[¼Eì—mkù¬+‰´ê ÑÞz¹¯-Ýù+¨Ï€s:ãÚ“Æñ4­™b.úxÊŠ’ý¸OYÒ ¶Ô –ô‡‚ÍúCÇ1óЩŒ9ž²¥þP°@edý¡Ã˜8OԚȸ2žrõ‡râ)FèÊG Äô³b°·u2½1@pË%„¤„aÈbf€â³r÷Úæ›²œk`8eÆûÆß÷›T¾~ D=¯w0p=–¬ÿ`œK¯9 ƒ³ÐwV°éêƒ)K¶ì^°â V¼.+Þ’@b¨…ÃÁ†Ÿ£“…‡NeÌÁЇR°2 ™+Kt2óÀÏqi°¢º†ä¬`…ãö/Oþ¼çÀCusï t*%xô‚ðÂüx¼ÉôW «ÑÄçéÚ«Ù9U/u9×grXßAý7m_šœ/åýgéÞgê¨åX÷¬Ãï%yS-oÍq.ö”__¬‘%×y'ÎU‚Àr(Q‚åP´Ô[‰ –c£1ʘâ\%J°J*#ƒåÆÄy"XŽDÆ•q®8–ƒç2€rêý#o³fvçý1´7Ônå «Œb‰GÊ]¶T×rŽàø•1ÍÛ¹àx‘Ž<ÀD¯9UJ»æH8Y´ç_—-§P/åeiÜsx@@h”@h­ÍUÐŒc4æ¡S³Ãƒ‚ŽÊÈ@h†1qž„&‘q¥Ãƒƒ@h8Ñ`ýÝáýî^³»’ň”pxéð¢U'»â¦ ^| ˆSŸû$‹®µF5YcjèfÉÖØ=o¦ ìÒ%ØEëG•Î`Æ1óЩŒÙ›éìR¤6¨7SìÏÂ?ǵÞLûÃñf 0-HÆœ¬'Cù¾_³3Ñ ììRÂÎDvxQ?‹ulJV{ŽWVç|‘Í])CâèÁY0çûî÷…TÎ’ª Пf8S¢__´‚’JÞó½¶#¾×Š’ï¥µ†*Ö¦¾s£1ʘ}¯ñ%ßkHÍd P߯Œóœyàç¸Ö÷Úƒ`·¾‡Ž «‹ã6ɤºçÞëòß]öN>ujvövn1ð)á@gk+Œ«Ö+šw<ø«è§ìì¾ß«¡~…oF õ¾ô”Ÿ«ß™¯®'Q‹¹ã/ ôkç+ÜQ!§·f°âØÇß³”Ýú¹öÎÊ“þÔøK¤Å’f 0S áQ<­0Î¥V%œËàÒH] ¼a  ˆ(xJ8—Îe ¼aŒC,p! ^oúïºÕz£äÎ×üT}‡“æâìøX’[JŽ„vãú^pM¼O +œÆ°“Ú”`'{3BôÁd°“Ã@, 0)œ.ÁNjM`'*œŽ°“ ‡\©pæ>ì$Káv½œs±ÚÎÀ$œ®½]ÛXºœ:ƒ¦nï¡|: ûÑ -×;K¯RÂÃVÈ:l…¬/Y¡ÞT`#áDf…Â@, 0Y!kKV¨°±k2+Æ8ÄÂaWZ!wñ’c…8˜ o ®vΫN.CõˆÐ˜]Òžà”iï Ù%Ó‘Óe8eãyèTÆ”]Ò¾„S¦=©…’]ÆÄy"œ²DÆ…Ù%ÓÝÇ)ÛwÕï ïšnÕ2ê]ûó©:+_û ëŠúg8 løØ.ÉhNCÍ®0[`Z=ù˜Å2ËE˜#ÀLh´`Fü$#JøIFsã@ LLøI ʘ,˜%ü$#•‘á' câ<~R"ãJ &ïã'fÁv9â967¬ê96F ¿bažï1V6P;N¶ÙŽ,‚B„V;7Ä@ 7Ä93ᆌc4æ¡S³nˆ 22ÜaLœ' Id\iGÔ}ܳì ‡±ÏfÙ‚ºÓg´RÝA³6-whJ )á@¸| d弓^«“–Ò{ùºøÑ€îó×ÕW÷=_¡ lƒÑ%Ø£ lƒÑlÃ8Fc:•1û ]‚m0ZRlÃ0&ÎÁ6$2®ôæ~Äwš¯``Lí[–¸³ê?©Yî•ÊÛL8пXAVÛ¾vOhJ/_~ïå‹<Ô'aè}ÒPÂ’iÄ=ŸdI‹µ±¥kcI‹µ±Y‹õ8Fc:•1û$[j±€±Œ¬Åzç‰Z¬Wú${¿Åú4ŸÄÉ.\Gõ­’1ùLµø`yl»¼×,Wì‚Ò)¡ÕxÒ|j|©ùÔÐã³æÓqŒÆGÎÝôêzÆLU¹µ_Œsð ô¦t¶[¥•u)¡Õv+R´êT©hÕ)R´êTV´:ŽÑ˜‡Ne̶[•ŠV’TFV´:Œ‰óDE«‰Œ+m·žÃõ¶›Ñ(UäÃ}[þsðΑÇ ì‹i¼k¬ù¼V¶Ù-ˆÀ uJhµF†”+:S*Wt†”+:“•+Žc4æ¡S³52¥rEg•‘•+câ÷Ý\Q!-"²ÒuÜd/p0T~SgOØâ¨¯ QŸèpgÏ@ QŸ˜Ã¼„‡NeLQŸè =!¿FeÐΞqLœgÚٓʸ0êë§q²¡¼~“ÍAÚÙЗ•¨p°x8{CN—ÓÝÎÖ˜H,ð–*%´êµ¢×²Ð#ÓS Ñ9I{dâyèTƬײÐ##†ÛÕ± Ú#3މó”H¯åôÈô³hè‘9K¯÷ÝÍ1ôúÍx|!hEPèB«Î(ItFš>z*I E›>âyèTƬ3ªÐô!ùXmúÇÄy ¤3ê š>úY44}œ¤3¬k¼vÕN†vC¿ùJa']Sß/mTÉ?Qz›ZUÒ¢’¦óÜSIÂP óÇhÌC§2f•4˜g!4I|UIí'4RIó0Ïý,ÚÎRIÐê®*Y¯âXÙÕwÞ·oòóÊã± F‚T)¡UÓ—›+&‚(iº¢…2MÆhÌC§2fM·¾¤éÖÖešÆŒóœyàç¸VÓÝ1Õ‚¬Ïpš Nr¾¬jùûý»…´ >¤tˆð@j\vƒ'îý±îÿüý/N_¥²7ý*•Ý15}û®ÒgN±œ¾²ëÞÔn÷+>“ÑÑ“µ:r&˪pØ5#Å $î…ò WÉ ^[.È™Zt)áaƒ#{Sp¹Á‘ÕNžep.Ïý<ÁY©»¬jÃ΀ ŒŠLÖv¼ ×¬Ô ò¦DhŒÍ%JLCa›Kš´’*«ÄÇhÌC§2¦Ø\B©SI¾‰Í‡1qž¨3‘qal.ÕA•˜œÏp€ä÷M&׋RNjØ·Ðhc„/dEˆ:³­lOjR¶'u©lOÒì•ÔYÙÞ8Fc:•1ë¦.•íI­¨Œ¬loç‰ÊöWê¦9¨lóøü¾ÎþÀÒ?O4³›ÙX ‡î…ðxœnáú8Ý]pÆQÃ˱Ÿ ©S¶kuWn3ø7Ò6Ò * ’"%<®u½#¼ZëBò¦µn×V^N¾ç´{49àšoÉ1¿Ø•V£ FŸ Øç áa£}H}¹ÑÏSÅ1¬Ò«Š9VŒëq•Ÿ†…Źpþí|çÍvfÁTV§„Çí t×Ûx¢r2ŽaÔ»Œ³ÃºCœ£lힳ†wßùÞvΑ´³ÅiM,D+sÅž éÀ…ð¸Qþz+¢Ÿ¨ŽcEvÝ‘s´€£ûô«qìË;RL=Ø©¡ct&<®˜Æ]¯˜ö‰ Ö8ŠÉ9H«¢ ÕW]•²˜óô  vg¾28xUËW¾-RÀEWšDý· F«v)áqýw×—‚¢R@Žþ3ëÞVÉܾ @Ï_2·©#ÿdضf£áÍ’ð)á8í )4+Âùuê>êª~\zÓ¬9 ,,½b€mIÛƒ·&«È:üúb†“4´0òfª»¾ÎT‰'ª3åx3Æí;cÐí{\Í)äâà(ÕWæçê.€“Óãµ:%’rR›t*½ ¤Wo몠ö*†=7m Æÿ~__4¸Òz§QIR¬¤+Ô * õÁ@jÇ1óЩŒ©QÉR}°’¤>8H â0&ÎÕ'2.¬ATðDõÁGP¯¬£õWÏûï^¤±MG±ýÎ]Çœ›8‘-ç^ïân­dT°@+“޼åÇ`E[¹crûóöÝUŸŒDöHêšü¢!uÕ•~â{þE‘w¥J5îJ‘÷@ þEM5î ʘý‹*Õ¸+¥¨Œ¬Æ}ç‰jÜWúý<5îœ 2WNÅëù„úq]›ÜXÕ0õüò´\ض‚u¥—‚uéRB« 0šØ€ˆŸJl€!Ø @mÀ0Fc:•1Û€ˆãJl€*2ÆÄy*dŒ~`Ÿ§À~ß 2ëø°'ìl‹Î:Ž: =fçúFZekj Õ¡îe&†juñÜžòœý|¼*=ø=Ã사r%Yå‚l PÃìfKì‚ì,c6Ì®„ «œ¤22ÙaLœ'BMd\i˜ýü ?±a~à“cwl;ßx¾1Vò øk)áØëX{é/ŠÒ⫞ï×±®ÍíSUNõI£ß«çØš.wíÖdûìS£,èåÒ™øZ.XКÜ=ä‚…a  ˆ,h … ´–T€¤, cbá°€ /XЦÁêŸPŨJc¥¤8Í&gÝüRõU+I}ïP©ßïÓmßè†k!ŽD‘n3Ð Ú«ô&%i­t»^£«hàU/ç2ùÆTboï$“ !êܪŸ‰Ê#6=º]Ö=wÁÙ>*ŠýÔ§_\/¬ï.ö/·//ÿ¯ŽrŽ endstream endobj 605 0 obj 9290 endobj 609 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 147 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn6 >> endobj 610 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 179.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn7 >> endobj 611 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 764 208.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn8 >> endobj 612 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 757.250000 150.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn9 >> endobj 613 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 749.750000 123.750000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn10 >> endobj 614 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 743 99.7500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn11 >> endobj 615 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 735.500000 168 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn12 >> endobj 616 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 728.750000 122.250000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn14 >> endobj 617 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 721.250000 154.500000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn15 >> endobj 618 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 714.500000 126.750000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn16 >> endobj 619 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 707 123 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn17 >> endobj 620 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 700.250000 143.250000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn18 >> endobj 621 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 692.750000 137.250000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn19 >> endobj 622 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 686 136.500000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn20 >> endobj 623 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 678.500000 146.250000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn21 >> endobj 624 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 671.750000 126 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn22 >> endobj 625 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 658.250000 82.5000000 665 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 626 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 645.500000 96.7500000 652.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overview >> endobj 627 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 638 105.750000 644.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_preliminaries >> endobj 628 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 631.250000 143.250000 638 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_running_swig >> endobj 629 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 623.750000 190.500000 630.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_commandline >> endobj 630 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 617 179.250000 623.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_getting_right_headers >> endobj 631 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 609.500000 180 616.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compiling_dynamic >> endobj 632 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 602.750000 153 609.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_module >> endobj 633 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 595.250000 171.750000 602 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems >> endobj 634 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 588.500000 225.750000 595.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compilation_problems_cpp >> endobj 635 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 581 159 587.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_building_windows >> endobj 636 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 574.250000 225.750000 581 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_visual_studio >> endobj 637 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 566.750000 174 573.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nmake >> endobj 638 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 560 153.750000 566.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_basic_tour >> endobj 639 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 552.500000 231.750000 559.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_packages_classes >> endobj 640 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 545.750000 129 552.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functions >> endobj 641 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 538.250000 146.250000 545 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_global_variables >> endobj 642 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 531.500000 130.500000 538.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants >> endobj 643 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 524 140.250000 530.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enumerations >> endobj 644 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 517.250000 186.750000 524 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_anonymous_enums >> endobj 645 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 509.750000 180 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums >> endobj 646 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 503 187.500000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums >> endobj 647 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 495.500000 188.250000 502.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums >> endobj 648 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 488.750000 173.250000 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_enums >> endobj 649 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 481.250000 125.250000 488 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers >> endobj 650 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 474.500000 130.500000 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_structures >> endobj 651 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 467 135.750000 473.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_classes >> endobj 652 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 460.250000 145.500000 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance >> endobj 653 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 452.750000 231 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers_refs_arrays >> endobj 654 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 446 172.500000 452.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_null_pointers >> endobj 655 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 438.500000 175.500000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overloaded_functions >> endobj 656 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 431.750000 167.250000 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_arguments >> endobj 657 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 424.250000 153.750000 431 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces >> endobj 658 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 417.500000 145.500000 424.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_templates >> endobj 659 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 410 159 416.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers >> endobj 660 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 403.250000 218.250000 410 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_shared_ptr >> endobj 661 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 395.750000 201.750000 402.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_generic >> endobj 662 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 389 192.750000 395.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_further_details >> endobj 663 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 381.500000 174 388.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass >> endobj 664 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 374.750000 231.750000 381.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass_pragmas >> endobj 665 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 367.250000 164.250000 374 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class >> endobj 666 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 360.500000 222 367.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class_pragmas >> endobj 667 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 353 153.750000 359.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes >> endobj 668 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 346.250000 193.500000 353 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management >> endobj 669 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 338.750000 165 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance_mirroring >> endobj 670 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 332 234.750000 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes_gc >> endobj 671 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 324.500000 357 331.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 672 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 317.750000 258.750000 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_multithread_libraries >> endobj 673 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 310.250000 161.250000 317 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_type_wrapper_classes >> endobj 674 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 303.500000 140.250000 310.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enum_classes >> endobj 675 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 296 198.750000 302.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums_classes >> endobj 676 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 289.250000 206.250000 296 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes >> endobj 677 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 281.750000 207 288.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums_classes >> endobj 678 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 275 129.750000 281.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_interfaces >> endobj 679 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 267.500000 193.500000 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 680 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 260.750000 150.750000 267.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enabling_directors >> endobj 681 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 253.250000 145.500000 260 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_classes >> endobj 682 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 246.500000 170.250000 253.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_overhead >> endobj 683 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 239 170.250000 245.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_example >> endobj 684 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 232.250000 169.500000 239 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_threading >> endobj 685 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 224.750000 177.750000 231.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_performance >> endobj 686 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 218 185.250000 224.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exceptions_from_directors >> endobj 687 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 210.500000 220.500000 217.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_customizing_director_exceptions >> endobj 688 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 203.750000 152.250000 210.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_allprotected >> endobj 689 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 196.250000 157.500000 203 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_common_customization >> endobj 690 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 189.500000 164.250000 196.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_helper_functions >> endobj 691 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 182 182.250000 188.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_class_extension >> endobj 692 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 175.250000 192 182 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxycode >> endobj 693 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 167.750000 254.250000 174.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 694 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 161 219 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_method_access >> endobj 695 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 153.500000 124.500000 160.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_tips_techniques >> endobj 696 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 146.750000 283.500000 153.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_input_output_parameters >> endobj 697 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 139.250000 144.750000 146 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_pointers >> endobj 698 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 132.500000 197.250000 139.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_c_arrays >> endobj 699 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 125 159 131.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_unbounded_c_arrays >> endobj 700 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 118.250000 161.250000 125 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_binary_char >> endobj 701 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 110.750000 246 117.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_heap_allocations >> endobj 702 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 104 111.750000 110.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 703 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 96.5000000 187.500000 103.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_primitive_type_mappings >> endobj 704 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 89.7500000 210.750000 96.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps >> endobj 705 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 82.2500000 153 89 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_jvm64 >> endobj 706 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 75.5000000 156 82.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_what_is_typemap >> endobj 707 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 68 237 74.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types >> endobj 708 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 61.2500000 166.500000 68 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes >> endobj 608 0 obj << /Type /Page /Parent 2 0 R /Contents 709 0 R /Resources 711 0 R /Annots 712 0 R /MediaBox [0 0 595 842] >> endobj 711 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 712 0 obj [ 609 0 R 610 0 R 611 0 R 612 0 R 613 0 R 614 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R 620 0 R 621 0 R 622 0 R 623 0 R 624 0 R 625 0 R 626 0 R 627 0 R 628 0 R 629 0 R 630 0 R 631 0 R 632 0 R 633 0 R 634 0 R 635 0 R 636 0 R 637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 642 0 R 643 0 R 644 0 R 645 0 R 646 0 R 647 0 R 648 0 R 649 0 R 650 0 R 651 0 R 652 0 R 653 0 R 654 0 R 655 0 R 656 0 R 657 0 R 658 0 R 659 0 R 660 0 R 661 0 R 662 0 R 663 0 R 664 0 R 665 0 R 666 0 R 667 0 R 668 0 R 669 0 R 670 0 R 671 0 R 672 0 R 673 0 R 674 0 R 675 0 R 676 0 R 677 0 R 678 0 R 679 0 R 680 0 R 681 0 R 682 0 R 683 0 R 684 0 R 685 0 R 686 0 R 687 0 R 688 0 R 689 0 R 690 0 R 691 0 R 692 0 R 693 0 R 694 0 R 695 0 R 696 0 R 697 0 R 698 0 R 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 704 0 R 705 0 R 706 0 R 707 0 R 708 0 R ] endobj 709 0 obj << /Length 710 0 R /Filter /FlateDecode >> stream xœí]Mí¸qÝ÷¯èµy#²Xü‚óõd`0dadŒí†Ÿ‘g/ò÷£o±J¤.UWÕíö ™éj6KW—uX$Ï)~ûo¿ü÷ëÿüãõÛ~ùß×߯ÿðËKóÉa3üïµûç›Ø ý§ñ¿_Ç×ß¾¼|}ýúòóËÏíÿÿú2üÁ/?üGû_ÿ÷ª_ÿ½ý¿¿¼þþ¿ZãÆF]ƒ//N¹ößíÿœjÿ«™ÿÝÙÿüòŸ¿{ý[×ãän|úó7èµíâã¯/Ó‡Tý?ÿøío/ߥ,êWeÀ¼ª`ôëßÿøò§îcIžS­ŸS™Þ…Uýß¶oi2èOÞ7îUïÿC©ÞÚ>¸ÑÍhøíEý¤TÐÞÏmö±îCÓÿÙ+ý{ ÌGkèþ$~Ž®ÍøœSôsüÖ~›¿Ì_@÷ùé0X2ßÝ×?üþ×—o?·Þíë¯jÕ¿èá_¿¶ï®ý¦¾éžÂ½þú‡×iõÓ¿¾þú——öÑCc5ößËð­s¿Q?ö¿1Ÿ !°üÚÿ7ù'h~Èúþ7ªùdòí/—Þ²OÝøá7ì ð í:zýž7Í»É>´Âìßd7.ûõ|f”ÿäÊfóÓ¯m´..„]„·ÃÆOAíøŠ mÇrIû†E±W©(öÀ"¬5ð(îÛ ícs»Šbç™ÖÀ£¸k3<çÜýu£ØÛÛD±nö ¿Qj÷%Qlr½½ÍЉÒÓ¯–îó=ÿH>ñdPBÁ'Ð^éèE6ÙÐW&û›ìç9ø©ß>z7Á™iˆ¡C xèš&‡®ë<ƪÎÀðphƒ´Œ}Ìx| ƒcxØ8vmÆ÷ñÐ5x<ÌþÍFVc³“ ¼|oànÈfOy(Ëãn6š`x;8¡RQèç+ÿÍåßH6Ðácrø˜Š'רyrð*6Nml²ÉA…Ôä ›ZŸú6HûÀØÇ498哃ë²}â£5°É¡o3>§‹'‡ÈGÍÉA›ûL‚€Ðßç’å Îkþ7á•6&»ÏÙ§~Ï¡¯q^'kþÊ Y@lˆ0gœãÏC¾Z;FbomãÎâ¼%9~{±fŒh5µÒÄÚæÃÏ ¼Ò?n±‚:h í_‡èÚxÒ…§þüòýï.‡ßôh`à4D6`6FòIJ>åÉ?ÁO¹tl½Ü|¯‚wa†O>9‹Å‰¡$9–'†AÀ!g¦HÕhbÃÓ€–bº``!ÚïRÓ0îÚéb ¦0 ýTÌYa@ׯ“.òóW²ãŸ¿`è+•[l̆y?~W X˜ÓØ@ O‚CΦÁy6Nû^:–»6@º€ØÁΤÁw«@èÚxÒ…§jBû1N „ïÙÉP2R%“Ój2Ì7ÍÎù\ùØ­íy9ÿlùmŒloÚgÿ&ŸÇç¿–üS æå÷vH.”ÿ€;ÆPþó¦y¬–,ôvbµ×óÂÅAl(ݳ†íYLíYðÍf7n6Ç{aÞ¤XúÀØÇ¼g µgø¦yЫ=‹e“bîƒ~Žª{¾™ÅEÀ¼qLÿƒOÆ¡œØh®3ȇå¹oÔ’š7±¡p”{t”{e£Üó]3?îšE£thƒ´Œ}L£¼}M‰Qî•â>å}›ñ9u<Ê#5G¹ ÷å2ÊÆæ¿`þÉò'6®ö}ž÷ï4n¬Á%Ç«í‡3R£b¸Ð3iÀƆg04YÀx€ÄÆóÍ6?l¶Åk¾ . v0.`<¨ÄÆCÃ4|Ó·ñ¤ OT\Àxðç Ȃ̩å À·¼|(Ì·=ÌümulxZPQhA‚¾‡ç‡=<‚] ]@ì`‚lRÐbØ.dgàÐÒµñ¤ OÔ„<‡) ’ˆÈó6¾ã`°šA%»'Õ7$ò‡ž`*84Ù@®Ó <úe5¢cÃÓàŠN¥0€o_úaû’„q×H;˜0À†X¶Û8tm<éÂS51ÀóÍ/©AÀêÊsâ7f«|´îYèØSÃs¾ò¸ÁlÊoV¼å­áR|r3åºÝ‰Åð4>ù@ñ)4)|êÀ€ÀG¿G!¦k¤ ˆLøä} Ÿ¼c¼[áSׯ“.I6ß?>•oúëì"QD¿ ‚•ߎS®<øÔ\:…™¡1< K¡ñ–B°”¢¨úW‚,} ]@ì`„¥Ð¸,µ/Ž9h,‡¥¾']xê ",uãr–ݽÍÓñ7~“¹ìYÈU¹Z$®¨%’=áßg¤˜þ¶%‚š)"Ú‡ØPxÔôœýLŸ8ê ÐÐc˜ ?êÚ ícÓQOÐ6qÔ42ùQOßf|NõD>*õ8‡v)„c:%Û¾늫t+ß•ç+žB>yz>x‡“—3›”‰ ¥Ñk,‹^ãRÑk˜¢?˜°ŠÞ¾ Ò>0ö1G¯ÁTôÃ}˜UôvmÆçD½ÆÞ!zñÂäÁÑ+HN–œº‰8† Δm›Ø0…Š|Xø\š× ïèW’z!yh YÊçKÃk'ò&}›ð`¥’ÈØòO°Üô%غãàKñ׳~ »|Ë?ä¹ ¥R•”|$1ÃØðä"J·ã7^Dµ?'Hê­•õºˆÚébÃ"ªý9ARo­†;à$õ¡']xê Þ"J·€ús³èul޳¡OÞq]¹¬;ÉÃf¶ûqg¥lyо݅ÈåulxzüÒñ nzkõlxç¦m€t±ƒiüC‚›ÞZ;àÜô¡']xê æø7ÜtÉø?´êd»PræxðŠA²I'ˆÉ]KööŸIQºK²CYÒ¯¤äÖà ·VÊAî 4éÛ íccÒßäÖª¹ÎAÚŒÏscõ’~ÝØÇ!sl¼0Ï J6°ùûüo®Z²çóâÍ‹óËüï÷¬2ÚÁ0³Š`ˆM»‹9Ý4°Øt ætkµ,ngNmö±96]‚9ÝZ÷Á™ÓC›ñ95‰MwætûÌé«bS0¡n¢ÉŸÙI4½™6VŒùÉþXv^è)€Ö§RIØ Ë”úT·] ºYê% †R¼ šám€ÞdXp…·}¤}`ìcÆÛ Rxî£Yám×f|NEð6è;àm(à™_„·’‚‹ù³ÎƒOÿ¯Ê…$” M^°ÊžgË¿ÑÒm7–º‚ Blx~78###’ï@TäM²ŒÍÏy¥ó±Â‡Ò™€}c©Éõ7ú`&PŠÐn ‰Ú­•Sõ6 mö±i&P*Q@[«&0 / =´Ÿ3. û¨8(U ¸j&”š<8·ÌçU’˜¹höØÈ{Lã5™F²Lìï­˜ù§¨®O)Y:©¥¢iLl(E=hêA¢àxk†HÀ Žmö±õt¢àxkõ̇æLJ6Ãsê@PnPp¼}Š!ÄU¨wl¥µò»Ž¡5lä#QÂV~GX°”> †R,0a&ŠmkÅ÷ìòbÛc¤}`ìcÆ“(¶ÝZÙÙCgàX`ÜüÆ,07(¶Ý~ðÑÁUX ¨¸–¯Lú&fòC³§# Kù/¡8Зú† \l8sñêØ –Ô”®‘,7ÆVù¢Ò±7Ý]§²~Ó Õz©6Q¢Z+~Ô¢/Q=¶AÚÆ>fHµ‰Õ­•u©ÖNjT{ƒÕí+(L\©‚Ú}w^TÞ¹ìޛƚÕlU óKõN°Ml8æmÃíг¯Ð(/¨üÞ¶Yn uÌâ "áð(%F°±ûåµM æG3©wl&õ>5“òC4¸Îhlƒ´Œ}Ì3©OèŒZ+; ì |&õ8MÞ’™Ôß@gÔ¾‚ÑU3© ˆ”ü컡G2+Ö¿9çØ¶y ”äóÊJl Ý¾£µTRãcÃÔäP©óŠí?ÿãË÷—G¨Ö¦‹P­NⵡTÄÍh;ƒŠ˜"'Hk%é|®›ÏÝ?gßAþ[(—R>Á({ 4](v‘8S2M¯˜ çåá#C)_.'ÿÖ$ÓZ©Þ޽¤.ásü­=ÏêÃ3\-»8ž%lÔžåUåÙ[ýò¤ZÌ—ãû c©[ ý’a6<+›ÒË­9ãϘMiC+6õ&›êÛéb£lJHȦ´ÑÜæ²©¾']xê ¢lªgįèšç쀔0û®:=ö. IUï=¨S~r´±’OÍä(‰ßˆ¶ŠòªQAaSÉFÚAå>ÛÈ\$4ý&Ìl(Ü)ÒÑ}J£!%¡Ñüš$=Ó=iŸÒ=i~Ô¡ýJ÷4´AÚÆ>æIÒ§tOÚ7ÜÇJ÷Ô·Ÿ“èž"5'IŽîI4I Vöù[eE¯—ÜNóLhï£Ë%Bl( "h˜dš”d&é ,ˆ†6HûÀØÇDФ$#:0ÉHgàA&ÉÈÒýUƒ¨Ìß%ˆŽn䆖ʡ"ê=Ó§Då—¯ÐuF*]ú°”0î '.†ÒÐ×L7:¥›Ít‡¾žtQû˜C_¥t ˜n¢3°ÐïÛ Ï©ˆn"òQ3ôõ9º Qè_¤{8•ÌŸ’ÕÒÆl¼3ˆ–Ò¿ÚCi€I À0Á˜•à`hƒ´Œ}ÌA)ÁtD0 –>èç¨DæÁ(ˆ½½icåì$Ç®ˆkæ¶`¢êÿ!6<}ü h«¿‚=‡ ~ìX?˜#ˆÉH[É{DJ¸GwÅHö%ˆP[Ãé.Ø™Ëj´Ž ÏÇ–Ãú±åÏá†^[jCvd ù³±òÁü|²qx*Ù×¼iù™Å0ÈÖgÃóês7»$o9‚$»_Å" 2‰áòs†{Æ£iŠ#5<FÕ'ë}Yï²xlIœ=£å—q’ƒù‘Æ£ÖK<ÚØð|<‚®æq®vëx”Œ´<[PÍ|ƒôqèów³pļ‹ …;GÌ`Š#fqÄ:ÛyÚ ícÓΣÁGÌ â>V±¾Íøœ„#ù¨¸óhð>1I©“Ü5¿")Ö[ç:ÐaGÐØùÄJcˆ ¥1ãeĸeÄ8Fé V”‘¾Íøœ„2ù¨3î>”Q- ic=Ÿ4–“IN¹­¸8¼ÜB&qJÃ+02‰ )2‰ ŒLÒxx…‰Lõ±9¼BŠLb<#“t^~"“,}ÐÏQ7¼ÂÈ$ûUŠ‚·C|Ã,ÌÄ =d~aq#n J7P1âFg`a6´AÚÆ>¦0Ã&EÜÀ†7: ³¾Íðœ !nD>*†ªû7@²¾¹*Ì$Eç$%Ú%÷RË.YÍ×ûªX¢ZªX*b( pÍH%)R #•tà0‘J¢>0ö1¸N‘Jzá3ñ¡W¤’¾Íøà„Tù¨àpRIþЃ7½è{N2$I‡Eû®’´{7²”$$ßR1<ÁRÒÙEÙx(JÞ¸€Û´.ôZYÇu”üíq¾**¯ßÖ¤ë|üÑýò%µÙؘÆqÆ<Š+Ö>tõÓÄûpÅ$SØÁ,²|Å !_¤8È7Þâ-=¡@\Šwzb(Mc-«wˆÖ§ÒX¾ŠnUïphƒ´Œ}Ìi¬MÕ;DËvt;OcíTïpéƒ~Žºi¬»§-µ’x¾l›çêr·¹@"uì]X‡‰ÈÑ-… µ '¦ˆ­#2ÌóéúûTt²7ݾ‘ S¯þêzËP×»êò r7ÈcÔìÛ íc3êzL¡®7܇Y¡n×f|N$¨»ø¨‰ºá><È Ôð…¯B] m„~ü$bÌG—1î[æ§È@¤þ9_1‡a¦€S±¡ŸlƒŸlcødùÉ‚O"|Ú íc>ÙÆ$ðÉ6À}ǧ¾Íøœ&ƧÈGE|²ê>¼Ð<>‰´èWe…ÇÞü³C@qDÕ£ÃN%­Zê=‚‰ ¥q­ ‹k©¸æ v'á—F>jƳ¹¿t#žïÌ?ÈW6ÎG­d—T°&xӱň‚KeAbÃÓg,Ö6ÕÏX¬½›U¡Ÿ±dµW"NO>ªyVœï^Ì‚½Ró9û7ùcaxçÖΤ ÓøØpâ§¡ñÂOpÁÍô«ýò‚åßõsPëB}¨õ÷a6 µ’Øü¥8Ë=¦èü] ¡P½_bÙ€ 4Þh=“9²Û¾€ž®CÞô3w‰¸fÎIÇŸUâ.×>¹êÃõû¼ä:¾ . v0Þ%bCHÜ%bƒ§:»K¤oãIž:¨x—ˆkN"Á 6ˆD•|pq09ýÐ0¡]rAìŽJVÇÞâxì×RŠü~ˆþ¨è£Š ççˆÆÙG‰üùù …ŽËvÞ„¨öpbB§SBÇÏKœ^ I†6HûÀØÇ´‡Ûæ1‰=\§Ø¹Og`{¸}›ñÁ‰$òQq×é“„$ÙIòîéTÏO%ç³’ %%ë—û>æ™Ïw®ÖÃÒ]e§5Ê4G1÷Ôgî;ssÿPÌøÀ™œy£8³ú|¥Û?Î,%p‡eÁÓ·ÆÕö ùÉmˆ‚k¯¾ñ’Û’ú>‡ûœVïóQ²ŠL.âЧ’UËä"'«v’‹D}`ìcNV1%qÈä"'«8ÉE–>è稛¬Ú“ä"’‰çÐrÆÇN"W¯AE•ȯºÌñæ©¢]¤–žO]ý’ËΟ$584bßfªøåÕ£\ž¨ù¥²3ɉò|‰²÷ÙÕ>J¼ÏG‰Z` R ˜‚Ã…•‚chƒ´Œ}̉ZH)8\îc¥àèÛŒÏI‘ЉšoNRp`_¢Ó¸Z‘¸ºßñ¥où²ùí' ù“o˜Äc6g_ʘ¹”Н£P´ S¡ø€î&" *%" ЉÈ:£{ mö±‰îš”ˆ,4LDÖÝ£o3>8‘E>*Ò=‚ºˆìM]Ê®óšÉ K0»ŽºËÑD){$¨E¨…JqD{†#:¤pX±¿ÎÀq¤oƒ´Œ}Ì8¢] G4+ZØ8ŽtmÆçtG5qî#,“¤õ*dÓúc¯e?3íR‡ž^ÛƒÕ×¶ï#X©_eï˜Éôä5Z’•ƒ<¸KW¥Ͳ*U±áÌU©¢£ûíÀ{Gýž¼´ç`ÇÖWÝwÕÍUçæç\”0_^-æ¦ æ9ŒV±áDÓŠÆÊ1úŽÚÏâ iϘ‡ú n¤!€˜HwRk#BtûØG&FA,èÄ 6œ b@cå-°—Ön®^Úö 4 ½¢¥5$®hi­t—µ7И± Ò>0ö1îÀ´†Ä-­UsüŠ–¡Íøœñ-±z;0ÐÆÉ}@7ëçX‰Â±$É5o§Ý€Ô~Ÿ³ G÷×ÍΆ'«ÔB›pÇUj۟ͺJmkµ¤ˆlo Uj‡6@º€ØÁP¥¶ýY¯«Ô¶VÅ(V¥vhãIž:¨W¥¶}Š“„D’‰5{í‰d õ;H2kIÕ™£’k·óog&*ŒÌ?ìÆ©vþ¨•@ v¼72×Õp;”[³«>/4°(Â\ˆ 'Þ>Ü:¢#(Ó&â}ï %Kø•Å·Ó7Ý)Q›Ô«”bÍRL©Ó Kÿ ®R̾ Ò>0ö1§˜F¥RLÓpÍ*ÅìڌϩHйø¨™bš“ăoˆù²Ï¶!]8ƒsºï“þ“ÁŘ2›™ý³¡.¬bpau .¬a¡lÍ .ú6HûÀØÇ ¶IÁæà .º6ãs6.5ឤD»è\¢ùœÍ©ßT½ÊA; fÊ(ˆ ¥ñíß^¥âÛ‹=«øîÛ ícs|»Šoç™çWñݵžsîƒ~ŽºñíO¢ÿ_´e¯‡`JÜtµG–ßNHOå_ƘÞ!¡”Ü>“?t‘¤`ýji§¼c+F¿‹ã M gPM‚ãÜZÙ®µj8Çylƒ´Œ}Ì8çÖÊwßç8mÆ÷§Â 8Îí?‰ã,Á)ÉåÉѱW‡‹vÇÞÕ¤H˜™\î)ÑÚ>ñÅ•—jRµó±¡¸”ò ¸T‚T J+\š“ªÇ6HûÀØÇ\J%HÕ­Õ2Š“ª‡6ãsƤêØGMàÒ'‘ª%À%9”x÷ ¨;KÅ.ÚjÚqH°>5ÈgíG­ÛW¼@š ¥ŽAÚˆ Òøö®2üˆ± Ò>0ö1C$î€áw±à÷@ mÆç´Òà÷@´¯à$Z½Ò$,…÷iÇÒg­ÎqlÅÖ=ÔÒÃsÌr3DuËl8ñİuDâKT)*ÿ²Î,–Á^Rûa:AÑú­=Bj´ ©Ñ¥šï¬«qg=FÚ¾ Ò>0ö1#5b ©Ñpf…Ô]›ñ9‘ õâ£&RÛ“”¤þN°7t~þjõ·y6à¸r…†b0´3Û tNCÝÐ!¼1I$&²Ë»Ú)Àtú]y1=¡|ùÏ@¹êBPþ$¡Ã¡y,‰"Ï4ÜÃç ʨËFvÜq"Y/3h‡ËrãE.0Ng’E#õÑ?ëD\Ê‹ö‡åd°=ÃWaNÔÇŸ1ÁWÁQz·ê޼o¤ ˆŒüq Áï Ôæüñ™1¾tᩃŠüqÝ̃ëØÙC°¯yjÜ*FvK¶¸!Wâ-ß)ÒìÀÃcY’[¡³“?rÉ«K1­gbëf¦çó¦•Äh•’ÄhÅ$1Z­$1} ]@ì`„4­R’­w°’Äôm<éÂS5!M$‰llHb$÷JÔ‚šÎkNÞȪoPGr—¤C뙨½‹ ç%â#!eõ .(Elöb[Èî«7ý`SWSphH)84?Ó°Rp mö±iSWCJÁ¡¡á>V Ž¾ÍøœDÁù¨¸©«á$GõÍÈˇó3ìû†OÀ  ùßlÐI%|Ï<áú¢26¢gÉ1Qµ;-ö±4,JK ¥°„L)¢1¥ÑüHãJ)2´AÚÆ>fX”RDvžÕ8,™I)²ôA?G]X“”"X’(Eò{¢ßͰgóK²ˆÝqLtÑ%(…xWNn€xö ÌðÑÛõžV¥¼Ù“¿ µ°®q¦mÕĆR8tLX£]JX£Öt‡nÖD}`ìc†C›ÖhË„5á„5KôsÔ…Cw’°F‡aÍ~Àa /¿Cé@]R1”ºåª°±¡J=ÓþèÒþèÀ´?:¬´?C¤}`ìc†RŸÒþ KøØ‡_iú6ãƒíOä£&”†“´?(hò% Þøa¦`}¬œ±~‘†‹¡ºÁB$‚Øp&Kh´“S¿ˆ¸JÆ›çFïOÛö*ßÃWZÂË^¶I†×ƒ¦±ƒ&¥±Å4v V»¡ Ò>0ö1%Ф4vÐ0]g` Bßf|N¢±‹|TL@¤±“$™í0úº›uc‘¤ÎH;—nòÖ&cP‹|ÍØØpâdÜ:"‘Qmb8öâác·„ á^nçæ™T6¿¼`ãùÀ|†‹Ó®˜ §}Ò§#ª ô‡±„NÓ·ÒÄF.h›àâ€Fæ@#çâôm<éÂS¹8íÿΙÙ~Ü÷ùêø%,òùÛ[º4t#p Â<‡®3e×~Æ™"ÜíE†Ò$×0-˜”–øÙ'˜•–ohƒ´Œ}ÌI®IiùÀîc¥åëÛŒÏI´|‘šI.ž¤åËBÁÁ´Amør)ùáŸâú#¨„½A ;ãí'µIUl8S¨X$ä߀ {º*‡}"³+š.+—ä>й/¨‹%YæmøÙQAðÐ󒯥Þp» ;DWÑÅGBí!*Êe¹Š°õI~”žYdéÙ¸.béçbÀÈňӫ¾ Ò>0ö1§gãúŒ¥g¸X¥g]›ñ9 IÏ5Ó3w’ŒX’žIèoo³@á[F×âTË-’ãžÙ5J#ݳKºÀ§.éN¿º¤khƒ´Œ}Ì‘îS—t×ÜÇê’®¾Íøœä’®ÈGÍHãìªH1»F:~j¸²»‘ç#=›W•µË«Ç$éL>žïmMtºí9Ç óÔþVŠ¡:Ì’ƒMl(„jÓ…jÓ˜T~hkÆCÛj‡6HûÀØÇÕ¦Ñ ¨îïê¦>‡ê¾Íøœ:†êÈGE¨6ÍIRV T ˜c€Ù@Ï冸[²û$YÃ*}—€øF%„[Á…Q‘²2ĆR¸ÐLYitJYi4SV½RVmö±.tJYitÃ}¬”•}›ñ9‰²2òQ.ôIÊJ \fIýÓþ5œäÖ¬|¨¬BPLM$–$«ý½¢„ür9¿TìuŠâ ¤e/cœ ¥ d˜ŽÒ˜”ŽÒð38cV:Ê¡ Ò>0ö1ƒIé( °³ÄÎÀA&åÒýuAÈœ¤£”€  ÑÉ7òˆ êXÏï,å7¯ó«¼ê›ñ¢äO²ó'Ùw“<ž/8‚©a*ÌÙpÞ±h爇¤Vಥu›‹¾Èú¥`¯Þ9ø"2(Ôl yA¿ÔÏð@ãÏ*Á4(ÏôÇC„ê×·ÒÄFž Áà ôÌzÎìÛxÒ…§*ò=Gm ’ Ý®.Ú…–õuì‚‚,’ Ò )xÆÎ4Z­ul(MÍ¢Ÿ¢~*cüJˆ:´AÚÆ>æÔÜ¥„¨Æ±Ó¥ÎÀSs7 Q—>è稛šûs„¨ù(;˜‚—¿øD@¡Øþ’+"¦?³N5ÚØpb]8´l|üóžN†cIÔ[Ÿ^×⣃¹Mûûzä«ÑýhFLyhBJyˆüð›•òphƒ´Œ}Ì3BH)Mà‡Xa¥<ìÛŒÏI”‡‘Š36ç(E3±ף¿Ÿ¤3Âl8}FXÆÇ[ÌR‹¸‡Þ&ÚAõáÇÜ|ÌܧÍÜûfº(jÍ@:ãQû`¦CÅ.}DåS3?·D½ºôqhƒ´Œ}L3ªÔ¥¨Øùkg`3]ßf|Nréc䣿L§ÏQ"Jf:ëMÂo-¯/¶ãàS‚˜¢úÏùš|oTÚ±ô9÷%l”@Øwš‰z¹ˆ¡6€©RªEä'+ÕâÐiû˜aRªEÃ}¬T‹}›ñ9‰j1òQ6Ì9ªElXy²¬¨Æ• ˆöÜÍ,9|ûª°%Ì¢^¢ÅìÏ 2ñ bJ<ƒÈÄ3ˆ+ñÌÐiû˜QSâDà>Vâ™¾ÍøœD<ù¨‰öñŒ%$GÙÒ7 •.îÞèÖÝÎm»Èxlˆ '*¦m ñuçË®Y±ûäD‘÷ Z®S¥£üË öeDVÃþÑTë˜z ]J½†ü|ÝJ½6´AÚÆ>æ©Ö¥Ôkè4÷±R¯õmÆç$êµÈGÍ©ÖÏß}ý©VrÉáû ¦ƒ§vÉ u‡2™ó›¢j%ÏÃÓ8+{Åfe)¶~~ùùõks L%BòçG ¾np¤Æ˜õÉÙ»ê2ÊW=Ÿ#¨ì«¤.‘Ü S»žJÿE¿BÄ®3îëOcF»ZF§Ù9?ðhá›z¶Ïã']׳ÙÞ†Ð0|låsN»þ€ãØÊBäc%ñ1T¾·ìߌQ¤v}ô¨„­tÀ9ÕN̓ÃoTûèÓ7þÝÒõÃÁþóëÏ/ÿ©òLE endstream endobj 710 0 obj 9632 endobj 714 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 162 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_special_variables >> endobj 715 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 216.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_for_c_and_cpp >> endobj 716 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 764 158.250000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_code_typemaps >> endobj 717 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 757.250000 177 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 718 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 749.750000 127.500000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_examples >> endobj 719 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 743 238.500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes >> endobj 720 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 735.500000 261 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_typemap >> endobj 721 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 728.750000 255.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap >> endobj 722 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 721.250000 212.250000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_converting_java_string_arrays >> endobj 723 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 714.500000 231 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_expanding_java_object >> endobj 724 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 707 204 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_typemaps_return_arguments >> endobj 725 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 700.250000 243.750000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_downcasts >> endobj 726 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 692.750000 228 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_equals_method >> endobj 727 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 686 228 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_void_pointers >> endobj 728 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 678.500000 172.500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_struct_pointer_pointer >> endobj 729 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 671.750000 296.250000 678.500000 ] /Border [0 0 0] /Dest /#9c#cf#9d#92#2b#92#c0#24#15#08#bc#83#ff#8c#e9v#60#a1#01#b0 >> endobj 730 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 664.250000 263.250000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 731 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 657.500000 291.750000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 732 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 650 142.500000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_faq >> endobj 733 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 643.250000 115.500000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_odds_ends >> endobj 734 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 635.750000 159 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_javadoc_comments >> endobj 735 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 629 218.250000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functional_interface >> endobj 736 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 621.500000 184.500000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_own_jni_functions >> endobj 737 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 614.750000 192.750000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_performance >> endobj 738 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 607.250000 135.750000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_debugging >> endobj 739 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 600.500000 115.500000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_examples >> endobj 740 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 587 99 593.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript >> endobj 741 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 574.250000 96.7500000 581 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_overview >> endobj 742 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 566.750000 105.750000 573.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_preliminaries >> endobj 743 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 560 143.250000 566.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_swig >> endobj 744 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 552.500000 181.500000 559.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_tests_examples >> endobj 745 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 545.750000 140.250000 552.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_known_issues >> endobj 746 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 538.250000 99.7500000 545 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_integration >> endobj 747 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 531.500000 178.500000 538.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_node_extensions >> endobj 748 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 524 178.500000 530.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_troubleshooting >> endobj 749 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 517.250000 152.250000 524 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_embedded_webkit >> endobj 750 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 509.750000 162.750000 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_osx >> endobj 751 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 503 147.750000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_gtk >> endobj 752 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 495.500000 207 502.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_applications_webkit >> endobj 753 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 488.750000 97.5000000 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_examples >> endobj 754 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 481.250000 121.500000 488 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_simple_example >> endobj 755 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 474.500000 118.500000 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_class_example >> endobj 756 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 467 112.500000 473.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_implementation >> endobj 757 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 460.250000 138 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_source_code >> endobj 758 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 452.750000 147 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_code_templates >> endobj 759 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 446 122.250000 452.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter >> endobj 760 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 438.500000 140.250000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter_states >> endobj 761 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 431.750000 206.250000 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_jsc_exceptions >> endobj 762 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 418.250000 79.5000000 425 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua >> endobj 763 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 405.500000 105.750000 412.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn2 >> endobj 764 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 398 111.750000 404.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn3 >> endobj 765 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 391.250000 189 398 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_commandline >> endobj 766 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 383.750000 203.250000 390.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn4 >> endobj 767 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 377 180 383.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn5 >> endobj 768 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 369.500000 153 376.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn6 >> endobj 769 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 362.750000 153.750000 369.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn7 >> endobj 770 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 355.250000 126 362 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn8 >> endobj 771 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 348.500000 129 355.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn9 >> endobj 772 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 341 146.250000 347.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn10 >> endobj 773 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 334.250000 161.250000 341 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn11 >> endobj 774 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 326.750000 243 333.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn13 >> endobj 775 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 320 125.250000 326.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn12 >> endobj 776 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 312.500000 130.500000 319.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_structures >> endobj 777 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 305.750000 135.750000 312.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn14 >> endobj 778 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 298.250000 145.500000 305 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn15 >> endobj 779 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 291.500000 208.500000 298.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn16 >> endobj 780 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 284 174.750000 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn17 >> endobj 781 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 277.250000 144.750000 284 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn18 >> endobj 782 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 269.750000 185.250000 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn19 >> endobj 783 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 263 206.250000 269.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn20 >> endobj 784 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 255.500000 145.500000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn21 >> endobj 785 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 248.750000 159 255.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn22 >> endobj 786 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 241.250000 148.500000 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn23 >> endobj 787 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 234.500000 141.750000 241.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_namespaces >> endobj 788 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 227 187.500000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn27 >> endobj 789 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 220.250000 158.250000 227 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn29 >> endobj 790 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 212.750000 168.750000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn30 >> endobj 791 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 206 99.7500000 212.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn24 >> endobj 792 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 198.500000 156 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn25 >> endobj 793 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 191.750000 146.250000 198.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn26 >> endobj 794 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 184.250000 161.250000 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemap_arrays >> endobj 795 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 177.500000 209.250000 184.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_ptr_ptr_functions >> endobj 796 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 170 117.750000 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_writing_typemaps >> endobj 797 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 163.250000 168 170 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_write >> endobj 798 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 155.750000 153 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn31 >> endobj 799 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 149 153 155.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn32 >> endobj 800 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 141.500000 195 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn33 >> endobj 801 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 134.750000 175.500000 141.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn34 >> endobj 802 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 127.250000 140.250000 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn35 >> endobj 803 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 120.500000 198 127.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn36 >> endobj 804 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 113 170.250000 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn37 >> endobj 805 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 106.250000 161.250000 113 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn38 >> endobj 806 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 92.7500000 89.2500000 99.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave >> endobj 807 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 80 105.750000 86.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn2 >> endobj 808 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 72.5000000 111.750000 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn3 >> endobj 809 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 65.7500000 163.500000 72.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn4 >> endobj 810 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 58.2500000 180 65 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn5 >> endobj 713 0 obj << /Type /Page /Parent 2 0 R /Contents 811 0 R /Resources 813 0 R /Annots 814 0 R /MediaBox [0 0 595 842] >> endobj 813 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 814 0 obj [ 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 722 0 R 723 0 R 724 0 R 725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R 735 0 R 736 0 R 737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R 793 0 R 794 0 R 795 0 R 796 0 R 797 0 R 798 0 R 799 0 R 800 0 R 801 0 R 802 0 R 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R ] endobj 811 0 obj << /Length 812 0 R /Filter /FlateDecode >> stream xœí]K¯å¸qÞß_q×ÜŘžG€, f€,‚,‚±Ãð{‘¿IÔ‘X%–U‡zÜžñÀÝ}ëÖaQ:¬‹_ÿ¯?ü÷ûÿüãý÷_ÿð¿ï?MýÃ[÷ÉC—þ÷>ü÷»œ Ã§éßï>ÀûO?¿ýòþËÛ÷oß÷þò–>ðÃ×ÿÞÿëÿÞõû¿õÿÿËûþWOüÃÄ40üüæ•ïÿþëøwôªÿW7ÿ=Ðÿüöÿôþ·ać¸i2øçß9ý0‰'‚y{<¤ÿûÇO{û}zü=2”hß•5ýÑê÷¿ÿñíOÃcIæ©ÖóTvá:3~¶K‚ýBçû†ñJT×ÿé'1á§·þïOJEÂÌx Èe H=~ì|^QjüšGÿç4ÏÇø9~ê¿Íæ/`x~ü$ óÝý²ñÁÏ?¾ýþ»ø®Üûê5¾èô×ý»ÝÿÔÏ"¾ÿø‡÷î:õí¿¼ÿø—·~ê±sÆï%ýF÷õÍøûÉš¤óoŒÞÿý÷™îkVÎwé3Ëð¼àÏÕ¬¼¼.ÐA ;?¼!ƒté ÷ ºàѤùÇ ÜgøÙïyi9À'£ƒÂ¿LÖt‚Çàç–>óí½iY´£d1`ÔXÕ=,†—þÚ+^ÉÑš˜mJ&G1=šœ‘ð˘MŽV%“£;*£[™œgš§B&g‘q¥ÉÑá>&çÉñãoâ'rÕÀ8¨4ˆ2Í«±¼j¯øçÒ5zN`%ø÷ÇÚ‚ 9–uñô­+õ0:ô3Õ–EÇŲ@NxX–öZ4ÂZÄÛIÏ.Ûò­™Ï“F˜éC¿Ù³òŽì²ØÐ^#x÷ź¢WÌ.L^ÎÆ2÷•ˬ¶Ÿß Ó¥å÷̱YE›Õ%Çf-q:=:¶‘ð˘›íJŽÍD"£'PÇ6ðLóìc[d\騬¿cã?s£Xz‡¢óöJ"˜UÚûzðj—dÃì’¬Ë µ6ÁuÄ&8U² Î}í Ô&Œ<€Ç€\Æl –l"£'P›0ð¤yÎcàç¸Ö&8w› ¾f·g’pà;6ˆâ=.îØ,ó.·iœzöV#þæ_èjø¬ó³µÐ!'Àö‚f|™æ˜¼Ïþ¹£§/8ƒÝÊ(±†Ú#û9øK?‡.™Xç&똨úÝÁœ“N„ŸÞœ¬¬zð4„Éôìéçì+þ°÷D@Oè?&1ð4DÀþüöùŸN7Ñ¡×a€C,t[kû±’|2íÖU÷Éy…œ†úª>øìúM3†¤Xî¡ÚAN¨ ¼b WŒ…ÀËÓC?:dSâ<ä2æÀ+úRàéáIt«Àkà™æéQàµÈ¸0ðò½ZKFÛˆK§C©³TF’<{Û)É—ñç웽:õZúæ% Â1` JzÇ/åkÁG’§æ³|¦œßñ랟5ûŠ%OÚø0“ß/yúUJÌRu8ˆ®€ëJºòÄÉ{屓ïMxÉÉÓc>?óåN~ä<ä2NÞ+Wpò^‘ãÊ@œüÈ3ÍÓåN>“q¥“׿#8yvnÆç3g|Ú÷HoCï­®?VâÝz¬³*’MÐ'Cü›­ööÚ.Þr‘Þ°¶~ÈÔÚɇ€¯æoL¶~ûDæ\Eëƒ À*ê´*©è³ Ã8dôn¾dÐ#W?¹æAÂÈx ÈeÌA†Ra,•aWAÆÀ3ÍP±È¸2Ȱúšß+ðúÍîp6|ü®¨EÖïcé5ÿf¿iµ9·3ÚÙ•t×½ ´î¿X»Ì‡ßìnýK ¿ÏBýIâܤd«/YU« PdMöðJED‚N‘¤º j…žE$$"WŠH(àÃO€<¢y¹Œ9"[ŠHÀPf‘ <Ó<-ŠHWF$N}„ˆDµLHìûjS"ÊJ̆ÜDWn®IÐŽ Ahù¾Aä¾øoIPÈÒÖÅŠì?û›ÐœÚÿ[}¨ªÙ)ЧÎѦWà>éqy¬ó\½ˆ6ýüf£*©×3ç-ñxJÏ{âFø öX~vqˢ=ž7%ç5•¡WÏÏ.n?ǵ/ÌëåÎOãî@ÄHÂaI Èõvñš”dµï sÙ„±*'¸)· +o—ù+«Ùo¶ þö$÷²f‘Ô™JN²Û¢fš†¼*ŠÓ²ñF«3áX¯~~ƒ²¢=ó‘4 ð±Ô,ÀS¼›«f‰ð˘½p,5 ð‘âöâªYÀÈ3Í5 Èd\é…ã1Í{avnØ}ç*†¾r׺¹8G%€3áÀ]_*8]¾üˆ×¿`$©uag°ãåß¿Z‡CÔ©ßö5 +ýzâpúgÁ'¨R«ˆ@±WA­ZE$Àc@.ãáp‚*µŠª£2V­"Fžiž¨UD&ãB‡Ô1­";Iß~ÛÇÏàòÛÙù¾'fg¿ÛåíǬÏÊŸ<³=»žêÐAÍõbv2‡÷ªa5æý4ïDØÕ:Üཊà0“Ÿì˜{w©æ:V{r²ºû­£‡ÒræÉ éL©7F §`V½1à1 —1{rSê4j êÉõ£7Æ2~Žk=¹9¦7FcO.iõ!=¹$c,njþð{I™Èh¬dëѶ®çYpµO7K³1=5LD÷‚B7Þ6KÞôÝjŽDEx¡Õ*_^÷Ÿd%õþÓèÒÒzæ?ô‘ Pê#('ÀªLâ<ä2fÿiK}d‚%°¢@ý§}ô‘YÆÀÏq­ÿ„cúÈ´õŸ’®Sê;În˜þ`FÐ[A²)Sò†R^¹øb1HÓG7ãÃ’}_«ŠªsI§U!'¸±V[…³ÝÙFCßÞën~´bs‰¿áÙ9Ò¯ü™st‘8Gß•œ#Eî„ ¹“;·‘ð˘£ %çèi Pç8ðLÈ9ºxçèïÓÂç´ökM¡9¢ðêa/M×ú¹†Ï—Ž,üqDîÿ½Õ”08ò>”Þç3“H{¦Jí™…y„¸jÏ”x¹ŒÙd‡R{¦\e P“í™–1ðs\k²ãÇnÏ$iܤüþÄSÛ5B|§QŠs*'? Š,>dcŸÃ¿zþK¾®¶°A×"QþL’ ¾óéÕYMMï`£S¼H¾ÓúâÝË`U ã?³qEÓ€ñ×vññÃ…f¶ä.žÄ\±#ݲb 1W¤H§¨Vݲà1 —ñˆ¹ú‡.Ä\±#ˆ­@b®‘gš'ꖕɸ0æŠêCtËâc.A­ûÆ\ûê~m‘MmDÕÒÎÊÇœpà6¹„Ôé¬ w,ùÙq !)_{áÀStÇч<Ë>«…ž$Õ¾6 2:XÓ‡6Y¾¤úÏ¢ MÚdE]j“)ú*êU›¬Äx ÈeÌÑ….µÉŠÚR«6Y#Ï4OÔ&+“qeta>B›,~4I-þQ³@Éé¹$d¨?S–ÔíoX‰Ë»mdN©ó:ËIT‡Of®´ Ž<»&ö‚QÚbK$¾»Ãî yÚñÚÔâe‰!nü ø4mg³‘’t˜oÑWÄøøne|^¹)Ú9ñ4ýì w#EðÕEq„¢ëFƒ†0¹€én¤hmán¤h `èÝH#O@C,໑"œÝhLt®Æ|ófaÕì¬~‹gÝ*qäórQà®Û "ÌuÀ¦³9áeÛæ,¶mJ¶Í‘kÙâˆêÂæÉ=¬Ù<„Évú?Ç•šßÏâì>"ÍøoËÞÛº±õÞÐ9©S¾¨$·íMtM¡Ýü‰í†¹ÝŽÚ•…í—ÿ\ bÀ愱{AHó¾´ë7²¢üŸmƺÖñJñêûù :WZŽÏœ£VÄ9êB댞j‰ãÒ´uÆÄx ÈeÌÎQZgØNE"CÑÖ‰gšg‡œ£¾AëŒ~g·Î8GÑýCw]¬9Ä™«¦ØQC«ú­ÈÆ…N_=±ºÕþM/m*ÒÍúø6½ ¤<.ÿ#Eb;l¹Á¯Þ*_zõÏl¹íˆ-·…6=Õ;ki‡‰ð˘m¹)´qè©È0´CâIó4Ùr{ƒ6ý,În㠲傛[tRˆR=jÓø\ÔÈ­)®vÿ>àµäJ›™HŠeî—-5Þ;<Ô«õÒÂÄœPke!+ë ýzª&ÐÑ~à1 —1[Y(ô詞ÈÚ ñLÈÊ úô~v?‘•m{–*)âÃG½M ¿§ÑªõÌ͈]ê›]VÄý©ªíü'M?Çõ©ªí‚B‡ž#Ÿª&ƒ†0¹€tªÚÿì×§ª=ÕÞ‘SÕÄÐ ¸îTµú³ëºEϳûï¸äG l{Éž3Ôþ _JÂÎ ¯ïí·Ô†•Ö¯|¼jJk#°YË7VI¯LÁ§.ü2 ;Z 1 ç÷ü 6–@Zë¥Ó„o¹ßðrŒÜmØ^ç³~Râq`…‹Üû®'‡Zz;µ—¿ †TéeÇáU'£,v2Ê–œŒâdq2#AC˜\Àäd”-9e‰“ÄÉŒ< °€ Œ‚ 'Ã/Ô¦Gû·îÁ)òjÓu!-·å®Þ sÂËëßy¼þ](­ß‘åé»Õúx Âäëß¹Òúï·X€ƒÕúx"`W®_QÈ-Yÿ€Ÿ÷`8%BÉŽ¤ic†VQ–ZnÕÆ~!T&TÀµŽ=¡PëØSÉqÙ@ †Äx Èe< *j{ª¥2h­câ™æ™×:æ2.L0 ó9WãÑ —F…\ßn‡Ù#³ó§[Ÿw%%ÔrÇ IºÍ.ÝÔ`ÝÔ+è¦îÈñÇ@ º™x¹Œ‡nêÎtSw†Ê0T7Gžiž6×ÍLÆ…º©UEÍÊYº)p¨_šn·§»ÔîµÚ«UV¨rÂgÓ] +õ¬jÌ/2E¾·áÚ©Xú"Ÿ™am‰Ö…Û{*9Ô ëÙîj@fX[b†uáÆöžª© zc{â™æiÖ7¸±ÝjóÜže†%)bàC Þ¤ž„áÙ]ž¢7œÈëš8™Ôåæ,cNx5 ­A mm! i~K§üVžy Â䦂¶º@ÐVQŠ&Fž€†XÀ… m+*mÊ)ê¡Â/æ¦`ð؅ϾIJ÷åp¯Êd€ÎnÖ/ Ÿ µžÎ‘âíJÅ+Ú‘âíVÅ+‰ð˘=+¯h×Q«â•‘gš'*^Éd\éé\EñJSej› ໇‰2xmU¦mš@à¹7Âlþ°ßÏF7¾W÷1Ë"F#ÂûM ~!ªçÙU»t«Éwa'£_€RÞWûøýÿãÛçÓ ^¿³¿ïPQp¹Ákœ1å³’j"öIé×\ÓÏmC-øßaÑ+šKõr‡íTN¨Œ‚LGí¦+!Û M‰šn…lO<€Ç€\ÆÅ²]GšÚ+dûȓžˆí™Œ £ ÓU ÛÏ2 ’FѼëjÚ=^Ô¶£m[þHD€!ÕJ÷´Z´6¢1Kówcºœð²5Ê_îE®)_®0m½(ß}OÙµ‹³q@È»ü}þÈ,Ý„ „œðúr5îúåjÁ\¶\>a:.¬'>„Z¨á´j–N…f,Cž µQÌråƒJQ ͳG¯È˜x¹ŒGc pEFO%ù¢@¢˜‘gš§CQ ø;D1îd•d•‹’©_f.§:dXzãiçrÂ÷“9‡WŽá#Iþ|TrrÊ¿éUÉsóØU šwÈ<+Oh¾átrãÜ$F'úÕoÂýJá^9ê3Ë}ÓϾpÔ7ÜNâ9êy Â䦣¾~ŽúŒ·T€¥G}#O@C,à£>Ž*JjÄ¿LøÉx&g²NrBm ÐÄÐÐL‘‰+`â<ä2æ8.–@€&ÒŒW\Gžiž˜É¸0Ž2‚ç®úÆgrü~U€ƒA1j#/»ôCÀ¡rý[EÐWV•ÐWc“|m²þà1 —ñXÿV•ÐW©;=’±B_<Ó<ú*“qåú×Ï÷½§­ÉΛÝÇ´ìV½¸—~f:}ɺ É hê·ÿ…(§ªp2H”3ò4„ÉLQŽ5%@“5Š XšFž€†XÀ…QÎÐuãõ.éÑÀšÎ ]Îjº{Ox”]:V¥ÛL¨uE@àQJð(KÓ]Vð¨Äx ÈeÌ®Jð( •±‚G<Ó<<*“q¥+‚ƒàQøMãP¬mkÀ&m¥øüŸKΦ$IÆÿ…NñÕšçCW *'Tjt¤ß¨R¿? ™P«~‰ðËxht¥~БŒÊ@ š1òLGýþ2j¨ƒ 4Íh›¿‹fìëe]_¾{©ƒµ´Œ!'ÔªñÒ]ùAˆ%56Ѝ˜Q+5y¹ŒYµ/©±vD†v+5Öî¡·óø9®UcsÄH¢Æ‚pQf“–Më»opöŽ:úmíÆ÷C)¼p«tµy2 6Ì…œp`I Xj•¹zÑ«e"è¶$Z@‚]æS,UE¡þBø´ý†7›g‚«hžÉ#g~kžùè{VúÌ7¬œÚÕ1® ¿lžÏ ¯:AÄm(!–ÚPºŽœ rè4ò4„ÉL‡NKm(!’S­@Fž€†XÀ…‡N®«ˆWXõj܆ò·6|'´ásK§®„ÌŸ ¯ê¤S¸5¦S¡¤“š´ÆT'õÔsÂä&tªÔÓ)Òs y"`W꤮pKtò·N^[ÎýÈ.{Ió–æL©ñÑL¨Üª;C`:Sj€é 9÷d«žx¹ŒÇVÝ™RLg,•±j€9òLóD 03nÕ­@•6U³ÆåÜüVRŸ)ÉÅÝù~Öco~>­Û]Ó<‰è8žowÉuÔ&#ÜÒzËê˜j 0€s¿;*` u`xœ³1 —1`(œ*cpvð8/càç¸Ö» €óYø¬Ã}ÁÑúÆ~åú,êYv½oGò¤{Љ>äë:«!ÝFÛ9ÉÕÕmÒö‡»¥¡œëÂfB­sðýï| ýï<9«Ô9øÙx„þŸeÌÎÁ—ÐÿÎk*c…þy¦y"ô&ãJ瞛泜Cã*æßœÃÖgXk·¾ÖZ²•døê»wl /ÀûmÜmتæÉ…®j;›j­ÞrsÀƒ`KV/’£}ÝÊê<€Ç€\Ælõ¢.Y½¨¨ µ²zc³ÑŸãZ«+j@βzÖêíènضwÿÊl´…¼9¶À/ÍäŒA„WOüÒ×~úÙN‰ð˘U?” || YÀ@U?< |–1ðs\«úñÀ¬Hõ:Q­ÀŽbI•œäH²¾Êå´3W‰þ[糇;íÇÒ”/5.ž /÷ô\ÞÓ;¨cÀ²mõñ´Û®>´o¤ªÎÕ­[™•U#ä†Ýãª:õìøšvÜy̧þø€¶~·&Ê¿²¥f]aé Þä„Ê-hôºô4Qô èx¹ŒGÈt è´¥2V@ï‘gš'zg2. Ù‚9è-r’šl¾.Š7÷tpÛÖ û”°t‘ÔsB­ÎX‚Í ¶„Í 4…ì ››x¹ŒYgl ›¬¡2VØÜ‘gš'Âæf2®Ô8›+Òû)©óù•¹¤I½–~:¹$؇n Ž ƒ+¡Mî·B7&Àc@.cV/WB7§©Œºq䙿‰Ð™Œ+ÕËw÷Q/¶‰è¸¹éÑñ]‚ßj5[º?7Œf„Z5 NB Nh"-„œ.ñr³š…œnÄÌ`+8]ÂÕth üתY8N'R3VÎ ÔLRCÁ·Öh[÷Þ6Á´ò©Vð¥¤QˆP©à±#™cWjÌ;Ò˜y O<€Ç€\ÆCÁcWj̇±ŒUcæ‘gš'j̜ɸPÁcw6 ŽÿŒùµmí%²|ûÞæ‚Þ Œžä1Úš°Cò–vœyn„F‚;~ÛÌþ¬ê@É·/À®±äûÂø´LµAå„Zï¡ J0êJ0Ò¤]Ô+”`â<ä2fï¡K(Á¨Hòq Pï¡(Áe ü×zýP‚FrhpVàÈ£©á‘ Ð(ò¤ËÉy/õ%CÔâÒGÖÄ.'ÔÚ6KpžÑ–pž‘&W£]á<à1 —1Û6SÂyFC’ÄÚ6óÀy.càç¸Ö¶Ùá[¿ìtUN¨Õg ÓèJÓH³¹Ñ­ §‰ð˘õJÓ$+=¨>ÃrºŒŸãZ}v÷œnèómïÉ«*¢âÀUKhɆz§­'¿ñ=Õ6=º²Ÿ´ª¾îØoCÕÞ=J7ƒ5ì¸ß™ µ†Ò€nô%€n¤ùøVÝÄx ÈĕҗºÑ“s…@ ¥t—1ðs\k(Ã}º¼¡UÜÞ¯¸~C{Mè6¬‘ øÀjöðFaÇf«i•sÛ<©èÂÍ.UÒ×EpŸ§¤ƒÿº¦ä]µY¤¯ýL¨5ëËKBX›õ‘#7¹³•^ÌòÄx ÈeÌf=º’Yô4)Âʬ<Ó<2닌ëÌz?ûà¼7ÌzÓŠŒÆûYAôåÜØÒ.ûYD¨Ógèåö„(·§F¢ÏŠ‚r'Àc@.cÒçžPåöTKePPnâ™æ™ƒrsWê³¾(wCŸ›Þ_ÛXŸYˆ£¨m1fB }®]mQôŒÕ26æ„Z‹b€XS€,÷Ô@´ÝPÈòÄx ÈeÌÅ Ë=ÕP²œx¦yZdQÌ ËÐÙû@–7,ŠÌ|’Eù¯D«Ök;C´ŒV9¡V¯Á½†Vº§z¢s@±Òà1 —1ë5°Ò=US+x¦y¤×p¬4t®ûz-@Q6ß!j`Z¿ßÞw¤FšEænµ˜^­P†~…_]¡ÜÏá> dÉú½¾vY´ •ì5Y¯Ãg÷_f綆ž Ìʆó|HWÖ¾Bf‡Õ^WæØ]¯Ìñ>€ãÆÊ,¹ì\V½ãҌѺœðòT]¼| *õ`‹¢[®%½¬W]üÚjW’Z(µ ô<"¼Øß”™þô³Z÷w_ ¸¿sâ1h“ HýAé¸îïÜS éïœx"`×õwîgqhOÒÊm´¸ E$x8IŽrCΞ+Pá±!öç*7øÊbhô.¦°ÁWtó­€BÛ&Àc@.ã±ÁW¶më©$‰0Èä™&žCÛrnðm;«{s(ïgDÛIýf“†F‚3Å ³/-¡`i¼8)ù.\(ˆ•p\(¯ˆ{Šëšx¹ŒÙJ¸®«§:"ÃQ\Wâ™æé‘•p7Àuõ¯à \—ÄJHöJ÷Co}(íÝ™TT~i{¨lN¨ÕÞà‰ö†|g fÅ|'ñr³ö†|§§‘(|'ñLótH{Ãà;*ßh¯{ù£á;u1ü ºý:]PB`sB¥ÙÐA 鮄ÒA b6à1 —ñ0º+¡„tg©ŒJh䙿‰PB™Œ ͆V¡„$fãW²‰¾ÌlÔê¨V î&-bEp7í×ã ¯Gþ5Þád¾aMê‡|žßа+›hÂÐ`ÂPÕx%Å«õOO?»BŠWÓ ¬NØÕ÷øJð…ðò~"h¼Ÿ…+Á{*p?Ð+ÁAC˜\Àc? W‚÷ÔŽ  W‚'ž€†XÀ•û‰p ±iʆ³ÝqeŒ Ì»Gíë}ùY›ý³®-o%I’2ß²vI²EäŠm7œûvj!» Üä„ÊhÉt¸ÇgO(ôøì©$»o:Úãsâ<ä2Ñ’é =>AGzJiÏÄ3Í3ïñ™Ë¸0Z2ÝA`Y>08 \ô1s4—Ùž Êo»$¦zµG¼Ì÷5ÝhJvîm%î<Ê5Ý ¿²Öæ„ZC¬;bˆu¡!iO%¥ÓFÓ†¤à1 —1bUhHÚSI ø@ †xäIóTb}ƒ†¤ý,Â6K ±¿ÅG³qÈiŠà ¶ñ¬O ‘ß(Þtw¿Ã'l˜ógMª«ÍŸ^ú·FDxuënLD[wc»ÂÖÝXwÖfÌò£Ý÷ÈcÐ&0mÝ …­»1ž0žnÝGž€†XÀ…[wc½K.ôúŽÛâ ‘”ËîèàÚv×-ét*éw’’T1Ÿ¼ý®Üd;£ìÆýçB¨í€`ó ”°ù†·Âæ'Àc@.cŽí „Í7@Ž=íàÍ_ÆÀÏqmlçÂæŸÔ”àƒæ¥xƒÂ‡‚5x³Ñ8ã#Ò¶>¨é=x»½žår­U7¾~…H:Ñ~³/ÐuK£VL¨õžTzJ¾ JV•‰ð˘}/UzO*=õþQ鱌ŸãZ_ªô8«§ÅŽ:-Ém—¹ÓJ>©à3.M`°ö&&ÃRcâCN¨5X‘Ô˜˜Xª11ôôÆÄUIâ<ä2fƒK5&&ÒS¨¸ª1y¦y¢“LÆ…ËvÕ˜œÔE¢g‡tV¯ÂÓHZÓJ²üc´íLô,.¬5 ¶[ŠZrÂëE-KCËßx¼,KËŸÏ(E6’åa^ém–Ž4ù;FÓÛ,À¼øl¬Ž¤føëd ¿áå‚Öñ%)6@àÿ-|W›<–YRNç„WÃv¹ gúÙÃÖEœ·$1<ò4„ÉL‰aë ¶ÎR–&†Gž€†XÀ…‰aëŸ{$þ¶éÆ©JØöb>1,wI\†OñzL8æ3­Ÿ­ê37^ÖÉ€ë¶l(ÕmÙ@ê¶ÕÉ0Õm-C˜\ÀC'C©nk¨F#Vu[#O@C,àJŒÏë¶D:)Ù¢n‹*ªmäsVÝÖˆðZÍ‹Ka•Ö9¡r3)¬‚®TX)¬d3óî+rÍt¥Â*è4•±*¬y¦y¢ÂªLÆ…›1PÏ£­šÝº½qÛÝ›ÄÙ( —41\ýÖøÞ»Ug§=¨¥Êu9¡ÖÖ,7Ž<¥B*ÐäDq P[£…TÙ˘m.RVTƪj䙿‰ ©2WÚý¼ê4[Óôâܶ­Ô·8? ß&9g\'²$©'É~e»ÿÉ]µÕ[šÛ¡a! Vïû·ïßéUy±~MÿþÃ/{¤É„r[ó©SC¦ç]? ›š™¢Q_x%)ÕkPWѨ[ÿfrºúÓ”iÊöÜŠýò¿áä˜gmCKsûnzÒu²Ë±£M):º‚ø•êÖ8­ ÒðþI°ðŠý̤Šj×£ûeÝKœWýî" üê§þøÆ³#ï§‹ýû÷ïßþ]b°Ø endstream endobj 812 0 obj 9759 endobj 816 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 153 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn6 >> endobj 817 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 771.500000 153.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn7 >> endobj 818 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 764 126 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn8 >> endobj 819 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 757.250000 129 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn9 >> endobj 820 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 749.750000 146.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn10 >> endobj 821 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 743 161.250000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn11 >> endobj 822 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 735.500000 125.250000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn12 >> endobj 823 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 728.750000 176.250000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn13 >> endobj 824 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 721.250000 145.500000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn15 >> endobj 825 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 714.500000 171 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn17 >> endobj 826 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 707 141.750000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn18 >> endobj 827 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 700.250000 185.250000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn19 >> endobj 828 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 692.750000 145.500000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn20 >> endobj 829 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 686 159 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn21 >> endobj 830 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 678.500000 218.250000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_shared_ptr >> endobj 831 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 671.750000 201.750000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_generic >> endobj 832 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 664.250000 215.250000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn22 >> endobj 833 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 657.500000 129 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn23 >> endobj 834 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 650 165 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn24 >> endobj 835 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 643.250000 138.750000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn25 >> endobj 836 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 635.750000 150.750000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn26 >> endobj 837 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 623 84 629.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5 >> endobj 838 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 609.500000 96.7500000 616.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn2 >> endobj 839 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 602.750000 105.750000 609.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn3 >> endobj 840 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 595.250000 177.750000 602 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn4 >> endobj 841 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 588.500000 180 595.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn5 >> endobj 842 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 581 219.750000 587.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn6 >> endobj 843 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 574.250000 184.500000 581 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn7 >> endobj 844 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 566.750000 149.250000 573.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn8 >> endobj 845 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 560 225.750000 566.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn9 >> endobj 846 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 552.500000 181.500000 559.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn10 >> endobj 847 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 545.750000 178.500000 552.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn11 >> endobj 848 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 538.250000 204 545 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn12 >> endobj 849 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 531.500000 160.500000 538.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn13 >> endobj 850 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 524 131.250000 530.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn14 >> endobj 851 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 517.250000 129 524 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn15 >> endobj 852 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 509.750000 146.250000 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn16 >> endobj 853 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 503 130.500000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn17 >> endobj 854 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 495.500000 125.250000 502.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn18 >> endobj 855 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 488.750000 130.500000 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn19 >> endobj 856 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 481.250000 135.750000 488 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn20 >> endobj 857 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 474.500000 186 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn21 >> endobj 858 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 467 171 473.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn22 >> endobj 859 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 460.250000 129.750000 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn23 >> endobj 860 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 452.750000 168 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn24 >> endobj 861 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 446 146.250000 452.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn25 >> endobj 862 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 438.500000 121.500000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn26 >> endobj 863 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 431.750000 168.750000 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn27 >> endobj 864 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 424.250000 174.750000 431 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn28 >> endobj 865 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 417.500000 144.750000 424.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn29 >> endobj 866 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 410 153.750000 416.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn30 >> endobj 867 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 403.250000 145.500000 410 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn31 >> endobj 868 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 395.750000 124.500000 402.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn32 >> endobj 869 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 389 198 395.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn33 >> endobj 870 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 381.500000 140.250000 388.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn34 >> endobj 871 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 374.750000 191.250000 381.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn35 >> endobj 872 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 367.250000 197.250000 374 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn36 >> endobj 873 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 360.500000 205.500000 367.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn37 >> endobj 874 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 353 146.250000 359.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn38 >> endobj 875 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 346.250000 108 353 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn39 >> endobj 876 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 338.750000 138 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn40 >> endobj 877 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 332 180.750000 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn41 >> endobj 878 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 324.500000 150.750000 331.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn42 >> endobj 879 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 317.750000 144 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn43 >> endobj 880 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 310.250000 146.250000 317 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn44 >> endobj 881 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 303.500000 132.750000 310.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn45 >> endobj 882 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 296 179.250000 302.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn46 >> endobj 883 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 289.250000 147 296 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn47 >> endobj 884 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 281.750000 156 288.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_directors >> endobj 885 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 275 154.500000 281.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn48 >> endobj 886 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 267.500000 149.250000 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn49 >> endobj 887 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 260.750000 195 267.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn50 >> endobj 888 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 253.250000 156.750000 260 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn51 >> endobj 889 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 246.500000 174 253.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn52 >> endobj 890 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 239 135 245.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn53 >> endobj 891 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 226.250000 81.7500000 233 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php >> endobj 892 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 212.750000 145.500000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1 >> endobj 893 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 206 180.750000 212.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_1 >> endobj 894 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 198.500000 163.500000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_3 >> endobj 895 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 191.750000 124.500000 198.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2 >> endobj 896 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 184.250000 130.500000 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_1 >> endobj 897 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 177.500000 147 184.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_2 >> endobj 898 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 170 129 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_3 >> endobj 899 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 163.250000 135.750000 170 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_4 >> endobj 900 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 155.750000 169.500000 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_5 >> endobj 901 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 149 176.250000 155.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6 >> endobj 902 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 141.500000 175.500000 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_1 >> endobj 903 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 134.750000 213.750000 141.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_2 >> endobj 904 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 127.250000 201 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_3 >> endobj 905 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 120.500000 201.750000 127.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_4 >> endobj 906 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 113 227.250000 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_5 >> endobj 907 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 106.250000 218.250000 113 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_7 >> endobj 908 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 98.7500000 152.250000 105.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3 >> endobj 909 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 92 150.750000 98.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_1 >> endobj 910 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 84.5000000 145.500000 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_2 >> endobj 911 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 77.7500000 192 84.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_3 >> endobj 912 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 70.2500000 153.750000 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_4 >> endobj 913 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 63.5000000 170.250000 70.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_5 >> endobj 815 0 obj << /Type /Page /Parent 2 0 R /Contents 914 0 R /Resources 916 0 R /Annots 917 0 R /MediaBox [0 0 595 842] >> endobj 916 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 917 0 obj [ 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R ] endobj 914 0 obj << /Length 915 0 R /Filter /FlateDecode >> stream xœí]]¯ä6r}¿¿¢ŸðµøQü‚'@ l ‹<^o‹õ"³û¿Š¢$V‰TSÕRKwæÆÈÚ·ººŠR«©â©â÷ÿöóßþ矷ïüùo¿¦ÿøóK÷j¡þïÖÿó].î5ý÷Í:¸ýúûË—Û——Ï/ŸÃÿ~y¾ðóÿþëÿnòöïáÿÿzûã្R¯ðû‹6üûoñßÞŠð_Ýôï^þ——ÿüÃíï½ÅÑ] þû;këqÇñ——ñ"Eü矿þýåûáò·øÊÜ„Vú&¼–·üöòçþ²8ãËq ]hˆß wi˜Wç:{ÊÅÿ"J]Øä& ~}ʼ á¥s“`ûè¿0tüÚ|_Q*~#è¤qŽ6ðuü~ÍŸ§ ¿~ü ’Êo÷eå‹~yùþ“¿ sûåÏá£x£‡ýîÈðˆÛ/ºýK׉ŸþõöË__ÂÐ}g$ÄßeøDÉÚ'âcüD¿j5„ÀüIÕZý;²«}§û±öñ!^ÃOè‡ówÜ`m ªjÔÌTmu°†1$AWˆú÷^•t¢Ñ± 5~©ezûØ„«ÞÈáIùé—óóc[ åðôõŸCY)$ø‰ˆnU”012-§¿aˆocRhÒ € °Á¯/F§£ŽB&Tî ¨«!¸É—%u ûoàA‡L8ìà//þðt|p]„{? 9ðÀ u?<ÞÝ«±‡zõ;®~ò¤ ¬û‘®úú=¨eõWØ„ŠªÖ¯ëc xÕŒï|ˆŸøW•¾ÔðI}lòÇê¤Pýë÷O¨íŸ<0×ÜO‘ÄŠ;!ôØÙ²ŽrЬ£œ.­£œ!kœ  ë¨¨Øä>¦u”“¥uT–؇X¬£z4N‰ÖQ³3×QÎ?(WÖ^?nWa/²v¨XóªÂwãƒ-M— #ÃtG†éT!2Lø©í$2À6 ÷1F†éD!2LoûèhdD4N‘GFæãÄÈ0»NdTGP mÓd 4/ª ¿œaë+”úR+©;ÞD¦ósù\ÐDR ’²DR“<hEÀ6 ÷1‘ìJA$<ñ4ˆz4ÎÑìãÌ ’ö2AÄY»wÃ*NÈWºŠ[™ªO9g¼â§>)~ Áº²È®¿TønmåŸ?MÊaö+K¡sAkè뎄¾¥Ð§Ù3“²gyèFÀ6 ÷1…¾ò¥ÐW$ Ø hè÷:Ã8'ø:Î }m®ú‚úÕ—¾¦±–ùs%Xëæë³ñÂq6Žëké•;ËñSÿÕëÙÃø¡í„¹ ?Àü0] ?Œ$±“k8þ£`û˜ð\ ?À`øÑë¤;„³3ñÃÀuð£þÄÖ“9ªšö«ã#ý²úœYcÌ3-·Áç‚Ö˜±ŽÄŒõ¥˜¡™“2-ù3uÛ€ÜÇ3Ö–bÆ’ŒQ/ 1Óë¤qZ3³3cÆéëÄ 0fQ™úS^OÖüío³¬¬ú†œöù³ñ“’Û‹{^%ز'°ìö:á¦ýzå!´B›·Ú¼+@›íHªÌ&¤Ê iÐlr´yS‚6OS~ÐÖë¤qm³¡Ívê:ÐöÃ…ÃŒ±„¾z=»&v~çY€ø¶]|Ûé9_€n…Án…-8MãÙ”ÆË<ê¶¹1À­€B€[¡©M<ê¤qBà™3\ÊëøÇ x}_‹¦ý8ÑËÉk®d/ë Îwê/[UNÂ×¼Ùaå´®"og´"˜"œD«JœDK³‘V-8‰ƒ`û˜L•8‰V)êcÁIŒ:iœˆ“˜ù8Áô1œD‚Õý\ÁêÄ”տàWí–3±zfvHе IÔ”¢–æmÊæQS˜Î6 ÷1E-¨RÔ‚¤>ä"ja ÓɾŽs£Öt—‰Ú:FíúfЫ7#ã/~hŸj9ï8„œùšCåc¼­¼ ÕùÃ¥ ý*EëŽëÁ¿FZÙ5¥™¨º?š­@i UÐÚUÐÒįµ ªà Øä>& ´%ª µ‚úXP£N'¢ f>ÎJû¨‚áÓ>Œhªoo®ð{9ðΉô ב„‹ÛFp´ž­/-ÍvZ¿ 8:€m@îcŠg_"8ZO³¶~ApŒ:iœˆà˜ù83žý…ŽõxfPŸÏÕíª•¨ådTë±ùmo?[?1.”ö¹àB,Ùc¸Îß üóß^><=B¥Ô}„:qö$'B÷¥ú«*¡™µQjúÎP7Ï fFâSbdL;æé¦Ü¿þíŸÏ‰¼¡;— Æ }ÿÐè¡Ðxá‡@øþoM~Úß_ 3ô·~ j¥;jÕuت;C-gU¥½³’0ûn"o¨õ¼ 44ª²3 ª\p$ *o´Y9’n@ϵ]Þé;ï¢N²¯ƒÙ×ѹƒÙwÐlr㻨Ó%²¯Ó$Ñß È»hÔIGdßÌljCö­Ã/«‚èSí]t%f8Ì {Öü=®ÔÕºjdAd”=­žÔ(Ešêì¸WZ¿ô 4!bå7®ïËÖk,ž›„iM 8˜¨Y:òÒ'Áip„ lù40JÒë?¾†Öß0R_¼%÷f¦”%Š´—ŠúXP¤£N'¢Hg>Î IuŠôJH2ê»ê38‹sÃi˲ ï1ˆH‹e‡’ÍY ¬øÙ¶f÷j¦WK“ õwµ¦£ñÙ6ÓRu»vÔÂ'~;ا_@ÀkçUi“¤þÓ—’WÕ¬üj]uºù©öÉŠŸÕ+­o€¹Y®‹åc -Z爺&{…C‚G›ýz?M-éoShöë½Ã½x{iöu2¡r©Ù¯÷ºÐìׇ·*â@Ñf¿QÇ!;8¯Ù¯ ?õÝi ÎŸß—¤RÏ ïS·0RÏyWÍËÖ\jß°5ÜÝ™téd.xðù7@Í®Ãß…f×AŠ›]G~þ…L¨ÜÁðü‡¿ Í®ƒTR´Ùõ ã ‡œùüËûË ÖóÏ`¬lsR|Œ½ž• gh_îÂãTê!&ç&•‘B3 ÚÞjL§peD*#‚çÙ£¿Õ$À6 ÷‘Þj‚ P¤‚ú •ƒNg^‘û8ï­&ŒÂ?9÷´XtŸú» §Xz× ZV!‡)ÊyK«÷Õ¯C=d\é¾uüœSV¶­ëwôðÖ¢¦›;ƒª~ït´â-H‚·P¨\ R X´r%é¶¹ o¡P¹¤õA+W4Nð.P¹F1V®\ow­OáP08§9œO¢YYXÕ¿SýM—»Wœý&ÎʱúÖŽ9 a6Qu¿Ó3 ZQÏ ‚z¶ÐK=H5A$K{©'À6 ÷1¡ž-ôR7ñ㡽Ô4Ρž½@/õ0бäá|Ôã0!åOµWÕ= [Y«¼cÛ׎mÛžÈÓ›4pvä'ú³ÔõcÍ7—¥ùdîõ ¢Ë­ó‰ïÈ|â úƒT¬÷´AÒlrÓ|â úƒÔŽ6èt†q:æýaSÅÇùó ƒgø>Ÿ¬¾cìrà'•³aÖØcKä´?ûž¸’8çwqlFæ¹U±˜‘ ‘Yt¸ÊQ¨† R\ ™À6 ÷1"³è ÕPAj‰ŽVC :iày5TîãDdb,!¸23°ç‚‡?+%|™…pk苹‰±ê¹c³ 5ô¥#¡/ e!FÐm¡hYHÒlrSèËBYH’íª^@C_š1Ö¥E¡//Pn¾Nès£Nmî¼ÎÙu1±r¥Œz½}Ïa»{ÂÒ¥Ž³ØPt÷•¥ÔŸœÎhžaæ&ÓÚ›\p`-fp„ÐôjÔ†K|Y¿¿€,^ç½™T[2“jWšIéžZ,–tÛ€ÜÇ4“êB±X’È^@gR ãÔ© šIõŠÅÂ-‹Å.0“îz`È7„hõiNéHÝOu¥SOL©5?õÙ—ƒÃœ5þk }…½Îk >ÑGc‹ªYð(1U̧ڥ¿m˜*ŒÇ¼Q··4ê(dBå1U(S…ÑÔ¦ÄԨ㠇œHLv,ÀÛ‚ßwW¯ôˆLâ¶ó§}õ^¿ívï^wÇÎ<‹d— pJeCœG´>êz‚¼þ¦²‰-æïºC‚Ö%·²äv…êÎ %»}ÂÑêΤØä>¦%·+Tw©¢>hu砓ƩђÛ] ºÓL!ξÕ+ykU{,Y§HÕ?yVÒ»^9X‡€ªÖê,ñ+·¡ª÷_Û£븴]O9Ú÷4Ý•ÎÂÆl[ÑÏýýuÏÅ›p.;|2RNF2’nÊŽžŒ”tÛ€ÜÇç²+œŒ¤’ú '# :iœùÉH¹á\Šûü48gЬ¯¸ Yÿξ”¸¸`æüð#ÂC>q”¨\ðhAΧ3¦¿u!‹ ¥Á/ù2îY¢D@ÔQȄʤ,‚”²ERP‚f¢ŽC&vpbAÊcªëžÖÛŽC#`,+ê/UõT%k;p—ÕÑ®XïÛJzå0Ù íw[iñEVª‰Ù*ûJ‡YкòѤÀLêR™¤û:R/ ÌÀ6 ÷1­|t©ÀLêŽúX˜E4NT`–ù8så£)0«Cξ/²ºÞìë=9üj QÆ×‡IÐD†Ô+ISªW’†Ô+I³¨WtÛ€ÜÇD¦T¯$Ô+õD0Ö+Í6ðuœDæ˜z%Vízgv^¡äì:}.fç};XÔ­íË9Úúsoj%t.h }GJKÂ-)…>MÒJ·(-tÛ€ÜÇú¶TZ"-I6÷úv,-™màë87ôÝ1¥%œÐgÚÀà^lÙ6â”bp¿ƒhnV--´‘'Uª+U(šSÝ¢ `ÐlrSùR€ô4ÅçUQ' Ud>N "ÕSÀ "N}Ö×}ŽÐ3jîØ—c³ 1f” ôy%Jôy% }^É}~ÐlrcÌ(Q¢Ï+Aèó½€ÄLÔIãDôùÌÇ™1#¡Ï³b†SµÇزYánÔ§¾ ÕÔpŽ)Ú^s÷eiU.h /E8µ*=Í$¼hÎBé§vÐlrSx©§V)’{é4¼ÔÈ©màë87¼ô1œZVxíZ²óÁЋƒ®8„ÌŲq!Ø-Ìô´oÖ|¹ 5ÌÀ0ƒÂÁAJ² èÁI° È}La…ƒ ‚TSôà‚A'P˜Á.0ÊÄ›ä„Ù®Ôõ¯3Ì.Uÿtlk÷úVÒâÇ`íˆ-Œ,º‘ðwê›ÑÐ̬B)rA+ZÂ*T¶Ä*T4Ñ£ì‚U8è¶¹ m‰U¨¬¢>¬Â¨“ƉX…™3ÑÐÄ*ä áÇ £a®±KëqÓm׆¢8\ÙËýŠw”›ÏÀˆ$IЊ`žé”/éͲ)¿ Ò :€m@îcB0_"Ò)O³…~A¤S3dyD¤Ë|œˆ`=7ý*V?]‡u¨Á®TVV>ÿ0ãÖhÒÝÜm½?¸t4F“ž¡¥nëšæß´Xt[tÛ€ÜÇMZ”º­k!¨E·õ¨“Ɖº­g>ÎŒ&ñl>‡œQëÈó»(^ïUg¥þõŒ}죆 5rn4n‘àQ6ªžÅJ«Uè@dQs”ˆPu2¡r‰ª•(°Qµê¨ƒŽ²Q£ŽC&vp"U«ƒ¨aœÝ‚z­N=ÐêAS_sŠÓŸ•ï¨##ãzžvw8ÐÅX7±ŽÃ=g?Õ h01”€\ð0þÀø²„@JîuLcëu2¡r#þAWÂ?MšôнŽC&vp&þÁA¬>ÆvΖ:ó ?{Bžß&¬žSÝoiýÒŠ01"¤ö¹àa °Æ+J` ј2ÅaÜë(dBåF 0¾„ÆÆ-0 ×qÈ„ÃÎÄ{½±×T¯Ù~Öù´œ’·ûC×ï5c–ç|g—½¥ ¯˜çwîÿ:PØÚù%rAk¾Ë¨ö%¨¦™]í<ÐA° È}Lù.WâjG2Ô½€æ»ÜÈmàë87ßåâVÑvç®ÕUÚ–îõŒó>9ýÑXǾ)(¨_FÝ]Ms^8ø5š³g~îeí»\Ð\Ð2.t%2.Ð$:ˆwÐlr#pAW"ãBG6z®¨“Ɖȸ™ ÄAd\pí{–ñ®ûç¬ÔߛœmIp0'º\ÐÆ’~AºR+Búµ ý:€m@îc cY"ý‚$¤ß^@ÃXޤßÙ¾ŽsÃXDúe„1§˜«Þ³áŠ¡ò^؉±@MD5„™ÚÆLC#X KÌdЄ™ zÁLtÛ€ÜÇ„ºÄL­©39ê¤q"fræãL,€ƒ˜É,àôoÙЪ~BƒSÆ)åþ6¹kjžýU.x4ý fZW¤¿M!ý 4; Cv6ÏàF…L¨ÜAJÿBúÒ|YQЦ£ŽC&vpbúìA„\¹ök™ÜÛw²žüîýp6ìD<‘`rAë î\‰‹ 4ÓnÁEtÛ€ÜÇ4ƒ»œ¤>\Ô¨“Ɖ¸¨™3gp-½oðî›MÜ·5Ã>'Pr&ÒÓ½rvƒõjàÇ,Öf$\Vž»}Otm/°bÝ¿z7±á.™WŸ“å'ÍK;?qp44N¦#DjÓ•ˆÔ†æNM· R:€m@îcœ LW"R›NP "uÔIãDDêÌljSé"Rs¦N_ÆÖÿÎ}8'ýµçqVÊYëƒÝ+óbÄÜ’Ò»\Ь’´¤4²Ô’ÒÐ ©‘‹–”ƒ`û˜‚U–ZRÙQ‹–”Q'µ¤Ì|œ¬ò Þ1#XYYØ+ë³–i'‡~³æôX h œÅ>¾ ›‘yF'HÛÖÅÔhÒÅÔèRSC³ÑF/º˜:€m@îcÂ]]êbjɪ÷Š»jìb:ÛÀ×q.îêƒøÎÜåd¼ëì›EB¸#ÝÐ4ãüWßÓ^Ûû=¾­Þ]œSïÙÊ•ó3oèg´›ßQ»\Ð ¿†t’ çüҘØE'ÙA° È}Lð ¥N²Hƒ‘^@áÆN²³ |ç¯9ˆjÎ_FdÔ÷'ÞæöüÃ%9ȵ²¨å gyøÈÜú¬³28ÕÓñŒâǯ¨1¬1MÇΕ“ u±„Do\‰Doè–”q ý Øä>¦yÄ–HôÆ’­µ^@ç;’ègø:ÎGÜA$zÎ<Â(u|£Í”¿ÕBÆ„næ£ ÈRYŒŸV©éo_ ²ØŽýeãb£D…L¨ÜA¢²o TãÉáe½€PY¢ŽC&vp"•ÅvÇPÔY]–ê!ÎɼQÞÈ–Ø‹ôÕld˜Ønnc“ qªµ‚ðÅÃý/Lµ–î"X¹à‹:€m@îcœj­(ñÅ­ »!½€LµQ'ñÅ3'NµVïÇÔ¾ VrÎða”´±&­]yâ»í/Z9÷œöHеŠ0»­*1»-ÍA[µ`v:€m@îcŠZUbv[¥©³;ê¤q"fwæą̃ÕÇ0»YQË9­ë«?9áüVKOZpªþ9½‘8ŽOX=wŸî9J³ tŸ¶Pê>mirØÂ¢ûô Øä>&\„R÷i ŠúXtŸŽ:iœ¨ûtæãL\4ÇÝ9¸Èá]Ô{·Ö·Y´dÌþÊKƒ] ýz.ƒ¬M]ìëë7µ-âÍÜ­Yš\Ðñ–0ä­-1ä-MãY»`È:€m@îcŠx[bÈ[+©C>ê¤q"†|æã̈w÷ãíiÏÙñ¯‡Ê†Y™‘dõg¿ N g'Ž¡=³Â™sâ£E3ëà$N*oßcˆ+ ‡æÀÓ~·´>´ž"¼W§J¼WGsuN-x¯ƒ`û˜O•x¯N’œc/ 'GÞël_ǹ§Žá½²Ñtß³êAT§-§Ú'q´X.9yÇzšìÉK•}Ûœ¯Ü%Σ³qý¡fþi‡ràîÇJÝîÝ£ŽB&Tî qœ.u?všô×è„3u2á°ƒ9Ž¡¤î{–L÷¿B–aàß³Øü;úI/œ¯K“o‹<"¶. Ý€?s7basÁÀh<DÛ•ÑJ‚W1£‰1­×QȄʌ€h\ %Œ]b¯ã ‡œ ˆönewnÂX­<²ÉÚ6eÀìJéã¾g\íÊô®ßeG§ú²q*`}°œ= Åó Z{e ¨ggê¨F‚Ö·aGZ;WjeìhÆ×ùE+ãA° È}LoîÔÊØ9’¹îômØ­Œgø:Î}öÇðD9·/Û­ÞyŒ³ªaõ =ý”Œ•pˆ:2ÝÇ^êüÜLY™\Ð$¾#äXß¹xšköbAŽtÛ€ÜÇ$áv€Äw$gÞ D4NDŽÍ|œ$^CŽÝH8¼OÕõÕ› ¯Óéo{l½˜['K$h|I¶^–¶ž&»½\lÀ6 ÷1E¾,l½ÔÔÇ‚`uÒ8Á6óqfä«c¶ûFþ¾³·ÈÚÚ)_õ¬SN/Èâ»›ùy€t,kû`32«™â«!´"³&_¯K_¯ Å×ëÅwÐlr2ëÅ×kE},(¾Q'Q|3g"3CñÝ™TÀoï€T5‰³[Y_ûYqìa¦÷A7 Z‘Å*±7%*±7„JìÍ‚J<è¶¹ YL‰Jì¤>T⨓Ɖ¨Ä™3‘ÅÞ_W]Y84Åêšo—–Ú¢gïð+»wÔ¶msRuõ±ÝãY4#˜éÔ ØmtjïÚ»ÚÓ¤´w :õ Øä>&s%:µw‚úXЩ£N'¢Sg>ÎD0w zgc03ßÖÉ!S?~îÝìt.ƒˆÿÀ¸Ú^pøoÛÉqŸD|ª^eÍç«(Y¯î×Î+ VªjM×&¯úV~µ®ö ¥4já“?jW*«Øé; [‹·þ'ÊÞe.xOa»ùä¦ô·^ò)‚÷Œ‰̧t2¡rŸ"ü-—|Š Ô |ŠAÇ!;8OFqsŸµ=Ø}¨† ‡#Ρ)1œçwC”jÁºBâÚå=žÓÀë^ñL‡ùÈÚãØd¥9*´- mgqiNJs‚o3F^&À6 ÷‘–†AP(Í ÒŽú ¥9ƒNg^š“û8oiFq¿4g_˜Ú¹ÏÏOÕ ª'‘ê»õ„Ð…Yµ’ç%p…½û¬sg÷8÷þºàÚøf‚v>] ï.2 Z1Ô ‚¡¾Pe¤šà›§UVI° È}Lê UV¶sžøp´ÊjÐIãì†ú TY…Qܯ²z†rŽ`Úpžîûšìz°ñpª!<ÁÏT™.<ú:)ªW ê•Âÿâz¥( ¯“QG!*w^'EW¨W RGt´^iÐqÈ„ÃN|â~½Ò³ðbe͵PÞÉôÓaâü&Ì+Ljoàl©Ù ÜÄgþ΂ÆU†¸ù¹ªÐüÆU†…æçAj‰I›Ÿ:iàyóóÜlj«Œþòž‹W>ówÕˆÕa§ÆBVÌýM¥E‚Ö ÒŽ‘.”€X‚<à@K@’`û˜‚HJ@‚Ôš–€ :iœ‘¾@ H¸÷K@žD~v5“ËyÕ_y9ßµä5m#m[00z¡<- ±æ^ž±øu´b€±Œ+aMG K«7’`û˜0Àª7‚”¤U{ÅcЃ0À\ z#Ü‚ûÕÏÂSû›lé~µ¹Ó¸ñ¹ 5ˆœ!Aä …AJòQÂÑBˆ¤Øä>¦ r…Bˆ ÕÔ-„tÒ8‘»@!„íÇs™ bj¦¾=+ñ~<5üÒ!@:“ Ov˜çž{bž{ÀtÛ€ÜÇx²+ð܃TQ”ç>è¤qæ<÷Ülj'Å}žûÓoßÖ˜W>kCcˆ'qN9g±¿Å#[qJÎ-;•5¹ §¤&8% ¬ù %©$))k>é¶¹ §d5¤’ú ¬ùA'S!œ’`Í[©î¯qŸ†SœžŸ_ýQ$׃´zŠP}Hï<Š.×êŸ|5Eà!–f:½‡\ðÀöœìAÉJ-nþùÇo/ž©"T胨’»BžÙð U©Oçõ·™§ô½Aý3±¹m¦ò*<A¦;?‚ÌA,¾gE'~Ö~ÒÑ¥ëüvB—šËëdÞBÿ€#{:%HšWjC’õçC’;ˆ÷$Hâdæ9ï ;WF´sgVz«3êáêlû9þÍn%&ИBêHÔ›ƒ†w§ƒ†êžÍrÛ4;ï q8h|k;¦V¨¹ç£î;lÌ‚‡±¢§1œŽò:|8Vpª\ªXÁ:ívñ ¿©Rª‡2­Tí×O fÌݬKvݰb½˜1³º.—y˜œd‚êrA㾑R„¡©T‰¡©4ahö²o4è¶¹qßH©C36F>Ô‚¡uÒ8C3óq⾑Ò×ahrެzVIçˆIΉœ(‹<Ž®wñxÖº¸¾ldì·]ºËhõ¾Õûq­,ƒëw§>¶êÃÄj%{‘sl†­857í„Xz; ­”Só9éoW¨”ëËóP![/ •rQG!*w*å˜B¥œ h¥\ÔqÈ„ÃN¬”Sæz/+!ø~\ÍC“Ïûq5%kW"gî5¯D.h] [B±V¶D±V–P¬{] Û‘bÙ€ÜÇ´¶%е²šúXP¬£N'¢Xg>Î\ »c(Ö+ÖÞ¥y?”¦})4÷èTÒæ‚V¸ð„®|‰®N„ ÝC gÁÅûÑ3oŸu¨»™P;µM‚ÆøÖ‚ªµ(ªµ „ê^@â{Ðlrc|kQ"Tk!©¡:ê¤q"BuæãÌø– ù¤ø~?`æš©Ÿ÷fZÞ¹ÞÆ3!à'Ö·îsö³ çjFA¡‰ºÕtÓ@+ÚD=é¶¹ U¡‰z êƒ6QtÒ8%ÂßÙÇ™ø«Ža©³ð÷ý™–+þ¦‘±ZÏœw¥sA+~é´«¡ÔiWi ¡aÑiwÐlr~@©Ó®†ŽúXtÚ:iœ¨ÓnæãLü€c8ú,üx?,æÄUÚûa1§`"ÂǬï,èqêóËçÛ—|3^bóó=…/+[s)x])vËïk'zÒàm:#m°–¦ˆá¶…Û8L±òUÆ©7ÿd³ü$ÕcÉ×DZ\Lÿ¥gøcͺ·D/íSºÒåÑæÎÓ­é,\çi™å¦§»ÎQ*}¢k—!êÖªßIó³ØtéÙúžûÀÙ¾h}pøè¦”žÊv©ï>ìŸoŸ_þÿäH/ endstream endobj 915 0 obj 9200 endobj 919 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 131.250000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_6 >> endobj 920 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 141 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_7 >> endobj 921 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 758 89.2500000 764.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python >> endobj 922 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 745.250000 96.7500000 752 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn2 >> endobj 923 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 737.750000 105.750000 744.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn3 >> endobj 924 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 731 143.250000 737.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn4 >> endobj 925 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 723.500000 140.250000 730.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn6 >> endobj 926 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 716.750000 194.250000 723.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn7 >> endobj 927 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 709.250000 136.500000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn8 >> endobj 928 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 702.500000 153 709.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn9 >> endobj 929 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 695 183.750000 701.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn10 >> endobj 930 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 688.250000 181.500000 695 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn11 >> endobj 931 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 680.750000 219 687.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn12 >> endobj 932 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 674 208.500000 680.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_commandline >> endobj 933 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 666.500000 153.750000 673.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn13 >> endobj 934 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 659.750000 126 666.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn14 >> endobj 935 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 652.250000 129 659 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn15 >> endobj 936 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 645.500000 146.250000 652.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn16 >> endobj 937 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 638 161.250000 644.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn17 >> endobj 938 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 631.250000 125.250000 638 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn18 >> endobj 939 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 623.750000 130.500000 630.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn19 >> endobj 940 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 617 135.750000 623.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn20 >> endobj 941 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 609.500000 145.500000 616.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn21 >> endobj 942 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 602.750000 209.250000 609.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn22 >> endobj 943 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 595.250000 174.750000 602 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn23 >> endobj 944 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 588.500000 144.750000 595.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn24 >> endobj 945 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 581 153.750000 587.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn25 >> endobj 946 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 574.250000 145.500000 581 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn26 >> endobj 947 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 566.750000 159 573.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27 >> endobj 948 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 560 218.250000 566.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_shared_ptr >> endobj 949 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 552.500000 201.750000 559.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_generic >> endobj 950 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 545.750000 188.250000 552.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27a >> endobj 951 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 538.250000 188.250000 545 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn28 >> endobj 952 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 531.500000 140.250000 538.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn29 >> endobj 953 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 524 139.500000 530.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_types >> endobj 954 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 517.250000 164.250000 524 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_limitations >> endobj 955 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 509.750000 246.750000 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_overloads >> endobj 956 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 503 161.250000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn30 >> endobj 957 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 495.500000 152.250000 502.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_directors >> endobj 958 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 488.750000 150.750000 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn33 >> endobj 959 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 481.250000 145.500000 488 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn34 >> endobj 960 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 474.500000 192 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn35 >> endobj 961 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 467 153.750000 473.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn36 >> endobj 962 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 460.250000 170.250000 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn37 >> endobj 963 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 452.750000 131.250000 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn38 >> endobj 964 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 446 141 452.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn39 >> endobj 965 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 438.500000 157.500000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn40 >> endobj 966 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 431.750000 164.250000 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn41 >> endobj 967 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 424.250000 183.750000 431 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn42 >> endobj 968 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 417.500000 182.250000 424.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn43 >> endobj 969 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 410 198 416.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn44 >> endobj 970 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 403.250000 157.500000 410 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_optimization >> endobj 971 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 395.750000 162 402.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_fastproxy >> endobj 972 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 389 124.500000 395.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn45 >> endobj 973 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 381.500000 178.500000 388.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn46 >> endobj 974 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 374.750000 144.750000 381.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn47 >> endobj 975 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 367.250000 159 374 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn48 >> endobj 976 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 360.500000 143.250000 367.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn49 >> endobj 977 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 353 152.250000 359.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_default_args >> endobj 978 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 346.250000 99.7500000 353 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn53 >> endobj 979 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 338.750000 156 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn54 >> endobj 980 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 332 149.250000 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn55 >> endobj 981 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 324.500000 153.750000 331.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn56 >> endobj 982 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 317.750000 168 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn57 >> endobj 983 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 310.250000 124.500000 317 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn58 >> endobj 984 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 303.500000 192 310.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn59 >> endobj 985 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 296 238.500000 302.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn60 >> endobj 986 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 289.250000 199.500000 296 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn61 >> endobj 987 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 281.750000 210 288.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn62 >> endobj 988 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 275 186.750000 281.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn63 >> endobj 989 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 267.500000 146.250000 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn64 >> endobj 990 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 260.750000 289.500000 267.500000 ] /Border [0 0 0] /Dest /#d5#84#14#19#bd#d8#0d#f7#04OZvU#85c#bc#d2#a2m#2a >> endobj 991 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 253.250000 125.250000 260 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn65 >> endobj 992 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 246.500000 152.250000 253.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn66 >> endobj 993 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 239 160.500000 245.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn67 >> endobj 994 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 232.250000 203.250000 239 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn68 >> endobj 995 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 224.750000 203.250000 231.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn69 >> endobj 996 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 218 203.250000 224.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc2 >> endobj 997 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 210.500000 203.250000 217.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc3 >> endobj 998 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 203.750000 224.250000 210.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn70 >> endobj 999 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 196.250000 163.500000 203 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn71 >> endobj 1000 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 189.500000 121.500000 196.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn72 >> endobj 1001 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 182 179.250000 188.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_modulepackage >> endobj 1002 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 175.250000 184.500000 182 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absrelimports >> endobj 1003 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 167.750000 203.250000 174.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absimport >> endobj 1004 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 161 175.500000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_importfrominit >> endobj 1005 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 153.500000 186 160.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_implicit_namespace_packages >> endobj 1006 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 146.750000 159.750000 153.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search >> endobj 1007 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 139.250000 232.500000 146 ] /Border [0 0 0] /Dest /#9a#aa#130#40z#fd#18#b13#98#e8#5e#ef#01#d61#21#85#e5 >> endobj 1008 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 132.500000 203.250000 139.250000 ] /Border [0 0 0] /Dest /#d6#f5m#ad6#a4#20#2104#13#bb#94#dc#e1#7d#e8#a7#83#7f >> endobj 1009 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 125 231.750000 131.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_wrapper_split >> endobj 1010 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 118.250000 258.750000 125 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_custom_module_import >> endobj 1011 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 110.750000 210.750000 117.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_static >> endobj 1012 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 104 120.750000 110.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_python3support >> endobj 1013 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 96.5000000 159 103.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn74 >> endobj 1014 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 89.7500000 147 96.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn75 >> endobj 1015 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 82.2500000 165 89 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn76 >> endobj 1016 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 75.5000000 183 82.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn77 >> endobj 1017 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 68 153.750000 74.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_2_unicode >> endobj 1018 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 61.2500000 176.250000 68 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_multithreaded >> endobj 918 0 obj << /Type /Page /Parent 2 0 R /Contents 1019 0 R /Resources 1021 0 R /Annots 1022 0 R /MediaBox [0 0 595 842] >> endobj 1021 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1022 0 obj [ 919 0 R 920 0 R 921 0 R 922 0 R 923 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 933 0 R 934 0 R 935 0 R 936 0 R 937 0 R 938 0 R 939 0 R 940 0 R 941 0 R 942 0 R 943 0 R 944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R 950 0 R 951 0 R 952 0 R 953 0 R 954 0 R 955 0 R 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R 961 0 R 962 0 R 963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R 979 0 R 980 0 R 981 0 R 982 0 R 983 0 R 984 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R 993 0 R 994 0 R 995 0 R 996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R 1004 0 R 1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R 1014 0 R 1015 0 R 1016 0 R 1017 0 R 1018 0 R ] endobj 1019 0 obj << /Length 1020 0 R /Filter /FlateDecode >> stream xœí]K$·‘¾÷¯è³ø >€Åš‘f=,0€={XÈö†ÆØ±û÷7,&#’ÌfF13«[mÖ:*ŠÁÌb|$ƒ_¿ÿ·Ÿÿûùþùüý§Ÿÿ÷ù×øÏO??‰ÄüŸçñ¿ßåå?ÄvžýúôíùÛÓ—§/Ãÿ{š¿ðó§ÿþíÿžÕó¿ÿûÛóÿkþ)* _ŸœtÃ?›þœþM¤Žò¿>ýçžÿ>¶x3;ƒÿþÎ;ÆN¼`øÛÓí!åôßþú÷§ïçÇßcC:ãü³4Ú<Ë`Ôó?þüô—ñ±8ý”ë~J3™ðnúîð–nÿÁ{ឥžÿEÊQ†Ï´‹f¢à×'©í)ƒò>énrãfÁüµgüýáÆ6ÆŸü ÷cÔ‰ý¼µŸã×á×ü9ýãóã`–T~»o_üøËÓ÷ŸÃ³´Ï¿üeøhzÑó?~Þ¨á¯áèç_þôü/B(ñ¯Ï¿üíièzVÁô»ÌŸÈOÕO~œ>1Œž] }²ÑZý;PûŽøTûŽvÓ'ჳ€¿£åÜÚbXW›WÕÎÎHýA+/‡–Oêß©ÛñÓ'?ý2¸Äò«–Fúð㌿¹tå ü6 ˜Wa±«€pWð0ÄUfÀm@nãæ*  à* µa¨«L:±Ÿ»JfãBW©ÇU~Øï*ÒÕÆ²˜Oc½+ŒØÅ‰„¦‚ºøZ«ŸT[n¿÷ [í[õïôQ^gt1-d.¸ù(<úÊxôÓh4îö,Ÿ_?¥§ µQ""â‰ÖÉñÇ¡ïYÂ4%ºÚš™¿£n5ô`YE ìåOµO6ì|¬=©úøÂ|7ZM7¥|¬öZ4޵ AO`nu.ø`¢Xabuž°SË.MñïˆðÖFpž¥áÙBZÝ΂_Ÿ¬‰ /o:5¡sƒúüw„wòeC ŒSéÄ ãQøëÓÇ?œ>Cx1¹¤o˜ ~ÚöõI¥öÊÖ/û?ÕFûº‘úRm^}jþÓhð i¥W¹àîñÿ`Kã?x2<ÿ£ŽFMèÜÀmüSÿÃRœЫñ?êxÔ„Ç.ÿv˜ÿÕïlŒ]ƪƒš³”©ûúÖaÃWª‹œ…Qýy>Ù¼ü™|Ò •v(ãŽ`4îP¬4x‡b‡åÅz‡b¥Ã»‡Q@v(³à6 ·qÛ¡Øá7YïP¬TÔ†¢;”I'öSç;”ÌÆ…;«ö]°ï¤¥£ÓÊÛˆmY¯×÷õO8XÝKÔŸgc-ªk骭}ܵ3±J.;— Z}Skâ›Ú”|S[â7ƒ€ú椸 Èm$ßÔªä›ZRr団Nì§B¾¹Ø¸Ò7uxßdL¨j¾¹Žœä^Ò0|ÕYSm¾Ž9Õïl,êKˆ}kDšsƒÏ­~ Šø5è’_ nêדà6 ·‘üdɯAPbå×£Nì§D~½Ø¸Ò¯Á?Œ_×{°±PþXs±¸ —¬Ï’«b=lWÇ׃î—< Áꯘz«Îv‚µmYý‚õÞ×›¯ÿêÕ'®CôÆo«öÁ-„Z£sA+Ü:IàÖ©Ü:r@bYÁí¤¸ Èm$¸u¢·–ôŒ ·£Nì§@p»Ø¸nÝ-ìýp+»n ê ‘:J0"{œµ+@ªÏýÖ‰ÍÞëRÐ\ù Z½7â½A–¼7hâYSì{ߤ¸ Èm$ïõ¡ä½ãÿ#Þ¯¼wÔ™û™ÚÀÏq­÷û8Þ˘{p´žô9‡žõâšÉC"iXàDÀXà_c£D‰™/Ï:€Û€ÜÆ œð,p‚DGÁ‚I'vÜçXÙ¸ œ„ÇÁóHüXÅ‚Ë÷/W uXª‡Xëï­ÚšòÕï0~};v×ô´þɆú†é‡æˆÒƱKýEî˜X8¿Ó¾à““‰*`$ä‚V Už`¨ % ¥_¾9N:€Û€ÜFÂPåJªHàzP ub?ÂÐÅÆ•ªÍã`(ƒ’öÈzÖnõê­1Ökõ9®¾Õ?ÖìèúZ²þÞêÀX_eVÓ¾³_ß_acm¼ou¢¦ásA+Þ–wÆ—ð–â¬Øò³à6 ·‘ðÖ”ØòÎ…Q@ñÖÜØòKø9®Å[h`ËŸ…·urg~ªEŸ6ö†œõ'çd®/ªVù?ë sBÕpß%ñÛ^\6…QÆaKµ²#2Cb.ÍçIp?ñ»†B£!„B4ŽŸÕßg}Ïö©º‚kéÈëûúóLGßçK3%É.Ζ’]=qv•ì2ënri¦³¥dg µ±Jv™tb?Q²KfãÊ™ÎÄef|Gs"µ¡:ÓÕcœYë¤xÊÆm}óFfÇ.üF")ûî'7æ±³•K\>£B.8p¶ !$ÙøÝê;÷³â•ͳ~}ÃcNä}ô>ïIFp'#8_JFpž$#8¿JF˜t4jBçb2‚ó¥dç55°JF˜tðO:à먯Œ6xÇö¤Õ°qdPç^Ÿt̰±œ®›™èœPiRÆ”4âBâŸêyö%xA’F¼(%xzFêÅ*idYÚgm@nã¶Ò÷¢”4â…¢6VI#“Nì'JÉl\¸Ò÷òehë ”}“F6ÒÚÏå!ܺæe¢ *+rA«g(’²áU)eÃÓ“/¯V)³à6 ·‘ëïô™¥§‚ Z}&V}%V} ‘– V¬úYpÛH>J¬zhÄ(¬Xõ“Nì8bÕg6.ô™ ŽaÕŸUÏ““·­/øÛw³¬¨z¯%mXJx*§sA£{I×A–׆k‚Z®gÀm@nãæ^A–×A’°Ó( î5éÄ~"ÂufãJ÷RǮϪzZºu/[wµp] º¹™J§®Ê»\ÐêfšðlCÕÄÍh@'˜ÏvÖÜä6’›éÏ6h˜ÔÍôg»´ŸãZ73ÇðlYnÆàÙžæfœ4ì:m§o¹¾ÛÛJÝáf7éÌPK$hup ôÂ%za a›+zᬸ Èm$‡½0€¡6VôÂI'öÑ 3W:¸=†^Èqp½ðUoí'2õÂÍuÌa,z7#œÇèˆ-ËÎ[Ú€ßXÕw÷þˆ8`3TÛ…[§C.8«¨†%Öy ƒ¢³æÛ6ñ»‰ˆºô²^š×yÍÙÒ¼FÉ!†óyiÒÜä6Ò¼æLi^sšÚЫymÔ‰ý4h^sðóš?›uÈ!ÓhNÈþ¬%m´Ó¥p9ãÐvºHœó’úüù–™Á/DÁ rA+¶B ¡D 4ìŠ(8ënr ÛB‰( _‡Q0,`Q0³q¶ù±m á`ãn*ÎrƒÃ*ïuT4  ¥"õ8àA›?{!1½qèƒÇ™'ö稸 ÈmDzã •Ô¥7Î:±Ÿ9½1·q¥?Ë¢7Öý™A|<ÍŸûÖWmßÓmûëìÞ7ûµJ¬=^ý¸ZýZ+â׺À¸¤@|NSÆeÔÜä6’_ëãr jƒ2.gØO‰üZ?ãrèÅã0.ë~Íâbžå׌¨§,QçnÝüYg4J$hõgÄŸ¡@£¤†øPeÔÜä6’?CFé… Ä†¡4ÊY'öS † Q½xå†?w%Xvöç*©„•^_3 \½ê“„fD…X9:Û"¸#]zºqÊ ëŸaøï?þüôñtUÊLꇨÈñÐη8UÓŽXGÏu¯¦«âzó,gfDðLý*VN…ƒûktŸ‰œ2U‘[ž¨]ã„ïá†!üÓŽu”,ý­ïƒZﮇÚð8üÖÎPË tT“ÓXgä}ù?;*2< 44jXÊ ŽTMàñAëž•#y±Ã °ªô¦_Ø‹Jùσ Àö’Æs¥¤ü稸 ÈmÜö¢RøÏƒ”Ä¥GÙ‹N:±Ÿ9ÿ9·qá^TÊÇá?oÀ/g5yÖ^ôÍÓ§ºrãks¢v&#»Û¨*îîØ¿”âÙº—r©*­\.¸³zÙ0ÒÒê3þí×Õ˼Ô›¸zÙ¬£Q:70W/þ¶ëêeã€'êe³ŽGMxlàºêeÃÓD€gDéXeDk°ÎÄtε±Œ¨ûÆ:”lÓ¢¹o‘;?Ë­ùÍ“7æMúê_ÚŒK6#¦D2HÉ¡•44‰$ênri3b I$ƒÔP4‰dÖ‰ý´1DâÇœ;Iö ”olàëÓZ}ÉL¯ Xêå@×ë„ZB"‚Mw /‚VG´@ÑXïƒÔ'±”õu·¹äˆ¶Àz¤šÚ ¬÷Y'öÓ G´Àz÷ÒÄz?)ŒzÖµ(õ°~Ñk¦eœÍ­Ð‚EIÝéÆN-nlsÁÝgÒ«ËÏ*dho]Ök~Ô†såüY·e™æ0&ȰТ§wÜíJÈ˽@‰ƒhÆgygB™GM©häë$ú¿ùt­‹käµb…’‰jmÆ*‹àÀƒGØ×ttƯԥ^áÆý”õç²;™“BlõILã"#èëxUR/쥔"ì}¥Jì}¥{_©{ÖÜä6n{)¥Jì}¥µ±bïO:±Ÿˆ½ŸÙ¸p/¥ÔAì}ÆtÉáèo”ãçäÄ0&«qηBÕ°þ}…^ ¾¶îÌ”ZRrÁ½'„ʤÕnü[N•1øOMÑItÈ7éhÔ„Î ÄBeDá„Pé@ è@O'šðØÀ…'„Ê”Е;Á d6˜”š·d\<»QŒ¸+p.ÆÞXWßÎ:úÓ’ëÝXúÔ÷ä«õ§l7?CÉ’Œ e.h]ðXA<¶Påy’À®²´ÊsÔÜä6Ò‚ Už) Pºà[á@@ ûUž‡^”_µ@ÙDiÒÓ¡o´Â… .|¡Àõ UÄ•=-pu·¹®Pàz:bÃÑ׳Nì¸Gpá Àõðà%pà‚CÙÿ\]+½*'z3gÉÊ'N†–:´úw sJ s-Ã|ÿžu·¹äß¡Ä0ŸNчÃ|Ò‰ýD óÌÆ…þ­ÅA s†sâõÐÿÆÝž}SrÚó"7ÎäêÛ‹ëoy@v_¶iûUAß}pÇÁh+þj±ÑµÍø«%.½>| ilX+Zz=ênr7üÕ²Pz}’÷( ø;éÄ~æ¥×sWâ¯:ˆyÎÁ_[½¾[äv$µ<Àõœc«zk‚a}wÄÖ´?Ô‡žªO%A+~hBÊÕºDÊÕšrµ^‘rgÀm@n#á‡.‘r§À6V¤ÜI'ö‘r3Wâ‡9ˆ”ËÁN‚BºÑƒÐÀ:êíš¾vÚ*mG¶gT'pBh 6ÉÎ#5mgY» Zq gYC‰³¬iHXʳ<ënr § ÄYÖ ©gyÒ‰ýDœåÌÆ•8eâ,spŠqQÚÁL^ÎÉø†}!m^°ƒ\Ðê*ÎWq…Âσ”„Cµ£…Ÿ£à6 ·‘\Å ?REmÐÂϳNì§F®â¡ð³ö/DNsÆ¥g””ö3Æ=›ÆB™u'Rý;œÄú>êÖ²¹à^†ˆi¢Œ›CD‹ z u"’Ǥ£Q:7":¨CDI HÊ™tÿqg÷ópW¶Nô#–jØcþì"h\¼Iø´F–ø´†Æ\ñigÀm@nã¶x1²Ä§5RP+>í¤û‰ø´™ /Fħ­¢`_zÉF]¢ßéZˈ̨/º¦Æ¼_¦ƒ×kF.Œ^‹­°¤IQo£KE½ a½*ê=ënr –t©¨·Q$; (,©[Qï¥ ü×Â’>ˆ¾Ë%E×YªÁ<¬/ƒIeõú$ à\*ùVkóÜ^nÆP˜>ÓÊj´b(æ°sØÐðªsxÖÜä6†šsØ&CÍ9¼´ŸãZ …ƒ˜Ã í{É¡u¦öí¾V‡æœ*N/-b²æÏÚ‰ÖÉX Tß½zY½ùÑ¥ù d+#éà_Cî;Ñ2°”•—"´Â¡%ÌhãJÌhCCèÆ­˜Ñ³à6 ·‘àЖ˜ÑÆ’£€Q@áÐÞ˜ÑKø9®…Cw3š‡ïÌâ\XÁ8¤¿>uä­ÀíÃŽ»fÌvK=õq¹Z1Û¶»ñ%¶» „ínŠí>ënr ³}‰ínˆ}Ì Õz¬´«‹+”í*hµ#§jc-_Ÿês~}TÐu:ø½%— —Ö`Áwx¼ÂÒhäÌŠà;ënr·¥5˜ÁŒ¦6VßI'ö|3.­"øV¡ óÁýx¿îÅõ«¦ëß“Ôxy¦'çyN{;u;]k|²*„]y 0@b6™U`¯,áuƒ-ñºsÁ®xݳà6 ·‘Ò–xÝ`µ±âuO:±Ÿˆ×Ù¸!]´ë’SJ£zm$'°áµõðéI…»®¿ne¯§»…> %A«§{M<Ý›’§Ó Ä`î©“à6 ·‘<Ý«’§{ImÈ•§:±Ÿ yº×àéþ *8ÃÓ9'åzÿ»JgÔÓû^;ÈI^d­…êzKkÃÓ+‘5?h'\„Œ3rA#\XA8ÓV”8ÓVÎô( p1ënr7¸°¢Ä™¶BP+Îô¤û‰8Ó™ ኃ8Ó¸`œ$o, …TN;#}ͧÁ­žnÅBCž®§O‚VOW„†lU‰†l¡![µ¢!Ï:€Û€ÜFòtU¢![IhÈ£€zº¼Ñ—6ðs\ëéê 2ÇÓ9•‡ëÕô·)olµ95úVêÓ2§JñÅÅKOºo`)Í›÷°X“VñoY8`±Fãó;…=Ñɤ£Q:7X¬…«=1 ==`™t0ã,:ÛžJ œÙ‘qHù€ ¡wN—v)]|™Ï:Bæ³®Dæ³4fýŠÌ7ënr %\‰Ìg‰äŠîFæ[ÚÀÏq-JøƒÈ|”àÜZ÷ªò¿^“_ï]û…A§t.hõë@J¢Úà ~íh¨Ê‰UIÔYpÛH~J%Qm !·°*‰:éÄ~¢’¨™ ýÚ‰ƒ ¿fEÏ_Õ:¹>ûÓú‹œÍòÆÉ`ß;9z•§w"+o ¹  œ$åM,•7u4˜å䪼鬸 ÈmܰÀÉRyS' µ±*o:éÄ~¢ò¦™+±@D0ä`#4¾q’Ö~ç‚Æ›OH7U”}ËeEœÊªš"Á½;§Ó"(þm ;Gjn¨åA·IG£&tn Fìœ6…ˆÓšÐ4b7éxÔ„Ç.ŒØ9s RsJ󾑕H{¦*‡½×™‰´+ðèÌRzuJqH‚Ö办ƒEÏÑ  ƒEoÖÜä6ÒrJ=ŠÚXQô&ØODÑËl\¹Ü°//üû:ïYÕËXånzT`gM¤}ú_Ó²†ÅØQ ““]ÒµòÓŽC¬`9£B™‡½¥ª¯>i^ÙD–˜ïÖI‚V4w„†é\‰†éhðÖ¹ sÖÜä6š» Ó9Im¬h˜“Nì'¢af6®Dsw “…æŒñžu'‚ñ¼¼rÜÁùWu©Zg>üKã¡n}"™esÁ nûCËhAËÆ¾¢/‰‰‘ÄÚ9“â÷J–"ƒëëXYm/Mî¦](‘¦=ÁqaEšžu·¹4¹‡iÚzV¤éI'ö‘¦3WNîáÒ4grïœc±£H_×I÷5žñ6•[캵a•´ï[:Ÿ³¯ü½‚w\*„ÄÏ3S±€$ho/ ~x¸x{zäæåŠ?ënr7ðö²Äƒ÷‚ŽÞ“Nì'âÁg6.o/áÁ³À›S;±zÅÊ6@î=D¶Î7`éˆÓÜsîÖ©Ž”ÙÜÍ™‡9—ÑîÛÍy¹TûŽPåßÍáˆX<5ƒ“¼›á¼)½¬—æ3MJ£{]*î5)Lãõª4ú¬¸ Èm¤ùL•J£{E ìŒ:Ÿ©[iô¥ ü×Îgú˜4 Ö|ÆÙÚ¿±ùl¹¦o « “.ÓKß©‚‘óþøˆ§½TOŸH¾IЊ˜†¤øx(¥øxz îa•â3ënr 1M)ÅÇrš? (bš[ŠÏÒ~ŽkŽIña!&ã†ÅúŠù¡ËÊü¾³á=, <rA+X’Àãm)ÇÓ³SïV <³à6 ·‘0À–x¼%gÀ£€b€½%ð,màç¸Ü1 <, è{Ñ1§ˆ\7ªþ¼žwî¹\"}ª‰”™Çí¹FCèÇçìGYwtÕ_pßš0g\åÀ¹’oyä€÷Y Æ;àܾËzׯzÏÁñ°úw6ªu].ýÞ’£ÈìðõÉK§‹{²†–PöÁðŸBöÁМà§ck”@0éhÔ„Î Äìƒa TÈ>„Ä€š}0éxÔ„Ç.Ì>ðá˜ÜÉ:YsjëÕËÕd…e;X¯—«g+½›Ø}H© B.hÜ] æñî*ˆRêd çŸA¬R'gÀm@nã¶» ¢”:„¡6V©““Nì'JÌl\¸» ò˜ÔIôÍrØØw1.¥eÑô81ö:P¾ÐkÝX¹ä)j‘ Z±@‘Ë‚*]ÎèÙQP«ËfÀm@n#a*]Δ¦6V—3L:±Ÿèr†ÌÆ•X IJìŒ Ž|ýžAÎöëú)טÚwÌíR¨pné5ë¢ÎÅÞíV û F':­Æ‚»ï= F]~ïYñª]¶ï”ÿîæoÇÍuµKõŸ¿ÚZ}ÐvšùºKVŸu¹à~ ±òz ±ÇdÉ=м¯'Þ¦ÐÔ‡s? q‚½€Æ‹ëÆ“±s=ÐpòÞæhÊ/¥:ûh|è4!\ 4Aˆc²Kh¹*ï@ó4ÅÖêÎÑ hOôhÁ½@„ô×:†öÿ@Ã8àxšw )¿”·pòu(LªÄ~ñ i´–¡qnB¦›0HqnÂ$À§eQpÛˆ§eƒ ›0H±¡in¬;žç&ä6®;-ü˜Ü„¾°þ¾édBô;m¬ ÃÉ’°"ÜÉò Òr0þÖ,¿á¹$"áMÌò›u4jBçf–ßð·[³ü©%À–߬ãQ¸Žå7<ý1‰u€âœÙ½ª¢õÎn Üª`åg"蛌°‹Ž7|yÉí0>´.*œ#‹ çK‹ /È„ïé­&QpÛH‹ W¸Õd±áè­&³Nì§E‹ çaQáÏfæn|Ò·èpýú_Îf—× fÑ[¯WÉ*0z$>6¯f|b%¡sA+ K`0XɃ4ˆ ”•u·¹ƒ¡ÀJ¤†Ú ¬äY'ö †`%)Îf%³`ÁÐÕj½II«mD=âS¯ÀÉ,õ­ÿÉ©$Ü5×nãípæ zbÖŽ’ø»RqÇXÓÖä‚ãRqGCÈ'7œq}'£¹CÅ?òúÜž¾ð>_À})1}èaÚ.æ˜< îÏ:€Û€ÜÆ ÷¥,0Щ¦6(}Ö‰ýÌè¹+q_Í@çà>'¦V¯Ò^‡ÅhÇgVѩ˫´¿‘)ï¡ñpçü¢º|€\pàü2B¾¿£.Wߪ¬]e%èÛ0á|;ü^½ñ—f mÈ ¤ w; Rrâ"5½Û)ênriÒ…»©¢6èÝN³Nì§F3~€»ÂØ—W01>â‡jß®G©³*ØÖgÔz¯ë3O½(Eýlís­µú'¬Š`õïTNß6F|uìè]÷% .)—9Iç‚V„M ÷% RKÐ è}IQpÛH …û’©¤6è}I³Nì§B¹Ø¸!áìLBrÖq]’UÃnǽےϦ|5ï‰íá÷ã¨RHC‰U©‹SukUæºGÄš'{´Pù=G‰dàŒÅSEi$½ÔN v…»o)9瓎Þ}u·¹Ô®p÷Í Ô½ûfÖ‰ý”¨ÝÜ}3ôâìLP3ʪÊúwÚÉ9}C¾gÝû¶±‚åO»¾Ê®úÌØNF "ÜM—þúœÎÎIéë²})j~Ò}Õ“9gà­ ¦™‡+Câ§i­rÁ12­ðøx>}ØÅ'—s2֫Ⱦ‹Ô׳hlˆrbùúÆPŸ¹ ·•¸>ÅGɳS|NÃmÇáAq[I‡q; Çíe|¼Üf²åãØsiò‹wZµ]6Èæã4Èî:å®:}vÒËY@Ç9Ô¯sZ;‡ïõEÔKÒ†–¹àH”xä¼\v°8ÉœŒÓ¦u¤’¦Ø9Ô‰ŒKa9÷=ªiÁz‰½ Œ¦ÞtÖ{=ÖÃãäuÆú®—¹²ŽÂ9»Î¾!ÆÇ¯ª§*G ÁhžBŽ]jp\¤KMH> endobj 1025 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 172.500000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_thread_performance >> endobj 1026 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 758 73.5000000 764.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R >> endobj 1027 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 745.250000 84.7500000 752 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn2 >> endobj 1028 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 737.750000 122.250000 744.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn3 >> endobj 1029 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 731 138.750000 737.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn4 >> endobj 1030 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 723.500000 109.500000 730.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn5 >> endobj 1031 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 716.750000 131.250000 723.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_language_conventions >> endobj 1032 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 709.250000 104.250000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn6 >> endobj 1033 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 702.500000 129.750000 709.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_class_examples >> endobj 1034 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 695 108.750000 701.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn7 >> endobj 1035 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 682.250000 84 689 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby >> endobj 1036 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 668.750000 105.750000 675.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn2 >> endobj 1037 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 662 143.250000 668.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn3 >> endobj 1038 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 654.500000 177.750000 661.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn4 >> endobj 1039 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 647.750000 180 654.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn5 >> endobj 1040 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 640.250000 153 647 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn6 >> endobj 1041 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 633.500000 136.500000 640.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn7 >> endobj 1042 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 626 183.750000 632.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn8 >> endobj 1043 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 619.250000 201 626 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn9 >> endobj 1044 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 611.750000 204 618.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn10 >> endobj 1045 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 605 148.500000 611.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn11 >> endobj 1046 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 597.500000 126 604.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn12 >> endobj 1047 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 590.750000 129 597.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn13 >> endobj 1048 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 583.250000 146.250000 590 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn14 >> endobj 1049 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 576.500000 130.500000 583.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn15 >> endobj 1050 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 569 125.250000 575.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn16 >> endobj 1051 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 562.250000 130.500000 569 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn17 >> endobj 1052 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 554.750000 135.750000 561.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn18 >> endobj 1053 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 548 145.500000 554.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn19 >> endobj 1054 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 540.500000 174.750000 547.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn20 >> endobj 1055 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 533.750000 146.250000 540.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn21 >> endobj 1056 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 526.250000 153.750000 533 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn22 >> endobj 1057 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 519.500000 145.500000 526.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23 >> endobj 1058 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 512 207 518.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23_1 >> endobj 1059 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 505.250000 155.250000 512 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_STL_Functors >> endobj 1060 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 497.750000 153.750000 504.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_Iterators >> endobj 1061 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 491 159 497.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn24 >> endobj 1062 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 483.500000 218.250000 490.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_shared_ptr >> endobj 1063 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 476.750000 201.750000 483.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_generic >> endobj 1064 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 469.250000 190.500000 476 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn25 >> endobj 1065 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 462.500000 190.500000 469.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn26 >> endobj 1066 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 455 92.2500000 461.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn27 >> endobj 1067 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 448.250000 146.250000 455 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn28 >> endobj 1068 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 440.750000 153 447.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn29 >> endobj 1069 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 434 141.750000 440.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn30 >> endobj 1070 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 426.500000 155.250000 433.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn31 >> endobj 1071 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 419.750000 146.250000 426.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn32 >> endobj 1072 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 412.250000 121.500000 419 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn33 >> endobj 1073 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 405.500000 185.250000 412.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34 >> endobj 1074 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 398 161.250000 404.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34_2 >> endobj 1075 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 391.250000 153 398 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn35 >> endobj 1076 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 383.750000 150.750000 390.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn36 >> endobj 1077 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 377 99.7500000 383.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn37 >> endobj 1078 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 369.500000 156 376.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn38 >> endobj 1079 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 362.750000 146.250000 369.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Typemap_scope >> endobj 1080 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 355.250000 154.500000 362 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Copying_a_typemap >> endobj 1081 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 348.500000 154.500000 355.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Deleting_a_typemap >> endobj 1082 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 341 165.750000 347.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Placement_of_typemaps >> endobj 1083 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 334.250000 144.750000 341 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn39 >> endobj 1084 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 326.750000 168.750000 333.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_in_typemap >> endobj 1085 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 320 191.250000 326.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_typecheck_typemap >> endobj 1086 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 312.500000 172.500000 319.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_out_typemap >> endobj 1087 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 305.750000 180.750000 312.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_arginit_typemap >> endobj 1088 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 298.250000 182.250000 305 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_default_typemap >> endobj 1089 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 291.500000 180 298.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_check_typemap >> endobj 1090 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 284 181.500000 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_argout_typemap_ >> endobj 1091 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 277.250000 183 284 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_freearg_typemap_ >> endobj 1092 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 269.750000 185.250000 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_newfree_typemap >> endobj 1093 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 263 194.250000 269.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_memberin_typemap >> endobj 1094 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 255.500000 180.750000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varin_typemap >> endobj 1095 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 248.750000 184.500000 255.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varout_typemap_ >> endobj 1096 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 241.250000 185.250000 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_throws_typemap >> endobj 1097 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 234.500000 188.250000 241.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorin_typemap >> endobj 1098 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 227 192 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorout_typemap >> endobj 1099 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 220.250000 200.250000 227 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorargout_typemap >> endobj 1100 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 212.750000 170.250000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_ret_typemap >> endobj 1101 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 206 183.750000 212.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_globalin_typemap >> endobj 1102 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 198.500000 153.750000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn40 >> endobj 1103 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 191.750000 147.750000 198.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn41 >> endobj 1104 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 184.250000 212.250000 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn42 >> endobj 1105 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 177.500000 212.250000 184.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn43 >> endobj 1106 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 170 184.500000 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn44 >> endobj 1107 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 163.250000 165 170 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn45 >> endobj 1108 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 155.750000 157.500000 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn46 >> endobj 1109 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 149 156 155.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn47 >> endobj 1110 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 141.500000 201 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn48 >> endobj 1111 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 134.750000 188.250000 141.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn49 >> endobj 1112 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 127.250000 150 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn50 >> endobj 1113 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 120.500000 205.500000 127.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn51 >> endobj 1114 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 113 200.250000 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn52 >> endobj 1115 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 106.250000 122.250000 113 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn65 >> endobj 1116 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 98.7500000 148.500000 105.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn66 >> endobj 1117 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 92 156.750000 98.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn67 >> endobj 1118 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 84.5000000 200.250000 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn68 >> endobj 1119 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 77.7500000 200.250000 84.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc1 >> endobj 1120 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 70.2500000 200.250000 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc2 >> endobj 1121 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 63.5000000 200.250000 70.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_feature_autodoc3 >> endobj 1023 0 obj << /Type /Page /Parent 2 0 R /Contents 1122 0 R /Resources 1124 0 R /Annots 1125 0 R /MediaBox [0 0 595 842] >> endobj 1124 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1125 0 obj [ 1024 0 R 1025 0 R 1026 0 R 1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R 1041 0 R 1042 0 R 1043 0 R 1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R 1064 0 R 1065 0 R 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R 1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R 1092 0 R 1093 0 R 1094 0 R 1095 0 R 1096 0 R 1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R 1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R 1108 0 R 1109 0 R 1110 0 R 1111 0 R 1112 0 R 1113 0 R 1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R 1121 0 R ] endobj 1122 0 obj << /Length 1123 0 R /Filter /FlateDecode >> stream xœí]K$¹q¾÷¯¨³€íå+ø ;;»|00Ø||0V’A<ÒÁßÉ|’AFvVäƒU=½ƒžŽb2˜Yù}$ƒƒßÿÛ/ÿ}ûŸÞ¾ÿñ—ÿ½ý6þüñ—ñê@ ÿÝâŸïRƒò¯ã¿oÎÃí·¿½|½}}ùòò¥ûûëËpÁ/?þG÷¯ÿ»©Û¿wÿÿåöûÿêŒ Å{qÒu?ÿÚÿ NvÿóÏhÿóËþîö÷XãänlLþûwÝ5"6â Ç__¦›”ýŸþö÷—ï‡Û¿Ç‡ FumúÞþñÇ—?ÅÛâ´S–í”fpúk»§4´xõ^¸›Ô¾ÿ‡”½Uu7º ¿½Hm_¥ Êû¹ äu@ê#^0|Ù-¿^9ä£3ÄKÒvÄ2cç:òûø­û6™¿€xÿù0XˆïîëÊ…Ÿ~}ùþçp“öö럺ú=üøµ{v ºßº‡Û¯¸ý‹Jüëí׿¼tMÂ*è¿—áùùÉçþójôå“©kVü0j?R×hè?‘òŒõ݇Ë5?P×е)O^cɶ Ï ^µòrc«eZ-^­“y«ùÜõ‰¦Ÿõp?zz8‰ ?¡[@?úN‡Ú¤žÏò §Õ†ü~èû!¯Qñ’ßýýHCú9ã[øé׎‹:©QlÇ ‘ìD±FAjøkÇTçðQt”ñ‘VÞ}ÿ',üšÏ=¾î6½¬=Ï·ú<ãQŸgB­Ï‰ú£Î€û¼¾ äu@êcîóŒ«õyÆ"÷y±ÌØN—õy‹–}˜gèóÈ|p*“SéÞ]“½.é‡nõ±c)Éï”nÙGˆ‘ñ nî&&ÒÞ¤†ý]ƒ'`ë{Ðú0ÝöÏäWO~"ù•ÝÌød$¼Š ]å!Öj^>©¦6´`åU@^…*=U>¡ýè­ƒ€žæƒ˜{%SÃ_q‹‚¸ÉÎÌÆšAÎ}ÙøûØ Y;ö ½µsjažK†ß^¬{"9•ÑY:uÐ~û üâî]ËÈØåˆe|V…ÏüùåÓï.ïÆ|ü¥»û·{±«æZê'ÆXæB¿õE^Œ™‘$ÈÔ°ûM‡9ó›:ŽqЛÚlòɈâMetV…NLoê8ÐBoj7Ëtü¦Æ2>«ÂçZ¾©FŸó¦2FH+Q{Æ‹&ÂZ“M¢zŒ®Ÿ30ZéÙ;Òá•OwÛ˜ ~qÔ“vllp5`C@¸ë رŒÎªÐ©ƒ ØÝ ©ìn‚˜رŒÏªð¹ƒ–À¶ê`Ó×°†ðŒéE9L&½2>§c$µ<@\ŽlÁ éгºtm‡RåÊlŒó-Э¾oÔbõLnRÃnrs“›³5rsqOgÀäËè¬ :˜ÈÍ™¹9è‚ÜbŸUás-É­»SÈM2ºáOä´’àà˜ž¤ÒX¡9†e1#¦q-ï©W3H¥K »ALÒ5‡0\Ò0Ár®B§&]i4äTÒ–s>wФV¼ EH“„ûƒ•œ®{eJMƒôÐnøŽÑÑÊ ~ªG"ï£2NˆšÑØû:w+äÌRÃ^Þ°Rg¼a¥©ð†Å±-;ĶRè÷etV…NŒ¼a»>§ä +%v 1oôe|V…Ï´ä Îá ’VÐô™ÔêOc”WãnŸþäÔ²FúE”¤04B¶jŽ@+¡RÃÆES«çÞ{2èÊ¢©‹é‚¦íÃkÙ¢çPò: õ1-šZ-+‹¦V ìCàEÓ¾ÌØN™.š&>.šZí/F̱!jZX#À¸ »QÆ\ÿÔ¹ä°(guXú‘v÷7 óþT­¿Á,;²².#–ÑY:u0õ7 jýA¡¸hÀýM,ã³*|î eîôüp$VktÛHH;Í|Бøe†hRÃÉËá6L¡×•Eoúö?–çåðZ,ñ3é¨OÔæ¥ø’½ŒLBjØË×Nå|íT¯B| ˆ¯û2:«B§F¾vªÆ×N"¾ŽÄ×}ŸUás ùÚ© |Mò^\?teƒF[áx΢£_XñsÐté…Éãð~1lœn8#òé†3²2ÝpFçSh@Ó¡ äu@êcšn¸n WN7\7VÏ}h§}™¡sù}4n8c/àÁ»È•*z(µ2(¡?¹hU°‘`˜ß83 qô€Íɰ›€ö 9[Û3ä,Ú3 ›vÚ3”Ô©›PÛ3ä튌M˜ö -uä÷Ñ›öí=C—a“¡b­¦ÑÓÎÄäXlr4ל°?£{¦ïg¥mô¥IŒ;eiÈ9ƒ—çÑ&Œ|kg}”!5lå[‡ö«8WÛ¯â<Ú¯ ˜oý´_%©R3ߺÚ~çÐ~•hÀ|ë¦ý*Kù}´å[¿Aé{ßr¤YôÇ7¤ªâ,(“,4Êü–Æ2‚Ùw*VZOWOëä³ö/Ý·µÅùY8e„I [Y/8ÄzÁWXÏ ´äGKXk(yú˜Y/Øë´¨ ˜õb™±6c½à€õ¼Ø ¿Šõš­GTš´Á™°vµ?x1ë³´Î ¹ÀK›s—®Æ2 .è¥9ôe ¯Rx .ðqa"÷a0ôeÆvBʉ–\ 6ͯâÎÌ‰Žžsƒ—Âîè¸,©Ÿ#»ÍèU‹¸Ú‡Ô°½zµ­¡ÇYýgMÑ×—¼H}ÌèÕ¦†^­±] 7–Ûi2ôjxôš Jê«Ð{¨@«ýüåÌéçFÇ~è¸G{™=aÂB¡•GÌѲÞ1,d1ÕˆeÆvªlª±øh9ÕpöuÚ'~ÈFVYñ ÙHmáž³ÄJ³«ÂçZÎz†}H †ç,lc…šüPáÍÉsý™D6=‘ ¹e¥6:‚CSþEQŸ•Ì™4ór²ÍžýFëaÖ:j•6ŽHƒ”ùˆ4HU‘¼¬Æe¥dD9”¼H}L#Ò EeDZ‹4"íËŒíéˆ4ñÑpDä9; ®JíGãâ¥Ûý!ͰdžTV¤†­ÈÐHâtMâð’MÐ…Ä(yú˜‘¡jÿîò¡ ‰_fh§Ê$þ‰–ÈÐçHü¯J%hÈÞŸ5W+hmÃã¢%)¦êGȳa+ˆ Òâ¨iñ -~€B‹?”¼H}Ì 25-~0H‹ DfÒâ/uä÷ÑDpŽÿª´}ãîÕZTûÐmbŸ‘qhz g‘U„%m¦î7;φ­Ð·HlMp2¸B>”¼H}Ìз5Yx°(ž úv’…/uä÷ÑúîYøeIí²Š{–‘8Ê*N¢©;ûÏ%=£r™a+ˆfùšÊ8x¤2Ž "?©Œ—:òûh ¢pŽÊøª¤s+›Ãi1º Ö’2ÝO߉™d‚©afT|)f¢¡TãFkn f¦2ש3ÑPªq£Õ`H;–Û™¨q3Í0£">f8z>ƪÄJÊzÔ»}JÇ’Û‰ßç"—u:5l…—/UÊe£Õ£W_ù^ÊOxR6ƒ—/UÊe£Ucº€—Òž”Éà¥ÚËeU Ð?¼ù¥>ò0[ò*ïRÃV˜-"L¨Á,j  33ãj©R3ÌŒ®ÁÌ(ìC033®æ:òûh 3x—ÁìóÃŒ^›££œåONòŸcçx»ÎF‹oÔ¼p¦¥N [n5¸-µ`Ñjø¬-ní„hk2€[nK-X´JìC·rB´UÀm{-XlÅ9Z0Àiõb{€«a¢XQUÝ“¢›sôI‡fæà|ô-.îtqó§"5le0¯ƒù2çr´bƒy˜(ËëŒÁ¼B æËœËÑ*°Q0X,3¶Sf æÛç\Ž­¸ZëÄÑhιbí¹íP $kçàé;ñì-4©a#ž¥9ž¥(µ@ÑŠ‚ZRŒç¡ äu@êc³¥¨kzÀÁ¹ <‡p›Ú)R<'>âYŠgÐqTB—MFŽÍs³=,°¢õ»ã¹£B RÌ ©Z›Ô°×J \«RÉ­(š&•.p­ôd%3\+p-K%S´¢¨`4 \÷e†vÊáZµW2ÅV<’‰Æ5'UâU¸f,/{«? ÏjIp*3ÃV<ë€ðlJQU´¢°4ªÀ³Q€Èð¬³.EUÑŠÂÑ€ñ¬Ý`í3<ëö¢ªxã#ª¢ñ|l*¾ƒñ|lÂÆ>YÖa¥Œ™ ½äI™ëP-®cÍ¥ÈkîØGo 9¹"_ZúK¦Šûº3KŒ³©akuPŠë:+ìJ+‹.Àʉó!d]xÔ@)®‹V ŽÜ€8\Ö@{q]|#®[é•Ý]ÕpÐôˆ‘Úóã7ÒÂ2Ïó©a+)8‡HÁ•bÁΊc¥Ò‹‚¼˜X`©R3)¸R,­(æ ˜L,àlF ®½X0>‚Ç ®Â¯5]E +‹Ö‡ 4î+}’¾RÃVÞH0)CM0)qLV†B09”¼H}̼j‚Ipl9‚É¾ÌØÎL0™øhÈñüÒ'àG>»–䕹GjÂ9zâýK°ã+)Õ^uýv«®Ýž3þa¨a3¡š%o£Ð©áLBÕOZ{FŽèÁÆ”jªö¤ß˜‹*@ªh5U´ÂAg…*z(yú˜æ¢ jªhû(TÑ}™±™*:ñÑr. £Š^¡ßC÷q2=¾½1ˆNtFG¬XkœŒCzVÔPô_´ý˜^É,Vñ8ç­ëÈüÊ´†¦ÛB"&ï›QÛ%դΠû‡yN´æ¹gÐ.Ó»Ekâ2ÃÆ1½–H¬eM·Qfãíh@cú¡ äu@êcÓkQÓkôÇÑ€Æô}™¡"Ó'>Žéµ¾¦ÇŒÞêž´GI•µL¤Ê¶B_!©²Ö5©rìfK]H•‡2שúª&UÖ I•£C_MR奎ü>ÚB_Ÿ$U¾êà(zyèºÎQÎËô´tfeF V¦°Œ<Í÷’‚^2Cj¶’‚AâUmjâUão ñêPò: õ1“‚©‰WµAqÄhÀ¤`&ñêRG~mIN¯^t®ÂÊir‡ÆÏ¾ l¢!™a+6-ÒjëkØtHC ›nÒ&u@êcƦ­iHµEÒhÀØ´“†t©#¿¶Øt'iH/šª²,é~󌕩MG ºÙˆµêQ×f"q‰¨Ô§†½!-íçáÃø»«„´4Ž8é!â”F¥ú2:«B§Æ–öP iio°ƒCZ}ŸUás CZ:œ¤3åh»iÃVv¿Ñ£†Xè2ð3VîVöG^õt8© yV^†6Ø=uÐ(òöK`{ö02þ3ÂVø/ªÃ2z2} 2£°¾ŒÎªÐ©ƒ‘ÿŒ0þ‹z ä@cþëËø¬ Ÿ;hÈFž¤âe(㿽?–x—³³»Íº^ÏF.9\{ülØ8™2 åp5ª–ÃÕàȤQEס äu@êcšLUËáj”Â>Š®}™±Y×ÄGÃÉ”Ño‡ŽüÁB{z‘üŽC×=±—Å`ŒÍpƒÒ¼*¹õp÷Êœ¬°5'/üi(©¤ [§‘F'§ÉûÔ°•B ÒƒSÓƒÇ5¦Ðƒe ¯R3…ššÔ‰}zÐ¾ÌØÎLšøhI¡æ$=èEzõ‰¢Ð'uÜ×Yœ{ 0+ÏÈí[Py”Ù}q)KÒZ€Ô°•P,JZkl-i­ÁÁgc‹¤µCÈë€ÔÇL(¶–´ÖX}Ikû2c;³¤µ‰–„bO~2…u¨7 3šP¶«„/ǽ×QÔä`— ¸ýÊôlØJeÀ5¾–×x”¥Àø"îPò: õ1“ƒ¯eÀ5e[ˆLnÊ€»Ô‘ßG[rð'‰.9äÀXýúö¢:ÏvÊŽñKj\åRÃÞ(mWI¥!+QZÀAT‚¨i µ/£³*tê`ŠÒ†P‹Ò¾ˆÒÆ2>«ÂçFiã¦æS8€±gŒÎtPîEb$Œçl~]ñs×rˆE¶2ÃÆž$j‚ª 5‡ABÍ¡ äu@êcêù@Ö„š Q84PÏ×—ž 5 {>P' 5/ÚÁ$Æž^EÐí³âþŒuÉ{Ùœ¥_FHôIBß×]‚Z”›#ÈïSn‚FÊMÐ5å&àH˜B¹9”¼H}Ì,¡kÊMÐ(â ˜%ô¤Ü\êÈï£-K˜“”›–`Dãž«?Ýž˜¨ÌÓÒŽ·îk34Í"Üìo™ [¡ H¸ àkÐÄ1'°…ps(yú˜¡ 5á&ŠE†&LÂÍ¥Žü>ÚBÓž$Üd@óØÔïœw¹ _×z_øf.°‰öÒ¥†­\àPBOpµ„ž€CLàŠ„žCÈë€ÔÇÌ®–МÁ>Š„ž}™±YBÏÄGK.ð' -9\Àq36\®¬õp†ùtq&]xèÂëûè" Ý!ÔNt‡€öNC(NtÊ@^¤>fºµÝ!hì£8ѽ/3¶3;Ñ=ñÑ.¬8I—È¡‹C³ü°‚ÁwÆ9aN4†„{eú2ËþÀ»ó*º¶65lä+‘4ÒÊš4ÒâX •…4r(yú˜8ÇÊš4ÒJ…}ÒÈ¾ÌØÎL™øhÉ9êíÉÂeœÃÐO7S»¼kŒªä„z‘vç³Z6Ï9fõIZ¶CßùcãòfÊB8vÍû†Ø+µ=!`¶&ë²fQ9H ûaíSñY8I‘u,è•ùÜ×µ”7rdóoj$¿Q B’U/3ìª íêNRG]TNXzåE>t÷ì7 ·¨¡<¤†ý€éfJÍ®–µ— Ò/2k{ö±‰æék>€™3Ìk³¦?äc6ì¦ëþn L'GíÄ&gG# Lz#¿åÊ;HçÆ¦o>€™ÓÉåæ>D2öSÙöÀÔ#0b“sB0ý"LÖND’†¥‹Ë û‘d =’àô@$1äò—=?¦~ûáfŸO ûágM{ø¹’àpà÷ùHø­,FsòDÐïà¡0ÿFéô2ÂÔ©a?0}û£t]x ± ˜úЩç¬FEžrÌ¿Q`†å]RÃn`zÑþàU/ÅS“^׌ܜ+CY†èŒ¾†Ö¤|XëÇš~f/—4SF¥†ý`Ví¥.^½W©Ë±"˜"[ëÔáÔmEù²ÆlØ:Ó^IãÍ“+ihÔª±9uA ýx4‹`FÚÔ°Ð^0ãís fV¦=VJÃIêÊ&=s-vT£x´~Á£O ûñèÚëq¼n=Î 9ÉÂ0­/ãØt–è=cØ/ÒeSÃ~ ‡öÒ ž[º³‚aÎ!ïÃ‡Ž¥ß3º»Ë‰¹M »Ñd{ýOPÏ­ÿYA7ç–÷îG_Œ3üÔ’ô(øÔ0í">ÑQgf1ôÔ:ƒ€ã>ÓíµWÁ<·öj…Ū,#}›»YÒ(¹öÃÚk¢‚}nMÔ ,j)º‡ã[A¯ã®¼‡žò®iM¤†ÉC‚C ‹‚«%, %,ДЄE}™±Y¢ÄGÃä!Á?†ëݧõ¦ìÜÅkº¶²ãd»/IIðK"¡fþ¾DB! DB!Ô …€ Eæ‚0ƒ?d‰„f3„Z"¡öQ$ øC–H(ñÑŽ dlÀÃpcpÏ‹œÝx¨ÐKx$q­Ì½éÃçýHO÷Š%i‰|jØ;,—W·–wmx ­‰ ƒ  ³ 3²’rà\sL˜í§°Â€—2M •júhCõF1wðÙVêç²Cæ<ÿˆ‡¥,†ý ¤›ëÖº6ÐО’>ºÍ ¤b }RO Ó\©'R‘ !Ósºñ€ÆÍ¨ƒDçRÃ~ÔÙæz<)Üéñ8¨û8¢“ÝŸ¸Y¥¦mfØÿfûæ*5)©Ô8o6ç\Šƒ6Ž4„³jÌé-î|£CrT¤†mqaÙ½¸Y\¸3TŽª“ÝY̶7äqá± äu@êcŒ w†ÊQuÕ"U7”Û™U—úh–òq”dœ=ûïeh{w·â˜n,Ù¤óW‚ºWlƒ™¶"^9„xåkˆ×¡QãðÆ2שñªr^gäCáð†2c;m†xõ'àuàqTWÇ&àœ·rN^¶eíôÊ£³šÝX+ãŒÐ!‰p"i¬ƒÌ¶§7d=?zsxJöU {ûŠO6÷zIbfejØÚ‹zS9÷°³ÄΟ{8–¼H}Ì=€©œ{ØY öÏ=ʌ턬0p?¿8x½’!#dY¬¿ª`ì+XQJ\uÌÛË ‡ 49äÍâj|ƒjk8t¤[Xd˜Ê¥†­tkÑ­­È0;«GTh± s,yú˜éÖVd˜UcX†9”Ûi2ºµ ÔÒ=Ž óØÔ!ô‰’+c#$ Œ Vš«É)̱Šò‘«7³ƒ[„™}Dn6ì)Kß«Âçþüòéw—º=Ÿ«“½Œ 6ô€m‹q¡á‡fªâÄÅè]:¬“èÁ+Ýr¶üo]|õ"f=jìÃÖœ‘hgTm‡£âjŒŠ§°¾ äu@êcÀQÀiÝ<€‹eÆvŠl·øh9€3'ég/ÚDkaWâëtäØý©œü@ÏCm›{}³œ«djØŠx+â­¬!fÕ˜MÛ—¼H}̈‡PC< s4`ÄÇ2C;ç:òûh‹x{’v÷¢ý7fxí¥™—Кóî>¡®áœŠÆJ¥Å`Ê;xо ÷‰]¤ÇF§†ÝqbåÚK•?Iz|(0í¾?Àü~À¬ïAѵÑj»èd%+¿däŸöÓIhž‘Sjq’Žú*:ù|ÐÉQtB÷M‡Ñ‰ÓÉlØM'Z6O)µ:I¤}°¾ø “:©>ò<ŽN”At¢J)*µnžRTjs’â÷*:aì þ “:©Ÿ²Mço9ŒNŒFtbî——/·¯¦ò¨@þË[¾®ÐÒÈ ¾š']êW!ãŠ×mI•.É÷qXÛv•ˆõ ÌPåî1윪ìÑŸÇkÆ·á5}¦üè·²_×Úöóx§å¢Ÿ%k_? žZc§-3Å ŽÀ®UïÈO u’®¼f\|wݺ[Þ{î çDx•ÃÃø.æÌ' š mõNß„Á—Û——ÿöUåw endstream endobj 1123 0 obj 7916 endobj 1127 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 778.250000 221.250000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn70 >> endobj 1128 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 159.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn71 >> endobj 1129 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 764 117 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn53 >> endobj 1130 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 757.250000 159.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_operator_overloading >> endobj 1131 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 749.750000 189 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn55 >> endobj 1132 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 743 170.250000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn56 >> endobj 1133 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 735.500000 132.750000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn57 >> endobj 1134 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 728.750000 201.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn58 >> endobj 1135 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 721.250000 153.750000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn59 >> endobj 1136 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 714.500000 148.500000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn60 >> endobj 1137 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 707 147.750000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn61 >> endobj 1138 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 700.250000 146.250000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn62 >> endobj 1139 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 692.750000 201.750000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn63 >> endobj 1140 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 680 87 686.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab >> endobj 1141 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 666.500000 105.750000 673.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_preliminaries >> endobj 1142 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 659.750000 111.750000 666.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig >> endobj 1143 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 652.250000 164.250000 659 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_generating_module >> endobj 1144 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 645.500000 156 652.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_building_module >> endobj 1145 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 638 156 644.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_loading_module >> endobj 1146 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 631.250000 149.250000 638 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_using_module >> endobj 1147 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 623.750000 180 630.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_options >> endobj 1148 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 617 153.750000 623.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping >> endobj 1149 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 609.500000 128.250000 616.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_overview >> endobj 1150 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 602.750000 129 609.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_identifiers >> endobj 1151 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 595.250000 129 602 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_functions >> endobj 1152 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 588.500000 183.750000 595.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn13 >> endobj 1153 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 581 204 587.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn14 >> endobj 1154 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 574.250000 146.250000 581 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_global_variables >> endobj 1155 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 566.750000 180 573.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants_and_enums >> endobj 1156 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 560 162.750000 566.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants >> endobj 1157 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 552.500000 172.500000 559.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_enums >> endobj 1158 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 545.750000 125.250000 552.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_pointers >> endobj 1159 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 538.250000 175.500000 545 ] /Border [0 0 0] /Dest /#03#db#a2#ae#ba#c7#ed#17#3d#de#c6#94F#8b#96#12H3#bd#8d >> endobj 1160 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 531.500000 170.250000 538.250000 ] /Border [0 0 0] /Dest /#bd#a2#baO#9f#3d#5b#85#3c#a3#e6#83#84#5d#ac#f8#d6gL#0a >> endobj 1161 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 524 130.500000 530.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_structs >> endobj 1162 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 517.250000 135.750000 524 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_classes >> endobj 1163 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 509.750000 145.500000 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_inheritance >> endobj 1164 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 503 150.750000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_overloading >> endobj 1165 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 495.500000 213 502.250000 ] /Border [0 0 0] /Dest /G#b0#f8Jn_#9c#e8#1e#ad#82#04#1e#f1#15X#c24#ec#5c >> endobj 1166 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 488.750000 145.500000 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_templates >> endobj 1167 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 481.250000 144.750000 488 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_operators >> endobj 1168 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 474.500000 153.750000 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_namespaces >> endobj 1169 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 467 147.750000 473.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_exceptions >> endobj 1170 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 460.250000 130.500000 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_stl >> endobj 1171 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 452.750000 146.250000 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps >> endobj 1172 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 446 187.500000 452.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_primitive_types >> endobj 1173 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 438.500000 120.750000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_arrays >> endobj 1174 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 431.750000 153 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_pointer#2dto#2dpointers >> endobj 1175 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 424.250000 126 431 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_matrices >> endobj 1176 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 417.500000 114 424.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_stl >> endobj 1177 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 410 123.750000 416.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization >> endobj 1178 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 403.250000 112.500000 410 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes >> endobj 1179 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 395.750000 147.750000 402.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_nobuilder_mode >> endobj 1180 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 389 138.750000 395.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_builder_mode >> endobj 1181 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 381.500000 118.500000 388.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_generated_scripts >> endobj 1182 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 374.750000 138 381.500000 ] /Border [0 0 0] /Dest /TeY#b7#92HA#91#40#25#f0#9da#fd#2a#08#f5#a2F#d0 >> endobj 1183 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 367.250000 138 374 ] /Border [0 0 0] /Dest /#c7#a1#d1#f1#e6#a1#e2#85#3d#0e#1c#07#c4#15#87f#0b#1b#14#c5 >> endobj 1184 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 360.500000 114 367.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_other_resources >> endobj 1185 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 347 78 353.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl >> endobj 1186 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 334.250000 105.750000 341 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn2 >> endobj 1187 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 326.750000 177.750000 333.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn3 >> endobj 1188 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 320 180 326.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn4 >> endobj 1189 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 312.500000 136.500000 319.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn5 >> endobj 1190 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 305.750000 153 312.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn6 >> endobj 1191 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 298.250000 183.750000 305 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn7 >> endobj 1192 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 291.500000 181.500000 298.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn8 >> endobj 1193 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 284 167.250000 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn9 >> endobj 1194 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 277.250000 154.500000 284 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn10 >> endobj 1195 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 269.750000 203.250000 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn11 >> endobj 1196 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 263 204 269.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn12 >> endobj 1197 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 255.500000 141.750000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn13 >> endobj 1198 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 248.750000 153.750000 255.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn14 >> endobj 1199 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 241.250000 126 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn15 >> endobj 1200 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 234.500000 129 241.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn16 >> endobj 1201 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 227 146.250000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn17 >> endobj 1202 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 220.250000 161.250000 227 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn18 >> endobj 1203 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 212.750000 125.250000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn19 >> endobj 1204 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 206 130.500000 212.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn20 >> endobj 1205 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 198.500000 135.750000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn21 >> endobj 1206 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 191.750000 145.500000 198.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn22 >> endobj 1207 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 184.250000 208.500000 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn23 >> endobj 1208 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 177.500000 174.750000 184.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn24 >> endobj 1209 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 170 144.750000 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn25 >> endobj 1210 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 163.250000 153.750000 170 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn26 >> endobj 1211 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 155.750000 145.500000 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn27 >> endobj 1212 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 149 159 155.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn28 >> endobj 1213 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 141.500000 176.250000 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn29 >> endobj 1214 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 134.750000 140.250000 141.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn30 >> endobj 1215 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 127.250000 161.250000 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn31 >> endobj 1216 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 120.500000 146.250000 127.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn32 >> endobj 1217 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 113 121.500000 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn33 >> endobj 1218 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 106.250000 99.7500000 113 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn34 >> endobj 1219 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 98.7500000 156 105.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn35 >> endobj 1220 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 92 138.750000 98.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn36 >> endobj 1221 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 84.5000000 153.750000 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn37 >> endobj 1222 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 77.7500000 186 84.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn38 >> endobj 1223 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 70.2500000 183.750000 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn39 >> endobj 1224 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 63.5000000 145.500000 70.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn40 >> endobj 1126 0 obj << /Type /Page /Parent 2 0 R /Contents 1225 0 R /Resources 1227 0 R /Annots 1228 0 R /MediaBox [0 0 595 842] >> endobj 1227 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1228 0 obj [ 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R 1132 0 R 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R 1148 0 R 1149 0 R 1150 0 R 1151 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R 1198 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R 1224 0 R ] endobj 1225 0 obj << /Length 1226 0 R /Filter /FlateDecode >> stream xœí]K¯%7nÞß_q×ÜÖ‹zAÛmÈ"€aYYžLƒñ Î,ò÷Sï)±ŽŠ§çzÚ†Ý}yyDUâWõ‘úúŸúÏ÷ÿþÛû×ßýô?ï¿L~÷Ó›ú@ÿ¼÷ÿ~• Lü4ýý=Dxÿå×·ßÞ{ûñíÇîÿ¿½øé»íþöïæý_ºÿþüþïÿÑ ÿ0)õ ¿¾º?ÿ2ü™‚îþ¦–?{ùŸÞþíÞÿÚ8››&ƒþJ+u?‹–{›¯Rÿþí—¿¾}=^ÿ.#F[oÞµ³î]'gÞÿ÷¿ÞþØ_ØŽA扌ZùDÖkÐå5ëéº;»ß¢‘t1’æîÆoüöç·¯HïÚ¿ÿüÇîWã̇?~þõÍ÷þU7‡ÞþÃû?*eÔ?½ÿüç·ø)&å :ýFs¿ÑŸ‡ß¸OÎŽOÕú™Ïû?£¿Ø1ÜgÔwÜg\~£Ý'£c@W¹Ï(ÖŽægàØ+eïµï|²&jüÖŽsÜgÜçé7>+åg½17öz”gGsìhìg”ÓpβSâ¿~þ¦1Y©€¿mü— Ãoì'pÏQöV³sܸ£ïîPoÅ™bupÑ£ÅøÆè@4üåí§mÈÓnܤæfþc‡ÚÆá/ZRÛ Âº“à—·1?iLŒ‹à1 ·Ñ`Ä4|ì¾û?¶Ñ úäóèuÆy.càëø¥{»ýt9xk0x'ÿ2àÍÏà ÁæôOyÿ‡2,è\ðây;0ß#€SiyüY«G¼Ÿ `”šwK < ~yón‚=ëX4„Í têãÏqüá^èÝ'Ð$zˆ†ˆØÀŸÞ¾ý‡Ëq(ª†œ†S`È b;›FHQós×àhú[â=HÂzBé“äë]Àc@ncA×nýTAWï¨ W k¯3ͺ®6îD×`^]%¥Y‘pÅâ„…>duó Wá/?ýÍ“Mé~ØÝ \Á.aaH¹àé4Qœ&о–&ê gq†t2Îôô: assš(ºZš(ZjÀi¢^'¢!"6pgš(éS°Œ_XZA¢eÃ%xÌÔû݈.K€’„t‚Ö±ÇÆM‘¤×Ü®4T2KjƒYÐÅ€r8Š•(AaÀºEQ,aK6ä6æ(”­D1  µah3èLó´y“Ù¸1Šý8†¸ÊóMP‰õüb)°aXâß8ä8ó»pæçÆ£òs3cµì àæ[>z9vA&IEðÑY‰b®"À–§?[7è¯wZqz$hÅjc VWÃjšÎ‡)Ÿcí x Èm,XmL «¦6tÕ½Î4Oƒ°zµq'Vw«þ€Õ‚L¿™À»¾3ç:‘`²¸ËGO<,8&±ƒðëW» ìB²£›Í‚V,p†`³5, yw˜òî¹/:€Ç€ÜÆ‚N×°À)jCXÐëLóÔ Vwb‹ $y©…{ÿ’͇ è 6ñÀ-ÔkT.hut¯‰£{Sstš†)œ;ê x Èm,ŽîUÍѤ²{uô^gš§BŽ¾Ú¸ÓÑý9,ðƒÁ .Ðë´œÃì"Év"²ó†÷eaÁ/ô«c.hõëHÂkaˆ„ ± :€Ç€ÜÆâסF†@½€úu˜ Âëø:îõëxAø`¿–ÔpÞ‰’¼Ä'W6®†\Ðêà)a÷JUÜÓ¬§Ÿ²ž™ƒŽ:€Ç€ÜÆâà)Ö<Ñìm …ƒ÷:ÓÄ#rð”^ÀÁ½:‡z{°ƒƒàÅÍyÙ>v—q7Ò¥ÇR{-· ç„¿Ò=»GWåY(ÛH)š?µßNXm‹åûIN|£Ðd÷z¬‘½Z7cþẗ,GŸÈmèØã–‹ûÅþqI‚Û;ÞD ŸT²5Ú:ÿðUVúü GÖ^úß³‰äJYüÕì•NKð}×ÓZ‹3¼oݺæŸ ž¥Xx+q|¨Uâø@*qz¡X : asÅÂûZ%Ž÷¤§ŠÅ Ñ¸‘báCC8pwŸ%GŠˆµünŸ|æ’ —$‡ÎÛyž÷GX n†¦‹àiŸŒûdL5ŸLš¸LÒ…Oö: as³OÆPóÉn ‹ D_ød¯Ñ¸Ó'SC ÎEdwI¨¹±täs¥rãšØPáv´owy^ZhƘ\иŠÔ¡++á É>R/ +áQðÛ˜WÂAÕêP‚"ûa½€¬„iž¨%³qãJ8è†:”CÝìØ×%OfÑå®*‚;ÃÑ[W>A/$=].x~åö͉?mW-n%ÓS¨Ú ½Bð—ñë›ÞïÅ·ó ©$ ¦VI Ù~ëÍ\I’¹M­’$Gm•$ƒÎ4OTI’Ù¸mC%ÉUø(aï|ÏæùÐ…_ð´¹3j[ïO—5cªµ+¦¦\p&¦&ü„~(¬Kø®Y§kwíÖ9 Xç| ëÙ’ìëÀc@ncÁ:çjXç,µa ¬ëu¦y:„u^ë ¡Òä"¬“°“4¿_ò*ÕúÑÀDs¢-ÏáÇC´õ®MˆFïÚ#Dó¤‚&øZMðd6ø¢‚fÔ<ä6Dóµ šà µQTÐ :Ó\®¶¬“EçÎ=zÞÖ ¢Ù{מVÅ\p"+@Eü¤JB—ƒC¤« ³Nå%à/pæ% oô©Å_ê™Ûþ1"Ýo—'þ®0±yM±v™´sÁórÐ÷?Èájáe²$‹Áç¿ýnÿX»5Ú¹ 5ðN¤_sJµ~Í)‘úô^@ï4÷kÎÆ€ÜÆx§Z¿æ”µQôkt¦y¢~Í™;ït5ÛìØžo-cøgYBhå½éüMÝ´6@4rÁ³ï£Tºûb”~"ÿ >5bcw#VúLô¹à̺3¿ƒºIþ]B+gíìèTÈó3~Ÿ;×äéÞ®ÉÒ'è9¤0ñ~¤°¯Ch!…¤ˬ•ì¡=Ì7c•ͺúÆ\pb FGül°_ÿí¿‚‰k=þˆÜééÜÊòÖo‡ÐF9Ìñ2 *¯NŠ9^ƒ‡Ð“à1 ·1…РÂñê¤Øp”ã5êLÏ9^¹ûBèîÂ_ˆãõ O#èM»± åß®íïPQÆA[CÝ÷¹²¿‚ͭh0 Rͽ‚&~Ð…{ :€Ç€ÜÆâ^>ÔÜË{bÃû½ziž¹—¯à^á…ØjŸLƒÜbšº—¤¶v˜›…µb ¹ ÕÍÖsfA¬¹IÒ êfIÍ~µŽ¹ÅÍb¥b'b#Òfˆ£Î4OÜlµq§›¥×¡§ñGÍ¿€› ÂGQwI‡àc·DŠ÷õ®¦ÝµvóÓHÐèàZavU'¨°«:)fW âà£à1 ·1;¸VvU'uÔeW:Óµ£_µuÊ­~mñkSé$×ýC²»ÆÐNr“à1 ·±øµ®t’ë1‰ØÐ´“ܨ3ÎS'ä׿:Éuÿ¼ñrï÷Ÿnù[­G-O>cÖÞo žìíÜ9:lÙW9l¹“âÖîí<êX4„Í Œ½»Ÿ+‡-wÒ@ XzØò¨Ñ¸¯·swÑ'Q%çk°]‘ ­§[¼LCà&fÔý¹qAmÅÆ ’%ý}ÇXw¾ä×rAk„„¦i FÓ44{f|AÓu¹%B€MÓÉö!ÀLÓ\ÇÀ×qo„àO¢i²Ðvpµú\ Ù´Ü@²cŸ ÚŠºøð™mÃÎ"Í>R€ñ £Ä• N¬W1 »ÆŽÊ¶/ïÜ/òþú憥â+~ôF„QlB¬½hþÕÄ‚Q<êrË!ÔÅ&cV­g<+ N¤Ôu†ðýü”:û™ Á†(?Ú‡®…m YáÇ®ßî±µçðÖuKEŒuV׈Ŗ¦l­.ˆÅ£à1 ·1cÕ5b±Õ–Ú(ˆÅƒÎ4OD,Îl܉uæ$b±ë9°þÔƒ$rÚΨ5+ Ú«\Ðê*–0­­1­%ŒDk Fâ¨x Èm,®bkŒDk µQ0ižˆ‘˜Ù¸ÓUÜã—òe®r虬‡í_X·lÅw±\.xvÿÂÂòÚ˜~v•ý o/Ø! ‡¶ ‹†°¹iÿ‚©ì_XÐÔ€¦ûƒNDCDlàÆý 'Ñð$) »/>${ŸI"®cSl’îáü1Xæ­®mHظY`ýÂ0àrÁÓÐ †–P9ö¶“ñü@½u,Âæfh •co;©¢è±·£NDCDlàNh '1%M¿çÞuõ6’ƒÈϨÑ<(/,Ñ£¶ölXû‰ÜEк&B곩Fê³4ÛdSAêu¹%tM5RŸ$kÖ hègRß:¾Ž{C×t©ïŒ^‹»:¨Iò,ÇV\’<ËÎ|_Z;Q-ÆÁ‰ù¾ÎzÚN§†L¾à™€XÜä4! :]# :šrº Ž:€Ç€ÜÆŒANÕˆN‘lV/ 4èŒóTˆ€˜Ù¸ƒœ>‰€xQÇ)ä¨qUàЊNN¯DÇärÁ³Ñ¼3˜èèlèè,!::[‹†°¹)šw¦Ftt†{‰æˆ†ˆØÀѼ³'%ý Ùc¹Dm®ª‰“tváïAÁ^,òÎV¤ª`×JÀÙµ£Ó¹ õ-ìÉϹÉÏ!ù9(H~£à1 ·±¼…]äç!ùõúv3Éo_ǽoa8‰äǺõ±+ýn~;ÂÚX œ»w†Ðóqà4D÷ø–ô„­Ý£G¸â U¬›j W¡Š¹PPÅFÀc@ncÁ_£Š9O¨b½€âŠŸ©bëø:îÅ•pUL‚+’‚ø$ã±­Û.@àzwz,OÁ«£GvFôÈïÑSëèñú#†Úú#&²<rŠx ÑëX4„Í ÌëµõGtÔ€+Ö½NDCDlàÎõG:‰„'hm<»þ`£äƒ;ÆÚª­tNÉÙç¼á1ãZ"­Æ^°žG¶È=ýÃfÉhþÀ>ŒüæMb¿<¾qÿxË4|RÉÖøF|çÚcÊÎàa™Kò=÷› ;Žý ß\«µeiZ`Öe¢5¹àYDÀˆPCt‚è½€ ú cÑ670!:@ Ñ5P ú Ñ¸Ñ»ïý1¢_´¡´ADà©„v!ªÇtŒ¹³ÀÖjã T‹ qp}!Ô¸¾ÈîH/ k´QðÛ˜×hj\_–Ú(¸¾ƒÎ4OÄõÍlܸFƒØÀõ=Ô.ð”¤ù4¦„Ìt(uãààQ"òðÄ^ÏÆÜE®’+½xÝ]›5ßëXrŽâQ„qX;ÜÙ”rA+Þ&B‡T#ŒC"„ñ^@ñ6-›a|±±àmªÆ!j£ ŒÃ ° Æ37â­WËór?ÞÚ¨vc½(h {ðÙ£ÇÒë$¼f…ÊBÑc{î(R¹ˆð+»õüÚÿÏ)— Qϯg]Ì‚Z£_¯Éî_/ ¨7êr3êy]kô뵦6ŠF¿ƒÎ4OÔè7³q'êé† ƒ‹POÔÎWp˜âÁ”ùÎz(@š¨áóšñk—?S.hõ^KÚúz[këë-ÙcëÔ{íÜÖ7r‹÷ÚZ[_oµQ´õt¦y¢¶¾™;½×6ø¯ò^IO4þìó"é}QQ¾ôͶÿŽÞä6kŒ­X¤jÀC­jÀ©ðPT Œ:€Ç€ÜÆ‚P«ðŽT ôŠn®XÇÀ×q/@CÕÀUXphÃßû×/Ùí»o|î‡Ï{ÜßžuGÛeIŒG}‘›^,ç·]ökOD§!´bh U]\ÃPš÷¡¨zu¹C}­êÁ{’×ïCý\õ°Ž¯ã^ UWaè¡Í•ïÇЫ¸ Ô“{ÂÛa¿>–T¹‰ªÑm*}ûû-lÄÆ;ñví8Ø`e‚V¼]Ï¿˜IÕð–æÃý”ÏñrÐ<ä6¼±†·‘äõ{ÅÛ^gšxDxÓ+àmj([¹ o%¥.AlS”??â|š"—µ‘Pç¯ëÐÙ|ª*ÿÆüf‚­Í#ûþ™ Á‚":AÕ*tÍm]TèŒ:€Ç€ÜÆŒ`AÕ*t‚"9ú^@lЙæ‰*t27"XÐ :W!˜€,û‚¸/'m ŽÖΉÖú\ð,E2¬ç–L?Ç E2XÒá& éqÄrt,Âæ&Šd0¾B‘ †ôèé„"9èD4DÄn¤HÛPEó÷Sï~U‚žmWø"ö›ý×ûm|TÁ¶²þ]d·šnÿØIe9¶ cúz*t}ÉCÌÏšOÍò-r˜[ÜHâ kQgL.8¯œ¬7„àÐò2ß•÷Hö^ÙÖžtäVtSö¾vo…ÎŽ4n®Ö¸=ÐÍ¤àŠÆí£à1 ·±„ήָ=8GmÛiž¨q{fãÎÐNª0`_Ÿ·¹²Üs)Á>Q;Êcãn>™Áã%ëµôoIê–GyAbûØS‰vœ¡³‘¿è¸ðƒ™T<Ë@'îã"…µÉ°ó)´Â¹'õ*Á×êUÝ× ¾¨Wu¹Î}­^%xKmõ*ƒÎ4OT¯’Ù¸ÎÃIõ*8—?óz™>òá›1ó§èëàÓr¥ÙñÖ¼ýa!™àéÌÄz´Îô3Ô2‘të ÃÆN.Ä9± assf"ÚZf"jÀ™‰8ç"–!"6pgf"©S|QÂÐÝ8ÖIPkuïXVÍFÓeÿGP7ø=|(w'hcQ,hõvñqz­ëóµS²ã´¯ü!®'òÌ‚ZùC¤[+Qå£à1 ·1-QÕÊ¢ÒÔFQþ0èLóD噃–¨Î)8öœõz(þýޏöïÏÏY­žaHiA4µÒ‚hHiA4EiÁ¨x Èm,žaj¥Ñ(j£(-t¦y¢Ò‚ÌÆžaÎ)-y† œwü)9’ìLñ†½Š÷»Ó‰Ö~ºfX/‚V'r„“]“iú1º‚“?êr‹¹'?Z’FíÔ‰ìÌÉ_ÇÀ×q¯¹s8ù'U×±IÖ@Ê­>“7¦7ÑLKRwÔ<ä6ŸI52nL4c” 2î 3Í‘q37úLRçqE>#)ßlÁn¤Fù€¿}5+ʪÒ&µv64ºWZ®™±æ^4]“LÑ5~Ô<ä6f÷JºÖ5>i’vêĽiž¨k|fãN÷2çð]Eî%©Ö¹ª¶¹‡ºgû§æffm¯C.hu3KxqÉÖxq‰&t’-xq£à1 ·±¸™­ñâ’uÔFÁ‹t¦y"^\fãN7sçðâDn&()¹ÌÍ$=“Žíó.(Í-o™"“fwËž¡ÕHÐêà@˜R jL©DÓ6 ¦Ô¨x Èm,5¦TKmL©Agš'bJe6îtpSJâàîfñB$BÞŸ=má`þÒ eðkõv¹ Õ¯­&~m+¼ÆNêˆÏYÊkœt¹Å¯m…×h•IĆ¡¼ÆQgš§B~m_€×ØÍâux¼_‹Wùµ ·%éÔypOãÃüÙfdE$hõgPÄŸ¡BV줖øP²â¤x Èm,þì*dÅN‰ GÉŠ£Î8O—?à »Y¼Yqߥ1ìÏ|q-ïµ’ äÔ¶œ¯oFXé‹.å‚'‹’­òKì1þTY”ÜIqÍð ÀEÉ£ŽECØÜÀX”ÜýË¢äNˆHQò¨Ñ¸¯(¹»è“XU œòªsÅE³${Ô’ÆßíìƒOF¸èÄÎC:ÒÝO':”hqì»`#9½{1ÚV¨Ý¡ÕÚg7A.hPc$j¬P{­"YÛA@#Ô¤ç4&¡ÆH"ÔX¡övROlDJíu¦y¡Æ öv·à$j/ûòx#Ìù\.í"YîñÞ'‡-ÓJN14:¢V˜Ü bÅ5M·jMIÀ“à1 ·1;¢Vp'%iã^@qЙ晓€s7:¢Ö'‘€%Ž(HÜntL$T[;|U´v”dŒ=õEYæGñB+(h½PJ†bµUðìjOV{Ú„ÊjO›„czÈá¢Û cÑ670­öº[WYíiã¨GW{ƒNDCDlàÆÕž¶'±˜%GËñ­xgáSªü Qr ÏUU§’ÆYü ñª»#Ù…’4‹’€Ù=é®au¢mÆè†\ð4þ9Àøç| ÿ\$ð4ä¼1„õ: as3þ9WÃ?g©[à_¯Ñ¸ÿà$’· ®pO;úö-Ü BÉí‡bò žcñö”ãîZ1ªŠ2Þ‹ài ðc€¯´áì¤$!­=mÃ9êX4„Í Ìà+m8;©¡hÎQ'¢!"6p'uŠù$e±‘0Å$+• ;û^†aåv$$hÍDK2±Bâì¤$¦#%qN:€Ç€ÜÆ’!ˆg'ÕÔ%qŽ:Ó< ÊÄ qv³8‰ÄÉ>õǦêøn÷¢·Š êÝxwÒÎF°cò‚ a÷å;hX7ˆU.hD £5Ô¨5ÔПQ5tÔ<ä6f”0ªF 5JQ5tЙ扨¡™Q¨“¨¡”´‹?yÓï#yâÎŒ¾Qk“ÊärA«'Bæ4¦Fæ4†9)Èœ£à1 ·±x¢©‘9&dÎ^@=QÏdÎu |÷z¢9‰Ì)ðDQƒùÙ~éZ‰±À¬DÐÉÍöA#DPãjDPãÔ¸‚:êr ØÔXBí ìL]ÇÀ×q/¸“ˆ ,¸½kå!å óTï“ÃQÞ¬½‡è±'‹¼Æ*Î>—¬*A7ú“ÿd†pù›fÌv ¡Â• Z1Ál_éÚI ÁSO;…N:€Ç€ÜÆ‚ÙPéÚI±´Sè¨3M<"̆èÚ]øI¼Z fK †=GQÄ]•ðwo?{ñu:¦L=´û gEý‘Ïh4ÝŒ¡~¡™8 ¹ C¡—šP£—šO6± —Ž:€Ç€ÜÆ‚¡¡F/5äÅ{ÅÐ0ÓK×1ðuÜ‹¡ñ$z©C;¼{/4ª ô¥Õöø¸+¬¶¹ ÷øß~|ÿ­{ŒWϯ<å?>RømcÛwrƒXó‚nBŸ”îýw3;ÂTÑV{]Žk¨ÜÆñq7eˆ9$R >íçé3ÓB£XÖž“ÏœûhMP›ÛÓ•–kÿ ŠwôÑåIœ¾¼ÀÉy^¿€©\†æGc?3y„ÞuéÙ©ëÒ.¨.oÆWº›ú| |¸ðýjô¡üøþãÛÿçÔª; endstream endobj 1226 0 obj 9311 endobj 1230 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 155.250000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn41 >> endobj 1231 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 146.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn42 >> endobj 1232 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 764 187.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn43 >> endobj 1233 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 757.250000 185.250000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn44 >> endobj 1234 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 749.750000 140.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn45 >> endobj 1235 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 743 108 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn46 >> endobj 1236 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 729.500000 121.500000 736.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Mzscheme >> endobj 1237 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 716.750000 139.500000 723.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_nn2 >> endobj 1238 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 709.250000 114 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_simple >> endobj 1239 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 702.500000 134.250000 709.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_external_docs >> endobj 1240 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 689 88.5000000 695.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml >> endobj 1241 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 676.250000 105.750000 683 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn2 >> endobj 1242 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 668.750000 143.250000 675.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn3 >> endobj 1243 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 662 154.500000 668.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn4 >> endobj 1244 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 654.500000 156 661.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn5 >> endobj 1245 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 647.750000 153 654.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn6 >> endobj 1246 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 640.250000 225.750000 647 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn7 >> endobj 1247 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 633.500000 156 640.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn8 >> endobj 1248 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 626 163.500000 632.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn9 >> endobj 1249 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 619.250000 122.250000 626 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn10 >> endobj 1250 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 611.750000 193.500000 618.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn11 >> endobj 1251 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 605 120.750000 611.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn12 >> endobj 1252 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 597.500000 219 604.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn13 >> endobj 1253 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 590.750000 220.500000 597.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn14 >> endobj 1254 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 583.250000 177 590 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn15 >> endobj 1255 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 576.500000 274.500000 583.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn16 >> endobj 1256 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 569 137.250000 575.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn17 >> endobj 1257 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 562.250000 216.750000 569 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn18 >> endobj 1258 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 554.750000 188.250000 561.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn19 >> endobj 1259 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 548 195.750000 554.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn20 >> endobj 1260 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 540.500000 178.500000 547.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn21 >> endobj 1261 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 533.750000 147 540.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn22 >> endobj 1262 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 526.250000 189.750000 533 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn23 >> endobj 1263 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 519.500000 212.250000 526.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn24 >> endobj 1264 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 512 200.250000 518.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn25 >> endobj 1265 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 505.250000 200.250000 512 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn26 >> endobj 1266 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 497.750000 297 504.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn27 >> endobj 1267 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 491 184.500000 497.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn28 >> endobj 1268 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 483.500000 188.250000 490.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn29 >> endobj 1269 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 476.750000 197.250000 483.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn30 >> endobj 1270 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 469.250000 132.750000 476 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn31 >> endobj 1271 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 462.500000 137.250000 469.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn32 >> endobj 1272 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 455 148.500000 461.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn33 >> endobj 1273 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 442.250000 161.250000 449 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending >> endobj 1274 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 428.750000 102.750000 435.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn2 >> endobj 1275 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 422 106.500000 428.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn3 >> endobj 1276 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 414.500000 112.500000 421.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn4 >> endobj 1277 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 407.750000 115.500000 414.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn5 >> endobj 1278 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 400.250000 141.750000 407 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn6 >> endobj 1279 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 393.500000 123.750000 400.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn7 >> endobj 1280 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 386 135.750000 392.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn8 >> endobj 1281 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 379.250000 161.250000 386 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn9 >> endobj 1282 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 371.750000 142.500000 378.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn10 >> endobj 1283 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 365 163.500000 371.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn11 >> endobj 1284 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 357.500000 148.500000 364.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn12 >> endobj 1285 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 350.750000 144.750000 357.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn13 >> endobj 1286 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 343.250000 137.250000 350 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn14 >> endobj 1287 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 336.500000 122.250000 343.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn15 >> endobj 1288 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 329 123.750000 335.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn16 >> endobj 1289 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 322.250000 115.500000 329 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn17 >> endobj 1290 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 314.750000 157.500000 321.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn18 >> endobj 1291 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 308 185.250000 314.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn19 >> endobj 1292 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 300.500000 111 307.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn20 >> endobj 1293 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 293.750000 179.250000 300.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn21 >> endobj 1294 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 286.250000 132 293 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn22 >> endobj 1295 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 279.500000 105.750000 286.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn23 >> endobj 1296 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 272 167.250000 278.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn24 >> endobj 1297 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 265.250000 150.750000 272 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn25 >> endobj 1298 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 257.750000 131.250000 264.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn26 >> endobj 1299 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 251 167.250000 257.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn27 >> endobj 1300 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 243.500000 123.750000 250.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn28 >> endobj 1301 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 236.750000 147 243.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn29 >> endobj 1302 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 229.250000 102.750000 236 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn30 >> endobj 1303 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 222.500000 147.750000 229.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn31 >> endobj 1304 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 215 150.750000 221.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn32 >> endobj 1305 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 208.250000 137.250000 215 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_starting_out >> endobj 1306 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 200.750000 166.500000 207.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn34 >> endobj 1307 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 194 192.750000 200.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn35 >> endobj 1308 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 186.500000 186 193.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn36 >> endobj 1309 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 179.750000 194.250000 186.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn37 >> endobj 1310 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 172.250000 177 179 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn38 >> endobj 1311 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 165.500000 154.500000 172.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_configuration_files >> endobj 1312 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 158 150.750000 164.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn40 >> endobj 1313 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 151.250000 164.250000 158 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn41 >> endobj 1314 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 143.750000 150 150.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn42 >> endobj 1315 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 137 223.500000 143.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_test_suite >> endobj 1316 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 129.500000 201 136.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_running_test_suite >> endobj 1317 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 122.750000 150.750000 129.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn43 >> endobj 1318 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 115.250000 171.750000 122 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_coding_style_guidelines >> endobj 1319 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 108.500000 171 115.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_language_status >> endobj 1320 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 101 187.500000 107.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_supported_status >> endobj 1321 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 94.2500000 195 101 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_experimental_status >> endobj 1322 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 86.7500000 303.750000 93.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_prerequisites >> endobj 1323 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 80 126 86.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_debugging_options >> endobj 1324 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 72.5000000 144 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn46 >> endobj 1325 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 65.7500000 162.750000 72.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_further_info >> endobj 1229 0 obj << /Type /Page /Parent 2 0 R /Contents 1326 0 R /Resources 1328 0 R /Annots 1329 0 R /MediaBox [0 0 595 842] >> endobj 1328 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1329 0 obj [ 1230 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R 1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1254 0 R 1255 0 R 1256 0 R 1257 0 R 1258 0 R 1259 0 R 1260 0 R 1261 0 R 1262 0 R 1263 0 R 1264 0 R 1265 0 R 1266 0 R 1267 0 R 1268 0 R 1269 0 R 1270 0 R 1271 0 R 1272 0 R 1273 0 R 1274 0 R 1275 0 R 1276 0 R 1277 0 R 1278 0 R 1279 0 R 1280 0 R 1281 0 R 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R 1293 0 R 1294 0 R 1295 0 R 1296 0 R 1297 0 R 1298 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R 1304 0 R 1305 0 R 1306 0 R 1307 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R 1317 0 R 1318 0 R 1319 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R 1325 0 R ] endobj 1326 0 obj << /Length 1327 0 R /Filter /FlateDecode >> stream xœí]K$¹¾×¯È³©Ñ‹z‹ܯö°@c؃±‡ÅØ^ÃpÛöaÿþÆ;D†©`Æ#«f ×Ñ~ ˜îc7òyMuèî#hí—¯Pø9~iPâ§ùÛ¹)b×½„„ï+üðóË_Ò­yÈŸÿÜüªÓÝ_?7ï®yá?´£H·Ÿÿxû¥Œú×ÛÏ}i†ž”7Ð}1Ão€ûþÔýƽ:ÛCëü™ßïùõ‘ûŒÒÝo´zõAÇæ—óo÷mX=µcÃ÷ö¹û ¼Zueo+OÊ>íßAœ»·l÷ì`õð"í8ÚŠ\Ñ»ß|þ¹±þyþ–lº™†Í,4j´ikc.ø[c5 ` kK Ð36ØF@A¡k¸ÈuL `u ¬¢:ÔÚ6Ã85…YÇ• Ð|O Ÿ¶›Š±,(x¶·þyLv¾ýH (ð&ÉÛ +Ï“à#²È¾ÁÛÑ~Ø4a€†\ð7b ja ,:øÎ"A=?›Þ®½L²—º›‡iWÐ ~yñn0m=¶±¨ ›+hš÷?«Þ¨ñ‡]" Aó 4ˆ¶MD]D¬à//~w:.DÕÁ„c`A`â¶Ÿvé5x zر­˜oâò‰¿éyV Y²öéCëJú÷loúϘñW5£f <ЮÀûÍ­“ä½í õ'}ÛüŒW–®ÿø×%ð™+ƒ¥ŠÍ:~íÈ¿6þ3Ÿ*=Jìñ;ްïŒË;” °C ºäP‚%xߨCiÛXÔ…ÍŒŧ’Ci”c€:”¶MD]D¬àJ‡ü!Å ÌË|fç?ïPX á-peëw’«Y9ö½™¾7­ÇÁÕ¼Q ¢ä_W¤ÝóO̾%ÙÏ\Ä×oDø—²Á¬(®ÿâœcWl’·ôq“ûaÚ$“ ƘÄþ°Ø*B¸¸Ë\sPùÜä9¿©SéÁïcb"Á˜¤JÁ˜.r’J Ætm÷¹Ž)c)ÑÑh0¦m3 <¢`̬ãÊ`L‚“$ÿýq×` ¿ãw¿'Ó~ü\AÖz“Yºz-÷>[I~´#“b.xtëTD X§Raëó@ëK×o 5hׯ¢.l®`XÀ: X§…ïJ¾‹¥µ=Á‹Ä¹–«¢]´ÄòzvÚôAš1¾™ì™ òTÔ«i×8 |áTÔ«ˆO,[9íÛîr㩨W®p*ê›íÑaé©h×f§ËOE3žŠúfçà¾F;†§ Þ…_¾ò ¦Ëù«‡pQkJ½ž²?lg›“ Ö6#¶i d›†° ZµM3ãÜä:&Ûl‰Û4†ê0 Û4“1N}àç¸Ö6íý­Øi¶)‰ØðÁgž— uH胧Ù3»ZÙOHâL‹¯€8^àÂNù Öú\P ޤ zWJAõޤ ¶ nLAÍú€\Ç®”‚ê¦:)¨]›aœ(5Óq%\¸ŠÔ“àB;Zá?k*¢À+OybqÊhA@íY2CªAa>Ÿ¶½qÀ¶TïI ª÷¥TïI j+  àÇÔ¬ÈuL àK)¨Þ+ªc‘‚ÚµƉRP3W‚‚¯HA= óß»†Xœ¡žäÒ—LIÞ%§«ï üœŠj‘  ¢&XM ¢#vÚ…Á°-wm÷¹Ž ¢*aAHDGH ,hÛ ãT ¢~,ˆy§gaÄq?ñ~âä•mkþIÌqž*99_Á´úô–}³÷÷Ùd½³}ìJâ?ÉÞ·6·hð0qÎMí(D“à¸ä¢VBS—†S±ôj驘­Ì‘Çúöfñœœd…spƒ*åàErpƒZäàvm,êÂæ †“,ŸJ9¸>‘ÜV@N²º6u±‚ O²‚ªÈÁ•8WAàí¬ô ,ñ™¢, íÓQâXêyš¢4ÿþKgñdžøü‘•åѯ$I¶ò2¨€C“ r[4IÌ ¦”˜èD0‹Ä̾ à> ×1nK‚.%f¶3±½HÌìÚ G‰™™Ž ·%ÁT$f;Až…¶‚J’+ŒsÉ&‡G?Á üÍ…@‚™ˆBÖ«\P‹56¬±©„5ôü" ç9Vtm÷¹Ž kl(a%ç0­€bMÛfg@Xcã3`«ÈÍ9 k+;ž_»²Ý“°M·eX7gr€ÊlOzzP¸µÿýãO/NŸ5ƸnÖøŠ4ˆËg;^í´™vp¡Ö³ÎùåuT.Û]Ü·nÓÕû ~bõ8§sA­ žø°J>Œ†ØÃbÏ}P×pë˜|X€’ Žêp Ö¶Æ È‡ÿ >,Ä™ ‹èœŸG>-X“.Ïé6:µ83UÏ;µd/wjQÄüÜuíœý6s­X~]8<$'ê’£ž}7§Âý©ÀÖûó¨&† ¨˜ ¶æ®6sVžØž˜j+ŠÄ/2?/?È• ÈohuZ™‰Úä‚ÇÑÊêëÑÊÄÚ= ­D;€ç#õIG²NâQÄÁš‘)ôRm[n&ëv<ƒIð¸m5ßêå¶‘_ϲ- a¼¾ÃÉGžiϳó-M| ßñ %¡K*µó'ï’ÔÉúšSgñ%å/ö)¶~ÏUã3LDèÈS“à8z[«c'?OüÑ2_ؼ·c?Ö‰8ÊÕ‹Ø¢rnÍýùA¦Ã·¾4?îDæc ûJûH£æ1,ö}À}@®cŒÌÇP"ØGO¢ÿ­€Dæ»6Ã8Á>Óqad>†ƒö’õ†`íð‘µð‰ž'¯$ç©&é\ðøz¹1‚Ë×Ëél«dþžu$°r5[Š|Åël¨ºa)uÖ*r_ϸGùÓÓ"O»¡ª^EÎÕPÛ‚ž™àaÔJÍŸW£VÒÏá֮ñþ7î©ß±¦¹Þ©ërx&ÁãfØôw¹Úç¡VJÌPÈ~æŒÔwWáæ WRÀÂÌ£ ¹àqp׳d<KV’3»{xêàú½²´2ß}d}àÁ‚`f¢* *ã]É&jò%&j¢±¨äLÔ¾ à> ×1Æ»’/1Q“wTÇ‚‰ÚµƉ˜¨™Ž ã])<Ub_X÷ÍÏeɵWmèßl -…‰{kuÈ»Êx=÷6¥'âÞžtåû76>3[’K-¹ÔSéxιmµƒO5ÕY• µ{×L™«í¾Y³Üßm>µÝ BU|.Ó–¸€’¸²i¾üîx¸=ÀÊ;l´%U`7ä¼ß¬·ÆV§£qמõ͂ǡÈ\Î;mÆðD¼S‰Âuï} ²X»bA’:ï7nï”H²b.xÜå$Ùf OD’•Á®D—÷v-ªh©ó– ïjª=Oo¨Æ—¾¸´¾@º_ü‘â$ø"pzoîaµ¿‹ã×é ·Ôt9ã×iõDŒ_‰¥²·±¿KÝuõðžmX«Œ.rÁÃ6¬õåta§ÍÑ…%6ÌŽíÝÛðÓ,\mˆ`fþp[ewÔ±ÝH7Ùn$"ö£k—3;f?m÷¹ŽýèÆÝðç-û±o3ŒÓgìÇ\ÇuìÇæ<ßY²ö¯?™ã.\Øg<« Ä&ªaó5Nœbb.xðj§aòàÃÏayµN#Mèæ›N€¯ÖéÛXÔ…ÍôWë4?ÃòjFê¨G®ÖéÛDÔEÄ ®»ZÇi Íxg ?UìIlI*A”ë˶8öðdß#XÑ圜cg‚~®-œ Ö• ®<ø’+o »Ù®¼k¸ÈuL®<¸’+–ê° WÞ¶Æé+Ÿu\éÊã1|ì³ê¯Ð Ͻe¯íP=–^]K z™'f³5:<~9÷ÙÎm£Ç°¶þÂÎm> •Ø]Ógnùhïm’Jß;¶a6–Êp|fÞ*ñ½ö7ü;¸›H§áU% 3˜ß¡–ø¯ìVÞè‡íÏ£y"ñ'ö½™í¿áÇ6 _¡ ×Ê“òÏç¼-hÁ·à·/´D3‘ýV*Ú ÞÁ0*3·`æëôrÁ£(3_+4üì (ãðÕ¡€l º6uasÃÊ8WØ@g©K7P]›ˆºˆXÁ…(÷—7+ ½oØoYRì6©ró``ZJè”rÁÃ7ßô3ü %ƒó؃ ƒó£‰M]Ø\ÁhpͶ§`p͆Ÿ(0 ƒó£‰M]D¬àJƒ ÷w"ƒ“ä_Yv"Ùæ >c$Ç[цº’›j7íãÍ\?Ó¨˜ 6Åùö¡ágW2Å艥D¿0ŶE]Ø\ÁhŠÍ~¤`ŠÍŸD^˜bÛ&¢."Vp¥)ÆûyNSÕ½?é¦XÃnÍVr"É+ÐÂÛd½'} @Wk¾iJíéØ&Á£ækç;v†ŸmÁ|­l]­€˜oׯ¢.l®`0_«tÁ|mÓ€(PÔ|»6u±‚ ÍתûÙI"ó=¶´þ†³yÑ)÷I¡ø}ãŠ+áûMNת)aÆX› *ƒçÖàª× Põº‘â =€Ïû6€û€\Ç<·¦PõÚYˆM«^÷m†qæU¯sÏ­¹Ÿà³¯‰î»#Ýw¼rþ-Ø«n8x¨@×^QîæÑ¦XB‚ZÓœo¤ºdšŽœ9Yg¦ÙµÜä:&Ó´©dš–œµjšm›~œSø9®5MwŸÒ~šiîºwÝ^v…A¸)8jÀå‚Zƒ˜¯x^• Â2Y» žÐ]À}@®c2ˆ%ƒ€@t@XDÛfxD1ë¸Ò ü}æøY!ÙAm»æºŠâK;Uk¾é‰|ebȵ†7ßõ0 RÉðš}6Š.@‚ §k¸ÈuL†BÉð‚':‚_^Ûfg@†7ë¸Òðâ}º÷i†'Øû­\ZÎïÒve"ðå D;HI¹LÞ) hÑV²+E^6pàwC–8Jöç“ Y¡aÛT¢a;EhØN-hØ}À}@®cB–T¢aÛDhØ­€"KiØsø9.E§îÓ°OC–]‹1/óXc]NÌ“¹Î~åà}édÛŒÕ)7oH!T«Ó¸bt#(TŒn¤$Žã4­=´Üä:FcuºP1º‘:ªƒVŒîÛ ãÌ+Fç:®4VsŸÊ}š± r&Î:Áqý,×näAÍzø,ÏÌŽ~S9qü!S±´Ì\ÖÚ«\P‹F–о›mM hèÊÙí»o¸ÈuLhdK´og-Õ± }wm†q"Úw¦ãJ4rÇð¢Dh$È ]?#8žYAo%²¤$_E’Xzn&Kµ¥;B÷žµ–>_u1  dé4&熘\n©0™öÜä:&K[²t0T‡YX:L¦=õŸãZK÷÷£n§Yº s|…h>& DsžiÉ[íåwCZÏF8ÙÃèá>ÎjÛôÓñ¯í'¯ß‰´å&m¹P"m¹@H[.,H[]‹º°¹‚õáB‰´å‚¦ ¤­®MD]D¬àBÖ‡ ‘¶$d*Éñ0¿‚äãaãæ•ê6Ôa“]E;Š}oªWwáw_™6êâÌWëjÒO‚ÚUÅ|¿Æ(°¥U º!,˜¯ º6€û€\Ç´ªHº´ªH4¼™ÔbUѶƩѪ"™gXU¤ƒÈigåbìj];—´ÞçK3' T.¨´ ЄºÄ ƒ½à„õm÷¹ŽÑ2@—8a H,±ËèÚ ãDœ°LÇ…–ú NØYIž[‰B‚Û¦=è8O{— j§½%|+°%¾Ð`Øߪo¸ÈuLÓÞ”øV`HЪÐioF¾ÕÜ~Žk§½=ˆouR‚‚æCâòq/Œ?Lî¹\UÏóµ“Ûî@‰;4¾°àNõm÷¹Žir»w ‰Ó´:¹ÝÈšûÀÏqí䆃¸S×_ú!¹¬›ßÈíJÁ_› JÝÓÄQwp}su-ë\.¨EO^àK/„àaAðêÛîr:øÁ ΂}À}@®c žxo Áï5Õ¡ið¤k3ŒÓäÁ“LÇ…ÁïbJ.yyot~Ô’­Ü‚Ž'Ég¸LôT.¨E°H‡>–‡ž†f}\û6€û€\Ç„`±D8ôQQ Âa×f'"f:®D°xáp×kªžqyP(w¨»jâùkL–'îŒ5>TZ~P„PT‰P!Tµ Töm÷¹ŽÑòƒ**}"„ÊV@-?„ʹü—Z~P*Oº7ë:Ë—ï ´5ó5ƒËµVe_3˜_3Â× fÁ×ìÛîr“Ué_³YƒzÁ×ìÚôãÔˆ¯™é¸ÒªÌA|M‰UIªkU’\aÉš÷¬ó&ÉŽ@ılº$yS6PÛ 3ßét.¨Å)K¨·Á•¨·Áêmp êmßpë˜pÊ–¨·Áêm+ 8eGêíÜ~ŽkqÊD½•à”¤È{2¿8K_9vçOdùÉ^áàær‚¹ Ö €°M”ئ†Ù‚_°Mû6€û€\ÇdPb› áÂV@ F¶éÜ~Žk ÂÄ6•„€v2pš ø’³ ¿Ar…:ïÛWôlðQÏI4~®÷§}.xô,„ÉË?Ç Xˆä‡ÐÅ­Ð!Vׯ¢.l®`8 ÁNÀB ·P´rÖµ‰¨‹ˆ\xâ1¬Hþ3gUèݹ°æ®LömçÈ!ÎõlRÌ[Q´ÌJ´Ì-3¤-³kcQ6W0ZQ*Ñ2CrTÁ‚–Ùµ‰¨‹ˆ\hEQCË京dÇ^vÝu=×R²œ–ì¤ù³5ž‘ÂÏþHžôY.¶®D¹¨fbcgñ“ r›5)ðu©À_¤±·¨þú6€û€\ǸMˆºTà/jKu, üum†q¢™Ž · Ñœ}ñ)i;ßøþ뻋Jp{è]Týî š¬Ð_ȵoI¡¿hK…þ"bE»(ô×·Üä:&‹·¥BѪcQè¯k3ŒúËt\iñN½‹œKØ?"ÒÿåK¢{¾‡OÕVëff^R¹ Öj0ó"”˜y‘†Ú",˜y}À}@®c²Z(1ó"hªcÁÌëÚ ãD̼LÇ•V Ç0óöµZɹ÷YE'NKÙâÊtèK b-‹ö‹;ÛPíRr‰êoëн°íqnÚ€zv®%œ|.¨E=GØÝÉ•ØÝ‰Õ$X°»û6€û€\Ç„z®ÄîNŽ9µŠzndwÏ}àç¸õàv÷Ψ'¹Çí·@ìiXÑÛ9þFê3Üú\P‹5žTÔM>–°†Ȥ°¨¨Û·Üä:&¬ñ¥ŠºÉ“ƒ¥V@±Æuç>ðs\‹5áîø¾X#a¢[Ëa([Cr „£^¿ÛZÙ†K¶†’eÆ6ÖI óeô]M…IPkú‘\FŸbé2úDR\\Fß·Üä:&Ó¥ËèStTÇâ2ú®Í0Nt}¦ãJÓOÏCx?>¿/‹L¥ÁœÄTáK0Š–@{Ï<ë*&e|m.¨ƒ²¦)&º7ÿ.Ý)Žªw eCÀ}@®c€²æß¢{#µT%º÷m†qæD÷\ÇuP«}ÓP&¡À[`÷RêVK¾ü‹¤Ü{IþÞÊâåp»n&RFgw¹ Ö®#vm töFˆÍJgÚîr“]›½‘ªƒÒÙû6Ã8-²kótvh<ÒÛ¶ë]‹ÄíS±‰_1ð« ÉMß®L’ÐÌ$©-»Äµü[ÑFpW&É!GœÕ j'v˜3)wÝA«ˆ¨\úó\ãOz6ÄD Áµ‰ ä+þöFÓï\˜ïnØôäô šÿþñ§—§;&Ó¬ ÚyåÞBƆÄ1í›§¹sNpùÍιYG È}›2ýZæ|‰¹àÀkcEh¾ÿêñ¼úÆÕxUú.îm¼!_È]i¤@ñžæ® m÷¹Ži£à ¹+TQ4w¥o3ŒS£‚‚Ü•fo!w…ïM”[÷… Ôg&¬"œ´h}Nnn3£pèYPkàQ…œˆFêˆñEš1´Üä:&…œP!æDôm†q*dàñ r"šQ¼…œˆ?ëÆöëïƒØàìUzåüáj»ŽUÉ_D5ŠÐ±PøP‹¼ÌÇñ‰ÌÕ·ÿá/£yiÑ–¾;¨«Έh…ŒˆFJÎ<´¢CÀ}@®cBÝTȈh¤ôì&ÑŒˆ¾M³)ψÈu\ˆºZ½…ŒˆÔ•ðFØø«èèVÂ9•ø$÷µ¾Éšhü‹di¹ÀÛŽ’´škˆG Ž€i.€5ÓüBÃY·–= kÛ¯„uóô&ÛØ´ñóAä‚ÇMÖúëMÖ½^ùÎ&+8ÝP\pçT»}©¤»cîfúT™›˜OÝß³àÀÓ@e°g‘šø´ þ>¶F‡êyxÛjtHðh k%Ù'ׯá,ð ý:Íïs è€î i~.ÜAÒHñ$ßAÒ·±¨ ›+èï i~.ÜAÒHU@ï éÛDÔEÄ ®»ƒt<;%KÒâ‰ìØ$Ʋâ}v-Í&9å\¹Áìí”áÄ)•Éx$x`TH¾„ )£íŽÉ°a·m,êÂæ FTH®„ ÉRv m›ˆºˆXÁ…¨`ÔÙÙM¢ý¬W?ëLû¬U×Jx^~XU¢„ä%›ô}78û–÷ÙnFÍù\*æ‚GÁÍh‡ÀÍh(€›ÑcO+ àÖµ±¨ ›+ÀÍh[7£ U`(¸um"ê"bW‚›Q'ƒ›„kéxR€ gzçm›$‡S°„ûµ¤OÕB‹™ïP )Šj!›YÙdKÊ& ÂŽ¢;9®Ù“¯©q °øÞ¾¾|½}o¾ Ù¾¿¯÷|_q-ÃËDAûªt‹073UiÖ¼{°…—ÕO ójºhÍr•æ—¿2/Ìë€pÙ„Ñ,È~âôØ{VVÛ—áI—™¯ží­G Gñ˜úå0Â[¿â*<†æ{c?3Ì{½éѳy/pAÅWÝ¿Œ´šöšß÷ªYé]3øzûúòÿ¹ ²Ö endstream endobj 1327 0 obj 8770 endobj 1331 0 obj [13 /XYZ 38.2500000 563.750000 0] endobj 1332 0 obj [13 /XYZ 32.2500000 748.250000 0] endobj 1333 0 obj [13 /XYZ 32.2500000 188 0] endobj 1334 0 obj [13 /XYZ 38.2500000 391.250000 0] endobj 1335 0 obj [13 /XYZ 32.2500000 104.750000 0] endobj 1336 0 obj [13 /XYZ 38.2500000 428 0] endobj 1337 0 obj [13 /XYZ 38.2500000 728.750000 0] endobj 1338 0 obj [13 /XYZ 38.2500000 563.750000 0] endobj 1339 0 obj [13 /XYZ 38.2500000 428 0] endobj 1340 0 obj [13 /XYZ 31.5000000 785 0] endobj 1341 0 obj [13 /XYZ 38.2500000 391.250000 0] endobj 1342 0 obj [13 /XYZ 31.5000000 354.500000 0] endobj 1343 0 obj [13 /XYZ 31.5000000 354.500000 0] endobj 1344 0 obj [13 /XYZ 31.5000000 189.500000 0] endobj 1345 0 obj [13 /XYZ 31.5000000 785 0] endobj 1346 0 obj [13 /XYZ 31.5000000 105.500000 0] endobj 1347 0 obj [13 /XYZ 31.5000000 749 0] endobj 1348 0 obj [13 /XYZ 38.2500000 728.750000 0] endobj 1349 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 706.250000 78.7500000 713 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface >> endobj 1350 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 699.500000 90 706.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction >> endobj 1351 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 692 132 698.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows >> endobj 1352 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 685.250000 81.7500000 692 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting >> endobj 1353 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 677.750000 93.7500000 684.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 1354 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 671 99 677.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 1355 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 663.500000 105.750000 670.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11 >> endobj 1356 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 656.750000 105.750000 663.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14 >> endobj 1357 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 649.250000 105.750000 656 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17 >> endobj 1358 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 642.500000 123 649.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor >> endobj 1359 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 635 104.250000 641.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 1360 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 628.250000 108 635 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments >> endobj 1361 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 620.750000 86.2500000 627.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 1362 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 614 119.250000 620.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 1363 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 606.500000 84 613.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract >> endobj 1364 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 599.750000 128.250000 606.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs >> endobj 1365 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 592.250000 152.250000 599 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen >> endobj 1366 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 585.500000 109.500000 592.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings >> endobj 1367 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 578 116.250000 584.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 1368 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 571.250000 123.750000 578 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache >> endobj 1369 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 542 100.500000 548.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android >> endobj 1370 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 534.500000 87 541.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp >> endobj 1371 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 527.750000 84 534.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D >> endobj 1372 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 520.250000 87.7500000 527 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go >> endobj 1373 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 513.500000 93.7500000 520.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile >> endobj 1374 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 506 92.2500000 512.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 1375 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 499.250000 106.500000 506 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript >> endobj 1376 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 491.750000 90 498.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua >> endobj 1377 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 485 99 491.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave >> endobj 1378 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 477.500000 93.7500000 484.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5 >> endobj 1379 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 470.750000 92.2500000 477.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php >> endobj 1380 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 463.250000 98.2500000 470 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python >> endobj 1381 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 456.500000 84 463.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R >> endobj 1382 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 449 93.7500000 455.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby >> endobj 1383 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 442.250000 96 449 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab >> endobj 1384 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 434.750000 87.7500000 441.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl >> endobj 1385 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 405.500000 129.750000 412.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Mzscheme >> endobj 1386 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 398.750000 98.2500000 405.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml >> endobj 1387 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 369.500000 102.750000 376.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending >> endobj 1388 0 obj << /Type /Annot /Subtype /Link /Rect [60 318.500000 91.5000000 325.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn2 >> endobj 1389 0 obj << /Type /Annot /Subtype /Link /Rect [60 311 100.500000 317.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn4 >> endobj 1390 0 obj << /Type /Annot /Subtype /Link /Rect [60 304.250000 98.2500000 311 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_license >> endobj 1391 0 obj << /Type /Annot /Subtype /Link /Rect [60 296.750000 103.500000 303.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn5 >> endobj 1392 0 obj << /Type /Annot /Subtype /Link /Rect [60 290 94.5000000 296.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn6 >> endobj 1393 0 obj << /Type /Annot /Subtype /Link /Rect [60 282.500000 132 289.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn7 >> endobj 1394 0 obj << /Type /Annot /Subtype /Link /Rect [60 275.750000 146.250000 282.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn8 >> endobj 1395 0 obj << /Type /Annot /Subtype /Link /Rect [60 268.250000 123.750000 275 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn9 >> endobj 1396 0 obj << /Type /Annot /Subtype /Link /Rect [60 261.500000 98.2500000 268.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_release_notes >> endobj 1397 0 obj << /Type /Annot /Subtype /Link /Rect [60 254 78.7500000 260.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn10 >> endobj 1398 0 obj << /Type /Annot /Subtype /Link /Rect [60 247.250000 90.7500000 254 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn11 >> endobj 1399 0 obj << /Type /Annot /Subtype /Link /Rect [60 239.750000 88.5000000 246.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_installation >> endobj 1400 0 obj << /Type /Annot /Subtype /Link /Rect [87 233 141 239.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_windows_installation >> endobj 1401 0 obj << /Type /Annot /Subtype /Link /Rect [87 225.500000 129 232.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_unix_installation >> endobj 1402 0 obj << /Type /Annot /Subtype /Link /Rect [87 218.750000 159.750000 225.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_osx_installation >> endobj 1403 0 obj << /Type /Annot /Subtype /Link /Rect [87 211.250000 106.500000 218 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_testing >> endobj 1404 0 obj << /Type /Annot /Subtype /Link /Rect [87 204.500000 113.250000 211.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_examples >> endobj 1330 0 obj << /Type /Page /Parent 2 0 R /Contents 1405 0 R /Resources 1407 0 R /Annots 1408 0 R /MediaBox [0 0 595 842] >> endobj 1407 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 1408 0 obj [ 1349 0 R 1350 0 R 1351 0 R 1352 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R 1358 0 R 1359 0 R 1360 0 R 1361 0 R 1362 0 R 1363 0 R 1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R 1370 0 R 1371 0 R 1372 0 R 1373 0 R 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R 1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1390 0 R 1391 0 R 1392 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R 1404 0 R ] endobj 1405 0 obj << /Length 1406 0 R /Filter /FlateDecode >> stream xœí]Kí8nÞׯ8ëºÚzK@ »nÝYhô²²z2 2ƒtf‘¿?d[¤D›–ísêÖ4’[–uHÙ&)‰üHýøO¿þÇí¿þ~ûñí×ÿ¹ýÿ}ûõ¥yu¦þwëþû!mþ5þ}sÞÜ~ûëËï·ß_~yù¥ýÿ¿¿ ?øõí_Ú¿þï&oÿÜþß_nÿöïmãc§®Ã__œpí¿ÿÝÿœhÿj¦»ö?¿üënë(Žìâ`àõBZ©ºQÜáüûËø”¢ÿïï¿ýíåÇáù71‘Fj{Zé›ZÞþ÷?_þÔ’‰7¯ÞÆÿ‘óXû–µrkÑþ™ó5¶q^“³ùZåäµ|ÅÙ|ÕE|Ûç=ó% -MÎ÷— ¸cœÕU¦ê*oú–«ìЙÿ^µQ-ùü½î Û¾9S>ÿÍ5ó›“ñ͉¦˜¾%£Ô­Iýõ9>–ú …(?ÎÇòÂÜ’QšçùXhVAâK…þq»âŸâ+• ÕGתa^>W¼8÷‹¹´Þr=v _×¼d}íLææW[X»/©ÁÏß^~üêoJÞ¾ý©]Á üú¾u#þ¡]­;sûöÇÛ?´ƒÿxûö—)^•VÝ~¦ë5Ü‘ýÕ¼ÊF i’;ª¿ã_}h¬¿Ñ5=Þšï˜þŽh^­A¿±Ã÷ê‚õ.ý#ùxò7üÍOÃØÔ«h‚¿ùy ^FÔÞH>_Èß¼|ükk]à{ûJQ EMê½ IR£C9òı½kÅzŸH¶êiK"©›N&•#GC2>3-‹¢~ĺÉ>jáN|ÔcòÅ Í,=6ú7ä¨õûö'mfq¢¤@¼Z’)P‰Z9Þšî¨AMÌ«’^€ç‘‚|o_(>Š~×äoÄ;ãjrÔ_¶SS_‘hÒb¶`ñh¡%páu1~£M-;ÐΔºd„èí€uHHmfAU>[½Qw¢5t¯Áã;ƒRÛÑLæ­s ÚwB½÷Ó™ÂüýHÛ½-ÐÜݪ]¦ÄÓÜ$º£¢hËlÖ㓹á6 …ß?¾õaù¯™ñ¿‡Êdüëh”²ïAŽ ¥M#e¥Àç ù›÷(‹ùʆõ(+…w ¢äõ ðIR£CSú+$³úš%¨ÈåØvÎW­]¿°mwñº5¾q7kû…è[Û÷eÍä"~{±úUˆ ½cH¨”AÛ}¸¶ýnðÇÚ mCû 0ˆ®$ðÁ…¦Åˆ•l¶¢ŽÐÏÝVh¥€šNÄãܧeÚ°[@¥‚Úù”sm·ÄP~Ú, ]H¨”Á( R–T Ì@dÚõñ€„‡ ®Pî hU—m˜å;5‚-~]Z¨3=Ûdlj&Yv:mX+Ë5}âÝàçcx+•"ç!zþ®;³“ÆIÒú ca0$ùÔ[¹Ëi íV%;„Ýfp?SÒõQ€„JŒvH‹’Ò fÐdv¨ëã \i‡´;´`m8Ë@Zø¿P꧆Q‡ÑYÝYk³t˜l–÷iÃîù× (÷V–ä{BÌà ¢ÛõQ€„JŒro›’ÜäËé°Üw}< á!ƒ+å>‹f|Êý‚ÜîÄxAilo›tÅúi3ÕØ´a·®øêŠ%]Án3¸Q€¸w} ¡R£®¸PÒ‡A]Ö•®$ P)ƒQW‚/éJÀžà2]éúx@ÂCêŠmpøSWªéÊO[tÅ6êÊÔ°WW¬ðPWD(é vQØÁEt¥ë£ •2ˆºb…+èŠÈÉÒ5 ]éûx@ÂCWêJ7¤ÁEip8R¾°e@²@'i!#ŠÌ¢F;õ‰øò*÷OÖ@³yߤÆr ¶I#Ó†Ýj¬ DªDÂâ¾ÕD¢ï£ •2ÕX• V!E×€ÕXEˆÄLÂCWª±Vߟ{ÒFzÉ7'••T›–”VëyšTiÃný2bM b±'Áš Ò÷Q€„JŒúeJ¨k4f¡Bú>ðÁ•úeGTˆ ¤ÜÓD# P)ƒÑNÙøÅYädê°²ü2“ðÁ•vÊMà2¶ÀZñвuR’K#îÆýV‹¼M›Ü .mØ­MÂc\(Ácö4¹Ácú> P)ƒQ›| ã<ò•u X›|„ÇÌ$ Ôu‰ÆÔ;ó:¬ V}úÒÏc©,|¹pçy¬a¥…Ôâ³€Ó¥œ¼‡è)ïKè)ï‘°kÀKÑS3 •2—,¾„žò^czªïã \¹d +ÐS8<`KG98°ûlëÍ)“I£HÛ°¸˜Y».s…ž Ó†½ëýÐ@Tûå òMu Hyú> P)ƒ¨<¡) B£0ƒ Õ÷ñ€„‡ .Tž DnÀqŽ£çÓ‹n hÊ¥ »EWBÐT%ÐTÈÔ5`Ñ•£°Ê451EW–@SAJÌ Mõ}< á!ƒ+EWáuDaWöT%`BÚ°[@5Äú]Âú\]P±>3 •2T—°>A Ì Ãúô}< á!ƒ+TOXÚÕP£öØÓ‰®™Q@Ƨ »E×BP°%P°Ô5`ѵ4“P)ƒQtm lƒd( ¾$ P)ƒQ¨C!NÚ¶â½xÀqÒ¡$²f˜ä ‘6ìÖ ' f¸B× ¼]‡p‡> P)ƒQ3\!„k:Ô³oÀšaCÔפšá „ÛŽb á’5Þò$¨ðeÙÍ[ãÓ†ËÒxl—æ¿ÞûègÎ6^tj ¬CçÐÉ:t¶Àõ9t:Êá©%í|?Õg¶Qó ÙFŸ§º?ZR•ÆÜ[ö…I¿«“æä®Mú}H¨”Aœô¥.ÅÜ¥Fn®Mú}HxÈàÂI¿KC_†ÌžÏÊWnX9sÊsÊq(2}ya3»!8«ªÀ©ôqWDr®p.Hö®î¥…8iK8„Ž)ÔC—áú> P)ƒQÑm ‡ -ru XÑmÄ!Ì$ÁUÖG÷’æý}uªZ…½n ·-•ÛùÅ]WXÝÒ96b}Ú°c÷Ô ‹™:ˆ×² î¦ÑP»$î}—’ˆWˆ{ûwIÜC@âB&îmSc“ˆ{ÂàBq7Í’MÖ›çÀf·©ã@®V×=ÔýÇž+A¥ »a>P!^‹’"H…AªLº>.%¯¨"Á´l á±"tMÃGð ®Uù@'`“YB 2¼ádÏ{BY+åÒÍ>›6ì–ò¹Øÿp­›’”k‰„PËLÊ»>.%1\©¥\ù’”+‡(—IyÛÇìS)W{Å)×svõŽÓVÕ‰çôùxܵ𡓓ªEÚ°[3æòòñ:”4à $¸VdšÑõq)‰xå¡fWÒ cc3Íh›â]ªæb7ò vr#Ó ‰eüFrÖýô̰a!Äñ¢lS;»‘Kv+Â\>^û’"àý©é÷§P–»>.%¯TgKŠàлkÀŠÐ6Å1ÚTÜÅilƒ"ø)ާpÎâ¬G>ÆÉƒ4µ…3 ijœ¤’ ÖqšëÄ^F»Øfkü|îõ`küþLÁASç2öñÚ•l v˜Þ9ÍE×Ç¥$â•…¶&˜’­ ؽtfkÚ¦8F“Úšp±«¿·5¶™2É|Àå¡k±3”‡SˆmKÒúY%cë…Ǹ>±vœ#ŸÌ¸Ùf Òtað¤a¯q³s-ÿxm ÆÍb‡í>À>õ}\J"^`ܬÐãf… 6n]S£NŒ[ÂàJã&§ŒÑwjG±©E›?ÖÁ´¦¯_!Ô9ÆÆ¿T]ã-d«pÊ26U1l­ÆË)Â' hØ­ñJCW¦¤ñØùe{çTZ5êøH"^i¨ñJ•4^IÌ@f¯FIÀ'¸VãõôeéLØ{öSiÌ-¥×8ÅBèÍãŒÛZ>«çŒÛÞÍ<5ìV„ù¯uI°¯Ëö¾.(Ë]—’ˆW *‚‘%E03™"´MqŒ2UsqÆí fÅ!眅*g9ZáÏ^êìœÛ]67ì–:¡Ö• ;–¬Ë }—’ˆWºÑ®BJRçÌ ƒntMqŒ)t#ap¥Ô¹º±°à¢æœÍ G†ñî—n— 5lÚ°[ºDjØPBjXìʰ!Cjô}\J"^A¤† %¤†õÈc}†ÔèšâS¤FÂàJéRƒLÊ–œJ|tN8#[üJ`’ 3Ã6iC'î‹B-tGÀ‰y6ˆ 4!´Œ"Õ·ª¶AD±‹ ¿½tÅÑû¨hÄË šˆ›€¿o<âÑŸqÇÑ÷ц†<þŒý Ѧò;qÿf–Éqrû‚WqÃF˜1ØOTÌØ^4§€žjDÚ°VGe@:ªš’Ž*‰ô§ßvBëú :8Ñ.e@:*}IG¥C<úÃ|à8ú>ÒÐÇ•:ªFèÈÂÁ°ŒH^åÿÔª#µJÍHëÓ†µZ¥=Ò*JZÕîO¡Ä÷{X¨]ŸAk&ñÒ#­Ò®¤UÚ"ý Dp} ihÈãJ­šNã¤Ó”78‰Y ‰a­âœd¼€/ Ái$5e·ÿæÓ T0(f )#Ò†µÅ:dP¬/× eïÝÐ t}ƒ1ш—kKÅÄ£? Ž£ï£! y\iPÜßY(v´ÁkÌ­{àÕ¢åfGãÓ†µ¢5Ÿ°;6¸’hµû~øÙ{ß®Ï :xi‘hGä¢ßkÌCg¢Õ÷ц†<®­ÀHÌd%ØÓ@ÎñakaQèæ#k¥ Çf?vŽ…WßVò½ßTƨuvÌJ̾Ié7úM\Y”¨ÅTn§?Ô½_N³ ÿåÏ$µwêÎS(Üy£žtalä“.Œ­"Åÿî”Êé>:4×ךôAÓc£w}u•ŸÆ‰ÒKzþâÄŸè5&ý}h0#z°Wà€Ó˜7–Ž~ouÓo-;2NØVOˆšƒâì5á+m¶ `,s£SX¸nÏXÏuWLcáìµ ÿ5Ž}Z˜hümHUÚX&©.H™~RF¹ªùå©i§ ޝŠÎ{óã…yÒ³œýhÝHzvt g ¤Í%}†*ùºrµÜP$Óž ù•\®Ó‹§lQ¥’IÕ,w(§¼×zÀÍ‚~ÑÁYÆŽ|a!^e°œÅÀI=vèñóŸÎ´8±Nj«º«-ذ—ùt`.J6ÇWcõÉyÅŸÞµú´Á'͉×Óð(PÆm/eC †ÃdËǦ .­‹ô3°ù•C üïtä~R¼¡Ô‡SɃS°ªkŒµr¯+¨[ƒösç¸%~Î5ýÖÌtð"S»l}â÷‚¨Zêð,îÝ/xà 냅3ìY€~äz½Øœ±Ë1ÏUP96·uq•§¹…v¸q|÷5Ê*r6”•cã;óOZlÔÉÕø„[×1 ‡À­÷“Y¹ã{Ó…5¬Rá©nXó༈«’Xþ•,rÃË97^ú^œ„6~™­M&œ³ƒ¬{jPÝø÷âÓ8z–tÍt@ '»“µ à¬é¡€Göýì¨T±Ó®}¡yò% g%q]DãñPê,göP/£À.ëTàõU#N‹µa¹¸¦h„ë„ϺˆÒ ¦}C¥ ú{T©%¼ÁjV l^_—«ê6ˆ)ay°NªßÌ)AÃJÎ£ÇÆÙÊ>«¬.g!^·öLâÙW"«\¦ƒÉa8w –uöUº“6³å¬¤ÎÒq=pãzÌñçqÒÝðÁ6©ŠÛ‚¥å8°8ä*µ´ªv!4”©^ÝôôªñLÚ,³âÜ÷ܽÇûûÔŠbд¯ëˆÒG‚:|æç,L½ Ýg¡=ªƒà öa¶’õò‹'²¹ÆO铜Ù¾¿¡Od‹âeñû‘òÕêþ5à®DexsÂçg§‘œct%åü•?}ÒÛxf`á7üØJwÂ9&ZH?Žòú*0'EÝ{ÎÞȵ]¸’¾CÚmã“6wÍ"+µþ¬vÕê±JþôYI3f‘- ‹³ŠÖÅ5~ø*—ÁBTL\9rb ÎL´…¥“1~C.Ëé#*8Iâ+)¶¨ËܦŒ¯!i³IÁ …UhwfÕ‚'u-^à0í¯ýÄ>¬Ðùëókžbª<ÀêÕ™›‡f¡ ðìÛ3-QXâ´¡@ç×Ì×E£3LEÝWÌ mÑÛnÎÙPë+R°Â‰{07”33}ZƒþØ·8=1uïÓî$‘¤5ë}»fqîÜÝT ømŸT²Œµè?âlŸg]‰ž„ª9Íúx»é: _ÇÖp8Ø#wÖW‘b»Ùä8÷Yç;ÕÅåUÕAÖ™2U+zbŽ¢[ '¼OÃÃ3< „kÝÃj9°´ï™âeg%±ê§l§=Ì•Uö—Lê<+ˆø€.õ¢`O´78mnѾñ34¼ožc©ç¼¥ºÖœtnÌi»PNndžtÛË|u“è“^ ì,G¢RN/ÇÏTIa­n«$Ü]vtEWÆñØ¥W*‡Ä÷ªóêÁÕÀ1°&ý ÏuVjéGX2nŠ‚Ð[#N¬ƒ­¬œ@ʈ÷p¢¯DG¯$޳³„és³o³CœF4p­«åtàâJñ=þðÛ6Äôw¢Åö¬wP5Ws!6AÞÙàgã)~VåÂV‘v[âÃ)³!¨®‘Ïì'ï,ý†E{ ý3®¦'IzZû\§=à:­—ö¿Ûï­,ÊÈ/÷:¬"_<é]¨×Ft±>Ñz· _åà±p…68Üä«ì3½3ØV›ß‰ÕIdžqå¸d¾P|Ô½9©4¶¯ñI3Ô\ÔxÚ”j<Ó×RJµ¼3­ÐÞÂcšù›hìĦGw³Ør®û»ñ}Q£Ÿ €C’^ˆíz|×øW1ÈBúm6Ej*Û//ÿꤤ endstream endobj 1406 0 obj 7834 endobj 1411 0 obj [14 /XYZ 31.5000000 708.500000 0] endobj 1412 0 obj [14 /XYZ 31.5000000 539 0] endobj 1413 0 obj [14 /XYZ 31.5000000 240.500000 0] endobj 1414 0 obj [14 /XYZ 38.2500000 79.2500000 0] endobj 1415 0 obj [14 /XYZ 31.5000000 455.750000 0] endobj 1416 0 obj [14 /XYZ 31.5000000 198.500000 0] endobj 1417 0 obj [14 /XYZ 32.2500000 707.750000 0] endobj 1418 0 obj [14 /XYZ 31.5000000 413.750000 0] endobj 1419 0 obj [14 /XYZ 32.2500000 538.250000 0] endobj 1420 0 obj [14 /XYZ 31.5000000 149 0] endobj 1421 0 obj [14 /XYZ 32.2500000 454.250000 0] endobj 1422 0 obj [14 /XYZ 31.5000000 371.750000 0] endobj 1423 0 obj [14 /XYZ 32.2500000 412.250000 0] endobj 1424 0 obj [14 /XYZ 31.5000000 100.250000 0] endobj 1425 0 obj [14 /XYZ 32.2500000 370.250000 0] endobj 1426 0 obj [14 /XYZ 32.2500000 239 0] endobj 1427 0 obj [14 /XYZ 38.2500000 79.2500000 0] endobj 1428 0 obj [14 /XYZ 32.2500000 770 0] endobj 1429 0 obj [14 /XYZ 32.2500000 197 0] endobj 1430 0 obj [14 /XYZ 32.2500000 98.7500000 0] endobj 1431 0 obj [14 /XYZ 32.2500000 148.250000 0] endobj 1432 0 obj [14 /XYZ 31.5000000 770.750000 0] endobj 1433 0 obj << /Type /Annot /Subtype /Link /Rect [222.750000 329.750000 258.750000 336.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_release_notes >> endobj 1434 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 57.5000000 158.250000 64.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows >> endobj 1435 0 obj << /Type /Annot /Subtype /Link /Rect [76.5000000 736.250000 155.250000 743 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/legal.html) >> >> endobj 1436 0 obj << /Type /Annot /Subtype /Link /Rect [56.2500000 661.250000 124.500000 668 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org) >> >> endobj 1437 0 obj << /Type /Annot /Subtype /Link /Rect [56.2500000 607.250000 160.500000 614 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 1438 0 obj << /Type /Annot /Subtype /Link /Rect [56.2500000 554 120.750000 560.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/svn.html) >> >> endobj 1439 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 163.250000 550.500000 177.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/donate.html) >> >> endobj 1440 0 obj << /Type /Annot /Subtype /Link /Rect [96.7500000 114.500000 154.500000 121.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 1441 0 obj << /Type /Annot /Subtype /Link /Rect [213 114.500000 260.250000 121.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/bugs.html) >> >> endobj 1409 0 obj << /Type /Page /Parent 2 0 R /Contents 1442 0 R /Resources 1444 0 R /Annots 1445 0 R /MediaBox [0 0 595 842] >> endobj 1444 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 1445 0 obj [ 1433 0 R 1434 0 R 1435 0 R 1436 0 R 1437 0 R 1438 0 R 1439 0 R 1440 0 R 1441 0 R ] endobj 1442 0 obj << /Length 1443 0 R /Filter /FlateDecode >> stream xœí]ËŽäHr¼×WäYÀÖ0‚o@ÐSÝ%@n@‡…¬VÂbg¡ÖôûÊ3«H¦E2¬Ì#ÈìœÁn×T4ÉxxøÓÜý—þö»ÿúûî——oÿ³ûmøóåÛSñÜÖÅéŸÝáß?¼ÿ…ŸwmWï~ûýéÇîÇÓ×§¯ûÿÿñtzàÛË¿îú¿ßýËþÙýñß÷¿üÓð—á÷§Öµû?ÿzü³oÝþ§âòçá÷ÿýôoÿ°ûÛáçÏ “ÿ÷\Y÷Õa7¾üãé¼Jwü÷ï¿ýíé—Óú£>â[×u;W•ÕÎõ•ßýï>ýyÿúóË‹ç®þ?sŸîöŸöM±ÿ´Ûÿ˜ö»•oßÝ×EßÁŸ¹ï¶þðáÎïœï‹]Ýξ|üWñn'u]vV¯>ÎZ¼®l\èÕ¶gÜøÚìŒ/ïÖDÓ9³WfmsÆðÕ¶g¼ß-³3¾¼[¯¬^}œµÍÃW›Êˆ®írȦÎ.Ëw½+³|·<Ü`ðݾr®mª¶ø€Šs Î®êÙØ×jÊ{·üRuu×X½ú8kñvœî+~µ)5-¦#ËïîE–ïö. ꋪŸ|÷kÄ0™~ìýþôËë~NÍîûŸ÷twúÞñï¿?UûÿØÛE¹ûþ§Ý?îgSÿÓîû_žÊçºjºƒxøk§‘ö8Ò=w}±×*Þ¼Gªçª<™—÷=SVhĽÀg|ü Š Ž4Äzà ^ ÌZz ÅëqĹóëìûtyÛ|7ù…Ãû‡Ï‰™}7ýp']ÆÈàD¼õs¹W:Æ#¨Üg¸ ¼ÀÓκâ¹iÝÒãž)Ï“[²ùÄ%Áw‡" |MO³þò}ÏFmX`ÙUcè:tûÛ)oG€1Ÿa6wzƒ0%øÈ*J`h1À.1Sœ±øáï9(/‚òì]±‰yÀq¨ðBdVÒ°J¼-"¾X¾ƒRª2~J¥kc ‚Ÿ[UËèŒ5ŸŸA™\Js÷^éê¾Z#š@P`8ƒòó íöxRïÂÍ”nÙºågè|7>DJ¯%˜mõn$i<‚{ÌHÀ€›ùA b€æñ‡ +odþ;Œ÷€!MŠfpá§»åæwëpE7¤9bžw¿?•eÿþ}ú–÷|˜Â˜÷Ê‚w7¸}}¡¡TÁœM«í&£ÒŘ€Ò7’ÒÆrÄPÿ„S Ï‘q<‰ ˜›RˆgbpN‰| jjF€­Ù¸š-6 û¸±¨ZAØB›m¤50G¥eØ”MÀÜ™)a8}6ìà41È`œ]ÚL<. +m[édN0À90š1’8UÈ DMìl¼wÜ2$uK¼“šSzì-‘Sq]°»‚Á¹x¬øâã–"mRáƒc2²%ëlT)_ž¡—*µUŒ>Ï¿ÅÛ ~4=¼kLÔ3“å"—3Š />¼|Å7‘!¸¶šÕÚd—šÈ2_Öh„ùN~³š‰RžÓEb2ʨ”ð­ŒÉ²Ø€´m‡¯Ç‡ž(‹«ríù‹D×°ÉâjúôWgdἫiÍsµÎ9HW²¸ð ˜l±>vT5þ̤ 7Êšñ1¬Žkq,øÌ`fABÆKÄÙ¶‰s Ì€ñ0êr*¯-THçFå]K¯ÚM§½)`ËU®Ìµ­̵¾`?"ïŸObk¾½q#%©àHMŒ4Ò‘ŽtÄÛz8ò‰˜Á¯päåÆwn£“öÄp … 8É×Ýû_ä'„Ý^,FøGDÌ"  .Ø6ˆÿÈ3ŒÒrÄB&"úz§–ä6sÞÖÀ2ðdG)¡èQI¶1É/ãáÆÊ›EŒ¥‰Ûwc1—¬ÞÁã—€–km€TœŽ±Äh{`ß²çZ2x Àw¦¼‚ág•EZ#K¬~¤ãr'˜òqŠˆ¶Òìr %-X¯%ÖÆUcÙÁDóÅÙœÙkÖå¿AZìå?õ:åZ3XI¢,ž¦8ûŽª¡p\Tõv¬ÝE$ª$ª ¸ ’Ä„ååý`ãÙLfþ)ö7U®Ú‰Ú|MœÓkm¥iýóLÁD+5…[_TÉl‘oȸˆÁ–k¶нºhÇrϤ@Þ€PSwçé<B÷ŠÛÑÏpä ±ÒWb¥ %âYO*‡ƒbMÝ_2öëêý/òÅZwn3,}þ¡hôm„AÜ@C’y83Ñ"tØ¥ö#ñÛTÅ6 ìSC4UâaDš¾˽0b<Þr:§ºODÔdNŸ2X{?j÷Þ£h…pI2‚pµìH±³2ಓÖÀWD`œý‰³Öå+×—aKUøfÚˆI5‡7#øÂ,Ò’*°ÒV 7Òâ¤ÉP'D³³@ yÓ˜¹˜¤Õˆ„·ÛFÕEg0Ï­Â<³kæ|xš¨±)Ñ¥N`ESòÕºÿ’µ¬&z«¸Y Éü"Kéî,%JHJ²Zl¡4bØ0L–ø¢MŒ$îÑP=oܸ+Üø‚\‰¼9Çs0Žç`ÜØÁ¸±Ã±L}t0jÁKÿt8n c³•âïà¹áï4cU#í I¬º÷¿°ŒŒ†ëItotˆzCM·¨zƒFô®žUçx¦F¢*@ÀЏÒDà™Ó}nŸûnº_Ù«FÀÑÃ>åJ¥´%ìnÁp®XTl•Š¬Ú¦”j‹Îá|Räóõl¤c÷(þ0Q®“ùŽÖ÷˜ƒÁצuÃá ¥ø™3 ¬œº=ðHªìŸ@@’)…¦¨ ¼µŸºjÇÒìþ9±Œ¯j¢¢²ÖÁDbJŒÛ]œ šÊ³l’ `ŽÙ¡ôT„˜¥…2m+>€ï p”˜DAÆLwê^ÞŒ)gá‚þT¸àM0᪣sÁ8= —ðj’€¯­nU@–h„ ÎÎk!? ª\ê¢56Å´ËÐv]5¢à­ì=Me §ðP;îWíˆvZÖ¤ñ)<‰Š_n³uŠ42àØRE‡)®C!²s%Ì@§ŒWHš¦m|Š #"-œB»be·‘’ú(,0Võ–Ù7­Ë”A¾0:ðµù4!3*¯ˆY 3‰n[c(j›ÞEmþª?#ÏË^yÇA$—@œik Ó½`·¤ËÃùðÎÔx\R‰Ág+NÚg*5I+Sæô(;×ú‰› «x Ö ’u›Ïž`Ðx®hïÑ«ýíÛÅÀÀ ;Z ¬WÔ1À#3ã•1Ïü¯ñæY@—€póe"Äd  ˜W+Ôúšó Už£DD(aLQiJò™²D7æ‰wç¥[sqŒMµ¨O7\Þ‡©{­0GdñRpi)µyh;ÛºÁ0Å+b—˜®•Ù´³zdÍöÞÂóh(N»!R{§ÐÀo}~gÝÃõlíž´Hç÷Ô¬ è¢­R%é"Ÿ¿o­8û¢µ–6ƒ?«u7)]œµ1©<Ät/ûD•œc WÒRTb"¢ºÍ,±DÕÛºýRÏ·í´²+sM(&ÞK´ˆ¢ÄIöÐýV€Ì–G¹jZ…¦µ+ј‡©ÍXüšZ<#íNÞ†† w¢/‹¶Â˜¶ŠW‚<ãÒe—ØóÌà>˜ zi6ütú({#U? û!³4¥é‰ØŽ$T-I0 0¼9 ÿd ÙÒR€" ߀ˆº’ §´¶$6¥¦*–Qƒ`C1£9É~"Ĉ°¼¤R£€|¤È3Õ2«â ë”émÁ°±ƒÏMš A¹26½¥`,åÅ•:£+†'sAùs‡Jìm¡Ôx¦ ª­«‹Ò«n×È'ú!3fbV¼uWOh%Üz›…Å}Þ%ØmžO„ó.—?[Üèû^;ÏiCxRÍ_JÄ8S„ðÔ2·†ãÆXÊ·ü–©¶Ç~Ûï$Ôݧ¬‘Žg/ITB€1ĵ“T‚V›Aao”ÖP•ú}¹C5DzÔå iïDÖô$²Ì*\€Që —Ú6òœó)¼Õa‹øX‰‰œ¯¹2¢Â=h]šÈÂb"‚â{/ª<Ûû «Kyñˆ S®‰A`‰ ˆî*qnR™ŒðÚDü™|`q#Z-gÇ,*cµßt“ë˜H¿¤ê¿ñp*‚- ø*"Æ£2zޱ”¤*m¤²ä7i½˜@øÌmÈ*pŒ !À+u°ˆ¬vPuošÃ¬pÈòdÛÀ7—šmSM¤¦¶¿€¤@bà›ŠÀ$JO+ÖÁ;‚].»¢¿Ô§bº\6ðØår7®›w”|9K¢Y`괷׺Pz4‡Ÿ](ýéš8¿äý°c%~ÿ9ùèÊœàlñNÞÖ¢¹ºÂõ TÔ4°žÓî{‡îcÔ):—â·5ª[v’¸²=ï-ÓQ”àuT.Ñr( DN¤×Gx1¨´7¦†¢âͪ…îϋآ<ñ&åYÄeïò'ÛJ-bª M¥üÚ–Êël:êú±À;pfèlV27Vzùò'–ï’XôjE=Œ§¹’‚µu+a˜T—”DJ.U§Q?•ª­Åj»”o+á;ÁǤÍ7Óq-QÙ*‰ŸØ8ñ[RRcÍÚóÏS‘AŲƵ%;$|M[–çŸöî°ºGXOÆ… ©º9Z]‚)‹Ho‹”fÍXÄóå12#[ÜBŠCì+J?Súmv›*a#YÃ=졇åçô­“3>”{OŸÛÀZS~.ú+põ¤¥Ý>Rj#¸™¦ï'â4{›Hqÿ³M¹U²[”ÈÞI“hG]¶éÃiHÁ³–PLpoÅ´¹€ j‡৉ph¾8#.)ZŸh#?àƒÚùe‡¸*?0ˆ9vÁUáïÞ±K%Þ7ŒÃø­/ÄÜ ~¯xEs `±à ³†h0Œ Ô"âðJ¸·ý-¯úó,·”#V2SE6©•ªoÓšA_’:‡˜¥M÷4­©”¾_ MΩwÏ`ã bpILCûÙQ2H&Co$‘°DY…ÏÌ}U×NdÕ¦bC’Ðc~ÐvDÓ m1F:c)3íÍGÕ¾Ñ.c…ˆ.IcàM½D¦ fF2Z<¡±”˜uÁ‘jp9TÏ~±ÐüÖ©ÖMäÝØìÙϙjÖ=ìa(ÉÞ£¹xT¢èUª0à`ðۻÚ.·ºS|ÎøRX¸ ,dU;>Ã{ƒÞyÝj{S±}‰}oë$x”Ë™• I…"`Ò$iÊ’”º_µ–ùFfì…ÞLe¤u߈ÞÇØÈ R+oú«Eœ•Ò1p^°6!‡¹ö ˆ“Ø–c§7ß«3?xSZÜYS PÛÎ/ÑuÅd½õíaXÚ‚ÅàC}tO ˜fŽ]£À0‚¯tgì7…à#ê…ùÓ®\Aða¤Ó@ ×ðsÁ¨¿¢ bá¸6¦f\O]ñfC¸#;FÔÁs5ü~¦#ø8·¡ý“¹‹¯lÜMk…ˆ·d †Ì3LPDH‹0îbTcÿ*ãVת±‰ü*oÅ•ÍcÔ‰»•™cvß’8ηÁbd–ÅÚŠf"³î±á)5‚˜Ðy¸`ô¦ª¹cƒÓŠ Šˆ:I漘’–‰J¥ÍÔ+m(itÃäÑB…Xæ®ÌdÛ%5´¯:c´ÛF÷Œ#&1P¯TŶ†(\;–§L°)_R²12Œ¸Ý*qðñÏŠøG“íÙºìÝcÝmò z#.áÜqá¡Áì'‚/‡ú1ÅfÄ^8°9–R³íÆ”‘L¹dœ LS‚™'2Oò€Q‰ ¢$€ÒXˆs¢^ o×ú¸BŒQÖVì,¤ZcàÍ—â81º–IGÁøBvë“Xbãêr,çˆ4ÆÁ#­¹…üq#é·­jkã>œ…é…©âù6ã©ìe&Ú˜ }¨ˆ.U.‘ˆŒÖ-°»¥ýèÚv±`Mõ~ø >È€ÒÞÍÖ÷·gyS D/l«à:äÚ~8¸“ŠÖ©ÂTãxÜÆäýÑë`†¬£Ð@=¬ƒÅX”h’¤¯K²2ÊÞ–ÖÞY³Å¥­LDQä¢ö¨ï/‘]¢ÓoÝ>Ó8µ›Ü>ܬ½ Ñe.Üé´?n¾?‡eú®*ŠçÃáïöënë÷¿øëÓ7« Þh¼ÁD©JËè–îÍx+~j\5ÝÌÛm„Âa £]Ó¥…Uت<ßT"ÅÝx"œÔ1RtÍùÚ?[Âäµ=p#z‡I܇w–ùB™Òæ*÷éϲ̬põDˆ=LóõŒ!Ú¶e©n?ac¸ ֦˙;ù ÏöÍÀÁl–²„ª^Vâ4ë’¨ *N^1d†P¿S¤@”SÁ7ø<Õ Ê;*´JøÚs77Pe1 [(åUÜ‚ÍñӘʊ/ÖmïWªËÛlš€‘fOÕ$@L\õ¡n¨ÕxãÃÀ}Ý)œjøBðò˜zuLÈhyå`&è—,:Ïܦb#“Ia†*ÔI©â3Ç)Aþê ÁÏxìƒoÃ#xUO2w‰Éq/G”'ôªü Å)ì‰$n SS$Ô ô Ÿa(¿ªá¬oi7†b´íú±¥*yKÃlhÚ ‰K.?v&™'Xª'B®ÐêŒÝ0ôÀ4q§±hó* Í•jdÁ AlŠæ¾H"a‡²9ðw¢»[ºs}í&N¾'É.fLÊ™'Qœ>¤5Ûx—¢½Ó¬õ~ò¡Y3ú€F¥°Ü˜Ò¤íšê ÕmºÊHW?F›j_Ÿ·ìÓ ª§=š_F.qm¤‚#qpÄÑ޼À‘Ïp¯ô ±<ëW4âñÛàŽz¸oÏ¿ î¨gž©‰gâmuº+S]´x:-±ñ¼€pÄÁ­ÂßÁo+àu.ð•!f€ÙF¯œµ‡—ÖC–˜±×…tß»SÀ‹îñ^cI¬S|‘ðj6—ø >z¼8|ôxq·d£¹‚Ù¸s#•@Nš•1¨'q˜¹D-ý6Ž€ØâGãžÕ&mÒó”ßa› –ÄØôŒ//Q§0êäÒ‘,ÅNïÇr'oDH©¯- ”Ýýþhd82E¼Lm¿ˆl{¨\Ÿ×¡<+Œ§kNð&ñØ”30o£Ù4j£‰Ÿ-$Ï÷aÞF³xEoÃÍÏx8‚_·áõ ¾ëk/aKLÜ(2°žÞ\)=úBZwn’LOúŒ8äàx»2‚›ø-äXJ`.Ð<#@ùZt$g¤ÚPlòÀVÇU¼ž¡wíµàeÈ™8Ÿ€ÒY‡öä’¡¼>Ð(‹Aij x†V@±,†Ðuc¹–ß.ߦ RÜd³cÆ$©¤-Å1R<¢m.áòˆ©k!)­-­¶è,Å(1Æé'’3VôKŒ(g)nr½å*Œ"ŠYMID —NÛOkÚ’†‹ê¸aQê2N&ƒ·d[nbðÓ1C{×R¹eVjÁØÃ‡gü€¸Ê1)€öÕ|·e’·­]'é hF†S¢rµÉÜÖéß Ã#P þœÙãß+ˆd~ÏÀ&± “Y¶¢­©²m{3ÙÀ3Á¡Íá™y¨ö’4¿Z8€y:†káÐÎJS…C;_&¾æ›ª5йðÆ5ˆ·Q}™–uRô[åãe{ŒãPê¨ø@GÛ¸ÈRþƳ‰0õâÚ'wÚ6Y ’1)ݽœÞÚOE mP(ÀHZdÎî>ZCPf.\FL×3&F“ñI—™TµãÖŒ*`Âä¾ ¦5…¶5ÄÅÎiÂ˦ZX1jhL8)A\´hÇb“Òöˆä *IÓm¢¬¾ü¼˜ÀA*^ž*§† rJŲµÇZ¢².'*¼¨eFê– ®ôýDý%ô$|-¯‚ ´?l€y\ða½Õ¹¦+ûòýoìÚƒÎÆÊßÞ‚µp“Ûº_ÔaMåe;‹Ñ/r4=La¼Ñ‰êwÆT!d2p¥ š–±ëXŒLÂg‹G¤JÁ RÚ¥–Q…^ådÕFGg.vh3N¾¨eh­«Æ\8¦T*á$ã€ñ¥& )•2>­‡ñÎ}Lp`…,*ÍX,¹òF~â6 Ë4$¢2§²%s)‚/œº¹<íO夙ù½Ñ0{üîXƒ¸–0©ŸÌ(ÓrV­ÎÇD¶´4Fç[KDЦ×\’Ðpq X®`¨£}Å?Vh$P?Šðà g@Ó~eloÎþÐ]¹˜X6YÉäQÃJ$®‡‘1$hr©í…Óòô €’‡5Ð¥5àÌ•ùÐýù‹Ò̇ÀÛ`æÃÐ ãZ‘ºAb̳<.‡3,ˆ<Š¡!I\Á9øü}}î‚%k@F%Âûâ Cñr‰P‘˜Hy•Ɔ=“X‚3Ù¶µ{WSÊïâÕ6¶$Ö#ié—_ŸÒ nœJ!ìrfÀd½šqUY¸Ä,3,êr,·|L5tæRGˆ™MvIÏÆ6ÚÉ‘°è(éÏ #"G©¼Ú®’ì¹™ÌUˆ©‚¡íGÎîÖ‹/‰¢y#]»ÉEMÓ'¦2QÜ«„qbI쩈„ªŠ¹Í8WD¦€´(•hÉxâ©BÉÊšÒÍj·n:gß•i&‚KµâJô m`yZ’š‡ sfê ZíM Oä©qqe1¼NÊ|©®L8¯‡¨þs—òÀZPæ"‘ÿOÙ€©ŠáâP=1kmÚ,å|_®VSè&¬ÉYaÔjûëP*ÿò†Ï àœ®ðc)Ié>Ÿs_c -#ž¶¯Í‹™»”ˆF7):] ŒµÉv,,Mu_T“ë¢J þ ß› ÜÒ ¦IŸKa\™NRöð™Îà·áÀ•Ò± E¸þjûÙæHÝ´™`ñ<›e;Hu?›%|æLš· Ttå™á¶¹ý¶ûIBx ¿S\¸ÔD¼ŸÎGŠ_шwç3’$fÔ³jÖð;M6ÏåQ»BÇWžià ð~ž\)ÞkÝ­ºö{·¿ÃéºOkìdñiV·ÖÎ÷kTÄ“MŒ»,ÈAï«1…ŒÆýÍhºõ,FÊTØe M|x8“Ñ´uÕ¼ÿEuÕLè„qU¯²Æ[ÙN¯fˆHXÁ~™ˆŒÒ-Eµ(?†í!ˆ«ßY“§d‡|ÂÆ$¥âøXðHöªâH¾ìS7a€/!3I¥Ì›.kKP71€Ä}cîž30vˆB•ØhsFø€Q Ö´Äm“r©ò´ÚŽFZÙ¸BÈ¿$+„ñ˜0%’ˆ2f (‰‰È˜•…Øÿ»û±œA¹úõÖ_X x»«6é^Í(ÜAÂ8ï×zíìNkm¯ìéi­þùä Ÿ¯µ™ éúþJ‘[)î3úNyëT¯ÍíuX)ª3„y{5%NœÕp-ãáëÛJì•e8ü6øÌpq\ÔÒÛ7²e îðó~Æç™cÖÚÃýt"’Æ3põ rí$¦¤F‘Mwý%:ŶèžO•…Çéß}ô&3ûºûúôÿo¶ú endstream endobj 1443 0 obj 8002 endobj 1447 0 obj [15 /XYZ 38.2500000 771.500000 0] endobj 1448 0 obj [15 /XYZ 38.2500000 771.500000 0] endobj 1449 0 obj [15 /XYZ 38.2500000 441.500000 0] endobj 1450 0 obj [15 /XYZ 38.2500000 177.500000 0] endobj 1451 0 obj [15 /XYZ 38.2500000 356.750000 0] endobj 1452 0 obj [15 /XYZ 38.2500000 441.500000 0] endobj 1453 0 obj [15 /XYZ 38.2500000 177.500000 0] endobj 1454 0 obj [15 /XYZ 38.2500000 356.750000 0] endobj 1455 0 obj [15 /XYZ 31.5000000 120.500000 0] endobj 1456 0 obj [15 /XYZ 31.5000000 120.500000 0] endobj 1457 0 obj << /Type /Annot /Subtype /Link /Rect [173.250000 482 216.750000 488.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 1458 0 obj << /Type /Annot /Subtype /Link /Rect [60 84.5000000 100.500000 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn2 >> endobj 1459 0 obj << /Type /Annot /Subtype /Link /Rect [60 77 104.250000 83.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn3 >> endobj 1460 0 obj << /Type /Annot /Subtype /Link /Rect [60 70.2500000 106.500000 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_target_languages >> endobj 1461 0 obj << /Type /Annot /Subtype /Link /Rect [87 62.7500000 132 69.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_supported_status >> endobj 1462 0 obj << /Type /Annot /Subtype /Link /Rect [64.5000000 741.500000 102.750000 748.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://swig.org/svn.html) >> >> endobj 1463 0 obj << /Type /Annot /Subtype /Link /Rect [81.7500000 728.750000 111 735.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/make/) >> >> endobj 1464 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 715.250000 60 722 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.pcre.org/) >> >> endobj 1465 0 obj << /Type /Annot /Subtype /Link /Rect [96.7500000 448.250000 152.250000 455 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/svn.html) >> >> endobj 1466 0 obj << /Type /Annot /Subtype /Link /Rect [315 377 420 383.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.apple.com/library/mac/documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html#//apple_ref/doc/uid/TP40002850-BCIHJBBF) >> >> endobj 1446 0 obj << /Type /Page /Parent 2 0 R /Contents 1467 0 R /Resources 1469 0 R /Annots 1470 0 R /MediaBox [0 0 595 842] >> endobj 1469 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 1470 0 obj [ 1457 0 R 1458 0 R 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R 1465 0 R 1466 0 R ] endobj 1467 0 obj << /Length 1468 0 R /Filter /FlateDecode >> stream xœí}[¯ã8võ»…Ÿ·¨»€ @×-@ª< òÔdÒt Ò™‡üýH–ìcI^”¸¼HJ>þ_ªdQ¹¹ï{íŸÿåÛÿûÇŸ?~ûŸã÷áßßÉ©*’þÿ»ÿýéöBZŸ†ÿ>VuqüþãðÇñÃ×Ã×öÿþqèøöñßÚÿú¿czü×öÿÿíøçÿh/þeøQ÷ƒ‡ÊTí¿¿Ÿÿm*ÓþWrý·»þÛáß:þ½ñòºa2ã¿ÿdò¢<ÏbáÍ._iÎÿûÇ÷¿~î¿ßé%ic²ähò,?š&Oÿû_‡¿¶Ã_ONu™Vy‘45üoîÕUÚ¾;OÊ£I›v©ŠÙ›ÏÿSŒmäC··| }žµx9LVÛÐ~÷¸(2o{|[¿e^y#ŸnÖ~öíw«¬è«¨ä«u[¿Uc¼ ÝÍZ¼Ãá}îq–dyíioÆVoD–äIîkèó¬}ì±eh¿{\Ô¥·=¾Ž­ßˆ²U\< }žµŸ=†C·™¦Lª:‡ÿͽ¸nßZ׺gêã]/È{ç{äù½&Ò{;r ¸È&O‹ù{¿:ŒÀαµ3UÒ[S%=æÇ¹¹òÈÁéÖµédàu}ä<æi>9üÊ%o+—+g’óÄÒãÍ,ÓÖœü¶‹Í2Ù™Ïxجéț٬vbÍñf–Ín6ËÇɺC›Ø©æü¹Y»QÍ0Ã]ìÒ}Fõ짪—kývõøß1¼¦oÞñËÙ¶ù¿4GSýk+¡ûÕ;ÿóëCÞþ‘6íbýËñŸÚµMÿùøëßõ©n’2-ÎkÝß1¿ôw®ðO“lòS“ÀŸæç;ù)Ïz×èÛ3pø ŽfêóìTäe]ÞGË34ƒä#¼SO>0íjÌåÍo?-ДL ?ã|±b{¨/†Ÿ‘TëÉn&“ÃáñZàg´ˆGƒd6îßü'ÁÔ•¹¿‡9XæÃjŠ´ §„7oåçó┥µY»øS*fÖ¿83ÓC‚?\‹´±I/·|"ü †θ(uððxŸúÑ>ÿÚ*~Äj‘Ö¹ê° ø[×s,=èËÕn€N×/égo² ?ôbËR;lm UŸnù ­hfœÊÊŒ9Eÿ¥¦8%M6~Ï/p´ói%Çl+1wÁBoQi ÕÙòXBÁ­dRÖÖœª²¦;b‰áp^1åã%fFèU¥Æ»5­ ËQË·ÁyZtLôX#ÅŠµtG,üÎz.–±B°{lËRÚ ^üõ*ãÀ¶ÔYMs:ÓòL›õ•6¹H¶žçÍ®8¥SvˆŸæï6~¦AÏdÅE#èÅñLôtçf"òÞh©û ðh–4pÝú3Pž²³¨˜Ÿ¨{Ï”pø Ï~éE¹ó¥‰o.ÛûÓ4ó#¼=[yXt®WÙ,œ»¬ðüT¶h ‰55‹ëà`Ñ®Òzuϲ¥RÝ4­ 5 ÏÞÙ¢„RBYÀOoýñj¨O!S¤c)Ãpc‹/¡”·3±“P‡Zâ´8ˆ`ÜÀKØM@‹&7 rÐ6Õ„ëAé镹ù&Ý»ÓÀ;¿ ;ƒ1zï~OŸÉˆg>¹?3ìã½;Ÿáø¥–÷àuûì›CU¥“ãøÂžJ Àn´™=XR`ƤÚX¤³oÓ½UbÄ'Ëc©Q|¶oœ'á eyQ2KZ|Øpi}|Š:Ëx²3+Š1³µ¶&ŽÍA[ÌgðraÎ@åÀ8$ß0²"èI™8!d{23Z ù# ˜`ÎK¥{ôv'„Jåé8»îüû"óla Œ3À§î8¶gÆyþ·4³Q³îËŒƒâQ¿lÐÃE´Gù*9¤ÞB ³/ŧ¿grtú2ój¼[ïüœî|üqH“äöÂ(ûxF¤~¨»›Â˜¼ñ¢a'Þê¥E‹©Ãx;Èž¶ªÉ&[=ÝÆbe)Þ.þiF’E$\U_4ÑnÔØ·8ö{)§òÁXÃ&E ÉÓñ–áSAZ¿„Ùïœi²^úeAgƒ‚§ûÌî+›«äIÍí…(’'5“¥÷ÏAÓbòÊçtV‰RŽÞ±O)”h½•I¡y_/­2sUÿ¡é™|‚¬/Cw{™7圙«R\ç·ÇàLí F ³äNE¶¹–¥=}ª8 —7]| Ä2“º&*Ÿ§Û<Ÿ‰ÄÊx÷ß’Jê«R•ú2,dÍdµ­/¤¦Ò™Ì1,˜E Gyö >3žà––0 Q§½Ac[+‹-ÂrZÜË”14«-þ_Œ¾xÍ7™ª»ÊÁáXEE8üzÀ¹7ñéL8°pVIÄVjí[Î%‘KÅωœ\—‚­Gp}ª‘q径ÿcZ(^s‡Â6xž1Á¤ ‡ÈÝ…Îø4/Çb“±è³ÐBј_JK$ˆ*3½€Jißlæ¨÷È]–¥Ë •ƒ¢ƒ©ŠZ”2½$Ç»3å ŒBm˜”Éj*‹TCÑd±Lb¬?‹8vð~3 ‰Ø¡Ì¸8‰@Ìì󬍯¬+¶È@/mÒA¥ oá3Ù.¸PÉ„©ÊMk^ÀïÁŽ˜]iq»G·ðã¯5~OÁ ðþdØ)„óߘýqp¢2Ê` 'êÏ>KµŒ KIÜól´ÞN f Ô@ KôÌ3Yx¹òrøôÄ_ó5X)ŒOltTƒ :B)ë”É'©îs°‹ðwa³+÷-Za.ûBøµIœ–Õ` ƒg¼*”«î…ëÄè£Á Yàh–ÈaÈ À UŽ“Õåe? ½øl‰|¯lÿMfûKú‘XhHŠï$ÁŸ·@À2yÃQ,F–P$ÊKy|.Ãb² tUç2¬ŽøUa¬”:½öŽ e¥<;cÜj˜Ê¥ ÷‹)6’6Ô®¨Öᯞ‹‰}û…Ñ¥ÔKež‰O—zæÔ¤ ô%¿Ò²0Ÿáܾù›dPÕçÛ͸(™Òl­³gÆ ˆ<Êi!µ¹,që?jºƒ1l¥„§NJg=?ÜŒÏOÊo‚õÄ UŸÊ‹JdèR3¦0z%>¥õb3Œ ᵪ5­ÆÂ—!F-nwüHÿKO“b,¢yUÅe¤ÑÚàj™’,ˆPùÊœëéÚÔJrË´ðüOŸ¾Éœ€øzÓîÙ¡~Î¥Y‚6³d‰‚;›ñ[ú®®ÍXŒ>›C4vmc.Íãëë’^ Ú:±§-,‡ÖbpȽÝ2K•®0N"qö ›^–3¡0a‚eï;ôW ´·O"ï˜â¦ ¼PDã»uB¨ ™ø–Ñ&Ά­ÍÅeBÎøèq¶xùzZ'´¤ *P‚å.Ò–ß1|A eñzc…„ñ2¹6L¼šQ|åHÇMþ´àBMíÏ=¹¡©Ì]m"£ƒ’Ê, Á A0¤Î:)GMD’ 3“¶¦i‰ùËkÚ’ÏP<=>Њÿ¤ƒo.»täÈS¸~$3>IjC›šz.Âï¡íû*Ù4ÊÛ´%ÂPCÞ:ãNõ‚“ÂÄAŸ´{Ø™öo‰ÛŒˆ»¿²êT‡Ò»ºœœ Xz·Sñ€F@åØ35=KÌïÊâúÍ4óÍìö¤Û’òÔ }ìRm²Û ¿¾Y˜ îÙMaL'ñ]#þýª}þïÛG'ŸlÅÊ>Næ·TvÂ#®È·9™à«9å¾<ÈñcÜ;±¢ù«AçN±.¨j3èclºX¹1Ðï³t"cEŸ†‰ªÅ^ÑÎH™÷ã {%רf­®!Xò`µBK—â¯ä7æáëîŽáXÖ™Ø4»±ý;ëÞ~ªë¤:–åù_cú«é±,Î?ì~Û_ø~(ó“1MÚe£¿ÉFCd·/hÞÿ]Ÿ:Þ<Ü]­n_Ð_hŸx›Äð›z4D=~Áo‡?ùÂOhÿè>í*¾ 2¼Á¾Êó6 ¯¨†Ðæ•ë¾®ŒJuÅÆaÌ2‘Eϧ'~{Øhˆâ|p­*—+ïš•ø>Ñx|øn^FßÂíÅ-­ÂaƒsË—âg¼„‹ÆL6DZ4'N… *WvéG‰7ÅÐq1QL¼ø=¬-Ç‚Ê GÁgǃb¢+Rmâ°³UÚIÔŒcü}r¾¨ü#ì²&TɈþ͸P|5¶æÝ˜OiË›âÇ: ‘2Ù·ZG¼ÙЉYÎteQòLá“”4Ÿ­ãˆÔ\ƒì)«š‘#´Œ¦X< ß|¢˜öšUZ„ÙTÊ`u_úô¥Øõ*lƒÐig¦Î&û]¤‹áªÏ©‚šåt³n/º­¸¦›¥Mq{¡K7óCÝ‹ÆTÀpÉ% ¸¼“þqÈ23]Ð wÝFk£‹|ÕGÓÜÝŽòüÆòúÆ_.g²%3z,NéLÊÀg†ù»ö>Ó g²ìÂ/z?c’÷FûgÁ¹õü¢s"OøÒ Ó–§¬ŸÀœ/Ýy¦A3|áwž±¬Áðžü¢¼=c.œðÙ;£åÉÂ3>i2Ë'DÉl\\¼U˜X†soø Ï~©…Œß [~VØL’mFpKàŸç¡O¢–ÙWÒ6ÔbH ûšò{Nƒ`bÈ&ΨsaêqçA&¢áà zJÒu"“=+Ñ3Z+ÚB ŒW€a%Ñó+²‚`s؃ z¶xÅË©'BlO®¤Mè¿Ü7 ge@´-œÈ¡là…kà©Ä6F*• ®ÈA§Ô«@í&˜]KO-°’óVzE¬JOEWmÝâdЧ¥PŸLΩ¸M––7)@a5VRKÅ@ÇL?g‹ý—‰dT±}²¾ÖW‹X÷lÝ>€œõïLS/{¨Í¥f:ÃxéÜá³B3mÆ‚ÉÓ¥„v×8? 6âÞ¿Úþjï^Ù»ç9°¿Ò?£.ªË\°?/4Žß.=ÌtædIë§µÙy–þ„Pu †SL¨ÏZ0ù¢\Ê„`Xà†5­G”€—Ü îIë±ÀÛrÇHK¶Xí´L„ª,`K™<Ëõ8ÂŒ¿RÓ!£ÓB‰êq¨"ã³ÄËÖ/±X `Ž@+Á>Á_#zçû¥ðÔZVÑâãRNŸq™&‹9&ˆÄ`ª®´8Œ7_qâg?†Òe¼@=DLbÚ7hàöA«þÝTÕµ‹Ê³79Ö46w‰$”[mò ¥)é:â]§I6&_mî/%¬°@`4©õt,)Šö]Ö®•–Z’×–"KƒúŒôg”L†q[ô-°Ý¢UCÁ©æG!ÏU,ÐXT´ÆÈ˜ b ýóÞ8\mËà`,üžOp4ˆÐeAÛÊÜg€áœ,a!ö¾2fíÞcØ' ð„¾²|7Ve™~ž[îNP,L/øÎ–ÅúGˆÜW2Ê ¤ZëI¢È¬öìü“x¡çþpB«Ø. •â_0=J½³Çj.Ñ r§—2¤½æàM…`°Ø#vMaÛ¡½¡g_…–mJ³G<7Ž\äþ]nM¹¸AÁeB¹ƒ£;ò÷íÞ4Øv,èƒ ”vÀˆ°ß*Nÿ‚:«‹ ë{•„‹zÚb³õM¦,Ãã3=7Õsë‹úDÄ¿,,‰É÷ñÛáUë®Ò¯î…) !‚Tþ¡ßAŸj¨[Wõã¶…¶]›KÇJ¢•!:•ÆÌÄ‘Kk¼ƒ„O‰N—ö \ D¡M°[.>ļ–áöLnâzK\ #àh EÕ“ºb™‚5—l’@’©Yn ¨Aµb`?àêo°ßÚ®Ê ©V}w¶È»j½1°Ë üžI1 #SWö JöÁoãöw“ÈGg`O~ ~äT á)¤¸N„òË¢‹S1Ú¡´µj<ÈúÒCFÃÓ÷S)ÚDQÍʇ 7Jû”ª,ÆGŠIâ—z)bÔdÙ²–D1­¾Q¸o‹g}##¢";Ò7–Ätç­;n×1&ÉGWbtˆ9Ïa,XCYÆÅ2eh[#irÆUž:£ëõõë4çßq 1Å8$að9)¤‹6œA¥þ1át¦µªÔn  ¾Ow|k‡Ñ·"Ø£}eæ›ó*Ø"% ªÞNbês—6–±Ï]RÂg`W¶AYº×vÍ£¡ ×Ò@mÈZ:»|3 Ñ0Yfž(*ËL*J_ð+¢¬mK1‘~¨c¿Ÿ<F—w†YïØ¥”‹-âŸÄ³¬µf´=Œ¾0ÍDHJ“FâÈaa,¥qV½–ã=ö©Ï4˜­^V¶éZdmË­Ï*vfƒ”8;¼³ÚŒ¹«Îs'…$<ˆ ‚±<YÊ`yÜ›5Dz°¼2-ÜiÖx´,í˜g—LôhãK%Ü¥Jèfj+I ÎW ú~m²ÿ–¯W·”PðBa+‹¤ Çøî âpSCLXÃ3&%$eÒ•={i·ƒ”qk¹,5EƒÕHIÉìùÛÊIc'Z]yWJ“¶kXä ^Ûh7I+MH±ÀMû-( PA„IúÆP6ŸÔ¾ŽËå;@+‹OÜ߇éŒñTÜ¿¯(–ç¿OdŸÕÚ>Ü*>:ërLFñyëbSŒ@Ì׿%ªÍÚ#ï 1ƒ ç î •5Ô–Z ¸¥2ÝÁ*£ì(­VÆHn‡žF˜KJŽ#‰?[ó¦P&kL ¯²¯ä¾Ñ¹<[ZLãz€È φ€óJœ,ÁMÃñ^­^¢˜-VR÷@2å}1ÆT–Ä>Iw‡0ï¥`¨™§_e—®.Ù4Ûßyú“·(+}š‚¦¯§¾oØ qp6IUÉMG²b‡Š÷å󕞣 #9óvÿ.À*_æ_Ìò`ÕÞqQn±~EÜ¡’ÊÖŸWÊ/îıá /—ˆ'ih¾&;KÌø(¿Çbîl°¤5Ô¡ÈS8šCÇè÷ 9"lÒ˜~„ ]Ž)§‘¶ôyeÓ…HUVL’"Ïö"RÚŒIì`h¬~!‹¢ÆJP †E´a<&Ï ÷>aŽ}£~8ð°Wê1®ãß·šæÍÄW³Ë}¸BIæ+±ý{ךlYê3Å©Z½CáŸra `Ú¹ð[Ò@y©™)a†–A¡…ãdºƒÃ3¡Š;ÓÏîBØrg½p¤Pa8¨ø ’ëÕ€À>(Ÿ¬73cÞ»Ó"H óéXqb²µÆ3¡M®÷‘àQlßåóS )$,‚¥[”©€°¨q|›”ñA`f?€ùå³k‘N¤Ësœ Í Dx7ÊŠ+¤Ÿ|‰ÎIZ#ãAdÖb}(À!ÎLñX)È6\ýßK²™&GŠñh¬×ý,R†§âvÒ ÔKËðЖYeμˆÅ ç7Þ}tÒ}B¥ÍX¦QÎ5¼ÝŠÃN-#¢™‹6ªiL|ÕÏs] ÅO…=ñqÙqÿ;‡œ,Mɯ“Šr3†+S™äàQ›­ðúŸÆßÙR"É2Àgdµ=Jcñ)–.IJƒTø•bxQ&0(eI”èeà*`t‡Ò ¥—b‡$ÓÿÒ/gðܽÓES`Ø‹4»+X? ¦:È/òD4§)UÔ+õ [+¦î{IY–@öŠ{51µ@~AR”‡Ó'BQß?ìMî‰ë=µ–C´À ÖjR¿!ƒ€Æ”‘‡²³w¸•Vw“›ø³¢[šfÌ;›Óy.w¸ªèÎÀöœž ›{w>£;CPæÞ{JbÖá{ ¼“J߃¿ÖÀuƒ³Æ«ƒGææÝ]R^2 ¦®@Q¢ÀM9Á-ñ4/ý,¼ «Ç óÖ:еâ#TãIàú½õ€·üT[°£ÀN¶È}¬ O]¤ž£Ú¤§`~v‡ð*Á˜\ûEW–ÏŤ ³í4xÎNÜt½„Ô±oñ2EÚ[YÏÑ+Èáä9$˜:«­³ïþÒNEšÀ‰¢zr§G»$lªf, ã9p™º¿4[¶»§&~†*Z`Î%Sf õù‰ËguZ*EH‹%)ýeèh"ÑÈÿôïI»ÂµQF Q[¦iS ˆ,ÆÓ%ü'ö`|å˜m²¸µ=Ñ–u[š›WhÏ$‹Ø0E nËýnjBµ£YH.”»hÃ… (Özw~ ?¬>v5 wJu{‹¡¼Z ½Áf’SïršQFqJ§Þ(üÌ0§Ñ†š©{Ï4è™lhú˜Î+³S87xg87¦¼lÈÛÜÒ«1ÉAÙ¹%_à ßâª÷vÖÉ!G·Ý`¡¦7Œ¶KãÌ'ÇÀ®wçd —/&ïh/tï¸Çù7ùxŒ|üŽß&œ%ÄY2Ey>LE¶ÈŽ7«íH ¢fßÖž¡nÛº]˯‡¨ªn/t‡èëáëñ–2¬†ç×¥¬ð*Ô÷+3Ù©UQÚï;¦ù˜¶îíl/ê«;št/êÓSÚçžÍD}9¿3”›¦ðF!2pS>¡÷dKÌýÞܾ _:IÝc¯T>¥œÅWÎ?p8÷†¯à}†Á£Ág£È8}zõF÷,ÁuÿÝÎxì†pÚè®·e£‘4žÁ]Åæé½˜’E6õýAÚŪ³´z’^·CÆÒù¥‹ÌìëñëáÿÜM(ã endstream endobj 1468 0 obj 9029 endobj 1472 0 obj [16 /XYZ 31.5000000 685.250000 0] endobj 1473 0 obj [16 /XYZ 31.5000000 524 0] endobj 1474 0 obj [16 /XYZ 32.2500000 683.750000 0] endobj 1475 0 obj [16 /XYZ 31.5000000 263 0] endobj 1476 0 obj [16 /XYZ 32.2500000 523.250000 0] endobj 1477 0 obj [16 /XYZ 38.2500000 159.500000 0] endobj 1478 0 obj [16 /XYZ 38.2500000 68 0] endobj 1479 0 obj [16 /XYZ 32.2500000 261.500000 0] endobj 1480 0 obj [16 /XYZ 38.2500000 159.500000 0] endobj 1481 0 obj [16 /XYZ 38.2500000 68 0] endobj 1482 0 obj << /Type /Annot /Subtype /Link /Rect [87 778.250000 139.500000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_experimental_status >> endobj 1483 0 obj << /Type /Annot /Subtype /Link /Rect [60 771.500000 105.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn4 >> endobj 1484 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 136.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn5 >> endobj 1485 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 138.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn6 >> endobj 1486 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 149.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn7 >> endobj 1487 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 154.500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn8 >> endobj 1488 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 112.500000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn9 >> endobj 1489 0 obj << /Type /Annot /Subtype /Link /Rect [60 728.750000 156 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn10 >> endobj 1490 0 obj << /Type /Annot /Subtype /Link /Rect [60 721.250000 141.750000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn11 >> endobj 1491 0 obj << /Type /Annot /Subtype /Link /Rect [60 714.500000 164.250000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_build_system >> endobj 1492 0 obj << /Type /Annot /Subtype /Link /Rect [60 707 129.750000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn12 >> endobj 1493 0 obj << /Type /Annot /Subtype /Link /Rect [60 700.250000 111 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn13 >> endobj 1494 0 obj << /Type /Annot /Subtype /Link /Rect [224.250000 82.2500000 269.250000 89 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_supported_status >> endobj 1471 0 obj << /Type /Page /Parent 2 0 R /Contents 1495 0 R /Resources 1497 0 R /Annots 1498 0 R /MediaBox [0 0 595 842] >> endobj 1497 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 1498 0 obj [ 1482 0 R 1483 0 R 1484 0 R 1485 0 R 1486 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R 1492 0 R 1493 0 R 1494 0 R ] endobj 1495 0 obj << /Length 1496 0 R /Filter /FlateDecode >> stream xœí]KÏì6rÝ¿¢×¸->$Q@À×¾7@ È"È"ðd2Ì âd‘¿=»ERÅOIµ¾¶aßÛjŠ¥¦Èzשïÿé—ÿ¸ü×ÿ^¾ÿñ—ÿ¾ü6ÿùã/Õµ­«éŸËðïwë Ò\ç¿_ZS_~ûÛÇï—ß?~þø¹ÿÿïÓ ¿üø/ýßþï"/ÿÜÿ÷—Ë¿ý{ñó aÀß>ZÑöþuü³kEÿ·êöçpýÏÿú‡Ë߇róÃØŸ¿u­šá)Pþýcù•bü÷ûûÇ÷Óï"¢DÕÊ‹ÐJ_D§ååþóãOÞT®ŸT^ôÅÚi0ö´æ¢ª®ýô·çä˜Vh©ý™ñ¨î+ çÕH@^VÔd¿+~ɺxB “fñܙٯ'Ð]VԺ싗bçm¼Ö•ëÆÇVýÂu3¥¬«¶}°^e×iYß–oú®àÕ4ó?äߟØ>­ê¹÷¸îú&¥k*Y‚®Ô]çÐÅÞºð…ªÐÞªŒoßútA^©Úžìô!Æ«zxŽ™Î|á·þ–ê*D'YƨΚcþ8Óèo˜/L·]ìûÛΡÑ_h¬Ÿc£í9´MãÏý–]Ÿ:[[˜®ŠÆï¿üúñý·žzsùõOýWÓJüÚ¯]Ý\¾ž¢½üúÇË?T•èþñòë_zf~mZazýk7}óÃø¹_PÓ…«éªFÖÕ}h%Éo¾ŽßÔW%°¿©ÇoÔµÖÍ@wEXL¤–›öÐiÉoôø¾j5i—w:älÂPÏVýHÍVg¹Â{*òž‰ð×_û#wß4[©÷ë7ËA’uá¯Î~¬¼ýHžÑ^WUBTÕ2óüYL§«­æƒaÆ«êÒt7å~ºðÛGcæ&–1ízŠùSµœñsÕuÓѲn®:c.üöa=Äpi|ÆÛö/ç—?d?=cúnxŠf~µŠ<œ}(È{æÙêkÕ){Wÿ@ÎöeºG._íyú\y,…J2š Ž­ÜyFŒ·A{;"U³¾`k¤°êw”-¬„¬6„•Ò$ÃGXcFatŸcú¸ÐX„U¿³7„•­C£¿à«iŒ¶çÐ6‚ªûÇÙÛ¤ÔB$"7¥ÄŠre=”üé4á€(þDNRKÈæv$çsÑÄIeœ#©º­#©…s\ú î‘ÆLGî6ÇüÑ8GRµ[G²WzmƒìÉqŒ¶çÐ6’G²–YDMÛ¾»¶Mmï$Ùêâ~õJNC…XöÖžíØ„½³CNYô7€J+tÜÙÑõ]ãÓë {ÏNÝ:g§6[g§©œ}ÝTÞÙÆLgã6Çü±uÎNÝlºvhôܳ3ŽÑöÚ¦Qòì4jÙÂ_IÛ‹Öö^;ï—¨Ù»8D]NËE {@lÒ«#g ˜¨4w ßý¶ùäg£—#¬¤Z_ØËÚÆám»Å\߈˜}#ë3<Œ™ÎømŽùcãð€¶Þâ­vihŒc´=‡¶i”äF¾yÀS<@‰Ýî–€"Bÿ Z›?S0êÆ”ua/Sèj‡)tÍSèŒs`GŒ}¨‡1Ó¡¿Í1¬¦Ðé-¦Ð)—†ò˜Â8FÛsh›FA¦ +ñÐÎ…ö2탥-SWë p#z’8Ϥ¬äMOãH· Ïz&¥¸I¿ùs½á™”¢µ‡rt•XÎÅqL»žbþ¤-Ϥ와Bº¤ë™.ÍϨVžÉ‚žI){|‹vÜÑ‘Þ]M»iñH[†?Q¨¢}Nô=_fCZ¹Þ(ú›€,¢Äà¤åý¶éµ¦ß)¯[Š~Þ ½i:{Yãè–òüTºZ_xš3*esF¥·8c¯ØŒkôXÙÌmÓ®§˜?)›3*¹Å•p 3ö—æg”kÎx'P’3öªÉ|Zi¿ mªŸÈ½Å뉦 çGG³ã‘Äô'ö½+šÍßJÜËäô-|¬*µ¾ð4“«¥ÍäjµÅäêÚáA£kÑæSØv=ÅüIÚL®[L®çÊcrý¥ùÅšÉÝ ”drµYÞ9­àÐGq¿#=ÀX5EDÈå.9]¬3“Ëè¬òÇ(¶Wßr”ë ‹†ÿ8„ìóìŠrß½¶?½) w‹+ã¬DÿÄt—æ)‰Ð ["´rK"´ÚaØ££ÙfêØv=ÅüIØ¡­¶$BÓ9šÎ“ý¥ù«µDhÅ$B»äÊ/”ÚûD„s—ÒIó/’ãÐz\Àšd‰Ó¿ ‰B!†4ͺ‘¨¯}d íe©í=űë OóÎNq”ÝVŠ£ìœGÙy)Žã˜v=ÅüÉNq”f+ÅqpyÛŒ—â8\šžÑ¬SWJònIq,¯æ0ó'ÄQ…8Wæ£Ì•½ç«»çGJ±¾°÷|=ÜQ•¿£ÌEêÍèɨ˨fÉH³‹U-þR÷}6×9Uiõû ïé¨{æ7 åµÑãrºÊ“ÐW7'jÞktæ7Ð^;³û fchë›ø=óS7;~aERžù¾0Þo×ÎÃwÅ[t5ì]uÎ/:¤ µ_A¬ z@ „ÔI'gàa.G/  IEx!1vš‰Òñ­L-ý€Øåô/Eêc€ü H½Œ8@ T}@ÒArª•vÙFH¶ ‡"(/Õ÷[R›Ïõ×$L¦u$ÓIB¹RÇ€°dãó /V~ºˆ>³BœÊt Fy1[zF¡7:½eXC/eÉÝ2³©§ ¡+^ÝœÞ2x’ÝJZ<À\Èo´*'P»Ö¨ŸØÔc)P¢^ÜÇ^Žl9Z¬¯´²ˆÂ#ç"Á /ÏQsŽŸxîÝr”&sªIC½1D5†ÞËaíÞ„«/¤¶—?PöŠèZHJ6ÂÜ#Þ D‚!¼¹à¹ò^¼Ó‘^轄Äç†þåáLà·¸Y½8$ ¨–ˆ³Ž™MJçgq·$”]pdäõŒ8±ôR/~ÍUÌþÐ("[ägÐH${"¬(•ŒÞ‘t–ª·æÈ#Ñ Þ$Xzó"OË˪\Ó<ÀjÝq`(âŒ,ï¶¢9/âÕpnߣϘÒ[b•iq¾¨÷È(¼òðIS 1jXá˜cêž„x%Mž9>¶¾1Æç]¾ †1M;½¿M·w"oè1â2Þü3(è” A~‰ˆ‚Ù£ø îç3ÂÚЇ)ÐbŠ¿E¼ozúÀ¢ Q¶w 5ÓOG|W4[ŽÖg™¶(’ñ4 *"ä‘lˆýz/b¯Ü8Îîýy¨¹Øo„É„}! <¡°l+a Ë'òYén8  ˜öa}½¿o°j°Jñô;sþ<Ã^6ͪ`O·Ý¥©WE}z„Îlôªðo£¬)Ôš@?|úiHö÷©²¥ŸgwÔ×ùs³%Ά6<–´A_m‰4ŒQÖjM`g Z«s³r (Oœ cŒ5…± $gõ Õ5'ÔC¬[bEä=žqŒ,J6,kV§ìÛ.‹[®wQðÆ¢0±ýú¢<®7Ø~=$¯¹r=(¯9÷8FYS¨5™í×7eûfé.ÛÇk cHÏöïPÉHÁ¯n¡‰g˜Ü9ºH$!‰G³"V©Âvïнóg½uX^ë¸Lн֑Æ(k µ&°œÇt¯}³p ï<cŒ5…± ¤?w€^R CÌ!½±Z‘gš¯2[[|;=’pÃbŸ#úìñ#‡Ü¿ø±±Ó£Þ”‡dõ—8¢ŒV!h‹.¯Ç(al§WvmAtºƒb%ʈÉ Û‘Ê×Vß¡ËçÏjKÉ`É-l‚.·ô´aŒ²¦Pk‹’wƒ.·o®\•§ä cŒ5…± ¤Wòn€Æ¢%·QDÅvyo‚ýÊZ¨ëàð!Hb, vþyúhùÓµ&7GÞóèI¼I,  ò5ûmHòÓ5¹ ¸Þ™}þ,·ž›ÊPO© –ÌÆ(k µ&°¼2»usã$cÔ#2»ýÃcMaléÞ =Pý\.žåÍwB‚½@$@Ž8eÏGA¶¨Ö9âé'‘–²èÝ'É nî€þóg±%nÜTƒzJ5°$Æ0FYS¨5EÜÜý­›“,Q€þöC cŒ5…± ¤77ØþÏ“š‡@4Àl»d5!rüÆ´CœMˆÐ?Jëîçx6›å8"#—‹æl¾ÚT˦ê,ÚˆjC 6nG3%q¬eâ8FYS¨5Y 6•Ù¨M夡 :Ž1ÖÆ&\ 6¢^Öÿ•–Ÿ'‰–¹¢-lsÐàpZ’«C>µŸçY¼\–6ä˜*£å…ß-¿ÖPò&¢#¾Œâî/×ÀËœôއÛ9eȼŽ”DbÀ¼Q›\é6^R%àû£VÒ{VilEPv[Š ›=ØLÙƒ–.7ŒQÖjM`Qe»¥J'ÿq¸à*‚ÃcMaléAµ´¯£Ó…¡Ô„¨b¼, ,ÎæuÎstÀe;±ºµO¬6['ÖMi¦TëÐ c”5…ZXN¬n¶N¬v’Y† î‰Æk cHbkµl–iSnÔÁâBH_,Då²Röã$ÆD÷{ ŽŽˆs\’…+#èú4a׃‡xªé)ôI8°:ˆã!M¬à¹H‰ òNö:ýÊ+"ѽÃϬ¡]>b])#ÕÙr襊E³žñf¿gj›x•€Jas“’bŸé˜fÏOà˜¹Að4‚jB8ô(ÂÆ[â˜Ò™ÉSÓü—µœàÝd€}L÷2$_Qù#ièé‘fU@¡>F‚høî> —$} ¥4hG<ÎK`uÒ@y æïñR7OW] _ëÈ(È<œ9OÇCF}–ÂÒñà³TU§ìJ\Õ¶< `(ª¯—QÁ~»1¾ ÞX:¯$ÙK Õ‚"™¼ÉCåñØOŤ>ƒæ•T)Ž›‘5 1 DOGûÓ‡û;¹®­ÚÇç)÷Ê€x¹<µ…ßrÜ¢w—òÚ Iåí:ëiÀ ä‡!šäÔ¤@ù &µ¢Y2.xrÎ|(Õ5îíEÞð"«O0›/ITe9üY'´&ùÚ´¢è$F¢¤ˆˆ*Ÿ×ÊŽEu”ápºtä´®ÆWLDÃÞ4îL)Ž;iïÉw3.O˜·óè²ûfž¤âȸãM(‡ì6d6šÿ³ŠØÀðpœ#špLF.ë[€GD˜\ä+…ÂI¼©¬)pGb(z:,b¨ `ÑÙµ _3ÕáÜ_ÀÄc͘g©Ž„6ö“ÝOŸòV«’Ëgø˜ÕóKS7ÀG Ì¥u¦«HJ²/’úN±…ÖYKÒ³…Ýßl9*÷pƒ¢EûÛ: '5[ÊK®Ä=]SG rÅ"…ôáãàLjÎ QQ,ïùÓÕ§$añ ¡lkç¾S»1СWò:Q°]qbóK¼Ø„ÜþCÈϤ!6y¼†,ñäODô¨xf‹ÏÑW´X߯I^>}›%9/³Ž‘P𵦱o÷ˆ˜x¯;š·Y* C49–ªv“#O/àAb ‰Ã/Âë;¹¾ÅÀßÌEêM¯ÚˆVÝvʦ8¼v­¶¸ps›õUîSnÝÓQ÷Ìë%åµÑス,Qè«× ó @ç'j6Ñ‘³}èÌOÝìø…óŽØšeÚÂxO«EjI7ùYŒZ€èü¬4HH&|ɸ /vn̘­ÃÂbYSÈ]åË›‡„¨½iÓt=jÆð.ŠNdš?a§,qì5%KÆà0ò6µÜÓ¥#ÀQt"ª_bâe¼g-Sao{°òíé†kŠæDô=ê•|Ï7P(—ä Ø£Ì§ÈÑ}·½Û±ãSb²5Ò@Ÿ¥“ç;®´IÑŒ &ßàÀU<®tVLld!¡~ÒHz/Œ‚§QeAÀ°ÜXâ Pv8b öZ±.n6Êßfgè©õ×»(|¦c¦1Õ1Ó˜v£c¦1ÝÐr¸àtÌÇ(k µ&0wÌ4¦Þè˜iŒv h·cæ8ÆXS›@òŽ™¦':¿®Âk0°?Yª¡ÌeUDô«Dj둺r¤l#Se{@œ!YÇÅý·ov ® ·R8ß?o¿çT½›»ª¶$QOxCu•±ÅpÁ‘DãeM¡ÖfIÔUzCu•r (WcŒ5…± $—D £¡Ÿ@8¨@IêpsáMä&GÞg1˜æ<@oh(ñþx‹B¿  @-¦†–WÅ|&HQÏ$§c6¼gÄîÏ“ÈözxÕr©¡-ê-ut‰¤@ßµ-v žAÚ j¾ šð)}Cj[ßõ–¾![Gè/¸ú†\4ŒÛjM`Ñ7¤ÚÒ7¤t HOß‹†q›ÂØÒëêöÉd³ÕeH" ­Âs M½­—àºåªQyÜóõ0{ée€!à\ìY+›=k½ÅžuãpÏþ‚Ëž‡1ÊšB­ ,ìYË-ö¬…K@xìyc¬)ŒM ={Öݲþ$œqùºÀÔJ•ÀAf àë‹É“/ŸÏVèÒË‚*• h»3zùAHÒÛþ¦ÉY†7è' „#Æw¸=µÍÛÿšEµ;@"ø;"ÿ FÔ³ê­ìs­ÞöŸ7ÔÛþª­ÞŽlõv£¬)ÔšÀ¤ÞöŸ7ÔÛþªp ¸êí4ÆXS›@jõ¶§µ¨·‚¶× «¾”ý‰›j±8²ÚíåëOÍÚ•7/3£¦tEÊ#ÕžIGŽ0aczœñ6|´»Rš9²%Å[[Á$RyX´ÔhºBƒÔ‘æ¦uÛÊîû‘\kò踓Eøt•JMFf '`M‡KŒ†ö¢™¼ÉÜG®!>{\òxµ¬”´-F¥¶,FU;]Áµ‡1ÊšB­ ,£[£ª\•g1cŒ5…± ¤·ïÀU´ÌH\§Å‹ŸaÀ0ì¨$j,Âäs½¸€¹‘ p啺•ÒnNÄ" ø˜nŸKìë.^î°8¤L-l)SË-)SkGÔÚ“2ÃeM¡Ö)SW[RFwÝyRfc¬)ŒM ½”¹Õ ¢j€Z†t*ŠG²€BAÕÿHh–Cb ý`ÞØ3s¯Íý½cô@–€ÌZ—0+³Ù È™O{jrÉüÓä¦Éª­l!ÙŠ-!Ù*G†µÊ’ÃeM¡Ö!Ùt[B²1ÆxBrc¬)ŒM ½loý´IÇ^`w¼Øøܪüaÿ¬ˆû¼m' ‡ý¥z¤ßïž‹U˜Îf]µÅ*:éœäNz¬b£¬)ÔšÀÂ*ŒÙb¦u˜ÖcÃcMaléYEwk(ECÚî—yž–6/“ÇÿѦhD”pn –7­¥#n¼yÜ¿@ˆèŽÐs#RÞ2á!@¹#,í8ŽÑ>ÇKÖ8&ðJq+ÀzSÇ”€мhOK^‡6äBå€vGB]—š·u¯]ººõ3еÖ:[æ""#$€ñ#M‘œúw!Í."š\ó¢Û²‚¿³{--ÞÒhÈ—@„4—©~äßŰ?‘ò»ì´!(É„ŠRY2Íhi Õ ³˜ VïtÊÆËuWpäÏé»+”÷¼Ï}èž§º q´ÒdY¿]B÷UbíáñÒÕké_wx‹WBðbî]œ¥ì/es…Clõ2?q=!âÜŠpa1Gc#ÊÆCú,§Ùeôɉ¾”IÉÚ)xöú~ÈÑÀV¥-¯ò‚õlFk¸ÄW{K:0;GªÉi_íHdÍ:„\¬} 4‘þŽ”Rœ¡::—7Ÿ)Å4FT±¼ À¬biˆ8» Nic°¹êPOçѸ¬ˆ`f¿ Z™AXëÇé­˜‚j‘…øñÞþ‰äþ Áy¤LÉOB¦¥¦ô›׊N¿~.€Ä ÝÍ@‚´}޶¹¢Ü>á}Bàyxs)xÛ›”ªCƒ…0îtR&¯‹ñ_Ô¼Jç%”«¦¶\åºG²’ra^x>aÄ<Œ($)ƌϑÊÁ›F, ôp ¤ØËÉå?Ðb1 h ÄÍI¯Sq541^ýÿÈÉ=¼L‹l*Ow) ÜóeÞšÊ-  ¿póyQxxÛWæBš@›ˆbUª:,°Ät礹f·¾V²½§­¹UõÂk G`'&^?Vþ]@‹®µ°e"¤e»eȰZƒT%Bœ•·(¯|+^E‹‘êƒ\FYÑJ Ø úà…’Ì sY€SHëüÜšH¼ Ø€!üèp$…¯’õ^yɲµ!—ò~‡J‰ÇïÉ6€PXa¼¾À—dEÇ-IµÝÜË@â# 2½‹¬I$¹½V_ï?è™ÎÉÒéœ,7;'K·s²ô;'Ë¥s²´:'K§s²Üìœ,ÝÎÉÒïœ,—ÎÉÒêœ,3vN–·ÎÉd.–” Ø4-V.Dd¨ô@ñ‰iORª¡çb :<~„œ€W’¬÷Ä‚†bx3ÑrVÇC[Çꞑ۪2–ÜVU·!·•¶X.8r{£¬)ÔšÀ,·UÕnÈmU5þ‚#·Ç1ÆšÂØ’Ëm%ô^¹Í " -*ª^m?Îìfé®ãþÙP¯·¾é¨oæm·ñRä7:¹é?Á¾¬~ôÙ̶Ëžø5õÃSßÇQ]ÃÓ„Ud±IéH¹)”+”/Ô"¤%¤#䦮¾‹–¥€Ú-âö’7É‹¾Ä:Û©{fƒìT„ë{ží‡íH,x ¿ ¡œØ Š@B„ Æ›”¥C&WˆàY¦ÌZ©¥- éf_ÌXlc±8 ÝW?Å(6 k@¦X°2[¶TÚÚMæJPú`íßÖ;$‚©æÖz˜Îxäè=íëòòóÀ˜ˆë9 …(ÜÅ5TÈÕÄ ËŒÛèBTp¤PiäS¹|¡B6ݘ·»âSáEÛÇí”ʸhmq‰øLxªÛÞUÖÌ¥’P…ß;µ/Ÿ9@gBÖ_(òœ ì6" `òô–ªøXrI"ŽB„kXá’p=‘¶4ƒ Ôh~“©Û`ÀŇHg ˆîð¢Ñ é¹o˜ëby}Ú,ö/®IDv3’Š÷’ÉÌßs­ zušå8ȹ<ººåø¯æí|T Q)cŠm‹×nç:Ò¼ÙPàùd°å#µ¼B¬|¶ O/eaƒ‰+·í¿8)}wS9ë]àAnðÇ«‘),[ó4Ž~¼Ak(°µÿaSƒÖ²ªPr–‡)‘ÈÊ\AEfÐ!Äø ¤˜äŒâa³³Ùº™½"Iá*W¾Eœêâ (˜»wfŠRÒ)dïÀ`ÉÀàÙÓNy{d0Cq©˜¼ØiyIz¯šTOl+È ÑQÏÛ3QÈÖy‰{³Dšö!™K›r%_$öŒžL‹A`½!·ôÙÿ>ⲈÆäM]GbŸ,u¼M|óñƒÑŤy‘"²±‘‘^ÞbIó⟠@˜³³Ë‡Cy¡æ þ:–NU¯TüÊì¹FèÐJ'kÇ›˜fj/…®•« ÐKjSŠü¼GI‘ÌDQ5Žýöî䓬-à™]ùûó£xR”yë]hK‹÷g”ÂóC2{c ޹ Òûâ´$%\„k )pÊ==êR >#éoæÕ?ž©jû0@¹@€0ÉÝz1ˆ{aåˆ1BqtÕÍŽñÆ‘F–ºMd®LÑ\Ù/góüÑOfH'Þ„·¿_)ë/~’„°•ÚÑs1 ´Å[›ºfŠW§À¥bì‘ân]HA‰8tû‹Èy:ðä;tˆWG+…•ñ Z¦°v;¢ŸºnH±CæÆåÀ»2—žßoy§ØWçPV]«-NÛ\g©¹zÊoä=yÏ$m„¾ºBx~³‰gÁí§—UÔlùlóþj¯ÙÿÔ ù ýÔ䳞ú§øÕÖ K­fL>§Z-]gÊËf]â™B!$>ÅÉ¢ˆ2 :(ËiG™«€µd&o- òæÒÂ~0ôdR7Êeܹr6ËNIZ)l™Ð#bQJ¶ÞR¹ØeâÐ]Úœïò¹}g«6;@ãâ³9|‹9H90…ʰ1ŸÊÂEoi»a;–Ý›½YP¤DÍ•¤X¾@%›Ioû¼ð ã2½Ï¬Ö¹·oyßܫێs§Èû»{Q¯k%E±l”‡2êþN™|,§œˆ®EW{°ÖïŸ^<2W îÄ3w$Íäø:Œ*—²$²ê1v¶C€ÄX²ã‘ŒÜzX/½cI7‡Qyüü¼œ)+BvÆPª¼ÕPT´ …œr”Wû8ÂZŠð2ð*†g÷2@-í^3B÷F^úLQk 3©n„rÕ ãEÅ!æ¼ko3ÇVhG8–*½}‰$_oú£èOqÒåÕ‡ûd"êE+ä"0&€öèðâ@¬H’0º‹ðgËôLšU,]#ó­€Õ•KÇjLè"‰¿÷æ!÷fy¬ËÀÏ`‰É!¾Ò´Ù¾Ì£Ùæ‰þ¼E͸®Ÿ”åÖ6Ï¥µÕC+¹JH³ŒLÑóâÕÝ´º íêÐþJe /Á.YRÊyÛsx‚Þª€§¬|Ð.[t–2nV=ø‰ÈLJˆVÚrî€Î2^½rŽð–ú¼Tíúþ¬2ï:+þN¶ô‹”«Rùü"$¤å1n ( =ìÛµql×²Ñ $ìªF9†#ÍNò¦w)ýøeщµQôû0}j?a¡‘u¯‰Å¢ ÓP± ?™"­è–ÕÏ”(ý ù˜Ù”­³%%ϼí`9š­÷Bæ‚¶ã©ÅæýéV[ÚÂÞÜÄ€š@KV¤¹ÌYž)KÊEg ¯r˜—'SšßiwLz< „Ýïâ“°1ÍÀ1…lè´ÁµÃ„=^!®˜Pþtµ¶åO ôûœðNNH¯ÓÌŠ.§._õƒð&ˆo~6µƒ÷™ËÀÝ6 lG䯶îlŠýqœÜFÞ:ÕWéz”Ä7àžÈ{:êž…ùJßqipüRƳx*üoÄ´óÚ«"\ ÍU§e=¹:â+ùäÜÙ¥7ù󞌺‡^Ñù Òû2»‰‚˜;™%÷šü+uNØñRžséçHçO£¢Öàuìš\Y6#¿¦ò“ Ÿ“7æÒ¿JÙ\Gáñ·ås{5¦j/M3þ)Ätµ»4õ8p;]øí£ÑW!:iŒXÆ(k µ&П>×ãMçfíÐÃöCôcŒ5…± üùãË’õz¤—Q v "‚D’X’†ym³â)”‡GÐM¾ªLùHX?ð¶9ÿ HR¦¤½b®½µI÷;ֵ͎u³Å޵q¸eÁeÇÃeM¡Öv¬õ;ÖÊ% ß“¢çeSp\“;F¾ š0 Pi XVÅ ß_² .” …d¢¡]é3\¿«¤Åõ»Jmpý®ªm¦<\p¸þ8FYS¨5™ëw•Øàú]?À!P¹\c¬)ŒM 9×ï*“Ùž> àMÄ"ä‡ò†‰èƲ19ü®vL+߉›ñsÑó:í~Ê€ÄÂ2ð°À¢ fæ '¤½'R¡Ál0™F*LÙ‹VËûÏղм'°#äE±$?Žê•ÀRóZ?,FÍ`W-Gƒõl>A$‹xOÙ:" ºk1u€õ›$À€6¹ÈºÐ@ETÇ}{v¤ðìH±OzŠG¬T¶øü<éÌÇMZ¾iK‚ò ¯mxk÷@¼Öë ýøe—K‚SÁÞJiPlÊCxà¼$ew*é(ÂÙܽû+JyÛ3Cø¹¼Y­¯”vèþ¿ôâß@<PDÎÌhÝ(Ε󓉫åª0 SUü ?¸É›XœÄ,MÚjªjm¡ˆ4å Ršp@¯.|ºÒY“z3ÎŽÊf)Tƒt7!ÂBÏÕ<#Ѓê—Ô¦˜è¦C‚¨ÁzP$”AÎ` áõl3oÍòV÷Щ¨gƒ@òÙ^6¢ÿ÷ò{¿•ƒ;ýçGv0>³uT/l+1ü¦‹\P¹g/Ó–Äéæ=â3šÉš”W9îÑõ7_æõñ¾™µ«~c{ûWlä'ŠŽz$÷·žíÛüK= j–û´Y©Ý Mç>5þœ%mêÐ’aãgz6òžYfˆ¨Ÿ¾ªžG7Üð÷þ‰—'ÿÿ¢-ÂèMnÜYªÒR.nUé' ×Û8*0I®“ižÑme®G´ß8mÔý°fŠâåçÿì£É endstream endobj 1496 0 obj 10762 endobj 1501 0 obj [17 /XYZ 31.5000000 689.750000 0] endobj 1502 0 obj [17 /XYZ 38.2500000 500.750000 0] endobj 1503 0 obj [17 /XYZ 38.2500000 358.250000 0] endobj 1504 0 obj [17 /XYZ 32.2500000 689 0] endobj 1505 0 obj [17 /XYZ 38.2500000 500.750000 0] endobj 1506 0 obj [17 /XYZ 38.2500000 358.250000 0] endobj 1507 0 obj [17 /XYZ 38.2500000 194.750000 0] endobj 1508 0 obj [17 /XYZ 38.2500000 194.750000 0] endobj 1509 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 710 526.500000 724.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_suppression >> endobj 1510 0 obj << /Type /Annot /Subtype /Link /Rect [224.250000 697.250000 276.750000 704 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_experimental_status >> endobj 1499 0 obj << /Type /Page /Parent 2 0 R /Contents 1511 0 R /Resources 1513 0 R /Annots 1514 0 R /MediaBox [0 0 595 842] >> endobj 1513 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 1514 0 obj [ 1509 0 R 1510 0 R ] endobj 1511 0 obj << /Length 1512 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·Y ‹$Ð ‡‚ääÈq Ã6¢ø¿²Iö —¯ÈúúU‘=C ÖŒšÍZ^½½ÞòýŸ?ÿóüïßÏß¿ûüŸó×îç»Ï§ìRäYûß¹ùóÝótyé~?e~þúëéÛùÛéÓéSý÷·SûÂçw­ûßYŸÿRÿÿóùïÿ¨?ü¡ûRó…_O…*ꟿ\V…ªËn?›Ï:ýíçßšûéºÅ ÿýryV4«X˜ù۩ߥºþùýëo§ïÛýMbL¦ìYYSÿUY}þï¿N?ÖÃ÷ƒg—ÒuÿÁß¹©Ëzj“ézjUžgæ­¬R…³EvÇö ÝL’—g¥«z«3Û»þ‘\‰íª*ÖÐ×UKÃC§¼cËiÙ l]£Ÿ4pnƒ‹ÃÝfE´#½®ZÝ‘â±k.  ›gU ¿\ÚdÑŽùipùc¶Ukèëªã³gì¸Çì\.“Yq€Ý—?‹ÊÅâýíª¥áÑódìOcàuxõ•ožß~9}ÿ±æ‹îüåÇzaí|×_~=ÙúšP¿üpþc–™êOç/?ŸTvq…*k-®ùÚõIöîúÄ^¬i•»§'=Qúú¤¼”Uætþü×'ùÅèR ž(ßÁ£ÁàU«òúÄ\rëš®ZužàU« >óP0Àç“£f- Ê5àÂK‚ë·ãá È2x§+IøY×m0›lR‹z3Úº2Ä’ ‘x`®Ú%™þ¥û€O6&, HÏ!OP”á6øH´¡Û'Jõ[¾ÛÓøðÅ+–žÄšŠ×YÞZÞµñÜý»º”e-fœ»þTêúi-³\~3ÑÛ¾žœ½(Ué²TýwÌ`ó|‚úëí¿‹ëKçá˹MPP¿1XDór0D9œà§ÓÛ?De+íáÿ&œáDf¾d¾º$–4žÁOÞCÞ$B±XÒÚpyêÑ6àhrÇ+`d=d—Ô5j|kÂ#•ÄX"1$-FQÀ„åÑ„ +ªº¦R|ðic¾€!¢ ºX¦ .†©*eu £ V×ð!c¾¹Ì¢uUâËÜš‘´Ü~¦Þ éME1Ô›ŠrNoªÕ†¡ZSf½©ùŽ ažOÐëM…›Ó›Š|4AýÁXoj¾S†(‡Ä×›J³c½iòUÌ®.¬÷cöA0J‡&Èï”’y;6ö=x€5B‰L¥“3]Q‘¾2QK˃x?ëÕ$fùVyRyޤätå†rº*æätUÄhýÁXN7ß1ƒ!Ìó z9]åsrº²ã ìDN7ß)C”à ¢Ëi•é(rÚƒâ aÈvŒzxbfƒ¢ž}'B”È(±L‚xmO£«x&6£áõÇñPgvàìxÑŒ>êáàŒ—j5 RÖ׳ޙõŠÔ]BÑò¿ÀŠ×UJÄ+•D¼RnFÄ7$póÁHÄ_¿cC˜çt"^);#â•2ã ÌXÄ_¿S†(‡ÄñZEñ2¦8á륄?A ”ý&j(06¬'€;/Ù£0x°=€<¬4ÖJ‹Ã´ÚÐ#•»^„ãУ%#+Ã20ÎÄ $ºå¢ Ì0>¡-3GyDǽæè¸O¦ó Þå,<Á³Šñ3Ǔ؃ó‚TåC±baˆŽ„#âÖkýP½¤|w©âÀ]©pßЃ×xÕL áŸbäöö´ a),aõîS|ªš†Fò3ÀÒ’Uÿ¶·«›C·eÕœ_²Ê ×€­UºtŸ¤^§ÙJpÛ)•¤³¨"{¡D¹»DQÒ—Å*ãá²xM ›LBŸ„\]´ÛcZÚy>’²WLDœ7cÎzØJ¢Ëš=Š1Z#³åIL…hº©˜« …È¢Ž‡AÁšCˆ ›v…„ÊŸÊïqè#BúÈnrL¢¸æ¢šÓ¹ ÉÃé÷ŠtÈÎSÓ._ËÜ#_¡ çÕ>#»çt¥&ÑijAª‚Ô…äxn J¡h½ë¶š]é>^O]=ÿä—ÓçH m}eZ1ØÃä2)0÷Üô-©™Ë§c›˜EÝ`Xw6Ú=ÿ 9šÔu‡š% O1v¢Ã1ë"(†© “ô0Þ—¬Š¢ÞØÃÿjˆ x A0 `‚Áñ Ý^h›§Ö(öW¯@ÆU'‘[éµlE‰º3×“é · •Èã)¾Â¤åÊš{„¯’ò‰2Æ#“”$Bƒ²9Ñ„Íè—híTRz7õ61sm†âó¨2øBüˆË–ZsöÍÑ?e¶»Á[˜jÍøßmé\1š2àŠjý}ðÝÎ#sº9t^Ïv(ÑšRŒ[ï>ðp(Ì‹pa߸˜=WžµuÖ¨+5Vf8cÃý­™;wé ½ EͽS¡wz×h1•2ð>RÎaªõÅÙ+PÇÇ<7J{Bª¼Œ-VÏÌÑFO|Ò·V“½ëî;Y[‡êxmÑm~cÊ~ωl~Êe7y"$b1Uˆayž8öˆ<(*Lƒ1µ6ªñí ‹GÂ?ÅLÁïày4žç|ò>1’0Èàùhk |Ú†¤@K{ë¤ðrÞÂ-À'Qù >’7p´wp´’@>8š‡áh©àÖ™¡aï0„ °+“É]‡÷BÃ$Ãð*Lf>F)ž",æ|xm舓‡d°”kÃÐñ@2”½Ë…Ò-o΃–›#ŸÁ*AªÂÑ ¡J™·É"ÏòåÍaÊÂà%( #CsòJPB)Óp’ÃÒöŽÃ¢Ñ£RCðz„ž‡a·ø°Òi(Mc–;Ž„P3 *—nÛN8z—Ä𨭛ËSϪ1»]bÓiÙ{qŒØ½íâ¤Nõ6úa¾H+Ûžý`¥„€5žg熀{ò•'R1¨—ŽìïÚx€lÒÉéÎM—ËGòÚ†°ŸZ¤H(ë]q«m(ç¦0ËÃ’µÃ)ÏF\¯Rñ#8Àh}‰qO\ŒlQ1ц@;è^Ì;ùàž¤ÛT1¶”@åaDÙ,Jz‡pRTÄLÓ¬u5â¨\Ù¡„šäWR)V8²ˆH½#j,®>‘#à·Ö’nF˜‡R޵*&>‹(øïɯ"ê¶L«àÀ0"xÐfHÕ”U•dÒ·DSš1+ É,&Rš'ÝwÐef/ÖB•#†À¤v‰¦ÿxôµZ6"•IÅ­÷pOë¦P‚'66Qáˆ^Ìì-BD^®ëák•;*5ˆ¬ ;ež sƒ8Å’°V°T;$¾O/WËëÇ<+t$xwP#…‚ãü›CLÀ+ðÀ¯CÇÁSË^¼4)m¤Pë#Íei.žëâ}G1”îv—‡#âD#<—µ¢hù(–ä€Ë|ñ€† T™"¹ìœuRAVCÁ6pü Þ) ;¨™0/¼6<æEœkð9q ž€PÌG™Kü†^æ×øª„Á*Ù“cÒøö \+m– ‘ˆŽ®>2_ûqÛ8±Êê‡Fÿd‘«²O6Oo…Û.B+§TNŽÊGÀ»n¯&à=%¡—·I±¹œ,ÃÉÖÀh¾sh‡yú›â¡Ñÿ1Åî¡AÆ@åܨ|h‡y÷ª·Õ ½A-V©I${äBÑG¤æ†‘š"a}²]DR”é‚8I:Od›Oõ(Ù†BeìCìd¢¹+“Oâw`ò‰¶8b:’Ëøe+Ll^½Á£q1W"dî¹W“é½>16 imì’ Œ·šÐ-l¾£­Üƒd½ó¼2¦¬ÊµðàDæ5„C1aÙ«c¦óáæ% ©*©PF¶¶)#½°¯†Ø)U‡WT®EÖ„$[Ö{ fXU$/˜çÁ¥ì yF.ŸÎ£4ó„* Q¡wt7Ï´È.¡a) Oi\ââ-­E_åz4ZñÙð+ââwèìÖ‹ãeô§l׉Cß™LœN¢Ü>¤—}ª6Ç;½ññ8`µÑ#ÜÆ‘Œ8‡F¿‰M›º–à ˆÈF\Ù“¨ùÉDòPÍà1÷‘¸ö¡êÚ‹Ðo¢k@®ÊÛQÍø‘ óÜ8àƒa®/ÖNœ·He¦ÔïžïÂqÍO&’4•oNåâUcXK”ñ»2(TÄSQvý6äÊ).&i×Áqž¤ ¨°à%O%\ ÆŠ¤9,pÏlõ"¸6§¢NÕÁi*¸0S`Ž8-Ï ˜‡LZNp]RŠƒB9»óIBZ¥>HkHZ7ˆxˆ(/Eèh •ó 6fÌÚ^¡¾(BÌ(,€˜q²§€©÷KÄ< σy“+ŠsRBTeð¬ ÃMT À°öÈ)1ÏÔ¢@5Y™qÔV >AdC3E\x38ÌH_È JR¿0ìYlR§€Åæ«9S"²T'6‰Ò7ö =„ˆ°CbI˜$9nssò/µæŽ ìÊ—CéªD{az•,)Žæå®pô¶G„(Kïá.ØfIh™}õ95 +Ö-ky9Õr«Ž”Hq[&Z\IΣçáѰ.E0;\æKa&„GKw¹cU>DË$“»'ä{Z%pu3lJࣇÑ[2„uCÊàÆ~j8šfZNàóÁ `ðÚ–äB¬×r»H?yÿh1¡8´éî·l¡‡„=r4×71ûx)Ú…náÑ›ôëá^F€`²n"Š) øaªø0&Ù…i³¼Ã’L†³¤Å£ŒË¨Lᆄþýñ‚´ve¼ÀxÕ¸Yô"³y·Þ¼ÐHz&T¶üM亰ˆ•(¯”•1T9Ñ<¦Àÿ’2]жÏ£‹‡-™sÙPæuÊj8e*ýŠÉ¿é¢Z‚’¦áÕŒ ÂÌW4ïX¸,€lòÝÓªn f*Nî¯èótI¥ü09aœÚ ¨2Ä ß>¦‡® {…/Þ´}1êÂc½s’j#ëmÃG ï!)Æ€…ï„TßÞ%·h‡¬9™úÂØˆ—-0C¹}7”bU[Öô™A·c\d”ÉÈJ^d>“Ê—Ò¿1 ¡ãD/Ü_·—ÒdpN×—Òi/Qo…ܹe`oUyšÃÃÝÁÂ@<[ Ï{×e4_FkaªPE¶ÅI@åP†©3ÖÓæÂ7J`主ҎøøCV¼ö¸»1sÆDÂHËõý4©À+-0¾ë´2C 3¥H)-‰¹Y€)Ó…sÑFbd—~ªF>¶»QŸ1¹PfýÄÉ­hÔ#sß#õD„ô‹œì’„m QO£‡6˜0 ;cÿRDÂ`$~›ª¥†ËŠáŒñ[j­.tÞ3“Öö˜ès `«‹NÛ›{ò ¶ `ZjàVžwn6îÄ4ƒ°îôÚâb@¤ÍÜ)ØðµyÚ}À!ø<§ W%Jçtö–žN°GÌR}€² !/²®-‹RŸ cÙÞ3&ÑŽàõ¹Û·¿&e¢&ºÄü9ç/©S3×å;¬nW"›Æ”Hûc2¿§®Î!³QGåP&2×l!!6ë›åÊFüËÄèC´š€€ÊÜÙ³g{ûN‰¢Ñqב„aÏ÷Ü»_ö1ˆ!z¥>í5 Á$lq⪾&ÝQµ³9~‚È®[œà«\˜¨;å¹L{=åuÓ•*Tq〟 ²ƒ*îG õWƒ=×PgN¡ózÇ¥ÚŽ·Œùäèß"Ý¿“&„(® é™gsɳ6|Ú¸R' äñÔðd”0e+©.)"az+®cŠCÊ0Õã2Ëxm8 ÒœÆø–®’w‘÷þ·C;í´ÓD<¬OTÅiú×ÑÇgß:èÑÇG¯7nšÑ„ŒxšGqÅ ß±„úã/䪔ªIŒ†‹Ï3Øç™7 Áó`øL¨õrù[ËÊGÑ÷*8”Nù¸Ad{Û&ŠVÄUQõcœiËð˜RKËeù,I©ôâ;ÒÓ–è ô ÇçÁORu«Òø´ñ~ ß1xÕðL îCøa<£%$&£bÚ1í¹Ë—‡±Þ WÀ ‚+8}‰Ðóe$ßžÐq—¯×ÃŽ~fÞÓÞK?³ƒÕ@Vãn½ñÑ c’z<Šp&]@OY–‹ JØü´ÊF½X“Lªûh€7í«ìîî·®Û®ÿœ¿ÕûónÿÓÒVDß—³¥7”¹dªIƒ;ë›Ã©]Ý\l …b&¶eÅú¢Û¤Ë‰€wÓ'æ}÷ŽçvðÁ¹®3ó˜¥|‹¹µ}ìv:-qçàh]ŽÝÓ’2¸XÕm}²Áî‚çãü™m(<|§“i*hëÅÚ²×ü^¯xh4F|Ц‚(‘#xVϵÓ|ì ÀH¨`¶hÇçCßEV^T»”.à ƒgãENøéüéôŽî³$ endstream endobj 1512 0 obj 5423 endobj 1516 0 obj [18 /XYZ 32.2500000 257.750000 0] endobj 1517 0 obj [18 /XYZ 38.2500000 773.750000 0] endobj 1518 0 obj [18 /XYZ 38.2500000 773.750000 0] endobj 1519 0 obj [18 /XYZ 38.2500000 624.500000 0] endobj 1520 0 obj [18 /XYZ 38.2500000 624.500000 0] endobj 1521 0 obj [18 /XYZ 31.5000000 258.500000 0] endobj 1522 0 obj [18 /XYZ 31.5000000 474.500000 0] endobj 1523 0 obj [18 /XYZ 32.2500000 473.750000 0] endobj 1524 0 obj [18 /XYZ 31.5000000 308 0] endobj 1525 0 obj [18 /XYZ 32.2500000 306.500000 0] endobj 1526 0 obj << /Type /Annot /Subtype /Link /Rect [179.250000 342.500000 197.250000 349.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11 >> endobj 1527 0 obj << /Type /Annot /Subtype /Link /Rect [307.500000 342.500000 325.500000 349.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14 >> endobj 1528 0 obj << /Type /Annot /Subtype /Link /Rect [435.750000 342.500000 453.750000 349.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17 >> endobj 1529 0 obj << /Type /Annot /Subtype /Link /Rect [139.500000 211.250000 164.250000 218 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/autoconf/) >> >> endobj 1530 0 obj << /Type /Annot /Subtype /Link /Rect [168 211.250000 195 218 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/automake/) >> >> endobj 1531 0 obj << /Type /Annot /Subtype /Link /Rect [199.500000 211.250000 216.750000 218 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/libtool/) >> >> endobj 1532 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 203.750000 252.750000 210.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html#ax_pkg_swig) >> >> endobj 1533 0 obj << /Type /Annot /Subtype /Link /Rect [492.750000 203.750000 537.750000 210.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/autoconf-archive/) >> >> endobj 1534 0 obj << /Type /Annot /Subtype /Link /Rect [223.500000 182.750000 242.250000 189.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://cmake.org) >> >> endobj 1515 0 obj << /Type /Page /Parent 2 0 R /Contents 1535 0 R /Resources 1537 0 R /Annots 1538 0 R /MediaBox [0 0 595 842] >> endobj 1537 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 1538 0 obj [ 1526 0 R 1527 0 R 1528 0 R 1529 0 R 1530 0 R 1531 0 R 1532 0 R 1533 0 R 1534 0 R ] endobj 1535 0 obj << /Length 1536 0 R /Filter /FlateDecode >> stream xœí]É®ä8vÝ¿¯ˆu%šÃ@NÏ€™€ /Œj·®†Ó½ðï[Šâ)J<ï’’"Ãwf†$Žw潇¿þË·ÿ<ý÷?N¿~úö?§ß†??}{)ÎuY\ÿïÔÿ÷Ëýº9?ÕMyúí÷—§/__¾vÿûãåúÁ·OÿÖýíÿNúô¯ÝÿÿõôÇÿè~üÓðRÿÂï/µª»?ÿvù³­U÷·âögÿû_^þý§¿÷-ŽÝ ƒqÿý‹ªmÝô£XèùÇË8Kuùï¿ýýå×ëü£:1¶-«“²ÆžTkõéÿëåÏ]ócãŹ©tmË¢màß¹®kÝõ]UåIé¶Fa']_þ“h\‰7ÝVMª¦/£–^e*l;é6—Ee’mó[ãâ{QšªJÕôeÔi¶9ÐvÚm¶Mq].Ý Ré»5.¿ueS5}µôz ÛŒÛî¶sø?øw®ç¦ë¶Qì³ÝÿÌ*‹dýVº§ê ú5­…ý¶V©Žzêâ:¸§“ª2ƒ¤1­8ë¼5.NßuaRqåuÔÒëqeiÛ_#ÚÀã¸þl¶?~ùõµc«öôýÏÝÀ®ý]þøþû‹®N¿tB½(Oßÿtú§¢PŸÿùôý¯/ª_¥Ëëè®OŠúò¤<ëêúèíI%úM‹¾Ñåõs®US;­ £Vç²5ÎePkª‚O¾­è Ÿà™*¿:êãõ}®®Ëó6‚¨5¥.Oª³Q—oOŒ‚£þW‡˜i1¬uunÚ¢´¦¸?:€»]¼^ž|ùÞñéûx¬=©jŽÇlqá1k†í•+Ús=Ë•Â͹´•Gá×ošq™&´2÷¤A­á'þ7·ì•äíÙšÚ%‘âz‚›/à` ‹Z³ÕÐZ1i­ñ‹‡d ¸Jð ÞÀÊZØ^.¼(ø5ÊB£åðMg dž׀ÚJ8jÝ@b‚£$D9NtU?f”x¾,œÐ7¦;ÝÂ!áÁB6ѵNЧofHúÓM&^·ð]ƒÍµƒÅø·†ùõƒ/ÕJÔÈ` ¨ƒÎ®/€F¨Ë‹Fh+WC·ç«~žòßÌ“A§Î<ѶŸhµðÄ‚ôë<¿ ÊjwE 8žAîÌ=1ð œ÷@3sO*øä \+¸E ¿û¨àl-0Ÿð õ'øäsüê`Š Œíua·s0ªRå“QF}[‘káÁOvmm0…â flƨ?Í(Bi)¬Îð|ð¨ews ¤x,¹îË4¼nXî 5°:xp?xlxݰJ'4 ^뀞Âtç³cSHáƒ\¢«|F…±O£Â5*n+²£¯V àB3ÝO£61;öƒ­ÁžMj°À&Z ¬Î!w;`¦a¹“Q5•ãQÅS5 ªé¶"»±x²B­‡N-t‹5¦r,Ÿ0?‡‰ÇàÀ-Ñ„kcð7pu,”v“– &1bE5Ó\ÑÀÑÅ­i¬Áˆ™Z¢5 ùÇÂÕ1rârQl´j–|x eð“@Ô//lMc•…†F#„0Q`² ´¿ÁOÆÀ£fžXÌ2Øì´LäSTmŒ]P9›S±Úe"­êE¯vˆadNSŸgnsx4žÁ#ÀÖTà ·FXÕ>ö&ÁÒ‡.á2ò³¹•TfŒNmϵosx8®Å<ƒy“É)Âém›¹!R£Í‚ €‰f¦4GêÑæƒ³›ÅR)–Å¥Á:žâr—·Ù ØÎë'Zƒ=Ãy1»0Tç§åÚAŒ•j™(Žùä §* §ŠYW³3k°¹EÞmœ›Œ+Q±¸e°2ñ7²(šØ³Y2DâüŠ%àØ¨'¸ê%06\߆« 0½å+Â,ë[§OëT»+”Í3j¯ü£Ù_OHÙ}Û ÛCÊsOw[67Ї§×îŠloC&±^r¸„U1‚0NÏφÔbýË[¢ëÅ)0özë1Pæ¶öƒŸEcæ SÝop=2áïZËÈL¶z2ÓŽ˜é ¯¢ƒEx'£CF¯ÊE"ßžÑv2~ðDÊîö^2ž¢Ššf„Ñ àÏ3P• !zÎä»Þµ¾Œìz­ÖÚN–Nßê¦6†ƒéáŸæÀ¡úQ6ÅMá`ÌÙX3—;[+ e„v™ù¦Eߌ9ú•¯µ”=O ctü“1kúäfÎM«®cªÏmãÏãÍp0ÚæFç>0§ª'™±æsü7ÃÉU7‚B]¾Zñ$0¶ >Ñp ¸?ð ÞmÜO 5¸?™ÖÄnã5À´ƒg )10‚LBMySs¸ ]½HX+¸Ÿ\€óÅ™GÙ:ïíë}ò`%‡OÂu}1¥-²ÅâX ¸c¦è…`Æ!~ñ>¨’\ÄË }1uEÚ,Bð†‰Ö¼RT¸ˆ,E=VJ€ ­](+Mb€{&\ÁöiœÍ…_"}LaèdA'ýÉ‚Œ€L %˜³ýÈ¢`Ó«\8·¾D•21EqBî$¦æU`ì…€v#ðý¨òz•F>Ò"MJÈ‚¢ª]í¹½7 bFk¢ ›Âqc„Çz´±€ ÀÀ¥¹ÊÌ Æ„< ¼(ØôcЮð®çÂ, ðD0¯«|_iÕ·"oˆGbÆCHãKü„12›t¢€ ÇŒ,1ч@ô†¬KH­úz_ǹ2ö2«J¡J؈”ÜŸ¨<·ÁrŸ€²_Þïði¨)iTÍÉ”m¡Ï9òûøosnš¢>UÕåO¥®¿–§ª¼¼Ø¿{ýá·—Êž•juÓ¨ñã4aî;è^¿þ[]>:y~—/ÜAtï4NÛÁ_^>þ!;4áÝÞR•1þ$cÈå±úÀ&#옰aømÄ5~îèßÅ Z¹ ªõƒjëñO÷ƒÏ ý;ÆiÂÜw02¨.æTµ^Ý>ƒöï4NÛAz½%®3Á/Š ±­«¡ì"Î{$Ð벡°‰Z² ¦3ehßLã² ÞÜÄ%”’¶pe…Us²Â•»|YÑ¿cœ&Ì}£¬0휬0×A÷ƒ/+úw§‰Æí ½¬¸åå3Ê<Â&¤ümbÓ§+zõd²!î\ᑵÈ%?׃dÇÜ{ÀH>檑dâ¬l]qVsâ¬Òž´é~ðÅYÿŽqš0÷Œâ¬læÄYY{t?øâ¬§qšhÜÒ‹³·ê¨Ž©¬‚eÃyMW7.iÔíitûçî\÷ƒOý;ÆiÂÜw0’F]Ï‘F]yt?ø¤Ñ¿Ó8M4néI£Yq "ëýM8×c”¡ö³ó»MÅP AXo­ˆ §¶v…SÛL…SUx!¯j6wòåúŽqš0÷ŒÂ©­æ„SëíÚr"œúw§‰Æí µpêæx‹0C·8æ(ž¸`‚Ê£ÍtÕ^àR¶Cû&{–öê’M£Nd8Uξ—MÝ¿ë9ÙäEû.?ø²©Ç8M˜û®²©ûw9•MݯÖïÀz²éúNã4Ѹ¤—M·b­§lŠÃ«gÂbÌ=LV9¶I’q)]®3Õ×yq³Ë>×õï§ sßÁÈuÆÎq1~fÂuý;ÓDãvžëÞîDÍXfò d³)—8õ¶–°Ð7;ß>?‰ *”¹«ðÑ©˜ºŠ=ó ATå¾o¨öGϬ°¨%¿›@zÊÚÓºŠˆÉW•MÀ®è|r…0W”Ðx•²!KëÚe9gCz‡—|²­Æ[澃ц,Íœ Yj¿=±!ËÑj¼5Ѹ¤·!o—Xº |kØz– ë;šÄ­6.¡ÕvŽÐ¼£Ë>¡õï§ sßÁHhµž#´Zù¨ ¡õï4NÛAzB«o %\ÂLÆÑ1Љâd¦t)` 3Ñ6ÆÁ‘¦´‘;:w¯ŠV» É î~-=þlýœàë;ÆiÂÜw0 €v&'¸ûÕ? iýœàë;ÓDãv^´cNp¶hÅdãE¡I˜ºª@‰‰/0n$ïKC3—" J™ñÌkÀÿÙa%T\k²µLŸ l…O×]R̤yæñCÕÇ TáÚ+"7æè. $™ë²EN:™R§\­)ªì&F‹š-j0V1ÂØ¸Ò8³»é…ì±~„ýo®¿-Õý{ù¶ÊÔUa¥òVm}b+…À…—¨5@ ¢L3@ ?°æHŒ>¶>ÃZä<_øœý)¿çÁmm¹üÖ^0”ßýù]·fkùÝá)¿3̇§ü~Êï§üv%‘*šz#î] øeˆŽWÊ”[‹ðËX†§ÀU· -®ßÞL؉ÊÊyáÒÁLpÁ1S \d†O©¥~ d¼ýŒ²X£Ûa€F¬,“)31˶Lj Φ§PÄʶ­¯ÕñÉTs2û€óºDÚ×—'Ë”nˆ&æQ™²É‰¢^R[B|2g9ÔúáR> ¢ËPãó‹Î‡ºÓP®Â ÙºFY –Á ‰áh6` ó-¡Êm‡(ê›Ê%¨GD: ‹ÿw {ä²þ¨:;“‹NÙ¬[en¿Ë”ÄgÃÞÌT—(D·ÞâšÊ£ÿq‰ˆÓ‡ûš2¤W&q#’m”$o<åíƺ»*|¹¬Á”ÜÇ(aÑ€ìž1>cÜw&í™Qñ¯Ç0ÆêÙ%F—°‘™ ±²LOfó0¡ž«´qõÜ4@JxÍx‡(?'v‹^¹ƒ›BÒží€÷ð‰³]JkfЦÉÞr(“‰·Râ¤XX’ ŒL=;¢æQVÈ:ëö‘½`vǬƒDÚ¤÷ ‹¶vÕ%¾s)@ÉÅu1hÊë·zž¨â¦ íDÁGd‘¦¶7—ó‰ â¥@eòŸ.*Ä7Tœ¨7+ÂäiNfdDÕþ¢²9×;pÛ–’¤kí±å¡îÁÎ패k`4}Ć'Ã88‚$êðìÀ?àqNr§‚Jw&Ü´§ Úälùé›'ïG›H õjÝúæn®K%’ecÒšߌÉþ”I}‘urE6cmw(͘’'¶e_øQÍIÛùÊ¿ ÷—Öí±_ë™,W‚¨ÎÆw$YÁoZôÍJSõ”³ÈžÁå‰3O† ªÏmã`ØÔ™àÖ™kíÓH›“­û [kÑêà±™pE_ã×Zv ððê ¨ds+ªá|>‰®A iï^· >ùB´wA©Õÿìj[wg\Jû^L(]´ª>uäJ„P4s sP‡˜°Û5öð0EâÝñ‹Ž"@&r&Z¦ÆÜBYÂö.Æf§6Œq¼™EYŸu¸}âFz¿·Ô­§ùdDŠƒEjªEϱGÇ8³Ô ×}ÊL¡tï•Oœeƨ˜âëûj{Û"‚³E‹Ô%R"åÒD&ÄŠ‚ŸLç"þÄn.’æ;Yë©ÄUb"7©Lä[À"f2—wxÁ-bqFb©må²`=`gcæÆ‰ò¹€»µ-?“‡«Œjr“¾¨ûFÕ0$Bh i!0a¨ê/ÈJ‹9°1:–ædŒKṎcn6ŸÃ“æRÎ S]'[;,‹¶¸}qcÊN4–Ô•bLÁÜú< šbó[•dRþà«;¬qŠ È2HR¾”úܰš§¶ÕFŠõÑh{Ç4[7¤\Ôu$Óˆ:"]H–PB“)Ûá0Éþ°ÒóÜË—2Š«ZëÅH(÷å$f¸ÚÇ,xÛQdsÞZ^$àô!E³Œý%ƒ‘·UøãÛ¡R~Ï1š\™™Ð‰ß{‰P®7…vÙþiåÍM#SýiJ·Ç¸úƒ~óÁ ";‘Žk`N¼Ö°¢5œG¨fà3ÒçF×z8È©|Î×ú\Ù É­Ø—æUѳpåÜ—Àp}C›š·Li<æÚ¼"°P°LF„¤Kkˆò•ÁpInjZã3ÆÃVާ®Ø­k¤òD²yÁ²7óäZë$)>8ðúc’ÍŽrÞœ&å"J #ÉÆMd±~³]Ð*›õ*Xز ÃÖ®J ‰*¬@:³«Y/1˜Ë5;ªÆ®ã§i :§)8’—%a-Y&ð©Ä•­îË äË=6LEœ¼8 ï“¶øÂs©üx °ÙÄ®Ùf÷še—ä¢&eàÈG¶øbûJ'ÑÌ&81À•¤*wdj´ >d6¦hÙ±`Œ²Þ;ÕcŽôÓÞº‘írÑQ‰”¥EíRëS!¼O!0ÞZÀ÷ËUŤ£½"f Þu[Hî ¤H$+ɘûÍRM\¥˜ñ+Üëõú(@æ²î/ö¯ðÝxlLº bi †I3ÂbÖfR©—䪎Iϕʕ6ãÚU¦„¦¨(ƒ˜)ŒOìZ„ôº0ù=+‡‹¯¿¬baê]oî¹ãÿíw(âœléæ¶›à¼®œš®\¿ýüËó…¸éþqÿÃß^¾Dk™ÜÁÙ”@ ôÓv´c®MÜ 3…H‚,-SH?M‡B¬ÝœB¬µ«Ùv—´cËÊÀqe7¼çR~™TúY9¤RfkRé‡à¬4ÊøŽ¨GÊ3q£<.TqAGƬ•¬Ùü”(u¨h°[Æ1aj$E¡¡ð=‹%N|ÉO.Çds‚?¢AÆa²FÓ®˜6˜ô Ü4žù” >+œa$ª(Ž·Ì­;›1Û¾ò>”U"{m<¯a˜o{¾LÉQ6=¹•Mž Ë9ódsß| úià“ >iFRÜëyú”aaÞùæÙ=ÓK@¼,Æ©„Öåøà +û Rhµà'øÐ›y‚Å tÃÝøð«&»~ˆ‰<°)ž`àììHF«ù wYȈ³bl9¬‡—£¶ÇO6¶¯ðU(d¦PÌØµ„ÍOx„Éw DL `DqÀ¬Â©’_àØžÛã[z8Zœz=ú m›û6‰…¶«Üwãפ5œ+ãÍ;—ݬ¡u<¬ÈÜŸ|„cƒ5µªáh…ܶÜ_SÛçu£½í}l/sW)ªÏÒô°jÀ@ Š“,)z9…}Êԃ˿ $},–¹sg¯¶ pž‰äËb%%.½[Ú¸GLH|²XÙ>Ól“ÐŽÒ¦u¹áápð7ò†—ý†Ë.9žƒ2U±µëpÃJ#ë:4y¦o©íâ(©ïÍчÝ,kíPÆuÞ{Bãfš Þ01¶’,„úޏK¥µ¬JWî'Õ!WÉGYÞjQeZ²im"¢ñ\™zÒ\µ‡BÙ<Ô°}¦˜ðëãVÌM¸L2Ô §¶ªëaR!²QþúøI €Jì¼ãþ‚M"¥öt"¾°OòbÙîÖ«*n§hµºÿa“S´Zy‹uÔT‘4Ô ‚NC xƒñsy°TÆnÀDkñ.ĨJ&è}÷WB³¾)Ϯ߱º$ÆÊ‹9f"4mæËí74΄Qˆ$ìß§û\®Lîu†•ÅÌzŸå [PBÝ-Èœm®¯òzÐZ®ô´ºYœóôœzýŽ11[L¬¹.›Ër/jAÄ còÊn†d˜ÔzJŠáMf|%"ÖJaMñ·7GÍ”Â?`²žˆj9‘;æ²¥œ‰^A’<¥k=-Æz€œ›=*óƒX›©N#¸Èé t¼9€êö1Ži!sÃsc{¦û™Dÿìà ,B¾Šõ·÷LûÀ|dG½Å•ÚwEs®6s…ôí-9ö_®°FÓe¿ïI"¡žÊƒÚªx‰Q&‹vbúY[/ïòzѵÉs ÌÀÔó@8ƒÚlŒG3›'r1Ñû\ÊBÄtÅ$º‘rÅñ¶H\Ä$|f³UqéA‹$÷Rd¶ŠR"€ÓD¡ŠcTÕžo|Ž€êc(3"ÃfQ9K"¸¥,çW«÷²Èñ.3Hz½—ËÙÜLØþÆ¡ÍnèÙóñïož“q\qÙã?îùä[ÂÝÞ/dlœLfbˆÌU^a–Ò¡ÔZ¹š•J-O{ål$þöxOØ#y<¬êòDD\(œ©*ª wƒÆ&D_Ù¢·¹ ë–“íª(iãü“”õ×û|žò,4¡rÿ#Ô?s ³ùÉ#Ƈ‚@ H}"hKÕÃÈJå¢ü#—.¤`‚÷pHR"ÝÍùbñkʲNíkÖ#Ya“îƒB @"× ªiܵ›Cö…ˆÈ> `ã{<0¶0îG¶5ˆ ¿1pÝnžYD?øžŒ¯ŒÇ†¿Á(×xlƒõ…=Û¥æñ¯12ö  âèîBf<ï" Ö£`®­žœœ†Keñäà–à…·ðÌ€,nMARVPÔü fgHx­cÃ,ƒEœÅàøX¨âQ3#€´cl>ưå;È?@–pñò˜‰ K ¥²Áýä"eÈšâÃcƒ«ƒûaÄ ÞÓÀþ@ñ”“Èó”þ‰¤ÿn̈(‚Å&µÁW|ÀÖ2’rSèCËëcàÖDÕn` °-|<Dçxáâ­Ç¬¹g6ÛÞGÇN$VF”;†gŠ£ºXIà=½#åî¿ÓŽfƒ$ýué…ç`Íl‚‰2çBõ)^§Û¥ ƒK8w.|¥žzæ¨ê:W}Ö—ÓÚ©YMŸ ¬®ÏCŠÙP»ŽÅÍôc–2VæÆö:Ìt’å6œšãÜë N¦¯¦üq\̓Þg¦¡pkð›áœPEM½~#[–àú¿w#võ@ÔFk<[¼Ñ¤»O§ñ“ÀÚ}AÄØ#8SÅûgDì3/þæã0‚!?cÍ<¶!¢4CÚ†œ¢à.v¯5ÞS‚{-n· þÆ3 P"îçîàåüºhÎêÚ¡#pòšÿ¢üzúúòÿÖÉ@ endstream endobj 1536 0 obj 7564 endobj 1540 0 obj [19 /XYZ 32.2500000 345.500000 0] endobj 1541 0 obj [19 /XYZ 32.2500000 254 0] endobj 1542 0 obj [19 /XYZ 38.2500000 193.250000 0] endobj 1543 0 obj [19 /XYZ 31.5000000 707.750000 0] endobj 1544 0 obj [19 /XYZ 31.5000000 659 0] endobj 1545 0 obj [19 /XYZ 31.5000000 546.500000 0] endobj 1546 0 obj [19 /XYZ 31.5000000 347 0] endobj 1547 0 obj [19 /XYZ 38.2500000 292.250000 0] endobj 1548 0 obj [19 /XYZ 32.2500000 707 0] endobj 1549 0 obj [19 /XYZ 37.5000000 121.250000 0] endobj 1550 0 obj [19 /XYZ 32.2500000 657.500000 0] endobj 1551 0 obj [19 /XYZ 31.5000000 255.500000 0] endobj 1552 0 obj [19 /XYZ 31.5000000 546.500000 0] endobj 1553 0 obj [19 /XYZ 38.2500000 193.250000 0] endobj 1554 0 obj [19 /XYZ 37.5000000 121.250000 0] endobj 1555 0 obj [19 /XYZ 37.5000000 84.5000000 0] endobj 1556 0 obj [19 /XYZ 37.5000000 84.5000000 0] endobj 1557 0 obj [19 /XYZ 38.2500000 292.250000 0] endobj 1558 0 obj << /Type /Annot /Subtype /Link /Rect [60 510.500000 122.250000 517.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_installation >> endobj 1559 0 obj << /Type /Annot /Subtype /Link /Rect [87 503 142.500000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_executable >> endobj 1560 0 obj << /Type /Annot /Subtype /Link /Rect [60 496.250000 129.750000 503 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 1561 0 obj << /Type /Annot /Subtype /Link /Rect [87 488.750000 228.750000 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_visual_studio >> endobj 1562 0 obj << /Type /Annot /Subtype /Link /Rect [114 482 121.500000 488.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_csharp >> endobj 1563 0 obj << /Type /Annot /Subtype /Link /Rect [114 474.500000 126.750000 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_java >> endobj 1564 0 obj << /Type /Annot /Subtype /Link /Rect [114 467.750000 124.500000 474.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_perl >> endobj 1565 0 obj << /Type /Annot /Subtype /Link /Rect [114 460.250000 132.750000 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_python >> endobj 1566 0 obj << /Type /Annot /Subtype /Link /Rect [114 453.500000 125.250000 460.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_tcl >> endobj 1567 0 obj << /Type /Annot /Subtype /Link /Rect [114 446 118.500000 452.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_r >> endobj 1568 0 obj << /Type /Annot /Subtype /Link /Rect [114 439.250000 127.500000 446 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_ruby >> endobj 1569 0 obj << /Type /Annot /Subtype /Link /Rect [87 431.750000 235.500000 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_other_compilers >> endobj 1570 0 obj << /Type /Annot /Subtype /Link /Rect [60 425 138 431.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin_mingw >> endobj 1571 0 obj << /Type /Annot /Subtype /Link /Rect [87 417.500000 167.250000 424.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_swig_exe >> endobj 1572 0 obj << /Type /Annot /Subtype /Link /Rect [114 410.750000 227.250000 417.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_mingw_msys >> endobj 1573 0 obj << /Type /Annot /Subtype /Link /Rect [114 403.250000 196.500000 410 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin >> endobj 1574 0 obj << /Type /Annot /Subtype /Link /Rect [114 396.500000 192.750000 403.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_building_alternatives >> endobj 1575 0 obj << /Type /Annot /Subtype /Link /Rect [87 389 218.250000 395.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples_cygwin >> endobj 1576 0 obj << /Type /Annot /Subtype /Link /Rect [60 382.250000 185.250000 389 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_interface_file >> endobj 1577 0 obj << /Type /Annot /Subtype /Link /Rect [180 299 249.750000 305.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 1578 0 obj << /Type /Annot /Subtype /Link /Rect [63 263 143.250000 269.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_swig_exe >> endobj 1579 0 obj << /Type /Annot /Subtype /Link /Rect [485.250000 213.500000 548.250000 220.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples_cygwin >> endobj 1580 0 obj << /Type /Annot /Subtype /Link /Rect [174.750000 306.500000 212.250000 313.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org) >> >> endobj 1539 0 obj << /Type /Page /Parent 2 0 R /Contents 1581 0 R /Resources 1583 0 R /Annots 1584 0 R /MediaBox [0 0 595 842] >> endobj 1583 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 1584 0 obj [ 1558 0 R 1559 0 R 1560 0 R 1561 0 R 1562 0 R 1563 0 R 1564 0 R 1565 0 R 1566 0 R 1567 0 R 1568 0 R 1569 0 R 1570 0 R 1571 0 R 1572 0 R 1573 0 R 1574 0 R 1575 0 R 1576 0 R 1577 0 R 1578 0 R 1579 0 R 1580 0 R ] endobj 1581 0 obj << /Length 1582 0 R /Filter /FlateDecode >> stream xœí]I¯ëÈuÞß_¡µßf $‹@àM ‹n #‹àÙŽa¸´½Èß$’’XäWb}:UEêʤû’b §Nyøáß~þïÃÿüóðןÿ÷ð}ø÷—Ÿßª÷¶®úÿNÿüþövïÃZW¾ÿúöÛá··ŸÞ~:þÿßÞú~þòÇÿú¿ƒ>üûñÿþzøÃþqøÑ鿾µª=þûoçw­:þWuù÷éù_Þþów‡¿ŸF§3ýû÷ÊYÛVqgæßÞÆ]ªó?ÿüþ÷·úýGMb×¹ƒ²ÆTgõázûóqøqðê½³Jµm«¦iõqžÆ4¥»ã”]=›æüÄàJzè¶2U¢¡ûUKÃC™FÇ~wÍð?øßÜÌî-eNؤÜa•RΫ›Î[WªkªÖYøßü¼µÒeçceâyM¡yûÍ deu=Ÿ÷§ˆØ5^)¿¾¥üú`sêÿ¥8õ3Çáçp}„Ymç#ç‡\u…œ §ªóÂìáf•öÈÞÇauNtXÞÈÛ9¬îˆE7«4û9¬7k6qRÝy»õñ ºa…»8¥eBõì·jàkçãþÈ{b)å@§*UBþtÆÖÞ¼ÔiÏpî Ú50t >ÿòöÃÇõ–æðËŸBL?åù_¿úð{ÓtF~ùãá_ªJUÿzøå¯oÝ{£ëqÛ½±~ó¾ÁóüˆÞh¿ù†Þ˜OñûÁ«65üFCèàUã`èÀµYü „†u`4¼j8OC Üè¿i VÁµUp?ÕWø® ‚°Æk«ZøCîç…!!è`JwŠïv€VáÑ2̓a ½øÎõ£}ûåÈêR³©zÅæ^lêŦ6N„^lêŦh¿QÄÚ0&ÔÓ‹),^ 騆+à(f»ð|ôg8¼?;‡o=\~ƒá–“½7Ýf#¬…Ljß.>z|Xp,z0ìýÙØ&x /Fñ­‚8Za ÁçƒYÁ.OAVXx6`Æ‚÷ƒßä$ÞÎm‡xãËçÁ ®…H!»…µ6,b¹ ËÊ/]†bŽf°H€± ³w¸‚š±F0:úÇÁ^ˆUr¤³tÓÿ0mÕh_l›ú¼Ÿ)¸w×UÓ7ƒ²ô¦‡­}·¦rô!¸ð©àh z£zÜw- £>yÃãÕÜE™w£:¾òyÈÒ7=¦›÷Ú6®}²ƒŽ©Ô8Üõ›̓WX>[xNý´Ä7ýý¬GP¯Á®ÊÆe઩àó‘Ào|±¾r ÊXiæÚ8ølýŸ d¼Ÿh%AÑ¢S²…ºò…]ƒëd•5X[ìü­3·>-”vuøŒáGŽAêTÕ{Óª•ü.ânX=Á«ÌÒb![¬ ƒ o3g b(º`Œç±šÀ;ŸÂ¸èzÅ¢R€€cÈJpòÒ[`ƒøÞÎäxúñä.!›;…œMØ\à~ö‡©ê÷ª3S°|‚ ìÁ¢ôøjCds~£°vEè4ÂloÒa}õÉt e¾"Út±=Ññ›] 3 Q  ÁƒS]2mÐn¡¾®çÛMr-§7~¹1îx0z.\¾!Ü` õ1Æ|Á4ˆËØÊS716aé,9kUJ{À}vÆóåoƒ ¾9¢ #Ëáµa¡_‚™Â 1<@0P ¹ú[wÇdfmXsdÄ FÐÁœ TXia$`,¼2š=ƒa… <Úžn?¥÷àoàb•ø®)0!·l´™rKJàœA›Q dUŒ4XÈ—Å‘Rü:—CY°×[FÅþ´æUüfvp/…þr¨—;h»,럈—ÒÝtÆ“,nÍñjÞqm&--}ÓÁo†yZänYm@Eeß}‰q÷XzC¬m´ý-ŒÖà}6ø&0ϸ6¼¸Ó!X)î Dñhøߌ:è&-}£ ¬ qrUj9 ·H¨ÖŽk)n–a˜FÔ˜m2µ¬œ#jë“õ·8ÃúˆáH$B9Ÿ;Žõ†8O ƒç¢¾ J¨ "ûa.V„òŒ—tïl“ÆËè)á¦NˆÐʇØÑ%ñD)ü…—ÑsfWJ6\NÖÀ0¼2J:¡0 ³>.BVOdÔ÷¹vFXí‹b"â³Cs3y´)àcS3v²£1¸š»De²@,.oIS£<†!ý´Í°×jvË‰Ë†×Æ°iÙëNiÅ™~„ .À>1eufˆõZ”xÌäÛ)g6Á0HÖŒ¿a{Gù(F{Â÷žQ6"âêÄ Æ(#ëï[/ëQyÊDŽkL\FŒ:ØêA˜( =såüàv¼Ø€|ÍÜ'(' Y›ÌTèT=e’”ï«é„ï.ÂåLqt|vÌÖgT%"ů^$S_ôúËÆ*&ާÞ@ÆBÄbE5Y”ÍÌ&[)“&)œe+z[± »^_ƒg>¹íQ«KÞ:! çÅaLÔ`µåH*ü‹Ù)#ôÍ´øLaáºñfŒ ÿ¿Á!Ñ*6>øµ~oì–¾ð²4J0ÊÍC”á̲açyp9 ’„vãk¼6$=pÒäÄÏTõHç‰Jš,eSˆ$Sà“Š5'AØîá¯ÂÄP¶tÓ Ô"ÕŠ2±&áÑryW@Mˆ8=¾‰ñ'­Ï­ÌV|R4(B6Xÿˆ””ŒÃê)ç ¬Y‰ÚÕ"b¤‘wÌŸã9€ÚÆ¢ ˜|Ò»©¸ ‰„\&ôrûå2ùÌLŽ„G8€ç[ÎÑ)ž"HÑJTi ð|† 0Ü™ÉóÀû!V}×…—ÒsbÇO1&" Ÿ·¨…ÊÃ-¼Y2„Ýä˜n®£™ÅΆÅ>ÍßÂþyFžfêž1^q"ä›Ù™7LI}Æö,ª˜„û§·œiû¬ˆÖMɸÿK†ÿ©¦ž÷\…$ô† o ÞqyAÑx3Ä=.¶œ—„ëÆÇ(¾ÌÁIØþb¸J.¯¾¨QØ&Ìä%ˆj¨ó"pŒ¹mp -(çë½)añI‚ Ik%:«e"íÌJ/ß.B6Uj§œ½¸ NÆÍªŒ¡Ä¤•Òß(4Öe…{v<eÏDºÊÖ°ô(Û]”õÿ0I)Ñ­‰Rª€U×L¹eê:)ÅÃeE„½òæ{*# 3•ç(H•ycê’1ñ¡Ñâzz[ ½¤†–bdKáFêÖËf…ˆÆ D\—dò„HªU3ÅÒ€kI–E¥‹gJ`N]¶f½Å£/e8•@s…&RIFv1¾TÙ²úÁ¢õ(ç s">ÏæËUkAÂQ¬L#9P¹¡÷$ü„Œµ­º)cÕ Ø6L…7å*›KMHa»Je‘©â^¼Qà&€)F´ë}’8g‘~‘† Só¦-£"å÷eÑ›¯™—Òšª•õ¬&²aì¢I8V3Ç$¯ íGNeíˆt)¸‡ÈéM|—îö¹b­â8ž§T7¹Jâ~çØî™©Gºl™±r·C6ý5]ƒ;W¬kÇ%`Ì ,­Jœ‹H‹Ålꇬ‘n—bú+ÔEÜ&7‹¡Àá"Mì‹çRÁ¤eË•ËÖÅ)ý€¿7%“q>—ùp‘Z1#d3Q^>Å•{D‚ºž¾­pióRwÚ„ZThgâœL¥\!ƒIx2C’)ù;¯—2ݵkdøFÉN6®‰hד•)o@¦t̆]“L+6‘tµóÇ‘B †ùúJ”/“i­œ4@X†{Ñ»1¬ ¹%Íž^ÞÃÀõ™šŒ_ó:—’ÑÕSðä H Q~¶ÆZÚaùlÛW³¹(“#Õ0‚–ls`ê5á]ÐX„`b<"¢ §_LH³hHÅ{±~µµ@Ð!F¥gbum=&ÿ ° uD}UxŒI¦rÜ`Û«wêÏæ$}~ñðû«lRç±­Ió¾ûÚ_WV}" LP‘4^>&P¸ef1'õú˜ªbªhx ^ˆ‹Eúä Loo3cíÞ]Ý=*­ëUirq)¹LS{lf×-qÊD`âYŒá`£Ž ŸFùö^ÅÊÎlÀw%›­ÈX·™²I²+Å$÷d¶IA‘-ÊËóŸ¢¶UÊjDrÚ€ü$ŸN5£ãÕý%e¹ÀÞ6õêË&Ú±BV€•:^.È¥¤GPk!?€H‹ÅÖpƒ/…„SHö)0æŠÑëÆ¾.XtÜ´èS ø·m<Ôx2qˆI‘(Ï­Šfz`31ºë.Ö‚ÇŒ^ 8a|Ý\œ&C KûÞvÍãÄ”GÛñÕõ M]´/"à7÷BrU7oßàý¨ŽXµ†ß|¹µY Öš€Û·øýŒâËü ·ÀhýNMõ®+³V‡óöW­·áäÎ×߇ëERó‹Ôêƒi­ßÏrÞ¯ãßæÝ¹ª=´ÕùßJ¹óÓúÐtçž~Û?øþÖ¸w¥:íœÓÞ1ü5Lpüyÿ·:tð>®ü N_x‹¨Ã‡!¦;øþö—·Ï¿›@CÍ ¡Ö‘tÖpíî × Ge˜‘©Ë·uÈf¡ÁÚl½9¦·›ò>…®ì×N¨ÖWV×êöÁßÞ~_yeÏX50>ÐýUèó°Çwjøi'¾?©†‹;þÆt“1†?Õx+Çýg‡é÷ÇwÓ9ŽNsÜ®ãü;ÃNçøËqç¹/¾ªÏ2tcÛý Ø*Ë2.62kQ*”ÉLJÿ–öt®n¼%¦²·þæ![4Ïmª)ÏmÔÏmŒÇ|ž{úM{;ÄðW5å¹u·ÄskçMp|àóÜã£~ãÓ”å¹Í¥faq#ØÇ»ûTÒÓYöžæ»–m6í…m¶Õ탵l³í<¶éª%¶é´ÇÒŽ|¶yúMÏ/côŽs\Øfë–ØfÛzsølóü;ÃNç(É6]}ÿ"JÌ M„˶Tgb*ý(WòÜúª¯û̳Þ#5ÄVä{òŽkFòf«îöÁHåiÁi¢ -`|I6à3ÿŠë«wdë<ÏxÓñÚ˜4f%’y8õë[mjÉH¡Z÷ü®kõñŸüéísv¦¦õÙºÜV—”p¨ñm%ÄNcž†¬/b‹³±Dp¶,KAQÚVPÈŽ4‰v?imªÛ“¯®*ï'íÔè'}‘¯ù’uaÝpí-ïÔÅsomwûàñ[®Ë{î;£_·|·|5þšKL„9KÝ— î½{Å-*©‚­¦D9XªARD×÷Õ†Üé¹ ‘qKyÇBÓÙzj¡él³`¡é¬›ZOº³=uba9ÿæl¹Ž1üYO-4µ šÎã[húߨév:GA MWÁ8Œ_> ˆã7{ö>F wå…ûpö:¼«/áa¶¿óµNÍ›NM®ïK6&dc︎pÕøç÷ˆo±kìÄ·Ø5õ‚o±kÚ©ë¯;ú'îÁóoÚÛ!†¿ìÄ·Ø5fÁ·Ø5ÚŸ@û¾ÅÓ£aæÆ·x3AAßb×>d.šỷ–ux©1üE¸MÝHå”­ÏÄVÂ>Vz;»öŒhzÂÕªäJQÕLoä9ûÒ92j‰ÚÏÖX¯?Mø$8ÿÌ×0+ñBy®Ò£›SmD"¤UŸÆ3õñQQ²Z¼hµ½9”"øS¹MD»(#!00†) ™Iåú€¢ÒžXU³vO%²’¨™ K{ÖÆL™ÙhT.Á—IxÙþž×ö—D$ ªG¸˜öÒLLFâLYR›v¢aÏæSÍE8ò²–”±«ÚzlSÄ=¼Ù2xq®r|§êõ’b&õ#[ÞÕ.û ŒwæWA´îúÜÊ”§g‚«¬½cL²graa£šéâvÈŒåë®FïW`lqbÜb£…æ„·ÑTzzóôž”2i2-­DWm°û-h»(R©óÑ]ZŒŒ•ÕÌØˆÌGÓfì0ã/Kßtè›AæZm6·ó¦šg ©í{çü7~ÓÀà7x4¼¸Ó‘N.ì QÙÑújýÞØ3R®ØOàä¾ÁÀUm”Cx\¾P׊!å­s„XÆ<“©ó¸H©Mk"ŵŠ/T®Ú˜{ò¢0'8—™~eŒ¸='Í–û˜Ž…é@LDbŒöÖÜ!´)]Xµš2I¦8"e´1à3WJ¶v±x!Ѿ²sZ/~Ä´„Æ«gFFxbÐ@‚æ°™8Ò»Zgœ‰™ ÆbdìÀ$´uÊôQ ‰þ U%—ö¦ä5‡Þ¸Ã‘!4—ÃßíDÞ\CÀO»CS_ÃÄϾ¿5öJÞÿÆL†0·Þÿ]qèÓ­?Á©*¦·ˆãoÜd7à‡ž†º^Çl/Í]„¬aŸXHÆb:–gDÝÝÙŸi“VsÙzuëS¼XLVÉ7@_f°uáeýˆ8¨‘Û±e¡@mÐÜù/¦SI*nöbôƒ@4qD–ÉêŽð8†¾;ó¡öšƒ|d07ŠÄÐwÚ;ââ~7&ê/1I¤è·¬^ˆÆLD!(ÆÔª&ì s‹Y.uD$QbáØhQÖEñFó{ÅO%÷'¤VØ:]^ÀÏ'™«î|6µä9|LÀ8Cè¯>è'|9¡ËµNPoGê"ë‰úúËà‡#Üc"†„La ÂDŒPÆ!ªí0ö*á¤Þ—»ÁŠjÛí±ÐhÓ)ç:œÒ3Þn _óF2ž_u‹5ŠO“œ6jvгïv¸²z_ýIô›}3ÜÕ¾wÚãßÎS]ÎÃ]Æóù›QDš¿cÌíh'^-Öïgh~Åf-†5 ŸÏøæ+„A¿ŸæÝœ‰ðüº-Œ¦j8ZOîÇÔ±À×Í¥Ãm¦ø¢'‰ ¬¶-N=”I·Î&®OK`ì.ÂAkë».>ð¼Ê®Æ×çzc¾¢k0 ñáÏ)ÙAÓLùÁÇ+üp7Ö??7KܶÙ1Þ åø__éQ6ÁLØÏŸK;e½%[;wÏ4·`à–®!ÃS†ŽHöP™rÕ) õ,SGó9„0Ùj™ ¸æùP˜ã{Cp$†vPNxQëójÆ%>JÆÀ/Tö¬2fà’0E½#˜Ë=þÞ¸æÜ}™ßFŒ^³z`Œ¨²JÙÌíËï£ç¯€{5Üû-ÿp§î œ³T´ë®í>ÚÛ%âNK˜R¬L…±ŒiÆ™ÂX_á7¸ðÒ`0m|´^(Å„‹h äs¡xÒ®K>EArtÇ]!9ºáÊwÁ7ƒè¥Õ,X@k¸wX@¬‚X”«¨•q—&Œë«ÂnºAû®ÛHl7Êbi¢Á©KÂ窪…C´#ЭTÅ4jõŒCš(…!\“)"›]´ˆO'r¶~LýÒ½µX±Í”ßeKhá\›Î¥ñeòÜÛfØOõ±gŒjØ¥‹I3Ú–Ë)í0„þÁô›]çÂËš+e’¢˜Ä]8ZÀ~ñ’¡¡ ´çJãóQQ±Ìj‚DÜ:;E«»G\2kü0‰¨yÀ”B)%[ÇÃ"?Èq-mD±("ƒŸÒ¯˜"¥³‹|/%5¹}ÌVœËŽ`Ë/Þ9DÝmâ" _¾ä\X+=EÎ=‡1Å+á3ûºtXÏÆ*%^£øˆøƒ‰êßmÈÆà0ýÅ UH¸dE.[#>¦W¨qX¸Å—D2 å™Ë#Ã&doë<ööÒ1Òž9*` Lì:Áb' ³–i=@"V‰ò ’¨j¨/0µ H‚+Ào´D¶và’`‰r+éÇ)­¸º¯BuÃasyC#HPD Ðu$*ÌÉvMÉeg“fÒ[ÓÔ˜O´As{âæiLg$J«ùÀ¶“âË=ÞúçUa’„M¤ìœÝg]^©ä iRûbé\”ñQÔ¼cêaB˜1±gzoÈÚ67S&d§Åsd«RIØAbJ%¸Ä´€Úrþ1SûãKVʆu»Z¥Øgcˆ}^w†äÁSÀga„f€ÏÄ^apáè¥òB%Xcß^(b¬RŒ4ƒ!º^æÃ[égœ«6ÓÓÔWº/Ò{eûrùìº*tÀâ2ëÛ–¢ êýôõ3z±CWc»2®¹}R"ƒý¼†©ª/–Â~Ç[ÛqFœ]ËÈKŒ„Ã$@åêÿ$ÊF„ëJÈŽF¦eý²5År‰åOÊ]R·ªŒhÅèÂÅ£ðÊÇE¤“é1¤^8Ò³^­ç/¿.êÁÜÀM*nz Øv£k0”dKbEh  ŽÃÂ…ð»›Ü–¼CŒí.ZÓ!æ+ñ Ó!†é;·º£ôײ}7³s‡½V†«7ÜîQÃìCTµhm`èà“Ã=jðù§­á› àù 6Œ¥Ñð-+Ü…n¬©ÜôÊ2†p j¬“6R½+p5<Ä{­–V@ k AFæxqS§ Á:°¼S|-ðÉaXãë§àª!tkƒ­µî´äæ­Úè»rRD8UƒY4…ëé|Š› Á(o2Hlr‰1þD„lÚ¨X²Q±ÛoG½ÍëÊTÏ$ú±|ØÚMIKÞy,ñã´3~ºX 'µŒÊ†w ‡Ä©ÏJ-RY´Œ“U¢,ã*ab¨Ü¼u¤"¨¿fÊÉò‘´F&÷79#êºÖcD Î"±ð3˜Š¶GŠñ¾ lŠP)¾ [ð%>Bƈ¢ß:ïnuz XH‡¬tKçÜB|úŒF ÄÍ{߯}>OÒÌæV{ðÈk‰ßäj—P8W3½q¯‹ŽÊfz —™cÔß‚ÜY©Ö.¡Ô<кkƒ˜¼É¬ã€ú&’•‹}²1î±AJhÊò"+ï0æ}ûDS>ý4&Ãb}説¦\®HEzKcíóç—‚÷Rð8ÁJ÷'¸à¥ÈV²89{C0ʳ°·æ%õÊÔÚ!‚¶ï{;MÚ:Ã*KFô*d’tD«OP-_Ò:d"(Bâtñ\þF™öñ¢Yï›éæ“`‹6ù(ÁgéM~íõ D†±1ôT¢Ï˦‹ÃDÇ£¥d—}}—+D€ŸV#â2Ù~¨Fá!:ËË ÌåÞòMb ¤0Rx€;2=›ˆbW¹" ô7Ñâ§-k@ hp[©ù4A7wO;e— íI8/£éËhÊrVÙN€ùêŒ)1ó™âûl)ç²|”¡"E7ñð Š–"T{ˆh¿Hrí¹©êÌb•é#¤ \Lè9¥™8SðKèx SiJ•! •hwcaê³åw¤RÑí”'¦®x†Ï;¢³Q1N+Êe˜ÂÀ‰R¢åm'1mÂs)zëGeã dj%§mdñql«8–ƒª4ʪ#õNnð&Dµ.Åû›IÒh/iÔJßkþ†m¢ó»+Âoˆ›#Û8‰ ‰~ƒ‹l;¤Î˜LU’[=Â6[î7®ömW%îDbÐgw€¾ˆ¶_Úg&œlümŒˆýò$½Áy>¥–,TÝLÓû-^ ˜E“ ŠUÉ’MÈæcìðŒ!D'Žã_¯z ‡¡2¾£:hJ»¨ª§D$ p›ÆÖ»9ÅçMÿ9üvÜ]pó?ÝûÁ è¸ÅÌ¢£Q©“ æpÍýUð.õ;j ×óý®Ï„ôöM¯`7ó7æëðÍ`ºœº#ˆ,Ìcî極ý8ìtî;kîÜU{]R«†­Ï68%ŠÉïÂ6 ~3 ´ŠÚz{E[áNÿ}\ñ¸rȵñAë{æÆ¥o>£ƒÀKÃÕœ‡܃`Tœ¥mÀ7y||Åö…¡'VìÇß|CddO÷¢­Ü»ê—¿î‚ ônà!÷øÇá§·ÿ´ Ç endstream endobj 1582 0 obj 9336 endobj 1586 0 obj [20 /XYZ 37.5000000 471.500000 0] endobj 1587 0 obj [20 /XYZ 37.5000000 603.500000 0] endobj 1588 0 obj [20 /XYZ 37.5000000 603.500000 0] endobj 1589 0 obj [20 /XYZ 38.2500000 407 0] endobj 1590 0 obj [20 /XYZ 31.5000000 370.250000 0] endobj 1591 0 obj [20 /XYZ 38.2500000 328.250000 0] endobj 1592 0 obj [20 /XYZ 38.2500000 328.250000 0] endobj 1593 0 obj [20 /XYZ 32.2500000 368.750000 0] endobj 1594 0 obj [20 /XYZ 37.5000000 741.500000 0] endobj 1595 0 obj [20 /XYZ 38.2500000 407 0] endobj 1596 0 obj [20 /XYZ 37.5000000 290.750000 0] endobj 1597 0 obj [20 /XYZ 37.5000000 669.500000 0] endobj 1598 0 obj [20 /XYZ 37.5000000 290.750000 0] endobj 1599 0 obj [20 /XYZ 37.5000000 537.500000 0] endobj 1600 0 obj [20 /XYZ 37.5000000 471.500000 0] endobj 1601 0 obj [20 /XYZ 37.5000000 741.500000 0] endobj 1602 0 obj [20 /XYZ 37.5000000 537.500000 0] endobj 1603 0 obj [20 /XYZ 37.5000000 669.500000 0] endobj 1604 0 obj << /Type /Annot /Subtype /Link /Rect [156.750000 342.500000 176.250000 349.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.cygwin.com) >> >> endobj 1605 0 obj << /Type /Annot /Subtype /Link /Rect [184.500000 342.500000 204 349.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mingw.org) >> >> endobj 1606 0 obj << /Type /Annot /Subtype /Link /Rect [150 256.250000 169.500000 263 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mingw.org) >> >> endobj 1607 0 obj << /Type /Annot /Subtype /Link /Rect [123.750000 228.500000 180 235.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/svn.html) >> >> endobj 1608 0 obj << /Type /Annot /Subtype /Link /Rect [172.500000 202.250000 234.750000 209 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mingw.org/download.shtml) >> >> endobj 1609 0 obj << /Type /Annot /Subtype /Link /Rect [243 202.250000 341.250000 209 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://sourceforge.net/projects/mingw/files/) >> >> endobj 1585 0 obj << /Type /Page /Parent 2 0 R /Contents 1610 0 R /Resources 1612 0 R /Annots 1613 0 R /MediaBox [0 0 595 842] >> endobj 1612 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1500 1500 0 R /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 1613 0 obj [ 1604 0 R 1605 0 R 1606 0 R 1607 0 R 1608 0 R 1609 0 R ] endobj 1610 0 obj << /Length 1611 0 R /Filter /FlateDecode >> stream xœí]IÜÈ•¾×¯È³Îfl\€Á*Ui€9$Àcy<†á6Fãƒÿ¾¹™d0¾Èä« ’I ÝU"{¼%Þòůÿñí¿/ÿû˯Ÿ¿ýßå‡ýùùÛKv-LÖý¹4?åÕþ~)JsùñÛËÏËÏ—¯/_ëÿÿ|é |ûüûú·^äå?ëÿþzùãÕÿd?j>øí¥EýóoíϪõoÙð³yþ——?üîò÷¦Æ¾9ۙ鿕–YÓ‹;-ÿ|éG)Ú¿ÿøñ÷—_»ñ/jD•¥Î.B+}iž^þÿ^þ\WßWž]ËÜþ¿Óš./ªªÊºëZ”o»²Ð&«Jø;­]¡õEg…*.B”ùEH1k»ýËS;Ý¥‰WwÛoö)Q²òÕýuA¸A2ù(øúýå×/¢nî"òË÷?×}ëšl|ÿí¥¦Š_jâ0æòýO—Ë2¥ÿýòý¯/Õ5—¦ï }cà›|y!`™WXFÁ2Eûæý{=Ý›ª Ì“¨Þd¢²Ïm“úªUÇe‡Îèwô—ɺéÙ5/DY¿¼½‘í›òZVY;îÛMh–‘l§[Du5:oº6zSve>Ôp–Æy‡'¶£2¤ËÛšÐN·ÍÌUÉR<:Rå.eY`ÃJ<¾f=Áíá …½x ( G(#îmëˆÌJgbʬ´DÀ%^ Ì©»˜â ®;nï“»#düyj§©}*Ä…g Ì›e媧W~ùÊ”pƒ¸–À\kưcìl#ýâ6Ü=¢oyxc (Ÿa—à~“p.îŠi†WkýaÅ«ΰ=Êþ ¢7BüF¢7v}Š×'؃Ößh¬úUèMVßàvpmÎŽ‚+' XΨ„*sk“PǽÎàŒ ¼rx¾À2xMáx]ÓUHSmˆ4ñ9Š@´'ÉÐHŸs)ÄÄ·•K°¥n÷q1¨7_î¨Ø>]âPæ¡ î[˼"M!ƒµY˯²-1g:¬¥i0ÀZªZGì·$y %+æÂ snLò˜ï™[|í`ò…}SxÅ>ˆÜL—ê4ødÇ7øœ†˜ÓÃi`hEðˆ‰`@`¯ÀeÆfƒÀÓ ß±÷®T{€¸¶€h|.˜d1ÂS0=`’а,Ƹ \–€ÿ÷0ž%òŽ"vfömÌxáˆIªÅ&¥šªÄ” ÛžqWBùÊ”œê/àE”3«8}'Äv“ÔÍ}‹§›„ƒB}›³ ·Ké‚Äk µO™ ~#z£¡™‡TÛ;›þ{Ƕ\‰LöB«&vyˆwô;]4ÔXO‡·uÛ|3åãû”¥©úOŸr$BÚ—@x_®ÂRÒq™-¤V²(ûî@¿ÆÆzì|Àî¬*ã2§ç˜Ù„Mò86õÁK†gŒðšB§Ú™~HgÕ¾YÀѼ³ODš¬^9ì»~ž¹>šT©Amß°Tâ3,ö€öœaî™ìv„°Â*ØkJUÑO<6zR||§—˜Pu>öÓ„šß„ú„^Æ]¹âv–.£3ã0¼Ì l·Ûvé©jmIµQ'\VL§ã” O AÝhúö†ÔH{ø=¼ÿìÌÉŒÁgT¡¦|æôŸÑqWþ3­z„ÏÓÆB¡>^gv‰þ;;ƒYÅÓ*3ýB» ^s­2+zå´Ñ½ª†QÒ ^¬ÓÆn¬ÇóFð!^,:Ék“ÌáüNkmå•òÞxÇ#aT0ø<š7ƈA ܲ7†¦Ö³W™+oÃÓKD$3çÝ(ÁóÊÁl\§—äù¼$>mÃK=Ím{(LñŽ¿MoCYNGv2â'`Ęï8°‡J_%˜-A¹ð ܰ¼S¬ ”œñ} Êa˜Ïâ¯9Ó’6éVYd9¦8i™åcðÚiㆱ« Sr*y˜sÖ«#>.ì%Â{ˆ `vÊã“XÁÕÏŽT˜SQˆ…²ÿ¢ËÓ²‹ ú <Ý¥ÞPË ›5à€…—Z·ˆÏ“åX•£}wgÏ$`À¹å4 "l¬·¯f½"\Ä1¤À•PT1ÌÉݵå¼_uÙ´áê1àYÂs5½GЮ#Û>°‰ãð+G"áu^Àð\.¨Î%>[òˆ~•‹óæàtöe^ šýÆQråLÈ{´°×”€ œ®ÏÅ!#¸o¸6¸Ú —ÌŽ!l … ‰Âx_SÊH >‡ÃY Ÿ™}")D`ƒæ#l0}<ÙÉžNö´_öÄ{i6eÞ0{ Äû= š}^íázp«$R¢}'‡žÏÌQ z#Ù‚7îF¦ÃÅz›NñȬ1„îÙ #&Ÿ.ÈP“? æŒl|¾ÈƘ¶Ba&‚]øÐþ†}œ³eÞxÜea¶#ݶÅ)D1¨Sê<ԉ̎Ÿô$A‰Q¯hÑSÆsF;ÒqW Ey^ì0K&2s'€£KˆD(sïZí´®Ð2Ëû!`û*V¡Ý#0ŸŽUöLx8£Ø5…í«Ix9òÉGJÁ2Ö¬ÎKìŸÀ9ÿ¸Øw‚}NØã“±ú40Röë¬è>-åvXgzgìÉÒˆ,m—d`+­fĘÙíÒEYy]”­û¥Ì‡Ê—þ€Òyçfc6W9sé½±–©PkKðÕ– Ê¥¦F… µcOQùU éÕè‹«š?ÞP;v·.kŽÇ†ƒøÆC)žQë¸÷ô-Ð<;xåà¼Ö‡°Ú¾ Ì\{ôÕ†©¤ŠM±*+§$kៅœçõH8¹ð5툼?gÞ&WÂEÌáÂÉ¢lW{ºxd³P–odL¬ÛˆDdá^“VÏ5eÀ‘ 6R [çªlÈÉ蔄eFRl‘šÙpÊÍ=ðÍe>tŠ[ðqm—åNõ®¤ŒÜ™k~ö`A2M*'ÚMq›ù÷ø\0xu@¸£}ð>+[è7ÉHPâø7Bš' Q891{€gTÃê'lkœ9?j¥Ã’º‰Þ4N-ávb‰—JŸüü8«UP°6 Np‡]š{%ñ§Û›¥µ<Á<\™Ðð’üe<⼊‚-ñx  Å̼¹p(Jz¸ J¼hܬõ€Ê"9nKøÀmãee•WÎQÐ…’ŒÏ†g›râ\-|ë°^À£G(È.x¤ÅØ2†?Äã‰+ÙIHR¬Áæ¼Ñ_”!|X£¢Háºëâ»Å7œI ·"eâ(ÒŠz’~NÜ`\ü¬­Û8­OL'0]úFàÈ€/Åz<’à‘Y9šá`EÒ!(§[,H±vA9‡>nê&èp¸3n“rÖÃü“"¢8.™ÃC_Bi‘Kqù挤MÌš:u×~Q®æÖ$|“« t ‡Å’p–óˆ™1Á B9¤Ÿ˜º÷1u¹²¶’›(¶h’km¥mM9ŽìÁôÇY^®çËÕmYb!£†êUq·—ù5Ÿ™à2*Ó'ñæîôKyÍu; îôûjéÖA”×YH nÙ†ëèY™>òmþ×f÷¾(f¢ÜÆÑzfEÂvú¬ùxœR¯%ê®ÍFÏ/j§O«®UÙ6ô±ñàÕ–±u‡Æ&£·¥³=Gr«•›k憃a?©Ý+²õÿšåþ²zÊHFÇ«r÷äð£( $ŸEÑ!¤÷“öÝìzc&!&L¢{òw ×µrØKâ£ÃÀI»±ŠùX›.7=.¯-¿ªÇP™ñƒ¿½| ðÚ8LºéÂt Ö¯»¡Ivˆn0UÆCÃ4¤# @Õƒ¢éádCè"K½!š.<¸!¶hNæ½x`fC#XAyü¥ ¯ 0U9ÝÕÇ$ ^óK*X;DÀ‘ÿ„mÅl8\K›á °Å*?EE!¤D= ]òN>‡N;&“ßF!FŠŽÆŠPЈï¦nXƒe‘¿¼øL Oè6“zÙi+ä¸1<áQqû2í¨K{:=ó†ËÊW´x$.Ì’/H¡Ãtð†,•¬”Q'Ö²,ªüî*/qPPè”"k)ŠÁJö¯ƒÜèÆâ˜ÝÀµ„„m½™;hcbVJåÐ?ÞÐ n@œ9ð„"‘ Ê„È#*DBX)öšÀ9}Á­¦Þ‰Å€—EA«¡”ùË`° Ó «N¹÷jÝ Ð ½×sQm¼*ʃØè\ /!Pîb¸0áòj³}+®•t¢#)HGpà^Ögð ]«tCÁžÀ7vÀÈdLb8 ‚(ÂÉϵTE’½3n¤= 'Ókª«¹);…9ƒl;véäVá½]®«|*ð˜½(ØÎA~ Ø,`¯)&¾M‡ù&+GPø¼ƒ¼aå_=O æJ†°‰†õϺ­WCæx:K<)¿›k.öý?›Ì™Y“!0¬‘“¦Öº®êVÁ£žŽÂGñK¬p`”ŒÒ•ñ‹(ò'¾L©»¤¼Á`K ?X ŽÄÀYðà¶bZˆ¸ke¡sÛ¶G3•òBB"i!5°¨l̺Júd³ðPÉz:‹ùŽà¾R8 ÆðȤ8£Ç%-ox;o¸T ƒ¢ ãÕXI¹¤˜ç(O -¦òôŒŠ|ˆß¬…µ·’¡œ%q™¢º,±ÙR‚îðj`Ù¸Ò-·€÷?˜îL1ã8/ös2Žûd0àDÙ(‹ÁòåN/} ˆRæk™ n"œßÙ_é83 (B,!ùÞ¼jËP ßà‘ H.} Úüćûè\Ÿ î…I ï8ÒÀÊa{ÎJ«ÐCÞÀ<¨E=è!omÜTNõWo¾)'U”ÓâkãyG¤!ŸNºK%´ 0{­» ÒñôÓ|B‘Ûû¼Í¢· {L.ð†$|wR\à© ßYk£œyaѶÚ+CÆÄ¢5z*ßHª"/Ü!”–°Œ ‘8íÊÇŠ¶ C°ë„ §3«íÌŒ‚p5+1¯E†Šz/8º¿ZeýmPÉüÕ$Ëáá€ïyIÕûó”C;åðf, h$½§.ò¶>®‘–2æQ©Ë{¼I¦µ¼¹«!kó^Þvò$fž´éƒÝZÇÜk^4A–¤\ý%¾j^·/d`òüá œÑq¯Y!õ0;D³®ããЃFJ.‹û ¤É&‡Ge½\ËlžUãJÚk °-‹´ Öº>†˜Œo­“â² Ùe»•žéS˜›|ºðÉîê&E°Qñ(x”õ~ÚiíXgiÌt½7 Ï¿£B(&h—ßѿ׬E³C:Ê«ñƒ&ª;Î.hšR= : \"ƒg@>8΀1”»3°ú=ϙˣçÍ[ák†Ër^ájà¼_•Ö¾Á´‚sÓá›@69ÎI~Eoðxp–·ÖÑÅ¥,¦K ˜¤V¾{kWйÌþΣÇ+’0¸( ”s Gæ8Å•ÞÄOqšàèÜnÍlK· j«DÜÄVd4ïYä9F—Šƒâ¾j#e\¼7¶`bÀL˜ãŠå•”WM0’-ÙTã)%u1. å ‡sTÍ1n ˆmÊn$ôlòÖÛ*“ŽN¾§˜Ÿ-cê$‚ŸrKƇó5Y#–ºCg5X$¢ÓTž;-Þ“ËûÒenÞú‚“ªŽ´–dÙ²ÿ~-‡ËaB~q¹Æ= Ûu«-ɦ47Ür4îó„k(–ÃgQ¶^›jðY#ÆRø,š.Le$«Á0%ñ™Bí‡øÎÔTwœPp.¦cŠÔ:yU*^ÕÏ„W•*OÍ«š.,;[œÑ–Ü¡')V«É´¼R<|€Q ›át7)jü¸k]XÍ‚JH ×r¹ìà]ù%Ùü©¼ËÂak^yœ`€7Ä‹HJ&eFïÁF·jñ‘þS"{’eËSb\Y²ÞÖJÑ^p$«"°fóú×½¤Ý¢„<ûEº¸‚Õ”E%ñ#q/® ™,ÄÌœìù]æ>öõ…nPWµTýQ¿ ;,W¡J ÅÚ>Íë……kµ~Ô|5·®Ã7fZ‡·ÑèÈÎÕ)/Ü6D[dÒúÛϾŽé8LØõm´!ZVý2$7:ª7D.Çkà ×ÏËË((Ûqß(í,‡x{˜:n7—ô”:´qvn{uÉtw·ß˜ifÜÆ@ýÕ#NùÌm#›QGóí§˜PÇøþ’tÔñÈ} ¬*¼û ïgÝÀ7^¿Ã2˜Öà{3ÓPjÜè¼ã†³Þ?>Þ‘k‡®[ õ)í·ß˜ifÜÆÀ;z ôiyS9m´XëÓ~4ߨ~fÞ1F[OÇ;œÚÀ‘ÎՒ憰™Cƒ0ú Ù'»IAeæ@)|$P*g{Ö\h¿1Ó:̸ŠÊGEé´Q?pI ù¦ëçPÇtiI ìãUaÖ Ž„ÈOŠdbÖWÒäBžÀþqLÊØ4_,£ÂªšRaýšLN)¤yàPa÷™ÖaÆm TX•>*¬ ‡ ë.6ߨޗ*¼µ‘ Mfb¢ÀŽ'Äݓ¡ÇPÆ {xY‡ÄºR.çZ‰¤1ß¶$]º“ò(Q:4.*»&cM,co¿1Ó:̸žÆ(<4n„c*j84Þ~cûYŒi|ÔFJ—ú˜4NñgÏB”±¾È«ÿÊ7‚þKà%§þ4¹#F« 'âϵ˜¦+';Ã’Ž ’§ÖZuŽˆæ{ @*ï:ñâþ®•ˆê ¼Q%ªM/Ë 3•v¤ue|ÒÚ ç36œo,m«A<ßê0ã6i])Ÿ´®Ü°ÄJΤõM<uLÇ‘TZçÙ°@§´ÞS9Š´&Àñؼ6løÙߦ\AÅÆësádç—œ»a¹˜ewߘifÜFÏësáËÎ…pÛ˜e·ßØ~N2€Gm¤äõ¢ÏÆ D3~ÐnžІRx­kXçKöÀ\ãÌÀ† þé-ý›Þ§ôäu›(hßò,÷ÄtUWj*]ví\IÁ—«ƒÀ E໵˜>‚ïÖ—£DðÉà©“ÁSx¯³O¥89Òñ©µ²h­1Y:Âq¥Xì3VèŒZ-V(¥¢kzÀém‰ è-n@Ñú‚i7  =ŽÅ'²iÃÙ.ïâÚ§Z™^äíK‘9˜š|ê+é1ÕØ¬rDßÁ½ ‡&/Ä·šùœ‰nf^ÌߺoÌ´3ncp&æ>Ä·NÍiWtÓƒ€î$1Ò»ïJƒ¯—¯/ÿ¢iÛò endstream endobj 1611 0 obj 6782 endobj 1615 0 obj [21 /XYZ 37.5000000 547.250000 0] endobj 1616 0 obj [21 /XYZ 38.2500000 511.250000 0] endobj 1617 0 obj [21 /XYZ 31.5000000 474.500000 0] endobj 1618 0 obj [21 /XYZ 31.5000000 122.750000 0] endobj 1619 0 obj [21 /XYZ 38.2500000 511.250000 0] endobj 1620 0 obj [21 /XYZ 31.5000000 122.750000 0] endobj 1621 0 obj [21 /XYZ 32.2500000 473 0] endobj 1622 0 obj [21 /XYZ 37.5000000 591.500000 0] endobj 1623 0 obj [21 /XYZ 37.5000000 591.500000 0] endobj 1624 0 obj [21 /XYZ 37.5000000 547.250000 0] endobj 1625 0 obj << /Type /Annot /Subtype /Link /Rect [60 86.7500000 153 93.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn2 >> endobj 1626 0 obj << /Type /Annot /Subtype /Link /Rect [60 79.2500000 168 86 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn3 >> endobj 1627 0 obj << /Type /Annot /Subtype /Link /Rect [87 72.5000000 135 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn4 >> endobj 1628 0 obj << /Type /Annot /Subtype /Link /Rect [87 65 127.500000 71.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn5 >> endobj 1629 0 obj << /Type /Annot /Subtype /Link /Rect [87 58.2500000 114 65 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn6 >> endobj 1630 0 obj << /Type /Annot /Subtype /Link /Rect [225.750000 749.750000 269.250000 756.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig) >> >> endobj 1631 0 obj << /Type /Annot /Subtype /Link /Rect [531 749.750000 548.250000 756.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/archive/master.zip) >> >> endobj 1632 0 obj << /Type /Annot /Subtype /Link /Rect [407.250000 686 423.750000 692.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.pcre.org) >> >> endobj 1614 0 obj << /Type /Page /Parent 2 0 R /Contents 1633 0 R /Resources 1635 0 R /Annots 1636 0 R /MediaBox [0 0 595 842] >> endobj 1635 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1636 0 obj [ 1625 0 R 1626 0 R 1627 0 R 1628 0 R 1629 0 R 1630 0 R 1631 0 R 1632 0 R ] endobj 1633 0 obj << /Length 1634 0 R /Filter /FlateDecode >> stream xœí]K¯ÛHzÝëWh=@«Y¾€ €íkÈ"€aY ²<™4݃8³Èß)%ñqJ¬£¯Š”.Û˜¹÷Šb±ø½ßõë¿|ûÏãÿãøë§oÿsüá~~úvÈNežuÿÛ¿Ü~ «“ûýXVùñLJŸÇŸ‡¯‡¯Íÿÿï["g<ã¥#ãY=¸”€Œ"2tMXtûI‡i¼vƒR÷ü{rÕ<¶°yc ¨ê8cÔͮʖÙFH©›‡”¶UJ¤••…õEñ}^º2y¬¥Ï»W …ò--‡ÏÚ–0ƈƒæº¸ôÒ:+ëX=ïZ£xm1”jeɪ±áÚòÕYkéó®Åµz‹P¼´>u^Ź׵ånrTÚ]G¹xi9|ÚÌ:ÀÈZ£ÅÅ—ÎU4i~Þµ¼5vÆ(^»¹OÕEVVþN[c:×´Æ’4ü~øõKc‰4vjqüþ×FIŸØýøÞ¾ZyüÅfeÝ\ýËñŸøê>~ÿÛ¡>:ïáí®|†W>¡+Ê¢+Þc¼®¦>†ï {ƒW*¸ƒÄ=ðM1D5|~ð=øMáL!Z„¿©ÎáJxÞ5¼Ç`èÀ{d)Þ³7 7Œ…noŸ¿7R1¶ ¨T¾Ë€—•º¿GÁ÷Á°öà”àMkàÈM;§ßåtc7Ãé"²œŽq’a΀ôÏðŒ,ghÈžçÀÕÔööKø=ës`e´£·3ŸÅ²·kÀ~yÇ}¥jžGO,ŠáU§ïìÉš®˜p åˆ{©²á^.ÔXùMc]Uª:^qô3wåz3'-ª%‹tÄ‘ŸŒ®ÔàŠ3Hª%Ïë$€9嶨ÊÛE~°…xÁ÷Tã-áEðfm8¨Ša‘ð¯tHP¦ÇÏ(•ÌãÒÒqy8”<ïwWÓU8,2‡ìT”ªÝöX£ªü”Õfø>àjd•î/-Ù†ÛÄ¥ËéÜÿp'Œ4p¾w?’уuL¼˜o1wÞè–[å¡&:W-Ó:*@çê‘ ÜÙÊ25Þf(ú°êU(¹^L‡‰jŠÄ-*ì9š{lÌ«o?WÙdí†ôAH Œ7~Å5ËåA0XºPÖ~A¬mºÕ”ê)s K‹vÆì!PéÁœ„†òˆör±í-Jsš¡;ź‹°$Ëhê,`Å̈e´„ÍßT ¼GBWT‰Q#–¤Ëý,ü±H°E.`ú Sƒy˜áTQÜÞ`ÌÝSC“OÔD¢œÁ÷£Y1…ÈÂú #3«¸FÊØQH.ïƒÊ“ܘ÷ýó eªrmÄÅEk ©³.fCŒ•ñòÃ6;Kä>yL*øœÈær2Ï«f˜º˜@ìêâßC´D0šQ3±cêŒÀŝ޵%á=S^°øÞ‹uIµ‹À60:èE!SO8ø¸|‘IL)`UQ‰¥$&+€×t!™é ¦èa„–hd"„ Wc=•{Èø¿xµI Ç£DqK%©Qa]BxŸ3DkojEÓ%÷k²j]÷;…5‰žš\\ ƒ«›ˆ:® Öñzªq®ìÁõÂÄjŽþÓàÑVçak‡ü/Ê~?¸Bs¬LóT5âÕ`ÕUm k=ô+¨=5xø ¬6ôPAËž+¢8ÅÐÁÜä© ÅUšDÕµ§&áM¦îÃzý5Ÿw)D@>U¾èžj€Ðs¬3w§¹MWn™qKœ&™»‚ã|¼â ˆ=йñGt¿“›s¶˜• ‡åUS:Ï[LCk™ª+a²®|gŽâp}(“ßF(Gnýš2QW’Ióz‚‚DÃÃGLˆ1¡Ç 1æf(ŠÞ]üvÍ,1Žñ0U±x5 ƒåC&K´Ç«CâÕTE Qºá!|,£d´Øgøª{¹¤!TŸ6ƒŠ«\ H"¡‰’ªš„aqá©l%¨|¨Oë²yaø°HÂÂ#¸¸R(kì!'¦liyÇ#©ºóå¥ð‘¥W2ëƒyAÆÎbî!lÍ€:wJo3‰%"µ%ÛúåA?®¬É3C—íF h—½Û »%Ye:¿ËT‘\€ÿv}ÕUºÒUfû™ú-6Ø‹bøÄÕ»Òoö’ª+ÝÍo˜³_ß4]ñT¸Ëj4,„°daj8qŒ1_–xPöŠÇä!±Èt3‰Ìø&Ëõ¾l˜H¶½Ñ£üðs‹€ «¨TÆhí´qù›9nïYYµç.·#5¿Ýf˜mjËÉk0IºåñNY•R*Xô‰¶9R%›clx`>†¬‡?û¸ã–òK;b–ç·Ÿ¬ÑŽxÞÃP¶¬Þ×¶Å’í×îG®ºU¥ÑÉ3—(¯_ì³´M×õbž&êx¨Ê› 2a€å!=¬éB‰ÅE­|FjE6v@%ˆÓ:TQË6ë!ØW›¹$2(ÆÃ˜ý&¬ôêQÌ-ö1&JãEäÄ­§l ׸M(“Ðæ RL¢è,–°ž iÀœ‘Pf„…ì\€Üÿ–›J'Õ/éúBUã$Þ5Tß]?áKë p¯/‡ñˆ±…¯àîD + ßÕCž€†Ñ»é鲯W0DÕ•’Ö©ùPyßs?<ÙÕ|\Ÿ¸~ÍÇu/ž*cÑN,ªvqDˆ‚qú7ÅdaCÊÕ¬ïÁ§ê9“¸9­?¨ýe `7\ê»i›7•×<ñgˆl’çŠl‚"IMSÌ"Jôþ–ÜjsȪ§àW“úˆ—Ó[wñ½ùˆúzj'öAð{§:Îæð̶Á8yÐÛŠŽ“ëùŠNRÔÉL_ñPÅ=> äóˉ1Î<Ž8'FŸ“éF]NꃓPMÍ™ÝÌ=ˆ{Þà=pNŒ+õšSÞ=¦¦sbðD<Ãæ3±œa£ñt<: ZA' îͳˆNj's–3·oªàjÖð9ø—Y›¹¢à'UÑ3æB´ßÛ•+Þôc8¶E3…³4àA»hbÉÈn(:ÆŽ‰oÑðã15[Œü<í¦:ÎÌnœÈ@FI2•§DÝ…çD÷IFÊæÁ~”’Ý›gb'”Â8 5¡jKcÞò8õãilT®;•Ž]ŠÏð9ÏÕÕù¦1Hçžó =Çõ»Ö3\ï$Ÿ=Mr®5Ü5¾§ƒAÙozB"3W0 2ë¾èbæMñsàj}¶<,`èÏÁÐQø9ŸÑðû@XŸƒ±€iT°¼džË­²C6w2HëSa‡:ñØ!pû2‰J„X\Üanop×øM!ªŒ…èMÔ¼^T}‰Ç¸é¥ÁJÈPyHÑš}5ÄL]%Êy×?Ìl‹Ó×wtd‹ð®ˆ3<Ù’íÍDM6-Ÿ0çÓÐòKO¬dÅžõÜŒôS?2ò-U$R¢É’н§’¬Ëu}È™9²#Ö .¿ãr¦:€šÈóœ×T]@q'iz*t˜¼5^Hr&6ù¢Ö[tÍQWåè 2ì0ô' ±†a 1£ °Ƭ„w°ûIhXjC"qL @m°\ÿìÙˆµqÎ¥¢ªÊl7DA´¹áÔq¹PU=¤–Kðµ ÊÞn_gLà+ðæNŸø¯à+Œä ^ Ÿ¦w¯`¼…¿©çDˆ9|>‰ µG”Sí Ò»[ñ—L-À … ÆDåaxÍ]BŒ©zªb¤{ˆÊ–˜|ë7vÈÆÎtZõŒaó˜G•ùˆŽ™` Ó}‹Û&pØ7 ²jÃcøV–þe16›¡á€Õ6>†Ëc8`µwÀ÷=C^Ù2P¡G¯ÁÛ½nrµ7Eb¦è¤xâϾØÀ‘í”ó´Ìbcµ¾Eºº&—ß'TL‘(ä›â‡õý7›Žì ÆxjÙð=ø9ifLñ¢ƒ×…‡Ãé¾—Qy:Ó#Ü^i¤Èl‘#E¨'té虹)ËOðd”ätyÂv‘´{æc±Ãïæ]%î%B8lsx%zÖ°Pù+Çc mFèÀQ0â¯Øè6VQŒ5;°2¨K;B= I9†˜ªpωˆ„R/FÂj O=Ðò²]O˜û·¢ÇµPc(±¶ ,Ýéd!¦Ï?î)’Ì,%j.$a1J s¹VŸø^ò;q‡_•CY»™ÌÑŠ‘§j€·ŸXegg66‡“ Dy 6®™²"Í¢°ÉIÞ¹’ìF¼f®qÖbŽÌ]k8åÏn¯ióî[ûxo1×´1­†ø±˜±¨Éà=?xׯY L!ÄÌ%‰}â¹½Á{„)D4¦¥¡<0ŸšDcªÆ–(í°á·¢ç.0Þ5œðŽ(+‡À]¯<2É`¡ÎªË“©*bt§ä¹P²qG&·C•>³»Sé4j‚þjéfò+sÌ.F&^ÙÂ$¾Â?¢x® 3Ò}DÑ¢H2¤0gõa`ÂŽfªqd»tŒÝ…He­ªFŒå²™Y<"eyajMÔr¥4ú=<Å&Vå]h7ƒñÅQû‡ÐØ´–ÈÖF–‰ç}°$å]™J!Æš´ÁaS[ö ,¢_„jKeêøp´-ѹY¯_MÃt??U¦…ð BzR£+¤\õó34›$rÆ…=®=Œ·‡ñ¼Ð‘uTE§·¬È™ £5HqÓYµªFdžkÓ<õ8D¬Á圸Ú/º;ÜϹ¸Q¸¢Í”|¦8Õs6WlZH>÷Ìz&Öɘ´²,—ÊÀUII2ƒÑ‹uáI8²}f#^ªðFu½èW|>uSḺ!:>#W;¾ƒÃ"²‰õ6Œö”rjO=¦Þ+Ôˆÿ"ÂLt7 øš@¶dËïaùGÝ-Ê©ÚãeÛidÜ6Û À¿±Bq w÷á8ÖŠ‘'7šøúj)@ 7“ÃÍì‘!æNˆ¾³ã¾^Wˆ(¥ò@)Mû3VÚúµ†»´+#Á( “ⓞì!~7bü¶ð¨1Œ_¼·ø‡ìt°ÕåýýKŒJK8¨®F;Ÿóx $žÊŽk"¼ªÆ8p/‡õ+>DŒîâ€03 & ²^7ìvðÛч¡d\•pp•ÎÌK¤‚HÌ~_m÷z²Þ¨ÇMB°y±lzk#ê½6¨nâêL+Õ¡Š)"*a‚ëO¾À-Æ<îpÃI#*&Hô…tý<Ó=é¼"­ ;ܨW´+ÖÒ5 ‚+3HRÊ £„1Î %‰Ïl°x~sïÁ«Yø¹¸Z×j¸óg à¦SúF¼wí3oYØoÆ]7ÈctŸqx5«Î`ˉ± 1Ë$’o[¾G0¢bÃÍ““‚;À¶¨ìsjô:‘ÌÀXðPaA¯>`½1l/ç¿tÒdÑ)¡Ï<ºwŠ VÈ$Û瀚8gX¤ÅGw›©árŒ;wÅ Ãah¼š6芧V,î¨Aá±Âƒ¸霔é°\V¦j´XsÔ\û´– ILÏZ²‘Æé|y{©BxR_>Y1–¶Kòß{1VÀ7?Ü+왓Ô>v×ïï˜È÷QYRžmŽjÑž—}ÞÃ)IUžÊº˜kZ˜SŸÝöµ:;jgø„VsÒ¶3äf¡Q¤;>PõİV×V‹Qãí]rf5 ¯`ôfúÌÞ4„³ƒ·ðçxVû÷v£Í1e]IRMI²ÔG« SœZš>þÑÿ]žª*+evþ©Tuþ´>õ©#þÌ}ðãPT'¥j]UªÿNy»„ûË= ùz÷w~¾é8ºÙŽ`›;F›°G·G·Äð ~~;|üÓj µŒAUH+eË¡…íW5°É\6Xâ ÊàéãD<€ò؈ð5w¿ã/ŒìéÏÂÀ'Z.™vúTÑ:ŠÌpjüÞH¥‹ŽUH 5œØ2¢éš1úöƒßß•y>•y1'*ój$ɚƢ²ýNy»„û+ŠÊÜΉÊÜŒ`&¢²ùÈíÑÞŠÊëÖ•Å¥Jöc8Q‡IâÂF€ÄÄM—8Ö¹p| Õˆ¦Þ†aªq1tJj„Soˆ]êx©¬.ôEVwªÿ •Õ^‰¬ìyÒö ôä@UV;yxþ´ý@9™é>øÑÜ’9¹Ú§1ao×pÚ^hö˜N¦Žî×ãgèó3ûh¿c‡kØá3~i©rYpèâÚnŠàSJšh`'„½|ª[²^ù¥ÜÕ"´Å§ê¹CWùíKÙ«6#öªí{Õňô›ÆìÕ~§cŸËîO3b¯ZϱW­ÆÏPö:Ç×°Ãg¬É^—eõåå ©$q|‹§¬•Ÿ  Tʉéªðx e)•Yva¢ÂÞ~°‰J¥‡LT*3ÃD¥Ê‡Þ~0b¢ówÎLr]Ãý©‡LÔ¬9ÃDe]>#3Q÷;\ß±"•—vsl„< Z—ÈtÆ(õhˆ0™^ªúBŽººý %ǯ‡¯ÇŸ Œ¯d9ƒ‚¯÷¾° Ë\Í¡È4D™©6èuÔ—<³‚b«³1ÊÞí‚êú¤ÏÂñöJç0Ó+æÍÝã‚n7BCAD¾¡ç˜{cSæööŽ).‰[üìØÁÅþÅô\ÆçZ``æ5^ Þãİ zõòJ÷,Áµ¿7;îa‰#Úe·æ0á0F´Sç3ôêY5^~Õ¼s¸ÂXĤ iÂ¥™í’å2¼1Oi‹–ÇH'v¯)‚_BÖ…uq«7®ò›£?¼7,±1Zè`²þeìrTj¬Ù¡ñ¼ ¤³Víx‰¼2«Nª{έìs¥sïtS!uWó=~=ü?‘©\] endstream endobj 1634 0 obj 6873 endobj 1638 0 obj << /Type /XObject /Subtype /Image /Width 377 /Height 149 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 1639 0 R /Filter /FlateDecode >> stream xœíÙkrë6PíY­¦2Sñ(| AŠ ¾KŸSù!‘ л;¶ïû À1/fvvdv2òd³³› R‚ä R‚ä R‚ä R‚ä ÏH‰Ó»xÆö9XRâû¶èp1lÄöýÌ;#¯ˆ2=% æ¶ÍN?Õéœ ÓSB«y$'ÀÂô”(×Xÿ>ò¿íõ9fñ¹ÿÁv妎nùÄÒíêÂd˜žW¤™ž¯•ÅÝÆÈתŸ¼WÕ´þ¼ž°ñàç­Í§›Ú»Õ˜³éÆ ´WÙÛ{ù!WÍÃc„¤Äëß>/~ŽY_ܹùuýlãÁžÏíísb鞨ŽN«Õ0HZJ”iÿ€VóúðÍÒí¨Ö«´?oFuZZ^1Ýô”hÔ~OWÙ¼¸÷u¯{V?T‰› õÌhéþ6ÒžjDLÏ+ÒLO‰u]ì}]ß»ØYwß<Ø¿©Ÿ+í9O,ýskóÜú§Ú<ç/MÏ+ÒLO‰×JûîzØúbÏ„ë÷¾–A–;jÌóåÒ”S5–8çªyxŒG¦ÄˆM­ óÚùïYú¶]<2¯øÆ#SâòMmþ páü÷,}ç.™W|ã‘)qC«¹pòÛ–¾sÌ+¾ñ¼”¸öo£§½yéÛvñ¼¼âKR‚ä R‚ä R‚ä /fvvdv2òd³³ø³ùëpƒ¿{Å_ûO·:]Òjt íªV£Û Z p­FSo­ÆS o­ÆS#o­ÆS&o­ÆS)o­Æ{­ÌŽh­F[·š_X/Z Œ¶Ùj~[Éh50šJyk50ÞOüæJÑj`´ÏêøµÅ¢ÕÀ~m±h5p³§ÖËÞ_¿ÿß".j5Å*À=¸"¾l)~ìúÝÜmül¿Ù ÇoRÀ{äïSþh,\Þm4`ÓU?Þøa(}Ùp4 Ó¹n£É'j8ú ð²áh2À%öº&\nÑpô`²½h2ÀU4à6ú pMþÿ$ ä›ÝNZfŸ p™Ùí¤%?B ”_Èù¥üBÎ(år~„@)¿ó#Jù…œ!PÊ/äüR~!çG”ò 9?B ”_Èù¥üBÎ(år~„@)¿ó#Jù…œ!PÊ/äüR~!çG”ò 9?B ”_Èù¥üBÎ(år~„@)¿ó#Jù…œ!PÊ/äüÊÛ†üBÎðr‹ý^µýûOòû§¼ý{ým‰¿ßü^+ã7¿žX}=ù¹©N¯Þ¿åÍÍnn¡ÿ<Ç…}zæÏ¯nbŸ¿ßü÷lNgéz¤sõ;u®^Qû(.ßã¸CûsÓø*ù'ᦽ°µšrÌf«é<ÏÆ¢çZßUþÐ4¾Pþ äG¸Ö_h=ÿ[ß°žÿµïsLÀϰӻØ[½±Í½1ýƒºõ¹Jyhë9g½Žò£äÇ™áZóç€Í:m|m_ïdæ"'ÛŸ®´7Ò¿‹ö³1ýƒºµÕú(:ê†×±ø\nmºþ—8K~„k‡ ­]¤ý ùùÈf ýïÝ:½‹ö³1‡f[(oõDuâ îyå^ÒäG›áÚ¡Bki»jË]žÛßì¢ýlcLÿàÅ#‡n5¢:ÝNÏ|h•E&$Ë3?ÂMWiOáß“Ûßì¢||ónÿཧ:o5V9ÝNÏ|èu¼þQnmºü8ó#ܳ—rï#Eº¹—Æem^’Û=–¶‡ýQÿ཯·Kü\Yrû> endobj 1649 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 123.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn8 >> endobj 1650 0 obj << /Type /Annot /Subtype /Link /Rect [60 764 161.250000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn9 >> endobj 1651 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 185.250000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn10 >> endobj 1652 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 160.500000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn11 >> endobj 1653 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 120 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn12 >> endobj 1637 0 obj << /Type /Page /Parent 2 0 R /Contents 1654 0 R /Resources 1656 0 R /Annots 1657 0 R /MediaBox [0 0 595 842] >> endobj 1656 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << /Im1638 1638 0 R >> >> endobj 1657 0 obj [ 1648 0 R 1649 0 R 1650 0 R 1651 0 R 1652 0 R 1653 0 R ] endobj 1654 0 obj << /Length 1655 0 R /Filter /FlateDecode >> stream xœí]IÜHv¾×¯à¹N1n€1@K%öÁ€ s0|043n FcËsðß73L%—/’ñå‹ “ÅZ¥â|ñâíË»þòŸÙý#{÷áËÿdßÜÏ_^òSUäÝÙùϯ·t}rÿΪºÈ¾}ù‘ýxùüò¹ýûÇK÷—ÿÖþëÿ2ýkûÿ_³ÿöâŸÜC羿Tªjþíò³©Tû¯üúó|ý÷—?þ’ýý¯âÎÌ?^ú¯T—?ÿøö÷—wÝ÷Mbu¥m¦¬iÿj¬Îþ÷Ï/9µR}»RÙlºÚîanµu»Ú2¯Úá¯ë”VÙ“‘yä?! T~™ Înf«[¬ø’xuQFÞhdyàÕE•ÝÌV¥^Ì›ÙQÈ5—e7-à7SR¨Í¬gÁ:«‹+øÜ/OuéþƒÿæÑ§±eK½U=ߘóSX8oc•ªJ[åp¦ª¦)š&SºiÇ)DÑg4¸øÐ­tkè˪¥áÑþTޱ嶴14íaÎupq¸[­l¬-½¬ZnKñØb[z&‹4ÆÈÃý:¸øÐ¶ÕcaËyÕÒðè¶Ô3¶Ü––¹î@Ó ZÒ°¹Ž-ö²¨£ }^µ08܆އæÄ5Õ•= I•1——/bLwÁžêºÊZ©æò¥.W/‚„›Ç]øÖ¾’Ÿ”jt]÷Ϙf0†ûÕÍѾà.èËkÙè}5žC]æ¬ãüŒŽa‡süÞÊ`·0Äõî Мx^|ÿõåݧ––Ù׿´·.î~|ma×Ê~¿žWÑd_ÿ”ýS»õ‡ìë_[íäTVª>³ü¼¿c/wìé" t[æî|¼Ü)NF×J7wT~¹SŸê&/wrÓÝY0¼g8q®á;õxâpb%êfN”hÿÎÑ^‹—gìp ;œcMQ¢)ïêº ?:Œ ÎHÒ˜|`$7„zA})>fϤ¬àw¦â!žïºÃ;Óp ü&\‘AÌ+åùåb‘µ©zÊgUs{a!é¬ófH:k•ÏÎv†dí|aD:/Ï\HãÏ1º_û9zÒYçõ éì&½£½0"Ý3v8†α"é¬UÑïc!‰úÓrv-*ŠéîŽRýDKV%Ì5Ä߃õ$g=K©Q­ÊŸ‚œ¾½°”ézDt3GÆÆÖÚ[o©Éù™ŽÚ\Çp¿Ö#j¤«9j¤GFãó…15ºv¼AåÉYE&2íÜ; |§ƒ†²§±‘Å1É™;ù'bžn´êÔÔ£w´›§žÎó®ÏSÂ;­Ú‘ý™y4¼Ó#öôžÇ3QwÛQÚ™wð<ž]€+Àû£*´Û †Èb"ƒoêCO’&\ ãÛÇØL¾3˜6µ~³*Ny3Ú]F·`´O&¶èg÷!ΆA4@â¶Ûå!¶²ººÇf#!¢P"9cÞÁ,Ù#ÎH¨OiȲ ­I(&۩͈ïHd¶xˆÆÒÕIùä3¦¦¥ "4W=Œ¡^²Ê_€¦*JP™ð8OjâgHàrXx|`½f`áñé?ÃŽdYWðãJB:r¡²B7™5ílç\ILqLU92c›ó{íßß¾gïþå»*Me¯ÿWŠ6ª¾ÿ7†ˆ)â."5=%ÿÜ€#¯@Ö¤OìfdˆCY;”5^Ù›‹@PÉ)œ7zÈÎVÓž‡?ÃGñÁa²á Ctyh£¥ïÄØ@yße£ë%dýdAø¬3ŠCÁá&OãT©!1à ("ò员8t¸êº ²žOf;Û¿†Š#öuc•2‘ü9µÁØŽ…µB9y)<ç†Ùt¬ ˆJSSË0ÆÝ€ IJ ¬àµ9¶ÏÚ輸 ã§V¯#BP©í«C(—3GiŒIN8ˆlrî_j{¾Lȃae*%˜Çè´l Hb ½Hä"Q®!Ñ­õãž —:ŒAK ´–1(MÌJĦËjtĹ3„ak|N“E“-ð‘E5\Þâ ×4.·nZ™—)Ãt†ëÅ3|Ž2Åagõ'DÈñ—RÔ™±v®æ*°(D2$C¶Iõ%þ«`›W¸ðγE¯TÆ 9ÔaL%Ée@‰±ålÛÃ,™ïJœlKÁñ©œÛ+u¿!óîrG¾Géyd ÊUW“a„†Í…ä’nØ*²jôŒ6ÍH5{#AÓñ JÖÜE¤#äúÁk e&YŠlIUÙÄ5YUO4ýkÌ4zCNVâИÉe˧<`ŠÉ(t9äϨ`ºþ2XšÊESõÍR©^ ªaq3 ¸S !ÛÕXÝœ•LÑà±Óƒ1‰¤*$Òv$À’ÄDK‹Æ È„`남’Âh*ÌI£"Ž&FA¼"V»™ˆ<²°õI *Ø>ÛK1/1y†ä2ŸYYÈTñ}ïLšb Æ[ξ äŒÅB8œuïc'ÑTc"3q ³DÔÆJåˆW=Câ÷‘n‰òmÈ‚*âo†­ã™ØVªµå>šk®ÆÃ6Ð5RTX[¯lS9q¹Ùò¼/‡ÅÝf:Q# •òÈdõíðâT±Kÿ~ˆ¯æKeN¨’Ë*ŒwžiŽÏÆî·IÙ¼é?ˆH|•_fÚ¾O¼Éä‘THæÿìUDU§rþDEY‡ýÛ)R½~jÝL¢š—G°c’à63°ý*YoÀ‰pTŽ ¢%(õ>fS¦®œÚ ©b «¬žO"œ§½~hñ†Kµî¥âôré•¢Æ:…leG”ga­3QÈ,Õþ†qV`²W@yîö`”ŠÚº×è!·LfîÚ·9(L~bjÎ1,©DˆåìfíBÅñÍvº¾‹^Ï© …ˆDR•G«e¤MÙ2 ‘ýLé ‰Àzª(îcÐOw–´y­13·ëjt–eå¤Têà!uEâà¸j,e/LA1RBN‚Ü)ñ&Šø‰äGY‹üSÕÜß²ÕËâü^1y®Î툱nYR|¦ÈdŠSˆ”f=„ŒÇt¥TáŒF[¦e{€*.[n-U <>â“Ô‰TÌe+Σ¨‰Øe3d&ë3è-»¥’®•}o lç”)¤Pž|­6Ìé¨CÅ”F‹Û<•‰ÒÑd‹®Å§ÈiZ¿oÇÁ²Qµ˜"\pÒ•%Rzè†åådÎG&>•““¡cJW”„pÁB’‰È£ÈÒÆÞŽO²F˜‡;tÁêm_ØÏù<Û'¦”®lãü=ñ9_ÓTCη÷Àê•:DÒ¸C¢ÊE¬œÛkC創ÁvÑ äT=sFx"¸f²: G`ú#k‹oç«õýÃÈ@±M uSà$[‹Á΀ÐúT¢·ôNd ÙØá”÷¦â1åýE:<79Ï]%XµÐvÈf˜ Ù@¼Õ8&‡„¢}.ðœ†ÉTå9Ämo7!îLÿ¤TU|ñ“iÁ”š0?¼£íA Ùú(1JZÄ-WŒh*b»5F8Üó&.U‘DÇTv”€ž/©Òãùú골RžD´.’ŽNc;‹a‘+ˆÞÀTŠ‚Dµ8&ð0¤lÓJKVóÏŸËj„<©Ü@²H%‹xJ6zRÍl ì¥ò_aÕðÃT~·oq'¨8éI.ä+ñÎoð½ã ©ªS£‡ÉÊ®ÉQu2@æ™§orÔªÀ£JäøN߯g:^þÕ·Î2äº}ç­ oe4³¶pm ÍãPÖïÃWàÚSÅç/Õµlã³Á¬—ÕLíL\‚LÓ]Yç2c¡”µ¬ÚL€ýé »È˜J“xÓ|¬T~‰‚lV̱¯¬ÊQ§æ‹-¤4W[H㦎wL7`掃êÜ;ÞyGûˆîh¸6¼cà;©¾Žfð;ðŽyŸ) uÿãàxáÖ{>n#¯g´ň ÖÅ N²YÕL½“C :Ã]Ðùјàyˆ­÷l–˜Ôz³êæ‘-Áàýï`P•É>»ÊëG⺂ï¬ÎO=«Æäöé\÷œVºïùm%SW?R¸îÚú:“¨Ï>YjÜ>;ÛS v¯zœL Æ½Nf±’¦vŸõ¼·Ò¨ÏXñ=&ëªêïbbzEý%‘ tGRè‘ú$±’w“Bߢàpän¹›Ô bf¹è‘Ê¡Ä!_?»|½ÉTäëH…þïèÆ¶úb¶‡Š…=!vš53t±Ö»Ä+ý™"Q­ë"ÃäžÉ5]?þD¢xÙ²˜|ˆ~ž>5=}eµGÈä§óÈÙ÷þwuªë¼ÊÊòòS©îªÉÊâòàùÙî·—Òž”jt]«þ3ÂÜNÐ>~ù]7——²á˺MÐ^hß,âüL=¢NðûËû_¢Ø¿Sö;ãÂ5u¿5K$§DíHÞ°½a÷éOëKìLºL|àòBûÂþEÏmH~4søåhyI&:ÔS°úFyˆ‹ÙfÈÅŠ|Ž‹zÄdÚ c.v~Æ †0·ô\ÌÖs\ÌV£ Ú c.v~¦ Q'ˆÏÅŠb¨Îè²%ß××ÿßp¨·Ø!+ëá!+›¹CV©Ñh/ŒÙù3ÂÜNв²š;de9š ½0>dçgêÁõp‚ø‡¬²÷QÙÍW‘¼“*ZZˆ’ÁS‚…ÊÖº\¿ó ãÔNU0I:U0 μ©“FØ)ósø£ö{,j;5äY{st¥êÑÔä}ÂÇÜW§÷œå2˜ÊE÷V dCÿ\ìdÚ:‹i`ûÌ^ŸýêQÉJö<]fO~‡©š!]\?F.YòS ?:Ah°UÃ)wè„KŠT~&ËXø™–çÒĸ£ñ—Æí#û\e)Þ”-˜iÜ( *a%ˆægëºDõrœ‰ óF1OÎq~*ÎÑ]Ÿ÷ÿGÃ)Ýx D™³tðhøOÎ>†õ›Ž!àfE!ê9?øÔ3”‚¡øÔcÀ\zaÊ'ú= $£äãñ—Bʇq”ã•ä÷Pø& 7÷ÔÂX ëm×(j~6[’­Q${0˜2$¸œf9˜b¡$Y9 ›ç‘ Jm™ŠaJžðúþg¯_É+ûÀk+àÚ˜º`Ÿ¹MUÛ¢æè²³-*qyªaÉaÃß#¡ïX¬¹2»€ Ƹ&ïÈ’'¼Û¢)9Fq”j[„þ˜^Ãm´x¼6L ±2„ï`% "_U=€Hr¥Úî/´)ÁøD‚¦,Á§ÌZø4bÅ3‘œÈ¨Ë¸l!£H'‚–X4ÄàÅ@”UE "%+L~(C¾ȸU0/Ár6½âÑSÿ–a½ RS˜»@<”RIHáŠÐ­¼õÕµ²Vš°k«m¯h×Nkš—Üv´ò‡H‘mGe­3QGöCB·œà ¢mE¥Z”"°X²†rôRÀÔ§ó‰ï1S·r;ä€G¶Ý¢£uTL[ßÙr:Q[Ý#1ì+'k.ÂL$ (¼Gh‚Ý„Ôbêú1ídëįÝ”C~*œƒË|4Óƒ@¶Šÿòú”ª·zžæS‘Úe]¸ŒÓÛ­-ñvd?,ÃP­blg,‹Ô³$ñîâJxxßEs;7ÕÏH÷ŽÉôœ ¢~ûÝZ…A®Å…"d »hô瑹ïè}ÎÌým'ýóHÒE*„õJaBóˆ\<šgm8ÐÆyîà¸P´ÌsÆ!ËÆí¦ ÷Žõ};…“èÅ–|ï0ÌHçðΡ"ÒmñHßqgwÖ—É=ä ŠžôœQÙ^5‘å€ß± 0˜‚X“Ø4ÜB"©’§’‰4ÛH¤1MŸ®™*‘ÆÚkÉj׿ 8åZ1ù0€0Cçr§f@c*•ð>2^Îõú àh1Ùno +ðö²¥˜4£TÆ!® @tÿ”í?úT1n6E[4CÚÅ\“÷4õˆùÜhÑwÕY„1„ÇŒ c]+94àHP:Ì?“'•RHh*v8ʺp‰€±Øq ÏÄjõ³¶î9ÜÌlg˜0c¦‘ÇêÁ TØ>Ÿ&0 vƒÇ^ì,DrË󸥨BJV[~=‘²xx^ÌŠÉmêrÈndµûiãQ@c}ûÌŸBxFÎÌe,D:OÂ_L¬2qÖæ¶ÙSªðAò6bN|i*ãþÒ©â*ªPé.Éo²CåôŽK‘×§rl=vs±ßbfs/’snmŸÜ—"±{eí˜aacQ9ý@G/p f>3Ÿ¡ðhðGUЧߴ`îüïvÅl´Âìn´é¡Ú]Ÿ2n,{‡!„·c¨a¨çqœhf÷<¸1KÁxp΃Gc êÄ»qáðàã­„Ÿá¤³¹wÄE@ Í>":ìA³›0–Ty}RÝ„·4A}„€¿qÞ刟³Ï/ÿ l‚5 endstream endobj 1655 0 obj 6697 endobj 1659 0 obj [23 /XYZ 38.2500000 604.250000 0] endobj 1660 0 obj [23 /XYZ 38.2500000 304.250000 0] endobj 1661 0 obj [23 /XYZ 38.2500000 695.750000 0] endobj 1662 0 obj [23 /XYZ 38.2500000 604.250000 0] endobj 1663 0 obj [23 /XYZ 38.2500000 304.250000 0] endobj 1664 0 obj [23 /XYZ 38.2500000 695.750000 0] endobj 1658 0 obj << /Type /Page /Parent 2 0 R /Contents 1665 0 R /Resources 1667 0 R /Annots 1668 0 R /MediaBox [0 0 595 842] >> endobj 1667 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 1668 0 obj [ ] endobj 1665 0 obj << /Length 1666 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sØ/>€ €´+È!€ 99rœÀˆ(>äï‡;CÎîó5ÙßT7{8´`K^ŠÝŪêzwÕ»?~ùûþŸ¿íß=}ùÏþ[÷ûÓ—]q¨\qúgÿò뇷?Ðõ¡ûó¾ªÝþÛ/»ïûï»Ï»Ïí¿ïN/|yúsû§ÿíõþOí¿?ïÿú·ö‡?véå/ü²«TÕþþïãïM¥Ú?çß_~þ¯Ý_~·ÿõeÅ~»˜ËÿÿAkcÌ ;ßõ_©Ž¿~ûöëîÝéûƒ6±¶,˽²ÆîUcõþ¿ÿØýÔ.ß/^jk”©´³íŸ›ÒV…«kÝþ¹2Ý?äÖ•n÷®ŠvÝ´¨/G;I¬­ä—nÁµô ÔÂèP¦T¾¥Uªz¡í ¬t„¾©;œ7N3çµÅ‘îŠÊÅ¢çjattô„K‹ÑÓé¦îãÆ¢áV¬¿..¾t‹œXK¡–ÆÇ‰¢žµåHêz±¨‹F9.šÌuU¤G¨¥ñÑ‘¯U³ºªì)ÑþPœe42׉ÆAåÑT’ÅGGf¼¶ØÉ- k¢ ã7‹‹/ÝÚ•±–>BG{ÖŽzrKmËxd~]\|iÓT±–>B‰Ìxí¸d~5QätÏþ)]43üu=^ûsÀŽÓO€—þÝó⇯»wŸZÊýןZÀŽû~ûúËζÿÓ:æ-¦¿þ¸ÿ} Íû?ì¿þ¼³kN‹—¿vzbá“'ôD©ãeF×J»7ï¸ãspíæ/o½¾SŸÔ‡º)Jýö‰nÐ6SÀÕ4|W+*øüÒœ޹mcüé‘‚aFÀ@_ÿêèøû0ú¢ë¾óñøÄõœ:öf0Œq0B×÷z|ÐŒäqò|×|b{ȃ‰PÄOðjú›RýKÌgX ©1\Ä#Ó±ʇÝNû|üÚj½H«6—*KŸøX‡²R—èÀ< ?3uèûQ꣕Uøîʽ|velÿÙŸŽ›6‡ã—]eWž(‹žhM¼!0Âö!ü‰‚*ü¿´€«é®Ö„C@=yO¼a3u8ïÚÓ¯†©¡öpHî:“û‹ZFl8‚•©hîñÚ'ø¥øâ'ø``ØðjÏð(ì<«éèjÿè¨ÖEÝӽ番ts 'õŠmaÆ/ø04±náÆŽ‚ÂNîÐ…ðX¢Ù¹‹ÖÊ(ào ®† E›¢>áºi ÙãKãó ÝŒY£æã‹±DİðÁÇ×ãõbذ[ßñÈ'Œ7,tFÌ‹£;˜¶²q­è«3õ¥êòЃ‰5å‹yöžhF.&Á‹G GÜð:ñ04>î#¡ˆA´%DߨxÇ…e¬+†±ày?[]{ä4>i„êe¬«óØ[ŒvÁØ£ŒY@䨔0ß<ºQ6ç#+ETQMm*j%Æ2“V ÈMf´‡m¡©E¹;Rìs÷=] =–ŠÇû¬_;GæHÆž),×>ÍÖ%˜›{¤èTü•2LñãV¹¤‘Úñø4]m–É –ID©!…6“gÅa¼Èz`~t—‰e1æ@ÎæHda³j’q3%‰S:iÄÄ××¥î¡Äq1‚.²±í :ca‚È:Çäf¼‰ÜTl8j¢å¤É‚C[:'mE²3RN¶Æ›Ê¬Á'¹sæ°0‰»Ìü™ÖM8ߣ”õ˜(HdhQÚ“IîÞRåO\úð@ã;Œ!äµ§Î×1q$†ï˜3¬XŒôg>U‚ÀRŒ[È­Šz€‘(¥Ü1iª´Ðô.ï`2ɪ¦#à&qßP¤Ú0v `eNúê½èdÆú,C$É&¢p˜h¸¼ÇèaHEV’®¼äŽû¼îdUìS¤#¢ÐãI2%àLìgõê‡þÔí I•Êó’ hÇÔTvpÆV¢ã“åaò+È@ ,U^#gÙÕ{Õ\ÕIGÝÝhsÉ3­ew Ɉêz­ë  {ç|§ïÔ½9*›øpV—¹†õkOAg©–£ôոĵwð>xµ&ÝÞ”3z6ÝSe@H.0@m‰ÜeÄØ34öR]C&¢ÝÌ-&AÂt2ñO˜I·Àw"_+ Yž°Y=Âέ˖aªË1w¢EKÖ–¶ec´ÆÎ¥â­F YHí SÂd©·kŸ3Ô(uí3Yw/× ïK<\‹uážW¸q ŽÃáö9°Ù‹gÜ>7‚X"FÈ<ÁÍ…4^ ßxöáŸ$aKcÖÊ–0tmá>C Ú‹ŠaË(,ư¶tz­l‰OÈQüDù²e ;*ãTÑßÞnPF8·uÆ*f<ÐR3Ѥ·l©™lö›ŠÅ‹61ZîzìJï7œRÙBZ*_ͦî¡Ãz¦¥"øvÆ@ï­î‚ßêKÄÙƒWWª¾dv\uCÀ#âi­\uù“FAd„–n6Bc¸êQ]+ˆêT·ºâ’´vz6IÓº¹1¨©¡$¢ï¯Õóëo=Š»XŒæ$’T!IËTņë¶ó±ßÂú›º…$k©Œ;:jÉ1FÊS,Dí%£ˆ¢øñT¦ÚZ½-ªô—‰“H„k)ŪìýQ‚Ú"í·úùß•iIUß3¢%Àr °_W™Æ]Êâ€úªµCÀ¥Üù•À‰Êî*ÏhJTvïÙ–Ý÷—=õÈÙô”¶Ÿ8­:˜-_mÔA¡|ÇAùx5ðê¾๔À\ øq€©€±S°áËSx‹nâéÂõRý åˆ'±ôc2”ŒË´DØâs´üÚãÌe»Þؘ˰q)ÚÌ‘ §@:¥j´¼Ø¬óÅîö¦ê¶²`·#Û¨Kòx‘°dWÎÓ­C–À´§Y.~§/à4ÝK3žÈ”-áÛ_ó ˜Ä5p3¿#?.gc¬ºi®^,û#rã˜ï1µ  hFêÊ%f(‰°öälD‚Êv}•M+Ê*3!—ª•kä1Vó¡Šcº L¹MÛ%~ÄFÛIB¥r)Ruι÷·ð=è³§bö†;ö­šu^B,›ÅûÈ4Ó'D^»ŒÊÈë%«× {yÜ—W­ž¢¤€B¨IЪîw”úÈœL,©ò‘“"Lß(ÑQl²·$±Þ§²1÷ùɃH,°¯ˆCƢݚ¢\xª^f¢£Ü |°Äg¬Â‹<Lj÷•Ágõ8µ —#µµ}ülãRUIJ ãá*•ö$”t².%Û¿Dcüb¶±ªšŽÜª@¹<œEœuú`~o… f£¤BaŒºäÊkýù5|ò„žhÜM6Äûxzú?Ã'pBgæ2Ćڤç`Ü $Þ%z ìsi0âź/L#¾ln@¼ƒ}Y7’ð$©ë[Îz‚Q…Å Ä*pgWbè bp7X¼ C­ßIÈöu¶kã»q ›µ™<ÖS êTCîòC*º‰}:˜L[.ÿ!£’ug/ʘp¥3ç9”Ûpu§¾sÚ lÌ`Ø2Æ[æ¶oË}ý¦ØÑgFôa¦ ,i»V±' ð0Ì—3ÔŒ¨ÁÜ›Ç1«ô$“çì.fÍ.8Úˆ¿¾Sà馄@Ù`.°QÛLñaÚàcÀRM›yÛ?€8üºÀ;€º™4™§—3éeÍI&²&ßa"2J÷©r<9º,Š­'‰µ qóx(›@a NÓg!Pγ|6B ÆÜßÊ&PX‚+uÑLeûˆŸÁÉ~¢@€êÙsîÌ4¢Sc¦_N²‰Ö×k)í`º$êªÞN¤I:ÕQSâ6tÖEa£±5éʃª¦/2XwCm+kÝy®.à}à;v+òؤ6ãU+s‹åŒÄœƒ¹³R9fÃ`«fµÑÇ|‹çÅo`¾$LáÔ-L±¦ dÁ.Uq»`18ù$z£Ñý±~†ø•Œ7.Òºqk¡’‘yZvÂFÓ“uA¡fê1] æ÷°£ÂlóÛ€1‘¿T­ëV?•5Æå¸ˆúÃf @Úz‚ãQ8Ð3*UsÑÆ38:h5DŠDC7jÆI¢»£Ësñ}¦–k»ŽÉ‚7fn¼â}ðgÈ^ཌÝ9VõMˆô„´EÅÛ¸#î­[c/5¬g~ö$D‰-/ŸCÌ@¢e(`¤l÷¦ã^Ü8ÔÑ»¹„óbNR2E}õ«ö¬÷ª¹:æ·<îX–—l¤ŠÃ©Sàˆ)ÝA>‡¿Ó%Œ®½ÓÀ}N´Qz³ëÂÀÕÁŒØõÃYe7æ²ã©Ft•`A°uÜqåŽ?¯}„@5áOº;~'vtµl¥`Ë{® èÚÍØò‹| é6 ÇFÅŒ»IŒ8ŠÜ‰ßcŒK™Þ’ÿœl$ D‘Rf®h}Q×b.l–¶PGyQ£ù³>1I©/5É㥓„›Ð¾˜qÒdãm²)(ÙìÛ°Oõ8 ß™ Ï“—Ñï2 Ãn²E&>ÏïQÈ$>™À3¶LÄÌL7{svF¥ñƒ”¦¾ÔO'~b›ýËC”k ×]ˆ€cÉhÄ0ÃÄkÎS<™fŸ€SšŸA˜¬½ó”Ô‰!ÓR,€.X2aÁÇ8:¢?”:"  ²]ÌiLâY*@ «£ñ¸x+N5b~iËÉÚpS‘º0›ÍL,ëè—,)O­B€ŸÖ*‰Y-©êKuÇx=öéÈd^Ĭæñ~ÇÒ)‘AÜݦìÙz“lÄ™ðÐkFQ,îѸÿ˧(#‡m<ÀЦ%¢®!uÄc˜€1ãƒÎ ü¼DIhOmóB…Rú²B‹ ±MI¦Ú[·L:b~r|yq–uO”T÷®ùÔÌÝD}×1ë¦kxSUyy˜‚në°%g’1ÑU#›òÞ°6=É& —Es¾x{BÊv0Ä@=ˆ·É¢”檻䷼gœ•ʘ¿\ŽA§o9 ÷Ù,u¹<ÁÕ¹éÏÒ#—K­ËËqñÎVâW¤KÉ>^ûì€1 eL}ѾŸÉœÐ¥BkϘ' Ø®;#3ciŠjùl³G¾1QX†ˆDž,KÈf<¡bFU1-2D;ª¥jw¿u£!O–,l[&'ÇL£ô ‚+^Lë"X=‰”˜Úϸ‰qíÍœ§0Ef”xLe3­²dUQ@eJºÄŒ®ú ¢ZuBzH"žÈNÐDÏ뻎ä&!}SgCzÜ”ÙÓÓ_”]ºŽú)oTuˆÇ½éEoU:Ä›òÏÄúއâIÃôXÊSâ\bb-Û3~!•MŒá™ S§$zȞǥ3÷)sÉÌ`ß®6òTrö.©°ütM„xsìDnèäì›­-çéüßYüú&“qô eti%²tÑm­/³¤S-;Äï>÷tÕ3®P7ÞcàCcÐàb+l¾abÅpÑ&‰.ò! ®KD‹¡NHÓäC\t—ê”ðnýÛ_ûï-½¼äü<õføpõ5Z›Öœ.ÔKþp¯Ï~2QººñêŠ*?}ÐG¯d¬ Êñ“ŽvúPŽº4+hù<£}Ì”Å} ¶OÝ—¢*®´¯ K9þÀNw⺠l{]ù …WƒïtV™ úô7a–á^þ\¼*`‚Ð [§Ð¦Çêéçcû;6a ñÝ 0Vƒûtãêyxr–‚xxîƒWc0ÚÝB´s.ïA>&%üŒÎ{½öâ H±ÙG$‡=lö&£ÆŠ‚ª¨ê´á[™ >BÄ¿IjLjÄÏûÏ»ÿ˜-S endstream endobj 1666 0 obj 4698 endobj 1670 0 obj [24 /XYZ 31.5000000 709.250000 0] endobj 1671 0 obj [24 /XYZ 38.2500000 660.500000 0] endobj 1672 0 obj [24 /XYZ 31.5000000 196.250000 0] endobj 1673 0 obj [24 /XYZ 38.2500000 444.500000 0] endobj 1674 0 obj [24 /XYZ 38.2500000 660.500000 0] endobj 1675 0 obj [24 /XYZ 38.2500000 260.750000 0] endobj 1676 0 obj [24 /XYZ 38.2500000 444.500000 0] endobj 1677 0 obj [24 /XYZ 38.2500000 260.750000 0] endobj 1678 0 obj [24 /XYZ 31.5000000 196.250000 0] endobj 1679 0 obj [24 /XYZ 32.2500000 707.750000 0] endobj 1680 0 obj << /Type /Annot /Subtype /Link /Rect [60 160.250000 99.7500000 167 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn2 >> endobj 1681 0 obj << /Type /Annot /Subtype /Link /Rect [87 152.750000 118.500000 159.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn3 >> endobj 1682 0 obj << /Type /Annot /Subtype /Link /Rect [87 146 122.250000 152.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_output >> endobj 1683 0 obj << /Type /Annot /Subtype /Link /Rect [87 138.500000 115.500000 145.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn5 >> endobj 1684 0 obj << /Type /Annot /Subtype /Link /Rect [87 131.750000 128.250000 138.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn6 >> endobj 1685 0 obj << /Type /Annot /Subtype /Link /Rect [87 124.250000 130.500000 131 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn7 >> endobj 1686 0 obj << /Type /Annot /Subtype /Link /Rect [87 117.500000 134.250000 124.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn8 >> endobj 1687 0 obj << /Type /Annot /Subtype /Link /Rect [60 110 146.250000 116.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn9 >> endobj 1688 0 obj << /Type /Annot /Subtype /Link /Rect [87 103.250000 141.750000 110 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn10 >> endobj 1689 0 obj << /Type /Annot /Subtype /Link /Rect [87 95.7500000 130.500000 102.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn11 >> endobj 1690 0 obj << /Type /Annot /Subtype /Link /Rect [87 89 114 95.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn12 >> endobj 1691 0 obj << /Type /Annot /Subtype /Link /Rect [87 81.5000000 150.750000 88.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn13 >> endobj 1692 0 obj << /Type /Annot /Subtype /Link /Rect [87 74.7500000 154.500000 81.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn14 >> endobj 1693 0 obj << /Type /Annot /Subtype /Link /Rect [60 67.2500000 138 74 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn15 >> endobj 1694 0 obj << /Type /Annot /Subtype /Link /Rect [87 60.5000000 128.250000 67.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn16 >> endobj 1669 0 obj << /Type /Page /Parent 2 0 R /Contents 1695 0 R /Resources 1697 0 R /Annots 1698 0 R /MediaBox [0 0 595 842] >> endobj 1697 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 1698 0 obj [ 1680 0 R 1681 0 R 1682 0 R 1683 0 R 1684 0 R 1685 0 R 1686 0 R 1687 0 R 1688 0 R 1689 0 R 1690 0 R 1691 0 R 1692 0 R 1693 0 R 1694 0 R ] endobj 1695 0 obj << /Length 1696 0 R /Filter /FlateDecode >> stream xœí]I¯äÈq¾¿_Qgªa.ÜCÀôfÀnÀÁ£ei Ìëà¿oî¯2É/‹ü*2ÉzÓ^qË%2öŒŒøé_¿ý×åoÿ¼üôñÛÿ\~ ?~{É®ežõÿ]Ú¼½¡«ëðûRVùåÇo/¿_~ùúòµùÿß_ú¾}ü÷æ×ÿ]ôåßšÿýýòçÿlnþex©}á·—R•Íß_»¿u©š_Ùô·½ÿËËüáò¶Å±»a0îõµ1™mGq§çß_ÆYªîß?üãå§~þ›:±E‘Ue½¨ÚêËÿþ÷Ë_›æÇƳke2¥Îmó».l™åU¥›ß¥þ#».uÛ·5¥ëTù¬çîŸDÛJ¼éÒ”±šîF- e júZÃð7×qÕôZÙ¼A/U]–p«Ð¥Í³º‚¿yH–™©_¦›ÆÅ›VU´¦»QKãǮ@ÛQYHÓl5€KYq€½6.Þ´i ©énÔÒð–·—šm#›:på¥8¼¦¶å—ÂÖѨµ08†E†MÇ%åB ë ³Z\Sãò+Qé,VÓݨ¥á1¬2n»ùNÕEVVþ¦‚JåT’ô» ¡âö[îÔoÑ.oºN•Õù¼ß¯Z`ÇØ·ÚÚJúÖVjè2·—¡œ®ºQþõ\!H«í¼åôË^!§È©¬Xu¹eÕØ³ßžb±êNšÄX,¿åÃ,V30u¹¥zšÅŠAY 8pˆ•ª»éÖÍBÕßb•–Õ[§ª^®õËÕ_Ä_1 Ó×Oƒ¡eþðýå§/õE—ïm$t½þÏ÷ß^lsa‹B›Ë÷¿\þ%Ëlù§Ë÷¿¿Ô×²È w°îŸdy÷Ä\s[T¥ó¤ÿ¦ºVuæ~£4|R¡Öð£úÖ¦Öt7ìÕšÞ±û:¤ð 1 ÜšÁà2Þ`ñ¼póös÷äó÷†"[ÿFÍ ”y‡e1ôÓ0§nB·ÃQz¢kô$ÓðÉøä#EOL•Tuîvºi PA€(Ü"îçg86fI R`[Óð›@k²#€ÐÁ­Y%:‚Ï¢­åwà&@2aéRµ‹“*¿fµqxà@KÌʆa+¿é¡ž_®”û¤€RìgÉÏDT@­XŒf•ßßìÆ†o1Ôp#jøÜO¶~°Xµ°è ¥/Xôd 9¥Æ[0~à7Åj¨R`àûh‡'x@aZ‹¬„R@Á0‡­QèÁ¥¿øœëz? tŒY3³ê¼ÎQ¸åÑäJ7Ì*é†Á1£ËMc2  HFŒ­ŒMH0GJ4#Àò'ÀDð|à7Œ ¢f E¡l?”DgFMˆ™-¬<:gŸ+7?ߌF›>Zñä©ôÁ!±MZöÓPúêO=ÀçìbdùL´–¡o4|‚gªjè‰w)‘Z³Q gÚ³¾òZW~?©`€×GC0#À¸û ´Fà5þÆà™ÂõÁ­aè`|ë=DT,µv¯ŸèBU©‚0ˆHvß  É%ŠíÚ¢ja=€°RŃmÙÀ>²:sî0=¤Fï¿ÃDí#f;ãý”± Ùa´ô˜Â¥(]é"ë> ðv ï\²MFH„Ã`rÀµœˆîG—\~€£lÙ;K²5·)ÌŒ &;#QN=áѵeœø¢4! ±™r7 ¢\­sÕj“£Må OKEm3¾zn";ÎÔN°¾Þ{Kañz—lW«U¸ŸTq`Œ˜^¯Ÿ2qSpµè³:{ˆ(ˆ%Š_3!ê÷ÂJ¢sÕ.p){÷ 6™¸"ag/UïѦŽEV_eC… ~<¤ŒïÊvÉè¡h!iØ»Bˆô€¯~@7<6†Òުɟh£!•…/«¦¨“_`"“ˆ’¶è£¦o$­‹xíd-:ŠÙžß@¤5*ºÞ£Tßaƒ9»m2Î|ÕÔÞ„ŒxŒKlHð˜›F$Gä@Á-; fœ)3)ž1SȨ~žŸÓÃüÚÏéaNaÁªL{‚•ѵDY¹¬‡BXÌœ±ïÈ Ùm×ZTû¼ëT‰ï}Tõ´ ñÜd>J]t£Ìk.:;‹Š,òгØÇ/Ä7?ÃojôM6h6z¦jôßr /CÐé:ïgˆ*.¯f†Op>cüô¼<êAú-=1ðIçGÍÌ ƒzûÊÆ–Á™2°†ß 9ʶŽzª™Ñˆ~$àqgŒQÞ„ñ:L„Ð"Åãsк©§Md¶Ñ6˜Ìé?FÜÇ Ç=ýDÑ÷êew¡G&ÆÓÇd§zÕùWGG|s˜n×oôà gMÝŽœ“)ãc8Çî;óÇÜ1Wqe.« œÈ‡;ˆ†–0ǵ].Y0ˆDÞš-¬·¯)þÌ– â»:]í‰2˧)É÷NpÏGøû)·-#Rùg°ØCË à~²p¸l3S7 kG€GÍÌ”)é(¬!Z·dP¶õƒaM@'@ Éjª”Ùkm\?a*f–Þl¢ìؘÖe{Æ•Áò@è`¦ŠYdBï ­,ëÄ£]…Íi8F¼cŠ¡û °[8‚@•'¼ ¸<6¼ ±Á`X”±ÈŒûâcʆ)«¿’Ì[cB˜ –½1™3«€ñúý¬i¢X||HÆÒ”ž 2žFñi³ å)b‹W›Ñw°–fÓ‘³‹†žîiàÊ›VÏ ƒ#ëU§›nXð§3pUa#>žS{Nyßǧñ-Ž× Œïà9…RO'½dÏ)ˆT·>btãy2‘¤8â •gtîeÇ1ǘs0²™È’=M K#ØÍæ“-N²¾Ôå.`JL¯lÛI†6MÝ2..±£!wqfŠê[Ÿ‹É Mջ Nº“3ºžÊ‘`',ž‚wqð ƒÝÀpGðtxG@$£²)Pؤ…[åˆ!•TzÒÔà@SÇVîÊEgË63ãJ Äòkæç”b<;„o‰ª3u‡yB€DÒ~ÿěɪÑop½¹%gúÚ™½`•V»á°´h>þ”7I¥Ðv—4¦À¨Œ+1޼ýÀ‰,GÌ~цMO&c€¬/H¸¶`ÜœIû2&Õ|BÅOŽ\3‘áà[öÿS• {Ê¢½úªªV$Jø'œrðÉŠ¹×¥/>ì¢?Œ(Ü?ág²ðL²#š‚2¶ È8Õ™¸&é3&&SV4áõÁZ“K‘×§â{½´Þ޾Âqyë¥ð=ŠJ`9—Ð×™Pdò׉FÒ!As¿¬]¡f´¡†.ÃÇâúÌž»’ÛÜP|Χr6íèz>´òL æ˜ÉÜ™,¬%•6•WŸ(®X… )œ£Ë¹¢,<9÷æó/‹ÈFFº0îõ„l|ø›#áÈiæu|ú4ß“|KvfËÜ]Æ…˜Æêà'g6‚§ b{7'×ÏlooM÷ Î Vt-s“»ø¿¢ë'ø ¬o©Í$þ*R‹Fð@}ËMõGõà+°c\üšôßW£´gÀª¶Š¡°:ëY#—›é5r£ï.äåqbjà MeOžEߎ€(töw7¿ùDÙ“ê”#J¤*FoL²‡ÿðž©Ì¨q4º"ˆe¦ß(™ê_âC ˜“Cî%xLMüçõÅÌK \Ukx¦˜Ìðj3zQ!5XÏ`UZåôÙÆ†1¶†Wá­ #œõø} #­îGöÉisä¬Åbøï#…‚%Óþ‹… ·F |#JX¢ž`NŽ%FòS;õ·„ú[ÀûEÈÓîúN`M ZŒš¡˜#á•Ãx-k…ŠRI`>xÔO)\ 룄60Ÿ{jQÕ#Ÿª·b†§€È8ç¾A x<6 xl Á'˜qØVÙM5Ð|„%ÎÕ3aŽ$a¬DÛî–Äy6Á-Àì<ä'!¶–ØK°[Š1 ˆŒŒºÂPI F–¬û9?prÂL ðx<LõXÉ’åH©úycœï®!Da*«)ž )v$ç€!š¢(°r„õÎ(õ'ö¦ÃÞ·&ôN*9©d•$ïu9.#§ý€X•k=6å}>çÂl‹dz9pL?uÀFäØnäì:ûã:Ob¯ÁYÑz*G.t0Ï©ÄdIT‘1r½†A«ìZ”Ê=QÅD E/—ïÅOæd”+瘄T•)æ¸ó†#¦»gzóuaŽ|€y -¯/]DK…¹ý”@A¯2ãé¾§Ñ$˜OVÍjìv<Š>™XZÛèQ‹¸–¶ûLxÎLfrˆQ^°HdÝÉËäKˆ’øeÇÄFÌãØ…Ç‰„fdqå,™v¢|6sëíxž ÙúX²ù•+UVKÑÜQwû‰ï,õýQ2t[ d+ˆ. +³vΘrdiJ&¥„p|î ªRÄg…Ñ51î½"­š#mQ]lYg Ú·£ûm¼ÖתÊÊKQt•êïÚK‘_{ =nüx)ìU©ZW•ß1N涃æõþ:ë>º8WuívÐÞh¾¸D÷Nå4Q¹üòòá±µcNu6î¡ 5:¶ÉI‰ŠxgîïtncY_šdR€©”8ó0=Eò“SZºl^Å7RJS6 1TöWbŸÍía«Ò! 84SæãÕé¸Þ1ó¦¬Iw@/ ÆUÑ„››OVa¤—h¢R™ÊF»EµÄ5¸„Ókc6Ç蘌+ƒI¢È¬-¿¡s“ ÷¥å,—(³¾^áe6%ߊÖj@åÆàbê$½‡Ä± a¥¬uÑW%Vb©NarwUx£¹+wbƒ§ÔkÁØâÆÙÌÉóè²J›lã2lÓ|°3“Ü¢d±õŽÍÄ\D£½E| ¬c̉~”º¼ Ä@VvÆYÅlß3zd¢èGªWÜ7fg‚qx2¦/å]`Ê©aà3J¼Dnüdõ$eñ;•ÛTv‘‰JÕp!¥ª—fg)fhu^¹B멬®·V‹Â¦œ S5:Q8MÀ'•:.Ì”ïH„½[ê}%bö±iPû"®Bàɺ“U:=ìY¸EoëÇ…âSmƉ…FÙÌ ²j)4Ê/4ª¹á‡Fµï§ sÛÁeê…ШÚT^Í /4ª{§rš¨Üâ‡FÙb$«ž£,œÕ“mÇ¥çs üQ…ó€²;`ÿ1ž)fçQ4c¾ƨpEŽÒñôüzØ3œ1ÕA ã:ûcú† ¸IªQ±$tÌ !X¨`0åEvaÖû;)~ºWެsö9ãû’Yp3‘Å4YV21&”…Q "‘ ©nÙ:% ‘9ê—bÛFç4£zTéŠ3fo–r‰²†ÇŽæÈk× PdK^€B{FzsÃ÷´ï§ sÛÁèÈ«%/@^z47|/@ûNå4Q¹Ä÷c1ä@Æž§ôåb`°»f ’u,A‡‰ÜÁ7|^Ã( 3M­­Jê²®‘ÄiâÔ5óv©×´,§”‡‘v¸5\LáºJ0:ÏÞ ’\ú§”ÇóÕ±ñp…ð<‹-þí.ùÊœSíã=Ù­\+PïÏwè#§Çÿ)<þç¡·mª%á­v¹0Ĉ1’ÈjÅÒ퓉˜‚Û–sîɈ5F‰¾çyy«öTBS#øÈPP£8–‰HÙHŠ-Ù£­LÄÒý|~"ÛØQÅĈz@©“9Ä±ÎØ›6G>›RMÖŒˆÂMlGÉ:9¨DТg쇪$Kž,Æo¿>o3õ=#ÍuᣠHÀ*ÜDu d§9v: ˆˆ é¦Dÿ\§˜ÍÌTÛ‘cÓD’ó,]€¯UU/󵆭U™Î]è7:Å3O~Õ~€ú"úM¾7˜ôÜéŸW£ô¢n¼ÐOàGðqû¨ưôö3ðªV,{%.Œ…ó!ZÓñÑY‡_…qá´T¼#Qޙӱ c›) » QùÆX>±3½öA`Ä ˜ª>s;§ ‰0,dõƒD*u4žñdÉž2–U|˜Xì%fÒV‹úê÷´ mm\Q¸º¯7›à„†ÅhµŒ©øœÃÞ°½'RÆd}"/Ù*P[\ÎŒp™ÅU1nêY#"aç"žMŒ†„’“L|Ç) vVE3&Ȳ‹¹‰XYWÊ ×ª`Bˆ™c|¢ª¸lõ/Ê‘$Qðq¿BÏmpÕ1Ç‘ðѬr5k§,À¸»WÂ…$q&Ž>Œï«¦’?ïÆæLVOCħLjôòIV¹‹NÉœC§!46ÂĢʗ΄ȺCe1„I²Ù¡}<å­é½û{«[ïÈ!Ù2Å’£Y5™ì¼T<>DÂEWÑøVId©¬{ç͛Ֆßm¢™è¶—Rc.¼wÓ~Æ9$ ¢Œ’.'€(Le`YW¶¬s+QOÙú‘o>¡ÆsÕÛùôÃ.G¶l剷ýù©XD wÙtO²AYo>?\²ûÇä¥R!N»n|óvÝ» ³Â“v c(=Á¨(‘â#™ª•*OCª~6T‰äJ!4ÆÍÇèW"ˆ¸Á¬—­—*[ØjK­-‰Se©"ªHñ‘’®·ÚÉ:SyM ê<-ífÍ]€ððí™Zê9RK½Û»F/¦Âh KgÕˆ´ÃyÐòZÖžr™n¯ïhu5Ö,-˜É®:3®sðž%©íøhÅt¿¦Ú\U ÔúÂ|T Ÿà±}¼ÓÚ#É‚K}iV¢(ÆdÁÃuÙgú-³×<½ÍÝúRÔ¯¹|»?^Šê5ßoÿNyÛÄpULÉ‚ûë|Ìôë|lýló…7{Æ84áÎ`H| 5ƒ†Z‡ÐjCn—.`\—ãNº1H]~Î,c´Èø,46Š?¸ F!ìlÀÚBՌةju{ã×—oaìnëÑ7ïWùÔÀp£Ï?}QV¸ÕÝ­šjÀ¿áÆæ“lÀÑñS;m —ùˆ€ã>öÅûÞø}˜®gí;Ömú}üÒÌ<5Ž«¼K³ ›5à½ý&Ù’‰ö›îî…ÝGò®-Xõˆ¤ÚªÛ+±ÜdÖÅr“å Xnº7ØÞð°ÜLhýÚÆpi],7™YÀr“i¿ícyÿŽuÛ°n;b¹QQYŸÒã£5¸\ o¨°ž×â²QjÂå\ÝÞX‹ËÚx¸Üjfs\Ö…‡gÍ —Ûwz\Ú.‡ËZ/á²V~j†ËÝ;Ömú}ì‰ËºבȔ–*ÜÝó «±ÏL0µ1·7ÖbŸÕöY³„}6÷0£¹ác_ûN]SÃ¥ö°¯iiûlæ÷‘Ͱ¯{ǺmX·=±ÏV÷±HoKy-|LýžZ²ýíTùEwÆÖtc-úÊCÿB/¡c‰¹¨ÙYk.ú¶ïôè=µ1\*ý‹l ýóÚë#¯gèß½cÝ6¬ÛÇžè_La-»+ÙH€»•ÀîâÍiVSHQMRšÛk)¤Ê< ©Ô…øÆžŒ½[ oßé)`jc¸Ì< )ë% )=£µ½áSH÷ŽuÛ°n{RHµ¢3ãÒÝÜ”ÙÅÊ·;e˜3ÙÉ"žùÝŸÕ„W•áUæöƯúmõ`šzzݵͲ¦mlNÇÁh;»ÔqBvï”·MôB´~-wÖ_W LS—ní σÙÞÆ\Ýx0o:ØÑƒi³ü¾Lbë1ÁÞûû6 Bfª©x,B™Èÿ Gq˜·#Wý\ËÃ:g´Í¦­£œ+u«*Ww°ª^Ьïv°ƒÛáFöwïtºÁkÃeåêV• ºƒUžû¤½áéý;Ömú}ì¨;XmGÝá3¡;lض_ç\›ÅhQt±­ü‘·l ‹(³ÖêVO›9­ ùæÆZ4¥G€¦Z"@ßóbÏË-µïô6µ1\–šb‰çAjoøؽcÝ6¬ÛÇžh§¤ÈÐ eê]‚æE#ö^Sx‹˜û×Ýܦ‘[k]Sxº±–šò£¦¼\¢&ß‘cGÎ-5´ïôÔ2µ1\5åù5åÖïÃΨ©{ǺmX·=©©˜ŽâG®i•ñ]÷¶˜ö}´®no¬EÇÒÛê·åÒV¿õ½&¶œmõwïôèV:[ýS:–K[ý¶4~³­þþë¶aÝ>öDÇjÜêÇ'Ωú€¢ax­~& ÀCJûÃኼmÙVÓ.œÑåíµ¼ ö"l½ak/ ÂÖ³€ˆîžÖk' bêcâõR@„­µßÇ, ¾íDÜô±#/h—–ç[Î]ì^o·xlxmq??û‹Œ—…a=3¤â¹Ç”å+eÖXŽ=:ß2õuªo*Lܯ_/__þâF¬H endstream endobj 1696 0 obj 7574 endobj 1702 0 obj [25 /XYZ 32.2500000 478.250000 0] endobj 1703 0 obj [25 /XYZ 31.5000000 479.750000 0] endobj 1704 0 obj << /Type /Annot /Subtype /Link /Rect [87 778.250000 168 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn17 >> endobj 1705 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 179.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn18 >> endobj 1706 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 141.750000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn19 >> endobj 1707 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 108.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn20 >> endobj 1708 0 obj << /Type /Annot /Subtype /Link /Rect [60 749.750000 110.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn21 >> endobj 1709 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 159.750000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn22 >> endobj 1710 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 128.250000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn23 >> endobj 1711 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 162.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn24 >> endobj 1712 0 obj << /Type /Annot /Subtype /Link /Rect [87 721.250000 129 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn25 >> endobj 1713 0 obj << /Type /Annot /Subtype /Link /Rect [87 714.500000 104.250000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn26 >> endobj 1714 0 obj << /Type /Annot /Subtype /Link /Rect [87 707 161.250000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 1715 0 obj << /Type /Annot /Subtype /Link /Rect [87 700.250000 182.250000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore >> endobj 1716 0 obj << /Type /Annot /Subtype /Link /Rect [114 692.750000 213.750000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn29 >> endobj 1717 0 obj << /Type /Annot /Subtype /Link /Rect [114 686 188.250000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_advanced_renaming >> endobj 1718 0 obj << /Type /Annot /Subtype /Link /Rect [114 678.500000 193.500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_limiting_renaming >> endobj 1719 0 obj << /Type /Annot /Subtype /Link /Rect [114 671.750000 267.750000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_chosen_unignore >> endobj 1720 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 158.250000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 1721 0 obj << /Type /Annot /Subtype /Link /Rect [87 657.500000 178.500000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 >> endobj 1722 0 obj << /Type /Annot /Subtype /Link /Rect [60 650 117.750000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn31 >> endobj 1723 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 147.750000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn32 >> endobj 1724 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 171.750000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn33 >> endobj 1725 0 obj << /Type /Annot /Subtype /Link /Rect [87 629 127.500000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn34 >> endobj 1726 0 obj << /Type /Annot /Subtype /Link /Rect [87 621.500000 150.750000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_structure_data_members >> endobj 1727 0 obj << /Type /Annot /Subtype /Link /Rect [87 614.750000 168 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn36 >> endobj 1728 0 obj << /Type /Annot /Subtype /Link /Rect [87 607.250000 195 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions >> endobj 1729 0 obj << /Type /Annot /Subtype /Link /Rect [87 600.500000 133.500000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nested_structs >> endobj 1730 0 obj << /Type /Annot /Subtype /Link /Rect [87 593 206.250000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn39 >> endobj 1731 0 obj << /Type /Annot /Subtype /Link /Rect [60 586.250000 98.2500000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn40 >> endobj 1732 0 obj << /Type /Annot /Subtype /Link /Rect [87 578.750000 139.500000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn41 >> endobj 1733 0 obj << /Type /Annot /Subtype /Link /Rect [87 572 143.250000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 >> endobj 1734 0 obj << /Type /Annot /Subtype /Link /Rect [87 564.500000 137.250000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn43 >> endobj 1735 0 obj << /Type /Annot /Subtype /Link /Rect [87 557.750000 136.500000 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn44 >> endobj 1736 0 obj << /Type /Annot /Subtype /Link /Rect [60 550.250000 138.750000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn45 >> endobj 1737 0 obj << /Type /Annot /Subtype /Link /Rect [87 543.500000 174 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn46 >> endobj 1738 0 obj << /Type /Annot /Subtype /Link /Rect [87 536 148.500000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn47 >> endobj 1739 0 obj << /Type /Annot /Subtype /Link /Rect [87 529.250000 174.750000 536 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn48 >> endobj 1740 0 obj << /Type /Annot /Subtype /Link /Rect [87 521.750000 161.250000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn49 >> endobj 1741 0 obj << /Type /Annot /Subtype /Link /Rect [87 515 145.500000 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn50 >> endobj 1699 0 obj << /Type /Page /Parent 2 0 R /Contents 1742 0 R /Resources 1744 0 R /Annots 1745 0 R /MediaBox [0 0 595 842] >> endobj 1744 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R /F1700 1700 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 1745 0 obj [ 1704 0 R 1705 0 R 1706 0 R 1707 0 R 1708 0 R 1709 0 R 1710 0 R 1711 0 R 1712 0 R 1713 0 R 1714 0 R 1715 0 R 1716 0 R 1717 0 R 1718 0 R 1719 0 R 1720 0 R 1721 0 R 1722 0 R 1723 0 R 1724 0 R 1725 0 R 1726 0 R 1727 0 R 1728 0 R 1729 0 R 1730 0 R 1731 0 R 1732 0 R 1733 0 R 1734 0 R 1735 0 R 1736 0 R 1737 0 R 1738 0 R 1739 0 R 1740 0 R 1741 0 R ] endobj 1742 0 obj << /Length 1743 0 R /Filter /FlateDecode >> stream xœí][¯ä¸q~?¿¢Ÿ l¯x' ÀÎeä!Àbȃ‘‡`mÇ0l#c?äïG÷K,JªÃ&¥>Ü=Ó”DRdÕWÅâÇÒÿöëßþ矷?ÿú¿·ßÆ¿?ÿúÖÜj†ÿnÝŸ–ÜÞÇߌU·ßþööýöýí—·_Úÿÿþ6<ðëçÿhÿõ7~û÷ö¹ýþ¿ÚÂ?Œ7u7üíÍ0Óþý×þogXû¯fþ»+ÿóÛþîö÷®Æ©¹±3þï¸ä¦ïÅFËßߦ·dýŸþö÷·‡÷?Ôˆ´J57&…¼1'ùí|ûS÷b¤žòeOùMÞÖ½n¦õÖ¶½å´ÕÏýLQ-“\®k¦@ó>ŽkúìmÑšm¥â׬ƒç¸kž3x°æäƒ×6Àn‹ÖXöÁ{†äæ$éȹ¾Û®87¶”uÔŠu©“\ÍÃ7ü ŽàÝêñ?ôßtñεèÍl`|Ûú¹‘ªqý7­]Ó¾¨“JßX7 ʤœY¿n–¼jÅø³ªî{x8˜Ð,VõsçXµQ?X¼i\ú©˜jO=Š)'ž&@]¯“È8ÏëÊi˜ÆÖ.#“²wö\ÿpi}neÅ6¦Þÿƒ±¾”w¨2¶3üÖ>ÒÜsÜÚéá¼:†ŸSící»ùÏ+Úh º6–ýèï‘~ÒoãÏ- /§À÷…‡ÄþyðÓ··n±Uß¾ý©½Ôôð×·vìZ}ü¡{quûö‡Û¿4ÿzûö—7Ö¾ŽÔ¶]]t÷õWXÓ_±wëÍUó¸ÒôÊçþмK1,TW$zEõWÄÔEØÐ7qÜ2¾è[Ã÷€ ô^AûüMñ^í¯¨éEß7¢b7»çÕ ÙP=w„êW•ü (cφ™üú­…Ÿ‡…@¥ÕƒN ô*ˆeï,á¨d,@%ãB¨d@Œ¶¢RwÏ€:sãO Pɘ* Úh *õ÷H¿é·Q•¬œføg •H:„#Ì'(thõL¦½4*jA%R =Áû+‰à:Â[õ é¹–PÕß3@Ù\ÇøÓ¨s:uN¨k Ôõ÷H¿é·Qêt#&$P(ÔQ•n;`'')NâÏDtÅÊ3)ñx¯JêFÎÞG¯’sÁN•ÔLû*©™ ©$s@%Û¨’Ý=½Ê=êj_%5S•ÔLÂ6$TÉáé×!ý6Jª$ç“0 bïîF+†“ˆÉ;´w·hq1IgrYðW0ÀÍj€Q¡3½ŒŠÙŽŒ¿õ .¦gºaoÚÍûSCÁooÚŽæ{̲Šñ—š„aü-Y Ø€hŸ·±cþtÒöéwÙÅ­ur;i“lšÚaÍÂø„J;àŠ´â"¬1ùhîÚ0ß8á¾àþ5%(°v¼pEC]²Hõ”.½ß"Ø^I[´œµÖ. ö%AP*d`K¬% «ÙÌuŒ?%0J„ ‚â° ¾2j¶:¤ßFIƒ ·Õà]¾==Àql©rš^¤œŒ0:mxeÑ#^* P'2ü˜‰×löU³,Ø F°020®¤Ç¸ÒRÙ»{0˜ë †‡ÀÂ0Ø[Eôë~%Á¸I¢ÐˆzD”Óª !>ÿŠb›Ùœ®äT°WCâDHC`8Bሥ„w÷ 0×1þä@C iˆƒa׬4¤¿GúuH¿’âì4à a‚IL¹qjK«Zé´hAŠí£µáXY1$‹ú8÷°ÛvY°• c>*ƨd`DÆŒ™ªô÷ô¨ó¨cüÉ|T2¬  ’i@d©+¨4Ü#ý:¤ßFATêh¯•Rìõ’´mX²CZÕ.˶Þ- öj•h€V Ò*!€Ä÷q'_+º{­™ë6@«¸ i·  nWZÕß#ý:¤ßFI­zÂZw<‚D‰-­½Ôc°lļ½Åû`ü\°W€$ (µï 1jEPêïDy¥¹Y€dˆ d$ˆïtP€äDPZÔ!ý6J šJÍt9EðF({CÙ;éûà» â ÚÞküMQ—é9 ÇrzД\ìÅ èGF‡èG†WŒYÑú{LÑýhncÆ¢ ÂD]Ä=ÑuH¿’˜c&ú)„ƒk®£8Á1æd£ËàºIÀœNÐ!ñˆvwÓ‰(;r£G™°ƒÀhd¥Ád%âö5j²êÖýùÇß>eÞzíи‰üÓ0Ô;&°¢q2ɘ%uT® ¸¬GèTûC|$’Ñ*‡Ž‰òµªž‚é ¤êÓ¾:ÅçÜ lêwš?oÐK'—ï6ÛÈâÀÖÎæ²?Âõ;°À…e%¿iÝúV`…/•p»C9sƒ±<¤l–ÍÜ’›eÁû•‹òÊ&&%rM°â!ü™ˆ‡ƒ>YüS8e4H;“O ´ŒH æ|)›eÁû‘@òòH æqù鏿\s™1ëûÏtᯱŽ]R¸¸Å·üHÃ$5oã·Ë€eÁüM]C^D–IøQ|®[(6 ±<ír¾×ú€j“qïÇÝÈà쵈@Øþö¦û¨þJú6¶¬ìQ«CìQ ·¬^±Gû{†Nh=:·1m=XbZÍ`+öèpôë~·¬žØ£”“ϸG0–âáÇçP¿#"Ë8–gŠJ§õòI‘y|tðù¡dÅ ׎Åì­™ 4BšeÁ^D±€mÛzé!D±€mÛ@D±ÛöQÇø°m­ ±mÛ'`+¶ípôë~%ÅNlÛÈ®3ç=Ù¸#-ã-¦”„8I޼ÑwÜv‘/Š¥L œÀé&„hÎŽ,4QÐÎ,0Ù°eÁ{ÞºföØÆß ah*B$×5^qï0Ì;½Ç¯Øñ¯ØqÀ+î €WÓß3t‚{¼â¹É«q,Ä+v ðŠ»àÕ ÷H¿é·QЫq|æŸ6GÃ9Ó½êé¢cæÙñ™å-˜[ìUgXÞN†XÞ]Br_ÕäŠåÝß3¨«ôXÞs³:‹ËÛ Àòî  :‹‰å½¨Cúm”Tg¹ÍòN{à$MrŠ´yS¨fâð÷ù‡ `€ÉeÜòeÁ^S€2îTˆ2î`LÕée¼¿g(åQÆç6fS!ʸS 6Ü@Se|Q‡ôÛ( `z¦Œ;ç„«&!PHÚ®x&on{=‚¹VË‚½bo@öBglHìaàÏÙUöÂþžA¬ç:ÆŸ {¡3¡ì…΀fWÅÞLÙ uH¿’bow˜_ŸË'-ü n¹{®Þ\°WÁÈ…è\(¢sàĺs«\ˆý=ƒ;/âÜÆ¬à.” Ñ9 ÛXåBî‘~Òo£œ‚»vÊ7óÞ4ìby‰)4¨óyÐ$Rþ+LÂN j…~¦4ôÙàû0È5LyÔè5µ¥~®/ð1h¸§Ã˜EãOåaP[ ×Ô– ؆4Þ#ý:¤ßFI â¿™t˜—ö\L±3[çºýù>ÌÁkÛ²—»Ñˆó©eÁóø]Cžæÿ E]ÀÐwüñà\lY!eĬm©¨-`bÖážù…ò,ƒÀ2ˆ@bÖ¶”Ã6`bÖñé×!ý6JZ9£"ÎEMâÓ<—,úÑ”i69¸eË‚½Ê¤P& ž¶¥º‚ÔÓážAY”ô”I  L*@=mKlROÇ{¤_‡ôÛ(©Lj¢žž9ù Ž_ó((çs({W„*‰ÃŽ?ƒ÷úãêkžµÙm$ôL›‘F. ÞÉ£s™}¹ñ·XóèÚRåÑÜúŸG7Üc–UŒ¿fþïø›­ytmih®/ûÈ<ºeåxtm/&‚qdɃƒ%…ƒ~üàÀ ‘b°ž±œÝGMk'àAE±fY°×r øQ.H¶-•ÀÇq0‘ìpÏà'9îùQŽ?ÊɺÆ:І…‰dÇ{¤_‡ôÛ(éG¹‰WŠSÓHÞ!9 ÅÄF AZƒ6¥¾ÿ8 Õ½qÂW@->3RîAu^ÁN dÌ'‡¶rh[ ‚¹ŒArèpO¯a:ÆŸ>9Ô±&@mKAPº+8Ü#ý:¤ßFA dLŸÇ"QМÖ"zuRJM¼‰Oh´Rò €6fY°Wi¹J+жÄÙ˜€ÐážA)Eã)-w@iy€Ú–‚xaW•–›IK¹õ”–Ÿ€Ú¾¸Ú†eBòÙòµ<° ž{ή€B?¬&[ìU@iÊ…Ñ1›c R‡{“ÎS@iÊ…±-1Æ®* Ô“ÆIã) <…±ùL›,*í§ü¸‚z‚<¨—UZõ `Z·,xo<†éÙ¿m Ã`¸„õá/¤Òßc–UŒ¿fÊäø[â1Lƒ€OWâ1]ÑØG½ˆÇ,(afþ¢4NE&& ’ ¤·82iýŠ ddIŒƒ~¦¹8W%1—‚³8ôãùûö~#¦—1#~‡Zìõ;¬~‡ PLÛRËbRL‡{¿ÂÏï°ø6@1mK%lRLÇ{¤_‡ôÛ(éw¸‰bJùÈpD\ð8VÒoJdN+F¡ŠòEÆ_·H™¤ô•º‰0zÎ8#sbê þî1•7€˜Ê›1•à oVÄÔþž™uŒ?1•7!b*olcELî‘~Òo£ ru‰?G”+Òÿ é ñ<ÒÆ3_Ä $¤’ßLb¸Wõ9{°@y³,Ø«ú0919Œ$r¾bö÷ ªÍ=æáÜÆ¬ú<Ä<äœÃ6VÌÃáé×!ý6Jª¾ØV<\õœÝÄv ’äãLêO¥]T¼Ê…W{Q )qñø€½k–{¡M(—!(‡1Z.W<Ðþžº¤ÇÛ˜¡M†x \2ØÆŠ:Ü#ý:¤ßFIh“s RÜ? hoñ$f¯RÒü¾~éuAySÊ·%sFz ”íF.õHuªÔ²`/riKRº.Õ*¦:îI ¹4È¥©NÛÒ¶SŽ÷H¿é·Q¹ôÌD$8e$$õ;¢g”̦8q˜°‹A‘ÈÈ,¬„”ÖHuLÓõÌõL, ön{mÊ{³_ÞeÓ‰»àóF%ü€ç)¾ OÊÿÔ¼¤9¿òÙ nétoŠ)i= R ÞÕk$ù6!%íü5?­ze¦m`!EJ«›ØÃÿp‡Þ!C³MoW¾%$Ñà'e¥š‰O_,ÜCQÔ\¹n"j 4å»F¹#ô:í¸%™þ$(™ø½(œÂìÅÍj$#‡«Ónð×ÏÏï^ö…àd ³!gÆÝœ[üÊó$k‡XÉÓ~Ò÷ØD¤XÂ^{íGB-Ê–Xy—›rZã§ýnúkÄ8(xÆ?¡Ö…â#=÷{¬£³ùD¸ƒkr;ñå;àþey¤ÐΖùLëh$˜oØÊ‚òUÅg§’¢Ò3}䜴Ø+GЇ ‡'Þ»"¤‹L¼¯\jZÞkʈO²ÀBϤ˜ýªøAAB Û‹x¢ÉÒ¸($u¡è%˜"ö Ò‹l×s@AŠ´ß&Qºð©¤Žd¯ˆŸE8G–6'^®¯LÔ8ÅÓ$2—Ãu)¿1ñ ž½q\£±ÞÞ¹yx†êR„$CßG"Ìbx~BŸqØ3SVa³^ÜŽAy‡Œ›‘Ž]h¯Ñg8zŸÉ±ÒP8¿kÙK”ÉP-òÙ΂‘sFœßDÊ£JÙ‘§DFOL”xö±’g,o“¬Áâ@ÎùB7„»â¿ºÐ‡^ùéÙJÃ…/$#!ò—ms¿8•Ä.;ß—/²}y(ƒŠ£6E£’/ƒ!åÓºÌ[&q¥ì|J4ÐE"”Ø$aÁ{€¯‚÷'(«SÊŽø“ó§PVˆ”×8\&q$”’˜žàáÉË>ÜÃòë¾Ñ/ÕÆŽ»¡¸ëÚÀ =35 3¾9«Á&4ؤ’Áb¬NÊ=c¦ÁÞA3à¾àA©±'#àÔE+”B3€>e¾µãAW弄~F1 Å=ÅK»>iÔ™¡ß «3îo‡ö$ Å[1€Ð•ÝßKBÄÚAk–!l õeuðâ:§!¯¡pìO°Þ…ùOHð @„]ñÍ|2ËŸ1žÁÕJµ¯‡^á(YM ½æzÏ‘qíÎæˆñƒwë­EÜc8°ÈKw0o“­™õ{~Hf#n?~¯ —Ytá¡kØÖ_¬àO¼×¸Þ⚆¿)Þk15BfE{‘|tca‚oáPy6|¥f{¨2]Á LJD<ö@Q@T(Ê[ùù‰Ô†;|æðÙ¦˜ôMO§+âxRÞ”`\Ic¸”¾‚b<‡z¥WNà’¸‡RበOF]@üq—:â¶ŸW»Rá‰ö¦­Àµ\n{C²¼b" iðòW*pÑÞ´¼ŒVÜ€AÃÄÔLb\‚â->g¾Ra0ö¦ª¸ŒV°Û;Á/ L¹ÀßRˆlCàÓˆ?CØg:óüT°Ëv×”Ñ Ä[@¬Ø_ŠP¶õË¿é5¯T Žnjà™TF+¤mAš¹‚Êà¡äˆ=ÅÙ@[_#Ò6Þ7»'–Ñ [9§>³&^T”eåÙU€¤ú|(í<­ŒFz@Þ i{Œ <BŸ‘'ŽžùJH@*ôJTñvjlð 0ȯpR^üèad‘‚C'áXMùq+??cvf­¹ò 'Bð¡*ßës¥dôM !<Òˆ1i»w=pÀ§8 hm‚ ‰Ö·`]_â$Mñ4õJ…u*¬ç’Ñ v[`g/qú†Â>#œlˆxu·¼‚ÑK;³ŒV€ÜH×\á\.ÊáÃéø—?‹Á™¯T€ŒFAñq£BÄk#Ho…Á-äW8±Ãñ F…‚"bõJ…A* *´×ÍÝ„“Ë+¤Ñ!MÏEíOPÒ¾6n·¾Â~H1(ô\/ ·šŒ´&#[F0— B£ÀӞפdצÀSñ±®^MLIÉHQß—QRÄ,“ŒâøÁ75ð±Æßß‘NkÚª7¸e Ü%Hß”cƒø4ÖEq5ÉMî[â«sÉh…Á( ªné K§ºäé'X]‚Ý„;x‚sü Î)Á‘‚€‰ªí%ÏP윤¤¦§$­O:§ÊÕ·lòFÑŸ¤†´¾Ëu!Ú\“…O½Â÷>Š¿Ï«]!-EЙ‹ˆ?u”6ƒ0¾xH+oo0é²<ë[ tì67(²@š»‹*bÍ™ÿ®š™Òqs­|~à¢JbR^6Â7mËuùp#c‡¹“.}IÛD8ÔàrÊa- Åå’[$¹ð m6ƒ#Çd” Y¹ð ÒÖ…³€cú %&ãIßGOº¦}GÌ!‹S"®U=¢L¹ö5)@Œ‹ Þ‚›kdžä”àªI€ ’Ñ+¾£„é"cpÍ _Zײ¦èvÒ^“\¤n^.†~d hI‘ƒ\ûŽ`ö¡7ÅSQöB#ÑÊA&PâP åX@.fi¦È—C ‚\ã3‘*B Ф§Å%„´Ÿ•ö< eµ»åâdqdø¾±sfG&bXp¥Å³ùB ¤Ó^„mc|?«º8W•ƒÈ¸QާýÒ8Ûi‡Òƒ´Ô­´T ˆÞD3uáZ/Q¤”/Q%Ū\aaJbƒˆ«‹gµ¥ôp¸‰"½ÙöÏ¢YY\6y… 3§vÙpØÀè¸y'ˆXdõ^cO©³¤³M‰»2©¥•ª\$Žç›Þ4‹)ÐWÈdóqLAZp¨¦ ¦´$S@ñ‹§Í§ŒÎ5Óæ¿š6^4œ~âY¸€Ã”ÅðÛ+ä{:³á§„ZÊ‹?)€W „`M¬Æè ³PQoŒDs…Qg6FE//þÕÕUh¼×]…¦•ƒ´¹ÎYL¿B S›œ¤£iC•õèJl*ÿ:: •zV)*c:õœVÆ4Ùõ—0m—t=(IÀÒ×Äyh«ëQ]¢)H;‘vŠ#EäJ¦Du¯†H9Wâê’¡$íH——ÑâZ_Í!Q/kÕµ3‚¥%4E¼[ éŽBh*> ‰Í!n Ä%„2 /&‰‘qKšŸ<ñ×{Ó¾)븓•6ÉGý ‰ÂG2ÕG7¥7—\ÓO$rq6]Ã,.޹vî3Ša‰¬Œðg’Ri®y¥º8í¿Ò~—DüJ®µfZ¶p.Kê4¦`à™ùÁc:Q®LiU¾Ú²âšÎiäÉ‹}}ù=ñöÏí{ëE´_¶nØôàÜ͆¼7ÁĽaªíáOAªq¡¤î‚[Öuꉹ+©­ñ® –ß9ë/¬$[¯¯ˆ/ã3Z #ôí¡ò.EÿÈbî¾`íŒcxfÔ Pß~ßÔŒ]€ö9TÛ ‹òÑ¥í,_}õ‚£h„ª7艽ÃkCŸi†£aìЫ›‡ØR®ûwÛãi¢ÑžãÍ>Ÿè@Ï^d&ð+ø¨¢Ï0|¼qÁ}†Š¾k^Mcïlò峯ØËgG Ü¿Û/oÿ5D6 endstream endobj 1743 0 obj 7421 endobj 1747 0 obj [26 /XYZ 38.2500000 276.500000 0] endobj 1748 0 obj [26 /XYZ 38.2500000 86 0] endobj 1749 0 obj [26 /XYZ 38.2500000 276.500000 0] endobj 1750 0 obj [26 /XYZ 38.2500000 86 0] endobj 1751 0 obj << /Type /Annot /Subtype /Link /Rect [319.500000 136.250000 375 143 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_introduction >> endobj 1746 0 obj << /Type /Page /Parent 2 0 R /Contents 1752 0 R /Resources 1754 0 R /Annots 1755 0 R /MediaBox [0 0 595 842] >> endobj 1754 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1700 1700 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 1755 0 obj [ 1751 0 R ] endobj 1752 0 obj << /Length 1753 0 R /Filter /FlateDecode >> stream xœí]Mä6’½×¯ÈóN‹ÔW  àvÛìaF7°‡Áö|`0LïöïOV¥²ºRÊ™| ’Jºaw»Ô’(2/>¿ÿÃçÿÝýå_»ïüüÏÝ/óï?~~jöcßœþÙ=ÿúîíüa?ÿy7úÝ/¿=}Ý}}úôôéøß¯O§>ÿø_Ç?ýÿÎïþóøïßvüŸãÿÒó_øíitãñ÷¿¿ü>îø§æõ÷çŸÿõé¿ÿc÷ç'ž_7æòÿ¿ó½ï†çQÜxó×§óWº—_ÿúåOߟ¾?è%}ÓM~纶۹©ó»ÿûÓÓŸ??¼Ù?v}3àŸ¹W~×MýqÆŸŽ«Ð4ÓêÝ/¿4žî”Ý»~jã¶¾Q…4ƚό¦øž„IÄËȨA¦e›ˆ¿QÉ:£ä£.au›~å¨Hc‘kʼGPÄL_¨j[€1ìZ(âƒ+Áê¤ÒFÌÿL’¦Ìä#•bÄÕ3Lc)Ó[¡z‚¤òšMãeªNݺAªgˆ9‚µ*¹®–¶4„6Ÿà m9oô­^…6õ•«Ð¶Uh3QÞ] ,XøÊ^,þFîåÖ2º¢2•PúœSD(°w0´ÅªQw«ÝÈÄý³Ñ!&P0”Ð÷δèvrfÐ*Å$øÒCnOd˜ØŽ-sµ©Ì“Çеð“ïmKËûPB‡2³$Ô!‹£YL¯n…¦#& ®{ˆQ‡R¦P,HŒŠÆÁâ´èô\𸜠£>̼ ú›RVDÃEîí¶33 ¦¦„>dÌ¥“~ÔsE¹tØê(«¬8ǰÄ3ÊŽ ‰”£†^ÎäKèÅ* ·d¥ÿž­]Q.@e‚dpËôLƒq EE`Ô¦ËÖÜCÿT×ô`ž†K˜,Bú|#nÕ=ã «Ã0c Á_BzyÃúxF©z1FW1eôÌ®×­r#²—Y×1u%ôþ?ŽJK¿ ʆŒ®÷¡›ðOâ}8ßLIESÕg„1W¦¦Ð%Ì5KL]‚ôêžõG‹¦×bf}zºßƒ,B[ÞL6˜YC Ü‚‘UCã¬OÎðjüpƧÀU¯Ì©á‚ZgH\Uÿ} ž’ZÍÕt(Y„êšò)ª©ÂC£–*Ýà|=ñ=ô*èÑ çž_›¿RÕ%Rgªét»°(:{¢UW7Ù@%£”w‘b%VÙH¼‰êt%°„öC”Z¯Ôü©¬¢%„ãþÀ˜<u´ÃÄg”9¦N· Јê¸ÖEg~6öÞ‰÷< «ô%HY{F½c9K$ÃÀ’Á\Êžž.7ž7Æ0#rüBP–aÌy§LЕ Ý4ÝMÌ•¾n ¦$Þ¬6¦<ëõÁÙ>ü4ÆÏb26 T þ8òFäFƒ³¾ï¨ë4Qªc @ÊJÕªh•Agü¥ªG2êÉì8I&û¢[X@¨4eÞ¢ôÞ%ÌOcö6Å¿£{–^Æã7"øäàa(¯©Ð8ÐǬhF:>w£d*ƒˆ£2é§Ò¯B5JšBƒJCÒfæoW"AíóF+qec™aw®æ±Ç1d¬D¬2Õ‘ý,+Þ"¦8É XÒëƒj²Iß“„¶%p^=„âQW­Z!´Bè{¾§%”} ¼Eº@)l@¼$ª™È4W.=PÑ1j‘^¦8ÉÊ03ÛYªs [eÍäªñ=¸f;o=çÆ˜y(0*’x<ç+ŒÄM« FKï;ÚÂV¯6QþIu¬A¹+ü©…Â(|ÂŦø:;‘e&pC•Ñ[)|fvð¹±x›évZI•®_R¤¼é2 Q¼RXŠ úÙGé|SgeAÖû < LRÀôt16ymè(µ¡ƒä[3j¢T} Ì/Ên9ÃçÀ$u{_ˆ­É°$2°Zø¢rH¾r„ZÊäžÁ~ îÜb¸Mtmÿäћӽvá3ßÁm°ýÕ+9x9LÃgzµRøŒÎ€+Aæ±J³¥xÊsFu‹± ÃZC>¼+õÊ#]à£fºì2]p®[æ|@‚ÕVÈÜ"‚6Q‡8 t\â£LÀ+ãS3°ˆÈ‰380D5ÓâH~O߃¯0_Êì ,º§˜YíSÊϪúÍò€š¶)/@pî(Ä…pò±R¢­Ee½@¯˜á>e²¤îÕÁ>[ë@¢2]V&Î61ËÄøñ%0=èªháØ fc0%V¼äLfÆO‘%½[3J¬dTX ÕéWÉoëVo2 nU8ÅÌÎÆ¢_=–DÆœTM:5†FVWKˆr ÐH gi«ŽÀ*á’³‘ÅÔÞä¶“7¼Ñr.ü¥E¶+ õäÉ¡€RøÕÎ ò£|¸jä'ŠŽ71 †¸Z„-£*ʸüæ aB¡Z‰™Þ$PnìQm `J‡;FñÓ°QBåÖd”jCQMž•ÙÛ;H·=X« Jác±d +‡ÚÔ¢¬ð…1¼5™>0«ò(Õ.¹ê{Ãd‡hÒm‘¡ªMÒ·Èq &”Ìœd@íF£#£°ù˜ÀîT“ u1^` „rèP“ÏhzØ| †Å…±¢u¹ åAÎ _5§'Úqz¯Ã[¤ºƒ)TÝ@¡ 3¬7Oš°°Î•À´9Šä<2V @ €¥ÿR«˜Ce¿ƒ~•ý¦\ö›®-ýFˆº'õã\Ñ fy £,`y3J•–R7]ŸW ¥žŠL –y¥&ÈsMln/À{„,OŒS¥LÔíXó åš„Îb}tãä„íÂ(¡  D‡‹¢"T'S¦-|£:1„êrè3½IªÓâ½ +‰ÌÁKL4ÜèLhÝâre¨,q†ò¼Ú&À?•À~cüÂñ#“Wþ"I±*Gê™0Ñó°5ƒ:ÂȈßes(+“M·ÄE÷éõ7f“zW cÙ1LÊTR»B…kñ¦e|@&i[Á•¢$gj²¬öœ¥‚lKà€ÈÆõÍRqe°>XA2þ‚.=‹‘¥JYø„M.<(ÊW°2ÄGL¯¼Õñ0ªÝQ[ä†Ð!-®(„¾¾‡¬=ÆøžÀ÷tP‡à÷à±é¾§Ã3ŠßƒG)ýU×G<Õ÷´veô}_ßžD|ÓðI°ð¥?q$ýú0å7…f<¡ Ð5=¶âL%¦òÊÅ!Aåñ3ÊèQÊŒ àD  ȺZŒª=f\8&›|o {»VøK±k…ë)쎂ëÇYˆ=ÝšÄkWtP±oÆœ¹µSqðÆÀjá´ ÔSAnô.y³IúŠiem«Ì7C+Íœ“¢{HÓ¡œñ1u9k>ÁåapA÷D%¢ÈS™’‰Ð.CMbU|ÓœT0Ù&`¯uͳ½v|ñyFéšý0ºÃدְ߷þàžºœ§Ãþ05Ãå•^9í$מ·”ý+÷̆òµ+'Yéö];ö×Öã°‘+ÉÁ!µîþÇÇÌëßîûnxžriôpªñ‹[¸ÂTãÏhágà§­>cõ<9]øçøÓµ Å"D,œ0‚öî…ÄŽHüx"ÛpgcÉd¦˜™HçÚ¬ éœj ¹X³ÅPÔñcPÝk/1ÞŽ[A¥\˜ÙÕ·¶IL§K‰S6`˜¥Âvà°ÌXJ^;¬[ ÍÈLO,ưTÄ2>?5£+DÕ­"0„sÓøŠ[Ó þRçô¢ãê¸x¥®•¹Ž²i¸tX©uv¼&Ãt¸_P™ s¸†PO¢&'nlÐg»¶]|7s@È­ÚŽè6äØŸɱ¢’ØF~‚A çeñ‡1€n…pÚva,js0ÞL@r–‰ú¥O4ã(\~a)¢Á„zKDÏf‡E5Ḗ3Þ0ÂÙš[ÄG0­¨FšI¥S¡Ê€¼W@nŽ„ Û _Œ¡éþš!&5cµ<ºEeVæ'µÈÉcƒféÕŒ±%>ÔNít µLøI0ÔˆåM†—JuûYßTF™›t"*çð•Zbݤ½Ø3ˆ]ü€¼!‘³™?˜u8ãæ®_çÏ3—“bN•Ü| [ß*\P•ÏtzÔ K0Òheå²Oªî/ÜU Q¥A¸Ã¨Î¬¡½ÛÜ%ÊÔ+oòÕ´¨ZiÉ:¾”Íw=W!l—â2)¢B$ƒ`º® ž¿k ÕÖš‹5ÞƒL¿‡qréj|“›¥Ê%ŠxvtMÌü÷QÌÓaZ@®®G„D·^J„×^‡êNU®úSø3I¬±¶×##Xc3á¢c\×b›[°¦£Ç¸ÍùyÜŸœ£ákdLÜ,àY$ï‡ËôËý¸.]íe¦Öeù¼Ù˜~Þê'¾s»ä«Ë±x~kÊ0Ì”ÅïIÎÛ³-µ÷·À=ã6Æ ’ž’ÐZ·÷xs‰Á¸v •A È!¹ J?ï§I`d‚4…­…‚ÆO±ª fÈ¥,úñÜó7_èùž  }½hT‘îpùmÄ%½_¼3çXïRMõC¸ÊaRL‘/*Q%­—n×pÎe›ºÌ!%ïgíŒ?ôãíɸßÞ¥R›÷ç/BÊï/Õ«G<ìÜtm®çHàðêV×5û“½ÚÁýÞ/mï9Ü¡uÏ„î™×ôÚÓšWÅ0µ—ö¦GWfJë+WfÛ{Ø·Î/4Û|’ѵ{>À÷œøoHºá,=K`º2oó¨£ïË©¹ƒP:nå¨.§Õ9âà§Ï“ÒÀÁ~¸³ˆ¬‹€Uš¨˜Q ´Åe9Mï‹—åZ…š±4ý‹Ý…÷|SÓ ›¯Å#À÷œÝ½v9|…Jò&L˜M·Þ:•=¥×%&õ‰J冰)¨Z¬×øK– F…·4¼f3˜ø*U,³IÔeUÒ'€2“3êR.Ví 3ë_Ö` ס×ècª +ܨ!awX@!c«ª&ïöù¸L:é=”z*T¥¬•›qtÛ²K&íÜ*dD&#=é|w)P8ÁÓ_šc‰Q|w:O”wM'C'ý@ç—ò ‘”Ĉ§R.©Ë6FÙövAUhUrÂ;@Ψq.Búàƒ)—UªXã|&ŠŠ'¿Šq¦ÛŽËdsÊ ’y¸„¦~’b V­Ê6ó¼B#ºÄ÷s¨SE¹¿AUÿn:æ¸H¼‚Åpy/&hÆJfÔ(Ã0™…tG|àºÈûÃ÷‡ˆÒîü©]x?q âôl~V½þá8ÓÐÎʹ]¢Î€CœãVæbù i£]ýUÆ b´4¶`°¹€w£ÈyDŒ_ øzü^Ê©V¼ÍKiî;5|[oáÈyÆõ[}ÑÊ/ÁÚ΀Ñ%+Ö%¿üH|`Eh;ÓyÖZ4ÓYÖqmÖK ¾9§ Žšf¦Xõh*i˜>:ý¸õ±«‹ÌZbûP gLìi•…1;DÑ7­?«{Ø ;aã#¯õÏÂìªÇ}º·ºqƒŽdÄ£öøpÄü¿ÔD(zwS(Z½/og|¼r°ÇÛÁl¾'úÂñšb9`¤·#dTk>¶N”¾tÖÌ×®à: 8êN­Úâ¶ð¦Û{AÍ6¿9×,hI¯Í¼‚åÍ7ášWÃZ£ Þ¸LJÀá{à8¬¯á{Z¼áúà{z|ô0þR|…ØÁŒ¶Ä:DÐø¸r‚ì`}¥Ê¢ºoÞÎßZã £ÄogâJ«Vyx{ªºÁxªZ±\·­¦íÂ|Ç_Н.ððÚ€M‚[WbÇǼ÷¯S“q|Là¡2" ¦Ø¦ð—¦ >„t'`.âÌhaôº1ï€rÄ­qŸæÖOŠf­Ç…jË?SÑwÝåtÄOËu/i¹7¯Ì°XW‡2ɨ}Ú UâØºU:—·òL)múÓVò?ƒóE¾UvîBÙ~r—–t÷kÉq‰SÑ TÇsP´ê¤¨@ÇÍ$ù+èžÄÉ­ÅéY*ž…ÂíŸ_ºûíiòýÛüýé³Ëqðüy×Lˆ÷;ÚÌ8FíøÎuŽñ8ÈH§Rñ¹.CÔ-ìÒõ‡ ƒhþ‰ºK鸙– ËIðᦰx¢A í/ÿBüüf ©C ˆ²‡;Ž+0Žà~ ®Š""8ï9‡Œ¢y¶Š©(`æä Æ5Å!ÅøNý åÀÛ=§ZÙl&c¼Ó€°)V*Œu£Š¼BÍÓLBˆ í² ÐtºÝ2F::‡6•¦šÏ®ós‡’¼ ©&Eô1<‡~á2gÍKë …ÕLWÿ([%;' [e¾ˆž©Ðíu&˜¬bð•ËPü8àxÛe¢È‰¦(i»¨L ‹dŽÊeÒªyéô È´È­c[Œ‹dÅh‚'…éô¶RhVD¨E:ø!DUÛK§—–ˆm2¦2+%Ó—§‰šb†îŒáÅÌ…,"êñÔK3†¨yÅKE™>÷§Aü˜Åt ·ÎÃíà¶/¦øBh¸4‚Éz6k`¨ªK™°ìáq¸#tÏT4 $r®¿DK«˜+§r@¢ª%­Ë8Àz½¡cã Õÿ Ûå[ûÑݘFÁ¸r%úysoêo ¥“ßRWD5XSuަ1ŠFPaÐ/i„Åxm¿Ø5WCqaCšKF¯•ÖWÒ³ëòÛåèø2ûµæGîiÛeš¼2##Arì i–ÃÁtVY•vÖâ¥f¼‡0M…n›©o/7^í¶ Õ]®éÜBy]ðšAÂt9KÂö!PY€MÕêð”€êÜäB™ñµéã¬fý5ÌŒ.Ú¤>‰-Üop†žßè¡ÊÖ½ëøs \îÇËVXÖ€'—âÍZG.Ð1:Mv1ÖzäÖ…¤DÃì©Åüj@•µŸòC“‡qkg\~]×7ï‡]€H ½;Ü K]¸bBq—•]—¾I'˜ì+£MïÏ˦ üØÖÅÄÞ‘{ÌM À†×´ä49òdæ¯eTï“ââ–9vnë¢L.õ¡…äv²ìqÞ/œÏd=Õ)]fñ’U;#rÄ‘tV­ÙmÛ#±    œ±ï×+ÿ-äÄÕb¹ÂòI¦xRÞÏÃÎM×ãn/B5ž…jî/49^h‡U%\è¶E WOX |Ï*¼ÇáùÆ‚c‹¾k]Çæ°?%..Øýµãouà-ý·ûôôodÐÌ+ endstream endobj 1753 0 obj 7317 endobj 1757 0 obj [27 /XYZ 38.2500000 577.250000 0] endobj 1758 0 obj [27 /XYZ 38.2500000 540.500000 0] endobj 1759 0 obj [27 /XYZ 38.2500000 577.250000 0] endobj 1760 0 obj [27 /XYZ 38.2500000 469.250000 0] endobj 1761 0 obj [27 /XYZ 38.2500000 540.500000 0] endobj 1762 0 obj [27 /XYZ 38.2500000 469.250000 0] endobj 1763 0 obj [27 /XYZ 38.2500000 335.750000 0] endobj 1764 0 obj [27 /XYZ 38.2500000 335.750000 0] endobj 1765 0 obj << /Type /Annot /Subtype /Link /Rect [297 476 332.250000 482.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor >> endobj 1766 0 obj << /Type /Annot /Subtype /Link /Rect [340.500000 99.5000000 381 106.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nested_classes >> endobj 1756 0 obj << /Type /Page /Parent 2 0 R /Contents 1767 0 R /Resources 1769 0 R /Annots 1770 0 R /MediaBox [0 0 595 842] >> endobj 1769 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 1770 0 obj [ 1765 0 R 1766 0 R ] endobj 1767 0 obj << /Length 1768 0 R /Filter /FlateDecode >> stream xœí]K¯ã8vÞûWx=À¸Å‡^@ ž²P¨²dôd2tR™Eþ~dKòµ$”øù¢tÕ…®[ײ(Š<<ïó_þåûžÿûç_>}ÿŸó¯ÝÏOßO٥̳ö¿óõÏ?ÐÕ¥û÷¹¬ò󯿟~žž¾¾5ÿ<µ7|ÿôoÍ¿þï¬ÏÿÚüÿ·óŸþ£ùðÏÝ—®_øýTª²ùùÛíg]ªæ_Ùýçõó¿žþýç¿_Gì×Mføûu¡›šYÌ<ùç©Kuûó_ÿ~ú¥}¯‡äÚ{V·¿j«Ïÿû_§¿4Ã÷ƒg—ªÐ¥Í³º‚ÿæ]êæÙÍýg¥ëfåäÉ·?c+ù¡‹<ØÐ×Y /‡2…r vK•ÛãûØòQE°¡¯³³Çpè°{\©î¬•…øjÝǖ߈ª¶Á†¾ÎZx9º=†C_j«TYØ2{A$\go¬.»…ɧ"áÅ¥y\|輬B }›µôz´;ê[dK•µÍCÊœ•ªŠ³nä€ä; G]ùvì«jìۼŗÄèÚ9¶Ü¶Ú¬.ºÅ1F|yF—[ë*ØØ·y‹/Ém[c‹1`kT§aÖ¢„9[œIZ«L¨¡o³^Ž–ýN†þæ1žFû 0à~:nüøãôË×FÄçiæu{^ûãÇï'ÛüÒØl¶>ÿøóùŸ²LÙ>ÿøÛ©ºTuV4*þík·+™FWtu»b/Ö´vðýŠ‚÷¨ ^iG3—ÜU9˜Eϱ]É>ùÏ-+á8Z–ÃYÃÑ”ñ_¼Ýܾühè- ­¨¼ Þx¼ŽíÅ—]·W”ê‡[²!p uMl<3ñ¦2‡Lµ«c.¦Ñòuî12Röj<>¥$]•#¶óñöÔúr›Ìà½kxå+º¢ xO9óœ€ÇÇØ|øÒ7iOõef_nWòž,^dŠã)9ØBÁS"ˆØ!ÅD9¸c‰ñ›2 3À¸,8,[ȵZ‡-¨Op4ÌJð=_àãϘtpÆTèr1c"pÒ)šÉ¤óœtž]±3W’[YÚ¥äf-” „‚õmßÃjžc òÂq «Ò”"+«Ï1YVå¥~;ž³¢­V×ztÈBØ)ayºÊÔˆ©kÈ81«Ë!«Ëƒ³:•Mf†^| SæA²\C›]nÃìÁË:v®˜ÉköˆÍ¡„û<Ã=ž-W¯ ”E>òÑmÙáuZÑúN|Æ ß þÀ<¯ó(wŽ÷éæ\'|O¯Ö›î¦W"H[5|çõ£¹ðÆœdÝÝ_^>YJª0ºµ¨ÉGTÄ2¶§õ™ÌŒ¶–?†>ØF&³MýÑ%2Ì™øØøˆSÆ…x4Æ­+ÂV—«‡“¯ÎÆ3’|ž¥'ÌÆëƒ9-ž,õø=¤üü˜ô‰e lº0ÚQ‹W)šN>áL˜‘CÆÁâeÏ㺒 RŽWÇ ˆ7u’ ¯gH&iNŽ)c?b’ñɘ ˪ꎄ!Ì»Å?BMóþC ‹ÃØfRždÍjj ˜è\P›MÚ›FÈvÙL üf+§¢œaN¢Žå.æûC—:Ø®ì{eŒMÇÀ5U=OÄ«[ñAh6¨ +F‹›žŸ/A%o=ãvoÑ–ÎPÈ.E©†ÉÁísT~Éj3<—ØëÕò"¥/é3Ô:ŠdL&¡“0Êg€#E›˜µ#æÅd÷ætî0øæ4†ÖãàöS©Sjò¢‰3óœ ~3l2R\‰I~£¤—¬«”§+!1&\tIn³(Œ1ù-4ù…Ó ñŒµ2&£Æ!% Id¿D0 Ë[qLnuO?8&ôu Ù/gƒðŸAE¡à r ß´#ŠgW¼3ïÜê}ðsðºA:ÀñŽœüÏþký~j £Á+{Û¹5ë [×V^—½¢+94•„¿”0½´’LÎI¨P¿×÷EÈ$&Dr+ »ã˜¼H¢ã鎕èåQM-u‚§fJ [ÿ–ïš>S …¤Lå=ãÂel¼hàS†LÖœÁ4À²x2GB8 »t–;„9ºGŠºhìÒáÅÊ$oÊ…$‹» ë(Š+c$.>rLÜ‹qÁNˆÖCOŪ³l¤Ÿ½a“Ъ¡äÛ["Uó°¾jXÿà‹ÕýXƒÇ‘Åœ[kD rÿyÞÌ®3Ï!QžM$ËŽb?˜5Â+AÜ¿W\/òV‡G øds'K+b÷n-ÉÍä£m`Œ2ÑÓðîªÙ7æLu Éâí#ƒÈ±øøÜcé×Å ç—Õq*ŸS~zuëFpX1ÅÄä¸gN»XBÅŽüKÂc‹nJ™·¤ ‰`¨ÌPGÎ:ÒVb•/1þ\•âSGTYϵ,keT * K¼Ãqüö^ ;Ž©ÚÈ•ElSEIÙpð÷¼õ ×ÕÈòÝ’‡xŠdž9Þ‡3S‹'V}ÏÞZ00%ìHåw2•XNøŒ{ÓäýN+”5"Ñ.¦b«I«¥‚¬ž<øBL+ ÉëΗüFó“ÖL~³Ú‘¤–#Ç”´.3tuxþUÞM‚H¥EÕŠP_Dâ3)§ì-íÁ'»º!ÈèŽL0–a÷ŽÑ–×ý:¼3h€hÊÑØ›åá&HRÌៃ'àBˆïÈu5”wÂÀ«Gä;b  µí¬~oÎX*—†ñßx”j¼Ow›ç(w{co1œómO¿q<ÉÖcð’&§I$Ât2|²šT°¼ØÕP碬øÜ)ãi„ êggf©ŠÔ﨨’ëw´"׌¦¿'Ïó%l©“l6°^ §8Ú4I´i²zHí P“ÆMš!𔚃ÔÁ`H!¥€‹Æà^búÀÌó󷤀™WZÓ§3ïÀÌÛ+ö£Qb~<7ámuLCa¾Õ×­“h»Á<зºsë£7–u5”¬~Fýúî¤}xûÓ4 ÂÕ]'¯†t³ié>×òá€ÅMûKº³ôU¨mœM¹t³}êè<¼¢%Ñ©º‹fœ#L‰ˆeSy¸p‚©Zõù­Ÿû(ì@Þgäh]ßN•ëáÉÞ¦?¬¼­ZyQˆ¼TÛÑRÞ);ÌÞ¹ý n×ú^mœ¾AöðT£‰åõÅÜÄ1žöc^‹âÆÂ†Zå#ªÞdØ0pRœHe&U#µE«zÍÎŽ“PiOÆTjŒ&ƒ1–bØÁ£ÉKæ|®^ÈX¡¡›Ã{°&¢èÙC{’Û´>š€añÈw£®N¬Üô UU ™týÀÔQŦŠ+ `½JÔ`ÝIÜѧ¶9Áê“”ë|'²Š@"Y¿õ^éœjÞÖôM2©£ ¶éià9Gx¯¥] ˜½ã¨WêÄxe!%)¼XJ “º°3ô\JsàCIa]©V©¡øXÕ•jF“‰à0m“ôÄçöRñlQxîá§K.NWdÏißÏSÆhéÅÙ( „EIM¸ø³˜s`Luð‡­ó‡ª4±ecU–£GЍø„êP’D,#¬.鉴RrÌ„qe0…(±ú¤gž©ótàÔy’}‚Ï­h¢¯ÍÓÁ•HKË”}ÎE^èÀz Åü6%QßOÅÎ6“ŠRn8FåØ3ª°lLÊ#‰úãmÁ}‰€àlx4¤p)ª¡t‰Üÿ+¬3&ïü|ã· îŒIÓ­‘õp9äÚæTgU?­ˆ¸zËMCâýb¶¤¢²K .69ùEqǺJm¿{¾Â{jxOÕkKmîô„8®‡bœ‹ÒrUô¾ä œ[g4ÑøJDµwø’Œu*~$zŒ&‹‚E¼l$&V΃ðhL·$¸L²×ôDoÉû#›±±¦nœßBy‚j}åQÁD¤Vú„1W±£7Ž—Hx¥ÌÜH%urÐNe¿Ã=Ò1Þ³OrNã5X^5ëPË"%?h7£ª ÖM)+úÍ0fN >™H…3Ÿ •R¥ “yª8LÖ˜ñÐf¶TÚ6›—ÞMUØùub\N¢vÁ5À¡²Úÿ ž h¿i'Êö°*÷—Ù"HC8BFÙ «ó1a§,3ÚrƒO¥G«eW/ÁÛ)t§£v5xŽ Aö]ײ­1•Á”sÌmùAŽQŸ …L=–2[ˆìÄ äĪlaÒcÞ#¶©öÃw%p¢îÊʹåy@²ÞÆX§ŠÊÊdìûº²%É|è!1«|(§± ¬1n6†œbUI0®¹IóQ¼L‘l›ž„‹0/~`5.pþ a *„p3®ÔÀé>¢°Ä‘óÂ;è 5ÿf¢Á.&ÏyJŒöä ´¢W—_YÛCfvD»¸›9,?Âè-Ž~S°.šÂ¥Q<ÙŸ¥RÃ… mØ1 ]z阱0°vÈÂd ˆ8šW®N\Õ©Ë‘¬ÀUé³;¿žqpÝ• yÆ,fžaóÒ£©fD7*{š©}O»›Š½,gYT£[Ù€TXßEw„ä¢ë=?+Ç&ÂQÑD9o/Cð!@²‚fà›bd10N”å@DøÈÊòXÆ%˜¢7T$§`-H,ÊJ8ÃHf!—s Êdð6™çT¡yS燫ÔìùÙV%^‘OBã3îpÂñ)!}BóìNpŒãðóGª(ÙT Ý õþ)Õ«ytÈôàUL m | HTCS¸§DJŽÎ3¸“x0f…Tb¬¦cŒµ†÷öÃx¹˜ XˆH>‡ò„¶ÄûhÅl𢮆BS¸ÃÒ¦L2B&3‘ŒýÐÐ+²ðM±¸×>ÜyŒCöPi„! k"Œ®Ëg#Z°!’n1UÁd-Þ½Òg«ªb©Ìå›s(AD(ß±WÄܨ(Ñ>4FDàåò±´BPdp_£Î9ùÚé°ÎÏûæ`žÍ€É>«}SJ_žF%tmSa/ µökz|k=<öŒ‚î/ŒÒ¶UÓ¶ÍMо=g"¯1»Éá‹!•Ì-s‡cÇÎtÆc8^}+bÊ̱ $ÚñÎq¤=RAb)—²T"EA£%Äò­žhpÔÚrþŽ Ëšàä`-/R‚ *Ì™÷ˆ¿DÀ§¨G²K‹Ã±”Ë‹Ÿ¨°]Ê’ SÌbë…Mç/Útþ7¢00ÉÝàVL¸áqÅ1ƒàê]Qç£3Bh!Ô‘Ÿ« ]?Õƒ±qS®ŽḬ̈…CY3G»Î͈lÉ-S]HXL „?eÍ1Šª(žÕz…ã²…? øÑúE›‚¤K¯¤x£‘¢<áðÉÀ·2:‹h[šøNÊ”£" ™dû1þxY·@´|X.:Ñbæ SûsB:>ˆ)[·êÎüþ’¦ÓC‘1a<”g&nÌ{ Cº£Š‘\ÝfН}ðÛ=®„¬DûÉ¢%TË—°TÅp uKHÏ"MïŒ¹ß ·]u5]õëâ]×®¸\7ôüû©RêñƒßNߤæL\§0ØÐŽºò~?QþÄÝJ(k ƒ©ÿŠ®ïg$RÿÇs`/•>R<í¥Ò­­*/µ]1p´n¶WM–ÌàC¯ºŽ NÁç0}^:ò}Öe¥]ƒâbn”²hïÏ\Ÿ—à¦}ó_ÿÄ’°‰=#¹£õ-.:} {¥’–Á9bøX\¸R)ÏÎ %ÉÔñZ0=G˜ˆsÛ'Eb eN¶ÇøE}T”1Á$²F}Š„’…² šFcG"+–MÐ$S¿ ?’çL¦ñOzÜŒ ºZ1#À• ÔV¹½Ñ¶ lYI™s²hApl”JCDIÕË'Ët“uQu:X1g4%b; ‰M¬|ŒsØ#±f›vŠÎS‚A—Cާ-î¹ß#²q«{p¨2T& $’8´8¤ÌS˜›0tÆHØíêCÊ^3ZÁ-9)?eÔ±R™4›šð@FAaÒle#Ô{eó{ñ 2} "ÄgxmUÍs ‰¼ømÊçC™×›H¶F¿ÁiõDÆ +„Âèx¯qêUb%šd-ØsHzFˆú$Bã÷†8zAÃ3j(»¨.ÁóÉUDŽ¡0<âúš¢SZVÿMŠj}L4 7é¾zšršš²O·‚9>ÒET—Céyy†AQ•ÿB'Ö'€«îY"¿0eDŽY+'¸ÏËf¥ÿb;œ…Øø è:À4ã:3©ÉۀȊ¶yWå uÈ£ù=ëuŒ;[t¥S…º S=•?Á+ Ͼ)¾‚»T3W3Èàû`ø¬Ïþ+ºÍÝv¬^¢#8³nødu§1 ¨«áC…X&K…ÉEÃ+†˜^^¼Á˜à;ÈÃ÷Á30°Q½ƒüñ=¢ìÉÁàaRpnø0éÄ ˆus\!Vï)f5)ŸÇ)aVÓA;ªÂ»€ï!èm–yãÑb°õ\õV…‚/G,!“!ÿ( oŠž“Cþ†Õ/… ϬºâP˜æ®DYø7((|œ†O¨*Æk·îƒB¥~d NF=œèˆ:céo»ôÝ€JÅò†Î&·P £D)µ,ôã g’MÖ+æ^= ‰ã·TiÌŠ;Û–?ðí³§ö‘º-ŒÚÈÌ/$ægĮNJÆÅ6*ò¾kg4`£Þa…Ô‘ÙbGyÏz ¬PÝã÷ƒAŠà¬{8µ†•ŽX6†"ê·*z’Xpò¯“”}„ï“Á+‘`’Šªî¥í}w'´B”+ wczÌ&¬,H¦î¬ E‹_BƒpÁ„ƒ·ßÓ;BÌx³ñaÓwW¨¾~¿cŸ˜,~¿XE*¢¦¿G¡à ©ÚEcnë¡l¤\Ka“}¨T5¦ºx›œu5 (Zß‹0b5Y_º0éü{•…æÑ ‰ ?­B}ŠDê@ÈÞ*™ÎGN••ZîH0ô’‡D7{5Õo‚‡Åºz'ëiÔ†!ïÃl“`cB^o¹Ì·?¬Ì*´cÛä„T‡Õ1¿ ÝÏŽ9ý!,‰€ä¥35¤/‡ GTU9 Çq˜zH‰úXì€ œ~AÅÁ—K>Ü„”[;ÖO.ž)“޳Ýɹ}?<Ó̬,óꌇÄ`%$¶Ñ#hÂýqÈ› z ¡a1úÆciÞ’.TO\Õ¹Y2Söý­ºß›‡UYy.ŠÛO¥nŸ6:g‘ß¾xýnûÁ¯§Â^”ªuU©þ;f0„y|@óõö÷âvÓyx³ÉGh>hîLâúj0D5|À_OÿªóV«tÛ;8Cª){öp 0 ªqë …ZÔ¶wü½QÊ-ÄöFó\õæ ÙH‘Ýãl0^>Ðû&¶¥à\2‡Òƒ <Ú~R&WØ~X‡€sXëoʨ‹²Û¿~.fX¨•Ðe©€û w^€7! ]ï6GÇ" æ²7¨¹².†›,„x¡ \vêÀgÀuùÄs¼ G%=xAaG@øGÍ3Æ&€èx4<¼?‡Ø Áƒ(ßÇ ÁUäÌ ÓSμFÖ`cHÇ=¢€I†yS¼¢˜F™YcþÆ@w­ ÌÔÉ©JåóôÂðNY¾Áà­ÏI™ÆÀÚe!Œðû±²´üÖJe RCŒœaðÇ(É@h"”ܕϾa‰ð¬á § ëv© EÅ9¥îÏ=žCx·ˆ³Ii<.‘—¾`0½ïÃ\Á¼ssìÉ+{j1ÂkMÀƒ2ö¶q)Þ‰y4Íñ¦s]Q¸C=Fó8äó!Ÿß‰|fžCù’dé€ðÉÚCêlºP­ï¨˜’ Á!)ˆm:¬%aï4C±˜ú Ï€à5¾©C·ƒ3°Œv ñ3˜Ó;Æpniv¶yÒ‹úepˆ¢8"Þ—<ŠO˜&Ü´fÂÌLƒhEÖ´pÿdÛ ƒU)9T^SbïHÀìíò“æHX«‹¨ã<áec`acˆ6«ŒÓ2'dFÞ­2ýQT­– " )Ó—<%ðHû–íL+ò: ¢­DéÿÞŠÉÖoc¸; RÞ"RíÈÜHŽ£{nDYÙÁ¸< KQ«`ªŒ颶覔‰´ãå¤Ú` Rd¡¡eÌ$lh‡ [* a`ZÅ<ÓOçÖµrG†È—Ĺ ïÓM.e€‘3áþŒˆ]]½ •b¹/&ÒvÞQ‰þ›,ï`ºbÈø€˜WÇRŒék–µâW§Àš\ c¯ Ç=“^Ð{üØÒáL›åê“¡ù]O1šOí2áöÁ“¡ýŽ aÐb24¿gSL›Ùzô€æƒ!&Cûj0D5|@hL†æY}Ac ¥aºÅ”†¯Äjò´z}¶l›ôX˜ÊSM—ahXÑp•Æj3ãáutÄð"쮈…dè¸ûŸp#aG9ž31܆•îhŸ×˜€uŒ?ˆßP EU¬ãO…º‡0d1Óßœj±(=Ã਄3Û@TYïá ’åSȳ dâ:Ëi•Â.9Ñ¢HåÂ^p&ηºvÍ,%ù…HpРÐZBуèJŸÙG›Ð”û‘ ·f´6ˆcï'Û4¯%jXç×ÇXÙ£ËDÓí°¶«ŠhxÈÑ$Ü9~«­GD#›¢±¾¶µ^§5Fíáíô0o ÈÛX‚awò:–kìÂ>‹Ï¿c£÷QÎ4¼„”fÜ*±l§­5Ø)»dÈ7I{Ä«ð©p 5®Þn90¾§Ãe±rø˜(¼Œ'¬vH\)V"+bE­ÇÔ5-1‚—)s d1“„µB¿WUdãjVR`| Dv¹ã¤2Ï9zpr'<ˆUwxY0$Y¨°jÂ@2 1øM1<Ë@±`"ÇŠÎÁwyç0:²ðwŽÝ† &Ž=%Þ‡9e@²eÁ(xfz k8žÁÜsâpb[Í龜AÔ •3°á»ƒ˜¢ŽFKî:ä!^7‚eëö&?èPÇn´ƒO½&à ×—‡Â†‘¤^PƒV}žU4 |ÑóœaªXÒPvE™F]@#%UÅüÞãݧ¸BÉ@†ÿ€¥LC#JÚó+…^tÖ·1B’:·ƒ IçO*$u^ ¯Œ*$oß1ƒ!Ì㺠I›'’:×ãèq…äí;Õ`ˆjø€à’º¸ï:F1LR€ÊÜÇÅc4ª yyL•q$omË'艋÷™ä²µ K7Ñm•“óÀÓŽ ˆ„Eçã¿“õD£b•ÒMq ˜ røZÊÒ…†òu[ݹ#UêžašLu§õ8Â"YµDYZ¹ ÁrãO¯š¨ïjÙ±Wªì­¹ïñ7’â»—kw¾¬}u]çë2ß!hj›=~ðÛéû"ÓM’å_§0´cDέ~ÿ&S£Åë¢ùƒ²ˆ²«C+E¢ð%b݉ª{ÏŒl£hâM3WlLÔ²¥ÒQwRKÌL–À^x2y‰ §Ž?Ö0V/c’­‘bÁ†Q›°>÷—„©õÞ‘éåe;¤§A#!) 2Y…)-&_Q.,™(˜Y¾&+TÂ"Ì©ÔL*õ“{ì©ÃíO–·Zó–Ù‡âø>“m&šÕéˆÁÃöƒ çâ8·‰·%o©*±’˜Du¢ï©lj “Œt$‚:“r˜¤´Ó/š?çŸÍ©qªos_X åTÏNœixy¦®’ç¬m?;ÅK»Úå^Þ2O}Ñ7ßþtŠé•.D_:É÷@q j•ŸÑsÌœµþln_»7EÂëvÌg±Ÿ­˜¾`GÐØß‚½*O^CáÑà=Ê¥¼^ýlY‚»þ»™q¿Ñpæx£ÖqàFw¹{O6ïžc'ð¼ªð…×nˆ#úÒ¾–YuQ-‘?n°úm‹'ç,{ûvþvú CH¦ endstream endobj 1768 0 obj 7710 endobj 1772 0 obj [28 /XYZ 32.2500000 715.250000 0] endobj 1773 0 obj [28 /XYZ 31.5000000 716 0] endobj 1774 0 obj [28 /XYZ 38.2500000 353 0] endobj 1775 0 obj [28 /XYZ 38.2500000 353 0] endobj 1771 0 obj << /Type /Page /Parent 2 0 R /Contents 1776 0 R /Resources 1778 0 R /Annots 1779 0 R /MediaBox [0 0 595 842] >> endobj 1778 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 1779 0 obj [ ] endobj 1776 0 obj << /Length 1777 0 R /Filter /FlateDecode >> stream xœí]IäH¾×¯È3Òd;oBê‰RkZâ€8 „ÑpàïãLÛU•v~aÇ—ï…—r·˜.Úíp,/Þò½íÝoüóé¯ÿ=½ûøã¿O?u~üñ);—yÖþ:]~ÿðú/luî~>•U~úéŸOßOߟ¾>}mþûý©}áÇ¿o~úßÉž~×üïï§?þ©ùËŸ»tùÿ|*MÙüùëŸuišŸ²ç?/ÿ·§?üêô¯ËˆýçºÉÜþÿliªê2‹‰/êWi®¿ÿûÓ¿žÞµëúHî]YœŒwþdjoOÿùËÓ/ÍðýàÙ¹öÆ”…/³>SÚËwL~2¶n¶¥}åú[bl#>´7Nkè묅·Ã¸Â„†>WE÷ þÌ}¸j¾š× yS4é¨(êö@l&OHσ˟vU–ZC_g-½%á±ÏUCf®´¹¿ïåhóª²ÍÏ¥ë~=²¦Ú÷Çl+ñ {\ü,rsa§:Ç|µô~tÇŒÇV=æüòE­c~\þ˜}®%qÚYës`l1¥â‘>.¿ïu¦v¤×Y+)[ìH‹Ëå¿nMÃÜ„÷æelñm/œÕbóí¬…·£=ÐÑÐ_#†ÀÓhÿØß/~øöôîK£Õ5»Xœ¾ýÒLíúÉöoÍvä§…³Ùåo?Ÿ~eæýoNßþþTŸ›…ôìžðIŸ”èIVÃw>\Ÿ|þÖlÝcË®Áš}vY³÷y÷E×ÎÅdç¢9‰Æ¸®ÌMêòàÕüýõ‰?7X~»2{}R«:».îåÉçë“üìlenŸ”èƒGÃ3ÈѬ»½­fL/Ý™Á ÞÁ™|DOFƒdœI·Ÿ¹Áð}„{‡÷î0žl5\1>@øaãáðÄIH•!o|p4[ǯ'ðHC¶‚3€O3Àן¼”Ñàz"(?p±bÂl$æ{xn-0®i)2Ó”C¥»D È "|ˆ:¢8YêÁÒŒ`læS"í¢z^YKãÆöK›s¨‰˜ß X6æ ø ñwF2sP¼ù£A0Õ¶OŒéIpÆ.5¼9)¦úlòsV»[ÒGû ‘Ñ7ðÎF^:>üaF¡r„¶Ž¥ÖH¿ÆÌKTø®Ár±‹Yn€ãCþ„®k7²>»!­â'Ì!ö ÿˆŠ™AÔµ‹<+nQ€¡²Ø9Føb¥Ž1Ïàu—5š)‚i'‚;Ò™ÚfÄhÔ¬ço—ÃF9^0 ¸ýhø3$Н)ž,A‘ëCèUѰQóE@¡c> *3 e„ÍŸˆÕ? )Êĺª2qxÇú`„ Ï1sc°ÌTâm>ïe€×å%1ð̇Ý1‹°)"†hmºL„0‹Ø-Y6*«íDÀŒúCÜž#O…NOTúÀ\]÷sÁÖ'ÆP4,VMgn×  B¨0ïŒØŬæß-ï_›‰ï­+VðÆ=º<ò§ìA 0æ;ŒXKåüܽS'·ÀW.BèäÆõ²3v¨nJGç¿£ m–~ Ö«¨Ê.ûÊq #l4™´,w^ÊÆe@)f4Æa±Æ'kãîT³ô9$Q¨ñp…É!Lˆ̈¡;¼ç˜d׊9¤Dp´»FQî™,/‚ï%æ².ïù‚Ãx5fy#¼_Dwõx.Áûá”ððLð ჸ—”’AÀå2@:ç@ö6­Žz妚ܞ½EÄÄÈ2£¼ˆ¢ÒÂa-H¶lâdT“â½±Þ.ÎZàâM8Åj„ÉŠ™VŠ%20”}í²ÑÎ1gŒ·:"¥E49DÆ fem1F¹]A›¨§ý!D+Â8“q[V€¥3·P[Ȭŧ¢0rH¼_aðר„= g%è»·…aÃå3…„1ðcòsæ %H'B%K”.(ªŒ)«¹²Š9JO“ä[Ž·o*uýœ>ÀçÊGÈx“ßF)oSi>©„ûâñnÛ‚Ð’¤å*2-W¸×J•ï‹5'¦ž!@m9Ÿ4Dó}#hRö2<$ @‚¦Ì Š#3f@…Χ†OFÆî‡‰³¹÷äñÎg8¥/:.> llàR,Š|¢0C>Á؇©’^ˆ0*m~x‘Ç@9œ} ± ›Äã<šPfžßR‘L:îÈ8#LK&ÑŒJÕnòŠ3ŸÑhîŽ5’{À ¿9TYýGôĵûvÇ<f(p=ª“õ÷á“ëí¨ú2T]Èè…{xwÃç"¿nàh–÷Þ©Ñ;…[{.üõ@^Fkw°†ºÄïØî‰ï?4ãIGÇ÷Ö“ÁÑà“ÀJ;Z)f|¹ã"ÖŒxw`íKü¹tüÞ”cÙ‡Wø¾ƒgð=ÁëÁçÏÐL''Ës] ŸàóùOR†©µE\‹nHqËÔR „¥t#ð”ˆ$äTuˆâH‡7MË›†µ±‡@{Ùw̶‰zÐe3A÷Ÿ¹|WSüÔn æs•˜€=åuÙx¬ˆü‘…DX=ìx—bا¨ÏŽJüïü¤*<%:§Cxì>1EȨʙœ#\ŸH"—B¥dó!4´lÕt¾ÌßJMáÔ<&$™ðê3˜Ÿï;ƒ”#E6:m~"µtQcŠÕš"Ãeë¯8¬ “¤ª cð™©9)½+Leóõ4ñˆæñøÏR+›lUf¶×1¾t,º@ÇBóÞ“è neá;œA •ÇÂw:ŠÛG¯'Éûlú€qw.Øë /Ž9`¼'ÖSlz{óúz³ñ’}$¶ßܲ ÞS|ƒžµèÝÎ0YÄçà Þæî`zsø‰˜Ëjúʔզ¯ Å-ñ¬"‡£á•Z8kF´á+øVðJEw407C¨˜ªð Cqð;Ôz޽íõ*Ø`ýžv°Áš—Ç9~’ð€«ËÃ)MU,Úkz:®ø 4ý…W& ‡àSHdtxö'¾ãá]ÀïXÃ{ýÕ¨ãö€ðü2tÀT\£Þ {Îu¥’­Ü€9$Bz:“@3²-°óji¢w“þx݃sE1ûàVŒ^è“÷ gø9úèeBx1qDŠlòÛ¨Q%.°Æ!lL±ØEQw0/æÓY3É3ËTo@¢>s²ZƒR\SLƒ‰XDY(‡–Äj€ÍäÖºÚ±Q¹tÜ€¯ÙÏmÈ*™Ø;œ–¬ÒâÙiË%éˆT?–= ‘^Ì”"j€Êæ¯U; nD5ÃIåG3"Ùš| Ld"‰‚ÑG^ƒó˜âú °îl3fÝô*œÏ‚T @‘Ò)³p‰j%ü„å³R™MÌ Àí±eª²½9@yIÉç|9à?;Á™$ê'ÃVv‰yÜû§Œ#k8<Õ Câ²GôêHË>²È–Ì"MÄtøXæëá s^êj:ç%Uìy |1YŽHóasKLQ±$Bg6Â'xžy'O·‰6Ó¡ªÅÝ¥ $ìF‚¬“MÂpFÞ9÷œUˆ1!õæÕ#Ô‹c1…`ºf¸%±]Ô :½ñeîa\¼“«Ž<9z:hy›t°'çàä1Ó{¯!Ì87Îބrú€sw+³˜hdm¸9·Y/ä:ý󞑱ekXuUƒïÔ•ÕbÜ5È’Î8ËmÑÛ"ÊCæÉ¦ DݦT!³Ø†“‹¢œ&—jÚ¢wºÊ‰Q£JÂòòAµ@ÄГ J&YEãðdë Ft®#,›}”ŽHU„A¶8:±×óçÏ+aëD=ÙΔSÒÀ«ôñ¶çvéÛ<)™Œl¾þŒfDVÛxâÕ mÁh•åºÛ´3i%\2„Ù¥š1‰Ñ5Z“Õ*aÔ¥·Œ+C¤J×ó Ò~™¿>YѸTM³zDi²‹1àp89ɧõ~1FŸr‚¥Îœ5g±ì–Ã2Ü$U% Yˆ4‘  bÂÞKÿÀù©î©*wÇt/OaM2|R¢­`c4,QÛL®nR t©ƒ"ê>~ÿðËŽ3ƒ˜DQÜ•lôÔ$F K‡63ƒÕD•€¨\V •h i¥F‚XšÊš ØãÑiÒšõP2,ŸŠ¨Ô'à™ O²ÀÐO©®‘¢¹è]W¿{^ÙOˆç[𶌙‰ÁE ˜øèDd&ÓÂd¥Xa@ñª¬XSaªÂÞUaT?9PÅ÷RE92:UŸáõIO*ú‰ÅJP$ŽÝ3ŒþC$¸Ä8*E=±î¹ññ¨.ñƒ} ¸Ä~8×Z;mbŠÌöá‰k­{Ê´ƒ%l,Ðs»€ý×Û—g>Y˜$!Æù‚¥¹í.ÕT6hi…^]Ñ".î ÅÞÕŽxÅsSÝ:œ Aå5â¹1žÊGéLo()Yr„rke3rÓþ”^KDßPˆ»¬~$ÜLßT{)2ƒ-fFMS® ë©1˜æ“ØcÜL:7£êC¿@ªª2òÉ„gbÅœ¨ Ípú«ìµÀ;zü=¤­ÀnH\ÌG6±øˆm 9ì#±ØÌ­IåíLÅú†µ5¬Y/}3m†ØkÍ ùÊ „×6¯îR%;dñ‚å‹_l+g"UE-†" Q9ì.Ä}I©~B²W[à ä-ËöY­´yzÀ=ÖfÌ¡FcŒV‘ÿÐ ºðåían³Ò%""òEá’CY^mšoñx¡P[¼]óc —SúR£ÊŠK¸c͸.s×1Ö$ªÆTv"ÆàU ª Îg%>‡§>¥»ª6w·ò4é«ìu'ì)*Z&Q˜•ý'J¶o&§º%áe;êÁ˜| ¹¾ápádQ{‰ò*#<Ž”«ky,(ÂÀsQ]>a².xôÅvÜXâž1Y>›‡l¯¢…1C¤f{müðÑUC)µ{ö¿pµÛY‘8b 3«ÅËÉ4ÌIøh²žâ=ÌQ£\)XRQÝ.a§Åž”ùzžßîâ:tSùÁ4÷$\­©«[ioUt<6¯fÏN(cÐa\"šLÖ³$k{1(çšÛm(çc½†Ùâ ^ÎY15Í-™­ùZ ]ªìºˆf L„†HA 1 ¸&SWcùÙ]¦¿xŠpw`ÑT÷À±$ªÉ"‘@•°™oáSεT©L 1-^eiG1=YnrGæÁÆUÒA­=clÿèeßSa ®êït¯t_æÔ˜œ,ƒˆ˜“dºO"Za„¥ºGü1Rcbz`xœlïË… YèB2®M”{a*LT5î­B¾­Áõj ÷ Mb@š»]ƒÝÆzÓuy?þÞò6‰ˆÐ€æ@Q©g´i&jÊ¥jM.S³Cbʆœ¦Jf.+G¼u®Cqàó<ýP”é§–æ[0‚à(¡ŒÚã¿2B‰e=3+,w·ÍôY\W¢6ZDÒ“, ¸WÁž¢9¡²™ÂÄ»ü•[K…I}41¯ ¢5Û+Kf“ßnn$d®A„ $l †QlñÍÙ2 ˜">4?9²rð#QR†m'{°g5\©]C u5nÀió-’Yç™láÞTñôý ó¢h©¢ò?ÿüˆ'¦Âôzš.ßÌF¦ÅÝRÈ£°ë»Èq8Æúà‰TA T¶·¨å²Í<ðwïuTâ®U£™ +G© "nN@œÉÂw4(«baC’I].WTmó—Ÿ2ׂªå [² «Dº…7d0ECÊ6f‹–‡‰Ióñ¶¬È«-”(ÿ \p~kÂÒvv|©#+e¥S•¿KUQ’)LÄôŸa’jFf½„ÿY[ýQöQŠÔºÅÎ &^i8%á@tÌ$©g/¬÷˪A‰2`©´¢›—Þß $ŠzÖŸ°¡ÜÚÙê烄XÖ³ÕOœT6‰E4 x°#Xab’mW•d”µBÿòàpÀD‰$*æ€pSQ:p´åñ™¸i ìCü¬Êüd*‹” Žh±X í¦ÒDUF¬Ë—õVAæ+R“#PžhbE…NEwZÑr¬ŸYìˆ(Ï0ªþ"R.)–A|X¹hSªÀŽøm-=Ù4ÁNçn {/,b-¸Àæ%¬^ÐW( ½Îdy뱫ÞlQP0`ÿ2ô'[¿~g,ÄñøÛÆ)¢MKMÄ´KF}¡ý¥º ,ßå}ou‹¬ó‰W&÷£`1ž9HV¶œÏ¶Ø¿TÑ´‰„H D–XpéIY“ˆÑne“*ŠOÝ¢ÀN Š—WMÜVe¿&Ü˂ЭKÄŠ«O.ÎeE¿8X•/×ßw°ú=Þªî¶\—Ýü>}oÖ\þש0CÞVwm°Æ°ÏÌ%3âd"÷žÀk¹}yçöµ"מíUH÷´?éÚÇÛs—™ñj· äŸÐwÜÔ-¿7·/ÝJQc ¯ú—)ep²¦[úhÝcÇ fIw–aðhðŽ‘š¨¥—/dËÜåçfÆýAÙãƒîÚëÆ4&Üψñ®èãÃOû OÜà“À+Å—ÎÓi`¥\¦F<ëOð"2—Ï`tyá2—Š •‹ˆ‘¼‡®h™UgÓ.ìõ]Å÷ν’â“’êëéëÓÿ #o endstream endobj 1777 0 obj 6480 endobj 1781 0 obj [29 /XYZ 38.2500000 654.500000 0] endobj 1782 0 obj [29 /XYZ 38.2500000 387.500000 0] endobj 1783 0 obj [29 /XYZ 38.2500000 654.500000 0] endobj 1784 0 obj [29 /XYZ 38.2500000 387.500000 0] endobj 1785 0 obj << /Type /Annot /Subtype /Link /Rect [453 704 480.750000 710.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 1780 0 obj << /Type /Page /Parent 2 0 R /Contents 1786 0 R /Resources 1788 0 R /Annots 1789 0 R /MediaBox [0 0 595 842] >> endobj 1788 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 1789 0 obj [ 1785 0 R ] endobj 1786 0 obj << /Length 1787 0 R /Filter /FlateDecode >> stream xœí]ËŽäFvÝ×WäÚÀ”¾Ã€¤î2à…A x1ðÂÐxl F·gáßwV’™U$ó'ï ™TCêVE“Œ¸qßÏþù×ÿ8ý×ßO?üüëÿœ~ëÿù×—âµ.‹îŸÓû¯?|þm^û?Ÿê¦<ýöûË÷Ó÷—_^~9ÿ÷ûK÷À¯?ÿëùOÿw²§9ÿû—ÓÿýüÃ?õéý/üþR›úüû_/¿·µ9ÿ©¸ýþþóÿ~ù·8ýíý×Ïõ›þÿlcÊö}3_þþr=¥¹üúûo{ù¡;ÔGÊÊ™æd¼ó'Óz{úßÿ|ùóùõ×—¯­7¦®|]<ð™Úž¿cËó'l{s5ùÊå—Ä»ø«mµ^}Ùµ08Œ«LèÕr÷YŸ±å˜¶‡ÌíÝò@o\¥õêË®…ÁÑß'|µÜ}6MÓÆY'õëËÅ¡^[S¨áÊû®¥áÑß(~·Ø•Ö¾ìqÝVâ<÷ãåòWz¾S­W_v- îJï–»ÒÆ8-®ûñny°·E­õêË®U¸.~µÜ}¶u¯^”µ<Ðk-Õ¥)\©†*ï»GŸðÕb÷Ù˜+¢ËßçÇ»åïÓTZ¤ßíZå>ñ«åîÓš^Ê5SÛèQÈÜÞ-tÛª¡Êe×Âàèïsüê_"^·ÑýXÒßþôí凷3ǨNßþ|Þ×å{Ýoß~ñçÿ9[‡ç}ûÓé‹Â×ÿtúö——öµ®ÞͯËîºÓ\VÜk髦þ¼RT—•æµi‹Ñ3­þ²â_½ëœ+%üN ¿wPüŒ¾c|¿Ø[à¤po“pÅ\VŒ{ugl:/ÝV|¦À÷óõ²R^_öi¥Ãƒf ˆ™×ãgðwàÑñðõ¿ÍÇï:€ :c¸ad"vm¸k|§˜AÀ›càf[Ñ"$Ø&\ ·öbfÜçë·³ØQ•Ê †˜Dư† O"¨!pw²b S7ÞÆRø¶¥ÔLü//”4ÎÏV4Ã,#|,^àõS‚£ Öo0/!``¾ÄÃÀAÝ8€!GE]B Ü-Ïæ“-1èFlÖvo3溴àmÎŒ7 ª(O[ß åi€¢0Š|A‡—;€ñï1Šûg¨ëÑ®´r9À`§?¡ W\ßö†Vz® xqæÝ}8*ææXE宨!Š^)-^«Ú UN`šòµh݉~„oëÈÕØëÒÇ¿¤Á ÿ¾¨§ èríÚÐoô3på+\ÑçDÆ ð̪ˆ™¹M_¼l`GÖÙ)´x] má ®P1 Æ™…Ý LPq€ÉŠ»J*,ð!e^ÑÔ~Ä@#ü?X!IÆ>£ÀG±(ÝOA, ®€«ŸÙ¬mC‰r€ãgÆfV„¯+¨”‚GD9²9Vdƒ52T3A‚4”ü).; ÚPØ5}Ð÷ìdc€ì±Ÿˬ5ð9Pä(’-ÄèŸÅ8!¶¤åL“‚À˜² ÓO”Tñþê?Bþiôa*ôL$-®F%Ó÷º Þ2AÛ“£"»¾“Ф³!8ãY`öm¹üËî0ÃŽï6(¨ ›6½°lŠØÓI¹Mi€‰³¶å_éÆ0•w¸–ã&Ý©Š'”yF™"’(ˆ!&Õ<Ýö†é(¢ú‰)ïz:a)â ډŞÀïØ6C¹)‹œÉ‚‰ k6ÍšùÛ Qÿ¥ÇýÞ–ZH,Ðá þN¶ZŠéK–Çj: ¶©·Y’š$¡ØÙ‘©°µä´Þ×WV³Wº© ´YÿŒj¾ß¦DïÁT¶o}ºÑ ¥MÙ M K_õ{+&{K•õÛ^óÁ·›õ{;‚ cªÔ°êãÌðÐG¦ðcJeUî&*Ëå{O•ì®ê¶HýÈ‘|ãŽ{Hnªw\_x„JÈ”-¨ÐV)•Û¬¸Ã~‰ç›Î\¢fÉó9œWÈ~ŽF6AÒhd£écw³ïˆo+>¼Mý` €ÂÿU+UG¶D²KÝÏXš[s¢±ëTa¬£Ê:ˆÙÝ+ÛæŸLsf*Š.ÛqwlP ¯¹N€êaœÝÅŒ«§ø™kÓ+7V\ñÊjšåif+×f$„1ƒ#È= P±Æá³´‚ N*¦!ÚhYXÑè½S9 ,F·LÒt..µ„I´ švÊË×,PE…#ÃÕb\(øP 2Àh 5«µ«6ámÊ¡ˆÍo¯Å´9dL»IÉüša]¤²b¨rP ?”vÿÜÆ á²²z'—›×¯Ô« : £z¹î²#tâ;˜+"¸5ÍÃ#Ú3IY ŒI)[°ÇÈ…ú°¨ÔÆ‹ !ÓÎ?Wf¡¾_û={‡±‘DìsJ—‘M%©Ÿbº—?@z©X—°‹V$ÎpŒÓªK$ý$ïr¥!R‘Ç3:Ž€"ÝøeÚknGµÅÉŸ¤k¨·{—ÍÀÂ&ÊÛWØ}€J”Íjâ§\^¤Ëgñ1}Þýd‘Ü11…¡Î ö­rz¹vÌ€Ì@—s¾Ó^&ŸÞGEóù'}ù5ùòˆb?¿}HH6Ù&©åT¢¢, àÉ]”1¡«Û¥ªå-«Û\êµ>ðPv FVµ“uÍgW©¨ÙÕ˜¢–«ÿGŠàDŽ•L˜+1pÕƒÖ²Ë;¥l¯åe Z§íå§)Bªj(C˜™4 åÜG ƦrŸ¼ç7ÂFkÞñÓU]i¨€£V“ÅáJ_E–R{;G.÷/!uõ0½Šá²·š ãî͈V·¥NïÃÑÓ¦'‘úP{tÕÿŸWÊ® ¤¨S…ʕզdg½ÉÖ«‰¶ÅÌ–¬Ï ˆÀ1·U¢ì²YD×wü5 „˜¨› zVŒõFÈïiŒÇžhí|¢yÐTÅw£òP#>{c’ ÊLó"ì}¦N%[†¾rÿ-ÝF†Tí S8fT²Eì²ùa²p¾êWºšj(¥‰º‡¦*"?>éüÞf±FÄ(ÄŒ˜‹`¬ü¨ö›"in„ù-2hVØ;Â`&ã“`¼nH•6ú“ÑÆa"¯`&Ó ™¹JF¥•ý¦7¯ZàêýH²ŠŒsŽ(\‘P–e­Yv,[r¶MÓyï ÆóГu}SþÅ4Hä «Šnáè…ºqú‘ÅÞ =ÕZ[7Äã„&w’Ùµ©|>*B¸Ó{ÚT2 e Äô“U¼™^SËç1u ùÃ[É ÇEUP:r®jüPέzvAu”Ü ØV®p$¯»{LäFdéPôQ¸ Å(©aSS¦šÕ(Ë÷V"‚_Æ0ÙG²~J÷“u>ʶØ`/2c«‘„y‚^dÆt­?ùAô½Ã¦iGßÌÕ™,P… ªSáDQ*/BBlÅðT‘V½#œ‡ƒûÜ@g' š¯„Þ>I"©5LtbkЉe½]¾@{ö‹ñÉ#•˜¾âP&ãÞ‘í#“µ¦ÑSH³Óù‘ä›p&Þ71„°~Èé.7ýÉ$2t#¦TFTz‚GD¡gŒI+{@½¾¼ÍÉ´w3¹;wHs%ë¯ò Ëî™l»|µãÄŸ~—RÏ´è™þŒ¿æõ{Ï| ­PM W,Ú[à;p×}lÍØ‰„ |§ÃôúÕ…ûDñÛðIñyÞàÛÚ4†Imí¶w‚à”…J¨ 2ÜQ¶t~5S~6Ú›:W›¸üóä©X1 ™ÉD d©öL5]ªT{eW·l®å¾ U­j(ޞǗ¾WB]uÉ4¾ÛßFª½*¡›sݵÀ®ë[ø­¿‰NÑŠÝ{+?¡S£ Ÿ)à lÏó·ñ3>È Ç0pôy’\pëg¯_#¾,Á+|]ˆ—ÈjkªfžYEpV†qcU!W25qßÖS'ìE"®2Ð`vœ×,›ayÒ¡ÿšL~µö:á¯WÔ¢¤‡Çå]¸Àì-ÝáüÄQB³GŒŒâ4x¬ÿáóÀg<Ô±<¼Æ Ž•Ý­8ŒÛèEãn¨ïyÛœ„©–í¬i0B1¨0‹Æ Â¶P¢«?VŽ•u0U™*.Ï/ð 52Œ8@õ°ÝãÍpxרõyæbÌÞÜ…á;<K"$ÚZ•-|ƒb+Ë‹žU]˜Û¤QH^cª‡jD*©i "kØäçþÇŠøÊaŠ<•)RîÖÛG‰²+?ÏÃÖ•Í®ìÌà8 ´„E×NÅÒ#_²ÈC]´×¼«ü.ªüÊvÀÑ‘Ÿó+ë^9”úçRê¹F¤W­Ô'bëª+© I¦Ä'…ÐÁo;ØúÊW¥þPêUX´o@1/‹I‡í#IŽ}Ë:uD®oª”íün üÇ xï±r¨îO§º7רïšU÷ƒy¯Û¬XãZ1ƒ<ôCAGÕÖ?MK‹l]%*©£Jjá%g¯’év.Ò¶ç§RÝ]?ÓÜ Ÿ”a€1ãQñ‡@JýÞ¦ʹ£¡ÌŽOD+ĈAMó}­.Fµzíu´i*¦ö<ÀùŒg"3SÙ6Ù+¦^8¢ð_WcŽèiKµ«Æ+¢Í]¨yªøF VÆý”…oa¹a¹œE(³[cW…ÃÊ^‚Þk±²õYÕ­7ÅN©Ÿ2{™ì+…6·YM¡X5#ü"dæÏ1³" ¡M·ïM¦°aÇ‹HÿQbäÉ º32mÆ&G‡÷DÍ\n« 3I¦ñ·ƒ{£U&-jšãÍ2@a¸¥«ÆŠt }qZ•cqŠ­æˆ0¡Í`PRŽÿ ¹…Ã$ÌÐíDnD‘.—›½³΄¯‡`þÞ;ˆ¹ƒ•‰«ƒ°~ÎÙÆ¯zÒ hжJ•xM Ñ\úç:AŠoŽÝqã{e´ËTHÊXš,ƒÈŽ* Dœ 8‡@ŒÅ%×ÄÚ ¬€H“4“këóÉÓÓªñ2I?8I si1W#£1ÞVÌÐá€ÂÄYTŠTi»RƒOd‰§bé‚S8D™#€ú{‰ ²WÅŒÛr¼êAV¤|xq³ N5˯üÝ3ƒÇ>³¸"D !¬óë„LÜL¶(+PhÀØ[ʆÞÓÀ½rø4.g[U#»p-óøtÞy©\qóSãšb¦¬)®Gǽ½¶ªel=!æ˜R°$„QÙÑédGaeGÕÐyÆRy}"q¾ZJ$ŒRI) ™Êzêu‹bU¼š“j„#ŒÏ, X)þŒê.¬g7¾",ªPˆÌªÞ´WÑ9wm;p 0¢ù’"ÁÛ@ެËíHî\¥ƒŒh]nŸS‰• gû—;Ž)¦O¨ i溆ƒkª!s Œô›£uÎSšbÃù‘ܘcÅš›ñn¸á/&ŽÑo$"ç³B¬¿1EOLh3"òÇð‚S¸/ð;¹®4WˆŽê«Á”Oú}?«]?ì"Q¨ÉˆqF³˜&"0.fÙJ7‘rV %Œn³âÏŸÉ£D}[0ÃëŒQ VK‚›Ü¥G´ŸWe¹D2…–K’ôS"³7*¢ÊW#2Èð•2þÑå‘F-„2u‰ð •ð™9Øc›z¯F›q® &ý’çÚá7@1}?hYC’5Z¨þ_L˜C")V»‘ˆM©Û AÖ0•së7'ÓÞÍñï–V½:cïbí½gðwðÛÚ4ÌÊÌnÆ­d÷Jî¿´¨«\¶ ÂNdIL¬^£û›®âg«vHTÑxÄÎcÁ;Äh ¹¼8˜­ÒUo€ƒŠµ2ªö:à”äT‰ººÖ9bQçßl8[S¨5n$Õ¶ÓrD—5•®BÆá‰/iÕ¨ä»ÙI9š –¬!&gRßEZ©`œ]î…¤B@0H6Á*àc$’e˜4š@ô!Õ<Æ‚eÒép‡c\>Ų×1ŸOþÑ ý4ÕŒn3£[ ¸Ñ8žH‚eWžÏs¶¥,°ªâÊÙ¯ 4¾®C‡o ‰^‹-7ü¨†qXƳpáŠÏ?ÔRtå˜ñ¼î•ž“E­nW“a Æ{“{Š+Ø’K|R<ýùÉÍãY‘SÍNEžúFÙ™Ã6W˜!ë2;oˆg Ð󌺲³•d"ïâ@e.PôŒ ~1#fD1m¼€˜8O¢iã‡8œ‡ö–µ´3qˆíŸÃ·À Ü (Úz/fë 0.¼Œ½w½ ý`¸íMR¬Ã:‘h;ÄÇœøðÕNÅG€­ã@fçñÞàÕS;È. ˜•bH‰u>Qü¶ü'ÝæŠ¬øÀJVfç|D=`ëŒkïpÓ)–ÆÏ3o¸QÜ»«O$ŽCXFOÄ+D0æ²çÁ=ϰÈÁö`¸a>Ö:1ܰ8„ç ì²4qlj%ÄÏFU¸Õ~†âb˜Wa¹ Šþ%Öß Ç$à 9ö#,³l¬b9¿C:üN Â!º˜=1;À˜h1m‹b"³låÈâÞ™9IX´µ«QÝw·BŘm0h‰5!lØ`/³FK3XwaH‹w<ÄBgz•¿v$ÝiíA’o²a2Ö„°dÂR¦Äd†I“€5Žþ;Œ8ËÂÍ÷¥$³ê9Œ©ô¬N⸙è°¯ßA¤¨÷šŒí9†#aí6 a^ßf‰g„-Ï©è®-áõHµë@V˜“"Ípÿ…º¼úš˜x¬\9Ú 7º¢:¦¤ÝÛQ%“¾`nV¶¤gÒ(ª+Ï?ÓñéJ×dZ“e¶L¤l‡À?ÒoÌPVC¶‰»ã<ÒÜzú,<ºÑɼÉcl¦LÇFF PlM´g Õ≸Jª±##eg”Hè?‚lb¬5´„i~/Û‡AWšÅŒ¼ˆ˜&@tZš•P²í»e›¶)J϶¶Céè²Aô-¶ D;šä§>FÆ?`ÌÇ)$`¤Ä 6µ)“/{7ð€¼‰hjH0yÙF’ù‡dÉrlf^óƒãô=‚õͳÄ4› Óû*b,ô˜¦[®Õ–å~t™©\V³&1eÎ0ã#4Ðl\M!kçËP÷ÙÖ qî¹=õ®óÓDhÀ¸q([™ñ$MUšÀ>“Ë™×wÉ£ôvÄ-DFˈN’TóÄ}Ø“µk ªˆ¨»~Ä@a‘öº[ßh=ÙQ’„PÓ&ùåÓ DÔÕ$*a[Ž™üS«„¦0í]Põ›v¤–+;íc,2Æ!›ÍVu1 7ÓbšbµŒ7œQC˜·aXK ak„Æ(zx³2™pQz$c³Í!—¾W´½I°ü„ËPv“ƒ7ËŒÙNæý¸U&Z¼~û]?šƒ³pjf #;ô7—›<†Ýã”,PóÒ™Dbb”Ÿ‡¹Û½A9²…bÔ ç04»mã†ë‘K\€E¼ 7 TkãïÀ“âr!áÖUM:äûhõ´ÉËr¸òšA¦{Ó† Wkã‰&·îZ)*›ÄFiv"Îîˆ1¿Ë=XLÛÔ #´(açÜA L4ƒ,ÂÊ ˜þLbÕo©ˆ0ã‰ýmš©+ŒsÙÔ¹„ñ²–—4ßú¡øZª£™ÄÑÅ÷>ÉllzD¿˜u¥ò<ê›?FkѰ“¬GJd|e@m ¶Ä¸*{Uýž¼-® Â‚q@1‘=¢2ßö6ë(˜bFá”qhɦt(ÍZµnzñ'‘´mEk¹¡™,·vÑì€ Â1¦Êh>“àìùDqªr‹•ÂD•@¿¾k¯¼ÙFL¹hˆ,ðÍ¥bTþøÞ$š©¾Þ]2¶uäšÐwÍ!X†€”õ«å÷E5²õ[©Œð£DŸDÑî¶¢÷+îwôþK×nÎg¢çn’*ò·:Þ^ä òÛUým&KýiÛôtA¯£à«ÇuëÚ!²Ï«"áÙKëàO›Ÿ+WK‰:k1Ó‘I€ÈιC[ùn´5õ~„á;e°TŽøm:ºD²›}ÿU"ÖˆÐáË&"ý8›¨°`oø#LcÈôk3UD([Õ ãPİUÆŠ^Î8³:Þ‹£Ê[NÂñëGlÄ¥2έ¨kô{"Km›­¬§€dÚRˆ uÞ]©lBp¼ïš¡AFÒVå _ÞÎ{‚T6M=JS4õR4Nár6þ«¹œƒ±¡cO L³Ç)¸ÈËÆçÁ£ÜV> endobj 1800 0 obj << /Type /Annot /Subtype /Link /Rect [476.250000 137.750000 501.750000 144.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 1790 0 obj << /Type /Page /Parent 2 0 R /Contents 1801 0 R /Resources 1803 0 R /Annots 1804 0 R /MediaBox [0 0 595 842] >> endobj 1803 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1804 0 obj [ 1799 0 R 1800 0 R ] endobj 1801 0 obj << /Length 1802 0 R /Filter /FlateDecode >> stream xœí]MÜÊuÝϯèu€×UÅO 0 i4² H@FÁsìÀx6¢x‘¿ŸžnöÌìSd9UErÚ‚-y8$‹·nÝï{î¯ÿòý?ùÇá×/ßÿçð[ÿ÷—ïű©ŠËÏ~yûÛûš¶:üö·‡Ÿ‡Ÿß¾þ÷çÃå†ï_þíô¯ÿ;ØÃ¿žþû×ÃÿãôÃ?õ¿ôü {hLsúû÷óß]cNÿ*^þ~þù?üû?þþüÄëëúÅ ÿÿ/¶3®x^ÅÌ›>\¿Òœÿüã·¿?üzùþ —T­­‹ƒ)]y0]iÿû_>=þúðâØ•Æ4uÙïxMcŸßcꃱ]qh§o9ÿQ<ÛèÝ5Ñý¼j19Œ«ïÑǶ¶MY] ÿýŽ/rew!VÕÈ©õòlýF”EëÑçU‹ÉÑï1|´î̶•í cJ9i^.tWGÛÐóªÕôèw?[¶¥]aÚ išZM›×gËÉÞ‹öèçU‹ÉqÙPühÝ~:ÓĹ¯ÏÖÝ5Ñöó¼ê("?Z·Ÿ¥íE—-õúòp=Õ등éÑçU«éÑï(~¶nKOöE´#úòl=ÙOZ4Ú£ŸWçˆÂGŸ,Üþ?ðßÜ‹ÛC]å‰GÊ“´±¸¿<þå'À üé¹ñó‡_ŸN+:£>üøó‰$çW^þúqÚ†êðËÉMhÊÃ?þ¹(̧?~üõ¡;Ö¶º.°¿ÒÀ+5¼ò]):xOK¼§DWÊ]±ø=_á¼j¸k‰{ÜùÊ×'öyßÖw`ßO§ã´ïÎvýÝåËLq< ð¶©ÞìÔ—ó•òXºK´äu•—+Æ«²Üc.ßÜÛ®8ÜëÓ.´­ŽÎ¶fx¥÷Tç+îúš%÷ô¼rëið{<ï¹ðJ+~Èø¦€‹†í™èÆ•ò«Š‰få‡kíu¡ò4–_ÂO|¥Qaà|Þªð{ðé5xP²xhå#C ,ß1uà.X¸Û%¼BQï–ÕX_á/…- ÷zh¯@àùâiøK~æÑ§ð³Íèl‡yïækü¥R‰„ùÍÁ/í¥Xt=ÒRC:ÝR\Xÿbe ÁÜèWû³ö¾ñC<†ÆDÛüêòÆê¾×Æ]M×+*ó=Íâ1Šðæã{°)‡IW]B33 ñžÝ­Ìþ(´‡‹áŠefÍfʇ솟ænËÅ‚x÷cœš˜ê¨kGúH*x<2;PPæ~ !²Éc‰Ãè9âŒyV`í»o¡ÓÏ„¦»ÿ˜È,m®aw5ž›º.N«ýCD8cÄ@Æë£AúfÂD_O¾ ²³GváÇzÔÌú4æÄmË”8aCÌÝ„’ó¨?ÌÌPýQqJÎBë'|ÂVí Šañ>`^‹Î é†]ìKÀÁØë¥%{ éæáH‰«ËXfs$ŽjZº¡Nñðâ籘afAL~Æ”Hdü{lçGâ€:ÂBÖ:3PA0GìIb#ú=ÊKrì1•xØ€ÂÊs€±æc‚–˜AÖâñ­Ñ°†—êk™£¢Øb< ˆöèøèj³»dp_Õ&E¼U¹$ç=ÐzU¸bLÜ_ÌœDà׳6â=žc(êåg&Fàx4J¹-8Q4¯,ááˆáëÅ¡uf^‹Äõ÷&;<ì]›ÊŽv|"õL¹1DL‡˜©Tƒ6H é6IÙ3çÄ=BqbÈS<}¢”gõÚ8äXõQ„ 2d¢ÔIeëëZ`êD\À86ØDÀ—Øcu™?Ȥ)gž8>˜u˜Õã{–—zQ¶1áP\–ÝC¡¤SB¶bG,¡˜d \›ÖƒBÞõŠ©›n¨q6:0 Ù'ÒŠq› îaLð©ø'‚Y††V™6“loó‹pfÕLª‘pÊ=Jqb:$Нiúž€~!…Ň#ј•¨‰Œ”Ò-?'¾ÃŸ‹™@ªË¡6Þ€ŒÛiNvd ÀÎ)‡;§p~Zôèƒ)ªf´ÝL‘Qt6ªšÊl¬ô‹±¾5DØv`B0˃&«Y[SµÂ¬ô=¼–¬ò´¤8–õ\Ü;â—5ã/ ¨X`,(¦n?MjÝQ>±´H‹±Vµ« §mw"(¤½– B‚3м'õÈHpiæRúÄ ˜zÏ÷à{cŽLj!•ÎlFET§UãFúôžFùx–h˜c̨€¼ÁÎÈ%1ÅC‰"‡b£‚)æ[s~:À¶ÄÄg²D“K{Y£äœ£Föœª¼ÈUšÚÓÔ bÄ¥Ô©ÅXI0ðÞ–!jËHV4Ø^«Š£à-DFš´£OÀht[Fñ‹Z[Þ IHÙ²Øl‹¬ƒña (é À €YAø›!‰Ðàĸ. ØlÂæ Ñ®Ñ=¢8â€1µQÕŽч‰/gsv&©V|˜´3£/!áQø\ ä)ÒÖ=jašƒÜ“Þ"ds¤ë !¢ÑCê{¼ÆÙÊp±Â¾•¡uÎ Ub€)I%¶@°³f“EÚÞÔo"iÊ_Mp'-u+ð®nª§%€©ûćRÛNBä–žW^#F¯÷|&VýÝ㡎…ßé†×ö¦2d¼jNþôÝâL^éà—šD2¯ëú7â Øab&ÚÍ(Y…“Ê$³ ƒLœS•e1å´˜ï˜^;¬ú.NUT( jf I04׆–'9¨ÔSØn"üùÕvòœóPO&ÎëD´j32<š„˜áK5úËž£°f,Ê{þK O”ðÌšô(ús²U´æOÔm«”ïà¤è„"Æ,ÈnÍHIe·üï…jªHóŠ Õb@I+ä´mRb«CQêåÁåb‚’äd¦>^Ûh;íÄ&l™Ù¨Oô^c:øA ׋âzÆÌ“[;¤z~èe*'Mè(*W”À*òxïÖÎÈ~¼wÛ´#FÔz®@º ð•GRƒˆJØÛÛV›¿h&•(ö°Ìø¥Ð ³x·ñ=Ÿâ‹UXM]4`2Oˆ¨ía¦nRžc€2ú4ýM6Ç] ÄUÌ¢ˆÖ¤Â7kªj^l1И³—åæKíMEPn´4,-iƧÊáÓ¨Y>LêžÃY \($Fâ CH©¼š5Q ž1ÖPæ)¦‘iÊ¡’”4½­5Ø4_ðJˆýD0úúƒ×OÓ*3m£„ÇtaêÈpk<‘'aœ) 5¹ÄÐ<Úf|¨ÝÛ%qsFbå]c´íHšÜ­³0ÇxúR1¦ÉI;tµÃÚWÈ‘¹•Jäᶦª÷j=[”ï7ŸVX§u·´br͉t#5ÉxKRÜoLÔø#¢ûXló‹Íê²£T Q¥Õ`21ÔL:¦œŒ·©÷ËLJE¹Î¤í†rd?v†sÍHDjáAS¤Žƒ$ìÌ„‘a¬’Z§‚±"‚Iž€îÓ–‘½kR(Åòð¬ Wãì'Ó콌’M“‚³‰ËÏ ¶ô- /mŽc½œMmöª¥Û¢»©¥c¾Ò¸5ïM¢EYÂ{²—G& ’Äm¼bb²âa‰ å"OÀبëÇ ˆ¨ em˜ìy¶»%™Ê’ŒœŸ°ÍnãÆYEà Žqžª7¯›²{ο¶µ9{=轓ùñ÷ÞÉLÙÊ˧ÆMäV )†Úâ¶{²†PûnÇ*+íÝ¿E¿²dNeš!¯íÇ(«êjd—¾ŒíQroô¨'ÒãTÑò2ñÒhh©úâZ÷‚úüîr¢¢ïd(ü“M%pt©cÓÜKI¢jǾn;ÄW(Pš“ïF·ô5¯Ÿ¶©BØ”fƒzþÈ9±³Aж™l[O+ÑÏÚ ¼‡àõì´ü4׆Ÿv¿òr†‚®à§•Äžæçøw j\åùÁ÷xV€¿§žYA Ùåj„P~†Åksp³îò. ï2‹€ ;ÁŽØH¼6Çã=Å´~ _+Ó©ëÖ£>‚ù²+¼¶»b¹«u¨‹Nø¥æ^fmRUà¡(Þ9Âwþp 9‰Ê)íj`þ Þ›:4pÕùÕá]åøxô®r6«rvÆ;w劔«?CÝuÍuýÙ3ÔšÉHÚº¨Må”óÃ.Þ³¤ùêñÄ ¾ë«ÚIâp¸f,wSÔPšvøiå×T\WT™ŠDViE0œ'ö›ÝKZó•üÜݯ¹û5k—Hù³x–|Ä©/1¿ió{ë?ÛIÔ{³¿ò‘®hÕ;N½{ä§ð÷àÒ"JáUcuÅ­G<1" ^AÝzvò:c_:ð¤ãf©Ö!‰¿=‰˜4 h[ˆR5n³Q5I{†1yc¶MØñ¹’°*s—·RS#ÿ0sáTbl'¾Âôè•uOñ“ Ux­ mXÇ4£ó·¼ùÙé–¢øS3 Ø[³hÏ#º— AZôõ[ï‰+ϵw¦~ °_Îͱù†´¦Ê%³Ó$1 ßr›HÒÙI¡7â¼·4‘K5˜k-}‰a•hˆ33ÅÝó©ç¬® ¨#QÌh¤ÌÆ„ák5b*¦¶i&(è<ÔÀ‘NT¶AÅCÍj¦Ìi©¨8 ’\dô4 ”²aš+&ÇiÃož½¼¬+ÕüUO@PÓÉ ~’”À hFÙµf¨#“Á!Ð'—¢Õ!ßnæÛÝ2ƒÝºüdÑ6›á¢­Fûœø y +ÑŽ à+f Є8#¤äË6›é6Ÿwëy³ìñl\=ƒ[ûö'¿?|÷œø8¢â¼†!e)PÀå¼.Š:‚´ÅÑGLKwœ½v]×lýqÍ®¾¾ñBÛ[ *׺„éÐÅ mMy´f„!mÑ=³á¤[;-SÁ÷à{ê'ŸÄ[£ŸáîvÐâ²á´Æ+(žÐ Jl<×m3d# –Q?‰rx›Ô(õ\Áéd ûDéÌü mR¼?0RúŽN¸¸õ5e[%Ë~:…*W.š÷ƾwæ$á¾½gÑ÷?Q `³%u{‹Ÿn+rðàyB§&fø²ìFŠb‚D"3bs…¢OvÈÏá+ø’ªæ11Bä©{¦îöj…kûî{1˜Hk¢ñ•kôݱ0ITviÍ•7Ëk;Ó4© ”l ’†ÉÜRð2Ä€mOí;ãZÂ{$e/+8ä|ÇTîã£À˜*2âÓ’C¸=^ÂÓˆ±£áÑ‚Èh9—ò…W)¸룴ÝðÓR•lRÓ×âí>¤O3Úz性ƒ²ž0}&¸ñ©¹O£ñ¸}ÂOsg†åNYcy½Söí1:;N[zlØp@s늋–=§3cZô”`;H:ß[cLH*|œ¸¡‡ÒàL(ý^à—笭éF" :•ky«êÊ ?jÍ€ëûIe4U;2‰×ŒèH@AP2а-¦©ÜTXh¸<žAs¹#Å}$¤¸¸H›cÄw-‹f$óV/’ÖâßAC3h­‹ ªÊLR„@DD©¨pv—u64?ÞYÁäÓ¦Ñ>>F})z{² ‚L5¡(ãxÖj‰ "Þz¶0/¤€€Ø(U¬‘ ó ;$â~¼YWÞ=v¥‘U«.?&r[[Bk,i‹ü²CJl«˜È¾i“«ú.ëv$Þ™ÍôHG :e€{8©ˆ‹ò©iºOåZ2©Îõ ®¦!s2KZ¦iÜS›OÀhS1Mè£9xÅÈ$5ù¦ -©‚EÒþ¨wëZØZšÖ£6_Fó¼q!>pIõ k•ÇJ8qóBü`]SÏ7¦MÒåZ”³ìC޶)5 >Úa: s2<´4—š1XªäNJÅŒ¸97’ZŒŠÀ!1¸X:jšÊ ®HG8G¬:{‡ˆ8‰&þ{Ù¤¢£Œ¦’yÚj!ɤª-LÛˆ4QÌ8ª‰3I1ÍEqæDk0 ™Ò‡Œ½Ÿ­1CݸVåîI¶®½©ßw,l/ ½o¶·à@9GH•kKKǰÒ\sù/µN5Ñg/¾J5m§¡ÿØ¸Š¶Ù«L4¦©n Ÿïì†ï”äàÊk–¤ÇêyßÚTFÜóé‘£LË!~SÁ j‹ùLª(ð+®©Ó1 û3rá¥q|¼Meï%û¥5@Ž6Ó¯mL HÅFîœOR·Ù›;„sv½Õ±ÍY ¨øˆÜ\zà¹çJv7.JÀW´EíL¼j*×пTõ‡ÄZ€â¢² ÒžúÈ ~âcŒ×{‡Vx-"‡RØ&©Àg¨b¶ÃwÝPIiB&ŸÄ;"Ît$š[G5Ù`U¥˜§¾ÁP~׎xÛ=!‹/±e„äáyOüðXÑÔK U 9ò¨l sZu#iÏc:»;ʨŬ}uŽ6š”lBÈ×Rñây>7îZ(|„¿ÔÂ+®†Oƒ´6ð¼ê²€÷4°Ì=øK1”T¿Â\yîqð \[?ï zL»,ª¥Ò2Å‘/«v(únm<òy¸Õ¦ÆOdz;dÏApéß4³„×ѳPn2(¿†ÀkÛ©^K°¯Ñ̰˜]0‹a5;'wR|veªÕpÈÞl¬"®ä·b°­¢³.æÖ•w†Ä°ž÷h1WÕïÙ.+Wn¬ÌØUÔ‘‘^ñÐzO&LÃä¶„OKɰ½{S¯WÒySUgf Õcœj ¿½"–Ù-©M1»%;ôjÛÍ*×Ù+‚…¶ÓÝ<§nšâöé›:Lq¼ó'k©Žv2è1üÏ{:xO_‡âŽ“ ^xOonÝxO/¨n­àµ–i”§íÅ^}tæ²UcávkŸáÓ x®Í\¾§9ºI®ús8E=߃WPÃ/} _‡: Z³Û}¹“ˆÖx}gtô¸qS¾<~½®RoÀýI‡eyÁÄÔ¡dðøD9SH9žT´âùj+è“2 ¦µƒ)L’¶‡SØ6©*¡–wMSó‘SõÜ1bgR:ÂÔ À¬ñ0®\6cuµ– FUteÛáG¯ŠßS¸P-È}‰é\~ÇÀ• rQó SI·DÅ`¸Ä•ÒøŒ´`M1Ž´Ë -LàRcÐýFàèxLf¸->·Yg Ò5n¤C&ÔhcÁ5®T!;6"5H€XÕ-ÊÀt®öï%‚¨Êg'kF‡|^¶ô3;jŒ¤FÛO>Û”?zX/˜ ŸjSuäªAÜ^ºB ”hÈI5(5„\Òà4…Ê/éæÁÖÓš]1äò© Á¨µiôåÂʦ3òCZbË ,¬·Jç²rÕHn –›HØSCSòû…Ù':ÇÆ|—ºD‘¶×vÍ©cíä'Ok,ãR6<s„}Ý µ'ƒEFO-”¯´Äœ+*H¬-U-dl½J° e ,? Ì>i¨Ä HãñgC:!DÜ\‘(GíD¸…ÁvîÍìè^{k_†˜’†1©Ì Œ€y§’T#¬¦DÚ3™uË},×ù¡Z:⣩ºDâŽJÕ·ä‘-øø`‰¨][æL{LõÓÙ¡þYcÔ8{Ú?UÞ‚I@†ÌÞ’†{L¦[ÝÅÌwÍ÷4$eñZ·„0®5¢·„)Öwy~`#€(Yñh¨'…Õ9ò_»m@¦íoRÁÃx¾†ïƒp„Û¤¨Ã0Ïk‡S­-ÿ.`®J4¶³W 5lòxĬ´ÀÄ£™7 KïD±ÖœG þõºs…qŸ$…‚L )š$Íó$³¥y+ªšHÚK+”ÛR …À•¾çµ¬ë‘"&&¶'©¾¡x2»Ôû¤Lº•hTòœe&B• y[ LÕ/öåbdðü'“3+>û/­’À*沦©pˆ †TŒ¼'­-$iÉ¡ÌÍT–¹æ§G.Ýa¤˜¶ÈKƒxAtâ¥Â!\3[3Zš*“’Ö9R~~Z*Œe&Ù-­PÕù0@‰JÿMª dù2kr“@T†™©…“@„+B9’yÌϸY4kíƒûF<3Ö_).o›‘ÒŠ . èY"…üàSžè ¡R>N…R”Òï˜Ê³éF‚€!.v•˜„ S›¸3à÷ÍBâÊ YöÊÚÈmC!žª²2ŒµP÷O+N¡¸EÐàž Û‹”aÌŠD1]{­½JÕãÙnŸ§¶›A½g¢¡Dþ§/» S^ø3@*Òí -„Ä4ø Zdo­¼Õ‡E6®è†¿jB3ÐN[z!mÞXMx4¦+툯´†"ãÁiQc¡lÇæ:#ú42—álœ€dÆß).<Æ2cªN°ˆH­}»¸ÉÄ“ ¨K"Ž}þBŽlãÛľ 1 î9–»G>xñ$¡Ÿ¶+fåˆkFZs¹›«‡­y‚ÃîkAŃm³w4„ÈöhCcßI38’—Ÿ,:Ë&?ÒtåRx"1™JxŠÄóžQªòB 3%Ðù;Ÿ?³<žÙáyPXíÞþä÷‡ïG’ž×0 ¾.p×ly{ǿԧʹ×ÃZ¾lHénñr}ì#zo6ä ÞÓÁ{ú#YOiyœ ï;ø”Þsa¬æxÚÑÑšàjÍ5Ú1ÍYtÄZø¼ê¯è ~O//n­ R´ðÖL޵pm5\¤¨ƒ4ð|æƒ ])‰µaºaÞéù r ýt›—ú¡ ÈÈ~fÇUF/8÷¨H¦ƒK‚vÄ ga¿‹˜KyùÛôðö[9?J3§„ÀÒ HþyrÚL‡ÀòCÊQck 3¹ŠS8¤°Œ÷µbŽ<3ÕPw1u¬¥…¾”¢-L?ÍWéP+ºBpÅ`›iÍm€Ÿ@¾¸8}4”6І«°¤Å Ú\#JÒî¢[0Y \b¥ W˜îf½Cý¬bŒ¹ª˜k¸¢8N¿¦×ðvâF>÷|‚÷tèžk ÓNñg¼§ÔWj¿2kïJŸü±Qܳ?b·ž†¿®¿§ø W¿çê¸qÏ…:õÑí¯E«î4ÍÑMÎM"ÇÜT×ÙxjU²±î[ê^H…`M¥~ãŽÐ ");Õ¶­¦Ž–ñhßdN?OBÃ+S¾Íý¡ÓÞ,t;1øI䜖wŽÞ¿Õ*·ŽK×KÇ)ë_´—=Ú³¤šÊôzz¥¯²Óª5¦è=n.ykmOý—¢ù8Ï^޹ÇònÅŒ-||3#-o|†ÁOƒ÷ôÉ}ú›ºK–ážÿ}ZñÐÚh é7Ú:ÈÒøk1…ˆ=òìøWt z1Q.ø@ ÀÅæÄŒ¹Ós¿áÁÞ3¼EsÌ)ŸS /ÖA¦êÃEAKšR óEûþ3ÕíñbâLo"u³ªåÛáÛÃÿ¶f?ï endstream endobj 1802 0 obj 7691 endobj 1806 0 obj [31 /XYZ 38.2500000 577.250000 0] endobj 1807 0 obj [31 /XYZ 38.2500000 512.750000 0] endobj 1808 0 obj [31 /XYZ 38.2500000 234.500000 0] endobj 1809 0 obj [31 /XYZ 38.2500000 577.250000 0] endobj 1810 0 obj [31 /XYZ 38.2500000 512.750000 0] endobj 1811 0 obj [31 /XYZ 38.2500000 234.500000 0] endobj 1805 0 obj << /Type /Page /Parent 2 0 R /Contents 1812 0 R /Resources 1814 0 R /Annots 1815 0 R /MediaBox [0 0 595 842] >> endobj 1814 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1815 0 obj [ ] endobj 1812 0 obj << /Length 1813 0 R /Filter /FlateDecode >> stream xœí]ËŽä8vÝçWÄz€ŽI=Ã@e= xa Ðxaxaôx<x.Ï¿ïÈ”"2õ8”xâTDFfª;•’(ò¾ï¹÷þúO¿ýÇá¿þ~øõóoÿsø}øûóoOű©ŠþŸÃËŸ_ÞÿÀ¶ÇáßM[~ÿëÓÏÃϧïOßOÿÿó©¿á·Ïÿrú·ÿ;ØÃ?Ÿþ÷—ÿýûé‡~éåþúÔ˜æô÷¿þÝ5æôoÅåï—Ÿÿùé_ÿpøÛËϯ3þï_\a 󲊕7ÿ|:¥yýó÷ßÿöôkÿýA/© [؃)]y0]iÿûŸO:=þüðâØ•Æ4uÙW¼¦±ç÷Øî´-Õì-¯Ï6úGwu´G¿¬Z¼ÆÕÆ÷èc[:ã[•/gûr®UÛÚÓ¿7nøçš/ruíŒ/ÏÖDyÚ³H~]uœ3†–ñ¬1¶6æô?ñÖ¼{¸üÑÎÄ¢•~ÕêýèOÔóì¨lk\ÛõÛeO ŸÅùáú³8ý‰FA/«VïÇpÌøÙ:ÎmʪF¾7—gë·½-\¬G¿®Z¼ÃÂGëγ«ëhçyy¶|ÓOfH,ì_uœó„–§-º²ß˜V.qßž­?OÓÆ²”úU‹·£?ÏÙ£¿</£ÿ ðÐ~zn|þñôë7SšÓ.Ö‡:-íõ•ý_?NÛQ~9™ð®:üøãáN êþñðã/Oݱ¶ÕyýÓ¢+……÷”èŠm^¯|ýqÚ Øw2d†å4ðžáBáWç}ƒïYÝ*æJ’ímÜù¥v ¯|…W>GØ*Á†t`7Êâe7ÜÉÒVÙsE{l»âu9Óo®Ž§_6ã+øž~7ÊcéúxÒÛ—µèŠ)ÐÓ^vǪ¬ÛfÛןa»aIE;ùUÏJ\ø•¢&v¶„‹…{>ÐYÐi8ø¥!û×ÿª)Žuc^NáíJÏb¦:Oñ >­—`Æž/½}àxþÀþXŒ9SÈÛÓ0ñÂÍDÆÒ= ûà%Vàùž&œ0<¿gN2âN¼$ƒ¹…Y,ó47ý üüÏÓ‡0‚¿KJ:ŒÇÒ†a,Ï=ŸckÂÊ4cUˆ…¢g£‘:¥fˆµ¥R@bÖÕ~)s>+Íì¹Â"~±‡Rð§Ø„IéùÆ@í9£>yÆl>¡€JGèŽD†\+`úëÎǾÅH—¸ ¥l·)Æ[cRxŒèÅŸñe·!“Ád?Zà2ºd¤*¼Öœè˜¥ÕÔàaÀJ˜·˜L0!.S%´ù$¡¨Px!…ûÐó¤ûµ9Ö€PÖÌ °¦ò×Õ§ ýeÛbLLç ÆÐš’›¸àö]ò¬žˆ²^‹–ìʉ&bºñ„¼GÁ–½{ãÃfôîÛö^Y±ÕYÜâ¸ÝxZñC~u} a°IøAÓÄv.Si½&¸)­§½éoD~±®ž0Œ¶É˜6I/—2”Q VԄ칇°4Cü[‚u5ñGÆaÛG]2cH$$•Õ¼?€pª …º0çOM=»‡„uÏݧE¢*¸¥bÚü¥K©Ò‡ƒÀ/}ÏþÊDgôíÎi¤1UUgƺŠÂÄK¦ˆ$*; Š'‰È4ƒË£ÔYª*7"CF©™(P&éipaiÁ'jEM‰$¦[~?+›êÈÈ)t‰'lÌ -î»^DÙun¬#zûQAíi1FRÀt¦„ºÄc¹W¤:vi±ð‡d@Ù[’ ÔeÛÄ­›Ý ¸(~ÌËnX%ƒ#PyQ‡3LΛr«¶£†¨X†ô0w¤´p5îC¿ zFÌ€JKjK sÓãCÎ'5@B›ÅÆŸÔQ½-¦¿%‹Ž:[&¬è£Û|"LË7ªBüªƒz¢iÅåiL^Iï•ò05Òœ;ž¦ -ǧúÛ$¾kQ-x·9,ÖCoL†8rY×aÞ#mnÉôQ@Ì’°º·$o†¾,¦jJQŠÅdÌX&ƒ}Æ# PåL x‡ð¯k²8%àÕðUãñãw®Ûº_€³O@šBŠÒÌ1c¤#Q»;WMŠ>²L‡ ¦ŒP„¶n­zÏVfÌjš¤!¶Q°“L( ÊW ¶Ö8ù«|.îȤÒNÉ’Ÿ¶tO‰®Ø&ºnk&Ê-Yg§´’A€§ªáHäåP˜ííž‘6X$.+à )cF?Ûz³]ª­ @(4“{#¤`à+zÀbà›Ç-Þ_Çþ¤>0Wáþû©¶XL½É73—ou{8 ©º;¾À_‡ÿnŠcÛÍ¡®_ÿ6¦ÿ©=ÔÕ±7‚Šá¿?Õåјζ­9ÿŽ=½Áé×ûÿn_o:Œo®›É N?8Ý1ZÄËï´£G´ãüùéù‘dzÛ[cMµ7=fxìë(z~Üøcž—¹Ý3¾0Ͱ=ºKÕÉ0ý¿ó²Ö·Ô6,dÆêIŠ×ÓfêbNð©Ê±.¼¯à.,©uâ‚Ù&÷a]É á€¼\@2bÏó4î>g°Û8yçÜXdßOœ¼kíäÓâ×Ö ñ½7KJ¥y“UZŸ$®€×f²%ʇ Ü!„1݉~epÔ1k“X9LÛ†î}¹WÃHõÁìÖÕÇXg&ŠÅðçc" Ýd£(Óž° µMŸ459xI,Ù—ÝY§zeíóí7³¡ (zÌ lÍ”"O]f>ƒjt‹5 3Wt­BøêühS´£ühSt ùÑÓ_ãôåË&ùÑ×ßq£G¸÷/ò£MÑ,äG›¢ž¼àôƒI~ôõwÚÑ#Úñ ¢çGSžé)QûÐGÛ+q@ÚÎrŠQ³‘/ïð/¨ž†[„Y%®¹·ª±û€\Ì•/Ö6zÃæ²{b&8k;Vf©Àw»NÞH";ÒA vî*›ÓôÙœwôy7Ùœ¦²›§ÄSU—ïyäXTŽñÚæÇL'ÖßIÜ3Ö^{ª²¥()f®¢gÜN¶à“”Ç´Ãm˜îßÐ>W3äêݬ¹«‚Bv²‹A!7 ¹yPȃBv²“ ] ÙiPÈ΃Bö²£ MrgÁf¿";:@ˆk§´z:$2ùDe·T¶ðÞœñÈøM-ê<ìP’ÒÆù´}ñ ˜fЏ!ÚŽ»*RMÑ¥PÈT‰õÝÔ4DÏwc(Æ}e/ÕXÉÒ| ]I±[ÌË 6 œ4a‘j¤*#é®éc­…h;„kñ-”µÆìŽÉÆa¶Ó-6ËŽ^æ¿»ç­Øq"ô÷yá ~Ï £ê£3v‘öîÎÐÔçã}»‚w®ÀZ¸êgø¥pmxð—âU›þš£›Ñ1±£ö½Ç³ÄŽ\¾pÏ çÂÞƒŸù‡9[ĶÓúÖ‚'±s~£"t!vè™ÜlªÐÅ݇¤õ1-rPšìã¨ÐÒc€öUô€öjô)f<¢hÆŠ. HWS ˆnj‡ï“ÔT}K™Þ“ŸÎ¶Ð¬o)Ñe÷‘ì´¥µá÷|½èATm7OÓ¡+%<ϪáÓ<ý^q¯SØq÷õ¼Gû¥®w‚%èÀó¥5±6|>ðÊ*íD‡|vm9>©ø %ö%|ñÜÕÒ¦·´-œ$¡LBëcà}ÈD¦ ü ¼åƒÍŒ †'vŸÈ3ú$g @ãðscíwíÎç·Õƒ=þ¨=Q˱ £-q”ޤ U¢¹AÚ–Ú”_UTÔ¢Næ%QkŠ?­?LÜBþü€op;>F³í}§™³ƒÏ˜Ð–€éP0›Ýcá•A¢-‘þÒ®Zðixž/ÅïÁOÃD ïœÁ¥}{Vž¦ƒUz‹í8˜¢ºLÆÂ:N:*5UU'ÍtÁÀÙG‰Õ•ß\yÌ7ÐtH|8Æ›Ì …cЀ\ 8§Z¼3¸ª€ò‰ü¹â=µüªœ+>qƒ-4ˆ½!Ü©QXqy; šŠÌTwóˆ’üü}ÕµÝâĽÌð 0#ó1Qœ!Ž„ ¢âòÕ5òQ¯ &ßk›ÛD©ì°GqvÇ(rÑsl†I5PýÞ;ª®!æãÇpwÛÂ…1–NŒ©O$âó‹Ò‘„÷A:¤Ëb¤ìcösõf g¼èÈ¥%DÇ-JCKûž1|Lò1w#pCðÛÁ Lõ5Ї¸G3 `&ýÓtû3¦hÏßñèu»×6PÁ0!Óžù*\Óì—qôv3Â3ø°É¨”"Ñ º¬‡{Šk†‡i UbNVHS+bæ0³³±gà%B­æ’b¦tzìÏ›&ı!¦ ‰2-%™Žµ2ÂXê„÷Â…Å·¥V¼§ÿ¤3ãFjGÉ2¥©‘;Lç2uPFOŸž¦zhõyæ‡ë·l©õx6°Æmª-nz W0˜öAM¯ Ñ\›YçiÏ鎱½ô ~‚EWp»%ƒû¯u;|ÅD¿ÇÁ§Y|Œ^ù ¯|Vïñ…¿Ç#-‰‰IŽ%V¡X¾á£Ç»—yAÚ ¼£”^ø04ʬÚâÅ¢óq >IAp£Ã{ mæªmMµ¹æã,VXAíùRlA2VÚCé=ÄíCéíäJï–•^unµµk¡Šƒ²8Šƒƒ D˜-°šJjÁ@ÈfŠ FUcÁµ"oö3žRL¸7ë)¹øá_®¼DJµüÙÆÉ$ÊiÞh1>Pa,B¢RŠÄàŸg)`¢»§Ñû!Õ$·}ß=Æ;QLΈbÏUf"÷dˆ¢5‡ЉÑ8L客¯~8Þ$¦êê«"ßa.HâmFù8³ÿ(m-™Ä@:ï]}ßW<Ó>Qéc~CEKù!u“D[le¯–ÿGÞÆœM×Uc5걈™Î "Zª$óÕùH{¥ê²)VÓ„¶´=a,5Ý”ô-#†@P–}\àý£qÄ&Z¨ú›š*-·Ð 8RÆ,¢øãG<ëKè"2›b]öiÊÀLÅpEî¡¡´vüùa™MœÀ!àå8äɾùØTu ºV1ëÇXž‹J<©¼P Ⱦ‰ ¶”Ä<T"Uå)¹ 6ü¥ZPˆDT#x 8S W€SoEBfª7¿ö &$ÈÇ™Mi¥DþB¡{cÀkM¸6|KÈM·Æp‘ßcìY’k®`ŒÑµ‰ÃªÂÆs…@`kð6aw®kôk™5ƒ)‘W¦ILä{Æ&Ó2ù«ûv,j(P|*ÖdÖWÀL÷έB* %UÉÚž™Ivô~˜F]^º±ÞGaZj+g—­ÆG²*3bÎÄê‹?Þ³ŠÐ‹¼9•ݺ9.:ÄÉ4&psRàŠ{ÖL„ÆnDhÌé6u;‘”Ì‘2so¤ó‡V›Æ¬´Seƒ!€ÎŽg0˜níôB\dˆÑ¢Ìa” ÝCû à=Õìk8;õÞjó"ð|à:»Gé¹oÓ)”ZÓJxiÕD†Q|­­'šö–¤>ê ÊT0S.osú5ÁÿÌpÃyÉ Ô0MlÌŒ&þGiÏísQ¨©¥åKFÂd7Ö˜/$£OÄMíy,¯¦b,Fõ¦W£«Çj4?'>ŽÂ£œ(ûÄ >3NâñmeßJ(£9w•?h„-Þ8áü‰°Ý'ŠôÄ™w¸wŽJ»©a€¯<†ÚTTJ«Q€k²Ö i‰!1á7±ÇÂ뻸á·r¿½ ä~+‡ðÛå£Dd:7~eä:ëxHQ ;gꢄ·Œ"L°Tµ€ù,©&Ãå÷\L;pß<{Wíy”ð™âÝ4LØÚð÷@õp½–âñªe­äÂ~e½ÎIÏpŸòS+ÃËxðK‹èçal3>üiø<Â*%²À…U!™Cô%^~Þ,ÚÖ˜7ìK‰Ý)ÛØæ§íkçÞˆÒÓ²ìÑ}ᄘ2oɸÆíýE¨ì„´7’6‘üáZ˜ÇÄnUþßát¢üxð„Ý¥»î<›/wiƒßC\Á]’ ü¥€Š;êÂ.¼žŽÔëÙ¸jOkØù:{\[Tåy•0ÿç½)€Ð¯ÂêýB÷B81Á?ÆL>:2´øãŽ´»Ñž=÷–0ȃÞ{¢71~$¦Ž)§²;ÀÍ“¤Ü¤£®)P3“Ì È>c0 Õ#m÷™/•ˆ]·¼LíÊš0Ì”‡ˆò¢1v«ÙS–¯rªgJ>)õ“¿©lúz³ÖMT e~F©F`ZƒQéê=ô¬ETo‡8–4Á˜æ@´y¦+£µf\âð#<ÊOyTù¤—÷kdú£à-ö"a»3¢˜qªÂë˜Á"Wt‹öå•#©¥EeU¸]»$*›²EsÞÉGþ3kfÄš 0U^¢4èŠÅ7ÅñO?O{âݲïk¿°´Û¥ýt'²(Ì ìEN`(H¿îf,zz´ @Œ~· îËpÏÀDïöÔ@5ó½Ç­)†¥µ}¾ñ1NÙ—SƒëÄzþaä36Û>Ãà§Á{­l‚>ý«ÏÜË¿ŸV|>h¸r|Ðî7>èIq ?6æ–vˆ8#ωEl0(ìrÃzH.Ö03¥~¼˜ú=PÂî9¦”O›w /ÖA¢*mø’滄颽ž§š¢=š~‹GÌ…Ó;U½ªZ¾¾?ý?ÇøˆQ endstream endobj 1813 0 obj 7774 endobj 1817 0 obj [32 /XYZ 38.2500000 211.250000 0] endobj 1818 0 obj [32 /XYZ 38.2500000 750.500000 0] endobj 1819 0 obj [32 /XYZ 31.5000000 392 0] endobj 1820 0 obj [32 /XYZ 38.2500000 750.500000 0] endobj 1821 0 obj [32 /XYZ 32.2500000 391.250000 0] endobj 1822 0 obj [32 /XYZ 38.2500000 350.750000 0] endobj 1823 0 obj [32 /XYZ 38.2500000 350.750000 0] endobj 1824 0 obj [32 /XYZ 38.2500000 211.250000 0] endobj 1816 0 obj << /Type /Page /Parent 2 0 R /Contents 1825 0 R /Resources 1827 0 R /Annots 1828 0 R /MediaBox [0 0 595 842] >> endobj 1827 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1828 0 obj [ ] endobj 1825 0 obj << /Length 1826 0 R /Filter /FlateDecode >> stream xœí]IÜÆ½÷¯à9€Z¬…°f4r H@A'0b#Šùûa7‹=âòŠ]¯¿*²{hÁÒX4‹Uß¾×û?~þ{öÏß²÷OŸÿ“}u>}>äǪȻ²Ó¯wßÿ…®î笪‹ìë/‡oٷççö÷o‡î…ÏOnú_¦³?µÿþœýõoí_þèþ§ÓÿðË¡RUûç¿Ï6•jÊ/žþþ_‡¿ü.ûõ´bÿ9·™á¿3*¯ôi _þvèO©Î¿~ûúëá}wþ ”ZY›)kÚß«³ÿþãðS»|¿x~l¬RUi«ü†Ï´¿—:oÚOè&Ïêzò•ó/‰µ•øÒªV±–>ïZʔʷ´>2`ŠJ2—µånÊ&ÚÒ§] ƒÃá.-‡Ok{B/¦bàVм..¾tÑèXKŸw- ‡Q¼¶JKëÄbSˆÃæ²¶<Ø+SÇZú¼kap8„Â¥åðY`rLUʽ_[èuYD#•óª²àpø„Këö¡-ò¦†?ßp¢¦5 c©ÕËÚòˆhªhû¼ë8j.-Ƴ&¯óXø|][è­½QÆZú¼ë(øÄK·¼éþ?s®Û¯jÝÂʪ:‹¨Ë©šhttY[ÙÖÄ’ýÝ®ãÐ\ZŸ¶îe±1òP¯c ú>ñhå´kix8ŒâµåPZñDýemy°×y4QÞu…KËá³.zRoÿ‡z‹lncùOÝ®¥áá0:YûSÀxÝ߀@ê7Ï‹¾Þ¿´z½…c™}ù©ÝÛù“Ý_Z€Ù»R«¢Î¾ü˜ý>Ï­ýCöåçCs,uÑo°{¢@Orƒž¨>iàjOÄ“Ä;ð¤ ?çÑð:CG°®ÂOš$ ƒaa€ß©áw¡ƒwawýø¥eïÛX³|ió_jeÜMê,ÎÛÓJ}¬›|øÄíîIwf{´¦K"½>)á;z¢:L™ca˺úþ‰QÝ;W|XwO”êWy]#`yÇía'Æ›­áj‚…úA`³dÃ;FºæÃÊÀå;Î*ŽF×jøÂÏäáƒiVuÈV¦ßÂ5€”Š,éàc`:×/ãÍ2œ=>±‚èñ ›øð”K!Ø<[JD³žÕðÑáwÂ%cL•RÙ¡Nqš<ì¬fLEðˆ˜žeé óçÈvñ‡±Fd¤ÞA€Ç 4YËF|®%'@¾g¥l]¬c MØ[Á4~çCl†®t=bèg©O¶¾w3÷I]ž¿XءۣZ¶À˜ˆŠ£¬ê%üÏwø{±(3 pý­¦5z'‡»V‰wR9î¿X„[Ž2vÇ32ì­ï¤&Bèm ådë+80F'6& ¨J<ö"Öaù…hD¬µ±¥”Êm l5ÆKõ LÔBòìvð*w•Ám|ç£é£\õº±¬ÔÍFWÅ1ëÓà¡F×ý£Wh?/(™™'Û<¬‹}Œ*L#ã`CN˜Ô™ø‹ý˜@'wécËûÑÉA!rßÁán"žCèàï'àÞ<'ÅÉ ü § L“€e:Cßæê~X&¦›W#plÙ¤Âï`ã¿C¤nBBKXa=C[TØ0F,KÖ¶ ‚¨g‰Ì&a`r&°™ÐѱÏJù’©"Ú˜h1ˆ÷j(tSåd<2 ¯†BPéú‘*YÌ?Þþa²i«cΛ v-«7)t"1ÛÖã{ ºrÙcã1Þ?v¨—ÂßÑ™=¤~ƒ˜0b…Q)¼AbDT±M5vóD•ˆpÌ}}ÏJVa§2û‰Õ¨½qà.F!0:—ËÔ¼’‡ª$¢²T%'q&–,â­Ï¯7¨±èù}«Õ-„·˜‹²×“„·b "& ÍEU€cÓ[¡ÓC¬h|y;ÅHl™¸iÙ#ˆ!@<¢'‡O°zÇteѰk0  ÜÁ‰âF¦yãʨlve´+£]]¨jýΡuŽ#I)Ø·¬ªEÅH‘‡èjŒ©¾‰CÙì¼»tÜ¥cËTªHhªû…uUÈ0,µPnÂäÜ``Ø“oMô¿ÿ'!j¢>$ö¬ܺ„³špž@þR1cü\4#:Õ$Y•à=• PIíÕ‹öB… ñ…ò#ªÆBuc@ñ$f”iâ ¶Ì’H¶$“Á”*¿·« )Ö„ þZ_¦ôa÷ÿ>!òÙžð¬hÞšw‰3©8Ǻtž$¶zÁØ•gŽÍ 4%œo‹ƒ0¸hƒxç{Rˆ<{Ãù˜»qp‹î‰×M§öÄך0ÇwÞ]å0Û›Fø¤ •­Þ¬B]Œ‹$kñcôã¾³ ›K:_)s@ÆBœ‰—ãX>®ÅÂÕz¸p«l|R¬Ì±Â$âò[®³ÄX¸Ï“zì_Ù’“íÛæaÆVšL´iYkYÕ0Ju,‰=:›°4< …è‘ – Ï+HÔlñC…"šLÏc‚2“Ù‰) ™y¬ â<ž“bˆ~¸Þ{ èºöÀh8gÈZæn‡DûLðû(ÓN\F†-]c5…¡†pÓ)+‰ÑT›žËÃ07‘l˜€+Âí!y1ÙdN@Ô)‘]ÂL ¾C$»B͈i *óXÊ8])ÛË”•H:'È:Ù8@…CdñG£4#­F‰iøŽ+º»JC1¥i·SÍøŒïG÷Ç)•jžãõmj„aÀ`‚µÆzºÞ)!;Û3v¾CÍÁ ¸ÌjL£7naºi¦°fÂ_Ø÷]ÒÀñcm—®Š×ã]b„ÆDK?pY›2#LyÒlXà;^ ¨˜á€Üq;eV¯Gsä¼²HV—ȸ„‰%6GE® ¾r•0ô“U g‚î%pŸ—Í“ì[å(_ƒNª wÜð¹wøÎ%¨6Ñõ¹Ééj.3öÄÀäOb Ôð‰çQ 67Ý.‘ŽxUôkRY‰ªáæÂ퇔"Wôu#Ö^™i3",fm\n†‡fòã8Ðá!Æu\”!S°ï’í˜g ØR‰3`Þ8ÕÏDöúÀ±Í&;.C²'<y$²D _6hv§ã…V›î±Ö4íGÝá¡U„½Ú¸®t£úR¼±«QªAxõ¹{Pkj±Ô»‡»¤áÆÂ61_¢Qj†àÕçKP ˜®Ëº1W þшbýÉŒtIHö N¢Á 3cs=Þ5Wæ1dEyËŒš-Q–ëßmÉЄÇgÂ8ÅOcÎã3ÁÕ4¶¢1ÅcÏÏ?¼Kzó$·0|¦©o™ÊäaÂ]^_@2ŒNL«:öÙK'ò·y^Þ@þ÷9”lÓ ˜õºè?šfì–Íë d›CˆJò-癨 œ€j¦ãH´hÓ—¤¬=m«²Š&²”}EôTºªF¼NÔ˜PSŠ¢•b·¿²o-D¼û´ô?\Ñz¶pI™c®NEŽ™¶C5'%;¢¨f ÐÉ(}Ô];óDF•Ó'N3èc9îòÕ áA=£ï˜¥J¨¹½½¸“¢±38OoÇr O"(§trwîcy3s …Wƒï8‚VAG¯^É–%¸ÓÏ펇æ}¢1q`Dë!†“€¸bk¿’öìÍ@vƒ«y0>&OŠ&4ŽñTÃEðòÌ–ð‰ëÛ©²Êëc7TaHžµÝ'Á—¤wöéð(Ávƒ endstream endobj 1826 0 obj 4671 endobj 1830 0 obj [33 /XYZ 38.2500000 673.250000 0] endobj 1831 0 obj [33 /XYZ 38.2500000 520.250000 0] endobj 1832 0 obj [33 /XYZ 38.2500000 673.250000 0] endobj 1833 0 obj [33 /XYZ 38.2500000 520.250000 0] endobj 1829 0 obj << /Type /Page /Parent 2 0 R /Contents 1834 0 R /Resources 1836 0 R /Annots 1837 0 R /MediaBox [0 0 595 842] >> endobj 1836 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 1837 0 obj [ ] endobj 1834 0 obj << /Length 1835 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sؾ€ €-Yr H@A'0b#Šùûá9³Kr¾&û›ªnw,ØZ‹b³Õõ®¯Þýñóßÿüíðîýçÿ~~ÿù©8ÖeÑÿsxþõÍë?°ÍqøùP7åá‡_ž¾¾>}zúÔý÷ëSÿÂç÷î~úßÁþÔýûóá¯ëþðÇá/=ÿ…_žjSw¿ÿûô{[›î§âòûóŸÿëé/¿;üú<âùsÃdÆÿÿ³…wϳXøò×§ó*Íé×o?üúô®_ÔG*_4ÕÁxç¦õöðß<ýÔ ¼8¶Þ˜ºòuqÃgj{þŽm»qÊùgN¿DÚºZkèÓ¬¥÷øÊÇ–;R_ýÖ”µøÞ\Æ–ßöÒ¨ËiÖÂÛ1(Zî<˪ѻ¢/ƒ‹]›VVžg­tEñØrGÚT­Ú½Œ-¿í­-µ†>ÍZçŠÂ¡åγ­id;eE|×k-QWÚnƒ´håyÖÒû1œ([ìHKçܰ5ÝÒûþ2¸øÐ¾Òº£ý¬¥÷£?ÒÀØÇÆ;ãj[úçã}>Ú²il÷sí†nYSé*-Nü2¶üQ”­UúyÖ*œ-wm;ù­vž—±å7½.´q?kó„CËg}&t…ó¬õ.QãµÔê~Ö:ç ‡>6•­}Y´ üù†µVÍ`}[þ ÚZ½Ÿf­sÆÓ¡?E §Ñÿ ð‹} ¼øÝ—§w7ݤªÃ—Ÿº©>Ùÿö¥ÛŽòðMÕ1“öðåÇÃï‹Â|øÃáËÏOí±²åy‚Ó =±-zRXøä;øä=œ‡3¨áhpÖø;Å÷ð‰ƒsƒ£vÏïNÿÄáYïì´Ü[Âwàiã¼}spnï|âúõ|ÿ¥c‹Ú,Í5ËǸ·&VjáÜ’]À6QtrùÍÅ·Û%ŠwIHžùæˆ+Lx4¬Já[gý1~d ÖÀYV ŸÜ'…`ÕpËj+–sŒ2‡$VqOà¾áP6â'õ{ÍÜíÅCî‚¿c0íÀ3MÆ]ð]À3ÀÔËdb˜¿n#æ.ØÀ…3PábIT‚¶¼A% D(Ü‘ãï—vË‚?¡6h?ôƒÔG[ðE_œ¾XoEÏüÑ»>UïekzŽÚ›¶8íÎôØ®¼ã øNŸx4Úp—£f0ðÀæ…’,¤™üÕbý_õNOÍœž˜âXÕ¦é¾<éjÊcÑžÞzy‚§§vcÏVÌïÅp{ݱôUS¯{8ÒˆC€§qÌŠç„ ŽfûÑŒ9oÓšïÀýÃ×È[xx¥ÓÓì9³‘p»Æ·ù½æUmÌÊÍÇë1˜áïàãW¦;béƒâw}˜-Æ›2£®¥¥+J·Òº‰xÃ¤Ž¹>¡Þ>L‚I¹>qu³Ž hx“Œ#6RöX ‚¸ n¡JàÛ—h»l™Ð¶Ìl~ªCÞ´ÂçÈÚ{Ò?°‚E?aÛ0Ì_™)–±Ä…pÛTc!L™X«ÄïÈ2]|BõˆÈJ—ø€.ÃÓz-Übüg&K§ÌjF0Hܾ€Í‡§ìlLT¢'h?®×W†;Ÿöšãwð†D5#æ"¬'ìâš}Î>pçÃqI1Ñ÷6ÍòÊ0ß&œ'7ì†*ÄˆŠªªxº¦œo€ÁKŒÍÀ—Âlx¦3Šj_wÅ¿îËk‹Ï‰Ðõòû#ïëñÕ°;…ˆ ÍÎ!ϰ˙’D˜ú¿Q„$ê 0{FÜìÍË1=–€O³ÞQª(«¢K@wN'©«rrà9Pìrý Å5ä^”¥%ë™.0@ᄊ„¶e#ŒD˜\Ø+Hp eÊ?¡Ç1æ4¥m0D‹’ñz1ú/ž5$&JHD÷c4VÆãK\ÓÅDM;®èäרNÇô„¡RÌBYbý3¶QŒS Ï;BׇH"|q²é*2›3³Þ uS6gh/²F›‰ô®>WÔËÇ?ñgÆ N8»vâY ػć•}æ9íCëëñ­ÀQ5ÊÍ¥kYçw7P^´ÙåÆ›Â˜ø4·Z~‡hª»L ì™zCdv?¬³ ßLee'@Yi)Ì͘1F3Á'7%‰JJœ·ç)Èf¯Þ“›1G#Ü]ÿ$§²û')MÔz›ŒŠÏ3éy‰Ò/™NÇé8ÌÕ¶œ1LpŒ˜Ô„ï¦Ò†ñÇÉò.>mS³0؉„¤;—±ºam+ž3‘|®XÍ\ÏÁéŽ7¬q1’=w•*“/ìaä;™ùíz¦"›Ž¿“,/™±Fà;L5öŒ£S—sv¯»UØ%¢2A"‡SLÞVÕTœåÄÖ „[ nu[Oâî(ó¨’"±<>{^;تÃfP¯4¯€íKœ_i’²,!BI”æÊˆˆm2ö¨XNµR&ùc1¼¤ïG¬.„Áb#0˜Ä ¬HE„î ‘3æil3>&'V&»\$s"QNx´ c çìÃ!’?:Å8ÙØ]²lÀDE”ÍäWn¯ÆYÇQ%“lÏm$®$ìœ |q±ý™ö¢kF*åÑWÔ;æ#|§EïXwá|N>8±®}§@ï8¸Rf4 Ÿàõ ׿::c¯ËŸ¨ÑZ¸ø¡3F}t3"ýgð>þ;x´À  bO׿fá8ƒàÑJ¸Ò Þ¸R#†­¶%:°¨-¥‚ 8‰Z],’d¾€CDU T®)‘rˆd(/§Så#Si&xÛ"N…ÉD˜…2ˆ+8$UNÄfTF‚ˆ-¥þ¡ä/ÌDê0$"vF °P |LõŽlåqv7È’±D¤›hPš*á 8Ù³ZÆñ/{[ù+N0U~ Ù¾¯ ìØÚ±|Û‹uÀì᰸ކÃ/E/ ߺ1sËëzÃô¶!f›·âÑäZ’„Ý&¥oÆ'gï‰d3!„€H!rCek(œnYÿÙÈ$çIàÀ¦2²©R<7FÍ’EžŒCZÅ•Âì€Hã¤LÞlIünWŠÆšûï“é$Uaî['½ ·¬­ÞÁ݉fu¸gçÆÛ…Wvy:{ëøW ¸eRNØ °rç® r½—?Z^p/ñ^c Á,7e½K,ðÓæ–`i{`zƒ-xq7ÏíÀÝÙº¨ëÅéÜéeí¬¾iK(>ÚJ\|„EuiÆË¼¤ ¸Í3›É£ÎV§XɤŒ¦ÊjI&•=R&3YÖ¡E„ïð%¹ë¨ÓŽSÇvr*{+“ø“4¥ZkÆbªfÀ;Ç~åüÍÉD€»˜¾Ú²­jeòU˜Øó}æ¸l™ÏˆúÇ©Vˆ‰(sÒŒU˜?`ŠdTÙHÞÎÐA· ×̪ڱ@e0;î³Ï‹p;ŠõyL®8•æIX Ø#”©"ªS½ÒEÅÌö1“…üeÌv‰ú‰€ ³Ý](ÛªÛH½ç¯¾oUUÖ}#ð»˜Ç¬‰÷ášñ©¦BdHU#§ ïÓà]¤ aå2I÷"j)+—àʨHÂâ]¢WQºRD}<›zI½9¨·QÑ—r•sc)—¬mÅ-¢ Û'ÄeH^šÊÚy`€Š`€¦BåiÌe¯¡òÞy òP¨<-g «kûF`ÕàøR[TôVns)†Ú†Ì>KVßdò€lÝ.æ™qyÆDSË l¶lÇ÷-·jàœÒÇç­*ògš “!.¿pᣲÁ}‚|Äøp¢½Iº·Ç×nBH0SœI{ < ±øþ.–ìh‚ô”S±®ÄÐ=ì²¶ã5JqpùA¥nk÷xH«¶:Qå4•âÑ¢V4›/ªÛNºL'K "<­T[®æj9Q盺šð ¨(wü¢œðÙþ'š]:JÍ⺬±/(¸:QØ5‘V”©½w£u_()ê±Úò­X³×ÞÁ՞ēT0EmYw0§åÈ$öŠ–«ž¹ %eÕHYuŸ©©Öm¬˜“¥,Ìdïâ.ÍÆØ"J»Jpµ/ž´¸Ö\ˆ…9–Ä^ '²£@ÈJ¤ü¸ [–þ(ß4CY¼øÙ |1ðVáechY%ŽXi`XQ€\²ïA:D‡²¨n棢wÊ-p—±,¸AXÒÂYXœA ‚´aiVbzƒJð6˜PS-y€üE )À0CVA2Y‰/À 7LÊ ‰Ïåù£É ñJãÏ8æ©ìSÌð“ü6mÁwø ïð #>‚Ÿà;Â'‡¹ Õ˜bnI`Ã1VNÀÄ&p냂¡Ü‚GƼôÞ~xd™MþMxdLc– öá‘á$:a¨A o¸‡³öšèVƒ›‹Dn‹›T© {~nHWŒ›[" öáCÙ‚³”×Ù´ËãáCyøPTˆÏ]þÓàB—öÒgÚÈ–:)7¬‘çüàtÑ kÙ¤/M&§“¾N”TN¥be˰…IMz\ •ª¬ƒý!ŠöFaAÂó<ÚT9g¬DSüœð&_ɟݧeËâŽãK0¨QˆLZAWЍØ|ã÷% #VõDes8Å[8âD4ý X5Pow¼OK‘ÕU5ч¬0¦é¨~L€ï­/³ÉZPæ& p”ÅHÇü†ÑENH·æLY‡ ”¶ÈY6M¨ï¢BÙ.#f” ‰¶¥[¬­ˆ£½t2NT¸/Ò¿:¿W$[åv ”`;uï­‡¥\TAD;uצ3nq.ʱ;q 1Ü—`[ `þ¤<tðôXÌ›¨ÜsÕ¥Å$a%úŽŠŽÆäàõ$LmqM¹8Q*Ü•(OL6 ç‰ ‡yb{Ìó…¿á2åÓcþöˆà'$rbÖŸÂø]ÞLoÝ äŸ°BÃûKr4–Û‰’|{.Òt 9áÔ¾8óW4#› ²i¿™,ªs÷ƒ¹²÷Õ¾­6í¤Ïß‘8˜Ü NRÕD‰f,»”Ñ ©Ô:åp€hhd÷Ü’ê+‰™ŽÚe÷à?Ú>¿šý£ís²¶Ï··Õz™f=™S£5ûZ»‰é—­U6%ö ƒä퇄ÚÊ>bZ×¶XÜšÒw†`óT±¹­Ä(&¢ÊÙÃ|Ëf¾©ûKS-C"·XÂPsYK&-Œµ1OÞNôÒc¸¡‚X©(&D@L’¿1Еù4W¾²çÐ%NX–ŠÆâœéÃ8a‰ôÝ÷vLMãõaPÁm!E%ˆ5nL|›IP¼pöÔNëÕ¢wo½$/{Ífì]Ì—b>Ë.#g‘¤kÆ$¿ÂfüZë³’)w#S‰'»=/v(3½QÕ›ë={íXNip&'NaÂv¶kpzMA ëçC•┬€¦ËQY»eÙÂm•ˆ¦™ëË(gáöÊîS¶æ÷ 284ù’+˜l <¼×²Ù«ÅD0vÂ+ÊEdKó¦µY5eòZ“*J½Ã²P!N7“ÊäQAÄ7!›‡+Q°H.!ºySÕ–¢èÂuä¢qî-·ãdÔ›€ !ï¨dø{ÊF l¾(«Ê‰kÓöÙ»/"×Á’{Æ (ɲO¯"‘æÀzÌÝ0üeþÞÎÚÈÁçfNv;ê’0Ö4aåŠø‘òßuª›u¢¤„º<×\æ¶eTã&KÍŒ1©ù0¶ºz²qaŒ¥.®šˆDU9^€Š‘¡|M=9„­4nÑL»ð«;˜)Þ›*\"âP ‡üÕ7•ةÌìý 5ï›Ée›…áð¼1¡1îCÆs%‚­Rg¸7„C‰Iü¸O“ö EcÒ¯†Éº5ÓTœÓ]DðŸ‰Â1yS»Vï?Ñ,ï³½~Ö}kýUmTõ“S™¼Uû¤RÑ ü47´žÚ²D-&ö£3â4™€e×´sƒY\;iü´AœœÉ²x4ÙrF#J„µQ$åÿ¡g1d«¦®è%uZß-^Ûå³ÍÌÖŠ‰a˜ùk–…“~p#ˆév7˜TBüþ(#ƒ Åܨ1º åˆMG µ(Ÿ7E ²½0(ÑhK…ÊêÍ$»kÞ¥(øÊ¢œH¾YV(Áúæ×Ðh(BÝÆ3»G‘"­¥ë?Œ›£2ˆ™%³°˜û´÷¶x÷UOΉ-nU§c3–„û2嵘}2 u"xØâ™=œ®:½±åø"d¬N¿Ït³ª<¬÷pG=^é£Ö=’‰ö~´¦¹Ìæv§JøÚ ÐF°NM´Qv’¥AÃ*ê1Y/†¹Ãý‹ˆ^QÖ’](è#u¹>HÿŠOÈjoWˆò´¥-ÍÑ?µ›ÐUDn"ˆ‹-×´RŽ€õ’i/î3‰ ‚‹ø=ó·`0$˜\AÙFÙ÷mƒÙ ²‰õŒgwhÕÇ!àuŽHm"xò¢ÜÖô|õ5¯¤f*r"t®üh»O¦£Œo*#aûÕ…AyFÆN©Û,°ë€È¿òDݧbL¹ÚZzÔhÇ1 E÷ZÆ”1¬Ï=¥Ô\Æ`FK”Ý×a‹{pmG+•™„+pñzn(ùKg#pÁ¨ž $L-0! fÚ²ý¶d¡t•Ñy6X£À¤¨ÆÐR¢~™T“W¦¬“ÈyÙj­!L´õXXR¨†‹\9U»Íáuª@—«,?>“§ËdKtTúÖv(sïÁó„É=méÆ4q-¾ŠÛÖá8..÷†‰ L8)p\®ÇÁø7N_Á3¤ÖàX6L†ÁûئèÓžéÇù 8õ ¿ƒw”8¹@Êvx"ºR*{ã‘Yj†ƒyÞbn.Gs¢Pm[OpÌßßaäÞ¢U^)Å{ ¤Ãaß´ŽUw…ÏûÄà:3héòÜxH„ý-œñÀ×ÐÚYÝxjålÓÖŒoþC'È›mê‹f| »7xÑÕÓÜäfBõÉê̘twÙЦ&,„lE"˜c‰ii­Ê£|ÀöJÃöÎüžDàÏCeZX»Á œ‚»ö‚è)w«›³ûuøÚqó ³ÿ´ôVHƒæj}G·ÖÂ<ŸÌ᥻Ûßë õ•µö›löT—0לªù“RÉÊx%`â—ù€¾ã–XÒµ¹}VŠˆgìø©èÀAÛj¾À4p8óÏ+Ë0x4øÎÀxLÔÒ_)€,Á=ÿÜÍø|Ðpæø 1qàƒ¶"B¼CƒÂy 5WH:07¯-pâSò¤H`Fãøœ8ž™^qs;UÖEs4ýÈ^í¾Ä½Ÿžþ”Ì…Ð endstream endobj 1835 0 obj 5585 endobj 1839 0 obj [34 /XYZ 38.2500000 729.500000 0] endobj 1840 0 obj [34 /XYZ 38.2500000 729.500000 0] endobj 1841 0 obj [34 /XYZ 38.2500000 128 0] endobj 1842 0 obj [34 /XYZ 38.2500000 128 0] endobj 1838 0 obj << /Type /Page /Parent 2 0 R /Contents 1843 0 R /Resources 1845 0 R /Annots 1846 0 R /MediaBox [0 0 595 842] >> endobj 1845 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 1846 0 obj [ ] endobj 1843 0 obj << /Length 1844 0 R /Filter /FlateDecode >> stream xœí]K¯Ü¶Þß_1다$J@QÀ¾¶ tQÀ°.Š. §i4AÝ,ú÷;s%ÍõHó‰ßRœÅH®cYyxÞÏ7üü÷Ý?Û½yþüŸÝ×þçóç§bï«¢ûgwüõÃ÷`›}ÿûoªÝ×_ž¾í¾=}zútøï·§î…ÏÏ>üî;»ûÓáߟwýÛáìÿÒñ/üòä?üü÷ËÏÖ›ÃïŠÓÏãŸÿëé/¿Ûýz\qø\¿™óÿÿÁ¹Â”Ç]Ì|ùÛÓpJóòë·¯¿>½éÎô‘º.l³3¥+w¦-íî¿ÿxúé°ü°x±oKc|]úâŠÏx;|ǶŮò“¯¼üÒXÛè/ݔі>îZÆÕFZZï>må:À´•:dNkëÝ•>ÖÒ/»VGŸpi½ûtmí>Okë½lã¡Êq×qî.­wŸUSD»ÏÓÚú@¯}4~û²ë8÷ —ֻϦ(¢ÉÏÓÚú@oª:ÚÒÇ]Ç‘Ÿpi½ûlO:Ëá_mдÑ"8~¬ }Ùµ6<úÅk«]©7u/æl©N£¯‹ë_iiªhØrܵ6<º+ÖÖ»Ò²Žfµ¼®­öÊÆ’¢Ý®£p]¼´Þ}V~GÕÔØ½ê>–¬óÞÆâºÝ®µáÑß(^[ïJ›j £¦QÎëâÚK7Eë¾ìZý•NÖþ°ÞG÷'ÀßõMxñÝ—§7Mip¬w_~:ìíå“Ý/€T»êº8ìý˻߅mÿ°ûòóS»?Õû'Å;ôÄ4ðüÄÂÕJôDØ›O>À'ÏÄ<|BÃM€(Þ·ò-zRpµîú#ñ„8©ÁwŠ! ïïÍÀ;­0¬!^cX»{?|9°„ëȹ´\GZ6LJ݇“ùºzÙΘ’š}ÓçOzº¼ô¤£¤jïlc¾c;8•ûÒu1…×wjÍï”~ç>©^ž¸}uP¬üÙwJôNY÷ï“wº“6 >l0ˆñf  àïôè{áèø‰3‹è bK%xƒÂj¸„@Lð¯æF Ö½Áþà HÐ'œ1!A0b …~â|RÆf¼î`™Z¸cŒžÀ˜1×1ô&È%ÈžuÅ”ne=Â,7ƒŒ™>?&rBXš÷á¢Êvç1vxtÒÀóPjƒêº;À²C~G@qk,n¢(&ÜÐY]¶#ff ;0P ÙØì ®«¥“j8·Üð1› ˆæ2Õ9L„L5Å„ ª2R3QX—q ÞT!'Æh(@„ï|ê¡ Ò®§%U´k‚ä°>RÚp¡2…9£º¨f7h–ÖÓ¿ß6çR3™~‡¡* ‚¸DÁÒSMÞ,<¢ìC7šË”fd_Qñ×DHËÔ„ëfl11(å¬5¢>y™e舉ÆyËZ<}¶5ŠmNQ[Ø~Dh€B´ëÐm%âp#¢5 ®²N¼ë6ò(a+ ÏSÂó8¸7½³héŠ!à0x1ºàËÂnð•Àž'B?Œ°°' F¾œ;1ßÁÅ·- æ¨lË|Pr$á²àS±0‡Å0€«1ý20Üð,#pK&ÜÿCU.8xÛŒ\HõD+G=o¯Ð4•k¸ñwJ6œðéšá€ ½e˜OèfÓÔyô7ݰ fú­³#‘Ðp'çD>©Ždè­ë8Üz›r™…ëŸG£±ÏzI½¿‰qº­U ^nª{•ÉÏ8ÓÚÐDeã s€ÌH æ×Í@¯txÆÐ®O_ôPë¶µ€ÈçÞCã…èsC5UHCT¥¡{©‹È¯ê˜é©ÉdœOŽžÌ +htÕ¦TÍ¢×Ws6´tιķ´;—‰Ê=º务¦Où|FãY¾éL8åN±šI-r¿_Ìþß.6cW .à%°,aNKmNuw‰²6ptÎVð ÃçÁù6wö¤€ÅO„ø-“ cå8"ÎÄþ‰!¹‰ó”’sòµTäœ,¨Ÿ1ÛØÈ9rfÒX'«$a5§$ÆÕhÇÂìªT,mc5«É ¯£»ø}qªUÏ/Q„ñ¤j¸HùÍÖŸÇ¡›n—(Í ±&jž¬qÌ8eö¦2~/ É`A0ˆ –C.Àdá®9©Þµöœ .QÀõþ·wVUCNÁø©ªz¤-0=UÝ)¾Tåèh«vñoÐ6íX_kÑ6û–D…ƒ¥=µÇ„sÕ,†3NñÄÍw‰46•Ag[]\SØyoF˜w¨îhæ›N'ˆ+%šñÅÎV¸EIJpóÝV§ RõW˜ã¥šR~Ó¤pent@ýP^Üú5EÓ.%à5IÛ3Ò%f“0¢îÆúÅ®´ü:ÄG1•YlixA½ÏãV†÷ØŠïZ·?(ËpІ¸É'ÙÅX1ŽUª^>`˜™IN¹pó¯ Œˆú¶¬Îq_ÀðåS ¨¾ìŒ/ÃÉ‘ºYÆ[‘)'ìU™©BEËUIJQ`š»ëöÂϯ$J¸\dš!缺›ä²HàÅÕ½S É +*Ó¶t5®`Ø3‰Uâ:÷8H3Qä ¬[ʨk½3a)•éVïÍ€+ã[g¨”ÈŒa¬PÖ“Æ3ª~žYüŽêܬFòaå¸x?™`ÈP+×°Œ×WònË?©–§1ãû+O³vo€nwÊ~[3‘•ÇìzõF¡©ÌøæD©-<ÙZ‹g °GbÚ­rø>ö+ËãìÔŒhÕDÆî`bªÂ­cfÌtÂMuɉ4;A·dŒf Ó_eäÙ,Xq «šOžM7Œ˜²«5çÂkk³q¹X¶q©ÛlPõåD*;Sz»~Qîe´ÑUÁ¦iæÖTõY*~߀Îr×5^ •å&-Áû7°à­ûÕŠå{Ãïè" “ "|Gc„ø–õ(íZ7¬ Y WÕ)k?’_[›„UT]HÆÅèð‡µº×§ãcbâ*a[Õ:CåªëDaèõcí,ùÈÅx=gƒÕ{(} X·EΊò¢­Ús@é&R…$®n@éŽê2ú #³’¯jÖ&O@X„iõ¡ÑxI9ÚÏ8tT¹6Õn?U¢eÜZ‹0I þ¯ð²®èîȶ8YÛpΠêã4Žø°?¬[(—Êpš¤‡a9 ÍK•H$c 3^4ÁŠ 8;“û“,KPµTGPu½¸ŽÉw%Z^Â…®f”¿Û$¦;®ªÎêÈ0w'ÈBÕI;g¨îÔæüb·‚yÅô>T£™*œÊa›( ž•„OL·ÙìWà6D¸Z· °²ˆ3âæ´õ¸³DÛ‘-¹U:˜Nwª€¢ø‰çHˆ¦õÊmâJ$yèqepÂlĶFw¸½R7„0±{ÕÕ  dÀô _“€÷µ–ƒ N@ƒFLJ§y†ïW‚Ó6prFªôü‡¡³þìs“»Æ«áI/˜h‰$攄޶³ÛÑͶÆ×HeNCë cîÖG—dÓ¯ül†ªUÎÔùÔ¬“o7ñ‘#Æâ#k¦ê‹ªžÝŽ^ˆ– òY¬¥áï0ÓÉnR¤d·þÔE !»mËy³"M}¸7å jèúá…jÒ‰»™ø‚Ò%p´M£zuêQ­JæGLÒId@U³c#W%Qûkº¡a÷•ÿÕÈ=tcWË›2 ”νL\lLÉ X+nCe§Å{Ûò\„©4/g<ßL'äljDMÏ$1á,¦mý « /ô¢› ­"×mfš¨ª”éN2EL¹´ +øzä!Þö=/™üÄèõžtÂBP°>Š‰É ž\ìCÄOàjûñÞ ÛCpá('ôU «Í…á’ ŸÝÂ1Á[. SŒ£¸ÃvJ(×)¦mì³Vå!](~Àì13ÑøƒŸ½ „“BÒ´øà2‘Äœ%†0í¯JÇPª«ωBP¨tw@\}*DÊ |™ˆÐ3+Zß\A2Š\a™ž=Â-½µ?÷cqÃ:Ñ ,:Ñ}'Žb|ž¤ ŠÛÖÏ¢¿@èééÎ\•Ò±Ù?’ýƒß;(j´:„šGy˜0¼Jà;ª <ë[,9Û€º}…©¬Õì9çªÙ®oÏ1mÇÒÃ{cPy}5|}»‘iÑ™Šm$´\]UÎng³\s ™T}hu‘|³ª% ѵª©i «ëo›Î3oïf‰)½òÖOv/K~S+ CK’Ô÷bMÑœCóLœ1«XÇlQúó¬?Ë‹ê†N¤SSݯ‰äìÖª-L¦-^™´ÍIN1c„J Ž2Ò&òµÄ33ÃÒìùQG1ÅQ5â Û ¥ ¶5LJ;Óß{­æ­¦(§fu2™ò|YÏ•¬:d›*»IzÍ·±gÌéΜ Ë­¤@Kä“ VkMIUwŽ+yS5RdF O™=#çjOVöx½÷œsœõ³U…9ß¹®7&Ì‹}´D^‹PKÃty"2D˜É}%Ž˜@_ýê3‚}uj’“ÁPF•ÆÌ'ËÔp|=^ ° p¨êt‚ÉC \„„.Zã c®RuÔÙjí>n\ŽÖôL]qô+fÁFíÓÛÎKD ‘³¨FØ«½CŽh¼ÞßpLÙÓ¸sà&(>ß§@Ÿ˜*˜´<ÄØ)ýW Ú(˜ÉÁ DI„‡¦5çwu‰°ˆ¹¯†™Ë‡…-Öo•FLuÀS„¦cx×xs-ÙR _kÛ8€'1:¢ËWÎO”É·E%F/(§ªàÌ5o¼ô„Å‚YÚsHBfåiù£©|3Á½Ã¯Ý·„Å ø4÷¨pÍEܸ}aŽŽ’¢€}8ù’BÖíÛ_Pâ:â´{Ûù¿{ÒÝC=}Ò; ì¾;j¬êÖ{ô7¸´·ýIQù/¶ŠË×-p³ƒsrÀ±³Û{Žaðjðžû˜ £ûW´eîøûâµÀî_4F|ѽ¯ûbõ* öO`ßÝ”öæ ¹ÁÕ„£'…Ç÷ÔÀEðòÌ–ð‰›ë±Ò;󿟣'$íq{>ǽwŸžþ>=) endstream endobj 1844 0 obj 5023 endobj 1848 0 obj [35 /XYZ 38.2500000 473 0] endobj 1849 0 obj [35 /XYZ 37.5000000 456.500000 0] endobj 1850 0 obj [35 /XYZ 37.5000000 456.500000 0] endobj 1851 0 obj [35 /XYZ 38.2500000 473 0] endobj 1852 0 obj << /Type /Annot /Subtype /Link /Rect [194.250000 667.250000 245.250000 674 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 1853 0 obj << /Type /Annot /Subtype /Link /Rect [66.7500000 164 107.250000 170.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 1854 0 obj << /Type /Annot /Subtype /Link /Rect [213 164 306.750000 170.750000 ] /Border [0 0 0] /Dest /#8d#21#08_#eclM#0a#f2#2b#dd#13#ab#21#a7N!#19#9e#0e >> endobj 1847 0 obj << /Type /Page /Parent 2 0 R /Contents 1855 0 R /Resources 1857 0 R /Annots 1858 0 R /MediaBox [0 0 595 842] >> endobj 1857 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1858 0 obj [ 1852 0 R 1853 0 R 1854 0 R ] endobj 1855 0 obj << /Length 1856 0 R /Filter /FlateDecode >> stream xœí][¯ÜH~Ÿ_1ÏH;ë¾ø&!¤ÍI‚ÄR”H< Ð. ZmVøûxÆöœñåk»¿SݾŒ‰ áø¸]]U]U]×ïÿøùïçþ÷üýËçŸlþ~ù|J.yšÔÿ9_ÿ|÷ø]\šŸó"=ÿøõôíüíôéô©úßo§ú…Ï/®þõ¿³>ÿ©úï/ç¿þ­úáOÍ/]áë)Wyõ÷¯·¿Ë\UÿJî_þ¯Ó_~wþíºbû¹˜îÿÿΘ²†bâËßNí.ÕíÏüíô}½¯dy™'ge=«Òêóþqú¹Z¾]<¹”V©<³×_¢?“ëê;EZœ•.«uŠbð™Û‘Å¥—.›Zº†ZÊdʹ¶I‹j™5ƈãýuqñ¥µ-C-}ƒZ5IkË‘Ô$ºFMž‰ãæ¾¶<ÚMŒYnP ££!(\ZŽžV·¬žË£æuqñ¥Ó2ØÒ7¨¥ñÑP¯-GÒ, wDïkË£=×ÁŽè ê0G.-GÏj¡1Õ¥Qóº¸ôÒ¥2I(‚Þ –ÆGCQ¼¶IK­Zé•Mê·âýuqñ¥MФ5ÔÒø¨IêX[ޤÖ6’1ÍÅqs_[í¶ u1ª¡FGCP¸´=«‹]¸#úº¸øÒ… &ÐoP:¢ƒµ?y¬á¨¼$ß/¾ûrúþ£²ª‚*;ù¹‚íöÉú¯/BÒówY^öüå§óï+€Ê?œ¿ür*/™N[ë'ª@O ß±è‰Éà“þ«i5³šÊáj;x5âI’ú?q|ãR!Áï@ì8öóŽàªÚ?ü†¿wš¼À'ðj˜ãñNô©÷óáK%` ‡¢½Ý4y‰IÅF,$6Ç9 µž IŽ_>»@ãLYZQqVvÍÄ1@§žD´(&é³Ñ, C’O6«1beÈF–½~ZÓÀw°ÕIì[·úTpÀFXë°ÞƸ>î Tþ½;„õ„«ØÁ•ðœ:m4ÓC'ù4z×lzDJ>žOžÌôØ\Rù´°ÓÙ*.„î@’.T+¶šýþ°…#k<“Ý–]DEޱ‡åUØÙl°OË6 ëè"™Í:;Mä“I½c6<)ÏôŽcó±þ†Ä ¯ì}”$uCØ#FÔ Ž]ÍC¥òP§ÖtQik¸•½hÕËîÁ¹OD²šp*SDZïƒ?5Ó¨!Ó\i%½¾õT8=¥yùøƒ_OŸƒõU@üxaLp”&iÑ;Ln’ãpÉcÂù${Må‹—¯`LÚ"û‡qwì´Á¶ÑM„q=ÕÜÉ1Š©Myé!Þ¸&|½8ºaáYxÞÁ8ˆè¡6iÛ„è‰ÄÓ&Ùeyì!ž\ÜûDâ‰h>ƒW‹!Ý.a›Ü3™~€f'Q¾3¼®ãq|s…Ë7Á¥Zƒ÷u5&£Ÿ¨4¤jDËú ÎøÂ%qA‘uì0DfÊQYßð‰ð²ï <ˆØÙqt\‰^©ÉÔÅ9¨ÁðÁ)Âå¸LÍÖ‚~ð´úqWóɯ`÷ –gáÂK¬€˜’c,Šp‘0va° ×½1y†*Ìé^¾E@X["°³“2bCSÛ½óc½¹6k;ŠÞÏ# ðxÂ?Ù[õ™Ã…%>sx§ûì©í‡ë£jV`3’Æon²;UË›« *B},_)œ‘Ž f0˜Â)HÌ£ ‡8ÎÏQ¾«fó“*çzUkÀYw¡xªÊiÊ­¹ZkJ&FA¢ÙxµýTÉ[$¦¯Ä2>"ó-Ô#eænתyÌ5¾@Ñœ’pªúRíø†¹ë¢qÐXé 8^E 2 ‰œò£ßå'm}tzÃQ{®4^Gñùw­ k>¤©îèèYÁø§fzÄ}–ôŒŽ£æöZ`V¦í2ŒéçK‰4ÔÖ‘iN<9Bšë~‚=gš‘{ éÝ_@ÑᕘòÇÆÞyÒÜ8„·’$ ƒÇ;+V9L70+cØDq áNa6@ÀÑl&4i2ð!¼á½¼ð.œžÚ<-»ÔóÔ¶1¼Õ뎡Ñ;“·š1ß L–V)ü~'ƒOð;¶&01v=,áj Ä(Ä5† áɱû[ðb3U¤]6rät?q(À£ÊàŽ$¢Ç$Ñ—Ê × pÏxqñ™\r¦ðN”`ÅÎÎMaÄ-{âÆq²0ïc^é$:kïi;7Ev”gºì²˜£("VfÕJsáÜàºoŽQ°ÁN•yªVÇ ›K°ƒ†mÞðS±œÀ¤=>Æ“™iÇŽ`;ÑS*ÍŒ5Ö}¾My¨9U¿Ê€«—7”žReÒ¢¼ësÍ#&bR¥ô²I,¢X­]V<­ÜQ?ÿ†+;3‰urhð„Ï<¿›z ©Hj+‘Îàq`=ê±)C•‘±Tò¡gƒ8©ÂÞ=t–uÛQ±/™~;¬×3*¤Üž.´6Ég3ÕÁ À/iG$è'‹Þ'eÇÌïCU`óÍ#²¸®Ü¦MËäÇ6çÎïža³Y³ŸD¢“•ÃiNÜA)«€:zd3±+æ*èc$º”yÄñ²‹`ëT,Þ^œ¯u»càUèúÎ*¶½nÕé(Ó‹ í^ï4Glì½c^ZÒå½ìV˜ Wkü›W1Sš±Z‘1š,”¬%Èë;Á†¿£á¼S ›c?ˆïÀý`¨1MXiìšrùÅ ÎKŒ†Šçø¾@3—Ùl0‚÷ͶT¾‚~¦w÷²v—ïÁˆŠ†'²³B}cxÕ‰"'io#H¨±š‘:Í ëk¢£ýòÎ^êÜ3®}fj3ŸXâç¦uHÌ6fçÃæ‘#šÉ*b†ý‘ׯÏ]Y–=E'QŽ„¯ÌdŸœF÷n˜ìf*}qþT”ÁÑ’M’¥ìÑ&FT¾X#Ã<Òÿ<"£bš1½E3Sg_ =2Ö|™ŽÔá´ÔÓØ¶{|æÑŒçîàûI\6Y£^÷æ{%ÙaŒ? —ñéw‡™“Éÿß‘ÕA0[_Öeº¼ÛxÓæ!5`3ììᡳN¶ç­„ó6²ÿ%pORUt³l%­£8÷‚ Îák_Óº—ʃiÞ¹Z”=Õ¸×âFø¿¡0“©íuÜ q±wk™Û.­¼Ú¤Eë¶JÉ;ú°BBM0Â¥ýÑfK”ÕQØŽ+óÀc pÙ îO‡;'àïÝVf†‹­êˆ¬üÚ œ˜A&,CˆaŽˆX"ab1m —gÁšÛµ®¹.1f¦oÎòZF¸i;#ãqï |hE{1s)Œ¿ÃˆŒk,ð± –ý¡>0(±N`4Ú Ž(ìŠbœ5Û!±æ]‚Ëu4ÁåÂÎ!¸„ƒ›¥ÊZG€£›OÓ /½$ý:ºƒ¸öFéöQÿ,o£å™Gœ€ú°DŸáسG¨ ;ƒ»‰E«v’BAEÙpÔo! “²¼¾ÜKŸ¨ážã|P¥¤=²“£)BÚWÈ+vË™àÓ&Ò<ï¡C4ÉTØLMx”¨Ã\l‚°…$Z:cÅzdºÜÚô8wo!©ÅB¡Ê.rm;&tž ®ï ÝfvÎQfµíÌÎð7þ²õSâ¼Pá.³Dg_Ÿ1J²I˜L e¤zÿµÞÊPݦø<2Ýú# ÎtOØ›9pßBe9,b¢J*m݉ŒžóÀŸh—Ä%kAlÖ=2éŸ G0Õu²}˜µó‘Â\)e;¹®Æ½vt™iMEiÑÞýÁpd¤z"ÌwTˆ%Lrô5À[—­4eÚ ÌŸ*ÂtüÆ3þóEûôT®LØEôü3í€(¥6øJ)"*ÛM`½˜bŒb¨@˜Lߦ- Å;²s$˜; ­ó{|,‰ŽW×Uê´çÃsœu]k¯ëÒåÝ\[¿ŸÍ+´´» ÚQ×åfe“Å#sžÅ#G6ý#{Å#ÆæÓÂŽ@¯£D3|00[bq …ÅŒË'QÃ@íЧØÌƒP7; =ÚñÊH6ÙPaÈF`·A—舃¡z)‰î¶é½ŽäŽq8ÒˆpÚª+‘ü¨Âyž²å8£ ¿Ãǃæle=9†I5pbˆÌæEE„ÏÄWÁòSUb…ôDÛ? §‘>2ىŠWÛI­ÏÀ OÔÕ Òá¨ü=ÁíÈq²2qñÆEÈdû[ÏüGM(’"38."77LCwºhl˜âC8ÿ¨±ž–ì¸+rØ=ߡғD£¶O(®#ämrŠ#Œ¸ì:0aÛZ¦µ¹XTÝ]hcµž¦nø#ß(Ó~‡š†„Ó,ˆ XàÞßÌAJmãäœwjÚ:GŸ1ø^œ÷Q,Úÿ·á0mpÁ4/ÍxâS|Æ l@Äò¤uòËcÚ¦ÒÜ‹yüZ—Ú¢§,ÏŽÇTM („qÉ*&ŠPmÖ¬–Ì—Ö"ب)Àó‡…0Â#ty >ËÛ'Ú“@×”©ZmŒê`_¥][<Ã,ï0 YÞo¿xñž¶¸f[ДˆºøüAÕŠ°r¤Žö àë.±£6±é3‘²¯´¨D„8!nâC #ÅÑ"Ö7Øê¯f·ëÏ‹òKŒÇ™š8›&xãsfµM'¹ûA-Z5£p2ãâœÈd•3ÙÞø;)N]œwRbþ ®p¤â2)¿øÔGš²âà †€áKË4Î@ã25wXïùÍ8¯e’_ðå˜éÆ|;ph©v¢²ù³²…è²×:LJ³ßÃæÑvbà¢Z* Ì'x"Ú#l5 õv ˆÒ&+d°Áô`¬~ØÉÃu8©dû\CÝï£~ˆ.LÇ Ç©Í8ZGk!<<•ÉÊdçb)ÀÈiÙÌõ}6Mö¢zs5ó É9ô†Í£'*d³ÈÙXAÃ}å8ÔK‘úL…!>ÌØŽLvST ØYa>¸#Öä“ \Þ+š£,s(™4c¼šÈ,¥©Áðn7[N³&Ñïa3c'Q0‡#‚ÆËûtŸÏâ”ØÑçaé`S›Í²)ÖÌõFBÎP‰€8ë[ôl;ä΀ÿ"M#I Û‚#-™Ü¶§iNÊŒÉ Ü›–ºè ,–.‘ªgÖkß]!©®²ÌLæËÔËÏŸ`päsð«}µJU$à&1Q8r9HàîW… ¤y­ª({ÚUB.­Ð(õ€Ë J¢¼á–Ïx-óh æQàòÅäډIrÆFfz¢}K$; Ëðܔa©ÔaYvð¡=LK¢SÖ×F BJÂcÀ˜ºà´ª]lYb§O7¡2¨¯\Hek»¤Ê¢E­p›ggæ²C?ÙgѺœy$Mο̊TÔ‹ DÝKn+q ÉðaîRŠD¥ÕçF4UÓ&h¶dVò@O‹æL:ÐÁ¤È0W.‰œ‚§É¢CŒ¡”uPïK;rÙ<•&] ý¾k«žÀÀ6HÍa|ÝвÂv‚Ñê56üæ÷îYAê;Š’Lu7ñäŽ"¥‹Q˳2sº$n>Vÿâé¼²wsÙöØ2Ãy=nÓ¢’Ú_á„÷jû†­Fë‹ûFÙþˆ"ÕAQý“Y¸U^z«‡Üåû)¬_®Ü™½&ˆäŠ×+ZÓËíý¯'­Ôã~=}v‡0çè B—Ö%þT-1sŸb 2b±’hÅ+u[ÇØa.aóÇnQ×i‚”ÑÊ€=Ò.¶äèWE[ýØRwERÓ$ΫJuo¸„'vȶ'¢Þ£•ˆ¿údVŠÄºˆLªt”ÓæÈõœȗܚ¥Í‘+3ÍÙ–JT¶áHdzDSÖÇÝ[¥à=b…ã )õ¼×s¿ûXa¬JÄ,mËtñÝ–9Í6±LEãà‰Ö“uM¶§ ìðÏŠ.ß<·¿_›´wŒ˜¿DÛÂÕ†ˆª9›cpG^ØÛÖÁ1¸ígäc‹QŽ ùÉTw?¹×ÈÓdØ=p9¦NN¬NÍd£G_Î¥ûÈïÅc%Âo çŽlsh*ÍT]‰L]$jF×Øç–°B¨ WyÙ3N˜À½GbX´ù‘L/"×h8Š cO{ö —a³j…óšã Qʕَ9÷C‡ööDxˆÄõª91Ò%…A¨£…0lx?ødáw0Mam1b*²|‹¢ŒL;ÆroÊÈ@[¸SÇ;6ƒq€çÏav¦Àe”8—ã(ÒðjÅ‚ÅS/›4¤¨IU÷®5ÎÔ“(€æ½‹ŠâÇ %ñ<2ïGCb ¤Ðb~êiF*îŽ{Fa¦X¿í2F<æ1’Õ‰as°†MIZë µñ`àÆŒˆÁäER¬B¬»óRŠÌtQ31‘˜L¸“FTZßßK¥ß5ä²ýÝ—r3ß^þùT¨`±è…wS°²ÎÓ#ë¿.ª=©*ÛÇiwÌô,2Õ~É›kfÓžE¸§•¨ƒì±ßhõçü­B„OŸ¦~a"‹ÑÌíJ‰$êÚéäÜŸ02v–ê’ ¹hú¢o"p(вáó¾y§é´ò  dÜ÷è;fÊÙ0ÛÇf§¨Ù Öt¶–p}@6Ü`ÃNøžõÙÈ6^ ¾Óœåµõ‡r$–á®ÿ® n !Ç„ÆÌ Ý”5Ž0!ÆP£ °0ÀÎÖvÀfàqƒ«9(ÞgOŠ<ŽéTÀEðò HxÇÅÛ¹2OŠ‹ªQÜaOx´›ÚÚF‚OIïó§Óÿöá• endstream endobj 1856 0 obj 6223 endobj 1860 0 obj [36 /XYZ 37.5000000 728.750000 0] endobj 1861 0 obj [36 /XYZ 37.5000000 728.750000 0] endobj 1862 0 obj << /Type /Annot /Subtype /Link /Rect [127.500000 322.250000 448.500000 336.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.pcre.org/) >> >> endobj 1859 0 obj << /Type /Page /Parent 2 0 R /Contents 1863 0 R /Resources 1865 0 R /Annots 1866 0 R /MediaBox [0 0 595 842] >> endobj 1865 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 1866 0 obj [ 1862 0 R ] endobj 1863 0 obj << /Length 1864 0 R /Filter /FlateDecode >> stream xœí]M¯ì¸qÝß_Ñë¾#Š%A€÷1À ƒ Ë`ÆN`ø{῟n‰’HЇKEJÝWypFzM–NYŪbñ»ÿüé¿oÿóÏÛw_~ú¿Û/ú¿_~z+Þ›ºþïöøó;³¡lßõó­iëÛ/ßÞ~»ýööãÛ÷ÿÿÛÛðƒŸ¾üáþô¯[yûýý½ýñO÷Æ_õ?züƒoohîÿý[ÿß®÷§búï£ýßþëßnô8§‰±ÿþ;YuµzP±2òooãWŠþÏ?ùûÛwÃ÷G ¢ºN”7QÉê&ºª¼ýãÏo¹w?v^¼w•ªšbÇ0Mù§jo¢ìŠ[Ý,Féÿpô-˜»nîmUš®5ÕÌp©D¨k.~6Ž—Dü4úæçg)ËT]÷T§àg k>~ʲJÆÏ©o~Ðe[$ëúAu~®ùøYÕe2~N}óƒ^É–òžê4ü„]ß&:U4mŸÍËâ&¥ÔcÝÍŠþïÕÝ~P[džÆü§s~ú°8þb!š²®ºû˜ðÙ&c6Šd;Ðq˜;Œîkèé°~ë²kØÅ`FC2t^|3ÖQ²ÈX°uׄñíõ-«aU”í¢a&£~Àewµ“‰åMÖ…CO]ø‡Çí²Jý &søi´Ç?,¾ ±¸ôd,ºŸûêköþÍi˜©Û ´×]Mè.¼d¡åÈìÖÄ¥ØÓð D ¢„ÆâÐ4\ÿĆûoVû:4=ˆ{€ª[¥ÒOæ’W/l\ÆïEHHŒ”˜˜ãö »›' ÌÂoCC,4= nr­Ìµ˜É³ÚËq½ŸfBÅL†¿«ýzL5=ªñ¯Ë¸]+”þ!5Z&Ó ½^KŒÕÈ!­ÕbQ2ɘ™Íµt›hYí¥³ê†Ú%È׃rë…ËìÝ„§'ÃÓ0ê˜Ýò´!‹_Ó¨ƒ¶KŒÃ[Õ­e’±`ñîõÜÄkhxt«*G¶T]¸”(N„”ÈH‰‰D?¾§ÁQ5»EɉÍg8K÷¥BÈaÈ7«a(“Œowí(kaã54”£‚Ÿ¼9?Þ‰ÐÜÑ C}ï¸} ‹O¢üÙxütxiöh*(‹®‰Ó\Vjg¼¬önT«ãÓL¨é\ñvµß†j+‡žy9¶‰ÁíÚŠi9]&-“ŠiÐÞ˜JŒÕÈ!mCÅ¢d’13›ËB0ѲÚ;GÁê†Ú%È׃ Õ —Ù» OO†§a´avËÓ„,~M£ÖTb„¾Ø6Ô:P& ï¶L¼††ÎѳCC]¸”(N„”ÈH‰‰D?¾§Á±av‹’›'Îp–Q• !‡!¶ µ”IÆ‚·»-¯¡¡5ëøäEÈù1Ÿ ÕËPß»…„Anwl˜ÝåGÈæÀã§ÃK³GÛP±@YtMœæ² ZÃMfµ«Q­ŽO3¡†;ÌßÕnª*„MϽÁkÚ+fxHŒ–EÅ4hoL%ÆjäÐ`CÅ¢d‘13›ËBh­àÑ®«j— _Wûm¨A¸ŒÞ-xdø´ ³_ž6 dóku°¦#äðŲ¡Ö²ÈX°x·½`â54(GÏ uáR¢8R š ‰Çø¾Û†Ù/J^Lž8ÃYFU*„†X6Ô:P Þî¶L¼†5jÖñÉ‹óc6j¡Gï63vÛ†Ù/Q^„ 8~B¼4{*(›®‰ÓLVAU”À*Z­NO3¡åL¿«ý6”hz„í1™ˆÁíÚœË<'~´L*¦A{c*1V#‡´ ‹’IÆÌl& ÁBËj—¶‚j— _W 6T/\fïÂÚ×ކњÙ-O[²ø5:XS‰røbÛPë@™d,X¼×^°ð¤­guC]¸”(N„”ÈH‰°¶à…·Á1jv‹’›'Îp–Q• !‡!¶ µ”IÆ‚·{- ¯¡AjÍ:=yr~ÌgCõ2Ô÷.lw‰2«Ý1jvK”!›CŸ/ÍmCÅeÑ5qšË*ÝŒ—Ù^Nju|š íf‚ü]í·¡ÜÚ ¤ÚµãÉjãGˤb´7¦c5rHÛP±(™dÌÌæ²L´ÌöÒU°å¬“-‚|]1ØPnŠmåfûFf·Õ2ùíî¶G-*/Yµ¨mb< ö9ëï‰AˆqímªÄŒL©u”¬g.s™&>f{çjÖnVÆ Dņ,l©2àya>9GãØiPš_5•(‡=– åÊxÁÛÝ‚‰PßÐ¹šµ›•±›âÃDÍT6AñÍ'ÿÑ86òB3òÄ?œeM¥Êá‹e<ù€²^0u·1`"Ô7t“Ÿ¼˜8?f3—,áy ¢‘˜Éð4øÏı‰’¨‘Cþá,3*lšKƒÕ´”MÉÄb&•_ åêz'„ã6Ì„*[é { $iÔŸ0;—N%*Oƒ3³þž ­ž w´ÞRbGÇa†6‰ÖqÊÇI&M? b7xÕ¦Ó^Otu6¡»m!S€ÌÞåXgÊ|rÂbl2Dhà;Ü`±câgmýø *À¿½*~ÀD?y¥Ý^AŠ“Ù”0Å¥ï]ŽE¤Ì'ŒM\L4üãXv&~ìmCÇPÆíÕß&úÉÖ‚nƒÉøc> Ç”“¾wéÔ‹ò4ø£\lRã ¤yâÇ2y²9¡mšuh„ò±‘KKKéji£ô 5톙Péhm¹ôIÅÛ4µ8»7ø‡ÇíÚª¨gK˜Ìá§Ñzㆇ Ú˜‰ÅEJC¹·”®â6±ô§Õ^Otu6¡»M›Ú‰‘Y¸ô{FÓb·è¡±84 79ì`ø±·mšuh¤ °q·6—rÒæf-úÊ/MƒR•£6g@HHŒ”ÔNPÇ×àX»¥ÆÃæ‚3ŽeòðáÝ6mÖ¡‘2À¿Ýj¼GH?9†ŽÓ`#4þ˜ÏЩÇÈ— 10nw ÝÂã@cóDà9¡±Y -œXh¤ôq“K‘× l£&{G-4ª?pcµï5{ZëjÝ(βÁ‰uµü±.Z[{í­¡ÄŒÒ¶Ð:JæÀ3—¹T¼‰Ù®\ëGÍ*ÖÂáCH¶T™ƒ´SÇxrc]\‚´¨¶ö:G‰rØc[F> Ì¼Ý­þM„úåÚBjÖ»N‡“Ù¸hÝXW;…pŒ'ëâ’!?4­ëBd$Êá‹m'ù€2^0u·ú7êÔdO^LœóH­ëjÝβĺ¸DÉTëÆºé`Ó\ÒVÓ:P%‹¹T~ëFoZ7ÖÕ‚XWëFs<µ›¢ $Õ9¶Ç½Á;| }°MkHÐ…É~­7‘Øaq¸0ØB±¸ÔSáP‹¡\ ¿u:-yµnÈ«uÃ;ûñ’…–#£[ —ÇÀ¾m‹ì46‡¦á«ˆ ?ö–õ³MíVe“¡A¿OQžD¾Z7òÕNQ„”„¦Ä‚à1¢¯Á¶>öK †ÃgËâúeï¬CS»Õ?ÙÄeÐáSx§u`-€µSxg?B³‘0ˆË£[‚yà@»moì‡'Ì Í‚Á‰…¦žÊ~²I¥·ý¹4ªïw›žfBÍ4oW»ÍžzoÜžóô{iÿ=1h1î ½5”²‘Qƒ-´Ž’5ðÌe&oácµ;» µK¯«ýFP޾7S-óÉ4óeÁ'H€ÒürGŒ£Ä@9ì±,#PÖÀ ÞîUÿBCƒs£›n¨ —ʼn‰q±´sô½™Nÿ›Oö)wïâÄÍÈÿp–Å” (‡/–äÊxÁÔ½êßBhh¯r›ž¼˜8?f3÷”{ãžþ÷4ØÇÛÙEÉ ÔÈ!ÿp–ý” 6Í¥ÁjZʦdb±MBW Ѩª)nâþÇî··ÑüzôÐÿ±þþ;Yuµºýòí­¹ëwñ(Cp_}‹[Y5·üù>Èó0ýŽÎ{×MѤ꺧š!fúæciÓ45?G§¾ùao¥J&,ª™áÐ u»þ1¢ LÆÐòÓ—?ÜŸþu+o¿¿ÿﯷ?þéÞøë}üÃÏ?¿}÷C{êöó_îtõã ÿùùÛ[uÿ‹êº²¹ýüëíß‹B´ÿqûù¯oâ¾ÞTªmêþŸõoŠÏý›î½Qµ*ëÂxóýð›ê½ŸÌoÊýF oÚ÷¶+œ7¢S¿Ë²öÙ¿©Þ+ÙÔ9ý¦†ãàß(øÿÒV~FßSt°·" ±Æ? ªªóýÏwIÜ'E"q·•-1*¾ .ØE9¾š?m=9Jžñ¦‚àB1ÒBé Ò&4÷uߺÔè» »oà›E÷ðsp÷e ƒ{$OïªöÊ0H¸¨ß‹NÚø öö‰A€=’À ˆÁ’ÙOù ü 7ÌW(áîåv,ðÃù«©gX€D% ¤É:g ’?èE´'Ó³ÒxÞhAò½ù {S©—׺’[—×€ØáeÏž‰© „bYŠXo±BÁk^^ Ê„\ÆWí!Ƕpƒ1 ÈÐvyhs‚R ü† w,zW|סU->^YÅÒõÉý ‚ bÐpœêû Ú¡”C+ŽQž7RÂÞ>£7%|S”ð ‡Ò›¬à—â7ƒþS€{Óó!Ч˜j‰åãÖÁqšx 0çð—(À߃¹eŽƒÑ P@  ã Mæ6–*Lä6ž?²KmF>|=Í} 5޵‘F0Ίܾ1ýxF* lËJùl—­íß6í> h`£ïX)V…°Y¯ /ƒ"1ðM€jŠPñöÆ2³1ø·NÄF„²uÈåÖÁû6Â8 >–qìÃÂKñϲy~ Rk+[«ñz sr5ð¡›ç™û¿…âëq&×)eÏM²rÖ€L»YUªs,5¸[ X§pŸôlîÏæŽƒÇeYr«mìs¤X`”eˆ`–Co¾X5ÁňýÈ•˜^ñu¥3+r™$ýƒ§Á#¹DŸj§²}ê&Á›NúôLa æp6Ö˜?##ÀŸL™D žf½¥Š7ˆÒ†0ƒzA‰aå°­jÆs‰%¯! £yõFTòžËb4‚ù‰0cq’×H5Lå´Ò̆qÔ˜·iHõjôÖ“H¨ƒã”7ü¥x­ý Ç)ŠøM =b­W“äî}!'OZŽϻºS¬’»3…m’vó/dmóñcoþË¢tÄúøL Ì)wclÙý•î³+Ý'{l¯Ä™òr2øî+g©£dÒ‘Bx+ U#%¸ä*&»àX'iœ9†$íð¶oZƒ) •”?Lh`y¦8D)XãI{£øN8ä; eŽåÜzVbd›óbMrç@\ÄkWÕCÊP@#l=JùÖÅeNBFI³©kA+“L|–Ãi¬ØØ‡ŸR#©g¼ 2Æ®“ L– ï*S$?†«=€’U $±^’*C’¹ðžDì¶ïLðŠà³•”ɆŒùÀÄ›h ²ÏÕv_Óljcž@¬yóás™9¼ÏÏsÚ‹ØŠ¢ø­±hR¦Zr]Yw±(n|‚×)àAÂòK÷ÌŽœÃsâ(z†´^RR8y½D¬cÏé¬]X¬”¬¢ˆ„dV÷K„޲[£89˶£D1HðéJr;oeˆ÷u¢Ð‰óÎîÅâð¬çàHœ® æÕÌó$K³FH(g+*Ç¡–Ãj«èdFo çÖ˜µóñNÁZíùf‚æa©¯FÚ'–ŒwT’,³”z³RŽÎ,–†À.üåW«Ä™`¬‰_$O% ²ÛÏ᳞ ˜'¾è©´ãÂgÙ ]©cùRÇjOU»Úó)7>WŽwªàéìé«E‰rÙÍ…Û•)vîÈÉ™U,o ,ËŽ‚pvâȨ¤x\Úf+ÝgðôRªËå*}ÛeÑ3îüç £J‘VŸâÇ)ñoEWèJÅ⢸Rà)äÆRä÷«ÅEqëø7g.±(" )(aÛÀ—~˜¹™§É]÷¥ªÆùrXÁ^ŠïŽÅCÇQÒ2õK{°‘´Å=|÷ÛøpøPvš”½TŠÝiZ“MÊ™ùç·Ù®ƒ²‘6$G%}p±>@ù«”^ ŽbÌ”5%¾œdJÕÕ”ËNì5 8óIÇcYó:SÔ§rŲUX(&Nˆg–âÄn†¢rfüñ{+¸ãÀÞ™ßâHJ‘ù g>¢sÂÒHòpøËQ™"TÏ®PÎzpÒݘIãE±uÿÁ°!D±(“Æ›·Œ=2ã™’‹ø¢!ø”³ ìÜYðœÁ}JNÖ8¼¹åk[ºôÎæ¶ZŸ×7eˆtÆŒåtubG8Áþ£\€s;ž ÓWßuu:„r¿HŒŽ5÷&q載(Láª@=øˆZ9‹¤5T+{Ý>s UÒ"É{GÞá)ÿ¼÷Ó±œ²â©ÿ±½²É‘Æ{X–0kŒ#[¼këˆÓ)¬Áˆ'p?>{eAìR™bí1gËSV‚«G5žùìk”ëü•ç7U']&« é!(gR–2¡b ¹Žß¼þ)àç´^,ë‹ï†´°ÃLrœ )Jè¦<ÚØÚô¿~i^Ö‰™«–Ìñ‡Guê_ܵ—/²Ê§sèB¦e×ÙSSŒKË2. S\ ò8•§èŽìàÄœ` %Áxriƈ(82ѨjKg…O£È|‹xʺ¨•3¥›T‘†ðœø•vS¢aXÅŠøß<çZUVåg[‘têã–iéY l6Ëìð©ò/Þ±)L»t…ÃúÀ±]‚n.ða<çñK8³y5ã/%QWLA†ì¹¢®·NúÃbH÷oÁΧ lSÔîø/½â­4΃ä6N]M8 ´øâ­”j ¬Èyêýä*éF¨G(!Í¡Š¨¡÷Ë”4KØóð}óQÆE¸ï&0~¬—Ì„—ãºòç,,p¥ˆlZ¾SKMy¬®èl È›ìò*9 ¬®ã—¯àúöˆ©„0kÖ) ‡WJ=ÅLù7©ÿ™rÏá¡àó\9÷éù>Üãº}Wµ›uîöIF©>L °ò†>2åyå*fJº·*o‘¦Ér•_î¼ s„mÏbÈ*¢”0ôŽ»µÒûÎên•A¹\K¼ÊéãmkIž«#ï¿èJG 66I8!$ÏKý ì:‚‹{@Ž·/©¤2ìN9¾xz ¯Rïý˜ý’§¦² åŽZÖüŠÞLås–¿ù²bóúº°:ù¼BAB¼T[yñ 쎈ÿöÆÃ8ê½ìƒ8›Ð]r)*E7Àâ ƒN’âHѽUãÇÏ A ¿]A)‚|ÑI>sEÅK+æ‹Ä^(áÉ€Ò¤S±Ÿ4ê½­Jª‘%8’Š3Eà›l•ÖÎù§ÔùRÙ’ ÷ 5^C÷ïÕí¡b=åpOçüi:‹Àw‰ ÁÙÍì|ˆ8éËa£ñÜD”øn 93ƒOì¶}ªw¾Û¡ÅK4ÎêUá‚„ÉÕ[¥ž,6ž€RÀ¬ÑöV±ylÖ Æ±ïâ’¼Ž/ut¤Ù°DœÝ9J 2 Ó§éÄè¸åšÁËy6¤Ù —r^dâßk ³xâ=àó}Þ`€4…s7fÜ)ü¨ÇÒZ󟆋w>SO“ÛwêS¡®(××RBxœ\ÉÛÍ‹€Ë…ÀuRL(må¯Ì©!)SvKwÉepP‚À³”âN™Ë/º!Èj–rùJvËh–ÍŸ÷RV§6ËdkïãÌ2üÙ„ãÕWh,V1ŒèÄÄË%#8¾¶ÏeèqÿfU g]ô¡É”\ýò†.Kb)é˜e'ÈP^KÔÆ¹Lµ¨€`^ëu‚$³õz>H´Åی孎·x¯Xl¬¾-ÞfÃ} —Å{ÍzY¼\Ž"ºK,¥ý<ä‹ê‡óµ]Vr°·ËJÞÀÛ¼Vò4Y?¼I8Yɳ=ñÑ7ƒ•ÜŠÚž6qâù/&LŸ/8Cø¼ù‚›ÄàÕò9ÚbÊS¿6‡Öª’Uå0äòÎn€kÏųa8A 8NLùÁ§ÿºŠ&¼Û(R¡˜ˆµdû½¼pôÙ›¨‚¤Ûߣ«Ü%Ô§­èl}š¤þ“ç€R$)â¸ÉÑš–öœ·ü-gl„ïgQ•­>¯R¾’)Ù Û³²F¢ø|¹“†“àxÇaœ¬^º¬ï¸Ô^ºzÊwxÎHòÇö¶•ÃDºŸ0‹´5ëÒö‘Ü„sºËMx 7áÌ–bÉC—ëår½\®ò~ô¼®—¸ÍXÄL—ûãrxVÝ)}•t”æ[K¤Nè}¢%'Mÿ…Pa3×<ÇøåºßæÊ–=£«¥8Ã^oÞú>³söÙ²y½«êDçNï]=Xgð®v¥§¾äûá%ÞᜎΜ!|ÞÈ-bðrÎÍNL:®jŠNÎâßMé]í‰8þðÚô¦E8›(jÄì`½A޲5Æ—c‘nSÎäõ#BÛäšFÇ?y·oê:”¼}cw"°Ê³‚ÕoìÄ}š®nìYQ”Ã,©Ð› &îQŒ7”òã%¦ºKm}Ž›Îî:öºÉfÆÁ¼úsªOpœçô\A V=JQèH¶ÕfÝMmº)Ÿ÷J—ykg´ÉK}žv+±þ Ï9=qž>yNxsfDz(êëNG£·Ë±|œc9"ÇïøŸÆŸÜ8³ïò'_þäËŸ-š‡ù“3³üÀNâóèƒË7¼a’$õ G[^¾áùÓ/ßðå¾ù¶vXÅôò ¿–oxbùò ¿˜[Jâ/Å<…_z~²:Ï©ÕÐgò4VO³èäŽ%ª€¼Ã¿ÁþWGL`¿á@¥\gA‰Âàq0 ”ÀÞ5°}$9oX1ȱ ‚ÅWJe/år4±U;‹bZÇ%^s) –Çäh攊Öe© P>PÆ5ÂÅA*ˆ ×bA¤x„(KGQ]^eIrJòÖÜ®®ySè×oÍb^[Žš¿ÏVvWméìPpÜŠR»³ˆ fH7)­Í  Û¿²Z7mxë<,LjJˆ‘bàðùsšBÀ«a;V¿îóŠüùÞt°7üæËŠvÆ»÷¤@¥áÈT®ój<'¿rü¼´ü ´|ŠBHI·¥=sy¨"|/K똠ÁÊl»[;öbJqxH7hPR¿k%fo”ÌÒ5g—°f×вiZŠíÓ²­Õ¡ÓrZq†OËO{Pø °~ }»“ÜvfÃßÞ~J…MëšZƒ!•w†-X’ÕAØ8`‰'݃g–„è<¥)!:4^Í”h·NE{æ= îZ=Ë\w“ÕÇ&…¾àüŲ‹¥ ª7Âö ýAz5Â&ËÂlx †­ª4æØƒOB<âcÎØd¹>,S¾ù«!­O¡’Ž0`ŸÂˆÕ pÓE'Eò#yUS:Ÿ˜á’r†|ªs.÷ÖQ6©źY7a¼e‚¶ÕŽ,sœTÁ\‡7K?"Ìʲ‰å½K*Ó±>Þ{;þñ©Ñmá,q5®äZ¤^oÛ²ö.ñQ'¿H̦iIÌžá$ìŒH&´Mn=ÛvÂò(gzÀ(ä=˜K©ˆ‡×,¾¯F@W²šÌ”µÄÙ„”C.¼ÇÊ)öë±òÌZ3CèYÉõOÃ"ž+Ý*—AasE\IɲŒ¨€­Z©ÔܶkõýÊŒJ|ô£©ìi€­3}'ån¸“619n ]ÉXˆ­àTlÇð=HŹÀ)Û­àèó*)Á©šsS×›ÁI/9îOb¯$´S[É…J8ÜÍœ=vLrFípàòk¥¶ xsγÝõ|Ú[ _§¾…•i½éÌ)ίîâ幈”å&GJŠ%æIßÃfp´1†´¯¥œ“ä½’"N”DŒ¯g;GY”²ÍÿËÓr"kŠõpæèÝ™”XLâñQ&LL݈‹Å?tâ~£wç³Í%Wi„}ât¾t£ƒâ]íˆò‘ñ®q­Ó¼ Љ«jݧÆV¬Óû×Å}iÚ ö‰kûÌ'ºÓïëÊbrÑòdy$&±£(ù §Ùš%.×9¤ÍÒqdìªVÁ™˜—Zä«ªÞ uò5¾RÕV¨¯%že‰sZñž0¥¯Ñéc‡†&YüO‘dJ$Ý0pÂo¥t^·QRkq¡(ÞbGx5˱½'MJ{BÂöšm‰6®Åæ…<ýqqcëJÎã„`qRRnTçM §¬€8Ñðk®í\ :Ìs]˜ÍsáÀÉȲ‘Å"H¹×ó‰Ã©ŸÙ[VØuÅí"íŽr²'â"[–Z@” ¬‡vDeS’7çe÷ÒÞódº“XÆZ ,Pö™R4—E (¥QßÅ»•¥Ü«D(ÑʳÇ`TC©ËE Ç‚÷~b“<ààú”zµët¶Õ† `Ý6K.9o.eO}kz®É™t·&K[žÔ³ÄbM£œ3lÒæb¯uŠ’ØاòÖ'Û”£\çÄ»O%Ù,¼i•¬à€?'" •5ÚÃR_;°Cy ì®yðb,ºô9§ZãÍõjXï" Ü:qÏ …1ÌA©Ló…ׯOºŽ0"¤ÁRÁ"²$ó•Åà¡¥¤´âÌé†ÃN¼‚¢Ù‚¢Çß4¸ÔÛ”XÇÑÒ ?U®=F[®£À²K;qÝùW+K*`DÑoÞÁËþè:³ucO9Ä”|™æ_ÐÍOß›öö=|ó5~}ö\2}O{ÿÑÞ _oøMÿ¥¿n©®!m¾QLuÑ@ÜàLÆ‚ŽNÊgêMb.@ª±ôJ6m<ÁÐ Å„;çÐ×òÖ·JEM',~ª1EÍbŠ,¦TÅ }ÞpGº¬jÛ”ò‘ƒ¥ªÀ¨0 .Qxi|V|M&ÓY>Þd“V”£a2C¨›Ø;Qª0e:NÃ|mËÑÊV“5µgÿˆ}¯ÁYÏ5TC=cVròë+ f2¯ºÌÅ)ó{x}SëWŸ%Ë.ùa™”Xó*x#©ºžÑWâ.Óò}¸ é-£“ eD:pÀ’]—«6+ÇÙŽë7³€`½E„þ#’ÉIŽãÄv$o´fMfØšIµ._Óá9³ì(÷x)8þ¢H–{iXì› õr`íÀªr¦Å [l(µˆ|®Ô·_ ‚¹X†«³lÎ9 ÌG—)>Ö#ÕeÏõ ,« kPLX?׉ùç¬ÝÀêl‹I+¥äÀ-ò¾(‡yg6ï&ÿf°SåfåÉr¢“âR`ÍJK줦; L†Õóöq> z…YzSˆ•½O=FǵÙÕ>V¤/<Ð9Ô¥öAäšWgg(Þ‚ó|ÛbƒRŽ)åº04¬Ïq„vY‰€¢Móë¿» Ø38P—5Pý"gXyÕµÊZ·…Bõs^bKÚ[³Æ9yf‰Ú7]g/ 5ÎD„ùUuò¨}[¶›­íÛâÀæÎ4Ò‘M<Ó ‹i[5z_NVG|˜,êWKÏ+p–.æNöË!}ã&©©W¿SÀgÃxsª1mx•¥¼É‘SÖlÙ6«Å*¨l)ÛÀ¯e÷áw8¾I 3>S­ƒ3Ö Há0Oy†¾¬œÅ/S<;"dH¹õ'@Ò¢ÊWAÉŒGAæÄü—:u0ªØ÷y9>ÆÁ{ÍR•“2ËukaÕañd.¡¤Yd”åõóð2Î`Î[zÊZHõtÒV*:,ù‰Ù’渶&[‘ï“ZsÁ33ÊVdOàaH¡PÒ†ƒân&¥¦sÜ.˜:õ:b]¢Tw¢˜6¼5•pX¦ÛÑ)V IÍ^1˜DÁbaω ðñF0ϸÚDT®OQÚèH7ìËgñœû"–#+Ìš#ôÆ/¬i_Ì D8iרâÝ4²ÞJÏ›¦Ë›Œ‹R¾Ó{ *®‡%²À[Xó„ùÀÚÑû·kœÄ!ô6²rFÍUî+eÚépâiñiÉ}.”ÔbïeÚ0×¥e'ââRþø‰·©Ït帒äû¥œŠ8}Åaˆér”‰ìú|•ª«l`¢*ãálw„Üž@Ž Ì– dÙ` D¼ª ŒC¨FèíÌEÿð<æ6Á£LÉ©*p~ |GÕq&%ÛK/¦€Àí€A†9‡}ôXB³G#Tãùå]Crq£¬;ÙÁ³s›"‰˜6læV؀Ơ¬þ¼kÅßv™­è@¤ ƒˆ…b[¢V¤ˆ¥7ìd¦L ìn"œ˜"E< J2e°âÅâ)éÎá¤!Â8ïyM76d²LZõñ ¯^{™Ð—ò.5ÆuÙxµŒÂì>Œ Ë+ñ8ØM1 nGJ×Íû¥YÔa[­öõæzs½¹Þœæ ³:d5Ì.u˜èK“—£iä›Ö&š(ÞU#ìJÛÙSŠ)1ßæ‰Ïîó^ÃQ[»¬ÝU!JHUãxïp%ÐFªD¨©Çs÷â*iÜ+¥ÊÒ3U#f&‰^Z1í†@¶ÊYÏï K©jiÑá~úº±‡$Uß^[ˆTÏØ¡”ÞÁë5Ë*†gÔ±•«kUmžk8„‹Ý­”4ѵ9òf)Á'”ÓpÄ]†K¹b!âÂh($ŒbQôå²t<ÓðJµµ´Õ «~zÚ»VI·o.l4JÉÒˆ²Ôô;LRÞmÙ”ŽžÞ^ö„egsMò\iy'9¥¼-eÂ{é)iïži'K*LÁ sB^b!‰§X¡G©¨\ D„€¹F)‹åO)ZJ¸œùòoGR¹^JRú^,½·îŸC¯l¡…Jl—Âæ@à–èóï„qºGÊRÞ퓆o¿o”tË!|AÚ¶ëÔkÉä˜Ïe>“.¤ÜÝ”+²PÇØ^£ÜuDY+±’ÉwƵÝRšòÄkoÞñŽ{|qò\ÏÆûŸÛow~ÙùãÚ?ذ ·ÞpÉÝæ+Äã¾Ü[9U'ÐêènÚ~Ð_º¸2X¯XøjËÊU1øžµü@-ØË‹•‚ç3î þF¯e"êÓwªÀ=žïŒ†”cFcáÀŒ.BŒVµØå‹7l‘Ð&átƒ½8îŠ'I2ŽùÔÂNp÷’ð·û¥²)Úw1@l‰'œÚ¥a)¯.Î?Þ~|û¯N=C endstream endobj 1864 0 obj 12177 endobj 1868 0 obj [37 /XYZ 37.5000000 729.500000 0] endobj 1869 0 obj [37 /XYZ 38.2500000 137.750000 0] endobj 1870 0 obj [37 /XYZ 37.5000000 729.500000 0] endobj 1871 0 obj [37 /XYZ 37.5000000 341.750000 0] endobj 1872 0 obj [37 /XYZ 38.2500000 137.750000 0] endobj 1873 0 obj [37 /XYZ 37.5000000 341.750000 0] endobj 1874 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 350 137.250000 356.750000 ] /Border [0 0 0] /Dest /#8d#21#08_#eclM#0a#f2#2b#dd#13#ab#21#a7N!#19#9e#0e >> endobj 1867 0 obj << /Type /Page /Parent 2 0 R /Contents 1875 0 R /Resources 1877 0 R /Annots 1878 0 R /MediaBox [0 0 595 842] >> endobj 1877 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 1878 0 obj [ 1874 0 R ] endobj 1875 0 obj << /Length 1876 0 R /Filter /FlateDecode >> stream xœí][¯Ü¶~ß_±Ï²I]¢@ìcèCÃúPô¡HšAÔíCÿ~÷¬¤½Hú(ñÛêr#±sdQäÌpføq.ßÿñóßÿüïñû÷Ÿÿ}ü±ùýýçCr*²¤þçøúë»ûØòÔüùX”Ùñǯ‡oÇo‡O‡Oçÿ~;Ô/|~ÿçóŸþw´Ç?ÿýåø×¿øSó—^ÿÂ×CaŠóï¿^~¯ sþSrýýõçÿ:üåwÇß^Gl?×Læñÿ¿sYe‹×YŒ|ùÛ¡]¥¹üú￾¯×ô‘”Yz4©;ÿ§Jíñ?ÿ8ü|¾<9U©1EžÉŸ)ìëwÊêhl•³¢÷•Ë/‰±øÐUši }™µ09ŒËoh1~Úó0Zü¼-Ntk §6ôë¬Uø‰‡–ã§µ™?¯cËÝ–Fmè×Yëð-ÇO÷ª×•øy[žè©I´†¾ÌZ‡Ÿph9~f™ž¾½Ž-OôܨéÛˬuø ‡–ãgžçjü¼Ž-Oô³îR•×Yëð-ÇϢгŸ×±å‰^:5ûy™µ?áÐrü¬§ÆÏëØòD¯2­£P=k~Â¡ÅøéŒk×YH“æ6¸8Õ«´ls=kizÔõŒ-ÇÒ4/kÒT™8m®cË“=ËÕ„å2kar4 …CËñ3×sqoc˽PsqëY«¨ÜÞП†ÀÓ¨`Ëožß}9|ÿñlºòã—ŸÏóº|¯þíË×CzþŸÂ”yuüòÓñ÷IbìŽ_~9”§²Jr›]fW?I ôĤ—'¾œWúÜ,ÍåŒ:8ѳ[ržhuö‘뺗V§Ë\’û‰¾GOLŸ”p´ðÉKøwœCOÒЋWZÁ'p4ÏJßIR¯Ç¥p4ø$tÃsÃÔñÐÀÂYWRBîߊUQŒoÅZ&³“³¥y|‚ߩ锞RW_ÑLxÇÔ<,o?ÀûÎ_MRô½†úî” _q?ˆ3ÝAˆIÛ.'³ÏД̻É$Àëòp*UL?L”'”7–]µn]GêW ×u€=IÈáÙÝÇpïðf!tŒgë•Ý=7ؘ¨Q o£\_ð¡ª7¦Ãæ*0jfºvP…ÌCT<ž f–tüލ55õk‡›°<,eøäDE¯oÇ邈§Ä¸?žwBzD‹Yo#‹èDÁ*ÎÚÔ*#oI}÷ä6¦Û¨ÇÆSž?š;¶°[ÖCÂB$0Ùãà‡6ÉÚ•5ˆ¥INyqY›Çˆ€ƒÄ¹Ã#r„m†˜ì®õS®µ‡~Ó´Cäð—b+Ɉ {F 8©.Æÿ”E0žƒT%ÃRJ+à®iæù£ù¡`5|lÂ* žþ(‘`Žtظ€©ø¯ZÔ-ÕŽô)!}öLÜòy<0Â7 ³˜¶Ný€%r•F‹QŒ Ásk°Œ0¯FÔlz$„‘ø1/MÍÓŽf[Ï}Æ”{!x÷|B«˜ãŽH‹Ç˜L§u>ˆudì5&~»³Zç!±«G3¦ýò”í3ýF¢³@×…`¼Ï20LÁŒ†½vf“0Ûtì>Dq¼E±Ä:ÍŽÑIqÍ¥y\s¬(MÆQÃ: Öß²Ï`tx³ÉzåÓQêï+„ž1e±¬XNžÍ( $PÇœXÇCp×äIºšC÷pÌI’‰d‰ïqÁdØÙÏ¥‹97(Ú¬J;ÞÅxôãÛ1æFÌÛö\¶áÑ"Áj3ç™}”¨·kPšª³Á6’k@D¢y¤™¹ŽCXbœpÏý€sôðvú>•Ó¥‘t¥« L’umÔs-Î5ÚÚÆ˜ÄNU7ÄGÖÃg¡²@¦®Ïxv!:«2 ‘®M™ÐåÈ™mBN¨SW ÀX£+›ÿQø®?MñðØOFѼJÓ®dÙ£ŒŒâ>hïœÞY3òϨÌîåÞÇðá&°8;%•{Ôpøn·¾ê2¶}4a[Ãsö+-ð[øòÀ+­,|&“ Wg޽· Q0+ #Æ8Ú)˜Ï“›»ªã?I”zñ¤[Šfž§¤è3VVÊšìj — ••2¸ÜñÄSî ®ÔSî).ìTt+O-\‡Öp4ÏÜ \Ë–ð£y¾)iÎ&ôª– i¬°ªNØùX$_$þnö3B*ŒòŽayºxà‘à[>î¹Xe–2TÂå~â9]ö–©¼;]ÒNa e‡X¦Û÷„¥¦Œ_j¨§NU;c”ªDœºHå7êêV6B·Ç“E~pm6ä‡É Àä"Pû~g±ÙºöØUù£*ÝNØAš¦¥ég§e瓺gJ*ˆV†í÷ó^E·Î€üý&J†-=w‡¹obâ¼=GoÑ2«ºKˆbFËž­™Æ&@dÏwð9¯ŸÆá“fnª‰òÕ [o#rH`.޲å¡^ó•ke«Eìáx°ÒnÄ•ÂI˜áE’àÓ”Pcn‹fð3Ã&oà ìZÓu#Àð“4 ÷KÛÁªÁ+ݺ½w·ÛÆ4Àë³ÆsÃßÑ÷5LÈxÇøÝ×.r¹Ê£6Uæ rE¬d›ÌP·Î žœ3£ ö¹îæž=lz6±1§<ŒB{VŠCÍÇPh¡vL7ª¿3œõÖÎç[ 5OÓ¶ƒ9“Þ(\”yz`‚ÇXGyꈿc ?6Ú©?V s‘,ÑrV»Ã4ë‚i˜@"ª<Áìñ²')ê¶‚)š©_¯/Éí[´ ^ÐD*’ºŒF%BÂUzí÷Õ5«Di(-Z O˜øÓïÒGQå/k•^¬c^ä -õvÎw$œ™¥•Éça)Î ÃçsÏ™žAVð;c3м?Oœ]”„˜¤{”_À®'Dij뱈@8 )%Š’Òj2eº,3•Ià±Z¦±E5ÈÔA_i›q² l‚¡}ÆÛ››j¹Àü‘!̵J¦±² ©²yÑ1wYÐÈxfGóäµÝ$) ¢3æ‘![)³«[“†9›hŸ¨zûdùvú>W…FPøçc—êÕ!…[tm´Mz´Â̦éo';½ 0uç#zã²ÌrõN¢š˜›I0. Ò”ê#p‡²”{xMø²ëX§/Mi÷;j×”3éÉvž¬³ºl§G OONîºÚ‹ñ„¼•Ù/"í§céíy‡¾­µUÇñÄ'M|ÄçI)–ð 3ýü3—t]ôù#å#Ýzãõ0ý8õQÊ.,íè\B*Æâƒ4[ÖÙGò$\P™ÕnÏýðH|äÜ•RW ™¹VòÇ)ƒ²%Ä0Çøkóû3²•«õ,Z¨R6Ú6ÛœOÿÌÕã2Z3{å„~Q*EîѤ\³¾"¾Ó²Û©ƒi‹ÎÒ"¤Æ›ÇOöµ ÞQ"›ëšl¾´z‰µ(û'«{ñõ„,, (=c—ÒIF³™Sf‰»¸äa€ä…{\ƒ'Š€Ái»¸…Š[Q•“ÅMÖ§žù`« _äšzV´ ÷Ðc4±íÇDaÀh 4ŒâsB8D²©;º³œÎO2aö¢ËÔí²l)7|IΠJ +e+áóÔºU@;çfæÚ%¤NUÜ<}X×] Ç„“L/”&kÜñm¸­G([ç‘`ˆ'3·î"}àDÜ3,ñTû<¬ÑºÀñˆa†gEC‰Q?*«®y3õ£¨ì|Fgð‚¢ÂíßN$Kn°l°ôâõÀx!Lƒ·Óz9OÛÖËÑÎP 캻¸I€Ääê%kÄ ž%úÌôtê{G˜ŽÐ ì{p±nÅc•«Ùѳu¢gÛ)v›–Õ£Ú{ð…]½Ä éš?‚ …cöòt L$Æk]‰Ç¢jÓ£¬D·Ïær87„#,«LÂ)&לéou©œ›‘ AÚ4|VíÒOuÝS0?–ƒãa˜ ÄÜä S\’ɹZð!»k˜6¯ªV ì0íӾŭŸÚ rA¼\ $-²´ý"Ž·gJ ´ý‹áQ'ÍùáªHEotëkDvKà Ýλ TÜ\‹5Wa×4 u¦ÅÍ.옡P``HC ŒÀÂI]HWGó…1–B4g~[‰ [+«Öýgcˆ 5|Agמª]7þ?‰þR_¨íF‹4ZÊúÙ£ÏD Öm ÁÕ$…éˆ0Ñ´ÁS3;nPœ*`›–”¢t–&Ѥ7ád8#&h]&e»¸´ÞAkï vÐÚ Z\XµYX$Øo“8+5ø;¸ œŽŒ÷H/ÞY¸»4®V©ÑlFþ0ÔÁ;-|òv.—ÊÜ=~q¨[àôK„¥†yúºøåtØ«’øÖ3gU[wM¹±J5¥®\D‚²ekx$LTßþ¼@\u®kIárk»åJ;Šy‰µo–×¾bû¥9cÝr/&ßËCYÙ²=íJ&` E‹<ÍÁE7%5Ú:;¢¬¬rO•V“Ï~#÷œ‰U^_>ãQYͪ“˜.¡ÉbW=J?Vô]€g)˜*³DšÄòe#§Ë½G¸bÔ¶è…e ËMdîr•´µj`Ë#y”ႈ·È•ËÛYì·ÈžÑ<·,1ÆÔÁ¸0¤5¾mÃw6²7Ï;jî[ÏÛ©‘•Á¤ð~,…ܶðI†ïÔ ­3Èí½×YÛW¦Ë©~-.Æk=÷í!qÔ+šJáN¸pSõ@ä’fÖ¾}¾ÐɺõÃMÄVàPh^dvw\äҺ̶÷8…ÙK‰ÌSd¶Kí ³U?™?~r5ŠDZ˜‡èÆU•3’ŠŸ?Iйó8QÁ3À€(ÓU‘˜JžNBö& F3EeÅy[­ž¬Z?«¿Ñ³º{Ä©bîäD¡w9$\qê¾%’Ùñ±Ö§ÂW$‚È$ÓÜŠwU=Š›©X(Ûs ›(&…x‰C<²á .#R{¾ú2þ}Ï‹&ü=á}¨¶XJMçÉ”˜Ñˆ¨»¬ú~YæaYõO&ÑÃâ•î¼w[~:èäÇ š½£¢„wWsÊô9u&ø+½íéâFœ2-ïðëá³§ë<â;V3Ìñlw¢CœÇ÷ú!Ñà"ˆx]øÜÍdAóçŸqqìˆß׃­’®\€+Ū¡1q&mEñ6Zg€•-¤›‰Šã’ÛÕy¶Q*Ìé²1¾NT‹½Uœ¢ÝÏIâòzãØY2öÌ@ä 4VåLŸ2K¦k’X ‹„Ó ˜‡J×fý<ú"}´)ž*)Ї´d{yÊ3Q4ƒ©ãJÅȈV0ÒÑ:ŠÉ: B%Qø{9s"…I檢vÑÕϳR P&ÿ“ÑT+ ôPmd—ul¤løŽH’ü¸ß6ý]&ü Z‹ö€²Äu lóvªYä´ì8«tFy«œ4ã’„sV,.  =©”8—Ì$ÒVqiNýb‚5Òf®÷µsÇ jÆØf¥2ý×@ ¦ÔsOu¬žÛÌF»F…¦bîR Ù£Ûs"„«q^$Á©‹ÂÔš5,Óc¢ÓÌ<ªVOq¾0¾¦¬:fP°Vœwf&›oállÙü$ /]NVŸ×«>,Ìh‡˜ªì”žf ÓÍ:혪 LÇX‘2ÕÓQª4+¡Þd“¢™êhý&Ê„5ˆWrË™öhß%¨Á·S‘èMÕÏÉ\5¾™ö(Ü= —k'[ ·“½H^ÕJ^Le’S}Ÿ×›v² »HÐ;¶‚ïTð;55Œ;.¢ŒÖð0?9S÷öÄÂÜz‘Wn ˜[¡ |ǽÀõ¼CßizíÍ~§9l}§Q¢CO u0 0ç<£Õû¥8¹Nç†ùÓö™Í[ô`Š„``ZGê3›»6k²ÑCÑñÍNÊNI—õ~‰èp,ïK!B h,~U¦1†ëɘ°eÙæÜc*3 1SÐ}®8F¦-…ŠãõÜÝäævÑ?¹¹Öut]傟ÈTÍ&vòÞg-L!á>kñjpçÕ3§!|<ôß™J2øˆ g€O©-\¼ >Áµy<¨S% £ó¢…âM r1¬"IÚkšÒ<Ú7Œ0K—m5éQExØä›LPäæ²I‰JÌæ`"*=ÒËD()€ž-ÍälîpÌ"ÛÞGñýíZÕ=yŒ9%ßóå"éç7ÜS0$X´ó«ð]ÖQÓ“N”KÕ,º éôeÜÑç_Çog}âU7ŸÆþÂ}T©#wÖò‰yå÷ѶõõpaÈðÔ:¶ Xm^ìÉÖawOjp!ï?i¢ì)ïÞw[¥è}ǹ&Csûج™e¬ÎÒîöÇ9+yÀ€6}Ë0x4øN£;LÐÒïâÌX{ýsrM]°pæ˜ÑX80£mŽ„S¨q(°—5ôäiÏÜÜnp4Ç»âI‰@OÆ1ŸJ8ž™^qù¼TIyªhÅnm{—è3ªœ??þkÈ4 endstream endobj 1876 0 obj 6182 endobj 1880 0 obj [38 /XYZ 38.2500000 702.500000 0] endobj 1881 0 obj [38 /XYZ 38.2500000 702.500000 0] endobj 1882 0 obj << /Type /Annot /Subtype /Link /Rect [151.500000 709.250000 199.500000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 1879 0 obj << /Type /Page /Parent 2 0 R /Contents 1883 0 R /Resources 1885 0 R /Annots 1886 0 R /MediaBox [0 0 595 842] >> endobj 1885 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1886 0 obj [ 1882 0 R ] endobj 1883 0 obj << /Length 1884 0 R /Filter /FlateDecode >> stream xœí]KãÆ¾Ï¯Ð9€µì@`Ÿr°Ør0rì8aÙø¿I¤4"©¯Äþ¦ºIjè…³“¡Ù¬®ª®ª®ç›?ùÇî_¿ïÞ¼ÿòŸÝÝßï¿<û*í?»ãŸï®aë}÷ó®ªÃî‡_Ÿ¾í¾=}~ú|øßoOí _ÞÿõðÓÿvv÷—ÿ?ï¾ÿûá—?vÿÑñ?øõ©2Õáï_N7•9üT\þ>þþßOûÃî·ãŠçÏuÀôÿÿw®¬›úÅ/{:ïÒœþüþÃoOoÚýG}¤rUSîŒw~gowÿýçÓO‡åÏ‹ûÚ;ã*üáç¦ôUêÚ~®\÷ùéÊž¿m›ªÂè˧?kõ¥ëãªi–>A­ŒãJ#-½o¼1Õ‘¶/`¥#ô‡el‹˜Picæymu¤{SÖÉ–>B­ŒŽ–žxé¤gÖ[{fþÿÚèz^\}i_4©–>A­ŽÊxm½cëkÓ¡¦J€÷ËâêK—!ÙÒ'¨µñÑ‘¯öäV…ïÐuXGaÏ‹«/]»Tš¼…Z™ñÚiÉ\×u:2?/®½t(ÒÉþԉȌ×VС¨\‹{Pbêx?/®OR›Lö·Pkã£%©°vÒ“\ðÉL««ÅÕ—> NcZ këÜg¥TÆ!ýj“Œ¤'¨µñÑ‘t´öçˆ50ío€3æ›ð⻯Oo>oŽôß}ýéÛé“í__ »ï*WÛf÷õÇÝ‹Â}úÓîëÏO;´á `ûÄxô¤pð \­xŸØxì{ø¤„ß©Ðoâ!ðjá;oø;ÊOÞ¸®áNá© Àñ&¬†¹ê#Ü~s/Á£ã †!ÀPwØùøõ zR‹ _obcbÃø„B„Ø`„EÓ†à†ß ï8ÀÔÆÇ9M ˆ7C|r˜ÚP vª@A¤5@žùâ(ÏkÏò¬Å†)öeeêÃ…lˆ ·¾<>¸‚¿Å­ß{×F÷†ÆãZÀ† „Pã'B ¿ƒasðÔw¸Ní ðÇn›dÀ GF—¡á/b®Âª×%ÝÞÎ €e’©Š7¦^«3ˆb¡\ŽñnÂwFˆd|âøÃËSÆþˆ½‰$DÊÞyø¡ˆ|Âb¥ñŒ³ûíATšYä ¡'-¤ }ÝBE^#*6±Í<Å" S#yöÎ*gJÄxPYå>@uŸP¬s·¾šQðVO6¿„?›'*'\¥ßÛt«˜2N1i#b¯£4W¿ÌŨ)kÚ‚ék.ácÉ‘˃5c?NgÖ¦ö f2wo,a-Ú¼@­úz­¬ùT³ÅªÖ£ Ó;Øšs®G9Á3$ýu•ÙÊ­US(i5yåò»ìÝ‚-Sóå•&0U"©E·ZKÐ W1©8ø48`®Z–SeËô9?™†wØ¢'21©Þ *]å¦{f¨ûÜŒ‰/eÑLÖ¹¯øÒBá"J•5ÅôBÿQ‹¿î RòÆ_Rö˜1,¾ƒ§Qá1, x‚Õ{ôÄâ!Bðayãð˜©L¸ÆØqxäî UY4ÔÚÔ¢¸Š€@óSAÀ~’)§Çƒ=ÏØ_Æ”H;>4" ”róÑ›”IH§9WŠ÷-ëÕv1 „6\JTà”qæ‰0ãºKðgCL±¾;õ9ê‰àþÁ. ‘‚—ØõQ¨õ;¹Ï.•ísoÔ€yüD`—LO°?™#o™ñîx=fø$Üc±,ìÒ˜—³K@y‰°cÄà'¹TE*‰N©@y´uÕG>}l Ò!„vxÛ³%&#frâ;ÝÍF)lÓ%XÅ1¹nøŽP9 taA}Š"à ¯†!P Ce´¸œ¯_`Õ¸¯e’`ÃR´X1 ‹ÍBŸb.ì‡Ñ2˜• ¨úXÈ!¹âÀxµPæ;fåeR2q7ÃÆ@|ñÁ` 3ü!P²aÆmŠ\xc®±Úø ÇàMÐÎXtb*0;ÅxÃûÁ–öüàïè¦Íþ$dªõen«NžÑãýÙI¡<0^µûlLµj<.[ûëÙ’<˜q¢>Y9j´ªn/óTÆ!}¦Àf„|Ë); mqÇéTD)–D‡?L¸˜ï(G•‰¬&)ðnùFúLžg-6fÎQœK"œàÀt=1qµk¯9ûgÉ—ªÅº+ªãYû"‡QK³œ¨D—ˆ¬Ú{nv±z—«“¦é„¾V{É—¤åU<¢š©“¿Gäݪt{Ði“¶¾¦\ ƒ$NlŸ-¯ó®QÞqVÞ‡Ÿqœ §DQ $m©cøIÓA7xº4¡¬@Ü™HTê´¼Ö½k0^©zPÓz)g«'È\í“6$㋲/”Ì=‚ˆ8‡ND0LȾËØ‚j¯q¹ž\•øÓˆ¤«O2³Íu:„7$þÁZvœ±Ê#߇ïÖ¡'bý8½ 'À IWDî‚ÆF@ $6éÚÔD¸ gÏÕœ?ÏWhÂò3çî2ÅÖmI:š[·¥|²h¨·nK¯¤ÛÒ}¡Z]Ûª¶‹ZF`$X3B¥^¿팳8×i'â+íÒ-”æBÆÇ¼ý/R›å*EEš)Ÿþ9öêÝŽLö#ƒ¥?Ĩ`ênG&둱õvdòhœ Ý(°Ñ¸™l=eËúâ7ÂIï¹&^¨Äò^2ÃzÖ~‰‚l3nH,Þ¬K™|š>˜s£­¬hãU{J´5e$Ú”ò.îæ4¥%ua@^$$-ýLÝÄÆé :T_ò8± §GÉ—e—<Ò0÷Ìœ¹rĶ©^äšêµÕ‚½P9Ï^ ÆäZRuìÑvBmVUV·6Šª;š.àRgœ¿ÞDÉ<™áJMfãÌŒ‰e•;·MÚúfæËxÙúf¦`åpnVãóuÈ©ª°Ÿíü\ïG׋Ÿñü4çc¡¥`¾“U…ÆöÉ=ÿuy‰”¨ßáíD¹5¾á#ªaåŒmÆo‹]†¥aÔâQ „¹¾WxåN¹œ0kì™ñøÝ\T í_]\·§tÎ1p¾1}5¤{’c¤'#ÞB4L£jÓž¤¼ÂD¨!BšËZÃвÄΠu‹íEO›ÞcI° ˆ!}Ô`Ï|¸Æ^$er d›«•ë’žïŠÜø 8Ûh–m4˳tQ‚zÍRäÍÒ„æ.B¶Ñ,’ôßF³ˆÇyÍr:fÕùrºf ÌÆ`PwÄÁ–L‘¥ O1¬i…žØ~#”Ão›ûÌ8\"Œ#|xþ*sê1XtnÃnÖ0ìsoÖ($ɤE†"\F;Ã"$!à8W6Óï‘rÛ/xd…J·3¦ïý£xB ¤ŒZÛ øÃ‰ÔD´wU®r¡Ó‰ AéŽsØÂÌË=¥)G阪¯ “Ôóm²÷ú •®“8Á>íà…UeÜg©A­¼ïŸ;ªmÄò{f%]µ3#þ‘Š”ë²œÊ Œhc*4„ÇÞdª¤ŸPúaû]G$Ím °_è‚ ¦(ûðÝ:i[ì­ö’${ÜNÐ^2„í]¦Ø`KGsk€C õÖ{ àÐM1˜òÒóhk€½Rí¼5À^Š…R?¸)J’ sx?˜ôØFÂPC°-A*ÛÂÜ=Y[ñ…«÷Œìb³[ë[í³‹kr³ËÖ=zÅìî7\u‘¤$‘séÜ¥ùÕŠO7[gìS¤Û¥ntm´ÌFÊ.Ͼé£0ñÌi&ïFh~ªÚ‡E¾ÁÌ÷B0½ÝÅ(»F7¯P·i“.«ÓH/’·OJeüà8áÄtŽcD¬ÇÑ1·bbª4¹ÉÕR‰èà%¹Ni´ŠÉÖ`L˜L9êÊ]àæçÈÇʾ~°nUB+˜•÷MQM5²;ÐS&«Ùò¦¹šò“npÁTž$¡ ˆ$;¦ÍNL³*üa")_¥)d.¡ù ÕÙìÜ»)À«F®I ›Î‡}VLûU]éÆÜEÏ@rÅÖy1{ ”é˵ª”¸@JGÁxVIgª€Tï‚ó†ñ­1Wv•‰’ýÿ˜^~Æé¾Á&ŸÞ¾šê/=ùꊩ*Ȉ¸…zÒ„›‹s¾/®¶P]Ž‚ê2ÆŒëBÆ&ì‹ÆõýƒŒ7£ÎôMpaÚZZAäê3QDÔ"góŠÍ>ºR¸bj\Ñu[v 㲈V2Œ#u|ÝÉÜ&›Yv;YÆÕÛ̲«ïl3—”3kuÓ óµ§þR$›oZðv›€¶ÆÞ~T3Q×{ý’橸Â<µ¥òÎBFÞ¹T9e”ä¡È>Š"SÎúrH¸Ô£ä.rœ!\† :æÆ„&U®¥³'ÃáûU·ÔÞžví¥©’άÑYN¹aÚdìUƽ)7cæ¼Wó'o nKÚ3Ô÷uؘRøTŽXE·Ám:löE¨†YŠw%!”Î6=û ËÙ”Á RZ&id ,± ݤ.*¦•V…m¶ÛjÚO7ÅPˆ0³jUK¥(£Ic"{ç·¸õṦ›—µØîÌZ¥ØÄ«1‰8ª¶åc‰—9çˆËÇë2i­ê”6-ö<êy‘Ò1®-byÞ[g%wû•æÒA©ãÖb_V¦ïöƒ‰WxHQ)3öüh Ç1EÝ8‹bTXˆ%+“µžØ§‚å ÑB˜Ã\„…Ç ­ŠH7¦’¬".Big¾çk•¸€Q¸à1Q˜[o+5£ΖÜJb¥ km‘½‚«JröpCªˆúJS¤½Ç1w å‚›\A9•"•RwÆó7])3?Ï8ü&­ç”ê 0=R¾äìùEçB¯L35Õàú3 “q>1Jlþ°}ÚK1ç»­1~Ÿ»#W@H°ipI-“†À¨Æˆ™Œ*~úGèÚ“Þ…çàV_›‹¸ ÄÃ<sS»')½½¶€yÏhKŒ6WõáÁCI,ž; 6>¢­?¶ä~­,ä±EèïÛÁ&O.Œl[ZEž|Õ„e}.ÓØ¦óËé(‡ëm:Ï2¦óTŃ÷ÎŽ þ2Óy„"¢€?ÁE({d(‡Yù^‘^Ôj Ÿ6TÙËæmÚ°ŸµÌ9üÙ};ð…È6Ÿïý ¦úf+"ãö«ùáÎ^¬/å-ÜÕ WB{hìÞž²6ÆZ«?éZÔÛ}çJ¿ZÎÐwܽ0Ö-Ø>u;EÞ|ìðCó GÉÊñ;¦Á)Øwc¯ßéT¹‰Úzõ̶,Ã.žËC!ä˜Ð˜90¡»²ÍLˆ1Ôé(}ºõä#bi6\M ø=)ñ8¦S ÁË3 á×/çʪ¨÷¦Eq=áѾ.ˆ½+œ?ï>?ý\ëuä endstream endobj 1884 0 obj 5147 endobj 1888 0 obj [39 /XYZ 38.2500000 271.250000 0] endobj 1889 0 obj [39 /XYZ 32.2500000 707.750000 0] endobj 1890 0 obj [39 /XYZ 38.2500000 271.250000 0] endobj 1891 0 obj [39 /XYZ 31.5000000 708.500000 0] endobj 1892 0 obj << /Type /Annot /Subtype /Link /Rect [190.500000 723.500000 240 730.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 1893 0 obj << /Type /Annot /Subtype /Link /Rect [217.500000 716 303 722.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_target_language_callbacks >> endobj 1887 0 obj << /Type /Page /Parent 2 0 R /Contents 1894 0 R /Resources 1896 0 R /Annots 1897 0 R /MediaBox [0 0 595 842] >> endobj 1896 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1897 0 obj [ 1892 0 R 1893 0 R ] endobj 1894 0 obj << /Length 1895 0 R /Filter /FlateDecode >> stream xœí]Mܶ¾Ï¯˜sŒEQ¢$ (¯×z(`Ø@A…Ó´’ nýûÕŒ¤Ù•4%>ó’¢f#±³²Hêýþæ»?þÇñ_¿ß=}þÏñkÿûÓçCvªÊ¬ûçxþõÝëäõ©ÿó±ªËã×_ߎߟŸÚÿ~;t/|~úkû§ÿóã_Ú>þð÷ö‡?öéü~=Tªjÿåò{S©öOÙõ÷óÏÿ}øÛŽ¿W¶ë3þÿïtU›æ|Š…¿†¯T—_¿ýíð®û~§Mª²ÒõQº8ª¦Èÿýçá§vùañìÔJU¦¨²;¶©òvS¶ äM»ŽÑ³m.¿D_ºVÚ×Ò—SKÃCi£¬kŸjÓÿÿÌí\·Û6•i©IÕG¤dTVö(Q…4R^-.¾tÞÂÅÓÒ—SKã#%ËÚr(ÍÏKœA£ëLîÃâòp7EãZ.P†GR¼¶J«lÉå\Ü œ—ÅÅ—®ÛãzZúrjixô(ÅkË¡´É (}Y\zé*+½ÉôË©=¡¯-†ÒJÕþté«ÅÅ—Î_º´;µ]jY[¥ºêecSŠÃ溶<Ø ãX.§GP¸´>ËÖ§ôÆ¢/‹‹/m´/³«;µ'­ýÉa |Žî'À¡ÿfyñý—û­Ouöœ_~jÏvÙ²ûíK òø]ëÆ·ZâËÇ?¶jþtüòó¡9™¼Ø=Q5z’åð¾WËߣ'ÚÀ'î#ú=ú™øRÙÀ}t·Ïó—–ä|“K+¶“ËwrÉ>&r‰ƒ\šë¦%–ƒÎ!¨2xLrrïƒÏ¦3ÿ(i>ŠìŒº(Ç;ªìdZã²*_}ÙÓåIq*tî~ù²=É:8Õ§ºÉ.7…SyÒy­FO”êN ‡G/Or¸ZOOÝë›zÍ"ð°Yyy¢OeaÎÐzõ¤B‡U(ø°ð ðŸð³2fL@Å÷˜é‹™KyÈœ ³í“¨H¢ ŸËe¼ZkâA«‰|°¨žò¦sÌï§‹`žÇL‰yÆóðs°°éÓ žÇOÀÖÜ­ XXÞ™á ƒAµO]V5bÅ_DÈ` v±tîVSjxé>˜®§" ÞgˆÁ”þÁ]­2DRŪؔµWU ] ì XÞÁvÿÎTde ZEZ”Œ†”‰ér £Ìð>yµ^I¯W¸øôX#Z6f¼ Y5·äŠx$Ås‚gLŠj\f›E „x,k7óY>ÃA†0Þ~2%LAÿ‘¨z$[ IYN†«1¸,´;mZ$«Å0Üû@¢”~ ÚÇZΦð;„$˜³ìƒ!ê h1aºË|lºâ}¢ eR̤$Æþt („ΗuÙ-ÜÏ ‡aݲF¥‚:¥‡AyÊ=þÒïájù¦òáÑôµe™7cuiQ}˜ÀDü6Yi/»h–‰ üjµÂgƉ\0PÂü¿ÞÅÌ?®õ£è` ñ,VcËb‚d¢½øKƒ0€(cf{לˆZä+£t6 ©V#L*–cLŒ‰±}°Œ% Ëx¦íaêwWA ‚§då—Kt}ØÐb¡`/ƒˆæÏ°Âˆ&ðbû„p§Ü@¢ÕbT¬ÀÝ‘‘ôµk²eÎ,a‹KŒéŒ1Ûñ>å ÂÑHÂg¢ˆu)âS×ÖfL4ÜAÎr'”†˜‰cQ 8Üà&Æ_Jh '‘ña¢ZàãEíæ;”È…û^³—š5¨u|©d¹Öc¾Ôã4§Ê”“0ú®…¹HZÜr>0}•ºvÕ»g$q¤.CÇ_¥)_ÿà—Ãgo]C0iʉà?þišñ–²EèC-µÏƒ%·’ùw§ÅÀ$oñ>pµyå þ«Øc"L>9þÈ”SÈ>ãG{T§uéÞûšBÄ0» àWŽÕæÊJ¶´`Ÿi( o›â²¡ªÂôÀÉÖëªnV¤t” büçEG]÷TÍ2HŠKN¶à”0|ç‚È/©D,qýëÞ¼K¾žEf`^&’AÔujæF~Eã#~gè·ÕÓè#~"œ"娔V·Ê›s^¨ä·Cn.Êxn™•c™„¹{ÏRÝ»òM¢âaEÅr¼ýÌD-åÙo¯tñú[ÄÛÏG[¹bÝ9õ1/nÆ:óÆTåWƒ¤Ð·¸9õŽê+nÁï4è!‹g¦¦PujêÉ*jâ17¬zÁWœ¦ÞsO×7΄÷Á«YNðîÓ¸C¥§ø[«eðlÏúøKñ>®öžX-Ì$Ó‚tP^L¤E¤æÍÁÞˆ°ëûÈ]³ï" €©â¾øZe™Ï ïëSA²™Ô;iÄYkë)Âí¼#bÅQsö™ý ÔtŒRH ¹qG6v¥Ô>è|¬²DæçX"¥ëµç:°íôTPÌ*xßeÜ9fBÈV=RLöMáÙï׳#ëäèžȨ94#[ÊM˜M è8ÃiëB~RÓ¨±BÚ·3ªpk{Ãr6 ‰·k_7ÐÈ“CP ¯ûôˆ(çÐ!ÇØb[“ë5#D¯ì0!ª5;‰,s`7=¬¯Æ”2õ÷›;`T.™á ïv[Qš‰r0¹D+ß|ÇD ÆÎ %o–Íï Þ‰rð£_I£·¬œ°¹5ú–'d•K‹^°Ï€‚VÅô欦dÇ»ñX ùVôã:Rg2ÛϪõ¡-怃¹#Zù)›Géµ •?Mbç*vüþŒ î¹½ÃAŽòŽª#a¼ÜQK`‘Û²‰ Ùæž­Üº¤zÙ7ØÓ¨´õQæ˜HSŒ"æE€â¤rªÛçšñde‹PD³ÃX8̇Þ>‚â ‰e§Wº@‰h¢é”e¢ÏwUB(»H4õ‡¹³È «ÑAØo_Î(Ú÷';s~c³Øï –f¬$£fœ4“j_þãÐ=núX_WfA˜ìhlÙ®q¾ÎÇÀ©.è-—Šcîx–BåþÞêÜ­o”®ÇŠÉíZÝ'ô$Ÿ×÷*xo/|œ.öeNÁïÁ0À§î«´ƒ ¸¬–ˆŸTîÁ¨×%ÌýÌøÔ9ü3±¾×šY ¾£Åz—‰¢,A¨êø¬5GuÓ~/¥´Äú(˜ì`GÊ Õb°ËA( ~‚ù«¡YSab úû®š h×êLïÚ„‰Ú®ÅV?þøNÍ+ü¥ø{´†ï$ÿ&˜“<‡9«OÇÜzB¸4}/çˆO,€'¬eÈ2–S‹"8Ç ˆßÁ¨çaéb¸ØQÎÃZÞÔ\ñ“”^8¥‡XRzIéŤôð;AÄSÕ,£>©CiuˆÃ—Õa3¤ªÃB]CßI†S‡8(žÔaR‡I^Å“6˨OêPZÆ+Ê¡2"¤:¬ŠaS,1@‚•ëNEšlxsIRmqÓÁöª¨/ا©k‘Høø{ðÙ"%^F}Ìj—8uN”)œQ¾Ü"ÎŒ(µZ†u2#¤ÆÉŒØ+$3"™±˜e¹õ1›Xt&3‚& 3äeBšu½ ëdFHÚ“±W:HfD2#b1#LvOSQfÓ¸“̈¢ÈC7™zEX074Ô,½@%úTcñöã_ö=\t²¡…"™tLÏú‹2\zE¶ô&|K@¨ù)Lý#Àܧ*1ÍX—¼½¾,¼1u3œ™Àư㣠ÍÞ¾åwóöÝí'”yž)ìH Ø ×Z顨*…¬_(f)VÄA%:Âg‹n8\y¸©*ï*~Ùe¥,FVÌ$ư&C|–ï!k–'„¸Å˜ËKø´(x6Kàó;â@nÊ …ëX†ÄÐ ]U©UMDEjøÑ|–…®ßŒ!“¤‹4¬#È;ÇmœÖj‚ñ%˜1x1ËBV@•SçòMöLd]_{«:ïÖ(·õ×Ïv“ Ä9LŠÃ‘SÑ!y=–oå-ˆ(Ñ|0¸ì(ï4¼.â$ ußÛ½8b>¤[Ô zfˆ¾èÅÌõzÌá>‡VZ®½e2µøÖ@fµ.]ªòr2ŸÐ(bNYr©´^vœ(ßQÛÌjVÓÅ"wfêÍ÷9èÑ´^ìj²8ÒØ\‘H½EUÀÝXÆVdN ›’·]5r9{¸>Ý¢¬«›²†îÊ5Îèµð;²ÒRбùÑÏÔM­³wóVóE7k«aúG™X3ÅEDŽVÃ©Ž¡T—EÅÔ§Új¬A˜l0¦ ÈŽžu`{Ùɩɾ¯S2¬•ë7|¢”®&îüUÂEåY1‡h…¦p~Ò•7P–83Ÿ›É¦0%M¼hòËÓ}@¯œPÉö)ŸFA=ùfl¢¯7>gÆ…™tãä…ʶJ”PuýÌmDÆ3Ô0ÏóÒüx'õÃüøªÈ®=­»ÌFÆœ.ž€ÛÀE;q£†hºÀÎùÛ›`Á5 #­ŠB~þµ=M_4×î)èœ 'Λ—qÛö«cbZ¡’®"ÙÙ[µ$ÂlÔíz:ý+Šj̲œ@(æàá[¨Æ$Èlo ïÖá ÍÒ4‹ÇI•¯o¬òµ¬‡JøTùŠ€h7©Œø­ºóATc(FCS>Ó„—‹…_“ŽçA [ÙÍT?–C#¢lóÿþòï:›pO²ÝbM1ݬ†ÏûÜRO5”ÄØîÍ&ØÈÔ$=Èà¿YÖÙRœ°¾5š'Æ7ÖúŸ+¨ÿUöbj8Àzu:'fœ‘R– FSƒàfÏ <”-$ج&›€ŸOŒŠá­7ŸEBy9qUÝ"CUOÈNBåھݙ~¾Kˆ7¿ÓÇÅ0Ù:&aÔMÃy{%òÂTº,ÆÖ÷g_öl¿µ‹[÷þ´ôV®¾ShÕLKûŽùPiÖ—ßÒ@«»3êòS~)ŸÓ‹™?éƒÐùÉÌ&*(8? }ôRvýÖÙ>ö_Šªq‘f1•åØs4óì‰Ç{±°½ñ ¯ß镯rúôW7°wþs{âÑðäÑø ¢1Ic=#òÄŸ‡ix¸±…lêéÆj´§æ²| ¦qž*1Pî¢×*«OÝ Ì1áB õúˆE±ýéøéð¢î¼} endstream endobj 1895 0 obj 4481 endobj 1899 0 obj [40 /XYZ 38.2500000 525.500000 0] endobj 1900 0 obj [40 /XYZ 38.2500000 449 0] endobj 1901 0 obj [40 /XYZ 38.2500000 770.750000 0] endobj 1902 0 obj [40 /XYZ 38.2500000 449 0] endobj 1903 0 obj [40 /XYZ 38.2500000 770.750000 0] endobj 1904 0 obj [40 /XYZ 38.2500000 525.500000 0] endobj 1905 0 obj << /Type /Annot /Subtype /Link /Rect [465.750000 336.500000 513.750000 343.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_member_data >> endobj 1898 0 obj << /Type /Page /Parent 2 0 R /Contents 1906 0 R /Resources 1908 0 R /Annots 1909 0 R /MediaBox [0 0 595 842] >> endobj 1908 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 1909 0 obj [ 1905 0 R ] endobj 1906 0 obj << /Length 1907 0 R /Filter /FlateDecode >> stream xœí]Mä¶½÷¯ès€íI}A€Ý™Ù9Xì99ë8aÙø¿uKêiIýJâë"%õ´öŒGÓÉ*VëãÕû?ùÇþ_¿ïß?}ùÏþ[ûýéË.9YÒü³?~½»ü…-íÏû¢Ìöß~Ý}ßß}Þ}®ÿû}×|àËÓ_ëŸþ··û¿Ôÿþ¼ÿáïõ/lÿèø¿î SÔß9}¯ Sÿ”œ¿ÿïÝßþ°ÿí8b÷ºv2ýÿçÊ2M޳˜xó÷]·JsúúýÛo»÷Íú½^Ry™ìMêÒ½©R»ÿï?w?ÕÃwƒ'‡*5¦ÈÓ"¹á5…­ßSšú¶ªÇ©·eøšÓ—ÊàêCWe°¡O³ÖÞãr#Ž­FÒ2qy³56-´7çupõ}/miC }šµö~4$Æ>”¹-Ò,©Jøó kJó¢Ù®LŸÊç±õI‘YjèÓ¬•·£%2ZïØæY·1õ¿Ú[ó:¸úÐeìØžf­½-EñØz$­Îú/ëð[7§ ¦\«$ÏB‘´j î~´$Åc«‘´2®•ŒE®¾íç±õ)jM¨CÚÌZy;‚â¡õèió4=ÏcëoºsU0V9Î: =áÐzôLÓÖ>­2õ9­¿éYýs ¡O³VÞŽ–žÃ¡?{ §Ñüܱ¿ üøu÷þS}.òýןêyÞ×|ûúë®~ë»úZ]Oöëû?Ö³1Úýyg’C^˜²ÈNÖ<©š'Ù!©ÜÑ%ñúäÃéIzH]ãªx}ò±ùŒí½>y:=yùZïN˜••EeöÓéåëŠæ‡²Öì¶· =±Í´9diÞßžr8üÜ•=±z±±p²p4Ý$Ùé‰ëVÎ-]eföxÿð{†SÂD0í±qgKc³Û^,ì’Â92©IÀQrIÖ?KæùôÖêpš]oê9zÒÒæÊ“v‹®=ùŸ—.wÑÈÐ Ê“ ‰O! ”rÏb™‰?órz’uGãF¡æ}6bI€¼˜™/ ’Èù?Áš ò¯2'„wf(ìñá‹Ý3\º O1Úh‘Mƒ%–DXà}ÎD`,è0?k¨roªk'ÊæÇU¸¼ÛÉ´³{³F× 7.;Ø<ƒÄgÚ•]ûL?SvÆEc’˜öhŽlòö@]yiˆZ°1¯Íí ŽÖÌ ?8c,òÉÂTþ3Vêà{´£>ÁsÖƒéƒßó‚žÄÚ·ä΀á8š0ÌUUh-ÜÜ•‹"íæ‚ïÊXiac(™-öñð X+«XTŒâù8_‰”Ðr ²” ¤.ïŒm<Ÿ£Üã>̰¹2y<8”8Ú.ÂAà dŽ 5ðéQõNŒøaïIÛÏÏŸu7^Ë´2}%ãã ù« “R±%§pAƪ>ÞCl$þŒÃR…9cÃï’8ŽaoÙQ|ž…KûQð_øä>yBOÚûò5jZú•˜¸ÆÌAÛj„ú¡ÎãÐÄgZ#öl&–€M‹ù:™‘ãuW„UžÍU„”DÇ&¥‡yCÞŒß_06G">Äí'¬¤5I‘¤ / õñ†—°°w>ICŸ c²Ùò9ZLjqSO7˜ƒDß«ÞôL:pzb2¸ùð‰SóºOxЪtšÜŒË„Qœ„‚"öCŠ ;Øvwv ®Ëø"ýŒXM¸Hã'›v2Q. 舠"„Ùêáð‰V2âq›×é°YMÂÒ™Ø*œ’p¡ÇË äZê–VåÂ^3É ×Z¼‘˜”6¾FX^ ŒRfF —ˆ4a=µ¾&ò9q®Šª‘’QªAaÖø3^âH²cÍŠ”DªÀÎ÷-3ÂGÖç/b¬Ð´ÙóêP E„2^χÙÛ…-"!É‘fÂv½hi$)ÒpÒIeZtû«°_ z²LžXœ\ g€Ó»qØÏÚ~XýJ£>ﲸ„É'Q&ZžsáK8œÌC^˜>LÑæÄÖ]æWh€ù ¿çc4’TI:9!¢¸–˜æµÏ`Ã3 êRœZÞà4±¬»X+G@žvGãø‘ËÄtrÓA³&t=›FV¥¦ƒ­ ™q“.1XLþ(aò3^ÝäSŸìÐÑ/nÈ(Ó½%`J Þ0Ì™y±„ƒNxñüïBQ&yµ-¯l’á¹E²&ð xÙÁ£a#WHCˆdäbšâѶ ':ÂTŠg€—IYÞbÓa†%˜B¸ç#Ö=Êâ{!dŠû»”&9;€Ôìçé—¦gxŒ‡’Xƒ’À§ñ¡$$%é³M燸nuhò[üQ \¶aÜpýu™oÕ L-)ušôå-Þ-ê cï`©Œ7ñÁH‚܉h#ÙÄÞÀ.o‡X‚ÊaÂ&ý׬BE¹ÍÂÝ`ü…3`xS.Ã| Úu.kn\ºÑV|h1± ó꡵oë`ØôÃl›n­7İ)ë±ÂÂΜˋ`ý‰nU{à 3“"¬SžÍ„Ɉ8 nƒ@Û° ‹€E\‚gÓ±Š1Çå“LŃjR´n-¶n΄Îv1GN@TH¢Ð€,X,?Y‡R™Ì/µY¬Âƒ¸`Jײ$:Õ|x¹êú@B2à•.†®#dÝ2CFŒ‘¬ªuU>Õyºê‹¾Å0 ™L6FhçÊàq  Ðâù‘Û’ñ‹@M-šUãXkŒ„ÏÉ$ÆFKÛÄïÑ=º×OÂ$'QRŒ°'Â{QÒ³ßg;c¶"X¾Íõ“ÝË{x–…)4Öõ©%¸¡Ç‡U²ð˜V¹í/€©¤d¯îÕ108HXû3Æ=W`b[ ˜XðÞãøZÁ&ì”ÌfÕ `›<¹b@\š‡‰@…JÎð$­2’ª¢½ÝÉU“ö…©kÚ2®u]Ï3kdÂ5b_¨*âH­ƒJWy3Vë Øú·éBãÖABsü6­iCô^sk9Ýä‡ZäÚhð3æ sè›&Ej&S¦¶«0±z!º‡Œ¥ˆDÏû"Ť(ð*ÕHÚÒ ·†¯¸X» ÈÑ-´ob`Õ0…Én ÅyÓ€!{Ž&y_CQØ‚Ä Eh¢É؃ó›l óÐ*ùW˜,WmøªT~Ànܤޢ¹\—ïIÀ¨k]³@®d­Ø4&è,áz€9ŽÉð‹Õ‚Q7dyÄ&¦Y¢‡¹Î”2pÈL;=†™b݈b]G™Ã¡áôXóMhyƒN`M&â¿eÃ1¼ðŒûû†Í²ûÏeŒ•ûw§`îõ¦äc§Ä§GÜjAºm³›R”jÀê'¯úúǧ—$qU]>4:GK5TøŒ‡fÕ·iq/hèÐ$c 0µŠ„ôæ0%ìxJâ}‹…®Ì\ç'¸B,D×Ö\OŸ¿;ö4VåÜÛÛÛA%ˆn}œPOÃø¡iL¥œúa`|ˆÚ“ñ…`0M éC &á')† ÅÉÂ?F# S›áÜšˆXiŠÑ¶˜'˜«0Æ8y&p"ü FÊ¡Nž5 Ÿ©M@Å#VªŒ˜„a§0°,æ*Œ°ŠO Ü·–ƒ»O³¬°Æ=`(ï"Âîùw&_ÞMö¸>$ѯºÝ™7TX>Çiþ†‘(Ö] €mU~ÛÌ¥}ÅÇ §ç=:|¸.Mq‹ño ÷t]UÌdm »‚ õ`?1C~BÉà÷øÞ<”Ìüó¤’âÿ°óî×ÎÛˆR3‰µ}­Fes¿TÃði"FªBͪó~EªBm/Ó~•žíîÛQx°¥K~pƬÍlO×*=ŸÐÜð{ðh ˆJ\óß«j…ÝŸyÔÛJî¢Üu=jlÞñä(È;\1Ãô°Æ®¢÷·ð8kÇÌ:8{çõ;oŠ1è Æš úm{£ƒ6,ÕmƒiÕL^º;û°1ò‡¬COí@ªö¡®!Dœý¤ ¨[â3:†®Ó«tšðëÃ{׸€®Ez›îÍÑU‡J{Ä7)Œn†«rÇÃ[º’ssù°É@Z2–,eãFvAxTPÜ[„"ð±_5hÚ¨´6^æju†•‹•r"¤Aè&L(jø3¥‹i7ìp²]¤¤1Lœná˜D¦xÉiUžONGK5˜ ´"‡³Îˆ¬ Ìe!LÞdžX—g.µ¢ç©—Vµ4î^Š7˜Ú8‹Ž1\³€ÄÜûv$†É[<ÓSXÄp|xnU,UbÝôÑ$Ðu±@z&‡zÍìMåTIÚÕTè©Ñ%X%ÕÙ ç—~^5Õn«>FÆÌÅN·^`H¸ ΚYY¬øbLøG™,åN™óÑê—-èú:£µ€c0ÜTrjT#‚_‰·gäÃæ÷p o×W^‚sK-H*݃ ¾0ATÛ‚1©3LÚžÛØŸ ÊN5‰ŠzOØ€j¬}\ž†ŠpÍß.ªÉÕò¡ãÅɲæàõj°M‚Lž’”.tá¶PS˜J¡ù–5NÄtöHëæöHbŒOƒ.­jŠ…­kž¯ÐÞY^UÌÏ×"Ѫÿ“VnXŸ[ã3&ïïÐ5‡"n;“†ð§n¦³ŒviX¶0Ë4W¼ êð‘˜ê×ÙÛɃ­žÔú«TŸ,¢õÕ:v|ÆËu©L‘Üκ჈ñ¢¦¬&§£¤š”Ûá[p¥)ŽFǨlzÎ5À—¦oïüû¸r’HÎ5gnð [€·iÁ\3"]°…ÄÞ«$ò*w‚ŸõN%¢Îgb\6§“z‹£)ÄE[Ø âš»©Žií˲¯‡>ÞY‘ò‘taêk˜ÎX±‚ ŒU@Ì@8öø¼ÄêU©lGP|7Lìß…Å•ºB>>a¬ÄðΪôTdÔv¬fk.X‰eÖÏï$Âh’ˆ®ûšñp=7ÄýsÊ ÐØ] ÷–Ô¾ÉÊ'¦îˆI¸§@`íe×+LŸ×Äe,u¦Òé8°lW¼dÂ5kMá“B<Å€×ré|öžp[äƒ#þv½b‚Ñ+^²„™›.¾sìÀyYÖ?7؈A½eéÜs«ãGcrt³‚î)¡!+R5.c®f!ST¬ë/mÍÚWìkY£kùÎò‘2ó„•ztCŽk¸<ºeZõî Ÿ©‚1 S«Î¡UÃ$¬¯y'¯Ý N(Ú'%\ÕGøäCèeWÎ6Óxû&tòe6 &¸yk’¼š»q±ªºÉŒ”j.˦˅Br‹©6çš ‘âZ›åÑ­Íg;“(ð}á‚‹(Ã@ØTq0SÖ6Û>“C^˜¾öÜTos1¶{4ÇD# ÉD{ÍÚ†Âõx ‹,×õ÷ÑzÖŠuG’œ©B˜,Ã[ &Mü´ÊŽô(5X°]¯©RŸ†¾Ï3°Œº(i¹6Cðl{ÁiÃÉ|ÿ´¨ú³ðÊÎÄ9¥?ÚBè}üžåaÚ#š;šOMGx‚ÑpÃn˜4œ[EuùXCíKfÎ߸}G¤º‚¬èηÂ¥ä jåz÷¨ž|mVÍîtŒy4u³{XÛèíÅ !òBÖTYÍ]ÞuETÂRµ¸øÈ1Eîx¯™7ã[0%-ÍÕÓ»`»zJó©F\(Ö[ H[Õ“r/…S.Ë{½´^Tí×_û﵌EÈç©?˜!cÊk"ÆÕg/1GàÞžs äÍfñÅ•%6ÊÊìI½•U>~ÒÞì¡u@^l2NØ}FïqS–Öµ¹}jWŠ| Ø¥›6äã¶<‰,æÉ+Ë0x4ø™–[×Ò/Š~X†;þ\ϸ#4œ9&4þŒ@hÌÒx‡^{bŠ˜C ¾X`›røb¸·@Þ3ÄáˆyœçJ¼)7ñk‘”ÓP¡Ç¸XB]˜…“bûóþóîÿþxBŸ endstream endobj 1907 0 obj 5040 endobj 1911 0 obj [41 /XYZ 38.2500000 693.500000 0] endobj 1912 0 obj [41 /XYZ 38.2500000 324.500000 0] endobj 1913 0 obj [41 /XYZ 38.2500000 693.500000 0] endobj 1914 0 obj [41 /XYZ 38.2500000 324.500000 0] endobj 1910 0 obj << /Type /Page /Parent 2 0 R /Contents 1915 0 R /Resources 1917 0 R /Annots 1918 0 R /MediaBox [0 0 595 842] >> endobj 1917 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 1918 0 obj [ ] endobj 1915 0 obj << /Length 1916 0 R /Filter /FlateDecode >> stream xœí]KoݸÞûWÜu¹IQ (8N.  ÐEÑE‘é´tMgÑ¿ßkKº¶ß‘øù’®Õ MjZÅó~¿ûã—¿ŸþùÛéÝý—ÿœ¾µß¹ËΥϚÿœÿüðò¶:·ÿ>••?}ûåîûéûÝç»Ï—ÿý~×<ðåþÏ—ýïdOºü÷çÓ_ÿvùáí/=þÂ/w¥)/ÿûéïº4—e׿þ¯»¿üîôëãŽÝëÚÃôÿÿ®®Œy<ÅÌ›¿ßu_ižþüöí×»wÍ÷½¤¬ kO&wùÉÔ¹=ý÷w?]¶ï6ÏÎunLYäeöŠ×”¶{­/ûøñkžþ¨l®¾uYºX[?Zû>Œ+Œ¸÷¹*l™û¬®à¿éoª²ìBO×åKåûz±·6(.[Ç‚r{jåëx²°µÙV™±¾½çÔ¯æysõ­­†+O§Ö¾¢xo=:“µWSê_Îóæê[çU´­ŸN­}-HñÞz õÞÆéóæê[—±äv{êH Å{ë´®|,}éåæÚ[›ËÅéÓ©£èKÒÞj 5¦ª[ݨðú÷Þm®ÒÒÇRŽšSkßGÒñÞŸöÀçh~,³ïƒ¾Þ½ûdòGqPœ¾þt9ÛÓ+›¿¾^.ÄŸ~¸(îÞŸ¾þxúýE¹38}ýù®>ÖwlW>Á•´’€ÏähÅy´’ÁÝðŠ¹‡ÏÄ3ïá3p·ÌÂ/u‰îÞµ-á3p7w`ÚìöðõB±Q¹ÌgƒW2zÀ ¿§ ?5–…ï±Ð1a¸:k×½ôc²—–Æv/…P°†ðÁd¶O6ˆq4„^ÑeƒPè tº¾pÅx ß“Á³aþ†ñ`ãâ£tæâ##P’Ù¦‘"`)ýõ¥j‚¥o̳Ç7^L÷¾l7æìó¢z<Ɉs—…º!L~¶æñ‘ Pž1ÍJu®êl°Ò ›?;[™þJÃ…ósîš@ÕóЇïÁÏp?ÏÖ¢ÔÄ÷´2wb·Ü†ß5>A‹î'Ès-,ª]ÀÞG£Vyœøè¬ù“‹Òô?º¹(ãÏYízhÔÚ4S»5el·tÎÝCÔûˆÞc³ðg„÷À|o˜`²¾'O† ŸàÞuÃN\‡á/žñp…xð=øü¥øÔÌí4»UK>pô«÷±I7wn@ºyøU2È9úV[Áæµ|ÆuKK`HЋ È  ø…ñ_$¾øŒÀA}–(`úLjßóa9aP2(ŸqPdè28Œ´UÂ+fžqfpù³¾)4À‚Iß>,Þ #/&S|j†×…õJc– hA«!€L,ºì­]1½‡rÜy“¦ìh—1¼ÂÖu«0©ÛP£I!Ü윣áx)3ƒ XSÔ“¤8õÕ âL­8øáïcsc3»Ø:Ç`pCÔþÀ`…g¹cX¸€ñŒ9}óš#%«ØXÚ:"mµŸ†˜A@­K{ÊÃ6'ö£ë”} ŠÏcâcdþŒÇÀ´À°øÅ”ž0âfØz°a†? ŽFˆmQðUc’àÅvR(Kþ9Äc«q›0wÎxNÇ<“pNdÌ"ãÃ…+ã[Šïd­«¾tÎý~xº \ßÎñ|¸‰àlÅ—C°Ž627¥0z>[€ â3%Tã1ùcb‚eÜØøºTöºL‹ñê)ùŒt},”÷@58ª,® n¦£s2²qŽlbú<+Ó…‡U½HÕRU îÛ¥dðèôDH£Tðåd(¨]×Wµ6*u…Ñ-ÖAâøn¹ÜÍßÊZr.q b©i¬ëÃaÿ]Ž5‚Ë„¡îx9KB¦¬©’ú'\ €þqñ ζ°¸¿'Uq…ƒgˣǟ\V xˆfVs=õJÛÄÕ«k0!ïl¤Æ{8"j¶#Ç¢î35z¦Ë¸vçr=ŸiÑsê=ÏÞŽÍ×2ˆ©•íÖê*ÅÙ;àÍ Ê³ñƒè=øÔø=Â÷Ààï `áÙð½=À/ÅïÁÏ|‚'¸MøD×Zjkûð˜ð„²PÕ§ x ÅF°°éšÊ¼CN7ª¨Ëc²^#§0Œ PUàcû)4,blÃâí)?¯ªßšñÌê$Y'J̰z(ïñrÒNÝnôM†é³$Ôõ¸„U˜ëG:SÕcQ ŒñaÌaS©øHÕ¶E–aufËu <|ŽÛ`W@HÂu–-x2 …ˆ:›*‰/_7 'JOMTŽé9½ ù@bS mTCö‚Š… ’Pÿ’%ïü«iô6f¨0"tFexH<ÝÐÉrCõP]×W]ãûìòAs›·§øÆ†¦ê_ò4jÿÍF!%„8­)ÀjL ¥&H â:¤Eç¶vƒ‹JkµÇEƒ 0F¦e#îÓ…;^­RW pŸ*ÁŠ>¦lBIË‹1 ×iܤ/!…~Îs—j|VÌs‘‡xHiT!QƤ’OÊB•{R0¥ŠBo V r=Ýr¦FåwòÉS»}Dø°Z~qÛD0¬ûÚD‰ãÇÜÉÅô‘s+³¦aijLZÃB¡æaj£ß2ËÍ륚K“6±˜á£±û¥d~pÁ¸_ ;©DO3Æ-G‘åÉÖë+$k‰l›Yˆ#!LŒD7ÂÏ€ŸˆYäIp½„ìçn1°Æ&ä²ëì'7T*ñЦº³ôÑô/A7#I¨£dÚÙꦪ%ê‚Aµ–éØ`Õ&£­º˜5ØŽl%ãÊd|×·×u{­¾™ð¥nU³9TñÇ+V ¨›As-ñ]aò6ž…y8B l&*¼‹Çpã¬1œió¼ð½ ãŠ!´…1ÏIÒø«Ì<Ïš˜ãi)HÞøjÖ°ÀFC"‘ã|gÛD%¹ø²œÇÖ¹•$=LïX2nKF¶ÞðJ†Û¹á òp7 Ú›Óžtu¡ °'¦°ã<ïkµí¯mƒ£Ó4Ã/r ª»7î)pý‘@B‡>Æ#Ϥ‹áH†JØ7 :n">•ÅC´êÀ1ˆÙ|›È]ʲO«‡¿iqàÜØÃM’Kó‹òZ†TÒñ¾Ô™)‘ç]RsK˜dhÝ.ÑL¦@4ð¯âZœÏÌàßÛëRž(#Jþ`šŸÇí6wäoì/Ã]ɪӲ'RM*Z?ˆ—ÊEf3{gÓál’ñ€IIË’ˆâ:hÛaW™àh*¹ ¼‡á‰ÇÊ!ç9·¢+„ÛsÅ´\M9Ôi‰â öÛ¦¼&·Q¥¢œÖ‹?Ë3\ƒK”êh…WžµW¢×N”åÓ×*paÿqAÈžRCCùœÄ a*‡=I|.Q“ƒÞža‰);_ S¥Q‡$j1§µª §ä øâˆ‚Ñ%#ã˜ô9¢¦‡©Ö¦*Ö”¨6•b}QRµÌ¹5§2ƒÎ:‹j€°µ£GÝ«¬ËÈ-ä;‹W¦ÿe²ÀÁ5‘éN'Zý=aªˆù–rK£ MÙG-a ïmVF$[gò¥t+Ä:°‹fõNQL°¸ï꿹2ب=þÜR„§ú¹¨ÌÉÛì†jÇAn,7 ›Üz»Aw&r˜‹<¬‘ä%‡ÜVO—˜–†pðÃû9áZî£]¶Åb¹”Q0Î^#~Âð5Ê•¦ÚpW7í…ê£zt;f0S äÎݰ_“‡·U/L6qÖ¬œŽÆð\~†{ô´ƒÊÖ³¨Mé ŸÄ$ÄÜ FçðT!bå频¬NBÂgpH¶Í׋6ËF7Öˆ/R·ÆE7‘WWœ2i ŒµŒe‰*:3±­ƶ¨%¤&£[¼Pŧը²º<âÌ4mø=Tqçf9`ÌÉye=Žk=X«L'ªº73u5 P 4Ä1­[BðÀ®‡"DÕ"€¹™áÁoIªaK/'tq&µ=7Qî!™ÍH6žf †´fÂÚDÂc2bTEg•œRÊÓL4<Ñ¥~ª@|Ã+k²ÖŸ%¥I1ÅÕC€”¤ƒ‹ë$$×>´`e5k0@Re»*²=à$LjíôÍ3ÝYs-¾û.ïF†o±hÿÈŸZÂWy5¦ lÚE¼À/Ì™® D™¶-‡˜—JZê¶Äqâ=”2Ìd”ô0¥6Gꉕõçí*Å7²µ4ŒÇry«‰um#¡MS‘•}Ñ ´i‚•,ž½hÃwf/ªÍ7D’²(óþuÄÎEë‘Ý´ò§Ñ±)q+z%6¤-J÷VÝYLJß|>:> endobj 1922 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1923 0 obj [ ] endobj 1920 0 obj << /Length 1921 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`<|év^r0˜rrf³ ÙE:{ÈßlKî¶å²>iJÍiÌtÙ¢Šõ®b±øþßþ^üó·âýÇoÿ)¾÷ß?~Û©}]ªÓŸâðõîõ¦Ù÷?uSßÙ=Ï»¯»¯Ý¿Ï»Óß>þ¹ûé…)þÔýý¹øëߺìéð ¿ìj]wßÿ}üÞÖºûI¿>ÿ×î/¿+~=Ì8¼®æòÿs€bâÍÏ»a•úøõÛ÷_wïOëŸõ’F—•+´³Ý?­3Åÿ±û©›~˜\í[§u]¹Z-xMmº÷è¦-´iUQVåè5Ç/‰ÉµøÔuiCM}„ZÚVÚ;÷¾qVÛÚ”î@Þi˦{´ ÛÿY²¦¦(Q޹i)Â^&—žÚ¨R…"óji|ôdÆs‹I®Ñª—«œ8Þϓ˓ԩ*ÔÔG¨¥ñq"©gn9’º²¤º{™8ÞËPRju‡¡PÜr€Z=IñÜb$µF÷‚dªJïçÉåIêê&ÔÔG¨¥ñq"éxî¯3æÀpœ>nß³çÁO»÷_´Ó«âé§¶ã+Oßž:„”Å»ÎÙëýôcñ{¥´ûCñôó®ÝW¦œ±ŸŽ#ŸŸºÅ†´­ªk4¢> Glgû!€Ï`¨Õ'8òŽüßÓÀgZ8bæcããÀZ8°å‡hlYy¶$FÔÇùèeÈèyd$Ôð™3„¯3’¢‰aó` :V(p=FÈQÅlk+-1Ö¹R¨¢7GS¸ÒÍÑäÍÑ®›jÛÆ3ȶ\‡C[•n  Ø™ÃZZˆ-:´´»!Àë!l}êNcmc;'VB˜ŒÇ202 ÒQŽG˜°{ ©à ˜Yl ,TÄ&Oø=Ò§Ä\9󳞕šjLŸ·ƒƒÌÉ»l­Y‡ËVk}ùÒ xk,Nai?מ8Bë}骦._ñ׉óš}Óª# /#'tº½³§Ê‡k[xë™ð8[osoÍF¼G+øÌIúš—_…ÓkŒfép6ÓÀgâ"2¬dè¶¾dÇÈ*2  W^.ÍC¸ÿY‚^öjU?°ƒ`¿Z‡£Õ¾ªõ…õøu#N›‡ANåxž‘NÞ žtkÔYŸŽHB©„V–úT\Ì€ÄÕeyI]*ÖÜ(1Gë²ú"¦ñ„Î?Üm«(•t¿)¤‚Æø§HÈæ"ÆÀâ,ω¹´Xô\xBAÆ21ci³ÙŽ©”zëÄYÂ×É#ŠÕ³9'k<¡3+¢.£¢¡p©®Ê«ÐÉ^託ѽé,®ï{UÄ®™G cî‚8Ç‚å9YN œdyü. “$Àö;\üîVÈXM+}ŠGڵʥ…= wÖ¨ÝøÙýa*¦À6Šá!Ùú!fó W=E*kŒ›¦‡ì~æã3£ž¥ÕSa«ð¡˜–›i}ÉÙÙàpÎéý{ÄTæc)eËVwÌ™„©Œ”M!­Ùµ~`ÙVÖG\’+Vé‘©ÀC˜Çû?ÁMã¡QÒ¦M£ìæ ÄÎ)93?â)Æa6|æ.RÉ•©Â1&† ¿‡©ÖsR’Û B´²¹’Ü–ˆL°žÄ³AMÝvY}׺«E?Þ8lLaò±DØÜd{•œÈQʬm9"“ÂXH*6HYÃKíò°a*O¹‡-ìÅ>èÎ-8VÙJÂ7bZ7—ˆ.¨–5‰"›À÷ŸïšS~%v>}"#^·ƒgKÇ #ÈÑΡ¤W9‡—îáQ†ã™6-8[]މÂÿ»Šñd¦çH¤%eu˜9­üÆ ‚1úD7W0°Œ%vud.£°ø2E¬²f ïMbØf$Ùq—î|¹_®‚‡R¥Õ—Fía^ûÁ)=õ—iíÐÇÓˇaÚz\OÜ ·ïIØÉö´ Æýª‰ÞQÒ‡êD%Úü0$>‚;!bÙ†ÏP-ÄqÇy¬˜ž÷„,x’ãõ°y´e\-Å•C³³XÆ(&¥L¿]|µD¾¾!£õŽ&Ç©t%x£ÒÅÔgcÛÜÛx€6C¸øøÊcnç²¾Î#›Ôñ„îõÌF\ ¦bla•Qj¸º ÷•÷äV™Ûð@­_µQf¸Š.–•a|rOç\Ñt`É#¬ öˆ1ǶÄc³°ö'Ö3i™B×Õ › §ù£¤¤ÌÕˆ{6ñmT«Êð¥9¶½D‡ì~ªÒmFí&>*<£éÇÃ6•™£;½7Ò¢V¦ù¦l—ðÍ!=\p¡txu0´#ªž¢ŠLÿòŽ[¢{²}7j‹dÔsØî;2@U\‹vQrÐïÆùý½=Ö,RÛŽxå5FÛá®î^ÁÜráˆ'¾!nܾ(žˆÊ’ÙÌž—;—æ9t…Š6<›JÄ–Ž'­(Ë.jÚ&³Ò(¤¯Ý$éãÝkt{>¬‚éC¤Ø=â —-[8àIá{ש¸`Ú·_i F2z:ï>Esð*¦¨àÑHx—óã˜ã±†MEb™cøzUºG&ž"6U;Db‡Ùi´ÌΡˆ…/–½Ž_lÏO4M³€)VÉNU­ª—H#3’°‚Ä5=YﬢÚr¥8 ./ŸTOóœ9Œ7bÄ[<ÏÛšjš]DGJœX[¥RÍÌÇ3Ÿ+#3ß$FAHå,.&å{ùÒíxOqúVg‡`éÒ±ê»þÂ2è©õÖkü¦X…,ª«Kt<¬`f+u+̆ùšî1žq!£…ˆ®fT«²ÙmkçõðÁË`ê\DN‰`HV5—J—ÉxätÆý<±*„Dº—3Í•F¢…m²zŽ©bš#tÄ•lŒ`z =¾è‹Ò’øFÙ¾Da»ÎÊ\øðbÃuUÜ>¸;cÈæÌÖ^yÆk*—K¡O•q­¹¤ì­PŠÉAá²¼\H'\‚!ð¤âq²¬ŒÆ|¥ÖA˜/åìSÊç9'‡aƒEJL‘.‚IÅ았¥‘r½] ú-‰z»Òë…V©]…#Ue žj¿NôŽõ¼‡ð«’p'«—Pñªk¥'qà±§8QÈd©e;üæ‰(·–ÅIjá€0í¸¾6wÓžƒPÄT|ñ•jmÏ7FTªõ91°Ê$YÒÊï—l³ ~Vë«Tëí’€}^4ÎJ•˜Å°83þ#%:†•… |xÎ! ÑpÍG4»V¬FŸ»‰Ås²šò|y·hÇ»\¨§â²DäÑzº®“jˆ“ ÌõؼcSI‚NÜ0ñBˆ&‘Q˜¢=g¿rÄtVƒô­V“¤/´æ\M—Ë2×jÍR(ËlÝô!ñˆ^ZÛT“TÈm}2—Û ÆTĶs§‘¸µ¢HÑâØíµA´†0Å ºu$+nI1ÂÖ*e=²W¨rº9¦kó`Í98ü|È ó(SˆŒg“-›e.mÌÇw¦{ûEQÞ•™&–èÈÛiÄÈ(¡<¢²"Ž©ˆs=ß&Õz£ƒˆæÖ¢ê\Ï€mM­c”ÙQc®KeXÖ‰ç*ÄDŒ‘VÑ=Ȥûm[­—\ãogÈê—nƹß6@¢·ß¶}¹:/È­÷á;5®©G2Ó“¹àÖÞ£ÝÞè{çÉt1Æ´%Ð5¢†‡q THlOsTXÙ6Þ+m›Ê@°Ê;ÆÓ¹¶›ê¡.+¦¸K*sQCð§¥­.-_6NØ›Ñð“e4‰§ë8cÀá3²*‰¹áí)¸ÞKŸ…s}YYGkU­‘ã5@¶ÆåнÿÌJ¦WìÅ:`€“PÌ¡„ª‡Lµ¤–O¶ž„9ºÃdZ=9>œÉ‹WIgš¡’ŽÊúˆÊBÄe[uNÕl¬p£ê)VJX()Í“ðýØ%`Yà…Í.£•‰¤tÚíâ­5ç¦TYqqæ=+îÎ ‚>•Њ•PµîÎÓR€hì!=¯ž¢±^²5í9dþx$¾¥ζÓ÷Áqºž¤\ÎWee—l¢ýæ×Î©ä­ 0R8r#w(¡òÜœ,+¡ÍY³¬Uλ¼YÕÙ}ÏŽôªÐ¯S¿pG5VsK¿Zm÷JŠ4ŠsŒþ€Ì­JŒ…êe'Ãk†Š×÷Tã‘^N̾/y…¹¸åÆ{ìTIÛ-ؾô+Eu*øÎx÷’‚Àê~é£ö ‹ÔpéÑeh<|¦gA=k鯎@° wøY/¬0rLhüŒ‡Ð˜¥1†>#öÄ1‡‡hxøbÛ4×/†¸ðp ä=M—g˜Çy®ÄHYįµjöúD… Æ…ʨ׺}J¯_wÿAäÖa endstream endobj 1921 0 obj 3669 endobj 1925 0 obj [43 /XYZ 38.2500000 245.750000 0] endobj 1926 0 obj [43 /XYZ 38.2500000 245.750000 0] endobj 1924 0 obj << /Type /Page /Parent 2 0 R /Contents 1927 0 R /Resources 1929 0 R /Annots 1930 0 R /MediaBox [0 0 595 842] >> endobj 1929 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 1930 0 obj [ ] endobj 1927 0 obj << /Length 1928 0 R /Filter /FlateDecode >> stream xœí]MÜÆ½Ï¯˜sØd“@À’Vr h‚9N`DF6>äïgv†3+’ójØÕM.—lÉK±»XU]]_ýúÝ¿ü}ÿÏßöï>|ùÏþkûû‡/»âÊâüÏþù×ßÿÀÖ‡öÏûP—û¯ßvOû§ÝçÝçãŸvç¾|øóñOÿÛÛýŸŽÿþ²ÿëߎ?ü©ýKÏáÛ.˜püýß§ß›`Ž*®¿?ÿü_»¿ünÿëóˆ—éZbºÿÿƒ7¡tÏTÜ™ùiwùJsúõÛ×_wïÎß5IíÊ¢ÚïüÞ4ÞîÿûÝÏÇá/ƒ‡Æ*Š ÓûQ­Íã*#Ž­'Ò`Ù5Öuæ\×ç{\ª¡OTkó£)[M¤¾¨Ò­ÒïWÚ„T«ôLušU*Œ­'R{YHeݨ3Ç&[¥¾6eª¡OTkó£)[M¤ea‹ÖðÚZ›9/ƒ«ó½|¶]‰†>Q­Í³H…±õDj›¦i=ôÂ&óý2¸>ßË:¶Iªö? ;ÍwþíñÛÎÿçèÑY³üiÿû¢páûÇ_vÍ!TeeËuç'¶9=©uStŸ>y8=)ÎÖfì;NOüÁ»s(õò¤<=q‡ÒWuè¼SŸG3H'Äâyà;æÇ>±®ÿü®ƒ”x‚m /ðc ð<Äh‚"ª(ÔYS@±ÔpbBu ~ŠÅø<,hÃâO»¢íù‰1—Q¦™,Uͧ(Àó ˜‚yNhñÐeéÃãq‡L´»5¦»½1K‹±’Îô¾Õœ`ÜE #†$Õg%6@JÑaë‚7$ü]øÆV ¾x¼ ‹±Á}Jüƒ–o  É¡<)rð]î6‡q“ó#zÒ2æÆSÁ'xç=|â!m5|¿´•Þ-@ Z]ˆšSíÞç}ãî’#Æ+¢‡Í;ÊËg¼Â3•CÜäÂ$[¼#Vôøj£@,îÕÁÒïÁ îö`«bJÌD¿®‹¥5LÉ3¡¨îS©êÍ`3ƒóf‘Laz,‚Is¡X‡Ó¸ôGTp…Òß½úvB%3uÝc!³lLâ;mµäÖŒí˜#–Íओó u‚<á‚bµÜ¶‚‚;ÄÎèäN‰¥€ a„ð¢µ<†8§Ê˜ ] JE‚¢nÙx)ÈÆ|Ò< xfLí5},,“ŽÀ¾Ð#GìœõG]¼Ìˆ;ˆìL»†Ð¤Úϯ*øxÜWŽAßÒž5Ž8¸ªûÅ h@ê¾üè£ÄÇý+×]‘+ SB”=£F5Háæ-]ó@€Ç K‚Áø`Œg–V¦”û^å»:’ëìþÖÑNžÚÌÚ ©Æõ®ÜäòýÕ#%œ"ਖYluU-µ" L±1Á†w«"ulx&£>cx&‚çC„Yý]Õ墌ÿ’Ê30ÌðJ¿±i\,RT °t¦·®äPv.À"É!Ì3þ†¡¶nÈ #¤’ ™aüY›˜CØKdì¨z‰©¯;a…2.-Þêað“µÄZ–í0‘/š ž ìQY>]x~›’…Ú=®¿b¨¶ækðÆLi„ wBŠ™èV’Ïx¢/ÇÃeæq£|âñyµl%Joœ ú íY>®¼ºÝÌ] 6z"§îì jDë Swx{Ž€jYK\´àÌ uÙYÄ}K<<{âʧmºªœd»H¸mU÷Ö¢®ž˜T+CÒÐDШ‹Ñ§ÞEdÂÇ'}ç/I¹ …ÐSý´µƈ- %Wusíé•+u›Ó¨~æ¶Äýº–Eeî"ÒÝãÉ0gWòF@‹ë¶+ÍØiÔTUokÌtokêkb2á•æº!›{Àl§™îwϘ|·Uï³·äû–|¦:còÝ^ñ­¨;*W†‰•“ñ“Ð¥¶JÉ«”¸+NÓ„»d³zÅvZaIǽ`kl%š‰×£ðK(ñþzLÒ`Ç š Z†¹žqó°=`´JUØ °° ÀgtM>Eº}݉óãu#£¥«KuE–%,¹ H €3qßÏâè'2û)…V’Éqƈ¹\êeÃëx_'Âê]À˜¶Œ.[YL‰>pºIšXÁ‚Hì \«‘ù^Å¢æÁø/ø‰@ϧävJäJÙB$º ;ÿ¦‡7mnÉn~B…IˆK×,ÊÈ—¾—wÉ2i}ÉS`,rÁ1Ãö£”š(¬S¬UDXÁX¤ \|çu"3÷ö``üÿ OZ 3—ƒNY$"HÅsx»3e l/mÁvïíªÏ±‰WÖÜWŠÙƒü%W†pÎ.W´;?Œö¢åÃ,@¤,;ÏWù»Ù–æ¦âS<Ž;b:c|Z•Sº¨^'ºû+U—ŒJ.5‰ŒI‹`.IÌù«Š‹Þ5—ìÕ¨†Ø›Ws|@\P¼äxAXÛDà¹pŸ/¸ò.9¹úÖ©ÌÞ(aø²:/X€ÊJNPÀt / ¥Ÿ²d¶0i} pj®¿=âæz Êì7’©¹˜ŒÅHf×½õc€Î@a$2‡ÇÃp Gx ( KÄ N]dæááUQÔh.T¡$èºq(IçµUÏ®*k3†Y¸‡+Ö »Ð³‚¯àü`Ê=Á….;ò€Ø'̱=o õQ8V ¬ð6äy¿#ú*®ôHJ‰Í¯]¯I¶³]C"¼ƒ-ã<1eÌM/8|˜8iFÜS×Ýb•o|çDyåX¬ „~¦[º”7l&2Vå›îŘ1*m$‹GË"8?ôáò.v. ññ¦_t‚Åßi}¯ô‰¾*¤Qf[Äv­Ÿï öÆ£ŠÔÅ÷ÀDDƒ÷”5åŽ]•]PNê"ˆ«º])æˆíeø.ñ¡:a¾Ü0ŒŽ°˜È^pbˆ‹©„K㎧\FF1±›£š›YÝ· ¯‹¾óV£p"ð<âªÛ\(À+•/dò6ß\ZPð•‰V„»=Äq=\Œ{š©ÏG·C WÝ5 ™J tÊ­êxik4G*wŒò™¼­ ±1Žj¥#’êBy §´­4(`Ò Ù²Œ)Ÿ¢ü-Ý.Ù¾°kÓ=EªYinßÛ}²ÕÅb´YÜcdyN^¨,v×fÞ©á; z§Ýjze˜¶4pc4ÓÀ'çEQœ±=ùãÑ®>Rãº@ª Ú3ÏáàºòRðøR8š@Á=^§ÞßNs¶Zt^~Æ^±`°§\k>{_mâc¸T„ô¢;ãOià;왎$Ý>a¢¿‰‰™¨~{Õ~ä¡ÂÜß­â̬5ÊŽ(…a¡ã¾ÁO¼g‚7â_¾‹vË¢t]EÁël튀E Œ6ÆÖÀ˜$…»g®¿È†bUÁÞg"¤Ï Õ3XñŒs-Í|6eј bd åsÁug\ ÆŒ0(ªO²­|Š*š™ HKX%ÆNÁÃ¥žàò*qÁ6vÌ%$ ÕoK]üÛ» ]€1Uuß–"U“î)dpPgGYfðp7Eº§Hõ”»™Ëá•=Ü=…·6Œišñ¶('0qÉQ¨åº MW¥Ly(z5ªY—©·ánFH[{§Ë­ÑÎ6ãVM@÷x´F«uú:1QÚ¼àü(¡B‚à¬nO½P„H|ºb­™øñ_Œõ‚ÉÑSÁS_O¹•TMo/Á&PuÑ-Tj~èZfé2;ànyy¶0Œ€Ðˆ6¾©L¨¶®m‘0ÇTt;ØsáKdxp9¥ÈºÕú²fìžAýyamu»×,úzJ™w«Á­R)|1¥˜»ÕÓÖ©öŠ~º²²Žpë+©èퟎ2Uàó½¿0"fªoÞ dÜ¡0ÏNööria‘ÂÎt‡1ËÙá· ·á¨†OZ]´‡ªॽ°ïV:è#šÇÝ —oÑö©ýÒ!ŽÄxk¥ê_H* ±—óAƒl CÄÑøÏ0x4øN~š¨Oÿ!ŒU¸ç?)¾RŽßUsè©'–ø@9¡áAàÄ‚ÚÔý‰!/mºgˆÅ%| Öq^+1S&ék(êÃùt_Wq¡…jŸ´¶ýž]ßÞýÀé@‘ endstream endobj 1928 0 obj 4183 endobj 1932 0 obj [44 /XYZ 38.2500000 85.2500000 0] endobj 1933 0 obj [44 /XYZ 38.2500000 506.750000 0] endobj 1934 0 obj [44 /XYZ 38.2500000 506.750000 0] endobj 1935 0 obj [44 /XYZ 32.2500000 232.250000 0] endobj 1936 0 obj [44 /XYZ 38.2500000 191.750000 0] endobj 1937 0 obj [44 /XYZ 31.5000000 233.750000 0] endobj 1938 0 obj [44 /XYZ 38.2500000 85.2500000 0] endobj 1939 0 obj [44 /XYZ 38.2500000 191.750000 0] endobj 1940 0 obj << /Type /Annot /Subtype /Link /Rect [215.250000 514.250000 255.750000 521 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nested_classes >> endobj 1931 0 obj << /Type /Page /Parent 2 0 R /Contents 1941 0 R /Resources 1943 0 R /Annots 1944 0 R /MediaBox [0 0 595 842] >> endobj 1943 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1944 0 obj [ 1940 0 R ] endobj 1941 0 obj << /Length 1942 0 R /Filter /FlateDecode >> stream xœí]MãÈ‘½ëWèl`4Ì’I`aÀÝU½Àht{0|0Æk†ÇØ^ü÷-Фª˜äK*Ÿ"“¤Jݘ©jQÌÏȈȈ?ÿç·?ÿòÏãÏŸ¿ýßñ—þçço‡âT—E÷çØþýéýÚúßµ+¿üzøqüqøzøzþÿC÷·Ïÿ}þí_G}ü¯ó;þþçÿÔ©ý¯‡ZÕ矿üljuþ­¸þl?ÿëá~süGÛâÐ]?˜ñ¿²ºÖ¶ÅBÏ?Ã,Õåï?ùÇáçnþQ¸ÒZwTÖØ£j¬>þÿÿþ|n~h¼85V©º²uqG7µ>÷£›æ¨tÓ®ø´›Ë_‰Æ•xÓ¥+R5}µôz(S©`Ûr[ZÓ-)¬øâ\—_÷ÆT©š¾ŒZz=ú-ÅmŸœ5ÊÔº´íö¶[[ºóΟùœéÿܵ\ÎuËÕ”ò[1´-¾Uq^TÔŽZx9úM†M‹ÛÊ”Mªý|k[~?m™Š!t£N²Ÿ¸i¹ý,u9HVù ½6.¿ê®HF+—QK¯G¿£¸í“«ú?ðw®gwî¶iÉß*w¼Jô¯-àùwŸEóGàÅOß?9è¼ÕñûŸÏkré²ûñý¼åñ§³zéÔñûŸŽÿqþíñûßÍ©Òå0Àî‰þzRôDUðIM¼ó >±pl>3->Ã5€#ÐM|?xÔê zbàê¿¢²£6Ýê¼~?}b‚=÷¼¼ˆ˜(à´A.~ ¹0Ûha?²GÓ4ù¶Q5wlã¦O ä!ÂÄ÷?ŸQä:2¢£ÎI°Æ ¾<ÁÊ-bVÐí VJcéf¦ŠSU+W—bSå©hLk|{Òq:{²¦³ú¼Véá‘/ÎgÞÑÝ¥N¥­Æ#(/OÌð`BîQOð ÇÖ­;¹¦¸l–¿‡sOjø ;Vîíƒîl–'£º±c…‡'˜l Ÿ¥©§åZ{Ľ壾Ù” [z|Ÿ çŸ LÍðÔ¨RæäèÁæÇ5Àœ`EŒd<ŸÉš/M#¥ÈªV \0 ÉŒ°p±ÓÏ%\p?Ì¢0r&ۀĘœ>ÙóBhûûcë5º9ýj2õˆµ˜PóäQNØZÌC0ÙÝÎrT'Á6¬•¼² {Øž†೫‹ÆÀâã~NŸ\z6VyÒóQõ)^ »\m™kC˜ãÝν&›8¹·«zÖÄ/èÇ“^‡¤¿¨A«Q[@V¥ƻ¢„ÀxJÑ™Öì«”ÔY´Õ¶žÜ~ OcL6GÆŽÝç.Hï5ôúÁ¾<‚-ï)A£-á Ìè¯\¹8œ€wC.%è¦Àòî“,÷ÉjˆÃÄ™ºUñÑÔ¯÷tËkÑŸ]vèô%_§Ú¤Ù…]:ÞwʈQøÎ"HzKGe`óˆq§¢‘LˆPÄÌ™ˆQÀBb@9Ô€µB ¬ž¤‹^ï{[|gM-¤(¢76A7ïM=Ù†Ûí34p³ ¦ŠùwÞjlD0!AúTåúÑŸ˜'‘œXHÆÆ¬õ„Dàëq&&Zîz`•vÆdUÀ#° |‰]ïosR >‰ áá˜RðZ¡œS‰Apÿ\GdØ ûŽX‹i¬sF–ÕâˆwÓeVåX22\šÊÝ"‘òëLÈ¥nÎuUÞz¿dBze²F0r6"œQ4öRV•ÑÝæ20*<äù‚ÓªBø+…ýÐd ø6GaÛ;41Z&S4r<„_Ûë) 653Fh¼:ÐЋW'`.Ä»MÍø ãƒ!¨7`¢gæƒw›É>‹w'üã†ï`_Üâ ÎÂžì•ø sÀC–³›2Þ&ìiaiÃÎVì"^„™Äçç“ô„`ø›>Á„¨–õ1¯Ï)¨ôéX-b%†â~ª|â°ð¥Œ8d@O{ÃHœ9×lbA$†fÔ"ËÜržO¶-1$„ƒ8Ü2:š®TÍÌw0ÔfÃ\™uæÝN Qª”²ãS—áq5_=éIþ> ‚0Ö†È\0.c ±ƒƒt„ß&Sú´‡Í ‰‰ŠI‰-â×ÃëÇ Òæ„\·•ápüMØÝí#Áýáäw ýRJ¹Æsxð>…„¼“]ÜÜÃçÄaÒÈã— ƒ¥ú‚9f˜é]'* + aF¹Å …y"~’ a•« ‘l1€}ó)'‹ˆUsÖÈcB'ž¬‰ùm:[í;x;ûO ¡‘¥IJÿÌt*Dˆ¹ê\$Ž5`xTb{V!ªpÄ–®e®Öv±¢Åp>-U°+~Ó[ÝŒY\„g(¡Qé%¬2J`W#J0Ê“M; ‘ (¨ÆLú3|EŠàÒÌ +muAÀ»Í°÷©&6‡çº‹‹T—½/L˜LE@Â{ «£äšì¥™PDB¥„Å ºl\q.Æ·ôà'Ù”WÙ°yw“žó^²©‘dë>¹I$ª3{3–‰_!7è=ÜH¼ÛUgé6HM7¨]çv™›Ó…ê=TEýþƒ¿¾´š4êP;„ÑÞËi`ٲâm{¥‹¡GÝmº*N6áHåIûºõNßiÐ;=¯RvP}ŽTÌ…åO™q{z|»ø4‚>‡X}2ê‚ccFЇ©ÎµV w4|¢ˆÅ£|3ë†[ƒcíF÷'0 ÷´ŒÛ;yzû¨ñØàþàÖ”ÇÖ3ç¨~3Å#XÚŸ„\˥Ƕd p˜Xz°ìÜñƒOî8ÌÉ/ØÚ÷r9eýü1ŠÔ›mÕk"…%“ÉGAÓ2¥pyb¬â6YÈ8m? Pö.¾¸æiƒŠ¬vã_Bh§B¶ö“¬Vªq—™]$qíI~0‰,`"*Æ›à"h¹ˆœ«Ûº§¤y´Lo *R-ˆÔ-ÓS“ËÑͺ1ŽNQËl á‘—ÉþᦥòáíùÔ¤„·YíÉé4~ægØÍÒ·'q$%ý–ó«­•‹›Yó˜SJ\[ Ír³„ýHo¬®•7D3dÊFÛÜËù“Y*å­\@‘ÂãMŸ-ï.iDج7‘› *‚˜^.Š-FY¹9é[[ð–BB”á|˜-aû£*³ÉÅMÙÛ-+¯DVÔÆ0¶N*¶qu? ƒðe9dkȪ¼ÌµiWJréçThMðIŒù7zn}·¶zL4,Sg@Ôøí–måHy[+tí]×"L˜„¢ÔtYl cå˜ÍÄOôE‚B‰‹O€_âPDž™]¦•xBT&”™Þæç†"©Ï«D¾F£o8[L)•š‹‹d“«ó±SŒékn>G0šÅ/ñncÛl.e.Ÿ°¨ù‘Òòo×;‹2uKJ¯*’~ƒ"7QUŸq9ÈbkîHA’ÒdÙ¡Fn’x¢\8èpw¬”¢LŠÌ]OOx‡(%¤¡ÄU3)…÷vÃz‰'DØs.\¦~·”²²O‘EgÙ-›c ›£mÆpº #ª’Ô«fÖbËxwJÐFš’߃{>Ãaqæd õqw"’5®Æ—”ªôæ*Ó,•1ùv9—8}}„¨ÛŒj/¼ò{êz 3Gá3Óèaapˆ".|FÔ¼ÃEd˜Â@ЍEÇTУŠÃ'ϾÃ{bj‡nzEq5H½¸Ð®’(’õ)ÛÑ´J-“?®q…‘ |ÐýE4ñf1õñ13bQ×ËÛh4 0Q²Im™¬áø€>ÝåÈ£TÛÊSh·|9Ýåu¿¿'ä¼Î©ñ&>¸ú–4Eˆõ–2"«K„~-UÚA2—çðñTȸ :Ñäs›Î "‘þN6F\VIÃDK1ˆ:5+ïLueqåäî~&õÌêøt3ï%Ùi3`PüÍ”-ÑPh2®\Ò—¹R#±yš‰¢ãx¨ûa2CïSOã4l‘ {Ä4¬–fÑãV–n<Û¸«ÿ+ñ41`ãCÀu‹ßYšO–å­ëa8Øzmø¼ð¬€­1OK‘´¥öƒ!=RÆ`âÐZ¼ Ìq†ï(˜v>ÌêbݬèŠøœ³¢“…Ï)æb¬é!‘|>‹tEL5Õâò>Ÿ<Þáƒû!°¯CÕà¨7ÍTá;ÌPèN¬üÀ±õ¹æÞOðŠæ¢ ´pu,¦ªmc_+U.'°ð̵ëäþNÜv eg4¬[w]›å[{4Ûeì1ÇoL–øE³œDQë;ˆ" ÈÀ¥ Lß>°8Ä¢/Ùí“Lê ¾ñ[È,V ƒñ.Ý^ŒÍAãT‚áã=Åv$‹…Þ¼Û˜­ã'Xä`WL>C{­r³€}Æ6 âËwÅ®u“›V·`0œ/pýߥ퉲_ãKW&S¥pƒ-ظjëî8€ÙUX1cn”²n/Ì{WgBÇÆ•‹ÎG¼ðIÙ³>ó=%\Ú.E#À¶¬®„Ñ&ÄTU/.ïóÂA^8°=Z#rn½€`¹09;˜&…+ù–˜ü01 O"oOÚˆ ]?|E4]Ë+Ûˆ›­_X’ªãÁl “(+"â 7’«~T®(óõŠÒJ;aü„JˆoúÌÅ) 1$n.‹z¼²­Ÿ›-µ„ Ž(Ž9iu—ñ½Là Ã÷>^âÈÑ3™è”¹º ‘M4#S “Ɇ²z òÃǤç*?鮲ô.L: 6bjŠ&f…²E™4< eòƒæº¤2 E£ PÌ‘¹E¦M¥8Ú1á¼TÚ<& ‡èçÊšsQ'*U®KÐ:7–U1åUð¾GQ>Àð5\+ Ö)㨠ٙP®2vƒê—•¢„d„q9׃‘€p7*xDÒTÑÜ…½g®J(æ°²†ÕLõ(§ì™R‰§¾IÔzcÒQV)ZL$-.Y”žÌe)Í]·«:€ÏkŸ…Cï<5™òþ?Jõ¤­„Oow{Kùó¼4oøÒœRbw˜Ÿw” ¨i¬iÿd›·Wº¥0„k_FŸÍŒNÝ6 ³§¬¤“se¸£¶³'éRµ£­8Ñß^IÄš9Ú¬N½ãÝœ+øNƒÞ骧¤Ø‹{ò)=„~æIeA¯@Í­€#h`?pWD%*Y^Ÿç¿ÇX"ømÜ‹P9dYá8¤ú){²šCŒÉ{-YaqmÇÈYg—HVmæòÂÐÇd©™š*“½Æ‡Gö¦¿AÈM¦2¹ìH”yBTÌ­€Átð…’‚«±t{ÖG‡‚?«9,n1¢0“­çYêJÈDÂØ%÷íbŒ›G1ºÄíÕ«²—W‰’ºÌ”'.…AßÌýJE*«¿@ebƒz³èÉ‘Õod+H¬²œ@”œ)Ò„­õ©oºÇ¯–)«Cä5ð¦6ÍÕç;Ý2«=Ž •É5–Á8Épó`»¤>3FrEæRå±FËœóIŠÕb'@°8·Z„Ýx}=y5»jZ ‹ºõ1`eY—lmúqn^ÂSÏDªQj»èÙÐ_ü ®ç€Y’_‰ö“ÄÜP$V¥»Ym"N_À†${–w $Kí€èIR"¢[)]F~É$Ác»}e%ñ+ª™;ººœàkzÊ¿Rœ&ȉºŸžèøUü;½‘yî¾c¯,Õ;?½þ6ódÀ•Äô3œ¹™Ö^Г^»­Næ²ÙïWGK¶ÆŒZÕDkjà;.Öϧ>5Ú{b`kby¶.ð×$f˜×R¢”1µ¬/" î˜_Ê&OH Šh~Ÿª ´ƒL:ø!Å¢ñ‰ ?YßAþ ±#ø˜bMur7efk!¶‡nXDÑjD°_¸ñ^„h­Ì2‰25áã"ëb’ž`·(ã²å_éí•ÌÝ9ä²Hå=™4…•APVcÿ´Pü0HÁ]åÙ[*pÉD“˜£íX°n:tð‰²Ø$Êb-äQŸË>*†=W2XÙDcZITôÙöóÎj‹ÙÐÿRSþU¹£«•*Oí¬¿ÿ®NÎõ±ê~*Õ}êŽU÷Åö»Ý¿*{RªÑΩá;fÔ„yßÁùëÝ¿»—ŽÞËÆïÀ´oŒqþŽ5áÆüõðé7÷Û°gy¶»Øþ”Ò(÷•¥æô‰/hŸ¯g&¥ž‚ïô¾¹w°2ÇÖŸŒ¶˜£A,«?Á™&€TÎŽ·jl”p0=ÙØ¡Gœ¨‰gR¹n'¤ò@1©×rÅÐÈF«‹¤3ˆðà­Ž63¯¥À+ ™Â©4@xûUQêeÍJ² Š\Ÿ[ñ§¤4Ûj,è>޽EÖñ” 6¿·H’Þ-æöbüÑ¢¾°˜ LzUY]bÕ’¨h(ÜÀ´†×Z2ˆ°BLD«ÆÀG"¸An=x뛫²Uq[7É–—a.Ï¢ÉMc€±;p´‹™$K36I–vÎ$YVžÅðüo’l¿cFM˜÷ &ÉRÏ™$Kåw &&Éö;nÔ„wÞ$YÑÝ«ÜCñWdŽ›{˜ý®Éß:Ôæ»'Øð͘Ø$0/¾¢'ý’Ëñ†lÀðX˜ëõîÌ,%rÃÉ”;[öYÈÎêÀä$ €dwàǸîí1KÔ¢Lbxó.S÷çv…p ÛÝ[Ú·ÒŽ…Y¶³½zrá˜|“|:W±½‡cÛ2®åá 2 üö”t!ɹÊñl*)fiÔØÒè9 Hc=ÅùßÒ~ÇŒš0ï;, M1gq×ÁùßÒ~ÇšpãÒ[@š¡$”ÆÜ ý!p‹Z²%̽ÓÑm5@&÷ž'\ËÛÖBG›¸¾ÕD«—½sÏjZ„R ”Ù†Ý~Ô=à1tí &«Ì¥òRýˆÄÙâæe3ìÉôòX:½€Ñ©7T™f¼ŽPŠ/5“UVÇÍ&.1™)Iµæ·ç{™Fó­êØbdwŠÒ)e[í ·Àý±:ˆð*º‡ü%õ4>¥fI Š2`–’€ð3€0aûöâ?…Ñ3Ì…k¹Ø¬( [ŽEašëöõm"ç¿Çç'ôué 7ÌØÍMØ(s:_àÏ8êÁ+T@·V1¬gHºc0z Õ ù”T¹×§Ê¿ÏkOó êÇ,1²¹±}ég:õžbiïÚó ¶ùVÓ ö's®ùzá,ÍLCáÖà;=wRQS¯ßÈ–%¸ö÷󈇆#ÇÝ=ˆÛè—øVKêBÜðÁ;î> endobj 1950 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1951 0 obj [ ] endobj 1948 0 obj << /Length 1949 0 R /Filter /FlateDecode >> stream xœí][oä¶~Ÿ_¡ç;+’’HE€]_ ô¡€±úPô¡Ø$-‚&¨›‡þýÊ£Ëx¤ù(ñø¢ÆŒ‘ر<Ôá¹óÜøùOßþQüó÷âóÝ·ÿßûïwßåQ×e÷Oñúõéí/¤9ö?ÚÔÅ÷_/ÅËáéðÔþ÷åÐ}àÛÝ_ÚŸþWÈâÏí¿¿û{ûËû?zýƒ_Zèöû¿Oß­íOåøýõ÷ÿ:üõÅo¯+¯ë¹üÿO•jì Š…7¿†]ŠÓ×ïß;|îöïõ£•- Q©ª¶’Å:üÜ.?,^m%„n*]¾ã5Zï‘ít3{Ëé‹cmÁ¾tÕÔ¡–>AÍŒ¡áZšžµÒbÚßqcf\›é¡–>AÍŒŽžžpi>zêªGŒ²–5ãâìX7BÙP=AÍž¢xm6’Ù4jd¥Ùñ>.ÎOÒZÈPKŸ æÆGGRÇÚ|$­êIZ²Kéyq~¼kLœ æÆGOR¼6I©žû_ïEÎyqî¥mÌHwPsã£')^›¤¶46˜â=/ÎOR¥B9»Ôaï|í'50ÝoÀìÅñÁ¯Ï‡Ï¢-›âùç¶Ó+»oÏ-BêâS{²ªxþ±øcYªÇŠç_öØÈz°{RZôDøøD4ð3wð‰DO”BOª/œ°Iˆ Æ[ùÕ£x?ª‚«Á'x5asìòƨƒwà“{ÿ÷ô;}xn2´0U2 Ó&Lm…aƒ«•šó ê{.‘±@^ªò$/Voà×M}gÊ+æØZØË'=¯\{Òñ~u¬Tc=¯fГ²>=QǺjŒ¾X­SGõQI#.ßÓ­fο¨àò¤î‰ÛW€Ô3¶× AÏ"W)JøDtP«+ç'ÊŸ,o¼ä/Õ”` \DÃ'˜È$Êj3îÂû‚Ûp0üæÔ £ƒ¿)ü€…ls¼ Ì´o_§ÌDáÕ»®T%'¶a×iHÚbèQÌ|Žæ¿ÍeïGÀÕ°-Ã`›EH1’¸áE¡ÑQ÷þf/–:·ëxe‘U¹†Ç¾°KÍâ…P6Ù×Ôr"Íëéî .7tø«al㣠^î—lhvxƒ¬Ž ÒœüøO=¤";·åQÕÙ xƒ)äûÝ€ º–Çö 3)f«/™¦p-ÃPŽÐ•Z@dH²*a'lN×#Ácšµ t„7°5§öpð‡ZtèN‚Æwp.:b­êaì¶ò >•Åž ö†(8ÀA-‚Ít.#@O9ËUüŠ.™Yëѹý8ÉLøIH2’ü'z†;V23 ó»èöT‡ëŒÙ¿G¦ñN èXm—ìïØOúÇ¡X|Ch›Ò,ëH¥M3Öµñ†uñI’É‹ôžhÝu»f0.ž‡ýPM9Áá“•GªreƒsJâ3¯çÙ€"`Žs.!î~|Ö'ÄÀ1ÔŽ"ÌC¬?3‡BÔw´PuÙ\š(ftàMGR—ŽýÊÓvi H6Ÿ7…»™6N¹̓—/;´2–‚•a.qÛUb:V›b,1ò). Å1Ù4­‰l£íŠÚζqûxº¹Ù#MÛ#½µÒc~ŒHºÜïÍØã÷tQ¨+Çjõ…ð™!ȧú­xBê!èGîÓXRQá£wF.s« &P0ê횆¬¹æ’±"•„ ÀÔ)¥´-1÷î°*Y¬HŒFðû fmtp ¥Ÿ ®†O êí-\v@“v@g: “ŸbÜI=Šëû\)Ö²O|_+Uôˆça1y@l.d?Šª.Íg2É^ Áá|ñò×öêr³rÁÜŽ”8¿yıŸÍp7–q"í”Âßí“îo …Õê“$oþ+½Ä‘£[#° ”Y=ˆÍ Ó¥X6Ï„¶$ 'RzS”XOœá[/{Ûõ:ï9¶8Tv±Ä3+ï Ÿ  `KSO$‹Dn_äñ¦c´/:$@Ùjµ¤_‚Òèi±V6ZÛÃôg›s›6§)ÕîlNîasõ°Ô:Z7—Ì’@2«¬õñ-‡¥ÄG,–JÓ[aò((ç6Jð™âÝí³¬ç¶1Íî!Äô³ýÜËÛ¬³Í•kžOx•`ÒE¢,ö,øH¦>Š)›¹)2…ÁZW‹‡…»Ùñ»ü¬S’¡­Z4€`'}Âl™‡9ŒOb`k%—õÛ0‡epêeõ´ÏÈGâŠØ4yO|E|k¬œ•wUy›˜“xÁ±²YVÞ‚àzÀ{(²e.qm«:«èø*z— ›qSÛfE, š"6-Á–1%ƒ‰/ÈLüäöT´)ÇXVÑUô±rVÞeDåmÊj…‰¨¼õ²SO*f!pHêêö|DV·ñÔíæÌ—dSA ±|®4ð×=–úEªÄr4ü…è‚ |—Pi&XÌwZ{ò¡°Í% ?`×Õf• ëkÂ(¤û ×O¥!Íu$]‘Ê—Â’t³Ò@Þ¹ áËî*-/µ‹xà{›­ZkAö:ÍÑ—g›zâTˆHΠ,‡ó_g0°o-'[H¥Š,èºí¼È;°Ñ$Lìq³&ã>²ô‘;–'t›âû´¶sŒ) YÁmÂÒË£'’â5r\iNšnÇÒrÞÏ«›‰&Œå!÷ÒQ-.«ª»÷ˆúXZu‰9ÜsÐI½Ã£*˜v¬¨}4¡¯ ktÇÙ†õÖh}’,F3û 3G*47ì”®ÒH£ G™pKŠc`Üzõ@¹Jš¢ËXæ!xÌpŸDcÖšSÒ]Ë,N•a]/Þ!—ÌqÇÍG(;ð†5ìõZçfO§ÏÄšO¤ø€$ÃÀ+ÛPúœæñ6x=ÎÍFÊÑm6rØÛ• iŸëK¬|œÒ õþ$>?£³\ú:—KŠŒEºu÷^Rj9A ÞÌëŒt&MÙ^sŒ|\o™X‚,„! ïéšEÇP‚|”´ÎâóÊý<òŠá©]vh"ܹâ0âck1Íöδ¡c,Z‹2‹šr&?Kô‰U;²äb%ax/ðñ¹{‡ðÙ<3EòioMw­×¤»¬¼«LC–£”]1Û›s)k“tC¥e(BFqÓY 1±4¬¿#m†í3³’d|¥FëQ–â}’fXoù«†f™5v4÷s½ô“R¼ü„)œ›E‹=ºWZHqÉá Ç)óõbÛÅ £ÛBD¸Èã\EÉ­‘Î¥” lgì«&f}‚ŽùjÖ d‰€Í¨I°XKxyVop1_£¯ZÚa梣‡ Îç£ ÀSKià„Zâ¾”TvƒôJ¬˜Üo†Rc„u̯cèܶcò%ëP ÇÕ:îxÒPÂ]ŽDu·(lYÇ<± Ž®—ñÆÚÕYaY  :ÁVOô™p?”y·Ûtq ¢á(¹D…(ìoW 9Œg³*59ÄôÁ^¶f9Å|à€€2y™ C¥„07ÏÛI=¾®OÆÅ™z£ñ”Q6§7p *³|„‹5«®Fý ã²<ÑJÄÃÕX¬å< L›÷aåq¨Ê%Ö,¥†”Ì P²ºï!è%}f'ýÂb8®ÍÚŸƒ¡¦¥C¬Ï‘ov1d·ÐzëÌ%­B_³ S?¥<[.m·»~&í=:ã%È1”Ѽ\ˆb8fúDó»bÝdK© Åk”zw˜·sÙá{b¤²›¤BÖÖ5Ò8›E¯euia™ûa:2ãÆ£ž¢R‘Ø”R×M)¹X¯Ë)µ´Ñ¬rÂMÀ-]´ÖšõÃ{æ¦þ))|i4G«>vר÷pfpB½©Ö‘P)Ë<¦Š‚Ê É p…6—ÌRÁ8³ÃŒõeýá0—“WŸÄ»Þ4kî̈—ùiÔXºP#p$eì4.¢!¤*eø–JyNbâ¼áÎ|1™£±î¶Á‰iL9|ÇÎÖñ˜¼O4”;’ ̇óʘ$#T¤Lzf‘Á°%Œ·ÝÖ 4Z-3,ábsé!âżø=„Ò,L¬”YŒ"šæshcÕ‰Kñ\.1Š)ç0Xycÿs/.$‚OöÉo˜wOl<ÅeǺÀxu@Z;M¡RYWCYv÷ñ‡B) ŒDqÐ#ÝèK¹ärñÂÊ(nÌ4Ev‰–à4òiXS{µýûtc…‘çõ…Å¢KCy4±*D+ûŒTŽrAh.Ë[õbÙl”Š Â¥Ä<ÙðôzKFBš!#'v(Ä üðc9"ßø¸´’9aNQúø=w„µÐ•·t“4Õ™÷~•Óš“py8nÙªö›eTE®(µkéÁnðúmD¬¼°bÅTÂ,G‚°¥l!‰J«Ì¥túE÷r%I®$qBD%‰­ÇyH ‡‰sx†·ÝÖdXÝ,‚“k2R`±\“‘k2¢ª´´k2¬ÊãAØVl–ç8³YÚ3Õx(Ùìbô°ƒ5˜ï—š÷m›Í·Ýgæ(ÞÝ )—E3š_eÛ?ÈgÚïÉgZ'å’>ÓZÑìÁ‘ÉgZÞöz¦µBÛEpò™6ËgÚ|¦ÍgÚ³â²ãÿxgZ)†Àt }VÖ¹­8;ÎïôÄg©ÇQ„ kËì8Óð¶[ÇYÚÜ »ËŽsvœ³ã<*.%®5è¶_ÅK»ºóåOK°"Mc®A¦„:–â5!SÈqˆH—X¸«ï¥¯ÄÝ;ÇUe7×zFÈfþ¤Ç‚<6ÓŽ'ÙAp-MqÞ£–ê,¯ÁöØï‘²դ+ú­Ï6Øó=‡SPW¶!ðjð3½)¼¶þæR *ýþÜB<BŽ -k¡ïý -–&}úA€SÜLXÍñâ$Ké±€.ÍQt@^ðzùæÌ³¨ ŸŠ§ÃÿÛÛ¥Û endstream endobj 1949 0 obj 3870 endobj 1953 0 obj [46 /XYZ 38.2500000 552.500000 0] endobj 1954 0 obj [46 /XYZ 38.2500000 397.250000 0] endobj 1955 0 obj [46 /XYZ 38.2500000 89.7500000 0] endobj 1956 0 obj [46 /XYZ 38.2500000 727.250000 0] endobj 1957 0 obj [46 /XYZ 31.5000000 587 0] endobj 1958 0 obj [46 /XYZ 38.2500000 552.500000 0] endobj 1959 0 obj [46 /XYZ 38.2500000 397.250000 0] endobj 1960 0 obj [46 /XYZ 38.2500000 89.7500000 0] endobj 1961 0 obj [46 /XYZ 38.2500000 727.250000 0] endobj 1962 0 obj [46 /XYZ 32.2500000 585.500000 0] endobj 1963 0 obj << /Type /Annot /Subtype /Link /Rect [422.250000 742.250000 485.250000 749 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn6 >> endobj 1964 0 obj << /Type /Annot /Subtype /Link /Rect [402 404.750000 459.750000 411.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 1965 0 obj << /Type /Annot /Subtype /Link /Rect [484.500000 404.750000 531.750000 411.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/bugs.html) >> >> endobj 1952 0 obj << /Type /Page /Parent 2 0 R /Contents 1966 0 R /Resources 1968 0 R /Annots 1969 0 R /MediaBox [0 0 595 842] >> endobj 1968 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 1969 0 obj [ 1963 0 R 1964 0 R 1965 0 R ] endobj 1966 0 obj << /Length 1967 0 R /Filter /FlateDecode >> stream xœí]É®ãÈ•Ýë+´6`cà@£Êá5Ð ‰LÀ £r» £Êèl/üû¦DR)yBŒón)‰™¨z/E1†7î<üô_ÿûø¿ÿ8þôñëÿé~üz(NuYtŽç¿¿¿ý@7§þ÷cÝ”Ç_~;|?~?|9|iÿÿýнðõãÚßþyÔÇÿlÿûÛñOÿÕ~øçþKç/üv¨UÝþüõòÓÕªý­¸þ<þ×ÃwüûyÄaº~1ãÿÞÚªªÎ«¸3ó÷ðKuùû_þ~ø©ÛÔ$3F•5ö¨œÕÇÿÿŸÃ_Úá‡Á‹“³JÕ•­‹wLSëvž¢qG¥] q[O¦¹ü•\‰mL™jè˪¥á¡L¥‚cËiÙè4®‡Íuly°Wu•jè˪…ÁÑ(Zî<ë[Rçuly 7V¥ú²ê4ç ‡>5UÿþÎMÜœaÕN¨¬jŽéH½+¬íï®.œð‘Ü .}Ú®¨Ê"ÕЗUKÃã‚I¡±åŽ´.éupy¸;•ìH/«Nt¤xl¹#uÕõrJ Þ ÷*Õ‘*¥L2l9¯Zý‘NÆþ1^G÷ о^üðíðÓ[+#VÇoiv™¯ûñí·ƒmÿÑŠ¾U}üöç㿵«ùùßßþv°'k:ÕéüµîI}yÒœZ‘³Òåí“ð ¾cÑ;ÚÁw4|òùò¤<ݨ…kÓÝ¥N¥­šöá’UÃy”…ï4Ý“ëÖ@pa@Ê‚«›çó·5߇V­„QÌRu=F-óv™Õ.‹íΡ'ªïˆŽ¦*)ˆ ‹¦­õn<ì.•—'f@ÙE7£ñ0cžX}ð¹‡vQÃ¨Ž¯(ò€w<Ÿœ¸G¸9°Á' 5ÕÍóÈ©´ó.Ð}!|7ŠÁVrG(ˆy>o 1Æaîqq"h¼Â¦…9&tªÛ±–Š®áµa¹$ï--@7™ûJÈ€ÊÀÑÁªÀ<¢ò6Ã!÷‡Y›ì] ðà °Ó “Y‘6M3fSÅt S{|?Åc©{a»®JE)ÏzbFèå,P˜>÷ÓÀÀ­À4p¹T8 ŒTÙµæxa{Åê\¹èe–âTÕj,¥uó¨òT83F^lêÄ5¥‡Gïã°„ÆJ†Ï4‚¶OÐzò#0ˆ²Þþ>¥TÁ:caSß=ŽÄ¤#`‡»Ç©‚ÇÙ1x¨0mÚ¬1 â+ccÂTågoø€b•ÀÀ] ®q‡¡£ŒfAº†wŒ…8ZÀÀ'ɹEYš1p·f9S`´luÏ®” UáÉŒASØ­€²Ä0¬‘QB}Ò0æ2B“¨¡”:AÂÀPnSS´¡gM½nƒ6G¶M‰.ööË´|Õåi ÛwÏ=±è ÞVÔ’O¨UJÍUáªYq åœÊg¾_á#œP)ý¶œKW‚H<ãõî½%óÓZ 69ŠºXžÍJh‹+!Ëd„¦ìa˜Ìa2!­(Ÿ¾ D“ÃJY¯ ¨Emîn¶TÊ%ª,ì°g;0ÞNC™ÐÊò¤'–é*þ¿ãà;=é¡~1<©Gáw:ä©NFéYµzîVݹwàhz0)uhÙ<Īùn:nøT Gƒ0À+èoìÌN ÄDåR莑•Vß•ª³›6h»MìE_+àƒÉ•~‡…;W _ZÑO[7¾2ÂaÖ÷ŽRVël7Ô\„ UBàb HϺA‰°ÒmšÙ¬UcTÜ z ãø|™bN+4Áá…ç²çìk2±'p4]ûÂÆêizŒ5)Õ‘Œ·á<Ä݃–œ£3Õ˦”Ó.Œ¢é½T…ö$9&ÛX´’¥lˆ2º€t$Z÷ªôÌÔ\îb¡<À4#p‚LâøÎ¦·È¦eG{L9‘qUQ¥JEKq0 5ž¦·_VW>¡,˜Á0±@Õ ,¯1¤)Wi‰åF ûYêü¹ú’HR©rÀϼö8ÙY@eìÝ…’“rÖq2xº G ¬ Žfp]*xÀZVp?†UŒbb>£ûˆTÞ&OŸIÖ±€ºhÊ#ª¨„æǾl:&.ç!û¬¦ÇPõ®)‹Ê+câÁ˜ô†å–ðiƒlñÁå.‘>1.4áǃA æ³¨jEûÌ$ÕƒËpÂ_µeüJ¨@HìéÃÑ»L #A÷â‹É¦Ì{²Í˜%¦®ß°_vÉ{¯0a‰I’¨Õ(éX"*@°ºáC6•"2)J‹ÄI„YÖd;¿áô•*⌦4%}‰¦B•s|L·PŠ’Ì+F‡P—X2?‰ÉÖÛe¤G—‘„ƒ)D/KùÓ›Îô»ÊÕMnažb¦E]`^ †ÙŒ Ï“ ɉzz[Þ)ãâ‘…ÎîÐ{‡^àV7¢ïð ܬ|ŽÐF ÊdGhsÔv>Ùú²–¦ŽÀ^•Gk椹êTù‡½¤<÷Žƒïô.õ4ú·Ïº´§I3­WêfžàÑzI¹>¹Æ_õÚÏ•M•î6d«Î@ç#|W€h‰ :x—f`€áVÁ'Ÿ‰Ñà)hæ´{Gµà,'Ï…Á ¼-&G‡5²s+Ot‰©’*’uö ~Âí°&;ŽhŠ÷h¦±ZÑ9Q 7åja*c‰Ú¾eK 2Å•b/ˆ*¹L^gÆ|¦E¦ˆèl™š¢¾…dŠ';)#:gÌ~–&ŒáTï¡Lç˜Ø¢\5Ó§ÎÆG6Á<&Ÿúdø®É”Öc‚SøúyrŒ| [ — 'UT˜0f±2´„D¸‹ ØDyäëDÔR˜²bL jñÆcµL©F"¤lý*C¹H7E#– ûŒÎ"¼‰\©lŸ«¯XË”íkâßé3™£Êö©«°7É<éο>™ °ßÐ9í=Á³ôýtç eVÏÖ«áœ)ËS4‘f/\ž+Sـĺê‚å$lÌTwi‘yFÒJÜì™p9P僫híµë&ÅY»eËe°ˆjá‰V¤¤jëD\ÑfÒt,ú·‚ñv,ä²I˜ˆeÑŠa ‘g¸sân‹Â!æÉò û”H‚Û ×Ì–ÆÂÈ´}h‰Ö 2ÂðíÁCvÅ0ç*ÁfjCE‚U¥r•íHêQ˜TÄ; AÐGnÎåOdMÛ2!pëë“Ú˜Î7[¡^É/?#2uâ|–²Nî¼ìaýÐÎ( K)5+"â’)¸¥¸Uªñé ëU"9‰˜«D´ôJÌ$# ‹™òf“tó‹Óve£apmsL…#*e14„1\<}ôâê¡°Ñ',3ÂqÈLYŠ{9ëQuÌo¹—4oé [5Ç–›”õжÿw»À¦¨Uuù©ÔåÓª8VåЉ®ÿà—CeOJ9Ý4jøŽ an'h¿Þý»º¼t¿\–Þíí£Eœ¿ÓŒ†hÆüõðáw‰˜oÓIV?zrB÷(eµmŽïnLíLÆŸ')Å•8ý䡬Xþ Ø3㇕f˜bäT® S9‡i`…ˆ¶&ÊP™ò]wDšŒ¥0q¦t‚ÎcQÏ^*Wÿ&’@¢Œ¹…SE =Y´hh¼lS‘g(2¹Ów,¤€QÎ F¾Ã¨9éB¸îrJßaÝŒùS9/pëˆV£0ˆò¼pÙÚLNœÄÖÖ€¶-J„ƒO—…1 §aí +ŸÃ|±ÅØ^8KÈzZ£!â=UžgJ? µcP¾NéÓ;dd›§ìªÉU“¤4 ©i/\_@D6 Ð.â •ÒýËI<Å Ùg¥«1û”mŸ±šK²ýI™µ­•'—ÙSó~ï»+ÇÞwWÍyß]ã9ÇÛ|ïûù;f4„¹`ð¾;;ç}wÆŸÀL¼ïçï4£!šñɽïª D¦J‘lA YS+áġ⿞]²Þ€T™Ë“õØu<×7é<·e"ÊRþЄ¤ÇÖãH¯K?Ÿ¤ÔÁc:(¥$Q¥ìHUªœ‘D•ªÇ‚âùO½|ÇŒ†0·ô’¨j73•D•ÒþÚ—D/ßiFC4ã ÒK¢úzšXŸ1mƒŽ }fF#:º ûŒ61—ÉŪ€Ž,CÝrÇ×6 zÉf³,ãYUzÕÊãb™ ÄÅG§íDTÖn ÙV…ÞspÜÉNÁŽlé½÷UYyÃ0>Ùªv‘™1‘´¹Ì7¢ÂS¦Xeá¼ËL‰R².ZªVÞf|’óˆHZúF)_.™EL³7žfof5{ãköfªÙ›A—7#ÍÞxš½™Õì¯Ù›©fo]ÞŒ4{“Q³·»ÍŸÃ(LÀr'œ¬ï¨–UÊvUò•UIå/ÂB‚0¨Îé ©fŒ\ƒe†À;ƒ~cüà'´rJdÄH/“2jR\º4c.]Ú9.ݪac&Ú~àséówÌhs;ÁÀ¥K=Ç¥KåO &\úüf4D3ž =—.‡B„¯Ç¥eSEd#O)}¸l¤T‡€IW¾âÖÛ¸ùw ãvêwEsO’wê5ºƒ#`Ü=+‰<+TLÇŠÕÝmo{üq‡pÕQÿú3UNeËʆGgKP”ÍX—h®à{¾v€ÓEW´I6µnWFŸ_®Ää_¿nŽÑÝB )³iݼ\ù>™!›¡qõ hÙh`ZQE–øî¢Š¨ò­ÀݳI(Ë{®`âØÑÐ¥\™Ú+.fv¹c"¬Ý;hý¦Ì-ÄúHLÖ³hèÃ\•ˆ 7ÂÞ%|s QÇ´#¢ Á(3T™pîP®¢å…¨Âm½–Ígϖ躖¤Ì$)f+Ç\kÖ m´Ç{E,Žu|“J¦‚v=0-øÌ‹ªØÀ˜j?'ÓæFt©û݈6%Þr_€\ˆ±ÛnžØvó`eßUÑ•üÁswG™©í"ž;1¸Dcññ;Œ~Ãtd•m]x×RµèX2åÏe–£ÒéÜÐË0BƧªˆ$®¢œ©2ÕY_ ÑæTcvfÕLÜŠ Dº¬Ç¨NI÷²ÈP¶íñ@™úVDwc†ùRδ\5‰û2eI¹ºPÄw×HwT* +Й›éë›6soÍH§Ú}f2gíWj7ò¼[Þy½@ ©Iì³Íf!Çì@¶Ø5ƒ³ø#niÚÖQï¨N›Òž«ú‚?ÞrH 'µ0…÷˜R;»a„ä$éMqÞÁ™‹á€+·œJnÔª~‡DÅDôÿ\Ý¿7Ë“„û1î¡|mŠQ¾¿6j&ß_¯1Ãù/ßÿò3ÂÜNÐçûkífòýµöZKœ?ðòý/ßiFC4ã ’çûkS 'ƒËTÚß^l:ŠŽdQ&oG$e¿Ã¨·¿±Ø–ñˆñ$Ý«½)qƒ2.@YÏ|&·%eb›¡6ÏkË1Ã4C6„B#æºCJ'&/Y7–—ÊbN^*½"ƒç|yéü3ÂÜN0ÈK¶™“—¬W&ñü//¿ÓŒ†hƤ——Êr `‰Ý?ÙpL6½{á2u% ÂÙáÜ•eÂÈx¦—õzÞËÚyE K2"5‰éÎ1]êcŒÓL†h˜e¶f1X»<à(bt~‘æ'™BZ„[wmÒ¡Rõ˜CQUˆÜn™ÈR‰Àå˜ùg½DɤÔÚ?ÓFpÃ…e(ƒ›l…l,LeʵÈ%Ü=hS²µ³v®œ ½ž1¢žGÀ7·z÷wáN,Ï^Ã’¦×·u$ÖŠPÑË“(RE(¿¹ Êgˆµñ¸ÚúY8|:n"ÜS831Û– xm&‘FDt¼ª—×U¹ØP—©ö‹H$&‘O¤90Ցމ“éË–J´=c¯Ì ²®áˆd:Qk,ºIË+Êã–‚Î#5úf®€*&ëËÕõ+mð`6=KVoŒ LzS QÔ×òÂê/ˆöuzSµ÷Á“+ €!g²Iõ÷L§«DC£dFGõ\¹°k²ðõ SŒª°üX†ÉbJ›¾Æ¸hDú‘§®ø n˜¨µ¬¬ãŒ©§žK“-µÌdHàì“’È„l´ªJOâ‘mÅѳßK˜ux’¸ª¿/áCÆ5(„Ÿ«Ž:c¸–AÄ\Æ€‡r‹È2•Ôx’ &9j•TË©¤sÕ˜JNï?a[Æè„éÚz¢q¦9*ŠV6öYpç\9·By)gÔ:cV9$¦¨sgì›O~=|]”ó"«\—ÊCø\®ÔÍŸˆV> Z]Mg¡(Šq‚±íúv͘FîŸÞêËq¯µ±fõk}^ÃXÚ ~lŽÊÍ÷.¿ÌØ\Ítv@ÛÎ'?¡âåIOÜõMü;ýÎæÞqð{eâÞÅéÕ‰™'Å[ü<ÃÕÕÓ«Û¡žªON{O ­_µâ–ìŽÖ_Ý™ö|¾:™ËU[Õ]êúd&„ F£õWw¢áâ+ÀЩà)¼¥VÕ;ß„ÕzÀÉLá-”ÎC9{Ek¼QöE&¿\6Q4 ›‰~Ži ”K¹^]Ú`` •¤ÂÔXݱ¾G¤d7M3æ7{ƒlÃ^Q®˜´0¦LgD³Ïíeî­æF]¿ÓYL]y&˜"—8@ôFdN*•#ÕŸ‹ áXÏÂ3 eUʶ_œ“¶.Ç›s§NÉ»HžôG2óÄÀÑzéqîÉœ§Š_AŸÞQñ+èQlî 7<ÚGøŽX5Ü)>Ór _©Ì°ÐŸãÑ¥¿ss›#PL<ÆÀÅÀ ÷ÓÓ¨µ®Ü)ƒbZåC£wtñrEˆ„xëHQ߯Æß,‚Dc °a«ÆLßzâI_´.Ž"ÁÑðe2øaÁàkæò!lãa·|À:JÈonýe¯³Á²e&‚²‰+SÍC_ƒi/>FBÃïà«0 úã‹BÏÇbXcè*æ9Ð?쓬=žqÎ!CXÈbš§I”X¤º)nÙµÛåS›Ád›ém°rÀn%ƒHŸÊ•ÀX÷vÿåÍ|™ÐÚ˜ð¼ NQ=fx»{‡c@Œ{'£Ë¡6»Ëa‘œÏØkPýÄ&ÓÀ [õÆu9„ÞˆH5а!Ô5YT†«ÖØö¾•f9úÚÜ=ú¾;^–å¸×óX¼Ó'óãö;ÍHR÷ñZ,³áþrÌ}XoÙô·»w^Ì½ÓØÝ½“ê€w÷Žø 6qeªÝ½³HÚØÝ;OçÞqvÛu‡­3î ª[‡H±w‰Ú3T96Ñ®òëUŽè@– ™ºfïàÚÒ¦ºÉ&“ܘËÊ,QMÏò†‹”×jM¯K­Æ|H„sûÔ"²cWKu\}™L‚¦lmˆb"DW€\E†×CѽgÔcEµäñÓçƒ3zÛ=ÈKÖ¶{·îAVíúäÛ=ÈÛÙi–£7[ò «¢Ü=È7kÛ=È4"Õ[ò «âÚV<@aw¼~y¼Ú镲ƒÈ™­4œhé_FMd ³“º.”æÊ´ie*seªî¶šâéÍ;2P™ûÄ7\4\Ø$„­n ¡0 Wrä-uI;J{\l7¾@bö8Q¢J.×;ÑÝïÌѾåL˜ò¤0B™Hçå-ã*&|؉„%b&~C¶H&θf”,Œ1´qEϺsÎ㹞õL>ãÞÔ—,ºnÐj‚ŒMà‡’‰wŠšÚ®O#qE\=Y³„¬)\Ò†{˜býŒÝà^–±µFßó—;j±}E”RM«d+RÉ& ì¾JÉ!¦¡¦C™Ü(™Z£*] ¶×l­Q™–¥g“âÖ¨½º7Ï'4šrp4¦ù'1šÖpm½h€Šß!­î­^ƒ0HÑêu«¬X·‰p  ¶×€mXŠ9Àke[–]À©«õK0G$Ñ3"h#J™d?F&‚[ÈÉÞ£(¢´áÊŒe$qøc ûCxdu³”æ¢ÎóƒE8|v r®•p°mEØL0…àCrÓúŽ*mÆ'}7+2!ÚUV{‹YŸL‹šš˜UoÀ³ŸÉ%ð–SaƒÎŒä:1Ôû^?Ù ›»ñ„)ãïtéim²™[¢"¥lˆÔ­Ág'aQnÄ„´F¸A1¢Ý Ž¡½%îòÎdIQ¶B•M?ÌÆ°¤’Kà ¿´ß[’¤è_î}aÉoæ(¾i‘³PgÚ~Ô×€!IF·ùzf‹KŸ:sü퓎&VÓ'}F»>UÓ¶‚Çü Ícî¡àÜÚÞúNØ[4Xó¶>eÀ÷¿šn°§½8ÂãäÌ6 ¾Óc«ŠÚzýmY„;ÿÞ®x8h¸r|ÐÛJáAQã Fvâô¸ð^†Àqík,¶Àk€Q­hæžàÛŒ_a”ƇŒ© >Jx`ÔÅ—îÇÜ8vØ+ZÍ©sLï*$Êú¦¢Ä]Nõåøåð/os endstream endobj 1967 0 obj 7078 endobj 1971 0 obj [47 /XYZ 38.2500000 629 0] endobj 1972 0 obj [47 /XYZ 31.5000000 485.750000 0] endobj 1973 0 obj [47 /XYZ 31.5000000 485.750000 0] endobj 1974 0 obj [47 /XYZ 38.2500000 735.500000 0] endobj 1975 0 obj [47 /XYZ 38.2500000 629 0] endobj 1976 0 obj [47 /XYZ 38.2500000 735.500000 0] endobj 1977 0 obj << /Type /Annot /Subtype /Link /Rect [60 449.750000 136.500000 456.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn2 >> endobj 1978 0 obj << /Type /Annot /Subtype /Link /Rect [60 442.250000 85.5000000 449 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn3 >> endobj 1979 0 obj << /Type /Annot /Subtype /Link /Rect [60 435.500000 123.750000 442.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn4 >> endobj 1980 0 obj << /Type /Annot /Subtype /Link /Rect [60 428 162.750000 434.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn5 >> endobj 1981 0 obj << /Type /Annot /Subtype /Link /Rect [60 421.250000 96.7500000 428 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn38 >> endobj 1982 0 obj << /Type /Annot /Subtype /Link /Rect [87 413.750000 164.250000 420.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn39 >> endobj 1983 0 obj << /Type /Annot /Subtype /Link /Rect [87 407 175.500000 413.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn40 >> endobj 1984 0 obj << /Type /Annot /Subtype /Link /Rect [87 399.500000 153.750000 406.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn41 >> endobj 1985 0 obj << /Type /Annot /Subtype /Link /Rect [60 392.750000 117 399.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn6 >> endobj 1986 0 obj << /Type /Annot /Subtype /Link /Rect [87 385.250000 163.500000 392 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn7 >> endobj 1987 0 obj << /Type /Annot /Subtype /Link /Rect [87 378.500000 253.500000 385.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn8 >> endobj 1988 0 obj << /Type /Annot /Subtype /Link /Rect [87 371 197.250000 377.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn9 >> endobj 1989 0 obj << /Type /Annot /Subtype /Link /Rect [87 364.250000 135 371 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn10 >> endobj 1990 0 obj << /Type /Annot /Subtype /Link /Rect [87 356.750000 134.250000 363.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn11 >> endobj 1991 0 obj << /Type /Annot /Subtype /Link /Rect [87 350 128.250000 356.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn12 >> endobj 1992 0 obj << /Type /Annot /Subtype /Link /Rect [87 342.500000 122.250000 349.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_member_data >> endobj 1993 0 obj << /Type /Annot /Subtype /Link /Rect [60 335.750000 87 342.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn15 >> endobj 1994 0 obj << /Type /Annot /Subtype /Link /Rect [60 328.250000 117 335 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn16 >> endobj 1995 0 obj << /Type /Annot /Subtype /Link /Rect [60 321.500000 79.5000000 328.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn17 >> endobj 1996 0 obj << /Type /Annot /Subtype /Link /Rect [60 314 125.250000 320.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn18 >> endobj 1997 0 obj << /Type /Annot /Subtype /Link /Rect [60 307.250000 126 314 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn19 >> endobj 1998 0 obj << /Type /Annot /Subtype /Link /Rect [60 299.750000 89.2500000 306.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn20 >> endobj 1999 0 obj << /Type /Annot /Subtype /Link /Rect [60 293 243 299.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn21 >> endobj 2000 0 obj << /Type /Annot /Subtype /Link /Rect [60 285.500000 108.750000 292.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 2001 0 obj << /Type /Annot /Subtype /Link /Rect [60 278.750000 153 285.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 2002 0 obj << /Type /Annot /Subtype /Link /Rect [87 271.250000 162.750000 278 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn24 >> endobj 2003 0 obj << /Type /Annot /Subtype /Link /Rect [87 264.500000 151.500000 271.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn25 >> endobj 2004 0 obj << /Type /Annot /Subtype /Link /Rect [87 257 180.750000 263.750000 ] /Border [0 0 0] /Dest /#8d#21#08_#eclM#0a#f2#2b#dd#13#ab#21#a7N!#19#9e#0e >> endobj 2005 0 obj << /Type /Annot /Subtype /Link /Rect [87 250.250000 156.750000 257 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn27 >> endobj 2006 0 obj << /Type /Annot /Subtype /Link /Rect [60 242.750000 117.750000 249.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn28 >> endobj 2007 0 obj << /Type /Annot /Subtype /Link /Rect [60 236 102 242.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_class_extension >> endobj 2008 0 obj << /Type /Annot /Subtype /Link /Rect [60 228.500000 87.7500000 235.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 >> endobj 2009 0 obj << /Type /Annot /Subtype /Link /Rect [87 221.750000 151.500000 228.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_directive >> endobj 2010 0 obj << /Type /Annot /Subtype /Link /Rect [87 214.250000 137.250000 221 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_functions >> endobj 2011 0 obj << /Type /Annot /Subtype /Link /Rect [87 207.500000 160.500000 214.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_classes >> endobj 2012 0 obj << /Type /Annot /Subtype /Link /Rect [87 200 147.750000 206.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_class_inheritance >> endobj 2013 0 obj << /Type /Annot /Subtype /Link /Rect [87 193.250000 149.250000 200 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_specialization >> endobj 2014 0 obj << /Type /Annot /Subtype /Link /Rect [87 185.750000 136.500000 192.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_member >> endobj 2015 0 obj << /Type /Annot /Subtype /Link /Rect [87 179 147.750000 185.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_scoping >> endobj 2016 0 obj << /Type /Annot /Subtype /Link /Rect [87 171.500000 135.750000 178.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_more >> endobj 2017 0 obj << /Type /Annot /Subtype /Link /Rect [60 164.750000 94.5000000 171.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_namespaces >> endobj 2018 0 obj << /Type /Annot /Subtype /Link /Rect [87 157.250000 183 164 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 2019 0 obj << /Type /Annot /Subtype /Link /Rect [60 150.500000 173.250000 157.250000 ] /Border [0 0 0] /Dest /#7c#27y#ef#e7R#1e#b9#0e#60#a4d#04#ec#27#d2#27#15#d3#8b >> endobj 2020 0 obj << /Type /Annot /Subtype /Link /Rect [60 143 123.750000 149.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_exception_specifications >> endobj 2021 0 obj << /Type /Annot /Subtype /Link /Rect [60 136.250000 149.250000 143 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches >> endobj 2022 0 obj << /Type /Annot /Subtype /Link /Rect [60 128.750000 114.750000 135.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn33 >> endobj 2023 0 obj << /Type /Annot /Subtype /Link /Rect [60 122 144 128.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_smart_pointers >> endobj 2024 0 obj << /Type /Annot /Subtype /Link /Rect [60 114.500000 189.750000 121.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_ref_unref >> endobj 2025 0 obj << /Type /Annot /Subtype /Link /Rect [60 107.750000 151.500000 114.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn35 >> endobj 2026 0 obj << /Type /Annot /Subtype /Link /Rect [60 100.250000 100.500000 107 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nested_classes >> endobj 2027 0 obj << /Type /Annot /Subtype /Link /Rect [60 93.5000000 154.500000 100.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_const >> endobj 2028 0 obj << /Type /Annot /Subtype /Link /Rect [60 86 145.500000 92.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_target_language_callbacks >> endobj 2029 0 obj << /Type /Annot /Subtype /Link /Rect [87 79.2500000 168 86 ] /Border [0 0 0] /Dest /#0a#23#2c#c6j#c6#c3x#8bk#3f#86#95q#db#b6#f6#0fU#ee >> endobj 2030 0 obj << /Type /Annot /Subtype /Link /Rect [87 71.7500000 207.750000 78.5000000 ] /Border [0 0 0] /Dest /eN#5d#f6#5d#d8#3d#7f#e0#82#e6#a64#a6#19#e6#1c#c53n >> endobj 2031 0 obj << /Type /Annot /Subtype /Link /Rect [60 65 147 71.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn42 >> endobj 1970 0 obj << /Type /Page /Parent 2 0 R /Contents 2032 0 R /Resources 2034 0 R /Annots 2035 0 R /MediaBox [0 0 595 842] >> endobj 2034 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 2035 0 obj [ 1977 0 R 1978 0 R 1979 0 R 1980 0 R 1981 0 R 1982 0 R 1983 0 R 1984 0 R 1985 0 R 1986 0 R 1987 0 R 1988 0 R 1989 0 R 1990 0 R 1991 0 R 1992 0 R 1993 0 R 1994 0 R 1995 0 R 1996 0 R 1997 0 R 1998 0 R 1999 0 R 2000 0 R 2001 0 R 2002 0 R 2003 0 R 2004 0 R 2005 0 R 2006 0 R 2007 0 R 2008 0 R 2009 0 R 2010 0 R 2011 0 R 2012 0 R 2013 0 R 2014 0 R 2015 0 R 2016 0 R 2017 0 R 2018 0 R 2019 0 R 2020 0 R 2021 0 R 2022 0 R 2023 0 R 2024 0 R 2025 0 R 2026 0 R 2027 0 R 2028 0 R 2029 0 R 2030 0 R 2031 0 R ] endobj 2032 0 obj << /Length 2033 0 R /Filter /FlateDecode >> stream xœí]ËÎì6rÞÿOÑë¦-ÞI 0Ç—Y0l ‹ ‹àL&Æ`Î NyýèBI¬"K-USRwÿmÃ>G›±n,~¬úîŸ~ùËýïå»ïùïË×øç÷¿|4WgšáŸK÷ïÓé¯ñïçÍåë·ß/¿üüñsûÿß?†üòý¿´û¿‹¼üsûß_/ÿöïmáŸc¥®Â·'\ûçßú?ƒíßšéÏ®ü·ýÃåï]‹cwq0ðùÚXåºQÜèù÷q–¢ÿ÷¿þýã»aþ›: B:}Zµÿ Z^þç??þÒ6?6Þ\ƒÂYíš;ºq²íG{u2´í´ÿánú«4^½iÛþ§¦ûQ×þBY±Øvû;lã¼&ÿÎëÙ_‚lLû¡´ð—)Òo¾J;÷+Nê·#È?²ÐÒäýþ¼¡îgI(SI(/ú’KÃ{8§û®Bu³Ë¿ë= ©¥Î[>þË5ó—“ñˉ¦˜¼$£”­¶úå)KI¡÷Y,ÜòÃ,V;0sIFižf±öଠ<ÄJ…~ºª]¨Gø«TT¯ÎUƒ^–kxØÅèo:ÿTäf¿õ½îUÿÚáÆg}õ¾qkû?…JíÅšik3|ý°ú*DÞ‹±ŽM¨´ƒ¶úð,û]Ðî@t¿€ƒhëxЄ‡üöñåË[%ÒþòëÇw?…‹°—_ÿÒZ%=Å üÚ ‡ö¡ë+\~ýóåÚîþô—_ÿú¡¯Z »¿®ÚðF“o¾'ߘþM;m}÷n~ãû7~M#?öoÌUµ_J¦94rõ¡±à ý›†üðÔ`•X?XG‰¬ÂÍÓU³Ï† 8ßdËüh*°dÇdk ƒÍ¾IÍ´0?š<¾¬@•/ šf&’è¹(4µ/Ì‹¬ôä7dk4«dkMSýQhz¤;æH2Fk tOÿ†\0ËÓ„qsùüµµIöÑFF*¨Ž„"éw½è?­–‘œÏ"~Ø®Å@4B+³f^$¡m‘*Ã`…Éè1÷z- µ<ôhÒ‘æ¢[[ ë º‹!€Ö‰ž ù¦®fZ ÚFä˜wó‡fŸŒV9S?]gåÓȘŸ^šÓH¥°@n4oèóô]m¿Ò?gnzÝé¯Í¨ R’1ÀP°jè'\5«¥qÕí$­5Y"‰ìG+†ùž²诳ÁÈ ›çìåرMå,?MèÊÏ"âw•j$pW©FÜUª1ЛÔ wU_G&TÚAtW©FÜUª­€:h°»ª¯ãAv°»»J5~\³¸2ÍÕ:)AO¬ý†2ª¬Ì9# gº° ¨âÚbì?l޹aƒ@Ë$†ŠÝ Á¬ŽIÏÑÓ S{åèÉÑ’´ ÁÙ©2¶5ç¹R_„"i›²ªÕt„/ËB]ÅZ¡ ’uÃY GÿÐd­½…0Ùˆ¢¹&yú7U½4ôÌæ£$øç52êUVé TÌ™`ö•ªøPé3Æß0á ÷ïÖ¤€»5)K»5©Ñfª-À»µ®ŽM¨´ƒq·&›ÒnMÔA[€wk]šð°ƒýwkÒkFƒ ^]¼<à&›W]]ò6H9é*'úY2w¡‘ª3æâM7~%G좂Ã>$K·ž;:@­¦>uÕ§%õ©ÒnmVŸ]šPi£úT¡¤>•G´X}vuXƒáKäÜP\=‚ªþÇ:h6Xº;ßF®ØÝp°Ä9vçÄì¨ë«cyŸ;=Þý&â~Ge^ßAµ§=Þ¡þ÷tbë¿)K’r>Ç3Á¹ÅVõ†HeŸÅ÷ÀÀ=Tà¡Ä Ãí¯.¢cœêðIEsâd²Á\eªÀoÿM$«Òoù›86=FK˜ßüDµM+{Uýb¯{£¨DÖê”0Jò =zÑ€*µFÎt¡Ÿ°ÝUðÒš’ó¡ÇFχg¦Q ”ÞüÈhü: _Ô1hÇ’tM-ì­ uo`h+DZÐà]Záp¬0üh¬~°HåÄ!©¬¹«\á{ðܲùß9‚Õk ©ßÆÙ6–8+̺þsþÇçcÐöó6黣ŽÖ_k®Œ‚àDPå(—ƒP½Ÿ,í«Ú¢‘οÖT÷8eEÒžk­r”_¿.X‰qÏdò×{ȊΛÃokœuãvo$:Gog²´3v™óEþ®pß!Îu¢-߆îÛЭ­X·lÎåÖT®Z4ãIì–QƒØ×ÁA”~è/Ô›H—¥ßЭUs8“B¥‹" … ƒ¼8w¡nܯT¼ŽªåìOÖ;˜ô³3Ý‚ao’_ û_zC“¹£ÞHò7 9‚(-6±S´òKo¾'ßüH¾QäA¾ ä7 ß4þ¸¥WææÒG9vÈpÌtôK¯ùÝ¢(Øö­ÉiÓ4JÓ5‡FI‰‚¤7MÎ4J˜m¼@s=9Sšâ¥8Ž\œz“ˑ˂XpB +̹jØÍáXµb}È74í膱r’¡vÉßЫÍRï4/­54/pfJs=Ãú?ê»q$G&.˜Ró‹þ:ôØèU é€|³°rŒõ¹I½‡ˆ=eŽ¡Eô­7»£ \3Žò(ÔB?4 *¢_Ü5Hx±€Ì¡3 ÌÎÂo¾P#XhÆì0Z‹ê¼€[@æppXôúÄùØqc¾fˆ3eÉQWã—eÔÓ·#ær@¢u¼ü kå³$ι}ÕËbp»J<‚s½±RJDí´—Š6+DEnµÔî¤Ç,Î8—xª¼›`àÎç‘ çîô½œ“€Wf<æ íó04d('ËdÕ€Òu}Ô½VÔNü€¿M>oübhħ ?y¢Ú£Nâ9éä#XÀæÐLzö²Þ â€H“o:~r:Þ²}{ä]èQÑF8¹®9ö}[þ–®ßÒ$†âŸkÝ.¨Y»®ë|Ú€Ô\HDv¬÷üœ7!Sû;S­£–®r°ðº;xŽ8®<‹CϤX’Ú¡•þ"P6Mš冦挖8ÆÃ϶ÝYåZ/çŠÏ†}ên=(k°œ8BU¢Ø´8,ÒÁX ´ÜÎ}Úu]tô—ˬ(Bœ‘Š“ˆµ]ä„v.;|çðòQ)ê‡s‡Ö24»sÔ('¿çä{}Š:91Žº2»ÞØX°Ì/Û¹ñS,æYŸÊb^-æ]»ô7ö œõ`ã:Õ`Éé}§{½¸à@¢|!Ñ‹o+€<,]JôÒ×Q  •v½¸` ‰^\0°ƒ®%zéëxЄ‡ìžèÅ7ã Š…°Ÿí$}o_C@_þHNÙ84izᎊýÏ0;·‡¸[žyå™Ey&±<“¹<“QžÍM¨´ƒ(ϼ(É3/<ë <ëëxЄ‡ì/Ϥ‚Ô^²Ï_²·œÑð‹|9#ѤpR5(#ë²yÝÝKçpU\F¼è¶-V&',ÍÎ9?h»ç¨]fˆ˜Ûc‘ì !uHB<`´­ƒ8÷´ëQmsž½ØƒÏ ¶¹J«ÂO+£¿ª&þ;&|ÌÎ79ƒ…"M’7K5}Ïû ëPÒ·x9Aaè«©{ÌgW$¦€‹Xm©ÐR7o u¾ÔãrjB¥ŒHUÜ@*¼TùRH6êÀ ¤ž6Uò$ÖòÉJƒuz²Ufä™b¢²pnGå³­»¹å,•dŸ3ìç‚®W^B1õ¼:Z#ÙüÈp&PìÄ+ FhøqŸ1êçûFWU=ðM–z9¶–ÞÞM1pꂞNïÃVeÑ u)‚F“>-ŽÁ† ;ßé¥å6G+tF]yű¦«î#Yó¡ýpn5u¼#ÛSe) ™»®_¼nòà¿ø¤hÕ˜Sò9ê"È9~ÖA†³«nÞšÓÎIŸ““?at¦®Û {éÃÒ˜Ð'’Œ}ÄÁ»Ÿ=f ²§«¸#X ­2Ê;Èt|‘Hruv*Ç^íÞ;úƒôh³Hg¹ ƒ6ÓG·u3p»wA·ÆØ½/”&¯ÏfaÕÚ-ÿC‡tx}èÍ rû»4ÃHÇ`¼vœ³pBϹã³cù¬8ºo}ÔÖ-^º5ÆÔ»]cG÷ùÌ&ŽtY0¨ªF®=ê˜ÞyW =ŒeºÍ1^ÔzTþNŽJ¹¥ö<Ì·Hý–Eý}Ú¾FI>ði;Ëe^#ÞC]Bdŧ¤Iss°ÖZÈx†€;ÿø‹ã ®Vüð_GIܨf w܆~„¹687™ fù²»Ò­ŒC{<Žüâ™­ËKUM©3‚–'Œ€¡•Ϫ„±‹©rwNPc*\HF¯˜©§ô›æBþ¥.2—G rŽ,éùl9Ìüc¡¥%ÃyPÙ Ú7ŠgÝSà8ð|{7…BJ¤åÃèÀ÷±RíK(œà$•ó­uçŒovîëα['ŸÀãš']× Ë a¶·aòLY‡Æc»ç¦`Èä–ðÝ;~%ÕÁ™)csþò…OÌÐfy‚Ó1§¥ÊzÎk`¼¹­:¬›kªîµ¶ýñªÁ¦à†˜ˆ4p ëá™Ù{÷ù„½Sv7_ã81jª#ïË…*ãÙºqOwØœ:ÿÂüÎÛ™½ãçœl2ì|ûN+(¦>Ö_÷Ê-ôþ®ÌÆÀ.ŸÓÝõ€Ç,çoþXiºõhTέ*Ö Ç¥Í ŒÓÝå{zµ!oíÉvN˜«íçÓj¾ÑE­¶ipD:'r¯Ú;¶Ýñ>V|ìûßðQW†ë*ôõši d8@—³"s6c-78‡.u dߨU{'VÙß¹*m@ŠŽ& ’4u• M{u­Ëý·Š¤¹Ü¡Lˆ,HÆ–Ä©» =ÊFáàP1×ÍP¶AæÕͰE³rü#éô sôLó-9M™œ{LôçÊìAQ¶lýiKõ¨Ô gbJ­‚¢#žY)¡ùñäw§ž…0 ?n' ¾Œ¾Øcã|š*žÅg¾ռh£dÑåÒñB¬!ŽzøÂ]]@¾tz>õJqUÃWÀT¥škËn®o¹F¤_­Aá…QG…*Bv6 ~¤Þ,ô3¬TW1ÄÝžW{ ^á¯Ã’foú%¤×h^\‘/®“—vlsíþ6>‹«÷»¸¦ÿSß—ª‹ }Å®îPðõÃú«Az/Æ:.m">ÅÚêý³ ý.ðÇÆ£Ú‚¯pmÑ0Ʊ 8ƒ¯¿}|ùø"ûb©‹- ËžÖ­יދ[5ŠbåTâûƸ]hü\j¼‚ùÍ›…~èØöG‹ò÷7“¤3·TØ¡™Yúüíã—ûÄ„ PLø¦$&¼D\Ü`1ÑÕqiÃÓØÁ(&œ/‰ çPmmQ³OÅÄÜÁ™b›‘†Éàì,Úâ ¡6ïv×’¡·#±#Ó‚»É0xH†!ÈP6RIW€È°¯ãÒ&Ⓡd\‰ ƒEdØ`2l‹â]J†s'’¡l¦#d2VŽ=NâAFþ¿Ê^ŠƒTdzÊAS°@a·NôWò¾l̤‚ (¸—÷[ x¿•*%Þ— â}Ùd¼ßÕqiñÉÞoµg÷[ëuÐ ÞïŠâmÂûIgò¾T[ªïxßÕí_$Þ÷§¿Ž¶VªJ=Ê>eBZp·TUJUåJRU$ôÚ,U»:.m">Y(U•)IU¥q:“ªmQ£I¥êÜÁ™RUO¾.:¾ÇHÿb‘»brÈ>›£©¬%r­¦mƒ—iAG䋤,t߀™l±À”(´Œ„Ô—ú¶@Db‹_ÛŸ4‘ Ç:*€6⣩m,Ð1¢ß+܇êûãèêh؆†}ü†Øû‚¦‡ËI+î°¶è!Æýž÷óÅT6Tv| ùÒ‘tGÑrÒ¢V¥kŒÓHÀ8S0Î!æï½TP@¸I¢LmÄGŒS%ã$îCfÆMenCÃ>Î0~¢9E ˜ tS÷’ÔúèGE=®‹l=ì`á pÈÎbqa°ÕÄ““x *-X+ž‚Bâ)è’x ‰ŽÞ{ ÅKWg?SñQ!ñdI<û™xêëh؆†}œ)žæ¤Â†á{NP{†àÜòËD'É;¬n P˜.íV¥Ãp4lª™Îé•ÒiÁ½%$ð¨V%ä…Ýžªw{‚M|_Ç¥MÄ' <ªÕó¹@‰wÐ`@WÇ(@ÒÁ‰Õ1.-`&”£zŸ rþåÝ╘ŽË¥²iÁJU®”€ª\)YPå(jVõn3 Šû:½ªžÛˆªr¥š‚*W2 >dÀª|¨£aöq¢*Wʽº+ƒs¼úx,…ý ‹°Ú P~vaˆ´`­`1 ,F” ö_ªè¿LCWgSñ±A‚E‡’`ÑÈÛ`ÁÒ×Ѱ û8S°˜ õ÷ÓvÆB¢lZßq‚q6çÂr}ùÈ ºáˆ“4Xîñɾ×íh½¶Z–› ÐÒrlZ0Êòúr«ëÊ­£v$öóuC¾¼M Š Õ}û°QÕ»m&… Ȥˆ›vdRà O,R“ «3˜ Sã ȤˆÎdRXtòÒ`“¢¯£aöq¦IáF„0X?*ÀÞ[™<¶ƒ˜£ŠräÀHºˆ÷€IP ÑtË.p$K‘¬ÈÞ#ìCI ã3ÏhRÚÕîÔF|ôH {WÈ5uX ÷u4lCÃ>ÎÈ%!݆—}õ§øI C<²Álâ!Ý8ÈCºñêCÅ¥ô­ûS À}žGæ6⣃<¤[à¡.Ä'ì£1˜‡†:¶¡a'ò#æ\8jWÁ*°ÒU͹³ÀëS” _ËDZ虉TZ°–‰¤EL$]‰‰ð ƒŽ' )tu&™Úˆ1‘4%&’÷¡3&êëh؆†}œÉDj„/0rN¯9Ô·áž4:Œã72„š6²?Êž Ö2„Fe­Ke=ãZgå¾Î@ð ”§>&†Ð%„²Ö ÷‘!”‡:¶¡ag2„O­U²­ðá)«iÙL°nîIÁ½€m'µŸMP¢-ºÊ­{W À„ôu\ÚD|šà«ñY%ÚJÜÄ€’®(ŽQ%€’¤ƒ%ÚMæGÕ+%¬HŸ‡˜,+ÑÚÍàˆ–¨Dº^AÒõºDº]ÿÖý¦R_WÇ¥MÄ'I×Ëéz;é¶EqŒ2%]¯tý„$Ã,œ°Ðgœ´-ñx`†£wí¬Àƒ·¬eÉ0Á ¤riÁ½,iO4M žhO4MOì븴‰øቦ)Á»†:Èà‰]Qc OL:8‘%M3Â5Yœãñ]à¦MTgšùäI¹´ànª“R”%ª“èÖªé7•pº:.m"> Hu²)Q@÷n»LumQc“R@urDÞqîø°BW=›Ør èñ4+Ëéqí7Êéç}ŒO î–†Æ3ºÏhÏè,4^_Ç¥MÄ'ϨRh<£Ph¼®ËCãMMÀœ+ô6¡÷1wÝ=Ïêæ[`]Wä¤Ï£3!®?šÊÒ°r Ýr¸¬•zŽg›´ànY``ü;cKñï v9›Å¿ë븴‰áÉÀøwÆ”â߃œ&]–&Æ¿›š€38WØ ÝBf¶_FÍÁ½plÚº{,†XKÔv>Déo­OwµƒÑôŒ+EÓ3Øa|M¯¯ãÒ&⌦g\)šžqÈÒ`¢v1šÞÔœÁ¹DíG„Ô‘•^¡êvŒk‚“¬áfÒ«-éÖçdyè˜4–¶.žŸ‘4ì°äÆŸD¬—n·.¬U~:>TΧû!Æ»Ž€Œ{êMå}—9ÛOSÏÓqСë]Ö,ÖÌÉrˆìyqÆ·ãf•»¬¦ãšà VS¥Fm²8¤}—6Ÿ`RJqHMÀïÅ!íŠâÓ8¤I'ZM¶™â¾ØÝ9pšäØÜ+•”mfÔ˜0iÁ½œgŒUiE)V¥Å>s+²X•}—6Ÿ`¬J+J±*­Ð¸ƒ,VeWǘƪL:8“ó$ÎË"ÇEŸi+KÿÈ!jš­Qé97¹8Ú÷µÀž| rrÆÔ9‘ìgÓv>`IRNŽ&šìï?EŸ¯ $KßóFÑ*„Q´ª„Q´ a­Ê0Š}ƒ8·FѪFÑ*…ûÈ0ŠC Ûа1ŠVOQTi+gCæ.zÏÁ÷n0÷_^\ÒÒ‘bVžqmð$Þ»³zާÚ½NkEAñT­)ÅSµÝêµ&‹§Ú×D‰ñT§>&QcJñT­‘¸,žêPGÃ64ìãLQc'/[ˆz¦Šœ« ÷Ü–«ru3ÎÒ|*ûxOK”v^*CZ°V8¼ÔºRðRëÐ…Rë²à¥}×^:õ1ÉW ^Ú2 î# ^:ÔѰ û8S¸€ËŠ­|TVãºy½Ï æbý €µ:-Øqc5\kÎ꼊Üçg¶Z›‰ƒ]9Ç6Cä÷íC7¶D·äqHU’Ç]N¶Ádò¸«3ÈÛ©ø(‘<¢$Cƒûh2yÜ×Ѱ û8S‡)8ì;=ìÛÛÅ DMi™Üëww‚á(áv‹;‘áû:.m">A0¼%0¼kc¿+@~÷®(Ž1Ã'œèwwbÿýîµ’çåMÙ3dIïo7êó ªÜ; âØ*áØB8v§2{_Ç¥MÄ'ˆcw²„cwáØ»̾2âØ§&à Îe_u;ÅûNhž¡90Ë`ÂÁÓl8]ÚýÚ¯SsHž`Ó‚»9DCtw;ü‡„îv&Cw÷u\ÚÄð¤!ºÛéºÛi„îî 0‡èˆîžš€38—C̔ݜ¾cÈØ£rÀ‹uC¸m”å&I€Ò‚•›/gQ7gKÜvT9—Epëë Å‚nSãæËÙR7g‘í+@›¯¡Ž†mhØÇ‰›/çôM²dÝH±¬rú*Åj<Ñs2F]ì8Ç‹SãÄ2»×n¾œ›‘¹Ò§k9Þ£xsÎûÇcWˆ Y¼¹¾ÎÀÑSñÅ›s¾oÎyäÒé 0Çû1Þ\Ò††}œÉñaÄÒ—Ý_ätúåʶ\.ÌhÃФ+Ï7(F]KâÆó ŠQç›,F]_§g¬¹øˆbÔù¦£Î7÷‘Ũêh؆†}œÈx-5ëøb Þ—ã³7|¹,Q¼˜tF¦k%ŠD:/K:/€ÎË @××$†º©I¢È€ÎK…ûÈtC Ûа3%Št/·§d\ ÝâEªqÿçÁ3z{5#ÐDH ÖòªF4¯K4¯Íë Ö×xQÚÔÇÄ«º„@óZâ>2ÚPGÃ64ìãL^5ͧãÕ£Særâk,$àuxô 5õ&—©´`-£[/ó¶/óØÛåm/ëë Œl¼lêcbt[‚—y+p¼l¨£aöq&£Û rô”‘w_Θߨ6Ý VHÒmyÀAÞ—ÀA{’¼ÏÀA}[<M}LÜäKà ö¸ 4ÔѰ û8“›üŠÌÑ5ò>5óÍÆûñ#|Z°’Cƒ²L‡¦”e:`¿Th²,Ó}žMç6â#Ê2šR–i°-dY¦‡:¶¡a'²qhFxÏ‚RäàH8VéÛÇ\ÏB3Cs¼K î ¡9A– 9A"hN4§¯ãÒ&â„æQ‚æ 9]tEÃE ÍI:8xäÍQdV>ÖÕ…õNÖÍÌÍÑeW‚œOK Öj…rz]Êé°Ï"è,§g_güäôœú˜4ƒ*åô ù^º¤†:¶¡agj}S€°¸µ7á2.×MÌÈŠ§Zw>UV¾õ|".je=§É2-¸[+3˜R\Ì`Q\Ì`³¸˜}—6Ÿ`\Ì`Jq1ƒAq1»¬•MŒ‹95gp®V¶îê5/!®ÕÆv>´"-Øïn`×X‚W³á1®ÞÜvÝkêŸ^#@¶úöÑåF|v—Fp0æ_p¾¤<Šù|ó¯¯ãÒ&âŒù\)æ_p(æ_W€5‚‹1ÿ¦&à ÎÕ~ÊK‡¨È..¬'˜®=¨·V3øùø¹ŠO;j†¶#°GŸ`.ØÉëó|NyŸ¹àRKcðRß%œ ‹B),bèödYXľŽK›ˆO0,b¥°ˆ!hÜA±+ŠcLÃ"&œ'œTK™ŸC8m YW÷,‡ƒQ¨{6%I!'B'`ÚÂå*R®J ç-îÆ–sfÈd‡Î˜ î”mª&•mí³Íe[[ ý×}”mC—6ŸL*ÛÚg˶¶Tá’m}Q£že[ÚÁ™²MŽ(Ê…\²Ï¾uXÅ9Ê~d|Ë6&•sÂg%Ò‚»™TiȤªð¹-uˆ‡Nø<ÔqiñIC&U…„Ïm©Äà„Ï}Q£J™T=@ÂgÕèieIÈ‚K†CAœè毑ÿáÐ+/ïBý@½Ñƒ® ‡;ÑšüÙ$ÜôŒm|Zp·p3 7SH Þ–Z${ N >ÔqiñIAáf )ÁÛR;À)Áû¢8F™ 7£A¸™2JGÏP_(:¡ßÔ ÷\gk¤g]ƒ=Ê_OŽš6¤´$UM•+äëõ-79 Uc'.-Ø1ëSÛdڪ̤Èä,r¬ËèÏ XX‘ ’з=lRšºK_: õ¥S%}‰N2ú¬/»:.m">I¨/(éK×àšL_¶EqŒ"Õ—N>‚¾t#(\Òcµ!S]€7#$\»…#ÿ¾ãßöŸ>ãZëf(½ôiÁÝò0(C!xf[ª‘¸ 8xæPÇ¥MÄ'åa(Ïl7Euàqð̾(ޱIåa È®§!¾[ G™°Os£zàƒ0 2-¸—„P÷ö¹uoK‘£] u긴‰ø îJ4¨{[ŠŽ ºÄ]Ñ0Æ&º§œÈBLP÷K6ÍÒíœ=*C-/|7ÎΚfý–~‹‰B#âèÝ놑ÐDµs¤7Nþ%BÊ®BL1¥\Zp·è”ŠNUOÚ–¢ã¡pxÒ¡ŽK›žd€¢S“¶¥è§+À¢Sº(,¥OE§|€ð¤í¤Çk |áè7¬@.·Ó'ŸuÊÂAÜr_®e/5¡œd#Ó‚¬´AºáìYA³8Y'ÔÇädø B}Ñ\uë¬HxÉ¡s^ª},_ySBØ»mA!æ®Fïè à•·¡Nw¥-i#>˜»mA!æn[jQÇÜu4lCÃ>λòÖ~‚éâéëeo´ÝÀÈ­º`¢=U¤Ïû/ªôwªÚU›àVÒÊ´`Ï,VÌ#®{ïi|ˆZÑêT‰*n‰Vëhµ¾$Z]ƒÄžÃÁ‡:ƒèœÚˆ‰V[nÜ–Ô‡ÅÁc Ûа3E«‘ûÏu2ðTÌK˜Ø«©›ÑþÖÊí~±£ëÇùaxÞVñNVñ>èçÙä®ÑQ2œv3Ü]Þo¡÷Å®×´¥è|Ex|½f¨ãÒ&â“…Þ_¸^Ó–jܾ^ÓÅ1šÔûâázM7œ¸´Ñqm®MPðjXݳG¯ÔEÓ¿á\]9(ÀÄÂÕà£ÂWqέ«~Îúœ©ƒ{,ÌWp„M :ù÷óÇÏ—ß[ž¥]¿¾Uá÷9€/ƒÉÔµ]¼›‹œ¼‚¤—A¸Â·< r¼7•¼à¡61ä5ÆÛIèEôÿÕºeg”ÆöSœi ÙÞÐØ4³Ú|‚‘ñhÇ -þ Ótkäo"Ù‹MSOÈžKpÝßÛ MŽœ^hI;­È…Žç±%’¦¿7M64±3Vo~$Ä3hîBÇäÔ%-•I6 I-®¥7·äu‰pÉ/h’¦™–‚ôR’ ÆbQš9ÈùÄ`)w±¨kZãv>àUR(ËæNojªŸ/?ü?4º{Ÿ endstream endobj 2033 0 obj 9984 endobj 2037 0 obj [48 /XYZ 31.5000000 756.500000 0] endobj 2038 0 obj [48 /XYZ 32.2500000 504.500000 0] endobj 2039 0 obj [48 /XYZ 32.2500000 311.750000 0] endobj 2040 0 obj [48 /XYZ 31.5000000 631.250000 0] endobj 2041 0 obj [48 /XYZ 31.5000000 506 0] endobj 2042 0 obj [48 /XYZ 32.2500000 180.500000 0] endobj 2043 0 obj [48 /XYZ 31.5000000 312.500000 0] endobj 2044 0 obj [48 /XYZ 38.2500000 132.500000 0] endobj 2045 0 obj [48 /XYZ 31.5000000 181.250000 0] endobj 2046 0 obj [48 /XYZ 38.2500000 132.500000 0] endobj 2047 0 obj [48 /XYZ 32.2500000 755.750000 0] endobj 2048 0 obj [48 /XYZ 32.2500000 629.750000 0] endobj 2049 0 obj << /Type /Annot /Subtype /Link /Rect [53.2500000 771.500000 100.500000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11 >> endobj 2050 0 obj << /Type /Annot /Subtype /Link /Rect [103.500000 771.500000 150.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14 >> endobj 2051 0 obj << /Type /Annot /Subtype /Link /Rect [164.250000 771.500000 211.500000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17 >> endobj 2052 0 obj << /Type /Annot /Subtype /Link /Rect [375 771.500000 410.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 2036 0 obj << /Type /Page /Parent 2 0 R /Contents 2053 0 R /Resources 2055 0 R /Annots 2056 0 R /MediaBox [0 0 595 842] >> endobj 2055 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 2056 0 obj [ 2049 0 R 2050 0 R 2051 0 R 2052 0 R ] endobj 2053 0 obj << /Length 2054 0 R /Filter /FlateDecode >> stream xœí]Y¯ä¸u~¿¿¢ž ¸F\´^ä!@£ȃ‘‡`Û0k²ø‘·[|[@„ˆ‹"sVˆž©çYƒ˜sÈþKX —0äí—j (”òn§#oågæÙ È9d+Åg´|^׫SfOýÀÀÛdÅD^®‰VÈo+LoÐÉ ï…CÆF·¥Éø<—>òî[‘Caý<‰Ň•‡â¼Ρ°]WúPœ§°òPì+¦Çð˜^<+~D@3¬ 3#ÏhÙÈ‘]Lá į N±”¦NOÄ ¾Þ ˜ÀÀ²5‡pJÈm½þèA¡‚¶á‚lNÃa»,fãîùuA©×vk:’þ"Í Æ'#ÞID³[©Ãœ×ʵOO¼¨´s™ÃZ-†ë$ŽðƒGtâé?å“Tb òŠË¥›…OO ÒÆ—4¢嶈_ýÌ¿ ®n‡¦wf7ý8¢¼‡€Âé§6@pPð1/sˆ"žò¼´|Â_6W ²æ0+9‹ÑÐåÃN¨a7À  \ëäâÝž~v8v€/¯×Je!ˆ8 TV€û>9÷ ÿb®ƒl¹Ôˆ—âÝ•Ž z4áØw‡“e=§Õ_‚šFµžaF¥Ñßÿæ8¤®ÝÍòƒøL/>sÝ1ÕNÓÆóÎ'9r×uÒjúŒ|å«4·áÏŒ3ÃöØwþ3}ü—Êß#ÏY7ÝŽo«Ôå©W³¾R«ÖÇÆVÎ3C¤ª•¼™ÕÑZúRùÊpÆæÖ@\·!?5¹]sµ #Šž´Ày÷YP€Ñ0„0’°^!,sÅ7pî@dCVg¹lü)K‘¿eƒr@ÊêáúÓÅŠ[\Ù²U×3DU~ƒ1W#,™† ¸ãd¹;…J‘‹ƒ”o•qådh:qÀ¦œLVNu!@5±¤ü*ˆZ€Vȇ…ø‰¯-· ƒ+jÙ»…¨Hº ÂÖª‘üò!K„4ã«¥YÙaò®\­"sà0’ËľµžL|FDñ„®_â€Fa2#טÎdæ†nÉnjy[œÓ Vã"Ÿ”FBÚôz¹ ËbÎü¥—¤÷vjq/¹ÉTû¤ÚLIÓ”™KWØ–×­‚4^y u’Ž| ¡säyQF¢¸²®…©¸NÙ8f®J‘žI\ˆó\FŽÚ²ë%—^ön²¬8š@y‡~.y‰Ê N†¼%ÛxB$Âωd½!nîˆp ÃS¼>×_ïÛÊßÖÓ¦µñҌ뻀 ì6´"*uä%®ã—KbA\Rlƒ¬y@zrsmE®C9âÌö€€Æ|~±ñõpœ%ë>{ÛºrïAyä_n9Þ3ŠW.Š·+„…ˆbÙ\¹jÉ®Ïo ìq¦Ï€¼-˜æˆ-ÅkÒ{ÛL†g%—xW¹×ù?šo‹«ž½#ÿQ.Øo™Ãqse¾’K ;GÖsã"±²ŸÍ ¥Î [@ IØ{4•u+a‹” Á­ñ´Ü+ü¶ègD!e¼ò©[\T Ä"J¤´Á|$úº«ê­ˆNê–F˜ |ú£)«™j ëOÈÆ–’+Œ3™®œL yQÖã€#kÎMÌ"+ZI(²€]Ÿy´Á”ÁöY ú ¶Ë•“'a `NMˆg&¯ï9¥Yª¬g—nЇÅÅ!s…¿gtY °òõ¦ „2ˆ[ménº]^¸‰ˆ(s]LîÚ.`ZÝ® ! Ý™‘ ½ÇOZ‹ Ô¯×KN2./y”GÄÜIÃKË>9\ä‹îB­d+ߥr #Ž8$ýg}Õ3/ TŒ‹{  Z=D†œ¢ð¸ÔÎXOI@ƒ8µy{û|êâùuq¹„ ­ (³–‰—ZØñðü3WÂ"%E´´@€øR„í ©}BóÍì5ªö,Tj¨„Ós»|ömÉ2W!tâ.`$”ääÒr%/¯¹€ö‡GÐërÅ«3éö»Š©=|U\{EV¾&™Ϻ¹¸·+)#MjŸ¨ï\˜/¹žÎˆ¦ê…q‡ZYU çºUÞ¹6Ý0ÓËdœµj¤+ƒŒž¹2ìÖÜ•â•ä̬mk÷£É”0Wë@>PüŒ€׸¾„è.H)ðhãÚ“·v¯ЇV’=Â¥\¼2¸Ö!l¦jôb( 2QÅ”Ò!`;{*AFÜÄhd‚xЈ̒æŸÞŸØ,w“ƒœÌÅë0û  ø^GâžB.Ž/2·õèOÀ÷gTCæ6urÃèêìêø5ÎÜ=+iloa¸åìPº%b-rûõÈ3àzq’ˆº¸\õ]‰áFO2Nâ9ø/¢ÈBñ&(²€rô ÿ˜F!Œœ´g­H1eO‘®ue—ŒÈWÌs†€"“©ò@´hJȱި•F{&£#W›ÒÔHÔø ’‘‘-‡á³ƒJ{e…ÑÒ9âÜBÆ!RE OdJŠ'ƒ¤Í@Zµ`µ=~ÎGâÞYÜ*ß-KŠ\‘šˆì=ù¸o²m×h÷ÉjMeÉ2)oÄó„²UqáŽÖ»  0I~ RkZ¹¡uJv?”ÆK­-çj¯'3­•”û#®nú§#Ãb…#‘iËý‘€ ÂÛëöÏÕ¨P›"®‘ðå‹U°YŒaŸ‚Í¥¬U­šÕzaÚð87AON,aµ»ƒ¶óhò—Å®õ8ÿæ¦Ö\¿Àç Íq¨Ã™Ìrî™^zf<ïíD}Ò×µUöèüÈWÔõmýÌN}ŸÑâ¬?IW¹™Þ(êG„§Åò'—¥–åràBþÆâU—œ>‚’ê´˜j•TÖ ™µÜšGÄ^_>M†q¤´î•¿ ±Û·=·„bþܨ*)…Á“2¬íÐú*-‘ò-=“¡÷ëæ¼S©¹OQJ€Ç°rÄŽ¦ ‚ìðArËÉ(œòY9ÇhkF!–ˆöCL*iˆ8ެ™4¬oZWòí„“‡)šÈÅ€ d7MQþŒ)ØöÜwåñÄ’–fFíä”.Q[r¿X«ñ ‹+MzU«áB½ÄïiùÖ¨…í†Xûä%i»‡’Kåd DÔNB[ß%k³Ô±äÂÒ\åO@|7l×Ë"'as‹º] ‚S*†¬‘ ø$E?΄R¬©zWŠ‘QdeZäb‘¥Uë}ï8ùž«íûm¤s•”¶µ•ŽÄÑ–á•Jrq}Ú[4ö¨AÛÀâ# ll˜\5 Ûë‹ !Pr±¨¨ ý”0Ñ4’¯,ª3I9­ñXí£ëIÙìÿ\"OÒs"àC39ýW…o ¿¬°ò·JÚ‘Ö–­&‡RçÀÀ¥EJh Àwuë ($òöej]»O¸äl±aû̬B(>-"„å‡`I!Ái䮯цzm%výq{Û^g0ãHœŠ j?n"är ‚ô/: RúPnئ)^¥¼²`UHÄ$qsû‚e}¯<1ʈ:@½4"Šê¹©é[hÚy6'¶a/ë”BwèzŒrVh&’ ÌhHXbD=Ep’ŽÞégº]>;x¬ˆé– VeoËÐr¿Ä @m–ž¸Ú:ÕA#1®b'Éòá²{Ä‘@M=!ÏšÛÚAøÞ¥ª€ì)üعÄyYˆkZ”¥c“1VYOî³î2Sl{>%älm°é 7É—ÑŒöÄÍ©(¶ ÉßCÙ–\Ö2×#h¨F!/>Å>”)…›eHÉaà™”¹JYåÉ\älqëš" î\š”›Ç(Ï)鈨à*/j©Må¹9¸Ò»çì­¯Oñˆì†êì Pú7pÖ¸Yäq¸ùKŒ`1e¼JBÍW“‹V=ÄPo§=[rÍúè RVÄiFìÐòö;ÕÏ%õɶ—ì 4êM× SS¯¡Ã@‰sEGqê%w¥@•#Õºåã߀ã êÑ;6/u¥„|Pm!!œ‹Rú89UOÿ7¦-ï hÈ^ cÎ@}ÌV«ò»Ä%¦4ªz?µ?œ-®~½M/­©<ÏÑÃ!-9}Ò{åš$=àoD°Ðõò šB]±Tã.—ÉCöÊP›ëÀŠÅ%õž#¹ *CâÒžnËMæ,Qª”Ëì§‹Œ´X_ªLQ)¾ñiõzz (à@qËwÐu=ê{bÀ<å+S -€Ë4IŦضŒ+× ŸQQ>ñJ¿e¬<(ç5Ίð–²ÐS5žñƒ¤rsò~DÔ3rȰ\ÿò“’ªA- p̥ᠶBn†ˆH>’zƒìSD>%ù|pN§H´4 Äk§x®,ô.µ4°:€þ¸’irá>÷ªç"§¨%aåC¾Iì)¨}’z.Q3ä J°‰«–Ñ×"fí3óäª|GÒVä<ĈÖW-!8'\ƒ2»9su~'½\Sê×J{âm—P¶È\Ýu{#Jnk.1åBRÑlÚ—Á­LGЇ¼S.ÜÍ.{Z"^PDµÀ¼Øëöd³x´XÓ6"ãC–"ˆyÈåèfT«r,&R¹Ò c¼Žód¼"št(qjòK@‘éiËT¼MF6[2\u­í—Wa&K«W1§¦b®é'aÕTÇËýmüou캪=4ÍåO¥®¿šCS_n<ß{ýá×—Æ•êuשñã¼ÂÜpºýòßuyèà>\wÞ§NO8“8ßÓ9¯èÜþúòñw©À3¯¢½¹ÁÕ‹\±×ñí”Ðö.%tÕ%tÚÛ¨Ó>%œï1Î+Ìý#%´Ý%´­7ÀéŸÎ÷tÎ+:w€ô”ÐÕ‹”y¨ð1õÕÔ±”hjùj…‡Ø„·3„¾sBßÏ0U)÷¼žðÂåã¼ÂÜ02„¾c}ã1„Ó>C8ßÓ9¯èÜ’3UÝ*­¿ŠVŸ¬ µHˆ¯ ñÊ!QÀ Cü\Ÿ+éX(Õ:ÇâDsÇBWÞ±ÐÕäXœï1Î+ÌýñPª™9JÕÞ§¼cq¹§s^ѹ¤?ÚŒdd¤c!“T´AµÕÞqßUkÏxt£7P/› c>ìó´ÌXè5Iޘƕ7¦“7¦÷ÄÁé_Þœï1Î+Ìý£¼1õœ¼1ÖÀNäÍùžÎyEç^ÞX=îŒì|Ï^/ož:–KóuíÒ|ÝÌѼï4RW§‘C¶ç{Œó s?ÀHóµ£ùÚø˜ ÍŸïéœWtîéi¾NVlP¹/2*ï5@RQ¸¸fHºRâô5À0ES(hoç<­u9O[ÏqßI©®NJ‡y´#¯¹½ÂÜ0ržÖÌqžVûè çiG^s{Eçžót7³½¹-ƒ ÍÍœz÷‡l“ m\„Í4}\¹Ò Ê—ãJ•}m–’ÚWTôvNTøîkuu_;Üþ|q^aîEE¯çDEï;à{5ç{:ç;@zQÑE¦fpÆtgE’CÈiK~2é“4½'0}bnSÓ¾#X_Á÷4r¹Ç8¯0÷ ¦O{2%0­*€Ê'°Ë=óŠÎ 9i5¦©Ñ ‚š©}^ jµõQÕ§#vUJ "·"zp!á7ñmC‚î{ÕîÌ>—Ÿ šÓÚ,fƒŒ‰åóÖF¹’Ïè9É绤õÕ%í¯ó=Æy…¹`”|¦š“|ÚsªŸð%ßùžÎyEç^ò™väbŒ5pÌ‹×\S°ž `…-s–Y» žºžKðÔ¾§[דÏË=Æy…¹`¶OâºÉ­œäÆCò¬íŸäí É´sC˜›@‰µ–é@¦y Rì\rwâ’î~ÌD‘ o*â’™:Rœ…Ä{¬ "¦™,*†ŒMÄLkSLW‰ŠéÆÊɇÒÐ/ÿ†Sʸžzʆåê$ éÈHH-o‹­”É>ªsebM+FTVUÒ¨Ú¸£ê±‘äU[˜.ÛÌ•Ú.\I¹lv? BÂMÚÏx„ü¼HUii1{DÝ¡¤måêÊ—ÖCeÁËkNÍ 'ãG%®@Ú¡*–2€¦=«íá #‚S”^ð1¡öL NH€&†WQQŠÉ=á‘ô3©¢x¡=YJËÍTëÑŒuâãéé½m¯½Z©G‹N*­®%Ü¥[oCáUCÒ¹Š ·îŠ«íåBƒYŸQ5‘›/ –~FrQÀ«Æuù Õiˆÿp£ì%àͱںfoÞÛE"I»Úo ±ü.«™ÿ+ä5Nïm›ÕÚ —Ïp]ÉHËä± ¬¢~pc ÜV;Ôº &qŒ>1®Ÿ©So“Ð$› Á~AÐéÒ‚AUD)ø) »Ó"¾ÝÂŽ±ìæ•Å ê#ß$W1¹’º8¦.‚Õ½+È\h Muëä\<[.æ¬ýZ  *_›ÃíèCýÒ©*—¦)¦N‰’{äê(Z>uu—€>’AŠTÛÊ„d‹º‡*ë Gn}XZÄ­lÜqƒ:x.½q§á+7Ùä¶Û^ïB@šÇ Mô,ö†ýmç?õhë ¨ÇŽBƒ®3ÀPbhc8ÍsWñŠB|ùQ3Hª!Í`Øà¨¹UÀ.(q­µ¼s_Ä+ŸÅ+˜µLí…d!ÿÖ¾üË“˜ú(]±•øŒH–&Ó|4RV2 É_~FþyÖâa’wA^QùТŲ—fovp4ŸË&ØJdiÝ×Àˆ3PòºÕ"…(ñ‘Ý®N¬Î>i4@!²Öù‘ÅžÂNåÖvãîÖ’‰ð*]å æ-@¼‹ÛÙ;r+eòpdâ»ì’\" ” œÙÕ–¦RÁL•3d*HÜ(Ž›Á‹”Q k¯Â@¸ 1à¥TªßF„ƒLêê5®ÈŠI”£ÖËL’ªAe!µxû‘ê^Ï&÷äìzé†$¿‘{–‡Á~tI->7/)DC¤„jé%¦†Y LpÀ´I’ž4×Qy†#”LGíÓQl™ M Ò¯AJ¸b2‹²ÒƱ¤ò™kº.§Gmö¬SàR…®×NØwns.´ÑÙ9M¸aTjå,-=³ןÓDD¯ÔÍI<G~¦¯Èψsú:ÌÑA/½mh‚µÖò ·î\CòšGU×.ŽŸŒß(§ ѳ§ù¦%:¤|ݺÉʹHÞZ&Ù}\ø–äzºµžpâÖKCÝ3¨GΩ™Ïñœ•ÒtÂc3@#‚òÞN{”R[¤Ëk´Y¬ÌHsy7KeÝB'z9Bǰˆäjà¥0C:4n=Èf|i“žºÎz’GNú[ʈËÍrM©cR‹è¾QkN^=kAyCªQOÚ†ñ|SWí Sl½ˆAÔ=ެ¡žJ£«g$*c$J8z)B¶ª<Ç"ΟÎób`v•'æsAN½gÇ]P‚"×Þ/%Å)Ò3G4”µ‰ÄµöèÅÎÕ°«ßÒp°°âš½ žîæõ—Ѷ›®ºØÆÌhi䱑xTC½OÒ3PÃ6±^ 9žØPÑê ÃÕ]¸’kÜÜ1Ívà äžã¶%kZTÈ+r‹$wÈŸàv8ƒ26Ü0àDHSN‰}úË) ÷[ηÞï"e¡‚®]iùpN‘­-ãwzÕ18ÄfÎÚ;öF)–¾ÞyCIëÊ…)÷T¢Ò‰ëºª&-#¨­gQNÜÜàÄß&D\c€k×ùH^1a£ÍÑóòX}Ï-†„âŒÑ©ÙÏÕÕ«2.&± 1ÔÓ¶îŽ!™f‚ÌÖU‘šJð†ðIB2ÖÊ®¥ãwgß¿›ƒ S‘Œ#.d HúÄTå0P.l5RÖB¿ø>¸Xòa”CHŠ,UÊw&-J1}~ºÉÔ^%ÅfÓWl"™@þ+µ!.tÜ‹¡g<˜Ó&m®î–7”Ë·}(.öô#`šß˜i4SëJm¾ùXêOÒæå•r…æS± ‰‹`Üø–Ô Rf&½?ÏØÅ¹< §ôx PvnSF‡IÈALm<’U9â€õ³NâKoÚþµ?H3*Ë“çvØ;= ºÙøg†]{¦ŸéF)ÖzhHc͉Ux‰7ƒ¬š»ÒK3¤es4½¿r¥´öh&{ùYgL ÇHk€|©¼¢·µÒÜä·i-¾M^7qc‚þtÝÆýÚ ìB#Ò›8ƒíˆWÆ}ñ™ÔP}ú qe\ŒÇ´2KG«IE ´"*KòÛ¦Û¡á­¯ Þ’ãO²Ê'Û““9fŠSjòÈ­¾×± M@È8éS’å–óPÞ6`À¤ð$ÍW® B²P™µL¥”¯Çþý¢ÅTJS›Ë”Ç—9z„ ËRPLJԄꓨH,„L`Pœw²ƒ²ß‘-åˆÓ*mD|,ª‚i‘õW4BU¶ïÅ€FÄ·3bÕP®÷–çk™]WMíÎ<ªáa ±¢ ë'^‘›>±‰e$h.ih-—¾³‹Ó ô*µøÙFîN)o°ÜpW&—lmukuCžB¹Â¥D¹¡«ÜhÕdk(^+­3/o-.ïûZx«2/¼|Эšz²dö$KîUÞà\_*ÃÊ®#±Ó¿‡Ÿ'Z ’Ú·¥V¨¢Ýl,T™c¥ÎæÜêº rïŒë¼ÛÝæêwÔck“Éál¦Ww†ž’R¢*øYÇ,¹ƒææöuøRÉ¢•µaû:¥Jœìœ"Liñõí‚2:óJ~›øÌ ¦ª¨Oo_É%¸óßO37ºŽßh%«ëòFŽßhy÷ríë BÛ5¸´i¤å4g;†×\ Œ#ó“/o‰=ÐHv¸ÈÇ@\·Á§þ¦cÐVÝñ‹wÏƒÈøÌ]¡ì¢4øvøöòÿqç endstream endobj 2054 0 obj 9783 endobj 2058 0 obj [49 /XYZ 38.2500000 420.500000 0] endobj 2059 0 obj [49 /XYZ 38.2500000 420.500000 0] endobj 2057 0 obj << /Type /Page /Parent 2 0 R /Contents 2060 0 R /Resources 2062 0 R /Annots 2063 0 R /MediaBox [0 0 595 842] >> endobj 2062 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 2063 0 obj [ ] endobj 2060 0 obj << /Length 2061 0 R /Filter /FlateDecode >> stream xœí]IÛȾ÷¯Ð9ÀȬ…·í90l ‡ ‡`&“`Ä™Cþ~Ø"¥n‘úJ¬O¯Kc$vºšµ¼z{½åÝ¿ü}÷Ïßvïž¿üg÷Ãð÷ó—§b_—EÿŸÝËŸïÞþÀ6ûáß»º)w?üòôm÷íéóÓçî¿=õ|yþs÷¯ÿíìîOÝÞýõoÝ~éå~yªMÝýýïÃßmmº§¿_~þ¯§¿ün÷ëËŒÇå†Íœÿÿï|]ÖíË.®¬üíéxJsøóÛ¿>½ëϵH[š²ÙïüδÞîþû§Ÿºé“ûÖSW¾.nX¦¶Ý:…³;cÛnžÆM–9ü™\|jk|ª©»–†‡q• Î-w¥¶ªzÐxÓÈÃý8¹<Ü«*©°åe×Òð®Ͻo¼3®¶¥¹Þ—«-›Ævÿ®ÝðŸ[ÎT»²—³ò”{š\ü.ª¢¬S]óa×Òð®Ï-F¹•-â²Ì“†ûirù+õ/³¦™ú°kixôW˜;)åV¥?ŠÅr*ÚoØëäâSWm*ÝïZÃ5ã¹å(·-~ÙØV8§ÉÅá^×Édn¿kix W:™ûsÄxýO€vÿ-ðáû¯Oï>o:8V»¯?u{;,ÙÿõµH¹û®Óé;¸|ýq÷û¢0þ»¯??µûÊ–Ç ¦)ZøM¿±’;°pÄõ{ûøµ»¼Ô€oÍqÑé·Ó‚½øâe/ÖWÇËÊÆìK_5íûzýå4¯?èÕóͯÖý¯î›¶8œéõN*4R<FüÞ»Þâ~ù€¶äÞ€sÃG3Fð:ÆÂ½MŽŽ'qó'뙎x8=†¬/ 50=ܬwðâP3ýx)÷Î6f&PÌ÷# 83ûŽ'øÖJˆÁ©$ƒë°ŽØOüN¦¿Š!Þظã5ÍÀ­Â£…m ¿QbKK€;˜‚š a ŒoÐT¶mÏw~Iò‚#áÖ#àÖ‘xi¶÷ñ#¾€ß<Çφ5û=qÒ÷jWïLs‹ é Bs]0Ša…´‚ßx=ðºZY«—¥­]Ûšàø‚!¯2𤊇+«$4gñáPa:  EÊêþºgÊZ^þ8ˆHŽŽ¢Ìj½òÕStªÄ¸L•qÖ0»†#¢²,11¨¬Èð½qÚ¼êƒÞ᜶㲄¸³±èLX´/2RP#Pë¤X4þ†0R–gjšw,ºÖF>MݴʇÓz[ 6Øe€) Ó‚Òy/by3ü²¸Å¤†–ðêæííÀ:‹;>‚E‹˜´ ܵ,*Š©ÒªûõÄTéoñ‹å,¦0Vaj,ðÃÁ«îÖ’(+m?ß&X aÁ’3ú?”•S6ÚžSEñQê^6,$0ý`‘ƒ½²‚…Áx†²®™‹¶Êj{N—öZ¨¼Y,4’{mO°¦È©F‹&…u8v¸6GEÙö8iì~tk{<ŽŠ […ñ²ÐÐùḲ®8nÐö³]tƳMÃVçoÆD#âãà°\|µDˆfÔ8°” Å!Т™È`8›pL({Šé cA [ømdÁ Ó À/Œq`à\ã …[YÔçÒM–i©,\'€“ðâqò¢ìŒ¢$"º?hƒ™ó!þh–×UYÍdg’Å‚w=fŽ @Œùu€û‹ªb²„kû˜b_Õæ<m":Çw 7KE‰ÿä#®5ÓzJ¢üN&¡+¹´l[3’–ÌíbnL܆i ÒlI^·ú*êª9ßy”Ïê>“¼óêFûež‰^dÂȱû5à˜e|ÿ-ñ«±· ܼøYa›B;Úbm™NZƒ[ý >ºå~œÈL…˜¬z”JÆÜ_8®~ãñ4Zú{È”ÛR7¤9ßãH@M_iÇiñø-ð› £ÐääÍ=Ä m¡³Å–“‘»ÄHÁ4X@[¨çÔflcÈÆ‡3†#ŒÍ”1Ñ2$ðóaXà :|ž,¤skó‘§jR ¡+!ãc©„e¸û%L¶Û9õþ0¿~X„w/€nZþ,¬ù0âŸ(8ÊÒºuÙ“¦—£UÑŽä(F YŸÁ›V¢Z±‚ØÍδ—nÕV‡Kõ§ SCêbßk&¬,÷v¢´øøo†“]ú¦E߸ç£öÒ?.¿ùæšÍ´p÷'5päÀ{£ ŽF†`—zïý]Zî Ÿt@SqdŒ¤—NZÀ]Ão,ü&°k¸·À-à½õiµw"™A²]Áç³ wq· qÇáû»¾Š½éMÑæ9Š#8«³To MƒQR#̦ ÷ÅÌñöà2ÑDüI@.õ”Ú =¿›AÌÛ.£vH¼àª½ûa“Ÿˆ•aˆS¤Â,¥-ËV &)*%êggÊÖ Š‹Tn%휲‰D vüdo¡<GD^°¡T&x{‡›¨?Z–ŨKOì¨ s“õs0ÈÄ8Õezh¦WÕ¹²§DþÇ©êXG­y_·tsŽLQy²Nø²à®^/kÂÞ”ˆ¬\öÒˆZO¼ÊÞ”bYBP=ÝMiZÍIÕê·eÜlU)nJÝÊˆŠ *åL5zW^ßN{¬n—³"38ó.͆I“IÏAÅyßTœ·±·TÍÒR‚-LåÌ ‹W¡xKE¢¼«þT¾:*Û‹7®ÊSóõû‚æ§¶QŽÞˆ…' ¢K(ܳ”S%ëa‰ä±åž}"öxGùXŠ^¸²>Ù¢ŒÀfìÊÅMýå«Yl#§÷ó8ÜßPEM‰"yÙ£ ÞEõºJA§*Œ«õ7žj2¦dAo,-ó‘qe͸’ЩK«Œ»z%؆_ÞE"Ìn™Ê–ÛˆK .È‹_œq1{ `/>³„ö;3ÌÜ©,mSO\DËfªH8Þu£'>ÜÉ›I3â×&¦¶Eññâ]H(ÁB¼³ËŠÃãz4ѦÂnË㳿»õ°˜r,`Y» M üÆça1Yí6ÌðEû+Ö!JµSl»Ât@QPßb<jñoΑmD\xFc´[ÜîÀ2¢í-$#ªíñÝáD$"y‰*«Â”-e ®ÜeªšLU¦R+< V†Ú–½žDhí¢wU0šÈÏ'‘Y¹ä}ú<òWÙø)Z¤J¶ê=U§qyÁ—M.U!P J‡˜±Î]WÎHÖÇ‚è`èÉ[MÜ'Ã]¨sGÒ’Ì•¹"Aתë,Ü‹k¾fœåÊ"²1+®vÊ1%Þ»4'Jï®ò§Ði%¶#«LO¦‡Hõ‰(‘§[Ü8gjIˆ´ÖºÖ®idëÛ©X$Z ʺ•c”åµ—KÃÀ)ß÷’Åf (¢9AÀÆ%šï&éú¶¼Ê—ö=¾òö\V±Œ4Ø -©ÐŠ ¬F§Ì´—B覚z6±Hi¶v¼äâ®´•¸h2ð‰Kðz‘νŒ¬´ïÑÂTÍS|·‰2pœDC5ºÂiy³)\{‘9_ŠåÉ%Ó#¥¿ÖÕ\É!£tж=Ój:45F˜î@D ®ˆ"6CÑ©KÑ)ÄæÁj1 ½Óæ?G*ªQÜÐ7,½—´:i×LH£°½¿>¥!¹cÌòÉ­7cGK*¼þÙr´¤ˆÈ˜¯ùP†–·ÕõåçÜ0à —µ4fLô¥š) ?¼?\›ZÜöêÂ_ʶ À”¯*K]äStcanàEöhq¡µàpÜK~§ä•p«Ú]T€A®ë‘.‚iRRAÔñM.;`!S'MÀ›l9 kæ…tÉÓdÄ×®<3øÄdkÙOdA¥‰aR’õ¿ˆÄD<ØÞCÙü>á¨U-?Y„ÈU2·hzg5ðµ´=ØÞïèÝÑÏl¯h¹²SxÞtÆžƒýNÓ{î)l¹ Èü–dò$$Å„ºã¤^‹ÄÁ†¥»(XRúÕªñ’éÃB«z´äâÏÂè<±†dÌ´,$ç´iF·¦\…L hÆ”šE å\ÎÏ!õÈA :á™FÿÐö‹1Î_”µBÎRÙL&¦ä£}RBªx}ç—-O={¦Í>¸á )¹»±)Žô9uþdÌ+á€]Y”\Ìš¿+bb–¦xS¼t ø%™QwáÞd#Ô¢àëÅÇCˆéÀKTßdÔ?ÆDŽy®crñl²žÔüÜ{ËÕõz¸ÀFÙ$rÊΨm²dy®Ãèæ½Ý7v—PªÕu{.Õr6õ²N — ð`êBc¢ž_lfy_Ãb&EÀ;ÍÜ w3ÿ!—zØb‚QÖ^JF­äÔ-ïXWbú#,_ ž/–ØKm}92ò’?ºv70^S4š¾@…½¦õçHJY¥Då’À{(Æ&Jj±nŽi+ˆÊÔKJ[8T¶µ™pøä|áX˜‰H¼Ã SÚÒÓ˜f¼& ¡"aqF°Ä$*’Ös{T."£t Ã3ÿô.Ïæ´bD88áµ”ñ¿í1‚\«î¶¨+H˜:–LR’'@sóÛ¥È(¢†CI»¤½¿=ÉŠ*®Ì³8•ƒ’ÜŠómy. 6O÷›oࣸp]1јáåì’\½]ÇYé݈œam–A+ŽªÀ‚«[¦D«‡w€fÝÞ»'ŠroB,jûbëoäÑT#ªwl`cC¯#ŒÖ+‘S}yëë®*I”$§œ²¹C[üºŒá’øaÞ EÛf^uñ'w!¶Å %#ÃRJ«¯Æ¸µŒ2h·˜©V-ü-7½°$Š URãÖÁÁ( –Ic/ë…ZzµD(#ðœ–ÖäÊ㊲ÝÈQNÁ–Il&XP€Þ‰#ÊÙJhÎÙp;Ù@³å ¼È:Ád#XÐɹ4ÿŸLoŠ»ê¹!kC¥Ws|5’]ƒ®?íêl (ˆ‹‡„ɤEоÏPz•Rwvªðh‰Çˆb LØå£ñµœ¾9ŸOà1wÄxñC0_ê‰eí¿Ö˜^šÎn;—…ux \+£FcHá[Ä{›dc0o]L ®ˆB üàÝŠôøNQë?JÑI(ôçÈ×6ÍùΣâ{]™p''8‚£…\ gƒ=žðˆ/à7Ïñ³YÜõ—èìÄ⢮]}Ý „«Û ´'vðØTŽ!+ ZV¬,çu Úê 2#²´ µk ã ü€‰8ÄÈ×ê!…/•Á‹©Ä`F «hí:p¸·¡XY “ D> QMkÜ]óåe°ƒÌ1Ðy#·»?»oÝQàóµ_˜a5—ûX¹}a^Þ¬vã —ôýeë Zi9»·GáôªéÈÐóËî‡7³7÷k šhwͤº´·OÃIѳ¶¡ýë– ¸Y3}rÀcaÿ6#.ÃàÙà7ƒa¢Ž^¿¢-‹p/ÿîv|¼è2þ¢ 6´ðEˆ¿h|{Z÷:H"?ç€×.M\çòÇ9#u0?ùˆxFvx$@noû³dЉä½évFðpî•rU|Þ}~ú?hÆ endstream endobj 2061 0 obj 4968 endobj 2065 0 obj [50 /XYZ 38.2500000 221 0] endobj 2066 0 obj [50 /XYZ 32.2500000 416 0] endobj 2067 0 obj [50 /XYZ 38.2500000 121.250000 0] endobj 2068 0 obj [50 /XYZ 38.2500000 221 0] endobj 2069 0 obj [50 /XYZ 38.2500000 121.250000 0] endobj 2070 0 obj [50 /XYZ 38.2500000 446.750000 0] endobj 2071 0 obj [50 /XYZ 38.2500000 446.750000 0] endobj 2072 0 obj [50 /XYZ 31.5000000 416.750000 0] endobj 2064 0 obj << /Type /Page /Parent 2 0 R /Contents 2073 0 R /Resources 2075 0 R /Annots 2076 0 R /MediaBox [0 0 595 842] >> endobj 2075 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2076 0 obj [ ] endobj 2073 0 obj << /Length 2074 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ðy·ER¢( àg€6CCàÍÆXÄ‹8{Èß»%õ4%}”X*RìÙØ±$¾ëù±X|ý§Ïÿ(þõ{ñúÝçÿ_ûŸï>ŸÊsS—ÝŸâò÷ÕýiÎýïEcêâë÷ÓâÇéÓé“ýÿSWàó»¿ØßþWÈâÏö¿_‹¿ýÝ>ü¹ÿèòÁ÷S#ûóßןm#ìoåíçåù·Ó_*~»Ô84×wÆý÷«ÊÔuyéÅBË?NÃ(Åõïï_;½îÆÔˆí£}&*U¢­dñßž~±Õ•—ç¶¢ÑUSnh¦‘E«Ûº.„lËÂÈvÒÌõ/Gå‚»ê¦1*RÕ]¯¹çC(-¼uŸîÿÀßi-›¢5BhKMÂIÉûÿë’(Sr/ÊSåìëm±ª¾öš{>:RòÔÍ·¤Ú SÓðOÎSåìU›xKzí5÷|ôK:©ûS@¸^¥õÃSðí—ÓëVnØyÔÅ—_lß®Mv?¾Ø ©‹WVU‰ªøòsñ‡²Õ‹/¿žÚ³–õÐÁ\Þ”–ѰÌGXæmx¤$Œ‡ÒkøF¼CoT kƒ#Åo”‚oàHU{}óá‹%úØ«T6dé!XH.¥€oÚpò÷,0&$L–¬ä/!Y*8ÒýWŽ´Ú˜áϼ•œb‹Aù†Ð7L£P9oLbé 3U¦ÞyHh˜)™¥Þ_¨b4kô¾‘„^S0ȇ·ªJæâ6ÒFHrÑ©ñÑ”âÖŒÝw®/Á:‹¾ öôð®&)'C© Øþ˜wIvP—`m†÷™<‚µ&agõ¹íVd¡+Õ<QôDždBê-0Ã!«ˆûs¬óæ1q0 Âº±“’ƒ›ÔpÆcF¹y8¡ÅÕ¦Ç&©[ –„NJ­¤ÛèÎóÖ¬°vwRV®x÷ NüþJ< ¥W›-»å™oërËnùËq“°1ç™1ÏáTl¡¢gJ¨o©»_Oº: ÑJcÄðrªP÷ ØÏ»«k¡bTXŽ—n'ì7Ʃ¸ |;½ý)’:3:«oËÛÉ$Qžu#ò˘ƒ<‚ ‹E +,ÜߌºÔgÐ éÌŽž9™è¬õJljàf0oãù\ßÏø°(Ä‹;;^.^yJ‘š”E§^ž‘Rj£˜‹ØµMx„b?Ìc:cÝi•bÿŒÙ‡bÒbîï &æ{4t5¸éª/´âMßNDªV­«uðª*hnTçzMå!N)ÉjE{fn(Æ4"ÅUšÎA¤{èbÒ{,•qï rÔcg§r_®pÌZ‘³à“O).Úà¸É‡ÒÊõ¡¬k3ãCi=rq샱uùF9U¨ûJË9J‹qbâC]¾1NÆm ¾¥‡8ÆOõ¹l•+<(ìN±´ LMÂN½½f–&½'TÏk`óêD‰¦Ò‰XL–ߣXtä@ØÀhI9æ œ¿x«)¦Cgµ­£s,‚9f¤kŽ5gŽ™zd-]îÙc—o”S…ºo`0ÇŒ˜3Ǭ¹3j œ˜c—oŒS…qˆoŽ™áäÅþ晤ؔ= ’©ƒç `3-$ÊŒaSŒ Š—«yÖ Å( âƒø‘µ …åx7d æ vHÆžÈ$ËÓ*•«€ŽG^c?zuË% Ì€Ð%J4N5–ht½ZYb2à…"ÖO 7Y/—(L‰Y/g$ob Pp,u)¦«[·#5Wv¬0ž±($DO1o ò†z¦ò¿:I¨A6­™X{§$IÑß„.€Ÿ/Dp7†Ó1#h^._M–®¯&Åœ¯&ÕÈW³ƾÚååT¡î|5ÑÎøj­mÆmÀ>ùj×oŒS…qˆï«É[b—I/Rð%Ä‚²_ó‚™zý©OÞ#|œ‘²‚,²‰.€kxáAâ»í>L&”²w2%;<9tV{´¾’bVø=fšˆ˜çþ[ãNTŠD9ZŠúYb±¸ôU+5š¶çyeSD2вœ¥<&_äGR²*LD.[^®ŽVKW 9ŒuäØ^zÈ0hY°þøçäÈrˆ.&4%ËO`HlÅ æPðìØ0I²´“$-Á÷xÄØª J<‹ŒMò”e=@ì œÁ6úžà»©7àaÝxzy9,14‰¢šIQ^xu(2·Ã‘P³Æ‡Ý)1H÷kƒP ÛÜ0`Y´ösÛe:EÔ1m+\sØdé4#/e{VŽäÒ/s{ ”}ˆ¸Ò‹bDG6r<šÃØ E ?=…E›)>àdÄ"Ïì*ð$÷”4”¼>¯бG‘Îd©]B{.; 4”9sq@H2î%…?a&‹e݃­*H¼‰³(ñ ±ñ‹n%GÈÄL¯êpù– -Àþ)¦ ŽD¿›²0àŠ 0þý6)*xG„S›v¤æòÝÅÊ8vV^„qÝ¢5C/V¨)åÀž²›Qž»ƒ/“ªÏr|&¦¿F,¨ŒøË´°nQ/àÃ( LO¾3µõöÕL ßÜíä®nÇSa¤O)Ü'íHB;ïàì(؃nåôY]™dUÜŽg¤ÂÇÓ3Ð\ß0à‘ê…Uˆ 6˜²¾]Ÿ o¢yÌœqùDoz¬½õÆszeÖûM`¦S ‡c“™â;e˜Ò”ob>€Î{Š/ÿ4¨Q५uXàj³óæNcÙA `Ԁ̿„ îT—Ѳs\ t$ïÍÁ£ì+˜!õ €YË#Þ(¤éFY(Y˃#²b³èv¤»x“yRìR ¿c©¿~ƒƒ7KA² xº0_r8b¼¦K®ØÁz•Èzh˜ùLb„Û™L'p*«9I$.QuFÜÒ¦ À©ÎrŒ'[ŸõÌÃeZT¦ìžsÔÜ·Ý’I1QŒX6WÛÇðÞö ši𡥏–Zñ·Óß™.Ìt<ÃQAD¶3ãÁ³ã™7¸ =S[[_v£¨‡ØO’MG‚”"JP8)R1•Ë÷"ël•r Ô3,Xî}ÏÊÓëkñ-žÔŒø¼(¯ ÁêTxîÞ` š¡ð-yN$9HчŒÅ{&Žù8É£Ý(ZŽtU"ОÏTôäPhêËØdYý±ŸèÎV˜.[P"œðÓ\ö§PèÕTPm¤”#lQÞËKr±î–¤çŠ$Ý©Ô0×oÂg§]Á‰9ðÊaÚÁôF¡ 4UͽÁ sÄB¯“Åíè–‡FÓI1UŽÔßܼÁ7˜”|˜ªp" ©Ê#Å0í`zÃò&œá•½ Ž´†eðÏúÀ¾I<£0UÐþó&°nÄopâ!VÝèI UæËëç§Ñ•º]ÚCPz‚ŃƒoŠLÌš1² Ëpú dIÈéJKñH)¹c²\"ËFl Ëœ§·Ä&X‚äKfJaÌ! Bj7YƒûÛ£ð ÷ ƒææÆöhºe¬Ë[è&©Ç¼Ë°€¬%–Øâb%,«ö‡µ<òožä ßj9à– Z5|ÝñŒÕfpqpÀ)‰IƱª¤BëþƳ®J§CŠer %£Ëßv‘#§ ;JÚ/ÊÙ–¸g7XRK3ÙHt:FV¬˜ÁgRºzåºHæXç€ÐOJúnÖ³ÿÌ—w²€÷öÕœ¦¤óYÞ‡”O‡qÂaÈÓéÉÞŒÛ4Ë™ô×ñ„cc5pÃv*n °î ó¬.ŽƒäÉòbðjâ%Ù5óûÈ™Û-Ù(Ï…©’/ikà§©Òi9Ð,)!¡L¿NaÉËúÓêܹaSŸj&…L‡“¾yžu´ÓœÕdé`;O:8ØŽg<°x<ž%$òó¤ãM;÷<×':˜¨µ˜Ž9êy<©­@ éÀǘ%M%£ ÁàIÇôò!‘uKÂÌ×sÉt!@òÉòÁ%Êîž­ŸSoé*Ž—ç€Oùg½cö®ó±ìvª?pqáâÎts‹Ïy{ŸØä ÔÂ190È"ƒƒ‰‚SpÀDçšMÚ¤@T¸Xžø¸Â2f"ßÿðQºÈ›æ)=RºSÔÍ-.vÿˆ2Êy~J8£Gà?¤¸ÍYR¢ÝòÞ›â|³&eBlpB1hn‘¹|bÐòÛ?§BùßÃ2+î#§æP~ŒãëS Âí¹v_Q‚a<|M˱káO©Šw®ñ?ÃÍAÔ{¬ö–=ªˆ2°ª„+“m~áœúÚô€D¬ Jp"Üå¹§‰ êŽm¾tÛ|­rZT„3Ï žKÏ›jK•°»F %ÌðBª$Ÿùïñ§f¿Àíòcw|ÿÝñÅ£0Q/Å®ËàŒ A‰‘Ô(ö=DC¹„r—1eÏvOIÕ¿gãvëú`æ«ÓyMÞ0–~5Gé,ÇÙÊ!R?kxiˆ‡Áx O ¦®%-æ™3Ös˜8Ç‘ëµ<˜bz±„æ³Y}èûN³<ªúÜïá;ͱ =E€c ™r=[Æé$Hg==»à ûDbJÚv]Ûò|uf¾ÿgcʦÐúúSˆî©*t}ýðòm÷àëIWg!Zi¬Bê¿QNê¾ûùõߦ½*ÜÂÆŒ°l §—oŒS…qøvzûS$.0´z‘ H‡£s† ÷–áuIÊ#†aøèÆ /Ìr’ò¡­Üºõ4ü  tÒ‚{1S§Ô#ív †ÑPÃŒí]Þôi›æAS®í¿¿É ƒÞû”|‹ÖJâ{ߢµÂcê[اÒ1ý¯\ߢûF9U¨û:ßÂþÛL} û´5`¸¾E÷qª0n±} ;´á.ŒÃ·8|‹Ã·XKÄøóp%ð¸¶$·9\— ]—¨ŽC媮#àáp]×åp]ör](;£:ÊjÜb­¨]Yo"ö\Ù‚³âûuà=žvðUK‡±#ª;aû5rÕR´©GmrNEÎ#É!È„ f!5†ÔBP„ AŽ 9 !È1„ §‚ é@2!„ á€¼ Â!°/öáÁ?½96UW­*WwüáÁ¯µ‡ïÏCzð÷žƒý[ü°’Å+x>-}°B2™9Á¤¬d°^—í^!‡ìy½àŸ›ŸNð73üß ~y–]à×Ó7}úyÖã“åR@šÚQK†À\ß>ö#E'À±-^ö\g‡ò“ö¤ ^ ÇÌ CàÚ`™^”‹ ¡7OdK%¸Ëï¶ÇÃB×á Ëx“4œ¼zZSC¦ý™YÅk„{ý‘gïDVƒi¶æ n§W slð±(¦9Ïì`+S#ä‡^Ño¢Ææ Ñ Ì!K<¸;SqQ(*>þáΣ» endstream endobj 2074 0 obj 4901 endobj 2078 0 obj [51 /XYZ 38.2500000 367.250000 0] endobj 2079 0 obj [51 /XYZ 38.2500000 367.250000 0] endobj 2080 0 obj << /Type /Annot /Subtype /Link /Rect [242.250000 695.750000 272.250000 702.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 2077 0 obj << /Type /Page /Parent 2 0 R /Contents 2081 0 R /Resources 2083 0 R /Annots 2084 0 R /MediaBox [0 0 595 842] >> endobj 2083 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 2084 0 obj [ 2080 0 R ] endobj 2081 0 obj << /Length 2082 0 R /Filter /FlateDecode >> stream xœí]YÜÊu~Ÿ_ÑÏÜ—µp’F ‡‚äÁÈCpÛ0|(~ÈßO/dkXäWd}}ª¸Lyà;£f³–S§Î¾üò¯ßþëô—ž~ùôíN¿v¿?}{)ÎuYÜÿwºþüþíº9wŸê¦<ýúÛËÓ—¯/_/ÿýñráÛ§¿üõ'}ú·Ëÿÿvúã^>üS÷¥ë~{©U}ùý÷Ûï¶V—¿ŠÇïëç}ùßþq±Ÿ®[Ìðß¿·m©Õu33ÿxéw©n?ÿüõ/¿Ü÷4IÛVŸ”5ö¤ÚË_ÿûß/¾ ß^œ[«T]ÙºxbšZ_æ1åeÝ^ƹ€Åæö#2¸øÐ¥Ž6ômÕÒðP¦Rޱ厴¬Ë;htÑÊý\îuc¢aËuÕÒðèŽ-w¤MÙC]Yqàü\|è¶jb }[µ4<º#ÅcK©* ÝTlÊ1:ƒÑåǶ¦Ž6ömÝÒ ¹«wpÁsµMÛ‘_ÝD€}?zØ×*"Î\×- ’þ\ñàç¦Òµ-‹¶?±¦» eá8šx׬±‘xm¿naˆô' ǼÀMÛóÃFšÙF[]ÀcÚO”I¬£Á¿ ‚rÿhk?ººx%ó¯O\CJª ölx±"'ÉÐx†)ãÑqÃÜ#_‰Êq#@â";/ÇJ–=l|pF-߆(©¤4 Ùv…nü;Ç*µ²¬L®} V¦0ò0¢8ƒ+„¬¬î·P™~¸%(ñŸ‹)êUFdUE9YUQMˆ¬ªh†åõGd½}Ç †0o'èDVUØ ‘UÆÀ¸"ëí;Í`ˆf8At‘U)ÕȈâYüÜ)=aEû__dŤ"c ñ]]ÞõH<²ºL"©VBäÚ#‡–3½ƒ!¶'<1ЇÀ3ÚG|I¸´CNH‰@ Ž`ñ ßö뀬œ‰É}ŒêJ9ðId“Â2¼|ðEf!Â݈Gó8DdN¼™sí[ÊøW1`=ü•‘01& [uð+‚¯QDÖ¨.ÄÂáŒß_Ðå’còÛ´‘¡›Œ0@·]ù3â¬è´jư¾Ï=™æ°'ÉXÌ ¨íР¨Ë)ƒ¢®{ßå× ¨{âcóv‚Þ ¨Í”AQkw=2(êÞ„ø¢Nß hŒ8ûÀ³Ò œì_²$Q›  pè§H„_\'5#x4…€}m8 @ÄÆ1b«jX>ÁZCQVԈʲr9& $s¹Ãq91aÓš¡°ií”°i+G¼|à ›×ï˜Áæí½°iõ”°i•; ›×ï4ƒ!šáñ…MÛö'“½×G»R2ÞkÑ„y jÆ®ˆ1KÆ#˜‹Úß)+[Ʋ}ÆHD¥IÖS¸4Úáj«Ç ¯o'_ËQëAR­(›Å˜I/â]ð´jÛI‹0•« ý0€\¹;MDîY•Ã=%¨±L[†ŠJÙÅ]yÑ™*›¢qeÑ^Ô4#»ŸÓ7CUÔ|еľvÉvdÃØ„í—Œ \´ã ¸$ ¡ÅÒÀ 1¤ª¨-Ô£”3b¦hicüD¦Êr‚ö¨˜G Y†Í¤¢Ü;Ì‘ˆo"³¹qÌÏ[Uã0°èŽo9Ê.ZVeÔëY?šýÞ×Òžëª ô“Naæ§éùéúZÍrŸ+åŒÁÈãæËëJ9×ìKwÍn‹)Æ”/¯jøg¸ãì{X6Aãwà~pö=“±ï©]]0m5<ÄÄFé¸(jMFÑ€UoEËjEGeÔ¨,ƒZ¶°˜Ú‘-˜¾ôŒ –ª¾¹Ç¾BXÁÝÊ3 ÕɸÂõ ÖæQ(£|ð÷—o‹Jpˆz$Ê#^¬)ípJJcB¢ÆJˆ‹+À¡G8ýeC£<×t¹éqñ‘Gâ1 ‰$qá&QkéÂZÖÁn6c=Ñp‰Ì†Ñ‡À~­R~ \Jµ#Ý¡99,€'Ûù¶ø$z…(Ãðd"‡æÂãÛcÛzvýë‘ßD•ˆ’Å®í2ë;‘¢f^GD}­ŒƒûÙU¸Zßì‰\ÄieëÞaÒñÁÙú%¼Øþ´µ²0R룲0RÅ´$ÍΉi4´Êá1GÒKB`Lác™¦ôY¹Ä_M”†g?Kƒ¯,û­¤¸iÊžðf^/óÔN-zbJbøÄÀýàà'^|‚G³x?øˆö âÆŽbè` Q’óìófáýxî¦.ð|>ðžb¬O)tªBÁÇïOÀ”¤Ýu%dª)#_ú=";k•uä4†Ö2|?QÃ"}?DUôù-ÏQ:LÏ`c$Ù’Ê êy¨=æ7¸Ñ“Ho Ù»E0º ô„Z.Š˜4öÉîŒ`êaúiU‡ Ížýàw˜~èõáE¯¿¸ fñÅ70šr!¶Ù媪—®Ÿá.”ƆL |Â,Iµ='`@ÉÃù¨G[^Ö^VF•mvBED,}u° FP}ÊB¿eÎ'aûÛ ÐôMÎkuÇ|¢KÔ6àíÁRêQ~ÁÃ(F¢Ö\“½0­±Fø)èÁÈøM°ÕÜBeÝM“k`,Yun¡’..ïhõ9REìy }=¥eÓ¤˜x,Œ;û¤.¢1ƒG‹¤ËÍbÒñ…„¹Ám‘k¡¼™gõP¶üähuZÞñÎɄ޵åê%9Íå€ÛN3lõNª—´6eõ’ÆãéT÷IÈ?eì/ÌØfÖÉØ³vjÀjÞ™5wM9¡OêQeb<~§‚Oð;pmœ²¶h4«ÃaWÐ]æ)ÞX±d¿»ƒGžøòTeïs¨p²Pá]‡ðÆÌc©­{/rÈð±î:üu´zó!ü6äà磜¾Ç§ÉŸñ1 ‰F$ç ‹§È³PŠÊ;Ž`¸³hÒÅë;DŸb¿E•ç¢5Ãy0MîBÒtÿ(!?½ú}å<< 1šâw>„¿#,‹„.4/ \Çs1‰ø§Àâ€w&¡‚  •½ÃD»ŠYÔŠ‰V÷¤éȦ¬ºwƒ lõdÑb„O•"Î'›Êq|>œŠ9káÊUûø©X¶i+t"á¢ÅU„õÑíêýÕnÑײC~oá1QEë@7YûFó§<¨hÊÚ–~oUc²ªÒN£bÔ9wθ‰>T–šlÂ,£‚ÈÊ“¸PY"ˆlz€‡ÿÊ#Eý°IW4i8Yj ¨2ìN"eØã>“å©izñ“1¥ÀÐaès³‚u“˜5W´«çíÔÓM0š.’!¨ËE$ÏQœ-Ãa}4çTöðË]…íXL0©$òU2¤Ö¯ôØaJ §™ç| ]“Çe…aY±’RZWYóÀ€±ºÄ\fB.ðàÛ‘LiºÖεõ¤â Ånˆ$ÜÙ¬‰˜vXÓºð èý6¤È–Ó>æñ¹ãÆvK"á…IHJ‘Î]¥¦Q$ꜥ;g@U‰R52‚2£<ôWS²uy ªGÓ!*ËŒ ë‹ìÉjÉ”5yŮ٣˜p’µö-¯q•Ê%ku’5R; ã|\CLãhQO ïÙƒó+ÞaúAÜz“²ÆLYÿ-^6Û2ÞS—éh¯ËC·â ÈÂíC9(×TŸÈSJ`,-ÛÙC¤‚ؽ¥ÏyQ¨"¼²É´¢jAHЬhdä@[*M rõZ‰˜ïõËCËv)ÚgNÃA4ÊdAƒY×|¾ tåp؃L…kD0”{dôdzBŒv,¡Ïy¨d ¯ºÐ妺I`5£DáËöIHöðyK5÷ô y¿}ºVë"""í2>žøŒOV;œ/r^y2ÇH€“-rs“ƒ…wS<ƒ‘D§!£ (¶„Z½ëxඬºo‘½:A…”Rå¤$׃«?EDM­´‹›„˜"ÛNtË^¨È â;¤©’îéïGDHÚ£½…r©¾BYVß±¢È“ºÅÂ1êglð^ÅìCÛ–.oÜãÝ4…eÈ&³jÆÂïåŠ(ä–*`ïÐÕxZÝ:·7Wã‘4¢éqLwLˆú£~•ûKQÂ'ÑZç$d½£²©™S뫨fÚE(e»)Ó QÎÖ„«·®›ƒ§Tíl/ÓrIYŒù¤ÊGéDZVl/áˆëSËdU^#‡ ‹Êu‰Ü í¤yïžP¥ê‡uï~ª8ß í£³+Ïzdƒ'ÞQ_à;-z§¡ªÏ­Fhw÷ÿj[p#´á<ŽL½ƒWð ®ú# Ï£Z¸¶û~ª³QÚÁìû ê³!Ø+Ü\5žÇ³¼7Ýí8 Fë‰UkÖ†Ÿxð¯žÞ)^µnŽÚ¾Çy©¦}Sg*ÙÜ~’œ˜®+ùOzâÁ=ºx×x´Ï‰¤ªkÄr·˜0’<·*°;Íh«”cýÌ,Fn­-Ra’ó™p]‰ &l§Ùsž—S0Aå2Á£éBô6áUÛá¹Ï˜’bêŸPwS¬ô‚»YW³{À•% †/æTð6yh_JjÕ–ÏÜ“¹S]ù¼íÏb=¯3ô.¾µÈV½Èc˜€›Qù°lÊ6¡çT×lš`ŸR¦Œ=Æòo9%–É4xJÍT&J6¬ŽGU61SI˜L;áa*Y>ÙtT’H1 Ù '(¾UŒe¢)Ùëw"gŒëèȆ“Œ‚Æç(Ž—Ç¾bј**ó_´F½çø#÷ÁÛsàÑ’¸¦ĺ¥—G¼vW>‡1+Jè„(µ^ÂM:!6Fâ@ƒß6œ¥}èeCÜ"ÕLH„#Ùmp¼'Ù¥Q¤viHi"ú)$õðÚ<ÔóMˆ; 0nç”n‹²nŸÀƒ¡ˆ÷¡!â)ÁŽñ÷L`öƒW€¹q7=x‰) †vEa¾›˜¿{xA×5Þ©˜;nÁ=k}™¸ç×S™Þ=½i}D4lÈ@IÂsùgÃzÆú¼?¥îW•åÎ$¥îW=Ê«Qòa¢û˜µÂ½>ɺ_±iÝ(¥ÇA)Ç,±ãóóx Êè~ø´ñ;:ÖŒþ‹GcÎô`Úô¦u­¹pÇ42Akê&3¡‹µ}ä à8Áž³0W~@®ºD(ÏjNJÆ_/›Zj&T¡kV–6·šˆ§vnH%ª~¶$v,~&îBµEDHÆè5žKÈ­Sr­T•ÃÄä,\‹‰]Âdb¾dwÊDÌõ1ýÇw* ®ÐåÉÔ ðªÄôÈ l²‹ej楩©DEê®UÑHfå€,o%«g5w'£ÆÊUùe¥Dîâ ŸJĆ˲JðMi¾™— ÙC& ÃüqIªv`À½el²h›å| lvUý DÒ%D JâaôÜ5¹®©Ý3Ûr>6‘ùÅt¡O&ºãŠ•©²^%J§R²FzY˜D‚,•¦–Jäaj$LuiôC B0=N9ì~ÄnÁá+Ð8¨IÁyˆ0T&@¯ÍàaàqÎâʺ®q˜ž†=x„™Ðx‘Êz¡†ó 7•™5ráiÑâú‡«K“ªÇž,ÏLÔ&i§ˆ ÈÈb×¾ "ëÓYÍs3“˜.Õ¢rY¡#ÂþÒÍb¹3#8•ʾ~ÐC€\‘+vµa+5Õᾃ«•ø‡xSÅúÄïSZýÈ›Ã*V±rGÄs{ÔKl2€+ÀQÁ-˜ÜL"¦}Ÿ‘ÞnL®©py섹mµ‡ÜÎTïs§÷LŸÌà¼üœ~\Ö‹Ó_ç¾°@;h¦Þ(s¾lû²Â“îó;3Δüy‡i=Áâî”CŸõÍð3Ƹjü¤“tô¹su¿9;e…W4™“<¦Öö¥Û)ò¶cQغ⠶ÕUã v$ “X&™Ø†Â£Áw:iEmýMJ ‹pw³l_PJ—áßñ4Fi|z ÚF;ñb ªøŒðª_zvÄö†Ö%Oð<Õoê|FWãœ:ئŒ±Þ‡N0| ë¢9«ûÆh‰7÷FrŸ%Ê_O__þ¸£i endstream endobj 2082 0 obj 6531 endobj 2086 0 obj [52 /XYZ 38.2500000 729.500000 0] endobj 2087 0 obj [52 /XYZ 38.2500000 298.250000 0] endobj 2088 0 obj [52 /XYZ 38.2500000 186.500000 0] endobj 2089 0 obj [52 /XYZ 38.2500000 729.500000 0] endobj 2090 0 obj [52 /XYZ 38.2500000 298.250000 0] endobj 2091 0 obj [52 /XYZ 38.2500000 149.750000 0] endobj 2092 0 obj [52 /XYZ 38.2500000 186.500000 0] endobj 2093 0 obj [52 /XYZ 38.2500000 149.750000 0] endobj 2094 0 obj << /Type /Annot /Subtype /Link /Rect [189 737 250.500000 743.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 2095 0 obj << /Type /Annot /Subtype /Link /Rect [210 486.500000 240 493.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 2085 0 obj << /Type /Page /Parent 2 0 R /Contents 2096 0 R /Resources 2098 0 R /Annots 2099 0 R /MediaBox [0 0 595 842] >> endobj 2098 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 2099 0 obj [ 2094 0 R 2095 0 R ] endobj 2096 0 obj << /Length 2097 0 R /Filter /FlateDecode >> stream xœí]ˮܸÝ÷Wô:À´ERÔø ‹† ddÌd ƃ8Yä÷£nI·ûR}(ñt‘z´Æ˜±çÊ"K¬bU±êTñÍ¿üýøÏÿß¼ÿòïãÝï￲Si³öŸãù×·?ÐÕ©ûó±¬ìñÇo‡ïÇï‡Ï‡ÏͿھ¼ÿsó§ÿõñOÍ¿¿ÿú·æ‡?uéü¾JU6¿ÿzù½.Uó§ìå÷óÏÿuøËGì§ëˆyýÿ?Ø,¯õ™Š‘™¿ú¯T—_ÿýñ·Ã›öûƒ&QYVWùQå¦ùOëãþqø¹¿=;Õ¹Re‘—Ùó”úÁ'5œ>ÉòË“_›U¼"g“ÚͪrD~b,ü¸Šø‰<1˜¸ŠÌ÷0O2¼ð‰g¸ JŸªÂßÉÞÃ'áMÐVk¿Ëއ?$¿”Y¼ÖªñhJò{4¤yÂpγ¢xuà—zt4¦ s›Ø%½Žç)j|S<¢íà~}’æëǤ“¸ï;›!@O ˆÉ³ 1J9jP™“Ñ•jr7zuªêìB©+b¶e H÷Þi6?å¦MÀ¸ÆÈœl^T¥²çÎhº‚£T+…Ö@áïɉïÁ´Á/Åë†i3 R ð;øKß'Ø>:«‘5ЧUØ cíËØ&l3°*bïm]ÎJy6]ëÍUS$M‚Ùíy†ßÓ—èÚË3ÜkñfVô"r·2¥G[5MU€¡Ñ•+Œ­ÙSª_ª)¼ª1õ(#, P½cæérúþ˜Ýxö¤šùŸ z­[TC<‹ÒE’Ô9lsüv°µ¾ýÁ¯‡/Ñ"7H¼Ï$кïeÌ•îø&xí±/ôAÊL5L«ïš©ÎJYÕ/G»Tv²­Õt7ƒ=éÂ: ñN†ß©Ñ;ݹ±Ñ¥r¶ð»uV›×ºCÃ'ïÂ)èäêÞ;‚n£Þ{R£Ñ:-YœŒÒζo)(Of FÐ<˜j<ç{ *Ù‰©ª{2ßz˜ðâCœ· ÏðÓ:ø&;Jp>Ïâ0.TÀwáÏÀŽAª³/áïÉzê”'"!³ÔÄî ¶pØ‹ÐHx›xâÜ„«ÏÞÀ´MßÌ9ò^Þ¹$1®1Þz¢šÊãj[ÏCàSDcf•r­™èI$Êùõ±ðæ&@ƒr‹m0µ‡ñ;–sña’qŸL™“–|æ¬UãœauBD¼<›ƒXƒî„&!¢>³'Ô3°3Œ`àŒ'ÆË…õ?á÷zÆøé-P­s×¹Dxërl³‚©`>S~ß\†Ô#âp‰šnxöc€äF 3…ƒïüà‘h${SMKÈrH!•êMµñ^I”WN4?Z îŒ$ßuɨD`¿ŠÉŒ†|†hÒ‹q6óïS‚ €”ºÆ›á­ëÒ࿊÷vvµ)|b¼ö¡—À$ï±À‹„¥Åp,}þQJ±ŽcÔt¡^“†(ÇHŒpÄaˆôËñh˜jcéA—¿KÈ“ÊQÂO_ ëz”CóKÏ j’p˨jÕÜòÈ1¶GÍ0²µ²#ÉTw v–‡1„ä=ÞnÅǸ£ðÙ§énÁ3 ¶lݧ»æÇh˜dòÍÔÙFç-™?¸wÏJ‰+Ô8=žˆ E–í F` ©ÎªD{þ=#+±r„ r©{œ¢‘lªã‹©UŸô˯Mhܬd¿lx|‡E¿çû}B61.¬”óió#ÿ—ß´%®€«¢pxb£—ÿ¨Ò“Š‘tåÙ©h:¹úLÙSæö2‚áé¾c‘îM¡€©‚¢‚Ø!‚²ýãdªwHҨʊš¼)m(ã‰Ìïò6_¬ŽÊá1-S6Çc:Ù0¥‚D‡ªA.#€Œžm~†yÚ9Öa!Ú€]9{ÏžF¤"¦)ÜÐʤwC«Ü3¾Í­¬{º›×7𱤨ﳄ‰RÅ\ÒÚ¥sþ¶F{;JÒ¥Ú}Ç­úŽéI+Üjy„Go'ˆ£ä•®*GËSÇ"°!—,¸² *ÇÄ3>´´ÌòD– m%:ÏQ¹ù¬£W]j¶ tÛî›Ü›¸KÐ=aÀ¼” ÌíµŽB}:kõ˜Îð‡2BBöÀÕ<“å˜$&Æ%z›•TÀ.4Ñà /±G¯DI{Ü&ðïòz>ÛâALßW—FIº=‘£ƒÝ¥pWs‚£ƒëìÈÄD;G{(ÅlÇçGF#qE¤¶Z@DÖÆ†óýÀ¡|ÊŽ§"C‰²¼ž‰áY˜€áªÃQÜ„*¶Š†ÿeƒüX°˜*—4§þ¨ÁHíj¶ý ¿hgmì,’ Ž©_D%nQôúOï§Ù½9¤òõÓ–ŒCR/á+”™‚°ãÒ]`5²{= ìΓè Um&‹Õ I’c-Í$BD!o{|I¶3A¸Ù5žø)!¶²7ªr„(Û¥ŠÂ§ŠÌ‰Á‘H)†\Â!‹’^îé$Ë`R22Af¦n„‹f滣4JÁ¾7°NN¤øU¢~À“WCÄ<0Úµwø“˜Æ815ÿö˜½IÛyÎì~ÙԼNjJ• Þ]n™ :>ö/åml‹ ŒÉíCeÌ=‡‘+Íà§È‰±î!Pò¬Ÿ h[îÍݦlˆužìN¦«ª:ÝX°Qö˜IycOrq\x@žåŽRMÕGl©7MAëÓgŸ®æçfÎÛAÕ«AÛŸL¢F…Pc]¾‡uêT‡÷,XŸœˆ8O·_ä£åˆrä¼°—u­Oç÷¿lñ꿾x$(ŽèIxÍìýÚf¡8~Ê>’•ѽoo!Xµö]f组éªrÂúî÷;'í^YUõø>yªûëlÝ7/ææÛ4ÜÒý½¦ ¸ù³®ôkf߃Q%*¼ÚÚ‘zÇï챸ig™ÙQ6Ì¥ 37N2¶r4XCQ›ºt¾ ˜X7úùµ¢wœWùI+'î§Ñ;£'Ã{;fU”…óàw ø¿ië²VPF<ßð^‡™l|»¦g}!ÊI3%,/ –Ø%wL¥ÙGÛÕͽŸ‹âýœÁÞl£OÒ|]eû5õ¢u.༥CYY—»} LR¶ëùáÌ¢Õ‹õ=U¡‹‹¦0ÙËîhéVÙ©ÝôºíIôóNß©Ñ;NUöÔòåæOp´®²²è—ûº¸-ïΩ>7“Gë¬Ty2ÞAªU»ÅÉ´Dß¼óQÐùe÷h{iShžî@s‡¶>3BJ•S6¦‡.uiì{²ý˜À|‡Šø‰–šSuMŽÿ\W§ºŽjxŽã¢ø¬‹CÏ"qQædÈÄÏö‹¹n`öV›TÍ‘C À©D&'\»"›6Ù¶ö‰™ÌÖ®còš“ìM‘Ïz)aù¦V¯µ0ˆ&ÄLÖFO<…8HƒAÉpV¡'8D2û=|1¯'äƒÙx àZ{h#Öšá)um1uÇ­>1(¯5OX¢rþ côx@ɘ[x?CùÇë뙇(5’Ý3k!,ÿ«ÔƒKÞM)ü¹îÙF,"6|8# »)g‹ƒoäØ&ë§ïiƒÇ&¹¶G”=KFLîÁlÆ3ù“`5cÆ”rÌÙæ¯j¥ßšÇ‡±uåzÌññ÷~Ì}Œ(’Ez¹ÉdNyÁÙàb-¦/Œ+X#´±&CÂåb‰ºÙPöƒŒ½Ž }\f ¡£z“xUjD‚<É<—¡a,ÀO t¤ð“·±Õ¨)jwéjÝ©œìú€+zÃm¯¿«Õ#ödâ*.ë¬ )²eŽÌr1%ç[»EâVhªn@í¡Ûe›C®3„3›>—h×?쳂ÕQüί¥™n+g‰ÔuîºU{ÂlÝ ³˜ECª¨¦{áIMÇÃ3@Ìéþš .’i!ÚzbkÆE`Úk9ÔÆÁQa‰«ŽœÕ]rßñg>”Jœô;È[ŒnÇò ’Œ†,ÝKï½V]´%S@ð@¶?L²ŽOEû2‹ù£XKéÚ0‹Å+2åúX: ­è¹‰‰è? rTÉsýÆé¡ OC%l•ÿƒX”•z@'B¦•V[Áá¢9a{¢eA>m*½Äœ’§·(¦öq‚æpµv “ÝHr@f˜i4M¹ýY²Þ¶~9¸§êý€ß]z$¶À}4š‡ê•;/x¨†Ý'æïX‘¬Cq½1 á˜FŽŒ‘èžå ·bØØ "rCÖlm4eã9YPY˜.I!RÊÿD!0É+bšªpíÎz.OXR`ªK5PU(‘IÖ9{o,”ƒi'¾{¡ÛõB“ ¿òÚ5Wßä©mi³ÒÖ,É•••U¹ËƧóÎ)GtÃ)³€VW³9•îRƒW!Hµ_2Ü|?ÙõÌêôLS³å{.AÝyé’™*=÷lÐ¾í¤Ÿç*?J–i)ê~7$Ë´Tð­uÙþˆæ¡²@©0É¥é/qîÚ„¯ì çAáj*Õ¨pXÀÅ•óWÄ 8%?‹l½“—ìu޲>PäkKdÓ -ñ/ ÇB,çÆ/a¹Œ_Á`ÄéKÐ~¨1‹á“nô©pú6òVÐ> endobj 2102 0 obj << /Type /Annot /Subtype /Link /Rect [230.250000 425 294 431.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_structure_data_members >> endobj 2103 0 obj << /Type /Annot /Subtype /Link /Rect [237.750000 202.250000 267.750000 209 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 2100 0 obj << /Type /Page /Parent 2 0 R /Contents 2104 0 R /Resources 2106 0 R /Annots 2107 0 R /MediaBox [0 0 595 842] >> endobj 2106 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 2107 0 obj [ 2101 0 R 2102 0 R 2103 0 R ] endobj 2104 0 obj << /Length 2105 0 R /Filter /FlateDecode >> stream xœí]ɮܯÝ÷Wô:€[¬°ôžd@€,Œ,;N`XF/òûéì~]ìSd¾U$»+Š-ëQ,ÖpëçNïþüùÛý¾}÷áó¶?v¿ø¼)vuYœþ·=üúîít³ëþ{[7åöǯ›oÛo›O›OûÛœ^øüá¯ûÿúßVoÿ²ÿç—íßÿð§î/þÂ×M­êýï¿okµÿ¯âüûáçÿÞüíÛß#öŸë&sýçïJe+s˜ÅÈ—¿múUªã¯ßümóî´þ ¨B·ºÚ*kìVµVoÿûÏÍÏûñûÑ‹]k•ª+[w|§Ö‡Õe¹UºÝ´ÿÇýÎñ—Ìèòc·ÖFû8oé-Q¦RþÁåÎÕªŠw®oF—[Ñhæ4ïHçê\ð\uYw»SÇØûóèòc[oìã¼¥·¤?W<¸à¹–¦çfÊÊïÏetù±÷Ë6öqÞÒ[ÒŸ+\ð\ëýOO»SåøÝûs]~ì¦TÑÆ>Î[zKúsŃ žkÛ–Ïõ2ºøØvÿ§hçzœw¬sŃ˫Um{Ú½gkò{ßá\­H3‡yKoIw®žÁϵQgùa.£ËÝêxcç-½%ý¹ÿ0žÈé'Àÿæyñý—Í»{R«¶_~ÞOìø½Óo_¾nìá{£²Þ?ýiûÇbÏnþ´ýòËF»ªVM]ÿÞñIñáøÄî¬9A—'¯Ç'åÎèFéòí}|Òìš¶¨®ž(üÄ¢'æ~§Bï5üNs|bv¥­ }óuzgÂÒÕé¯*ÓÏiÊÒá;¦€Ë€£y6˜qˆOïžZÆôÉÊ’[aᇠõP Þ”Æ]`‰(ÓCÍøà…K×-}‚¯_ö ï>f¥¬*¿2Uë2¬Ç϶»ãl®–×Â'/áOô{øŽ†O^ÑSÁwàzº#Ø`( ªÒÙ]=,côÞÄ%žÃ'ÏSBY×· áøÍ·ƒª’¢¦ÍF̦QÎltC0mBx˜6!„ðeÂëÁZŠGƒrèãt"jx"‡=îk}PG·_7Uuõƒ_7Ÿ“k¤‡)`Ò‹õM—ïy8Î I ”¬ŽÀ«÷î ˜4^àð8mÝ1¢º*Ùc¥ƒÑJñ¬¿Ÿ¬¯båZ™pKOÉšðÔ§'Jõº‹gàõx6ÖÙñ^{Þ‘°­<Û—¶‡‘â»5[u£’Á˜X)e˜3ˆb ÜiÉš¼xSËÉeÛx—(=O)ù…¤¤R¥k|%#‚CSÛˬS üŽGe .fß°3¸ˆ ? BÜ2Yy9TµbH‘˜Öyg½¶”Ô¥ AA¶Žç@ð¶c Ç·ÓÕìÈsržþ8]ÜÎN2Ç£ÿcJáQ鈗Z7•{«ñÚ¦oƒÇX$FÑ—5<3ÀÇÊÈ­Gweu@\ µ>Â)¦°í5;B91fÚ)AOº£¸ñÄâÑð¬ñ;Æ30ïžIÕ\ëCA7ƒVã]ôP…˜25aGšúú‚ÝšÏØ“$3UÅÓ:½nÖ&Üy]ŽÞbüŸ‰å#Ì.zfð=qöj§eíø=É4?¶‹•Y _lôµZuçüæ¹Ñ¦¾þäP*ÖLD£xtV¬12ñ0"¨éª*e' Ü È3[àÔ5óøx\ŠðÜ0'»˜È0ÊŸÆa*3øá‚ 쌡*lT‡à#xJƒë“wGäbiëH3 ë›îd°¯éô…CTy¶£Æí‰TÈH-šlëŒÐ²)zŒméZú^”\3ŒŒÎŽ[Îǃ7,âªêžÕeÔ¦çdAëy´'ôÄó| O£WàïhH½žóaÖƒ=Xf+U˜biò!|‰Šé¾3ºi¸wsæ¾pÙd‹3F=?fi˳ÙÁ7Ò? `F6 ƒ‘AE*Ú#ø;Ù`rWÜ‚…ñŒ"AÂôÀë(ÇÂʼpjjð.ENòÔÆaKù%¹GGÓß#r\S+—å2çÂgŸE•&ƒsÑ–˜™cÚÆ<„Ÿ$ÍMyƳ•z6Î7±P¹1õ«í5]ýŠÔ¯M&ä•' モšQÌ<Újç{/wEk®gð=í$J”îMÙk‘|¦Þ‘(â: YÂãJÉ$!¸%“N‰Ô¸^D¼]ð^FižïL'b&„ñH¯JÚÈÞyÊ‹ïU¶•#𢨸RÉÒ¢ˆG个ٸR›Â¶`‰J¬É’N¢ï¤L2Œ-$ê r:Ä8”hlTHÞêôu‰èfØØ¥ˆ˜šZ€¹(21T3«¾ Ŭ·Èdó%cÝø®¥²³-†‚#Îô"w ‘ñ¡«RY´"Êã1*Ã#+¢Éj]1ÁÒÓá”ÈÏÔå ²¤ß+åÐqä Fô {*D…•°}y‡½ÌÒ/ùÞ©;6ôRVõõÔlpÀ·ÃnèEú–Mu}‘‚‚ 1í¿*î /›?LÜó<>G| g2Í¡ÒöŽÓš7pD…®êöšü¥¤,“}9=?¢jt`°G‘dfJ1(àNÄqÍFÖ~‘-§¹¾FºÑîíMËcƨ™gZ§UäÅáe†QèOLÑTV¤tñ€x˜Á0 ŠlÁUaP˜JXo=a~xmúÊ7ó«ù*¨Âf*Ì:šßÐðÌ ç‹áÀYh§‚ði{v‡ÉÚæ>a^¥2êRÎÇc¹u˜^<Ù—ø; U2wF”*4\†¹Ãóó”E]«kk4ÍW/•L°ÔÁTг»!J›®S1÷1Ë#Ÿ<‚ ÿ’ÁYÖ†¿ƒÝpß°òÔ\¸„oÎm( Ÿ%"åôÒFå es®l$'ûGœMÓ›¨¨¾À1hlH.„]dS@˜L&’J‚"@H Ê£¤êš=W…UÙÖÔT+<¾onôrœÉògÏèÄ)¸!qExóþ…;îL†uQ(|4FpžV¦u䧇âˆÂ&¿ów^@½™%{?+§©#IÙ®‹r}P/?˜£‹òa GwÖ漧 p J4B¦êZ¤RÙ[u¶d³—œ7Ø£e15›Rµëcº»b©—ÆXE©B—eSt—Sµ¼: ËKÝ‘áL–´Èéý×=“_–Á(GB%»¸ëŒòyЊ-É*7<P¹¶Sy@8Óš@µd»S1F3§¹q=[¡¥U’‰Z–Á4ŽPÌq™·â2Eë)Ç.´Gœ†Çˆ&0~fÍ`ü”"ÒI.•'IÔs€UUÆf#=ösi£Ä)¢ †¾;Ÿ„c$Š‰È–÷™?Û{ÉÀt‚ªC¶!­õ˜R4„+œª+&Q½ˆÁü„ýÎ vg+«ÍhëbŠëôè3CLÅ vÎØ³Œ¼!N›Ê!$ö€ªØ#ê?HV(F¶êÜØÍŠêO­\)œ!Ö%džÇ/£h¸ (Æ›kÌßõ\cž»_¸Ž<8á#] Ó‰ àÆGeUëÊDæ »Ÿ2xÝ£¡6™s¢&‰H-ÔÔ…I•õl³& ËjüV`Lä›?6‹Ñbe›@Î/í&⸙ƘGYYå©PkÈjðã©ÁÃY4:ú<èÌxd/ƒDÄ5óæ-§Nk\I´ÊÐ0')_¶JÍò¤0Q2kŠQ—©]’µ£…‘R%%ÒÆD*þ4èÉã¥|Ë 6°pLƒ'8$}eT¥‹ÒVš}”¬5烥Ã)±&c˜^]ŽOs~ÔU¶zƒµ%å…ôtÅkmq.Fäé³ *T˜ió—hÃE5s!Ã"Öõ¯ôñ ëÚÂÖ£óy´Âº¹X o–гEÕkÓ ËçÚ¢é5¨\>7]åò¹é8S>7ë¤Þ8ÑÓ…ëûÿߣcdi¬´ïh9¡ö¡t_±,U_«ê¨ÕÀ"o›v×€¯CH¢†C°ùÇÇžëÆÙw¦¶£ÚbpÝĘ4™a63<Ø6¢fTªR$Â5D»ÂQƒcÉbJŠSY®·×{Uq)WìPž~©B9Ìþ‹˜À´>­8q4ùYNÖ#@ Ý)•hõhoÐö¶Y~6U!hwLt·b†õ†*—cwî¶@õ‰HFÍ@K]´£×Ý ”¾Zmúf†F$áJ†9äc¤dÁhœ,÷õÌŽfì ¿Ãx±ðhx=¢tà‘µf—‘iß 0þ졬%A}£€…[âÛ¿#×è~'.Ïí;3”åÓøg§ÿ”¸°núV„²òY14†ÑulQ%ò6˜óà'Wàõ̯odY룃,k}£eY{⪦Èn£ûdmæÞ¾ÓN©!]ß1S|ö˜b=|™±ŸEB¥Œ21¶Ïü²Å#AòÝ:cuŽÎÄ1W çc‹s_»U¢u™Jht8JÊ£e0ÈÖsNˆßÁ²›Ñž“i/\© ÃxU)_0ó|ëqÌû’oÉjm%«{Q¶•|3ÓFâ6mÝ+üÉÊäB¯¦Ç{-Ñ'¤œ‰lD‡è‰PbZÁÊ6 ÂV²¥ñ)à¨?¦ÍrÜŠkQzÖÅåÖ¦Ð.wÈì:EˆdÑ8û.ÛÈ óýѽé#mlÙ:«g*W’¨–SHÅ‚E)Vx<Í·Ç¥®Žëô“I符Ÿs98çG+†×ôEè óÍ;ˆžÈacûÚìïÝTæê¿n>{îfœK}˜ÂM–‘‘T]äçFòté#žFcøÊ-Us†ar¥Ù…ûÇâë¶«dúp1¹; ã Y'æ™Ü”ôæµqågìxïÌŸŸ?/†•5l3غv¡•Ä&J€”çB³²å™Ez.,¸0“  ç(¥oñ„âk¢ú ³²œUùfÜëá¢Z8“=¿Dv°þX,(¢ªÒ•QÕ0´NQç\žM…ƒhUäùN+"0M™´„ååœa칫Æwã‰*á2à“¿$Ń ÉS¡ÆÓÃõ¨Ì%QòD†$fxÖÉP~™I‰þq^[W®À[5×§‚~O”¦Š]U«kÿÛcÒÓÚ£CR -&‰Ç ×a¬¦¸½'KUN„ÕJôö‰VÜ¢ˆ¦sx“QuY¹oNsyjþ£)ÙÌõ¨ ²HQ\PD8Ï.Uh ã!ÄÏ`óL,“ŽFÐ7&À(ùTÑÀfBÝôžq‹U—¥$ìƒ{R)çWŒø¢˜¹yeíÈS‘ÐR_eÀ¤°æ 6îÈX±•òÀ-Ø"}@‚µ¢pf*{c#!Þ:|ü „àí`(%‘™ Ó‚TF»"¹ÍÌÍ==F.gžš§ÊVŸ_!¨àBH€ÿµg‚ŽQv$rOí®!—–H!+º’—}Ы˜x¦vöpþvŒó“©o’÷ kU-8^îáãÏ$a]„*÷ÎØ²©þ²·…©§ß¡¼ïŒ~™oË}4”¤~ÌÜ<íJÖ'ò¥à!<ë‘ hÊ»Ïl$í©\æURÎÈ¢…ÆõxD {þj*‹³Ò}7êd….sò¬L4œLÐ:£ -/šÒñ%b“dÃ…-j" qþ Y³+®Ó Ë òÖ£8f"е²(¹Àòds= Ô–]<Åe4ÄI3R+ÇRgßc' ™ŒvLuþbRä™â9Øc7?B”¨BžpâÔ’ÍÚD³žRi+í²‘Sÿ(®¹9Ïþ]CŠ Ü·§€‚KÕè‰GØaÇhEšÉ"Ï@ãõ”p6öMUZU®6*[âœið!1MÞv:xƒ lF Mî=>ÑnX"ñó”ëD6õ–™Ó£„È´X@á’T ÙãÆû‰ TÌg˜;/‚óÊ$Õ‹DE¦ò/­2€µ(R,¬ºvG-|Þ¸Šôšr )';¤4&Žqè²#"`<üŒiH%šþ(Ó…r@©°Ù‹Å1M9†zc*#<ëDž±=ö7å þNg_ߺ¯èŠbšóìVà05Âûð6Λ¥Æºhvê´°+²„‹ë8SǹǸööÓæÿø%ã endstream endobj 2105 0 obj 6112 endobj 2109 0 obj [54 /XYZ 32.2500000 727.250000 0] endobj 2110 0 obj [54 /XYZ 31.5000000 179 0] endobj 2111 0 obj [54 /XYZ 31.5000000 665.750000 0] endobj 2112 0 obj [54 /XYZ 32.2500000 664.250000 0] endobj 2113 0 obj [54 /XYZ 32.2500000 484.250000 0] endobj 2114 0 obj [54 /XYZ 32.2500000 177.500000 0] endobj 2115 0 obj [54 /XYZ 31.5000000 485 0] endobj 2116 0 obj [54 /XYZ 31.5000000 728.750000 0] endobj 2108 0 obj << /Type /Page /Parent 2 0 R /Contents 2117 0 R /Resources 2119 0 R /Annots 2120 0 R /MediaBox [0 0 595 842] >> endobj 2119 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 2120 0 obj [ ] endobj 2117 0 obj << /Length 2118 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`=|‰’€ ÀÌôt€4f€‚‚Ùl‚Ev‘Îò÷#[’»-é£ÅÏEJ~tc·{¬Y¬*VëÅüú÷í?Û~øüõ?ÛïÝÏÏ_7jWªýÚî¿xÿ©vÝïÛ²*¶ßÙ¼n_7/›—æÿ¯›ö…¯ŸÿÜüö¿­Ùþ©ùïçí_ÿÖ|øc÷Gû?øeSê²ùùïÃϺÔÍoêøsÿù¿6ùÝö×ýˆýt0§ÿþ¡0κ=gf~Ýô«Ô‡ïß¾ÿºùЮ?j­\å«­Þ kg¶ÿýÇæ§fü~tµ«Ö¥w¥º`žÒ&ÒͦnÒz4Ïá[ftù±k“nìÜÒ(ÑÖëðà»Êw_ðwnꆙT¡ Ûð”®¶ •tbc4œXŒ“ Sûެçˆw£ËíL•lìÜÒ(é890ø®rVÛÒnOã=}‹ª2Íï¥í¾.ÃX¥Òúmtù±½6éø¨RéhO+À-’ž®£Á_"Á€´ŸçËkàÅOß6ž Ò@å·ß~j`;LÙþøÖ ¤hþÑË›óÉ··¿WJ»?l¿ý¼©wÞ=„瞨 >©ÑóÎãá“Ïpu`=Ïl¶ÅÁ—o /¤¦c­t?ëSzxjŒS-0…ï‘Ó’§ÚUµ:Àó†ê=éÈ3õNËnçlë61šòð‰C£™¾SžØ]á|UÎ\†®Ç´O´î'z c´eÄjÎðÏÃ?%ð‡a ŒAÂë²*6ßTï`K»]M³5N·ÈjdhB¹`sçtÕΞ!ÃÔfÈaRe‡;jôAÄÆ}€EHË ÅΚJÓâïdb‡u qBF2’=°û1BÅv2bèBÙCpˆI„µ –Rø‰(«æÕg kÕ31ü€œÉ¡<¼rÝj”G”™mÊÔû³4zh‰> G·Ì£v¾Ô§ÌY$ "°À{-“½ÉÌCá­åJ]ìTmOçùGûÔ¾cúGoºá a´ã×)ì@>0X£Áwó|AO²™>˜¦À4H¸!j6$£Øñbñ¶ÓŸ†‹ÅxaÌ,¬z`#Œ6Ê0’µ†»mn{¬Ì1± Éb*Bla~€Ȫm *Œ ²HØ5؈‡O¬ ÏHºÚðîd´cG'>lÁeœ¥†„ÝY* „·¶ºž¢¯:C&Ì÷Sü˜Z3iëªáâ’«Cm «3ømË£µŒq:!iC4 ð7D—ó´Î—;Œ 0TιQãŽFø¬­ ؘwFZRì˜,#•Ï¡øÉ|S“Ò¼LG‚g'Ãc`1Hi:¢>æ]<C}¼bþ”ÔáZTÔØ˜ÅFÒ®wæP`Û]QïJ_Ì=ÀRV'>(ceÉγ‚0N®ˆâÈVØä'1ñFxâVŠå36a¡Nd¬Yƒ˜:Ûʪͫ z¦ôlVÅP31Nû‘xÁûï¾W'>HãÚØ ñ¹– WJ‡€Ö£3x.Ë#:N0G³Q‡J†)5,²â‘¥õX@ÃasîrYk ÃvAUΙÑFÈ'b©bžØs^ºÚŸ]@ŒµJ„¶Îž¤b¡ªXœuðù[‰Ld£R(°ïˆ`ÿ‰F©C7z¡LgQ3øþÿŒØÑ¢N½5‡UœïȯVÁÒ°àPýŽ<Q3B6XGÍÊ!ŒŒXf2fˆ„F“Sa Y \ƼXm›>-îY±PÎõ˜óGÖpvJPú]w a{ê½ÓÙ•Í9~ÒšÇëþÖí†gÑŽ‘Ë]] g~†0}FOðhb™XG6•ÇŒ/TcÈæ§ËkúK iÂ;Tva†SNn‰t£U‡ýEÍÕ€Ixf§°ùùu”ªc¿X&©$WÒy¦@ zB+µŸzå5J-‡OÒ[𮬇""I$"ÄÀdç2‡ŽŠ4ã„Jì[Ǿ#ëw%ˆý8TŸX:ŠH:Q÷îU‰r*R/bݶÙò‡<Ù" ™m”+#E"«6›“'RÒÆŽë6“ûâ4½‡t‰ 2nõ‘>M}ïvŒD›œ±Åçû¬ªx¾YBèàƒ2SòÄÄ¡ñ<¢¢«ª‡XÏX䮸ÅJLþób[˧’Éfó3!Ôù’C6äx “Þ{¨U} N‰Ì5 ËÐV“„ªŽv¤(œ‚:Sæmjo¢y꘻duc€ Œ*dr³ñ!à\ó’%]tËWðbã‚¡öúJÖlºR™:KV#Ùz …Sgv0+fžˆøsx(Fu²ˆ†«²‰< Ÿ¾p70Óq•‰ ‰¢™ny}f9ö_Wo‡»¡mÿßH2‡j¢\œ »‹ö¦—Mp¡‚p"ÕA¹ rÅ>D’õFáÝg"+èÀà±|D]ûÂ×¢/~ñÕƒ[¶n€‰g]Yøj…˽ª/‘{`ì#ZóͤwÑ”¨›Ô0$nðÍš‘i D_é&‘è5Lm"–,ìRÊtNaÞnËz8yæHI‘PZŠnQ)KoJ7`–GBÛªÚ–¿óònv9Õœ9Ç,~*ʵç™>B¢1øè—ïî'*îÆq„…ï`òÊ:›y[ Õ[DÊ Á”Tš!ÁON¬™b(“îp{oaͱe0NcÃIqð¶Ù@›aø¤3¦ž(8NåÃëùA—⑇&nPãÉ30âËó<‚Ÿà›!/h?ÑÜ3ñÄ}†Oð>4±øögžæ!_bØ4„‚J ¹Cà0ïdZ–pØàJ ¦)æQÈ×V,hÆN¯|FxÎxYœ?nz|¹ØuvßY8+8.ô?7CEôXczpɶ(¼_ÁuFC)DbñÃM’;@ÖRìù”:«2¥us¥Uœ˜ =(ÎL*ÅgÑÓ¶N‘´he±£ øÉxËÃcÖ¬‡Ç?Þ_æÅu^.ôzxyÅ^ƒ;âòµP!ÿ—¹i‚ùy/Óýpyf\§÷†yçz0ÛCµ7˜ZaÛẫhÿ_Z‰¨ëjÀIð ™n#ÅOLêMbœ¬mùâ€C“¹g“I¢_˜Ÿ§ü:¢½ñ2p¿Wª7„H?¡+l ˜²ÜN•CÅ–«z ¿ÃD ˜>ÅWx,ߦôn¢ÙÚ…øúØu•iò¾[ftW Mµ¥è2¨eöTŽgÓè#[û‹Òö9?4<"òAU>ÈJ´;n!¶¾Ö27BàPƒ¥ˆÞe+ìÕÙGÝjº>6ÅNÕYøŽóLV“Ñ{a«ÎÅón™Ú@êvû¥§R•§Ñ]CSÚåÎt"•3!Ò1í]d9ãÖe­Oq6å&Y<ÓÛp4œ‘‹]E«Èç®ô€¦ü»w•Ï]«˜|nUÒOò¬ÎU¬Nc>‡qLo&÷]C,ö–x=jfŸ`©¦áƒñç1ÚL8Þ:Ú‹¢9©¯w‘T4ä,™™å@ktŸa H œ9ãr¶fŽÇøŒCêD)ö〾úÔ fîâ<Çbšà¦¬˜öxHG vB.¿gÖá26õ%Ò‡ƒ?/µìñÚpÊý ´X´ú,Þb ÁiÖýH¨BýkܤÕdý%…7)_ªKŠ/ÖÜtª<…'}èÊù£ºÏ8z$gÞ\êå×f` …¸v4»Sóïœfx=Ų̀4»ÅûÎÈ—î'å4WÏ_ \™ž1÷Œ©àØMÆvÛ¢‹ ܦ…­ÜÕÕpüìMÃt éØuj¥x´:;ë uÇ ôô1ðOpØÓ'›–¤\®n?¾8:;eS,d«€Ö‰ldU"ĵÆ^;UTŒ)ʘˆ¢ † +b`5ÏÔÃdêËCeØ0¦Áü.S²§Š³·ç¿D*ÃwóÓºVuÉ2ñøœ¬”íxŒ(-J&ÉâC" ïÑR+ê`+›^B]´¼¾Ô¡åsè¤ÄýÌF.WBœDnYÆ~ZÞ«êtQÐt.Ì›òtsß}˜Ù;–B'8p±(‹ßåSdpò:±SÀ@ÆÎ:BšÞ‹¨r¿Js^?‰”çPFh<¾•€1ü"Ú†2†ˆ“ÙEž¢ÑçLù,¡,ùrW)‚„M,º3)‚å³QðhçÝ0×Ô_%'0J(ÃuÁe}Q~¦('¸› æ¾L»V–öï ¡æ{ûÚ2Hé—s0Ãv©¦ØÀj»Szïƒ:ÄfÛi¤Ü»L9¡}[w’Ù™ƒ—|Ì#~ü¤3"ÌDÜOC]þ„æ±ç¼ûS°=w+En8\qäÞ@RXÝ-}|½ˆÃ—ð‰CËÐx4øNç(ÑQK—€Ç2ÜÁTVÇâE<¡ ¯@B Yú bÂ0V1%†l³>Ò”ªÚé'4‚k2ï ÛÎJ¨—íËæÿ™p}ç endstream endobj 2118 0 obj 4283 endobj 2122 0 obj [55 /XYZ 31.5000000 471.500000 0] endobj 2123 0 obj [55 /XYZ 32.2500000 470 0] endobj 2121 0 obj << /Type /Page /Parent 2 0 R /Contents 2124 0 R /Resources 2126 0 R /Annots 2127 0 R /MediaBox [0 0 595 842] >> endobj 2126 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2127 0 obj [ ] endobj 2124 0 obj << /Length 2125 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯès÷Š¢Ø×È!À ääØq#6²ñ!?ýzf¨þ¨æ×U¤¤Ö.ì™M“Y¬w}õîßÿ}÷Ïßvï>~ÿŸÝý×ß?û¶.Îvǿ߽þAéöý÷»ÖÕ»~yú¶ûöôåéËáÿßžÎøþãŸßýoWîþtøïçÝ_ÿvøáý/á—§Ö´‡¯ÿ>}íZsø®¸|=þü_OùÝî×ãˆÃtýbÞþû»ÚVÅi3{ÞÒœþþöïOïÎï5‰)g_*[íLW•»ÿþãé§ÃøÃèž«Œi›ª--µÕaŒ²;NêFóœþÊŒ.?¶«Zµ±Oë–Þc\ð\»¢ßùº•ßžËà [ßÕÞØÇu ïÈpªp콫¬±mYWÇ>ní\yø¾µýŸ{Þ©-t¤uÐ/ƒËF[4•ÞØÇuë4[îö¶Æ —ÀTò»ó2ºüØeÙ©}Z·ô– ÇŠ<×ÒÅs}]~lÛéÝÖÓºµÎ.x®Õ ‹h0áJOÑ9¨ÜVmìÓº•˜0{ïšþüž›Ù§mŽÄT·ÓÔÉÛÖ*RÓep…o;=j:­[‰šàØ‚‡êªAèÖcâ¹{w^F—»ëô(æ´né-Ž.w®C½Ö;×W£Ë]êYZçu+k`pÁsµnPxÿ‰ïÏËèòc×­>¯[zK†s þ%b¼óO€×î[àƒ¾>½{>ˆûÃN6»¯?ÖvšòüåëaKêÃ?ŠÆ•Õîë»ß…ýô‡ÝןŸ>=¬ü¾Y;0eUœ§l»aÊî4¥)öMkÜAŸ;þÞéIáNOÜË>ž~Pí+{vµ^ž˜òü«{×MY¿z‚?3ÞX8Þúk¬O?°ûºjŽosËCŸ ¬ÞŸ8°£}„¿ZY8Þ{s>@»·S¥|}€ÍíKªˆ‰á¶ö¢…‡k ø)~u‚T™-6ñ>˜#¨ ¿¼`1Ä æàYNi]ãñ­òÌ·ºýi½o(özÒïïµÏà'¥:K¶•÷nr[ŠçtþœŸOsÖ‰ßB{¥ƒ\1æcþ/qQÜóâÚö‹1Ì‹àgïƒçùpûÎâWÇLË|Æ -ãvÒ©ªܰ9ÜZïöBnàyꜭ-|.3©àèn\k|1`ü&^Àô/‘g³_ŒäÞìƒÅ÷vAoÜ3±ÙŸóm¶+};ŠQÝsì‘áñ ò¢Š¸$ •Ó' °}_v0¶V“IŽX¹ˆ°’ð â'P8^ê]ŒÑL°žÃl$±oÝhä8€7 §Ûžy´M}ó«ã%Wܼ¿ý’@/`Ò¶$Åà =09f2„[ßq×4ZV”;¦¬Z_¨ÜM`W#Œ0ÂÞ\;<1á› Ð변Ń_Ó^`S|V×ßPeÅíì–î¬n%V’±v†-’>©à<ñÄZô$±W)jî°ñ¢æ©?ÁÝŸ±øI§ÍûFçÜô}"ÜÜ·S$\Ј ‘Î(™Á5 ,§±ÃJ7ž4KŒ» «ÈLÈDÂÅ8| Qa[ã¼6c†Öçd«-*“Z\4ñ 1 ä¶'ÒOÞǦ,Úb m¬jHUåÒhÀMF(.x®º$N! râ÷NÄ+oMõ¤-ºf`‰Ðõ°,ãK"žÆä”ÇDq Ÿž‡±b5hõq\f»˜ÅŠnqÀ…‡?ƒ{D“r7‹Âç.Ô±®î¾¬ñ„á¢â2[ A*ÐÐ*4Õ )c8üœH{65±˜mЫ?$Üùæâ‘Ã4¶º¡=8-ÂÚ*Rdì ;âÚiJÀg‡i„ðj0àÍ3ö'œ{\R8š§Ï±,ùeñ;$r|·ecÞ¶)ñp‹:€Å,¡BPV›Hn3ó‚Ìh#Cåž ÔÑDU‚ÕAjÖ\jsq߇Geuœ«˜Ë§Ò†ð^¢Øç3F™h@JMÍ^Bý ÕKðÙc-R9ÖIš'h/™$Qº,ᾕ8û9;w˜‡hëòŽ;CQ,¤—Åây+u™70)U´ƒ2žª–·­Êæí¶]‹Ë3±|‘”H¨·2ɦkÉ[ÜBg¢^{Ý›]Öοg«©=µEã½Û#G“Tˆª ŸR·ÚÓ­öT–Öµñ9Æ,kOkçkG™Ë!kç_ÎõÔž6Ö#+)‡ ÈÂUK%™»¨TS³ú¸ª}êž¿Þ(åºN”C4.|ddr¥­Sy43,$}QDÅd‡Èš‘[Uˆ¶,!¡,! -kqna}OÁJVcNWhÛVÎ[z*ÇR\Ä"{ùi #Œˆ ç/Møôk[$ýóØÂTû-Ù,øÂä3H“·c›Äà§âõåF€E*×®Â5öEbqg,ªõ!ïkgü9ýå7K(Ö„™»Á„¨æSúMœz`—ô#µ/oÕw³ä9^ô8–|2„XÑóY¦æcR¥ËÔíe1ÏPµ&läªé·½AY¦Ò½¥(±üŒØY•DÔ7à×ðýËÓÄte`8QB-;ÑÝ Æ+š¡”o8¦wåö w8N5¥Zç|±–ÊV¼½ ;¢žjäfÂ)}þĵ¦6}»›z_tö-¼‡£á²:"û(@FTšH a2DÜûôÉHvaëÚ#0ײ`ÌÉ®í¢5‰˜’É\±£€‹1­3_Qìt}¾Ï‹Ø¡RM Z”Õ b®{„B…í­Û›i£d3Å¢gp ®9gTØF»ÝëaÜzb.v™4ÅàîÁ56¨Ç¨v’Æ38b©Ì°ƒ‡ñ^-pÝ`r޲B½¬Žˆø.1xiŒ— sÆ+D¨Ë 4/å~ÞülJ<üQ f4=¥óXëã•âÈ€Æ3Ð<’p4ŒK/F¡Îs±n:ºQøòaWãø`ÚùÊ›Þn¢P9Â"^Z‘«˜** —•(³—ñUPŽ•¹\Mo‰­}‘ÈÀF„\$”0 1ø¢;ˆÖ÷¢ã'u2¾iY#Õ+.vJ¬šÉ×—‰ªê"hôh+×âIL Þülto'c´3¹ƒ‰âð“ʦ~æQSV÷¼´hÕU NÍb+Sy›Jå§ŠR’°;±±C²NÄÎâ(wåøÔ“iwЫ¨Ù-±胄áI¼l)C¢Ü ,Ý{äÓ¨K‚ WðgóÀ‚ɘΑ3^cœg¾Ùð…}³£`©ìµãmöýõµÌ÷è3øI¼×Fë±ñ¯Ãµñ»ø'™ñ<ç7Õ~Äc?£'y†2D»¶‚óEi÷óßç\œ¿O`Õ5úÌ€4³×Ó >…†÷ ßQ}}®5­w…®dˆMâ…ÇH4QJÙ´P©ÞÏèqX[îCþÂâ€Ý¢â Nf ,³vcĘãñGý¢ñ3 q }¶^$T6$¥ 'Î › 'Ê8Þ kf YCÒ°¨ÇÉíx±²ŽÙö—D.CÊF3íK"5ÀÁPúà ÁÃ@‰šYàÀÑ+`šëáypc bm6Ám ˜ó ´ÇY$…`& ŸZk,rMZòƒN¹ò’ ý­Te¢+ê–ÍËeŠâò«=2)‰´©²•kcª¾™R•”{Z8ë]ùÙðSÍn•ñÞš‚)Ï^\o%Za¡ÝªS?7½i= ˜A"™(2ÑêÍ÷ˆ¨e÷2^ÏìR©rREJâ…JK&2SÚþ®ZÔÏF KµQŽØòÆ`¾Ø"†£m~‰Í/ASïæ±ìã˘G»c×¹éÓZÛ9oÊ4(¦nS­ÝKHôqÎþ}î³ðŠ”go›‡;{Š^˜³ßô¬dzæåŒ^‚¹Ã<­wu=}7WÖh=ð¼jød™< Óà3ó Øv¨IJÕÞNeØìjf¼mL|ŒDuu §‰¥r®­ÌƒÇ)Š¡¡ ë†_ƒÈd\Ñwd ê2@kKÍFÂhÆ»fu#@#D¡À±•ÄÄå¥J0<$ÙZ“Ô÷Ï•À õE4£¸/Fš¨œƒêw#z% YÙÐ!&kPãŠF OWÌ×Ö[é#Hys.ªy}>ºÉvs–«ùZ¡Hˆíä¥mËl™½##Θì¿È<Ÿì·ù9•Óúœ_¹Ñ‰lV¹DsQÙ”gJ'­³Ú´ØÒbW’ð,Ûë”êd)P¾ù…®ëþcUØ×Ê“–ñ(qšÔí‰ÜÌÁLjBYäÁDX«©nªl3õÀ)¤êˆ¡l E¤üË‚±KÀ§Ï!6?šÒ¢PøÝ*ê“4½qEéíT"/¥A3r…AÃ’€ó5&EñÓDûœÄxEAóRA\Ëj/Õ€¬Ú›ƒ¯ž``bY_´¢ÃS;nWcRÁà[*´0#ÆUŽpÎ,½ º1vM ‡W¤tCp _s,¯GPd”¶Rè³„ÅºÎØKñØ\‚Þ[¡ÆL 5J![AìcÄ:SßUYÀýÅÅ*øq±"¤—dÀs<ÀÔ׫Øqü‰€3€ SùŒo` ÷z+rž¼Ïí]…®Û}Þîó<îóV¸~¾ÏÝ=%°Û}Þîó<îóF¤ªEÚ¸FàJSM¾ÃFPl`ó¡Xk‡YSU0•np‘f‹QI¹KŠé­jœÊ1`ðÃñváž\DD?Ñ–)ÈÂù~G¤Ußê`ôCÈ~S-á¼ÄÙàò§*RQAtÑ”wA÷Vàéô4ĽŒ#Ê ‘s5‡crÜÇ—ŽÛD•DÅô'[b…ëêË—%9¶2À­ 0¯h4Ç%z²1`‹°ÊH˜`19S"¥3² Ô´„€k  ²Ö”(ø›0ÛÍyŒhƾzËRš0×!*êýÁdóYqf¨S·wÎ,ÝCºPªÒðªéI½¸Õ£¤YÖëü]iß"P~Ìd ·õ×8g"ÃAS­zÄ0SÕPdWÝ©Ú]FiÉNf™ñÕlÛy,fËá¸l}þEÙR[ë ‰âÄÉÛ¡ùJ//)UIÔiÌôBdLQ¼Ñîž×XÊF~Ü¢ÕÕÒé"ò,ª5»Ë]æ-dy QÃE}ý}ðŒPÕ×ê*__Ä&"ã‘ITòy‡#åJD.#3¨¶ÉÙ7a„|ç²cì&Ã5·Õ%±CŠè \Ìì@9ùUÐWd`SrI|*øÍ\ˆpëü€?S©¢º`¨LxŽÊÖÁ,÷v˜Ùü‡¾¬¥™w¯„ÊÚQœ"b¸Â"sQ—˜l>£ùRùㄧ”í!1âØL´Q$Ù1šJ¶ø lBO|$<Α"ÑWcZ•`ŒÂG¯dhæ Ô¾!“ Ê˜ÑøI¢tSêr'ò3¬BäöQ¹Ò¢½>&âÀ&µdÝ`¹1Uçë‚0"mˆˆt º,[›‹±&`¬ºÂõÒ¸j=Q$?™0—H~ÜŽVêVM/ ;yér ²ÚùË”°£ž*ÙÀ„hµL­kD¾ (d´JJ¾.»/I6n_00ÚÁ&!(!š‘ˆHäj}¯)7«‘àÉáHU©+¥R‚8ûXnÂc3QI‚Éß„àÔ“4·Ö°¦Ø'Hc³gÞø3I³WíT¶q¸[̓[™z7£³Ó÷ƒÇa@LQÀEf'Áä3óïÚ”÷HL=æçÁW[sÇ{ð½ñ“Àhºœ’fëËÙÁ"5­GßáÛ—&†8ù/—s2,’m†Ç¬@^€J÷Ò“‘ÏqàT%_”Gˆ©6Î_Â&rq²Q¯#|,Œ£N´ [?pI ·š¢ª5¾¬ÊßYɤÀÔC¬:&OgeÛ@Ù‚‰O²ú"“$«êQõ¨D­c¶{K½ ¼ë²åpT:|ÆxZWÔ¾HÚ¸ˆ^ˆì¥–ú© lfPΩ\”sGoÇ™¦R—áh©°')ã\Ä–`JœòãoÉ–´hP±&jƒµ¾EµÌÚÿ¾š)›´bšåKsÖv®'FKÅD±V™%YNQXD/ f„!8D¯û :abŠ(RËîEô /!L|ª’Ð¥î^PͶí|Á#Jï¯Î_›Iyïï#ÃYE€þ«µyKDͪ U؈Rðûˆ‚ô'ý·ì0»¾+´I*&N»²0}*=•§ÎGWñVo—ésÍ ¡ç& u÷V×¾¦% ©žc\(ñêôê)pÎx¯6ì›­›pF/1•L¢\=GØø()é¡'J¾Â+éyŒÙÄo`žI%áž#=YÕóQúlYb;‘ƒ“Š0æÈ&‚ ô&žk<.¨a6uCøi¤Ý篋0“¨Nc¢ª«lÚÌXˆ0 ë˜âùž6•âÊÓïßPËg³èöjÆdmü°5L"åNv´zŠ'a§%gÄhTH$™ì”ÀÏÔ ^äõù™.¯&‹&ªígbìbç:Y>ÐæQ›eÞ¥.†t ¶Ÿ*I4»em>N°÷k›±ð3yà“åEâþ­Çî• a€l’¹B¢8£Â-Òp#£%¦*uί]3v£§FÄenÿUáòH¦¡ v 1J‹HfÓí-á¦#¹àH¨\®è$ÕTßaÒÙc¸`mŸ1ƒ•½¶Ö$1Iaލ&›?b Û§$Ð:EvmÙäI+J¿R®5Ve£ㄨJao£Ö– Ïèû—ÛÊ \amþå—Wö/3ìF°}Ö ›Ó]æÀ$M§¸‰Gm¤¢1î‰r³dÑêå”ZÆ9†yïY»>M%=ÝaPþSY3hÎ¥A¢û†oPLúÛak(WËT¼_Êã™Íc·Žþ43p_|B²ê‚ïnGHødmUXiRú5MR32!V_‹‚<§]>üÝ};lgp·¿Lý Çᮆ=(÷…9Úg»—šZlyž•Åö ùŸr¹/OA¿×OÎW³?é³Ê}o¾:]/í'4â¥×ÖöÜ¿éÈDíïö®V>CÆÙÂÍø{ZÁbK¶+¯aðhð3='3Q¯þªKp'×H1tŠ(ëøƒî;,L‰"Ò"bìªóH`ü8_`Txò†!íÏèrhS¤ñÀ<˜’áª-œ§×doÚâþ …oÜk²WnAàËûoA[¸½9o×›ëÚ_”^bLI‹Ý—§ÿ¤‡0f endstream endobj 2125 0 obj 5503 endobj 2129 0 obj [56 /XYZ 31.5000000 785 0] endobj 2130 0 obj [56 /XYZ 32.2500000 784.250000 0] endobj 2131 0 obj << /Type /Annot /Subtype /Link /Rect [54.7500000 211.250000 109.500000 218 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_suppression >> endobj 2128 0 obj << /Type /Page /Parent 2 0 R /Contents 2132 0 R /Resources 2134 0 R /Annots 2135 0 R /MediaBox [0 0 595 842] >> endobj 2134 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 2135 0 obj [ 2131 0 R ] endobj 2132 0 obj << /Length 2133 0 R /Filter /FlateDecode >> stream xœí][ܶ}Ÿ_1Ï2/ºExmèCÃúPô¡HšAÔíCÿ~53Òì.5‡Ï|¤(­l$»^îHäw¿óÝ¿üýøÏÿß=}ù÷ñ‡þëÓ—CqªËâúçxþûÝËèæÔ¬›òøÃ¯‡oÇo‡Ï‡ÏÝÿ¿®øòôçî»ÿõñOÝ?ÿú·î‡?ö¿tþ…_µª»¯¿\¾¶µê¾+n_Ï?ÿ×á/¿;þv~âðº~3¯ÿý]iM]w1ñæo‡á”êò÷¿?üvxw=ÐKTÑÔ¥>*kìQµVÿóÃOÝ󇧧¦êÿÀï¹w7—w7U÷nÕXµJÕ•­‹Xëó[Úª=*ÝDzT£÷\þŠ<]þÙm©¢=ûºoi(S)ÿÃO5ÊÔº´gŸñ[6Mÿç1ˆuLw˜)l| O€ë¦¶ñèè¼oiô¸ö<¼º¶ew6ø=*U(Óc£¬¥AöâáâèèžÝÔñž}Þ·0D®˜ö<[LX«Â˜²‡M÷Ÿ8tžŸ.ÿìRÇbà~ßÒ Њ.ˆ×²h¾Ì/Ÿ.ÿìÎXŒG3ç}KƒdÀëèែ7rý 0M¿y>øþëáݧÎֳǯ?u»¼ïúåk·iÕý£³»=ýñøû¢ÐÕŽ_îs2ÝžÊËö®+E}Y©NUYé²x±¢¾GŸQàÓZô´ÂÀ÷×§Ùaé¶bZ)>Á½=]VÚ“Ñzõ…wp}O}j÷i¾îºx‚йîúã׎xC|gV÷o‹ â­‡Wö ,NUÝiÊr„*UžŠÖÙæñötÝþË•÷×ÏèaÉ=ô½Ï4—•Æ…\sjÚ¢º‡¡ •¢‚+/+å˜ ;{³žsõL N¥­^AÖ¼HÐ…^ñ¼§¼¬˜á5#Ö½stÝB h\x ¿îºÍœÍbpAzÐ ü ~š»%Õ XxN<"ªÑ> ÷Ê€\Ùpã÷x€W<øzB …Gp@ªöðÕ|ùÇ0´‚›õ@–àž(4Qß•¦u^¯ËÏÚ÷*Çæè C¬) =ZLW»b¸ó«Ö„ ùÉ‚q‹)Ò*Y FÊSvUÎ:C:X­ô>Ë, ’Ñ3Œ `˜"«"ÏÞ0Ñ E))¬@±ZÀ$CÀ wšƒ``êÞ_¨]'ó ‰¨ŽUaÊüPH|#^õ¸™ªæ‡®Ú¢6zȧùÎ!©ÇÇj9®éŽÙ1ê1›3Â)™èÆd4*# ±%‚… &ýpMØ ÂhVMSSÆJñ¬`höKˆ1œ‹ƒyï=ø3¢ŽŽz?(KúÉÚh‡¢÷ÈV–^JP˜82`N'Øñ‹ñEi(Ä—ƒ[¢Öjˆùæ e½ˆÆÈ=Ý”x^0=ˆG(+ã?m¾–XRiÖÆºJ“‘ŸØÕ‚Ìæ]@t)›>gÁ³˜á›HTdeÚ1óTcßá§áðPO ÒnˆÉ4∺—¨àX©?Š«µÿÙQ”«Ä˜ùy‰Є#Á wïQ¢B˜òª‚m¼Q»ê9ìgùU¦øc¯Fðqßæ«zk,Í·å°™ŒómT6ƒÉYˆØáj÷¢UË›žÔIœYÙˆÎ.Æ„¢ª¶Ð|רCe"Nº¨q”,I£=¦Îj[Wi¬a,0{ˆ²”p!¡¬²tePÐ%Ùð˜çLù ¶LˆòT*€<_!,WªËÄ}¦“4&ž˜3á‚1^Oä-†Hôi¥Ï-&š‹ }!!"Gí1´3œüj d„誑¬¶£µí ê2¼¬CJtzcÙ÷sñfewdU1c&4ÜÆíW~qÎZÆ‹'Ä3E)–ì›ë eß,Û˜J1‡j)WñDŽ2x50¿TÎÓé%oK6­2n¤BXèŠÌL4²ÁHÙ1b¢1-9+YÙN,FÍËС¶Ûàës·§Ëfî(µ;+ýî}¦+ ®|„+î "vPÕ6!äõmPÊ'¸Ÿpå=„<†Ÿ)à0|W€û4x´Å${­f?å`ôN¦ó{0…¸Óð3˜z0Åa*e(Îâ“æB‹arî­?iJª›iÊN¨«Ôy•¦EV1†à ¦ÅÞ:]âðÞRÊ!eÊÉ3`ù`0?a CªðЋM‘ÒNS^ÁÒBQ¾ ÅiL‹æ=OƒrÞ$´ÜTmÀ£ÁÒSé\Ñ„µ‡¥ ÆýÆèÒkއO3Pö‚v4Ķç3x)y¦Õ;Ϭgëccz½ž÷`Î ö¶sí•kµRÓ´Ìp-æ3ì™b‘±¦ˆ7ÀÐ%æ láb逹 K.¸7obBsÓ:å ¬M»R`KC'¥ä2··Bm’t?·¼`α CD ±eNJÙ%Œ,Ï8&±Ç–&¹©jV€Ç”±%ÝÔÓÔ³J¾ßšõàñˆ°õ0•± óe±¥–…î6Eõ-—0[½N*Ï'º|'+åÔŒc„Iqoß^ÞbueC}ÕmÉÓ3ÍÉÎٓÞBÉX ¢’p÷ävOnà&[¨à1¥'gõ êY%ßoΓ#²’ûxnYèakÚè{eë¤ØLpR6àd¥\·{eWÜ×DüVŠûÝ+Ë…úÚ!F'WìïénËR½FܦTª¹† 7Ù#q<ÍÄD©F¸Ëþî ^î´ ¯Gb:‰ Lw$uM±ÈðVf(­èW²ÓM< z·¦¾¡Y©®MËoNb‚nrÝ8*ÏZ ØÓ*¹pÃU*rM5yO–™™÷HÌ‚¤ÆSæ§Á©¡O£nü€K_¦'ÞKŒQ²%úUû1 PCZP%ðžp/NÓã‚U4Ÿ*XM+=$±4Ü)³â/áÜbœx ¶‰6‹½u¼§ «S…'űx ŒlE6”to·20-¢8¼´ÊR( éÀ$LÐU•z€7)Y©bùÉεé¸v©2 Sž&·”üÜ<µ?c;‹HV`ê[µÄ9ë3O£ßâ©ÌœíÁ¤2 ½µgAie11N ÅZøü4 =7,I-–\ø<ÄÓ0tðI“­@9èÙµØ-EÓÔW«¡Œc×@ÅJ5P»žÉ^ÏÔf(ÚÙõÌ®g’ë™ò6@o×3»žÙ žÉ9R–TÏÔC»&}Á+˜.™§í+ÉWÒP_{Ë /!ße9)Ë÷aWÂî²ÖMÄà*ƒ³qÌhWìíe¡Q•¼‚c·ß’¼Ý[[ò–)eꂘ¨Ên£¯|% •U,ñ›¾ÚÛ,(Ï}ƒ©nbǵê7®éŽLê~8xkš~¸öyþ-zT¹~¢»ñ›_†¯¹cî dÚÏ`±:¾Ú­g‡á'àb‰ËS=Œ5¿E"ë{ïF%è‚ê¼â¯» »è¾Fг(4)„-yÙ¨måÈ\–r·ë­vé[c)’m¯‹"Ü@öi¶Ô¢”—hç%p\d{Œ´Ui3‚þÆÍtXJb3î~LK©:4ç34ÕK ZøÁq]·¶råþ^÷z{ZD}«ŠÚ:€ŸôŒâR‚*íì(çæ€ ‘‚j\dœäd~g@ÿ±¨þgŒúžïE˜Þy'ZùTh„B Ò¦+D4L jÒLŽx¢Æº'bÂ"#(àx ¶:$«ru¬€gÊÈ<çr™é Œ ±÷¦«È4Ä'y#³aâÚÖ(GÄeÛ^™‘WêÚU ñcz#Œn%¦·x\ÉsYΟ ¯#(¥R ôl«Ûø“+”v3‡Dã°Œ>¤f9a°3FY¤Î#;4 oňˆ€y]Oøñ©¬â=ÂR‹› Œ—Dä—I&S°Ê9…ý è{ã;žSS‹µ®[ÕPAbºíºìÎùl¿|=Guˆ8ÝøÅŒ¼N5ÆW4Â";ž:$Z‡³•ð|ÀgeǾ³Ï©šJ‘œ¿¨: á¸"%¢2këG”6‰F&»‚,;柘âi¦O´jÎuU ¸²²be$µ–ò1¨Ìž¨ Mæ`I‡-=œ£‘¨Ý~y|Ö9àFM‚ЃUÑ©î“6^äZ«ÆÈÞíÛÓ-×R‡ÈZãb1ri1o©Ð„V!ÉZxâ]Ü⦩\Yšsjv—j«“jeÝÞ—j1ßÙ¸’4Y #6 ±°eòb™É‘ªÒÄWZì½K˜ÕI˜¦²óí&>t—šEœu‰üÎ@«c U4#ÿk¦VVÌxòužàü ̶RñUižÿ¡º—ížÀ.fbˆ™k|ã%…m?­O¤=eL'iâ Œ§`OÖÍ0Gq¨¨éÊ¡l™ÆdÑöwJÕæWð+œ+%ê C*¾dK?ðf‰^$jþ3¥KüÂÈÄ»f ©))Ì”ͧ ·îîE~É­€qP1ê¿bÆ`.þ¯l»ÅËðäŽ0uu„ËDvÛKüþ•mÝSh÷‰‡Äž‡¡­ ÓïcÃTužPEkŒ÷RßüR9JU®,Ï9¤áØoOT榘èÑ¢¡[ÝÔ²lй¼C°Po–DDŒ‹’HU:¸ZzTmÖDƒ Náy,<†ØÆ°f ªqÙ/žÿ‰Ìaü$‚¨çñ¼Ÿ+ãŽ7‚ë æS<ÀnS·N uýy(‘èpböæÙ5Ü[ ¥¥Á܈ñWð{°¼öHĶ˜³.a¦þN4~öL«ö58Âf'%4øV‘Ëuˆ¢Çu‚VØÈ;¤šnº±dtË-U¶$2Åf$o™É’éjÒ_¨ª­•€4xbvÇÈ)t¡iûí‘©*J¹‘~†ÄsV©aÚ©µËvC7¥v¤¬¬Wçñy£û:m¡\ BÄÿ£XZ1Om\ŒfÄTK9ŽûöÍ`=ͳ´r‚2êÄ„ÆÌ–z”EQÄxw¸.‹¹0ô‘‹èXŸPE ©ɘ^¡Ç¥+S¹\ùÀȨaWsÛæâÁ¦«ûUD@–1›T½Ç’#bLž»ã™û8ri;‰«,u?aé™ÜóÔ•ºª]¶\:@ÝØ"šÂ‰=ÕŒ19–’%~%¶ê·T”ìdzZí0U ÇTª&êsÞ\c•º/ä¦PƧÜXwÒ6ÚT‘³ì=@K)º­IÑ1²‰À(%pæK%ˆ®ŽLÆD¢bê«êrðP4a$3,PsÅç’ 53•Gó7+›x[¡_­´©\ÇׇâšR¦Îž¨€”»nÇÿ 3Ûƒ÷кl£¯DZ= 7ó€ âY¶ðuˆ•Š­FFÆ-î05””Ý%zRÙ™Ó9מ.sÕŠî/Ÿ|f«\#«ÆÙçd`32àjåîMkN3„èË¡ï{wã`Rp¤6&\Zí.“ïN•¯•c!Y,$veÃ|L[{ªRÈœdTö#@aÆH”ìáÿõ‡ÿ™¨é«&ÆõÔ ,ш𬔹R`$óSÜe §Óµ®±;=?Ê–êþ,\l:Ûš•$¨ÖÑþ*|*UÔ®mJUwŽ+ÀÃuXN^C€=»x4ÕX²d“¶Ó/Æä)ݶqÊ5Mc{ È7A¼¸¾ùÝÒ7J¾Ü˜zµ±ëOfHÍ?QížhÜ€¸ÇXb| ‘!«éÅ)÷ýFýWZQcZéP~ÆxSœÎÿõ ;Êxñƒ__<쇯Î[xM†}ŸjƶQñÍÍØ~>Z¢þM÷­pðÆ—²37Öâ¡<ø3ñmä¾õž[¨ ‡ý±ŠtP ±y1"Ù¼ºï7bU3SdF'ŸÔˆc ƒº+[Â7KS93ÓRfvSÁ³ž˜iÒ½”„‘gL¾Î3 #áxRS5¯½Þ,Çꥳ`Ätî È7· ñˆa~rÃï¦wj‹á> Sú}J!Í~ìŠì·<é\ö=P>àa¡€MJI•YôS[Ì0cÅ@‘˜ÍùúBÙ¾ã7ôMp{à³4Ùú ‚=è;G®7è[)g?9Û aŽ vsàIq¨‡0<Î|OaçJ·“ûñÀ7s¨²C:;@©ÂB)™USMSæâaƒ=YäÈÌ8ô¸‚ã…Ó»¿ÇoK{9þóÔ/Ì0V›»uÒ±Y·Ã£vj[î™NWŠ«ïØ)Wí¯Oú¯SO5^é%®>õVÝ ÊÆÕ5Ð{ÌT{ƽ½}êOŠ KlRÛç-p³ª?ú耽ҿ÷øzÂñ»s …Ÿ?Ó3 :ú ÅÌÜùûâu쯜 B´Â^àG‚0áBLô‚{8q‡Ø=˜`0ŽéÇ%Ü—}ð,:ë¢9©ëy^áî¯wzÑ7%öŽŸÿÊÞ{* endstream endobj 2133 0 obj 5735 endobj 2137 0 obj [57 /XYZ 31.5000000 713.750000 0] endobj 2138 0 obj [57 /XYZ 32.2500000 128 0] endobj 2139 0 obj [57 /XYZ 31.5000000 128.750000 0] endobj 2140 0 obj [57 /XYZ 32.2500000 713 0] endobj 2136 0 obj << /Type /Page /Parent 2 0 R /Contents 2141 0 R /Resources 2143 0 R /Annots 2144 0 R /MediaBox [0 0 595 842] >> endobj 2143 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 2144 0 obj [ ] endobj 2141 0 obj << /Length 2142 0 R /Filter /FlateDecode >> stream xœí]ËŽÇÝÏWpÀT×£_@@šÑÈ"€`YYvœÀˆ(^ä÷C²»93Õ}ª»o=È¡[ò”ºž·îûžúðÇïÿ¾ûço»ßÿg÷Ãøûã÷Õ¾­«áŸÝñ×w¯ »ýøç]ÛÕ»~yø¶ûöðåáËá¿ß†¾üóáOÿÛéÝŸÿþ¼ûëß?üqüKÇ¿ðËC«ÚÃïÿ>ýÞ·êð§êüûñçÿzøËïv¿{œ†'óöÿ¿«kcÛã,VFþö0­R~ýöï†õ ¢TÕôv§¬9ü§·z÷ß<ütèê½Ú÷V©¶±muÁ8­>T·íNéþÐQkgãœ~Éô.ß÷\¢õ}š·ô–(Ó(çû®ÿæ†îŽãöêð›=ügFPêHRZÕM×èö8\e†ÿ½hûÞ T·ò'tî\þôUeûh”uš·ðŽL„û–ãJ«ñÖ I|çϽG8Õ#iÇêû4oé-ÕÓ¹à¹6Ý´óÆDØû.Þ¹vJÇ£™î´³²[2+ì< ;V}UG<á—ÞÅûÖ•‰wsOóŽu¸s¹›«µš¤Uaï_z—ïÛtñú>Í[zKÆsõtUƒÓ¶Eœ$AÕG³ãt,JÞ$xÕ»|߇åGëû4oé-™jÖù—€NðD†Ÿ{õ›çÃO_><(í°“ÍîëOG‰trøíëaKêÃÿL°ªÛ}ýq÷ûÃŒÚ?ì¾þüÐï]O3ÜØòùëaµÑgz¤Ã¨æ ÍÇôRóéÀdl5L¦Óãª; ©Ô¾¶Mw´hÏ›óiœfÛÔ§™¾´|¾±{­ŽŸ¼´h¾QCK·ïúÊiQ§–zoôA‘zÓbN-voÍà™yi©á8ø›¶àoàÜô'´žªG½Y¾×xÕ3šµRdÔ2:»CGÕ#Zu5¬@Uû¦UoWmá¾Cjioi?`oÕ@-fÚöX¢Êί”÷¦F {ù«Ì¦tn'xŽxÅÌìáÎ>¡otE|óÞx«)Znµª÷UoÞîÛGØÛp‚JOM[f@œÂÈÃÎÔ(÷øc³k{WÄà%aŠÆ$GÜ;ÁL3»SøÀ“Á笑”‡¥âq°ÜÝÎ_<Ýã¥ãý3îÀ³ìýì˜Ú0—„«À‡ÁPÛ¨hµÈp}¼ÀŽàDÄF⋦{bé˜ì,Ñ›K˜ÞÅ„â>²bz;=0çD-a˜îÖ(%¢ÀëõLà°>¬ceˆàÓá*‚ÐÝòðF[ÆKÇsK¤¯{æ¶<Ì,¾V+ÖÁñÔÌäz™Ùµž…âS P¼09Àî1©zˆ8›tÆÝC1ú”™>ÚB\‰,"Æ^Äß0 E‘àþÆ´¯^W©UA1'4Yö‰…ûšó$¦8nýa¸<¥“â‰g ª1âŸñDx¸Ò]ÿ¿rýÿ®ãyõB)àÂÙu<§áգޖ0oÎ]žÖuêÌ2`œW3K^TFày´ü6ªRt#nOÈÑ=Ú&¾&Û½ùü^3¢Æ •0ÚC¸´Ø÷d)t{ÍÍ`Å-¥Mô°åµhüÍ3j™õR džSÁ•âTµ[¢Çåû¾wNq5 —¬Ôáv.Û« ûSCÑŸà9|§Å;]…Ò•RVFXªv!×ɰFv/D$žqà¬+x¹<{€¯œ›çà ܬ×ÁÔÁ×AÖPŠ{¹&£¾nž}¿Z×wµô$h^hïšâNØAäqŸõyòc81yL ~»må±è ïH~‡¡çlñ0>*&\€Ã8„Șÿøäìs>Ó9V‡[QNIœF8¸æ®bQ#u§f L`Lü&{v›pÀH”¤ <ÐCIJžu|¤¾[´PVa/ïÍ œS’ËÅÔ|ФŠ\Üè‚èd|'ªRkŠ”Îœ5ޤ$¶.€üeK„¡æ+eêi“˜©e(çC6ŸÌ°döÍ¥_p‡¬SRÔ‚‰œ»{Ô/Û%Æg,ŒšÎ,=ѽ½R¬œY[4Sé›!¦Lì[G(^§7¯DðK‰¬v‘×3Š~R$9Ú5¼=΄ǑÚ.чfe€Ú=‘Ù”’•—‚õ+¨ØŽj—O†ù‹Œ½±ÒhFµÅÉä!^O‰·$ RK2åd:IÅ#p"c‘b¨D¥š¬ÀIVÃðˆÝ.›'Ìõ|³%syßzö¤q+¥œ­÷  cÌr˜u¬ZØbQËøÂCLÅ`¨Ñ|Mp¢r4²x¡b%<º%—²3 Ñ%RA§d Iì³€<‘ì†áEaá™Ì\#X¯b6G6á{ U´…˜y»½qÃ=•“ÔxD¶’ad_¹-ÙÛSŽß;àá"fŽbàÐkI‘²'ˈäuᇻˆTøÄ²!ÉþðÖ]ý+RýËæê®=•…:Œœé—Îèµ²‘جž(Î:íÈ3á÷ŒEóAdœÿÛ_m§ò\˜²#Æ­!Z<ò q-®á‰ôTŽœyŠ{Ê‘·wO1 ßHäУçÚ2*9ó¶²(ZŠš¶ÖQ”J* „@hE±Y^Éų7ê—M§¨]Š\GȘ*”‹·vÇ ‹‰¦­y;õ ¤*ÏÛØ8j [pÚB|-üͨ#¦ÙÅF¿½ A/ŒŒ“†wž–çmÂy©„‡'„[<ù ˜®tø8SØkgë{e*G…Ï=Ó]OßY,–'˜ƒþ|ç ov¤m®'@üǤw°¯‹â Ö\ƒž€±;=tÅÐbÁ7šÑ¢ <Ÿ[ÛƒÒ¥†­uY÷¾_?YþëÑõq ¤8L‹xÖ×ãÁ&f`àÝb,! s~1_6WLyOê—7‚þws(xö˜Æ<ãÒ̓šñ§UÙ¶O­'[ÈåmµiVï­,WóÈ;W£¤2æjXË(ž«uõ:%ÝWçEqµ"¬·¦:Wï¤ÊŒlêI œá‡‹èà7‘1CŠ]ph• +ˆV £Æy|¨ AÉ/sE•òçþE}]7.ÿ3¶u¹Ñ;(_´Ã»U¯V-—¿.lZ5¹æ÷V£÷ŠfTc¬4`µ¶0ÎA¬˜b…1¥:Ñ]Úm rÊÒ‹ç´ ÞÆôÀ70)õÕç73ðÙ¯µ¤™i»áTeiþîõÞûDîRæc®XˆléúÔw†ÑRî.·dwFØwuwfÅÑÒÙs)z~HZ‘º®¸–6ã@ò¼&CÚæ<ïà™-0že5\Åø(Ø©^¿ 8 QT8Yd¼ø7{'¢s§’¶Ìk3˜?äR˜Þ:¬sT€£rëÙ˜ñÝ¢U犈üHÏWTø‘¸»ñ½ùëÉØ8~Ĉ·±©Ü1K~…ùºŸ J†Z0:°'2˼¥7;d8%ÛŒ ¬‚M͘.T­ëç±REy޶U˜Wl6bC…Ü€(‚ Šj©^—}móç¸ÑëdBRª¤lÇl1# ~l!Ùs9ƒšñ±gĽUºë]«ôþг¨Ê–ÀÜÙÕɬÚy‘ͭΙikË’»ßPõ¾êÍFEMø™ÛÄò¾g£lcp%{‹Á°HóŽÈÚ S¹•©{——3%—°Žãy¶KDdxœ°ùpÉ»—‘ãJÛa!¹ÝúOõpÇ-G\YN~¨@H\§„gïÏPÌ Ô½Å›ñŒá¥î-ž–Tçc²¯ÇS2$Š´â©j%€y™õD©“OÃ!Ï0ëù9Êu¶ÔÙoºìÃù[êþ£‰þ/Õ¿·øè?¿¬½Î–T¥d ! ŠFŽÒ_B{o)[¢2t™¿%¡DÕ‡i³î[kÉ/›®³å‚SˆlÕU3AˆéÁ\UÕ¾iÕÆbÚ€¤J`Üì)Á±KAyÛEÓV™ + Ù_’üžÆî0%3ãJeÂa˜Ö'•ñ Ü#¥à°˜¨XüB –íÕþÏJ̨,N,£D‹³£Ô‡€1‹‹N–x^BÃáò©bÑÈÍÈxE]í\¼ ¢1ñŠ”;O ˜eM¨G¶i¸×\ŽwLÅÜìf6O"_á¶€bþØÎ¥í\æŠGÈBN‰«FCLDlá¬7Ñ´ëÄujœ¦­ ©¾Ÿ±Kµ¢xNi¡%:À³ª´’àø«0‘„¡S1&`är8îÁ”E\·Ž˜¨ð7qJpy§Òu}¥<Æi(ï+Uñ}ª:¿_ŸèFœÃ’޶ =zæ9já ),Q8e¡¯ÓÕ}ò:«[e±ÎbÊÇ0òÅr:‰‡ZàW⌒ežMñr Üg‡–Ɇü” :QÄ£½½þÅÃíDÙÒSQ”EJc`Œ-Q„¡l@Œ²aI¼× 1à hޤ³‡‚«×1œÌèUÖSSBÔ›Æ@ŒA‡—ø%³Ú£áò@Q`´l 6!Î0<{Æ? ¯%Þî‰Ðwk&^O¶ ˆó=­žÀU¦í¤qóp)ŸŒsžç‡b ðj*S.‘KÅ“¸F<þ©a¸9'ñ`†0åAchõq¦¬vB¾KŠ7PºMUö#›péÈbÜÿÌJñiÏS€_"ZH¢86Ã&…1ÈdM‘íï|xî„·Ovµ¯RªH:hb  ¾s%P€]ÇXÁ‰Ô°;Æ¡×|)q±N|:ש™\¥‹ƒ)'KöFÔU%HRödnumëð÷2kúj6ÏŒÙݽj\©ÈÜÈì¼ÇŒÁšk2‘º5»‘9£cwŠÀëS剞˜EˈœMªŒu®W™¦J5îD…Õ°ì¢z‚ÔyççoÓ¾"šÀߨöh Œl–® /ÿ¥'fà ˆº*™š5JI† @@Ç·' üÆ"UWÄcâ*>V÷û}U4¶ë\¡“À­©1¯Ó “ Ñ níƒc`Dê©EƒT ,uŒ¤‘ïµL‡t.[ÍM‹–²%N8èÆ¼õ <¢ÝL &âéÔÓAëà{©Âõ©XÄÌgÁĬE³"×ÕÅ~‰¯_j<0“]½¶d"m-Äœ¤˜®²þ’Ðû)èJø¨“Öµž(Fô-kÜ›ÿFA«´=–¬~Øâׇ»ãy˜÷&†´á„[5ZЇdiüx(½xN«àÝÁ”äé Î-)õõ×°¿˜ú¨;]O—¦*ÎoÆäÌ;]–O—zzd³ÂT±Ö’f¦¶]?UL#-jæT‰q<<·@š×°ï¦E¼oøð}Ä3ðÜû´7õÆÈñ2´tÓ4©ocï1–T÷Û”úÑ6¡Û„ç–â6­¸™¬ž ^Œ CCäêøÕ)ïÒö⦠á^×á;Ûȱsf‹=9›L/rqª,¢•è©{rÀPdGþp:µ©dDYÊÏŸÄ) Dë¡&f– ›‰ÍºRŽÜ|Gï4ÿ^€œºÝ¢f©Òc ¦—‡›3WVíÒL³óúg;¹ô î­G½z jçaúgÔÛèj÷}ç¶h8ƒ±ÄîÝB…‘j—VªÐ8x=xg“jžÐU¡¹áYw@«}ƒãà•ªT¦A}~N71*cX¾NÃ-fK…\˜þ> endobj 2151 0 obj << /Type /Annot /Subtype /Link /Rect [84.7500000 664.250000 169.500000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_default_args >> endobj 2152 0 obj << /Type /Annot /Subtype /Link /Rect [414.750000 664.250000 508.500000 671 ] /Border [0 0 0] /Dest /#8d#21#08_#eclM#0a#f2#2b#dd#13#ab#21#a7N!#19#9e#0e >> endobj 2153 0 obj << /Type /Annot /Subtype /Link /Rect [145.500000 649.250000 217.500000 656 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 2154 0 obj << /Type /Annot /Subtype /Link /Rect [258.750000 621.500000 288.750000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 2155 0 obj << /Type /Annot /Subtype /Link /Rect [253.500000 441.500000 334.500000 448.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 2145 0 obj << /Type /Page /Parent 2 0 R /Contents 2156 0 R /Resources 2158 0 R /Annots 2159 0 R /MediaBox [0 0 595 842] >> endobj 2158 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 2159 0 obj [ 2150 0 R 2151 0 R 2152 0 R 2153 0 R 2154 0 R 2155 0 R ] endobj 2156 0 obj << /Length 2157 0 R /Filter /FlateDecode >> stream xœí]ÉŽä:vÝçWÄÚ@ÇM€a F^(T^4¼0^»m4º.÷¿ï¤ÈJ‡O\’’B•x/3C)——w~ûçïÿqø¯¿~ûôý¿wß?}+ŽuY\ÿÎ_¸ÿ@7ÇîçCÝ”‡ß¾ý:üzûööíôÿ_o×¾ú×ÓOÿwЇ9ý÷—Ãÿýô៺?:ÿÁÏ·ZÕ§ï½|okuú©¸}?þßoÿö‡¿Gì§ëóøûÊʨ漊‰™½õ»T—¯¿ÿþ··ß®ûšD)]™ê ¬±ÕZ}øßÿ|ûóiü~ôâØZ¥êÊÖÅóÔúãóù–M£O?צû÷Ô®Zm#2…÷ÑÅǶEYE;ë˺c1<¸Ü¶ªhâ1…»ÑåÇÖu¼±/ëŽÄ<ƒÇ½ÃÖ˜"ž"v7ºüØÖF®ëޤˆy¼ÃeÝQ¸ÓwqðÜúªŒÆâ¯ë†HªîØßÆÀë¸~L?¿¸†·Î/ _…î’˜³ÅwOŒ¡DÐ.Ï;W |ùqâ„q¸X©k‡QT¢fIèNÁclHÿñ<'¨û¡c4õekL‘Gú`¤ês¸0‘_Êô0¶ù‚ƒ´ž;>ÿî1 ;€ÏàK ð,@Ž!¼Ddcm»*66ÿžèë¥ú“˜sDÌ6¶Æx^†‰„(ÖÚ9Æ;}f˜ q¶ø¶ˆlÝs G™ð'OÐåˆÔ·7…µÍ3ˆQ 1ÂLÞØÀsªŒmŒ¹öÑyª²Ö=Ö—×ÄLjêš Fã0WìluU:— Ë©ø’ÛT:}vj5°­yТ›‡Ÿ04‰"°µW„rX“[¾Q}(…yAõ5§ ´ÒÆet„˜5<<Æ*&Ëš0™”°uPþ…D´–á˜L2’ ¥¹‹z†<ÈŒ–Èðh¿HÝ÷sD¸òuy¹ñu©±¯=^Àñ°Ò¯ðÉø¤ Ò]ð‘'¦„£} â™çcBÈ×·•´ ÷`*â´à {ÎÞ&„HÓNžçì0ÆaûV5±|&øž|‚£A¬ð¬Ã@‡ïGãÂýàÑ’­úÃ*W ×fð)´éîfS4ûÝÜïf¼»¹ ,×õŽåëÀòeà‹­úY?Ç_Ï„ó¡-zQž±WR*f~oad1Tá‰ñð„•Úc,Dod'Êfø ˆd BIfø(Û·¬;Ÿ7<̳™ð=[ 7ãï%ãá3P÷ÄlùÜFŒÔLT3®UZP©°Ò¯P˜!¼Øž›ƒØÆ@ޱ9>9Žì"”Lˆ®D„ÇntvÞËd&…äÞÌ´"GM{HäÔñ\øè=£Tƒ„N5ê€x§“Êï°X]AûºOžà^,<âφj"䘈º_u(ÙM½Þ?5¼—kt¹Eúœ©}8],Ý÷Ÿüõí{òlíËùŸC¢(¹IY!ÙLÏ ,ŒiбEΠ#bv…?Ùüi^¢ºO*ci²ãg¬¦nÄ|I¶Ø‡}îy@ëÊbÂe=È„e»Œ9 ¥R° Ùúû(s§$´Æd  2Â…ÂP²lü5EÔË:˜‹Ö÷ðäqó r‘ûãˆ$¹£’§]•g_àÛ{*­~øà쨌s´VîÿFz 4òƒçåÏÏ·²¨ÜóJíX>/a”{lίœ,™)ƒ¹¦’}²¦Þ^~ûŸáª™¢ûØg¿"V[Ö³9U´6þŽ#êðNec/äãT6?YQBÔ"ÅT¨‘-s&—wÜx-_æ¤Í=n`Œéö4m˜©z½Aʵrª®hôÎdäî˜JíÁª„óàw*ø¿×ÖQü1di'hÒD!¬ñ :Î2²+Ö| [—J<¤¥+d– è‘+CF¸bvö²…TIJø¢þë%—“ïšûŒQ¶OBçÆ;øŽúqtÊÓýRk‡z,¹²Ì^œà\Ï&5d‰|" n—"ÆÂŠQ”Që(EŒ8ìpÉÆn®ª› Sü0r†Èµ"cZ;T³"îµ¹ºhD,›Œ…äeªŸåOóMÖÍmkbšëÈ¥J·3…šEBNEÿ‡ônÂsº©+=°Íå3 ù e;fÁ˜ÁÖRµúŒÖôV;3Ðüá“ÍUW}B“¢l7Ä©SŒ3?sZ¥F•ùO”&µä¶@‰7qáí9œZ¸M¢ÓX[.MÙ–¯MÕ(ç´g2òÀ@„fqð"t$JÚuFä °ºéÚýSf¾ü­åx¯JœNVö?®ŠR&“ÙqÖ~×0ÊxJkªnÍq[so¤Mæ:û>R&.Ùâ‘KVtµ“5EÕæÑ#^Á,þÂÒþb›:Æ,rW6Îb$"OôVܤª/N*Ç>爓̕&·‘šsZ©Ë0öÔœ=5•pS®x‘3ß¼RÖÅÝ=h:h:où Ø3\ë¢Ë[®Ú‡rä-Ÿ—ðxØré-¾ÔÅ«íZiÓs¨5w`«W ´…„fg+gA§m,„|bJCð8~b˜;!jÚ„´Æêi,ǘ„w‡«MÃ'©NØ3ÏÇ„¯nùg&áÛíÁ8¢j¸çìÅâ¾f@¤™>!ÏÙ1õÍá¾=ô;Àœ ¯Ãs*¸w ÷ƒGK¶j\¿Ã̃¥œ%C‡X ëÜaŸ”ïµ½do ¬(·ž º.m?%ÓSLÂÃ%ã&m‡*ú˜¬\5³S‚uÿùa,+°;î¡"äªàj•¡Ê'cgÓö-ûQ†DŒÎ¯zø¦YX‡óÅæbŒï{›˜„º€m`w&QéŽ"OÔ_go0ïˆØ¼Š)¹ÈTžŠeÒã3r‰f&å“p[P¹Þ˜1ÕÒæS†kc¨ç‹˜T@ŽAÄyl°JL®‚ʲö[—Y—Ôˆ øOtÂ,„RXE0ŽaÛðàmÕ-¶)˜D¿ׄvã¡Æ‰J!RDöˆ¹ cIm­cÃÞdV›IY'—§Tá®öÛHU8QUB¶hv‚,†ÎÚûŽ-2­èñeeÊ .¯šýla怭EhÉØHòW!µÒÈ„‰§²¸0 &”’'ÊíI›cçÚÚå¬ÙéJª¬ÒTÄÂãÁ9 Ì 0/™ê”O[4~Ù£ü2% ˜ÆÑ©œ³˜¶~˜Í&=Î0FŠ2¦ûUNB²—MqŠ]äf¾i¿H1‘ép£«Ç¥ïa¨© ooopÀ!þÆ­I1ä‰4ORCÂUSÙɳó„ø| ¬˜0_Oð‘~á Y fL4éY5‘N‚“SR@šÆLîáµÂÏm¡Ÿ¸Ý{øù~~Yu¢ðód4i*\;hÕßÄR|♦3ü¬„÷”â3øi˜¦]‘éiv±jOyÝS^ýkÛS^{KS¹H«ÉõìOö'û“´Odå¢uZÑeÙ*¶„”G¬œû··:“1Ò`"»i´³‡=0Å»¶å¦Ä$å¶t°eOÌâ*”;`wÙËÕ&£Ë™²æ_^ ÉךÖe ²–*Q[ÙªûMæésT(—ŒCÒ»{ʧœ³3Ú5ðãŒeß®©¶œÛ5ÅÁÌóD˜¹Ñ:Ó‡àÀüç[£j÷R÷Ì:/Á9¦­=ö¬Ž-‹nLƒà®u*Kò©ºŒäŽGli?½« kWV&þ+]4®|¸—w‹mEXtŠAÙw&ëÞ?ÙôJ,Y|ʨ[m\}Åۇݔ Çh+,"Jò@‡F좑ƒ >ƹ>¿e‘¹ðvD­oQZTD$M¦+È÷N›<!k ‘M `¬M²MCEPo%ðC¢+E”– 9ã½v#ÂŒü /‰q0ID([ލÂô¦Yhô’'D¢)[‡íî1Þµ½tŒ„*Œv¥´—Q°bIì¦ÖÝÔZ,::cÒ!“ôU:¤§Ä¾¶í›ðšÝ„—,‡—Éy]ds|^¶yÐ|æ<˜hö$ÜmO4}esW.X'ÉwZã0ždM1P×Ô¢+¤9fÉ òKäÓT¶Im86\,c(‰!°†EpÅÈøŽ¦h6øü¢dÄÖe%]Q4Y¹‡œBEAÞLg¬:>?Ì®ÿ‰B4¥ò’ˆTg%—‹r8ϪEüÆdõ~ÖœŸ¶†P0…6çG¼èTÕL«¢AkXrTá”t‰2Œž2ªbIäÍAÛQ^zå¤UyëŽVÝH©5c|¬:vÙåwËü€Þé:¬ŒÖ¢ÑºHÕÝ4vçé\{#OTï¦CRÕÈ z•ÀVÐaöØ<_Ð;žµáw t:7j}lŸáª 8Ï'¸6…æéH[Üà TŽ!žSÀóLÁ:â%3UíÜ²Ž h5X0¶Àé´÷±½áðP©8H]ôm<Ú9‘×@98áÚã 9KESJX{“ÂL„Œ9 Ã>ñ@1D1îÀÑI®ž©¼‡a9¡Fèì*£˪++}B(2U 3sF8ÁX…;%afNOàhêÐô™/ù©C£æS ¦Kˆ;³ö–†žêLpŸ­uRlO>I~z™ÿ‰,ÅNdüZ:%µú™»¹5JºÒHK†ÃC:(Ç3šƒjÇPOWWÔk¦Šã ¢è%Ê£T©ü€ÞékÎÊŒÖÙBFÞ)nÕh¯…LîF3pž®º«iªŽ¥Sý¤¯v:|§SÝ«£QzT¥y§¯:œïTÕpžÏpÕœ® ïC´¯´¸Sßù Wͼs…A}4 <#tâÛ­JÕ;ES%2Á—²AD©:ñ 7ì”Í~”mÒ¶—LÚníò‚W7ë+X·?"Ó—ˆ¢{ñ#lmép¼|Ì]™©dgæ²Áw5dJÂz"˜;+"<î*×fƒ'èô…z˜ÄØî4˜·L= 9&X¶@zöªÛžƒËʨݩªtœj”CèTÊïLZv~-H¶-Qjúº t aFï˜loÂÂ.KºX(u}ƒ TìUvexâ/YŽÎj«ÚΖ­˜ (Ô®1‰ßh”´ùÔ„Gd£%úçQÀa¨äî8˜siàÙ†TVM$Áây†uM ñT¤SjÝx5Ã~LÕRÙÆex ÚÕsF¢ÅÔvioõÒ^æF‡ ,xï]ÙÜŸo£¢Šèͧ²™ÛŽ…Ø¡ð¯‰lãSÏudz=Çåá26Y†)QÙR²¥dDz ÛÊ%å…9O6mSã„ÍM/ÒMv%…þ˜ÊÀ»:èÔ7âXØ›¥Þו<}~ø——½}›úƒü¯cæÄ¹ uæÝ—ÓïüÆc$÷ºùzd‹W¿±>êkZÔݓ녭†Oºú*úX ò¢ĈÏh3å&[Û×n§HEÁV:ë^>ìþ®†ìp›X0NŽlCáÑà;¶ª ­ßu`îüsñž5^†´Ââ@—†8‚ž§±sí Â䎂§š²±†½ƒÒ@àCd÷ ®{c¢`%ÖcìŒ{®ž,E ¸:f„¨°Uß•úa¯w]4Çk¦âã=‡›3w1[“\îÛáÛÛÿ«¾0ü endstream endobj 2157 0 obj 6207 endobj 2161 0 obj [59 /XYZ 38.2500000 275 0] endobj 2162 0 obj [59 /XYZ 38.2500000 275 0] endobj 2160 0 obj << /Type /Page /Parent 2 0 R /Contents 2163 0 R /Resources 2165 0 R /Annots 2166 0 R /MediaBox [0 0 595 842] >> endobj 2165 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2166 0 obj [ ] endobj 2163 0 obj << /Length 2164 0 R /Filter /FlateDecode >> stream xœí]ˎܸÝ÷WÔ:À”ERO àvÛ²`Ø@A'“`Ä™E~?ª’TÝMÕ¡ÄÓ—KÅÛ-‹"ïûÅ{ßýñËßÿüíðî×ÿ¾¿øòP›ªþw8ýúáåt{ÿ|hÚêðí—‡ï‡ïŸ>÷ÿýþ0¼ðåßû?ýï êÿÿóá¯ëøãøNÿà—‡F5ýïÿ>ÿÞ5ªÿSqùýôó=üåw‡_O+NŸ7óúï?Tn»Ó.¾üýa:¥:ÿúíÛ¯ï†ó{}D©²jÚƒ*MyP]©ÿýÇÃOýúÓêű+•jê²)ÞðFªJw= ëÙgοDWòkו ¶öyßÂQ¦V®µÕ ­ZUu[ëžlma†¿²ß+ËÓçÚ~1¥Úþ›=¨$c//¿xU¨:ØâÃÎÅ¡btç^\Žu+U˜‘da¯.¿¶ît°µÏû–Çë™yñâÒÜ;œÅœHõ'­[yH]V€…ª &‡}KƒdÂ0\< †kmbø²z,´Ulíó¾Ca/.'›ëBUÁ̪çÅåA_]0´ûcVáµ'~-«¢káŸßr&Õªpˆ¾,º f›û„h¸v`D›¢àÕUò»,eÌØö- ‘ ÑöÚŸ=ÖÀû~\øïŽ¿>¼û¤JÕñ>|ýédœ>9üöµHÕÿ¥wK‹îðõÇÃï‹Â´8|ýù¡;ö¬6ípxR<Â'z¢ø¤„Oðwˆ'Æ 'îºPðÉGøäƒÿI5„ކïüd8Ïǯ=ͧ—Þ¹7zqìÃ@T±)î;€ø²ßšéhÃfÊci†¨ÍXí±íŠóNmp\{ò­VÔð«£Ñ­zõd®ßàj޽Uç'æXõ€i^½ÓøŸTO”š–[Q¼ƒÛ5‹àFB²"Т a¨>$»2ÓrkvQ ¡S´ðeNñ‘=àåg‹|² ßu0%Ž«µˆð1@²7+‚& rL»x5YŽc„šcÇ"Xú`ÖX/±0”0öÇsÔ„•ž©B ,£ð ð©Ÿ"iùFMæ]9dM]Õ+FÝŒ!1¼˜èð“¹È!tíl,…Å/!d±º¤6>¦?¼7›ÊJ±ñ4Úűîù䥙6zª:yMeïájƒ'¢ôôh Z ¸æl´ X;#·²ÏSÌ¤Ž‡áÁ˜¬ Â0¸–$GHe«”¥‘û|\OüØ2Ãz˜º„ëè AYòYï*0Œé8ºÍx÷£-ä%¹ cÌοcׄ?ãPé±¼Y"8“™ñšômýIYÓ±bs35&á;:¬[ÆÀç1P¯u­×öfüìÅÖfŽŽe,#WÂìgB^”Œi}¬%XH±äv8c˜ fb’l˜2‰ä£2±!ReÍo‰o§ç6;´‘1˜žeÃÌ|VRp½¬ºÆ¢+J͈d}\†ŠÓåô™—qD€X˜™±T5÷E"Çsý¼½ïíág`N“5¬dIg½µ´{£å6‡c˜}~,¼’¬»™ñ…™ì½-<˜pSgÖb’AŒ¡- ÏDÿdm±”ó5 ÚULÜî wÍA ÌgºwöÙ2ÉHq‡]í r/¤³©•­H™ ¥Š°ÂU¨Ñˆ,öL‰ôÙ8™Utj‘*pó¶½QENjç¤öù&µ+uáZÌéwc‹§læt÷›ÒÝq¸IwËÜ”ý«´)éÞÒÝq8ãÒBÂÁÙ“Ìå-Ê”w½mõB1L]¼©ÝˆH݇Çýb¢€jd©:†êyÓu3Žr¦HŠ8˜`ÑMè2£HN‘J&¹ëHûn ft.º‘ìHRYú-~#6sC·ë$¸ì™õÕkÈxùªiÔKÔÍTQ°Çz‰º[‘µ¿›m̨E£–óßwT/±y,+œIc–sæ¹*â–«"šj9ÿ}GU Çñ¡—¦X¤—\/‘£Ûç]ï,º}_õM»"Ã{7¶xÊš!gxãúJm±"Ã{?¾RæŒ[…A•D­n–¹)û˜Ù¢Ü¡E™ò®“®—hÛY`jV/Aå™<ÈúT=Uh€ÓwLB¿Ã$£˜„(“’MøRµ#½·þB±£„—#dÆW,Ë “ÎÞê <†[1?[>ð=^ò-©¨-(X€ÐÑbW‰–\œî2Õ@3¹ŒÇ$²à“ÀÊ™ÊíürÄ/0ÖE/Ó2”Í3™õyÔƒ l1,ǘ ˜é%Ò?>΋å!ä‘Xd'f`‚àLÈJ䦰ð^JŠ„L¤jm©Â•¥ ÍTÊgliŒŸì?ÅÂóðVa2Ójº•M3DrŠód§æ{¿^Šæ·-‹âÍ™¨‹KG»û`˜@v ·Àê¢nî÷ð–^ÍA°f=Uªp‡j¥õë£ù9‘„2g¬¯huŸ">wà¼a“8,¦H8~#QÓÅ(N‡ÊÔþF«~DtNYGaýuŠDkc…(µ 3Êd²@˜Á˜böHc͘BªÈœ‰ó-9Cê¹n¦èdÝ0Ù:ݑ𵠑›WTÑ(æ­>Lùö"UyLõ²h$’Ò*Ä2Š˜ÐQ’2Þƒö D{e±æÒŠŠF&vÅ|‡1…°ÝFyÞ÷újÉ®V¶–Œ$Є劬n—Háìäê¥ýÁ¦…­³¦mÖµµò_ ™P®±h®)ðå÷ÞTµ¡nÕ*´¦˜â†¥ZÄ*UxW±Ao§-È9ÒKØ>ZGQ6 #ÒA6´².„PÂ6½O¡Qé“çD¬"ïXeÜ7ÕÆÿ6móû‰-w|î¸Abb\Æh6WU­­JCtØ Y®Ö5¶ň3>ÂAµ±m iø€ªµA„çZI ÆŒãšeÂ-¼6kXz&‘‡™-Ût«‚ŽW1'šõì:[CRÁkÙ^TÛ_©ÑÅ„E O1î>#$óV8¹ET.$ݤ±ñ·2HR®/m;ª‚;S8µ^–ÓTÏ# öXÁÆÆZ¼ø%[Ÿ¡UVc㙹`%üÝLð Û]¹^ðùÕ Î0ó‚ŒVåë­{•ô;†§<Á'Äå¼·¯€¡°žÿÂï8.}àÕ˜¡38>Äýˆ«xd’c°)ÆQH!øŠƒv ¬™øcü.¾0„GŸ—Œ0Ï9`/~˜zq 3_r\srÀÓÞ~‚%9–‰˜à;ÏA,à)LºÃ!ߘˀX*lbêwc–©ânô;\˜õ{ úÝ7,ké@\wv¬Æì cŽ *fˆ’$k•à‘pŒÄ¿ÍKôØ&å[ø˜›nÛ׈Š?lç ¬QÁ ;ž²Ýu/Ül×^„ê2ÏŒéØ{,†* Ò4ö"¬¯²‹t2Ï•LÙ(ÍA'Ö(ÅsŠñ´çtÊA§˜fdÂA§Ó—s#& C¬ªM·ÌéD€.Ëh—Œ–•ŒæŽê*ÍTÓ@•_‹4%"êÀ¨Y¸aK`oón¡O# ‰±l² †n«¶h4q/ÍC˜¹s‘æ ßrbJþ<˜qöƒ7ÑFžž´ûeé9G†˜+çP^¹Õ¥m%yY›éë×¢·ëS.@Õó3{ÃÌÈèQ¬f6½*«€'eÚuÊNífò©¢·l¦:ÚýWo,èÔwUZÊVÆAdºÆ‰¶"tš‡S¹ù-W "G4ln^3@|Ø!'ñ‡ mÅ|g±¥Z„ˆQe–Éi=Û3=z‘˜í+|cXÖ5d˜ e‡é©“¥ |צ€ü¨«ÎfÈ„-p¹‰ÓKòéR¼9ŽÊ¹¢p·- ËË Õ$d€lÐÇA¥6a¤î¯¡- FжU¥éaÕÇjÓ·yø#ÏV¼†þupqÞ?ï¾÷úË©Þ>/ýƒú¯½¦þL/P uŠôÅýV…Úo®€ep9õQŸuæÜå¬çOÌÓøÎ¹xA“ ¢ù }Ç,½×ööi<é,x2¢ùÚjc;›òpl³žpØéÅ"éÊ1^ ¾3R¸ò:ú‹ú–àNîw7/ü.j¹Ï‡ÏÿBVò, endstream endobj 2164 0 obj 4834 endobj 2168 0 obj [60 /XYZ 38.2500000 569.750000 0] endobj 2169 0 obj [60 /XYZ 38.2500000 569.750000 0] endobj 2170 0 obj << /Type /Annot /Subtype /Link /Rect [243 652.250000 319.500000 659 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/bugs.html) >> >> endobj 2167 0 obj << /Type /Page /Parent 2 0 R /Contents 2171 0 R /Resources 2173 0 R /Annots 2174 0 R /MediaBox [0 0 595 842] >> endobj 2173 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 2174 0 obj [ 2170 0 R ] endobj 2171 0 obj << /Length 2172 0 R /Filter /FlateDecode >> stream xœí]K¯ã¸ÑÝûWx Q¤( ô3@Ý@AÁä…ÁLNùû‘mÙצthé¸HÑ6¿Æ—¢Èb=N«Š?üîë_¶ÿøïö‡_ÿ½ýqøûÃ×Mµk›êøÛýŸ__þ v»áßÛÖ5ÛÙ|ß~ß|Ù|éÿ÷ûæøÂ×èÿõ¿m½ý}ÿÿ?mÿôçþ‡~iÿ ¿lZÕöÿ|ø»kUÿ¯êü÷þçÿÜüñWÛíG<}n˜Ìõÿºqµ­ö³¸ñåï›Ó*ÕáÏü׿‡ãú}D)ÛÔý_F›­êL½ýÏß6ïÇ?^휭[ÓTƒÿæ¾ÝÖû·ÆnUÝõÄ·£Oþˆ ®äÇvµŠ6öaÞÂQÚªàØ‘7º«Û^ÊÈSìmtñ±ÛÊTÑvú0oi’œ¶¾ëL¿0kÚêåq¤Žêªxûz1ºüغÒÑÆ>Ì;Ò¾ÜWÝœtg36 ÷Ó¾‰¦™{ÓOæ-M’Ó¾âÁ÷µqƒDÕ=Ú‘§½‹'¯Îšx<³Ÿ·4INûŠÜ×NÙˆzømtñ±]UwÑöõ0ïXz.·¯NUÎ4­¼¼¾a_›~±Æ>Ì[š$þŽÿ²`<‘ãOö{tÖ]±n?lïOÿ­{øÝkk÷µýÜŽ?­·¶9»­ÃO~ÜX³Sª«SçßÒW£èËoô¿?ü·Û¿¶õÞî±£÷þ'ý;×3Ùÿ–»Å]㟛÷¿ û²ß${ÿmóÃç^;Øí·¿÷[r ôñ¯o¿lÜþ?ö«k¶ßþºýM?Íw¿Ý~ûicvFýûý‡'nçºÊÖÍåß©Ñ;ÊÂÑà;էÓf§k§®Ÿ|€3ÐÇÑÞ~€? ¨Þûƒ0stþ Íáz×ëÚ«_%æ8^}„4ÁÔú|x¢ÔiNo£áÃÝgÞÑÊ_†&eDj¼âÙ*8ªÏJu~/@0éOßzÝyŸô+£* t¯À< p\U·;Lïjî=¶B`ªHQé®öæiô þŽK8STçgHž÷IßÅ&©ÑÝ $…³1ΛM@T°¦67D22S´>I+¼Áj9» ‹XE÷8Å[Û|«Ëìeà ¶ŠÀÉj¬ññ¬±‚LjíýÈaÜtä¥OcÎ2à‡1 Ãf±êxK`§FÄÄ,3`îÂħ8ÅÁma4ŸèVRð\$®v¶UW4€¶àdëÏÞ䔈š´Sj¶© H5ÞðùîʰE‡ÅÞçuÏën&½îfäu7^wsöº›+¯Ûx^·™ôºÍÈë6^·9{ÝæÊë6 ½îæ ¼ÚÁ®·¶ñ6*‰Àþ3šÐ©%•vçðhŒ¾'€ÀËÄ n*æ¸(¹¶Öã…/áT t]ÇOUÆ[ ÈÕÁѦó·®]¾A5|¢írFÔPLß´jgoªŒë“ÀÝ®ý%w«¸[ÅÝzxwKË[Ë·“X¾aùvË·g,ß^ayëay;‰åíËÛ ,oÏXÞ^ay›Ë·'=ZkäÁ&C¸"ˆ3-l™Zž,œAíD‰Â˜î‘7`‚]Ç»1©Xy½0§Ø/ xÀð;+Ÿ éT]+Ýn >52Y·ñ±°ñÖöTÎùP,ùÖ5£osó·N L8Lt“`¢‰nLtg0Ñ] ç 7 &ÜL¸ 0áÎ`Â] —LtLƒ‰Àwð2à“@¼ÞÏ_)FþY|m=š3ƒ|’M0Í%ÌuàÜ «åW1×…â]yÌ´+ ¸(ç|xE‚v²HÐŽŠíD‘ = Ú«"Aë ÚÉ"A;*´E‚ö\$h¯ŠmÂ"A{NWm:¤ï¨Ão¬ Îù0× r`Á×ޝëF{L]ú7ª|ëV­Ü"0ø< S[_™<•¿ »Æ[Þól1Æ[›œ9öªìdõ€U؉ê{®°WÕÖ«°“ÕvT=`'ªì¹zÀ^U؄նñ O§-"Q&`°qÇ€È{5"•EL~+‘àÐ@¹l¢²#™lOÆ)î9!©µ§e%Ä­á;|Ë„E6¶hø$0ZŒYÇÝâ}¦ïõã‚-6!Xï¬o‰Ÿ ËÚZyZ[žÕH¼â;õŠ¢åêÆç½øé‘®îÔõ†NjÑùj/©p4£_½Ì)¶›ß+J8ýo~Ù‚ˆÿM45{C²1¦H$¥ƒ)Á˜´F‰ëhϳ7=ƒ*;f÷RK”RR&Ü,Æ3gœ¶Uz¼A:6k¢¼!¢„~(ÑþÒ3Ï&˜«Þ21­%GépéÌÙ î rb`܈Ú~Ù I&rŃ–E»˜ $q®,lž·ºhu3ë'fç-×úÆÐ'¦rÀ|a*3­ÉžŸ˜)Qm0ž ‰P,Dmz² L[ÛÓdVÂ$•(¤,Us6Qº‰4(¤Ì;Ññ 7?€ŠqllAê)Óà8þ¦Ð¬ë#2ZëcÄG"V;79c{=20!æø±–¡ùß›õJ §˜’i-%›&BXV 8a)He?|>Ò/ BªÌÞð2‡=?(.læ+ì¡>(îay{<¯lÛîzo¦ÎU‰óèê#|‚OÑouÌœzwóÄéÑÄ 2~ŸG+|a¦¼0!p&Ïœã¿[¾ž@Å?Ì6ðŸ¢(ä Wà|9…h_ÜqÏ-ð¦ÎCf»h†ðwðJ™|øÜ8 ßðþ•è\%ËLÑJ2[ÂP󭆺¯‡™A€ÖP“PmH¹YÑ2a) È)Á!Zc»"Ïô„æ:w‡† ÐË^7ÁI”æÂïZˆ’t‚“(¼‚¿#šã¹¾N[_s­Oƒ€ÕÃÞþŽ,j¼¥í&ž4„§ÆàIüŒ4«]h Ú5ú4&±B"èKE¨ñÑê!&EE™éì7YÓd„¨¨ã>Û- ŒpéT5¦HÂ-þ0sÒÌèŸÅýƒ¢6µRžex–chÑ3 æü—‚ÎÜ$œ¡˜ßM4ÌÑõ’œrÑrö§?µ§úä¹Ù^„ôKTô’è(5 pSYÚ´H5fÖëиåÂ& ^R·ÈRP@ 6¿*É’mÁÇ WL|ªÈf‰&JaŒþjjKæ:B Ü™\`ž=m1qÉN‚X[߃¬8“LO¡B‘¦ªj<¢2†Œ* y¢ ÛË7Æé ÷I ”lŸ.ªÞ’@+T³ª#uÝq3vŽCMU*(Õí’Éâfk¥JJÖ´ C&êD9œ¢`?Ê!èϦõÙTóŒ¢ZÓÞÖ>ÒX½w~<Á8YÙWæ…p0—á1·šŸþŒûj%»çԣꡗlÛÚËü¼ù:«K­$¤l‡ëQ.¤‡ÀbØ‘Ÿ¥17ÄA›lÒúLä]´ùM2N¥µHh<Ðå”té.U¥GÊ"îi¯l‡ ª–¨£øse"4“¬t¾«Ú›ÓdÔ„d fžuŠÌéè“eåS¸@õ‰D¸EÜT¦”I‘ ÊŠ™ö51U’¤ûwö<ÑÒ/Ù¢J\ˆ¿SJƒï`êß $Ûc¬wp‘¨èGL™D ‰)B$ÊeðžRòƒŸà2.\þÀã]X½´5@k8.1ÃÏe‹Ïäڛϰ9o r¶9˜c ™1X2yÆvŠÑvGBû!n?˜](š8Ýå)uç[ynκKSÁë¯ç®o ^!+¡pli±„Û;à¢bââ¥T;—j=Oh«Û^ŒÁV?§ø9yØÝâ缈Ÿ>Îm«·dâD¼ô†x°T˜Ò"˜äRzC„N…)‰\(-Òì[VÆqãíD÷d'»éœOÕŠß$ýÒ°=TO“õûVÒ+²~˜9¬‰V ìfªS+ê ˆP–©z(eйâÁBÙí|cø‘lª#v^äØìІî[…iÝ6ÆAÅa%LŽÈ $³:ÝòÇ™Ê=©l&“ÀÕƒ{HÓê4H*3Æž¾ú:!ì'<Š0¶y½}Ìßîeyàê(Â@ŠâN¨øI ØŽù€èÏp|0]M_ocÙNÙ©Ù8ózº3”“¥,º3ô¤è΄ò“@CÞ8.nô9ä…+À˜~¨‰²|³arMT¶ ï‚HgF¢¬é_ùlǨ"ßÕÏ´S•ZxX¦j¡Fä“05‹Ì™v€«ð¬%:!Ü\`̳ߪóìØH³QùDñmÑR9h©;R„Ú>\ôBóè¦qU,~ç„8µ_/‹ŸôÊçÙò>ªþ ðq<½¾´ˆ´^_…È2üĸ ²i÷S™¤ÎÕÉQ¢À'ÃFmâlßèŠæ|6x„WˆF3TÛxÆxàDf_“äIe=ža@@riƒ7b}À>^P&ÿ’Ã˜ŠæTD}¡hD;«ª§H[ó@ÉeQ­GëÑ#ÅRÊûæ³–˜ÇŽëÉzd²•CD >NV»D\ÅÄ€ðܘ[ˆ2€à²;ǨB樶ÜLÛ@‘æÛ²p§’3§;¾Æ½©1b†'ë†g¾¡®®”mý÷ž0ñãnt”Ü3íø%º Q±—Q «5âŽyE›Ñâõ¬ßÔyI«0ÌùÄm˜"ÝËdÍÙúx7p]Ñ´<Ј–ÄFu0kíÝræœáËuš¥(sžºOY”i•¾¦©äH"5Qã”N& 'aâ(Žö1©–«Ç©Ò¬Æi ˜:p¥8}6ìIì\àÜ» ÏI7%k±ü 2—FÒõéR¿ˆ/JçM–¸ 9)ë¢Ì´%{˜i¸¼Q…Ëïâr¬ÿsæò@<8Z¿Ct§ ìie®¶õ|”©ÕÝz’f¦oB^§¨,-]ž„Ú¢'ïàwŒ9‘°@ Âm°d­ŽÍš„š«}k£ò2š+À—¸šñÚ ÿ Ïíu4¤°æª–[#¼Û5ŒO䬅ßÁ\…‘+£) ­sŽ`1ÅÏ)›´ç†>Âñ,ÑhR@1ºdv óòû„{rn΃W'ëÇa+àŠ”\zn¹ÁXƒ×Á%Å£*þLîH"wÆUú{]óÐÑÇ¢k^\×`îMªkêúË<¦íÌù\ ò•ÜiÀ¶D®;9:ø&i憋Øw3-E$2qÝuDÆ­“2¸&UÝmªšêçH»¥ZuŒ29™ .¸ŒÀ”döGy¡£u1=•púßêùæT÷¾“JÔËkF/ñn ëÚÑì‰dô€íM•j-Ûž,UU–hJ²1è!ÿwêü¤Y>ƒ|¯³J_ýU’×0y½3ÔôaY@iõ0#“ìWOÊq@O„Ct8L‰i ßÁIzØý2²ØbÑpê ¾´šØ\NÃô4„ù1¿aɳ†¥ÂâØfáõ$ ´vÖÝ–³ò¤<)O’b‚€5ÂzƒIÃ"4dIÁ Í:çd8êÀaêàш;¢&5º^¼N_->r>rªôÍâ‹KûâÅGÎÁ=¦ò‘s¶âQtbô4WYu½Uk6Ç+ÉåT1LQ‰öV²Ù,ÉÊ6pÌ/†ê1zûŽfÒó¹#¯&røc'û \`vÂÄLÖijo©T(¢9sѧ+êÓ .&ÍX;Ëö“$ZŠ2-ç©6ÜíH\Ýp“\›3ÚwqÜüw“Ý$¡PKæZN°wµw™¤t‘VÁ ¸ïJªb’—ñû 2bæNµÄ&?Awo][ßT%ºwò&W&è¹Ôö—œ1T6b…÷cþ02·Àu‘ÕZõ…Œ ÔgŠÞ9]nÔ‰…žKùÀºåNéS'’zRR#f‰ \nôìVʈ€¶÷ô.Ø5´Òœ±k‰ìúZØ5eD@ŸS£ŠV}%­Z"E«¾–VM0Õ]Ü—yDÀ¨s{Ö,"¦9Å_²Ž`„‹-"Ö¸Ð.±‚tїˈ@ÿgû½gç ·¹õ 3RÝÝ”(h¥wý²ûnÏñ±¡IæTR鑦íDç1u´ÞÕÊyMýkµã'ƒ¨wC¾ëÅÞg0•~ü}Gߪ|™šÛça¥(å ™·)Up²jXúhƒ)œ¾…O Z†Â£Áw@¢-ýÂX° ·ÿw?ãÓF7Ë7ZáxLȵEì9 3gÓ>!NðØ"2ãíT·jÅ–½ƒ‰â ñ!³×—˜(\‰oj13V!8> >> endobj 2175 0 obj << /Type /Page /Parent 2 0 R /Contents 2177 0 R /Resources 2179 0 R /Annots 2180 0 R /MediaBox [0 0 595 842] >> endobj 2179 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2180 0 obj [ 2176 0 R ] endobj 2177 0 obj << /Length 2178 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯès·EQ ØûC€Å.CC`Ç1ŒÄÈÆ‡üýè9ÓMõG‰_)©›ij#uóY/¿ªúöŸÿ~úço§oß}þÏé‡ñ÷»Ï/Ù¹.³á§îç›Ë¹9ÿ>Õ¦<ýðï—¯§¯/Ÿ^>µÿýú2|áó»?·ÿúß)?ý©ýÿ/§¿þ­}øãø¡îÿ~©UÝþþWÿ»©Uû¯ìõw÷üç—¿üîôk×âÔÝ8˜ë¿¿)›\«n =}™f©úŸß~øõåÛaþ^(eŠ*?©B'Õùé¿ÿxù©mj=;7…RuUÔÙýÔyבÊÚò&;u9ë§ÿi]É·]¶Õv?né%QºRîÆ÷µÊͰ::×òëóÚz€µoÊ,XÛý¸¥—dÚWܸܾ6™n†Õ)kñåyk\~雬 Ʈø…WdÜUÜ¶à¦æ™×Fò«óÖº|ÛZUÁÚîÇ-½$Ó¶âÆEöUE×KQ7½d8©ZtfÍh¼*6Þ\|UtÞ¸—ÜÛ:¤þ©‘µ¬ÖC¬~ÝÉâ`÷æð¢Œ; Û–ÜØ¦ÿjc_[—_û<Ë´ ·±ýÈm,l[ncÛÕé5l˜½h=ÄÆ¶'€TÓëïëh[rcu^«SÊ vó¨ÃÇ‘‹¯Ê¸µ³Æ?y4‚2<N–¯Ž/~ÿååÛªP-AU§/?µcë»~}i­Ê²ý£e¤º}ûãé÷íˆôN_~yiÎU^N#Þäߣ7ºBo²ðMûo²¢óáK»ªÁW¤eÏ¡WU ñà7ÚøÏ;{ßäþ{’}ðßj>xp¦ªöÂýo4¤rǨñÀýÑxEq?½Åz“•þoý@UP¢8vSü{¢‚F1`JŒEñ K—&žT-U‘¤êJU<6Üš¬½9}{¤êãIÕq¦q¤ªÖ÷PæÍ¥7qfWæ?BŠÓb:¬ƒ)²~0UVOKð]ßeq.ôpIÿ¶8|ó¾]ŸË¢2Ý»·7kš¨SÌÙ4Y¿D6¯j¾B8:Öð;¸µYdzpMtFL.ŽcWðN«äØã¶¦­EÁTxQ ØüÒ¢„åð\7Wiì0À¢6®Z (dtVÙRS“Í.&Ä»l“¦ÑÜt=£^<Ìj¸yÌ„˜¡Ö‹SŠ_ÅØ*¢ÜØ4—nt¥1Œk=ö|qOÌŠÁ#Ý¿QåçMŠëõòmïk‹|ƒ‡þ›&ÑtúÇÞº=Óÿ¡}ÍQ¸©VfQW>×m­ëeúM÷Rw/•nûÓ½K£Ç¼—ŠyÛ_—ÕÔ—¤ªk¦{–ª‡¶À’TMR•=)Å‘ªõ=ÈÔ½ßö×Í„‹qÛ¿<£'ôÁ®½¡X¦à`jÆÔÃP܎Ϙɿ¼7û(34 ¨Æ Q¼+/ËÀð™°# ‚eౘ–ð0e†Gê+[Ï8äñŒ²1{ÜRWb{Á®ª–ÁÖ3âE4„Z7^Ǻaǘ¹ûd$ïºÄ»ö´ß?wôÇŽ&{Eù5•«ºCe®â”Èb„Ê] PÌD)Žòt¬ìÇ1¶(œX6y<·ŸK+k=d¬„ã]ç8^xD}/ùO‚gM‰å]ò°V»Ž…ñGàs ‘Îø0ç§ðî³:·³È¡öð uæl-{HÙÜÅ4BÐ%µ07¬ŸFQÀFxå+”V‹1ZbÑÅúï%Zሠ)š¬>М,æ‰ r %`€ã عÐNáÕßÉ¿#æ³cÞ@‹zûƒG@À°€M8jGkx·ñŠb©Œá…D0 ÎÃì6³:¿y°“,mÁO¦Þ0iÃ&*5\+ JÇÑ`)›×Ã#ª²ÆZà;,‡NZm¬qz¸EçnÆà8ao}¨ÂÔe.üÎò\uÌE1`·sQJ9ÁÞ#Y¢'u©Ç/­x³kàA¤»; V(¬Îy»±ê;’|RGimÉ&Êy# ºŠä'v‡38&l0N,F<îd¥Á»TgÂIõ³Ü%‚úe˱µ§Xø‚‘úÐÉë`N d–XŽDû ïÃ%v(¯Xjš½~Œ®$]Û|¤ aå…·•8e28F …!;6Bℎñú- ÂÐê\»rŒAv;HGb©Ÿ‡4‹•aúSq}—‰Äáœö2$a½ßqê‰àÃ,‚é'p9ÂëÚÔÓUSSë§VÕöÔl⣎gPbgÅwë…Û‹êC€†üÂ><Ü1–«x I5§É–´zÊ2]!îSëª.üëås°ZÜ8ÜVYä (¬Þ"ž!P˜1ÿ‡9[a“÷³¿}*TzÖüÌ/à[_fO¶>åQ Y%"#_™~$ð¨Úý’… óTöþR±—òqÿø³ê¢RÖzD¸ÿ¨J«ÏhhLQR´·õ¡²~Zǽ„l±Ö#”ÃÝ_ÈÂ7s1¾Y½^ÈbP29ö–„y@W×¶ÒIE…DGLÌz®«ãó.¯)eäã½ƬãÄ;æ&…,“\6ñé+ŸÆ‘øåT–ãá$þ^5„§ò$½“Äß¹Å+jdûÈ)Ž–¨_Ë%-qT-qd[h—Z/i‰D£nMZïÐZ¯ÑªõŽ™ á˜2`{=•´ž4ÿ$ŠßƒÖ‹å“ÜvÅ;g¤ôáÜNæzUyÎ}üg@&ëÐ¥6L=HE]KãÙè>ï½~²W¶FÑæ%M¨£Êú¼tSŒ©ûÅãŠçÉ¡WNÒ™ˆÄÊ\ÌP©L…ƒH•©­mâ˜ñ¶€Tl™ù$õ%ŽÌ‘[¶xE,£tŽùM¸Z!\mŒ,‰]–ûŽÓKµ"ë'wâ$9ã…‘\ ^+H`k¤¥/-ÎôŠnwLW›Þqw\u|¼*dbI¥Æ†Á‡Lœ+¼nsÄàb’Å»i¯CohÓ›#BSþ1&3ˆ# ES¤Tºíõà ˦pÃ,I‰I QÍ$#ÀìtGHdnV„ü$2w9–ó{&ó`¦‰ÃU~OÚsJ-Ã~êŸ1Mà0†2E *‡±‡‰ŽzœéýàŪ.¯À‹U]Ý/Vµ±€…ݼØJ_µ¢/û˜À‹U]Ü/Vµžõ¡gàÅþSæªsÝGxðbÕxd-ærMä*Ú£F6Níð*aÀ‘n… Ø£24ˆzÖp!ôÑcsë;øMé?‚ÀP•ÍÊõcdXGmó3µòD=“;¸ÓÛ­×9(N°¶Pòg#û·Ö+Ò{òhè8®àÀ™R)·Oå>œã?Zqì>&Z“åÆhiFñI™¸z Ö€HZŠò¯¦ì^½rpö˜\œïëÊrENð¤*9èódWФ’“ªLª2¦ªÜA¦ìÍ¥Ëcª½ú@Åä¦öv]ŒãgǤö"ª½GS Ú'öM¦y½»|mÅ\÷þ&Óäõ$aÔF¬X&ªÏ”`ßQÑŽ|l†_‘ n‡ÃesçËæð½gÂW|ðÖßR·û3ð€ìeû¬ùò¼( ç7I£³}í &éÈÒ%nÈËÕ²±uâXêFj²§ÁÇPRxû¸Þ™˜ÄP ¡á“6FÒ·zLèþFËê‡ØœÛò@0…ã¤qkó ÕõR_Í;àJ8 c®mˆÌiÆ$è ‡ 3&é€H‚¦°¼¢ÙT¢ˆFª5¬M`kÉ0ˆn„.| Íó»Td*¯j{ ìlçÒÕÈ“}rO‰Ê6òbT­˜)º;ìŠðiiL±<ÌÝØ'~)Á’ÖŠ]=7· t/W¦!k´*›-eM¶E£$ì¦ê¢|ÂM-2½zS%¡!§4™vI}$õ±GõQÍé>eC¥{œL[Âï]-»@OEÓ;NüµÃîå8Ÿ|šaÄ V’‡Ë0.ã;d´?5,XE¢à ⎗r<„LZ l 'œRCÖy*@«Âq(kî‹LCº"RÆÞáß'œš”T­â}Lá‡H÷<±4üº ÆÐˆ^ï0Š›ªµ²U†,Ùú6;p£ZSØUKH'BÂBÌ%‰°l•[É©(+Kôœ€C5È.qX%i0Ý@Cjê8Û¹Å#êìZŨ©_“‘íßïp°ÕA²JG"‹fEq×C’ÅAË{?æõö÷:Û2ZÞŽ½|PFÓ8Ÿ¼€²~pòæA1O…#…Ú c:#åÇ ڌ͉s´†-R¸±­ÎçÖR*/LRS„²¤1³}g ÖÁÿë«Å½ÁŸ©«Åa>J®ÌH g ì9£L¬Ô”«ëyÒHíÐW½¾f*D¹1ùð‚{í[ù8ĶöÝßÕ,о{j®‚à‡'×öã§ôU+ú²!оû»˜ÚwOõ¬mÚŸ2W­˜ë>BÚ·}ÕÓEtÃ*„­qìÄä‹I‘±f’”~M8^„H Ø;+œ— –¨Ý>p+Vþ¬öL1ùÛÅäñ¯ ¯,ô<º‚I‡éã\#ELf#ñÚ0–b¼6—þI5‰«&Q‰JÕ=eÄéúÓá!XZ¿G²5ㆼ4k”¥6£a|/"é(=<‰L–g>kã–÷x‘t¯h]f÷) ~ýͯGÆ‘l>7q[:Ät–]9Ät¦n8Ätf;«º'¶C¬ÿ”¾jE_öñêkš[±fætkÌÜ!Ö}Ê\µb®ûïÓÙëef¬Ì“›× Î@æ‘òÑ,G ©‡ Áø÷o6WiÆ2f0HLi5‚ðr~‡ÊàÂ@œSÁ§í8šÁ¹Z éˆ+KKŠ -ä9³g”Iœ2œŒ{@4ÆAÂCÀ·>äDÃBS™àáí«/s­…KÅ1Îb‘d€ëñN>±ŸºÐTVjKã=š‘+ѧîPÜ57Lñ¶$U6×c¿…ZƸiŒtÆèhøfûxZ¬æÖšM©ÍâôrœC§>Á 7ßAb¥rÖ,IS/S N_QÓoúéµ?§¯í<œÓü´ô ÀÜZÝ™êÎf§¼˜F§ ‚6¬¾!i†ÃP~ÎUÿââÍ@LÕüÍxg•ŸÇ³áa((˜ß£~ô’½5¶ãLÑñÛ…-@°­VÍ'8ªìŪáÆ4n ~gTÊkêdË\÷ïvÄÓF—þ­°E×’Àå|ƒ<Çsc±fÓ> J ¯eÆÛ©–€Ý~ßÁ‹bàâCbw®Í1A¨{š‹3v°lžYYJ$Àå(ö=ûú"£!ËÞufÎj˜ØJ>¿°HµÜ§Ó§—ÿx¬¥D endstream endobj 2178 0 obj 5650 endobj 2182 0 obj << /Type /Annot /Subtype /Link /Rect [202.500000 238.250000 251.250000 245 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 2181 0 obj << /Type /Page /Parent 2 0 R /Contents 2183 0 R /Resources 2185 0 R /Annots 2186 0 R /MediaBox [0 0 595 842] >> endobj 2185 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 2186 0 obj [ 2182 0 R ] endobj 2183 0 obj << /Length 2184 0 R /Filter /FlateDecode >> stream xœí]IãÆ¾ëWðlÀšZ¹F€™öL€ ¦‚‚qÃðéø¿J$ÕRQ_‘|zU,²Ë ºE©–·×ÛêÝŸ¿ü³ø÷Å»§/ÿ)¾ö¯O_âXYÑýWœ~¾¿~CÕÇþ÷¢ªmñõÛá¥x9|>|nÿ}9t_øòô×ö·ÿªøKûÿ¯ÅßÿѾùSÿ¡Ó¾*Yµ¯¿_›J¶¿‰Ëëéý_û®øý4â0]¿˜Û¿¿/…ê´Š‰™_Ã.åù篿Þuû_4‰TÂSH£Û£Šÿþëðs;þ0º86Fʪ4•x`iÌi&­ÊBʺýÇšÑDç¦á nª&Üà畳CE«Æ?8'n­–|l@—ÑC@ßÖUÀÁO+çJY86'bK#"ö2zØ—M@p^y ı9[™ºƒŽ2!0{>ð›Æ„ü¼rv¨ô¨Åƒ3âV 3P~BWÃ\É€ƒŸWΕ·žÁ9q«Êž±ª2ôËpl+µÑéæ´rn ô˜…cs"Ö „BÓ¾Žö¦R?­<Œ¦Åcs"Öd¯Ê,kCrU-ʃóÊÙ¡Ò£ΉÛúr.´ãÃ3ø;Û£a8ã»[9;TzÜâÁqÛ*tN ¿ŽµÒ†cÛnåa2›±*¤³âuô°WÝÊ!ŽÍ‰X­{qYë์öF¤šóʹÒ#Öûó‚1ð:ºw€ÿûÅóÅχwŸZ»®¥¦²xþ¹]ÚyÊîåù‘ªýK #ëâù§â!¤ùSñüë¡9–ÊKœz¢kôD|€O8OEXA çùŸ<ÁÑ4|B€Ž‚;ÅБ¢ø‰‚«îVðñ¹%Ç𤤫HI@äO>‰´=[Pý1<¼°šZœc¥`ÐAÔ[ðÛ{äWëFœWê̽'Oh´sËFëØ©v©[­)ëêú£Òñ±=jUK5ó;(¢ˆŽ“Ìlibú´\€I(=‚ JHèx,B£­€ }¤€+€û¡¬Z`ù—°Š‹&ÖJ٠«ۀ”£Îà`tO°Àë¹þž<À’Ë,X¡“šðîTKGS–Ô!saVLP P”™G ,Ø …@0ÌÅ„ú¹óDAŒGóf.U@ŒW€m ·Ž¬¥(cÎ<ð;cBšO ‡Ó‰ùVvFVÕ‚)goòÇåVˆª´ÑM䀻¶r¤ 1›AQCÒ†p4Š>Æ‚KäúA‚š:Öé¤~1ú ’™tfMÐŽÁô½3e>©)sÒYßu?¶€RÜù¿` Îdžüà¼ÑG‚îàø YsóÑã¡%LŸņÂàÊH¾ƒd£—óeë“çô~¥\˜Ï‚+J|8Äo41H‘æ¨älßJ­öÇK˜[„ð6XÒ± áZ|Oh”9À+àCR‚À,}xÛñòDŽ…Ž‘†a€W âE!#­Ué(8R¯1BìhLƒø£‘" C”vÖ¶³fnF‡·þ~¶²÷tk!tF&õR© éÙ9¸€xS;ÊÄ#ç÷Eò I'Ö5BÇ2Ò¤ ¤}Þ²Õ4®ÚhG×’òèÍùIj’Þ¨\-rªÇV  £1÷¤öÑκWqÍa %2k<¶Ȭñö¢Aá=Ì­=2,fïíÚ)Yu¤ä@ìåyL'f!zÀÓ"³I'dÂÉ+w8fJß{Š7‡Õ¿Ë\=²Iïw¾÷xŽ‹aR‡ô=ëÚQ},ѵ(Ax[ºk÷XÚØŠyO°bpžÅ”E—¥¶®Ãz! Ij¬.ƒ°|ôxdX¯>|;Å9"Ñ!™ç!* ¸j¤vÄU¾©•Æ |ûAàè¥ü™$ºy8!îã¹7öDôm@ìQ4úv´÷p´aR ƒÁÛ9æ%*[}~he]s0²+/dO WyDjQ¹‡%Ž$®ñ¹Š÷¼Iw*„¥ÐÁëzéZÙ ’Túæ¯{£ÜìæI›åH+Œ)6fFƒõTé9°ô–K+3’p?)sI¦D/%úcˆzÊÍ(­äqgcNqé%…ª(Mólý;YT¶Š'•xáÚémˆWãC޲.NæCSO¶Ë·Ëßͱn Ȳ<½TRžßµB¥=v‹Ã;_¥9JÙ¨º–—Oé›Qôõíçû¿«Ó׊Ûo›¦tæ8½Ó~çf%çOÕ7£Ô·sürøð]Øt+†âDÜ;’Ô…1R6žQßëåØããÅ™‰ñ+l¶Ã&é"_ˆ Š'ÙÖ ô·£xy3Ê);¥ì)ÁVŸb‚·S¢Ž$s8ë`ú mFµ£¬b¨ðV!²8þ(ñS ã§,}ᘻ~R „ùKÚ×-Ò’»ã ‚îWˆRŒ X’DE雞ÂcI¯XÀq[¬ZØf{èÛ}ÂËZ5¡$)<"mJªÄ›É$["…)e𬹠,z‡ùV¶î”“I -¢(¹S̹2_Aý’.lÀ¾ ·ñt´Sk6íNSôrª¬ÃB ÌFÞ¢ñõ OÒ•¡³t¥s6E8ªJ<‚-V7°Wo¤ÚÜÞ^.@õÜÕ #õ8g„Ô¨GópÔçK°Þnˆ3Hóà8,Η D‚£v(/÷šî®»éžHL̤ÆÐáeÁDZe”—kDóu ÞŒ’˜×”—ËOóu HšT’pÓùXBj£ú;Ò-ÌÙ X*á 8ܨÛ¥‰i1²R¢gŒSJ{#޼ʄÍ3,]øj'fÜJ\Š’¸ð\Vjh˜²¥b±LØ®=R™á.®l )·}×NMLvÂ6ïï’¸’!a­æ¶¢´ÈÎHb¨¾pÎÒÒÔÚÜÔÚÞ)¨uå$éŸÞq ΟÒ7£èë9†B€Zë;…µV£9Ô¨àü©úf”úvŽð…µ¹ !R˜pý;uÖK‘ŠÔ(ÄÅ!4Çàɇ£¤šÌ¯Ž|#otÏ“ŠŠ¡DA%}µÓ»gÕަ´µäÈæí6EÊ“¢tŒ¤$ÐŽRÑ(ñfBx™’"ãúåhIœbëÂ4O’ %›ç+â$‹Xý®6xSÉÁ$C˜‡¥WÖŽÓŽ¤üB Ò‚N¾±z¦­ÎŒ[”j!«dß®kŽŽÕ€6Ë­É-Þ­3·ªŒe–±œ{àÆq_¹)—m&ɉÙÁ…E¡FgA‡U’…—/ ¹âoå²ÛÕ}·ûWZߢ‘Áup!;Ò%䬧zÞêíÀ—›«Hö5ÉÊQÄFΣu9ŸÖMi\¹þiùù#cí"$Šm6|Úo)úà–•Íõ¿¾õi"G¬ìÓŽœF‚ó6u‘0'vÉêœl¬Ë Xý.ˆu¬ÕÚÂXHB¯„´Á wjÊ~§â®(<Îõù¡×ïØ” L}¨$…v·Ô¹a+nò±ÂªÅ}Ì¥*sV55´Ñ¹TʼnA%8é &ÊM>‰´½²y`{ëg¾Æê «b×øîÇs':¡O6ÆÆ6¯´ Ý*Wí(¦£ˆ HÑxæ¶Ê¬õÇHÜç‚c;êeº'q,+y âN®H{¾eÈ÷p´Þ?¬†Gs€’^ÓØëÓzûS¼´ÂÀ++>O}`†0©ï: [^ò”&[(s‹²{›ïPVÝ‘¡ÊÔQ‘M÷ŠÐ$Dæh=e=Ü[Û§~§£Lá^µaO¢qm,¬‡Ëñ{¢ÁQl›ÞنģÁïô\.mýª¯•àN¿·+m—#ZbqŽáI@•ˆ<{ÒÌAÚGDɽձÌr*GlÙw0Pj|HìÂu9&Ub/©™±c Áá)%‰®Þ4Çç¢e«¾êóLeïJÔGÙmlŸ+q­ §Ô`ñùðpí6 endstream endobj 2184 0 obj 4235 endobj 2188 0 obj [63 /XYZ 38.2500000 639.500000 0] endobj 2189 0 obj [63 /XYZ 38.2500000 639.500000 0] endobj 2190 0 obj [63 /XYZ 32.2500000 581.750000 0] endobj 2191 0 obj [63 /XYZ 31.5000000 582.500000 0] endobj 2187 0 obj << /Type /Page /Parent 2 0 R /Contents 2192 0 R /Resources 2194 0 R /Annots 2195 0 R /MediaBox [0 0 595 842] >> endobj 2194 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 2195 0 obj [ ] endobj 2192 0 obj << /Length 2193 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹½€ €w<CÃrrv³ ÙEœ=äïGÝ¢Ú3T”øu‘’ºµFâG|ë]Ūwüü÷Ã?;¼{þüŸÃî÷çÏOű.‹þ¿Ãé×w¯ÿA7G÷çCÝ”‡~yúzøúôééS÷ÿ_Ÿú>?ÿ¹ûÓÿúð§î?þú·ît?tú_žjUw¿ÿûü{[«îOÅå÷Ó¿ÿëé/¿;üzšqXÎmæíß¿«”ªÍi+}N©Î¿~ûá×§wýù£QZ[”5ö Z«ÿýÇÓOÝüÃìűµÝOW¶.nXGY{^É´¥šêИÑ:ç_2³«“[­ÒM~Þ¹4PŒnƒsK^liŠ:m™<—ÙSÀ¾Ò6ÝäçKÅ],œûØTî?øgnåæ´l«»e­j‰XE­Ï«ÔÝ…è¶8”¥è½x³ËÏmJlî~ßÒ Q¦RáÉåîÕTÝ_ú{­åA™<ÁµÖg¢K3÷yßÂq·Šç¼Ô¦P6FT„ù³ËÏÝštsÞ·4H†kÅ“kT‡®¥=Ýñé~˦ÑÝŸkãþ» bŽ|†˜¬Pó&—¿[Ôéø¼oq1ßß4œ[Ž€m§R$ãÊß&Op©ªiÒÍ}Úw®ŒçNK½¶#¯Bž|_Í.?·9+Ôiæ>ï[$ÃU&ÿ1 ÞHÿ/À=ð5ðá÷_žÞ}ìønWÕáËOÝÞÎKö¿}9Y.u÷·În¬º¿þxø}Q˜æ‡/??µÇJ—Ãû‘â{8Ò¢Uà G ¸Ž#/pä;À# BGUp68bð7ø<Ïp6 |?ø¶uüÍáu c[ï{Ó)sMVh%W0lUú胅¸ Àa±Ž€A‡fœ6¢ŽžUG´Gš!d­¨8¡Üˆ+vgPaêq.Î8£Ðygoao/ÔÌ!o¯¬.ŽŒõ«™qQÇŒÂ.G%Öq†òµQœëÈ‘dFö¼Ê5$üîÙøkIz.½3Ï›˜§.ó0Ïl,rgžëfžë`U¡vÆqã¼ ÁÐÁïOàÞ°IJ£,ņvƱ†×,UY pÆdq¬j53×(`€âo˜ÌpÂp7ýÞRù×rù|Ô{ïï †’hFÖîqÙ†ÇEä©Ï Þ%ÍeR~ʈú|_*³ÇÇbbìÔG&Ñ„ˆLÒUʧ%.“ð›X‹ ‘3¹¡Sa–´šwÙÖÞyš74°м±9¥á'¼ÿáMÌ«ûË j&4©V¿Úµ¬íh£ÎД=jõ÷´FßLØ®‰]¨©®ƒ¿©àþîÍ%×h©…³¢ÖxÎø¹²›!O±ôð( `S¼:X+=y€jº¸/ivS÷Š 'ã›m¯{z<.<ÖÕ ÷޳´Ë£ù ߣo\B~ÔlÞA wÐ TQ{ÞáAïÓ×ÝG¹à>gä#ڛÄ+ë8Š­ŽFiéµñ'ÅçÁ;`f3ðN0èi¸> ©ãΣá:/ð1BÇÙ<)ýINX´—CCSS¶’·$Œ¶@±I¾¢Ãžr±k´rZDE™D}\ur!ÕîZ#]kp­âgÛ^€æ˜Ò—„·‹ª™'ë×#LÊAŠéO¶ØD-’ñ2…¤‰B¶”ÇŽáÔØÌÃΩùyUTfâöòåQÇV1). Z”’›²õægà-Ÿi. ŒóG„EHV %ëZ«¢–ílÑ Ùù-• =ß¶êg 0*;Ee¢*;%+ð"òD#ãD~Ù×5Ë«vMjã¼WÍ¥’’pàÏ–‹<"ªîÉb"Nü:"YFƒb¬²ùUwÖYzLíÌ6)²ÊSÀ"\Ñ”TÇtˆugч?”f“é¶)±›8Å…yŤœ‰r¶6Ì{rÕº¤º Èöˆxò¡ÿa>´¼3n•f]ŒäYÄÍD¤A`œ_üf„Sqx‡iý"›æ-›WHDݘ¬(áþ>̘°ù mì5“sy]RåÀ…õÇù,1yÅþÁ¸·vZwd¬-Æ„í3t/õOî$óeÍYÞißDøŸ¨n»"ÜÄá9æ9Á[d|dóa/}yý£j®Žxt)óP´ñ^.ÎÄÓö6ÕÙÚT3N@æaå_>CŒ0°„³‚70¦ò5E¡#«mît×] Ý5éËÚ‘m—¶oq®×L©…¯|Dž+b½I1oÕÛáq„¼pw¹;ƒ¥f\Þ°â“ÑÛ3ø¹.mO(¼šê,d™QѲLåY&•­¤ ¡w‹2Y‹Lxi~Xß$ÃÒF“PIXÌ‹´;ã‹" b—">ìOA„‚#ZÙK¶XÍF;Òbd´½‘…ÝŠLö¬¨·D8H»Ac&ea_=’„‹C¶Ì9F¹±|“í’¹Ëí]noCnkí'Q_ã$Å{ã¹hF*殿̵Ê845?hÅlI6kŒ Ä<Œ¬B¤íUî/}ݪ¡=ÖP…¨cíÖËmîOT«QU˜÷è›Àl-šÍ¸LéæèCÎÀu†Ê8ã‘KC+È»²ƒ!WÛŽv0Tƹ²Î ú&°7ü „Þ›«Æ· |Òž ëcÛø·€á†×IÞNÊ9 Úoí¤> ®d†ÂüÆOÒÇ#÷}‘}¦÷FèZÂïEK&í&oS 7Õ je\ù*‡Ë¿Ò¿í c¨ÊæÊ-é›/oþ•€“H ‹©€‘é=Õ+P„£Ž`±û–2 çç²Ú)Ä´æ©Ïµ«Lqy¥q§0ܳwÙÁyàîk`¯²@G2Ü÷š%z¾k¢®Óyóܰn¦Ïý Gpûi¦÷’އ¯\Ýë°²õäÝF`gŒ¥¸'s 1¥ãøî™žÌx6x÷ÎÆ´E϶ëMÖ¼¬ªÉÓÉb†o@Nä¤Ô¦¼R·)OpOñ{ã<ø%þ÷b'8ÏFa ©6¬ :-˜o–—g„ž…¡³Qéˆ×Á%¯IÇ}#û™–Sª°“ûy9Ðð=–dÀθ3Xãó”poøvÄQ,ù—?ÏÃÈê~–?Ï=Ê6m&÷³óÛày°E‡íŒ}„ß-°7¸¶ vÉ¿nL”•ü9½ØÊêÉýÈŽ,/Ó…-ómê5½¬ªR¹qlq½d8¶8 ²âX““(/+Ö1 ¬°'3°ñÕ_°.£ƒ{ËŠm{à çÔùµjnÙéiZ÷¦Ù—»OoÕø–K³_õf´:´¹)äa¤õ6錉ÓåÒI1'Þ¨·I/´ð-,~ž@” £¶«/éÔ«×vëÇË2zmWãlŒ]Û]¾íÚnfm·½%We×v×MgkÖv1'ÞµÝÍÞÂâçY‡¶kÔMYµ]cn‰±n“+>¶ )u×v×€o»¶›WÛ5eöhÿ®íîÚnoSÛ ðâ…×òz£ðý,~“±ž€©ÓðÎ}dÝ#Ës¡{£Ú€¦(«õ­X²²À¿Ÿ•xš­dŽÙbÏ›µëmzˆXÚn½Þ@MzÏLº_¾ðÈaJ_\Z3QÀyv ßSºÝJ¶Œ­nÉ–Ùh]‚+>œD|9³îKTøÉÊš›²K¶É0mBcçwÈ–×eVÎʼ]5©Önh`ʲy{qª<­×ƒi©MSß«úϳWõŸ±Yá¢÷ —ogÓ,;SHÙ–u˜|˜²ûbÄ6ÕL^B’Ô…BÌÛ”>÷VX7§BáZù?ÚÂõ ÍûäB­i}¸$ïœ`[ã¯)JÍ1-4™^‹¢ÝC©î*¢m¹)^ÑO†`‹T'EQáN5‚%¦Y`€ýŽð›è4ãìžk=uà–}xæwefwyÝ!°Žl‹WbÄ7Ø,ÈÑ1dÛ4¯:Ó‹ZUØÊ“µ¹ؘëÄö{L“òñfñôJS*n\—ß ô:²9œ@J#}ñÎ$&Ó¹R²SøŽ-w­åÐyM¹{2xæê&'^œµ~<¬Ôé—5×ïô RN*¹)÷ÙÍÛ}âÔ²ÚeÀ;‡%$RÜ–“ra-Œiå‰å*£¹mI]£ 1¿W¡,¨)ûã:}C±§„¡u¦ë5^‡9Â.4"x0ž1µ0x B¦SÆ„â²[Ï—na1 `4ɨ}/aé¤2dìFÂL¤BJŒ–à"BkÕ}µzœçTa„ð|£íkÞG2‘À˜˜Ólån¥˜¯ZpICÃáe¬‹ Ýã-1†Ë½¹uÓ™j$6#°_XÝ#bÿyÜ„ª®Ö!“ÁM¨k;Û#“D-½FÈý5ªbØB@øˆr¼Y3eÄyå2&§ü m¢¼ Ù'ìï!À.+ȱ7LXàa4šïPÀ€Ä GL/hK,·’Ëb]ZŸÈ÷¤ÊÅ *3¤N»|·+¼2 ôÈ&AÝ›ýɨ«„‚Éä<‰¸z)ž¨åà G¡n¬j0ND¯ì:²,:pX,; r"'ZZ‘ƒˆ+ÎéN/9K­}‘4ß`+ŒOLÔ ¹»W8ó%„µp³uSOQ29ÏeM)&@N!­¬òþ¸ˆ.Ì1re 3¼_ £#Ö÷½Ù ¶„]2s©Ã5Oï™ÿRöV” uŽb¡új. ŠƒæXWÀlZšh¢È ^¯ùˆHÙÔ$\k¥ž$CÊç‘Ö•}Š(+)“<,– N§”ÈõKDPÆà£á‰>F•ÍL‰ÉêØ¤™*‡óÀ½©[í ¬³ÄTø T,Âq{XgÆ­“R¼¸‡%¯ä S#ÆyêE&‚›­:“ïÚ/Á$é˪¼”•´ÎÔac<²Xaö‡pÖÛ^ô(JöͺKy6!Z`BØg»Z MZÃ"¬ ›±ùI] ¥z7 ÞD•žTx×DÊ$.æ!vÀÌÜfÁð‚¹³ÔYÜ%[áȺzÊQO„%Øi ¯‘±O£+,è’¿Ô“5nhÎÞî-Þ¹xѦ_x,ÎÊ{JûlÊÚãiPR²xm=x093Ø]IÉ7'k"¤sò½ˆ‘1òKeŒ—›¥ÌCo&¶(ºûz›Ùêf,e¹fsúŒ Ù¼²ÃL%¬W:^,Œàv$~é€e¾ž´".gP¶1—¾ƒØK)Ö"Â¨Û ;2áÕøŠ£àT7>|§0 O…¬3öoJ3¹Ÿ@DÜÅ“ ¬!Ït‰ ¬“ +’@4¾Ôú|!:¸:÷.i~m~ó@I+æ}9û­7­ºcWN­ºÀ4W}¢öÒ~ùnªË…löÇåûãr þ D‰…1±êLÅš„kþa³=¢¬ùü„vÙþÙÅ$8îöÃÁ If$1‘xÊ8G™bmÂâòaÜç ï œ‡)É$ƒÝ_ó ñ匮QÛmp`–Øh&F‡I á˜Ù¦;›à»;ˆZxsF,R:ûLû°ÓhǾöY8Â`ŸÍŠ}e•ûœBšû‹Ý‚²Ô´\”ޏo0`w*~5ŠÝêEMýÀ qß\-³×±¡BäúAU]üéI¢¾‚ø=&è£>×cB5qO@ôÑé¯îAA>ñ­c¦ØÝµ½}t'E)€¸ü†õUÌé«ñ§Âa Ì©®CáÙà7އ©¨£¿ ò²wús·ãá¢Ëø‹VXzÁÙ0 8’¿‚žÎdç\Ú Âd'×¢ÀŒ¯SMi@qß`ºÀ{ÃAè0ˆ‹Ñ®óºc‹¸uÑU?í< vLÌ1ù)øôô|ñ± endstream endobj 2193 0 obj 5569 endobj 2197 0 obj [64 /XYZ 32.2500000 433.250000 0] endobj 2198 0 obj [64 /XYZ 31.5000000 434 0] endobj 2196 0 obj << /Type /Page /Parent 2 0 R /Contents 2199 0 R /Resources 2201 0 R /Annots 2202 0 R /MediaBox [0 0 595 842] >> endobj 2201 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 2202 0 obj [ ] endobj 2199 0 obj << /Length 2200 0 R /Filter /FlateDecode >> stream xœí]K¯ãÆ•Þß_¡u€È¬'‹À`·» ‹ 7EÅÀ™L`ŒéÉ"?”D©¥¢¾"ëÓ©"Å«nØ}¯(ÖãÔ©ó~|÷‡Ÿþk÷?ÿÜ}÷ÃOÿ·ûyø÷‡ŸÞš}ëšÓŸÝáïï¯?Ða?ü¼kƒÛýüëÛ×Ý×·ÏoŸûÿ};½ðÓêú×NïþØÿ÷Ëî/í?üÛð¥Ã~}kUÛÿû¿Ç»Võ?5—ŸÿãíÏ¿Ûývñ<ݰ˜Ûßïµ²ö°Š‰™¿¾w©ŽÿùóooßöŸ5‰ÒV‡°SÖØê¬Þýÿ¿ý½ÿ®[$ËO ^Vlw¡NC7Îú2ºüyøF•;ë㺥Ar>k<¸Üö=îpYâ°¿Œ^à\­+&¶ŸÖ- ’á\ǃÎ/äô °|M¼øáËÛw?öÜ¢‡¤ß}ù{¿¶ã”§¾ô qý/½¶ÑËÒ_þ¶û¦1þ?w_~yëö^»ó OO”EO´ÎÇ|ž4à“ð‰O~„kƒ;ÕxÕp Ÿ˜Ot DÍéO_zÌ*ŽZ!ÒÕÁŠªióßQðüŸ0¾îïtOà ¤n->9xwSC0E§©Có±6xkƒó8‚>Mb¯Eé9±Í‰œ´þ<剜¨fï[Zwöp|böÎúÃ9O@Ù}?ƒ»áiÓaßëåÇ}#N¾ƒG³èÉ@ïÌ3ü½'Ä<‰ÑNæ,©…OñÀï¼£bë!Z,†…‚ç g¸¨notP3A`ˆ&VÏœ>ÄfYø)ü„¸ƒúôD©óK3`MÝ4‚ ¨1b`¤‚(“ ž˜AQ4Ã0q£1åÝ0ŒÅøÔ1~ã‰))Éͺ.bgÔ…-œ¹ÝxbC<‹5j6Á–%_‰·AÝaü³Ì^âSWóå{t[™%aàcìú>Þþê u”9Ïü"â%ÙOR÷~Z/¶º;_ ¬Û@¹ÁzWÔ°³5«LÃ<Ù˜Nˆ­-†°Ý¼žpOá&ëIbŒ!+¦!”Ýã(ÜOb˜öbzï)†(±¶' °ux¨ å¡Û!_|êŧ^O^<ô xh-Î x5¦–¡"?ôíFùዃ­ª¾ž<ë“?äø!žÇ0¼Ó¬ÑáÑ”ä ï´õ8˜kÜ4c°c¦øPcN`æFxÕ˜ÁUkxg±wÄ ˜¨¤'°NÜí¥WŸÝìŒTR‡:hû¢3VÀ1ÌŸ_ÔáEXê€#1ˆê9²ò­Æ7‹¡„Ô—X¾§µb0]{q]Ã(ÙhÆDDgFŽÂÀãø"B„YÁ ÂOq°Õü̧ŠIl‚ :NDÉe ¯l@’DÀm—06ãO|;1>@È&ð7¬…wLDg‚>àMÄuo9L3´Ç[9žBŸ²ª˜3*É6åÜ‚håUˆaHи"0h…£d‰ÈðĪ1-ÅW ¯š¨˜$ †×%Ø/¤qÖ ?IŒö±’®àÕÙ ;˜,ï0øj€"ØFÊwpÎÈÇ ¾¾>m%!X¸šxÂ(‘ ð%¶ž@ùÚŠL~Haí¨‹JHŒÄ-Å cª˜d˜å–d*ÞÏæ*”ª‰Y©D–ßPßaI“F+]~"71¡16ˆq6/‚'A/eÍWc’:_"6#Ùœ?ýãüëJä?Ö€5Š‘™¯ßæRcšîñ*¥µ‡ºD»_/¿»}ÍÎûÃ?­RçíλK•åᓟ߼Ý+ÕéÔå[æfs=Gÿýáwsxm¿­GsèÃ;ÑJúo…›QÂíÿxûð»BÜ, *’»Ý÷­éù#¢fæl1ÃK3žP¼‹±–o)ë„<È$ôçȹ£Œx¬Yb…èE•µZ5'„ Þ²fz\®ša(Á Àq™JHÊã]Å•°Nÿkƒ?bQ®ñ1zÇÆ-Y 7¿S` ¯·\Övñ¢¨Þd ê¾ê‰Ì€UO„™[Lj>ÈÄK‰ëºû ²Â.؈.V²‰g3pÏRy5³Q¡àï¹P ™`Ó6º¥\„U*B){Š2js»ö¬°öWñ‘Tb?j±Ö“gr»hQ)d5rz. ±jòŒOˆ¯D‘"E(Q üÝÜ¡­…Rű7v¦®iF€o †Ž,!L¤åM%)U"„þ2-}Õ}ËóÙn¿èÕöÎôE¯$ÉÄÏ:˜s&öP…âN†AÌRnßtæVÍÂ~î!œKŸÅÈ?+ÛœD 9ž\ –ÐÓªH'Ââ5Yï¿,3;ô»»ÅØÕ¨ ¯©Q:¾§²í1D,βο²bY§HÂìGdËF‚R#Ý™ôŽõk‡ø~ˆÆ*%î†a…†xký°Fbc-Á“˜¨ÚZÄÕ\úÓÎ5<ßÈÜ… ÙŒïºa,Ûè¤ë¨¬(l½mêÁ%½ÀÆÏ¬*w­*¹ëÖÄ»®Dm°I6Tñh;˜Xd‘MG›.2¢èµ–Á~C$Ûãw(ab¢Ö¢ºÜͶê9ÅsàÏÆ²ö²:lø*|é22fEK1¥µrçÛþðmα“U)ˆLt‘À*8 <„©‡i?(KXk9/W•mcÁüLÀm‚.ùº‰yFÞ"ˆ3ƒe ðÐΦcÈÔËÉI)ª•`¼â²?µ2 ú¤bäE½i [¦_o#pø•Q"•QR3¹Óçxä­•[Çó$¢9ñ\J‡Ø®9ÆŸéSFżâÀ^q`ǾË8°‡ê¹t­¾©çÒµæN=—®uQ­•Ã'q=—ã·ÌÍ(æzŽs=—®Uwê¹t½Ïь깿nF ·s”¯çÒµáöšdcâ?¨Ò%L‰™ D"ßdK­9PÉ|ÄÖ•ŒèIÙb0ŒË©¿j¥‡¡ U>™Ê#åtÑȱ„~d½‹=ÕŠÉK-VËìlÌÊWèìB ›9Ö…kÜë.ÞVþDE:¬¨âèâ†f#tyI/IàqI ljÏxK¤&”ÚFFA§‘|†Bk e SWÔQ´k†ú“eF¦Œ!÷2Ô:C‘¦«’lKŠŒjÎ1mš <-F%kE¢1„˜‡‰L°(ÙD‘p’ø«Âi8륢[Ì5æ\Ã…ê$K¸¸dê 6iOU„¹·SØ_Õ`×Sèv»g:¯&\8Ó¿Côqµ¸þ~‚ÏT¶3v”@8ŒUX§Å·DÖɆyØD8~žÓi˜ÀQ o †[¢§1\uâÎ1”O´ÚšC˜¢T V%F#œ­†QùŒ‚3ƒøð ð­'ê$(ÒUÝ‚GÜÊ® êÚ­Üÿ®ÇnåþS{ëò=~¹•Oß27£˜ë9·rÿ{3v+»¦íâ9úO"·òé[áf”p;Gq·r?W{¾&•º®¿ ˬ.Ž¢u„[[n&E˜¢EXB]á&:N …*‰’Xì(Ýp¶Sµd$ê7UkCP~²Ý&ó&Šú™Û˜raÖ á(a q‰HƆ“DD;ZWkäôœ <懩,×7Y´ó墮”Á$ì3ÍY6R k¤Äçùutd8ž¨‹ÄýWзB“˜m&¼‰ Î×õ÷Ϫt º­) Ëñ(¢Ø‹pÇk"±•Âb"Ï;AêDê-§×Øjhz‘0¾âcœjZxtL½ŒZHTß¡èÍ*•U||¬˜ÆáðÑò1 [dÂ9'ÿ@`Iáð%Ô…!ÈS @¨ÚÕ*ˆ–E Œ1xÕóÙUN93F6.ÖüRO@þ7 Üy=b3kÖVÊšGœÏ'º »Ù'â’‰ðL²¬_°=Õ{½Æ$ì•Ãy8œ†?`^Æl„Ï2žÒä†×†C¨&{æ®ààD& Mvmø´‰'‰µá*¼6&§óÝÀÍ/žªTk#"´dÇ¥BL‡@Ý;Öô±BT§¢ò­ž—)ݺô‰E8äD”&˜ÛTo^ŒçÔN+X£ôì+MÚK!Rñ&Üeïw´j#¸Sþ5F±i⌧Wê^‹C¾däZÓE‡G¹v—ÏìcB?pÓ´‹ÁŒh"ää!®¸bcbòŠS,üaM ÝÂѨ•®òsE‹-:Q««×šRÅykëílÞZ»¤HF‰/áPv&§l„ñ`zé1r€lþDPÕ6F¤zÿZzI:m£¶ÚmLÔ_ˆ7|oñ~G¤Î’Ö¶ÆÅj;Cpž€sÆ'uj=ƧâóúxÞ)ìÐV¹Ñõ-,JÏ7ëRц‹á­FÐÙ|sŽ'0ŸT°qÛGl܌܂#z¬†Ç›‘‹Á´¨)Ö‹{uaJeÕ5ó–´!åò ·hþò†Y%!÷„Š$ÅX²YE¥c¦»ƒN€K¶¨ˆés-Iù³•àUˇhWËS5±&(ü|Úõ@4rI˪îbYƒA¶z6~‰¦;¿jõ¬)Ur#&ðÄUÀçT©zD5¹WDºmýL+#ù ŸÑ~]´¼ˆð‘Ê&¶3>&õx¥vÐâ©•‹uU‘ üJð.v#BF Ûg2ÖÈW§¯`±óþ̇OëVv¯U´LÑ`¦ý¯p¼ÇÔbg‚9eëº%Ж™ç*Óá¡¢§ªs7EOUçï=U]ˆ ’>‰‹ž¿enF1×sœ‹žªÎÞ)zª:3šÃŒŠž¿nF ·s”/zªu¦pµŠžf\ ”l*w5#?¹päK†WN´®dµ§µ*§m]7^Ì4Eµ@c 40—~ÎB­ª¥•=ÙÛùd ù=£Š¸Eáðí®U»mcõ°”XòjØi{?ètð¶;#¨¿‹xc@ùý ×\-ó{ôÎÀ¡ïÖÁцwÚ1ÁòðæQ]þ¼¶¡‰Ãw ^Á‰·û.ÄóÀÑë5ÅXˆLìÇÀU€£5¥I‹äãΞ…U5œßyÎàýÂåW]®G¶”l™YšD@ Å®F¨S$³Z¿Ç•JJ‰?\LÒˆO‰Æ{Dju¢¯{ñÀDëtò«u>š“Ê'a¬®ѯ™&T#YÆ%â¡Ýè!”vlcS SÒž1uáyDë%QÕªö•õÇáÔ ÓOˆñD´ ÕiXÀcŒâ—,”¯GÜ·’˜)âü«$”SêG­y6Vóv#ÙFPˆ£ÌqÔRae}æ£HÌ ™‰9lYµ5eÄ| ÅüIÏXyƒŸQ63˜À•ZËV r©z¶'Ó‚ñ—ª¸k0¬¦–è‚ ‹÷àÎÖLÿj¦srÂTBT¡›,mT烟<ÇÁ+_e=¶q·W/¯3<»Ä Á}'z©3}ª!ÆY¸ÓÕàb^y\XÆzØiLÒÓÆO¹Ò»3Öãõ¸˜(ž†ûŸc츨pÌÅ1n²ðss —XSƒ ç᳇ðM@ÞÖƒÈA:™Ä+üÓEYø24;G ¼©‰Ñ0`Fƒï±ˆ3°Bu`ÅŠé÷Þ`¬¨ y€¼s¯3)p&®}àLª5)ÀçˆeaFæ†bxDÛ)®Ã7ƒ99âÎP b]…‘ÀÄ:÷¬õܳ'“X­\ì:÷ä™' }IèQ„Þ¡ñ™àѰF59Lˆyð†‹®û¼²•±âãÌ 3eÓ qÍ÷L¶—ÖÛqéxW`ñhP’Æ ËjʤޘÕÜ êÎ@È'¬–„í8}Ø×V —˶Dã›ÁHS¸³ê5Ï“€5ÄÄ„?€±áU3˜°„Œ­uð6jÈ?„íkÏ ƒ¤l™«°ëx§'!¿ü“„ÌEX!žx<akp˜ë-.jüÎ:d»VUƱš¾Tß=ËJÛ¦»µ(^LD<úå S.•‘†Î¤ÝU‹ˆìÐU¸i§÷ÑÙ?iªhApÁãItkÕA$J PÕã–N=M”êaª¸ÔJðÀÄ ψ—ˆT.ÉÎÚ.¦i"å©ðÅ!’Ï„ƒ¼‰D Ó2î–he.ÙFiÂÍ[ÖÒ1MhÕ‹õKY¾}ô ·©fßkH·UÉFY.²5 pR%Sûz~G*‘zX }}Né)‘Ê[ÂBÌ‚•†»6ÖeÛ–QUPE°k%¦‰¦ÃS…,g/‹5§ZsÓ¢§âƯ2<…M/f¨]wek¨ë²®`R 0©?Á/qª¤hà„r\ÑÌ9ô7áæšzRg¥Î?¾Ò Q®V“_òEÐ.o¥QŸ©Ê &x¸RüVB³±¤]³ C­%'¿®RáĶ‹Nö ÞÄô`}ŒéÛ 4Ë×Ùb¢)„½€ï7G„×ú¬~V«Ì¢*¢ÊؘœÔr»Ì”M«–ÖµtuXÙ°”;±Œ=]$ηÒ1Y±z&JÕÌ0Q2Ü1#À÷eO)dO‘Éàe¢˜šÍx±LþÄTa¬E2õÀ?¿ÝºZ†N&*¸ZaÌZBÕ6’DRͧ‘j.;1#š0aO•¶´:Ýkë¢×FÂíì')f6Y'Ç«KëwÙ.*¸ S¹0Q;¶1M4y%byWÑHثLjãÆg‚«ŒÁÓJ´`Ãg‚m½Ì~ð pm4¢znÛÆ´®K4,†ûÁ«N4y•m3KœÏÊv{U½]<®´6ù¤ DôC-̯›Úõw_û%%Wüyê 3ô¸po;¦gç=ÓèW¸ÓööÞÝcͧ›ÒÞ‘þOj‡Þëc£Žñ]õã'ô~Я(¦‚‚ËG4™2Ü[ÛÃNG*ë .cÙÍ~[R3!eùñòý7Ørg ß4U•µõ« Æ"Üáç~Åçƒvù­°‡½b>"ˆÿ%à"ä€WGtz;çXÄ­q!Üh›°W§‹2I†ú¸¢¡»Ïoÿ×>€b endstream endobj 2200 0 obj 6098 endobj 2204 0 obj [65 /XYZ 31.5000000 638 0] endobj 2205 0 obj [65 /XYZ 38.2500000 446 0] endobj 2206 0 obj [65 /XYZ 32.2500000 637.250000 0] endobj 2207 0 obj [65 /XYZ 38.2500000 446 0] endobj 2208 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 679.250000 536.250000 693.500000 ] /Border [0 0 0] /Dest /#1c#17#e6_#0c#8f#86#cb#db#8b#17p#18#0e#b5#f1#f5.Q#f7 >> endobj 2209 0 obj << /Type /Annot /Subtype /Link /Rect [326.250000 666.500000 435 673.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions >> endobj 2203 0 obj << /Type /Page /Parent 2 0 R /Contents 2210 0 R /Resources 2212 0 R /Annots 2213 0 R /MediaBox [0 0 595 842] >> endobj 2212 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2213 0 obj [ 2208 0 R 2209 0 R ] endobj 2210 0 obj << /Length 2211 0 R /Filter /FlateDecode >> stream xœí]K¯ã¶ÞûWx] ñ!‰‚ó,ÐEÁ ÐEÑE‘4-‚$è4‹þýÚ–dßKé£Åχ”dk.ß±F|žÏóÍŸ¾ücÿ¯ß÷oÞùÏþ‡îóý—]q¨Ë¢ý³?ý|÷ò íÝïûÚ•û~Ý}ÛÛ}Þ}>þÿÛ®}áËû¿ûß^ïÿ|üïçýßþ~üòÇîþÁ¯»ZÕÇÏ_ΟM­Ž¿—ÏÓ÷ÿÞýõûßN#öÓu‹yý÷ï*£Ôy7fþ¶ëw©Î?¿ÿðÛîM»ÿ¨I”®´9~Xc÷ª±zÿßî~:Žß^«T]Ùº¸cžZŸ&Rú8‡nн9NæÏsþ]ÉmË:ÙØçuKƒD™J…?¸ªûç¦v§y«²:â”rû¤U+ÝK]ÉŸËeðg^»tøt^·0Dzt‚c ª+] ›¦”Îeð€oÊts^·0DúC…cËj]e2J½.øºpEº±OëNC©xlÁCÕ®jaSš!›¿:—Ñ@Þ©dü·]·4HúcŃ žkS4ݹÖò๠žôM•Žœ×- ‘þTáØr‡ê Ó¡¼vò§z]òÎh“lìóº¥AÒëpðÏƒà…´ß€›á·À‹ï¾îÞ|:jåGHVû¯?×vž²ýøzIyüËñ>híþëûï‹BÙ?î¿þ¼k•.ûÞzR4ðßÑñó<ÚGøäz¢ßÁTpíN?~=žkò3©L?ë‡E¬Çé¦Ä©ïãÏAC¼b°ÇçWqc)žGÕÕ”ªJ‚‚˜ý`~—cM¡EAF_f…\ ÃTcLÀÔ€OŸ*‹F[Y±Ô4wÈÞ€LÄÜCbæÒŒì¥öƒW€õ†¯B^Àe,÷Tü~ðªY®fìÍIg¥»ƒÎ˜'â?#SÔ„5(¬uA¼Ì¥#`ý%ðd•´ÉÐŒÁôŒ¡ƒO> ŒOÛ’\(°|rø|˜Ñ0` ÷³ÑÜÊi.4ªëMM Œùm>ˆÊêOÇ_ò“M­U=ÍåáøM•›¡Ü¼ù$ D¬*ïØ]gÓ˳RcÅgmÀ”¶h§t½YÈô‡UWå WbhÑ×\S¼~Ò±—±'-C°kÚˆÈëh=)*4ZÇHÍ¡´•«§=Á£uÌJ©þ%_dŒVõÁy0 :FꮃÄÆ¯^ÁAðƒ«ïT/7aøŽ“—£zý„Xl'ƒã¶×æB`ÇÌ ÚÀ嘆“1&°XŒÄ6ÿïà ÂS°|,†g+º ŠƒX8æ¯?¢°ø}rqS[OÞØöˆ”=h5•dT€ ?† P)ž„E†ÏÓ»ëôõ û1žNJL'øZ^™žçM€¹5¢«ö©Û(Ÿ;â5®sÇX5ò…qñ±¬Z%P¡5 0L¥²‹Åò K1Fí( eHcJO†pƒQ]Ëa,š¦ƒ;°Ø†3ø"QS ‡¨ ÞÐ „+–êC<«Mb¯8s¯—ìI dÕ4¾¦¦ó5e í1¶Î:«ŠCU«WŒ¹-þÞÂA ápÞÎi7Í9yÚ`i_~óËîK"PvV­²¸a<”­â6ðí9ñ¶,šô…}ùÅ ò©â¿!zÖ;”ÃX RcN‹¯Ñø&Æ\°1mbÜŠÐì12J_„ù ³t ?YÃaa ÍxÕŽ2;FDît ÈS<1¶¾†>ÊvùsÆJãsÇÍ9°ûb¹îç³ ö%’´'Æz¾:csOzû›j|4š=ê/—^•îòŸŒ –ÊLæ‚8 6Pn'\.¸¼‚c’'“jH&·²/&ä†.vjœ*Ec^ÏóŽÖnPéþÑuëï!;ƒ^æj§ Dø0/¯rÚ¿Øl¼*¯jt5™WEø8©,Ñ|8*ƒ`® Oaûèš2)½ùQ¹ vò. *—Ø“„W`5ä]œãjò œ:Õ ÷ì‡ÌmŒÁ,,+0×ða×åf‹lšÛ´dZX¦1‚ $[\ìvoš"vs™Z6;Ý‚Fér¢ü=&r„›© #IÛQQÐZÈ+Û—lÔÕW¬w_n—Y:ûÿ@Ÿy§ƒÜØh ­%-e÷Ê'8ZKÓZ 0¼seŒÖÝëÆV Ñ<%Õ‡Æù+€kSb…ØnH«ªé»X`_ Ègf’‡™»¡ 3Ž™Œ–ùù°DÆ\@PûP¢BÎ1‚0§rwDË €‚ï]Âñ²õH5>6‘‚e2º^¦:eÂ…·n–PT•Æx²ŠÚ5#C Õb¥"DÖiÉ„!‰Vº°X…u¨Fs&Ý%PJê£}Ü®ËZÛ¾‚ìü}cpÝóÀ ল} <‡è¤X5¬)mˆžNLš@'\9»Žpmqì>›½"mêÊ.†6 vOâŠæËq&ìˆ%j·c¬ÈEg þkXÝ_C¸žˆR:SÌA37LN%ªøë*•Ö,ðŠÈ¦'K¤22^Ö€’¿†¼%Ùò8™’à' WÀ€$€ßu2ˆÊdIlù`x Î… Ö0 ƒ¹hKd83Ál¹îzl!áX'Sœ€A9¦.Ó{Lw|SÆkÆ"jEdêD窌¡Þ,S²éb¥b"”3Ê|+H)™u^DQ|‘V¤j|t¡æ#}L) {‰ŠýsÖaWEW³ð…´\“‚k«÷ ÷ÊÞDaülüÎüL¯Í6’ûyЮ7›@xXÁšfÂ*=Sï|ƒˆˆB‘‰ `¬ sl[çü£_p˜Ñ4Ê”0 ªY„ªP¾}%"ÛNgÏZ¡òê°Ò ç±%Úé8²ÂÀרžnÎéÍ9ýýÊÓÉ[‰oO¤Ÿñ“À<¶mÆ6éºàåÆUŸˆ«¨OÎnüv{²qÕ)\U_âÂ6®úL\‡€ÑXóÅ+(q…ÆLv€Ò îÀÈ, æ—Fë䪺€£a.FÈc~ ñ<˜#á'D¢U5yíÓÎuÒ¸Kä~Šz¶‹Êµ¼Ùƒ9&´—IjNìĸ@˜n™Œ;ƒ°I2'Y+o®²cTR#aû<³C¦÷_OÌð‰`XÌUÚ`Ⱥ˜ób*58 Á}È¥Õžd9b\¬¢lE¶IÄ62×ÜK{í®lã#¾o½EO°¾xSË{ç]j¢¨UåÁcÑ.O&F-q@Øô:LÈz¢˜8Ùžö¹ÊÈ‹(ÍÅ{ Xdôs×Å5jù<,îvŸ+Í¿Ã̃í§ðï`Ëj¾Dÿº(ûºxóÛ§·"k-°2¶óUžÏ:y0ÀµÍ_¢¡VJ¿a\Üô T‘È9r rIÿ´6v¤lÑV[Ÿ—SLQ¢d¢LH¦CC¦ÛK,Sp*-¿³µ~~—D=Mi-®wÆ0–ËǰÑ2•.DËËvo¾Ã ˜øÂ\arÝWmjb¨K5Y(3î‚€{>ÓÓ­·Ô—u”Ë:Ux²LˆOnÈ\}.±€L6W²½y3ªW-|JÓŸpו¢8ø½º ”=èïð½Ów¥­ícïØ /ðRI;-näIßG"fÛ­­êOñº‚vžê`”ö(ÏóÖ÷Ò®ºS½Æ` Ñ<ÔÚ0¬?µøNKéõÁ ¯à}ü~ð ÆªO©¹Po÷¹¦ n¥9Sî ²ôE;f —m-Ó'[u W}j?²M$ ðúnåŠ>]r×¢ÜW  ÄÞ² ¤cMãɱ@8ÓpzpQF¢J¶r›þ?(ÏŸl,!mƒ¥ˆDhm’ZHq„Û`bÉû‘Õ§·“)•*›© «2íµñ9­õ’4œM(µëK-|"xo¸µH{³@õ´a„™-ãQµÑQvÁ%Ëb"*˜HFaÎCdƒ1†øn? B)˦¬ó^ÃÔ¼³gß0µék ™ÙMmÂŒT6꟯ś²§)½S¤ØÒìTRg&Â6Ì>Øí‘¡¥Ä™“ÔmK´¬pš!a²IÇ]²vGp]Y)B%ðãã—-î½J“úM®™P^Vºöäe€ƒÊh˜~ 8ä¦.+¨W)¤Ö•¾JàÐ’y.*Îtg>3çG¸ÆúW­-^8C¼°:M÷ðsgÊy‡_#êøžÀÑy^8!·ð†ˆ…k}jÂêƒrH>ʘXô‰“J˜5TÌÛD å4þã=!>æï*¸é²:BÓ¥™€W¹’£¦÷¾q¼,-'JYëɦãdÉÍ,´673`Œbøã™ÍU–+*…ñŒMOÖ`:SFPÙŠF¢² â‘5±Ì/²d»Kâµa∨õJتdÛÛSz|ƒ¦óø?eScâk‰€O º-ßvD+ß:ÁæÏùÜÜpRn¸\•%6«ÿv£OïÌStù/¤"£žÈ¦'DXˆ|óÌaÈËÔhŸÝcº‚/¬²mu–bÓIR×ø&•|Á˜UuSaeTY•/B1fʹÏŸ¶Ux¾3XÔÝ' ·æ“—Àh½ŠÈ¡{m~Y|„Â&«ˆç,rnTó¾q•,?À'L{B>A¬ û…Z ³6¬{a ·Ù“m™·äâÑDÛT ]‹µÿ˜@g×f˜2Of l¼(5bEð&ÀêRŸi¸ˆ)ˆ)©›"à‹ßÉÙtÀÔÕðÍÖ<‚á²2 ® ëi5å N+EÆH¬úOتK³,ÜdW4Ã7 1d”Ö˜;p>—fhÁ½Jªcš%çÔ¡l©ïÀ êI&éÐLD%g€GíÊMËbˆŠâ²ÅsNÎ^«Ü»`­IËmçsžp“èŸFÓ’Å a‰˜“Ê¢¹+Œ˜[kÂJµ»c¥e¹\½méPiﱌÈj@.@¤€1܆Ñ2°^0¿˜•ÛT÷Ø€ ä²Y÷àÌßp3€=øfÉ´•Ų®óHFë´]ÁþèïX:—® {^ [ùˆöÀøì×y»$E?–½xšÑ÷Xüæ×†d5¬¿,™K¬óvá{¡¬ʨåT6·Õ3ç]²ªî±e]©K$¡e=ÄÝ+°Xh$ÀÕ0Õ¬öÞ]5÷Øf(|Á: q‡ÆÞÃÀ<„¦µd锓g×ê YN®V›Ü±6TÇìû`ñhKçjuy 艸ڂµþeø9¨´~ר׳&…Ü!g{µBwÝ%‡µºbjš0‘ëƒ$¢ÖÀ§2v˜Ì‰r8[šÇ’¶#ÊEä®1tî8cÜÙ&Ðófþ Ýin¢h'Âä™]¢_dº¢1¼:}¯Cç<Á(1>½ˆd g\‚„“@9.7M¤…N«ºmÛП&OL%e≱ø'[©˜Ù‹äeëÈ$Ò‹p®žnLÀ4jp@J–+›¤eòÂáÊ“²V,·—ÑQþ¤©µsÜ„ «V˜# Šo‰V`ÀïäªP—£Yh)ûé/T?œ>´æTñ”D¦µoØ¡¸7ÓE<¢¤;Ášej߉i˜^„˜º™º]LSM|ؼ›Á@Y5·ÁñðUö¶2 °æjÌ<ŸE"EaÆuÖX[ÛƒUB^ŒZù|šIB±yÊáòäæ*ÕÃ…h{ž­Ï@¡eªÊºIáE*{›äÎ'¹‹—LýÕ¼˜PL6uå‹Éí#ÌAŸùÂ.êaX²¦ Ž·ÞQ2CGÌ6˜ áJÂE±7'%".‰ÞéúXúlõ!¦£à| çL‰Uûø>RvµÙ£G3Ýoú2Ò²Ó;²¯8-J•I¸LB7µóùdÆúáÍ%;õAÝÅ3æe“wLæ×cÊâ9³Aš¦OÅËv}xbÝ6WZÄ ß¶C–Ò3–žÚ=_ìlzq+ÉG.ݦÏß4~Š ~"Yu˜¶[²ÞŸ€õ‚1ŠcRÈ ßCªiEmË‚’9Dëx q¸‡ö9{ú¬hkÒdU–ü¼ù†syüK]ú§ÄûþR/K;ŽMIçôE\G5c¢˜)ƒ4{Z$%GX\NdÙ$x¬ ‚J¥–0ADØŠ—*Æð7Ý40ÜûÀ¾|©eKtŠ\Q_öÃyˆ2²Á€ƒƒ`Ò´WÀ´[ð“6çÃOóà†·³Óip¦ÉWàƒ@Ék¢À~ hs?ª-Ñx¡m¦uVà ·7¥^†ºK]iŒL°,†/QVýy¤Ä"Êý;U\汎BÀ*ÐHQ4ìº3M€•¾§-F®ÖóÈÇkYꔽ§]Åüí@žªŽSÕ=-!²µËz´6/Nøø³ÿv<ÊàI¾õ&X&Ýxš–9ꔾ°×}Ë®Âý˜¹§]w=bdiÍú Ïq4Cm¼>éjìëC—>1Ñc†’hsË€6¶¶OÝN¡û íuI\¬ê¶>Ø`‡hØvˆm¢#ÛPx4øNwQTQ[¯¯hË"Üé÷ãŠûƒ.ãZa/Ú­à²1´i÷dí÷“Ο«‚T:†8oêôð;îþ3ª wPíÆ¦V÷¤ãg·xÙþóîÿãC endstream endobj 2211 0 obj 5528 endobj 2215 0 obj [66 /XYZ 38.2500000 189.500000 0] endobj 2216 0 obj [66 /XYZ 38.2500000 370.250000 0] endobj 2217 0 obj [66 /XYZ 38.2500000 189.500000 0] endobj 2218 0 obj [66 /XYZ 38.2500000 370.250000 0] endobj 2214 0 obj << /Type /Page /Parent 2 0 R /Contents 2219 0 R /Resources 2221 0 R /Annots 2222 0 R /MediaBox [0 0 595 842] >> endobj 2221 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 2222 0 obj [ ] endobj 2219 0 obj << /Length 2220 0 R /Filter /FlateDecode >> stream xœí]ˮܸÝ߯èu€i‹¤^‚~È"€aYYžL‚Afgùý¨¯¤û t(ñt‘b«5ÆÌõ˜U*«ŠÅSUoþøåï§þvzóþËN߆Ÿï¿<ç¦*úN—_?¼üÝž‡ßŸš¶:}ûåáûéûÃç‡ÏÝ¿?ô|yÿçîwÿ;éÓŸº>ýõoÝþ8ü¥Ë_øå¡QM÷óß?m£ºßO?/þ¯‡¿üîôëeÆñu1¯ÿÿ‡º,ÚúBÅ›¿?Œ_©ýöíׇ7ý÷½DéV5ú¤JSž”-õé¿ÿxø©›œ½8ÛR©¦.›âŠ÷\Þ ÛÂ4Ý{áy3yÏã/‘Ù•üÜF›hs?Ò-ÍejåŸ\p]­zît?åY?Nõekã‰Ì…naŽŒ« ç\ÔªÔ=ošZž9O“G`|­âéGº…92.*œ[pQëÚÆ[Ô§É#0¾)Ëxs¡;Ң¹Ïm­›²*l ¿lÝó«Š`iŸ&°mO3<Ò-Ì‘q¡áÜ‚»×êq¨Rž;ϳ‹ÏmcúftK³d\V<¹ÜºZUÖñÖõÅìòsë*šÊï鎴®žÉ×ÕT㎪¦çª«ùó<»üÜUÍéîé–fɸ®xrÁu­lD=übvù¹›"šî鎵_ñä‚ëÚš6â~}ž]~nï ÛÓk¿âÉÅÖÕE¼£ì‹ÉÅYo í(;ÐåÔ3ûsÀ˜ŽþO@Dô»çÁw_Þ|R¥êøXŸ¾þÔ‘öøÊþÇ׎!U÷?ºU_<ý¾£Èüáôõç{®u5RØèwhÄÔh¤øG,|)ÊÇ‘_;®ÆæˆîÜ€þ­ªDôà‘² ÿî?£!çájá÷(â=øK‹pä#\a8›Á#6áÚw'~í«*_©È„¿¥¹‚¿sj(Ïnh™‡’µ'QP{⊩Î@#v¨Ì%¶ÖWHl2ÎCkËÈXñ6œ¶¯cî:©U·°ÂpMð çì=àÙòŠÎŸß ý9z, ¦,zbªÑ%5£úoêꑞgת'¦=·¶x=2,ÏÜÈûÇ‘ò\šò¼<ø™ÞVgÓmœW#ƒ Î<£ 8Ò« eÆéÖPÝÀ‘}þRÏ3ð{†Ùâ ¢ê,³øøL…w ÖØÇÚS€=#‚¶E›qÏéºuøîžÞã7çª¬Ûæ•ˆôú­½Je÷4Þ7x·SûSw”n%wî|‹ªÌKW°°ø`7,ÈgT($Öób6ÚÅT3;”™-ÕVeÖ”0ÌÚS:øta‚•ãN`EFð@}çA*m{e>œÜ_("bÁ<hœé=üÃk‹G&j”Yw†F4ãýTJJŒ‡KKZ ¢¹líÄsE‚1ØÓÀìö‘ I„ÞÔýˆRãük^ÌX"æ¸9Ýÿ„ß'lP¡ ô|:ÞJø=îªS–Ûëíý©€ÓËm:X Õ˜ùÄ"{ôÐz¹c>ÝsÔÂ>V ›ë;jOèØoŒö5Õ"sÕ[WÖ‹†2[«—!¤:³+˜Fhb‡tp ã“k:à:XÏžÆËCËíÏ¿±†§,ð”ÝfÌ@Æç¸+àsÆ ¯ÃÑ€C ¨ÐRÄ&Š{zh#x0Ñ2ó€%’p¢?=¢¥­Lí˜Úã +aLØ­÷MÊØ LRùQJ¢—o®KÝŽ[û¸/Æ3$ÃñåŒ<}Ÿ†×#Šâ@ʲy­&ç¾ai$ ¥u½ÌSŒìbPŠA‰ŸÁC²ÓáÌ’qSMh8 Ÿ1ÙxÄóhÏʱ}Ö!:Té®åª1²ªÒî7ìÓE‰(ª²©» |NÀ¾x@\šA‘¼s'ap‹Ø¡ÇwÐë5Ì¡Ÿp<$(¸>*顟v˜hÀÒaWBÉ4…;ÄÔ“¢à‚âò>cij1ªy¨æõBÔwN8(@,pbn™[‡T ·üq–÷ô ¹lÙÚâj˜Å ÞØÒø™Ò‚>1¥Äj¤Ú-Ì•ŸGòqPëæŸ€{Ê (Ä»5®õö|GŸ\;§ŒHW. á6uA#O-†6{Á™Â8žG˜ÈTÖ_š(ÎåÉY'âWDšÃhKÙ¸B;رæÂNƒAÇ}ÕGõ“å ×¥]<xâ`¢h9æ¤9ˆ„*ÏZ­>Sïíl(? v2 ѳ¨0xQô<~D8¸/=âsB!ÏN–ÀFzäÁ¥$剱)ƪ;‡OX>áá^·›ž¯gö¶gŽøKÞ_zÄ_6Ž¿,œ›æ 48ø™Å¹nÔëxsOŒªÎ…5¯½¢·ÐéÙ®ô8´ÂIÍŸó†˜BK ƒñ1ÿ²õ½˜ûf&#§¾”Îi«íky™SÊL QQCë1èX‰-`žûRüȉ)À.Áeañ3ŒÛŠŸ¹I·ÊSâÊN*S)ð¸HØ í2àvæXÁï凶om<޶‘(q°})ã“Éjû¬ëéd袬÷©#‘D9á K•˜JU¤oé@?¢h‹2|až¦¼+²ÕX>æ2Iž¶»2Ùf¯%Ž’µ]ÃÏ0ïÁú‰iWe9©ŒÙ§dż ~Ùn™GþlÞÕsóIŒ` ²½^½ÍD ¡lÛÆÙïGvÞž}ͰèuZ·zUh`Rf6 àÀŸ˜"w74îj[ûª­³#bU¹;+rù|‰Ú¾EÉdnÞRNÖß„¥*í¢ïR讲2Ùé®(ǽ˜Ø'Öšê¶7@Óg°g}«DÒh£Ü‰ÅðZ7Ù øaœÑaP§5ÎL‡áú’¢‰éÄÛ˜ ?rc­Ž­rHŽ×K{kuœ«9Q…vÛÛ“[s˜”RŠ~rö!®ðeá*TËZ†6ŒÉÄ·üx‡2ïÙ¾m4±Ú©ª°àå×ÛÚ˜ÒÝÖ<„7Atµ]Aæ¾ xMÎ`æ8M$•ï#ÒömQ¼nŸ²ÅÈYKmåèÇXDMÊÑ®½HðÎÚyç˜=ç¤awï¡De­eê‹\Ä0ÇÅË$0¦JÄM»Ì¹üI–U41"Ä+c°èë‹êyØ&{Ò`â;qa±Tì”hÀ¸eõx¢¾k¶{íÈŽ}×î'aiNÅb¯Ž¨4Íœ…äS,þ,×mÕZ¹Ò½OœzDaŠÖáaG·;7$ºnIÓj0¦a«KwïËv’JÕ NFÜS>öýõDç¦T/dsÎE"[ÂUÖ…Âä}ÉcËržˆjìkzv“5µSA–<À­Ï=+'O˜fµ:òvcIù‘·›ƒF1ø=8Kµ ñ̆óÿŠ„;ÝŒ9ÅÇN?vúŽíæ–;iQÁT6Ç^,Þ?ø=83g)`I,Â}ofµñ—â¬]ÕDÎÃõØ4~{Rv6ÒÝc´ÕýP¸^çþç1ýñ¥:k÷‚gH?œyF[b¶ð‹žR.·Än3Žhd½¹gÞ# †Ãs}6J¿>Ô‡çÚÆ¦AÀ/Å [vŽo½ð«zÅXÿTx•­s*vo¼²®=,QïGv5²(kM;^CÉä |†i•æé@‹ÃTø¦Y=Þrè>‰Œ•ÅrQÕàUÐ%[Ö=“E»C{ZSâ=ƒ×”.{Šy2´A ‘åŽÁòÆÌÆ Æ×xŸâ+b¢I*¥‰‰õa$¯§­)ñ ó=LsY¼{&!ð¬,ŸŽÿ²Þ .¿Œµ¼~cÚàz4>ÞMP«2xZÀb©Àº€žï-fŽË^S×– €ðUŸÀóÆ~`¯ê[Á” ¿óGÝY›QÊX’°G* rb¼>a;0ašÑêcgD’$WAhlì¹2ஜ÷YÎ|K±k)•y c-²oÉðbµr1»1 ðµ­ûÕiSc'ø›¨‹šæ‹™à¯&ƒ¨•R_êŠvt €Gi‘1“žìüüú'»€ŸÜ3x¼‰ íÚ=z2ýQÿ":Ü/À)mñžªzÄN`™Éê`U͘Ê]޵rø‰9xT”cÏŒjÇ‚&±…CÊT`'ÊÅeP¼ë&¡aTqÊ}hITœ§éTÄøö¥‰¶m2ã9ÝVªrŒÒNcÂíz=€õ_v,µXuà}ÊTl•P"h™–Y}ä×Ü0ì0Ň)^gŠ£ÔcöE«ZW×Ðw‡GÃ5ï¥å wÐ5âýÀ’1tË Ã÷G¸ÞAòP€/.DAΞ+èDc÷OJ¨G]© ‡8t€óžD‰¸.Ñi¡v„±ï4¸$ËÂ{†©I%KÁŽÀ“ W7 S-L$"!Û79ºŸÊ=žx.^¦–Ãqi´›²ID· Ï{˜ ¦§•«¨Û㠨zpC‘í•rLCg[ÇÒ1ž¡ÆâuT—ƒ¸Å¢˜Ÿ0ÄŠ‰‘3›Ñp"…À•7ô¼üø™Qî7Ùd3YKãõ÷zèßÝ5ÝJ9GqcÞÕ•k×îGûÞ¦ª×›ñ+\7Oí~2¨p+5úÏD´[¡]õb×Vî)˜«V k8{êeãŠÐ¸îóÝÔ±.ÄÂUPMãH²ç zÒœÍÄPàšãpå1ß=²ßã©¡ž*ä×>÷1JÕµû(„R¦Ò©˜ôÑ܅ݳÍñ/;D¹@êâÞVYŠíÞ[—ÅÌô´ÃÃÈ„=»Ÿ´©õ Ęۈ€’Ö Š+wͶ/.͜ζZ0˜I*À³1QÍD©·‰#¦û8ÄÂ\Q ã‰s#Ã’|0²øs‡0u¡ä]9ß1ÃMé˜Tª†DÜ<ëÄZâ`‘M–ÃQ†=°mÔNBè\O©1¦'Q~ÚƒÙÃø;Ù÷ˆ×G´0Fô2ø`Y¬cª‚|¯6npWÛ3B ÛsÆñç¼·äi4¾u\¶¹oXIB©-ž@½Y åm¹óðcZ^¸Ô°è¾¥²82ÖÙ ùòŽáö îú2aó [¹‹‡”ÖÂÞ¦úМbZý$ZÓÛÔÞ·§!½ÀsY‡‘í1€)‘U¼v¿aŸ*>fÙíÊ:<<ªN½¹%lçR‡§‰‹ vÔäÚ®&Wä” ášÜ ’ÓJWåÝ á¨Ç-U6ÉÐen e³j܃”b8:±ú©äûNTê*LC@ "ã]´¯ÑÓÖ^Z¼û©¾!¬Øü ! Â\¹9àJ·ñºŸƒ6Ûg„bÃ˸’霨¿h2Úr¹rK³›ìQ.½Œmß­÷îvÓ~.:ðú`^ãâÊ ƒ„dùæ)ðy“zÇ#!ø=˜6 7ÃÜÁ—˜pM1ÈÔó=˜,U˜xå˜ë*ˆ[÷ëô½3°^ûûyé/¬8e¶óy¯æ\¨Ëùâ¤Gû<´&›;Dô¡™ñØûµÓgÝ—˜ìûz:2@îô¹žTËPð`ø½Ç,]ŠÌÑöiøRtÄÂé›å3I$v,a0ùÀaSãû ךù …gƒÏ A}ú ±eîòûŽâq¡«ð…V8ö³tÊž›þ›Ì¹ÿóUk„×UÁÚ‰ƒ«1Ãojõð3íõkÔí¹/º±r±Í=è³%]vúüðkx  endstream endobj 2220 0 obj 4549 endobj 2224 0 obj [67 /XYZ 38.2500000 756.500000 0] endobj 2225 0 obj [67 /XYZ 38.2500000 268.250000 0] endobj 2226 0 obj [67 /XYZ 38.2500000 756.500000 0] endobj 2227 0 obj [67 /XYZ 38.2500000 268.250000 0] endobj 2223 0 obj << /Type /Page /Parent 2 0 R /Contents 2228 0 R /Resources 2230 0 R /Annots 2231 0 R /MediaBox [0 0 595 842] >> endobj 2230 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 2231 0 obj [ ] endobj 2228 0 obj << /Length 2229 0 R /Filter /FlateDecode >> stream xœí][Û¸~÷¯ðsuÄ‹n@Q ™d ô¡@}(úPd»-ÝEÓ}è߯mIžÊ%~>¤([lf2Sä¹ó\ßýñËß÷ÿümÿîéËößú¯O_vÅ¡.‹î¿ýéϯ ›Cÿý¾nÊý·_vß÷ßwŸwŸßuøòôçãwÿÛëýŸŽÿÿ¼ÿëߎ?ü±ÿ¥Ó/ü²«U}üúïó×¶VÇïŠË×ÓÏÿµûËïö¿žV^×oæí¿¨Ê¢¬O»˜xó÷ÝpJuþóÛ·_wïºó½D™B)»WÖÿj­Þÿ÷»ŸŽë«‡Ö*UW¶.nxO­O/*ŽË+Ý]^sþ#²¸’_û€hkŸ÷- e*å][©º`Sމçf輬.¿¶UM´µÏû–É€V¼ø¡©tmË¢mà÷7A¬Uñø²xt”UŒNûŽÄÀpmA®60ÚÈC§ŠÈd­-¢­}Þ·4H´âÅåðªŠæ#0ëËâò ?š#ÑA·ï8ÌŠ×DªjMmëVykÚxsÚ·4H´âÅñZV=tt[/«G€}sº8DZû¼oi xÅ‹ âµ­TD¼^V—‡½Ö:ž„?ï;^G‹Xo¤û ¸÷|ðÃ×Ý»ç#©Uû¯?7v~_÷åë/;{úÇñ‚iÛý×÷¿/ Sÿaÿõç]{¨«²Òåy{ÝÝžŸ4‡¦-Þ>)Êós(mÕÔož4Ýg^~ðtþ=XÓ¹@^žh¸ü§ó“ò`t£æ>©ˆÕðÞDhœ_UðĪ€»½/bá"p¿£'ñ¹<¶è‰‡vEßãÁ†:?Qf »—'~¦Ad‡AÌìaJõÞÅ:>~q=Ÿ0 bVÇËãcñ€ánÓ9F©q2C‰æ§î3J /šƒî3Ÿ¾beVªÚÑféÈ+FÆH€ÜÄT ni2"½9=Ÿl=ä„ÁÇûåUÇHTƒz1¤]Ù¨pØêXÊæTXX1B€°`…yÀÑ%ˆ×(—š!Åx,KˆJìA°áã½yv0¿ˆzN‰ÐUt®´g¬"Ý@Øa8Ì×oÔBCw<¥ŠCU«·:#€?díwykÂÏÅh<›C«œ¹;{E”¹FrÅs@¬£€è ó~ÂOøWeMXæ"Y ¡ó(K‡q¢Ë* B‡ã“zÓ"HNä]ðHn bæž™H 1@z‘ Í¿qQß[ÚVŽ‚£îÁøÔ„žé/‚§nöª½vjÝZ£­;ÀñÙùžFT^´ë–êƒW>ÓósÐjÞA w`/¦fkÞ"ä®Öߘ«#/»ÖhµÞCvm½§¿’Usæ¥y{Ã'-áÞð0¦v“ô´rh¯gòk'`àOÍÀC‰Ácâþ¤mõª<ª)5IØOÔýéq¢Á"i|‹ÍÕI¦ `™&ʪ£\é`:QÕ:A5†ë•'ý!®}æ#|b༃OôÞ" XÓÖ 'ÒQÅ}åÊ{‚,eÍ{ÎØKÂ8Û=v:þŒ¨Këp Ö‹'>DV“‰ÜU冸×Ô`gŽ¢uÐè+ÞÃÕº+=<ºÍ´Ã:0²ZÅ“g5|{Ÿ¿%Ü ŒsÙ\ª´7Þ[Q±¶ºq«lÔ×c 2a-¬r‰, S‡„½}‰°‰n}xK²i‹ 댑f`Ì&_©½$'ñ åèèçÙò_X^η‘zjŽ{ݬ˳5…£8®Ý覞¤Ù©ºTìÜç½øÊƒwÐÂÕšðXüøž‚x±p×ðI²½=¥µVpbèÜdšµð}Y¿®RüˆqŸ`*Õx5BZ˜áyRñ †AAp7–±úä,Ë1¬! 0Um2Éó!¡ ¨«Éýxh,w ×–L¡-"§&‚“¶¼ÉÊ N.ïC_ð1à­Çsy p¦u3Ç%|]‡ØîT¢Fä×S§‡a ÷AH@€ð4{®èL:#á>pÙ§ÊfgÒÍ)Ç|’²¹˜*©)]_<Ô%QÃ̸8' ®Ä.kí¢"DDÒ¬L;[ú& ĉ6”¡vÍ”KØ@LB=e7»¡¤vɺ}&UE6.JÔ…RÉpÁQC›#9PèÌô ¨pÃ`Ÿ_‘ÄÄ<ñ‡ê¨ liW*N%â|œº¸Œ¥°M\å…#|.j¬,¬Øü“ÿâÚу—­ŽjøÞµãCéÚ¡'[† Ë¥ràÜ{æ*)ÛˆiÅA(3ÊS…7‰„2ÕÓjÒ?áq:0¸Ÿ“ë!Q|P†¬s.ÄŽœýó)ê#O¥¶oéæš@Çq5[Í©ñäîàøŒhâ(µÅ™8ROÄ#Þ†(Tß%Í(ö÷áçÁpÓ8º_†ãÔ“}QÀÕ`'ûã'D <ç=ø¤ðjžh:¤QO^ÜÎò`2PrÎ*!]/ð`[ôràÁä9 7FR(Ìõ˜OžÃ°ÆÜÈŸ4µ`Íf-lÖÂê­ƒéBTÓb­çát,á{ê¡*,¹™†é€±¿<ÚsŠâ ­‡©ŠÑ¡›@´ö`³d8e,Ïj˜—äS‡“ÂþšÈË-Ûæ-ªÂ:ÁÉ6Z< kë@”uFHÀÓ,S¹½Ð¢éY9ÇÜ7îæÎ ƒˆÔLŽEsKaSξIÒ+ý&­aɉϟ‘%Üdñ†DÌÔ™yx+E…8SµŠÙÚ†P53#Õ°áfç?q{råÇÙ“‰¬Qç!)ãhÍ­/Ð5Ë-a.EUª·û¹ïö¶åoµ„‡n‘eƒ£#„—?Šÿê%¹3óêýª¹ô%JP½?½ŸZ×7ðú&‡69ÄžTa9ÄDª·>3Â’ó,¦ÔõKoíÌõÄÑ.ÏJO4ÅÍS`*ƒO˜ «-ªîå,mùMåž,¯[0 }„e$>)Îqá³Òð³Ö%=L\>ULa=LØ/©,{ìuÙXµqÆËg°5Dd26²g×Ãg9c!®­¿Š¬}JÕ ÖÔ–]ÊY¡˜3<’˜Ðg†±™ Îü­ê4ü| UmZØG—T6²¨çÑ›Â;x(û´UõÆ«°Œ‡ÏrÆB ®ÈÆo닳æ]$ëò…[8Êæþ,5&—É¡’^R%¹Iô[‘ìg˜eëu‘±‚‘¬où˜B« w^Ä-œˆ”´¥[ׯL¾WÖQgƒ‰Nçu6¿Ëhˆˆ•íy†Sß1,V)“–¯2KÓìWªÏCð Ýâ͆pMþófÃ*ò¼1GãŒdFŠöÌy–…HQc”!£)Rö_tmŸu%Õ{_´¤e+Ôš#ábÔZFï_ÉÔ1­SЬºÊ+«UÓ€ÚŠÄn‘*¶„<ÀÌAx†¼FÜŸmÕ§0_¢ëIÝ׃¿§GˆN™Ã}žîµ_…OV5U>U#ð &a,î#gô$ÃÕ§ÔŒŒÅÝÀ#‘ê!‚9<‚™ÀÅ0c^2.ѾD×Û?æ,¹ÆUyk˜Ð0ÑÍTUè¡ÄGWP~ŒÜóç4†ÝŒ!HLõY6'bZî„ø"ïì>Nõ/³¼–O<ãiëf”Cô\¶éT”~J1c¯Æ:깊xn•LÈ&‘+-DÚßY3Á±‹ˆQàX$‰Š>l±S!Ðù¡ÉdlÃ;v[3@ÊŽÍŽùÒ~yKh‹L~al¿%ÉŒ65¥£&—·Veò]E› ËšÖ©F–S ]1S1ºh%-œú8ßS!â0Ø2S±½–À™e˹›Y»aKõ|—íUÉÄ‚e{LíWUÕxðL´—ŽlQ®Ë7PoÀ¨al]ËÎzgöƨ:ìð&üe"š1qùe›È"9®ø¢âÁóc%²º*ÀŒ‘)Z>™AÔ À»Fð´æÞ¡ÍÈ::“¾Æˆ¯Å£’ò9ns‚¦´“Þiw‚ˆ‚®µÊtŒ»’0ö×:å‘Z¼“±ú¢ Kˆê­—0@zƒ*Ú8}ö¾¶>iNÍìÅ]~ðÞðyð{ ÜÖÙÿÄ` !ºª-O?â¤xožYº˜âE!Š9Ϧæd3ò0Ïá^MD÷CŸ¦ëÆ®”ںѽzÂLTØäú&×Y¹ž¨O—RõeÈèÔìÈQ ÆP[™,³ù}]‰jj<·1Ñ,¼5tÇIˆúIÏ% R]Qvwª€½l rȆ-kGïl¤îûÌ8†Ëô“I©^*ïÀ£w°ÌÅÞ] IDuã ˆ ç\rÍ$V$êéÄØË'ËR2}D‘LóÁ\aQíÇöÞëKš7öË0"˜Y`Ø[ÇøÁñŒE…gTÀ“Z8ÅÄÂ][èaö¦°ÏŒ„ÏÞàI=Óð¼kQÚÑØ?Mxy0~n˜zÉøÓÈ€{Ï8¸Zöø%ßORMåÊx.˜G3zN1Qº²×n\ûúÉÃLKY1×6—IÞó³•)¦çÛz8Ûòø6Áß3Ò@Änw‹WORÝ-d' ·á$´ìMÙn›œbsθ·œ‡¤ÜT77¥ç&iÆ\KUÈZ”ÌÌa¬…ñ{ðlo‹Òg²0S]‘±\O6)9¡Œ¶êÒjQoÅDÖ©­Õ[r ›] [oœ¨\=vÕ½lþ!s@7¿–éDH}†IY*ébùÂdý"'µ-K¨Þ¢yñi:.åz…$Ï&ê*"+q]ŠÆ°«qa˜Œ&béÈÈMÙú‡ŒÛ:{±Èöµ,Ü×I22¥ Lêòšò(©LåÅg¥êS{Cóç˜\jíè3™ž‰ó³åe»ôÊMíiöª½:À¯kYYªËü¾~jOqèÌÕi•=²dߣÏô‚+hµ>æÚgZ¸{aI7=þ®Ö]WT5Àýe­Ößî®í@£÷ô«:¥öÂ{K*Aˆ?Õ<½Å¼‚¸Âððœà ÂÃ0Äp‡«éÁ wzq#®ð{†2‹+ÔRÄx½ «´C¤_7…ÍÎÅ+UîÍð¥ªÑ滇¨–yÌоÑì %Ū.šC[Õ#ôz §?D†^D7Eåžm~Ç×d“K°ïOd sm¹ˆž« ׳/3©ÚoNúcê¨ÁÒ¸Ðo²º½ ;ZÌ×BµL]Õ@ëŒ'¨ ×õ&êÁ4Áó<›T—$œ]]RÚï®0&FàD*E9Ñ®ÓSš‰WûfÒzdSMˆDOq\¢‡J«i*'`e0¬D9£H˜.SÙiÜ¥J bÒ?=)fNðgR\U—ˆœqâYhÔHé0ÜÜ1%¶.)ö9cËEHó¸<ôÁ0|IûÆúD¶xÄS²‹!ŸPkÔ—$K†æ“ÙC‰ ôRq.oNÉ µ)oÀ} Ë­—§ŠLà[Úàë±Q™öFØîÂ4O4 ÷´-×Î@"zÂL%Ö/M±n'Ë<- Ñ–¸Ãs»ÀxÌ]&µz ÆåSØËØzÀ«åAÍ%‹Ã@;'Y÷¦ºÔýÈf429•‹ç)0“˜«ë±)QE’CÎ4±%P*LÖ"ã2®Ê‘¡ÌÈ]qžR!ÆXîÑÖ¶ŽÌ¾ÓIÌ*S¹zS¼hÑ£=©4L!äH3-‘“"–RPL}RÀèìÅæÎˆhŸáDö‚‡qBh™“ÄBMŒ`A¢b;ëJ&l?0˜)÷†$3¦ïƒ¢ÓG­1#<¢ˆI@•µ—º@‰¤n™¶É2mE†É wÖ`ªË2n¡|ª9xŒì#[‰Ÿ´“Àu×Te ÊÎD ѵñµ£qæ©Òa´ “ÈŒ(»QõHŒEÈÀ©XÅÈ¿¾qàICùçß¼=‹0ñÌ0;BzÌd¦žØµ,EÜS8l -|Â¥¥? *ö8øö×ONùœÖ`WGW’UQ»fÅâñ8J¦3rLÂ3B¿—ˆùU¢±Ä"Aº©²d†àhœwBäP1ù‰…Xõbà¦rÍÜíÊ<¨kj5užY÷8q…HšžL‹z iB$TÉJ]ÔG쾤³mÐ 7½d®<%¤¢¾›ú9…Ñ–‘èr‘µÇisÜfí¸ÝÜ‹BîÅã‹¡8 pø`&º¯ŠH£4lŽHª*]’H,Ñ(GêhùÅš’Ž %Ö+pЉí¥W`·ï+—yÊ%ÈÜy·ÇC·Û¬‡u…}©$ÔÅ9-<`·ú–f `ÂQEí—ß8*pU-­W•<»XrVÖmÉT†h)ÏÝ@YS{‹lˆfWRyÖ¢/YeÕâ©ËwÊj1=…jí+; ËcX2O˜øò“”»›hŒÎch#YÌ2]{ݶöíN¥â¾9÷…̹Ç#î]·u³.ÕôÀv~ɼg¥>мiÜzVv°2·t#ñŒÇÞúOvð-Õ ð]¾;J^Ý ößhñbíóÔ/Ì0`›«sŽæc¡N~®½¾X Y0=äê+6TçXÒ}vç½~ÒIÉjü¤ï £Õh¶œ“¡>¢÷˜)öÚÞžû“"WvÙ—-p³ÃàžÑ{BÃÕóørvå ¯?Ó›Ã*èè¯2ÇX‚;}Üñ€è2Ñ _Ô§¼½×Ȧî¯ÝÏgáãUAgf/Ž®À›ÂþLs;Žê¢9t£¦f"K¿ºÙLŠªÏûÏ»ÿÆ÷’u endstream endobj 2229 0 obj 5179 endobj 2233 0 obj [68 /XYZ 38.2500000 564.500000 0] endobj 2234 0 obj [68 /XYZ 38.2500000 564.500000 0] endobj 2232 0 obj << /Type /Page /Parent 2 0 R /Contents 2235 0 R /Resources 2237 0 R /Annots 2238 0 R /MediaBox [0 0 595 842] >> endobj 2237 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2238 0 obj [ ] endobj 2235 0 obj << /Length 2236 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷ò!‰`ØõÈ!ÀbÈÁÈ!XÇ ŒØÈćüý¨GÞ‘úcKŸŠlIMì7GT±Þ,VßýéËßÿüýøîéËŽ_Ûϧ/ur¹jþ9ž¾ûö SžÚß®Ì_=¼_ŸŸëÿ¾š¾<ý¥þíGsüsýï/ÇÿVùSûGç?øõà´«?ÿýúY9]ÿ¦úÏó÷ÿ:üõÇßÎ3v¯kyûÿß…2åŠo~9t«Ô¯?¿ýíð®Yÿ¬—hkT^uf³£®2süï??×ów³«S•iíŠÌ©ïq¦~‘®ŠzSÕ8/ŠÑ{^Df×âscŠPs7pK£DÛó¬¾ÉåèjŒ+ìTyÔw“ «=„b™3ÜÂi©Šç$jf²7¹“GN?yÄg¥ 7÷naŒtD…s 5·&œ¤ö“@|N7p’T8· Q]Ö1¼µòعÌ.?wPÿ¾Â-’ެxrAºV&o±ãàç2»øÜVUÁænà–FIGW<¹]­Î\ë×ߊ㾟=]­ f¶¸¥QÒÒÕ3¹ ]³ÎFUÉã' gmaÃÑõni”ttÅ“ ÒÕ™ÖJ9ù]ëeò¨wU8Uð ·0F:ªÂ¹‰Z–­‰ª±$~vyÌ×,oƒQõni”tdMþyÆ$æ({ñ<øáùðî“ÎtÉâøüs Ûë+›ç%yý?Ö¨šÛž:~¯”Îþx|þåP “wÞQ|¦„Ïâ=áÈhÄP{`+Ø lÁÏ5—§pYuðXˆ«R¼îOóñk0æ³xѪ\Àóæl¼:B,¤Ö6¥Î⑈Ҡ[@û<_/W¬¿Y±¿cj(48‚ç!gcí‰G°ÕÀ’Š¡Æ´ÏÛMè|«WÎ}E¾oZN†_Ôûù°)Lǵë—2[b»®€øõø„+¶êx¶uPØ(Û½úrðT˜L5Àäå[‘ÑêT8]º|D8ŸTeÏ©CÖÉN™mR2†ÊW›nè2òŸiW^(©š/Ne¥^Qt±óGTG›˜Ÿ¬)õÛ‘l2°x].Ã|q»Å¸ö Æ,^†ˆlùÁvX™‚ü)ö”gEù†S4|›g¥x=ï‡ÜE,CåpÄùÿ)^ñ ÙÀ|ŽÑ6FL/9Æ ¡gØ#‹‘›ÏBØàl­5š÷ÌFSÉù)¸e*ÝÐ4%æ—e~ý‘Ð@Í3Zw ,¿‘ùÄÔÀ²EÈIöCEK?"%f^J–w5B)®û€qݰNñôXfò'ÇL¢.ʃHæ„pSmÀ™,4¢ûªík7Rº¢YTž ¦ùqà’°iURtL¥ÔŒ|"Ù¬—°•±RÇšC6}9|Þ]–­¤H¦‘IGÌÙÄ{˜²N*pï&½mqÅxd%CeȇfE‹s%Rý:Òτ㳂&¥ ‹)^)ã‰zë”7#’5:ãv˜‘WCdF«þÿ0ÝCa¼Âé|n´Å®ce,Ȧ²6]¸…ÂÝoja®\òH—hÙËHà)m8ru‰Me7•Â~á–*2;‘-ÔÂg»GŒ{¹Ànm3ýœÙ÷EŽ:†´~Õ°a|§5VQîmwǰ6vÒp1#HÙÊ!Lm ÛôZ©m•,M¶Å,Þpξ}Þ¹÷&[—ÞlÛóÕ æèÚ´h›$ªçLÄT°²¿RÊ«IͦW ©žæ¿L] –{œ9Ø<`Þ!ò«p¶ s¹7îH%ÛNÙ̸aß2M“n>GŒ,hÎGCÚÛÁUœÕõ¬àòôªo}‹ç©¦-"ÝC#]cípwg9&Î4çÖ\Ñ¥ÏéÆ;£E„ƒo)“Š1ö¶ì9Ô„¶Ì8 Ý<8ÄS,µÒ$zHˆ8âöà!Šõ¯ú+á×¼¿Ùc$¢rî-[=|$¢ªŠ%~ö–íIŠD¤HÄlØR$B=V$Â*½¤»ÏÊ#¶fš«ÛéNc–‘ÕV²ÅÏÔå«¢#º<Þ°ÝŒªyò%õßI6¥¹oÍ׿P¶?’l®o+‘t×ßÿ<ÀjÓm’»Jè+¸'ÆI,8?ø^©è8cPøÞ¯Xë1×fà‘QjýZ¢–RucDUá)[vï<[&¬í~&Ï\!x÷*åC zާƒ{HƒçÜÀâyØ4Òµ%ëÌž´º€¾ÊHèÏ,¬®º\‘tfÑ`Äèò&…ҙź%5Y¨tfñ}:³¤!í’[k×~faòb]ØvùV0WÝΣî&ì–§[##w;ôü¬NñÿIP:›Kgs‘u~­K“l®H6×|Æ”Îæ8¼­DÒó®Vsgs™ê\_áÞ&w.ɈBÉ,ï"ikŽŒìÑ“Í\±K1Ì#Õ¢úÞ¼„ÃL1L/l)†©,†™ëE•)+Äå6_¶ól+˜ë»É¤]t¼¥ãD=Y…eýî»è=F¸Š¾GQ’³xѪ$g)ZEG‡Š¢á&ö¢Ý'EòØdºçOoËA¥¨¯´‘‚Gë¼pÅ} ‰1v(%Lº2æk¦›ºD«Y™œ{ye®Na* ˆ gæŽ+æ™·e»\…Õ.™™®]6í&†¼(I‹h$,Z×.‰´½Ÿ¡çDÚwíë®®Yµ˜pŸwÙ¢=Ï%;ðYب¶ßÌíˆX\EnœÃ×0u*„9õ@ zm%ɸàs6Yªÿʘ¡ú­ìŒ¥© X˜õl­ÜíºS}$›g,€{)Á½Ø˜¹÷×SÑË4Q%J°©k‰cp°“[‘gXêw͉Þ&ìy1³ß½Š˜ÑC›7ˆ\ÇIí•f°ìý@©b¦Þ¹¼?îÞg”àŽ‡IéÈèÑŽfÛy«ï$M+•¦tëÝÑ•¦Ë0voÅôÄý9®¹iÓ΂bk¾­œáÈ-ùf½x/ÍÏîutAõ<“=<)Z©FGLD„ÄÓ ¾çþ)(è0-äqgs¹Ç7V’¹}Ù,#ãQwï> ´å´‡Y&–R©L|fz܉âïH‹f›F)Ø œµMˆñCׯ‹CÞ6¯T5ÜÜ1ô‘»ÅÜyˆ¹qȸŒ@Rî>cEˆ­eD3¨>±²­ %+{"ê9ÈcÔa¤†Ù#/˜Ú%ÇJ(‹¾H¯áŸTeß×GòhD.ÈŒe§(‘µïøÊêa×fÔ$x-n^à[P‹¡ˆìôh$ä-¨™ª™T 1A‚±!‘±¼Nç7sfÀÂWNO?y NG˜ÃÑpS÷B)Y&YîÞ—Bìí2tOâ;vg>@w†!ö½*¿<ˆœqƒÄ­+1 [|Bmoñ–K"r<ÿÒúP•@²òë)òx9FÕ_H p&ñ´)Âyûl ‡Z}sôMãjVÞÎã´Q[óJ÷ØÚ±ê›ñ§ÖŽ-FÜ¢ £ïoA †c´"¦°g¶‡´{õÏñ¥f@/~¾õ¶úåÕàOí‘)}®ß;š>ü£¡?ÙHš»â‘5® 9ý:0ÒdÅx¤mgNmýàÈ\s²?¢÷Ø['×`ûÔ®•0âísvIA`u»ôÑ[ÖÀiRxÛ|eÏŸiÕŠžµôošµ° wþ½†¸#t>ŸÐoªomį±k7Í÷“h„éªaؽÝÌ\Á7E=üL¹œFN•'Ý,l±¬ùVŸÝÒeÇχÿ¯C¨¿ endstream endobj 2236 0 obj 3625 endobj 2240 0 obj [69 /XYZ 38.2500000 277.250000 0] endobj 2241 0 obj [69 /XYZ 38.2500000 277.250000 0] endobj 2239 0 obj << /Type /Page /Parent 2 0 R /Contents 2242 0 R /Resources 2244 0 R /Annots 2245 0 R /MediaBox [0 0 595 842] >> endobj 2244 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2245 0 obj [ ] endobj 2242 0 obj << /Length 2243 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯à9€Gì_@@^Kr h‚9N`ÄF6>ä$gwÈùšä7ÕÍæL{!¯´ÜiVW׳ëõá_ÿžýó·ìÃÓ×ÿdßúïO_ù±*òî¿ìôõÝûèúØÿ=«ê"ûöËá%{9|9|iÿÿrè>ðõéÏíßþ—éìOퟟ³¿þ­ýáý/~á—C¥ªöû¿_¿7•jÿ–Ÿ¿Ÿ~þ¯Ã_~—ýzZqx]Ìå¿¿+˦iNP̼ùå0ìR½~ýöí×Çnÿ«^¢Œiš:SÖØL5VgÿýÇá§výaõüØX¥ªÒVù ï©ôéEu‹_¥›<3U3yÏë—ÈêJ|m«Kãkíni”(S*÷ârçjM¡zì´Äqÿ¶ºüڅͽ­ý ·4Júsu,.x®¥ê1ßòè9/îõUîO¼Â-Œ‘áTáÚ‚‡Z5½(3¹õ€ùÆ› ,ò¦ôG1'¸¥Q2+^\î\ eë;ÆÈãþmuùµuíMwpK£¤?WÇâ‚çZ´dÓa'×òbøÝòâk—íÉz;ØW¸Åq2œìtõ/+VÁt?Fý‹ãƒß?>|VVµ¸,³çŸZà^_Ù}{n‘R´ÿ06W:{þ1û}ž+û‡ìùçCs,u1@8÷$×ð3%üÌð‰O>Ã'Ÿ$a3Oè‰nDa«×?qœO¡VëW³|Ú×ÒÞ)†Mc¨!l ®|„0¸þžàÓJò‰6ÈÛ¦ãŸOÏ­\ô.ÓŒºE¦ñ¸ ³»"2l×õ€…â>qœ”¸˜£ó:–¸8ÞƒwŠ9ËUøÄ¤F[c™ïX ÊüDZ1z „7U^ §w‡!uð±oY>3XÖ@nÂOfµm˜ÓÒå z Ÿð½q¶eíÐj Ên“µ‘ ¨1âSÀDHCÙ"qFDœ%vÌœ¡ÆšAÃ'¨]Ÿ•öÒ·òVwP²„~·ƒ²Zd¬!l[a)-²w@@Øïì`©ˆïy˜›3ÂV”õar|CǜܞõYY£‡»¡dH{QÂö²(le/k›l__”$lû¢òG·}À06ï¦).¥ÌÑèZµMPs,lYŸÒAÇ„\ y·éŽëcÝäåÅ“žaê·_ÍѯörèÚ‹Kø¸Zo'Õ –7jô«¶Ú­éòaÇVÑ•'“E( áòº{¢Ôþ‚óÂ;v CPC¤`Š© ìzäÂÖÀ÷`Ê„«9 €«­à ,õâc:7Œðœ&lä8lHðŽåñŽájB| `{˜f,KoPn>E¾jFp:x›áŸ eˆan©°c5¦ Ã?c°`Æh€J‘¥Õ€yh,`’M–yýQ€ƒÿŠºó_¨p6½­oÒ/í˜ô1y1r~Vû=Ô² «`7ùje*CÅGç8Tf5±»ò/Åœ›zÇHåDzR—V/6&ââP8ôЍ•³Âq¨ FÔ5`w©lÚ€Úa]co‹ñAVÛ]ëÔýŠE0Œ˜0 "IÖó¤øh¹LYc.aÌâ›Ì5+Ì@ =f°åã8/æÅÞÝŠ"×#½³F‡@à N æöbåù¢ý>¹H›­ A¿îLoð¬Ò‘v04«²-ÏÓþBÔÉ~ àBô1!SÛKxî'ò³Ëª\g£áµS±²O"ÂJåÔàÌ LU8b†qéZ´š_Ò0y+!³Ÿmnfá‘å&*/ˆÀ/C}!³¬¾¥”áa†Sñc|&8ŠOT#={S [ É1{G¸jâ3p*Ä¥á Œ:žöBÔHàK!Y\ËVì†Ì¿¶å>‹XÖÈR#BÙ%ôÂd«Ü÷‰QÆÞp`T´jÿÞt›ƒÞ’6Š ãCPýQ5·ètÁMŒ†ŸyœÛ(ŒáÛ¨d1Å€̧¡x!½QV£XŽÏýÑÔ³{HOÒ“ôä>Ÿ<Žoäè©¶ý~’ßF\Ô;½Co³PÕå[¯Áªn°¨†Ð™ù-޲&‰4D&qpZ|Èäh2U¡*0ü¦~:rÛt9Ò—Ÿ ÆìŠúN*©nÉä8Ï ão®†§™Ü¬P‰¿}k©ü}’qÌs õG¸Z'½•ŸPµ»£8ÝcG´€uöä|J«Gâ?%B?R¥AÄÕèTõ¡-Cß UYTYNÑf”Ç„“—ž&ÈTÌcœ`ûj"~ð¯ú5f6k@•0XšKÐ÷¨U-v„ ¥ë‹°<eaç”5µ<„eMÑúžÓñ¦ Wùa›öDz¢Påº^¼T¹Ò'˜«P py×(Ÿá³éE5Þ€È…Þ Fëã¸xŒ=¶¢gÞ £9NªÇÜ_=æ©qMoçÝÙlŽÇª[+Ë[êÖRÖpôBåmožªNX¶×à®Ê›ç›g¯ÈN=#zâ;¤·l'Ñ9Í‚WÃY2j\­í|DÞ*“Ó¥ ® ˆ¹j'TÍüìt†0š¿>ßpnŸ‰rj™w¡~®„)gÖsó6¦EòÜ=¯ßÓWºa|¼GTM9¦@þÖÇûå½LþöGFbZ²AWœ‰4P![&•kyjÓ“ÙqMLÜ¡‡¿P¤ƒ—_qoì#5Á§Æ«ÆØw·ÐPƒ‡¹D¥¢wD¾)Ó™•Ú©D{È”£h+]R˜´"ÆR$®Ù{r9åÂÍh™(‹hx:XWïª.qWo¹ÊJ+‚•(Ãby~¾Ç¥$›M¹Sþv¸à¾ˆÆØ#5@7dQûì/®ÍHRø_Îu”‹Í¨·í àRÏî›N9"µ./©C*ʈ¯˜eãA8ͬ†#E¡f³qu³tDg ØŒlŸ(cn²çZ)ë&Xf‹ã3¢ó·ÏÔ‘$NuݸÃYæu9Ÿ'™¸VšÊÙ9¢ÝF¶çÚ˜'£32 æýÄ!Qšü\µ/jU˜³åà3fšçö6mÊÝ»×̹u´Ã`žÜlÎcé ÏCVãOëÚ™®} 9ŽÚ”Æ.å©6%j{{ŸVõãpúãTº„ª±Äi².]°Ec]†ÑzÅ0"D]ÆxšÊ ŸìÓß¼7ß‘‰q1Ö»¬Ùg´(ÉX×~˜ó èY¹¢ÙɳvrFºÅŽz?‘{ýEnŠyü&¯?yýI yBjÆ"½!–¶n§ÉëO^¿/‹4ŒÖ+ì ´œ´ž6QýilŸZ/ÝuÇp½Ï»nÇ^ºÕI:4´}+Eݼ£Q¡t}ùÊk#rµÚgÚLËT–Š–ëQÍp©Så„kΙâ?¢G”£Ì×18X^è —.áÑYLmÖŠÖÅD'‘vôŽb-üb¦îQ´%ÕŽI¶è™¨\Ýyï#¢ìñYþªôHÑy.uÔY|°²PµºD‘ó;…ÐS=9[él­ÚOȺÎÏÔ—Bè)xEj‰í÷{]«f¿)˜A0aŸ!ƒ˜y3Êã¤@ùÝÚat›©o å¤Ûœ°%Ý–Âáâú#æ')îäŸtC³gMYœ'¼l7êܵ¤c’us<⢲&´¼‘jñ¶@mÕ1¢“4²ÕZ¢9ó.F¢§þÔ"“40Û:˜f}l.I¦)$²#PBµ~~¯Õ˜)ÄÞ˜FȽqsm|“¸°| ¥Íz¤\É–ƒ“&E¿u=W>£›õ«õ–ýµÏ4è3ƒC¬§ñ\íÍã¹ÊZ£'ý!^ÃAWƒOð~zº5~úD¼§Ã[y4J(û3Ä[ÿžr ×%x+‰°©P¡›Ÿ ZÛŠkWìK÷pŸ>•^ÑŒp(lÐcRdX ÄØV‡…/gD§Ê9 †6S•:ñÌWE™â­{µ)®8Ía«ÌX2àKLæšn9ëR³Ñ7·œ""Ð]¬ÌødŒbÌ ÎÌH—}›F¯Ê\0ý%(ýöÃÙ]`š!ãÊŒã|øIÒ£Áô(µŽÕù@ʱ®Ç®ÇôÀ—GN¨{Ä]­2ªKÔ¹ ­_Tµ‡ž<Ò›ƒÍøj"Y[ZÑ:?›%›­£”ûu•QuH5à:TŸ7B\\ɺÁ LÖR²’STiUú8Nuòi]­@ý_ÞVj¤Ï"ÈMeÄÕ.93˜µ{g\¶½ìä’‘ŒNT9;+°±>͸§(Å»Þ> endobj 2251 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 2252 0 obj [ ] endobj 2249 0 obj << /Length 2250 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷Š‘`ØÙG€ v€Œ‚ulÈL|Èßz$õÎHú(éÉ–ºéÝãÖˆ,V‹õ滿|ùçñç?Žï>|ùÏñkûùáË¡8Ù²hþ9ž¾{ý…t§ö÷£uåñëo‡çãóáñðXÿ÷ùмðåÃßêßþw”Ç¿Öÿþzüáõ—?¶tþƒßVØúóß/Ÿ•õoÅåóüý/‡¿ÿéøûyÄnº˜·ÿÿ±•-ÎPLÌü|èV)^~þøúûá]³þE“UVºþÐJE¥åñ¿ÿ:üTß^œ*-„5º~ŸÇÊóDeQÏ!«z B–ƒ‰^~ |lSJkìîà8©£Ÿœ‘V—Eåàï«pæŠgÖD H7xb›²ŒÇHg¸c¤%5;Ü6Vš7Uøümðˆw2üÀ#QáØ‰z>¨^p£F€ÕعŒóV ª/p‡FIGV>ýxü¾(Ôç?Ÿ~=T'#ËÂæI!Ñaà;áŸ`>…„MAdçO„ƒóhø|¢ÞÃ'B†ñ&„ ™çÓSÍÛÑùÒªå>L{÷1°aÚÃ'™/'øÒBt–p ð Æ/Æ•‡öð‰„4p4üSî3ÿÛ„ÔR38ï buž]‡%„KJ¾@ {°ƒ9 ã •$µ„{HÈ}ºš„‡¡–‡Ç‰ %»¶ކ%s¶¤”ìÆ­ VÖž³ö¼!-ÅÙ¼|k›5î=ó²(L7ëÇ„³êÎ/’õ|ßîÞ†ž/Œšæó¬çg=?÷9y£z~ÞM>['å)( ±‚Dzu’­“íhtRÎ<Ù:ÉÖÉxYu>¾”Ö‰´}Ÿ­ßîÞ†u"+3Íç÷£Oeë$©u¢D¹â´Íë³6Ba¥×P8Ûٞص¦J•˜ÿo˳ ²kþ·kü)íU‰+̪eg£ekÉ'‡¶a-ií¦wäýèžÙZJªKk³&s"ëÅ[Ћ“e§Ý•–¡Y±3nÿ÷©1çcg”Eça §ÕV`J]4SšBEy**uînÐgDwrUñ‚Ÿ>BÇžXø¤!©>iÕôPè3ÈÈ ¥ƒËa¨rýý²Í‹ž´¢pd¥añ&š#@¨îÑ ´ä2ìàÑÞ÷™ÿ) (Œb‘Ç<˜*×;™0ÞÝX‚?ô—‡g$G"0G"ËaÅ m äû_xÄ2†¤Ï‹úS:Ṏ.4àQ˱1Ÿ¬àÞš¡ƒW v®±Ããã :“<®YlÁy443ðh#ÆqŸ0.`êâ›ø£€q^bÓcî… kÆ%‚¡fè“Ê觨 ev0.äSŽp½0!!¼JZ’s¯Ì£8EPn!ÂaÄð›g4Œ·A“4“’+hâ¡ðÕµJvÞMø’Þ‰v­ox?3ëÁÔ&NdÏ™ÃÈ[¬ƒæ}êÑqð;E0©:á¬7—jü6*!Š“±âìÌé 1{û°%]†Œcðæ¹-DçRû¦ÜvŒ¬Ú—fI³7mW۹宇·ØÝÜVGÜ­%(î²ë>j§œ_Ms¥|»€1ñÖ”£Æ’Ð')Þ*/R¢w&SóÇL/˜N.J8~Æo<ï@ØZ1:¦¦Uh4-—ãCÐn¥˜N'zÜÒf/‹5pŽ…Þ™øÜû2²­+Û0ô °Aú”o_@ ÂÈöø­áu!O}_®§rIL8#ó`ß>óNXÇ„ ›Ž¿.©ìK}ç„Ícð8j±l`bkwWþꩈ³…zêRçIA×F1Nööè6R‰(笩úr.Ç7Vé\L)®l]!¿#r«Ê>×0R>DnSçL)0a•R+À¬@”¬3 È’ðXˆÖ ž²n⸠ÕßeÜd;B`Âæ Œ|˜Ÿ¡.D厢“µÒ4¢¶º”¤7X¨ ÚÆÛ2*åI1ïÑ;²Z>šç ½Óv~«í†¨¯Þy¸=3¼M‚²'5à‘ÏË!ðÌS 'x´–GÌI5Ë™[ëz4Ë}è„°Dó0°‰`ÞÛ‰ {¥.WaC/‹'üNÌ©d%ÂÖf ¾šÞ´d¨¬hÓRÌ·ú=ÞìóÂ*áw N&ËŸP±pòPà†UA“U†> F»ÄÈ'|/aÅÁ' ö‘®Idª0YÅÚ¬©-Õ•«ûÏ@ÂaveŒ® å&» éQÆ@%i„Æ45Ã$¼VT3ÂDq¦œDºëŽq]âNT=Yçq‰ '¢ôÖé¨t¦‡É­™@Uÿ0ÂòtÞ Ú0{²gRDUF,%P*=7.#ˆ3ü³·*NÇ‚ aTg<ñÂÛ[ÅæQXÛ×àæ—“…mÑéqV‡í=?ší±g°™I(ETÃöT’0‘v†p·Hà1,Å ¶ [ÊCù›âœqBæ8ÝU ÓcÃ&&í©ýuÂöží-w„*7£iíLú<Ó%–)x¢ú8â®^"!í¥š„tYI‹Š¶\T¡q),vØgùˆ&Ф¨Î‹[¸”ÍzÍ—Y‘ 7àŒÕ1¹ïq¹œbzŠBñð¼Nˆ7MUê¾­8ÊÆ &îðôæÇe˜_˜>ÇAÏ=f¥Ìa±ƒ)¶`¯4a!©-ªjÅÞLun¥¢‰‡ÇöoƒöB¸´/¡Es}®Ø~ÕšËg·®çˆrÍ¢X·¿59¶ßº§õ•ÚÈ>±å NÚAœn³–˜¨ô Ì3O< îˆ5s¬ab0MÍœñvóx4fâÜ÷ÉËmn©¸:‡q«fwã³r¹‚ l(?0ÓÚ)(—§jüCÝÜ‚µ‚ 7™Q â$Ê @Ü’ÃÈÛ"]«*+ÕŸc2Y³q_ö#¾Ñ1î ö«³»ÔUogªÁûÓ¬Ò—)N›Mu}œ]Ç™”h³A‹sˆôdi0Mr6ø–³Á™Žׯeöì[Ìçx´°yctNq”ÙB Óøþñ.×Ã3­•ýiñeîǪ C½}—BŒ/éÖRãçðæë¥FHL±R$mõvÏ,ãß %ÕAËØÔ3R‡m0ñü—a[v$kÜ3X ¦qŽît]”Î>]¹ïغ4pê"VF=ÅÑ×7ƒP}Z¨Å¯YwUÿ¨º1…*W-ì°jA«6s¶dΖü>]vs¹Fà Ÿ„9,ºÜQÝø&ùe9 zU (g·x¡¾«ìíÖdVçLß<9S¥È™*ç'7˜©Rk²òo1뤔kòèSæeÔæa–ß«ä·GƒÂW â:KæºÀmH³&'ž©®«9&£ã]锥K¯Oé¸+qA+s’{ÞÁP.Y¥ÄÓ#ó?–û\c ®ŒßD­’)ÖÔ,¤ÔEŒ”og½6æÌ^ôMó-¸“ûÀl¡; !ãr/‡lB›1ÕKwëRÄŠUÕß¹wLƒEµªÊ|Ã&÷àf5 [¦¶Mså¿7v·ÛÊkר³›?.Wƒm JËi÷–ùF ]¨¤¯©Ê®È}ÛMou;¿ÇlÉ]ª>µ#§E‡È¥.d š¬ÅÔÏäôÍ8雸ìÖúKS…ž ÔFÔÛ£lOÒQûž¨Ï£.' Zì°ä&àë—,¸ˆ¹ù5ß+L…­® è쟬AÊ ¶¶xPiŠ ‰³*Nt•ÆžU•˜0©¾e“• ‚ªNQ°:åz•s‰ P´†=ζ^X ^êÅ—qMÁv7:Kò>ŒŽÄ\_Gp~²Ú{g.#¾‰SÌ®&s .ÕzgËæ} ÙùzŲÏo÷í°•Âö÷ßýuŽºK#ƒxe¢4r ¤›R‚5ÕisGä©åŒWAÀÍöÍ£¦â~c°}nWŠ˜knº¯+Ú¥ز6Eñ¹0² Gƒï´’A,Zú+£e¸óï5Ä¡Ë儨g6%ŸÆØÆ¶Û·ù~0]´u[11‚oŠzø·žF¶p'Ñ,ì ± ÿD¼Òö&EÕãññð×Û}a endstream endobj 2250 0 obj 3650 endobj 2254 0 obj [71 /XYZ 32.2500000 106.250000 0] endobj 2255 0 obj [71 /XYZ 31.5000000 107 0] endobj 2256 0 obj << /Type /Annot /Subtype /Link /Rect [468.750000 80 508.500000 86.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 2253 0 obj << /Type /Page /Parent 2 0 R /Contents 2257 0 R /Resources 2259 0 R /Annots 2260 0 R /MediaBox [0 0 595 842] >> endobj 2259 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2260 0 obj [ 2256 0 R ] endobj 2257 0 obj << /Length 2258 0 R /Filter /FlateDecode >> stream xœí]K¯ÛÆÞß_¡u(œ_@PÀ¹¶ tQÀ°.Š.Фi$AÝ,ú÷K‰”î©ïPóéÌÔ¸©Ks8s漟ßþéó?vÿú}÷íóçÿì~~þüTìë²èÿÙ~}óú¶ÙÞÕM¹ûá×§¯»¯OŸž>uÿÿõ©áóó_º?ýogwîþýy÷·¿w?üqøK‡¿ðëSmêî÷_Ž¿·µéþTœ?üüßOýÃî·ÃŠ§Ï ›¹üïoª¦õæ°‹™/}:ÒýþÃoOßöçúˆquÓØñÎïLëíî¿ÿ|ú©[ÿ´z±ïþª©+_w|§¶çÙ¶[¨Ìø;Ç_:««¯Ýe´µû}kƒÄ¸ÊÈ‹ëÝkcв‡Ž7>ìÏ«G¸×ÒÆÃ™ã¾µA2Ü«°¸â½Ö®îµõúð9¯®ûÖ:í^ûÖÉé^ñâz÷Úº² côïõÕêúkOiíã¾µA2Ü«°¸â½¾p³÷‘W¶•‹Æãû}ǺW¼ø¾©†àŸ¹O7‡ïÖ¶S×ìÿ¬°} XC ÿ Ð:¿ /~ÿåéÛÝŽº+¬v_~ê€rüdÿÛ—î.Êî?\Ýšr÷åÇÝwEá>þq÷åç§v_Ùò´ÃþIaÑSÁwÞÃ'>Á;ø ¹7‡wÐÂÕšðxüüNA|Çy¸kø$ÙÞžÓÀÚ¸ƒþ;¾tšJ7KM/-¼-Ë1Mñã †û>!&u²rn?ÂN1D¾'àKà‹Ã’áò˜º!/g¸bÒnÍ7Ì<$o"ª3ûð=úwèIY<®æ ö °†'-!Í`ÍH¸9¼7Ìå3//JˆU%ÆQ¸Œ‰˜×$Ô>šÂÜÃÜû„;µíåW£B®›ñE¿™ÆŸP¬¿`¿÷®G¼ Ÿ‡Ožá“òøÄíK_5‡gcbjnY¤ÇÓfß´ÅDc^ÚÜðW‹>6¾SÁ'“sM~aâ xПß$>s=ïÆGÇ&.n ã°+eÀåFÇÀ·!,?xÓ4‡(4{¾¸¼ÍY3â'0#²W×4cþ oÙöOŒ9Ýê-\”mã#*¶Ÿš |Ó«4ÆímŒ}Ì—)Êd˜¦U¸ka5æ!§Øâ˜åx.ÒmC^w/O0Q+ønuqoÉH§8vÿ›å­Œqa±á¿c¡1+8L0§ÆŠ96£ïMõ;Ê.hzØÐ†ß Æ4[WQ0Vp£«Qx wÐÖ˜¶¼ƒ†—#†<ár1wú;]n•ðî­9ëXÐу¹4墯÷ˆ±Ï'„ˆs󸨊qkôR2»± ‚'e(U€v0ððIJùhË{]ø ÂjXcÀªn$hŽÌBÓÒ¥ÚT L€„ ë0X…¥ X"pTWÒ1EÐ1ÖŒml< ©VµG¾Cè±–' tyȧ t¹"e ë†ýØyÿIRøTóÖñj|åÙâ[œO»¦¼ƒò;ÉVÌZ¬_ø;ðrV Ö Ÿ¡àûÅ”5¬?3|,‘ÿ[ׯÒãtm••ëéÞÞãßz;zºÅtÆÐ3ÖͰ5 Ï#¤^gÏL2όʼnӄ¿B×ûá!†àhŸpžU$gzWBB›ÌWf‰¯6ç³æB´¬Ý½-íŽÑXÌ¿Pà]g(SÉwéò L\s†Ô*Jcßž=áY¾gÎõ¶8W–ïY¾g*¡åûš³!RH×™Ʋôc¬«ò¸Ÿ—mâb ¢ÐC(×ÕB¡.GÀEˆxµ¹Ê¸¸êΡBáòR6ÍÉ#b¯5åR+.Cd Ô„=â2¢p•¢m¢$G í€*eæèøZˆjÞ!–v­T WœóFŒøÃ $Þñ%JübÊfÌ"6UbÂÏðÍ0\d­Ò±lëñ…fÿQuüˆŒ¡nƪ¯Q‹U53Úv;¢¿kÂ皉> ñ{k.iÖZôÎl‰ï5‰«›M ¿ƒß©àüÜÛ€R×xP E³ ‡5ÞÁ@¾Ô4f„-C™tP½ù`:˜b_ÕæâÔ˵Áýðj„.¶Éf%‰ÛX„µ·ÉÍ&×£ªÊ~Äp02† ?A .º– Õz‹i…¥aâ´ÂLWÆjǵޣw¾AøÎ v^{G­AÈŒ#´ûìé˜ã»cšéMv‡€Qî^6þ0¦igF•iŸ3´q½¢Î ŠŸ)÷Eë.áˆ{òõdiìéÑËÞªáVŠ{:ï½I:EÌ2W=Ó‰è·(ì'À¯‡ý¼„T ´ªÝša>!~— @…ÞYñ•£Ú„pñ‹£8&?áòûBxGoueî*€3jød¨œ¸ï€ºÑV]|ˆ¤ÍbPCQ¸l"ŽMIK Õˆ Œö$ì€0 „]JŒ2T•^T;GÆËE„p⋾Öm#êƒz±žÙ_žå ¦ûúX=ŽpÁ†²Ð†ÂÜÆ# ïÀœâXÓà{|„€Ç¢ï ß €ßÁ!á<=ZV§øÎ«'5ÜÞ5\ ’Ü»vDˆI€¼|Û8äÞA ;`` ܾææðÞ  Í™pLVÃþ,΃w:8ãG^+ïçÁމL-m³o“¡*@ŒÃ³ºt ©w)3 :EÂÏÈ$”N¢ŠXI¡ʸ©@›rÜ Æö±a¥UÅ‹õ[üa]ï%aŸë6ªB­„>ÁHêè·'PΘÉ"·P¢< ÿæFDäÓ¥+ÇRp1Òe|¢‹ãÕR±?&0ÊÀ~6°¤§5@ Ü÷wxˆnAH*o@5mLX-€lùÒ‚¨óvÂÅT¸S%3¨-£¢_|þML¨°ÉŠñ' ¾¥Ë'!„B‚Ȳ ßHÜ•`1¾ò /×-“Òeu=¸®$W¹“_Æ-;üDEÀQ1+¢pŠ•.®RFwΜ|3•»5b?8é5U•dd«cÕ47F7Ë«¢+·c'ÒNB2í0ü•FÕ'±æò†3n[jR"ãzÕ%i#Gë—j¨ŠÕÙÁ/ÀO5ýmzqºÅ©¨.°¸Ã[QŒUÕXSj˜,pŒÀô¡œ÷¾˜’ ©€JõTaR™S|ŒÐާ#µZï9ƒ¦=Ë•¸!¢.׿¬Ñ¡ù(õ/9DžCä·!ü†CäqûÓøÚŽÿcv«™P¶#ªôAbÌ ¡hH·' Ö@”³«ÔëSÖ Ñ±, ιÀáý0C©&&oFïÊd¥X¤/ ]£˜™Å¯IšHY9ª¨ŽêH ãÙÓàË+lô‰™ºu Iž¦°9•®g”O±•¹Y%etFe·vÚÜøn´N(=¶r5í«ÁP8µªÆ£Û`M§ËÀúDebª¹+T£©VZŒâ ûD(‡ñyÆ}8zÒíðãÕÚ­ÍOuªks¹ŸmêA“y𜋧º2»ÆÝš‰‰À³sÒƒV[óI Ü0}™Á^ˆÂLîMÒ‚ƒ³å–¿m‡;¾Cˆ¦œ{×§¹wE Ï Ÿ0ô\`z&¸0Uã23‘étŸùÅŸ–§gj†¾Õ©Ëà c53”àÂL Lsðæ(úÁT‚÷†ßRB€5>*ï]3Û´¾ŸFòÛ³×KUò//?²~«MgÂìËÅo{yèlS[8wÌ ‘Ø·€'r—±ù…ùUÄäI]é*ЂªlÓ•ï›–¡a2‹ ,Æ"Ô+u½A¾û:Š|°O\Ãþ¾„|fÙb¼Ôå(ª„S cçüöAãüñ±ËÂrÔåëʾ¹¬JÐ!8…²Åýý|Ë Ñ:¡¤¬ª7ÇÓÜÁòT›íwq Êö;ü$ÛïÂwœÚP‚¸wsžùÆŠu”Ìí´é9{+Å'Ù[Ç[™„ÛµÞžö£›¯AX¥ø†KìØÄDT™X+¤@/‰]ëúÉ(2ãÑ€\ß‚7B²'%¼ ØÎñðteèŠs—0t£eéú¼V¬Íeùþxò=JÌ1¶Póß,Ç#ÓÙVáFåÓòQrÊóžJ;%n[ðÖÃ] üC‡€gôpBÿJe á°Æ^!ü„±­ënÅZðªs_è¤Ô=šÁ*k2÷T/¥Á—¶¿-"‹ß#ÎÞ qYÀòtѶx©Ãgìtòª–…ë1òˆñLa•9ËCÔ笫44ãêÔ4Cè/Ë{;–·^×ì%JXµÛe•cW­Ã-Ž—ËëpI±¯>e\¬¢†½5ÆÍCnqþmñÉ&½©k–G›íIÑš2RÔÛn‹W‡PõñØOºb¯ø6³Ú˜ rÖ¼Á&c¢0ŒG˜Á^:¹êi ¯‹oDž“Aµ¸SNžFŠ×ó²:çHwÿhÚòòpË~Ú‚òÓ&“X꽓ðýP±S&Ï–©ìft)ü¯ÆTªg®¼Žèzk‹fËWÀU3VdY­ŽUÜ6™°fúÉÕ‰Úx-T'.Nõkög3=Á–õt7âØ‘Ö¾ ¹î/јSý©r; Ð#¥ñ{k.[ï[‹Þ™mþmœ_dJøüNŸàwàÞ»6E¡E«yk¼ƒiİҘ¶ ‚&Q88‰‚š­JŒÆÐ XÁó[ðp øáT/¨I5xÒ „ÁòÓ…[€« (óÖ†PÆuå›y±âºSr f1ó ˜9¸ÓIQ˜çÁ£ `Ôe aÞ> J@ƒ¹‘ÝwTbÆa(M$^*þL C2î/ u0ûaس¾… ŠâNn}ò‚›ÎN,‹(nšv,n°ºQ‘=¹¢<ü/„·/?yT’XYÅì «å*"—áÏŒ–Ì0U¢ÆWëB‡Ñ—xÔ Ì cY~z9þ„Âoc œ߯±üS†àaü©ôÁažªÍ¥Ó­§Sî‹Ö]~ç\­—Æž½Àï=äQÏ:PM²Ø †ïßù@Pûâ”õõdú:EŒ·k¡ÝòNp¡v© uè $¬ß. ugDÁÒkñj¤¶*ñS*_t«³¬Ú±„ݤwPÙ¿öf˜.¡³œ‡ rÎ[ÁpÄÜŠ1‘DE"gàF=?ÙmüB ÏPz!ófµ&ü4E56Q… &T\ûqL„Æ4d}mI8†Š žØÃ´–å­ean‡Dt.¸Ê™ï0˜ @ÙÓîCl–0ø¬\af!7ëZ‹ïTÖµºUÄT,f)C6P(‰~*4[0ÇV͈ …¨ðwL9Ë›[„ÅÉ8Ã)¿«‡ )nX¢Ûö7øHÙ|Úí, w¢Ú™i$½M0i éZoï«„!OµTfš 2;€2ƒ‘3ÌøJ¡å5nb ¡#ÈæN‰ÄN-²tÆúúò«QùêLúHYœòɳæãN§p—‰ä"‘DÙ”·$G¬º1Jª2&~¨R¼H‰$MK/ _[R ì.­“/–ëj{A;XVTÔ#)FÑ0Ñn€J±b ›rÓ Üý!±ÅSsÌ*ûQ×ëG-ËóˆÂìGݨç'ûQ·ìG-k?KÙúx8¶mÙºÙýd-ùNö×FÀØÊØË¯.鯭ªúòJ¯%ÿ}µ©bQ]çÞØl¡zœèú(o·y%žðDê4&LÔF/¼“[˜©Ã4<Ѹ8åF^+μšz ÜŒ–1lÈÖã=2Þ§TÍ7£f½õWK¨ú ªÚœœ¶:£†®ô÷PíÇÍ+(¼CïXødP ¯¬vªB«'º¶Zmk¦ý½3Ì<¿¶ëá;~ª¯íà>™ÛA|¥¥®Fzè¥eÕ¡<†Ðu݉°ÝY{vãª-üdy×í”Õ0]—îiQ9ZP@8y«{Ie@ª4ÆŒKG‚Ôñwtr¦?$æ1MñhjÆK¤ fÌáPÌx´·#Ç$l«%Öí v•K°˜i[DÛ aoÁPÞ©!0ŒCq]$S+SµFLÙJR¤¶ÍL‚ׄQ—·àøa•Üm(˱E·©œÌ€>#X‘YUbÝë›47Ùÿä&0(`j?FÛ­„4°MÜ™nûK3ÓK;ÂþúN5ìènÃ6ÅëŸüòôY íHLá°‡KŒXRï¶Ó޶CuåŸ(6ƒ !ï`j†Ý'pÓÕ§»d9Ÿüˆ¼ 'Yª É üUÛÀ < ¯–*Ç3ëwKŠìÄdòâ™2%fØ…n£¡Å²¸u'*ßzL¡ÒT#©¢[Âa­+šRx„ð Õa-©2Jfgìa¦,èQXÔã;Haô•‚ŒDLr›*L²1yYUÚ„ª´ä„mS Ô^$Ÿ:B_ÉÕ$Â~Éü¿ ¯c¢2Dîiª÷ÉË£†'kJ¿Í»_»¯ãùÚ§¹¿pãk®ò½î¬…9Ü̱-H¿o<ȹWë+gílOs¶_=鵯júdðÙiã¡sÞ5B}¾ãæôÚk{û8œ!'æx~Ì;°¾~¥³É€Øÿç•c¼|g`&èèõ Ú²wøs·ãÓE—ám°™‚áQ`hy0T©{mÆhƒG¹ãEƸ7û½»îª.š½éxqip̹àks> endobj 2261 0 obj << /Type /Page /Parent 2 0 R /Contents 2263 0 R /Resources 2265 0 R /Annots 2266 0 R /MediaBox [0 0 595 842] >> endobj 2265 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 2266 0 obj [ 2262 0 R ] endobj 2263 0 obj << /Length 2264 0 R /Filter /FlateDecode >> stream xœí]IãÆ¾ëWèÀÖ Ìâ C€Á4ƒ‘C0޶‘Žùû¡$Jj‘úЬ¯ŠEŠnxz¦Ù*V½÷êíË»?ýÇþ_¿ïß}üúŸý·öûǯ»ìPæÙù¿ýñë»·?ÐÕ¡ýû¾¬òý·_w¯û×Ý—Ý—æÏ×Ýù_?þµùÛÿözÿ—æÿŸ÷?ü½ùáí/á×]©Êæû/§ïu©š¿e×ïÇŸÿ{÷·?ì;®xy]»™ûWÔµÒÇ] ¼ùuw9¥:}ýþí·Ý»óù½^¢L]i»WÖ4ÔVïÿûÏÝOÍú—Õ³Cm•* [fÞSêë‹tÝÀÜ–½÷œ¾DVWÒkÛ,;ž>ÈÚí¾¥A¢L¡Ü‹‹áÕfJë:ÊÊÃþ¶ºüÚÚäÁÖ>í[$g¼ºÄ«ÉÊ3tÊB<×Å€ÞTáHæ´oaˆ\° ×Dê‰ÑaSçòÀ¹.𹮂­}Ú·0D.H…k "5¯²pH½.ðE`Žû„T¸¶ RK]œa“›¾Z6:×Õå!¯tŽ·Ÿö- ’ Zñârx=JïV n8š8쯫ÀkŽŸ÷- ’¯ýÅ¿x,‚7rþ °Ñ^üð²{÷¹ÙWÉbÿòS³·Ó+Ïß^äÍ?í½¹G/?îÿ˜eªúÓþåç]}(t~ÙáùIö=|ò =Qü ~ñß®ýw ¬ÿy0Ðð‰òßùpzòýKC?ÁqߨCûq<)á¹?@lÁ'ÓËgQ cêÔ?c Ŧ ƒ©¯ŽH}jólÔ‡¹Þ5¦Øúxê«™@}ü%&)ÕÜã»%‹aŒ-³¡Xº[òøÖ =‰{DÙ„Ó|£Ýæ )¼b Ù2"´k°›6£²«Ø:ƒ@™ƒÑ•j6tÎÙL­UvzC‚BŸ1ú ^­UsòËb=e¦êrw{°æ,¿=)Ðòº‚ŸÁ«Yô¤å~Äï)!ˆ à;vФ2þ/n…O5éÄŽå1Ⱦ§w sõ²÷Œ7KÐG~zb¹-ª2E9ŽÕÎ|G©Ër·k{ÑLû¡Oð{00jô…ÆÊŠc5Œl|91* „)Ⱥ"3¨€b'×EGîp ²,¶®Ç{ íW}mÿáå­! ´V+Ù_‘<†”[ "Û±k|Y°á.AÎ7ÇòãQêó>QoƒÃ&fœ}xoø3„C¢ÕYømQð3\_–A.Ò˨òŽÌ–2Œ×#†ÕûU¸{Š)ŠJiêb†Ùµ!ûÄ*`ÀŸX„Oã[N…ˆ˜R³øÄ86,«%âÀ°ËXÁ¹X!g|ew@xÄ10¿ë ˆj\VÕEOV­U×Ç´Ø]„ÑϘ84¾Ã«I$l‘*©Hcf{`ØRÿ²„µ=ÚcŸTn¡å´;‰àÀª „†”ÙÏÉ À´Éç6D³Êëž©„jè±¼bñL®>BÝs¨ÖŒ’*Fƒ¯¾Ñ=2$ ´˜àx: xÅLYvÎÖj+Q%Æfó@t5ÉË àÅ Æ™üZ>±¥\,4åb™T9­Ák)?Épâ|â€uFÜŸµµ²À; Š*¾s¸¸¡ Q,]áyü CÕcèÄJß°ê’KتÒ7°ÏÛø3LLÚeaÊñËëÞ³—°eŽ]„eN­6WÙ¬?F(Ø$•MCy:7À¢ÜrLn‰Ã;&ZÙØó;)ʾ1ˆ)oyø<Sv„£cŸRú³ñ‡MƒŒY¶c¯‘Ì”ý4[Ó:×yd}U1=8öæ›\¤'ZÑØV˜EÓXž-»0qón^ÂX·iÀ/‘W>ðK8”2ÆÆfar¥“Åϸ=¶øô¨/Ê0e2–0©zTîvoL³¤PæO­ú,LÙ› ¦úW˜NÓ´…©±L Lc['‰È›«ESìf°HߦÍüIÂü)³‹·ÊœÙΣ$Èž¦«¹Üø`%•-ÎCÔ£‚¯+éE:^}w$îâc0…ã¸ÊÓsíG˜„"3™ZÍ£ŠIÿnd ·$Ú¼öØ‘lŽi‰AöŒqMÛ–Bܤ Ã"˜@vÛÒÚ¯yÆø:aaÑ4“V9*›"°E³'›Nå-#|seg€&0†¥ÁV9et@ÒÃy°[lØ4M[u9[i «¨Tq¿Ÿ8oÍíÆ•nOˆLÿ˜t^•SF†mv¹«Áp{ü×–[—6ÅbM)¦tªÕ”1c1%Zm¦Ü‡{;ºùz¿Ï0ZÞ5ãì¥;оǃHÚxÔ›jë9n]µ ñ¥Gâð7æ"Lý)fÇï‰H¿*ÓùFI7韶å­2k‡éj™ºg¤;<¿~*ù¨²b­c·4†w@øa1].sÐðó衉ȌjŠ#¢V«T¦îß:3ïR¦¤æùiIáÞ'„>åÐè6åн"–‰ÉmT^¥u‡ëkœß:¢×ã„ñÓG™ÔVHó8{7ç׋™$Q|O |Bit³C'emãsìð³H_-•0- ëÍOáfaùcâeY)­òaJzž')ß™•q;‡.Ep;Y½~ãO®èéüå;JWõ=Ø•¾¤¼ÞÀ!2É!áIBéÔ0Ý̘Ü~ŸÉ\¸DFv4K¯[†R7}°c¾Ò™îžƒÚ|êäˆÂ¯XUB¶h?“M¨Â(¥š¯âª„HU;LkZj`'3Ë©œÃWŽŸM²Sbfº/ìøPŸ¡±Ÿ\ÌEw0]¡ŒŸP,'C°j¨Óz‡@T‹hLëø~å•Ì;òP ˜[$:ãpÐtVšê ±H&‡l›.•<²¤‚”gª#ŒEÝ¿—„»\¶Q­piv/Z:1ÒmŸ×\×gþþÁo"3à“ñÂClÒ#1Œ¿ÚAC¦±”Øö½ãèpØUk»(T`œñ…éºYOäº8} Ûé.^X~L&Vð3ä+4A#‘$sÃlmŒ-¤Ìm‡H„/±7>'OV1¦ÐJhýÞî±ìמÖ(1|ÁAøE:ñڒǨÄ_Ñ;HŸ>›cNG€h šƒœ’™1Õ´0EGÀ% Fb‹Œ›€qóö/S ÆÔá‰dŠ&;î#¤ðÞë‘ ËmqNá8çVaðDš£]g–E>–9ûsÂF¥²]¡Ë°ª\,l¶»lÆ]4VàáØ–M†`V›kä'“…Ñ>‰àÄ«Ô LŸF Sa)Yc;’Õ @V¼SÜKVýOE1 È@uYƒÄ|^aóy:ñÚ4åçñyZ¨ß {Gð®{C€™^ÌààHi=)fʼn8ÖÒËÇš{ r@ [™¼+aÖ¶·— JPk.Ci nH›;ÚBâV·¸"Ü5XŠhטEl¶nssCüZA®lxÓly½'f;}[NÞ1{Ë{ÇÈbÄnlO©Òð=Z”ŽÀ}=iè츗å˜[aªH¹º¾5â0ÜVÃ7àidƒ,JC6äE¹hþ@óÁØR‹åU!΂Eq›¬¯’ñ–Î_båÑBÔ‰áSeïá…dâ LLnýÀÈâe0-"÷v|E‘lßî€Ù–l3Õa±,¾‰­;g‹ÑTÌì¼ìJ£TL†ù*÷EÂú8з"£îV\ 0dÚ°Ò]"_rzËL4êI5ƒ˜]õv°$†<4R|¡ð‹g¬>¨jÓa#Ty¡·2Öžl¶‘0»š+íM¶ ”—h‘ãjó‰þÌ•cúv{4§¤8œlïPÑÊXüa]ös_b%z/{yÂjR¬a"¢–›Ïä:‘bqJ²½ºE0M™£çŒbû€™ˆÃÔ1- dËU³¢ÏgÐÖ™ª+Ø<ÆhÊ’€¬EàÑÈ„r½«0|‹Iu‡ÉóOF‘€ò©ð7¶Kãsf“OLgjFÿr¸œ†œk×{{Fšê#íû裰Y Á†¶ÙÛŸü²ûê¸Û˜‚î;–båÅ•*¿0L¦uF,O¨H³¢Þ¯m^©ÝËv¸ušRó3dÙ‡lá&¡õÍ×mr®i¯ÂÙ|LsSÿ8Ö‡d33GÄô 1w)¤è(ŠŽìX­¹ž^cÊ_©áCwœlàw@Æ™–òHêE¶z˜ÏÙ$ÊZhb›žZ+‘FÖdœ07. d­Ëª+Yç¬"U‘ÍôõúáJtË.‹¿ Ûo$PAØÖŠQˆÏŸŠòÁãvmm€ËºóÕUPÛÍvóWj¸'Ý[ޱpÆ'úQaÔñMz4îÆz.ÃjCÙÈF·¥Ò¼e«ñÇÇf–khÞ?TȂ̬¯y ޹v\%Ù¨ÙìɳŒ@Ž’‚‡êG*Ú­›Róq¶V’°öÊ`CÇ#rÈŒH¶ Ñcòà˜ÆŸ§W&«Øo#ëºJÆöÚu¸~Ðù*:ïZ—Œ¾2>H9î»ynX`·U,÷¬H.“GòìxQĶ‹àQ»6NÙ4”5Ù(ó‹(Ì5ÉúÓbEý—Ü]"à%Ó—lŸë- <*¶’å²¢)|I7²­ÕvÜwLŒãoþüÖ§Ó¤VÒ_Æh­]cÅëi,RìÀÃÓ7;g)sÙ“ŸOu·cRðÉLJ?ÉCcÉIK/±mÙb+v*Ž[q°°GŸßó(»ˆ HàkƒMbÙP’hÄ8ÈøÐîX]”£}8ŽønWj­$¥AïË ÑÍ×þµÁ¨á_†~aET'³6b0SÇü›½¾:è$Ð3¹—„ÏÙjÐ}Jh|ûä¬qý'í0 }hóÞ@[Á‹ý ½Ç ±‰G{ûÜž¥ aW°í’¶Šþ[î€5,CCáÕàgÚÛ§¼Ž^ÞÈ–%¸ãß›_û#Za€áI íZö€0T)¼V]²,ÓÎ.í ¾o®Ê¬:¨óïc::{Ë׆xÚþËîÿ›€8 endstream endobj 2264 0 obj 4352 endobj 2267 0 obj << /Type /Page /Parent 2 0 R /Contents 2268 0 R /Resources 2270 0 R /Annots 2271 0 R /MediaBox [0 0 595 842] >> endobj 2270 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 2271 0 obj [ ] endobj 2268 0 obj << /Length 2269 0 R /Filter /FlateDecode >> stream xœí]Mä¶½÷¯ès÷Ф¨ °»Þ C€Å.CC`Ç ŒØÈƇüý¨»ÕݳT?J|*R”FØ3M“T±X¬ÏWoþøùïÇþv|óþóŽ?ôßß>§Ú׎ç¯ï^þB7§þçcÝØã¿¾¿>>uÿýz¸~àóû?w?ýï¨êþýùø×¿u¿ü±ÿ£óür¨UÝ}ÿ÷å{[«î§âþýüûþò»ã¯çoÓõ‹ùöÿ¿«‹¦1çUŒÌüõp{Kuùúí‡_o®ï4‰*U]UÝ7SU[êãÿqø©ÿ6zqjKÕýIY3æ©õy¢Æté¶Èç¹|ÉŒ.?vÛÔÑÆ¾¬[š$ÊTÊ?ø©©t]Ú¢màÏ3ÞJ¦½R¬®ÄIö\~;´Re´±/ë¦H¿Óxl¹¬Uu;Ý¿ò”¯¢2ml4áp]·4InÛŠÜײºñ¼1òôyŒ.?¶mãíëeÝÒ$¹í+\p_«N¡¹PGw?ˆÓç>zÚ·U< Y·4InûŠ—ÛWSÔ=uLQŠÓç1º<íit´±/ë–&I¿¯žÁ÷µ´6ž‚übtù±«"š¾®;’‚<üSÀ x!×ßëí«çƒï¾Þ|ìX­:~ù©[Øe¾ë·/¿Êóÿt[£Ž_~<þ¾[ŽúÃñËÏUœªZ5Q{þ»ë“öúÄžŠÖœ­ÝÇ“·—'å©4W+øñäÝõ3úöèñä=üL ŸT—'Í©i‹JÛI£é×Ï<þTÃAàeÂ'.j8ž§'¾9Ý(m§¬­hœÄ‹Åf:•Üù<$ü)AaÏ¢?\žØ±&}3üLiàg^Ý^~aN¶¬šzÚ¦{ˆÒ ÑŒš¼=úúD©Û(³(K<ÚtVÕíÈľt"8’ø4+?·zì6‚<áèn>c#bž1¯Ï«C6ð̳üÕ‹ ‰ß‡¨X¾è&ÂÅêûèáªP5ç§×7úwuúydG1ý¢&÷fÅÙôãÏ( ”Ŭo{JÑa,>þ˜ JQ…Š‘ñÌhŒ5l¨ †Ÿ®(xÔ1ƒÈ2¢ç½ðQ˜®#tW,I0-ð=T ØtÈÕ˜Ô‚2.qââkÂÖ”ÎÅG½Cw8¦»gGd¥=£6í—q*矽 Sy*(%fyvÃ+ðÞ0¸XF¯òÈ®Á’dÕÆndŒif7à<”Ž9{c´ŽxÁµ­{ÁQj9>SXoÁz>‡u{ã8ˆ“Ëëû´§º²“u`FWÄ«~ë^V„pb<­‡ñ)fìø­üXÛ+;Ví·+mO—ÅC‚?{ò=zÒ3гÏàyLø z´‚^|ò¤|þó.án5Íèz<+Å”Ÿ`úÖá+Pxâ‰Áü‚Wi á<˜¢mº½o‹ú6«˜r¬ºÚåÃã‰Í[>´¥ÝåÃù€×†GÓxÌËù/iS•âÒÆóÐ…j¿eª'ñ*Ê"IeI8…7k²â× ?ˆ^ag-6\’3Aƒa2adÉF¾=F#ÞZY±ûŒAËs~ÀOD MéÐ*j¨ËŠ=Ê?³¦\*Œÿ= ˆ5Qq7 g·È%–ÐM¡‹Z*N*NŒâ16¥®À 'T  ¬BSµ„ ^GÇkƒŽÏ¬ÂãÏ«¶ø3¢æ…g̉˜¢ÐøòŒ¹+˜{±ijjâ”è·'bZc3ž1Zñ.àyDùÀ³<Þ9E¼žï ¨G`Ii ¼s˜Öxmø}ŠzÞ¯Ÿz¸jîÚ#w0u®"d"–ä˜9:ª¤Ñ˜Z5ºž]cêh@¬À@*Âe€ÇˆO ¦áÀdtæFÆÎxF>ÉÞ E©»†Ÿä¢ëÆw«òo2Lj¶…E¬"7´ß‡™iô‹¹£wµmµzN²ð"®B¡kåM,­‰[.J`9¢¤2×¢½ôH–oJ$1‡ø’™ty|²DÒf¤³Æ¼´*÷ÖJ•LÉÔ kL¢l.2æ["î9äõ=%qu)‰Zw±“ÿ=óÌjÃi'8}¿lJ ‘„WímüDø}Ò¥Ähý%bßÄØ“4+5MbžÏ9i/ó¤^­m=~÷¤½-&õj]ßmªtI½Z·v—Snå,äƒQå.¦hWkNê £h¢'Öüˆ3£ðαN*_"c«A8MÄ['id§1â÷ëHÃÜk´<€L„?šÊ fÜ8Ó½Û£¾ù¸{¬ŠÖ¡¸Ça€Ã{8ý€¹:ÇDLDT2épàô:ÙmØqvJÄJFÑM¢»ï_¹‡øŒ7r÷4Çõ4Çxý Ó}ª¯ƒ‹1£ßÆ–]Mã¼ÚÎó’¢#ÔE”1("¹ÌÅÀÀ~QðS‘«ø2žÙLÓ’8m·ºªwP"h\"“¤$QËÜDLH§Â1%$I)viΚ1c7`ó'äfXÏykUTÙ.qú=ï·â“ÚQ»8¶@Ê_wéà9W3;f’D^3ů‹ãÆVÌóÓzsÿ™ªÅô±›d·e- ûÝÛ€)+áíª …¤±Ö•vj„s°Ý€m€ø!¡²¼Gð—òd‡k¤Qï1—.É0hïPB¡"Ð>xÕC˜|ƲžË?duÆ ‚5öTá<#º}©ç–Úë>t.ÅÌ"ˆò‹{QÅ[¸3ÎÖmâYõbÈiI‚1Û]4ڽ㚌“ÇÃ]1_?e©žŸŸ¨sº;Šå<åÐ8„e[ÛïÂ"[aa[÷zœa¤G<•®Ýk#Ü…KY™«‚Iï$´¿uÛœ;^nXömx¹µÚÑ>êœPH8„¥ÚÌA]µEóŒò8p’*5+&NÁ¡}Üñê³…O:>Mp¨µÁÜíL”:=’Aà6LZuè9? àƒÐHìÃñx<½–˜ntÄûx‚¼ ¿ø¢)Ók»rÝ®"éQT—aÒ „¥|Â4ÅÆÜ:FoÔ×t‹Êîc*$va4cY^ÆZ¨(uðí–3rtÎO„Q­áÙ6¸(æ7l§$ìÒØ[ïØ]vJË ÏŽß”éª,+o·¦‰0ˆæ‰ö'g‰¿NÙé±tà©·ÖTs˜ÜɌǔ)¯IÕ1 ó[Ê[¯i¿wÎ~tOÿ¢#w~ô¶hÆyû™röì»â΂­žÕn×Ñ¥uôUv’ÊÙ'’3Ew}{Í¾Š¶”økOLGÈÛ”²Rkª™È„’hS ›ê¿îd¯q¥ Øeað¶œáØ·šV¿L¥[Ìb‰kÁÉ‹›Bxïª(\}ˆ4 (ëÅX´x%¤þôņ\½²ØšL¯ŠD™üT¦Á͘S~ð\×" ÕH”ÿ ã4ýARU…ÀZb^Â|žª^„è!;C‹ ÞL¿H³S Ò¨=2œ_^k}mÝ× rî‘&b Ê6£U""«ÄQ*¸·ô¬›_ uÆÓ¤ÒîJqc,~ÌØMòdKíˆ(ÁóD½&[—ñ¯feÜ97ê'£ÀFàµ;ìÈÀ8l±HÃ:Âtiîñ’2R–éÔ‘³#p£|žãuOhÉX× qŠÐb@{I aïL&H Û>&Jiœ› Ë7¦"~àdÑ„*J5ŒbÚ¼à —Õ}—¬Ø Ëu§kâ*˜ÒÝV.ÏÄ¿Q*—O÷þÛR.IÕÅ$ôÐ9˜½‚—¶ Àô¦t¶dP›—ÆN©áöø«0ÇHh2í´Wå3Íùíža„d†bÓÓÙ”Îí) ½ûMô›2w~¯Œ>ÓÏ™nuq}xÉšˆd‰ B4¤ôŸ1Ã3Ì~Nå )‡bÌÑÀ¸GÚ0!sY„ë^žÅ/Ò¹l‘ž\ØÑÙh×Î'îBÏI”ÜÈÑQºS¡Ùð‰«¸3IžyÀ'p Úvü]]œõ$*ü΋s:•óMØ@Tœczv.s:3ò(o3¾}Eò~È¥?BDЉ^"dÐy¹#¦ë“!a%œyÀ(¥LîC¢@'s0)Ï+c´Šf«%ìëa”ÒßRdGwCwÊÌ(£Æßcäêv‘ñg˜Ž¢¸ÉŠâÏäÒ*}Y<2£ì*bœ<¸NÞ¢¿ÄQ ªÚ»EI(Ed1»°DððX™òÍK˜cáŒ3º5ºy°<‰ÎU›£œgF·$ÒÁz|·dŸllï)~!¬Q 1|b« óòâ(·+EÓÅ6î …Ÿ±ÎÿzΩgÕ˜¢Œ×HÔ Æøºd{{P+ ¬Œ¢kã0žü¯ïϘŸ4Í-®çø‡) ¹Î®±YxMM9‡ò)} æÚMáqÉ<)ÕÍñ![¡²\jh”*u}„DÖq€;.†µH:µÆéI1žhyœíd•üL"<‘=AAâ0I¸ ݘtJ!Q¶ÔQ–:’ð”1qÝuéÜYÉèù‚EÎíÅóˆÞÁ2Us™Ögy4°Ê8hñðÈ \Ït]»zè^i5)ƒ—)éÁÙTåEDÎn­q8;ÚŽd ep#ʪb:TI*ý+6êãRéÿ‘‹Ç+”q 0J7·“50Ýò¦i. s \p¦Ýucj<1‹Gv©œk2•\\UßEdˆR\v$[HÜ_”—¯’ Ú0J7&úÕ%q3”F92çuùeÛ¸ôíã&\Ίð ;­žÓ·Z×î­²c U†M „4«1ÌD‘‡¡5FÈŠ´3ذ‚ŽÄâ@X6È ̖ϰz?a}uy¯ÞÚ+n¼OöŠ› ¿ØYµm+пÃrîöŠ›½âFž:«­¸±÷ªÑdu‹Kù­qß^ó“{×Yó5ÅÞ½ðlž„õ÷¶´©é»W ð»u¯ùϽbÀÞ«ÍST 4þp幡co.^éYÕ‘ÖuoÊ>³¡?B³´”z5äýl”ój9gõSxÒcÞ”¸ÃUU»Æ-Ãq“oؼˆ^.£Z3™E„íDlÞ“=!›ž"š¦k—ôÛéòt®1|ÊVQç´Îœ{—§yyëìã)R4ÅD\¨ä›[?#$ÎýfŠqd['2Q†¸™E² Ï<‘ªTgB" ¹ Í¡µ‚¤q¯³D'•J)O”§Ëä– ¯M´Ü0r/ÝdÝp\@µ³{ȨêV&UBÌ÷ÙŠ…˜ZØXÄBØŒIV—ž1­Ç¢ïæ:É|ÜÅ%¾BÒuˆÊËÏÐòbr£V.7RÙ"ãEÅ+¥1˜(¸Þó±6ªÅ;¨^_âRÙ{²Ósy]&@oÇ÷j"äŒd’8…óOÕ¥ËA8È´=à!½ÃÂExÕb$tu¥†šK€ü¬ºÿzLWlér7Óz”r*žÇkFäÌzD›Ho5&J–¨J’Гèº&’ÁìžñY¥¸_¬m¸àRUÔ“åþîÍœi­ÈzȈ˜U ›6™!¦øŸðúÖ}–TýVªD¬ù¥0|?TÙ•DÕݯ'½ëÂ'@ÔRV˜(êÝ7¥|¢¿ß-gãJnüdéht‚LÇö– º½LÇû«1ì’žS\W]Üžh3t î-.@³Ç×ü81ZY>x ‹Ôô(·#º{aâ Ü(ã ›nû'‹ NW„„!ëuq£ð‰ °Š ㈕Ý,xĨeÂÙü‹în /ß!)š«ÊW-¦¥'€Md¹yÜÅù«9—ˤû:~ín ï¥òiì&Ü:ÍSC· …: Å£¾k³Øiv=7õj_Rú¤/!¬—O®\T Ÿôšº>õBùÀ\cõ=šÇŒíгµ}ìßa_>–TÀŪþÕ/Ø3fN,Ξ¼†Â£ÁÏô‡M½ú –áÎ?w+¾m´ ßh…¦dó±¦*µ¯Ë60ŸÆ³.ïÎ7k¯ê¢9©ë ~³i¸ªL½”kc2íøéð{ÎÛ› endstream endobj 2269 0 obj 5069 endobj 2273 0 obj [74 /XYZ 38.2500000 196.250000 0] endobj 2274 0 obj [74 /XYZ 38.2500000 196.250000 0] endobj 2275 0 obj << /Type /Annot /Subtype /Link /Rect [192 173.750000 210.750000 180.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 2272 0 obj << /Type /Page /Parent 2 0 R /Contents 2276 0 R /Resources 2278 0 R /Annots 2279 0 R /MediaBox [0 0 595 842] >> endobj 2278 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 2279 0 obj [ 2275 0 R ] endobj 2276 0 obj << /Length 2277 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWè`eö‹ `í90l ‡E7›`±^ÄÙCþ~$‘ÔŒH}Mö§êf‹Ã5¼c‹V³ºÞ]U]õæÏŸÿ±ÿ×ïû7OŸÿ³ÿÚý|ú¼+•+Úÿö§_?¼ü@ׇîÏûªvû¯ßvß÷ßwŸvŸŽÿÿ¾k¿ðùé¯Ç?ýo¯÷9þþeÿãßþÔý£Ó?ø¶«TuüùëùgS©ãŸŠËÏÓçÿÞýíûßN+ö¯ë€¹þû•ª=A1ñæï»~—êüë÷¯¿íÞ´ûz‰²¦*êÓ»WÕûÿþs÷óqý~õâÐX¥ªÒVÅï©ôùEÖì•nнÑfôžó/‘Õ•øÚ¶(]¬µ[¸¥Q¢L©ü‹ËÑõ¸NÝaçø[÷ϫ˯mŠ*ÚÚg¸¥QÒÑÕ³¸ ]mÙa^<~.«GÀ}Y•ÑÖ>Ã-’ž®xqAºVºÃ¼«äÑsY<ê«ÚÆ[û·0FzªÂµ‰Z›2Q/‹G@|ÝèxkŸàŽDT¸¶ QÛ1¼¶¨zY]óîdšbQõ ·4Jz²âÅåèê¬n:OØ8yÜ_V@תŒæe·pK£¤£ëxñO‹`@ÚOÀ1í»ç‹ï¾ìÞ|<‚Tî¿ü|ìü¾öÇ—o;{úËÑ{?úí_~ÚÿñŽþÓþË/»úP7E©Ý¼îIŸ˜öÉåUŸ?0wt3ª«ZÂEêÁ"eá"Oç'¾‘aêx†`ÌÁÍbŒµpÚÃq!×1A·7Œøü¼šRç'ÊŒ®ÕñÑ ¼H¤Lø‹GÌâyƒ%Œ‹)®¹ñ£†ÀBþU± H¼Á1Hxy,lr~Ï»ù$ýp~âú Sû« 4|ÅB Bñ6 l!"ÙΣ„1ºFË¿g‡â-z¢ëðÕ"‹ GGc"ð–阘ݰ,bÌ7°ñÍh©Gft­Fl„vH;Ý>QªÙçï`rn$yѳZÀÖSE #…Ѭ#’b¹„/±„CäXC¨ÚÐXe`E7"Þ&aò“ñ!–8l°•v•9öP2O8(öƒ”JWV@«W®UêUy½‡æpæ† ÝxÒñØ­'®ö.ü‰ªÂ!05üN !x‚OàjECì§NHáÆõù¾…÷-º¦‰‡Âó.~ke§qõ>yOp)~–:ÆÔ"h¢éöÈ ¦}J 3½oBy0‚iÂhBÌI˜/¡&4˜Ç-¢á{\œT@Œ2O<°½OȱNßÁ±w`$Íî*µN›v'!<ÍñXÅsëAm±RÿLHò=O0lÐ/ðìêRüÄcã‰b_‚òíÿƒ±¶;XGb+ˆýbYŒ å™3¸^™¿›Òº5¶zuø}]牦ìc.Û‰< ~k7ÍWÛym;¯Í9¯Iyzx?ÐßÖŒ¯ éã0vˆ2 ’©¬&EueodÛ»,ÞËs& ðO˜gæŽç=C©¡ ·$šíœ[±Ñq´7‡©«ó„VÏqõ‚ý˜±ÖÒ ­&qjdr5²gÔl矛ñàö™¯<2 žè`ª1cÈVœ3Y¶ùQCʘ,îçd`|5Þ£çîhÿ?Åim=‰öGìsªh†¨Åå°ÖcJ1›HLEϱ"Ó‚ÉnÈæ~Dƒ ž Yܶ˫mã˜nl¹uÅÖÆñÅ“¶qtzƾ·6ŽI›29sO³Æœi"+ÝÔ@­”²åR·~Üšnv˜¯R·dÌ}ø˜kR7öóØD܆IõlIâiä›häd‹È,›52#™êæ-áƒA{ô˜cÓiÄ^mÎv\C\kØ*Š'ÑÞ¥º§ÕèíYiîšGóÕÒ™kxâÇI«K7rªs•h» ª2ŒèÄ”ÁS™­¸5cÉÒÔ©’m˜1p@•Èx‚½²½D†¬d/˜ÌSÀƒŒ¹Ê^+aš2Pµ² uD5.Sȵè,Ï®Ãܳ= H^¥àž†PØΌÌݪŊÉR& ª²O@à %ž#;1mD6á™8A'd8œ*ÂtîMuô¤`ÛB^©C^ñLµê#§Û‘©Hvdò8™Lia€ž¨ÓƒbÂK.Äí#|ÑlÝÝ¡¶«u OЯîj]Ì{ã#ø ½»w“*À([U½]Ç[[Áw†¶7e¡./ÃŶ0ÂFxfÇ-Œ.Œ !é'NëJD½suÃO;†$ÖbÉ[ßX²²j²×‚iôeJ)sj&ò.Lçá-¶¾žUª^wÂýmrnOº9“B'ø‡¼:.ÓM:Utõõ\Ž–wÀ‡?bZÉFÌ$Už ý•=3fÐ5ã¨ÖÚ ¨–kË#22$U߯”c6˜|’$pÓ\.òl›-póB$·ÀÍVÿν‹?‘½òT`*0—€ñtq¼S,˜ß zvŠå”Ï%U•ж]®dn¶m³m›mËŶ-Ïi]×fÛVhs\¡Ãw£[‰­¡OÒ¦#®¸ëblÎÍc¶¡+.}×F“å$•­J§>/n }ZÌ7*5æón€à”Š³ï­¡ÏvHmÕ°mü&ÝöžÖqY´7qª¬®á‰>Îi}1Эc4®-eZ *4úÎdÂûVLk+߃¿SÂ'ø;¶Î­¸•DlÐjë½w$û€QÏÆ4Î4¶¶šWªu×âóú˜±½!b:¿üO–êá,s„›j†Æ‹0²ŒÀx™€³8SMŒ;ÍQD»PZQT¬¤#а»ЦCTM†ø|D±wSåFê8Y\Éõ¡¬õÄ:j5ØšG .ÞøÊ£Ñ¶”=á3ó™q½BòEü1=AØÑ¹I0GŽÕÝ>ºåìn'?ïè1µz²á[7‡ o@0”‘º‘•’½P¶%rû1Àèbl1EKtsvÜR;GÔ@žö˜ã6»b‚Æv~C^Ùê?êàÏÔ˜oöx¶P¼FdÍB®×-kdsIÏ _ÉWÿת¬˜“œn—¿‘Χ*qÂ"WÍð"¢>§ð\àuz‰1äºÚ¨•9 ¬=?(¾\7ŸÅîΈÞ`Èz¼ßvBÎG÷͉KM^©OO«ì<"<…Jöº µD "*•åBÜÚ…ZárŒÈæ ±Æ*E×zÈ6x°.^dÈ{“ﻋVUQÚæž×Dƒ£Uõ‹«ä“*ëÓþÓîÿ¾¶ endstream endobj 2277 0 obj 4527 endobj 2281 0 obj [75 /XYZ 32.2500000 69.5000000 0] endobj 2282 0 obj [75 /XYZ 31.5000000 514.250000 0] endobj 2283 0 obj [75 /XYZ 31.5000000 71 0] endobj 2284 0 obj [75 /XYZ 32.2500000 512.750000 0] endobj 2280 0 obj << /Type /Page /Parent 2 0 R /Contents 2285 0 R /Resources 2287 0 R /Annots 2288 0 R /MediaBox [0 0 595 842] >> endobj 2287 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2288 0 obj [ ] endobj 2285 0 obj << /Length 2286 0 R /Filter /FlateDecode >> stream xœí]Mܸ½Ï¯ès€m‹%`À;¶äÀ°9Þl‚EvgùûQ¤¤ÇŸŠ”ZM’™Nó£ªXU,V=¾ùÓ§¿ŸþùûéÍã§ÿœ¾ôß?=gWÝ¿Óåë»o¡ësÿóÉÕåé˯_O_>>|lÿÿëC÷OiúßIŸþÜþï—ÓkùSÿG—?øõÁ)×~ÿ÷Ó÷Æ©ö§âùûå÷ÿzøëN¿]z†ë'óú¿¿sºÖO³¸2òׇa•êéë÷/¿=¼éÖ4ˆ²eU^¾{RÕ§ÿþãáç¶ÿ¡÷âÜX¥\e]±b§/YÝœ”nŠ“1ådœ§/‘Þ•|ß®2Ñú~š·4I”©”¿ós]igË¢©áÏkVU«ª£˜«äIöÜyvÔŠ×÷eÞÂ8 û>×Ö(ãti/›ù²‘˺ÖíÏÎôÿV­©±6£Ÿ;—gFU¨xúâiÞ‘ û–ÓÔU1l­ë”·Å*£êxs™·4Iz¶z:o5rÿþÌ ]_Ƶ…k¿µT‹iú[C÷e´3jYX>ÿÜåiÈîÛç–eûí±µ²§Ï?¾/ eÿxúüËCs®t9Ì0F‹nPKñ¶¼‡-ux ž›y {û˜5þÌ#1·®·÷Ÿ[ÉŠ.µI,…£[’Pĵ~@ZŠ˜w°¥I¸n­Ö¯!ÍL­ü¨ ÒÝM9ˆbÇUž‹Æ\¢/BZ>µ˜sÙ:¯[:²Ù³5] u¬"ësÝO4}ùL…ZT?ÇéÕÐ\ 37 [ˆÒåˆ)а … ·AØ¢©*¶$ªVSD2U×Ýu 3ŠˆG;–g£k&‘þÁÄ™xà:â£ÁL."OäI\=7„AÄYž,v•:OY™áC;rý<Ç|ÂíIåSЉØãÿïq‚ö}3×RkÛ¼žé\È ò‰³®'èm&ž›çÂ_=ÁõX<îÇ3€O qÁÄ̺„Ýþ ÏÍsÙ„¹@\b¹Ö 41kbÿhÈ9ôbZ㨦›c.àqDåÀ3Üæœ"ÖƒÇÁœ#b“=ŠuÖñϙÆsÃë!(êY)ž5‘àà‰*ÃY{ô¦#U„NÄ:Ë£G¯úi|©ªÎ¾Ô‹/…çv7¾”-ÂÇÁü1X;`êÀ•zöaoA89LÔ‚1¥üÜn¹eß=~¢N£Ík&ÆOÔ9Rüû’åýšŒw‘ZS©±ðÜMjÍöÑEæz?ÉfÐÎŽÄâ8—AFëÅ"K—AÔ } Í–óÁ³p°«ÞâQdD† u/˜$€T*~FCºyÔüòCû™+=†-˜(ï8›÷‰ñÍ ¦¾s HÁû( ›4`¼wá¤î«Tq®œz­9w†Ê ƒ-ÓA<%b³P;n0‡•¯4#š—ÚÖc3?J&·( © -¬úÒ°Es ¦ž!W‰K•xÅœDÆKßÁ‰W"#ʹ#hœ‰êc<¯X6çQØ~ã¹,PVÊ QR¦b4Î dÅ—#øâ^;RÁn|}@ÔnâõÈ^.zփùxøÔ¾ã0+uMw“\Ø3­5qaL]Û×µY»ì[®÷¬] ë,o +Ø›¦:¨”{æÆ\|âëÜB$PáD“=K¹Ç†Ê&PmÎ…=Ó:ÛP¯Teír£Úe[êOž¨Šr€€1LléÝK3÷ìÇJß0Õˆ‘w‘¾ÑØÑªï'}Ãs¹À`áp,‘ÑL%qµ-rA%{;RŠE_§*¢ÖĵSòGä40·¦ž #:$s‡e~ò§Xâà}{ä}éáäòk/*·‰PéÉRi˜T©»Ë¿`Ò-ìpÌpU¹Ø2—ÒxÖo›ÙMé)_&à£öêhC ¢ÙŒš4³e§÷ÞP);L¥³¶<áãb¹Â©;=0j˜Ek“Ëzf9²y ›ç±g” 2C¡¸|Þ<§®Š“C9y¢ö‡Ê‹…Žš‡½‰J§ ŸÊâËSödw9¥77?»P‡öí|H½xàå§w&Ž Ò¿WJ??c…wû@ù\Eîâé‹JÙUO_dé;\òÕNä²Jý uýN$h”pdž™›G^àg°&M˜ÜV©zÍó,Ô“.˜¾ Òa <É,®£/=RgíëÎ(+]¬’—„^ V͙϶ûpI_û°ÝÚÔkä2ÛîCÚn]ºÄR‘m·W*Žh»]µF^RÚî—·ÄF­ýñpSŽÏÜõÀ°1¦×ùˆ){Öj Ñg®FÊç.ƒàݹ*á8ø3lÁŸsë•ü\X°A½õÏ¥ÑÏ ?¶ÏåD¿ViÙ>’#áÛÑTœäà%w“mK½ µü¾ˆÂ ú§º¤'À@<ש vR@æ×†è,ÖUcµ"›Ñß?ÎapÌ·°·Ni+=4½‡9“1"ðE®Á ç?#âc\®žfŒƒê˜Ø G?ÝÉòåÚך9&VçÞ4L¦9÷™¶4¨·¡|ÇMoã? ÞúÝÔz9À—™›AÇ^­PVáÜJá8¶bŽ4dâ`៹Ø{"îÜÔãUCbzôžâu+H)HwfnêýêÎÍŽÓûƒ3ãà•zæÖ„Ë8#ažÞD¥ŸY©GBð a˵ÄOB²Ï÷«`ºçˆIn‰üŠ“,Jd c5ÊÖž“$Ž]oYÐ'O¾=lÐq`Iv©2²Êep*(S§uÇœvh]†LôòÞ=T_”bò7æåŽ~ðƒž¤×¸$3Ù¶žqDð0%J·ÊCEÊ(ûpjØSæûCÌd¬ ¶*[ìwÐKÏŠ%^§§Ê숬oaß9º±T…q#k)SÙÀØÈhÙ§¢™íà9«”p¢%UD–¯`ªØË*ôë™’h¥3µ@Ù¢ÿ$ž]‚pÐsZóÔöý¸:Éã¨Åuœ<Ü%ž`îNe±É• ¬E0pq›h]ö U‹Î)áË3B¢S9OÔ“;<<¦‚g Þá p  „´,_‰zæƒÄц9/ÃÏx0²›”<Æ„ZezêàR|èÔØUÜcLOä “íÑá^f’ܦn_-§UöA=Yü6*.ÏøTH2N~=T´<ëY Ptµ%f4Y[5Žg%Ä *Í3n~’b×y0ò¡z¤xó„GåA†*àJ!á¶XÌíR?KÌÀ#!D –Ë êp 1˜s‰ërË­¶pÏáê±uŒÞ‡íùu|*ÌA^¤ŽÎM˜ pf¥ÔóÛØÖóž¹aÛHø!¾/Fæ$üY„aFÄX<ƒmÝèm9¼er4vå³G+æÑÜÛMR§„rmáþ)a‹ÆZhÇ'̹tgžìÑú(š=Zn¥ïÏG-𠲯»Æ×MãºUoå–Ü’[rKn‰Ô"ìnÙ6Ñäº=¬”ººº;z£kó³žG’¾ªU™5{ØsNÁ§+,cX^ˆý˜ê\làÊÀ=“òõ¢Ê®yÏzSŸ…ñÞbä…˜ŽÛ1/áõlAÆ<Å7Þ8nç‘æ½9È‘ðè"V! Þ‰.¯R¿¸ý[xGËYagÒÈX½æ½Å}XDWTPÎé9vG³¶x?‰ê_Y_/߉æ;Qy©Â¾•œî»R,ïêçEã U [–ÃÏy Fpe:Süaá8¢øPü ÙWo´)\¼(úxƒðK9¢eHT1fªB(Ñg2…9' Ú‰ñJ±RC¤aa04—ŠP¸¥cÍÄ|{¦0cµ}-T"YÞˆRR{€‹Áæ ÞÁ¥)sÄCYæa€÷„ˆ‡ RØaï,ÀVm_1M=Î" v’ dÓÏ-Aõ)²gM­Æöì¦ðu$@™©‡%—ÃÃ0†.•ÿÌ<„E=K2±ÿ–;"p É­&€œ‰ âEžÍM …ÏU8„ 0˜ ºÕ4×Åwš–qbuÿàøÌ[W‰0Îì–nÌV‰0£gIfËÆoóXæQi“7ŽEŸm¹Ê¢Â‰Ê2§Ë€£öˆs§,¦ñQ_ïL óR—úµçÐÎ-eÚPíÔuZᙬ¼z{À  ½#T•¡wr Û’ •}{.*s+ÍÐ;^/ CïÜ0ôN{ÄÉþ¤·véOæ$Ï |sDÎ¥:qdÒGÑìOr+ÍÀ7ÙÓ”÷4÷iÐkJ›æizd™hÉžæ¾ý•Ûô4oÓgÛ> ™#—^ +ëÍ¥õhÓXJ=@¤,ynªê:ïò}óæ–ò¾¹©Ëë´"¢Ÿrh' ®]ï»u4„ 9”!‡ÄOG»Ðå®Ð©Av3äô¹gçC®°z¼ìÃ"Vj Ê=מeÈ¡ 9$žÈC·#L9äÔËË¢L™.Q ¾d™ÈOÛ͈À+âÿ1˸L=š'…n€ED¤Ô’À„b…(TTž­ÍÀƉ²_Fàï ë⸪uå1†”ÛÂåö>QfDz˜ÊÐQ°d¢"²i;ÜÝ! -ŒÛ!ƒÀxiÉ@ 3°,wK`A‘1¸¯‚ã$–eœD·ÇÎŽÑ{2zÏB=œ ˜A bЩ–ëTÊ{!޳ qvœ.êײ–ów:·”¹2Z¯z: ç âŠ(Ñ;O‘EsÄl(m«Î5L{@_:Zv×ѪZr%ŒoÏåšk/2†O®¬&åà®0|œ®ÖÔè¤ÌqÕõšZ“ìUçìÊ'º‰fWîã4bŠäµ;lÝ• ÒíçŒåkɧ‘ŸF2T>§ˆŸSvŽåŒ^S˜}¯ü'BÊØCÇ‹ÒÍÇÉØC+t´]õ¾HÂX’©6µÉÙß´l~ÝGôƪ5Ù%iÿ(IÖ¬É8nCFIÊ(Iß3/È–knÓ2JÒòhöŽ’Ô~­÷²·¶ˆÙ€r¥bH%)£$ÉŸ'2JÒ¾ïýR $Õ'mgÑqºÞò¨Mw„ºTìt/äèŒpuîK¿!î;ô™¾Úb®·õfú·å«—ßhØË#lù€Ztß›=kûj%wnêñ: šmïÎÌõV –">[ëjÄWÕ„ÓÓÓSªw⨋Ç2‘Š‹ê.¶_§¯-»¼ÜüxíTþÕsÜ6-Z½ÜNïIºuT˜«ðkzúLk°ºÝª‡rª }ªiKï(é)M{µ6W÷c®#ÌÍíC¿ÒI­r¶Ç•„vÌf ú0'4vï`‹EËP¸7ø™þ.C-ýÄ5Và.?·3]†3Z½GŸaD ÷&çD€àæ„G0'ð8˜GXر,³îâÜgj´JNñܘ Çé"ì‚z£uâ™ ÁuOo²¹|1ÀŒ5èÕñViWÔgÕ-ð•êy‹í•Ro¯YæÓLJÿMÖ _ endstream endobj 2286 0 obj 4759 endobj 2290 0 obj [76 /XYZ 32.2500000 342.500000 0] endobj 2291 0 obj [76 /XYZ 32.2500000 158 0] endobj 2292 0 obj [76 /XYZ 31.5000000 584 0] endobj 2293 0 obj [76 /XYZ 31.5000000 344 0] endobj 2294 0 obj [76 /XYZ 31.5000000 158.750000 0] endobj 2295 0 obj [76 /XYZ 32.2500000 583.250000 0] endobj 2296 0 obj << /Type /Annot /Subtype /Link /Rect [479.250000 611.750000 525.750000 618.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_throws_typemap >> endobj 2297 0 obj << /Type /Annot /Subtype /Link /Rect [93.7500000 591.500000 188.250000 598.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 2298 0 obj << /Type /Annot /Subtype /Link /Rect [406.500000 549.500000 456 556.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_throws_typemap >> endobj 2289 0 obj << /Type /Page /Parent 2 0 R /Contents 2299 0 R /Resources 2301 0 R /Annots 2302 0 R /MediaBox [0 0 595 842] >> endobj 2301 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 2302 0 obj [ 2296 0 R 2297 0 R 2298 0 R ] endobj 2299 0 obj << /Length 2300 0 R /Filter /FlateDecode >> stream xœí]Ɏ丽×WäÙ€sÄE`èՀ݀†Æxƒ13pÛÿ¾safUQz”ø2HQ*Mc¦{J-ŠŒƾüð»¯9ü㿇>|ý÷áG÷û‡¯OÕ±­«ë?‡ó¯_¿üîŽîχ¶«?þüôýðýéËÓ—Ó¿?]_øúá§?ýï ¿?ýû¯ÃŸþ|úá_Ý_:ÿ…ŸŸZÕž~ÿéò{ߪӟªûïçŸÿóé¿:ür^ñö9·™×ÿÿëÖ´}sÞÅÄ—¿?ÝN©.¿þûã/O?\Ïõeۺקߌ=¨ÞêÃþöô÷Óú·Õ«co•jÛV|§=¡mt{Pº?-tú×ÿÎå—ÌêòkwªI¶öeßÒ Q¦QáÅ5Ê´º¶gŸñ[w>ý¹5îŸÇ ÖݰqZH]2\w•êÓÑQwA‡,Hn¸Æ‹»ÆýÿÌ}º;L5糩î’ytºí®h1#Lêa¤ßWO@PM:‚ºî[$Ž ‹§%¨®2ª«ZúZ/÷Å༯M²µ/û†ÈœàÚiEQ_%DôóâòÈèU:D_÷Ñxí¤l£×§?'g½9ÿvFJ«ä›çÕÅQ~zÒÙdätÙ·4Hnô4XüKÄ"x#ן ë{àÅ÷ßž~ø|"ñæðíï§]¾wýíÛÏOöü?'Å»jßþzøÍi;ýoßþõ¤êcu:I}ÙÞõ‰¾>éŽ]_5úå“JÃ'-|òáòÄ­¹Z·ÏO>^w ŽµmºÓÃûóþò¤?÷ÒŒ'ø;ÊÀ½}º<©Fwêõ“½£à¼š‚pSê s{éyµîúΜVpK¿¾<17Ø¿X­COð;ºõ7‹)Ó†Ò;y3û{ìÀÁt¸>&­~sÀ \ L‡JßøÌî{{ æ>˜ ðw¿øôí$—É”^ùBe° ÌG1çüƒagÌwæóÞÁ_ \)ü½ÁÅœ¶#HÓ±gÓøVĈ,¥Àòø¾`ºÀˆƒ”1øþN@ c)3 ¡\â1ÃúdF@ÉÅ,‹¹-øùì‹Bæ¶ÞÉ%ô?Æß0Û:Í¿mê¹›$³„±o[_8ÎWáƒ!ÀR±&¿c?IHYUµõDw+ûãe3¯ã3|ò >é⟸û:öïíñä}ü;xo®xç#|ÒgÄ}ß­÷¦&ðÈàä}>ÈŸS^É›‘ýhxÓØ‚àÞf„ˆi¦¹|Rµô“<§«ëNgð}Â7bUAˆvÀPæ ~ÞÃP…Žß%5 tðy–—h¢9ePÛÚ-ßûÞd”øñ‡ÎÞÄ}õ.Þ.¦ìoÆpݨ³uån¬Y¼¸!+é¨ó !||TÂÙŸÕ±iÕ« (â«îd†Ò·G]u*F8¨…én>Yü@ð‰QóÉ ß†½ærMEû£йZ+OÎéë7G¢ÜT¼;y†ÍD Lžñ—ŠºË…Cl"bÆ_$àoÆœ;Pñ‰ñ¹_8Æg΃)%±: {{z#£wË*$˜¿æÊc àÃz š?€ÄI”£ æ ¥¥ª´ñÍḆe£|DêW@”çâáø;LœØ5£I “àw¨*£'ø¡Â¾½a») ˆ0 ìÍ´º½$ɦ¬ð¼$ƒÿ®i§·¹JV”˃ B$-™á ¬™O wáð†„%d)â”Rü"<´¥¤C=fÒ´Ä(¢‹ÙžÞ‰¦ª{Ø´¦(#ô°æ!#‡™Æ) GJòH$‡›Þ£ û§›=ÌrM¼I©=âj+WK62¥Q¥ÕÌý•ÔW({Ô~Xl ÊŒ8ÙéÂ]î[ãÂdVw/°D”ì¼…×L €@&®¹‚ÀÚòiÒTr÷R…²V¶pB “º1à1‰m¯òè|Uô'ë8ÀrQÆižÖhf{Œv.ÎÕlèi‘2P)_°nAËÙ3¨lõábú :·ÅðŒ,AèÅ9«làZ.­;h;êÑp,·¾ bÑÍ]Z3¨æèôÑÁ6GÞÁOœÓwd5×á$#î?Ñp•ðÉgôÄu¤9Õ¾bí€öØwþ9 ÚíÍ=²Z…žήàjø;ê|Ò@\“âïhâ¤Ú´î ïâà ïÀUÏk…ÒõÇ`±÷†W ìR¯Ê4©S÷釛õq–—î¸I5@¦·µhÒd6?[É£­ç_àå}ùû¸ˆ'ƒÔxòm·¹³MJgªcˆðR’¼d©’˰MÛW6ƒ9Â}B%¿c:?kgúÛú¢õ×9’[« ܶ>±{Ú0šsÕ™/_a²lî\ Q¬ÒMíÝt› ã6œÆ¦°h`5ØR9ÐV·KÍÛK«núÂb†ÇÄþ±Œ`¢MŒVŽÓ¬e{iåz«\²Ö3Z©¬öùUÈTIÙ f1fëJZ`„UÖÁ}¯"jµ™ì£2!k$ËÖ„ïúè®>И"’5w¼M«A6Æ×‹v e¨ZR”#çíè–¢Ùå1òœ/½M{×:½ßµyw­ëçß5‘bÂÔn‰ÖHÌÃBÛžçáwog¸X;C|fp1yAdkt¨lõò'‹4:Toì}¦ôâ’Kç3óÐ\®M˜™œ¢fÏ•˜Õ¾ÅqJ?jÝz”ð†R¶À$æe1eªiÍ,cz–w3 °Õøüc. ª5d„2Äh{S~dK)÷+s†×GÃ<åèóÊ“²ÕÌo/†(bü&öÞ[{kÊ´,Àù"š l™Þ–²†§Hîêb7­ä‹%2kg%hÒÈ7U5Öp‰e6Ó uy“yÌÀ4f2Ó[·©f.¯lªˆŒÅ›•àǸQÜR·²ΙÁ_ZciŠ ]’iÒT²4'V 0l&ï³ò©\¸„Ä©]ÕÇ3uf ³cÞm?q².»»ØÃ'Þi¹ŠŽ ÁÛeUÔ¤e¦‹¼~n«|.­?n±z‘y”Qˆµ#F/NÙ嘌²=tv•Mæã´@,Ö˜'ÌwŠv‰û: cD3EbxKÖ›ôœ$QÁM›0ê>¹s¨ˆÈ9pËFxŸà<øÇÕÇžÀÕT ¿ƒ³+ p¦Þ›0¼ƒ±€á±È{ @f²àóÔ ËcÎøãï¿óqbµ<7ÝLÃj7=@ÿø ¦|RLËp×>ÏÛáieпíwúˆþ ±ëþ‹¡ÿ¦Ûéÿ1þOÐËNÿÅÐ×îôÿý[œG¾Óñôoõmòͪ+¢ì¸åï ¶ „hÉ<ë€ÌyªVò ¶Úws ü„àƒS<¾s?¼O#²vçBÙåÙæn¤Ü ¶‹¿3ž¦e"XÆ4–‰^&5°,¯«{tÒÖÿ)ú…àÞf„ˆž¡¥¤÷yNgúNˆÝà€e„H`oJ—¨ïi4›ÃÖâò-p‡±Aˆ¸ÝòöÑnï•}ìÃ]çy°O®ݶÓP\¯¾Ð77˜fðñM5õMYÍ–UUh…iq}íÁªh37…Ò–²‚·Wt™(Ëb*q‘5J¤?mry혺݈ùÌEû†­ @=¥\ëÇNöÒw2 }Õ5 ë,c_º#ibXõÞÝ\Þr¶wÊ6ümë«ÚËvuo;_Ÿ] &y'„Îú‚ÒòOŒêÿÖ$Z¦J¬xm®OJ®¢·• 2\½e¡’"[sVÇ'€í)ȩۣCð[#Äåí‘ƪžP*¥‚?¥£ÉاiþåžéšÜ­vóï¶jô[íh"Ë–6{EÛVQ=ðw˜©¦¢-˜þI”»‡€5Õõ‰p(Xæ ˆJüÀ] ¼Æøƒå«“ZrJáÕužôJ2Õ¡hu{·/wµ~3jýc7-‰î”2ù•*r²Ã—ájú³JüaÑAé%lïæ•Î±w+±Ž•Þ ÐV·œ³@<Ÿ0©|KWião'ª÷²ê²¶¤ ¢µO¾L<|•㾨±8™RFãc‰0¤d›VóšLâQÝ€w”œ‹š·$%iZ™òྂ4»"­ã=nÝΔšåçÎÖéXtHc6—Î2S5Ræ^uûig1‰Ëû¯ö^á @)­fùaóG9,œ{«”õøå“o÷úã²Ï3Yœ–fo>D]ź æ”òÎ?4‘5êÚ¼D ú¡’»%‚…²ŒÂÞä-ùµi<ÚÚý¿ÀÛ¥Œ©·ãÿ LÅÄ;ÀA—ù‚áV£ÛWô”-&Û/¥O°i}êIÔ!O¹Wv÷ÔcðcRŸb*ë=À '¦L„D™”×ÁN ³ [;Ð5ó6ÿLYüÚûºNɱ *æšÞ i{Ÿ>6CÉ¢Ýs6Y~üÝÐ{‹{ãÇ"ñ“Ý]=ë;˧[îu3åÔÍdÈ´Í4Ø÷”ÐD,B.%´;h;‚¸¢¹¿5ÕwîåsW5kÆxOstE7ƒm޼£>ÃÕz¸šó“6Ï×ýÄýz‡¢±U*øÎÕ»ÕûÎßÜ­º9Ÿ‡|ª'NˆwOŠWs™Pª¿-7ã<î’i5D[ÃðÐIϧº{ßí@Z•¨€¢x€hâeþöL)læ#‚#=Ì;ÇNŠE1~çz'Wœ’¿Œ7?|ÎhUë÷ódªÒEíËÀxn‘\¶Lc˜ƒ¯>1V‹‡&¡³—ÚíʨÖR e­Â´9˜Â™\®†<.æŸ!zãw(æ|ì3IÙ‹Ï·ö7„l€;a%›#qÇ5œïúÛ((BžŽi¼€.dkì´MÙûL·HüÑÓ Y6ìÈçb{¼¡˜*£^lÃ*Í¥™®ªÀ0‰%ûXì®è‚iBÒн`kWŸg¾U‹Êf¸=’ŒÙM™ô |©€;s‰™ŽÒ¢ã†dg1:s-DB¬äš¥HôMFäsE|#­ä«pï«{…»†ùÏÌœµ¨£Â•縫¯l… S¡ˆ«za~zD¾}•¢î" õ©çÚP\³‰«˜p¥Qbá;Ry ÒâïmOý"p}ÆvÁ•]3Ô‹ß)¸¶gs».ÿ]ËwÖ)ªQ½­Ÿ•K$k1]pjÃFT}*gJÖ2b¤‹_? Ê4æ=­{’jh&â-Y$±2E P߉Ò˜)3¹‰¢Eþ{Gò tÒçÖµ'ïšödø¥Ä(S…ÑtMÔñDZG2?JÃ$†‘d¾#O¬…’0LÖÕ/_¢¢#p×ekäˆà®­ãuÀɢÁ;Tßt0å½:BM’µ‘#Oé)Ó,\Þâ3B°F“0_-–Œ¶XµÒns­ŒšÏ6Ѳ™<~!)‚Ïd¥3æ¡r1¦¬W0[N¿¬Ï9EmÚ4ußy’MÞ<éûÌ4ªõvÃèg²ÊEØ¢ÞHªk>ï ÒMdã!ÙJ ±¿X´ÅM`|Ȫ¼©‹‹9‘SÈriÙª0&Ü,ÛXvž7.! “»NšƒßûÖáréĤa½iiîÁpT 9ªðÈ‘k™B9!ÛêÞy 6ÍÅO-…+¸nŒ[ CÕ·-Åêt  1ld)ÜŠ·ÅÄ9!¬M]a“ͬñyºŒt©í#PmA€±7ƒÍ¼¼xŒ¢1‹©h†^òI—ç\ï¾Ãð —þ™ç>[3 y‚ú4†Ìÿ|C,Y}¶= +٦Ͼ^!VI7"z€~·ÆS é¦â;óÎ:yÞµ(D nó!бM< ìM¬:mš;œ­·b¤¦K<Ì‚°G­8°7¬O…E¢èÿ*ÏCIª€’˜'ÍS¶º c®¸9¾üB‡;ý:|?‘L¢¾Lý…ÎÓnŒÜŒ2®,ïðli_ïÓ˜cíºïvÄ‹uuŸé£¾Žà¡>qœY²^w0æéþˆ¾c¦RÇööÙ¹±ÕúJÎ÷«Öpù>±è ¯ßqÎ<uôU™,Áÿ|Úñ Ñu<¢]ïØ;ð &W}<ðyç!z€yŒE…Ë S`$êÄÎÂa¤¨ï¨©ÞcçÁ'ÅßÁ0À'ý¯7ÞĆÞíÃTƒ~q6Â\b‘Àñò/ܹì­n«î¨®,îÕõ†5Õ€SÒïðåéÿW>9 endstream endobj 2300 0 obj 6497 endobj 2303 0 obj << /Type /Page /Parent 2 0 R /Contents 2304 0 R /Resources 2306 0 R /Annots 2307 0 R /MediaBox [0 0 595 842] >> endobj 2306 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 2307 0 obj [ ] endobj 2304 0 obj << /Length 2305 0 R /Filter /FlateDecode >> stream xœí]ËŽã¸Ýû+¼`Ü")Qèg€,4º,‚,‚žLƒô •Yä÷#—$wYò¡ÄãKŠrk Ó®²l>.ïûÅWúôã¿~?¾zûé?Ç/ýëÛO‡âTWE÷ßñüóãË7´;õ¿kW¿|=<ŸÛŸÝ>½ýKûÛÿŽúøçöÿ_û{ûæOý‡Îøz¨Uݾþûùµ©Uû[qy=¿ÿËá¯?;8L×/æúïë²¶õy33?†]ªçŸß¿üvxÕí?hU6•)Û—ó?M©ÿýçáçvüaôâÔ”JÕ¶¬‹;æ©õy"s~ÑM he&ó<ÿˆŒ®¤ÇnŸ¸2ÒØýº¥A¢ŒUþÁÅε*Teûsµò ¿ áXµQÑÆ~^·0DºSõŒ-x¨Ú™x‡z<àMåâ!ÌyÝ‘Ž-x¨¥):Øè¢‘‡Îeô·&Þ©>¯[$ñâÁO®4ªeÐUy>ãóùVÎéö÷Úôÿݵ«º¬zˆqiûrtù±]]GûyÝÒ Î.BêlµJgRPεv¢» / ý~pm«xƒ?¯\*F7þÁåø³2M¯h%º‰Ñèòt¥l?wë–IO³ÓÁ? ‚ҽ̷'Ïß|>¼ú JÕBÒ?ÿÜ®íyÊîås ’ªý£5ÚJwüüÓñE¡Ê??ÿzhNVWà 瞘wÏOÞnw}¥-¨ø•5ý$ÍîZ^vÓ[ÐnÒ­Çêr€BáŸxNèí-ü>¡~ÇÁï¼_~¾S ×V`àµáý¸„XQšuvÆ•0ƾ ¢0^j8¤á„ÃͳÓ7 ÏÞêÙ=hEc |8æÁ¾2!DœºG"1¼ bœ‡aìI(OêblÀ+ÅÁ˜éC㯇w1t‹÷ƒW€ñÊGÏ 0=òÑ@Ž`òÀ>Õ<°îX›A‡ÏCw¬ëA—Ö BÞØìáø;X®3ÍHLÑXƒÁ8OŒæ5†|2»Ÿ4¸ÜTóX­fwnŽ¿ƒµ×Œ©©Ä+Àš5–AøÉƒÙZ­m¥”&Î 6§¬41˜jñ 3ZÁ±=|K†DTëYÛƒÉÀ;h& eT: u{N˜À1¹¼ÿñrÆnÉÃãê»| ‡c¬f<á×Û5’ž3ÖX0z0ã(!Q Ö”/& /k.³&Œ+6zðžÈê—¥¬äe<†¯._@¦t8"¢æñI`/0±Ÿ]ûÞµï|£òÖ÷æ{"䄤ú~xGV&²¨°ç.w ¤±v~w ·Âx)Ë­«°„˜„£¬žÈ,Áå Ž6BPáy ÜðN ”g –㈠¶<í,ôØÆUwP†,¬¾§8ïyâ!k-ÑÎZ^2cRy¨‰l&OÒž¯vÆÑFFÛíïÚd#ÕŒ&y,–Öù瀆Á8Ó 8ž‡¡|¦„ÕâY5qÚŒ=Cå¯0À;­ ·”µ¨ªdùUíÄvˆµ`í›âv¢~_Ùt*˘±r÷8ëõc;EÌJh1—Å31+e¯§TÅÉÖÊÕÕä¨ÊSiºß6ÐmÍÏÛ\SXçÖÉB-|JJ\ËÜ5zÌÖwczÕ€j‰`|$‘“ïÜŸ¨XLÈ0Ur—¬oœIV“ÍúŸ²fEâ6NÆmïqèOjµD²¸SibL€ ªÉ‰1‚6UHö,Aƒ­2Ê)´~Q@@ЇˆKFÖĵJ7ê\eb§á(•  狯”,ëQßk†¶Y3Õ7X„$£ó3ųÞ¼“ˆr2,ÑÚü¥²DEýTÉDn*ÌO•0i`†„^¼å¶:U:œ*yœX[@åD¸¨ëg³#©•AÆÕ™(d@·šõ¢殺e>‰­¼$g§º|5U'OûáDÍïÖo¥­q£Î6Ùn1ÖéÙõ<Ú5?“dOx»É¸UqiH˜°Íñ9¤Ÿuõ ²æ«ÌÅEÆW‰&ñÉd2h«¹¢§¹fæR§2÷\—½Mþ-|MÃú8–RU£ ÈÓÌZçsO*y”¬P#gÙ’;÷lî¹'gîùHeBóçhÕ¥äMŒ«Í¤*Øú²Qè©_­aÈûØ<±ÜVÂŶ©öq=1Ü:ìkG­m‚nR…änÊ¢[Ü>§²úp4ËS§Å4™%‘‰) çFÄOPv$´dÓ¨¾Û©:HÐa²D¹ÍXAðw—·cI•èÙz*ÇÍ6{°Ö1ææÖåQS„ÕH|mTxìå2A¤D]© ñí8úveÇs´ï´ß¹^ÉùSîjw=Ç/‡7?D"T׫îvÖ÷=ú‚T÷õét"h(&‹_â J•ËнASnE¡›slŠªiy0bS9 Ô=&ç$Ìš*15ÒÚŽ%]ŸÓp#ÛATWÍ KD?c̰å…"ÿ< ¸‡IøXögà˜LØ‹x¯7}<ë«JÀ$dÈ6U•—uÊ÷™‰¹6›ò–™ØLL¸ÆNÍÄó§ÌÕ(æå3±Ñ·ÌÄfbŠ6jj&ž?å®Fq×s$0›‹;¦ýes·gNšÜ£e—†´ÇbÊvï©¿NUíŸg÷[cƒD}†)™k6)ìÕë¨VLL>qž ÓŒ$^ÖŽ0‚P¾g7kέ¶DÔÂU/kªÈ® ƒpÆMóv­6ºV+’È!Dùɰ¥Ïä”­’&763©ûº´9&V’_:O”?A4õ }x˜v«uõ¡Úgð±´Ýv"ò•Îy¥Z,‚äÈèÜZjݾ҈²îÖ^«kÝré©rÀ-H˜û¥Ým˜äÎÁ 迵TÆâN9¸(>˜f<ç6ã³áÞ˜ýÕ˜“ÜÑé:.Š•]¿Q¦3£ (GëÌ98UêyZÕŒ.>O³ÅxÎåiR+H¶+r~q(wت‘§Vc«$ÕeOʘÁô—M– ­1!ÐTI Ìh̪W»Œ“Èp¹Í6 ˆÍd±_ ºg-4ï7™9´z>ü.‚z™” ¢Õ‘ÅsÅ·Dê’lâËzâ&•Âä¬Kú†Î"ïDÅv*/oÎÕ»tÞ¥³”tŽâωÚÒÙåi*jXû¨Ruåß ÷«sÚ<&Ï­öHZÙÝ'¦´gèu˜îœ¯ˆj…ªjl†xE2·(»Åªò¤Õˆ,ˆK‘¨¦ì XÆ @¤±ãµZîKLÜ$#»ìRß¿­bðñ¤YöùÝ¥ E QíÚûó E‰Ú:\÷—ªÂ1IÕÝp&å̹”mÖ iƆª¶?ǧvbïº>Î}`€r7‹©ZR¨³À<^øoO¹¥!të®oÈîŒõ XMNÒNŸôðѧ^`¿ÐúÔxÞ¡yÌœ“ùÖÚ>ô;E:VâËoK*àbU¿õÉ{‘‹ÓÕ°’|c ¿Ó“¸ Úú 2bîü{»âá «ðƒVïáwàŒý-!·ìî×£ƒžœ<>E…Ï'´ã^”ãd¥ yÎkpp?x§x ¼Ó·¼ñ àù`¸áôg}R“ô„0D<ijF<ü‹œ–ªëÂTÇâ®È½¨Pšnÿ"<² endstream endobj 2305 0 obj 4390 endobj 2309 0 obj [78 /XYZ 31.5000000 612.500000 0] endobj 2310 0 obj [78 /XYZ 32.2500000 611.750000 0] endobj 2311 0 obj << /Type /Annot /Subtype /Link /Rect [330.750000 132.500000 352.500000 139.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 2308 0 obj << /Type /Page /Parent 2 0 R /Contents 2312 0 R /Resources 2314 0 R /Annots 2315 0 R /MediaBox [0 0 595 842] >> endobj 2314 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 2315 0 obj [ 2311 0 R ] endobj 2312 0 obj << /Length 2313 0 R /Filter /FlateDecode >> stream xœí]ËŽì¶Ý÷Wô:€ûò)Q@Àó E€Á #‹à:N`ØF&^ä÷£nQýt¨ÖE©»5{æ¶Fd±ªxêÁ"ùåÏ_ÿ±ý×ïÛ/Ï_ÿ³ýæ>݈]nEõµÝwþr;ÿû6wvûí×Íçösó¾y/ÿÿ¹©^øúü×ò·ÿmÕö/å?oø{ùáþöðë&—yùó—ÃÏ"—åoâøsÿù¿7ûÃö·}‹uwž˜Ë—Û\»===nêQÊÃ÷ïß~Û|©Æ?¨i¥É³­4ÚleaÔö¿ÿÜüT¶_·.v…‘2ÏL.Fô“«}Gº([PEÉséZý¾£´.ã· 7YÛºc³DêL†ß9£¥Î•5{ïåkSåï¹ö_ã8VäÇJåŠ/Žºñ Ä‘ïL¥F{º#s¤–4l;âvÊV¼±y|柀ñÎM‡ º#s¤*l{ç2ÿçzvûn‹½®˜4¦4J¨Ì EŠvGcårÖ|ô¶µT“PEwtžx µO´ZYí-½Š/ÙSëHÖäf²¶tÇf‰l»ñ÷`BªO€úxñécóå­‘’“Ùöã§’¶C—Õ’%¶ü‡•VÛ·BÚ~ü¼)v™²5…ÕñŸ¼Â'nøiàKPð<¼ýtxòúQJorÎ+WSª=ê RšÒ‚ÈÞ$äˆÉû5Ëëä"~‚ûQ9Ñ”°Är„úÐyEÐûQø‰„R€#ÕXrEB+=3^Ç–}ß“4£s¶æéËôÜ.1FˆÉL£K)vY.]nÏX]½³&Û?hÙ]%‹šJîv®‡Ñ5'†Ýiåä哽#qk˜‹¨–Õ4sW‹‡®e££!%ÏèI«‘AJdlÞ#š»†÷æ1‡«qI] ùôDÃ~àЃ¥©†ïxÛEæìÇÔ Ö”Îë€äð;Ĭ ȇÑØZ€Ï @Z[×FÞg™¿µËtbfXЧF"8¹“¡oMiéŒlrÊ]o ^†™JÙ1{ Xyý°¹j1Ÿ€6‰Á(HXïÊÐ èþáP„ ¼ü&œb™Q ~È—X}º6¯cS SÊZ‘ÚLË3Û‰e]ø÷†4ÌD‹¶;l -`G½×nw¢Ð“‡òfKÞ íW9¦|Í·€¤õÁ’³ãJiª5ŸÖLÉ™’)=<›5Ž1' w¦u¡šzˆ=QL¦rΘ •¨ ðe!ÈöÆ\Ƚ‡ýœì²Ù„œÎ:¡)ÁÃƉñ·qPF¨uðdìc×´ö+ËònH¼¶„ŸÀ 1cÙð;¯iTÏi¥ò\7ùþ2LLÍ÷–‡>a'õÐ[ÞÆ‘ï›Î.þS"oÊÄíæ5ÁŒô1r®¯Pz¼]ÀT‹ŒÌb³lµ>‰þä{â5gkˆòÚà0…Ê Áì“ÄÅxÎõÁ4ˆbŠ^ŽÄEŒ\xIyu?î!DÁ耟`Éᲇå£C¬9‡¿Ñ;ÀÑGK€MŸ­wÂÔ.è½eëOC Ô{0a“ľ>7ƒƒ —ðâ.¦*ÈhG[Lõ†/óêJe1Õ0ÌbCÜ:-¬ßxÕ/«@!âäVS¶ÈäÙ‡,x'H¯‡*\|åÈ °¨Åkì a×0ZÞ NYbM7€OÚ§köɬ10¥yL“ƒ›WÉ­²M?š7·°Dqfš~ÒbŃì⃧s­wÄÜ€ÕpFÝ¿$pX¹œ!ˆŠ¶ó¡'-¤¾×Pô4´ÀylêØî‘(, øÒwµ#OZ3% ‰vNàb(eT}`«cF‰â¦´)5¡ž€\aêyWknJU?:Á;Î…Œo¯<Hµ÷²;ž˜ ¶†9 ù†G* B>ò-¢¿Ú Fg lˆ;c<$wšÑ°¸³£ƒj¸¶xÐ7ÒÉwo«Òõ» ›ºì7“Ö‹»$Ãef63›Ý¨‡ÉÃ2‹wQ÷dFv _Pp ë Z·œAødâ²ód{À#. ÅÝD=l/0³'Š™GÌÆ´æV2Š‘­F˜s¢æR”ÓCë’ ó‚ù—|}ZmX•@K×o|a–0jQÇ 0ZD–€1@ º®—$X/QÂÞÄÙm°Wl ÕøÜ3 óþÔibéN‚S"w#(xm > ´÷H(ÇÀÚ.§Ä+oLI)æ^©Â:Æ”ÕÆ-¯ÆeéX¦°5|ò Ãkª˜(ˆft'À(mŒñà~ð;Ñ’ÃW P1æôÅÈåÞ¸Ìy¼ÁØHwn.üTD%å¨SÉžÚ‚-Ð*ûJöÚÞ€ìSmEšßV.^_òcÈznqÅ‘B‰4Ùü‰«¬p$ˆÑŽÇâ¨cöH0îvBf»§Â$œÃJ÷Szo˜Yö„p'*ßRæ.ÔqÃtª²ŒVP¨ˆû!²`kÜ2‰öec2g:at­Å-DX”';»Æ­(Ý«}jLŒYc‰ &ÖŠ5.Œí»Æõjqä5~²æ†–-S†ê¤8hL¿&Íÿ$®.^1µšE¬š1k")ýKéåhÅEDËÈ„h7&w·ô¨Ã¹êâDT?Ž™r>u3sK—½Î͹"ëײ٫Á áÛã]í·Yu–Òãµ²Žü×Õ:Ï=&Àú»tdµvŒ/›¬Æƒ8F9îËIe’×Þç2lH¦n¢¢˜¨kM‰¹™³*ÁXH|'q “…-dJsÇ} «}:p$£rõpn`,Œ«q½bìÃFçñ CÔñè¾Õ4:¦RçA1™“œæÏÂk쥔£ãÓ¥Œ–s7&¨)#ðîvç­ÓÌÎTóö6ë –1×Si•r®;í.{ÙÇt§›”RU.2º´M‚qidRŒñrSy¬ mÔ%08 ƱF;Iöjr”ÌÖEÝI‹9:ÿ*UÖkZÁBމ\. YŸ$˜é–°,ød«Ô¸b—{Üó²ï;q”š;í¨Zbf`Ÿ gn1¯nÓçb2LÎ1•-X±sÅΔةq-SJìÌÇä/Sí†`°ÓFµg©ªÓ{µbXk 3E‘ÜNd¹±LVËÛr¯VxµÂI#<ëÓYa]ÒÔØy“{qŒ~œ\ÒmbçÖN‰u’@œë9£úºÑùÏ ‹‹„VÝ›ZD´¨…º‘s)´ÈÆœK±èÙÀ`öøÆ:®uµ¨«E]-ꘘҢºQ§”®UŒ«[í­oÌÌ di ¬VB,ÛJ,¡:LKQW‡Å‹¡Â÷äiy¼„%pg-sé™AOâÞ#vS·ë0×)ã[¤7q=5†¸ðGCÎÎ.[í©Þ‰&‹ñŽøwœQw ¶n¸pésßàõ·xˆžöò8, L%À7¸ôðNi‡jÛw2D7xåà [äf»{avÜ{<›Ä€×Ä$à VHRÀJ3ÞV7¬¢Œ?’h*078е öCÝjLÜžìOZºÊ¸þ²Ì©oeX=ñÅÍ?ÅB‰v‘×ÎÆ4Œ$8Øo‡ hñ^n%ðæÉ¾'i(5ýF6°ao0ÄR{ 26²ø"0x5j\×÷ÃÞH=Yðõ°˜; £"Þ̉¯ÇŽtïí˜|Ïë4ˆ’/û\eJdZ%¢Ì¯;·‹BFé!®HÅüe. È‘8îѬÌ1 ̬ x»ðs})¿·Ÿ¥bõæ½ï®HF¸.¥Òeü)ä>ZÞ¯õtw…ÄOóŽø³‘Ú©jå©Åí¬ýÄñ v>Zo!GWÚïõ£ûªŒºh{ó#E \ÓaN$ H¬ôCo Ѓ3>j¯òv CâÖà;>Ÿ# ý,|cnÿ{Iq-h;\Ð÷+̬/Hü™ò¦½šŠŸúyEÊŽuÁ¯“vµ†GJôй¦²ÁCo55 Ï%f^`b%j ©öÅ)]³ 3²Å.<@×üSH=ÛT:«¡‰ ¤w>A0sÁãúF: sáv²jö˜a=±>ë´×-yß¾oþ­BŒü endstream endobj 2313 0 obj 3798 endobj 2317 0 obj [79 /XYZ 32.2500000 452.750000 0] endobj 2318 0 obj [79 /XYZ 31.5000000 454.250000 0] endobj 2319 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 565.250000 108 572 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 2316 0 obj << /Type /Page /Parent 2 0 R /Contents 2320 0 R /Resources 2322 0 R /Annots 2323 0 R /MediaBox [0 0 595 842] >> endobj 2322 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2323 0 obj [ 2319 0 R ] endobj 2320 0 obj << /Length 2321 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWè`eöƒdØ;@ Èa‘CàÍ&X¬qö¿J$¥R_“üTÝlrh#™YµÕªêzwÕ›?þÇñ_¿ß¼ÿüŸã×öçûχìTæYóçxþûÃó´;µ¿K—¿~;|?~?|:|ªÿÿû¡ùÂç÷­ûßQÿRÿï—ã¯?ü©ýGçðíPª²þùëågUªú·ìúóüù¿ûÃñ·óŒÝríf^þ÷eQfÕy#+?t§T—¿¿ýíð¦9ÿ¬ETn¬rGe=ªÊêãÿyø¹ž¿›=;UV©²°eöÀ:¥>/¤ssTºªa®‡ë\þŠÌ®äç¶¥ 6÷eßÒ Q¦PþÉOÎeJÛ3ŽÏøÍÓõï¥iÿJç‚Í}Ù·4H:\ãÉï°Ë«:e!žëä@_™pWø²oaˆtX…sË!Õf¶»NÊŠCçÙìòs«pL¿Ù·4HZ´z&˘­ÎŠ`ø6yth§ÂÍ}Þw˜ Œç>¹¢ýçVvçeÉk­®VíBªtÖTºAй£:>Œ–ëìP^ߦ`s_ö- ’Žžðä‚x-]P"Üf—ŸÛUÁtˆfß¡$ž<°D¨òޱÖ‰Ãì6»øÜyæÂÝá˾¥AÒáO.w‡óz±Ö+äyómöx5Ulî˾¥AÒâu8ù§“à4Ÿ_ÐwÏß}9¼ùXk5$‹ã—Ÿë½]–l~|©A’×ÿ‘kôñËOÇ?f™ùø§ã—_Õ©Ðy·Ãf$«ÐˆrhDÃïdpý®S‘ŽX4bß‘÷p×p™Yçך‚ã±f+£;Øi¶i³Ë6óZ#n‘Ý€Z©Sn WæÒq'We—Þ¶©áȇËH~2µ­0õ;ÍìÉšÆ'|±h„Ú^Ç4ß¹}P IZjZX¸žÍõ7;ø~׳{ JË£Ô>µ„X”êLÕ‘¨vÄ:ëø<¥$æðÞT6ËÃ Ïæ¡x kH‰è0ìmp=ñ!/Îòˈé¢ÖÞÁG»„!…Vmd¼”Z„¿Ì l߃xÌE™í¶y,¾Ãxzæ¢GVD¨wÓI3·¢¨ôp¼å˜#X ùËô+ç¹Xx³θ$¯OõÒ͉UÖÉÜŽÕd¬xî"Þ$bkìãuˆKë’*˪¾m—Æ)bÇxÅœ@DÊš>„òèÑá•w:»ZÞ‚Ã ÚHl·÷ÕÂá Ø¼pÄ—r@Ø6bxßà\p’V Dp€éük9˜‡XEÐÍ¿é:+æ%ƒ» žb¡¡¸2æ’)Ý>0‘eRë’°ƒkŽÉŠ0ú(e.–0Á–½ˆL„xòø¬d EQƒ_B2Èxï¿g$×ÏV´ ?Õ˜zR2Uª'š<Ø„`Àw+[Ç \Ôb´H…]XÞÊ $š'. {žuÛ¤ØÉxj@¡Lw(&'eÀ OòL°À;h©ãÞˆ&Îw€“?Œ#-iÅÁð5‰ãDvãÄC[8UG'± “ÀLqò|'ƒ#0ÅIaœBüx¨Šà Êq"¤küÅãó`,À”:‡$’à27g3˜àw<²€à81ÃpóAõȸŽg?Ua¸aœz8,¼õòÏ …xöF`s½ÁxO1¶1 ~­óiG¸&‘Æ’S˜×`ˆÈj Cžà›Ó==ÂÀïäX"3:hÂÚÂëá\Εs•±o†çQc1ÜŽ¹3²\•á·˜^¢ZÌ®J‡ÇF’¨ò»DÝ%+é»xk2Pã;‘§•™‹-o.–&žu«ŸÐÚV:Bð4|Ÿ[áü`lë0'Å2Tö¤Ç—½§ð™.©‰å‹D;L$‚(áÂtÍØ«‘tJŠoL/òh%˜B Æ„u)†‡lNgKÂãZÚb”’d­³=6Ÿ„f&k‡îw3ÄÝ,òQŠÕL¤’ñ©ì#)ŒˆÚSºƒld|c£ù.Ÿ³ëÄ^ †i—²"h”²C‰’Y”]@dä[µŒNiS<“G„uÏ-ÁXÀ0ÀeÃ0âXæÄ^‘Ö8f „VèôuI\ ƒx$ë½4Sµh+ì˜Ê*Ά‘<ã•<®_ÑLoNÙàñƒ§éE<ÕKpÅüRcð`ÿSx®Ï‹(]«æÃ Äñ<›)ä…)ïÀt5ÙWÏv‚È gËV…³p9ÁwPöåác )ÖŠª'×bá7J‘h¯«^#ÅüNë©£‡F1tDKáÈjr˜ðI1¶56æio Ú™þØ’©)„QIÕƒhT…;õ4ZK^姬2/ÑÒØB÷jŠòÃ@œ®ÞÎx?]w\—ôò…b¥ûB1¡ª Ä«hüÊ{yÓn/§¼½rÊ¡m“µ8·^õVVÖ35…vÐb> îNS¡}˦#ÊÜÌqúlLˆxs×)(VZwŸ9hmaªŽ„ΰH#qµ×i“-ßA¸-Vðˆ]*P€ÂÛ|y¦ú3AÊÓ ­2ÚòJ«µ¤àá±LÁ°ušÓ¥EW*|ûGYhÍUã½ô<©V¢IÖÔc:üì ¦Và^z²‰hxXiÞž®ûüUJí46a±$eéÏ–ôƒ3œ’…1™RDгߑ»µ#^’ª¸¾ñaÂh«¬6뱜S×£äýnhR†&•™BX”»4p=gæ¶Ä2 "ûU)ã2•&WR®°Wßû.¤#¥ ž?Š{W½WÜU/ZŽ‘¯–²¼f5Þµ'ws@LÓ/å:óð¨¼Þå£ÜÌm!Tþ9Ùö±t¤×(GU Äž ]^ÛJP&m¥-¦DóÐÍöÉ\u+˜X=m½TÛΙXyÏŽáIär€ç;T/vØ|2éhjúÑJÝ;šmðªìI÷óLdͺd…Î:cyWòohD i¤FõÓútþú·ƒV/>øõðÙs?Â\¬ó^’Ÿd纀A›þÆ)-qF_OFt'l}Sº-Þõô²Ô mÑ|0 \‘tJˆc[‡Iàe|âLË<„ò4íÃWAÊ5 Dý@È/T/EQ(óÂ,¸Ô* ×·øÖܘ÷X}™AX:bS*ÄÛ¸%4“Ó%«oÆÒ7Ò3¨×@0-„'ñ²G8dÀ¸›¦§@{",@¨3lK Q§X¡xךODð&«ÒöEë⪵Nz~Ò”Ÿ0¯É1Î/ªº|€ù Dú U<ƒzË3`f*ëOÔd •P¡H"ZöMþœ`^¸MÓ4¯x \ñ½®FõN4³+Êû»ð:ô.²× ²ÃSÈ:ÓOH´šîyÉ  ¡D8vucÚÁ™•Œ)ƒwÀ8' D)«tF8K4§*iT†Hâ (c]f’±Lu*'”ñyGJÅÃ0ðˆ ^(âíÐ ÕÓ³ûmx×dµ±­™<[ †{’º19cVÕ¯CáÉ Ž÷æÞf¥é…_»­d<Íà[`OÛP¢MÓðÂó²¾z6°Ù~«‡Æ¯««ˆ4v­ë€¡èy _no'¢­øZÓ' †•R£ûÙZlY®Hq‚^bÞ{e®«ÆÊÑV®ë9.G;Øtï «fp!í¶êAê5%Dåæ¹µŒ:ãI2 WÌ(¶Ge0xæçùI¥N,Õ¨f6]Xnm½Ï®CJ9Û_3pÂÔœ&Ø£:£8¦¨ï*é0½Du>™j&˪đi&šØËɤUZ¨†p„7:¦·IßÊ¿ …õî·ö,ßÞ{ù&Ѳõ —oøŒ+zª=~ †â=ÞªÝûüšZ CÞ+×jx‚4ÊÝ81ý‹bxIAÅâÑL%Vaÿ9SÛ×8&x4–S†Ð —×#–¯¥¼<]{¤¦\㘠QOgâ62q!¦23£Q­ùŽ­¬aD²“Ÿ—eR|¾P¯P›Ž$5˜p^Ê> endobj 2324 0 obj << /Type /Page /Parent 2 0 R /Contents 2330 0 R /Resources 2332 0 R /Annots 2333 0 R /MediaBox [0 0 595 842] >> endobj 2332 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2333 0 obj [ 2329 0 R ] endobj 2330 0 obj << /Length 2331 0 R /Filter /FlateDecode >> stream xœí]ËŽã¸Ý×Wx ‘”D L?&@Ý@AÁä…ÁLNùýÈ–ä.S:”x|IQ.M#©*Ó¢ÈËËû~|÷»Ï9ýã¿§ïÞþ÷éÇáçûÏ/ÅÙVEÿßéòïׯ?ÐÍyøýd›êôã//_O__>½|êþÿëKÿÀç÷è~ûßIŸ~ßýï§ÓŸþÜ}ø×áK—/üòb•í~þ|ýÙZÕýVÜ~^>ÿçËuú×eÆñuÃbîÿþµµuS\V±ðæ¯/ã.Õõßü×Ëwýþƒ^¢ªÊÔÝÒ”'Õ–úôŸ¿½ü½›œ½8·¥R¶.mñÀ{¬¾¼H™ú¤tÛÁ¼ž¾çúOdv%?·im´¹¯ë–I7©òO.x®Õå]×sí.8|n³G€}SVÑæ¾®[$ã¹âÉEÎU•åå-­1'¥šú¤K+º gzQè÷“×ʶÑ&ïW.£[ÿä‚g[k£‡³­ëà¿MãlË 9Ž5ùuåâPéÏÖ3ù¹©‡ÿàïÜ«›Ë{;NÐñxÕœb2‚ºnÛœVò þÕìòs7Umî뺥A20Ïäâh[VEÛÀߨ•-TÙC¬%‚ÎäòÇa í¨ûu Cd8iüöôå§—ö\ëj\á0Ò^G>~éöôØzZ°˜²¸.¦ì¨ÿðJ;,ÆÖÕu=·Åè~1͹i‹û‘¢ºŽ˜sUÖ½iúg¾}ðþúAy.M¯âÞF”FÓ«fýô5\#|±îG”ç_3ÛÇëHu6ºQ÷PúÁ]ÒzxàhÃ÷U¨~_ʶê~_ýIªê\´æþ=ßÃÙÞõÏèqè’~@°`FŠžÆ?ˆ:è`tûÞ90eàôA&§ŽßW†¯Þó †…q÷ヒñ=ÏÀ#õ <†,¾ ëošçÎÃ%yÀ… \)$±Ù³âÀ0Â{®ßÙ[¥­Ãß<èCP{5ÐX3=ÄÎðˆQîÝýJ2¨G1s Š2/q4­y„°N7¿ß~‡„°¬Ì´hDág¾}pÊ”îÉ|$a6ÈÐw…¹EdA/6@®u¿ê!ð¼<,ŽŽeEmY¡uý‘Æç ¥n\j 9ã¯bƉ…,f­‡eià!T2–´ÝÀ%a* —„Q'Ù%¤úBʨ³"è6YIÀÒòcš˜xp ë5øÒˆ2ZŠ!á«NØÁ¢Ü‘ˆœ©iµÃ™(:Q[ÞE•¹RÝeæ‚B\d6ºk«ÅÜÁ=•m!HDJlصgdÍT’Ê!Ób¢™ÀªÖ”‹à𜇄¢ /Ã!&tÆ3=¾ ŒÂ@Ï{\±¢”ºRøX°æ…e%lÐÁôŒXƒ9NØ‘#Êù¨CfHˆKþŽD!¬Ÿ™Ã(šÄQVÚá ¦!˜ó¼G#Ã&Â|á IÞÓg§Z—GBÌX”°â]eÔú£ƒÎ¢Á%vtØ]µ„"1®mxP"0¡,%9îZ—«[ÁÂ7Õs5ñø-7D[¸ƒQ*™X´^Aá&ä/#7ù!ŒOœ°yS">ÎÃÂEm2yF¹´Ê• ’i{oÖ"K<(gó¶ÍBveƒçvMV‚ b‚IàÙñˆZJ+WÖz¢­K¾ë¬Š÷¥µ+“6à™—*²²Ò7JÞƒc.R?à0 ‘˘RLÀù<„¢nœ½)£)~ˆŸ‘c½¬eb*ÇBƒˆLì£ãÀàŒ$È`¾èª·Ô:ËÚºÄi½ ž jbð–PkBnã@<|ÿY²Š]ybE¼ÇCå‰nJ5Æ«N‘#jµa¢ºÔvYˈ‡PvpŠ•Oȶ+bRÏ`>[ÓÒ[j‡ç2øäQ~ñb(ÎúŒ Župp¼X/‘?‰áõÜû²²«ÓØ^þ ¨Î´2£2!GëÀB äÁVµ&År?uªR" ¬àEåBj½„1=XBH`‚(µÍ\1âŠzñ911Õ‰„É‚€8Ïܺ)1ÂH…aà('ƲªQŽb¨µqݦÑAy÷Ci&l%†¾Û R“+¾q´€.À8ŠéCÙ&/Æ$u}’cIÙA“vÁxbí Ð Ö+Ë”y@ÖªÔ›lj5¡ëcîm! âl2ÄÄ%ÂÑã±0ÅfDLÊ D”¡àh­ÌýiÍÉ8}Ǧc Ž ö¸¹’§œ ËU8Öφ÷ƒãæáª 8âyÆ ,Aœ;@$ž`žÂ³Á-&šw )ŠÑ;8“án¦H¥Æ‚I]]Ó1LI-Áø= 8¢àÌZ¬ùiÎÄ®ØI¬ÍoH‹1Ã#ÔÆôb’\!ôøÒ´OŠ/²<èÀ—_lÑ,Ò|OÎ'Þ7¦ùbù›+v§í·ÂlÌ5¶Ç+(ç¤Ú©Æ0À#Œ¼úd#¦}pÄóˆoø|°Œ,,ïâˆoxšà3¼fî)αO+­†ÁR­‚²ƒGª hˆGÄ‚á†÷C诌>#lÏÂQŸÁs mO®@Ù Î_ÖPbxŽ –3üÝ£ÿf,GìnH%ip¹®ÑëË¢•'ɾ›Â5“w7ø£ÿVs7KsÿŽèÁµVê3çüG¦ŠÂúðtÚ +»MØž*¸D¯s…( PbPÖÕ¹¬9SfÃs¶Dåaa¼‹[¨™jÏ Òɘ©ys¸›ƒ¹>ÊéÃt;ÀRÑ+žU•ryS‹<Ñí~¶Âö’Ýà"7ÑmŒƒ'Ϩc{Ž8‚ÆÔú–.´ƒVìAúk* Zaã~“6 lX·>̶^ Çæç“Ôö¡¿õÍØÇø”1sKN<Þ½W§ð=3„ ÌÍÖ¢ÙÆ‚Qv ðšm(þ47Òc¼=·»<[Tyž82áª27[ ᦉýÀ‘EèDïãZWÍMà-ö”¬ãΫgzbt… *) Û+ÍÓÂ>¿öëLGnáp˜¸±)ø‰ÇJ”ªÌ™DY0‘¢!ó<8L¡@bXp,núÜ/=j?Síp&ã./ Í:þjY!fPëIèÁ eNS̨m·1;yºÃˆ%TgK\nŠˆg¦x³(.…ܓܞC´ÍG´ÈðÚ¶t•±!冨†äeGY©0g(-a¥—Ê{ h .R%w&Tö8b–ç}à©à“Ÿ©­r¤ÛõdZ8mÇ=tϳeLñ MuQÃ[’/MÁJ‚Gòì±ú<‘`1Ÿƒ IôÃÌÒSáX¤ìetî©Zåâ×®„¼ì.áºpgÌ&R!kO€póÀßrÙ%Ñ©µlP„˜\~4C¤¸QYÖØ|…M*{”Úø¼ªžÈBTâ2¾9ø2ãÙDKóïŠ÷R †Çc î+¦Z„‡FìH28l]å–s8ÅË! †É2ï™\©T]#våÛž•U–•%)é/ ÙÆz; åæ«fDõ¨[—­¥bDOB!$ôAJ ]lª*T÷<¦VXÆÝæRݰ7$4a¬"º(zö#jOÙ:P+Ls-ú¤‡¢ÅèüV¶wæâ}éŽè–ì2ۉȆ>̲V1)纜Iv@}Û‰x¿J9òž>qOÚR"çÅG#·ÇÆèPGWŽ“_½¼˜Øº‘¬@MÜà(+ˆÉl«Ê=¼ P±f`O`®™H¼j*\I†`¬ÎŒÒ•ªpo"æÁ„-Ff‰ ìAb¼Ù:ݘµº§+Sg?/`€!ÓÄ˜Š†$ä7g±0a€Õ&BÇÀ ÉPà˜!f™%&’3˜Ø Ô€`d¦Ä>¥“oÕÑŠa¼Å PD¯9åj!tÿT61OFÜGQS4€%yf@p# eçr(˜Qžõjnì¹ 7¦®é–j›ê>¿gRXÔÍ@ØÉÏâÅH?U.ýdþ”aȯ„êZˤ"À™“Œ ƒ¶E0}RƒÝÓøÆ)iŸÑl7ŒíÑJ»hš [²1µ&Ã'æ0£XlÍF<ÆJY *•—–è\ŠwêñÎÊí3Z1\“ýº/Ó‡hT…,}6ŠlÈ£ê¦tyÑW6‹†ÒºR4†³½ýÖš±¼ç>ûÂyÊãâ²µ²= àˆlÝs¦û›ìN©Êë²0HQ†w¼Õ­›gÆý6w‡˜Ù¶=ÊxZ¶ØÁi¥êŽ’¤—Çù¦]Þ÷.{²$iÿ1@±)š ˜3Îj8am®gÁÚØ4£Ø'kz§,Óùù=6·0‘íÉ ì¢FZÆ·¼SìÎP‡‡ /õ¨Ô‰L3¼X~¿Y¡ÙEz“•ÔÚå% M¥üî Ö0>¦¨ã0IDÏöÉoÞœSp_œèí¤ç½bÉ Ϫ w•L¸ï†¼¶­ìz^»¹LEQl‘ºÊLuŒƒ¢÷ƒ‘ÇLEno7†c~CbÏI£ì ¢ú~2ö±¥µÅŒiÕ…q)lf„l„zÆa6 t…XšÀ‡WÝšâælmé'Jäë{ð9Ëbjr¬"ü2 Ê©¤Ù£3ËœˆÏr2–ý¹À“žiÞ<âŸQÿæ^ŒÙàˆ%‘x÷Kv ‰Rês#´‰cjÑÀÙ<&CÙ4aYóì‘å“.ªSBÝ'KO`6ÚÕ;#׸¤ê—¬ì ,ƒm¹Ì( ›B‹¸.Âù ²E ˜¦#L擹Ÿ#;ŽðÀÇd`Á„·®1E¸e±YÂV-[h}jÈcLGñs][å°™ ÏŒc©Š7LMKFQJD"¨|!¦¡»è~vײEiï×3×»÷F!:e1•=-Yêš2·S¼j¦·•"àöΆ{žÀzžù>|?öI1”¸· Ñc"„5Ó™ Ã̓‰Ö:žµa¼Æ+ÀÝj V J¡Tÿ5¸Ü+ÉkÏÉá÷`¸uTñ~<7˜ÀDcº{aˆbè`zMìÔÓНf‹wÝœ™‘’kHÆÀx ñͳ¶ Ž0kç G0¾áàý`èxðíM$kéºù> æ­×`ó‰lTB@ëz©%YÞ§h0dì²o›CŠRrz©> ˜Ñ{b&îx8’,ò8dªC€H<¡ˆm‹ð÷Pû'Ão:[6û¬ŒËרø¡eÂ?Uêä6Lр߭3Bž# Âjã`»§áÍ_Œˆx“­UÎÞ<ØDdpÈÒ}Æž!Ü5’ ’¨ 2ÆX>¹Ÿ‰1Õµd †¸(<õ¡H †lÄ›ÓVÚ¥ „ñ³*3íip.×zÄ’©æËÜ ]ÊòÂMÌE±kŸ QlDU‘€j/Â.2 sL}¹3Àµœ„>$0ä5+žŒ/ƒ,yÉ´aöô¬yȽHJ2°¹0ÅÏç¯=ÐÝ¿Ó׎æxIÒ§¥/¬ YÍlžE·ÜB]B²„s'! ‘s(€¡Ú8(à3œD1ø:Á½¢'&«Ÿ|°ôìC`‹æ¬úëp‡ 0,U½Ü á§Ó§—ÿ¶×^œ endstream endobj 2331 0 obj 6220 endobj 2335 0 obj [81 /XYZ 31.5000000 590.750000 0] endobj 2336 0 obj [81 /XYZ 38.2500000 542 0] endobj 2337 0 obj [81 /XYZ 38.2500000 542 0] endobj 2338 0 obj [81 /XYZ 38.2500000 491 0] endobj 2339 0 obj [81 /XYZ 38.2500000 491 0] endobj 2340 0 obj [81 /XYZ 32.2500000 589.250000 0] endobj 2341 0 obj << /Type /Annot /Subtype /Link /Rect [256.500000 563 348.750000 569.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 >> endobj 2342 0 obj << /Type /Annot /Subtype /Link /Rect [333 434.750000 425.250000 441.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 >> endobj 2334 0 obj << /Type /Page /Parent 2 0 R /Contents 2343 0 R /Resources 2345 0 R /Annots 2346 0 R /MediaBox [0 0 595 842] >> endobj 2345 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 2346 0 obj [ 2341 0 R 2342 0 R ] endobj 2343 0 obj << /Length 2344 0 R /Filter /FlateDecode >> stream xœí]ˎܸÝ×WÔ:@jDRO `»íY0l ‹ ‹`& ƃ8Yä÷SU’ª»©:”xêò!µÆ˜±§eQäå}óÞÃþðåoÇþ÷øÃ‡/ÿ>þ8üþáË¡85UÑÿs¼üúíËèö4üùØ´ÕñÇo‡ïÇï‡Ï‡Ïçÿ~?ô/|ùð§óŸþwÔÇ?žÿýùø—¿žøÓð—.áÛ¡QÍù÷_®¿w:ÿ©¸ý~ùù¿þÍñ×ˈãç†É¼þÿß6m]©Ë,f¾üý0®R]ý÷Ç_?ôë÷úˆªSè£*MyT]©ÿùûáçñÇÑ‹SW*ÕÔeS<ðF_?Ô4G¥»ó@çíï\ÉŒ.?vU×ÁƾÎ[š$ÊÔÊ=ø©-2®ÊË_ö·j[}þsc†ZU­ÚžbM-O²Ûà¶£îL¸±/ó¦È¸ÓpìS[ÿÀ?s_n/Ÿm«ê¬<Îß©9Zݔæ4òÛòbtù±Ë2ÜØ×yK“dà'Çà‚ûZ™:œEx1ºüØgÅlìë¼YÇà‚ûÚtƒ‚6m€}½.OûN…ó"úyK“dÜW~ýÇyb×ïõ¿}ýv(/ÿsöDÏÑ×ŸŽ¿+ Óýþøõçƒ*Nu£Ús$vù{×'ª½>1§ª¬/žŸåõIy*MºÝžè~´öÔvE­_½S£'ª€Oà;Žï|@s+Zi1Р:y½Òwp´÷ý;z|´`úS?ëç¿Úø“K÷Ã+5îËó;­=<ž ±OŽcšCNÁßqŒfìâA>^ŸT'£[µô‰†£M> ×…¥Æ¨ÅÛ£J88G…Ÿ`AÆ ‚7»U ýw>~=kÍÇ4Þ9î)€Ò3mki½aBÝé:›;r}çÉ@Æ{ïà'ZjyP¡Ÿ=È×ksÈÞ:¬ˆ˜Ñ°Ô’@½ùð’°ÖÀš~GVŠñ¬'ÊH•ãø°½ÏSå7á‚Âj0éf$ñÝŠ—ƒwëcYñØ]‡@®v%ìILȼƒïÝÂXnbnX-P kÄå ȸñÂ8—ÁM`WÛ>‚n᪙0+ <7‘ÈKõr“dž$à lÚe•cư:¡¤ŸpÊJÝÞÊÒL•á‰8N7°6&h žüi`úõt§¦®–ž¯àõÈø\¢YÇhË¥Òa –ûŸÓÀ©Ì18˜0º¬•±¬§pê§ ×Âa꺳H³ƒ‡Km­µí8ˆ„q ¥±@¡r$°Ž ¤1ëc/5!ðþDÒ:ÈeÂK—‰8™î.è2n UfyÖÆ8< Ù…ËÖÀP8\ÌÒ†W2` @*ÃòŽ5é;{¢9 Æc¢ÜÖ0Šr S Bm\¤Òaž±BÃÞuæˆR63-ÁC³Û!GY=TN©ð„öÁŒ²±èøIù1‚—ßTWŠ\þB'ÿÞh%|ò =15|¢àhð ˆYë†X)¤5ÞüÄøÎ`¨­Ã}º¿Šù¯î–"(9i°A÷ž|ð§üÖx9NªošÎtöIœ™¶õkto>ð‰ƒß¡'|?qpc'°<Öñ(_Õ´ Ô=õc³~q·t9o-ÓkóôözNÿúù{"«cÖ}wO0‡àw’Ë‚ƒ:ؾbºAMì°3̬ñÜà „m`Ò‘ú¶4#¿<…÷èfõªkÇOâ‘ÙÓdU/܆Â4;1ç÷L>¸§ÎÒÛi#‘è)Ã2޳="ƒë8g3"&@/-íåaÅ<ÙC.ÄÜܘ–¡ÒÝ…?ïèw¥©yDff¥)¼ãyåyå뾌 fÖEŠ2ƒØî9cq¨¢_Ц DÂÑnß’-‰Õ€«Ø\ôx8Yç¼£d-uç<×3Õ•“ÊŸ u!Í\W[v.–PÝIDù)¥þH†ÀmŽ}ÊzX`!ÒmàÑæ%J?ÙxI2Qù&sÄC %4ZŽüN0P¢ù¡Xõ–Ti4‘»ÊÆ ‰ôPMl’GUa¬ ÷°üËݰœC%Èä «î™Ž\¦;ÈÁ2 £8e;b&åüxû™3Q[›AûfÎýÐ!`C"¤ëÊr–%˜G¨K˜]ÊYˆÑfdÓðÍ"ïÅjD§Nðe‘bD¿CõD2MÓ¢ÀéZHm¿–òå˜Ä’(DFºc¦6‚iÄñ~GV°DÙ¨ƒÄP|€Üªn,ãU–Ð`(¶Ê“g"Ôš.SL«?” *êͺ êËŠË räS¬ª¹õäÉ:¸L2‡Ám$<6êü‡t¡°Ù—O$Ï3&ó3)Œ&&ó„';©]aò§²6у²ËÓ”mÜ<Žl¬ ìHm‘ÏmCFcjìf ©:­U<0x' ‡1¥é"xW`g‹²Ll$6&‹ªkD¥ÀúT&gyN„©H›FvÌì¹ÂGL~Bô°™JðÆEù~Œóm zø¤+ÛÄ.镽 xð…Œdyœ(!g FÝ371Èö '?Ô6ˆÑ|0éÃfF¢!Ù5·ùtÞ²h¦l±O,§!Z )¼AnµÅX²½62¾-M®)¤’Ëò·Ç ~Ò½kc®ÛÜ–# Ù€™±ÓÈ•ú4¤ÿ'Ó¼óÎÐlzo´ŽÖ³“j¿3Ú`õô K•'û<gà«;O†ææ{sëôâÑœºÖ~ç=š53Ú †÷Fû43ë€L©«ÊâJ¼OŒMòyÖ…ÿª;‚éŽyÏÎÍ1ë'Nž¥Ax§¥í”µ€;‘8Ÿ©‹r+XëŒEÄßIý´à¿l‘ã!1Da6Ù#›"Úbë”`zvJ`8J3ˆ;^¦å“[ßZ‘Óñ»ÿ !-TÛY&ÊAK‰/?à_ïH±·Oåºß/7T½ÚÐþ'‹8AyÜ V´'`\¯ØKÙ£­øO¹\0Ô³¸š²ø…S¯ŒªO—÷¿šöÕ~9| $#—YýŠ­ñ<¥-Â~;´UiSž0ë2kD@RÉ[-Xó5}ïñ=Laâ|‹j§–(ö£ÎgÝ<‡Y&®PÕ­o‘w=Cž€h­ì@ôìÀ·âJY0[¢ GÞ"]µ ž³Ùmh~’ª‚TX…•J¦0B±§­¦­ü'ÛJ¢ü? 0EýÖArxøh°,L… îjeúf˜ªQ´E]Ä#{ÞqÐG™e·Â›³Â ødú¶Oqn„ô™®M³>õ]Ù-ÔJu6¹=ª®<`Í&÷ŠÁ{ÝÞŽ›Å0¥Ç6p²"è²7Âa+B9ù¹ÐŽ«ÇÃV—0EF˜uËÈ8[ÍGÙfu}È´b71g{ª!k8ëj. Ã<à¹Eo)÷™c`½œˆ¿³ç,‚ç,¶‘l£|0&) ¹4+AS„ui™¼ Ͼ(ÆzÖœIöFÅ·äðD>}‹+«q2{Æ9çŒs²’.Ù»(™ïøc”]·–ऻ^s…sÑÀ„EÑ™¨QcŽÛ÷QÌä óÓ¹9—ål„QÞPyNÀͲ=EêÞ`‹˜™|Œ(æo,´gF0E0îdSk2yTÙ¨œ‘{Ж=LÏ:LŒ$2-D­C\rºä`‡ÊšQËAÁCÀŸªÆ¶¤ROñ¤X,-+¼aoÄø!BB°.gYБ^ˆu«l±-ì«È†’-FY/¿±TXĺ’W¶¦{#15ÈcühU1ê™ ?àh Á w]šSeÍ‹Ñ0°¢Bg¨R[{µ5° ÔüÀꃳàï`<¸RaP Lk‚…šI»cTÚü„:ñ)ãƒ7lB®HÙäƒE˜i,ŒeüFF­‹ì£=@¨#UþQÎ4vÉv‹-—G_ð¨2€ù‚2Hµy¸9#ÀâœA¬Ê#Âöʆԥ†û#qÀ"œ^ êeC-[ˆ™žèJö"5Y3†Mrd†ù\Ž"zÍ%Šd%§ogRÌS£ §–¡L®,È6#zÉ/ÃH ó­•²³#[/òÈù¢Ô[;ø¤³O¶· DÈéuݬéÎú…UBÁo^C¼]/"+äOÝU–”oíDˆ ®#aPüL*9§– u2ìÐÚF)ʪ. Ì9FØoyqîöÞŒáiZ›N[¦ó Ÿ¤æ\N˜¼cjwÔý¶Ùƾ›¹Pq&–׿òWIš ì-(ƒnˆTº‹´>Gê œTQ,_Çz¸ÿD£Þ-Vޱ®$w,ã7>V{,×w’ÀÅ[*ÛEC ?ûTªE*:nÁ“ ¹xŽ ‰½¥*ËòÅB ŽpÃÆòTÎurcÊrÃ:5Áׇ pœ*UÚkÛÝ2=ku§ël^ѨCO†…ß{ç#|ò=0³ï}¾S¼‡OLhÁmÊÆ¢aÖX! 蕺/ɧ^‘¯ÿÉ"º«åto‡Î ³ßë{ÉðœMK*˜Ù­¸–ŬÒ:Zçô½Äª©Ä^ï*wÕéò… BZÕ½üÉ/‡/eF _ç°T ûϦbk&ü+a÷eà¢ÆF ƒ¦1:™9†œ=OϦ˜6h¥X[ÛÒ¶7†e2©Uìx2ÚvE[Ç„1c¡•lý¸gkð\2WÌQÔòs—JÃÁ~”R¤Ž2 E„‹ øR´$žÄ,ïlo­†ëÔ{û)g¹”)z•uïí ñÚA¢z"m;oí1}±€[!ðº±lb®€–iÞtèNBjö ·· )L«Š£%†ð’˜6íô»@YW¬×±GJÜ€æ˜5æÂâYSMS +Åtcø€¹nk¾ïãG±FÝ  ½5r´ 2œÄð‹¬_#eàï8b F`ûÁXƇܭDÖVbk 5”×Hì¶C´5¾®çws9±Ü:»{®Ì.~‚é–1E÷û‚I¿ÏÄlêïn²Þ¡Â6™ðK0Ç9$U<ÃayáܨŒ\Æ’š^÷QyQ¼ «! yæðK0\¶µxç°”ZQx¥¢|MyÈu„óv²Ñ¦(ãõá¹AºaOÄáo3y¢ DP%&^%fíÐH„V–Í‚0™¿1v›Ñþ²r ár>gÉ@ê Éš Žã?C[E€’šOwåfç³Ã¿>@ßò!*Šž€gP¶·pï59ž™õ^QY¬47y…OWTÝ<÷íùš ª\×Iëˆ9ä®hªV‹eϘHŸ§™2fÖ Ç¾¯/ƒSb´ Gú«Ô5+­ªÎáü­+º‡j«ÖÉ/{Ê W(ûö³ð–.}ýEÆö9êÞ›'òªÆùô°ö.ÆàH÷[)2¼O!hGK.nfÐqE6`}êž^†"°a°-KD@ eî O†‚>Æp+x·=@›d‘Rß5뀤Àt$@À£ô-”ucÙ‘U'rC¢Ü—¥E©È;ø]$#©FéYèõõ4Ö‰Ê&ô (®–KVy„—Æ b&e Ì ¸„ç=Ü‹w†wŠö*J”ha‚7|nH,ªÎØ|ëqÍvϱO"Š-ìty\ú!',|͉Ċ_ÞÕ~þuü~f-'ç}žû X³½ R{&ØÙ;Ï÷¨o- ä^Üš;뵓>é«6yù¤÷êé“!}¡Oà /ÄZA"?¡ï˜¹ûÞÜ> +\ 1ˆ#Ž J[>± ª§ ø +s¬ï,CáÑà;ƒ$)¯¥7ÏlË2ÜåÏç]ùo´ú5¦f'ĘªƒÞ¸C;üÄ`.Á³¶Ym€Û}þÁ YÊ% Ŭ€7œm0ÉþNè;²}DzEá•2"gí`Bðñ¬ª3ï ï¦hOª'ú+9‡¯ze çÌàñóáÿÍ÷± endstream endobj 2344 0 obj 6572 endobj 2348 0 obj [82 /XYZ 31.5000000 573.500000 0] endobj 2349 0 obj [82 /XYZ 31.5000000 524 0] endobj 2350 0 obj [82 /XYZ 31.5000000 173.750000 0] endobj 2351 0 obj [82 /XYZ 32.2500000 172.250000 0] endobj 2352 0 obj [82 /XYZ 31.5000000 111.500000 0] endobj 2353 0 obj [82 /XYZ 38.2500000 90.5000000 0] endobj 2354 0 obj [82 /XYZ 31.5000000 524 0] endobj 2355 0 obj [82 /XYZ 32.2500000 110 0] endobj 2356 0 obj [82 /XYZ 32.2500000 572 0] endobj 2357 0 obj [82 /XYZ 38.2500000 90.5000000 0] endobj 2358 0 obj << /Type /Annot /Subtype /Link /Rect [60 488 91.5000000 494.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_introduction >> endobj 2359 0 obj << /Type /Annot /Subtype /Link /Rect [60 480.500000 123 487.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_core_language_changes >> endobj 2360 0 obj << /Type /Annot /Subtype /Link /Rect [87 473.750000 189 480.500000 ] /Border [0 0 0] /Dest /#ab#17#9f#f0H#e6k#0c#c0f#3f#0b#1d#9aI#b9#20#c8#04#bc >> endobj 2361 0 obj << /Type /Annot /Subtype /Link /Rect [87 466.250000 177 473 ] /Border [0 0 0] /Dest /#2c#ca#e9#ab#29#ee#df#be#97#99W#88H#e3C#d8#ef#90#bd#0f >> endobj 2362 0 obj << /Type /Annot /Subtype /Link /Rect [87 459.500000 128.250000 466.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_extern_template >> endobj 2363 0 obj << /Type /Annot /Subtype /Link /Rect [87 452 122.250000 458.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_initializer_lists >> endobj 2364 0 obj << /Type /Annot /Subtype /Link /Rect [87 445.250000 140.250000 452 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_uniform_initialization >> endobj 2365 0 obj << /Type /Annot /Subtype /Link /Rect [87 437.750000 126.750000 444.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_inference >> endobj 2366 0 obj << /Type /Annot /Subtype /Link /Rect [87 431 144.750000 437.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_range_based_for_loop >> endobj 2367 0 obj << /Type /Annot /Subtype /Link /Rect [87 423.500000 179.250000 430.250000 ] /Border [0 0 0] /Dest /#e7#81#3e0#26#cd#23#ce#5e#e6#c5#2c#d9#b8#cdr#89#ca#ea1 >> endobj 2368 0 obj << /Type /Annot /Subtype /Link /Rect [87 416.750000 152.250000 423.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alternate_function_syntax >> endobj 2369 0 obj << /Type /Annot /Subtype /Link /Rect [87 409.250000 174.750000 416 ] /Border [0 0 0] /Dest /#f3#0e#d4U#c8#191ood#dd#d3#e1#d2#af#a7#e2J0#81 >> endobj 2370 0 obj << /Type /Annot /Subtype /Link /Rect [87 402.500000 156 409.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_explicit_overrides_final >> endobj 2371 0 obj << /Type /Annot /Subtype /Link /Rect [87 395 141 401.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_null_pointer_constant >> endobj 2372 0 obj << /Type /Annot /Subtype /Link /Rect [87 388.250000 163.500000 395 ] /Border [0 0 0] /Dest /#7c!#04#95#b8#b8#abEM#bf#0b#1b#975#ca#cc#80#b8E#da >> endobj 2373 0 obj << /Type /Annot /Subtype /Link /Rect [87 380.750000 146.250000 387.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_double_angle_brackets >> endobj 2374 0 obj << /Type /Annot /Subtype /Link /Rect [87 374 163.500000 380.750000 ] /Border [0 0 0] /Dest /#c0c#11#b1#04#a2e#ad#fd#3a#8c#cfS#9a#3b#9d#e6#f6oH >> endobj 2375 0 obj << /Type /Annot /Subtype /Link /Rect [87 366.500000 167.250000 373.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alias_templates >> endobj 2376 0 obj << /Type /Annot /Subtype /Link /Rect [87 359.750000 138 366.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_unrestricted_unions >> endobj 2377 0 obj << /Type /Annot /Subtype /Link /Rect [87 352.250000 135.750000 359 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_variadic_templates >> endobj 2378 0 obj << /Type /Annot /Subtype /Link /Rect [87 345.500000 144 352.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_new_char_literals >> endobj 2379 0 obj << /Type /Annot /Subtype /Link /Rect [87 338 133.500000 344.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_new_string_literals >> endobj 2380 0 obj << /Type /Annot /Subtype /Link /Rect [87 331.250000 139.500000 338 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_user_defined_literals >> endobj 2381 0 obj << /Type /Annot /Subtype /Link /Rect [87 323.750000 141.750000 330.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_thread_local_storage >> endobj 2382 0 obj << /Type /Annot /Subtype /Link /Rect [87 317 220.500000 323.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_defaulted_deleted >> endobj 2383 0 obj << /Type /Annot /Subtype /Link /Rect [87 309.500000 133.500000 316.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_long_long_int >> endobj 2384 0 obj << /Type /Annot /Subtype /Link /Rect [87 302.750000 130.500000 309.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_static_assertions >> endobj 2385 0 obj << /Type /Annot /Subtype /Link /Rect [87 295.250000 269.250000 302 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_sizeof >> endobj 2386 0 obj << /Type /Annot /Subtype /Link /Rect [87 288.500000 188.250000 295.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_noexcept >> endobj 2387 0 obj << /Type /Annot /Subtype /Link /Rect [87 281 179.250000 287.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alignment >> endobj 2388 0 obj << /Type /Annot /Subtype /Link /Rect [87 274.250000 112.500000 281 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_attributes >> endobj 2389 0 obj << /Type /Annot /Subtype /Link /Rect [87 266.750000 156 273.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_ref_qualifiers >> endobj 2390 0 obj << /Type /Annot /Subtype /Link /Rect [60 260 126 266.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_standard_library_changes >> endobj 2391 0 obj << /Type /Annot /Subtype /Link /Rect [87 252.500000 136.500000 259.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_threading_facilities >> endobj 2392 0 obj << /Type /Annot /Subtype /Link /Rect [87 245.750000 117.750000 252.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_tuple_types >> endobj 2393 0 obj << /Type /Annot /Subtype /Link /Rect [87 238.250000 118.500000 245 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_hash_tables >> endobj 2394 0 obj << /Type /Annot /Subtype /Link /Rect [87 231.500000 141 238.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_regular_expressions >> endobj 2395 0 obj << /Type /Annot /Subtype /Link /Rect [87 224 171.750000 230.750000 ] /Border [0 0 0] /Dest /N#c1#a6V#e9#c8u#98#87#dd#c4#2dW#f4#2a#bb#d8lX#b9 >> endobj 2396 0 obj << /Type /Annot /Subtype /Link /Rect [87 217.250000 177 224 ] /Border [0 0 0] /Dest /#e6D#cfa5#ac#3bs#80#16#3ed#ca#2a#a6#f8e#94#faF >> endobj 2397 0 obj << /Type /Annot /Subtype /Link /Rect [87 209.750000 136.500000 216.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_wrapper_reference >> endobj 2398 0 obj << /Type /Annot /Subtype /Link /Rect [87 203 198 209.750000 ] /Border [0 0 0] /Dest /#9bo#fd#c1#a7#9f#c9t#a1#f3#bdZ#93#f4#d6b#07x#2d#8e >> endobj 2399 0 obj << /Type /Annot /Subtype /Link /Rect [87 195.500000 174 202.250000 ] /Border [0 0 0] /Dest /#3b#c81#ee7#ea#9a#c0l#5e#e1F#a3#fa#7c3d#22#3f#06 >> endobj 2400 0 obj << /Type /Annot /Subtype /Link /Rect [87 188.750000 247.500000 195.500000 ] /Border [0 0 0] /Dest /#d67#10#96f#fe#06X#e1V#5eS#d5#1d4#5d#91#ee#28#aa >> endobj 2347 0 obj << /Type /Page /Parent 2 0 R /Contents 2401 0 R /Resources 2403 0 R /Annots 2404 0 R /MediaBox [0 0 595 842] >> endobj 2403 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2404 0 obj [ 2358 0 R 2359 0 R 2360 0 R 2361 0 R 2362 0 R 2363 0 R 2364 0 R 2365 0 R 2366 0 R 2367 0 R 2368 0 R 2369 0 R 2370 0 R 2371 0 R 2372 0 R 2373 0 R 2374 0 R 2375 0 R 2376 0 R 2377 0 R 2378 0 R 2379 0 R 2380 0 R 2381 0 R 2382 0 R 2383 0 R 2384 0 R 2385 0 R 2386 0 R 2387 0 R 2388 0 R 2389 0 R 2390 0 R 2391 0 R 2392 0 R 2393 0 R 2394 0 R 2395 0 R 2396 0 R 2397 0 R 2398 0 R 2399 0 R 2400 0 R ] endobj 2401 0 obj << /Length 2402 0 R /Filter /FlateDecode >> stream xœí]I¯ä8r¾¿_‘ç&›ûj5àƒBàÃÀ£ÆãÆ kàöü÷­…”Ä%()E)óUfªD1IŠŒÁ/‚¿þË×ÿ¼ý÷?n¿~øú?·ïîï__È]K2þwëÿüiYÀÌÝýû¦¼}ÿñòÇí—//_ºÿÿãeüÁ×ÿÖýëÿnìö¯Ýÿþvûót…q•ú ?^4ÕÝß¿[M»‘éï¾ü·—ÿåö÷¾EßLøü'mcý(VzþãÅ%þüãûß_~¿W'TZ&Ä ÞýŸìö¿ÿõò×®}ß:¹Á)×LŠîßV M¤1¬û·æî?dßš ón Ìvë`mÒ÷ð§Jë´~Û’™ÃÚÆ]{J(W´ÜøÁk­˜[ +ëOÙÔøË¡©8¬íaÜ•gį4ØöÝ(÷øo\Ϧﶣ¢N PsËHI¨UDþûÛ®Ïs;N äèŽíY÷}6œg*˜ÌtüeGØAΪ˜-U1»‰[ªŽ_÷ãÌv‚™efö5ò@0‘iºýÜ‘y;Ú‰(5tçÇ9>ýþòõ!LÓ©ËC,iúB f¤¼-Ç)fÁá°!\bµìÈO´[,ëÇø+Ȭ§ç®AÍù%óOmWíHëPK,h¤Ù1%Z‚[A©î7<¯ØL÷ö¼êšanCËxíÝ¢õê;E¹=j—ãÆ]{JÆmN¦q''™™&ã) ¹÷ß^~ýÜQZ¯(oßþÚmèrüë[7%²{èöáÒܾýåöO݈ì?ß¾ýíÅÞ“~„îÍGð ß¼ß|ß0è à½aàoȧª_úyelŸ¾u´pø:Zå{}·gl ^-B÷S5à ¶R,ÜZaíAº„瀂kÓ ¼ æ@¸ø{à9€çæxlˆÖ¨ÞÏÏ–(:(ô !Q #@ôƒ™·‚¼ç7š·ÂšÂ£†Joxäm þ~ó˜¼ýж‰våT>À:þÔâÑXNnÀúýúiî7°ô~¶•ƒWA4”(’¯Ëåºo0û˜ÓÏ·ÓS>¤… AéP5bv £†×–à £†ûAتnÞÚHÍZK”ª»¸B?àüÂoPº A˜±Á¶C7aÍ k{p®/¢-mM±ÖµðN´ åaÍSÅé{aÓ2BŸa,„+ëÚŸuA)ÔW¸ŒÜ¨ûæçNôÒ;Ñ—þ´xޱxÚHaÖyót{¦XŒ÷¿à¯ÇP,fgqº]S8€ç­®ßœ7‚±Ó0rqº[Ës†YLBa媞b´kA·šp8<;§¯)¼g÷Ò1{´mCݦtkÝÖÈËô \ÛÊ~ÂðfUNÇp`Ko–0ª5g\Ùº„Wa ,x7‚A9!¬1ŒEZØ"p/°¬y…¿¦ ÏH"¯CåUßèòÊôË ûâÕ± 0AFS¾Kᇩ•Æ3ô8s7–DoÆéwΠߌÓ.î‚Qü±Êɼq,—ëgtlñ»Êèà͸ˆæU>lo(õczÕt±Ï›?ƒð3àÕ‡DG±M¹ÿÑ–ŒÂ™’»Ò4øtNãÏÀ,6<z#88)àgP¶¿ŸuÁ$ ·–/8]¨Áò¸y¸ø»ÀÕ(b]æ_õ±š˜kKÊ+Ãgùà@u'©ˆV±ñÀ}š¸Ï˜#ÝÔg¤FᩱCVQ¤‰\ø…ïƒõ4ÜšØ/Ù0"ÓOe™‡ÐM”#Vaʪ®Æ+¬³ƒwbšG\\€gœ/c1a!0Tn sÐ)¼ÝGÀÈ—ì–ëˆ&èÇýÆw\¯0†r#€EF>»´SS±âDh˜D`Q ,P ¯ÎÃaJöñ,eJ,}¢òHâ§:±¾˜Ö÷ìaâ‡I±{GyYÀlj˜Íëîë\]X0Xö!FÀá~0ª%ÙÐÀF!fYÖLÌR³N‹(Çex$úù{–Ên²V˜70Ø0Pµœ•;|È0GÎ{‘i_5àðáçúx«"ëæ$ü)tà°žƒéwûa,ÏàïJ­„°*¬{â[ÚA­Œ¤½žAt>ûW†Õ@‚b$FV=›òG)e̦©n³>(Æ}šM ¤6Rt;6Ç04[R˜U„EBî§B ãä—U|ªµ¬ëaZjJVyïϾ¾ªØ?ññ¥¹n•f·eB5¥VD…õó[ëƒç “:à9/ÖÈý”(O Õ{6Tó.À@iWH–I=æVíç1µkSI<¥ E…зJqs-q¼sK Ÿõåé¯%GÀ‹T/8·wŒÙ¬1~¢í¼ð^ÿÒ‘pðª„ö.›Ü¾ßxæñqüæ Ãâ .%¸ŸF.%TNˆƒ‚<‡úáÅ­éHWU&Ä\¢d&},—áQWÅ­¡°ºEÁH1sðìrùÒ0cªu:F H0fMåcÄÙtÝ)ƈD”R„ù°ˆ.¬“‹êÄ£kM¤Z÷l}ªY¨ÄQ0‘T=‡É§ bG#{–ç³òàˆ4*Eì–€}$/ Ê#¼–üÈpkæ Ì Û·î¥2Xo{ ReÅßÛˆ’üðTÝ'¯nW޶r®F5ñôsžå*t4‡˜|*:ÀÊÔUåUs@6ãúŸ[úKoéN{‰É‡Ê>†Gœ,Ú™|²ýÙÎét×ÑÊ#5RK.è sèó$8US]£Îv8ÎŽw»Lþ‘b‘ªt±xÛr:Ù^ЉJñ‘|qÕÃL”G·†×eÙ=’ŠÉKQP2ðœc‚2ëîøj¨9ÌÕâp£°oÀl(«µ`Š|·}5à™M„çðÚÚ÷5êM×Sa‚sÎT¤.ÉüÍœ3Uó¾£ÜÒ°«çc­i77&òg)ô.ü亜ÜoubU£îîð1ÌÏào øÆB­¹‰bì®Ä0S³–p>>qOn÷G0í¿Óå…G ŽÍyõÝšø7ïÁ±­1þÑšC‚ï[avàõÉ•ÑÔÓŠé³ |ÎhåÙçÀ‰†%‚´Oal¤‘J1ÚúÁ€˜XLF‹to‹Ø¦å´3Ù‘£sVš" Ñ…«,àãÔV­Uð¨Z4}+ßÞÑa¿˜-T ~B¡™çÓ®j¦%ÔcU÷••A;ÒìnO…Rp!ò”­"ü³XiíàTðcw@¯ê¦}ˆužáÅaq ',0Áo`nÀœ‘7 -j¥U\ lÎÊÀ¸hê:–ÎË£!õ‚:…©šlf£aœ ïU ºÞ™˜ ’ΉDtb«‰Ð¬«çà‡ÞZEu¤@O‹ø½î T•¼ˆÏ"ºaö†µ}rH 3 tXÕ¸/lþÏ:Dl¶ÁÎF˜íÊ‘Dk–iO›5‡l" ºÔòNlä…ãßK2Mj]pÆìÁ9RcºKB‹·#á4ƈ9¾ƒ7WO˜8Ë&¦Çꈂ©¾k«rÔ˜û²‘‚{w{ì¼…'wÖYÖv€gpœ &ü« #ðnýtÔþÈÁ¦Î§OЛB?ãì0~§#KΜïvHæ>2×–7îH<7êwóºÃ ;SM)B³Ž%úõ¼÷ðcz¶wcÈM“þ/M©J9½){h_òýE™;¥–C§ZzÙŠûèê»gÝÿìý𩏮äûK4’®Ìtl%üŽï/¿½¼ÿ%˜šÌ ÝÆ%tÇ }D[?þ¶ €1ÆÍ3§ãÃÙ'iE!Úì¦s˜Méh“*³,øýåë+©^èê…ÉQ}ÇpEJ’R½œèܵâŸtHõBå¨^ȸ®$¡ú®ÌT-©~êãTªŸ3‚Úÿ˜é·õ²ýb¾ºŸ¾'µÆßR8.d- zþ.r1cJyá ôÀT0Ç>ciGÀ‚:&ó%ßû«1+Nµ¸ šñÊqÙT &ŒI7bè&L_K„͈°›ß"ùÖ‚—©T#3OiTawvç‹J•„Çö®Xÿ5ÃÇpOa”, <…՟Ǿ£pß²o©ÕE%ˆ\i°:FïŽ#r· lÅígÌ›åuÄ=}H Í±ÓªÀ62ØFåv/PCIÚ•$»ÿË dߌ”‘À6"'° Oºá©Àj‰°vsªÀž³­‚®”À^1" ½ºq•¨Œí*Ã2¯2„^¨2„ŽWr;ê¡JI3œÍvô?*3Ék²ê¦ÍÜ,YC"ûñÂm–êÖ$+%"”¬”ÈŒd¥DG"¯/‰%ëPk”œS3þQ„’•ž‘¬”°¤–HÖ±–›a7gJVJ'b„Oò“¨•ºéJ«^OŠ2N`7f«½6¶ÍršRêåôè_ñ›9†ñˆczrÊ1LŤ<¸%#‚ïk9ŽðÍøGq c9Ža4醦3Ôa3"ìæTŽaë`óIc²§•gÙ"˜(ý:°Ÿµk·3'“g†. 63—`s žc.!cª¼Ÿoôµóøfü#‹˜«k,Ã\‚$Ý”¹†Z"lF„ÝœÊ\ÂQr ºYÌU7Ô•È ýHÂ¥<`ñ|.¬çsk—›ù\шÏËñyâ¥Î5°i_Ëñ±oÆ?ÒˆÏÉñ¹Œ½}IÂçrfì©vs*ŸwöŒãs»— P Û¥Fµ®ë²ÜÎÊL6%[lfC"v04ljã‰:ÇS@Í}-Gî¾ÿH"vÐ6Ç:v£õ% ; µDØŒ»9•¦òÂD£.þ¢×ƒÓ,¡òUÕëð§£@ykQ<ÛyÖø£|Nɲ`3ÏZò,#$ó,qi0çÒX²ÜPkäɩǢ®›™g­Éñ¬M4V§<;Ôa3"ìæLžeDúå”ûù6! \£]ª&2â›5Ë‚#OM4¡OrÅcV~:§“c?Ò½ —ó>—'¾fÎS|îPË1)ð¹¾›™‰yŸËyì9ïK&æ>wnF„ÝœÊÄÜãsŸÂ³ù"õ e6(¦¼Ê6¥Ž?éàÃ{ŒŸ ­kó`Òl‡)нeÃ÷™¹ŒÀÌ\æÀÌ<ñs™‚™‡ZNèÉÌì»™…¢Ì™¹ˆ½à}I"Å,efž»9U(ÊÓÁÌu±ýUnÁj–áäOß®C¤™<2lYpœáC®ù%…>tàäk¶†Ñœws£inV¨Žàï];9š8¹NáïC-' u÷ÝÌTåàï\Å.ô¾$ j‚¿Ï͈°›S¨žà¯*pDŒ×m‡Úèì_—ŠÚ˜åË‚Í i"l;·9l;OÈܦØö¡–c8`Û}73Cš¶›ØÞ—$ i&lûÜŒ»9•!í„mÿ nóª^º„º®pÿ=g&üg'À¿ÑË‚­ü'H|$|‰SÐø<ÔùkjÆ?FÀgArÀgAb—l_óßXK„͈°›3ùOÐ øŒHì^Hp¦ÅÎÆV‡¾(ßSÕ±½âÊñÍì-è &vY°™½Y , ‰{Sð<Ôrìë›ñ0X°0X°ØYÛ—$ìÍ&`ðÜŒ»9•½9oÍÞÛ»Uïw|#œÉ'@µ¡Ë‚Íœ)"¤©9¤©H|lB¤HÓ¡–ã< M}73gŠÒTˆØcØ—$œ)&¤éÜŒ»9•3å”Þ‰Ö¸~´jŒÀ]ÖEVÞ’¾ n–puLnç 6s³Š0“Bå0“"qø•b&‡ZŽ[U€™ôÝÌܬr˜I¡b÷U_’p³š0“s3"ìæTnÖfsC¯„ÙÆVÎ:\[…¡þ*†&³>±üvVÕ32’- 6³ª‰‘Âä‘"q “"#‡ZŽM€ŒôÝ̬jrÈHabÇV_’°ª™‘s3"ìæTVµÓB?4°  v²® Pà) têOövÞµXsôû‚q–Gú,Ø<ËE> I×è8æ¹(eJ%dÊ/’f¹tMÃJáo%Éáoeâì•$ÅßµF :5ã#ü­$9ü­$±ëº/‰5ìXK„͈°›35¬$ë×åRÁس­\KFðŠ8¨ÍZRRº–|ÁfþctV²tV&ÞXÉRèìPËñ  ³¾›™ÿX:+Yì[îKþctvnF„ÝœÊlÂq"b*al?݈ªá»œNó<Å&°æË‚Í<%"ä¥9ä¥Lü¨R¤ÈË¡–ã /}73O‰òRòØ+Ü—$<Åg&òrîæTžò‘ £ ê¾TIÁ^÷æªwrf áJÃOøp ÚG‡IìX‚˜”UJÙ.…GÊ–ÇmÌûŽB!ú>1 ›×¨µí‹R`„Û©àÅF„Ôa2˜ bÚÍSyvtÑ.Vl“lŸ#öýñ¢Ïñ󪹣"œ´T9œ´Lš¤JqÒC-gΨ'í»™Í™ÃIK›õ%‰¹#'œôÜŒ»9ÕÜQ'½ç²¦í—\vûçç0‹E+Ê5±»QGêÛÏÞÞŠ“w»¡¦çã½¾àÀèÅ"¶*Ì#"“þ¡¬¸!â%œÇþBS›ØUI®#€½49€½LÎ!¥IöC-'©M°÷ÝÌ’\çöRǧª}I"Éõ°Ÿ›a7§Jrãö¨ëä1“0Y1¹¡Z%Oƒ“áWÝgíIys²qWÉ^G…Mb¼çç$úôúÆD ß}Áf±h£¸isq*9Â-T>YFì¨àÀFQ•³¤íÞ2¬3žUš˜b ÆÔ­¾àÈ«hLJUB«ÞL¸†N[Ÿp3;«–’Œb2”ÌÅd¨Ä¹¬d“1Ôr– b2|7³¥$s1JÆ®ò¾$±”ä“17#ÂnNµ”Ô#Äd´ uÄ ¶w8±+Ç^a¬‘½6‡òÈ3fì²`3Ïê(8Cé\p†J܈J§ÁC-Ç“:ÎðÝÌ<«sÁJÇNѾ$áY=gÌ͈°›SyÖUž-˘ZÌ…ÎÇfœÞMÉf UàfY°™’m‚V6‚V‰çGÙ=Ôr”j´ïf¦d›A+›ø±l ‚k‰°vs*%[‚fï¡ îhj_‹°Ä+ç8ÞIÉšLpbA–[)YÓN¬iN¬W¦)œx¨5RêÔŒŒàÄ]»JÖ4vlõ%1%µDØŒ»9“’»ý'ðÊð‚M„@¡ÀT˜Û8~ÞQ ð!’¿º,ØÌ‡<‚ kžƒ kC5O!ÈC-Çg<€ ûnf>ä9²f1¹/IøÍŒÇòÜÍ©|È'ô¡Ó(é%¨ó¬F‰ Ñç°Ý†q¤`î ڼ܂³·ÕWx¶û“öŠ+>¥Z5lY°Y\ÉB¨eB¨¿ˆ–)„p¨åÄ‘ „¾›Y\‰„P‹ØËÓ—$âJL¹vsª¸’!†Žv@Ò0g°ø­ãv–SjR.–úa¹ˆ– åšÆ m`‹ÆiÀB·ê­E•#'žÃ眼á!ñö7Ûª5¯ŠcáµÎáuâòÒ:ŵœ¸ÕÐw3‹c•Ãj;ðú’D« 87#ÂnNÇzÂ:q,ïÄr½’ öl»U½'£Õñ=jlÝ t·ë =§ÓµË‚Í\f"X™69X™NÜqÚ¦°²¡–ã"ÀÊ|73—™¬L›Ø¹Ø—$\f&XÙÜŒ»9•ˬ‡•1=lêW†U%&Ȫ¿c˜ïøçʲhº 4˜K|ž>ÿËCAž÷nS­?ä’/ ¶JìN †ÛžÒ$ngCS<åPk”ÈS3þ1ÂS’ÃS;Ñû’XbµDØŒ»9Sb:eH>+Y M\Ø&`ÎÛ_{ã¡SŠáþú¹àÈ ¬Œ°•¬E… ÎâPg°qQ7I&ìÚ„guÙ²÷”!!r/æöåº6,ÊumX.×µIŽ Ks]µœ eA®kßÍ,cY.×µañI_’ÈX6庞›a7§ÊX¾!×5âÖ º ñ>Õ•1ø§¥;®E]tƒ‰Ži·C9 `8CÙ›ŽHós3ô›!Ã=æ¬P^l ùXUT$UTæÖiÊœ¢1é–DÔ‹#ÁsbBÝÝ&aA[ïÀßXè7n‚s­ ÙY/ þqdE}·&ê‡~p;˜T¼[û½ññâ™7 /-Œ üÒÂØHHSø…3;‘qá…wŽ£ â0×ïHU# •V¥î]WXÁž‹Â·OhƒÉO…É> £ÆPxTZ>xvjÜãž6‚ù.DJD ÔµU&3ÔNc]ÁÁzðYà;°5}†ÈE\÷†KL¶ÄWä€8>}.Þlº°Üßcï¸ ‰ªœ{ê‚©Š1€^ ¤¸Ñ©Äkâ*œ%J…Ó±/dÿ#ø0dß ªS½²ÃùŸ#P൧`à8ÜO¡µµ/=Xúû‹CjS¸­÷®¯FÍ.8´â|P›!/¥TDÌCîIvíd$K¦ã#â7ïÀßþÑšGÍ'eá‚ÀazȼQÐG/üϱhý¼2¹)G݉ŸD«€­Q/ù }¶ýÓ¿ôø¥˜9€WOt’Ø3¨òÚ7‘õik0í ¾Ô"ZGš7 ÑŽÛZäæ \íz²mŹD冫Š[ÅßípoÁ&)ÆJÞž¿iGîéfÔ;Nc.4¸= æ6¥Âvªê`1‡þë\q× †Ê­>‰W_L6–i…7pkÜe3'ÎŽXšFÛïý9 ¦Î›î³zk%ϪàÑ·‡Â`„b•3ÿBǘèáVžŒË¿‘#±‰b.ÅØã.<ųãX¶-¶cÅPh Lôu+XÏY«¿çÔh»_¹ làik”ä¬EDe±¢ƒW±*Ìu.V•c0·Ð”"¬g@X˜ø4/p÷çöG·’Å…þ²Va%˜ì)hGÌ„ön„Á·;~çtÔ':3 £µÈîlôõ-ÞŒ2@¥oܵ,u´3 ƒP?|rcûì¾4 ˆp« +#ëXdæ’ò2°y½¢æ3ŸAáÖÀß8ÉHw}ºžÉKpý¿»û…–ûšó"¤ñoš`Ë!CÒ…ßÀcƒW^#°5 ÿÑš3¢÷ žxÔ0aúÁ¬Ì) ¯Öx‰ó51÷ÑÇŠ0-ò“¯*À/·//ÿà—J endstream endobj 2402 0 obj 8652 endobj 2406 0 obj [83 /XYZ 38.2500000 520.250000 0] endobj 2407 0 obj [83 /XYZ 38.2500000 604.250000 0] endobj 2408 0 obj [83 /XYZ 38.2500000 604.250000 0] endobj 2409 0 obj [83 /XYZ 38.2500000 520.250000 0] endobj 2410 0 obj [83 /XYZ 38.2500000 441.500000 0] endobj 2411 0 obj [83 /XYZ 38.2500000 441.500000 0] endobj 2405 0 obj << /Type /Page /Parent 2 0 R /Contents 2412 0 R /Resources 2414 0 R /Annots 2415 0 R /MediaBox [0 0 595 842] >> endobj 2414 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2415 0 obj [ ] endobj 2412 0 obj << /Length 2413 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯ès€m‹ú‚¶ÇCÃrr¼Ù‹ì"Îò÷£nI=ªÕ|*RRרµ×Qd±XU¬zUõæŸÿ~üçoÇ7ï?ÿçøuøýýçCqªË¢ÿçxþõÃ÷¡›Óðçcݔǯ¿¾¿>>uÿývè_øüþÏÝŸþwÔÇ?uÿþ|üëߺ¿üqø¡óür¨UÝýþïËïm­º?×ßÏÿ¯Ã_~wüõ<âø¹a2/ÿÿ‡¦([sžÅÌ—¿ÆUªË¯ß¾þzxÓ¯?è#ªRª©ŽÊ{T­ÕÇÿþãðS7þ8zqj­RueëbÁwj}ùÐù7Ýv4×fòË/‘Ñ•üئµÑƾÌ[š$ÊTÊ?¸à¾Úªê©SÖòä¹ô¥ŽÇ2—y SdÜU8ö©©tmË¢màŸÑ«ûŸh}<ÂfT¶ÇDçyGÚh8¶àéíFéiSWòĹð‰·©—y SdÜT8¶à¦¶g²œiÓ–òĹ.Ox]4ñæ2oaŠŒ› ÇŽ+’u÷áh"ùyð­Ë2ÚØ—yÇÉxl¹Ó«mžî_qê<.?v©âíêeÞÒ$·.¸¯eÕ  ¢@ûqô´¯ëˆõ‰{¿Ïõàý)áéÆO¸˜¯¸ÇF=…eð(}šl?sú™ígîðI€üžþ(±¥ñ*´v4æÌ¯«R@ `âb±ýÖ%¨ÛÆs_„ß±&k`Ù³åÑÍØh piܨ™Kgˆ‰†M}¬‚&sÄÃ|a?$0O†¨mÇü‰'¯Fefìr¥Áå{’Ó0cЕ¥u7dbs+Â(`¼aŒQ±¡´ÁƒÙ)Ù~XÏ~`U|Í -xO$ ß&˜“¨oŽŠ$LÌÄÙåþ)ɺË7|yfð ù¾ÆÜ×øÊêkò!Ye%Û‡¹EXw#@G™?ø¨È^A…)Èeèá+¢ nÎ[Þ!ÁÎ@AèábæÃMlá>ú⬧éö GDV÷ËÇÇÊ•ÆÙ³T%f·ƒþNÎb²ÿò]+ßµRš¶ö¨ã“Ù:³u =ZUön=JÝkʈ¦2§ÄæÖíØüõAÃ3Rh&f=+‰Q¡ÄO)Ñf„× #±1E1‡l¢L£®±|ž“g Ñ–ÌÙ¦o[–5%ñsjgÏs|Msíï„1Q©º+xF“MPcbC©ê¸È®'r|; ÷z;gP·ÕgØ@œ5Q»ýèOÙþ àSªrµ£ˆdŠ&1àØTE(á;žrWŒd-½—¬X6qv©ÝÆÒ#¥—(ò±oï¡»2ϤTµj<ÉRª`îÎk1C]OBè8¯Å“?Ãd>á<*8kfÃSÕÈ-Ï2çéàÜ+ž:ño„­k¿¯Ÿ?"-°5Ïþîw²Ë@¡w(”sUæÉ9y¥PÎ¥|™„gTÖÃMÍ@´ª S“!AÏ$[¹ûËÛÞ…Ÿª4¦DùåÙ+vÔö»µ«ñ¹9@"4URÖ›¸={Ÿj#˜(€õøË0§`¨ cO-ò gõ2þT׆­'l {ømå%âE…ÊÔˆýLni‚êÐÆUŽL5[ü6±+(æŸ\à˜“Ê4SH¨‘­ˆ°ÏeÆ;Ceáõ²>&ü-Ú×*¶Dµ±%êè_«®—»µbâ"õ·Üq&±ç2fVNÛ:\ÃXW±Ë5,÷7ÆuœéZ9Tôô5ÍΩÛÎDzq9Q´7…½Ê΄SÕD­’¸S~T!ðGóõlìÀr]hór‚û”ÛaPc ¡_½«1ÈÇ%º™¾×xÖ8X†)*Z¢Ûàb½¢)ÙgEöù¤€€|ü„)²“ð¦5€‡² -D‰nÏù!N–pâ S¼›hœÀ”§Zˆ&PÉÒ:ÊùIcGX½ä4eHE¶~²õóÖϦíœtHÌ-ÛÙŽˆ`GÀw< õ˜«˜DlÑCÙþŠbUcÂÃzæoí n3F4‘J¥Å^)!Ó˜ôüleùögŸVV*ûkbÞz×ãáx¢!a¶=¼£ÍéÐè¹wZéÔ¹wCP4(÷®€Ý™<=˜ð;¸G~g±¥ê:†;aáì?bnTo±D\´*¯ñxŒ`‘EÊl¦;‡fí )\œHÃ]5+ÈØ A á¨5ƹpL¦Ñ|®¯»"Þ4uŠ?U=% ˆæêИTâawM®”q4`r@° Y*U+™õËjm0&’š/Ø­'z¶†ÌÑZ ”A¹‰Öì®d' ªÝ•²•Jé1sΓw®z ×ï骷åŒTá|ºI±<·;o2Hh“ÕÑÔÂ鈔3cLD+¾â†åFçRݼ\ÿŠAÊqÎ]W7vÀz4†Ã>ÄÜfw;¢ºÓV»¼]Åj[¹ß„reb3’`Y·ä?“—ÎÛî™(Ú+J󶸦ģ[…¯0*ÉŽ¸•ÍVhJq“­æBŶfü­R»VÅLY7SR›lžeâøQÞ²ÕÛXzóý§€‰ïm Ä=ãQuon¦ùFÂÆpZ›Ey:ø'Šõ\àð•_Æ0þÓπɲ„Ø8E‰ü&ꊑ͞ÆXp=º,Æ!2eP´»tfl97Á“°:f‡[:ÝÃ ë’øCÝÔ/9C ï³Þ6äað}1ݵ'˜@·A]Õ~4XƒY¸Ÿß=8(¦t«D«3ÙúÒÊø1•YcmÆìU€Ôz¾ï”„Q–Œƒ†‰þc8tq0á:3ãõ$×%.ôŽ *‰Bâ²@Ëš\J“c§9Õ“%rz mYË¿/ûý=Ë@ ½çÞƒ?Ì€ee¶Dt”R@ŒtÄe$7TÚ`9¾Îâ¼8€b¦9z€¯)¶¢ŽW‡ÂøméîÔZØeOÉs¦ñ‡ˆ=ËTag¤¡m5|§X„Ç*é~ß,æ û=ñ¸Â´×¤)ë.ïñëgW1f®g=ë#}˜_ ‡0Ù|k™O³ØYÑ­3M>¯ïó0–H÷q&Sô¥ºƒ?Ê•.U¾šlÔÕ®›­E;¡„xÕñ”qÊ¢YÐ Ä\Ô\çÚ¸êëá}L‘’'¨ #cNrXcA7û5Ë:`&~ëÅÃï¢ÒO)%¤Ü”w4ÄÀ= íÄ>¦ì.Ñ*}f`´L©Qªˆ5Æ¤Šø¾êàBÓdìÝŸ 2ÞB9i|‚Åj¬Þ¡%®I[n@ózdš‡ïrE{ETà–nò¯[¶yJÂFVU³;”ù7ë䬓Z'zÙ™{}Ü«Wç^ªµ#ý½€ég¥±K]mʬ«éêmÜMli—ì#ã§Â”‡–ˆGb¶³çtãF>x‡1W@îÃçÞÀ&C˜“Ö—}•øN ‹pläœÕfÁ9ó”þ˜{’fuíXZÅà}HÕÕ¦´õËOÞ¨zøŠ1ñ"íébPލ‰Ô'ºP茉aÀ„8Ä cz!€ƒTèàD¨W¯~( ½]Óa…bƒÜÐgAX=&lS7ŽâK xt|Í–{ `p~ˆ¦˜œ-¦ÓŽlÄÕ¥³RJrK$FePúS“¤ï¹uµÚ8ýÀÏfúZGE˜êÖ!|J´YUÜÑèžð·0¨ì]óxñŽ9ˆ²¼Ç¿·Æóþà˜Jȱz eäËc"_*síE–‘/=EÊfv‡2ÿî6’3ßž®ŽHÙoT©ªëÙ5d¹‘s3ïls”s1·_î͈9ïž¾*Ä\Õftû2]½ ›«V‹1—sòõsµY‚LÝ:b®.G<àsMѼüä­>Á¢xš ”²¹¿û‚pSfé"uw2‡Š¢3… 0€ 2¤’ ì3åÙðÞ2M®‰’1Ò(lHµ4"h°èGLuS•޾Ù¨„*[,ÚþA¤ž§ÒC´,*ž,E”Dðdæ|PÊwMaúˆ–_Ý@ßö]YZ(ølX-³.¦£SÕ*ÞhÉCÐjW§®ÒÚL¸9*Ð6áSb›j̸Ãq#æ /ð¼Cø¥²§ÛG ª†Ñ;ƒcZxp<” ·”gFó´`'xÔˆá¼f¼l­šo…ì±X×ÊŌұìÖwˆÆ–xnžÎ¢éÂÅÿs’é“L1/y–³þõßd 婱”Ó Î- _‚‰¶«:×êÖU3ë—ßó½í5æ»æzòÜLöä‘IV3áþÞd©ä„í?¬ìI«»;N¹Ù~ײÑsÙŽS²µ-„Bb68Ü8Ïj“Êäf¨ûzkeÉíë’ÐØÖW-žSŠsJñó© ⃔)Åm3ßrÅCEÍÀ;Œy ï#Ì}=ŽïM¤!›¢ÈI·÷ìÖNaÔ9 úpI·î%tAA|‡:Áð ´ßˆ„ÔKÒ‹³Tõ@O°‡x…à©•æ&sûMj3…]’œH=ÁZ‹iqˆ©ˆSÿ%ZíSky,+f·wIƒYÍælVKNS=Áº 'Ácë0'©îõÌlDŸ5K’G©„S¢ý®çÞÄè@¢ô‡cî–*–4ÇâÏifªõ¯v¿Žßºá½_ÿ4÷w„°š[S3Êœ Uvt9ê‘ë‰w+Ôïk}#êÔ[ãzŒN,²júd ‚>Ue¿/®l¿{Bß1s¡þ[sû8¬´¦ðü¤‚£ ð£ç)p²jXúdÃá½5| ŸX´ …Gƒï ¡8´ôïrÜY†;ÿ¹¸Ö¢pÇA­!½)€,=ˆ7HÅÁ,íyÏ ïÞ#8šÂï£ (а¹aêàYã3Ä|‡Ù|RàY•¥¦ÁžN~]4'ÕOÿ…x‚Dü.28«??þ¤sI# endstream endobj 2413 0 obj 5182 endobj 2417 0 obj [84 /XYZ 38.2500000 111.500000 0] endobj 2418 0 obj [84 /XYZ 38.2500000 441.500000 0] endobj 2419 0 obj [84 /XYZ 38.2500000 223.250000 0] endobj 2420 0 obj [84 /XYZ 38.2500000 82.2500000 0] endobj 2421 0 obj [84 /XYZ 38.2500000 111.500000 0] endobj 2422 0 obj [84 /XYZ 38.2500000 441.500000 0] endobj 2423 0 obj [84 /XYZ 38.2500000 223.250000 0] endobj 2424 0 obj [84 /XYZ 38.2500000 82.2500000 0] endobj 2416 0 obj << /Type /Page /Parent 2 0 R /Contents 2425 0 R /Resources 2427 0 R /Annots 2428 0 R /MediaBox [0 0 595 842] >> endobj 2427 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2428 0 obj [ ] endobj 2425 0 obj << /Length 2426 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷н€ À¾&@;@AÁ:N`ÄF&>äïG=zÌŒ¤¿.RênzaÏzµ¢ŠUŪb±øÕ‡?~ûûñŸ¿?|þöŸã÷îçço‡ìTæYûÏñü뇷 «S÷ûcYåÇ￞χÇÃcóßçCû·Ïn~÷¿£>þ©ù÷çã_ÿÖüáÝ_:ÿ…_¥*›Ÿÿ~ùY—ªù]6ü<ÿù¿ùÝñ×óˆýç:bÞÿÿ•Ê {¦báËχ~–êå×oß=|hçïõU¥«£²ÆUmõñ¿ÿ8üԌߞj«TYØ2»à;¥n>¤kS•®³£m¿óòKdt%>¶1¦5vK·4K”)”{p9¹SU-wtVà}?z¹æu0¹¶tK³¤“«cpA¹ƒ\ !Ο" \k•»hY/Ë’^®xp9¹Z¥UË“Yqþ¼Ž.Ï{kµ 6ö ÝÒ,éäêüTY£L©s{–ñY¾yUéæ÷¥éþ¹ŒceoášäåQ³Ÿ¶È‚Ù‡–ni–ô²Æƒ ®á2ëVBó1qö ƒ`}YÖáÆ>Ó-Ì‘^ªplA¡VF…ê0xÆ×Y8;ðBw ¡ŽÇ~ôÓÑþ غ=;^üôtøð ¬:oËŽO?5¤½|²ýñÔ0$oþ§Ù°5Ä?ýxü}–™‡?Ÿ~>Ô§Bç=…퓬†O>¢'ª‚ï|‚O>ÃÑ øÄ¢'Ò†)pP­á“¯þ|ÃßÁ3ÅÜÉ ð“ûáŽ1ðb>ª””ÃÇjÄRÀï`ùö@ÃÑÉ)¬ñŒ­"¤m0Œäàw´‚àÜRðõ©ñ4Á½D]÷”bþb™`üÂ6 Ù4>ÅÓ ­ªžRhc5ä¼Áóf,ÖK‘#¦\”PÒßä““O¾iŸìµê³Üÿ‰c´¤½íÕ›k/–œÃƒ1ÖŸñ ˜oÕø;K€8¾:/’¯¾ÈWïco¢›ŸÈ‘ÉSaÎÃHÄa±‰ØÙ±º¡×žÛ‰CíÃëÞdþš´½íö¨Äwò/;_gµ½`e8F_zevF™ž§XbÜ®16k‰)úµé™Sù =ã%Sª:{ÿ¤S¾¹'­ °'kÚ¢µWÁÁwºå<7Zž¨vÑV—‘ÔZ2eNFWªyi±úaý‡«ñ_…”t{Å™'²Bè¢S¥N¹-ªòÍŒ;;œ÷¬Xà eüŸ8¨†x0²3˜¦Ÿß]ÂO¦ÂÆÌá‡=¨Ñ%H‰®à;›kf£T+$éÃ¥õlÃÓq,ë?Q‡µÃóÂOÊ Bº’Z|‰ƒx"‚ǶCTx" Ô± ±¿ÃL!,žÃ Œ§a¿Æ‹¬¾¤RÇỂÞ9v`L Ήæ©{3b/$'ã¹ã|žŠ¨±öK§–·yjióþ,;Zv)«E %ý½ÚüÕæ'ª{öaÛŸ&^oFÐÖ}µƒìf²5©BbáŸ1§ ‰T!q½Ú›*$œ2ÝK…„Ÿ×ľdÏ7; Ï2÷F¹JU"—Å+ûˆUs“ªDÞqÇÕ¡ X °Mg6ÓÌ•`ãXQÈœ›Èn$/z¢ºÒ2™„³B˜c‰„"£ŽèŸ0±Ž \4’šì?(SDøƒh¹î= ç]¾í1®«ö^@]*¤ Êž1üÙþ˜:¾”ƒêñvÏšŠVwmé²ÏxêïUŽ1XÂà"›¡'­wzŒñöH mVi( ÙF!aç‡ÌzØ &LªJe>%HÞê0ù9‰ü“Éõ)†ÅúÇ8²é!¦lAûŽaÊrŠìn™ÉKw–¥Ö#gIô3U—Œ‚1`gç÷œTô(ȹÊÝÿÖç($e#m¹wÈYj!3É3¦Z‰I߯O]9Š»˜„·ݎ•íQRºKdP5Ý}¦ë^/ˆ âY®ñÄ€/Î^Úv9Á+´Ž, 3@€\à‚2|™zÏ@k©tnXÏÛ—ÎÍiÕæÀLû€à,í2= LÀAi„Á`°HÆ– k9¦Ë^ô;4Š~ÇBþÁßÙê¡_3lmGOœ¯а BÙ9Ÿ»‚P._?„ò Gª¶J¬©ó=ï:zN°¦×ª½ ÖÔ)Ó½ÀšÆñÕ—AA&_½¨Áê"¨Áé™ =xÔ„ô¬ÐË[„ô¬jÝótûƯµ-ßr?J¤D‹9ðcΘ™ó=Yt(f´0µZĹ¾ãŒ>DוžÞ;Š8˜²V|†+{K?aöÜfS^Fu½²;Šy¦GnÏ¥Ô¢5©Â0¬ wˆ WdÅ‚ÙT×uf“H/&ßßarPxÌ|¤aÔÅ@#‰Y¹TÉÞr¨ äþÚŒÝãxJŽÚcCvU0S7M†K‘oB2ÕýŽ}“(Š,6&Œâ;ð p¤¸(š€\ØA()zW–ZÈ뉊*På²Tøj¸©ØÍ"z…A¸»œàÔQ3¦ßi§‚ÖÏK¸µÁà{߯†Ï\ÃfPF¯HúF®ˆÞ¤SÈj5ñx·µIÖE²AÎ{gU9Ö Tr»ë¢ÅÛÁz¯U=Ò½ÝìRö‰±·C÷{¹ÌTã­2K; ÍqØC ¿ƒ¦} ”0Z1Å7¥"77¶]ÝM9L„DbU. äÆªi¦¹5bz8f=m“ü„·Õ›é¡r•Xð±ú÷Ekè© °^9Vƒ»-Ê·=:A&ýÅwÁ »!×e9ZÇiCž¥ ù+ßBº²ë^ðž­Ìè›Tó,¸7Ñþ*T…ŒhÉ´"Z–Iì)ò—u÷x/E5à`XE5%V™2%ÌõEÂÛ¡^cýöÀ…d¬Ö¯4¦¤Žz•=G¼ªu‹ ªG’ÛßC)Ór,¦É“Vf|¡ìFQ»ØXÈ4.(çNa€d*ª:ªzv[´†§è¯ˆwûp•ÚÔýdùI³ú™^ïh ß©Ñ;&ï }[·6ñÝgñÖ¦œQõ9ª[ÚŠ“Qz¤”Ÿàh­•'”E½Çó (D•둳f8¥§ïh$ßNÝçÞ£ i€v£½î;ÕÉg¡£€.+ܽºÇ:F›dÀq$ŒÏ^·ö&ÚËLo<¬\$  ìÇžèîÑë“OèIä ©W‘$‚G«ú»õî)Ôi ž hm^¬¶ÊŽsæø;ÌõÙxœYÚ!ñ†t|m;‹·žÏûÒ÷ÜdUL®9t òS6òòÙG8ZèÓÄ–Çkÿ`Õ™¶g˜@̆Ìd ¦ PaAÎöÌ·ˆàÐV­€ ‹­¦÷ fU­—5ãb…ØÆ¢þB0̘üÕj0ü{€ê·ÚŒ8ç«¶^¶x;¶Q–9\ÇßIvzI_^»°Ž÷#-ÙÆRÂ^Œ@­¹9OÀ’2m‡ð;`sËû0s ò¢KRÍ´QŠØâÆêjtí$ÊWMvIÃí-C{"FZF_å~k–p'2±vÑ&D¥§v_){ÀE¥˜˜o˜j(ì0Òž,!†$lj‹ZîgÙe›Â0 ú¸½"¶<ØÆÍ;ü„hçXs¸™a±¯s?δfp´ôÅ»(BGR`x]ÅóFv8¤¸Ÿt,Ïâ°Ñ8jÃïˆ"ÏbÏ‚½‘¬g¡ö¢ÞÈ¡;Ì¥Ÿ«ôÛ7¼¹¥f_ µP6ï7Ù}éßL=4QÞ![JCõ›Hå*–«ÜƵ5¦k¾cMx\Ígˆ]ï&ZÔf?ýhBº™ÜŒüÌ­as00]± MÕhc\KSljªg¬+ÇÌo©ž©Z›–¾16‚¤ŽXà–g}îâÌ417^mˆê´ ÍÍ&ÒúróKµ4=ž:­"q-•Jli1Šj €$ª ¨GF56PX»ý2Šu¶w]‘°(ŽÜ4NøzÆ[ˆÄ²-81l×Räã`õšÎZ¢õ?–=&b,a? ƒÔ§‹¢(dßö¨ˆLkl &€D1ÚJ3ô‹t 'æ}’òõ°ÿnò#ÎU¥§ÒÅ丛¬È€>ì³"¯*¨÷Á%Þ1uÚµH׬'V8wÇZ¦X†D³Tj¦œ‡ª ·—ñ¨a-wš|xºÇ#Zà9¶0“ŽÉÁ7c¹ÊG.K/›Ñ&n/äˆ]a´éøN¬fEodåˆC¿À…óAÍ=!t‚Ù-î&ææ÷&R€¯cPW wOBÈ'ø"ÏòÑ{{Ƕ¾fƒJBK`Dˆ4dÞx´~õØÂà@Ke2üÝì\:ç%R¦#>pt¨Žh³"ŸÊ[ÝfØñaÞ=Ôv6ÓØ¹\Umç›“Çæ×ñ¹á„“QKa'«9Fšf®iiÈ;êá„RAÁÖ]¨3kËd}Òm^{â§‹é“PŸŠI°¥vQ3ß1Kž`޶‡n¦Híq adž {¸b:ÁN5p=v43ÓPx4øNg•×ÔËWµeîüûl€ín{ ZC~S*Uºsß8ZfTÚñ¦ KËަð;Ähc÷£ sS×óF x¥Àµ*Ë̃kZùeVÚœÃ{Õ·‡\‹ðñøxø?Ey¦7 endstream endobj 2426 0 obj 4377 endobj 2430 0 obj [85 /XYZ 38.2500000 426.500000 0] endobj 2431 0 obj [85 /XYZ 38.2500000 426.500000 0] endobj 2432 0 obj [85 /XYZ 38.2500000 97.2500000 0] endobj 2433 0 obj [85 /XYZ 38.2500000 97.2500000 0] endobj 2434 0 obj [85 /XYZ 38.2500000 675.500000 0] endobj 2435 0 obj [85 /XYZ 38.2500000 675.500000 0] endobj 2429 0 obj << /Type /Page /Parent 2 0 R /Contents 2436 0 R /Resources 2438 0 R /Annots 2439 0 R /MediaBox [0 0 595 842] >> endobj 2438 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2439 0 obj [ ] endobj 2436 0 obj << /Length 2437 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€í¢( 0ãÈ!À` ääÌf,²‹8{ÈßÜ’Ú6ÕÕü\¤Ôm1cOË"‹UŪb½øáßþ¾ÿçoûwßþ³ÿ>|¿û¶«M]õöO_?¼ü@ûÃðó¾ñõþû/»Çýãîëîk÷ïã®áÛÝŸ»Ÿþ·×û?uÞÿõo݇?¿ôô ¿ìÕtßÿ}üÞ6ªû©:}úü_»¿ünÿëÓˆãt0¯ÿÿƒ×µ9B13óãn\¥:~ýöý×݇~ýI“(WWM÷Í»W­Õûÿþc÷S7þ8zuh­R³O¿DÏÓèÓDºíSO¦9~‰ ®äÇVÎfû·0F”q*:¶ Qu­{ÜÔçæ¹Ái¡Íè;V5±ÖM¸•w&Hœ˜cyxÅ—]”ó‚‘*Œâ”Gr -²°*aD&Mg5g’r‰¬k=ÁvÔ1/ŸžDü*Äþ•õ]D„ÍœÚÎéePu¨¼°R%¸¬ Œð:–؉5! ) q~‡7NóÆû]mYþwn£Ûp„sœ:ZjùC˜Q᎒uÃ`‘‘`bIAH—ˆ¼žXŒ×uʸÉÚÚ…›¬#cŠ|¼œ‘EÜ£“DÏkŒ•UÌKùî+Åâë—3ÞÿËbi¢‘qLÑS긎¥¾˜¿k>]Rû:§õ$U2“ p²Õ–.¹¥KßÙ×x÷‚…I« HÌ;Å’"=¡½_šª®Q¯s/.ãßernÄ¥.#br2Ñ0#NbÂ>ZlŽ$ÊØª"B‘†rŽhwš•-¨-µµ – Od¥ 1ÙïU{N`ëÞi`üIDøQ`÷Iìî©:ÌoÀLzgÐÇçÞiá;wãñª×%kål½Öu£tÀ ÷ÕÏÓ †OÞÉÖœãìs£Tbš^9P^5ÎÏpÕÃLÂÇ 1ÏPq8e¥AùHµ¶Á‚=5¦<^ä‰ÁzËo‰YåGt(h‰ è¨UˆÂPŒˆÒ㣠D/“µQ%"~“«2ôù¥\¿Ø¢€£EÊD£ ×>c!1qVÙl¡Byµ·š\5X)I¸°°¦O8=!„Bäå1Þg ’ý"¥¼æÝ¶¶Q¯é™æœÅÄÐU¥¡;ˆqñ [&ÉqÌt‡‰Ì³bì±Ôƒ 8©½€Z‹»„MN ¦–Æü‚;Q|¹…H¨‰Ð@Éî#uÕŽ³._ƒ_;‹¬ ÙVÙ‚ÓR¾P¦Þ˜2wž¬K2á„$ê%}á! P|ŠÊ™ð ŒŸ þ§sæ|RÒ(sªÙŒ²Í(“à$ãæ©…•ñâ™›¹¶™k¬¹v¯J™eWÐȼžÆ¾Æv™YÛõ40Þ4g5š¹IO6=±é‰÷¥'Öa_6JÏÂó~²#ñ;8o’âå‚:¹9•»˜RÝ_¼åãåÕÿÂ-*JùO¯¹ÛŸD“ò6>)ÕÜ’IõißQŒ¿Ä®UÄ‘_¢®X?·k ¡_[¯ªZû@õégÒɦéW ó3å™]àÞŒñ/lj3Og§lØvÄoMAǯýjx¬‚eïǵ¡ñJ1¿»Ö®ƒûšfvݤù\­9]à´|3§3õBØzX_-ªé¬(ò)ûãªÚ¶@“(b|ËvOHÈÿí÷(|†(uLcPŒ]LÏiQ'ç3‡K‘T á{òÆ**ÅÅ[a—j]G.Ö´•P—tk'’ö˜„Bª S‹ý«»1[v« ¹ÂÊö*úÔø<‹aÃçY" ‰Ï³ Cø€0Ô„ Æœ¨×¼Rƒ)·xJ€‚^ÌoÆ5šÃ s…ùšI[ÁüV Þ"ÞÁUvu¥º3(ÜCë퇌eGeùMˆî3ª—NUdø¹í Ë'\BÉð[„¦Øcø€¿%®ŒTÕîõ¬YOÆ3"ÆMY„¯ó–Íaê>d/£ÚYo ûÉ6w–mºœ,B!Ê6˜œ”ÛB9A5¿ÁØÉ{[5Ó–«˜%Ú Qͪ£¡rfŠX¨Âj&D© \8£í­*Ý-á EK•Âm‰A[bКƒ¨þ²FºlÁoÞžÓ݃7´lzº˜nŠœ­­Ù©GÄNÆqó1»ZjM°¶üêÞ¶M0'Uü=940±PZ<1¯XÚ²ˆ6‘D¸#áîhÆfIПFÆIs¹RL¸÷•é(¹¥]ôS¬eã(À¬³ø-¨²í¤6ƒʲŒÊ²mBã£X±q›H©Õ£I¶—„D-&gdÕšlÍa)ÉÍÄÙ+ÅM@ _ا6½I¹ì]ĺžõÕ]AÏü>ÁSÑôÜψ_踵^þÔ‰îÔ±bTböÁ5uÈÊí •‰×D"F…ª²¥c%‹½¬o_cþœlñb/õ"ý–p÷¦ÅqP²x­®ÆTé­xmÀˆ~Kèûáß$µây`¢Yo‘Ûˆ$õ’E`¾g]Ã5¥®öv~¯/.-AoÜÿs©!ö=î{¸¼D`Š,Ö¬u6)¿+ÅUo*’^1•´lœ~Kùtá(ü¶elDú¾ì0¥Æ|B5+Á‹á“Íz)È;…Î3Tïl¬?ˆ›Ì"ØYü~»HoóÉg£¦´ÁÕÍYÏM3 ×–Nb¦Ú$Ê‹(Ö86sò‘֌ߡ „ %êÊ&æPÌGÓM@°åó©¼ÜgyM÷ÃÌÄ8ƒÅ[YtåÔÝYïµòز~¯=ëWß_¾•d †d·Ò¦DÖØ²<…W\øÊð76ŸRr¸ Õ#ËOΟƒ{9…î…_ÞG±o|ã¶œ#þM9ï†e›‡®£i˜¯Ü[hñ,áDøï6._Cf -À^{ÜØC½xžl3Ȭß*¹Q{ýZÂ^CKüå)‰ë±ØÞ(˜õæyÍqYᙹ±µÕ#0Ëߨ¹Ëߨúe<‡Çì¡Çõ™Ñ"÷i»\#÷vâÛFá;‹ÞòZ7åeï Åw’Fž`L}A°E €÷ÌFîe…Ü¹ÇÆçiå#8À`¨Í„£[wŠ/ÕS‹j9©U—u3ݶ˜ˆ ÓÚ »®™@¿HsɪmŽUø¤ÉXXs6QÆÍ¨m¬M¶/á¬=/é´×áò°Ïp‘ IíË.•M2ù5¶©Í©¶” ¥†3s#Ù|¦3¢lûTŒƒ„L¨ÒIªiÅmõÏaºN]絤kig!•vyc—œÞHË„—åûÝ×þ±ÓRQ%öuî.Ðrþ¬ЭµRO§°½CBÂ9Áгmsf­=’õA}+/Ÿ|α“'ƒSKÜÄï¢à.ÿŒæ1s¹Œç`»V:9ˆ¬Žm!Ê5¬hÝtkàv^XšœY†Â£Áw†}©’–Þ<³-ËpO?w„®Ó ­!¾)€,=Èh,k°2?ÃÒ‘w0l˜z˜Fp4…ß!FtNl;j¼‡˜y*à÷ª,v0®iç7•?ô®Ì×"fÒÂaÐ’srÿu÷îjv, endstream endobj 2437 0 obj 3844 endobj 2441 0 obj [86 /XYZ 38.2500000 273.500000 0] endobj 2442 0 obj [86 /XYZ 38.2500000 678.500000 0] endobj 2443 0 obj [86 /XYZ 38.2500000 649.250000 0] endobj 2444 0 obj [86 /XYZ 38.2500000 678.500000 0] endobj 2445 0 obj [86 /XYZ 38.2500000 273.500000 0] endobj 2446 0 obj [86 /XYZ 38.2500000 649.250000 0] endobj 2447 0 obj [86 /XYZ 38.2500000 330.500000 0] endobj 2448 0 obj [86 /XYZ 38.2500000 330.500000 0] endobj 2440 0 obj << /Type /Page /Parent 2 0 R /Contents 2449 0 R /Resources 2451 0 R /Annots 2452 0 R /MediaBox [0 0 595 842] >> endobj 2451 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 2452 0 obj [ ] endobj 2449 0 obj << /Length 2450 0 R /Filter /FlateDecode >> stream xœí]Ýoä¶ß¿BÏ¢¿$  \|wúPàpúô¡¸4-‚&¨›‡þûÝ]Q볤ßH )­­3ÛK‹ç›3Ãwúò÷⟿ï¾ü§ø¾?|9Ueãªî_qùúîÛ´/ÃÏEã]ñõ×ÓSñtú|ú|þÿÓ©{àËÃ_Î?ý¯ÐÅŸÏÿýRüø·ó‡?…?ºüÁ¯§F5çïÿ¾~ouþ©º}¿|þ¯Ó_ÿPüv™±]æåïßyãªúÅÌ›ŸNý*Õõë÷¯¿Þuëz‰ª›JéBYc ÕZ]ü÷§ŸÏó÷³Wek•jjÛT+ÞÓèÛ‹t{Æy]Þsý™]ÉÏ­›&ÙÜW¸¥Q¢L­èÉ÷Õº€y×È£ç6yÔ»Ê'›û ·0Fú]…s nª««7¦² 0ßÏžó¾6é(æ·4JúmÅ“—Þeíìe/ûë¼×çŸþ­ZU{þ©ø6y‚íhÛtdt…;ùK_ë3{W­‡?¯X“¯l:Iý<¹üføË“Ím“Ij„ôKp7„ K‚O°üÞ1~Cú2i/^·jü¡Ewd©^7‰l­2¤A‰ ]@ì6Þ¹œ:½mNß§çòû‰Ýæ¬ã±?9é__Fúß ýçŠIì™þM—„Ó›ßû7Ãé82txÉ{ˆ32 ‰ pýirŽˆš/T;Œ®¯ÀÕ£»SUé:pžQÝ!Ô•ºî†žúñÌ{ô 1[‹f³Á+S6Ê7ߎTa6UºÖ¼ d0Á„ãÖ‰÷&™‚À@*øŒºŽÔ¥Qµ EïF;öiJÓV“ëIH`ªu Ì<µ¿S-\5Ä”Òð™9¼ `ªrÁV¢\2iz ÖŒˆ­[´/ýhC5yÈ!Ûô` Ø%¬ hC#P¯ÍêÜ„[ªL;ÀGx§-­iÜÔ üó5ÜÊŽøá$½OaJÁÓÃÙˆuuÖ)­¢y,œ$pßY¾í/ì¼K¸ðF£–ÃX1 ‘ƒW´ÆÔlƒ¦ “-ÙÒ~œM?Ü$x7Ýà•b\»€ñ†waH«ÁŠCä{82‡È”j­1C‰d…^›šÍC|ÀÙòÁŒ‰Ê‚¹FzÿérJ0ƒeñ>ëŠöɃ—Ž7‡tÆ1k¨˜ÜJ+/Æ’ËZŒYü<›§Ì®]úÓrvÍaûj(n5 GihœÛ¹‘„ ÃÛ‘ñ!µ—Ú‡AZó5[†A ;ƒU0uYwq¡99å ãàÃר†A•à ╦ OÔÃǘÂpÁ”ùŸÁû‹gƒxǰ ¤UÝ‹ª%ïÔBU0íÁØŠPPú5jÀpÕˆáÂ&*WVC´c3ý‡ž}ÃÐ<ò ÊrfD]ÊÛb¹÷N@¡(øŒH”/c4 ÇÅä˜=„Å‚±„© ‡jŽ1Ë(Ķ­HHMÔoaÙ©˜‘%b2g&'ŸØ8¾“ŸÖD·­¨â”™?‡ç‰ØÒ.ïŒÓÁòˆƒjÐg¤YWÉ}×Ú¡°\ƒµ#ŽJÄ*ßïNPa†]Ù–#öX‚?³<,Ä Ê*HŽQ—i“w Qr™CCùÀŠ .7ÿG„H #9FËù˜AÙ„dëo uyUi\ZV m—:“¢ô{8#ÕT£œ. «ï)Æ›lR!Æ''æ ¢¸[E)D9|þji×>¿ˆ÷Ì8M"–7›°d'Pœ³JB{/÷ÒYôÀ1[*e9áÜÎ1Yc`9¡¬å ^,G`H,ÛwEv?öeúÔ§Û¡ªÚ>u…¡ªˆsm, qŒŒ‘¯…lN/ÁÝùî³i„¶&Q‡}ü \é>ZÔjMó¦ÃC$±ƒßƒGn@Ð%.ÜÙœ38¸>üÚ|~íN$—YÓŒ5¹–³[φ!À|†¹ ¿ï=¦X,7뱸ÄË4NI Grö—Î`;ÓC»² Æ š F Ù)‹Q,…°ì„<Ç‘ÑDa.g=ÐÆ!`cè]‚tFíÖÈÛ}´Ç«ëvéòÀã×4ñ:,v;ŠÖ¼˜~ïÒÆÎiÝ5ÕšVœ‘Wg‹¼2[q…õ‡bõª–S»Ðuͪk*lGâ†ÅXOàÖ/˜ƒ°µˆi¯”Ó6‹¡ d[%Ñðy¨oÕeÛ[6S,£éÁ+‹Ýå´+üªË ¶á«H4”±ø*â’’#ú±&ú‘‡–×]а ‹Ãgm†?“GåÛ>õQ¸_hÒM®äžQ~ ëÅŒ¢˜ÌFó¼ŒqZÚ"VÂùöIÝœ678é'-‰b‡•!ÄÉrÄ™}89ŠƒƒVà £x…ÈysµœT¿mIRfn7PŽ2 OpJ'F‡ï9õØ£eŒ>€(0˜eÙC6Ëc‰cSŒÚ÷DP –’"ùã"]ý8)Ì ñÌJ)ÌdÄtóËd°îYϱò¬E»ù±¶?ZÒ'TDmÝQD¹ýòŽb²=8Ýûî8ÜÍ‘ Nå˜K,ƒ—Ñ€Õ§’‘û=†,¤¤mÌ£GÌÂðï “‚Ãz WìÍ9ƒé#dí­õ8ÑTW…²Vóö*5COCØC{´‹Gk¨×W&z—­¡lf«ÖÄ’”Š5d+#9æ˜ÀñvNÀó'&–+L$Q-,Û%HÄÃ&¼X¼Oœ8¤¬ÓİÎÓ«ÏÚ6û3‚2YÌÙ:qøë5ÆþÌRØ¡Ûcýs‰,<‘&ÀåMá8:sÁ¬ |GHÁDÙ±úâxKS’ƒ”£AU’Ò›Uµº³Ë/~ší?˜%ý©­›—  % —õnŸVŠ‹ž"{éD]œ¬¹yôð†)ñ(;hG\Šå(n¢ƒþ¾Òú%!Ç×Gܪ€í‘{æ œ*ßWM|³ï "f¨ï•é‰K™ÛÒRÜѺ.è8óXd0¿µsÖE»±ãÖ˜¹.ö<Â|B)ÉÂÑœL Jeo˜Fq†¼éz à6?žÌuW…L6†“p:NX]^ïÊJJäØc™NñÌðæåˆ®ó„ç@¿áÕ7^=7 Á=ã("çÌŸ*àv1¸½!nžÍh™C¼gó³*¢1>ÁÁÍ.î22|œo‘ÅT•" Ç?6¼ œöÒ¢-§X-_1Ï1Z–8N[?ŒÑg8°í€KŽÓÌCR’â+$ÅÑöŽäÓC†ìZ†#bmÇ|¡Ú)·Sw¡m{·3 ªªì‚5£íu¥ÆqÚãžyŸ©áH‹f $¡LÙ¥XérÐØš—#ÐHèÇ75RC>ÅCâÏç GVÀ–’À*? 0»pkJÎN¦Vð€F[M=ñLκ4ªãÅç‘L½ö·ËèñMª0ʕը;F˜ xFÐýÐ…KªY…"í{p‰C ¢&‚Ó9&¢^ïŽÆç8ðäWxrŠ "c{kÁ ©HÞ[¹®8¦»F¦j»í[9§P¢µM¹šl±Ú²áÝÏ:<@™-BJšy¢†Ê Ò-‘Œ&[Ä„e“ìA?ç\l9›ÏV IË)aeÝd bbd²š¶-ï…§g•#Š–´Ê(Ô\ôÀi5…sm1l²8óXé¿ JáäûW‘‹Rñ #3eSB¯‡º–Ñ—D¶©<«Ä7¢k¾+a¼1ƒNUQYD´_b„ãŒËz9—–sâφ™>ðFáM4_EÃÓT:¯qTƹC©¬Òã0®nŠŠs{c*£Äø N5W®ì<^>áÀ§Ÿ¾àØ8ŽÎ·ñØå@MœÿÀÙ0±VŠOl0µà•Îa4ýiƒ5·Âêã´ahI§ Ú Öýþ /ƒS5ëKënèÖ 8’°M±íƒó¢q¶ ´3 xÎ:N(ºL3’]Û7 |mAÄõ¿É£"Ö×CvzeJs]Ì£–#8ÕÄ NÄ݉¹Q—K\x´©”)}ËYÃu=³úkcœ©ˆ£$Œ+õ¾¯Iö®r/™;*C“éaÙA6#F´Ý!"b—©S#±'ù.õõî–n¸‹K†½»ÎìY&àüé}È„ºš÷sÞ–L¨/ñÃÝË|þ’“kãw%êæì|ÎBTŽ3¨‡¨ ÙYe\{Ø=/1Ò¨Uvl=IŒ0jÃvy‹³Öðl¸ú KsÆ9;QцÏÙ9z‹Q')‹ŽTÄØÁ2 IæBN7fvOMEUr¼úí©œ¨TÆ–~£Ö“Sám0v°6Âù9˜ÞDWŠ«tg=÷8ìdÌÑk5 ¬…@¼çžOíîLn¼1íØ. ¾ƒ.;à{^$o{~>ì€=سѺÝÚ^ûYx¶†%côÑÛæåm w+$G.K`{­“+»}ÑжÊû;,¨G1ψBMPö°=ÆY)Öê;÷TZ½&Ž÷vøì®))Ngpzû2:çÉöpܳG”U [= ìAc˜’°OÅ¡eNþ ~ÇCcèÍo-öóWñtÞ~’:>ÏýÁ‚ l?™¥¯LY©KjqË[ 5FSi¦ÜÍDNgeÑ¥î:ûx°F—õ¨¬°ƒ`ª(çz™kŠ0Û§°R”„‹­í3H¶¯6-00ÎLÆùâËPx6øL0­UÔÒ¿¹ý’Kp—ŸÏ÷íâ7ZC|³H’tP+8§gÅO4ñ † ïÞ#8›ÂÏ0f G˜q°aì`¨1qÞÃÙÌ)We±ƒqpOœßT¾ìªn_ŠX<z-9§!‹Ï§ÿ)p˵ endstream endobj 2450 0 obj 4022 endobj 2454 0 obj [87 /XYZ 38.2500000 295.250000 0] endobj 2455 0 obj [87 /XYZ 38.2500000 466.250000 0] endobj 2456 0 obj [87 /XYZ 38.2500000 736.250000 0] endobj 2457 0 obj [87 /XYZ 38.2500000 466.250000 0] endobj 2458 0 obj [87 /XYZ 38.2500000 295.250000 0] endobj 2459 0 obj [87 /XYZ 38.2500000 101 0] endobj 2460 0 obj [87 /XYZ 38.2500000 736.250000 0] endobj 2461 0 obj [87 /XYZ 38.2500000 101 0] endobj 2462 0 obj << /Type /Annot /Subtype /Link /Rect [95.2500000 473 123 479.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 >> endobj 2453 0 obj << /Type /Page /Parent 2 0 R /Contents 2463 0 R /Resources 2465 0 R /Annots 2466 0 R /MediaBox [0 0 595 842] >> endobj 2465 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2466 0 obj [ 2462 0 R ] endobj 2463 0 obj << /Length 2464 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ€ €$Kr H@F'0l#Šùûá ›³;ä|Eö·ÕÍ™YFˆ%-Åfuu½»oþüùûý¾óþóö_Ãïï?ïŠC]ýÿöÇ_ß=ÿmáÏûº)÷_Ý}ÛÛ}Ú}êþûm׿ðùý_»?ýoo÷éþÿóþ‡¿w?ü1ü£ã?øuW›ºûý—Óïmmº?çß?ÿ÷îoØÿv\qø\æòïß5Þ×õŠ™/Û »4§_¿ým÷¦ßÔGLÕ´¥ßïºÿ´ÞîÿûÏÝOÝúÃêÅ¡õÆÔ•¯‹|§¶ÇùÒím‹}Y6“ïœ~©¬nÔ×n S¤Z»‡[%ÆUF^\ï\[S씵>êÏ‹'8VkªdkŸàVÆH8U¼¶â¡ÚªIw¨çÅ ÞYŸŽ`Žp':T¸¶â¡º:¼-Ú˜¯Ó±SÙ¤;ÕÜÚ(Ž/®x®•«{ìtSGÏyñ¨¯M¶ö neŒ § ×V<Ô¶šÏ]1Ë^Œóê꘯ ëM²S=Á­’áXñâjçZ®,vŒ×ÇýÓêúkûdj;À­’þ\¥Åϵ´êÛR=çÅ ¾2éHæ·2F†S…k+j•Î ~¶xÄ×ÉÌàw3XX[ñP›AFÖêVð³Å ¾u©bneŒ ‡:^ûSÄŽþ' DöMxñݗݛƃ:ÕþËOh§Oö¿}éRv©š¶#Å/?îÿXÆÿiÿåç]{¨l9@8÷Ä}zòáK·Ûä6õåW¯ÁÓjÁÓ`üñ/U[tæSød€©«òÏÛÓš¶¸|RXøäýé‰?xׇo¼cô~"@àú'O?ðp l,³uóv¬qðŸöv‡²³ðê‹—ðÉøŸ2Xš,ÑVÔðI³ü¼>œž”gs‰œBƒ0ôðÃSè!¶ &Yˆœ ¹â n—ÀNçøµPŒ%–lÄ 2,ˆqŸß™¼)5‡÷#Õ!œ–xÄÞÌ»±”$Xi*%&H†²1CÚÐUÊ‚DÀPcù2ÖfÎ,æ­Éñ`B‰áåÉT䀯"û3“#¦ H©7LJP¡ãïP8ˆ8u¬‹ ³ÇW‘…†%Æ(¾‰T¥¬úL‚jrN¾z¡cÜÀ%7¡=ÛÊŽµ§Šõ¼\« ²S\„<Óu™ A…÷õùN1,a_ãªøw‰õj\1fÿÉé±Õ\xiÁó=q´‚‡8ã Á©ÊÌÛšîË Û ¥ç—„”`ÊjD ö=ä*]|Žqñ²í‡°±gZÚ€¹­Üèðƒi%bnal?hØkO>Â'-ü|‚ß ¬•MÜTbbòÅ*‹lM2‘I"^$(FÆÀ¬E8©Œ[$Æ.Âï,™1Ö1uüÌjL¤#B ø(˜dnRs–M; º,ÄxïÛéêaŠÂT·ãc_ߦ~\î/d ëÄDȼ˜Û,qˆ8¦Ã1IþÂ&•Ìè –#ˆW@äÜaPBSפ‡bΨeº4{Ó^·ÚOzÇC€3èTSúÄ’ ¡•;Î9 `ƽó½c+¸Z Wóg¿¬u—6Â;ø‹Þ ®F½LÑkï8bµV¶áÀ|€Ø¹}$e˜fÄ1A€TgìH4c: Ø­ž_@•1¦ØL®t6ãÏâú| Um.Ã*„µ3þTØ‘1rŸL%|ŽMõÄÆÇò<0*Z«ëê0Îg®«³LW²º¹0øü-!2›£ÛšÖ]*ûkQ½>‘@ƒßy ß‘M_ '®„ïÀýàï—QwŠ1ŠñVÀ¸¯…«9b5 Þ)¦*#Ü8Z£âÂ~0®q$R~"P¤^¼Ÿ> f¸R|ƒQ§)Ó¾gÀØa¸K1‹%ƒ·ð;>“qhýP"‚ïÜÕ¸|ˆEÁÚ'èRàg]>ÃTþ.ãÙûzvº>-•ô¯¼^€‘ªš§EUm H(È[z­‹`¤)“`Ks7°•’#eᇯfh.µž§2çÍöÜ,%’·rÚåS¥á-§~ä²To°½™‹.™T–G³ï°äìN'àÞR.¯Ìc;b'[#ÇÊT—Gu-ó5äÄ–‡bœ€ÝصVHv·Ã£ññ.jÒ‚+fp$ßñ2õ×­Mpá’néùëËPÎtÓ‘«+ã[O[ŸŠ¢yËPäÓ¼E¸¯Sé¾¥[ÐLJ•f¯ŒRV-›z¬Î^O•/V/í ·;ÂG‘cWcs §9ZMìwWÕˆåáÜs)¡ØlJ7›LÿJ¬˜Ž-·—gë´ðÄ\!ƒ34GÂ]$Û1Ï`À]¡¡Š0¡åÌ~¨ê³‹ô˜båZÔG…,–ep(Þ‘ƒ‰³Z·¸á½Æ …;b]Ú¹»Xã©Ú 9e›Tå¤ÃvƒÃÉš\\{1ýÚ—ùæ¼S6{D‹èëNÎÊîªî| /…šE@4²z´8Fê¢W&©ÒdDµó¤r3âjbýÎʺÍê²uµTß•#ŸáB p#]ˆ3f(W7#W¶é>ÊÓ}ÓD§û¦êtÝ»ny4‹„’¾™RýL ´ 2oAMNÁ)L†<3doCÑJ9/£ûüH_fSuª¢ "Ói“[œ z'HuLUæ«ƺvlïnÖ!ÀšRp:_ŽƒnºYUMê- QÃÊ_žNÔ­½n£0j20ºH17%µ…&éÏÎjõHè–·¥{#,^ª©Jô4"µ0­…­;/êäØúý¤U„1c}vT7(ÓñTË×’a‰ê"¡Â«Šv¤ð”#̈fµL÷7›§—üºëÑÌŽ¬£hõ>Ûõ®†â1kOU_Dâ2c̤½AÉ\Íš44ÛŽ>Al17}*FQÉJ™CÌÐa¬Ê‰sTDqlØ2îtÄUÂf`)•!’Ö¸¥ÀÜ›­ Q"KÝÒ©êÖ—ú:ÏÉÃ\Gÿ“Ete"T@ÝŒ Ç}μÙãÐLqxDÅ þp|ÿ×-Ýóü²û,po¶·¡Šîß§‰›eºËÊ/*´£¾ÃÄ»CŠ y1)Lr0¡÷sMh[ÿö–ÎðÏú©8)’Žr_M•~ÔrcÝ%§¯9jC‡ü†±)Ý©övä³ïàaÂ=ÅÖ79‡¹1´QCmñwð˜áÀMZÃs‰±É!ËãÞ0Fñ~Þ«å*’jÎý×o|†­éœ8Nð ½ØVËx¾Åùò¦iTg$Õz!ð‡7˜ËHTiÓÅ|nšüL”kQýbî0HR!5n¤‘tgR¢!W xgîÒ'ÜF)ïZ#Å)æÂ {‹XLF„“÷žˆ åéªá¤»šýuËõð7¿P­Ëϼ·´«ÖŒ¤mªa””×µ—cÔ ¦Î´½øT¼NåD½s€9/¯s‚aÍØH_eds/Dèmªh7¢;NŠʺÊ%C˜­Y`™fràs¶l»¤‹¨Z7¡•n±…›éáš:¤ºb¾…”€÷#t—€Op;Uqsobd­cZ…cì0v ÑGÓÓãƒJH¸Ó¨*U ßQ•òÌHWÜúœ\‰e–Ęóõ}Y]nÄí¢zÃ|ŠaS›ñ²@O Z‚QËP’Ðà¶ ¿…ˆ@‡Å Ïf+ÞÀ õº0…®°Å‚)S¶Ðò-#q±ÖÉŠùsnï}ÆH؆ “­h°vº ><ú[謆¿“Éæqê[„XÂáÅÆá`;î| ÿà'áî&„ô/Šì«Ê Oè3J7Öóú>ÌMk#ÂgÆïP^‡jì˧ÍÇéð1uG,QÏà “(|‡Y ŸŽA0U PPNM9NLÓmПOr7#ÍîÖ}¢ÿĘ/‰>ÏÔíëê:¡¾¬|Û¾€^òÝžÖ…5ÍåW•(û zç –Hw[«‡­Ý@‰4,CJ¤C¡­Ô¶†PŵÂa¢tYX –!3…Ðx§L‰t0vM5ä >áÚB¨+LùvžBèºpO³ßW/„~Ôªãl]ÚÇïLdªhçÏ/oŠ÷Šz®¾ Ñú´œ‚è¬'œä¸"N(ßóñ$tƒÕ蹘³LQ7ˆ¾EO˜‰cLqÕ„íÇÑÖœNU3RU+è&B‰ô’º ¦OÃ&Ä©(·(´Rm'Â45ôþú ç×'.J[3½Bt»1àÞ'õrÎ^^ÎçË™LY]·#¸þÐí)×m¶)™Ë œÂ誛\ +51S㘮[ï€{¨ sz„BiC *¥å„½–¯ú¹CDÓ\Bª”±þ¬Q¦"WZáRµLþÊÜ­tÔáv çXáý÷¤8ï¢*"³EÀ5®#*£˜Š2åÙ‡¹`³0SA—tk’…ûSÕ\x|û.Ôšm¼Mñv. ›3gÆõPlàÀ<±Õ<ŸlòR¶’6ùBiaœÿ%d†å’Vx§Û™fë²q–x 8«p£^Šz3ÛBמdÌ¥ô¾TÿêLÔªÛmød¶~ÌD‡v!„‹Ï8ŒÍ|G¥Ë?D×Íô}NKç¦mFTç°XºçàaBƵM9Â!5†ß ¤ÔÇ4ðgn<ˆû4îÅIºü é¬*©©Ìí㊭É}=–ºw-ÌLr(£Q—'N ]#òh˜[sft÷ƒ 6}øDp*-UwpÌ}f„=ñN¼¥›„9ïx•åЪèAíѸ`t …æ x§j|iŽCô¸EQ*nAy‰vpËâbúў趇ÁÍܘ¶ T«†ƒ!/íVoA*¬†¡fÇ`ÆßÁƒ)§'–˜VT£iL×j“KØõÐDo³ ^“Màð“Í& lÝÖ÷iaèÚX®<„l‡&z›„|MRh±¹IÈëñYpÕÆñ†~`Iñj¼3&qmóÛÄý<ß6“ÎR§ñà~F7ÝVh»¤º§¦iÍl[4c¢&š¹RñC¬ ±ç1×R1CNÌ3LŒD ©ÕÈ|ѽÎÞŠ~aÞNJä̈_yp] ƒ×o¾þHƒÁÕJ<‚(º³ªöîúúF75\Ð^[|âÅ'r´žñaêòÜ“÷Weì‚\–=‘&4DQÉ ^Þñ’É‘b2ÈVÏįGÄ–DC¥´ù]5f—Ä&1.Á¾¹JO Ì6æ¢à*ár&lj®0n<“£¿œ „EÒ;v̵¹{(RÍ6ñjj9ž3­üë¶¾äÕ5[ùÃ'¸Á½·ƒî郙#ôÚw‚¾òCEß‚ïàæûÁ¥¾ÖŸ&ßÁPô!Eú)¦Ñž0>WPݵpV¶\†osî ¼—+Šç\¨;é–Ÿt\S"ð #ÿ±J”Õ šÁoÒw\ H]øÒ(d_3x>¨"ªÍ}sá ¨š—5ÅÄ^¨n­KLÈ^µNé]« Õjù»ÍF;7)çX7Ö^eß'eS›¹ã"êýtîÒwZÕÇ!ÀˆZ{aǺýÏU™ÄW¶b’¬‘‚ß¡ŠúU¡ÆÆ…°ÓŒE͹±p /˜´:\Nèq #“ÐE$ê^ ât·_¾AØð;Ï/]º_ûoaˆtóiî,ÐóÍ5¢r¦#gs4^öÖ_RÏ5~êᮯȡ>úc¶ä<{Òã´š> †·=T ƃCkW¾ã朶k°} ;EÍ¡°ïÇbî°Cc²ÁÀø _t]Ù†Á«Áw‚J1Q[6 ™%¸ãŸ‹§Š2þ -Ä7E¤ƒxÅŠÏâ¹BÒÂ;6|zøŒàj¿C¬âq°aì`¨11ßaNs äU]ì`Üçw¦Ë¡ö^ŠèwÛgVÕ¬ü´ÿ´û?î³É endstream endobj 2464 0 obj 4879 endobj 2468 0 obj [88 /XYZ 38.2500000 751.250000 0] endobj 2469 0 obj [88 /XYZ 38.2500000 582.500000 0] endobj 2470 0 obj [88 /XYZ 38.2500000 227 0] endobj 2471 0 obj [88 /XYZ 38.2500000 227 0] endobj 2472 0 obj [88 /XYZ 38.2500000 128 0] endobj 2473 0 obj [88 /XYZ 38.2500000 128 0] endobj 2474 0 obj [88 /XYZ 38.2500000 751.250000 0] endobj 2475 0 obj [88 /XYZ 38.2500000 582.500000 0] endobj 2467 0 obj << /Type /Page /Parent 2 0 R /Contents 2476 0 R /Resources 2478 0 R /Annots 2479 0 R /MediaBox [0 0 595 842] >> endobj 2478 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 2479 0 obj [ ] endobj 2476 0 obj << /Length 2477 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜súÅ`vµr H@F'0b#Šùû™’3Z’_ÍðÛê&9ÛbIÛb³Y]]¯®úêÝŸ>ÿ}÷Ïßwï?ÿg÷c÷ûã糯 ÓþowüõÝ·?põ¾û󮪋ݿ>|Ý}}øôðéð߯íŸÿrøÓÿvn÷çÃÿÙýð·ÃêþÑñüúPÙêðû¿O¿7•=üÉœ?þü_ýÃî·ãŒýëºÅ¼üûwuB}\Å•7}è¿Òž~ýþãoïÚïŸõ[™º)w6ø°³Mp»ÿþãáçÃüýìfßk«2Tæï©ÜéEE±³®9º½æôKer«?wã}´¹OëV¦ˆõ¥çÖÛTkÊŽ6îpz´©s™]ŸòÖ‡*Úܧuk“¤ÛVarÅ}-9Q§¨ôÉsž<éK¢Í}Z·2Eú]…s+njY”.#¾Ÿ<á+oã1ÌqÝÊé7έ¸©UÝËH"P¾Ž'O–G,Ž9®[›$ý¶âÉ÷uéªP˜¦†~ÍW51¥rO*;Q*7¥2œ[ï;Ó Î›z™<¦Zëâ1ÌIrFÙT<·â¦Ú2ÄÛÔóäÇ0ÇuGÚT8·â¦ºªcøFß×¹Lð¾Œ'NëV¦H¿©pnÅM ¥‹g?}3»þÜE-æÑ®;’ý$L®¸¯s«£Naôés™]'ÞOëÖ&I¿¯£É?͘/¤ý ˆ…~üðåáݳ ö@Ér÷åçÃÚN¯lûr IqøKešÃ?øòÓî{c\óÇÝ—_š}éŠ~…툱pä#yD#®D#Þ¡ g3ø™ßW€ŸqÄ{\FŠjþÚ„gÚûøåÀs¯ã—0K0-³”EÿÑí§Y»/BYWÅ7ò¡[fU§•™Å†½³ÇG&ˆ;zƶ#õ¾nÌ`¤eÊbï]m_ŽøÓHØßÞu\F øüL Gð3pmîúÓÀÙ ¤(¤5^yF+A‹ÀF¶.|Ô‰‰‰¯î„Ž5û²²/9¬¥”-ö¦ñ/øÈ¼‡³µ”²®ºž'¸WòÞzšÏ`ê¸Gtþð‰1í™­o˜ÞøâN_Œ?£†+hªï¿o$F¦X{ôð3ð’ì‡á$ø»f¬N §¯æTøbüžÇØç>;<÷CuBnêàøù#ÂÇâ=#˜EùœŒ¸†8R¾€šóäÎ8§AÐê5<'xžàC6°Xæâµr¯ 3ˆ Á!‰…güíB‘Ù[Fã÷g°3[&Ö&Ì2pÕ¡ h0$þÝïºp€± T]%\FêIÑ¥j¦t¢+*ÑÈòÒ:p^kËw±w#3ÿIõ¼‚ÍZj[¿¯N]çhLÌÖÖG°ó[nxmÐl«Sî½u^l¹´Ú{`9L½Çœ%ÃÀ¹ppDXu Gð à÷`Š _êà3xmjñhš–ùƒ¿®,T½=AToÊ"½Ý•Þ¢`õÖÑ Ê ß…iµ4kí5—gJáÄï! C]3}¬îU-ß;ÙÛT6áö/fxIå̧bbÆäѹ,¢Ž,B3P’Ù¶ž{½eMS¾$ÑÔ®v |^àâÚÉÀ+$|ñ…¯Þ ¼â³ø=ï‰U?Ï_p‘‡)Š¿_LâµÕéøÒÚâ*WlsïïmDà$8¢{ŒGܹ€w_æcWÏølnS¦aºé]²ß |èùËËÄw”x9QÂÈò2ÀéÉ’L ¸§ù\ŽSVN§ö“ÃI@pmYn¼BnþúÙ|3rÃA¾ ØâWM4ÃrÓ¤²*°DYÜ`ö4K^¢T.K”Ë{O]ÅE°ÑñH*‰Bø)É$ ³§Y¢ÐÅÎu#r–ðÓsDNZÁÛŠÈ9×dM÷*)¿¼7îð3Ì{TuàšGÍ€gƒÔÁ…*†ñúq”ž,<[Wi œ¸áœ#̪à‘mêC9q%¶P¨³ÎY‘¤ü.lC&ŠS#pðÉ(p9#1âý[Ñ9kÖ,ºúãÞ´æDݳpUÍ£µª_-ìæ^|æ›8%‚„½6’Fó—Uÿ 9ÿc«#Ø2Ã#‹g†¬Yó¯@¿3Zœ‰y1rK ÕÌl˜-ØiôTÝçÏfu:‡ðP.'Nzª¥¬§$]³žZ>‡,k0“5X§Áü¥À:k°äÄQ ÓŽ,Ÿ-—5˜Ä£Yƒq§1ë6“u[¯Û\®ùæ=‹ggRº¸µY>o3ë6‰G³nãNcÖmæè¶+À@¾ê“1=†‹ À;0Ø«?ãKˆ04F‘ÃÐDxdƒð›ÇQº–Áçh®ÒÛ]XOÑÒ\)„ Á˜Hº«&ÖÖÇ[ßï嫤 u|à÷è"/ÇæoŒ?…7YŸš‚ÑÄûÄ#•ÆD:¸}/µ$Fß¡  ˆÍÎCÝÈPåÌÂgLW5¤£+öR°} €²—É>Η»¾7mGí (Ù†Åd‡E™ î¡ô^œ~'bLY†æÖ–gÞÞnÁ£°vK„wÊŽæ5l­q‚(Ôl˜áG˜Ž3”ÊèŒsÁˆ|$f@TêžÒÛÃçΘ¶/Pð*U:yh-2(f4ìïÁ#VUУ¼=Ý>ØpÃÝgðÎaºF¥ ü1ž&Óg‡‰¨Ú‹s,zFnަOnýæ!psˆW7Åùwñ&ö=œ ¶9èÁÌÇM pÛ¦™AÇ=S­>žÔÐjÆï©àlD{á=xmš§ÌË-)äHJÓ^-ß’b –l²x5£µG!&LÊt_º,U@]£wFÌž $¾•evê)‰I¬ÚîN £;ßê ê„i„xS}àUI704~¨ô`¶ ÁùVºh`8¯¨ØÂY.L’G3ËÎÂèLÍ1¦F¡Å¹`×p;"ÚhNò+ÑZXÐf3â²Ë«ø¡ÐG_™›¬Þ­©T·›…ëa’›GßpNï™A"ÍD0ù™€ JDZ÷â+‘¿*.·M‹®»½OR¤PÔ¶_úÄjM0 "bfÃÉÏ‚š&L"!)9›^+0½ta„1 Ëšaw±‰—ËŒÄ@ëž×"ä(æ\V,Ý¿ôç.}ªWÌÔEòŒ&«*Fq¤îy8IŽEM„jš2e}N¸Í¦L6eÖnÊÀ¥ËG‘p¦`.0†‘n½%c2éFØÈÁ|€«xñÙ&L¡CÝ.ª+Ha2]×F•éÃbYem”µ¯p};#Q>Àúcy©Šu^ÞSÜéª×ªì›nRµvLö¼Ëœ¯zß®pmûM6>²ñ‘W9Úž,Ú¾fàÌñËß`ºy‹ o8ü,•uÁ݈¤,V g%:Yž®"¼Qû¸7[ÙÂÈÆ[³0pVE2Û#Uëöl¯d{%Û+[·W.%–Ù^ÉöJ¶WÞ˜½òvZxdKFܹlÉdKfÛ–Lu¾ÑÌ–L¶d²%“-™8–Ìâ [²%#î\¶d²%³bKæJbVs.·­c4•‘ó{fäG10<ÊuЪ¸˜Bo*˜$õ6.h•2M»˜Øƒ´ŽËû©/Æà©:í¨@ÖãcÕaï üØ[2˜é7²` Ð4¥ ­Oµ¸IÅ·© @îMÁé"&3F ¦ÏH|©î—Š¢Œ¶gø€i“¥ª©lu¦¥Qx2Õ½¹Øà”¢K(vìpø©‘Á%…jRì¾á€,`‡è¦òáÝ*ª€Cxï)AQÃâ80‚û‡b®RMö¢Ââ8üW |Oó¯!ÌŸ™BÜÌu£eˆË A`îÅ¡Z&ă«ºØÄ Öí<®{ hM†:Ìl à]À+ .)yPiY´rXÜ™ Ø (2 ñHµaïM@VÚX¬#¤r¾à-SÎtëQ—ÕÅêzÛ3+4«  €S!Ä©\›1;8£1èšoå¶ŽI0¯Ú‹’öÌþ2ÝŸ9ö„vþî;õŽÿ)sƒ)KtwQFCQ Õ1÷#,Ó¡58Gè&ºõaú>Pª6·ªŠn ÞÞŽC Þu¼O1nB#*ǦòC娚ݡìr©"'ÍpÆR]nÓNx¥æÌHÙãÓŠC€B$°Ê¡m#è2W„o¦2#_̬œ{sGî˜ñ}ºÜvgùcx»Ì©Ü_Õ¼'æJ ²_ß%œÌ2úçà’2AºÛ/ ·7Ugø2cCëÞË[I¯» PT7ZI¸P)-ÛT×-Õ&TŠL®ÎiBÙÍÖh¶Fo±F]Ñ÷cöØ2".]S5˜Õ­íSÉù`n¯]g±Ð´ðOh„¹%>¹DX#ÌÖÀÙZ=àrVçîLŒt,QíýÈax†kspä#zOç–{oÝÀ‹*Ñ÷ô¨^³=kÃï‰Ï`Æ 8Ì6pQ Óï"¦‡3ºÏZô¸6¡YnNOYÝ¢“Ñ‹ãÖš¬÷.qÔ2®qç\3äil©áû<âF^(†Ç÷yØ Úm 7—×î# ŠáŽàðõíU›££&žUĘšºÐs@5Rzºpa·‡B™¤}Af¥ÀW‹Æ#2eaËSŽ‚â”Æ1wL’!êéNhI(·ßµ%£QL¿ÂJÂq‘ÙŠëp•ɥʢTÅì–Pî.—axsÂÛ³Ð/—1/>ˆccŒeÇÜ9iþC:ú6\]r_ &—ÇÐ0 Ì•½ ŽóRÍÕͼLyRø> æa†sÒõœ³ZòiØêiÀ• u<±suðíïJÏð•ÀmiÎE,0À ë‹l*§xƒáKªÁÎfQxÃ!ŒxÔ\é‡;¢’yÊÄ$±sÅTõm×IpAUÑî甡ìŒSƺd¿˜¢œÌ”x[… ׸Ÿ[>d·ôÄDÉö ˜ìèÑ&Ï8dÃ%Á ºEÝw%V¦>ã;h•÷‚ü·üáWUŽ3R2(ÈÁø°tvdTÏø$æ6”¡ÿŠ>1Goª[R=•ŒÝ¶5®›GáÏéz£ü4¬£îäb_HiV›~“ÅL­ì|þ1EW]åªÀ†lÒôtõªðå„»#˜ÏŒOAìå‰çTiTp€1S²&¢x[p–T1Ì‘Î$áU Ðà©"¾º{SqÕÈ2ÖÅŸ…ÊÎezÃGè‚é:rÙô};¦ï¬mɶë*Í ØZÈ÷·Â~X*†G‹Xv‘‹ø•°eY½Ü»%+aa*®„õ]ª…k<®‡tgVWÂÊÑ."6USŠ+Tá3¸ò¯ KÝW'Œ«tqÍo×)úÍ©»¢¸ú¯ O‚Òq781˜R=p-.æ#Ì-˜+q1\®T8 Waã÷\ÛE-NÆuàø™\9õ=÷É;ñƒ‡ÕWlùJrÊ£ÁÞ;¾Çˆ\¥7£¤“)ÏÄþØíWF±KåUËšGƒ¹°! Suw!%÷ö¾uÉÚïê¶uŽNŘýqŠƒ ÉÌ ) )ÀÏ £Át^! '»èÊ­±Cí?Ѳ)ïdb6”w»xº -{/òQU Þ}7Wª¿õóÙLÆŒ™$CÝèëòEßLL}f•åv»ù¬Œ=¯ÚËJ²ÉÎÃe3TÑ ̹Ou†×,“îE«ˆÂ'™Ð¹,ÑÖK¹B9/~¯­Œ-‰lŠy óäîÙô¯È I¶tg®¾Á]áZ3$]vP”” 8ñLJ|§ªª_Ãwê …gßc=ˆN£j=Œ ( „q°Œ«êÜ–Á¸Ê;ÌípqŽÞN?]l¸o´_k> ÊgwrÕíѱwc8Í“°ãÓÑw¾î©€±Ï‚ðüL–£TgçŽw’Øõq4ÛQämÖ¡÷·§Y‡Š\¥ªCó7’mñd²—‘Hº+Еþ©âRŒ-õZ‹éðk÷õ`‰–Ó§kÿà†`x=ÙáÆú½±ÇXíîÜ»µËž ȶ4­&¢Ÿ-_¹½;eLiZŽG:äf·/G…4í ¦®2žÐ{üµ\È©µ=w_ŠÂÕ¸@+\–dàbûùÑv,ˆ¡yð5ÔÄgX<|¦cA;ëÓ« Û² wüóaÅýFó7ÚAzS,Yº øöW#N°´ð ^Þ½kø€S\‚Ÿ!fënç­ S¯Ÿ!æ=Ì.à“Ϫ.u0 ¶tò+SïÛZ¡—"^3úoîЯ*ÀO»Oÿm‰¥ endstream endobj 2477 0 obj 4998 endobj 2481 0 obj [89 /XYZ 38.2500000 314 0] endobj 2482 0 obj [89 /XYZ 38.2500000 398.750000 0] endobj 2483 0 obj [89 /XYZ 38.2500000 146.750000 0] endobj 2484 0 obj [89 /XYZ 38.2500000 146.750000 0] endobj 2485 0 obj [89 /XYZ 38.2500000 617 0] endobj 2486 0 obj [89 /XYZ 38.2500000 647 0] endobj 2487 0 obj [89 /XYZ 38.2500000 76.2500000 0] endobj 2488 0 obj [89 /XYZ 38.2500000 531.500000 0] endobj 2489 0 obj [89 /XYZ 38.2500000 76.2500000 0] endobj 2490 0 obj [89 /XYZ 38.2500000 647 0] endobj 2491 0 obj [89 /XYZ 38.2500000 314 0] endobj 2492 0 obj [89 /XYZ 38.2500000 617 0] endobj 2493 0 obj [89 /XYZ 38.2500000 531.500000 0] endobj 2494 0 obj [89 /XYZ 38.2500000 398.750000 0] endobj 2480 0 obj << /Type /Page /Parent 2 0 R /Contents 2495 0 R /Resources 2497 0 R /Annots 2498 0 R /MediaBox [0 0 595 842] >> endobj 2497 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2498 0 obj [ ] endobj 2495 0 obj << /Length 2496 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ€ €žr H@A'0b#ò÷ÃY’³»M~5ìo«›œ-Ø’Åe³ºªººº_¿ùã—¿ÿùÛñÍû/ÿ9~~ÿåPœê²èÿ9žýðü/lsþ|¬›òøí—ÃÃñáðùð¹ûïááËû?wúßÑÿÔýûóñ¯ëþòÇá‡Î?ðË¡6u÷û¿okÓý©¸ü~þûþò»ã¯çÇÏ Ä¼üÿšÊ›öLÅ•/?ÆYšÇ_¿}ûõð¦ŸÔGLm×wþhZoÿýÇá§nüqôâÔzcêÊ×Å+¾SÛó‡j_m»ÊbòÇ_:£ëÝ´>ÙØtk³Ä¸ÊȃëÉÕ¶¸c¼:ž®?¶q.ÙØtk³d«0¸¢\]cÊõitý±}›Ìôt§’+\Q®e;®¨NýÕùó4ºþصM§3tk³d”+üÔøÎ Õ¶ôgŸå[6t.ŠþyÇêa窫⨓m‹®ñm:5:Ó­Ì‘QÒplÅÜŽ¦³3sêÌiÓÙe_t|I%ÔGº•92 Ž­'ÔîϦçMYë3þ2x¡Z_'û‘neŽ BÅc+ Õ ]ãg£ëíM2׸§;‘ % ®(W_•éëeð¬/m:CðHw¢Å ÇVjeªdÛêÓà _›tvà‘î4ÛêdìÏc`:ú¿‘³áÅw_o>ffuüúSGÚã'ûß¾v )»ÿ©mSÚã׿/ ãÿpüúó¡=U¶)¼öÄèIñŽÖ 'îmüh…ƒ´áÑ>B *øÎ'8øŽƒ´9†×6þSÇSm0¯!ß,~ò­€óq-1ÓýÉþdÒ¯¬®Slðwàj´˜hù{€¿Ÿàw°uÁàCà5´‰ÂLñlGñÎ÷SjÌCìXw0ÕÝT3’´Šð]°^¿ßOªñw°VA ¾A2Ø_;ß7¹ßZ›Ñ[€š4ø ô´€_<ÓÚê¥A2å©hÝ9/Šòälcìó'¦\sjÚ¢zùÄÅ?)àh˜‚Ay›P/üÉ»¾¸àIú z2X¨¸Ãï ú5ÁauºS髦^È烿ƒi#øf 8Z Ÿ¸P`x%d þp„¦ôOŒ¿¼€$,AA¶axꘑð;KëÖ|¬wïæã¥X Gä–ÖU,J<å°‰* GÞ °j2Fì}ò-°õÁÈh–/æ6œÂ"¸k>Ä›„ÝXÑöZÌbÆÄí¾Ãýúp‚‚æãÑ&<'¬Z̺%¶±Ý‹a¼˜„;kÛšðt¹ûGiü£9Úv/f ýšâTÕæ…6oÃEŒ]¼¸°:Oì%þQ¬]ðÃÎ,Þ‰vÿã»ô? ŒØ×!d?úòúä1ÃÝÇ‚ÁN 6›‘|×5E2•Xè‚“¨È†ÏeCžhfk޾oáhýÚ1v|´d¦øŒëˆM¸cÂÖMøÒ&-—·Çl˜ͧœ/BêÙ¶&ä™v»TJ9'1‡Œ‹e¹ÄáuHPkÂéÇr²Ÿæ÷}­%儼؄›cÙ¶áæHdR(ƒÃÄ¡1GEj|¸c”7 Qì·J\Õ°áTÄ‘4—ë5D 2œ_š 1Ÿ O·gýoâäL-:Ýø2Ö‡É4tÅn:l3âQÕYA©váÓ¡(ÆÇ.âX- ûªÛ ‰ªd¨„“C„x"¶à,¶,¥×lê`ŸÃ± Ê7fΑ0¨”«†FrE5îd#g’@~¬÷­«rqL™‰(bœ$›ðêZcøï›+ßú7‚»Ð×ÇOtб0ÉÝøÁªPRT°¦,Y¨›ðDwSJ’%>÷ʥĜ?lÒr•ŠÁ2§væ<ϨþŽF&†:`aÿC£*ŒQ|åo¦xç–2fø; rµÜ7C°®m¯j+U"™‚Û ÙÑø€ºhÆÅÕwR†“™6ÿ 󛶳Ѻ2T©w©µØú𛺂†­ôIüÇ bèL]Qº—ú¸ÉÖ^ehü‚˜6§¦× äX¿àÆáyã¦j _ÂÀ/Àï`xüL5ÖK]P”ò Ãåèµx/ФÖ|wš$P@X„-Ã1º,Ø> •Qc¹|uugª±fÈÁˆ2tˆ8Ñi "x²{HV©œH‡PǢ匤¡“A&¥‚ªqê4´z·@5Óêa 2ÁC+ wl­¨ô~µéÓý¥6<åˆ/“`@ý(BÝôV‚„{Ëjd9F®–ÕÔŽ\DædýNŸ g[¨ïLXÌì ºaÕ|sL`\!¬Å·†w`º%³x㤺10C°èáw¨ ä  @¨Æ—W ªd²•ëeUX [½¬Ú”­ƒž€t¬ø×óp¢Ù€ê2ÕÈÇgM3Äñ¿{+™½•”»îD¬»”Ý($.,ð&\¹é Êð›fÞ¸ˆÀ¶PÚ†ÛTàËÑöïÌÄc§Û®ªsL™l&|1qûÔÚL›£igu±?VX[¾T¸ŽÉ}þiÂ…òdÃÔÔ@¦Ö;|ÒÂÑzžž“HA@~ÈÝÏŒ6dOgÞ[m£(¨Ð“1ð?ýÎ`—稆O6MƒOàhƒIJï›ÙêR´´z^'¦£›ù´pR‰9‰t’ÖªéDjô ÖhÍ×BûP¯Ï9Úâޡ̇¹-')ͪiCf)ã_å$èË&˜,²ÀÄšˆ“qLw•nd9“`H­å€VÊeðºQd\à„ñ˜;¼<€®\´zI•[ÅÜÉuêrÅXÿÔ5\Xuæi;Å@îŸT'g쬨f¾#¼ÏƒJÄÔ0mü|V4=mõÉå7Sâ grÕ¯:o•ØÏV’]ünÎVûGž«2\;L3¾c¿CÜ&j`Ó–@q#¤ÐP€)HÞßÛYðPV;FeTœ"îÄô_l² ¦8?”?Á”8äê©›¨^D¯ ¯ö%Üf½eô/ö–ÑMÆg7x[žzRot0>C,®²W'¯|ËDâ.¥~@ʪQãAè4›ê:sº½Y¥ Ž0J0R×ãÙ`\·^ê['NLß sÈ£®ØTË"^3ñ&¸/.² P ~ƒ«Uˆˆ4‰ä®ÅƒçâÛ°.ÏT  Ç·1 ¯x ¤VV¹@ûÜ¥Žý&áàÖ /-L›ƒ°sÛ€ƒóX?ÄkÏ^½*{=†iÃÜ3¨Æ•‡7 ˜†÷ Jí6¥€÷ JS÷&\ËÀý1vsïDå.å!`“˜6¼Oa)l8Ò_ HsÀð]©Ç+ÝHÌêñˆ.¨ñ äNý±r¢¢J]Cƒsiür^@›P[kÞ.ƲWˆéñcŽ;¸N®—ÂLÕ@5¬ÔÃßäƒù†©†U„Ž©Ø$ª…Ñzù˜jBX——ª*í#NÈDÑÌyÚjŠzœÔ2æIfŸ)¯l5Î;$NÓ\>¹~ SSC¥Ì $NÖ 60…!$x2Ë0©~ r•I>Á¤*•äÒ…,â|´`Žðw>^‘vʤù€ŠýdÝÉ\"Yšdý¥wZ{qTû!¸ø„‚fÃP„ÊpþÖO*‰M‚ï©{Ü—'1©$Ü„zæ’½å€ÖÉtˆT(ÿRÚkW‡{WuM©ôºÏôÑ2=ï*<ÏT£ÛËà@0Âvi€([ðåu=º™ñJâ ç€j¾¼ab3]›M¹š6wˆL;dÃ]SùNµ;õg¨›•ruؘ‰©!½p?s•3Q_§b_˜’©-ßÜÔ;]ÈL™`’bò ¡,ï®.:ÊÓV)0g.¼gˆÍ‘kœ ø¯ÄZ^¬Ïl[Ô,7 õ»Cyiíÿ;ÎMÁ]1X¬1»ïꑃõni'ü'!Gt™ãì¢iûÍp£Çš7ˆUCÃ’­óÆ—ñ SbZõ˜dÝòKtkêj'fS½Ùë Ši¥ìv1{/suqÞ¤Žç  ñT#îfÓE!\½9bâŽ6æ>ÁÔŒ86ÏlŸLÜ{“øñÆáÖGÝùˆ§)Ž•«ÀCˆÆWüé™\92ˆ) ²ѽé²ÖhÒz†æ¢oL¤‚OË(¹ é/Öã•…‚Éu‰é-µ'«´×3~íÝÖžñ•€ W‡­Âåq÷ûíy‹Ž ùf|ñ„-¾e„_ÜÆ´Oâï0íy¾4Ñ´†›ŒÝlóÁRÀí†}# çk©òÅVz®–ýLÒr ŽõêˆÐw§ËÄ; „ ¦z¸Â¾¸`ÙßÛ:íãÙÖ.`qã]?Á ï» ôÃ~¾é…¸!‡u[Œýù~®§©5[Œ™ÆÎê)Ê7ÕZŠ[X!¶²ðŒÆš·Qu®5û|¢ÿ2ÈÓæ©…Ëùãõ¦lý5>X™‚NøÅën1&°Í¯®²ä‘ToÊ |ÚÅ´L‚ÑBZ‚‡Vù€Rjïanð`öùä%°Æ™D0—j Ô y©6êèd§5êô¨|2NM`.EÔkôdëùÐm²Ïuõ³nÿ(SpK4¦ßY³ÿÙ·…£ ·UË+¨ä!Q¾– |Ï×IAP%”Œ•_­èŽéžÖ(Ã4êvÀÅ\]O”›3›â+êr·´·¯,@Õbë©j‹c®—à±nVgø©`³Š(p&jÔ„. ¦D—Ýu&á2íT‚Oš©@·‹)"sð¦Ý*Ã;Qk¡q,â ¸œž¨º¿1Ç3ÝÛ]”÷kÌÑEd¦¾º}}EÏW†€a}ýP6u&5+mWë¢Q†åÛ»u¶Ð­“¸U%1”¤Ü¾û Käqº&J™mN×d18ckv×–¦ v³{;X§ÎX¬å5dùëEaö%¶ßåTl íŠ –•ïZ}¦ûÍPâhp>9ÊÅ®l=^—$2“ØðÙ`X ˜‚&µHkC~Ü6¹ª‡¯‹Ms÷' e\²ï'½qÎÊ„§;=¢óA–¤@ò.4_#…UœÁ`Ö=‘Zð ˆ Š•[låÖÈpëÆÐrv—:wÛ—_߀?u´ÀG2»K™žâzÐŒ—†{WÞÂ¥áÂÑwúláZíÎØmêšoïÚ{]ÑÌÆX{„>>|e%Ñ &€ttª’Ã3ep„ ^C*èÜ+ <Öª›¼lý6W‰‡Íó~„qOjaÅÊòÜÅúy| “Œ)ZáL¹aGµ,V¨~"¨ž¢æê¤1·š0l;WÈ aÊyÀõm3 ;Ø9À^Ä8.ßÍÑ×ョ×Ò—+ÐeÙ¼\XkB¼…£Á6öqÉM¡ ˜€@¸ù¶Ëã&¡õ·zçò¯Êv¼[hèÆ{/~BdV”›—’´”„Îs‹N¯„ê4:ÞõÞ¾1ã'¨ÞI¤|ëÎ ¦Æ^·~o3¥[KÌ|'s'IÊ*Oî‰Bz Ï-,?HÒ¢¸D×§kK÷‚” ¼2~-¬&€2ÖVþ’?Ï”¨ÁáR!Ê@ç2©RœòÃá_ˆWàõMòM<%³IžôiçLÑufüZÁÔæ )à‡2R²ø;8ŽAèŬc8 …ë“ñwTõrÓpà8q¥jïMã•õ€€DÏQÚýY˜+ˆ!#1j³g®)O½—÷ìQƒQ¸ÁMž‹éaØLúT×(ðcéÿÓh8ÉÌ'½‚h˜óŠeU£¹ Ç®¹Yð«º0 ˜jüû<6Üý:>tâ¥ùùÚ,817óÀªîT˜3åÇKëÛ°mÏÛÚaFÓ£}’´'Û‡õ'+°š>êºì©šd <Ë~@ßq×bKs´}f:éל ÜÙëŸH* ±ãŸLpØqÔÇ„g¦aðhðaš¨©×OjË*ÜùÏÅ/O–Q‚¶ß” @•âÛ8‚s&3*-¼ƒiÃÒÃ2‚£ü1ÚàvÄц¹ƒ©Ækˆù#¼RàZÕåæÁ-­üºhNƒ¯÷Ü88…çIõ«àçãçÃÿ<ïˆ endstream endobj 2496 0 obj 5067 endobj 2500 0 obj [90 /XYZ 38.2500000 235.250000 0] endobj 2501 0 obj [90 /XYZ 38.2500000 140 0] endobj 2502 0 obj [90 /XYZ 38.2500000 206 0] endobj 2503 0 obj [90 /XYZ 38.2500000 235.250000 0] endobj 2504 0 obj [90 /XYZ 31.5000000 292.250000 0] endobj 2505 0 obj [90 /XYZ 38.2500000 271.250000 0] endobj 2506 0 obj [90 /XYZ 38.2500000 206 0] endobj 2507 0 obj [90 /XYZ 38.2500000 271.250000 0] endobj 2508 0 obj [90 /XYZ 38.2500000 169.250000 0] endobj 2509 0 obj [90 /XYZ 38.2500000 169.250000 0] endobj 2510 0 obj [90 /XYZ 38.2500000 102.500000 0] endobj 2511 0 obj [90 /XYZ 38.2500000 140 0] endobj 2512 0 obj [90 /XYZ 38.2500000 73.2500000 0] endobj 2513 0 obj [90 /XYZ 38.2500000 102.500000 0] endobj 2514 0 obj [90 /XYZ 32.2500000 290.750000 0] endobj 2515 0 obj [90 /XYZ 38.2500000 73.2500000 0] endobj 2516 0 obj << /Type /Annot /Subtype /Link /Rect [346.500000 763.250000 410.250000 770 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn4 >> endobj 2517 0 obj << /Type /Annot /Subtype /Link /Rect [428.250000 117.500000 492.750000 124.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 2499 0 obj << /Type /Page /Parent 2 0 R /Contents 2518 0 R /Resources 2520 0 R /Annots 2521 0 R /MediaBox [0 0 595 842] >> endobj 2520 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 2521 0 obj [ 2516 0 R 2517 0 R ] endobj 2518 0 obj << /Length 2519 0 R /Filter /FlateDecode >> stream xœí]M¯Ü¶Ýϯ˜uLDR% (`ûù袀a]]IÓ"ˆƒºYôïW3CÍ›GéPâ™KJ3O1;OE^^Þï{øýŸ>ÿcÿ¯ß÷ßøüŸýî÷ŸwÅÁVÅùŸýñ×w×?ÐÍÁýyo›jÿã×Ý·ý·Ý§Ý§î¿ßvç>øK÷§ÿíõþÏÝ¿¿ìÿö÷î‡?¹¿tü _wVÙî÷_O¿·Vu*.¿þïÝ_ÿ°ÿí8bÿ97™×ÿÿ]cM[g1ñåo»~•êôë÷Û}^ÔG”-mÓýVšr¯ÚRïÿûÏÝÏÝøýèÅ¡-•²ui‹¾cõñCM÷?Jÿ£ÊÁwN¿dF»{dR}ž·4I”©UxðCSk[VEÛÀ?ßD1[)VÙÛÑž`«•QéØè8oaЏÆcËàJ5¥£1 (]~l£êtsœ·4IúmŃ î«©[G›‚ö—ÑåÇ®Lº±Oó–&I¿¯xpÁ}­uOî_qú¼Œ.?v£šdcŸæ-M’~_ñà‚ûÚØ"áy}]|ìº(ÓiÍ™²iÎ+¼3˜Ü?ðÏܧ›#ÁÔ‘ŸÊî4\,óOC` œÜ‹oßÙ}ÿÜÍ©Þù¹£Èé{çß¾|Ý•Çÿé<жÚùiÿC7§?î¿ü²SêP•uÓY)Ç¿wzbÞŸž´Sš“76ã‰úpzÒ:³¶ÖÕ¬'ÅùIypƒ]=±ð>ï˜óJ«ƒÑzýNs~çå%š’ÒðÃð¢:=1=…¯žÿÃJ÷ÉôÓyN ¿c ¸ ¼À~pÖºëÁ3À»> Cs‚u† ‚yÖŸc€cð÷àðÔÆa¦*‰Ñ l©KǼ„¹Oóß$Ý ™J·3øø¥þ‰wÙú’› !>X:jHw|†ñÎcnÁ;‚gØE†÷üc®žà‡ñ™²› ¾A½É>YÙg,‰ÉËÎô.€È´/2«§ÔbÚ¶1Ƀ™çýl#"0o*$$PS ¾W…¨€ßÉ$v±ÆŽpaåPáx˜¿1OYÑqÌ‘–õÞbv#ÓQ`L­ÄN<>Æ!ǃkŠôaÊ ic%´¡‰"—¥‰µžößq•ÀòU¢•&TXˆaEJÙ7˜¢R»-Â1:ÆV‘Î/À |áÁ D,šQöx²NPH¸}¶P(Ò¦?&S(xÐÌlO«À’ÑÀÓ:%MÇžPKŒ—°¼TÀžT™,a8Nš ­¦ßÞò¼èú UãéUfCð¢#|f,G1ÇácÑŽ¥²hT8 ¾Ò”='ê—2éÙg‰©Ê2Ö’¶®<½**g°F9Âx+ Ο„ÜŒ1K É•|-µEî{J ®KO„ßg˜«4ÄÙÅ3àÓÕ\º=ÿÈ2âex,dKn$”#%<üC,Ááf0ìÀ²‘–·×4ŸŸX^¾ç†ÑN:äZI¨AW˜š§]TDQfÙøÚå¼›ª8ÔV½N€cûKF‡ä²pði{7Ÿ±ˆ"Ƈ3"½Õ™MÕMÜvb¶úعÿÚq™j¯òëîsöÆÈÓ¼3­Ê^hcä2=„¹ÍxÅåG)Ê…Êû«ñZm^/w¤BÅ­aìÉôD¿‡OÚøï8úŽ=ùˆž”ð Í%LòP¾ÔÓ«Ã3Å»)_@Ê+?ƒV4é ÎÚs#øÏZcŠ»€«ºL›‘“jõ œdà¿NZ 5—¯f˜OXãWÅÅÈȘdì‘–‡ëü!€„›424b@ØkËþʇXof\ÅÐVóûöÄ@ZµZ¶ÖSe“ötB½Zu?öf#ÚB)y °/Í1ÜHDÎÅêªCÑš×,ÿŽv–^J÷nZOLv+}¦YjÅDó38oRÀõ”Øï r Ø' Ð {X8ÛÃdˆÞů§„ëÑpOK¼ÛLngã0‡à=Åû3…T>ϨÀ³ÌrU [ŠyžS\%÷‡™u`4\§G«à.àõ0Ô œS&3¹ Óí.sÖ¹òÏêàsŠå(S‡Àp<Ö€6“Á¥jóšqQìòÊ T(HÄš1V– ÝA,U+Áª£bþ2˜ðâš})˜¦$MΉ³®…õð‚ŽR×þlÖpL¹êÊßáÖ.¦?˜IÁ0M D÷ô:âZÙ~·pÔðf~´o^ab«¼„¶êší[âð]›$©XZïxÉ,tò»­šq¡4 °Ž>Ÿ,Î¥/‹[0E’lv\Ìw+á84ŒßæFxÐØ‡ÏE7ÆSÇQúÀJ3z꥾»$WôD–cqœh%{Rµ·ìÉ]žî@]4óÛò u0/3Ó¸Þ’¨'g"¨êMLüSŸˆsD¢ÜËTYfw뢢ªâehÀŸ¹CøòA&} Š-µfD–@Û æÑÁ¥|L† äDê="Òd¼RÌ]½™nÞ’m7`Îí yñÄ])s·¦ö”# DÜLGÝx†oðˆ@ëIzæ*ëÁ£1eJ¢w<îJ`Ô žõ†J#4ÖŒJ+ÒâH“²«¬Ý‹ù š²,C1ºÀy®{0E𾨛˜qT-à)]Ê8ˆ°eïÈYÜUøÑD“sà,‰VQõJ¢e½ŒÍåâ­Q´ì,®œ¬á! iíã®´ˆ~öÿ*áLêô½ï.>ØN³ï=zé-¨ ص·EÔMä¢èŸT§¾«˜°aÇ©ëæ1ûø1Œ’Q#Ë[8æ¯0ƒà½e."]>v¼bÈ&™6 œŒ™ºÖ4PÍÜñ,›âdìĬÅUI¨u¸ËW*P]‹º=A˜g„TÙOÖ…g±ÂRݶx²ŠÆnl<2ŽÒ_,—$^,³O w&I"áxRÌK,=FÚHÀ3>–õ™4ÄêZÎ^Ôå¶D‘‡ì½ç12×=/„Ó¥šË0ÈTŒ#šŠP¾«®6i+%è—ä2²ôÑѺho™æâû=Ü;[ï—9}|v)¥ºuè±WL’&† m*Ì$¢‰ÎùÉRû_×}Gù†ûZl¸¯?„:Ê7Üׇlx~7H¡æÒP±I¡À¬´Ú€LÃ…¼¼É€·$xðœæD-¶Å å>Ì[^^q³šäÅŒ–´5·` nØå7P¾²7H5#NoØå™eн¥~Íœ´Ù9«á±¶¿iaØåMåq)äùWÅbÕLŽD4 Ä|''êc[˜I®ßP7Ôlj•f”q­¾§tC}L²'õ-¾ò}žî í,ôdC;ã¸wC; Ò`åhg­]úí†úXlrp“ƒ›Ì/ëBÝ5Ýr'!®X6wÒc>uaõëã3Ö\ß’A/…#”*ÚëA¹(¦Á;šï³ˆ+†Ÿª‚ßÁïÔð ~Î͉± S G+ E!­ñ œ° L•RlKôšÊã£@hÍõ‡ŒÀl9®êP´æuРߢè$tÿèåð`Ü#yöŒ•D¼Ã€ÄT/^K;EÀ71¥Ñ"½Ûó[Ys]ô5Ù`’2eP*ÿÜGÄÿ™zg'žÖÁuräJš›½.GµÒ™9•öÖzlM,=s>’õÁéÛ+š>ÃwZôN¯âj_mÛCÛx£¸Ýßq@gV Œ€ð ­·Y‡f ¯ÐOcO |RÁYã¹ëé1¥àŽ%d9]j県™ëp‹ÛEÈ>) +Iÿ¢¥G}&GÝxG°8 u¢CÈñL¼ó¾ÓÂwÊ‹íÕŽoÕð‰cC{0QgÝoïÈ“ð;κ@ïhøDò Œo¼²ÊÛyÕ‹X£´g™Azô‡g„R˜5|‚ßQpnðÀþf*Õ¨uÑ×&årªæ5ƒ™%âÒd¶­3Ø ¢²\„= ´HÜU0ꉆD^KäÎg ÷î` ìÄú¯*Ž;Ø‘Â|'»Y¸K,s­å¹Ý8^j§D®*K_2䲘ƒ„Sé€Á¹pTtdùƒÃ@<à‡°k<ëwÞ†Q“%PÖœ2ÂÊÀò¤db&€”ˆH1…hK £¦EL‰P!-+h?æByÅ ЂÇ3IŠ`uÆ<¾V›¢2}h ÈfC$0úV€v´¸×Noìü1ž¾(ÊãƒáYS9˜ÄÑ ¤®“[¾z*Qœ!¾¦«i²cg5`Õ=»±)•\Yy»€ö‹ÀÚdn!•µvEI„†Îuâe!kEðω- ÀÅ3l H hÑH®,ßìzÁ…`‚TמŒJŸ }‚ï Ò«›¤ü$¤FOp¢§Ösƒ)¼¾`8žÛ ’{æÒ⻼›ððɽ@rŠ GÜ.!‹OI¨«r%‘åÃïÄ$‰š4‘Ù£i¶5çå¨ÂPÑK`ðܼJ!ðÎç®áÙ` ¦ÔYMí)­›ÄWZ¹¢é”';ðö˜ŠlÆÒ”½ ‚˜[„«ø†jº™T.ÓáVGQ¥J¹|{¦þˆ`™aš4Ó5ub[FH€I9¿“‡ å3Ñ4ª"¹Bmmã{+¶¤rU RfØ2-)Áp)û]Íî!B*ú©·VÀEx8<2ò×Ð3AÀ *ô&à”/Üó‚wž©œ!— HeÓ%$xé¢ÉíÄ%8²ˆƒ+#ÀÐ$æbw@ãl¨I£´˜ºµÞÁÆ0#†`ˆ MB\døí3 “RkííÕd­\Zæ)¯6æ)B¨Øx¥Cˆ¹c•ì[wNªطv­×ûÎcßÔIÍ<Ö•‚®†y¬kéØ˜ge²o•ìÛ*ßÌ X‘Ë—'n4”­ Ê•|Ç‘ ˆN "3œÍ Ìäõ%¹H{«§èúªÆ)ñv‰× j‹$š–©ZÈéT¾9} ¯,Ü õçMSjêÆ§Ï _™Iùä’­L™AD½y¦ìN Ǩ<‘v2BÛÇ`-Åݲ»œ²yQÑòrÌ)1:ƒ˜;²ü-C¹¢ô÷]“9ٛ–Sj‹e¬oFÝUJýEêÎN¦”ºÛ»¨”º¹ ú)uœ‚À¸Á®‹Nœc(;¸uécø;ɹIöÐj¯ú‡pcq uy5ã2 LЉ¤æÆô‰A—Ôvb×î×þ[Ç—A¶ý4õfèØf4q Ì¡óë»ùíuùúÐŽôÖÑgh€­>œùmxhëáóäÞ©§ ˆ~Bß1S llnÏn¥ÿÙ‰A ÆQú 06Ù>V0X ; X2cm;² …Gƒï8‹YE-ݾ°-ËpÇ?0B e=Þh éØhÌÒ Uá©) W¡<^©³aÆöî¸ÁÅs#Öã\•rΆù§ÌY”q”Åû„yÖÜÎý¶hguôêøQuådM*OûO»ÿ8² endstream endobj 2519 0 obj 5575 endobj 2523 0 obj [91 /XYZ 38.2500000 756.500000 0] endobj 2524 0 obj [91 /XYZ 38.2500000 587.750000 0] endobj 2525 0 obj [91 /XYZ 38.2500000 285.500000 0] endobj 2526 0 obj [91 /XYZ 38.2500000 756.500000 0] endobj 2527 0 obj [91 /XYZ 38.2500000 587.750000 0] endobj 2528 0 obj [91 /XYZ 38.2500000 285.500000 0] endobj 2522 0 obj << /Type /Page /Parent 2 0 R /Contents 2529 0 R /Resources 2531 0 R /Annots 2532 0 R /MediaBox [0 0 595 842] >> endobj 2531 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 2532 0 obj [ ] endobj 2529 0 obj << /Length 2530 0 R /Filter /FlateDecode >> stream xœí]K·¾ï¯˜sšd? €vW ‡‚ääÈq#6¢ø¿Ÿ™íî‘–=_uó›"û1mÁ–,nóQ,Öã«bñÝ?ýýðÏßïž>ýçð¥ûýéÓCv¬Š¬ýçpþõÃ÷aëc÷çCU‡/¿<|=|}øøðñô߯ퟞþ|úÓÿöð§Ó¿?þú·Ó_þØýÐù~y¨Luúý߯¿7•9ý)»ü~þû=üåw‡_Ï=öÃu“yûÿ?Ôµ+Íy##}èWi^ýöåׇwíúƒ1UYY{0¹Ë¦Éíá¿ÿxøéÔß{vlrsú¡¼Ên§²çêæ4†mN4ÏšÁ8¯¿Tz7ê}W&³±únç­Msþ]ìüXçθÊùyÏû[Ôµ=ý¹rÝ?·Q¬(ZŠUe„íè;°ÕÖeñØèÿü`ŠcÖ¸³3tþ¹¶åÃkKqt¶6öûc_[êcÝdåÛÞ’ÁÞð ²§×–ü˜»Ö›ò ÇÖ°7fnø› ¶tÔ™ÒIíÿ(¤Þ'jö˜æƒ)¯áŽE^Öo˜Ê˜–Ý\?ò”ojØ¢Ë:9l) ¢àÍÆ½á#é&FH7aÖÏí8¦ÿèÒâ_[š£ë>šÐ²Ó)ÇÔepa‹À«iÅÁ‡Ï'}GW'WÍSVúã„õ3^'î®~úxÓ 8ï>ÿ˜sÄÝC+° "„¦XÒÏä„ðMÌ(º» , nÃ3ÑÝcó.€\Õ)Šª,<ÑÞ„[‡ƒíÑa‚J‘9TGa.{ô:Ñe¡€mÂÝS²÷68‚˜ÍǶ6¢þ3™-|wQ`L!ì­AÚQRÏzÀÀ˜9:G5;–•yc™Z‡Z²÷“]–ù噲O†i>Ý2¥|˜én"… 8 6]Ïh0{|„p '@p¢Æf  êLn²dª(ß¼9¾N&rÇ•SÁor¢å ŽS–Çðo¨q u:ÙÖœAF̺ã—k-.¼e”nU°-¬Ï•ŒÄ%tsf RÈ-Vw-W{ €h t´cWÃoð8”¶n÷ç ´` ÂxºZµOp&óû%˜W1Qxó9: +Ðo%>ÉxnseeåK)æì¾#³ãóŽ÷Š‘ —”1D)D`”ÃÝl;Õó±Çÿ¸q¶ÿ£pÂZðЙQ 9¡n]Q` -ß¾‰ Î5¥§tuáË=¨ŸÙd”¡›®g¸‡è MQôÈU5n}¯Áòì|k‚ÕÓ\EUZÉY›ò-Û˜ìØâèƒ.ŽÖ‡ØÍKø7¶ß4pœ t2b/Ñb:CåÚ á Úc`Ê~‹¦ŒÓÞêèÑ¢o:¼Ö›C³î„DÝl7NÞGG&̺ãß+ãàõà– rˆ0†CZ~+ÎXOè;Gó ÇÉ uàžvòåÊ8‡à•âÀ• ½¨%‡góEƒ&‘>©‹¼ŸæüXðª‚_H,´W¿1Àö`Œ_ÆÈö¦¬ÔñL% PB9…qO #UpiñܘM Àá,b{óß66yÕÄ8 !)fDF‚ôaPÙ±t‡˜± ëk3|”„ijßDí#˜ I`rk°žrRƒ›$BhU2•Û“KÔÁb cªpòPb%JZ¨ à1aìQ7ª®œo÷Ïž…³™,Îs"2“ðz2üÍØ "jµ¦©ý½JqȬ?(‘Ž  ‡º 737B«Ïï rƒ ¿¹©ÂΩd2Å;WöR˜Ä"q"™&ÛØgüe!ååå:¯&€çª|œ>Ð ñ,u­zÞ‰©ÛŒñˆº5¶×‹ª &dÕÞjl_Ƚ@ëI5ç\Èø~Çá\pÝØºÛØ©cð€.Í5 ÷•7ÙV{dP˜ær‡im,Ÿ,•-3¿]‚m ‹už¶ Ã.Øob,0¦e·ÚH« óæŒFay€q7ÂWc¬…û®ÓÆ+ã.¬ZÖ“Âàªq­„ÎWu›@÷Vøž±ýº¹U"l?“S‹/©ãÀÊŽÃü ÕjUÔ½l•Š‹þ2³¿¡ŽNÌ›¹ñ”#S0AÐk=¨„Cœ<ÈeÇJ$òÕkºW†ù÷X¬`ip #E~wÕVóýŽÿw'[h~w] ùtù['UWóÁ:qбH^úÚì’Gx¸ }ŠXˆ¨08#07¹!r[¤Á^Ì,¡¢p¥ü·ìX˜¸s«‹`Ên*[ö‚&Y…›÷ð\W$¿˜Ç~mX­†©º’©jÙuÝ…:D\ÿd´^È"+Ê5‡pí¼R¢z0k¸R +Ê0{*ж|çÖÍ:>øì²>×Pù}й*íæ/„?J”I Ê>¯¡Ö ^—Êsf©j?®*j0{ùFoe ’0•”˜y“ œ%S—XöB£º1#˜¨[Ê|ÅŠ¨°tî©Í×âˆÈ,s)\ùâ0SI˜‰Ñ¥*­r”»€!µÀÄ/g ‘¿éO¹1õ¨Tž¼AÎÌ©¯™BBÓCLÜL0£9MJ¸-yŠ—Ç:TØ=ê¾çvgN(ÜÏ#r²„—LjûpB&ƒˆâ=M˜õíšK]qÕìKœ+Ð S^õ’Eˆo#31 |ÎpË:ïÝ©Þ`îdyþÏM1ÎI«Ì¢nÖ,øv©arç™ìýUÞ”¦jŠàsFÜ–¥4¾?ë·,á®v•»[îjï…³O…YãSKÄŠq^ŠnvÄ:i€s: ‰UmáMãÙoÌ y؆T•Þ8‡ˆ9?x¥¾ƒMœ9]¾æ¦zÎ1~¤µÅ¼£Ú"ŒCðSIÀ˜ºB„4!]\Â|мXV„¼1£ÜCÝ%2÷ÍÍd­·³w¬B:©÷…Uæþ<‹Ý·wa•¾=`öGëW¥Ä ÛÜ`EÞtؚϽã;î02ëwHv~Ýñ€á…ãE^¿¯!Í|ê8 KEBÓ1:ƒ‘Ø‚$ÝðS"¯ˆ±Q¨øµ*º€×#ЀAÛŽ©öÌÔçgê3cÿ#‘Í¥û^…Á1§qc‰ª G Ì8 ,H®QFœRaË„™úœBÉÐÊŸ=C6ÕJ幃ãìì»h?%1+9›Îbh9¨cK¼Ø?œråFæÕF°XA0çd¯./žûÙ«Ë'+½È vÎZXóÒ‡ªn¢”ïæŸÆP}…9 kFT_MUûê+®ŠÞÊ»:Än2â„Q­±_‹&œÙÙÊò ¨>[¾?ßqÏwÜðœu­(Æ9?åã3´ ñâ¾´¶·}Œ³ýýÅ<Â6ûM&Tg‡ûèSðœT߈¡ÐÂßÌz¬Õ ü Éáë“ʬ‰—þÞ_F" O°¹¬E¯Ÿ?|C«;÷X\cs‚‰ýÌ€c6¥¯µXœa×ézQ¾œ®Ã?ØFeèªôÙC‰1ÞŒM‡û ¼8€Ú~PB¶@]žüp85iÍ—±c‚q¹ï9èF)«™Q_*^7±–]'Y°:ˆéö솥øÝ ÌëL ’ÅdMã›&Ë?,hݕ꽈ˆÁœÌøÌùI`l‰á–TχcI]9ö¨fu‘®ºQúK‹‰Ö@š:¨ Â:Ñ."H#<ã>†ÞÄ<µ¥Ï,›ÏÙœ“D Ïš>=ÍVÙ{P a”Tš`zò‡N$iOýZtêuÄ#œÌÀ¸*  ±˜æQfôv«¬ò4,¶c¨Ð®Fä˜ÑT&ܘY¦ß°ÙÁ ¬É÷ðÚ|áµT¡m&TϤdQVt*Ý´|’›¬!ùp„,f2¾nPP1]UÓØÀrK5ƒ4OX¨¶—×C¶ ºAlT«Ð.ºþ)Q·æŽªÃ&ÂÉ™{éQú™ï²×yµK¡] íRèíÜ,…˜: ¸®‰° ø $âµX=™6 k²¾@œƒž9åP.åê›x« ë2½éúuºtÃ~Œ&h@%¬`˜uº[J9ï1\ÌÛ&KA6Œ3y?wB¦¸„]¸åÄd2'J³]mmë<-)È3,ŸBúª2#$ÿcvÝ+‚€œ›ys˜Ïåv=«j›nbÌÀ`Þx4Üù%ó‚f`,a½¨°ÎšQï”¾ÛØÝO*„š:I#7Ķ3¹r#r¨íÎT¬KjŠ¾Ì O˜@ºÚ¶PO(âÞÔJ[Là¤o©½EÂQ›|çßÍòoÁæEð|}ò»ûQ­Ö¨õÁ4׆´e;dÕÙŽ'ÍÕâ˲GëCÏæ…øæ=üÏ A½¹¢7P[u;0mÎyI^‚ݸ6·vÖåÑë#°·öøTG TSö:yÂz„o ­;#ýʬ;›ãʬ…õ|€ßÀY+Ó Sç rSÔZøÍ3œ5¤µÀU-lhéFpˆ°R8^0k8ƒþæÎpÖÂþ`¹ƒys"æ^†ã1E1Ý _3ü&¬”Ø9¡·µt7¸¯õ†wŽ¡A¢8lmÌå‘Ý8,SzçÃãTÜ4¹KX ¸ÇßÜÁ¦2œµðF$cÿ¢ö:6âx›"˜ n5@WÒ„™¨C+ ¤Ì-¤Aò´j¨v¯ôVôçÄùÕ¿6r!”‰îç "J‚èjæë¾uE^W€kˆL|—‰Œ–•#48˜Ä:!€­mgîûáo„˜:[¥Ø§êOaê`ŠâqT©£“K“(%ˆ!ÑÆ ¢ºuåÒsqÍzÊ š,Pmw"ã8‘ZÔÁ—‚p92|i%z“±P‡¹*¯ mª £R²–‹^þ­çwᢞ±`Æ1ÛÀo‘>uíÑGp!¨ ØÓ+Ñ(—Z˜ÿõ–¸%žý¾㨨<ךct’Pu_õjŽ®G!ÈOÝÂ𪾓l!8ß¾x,CeLÎþS †ºÛ”àn‰¯ú8/rt`‡oD»cëðÍV ˜€ôj(_RÝ‚V)\—8ªùeˆªò„±Y]ØßœL7ãÇ:m‡¯eX wöË—É ¨Ôrîq2]3Ñ~Ý*‰ Àï¤êo±0£|’5=V¾‘˜™À¾²Ž™YQŸ(È=– ÒATì_(L¥㚬¶(½ÍÙMÖõ™¬®1þ.ªj²u>Ÿ‘('wE±ïo#>U‹Ih*ꈧ®ÌìuÙy#f6ýQX†„‚AYù«(EÕÈÅÖŠom¸\Z­­èˆóüáÿ¢à8[½·àZ,ð{}ž†/Kßï_§’$²jݾ€R^ªrT%O][[%Z=ý5á°0:cºé ‚–… Рe5žŸ¾X$§¬ü5ì@Ξ-®yºœ’mÜ4¼Ÿ›Å»M¶Ûd²õœ@Su5¾¬½<¨‰å7ó,‡joXSáºkx=N-0¾y_ÁÏ`}BPÄuú°îÆEylq¨P4€ZÓZ°80—㊄xÔnMà¾ÒRä;G‹“0åWùPPYS‡à>ÁzÆ5'ñÉ€½á笄Ǿ–¼?x=釫m=^õß%´œ½IÞÁ·/Sà_8¬ ¦ë· º2¡-â\3.W1EŠðaݸ7¦20æ1̱ØJ!ö‘Ñ{Œ Ǭ‡©›¬k' \EàL2K:‘fd´®·ÆÔ©gô3–x=ŒywòifKÚUÕ(åSÙ59cUö…¢áÞ˜» ]°QK„@_(‰BHoAn¨®÷fqo»=¸ny›Fª6å(}w{p·^Vš‚v[8 KFp7†Ó ¯-§1%—›bœ“T[öÈO:ŽRú]¹ËoàKµ}Ò5îí|ÒŒÚ\.foóÅç ÄÈù=¯R\én íÖh ¥”±…íãŽ{ŽYú–Õ ø—‘åF·°¼d"¾„ÖZ'­-æeƆKÉåõMx£­±ÍNä(0h¨IÆh"ÎÀðKJÝRf—üå„ö{™çU®ÔJÇ(£n¶ ÖêÌ9QTS¯|/˜:8&)Äã *ñ}þòé×áëé@‰çíãØL¸ U_-¸cÜ13çŠsÛ#ݵøkeÚª®ÜÑh×j¶}³{ ÉËaK'mì±<ÜÎ_ó¿2Ž+Âqmn/ÝJE÷ºl8|±5ÿ6¥ N¶åv°ÀN¬\뾂-9Z†Á½ÁoºÀ¼ ZzõmY†;ÿù4ã~£a5¼ÑÒ[ØhÌÒ Uá|×÷öÜ^i'’¯í+Üq‡)ŠçF¬§»UOÙ0ÿ”uÊ!Œ²xŸ0ãÞêÛ¹¿Êêcûâõ›càà æÃ÷šbLK>>üÛ`´1 endstream endobj 2530 0 obj 5585 endobj 2534 0 obj [92 /XYZ 31.5000000 382.250000 0] endobj 2535 0 obj [92 /XYZ 38.2500000 468.500000 0] endobj 2536 0 obj [92 /XYZ 31.5000000 295.250000 0] endobj 2537 0 obj [92 /XYZ 31.5000000 616.250000 0] endobj 2538 0 obj [92 /XYZ 31.5000000 240.500000 0] endobj 2539 0 obj [92 /XYZ 38.2500000 65.7500000 0] endobj 2540 0 obj [92 /XYZ 31.5000000 382.250000 0] endobj 2541 0 obj [92 /XYZ 38.2500000 219.500000 0] endobj 2542 0 obj [92 /XYZ 32.2500000 410 0] endobj 2543 0 obj [92 /XYZ 38.2500000 468.500000 0] endobj 2544 0 obj [92 /XYZ 32.2500000 239 0] endobj 2545 0 obj [92 /XYZ 32.2500000 488 0] endobj 2546 0 obj [92 /XYZ 32.2500000 294.500000 0] endobj 2547 0 obj [92 /XYZ 32.2500000 542.750000 0] endobj 2548 0 obj [92 /XYZ 38.2500000 65.7500000 0] endobj 2549 0 obj [92 /XYZ 38.2500000 219.500000 0] endobj 2550 0 obj [92 /XYZ 31.5000000 616.250000 0] endobj 2551 0 obj [92 /XYZ 31.5000000 544.250000 0] endobj 2552 0 obj [92 /XYZ 31.5000000 411.500000 0] endobj 2553 0 obj [92 /XYZ 31.5000000 488.750000 0] endobj 2554 0 obj << /Type /Annot /Subtype /Link /Rect [233.250000 700.250000 325.500000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 >> endobj 2555 0 obj << /Type /Annot /Subtype /Link /Rect [60 580.250000 91.5000000 587 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_introduction >> endobj 2556 0 obj << /Type /Annot /Subtype /Link /Rect [60 573.500000 123 580.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_core_language_changes >> endobj 2557 0 obj << /Type /Annot /Subtype /Link /Rect [87 566 142.500000 572.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_binary_literals >> endobj 2558 0 obj << /Type /Annot /Subtype /Link /Rect [60 559.250000 126 566 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_standard_library_changes >> endobj 2559 0 obj << /Type /Annot /Subtype /Link /Rect [60 346.250000 91.5000000 353 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_introduction >> endobj 2560 0 obj << /Type /Annot /Subtype /Link /Rect [60 338.750000 123 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_core_language_changes >> endobj 2561 0 obj << /Type /Annot /Subtype /Link /Rect [87 332 167.250000 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_nested_namespaces >> endobj 2562 0 obj << /Type /Annot /Subtype /Link /Rect [87 324.500000 149.250000 331.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_u8_char_literals >> endobj 2563 0 obj << /Type /Annot /Subtype /Link /Rect [87 317.750000 161.250000 324.500000 ] /Border [0 0 0] /Dest /#95b#3e#15OH#1a#13Sa#12#bc#c5#e0#27#21k#a3#3f#0c >> endobj 2564 0 obj << /Type /Annot /Subtype /Link /Rect [60 310.250000 126 317 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_standard_library_changes >> endobj 2533 0 obj << /Type /Page /Parent 2 0 R /Contents 2565 0 R /Resources 2567 0 R /Annots 2568 0 R /MediaBox [0 0 595 842] >> endobj 2567 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2568 0 obj [ 2554 0 R 2555 0 R 2556 0 R 2557 0 R 2558 0 R 2559 0 R 2560 0 R 2561 0 R 2562 0 R 2563 0 R 2564 0 R ] endobj 2565 0 obj << /Length 2566 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€Û|I$#ÀÎÌn€,v‚‚uÈl|ÈßÕ"5¥’j¨G÷jöLK-²X¬7«JßÿéÓ?Šý^|ÿüé?ÅÿûùÓ…]uÉšEýó]÷‚0Wÿw¡MY|ùõòµøzùxùèþÿõÒ<ðéù/î¯ÿ¢ø³ûï—âowô_ª¿ðëEsí~ÿûöÛjîþbíïúúÏ—¿þ¡ø­1LçéþÎX)E ÅÄÌ_/a•üöóû—ß.ß7ë_4 צªTÁ•tÿ³Jÿýçå'7~]­â\WJ³7Ì£E=·î—°¬¨„ÌsûÉ2:Ï?¶áåjcßàÎ.+žüj”äR‹RÕ{\ïoiŒpkéÿ½iUVÉcºÊ²vðüÛa7«mõ îÌ ; ÇvÏq[1mü›6³¹¡ËºÙ•ÃÙˆäØfâá>­=±ØkâZoˆg®D92ñÇCP|Õ~¢«ýD¡Š¡| ûÜ0Ë{Š̾…-•“¹Ã¡·Ç{Åð¸ã¬L]8¥³R>ÝɆ S­µaÑÐÚ0atÑ…Sßц­Àac„pˆÝ²Í‚•Û,`¼‹2ëá¹Ë«¹f˧mwíê¼°æüû \"6ÒVX'ÎæWÚÒxï¬Ôùývð|ªÞ—•ƾÁ#Þ×Àc¯KM•-÷ñ54¯vžxk_£cí4qµ“MüxNŽûYK«GCC«³2Stá4÷a‰Ý6Ì*»Ö†EChÃlÉ:VºŸ [ÃÆá»e›ÛàäÔ0ÞÅN™õðÜÔÜm˧mwmMëиkj'Ç0^bï*—“c˜Pþ\ÂÁ™…ÎàÙäZë\ÎÃ#““;ã¦J«V acpïH8š,—¯ÓŽ„”¨ðzðHñî©àY)d+n$@@¡Q½Ý'—ØåR ï† S|^΂¹žÄÁPúcòòv‚°fÊ*C0²ÁèûÏήXÝ&p.ìäÞçÕmXÚa®ÅóìO˘Ÿ7¢$i·£—:Äíg}ÙpVY†Y±ŒÜ-'á!éÔ¬Z#AØt~Z ¨)àÄ(ê­ì1Œ‚ÖIè0¼R7â=¥Øc /™ _%¦*¸ O{n›jQ+&õ‡À´L $ŠtÀú#1æÚ£$¬\gл¸ר#âxç U%ìKk8ðÎQô® P/æ¬â:¡ >CÙdšM±›@3*¸‘^5r~-UetÙY@¦¹Ën¾Þi«®J6Eu±8{æ>Gó"ul4Â<ž1Ç h‚22 `°½åU Ãûó4£™9H yù2¶ŒÁðÌÂLàâyµÊŒÉð1ý²9Y蘕¤™<Áb˜)dD›‰A0m6†g×Jó¾ÜiFãå•YÙŸø­Ð\„[s À¼ yM(t'ÁÊ邹} ‚5!Ú³±?Ô@Ž^#ºÅÒóÑË1.ñðuØÄ¶U²hÖªÁ +*Tg$Å ïДâ[,–3Ø~óðw‚–ˆ¤x3I²c°C ,*Lg ¹K»“CH7¦Ã÷¹ø%á†(H¥ûÛ·ÌÅ;ÓÎδ³î<ílE½$…¹lu]X·0êϹ\Uçr¹²èŠù–|BM絉×Õtx¿ÊÞY`\(‡_¥¥§¶g]]XŠXæ”hEAQj¯úÈᧇ‡àÈM{ë’d¥U´9çñÀR×ß\û:.ˆçü†C+»g¬—ä“&Ô<&¦´Ý=Ôvij¾ƤÄۃɀ ~8!D†qŽMà„¡‹Ù‡`ão¸3ö÷ÊÈâûmaž#…ÊE%b:ˆæu˜àŽ$ð0b·µ­· šiãô®sBW¥kápIПbômea )¶uEê¡uùo:cºùºA`5¸ä-Ç>¼!ÇzÀœ´`ør0ß@äPÄ E\þýv ”úmðy”ÍDUSvƒî±ÔDL`”USÛ Ék$>°GÅ%ÈRmHœI¼¦Ô¡Þ^_S¿€Fô.Ô]½Öá‘z¢È^»K5ifb:B¬C€1¦×ê ÷ÀŠhx¶ ê‰j+Bù´/Gƒ¼žAd ®l$'–…LÞêJ–Dq¨ö†æ3ÅiZ7¡21&ƒ„Ì"˜D JÁGO³½µP Gå$Ã…`Ò,HWMx)y“ "åŶ³©P8 o¶Ú"GЗ~[¨àl.ʳ™£µçÀmG.Ö¦4й0AGàÆcjCž±mû¸oXÝê¯eå´QDÑ øœÐ£#“6İ‘ŽÙ×=Ø<`{k¼½‚:×¶`û‚¤§TûCPzõÉõZ#5óÁv ˜¬V,åœY1$á)ŽãõÓ&ÖQ R>·òx÷K¦Îê&ˆÓ-ÅçÞ݃OŒ(§·y“u0à;„¼«,Gyâ6˜ Eß›ùf5–ö! †_#³®‹V¿ð½¯>¾…r;pì6¨ËV*Æô]¥„S¤;ÎÔ'Pó¦síW0·VÚßÝçÍ¿ÉÒf€b€ìŽ®•ëuHeŸ”¤)Kd‹ aËté!êo(î_?CxˆÃ‘Ý.³…¶M!ŨÑtƒ…«á…0×Wm#¿‹çFÿ~•Í â½‘ì*œ–êù^SÖ¾PáÖ <@í…=·?×vŒÜIÌÓP®WÞtð{¥ÜFˆpsm¤Ëœ;>±d ׳qN6Îh¢Ïí½ïŒ·UÍgq5†šÕ¿4禹ªŠÊ†·„…+_.•¹rn…1¼ý–îŽ>5s¸ïûϬ~¬è?ͭ樯|¹ô!©¯H›Qúëørùùòô‡Í3)Mcï Ö&‰á~”¤HJ ¥oÎ&VÌtšQÍž†4^™î…¹9h˜êëS½M#T/dLõîÊ€êëoéî(áëS½$Cªnªhw%¦úúš‡ÔÒ_ÇÎT/Bž€¯.Ï1'…Ò(ö*%ÜN8‹È›5· <5ïÒ's_fó·Ðž E)»B6/äb®š¤ Â_P7¶)¸ž}š«¢~c­g²på‹{ˆyVl¿%moÿÑOãžn<\DHOã®ÔÓô€¹}Kõ‡Qýi~ŽäÛ¼Ì˪af„·FN‡(±?‚»¸¤vi£"[PJ½ð)?áø…åìv¶¨©íFl•g`ÉT÷ÂÛ5|iú¾´c¾â±öuW¾þ–îŽ>™¾†/õ˜†wKæpWÞ] ꮆoçØUÃWªïÊ …¬­JÖëFù"LšQbb‹ãlÍ[•Aó2Þ½°^M=QDJwlÀDhsË«x\«JÆBjðÁõ»»û¡9 »4X«®¾¿À0ä0òŒEÏøÍWÔ5ndàÝõÕšhž6(7Ô–Op´÷èNðHFî<£•&`ƒ+MÀÆÖú˜«ÔmWJÿˆ,]s°4éœ?¯ñµrÑÊ‚Î?AOOÌÊ”äGÑq â ÄĉvlVÕƒA(ë‰U„}Jì…R²&e>”ßÿ­9˜ù7*ëL¤ªemx˜sÚ5Û –"R›y“¸6ã s•áSÆ4Žïxëk œÛºý,·rÐ7k|‰­‘¯*?[‡"$á.8­ÊÜ ‘’Drdfܽf FzóM–læÎÍFÈd=Üš¹'¬i ÔÑŠ”î Û69,tJ-án…a$¶[@¯”îçwý:RŸ/Š›”µB oƒ¶„ƒƒàô\þ ÂZv:»àÊuAÛJcJú¶µ³uO2é½S’÷˘ ;40”YÕ¼O–íËÏÏL¶^ÂÝJÆUÂyð3¼ƒŸ°ù„×±·p41 q!ð‰µc@¶äShŽ˜2¢£ýÍ3ù÷ Ê ì@J‚Ó‰ŸYû¥F»—fì÷ºúÖé’"º¼µ Ç|¶P1wß“ݯOóí Š»N 2Šê4íÊh!%Oë•¶}ºì´þ>Oëƒ%¦‡gø ŸÉ @PÁ;†3 ¼ƒÏþñ<‰Ñ¦Vº"±ˆ )[jÁÙ ^,Z5 »<#>¸ÅG¤*E¤rÆß 1C{q èx!<ó>cÑ3¢ ˆÒ‘ã5ÕØ<¬ñ‘É6qgRÇ×Aþ´jlÜ3ö­”‹ËGÃÏà•&ÖSVJX†-±s¶l¬4e)«ö}dë"sØ+kám"øx¦Ëg:ë|ÌtùÝúî3Ëæ®|ÀÝ‚' Þh4•½°jǶ2R/wÕFÃn˶â¦Ïi”—-겋ûágažDg^(—–ùxG®îïùà@eª¾ˆX ¸æAüW1«%ÃÜIœ¨Ÿ iÿ”à.c(!Ô6Âz‚Ÿ¶KˆA‰ˆæ¾•Cªï‰®‚P¸ÇÙ÷d³¾'ÝFoª5¢êÕ‡¡GêCˆ{’ÔWâúÐÛ·tw”ð©êÕ‡QŽÔ‡÷V©¯Äõ¡õµiÙ©}cÏúPÓÖœ}O°‹6·:ÓHÙï{.¼¹*Ú¨²Oõª£z÷$©¯ ¨¾þ–îŽ>•}ªWjŒêUÜ[¥¾2 zw-@ªºTßα+Õ—í¹åÙ÷äì{2Ÿ¿KÑï{.Ìí{b*Õï{bªr¤ïIýæô~C’úJÜ÷äö­¦¯I;Lø¨ú}OL%Gúž˜*n¯R_‰ûž4ßRýaTš=ûž˜¶Ûž$$/çiI‰×"Ȥ*²ATZäåOñÿìN"F‡>všî…;XQ娔ë„M)J´{wÉÎh¡Ðß§ú=Ûllã&…¡‘‘04jL:¿6’R¦ Ãú[^Ø…aÂG C#Æ„amÞDÓð¡0¼}Kõ‡Qýiv†&äÈ C\à¦àDîäË^–ÀÊoK8¹w…rC‘ D÷Â\‘`™è‹ËäˆH°¬Œxµ¾‹„Û·–o‡ E_$XÆGD‚­Çަa‘Ð|Kõ‡Qýiö –µ‘°§åöÑ’³mËI¥úÒ^h¦Xfû¦¸°¢™â&Š6w¾'¼[.s¯€¬/p}pyÑ“—eÕ›âEVô»C[1ÖÚ"˜V »Cß¾¥»£„OýîÐVŒu‡¶<ŽÄÖWâx‘m#Da”þ:öÙ6]ñ좗âÀ{é¢çˆ³ßE/\X¿‹^‡”î8¡­í¢×ÅãN]ô^ßã+pG¼³‹Þ£uÑ3õK1'ܳ‹Þ,ÑvÑ;»è]ôfâüì¢wvÑKó»èuÕæÙE/YõòŽÛÙEïì¢7Ï9»è­ÎŒg½³‹Þ¼.z]­xvÑ[ÁÙEïì¢wvÑËÖ*ÛÎGV®÷Tû¹Q=·w6¼2ç좗|æì¢—è¢×¥£ýͳ³‹ÞÙEhž]ôŠa½wß“}ü.z;è좷ä´Þ8£\ô±}vÑ;»è.z]jùVJÜ]ô:l$ªÙEOµh»è%z±Á®€¤Înï[…À¸ë¡_pت aß´Rïä-ƒàÞäd_@®%è5±#Sí<©ã!¡w ~†=Áy0Ût4ŽÚþD¶œ(§Ï¤Ã‘îIÖÄ¡DòÂF¥æÃs!Š—5¿bcA«³‘Å¡§5ÃcPðB2ö);Š)çÈÕ©YË>¶(8XË2jvÏËyb·fjSÅcÅ÷•­NBœ6“÷©¶íV0+^8Ÿù³¤T-…Ûµ)uÒÐD¯ôkFúÞyAw8lÊð<°­'†@àæª„v¨êBŸÁw8l9JM¾[¾ï¦mBI’MÃï0M¾³ÍêxÛB#[|ÂC—:œíWºtO¤ 5Gé!8¿¨‰Tžµ4a•C·Iß—˜0(mjNËò´,·5ÒT[~i)#í†RÕ$<‰;ç' çƒìðëë/(;|R‰*Žî)£¶¦Št´J&7ÆH>‡nÆê„¸HÏ>ëDæJÅ”›e®àg`Hh¡9òþGÕz-Ñ‹¯ËlhFÉ+H¼†3=BTž7PRrMò¾}qƒü!#ª¼ÿwNºŸâ«CIc§¾0#°eÆ0*Ï8ÛÎwËèk°€K,¬ÇÂÐk¤ƒ0;OÛƒ;^ˆ‰az¥/PÀA#óÈ©HÌlüJ‡(°8Æ]ê$ „6ìÂ$àðÞQhŸñBŽ/ZzÇæ \ý7{U*ðto4Ça ¼Ñ˜< øöÖõábÜñ© ñ9¤v¼íÔÌ\)ÚÛW )RtºŒMJµÅÇËÿ<0ôE endstream endobj 2566 0 obj 4986 endobj 2570 0 obj [93 /XYZ 31.5000000 293 0] endobj 2571 0 obj [93 /XYZ 32.2500000 506.750000 0] endobj 2572 0 obj [93 /XYZ 32.2500000 403.250000 0] endobj 2573 0 obj [93 /XYZ 32.2500000 686 0] endobj 2574 0 obj [93 /XYZ 38.2500000 743.750000 0] endobj 2575 0 obj [93 /XYZ 31.5000000 657.500000 0] endobj 2576 0 obj [93 /XYZ 38.2500000 743.750000 0] endobj 2577 0 obj [93 /XYZ 31.5000000 686.750000 0] endobj 2578 0 obj [93 /XYZ 31.5000000 657.500000 0] endobj 2579 0 obj [93 /XYZ 31.5000000 508.250000 0] endobj 2580 0 obj [93 /XYZ 31.5000000 404 0] endobj 2581 0 obj [93 /XYZ 32.2500000 291.500000 0] endobj 2582 0 obj << /Type /Annot /Subtype /Link /Rect [60 621.500000 94.5000000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn2 >> endobj 2583 0 obj << /Type /Annot /Subtype /Link /Rect [60 614.750000 90.7500000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn3 >> endobj 2584 0 obj << /Type /Annot /Subtype /Link /Rect [60 607.250000 123 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_condition_compilation >> endobj 2585 0 obj << /Type /Annot /Subtype /Link /Rect [60 600.500000 105.750000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn5 >> endobj 2586 0 obj << /Type /Annot /Subtype /Link /Rect [60 593 96.7500000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn6 >> endobj 2587 0 obj << /Type /Annot /Subtype /Link /Rect [60 586.250000 128.250000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn7 >> endobj 2588 0 obj << /Type /Annot /Subtype /Link /Rect [60 578.750000 136.500000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters >> endobj 2589 0 obj << /Type /Annot /Subtype /Link /Rect [87 572 208.500000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn8 >> endobj 2590 0 obj << /Type /Annot /Subtype /Link /Rect [87 564.500000 177 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn9 >> endobj 2591 0 obj << /Type /Annot /Subtype /Link /Rect [60 557.750000 136.500000 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_typemap_delimiters >> endobj 2592 0 obj << /Type /Annot /Subtype /Link /Rect [60 550.250000 135 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn10 >> endobj 2593 0 obj << /Type /Annot /Subtype /Link /Rect [60 543.500000 153 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_warning_error >> endobj 2594 0 obj << /Type /Annot /Subtype /Link /Rect [348.750000 320.750000 407.250000 327.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 2569 0 obj << /Type /Page /Parent 2 0 R /Contents 2595 0 R /Resources 2597 0 R /Annots 2598 0 R /MediaBox [0 0 595 842] >> endobj 2597 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 2598 0 obj [ 2582 0 R 2583 0 R 2584 0 R 2585 0 R 2586 0 R 2587 0 R 2588 0 R 2589 0 R 2590 0 R 2591 0 R 2592 0 R 2593 0 R 2594 0 R ] endobj 2595 0 obj << /Length 2596 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾ç¯Èó›#>$Š€a ««Ú€Ý€ Œ^¯‹í…Û{ðß·”"³$R•Š$)©’]˜©J1ÅG¼# þö/ßþóüßÿ8ÿöùÛÿœ˜ßŸ¿ª‹ª«áß¹ÿùãøo/æï³jëóŸ§_ç_§¯§¯Ýÿ†¾}þ·î¯ÿ;óó¿vÿýõü§ÿèþÙ|©ÿÂÏ“bªûý·ëo­X÷WuûÝ?ÿýôï8ÿ½ïÑg&3ýüG]‰Jô³Xù×É®’]þñãï§ß†õ¯„µUS5g&…<3-ùùÿëô—®Û{uÑ’1ÕHU=0Žâ×d××Õ¹VÞ0ן(³}k•®ï~Þ‘!ÂDÂ}GDªÒ<Ro'|+Ûd}_ç©°ïKÛ˜ðoÚÈm?¬®ºa%kÏ3"¢®˜n*ÕJø÷#s±ñÀ>¤Xn5p·âœpf’×3]Ñu’ïú•õ+?˳¯cáÛ²¬ªd׿ÙGäìÉÄë:?ìªwØq;V 3«ÏãyÖôí ãjL„0§ë!Œwëxžì@KÀas„° léaÁM‡,mçxL™õá¹kPseöS^¬%µ™PiÑ|ÎIm’ùïÇ÷˜LçÇ óNãkà¾ÓRSS7¨I1‘Žšn'À¸jtº¾ûy'¢&ØwZjÒ5v £Q¯¸AJ-¢ê5§÷ø(çuS%ëû:ïØ 1ôäwNRöÞDÞõêLä5d½|?ýö¥›Rsþþ—nb×ñ†_ßždÿ¡­ÎÎßÿ|þ§n:¯ÿ|þþ×c—Z6­ª¯ß»¶ˆ—k‹¾)®ê;ZØçkK{iu7F=jáŸPK5¼#/¦³Qo½Ãäú–ŠÐž›¨!Ü”ŽêȤ7 [Ä€…ú"xg‘Màöº~nR¢ÞXñÇ‘5ê Ï CoïÝk|ˆ–ê .¿ã\I8GÂÀZm¯-Â’Ãè¶D[€[ðÜZ\ìN ³$kŒõÀÝ)¾JÜÆ©ÈOíz@bzÌÅ“ @v3v]"ª·ïÒL£ðj¦džµ±êÒ(6‘Üì“ eÌRB˜°«½36„ãÈ·XêlÏ ÀHÕˆ”œ¢__®“™ ŒÁ–7ØòµÅ»ª7üç„w^`Ë+j©ÕúYãw„Ž…áÎÍÐsèåͽJÜÐûÉrÀ ¯G P†‡¹+Ê ¯{ç |'ù¢•pýj9vàúÑdà4G- ·¼Ý C-îÇpÈ\o×Ðk¬Ð¸gn ìMC$èm.‚qGÉâÞ^ scpcÎÎŒÃaK`¥p=ÀYcl'I]P®«0Ç¢±Ò‚Ϩ:_ºøŒøŒsxMBX†ï/Ao%`òP< %h9zƒvxÀ^ÅÞöØΠøŒs! è3bTRÜò8Œõý–×S?gÎb㶈ööšçðl¸38ƒÈ‚€-𜃄µ„ï`G¤‚sp¥1Ý .猱À´pÜ au¿ ŽæÒxöÎøŽFïß´#{‡qÕE·rÞõû·6¥¼x–ÖlÁ½Yß×½°7¼BÃ(s-¶ÔpÖxn„õ‘€1–ä¸äÍYÊŸ ¥­Ã"¤ [*HÁñ,öö,ø<Ú+4´º‰xÃê¢ôÔ`7Ê|®‡Ls†¨ƒñ‹¬ÅDQZhøã¡Ì´çLz{AïX¼Ï¬ÎÀWµ`Å_¡¹Z¹âýž}?æSİ;^ Ño'žÞ>ËKÛVgUõ¿cC*šhζûŽöÉSÓ^Ó¼mÙí[jÜ‹ý4ŒÑ}ß|æýkg÷mæÁºwÜ™°³éÐËt?N¿Ÿ^þ0 ó`Âîãv¿_ÛÊžMºYèe£{E;/`®<Ï…ÃSÂÛþ® ž 6ÐÕT°1DÆí~'+CÆL5ã“t4ƒÔ|Ê µ˜cºv‰·{â1Hÿ-5îÅ~âS©ÙƒtüïŽQù Ò=³3ec¹±)ƒÔí„⤑|M쀷ëȿ֖ü›füàqòWlJþŠÏ‘¿’.ivO<ò¥ƽØOlJþ]ç3äßhwŒî‰GþÍàM/ÓulLþJYøç¢L\®£DèòzUÔl1¢w7ù«öFþíøAOþiÚô8FI‚† #G.×Úž:·«æ.â“[ºšÊ-ÍæäVçä92¥{âÉ­þ[jÜ‹ýTMåV«çäVÛºctO<¹Õ=335½L×±±ÜÒÍ4·*rïo `H }¯HÂÀ®ž=¶–·0tµ²S©ñƒ‡9¦ëiÂ1݃ŽaŒ;ÔÜ?q9æú-5îÅ|2cXŽéˆ}†c:)àŽÑ=q9¦fgÞŽ8æ}Œ-9†10±¡DŸÃ•Âìí(*‹´I›EeE`xQ[e6¸­öÁã /Õ”áe;Çð^D…]#*ËÖ77½ØOjÊð²™cxéF†ú'ÃwÏìL›1ÃßÆØ”áëÛþ›€ÊŒ pr(ÚÆSY+ÃWðEܼL’”—DÈ)Ám®<”µ2¨–VµzüÀÆ ¤arè ¹Y-öºJ &¹añáéõ<±öÉî¥Êˆ‹Û·„žtc?6FÜÔWAáv ½aäu˜édúoÉi7r:ÌïŽ Î!oXÝ ç–XÎAŽ4»ÁòÂiùÉ‚z… óÂ(-¤Y¿¬Ÿµü ‰¿cï5^nùöÐYšÛ¿z0ô”Ýv–LŒ¤‹ØöMeKщtltP3V¬ƒžE¥ØÖŽRl›9¥Ø+­©¶ºÆFÖÿ2JÏvc?ÖŽRlåœRl…7Œð•âõ[rÚœ³©RÔöØYQŠGUŠ{V}W$(TpÚ¦=yðphƒWrÚàU=Úà^ _cèÓàÄõ[jÜ‹ý$'¡ ^‰™Ð¯Ü½€þ‰ÚèŸÙ™ŠQhã}Œ-CœY ?Pz*"—èÄ•¢h'HÂ㬋ApƦ1ûàqaÁ§éœÏ¥wroS‚s?½óú-5îÅ~š¦wr>—Þɹ»¹Ò?ñ„·é¶—é:6ܦw¾Gö„VH8Ü\ÈfQÄU~Ìœ í’ÅDpÜÛÝ’FT7IS<.iä4O–˹ t°ì&Â[«)4ÁÝbCÚÜ ÞL¤ ×õM9”äJ)Ñ´¢îöX_Ö*­e\8°ï\KÁ]dlSõ%Íj6OwÚìà ©h‚g PÖµtŽà®îqý1lžb€ŽÑãÞH5ÄîGvÜÒkX)Þ”,Qgó2tq­—@ò}ñy(&׊7¦¯ç'\åUH‚æ{e\°ŽÄ>nÞ£uw©Ä\ÒË›ŽDuxH8)*±ðÉ»ýØÏ=,˜-?’ÿy®)¡šcbv´¥¬v{djˆÅò ë*ÊqóÍø{ÍË»’œ4ŒìžŠë ŒAÌލG­å¾èN%/¶Éç‹àldtPÀSÄìîE`òžY>†š:Vð“eàÕ}BÖâªux‹å5ò{ÝIFTÛ‰”9–+&¥È ß1Æ=O'×]$QbÚ+ e{¯À×ý®I®3àå•bu{Ž‘åº…ø˜{y;Æ\¶ÈWÔ«ÝI´s¿IB9-J±Ÿ6ØŠÔs”a 5…¢¤¶/‚5 ‡¢¨W$†%IØZÕÙXápdº²›&É£HX±ûƒ‚³ÜŽRL)¿§½Æv¥3„9[$NÈ$‰—\ýš¸øûŠJM¢ÇòpÑ@Š ïl\1•WÊe¸Á š… )Å£“WÿàJ:ðÀ­Hfßý´IºC4j9É(˰7êøË6f/Ü8 nYa;’ÄÚò‰þ(0ÙühV êH8ϰo3ÔX„y³ÜU—¤[ëÒVÕŠ›J½¦¥¦ÕýëÂe¶ŽÄ¨ÙQg‚IÔÒIÅ|ÐõÚ¼Rñ‡ßõØM5‰”5÷*Sªvä&®÷¸Ûü“ªvÍ÷çN@aŒ3׿K›B*ð°¢ ¥ !5’¤Þ£ž{²Ÿ$ºö_,G4í3D8år„“T6xÇ¡t’’¡þmíbäþäîȵIŸÿ‰r¨,J'ÇÎ_Ì´-ùbû¨ÀÄårRD‡Ã;ФúÀ«a§wjÒÖ–M},•b¢b”ºGHSZá¸.qʸ©ÖÌŠ€mIÂÐæe+âÐo”SÛp)ðí‹óäRqë_î&òw•caÀ&Â`xr—akª\JWŠ`àmû÷ÉfÊéË|Úû&è1E=¤¯€æ—þýŸ'ÝÍiôào§o‰pÜ4űÙÕß³!µ P~}\‘yÅÊ5V¾ÎÁa¨û=ʾ2©4ÅÉÏuÝH«nç‰wã^è¬RW}û3Ñû¬žÎí@·Ô7yŒÝI•nåöq模VJ¢ Ä8 „Íš¨›=‹‰hiŨЭÃéå" 4m¶ñ21NõÔ¸…;ãî¹ewïy7óØÉÝd>®ÊÉÛ,?1 CqÎOÙŸH|óÀ*èÓ­”7›˜Û?G*#Êö'e8J ‘,†"Œ)§ÁD¹ùU1qÒt3Uä(uÊZÛ Êœc;8fzÏÁnûb¢ñ$…ËÏ#HŠönnhÇ™Aé÷ÓÚfgÀÖ2°)4¿¥n¨Mò‘‰˜iÅqRóæÛRøl…Y™²LwI<`ÅG-оÆVz )î ‘R!W]„£¥B庼yq; ï’ð‹“øBIÄãP._Œº¡y«5êÉŒþ5 5oÔ,é‰læú8;¨’@1ÕQ‹k!¬8|WpÒ#€É£Ò¼cžg102^Ç»¡§†úœ_É` <ªÀpUSx±[i)-Çm‘ø@©á0<ê¨$Œ£Ix=ôØj¤¤R•c¸žD±£Äç0D7—£#l„õ·aЇ‚xBÒpÖ%V8‚‹¡ù4@!þÁ2$^ðýk¡e¹©¾# txnŠã_‹w¹6×S¥e- )z·èÝpoÛD6í‹ð 0¬1õF«‘ÒüCöÍHõ?GUàecˆUÙE\7ƒðÅF 6yëÁ³Æ'´qo›«áÒ²‡–S¥œ¢4ÁŽ@MŠ´#TpÁpPR‚ ¨nZŠŒ~&¥X•Qzsv+E·¹ôæÃp‰ßÁxÜœÓKËÇk)Ò»Hï…Yïü "³.¨ao¸7ÌÈ ¼³¹t(-ÏÔRtÁ3é,Åp¶Î«2ffñ:w‘„l®'°³ó«±ÿwn7—B¥¥Hü"ñ#ñW­45F¹Ç¢2ž;ã*û!|«¢§hÐ!­gséýÑZŠ6*Úèk£X´“âÐút ÆÜ¬óhd½,׋FÞƒFÆ+åøýæzêyZŠF.¹hähd Q‚¥œà¢Ì:@½ôúY, q«~œ-Ãc¶”ÅÒ²÷–ba<“…bxÖwo3Ëu\6µÆÙ5_/PÓ âÏ­d)––"׋\_–<®H€5®…•Õc¹OôãSEXK`!PÞ›R¸´”–¢YŠfY¦‚ Dq5Ç/uA“»>I`Œ[÷xs‰RZŽÚRtAÑ ¡rìbmÔË1omu(Ï] ".õIBfbi)-E‡º*3ž¿•2w5ˆÀºa„ï¦2³ÊŽ¥¥Hü"ñ3K|ì™Pγ,z y´D“½Jå²ìÒRZvÞR´Ä3i –ñô…lo£n.£UáÝaØúßžkKË3µý„2zÕ¬ñ=à<ãMYRç>GMª“B¨ãÈ‘%ÜÃZZJK‘øEâ/K±@&,¡Ž G6c&lÍrŸÊÆÑúÀy‰’ïZZvÞR´Ä3i ,ÅZ"c¾k-rŸ‰®qŽR9ß\ZÛRäú3Éõ¤ØU®w?ç_Ê÷¯K_XTúÜÎ ÁÄ¥bu7Ã3—S¬ÖÁ[ÖOÝ…©ºÔ²iUíCŽ_8»6ŒZÜ5~‹x5ï4õ¡w|3)®¯ŒððŠÆ1y­3۹¹}1+Uf .ÍÏõ6è3ù>¥ N–™¥{ 4[÷sÝ+Ø"Ñ2î ¾S /¶jéêl©×ÿÝÍØ" Î#šCxIšUˆ#‰0ÐÛbÜ^©nsx…¢xn„õ˜Råò„¹\fŒäuÅxÂ4Ž{k§~Uµ6å>60’ÐhŠ%-qþzúÍ]Ìù endstream endobj 2596 0 obj 6437 endobj 2600 0 obj [94 /XYZ 31.5000000 614.750000 0] endobj 2601 0 obj [94 /XYZ 32.2500000 614 0] endobj 2602 0 obj [94 /XYZ 31.5000000 370.250000 0] endobj 2603 0 obj [94 /XYZ 32.2500000 368.750000 0] endobj 2604 0 obj [94 /XYZ 32.2500000 129.500000 0] endobj 2605 0 obj [94 /XYZ 31.5000000 130.250000 0] endobj 2599 0 obj << /Type /Page /Parent 2 0 R /Contents 2606 0 R /Resources 2608 0 R /Annots 2609 0 R /MediaBox [0 0 595 842] >> endobj 2608 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 2609 0 obj [ ] endobj 2606 0 obj << /Length 2607 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯èóÛ?DJ@°ÀÚcÈ!€a99ÞÝ,ñ"Îò÷ÓjM7¥G‰oŠ”fF6vgÜlQd±XU,V½zóçOÿÜÿëý›wŸþ³ÿÒý|÷iW|]]þìO¿¿ý@7‡î÷½oêý—¯»oûo»»ÇÿÛ]øôî¯Çßþ·×û¿ÿûmÿ÷?ü©ûÒé _w^ùãÏŸ¶^«úŸ§ÏÝýí»ý璘¯ësÿïï[¥½=bâÍßv×Yªóß?¾ü¾{s™ÒKT£kÛì•5v¯Z«÷ÿýy÷˱ÿkïÕ¡µJyg}õ„÷x}zQ¥Û½Òmµ¯Íð=ç¿"½+ù¾kWeëû½Ë÷íu­ïó¸¥Ir]Wܹàºzï;êø´ï{—ﻵùú>[š$×uÅ×ý¿s¯> ÿÆTÆu€jö9…Q9ÅMïò}ë|‚â2îL‚"Ò¹àºe:êÔòŠý¦wù¾­³Ùú>[š$×uÅç®i  oÝeYLÛÊ/Lß»ü¢[eó1ÔyÜÒ$¹2î<+CY£›ü eMÓ-Kíå×¼ï<?Y›íäq·0E:vôý1¡<ŽË'àPü-òàÛÏ»7Ž’Ëí?ÿr×ù}—Ÿ¿îìéÇC^«÷ŸÚÿé8œØþmgÖ\§ï]Zü¹¥94måt}Ûò=£4zFÙô–ª>·˜Cm]ãïZ,5~ÆÁ÷À™ZßiP©s‹ªΫÓ[ÚKK}¨Zs?6¼ o/ÏèkÓœUÀ…룂¢˜Cà{ªË{š9„„‹¬[âÅð=‘©C–Q " nÁ½éËØ”º>ô$â+Ìè˜ÖƒeÁ„Ä{w§Ž‰Ÿ0X8$,"ôâ ÷öþÜRŽ:^Íox‚ˆ ø™‹i&!¸¥ÛûÏGm–I5¡*Rà4W"Ρ» Y.DDþ‡üdßKÍþhîU€¾>ÏßÙú:ËwÝjœGwÇŰÅ6ðZtŸiÓGi±[ËÖR®¥“cÿµT{qK§_ÇZàn¬ànÄó©>À¼O±<À£Æ´†½E(ú×¶Èé¡’ØÙ'H;S§KâˆôÞ$ñÖòl[^š$VxÔpŸbé-+‰;ƒ7Iw#(#UóÉmU ieája¾Ü¤êÖ²öÌ׉BH.ʆô„} %q…gŠ{cæG{ÓXâcIŒu£ poødµÑ”/¢%|Õ{IY“®Ÿ#6 ÖÂ…Þ³¼ÚZÖÝòâ´ö (És&äN {Ã-àõÁrkW,-1ï0tcäÛï休¸\HøÚ_à•]½«Ïã ~»€»€d®ÖZGèÆ\âõ©` Ž‘Àt#f:¸ÕR†è~p¿ùŠ t?:F…óƒ÷‡.³Á2‡0Dø¸yÇDÁ«‚ù0"÷ˆ±E–…ÙÙ+ŽzÁc+yÕܨ@:©YlTác'4B"רÔÀ@ìÐÄf*<”Gh€gŠs¸·Å[‹t‹Æ,vàlc‡u©ãqdÜ]‘™N]K9±û_M1£&.  ±Ú‘Q3œ(z4\Á¡žqò1{sÈ” §ŒM ÛÒ6nÁNjvé˼gqͲµ<×–Íñúšd4–.Ìåe„ˆ€™E K³*©ló¬µî ë©Mƒm-›6Ú´ÑëÓFx¦XO­^ƒ¹ëíá3Õ`DÚÅá±­ñ{ðÞ\\zo-±ÕŽçao?h‘L€"ö<2¬.À£ÖXÞâ]Ϭ‚¬z³0V`aØ›†5ÌšŠÚ+¦xYÈ!Æ´=WØö°Ø&€z[ 5¾¹wÅwÏĨ1_®@Sn-ÛéyÓm´nÃò bãÖ\±;T|FflP¼¦ø†ëw|æ/˜”ØV=èÆ¦)c'nhñD"`ˆt÷ˆ1Y\¼ž–MSnšrÓ”¼¦Ä (> @˜t ŽÖe4²îÁWMÆ1í‡}„§Ûâ”3F‡â`)ö±bKs9–Ä›~ÓÈ›F¦5rDVa¬sˆ¬Y»â˜îÈš°ÂE‹BúL¤Ç¶¾½g×4èh Ÿ!@qúV b¨lÆ.Ϊà …"hÉἘ|V&o6‚«Šó?Ìž—l:¤0¦tjòËJl¬JË2øá Ûw0’AF4!s«Ã0[dÏÌßàT 1“´Ï0µì>ËŽF]ë&ÐnS7…7˜üb¬à`#䞟•é„‘Ä)r½ [#2õyÍìnF¬ùæ1sË\i52/ +H¿›°.doæ=TjÉÓz hìˆAK˜\)^Ü¥ŒçŨQÆÄ+ÉŽµ&fA`G©Ëc b’²\~}9d™5åüÉiûº`F¥¢¦:iX"nݨÇòÍ8M˜<ÑcS$²”)uŠ#͉(øH–Ž­ ®ýcÁØõr·µ—]û¾¬e…‹ÈMµ©®f¸b˜xy¢xžCâšP£ú±ˆO^Ô¹)I943q;Ìi1³™‹_ŒÍ÷Ax ៈœJ_ËÉ9¥BÞ™CÁ ó Hc} ,V£÷²JÈ:˜u‡D–}ÍÅÅp1.|£Ÿý|dÛÁBÈ^Öæ¸>š%q"ðÁ¯ ‰"ÊO/þZ.tnÊNkûê𚢮R½±ú Û2žŒ„ß-dg«''/´V¨\DíhLH&Ì„Y‘<#ævÌâRÙD‰ùÒ-r—SHà,ÇhŒu÷„x9îC\›/!Š;Rà`€G¦ÊÖ•Ü1Æeº¸Xüz‚Ç܇áT"…[¦ÆVf…›{=wŒÈ¬#°–-#‰fL!8¡ÕÌ´Èž±•™Þ3X²cøµ1¨3f§ŸQTî& H<ꢻΪ'ìºgzEiÛ«ù/§È h1 "ÐòW‘™b‡s)¸æÜ½ï[äðŽèÍ©üŸB^±åœ°kvc.žS<Ø$·n,ÅÅ¿Š×ìB¼Öõáô¦¯ý¿Ý¡iª½;ÿðJuŸ6{wþây’Ý'_vΔjuÓ¨þ[æ®sûŽã÷»ŸÛ‡O›Á;Ìé™`$Ço5w½4÷ïøu÷ö»| ¿¹è¾S&à”Â×bÌðhƒÁä¿ó½Î¿î_‰!9˜äù„w,e$bKÖ( 5N‹N§Ëk¡k×›_j¾³ SÞ*&BØüMùƒ%¶eä=LöŸèÍ(¾7N‰ÔÄ/&ˆ‚‡DÁÈæOíW~\L¤±æh&zf¾¶êÜÿ#mº–Háfáí%þjW8pL¿ÜÚ<Íu!êF Q70D݈!êzCÔÝ¢.0Dݨ!ꆨ1D]oˆº;CÔ•5D}À¯i^Gì­"€Ô;ðõœl¦ f]ÎâmóX¼)N F†8U™eUJLXŽ”ûYÉ¿¢öšl„pîw!ËT6“}jåó·Ì]/æöW­ìª1­ìªP+Ÿ> µòù[Í]/Íý;Šhe§®+QO¹‡ÆbŒòëѪ ÆYLºGgÄU›ÄoÈ»»[Œ4¿Ç@Uá;ÃÚ³Z6GÁŠc2e}Çyô†!>UÀ„˜z)Ä—É`ñœ±5Ö•}-dÂSA óÝ(l&œäÀˆáå nl¾ø¥ð•2pUM°Ÿ—¼ÐõÚ‡£)—~*³eÊè1øŒy€;ëE%så<ìµá¶Zò¶Rs>àÙ‚¥Ê„¸& ˜P™N®&• ¹²“ WF냳g =¶àÝ››”" ‹(éòÉòGøz]¯f÷Ê–®Æa4WDÝ1V/Ñ›lƃ±Â°¬„¼H 1ΕÆ&t’ˆeMð ­ DØó«9`/µ;oÄ­ÁÀKkÉn*€+t£~ `µÁ;× ÷a¤Ú„z;ÂH¢éHO`ËœA]­g¤4Çê˪ï¸AmÝ5”„Úð}ÍÉg ’‚Æ,†€i§¸÷f!Ý"H½À½áùD’ra°Ʃ·°7¼r¯+„Ô‰¤?c+˜âëÛfr2{&’r_hâù1 =MßFùœ dÅ’” |…G€e_¡ÝR;•‚ç`v†Q`hG@Á&Aº C"”ܵÆMÓƒOaþÇTÄÒÛ2S€UR»bÉÅpR„c±tÀú ·À•ÓpFVØÏ[9˜1è†ÜZœw00ZoÍÒˆ]“̃uïq»›ñVH3x…˜æ,EˆÓ'–ŒüÈËWcg-/_݄Ƕzûçþ›I¿c,LyQ®X‡\mU_M® \m£Vß5˟Є%!Çhƒ' ?\©4å©"ìœ2µv=ÑÖ3vÆ ;'ãXÌÿ‹s’Å'Î’zÏõ÷=%õ^Óû¸—?O¼½Çø”7½·é=–:‹óADº~Å•ë~[U~r<¯G‹F¤±…9©œ†·•îÑ“Ëix[ÙéȰ¢ãé+P¿ŽHµiЍ¾ÚñCFƈj*þK2bxå"ðû¸—‚Ú¿`œUZmüÿ$þ À÷¬øÆRôö†ÙM¸€ÑòóyI{3ž f•/]îJùÂ1ÓLæ|O ^ Ž:&°"DI¨pÊäXã¢ËÂ5i5`ÐõÇHgEŸö=2gì Ãf,_ï‘U¸ÌŒ(j;5¶çPYyQéUŸo­”Pc›õbà>.,>–s‰ÕŠ@·H!u0 ‘ô ¹ÔÚŠº©©QÏ¿·f°D©­ƒïù&SNŸbªÍRÖ÷vÏ"|ÏRª|@DåŠ\«,?ý ”~J)Q ×¢¬62XƯC¨ÏH sg,[AiJ}æwÛiÕŸé6‘K]m¿ˆY—f<æ Âß&[©VøÂ<Á¡ÈÛÊ™}fÆòäuÇkÚÊô©&{×qA1F€«. Þêj¦P|ûk¶j·jsh±T=µå/[EgÅÄxy‘«¢åx(ß¡.ºHa–È^)7¶Lø;cM1q.| ZÎJFJlÕ Œ™!Zp;ÁÉr+ý4÷J©Ì‚ˆ±A8^0QD¢Ê¨jÚŒýƒë†&ÈKYÖ)dHZ×É”*‹=)Ú#+¬LY8F×ËЖðݬµ Ò‰ª2Íl¥ˆ­Éȉ1˜ªÝ™WOôÖ“‹1å# Fxön©JÕP§îDŽ…ŒCG$¸œ‰Åx…ðè‰@ñâDSº€·Ë÷ÇðÎÝ\©&4p uD$ŽL)·çv¨SõšÏ¨1D $N²(U±Üu…Q®Xîà3°nxÇ—ÊxYñá–È{4z¦c–±ŠâïQK¤;¬n5šé5U}Ø©·Þí±Ò»Á3¼È -Í~Óÿ‚*-|W”ÇUÛ§Þ“_è›m¯Ô‰'Mux¸Iž ¥|&òž÷¢š[Ö=Lx3#™Ÿ¢ wTŒQ_5Á.›ðœ”kÂÝìa”qß$\Õlqž/OcÉL ºöÜJZçâW¯Âw"yÃ%¨¤®õCÊäTcnÀrƒ#6öj$¬3ãû!äsTEBˆ3s±X7:Xûͨì[2î9ׄê¨TFuæØÿ§'ø#J»6ŒßŸO‚åñ0Ÿ‘”θ“š¶ µ×+NJØÂËC$ŠÚ}KÇàåÕÓêT¾ížÍ_wr«R.Ü÷·Ñ?Ç¿ûoÇÞ£/ÿ8õ…£kFqÇ_©“J>‡ÝJ¥±í|!°aÇ‹TÒ}–cC©ä†-]d„ .Rpï< ÷˜©‹â±±}èfŠnÀp’Š ·3®c12v{;•<2 …{ƒÏt’E%MýƧÀ2Üé÷ãˆïÍ×1ƒGÿCÀlƒY@Á·UCèà'Gˆ‰‡Ô¢ý×ù oxz9#£ÇÖ„óZˆI|ÕÔ…·ÜbàœºÂ¹@¦û»ÿçi6 endstream endobj 2607 0 obj 5307 endobj 2611 0 obj [95 /XYZ 31.5000000 297.500000 0] endobj 2612 0 obj [95 /XYZ 38.2500000 607.250000 0] endobj 2613 0 obj [95 /XYZ 32.2500000 641 0] endobj 2614 0 obj [95 /XYZ 38.2500000 494.750000 0] endobj 2615 0 obj [95 /XYZ 31.5000000 641.750000 0] endobj 2616 0 obj [95 /XYZ 38.2500000 607.250000 0] endobj 2617 0 obj [95 /XYZ 38.2500000 494.750000 0] endobj 2618 0 obj [95 /XYZ 32.2500000 296 0] endobj 2619 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 269.750000 71.2500000 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 2610 0 obj << /Type /Page /Parent 2 0 R /Contents 2620 0 R /Resources 2622 0 R /Annots 2623 0 R /MediaBox [0 0 595 842] >> endobj 2622 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 2623 0 obj [ 2619 0 R ] endobj 2620 0 obj << /Length 2621 0 R /Filter /FlateDecode >> stream xœí][oܸ~Ÿ_1Ïv"^EE8¶ ô¡@}Xô¡Èv[,6‹ºûп_iDÍØ”>J}m%a)fÔHŒÁ‘ \d©)‡ŸÂE0ÁPhƹ"~O¸ô+ÂB„…­àí!à"Ÿ)˜Å´õ1\ Æ N§Âcé‚Y!€¤5™yLÍfÒe.÷Z–T™­­çw ò#ªA퉼+7iDðö˜®¬QT‹ î6e+*¼&À¦š_·j¾þ¹ž•jS#‘¸M˜-ò Ææ.çJ=mç75j)ßÚq7–ö2Vù(žÖ‡1öàá9ÅEÉ/„› `ŒÜKÖ©‘G줄¬Ö¼›Õ‹"æ+ÖNGV^% 9šžÃ‘Ææ½¿=ï}]›·ˆØL‘{7Eà3µû€±J}Í&ÏfØD¨ûÛ%ƯYq7T§ºïTp(§²$´¥u¡RbÂ5c’}FóË©BFñ <ÛzÆŸ€©u@|;mDA¬T6 G"8–8›x"¼?ƒñfál;ž©KxëÔl=?®[¾§ðìˆRåE]—{ϰ`boÉ IQÄ/ŠŠHòÝ$XþçvóD@¼–?¥CËr,§n*šÉ<Û <7¼A7­#ùïàHí1'GB’ðL‚>s2™CÜkõAvè½gÐk[˦™ÔM¦f{@Ï zíÄz ƒöš4¢ v*›„#\KœmÐQSÞãµ°qGð.ÀÙðy#P ~L‡Ú§@·,|$bñ3¾A@ø«¹ˆò]‰Îl¤ºÁb§Î->ƒ˜-œ RÛé7> Þ‚RGɳ 6H¥ì$ÓòÂvÒDi6Kb©Eô;JÏë˽æd5ÇxòXZ|ð¦å&dº&¤8®ŸÂ›*×_ °¡ì¢„l–Sî8ÂXÈk3ç(#¼ÞÊ{˜u ‚´Ž¸Xc¡¤”@‚›$‚ë“'ô'E/ ™ô$§ÕÊîžZ ).ž>[ÇkªúÔöÉSáiÇZZ]$®Ýe­EŽt·ÄM;0Ôp$R‹Œ[€Àêa «qãS•Û{!ÄüS*RqÿEJ?I\Á ûVâ [JýqIzjž,í©Ê¬î”µ¥Ø" Þj‡ÎÇ‘Þ ˜+Ꭷs³ÌºÝБ5lû0㊓§”…b]:—ëIÌ¥™¯&ºþž©y·¨mp¤fu©R\4M®¬H•Òê,){…ý¥ÒâSL,ìVūϭX¦-Åžóæ<:<â”TqÞ¼„úxÞ´o’ì+U ]J!`=À‘„}:9Ly/á…S$gûò B¤´®Pi5o£IJÕÿL妾¯JA|[©Ô8#]К~ÍÔ¸GøÌ–wO©qל7—æ–3­¿Àá5ÍnI_Üž&%Oníõ“±z ¶ç"·¢Â¡ þ$| Vd®\]ïß”8æöÌ&cÞT« R:Áóö,u)ÅR\~‡èº‰TO±ö‘³H¸pÞ…¥Â…gw)¾sk¶(ÒCèAºíRˆÇ’áLIŒ¢ÌÆRÍ—°b‚/#¢ÂjÌÁë»]­¥ %7xSçÁ¬wÃÛP@¼W?!áFô$‹Òú s/J×ã-òt‘'J“Ô“r»ˆGè¼È¨Ó…D8'ÕIllá´RÖ½HZLèŪà‘ëH+Už…')N¦\EÙœ8L¸àåvÓƒõùêRwÇÞdY@áKÅÊì½’¥÷ž’‚~“oiœßc°ó^nÁ庽BüÒ`\ãˆQÌc[ˆp5Qšfîªø@×—àªdyˆvüE)3!j£uLú¸ü8DréÁ›I¹ÿ…t£¾Gâ<_=¢OɶæÍI\ÿ^?*)p{U+]ÎÏ[ÚßTë2ª5bƪi‚I‰Úa÷夯~aˬ.ëÕp!i¼ÿ(ð-uà EÇÖº Š’>Ç+8yï)!µ¦ˆÔµÚŠ0¤9‚€Ew­cIûZÿþÉ+½Q:ù”J\5ït(s …û(â’×â ­t”‹ºúÑÞÒY¶â´(×//ÒB:°2’Îy™l—Þaã´‚ù¦qo7wË7¸â8µõ,<[¾ÁõçXe/ØGÒÞcêÞÜ¥W’‰`)|*¶L„-á¸Òw˜‰`ëKróJñØ÷˜£`›K²éJæ(ÔB²¿u&G¡¶ƒ ·Ý«”ø¥Ü7â|YÝÍÄSŸMp¶– Ë ÷üÎ)Ãw®!%©pƒ%®ºúßü¨«F"´t5¼[m¡{s®°Ã2éNYÆj±›ï'/‡o¡6qÇ;¾Å¾ß¡‰ÛÅ%¼ã=r[ºWîñæ{ Aê²÷Ûg<ŒÒëú¯N£FÐ ùQ);÷ÊóN)PÚ {…©×¨oPѲ‡"ÙvqöÔöÖ‰Ž/3¦4ý!´?ˆ¼Ç½=c=~Ä?í2«”‡îñŽ™×üºû9„y¤¸ðzôõ ÆT$߆’pAQsX;K¥,’72’»X;!ä+‘VŒñÇj(Gº¤Pjß9”æ^Äô´Â¼†²2" ðˆK;¾)7ÁÙ$t#*¶{” ¨n1ÃÃþ«R7®o,\õ ‘ðHÞ¢+J"H¤€÷ÂA|ªÚÍ$Üb@0l1÷'ù}ðl·äRò™ÅÛÍÕO!f[›:>ù%ég¼2£Ôå÷—ÌOá—”NÞ"5JÅËÝ” ”q“¦ÉÞ«ª ±CœƒÉÎgñäçí,Ê|¨æ”¤¬)Î:º)=¡ r3Âué54ù+ÎÔÈBý¾ýfHØX2BjÏ–>çÐuÃô—* }áÒfd¶Í$äÑIoÚ¤É,Íy®š™Î1ÑM@9>‚… ¦F²_Ú"­ á,uSIv *®ínÚñn):ÅRt¶þ¹irõ*úç6j¾ o )¯¿gLWpDÀœ×+%N9!㕪\s€CI‘jB}‡‚»­á{0F5ÎN§d´_1Ô‡)5;p¥Ó›Î¶€;˜¡2×jàº#‰+å05áÀ,šð{ð£ì#å”Gx ¥Æk®N3é,K\ùG€`ãÄÜç ŸƒÙZ²¬Dq÷‰mõÌYU*ân ˜ ”hÏ-GEJˆ[…áO C*©[ÀžxË} 夔F|¬²õRØ)X8k«¦¹„J1_aN¶VO›½dªÈÆÉêTé³Ù¾w¤q­oEn¶ouí¶¯•r¨Ùlߨí !ˆð§ëOÙNR¹"ŠÈæØäQNÝ‘g@žB“›g ºaÏ€R—4Úlç÷e;Ͻ:ÝxtAw‘#˜í×þ¥…' îç¹_X°7Y’Ö2«JtñëcIu·€VqÞz""Üo–’ÀFÒÃŽG<‡–Uÿ²±Gô5ǧ`{ö+E!|œ¼¤CE` Xá—>Z §.\€E&–!ðlð/‘DÒÒë󱥸îçâ·ÊÍTÎÛÜ5+k’¸c<RÁÃþ„Ž'Þ=œ™mùQ‹þêè¼áðÈ Dhä0â÷h7ò Þq±!bŒQLv;ø€¼ò+RÉ®®ÜAôÓ¾¦?Áñ2Ö‹¨9ñ´ÿ¼û?òï/ endstream endobj 2621 0 obj 4166 endobj 2625 0 obj [96 /XYZ 31.5000000 515.750000 0] endobj 2626 0 obj [96 /XYZ 32.2500000 707.750000 0] endobj 2627 0 obj [96 /XYZ 32.2500000 259.250000 0] endobj 2628 0 obj [96 /XYZ 32.2500000 133.250000 0] endobj 2629 0 obj [96 /XYZ 31.5000000 134.750000 0] endobj 2630 0 obj [96 /XYZ 38.2500000 85.2500000 0] endobj 2631 0 obj [96 /XYZ 38.2500000 85.2500000 0] endobj 2632 0 obj [96 /XYZ 32.2500000 665.750000 0] endobj 2633 0 obj [96 /XYZ 31.5000000 709.250000 0] endobj 2634 0 obj [96 /XYZ 31.5000000 666.500000 0] endobj 2635 0 obj [96 /XYZ 31.5000000 515.750000 0] endobj 2636 0 obj [96 /XYZ 31.5000000 260.750000 0] endobj 2637 0 obj << /Type /Annot /Subtype /Link /Rect [60 479.750000 183 486.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn2 >> endobj 2638 0 obj << /Type /Annot /Subtype /Link /Rect [60 473 117 479.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn3 >> endobj 2639 0 obj << /Type /Annot /Subtype /Link /Rect [87 465.500000 111 472.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn4 >> endobj 2640 0 obj << /Type /Annot /Subtype /Link /Rect [87 458.750000 109.500000 465.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_carrays >> endobj 2641 0 obj << /Type /Annot /Subtype /Link /Rect [87 451.250000 110.250000 458 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn6 >> endobj 2642 0 obj << /Type /Annot /Subtype /Link /Rect [87 444.500000 104.250000 451.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn7 >> endobj 2643 0 obj << /Type /Annot /Subtype /Link /Rect [60 437 104.250000 443.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn8 >> endobj 2644 0 obj << /Type /Annot /Subtype /Link /Rect [87 430.250000 146.250000 437 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn9 >> endobj 2645 0 obj << /Type /Annot /Subtype /Link /Rect [87 422.750000 139.500000 429.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn10 >> endobj 2646 0 obj << /Type /Annot /Subtype /Link /Rect [87 416 186.750000 422.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn11 >> endobj 2647 0 obj << /Type /Annot /Subtype /Link /Rect [87 408.500000 107.250000 415.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn12 >> endobj 2648 0 obj << /Type /Annot /Subtype /Link /Rect [60 401.750000 102 408.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_cpp_library >> endobj 2649 0 obj << /Type /Annot /Subtype /Link /Rect [87 394.250000 112.500000 401 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_string >> endobj 2650 0 obj << /Type /Annot /Subtype /Link /Rect [87 387.500000 114.750000 394.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_vector >> endobj 2651 0 obj << /Type /Annot /Subtype /Link /Rect [87 380 127.500000 386.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_exceptions >> endobj 2652 0 obj << /Type /Annot /Subtype /Link /Rect [87 373.250000 151.500000 380 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 2653 0 obj << /Type /Annot /Subtype /Link /Rect [114 365.750000 160.500000 372.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_basics >> endobj 2654 0 obj << /Type /Annot /Subtype /Link /Rect [114 359 184.500000 365.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_inheritance >> endobj 2655 0 obj << /Type /Annot /Subtype /Link /Rect [114 351.500000 208.500000 358.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_overloading >> endobj 2656 0 obj << /Type /Annot /Subtype /Link /Rect [114 344.750000 181.500000 351.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_templates >> endobj 2657 0 obj << /Type /Annot /Subtype /Link /Rect [114 337.250000 178.500000 344 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_directors >> endobj 2658 0 obj << /Type /Annot /Subtype /Link /Rect [87 330.500000 145.500000 337.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_auto_ptr >> endobj 2659 0 obj << /Type /Annot /Subtype /Link /Rect [60 323 99 329.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn16 >> endobj 2660 0 obj << /Type /Annot /Subtype /Link /Rect [87 316.250000 115.500000 323 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn17 >> endobj 2624 0 obj << /Type /Page /Parent 2 0 R /Contents 2661 0 R /Resources 2663 0 R /Annots 2664 0 R /MediaBox [0 0 595 842] >> endobj 2663 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2664 0 obj [ 2637 0 R 2638 0 R 2639 0 R 2640 0 R 2641 0 R 2642 0 R 2643 0 R 2644 0 R 2645 0 R 2646 0 R 2647 0 R 2648 0 R 2649 0 R 2650 0 R 2651 0 R 2652 0 R 2653 0 R 2654 0 R 2655 0 R 2656 0 R 2657 0 R 2658 0 R 2659 0 R 2660 0 R ] endobj 2661 0 obj << /Length 2662 0 R /Filter /FlateDecode >> stream xœí]Kïä¸q¿ÿ?EŸ ¸—OQ‚;¯9XÌ99c;†á5²ö!_?R‹T·Hý(©þE=zzöLSŸõ®bÕOÿöõ¿/ÿóÏËO¿þïå»ÿûã×7quVôÿ]º?¿lPõÕÿûâj{ùþëÛo—ßÞ~yû¥ýÿßÞú¾~üö_ÿwQ—oÿ÷×Ëþ«mü£©{á×7']û÷ßn7N¶ÿÃß]û_Þþów—¿w=†áüdÆ¿ßh%«n3#ÿöV)oþùýïo?õë_5ˆ¬+£ÕEm.²1êò?½ý¹í?ô.®‘ÒUƉwŒãÔ0jÚ®’anX:—ü}[áŠõ}›7óŽH]Élߌ‡jmÓïu6>t^`ã+iËL7oæ ‡ û¾¶kêÿƒÿ¦\ß¶«j‡5²¾Lˆ¢»ZÁùÀ¸¶u9Ú4t^Ô­‹õ}›w!Úûæ;T'D@qiØwç¡wþ¾¥,1ý¼¹·Äk¦óöCÙTÂÕþ›N%œTR‰mNOªôÀõ^·+ÞrŸ¥Qvbà_VtAdßk'…«G)\]Ì%•Ä߃?·U¢ƒßtg߃—F™‰®·ß;qß;å÷NŠ~fÍåqžM«-}=É9¡JXÔõÌ }yœ§>ÑÀ°)@8Äi5·ËÎ:Ñ„9žâ¤Ízzìòl®?²ðkÛS+ªÊ¹VyÝE‡¬•ÑÀ¤Oï¾¹Fº2|øööÓ—vF-A­.ßþÜŠ5·!û¿¾µ’ºmÔ•i7ìÛ/ÿ"„üù_/ßþúÖ\+eà ýŸTðÉôD4ð›š0ŽO|"áŸhøä#\é'øä3z¢àî<Ük g­ái8ÞQOAãóÁßxÖê '\ ¸R…ñ§‡ÑÏßZ Sœ:´¤Þï^7ÄO ¯c:›ð8Æ(çHò ­Áð‚¿Á° ONCÃP®,|‚çö¢ÄÌð†áC¢†ãd ä­i¡1âFh¬n¶÷›+åÕšªvöaÑ=i¨¯u#n3lêI¿…:t– ÌÄ7þxÍÕèÞ‰§©o|âßô@i¯ZÕr¼üA³Þ’aØFÍ>ø$CÈ1ÊA&ó"U''U Ûêcf \¥¼kU èÁHê«îè¾€>éQ»ºV¶_B,ùL}Ó otz-zEà3ñ®ø‚úW=˜Ê:|´ 7ôÒ$ß(ø¯Ã#×Ä7Ð'd-³Joà¬?Âs3Íú'x™YÃͬ秇wmêÅ;:Û[y9À‰Áa!§³ˆ§{±µ^Âb1“—éöG´„ùB&¯e<%8°WV^Åž£^¿mXH¢ˆ(ž^Þ—a4\1Þ ¿@q­œKéìU4Òý {ó¤Â£%3ˆ—‘2ážgN‹’xg±ˆO6Þs(QVNÔJFˆ®°å†M @TG›x6¥Ñ“•¸tŒì@t¼‘xß0º`ÐdzÆ(†×ÆÑ5.9¼6¼|¾&ðN%´S4¬PCPXÃá^x§< B2ç–Ù.BoxÖª†ß`¦A RûŸO†à•ÂqH½aÜK^`—“‚ ?*(6‘nŽ€n:e…•ºÖVϦ<·jD­ŽÏ½×³BtÆÄ<éÓ"ÈŸÏ©'eìõ…3#â=Àð€aˆÀ}Omý_Ç}Ë:2 CX:Iûæ°kØ0Æ= ) q!vfÿJä;xù6Deçs¹ÈFq.¶Ôdô À»ôÒެd(,<„ i_™2E$‚Ô–™,³Ïm3!p ‡Ò!ØÓ%Î@ŒÙ,Ò56G`AbMf²ÑOc°Þ@CEüÎJ1< s+¤`7‹;ƒ—à`d•Ÿ˜M¾˜¾à£ÄO°êgMp*dzc…’ûäC šxÃ:3ïvmfg?µŽ‘1#ó$2&EP-o&¬T¬zaqåçå‚…¸'ÇËkbV€ò±jÎéñ2Ū‘zƒ±Jž¦NÄy‰v*îÆ^e¢åðÜp$Œ½¢Ä’Q"¹<@OÍ FÚÉÏpß»“‰ÄsÃû†g]"Ú° ’éÊÄX÷=³6B„#ŽIÄ1|xcó\„cyË\-ë0™ÝýÏßµ™dW6ŠÂ›±4¸Â9QØÉ·‰ßZ5U„oør¯Àî·12÷(w~.M˜´Ó1eÚVÅ, FÔ‹!só_"!\/Ù Ä®ŠÁƒ1]Ìâ^® ’ë‚d‹§X’- ©¤Ö V­ŒóûÆPUîÅ‹–‘gWð¢gÅ’#ÇÅ{‘‰©à"Ë3­º±ÇÓËX]#k<“ËBæ˜*Ì“<ãØ¨yN¯%t¹ÖšéžΊ7’Ì,'²BÙ">IÕ˜Q…óÚ”ýx~çaîÌbÉrïh¼)7È(‘®Í+áˆ$BD|Š)HB‘Ä(¬˜õ:XH]‘"TêžÇÛEÈB@Ê5Àa¬Ï,ƒp¯Ã|Þ€÷ûœJu#ÆùWeu28i#γ-aÛÀéCñ8¼½A+U&Þkló‚9•2ßÀ$o™¹ªpž¬Ì¬±u?Á;JÀFÃfEœ§Œhú9-®/ZÃFkží´t0£=7Cnï>œŠÖpá§àÁIŸïʽ°5*”Û‡Ë #ñ;nû0…}Sntle» $èŇœ¦ìcÍ\µ>#`áôgµ[LÖNÀ­‹ñ˜iRXtÌ:CáÈ SàX,N“ICŒS S*P¸:F ä%° øVZ/–N•Íð•³&Èœ!ëѬõºdü‹‰yŒÆvqÊUCÖ( Rö劸zR«óqŦZ!ÆaÞGáVxœ¹Â%õV¡´öŠ]<¾ºÉ˜ò.ö­îA­p4âÛN;JUǦ6JnŒ>ġƒ™Òœ¥bãlM¹*¿»/~CÇ·qô×:ç.ÿƒëYâ’4ðl/Æu33&JÝL\“²RÜÖ‡± J2š`Â{©—ˆ¥,JÕ¾£x!ÖÍš½Zfø´ç*]®'cƒÂå³ð ÎY‘ÓD8‚ဢ(NpÂig,t„q0;gˆ æsž7nÃÅ­{?^}2ð²Òg± Žƒ‹Fª-±ÉU‡‘‰„e #Õw&5¾äÛ—|Ë/ß¾äΗÜù’;%w6v~_rçKî<¯Ü©¹°©¾h5é ¿a’tÍ+¤»º¦šº66ñD`wKyJ¦¹ û5kqUB=%sáÊ„G f¹^Ž­æ= “Mš”ÁGFª«±z*fjßà7^:¸.>¾û¹Ëôܺ´Ç§´»v øuøÝ®ª'º¿œ”õ­ÕˆKÕ\{¡åû[U_¥lT]Ëá-÷ØKøÕѾïWÝg—èkmã1Ú–ïoÑLÚ¶0Ó¾—ñ:¾¿ýåíÃïF{"“=‘ËpA® ¹!ƒ2!Ah‘ ú)×—Oæj®J2D?%¾h|ggÄdOþñŽ\ì7M@)L¿YSvEà%ä*†‹Ù{íË•ˆô¶ÔâF,Œ'½:ÐϾáoo_ ‘©n 1"åWŸ‹ž˜ßhÅ¿¾©â-x_³Õ˜¯Y7Å×lóœ¶%ákÝ[î±—ð«ó5k§øš5É&åkm[˜©}äkûòµJ© ‚FÈ‚°¦,RÙR1$¢KI Máä¼q§õ:ÊVi|­öØ(D^iúœõ Õ ñ¤QkúÖwŒô¸Z¾· Ã[ºu~Z\Cƒ¹á^ÜN†Ñ·aÆ“éÞ2ãnÌx˜¿Ddm –¶êq¸–ˆ¥(3Ááv!¸v{sÛàUÉdžÅðÚ˜^;¯‹©mIàµ{ËÃcè&ü4¼6z ^• £Rx½½eÆÝ˜ñ0{«X+9 CáƒA-d€A9jX ƒZê1 êV)LaPw½€£k‰aðöVcC7á§à–ju7Z4ŒL`°ËŒ»1ãav…AÙ@¤ÜÜ¥d`[ž‘•€±~lX ŒZEÀ¨õ0jCÉÍæÁR÷–¶ÐMø©"`Ôr µH†)0ÞÞ2ãnÌx˜]qˆxMOß âÍÆaº &ôcû5?m! ¿Õ„æ§­Lß´²±îv{Ë=ö~ɑ槭˜Ðü´‰µË®%Öüº¶0Sñ ùÝÇØSóÓC€Eó[Ssî“ê"ï~aÕ¯t©j¦máoXLÙˆ(»“S”=Ñ™´×™F„¹{ËSîÐMø)"ÊÞbÒe¯b °kI(ûí-3îÆŒ‡Ù•²q[¡×’QJòR²’®²¾À @à¼.xüZÉþ±a1¨›ˆ4bŠ$Z¨öZè»·<†‡nüO?ÌÔõ¨cºkI(Àí-3îÆŒ‡Ù• ñ(Þo?uÉü0éÕI·M)3(ë9*"5/ÇÃ&x(ºŠl KñЈzŒ‡F4xhMÜxMünoõx6t~Öc<4ÂMࡱ]¡k‰ñ°ËŒ»1ãaöÄCÓ’DGrâ½+ãë'ä3¡¤êÂèmÜ—ûVÃ)Õ×7e×ÐrÖ´r™)QÊmΑáÅÔÐÈàñ1J=6,¦†ÊEÔPÕSÔ01o 3}'¡›ðÓEÔPUSÔPņ­®%¡†··Ì¸3fWj¨5DÕã ö|Æ)£ƒ;G¨a K0f–`ÌTX‚I GƤa ··Üc/á×8,Á˜©°cbX×§º¶0Óǰ„û{§ŒÂ` ˆçc5§Ø®`:DÉë¸n~rêØ¬¥'c¿T/熆Ŕ½Š‚L5 `S©Ò`€Û[žrW£`€0̲WSÁ¦Š []KBÙ«!àÞ³+ewr=!Çú’Oü1%³Â'{såÜÀÝ£ìcÃb®£èSOE˜Ä’aê4:àö–Ðz†¹p=`êØ.Óµ$\Ñ÷nÌx˜]¸!À/¯ ö]¡é,Î>4 ·ÍQ ÅcÃR¸µ"Š(°b*¢À&š¿iDÁí­.‡nÂÏ(¢ÀŠ©ˆ+b;F×Ãmÿ–wcÆÃì ·V ¬" O9±åÙtiL¢G+‡˜†Ê>6,FÅ4X5Ó`ÕϪ4¦áö–w5ŠiÃÜÑAMÅ4X+²]K‚jˆi¸wcÆÃ슪Fdœä¡˜o0SøÂ ý”ZI¼%©2˜`o;A¬èr’ ‚'K«æ±áz¾·Øwmûçzû°9v)Õßʹƽ°‹â¬ZcžÅ° lfóàÙßíø‚ƒG[ýØÀž¶>xVÕ <÷¿’B¡Î¤K¬-ž¤¸âz«Xê³ Y'ƒ‘î±#;FÞóξ0rÇKb”\Д”ÖØ—27ëå(S‡nF o¹6 4ã…®0â`+:!zŸTß«¤µ3:ž–ÄõŽ¢Çóz'‰kªýI\%B„Ç‹Äí)tÔ;Þ4椊)szÁb²X‰!ÞAŒÞf•´@3¥_h¶?š1{ !šh5v©!¯„ Km½•®Æ¶ÞJ» [oÕYhGFØ®%¶õÞÞêm¹C7ág5¶õVÚNØz+m’aLbëíß2ãnÌx˜=m½•Q³ÐŸ©/C¨ýñüeÀ-jÀ­LðPê>Lhxw Ve¿«‰@­ÊÖQU×jÝÞr½„_!$ü6Z•ÕÉ: ÔêÚÂLÍC Ö}Œ=µª*„›dª)ù¶(7ià8k®`GìîñY™¥¿_|ícºªjp…zU­ ‰©\S¹©˜ÊÅ!1]KÂ_Ý3t~F!1•› ‰©\Óµ$üÕ !1÷nÌx˜]ùk½@&>µËŸ/·ªï±1ê±a)ãà/úåœ ÂRMv‚­>£6c( 8Ú÷Å2s£"Và E¢™‹_YäId-üK¹è‘¹*G¹I¼Ü½Jª #«|²_i¯¢‰’ ãïÞBÜ%á]¾ÍS[™’š1ÉVù%V@0¼c(c-噹xFÚfÓq®³¾œ9"Q¶TxÈ™‚˜ÅËŒZå"˜*ΘÎ`<¡¨º¬ÊvfS)JÍŠ°ÖÚ·$[9pÅ|cÐ^•Ÿ$¯6i…”b`Ãô ³™­N5Ý%%ÍË ínMjC ¼Yï9®BïMKçnq)f›öΫÖP|Q„ÜF$„¤ÐIÞÔ VZŽè+d©´°B6¢ˆ…O îmE¤ÞÞ ŸÜ¶&û‚D6çlÊða¼Q+BR·½>uS¤/É] , /&®(‚­E0H¯‘Wß!À–6µQ ¬hÖPÄÂ$iiÅelÞœŠ”°] &ðÖ?á©|%'yó{Õwµ›  óªt1¯¥¯2^Š×˜rðO"†³”,bÍo—á7¬ñºëïmí(ÃlÆPÉ—b>å= –<мú¯°t*ß« dÖŽ¼œ%:)—«ÿ…íÉ^(a)èœ7uÔÍxÞSÂnÓ¥þü&’ÔµªÓ´6sW~¦ †øØÌ©qð7ÕŒô€ãh¦\5à©6°7wî5ž€‘ïÆGšÚFp”ñÎôû>a§&EyñÊWCKGyífPØÝ]q*?<‰³z«2ëñ€$ë妕´Õû‹ß”‡èÏ(Ð%¾nJ¼.9Êõ+LNðva½€/Kr¦lT”à×É–°eJœñqÊ2Ïž×*Á€×†²#ãiç3ŽìÆ[Ïr·1É`TÖV.¢Â`Y±¡[Yíž!>‹®ñ†VQ¢:YÏHNƒå~mÞä#ÌÚ+ù'ùŒVhÞ”Rd¸·¹M)hT‹ú€FºÛµ|·—§+íê¢ ÊNŠcoÝî^ RhfÙú ¤;û߯䛭&ê.R*¢RX(¥báÐÙSšBXb@ž%ž`…KŒI#å–ö!U8+Ìbörª@ߌ˜U6{ … gªß¯Ê"I@Û(.—3èlIXÊ9CÃÖèe¬‘S$+0|²æþ7<}ŠC¤ðMÞÆ»3Gwáí¢'9)içt*b’O/r†Ý(3dÔï© Õ|â™NÜ2c:~âùuõ1"‹¾ià7=ŒIsCN<ÆO<ñ!'«Æ1ýÜ”D}§æ&à >Â}«Po!f>íM~æ\)î-³Ò~= Þƒþäܵ©ã'pÃeœ<ÓÌ)àqàigöÚÂÀSȬ~ãCÃÖí[³þ(sð“Áú¦4y´ÆDôÑN^5„þÍ®6BŽm•pþŠ#9”ëêéƒÏVˆÞEšÊÐ^)P6üÚE¨¯¿xêÛÓø”’N<ñp2ñDÁoG}€ã8ø¤âÚ,X³¥2ÑNýx‰*f f%y”Ž!Çñ’Ð’si…’O¡ûËmX[‘¸­Â wãܤ@µ¢;å4 {¥¶’|Žƒ”¼&?Ö|x[)ƒba&d• šEƒ8uÌ hÎ{;É<ÄØ:-¹õE„eùU<äŽ"Q-¢É0g7|ö;ßO·íC{¡àÝ5ðy+¼y& ž«¸Íñ`ª°,˜:±°§}ÅP\Ç„…ž3§ü)­S6B/|©H•Æu-âÙ¬à”°^Þ»€[eÛ`În‹÷mÛj?»²W7À¿ØŠ½º#±×x2eÉŽ¯ wUXDu´|{€ZeG÷ù¦¨¤{ØŽŽÇÑÕþ Ý ]ܽ@º9H“Ù?QÅ‘C¤X"פ'!¤%Ù«(§yËõ½­Ê{±h”ÐæSf<ØV0ßX†;ê ”ß)ØVLР'X-ØjnïeÃ…˜­ݼŸÕ¬«h­˜÷måN\QCq6ÕÛ”:†“©P|’[`q%ê‹¡‹22Ø…1 Ó‡à 2&Ÿ ãP}I˜6c`ª´»’<7²£ðÜßø{Y;ª4µQügq•æaÈýUšÇõä‰$W5Vƒ(\,‚Q\È…ý ¾«EXecô1˜„î(¾yû÷Ã<™¢º±\è?gzô§×æ÷­×›ArÓì>"ÏVrÒ\˜ò”üuÛò¡ÍÖÈåd†¥p8åÆÒ=ëOÈçüÈ_ª…Uxïüóò<“pT: 'Má ÀâåDª=@ªÙ±]ù‚H7Ÿ¢÷ìïù"Å­H¥O J¤ŒXûOé€)¯7°„Î$däxËkëd2Ì=Zã|]ðļ"”’œŠr’Ý*e.mJ˜©¨%ž5kÉ-’qƒpr™«ÐXT¡ì\©¯˜³ÎôíÅ™•Âo¶ð*æ¶jSñ~BSŠ6VÛ|‚]<ø®r]šw5AmV½ó146Qá–Î^ /š$ªY»që½aj•Xö0JYH@ i ±ØLɪFºÔGHI‰™ïIÕ Â%Þà²Àlš6á×møeÈ~0nº@õ<-m7{Çq –—ôå+8€•æÉ¨%6ržˆZ¾/,~«€Æ­ p“oRí´hÀ°‰™äs\y‚ªØ3rMW~Æ+G*:¬Ù¯×Ä©P"KðÁPP“ Y¥Ì98NuÛ‰×i»»"ÿ$DqýÕ¢÷™2lx÷2±'L`tQ~OŧÌÑЄ-¡VB#:¾ŽŒi3ãØòbŽvŠd×Å·¼F¥Sfà­bx0)Œ—Î[!St˜P¡ä©M×ñ!VOæf"Å ò@Èß*ò «g+2£mÌwYRxô«ÒãÉ…ñgõFlg1:Ìa£<˜Ord¥“ýÄ™y¥ž^20o)vÖýc©"Mñ]dd­„€o”r«{×QÙæà7àT1›.ðõ@Üþ†Nc»K€÷z’ì–¯–Ù}Û¨zd-›Á£È[=òü׫ëABºÔv@© h@ª1à'°7\/Seo÷І¸â]p¯¬ª+‰ç«äe* âS`« 8£š¨÷¥èg)ˆ½ÂM³W%x’d¸BEIÖEP‰2––K¹ObÌÀÖYÌ 1 ç5x0¸ŽUÊØÛ°nD©÷ÎoÅêÎåÇÄÁ‚$_ÓŠŠ{”ÿOh[ÄUÃ#Ùd+%N,¥ÉxÓér ¤­|07Å„„·˜âƒ£Ðeþ¹Â*ê‘R®ƒ1û§9ø$òäÏ[8py~„Œ´±U&îƒZ,û”BÅ ã,7çÒ–Vÿ¦Üú?Ulþþ«G! P÷LÌVžªçäXÈ<Ë¥ßÙ¢…ýDžìÞK{ŠÝãl™ÊŽku0;s-mï,.š„é23ißá“Œß ¦}Çþ½=N:³öäx U…“0‹ç°6ã2Åxг°îx¨ÊÆèxhmúIÔ¨²ÕH.²ª?éZÕF‰Æx/Ñó$ËÞ1¡Õ1™§„¶S0u…¥ŠTÖ€7À¢6YeÆYîâ$Õ6ÿqU ¤Pì„ÍÏ7yõF¼ù ÜñråSч¼.™4+sUMŸµß¡½—(ð‚¨U,có7“¥Ä $71Î “änfõô`©Õ(‚4¾"fˆÃŸ˜¹{IA²|@7XF4"¤cÜ/.¬x.Õ`ÿ»§ø‘±N¼ü–,I:Õ % Iº_°³d»ˆJ\Ò†$U ­Ï!2SP „ï‘Á’¸"gRdFÖ*0¼–"ž ›å^d<{’¶¹»¶”îoΰxÿHi(¾iŠECf\6š¤`-ϹžÆ->[Eüg…64'¼ò$›IÝï¾Wçý9h+ÉUøÄ/À^Ur æáËZœhÍ%ìÝ“ó¿ãáóz:“÷ºá¶xY^A¶ÃÇR>oµt–òßV"x#î¤RÅVñŸƒ#l&¢nDÝ3[̘ÇõFJÛ?—ßZš™%©¿Ì½°€æÖS$W·‹²ãÈ·üTýì$Üʞ溉mé ¨êªná&OúÅWé¤&ò%IŸÐ8zN ŸšÛ¿ÒD(ñÀ‰UwÓvÌC&R8y˜êÞÍ`ÒÄ2$î ~ã¡U®ZúÃý*ÀuÿngfŽåŹbyS €÷‚€üïÇ+–S…{ƒ'.ñIàõàÀ‚ÏÝðzH½-G Ôñ«IO SØFï BÂm›íí]ÈåD}í]A#,ÃxáË}{F4Ç„.¿¼ý?t¿= endstream endobj 2662 0 obj 7867 endobj 2665 0 obj << /Type /Page /Parent 2 0 R /Contents 2666 0 R /Resources 2668 0 R /Annots 2669 0 R /MediaBox [0 0 595 842] >> endobj 2668 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 2669 0 obj [ ] endobj 2666 0 obj << /Length 2667 0 R /Filter /FlateDecode >> stream xœí]ËŽÜÆÝ÷Wô:€G¬_@@id@€,‚,9N`ÄF/òûaO“=ÝÅ>—]gnÉZ°%‹ÃbÕ}×}¾ûã—¿ïÿùÛþÝã—ÿì¿õ¿?~ÙuYÿÙ~ýpþ¶yèÿ¼¯›rÿí—Ý÷ý÷ÝçÝçî¿ßwǾ<þ¹ûÓÿövÿ§îߟ÷ý[÷—?ö?tø_vµ©»ßÿýü{[›îOÅé÷Ãßÿk÷—ßí=¬8|®ßÌåÿÿÐzÓÔ‡]L|ùûn8¥yþõÛ·_wïŽçúˆiWû½ñ®ûOëíþ¿ÿØýÔ­?¬^ø«„¼|ܹ:TzÜâÅ5qÛ&¡œ>[>Áâm·åd‹?ï<‘œO+§Û¢èôþfÝJÚP;_>Áâ¦N¦ôû«CåßWÿ±ÞÈño€áø]xñÃ×Ý»§voªýןº=ïøÛ×_vþð?­Ø´û¯?î_Æÿaÿõç]óдEeËçíõO,zRßñÞ ðW½ãÌñ—E\/ß‹è{£5\Õ?j[ø£ð{LÀ¦?}íhèuø7Þ€Lí(ާjž·w±÷=éQ¡°UDª¶°á>×¾!ågAƒuuÈŠ5öôÄÂ'®‚«=AtWɑږá©?ªû€CQìy[ö_õ„Χ è\{ÇÁw0Nñ“÷p5 ŸøžÔ”Ä®±@Àï`è@ˆ ;€'µsxoò¦Œ‡©Šõ#|ò1~oö)5o×Gyí+s)¶Œö-ŠÊká#ªÊgójFÅÈ>Œ “ÐÚ(*¨»Ž;q¥¯šú¶'¹FÆÀ)áòp³J1,àj¶ïÀÕ„w0ˆ±UÉÙð ·Ùv;00g Ûk>㆗^ebpá[ Æ À¦Œ`¨ÄF.†µªìîlxÄy(±=EUi ýÒU¡^„fœ…ê›2¢<üNÚ([œÚÊìÁië¥Á:êv-\5ð ¹(Üⱑ ML¼7áæ|jz3=—•Î]žÀ˜A¾Ü" Y—%IÑö‚‹°ÒÔ‰Þ¦5P3™”©ý™94“ó.ä™Ò2!׻Ɔ'Èë#¼F„t<êÌ5DÃ~sV`“ çQã\hZ•#U‡aˆ ë#!ôÞ¯´wšYÚ0ºuU:FDÀl´“Ùí'F. ’t‹7í´ºüup),Œê V? Opp î`ΛBS7¤–, Ý]úÐñ“Iñ™–é§€ù‹nBB8äõÞj<ªÒ Dˆ>ÅH꤃¥¬ÚË.ÒÁ"ˆ@÷ƒ{ÃçY²ëe~ü8PÝàŒ:ÙÜOUQ^bqs?ÝvÀÍýôfÝOg<³R÷ÓÙ 6÷Óæ~zî§3¢Ïä~rGsÎUm.usçb0OœTH)Àêgñ`êÿ ~byßC@Åýtû݈ÑËØTiRÔ-(¤ÆßË”ðAQ5“øƒe LïÉãV+C Ÿù6“ÒÿQÁÙ–ìËáÔ‚òu¨ò¶hÃmµñ]GŒq!Glá*küŠÄì+â ‰Inð°jx–U0UìSS`¦ÜxnüŽâÕò’o£jŠžªæ‹Š çÙbN±¾ÂšÖ¸eŒd¼¤P?!e!p=S†4[$Cµ@i‰†ùD lÛ†t¹¶hk‚äÔ€õ)ËAð`à¨8n€u”–¹4ÖYÂwðÞð|÷Á9pµMÏuOp>ÜÛüÐyK™õ)HËŒ´óí¾ÁÃ_L|3mCˆäâO±…¿êM©i 0’SÓ6ióV¦i 7}šQ/4Þ\Â=êÞ¸ÀL”\¡ž%ÆïùœµÄ—ÁÆÄ–„‘Rª(ë‚詨‰=M}ºA÷–[ùP´î‚Ž(Ò&Ü(s‡É´ø]¥<€éd-…°˜¹^Äöy gt¹2ÏŽmFœ¥ŠåˆL$ì}¤tÁì1iSYü’÷Ñ/Ò÷÷KbÛ'ä_W×¹$å7›"„æ¿]¤šh¨LÁø"(ƒ5¨nöªàÂ|ǘ"Dž®`ìb½¯› Îä*Ï~£¡úDã^ŽØ–SM¦š¶¨Ð6ŽàFƒ§²gÐZ³r½ÕT¡‰HV8Š¡ L›¬˜kFŠK%LÁL`ûö¼{Aì2S£&òLí‘ná_-4ƒåO¥œe‹Ñ‚…,.S` µ´‰wwggÌ^Ã'´÷pÝGgLSêË9ÙšSÿš¾{xTø€剛~0Ž“ãë,nXÌ$çáÍb¢y*IB~f;†j}þÜ~íÄ•û½Á÷¬×kàè+“m65&.ç4ã'Ä,¼k¡jžGÈ6#v€³Ú欚)‹6 °,í£ë?[ÕÓ„‡p`4àVE˜ˆ!!¾cqbq-Ø>Ãø¡[PÜTÓ(&äÀÑLV Q‚‘ïñt¼ëUÊoaÜ[,ä×vìv©ÿ£’ƒ„$> Å* s>SB„% “’Τ©a¹øfÔ: ˜ª0¶1½ß†n1b'ì3çaè€H÷Å‚]Y‰ŒxoTZd™SHûí~s¿‚PÈ VÅUË¢ºL£mNFkÌ%+YCžÐN÷ÆLÁÖA”Eˆå<‘Ls˜9‰Õ6=œD<˜â$•f¯]†èëK (Æ`v½%ìÏà]ò®‰Y¿Œ¸cœ‰‚ý’ÁF£‚­)Oí÷pŸhÀïPƒfTcä¶/’ÏŽ³)˜p:‘|’ÓÓÞÚ¢{Of§¼Ù„Ç‚›ß~ [g&lÂëÖ_¯Å×Þ™}¼i¶»2q‹°ë aö¯4ˆ°Ê«s-Ëæ¨gø‡Qˆ¹õK±²3©J?„¸s©Ê{Sa¹.ûW¢×Y¯ÚVIh«;¿r[²ªTm{|§þêL‚°:u©Þ!'3ÙØëì#tw"’„ž€(caq§üBDæu„4C™ÏiTºâT ±ÉRÎ/²Ê.ßó{YV*esÉÒ¢!Rº•QsŽâ(QÊ!àq*¾¸àÓa+Û9ø Æ#†"N£`z cÞÄßÁ’KH,Ÿ°Ç¯†#µÛ0 HÀ†–ø8þI‹þ'"›®õ—ˆ¿ÒŒMè‰ êp=ú6„3ª|±=‹:¤ ¥´3MÙj­ªÂSëFê#Jo™ÆDºuÂa 9Õ»f²I·ûˆØ÷´ŠùÞü- ÖÔ G?ØN­-îsƒB®«2i»eÞ=žçëKpû"‚ ÄݰŒÂýDn×èYóš¼o.÷w=†Æ,v\2žû4ŽÇ‘•9Ñu*ø¦îø³O@›ÌÑ\¦od{²=Q‚½‚_áÞr¡ÖY•ˆÏ£;7G¦”h&utjNÁ0@‰É|STÛ“íÉŠÕÑbBC›:z;ê¨|]O0À’k6·iŸ$æòγÜÌ…¥ª#u³C×™„ô©£E›°Ùn-Û“…<ÑÒ†àS&fpŸbõÔlb÷œ.Œ½ŒûGlbu{²ˆ'Ù"ªüÃH¡‰ä澡ª—gSñŒo:D Å›Y›eRã•}à`r8ˆPF1Ó„dþ¡g#Ã4D/èuŠ®%;1Ns™s[€_4Þqu¹ª\ÀÓ°ï ós¯Uí«+«„0%˜BmÆ·hɤàO-„ç¿glO¶'Û“¥(ø˜€yDdUœl¨ƒ²µt­N-]qá#5&”hÂ:÷´>­Ù©*u!xcDU .´„°˜ìÅ›¸œÒ».ê퀥‘͈³Ò–© Îj²ðòx÷#JÄËë–âïèNß¾“¡±\£¶×BAùÔ‡SVB6mÈló Ç(‚¤Ð7:ˆ(HL+†~Ú«æcŠ¥PÚš`Ÿ3믲 Rp[`Óá#9°+_Ç;NOõ…H‹ºªM‡/@S­SZîEÈ›“µèQÝ D¥²«ˆ)“#!Z›¢ E.Fs-ÑíÇ2²ðp¥¹®™s»Ñ)PÀìæ¨Ž}¥Â ÌõŸ ‚š™ódkl@PJަ!’ªh«Pu¤N'”’Ƹ‘˜dœ(®&‚:qCž\=‰z«óaÈÈÚ9e‡ÈÐèWîÅ3øj‡›³`U¦««y™œÁ]—¯¡PBy ßÄ2ž–i0YŒ â{U]{28`k{¨ã lÕ––Œ ËXÕ*=³Üè/‡ :TË2ËÊwM\?´7ìýùÁŽ7 ¦‹Ð%ºv$ãa¼(#È "C÷ZJÈkLKx¢8I+ A$DThêˆYc?"‰.1ÃU7±€ògá`êz3ÿ ¼s µª¹vH3È®æÖi¡ö7ˆô×ÁÚœ6ó>^8('ò¨êXFÕ )Kª²€2¨ˆD+,¼…û|R¬9™ïDdédrŒ/ sæ&ÇDoŠÄ; ’ÚF-ÆŸ“çöAdTÔ=—zÓðW-u ÌBq&T^o.o”r?a·=ÄË%Lpx¿JÃù\6LÄ̀ȩ˖Ü8Ò„™ïåòšrŠAÚ@wk] ε[~]ʵwð“5"Ž*“œìh“4ÁT¡Î_žRÎwm?͸Ç×v•ÛŒ é˜['63«²·^÷˜ɗœÍ{™ËÊtûÛ,-ÉW£ ó5Ý1¨°8 \M¸¦¿®[*-ˆ,Óûqßq—•[>EÅŒÉ![žºÄYÕŒÌÛsbØŸ˜I&Œ(êdR)"$7Ž"áE˜TH&1ø¤Êª„ »dW9#_çT›mÛjó Iá_˜JÆ.“‰ßÁçb²¬"¤ÕíÉUù\§U½?,ª¶G¹ZJ¥ÿC.y5—?ýNâ lo³à$èÔ¶r.$ç´ãÆæãpîÑŠó¸y=ÑÜ€é³Iu^$ …`ÐÔy2¡¸tÓ(&¢SL#S!ž„È÷°Ï“°ëUFõ 7¼7Ÿ³½gÓÆn(t›Æü åëöªÚÂÕVÚýwvbß@ýÕ™ ÖDÇ`&|®;&‘²†…§2…`.0À{cVë%RAؾÁÌ’ùÅÐ_nŽPº;À´3ÙÞ?ø&‰%€GY2á×™ò¤;jˆš…€å/]ø> endobj 2675 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 2676 0 obj [ ] endobj 2673 0 obj << /Length 2674 0 R /Filter /FlateDecode >> stream xœí]IǾóWðÀT×Ò4š9$ ‡ ‡@ޱ‘‰ùû!ÙMΰšß뮯ª›T[°5V©kyõö­ÞýñËß·ÿümûîã—ÿl¿õ¿ü²)vuYtÿl¿~xû¶Ùõ?oë¦Ü~ûeó²}Ù|Þ|Þÿ÷eÓ}ðåãŸ÷?ýok·Úÿûóö¯Ûÿáý_:ü…_6µ©÷¿ÿûø{[›ýOÅù÷ßÿkó—ßm=ÌxZ®ßÌåÿÿЖ¦l»Yùes:¥9þúíÛ¯›wÝù£1máLµ5ÞùýÏÞnÿûÍOûùO³»ÖSW¾.nXǸ꼒©ì¶¬ëéÌnRL^Û„“v® ÛÖâÜŠk ë{è”C º>o¦O0¹©Ët“w®•îj…É5ïÖÚ:åݾNŸ`rW7é&?î<ÕÝâÉwwûƒÙÒîùpÇeÓØýϵëÿ¹íXÞ=Ìö3éCíuú“—U:.Ýí\*ý}ãÉ5i¹*M[´ tž>ø›²M7ùqçêPéïO®y·mU§¤Û×éõ'߃&áÝwžŠnñä‰ù´5gbóe‚+1 iÙÚ6ÎÕí\*Ý}'ÿ1 ÞH÷'ÀÚ{>üðuóîÙx³g ÕöëOû½—ì~ûz€I»ÿ¿½àÛí×·¿/ ÷ü‡íן7í®²åi‹ÝHáàÈ8Ò¢ÓÀo,ü¦‚ß|„ßÀ ÷V|‚#Ä®†›.t<~Œ!Ÿô>ïGy×~ð7˜Ô˜‰‡87×­óéëži߯p[Àmk{d¶¾ð—(îwÞu.Ç×t(Ñìš¶8î4du×¾ñh¤gu×f+#nWúª©Ë!É6S¶hzó>˜Äà¿jŽ#ÆíœmÌ~èuÄÁo¸{¸Žwðº…;ÀëØ˜Ά1Å…7! AE,üQ‹’ÕÅÖeHM+ã£Ôž%&d|¾(»Â4ÐsÂÅ ¨ˆ©sˆ^€FѧÃTHP»@ÓÞ‹ÙæØ1^ki sÌG0Û –CˆálÞ™p'P& ˜!Q1?Î¥×.®ÓpË“Ôèòq{#n]`xx xדÂÔMÀÀˆ¹N¸ŒbØrÚ x„×1I¨M  *YëL”YØlr©Ù¶&”šD’Ûðž¡’){éÑôM÷578ÂŽ(áÈàAÚl›ûÓEîƒT„”†U#›cò³0“ZœiµƒWƘ®ÿ™`g£qÏ„05EU‡h™Ô3ÌþJêëÓµÂ0Ü0Å'þ*3\„IQ× ŽãÙ4xT<¡) z'ïP[”C‡ðC0òFPÔb—æ0­(x«¢9qÌN¿ŠK£ÄÕ¤¸fφ«Iaò§»6%)žBÛü ¬3eš3à4W‹Ó\q«\k‹gƒm(ÆÖ¸Þø)~o}Zcúf•÷—ÛŒ²À•UÖ´SÌ8FÄæC‘€´9ô'´¬ÛK¤¸F#z(F¤Ð3l ¼,I0Ç|r¼·ù[Q…-¯„oè0'Å8}׆Cô-Õ¦|,?êš‹}©Ú Ôó•,ìÒ­¯´‰‹ŸFȽ٠ÎÄ 'r­F.‘Bâ¦ô¹ú68“³ ÜË rÚÅô¯JYÍi]x# d‹*)«D`D™`5=¢Ö†¾”Û7¢¶$…;6q-o‚Eaªß(îÆŠG “ï`Îæ`uÕÜûu'èºþ£ #9‚_*6Άֵ;¡5æ¡åë“7ÛÜßv¨—(²ò”É;…*q^N¿L]š”Z¢–_èzˆV׋öò,øN™¶x×½/M}‰a×Ü Lzͽ/„¤žÍ0X²’2³ÂáŠ"@]!ð†Ù&‚5¥'XW6!Á&¶³¨‹Dð;ÔÂ}]‡D±d-#K«2ïÌi0”•{DúÍ¢Ö7Ö"[.0—,4ˆÇ/—D*¼B6>éªÖ/â½Õucñ )ÙŒžÃk~XeôI†L¢Îô —ù}•+T€ï!•øÍ*D]òÇêÇüÄ—^r•  ›U…hOîN‡Ù&óV ñð×TÆC¿ª« ±t‚Îì¸#p$"t+< ˆ[ÙT¯Ö"4îÜn¬ªÍ¥êuC¯"!.­h¥L¦ !òÝiq–àH™)+¥öT¶èiO#5‡W¦/gÆîÜsgõhÙ^iû&n‰7³«Ûzâ奄Úf@Yª·‘f¨ÜÐ9qO¢, ͹jÕ„\àX³3éû<Õu*IÚ°¡†é/B r²Q&þ†Èî(d²HˆÕ}ƒé#@t‚ä¾nó«õÏõO£‰‰Ó‰­¹s¹ÕT¡ ‰è²(PTÞ÷©“¦ {¦ÖŸ1jˆü¾ˆFªÏ°j_$å7PkþP‰¶L_:¦ûá\©>§gÌÞ¯[èÁáº!ŽÎ¨¦”É9iö`9­Ø$*•C÷ù¢´%›‰»S/*ezžï†ºøÄ¾H¢¡Ã•“DxG³aŸ§P܃«:qÐêåB-*“D@ì@hl2c¿/Ê[¨,øž‡SÁ`:NG¼‰CÐôPûc`aIG<¹CÕ™ÏÙÈ ¬B!ø ͽŸ$öÇ áUuN©„ù¼Zïg)åÀµ¾”'Ã{þd8‡dŸnB!csIl,­„V„,wª%ABQÌoa»K ¡ƒLNËÄi$rçù±]!ƒtÁ¹~N-“x °Îi½ °„ºQ¦¢ãÓ¸P5 SŠ#vÀìÚpc(_÷<%ü,žÃão!†+Í/ä±èÃB„È­Äæ?ØÙ²!±kž´ÄëÀ[ÀpÓÍ^gfc¼FÍÈ*s£ &GÎy«¥U_vÄyl‹³Ÿ„d‚a¹^ £\ÑÐŽeZ?&vâa2¢@0Ô‰X2sÉÔjß¹³ÂVä~Ã;±Á‰•Uc˜©œ`R^íkì<™®¸mƯ˜P…8SäA”ÀÍ ñãL'ÏLþ(êɬ>½ÏˆdÎÔãH6;€×ݽ:=kdÉçñ Æë:¿—aC¹r9­àHY£%k´D•GŒôöKb‹ Û|ðê¥Õ|GꡘAêEDE'¶™±‹!Ó ¾ßO}ÅêfYÝ, t³øÊ]Â5y8"Ûót –ý P²¡V@E_3×r;°¦‡½ADwmÁJà G­#ðÆíš‚N3±üæqË•Ã$ŽPÝŠðlÄ¥f2ÑŠW`¸˜­2"Y•}9:vŸ³,Ìèñ”GVrJ?\#IùSW“÷ÇøUsguu‘ÞºUÂ7J{x fsSX±=ouu=Sf”ÀRæ7Ö‘u„dŲb‰h0Ó¹WˆG™¹™Øª;7A_ò3=«OmëH^¶J´ïØ*f‘ã1ç¹CÏÙ~fXÀßqïöT@#AÌ;1'&n »îú¨^¾` ß ^ŽXŒXbW$ž óh|sÐq&H= œ–‹3@Ÿµpy$·¢rÁÅ_ií­\² Ò Ãt³˜½Ô=6¾)êƒfG£wv¥lÜݽõöÔº¹B]x8I¦öÀƒÌ#*Sgô­¾ì ÙàÉ1ëÍßO•—$n-—£;,lŸÔõá²½Äo/<ü=Ï×ånú$‚Äéq˜GáÎBDvé¼É\Uã/÷¡dbSO¤†)¿·Œ† uqK•v.`Q]LT›ÎPƒŒ¯”A%†Ðp ÔXÞý2ý]ëˆvã苼k&ßcù#'ko@²£Òì¢ee„ëÈ:²B§r«¿3–ïoÉ‘ßYˤN/:stöÆ›ÙÙ^Eò¢GtY¾ÁÚ7A§Bk%l0Z~ ~‰±W·\þZTøò=~iˆé’ImÔ)ü<ÏØœÑ®G²Ù|Ÿzñ’Ÿžd:h-ù< xJs¬‚>A×gCwþ{ëCÜÔÛ«K&4¡–êX©„¦BÇC ÉA‚²‡Ùg.—¼’â=ÛË>‚¡?0a±›°¹bxؽ¼ŠÈ¬V¡y}M ëEºýv0KdžÍYm¿î"íù%¦y”}LÐGÙWK–¡ PVá-0YùEx¢Ã}¶nZ4ަÐÙ21Ï×7†°ÜbÚ» L”»hãÙö@µC!^Fá…ÐeP…Zìr bÞô 3‚µLß‚g2“.âˆo„v•ªd»Žä“ꂞD8j™¾½ +ž¿Íƒ#SÛÿھ칗ÈÜ>ý… n‘æjúq»ÂbÄ[{6M;_õ@pwCõ³º»!»³GWÊPWѾ•Ýõ1ê70ívp͵ð„Öqc©ª×ööÜŸ…Éq¦˜ÝR7kú£Ø«©¸ ûA®ÃàÙà7½‡ÄD½~E[á?ïw|Ú9vxáÄzŒÌ3Dv !¸Nï뻆Px6xãß>Nü„È Ÿ‡šm:édЄuðx¼5Ì àl˜¼‚„`í&⪋fgº#¿¥2LîM;–Qóyûyó+10 endstream endobj 2674 0 obj 4827 endobj 2678 0 obj [99 /XYZ 38.2500000 723.500000 0] endobj 2679 0 obj [99 /XYZ 38.2500000 74 0] endobj 2680 0 obj [99 /XYZ 38.2500000 723.500000 0] endobj 2681 0 obj [99 /XYZ 38.2500000 74 0] endobj 2677 0 obj << /Type /Page /Parent 2 0 R /Contents 2682 0 R /Resources 2684 0 R /Annots 2685 0 R /MediaBox [0 0 595 842] >> endobj 2684 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R /F1500 1500 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2685 0 obj [ ] endobj 2682 0 obj << /Length 2683 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷ò)J@`w|00ØrrÖq#62öÁ?êÕJ%U)iF;°§g8¢Èªb±‹ŸþúõŸûÿ¾ÿôðõûoþûÃ×88+šûã×w׿PåÁÞ»Òî¿ý²{Û¿í^v/õÿßvÍ_~¨?ý±Wûïëÿ~Þÿýõ/ôtüƒ_vNºúûOß+'ëOâüýøûÿìþö§ý¯ÇÛ×ùÁÜþü]UHUG1ðæ·];KyúúýÛ¯»OÍü'½DVJÙr/6õg£ö¿ýk÷SÝÛ»8”FKí”5õçª0NزTõg§ý?⻥.Žo—¶¾,T=Ûyùé‹©û«Ê¦ëü4rvª¨ÊÅ;?TFJwäórå§`jèc]{OAýB•é:?œ›(ž³°oNÆ:§2öÜ{ Ú—õOÉ:?<caßœŒ­j5ŸŽ±çÞÐ^ )Ò1ö4òDŒ…}32VË”Œ½ôž‚±*!c›‘§a,±ª*2öÜ{ Úë¤Rsy"ÆÂ¾Y{ÜÀ+m\ý*UÕŠaCÐ;+雾ÒÉú>››$µÄÈxçÉœ O1gŠÂ϶wþ¾ÔÉúnÆÍM’–×Î_&t‚Òüxío‘¿¼î>=KsÜêŠýëOõØN¯l¾½Ç]Õ?Õ.gM›×÷BÙ¿þ¼«…²í›eP‹x‚-°EÖgÔ‚Ç&á=°¥‚#(á3 >ƒßƒé†Ÿ!ô¦>£ ©£ 4”¹ÎHüŒžbÙ-xXÞÄ—é½é†O¯µÂºOÙ”@ÓqR4Z¹–„ͤAGaZâ5—EYQ–Ô gúD¯#FxÅâUuF—²xô¸¼P)3ÆŠ¿s‹aŸóöå…\­"§o.Ì–/7°ê› ?)»4&DÌ8ü [D-O˜z¸ÀH,ítòâ<5>%I%—6x«†yÜùóž8'+aöLá¼Ìßá,j$‡Ÿ!ŒçqîW'Ñãá€^erRé´kAUú],†ˆøRæ³2!5 iÊwj¾sUi¦Ôj$œK±‘&¸›ØG" x"&Å'˜ÕÝ,Åûœô¦G6Ó*ó¢-›ˆZ”d5ŸP©8aFï¶wëÓ²Á©"&Á¦”KκŽY=õN9šª#H=$…“·¬áŽ´Qé[ cðÞÀ•ªm:·˜ÂëCqGJ‘¾ÄÊ'.#ì¶”]7òI´àQÏžB¤¤m˜£Y(¼íÃ,É{,Íî/@ÎYYJ‘2 Ó$yÎIÀ”˜æ)kˆ1ýn)U5èÌQYÌJwÂþI_méófFÈ$ ´À±_GI=ní1½ (æQSÒM” 6†X#$°ì5–k‡o±&±ªÞ8sãsv?·îX“©º¢lñÔ¶ÕIo=žy†ÏTèÏ¡¾g­%‹–¡ôôÍ´€cƒ-­ãY+ìÐYÅcÃ4йö4ëJšô3³®”U‡3¤¸0ˇfj%&¯Ç÷€«Œ ÍÈ:ŠXá–9Ù-k9 §Í’G&F£VÚVÊpy¼sÊ!E %a€Á²XWÀòN±Â½A$¤·–ú þ@¸®Æ´†½I\® ssÎÇàâW™(j0væ9½5Ô, +oI8)DñÝx ¤°¤á–á=!Hé-×Iÿ,óH÷f„”Ò¾Æá¥V Èå îQ²¼­éÔ”Ù' ã­ CJѦ”™'6ç ]ÛV'-„½åå4ók¿/µte0‰A<1×ô2)wÉ·ßaYP…% ØÅ€†÷àÄÓÊ‚ö@üË$ðÆÈ\„—?Åg¯p)`ìAá<ÂÈJ!Ì4rþ Òû¤‘ùàcš°E³A"kÈŠbýúÔšPà‚Ä‘–*“÷Y“L)=”åäöÕHáâŠ,|¨ÈüBI ´5á áí‰ÍŽ]c5…C3x³H~DI–:˜%ÈÍì÷r´Ù`ÃãKy{ðÎÏ8XÊקà– éÙp… Ä}1TJWV Uì´ã¡GÀFK‰ ³+d®ñšcuX]Ž^”kCÒֹђþáTë´ÖÁpᔢkl-¥|Ã\Çï(r‘ôDz¸ÿå®SHbgªÛ‘ËX]@>/oáM&Sžç4u®*…”ꎳÕ^§œ¿£¸3!ò›T¶”Râ–@sRÁ\JÅLÊ’b xÈ4;ZËX…àg(ñÃÜŠT'ú _gJ¤/j#µè„ŒÚÓ!¾ŒL‡y"µeVÞ·iÁó[# 0BMJz Ü¯HIYf£6'r‹Ñ´½”²3wŽ¥`µd¡¥–5êd[X;‚Å fCn¨QvŠ.5ꬺ%á†ÝP££ƒÊKG^¤{;G^é 5º¡F F/¶¡F9Q£¥(ny¹&”S‹½L‚ä‚-X¹gE^ÉÂzQ£—I,5Še‡$4¬×LA€*ÈHÑœ³‡Ý(î†åÅÇúk;V½sþ‰+m±d|lYœOe-{5Ò•âc¯f°:|ìeìkÅÇ^f°ác£ïÙð±#h¾x|앲²lR†qJѯú’¾³£n7D,Ì×gIr•U{:NrI|#ÞÕ·ô×–þb§èÒ_•Ö·$ÜÒ_[úkô²ôôוto5í¦Z7¦ê§á–Ûc<‰1o³_$lKŒq&ƪÒÝòrMáÍ61v™©œÊ*Õ~ž”™3¡”¬0e&u0‰, ­Â×®p…éÖHºo…a/ ûÙXKNÜEzÃ1Ê!o,0øúì -L oÑ”[Ñ^¡ßL§D¢83„ãEÞOuY(s$~èŒÄÞZsJäJ‚Ö¹mÏé­©J4\@òéã\(×ÕQ޵S®W%hVÊáH|Š}ÊYÿ´7õe¸'GÚ`Îwwå+,^d”[ÃÇWÀ"ÁS]‚r§[çìŽðà‹î(G†9JT¬;‹¿èâñ{:òN¹‡™R³ƒRà ñì—ä±ì(åœ ,çtÇMˆ)o¯)ªÐþÆôø•€ƒ!í%Ø œ÷þ$)šRX«w_$ã@‰°D@íØ¢@£aÐRÁ÷à– · )FRxAB뺱q²”x™káBî$¯X!µì¼t‚%–p܆þ 5ÈÏÔEê-%#eP*b_RÉUíüÐçÁÃîq ³ËE‰bP¢2X¯v,é|¸F-Æày°eC" ZºoC"Æ6¹!ßa`|C"†Òý.HÕJ„kzÃnØANì •áºÚ°ƒ,nn ”@UŠc˜Ó€7™4fضW»óØÁk)É»SeøÚ5ÂîìàÕ$»ËvrÕ»‚5XASÄàe¢ˆ–€cÛcâ‚Üã˜c¬\ù¾ã%&Ýqà±3/ŒGa-õžÕÜÓú\uZ‘"c¸Ð6 ™C¼€™K4Í^ jþBLYŒamd ~+4†}鉫IlåºX¥Ä¸"”’õ™ý-0ôJÓ.ÂèÖ刲ð³W¿ˆŒ‚Ø„Ç; t/6㞸ì6ã>fÜu†N4S“ª5CÓbeg&8+ÍzM˜ !òÏ›n#å(óÁG Âû¼>ú³%rõ#N ¥%$ï"!霋âpàùp;09Õ˜Vƶ^}SŸ‚£( ¿9*Ó‘®h>$`œrÔqïë¼’²Epã£s ´{²í?è÷Þ6eŽ Îw„3}– °k"V«yš‰Óù§Š¯Àq3\o;W|Ç30<àÇFNî°ýGH…ªZÛ‡]q4Çñå&˜V¬7\âg–$uÀ4Àq¡ùäá°)‡9LXA‘üÎ9ä…Â{ƒÑîxÔ”Ps¦³|8‚†9çiGÆÎQg’™¾¹.æÉ’#äV!ì ·æ‡5¿Kʽ­“16B7­¹ÈyçeHßù´âÇY÷›$¥¤crPÍ®­"#À”'ȤŽ#öf±E‡gJ¸¢âSÍY}ÒÇÚ=›(„ê“8Iª¢G9ßœ8è>!…C·834/ŠÑ+™R´Ž«Â0B ïÉ”ˆÂ€†ÜªƒLÛ"ilþÐMƒ²o±îФ óì;ô¢ƒÎ¸Þìå}GHy•;N©ò¥zL-4˱>4–Rƒc­8r˺«/y=f´L=ôwºO¼·ÒñK–X¼ƒð–ŽçmɸSqΪ~[|¥‹!X9åÅ厡Fr™¼­uîXüç‘Øêæ+ç>øV)b #-÷²ê¯ZÜ Ó/±k°áRš®˜[<ØÅTx ’?;éÞé{¦‚Ï<ÀQ7Ëìø©ô-ÈEÁg²-ŽŒx&Bƒ«Ê9õ×þ­æV”™/C0BU‚;´B‡·W­úöuPúàA µ]¸©‘uP² X|ñ”ë´èGÿLRÎ y ê½GTíÛ³Ÿ)º¬ –3—! 8ØVh:ô;J_÷¶4 ‰{ƒÏx¤—œ4õ+/*pÇÏõˆow¢¾ªÉ¸ÒL(ò ;¦|Çö î r\bNàù`ÌâZnx>¤ÞÆ/È2(Ã?íü¿ kØ^Þ‘ É6ØÛ]‹Ë }ðŠùÞUví9 î>/û—Ýÿ²í endstream endobj 2683 0 obj 4233 endobj 2687 0 obj [100 /XYZ 38.2500000 190.250000 0] endobj 2688 0 obj [100 /XYZ 38.2500000 190.250000 0] endobj 2689 0 obj [100 /XYZ 32.2500000 404.750000 0] endobj 2690 0 obj [100 /XYZ 38.2500000 335.750000 0] endobj 2691 0 obj [100 /XYZ 31.5000000 406.250000 0] endobj 2692 0 obj [100 /XYZ 38.2500000 335.750000 0] endobj 2686 0 obj << /Type /Page /Parent 2 0 R /Contents 2693 0 R /Resources 2695 0 R /Annots 2696 0 R /MediaBox [0 0 595 842] >> endobj 2695 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2696 0 obj [ ] endobj 2693 0 obj << /Length 2694 0 R /Filter /FlateDecode >> stream xœí]ÉŽÜȽ÷WÔÙÀ”˜ 7À0 ©Õ|0 H€††ÆccàXžƒ߬ªduw²^’ù:2¹%ØêQŠd.‘±Ç‹wüò÷Ã?;¼ûøå?‡oîÏ_Šc]—_‡Óï^þ…nŽîçCÝ”‡o¿<|?|øüð¹ûÿï—¾|üs÷Óÿúð§î?þú·î/tÿèô~y¨UÝýùïóŸm­ºŸŠëŸ§¿ÿ×Ã_~wøõôÆþsn2¯ÿû‡î™î‡n#_þþЯRÿöíׇw—õG}DµVw?+kìùçÃÿñðS÷þþíűµJÕ•­‹7|§Ö§—ÛÚ”n»•Ãïœ˼]þÝ•¶ÉÞ}ž·ô–(S©ðË5ÊÔº´§3>oÙ4ºû¹6î×Ûv¬®.;¦«*ÁyôoOp½§££Ó¼¥·¤?kür‘;Ü}¦ûJYTÝUP•>”µð"^½]tóÝË•.Ò½üÁM<ƒ¿ÓJí:ReZo?Ü)Ø£5WÉó~¨óˆ2G£ÕÍõyž:SeáHGšóˆ9–¶jê(Ú¹5k8ü6Ý ·%œ[MPüå;Í„eà)á LÉø¶ÄŠá©>,±âÀ‡/—¬ì)t ÷‚X—úà¿:ž#sxJxx/àܾ,—·)ÕOnÊwGžIÈòì@˜>ExVgð~à“'N10L-˜M27Ó8X¼à}°¼‘xJ²—k:‡£„ ACoPÆ¢¾ ;ÌWðFw/p' RAÝLÅX­ßaö@=ÆïAuýÖ^BöÁ»€ùCoFݾž NÓ6¾ÀÁÇ ·.0‚õeÌ`|¥‡‘t³©†øõ‘$Ë8ñÒ§/cU@ßc¸"æË„Fb°-$ÊÇ·Å¿XúɧQuü‡³'ìÂ5¬8[гAYååxƒ “Òs®Dsu;Ihò’Ÿîð¼k/Ó]<æ71’ÍI˜*Ó”ÑÁ‡G _b ¡ÀSÌdp• Y˜,ã|ÄJ(á2e¤µ¬×#0·÷¼eº¤ìÓÙ}Pó{s˜Yc)ï^i`߯˜žPÀ–Úx6—õ¿û‡–àb¬Î€ä‰ÐΦ;k{A¸A(…Gb«ò9¬w<%ÆAÂÈiH™Œ]¨™ô›Ý‚Œ# >’2C¢0Ú·U NÃÐc¨e3çršÊ Œ3o×Àóå4@‰”¦Ów¾”ÚÛÍ[)MÁIH ŽàgJ8‚ç±ÜñÝz§[ÁX¸¹Á<·ÀîÀg4LÓðð™:Ã4n=̾©møäœÔŒ£*L£p,~Û{8kÑ»€ïœ†»ãâf׃÷ͱ²„‚եᘢê'ƒ“‚˜‘$VÚìUåxýó¦á›là}Õ˜0ÝqÍ”*˜  ¿ •L1 ù•b*.Ÿƒu­üC¬6\7…e„-\©{krHäð|hÓ´å*hÓj;6#2vˆìAáÌ bn1¾ Æ ({·ùp@cÐX½ÃÁéuqŠ)~Žàõà=À3ØM1ÒÛÜÉ-À«›7˜b¦ŒY¯DiT p†ƒz8%rÉY§ÛЗloÍ„Ù[Mí_Òä†÷ „Äûæ‚m§\7*ÚB„6™8ÃFTåјjÒ*Ài‹#¶§V ØGÙýµ·ÞEšÄ¥-½y.¹Òi]•(¤Šà4"uÔ”0—-£¼Ÿôû6%Q%œ‘a’Œ+fp–‹•ˆ$:D¿$![î²Ï–%ò¡©lH¨‹Q˜dKâˆ|r*ùQ4‰hzyâzÊ6eòÁxÔŒ¨¼fÌ_âŒ)˜£;C×%pwÅyt u“7̘×4ƒ÷¯í·c#XC£U_IqµjS¡Œ ôˆAÑ-“‰-RÄÎ$¶b™LõQÉpÝÀ Äp tú)Œä áADÝ”>õÎóÚ£ˆÒ;ºGCëÁs[ôÉá¹a§N!;¹´l¨j Ÿûm-Ï7}h·ò‘ÅøSÓªùMá/Óy !?9kc*ž³ûQ€AŒ¯š/,LK<'ˆpïÖ$¶¶Úÿ¦02ãŠ"B²Is3ø:U1<}Q+då¢ÖÕü¨ÙÒîa`waüÖŠdy¦;PÖäMì(5åÀû\ :gä©÷¿q™/{JYäÒ6ž÷ƒ‚õ-> ³eJmØ\nz.•- V‰0‚ïgKÓŸÐeJ÷‹r)aȶ%çK,p#±Ÿ¤yRÙb€S³ùî’vþ„öÌVJ™Ò*O¨,0›ñ®êP{Éåwá¦b@ðåÂw›îƒagŽ?F¶ý”Á¬/Ñàò¹J‡TpÄÂeÂaÍR8ÒgPàp8fÀ@eàZB ë‚#ÈxÖb9C¨B_FŸàˆŒ¨@Ð ïœA jŒég`J‘s¼¸cl=yNØÚñ&n¦_¼n|ö˜^˜³·8£ÏŸ= Ã#øÞã|Ì­ÆzLâ=ÈCc•Ùil g_JOÒ™é¥*Ô8½Ì~ÕX^A]Öƒï=ÎíÁRGT2pÖ¹ô1Ëœ¶(¸R“<¿Äyb«²WÞõåàUq¬jõºìkzÑe¦ÉVãÝ·1Vm8„ \Jâ"p,ïçòCF«qŠ)|Ʊ’<4¦ÇÓ¿ei,`ãlT34&J—·4 ¬‚@Å4@—˜úÀSù­•æ¤[«ÃÄH€þEG0%YF½'îÌøž®®ZQ&‡Qyewq~2``àgþbñù,CŠ6å<4–euMÑ;KHW%¤ìHÅg‡GöïìßYñw ž´Òõlì;¾mëÙÜw fµÒõlì;NOË£•h³ê½ÚÚwìÆÖ³µïàéu®gkß±»î±ìïÀäž•®gÁßÁ¾(çÈ£aLh°!ëÕ xôöøÛ&ãoM¥2ÓØ €ðâNÒ2ãiƾû¬TѼåì)ªÀž||SeSª ®ˆc\8b`3Æžš¶}=Ÿ,_m•@L?}ºR[÷¼ƒ|º‘®DU† ™¢•Ùm1B-±®õÎ”áÆ´DàÉv1Âeï1ˆþÓ÷bXFIlN VŸ‡rñ–î.£dS1;ºàÖCVLÔ£®>ÿT:÷Z¬1×}8qÑŠdLüÀë€ç&˜Z{zmH÷èÆ{ÉbüKl¦(ƒ$2\AÀ`´U†t]ŒO*ŠHXÂ;J ã E®µØÌÉÔ²,®Å~ÎF¿…ØBÀEP@C²ƒ:ß®:äƒnÚàŒè!S˜QkÀŽÌDTT§”ÙíÕ\”ÂÌ-p ðLpœä”ÈÐ\*çf úà±ñ^D8ÁFð!ôÆö²ª¶/bÔœb¸s¢†6à¬Å˜³§«+9HÍZº,½C)p\ƒ¬àá(K·Ö[D Õ‡‹±]\0"Qló†¨B¥\A’ÀÛ0O`ðm°Õ…ëг„Î.^•zi;’´Uá­:µ«w]JÆWB™Òºì½çUSΤ÷pdFm[¶þÚ˜nˆD{4¦àn¥Æ–Hƒ;ÆS+ĤöÓ£©»éÊæxȺ-s}‡ˆfb­™ñ†RëÁ\1yÚsc™k ªQTé¡XŸ¬Ò³@K‡ÏKœ_Y‚îAQÒZ{«6ˆ6™*&)âff¬I"ª,g¤=´3M‰FT wŽY–mb­Œ1¿D=TÞÁ€9yÙjäd«·~û"žÈ ¦“ù. N¥[_à`*{ßE’ÅœûâŠâ„2è¬;mêãeØ#/öbÜSÄ`ÚE„󌠡n_Ù‚¬=F:)Ký”-=Y›K| {Š™ZQØ&-'ÀÑd[ÏâË;c¢úøb²ü3¸µ¥yY ž˜j¹´ €Q´„`ã{IÜ1ŒUJoX.Ix->$0³£6vJWgÕzw9M„#Ù¢,ƒdw±ôô1^wm /\Ÿy¿1bWu—‘#Z|&«\Q,t =Êx~/ F½éÌÝÔÞ}¾‡€–±•·êù£ù»^T›ÄÒ|6ŒîQ?fJyVù¤ ?À0«Æ‡7—4ÐÁUõ”Ç¢õŠÃp–{MŒ” ^Ÿ ÅÌNè­"-ô€,B¡P ClFx]2áíS./Ùâ—ô""ô•ÍR!¶8àsµTfè`Ð6¯lÍÏQEPD"ëòÀ¥7és— Â;¾õðòl,}èÖ÷¬æµ ¾Åº=DáøøXEuJ(¼Ê_ô ‚õ¢à‡ímGüy[¬òaPŠãޏµ–G=àx"žÁßiÑ3Å¢åbj¿3P=x‹QÚcPÎà™‚=ËÝê­õ(ô¼ÕÂY÷9X—úhgàw ´ Gð¬{X—»wÏ ‡u‰Úk~¥é®-¯í  k( ™°4c_EjÛº‘ÐGˆä¹oŸhæ?ƒ²Uv1ÀK²Zeí>*<-Hµ`ÿ±žÈeY¬¡EJ Õ1ÂôLŸFÛHÜëé="€;• ÿd.¥h/O¦ <àM ‚4 j`ÖŒJ“ÉÏÔÊ(,Œl&¼0ÙºÞÍ%7¯]%n C!1G˜cì'­fa*ͳLHßïÇÚÁ7Ó'^¸œß”…—_J=NZr9i ¯·q1ZXJ8Àj@< .‚cÅ' g㻹{Íä"Q[U-ßì•ЫÎÞJ\ªÕd!KaEbš-#f¢Ÿ%ÌU|‰‰=È 4(䞆VcŒy&G »:DjÕ¬µù"Džr¶žYÊ)„ÄÊÖ³Òå* ˜ t…Ë^áGotÒ.ºUãIß7TreðB7W/ôl\H6• Xtº¿ËÑc–àTeÊþCƒû‘kTµ‰4© pÒ!¢ªüÕ%wK6ƒOŠªŒ;þ[ð™%{{•Th7"ž@Øp<2•bÙ¾µò$u˜™àUðÜ„ýMÓ-Ÿ7O$嘴¢/­‘°d·r.|pjnŒ –çêC'Œ«Ží"T°—Gb]²°¿¸‡ e]ù\rÕû1…uƒÂ¬s@q3T³60åm¢N8¾,‹ -’e¼cÔïõ³Fžsaf5£1îñ´W.-*¢1-ëea<¾— 8B„‹þ¡˜B£ô‰…—h­Þ",eÝø{šÃ¢Š”Ê"Dà“m–.Ø]c9•$Ù€Rk{ ÂÉ–ö¬²e!È*Qˆ“v’©tr´+-‹Ýëß¶RÆhç‡ðÜ"2åE;Ë@,´ŽX‰ëV´òäã=¸€ËÆ× de2¥ò3ŽWÑ$„$HÌU³Ò‰,ë9-–Ý}°÷l:~Žº^ˆZiŸïùe°ÕnϦ¶þlZ¨ähd:LŸ±¬:J›,H‡®ÙªËÙ‘ ¶¿}Y9-ŠéÌÔ Åx gÖš]› 4ÑÁ§!ªdR µ[,J¢£m23¸A«+Ÿžî2ðB¬k8…²‰Ó[+l_rââÿŒ¯V6-c~Ø”Á•&pT<ß#ÜLÖHåvfªž–íã!lƒíNüY­ÍR[Oèn$<@‘ã|Y^*YL„aš(dU†³à¨dàúÈfrŽ5±^’– Ã$"íTTå’‰ïÍŸ#+’Bʧ$m-U{‚n9µ ó«òŒÐß³óÅyºhv~¶Æ+Mq½Ró7^y„ÏàF%×èÄ “…†ëÁÍMðH¦&ªDÏ03ìÁåšßhÖÒ×cGn•‚g€ÉèÔÅy+kF–%¢{­©/É ²ÕâSïë>D£˜=Ÿ®ƒî¶6E²ÀF5­×‰îVvÌÕÓ0#Ã9)˜«çˆ/*‹¯€ýI˜lA¼R<7ýl­w Þ<ƒ)Ÿé:)îáà>5÷³opnxw˜{xß,x¦ è#Ô–*¦9×…hÉÕÍg!,Üiˆñi0åA¹Bõé°::.µ3v|O¢DV§‡âuJø3½ÊàðÌZãÔÊú‹M‹Î$ëì:AaM í‰2 ˜ùÏ•øaý˜ƒcè‚ɺ˜+m9c_ت(Æ¡·ªö`àøìÀbsJ’‚PâÜcûw0d9Ü·ûQ¹,œµÂ³&vŸ)†”Ç6zà. öë¼?»‘ÁQ|##ŽÞመïi‚ÔÓöµ®wk¯ÆFòÌô9À»NŠÛc;ï[%î1Ž=Æ!*gÂ1Žªh›þ“DJ<Ž,ƒ ,¥¹ènë#\0¸Åº£z1Î(&AyM‰CK¬˜=ˉª²lB™RxµÊ“^½ÝïÃ÷nîÁ¥}ûÖÞÜZºQæX¨S–ïáÙ>T¦/‹¯o,ñbq裾4cz1rñÐTÃgëcågkií}ÇŒ‰­[s{r+¢V#|Øúœƒ>TÃ:jÇ¥VX3¸± …ߟqÔª¢–þ ÀÜéçnƯÕvscï0»$ áIHà’~¦ñH °ÍŸ’€ÂG'«!zT€lð °ähàzø•¾‰Ô꛺As·”¼¸2h”>|~ø?íëHö endstream endobj 2694 0 obj 5674 endobj 2699 0 obj [101 /XYZ 38.2500000 728.750000 0] endobj 2700 0 obj [101 /XYZ 38.2500000 554.750000 0] endobj 2701 0 obj [101 /XYZ 38.2500000 728.750000 0] endobj 2702 0 obj [101 /XYZ 38.2500000 554.750000 0] endobj 2703 0 obj << /Type /Annot /Subtype /Link /Rect [231 562.250000 322.500000 569 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 2697 0 obj << /Type /Page /Parent 2 0 R /Contents 2704 0 R /Resources 2706 0 R /Annots 2707 0 R /MediaBox [0 0 595 842] >> endobj 2706 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R /F2698 2698 0 R >> /XObject << >> >> endobj 2707 0 obj [ 2703 0 R ] endobj 2704 0 obj << /Length 2705 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sؾ€ €µ’ä@€‚;N`ØF”ò÷Ã!gg›üŠÓßV7ÉYZH´^šÍîêêz××ïþøåï‡þ÷ðîñË¿?ô?~y(ŽuYœÿ9<ýùîú¶9ö?ê¦<üðë÷÷‡ÏŸ»ÿÿöp~áË㟻Ÿþw°‡?uÿûùð׿u¿ü±ÿžþƒ_jSwÿrú»­M÷Sqùûé÷ÿzøËï¿=8|®ŸÌËÿ®mŠî­n3_þö0¬Òœþü÷‡ßÞ×õÓVÆÛƒñÎw?w?ýç?uã£ÇÆ;ãj[úîç¶òuQ6í~®]ÿùíÚ^>nÛŽøÕèÓ§?*ƒý±m·Ñ©Æ>Í[™"ÆUFûØzcê§ ~Cç益§MÇêÔy]ìîY²±OóÖ&ɰ­xpÅ}íNþ™:m™€ôMºm­št‚à4oeŠ » ÇVÜÔ¦ìic«"ø2º>åk“PŸæ­M’a[ñà*ûÚ}æ‰<¶.ÆTVŸ7_Œ®Jü~pWµé?Í\›(¶­Å±“™Qý¢¼5 7û2zŠý(MBN:Í<Ñfñ5OqU× 7ö2z Ú×uB®9Í<ÑÆÂ±SŸâƺ„›}=Å~´&!'fžh³áØŠ§¸)šþ(Ô­>yžGO@ûÆ”étñyæÚD9oìhìÏcàyœâ2ß„ß}x÷ÉxÓqSuøúS7µÓ'Ï}íìβû—Î?ïþþúãá÷EaÍ_~h•-‡òOŒGOŠ&þkãßñߣ'eŸÀïX<7ÿ„úN W ¿c*¸ ˜:ª4ðpÌw~Ïà¼Ò_»™ü4µ>÷i‚ë.>Â'ðI Ÿ`ÊCNrxnP88kA:Àï8¯µ÷-Øx_œ6ÞúöåÁòGïÎQÿçE×§'ͱi‹ÓLà ™zÇ£'¶…£ÙøïØócŽ¥¯šîaÈFåÑÙÆ¼ÍÀïÿD˜5œ°ž=1üÞŸ~Ö7lKq–Òn ãÕ“*þýdŸúÎâ,#l2­ 9úf*OŸÑðxã0—á-…gðf3gÎÀ4ñOð >ƒ[ù}°-/aâcNÑå.ÌLÄö +}L®ÅZ¨1APãµE ¡ªBPæ#ü|ì˜`Z3R^W–3†ÁÙÂ5nxéê¨rˆù¯Q]ÝÛ—uU¾üÎ+4jbÄ5ÁÆÆ¸ÅF?tHçB0àkøtÕ=Í`;1ð;;„«‚,]"ìz Ád3`h€wYÒ;emÓ†^YrÚ¶.T¡PØaDP„Ëá>Ä‹hAtBe$¬‡øŒ±@iÎÜl… v#ÞdÂ=–m«‘CA߆WµmÍûp0_0^ û:” Çl UÁŒÅsËàx…s•Ö€âzÕêì§´ën›`ÝoÈ6ö™ðw`âÃàðûnéEZ]δ¿öžÂ7›C7øÄ7muú¤3¢ÃY¦8žÝÃ+rÂ'½H,6ô)Í'ÕwZôŽ+Ë¥6ÒlázœÁ™ ž‚—­{1š…OðÜúœ©qÃw Hƒ>¯füàÀ?¿ófJô¤ÏhNÌÏ êS=Ï­::c5©#¼×#Œvž[}t#å ×cô~ê ä7¢p=½jàa4üæH7û>µØë­ç›aš0ëˆ3aBÀ+ôŒ°i'¤Óp¢FÍ"ü*eÅdFï#“¨›/I¸èŒ[*8i˜:!ñ©eD$7ñЉ°ˆð^1 æŒ8“Ò€,j?)W*Çq{œ¤O®g) ò…YÆ[Œ‹¶¿‡ß!ž`Ùaÿ—~©)ÕvËÎÏG ïŠwX — BÓb®øŸ>.Sþ¹šxMÔþ0'£ø@Ìï~wST(Ä”_ jÈ­×ÒR"×hÊ}DT‹©ŽÍæÓ覔ð†1ñH"Œ¦\mIìn×+Y@8…T ŽéÕÅüÆÐ =hIÕê+FÀ0Gˆ *©Š+^ßûh¹e—i±qÂlK„]¦Êùk¾º0‰¦YÐ" Bª»í?j©ˆy†¦)NÂÙ- r€seLlÃ, .\­‡èqïÎ$ÂN’m^;€³©k¿ª£-üì|î+ãŸW1‹…Ó„y_ Éä¾1÷—D{z 0ÔŠðKâdÀ- (žs~Ó΀z‚g€å s+ñœÀE­u¯‘5øÔbݤ[±‚e \$è bï=´0`™@Q(½™Ñ„¹+ÅRÄ„¶¶Ó-GS…fd–OªûÃ\ß‚÷tß…µ\ÎÔúKedFàŶ€×Ë×6i¬b|M¼ÀeðJ3 Š’€•dNš@üB13`ìa4Â3ffíptϱ¦0'â*_<Öã9%O;ÀlfôÇëŽ^a#/#É'òPæ[(c-…3ðxøÒÆ|Z¹.\ý ~Y¹N­‹²zÍêÞLl4Û Ö`‰ÖE]Þ3Ï·4áL—cÔÆªÎŸÉ6‘/ĽÎ8S®‹«|ïÓ(#¯›Æ%²h}+Ž\]‘!þb Ê@D¥*S¤ EtAà'1 `LQ}6ùTÒDô}]+£khVXé’@k‘0ßÚ@2ð ;4¡[E²1" Þp*ˆ>\Œt{›§ <^¶ò{FuUC1M‹_¤Àèàå;÷Æ´ì[kº-bL«%ÓîEÜÄ«[EQÒÉtˆŒf´tGˆ;¾W%eWTë +h1ÆF` œ"6>¢ÄývÉ:¶úTwÕ—Pãf‹-4¯ºI€x¡>¥.y§#×µçÔ ÖW°ÏÀq j¦:sÝÀN“6H3añ)üFÜùÂt—2úîºKø<‚¶ftÖâ  ²”® t¢rÇÞ¦ }UºHum ÂõVÆÕÁPÏDì-Ûe†·û¹TG‘6 äK&?WÙtųŽpY2ù]cI¤M× QE¡‹ÏÌ$íž¶¡³§{ÏXDšK"Vrl­¹$Í{ Ø ØçG¸"œs3ðˆœG«†ÏŒ(‡SlS >)ñQ,Ñ;— Àñ“è ž›ùGûçßÁë¡f ÷ÇZÍÑúšø¨ï§òN/’'¸·¯±›’e팀ŸMèÇÆ³Æ§r¼ýÊ?È2.ùEcgDÞÚ–óA0ª B%[ÍQºuºHs9nÔ« TÆeÚ2Øs¡÷àªÿO©™Ö:®@7ð§šaj°î ü,"<%„‰¢‚øìéKCL‡M2ɦòßá=$âêsæ‚ËÅ#غ%CÖV¸=éìVLYh°dH×2`À°”ƒÛª¼“-¨1:6LŒXÇ^õ"5ª6vÎîHk€6ç{Ž®õn’Ä(nDÄ#¸á7¨¨5×a8^w»9{{ÈT×9Š)kfX_#ÙÒ÷ïGÕ‰ê^V•Ú*¸+äÑ©$R”4Óg9]1´²bÐm^P„[pØ"-;áÖr ‡ÛÄñ;Dc·j„÷ƒ»£m*.W«&Ý’«uzá6Ò‹€²Cïôj{B/SõC#ô9©~Rv9"Q'ÃYÉžøÂ¼d½)3,W™©j+ŒîÍT…hb¤‚ L϶— dµ}ýÅ×´ðd1Ov©|‘H™6²0+T/¬ tº0*#6ú ´DË Úbü<Œ…)J0VÖçRñJ™ãÄàib`ÞÁOp8gÎ`ÉtÐÚËͼÄLo‹”¾~É!q¶Èâ”*Pk®Eº~™š¢XQù6Ž;AÏÈÕ½„ç.]ù~ËÄ×B/–h#2ʘ3)¬(Õó„®”ï®N!ïRö&™:Tp·×‹DäµFϸG™©ÒÒm›RŽ0íE‹]Ƥ[Ë2ú0BªÃÿTµ%V·þª­=JTÁDƒT¦”é  ¶–ñº…¬º -[*ïìcS`„Áµì¥ÅÈé‹ ªíŸe`J 7iVêÜ©Kbf“™r|xu[ZrUH¦õä¶èÐgˆ«UÕXðNT4œRÝÖmÈ ¹b†<’ÉclÊÆPDG¯Z4¤Õ‹É—ÄúWl¬®š#×ÇLËl¶–­|*Žù0uó!îvoÒcñ^FÝB7e<0"¿$dìì#Yµ™d£|½B­8ºg!l/B72EU„£½`Ü¡nZÙ0^ÂØ“„°4H€Ìˆ2˜TÐ3À ¡“ôÈk«RØT&¤0.‚$ú \çŠ ÙpažZ ÄÚææSƒQ´ú6¨© ‡ì# ba•‡çÆ HÇ¡/Ø›¸NŒB9Øi ÝàáòÉi‡6Õ,KPàexñVa¸1<œ†6~ÎB›’ëéÕLS„{…™³nÿDPÈp . XgQGž8ØÌ >"„µpÊ ñ#˜EXgŸ¿þJè)3VйËÈ!¾I}š{TÏʽfoÕ¯G8dª§ƒƒ¡S<溋ïö½ zV—Û©wTÏ·‚êù¼ç[Eõ¼ZÁŽê¹êœÉ¦jJ¶Šêyu6É$›J¬%Æï§w °ä£Â”t7+š§lLÀ¨wù ]Ë `ÔÆ «ª¹Y÷ek!øbj¥n¿ó‹Ñ镸ªó”&{Z?Ùî3ƒR7b7…KU›*vXH-‹s‡… NàôP› ÿ¿XHHŒ…ÄH';Äc!yì‹C³1è5 ° éá <B…§Äcä#H-^LHƒ£á]Xdem‡KÇVYYû üïY¹†“¿ËRmŠ.Ùî%‹O™¢kîŸØ¡1ß4fSå2 ÐÛ.ýÕ¤V8Íî´ Fù%\„Å[ ì!±<¾~‡™›FއáZê;¢›ÂÌw0Ô§êz,t”×é†aUKx8<Е™µÀתÔÁ£a¾ÖÝ‹wA—nªßÁgß‹` Ç+ŸSÈ£ÔJ¡jQ–o”±®.Áw]èÊ7ü¤ÌéÁ7­ˆyz¨õCL„ªAPɹ¼q‚çD–JµÇÑE€Ø15D¸©Qî4&ʧ„ÓÁ™ˆvË@¿¾¢Ö+­èr΄2áÍ$™ö»ÇÄýáS)QwËP‡ Jf-UyqÇǽ4„° j1Âl.´@Fج‚¥ê!”ïÄeJ× âq_8ƒá°—PªÞˆÜRv/¡$Œ«¶.§É˜òòæ&üæ~E³„>£Ûˆ” MGè!RQ^–Ý(¡ˆ»T˜ìójk—3D³ª‹çº(Ãå”°elÄæð=ý¼‚þHþÈ–uHà7~䬿ùÈìàG?ŠØÑ‹nм‹ •µ ÎìŽ^DžÙ½hG/9$zQÓÙÃ'ß z‘À⌊Áþ# ³|G@<ÂJÀ(Ä#¤›Àütg›XHp4!¦M(œMá5…>¹ãÙ;Ç5ºÚóâ]¯`›¸FLuLƒ%=fBÝ«…¬IȦ®©6ÕípBÿŒ$cÂêk®Oa¸eGpʵ1[VªËç¹î2a®;¥.O…E®DOzG»SªâdDUHØSÝX¦{г]s5:6D…:S?½¬¡ «HL¨|•«Û2 [ F|[ºpy¸·ñ¸/i¥µJøân[ÜîìõD+°ÏvìÍ[n‚J ¿ fl¹VgfˆðU»1»³[1f)ks¾?1Wçò¶¡sMxäß´mè‹2¤Gz¬ñ¢ ¿ùÆŒÎq»?‡oE"žûnØ…fò tr·SÝJvèk/pÔy?ê ™sfk ˆ&²–½†±ÇÞŠ¾’(J½è;nÎTšÛ§~¥ãì5ÎööYËÐÚÁ)Šj¼Àž‹0.ÀË0x4øN/ÕLÔÒ¯r­,Ã=ýÜÍx˜ùc¯ÄÆ´›ëøœX“…;!°ÀÈø&`Ì Y@¨A€“µs¥SQLh°{ÙÀõð+}«Õ…;öbj‚ç¦Lk¼¸+,¸YYüùðùáÿT…eÎ endstream endobj 2705 0 obj 5563 endobj 2708 0 obj << /Type /Page /Parent 2 0 R /Contents 2709 0 R /Resources 2711 0 R /Annots 2712 0 R /MediaBox [0 0 595 842] >> endobj 2711 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F2698 2698 0 R /F1500 1500 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2712 0 obj [ ] endobj 2709 0 obj << /Length 2710 0 R /Filter /FlateDecode >> stream xœí]K㸾÷¯ð9Àöˆ/I‚ó C€Á CC0›M°È.2ÙCþ~ÜmÉí–ý•¬ÏEж¹îi)²X/«¾zóÇ/ßüó·Í›÷_þ³ù6|ÿå¡yìB³ûoóôõÃá/lÿ8ü¼éú°ùöËÃ÷Í÷‡ÏŸ·~Ø}àËû?oú߯nþ´ýÿçÍ_ÿ¶ýåÃ?zú¿ö›¯?n~ß4îÓ6_~ˆ­ ãwOlDOš>±ðÉ{ø¾Çà÷¼…Ÿïq-í¤|‚çf:øÎ@ø ¦Û‡å³öç#A7È;x¥Îüf–Ïó›ñppŠªÊ‚ƒëfàHkçæ!­œÛíÜǯ[õ—\um-æHF¸]³O2Muk a.Áœ…õ"Öp°¶$¿!4ämA† Ÿâ'x‚tUÝ#Q'ƒ|G 1Ý L4¯ ¼ônwá6•àþ±ÍóL§K;õž j4«ùƒGÛ±Qxt¶7¯ž ,¾lnpxÖƒ+ãƒoû.œ7k¸ xÖ¦Oà{øu¼õ~d%¨)˜'U“sšÜÓÖä  ‡+<Ág¼§ÄÙD8Qa¿ZL·Á.d§Ö ¯ pª334ãšJüÄ`2Â4˜ÉðhPl…YC¶9=\ÛÛ˵_z¿Â¹ý™ñ+°M%¬º`9±Ä>q;âö/,ã–»”ãДµ?ãŃ7ðŸÄM‡Ç›€Ý L •u1{ i!,ãhJ„cˆÙÛ¼ ¿dW°“|>3àëO),l-Þ@âÅ©¦µÛ N”l)7×S&f-쎷̖Ð'hC?áWóa¹nt#u»6¼–Be5ƒU¡|(".ql‡˜ÝÐð %(}ưg²‘ÆëÁñ0]«ëÕ«YZ¤¶â±ÚZàsÏüxÏŠi8ÀT`Ë#ÖŽ˜)a€’ «¾;ßAľ?ž’j|:›æQ9Da¢ ‚iŽíA?å%ü<7ø†#ëßiXXÞ4eˆ#…î’½+8Ž$8ºøÖ>ÉåÎ:î YÂtqÊ8¶¸–¦Dذ€•fSæJ”¡\J›pB1E)³{´ýåiäŽ+⃵•à‚,8&›‰P‡|&ù`b“Å/fœp,”„³O±u^'¿'eH͇©-\pÿ€msº#tz'5*rrDsÓû€¶‡yBùÍ x /P÷ ÈÃT/;í§óM»JtÓâȬá 0ÈÕK.øàðÂábõPhTÊÔ›KIHy~3™­¢C~1“Be‡2Ê–¹ÂÛ‚·’ˆµ$ÞÍ,-uÏìÆQ®*áÞÒZÊ¢Ÿ‰ÿucAGåe¸v?EŸ8CSã­™,z¼(?ºf.ñÛñ#Ÿù÷Î`P}§|9g€­Dƒ>Ó¨•Ø6¢Ý2m?Ý.\ÅAd/48Öb ¾z ›O”>Më”$!µÐX?}§ ˆ/†„V;%OÏ vݰ`nV•´!éÕØñÑï1XÛ@êPtƒrë;¨»ðJážb­¶/nX¢ïð ,1œ›…ÔvnîVã”ÎgxsH»ü‰`©Þ/—A² œb«£LÂî1:Dø Ô‰‚,@Cð>°Ô’…¥Ä½…4 f ¬s/–`È!C¥EBkè›gcèÍX11TÜœRXÈð 6ŒYª+Á0w°:µRÌâx=X@Q˜2åÛ{b‚YaœÂHÆP 4ÀñG†Ø€b¾Æ |4 ¡®·x«·xSä\•ÔMÙ|U\®ÒçRË“ÆPŒ›žÓr׫×ú°{6åQ˜Úµ´ÈVKÊ€±2±õéCüµB†øP?)ѹýø^ùÓˆßaû}àÝ»Ay­¶¤Y×n7—ˆSñßÍ*tûÀGífUt”*ßÅÈwkB5—Õ\&'a«7¦¤úôÀàŽ7x4ÜYs/ζÇù,óœ[) ÊýËŠw@Ú0ö†*ÀÁò¥‹ÐqŒî43Ó ËÑ”âÖÜ™lúwýæœ]³?ªÔ朵9'Iƒ¬Í9»vì'[›s6LksNinÅ7çìú½Ã[›s–ßœ³‹c¨>›ö«^q6¯ëA«.-E—öfô¦±.-™11ªŒ™×6ôû.bE7nî㈖D%ÛÞh'â¢[3jt×`È%äTê`bÁ²¾×ÇÞÍ…ÏÍuÁ½± ,=Ç©k§Ü¯ ”+Ew.B—²ÀÄOmgTr»¶Ôõ¸‡ÉQš%ƒrÀ$íOª³‚J;gÕ ^Ëù+ÎUà=á||‘ÁŒ&l?Æ-ÀÌ´ _ºP$1Á•‹æÈ˜Q}݃«à2bÜ@ìHaÇ#ÊFÓží+ø€D7š†eºg£LØ\Ë-À+™ÂsdîXuo†‰²¦…¢pËË d*&]RÄ0¨¡¹ðNâ/¼öY»Pi­^G·vŸÉ¤8Áí„]k^ÁuxJ!…c²%îl·z+ê’Ax©$ žQIºeò„q·f†YJ“ZUÐS!M3 QʆÓRãw„Å_àáÐãF2ù¥ 0~.¯›ˆ„bŠR :7rÄêæ…ò’5ŽéØ¥”!fÞð™œ!pÌœ×ø,Ä1òLˆ¤êL|þÞê\\”Ü”ùvp{L¦õªP_V>Z/¢¹¬Šp1¬Ùì“ .g.à·[HO·Ï7‘~f?ï %n^c–—qÌýÆ,=nü—ܺÎOtSÑ^Èg”ÐM³¡tâ¥t-ãÀâmY«í¢²ÉXMÛ3»± §#͵MKØ×·µýÔÁVqÃ]Ü·wŽfzWë…¹áö½°ëÀ>8¬têJ]µ lÑp?Â'ØåÈË! e©’èìîŽ[NµMÆÝÄ1¥0¿Âј†LO÷!|Ñ. ¢1÷tÓå#†ûõ8̶1YŒnª°q.™g*5p®K÷p1}rA5M?•T]­Jµ³ÇN†ª¤ ÐILÃv]½ÎXÊk³,Æúé‘N0ÜXyB…k±Ig«|¸%CQ¦±ã£3Ü'Áì©%£-ãa¯A°gHKœÀ¡ºÄedKœªv×qƒx&מipJTì2u%B¡®ä2„éfZÆæ²îÌJ×LŒm7|¡j„-;*ÀÂÂ¥êrR ;¦7ÍcÛ™×ÙU’]2e»)g4¥=R.ôù…3L-J^ÿ’Ä<bŽLKúÄ5ªTzy±–Z>uÅȪYž)*FÖ2âß FÖ‹EªYîò`dlW)0²^V½~P„‚maÚBëþxc‘–±»8eì\%8éÙ·÷*쫪IËé!:{?’ò:ÔùéÎ0ÕDLN L{ÙÉ@T•ÚsXJÓÞÒäfŠi츳4JÅ,Áðj$æÊd+³èü~¿ÌöTbØ€¿ˆÉ{ôv–÷(·6Mþ“bw¼râjƒ*y.øz7›·¢z.PmV¨7å,˜«²CWçÑÃ0¥÷ã¥;§pð QÅÃÈ7¨z d8±ÛãP^õ†zÑÒ+ õ9"^a¨ë©A85$ùx75¢šsНòŽûO7’.»z9£J].„ßîÞoãl%¸çºØÕ5U¹Š½³¢MSѦVZ2Ú4†­ÂûC ÇUj ‰cèRø}ð3%#± 8µª­Ùh]BupWƒPÂý!TgãÆª«^¼½8sâi›Š]}¤Ð–Í­bWçÅ®nÛ=+Ývuð±«Ûn»‘‰ñÂá‹Q ¡ ÃO<˜uVÌâ6*`W)¾)îLwcŒuZžÀѲÊPçÚËe(½ÙÅ1ª^+̵ץra…ýG"/Ž©ÙÌuÅDaPg*®0ƒ‰“ S…Ìd“- Ç$>?…Fw²´Þû#ÕYoо=bb‡x˜¢¸U öõü4Xݺ ¿2I7ƒç|% *ö»"ÞÞ<â­rE¿.œâ‚¥ë¦Ÿ¬˜Àc3UVLb “ZC¤†¥NºaBѪtÆRxx¤j¾t/+0u2LråÜß ÔÑZê1q’!Õ?¬O­}‡ Po̼Œ1‡e&„¹õ|еõó5}Õ„ `3á€ëçtÊn ®fÎÕEf ¹T™|ù‚³ï©ðcåªõ›¥– ½`û‰ÖÓÍY¢ú^ãœZŠ<¬¢ŽaJô•Û1žoyˆ3Ž.ÀUW’ {¾÷{þH\ŠÄžŸÍô:E7øD Þí¹øä)ÇåÆ@è…÷À• »€?ƒWŠ-#¦u.ú¾¯ ô©®n„¾è³ÔU_SËél´÷{Õ$„Òˆ{ JI—R_òèaÃÄÐ 9BLÜ–¸@ î׿²,ÙèPU‰Ñ‰¿¼Þ\‘«£@©  Ö eõÞ‹.+¹p2=v4ÓCŒî•6u9œ>‹ÂÇɪí7ÅÂbT…?VFÉZÜ'ê¯_Îmð{ˆ'×YL-ãÄKLQ\Æû.'“…0¿ùLm5$‰0QÝ}¬Ä°sóÓÀüoá Τ†Å»€ !g+ÄN=ɉü;hiôøÒM7‹£™íGÀBx\%“Ø…RLUvÏÛG¼ÛpnØv¼Ûp0­KÁ8‚︃;Êí׿ûv|ñõŸçþÁ>ljnnëe6æÉÛÞØQA4øJjG®î„—¹#¾=q¹³c™×>ìãà툧Çñè=n.¶zjnŸ†•¢NÑñ/SjàdͰô£Ú #àsó‰e<üÌY1‹–~pŽdîéçíŒÇ™¿Ž-è¶p X¸ |€,€?ÓOX@ óGÄãÂ@®Cád-¾%˜Ðà0b×ïô"Vë÷8¨©> endobj 2718 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1700 1700 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 2719 0 obj [ ] endobj 2716 0 obj << /Length 2717 0 R /Filter /FlateDecode >> stream xœí]]¯ä¶‘}¿¿¢Ÿøº)ê£,ðÌxÈCÃö!ÈÃÂ^od‚ÍCþþvëƒ"K‹jÊiÚ¶çê¾ðåÙ vSžsJÜ¿>‹LÈæÔ§¶í¹$_®ÚŸÝ¹êªšù×gÁßÕ9íuÛvu\zé—kJ×\Ê×wÇ×çÀߘs“ñímÛ3õ]üòwªû?ðZX5]ë-ÜEgJs¹žÖ\«Ï •ð:¬¹8ŸjjúÊ.ÚögºÌ\maÆ«á~ð«g^线Í0WWå.uÂë¸~:î.rkÛq¹_4b¦¼mUô&Þ¬»Ñ‰jŸTdÃjÌ—öj-JQ3F!ß%<|´»ÂŒÕ™ÒN Æv¹+Nñ«î”^qjÎ.Þøòưê§ç ñ›ò¡Õµ‚×vù9:L_Ú‚e\ºŠ'’¼S–áÛ¿°‚ãÒåÅØ®2nè}U±o$]#Õ®ôtf¡ABÕ´þ ˜¤Eð%,OA3èoZ~wu§Ö„µý¨» ¬¨ÎŽ ê¾×ÎxëÛ›ËÛ;¬Ãr=I?¬‰É …t=Eèô0Icÿ%,OAÓUŒ§dvc¸Ù5ïADZ“‚±É&6Ã]Á½Nêò_Üž¢HWË{·Ñ^dƒ)¬Þ×v½Ð‡…I¡÷Nkqi›1¨’%îð‰ ’¾*./Æv•qCïöU­…¯–.œÇݪ3 M,¡*¬XŒ4ö±“Z†¦Wê´ï5Ï}çê®’.+.Ô?¬ç²:ës}må˜Øb44Ñê`ÄR`õ„Š`¤A}Õ24m3ü´LraCmÊËÁÐ WcËm€hòU÷;0[¦›e+Ö˜iAÊ;þ97hmcx¥­_Ë Ù ¨Þ«-£Viìcϵ M¯Ôi1Þm¬»ÎÕ]¥M^^ñ êÖs`õ¹¾¶lX‰æ9î781±X=‘+Ó# zì«–¡i›ä§e’K µ9(B&þjl9ˆ&_u¿«@ ¬æyRPE ÅñϹA«S•¶~-3dƒ z¯¶ŒRXñ(e-c╳ˆJ_PL”z•‚; µ*¬¤ö&z¼ EÈÎT¬µss™bâ‰}\ ¨X·™lï6äQWk X´¥/˜´$~XϹE–éZIí öx÷ÿÔÃ9 ©çª‹|_. ,WË•‡V<ª–¹®yP¨æ±3V06™‰jØYÃcg ˆáòÞ¯4š±³ L ‹ùjõaaRèýØZ\j“¨–±®y€(¬$²’\¾Ö‚êìØ þa=ÖøØYÃãA‰æ9î781 ˆM*V# zì«–¡©yìLM]B Â@5.T¬ÛL¶wò¨«µvæxìÌ@Ó‹à§EM ƒ‹2ðÇhdR•¶~-3dƒ :¯¶ŒRTñ(e-cí@HÈñØ™ó±3BBzU±V• r‹®8©KM‘njW5mFv ˜x"—Šé6“í݆Üñ‘ã±3çcgއ„ô,’wÄ™fäITÁ`zé£4ƒLÒÕE¾/P–+åÊU<ª’¹&N¨"Î;ãc“Yˆ4xgÄygxT3彟ÑäMab¼³±Z}X˜z?¶Ï;£ ¼3âä*¼3â¼3âT+ ¼ª^Â×r.Uª`p,š¼³)4œwT¬FûØs-CÃygj:ÔÙfã­t:vFœwFžj¥auL€ÄÐÎ¥J0¢Â; À¼³iÅŠ`¤A}Õ24œw¦§.¡N‡ÈóΈóΨH‘wF€wFœ@•(ˆÃV”wAxg“Fä†lTïÕ–Qâ¼3Òä Sç‘ç S)"TÅZVâITá Z©)Ò-@yÞÙ´¹bâ‰}\ (À;»_£:óÍDÄygäygÄéTŠitœwFžD^¥ƒVzÆ( çÁfdÊrå±\yP€w¦ <¡Y®¹f±3^06™‰HƒwFœwF€G5SÞûMÞÙ&Æ;«Õ‡…I¡÷ckqñ¼3ÊÀ;#N®"À;#Î;#NµÒÀ«êõ(|-çR¥ ?¢É;›BÃygAÅú`¤±=×24œw¦¦Cm®½•NÇΈóÎÈS­4¬Ž Z¹T©æ9Txg€w6­XŒ4豯Z††óÎôÔ%´À äygÄygHT¤È;#À;#N š0ÊeàAÐêT¥­_Ë Ù ¨Þ«-£Äyg¤É;#@§"Î;#Ï;#@§RD¨Šµ*¬Ä“¨‚+NøRS¤[€ª“µvn.3PL<±Kxg÷kTg¾y€ˆóÎÈóΈө-Òè&8ïŒ<‰*¸„/=c”„†óÎ`3²e¹òX®< (À;SPžÐ,ó çñ‚±Éiìcϵ ç©éPg›}¸ðΈóÎÈS­4¬Ž Z¹T©æ9Txg€w6­XŒ4豯Z††óÎôÔ%´À äygÄygHT¤È;s€wæ8jZÀ(_.ï æLªÒÖ¯e†lTçÕ–Q"Î;#MÞ!:ç‘ç S)"TÅZT2È-ºâ„/5Eº¨A^Õ´Ùbâ‰|\ (¼³û5ª3ß<@ÄygäygÄéTŠÉ» ÇygΓ¨‚+@øÒ3F)h™¤«‹|_. ,WË•'ŠïLAyB³l¸f±3^06™‰œïÌqÞ™<ª™òÞÏhòΦ01ÞÙX­>,L ½[‹‹ç¹ ¼3ÇÉUðÎç9NµÒÀ«êõ(|-çR¥ Ç¢É;›BÃygAÅú`¤±=×24œw¦¦Cm6ÞJ§cgŽóΜ§ZiX 1´„s©RÌ£¨ðÎ0ïlZ±"iÐc_µ çé©KhÓa çygŽóÎ Q9EÞ™¼3Ç T‰‚8lå2ðÎ hïlÒˆÜ ‚ê½Ú2Jœwæ4ygЩç9Ï;s€N¥ˆPkUX‰'Q…W,h¥¦H·åygÓfäЉ'öq) ïì~êÌ7 9Î;sžwæ8JÑ"n‚óΜ'Q…Wé •ž1JBÃyg°Ù€²\y,WàÊóÓÛ×·ó`0/wÚ¿ÑÏߙ˿ƞ~ý26»ý6¬+ùùãŸ.Wÿ:§?^þûÛéϹþv©?øá—·ï?»“©O¿ü~2§®ÂöŸ_¾¼5Åé»âR{iN¿üvú·óÙ6ÿ~úåoo«º¨Úöuw ×Þ¡wrçøÎ¹€w>¶wÊ÷Ò6UÿµýÛ;Õ»-ÈÜú¶½Íœá3¸žfý÷˜Rð¥Ô=sÃgÌ4¶jï\t­¬©¹í3L-h,®gòð%Kpò^€%iL{ÇØ\òÂâj±f zíî\‡Ñ|Æ;ºc*ˆ¼c?AEÄèàïj=#S‰Â ,‡DwÌ'ø¶N>?þr±ú÷lÓ\^›¶ÙeÝ0£Ýw÷Þ¶3jÐx§ü¨6 - 뺞îªA©?£á`?*H  ÞÁƒËð¬Çàz~€Ïàzà`¹ÀÃhü=Vóm3­þÞ’›¹ƒ1ÀÒÆ-ÀßS£;ã†[`mƒˆ8*šõwp_°°m¸ëþˆµH l)àdÓÂ/¹ã64„Æ”±ƒIA¿tg£¦Z; „í"Öleáç‰ôTpç² hýBÁÅN45p’ ¶6Z^˜ -H–5ñ,U²š€¶xéC0äÅ­žY”Ç#\›ŽV ?/-`¯—ÜÙß¾õö`#ë¡Ú š® ®OãÁ„î@ åŒ[ 6á¶a‡Xá/4ùÕ–c„¢q÷÷…¦ ˆœÛfZ;ŒºÊΙò½0l¦üÚ+èOú¹zÊÎwo«‡j‚;Úì¡/LìðN…W0? gΟÐü=E¡ù6ÜêE¯‘ ޙÁK{ie&µ~õ=3ó¥X« †¤*¶õzQÎ|:Tç~¨“èPeÅâ (!(“O?ôgàz Àf´?ƒ¿±Ê¨yŽ…)­]\府"•…_¼Êº"¸‹´wK°Áþ@16”=0wè°‡ÊçÒ­â¾( K¢1ª¡£o8c`&‘ëd¥E Å¯õäÌ;**æèf’‰Nd¦¿ã•'IFˆjàTäVŽìtèV=[£ž‰IKVG%:ªjSgô`…'Åyt‚œü“ä+QÊ¢^b*^/¢š˜A|€HKÎ ([3<66µyÅíÃ?O’tW?—„šQtæÊWbÎ]@U™¯$ ó•“´~íº,^ñíZÝì9/›¢UßSÀïÁ‘|Ü«F°¸¥;•Ųš«‚5ó6¸³ÓHÔÂGlÖ´z£ä?,…&}•P Iú*k³q×ÀvD·Óˆ„²)ôtƒóÅ=~Þ ß ×ƒ­… YY’ ;ó¥’!´#’Xœm!qØû[à$o,SÜ9iÌçMÇ¿ÎÝÓ5Žž¾Z™!ï°§,çkVŸQ¼öJø–÷JD—×0)'hÜF,I^«êõ ûR—â¯Á^áüKzîûî `Ý™™²o{²jù£‡×é«óµ7Áko‚Y3¼Lƒ×Þ7µþµ7Žº½vH)²ƒ@ÎPjY2oùÚ›à\±PPÍÐ]^{¼ö&˜—¶êÞ3_Š¥ Û6³æÿÚáé"Å3tB¬o¯½#y¬ãÀqßëÚï÷óÊ­yYÌg´˜ûï¬ÑløÚYcmÛ^;kl;×jÆIúkg;`tC®ÝÌÎЬØ|C“_BYâ ¬GÒ6,Hœ„$ª"Z·‰êˆâ!ª¤žfé(ÎQ„_Šw±xš —;$­žÑkUtðÛ°^ëJ¡ÀRÐÅMµÜp‚¡¯ÜO¡ŽŠ¾Tùªû=Øúëú«Ú³°}Ãw6Ý#‰ŒÂnbùgT« »mÊ‘9 «<{™ädÀ—ÌÄW„Ku7TPei‹âö¨Ö†ú·UˆU²qƒNJákû–ÇÊGlÎ}5Œa¾j«´ÌÍömè-éù½nLœ»Ðy/S½ŸëÁ«}&D1Ü¿T@YÆõHi¦º.X “dÎ,Ÿ}àM’jˆÅÌg`M™$mânŽQ’þHG©$ÄÏ(±d»Á¦:ºNX”?„ëÑV v2ÐÝBI„uÞXJ¸ïg~ÏjÎךÙ@KxÄc%ÜËžL-(þ.<çRíB3©ò’=™ ¯›V«j®$Æ|³ö$@BÀP$4µxäÒ‚ 9*O2d{mC¤•~¼£#.lÅ´S—¿pÄi—êvÃ*kÔ›&E8KqÛwL!¥\átk¤gÙkaU’ÇÒÛž-‰Í¹!#¨ìÌMjéKÕD­ÜÏä`á1î®ÌªãrÑ*¦`þô cßçJRgÆŸùg¨fz>œ·6gŸ…¿j;Þif/#L:úfüøþã,Qª¾€V3³EÖQœÑ ¥ð dFSÇØ¢Óœ=+Gyp`ÅÔÝïðÛ1‘7Ѹ¥Ðp ÞžpóGškÕ:©A1>¦K6sœ9ÈÐÊ€ñ€1Á5Spk:]!ªéýúâ/þg÷Nt>ÕõõŸÆ˜®´1§ºzïÔç<”üúV—ïÆ¸‚Èøß²Ñ[lXÇå÷ûŸ›ëc'öt]ó:.%—gâ–\‹¢·P\Ç_ß>ü!Ó´™zµjü9â0cdfö*‰ÜHÖƒ%sGÕ0üã)4gÆÈ1á?æ¾3$åìËNESó¤šÖ:“¶Q¦¨$˜, ÔIRˆ5ÑyqZgÛ¶dssî\èÖ¹ž-+‰±Zɉ[ªÙþ¢ÍwÏQ}PüÂÄMvr“dºKrí%»C,îÉZÌ1jæõlÝüZƒ ¸´‚¼`‚9ö}DbDJNÝd‚èDç'ˆM‰M)9A¤É‘DòDŠ&ˆ´áÑù¥ Ýϳq¤$éæ‚Q¬h×NÝôFÝ&v@´ëò'Á3ä9mÌh•IJE“À¼›ÑŠŽcUåJˆÒ’'(™è²ÑaèwÔ“õlmbNrÚî÷+F³:œÜ½6Ÿg’º²"eJ7G÷vû)ÉÚmÿíFwÛL⡦J[±Þ¦ W]NÒŠð+Y¢UYy~¥áîS5U+‡hÆ âx$»“¨ÆVÊ3cq“pö¦`ÑsE÷V[á)ÎM´ÂSœ)±ÂS˜3[}¹–ðžö·lôÖ1¬ðç:±ÂSœ+^Ç¥„¯ð´¿EÑ[(®#ÿ OaüñPª3ÌhFÞ#\”Ep±Áé6–pðEJØ‘F—Ï2ôÑPD[ÞL {.XÅy3™ƒuîဵ†Û’m7Ë,†ºæbÀYöX ‚THÝÓ™KØê2{ÂLYÙ´Šä?u1¨s«¬°‡:µî±NÜë¾ß0i«¨òl6|‘,@¿F+;VèLÜÄCbÙþgpm±?œzQµ¹3¤>ë7Ä<ÞHÌ|ÒºÿñQùÕÅ5¼cé­˜lŤH®˜ØÉЉM¬˜X¿F2¼Å†uø“"¹bRLVLŠÄŠIáWLŠhŤØpÅÄÚX)VEîößOy£E ƒ\5Ô:|ÀKþ’-t‡«»n;cc‹º`j~žsÎ%ŒÂ°¯eÅ`qK² nßûaEZ­dÿ­lâ˜u1Âq{Òí!8¥íÈ= SIØM _EìŠ&<æmìŒÚ­°£ê„D¹tI¨“•5É f"„̉H+„Ž»† thIûE™LèÇ4œ¯×ïNyupeœ@…ïôÈÕï}ÆÓDyRÏ8øLïbk)ß')UÝé÷;H¼Ø– ™¸ð~ìvyÛÙ´OÝpGo^Rw,¼S¡ïñ[g e¾”Äà3…Ú.,pÑÍ@mÑ ÑM ~úÕÕ'aüé¦8ì–¾ºbEû€Ûà=TJežüí<ƒ Ýüt¼$™õà¶iìI ¢]tÌîw̉­ *3ð$›)HRÒT“ÈžÞK‹ÜÛŠ)vÛ’…½8!ázàe?ŒÖJ£Ø}û‡w`ÿ®²«æ~¤Ú¥!eVzƹá>V’…ŸÁw¶2”‚cr•{ ¤¨šÃÇ´J*½KÄ;‘lA/1Syɬ’åf‘V‰,å=ñrQg7XqóÛµOaÈ]w î1÷@ÛÀ V%Þ“¬ÿÍ섃í¢Äˆï¥ë°B²nú}ÏBÙnÁyUZÞ“t½™O—ŒbUÐÕÝÒJÇ©x·&.Ie¼=aqÓ‘ŒN²nî$ŸdqÅ]5¢"9†K¤ó’Þ°D…Ú`(MfæFÁkÉÌB—ú&:Él£…åý7\\³ “â ð%¢Pøj;¿cìh«2§»Ñ¦v!Ð®ç ‡=Aôº*jæÅfÖãT¿“ñ¸(aXu3ïCG÷$AdɈ vÕ™ƒ@WäÜ|»Éz3Ã6ÜItw‚~¶Ðê+e~ùû|<íc{—…‰ñI 3„6¾Ó[TlŸñb•mÂg¸µíc„…3;aX ÄïiÒ$Òõé©g:‰ÔÃq{7áŸéÎSú¿§ßº(Õ›ð÷@mé÷dÈÙyÊ’I~flQÀ±&=–plûFJp6âÌI‹X[°—üBêlÁŒa r”~±…V–GïW˜Ú}€?ÌwM.œØôg¨'žÁwD³yÁ˜`Åг?”4U±êÊ` ï”UnÕðÎv<èy[åTû¡ã*ë=¶á{i÷LZv Œ‹;«‚¬j\D©pÚ7£xýo‰å¼E÷":Ìž…[ô~eÅôþP¿”ýÙߨTf÷Ë~™`uúa+‹àÿ-Â0˜m5ÄS°Ã¢|¨±Fågbû5i$w­°E_/ŸïÛ|VVì·…çöìÚ=°Î q>Ø9ûnŸ¾ï³ïÇh¸ïX›M­qYGãÚ¬×`-Ø«³mlÑIn˜¾îÙNß'6›pÊa8¦ã¨÷ŸîIr¼gl“`ç]©¾Ö½çʨr-ù Ìšv甘µã â †õæÝ¥º&?Yù²§±¦=¢À·0£›-E< þÇœ™ÕXÏìl·´Aýæ`\ØÄÀ$¹¿vÝvÁHmU„ïP˜c ëýNåi|ß›ÁåŽp«e’gqCÍþ«#{Ÿ4°A¯¡üh;ôAm•ZÑw?¢â=úÓr<,“ìW"ÙJW•à»ÿ:úk…`ÁÀ–/ÝSѽ-üÃf‹/Ux¾Uçæë&/½:ÀBàËÁnê`oYs{iÿ#hÿ.~³É—2>¶2t±ÿêïK³ Ù¯ðþc ÷RúÇVú-†›%À¾tð!uð˜ñ5Ú?¾öRè—ßĺþR¹ƒzQmsôò¢ß@Ž ¢¼â,‰'=ïx.”7šåó~£·:›Eüöð˜)Œ´¤lÍžúO“å{¶Çÿ›„Áwþ­bÇEù˜‹Ü´ÿ"÷Šƒ;tlÐÍ~©Ók29o=±v>©’la‹wKR™mä×å¬ïý•y'•ÌÇDã£Ö'Yלv‰u_åæ½¬¼5>Sá=³wŽí“žÙ¼Náéx×Ç:ñKrzWþ²¬a^l¨3§Àä =è‰Ó‚³gú£Æ‰¿›·ÛÙäÏn"fÌ2–“äüZü Æëä4<ÁùuxHÞŸn²N™wêæÌüŸ“fZ¢Ý…W|èŽ~Î\l,st’£gÏ盇-ÏvPÝC w€ W p%Çb½ÕVªp×ëK‹‡–ì»ñ;ì]  `µ™Q¨ìvD÷ÄtÊ•Š ànð ©Zk-‡YÌ-wð÷ Ô&ä %n¡÷6-ÑEgt>nn'ÕŸælß{Û“P¤”Hð`1h΢ýéôÓÛÿÒ8~ endstream endobj 2717 0 obj 8296 endobj 2721 0 obj [104 /XYZ 38.2500000 402.500000 0] endobj 2722 0 obj [104 /XYZ 38.2500000 785 0] endobj 2723 0 obj [104 /XYZ 38.2500000 402.500000 0] endobj 2724 0 obj [104 /XYZ 38.2500000 785 0] endobj 2720 0 obj << /Type /Page /Parent 2 0 R /Contents 2725 0 R /Resources 2727 0 R /Annots 2728 0 R /MediaBox [0 0 595 842] >> endobj 2727 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 2728 0 obj [ ] endobj 2725 0 obj << /Length 2726 0 R /Filter /FlateDecode >> stream xœí]IãÆ¾ëWèlÀÖÂ¥€ €g C€È!È!Ç1ŒŒ‘‰ùû¡ÄER‘_‘üôªHuÓ¤{D±–Wo¯·¼ùÓÿ8þë÷ã›w?þçø¥ýýîÇCv*ó¬ùïxþùþö]Ú¿e•¿|=|;~;|:|ªÿÿÛ¡yáÇw©ÿúßQÿ\ÿï×ãßþ^øSû¥ó¾JUÖ¿ÿ}ùíJUÿ•õ¿ÏŸÿrøëwÇßÎ#vÓµ‹¹ÿ÷÷*Ë\eÏ˘˜úÛ¡Û¦ºüüþå·Ã›ËfÑ™rEuTÖØ£rVÿûÏÃÏõÝðÙÉY¥Ê–Ù#•ºžIg6?*íꑌLtù>Âàª,ã ~Y¹8T”)TxôSe2¥Îíù Ï‡œW•®ÿ.MûßcûÒÚ5@+‹PëGq$&³ñ¿¬\(ÝqÃÁ%IÙä-9èÌÅ€~‘Úò""Ÿ¸¬\*ÝÙâÑc“r¡Úqy¨õ£Ç8’R©xƒ_V. ”î¸áà’¤\Õ7à)cè:|„Á]qðËÊÅ¡Ò-]ðpMV÷føƒ×Œ:Þà—•Ç:ÜÀè’‡k]Ë5ϣɃ¨>ü]ñp/+‡Jw¸ƒÑ?-/¥ùØ|ß/¾ý|xó±6âÜñóÏõÊš /¿>=èâøýÙÊ«1òóOÇ?d™úáÇÏ¿T½ÂBçÍú¦ždååI~ÒEóèú¤XþN`ßqpÕêò¤8uypóäCóŽ:åΔ·£Y‹ÞÁO¨¼»<)OÆeÞ~ Üi†V­›'>×÷²ÔB1†,6;#KýcÛ)MsˆîTúËÔ 8ªSåo-ÓðÉ;© («2°‡šÜï!«Ú=4Ç6\éÈUÂ'ïàhÄ<ÍÁày~€Oà~Úy""•ª*ÿDš]Û“5e>¶7sÊmQÝ!–£'&ƒøö¡%2£+uOdGá;¦!óÊ?¼±m˜å÷œtäõÖŸÂBY‚*«ÙûÊ,z2Np%-#U¦ƒÎŒó Ì3_º‚;†§8I ?ã/ _ÎG™ñIbä , oCŒåC™UùB+{ßKÐf W,}Û²AÓn{Æ“$B+WyT©Õ÷²'[‘g‘§Ðj¶l´Š%Õ˜0ј¦U ÖàAXÀáÕc&eØA åKnc@â%ÉòÔ§NLÌàÐÖÀ¢y½-H<>äè­^˸,¸9ð‹ P/ 9¥UÙçÁrî€ÆIà“z?O#O,´½…•R¼ê|¥žQÝ!šŒ=8ý@+[e¬¬:ÿª(ïá“·è VÓ4|'ƒ+hÑqì Tíð;«ƒz?iNØ•Ó'L(®¾ƒ÷Ï>àŒ"ÎÞb'Ñî(›v”aˆ&ÁXeòÝ@œqŽÞ‡y,ñÄ@gà Œ˜Ëu¾ä½+CïŸ ¦{ ù§|b HDˆå_2K|¦ w¥ô×ÔÖÔŒ°ž•‚oLÜÿÌî6=f5ìþƒGü¯ÀæMiªéBO&SM°Äͨ›šû“àFm…Ê6±h 8 Ðd”€J÷ó”€ÕÓk¯Óv@Ô 9q¥+ÎØ¡‘gÍ`G~‚tLÏð„òã2v§A5ÃíÉ‚ž-Ī^ËòÎçäƒtv“tÝøˆÖ 4¦‹6}lQª»Ø‘¨§À5¾»'b¨R…îáÈæò‹Š_ lî€½ÉØµD$`CD¯™[ÑV-@t´Š‡ÇÀg"™ ‰x£Tx‡ˆ*šÏÄ(wÍ~ƒæ¿k°oN"f)€¡óÔƒ`Ä\©QæÆyP$†—òP2±\©âuÖÍù(Œ¯§ìêa–@=,MáÁ t¢’ŒDdÔ€§3Bï 3?F!Y¨J:³/ ¥% 7DÞK@ xåœfrÕ@óùì3eíQ˜O…i\Q{拌´}¸Á…™íQ˜W‘¹hž”Q˜ÖΈÆ”Šé‘ TM¸â÷X³à“ SŽ( D0by¶Ã:kÍĸʆÁÓNCl«GbÎñiaY;ʰŒ£à(LÌ;ÉÍ`äìó¬›pVm¦)m— ÛÎŒHÈ¡rÛ…¦à˜—åyŸT¶GOïÑÓ, RºXŠ¼Ç¤DÑÓ/T$±'ˆ…›<{lŽËŠ YÛãBCk£âB×þLwx‚y^߈1‘àBŽ'ß¾›†V]±‡€NvwO[ŸGo€ìO8>¸a¼^?6|«œkÂØ,mç)Y-І‰ÌÆñûJ6¾—©¼ W° TeÙÀŽñ¥=Ž¥`¢°½½™Ú°c?ÊAM_™íÎÅÜÍT>{K\‹2.ZÙ¶Üëu{›¹‘¼ñÒìô´Ärœ*-3ôÝUÞY1ñsºáõc cXR1ñ—²É1 ÔŸD¥p['T™öžä±@àÀ’d à)" ^ D’À$*ï3W/ŒZÌ(Ù˜OzÔ2ºÎg_DάqƒŒŽ/œþ’Œ1ø*›`†i7D˜U ÊÏ6;?e^£ À½s£L*Ý=š³ ÆÖÜžWѦÎ%SöáÌ«¹d^F†) {‰$Noƒqv‰8¡ðÁéæ‘æ)©Tá¼íÍ`©çLºÎ1à$\ÐbdÁ|„ˆs¤CÇÈdÂÉ€å3O@¯ã3zWhÄ'šNmÍòcaõÇùRMâzNVí‰-Õ‹lAͬɸ”À;T(Ÿé2D½ GãŒc@'R§ˆ±ø0óŨ'âZNÔýL†@eëq%r¦,X c¯Ë î’2i 2}äÑ^—áEÖe¨r=}Â{]†½.Cpž”u*7/Lh¿pž%à"”<æ©Dí„ TaJ™‹ôs\`°DŽÂç5²¸š’ª¬‡}¯Á‘¡­övýŠü}ëÔ(ÚñíÑc–ê+}Y9£*ˆ2haåLÂÔÞShž/…Æ(5£ñåžBó¼)4F™jú„÷š=  ˆ ShŒ*‹IìÛÓTHŒÅ7¨éšëåòÉõVú2Éc;Å›¶Ì_à<8ì:pÚÞ©IÔµBÃÞ9 “kŒVvò´vª}Vª ¤6¾ª Ä$áŽ|8Šèä€Î6xÀµäÂêmNk+¼Ïöƒ…h)ï¡$[B+à¯uBÆ`Ý~–âØ<¢²˜Éû’M—IÁX œeÃjÓ°ËÛ¾‰yMyï4Õ˜gÐf¾×ÎfCÏ í}Ý(ævŽÞ3hŠ1Ï Éý9êOžÁ󷪻Qªû9x¯}Ò±§ëdØyŒŸh<¼L7"¢P`ž 6]m·Dù„DMÂ(iCq/¶µsÁíÛKy–© †“vOÜC5Îz ÚLàÈE¢ÚƒÍ‹Ââòè ó¼ZJB“l:.Âå®Ü*¥½˜øHYbÐbt1”…Ï„ž4Iq¾éÇ´ÿÜ´+`¾D˜Ñ%¨ås,*2`õÖ|ijJ•¾9º³Ð,Te¥¥Ì¦³®XáëJ¦ký´k_öfSTÀ2îh‰ª`²#„?×5lŒˆ˜ŒÆ4ýo ¯ID\hç-¦—¹Ç¥‹%’»$(‹ûK‚²»$(ïÀ¯?\œ¿eîF1·sô—e>vIPÚÁvxIpþVu7Ju?G‚K‚ªïӊÇ™p@¦l&Çý2B(²sÁÆ~±°¶éd”ö‰ôešN1/ºË™†Œ'‰¹AÝ`]ö%Q©‚i]®òŽ7Y•sßîa¢UâK$Mä)CüŸ!€&Õõ¾Hv’ð¥ÐúY(²5wÅöü{†ÑJÕ•¾Î¹û¿Áyþ7êopƒñ7¸Þßàîü Îó7¸Qƒø܈¿Áõþwçopéü 6ëÐ*Õå,¥–1áÅxÕ²Œ‹Á|]50¼lu',)¿I¡$♢’Œm×ìfƒ ÅXÐC!r‚Ȫœl¦¦H #üUÁËʘmIš«LLÔŠÄk/ò® z¡þÆ…j…»¸¦ÿi~fe³Ê%ss1Ó¢ ËZ){ʪ{{ʪ1{Ê*ßž:âÛS—o™»QÌí=eÕ˜=e•oO?ñí©Ë·ª»Qªû9ØS:Òýí|d`¨/© Ñ kŒû”i,ÂØ|Oxß©óÂCêõû“3õƒkƒ:K ³?Á£á'°bv ƒvåˆßNÕjŸÑíq1šÖxBØŒ a3ÂfD›^›;!l€c'a~™ÇЬØqìúCÁã‹lQP‚f’bŸÎw웳Ì­  hP‡ÃMŠ/}Q«@øAÃÃJVK‡ôÈè#žÇ> L[nM²SÉk¢’û7^ mSæÕäzvÊØ)cD-˜èf}CX2˜àX¢ÊÊML3Ø¿GÐfÀó±OÔ·ÅÌ£±¿ã?^5±‚€ç‰kؾ}&·w&Ä+HÑ.²ãB®˜ÜìŒ/ã „¯eN GJTk°Lg<$ %P¥òGÎñ9ýΘW¤„¼±Ý¬ ý2U9], =`Jcdª¨G€ÑÒE8yˆdî&öÛÎЪwûêµy*§&׳eûj§Í×D›Ô 6káØÑ3eì+ÆÎ¦´ü×s.jÿ2ç“cŸS¢“ÛÀ]=q Œ¯9¹[ÿDýsüV‹ë 4ÿ4õ…IeÕx£5sÊÔ9Yù¨;‹ªµ,Æò ›½–#i_ Õ链Tàò±bø¤µÜô©M–pù±¼¶÷h3•M?¶¶íNQ¾6ε×%ep±ªÝú`ƒ-jà®j8esd ßi]8jÑÖoêA³wþ;ëƒ*Z£ÏŒÀçCÀh@ˆì¦;‰æÛähƒÉà=BµV¥·]õÚ9Oð~Zö:v®ðÄ ÄàVq!ÑÎÁwŒzÊÌœZÞ3‚HcG‚3õ-žâÀÇO‡ÿZà˜“ endstream endobj 2726 0 obj 5170 endobj 2730 0 obj [105 /XYZ 38.2500000 224 0] endobj 2731 0 obj [105 /XYZ 38.2500000 224 0] endobj 2729 0 obj << /Type /Page /Parent 2 0 R /Contents 2732 0 R /Resources 2734 0 R /Annots 2735 0 R /MediaBox [0 0 595 842] >> endobj 2734 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2735 0 obj [ ] endobj 2732 0 obj << /Length 2733 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜súÅÐîJr H@A'0b#Šùû™’³Z’_qú›ê&g–âU–fw³ëÙU_u½ûãç¿ïþùÛîÝÓçÿì¾v?Ÿ>?˜}U˜öŸÝñÏßÿÂÕûîﻪ.v_yø¶ûöðéáÓáßßÚ>?ýùð·ÿíÜîO‡ÿý¼ûëß¿ü±ûŽÿÁ/•­?ÿ}úÙTöð7sþyüý¿þò»Ý¯ÇûéºÅ¼þÿ?Xc›â´Œ™©¿=ôŸiO~ûúëûvâfqÆ7Öìlðag›àvÿýÇÃO‡ úá; ÖVe¨Ì5Uî8ShªuÙGNtú£3¼M0xS–é?­\}W¬/­<º"qƒ±u»AÞý-z>ÁþïlºÁO+WߕޏÂèû:xë+W„#¡D.êÚþ^ùîŸ+7­òí¦•¡LA“~ø4)ÒrÓqåê»Ò®(Í…©:‰p®N±ÿU:+\“ޏíÊÕw¥#®0º&q‹³º+Æÿú-*jÓ¢<üH6øiåê»Ò®IܪjzÉ-lÑyøû_“PçŸV®¾+=qG£Š/¥ý 8|^|üòðî£ Gç¾Ü}ùé°¸vÎÓ/‡M)v?ýZv_~ÜýÞþ°ûòóC³/]Ñ/1ÅW¡'¦O\ü<¦€+ Fóð¿Çy8Zû¥¾Ø$9…ƒïg}ÖšµSÓNy°ÀÝ”ýæTeqÚ…—m+OOê}ݘÁ“§Ó“°?ø:Åë mŸX»/BY¾¼óáô¤Ø{WÛW£Y‡æ±^u-»ùþÁwO­‰_±í ̾¬ìë´£Ùboÿzïáhí;®t~<|®Í·k«/ ²5ñŸn»O÷=•/Ø| W l>$˜.k2,c ; ,Ã0 1«á 0Ôrð Ï ® Î>dÓßÁ¶¯Ð=Ã'ÐÖa»ß1pÝ^Åùð‡­úb žýž<®Ì,…ýcÆõÔM¿ ïã}µNn§¨Šý;øÝ˜1ÿ2¼à—Þ—Fy¥÷ YSÏ󼚿zÁzB9¯eß Ïø=ÂI ¯í RÎ#HqJÄVÐÀµ WU‚Êbö¤‹ŸVSsÁ/XG óàÑ0W`]Œ¿”&f4]k û¥˜¦BlË!é‚FÁq¬7°…ß<Ô9]S‡yÙ$¾›á>a¯à °Í $]×:b^Îèó;ã祯ë¤;ÓŠ®€²›øBfryFžá{zû€„Ç׿àÉ+c> 8ç6I¿JÒæ1ø{FØc¡¢m›ÞXÞÀÖ~yY‰ ç¨vÆ(«úÈæògæ5G†9ÜCÍCŒ&Ä ˆ=ÀÒ-Pë ‚¦Ô¾áïat¦qÊ´ÖpLt¯ ûØÓÃ4elöqÌŸ,æNÉytg3±;òˆ M½³hVHF _œJ8O¤þ$‹À pK<…€?Йöú’Ï S·‰Jñx»àhxœìq¸ùr‚yƒ…îÂЖåÉ2æU?üœ0}˜yU¡AÊtbD‹6޼׺êÎ3«¥S hÌŒ˜à˜x#Ç|Ùbt#ݘoGˆ±í†NÀVÇ Qf yð.a%ÿ~°XÁ@´*CóçɉE ¦GÉà(ó„:k3g9½åpÜ韷˜µ1ô!ê/ºª‘<\îŠÌ\Ži"DFð^ûû†²—8¯ƒ#ã™j£Vý„ÀÏxíÂqW"ò«Œä"i÷–ÁJ’ùΣ½Cx=ë’> AÆJPï¼,ØtÍIDW±öª-ñÚpä—°ÝÁ%——ç£*ŽéOV`gT½¤À ¸ 9c|.“1ßêõ“ͧÅBÂ"2šGW¿0Ü·ù+¢ëÓbNÄS|¶Ç’Å੉ìÿlíhÍU˜)ä0fjù.¬œg¥îMºéXÉZëzw˜“˜ÑðÝ ÔÚà¾a¿ä Ù™ÛÔØËãµÌÎlK­ê{ÌæêõÑ#¤²él» ÎÆq Jco:v{’QË&,Pqã{ÔËU5«°×6«±“{zÔ½m™V ìAÆcÑäÎöëÚ3 U®šFS­ocê›7›žÑ¦3w`>ÀY%ÌU+JÛã'‚j&‰âr"›ŒçñÐǸӄ¸µº{€ “›´ªêª…ìx®ód.¯ì¼vo¸[]k²!r;Nrg\Ö]yCÙFfî{ šé¢òy¤6䯸¼/‡‘Œ¬¶¿ì›í7Ü-kªU…+±ãuy=WdYimÎuí.ÇeDRÖç®”W ˆò¬ôÜ]ñ ¤Qž•–fÝÓ:{$Aõƒq-˜›spðùz´oÌyÖ ;²aGÔ=ƒ ;b²úÌmfwdÃŽlØ–>v¤“3_ß©œÝæýk‰gRàÜÔB*¬YžäÓ÷Žêr¨Ú}göKóè´¢š§I¦|–ÀåD¥ØÆI"Ú kH¬U±ÆÇ;Jô¿õª“Ÿ¡„[Ö˜|ƒFÀ{m(a]±=²k7é-§R•ÙpT\LõÉÒÊŒÿ•W+çñJª>ßÃÜ™ËxXsÝ&~Íhf峄.µñÚOÅ|±¯ËÜ—Õ˜G;4 w‡'ïµTþôÂØ³hU§õ E.UG¡×^èåÃô3‚ïŒ{RàÏ€mpOŠN$¦žÀdZCP½h"zzÔpSˆÏÀOb¨[:Áþ` ƒP{Ž{—ÁF{Fßã{Uì»—.x"̃{ ­O„}òÐ%2jÛ1ß3A„÷ñ²!t*ñ9Ö XbÙˆè7ÇÞ -TaÜÀD;«E0@ˆGAì#”#îaˆu/\¬`‹ }£ÜãéCµ”VašA œ°¹ù+R—ôÈDXÕT%ÖDT'¼¡d3 2±ãµæ–‚H`É´úÃDfFÃÍîRtM{ºkÊb`”„ƒ5>¢2ðçäíwí¼ƒ£ŒŠj;‘X‹!îŒã&̃5£°#¼,}Þ”†`€A™—¶¦ÁnCR…5=˜~kÜ.jgÕË<ÖäÀI¸WÍ]À±ÁÍr“´RexœèU› ar]ŽÅi™ÇŒ.íìz„•b=¦š&Õ-#fÖ&ÞNÃÎ;K1fnº8µ‚|å‘…­Ï³>ç›ÕÙs™vÞsZ—nÖM\aÝrr¶óÕ¼ ê^H˜ žª\ÀB@&׬¿y^³Í)U1KGá°~a®P`®Ï ᬙc—÷8„R\µÓï5ÖxT‹R׬7„ò6\ă)‡Ÿ¨é§Z†>yßOÚšJÑö5ŠYv©Èd—ñ›ö©¡SQ¿¶ƒOR{‹á½n(•:÷±Šðôè¤Ë—“ @~;0 WÌÃϲœ—'¹©Ü¦JÇÌf_VöµÂkeß{Óø×»!N’´®tÁ ^Â_J¤‹•@JS¢ ¿¨ô‚&ˆ%Yœô#ÒÄרfò(ÈÜÎçM&扳ê„I扰€„FÕÝ¿U³ãÝ0[¬@4‚ªáŽÇ ,tW¹ZÐÕ:Ü‹O^PtR”“ZÔÔxë\u˜" \–7åÄhÈš9*`eq› ë\%"#…IèÎ_ÆþÞ\€—O_‘èCQ\jµŒãPØÎãàf¼ýLM$Ö3xm£8c«æ>#¥ÍîP×/¼‘ r¿˜J‹˜X8öã¸^^Ð=¶2+Èþ÷ÎÙp‘΃HSÚ _ (ÂTº”ÓD8TÐÃŒQžQ—óQ†ÍÔÒ¥®,<™(|rÃVv5®#ò²pÁžaƒýáLEl‚sµxÝr6G|ÖW%NÝ“@x"¹BËïê²5SH†‰Ìˆ¶®³Q­ÅT^©Š¶UC.ÏaSê8wØ”ó§mØ”5]â£\#»ø)RX›j¹)“ú¡RZ‹c6¨h¿c*ð1¨¨P•F&|,C˜=ˆ®ÅNyþ.ëRïÊl¦ìs\I‹ÓÍÙQ¼ÁÜe£ëeku¨12Vª)l]Ó§Z Â-Áb”¯»Áþ>”'|1$ÄËCìz½MnlžÓž—ñ‰Àëê"ªT1W0bBkÙÔ~xbÜdÕÈ3u£“nª™1Ï ë˱/ªÇûfŠ\ = ®x-´åÐtGâ<ñ¤cbïÀE:Qïtí´§Þià<¶?=Œ&áìÊ Î"½?ækëZkN­ú >£9‡ÖÖùgåÞ[7i¦VýG3ðIúTYY eß§¶ËCFD±VЏ›W¹Â$WÖž¿q´Êñó䂲QˆX&ÄL\S“ «â‡ ¡B™Òm+ß·šÉñ%ô£AFyŸL¨Ø\G80yE83e}TïRíeˆ»P™$»@ß·ÀTÃPfŒ‘¥\á8F=Ü+‹pTâòØCL+¦`.Û~yƒÆ¡š`¬9.wùá›)3U)’ˆMja?æ32Ô897<íiMp°gË2™ü¿Œ²µ#®ŒÈc\`¾©kScT$-"¨!(–Çx(ÚñOMzÑÙ¹YÝß:œKÝb ´”æË q£A±ÄM·R’hà!xLLü‡qЗO(®8t­ð÷í ùµ5U>ÄxµËß%¶xhd5g™”%I}@õl|7-rëZ„ºÒébz¯8Ð,bd.‚ÈU$­[P¥êÈm½í–Uûö`ކzq{»¥".ò˜2µâSöE·j’$cÖµT˜BBi4hŸ}¦Æ^Co].Õ•Tð;^¿BAöyPD ˜q<4¤ÑõxÿcŠFB‡m2Ȉa´Å1Ê[¤FÚ·ðÜ­­;5]éÈë¦G×½âÅç‘[h7°µ´;Áyr¶´/Š ZÚã¶ÎDz¡,\ÓU¸×·Ñ$šÅ2­­»µå¡påç)L4/nG…ó`ÚS Y!n»Ý7;ß,ÞÑ<Û¸yŽ…;¢Û(X{¬+pkS¬+0…a+P˜+ˆÖÖLÛøåã=,^±×BÃh<~‚[µ2­Ô ­ÚAR²è€ÒÚÙõÜWÄ?aÞ œDð¿ µ¸­­ªÿÃ4¤üü¥ª-„>Àº“&A?žk– ÷{izéÔ¤VpÁ¬/H;NÙdÂì8±6lásµ¦¶ø ¡“nÓö¯Ùû^¾…¼^ƒð@eÎÁ…ÅêË2m(Ý hœ î {yÚ⯨s.üÛMÅZ‰¤.Ë_ËíŒoO!%½;' 2Í4pkDò3¨|ÝÑ–ÇøGdÄÓö^¦šhÜ»°¡àðÅ6|n|Ê ‘}90@wНÏpXõçr°H.sj]¼ÝømÞ›ÍÑH|íéÈQÓ@·RMT•·®¯¥{m¬nÑq6Øî½:4w\ºB&2Üû•ŒÀŸãOŠÀ?3rŸ©˜²iºWÖ@Œ®õ6):ò0q>ôN³ö)»bú‘fbîGfºÂF_Ò¶_¬JèŠ œ+=|!KÊãx3äE•&åQstoGH&ÄEy LH®½^ªE;£”c’Œæ!´¢JÃe™ÐMf=U„?w#o†à_Ñ\Ãq7y/-SPs£Ø*ϱÖW‚ëº0k¾gËYΊ³ÃÇÏž‚ÞN=Òž÷Tþì¾PäÏOsÿÁŠ£žb^°Æ#;wÆzX¨ZÛ/ª&TkûEnïÚªàÑž–ã'fÛíËQÛE Ï3šÇÏ¥7¦Öö±ûRT¦‹=Ðð²$3ã‚”ãì˜ßtƒ ÏÄgX<|§³’6êÓ«¶eîøwórƒÄSg«Ç{‡}Șm€Ìî{J´o|¿‚ž°<#Vëʸ¢?ÁßÓ)ª)ºBŠ{ÈÁqŸQçà;ÝÉâ*þ©Œßwºg‚‘¦H‚}úâ{-<§wŸþ® yN endstream endobj 2733 0 obj 4775 endobj 2737 0 obj [106 /XYZ 37.5000000 692 0] endobj 2738 0 obj [106 /XYZ 37.5000000 248.750000 0] endobj 2739 0 obj [106 /XYZ 38.2500000 708.500000 0] endobj 2740 0 obj [106 /XYZ 38.2500000 708.500000 0] endobj 2741 0 obj [106 /XYZ 37.5000000 692 0] endobj 2742 0 obj [106 /XYZ 37.5000000 248.750000 0] endobj 2743 0 obj << /Type /Annot /Subtype /Link /Rect [273 227 332.250000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_smart_pointers >> endobj 2736 0 obj << /Type /Page /Parent 2 0 R /Contents 2744 0 R /Resources 2746 0 R /Annots 2747 0 R /MediaBox [0 0 595 842] >> endobj 2746 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2747 0 obj [ 2743 0 R ] endobj 2744 0 obj << /Length 2745 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯès·ERO 0û C€Å.CC`Ç ÛÈ&‡üýt·¨îJ%~]¤Ôzaïz´ÉzW±ßÿñËßÿüïáû÷_þ}øÁþþþËSqlª¢ÿçpþõÝËèöhÿ|hÚêðïOßßž>?}>ý÷ÛSÿ—÷>ýé}øÓéߟýÛé‡?Ú¿tþ ¿>5ª9ýþËå÷®Q§?×ßÏ?ÿ×Ó_~wøíüÅa9»™×ÿÿ*t§ëó6f–þö4S]~ý÷‡ßž¾ï¶Š.ª¶ÒUšò ºRþó§ŸN Ÿ/Ž]©TS—MqÏB>¯Ô4ÝAéî´ª®F ]~É|^ɼ. íãýÎÅ¡¢L­ü_Dn­PÕDÿõë1p«Ûˆ„sÙ¹4P,jñÇ%1kNbáž¦ŽŸë×c¿< äh¿ì\(fáÇ%1{ùH4ž½~=ð«ÓÿÄ#› p#ñ,ü¸$f«ÎŠ´Rµ1 ßÅ“˜M¡"¢ö²sq¨ ¸Å_?¶¥Q¦ÑUyFôÉUÛêÓŸcÿ¹hª$*#àäöù×uÁüŒ©Ò‹‚ºòíÐ2–vÀÖÂŒ¼e Š9âTá¯Á“zžÀ“âw „#Ÿ ¬%ð;BýŽiËNÏ“.¡ì<ùw[VivÚʯÚ%Ëâ¼d]˜ê5JTq¬Õ6ÕˆøÚcÛøÜ€Ó“XëòCy,M}ïÚ,O¬Ìžø¼¥Óêht«^?©Ñ;ºßRǪ¬ók…€bŽlêêõ×TE¬£Ñ;êÙ±q€ß5p'E¿{3€o Ì=mˆqpKVÑ=&Q|†ÜLA¬¿¦0 c)¼ÎrºÓ-Ü< ƒÊñƒ1è91Ä UAÇð°)üš‡V1›0#–x³²ÇÀrÒýZDÝXå(Çñ{À€yx‰¦Æ‚€cvgd†{bŠY<íAuSXÕuÔæô}”{¯ÁGJwâ‰ELuÔ®Ú·¤,õN‡ÞQzNJóíL3¡©“öÐÍwŸà;Ñ:UÞÑî­ßu}4J;d‹÷F@ÇÒ¯ªÚ» :x×xoÖÁœ‚Ž'-Â!êÁ©˜PmPÕå…ý”ª_3™Çæ…*9H“ȾãÙ[ßRÏ >úØ‹À æ½E¯¾x$côN½ó­SAu¥5Ü›‚ªï C§"`€õˆ™±ð×â{Ûªˆ;–˜(-Ø•à¾À\c¼>Ç6f%ü5l~bS» ŒaL” dÂ…Qï;mJq÷èŒ8xb„›ÊŽÇ£`v°eW3‘_!0YN€ˆ1* —¶Äª– ºÍ‘YLg·Ð®n" åa.QŒx¢ËãS!^/¡!<{d.LXe$±¡é@1 £¸ùϹ{Ìšá'Å7©ˆOºÜ@ÈX—?LØu9žÌ5ž˜Kø5|ñÀ´…ÃÖi툪¶ëWÕ.É Œ0d4Q/@'nõÌTaìK ž(ìÂÃ'Œ/‰ÉÔsCÇÄÇá;W[áw9÷$3(ÕVÓd¾bb¤gLš ‘´†Ïƒ“¯¨Ô´èbLÝ9fì¤â9\®3é³ü‘ î×Ô³›ñH£3¾º¨æÅ6®Í›Â܈ŽI²ºZŒˆ•¤fY;;Ü€Ðd*\*Ñd±-ÆÆt.…‰&" ÇWe½‹´eQ8{IR{ñF èÆ= v›µubkíò0¼HÌ·4^ZOtwA¥µbÒ&ÌÇW2 wXGÎ¥o\›Ûà \ØŸ0Å-ÙôYÕôéL¹Øô‰âtóbB¬m—{®ûˆZËe ÎD´Š9=!&ÎäûªFVÝ2Á =•È­o]œ¯ïÖgÍ"ÆÒºÓ~˹ĺÈò¶±éô±ÛCo|Ãêãç²¶#5ÍʶtÖÜÉåÇÝ%L¥ÈÉuL2”Ç®#®“e $©;‘Q%>  ãàã\Ä)ÜêþE/hc†[9àÆž¶>pO , ±PÇ-U”U^j•7E!*‘KgôÐc‚ÊþcŠ»q¤–¸S±ý&¦ÞÙÉ@g¯njØ€³—ïpwänšÚ•7¹ì &ëU‘äæ!èÈŠ©Mš‘Ù ‰º³ê"æÆ‘j<Ãô,JÕ!‚©XÞ!‚‰ñî.%óëæ‚˜­môË`Ëook1;›£>2¤¢®Ù9kæ fP3e Ë¸m‚¤ÂL8±„›1ᬠô”…;¨à“ wZ…-qè®Sâ½aXã½Ðј Ç® ˆLטFñ:Ì0ÏáĈ¤‘5Ý0u!Õ‹l‚mÉ[3¨^–ݰ™œ'õFò¤n8ÏY»!Tb»•vhâ­äVÙZÀ-1CÖ£¾½­ʨTçªË½·<ÈYS9kjÙ1¶‘5UÃp·ìàeeöðÊlM§°ªÚ¯ÍÆZèbI¸V3Ve;Åž²ç’]gv„D|oA!åu8â€í"†šq”" ]¡,âÞ|ØøMF²…‘³+¶º-åèõ{MzÚ€dÞȦ=%ò¡<dZŠöÀ÷À€èÂÏ´G“ͦ–-UO6]ÉÍÊ*v­†3î$9øý3Èvl¡Æ–·-Ç/5¤_¦ÕùhK©FNŠ¶â¡¤Öžî"TQ6µybX9z┌ӄì ä˜ 0U;ÛËgî÷0WS<ÅgƒGæCݺ|XƧݹ‹J6NŠÚ£XvÎ ßaÍfØ&£le³SB¢‹©êSö6G®3±çèŒÇ‹kgp%.1 ²ö•£DΤ—$áÄ´ŽÊ–œï[r îÁjãjŒÒ–¶!ím7© ¤¡qù®²-¹oЋoÓU¥»æîãG}Op¯ ª'hfúœãu–ϥơ]'r®é—_æ1Pòt¹–MÃàz^n¤=FDùÒÚäÕú‰ÉÛÂÄÏÄd“ÓÈx QüµlÏ”)rµ:ûy‹à"© 'Âáä9ªÞ¾£q6¥1 °ñ;wž4®Ô<†sdN‚Ü„ó·nänjŠynÊxô\ÇxjÚnÂrC”‘OÖr—HóÔ× . YŽ!’ª;>Kš¾ºyíCd]¹ª®,pGÄ,c}ºÃï>I©_›ºº‡^p_ H—ÞÄZ{;Ón¹‘R.·å<ä±WÇhD÷-•-"Võ:“öZ\Çàdo|‚íÝõ©Ï0΄ÜÙºeÔUÕì~ÞŽe¤qäRÅÛ²™ºæÚm9¥ÍÔÍ·“Û¿Ú¨)ʫوkbq“î&Z+Û9â«rMí"2gä,›¶ŽÙ–·/zA{žÔU¦01 W$SÝ([³&Ú¡ÀóµQyõJLË¥ô…¹vÄÝ êÁñ´(Z½NS¸˜i­žª•©H}mûR¨ðs:´£ÂW-ä”`ßÞÖlòÝêr¹ÒÝI“o¦±–^®´œíß³ƒ“Ö®dJqûÅQI®Ÿc,´€&Ÿ‰è˜Ê6ðcZãTvŠp¬l•&5²Ut8½çkË[¤0ˆ{ÌÙ· ˆãô«ŽÒ‚ƒl‚P^}O™möµ·ì€¤ïz1+¬âúDº¨]¢~äð\Dî×­q!ÅôfˆÑ«%r«"í@ÊbXÌ=7£òøÝ&¡!n"áûK°S߉jÝ.:ºqcÙpÛ×{0™  #ÈÊšè^ÜÉ´u”ffDݬÇtõ“ÍnX9ѯU®q•ï%ĸ°ò‰Û»&‰´ŽÆÂUTìʆ'då e€ˆN)βûÚº7¾pŽ×iÇ®–Í>IúøVª( „?Á„„}ºå—ÑÌQj5“ÿ7Ï7Ùüï¹ìÃø5uí—Ù5ÍŒ´Î™}[¼¡ˆ¯ªuѹ´> O1Ô)š%ýØa¿˜P#7`=‰a ¡z<•¥Ÿ6g§=¢4 bÊT÷îÒcÒ1E¯|þóÔ"ò̤ÃQÅË«‡eòÐ^xÌpUѺJR4ÕoµtN€¢Á $ÜÈPe94€¾™@-c”17ÌDÊÌtQlðxÈŒ`\œø-ìÞ¦2´qfþ†õÈveùV’NbÆŽUç*[ªüSVª’HYy5²üÿLÔZd|GOu—DN¤=`‚ ámØKŸãdþlxÎsªÌjZ9“× a½Ó ø­Œ=ñvꟂ¹2f£@Ûáê&ǨP 7–Š ‰Ò=ŒÂÜ'bc}ÑFªc£¤˜Ø“§B°ª'Ý_TQ3QƒF dcRž]»¹Ï $Òÿ© ¢Ëô èÉÀ"àžPd=þ‚8fUhY¹ê2U•|ÇsÅ*Rx¶–“ºeÅmÜøŽG(.¿'c¢mL®¾G±fsÅ_ŠµÞšíêߨÖüc6* ›=g á9økÃOó &¾ÄI÷†SÏÜB8ßÜÀóh¸N‰'à‰1é&€4ªëfiyÓ™!¶„ùŒ™_†ÏƒéW–@x8×¶äylÉfJ3sŽSÊ­ÚÙ3lY`¹œe@–ìÁ Ïd|`)dšYøêgxnF>ažÁxă %y&áanÂë`ÜcJ•ë)„i O]ݬˆY‰%¤DÙw˜½¥Ò®)äF‹*,úRHÝ]…†ŸãÈ:¼ÅKm}Ç*³©w:ø xšÁÙÝbxâf½Ð¨'+ð²KSï|DëT0Hu5¸Æ{ëw=u†÷†¡3×njjðß/(^»à`Ì{°¡ëÙÆw«°¦¨ÿ“Üg‹ÌÕêH–8ì^ÛP)¢w÷%¦œ7Žoš™ܽÏib®‘ÇÙ­ý”eSEDÇܾ<,‘f³Â]/ì5\q¬õšD{9¤ªcÑ™×è†_ë]¥‡G7™RÛ£÷$E2ù˜ù™N‹ƒo¡;s¥]-Ð4’©©eÝ ÷N 4S@"›â¾lXÍK*P¯¨ ÿÉ"òQËɧ®ôùäÒ8RO9¼ß#O‘wÆÁíñüþ9ÜV¼üÁ/O_"aÿ¼Ðkì?tòñ<¨ÈþúÔª¨± Ž#ÁÏ[x„MUfßh·¾‘Çêg#‘Œ"ÙYAH3à ™{Ä:Ts4F Ï ŠY#ªuëèŠRC“7 š)SJ4*Û£Œ=š ,[Õ{°…Š*„»ÂV²Û@÷»í÷‹ ûœ©°$j¨vÛ–c›™8cIå€MãX1#ŒSÕVÃu(¾$fn 7„]ÞN¸-CÍ©4îò0'h.2ÃJ¤IöÎwáù5é»%´eë(Ë®/L™9f¶­Ø&LÂYÐICT¯l›7 è/ÛÄ`­;‹ÉY®ùdËYER#Öõ<ÙîJ5µ#Ü Ì½ÍÓ‘$ÛíÈK±¨‹m*Â8âEBÄn`cìE‚HcSÇ&Ù…ön`­q—yáÞoål‚8¦ hvÊ•Ÿç#½É£…ú|ñϽ~–¾Û–¾-¨¸M ŸH­ÏÆ`:ÍÔšÖÑLƒpH{y»·Çl¤ÊH}OÍCÜÖ†L-GhIL«q´©Yo‰.·œ†G±>qI‘Ì›wbé*ƈÑÞ>b¥¸2ºr]®èåé§E;wÑaª ÇoÐÚ¦Œ+ì1ÑFŸ;«LݸGà…k‚ˆdWíTšng"[¢Þ¯£˜‡ÉSW,:ëXØå%`-Û@dV,• !qUɯ)â­cê…Ê8ŠAÖÜÉÙ|a>ã=Ê&…a@.÷RCJ÷ð•uÜ2 T2Jx|ºÄˆˆõV/!§µcˆoÒ5çã¤Ðj*¸§XÓÅõjÙ8yJQT—Ç%{ÓÅ«Rú‹šª"d­!5‘CÙ2زeùº)~¬¯T¤ãG½~Uîɪ… Çx¼DÎÇQcJljuRNs:í7[à ö†ûš—Äd¼5iŠ„ÁƒÎy»–[À3m3Ï3L'~ѯ1sÎðyÌ»tð­Šëý3µò¦+j> îÿŸ%Â$‚gš1káí@')§ëjò™Ï6MIÌŒ¢-O»ÃúÈRHŒv§®c>$”ªey‡TõL¤š{’ætµy Ó)h'œgVµzÞzÃþLœ©¾9!ŠrúTôzªdÅÇû(…X¿r9îµÓŽ)•¾ÞÀ{Q2»(Ê-¦£ŠÃ‰¹”x`nà¢_TEçh$ªNGTͬ/–W+’’iý/ÀôÏÝ-'jŠ&Ûw7Yá-“2‰/·˜VX¢swdxQíá0}žWk·.R˜Au‚^ÍÀÚd¦wg[TÝ”£-©šPŽ×˜‚±‡[ð$å rÝ]WÍñØ ÄÔ<1¿a` ×Ñ:xoN ™F·@£žl üN|/áI5Ž&˜i>/;›““4GI›¾+!8’pãØø<˜þñ]„Gn`~fÎCd<`P–²ºm#ÒA·³gزt(av`–Y:D°| §Dž*†ÁžäÓÌMcÓ×°¸º3d±+ ˆäTjIÈÃ~/¶åö Jd*›ã–ÿÅŽÈ3mߘø]¢H|ªyLq³=óF#j#‘ŽÊ­/‚Øp§­/¨¡œVN$RÙ«êXtæ5,pãޮUúèÆìe‹:eûfàPmÕçIm!.©+,F<Š 4ãû®/ÿ§Î“´%*°y·i»0Þ”/c|‡[²–aäÍ2Ó`™$1,Å“C•³ÙDs¯=;½~—án¢¯ e0"/Õ`oƺ`¼t¬Ò¶ï¹Èåӯ÷“öÊçÏsao'¾œ(®PçôPGbmà)˜ö@3A ½ ¬‡îÁ#¸?±uúh÷ÂÐPÝ? uÌœ(šÚÛ'{R„;ÌÔ¥+7±v©Ç´¤ŽU¶Ë&Ž¡ð×à;–©UÐÑ_þ°wþóiÇÃÎß[Ñ2†–ø0ÙxH»0Ñ¿ñrZÇ`6ø€HÍj–rð8—<Áç±¢ ¯ãR°T,ê¡9øŽQ÷ÓOS˜£•=„4…ìÎ<¿”Âsøðùéÿÿ‹…× endstream endobj 2745 0 obj 5920 endobj 2749 0 obj [107 /XYZ 37.5000000 504.500000 0] endobj 2750 0 obj [107 /XYZ 37.5000000 412.250000 0] endobj 2751 0 obj [107 /XYZ 37.5000000 412.250000 0] endobj 2752 0 obj [107 /XYZ 37.5000000 185.750000 0] endobj 2753 0 obj [107 /XYZ 37.5000000 504.500000 0] endobj 2754 0 obj [107 /XYZ 38.2500000 156.500000 0] endobj 2755 0 obj [107 /XYZ 38.2500000 156.500000 0] endobj 2756 0 obj [107 /XYZ 37.5000000 185.750000 0] endobj 2757 0 obj << /Type /Annot /Subtype /Link /Rect [126.750000 428 191.250000 434.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn25 >> endobj 2758 0 obj << /Type /Annot /Subtype /Link /Rect [131.250000 420.500000 186 427.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typecheck_pointer >> endobj 2748 0 obj << /Type /Page /Parent 2 0 R /Contents 2759 0 R /Resources 2761 0 R /Annots 2762 0 R /MediaBox [0 0 595 842] >> endobj 2761 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 2762 0 obj [ 2757 0 R 2758 0 R ] endobj 2759 0 obj << /Length 2760 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWè`eöƒ/ àñxä``9,r¼Ù‹õ"“=äï‡IICò+ŠŸª›”Ä5ví6»««ªëÝÕþüåÛý¾ýðé˶ߚß?}Ù$»ÄäepòäêXi‰Û›ýuÊ,”ú'À¿{>|úºùðRÙöëÏdõ‚‡ß¾~ßøêöRn¿þ´ýcýÓöë/›bW”IfÓ|õˆùXœ~€ÿª9Œ·s¶0ÕÐiÄÁoŠÃˆÛ¥>+òó ’¯gó;ïjýôÍ'8âш-Ñ:‚fÏ_+2‡¡PÅWÙî-›Ž]ïp6[ïÚ˜ö£Ó7)œ-‡°Áu*2ë`ÞK [üg-Êo@ü<­iŸÙfU÷rXµÜÀ|‡‘4±ð›®cŸà:9ÉàˆG#þ#qp¶Â&Œ@ì4§~êOÄlŽ|†#p£˜ j7¶B€y´¡vœÓTéæÑÓ´Ò1qp6ŸDÂq6”(®ŒÇc¥)ÇyŒØX.3³1rïÇ=Eį+F!F n¹7-êðéž]‹66Ü*}§jQŒ ±&â©Mó+N-Åc¿ø ç[„x?˜&˜ö—YùeÉÚZ\1µIž]£Mˆ‡q…¹ó Ä/æröPkáý¤P–¯ü/ÑÛØØŽ=3C#ÏOS™^s2ž`¿aNS-ùœ¸fäò*“–®“‹$µWœÀU'K:yÉÜw‡±Hrs _.B#šcþéq4¢Ãq"ìƒÑ !Ú ª÷–|î—¡uŒ½*®¸jAëÌšîQ·MLm!º%kã/BvA §r-Lam«¬q™.}iSÚV¾œÀ„F9ž*kpÝ^Øá\BÔ=D®¬Â¬.ªBz(îý VåJwa¡XŠá2‚p¸0³ƒ.6f§ªÅALQ†¢)ÆÞ† î4báRas?j,Zlâbê-!† œ %JY°an±i„ ÆØÔM’ªð 4·›mØÜÅ|À`§ª1FUË.˜"6jlòc÷u ´ .™€7,qá!(wwxÃç‡àxjìf3É &8€u£® Á'—=Ò_Ø›ƒ|M1¶ Áo‚LdxG£_c½€Ïcm`ذÍ7V’Çr.Ý(¤«å\}‚-³Õr^€åì±Uœ@ˆ7Fוë·i‡Ïz_mÝÕÖ]mÝÕÖ]mÝG³uGÒmη÷&ãh’]–›÷é¶¹C8-Ÿ³f½ºÐ‡uLÑcœõg„F¶È:xg˜Uȹ.oâÔæÀËSéLª†ç1Ý.Ê’érY3è“Çk€°ä«›k 6&öñfáíÚáØp¹àš×”0ºˆ …÷ÉÊåWqùÊc£<–^Ðæcå1©ðzöÈôB8©l˸뉵Ã6©À—ŒµÊð?Æk®(§í,‘žºe|DþiÀœVЪúyß”ð虺VäYÚÁîCY3K¶³‡xb_P }ó­“Âjyk!l5ÔC%Â6Œ¼ÓB÷“¨‰7ÈÈIÖáäFèßnûŠ@bž8 éøâ~8›ÃçïR¾a“ xîÔÀ¾©˜l¢Å-# ô¨ qB@zÕùž¨Þñº–k>º`DX§­Ä·lˆn¸LRùEwƒBäßøÀb&qÓ»:Ct îIaœ7¨¨‹L^H7—D@-D“1Þ0ù1GâÙžº‡‘8 L#dñ™o R0;7Êñº[…î±a6 î±XòXåbA‹ã˜Ð ¨ Ó4íèBFúê2AÊ3"‹áÙnfFÊä "Î&$+3,£*RûÂiv"÷@„NÏpa’oC }„¸z*lýîŸvÀ,йK÷Ð3d‰$q…çpB,aÙ“ùs¾¸‘deWû.Ù`¾¼ä%°O'¸V ¿^,U–£j†Sí"1bêdéqº%¬L`ÃTNTQe28‰@ôõZ‰RQÔZ’!aÔBa.~½Äp?©E¤Y³ìøÐÙɧ•ÿ%ú¤/ï‰ÿG2+¹õï™ß¤»ýCšï|Æz'L! A„Gß“qâçŠÃ6z|(á ÖHœ34v׳ çzMØïÌE¹¼?¼06V;¹+n*a¡r¥²™×0¶«‰Ö¤Þ”“ÊÐ)a7&E8AÅ ¶2á& ë-ÔH„Ó{5Vg¨ð]Fw?ü£,VÕÆ·*9%ݼ–À<ç2ñ™½ºšGrMC˜žÛ†9!…²0VÌ:Vö®Ã”™Fã`õ‰3La‡ª{Ãà€ÉsÇòn—|å»—ÔbrSÜ(Õ&,7Ð!Væ[¡;ŸMI¢2mÛ[cë‹Î·‡/@(|‡uª< ïóÆè]”i¦:Öêcšæ@ˆsL›w˜®r‰Ì„f(™í’w/š=´É”?M [ë’wâC€GÑRó­éóížýÜ—îößWZË¥ç?øuóE>§K;G"¼¤ô®ì¬©’¦è—MÐôL0fE‹@½¬©clÀ —¥¨È Ñ(Šê׉@5Tšà ܤ¡ÔD§.±™ð…²ë®Ò8ì&S×sçµÂ†/«U»–ÑBL¨ÕaÚ㎅"ªÌ2͇մÒÓWQˆZæ]½/U7îKtÖOT“ø¬k-ù&J¬XñüÔM0þˆ…©ä2sçR5%Ž! nýÄ +‡<ŶèÊf ½ ÷,t K‰9ç£eXb¿™¿bÉ:7²u«Ö|~ü|þ„ª›^Ä cX5ÓsmùXôxlî/>º:Dœà½O˜äEA¶ê\d&:x ëïE7lVt<ñØ´Éùf lÚžZ¸·šŠ‡ïå1©dƒ)EfBCø›þÖ²FšÉÑ4½É¦„Â7kS‡jJxÆÉ˜"¸‘¡€wØÞo´¬{l&Ö…²â~ƒ‘£y/"H7Bmwk çA޼èà}‰ÏÈh˜JBÎŒ¨Ñ½”úþ“jÄR(PS K+7™ß¬',rݰ®O¡ž$ϻ‰qè.íS xˆë¨ ¸Ü:!l¼äNULÉL¤nj±ZÎ2jEY†«†º'LÎ °sà Ó5ùS·XÁ¯ž©¾i/îc°…,ÛHÒa³9èšåª #iÃE—kÜ}ãP•úÔË‹åt‹&¢Èpcš ÛI(÷G"®ãÎ{j-â2ŽÔ\â\-H:F”/¿­I„ ç1 ÈØ´T$Ä…VeR©^œÕ¹QɤÚ+bÂu¤‡ñc6›-Mç´I%Ý÷ö*ôhýñ4ω(^· 1_7.Óô|Éi´ÔÌÔ¾+LƒY¦¥²À}c…󬋃ÙÍ^Anißm6’ÂÉ„µ‘”Û½5’:çd·*6bbZ»¨'„ V#©ÒŸtq¤Dö½=È8wWæi÷m{·Ÿ1–˜ç1˜ÛÏÛXÛfŠl‹!zÌË<4I _ç ß}ps´.[·ÿÜ Òf©É:êlÓP"*¤žÍb^‰cºMxV9d ‹ˆŽÑ[?|YsxÑñÞL²«íµ3$Ñæô¦; —Lú¦ñþ)Ñ7ÍaúæùÈœ:ÆÆ¶ÎvÎØížÐ7W5°NãUMZ§±Ôó>çÐNK¸Ó¦…mֲܨÁذa`Œ6Bjh§ A¹—‘†÷}R›½GÔ@ -ó¾ õŽF”v`¾»ïùo9À(«ùÃ83wcÍzmÝìœVÌÓs‹ôy|ÙScsÝÐ`Ú…Oyæ\ƒˆº¤çkð={{)ŒüÀâeÉ—£(UˆOç„×ǘƒ<Á, ÞâÔÁTÊ} /v²9²“n–)I*!ÕÛIïaõÏ#T Ü5tß$¤³'8T·ìÒM+h ž¥5Æ÷øWÕ… ãûÌ•%Õm¹Üw/ÁòS2[£?³c¦£¦ Þb¸ úl”‹(Cv¡o t´Å#:°<|,O&dqf{3… uá¶ÑÄ;– h ¿Á~²·6•¬ÞM½z£Á ­ÏˆwÜ1ÖóË!ÿM‰ aVÕ•£‹-ã…çÙ°Ž‡/lWC®~ÇÍù™É»T ›~tqÈoªþdÔœ¥B䋎k!=½›1Ó¾8Þ|ÅÚ+°¾Ü£Š>5Rnó¿7Ë  ¬É…š¼å?cå¾`æÚwçî÷zI=š9…oëÅáòÜsùÑߊõø./scŸ8ÒÜcCûr¼Ûõ:ƒêl”[D/Ü´ÝC™¯ËWB¿Ùy~¯˜”¹—6XÞáÛßÌiøåL>T¿¶oÕÖE̼Žý… <—bm®2µ³/£ÞÚ㻇ø:j½£|ÀÔ®m|;p!¶ÆöÀEÕ¦Ýe½2{ êg´Žóè‡`{ivŠÞbÅ­Œý ¤ÛV°÷6Ø(<ÌÀîáÀ6 ž ~Óø‰fÒÖóÛ² ·ÿsñ{cÁÁÖ“X³ÀÙ]K‰ú‹sRèôàcðŒX­¾\2‚÷Ó¨à!ºBŠ;ÈÁŠ8¢ÏÁoÎS¬,ÿä‰Û5²g€‘†H‚Ãùga¡Qûº}Ýü9·ö* endstream endobj 2760 0 obj 4276 endobj 2764 0 obj [108 /XYZ 31.5000000 638 0] endobj 2765 0 obj [108 /XYZ 38.2500000 617 0] endobj 2766 0 obj [108 /XYZ 31.5000000 353 0] endobj 2767 0 obj [108 /XYZ 32.2500000 209 0] endobj 2768 0 obj [108 /XYZ 38.2500000 175.250000 0] endobj 2769 0 obj [108 /XYZ 31.5000000 210.500000 0] endobj 2770 0 obj [108 /XYZ 38.2500000 175.250000 0] endobj 2771 0 obj [108 /XYZ 31.5000000 353 0] endobj 2772 0 obj [108 /XYZ 32.2500000 636.500000 0] endobj 2773 0 obj [108 /XYZ 38.2500000 617 0] endobj 2774 0 obj << /Type /Annot /Subtype /Link /Rect [60 317 118.500000 323.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn2 >> endobj 2775 0 obj << /Type /Annot /Subtype /Link /Rect [87 310.250000 118.500000 317 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn3 >> endobj 2776 0 obj << /Type /Annot /Subtype /Link /Rect [87 302.750000 132 309.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn4 >> endobj 2777 0 obj << /Type /Annot /Subtype /Link /Rect [87 296 136.500000 302.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn5 >> endobj 2778 0 obj << /Type /Annot /Subtype /Link /Rect [87 288.500000 151.500000 295.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn6 >> endobj 2779 0 obj << /Type /Annot /Subtype /Link /Rect [87 281.750000 144.750000 288.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn7 >> endobj 2780 0 obj << /Type /Annot /Subtype /Link /Rect [60 274.250000 153 281 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn8 >> endobj 2781 0 obj << /Type /Annot /Subtype /Link /Rect [87 267.500000 156.750000 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn9 >> endobj 2782 0 obj << /Type /Annot /Subtype /Link /Rect [87 260 138.750000 266.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn10 >> endobj 2783 0 obj << /Type /Annot /Subtype /Link /Rect [87 253.250000 186 260 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn11 >> endobj 2763 0 obj << /Type /Page /Parent 2 0 R /Contents 2784 0 R /Resources 2786 0 R /Annots 2787 0 R /MediaBox [0 0 595 842] >> endobj 2786 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 2787 0 obj [ 2774 0 R 2775 0 R 2776 0 R 2777 0 R 2778 0 R 2779 0 R 2780 0 R 2781 0 R 2782 0 R 2783 0 R ] endobj 2784 0 obj << /Length 2785 0 R /Filter /FlateDecode >> stream xœí]I¯ä¸‘¾ç¯ÐÙ@«ÅE"j`ª€9s”—F£ÛpÙ‡ùû£…R¦H}”””ù²ºßK1Å%;ƒ?ÿÇ×ÿÍþþïìç_ÿ™}w¿?|½¹)‹þ_Öþütû@ÚÜý[fß¿üÈ~\¾\¾4ÿÿqé_øúῚ¿þ/“Ù6ÿýšýùš‡q_j¿ðûÅÓüþ­û]ÑüUŒ¿Ûç¿\þûÙ?Ú‡áÜd¦Ÿ…¶•m§±0ô˰LÑýüûû?.?÷Ø6Š,j£ªLh¥3Qk™ý믗¿5 Ýy­…0•6Å=ÙŽT2².2eE0P÷ÃÓ}ŠÎk›°ónæìPªñÞs«•PF–ºÝèv“KÛ¬³¡åþݳ.Q-Vµ@3;ÔnzçßQˆ¢N×y7sn ôÛé<·•ûÿ&m;ˆUªá#¢ù;iØŽ£ÊEÕRZnNúg§Æ¶÷ÒÔ {ïæÎY›xï|RBUeå5ÿñÓÞµûÛ²J×y7sv¨ l÷Þ¼)!b¬†ßÃ7lUB¾±ÓÈ3’1õÈÕa#—- ï8¬Ð²œùË–>¨Óì»mÕhy«FËLg¡*}uÀ­uÃ…g€{}j©gú>|Å|ÒOýÔLv;QÓ˜<_dϱ¥Sí™ß÷‰ö¬™Z™ÝN´| =KBgsÈpŽ «û%Ûf¿êa’±Y€w½s2¯ß5÷içKkî U$6÷:¥Whe{º.ùUêkï ôuQªd.#7sn 8[w鳕.Úy7Ý'èÜÊtÞ¡~æ©ì¼°wÇ ¦reN3똒 \ÒrÞ‚î± ËÚpR‚½º+²jY/Áº \ òëhOßI]È;x¹&`/äñ8XÇxO(|ìÄ’áeMG¹/åÇ䨩—S4„=åL-Å#èÁ‰±;Z^µö°çèù”Ãy†‚0åÃóL¦ÊOí¡‡!jª²›Ïuƒ{àØÜÖÅ´Å!ì\K|:ת¿2ç£X™+iÅÚÞ4êMð<ŽÙ¾G€ÛVZ¡wœµîg òRWÖ¬„NÏþí p9Kή™½ß«ÀÀ…ÝcP*‚ÁŠy÷.=.VlÆã8A3ƒK¸Åã¯Ai $IBô 5¼´øÌ, oî o„…Fho?’ñ¬1ÒFP“­`PZ–Jxâ2ÂF>ÂÁ0„þúY 1 Ø•|‚»øi/M«Ù­jð¹v±vŠíïH‚¥p< è³yÌh c95ç §Q eØjg;õx›“—š0Õb,Yqb¹Í¤žCqÑ‹jQ¢Z¼E[/®Kƒ-n«ÜÃ7€Òð½ã‚¾… „«»&¯­?7…zs2ׂßã¸ß´Ù#tîû "3(á;‹G¶ÍÜÎáwà òÏõƈ”¢žCJYuH)¯ç1õŠ<lqHYæ2pÑèíïDÆ©Ñ;Ãw”„½}€-°7Ç‘[Ͳö¶J¸íUBzÚµ‚³~{+PKn*µµá|sòê¸Lá›K¬hHo ‘k„0†ˆÀ¤«ñ†K`€Ï ÔÆzp§8ÜŦ9ÿ«‡ ¿³Áåèq› ÛÁïý!,"þB¼âõØØÞŒÏǃÌí Ü–ÈzÁ. D)(ƒ½ëK^Á”2*`ðØqkãµm8ÔÀ¨€QŽpdq¸áq0 "œEˆà à8ÊÁ då_‘¥p(Â=ÈñRVŠ9Î;ÃR p«Ãɇ‚w¯³Ÿ\þ è”ó’Ñ´&±u©}ê94öíPæBqVÂd9E?,rãÅ–Ü‹ ;Ù[ä•““FgR‹2/|Î;Ø›óÉ¡é.t{(Ò“ÎÙF4UL®X4– <…ëã]¨ïßfÝ®×À1ÆDðo)bbOeÅÊÎÒ‹VãÏ{7FF¡ ‚‹bwâ•’”F(“(¬”×4 qÑ7±(»Îk FhßEIq PÔ'^îDÑ*"@:Ì’çe:žÀt$9¨6„Ió Jp<£•2„Ò…Ýè é…qƒB” ø‡)ì1tRì ÿ§¨û<Æ?Å'í’6Cà—'Ðè|bVØò}V¯ó“Þk!IrEÜX´óÝÅl»˜õ“DÃà c¯q/ïÀ¹q¬2Î+AÈωâÄ&8Ká&½Ä3Àãà¹áœ—’€ëH4/ïÜ0 0¾ñÂ’ÅNáx …ã–1-`èàœ‰‚UH~N­ »€ ¥†kç.¼z†)óÄ$R¢ê>«zò:y6¢ã$9O᫬ö)ëÎãS¥æ¸Z*o‰Ï¬I¼ƒBŸXÑ_:K îÚ—p{ñ+Jäåö<ÉÀ:êÌ#ðÙàó‹ˆQK€_dÅP_oÆó¸ (‚Ÿë¼Ëµh¡êží˜áß=Æ9ÉñDlâ\DKü›Á[õ„`+EZ–æ¶ÏæëBŸfó#½Á‹ªÏ¹)RgSùÆ)wÅ#—®pN3ìYyJ´Ðò)s¯¬øk¸2ï¶ð¦¦À0`Þ9ÖP ʽÒUJpŠƒÎ”GµîlÿÊly³,ñÞ$Šàë^u*=(á{ÕQ m!¹Iêì]ŒFy#!¸È˜E!H¥È̽îñ±ÄÌìt_„ùþû^êʓŴ½¾EñúÀ„o¥Ë«|•to/Z÷7äÊ«¡¡ZÜün=RE8Öf v‘lìXÌÂ#Ä"„dþ‘ ]Šc–pâ)YAH˜ÿæ² c¸íƒ—b¹œÝÛÙ­H¡FŠï=¡ì)åÀ6Â0D A˜”õð–ÓˆàïÅRÙÓ}¨VÙÅùDpC‘f{ˆ”æˆPZ$¡ì‰énÈ›ê(⢮ÈcˆJGEzÃg²x=X†.A0¾`027ÂÉ+Šô†[ànS.‘ciPp4IIí}èyLÖ°'=ATÄ›Ñp1:Á.¼µõ¹ýÁ<")+ENa½‘"« 3P”àäxnxœˆŽ¡FÌC°N€ß¡¬ÚR8Ò²cIM;–¾C‹Ýg¦J±j3%ç†ì«QÕb´­\Ñ9“›ÚËiòµÐëîNó¤ÊEŸýÛç'mŠïRM<ÀÒ•|«ÃÀ°¥ÇqiƒÞ†v3ëã Þé"¨„YéG¸RI˜Á'Ø‚O±çŽã`ÝáF +æ‰óŒÌZ2eÞùûø¹Ê­-2S´¿Œ¶j³ªÎ{Ò*†'ß/•Í…¨¥µbü–¹íeøÔÑ|ß}Öík™ÿ¶ ÆPÍ;þLT6Ì´ïeºŽï—_.ïÿ0‰`"ÖQ£X†ç¢zj;¦Ú)XeCæHÊù+%z%2Άó2|ðøÈ•F Y6˜Ô!’td)µ¸}ðÛåkœ¬…î;¨µë`|Pv$)´tôÔ?5Íá¨nxò½y©p´9~KÕ“n†Ú‘Ýø@uTéw ƒad7Ìt2í·ô´=æ—fý{·(»³¢úÄU1‡·”J5EB Ò>•ß–Q¼…gN1âxqû`%Ž‹†ÓLp¼y CožVSäëžx8Þ«Ãák7ÃG5Áñæ q¼y*‚a„ãî[zÚžs(އŽ_Te¸Žáq(iÒx ¤(ݲž¨d1•1·V•’Q)5GTªô±½yUû-G4C7ÃGé•sD¥Š`˜"$ªî[zÚžs(Qg‚²­'¯@…@^äv8¹©z 7[ß>XMn¥ðÈ­”säVjŸš'¹µßrä4t3|¹•ŹéÚ¦y›¾Òרžs(¹ÎÇË0œ1þÅ žŒ”ÖQ²’õíƒÕ¬À+0bŽåÓhç'ñ(¹ý–#õ¡›ác᱂ªžc•õ‡©lÈ ºoéi7z:Ì¡¬`Œ€P½E3w?á°:΄+ŸørMäÚ oUzý6>Ì˶R³15dgFj¾Çã* ;¨ îs]„׿©œzC»'žÇµÿ–¹íÅ}rc8kóÙ†׿©ñǰÆ÷¸vφ™Û«ÇõfŒ=®Íº‡w$5SÉ4"³Aëá¼½n••ä¥Ü)[ŸÌu¯Êv¤-ÝK[_¤0r‡RLg- µ½PWUòöÁZ}¨á0S}¨éaFßM8¿Û­:Ó}«×wÆn†vª5¬~Fjô˜¢ ô¡þ[zÚžs¤>$ƳôHágÊ]fÖÛ?/¸ §½ÐµZËb8}VZÞ>XÍ#¤ñx„´s<"p# çFœ¸º2…¡›á£ñx„¬æx„ô¢í“€GtßÒÓnôt˜CyÄÅ2ÄmÌØLo—ìx=‘hÂÙßV+G¨á”XÖúöÁjúÓ•GÚÌÑ_àWί8!Ÿö[޾†n†•Gºœ£?í{IÛ'ýußÒÓnôt˜Cé¯rS¿Lšçã+‡™4„:8‘œ§%Åå–À§Íœ´b´·Öú‹øS' YÜsA%¨PÒ8ÒRð–—ÆiA-dž•cçeÞGšÞ´àýé­ý™S"WRåÅ=9€(AI¬•ÂIê¯ÅšÉ*’€mCYHŽBNÏʼnSÕÌŒ(Ó” qX2óªÙj(ɼ¶ qúÌI²ò)+T0ñ€ÆÌ(åÊ#KH,Ä+ôyþI‘§A¶[B¶=Êd)ZÀ^I$ySèg '¼’°E» 8f(ò'sŒ\K³•ò B+ß©ËÏÇm_¿ôvžûÊø´ÛPKã‹)|Q”BáË¥K‰£njmKŽMeÍÎ{‰t¡Š n2;‚6øÜ0ð)ÛpcŠÍ›@Ÿ×›yÁÇšÚw¯bÒ$ã{t IrÝ ’g5RŽ¢àÉò /Z*)+™ˆÒƒî ’«nP©7¤}çÍ—ÎË ñHRÒ3[cÏá°ÙMâ(*pˆæøê½VÊr8Êq¥8Ò ‡2I:ª ‰¾ú*¨Å$®(jph–SŠúR.Òà̰EMÐHp¼Q©‡;<™]y”˜3L]޵ӽ֣/uß+¡=JjK¼·êO.|Ma<á»×9ï±xî{Åèo@ÆÃUQ…Çœ¹:ýÒ¬“ÆÁ ¿+DÒ;9²ZÌØ°mMIaÍ•`5#dÎu«ÈÂÂcý©çq¼Çðz,ónd zêa  „-¦ÕP/俨›ódνÓÃTè üˆ³¤gZ†2'›Æé{3ym½w†“¹°7wÇuÛ \q¢¥7ã xmÛ…Z"Щ¶÷&J8롨:h˜Ã7øŽd+¸àVj¬}˜®¶!Àà(å÷¥¢V·‰Ü§‘²öt¹âΞÇ0Êt”ó#Šgbá– "ŽXl¶QœR=}ŒòCü?`Œ×­mBa?^èD`À¢!ìåj}LŸur©b…/UXÒ¦±DWn Ù¢;§YÜma«]²Ï ¢ì8¤3ü‹<0?¢·€2—ù{#½S£wFÌõæjˆŠ¼ô¯…TyWxu²Ò§M®‚­z{û„ZnÒ…ù- ¬ñÜàJ#s+RÓ¨3»µ =áH¸Ë¢Ü4ÇTµÁþ>*„t|C‰Þ§¨48ùí³Ÿ ò|ò3"&öWëO\b±J¸Ðf,Œ0ÙG$ƒ tàêèØmé ¶àêó§IxÂ…á†kÔ?$ ð8oÏúÃöq°Û¯¯»>Þ¼Ûl+ø`½_žlO"ë!¼áÞ𒂘°¹£—ñ¥,Æ3-6³pAŸ/«át9TNñ açk/I‹>sÇ•’ ƒ¿ÁóÉ‘“‹r0É|ö¨;…Ò5rT³&ë yëYï ð’ÑÓ›¶ÛQ4¥ü©´'€¶$r¡D±íUóô¡.G›Ù)ø™+¿r¢¤L \Ô‹’Â\YÔðÒ0‡Œ³òcÈÒ[viš7QÔÖ†#QzÓ”#Båx+–dÓ%¦AÖ+ì¢ìͼsv!á#””jw;ÛÿIïŒ)¨‰\S;‹öºƒMà÷¤ËX]=_]OÊR,H  SÄã’!ž“Ub ¯ ÒÈ«À,¶Ñ^(>" ¸(¥¶Ð³rc>°dµ}&wœrÒûÊH^W¢8¹tíC÷u%jíA†ð%ÜNW¢ŽO ”sŠ“÷ƒÕËq¡l¸(|¾ÃöWðlÊ  Ê¨éçl‰š âe›èÃŽõô ¿# Acǯ'rJ†JIK¨E‚íY¡êh³ùÉ~4D¥Ñ/K_X¡ X ¢æ…hƒçºŒ.ý씃ý®šöÓC[æ²;¢¹mé±§ [\À  3H¹õG4ŽZrÓÍÍí³[)JJ‹•ö™ÔÜd‡ûRa¢ »7 òbf÷ßqìXlZº¹¢-áÚ¿›3ÿàäY;,°! H ˆª„(@€cnsPÅð†ã8Ë@¯X†Ë•ƒuÊ™DÜ!ÇÐLN bøNdé¸7{?ª™BåŽMÍàÜœƒ§Í¾ úXäÅ_²/—ÿ»Øi% endstream endobj 2785 0 obj 5745 endobj 2789 0 obj [109 /XYZ 38.2500000 201.500000 0] endobj 2790 0 obj [109 /XYZ 38.2500000 201.500000 0] endobj 2788 0 obj << /Type /Page /Parent 2 0 R /Contents 2791 0 R /Resources 2793 0 R /Annots 2794 0 R /MediaBox [0 0 595 842] >> endobj 2793 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2794 0 obj [ ] endobj 2791 0 obj << /Length 2792 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯ˜sÙ¾€ €-¯ä@°€‚o6Á"»ˆ²‡üýÌ É‘Ôäלþ¦ºIŽÚ‚-y(ö£ªºªºžÿøíïûþ¶ÿøðí?ûïý÷‡o»âP—E÷gúúðúÝúŸ÷uSî¿ÿ²{Þ?ïwÇŸwÝ ßþ|üé{½ÿÓñïÏû¿þíøáý/~á—]­êã÷Ÿ¿·µ:þT\¾Ÿ>ÿ×î/¿Ûÿzq˜®_ÌÛÿPEÙ˜ö´Œ™©ŸwÃ6Õùë·ï¿î>v›E+UÕÍ^Yc÷ªµzÿßì~:N0 _Z«T]Ùº¸e¢ZŸg²ÇAt{üçø×èü%4|„ÁÝÆü¼rq¨(S)ÿè‡Æej]Ú¢OH.›F®Mÿç¶}µ¦î¦l°½ /?¸.ʈÔt^¹8T„ãÑO³Ve}]Uà>r­Öñ?¯\*=r=£K"·Tõy€<ˆ^†0xe#"÷¼rq¨ ÈÅ£GfÕºjm´r¬àä2|„Á¤¦ÓÊÅ¡2 .yš[UGT¼^ /?¸QE¹ç•ÇR¼<£ "ר²×L‚!øËxz¯9 ³ˆ„sZ¹4PzÔâÁ%1k.R2Ʊ}5|„Ám‘nŒŠx_òŒ.‰Ü²T=€ŠçöeøƒWuónåâP;ý1d¼”î`°yö¼øùi÷ñ«²'š«öO?×ÍyþötJ¹ÿpºÄ·zÿôãþ÷Ea¾þaÿôó®=Tº–Ø=)¾À'ŸÑU£'¾SÀ¨ >±áïhøNñCï燧#™ÄÆp­Ô<†[¸ÒB¾ƒ÷qé…Á½ýצáÚð;ÃxmzÁ4†) b¡€pÃ8í¡“†úl;O} DˆS‡1ìá"¾–1•L/¢¼OãÓ„¡iÌâsVHކ÷c0ßx7˜+.„¹7!…1ïô`òAÓ&äBUEz`EŒÆÐ ÞOfÒÀ·©oѺ0]aÊÆ§ÃCcŸŒaÌ} ÍÓ3|b°Æ²I®ˆ¡c0ÜîL2àyÞ ¶) ÆiBØÕ¼Ìø"µž,ÆÝbªË¥t@i]•çõ¼ ¡NshÚâí“ÔSORT»{XËÕ&"â”q1×ÃÚ¬é"ŸÜ<…ŸòüÄJ[5u9†Ty0ºQ×b»ƒTóòEK«Ïî sÔ55<žŽÖ+*SK‚Oz–Õ\³$u~¢ŠCU«Ó(®æ¢ÊCÑš·Ã‚£uPRzxtPðÑVøÄpF¹àªàÄE8Ö=‹e¨ÏW÷ã9i5„¡|b4 Qeˆ'ð CLp@ÉW+‡zȃÛex÷!|sG‚}1Ä2Bµ/81Åpð9òÍ”TçrÌá<«–•…¢a12S_IC͘NJið>¸®]Vvg×ÉÕ˜É# ¤V¹÷˜žxÊAc\ÌÕhw5©E]‹ ËÃhxJÅÃc† …†‡-ây®„ROI,1cî¯á­¤òoˆ;Ç;ÛÜŽ iìÁ1ä*(Q‹ÒT™(ûû®l×_f›Òa¡›ŽÎi¹¬Œ+lâ[K«Úòlê¯aÊT€F+šÃJ™O±Ãæ™A錖!›EŸ/P±\°L~7¾>‹º`SEÜke.Ý2§Š4 Þ¤ä}ä"]ŒÛϳ”÷dy_BζÝå3¡9ÂâóúôQ ¿ñ]OD`ÄQhÈã‹«àE‰vŽ)ÄÚÊ‘b©Ø)uiñ«µ‹#ò‘H¦V/¢m÷M–"X¬nª;`ª~Œ{ÒŠ0²I!žUr‘Ì貌¢µé ^fxܘ#ë¨a ƽ¿áx^LzŒæ¶ÉãïÂèŸ,¦„sæo©ù›€tmö§êÄÝM;Í^—ƒhíu U:%g¤3M<éíåA»šÍóž§Eïôfj´N‘<ÅÑ·æm0žôGvâI¯VU£´£µÁµáyzõm ÖéÕìSÐ騉ª-Í%°©yð~ð;xm©œjúŠŽŒ© .ß3™ápK©&cÛ¾ÞéÉädŠx ûúMÇ#\Õê-ÅtgC•‡Âe}¸XP'¿”ÝD1ˇñ¼ƒ‰ Ÿ††˜¤,Æ ÀxD Æx÷‰rÊáÇQ­+£(«c›“èðâ2•;ÂièÌÚ°e 3j†'-U2:¥±Î\z .ßAá«> 7»!- |/]ô< 8¸OqñÏ8™ÅI£ÞÞž‚ /›^ú¾ o‹ËzøÉÀœ0æP&p=óÕ”téâõŽ()KµPß%ÚáQ_–•ii¬¬g±µM‡Í]b«’Ô=n<âyœïœKÏøJsQò¡•ò=05ÛâFIQA¢}–VП*À¨¶šV`©¢è…cþ°ýí–ZƲY‘}EŒA^4ñÅãè¼7‡Éj DFbeQ¹RlSᦌDº¾6dÈÆ¡ßDâåÖ‹[…ñî›°¦ô†”—ÆRÛ¼så"da.Ÿáާ°<²T[uiWF…y3¥øÍñaÄ •—²Tñ*¾ðøµ>¢Ò‹éǹ_¸Bj&ü5B4¾½¾4•WP†wë®'äV§béƒ>hOt5~Ò——Ò‡ÊÌì›ËM æ/h3w+ŸZÛ×~§HéÅZ˜uu…©ÅA©£ ö‡·ÀjÒÄ6 ¾Ó« *hëõ Ù²wúù¸âaå½"4†¾¤AÐL I€€]ÏŽ¦ Šá ç郾ìÛP匮91±„ÛóÁ‰“é!5øŽgëx´ævR« {èÙÔ­4÷º¿ï,/~Ü?îþ¼t` endstream endobj 2792 0 obj 4135 endobj 2796 0 obj [110 /XYZ 38.2500000 633.500000 0] endobj 2797 0 obj [110 /XYZ 38.2500000 273.500000 0] endobj 2798 0 obj [110 /XYZ 38.2500000 633.500000 0] endobj 2799 0 obj [110 /XYZ 38.2500000 273.500000 0] endobj 2795 0 obj << /Type /Page /Parent 2 0 R /Contents 2800 0 R /Resources 2802 0 R /Annots 2803 0 R /MediaBox [0 0 595 842] >> endobj 2802 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2803 0 obj [ ] endobj 2800 0 obj << /Length 2801 0 R /Filter /FlateDecode >> stream xœí]ÝÜ6Ÿ¿ÂÏÄѧ%Eìn¶À=°È÷Pô¡HÛ;—â¶}è¿_¿&cû'9’ìñ(‹d7ë1E‘IQ$õþ‡O?gÿù3{ÿøéÿÙçöûã§ËfÍŸìøõîÛ_›·?gÆêìó×Ã[övx9¼Tÿ¾š>=þ«úé¯Ldÿ¬þ~É~ü©úå/퇎øz0ÜTßÿW/ ¯~bý÷ãïÿ{ø÷?²ß»áZdÎÿÿ޳ÂrvDcfè·C7M^ýùù÷Ãû†ËF\‚e\I•ñR‰ì_¿UtàY^*ÎM¡ »f #Ž#i]e‰™Ñ@õ—'ð€Ú„^cî*ÒÜ Ý's +[Uý“è>p[ÚpÀk̽S¥c.†ž[%«çB«#£LÖÖŠêg#Û?×ͫԬ!š±˜{èX¢+Âñ»ÆÜ7Q:vCà—²â¢¥½¨„Ë?õ{ð!X+E¸¥Ü`î*-oÐ}2WÚ–ú¥A~·Ê¨€‚sÄÜ7Q:ÖBà>9«E§ÕLÀ^”ט{§JÇ[ Ý's-á¬í zò[P%ט²¶x`ßJ•< ou‚‚!ep%ט‡â6îqkVð€¾Õ |êWŠ.ܬÁ<”oå€î“¹RtÔç*‰Nà¯#@¡€×˜{§JÇ\ Ý's•-8¾xat@ɱE¸ÇúË(•æ7 Âúæxñáõðþ¹Ú­UÄ,²×ß*äš1ëo¯Qtöî0¬ÖÓë/ÙwŒÉ§ï³×/‡¯ê×Z‚!k†´e7äc=$ç¹V…5ºþ\ý„õ›Û’B³ÓßQ²~¢r%›Ðù Ú#|Ò¼c/˜øÄèú²CñôQ® Ÿ|¬Ÿè\ ËÏŸày)ôD”pˆõx‚x`Þ°‡å…áç,mæ:g¥<ÿB{hÞÝ£K0ÀÓÀ„䢰EXch#A„U}-Ôyõ`”èÖês=j™×Èœ‘è >y@O¸AO|‡A xŸ¨åïøNËòe4äùÄápe¿f9\BL-¤"|ÏóË …÷êÄM@Üð;Ã7‡¼`Ã’¹À Ý0O[êÄ‘>{¦sOâ`Z–³ëD>ÄÃÇr{&ƒrîÙÇåZÀ¡1W¡ÀúAb¬½Z ¼: >‘XsÜ$už)¦ÛÎ$ÄAøŽ,#ê iæõ˜·­àøè"鱤Ç6E¼†9öô§àåMa]‘4é¸A—Ï„ÑJ9på'"+Ž`ŽDà(‰ßpƎ㈬0Â|F1ÂA%JÀ¼º<ç Åd‚#Ré7ô¶ºP‰2’ Å‘^ 1¡H¤Çò‡ÄB¬ jc€ã˜…·«ƒr€¥ ã7Ò‰ ¦(Æí1´M<âqnñ9‘cÍâuŸ8ŒátËq¨ð|¹þÇÈ©ÁSV[ØS§˜¥•çÓ]¶ÅÄaqÂñ†c“‹gÂ;±6…Ò²¹Q|ÆI÷ /6ãå”°ˆâ(,ªR¤šM윳\7èœ&ð„ž´–Hç¢Ð[¡9Þy†ï”è6nÍUnšG§wžz6ØZð†ìE.¹¬uÞ¡@ÃXãqZïbŠ Íb6¹ÉÝ¡äE§¼†Kvj<üÆ-ÒžR1ÛvëÚŒÈiG‡$ÉLJb¹ãØlJ>0o{ÔmJ†ìœŠ¡ÌO½ƒÇÁÓÀ>0Þ`†aaZBp—ý:ȇ!8eŽmàœ“?åba«eõ[à M´èawŽqì¤@ ¿/T%6þ0T©M€'ë•EëˆWÛýÆU[{YVK<^š¨âº?#£NÐð™.`!¤’]‘˜‡òFœ/Ö)úÂ38œ`ˆÏU·®àVÙyãŽód\f…9 ËŸOæx"x…òø .±ÃÜÂ)î8Eóç$-WÆDy2–ìÑöåRÙû“Ëdy·"}…™åã–ÀÜm_$HÉŸÄïàbû¤ó·f‚J²è‰ß²ËÏBIáEBÆ1 DÄÇ~ rG.?æ œ¢H¯Ù «U#9ˆ²€ÔÃR˜îH1ô[#FÉ>ð{G8÷pœ°RNâü¦záù|¸x :0 §ç”ç` *é+v‚ú¨™¹)ù­¸¢¤‡Ní¡ä”ŽNŸ6X{äøTÔ0Tî{?xw¨•x¥ZJñîhHâM4Þà@%eëŸúj¨s?]-ð8÷C¼QÆ]qÇ ­ãõcSJŠyny¥H¬âOM‘åx­”Ò}ÑZ¤ÆJ³â|¢Sõ=[® Z½º&p\RÁ!¡/€ç ÆÇ°wK)Õ"P:â©gÁ6\d­ç›—¦6ÎNl»³ÒÆÎs8µqNmœÃH_iæ1ÝBgUð"È:qœ> ‘6–[hK­ ©¯ÑÌ«·sM!$×LפR !Õl?×bQ+fÀ¤ÐýOZ€Ï„RŒèWRIÞööuK’3.O€ˆUè¥j›Ò‚bÁ%Z¤V¤^C8›)\ÜÙ`ë/+nguu¤Ž¸å€WZO­.Òv>4^‘šT+e},¨u'tǾ©^Ž3¿ wŽŒLJ;fœpGÁmA7ÌBÇRš*%Ðk{®ä:„jpSYÑ{óYÂÛܲ(6sÄË^%tÓ«5ºMÅv[Mk)w}¬ßQÇoZJ,(R/¤v‘›J^PÒ†6]HQ´ê"Wï„4‡|0W¿ÍŒsò Û°¥_ §ÒPö¢­mß­I›ƒÔøÏƧlOÆ&šâmmÙ¯÷Òlm{{ÄÈ×X¥0ö¢-¡¯ÕI ö0é:ŠÚŽkBÚD«Fqo~ðf ko½B9•¿zÒ û¹iOÙÏŒÕéÎÑù†ð$åî/'.妼@rH£2Ý«_ý·“ ÄúWozKIqn0E)G#7p¨½×ºÈ˜f©æ{Ç;|ÂÕoyöl½7k\ó¦ 4 ·%–o}Ýw`WÃnçìÖ,º»õ¦0`½ÑÞèõ¦ë¶ä"ÝÏîçNºfŠŸ“}Ík+)GD{» xASZù^ÐþÎË Þå@9„¬vÊaˆçD JÎ]¬[ÂLI¡ã›ÌÓÛ`íRࣄÀéÌ^Ú2Gè÷*‹¡å[=GÆÁgJô†’x¶zîðHø¦rìHÈÊÞfï%ÍÊ®Úzw"á¾80ž}EÜ< }yßþõFïÚ#Oúf˜›¾ g”ï›aÞÑ}KI¯†$ÃîO’’ÙŠôÙ;¼Ï0Ùʨ2&˜åÖæºì‘[¢¯tºÍ;ànŽ'3‡’õ}×)MÐÓµ)ÁKe)qV/aAÅÎû m¹ »çV—×µE»1Rü2eO]owå©[äê½q)ž8öƒI–çXï,£Þq% !y—ôhi伌y¥ˆßŒ6# Žì4¯|ŒØ§V˲‹"ÇêF[iÞ¾=<¥~àm`÷Í‹!Þ±w}Ç)1¤D‘”,“’e–mB(õ½¶\~˜c”„¿Xÿš‰5Ü ,ÞþõÿNwƒžïùÛp.fºƒÐSû˜ÍÓås#q\Fƒm_>§µL—ÏÖãnéò¹Ò§}]>W}eoJNŒ_æ>pKf§¦#¹Ì?2ѧŒrè£6´7ö ¡½ÈE}7֥ŸI`y1¬zÉ'4ŽœÛ³LáöÜÎÅ[pм:¡Ä ²]Á×h‚írofº‰ip ¾Ó}¾hê߈-UàŽ?³þ·-o“´Ã!éE@j(ÚµfeŠª˜Þpœ6ß]]0 ®g¼»‰%ÜV—O¬L‡¨ÁwSÇÐìõ¢f˜Î[5µHæð“VaÏ)ëìåð7†¨éM endstream endobj 2801 0 obj 3118 endobj 2805 0 obj [111 /XYZ 31.5000000 477.500000 0] endobj 2806 0 obj [111 /XYZ 38.2500000 435.500000 0] endobj 2807 0 obj [111 /XYZ 38.2500000 294.500000 0] endobj 2808 0 obj [111 /XYZ 38.2500000 195.500000 0] endobj 2809 0 obj [111 /XYZ 38.2500000 653.750000 0] endobj 2810 0 obj [111 /XYZ 32.2500000 476.750000 0] endobj 2811 0 obj [111 /XYZ 38.2500000 435.500000 0] endobj 2812 0 obj [111 /XYZ 38.2500000 294.500000 0] endobj 2813 0 obj [111 /XYZ 38.2500000 653.750000 0] endobj 2814 0 obj [111 /XYZ 38.2500000 195.500000 0] endobj 2804 0 obj << /Type /Page /Parent 2 0 R /Contents 2815 0 R /Resources 2817 0 R /Annots 2818 0 R /MediaBox [0 0 595 842] >> endobj 2817 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2818 0 obj [ ] endobj 2815 0 obj << /Length 2816 0 R /Filter /FlateDecode >> stream xœí]Mܸ½Ï¯ès€m‹% àñG€6CCàÍ&Xdqö¿õHêSz”ø¦HIݲ±ñÄ´¤b±XU,V½zóÇÏ?ýó·Ó›wŸÿsúÚÿùîóCqveÑý:]~ÿðò/t}î>¹º<}ýåáÛéÛç‡Oíÿ~{èøüîÏíOÿ;éÓŸÚÿ~>ýõoí_þØÿ£Ë?øåÁ)×þùï§?§ÚŸŠëŸ—¿ÿ×Ã_~wúõòÆás=1ßÿÿTá\­.dÌ|úÛÃ0Mõôû·¯¿>¼é÷­Ê²Ò'e=©ÆêÓÿñðSûáõʱJ¹Êºâ5rúò%[W'¥›öMíþ‡ž~ ½>ÁË+W¦{ùåâ\Q¦Rá·Ÿkk”qº´—…¾,rY׺ýÙ™þ×ëæå´ë˜Vº\»¾=Å’¸Ú$|ù…ri¦ Ë _.¹•› g.ìÑE“€A××'à~¥š:ÝÒ>Q.ΕamñÛ·Ò¥êäª쿾=ÅÚÎt”K3¥_Züòs]õ¿àÏä§ëËw­j9fUûsR™*Ý 0t`i®¯O±î®Igh:ÊŹ2H~»äâ6vØu.‹ž_/ÿr§TBñD¹8W†ÅÅo\\§•îTŽUÄëùÿüú/7U:/®£\œ+ýâÞ.¹¸vþ¦þùí)Øo›t~DGy"S_Þ>¨šªpµ…?¿ÂÔ_ÂÐÔgúò„ªJýeµÚ—ŸLoÆÏ*«Ë‰/Šyôîo@Hê[àÁÇ/o>¶kÐU¾üÔ’Ö}óé/íŽ+O?\âPí†øòãé÷Ea>þáôåç‡æÜ:ʼnýÈãÓȇ/í¤’ÓÓ”ýWU…èÑà·ïà35øLñGøOA€j̃·päƒ$¯‰Ÿ)曆#ÏJ9¦óZCª –&ßnª”ßÝï3Òc̱»Ý½ûÝ­ wtŸ´i¸¦KbýÒ€Íl‹§Íì 7|²ÛdJK[Õ­'ô¼ ÛësÝO”>O?ÓØ³5Ýá’gʧ3 ¼±ðm ¢-ð6ŸT÷ÂõLщDýüÆÿ‹në–g£kµze %KÖ@!õFùÄB1PÁŸë5æ=fh7Qe†UXÀê^ƒO¼mÌ6 àïá‘À‡™íDl€^'Nm',1x±G»N#°÷¡SR†ŸÁß{> ˆ¢‚!¢öC>¿ÒUóMÀÎc_çÆü0Ÿ™ó'â¸sk#påð3¹$QÃ^mŠj|‘=—á™BI ìèuF°Äãó#!o…Ч­w[Òûýµ*¿0¥í¿ÄºIxÃØ0Ø;€&?àÄœllØ™va0#ñq ú[™}Á´þ‚.JO†3ånO]on¥Ãž$Ü@²Û$ ò£ó—¨‹ÄŽbo¼§cN€›‰0ÊKaU(¦ ³þ> œ„ˆEÄs ì-|JÜ´Eì b‚[A]ÇrË]¼ ‡Rp/ðžÂz“ˆZ¾&HDE0F²„6*xIe=ŸÁæô&£…¡43øÎ£ÀÖÌěÅj•ˆˆá-ƒÞ-‹ ©a©@ôÎÌgc}z}/lµýýmÆšézFÖRÈ:\XÉGp–ñ5-ÁH ‹.¬µD¸„‰%8k«~‚E„¥•ˆ`ÔYq >#K˜UjC4„#ÍÕù 2?ŒøÂ·Ùºïã¥Hw®ŠsåÔ÷ùË­@ਉ7Ë¥hÓÁÇå1§[M{UkØ-‰‘%Ѱ[€çX¿aÏJfÌ9‰êœÕÇd'’»:»¯Êsјï'ø¾­cõDi®lâYD²ÀH c•J‰7¶ZKº¼d†ºkd²Þ¡xo·)¡6®]åkc‰ëgª€'ÂÔ2½\[bÙ§ò±³*k`e„×)"¥’)%€i4“ç–n›4F Ÿ|;èðîX9"fb¤7“åYNàðmø™Ùqê™=cÊAË:/ª¢8©.®dz¤Ž`ÚÔôL€‚Ž;ÕÙ(íí8ÒÇ4¦fÚí-w6#qÅÏÀ™ömŠÌü6 W»ç[5ì‹%TçB5lªf½«€²µìÊØ$¾oDŒ@æâÊk Ž%zü¾“<$­•/¹Ú%AаÀŽØ½M½]µk¼YïêJ8uQvZˆLÙøÜƒ–) Qé<É\Å‚2J}z²\bŸ¯Q·ެyKQ:ëÍmÖø%fv­}f‹â_osª‘Éø I ÁÓ.w5²Æ·sxií¹ÔÓˆ•NL}1Iw!£w=þÞ ^Š^Ê&)Âø™P¨°kd0Ë€a8K&a‹¡zt.&îP,Ìë 2ßn£*#Hxu)×ùNLhñÝ4ÈÆÍMàiÛ`H€6ßZ{•84¦ zx¦hˆ;M´bV.(!áXo¦AÑiSbè2 ô†ÕÃì¶W»kí°™ƒdÜÎÀ²|7+·O½Þ7È›É×ʯ*êye§Þ ^lMpt·8!Ö> ËD“ˆl¾ÓÀâðø½Ùlîæ-½¼ˆî¦Ì‘øô–ûÐi±›Ê ]*oÍn¼,±¢ Œ°$á&¾ÂZˆ?%瑾r¾½ú¦-Æelý&¼ŒÍØ2Gñ®Í¡ËÉy•6#ÕIH•aÁdëdDdkï$©N¹Ú—:¬:pO>"°0ɯgµ©¼YIu‹æ‘œ6Ù-ç…š®íÖöFÜ!í¯f ¯æ<ò™Âì[.ï&x`ˆÉ;u s¹É¦¬gÝä-梉V FøôT¶”hoâ*uá†9Lc¨åI.Eô1Á‹¤ž)¦hœÙh"=ž˜dJÆGÞU,1 ü˜.g¸èÂy«Ñh¨)ËŒöŒY`JX‹Ø ëã ÞOÿxƲSˆÒLïÍÕJÈ&ÆgCñLQ»r3§Œôæj>š+P͘ðÀ^XÞóo«v¦ªüCÝV"I{OhëMû8ÆiTAx™v-¦Öè s ²Å]1´ÛÚz@ ïÑH1@žT’fâ™=3@D¸‘béx•= iàH¿5¦¾ógjà| HÁ3íwÃwá|àw ‰ùtªÚ›ÚšHø…¸ Rù†ß†ùx³ÚPÞ†¦j1<À´¼ñú@‰Ç´ €=oËð´åPž@CdúH0°^Ìè­4VëÂ|c%„ù†…–„”å¨lXayGªµ‰°Ö>›C¬×ëD¢=7¥‚“A’BTÏRKD. ˜ðåèÃË1ž`¥²Yœ ‰, [¹…‘è({¿µ¬Öò«Ä˜ËaÌ6&ˆ!{Ùp`k¼J¸d3u™=ïW &*µg$Ç“ñí°ÏàÛËÞ×Éžì˜?ÚÞLo]QH«dq˜6èa'Îzñ Ec()áÔiCÖðlEš3ÄóœzÐÈ:'¢e=›:2ª¢ñØÍtÅÂÏôc 2Ð,`ÿ³„RŽGG’j¾'¡ ÷Ø‘E–¸¡»ŒÀ£—MÊdtSÄU5Ž„0×Û™'n\×A*¿P ¦ò€¨åÀÕ$| QpÕs•!)óE›‘1Kn@«Âøþ ¡ŒŠ™ ÍÀg"bP¹’Ôrõ@ªJuŠËö@’í›{ì õ¸ûì3„{ì ){*ø6Ø—'@õ;øÌ#¤wÂÝž`×"Ü ÷&bzG1}“0G ¦è¨ôŠÕNÔ+ËWùÝ}Qî/¾NUpíÉ~‰œÇ¨S„\Ô3em1÷Œ²B,Ú.‘Y§µ›ÙÄyVøTL¬:ÕFm£ÙñЄŒlÈú¡?¼¾1“]Ö•äÄ©Š4@þ²¸ Ú Œ 17àùG%(0^Lh}Ißó S€ã*ž‚#Îs¥:Ï~Ö ö!]`M0NmCí&ø F ¬0æ™ ¹²j~… ùejÞÑj’X{ ‘eý¤š@²bífȲkfåeËøa”N‚úÅÀ‘}r'€à”Ûiô5õ®ùË waŒ®[“> i‹~jߤ1>Ï@ïCA½<»gâ4×Èž^-¶éxÏ1»‘ÙõŒ_# dŽ=dßÝ2Y­Ìˆ‘Cãß•ÆÏ$U‘:Ù¶Œm»¡“ÉLÖv­¯ÝŽ3em3ɸL]ô¸$œAàc*ƒ×G³–Hš^? Q¦Wå%¢Ÿ‚rP€’ˆ¬÷µQ˜ï2£™â܈E' ³bĨ[ÇЧ‚"Q{“nÏk»¤z¥gÞ²uü`0Æ™ ƒ»žÈâE”IX\ ½Iü_½€äË×ÒòbË€Í~#Tóý̘܀‘dø'ŠFA) ‚‚€*ÆÞžÏŠày3¾qŒhê·¼ÄIXjDaÒ™Ú9ªz/аr—è^MA6]‘|t™&™ÿ"J„™ã Þ {„Å>0¤Ãó ‹îŸ•!Œhëyöóµâ 'à”7}ãâv¡á"`5eÏøt;MDœ€öÔ;‚ZILâfP¯cŽxŒË"÷'ãJÈvÀ”èÖ°vs¹ nW]_ìú¸]øˆñÔëúVä;ÇôÅ3V³ ccáïô:~‚¶¯?Ìð:½Ôè!Å3×]êÝaÐaT1û% Ð?:¾0’þ%¾¢iYÆÄšpïþä›%!²¹ÛßZiìú jÇȶGpY ±( ¼ 'ÜA‰Çå Nˆd€p NrÅÏ0©ÆX‡`ª3%á÷‰¾yôúÆâÖJ/××ÇȶG½Ô·Œ-8ôú6ôº+®p Gþa%îkäÐ뜿®Ýi2ê´k¾¬N;"ÇÈÖGÆùª›×i×Bó}ÂP¬¿3Ž‘½Ž—R¯‘±Ý™Gs9›Ds­_ø~Œ#Y5×! ÁD÷9ÓÍÀ]LñSà¤ìT8sÑ©rèP´ÌE¢wç¢5Î\Äý$™N“½ƒ"”…¨áÈÑ¥4H¤:ÛŠ3>!ßoÃ+¥·(*;dLúßI¸Í5þ>ǹ¤xñŠÏངwf Ó6S¬S͵5ÐÑöù™£ìëzÀ2u 9ž1ž°Z‡ªÄ™°r‘ …)aÂ)±¸èHÞ!¦è ³øýUMûyñ˜]ÊQ Ê<3Ú:’Dc —+(¼ØÉËHKe< ¸ÁRì@¡çòÕiÅÌ”·2î å+c d×X”]ßã,âjž»ÓZG”÷n´w 4_ë‘/KaØn&F¶"jíjoÖ |‰…§žW@Œ¦DR¥oµ$à2±§Æèãw0wÚ–ßïö)Ñ–í—bsÅ…ñE)¾ð8:å†8Š©&®‘™õ ¤nàK¢oCàb…é×Ë|Û+úÅäÑ5Õpa¾£,té¹åÔ°ûIî4LÊÊêzƒÑÑ`yË×Ú™B^ÅáUìÞ«ØgJÃQ,ñ˜9}£7w ²Âû”¤[Ky¤|ì½@^4>¡í¨•#:‰åð*fnçMsmH—ëv~t*Òm_ÝPL<>wÄY¶¥íD±0–_Ì Æÿ™FÂ5Œ†bª×‡oÄ´õu@S€Ö8",›/’‰×1Æ`»,\z®»ÄÀRòhÈ+Þ´Æ· Êpçþl×»Z¶‘<2c««-*5iuåÑ€ˆ‚?$¼‹õ1çe<’ÄíÒ¶ZÉèŠH ¡ú[0IJ­o2íE n«b g+‘­7Û1$i7ç[±»Ëi¦Z¤HbMˆSE­ý“8õà0ÇÜU$sšP• ˜t²€È1Ö)³a¹•ƒSDî›è 'gFµÍÖ¶çÜÈæ¼]m7ò¾WøÆâæ/×¾ý}úÖ.rP>ÍýƒÖªž¬l½ÏB]œó“rm íKG·›°IÝ —>ë.‚6âi5éïô¹õ‘S ù=úŽ™KAŸ¢íc?St>ÁöËú6·uªÆìEç±cpb ¿ >Ó[y5õ5è¬À]~n)(Ç–÷C¼àg°˜ »‚^z`¤F\íÏÓvÉ@Pxi°Œûò:»¾øfË.¬hWÄ”àE€‚±˜9ø% «™%ŲõJ€jH[ï»Û«…8@^ÛúõJÃöÜœ ía&¦0§WzÓ;gvOŸþaÀË endstream endobj 2816 0 obj 5253 endobj 2820 0 obj [112 /XYZ 32.2500000 277.250000 0] endobj 2821 0 obj [112 /XYZ 38.2500000 222.500000 0] endobj 2822 0 obj [112 /XYZ 31.5000000 785 0] endobj 2823 0 obj [112 /XYZ 38.2500000 222.500000 0] endobj 2824 0 obj [112 /XYZ 31.5000000 785 0] endobj 2825 0 obj [112 /XYZ 31.5000000 278 0] endobj 2826 0 obj << /Type /Annot /Subtype /Link /Rect [60 749 91.5000000 755.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn2 >> endobj 2827 0 obj << /Type /Annot /Subtype /Link /Rect [87 742.250000 130.500000 749 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn3 >> endobj 2828 0 obj << /Type /Annot /Subtype /Link /Rect [87 734.750000 114.750000 741.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn4 >> endobj 2829 0 obj << /Type /Annot /Subtype /Link /Rect [87 728 132 734.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn5 >> endobj 2830 0 obj << /Type /Annot /Subtype /Link /Rect [87 720.500000 136.500000 727.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn6 >> endobj 2831 0 obj << /Type /Annot /Subtype /Link /Rect [87 713.750000 177.750000 720.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn7 >> endobj 2832 0 obj << /Type /Annot /Subtype /Link /Rect [87 706.250000 180.750000 713 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn8 >> endobj 2833 0 obj << /Type /Annot /Subtype /Link /Rect [87 699.500000 204.750000 706.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_aspects >> endobj 2834 0 obj << /Type /Annot /Subtype /Link /Rect [87 692 147.750000 698.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn9 >> endobj 2835 0 obj << /Type /Annot /Subtype /Link /Rect [60 685.250000 122.250000 692 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn10 >> endobj 2836 0 obj << /Type /Annot /Subtype /Link /Rect [87 677.750000 138 684.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_defining >> endobj 2837 0 obj << /Type /Annot /Subtype /Link /Rect [87 671 129.750000 677.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn12 >> endobj 2838 0 obj << /Type /Annot /Subtype /Link /Rect [87 663.500000 138 670.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn13 >> endobj 2839 0 obj << /Type /Annot /Subtype /Link /Rect [87 656.750000 138 663.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn14 >> endobj 2840 0 obj << /Type /Annot /Subtype /Link /Rect [87 649.250000 149.250000 656 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn15 >> endobj 2841 0 obj << /Type /Annot /Subtype /Link /Rect [60 642.500000 120 649.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_pattern_matching >> endobj 2842 0 obj << /Type /Annot /Subtype /Link /Rect [87 635 141.750000 641.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn17 >> endobj 2843 0 obj << /Type /Annot /Subtype /Link /Rect [87 628.250000 163.500000 635 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typedef_reductions >> endobj 2844 0 obj << /Type /Annot /Subtype /Link /Rect [87 620.750000 171 627.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn19 >> endobj 2845 0 obj << /Type /Annot /Subtype /Link /Rect [87 614 157.500000 620.750000 ] /Border [0 0 0] /Dest /Z#18#b3#02#ab#13#f1#c5#c0#f6#5c#3em#1d#908#be#06#83#b2 >> endobj 2846 0 obj << /Type /Annot /Subtype /Link /Rect [87 606.500000 201 613.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_matching_template_comparison >> endobj 2847 0 obj << /Type /Annot /Subtype /Link /Rect [87 599.750000 186.750000 606.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_debugging_search >> endobj 2848 0 obj << /Type /Annot /Subtype /Link /Rect [60 592.250000 118.500000 599 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn21 >> endobj 2849 0 obj << /Type /Annot /Subtype /Link /Rect [87 585.500000 103.500000 592.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn22 >> endobj 2850 0 obj << /Type /Annot /Subtype /Link /Rect [87 578 164.250000 584.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn23 >> endobj 2851 0 obj << /Type /Annot /Subtype /Link /Rect [87 571.250000 132 578 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 2852 0 obj << /Type /Annot /Subtype /Link /Rect [87 563.750000 150 570.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_macros >> endobj 2853 0 obj << /Type /Annot /Subtype /Link /Rect [114 557 159 563.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_descriptor >> endobj 2854 0 obj << /Type /Annot /Subtype /Link /Rect [114 549.500000 197.250000 556.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_typemap >> endobj 2855 0 obj << /Type /Annot /Subtype /Link /Rect [87 542.750000 195 549.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_attributes >> endobj 2856 0 obj << /Type /Annot /Subtype /Link /Rect [87 535.250000 236.250000 542 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables_and_macros >> endobj 2857 0 obj << /Type /Annot /Subtype /Link /Rect [60 528.500000 132.750000 535.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn25 >> endobj 2858 0 obj << /Type /Annot /Subtype /Link /Rect [87 521 120 527.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn26 >> endobj 2859 0 obj << /Type /Annot /Subtype /Link /Rect [87 514.250000 142.500000 521 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn27 >> endobj 2860 0 obj << /Type /Annot /Subtype /Link /Rect [87 506.750000 123.750000 513.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn28 >> endobj 2861 0 obj << /Type /Annot /Subtype /Link /Rect [87 500 132 506.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn29 >> endobj 2862 0 obj << /Type /Annot /Subtype /Link /Rect [87 492.500000 133.500000 499.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn30 >> endobj 2863 0 obj << /Type /Annot /Subtype /Link /Rect [87 485.750000 131.250000 492.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn31 >> endobj 2864 0 obj << /Type /Annot /Subtype /Link /Rect [87 478.250000 132.750000 485 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn32 >> endobj 2865 0 obj << /Type /Annot /Subtype /Link /Rect [87 471.500000 134.250000 478.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn33 >> endobj 2866 0 obj << /Type /Annot /Subtype /Link /Rect [87 464 136.500000 470.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn34 >> endobj 2867 0 obj << /Type /Annot /Subtype /Link /Rect [87 457.250000 122.250000 464 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_ret >> endobj 2868 0 obj << /Type /Annot /Subtype /Link /Rect [87 449.750000 141.750000 456.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn35 >> endobj 2869 0 obj << /Type /Annot /Subtype /Link /Rect [87 443 128.250000 449.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn36 >> endobj 2870 0 obj << /Type /Annot /Subtype /Link /Rect [87 435.500000 132 442.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn37 >> endobj 2871 0 obj << /Type /Annot /Subtype /Link /Rect [87 428.750000 132.750000 435.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_throws_typemap >> endobj 2872 0 obj << /Type /Annot /Subtype /Link /Rect [60 421.250000 126.750000 428 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn39 >> endobj 2873 0 obj << /Type /Annot /Subtype /Link /Rect [87 414.500000 141.750000 421.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn40 >> endobj 2874 0 obj << /Type /Annot /Subtype /Link /Rect [87 407 192.750000 413.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn41 >> endobj 2875 0 obj << /Type /Annot /Subtype /Link /Rect [60 400.250000 165 407 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn43 >> endobj 2876 0 obj << /Type /Annot /Subtype /Link /Rect [60 392.750000 190.500000 399.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_optimal >> endobj 2877 0 obj << /Type /Annot /Subtype /Link /Rect [60 386 127.500000 392.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_multi_argument_typemaps >> endobj 2878 0 obj << /Type /Annot /Subtype /Link /Rect [60 378.500000 110.250000 385.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_warnings >> endobj 2879 0 obj << /Type /Annot /Subtype /Link /Rect [60 371.750000 113.250000 378.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_fragments >> endobj 2880 0 obj << /Type /Annot /Subtype /Link /Rect [87 364.250000 163.500000 371 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_fragment_type_specialization >> endobj 2881 0 obj << /Type /Annot /Subtype /Link /Rect [87 357.500000 217.500000 364.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_automatic_specialization >> endobj 2882 0 obj << /Type /Annot /Subtype /Link /Rect [60 350 129 356.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 2883 0 obj << /Type /Annot /Subtype /Link /Rect [87 343.250000 127.500000 350 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn45 >> endobj 2884 0 obj << /Type /Annot /Subtype /Link /Rect [87 335.750000 104.250000 342.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker_usage >> endobj 2885 0 obj << /Type /Annot /Subtype /Link /Rect [60 329 132 335.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 2886 0 obj << /Type /Annot /Subtype /Link /Rect [87 321.500000 294.750000 328.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typecheck_pointer >> endobj 2887 0 obj << /Type /Annot /Subtype /Link /Rect [60 314.750000 142.500000 321.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn48 >> endobj 2888 0 obj << /Type /Annot /Subtype /Link /Rect [60 307.250000 145.500000 314 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn47 >> endobj 2889 0 obj << /Type /Annot /Subtype /Link /Rect [60 300.500000 105.750000 307.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn52 >> endobj 2890 0 obj << /Type /Annot /Subtype /Link /Rect [60 293 150 299.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn51 >> endobj 2819 0 obj << /Type /Page /Parent 2 0 R /Contents 2891 0 R /Resources 2893 0 R /Annots 2894 0 R /MediaBox [0 0 595 842] >> endobj 2893 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1701 1701 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 2894 0 obj [ 2826 0 R 2827 0 R 2828 0 R 2829 0 R 2830 0 R 2831 0 R 2832 0 R 2833 0 R 2834 0 R 2835 0 R 2836 0 R 2837 0 R 2838 0 R 2839 0 R 2840 0 R 2841 0 R 2842 0 R 2843 0 R 2844 0 R 2845 0 R 2846 0 R 2847 0 R 2848 0 R 2849 0 R 2850 0 R 2851 0 R 2852 0 R 2853 0 R 2854 0 R 2855 0 R 2856 0 R 2857 0 R 2858 0 R 2859 0 R 2860 0 R 2861 0 R 2862 0 R 2863 0 R 2864 0 R 2865 0 R 2866 0 R 2867 0 R 2868 0 R 2869 0 R 2870 0 R 2871 0 R 2872 0 R 2873 0 R 2874 0 R 2875 0 R 2876 0 R 2877 0 R 2878 0 R 2879 0 R 2880 0 R 2881 0 R 2882 0 R 2883 0 R 2884 0 R 2885 0 R 2886 0 R 2887 0 R 2888 0 R 2889 0 R 2890 0 R ] endobj 2891 0 obj << /Length 2892 0 R /Filter /FlateDecode >> stream xœí][¯ä¸q~?¿¢Ÿ ø,/ÅØ™Ý ‡‹] F‚±ÃðYû!?ºQ‹,]ª)©ûL{lϨÄ.RRÝXüXüîß~þïÛÿüóöÝçŸÿ÷öuøûóÏoâÝÑÿçÖþùýœ üûðï›óæöõ×·ßn¿½ýôöSóÿ¿½õ?øùó4ÿú¿›ºý{ó¿¿Þþð_ ñC£¶Á¯oNºæï¿u'›‰ñï–þ—·ÿüÝíï-ÇØÝ0˜ôú÷RxgT;Œ•®{‹)»?ÿüú÷·ïú°¯%›—7 ºù¿êö?½ý¹}6Þ`Õ|°ê·|À}cæ€}7`«níŸa¨UKPPà}ÇkÓkPÃkýû¶ú6ïP7òóÉïÐ{mŽz‡˜÷ï°éÂÞæÚ Þá!rXú8u_`è‡Íû ±³s_¡kO$ƒ Ìô‡+æ‹|÷vøùï»D)ˆÆ¸K_xÍï¤tœ¸Ç…¸æµÈ Mã>TÓ—qU?'â.`®‹rónäµ_ŠÔV.2¯ùeU£¤Ýëqöˆ—¹ñòµvŠM;òÚ/%~YÌ|—ù¢G2Y¦BP¹dÜ?ýòöÝÓêöËŸ›õvýÒڙ߷¶PëÛ/¼ý‹òû½ýò×7éÞ]°Í ºfý/Ôº;þ½±WV1û ô¿ ïÒߨO7¥¨ßz?vwš -Õ|Ôj?²žY”Œé{Èü{tbæLíw¾ý:^«wïmí_NÊ> p³aœÊ ”¯oÖ¿ËFš¼—c+7ç¯ú>šöõhvC¿ö÷ÑP¾¾¡‘4´8ÒžKú_›¹Ð§ß%ïDfïDn“Q™Ëh¸I[”Qè…4¸ø¹{!…wÐýlpG‰¢ò7½ð˜w­¼LcW»tG#Ðý-C2ÝEsˆGï¤vúÙô}üü ›Òú9!‚ ¿—Ð1°RD‘ ;¹lBªA¨zªnc˜Aô"åkó#1èØJ‡„M¼ƒìE‚h"ÂãnJÛM2˜®¤l íæ/ÍóŸ-áÒØNÄm{»ûšºÿšáÝY“~g-‘IMŠ„"ï|&E/“Ò5‰+)Á'Ì„ ­}39R+ÚOÐ}7HµrzNج* µÐ¢¤;FòÚP2µh[ bÙ —C7“Z(_R åp7 %S‹®¤l íæRµh&g§¨…ì™H¥Ç¥ßÐýø²§m”=-ç„ͲÉ„’쉅¢¡d²×¶d+²‰—ɸ’ìÅÝ4”LöºV²´›Ke¯™§ cÿ¡GaLFÚºÑ.ž¾Ã±•tÜCZzް/Œû EÎ ì8íQìN]2f´ãnNجKÖ!]j"ê‚.9…܉\—ܤ<‘M¼tH—¬-é’5¸›†’éR× R6vs©.¹8ÍÔƒ.É|’GZ:²Þ)¬Iؾ`‰T‡àŽDŠR ûTÈ[¤BÞ•TÈ,ÛÝÜi@ÛjP‘È&^Z¤BÞ”TÈCÖ ä*Ôµ‚” ¤Ý\ªBA¥YiÞEЉŒÓ–—eØ·OØ3ü“¦õ1¯¡gìœ gê3ióhsE~–÷ú¡ÌÕ4$½×~=˜œ°Õ~9aRûå„-Ø/—¥Üz˜›Ÿ®UoŸF6ñÒ¤öË (Ø/'p"¥¥`ûÕ·‚” ¤Ý\i¿Úa~(ûvÐ]±]w_6ïeóޱyNªÁdH›mždó”)Ù¼,¯ä†¼Rb²ÚVƒM‹lâ% ›§tÉæ)œ%k)™ÍëZAÊÒn.µyzü¾’J!Ðê@KØÂo'Rgd¬<Ðç–MǵԦ÷9!Z¶úúÛv”ê/d-"Ò¢Jr[ð*´'bX ™8ô—ädéíº$ÐÈ%”\R–nvCº9ñ(m«ÁåD6ñR#—Ô°/¸$ÀÉó–’¹¤®¤l íæR—!Ú>rEe!Úâ¬+Ò ²Ã!p¢|RË”gpã§´–íðxÛóë¬È“¿±Ý„›ˆÐ=Þ$þ†4a7ÐÆÙöÆk]Ú4Ž@0®K¢§P™®•›s‰W*Ú8+ @gEևȀ6--ŽT΀6SWmœõ«Æá'O´îÅ‘j½`XhS°#qn螃QälD>(#ç„ÍŽÞKäè½*9ú,‘ï†D~â§ÛVƒ#lâ¥DŽÞ‹’£wxY¢¥dŽÞMž}di7—:z?‚澩RÒX‚LËÓI«r šó„i¢íîÕGô‡ zNت^ DŸ%DŸÏÑ^䈾®U¯_#›x‰}.”}.diõ#úúV²´›+õÏ‹“}—ùÒ€ÁÕçÚ,ëÍ÷ábNØ,ëÁô¼*Áô|–€ô*‡éu­áV L/v3ʺ—%˜ž—8ÚR°¬÷­ ei7—ʺŠ0=ñék‘éÇË‘êH¼²©#‰„ÍÊ¥ÑëÑg©9±k5(Npˆ±›I¹t ‡Øn0EÝè‡Ø·‚” ¤Ý\ª\qˆœ@Ž^X˜ðp¦/ý« `þÁ>ì¢7»èM »è-Æ.z›c»Vƒ~E6ña½)a½ÁØÅ–’韱‹H»¹TÿlÄ..à€9ËnYøÄ½ÊË9—çR¯VÕ èIoãBºVjN¸;Ùé]tÏñÚ’Þá¾K_¤éÊ®•›s‰Wì¯M!ÙéÞ¹ØRp²³¥Å‘šY²sêãÊd§÷j]¯_øþ“ðý•–”h¨8+Ú—õ>®W*H›Ýw@¸CJ¸CŸ%H|Èq‡]«Á=‡w»™Üw(á}ÈÒ=!Çö­ ei7Wºï "îPýÈPó 2þRЇQÐÁ7— µÐsÂV ¡ä‚,¡äB–Ö 2GÉu­z ÙÄK„’ ²„’ '©Z Öо¤l íæR Ucôwp¦”Æ$qBª"·®À}x½g4uÛ͉¡iVÎ ›Í‰F§ K§%²‚ÎN]«Á\èộ̉.!œ‚Æi¹–’™="œ&6vs©9ÑáTwásaîÈñiœIøSM›?”IøÑŒ0,/æ„ÍæÊ(d®Œ.™«,_bmÚVƒ9Šlâ¥BæÊÈ’¹28‹ÙR2sÕµ‚” ¤Ý\j®LÄ\IGêE]Cªþ\Fê‚V…ç9+ÓID0ÛuÉŒ˜§í Ç¡ÒÕ€JŸ$æ¹ÂVk…^hc­¢¾îC•‡PeÁ•PeÁaTYp9ª¬k5X#— Êb7“µr%TY°UÖR2ke'óäTÙÔÍ¥Öʹukõòâ56?m7En„Y˜4E8ìÑf…4¬ÝküÍI‡o<£q2úÓÑx»}‡5jŽÙ§¿g”³P²Ù‰¤ªðë 3t·‚F†P‚F†,WBìZ N"$ÐÈØÍäD| <Îü·”̉ø9±´›KHˆÐHÎ Þ)¿`—9[ñ^¥„vÍê9¶ûQQ·ûÚ6Úø9áÀͨÆ#­yÆʆ]£é m,¶Òø ߟðBÄ Åp-EŸh¨*…6tŸè[¹9—áJDÑÑâÈýŸ˜õq!|¢yî»0¿Œ¥˜ÛC›]NÖ€“ë¸~ÏÖ£Ld6¢%ÁÆ ç„¡™*7„ØØ ¼ªÑQPhÖ·êB¯‰M¼LÁÆ ¡6n¨w£2°ñÐ R6vsahÖ¼†lLW,¹`ßG3°+䜰YZÀ!i4Ö œTî(™´˜I<"›xé´@ÛP î2hìÐ R6vs©´˜åòùÆ×³Š×Ôߎd¡:íäh“LzûÞâöôpµ÷ºß‰æ¶0<~­ûákÕœ°ÙY‹l‘-ÔGm¨ ›ÕGí[ ¶ÆºÄY‹l‘-ÔGm¨u“ÕGZAÊÒn.µEn¬Jz®ƒwÿ¿”«†r¹DëÂfåò)—/€hªÇRï3mßjPoåò)—/€hªÎºÉ@´C+HÙ@ÚÍ¥ÊäK¹Q¹ê‚l²¯Á¨m¶[ßÃÉíÏ€Œ„;ò=ª×*)ÔÍ4þñ§·O§«ŽR]ÚÎKߌ¡?='²¾Ÿ#¸œ:QŒjväØŽM‡ƒÙ(ží÷ë>ßñ„„PA<•|ñTaU<Ÿj…‚–,¶ˆSõ‘õMj×ÖŠ(°zùY;'¸Ba-’¥£%æ)ך6›ôá~}#K_r-ncÌ$–P€k6Tœ‹’Á5ûV}¤;²‰—)\Ó·ÌòH¸¹ÊºÉàšC+HÙ@ÚÍ•‘°„|÷Š„)¾EÕ|ØÐéåœp Šªé(•)Î9uÁLèÑYeB8Öž!Þ0ʱ¸§Txß­ç.ð¬—V"ßa àÙ†Šs‡ÒfàÙ¾Õà¬J|‡•ÈwØxÖKƒ3¡-%ófrV$¾Ã>x¶ň–|ùŽå;¬G¾ÃŽÀ¾ÃVEà.CéûYûGÊœ\Nø¥­,ç‰ÌïoÆl/î¸IçŒñZ0nÒk„?“Ý¢DŠRëZ¹9—xAÄõ Œ›t÷á|†qkiÃH.és\‹q“~*s0nœs9ê"¿>H˜ÿÀ‰» ·&ØW7ܰ9.iùZ¯D¡|mCE•A: ŽË»V}Ü=²ÂðP\ åkªÃqyÈÊ×­ ei7WÆåJD(+Ä °CX~_ø³Àí Uvs4¬Äì4sÂVoþ‹d\–€Ja`gKÉd\ÀΑM¼DÀN%KÀN%1°³¥`ï[AÊÒn.•qëRy¬ìíÙh°ƒÉDøVµNEØ‹0'lÖ:²J—²*Kã+Ȳ]«A«"›x‰²J—²JãE‰–’i²H»¹Të@¯K%£L-¯ßªôÃxd}?£Š„ÍÒo$S™$Se‰HerHf×jn“@2c7“ô›$SœVm)™ô›’9±´›K¥ßªU©¬[X¤òá4/-CZf636k™CØÌ†OIËÆf*—c3»Vƒ¹›»™´Ì•°™ÊalfKÉ´ÌØÌ‰ ¤Ý\ªe^®kYÕʇgUBûVµÌG؆òbNجe–…B‘Ò†Š'ï*dEJûVƒ“hY¤e¡P¤´¡f©ˆ)ZAÊÒn®Ô2-6Håk‚s Zh!GçsÂVµÐ2-¶Ù Å6*žïk™Ûì[õb?²‰—i±Í†P(¶ÙPqö¢¥`µè[AÊÒn.U ÖOÝï5]ª KJŒºäç„ͺ¤´Pë´Pg³x­sha×jÐ@ c7“.é´Pkœ“h)™.éZ8±´›KuIûU©\(GÍ9f›¨ª:û­j™ž …zNجe°´)°t–-Ð&au­-2 +v3i™)°4àÜGKÉ´ &µ2 kêæR-3n]*«né>Kg¿U-3ø*Ì ›µÌ ¤e®Pâ­¡âlvY‰·¾Õ EN&ZæÒ2[(ñÖPqdZfý¨V6$Zæ Ä[3 ».•éErHúÝ(0rNØ,ý t( t6‹×!t­é   v3I¿/ ´Ç9‰–’I¿H»¹TúÃ: €jaá6O*ò­ê_ˆëFý‰B#a«þ@`%°dé9Ø¡kÕë×È&^"°ˆØN~´¬}+HÙ@ÚÍ•úrìp0ö¥(HQ@޼zØh$lV…ð  JøÈr s|B×jP„È&^"|¨>Îl´”LQÔˆO˜Ø@ÚÍ¥Š¢×ñ u啵« Bz987'lV!@ €È²‰>@rèZ * È!v3©”@íÎ4ÜMrè[AÊÒn.U!³r`‘º´°Cï\ùVUÈL†0'ܽólôoñÚv^4Ÿ튀nvŸîèZ¹9—xñ ;/ÀâÝ-ï¼hiq¤0Ûy1õqåÎ pë§8;/8ÛŠWì÷=Ííû;îÙÕj ƒ!VÏ ›=£G ð%Èdé ð9d¢k5x>Ÿ@&b7“gô%Èxœli)™gô#dbbi7—zÆ0êÉÁçºqNÕ–ÃM2ûŒšX¬:47F­òìkì-æa¬–%Ôœ°U@ #J “¥)ŒÈ1]«^ÏF6ña4Œ(a4ŒÀI—–‚õ°o)H»¹RË2}OJØIvý´óýÎ*þ¼}Óýžã”5Jl½ûäÄÇܰÿT¡ÛNckäXLû9áQ*™Ë¥ s£ šg˜.–ÎFºVnÎ%^©d.c”,ÌeŒY"›Ë´´8R9›ËL}\9—1*âz^qÐqý€'[y–Ã0\•Ñ”œ ZŒ# X…Í8çÓ‚Îyûf¡F'ÖÚ„p¿A™ä>ʉ:‘±ìªÈ¤¶­ÜœK¼’©AîCal›xõ¡Cnõh‚.és\l!BÀT/REYÞb9fƒc™%~öÔ€zÀuÚ \ Ø@Αªg€q<Àšç Æ#æj›m6DøE‹Ü›,—Üt”š!½“gdj”÷ZðÓk8¢ Õ‹Ó÷ØÎN²{Ÿ3´i+cK5®L¶ bl^ãªkåæ\âUZãʘR+cðjNKÉœ¡‰5®"—ô9.v†vÑý¤èZÿ@YºQïÂ󜕟úÆRƒ±µ#XÕ&„ûm‚KÏv5¾t¶«ñølWãó³]»VnÎe¸réٮƕÎv5ŸíÚR2›àâÙ®‘KúÛñ«Ï•±``¬¥•³B™ÚåǺ[2Ì ÷kWð©v…PÐ.+$’|Û­–¤úѵrs.ñʧÚ\I»‚ÅÚl®] -ŽÔ͵+øÐ.+àƒicƒ'QsšsÞ§wVŒÈVeç„­‹žV"d«•%d«UÙjUŽlíZõ‹š#›x‰­V–­VbdkKÁ‹ž}+HÙ@ÚÍ•‹žVÈVRÉžT:¯ ÷VE· Òh/¬Šn}ý§(ÙMrSnóœþ,׆ŠÖé§mSߢô­Wm FÐd«KÐd«14ÙêšÜµlœN É±›Éê4Ùj Mn)™ Ô#4ybi7—Ú@PÕn_›<ëHNQ,Î™Š¬"÷ÛÙ¼½æ"”Kƒš̬6¥‚ÿ\Ù”ç>x≽’Ð_ßL_Cw.²wÍ ­Iw4f¸4ƒÎòÉÖ仺VnÎ%^¥»¬)í°çÅ[ žA·´8ÒùKgÐ6î gЬ•5ÆúÙ‚u'ý ç®»¸ü€»v¬]S=oumyó´ßN{üœ°9äuhÏu¥=Öá=Öå{ºVCHë’=±›)äu¥=Öá=-% yݸç`bi7—†¼~üšß Öùá¼i ýX°Ñš9a³‚´À†ÒfðfòÍ]«AB² v3)H(m°oh)™‚„q3ÀÄÒn.U7è^¶l½U·YZœKö[G"áîØËÉÍìd Íì$F3;™£™»VnÎ%^¥hæ†k!ör£™[ ޽ZZéÍ<õqeìåäGG3Ÿv/=ÇÇP ŽvYtÇô›¥¿æ¹5Ôrr,¤èÜœ°Õ“8 ):]*¤è²´ŸÓy!Å®Uï)F6ñRtºTHÑ)œÄl)Ø“ô­ ei7Wz§×O³}/Í»:• 2<½ð0¹ð…œP‘¦56¥©;2ÏC¨>Qw8Ü ùFéw@?r¦¿‚&ô»¦ŸTk2ÖØ™UtzÄk1'˜Ul:J~ÁÍpp¶Y^Žc…9SŠísö|,<ÆvÿÆ:èö,ÎÙ«ø€)™“/OyÜ9N­P3Lj¡D%´sóFÒÙ‹)¡]–Õu&G;w­ÜœK¼JÑÎJhg8;ÝR²Ù D´sä’>Çų³ŽvfíYäXNºS®ZGôfW»Ú|šÃBöŒ‘WÛ³óá${O¿”Ìú±¼b­Ì´3O6 ÷#›Â¬+Á¬Ã0kçr˜u×Ê͹ W6…Y;[‚Y;‹aÖ-%3F6¬#—ô9.6F.¬æ"k›S³b-[ÖwëÁ u‰“š^ø 9Vùc:z£ëV0ÊòüƒÛ÷Áe+&K='Üo| Sw¾SwÃÔ]Èaê]+7ç¯R˜ºó%˜ºó¦ÞR2ëä#L=rIŸãbë"LÎSèOC.@ãÌ}gÁ¿Ö- I[¿Å0ô¡îñ¤tôV-^#€]¸9ánld=ÑH/|A#}¶,â»e‘T§ºVnÎ%^¹D#½°ô/ï´¬‘--ŽÔÎ4rêãJôrD5“yUÖܽ괆jd`p»¾PÍY“KŽ©©ûvNª2J5è}!‹—#º]™9a«\5"7A‚âú‹ìÁxìïP¾µ}Ñù…º3¼û>äðg¿!¹ F§ð›aú[â&â”9[,èÅýGý9†™"|"¹ýH݉ÁKáÎgò½Ñc#Ÿtal"6¾HPþúŠ ,zè=G8Y”=+Uà6ôþôWž|âäÝNzÀºU_N†¿à²}P›ÊšAócü]aÉYá«zG¾é“è'åHâHqU­Ì¥¸FZcWÞßÞ¬­Wœº³ƒÍñ‚èÕ­S[W™95-NÚoÌR‹l …þ”; &sö*nßÉIJZgÁ¥ìðâÏÇɬ³œc áLøêú*·£-Õ±QŽébUæâ€m¶û9ÖÆ‹#B–¤Ú /ɪŽÌ8Q”³´ò<à`Y¨šUÛS“•±3‰MV®:º}Ý™%Th m`gy^W<tB Ö?~Æî; OB)]—»ÂoiÇÞÛÕ=Pj•$¶u^!mi2ƒÉ°'œ LJUGFŠ—S“›µpu}˜“ªX+J¹Ex‡U¶RNža?9¥ê~°ûb‚ ÒÒq¤˜6Ñç*×ÈìHΰ4€ñá®?ˆjÔx k·¤§þ-÷ÔCPõ±—2IÛÃf©.g.ÉII1D¯®¥û°Bݸý¤í 1gwÇ U ¬4à3®\xb­ sr¾uÏŒ¹2Áªž^o—YiÀkŒ¨µrzŽ–ú*;«ëNÓ2ö÷À¡üѳsÖß')ÿLËšœâ(ô,báÜšÇÛÿ:#nŸ1æ@ŸØofè‚ #à$1ÑÃþ]ºš1mÕf;V×/s4uqBu6E?ð´å¬R ¶ˆS³êGï‰?)+vz²n1”“ÂŒ…œ´òºJ¼8ŽÊÍÎŽ©5§>*˜†o?Ü%µÛ‘K¢­g»§^t CÝ ñU‘¤ 2¿ûPƒã­#caÏš cÒB‹˜ªí·W&´n€õÀÓ¦…õ•µ)Cs,Tö®¹‡M²\QÎq(Ü G;)ƒÅðë‹RIÀå€éu :u\5]È:ö烅ñ{–S*þ=.Ëéuª÷‡OêúƳê8TÞøT»pK{´3^ø`U+Oº¹‹!2 ³ž³ö5Ÿ›í82iê6‹uwôpö„ÔÍ<ÕíS;fÀpï›Ô:;ÿ“$ŽãœÜu ÿ¤Â;V*{ˆWm‡ƒ>öY×sVlòëEŽuŠná ]NAS†á¬ðs ´Ö¤^¿wãúU(Vþ¤¸yîÒÈÉ{Ö(lPgôŒ7çé…MC1¨eýM†â–ºÎ(¡F£ø}Ô—¬BÜêÎà5Ì»Ê*ª‘ÜX¿ äo`´3¸Ìæ'Š›RÔoý¤äbºÂo>QýÄš{ùM¿rlC5>÷®3Ñ äo4ù<3ØëôšƒáœÇÖô{äÓr* §U›±ü\ùÜ&ÎîxƲ€þvX…dZ Ïö›dҰʱ¬•ÂíPÙCP€wÖð9«žu•ÅK²ã=knôÞ:»|Ò~ÖL¤JÅŽžL:Hö¸´–sýÚ£iÔѱ…A9er£6 ¿p’ª¬CZðJ ÕÊ^__õ¢î,•£ª;¶…ìXþ§GÏ™¡ÕHAq;¬éd]@ýúQ¸UÑŸ ùôí‘N^µêkÎsUާ«¢‹ž:iq çsÖ"Ï÷šÖïìT©éÎq¬3«|%Ð^ ´Yå ǪžY°Ã¥³–âwDxçwèÎM%±ó`”f£ÃNqA–p0¾øÁ¹ÉëðìU˜pêWð§v'¤ÇB ßBU¼Q݃L*/uÖ=’ù¤ •ásW}þ=ñXÕ%ö|¢yÖ:ý))«#wMJƒ§P '{àã%OÛOtVE1r}ì: å¤ì9³bzÙgÇq_œÚ_Œ|+ »|-Œ•$¿*•› "#ä¬x}¢_Ý`¼nÞ‹{Äño—€a|œgŽŽô´¥Ôs'ë‡ÍÇ>|þ¥nyŽª» X[a·ï*åO\á:Éì°ê=nŸHÕ-º\y—“d GMÏÎé98c»S]À˂ש¶÷v%á%u,ÆGcÕé ?ŒQvŒ‰5É/iáä`ŒjœÓø\å‚8E9aÛS¥‰)Œ…:ŒÂH{ŽÚ9i'G³'sÕÒüXË…H‚‚•ô™Oé]F¼H7îÂ{.Ü^^é7@ÞùDrû‘º£È±Ñ#t?ŸÉ;t?äØ†Ê …;Zïï§ò»&¹iò7úðÂÇC£@Àœ{ž×a;‚kd>¼ XX ä›V¨þ¥ÐylU÷œîµ-)• Ø•‘¼œ‚ÞgU{¼O¹¹j°ôc,,||xBÍ#ë*H‡üÜi'Jì˜t×MËÖ­ú8e(ªV9:í¤³ªxÇÙ÷ÂYNˆYw'ñ÷ÛßßIù†3'š*Œ§,“&zʶ0-ú~ÿ´uGÑÜèégÊFNAžœ’ý=‚ªo”žÐ²Þ(=q¶äIr#ÃIв£ÜþwÍyžÕ ú¾DÀåww¸ëÖÕà…Tù8ú³ ;¤n/Ü¡%ž–†M\ksž—ÐîøÂÍ¢<²ŸÒ¤>/¤Wé”ìëÛ®W­é//QÛžd£ŸÔƒà%V– ´Ãʇ«q’Ìœlf:8%+w,¨ò•›=Æey°³vypàÜ ˆYÝ7 Ð&š“¯Z×üú¹+÷[ƒÇ>ê©Ö”>ZÊšS0ùvà ®?s 0vìtÞZáYÔ‘ew„COðçÿî3îVN4QµøÔ+f=;f=Pq‚ Xõ_Ñðöèä¡V^8Ìã ¢Ï.ëW9žª‹…ü0¨WÈzxÈzÚŽ&#D JÙ‚ª‡¢^Ÿàøh?H<ÈAÛ¼íŠS8‘6p R\¥‚;§ëYÊXcÝ‘ó‡›Ã\¶#ìH̰ì ÏÛkÖü¹ýÖŒ}ñÑ~Zk°áÙ}¹—~²Í’ÜT Ëš%·Ò?¼+´ð>‰Â×…§]“…Á\®™ÊÛOoÿ†n×/ endstream endobj 2892 0 obj 9011 endobj 2896 0 obj [113 /XYZ 38.2500000 563 0] endobj 2897 0 obj [113 /XYZ 38.2500000 84.5000000 0] endobj 2898 0 obj [113 /XYZ 38.2500000 563 0] endobj 2899 0 obj [113 /XYZ 38.2500000 84.5000000 0] endobj 2895 0 obj << /Type /Page /Parent 2 0 R /Contents 2900 0 R /Resources 2902 0 R /Annots 2903 0 R /MediaBox [0 0 595 842] >> endobj 2902 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F1500 1500 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2903 0 obj [ ] endobj 2900 0 obj << /Length 2901 0 R /Filter /FlateDecode >> stream xœí]Mܸ½Ï¯ès€m‹¤> €í±äÀ°‚o6Á"»ˆ³‡üý¨»¥öŒ¤W_)ª[1’™XE‹U¯>XõæŸÿ~øço‡7ï?ÿçðµûùþóSv¬ŠìòŸÃéÏ/ÿÂÖÇî÷CU‡¯¿<};|{úôô©ýßoO—>¿ÿsûÛÿöð§ö¿?þú·ö/ìþÑéüòT™ªýùïóϦ2íoÙõçéïÿõô—ß~=Ø®›ÌëÿÿƒÉšÊºÓ4f>ýí©_¦9ÿùíë¯Oo.ðûŠ5Mž—“»üÐþjÿýÇÓOíúá³c“S•y•Ýò¡Ê^¿d›ö«e9úÐùÎð&Àà•1á?Ï\*Æ•F]ss«Ò]T…ØÛëè!È_»: ãœf®M”~káàš;[Ÿ(lg¯£‡ ~SÙæ£à©\þ`ýo‹ï¾<½ùhrÓ³<|ù©Üå›ç_Z¢‡Nø¯j_~<ü>Ëòì‡/??5ÇÒý/Oì[ôÄ|DO\ Ÿ8|Ç6èIfáh9­‚£Ádïá“ð‰ƒsƒ£™wþßa¨“áïà•âï``ÔÙ9±ý­öŸ¦5æ*wÏzß‘ãñùÔÁ»íàÜð¬Ýe·?|i•PpýÑÔ³óÁO°D1"Ì>¦üD—“l¹¢‰Ç…©v®¸+0BÀòRÇbmå2¦hTNrå TÜ5U& =f=‰È—¢Ø¹â6®HX¾èrlT¾l\½)" @h_ª–WŽQ _°eŒçF!(¾Êñ9Ãüi-Xk˜ËñÎ’+Ã<ú0^L7Æ2.žW×ÂXÄB¡p·…S‚¿ƒÏ)>XŠÁÑrâILÍR»T³ḩ̧ÉóöŸ{ŒÍ Ïgçs,cñ9!<°ûs1΂O F,pÖ~‡Ðg¬ñÙÂRcZÈ9”å˜,”åö}ÄóèÌ-H/aô-ÈUÆÇò0Hc³h>¬ûcjªbWÄÔTß烹{æ± ¥4æ+¬ T¥çãèJÁîÁÒ ËXˆßЯ so":¹ìs¢éäÕm”‘ÄvýxeÝG5ݳÖWðÉ<;²Ê¯®ÃËBMv,+SWÅHÜÖCÚ×ǺÉÎbŽâèlm^=é(üb åÇÜ].? ÅÔÄC|¸cÈ©wðhpxÖÝ1rÇ"/Oä[4ë =Á³6|¿CÑïO=ØJaJÎÿI†' 7YØ0L”Üé®Ô‡¿ :i4Å1kÜ+ê”íÔh—ÓilÿhÁ :SÇ‹‡F». _ÃCé‡BçË®—lvΠÀTøÃËWŒ§D‘š?â1¦_ûMç©CV‹–ŽiŽ)‹¥èœ< ¨‹V¾Ö‰c€‹ílãzb.y‡QXb¢Â¹1ªIx¨çg^Ï{‹ * ÝY뎷Cˆÿ)&>VŽ1ð”:Û‹ºg×:¨×Æ€4 VJhaÕ‡YS˜àh‚" v[@Ž»ú¿M\Ü%Ðo4Y÷æ´Tì¼­[5åkâMù _Lð´À(¬àK#f€ýîxÌz˜\}¼ÒY_½­÷'û“ïr׋{™eÂúwØ)3´àÓ>¢ÒØ«›/ÒÍ/!“G¿1—á,Ö „Ù¨Xà tÙÏ87ŸAŒ1°Q½S#äÆÇÚm̉ ÷2’ó# uO£êz¨{ë±ø@÷®ØêwþZ ù"ª²Š¡Ž.>Å93Â=ž$25O%ídÄZ)¾ƒ"ÈAœI¨«Y"éÝõeÀcœô;£iúb Ø2н )ELfwÂÑ¥åÁaö8‰H"RD:B‚¡0ÁDű>"¯f¼t""ʤÄJ£R@ðhD:Îz‹•<ås´÷MNȸÉt!3ʲr  …, bùÉЂÁ`ªˆäînë«*Ž1*#â0µð.ÙºZŒnXŸpJð¾÷r»¦Ëm˜r¦2 AE“3>ÆØñ^Âw%è&X£ )cºXЕࡼ€GA­ O}0Í”`³åE®åëSa²ã%ëâÅd>¢'ݹ,Žv˜ªGÞy†ï4ðü*׆Áàwh´®VÝÄ;^éeMÙïïY¼¾câdÕ´ÛÛäýpæVÿHú©BÀ‘ª",±‚*v•œŽar pˆ–¡GƒÇ•1ëaªg©VŽYÏcÌØ@º…iV÷?PuNâÖ i¨Ù| ñ”sgãN#l}¨.„À¦‰Äª…D•ôÈüQMâŒ:È©zé±m¯\i‹1ê6Ikl"†N¸Y?‡ÏÃm¢Z/N¸šLHO*¾>9§©†bØØ7ƒNf«;.1V(ì»Ü¹wƒyöúœÉšz°ÅŽ([ª ×x‰Òõ³ ÊcÎw _æ<ãÓ r¡ˆÉ‘óNRåD\‹n¯ ª„…ã•Ô°ívÖ¯Y,xQæJ'ÓTC( ÛžH·ÔQ GиÌnŸFìÏú…‚¶Z˜­=åõÖ햱߅o¢`Õ–2R™ ÷."¿Ô·4:ð@ù¯Ûèjª­[ÖJ¡E1ÑöS¹Øë¦Eë;¸ |„ij*|‡IŒ”Q—÷C:kaÑÞâ¬r<Ú}l%“aé¯/B¦òCU8×&šÐM§  £ùa8Y ¨¦ë š“‹Èè_?™ª-‚™I ›í•)8á ¢EÆm<‰Õ5«Õ#¥^EøÎé å'‡‹ß*Ù(Àdê ÁYïÐs£ÉØ;@¼q'™r7±PáRvðÝÇÕ ŠWç IÐJXC…ËY¥rÌ•«52ç]· /áSìXMPÆ֣*™«QŸ±úbÕv׊»Gny“ºÔdcK—WΩZ’Nëè&™Ûfe¸µw¼ò®’®š4wŽ"xÔšþrŽUðº×Þ&)ããÀˆ€§ÂæåàXÄöRQщÀ6LÇݺp®OøvCeŸ¬Í¿^é§T­†u¼~F¬nµ¶;…Z®‚{ƒ¤Xb`àIÊli…lýSCLºc¸ïœ†¹†Ésݦ¯fµ{)ƒàIJ$Ó¨ŒÊÀA,yðhc ¶¡µŠÝ!°J ᗻϩd³==lÛéa!ɶ¬ U`$ÂÒHÅÜÛÒˆV)ˆÞ —»Îôç6\Ì• /¥œÌ³©XþrI— cHY¦Ä²æv(twßyî#ù†vÕ—„ê‹\œºÚ9^õæ¨ ®e¼?B ýÞ´ÿêˆiPãÕ•šX °©H ÔMzÛNƒ…)~Z~Ã’é:-8W³úñöé`”ø_Þo—`ÑL<Õ4à~æ;ºåPðþŒà8ƒã­¢ÛB9ç'°Û|n×#¸àœ¹WKÎÉ-Þãjc÷Í:<.t‚›h[/L‰qÒyÔaÌX¹S«gB<†Y?†Kõî>5¶¥âKÚȶjV³k/é«z-Xçb•*¸ 2˜tû²G ðl:iî~¯'P¾LŒ;6ícTI:ŠQêT¨Þdn ³“i‹´ÂŽjªU} »SÐIaÍÝÐU]v (øÃÀ l“`_§²GÂÖ e0~-Î׽䲉:Bº&V¤ZzAœ%¼šÅµáŽ®;©Ì` h2Ÿ×ÕzŒ¼c %,±ëk¯¨\—&ž¬ïïH@û3\œtÇxà¸Æh}L7ÐÙš9E–uÛîàÚ¤ƒ+,*Ýr dÕZ‚"®-‹!ªÜˆRͦ ¦M7QßYù"nHç¨ šQ²&qY'Á›E±/§˜³ÿh1÷ø\«-•M5Š£1ùcºY ºå?pòì€pƒ#, 5ÎTCÑÌ7*ê-ëj¹-«¼Ðº„rDëÑînèÊÌ˨QF6#Έ¬T!ÛZ˜Xͳ‹¬ìnž½\ý3ɳÊÍ"¶Ä‚¦Ã :8µ o‹n«RlzFG²£V+_¿ÍÖLå;5Ëñ•Òˆ‘œj®“Í9v.3ù«LŽcˆ¤íÊ«j¯ÜÛ‘"DŒ,ºg¹®°Ý‚JÊ?D°¹ªK¦`Q4·[\Sïäð·è‰Å3¨Ðs?c­ÇÂ'îAX³†»àðzšHöIiòןô²OÐ {ÐS ¢0•k˜k™ŒŽ!JÆÚ‡ÐøG2ݨG… °J‡T2§Æíæ6Üʲ꿚ù«Ó L¬ì6Ø+ JeB’átP˜BšAp€¯³g˜ÿqH {0—ã#$~’E ØáY3þŽâyud”ð¬Íe#ÅÍç&œ,ü|¶ñ Æ’Ž–O¢j£¢š]·°Ë1ª0ö©v¶ íðz0á¹aï;æe|ž /?•6 ëEÃ'®SG9qò(…‰Õ®·šv䙳Y•³ç ?Éõ<Çó3mŠfJ=Á’Û Xò@(У6¬ûñ¬1zÇòs)–¾X÷cZãw„,ÌŸG,á°• ù ‡Úópá]ïÂÓì9k®yN”DˆR.©›iq‹OnÇÙŽ+ÇØVJW4ßïÁ%Ž+š&zˆ„+„ü›W<®À|®0­"Ü®0Y~“¿"ሆ 5R¾4+gu,BùFãyòLVß”C qÃ33[z}Çâ1¤Ýê^v¬ûºa-ŠñFiãwÓ*Ámàwc¬»a¦Ì¥ãÓs0ð p–—ª˜òq,AÊcdDÈ嬎„¹7 KÅäv–—Ó°TL=¯OîMw§l_m6c̘¦·Î]¤‚OÆùkÁsw}²„k¬DùÀÙ†Yñë¸øtcvÒ£Í!S‹„(&\ ßKkê”Ö |ŒV+MLµ@X½]˜ÏŒÛ#)dÓSUC:ÝŽM‘¤ÈTö`j¨u©ÝS…]¶¤6qŒ«LŒŽ9⻾¾‰\K–S|g_Œ/ý–+}Sø´% _š¹ýú@&düŽ Æ˜þL2<7öV\h}ß¿°¢A¡róYƳÃp>ãÈaΞ¤Äng¢çJ,Ì'´ú`¶’éo£[{Å@¡ÉÊ¡VÜ´)}¿ñÀq°…°€»¬Ê©áò°Ù˜ xcÇ)aïPo÷bcçw7NJ/½„ɳ£uÉ7"ärÛ4H0! ÛÌ Y9ÕÆCZÄêϹVchPeÀèêcdDŒ”âè9áµó›RöëGXtΡjÔ^× MàÒ‘jî´r~>„¬k¼ŽUì(„ÌÌQ7Ë(¦SuGûçð­U¢ù4÷(™zJǸ"dæäU<\»ºvÕ±¦h{ÚÕ?_œËöh/vç‹'wp9~Ò%@Ûc9t…Zùù}Ç͉ͩ¹}ìV:ºÒíŽoäCöšlï-°ã/ì—Äâlbßé„°ñZú‹Œ–áN¿·3îgŽÅ ¦*d<šÀ˜q‰èÄÒKcªš9ὄ ÓÛè*˘Øq7±ZÌ æ¥¸œ•‡OOÿ8úW” endstream endobj 2901 0 obj 5480 endobj 2905 0 obj [114 /XYZ 38.2500000 296 0] endobj 2906 0 obj [114 /XYZ 38.2500000 296 0] endobj 2904 0 obj << /Type /Page /Parent 2 0 R /Contents 2907 0 R /Resources 2909 0 R /Annots 2910 0 R /MediaBox [0 0 595 842] >> endobj 2909 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R /F8 8 0 R >> /XObject << >> >> endobj 2910 0 obj [ ] endobj 2907 0 obj << /Length 2908 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸ÞûWx]`ñ¡¢@’;)ÐE º(º(2ƒfÐÛYôïW¶$ûšòG‰Ÿ)ù^M0s3QDRçÍó|÷Ç/ßÿó·ý»_þ³ÿÖÿüøeWê²èþÙýðòts迯›rÿíûîyÿ¼û¼ûÜþ÷y×½ðåãŸÛßýo¯÷jÿýeÿ׿µøSÿ—Žáû®Vuûóß§Ÿ®VíïŠóÏãŸÿk÷—ßí=®8l׿úÿPª¨œ=cbëçÝð™êôë·o¿îÞuˆÛEkešf¯¬±{å¬Þÿ÷»ŸÛ †å‹ƒ³JÕ•­‹{6ªõq'«Í^i×îZ¸ÑF§_2Ë«‹WF¥[ütrq¨(S©ðê’È­‹¹-#Ƀè¼| ø»¦N·øéäâP‹WDnK;¶¹!"îÑeùð×Ö”é?\*=r«K"מ©¿L\›¹teš„”s<¹8TäâÕ%‘[W®P]%€ÐyõàolB©p:¹4PÔÂÅ%1Û¸¯Ú@ߥc[S4UBºq'Ɔʀ[¼º r2=c¹ÆÔeõ¸Õ&¥Ö\(=jñâ’˜Õé7 ”íeõÀ7UB‘p:¹4PÌú‹ŽYŸ¤ûpK¼øáëîݧ–تýןۃuž~|ý¾³íÿ¯m­eÿõ§ýïÛóØ?ì¿þ²³k:×ÅñïžhwzÒWTº|ñDiô¯V|„Oà;Fuû\66pc|¤nã¿¶ˆIÓ™>PËÓžæPÚª©¯NSOœ3 @E“ð¸µqjŒUH‰nâO­ø=:ê)þl¶ƒŽ;ÔUé}iaðãéIyhŇš‹|ê÷>£à¿Úñ”2ÃÎsPIÒþ(Åvʪp^]vŒWV×Äà§Ã\Pž(‹ž˜÷èIñ®ÖÀÕàUÁ}>Â':þ{)31·BîÐP Vcä9”¦]ƒ÷¼†ùÀá(LÀk!ø=˜?ËGc¥.æ)㮥ºfpÌúK …á¤õ]#kA¢áÙð –¶hð>XßAìù6±R…ÈÕê!ã¼£¨„ÐûYåJã2óM-;ÌáYhóó€µVÚTòް0B)‘Ç&ÕÅ£À[[7Þò×! ª¢É, új=lÃ1g ؤølðЮPWS÷x¬U¦8÷ѾcnYeìˆiÖ*£Lm½£´3á) è‘ rm"DUUç‹ô¯ËÆ?®q&àÕ»Óç– ¼àÐ Àwá•¥âv 6û4Þ‘˜ï „sðj_*5 w!Zø!2ïÈD^#`Ž9`þ"˜b¨8A• ¦±âÀjøÔ#ãj¦èaú ½uµ§f|??ð`CÈ3 ºõi1&tÞûn=!ˆk±À§ûˆaaͦ$gTT¢PŠù r ~2Â>’Áã”&I…É¥bdíLÉJXc›ÚU@rŽ!¦~BåèÊj¶r”LÒ›cœŒ;’ZŒ"Ç‚”PkÂ7VB¢.t¢¶ð¦óëDJô” ! s*€A,§ ­ÜUZWÝà´jôõ×%ÏÂ.ÊÀ;b968%ºöà1)(RžFU>vF ¸æ»@×äžš¿#ŸòM$kD¹Ö”©èã)paìMæúŽ O ||Sp¢æ*+ °+¾Œa9¦;¦šP¹]Ó¿¦-`OÝXªÚc+OñoÕ12צ1¹Bø¸ÃodeË4a 0ª¢·mgK"°ËZ‚²©ÏÁ¾ó‹}0?h—³¬6[5ØœïY¾Lá̸ÐÁ÷ê­æk’gÊ­æk×®£æë‚®Õæ® 5_—£®£æ«®»æKÚ/©gáã`n‡'°Ã[O±n‰ ²öös-.° YJÄ '5j“«ñ¹ÇUÜ䪈Ãï0û`ÍŽí#ÂæÍɃM9"Ø:Á¶1þnBÆ1õ‹ŠenÄ“uØM5]àÔW&yS"PVq£ÅwÐÕ˱f¨$1øë2žÇ鳯fùêoâIÖ*ÖÀZë­o¨b½•ªb]…Ýíl™™6±\aªöòÒæXЧÍ(Q…ê½ZKìùPÎÉÃV»ÊfæY»7 Ã³pG¥=0â–=»¼áçá'ؤ  ƒ»°–æÂªñAiÒÏÒµÊ}ÝF?ÙéÇ*3›~°Þ^¾ŽZÊ]CT¨Ø*qÄ8"8È­š)‘]¸1ïC%̧-ò©ö Š®¨ŠKJT:†Ÿh*ýƒ„aŠÄÙd8­‡)bbòŒ™ŒF&1‹I^gJ'§¯ä~©èD²ÃréD›Lžòb ø—ªµ ²û‰´x[õr¹(áeºôiL7šŒàÕfÔQ®¯ÇÀòj&q—ˆÀ”§^Tµšmï“­V¤ &|Ù*}|Øùb5CEwSùJ2“•G4$Â(Çy1m–»©‘Hú:¶L ò ¼3ÿjN]´˜âIüéL Ùj½-Y{yÒ GU g®¡ƒ8m«ôðèBøOø‰ì£væaH“!Ú\M÷&Íœ ®FÓLSöÂÓSÜMéƒ*&J©c pE{ðÚ…f"ª_¨˜¢Åë…ºøÝED:a1µoÌ ·€ÆaHT¶ ãà îhÙÚ¼ÎbqÙI‹;&mé"$â|Ó>C-y¡f›iîvÔ4Èõ„±B…%™;]â¨!Ác|õ _2JåŽN'F ˆúw‘¬oqw˜ |Ϧ ³kÂWgJÚÀ¬ݰe;½2!râÚ!@“4L´P:¼ãmý•B) YWµï+jòN+¿eáÒs&nY‡<ÓåmñÄ D!£×ÑÝk15·µú½oãÇ6ž Ý@l\¢w7Eï#“{ϰá¾Zµœ­’P»•FùêMTL¯0ׇ fËXÒYÈigõ$f)Ê]\…o!ý•pRȪmÊe¹µè¿³µèœs¤Õø“6³/§b)ÑýP¶ðÖ¢4]YµVºP¿µ[\}»ÅèÂG xÕpZ\üŠ';cäㄌ/¿#Û¬÷šÅûà.xîõû ìmjãÌš[ie§Û±¬¹é¥Åí›p \Že.n„e!þHÚ=0–hOÄ´QÆÐÁÂbkïyoVÓmb¨‘LÃ=Œ 0L 7lspË*}›{Z3Oy©°É¥Æ#~Bt0 ÈX¸~'ð=ŒLÂR¬,~p#µ@ÛOŒæ>€¥–BØô¥Ä€NÇ­Ó¦ÚþÜÂ)6~‰æm˜ª˜†•XË6ïÂ}~ð©3µÐ£Ýâ³#?˜ËcàJEX¤X¾QãHà óÂ:l.]˜iÜË>ÁZÁôýß­Cר• œ¨³ÕpÍË–ñQ0N4*Nj'Rï"zKŒ“ïèúQb*[a Óÿ'ƒãfüŲµ¯-ñ~~Òt-"½("º­0mˆ·ú<Œt¦ÏZ’2¹”•`¶òÔÜštQÕ¹:UÌŸ¢™. 1ÞÓz&W«0 Qû1—3:—“Fý·£hEzdmg7ôwÆ”RŸUÙV€rOÊRn ­ ‘8 ÃäÓáÜì²ÅØm‚Ý@8„s>qοìTR¼áŒS9ò,Lc|Î_yÚtiî™Èþ˜E+kNg–-gYó—¾Òr–¸pSŒ‚£ÞXÌ3I-X©Ö`@$- Ÿ Ì(‰ËæªÀ5.!Ó›„\÷YIœmö;Üdž(DW"‰ës㈌iä¥R›ÖžF^©23Í2©·¢8âlyÒNjåxó7lþ†€¿ÁZ`˜¢ÊÜpÉ\†Ô›‰„–ªö°-ÔÒ8q«%™¸íü8‘ìx¸˜°¡hËajæÕCf§à(޼[M@gþˆÁÔR""UÌLŒR"E€ Ý Ï+`Ù2Ñ[ÖøK™¦l„¾»5à±')uVm=¥µÅÆoå-51û¡‚å+ìH\c¦«Œ’Opž !ÂO ¦HU6í3Ó¬ Ù!~3 kpüÎü¬iáAÝ>ñRó¹‰>ÿ!ˆ¼I¨]Uú9Ù>á¹fžŒÄID¾ìØÙ ÏH ·³Q~VO²RÖy”:™a‘t ZÕxÇ™¼ä§P]ÍPøL çKa/s£ŒÌŒJÙìpBåËÍ2köÊÝÌû눬VC;¡Þ6WÅ¡»-¼8Ì'ô¤Ç]yÐþ¯†ßé{ë‡Þ逶’½›‘ûâ|êËÝÕ™kë üÒ­¦áü=½¦ªFiX> ³õ™ ·öÁ0èÈUUíùœµÊå§®íʇo·]pD¸²³n G Û9Ãë·’¥ ɼ•ÁP©‡(.nñ¼:ßç⓯òÚ»¨3*>€aÈŒ?²b~‰ã§ ›¡²ÀÓ¢0)H”^oµÑ),[ýZf—FÌZÃXÁªPÔÈÈvM'lÙ÷4Jtõ7V=<ºË*d†ã‰L ¾#Ä‘vZ^ékILj¹b1"R‘Eds$˜K¦ Îüܧ€+K«ÅÍØmîáýéÙM1ô ÛÊÎCÉÞLin`Z“ðNL¤¼Ã$Þ2$¢IÿIŠ‚òð™VŸ%â³@éÛòÉê°‚wT £0OÀd+I#æ:P•LI3é!©W¶ÜzÕô&Z¹‚•¦>·Eg[s…Õ$®vT‚9¾×0á!ÑwY?.>5%ÂDVâzÝ1©ü1qWÆ¿…'š«(X.¤x­ÁÆÙÀ„%16¦²«’føÁПrž: ”Òˆt½”M÷g2 2å¼3L ¥Î2åOo’4J_ˆ Ö(±ƒ‘È8 „:–?#ß2v·O½¨ªF©¡3V[<š8¡Q1’'a4XÔžâÌ–—%…,qUAѽ°;xODR<;ë4g`É™3n7‡·°Ã;—ë+goYçç&ÄAD´»šÁÔGô‰¢¹ã¾…Œ »W‰^mÂÔ·xX“q™ã³º B)Ä8’©Îh«è˜çª{z—®½ßkèhZCííi[¢›Ó‰ôMéaSèòîÕÃÔ€VLå˜*°Ö`ôã¦mC´ŒOMŒÖ ¤J0cé× Maí=¸nýhŠê<(UL?†ÞF©³Áq.Kî/€Î¯Àc¦WfsЊÆ6GðëuËʼnlÆ/û† ‰¨xÞ'b´î”íf%KâÛNÖ.Oi½¯yiÿU™Ò8ñdŽô.øªPþW‹ö"œìŠ÷a’Òñj8}&=3w½léÃéu Œ’`0ÇÐÁZôÃz”ÛŠæð3åó}LºÜJ÷hn:ö}sÜ´|leã³WÅg>Z]•×pÃG»Õì„N­fGÔ¡À\.gzš²ž\m¾Ó–ÉÅ´'RÜ3·£ffDCÍ)‚9i #«•/´±eÄÜ>yIÒi9Îûê zãíÉøö)U1ˆ+"¨€%M®Á<‰FL)˜hÜKØk›¸÷–lMÓ^j~o\Ù‰,:‡ÐØ1#•àò9£F¹kêØ¢[´½³E ¶h‰íyÑ‚ö×þ¹kA©÷yê/Ì0A››S£ÛËL¡ŽæÕ^ÛkÞºeOvЮo(ÂŽ~õAw#|Wã'}† >T£  *¨'´™j1yëlŸú/Y˜½RÃÖ¢½©€‡†”Œ>°''ܼÛ7>CáÕà;= ª¨O‘HÊÜñ÷퉯î–]ƒ¡ I¯ L¸&zñzƒ¤1T$\LY#"\¢ëÂz!qãæÆ×bZx‘Ê3) ?ï?ïþmfTš endstream endobj 2908 0 obj 4746 endobj 2912 0 obj [115 /XYZ 38.2500000 696.500000 0] endobj 2913 0 obj [115 /XYZ 38.2500000 225.500000 0] endobj 2914 0 obj [115 /XYZ 38.2500000 696.500000 0] endobj 2915 0 obj [115 /XYZ 38.2500000 225.500000 0] endobj 2916 0 obj << /Type /Annot /Subtype /Link /Rect [53.2500000 147.500000 116.250000 154.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 2911 0 obj << /Type /Page /Parent 2 0 R /Contents 2917 0 R /Resources 2919 0 R /Annots 2920 0 R /MediaBox [0 0 595 842] >> endobj 2919 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 2920 0 obj [ 2916 0 R ] endobj 2917 0 obj << /Length 2918 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€í_ü CÃrr¼Ù,‚l'‡üý¨[iRúØÒ7Ev÷X6vÇ£G‘ª"ë]Åÿù¯‡¿ÿ÷ðã»Ïÿ>|~¾ûüTWõ§¿?\^Ðþ8üûÐxwøúëӷ÷§OOŸºÿ{ê_øüîÝ¿þwЇ?tÿýãðç¿t:=ðëS£šîç?Ï?ÛFuÿª¦Ÿ§ë¿<ýé7‡ ŽÃ “ ÿA)U×çi\úÛÓø™êü÷¿_ÿõôc€m£hmŒ©Ê{P­Õ‡ÿüíéçn€|ul­RMm›ê%5ú4’öõAé¶:øù8ç¿2ÐUà¦nò?Ï\)ÊÔ* \’²Ö ¸wMüLÐs ß)øyæÒH) KR¶n›Œ” ç@~ãL>àç™ç¢,.IÙÖÙŒ” g@¾­T•²ç™ç¢,.HY«ŒËGÙgè9(«Z•øiæ™(‹KRV7>#e'è9oLF†pžy.ÊBà’”µv`i­Ë€Ÿ z仜”=Ï\)#e!pIÊÖZe¤ì=ò•‘ÕŸgž‹²¸$e}ÛfäÆôÈo]FÊžgž‹Cà‚”u•×ù(û =ò2ù„x?óL”ÅÀÞeÝéΕOv¾{¶:6føóB”µUFjOÐs¤ãt—Òn&jÇÀ?m‚gÒ_ŽÓo‰ß~yúñ£²'˲>|ù¹›[?æùÇ—%îðÃÉhíáËO‡ßV•ùø»Ã—<µÇZ»qŠýê¼cˆ;pýÝQBká;¾£·cÞsÃ3€³Öת†wÞ‰~é{xãB{Á_ºM”mýwªòyýwâ÷ÎÖ¿Àw·à£[}tÕ/{´¦"=Aï(s4Ú«nªñ¢òGßVçoˆåÆWÖ¼3lSst¶öÍåÓÏÀ?“­,ü 8°þƒÇßåÅdS)@Õê˜8êÊ÷.MÕ tw2®.­f_€)VCºxøAÝBLarãÌ«2ÛÆ{/ãÄ8^`ÿ`üá)ah v#ÊT†q2®uÓšh­+¼'1ÂkÝÁ}Ü Ï R$17¸w´"8ó¥7Û»Ô҆Ȍá‰;P.'–æ5 š‹1,•™Ab­2ë[Vj1{/󞈩®Þo— ¦¿£Ô¸Þ^„Y»Œ<^é9“Ç|S”‹Þ˜™–ÑÍwèxTÆÇûIe_³ƒ‹×7bà ¡ò¯—- nF¨… õ‡„«ŸŒF¥€¨NN‰ü›û²ÒSÚ.K0fŒâ™Æ¼A…™Y˜„€ 4P® ¶©"³l÷uWeNÁä},™îGõ¿9ûÌ Xšh´òö¶.ñˆEäUuëÚÆ«¦#àÔ¬Ï&"° …ßy›{×7FEø`Ü¡vü¶¦v«%9ãÆkóÍj™›Làûn¤^Åøn2{‚Þ;¬èUzUv‘תvµÈKØQëua+–îp=‰Îú6Dñ=s¸»L¯»çT¹!í-¿£ÂM¹˜ÂSÆg;pîêX7*Œºõ3PîXµ&܃ؽÒ/=¥Ç[/R‚Qé%lƒÍ5O3#Lqc ¤Ù?` @û&Þ›Íul¨chømá;-zgX¿ª9¶:d1UOúD¤Ã kdéKûwê£Q:ZÙxï 4M¬x`}áþW3ɇz`™0C-M3.Ohæy+õ±wä_.é i'Õ{xgpºÚÜóW´âhÃj\B{e,AÃKÏà¼S_á‚Ø¹¤ïURKâzNYc",fÏÁÂùaqÇÈåßHÊÊœŽ‘…“é˜ZLG|xµ&d"• BÓøx)U8=ÏZ8PáYÃt>…qg`!®+±èQbão¢ÅlpÁïENâšæ‘j>ÕÚŸ•hÚSSÊïãï¾:z_êúô£Qj¸ªµ›Î®|}ªíQ©V{¯¦§LÅ\ŽÑ=?üîO¯¢·;1Ñ]éÞ grzÊP|8Æ/Oo“«ÑE/°¿¢ ûµ°÷[¾…ÊhIXÍg¶·H]‚,²°¾¹Þ´AÈ`)›Ì¢)Ù÷Ã!ÍlÆ79eÐ^‡1dÜiG/c¹­YnÛ.°\_©ˆž®Ä,÷ü”  ˜Ë1&–Û6K,·­c–Û]™±ÜÓS>€âÃ1ò³\_Mi­;˽–{«fz3^Oùàg@fIú¥û¥š,ÞM}±HšÕB¶§Þ¶ŠDÂwŠfÐ%ŠbŠ/11vŒ€âÃ1 ðö)ž¼;îƒÏ,&#(üÝ]@Ù»‚ÿ0BÀ¹P¸zI83èîÊLœž2s9Æ$œ]ÎÌÆ0s!pzÊP|8F!P«]Ü‘.£"Šq¨.Eþm °ÍÖ„l³µKls–[áûÜŠñž2s9ÆÄ6[½Ä6ÛYŽH«ælóô” øpŒlóùÔ]K¿-]¤d‚ñ"ã7@D © S>ÆÔ6¢:#ç*Ì"Úp2{o—sùë–Z3¦5$ŽhÄõD¸jÖ-á*(\³“¨AzCï{\™¿4ˆƒ½> -½DÍÏPÕú±jî%?™Ïúªl4ÕÂÅW7lè­qé nÛ±ƒ q 1vp<"-Q‡…qkªh\¥à|€®œÂ3ÀT€k' “­ÂÐy÷ûBè¼»…ÎÏW"{¬ÊPÌåƒ=Öý¾:ï®ÚÙ³Ðyÿ” øpŒìö˜­¦Ð9>O$¡Ä¯?Ä÷ö>qJMÅy_ŒeCÌúbé{™Õ*ƒcϵº/ž­Â0{÷ûB˜½»êcf>³÷O™Š¹cKaö1 ³÷OùŠÇ( 0¦0û [nŠ{ìüt÷Á%q¾ûà’¬]T…ÙEˆ€ CçÝï ¡óîj³÷yè¼ÊPÌå“Y wWõlŒYè¼ÊP|8F2…Î)²s¾ç|Åj]‰®†‰Î[-)eƒ(ÍÝ4‘)»%:Z ?}}†òÍ2Cd×_©øÛ®d˜Y¥ÆÆAƒxáô/sMî,ݦ©؆®}8ò39Û‘¯p[ümq¥c\VuJZÀÝî6Æu1Õ=ƵǸX¼¶WâÀcÜŸ)>¼ïHÓ" :m]EìaêW;Ÿ*nAùžX²xCãíg€†ïs£š‡²!Á1îoy%ZíU´d İuØÚ£ûÝ/ø“tÜÚã|%ö'é±µÇ3s9ÆèOÒK­=º«.cÞÚ£ÊP|8F~’~níñ|,cl½¿²ÖÂÇò:M&aâ͸Xï‡K˜”·O:˜<#Ñš)Q¥Èk'â,’E¨Äy=²M¶ÕòÄiØÏ³û_òû_´ó!æ–šAá _ìýpð“I,›±Œs¦±÷CÃ_Š¿瀷R„¿îK1jêPèˆuù„† ïè‹v…/R5M]ª¦©Õ‚ªiê83åt%V5ÏO™Š¹cT5kTM3˰1}†M8“ÓS>€âÃ1ò«š¦®CÁq{ýD™DË&“îæ=ác©˜€+ŽѳÄQVLK ‰\$êoMø¬®BºYftíÍîs&ʘð|k–Î鮯I,f~¾Hÿ”  ˜Ë1&i³t¾Hw5NÆ1óóEú§|Ňc6Óù"L¢ Õºûbçñ;ÏÈã÷Lû3È­žðc 6‹Ëgá1†ØLM£ÐPÞ ò ZÛLG@Qy Å1ñDt™ˆþâl@|'1ÎÛ‚4iõÕù wò:mZÍçöç:Z¼FðZ„î+‡ÅDrÎÊ|F£)¸ÁÝäq30~/@u‘WË-zµÜÌ«å¼Znòj¹À«å"¯–[ôj¹™WË-xµÜäÕrWËôj¹Ý«•ß«…ƒÉLµSf†qPÈ‚›qÒû†úø‚ÁÅfïbœàfC؆XŸzN•¦ˆV¢0Ö¶)©³­JÙ”wŒƒ,îÈœGYéXdì¦î6S·®Fmhà~KN="¿^ácsp†?“_ûuAóW,$Œmlœ^[,²µ EtäÚ=ÔΡÄYœ8ŽŒMP"9žI Çæ±Â èøNØ® RkrY8Ó„“ÿظFpâ½hùC©2 W’Å þLñ17 “õ Îñ.hƒ×ϼ‡!µ°+-‘‘Í‘µ ¿Âs+¸.™’#¿7¨±M¸¹—TÂH½ƒ¬âRéô Ò6ø*˜â†Ç:×íféà…)ÉÐ8Ñ>‰\‹¶à¸#Ì®9ÑcOÈèt<'Ÿ‚€Ä‘;ûÄ! œC³¾©ˆ°Ôa$ï†3!K}S³!Z 9¹Ãºaýá"$fá3Ùq”3]Bï’i?+Û )&\b½3Bó¿õ­½ Ç”·0Q|Âöìf†ØVÅ’iCû8†T„¨¢º¤2Y"C8q4’hÓ;*@J(ˆÔ!m„—hÇÁ-}ëD¹£Ö*C[‚?S¹ñ…ü²™é¯U«aHÊ7%Ñæ q¢hÇŠü²°mëH&˜!¦³¬[±%ð–ÝÀŽ™!~Œû žï!ÜuuÃâg˜Þ0„„½ª<æ7P±Þüq=º6TÍ<¦&ô˜šÉ†!ÖÑêŠÍ?§e.§%DêôN§ŒHVUaùµjYÅšx‹Ä ˆ4ßÓc\`7/¬ÝMž$‡ËÓ§K¢õø]»×ïF{Ix’™­WªB~s`;gnwÝÄ '€ˆ4uctD&oá»ñf>d»AJ¹ßpô¦J¡³{Î|*¥Çáq¨R(Y)F|cwÞ,A´¸¥]’ºwþy;Y—½³GUÇÞÛt1ïèΰ~ÝQÏJ1 4üÎP°ôN‹Þh§šc«£ã8Ô$ [³$C–¾´§>šóªZ7ƒw§Bs³cIŽSËe<›æ6$à/ŒSašbh ´·×ðK™è¦vô‰ÆbsiÖox…$p¡­¬çß3”'lÃÁ€ëzd0+VGµè¡ ¢€«iG´C¿öc;X¶teÆ¥¢õ #* =Z6['!÷×'mQ‰6²…ð÷ì€Æ³ÆK”ñˆ1V¡ÜQÞæGŠ3<…‰ˆmq´‹î–ÄI¸kCŽÓ rúQ*É(ÊXi–›/ÜÞ&ÝË„Èe’3‹5^ÜCýB¡þ K‚?'¨!‘¶>gòL_L¼7™È¨kT.ÃÎp!º²æ€ùXòQ‡Ždk6DR¿¬Ü¡yWk÷[3uí+Ôj2qø!¬ÙÆÝ&ðYv‰^°¦^·?<C[wÜ\ž<¸YZ?Ö‚gIG½ÐÂç»ËQ߱ǂšµhÙ×p´éR›ÉÁµèŽUìÜÄöáà*Ÿát7¦~^9¡íÖMgÓ9™±61}ñÂfÚGʶ©$•Y사.S„øê„0’ðÜQÝ9ˆ£4dΔ˜Ä¹C_ïmÎå Dc’bI¶…’N‚Ñäv¬Ü*ES863«tÇ%7?ˆŠ0Ýt„sD 3[I…œ¾_Ç&"*§2¿‰”ÉR©~WÛäló?ÃÈJ`¼–ë‘bµt"šÿ~˜ú¨ÔY$ºÖ»µºÝZÍK•Þß×Ü\O~{×µÑdËü3@[S©¤‡þr¦b p©Qgøqה؅;Ù}ȪR«éHù^=¿y>R¢CSƒÝL¤@6qƒ¸¾9Õ†RšÛ;M˜vp”w{?D©Ã˜òÑ׬7Ï…ÎûNëè#†wN-ÆÄc2¼l‹¸`ªµ7¤ZCî¨íbúÂì5áÚ.&=›q»Š¦¤‰œ»–Þ…²ñdcÐ2ìˆ*×ÄJ]‘Â'Þ>ü¾¾HwKobY'¨ÞÄsü2øfÒžòœ®o+M¥Ý¬÷&f-—Ù VÍ|ø,)|Švva×NHœó]gJìÜ-èGP.Ö¤°›ý®¢UâãVEkw Îë‘¿ÃØ°l0çÖÍT²ç‘ºN˜¾d}­²€/g¨fE©uŸ¦ÖZß-çòÓp´n×nÖk7Û š˜hg©S™£„‚g•5‡óBòÃYeÚÔ—þùôyÕ)h’ûö4…hu¯Wæ©Ê ̰ eq”’°²™Tm ‘Í#‹*Uäælˆ9ƒ‹*_`lúB±¢R§=¹nF#r_i‡ª·å†ØÓÞZ¤¸•&\¨#{Ê&†Æ­2yŸŒ¬*dÝÊâ`~–S!ñyûØ*õ=L¹6Cþ»lît,ñ¨LM&!£PV¬Ìù­{W ™"ÕÎuï2±ÅbL|)Þ>j‰J<¯µ{Ã)ž~µ{ƒSÊ;§øâ¸ N†=E¬D~Îí‹r Œd%:XÀ Áïm3ý"zhܾ¯ƒSM!ö}‡¦¦ˆqȰ®ÇöV›¶LŸKYGpÞa+¸Tbìk7> endobj 2931 0 obj << /Type /Annot /Subtype /Link /Rect [345.750000 262.250000 422.250000 269 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters >> endobj 2932 0 obj << /Type /Annot /Subtype /Link /Rect [102.750000 686 226.500000 692.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://en.wikipedia.org/wiki/Aspect-oriented_programming) >> >> endobj 2933 0 obj << /Type /Annot /Subtype /Link /Rect [241.500000 686 286.500000 692.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://en.wikipedia.org/wiki/Aspect-oriented_programming#Terminology) >> >> endobj 2921 0 obj << /Type /Page /Parent 2 0 R /Contents 2934 0 R /Resources 2936 0 R /Annots 2937 0 R /MediaBox [0 0 595 842] >> endobj 2936 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1700 1700 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 2937 0 obj [ 2930 0 R 2931 0 R 2932 0 R 2933 0 R ] endobj 2934 0 obj << /Length 2935 0 R /Filter /FlateDecode >> stream xœí]Mã:vÝׯðz€ñI}A€WÝÕ²Ðè²d¼Éd0x=Hgùû‘-ÊeS:”x|IÊ.½ÂLU[?//ï繿üË·ÿ<ü÷?¿|úö?‡ßìïOß^ŠcSÇÓϯ?ÐíÑþ}hÚêðÛ—Ÿ‡Ÿ/__¾öÿÿóexáÛ§ëÿú¿ƒ>ükÿ¿¿þôý‡¶_:}áÇK£šþ÷ïçß]£ú¿ŠËïÓç}ù÷?þ~jqìÎæößTJצ> c¡ëŸ/ã4Õùç¿ýýå—aÂzѺÒ>¨Ò”Õ•úð¿ÿõò—¾ƒ±ùâØ•J5uÙ÷tÔwÑ÷dŠæ t×·TM;:ÿ5¡ñ²jã5~¹øª(S+ëǶ¶ÿÁ¿É¾ÛSÇî;.UÿwL²ª‹Ú [S5ò{óÞz„¯•êâ5~¹ô¢X¢‚«ÓÞjUÕmÝï~OI…þyß\úŸˆ¬ãªù—*"G‹uàÖ#mse,—íªkui=ÆFÔ&" G.½(ã&ÃÆ%™tSØCИ.Â]š°úMYªx[{¹øªŒ{;iýkH+x(Ã'@>ýéyñõûË/_úK¯>|ÿˉ‹œ;<ÿúþã¥ìÿq’HÛæðýχêÇóë?¾ÿí¥<–fÚOß;?Ñ-zR|BOŒ:?iß¿ZÛ®¨uuõUU '¸y=ÙìDk^šðåÂ\´x;?©ŽF·J¯<5x¦Ä¶,nåÛ÷þ‚s7VʽÆæáI†`“xGž´=܃`áSæDЭç&*á“Ïá'´¦Ñ›ºr¦’ ÏL] 2Ÿ2cÏ+Þs=Ã~Ê7) Êþ¤Ïó€¦:³S^$Ú/v+΃™Ù¾™'V\˜{ÒÂÖÞà“Ïáýßy…ýOL ûO 8j¼¢žÕÁ3Åû#»]Bº¬ºeºìêmÍCÿ*ð|ÌkÂõmÚ±W¼V˜FðZ5û9ÁgÇNz»fq<ž'©(¯C˜Æp? oòôtèõsÂ^Mµ|7ˆ§=¨nn0ºÓƒ±’±*Žƒh~µÁ_Ы–TGíÊó¸5üŽÕïæÞéÐ;–‘*}¬uk95ð”U=Êâ+Þ±WÿÜ ×m`ØÍÑLÔÜÏ0Ÿúh”vt\<¸?ª _Q<ËPNö•ÎÜ*7°µÑ&cŽÃö¬›Ö°L‰ŸààùÀQÛ‹A•£¢zמzö§@3õŒ·ö¶°?Ù‰©'üäžL¸†˜Â4^)¼#ðdb@ñ86;ꈶ=ë÷ªŒqb1YvKª:.y@_YqÙDûÈ=pA^t½‰Ýc|!¬Â>¢µïï¤;“à5©‰SV­#Nµž8U×9Ôi:Hî2PVå›.¦ßÒ<ãFul†Z=a^Áø±°•qoãµf|¯_Ð<+ºÞGé9Ý8Nó1hx&&l§/ÑâãŒ6貺½¤¦,èÄIÎŒ¤<œ~¼Túæƒß_¾%99 á–»1.]"wDdáöU½žÛ3ÄBÝ‹ŒH€ãŸÃ €að‰PZ>J§mº9JuWä>J§!8b,ãå'|ùžC†É¹š6#ÞGzeW7ð|&A{Ìš{¼ÀøÜO€°¿>\Œ‰508d‚ o™ÈJ„@ì9Ù¢bo¸QWE¥Þ籉˄¹f<;á®ÐuôškcæFªÏ)?½ô3^HößæØ¶Å¡®O¿¥ì§Õ¡®.©wö“ß^êò¨T§ÛV]¾enZ1×}ôß·ÿV§×îÛŤó;ÎHúoµ7­´·}üõåõ÷›Ûf©¦µ÷eÝÞîòœŠ5ìe}ÔƒvÂmgDO…M8ø¾¬à­ø ¾óŽ@-ˆgsO`Ì µÐÍ Ùð‰½¿ðÝ:7¼¢¸ÜÚ¸ pOq?JÌŒX™®:‡*-sȯ­ŠcÆbŒ&†ûõä͵:¹àñ•Œe6&hq{ñàÓFÃDw2‹TŒ¬ƒ¨AÄ­{å`=‹)8œ¿G´aö  +³JàÎ*,šh*æI"¸§cœ˜f‰î EßÙièiõ}H ©ÑSùds{<Ô…ÜúüÄåÊÍž‘K8ʙۑ9T?p¸¡ð`Ý5gXê¦S: " :àxFOèz˜¨ 6hËÛ³_±Tˆ “­]Ææº£í’I©Ä1ô(:˜yˆ&¼SóY²³Ç¼ [å앵ÎHž£ˆß­vÆõ:á'ê*@û.³w]7fïºP3fïº0ŽIúô‰kö>ËÜ´b®û¸˜½»nÎìݵ®Ù»ÿdbö>}«½i¥½í#¾Ù».Ƹ}Odј¯01#ZÁr|˜É÷Ktò7Ú™õ¦Íª¥ž1îQ¸¢È‹˜S™ \$ù\b^ž»†±9eÖìQ º>Ç= ¢„òAðÞù¨kµú² X >!¥ìA"ý`W¯3wÂû¤ o‹g°ÄáChÕÝ Ðº˜ µvèþ“‰}ú–¹iÅ\÷1 еjgèZ5ný'®}þV{ÓJ{ÛGZ»YZ3ñ{8–ˆ³ÀQwD‡ÄºËÒY©- Ý ó+FÞÃ2€ˆ ñAÜôR;8Y.Ì,TCÙ÷‰Á˜c4Ó(˜j1óP­î_fSøvWøƒÙZòQŠˆ›•±Íº#Ã_’%’ÊÊxûÅ”ÓÞ* ¦›SJå ôý'¥áô-sÓŠ¹îã¢4˜fNi0µÛÇ AÛUNßjoZioûH 4ô"ñÒ%ˆÃÃõˆö4 €†aÎX5H ãÌšR¶“ïþqeëûûø‹ A¸‡–r›ü,*pZ¯ýS¦+‡QShÆ Œës¨HGY_D@bãjZ5Q޲'QpDô Ñô߀ØÈ‚‰ƒ:\ÀȪ›cxIëq“»©… )®®=«ü>£hdì4ʳ° ¢nS¦úÉt-X“ ÄXcdŒ©JÐlWÅ\(äm3ªÅ¢E¼_f”¶ÎT/»3685U]TÎJ•#¡Óæ×œ FôŲ^Ý%ËÊ2°Ói§ù¶—€âéiü °“Å»"WÙ²1[Ùž;}¡^ŠG"¡WeAÀñ £·…qÈC£ã"¼bÀ­á¸p.ƒ€Áø­D3Õ¥sa~Ûo6 e‡ý‘Î?ì‡>3cÔ I° Šä· ÃxˆÖ`LgÕ'©\™vÁ.Á¦¬¦¾î"GȤpk‚êcô^ö‘Ì oÐ~¾ë— PGApÓEž˜ÉÚºuï¹õù2žÌ…õÊ,…ŸÊåVÃöðŒC2Ȳ¦˜šœ¢¼^6[(À³ä¡Ðü S !€@D‹{à0$"OúÁ¯© Aüލ×c"ì<²€hÛçS…Í™x¿eÀY$Œ›Ž{ÍãÚL¨š;ŒpáΘOÜ ¨„‰‰™:U ˆÀ½¡.RS0ó"×—Õ;úV¶j™j#kŒByeíä‚^ب¥ŠŒ³ÏeIH§ÐÛî±§ÁwRhÝñ€þëðÕÁðù£êÆï)½0œUÔ¿bÔ:z€â ôÖE©Ç‹‡p¬<ÄÛüImŒ”MÅU¸|TH\€)0{] í ’Eéžç]œ_©V9+%¬ÑN –Dñó6-†óżµã’y¢à +’AÝe\s8*а‘Ë"ÏmZù—°Ùí‘嘖óóüê4íE£,„ˆ”åh–«NË¿ÆÞ]‰A®ÄÈq— ¬Ã(&÷Pøg²b"‡„AØ×<cЍó.©{™ˆÆA{"Š™Ô"Î6?ŒQbœ–=z+%'¦MdŽJ›”qˆ›¬(»ûž›3&LøDB•'©ã9mÌ W¥œËê±¢Å$ò‹=ˆ¢‘üØF,®0EgES©«¯Á®=¯ÙÁüÚsÀE4O!¿Ê.>N(›bÏl%†âlVK L+|»(O%0èÕå2%D¿d+ãæÙêþg€´øNÆïzDæ4ãÖ<©iŒ¹g{Õõ¡(®¯0@p @#em-;ãÞ6ãÞžj. 82AÆžãÅ÷WªM$Ò=TxSÆÀ3e´»3‘¯‚rÃë› Å¯‡è(Ìmølþ¾ÇD`JTÊ:¢YND©ê’ ¬q6'.䃳,™<ô ?aP7 ^·ì81FÎÕ·LcÝvöqËO˜œr\Ì+?ÉóZ¦±ºè6³[~ÂИ›æpxÔb¼oA}ª/<K3X–`B ?"tP  Sƃj ïi€1abI\_ÔŽ±sä5“‰KežÎf÷Š‘RÑŒ+{ø­ÌQM]ìå+z’ ä 4Î…@U—"Ò%|~ÉBˆŠF'´òjˆäßà 2‚•DìÆÔì7D8}g?w…xF²ÊY}¨›{dødÕ¤ É–µséafºv)95ªNPVÕvýmj _5¥ßž©°:žÞÿÑ“_¥®?ùýå›GÆŠ#œÇàHg„¿Ð–»Ÿ»‰¶%ë1{¨êê" ¢h&ícÝíëãǨ+]4ú277K`l ¢ˆ-¦D$BRÉêmL};©9¼]Â:mÕÖ0T]Œ‹ñi¡œñÐ&ÃÆ3Åx»†2ã¿öøÉ1R2ƒÌT§`|ø«™¨NÏ‚=?iNm5Âra/ÐcÒ²£W~E•fú¡P¿_ÒKS.ŽÇCóÆ4¼3<­kUÂÛÓ²Âý0ûùX‰9ì§Ä#`ø\|šðžRôûóÁkOmÊJNM7ʵ)c‰zñ~çìÎÙqÌÒÎIwNº)ND½)¹okƸÝ>*¼#®. UËsØ¥bïÞï¼|;¼<Í™©»åÓP^îŠf\9Qûe‰Oê†ïÏÇ#À65l‡Sá#ðX {,cWô¬c¿ÄR>>ÝLUIÙjóÙkanÂÚéÑï±Ë—*_zZ#äϼs˜D½†Û6,ÏÝ{µ+†’ø\š4³{O€I'ó4= E‘y |Çs£ÜÓ#q<›Ÿ—ð02ÜÓÓà ·¼¢‰äåMH)M¡w+ØcH)†Ñ:p?P¿ÂçÙ£©ÈŽS¢¨•æÜ4g³\!¡nØzˆ#´<Ò&îr‡ÝÚvUk[Jù²Ûmj«8av›šg¦¦çÔá„ßÁ«Cø¶.©)µÛ“VIj„Äá¡XH—8Šß•Øó-lÑ"ìIÌiòxò³ËË=ƒù“'j[Ï ‰ÝÃ×qk²šÎsÊsaç'¡ ¨ªÑƸKc¤ß`„½‘‘x†þá(«o"éŸâi…˜t9¶êôâ¼÷'Ü“Ç<ÏÇÂ1Ò ~BHc›æ¸5lïÁó«c®üHýÏágϼ\âëÒV ,´s,Ä(s,Ô "ç Ë[úC;V¡™&¤}Ôg0¤©¼\OŸXŸƒ>Zˆž«5F0Îñõc–pÑæÆöÅÎt‚dm︲|R«ìÔ'´Ä‰ô0ÈÌ4n ¾cN4õ«Ð'–àN÷#GŽá€ðªBPoá$`Æõ>¿~¢ÜÆÈgp0 àMóôƒ)¹ì„´1‘Xl”0šœœ´t‹¡˜î¢è¦(–ζ™Ù_LôWˆï‹,ÿëáëËÿSjË endstream endobj 2935 0 obj 6723 endobj 2939 0 obj [117 /XYZ 38.2500000 149 0] endobj 2940 0 obj [117 /XYZ 38.2500000 680 0] endobj 2941 0 obj [117 /XYZ 38.2500000 404 0] endobj 2942 0 obj [117 /XYZ 38.2500000 149 0] endobj 2943 0 obj [117 /XYZ 38.2500000 680 0] endobj 2944 0 obj [117 /XYZ 38.2500000 404 0] endobj 2938 0 obj << /Type /Page /Parent 2 0 R /Contents 2945 0 R /Resources 2947 0 R /Annots 2948 0 R /MediaBox [0 0 595 842] >> endobj 2947 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2948 0 obj [ ] endobj 2945 0 obj << /Length 2946 0 R /Filter /FlateDecode >> stream xœí]Ko$·¾Ï¯ès€m’ýŒ+i ‡Â ÈÁÈ!XÇ ŒØˆâCþ~ZÓIÝó±‡ßÙ¡[²¨!‹UŪb±ŸÿôíïÉ?O>ßûOò½û~ÿí˽ÿ…®ŽÝÏIYåÉ÷_/ÉËáéðÔü÷åÐ~àÛý_šŸþ—èäÏÍ¿¿$?þ­ùåOݽþÁ¯‡R•Í÷Ÿ¾×¥j~J‡ï¯¿ÿ×á¯H~{±_®æãÿRÊiù ÆÌÒ/‡~›êôõû÷ߟ[¸­¢u©U–¨Ì4ÿ©3ü÷‡Ÿ›úéÓc)UY™^³P©›•Š25‰ÒuƒkSO:}ÉL¯ä'/³Ly›¼…\+ÍÊ>» q˼ìdÒÌþ‡é}·*3“Ÿ ÇJG\Ëì’Ä­³²E. (¦÷€ÿJ+í¸'ÈűÒÏ.HÜʤöóÒú‡Ù}ÐÖþD~ ¹4R:ÒâÉ%)›©Ü#e‡Ù} ?ó(ï[È}QN.IÙ\÷Œ¯7 {_µ¹&¶«ªì´j},tÞ#fnD?‘œ˜M»&Kál_àlð3)„ ½‡#5\§‚ŸÁ°Áu2 \gÍ;5Æ«(ð:wîØ1MðÔ…—SkˆO­íÔZ †è¯p¶"ž&§©ÊûU­j´éñu¥.‰³…O*ä_LUÌqéükYBb ÿZ$‚r‡ã@c¨™„Ï=^bÔB –å˜ Xöa»Dv?F1÷Zv*ЋՆO0” #¹2ÝËK¬[ ®Ö,…°et¥!Î3žÍ¢_1×ð˜Ë±Ý¨1}k—Âcã³ ñFaT”>x?²g€’·ø,\Õà0RµPWÜéâH 9’bÍ¥u³Žòv¸,‰ÃÈÛjX5 ¿ÝÔõ§ny{Ž©ŠGz†25¼Éˆy†j°d–¶K–æãFUz,JU•ù„<Õ±ªÓ~ÞFZ÷†2G£+¥ß}¦» šcž¯“½igËŽ™i£Û/Ñ [… 0-ÔÕð‹ÌÀ…ïá±Á¬è>“N>S@²,\¢w®«s#³xø]Ãu ð:Âû™ ‹Ù`kmçýº±Èð3&ug^ÅtMN€…© f-¸ør17ãI’êŠ8®˜ $¸LA&Æ4¶ ÓÉŒÅäy˜Ù†OµÓ\;?êάUªÇÃç_ßÃÏà]ß]Œ Ì”¦%H Ü:”3x§x6±Ì+Lu|ºG¾E¾À#‹UžmÊÅøO±FÂz¬‘Ž´  #ÿr ç`NYD Æ,–Ü–°à‚ ¬f°}ÅðùxaÆR±è7,ÄnDU¢êsªI'Í”«^3ufLs#ÊÛká0h¤;íùQùY­+õ™~&º6ÒkÚélÝÕüÌgR¼Ó–Tªè©8&¯Û:x?5„àŽÜAÌíÔÿ•;Ï{Ï»n­Òý9“µó,‚k8e[ãm)Æø²ˆÂf˜Ü›,o d‹öÅëÈÞo Ø(ò;ø;˜éñl[8ßAAË^g± Ž©NYKg¦½OñoÌHþ3bØÁ£Ì,ƃO(fSÑ@p@0‡ã÷ÁgŠp…̺yÎ)8ø°{uɬ3õ£ÊÞòduû&¾hGÂM#lLÔf<úþu`U×#èâ3t°©SI¢&õ ë£dœÊ^n(ס³>ô§û&dêñƒšEõa5†II 2 «X¤ÙGfÀéBqFkŽ×cï‹!k(ÆÞÛ¢ÜÖ)2Þ¬r5R/97Ò!þ9d^1Äã…¢¾ÂQ£ðÔh"Ó-Tüþlç*ã—ãÈF¢õÖz(‡xÖ`9<óX¦)¨–ÏI¿L¶_0¨qŽ(½£´Û«´Ë‹ˆù·ó¬b¾*jÄ[j¼¥ÎóK=ø“V~K­†`´·ÔêÍ;ÊnÃ7N¢rS‡‰©Ðï¼q$Úmë¶f‚1ë´7Ú¨`LæéÞ!mÊ!§G<„z$%D,ë,ŸÑ±°–éÛµCê“¿Ÿ’bã@5ÙÜÉË_øb[^ƒ‰ôJß·ë?®~­à¬Ð#Ý€¯•²Åúðl–âvbפ*s]ð!›Y°ûÖ ·~.ôØÖ¹m~n(z1?[ÁAeàP©Ë£ß˜IYQN$F¿åES0e2p´+Îõ™#¦Œ¢tMv •H&BÉŽ%¢Q©øD‡z„ÝîÞË4Øhž$SG)¬ñrδïrƒÏ¤‘8ˆ.¬ %ôéªÓÔ.·:d“b¯È÷ó¨•Ió±Å¶<‚¹(u´Ö˜J|Er†ßûž*ÇŒsÛ÷=mÊ>˜4=&9sz“y¼üÒ(›v¹U‡µ+FN¦!rü¦È߆³j5>é{yµXŸßùdó`áv+nÈlùÊ!È™Iì„>5 ²Œê)yq?ãEppMÃíP—1g—»O·lU\–/£óž7˜÷\=,y8âÇ]áD¢K˜Áñj8÷w’XE„p}Uß„•GWé¸ÏŽ, O>ï¨ØhcŒß÷Á/C¾Ç†Ïàƒ0²¿Rf¾—âj\‚·®…*5®¸Î“e)c›À޹«ÎÆ]q†FÌ'°îòc?[èƒ9‘B©ŠgÃ#Xâ3=¯ éG2Y¨‰Äô{ÆØÁ°Ýõd3ê,³‰v÷¦*ÏàNêø,œhš±Y%–®õX¾A\ÏR!ŒõS†Ö”qd#ÂÖa{P֣ߖ„…a‘ijË:ŒŒf´ÆÎμQ–óƒ5e´²‚ú…TÕ{žCøfí½* nðå{!áupï –¤ÊÛ0ä 8uÂý“º'¦s¤p68bÙ&pЊÄâhTËGì'p?(ï1´•®Êgç;ˆä²ùNÍË\² ¥Å_%‚ë©3Ù!LwA¦ÙpŒ_Ø\üBe²½ZÒË¿ë*ü~Á¼y`¼A*X>ƒo{ømE´jUeK̪ž1FLÝ?_ Ë!Ï™f%G– *QrDÉñW︻bÁž*|ë&|e²û‘•w×5ÄÔÆ^æ=ývd~ž…<¡U*r™t)K*ÌžÉÕÅqé¢=±¨†·ø6„Í{¬éWxã•Èqn€)’÷ªà¡l8Ìûì?¸yÜ$£v-Î ŸEâT=RtÑ-.7y w÷w¹ V6¬Þ 6>ôÝ ¶€ëù-¶x€´·\_‰"òñÌìô̼¥˜ÜÌ™1˜“˜Ð“ŵV<3aÏL¡n¯á­ð™Y\kÅ3#yff›E1¼Ô07V¿q&">¯+j"®³¸¤ƒïx÷}36UNØGIëð¤*– V|õkG˜Zå" Mdà¨ëÎ,ñ© ²z´ë= 4y5‚&†‚-ìó,õ|áÀÇa76å6:fm×s#‹'ÓïmD6=Îàû/¾ûáæÍÌ9Å2Ë\ eqy°M_•b.šx½™Fïf} ™¨w£Þ=ítg”Û´#¢Þµ,/¢ÞµñU Œðþ[Òùw&•™“%[@o52Þÿ›EYXÐ/ªB»lSE*†S¢µŽåñbÑpE[›œ¼sÃZLdŸÍpT>Úµ,Q©×2ü&&ú|!\ÕæKxt©…××Å%!}O2$SÅå2dý&¥OÕ[›¦Vßq.÷'Uy:ÏèÑŸ”jÍ#e¹Å³EÿØMÑtÅþ±8²îYÿe†ÏÜZL#7ì`˜‚ÚŒŒ‰é…Øé0ÆÂ(†ˆ›´0pœ5SÜš‰Àf4ö×aƒ Á._ܲÑøD6Ûƒ±¥"WYG6Y€Å²ž mÇûÁ…^î d5 ¿BµØÔ„+Ç¢ß ýCÇfrv žcÞ~9jÁh%e{Ì;®õzŠw¤S¡ßŽˆçŠC¨;R› Že‡ã·Î2ÈuqMdê;_™2=“FÊăìNÒZT‹–ÙÂe©¨×t\‰Èâ³@@¼³SE»¾Àu$zŠ[€-ù´X½2—×¢o2.ù¥Ï · TœÜÁÜl>ëSé± tÉ0fN|ÞÜÜófݘ£ýÑÞò;¾“i›¨ãÕþF‚Å—PÙBõ6Ë0vˆsŠgÛ[ˆ½…¯eûâù£at¨¹ào“´ßež@0M™ÎzÚlxüFœÍ5[%Q‡Úèuhº9ºi娴 c•ä±£Ð6¬’½à.o\1âýM²Vj¾3Žp2&üŒå™ û†[–¸²hâøcú²À4ͼÜÍ»ÍÇ6™ µ½¿ízÉ«;÷z¡Õ]Ê7b6 jª2%3wÏT6*“T˼§á—âwŽô’ ìó‘²-£ùN'fý®‹IPñœk™mgÜB=3綾÷%³l}›Õ¢÷ñ¼,bCx6™X/Ö´ß«zÕæˆ¿¿àÔhíÃ3éQè×¹í:ÄšùhM‹Å¢”é (Ñ®QæÎuyëkJ;2¶µhi!ª¬ ˆUU„¹Âá6Âv°`s¤h“ˆUß¹wÆ*ê)°¦(Áf.á²sFe§Ÿ1³,¸Æ;õX10½,+œª'¡ù¨f„Œ¢Z鄺ÎlŠE·y‘_¸J˜°„ˋزŒëÂ3ó®%ÊÝké²|¬´¶äàx?ß|%/ &¬ˆzšûƒ 0YíÔì5U¯4Otßš´‹(8GØV”göÚ"YuëÅ|7Ò¦b:Ò¹õ±˜d_*xœÐ:fN랃í±Û)b{lgo ¥3⽘n°c œªƒÅÆ™m(<üL'ý”ÓÖË7¶eîõçâr¬S0V! ¨¯î,`z|·¿Ÿ ãw„Ɔ$fL4Ë:˜“+`'¬™¤SùnŒ599aù?ò_ÅÑeš;ix†µÍúb¦×"tVä?%O‡ÿ¶â. endstream endobj 2946 0 obj 3918 endobj 2950 0 obj [118 /XYZ 32.2500000 313.250000 0] endobj 2951 0 obj [118 /XYZ 38.2500000 736.250000 0] endobj 2952 0 obj [118 /XYZ 31.5000000 314 0] endobj 2953 0 obj [118 /XYZ 38.2500000 272.750000 0] endobj 2954 0 obj [118 /XYZ 38.2500000 736.250000 0] endobj 2955 0 obj [118 /XYZ 38.2500000 272.750000 0] endobj 2949 0 obj << /Type /Page /Parent 2 0 R /Contents 2956 0 R /Resources 2958 0 R /Annots 2959 0 R /MediaBox [0 0 595 842] >> endobj 2958 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 2959 0 obj [ ] endobj 2956 0 obj << /Length 2957 0 R /Filter /FlateDecode >> stream xœí]Kïã¶¿ûSø ŠøEE}è¡Àbè¡è¡Ø4 ‚&è6‡~ýÊe[”~”4R’­]$ÿÿZ9΋óâúüó¿~?ÿðîóÎ_ÝÏwŸOyVyóç|ùûýãÒfî÷si‹ó×_OßÎßNŸNŸêÿ;5/|~÷—ú·ÿåùÏõ¿œÿö÷úÃÝ—._øõTвþùïëϪõoùíçåóŸOýîüÛeÄv:L÷ßß ¡‹Ò^À™úÛ©]¦¸þýýëo§Ì›EÊJæ,´ÒgQiyþï?O?Õ´ÃçY¥…(.ó%•²™I…¬ò³É{ó\ÿòŒ." .…Œ7ørn¤eDppÎUÆ¡GÙ[{>öK-â ~…œ+íÞâÑ97×Þh¿èˇå(²1Y«2…Ârv¬´›‹GçÛ\•çÂ4’µþãFÑÃðüøWy=|¼Á¯³c¥ÙÜÐè™5îü8·½L¬õEÛ‹ú÷¨de+ÛlMQFØ›Ûè16¾*t¼Á¯s#¥%*4¸¸ì­¬íyGÓð›°ð‰ž(<„àxr<¡>É‹ùOðhú-) ù¿À–¶Ôxµ|ßQì¼'¬ΓC)†Wªàh¯” Gñh ®4@½6H×>Á» j…õA®¿?yÉùDQä(Þmü$­MñáKmøE·ÙluØl摘.Y% –Þ”ÑH¼‰5%¶ 0®¡Üx:\W\\kËêüʲRëV(7À‘ÚØ²@TiŠ+¤w´‹ë“"SҊηñ6³UÞ}Gk®¥U`iVxKs²@gZ5Á¼;˜ÍDž™RtÝØ¹ªÅFOw ,ÍÑ€õ7xè«¢E–Wª Ò8Z³wB¶îû`ÜóÞ­¿ ¬ã»¡Â¥K Gƒïˆ>±pŸ4D \‚óÖSAØðzÞú(Æäf H ÷aêÂó¬µë$NØŰv]‰ÉHÁäÖD(ºœXPínO¡2<¿ÙZ0KDy­ËÊؾ p9^=¾˜q´(0ƒb"(†€ÜÄR C ù$@OŠó0d˜˜ÖbÌÀ&c`!™ÉsMˆÈ'»Üú¼¹ê!ÉR•“>ùZºp_ð^RH’"ÌçSÆ,^ X1 + 7Æ<]”>¥‘Ä/~ÇWÍÿØn¡è˹RH g‚N·Iû–TËåv`¡=è)–†mm^û†A@”Sì(ŠåCPsNd›ü¤gÊ©6Á˜ 0#†€¢> ÒÆí`Ìsšs=º´qMrt,’EµÚQ• 3H„€DÙ?62ÞsѼ=‹jˆæ¥¹Ò¼Êo4߸ZEž5¾ð`>¢'nE&{ô÷óß‘¾SÁynn`ß©ì¼CïH8Ï;øã !#aÚ]œðŽ3Ô.ÚÝsx;ám2%¤G`­+|`´rþhïX” Þðþày[\iDI(-[½ÔàzÑ£-Ú¬vø Ý@ÑëËß9&Z—!kàfW›Íñ W·µ°§=`tÁwÞ^ÿsIzabVƒm4”Ãä%í:+Ýz"ê¹B Oѹüʪ6BùAxü„â'aŽÜô‘1=%‚B·%B‘—OÊC¸NEÅ,êrÔaìX³ˆJC‹•9³ë›ÉÆRÀþÅìJpQè\umoØæÀ2‰B;XPæ+¥œSÚéÆˆQª8ìôý“jlyO½o&ãÍØ?6Ήd¿gS-ò7$<5”ÂvgªFr¥ÊòfHà oR"Eªá®²Ê)%8’FY%û‡#~NNg§¤F%ªÙwþ%¡›vNy§¤sP’)æ$^*Žûµ:‘Y1~æR^ùj‡PǨð˜Á „]¥#RòayKÍ™‹N¥=¥ª>cÆN¢:¼ŒÐ.˜â üãú/ ¨ ×jˆ¦W+“X:I£®v?˜ò)j'\èJN›¼¿ø Œ˜ÇqÒãŒÆFk—d:Ä.µpU_ ?Ç1ŠbdÍaææWª²BñÁŒr˜=Ô0ÛÀX‡ðöZê!e–XÍPŠHÇ…u$ò&¨¨dªPÅ–Æ­'®’£[EJÞ_P' Á1WLWªÕm²ö‘(„m·‰¢Ö,I¯ÞrZΖòR ­U vø…ÐG¢èFdR•/IµzÆàk%%‘$ ¾VšÖîºU”ñi”2}Â¥…Ø:Èm¸«î“x]˜b«ûTvÓ&4 î”T¾ða=äXWmß²ˆ)óeåáTîšO D‘èE£vQ>µqx³ʉÒG宎6} Ü*\Îḱ­È¬týT=YÕÅæábz*S½ÃfIÝßábÚº‹©Þa»¨Žñp1.¦»LŠîìÙç|7/¾/•žÙõaež6Â8(ÒÉ[‘›ÔÔ·iiY,X]:i éíj‘¤³Z9Î/ce+\±O¸íwV¶Ì—„+{ûV¶”K$øaeVöae§µ²yõÌaeçI­l©–T…оÒ{»£(¥¿jJ›é¤¿Áú¯dÍ*·\þÇjI¼ÎUœ¤~£Øb¡ø˜{áŠaLö庿RJÔöDŒ¨oD ޝpvuÅjª°'Kä—EacùmU‚ž!u“Þ;ÕŒ·Äš÷@ŒÕ2Eþ“\ 1ûZ'pˆY;¾øéš†W“NV˜_(Ìâœ&®û{±™¤çÈ ·Â[ø+P/Ù{ë±¹¿íYêAL7ˆ®¹¥kˆ\¬ Ýu;‰è‰c“¹Î“Þ©à;Ήe|v‚©±…ʬ²“Ÿä¦ÛeF}ãº/èÌon‰×áøN ”S2k=Ž˜ÞqŽØœ=8„c¸IX)Æ›K ‚Í@¼áýIsNÍ·Ú#殦3Üô,×ÄÐyLN |‡ë"…°6ØÃ™rºÇd@ˆªO!B~]jŸRxÝf¤S¶U >*ZŬ0#Ý Ÿ£H8Ÿ±qÕïH ; ð;mþ†òCføIŠKqJOaKá Ê;©sËR¥©/¹UjFGýÀÕ>¼Y–[b.Þ^&/£ìx[¢2gò6ýðí°-'欖ÍÓÊrÆul„J*J É‚dÿ˜ùjUï4—Èø<äå!/gÊËõ+'Ž´È €æ­[æ(¤êÒ»ýb{¹‹ÌT–¨×% PRp~Z¡g¨mµ·«PÖ9H¯ŸV¢þ¤tnÔö“¯õzŒs¶Þ¿Ut‡)§¹¼á>hܬÞÖøÓXs}©Ìå[-´n˜îj.îÚÏ“<ؼÙIîl_‘¸#÷r‘8e´Gþ|qÂØYéÏùTI":¯¼åí.IÄ]“z_Áp› ¬¡ÊÜÓPe>¤¡.?ºªãò‰¯¡šoÝaŠÇinªÌ‡4T™ûêò‰¯¡®ßj¡íh¨û4kj¨RêÐP/«¡îäŸNCÝçÜDvG$ißø¾.‡[÷V3 åAº·L—öô€jÞz¶w¥àÊG–N]اƒ+.0H”¦g¤b¨¸Ž»@SéwìÎé/‡»‚1ýÚ~ŠwŽ¢ªph"Õ-e Wâž¼ÀΰeRXPS ëÉÏ’&G¨pŠŠb5Ó˜»WÎ#¼»ûÃÛ\(U:¥J¯4Q§°ÀíÄ8ÚôÂŒûì}èöÖάÊ}-|\ 0ϘˆÛA†ÒnrN{®õÄÑHÒŠ5Ã#™Ñ²zÚÆ¡’úß7ÜI†"ÕFd2·g9Á2Äl8ƒÔ£+f—_Ñq:ÎsœŽ—íÓìQLþF’5Ñ»h‹b¸Qîá5Dy»Ü¥2(éÊ\šv4!dûhŠà!DÎx–c¦1çÊÛ‘9w(S|2³Ûм€à?bÁ{³IVŸRõÕdÍ-Fºe~>¬¤ç{‚ß+)$kv ¹fÁ†Ã_ÖF8̆דßaC<~îE&Rl6<†s‰ç —¸ÜU·ÕÏßj%ÔqŸÆ¾0ÁáhABb–‹Kàí,u—~‡ÑhßqnD1kéusT‚»ü^CÜBŽ]°«ð;˜¤BÄNÂ*~‚Gû€Ø @ p=˜æHëñ‰Ýi=_"(¸ I ó,DW€-„ #Å.'ö2×™”T¯Åùo¥È£ÚàÓùÓéÿƒ¾AÛ endstream endobj 2957 0 obj 5310 endobj 2961 0 obj [119 /XYZ 38.2500000 532.250000 0] endobj 2962 0 obj [119 /XYZ 38.2500000 532.250000 0] endobj 2960 0 obj << /Type /Page /Parent 2 0 R /Contents 2963 0 R /Resources 2965 0 R /Annots 2966 0 R /MediaBox [0 0 595 842] >> endobj 2965 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2966 0 obj [ ] endobj 2963 0 obj << /Length 2964 0 R /Filter /FlateDecode >> stream xœí]Kä¸ ¾×¯ð9Àxôò èg€4¦‚‚ÙÝ‹ì"=ä離ü¨nÛŸ\bQ²ìÖöÎTO»­I}¤(’úú§oÿÈþù{öõáÛ²ïÝç÷ƒÈ«B´ÿe§¯/ï ê¼û>«ê"ûþëá-{;¼^Ž¿Ú¾=üåøÝÿ2•ýùøç—ìo?þðÇî—N¿ðë¡’ÕñóßçϦ’ÇïÄðyúù¿ýCö۩ž»n0ÿýEÊ¢0Íi ]¿úiÊó×ïß;|m àÖ‹ÒR4u&6™lŒÊþûÓáçc—æEÞ(Y”u©ŽsÌk¡ÛR»¬Ô¹OQeR5âô׸˶¦æ=4.uá¯ñóÈÙ©"u)í­ç‘²*M%n‘§Ž@uGýBO䉃þµGæV²ö(9§‘³S¥g.n“¹uÙS¿ðÁÜKóü+ᓹ瑳S¥g.lÝ@+QÉ–TUéƒ}ë>¸,MéQ„N#ç&JÇdظ'˦ñÈã¡ulP•ñ(@§‘ûâ1lœ¤•6‰¢J¬š÷AýR ŸGÎN•ž·¸uNæ–M§"›Âù ¸j<âþyäÜDéY çälm:TÓ¦ö@ ¡yÔ×Ò'kÏ#g§JÏÛIë/.­à¡´?{ø7Ë‹÷¯‡¯ÏÒœ€°Ì^>éÿsŸç×#QŠìËÉà—*{ý1û£ªù!{ýåÐä¥*ú!¶O„„Ožà“ôDôDUîï¤'[}b°ÜA©Ò°ŸÒ}â‘ × Žš°~ðØ4œiûQ÷„ù<Ã'°‰ûÁï@þPBÔîüÁýàQcy#I"Ä7ÝÎôéõ¨6nCüÀ½-Ü—ÕÇIË">9³Ç‚\çu#Î#wîIŸ´d7¹Ñ­ËüBŽvYHÕ§<¾ty§„­µ‚\ô¯\568aÐLÉJËLqk¬3Õ-ê˵{ǘ•˜\–~ð4 û¥€ý´X¡ó”uu+!-B[ ~$d²e©A†á±iHÒL{kª†£†Ô¡:›Ñît£,B,U“Å‹?V’Ø‚‘¶OpIV=êµBÔ#ÅFÁ"Ë ôh²ÎPèEšE(ñ’Å2ˆ%`ÂgŒ˜²cúaR[ \†, Ô„ q`%ÝÁª3ò¥ì'v 2ðZMž%†bFaâßÍŠM^ã‚Ù%˜Zà[5PD¯掯Ÿ±’±íGa6žVÞõ©ºïY)Ø|µÈø„{œ&šhým ^²‚;e¿F‚GÌ'ŠÕÿĵ.–=æJ ‹}gØKÈêÛ$y0a?ØçhñëAOœ&ø„)ý`ZSNaÔú> ôéfq<úÂySžXúÙ¤ü[ä¥Èá¢îåê1`¯M™Pm·¨viY$ì Ž]Zä°6+`—®ú†„]ÜØe9Õ†§ÀTcÅ»õqUAžF‚¸LˆqUŽÃ§_¸Æ 6jBÜZ‹®Tã• [xg.§€ ï‚á]'/a8\ûÔ€xW¨Á®Mx·?¼ƒ‘JÀw ÄŽ‘…Ñ #Ãc¤ÈárØÄÈR ÒŒ×-%r˜ =xEóâ]¨³Œ«š€6Û|Ò:=Y_ëðž4ávKì?ÔT”œ‰˜ŸXÖö䉂Ï—IpâËþ,r}Ä—˜"1#>”¾„øbwˆŸp=!>ñ5œOPÄ׃ßwuÄ×;!}ÓiVÜû½!~²ñâoÜÆ/ú•õßÀ~âsÇ/lñ·¹£UÖ×FŸñá‚"~5œ°®Žø¶W'PdÅÞy€­I4êN\gF-îQ?dÎ=i¸íUøÍHú{×NÙ¯Å1´;Q S·+À;GH]LÃÎçêÿî„ZõÁ¯ØC±Xºsî eÂ2Âò×,ƒc®¡íR&zË®„m”Je6¦Ò²ƒ xîë[2±v09jÅóî0I—Fòl‡¸B¡é·˜‹óÔL^í¢¬](—ª`™tOÃY@ %KrƬGýÊïE ¤cŠDRVÅÊuPgû‡`v9\“BqÞ9oO¼^ ‹‘"¥lZ(nüõ­}ßj…÷ˆÙóâ"é>ÚlBÑZøƒpLಠœ·¾C²åÇÓ°ì])G@˜ƒ›#,:“û¬(;:ÂE<Uá=©÷əᖚ d‚^Håpë™ï$пÞòN•F œê+n´¾bȆL· ø’ØÅŒô0ÖkÜ‚Ò ¹¡xgÉ‘Áïà\æÕQ@âw(ý`™‡\ Ü4¯ÙN[¯±˜²­0­°Ƙ‚³ÙðÊØ¤¼PrÄó°¼[ËJ G¼ÛMÞk¿ywôÉ-Çt˜¾è—ò‹žJ4#Þ)tx„Ó%oi¸“Ï9ñÅ÷ü²:¾˜Ï!•6ÿ™\í¦”#AÞ›§îDqÊeÚ«Ç0ŨlWôŸ))ÌÇ¡'¥H¡¢ÒÛ¡¢ÿÝ‚¬zŒÁ»^û>°ì#â–d¼aSl^mHˆöùÌ¡jŸ$ÆË/ö뢡ÝÀßM…âb1ÐaçÅ‘ìSe5fÄÅj²KN =L¡‡;=ŒÆ‘À—ºlüÿ¿á¢ÝÚ¨BžÝúO,zW#RŽßññ2.a Ç&(A)8ÁUß·Ûb-úKöîØîRV#TN!(ï­Ii xÔØÕŸÛÐeW‡+Ìàs Í [w÷{¡b9l“ÅÒ‚Nå}\ å`Ægƒó¦móйtåÜ$|©™ÓÅå•Ö¶UB¥ýñ¢#sÖ'%¿5&Øa+eãÉR±Â³ ÝÔó¹ «…w”Jªö§ìgÍõbIÜØ¢ ÜPŒNÿ4ÕX×òÖ÷¥8Û¶1”SÞcÙ1tó$â/a{ÖÝ®uÍdýR<)‰×—0²XM„¸<ÒQµßcZ¨¢®–GºÉõŒÑ®ÀöL¡Ã2f±åwFÑ„ Ó¨˜Æç7X+Í(ãy&'T—õj™¬^ËlSQg¤Ô/BøÞzqƒñÑ<ÝçÿÎ8ÏÙ«—¢"ÝjK‰l§W¸ò™)õXãDŽ=,=hÓu^˜oÅÅÐpýµbW¤ApH’ò€(& %Ÿu­äÛP@êbJì^7:è9­ê$¼%Ôå¦Ô^X­~'§=â÷^Ëf¤>IÕ© bCªöÆš[³°‡*cK¢h*hz›Fä²ú[˜ë[PŠ~Pª °a.¹ÆªÞ×,‡Ë!©†7S K¸ƒŒ"¼¸wš™Cqw…òôí-w¾+äEt‹SšÒaÃÏ Ì6>¡ŠÉ >}Y¢©(¶³Ü8„ ÀÜÏåE,Þ2*×›t_w´èVÿÒÁÊÄ»J~nº5)‚[“Bæ WzÄïgíéV\k?û»WUCœêÞdl›¼·ÌG»àˆt8‹šÈË;8V=¤,ÑÏëßðŒ%Ö2?‡×Y ©°`9ŽH$ŒÇDb¹T0zMAºY$v)Rп¬.ÄÛÛ}Ñ;9'Úô­§¾ï‹6#NuDy„­ÇxCZ¹Ø3E©çE©•G8Üf1}Ê^j§yõ´Ä³ ”OJ”%?J·OïÄI–êÊ„X­`Ñøk…¤c±–iÁzpÌ@›²ñCúsëËÑQ2‰W6‰¯àVSFííR±‘E4T\_æ ¾Vµ40C6(µ‰†»¤oÕÇøJ|ž@8 œÃàVx±ºÖÁY._ÙÛQ­òù²ô WøÂëÙ©s!O'¿™êíïîbÎ;ÙŽ»šq1µ²¨ru>¶˜ÊH9}ÒÕ­Sywò<±€ðm=3ýè%'×ÜØž»™¢Ãoìú1—! 8XÙM}2Án¹ãÔ/ìhž™†Ä­Áw:o¡tšú»ò†T;}q?rìÄT…"€ßÁ"Щ"õîFUü·ö„–Eà|°Ì‘æ3ön†ÝÏs§!±¨á5 ÉeYˆ5&J}»°WBçP^'õ݆u. ʼWKê"{9üwÚ endstream endobj 2964 0 obj 3781 endobj 2968 0 obj [120 /XYZ 38.2500000 400.250000 0] endobj 2969 0 obj [120 /XYZ 38.2500000 400.250000 0] endobj 2967 0 obj << /Type /Page /Parent 2 0 R /Contents 2970 0 R /Resources 2972 0 R /Annots 2973 0 R /MediaBox [0 0 595 842] >> endobj 2972 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2973 0 obj [ ] endobj 2970 0 obj << /Length 2971 0 R /Filter /FlateDecode >> stream xœí]ËŽä¶Ý÷WÔ:€kć^@ÀóèYÌYYvœÀˆL¼È狀%UwSuXâ©KŠRÑ»ÇÃE]ÞÇáå}¼ûã—¿þùÛá݇/ÿ9ü0þüðå¡:¶u5üsxúõÝë?ÐÝqüý¡íêÿ<|;|{øüðùôßoÃ_>üùô»ÿôáO§>üõo§?üqüKOá—‡Vµ§Ÿÿ~þÙ·êô»êüóéÏÿõð—ß~}šqzݸ˜·ÿÿRM­«§e\yõ·‡é3Õó¯ß~øõáÝ@€°·hc*[”5ö z«ÿýÇÃO§LÓWÇÞ*Õ6¶­nyQ«OoÒ=½D÷ÕÁØnö¢ç_2Ó+ùÉêU´É‡•‹SE™FùgÜ\£­Ô×Èž=ÆÞÓÆ›üyåÒD·O.¹³æ‰2Ïb[ÙÔŸ¦Aý¦É7ÏóJSeÚ[<»äævu?èô¯<‰^¦—ŸÜV'•msŸW.N•isñì‚›kuÛDÜÜWÓG˜Ü6u¼ÉŸWks=³Knn=!­# ©—écпSñ$wX¹8U¦ÍųKnn7źAþˆ&×ö6¢Vx^¹4Q¦­u'ÿ2 ^Éð'à,÷Íóàû¯ï•U§U5‡¯?Ö6¼óùÇ×IêÃwO¸Ú¾þxø}U)ý‡Ãןúc£ëi‰ãH‡F*üLŸùžxæ|Æ¢ÛÂ8›®à3p¤ÏdŸ¾ž˜.:¿ôz¢<ÞG¸'êSøÞ+HEýŽÀ=ñ¼¯zg’¡1÷áþž ïÂ5º%áe¥Ôí+ £¤oy¹Â{׆5®áˆÕp_Rj+exQÈêÜåmw²UpÅ üÒtÙHjÙG´=ØD[=o¢ÖÆý´¶©Ÿ×ãŠ\w<˜œ‘ÖG£;õvd ‡=Z3\¿½l¯A³ -è=ø5(Ue¦‡\Ö»ô‹VíyÓ`0æXÛ¦k_èÖÝ‚éGi¸ôbHbüF9/Æ»áùâÎ]=Þì‘ÀCœÇÅÄaHà!5äÏÂôp3Ãe.Í­“DO_al€ß3c¸ÙxIª"ô¦,^Ön-ñéø=Ë¥ÆÃ¢ï—˱zÎdlÀ5Ö‰hÞêÓAñ­}«ŒK:øI²ŠÀÃî’du6ê#¡g¬&“ÙƒM#"ñ_nÍì')•~ýäùtáú†—N]Ð3[Aß ãÑö<}Qü¯wà7 ½º¯wÊcø× Ž|›±MÃ÷];“&æ~H–w°¶Ã#)u€QÓM»ÁûH|GÒ!å ÞaèE¬ /Wpï Ö\«ï½ç~ßá`Šâ‘TÞWÓôoEûnc¼q±žçÅ'Úå§¹œ}]ºƒ+À'2|üÁ§8Û ÔôÐ’-…L¥ðñg-³ÇƒŸÁ™À'LÙ»‘³'óbÿ/Þ'fI®’a$šqº0²Î\‘EÑ]1­Yß;æŒrãŽ8Ê·…E ‹¬ =¨³n•KÆ-C®ˆ ×ØÎ¡TJ÷“=ß)Üûþ, •ÕÛ¡UŠtçõÜO8nÎ{Ÿ(´¶¸Ýªâv{á4º¦ƒ$ ÷mõKÍ•’¨UWx¹ð² /§áØzº¦¾#¤·IN¢ÐáÓ«êvºôN¥ceŠîÛ€ïmá±½óXNjLIlÞ'û:rl=¥/ßî“]Áví^ÓVeï×Úûø¡<­ž ³‰”›Š†`B<'8—b–—“aÐ~¢À ÏÂÀ þƒg›'ÁHЂÉö¡Ò¦%Ëz˜jõ°3ÝàlžðÀõñ7•+8c³k+d7‹î-9?;²ÒŽÑ’•jáx/—k˜ôE=0¥ÒÓÐ …l®@ñ‹¡~¦4 ŒŸa4\Áxö&6Î`â0&ƒŽL¶g1µÅÔFÂy–P'.q,jÑ“;V=øY¥´z}%ÝÌ$Î]Ázru½;«…±ØµtC^Wߘ=çQˆ†*©1«“è>Fúˆ„ 4HßnŽ­ªë]~Š[Í%¤fÎQÁÙ~„»Š1‹-Kd ã¹½gFI‹{ce•väì~®¬¶yÁ.T]†mãð“•í¿G=׫ú&frš®JM¶–&k•]I“mSdsÉQ>»ÖE‘Œó~}$È ´ú¡Äég}‡µÇXÄ­põ8ÕûØ´îÁhø¸KÕ:ñ'à³+Q¿W¸béò«¸dÕbD æˆL"Z3•£2¤À8áo•­Ø>Óø¶$£9®¤ÔŒXÝÀnTÌ¡'®^¼%ð\6g܈3#}"—6ËoŸ=¤”½è‘iÑŠgWïwbæ1ö÷…<€’ÑJŒö+Nº ú—¹xMµ-[ªÍÙp.êJQÂÏÀ&[êðþ.A(Ó$Ì—ÊhÅ>udi-Û8Ö2€õ0ý±BðHC>­&˜“Õr²1.¼¤³ -‰#äN匦1ÁAç\){ŽdfˆÀ%M™ûk&R6‚)n?,dDš‰FR>­ÇuÛÉê^ L0š•hŽE–7‘›·S\½ðu”ЪÎß²ÑFñ+OQ /…ïV»DJŃª(G×Ïz ÖÁàŽÖa°ñúûQÒ5GýŒ£^Á#üêé~Þ…÷#ùpEW_rMcú½g<¤Dß¶².u¸ˆm$–¯Ù‘)À0ID‹d!¦ºú¶a]昄+GÑUõ±êÍÛãv,ƒx\Ê#ebv1?ð_t³ÚÛÚ•K&§”á|ZI¤‹‹æí€/qƒ4x&À“q)ìW¸®ãá{b\E¿+_ü%tÇãQµø±ý~ùíeWùOïŠì^ =3) {ï5¼¾ó‹i8Fµ<[ FçXü"Ñý}††(k†gÇàk£2j1e®éEwÁ\À4û#:-znfŸ1¼Q+B)Çø®ßì.C+RŠÊÂ,þdçÅïÝϽîaÎ9Œ–÷ÌZ„ØÜ4Éy}íþj”ŒçÕ\àå°¤X¢&wüÈò®6ÎWçÜÞx‹ñ½1¡µu6IyîòœóA-‘›X8ñP".°45J5®µ¨p²òØ¥v ’¨(ƒ=ì#šÂ'[•"Äψ‰¬N"—wý¬æž`Wß9;¸ˆ:glï¶—xú” ½»^¿Ýàõ%!¬fQ.ò´jƒë­À†-̈ùGút<Ö+u•VÖrEJ¨Y•ç¸'{㾜Wmq;›Œ9$©4ÙsºÊc8}e©XAý‚(ø=Ž0u– æÿ"èNlUÂÖd}Ó]ç \ÿ‹·Öi¾®kß"oµÕK?0Œ)1²Ž9ï– ¬Í±Ôd¬<4ÈßY¤¿å¬mwPý%FÖÍÀÈݹGÐÀFª:×–¯HøˆFFA¯z–M ûLž™_™ãýýjÎ6 Ys4J;‡w W0(—'g»L>šŒKߣÐ{ð÷àgFÖ»°6­ÑÚ0 FQÍt6_@Ï{ðþïñÐízft”\Úi]¡g4ñìܰ¶öhf‚w<Ü+¦ü‘šVióVÈ®4V¿ÜôÄNI¤¥Îý`²þyÑÒ‹ç h}„½d]âËÙð‰*ÓS«—ÍùZ½ÃÝzÌ+{C•HR5wºz³5<²u-Þj¥g˜°EYƒ°“XÎ /ÊÖjÝ–sšp"qM/lú6R—••¼_ˆ·½¶˜•qìæj±u² c§¬"Heº.?M0©AxI{I¹Þ»êNÖó2@Ù2lÖ2$päY½6k×’dêª0%ZI$°ÃuçìóN4™ŒWg¬_"ZT¥ÉèR¬1—{K®îFÜ‹}Óµ®²„7Ç#ÿ_Áw×ðÆG½XýdñÚâ_5ÖU7kIðzX®$‹¢ñ¨uçg(hýRÔ ä)=œ(3P²ö~ì€.½NÝÀò`:vÏöN¢ƒÙ¶í—p°\€t¬Þ¶»•¾eÝ/—åM•Æ®­/qU4 ›ô˜Zæž>QªE‰’"$s[\Iûq%m œó™x‘#ýšÎµhDÍE¦:™§6®ˆW »¶ø1€­uè^BJ‚pBAz¢!MÂÁ”©r‚WVµ±ƒ;WJï'¸ñ¾õ³Ò¦w c|­¶Æ})vS0Çù½®dËI ƒ\›FO£®ÎÚjWñ1±•}ïRï~t}t}ª«Æ¡nª®EQ„x# i{Rh†_{‘¨Ê~¦¯¢§£LÆLåå©Ä‘+¦Q¦ªc3Ô¸~(¯êcå–)†{GD«ô4´Dª™0Bì<'lŒæ˜kÑ{D¦6àW÷R(I"@ƒrÈÖ³dÐE÷¶Ô}”°­r …‰€¢y­&0ñÓ‰Þ㯟ø%ìGÅ>l¬ˆú{ž÷”<ÎæÚ=ß8ÈhmÌå-•ÊÔOép€¦‰îÆÀ óVC¢§t|9Dõ~ÆXöš<Åìî;ÞܾØÄ%"%"R6ç°¾½žU’E¥ì²«ïæò„C ´3÷üisU8éêí;E9¦ S1ôš8F­Ý®Ò¤ñ†dÃ0`ý˜’ȺV¯ã )bÂÓe{•Ɇšâ¨‚Y@i*wÙòÓžý$¥®÷´5Uéº=ã(¡®Û©"MËÈIf0'ò½¬WŒ'æ=òóA’«<’‰®è©dAv·1WÉõj^ £õÔ˽èhq¹F_xz¼‹JàÞFŠŽ–æa±,ìR¯ÛómoÑëÂz]a¾Ä´ÆÏ`½^ôzæz=gYØ¥^ošÛ¿.ÍJ»ºX H(çü²T§ñîi±@™[ êe[Ù¢íîQÛe|®e4dÑvÒ»°KmwîÏ^´Ý=i»œO{EÛmIÛ½ô\õÌ}%hÍö“ËדàÉ$}IÄ!m+jöNÒÑ…¢€©Q“#ÉD*aòu¬â*ÝWŒ!(…í~æ}l­fš™ZÍý”éƤ¥jý4‹ý»–εǻ»›L¦ÿM¹]LØôÞ³Mrî- ’Ã( (hÂÔ9—­ÀÄï>K'?‘iÒ¶¯„•% 9MZIÌlTÓ¹Hç~V¨ü¦w .ãÁ$g§©²×ôåˆð¶KS³øŒ°~Ñc¦î e¡—·ýHYbpŒGÈç‹LSÆZˆ½ jЀ|ûø>ÊZµ× Ì›fä LœÕJ–Bƒ^ ”a¡Aâ´âê¹›âz[P%ë# ¸¡2éãW÷kÕrÊIǰ+“‰Ü,=Ì…57ã„KÂR5ˆ‹ˆ9j^«²)EYb³eÛ"ˆ”¾Ø ¾ó¹ñêdåKØ’°.#…æ#”¸-W¢Í ÒfŠbEMã˜ÍõÝC«A_a¿”D©pÊ^3 f›Ê2¬&%dë){º#|Æ5_jŸ™i®R.ÇÓÞýÑ­Ýò1f/"e¦¤%vI-¯O}‰IP†S¶´s¼ÜR‹_Ù“áúF©œ ŠIº+“”¬±Ö“'t¤öð­—Ò˜#©9¨‘Q¯Ýc±®q¬Ø¦.ôE®<œ±Á©2æà ’%J$²‰vºñaÕm´ö̶÷Ó†‡iU‡•-²IaxÎâKת¸Ÿ²ð}£K1 ÙÆ •ÇØtKëè-ʈoÄ0…‹¹!Ã"H¶5SÂ…)ËŠ0ßÔ/ñ¼j$\ŽÅ3¦.÷¯ sˆgç˜bŒÐþd %e¤Œ°ÚÚӔń[J§løæ=6ÔEwl¸]lˆ5^lYiOœWp^ÙåH&ذ™ MlX°¡<6̺´pÆ#lÈbÜe®àVqi,#»ÉvS`PÁ†înó¾»` w‰ Ëý}ÁÇo¶Õù­lèņ7[‚šXÃ÷xÖF Ó½äŒ u wN¶ 8ägcêPcŠbK‰×†í;ƒ#°æÃÍ×ðÆáX“cTRÐOA?ed¿ØPõl¸â/õ Æ‚óö‡ ™Ö³˜ß°­Æ¨‘ðýd€tº:6,0d•‘2’64]Á†±°!s{í!s7z7èto#9cÃÝÝ)ß Æñì!nµ××|Ó Û¸?žÓ¶fÌ)¥`Ð2’6¬§ÎJcÜã~Ö×Þ÷ƒ[™ˆÇ‚ 6Ü.6,šÏËo%æ²`÷-`ÃvjþQ°¡¸ßðnЦµb!­qô¢‡¢p¤Â’Žm”gŠŠß0ol¸³\^!t¯Á{Z*ï”ê2Cûç ûº` oĆeäž°!Ÿç‘m,§{OÅîmÁRK•‘]ޤÀ†Wú3vµ#²—ãçmɈ:L¯ª­…(ÚÅÍó¦yèò~¦²ýݨÎc§ Ý?‡U«úXõæm‡!È‘£3Géièð«6Çê–Nžxo7Ù¨Q˜1 u¨>‰²mß°ªÂ³ݺçÌ„¢ãöeLÃI¦É,n††‰Bl˜p«ôàn†­e­{Ç\®fàÖoF·óô:õðcÒ µOIhOdáÞË©z•§Uî‘ݯ}çèûñŽ7¯µr××.u?GBÕ2¦ŽêÆC¸#îHß÷X¹)¤´3࿓μë›18Vb8›$c¿³ëž,÷bx–Dô•÷,–An³´±uíäÁk7©j#«¦±dlì ­â#r„j¬Ãm%7‡ÇÎ5Â8mJ`¢„J }-Ã+"+ÈÑ{̵#Â¥µ=Ž_ŠŒFÖU‡øv¹™àÈ“—¦o¯ðä…ÏPx6øÌÈ­*èÓ_ES² ÷ôûÓŠ§•cƒ© Y?ƒY@›+Š1ŒªxÏö ‰‡à÷`ž£¾ÇeöQýa›p‰¡àg(ÌjXf!¹<‚ØÁµa¢t·3{[™ã¨(—q½úG^¡•«ÖàóáóÃÿ—{…“ endstream endobj 2971 0 obj 5912 endobj 2975 0 obj [121 /XYZ 38.2500000 557 0] endobj 2976 0 obj [121 /XYZ 38.2500000 416 0] endobj 2977 0 obj [121 /XYZ 38.2500000 557 0] endobj 2978 0 obj [121 /XYZ 38.2500000 416 0] endobj 2979 0 obj << /Type /Annot /Subtype /Link /Rect [426 751.250000 516 758 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn22 >> endobj 2980 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 584 549.750000 598.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_debugging_search >> endobj 2974 0 obj << /Type /Page /Parent 2 0 R /Contents 2981 0 R /Resources 2983 0 R /Annots 2984 0 R /MediaBox [0 0 595 842] >> endobj 2983 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2984 0 obj [ 2979 0 R 2980 0 R ] endobj 2981 0 obj << /Length 2982 0 R /Filter /FlateDecode >> stream xœí]I䶾ׯ¨s—ÅE˜¥'@3@A'0l#“ò÷S]’ªº©ú(ñëGj)z`ϸ5¢ÈÇ·¯ßÿñËßÿüïñû_þ}ü¡ÿý×CqªË¢ûçøüë»—?ÐÍ©ÿó±nÊ㿾¿>>ŸÿûíнðåßÏúßQÿtþ÷çã_ÿvþáý_zþ ¿jUŸÿåò{[«óŸŠëïÏ?ÿ×á/¿;þö¼âð¹~3¯ÿÿ;¥jÛªçmL|úÛa8¦ºüú￾ïömlÛ裲ÆUkõñ?ÿ8ütþÀ°|qjíùïW¶.Þò¡Z_¿¤ÛâXÖ£ï\~ɬ®ä/ ÓD[¼Û¹4P”©”wqÁ›-U£zðœÿ•‡þmù‹›gÄZü²sq¨ôwëY]òr«ªî¤uD×åcÀ¿im¼Å/;‡Êp¹xuÁË­Š¶glu%¡ÛêÀ_©ÚÄ[ü²si ôW‹—¼Y­ËxÒö¶z àëˆü¾Ûy$i‹—¼Ycz¦Ö–às]=ð­ŽÈ.;—Êp³pqÉ›µM‘_Wü²ŒÈ.;Åáâ’7[MDn|]=ð«*"C¸ì<7†‹KÞì³Ñ_WüFE”³—ÇâÆpqÉ›mØŸ @>mÌ›mc²úËÎ¥2ܬ»øçEðNºŸ‡Ú7ϋ￾ÿ¤¬:ƒ²:~ýé¼·î›—ß¾žAR¿{v©òøõÇãï‹BÕ8~ýùО*][ìžïÑ Ÿ˜ ®ö =Qðeáb×…†«}€ïø¿w€w!ªÛðó¸kõ1ü˜xn ßvñO Ÿxpg“0À”eð;Ý®Ÿ¾žÙÒÛ8J ؉-:vR_?9 x]•—ý¸ lNM[¼~ÒƒðÞ“Rð±Díœa5ñâ”qo®ÿ¦=YÓEœn»±è‰QÝÍÝdèK¾³¼îž(u*mÕœÞÞ)/OÌðàÅ5áOðTwݸG‡UÁ£3›ÁïÞj¸üüsáÛ÷€­"ЀùN eNF7J—s`îùŽqŽÎ°¬žƒá¹A =„´QÔr·—'[m]¦\@¦¬à¬ñA ÉBij¡kñÞ¢Kà³*_|R±}Ó1uÀÕtCÐ fÆX  È#‡0k‚2Ò³7|RøÏý`>a@1T̉°€À{÷Wø“Hµ閙݇TÛÎ×G1ZÄ¡Ôzp3ºZÞ˜Úƒ«”0¤£Þ»‹`jî,êr`'oäða¹âÒ¹±RLl‰RÃx¤¼lŒáÕdwÍ Ù|î™Ü…_œùRÕ)ÞîþCÜÂÞž¢nÖF<ñìM̯4ƒs“9×r.O³BøÜÜßœg[N]gÎÕs®RgΉseî°Uî°æ'™sõœ«œ›™s‰s®Ì7V@é{{’9WϹÚëW3çÊœ‹ä\ùIæ\©9—ÑÍjl›5{1¾xR¹öü3îÑÖìػ¶æÆzcå –ÉF3ØâêîIÔãy[9NLJ‘O,¨N$3ÐNZOªo¡D:Éò“,dKgCZJ=ˆŒª3Q1ÏÜ:óQ¢É}du ÏÒ‹:4¡r„ã¦KÃ’ÅðÞz2ãÚ¦Ž—¨Ïô˜š—Ôjš~‰ˆ›œB:‡+,qM aN²Òv¾° W߯ì&$Sõc¢ÌB($™n¸B1o"w‘Ú¦-¶-7AäªôÅoÃÓú³:ìQ¨ß”±žª$“7PxõµÆl“FÓ¤…sìj?láCa_1‹¡nÑ-ò¦L¦°ž9 ìP»ö‰m¼<ÞRÆ}"Ò"]vÞ#aF=&DÇxÐ:àéºØòÚF2Q$l±êULZ"#>„›P´ø`Úu0ž·ÑØÝÝdz“L)] ÉÁÞbé²zãa.Õ8’j¿ÈŒÄ ôŒ¾é›4<—÷Ë{èÐH©¦?˜ÞçwE§¬Ù&gÌw/¿ç¤1Ê0×/Úh˜R*¦L‡°0Ôýרn¬™2áh~¾ê:$ª*T=[¤ ·>›Ÿ]@q "Û,dÌ Óü˜Ž’xõ’Úéâ×Ï¡Ç%B„ñ;!Þ ÑëgT,†1 #ÏBdfÔL™Iq‹"`]¾F— ¢8ƒKp!.«áÒ‡wÑåÝ î®ò IJWóžî[`Þ¶ê©tÁÀ&¡?^PÝäÖAër6"0-µÇ6¡Û÷åfA%&Ø/ÒŸI”Mæ'`Rs*SœÃêc¿3ù©{óa,œ·Ó‘Û—ûî4j’Êšf¦3zÜZ²ÁsÑ€25‡RÖ¾ž?éBxRC€K™a­¢1JæŽ ‹‰d~]UR7"ñÅçõ伌Y·r¤åbrÂÜ«×ñµJ»v~NÒàwÛêÅÐR^§Ì¦‰qíÞµÊ5׽ɿƺ¬Ç#gQ‰`JD&bŠz6²¢¹ÒÔjøÂç'@y~¡²ì¼Q¦ÚÞc—%ªÝQ±Óˆ5S¹‹–úzÂ'ee\2f8ä›XzÀÀŠŠÞ>«2Ú…G¢ÂŸØ.öÅÂ2†N?.òê²tp#UŸ‰ŠY˜ñF±©¥2ˆ²sèñœC«Œé­Ñ^ašTu •ŽÊZªDˆLL•xßu«mãª_"c^ç³-&‘/^\ù%Õ+8v?™u*àŒªœ `|ÚLg7O&ÆUžÛ\±¸¢ñ‹ (ªÓóÏÐiÕËŸürøézm©¶é¢ý0Äçc^NypQ½üA<øª¾ä ÀT½S"*%?6¨Ì É×Ò%(:ƒeO¡5äH¾ VÆ ‡©iẚ7¦vH$M §\0p²-êS’k¥ÑLˆ£Òá=nè±?v;tàPö¤Õk°kÞñH oR%ü~§‚Oð;po}ªò½ëmáj„(„5ÞA?áÎlôNbª)"¥ä:{ÏŒ„ |àÒ ¼Ó9] I1Ú8ÁÆ„½+n-EõC §ÌЉ‘KMv÷Xc­ÝÝ3h#и*I!àÕŽ–É_ž™ÿ™D¶*E}í]7{±©Šá¬}›Ø³iÒ9ˆ^œèzÒ_VyÒ#ñNÛ÷ÞKTDàh¬Ž~$÷Ùënþ®u,µCï£#´êdºÅFÜû8JøŽ†WÕ‘z}2#3¢@»Æç\ÌÕ€±·'ðzüŽíÄÅAtè_1^­wŒß;)FW| ø;ñ3n{V]'cÇBªÑ)#ëÅÅý²°;D´µ„ç<Œ½(«ùoÊ“½¾^©ÕÒT®OªžLÔœI¿Åh0® [¼Jj %ôcÑ+«"ç=,V-²SÞ»Wž¸| ´H B6ø*Ü+32IÈ–øÈÖ·ã]Fµ$òUâ-Ù')1à)›¬»D–º¸âÀ§þ*:Ëj¼Ó{uް67T¸ó#|‚[XÂïÜÂÖz*X9j`­'®Å;ð4ømãé©P…m< ¼ý~‡y‚ñžÇ@à“2·1ÞóH?ø¤Âøö>!ßPíä~<°*ßxVÛ$òÐf™ðM3`˜ÿ{ÆWëëD»,u„¹@–-œlY _u«Ö2_ã«F§»ÇFÙøjSêá«X·TãáP¢=XŠ¿C<ɺtÖ¥i]zÅ'õ`/¼mî{Ã:†Á0H$2Õgª§©^¬l†Ü­Õjä.Æ>ÿ3>zpÛéøN!ÈÊœü¤–»™¶gÐvüŒ²V_guvàÈù\9ŸËygKù\TÚ¿Ä|¦vV8•Y- 9#^~þ(ª% I(UÁo¢F‹‹µ½ŒÒ’?fÒYßhý&ÎKfLÆé«ò!R¯˜Ä\Ô¸æ"Í€"íåst©Œ8ÌI1ˆ%z?ŽH „':LS“_ž$¹*N¸ÒQ°þ½U®”\_ƒ*5~²£½2ÝÎWÐŒf›fz¦33ZÞý’㞨ö›Ñ˜vòbzRD%pwÙ]3†‚‡ÌÇucf¨‚¨¾±;Í P{DüÒƒzE0¦>VFO^a£ ‰Úˆn`„%ëÉÐ6åë3/Ø“¡gFA¥ù¸u‚§q,çïqåÎ;ý Ý+³‡Mp{Oƒ„èÝ'TmÜ›‡˜öžv Dë|#CCÂVžf D› ÏIŸ&î7¨É„ç¤xµf`·µÛ±¹Võh€O¨]m.<÷ƒÛ0t>…£Ñu¾ªÐfP›S•2&ØüôÉâL°FVù l‰W=Õ¢ë°Ì4;fÄ‘F ‹—oQ¸·Û©ºó€ñ üüs%ÚQÏã(Ç®úAOë¸<ðA9˹÷ OåTß›XŠe#5žì[x–cØw"Ï”±$’&Ûf*S$æè³ùíHÔTv<’«îLš¢(–„4ù–P4Cæ²aËŠ 0§šº–(yl±ôžM;ßÀØ«î3«'Á¾F­K*)…¶ ¡Æ¡Ík$Î0¾5a£ÿˆˆGÙ)2{+ñ8f^ ‘l€F*ð–T3f.6¾³Öcz<[ëJ|½€<ˆëWsá#êr³ØJÖ¸–Ó¸<\€ õ¬#¥3ê|ÓSfLV¿Þ&kå/§õ0ˆ UþÏÞ”…~èý=¤š| oÎhÚ '·ôH÷‰- q»SU*Y2Á¦‚Ô²-˜`€ bÔJÑx. q÷ïrºmL3Ù–ŽäÛ© øάwFÑ;൪¨+×Þ–-Áô¤&z—–ÑJ•Ö¥-,{ÒꪔQ“ࡆ,à‘%LÓWbož†´°uhªáôÅ0€°f`€ UÃf¬žF±Ñ᮸媇U` ».á®—o½»·'³rüÎâmÏ15âæ²m¨ ¤z#VM;CJ”oáÄYJøN𥄢k–Cˆn@AÛ5!Û”¸yüž¤ÄDÌUCË“T4˧Yà(©§´M$̳g V’ Æî-Ð!R‚¸©&ÒknoAµÿ—èö»úW¢ýD@¯Åðvs1ã¨Ê:Ò, î›Òo§ËaIJ¬~šj(T*2?ñB?žd‡i1;( ŽÅ__w6j(>ßh2û6ûÚ'jÉò†öÈAÖÈ»ÀÆ@³¸òU—­C“›vÙDd^ÆÔ¤rÊE0 ÛvæX>å"¥Vnª!º¿M­È\ C{‹ëÄB'•VŽw€µò(þñ4ôÜ cs6JÏ‹Smæ(^SF*+GíwHÏöêÖËô¼nšYóLM§ODÏxÛ£ç ¯™­’ j˜ˆýB;©r°~8î4"a§È,¼%Ù^›;+ßv¡3CÈ(ä­Ɖ5±s˜¨ãWÂ1LŒ‘gCbªYp¬ki\¸»¶ ½våÕùjpÖq¢œ_O®4ÎùÅZίÆ1Tâ Ö=ÚmŸ`{ÛLð¤8|cám[¼7Q=~ÍO˜\\Y¬šÌwMÃÌÐ*s‡Ìä¹Ã6}:Á&<e3„ûRå¼{ô`Æy Û½qtÎvò*íä$i4¶vHdÓ=f ˆ¶¤b[óÃísÎþ"í°mYºÈòèÕaþª&áPÙkk´IõñŸª­¦A–sÂ2ÉsÂrxÂò šÜ²¦µMÛ9*˵ÎýîÄYr¬ˆ­]¢Y,\N¥Yš­¨//R7ûÿÐç;™–2–Xß:%åœ}Aé8òU›ò‹Ã7ß}÷MópwŸÌØoì5=‚I–“mBè,”¬Z\kz -cqÒ £Ý+ey:̽£3³-&†M%"2ëÙ5Sã;šÉ²ÊÊí²Ûݤc”îKºgs~EÉì ‘5y9þ•‚ŸˆŽv?zeñvFnbñWEœ“YKõ`Š&!”b? < ò0˜‰5¢~câIHêÖ¸¾Hçf‰Šy–ˆ½‚¤ŠÅ==©úX£ù›Q¤ÚŠ;ko%› ù8>¿Å|<Ì,H*¹_"SWfB´3z{8ãYÒ»>ßÉÍèdx^²'ï„Ñ)¹5ä{žóæ¨y§H<æͦteMiã#d”õ䊺#=ï´>[ a+`clFžîÝc•ʸH&2IK3”¥ÛM¦åMj <|íNÇ#¿Á˜‰9:w´µÓ%O{3“’)‡ 1N¶%ôòYв鑛7­Ö%5«†ðQyí8Ž^flŸ¿Å‡Wº|žú 3ÄOs·:û ŸB=»}Žg9Ôï[A"ïXF}5:]ŸôÅ¡ÿòIg Uã'}(NŸz·Ó tR>?¢ï˜)¹pooŸú“¢&v­X—eà8Q5>`؉àÎ1^ ¾ÓÓ² :z}C[ážÿ|Þñ°sÌ¢1T! àw0 ôÍÛp8> ªø ^í ‘ày0ÎQçq‘½W°0¿‡P𠣦Y.!6po(ÍÛ‘½.Ì©g”ó°^=M<éEÆ”¸8~>ü²Ù€q endstream endobj 2982 0 obj 5917 endobj 2986 0 obj [122 /XYZ 38.2500000 463.250000 0] endobj 2987 0 obj [122 /XYZ 38.2500000 463.250000 0] endobj 2988 0 obj << /Type /Annot /Subtype /Link /Rect [183 399.500000 234 406.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typedef_reductions >> endobj 2985 0 obj << /Type /Page /Parent 2 0 R /Contents 2989 0 R /Resources 2991 0 R /Annots 2992 0 R /MediaBox [0 0 595 842] >> endobj 2991 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2992 0 obj [ 2988 0 R ] endobj 2989 0 obj << /Length 2990 0 R /Filter /FlateDecode >> stream xœí][¯Û¸~÷¯ðóqÄ‹( ( äZ ‚èâE¶ÛÅb³hºýû•-ZǦôÑâxHI67؜Ӣ†sçÌóú/Ÿÿ¹ÿ÷û×ï>ÿgÿÕý|÷yWšºêÿÛÿ¼ºü@Úƒû}ߨzÿõÛîûþûîÓîS÷÷÷]ÿÀçwë~ûß^îÿÚýÿëþÇtþä¾tü·]#šîço§Ÿm#ºßªáçñó_vÿaÿûqÆóë0×ÿ~%„ÕFÁ¸ñêï»ó2ÅéÏ_ß½î÷©L+õ^hÕýÕj¹ÿï¿v?w/8O_Z-DctSÝó¢FžÞÔ¡GȶÚ=zÏéÏì"Åä¶J8ùrn¤eDprFÊ6•’="i/¦O0¹ÐuºÉO³cÅÑ60;'qEë«1)ÐߦÛF6)ç97RΤ…“sRVU:±}™>ÁäZ%ä›äÉÄÏÎI\mÛ„b;ÌžýµIÉ8GÈS‰-œœ“²F˜”bû2}‚É™oN'[<;'q[ãÔÖ 04Ìžý¶2*mOs#åLZ8ùÁÙèºj-üý.” áœÏºNA‘aú““pòäìXqôÏþ)f Jÿ ض<øöËîõG¡E‡L³ÿòs\ÿÎÓ/Rêý«ãfNÙý—Ÿöê@’Þùu׌¬Ï ö# ‘ê=Qpä#ùG° FÔ»ø÷È7ñ+ Àf 8€¸¦à@Ã)âg«ðz F+HùŽ´Á8€œˆŸYóˆ‚x <ƒ)g« DCàÈñ J–ÂëÁ°ág d¹Ù>|éÔyrM\7E-4 ;`þ'`¿'€¬…0¬°ÕØR²Z½GÓÄ Jð#iâ¨a]ÕpS yf‰B´:%ø^ÐÞ#×l[ õY\jmls9¢z³¾æÑçÙ/¦×hÄIÝÄ‹œLà÷ø \ é=p=#¤ÅùbÑO/ÔAI+º‡^FðlXgHí}Ô°ëc$|äT5’Œ{,=x6Ùø/ÆÓkNÞ ¼³Ä,^:‰U)l€×óÆg6€0F¨Jý!›ÞT¦Þ´c¶¼óSF‚¸†$YsºR¼TÐL²}Ï#éVoZÒ%¤Éò›³¢…Br¦ ÞrI:†à%]TjÛ’¾¸<-D´¨8¤’˦ãñ#Jº}Þ=]P›´7f kR(ÈsH¢T­gˆõ)ߊ™“ì •0.)1]V+ÆœF¡D¯Y3às„ÏÑ9Œbl{#@¢ Y %rHr£–Ï]¥ÍƒR’Q˜ÏCZBI‹:³2ÕÎ%&´’¢o&—:òH)s xjkàpÇ~FâƒD8%…KãñˆkÒ¡‚o3y]RÇœ–åF¢S›öš)§¶ pDI­Å„€Q=J'ÖÇåß”˜Ðâ͈\rLxt}[ÄÔõµKG •âFÐ KXFÎu=.%[´‘Rй¿”l%ÑZí];¬ùŠ´2ò,ÚáÆ>§n‡ 5oV‰õ¬öògÙŸK‹¨¥Ô‘ª\)gK [ÉÀ&“—¶˜#GÛBޣŔÃmVæ´Âü:k¥_â"ÊÉã \÷Ò¾µÆ7p«‰þäªs.qµ èsßÙñÄuC¥þÅSFnn†ƒ•eoøx#%W]rÕ§gJ®z=Q±Å¢T2TWÏà÷¬0ǘ©v"p{å,?K^7—ë?ÿfªÀu/”K2rÝ×t‹’^qRÏÖ’T^Âüs0+è¾Qîž+•x·l1+»í”q­Cl58ì}QT‡>duÌG4â–V¤ç¢<ãúcN=Ó¢g\W„Ž]û–#Ñ“êxÂÕï±ðÈ*~Ä Ìv³a8‘5%¤'o¤„ïÁ”ëõ³0g~õ…,î=p=øüŒ<à^Ñ46lx= EViáÉ,…"|¼Cϸ/§È[54(yÚmÚ”¢qŽÖ¼×óö£„úH;H–ëã)ûlÖJn^Ÿ‰7Ø-`ÿCÍR:Ni æß¿AéFñâ¢ÀšK²Lz‚÷@Ë+š€ ÊÛTèÒÌ›Y¡´•cF7Kñ–¾àþãXx‚aÃ%Â\f„ËXp± „mÉŽÔM+=úf>„•–}­|^ö @@`l‡„¬ØÖj>+檮ê SšÍ\îo¤·†çaþgÐÝÒÝ:ÿBßnFÖw‡ËÕ‚¤#èi°m{s»-%<ñ+»­­q·QLÀ[RQ92¿ÃyEq„·†C-˹X¯Fâ­=ã±ó›Ûm*š«ê' ¥xkc7Æ´ÊøÒp“ˆR­Aéßö¼õ‚Ûˆ‰ßsÏ!‹ÓAÉàPö£å,î$/ßð•W§—9d×Hú(™ ±²—¦B›Ú,\Êœ²j÷\»3P&ñEôÙv O¡œÃŒ(O&¥ßGû–jÖ&”å\L2MÇ{áâj®\þ,W®’¼€!}$¬}i±L9RÀk­Vý Â÷6¾–Xü ŸlFd \!CÚÔ‚v7¯ŒJYy×6¾œøˆWʘ½úÞL¤[·U÷ÂzéI 9ƻ٢œ,e,J0;•¢¨)fyñ;ŘO–b¨—¢íŠöbÉí¨íì§gG)Þ¡R…R)°æBOhG‹Çµž2û%9ŸÇë¡ÐgäÑQla¦KäxÒª+΢&ö6W$[˰WeÎZEDy)·Ée2'ÙN¡¶C< ‹¥²…¶ßø $Ó­~$RØ-MNœ§$‡8®¦¤\ßÃ[^G¹Ü=[ýVÄmG ¦=á“KÑ-qdåRcŠ+Ù2KÕŠU+¤§kqaê¦ú$PÌp Â7¢Ø'ïeVƒîyCŒyãHâ#…ëêp|þÛ®ÖöòƒßvŸ†:…?‚pÍv,¡¡M] Ø| ï¸:&>a18’ä!ÍØ¢Ùv^Cš¼Uo‹µå[… ü å=ø~H…À3ðæÅv¬hIñ <¶MÚÖƒïÐÁwA4l©!}Ï@yÎÊËzx+¡%e@'aŽÅÔÂï!Œ(,g™¸" ËñíRðíR˜/%lÂ*!Þ WÊÇËá ”­†òÑ@qsÄ)‚ÅÃHÛ(g«C”£4È ðk»=ž v8ZÅJA2'QN« ~š¼¨~ï`3£%Ù Ì–þ¢µF{gS§nsnÆ…¶7]”€[ƒ/³ÄÛèˆ.ô¤ôdzÁ~çØÊE¨ƒZã½5nc‚1Š]| 5ÆäÄWa¼AÞákÓ3C˜æ6<·Fò@jÍ£Òò|…u~–¤4ÙR³T¤i iZ Ì(g¦*UFEΖ³•𿼧.HbîÃ#¬¼Lá1)¼Í{ q[ ®qã‹"µ«‘Z=´[ôâ LL;\”œ¸UB®fäj¾«¹¥‘DLkiÖž*¸³D ¡…T­º^Æ8[ï? yšK“š #­‘;Ö¨]›â_pú°SnÓøf›ÀV+l#ÞÇëí@˵……oê=)o|j¬¹ \b/ÑŸ^«õ:`FzÜ0yôA„Ï6¢v®(.Ôj¥„еuýµ. öjæ}ŠXb\Ž]£õé¹€ ÌïÜNñ(7eîbúÛSº7âž|z‡âõↈþ‹€•E&3…–æ²ô±¢F47Á °EaÞ‡œÀë1°P5 -ñ3˜mo)Ç„œ ŒõX!@"Œ)ì`1ÆÂŠ1Ei¨Š™„òŠ ðê]B[àÀlÖ8z¾Oc²!˜7pð=Ìf ðñ¶fÞyŒv™íi±f|Q©b¬R;ÅxÔ‹ÚŽ0|þݬ­öÆ4B¸OÛ½©' º/»O¾îŒ>ÑJkÅð-u5‹º|G÷}÷ïúøØÞZÞ¡Ïxtß²W³Øëwü²{ûCº8¢užÅp„½¤««u§«á{°áÆŒ¸=&,fÁ͉)iñ\ô $æ1š»:4™ñ4™™Ôdf¤ÉÌ„&3ƒ&3WšÌxšÌLj23ÒdfB“™A“™+Mfòj²¦h²¢ÉŠ&cÓdqÅn”+3áM`Ë…QƒÕ°žÕ°“VÃŽ¬†°v°öÊjXÏjØI«aGVÃNX ;X {e5l^«Ñ>¬Õ èlJƒz,«Eò¹aSØ¢-Žëå1ÀÛû-{ŸF¹¨·Ã)xuv1:§Ø‹½áhKM!T¹êk`š’bq€™µN25e-­'Ày“£¬%¯¸Ä1àÄëÁl–+õIÉ PbÊ5@ÌeIxo}ŽÄ¸€|GY (¬_¥,¦¬¥g.1Pµ¼‡v†7½LHšŽ˜Ñ݆r_^RÖPCìw*YqQ:%EšX5PìÀ¨Æ•$C7ÒÏXI}dàÙå$Ž`Qdã‘Î3´µ6øÌ@ÒbTš °Ö7†k®ìÉf@·P¼|Í/ælŽ)U³x6L[ÎB{æŠeŠY†$ pa6Ê–$I1ã¬z+L‚Çr€óŽXV†ø ¶7`YS`o®§žb¾F…í„37$`7X¤gVÒ%Y,ê¢cƒjĘAˤ"P^MÉá=G* ‘{KçkQÞ(Úüt”;5燮ö\nʘ¨i}!ñ‰_ÂróIݨ3Õ½ÞÓ3ÖD il£XO^a‚é-ã²¾¾û³ÿÞ1h?Ýú ·Sü­:­Ä1¾—çk]Ìn ý=~š ¦é•ƒ<Èò/Gú˜¸ü¿<¸\ü´_ïÑ{Ô­êlÝJGåŽÞØ$hߤ⤑/ÐÉ%Ž&c“:± gƒÏ8—GD-ýâ.*Ãï >CŽåc²~³€ÓS‰ Vñžíƒ/Àõ`ž#­Çgv§!±=ÅPp³–Yˆ®€ ZFнŸÙ›Jœ¢œÇõâà yp&ã–¹ØÚý}Å/é endstream endobj 2990 0 obj 4979 endobj 2994 0 obj [123 /XYZ 32.2500000 74.7500000 0] endobj 2995 0 obj [123 /XYZ 31.5000000 76.2500000 0] endobj 2996 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 560 542.250000 574.250000 ] /Border [0 0 0] /Dest /Z#18#b3#02#ab#13#f1#c5#c0#f6#5c#3em#1d#908#be#06#83#b2 >> endobj 2993 0 obj << /Type /Page /Parent 2 0 R /Contents 2997 0 R /Resources 2999 0 R /Annots 3000 0 R /MediaBox [0 0 595 842] >> endobj 2999 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3000 0 obj [ 2996 0 R ] endobj 2997 0 obj << /Length 2998 0 R /Filter /FlateDecode >> stream xœí][ã¶~÷¯ðs€xE‘’( (ì¥@ ,v>}(6Mƒ ºÍCÿ~eKòŒ%GÖ§CZ–¹ƒdfÌI;ÏåÍŸ?ýsÿï?öoÞ~úÏþK÷ýí§]v¨Š¬ý·?~}ûúƒÜºŸ÷•/ö_~Û}ÝÝ}Ü}lþÿu×>ðéí_›Ÿþ·Ï÷iþûeÿ÷4þØýÑñ~ÛU¦j¾ÿzú^W¦ù);?~þóîoßì?ÎØ/×mæò÷o©µÇmL,ýu׿¦9}ýñå÷Ý›óVÉ­÷e¹7κ}óq¾ÿï¿v?5 ôÓg‡ÚS•®Ê–,Tåç•òº™©ùo¸ÐéKizýÉë¬(‚MÞî\*Æ–Fž]¹µÉ«@yÃHúð?O¹ ÂM~Ú¹:T:ä ³|™W®Èj^4Ÿw@+ÆbC'çéL^6¿„£¦ãÎÕ¡Ò#ÏáUÞ‹ÀæS}°½L`r_§«C¥G8ž]S|×YÝÈU!Ä÷yz}ø»Ìú€Ü|Ú¹:TzäâÙÃr³ËœíÙ­ “—éL^f'?í\*-Â¥ÙÄvÿàÏäÚþ¸pU7Ë:ÓüܯüqÎí'à¨òUxð‡Ï»7š-5h,÷ŸjÀÒ®yúö¹AG±ÿöh¾Öõþóûï²Ì~øÓþó/»úPæE¿Åv$ËÑHþ=|Æ¢SÂgÞÁ‘÷ó×±p$«áÞ<œ îÀ¸ù³e?Àu0t0~àl9|S›Ág0¶ 8†;0ŽÀ½ˆmwà DÞ¦¼NGˆÙ0][‚Þ^€»Æ{Ëá3¿…#ŒtÁ{ôƒŸÁ°&ä#w°ìÖd/ÜA4ˆ2Ķtýþs£nCkʺÑî“2í!qK‹9J.AWc¸aXc)ßk ü ^Ëõk~F¢àu°–€ïÃÈÁ‚±óTµ³kŒAS¼m6ølcÅt€©7D…7e¬ˆÌ?]cOh ¬)}ˆGꈚÒVK4%–iXÖrá{w}ˆgl|šòV8#«Ú+]òV~&•å*§FîO—÷9–c˜Ÿ1%1Z k†`€µ ¶^ðÞ ×bÞ¼?8l‰vö©³áÆz¹¿$ì'‡-_â\ hd¨?`>…4*ð)á‹*°× S"kát†m|Œ9 klßb¹C`N: ”Mõ|(œw ¸éúð:ˆÆ±dšï‘-™4òD#”ìTåtÌ›Œ ÀïÃÈNAëçÝXwµ«Ö»‘`ÀÐI¯†hýQ»ÒÁb]ïêæ´à0-â;sÝ;êöàî$P6>‘ź#Xƒ/µÎl~É' «Ö`I—µKúÞ}k{aU•Å /dЂÀ|]Žt¤sm¤E;8Ûæˆ dÞlñLK:ÅÁæÞ\ŒüŒC»Æëtl: !ú— P„é àçn £RxAÈÄ–s[ 8BpþMdܼ,ûÐÝŽs(\é›ÁEÜÑ9g0üI½O«zm?0:̉FØX®iÈazø‚p„ ž|z¬0Cv!{®!ÂÁ€©S—§°þm¿¤'A{ÄÕ³Ö±fðê d»Ëc{qµH^êJ8 Ä÷GØ")‚ CÌiO„èlÃô‚¢#6ÛÅrÏ{ ¼·bÃïû›1)@ OÆÆÏ˜wóeX£Q@X»b¨1 Π ¬]Ö¬L°ÜœAüC9ƒ×£ôqî|Pû™9Éëž½ VpŠw@˜Ë‚oD—'°»«ÌɪV†pœ!ÜÂût=2%.¬«ér¾]~/PËá]”&«¦ÙR_ ¾ÀCiCgço‰9‚RÂøšß ƒ0/ítÄh)â0çCx“ùÈœ0Pž×ñ‘îS®˜çé>å†÷ ¨ù S߬»±GCÀâ ù¿u—áˆø)Ž=*NsâØë5…JX3î½×MG˜rp¹©¡›?€£Hàpµ¡òŒÁëg¸2Ž_ÃY8öÃgÙàL &GÕãH&ƒš¨ÞBåß#8Î(ÑA¤}:v?;ÛA£±ÓÑfŽmv÷ãÄ"2¾ÿVÈfº•š + lÔºöOk£RBm„ ý6ÎÞlØ>¦ R‰|6Ëd 1>•æ²³¯™ØkºÁoç R¬øGþ´Ñ ì™ö?¦bLu{&o䜥*~t­ó9Ç7Õ~¯º-Gç¼ ª““:Ý0g%&£2Öy›AØúÞBæËgn ¢¶f)lÃÇd£FsGãÙ§›µÈôáðÃÔM™á¦!2ÉV“¦¼]«‰¢UÄLŽo¤L^ÁAɘ\££Ø‡Û™d*©2æE–iP3ÔŸk¾TmKŒ¬°4Èöe^Ø ¸‡.@p‹èY`ù„÷GU™ƒÈ„àW®»ÂXlD!†uC³”ë¥sìõ*3$ml±Ì©ÞôxwyáHw[º¸s™ ñ‡¼·c|‚y‹«yõ†u‹M„ x‰f¯¬_Yl­ÊW@‘Pºz(©ÒÞ Ë )›f÷:…,Ë„y©Z¥Œg6Nà³vÌÝa”¯}Ÿ&£Ä¨uT˜NA«Š¾CŽÓèˆ266|±K”| y&ÏF@çy@A²kæ¥Öo­¸XÄ®3UUmŠª%Ú˜ä~‡×Yq ÿý‹ª¼k¼.®‡û.cºÆ’Ø–ƒ±zøÅêgÆlHe3Ö€…X}˱Lt§ï x¡ã]L½[—Iï&½›ôî»~"½Iƒ1å˜ÙpiÈd-dÚÖB¢dã|w.4Å’ñçrôÉ’I–L²d’%s¶1N±gX5œ{Ç“U"B”°Jž‡žÇÂX‡ŧ3Éö¸•7#Ù–i¬€9¹eÞ— f|DIs¬õ’FæxaÍø Â%áÓX¼¯ûÀñºDŒ/•R«QýxN6PX­â/± Þ¿L1Ób” ¡*ÐŒxG]ôc`šzGl Y»¾ñ Ë°ŽÁ6€jK¦•ÜØ÷q0ì§­ûCÄýÔg…xw»—JŧoÜ¿)¦8ˆ-¡ÁŽešœÍ„„_¢YG¬,¸Í e8¥,bÜ\/ZL¸;ô|‰¹Ÿ¢œÜÏÖNgy»ºæöJ9ö}b¹ŒŸÁ’>ƒÛ“áFœxdRŠÄáͪ˜ÜÕ"JÕU`>ø‡wg ${œÔnN(<â{FƆSm_Èœ'„»"æN—cŒ¼¤Bb©io,lcJì¨7 o³¤asL«ËØü«VÓ2Ø×ÍPø#2û„»Èëºmˆî$î”?R:ÉUr]ü`ˆ2VÓê”É\Æù¯X÷ë6öåíËe¦XâdËøPñI=EÛ-‚3’÷pÞC¢árÂyÞ$4¿`ý`ýAxîgÅwë8Áäy_× ù9ê[ß8I®h:G€ÁÆà¶µ»-Þº‘ªçÆ}Ï#Uu³ ¨Ó"æ&“I،Ń+S ^}Jè,Ÿtoq’žZ·žŠyË–û%·l̽£®~vP>ᑘzÆfýMIÌ3ƒufšfS,[Še{*‰‹u¥žD³.\æÌƒw:ÚXQôû—ãTßP_Ù‡D¦’·çL%¥]§b¸¢+5ÃX ·át¿Ùb¸X aõN¬S¢¹Ò£&¸‚€ë5è¢9$¶æRLiøÉµLÒA’UÑeU‹©È6[Æ8YLÉbJRh-Óc6#HÁ³)x6I—µH—ˆW‰E¾Ù¢ÈÉ.JvQ’\k±‹RÁÿdÍ%k.YsÏ'cZsn³e¦“5—¬¹$¹VbÍ%+KÂéš¹~k8M2dÝ2dÍIyOW /Ž Zž‹G%4Ù ÉMú#ˆ ú<ͺ’w0yO8MÞÁíÉ·˜ÞAßËL–Y²ÌÖn™¥Ôfs±Ja­¸5[òç­?Ù:Ïe¥=Wdë…FU§ý šÔàM¯Á|'d{}Ý:}ö2‰ºSÐ1”Tzâ w"]7—_ kHT˜}(à3]g€¸}z¡âfdŒ[s3áSE%†m ™jxz2™Êx˜õ0-©²³ý¯u…;X ZêÆÂÚr“8]K®ÆöpX„paÌdû Üw}»Xa”þd—Ú°~„²(Dð<3¨Ã SGiÊaÉ}6´€]îua¼ÜË>ÍxŸ¥ß+«Ãqâßο7„ï³}Y¿UÆ´ŸVÍ'Å¡IÖòeWºƒ1uî½9ÿ•½˜Å¾^£ùûî÷òøØ~ðtY ×h>iž¹ÜÉñ¯üÅ,þrŸw?| C-‚ªsÙ¹HGAò`qL4!žc3Ÿ‰BZ#c +á½  dÔY`‹wô§-1GJˆ8¦»¾Tºö³@âÂ…Ùp¯{Æe#’!™¡d¿t@ò-+?€ãB¼ó¹©ÊFfÛZÂ3¢®*f .9êðî5µVï<ØŒùCêû›Ï‚µÃx„à:«±$®9!ßuh-+3xŸ¡F-<šäÃàa„“O·~²°7ÂÔdÞô±ìý‘¸|¿´Ì än Õ TÜ@õ7P}vüô³Ø×kœÝ@þªÈÜ@þŠÈŸÝ@þ ä#ºêèn ‡"V,]ð…>´Ö… …™Ë¬Ÿ5.Œ_´k¹møªÊgB&VêŠNB.+’k£½œB†)Õù†áÍsW—C¼mM„2gS"øáþV?£ñÄ@?¡³yÓZÍ’®²KKºÊ®YÒ•ZÒÇO†–ôé¯ìÅ,öõ½%]e×,é*ZÒÇO†–ôé¯üÅ,þrð–te¢[Òîñ%Ë”V½›.@ä8ŸÀÑ™;xëæªÐ$Iõ^ƒŠÁR½av€ïv°É޹‘Ù3-'†0]Ÿ56‰cI÷Ø)ôBþ¦¢ŽCÞÿfn(œÒžUQ‚B7&ŠI%ø ¼¥wó‰ÒA»F9|%]Û¬ÎëR•CeÕIÙ+îXŠ×aüXB2QrKH²]Kêi@=g²±¢ ®\›EýíÚuFæÖ甞Ÿ?ÂÁ:¦6J·¨MiY(„‘Õ5š6Y良Ä#ZËUP|j¦V§nÊßg§ï1æDu…Èu ©·l5ÃFcçfè>&P×?…w0ƒâžÇ£¤.ûn6ÆÑ̺rÀ‰©b—¸·ðU@úòöæÇŠR b<†%ì"w·öýÉ*®Ï!d„Y8j%æŽ×²W͉6›¥z©/÷ýÙ¨j©ïÐHGãå¡óOŽhüÚ35z¦#S/›Zb3î0t„š÷h$û†;è*8ÏšÍ0ÏôÄ6ÚÈá3-QW‡ÚG,ĆÞ5ÆÜu—‡tmî C§~!þækÿµ¡r‘ >NýÁ œé¯júfw™9îüÄE¯…Ë5ã£î046F[ÞÊy3ÂP9錜ü •¨ÛÞ¡uì”f¹¶·Ý›¢ë|‹â†„†ï–¯‘F>¡Tñ)÷Êk<|¦3»Í¬W¥'X‚;þÜìø’á®™øª0Ù$ðn> ˜©H‡Y;0Þ •àgÞ#v‹L?óðƒw)Äýá7õËi»Êì¡“‹·y§Û¯‘ÿ«²*“ÂÿãþãîÿßI± endstream endobj 2998 0 obj 5342 endobj 3002 0 obj [124 /XYZ 38.2500000 771.500000 0] endobj 3003 0 obj [124 /XYZ 38.2500000 403.250000 0] endobj 3004 0 obj [124 /XYZ 38.2500000 771.500000 0] endobj 3005 0 obj [124 /XYZ 38.2500000 403.250000 0] endobj 3001 0 obj << /Type /Page /Parent 2 0 R /Contents 3006 0 R /Resources 3008 0 R /Annots 3009 0 R /MediaBox [0 0 595 842] >> endobj 3008 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 3009 0 obj [ ] endobj 3006 0 obj << /Length 3007 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9À¶Å‡^@`<90l ‡ ‡À›M°È.2ÙCþ~Ô-©gFê?)µZØ3nލb½YU,~úã׿'ÿü-ùôøõ?É÷öûã×Cz,²´ù“œ¾~xÿ.íÏIQfÉ÷_¯ÉëáËáKýïë¡yàëãŸëŸþ—èäOõߟ“¿þ­þðÇö—N¿ðË¡PEýýßçïU¡êŸÒË÷Óçÿ:üåwɯ§»×µÀ|üÿJ§6µ'0F^ýzè–©Î_¿}ÿõð©A€ß[´MË´L”56Q•ÕÉÿqø©~A7}z¬¬REn‹t΋ }zS¥ë)tUã&¼çü%3»’Ÿ\¥* 6y¹4R”É•srAʪ4/ZôÔ`ÿ2}€Éu–ä›äâXiië˜]’¸æ¤ Î*B èmú“Û"àägÈűÒÏ.Iܬ´!‰û6}€É‹,àägȃÏ.IÜJëAYC—ÙC ¿ )¸gÈ¥‘Ò‘N~,­Q¦Ð5×ÖT>Q8+K]ÿ\˜öϬUéÔ¤á¨ý6{‚è´ gƒÈQO.(ǺV•ô»éLntÀÉχRÒŽÙ%‰kÊvߢó<þËpÛ"Û€r{†\+qñì’Ä-Lë¢ÔJ_C—ÙC ¿(ÃmºÈ¥‘Ò‘¶?ùŸI0$Í' &óêxðó·Ã§—*Qyòí§°æ…çoß~9Øú?§(Œ6É·“ß§©)þ|ûùP‹<Ëuv†¯ÑÕy¤<–Uúq$ÍÎ#æ˜Ù¼,>Œ”Í3o<ž?°Gkš8˜ãW5|Ÿéÿª…³bÐr8}G ôÊÂgð2+¬ëùüAv¬Í˜šˆr“J@‚ÉARðŪ„D ¯Ø¨É“èfD©Èy|ß§¤cŒjÈÕƒu)ãOtÕL¢LGÊ·ü ~^Æ€«¡äQR„_,¢–ð$XMx¨2,áX§aò`üÉ.ƵjÁó·Ú †±e™V=c†átÈ#Ái ¯φ±Kp ÙX|„(5V4ŒªsHÙRjK=I‰C½K¬®‰ƒÎiÈ;iP …jçó Ë;`^ÐHË¥ÙQ÷ÝÁ^Ï`Ò ¾§5Sú˜ê#_=ÂÙ>_x±2tšÖh$} ­ŸZ_»JÕÇE«ì˜öÁdÔã¶2fu#n‰„wÀH¾.EM±¨wxê6ý2ÝÛ!˜JdÛiŸ¥„[Y•ù.²F¾ë­+ fªc£ž†T»2¢à3´îǵgžàȳÿ{ i5Ù5ØJ8›…ÏÀæ=×ø=æsD~)Ì(LjøŽC8 P8ßc`|À=„ëÁ± &ª1Ú¦Ô)Y6#þXÐ#qVgÊ9«ƒC<∠â(ãŠcÜŽØ(Œ½9â‚+ÚõÄኬ˜ÁQ¥³Èg@Jñ<æ¬Í!ÿî1÷[¹ã÷lS¡íÆ|°Šøym³9A,æ>©VvŽt¯Ü^kcÄq:’ÇÐeç"èFõ©tXY3½ôÚ±sõˆÞÅÚ©ìY˜·n* ÃT= X•ÙÍOgÕhÉf6Ë÷ ŽlàH ±ŒØÑf*˜È :p-qʧ@Úg,25‘=#&›Š¤Tßt=ãÈáÀ¬¨Í¢ 67L”ŸÀÇ9õy²ƒÂœ®Â³QZKâø“£ž” L6–9CEÏñb‚‚²ùà­x‡x¶‡é´(BL¸HµLúÖ°3ä) MT'à{Fq:9|DFÕÅÌ Û½Øk³Åk³q<ç¸p*Ž"®»ž[™|1_ŠFBÙE/cŽÅ|)ö¿æœqÓ8§DäâdiJÉ3‘qd9°ÀR‚!À§+°4BŒ:r@8EÔ\ŬÜ8–gŒ+L-Èc޼2ÎÐB:â<–bl:ÔÑ2\8‡%K-Ô b”É—Éz/”ÃØÁ ê æ¼Ö Îöëɰ•ˆåGº*Ãxc²ñX‹A9ÅúÀ¡‘ ïXˆ·µ×c™jNÅe§0~ ½î3üLûåy k!¬ð¶»ð™˜uVͪŒŠXa͜ʨåO ;,üâq*Úw—‡Ç²Lœ³GªQ2uaª¶ŸŒî"²oì†"åLzazƃÉ.;rV0Ô½çÈ„‹…¨–Z¸¨a@†!7Ÿ¸9m9S´²éŽ›'á‡Ö¦,{æF¦a+V Pî‡*B¶·“ˆ"ü*qN¸SYX3°×Œ.pò“1ÊդѫD%¼x5aßÇÕŒå8`•BœŸoª¢¿ÿ8å>E¡D7pÊãf*™ªª÷$­Â»ÖšŽ,WV²õôdœÌvÈÌ•é›7™.Ñ!ŠÀ÷nÔîuÝÒé»û½Ç©V¡Ôt¬¶åKõ›gêDË=Ädá©}…ЧŸ$Œå‰”DÆhøjʾùdv¿‰ÑŽ"çWDoA` ƒLû{h{Ùʓ雪rJ¶ /ðõ›‘J÷nà SøHV™^R£Û8'E[Ì Ì%RÌN¶ …kïPS@†ÖiÙãèåÛ P¾s÷ÆÎ ®9„}[Ç0<î+!Ýõ*™j„[ßùê„ý¸3.*“UD/0êðipãX¨l)ãØŠÅ•Û,›÷¨ì˜Væ£ |€³5 çÚYB‚o“AÍ6=V9k_ˤPÅRæerºÂýŠ_–7œg/WÛ>tÑD¶Þó‚FZ4;jp(Åë™vÑמ©à{:õÞ°ñ» õ#\iaÓð™f¶âhO^›-½ìlz2¦áÆž ã@·òo»Hæ”÷@ìtòŒkŒQü›ÁÜ+K9<[†pàX¤«Ô‹4”]ѧÃ$l*Ö|9‘R&xÄœ Þ¯Ь;"w²g%¸3.½½Ë¶#Ë=:9zè0ï¤VH«Vå=³Æô—2Yþ¥ÊÁ«¬¸Ñ(SÛÁä\DMÓ äØî±™ •$« ×ŽM-Ó…š gn£ËĪu–÷^#d›Þªìß5÷ ”mûÄ\BBõ"”ír.±z­Šú^TçtDŽ&¦¤ÂdïCÁ+¦Ø:RÁ“pÔ94ýÊ#*[ß.5AÀ*ÕnêÒÙR1‰öY8¸éˆ„1~­Äi„E±¹í>´†aØ_öÚÌOHû™îô­éç5ñÈæw)TTŸÔ™._ê%¦vÇOIW—8±z àëÅ×DâÌE•j|±;îGRÜ€¡û;`½¦äNü»]¾]ÍB¸ŒŒªß}âð>q˜Ú²H)³¥›ÙN ·/ï^GÚU/_OÊìãxMÍQéj‚ÚŽÝÖC Qc¬´Å´‡-$XÎA<¦>†0V«î\-rŸÑ{48 uõ„lسàZ&‰áb¨Ð˜•î¾Þ‚uóq Y§Ù‘\'ôG—Œ8á— GõÓ¬g@çD#^  ÓÜ|DúµÍ?Ñ<“i+„[–g°%¥£),nºH4Du`GØÁ#w9Z½/êQªì^ɸvLÝ/³{ ¬9ÖçÅø¤ì¡•´y‹‚T¢Þj„PŸúvf?} ‘+¢ÖŽ)öŽåØo$ì% ⛇uS¬Ö=õ¾§pÒ9)œ‘&[ôiÅðóÝÄ G—%bCŽ}=±ã_¡k±Â.”O8ˆ=0GÍE;} » ‹eÔÔ™vBlXä°„•R»%D–0hüGM7k˜qa7ÞŽøôº†2FÅð%Î[y´4Þ72±ÆÜP¦ƒI&ÉZgâ<&#r± ”„E-ø¦¢ ï™NùÞB…òQdY]ô(£°HÅ*ºYŸ1–mï½Ç³'YX¢ slÍÇßYÍ}'+tÒn±÷bȨšÊ{0ZóˆHçJ}:€Þ²¬§—3R•œ¢F[g–)¯PÕå¾ÁýöZé{É÷ð—ðYžö É8IàuÉ0¦/³®yÁ‹€ÈÒPð&>[†1áE½6Ì0ŒzhÕ}XUš5Íúß1Ì*îRÖZËšC ™;ñÔ gÃ6³éò÷h;JÚðz°EŠw+±ÖºšÃI˜öXya• íÛšG¨3­1¹Â–3V‡× \´ Kf ¾)—ÙB#t£·žC9‹¦ÇÆJsW)›±F° 5ê%_Å%ôÔN;dØ0õ&÷7W[=¼B‚–%‹h?òbŽd`~a" 8ZÀPkq™é0²Û‚íÈÚ‹uçâÏh æ˜S,½³zí}¹˜ÚÛàÃ|ce÷¦I$ ï:m àã3GDß›ˆÐ`½îØ»BÉb< j¥²ö{f±"”»¥ `)ÍåžB#vAÝH5¢É{"çw†gáfë3OéNo;Z¾–?”P+„Èíˆ[õW Û9Þ£Î?ìegT‘Î~_Ôê _.q›í÷¶p¡PH³–뾞‰EÙVVûUEûUE+m8½ÈuùË…b–HZe?"ÜoËK”.*\â©Sî³´É3 Ï^˜)¸¼ŸÀ¨¸Ö¢#ŽT ¸@\;’븅 ã1ij QhèàQ<ÛM†°õ°‡0EW¸HÏñÌñyD+‘éÑÕ9Ö5þØHœÕUs4œpb‡`W|D„*YÅR‡ñ†+]géœÂߘa¦ç£nQ?œºEÆÈ^’u%Yqx9ŸSl²Ié.³«“KDŽCš§vÃtȵÇéHr7/Ê JeÇ´2Ï9ó½r¼Í¡›3{\ÿ‰c¸Qr¹V÷‰sk¹ÜRõWëÂ4&·:=‘é¸%ŠHI _93Ƶ~Í›˜¤Ëôv4>½á¦gÖyEÙG¤Œ¡£)f7¦9H¤¤U„ì®-ûš‡ÏB/Ù½qϺ®1ëº|OCáûç”ÍÉVª™’è]Ìmó ÕlM8cãa>\`+èø¨1vŠ®,CáÙà3­¼(¯¥¿+`îôs q9¨c¬BÀlã`'P˜Õ0%  ã›áüÌ3·ÈüãG 5æ†WZÎçí"5ÇV/Ncrõ Ù_¿·cÖ!ùrø?…Ôz endstream endobj 3007 0 obj 4623 endobj 3011 0 obj [125 /XYZ 38.2500000 323 0] endobj 3012 0 obj [125 /XYZ 38.2500000 323 0] endobj 3010 0 obj << /Type /Page /Parent 2 0 R /Contents 3013 0 R /Resources 3015 0 R /Annots 3016 0 R /MediaBox [0 0 595 842] >> endobj 3015 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1500 1500 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 3016 0 obj [ ] endobj 3013 0 obj << /Length 3014 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯È³©zÆ3]Ý|0И|Xø`ÌzÖXT/ÜÞƒÿ¾3õJ2Ä’BAæ£äw4Ì’"ôŃÁP0øó¿üöŸ§¿þãôó§ßþçôûðïO¿½¯uYôÿwºüó“; ›×áúT7åé÷ï/?N?^¾¾|=ÿï—þ†ß>ýÛùêÿNúô¯çÿÿÛéÏÿqüËðG—?øþR«úüï÷îßm­ÎWÅôïËø¿üû?þ~yâHn`ÆÿV¦îØX ýãe|MÕýóßÿþòsÀ6*Úê3'e=©ÖêÓÿþ×Ëgãã‹×Ö*UW¶.öªuGéBD·Å©´3:Ý?2OW)ÞÔ ~á\e*}¸¤dÓöðTºNÐôøè[•éDÛq.ŽÊ([ütAáš²lz€Ú2üÓÓSȶ*uº‡wœKƒ2ˆ?\R²ukxê]Ÿàám•ðáç⨌²ÅO?ߩڪ¨ ¯]Ú¥™Â—ª¯Ïñˆ7nÏÈù×ëÕøwÎå;xÔ%tùÃaOÕº´í™xí±gOMÓøüœ®w(EÆ/ÜÙáÂgG-‹‰èù"9V£„¾wW[Qòظ {—ðÊóCÊ <ÝÅõñJW²Þ¸êîxoÝ)­ò r] |Ô¡èðîÂ¥7£âÈÆû»7¾ŒKÇÝx”Ò>Õ«ˆ*H®ªôÄAH;HŒœ¸t= îÍ¢`øR tÜA0 ÷Æ—¡éØ@òÛkMuí8ßË7D7‡åþé;¹Uλ\}jÏNÓŽÔ+w^Þ+KGóœO"ˆH|—BÉ%<“çn»rñ颤À¦œhIL®Vë*NG¤C¢£ï\5'›S@3È$LÎsE©€"rñP(—ðL¨{m«ª-Â*ê«îŽ÷ñV1_Sªçã|áÓ øfÞHáÑ›Qq½‹a¼=·²ŒKÏÝnKj'rëê£?®'†´BÚAbàăàB14à›õ~]ñÁ R t\"FtÏ‘,CÓ³ä·ÓšêB_ÙêþÛøº9(÷OßÉ­rÞEŸeGêΕ» Þ+KGóœO"ˆH|—BÉ%<“ç^»òð錯¤ã€¦œhIL®fì*NGDÙ‘¾seÞ*çkJuÔåá¥é9W [⎋áÑ‘ETÜq9<°ûÞ%„‹Él· ÙÉvÜǺŠèë‰!-‚ÉÕ$]éžÞAÐQt®@’DJI&ƒÂtÜqALÂØûŽ$ n¯á”f4oièh®7®º;ÞÇ[åIm>jKèˆ)×ßë¯@¸ôfT<Ï"Do߃,ãRÒZ)™\(Íd;^½„ ’ëUØŒ¶#€v9q!è(ˆ=ïÖ†/BÇs0r`„A÷É24%Í›I©KgDÎJ­ûïŠèæ0 Ü?}'·Êy—¦òÙiꑺsR!î¸4,uDÌs>‰@""ñ]N%—ðLž»íªöòAzx¬§×Õ¤Ð'Z“«ÕºŠÓéèè;W -"¥9ah™„Éy®(PD.¾ U{I3%§<-5£Q5aõÇUwÇûx«œ¯iÛ¶%ôÄÌ»1 \z3*ž×"Œ·ïV–qihM²à£Çg¸ ë£?®'†´BÚAbäÄ… £ f½[W¾ÏÏÈÝw$ËÐ44o&XYÖÎJ­ûoåëæ8 Ü?}'·Šy—Fù —Fé÷*œòðÆ¥aQ:BÌO‰çr‚(¹„gòÜkW>ý€ò•tД-‰‰¾B@²0=}ç*œÓœ04JGȹãÉ€"rñP(—ðL¨{mK™Ñ¨Â92®º;ÞÇ[å|r2ç B/0@Ì\ äd®@èpNfNVˆ0Þ¾[YÆE™ˆèv[’2“ …s2d\O i„´ƒÄȉ&y†Ð1ëݺBÀÐáœÌœ° aÐ}G² 2ùíµ&í'Mr2ã€rÿôÜ*ç]ŒŸ“i̘cp¯Âéo\SGˆyÎ'HD$¾Ë ¡¤Ã9™F¤üÃç 9™q@SN´$&W«5$'Ó#ÑÑw®ÂÉ1Í Ccê9Ï¥ŠÈÅw@! t8'³_y:[jF£ çdȸêîxo•ó5vÈÉœ/½À1s+“¹aÃ9™9Y9 ÂxûneÓDD·Û’L3™P8'CÆõÄAH;HŒœX’g ³Þ­+ ÎÉÌ ‚Ýw$ËИ&"¿½ÖT’äCIs2唓¹þé;¹UλT$'SM9ç ¤C*Áœ …¥¢9ÄD*ˆH|—BÉ%<“çn»rñéhN¦œr2>'Z“«ÕV4'SM ç $C¤4' MEs2ˆd@¹ø(”Kx&Ô½¶U©ˆ äd*š“©ÆTD%™“ëdZþ f.Q'sÔÉÌÉÊÆÛw+˸T4'#Õ‡¤7œ) QœLEs2Õ”†@H;HŒœÐÚÐ1k‘: P'3',Ftß‘,CSÑœŒX‹Ÿ‹‘ä­“i¦:™†”€4 êdR'ÓLuîH‡ÖÉÌ`¡u2‰T ‘ø.'„¨“iDêdZ ÒÐ:™fª“ihù‡ &W«¥u2ÍTôá^dˆdÌZ'ÙH‘‹ï€B@:™òÈu´³e°Wáõé zÎÙªN׫°çw!(ƒ-«çúó·óT³o–hÁa‹nŠhÎÑÙ@r|º*;~®/Ð3Ó¼6máÿR”Ý/祖­šºœ ±¡²¯ÖôÝé…BÿTiÄ´nàCà=ƒ®x4j5GÌlQÃ{ìvf#/Ÿ†ßÇðü>fµœ~üL/0=¬1½àΫ¾ªV˜¨ËPåkÑ¿_àÓúPå¼P~ZÁADê¥Á[†QŠ DDÏ‹Þᕯæì^ÖêÖsüƒÍHh õ.E¿|O%aFK,¥œdZCf™a°†ñˆÁ? ;+Ž»”U~ÎŒ$kds‡#aAó Þ$¢Ùfû/,„çFºà§a£æÌX¤œ§A¥Â\G& ŽÆï§Àˆ1b)0¸fÅ;ØL7IJ0öŸ‚½ç/”ðÛvÌYëQ7yul{ :Ö, “pfUg=%S+6ðØ}`9fÍqFøì$D—>óùûGüxøºÿå²÷¦·Þ50B(ϺžaèðýE‚0ôáóÇs‚XŽ+YŸÆ±Ÿ¥Üãò7¦Ö¾H¶ea_ |Z®o 8¯ˆó—æ×Œ2iÕ"?‘ 5'£‹s׌ŒnD+°&Áœ².¡Lð›2pca yÃèà§YˆŽ†oŠ%§±Í`ù|a` +mÌõä z.ŽÆãï+,[(óùVíÒå'óò&÷õh…Lt{ÈäJZjV™ØfLŽ/À¬/Àtpä }>Ž/?P¼À¨ZŠDŒ¨€3WFª£ D¸Æ¼1Õn{\IYíql›³ª¼÷جª9çiçœ;‰5›êб§Õ±»ˆÍÙiîÑ1¬/K¿äy;mw¼]Æ¡)¬É»Fb0°b0ÎL-:«mT:·L`œñqø,aìq${óXš“ ‰d@YƬÚ×ìùjðŒÞ\iÞûb˜Gˆ }ñÍ}g¿k÷†¬ugØŸ°BËÕž 3KË3}ß‹Ì{²9î›[mV}1{²ßæ-#§åžœIÎh\Õ{VÞG4žD&íž•êÑøíÓjO&á£qmrg,nŸý=¢ñë2w(WÕŒl4^b;»¹ÕfÕ—zOÖ&g4~éLóѸ)r¯ˆh|Q&zϪóˆÆh|—öÙ=™„gŒÆM•;cqûïäG4þÑ¢qÓäÎ媗~¶hü>ª[l±«þ#c4nõžlʽÏNÖjqL㾌mÇáö;ô7“m—Ù9Nû%lh£iQbààÈð‡]¸Ûjà}Ǹé‚ì6cNÇ‚§o:”«{Öúž%‘þð±M¬w ‘Þ Ø°8*šWáÓNXÖZ2}àýí8΋ìbÁûÛqüÅÙß›¼%K©A*â‘°÷—mx³¾×Ïb7›[:ð£cÕ}w¬iáŠÄÑ â»n(ÇèRÄiÒ…›ŸFº®ÒàvqLèl›v6-=I·Á`Ö7å¬{XÎ[D7߈áÈÎQXA8³ î…9`ÐaÍ7¹fð£i\lýÁàZx²bÌú8ìŒè膴™ò œùÓÂÚb‹Éô™¾RÕËú;kõÉHDT1ó=æ$2KbNCÙ}³Ö†‡‘:'§)ÒI3SKÙÀ‡µ gÌœgæc¥Ð1N7lÁƒ!'ÏtC<òC'Ïr}>M™¤Ò™Î™>1h©púÆoȰG¼ºìÒ /l–¾¥µ»Jëp$ô0zZU*¬§BŸ;³­¤µ"ë£Áxrä2ëÅÂù.Ñ;ÎŒÁñÉgö­Rg3›è±*;>µ§¥Ô9J;Âûšv•*g‘Ã.+9ÂÔ´@7mŽ85TŽ*Öš’15y¹æÄà6¶¼ÜÃ^¼ ¹_S/;#þª qq¬"ï¹8;éÄÒ’wËxŠ)§7 ²-ndócÓçà”£­h!|`öp„e\\XØ2Œ¡¦ÏéŽìqÅ/ÁÒÐð/,°ð±Ùr÷·Â\sözâîé²jÎÀ:²:c¸»á ¯´SCÙP¸ÍíÕŠC^vlï‘ÚìÆipŸYŽã%£þ‰³oëÅZøœs3}fÙrÐ*à mxü†ï ²5oˆÇ”5FÑIì!·WlÕ–HÕYǘ·pÎÏUf-²©†QDË ]XÅ›œb]‰Ÿ5šâh«ÔáþŒ?[íásîDLù½¿jéL$QD±¥†Ç@*8AùúP$¢ œ}œx𑦵H(Ì©ÁgÚlõàóÎzmÞ¾‰t›N;Yr–ÎömPÕ!ŽÜ§ª6Wö«.Ì#jíâ"@¹f¹éü Û¿@¨–rLëÎö p„<ÛøÒbÌ–”¢ž”bX•¯Ekü|S¦RLVÙë,%…ëSE³IœºÅå›?÷0öœÊæÀ"ïÃIÿqVᢛ+o¦³™•)`T ŠD©ÁÕ¿-¥—ØÀ™™ý¬œý‹ ÜKšX­éTˆËKñ^ ΄w|ƒ¹Z_¦ è; 2X » ²|÷oôØÆû¨\”®\Œê {´£aóQUYWU²Z¦RHSÛºÍR`I!ÛæNÕ8>à˜s\lï³f)¶™nÅ,nË$ïÍš§ "8Z8<ä=xHÖQS¢uºœÃE°ŽFâ/Î&\<³`Éqó`p©o^:”%ª¦oÓ²~ùˆ°ÏÇ ë¶†O‹`9àhU$ŠÅtð/œ£¡äv-ûfJŠîHɹ³¢ÕÇÞÐ5vrdXÿÏõÿÇÚþùÖöG>í°¹%…ÛÛ\®|šÁQ ŽU±|ðq×xK;ŽÄZɬˆ ­@›4¾mNª ½€î:«Ù Ñê^¤ªxí î!|A¿ l–¯tyßtO„N é e z¶ I_k I^é|‚ȵ†÷Tkø>KÓé¹®_ ( ÛÆu‰p‹¼DT‰Ý¯¼´ÅTTŠ+/…O±ËÔq2RÁ¨Hy¬2G‘Ú¸LuìœÊK–l9åT™ oç8E³íOŒ¨\­%r°ì©ÅXN³sVpY¯lÃ>F ÍÅ}Ò)ë*èXÇT‹ì™–xÖù-{W9{ö5Ŭúê -`ew2l褒éè"Ö9*œBß š)º{{ÏfÀÛ÷H’Ý´ÍR†°Yóg«96~ÎãÎ²Õ i+{Eæ,NãêÈÎÙ![ê-€áóc…ÏxÁÅŠÀoýèYéf?nßÞC¶‘¾hJhGâ"C¾­¬mìA'èäÓ¢RÃÜŽ?’«Zïž6¬@X‘ †€³šXßã&}#Õ÷Ö¶Åt8û0……ΛÇõøW¯ºï›1ƒn[šyü 8ï¸PA¸Åú0#¤j{ž[‹Ž(ÌÀ ¶ˆ¼|_C ïv$õ Ý)‘Øç‘Û«nú´ÇáÇ/¬ãý²‡#Ô”Zó¦ý}7|+à¯ËIÿÜõùœO2ùÜ óSÙoÅ ÄYéÄ\ùÝ£U6Ï—?eCëP}›üNoÑ¢LAhZ˜Àc}‡]Òþñ[½"wõl6ÿ`²šL®­obrÙŒ&7ÑŒ˜Ü}%z-mö ñeó±ª989g\È~8÷$îÛºã¬ù‡NCšvfçjaÙ’ô#¾%ÜäKîèÛ|³Ò±£ƒ½ÒÄ–Óû.]ïõeó¼ÒávÖ¸5ÓþºÉÐün&`óÇXWšÀÈü°*¨–’k9¼Ä„ÇÐ1àöo-”’=y!²:œurµ¥ö}C'gššj:ãs…›»vœã‘2¢Ô3lØóÇIЧ8þ#mÓÛ´T3pO Ü Þcp¥Þr9&ý©\ÞIÿÚ‚.ߤ?ÑŒLúœ“fÙëYbSõÅ)´]rB9B‰é„¼6õ)4Ï-Äm§¢oØa‰Ãžõ#FÒ^ø!¢{`’œµ•rŽÝSâè´îÜV3Þo™?« áænb¼Ý>F$VÎå‡O€]Õî÷£7 {ªYØ]ÖbÞpg»YÖE#`…ÝF#â–9Q'Å¡³¹°-¡5F‡ÁªàM6‡ÄÙPÌù /[2'Z€¼áÄJÖ.Ñ]¬–[œbùÛ—ÞsbvˆµyCOc›©OJêT¬7ýeµËâ—C@Ò‹»Ysª¿Uò3çä Ã#!ž¡ eñ¬"4Ÿ¦äÃ%;ï9>C%-ù°wUòaoPòa’‡*„OÕ»ïPaMGÖP!gÇ*|¤:{ÔqÜ᪨&ÞC‡=ê8R ÛROwL <®)ÎÈ:æ,Î'У8ßcâŒU.ä(ÎØ^œaïª8Ã~Èâ {g!ÂúaMÅEÖ!gÅÅ"9£â"±Š‹Œña¾Š ûÀö®*.ìQqqÄmO·•´Œ"O‹Ý2kŒ‚ÐÄÑYä˜É {–ö"­+bº7£À!d2¸Ü¬³RŠ#Ƕ7Ÿ&853œjš&64Vä¨ÙR~2e43ä·3Ç3Ã1F”Š5[cUH+V‘gÇ:ø†1…æÙršÛ‡£+Ë×¢5+€åÛ2Ú,Ü‘Qõ'{ ¶57Èuž0±j¨*¥ëšÒ­ÉŽx¶Äþ+×Ôë=(+T›%‚d'‘Ùãï¯Ûg¶XñþýiÒ`š:‚´çT Dè<—²Ú˜òOhÇÓ¦Yò8§A(Ü`inÜ?kÏ8(åŸ Ö:VÖ /7öȺìüp¥Ô(>xÞEÏÕпÀ{ð©¼ç þòy;)ð) |<'DÁ_8t0Ö˜Ž®á=Xrð |º‰†\ãST0×Fì<’ZnÛ‘ª³P?ÿsúq~|”ú×¥?X 5áŠmóZ¨ËvÒv”¾‚ž¬×¥:à-zÔ¯ºË»¿ôWó_ôë0:2†Õ¢c°/ýyû2¼)šÃCO¦8:„˜UëÏ^p0°Ðãë÷x …Ÿï¿ÚôêõUm¹ w¹>s> endobj 3025 0 obj << /Type /Annot /Subtype /Link /Rect [99 86 158.250000 92.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_pattern_matching >> endobj 3026 0 obj << /Type /Annot /Subtype /Link /Rect [445.500000 78.5000000 497.250000 85.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_defining >> endobj 3017 0 obj << /Type /Page /Parent 2 0 R /Contents 3027 0 R /Resources 3029 0 R /Annots 3030 0 R /MediaBox [0 0 595 842] >> endobj 3029 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 3030 0 obj [ 3024 0 R 3025 0 R 3026 0 R ] endobj 3027 0 obj << /Length 3028 0 R /Filter /FlateDecode >> stream xœí]M¯ÜÊqÝß_1ëžÇîæ't¥^$ #‹à9N`ø‘½ðßÏ|sGÍ9Mö™ªn’—ü$]Šd³ºº¾ëÔ/ÿþí¿ÿóÃ/Ÿ¾ýßá×þ÷Oß^ŠcS×ÿο~wÿÛû?š¶:üúÛËׯ/_Oÿýñr½áÛ§?œþôσ=üþôÿ¿þøŸ§þ©ÿGçðÛKcšÓï½üÞ5æô§âöûùçÿûòÿrøÛù‰ÃëúÅüü÷ßk]YŸ—1ñê/ÃgšË¯üú·—_®ˆ{‹-˺³Sºò`ºÒþþß/>½`x|qìJcšºlŠg^ÔØó›ÛŒíN´©Fï¹ü’yºQxxk­ÞÃ/+—&Šqµ >\rg;S(îìíé Ä?]+õvö²r­E7ç½µ¦ªÛÚžäÒ±-Üõ¯Ïʘá4ûðöx…‡ÛVñá—•‹S¥ßåÀÓpUÚá˜RDoWxx彇_V.N•asñÓ%7·.:=éüöt ò7…Ó{øeåJÒ?\rg›ª¾’§j4ˆ?<]ƒø­¦¼¿¬\š(÷KîlÛ³åÔoõr]¸J‘oڋȦʰ·øé‚›[m«¸¹wWx¸uzâþºr­Í?ýkÌSðR®?ÎúÀ¿¿üòåDÎúðýÏg³ýòÂËoß{)O9ûoEsøþ§Ã¿žÖSþÛáû_^Êc鮌ó¿»\±ÝåJ{l»¢¶ÕÝ•ÂÂ+ ¼ò ½§*Ð=æSüÓŠÏ—+ÕÑÙ“2˜·jÛ§á/Åï¹>­³XHü¢žøôÏßOŒö˜òìë=dsâmO®ÜÐ/«¹_ªiÑ•žzî)ÑÛÀ{àÓl®”ðŠ…«.K)£Ch«Ö£®y…Œ€™ç<¹˜ŸáÓœñ¹r ? ˜ùè/ ŸFøbüxæXލd\¼4ׇ7ÈŽ9´ÀïÁŸ~ew¬Êºm~º§BWì—Xš+ž““U,¡­àÇŽ$uéÈÖ¦º~ÔIÄöLõ%^€Úðh ïy…W>Ç¿ÇÁ+ŒqPU`%"»Fèö ^{jáª|O@ŧFò{%/K7‡•<\A‰iÍpâÇ„¥^O€cñžL]Ióu]7ÐôU]ñ\½¤¶*w/éíKw/Éc“ÁKºã“5«MÇu>¥‹ž›žRR'êó~¢òœ(×{Æo|’ØXÑý¼²¨ýÏ[¾%¤©gçÑÃ$ÓíÇG¦8Ö9;ˆo<%„Ã!Ñ)Äg ;¦ðž@ì…y>íØD‰3„LÄA‹€^ÀŸŽßChŒ'Äfú(SÄ>¥Ò¸§Á2åOÇŒh¯O3f¸4ãiãðêü5Ìx²ÇGñÆa B¸2£¸.³ A(Ášc¡†#昉Ճ¨•)ÁcÒÊVÄÓˆ¤>ÔÚ0e—\Œt”zb¾Ä»À¤k!EKLkœ—Á+=› WQò¿ËA,íð)ËZÍ(í­†/QÞª*\ýó–FÅÙeÃP2A ß!Š :a›Ïéû¡ÊçïÖªE´feHÑø|­’„?ýÍRâ“pfÂÉ Ûpô“P-å©/‘àõòRLøÊ8¼©œIÛ§¸Þ5Õ±èÜÏÉùDy€Äôó¥=Et9S6B(AÙ£IÛ4£JÅñv‡Ý |ÏàÙ¹þ¦WÞ³ºÇÉ2¢£3Ëøç•"ÊHáÔ_÷¡_fs§£"Êœ> A\œJ忀8Öu «¦õÈ9é@knn×øHÚbJ]b×ÎÎ&¶³ÚÄ®+3›ØÊNÄrj@® ¤‰_{yÓW¼Ï’¹²Ýx±’¬Þ?×ôo„\“DQ< mSúTĘýS¬ûD+büòåU-&zôdlŸ©Å#Ì\–/ØÃÄËØŸ„³’,ýÄ„Œ – 8_øh¿"ŠRgO¶ 'BÐÊÆ|Dý[J' Uvvz™£}ˆØâôQ­Tø,3ú _FóA©Ei1Ñ.I¦x³¯ƒx”¸c$·lÇNª÷0YXrãTè6J[cÌëDÁÅ­6¯fsõÆ(eéê™+SV?/P½ö©ÍܯuÓ«+#šÁ±õ [–Oå¿’ï×y%ÿÎíWnWÒœçvè¨I®µ_I¨ø=MÂ}¶¸¥Ä0S/ ·ŸŒmrŸ5;÷½i Ÿ“òw-NÒ- Ç–©¿.€_;/1Æo~®Xò•MrlÕ­šcOƒþøûáÿT{袄ûƒ{ŸØSýÔ–37 _ÑÄ@z '`"Ð6w Ê„°ŽV.é_APþbüw\$Ÿ¿½ÑbË‚â)="¨$¤¸*$ôHËDÈx¦Ž^¶ÆŠ©Ç!2³À=ÑQb²yá„éÆôk‰Ör0ýZT%QÏ¢TS.ZíÑcHÙG ƒÃ«íãÆKÆk#ÀŲ ?MvÕú&Yk±+‡(€¹æÄØTÿÖ¬N>Œ +c¹°¦3ÓpTÁõ(<—…–[@Ô–²õ(µ©†8ÛºÙŒ€ã;ï\íËÏüö†¢u „:ÉùrHxòÈHÎ3½„G+‚€B!T®ôB¹‚.Ø$‰¡ƒ¼Å°ÁÈU Û@ƒÓE4X%s£Ei°-Ç#ÊçÇMÇL°> 9ˆÉì?ft¼-x“§23Š µs#+fÆXÈWX`ÂMW cg!ñ9±x"²Îþ>ípQáÔÑ’˜¹c¢’O éKÚ«W.ôyßOsPŽ©=êD(32O¶!XÂ% dž ÿ(=ùâ숾kÐØ«‚HYbr 뼌ò X/ÄNÎ"¡C(³}öú°Ît¾*\̱H–@-‹éªP h€±ÙæìOc°0fýH)ÊúŒÚuœ[Û¾{ºsŽ“ÎÈÙú1Gï [ ™ÓQ&Š 8¾¦niKO¹P€d#ve„Qâ#œYÁÌŸ6ÿ¤Fœ­}2iý0ŠkB$Ÿ²j1—}¾ßÖ&“.¹šš¹üš¦¸ýÁ´fxs"Á; ' VeSO®'?e§¦îsAƒ«Þç‚jœ³®zâœåŸ4Œ‹›“IÒ„»UÝZÍ’Mq­n¡BíbÊY“Í4‹4ô2±Ù¾PÂÁHÕÇ'dY@ðˆæ¢-D•½Úƒ éƒ ¹Ä­ô[‰–ó¥™à­:BÍzÊ‘ƒŠIÇè¬!Dû¬ 1.]aäæª¤#†—WÙ¥ãsÒQ$]’JI®©EgÏr>©>5›Ÿ5 1O+õÕæÒúª ëkv*Æ£eÙ3‰£¦ª…½}o÷ÛfQÕ+ l‹¬s]ê~mE¶µI”SÈQ£Ç3Ý º†gL WdÔ4³éØ^ŸÚôÑÅv†&X Ñ"Ë=õ©SoH”_$@ËÆÎÆ;“kVÕF ¦÷ª©ªQsf‘›€EBtbQl+JYŠÙÇÓyúfƒìUk­¨ÂHÛØµ®:~Ã"Šßž²Î¨®Íäz„ëöØÀBª)êööÖTÕ» ©”ÅYXò óåegòO]Vñ(”¡ çóðʆ¶´þˆv²˜”È£Éöøˆ„ª„ ¢½D“©„$:¥iSÏèI5Ï%•õ·>KcBç·å­h“© ©lÔ}%÷ðáÇÑ:ffɈ\ãøt |—/›§W–àŠ€(aBxÌ ð9ܸùì‘á­ "/DyPøÜŠŒhb*ô3wžònÃ$ˆ(@PìÛòéÐG9p( )·TTÇä@5 ÝU€ÀÈ@&Ó!ªjÓÔIÇå! rÉÖeS•¯÷+£'÷>Ÿ©ŽEç~~ž[uv;\š³?Ä\7ÙæŸ(à()uË!k_Çæù[|¢ˆ#À„§•àw«U ²zL¬!h2ˆ¼¶vƒÜùo±1À“"¸ T¹L¢¦_ª´kš‹ ¸Qi†ÑÌÍ Êðõt…•º"úEwFÓç`31½q¿™ fP¶Ä3±h*=F ¬º±m“S)ë¢òd¸# €‰ST¬O‚j‚*×¥÷Õ €œëÖ{g2“Z+T°5" K7zy¹íÂcý"fȦg$Z¡²)†Ä8·qY&üÆççÝÚ½]äY/-%HkgvÖÑní- -*KÙRйg Kc1o¢4oÆnUÏ`˜VSWÒ|]S>Ë„ŒÜZK %¿³ƒ8c‰‹e%¿¤”f`íŒnÔÓd¯X‹r-¸Š (¶™(­…-0,)0<4ѺÐgUBIܹg8iÙz¦>9?'$ÊQÖEÝü|ÐÕãˆNÿ.±eÂýØ]”i:?ƒ‰Âdc©@ID‡(ÊL¹\Ã×ù1QÙšYá*ÍÄ@ LÀj‡ä5b˺Z©¼¦dît„¬[â°Á…ÍQóí 'G¹ñuóŽú¤&Ùcã«‹×Æ "{l|_ž¶ÇƯ'£œ^O*¸U+ñEÆ#·vfæ!jSuOœŒ¥Ç‡LÓ>óuÙùwšïQó‰÷ìQs ¹Ñ5ÏpÒÂ¥¢5C¥€\Ô¼=˜îaE}}åÛ\Õ«ñaŠãÕI¼#èt¥'Nu´À³”º§ƒ÷ôî¢Åú{1x—ú½·ø{>A8´‚Þ•}tO W ¿Çá]Àï¹®º9:ˆ[u…èøLQ1“ 2²s'÷ÂÒÔƒ×?ã«;©[|„”J„%U»ÛPÜ„.3i€˜¿´‹zôÌ`¸Ñn0ݪ"s dœå’oˆœÓJS/‹cº¦’© ˜¼˜&þÀøc¤™&ºö‰Ýk³D]ØÂùj EüGn§”p^Evf1ƒ€E4XvAí-¦`bye,Ét¼D1„–¨H%lúòl–l¸41sU5’ìº(P§ eA>cP˜aÂfó³2GÌ×^—c ÑâMKÏWÓ€¬%´Â½Y[™#M âmîVµ¿©@•öeŸz½°Vì¿3î6¥Ï%L>vÚ±I‹i>bü:Ñ=—hèHŒ×J!Æ3]Ùç(ÊFê(p¶\&)Õ³„* à*“ÇYLšƒLeAmÔNxå|U+Óˆ#Ú HÍÀKùÆf¤HæAXÇ‹šQKF&DºìPh*ó%2c û‘ Pô ß.`d,ØÎN<å@5ÄZµ³ý4ʭЮ/àXáç]-z´êünÁ€uÌ@:Ž"gùg‰&Ò¨@- ϬÁÂÊÁýÞkòfd 71Ë››m–øóo¹Âê–r]ü*S·Ùð÷©£Œ`blµâïb¶”©_™ã<° …®$Z’¼ø:xc’/WÓíAT$ Ä÷ ŠÖùY|%Agˆ­<=· aNº1¦ØG¶‚þ‰-å¹ReésÅÊ€ñêÖy_ÀD€é"‹@ÕÃiDÅNÌL·34[}Îúà0[k=î“EÒ L™À+ûÄBšÏ À÷`Ä:(C“6Ô5`W6¾¬Ógeüwî ŒE'0ãÏ0JDvbx`8ü*2ft~Ô!¢fˆr\{»ùØÂ¤ßž *X¹xžL ,#Síåp>-•aˆ–€ÈLyÀ‰«ìÇyQæÍáàM&f*ä›"¬ë˜ú2"€8Ò u˜òhY°… "e»‚êÏÁïÑïÃ0#“C™@ûor²m@òtˆkTÓ1¨wOŠ›´ÀÌ9Àx·=—À-ÆûØYº{ÊLްÛÁTî'a¨6A”µ/¹ ü*ª“á-בÕõAK4ŠC”‡oõBsKuð¨àC„E†ïÇÃ\ ª)ñÚ°¸À"§ñ=¢â<¤Á"sÁâïi€¢²#‚ð{¬¶@p¦óÏRªÆ¡­– ê~WLÍ>/JLMƒÃ¨Y d÷ó‹Ôå«#ÌÞ¡,B ìѰµ†‘^³Ì ¡Ü7%°#ÀT˜ Z†yeSê²=ܲ±üå‹ú‹ê»×mæ'ÝvýÉ,¥h"*ušÚSŠ}œè«Î ^õsˆí¡V¨LÖ3üøÛóíÚ˜T1SŒ>ßþ{BïÜì¿+«›1«Ÿ9ö°åñ|ÿ9ÈÑ–÷?ùëË·€‰¨c[^Öà—\„ó’vL´~[guC©^i[ç+¼§C÷º/õ®Ê¡ùqÆÙÅïÁý’ø=nRHƒÛ˜Ëñ—â.OØÏZb>PoÈfŽÝq¢ôÐNY»Qý°ýÅ¿ä°Tý°UõhþFƒ\2x㬛±¯MÛz|Ee—°Ö—õŸf·eAóìüÁ—ï­zóÌ–öþgëL‡Ôçy¤fN&h„Õž*0FôÓ>ú1½ûÞfÿöâÊÚßýÔ¶¹ëóÔo|±÷AÌz[%šèRmRŠOw€Mà”N•ä区Êjg ÜELÈÀ9Šˆºh·ÔÄ— µ"qÜ/Ž÷ÞÀE÷.Ï¡ð<™s’?ÙÈËØ.kN˜HñªˆÅ/k”­©G`1Ðê…”=ÞÆÖZÓ¥²—cJ5)1¸6Ù\ש``‚hf“ !?øÐºæ“l­Tbˆ5ôš‘*yÁtì"~;¬¯½v¼¬¦ïy\•4¬‰ÇõÓF=ßr‹Êù sÍwV#±(2óiљúˉO ?ÑHÆÄá=]ÑVuÖ?p¸ÿÇÙ‹ëªü ¯`Š›9ð p㌺ùWw#•¢\C»m}aßÝÁ1p^Ñ{Ü”.x´¶/ý—¢É8OSú‚3M=þÀžp–Ÿ±ŸaðÓà=½¸4QŸ~×wÊ2Üùϧ+Çv"¦*dÌ6xg3ÕTµƒéÍp ¾ç3:n‰ù'nðª1‡´pmøKÛçy»)ܱ—‹ó˜¼‡?~Äþî5Ä”v8|}ù§@ endstream endobj 3028 0 obj 6035 endobj 3032 0 obj [127 /XYZ 38.2500000 548 0] endobj 3033 0 obj [127 /XYZ 38.2500000 437 0] endobj 3034 0 obj [127 /XYZ 38.2500000 230 0] endobj 3035 0 obj [127 /XYZ 32.2500000 263.750000 0] endobj 3036 0 obj [127 /XYZ 38.2500000 548 0] endobj 3037 0 obj [127 /XYZ 38.2500000 230 0] endobj 3038 0 obj [127 /XYZ 38.2500000 437 0] endobj 3039 0 obj [127 /XYZ 31.5000000 264.500000 0] endobj 3031 0 obj << /Type /Page /Parent 2 0 R /Contents 3040 0 R /Resources 3042 0 R /Annots 3043 0 R /MediaBox [0 0 595 842] >> endobj 3042 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 3043 0 obj [ ] endobj 3040 0 obj << /Length 3041 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯ès€m‹% `{Ær0ð99Þl‚E¼ÈdùûQwSšY©_IzM²¥®±kïÐ"‹UŪ"ùªøá_ÿ¾ÿç¯ûŸ¿þgÿÍÿþùë®8¸²8ÿ³?þúáít}ðÞ»ºÜû¾{Ù¿ìžvOí_vç¾~þsû§ÿíõþOí¿?ïÿú·ö‡?ú¿tü ßwN¹ö÷Ÿ~oœjÿTô¿þ¯Ý_~·ÿåØc7œ'æ·ÿÿƒÒÆ´]´dL ý²ë¦©N¿~ýöËîÙËFѶªŒÝ+{üOcõþ¿ÿØýÔÐu_«”«¬+®ÈéãH®hÑÍqT7èô+L÷*BçMYÄëüDyp®(S)¹÷€ÂuE¡# ÷µûüwÚÖñ:?QK¸Bï!…kœgPC¶}ï1زl±:?Qš)haç!%kkQ²}ï1˜_ZQmŽ”Ç’,ì<¤d+çÙãªüé{Á|ÓŸ(Í”N²°ó’­‹"¢dûÞc0¿veÄΔǒ,ì<¤dí"J¶ï=óë¨Ú‰òX’…êÊÿÿL]Ÿ8VVíÆKµŽ©SµjüznÊbï{¡SºŽ»)ͯS¸ó’5¦Šg-^{Áü– ñ:?QÉZàÎCJÖ6gбh_»Ðy¥âE†gʃs¥“í¨÷§%½`RÎ?§y/‡Ÿžw¾´4UûçŸZÊΞ~{þ¾³íÿÏïl³þqÿû–ó‡ýóÏ­s)ºTçꦨty"øÜ¢Ô©E™ƒÑµj›f´àÞ Ç©O-æPÚªvo[Œûùô{°æ|@{ûõ¹E©®—×–’¤—+LÝBÚ ð8h¦æÓ©¥9ÿÑŒf>#±(t‚%Ò‡¢ž­jjàÇçÖdÄYíF5Ãåy‰$¬{Èn¼”~´ |Ç´áÞO-e7Ñ9ß¶/ìL1m±õ¨ómhížóËØUåoÉ lb0Û?—~"ýe¦aŠåL(€® ûžÈFNׄ† M¹œGB»n#l ˆõn$[LÒ|5ÿU"˜¤ìDÜA° ø<–WP_"˜b,BË ë5"Ft|¥z>AØš ÷Xx]R|Á{&Úc4ûmî_g22&–2ACFk`oD#¸L5£LLoC£ÁXE!®Ú‚sÄóÂaÛÍW§°°¡±xô¨\‚zÝ ŒHÇ„=LÊp£ßkª¢u—·ùiè «……G*`;Cì Fb ·+WV€Ó®<ñÙ×)Ó—Ó¨ÍáDÝ7q¡E„ßÔ¢*øÍly\>Ž-ÞÚ\ê­¾5Œ…ßÀý ~ƒçƒ[0wàLñ8x¦Ê-Ÿiu”áž!¦ÅB °L±|„™Bíõ¤±5e•mM¶5ÙÖ̤À`Éá™¶÷†g*´@¾%µ5íïÙÖL¯@á¬åx5µ5ª$øöR€eŠ5CX;a¥C ü­wš5ÓØi™à9`Ž0± a±c­`‹°Î²EYCôgš£—bÑ‹ ‰°…ñ‚Ý!¼„†>Çë[K\+e¿yo-ÙÙgK!nëXEŠïŽRew5u·IN–Ý…‘~ó“,=Æm†…%/À'Ï2ùXBÊfØT4"Y@aDfÜA&Wt>ô ¤i 3ä “a«ÚBdH× ¶>ÅÖ”}y¶5ÙÖd[3µÉðQÞÖ¸€‘m´3|T\éï >êŠæš«òwM›½+ÈœS*_õ]„õÖï &ä”Y„×ÜroÚ· ˜ƒS6õØ6[îÍó®â¢Ø©êªK³„ªª]bËÅÒ:ÙìE±ÓEuΧ»(vZOßЄ£§Þ«æ1º:SwÄø‹4UÎ÷ÄoØöµø‹­ò ‡—Ëþ2lÑ7ÚÂo8ޝ®¤Õј¼­Ð|Vòã¥ec~{Q‡çóòÀ ü­â¥o*Hu[¼ªÊ×`ùâœùá7[ÆIDà”•j–k‹@[i{„z„Ç9keu0ê¼²‡Ï (}õ´UÝóŒ™ ã0|ƒ3Z­‚ºó¦òßPr‚I­ŠŽÐqF÷çÙ½"MØ0Jغp ’ä‰-ÅPaoŸ:=ª ÿàå= iŒz@ãø{Ñ7þbà]¨eê¬á¢Ò[à*”!ª3P' lEˆEèm~9Êb¬\· */R¯EŒÞK!ŠNÊ8¦/qÕÀ™Ü¬6cà’›AÞäx¯w‰Kw¢D¹ua¦#ià©Ï¯S›ê gÊþ˜†›zZcÁÂ4°¤BTø \r:~:Vý.pÚï \¾­<ÕÅ|î01¹0NÞ—Hò±jþ¡ƒ˜©º¤Ôá’pÌWè°{[B¶3êdÛI„a·+L‰¢‚½D†zSg@ÂcfijB£©Û„ ÛÃÍ2@8ÝL™ ø2[€ƒàùL¥Â\újˆ†úT© D"'’$“E$ ?*1HƒI%{oÚÿ(ÅVz$Lj8tÒßQaWŒÝæŸêQ'5ÌctDÈDÝVäìûd§GË÷q#>]UƒU{§&1æsâ¥Z¾õê ÷4!6¥“v'®[SÕ8ÇWÓñUÌ'bK;HÊl©ûØüæ‘WÞÁ®|›-Å5å1ò~øžöÃY 7.3‘dPÖƒxñ–Iø›œd°P¼]’Á«|s’$ß}A[0Ïs&33%Ò´_¶+.9‡6Ê÷·GË |6°2/´ÜÛúV ‘º"Èò¯¹d©•êA0¯"ƒIç{3ñˆÕFm}˜áþ?.~S8R$°ÙÔ9sC’å+0ÛA”ãÛ¶˜G¢JœX²Šâyy¬`yIÄajÃoê6*¨7cœ2sMX,A/äGPÂÛëÝÍ¢›m¦lÈ|GtŸª}à?ïÅ3l'pJ°Å/»\œŸAåÍOkb¼“Àä›Û ¼’”i2Ùgó9 CÍO‰Äp}1±ŒÄ(¤»Òü°ÁÝÝ çÇM¼ ˜Q¦/Û€„6`›8­¬;Õ;…”/ò®-·œ*{,[¤„k.[¤k,Rü×cÚ2h£¸ŠØ|!µõ )ª¶ fñH‚D2iªªÔ™&>Î-þ›_´1,¦ª† Í5õÅÉÙ1E冞"§}‡I¿LyÖ[›ü°äª"ã¼³Ìg½A#ý6 ìÊÌ6`6 ŸõfÝI¨;Ùp6:Ÿ¯[>ùäX'Û·¼~®´oñÏ¡›¢{!ÃѨ„¥áQ”ÐIª£(ͼ³׸¥©Rž4U¿²í_ƒíϱS> ê}fØ×=ežmÀ*lÀ6ÏFÒ®Œl;ïiß¹9«Zïµ½˜ ¦Ž&µ.lÿ꽯÷bƪ“|A->&­Õ¨æ…ß4èÏ(åFY]å{µ[´ƒ[`o]µ¢ ã`ªÏ˜whêÁL»–Ç<è*]óΧ«R³h8o6Ì£ X °%Qœºhú[˜D%0°…y&y!vAžsà'ž7 &Ì‹v`9ÆÂ$qâG«ÜpàD…¤×ãop&sÔBA¬Ú’G¡! Â]§ÈE°ke:×¶v·é_ò ¦lµþôwh!Õu"”ö……‚;רè/QˆÖK¬\¿Tm‰íƒˆOvºÎ ½Ý»3 òÜíjŽ…}¬mþ[¬‚ø "ƒA8%bœâˆ˜¤DoØSA³)gâC&eÁÃÛx÷A &˜vŸõ©÷fàšð Â*³‰ÈgTÁm9¬I6y@s)Ü€a U·4NŒ 0¶Œ8¸Kñªµ~éo̵1HH2Ÿê‹Õ“ôP%,p¡ ÜÞ*–ë²Âã0r„…7,.ÉDZ˜¼‚á3,…í£ÿxª„W­ v«=cÍTª5QAÚÚ¨¾‚åÍïÒßÑ9þvj^ç 1샖ÒXÂs^’Šç)#VSu€ä5{&:Ê-½_ÖŸ%’6ŽÂ †x«å{'æ!mjHž.‡ÉÔ:Åq:Žöpoxg‰÷*8²Æ lÌk(!‚Ç3Å´ ZEì.°„3¼'ÂzM@ã} ˜ÆƒÕÝ[ ‚ƒ¼Î\0ìžÑÜ¡Iï§…ñ`žJ¤’°ž +„¿aRjß&$Û0ç"ðtŠ‘‚@5áw™tÆK¤òÕã ˆóaæ„Zóç7ÖöÇòÌùMìA>!îW…MkÐî’¬ŒTÕ8  yJ«K’#ðýC=>š "8ℇ)¸KÏe¡AQ>›‚ZQ¯XÏÑ;‹²³!–ë/•ÇL¨°vèçîã)òÀ` |曋 ³µ@£È–“à9‘oEøÉùRyï2Õ žµuÝ™Œß³,KØ`®~p VÆW•КSÉ2v=P@ÅÜ+¾±QD-ðƒÖزˆg*Üa€a«¬Ça{ǻޘnÆ ýÌ;F݇ ’ÃîRcx¨ó&¨ ÐÙQ°cq¯ØªÆ×¾WÀwÙ‰|sd‰WЈ¶ÊÕj3*¼Èq +x±a ¼Ç žªËj ¦bÑ@!∥!p}TH8ÿº#'ºl6Xöù÷Âe.‘„€ÁgLUG^…aa+Aâ«T|ýÊÔndà DºEJ`OYö@ÿœL%Áˆ¶wÆ]ê k–ÏŠÓÓðëÄaë p— ÚKj °¢ ½Aõ eú`é¦éYsú ®lœLÂo×Ú_û—V,¢Ôž¦þÂŒíI}I¤¦ uŒfOåŽÏt+²žévâóßÓ}>gÙ‡jÜâéô…"È nGÐ8fêZòm_üLQ@Oí+I$¶+4®¬a÷nbCta ÷¿ña²Z4õ7a«pÇ?·w”ãTDÌU¨ó«ÀÃrÀr$>ÅÕeTC¹ú;ª7ê‰/û »„ âo¦./).³@àÔý¹>‘¾DõÔQøUÊî sð†ržÖû Þ—ÖÛKôIoð´ÚýÁŒ endstream endobj 3041 0 obj 4038 endobj 3045 0 obj [128 /XYZ 38.2500000 387.500000 0] endobj 3046 0 obj [128 /XYZ 38.2500000 387.500000 0] endobj 3047 0 obj [128 /XYZ 38.2500000 261.500000 0] endobj 3048 0 obj [128 /XYZ 38.2500000 176.750000 0] endobj 3049 0 obj [128 /XYZ 38.2500000 261.500000 0] endobj 3050 0 obj [128 /XYZ 38.2500000 176.750000 0] endobj 3051 0 obj [128 /XYZ 38.2500000 715.250000 0] endobj 3052 0 obj [128 /XYZ 38.2500000 715.250000 0] endobj 3053 0 obj [128 /XYZ 38.2500000 604.250000 0] endobj 3054 0 obj [128 /XYZ 38.2500000 604.250000 0] endobj 3055 0 obj [128 /XYZ 38.2500000 472.250000 0] endobj 3056 0 obj [128 /XYZ 38.2500000 472.250000 0] endobj 3057 0 obj << /Type /Annot /Subtype /Link /Rect [481.500000 743 549 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_multi_argument_typemaps >> endobj 3058 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 611 546 625.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 3059 0 obj << /Type /Annot /Subtype /Link /Rect [361.500000 479.750000 492 486.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_optimal >> endobj 3060 0 obj << /Type /Annot /Subtype /Link /Rect [357.750000 275.750000 429 282.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 3044 0 obj << /Type /Page /Parent 2 0 R /Contents 3061 0 R /Resources 3063 0 R /Annots 3064 0 R /MediaBox [0 0 595 842] >> endobj 3063 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 3064 0 obj [ 3057 0 R 3058 0 R 3059 0 R 3060 0 R ] endobj 3061 0 obj << /Length 3062 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹=ì;@ Èa‘C°›M°Ø]ÄÙCþ~ÔÝROÕ%~S¤ÔjÅHì GU¬‹U_½ûó—ìÿõûþÝÓ—ÿìèþ~ú²+uYœÿ³?þùîúº9tÿÞ×M¹ÿá×Ý·ý·ÝçÝçö¿íÎ|yúkû¯ÿíõþ/íÞÿ÷ö‡?v¿tü…_wµªÛ¿9ýíjÕþ«¸ü}üù¿wûÃþ·ãŒýëºÅ¼þÿß)muÓ—1òêo»þ3ÕéÏï?ü¶{w&@Ü[´mʺÚ+kì^9«÷ÿýçî§öýôÅÁY¥êÊÖÅ[^Të㛬s{¥];“*/:ýš>Áä•2é&?­\œ*ÊT*<»äæ6¦9È¥ØÛËì)ÈïŒN7ùiåÒDé·N.¸³N™2Ýξ̞€øNët*á¼òD;‹'—ÜYݨ3yZ€øýì)ˆoÊ*!ÛW.M”~gáä’;[½T)›€@/Ó'˜¼RétýyåâTé÷Ï.¹¹õÅ1&‰ê„®ŽklBÎ9­\œ*ýæâÙå6·²MºÍ½ž>Áäª)ÒM~Zy¢Í Í.¹¹ÚÙ3táè2} ú·Ó§›ü´rqªô›;˜ýsÌ,x)矀Sú·Àƒ¾îÞ}RVµÄ¬ö_jw~ç鯯-QÊýwÇ£yKí¯?îÿXæùOû¯?ï>~m—þ¶·:ðJ[œ^Yµú¹{¥;½R‡ªVM]ž~ï4RØÓˆ=Xs¥¼Œ<ÁøŒ>¿§94®¨Ž’øòLy1‡ÒVÇ\4çgÞôb<½RçO7ÓzkúúÓ5Z¬5Q*øé5Q ZµQ“‰¢kÿWáwO#eOŠI«g¾¿G”~/…ïQu\›*àÁw/Åœ?]|ð’0Q"Ñ@Z0ûTÿÅŒ€} L{8›²pä™Ð-ú.…3¯ôD@á2\ö$e™ö°lM÷këÔ©Aw8­æ•nû€FŠg8âÐ~OÇlq+Ðp¤ImàKWy4 0ˆåü*f/Q‚1L eØog3LÉ9.V7pÃàHàÓvˆqB§Û!Ÿ0°ÆÍb=Â4R²mÿØ{êgWÖ¾~öÙˆù$j‹öä|¡è&CŒ@ èQî ¨âÀÐϳÛ(üYë%ë]`¡ô cs1¿4`ަî¼Õº*=s¹y1=WeÉUƒÆ-gœ,Xµ&7¡õ Føñ‰Ã“ÉÛÑç¥ú%¼MVÇŽûB‘"ýÉçELHB¹.Àø=£m1ï‰gúÀ‚éš0- X^Üsyæ‹<…œbl¿"âħN„ØKh(BÖï™n« ŠU£È5Òx)i´Ïy¶pÀW”¸‹žò³MRšAÄ‘"lUŒó…¿X–PpÚ‹9Ó1äZÙ™;@â$à¤5íQÅÀ>MŸR‡ñ\aÆéj5°$|Ð"|‹ÇH\ª »‰ün¤½sT…œ¿áõ]w‰»t4©¥ôÀ `â@ådŠ g j Ä,¡œñé¹ÝCÇ2¥nr•ØQã¯@2D÷š q2^=B Ü!ÑKæ]8œÅøÄ…•¶š#§ÖÚãhÆùÃ\° Œ+Ä\ -ï-¢ Õ“¤ì2|pšÓ&‹, »‡PN©ùyq¦\\Ù´¯lÄ¢Ó€Êu‚£­Ø«X¥«*ãûn˜ºÄu4•K#š?Ïìâ]_ã¿-K~·¯s…Òçªn‰LAÆXY"S6ÏàÑ2’Æ!»‚Æ+ƒ™6ª<æ<}íõç¨Ae§šFú*ÿˆ\CÇPöP î´ô–ŠZ›A÷ý¼Áj¸Á§}:mSu, Þ+‰•»þÉ/»/©xäø&OVî*™£™Jd¤ÇOoŸÈ©Š¯G¢²uaÇ¿”ñoÉ=øæ¹9•=ÒAÚ$]]Õ·Eym9º·fƒÏèäÉæ¦6ÓY?-²ã2³F¬ömÌÐÎAzáhðÌôrömâ¸aû‹°NOrÜg‡F ¬zÕÁ¢¾Ÿ»m1ÎrÙ\^ù¾·Ìg§ãj1ŸÐH·ßåAÀRlü3ÝGßzÆ¡gìymÎ߇ê`”öôš¾³ G·×ƒ,ð§?¡‘ޤfƒ„|:¦R6¢tgªçh_ð{Ò4ªéiš ã' ¦Ò*£ˆXXÌ$>pÉêÕpê”óÙ dCØiqë(× v‰ “àØQÒNd G˜7"¡€ˆS™ "u ‹„Ð,óÌulbÎ5˜o1=@”3NRq𙹹dÈÅWŠÖæ±ì‰åå¢úsÙàÀgž¬pBV®ZB¦Ž™-ÜpÀ&Šê=ª0UD1åÏREYúöS"mt‰8ƒég;¥FßÂC»°0ãU¿÷?9†Šf=ØRò1Þ˜«©UÏ]ä)æþF¿‡ÏÀ{" `ècü{ Éõ=Þ¯u¦B³™Ž@ºuÎ|Ô—vâ%´jüŒª‰gðM"±|û¨ ­ÞS<æ*Hk wÎB ¶xÕ˜« ,”¢³Y(õ˜˜¢® Ó ¯:°?ø(s¯K#sGù ¾§KÖÊcsÜøzðˆ†\®Kb6‚VXš°ýèf¡d`9Ëfsp†ö0fÏDad³ÄÖóÁ£#%Ø/rù$Ý}‚H¶¶¯®êy³-Vqí'›·0*øžÇ!zØ#£æ¦Åá‹Åáɘ†­‰±Â$ ‹“ÔLÄí$—­ÌU¼ „çËpg¨¬gïªo)£|e 9îœ*‹ OyÌ5õìzÌeáv+œ-×­T®”h†G±½$ú|l×ÖB>Þ½U18§|{¯‚e—&‰H¡º§ë=\¶:O„¹ÔÝ´ï¦}­}§¤„Ì­#3„“GŦ·y}\ö勯QÖs45Œ ‘ØÍ‚m>›ÊU•…ÅÀ—\*œªË»aÌŽÐâ²'t*K¶91[@’DKEñÚÖ_;$ÖTJÕ…‚uÿÆ85B=ý¹5’\chgý/H,þ X’,*áQEòi Ïæ34•Ï,[Ñ–PEË\@Ìýob?@¤7£Fm6q_:]&öq—Þuu;ý +Û v¾zÉL¿_!Ÿ2hm¾áúÏo«Å&didµ¤l§ù3@¨ÍŠ+c”s]@JR¬VÊ@`Kœã)K;ÃU^þF5çç•ÂÄ@1÷ 0“`Li$ÓÒñDF÷ÒãD]ÿ$]#™>þhêqA¼«ó!ŸŸ3¾a-ÑN4kúíÒæúst¤9.ÁÛH‘àü\þt.<7WÔ=Á€ç†ß3Ï­ýCöŒF0ÜÙ†™§H•êûq-3MÔ\ÿýÆ]6e6‰>Y"®Õ'kè\¸™À¢#Ù˜©˜>ó3WY ôÒôò¤À!–éé2C„Vž}[@)Ø8#[Î’[o]±Ðkg[pSÕ%žõ8À=°°?WÉÿ á8\{R]ÇÁÀ‚à&øÿA àÞ,gXÒ-^5œ-ð¥n ¼ÝÀ: #L†ÓEÕ¿5W2¯®.¸o™b@‹¾WËU)›P’J#Z=Ô…È•šl>Þ§š‹ö§—¥¹ÜUɸ65ª¯ç\›o²\”xÜlsÁ»ý&WmDAÞ¨U3’…Ï©˜Öø=pç(ÈQü¥pÕ—™ Ÿ¡±ÏÄ.V9ËáõøS‡¡AÑN™¾3`§°Â ¨Š)©ˆg#àg„±S¼6×þ4¡Óð3Xž ç€îÄÏ0Q K!v!°jhÅ«&,ö#«f" XcNÄ+ÀVˆ63ñn%f%F¢4¦YPwÃ-SG(Sç®:ëÍÕ3*ÀnøÓs%~ʆ՘ËiýX¹ (‚é­ …ƒ$L3¾ˆ«¼Øíw|L¼ƒ`?ì‡<Þ-T¶fÌ{°² ôâ¤ZRBŠ6þ™ à„-B¸#îÆà (GaPËfB0`ÞØÆ"{bmŒO|Žcn)C[Ê7[6ÐpÑõµåF,¸›Iû¹Oe™/ËçŰ­“q߀¿§ŸHj{IÍ~˜˜K܆‰ÈµÉBû-9æ éˆo1ñ÷Œ1—V‹ÓjÁ1‹£×“0$¸…L*‚ƒ)JÀ•ÞƒïQ°F±ªœÑ¥ºé¡jå¢KãomŠÞ¡)p|ul$ÏJµ^Ž^$F·¹bëXËÑðl«Æðÿ ^õü65G;ƒ‘0`séUš+ ˆ71(ôDÄ+")5qô*WyÑlÝÙ·xçZPaGøF¸üPkŠª6aà(ÌT­htBÀ¬P ”¹ªðZ-i#JíÙÂ»Ž±>BL_¤ÞŒÑ_™Óî1SŸ*vËð©(†â•5\Í(ÆWJ§¬huœge#MÆÐòœ­:.$tÏ}!ˆ‹¦Zt1å[Ê•)ûäs ãÕÃß¶„‹-ûÞšegÔÝçsêš«n±q^rœŠ˜¿ðÿ®´czskko[·Ö wë¤û¬Í`DÈGDtÚ„éºÔø–Z¦eêüèÐyènºn9“̦‡ì@--¢kÞ‘ öÇ /³ähòÜXy mce­o ØUÑ•zöv8ɉJk#…;=®WÅà6Å\ßÏÊDÀ#Ç€fÀ]9Ä:£z[Ä`—ʺsK²õœÂ’îL5ZÙª\‘·ÕÃ…(ÊG“¸*)­J]{fem»8w\;Š}ØhбpzN±ZžóÈlKŒ»÷0îÌ|¡ °Ä®­¼*z€·¹ySó4¬§ö{pŽr¿`Ž6ï }¹Ý݃ÁžÐQ®eâë¾£\Q×?™¥£Üq žh‰4Ñ™¹ëˆ³Â¤’Rí[ˆ+ël©ýDÞ¡,­©Z Ùùm™=s”)|[zÞa†@e¹Zõ0õ)Ùº‰:wyåüЀÝD;¹1IŽÃÇóÁÜ`þbôUyÔÀ=Mg‡ù‹IOšî1’‚7\¾ —ïÖbeóJE2™æÎÕ¹E¶“Ív;‚Ò‚l h¥ëÁgà{òAð¶omúöã@ðÚ~©øUãÙ æ\0œ.¦h6R´Á~†i±¶pÞ²5ûãë¡öžhK Q`ƒ!x ¾ÔXÒ ŠfÝûãE½÷Ôn Š5Þ¬Ë1\1Ö—D;Æ€ÍÀÚŠÐ/TÛG˜9Û.0ëL¬}1­áª#DIf×âf¢¸Á%aQ¯"`Óñ.ছ˜-—”`ˆr̉9’'ضKkkÆN僊oWúÒà5OŽCYhuÍœ?Ç¡ÏD´?„—ö ªfæt¶‚·Ò>ÀÜþpkr(”ý /½9çÏ~Fý"‚¯[+Ã-e"<x2ûÃÅTùPIå˜XÄñ-ÊãÞðd»ŽVI¡Ë­gèdôÞD¬V$JcÒu°`Vo¡D½Öa ˜Lp¦ÅvQIÑ™½0)€q‡ëñ3}¨Àøx.xD¸h*7&W5Ð=Uï>ƒÈ&UbI¡ÌMé›Ëͦ€¨B} V%š[pG…%çNn1ŒµÅ02DÚjû‘šë¼Á,;šx¶áQ!ÿYQÙÒÛ*‘ÓV ÙéD#zú œ d›äeÂ" è8‚֫ט¦ÿÀa£Ob„ê10óé%X°dP´e=ß “[#àÞÑ}âÅäR'E,w¾Íݲ´=u¹ Fׯ¥åVÞ ‘ãÈPù*LN1Îñ!2®…s¤q6,Îsbh€s‰p¾Ìþ ¬ æü(*›AŽw›ÈV¦òÐråÊË~)‘©Èdê,Zcî%8W”çïáUãLE8›Á´†y‚Œ~Ã:¾³ y¬‘í[Œ_¶ä¡ŽtTЇjPB¬Ô3z»ºµ¶OÝ—¢ œÄm_–TÀÅöUjƒì„ ç#â뼟¡ðlð™Î”ª¨O¿–áŽÿnWܯ'7`ªBИ˜žãYïk`ÇǨ·j¸¯Ýù{âŽh\ÄÏŒu^»Å¸Œ€ÀOרo外&,³×…9tŠr×+ˆÂg®Ìð¨5ø¼ÿ¼û?qi˜è endstream endobj 3062 0 obj 5654 endobj 3066 0 obj [129 /XYZ 38.2500000 243.500000 0] endobj 3067 0 obj [129 /XYZ 38.2500000 94.2500000 0] endobj 3068 0 obj [129 /XYZ 38.2500000 152.750000 0] endobj 3069 0 obj [129 /XYZ 38.2500000 123.500000 0] endobj 3070 0 obj [129 /XYZ 38.2500000 695.750000 0] endobj 3071 0 obj [129 /XYZ 38.2500000 554.750000 0] endobj 3072 0 obj [129 /XYZ 38.2500000 243.500000 0] endobj 3073 0 obj [129 /XYZ 38.2500000 413 0] endobj 3074 0 obj [129 /XYZ 38.2500000 152.750000 0] endobj 3075 0 obj [129 /XYZ 38.2500000 695.750000 0] endobj 3076 0 obj [129 /XYZ 38.2500000 123.500000 0] endobj 3077 0 obj [129 /XYZ 38.2500000 554.750000 0] endobj 3078 0 obj [129 /XYZ 38.2500000 94.2500000 0] endobj 3079 0 obj [129 /XYZ 38.2500000 413 0] endobj 3080 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 420.500000 147 427.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 3081 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 64.2500000 531 78.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches >> endobj 3065 0 obj << /Type /Page /Parent 2 0 R /Contents 3082 0 R /Resources 3084 0 R /Annots 3085 0 R /MediaBox [0 0 595 842] >> endobj 3084 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 3085 0 obj [ 3080 0 R 3081 0 R ] endobj 3082 0 obj << /Length 3083 0 R /Filter /FlateDecode >> stream xœí]]¯Û¸}÷¯ðsuDRŸ@Q ÉM ô¡@}(úPìv[,6‹¦}è߯mIö åC‰ÇÃÙÚ MrQäp83<œ9|óÇÏßÿó¿û7ï?ÿ{ÿãðûûÏ»âÐTEÿßþôë‡×?Ðíaøó¾i«ý_wßößvŸvŸŽÿÿm׿ðùýŸúß^ïÿtüß/û¿þíøÃŸ†tú_wjŽ¿ÿzþ½kÔñOÅå÷ÓÏÿµûËïö¿Z?7tæû¿ÿ t¥«îÔ™OÛÃTç_ÿýñ·Ý›^~_ÑUQ©v¯JSîUWêýþ±ûùøkóšӪªÛZÇxh Óÿ•ýd£Ï߬Ì^éî(¥Êþbÿ¾Lë*@ãuÙ„küÜsi¡(S+g㇮Tª9¬¸G™ú´•êÅ£‹.€€.;*Ž 6µçž‹Keœ[ܺàä*­Šar‹@^þ—æCLnYÕá?÷\\*Ãä:Z—œÜº,®Ükó!äßV:\ã瞇Z¹ŽÖ'WUÎá^[ þc´Îä÷=äp'òi÷¤ÿ ˆ ¿9^|÷e÷æãÑÅÕû/?Ÿ"»óÏ¿}ùº+9 Æì¿ü´ÿ}Q˜æû/¿ìºCSWõñÉùߟèîü¤=´]ñý“BÃ'ïÏOÊCiúðûÚZ‹ž5jMõï˜CUÖm³ì nM÷}Sj|éúN[k`ßàw° о×íµCˆØXàÞ+؈C~°÷êÝ{ÜÇç'ÕÁèV}ÿ„è¬)ˆaà¾Ù“à13@bm8æÉCæX²xE’¹z9?ùðåhï³kª¬q¶ ø{m”ÿH7/ÕkfeÁï8d¿g÷@5ÄHa¯ñÌQ­AíÅ2(ÞJ΂£×Xãñšƒóƒ{íÐ,FM}$ÖºCg'vOtñã;5±Á`•âš’€¾±2¶st,÷ͬxyÉ8 <À·P}°jã…‚ÇÃ'â%„:™‚ x˜ó_8‡:ãïÀÌ‘|‡Æ]Õ™;Ƥ³„7) ±#……Žñ¼µ‡Ž× Žs=tŠ]§-§¸­Ô%a€pøÅXTÆO3I_8ØÈg°Î½gå?eGOëÚÙ¡9„‹ç{²{$OÇ"ÀKW,+nFrÍ%Ûw§U1î‚–(£–™nK{ª˜ ç%áó;‘Æç&Ž‘||rÚ…ÖDÕÕ¶t±™%à^œ¯Jªð)èÅd¼©º±rî)jù†Âá11x »©ŸœUˆ™áv¯º[ʯÝoÊïÅr4ÃýyЫ}DO†Õ[ôä©$Þéà;z§2®í›¯Fik ÷ºÒÌDüx€ðÉ 4·žÀï Çñ'D»3sxăNÞàp~£KZ£;†Þ/:Uêº`è:VÜu\Œ£ñ‹tމ¡Z‡Ecv؉ž=<ôúD+,VmÓko4¨R# Nãeq¼6}ƒ*Ja8x*ñH¡Ê8d€Qйò(¡“f¤"Ë”ÚÃ%€"퇓ÊX/™åÁò”«…6…[{4£{€·}ÅóMô ·æQ‚*\á*Zã=u±„¡Ž!˜Àtb\˜Tüáåù2>æŸÀü¨éÁ=À ™Ù$ VÂU xÆÕM&‹l…½Dãäô.#š&¸!5¦± iÜ"Øðäñ¿±3nå‘FžgIkרRHÆ8Ãø †‘C6ò½¹ Güuy|­ìW„±˜8&°Ø?çTfX!‹JA‚_B6YžºH·ò¦¤[½°Ã]Ýæ: é—£E4Ü£/‚^•J©ö°l÷ˆŠFB”µgB”ɦ‚a¬¬`d²†»ÞeÃÞ;ø6e7tÂjüÆ1F׎I ŽÀš©ØfL¡lý|¦uÙÐÉêÒšÊÈÄhÏ‹ffMyÄßL¨ÉTc3ßñ0ÞÄž;0MÑmi"¾•ªÓ–ÓÛE ¾³v*óÚTvdÔØËO"’=‡ŠÄ‰áÐAØZzöŠXf‹ºB4 /=Ç®Üéú"ÉD; H%óìärÎ ¹ËT;ÕÕ=®*pa@6œ²-Œ_D>3òAÁD¢|â«\È‘ÂckuQ™"8C„1NŒoˆ.¾þEš¥ [¨¥õD©3®Ô*ˆªA†CÁQ…Á7¦¶g$8ÚgÁ©#3 N“S|ž" ˆoŠVzÝsι²ðS.ÁÞÄÊ´ËMQZvÙVäw9±0Ù+s§]$H*=8%rkëfE‘[ʈª+í•»ET[DµETËüOPÔ²ê앹kO¬ù¥„‡ ©b•.fXër^2Žüä*êç Œêf¤ýz"šP†öñihB³ ýèH¡öÆ$*­»z¶§a›,]·(=d¤‰š'ŒI§ØTfV›e­'CÞ5ÎA‡I ¡åpج٢tÅ9[\ÆF][ÞtyÓåÕG1×L«Ö0[Â1¦d…3l ¶c¥gL½íˆ“’R .ÐXÝ­@cs¶/ÛÊpÍœÁv9grà¶-íIÜÈàÖ‘sËœl:àKœƒ.q ,Ãõ#[ÕM]¬'QŽŸ!ÅÖ”)§˜Ãõ›ºBFnóT!}K£,¹§¤É)Û‰«‹TDÎX[Y‚³¹àÔ§f<¹£y¢nÙ\G€é"ã­H=xܹ¡n¹:‡l@Óuí×Q‡wÃÝPqý¦CÅ&µé6Û{&o‚™±ÿ÷aÁ—öôšªªCa3Ó¿…­ <÷Ó¢KŠ'-f®J}U;iÂ9B&ß“©…ô(Ïe¢Tx\®»V)0娲–•i-ïôƒäMúgTA=TÊ\uÐØ1K2yŽyzŽIê>#Ì#Ã0Ù0w`0E;Œ¿ÂóÃÈÀ£4C„c/Vv$RVЯ†- RÈ´r¸„ã•3a¢/ Yfï‡b ÎÔω•ÌAfÌÌ£àD‘ºëôËrÍv­"[ H;m !"*xeËLJ¡‰Ç3.‹Î?½=föÄçÍA˜bž7Ýíô`ANîr$ƒã'°€ÈàRJ"Ýq~üð¤V•%Ýuz²ç[ÉÂñçÁ%q¤â!|fÛžü˜BÖ)?_žâã°uek]ÂŽiÌ‚5O^.™|dŠ<›¡È¦nŸÌïB,!š4#R÷’ÁÍ…Ìw’Q NP<1®Ýw·=úŒÌ®½|²ÏTÅ¡Çß^MæGôdeuÐЮôÇÑødȃ¼ÑZ9ì­ìÅ êQþ×'x€ðu½&ÖNÀ„­ •·ÍÁëuK(úÎt€Pƒ£¨Fiˉ½CÕÚ€qé™ïÇšõѲk6y¹«¬·§ª ‰ô=l9Ÿˆ’qî©*;…ooó8˜„¢ 3˜íÒ,)´_Ù s$vŽj Í¡±ìáPf€Õï¿n=aZ3h]<#:ŒÆS|ëÉ |b_ISD™‹¶±æb<>™Ÿ)˜ž:AY9äÛÍìtüä µbPz ¤Ýjíañxpß&‚dT8±¾zµ³»l6µ,¦*‘ÛãèN¹Z~-œ0“tr¨H6xd*Ék©À™ØT‚³žÁôܰÒ)m;²ÇicÝCOqs3†›"âªbzøôV+p"¥Å²,!ŒP²I§¥ÒÅ</<²¼!\/ßuÇÍœð3ÓÌJ!Ç‹=Åä3K4©‹îbŸžçÊø¦o8ÉÑš(yuéCÒEm^ìÃô ÌÖ*qß0e¼‹´*ºÙþ8$/ª}Ž'8ƒŽÈÔ¾¦®gÏ ¶OŒ.ãñà‹0i*1¬ÿ˜†ÜA e q߈ìKLìî°·¢¶ÆAC›u³Vúrh©&E«ör¿E†À±IK–òÅPÑLîÜՊªl'Ùœäx’m/ó—ñ$e™pqc" Ô22[ic¹µu1jˆ@sOÃtê~$¼…qÌù¢ð5¿¢é¢AÈP³‚ùíUI%YKœÜ —¨JŒëéŽBž+ötò¯7epÔ8x,µ¿ó)$J•¾­µ¾8õœÓ·_`kËÓ· næo ×)®u­Æ¹KŸpmG©”ëÜö“[f´ÓïJdFûž1JÌì*Vàsc±ÄFãñÌŸS.¤ éi_ù'b«“µÅ­´ŠúWÕ÷,Âu§Ü 7­=hYª¢m Ý×ÚVÖöDeméi™g*°–ŸCó±‹$ϵx8Jg’>¨4 Æu¯9?!h³^î.Ó_8ºªM—È)“Hq_*»ÉÔ’NÛÆ#Kñ¿!»¡¢Û°&…©ªgŽ[Ò[`áÞ‡ñ°ê¨H¶‹M¦s±xb#U 1·JS6Ù5${÷Ïóò(ÜqMz(Ì'¯{οöߎ¦ËiÙ>Íýƒ¦¯½™•rk¡N3³×åØoÅß[ïæÆX{!ë1ÑðÕ“^÷ëé“ábB}¨'× ®¤ô3@ßêÛÇa¤H9ñÑGiÇ—8¥žpP[Í73NõÆ0n ¾3Xå5ôWh8«p§?WþT|†Ž¥ U@c9`xñW<¯ŽŸ“ª_¯á¼ÑÉ+õÄ·¢Aq9ˆß™»}í–â2 }ˆ-±7ÇèÆïRö¦0‡ÁPÞ«õƒy\Æœ»ØÚýÚ—QH endstream endobj 3083 0 obj 5897 endobj 3087 0 obj [130 /XYZ 31.5000000 574.250000 0] endobj 3088 0 obj [130 /XYZ 38.2500000 539.750000 0] endobj 3089 0 obj [130 /XYZ 38.2500000 539.750000 0] endobj 3090 0 obj [130 /XYZ 32.2500000 572.750000 0] endobj 3091 0 obj << /Type /Annot /Subtype /Link /Rect [53.2500000 581.750000 148.500000 588.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 3086 0 obj << /Type /Page /Parent 2 0 R /Contents 3092 0 R /Resources 3094 0 R /Annots 3095 0 R /MediaBox [0 0 595 842] >> endobj 3094 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3095 0 obj [ 3091 0 R ] endobj 3092 0 obj << /Length 3093 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯà9€Çì€À¶ì9, ‡ ‡À›M°X/¢ì!?œ!9ÒóÕ ?v7ÉQKðJ+»«««ëÝUïÿôíÙ¿~ÏÞþöŸì{÷óó·]¾/]Þ~e‡ïw¯ÿ «}÷{VV.ûþc÷œ=ïwÍŸwí ß>ÿ¥ùí™ÎþÜüû%ûÛß›?þÔ}èð»R•ÍÏ_?ëR5¿å§Ÿ‡¿ÿ{÷×?d¿Fì§ë€9ÿÿwJÚä0®Lý¼ë—©Žß¿ÿm÷¾EÀ´Y´Ó¶È3eÍTmuößî~n&è‡Ï÷µUª,l™Ï™¨Ô§™tÝÌjËÑDÇo?냗ynð#äÞ±¢L¡äÑ}nnéêAÍ¿ø? `ðÚV)ç¹w¬ô›‹GßWE÷'箚‰Mîʆm¨æ÷de´îÎ À2^F°ñFW:ààÈ}#¥#*<¸Ï5Ƶ豮€ Óð!°_ÖáDM ¹w¬ô{‹GßWÖ(Sjg}ØdW5$ÜèK¦ûš·®ª¬åÓè!¶¤>¨G¡?Bê(ÃÁ}åº*ú£lC`¿ Ç¥­5á‹rïXé÷v4úã”Q0(í_€ññ,¼øéi÷þk£4È,²§ŸàÚ9?ž¤¸ìÝA!­MöôSö!ÏÍ×?fO¿ìê}¡]bû$×è‰þß1è‰*à;ðÉ—éóø¯'WðÉgøä|‚WZA¨-Ä|¢ëé°)† ã‚ ãï6Ü‚rú;ø,˜£_žšúl:¥¯BŠŸØ|ú©Ux·0ýã=ÁO lwÀÔGN:^Äpf F1ò»?š8ÂþÀ¨Ž‚wÓ”˜BüR¯À×á;âMàO×h7]J˜:"2jx” ó¬o`*Ç;Œ%¦1,3bA†=D„§ªzü@jÆOêÁû€ŸzŸ ]Óæž l”4À+e4i¯:©€Q,u DÐV1Þ0ÁÒσ9Ïò¸ö;š×Ó(ÌCh”…ˆ±SÆã·E^ÎÉŸ&‚Êcyá=!¬B¬}3vöò~op¥É;ÀyÖ¡cÖ…ÑŸ°·Ï¯^CøXüJG†ÆÉÀèiøœ1ܯ”°X)‰Êè(ø ö5xÝ9F Pã=MO\§°s4ž;ãBIÈ£ékÖb£ê(•™s“Íáq·j°U6?nUiªó)U¾/JU•nt´«áZíÞš6]÷å‰|´sÐVûªÎ«|ùh ŸÀáMßÁó``Gëƒx]†® H-}¹½Ñ•:­@ótÞqeú—nYº…°Õ^QŒ×ƒGn‹‚»Þ‰#³w¶8ì- 쌣KïÀ­TùxéÂ; 1áw Š…³‡±ßéØå´í²ŠñðÝ1ŒB &µn!PªéôĈŒ.YpÇœÝ>¯Í9láh­´Tº4„ ¤t©‹x¹·ã0A(ú•‚4:~ø]C sR¼ÙŒ¸„"‰Á,f4 ÈMXd”ðe0 !`ަª"Iá ŠNX#ª*ÌP5çí‘€<¾ªõNFãÅÊ@Ø#¾—GDjíÊR…³Š×ÆPýòÆÂãoøpfÅX}d”Ä1H_oÖ¦hÐÐØ0_˜¸FšÏ–yù…ÑìC‡”N Ÿ aÒ g~ˆ|X‘F &¬`BdôOgC`éŒîOŒ¦"æØ•µ>‡ô’~píIH+¥Î±=ɳ*äEcÏjÄ|ýÊ\‡çmx¡oÀ•­ûYq´’‰EŠÍQq¶X±¬5Gúp|†ÈQ bs19BQ]…'Ýà‘FK7xÒ –zcÝàñ˹¢JájN¶pºÁbOã\3Š3«>å™.jC\É_¨«Ó–`››…ŒñçÕ?A¹¸0Ð#¤`/ØÐ øž°— º× ž÷Ã0Þ/ìt`èÛk´­c»7eÒ¤0é-Ǭx”7CøîƸ`X ^±$„ QÌ€"Ñi7‰~=æcy‹õ-ïv{|&l~ “MæGa–Ád1..ÈD‰à…Î’°C`Ë77B¦X5ÀÔÛÎM¬ër(&½d­ÇÒÏGÉÄÄŒ¤cì(J¢b¤0iØD^±`èàô&Ùn“ ŒµÀwK¨K•~™äÝ‹,"z"\neÙGº>Á¶_|qË«åŒv§òL‹·gZ.1¥fpébár.™Â”%Á-8™b7Dá&á‚,vôठ°`Œâ6gLéoÂùÁóà«mD+1 Ïœ…Ø,¤ªå›˜£úŽOøÆÙr0¼æ‘ú-dIõtHé©>å«VCNÌ+ó ȈŒuCN´˜ÃΫ<Åa)&Ø+Dqn*3e¤‰_³—ƒúåÍ€ôB×IÀ%Ù€-!&X„³"™P×ò`Ì‘ÝVÔw‚ÛS C]Lz$ãÃóªúÜ‘wÀœÊFâ"±ìE\fTPQpql¯v6Sž8©ƒñlYa¥˜W¼?Â;ÌùÁ…#yVQÄÛØSðˆ)’Í?‡ñ¯x­±§2²žqE´[ÇgØù-éM”Bw¸ 8Á1% ¥ÃñhØ %7Q Ãf F…¶ ˜û2'σy9<µ‚Ïtí¼ÏÚ«ðø}’šH臘âþ0¶€Wýt› ¬×c¬8&Ž*ìe&ðÆD¦×,ù1¬¢]…±…¹º'žŸ¤!ö±Ò3ö$b[ ãr5ÒXöL²Z¤d .ÍèL‚ÖÆ´‘Û¤=ƒ©ÛÜšðv`?ÓÚ-*§IªdQ%‹*YTë·¨0â=Å`¼a­ï)Æ5¦x†B¼ÛÇmÉnùfìZ,)ì`Þ Ï6a¢ô/ÌÉá;k·k©¯ïI²kWo×:7§ÝoT»¶œÕøï!_‹WÐͰþCØgŠ0Po‚uäj‡­½ÍF¼\='ÚÍ>Ãü߬ñ£õÛü]hLïõ<'O™(“™ü;¼ XSóš§´QoZôVÖuÞY¨9Ù?÷æa×øL/˜ÊñyÆg†ðÈ­9ÇK‰ífØ&v† uÎÏ,Å'Éïet‡5ç3TÎð4ã–^©çÃ^_ì",Y̽1füfžù`L=ÀÅÎÓ0ØÇèÕËÉdü¬DΔsr.Vm §XeŠU~H±JÖªdb•õ|¼™ˆý¬R¯7•KVØ9L!‹[ÙA"’«”ÛÝ“8šL=''3EXó GXK{cFeK=' *¤vN¤ûå5ô/øõåÄògE=Eé®Tb«toTâJlT·@‹ž„n²x÷e{Ì2Õo†m0üVõz'¬´œTΚái Áž²]éá ˆºHB]¢Ò׸-Súk©âmãòÚLí&¡+ì~¾¨šÉ3¿Ýo#q]¦©Í„’ Û¨ 6ÓΕêµü†Ë®ù¥2¦ô:QÏ_ЉQ¾“_Le]š-/Ù#“΄-ÐOÂKŸ;L‡!*”šµsC©˺ :UÆtÂh|N"õ&c„ÿ4‰ÖH¨:Ýðè<¥Êíóa×ÝXÂÖG?S†í Uœ™†™¸,† %´ ½jǧaI ®Ùs'úm,ÏPU:°>赓päb¡+–ä KßA*Ý”U./ÂêNÄü„Fä~yEÌâÚµêÃÛŠ™'©ÁÖ‰€&¥¼­¹ñN—Â¥0ÄÊ@`ð.à"Ñ8\ÊàÀëhx=ø*°Ûµ [á-–ºèﳦfYk–%¨B /!E…&›ådb5Ù|»6“gŠ$`cr&øšc-0´3}‚eéµ½VèqH±V›\5Óvˆa­·÷;¢ÌžÛi#õ[e/°ûéýdsuê z?¥ÞOò<±z?A³×`°¶Ô/Êw4Þ9*ßx ª÷¡ðz¶ÚËÊ6Çø:bª­Ü_/+›»95òR/«UÜøÜd›U×­Új¥›—›¨ì—ª¤jòTÍàCêe%ë´‚î‘zY­½æ·ÍëØµÓôû¨Ôœú}ïl[eæTåZs¥Í·cµ¤^VùÝõ²Ú¦líÖžr±ëÝ%kOäÉÚKÖ^Lk/õÙ’â°©Ï–g›{›RüíTD\»?@•Ñ«Ú%@ˆ}¬çìIL€ÎguK=ÀVÝl›ò(õ'»zjõœ ŽhvmêO–ú“‰û“ú“­Ü/zýɬ¶³ºžÞYÔ$õ'ó·u‡ýɬÞ³ o—2çlñLæÔŸLÚ…ÔŸ,õ'[‘PÅνIýÉ®í‰É·Ð3Åx¥wRŒ7ÅxåwR2Žß[4މš§þd©?ÙÌ'q4»ûmŠþæ+‰þ;ë0fÄØsr¢BZÍÁéÛìOÖ|gÏ òŽy¼ö ûT—6Î(³ÏÕ¡ÍG¦{K°óè^*ÜÒÂ]^(ŽÒJ.½×ÇÂÐc}µ?é(Sï»6#¯ö®…àR)œ4O'!qñšK°}íV:êtÒðÁ5Oí¥ãº=Åx¡á¾m¸šÍ…e(<|§«s£&-½|![–à¿7Ÿ‹©Kz0V! tlb `b‡x öC÷¨ Í¿"5\íNŒÅd#̃—Gû8\,©Sõ/Q2Þj>%—¹Ùw\p6I¿ªßv•Õ?f»ÿÿ˜y” endstream endobj 3093 0 obj 4195 endobj 3096 0 obj << /Type /Page /Parent 2 0 R /Contents 3097 0 R /Resources 3099 0 R /Annots 3100 0 R /MediaBox [0 0 595 842] >> endobj 3099 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 3100 0 obj [ ] endobj 3097 0 obj << /Length 3098 0 R /Filter /FlateDecode >> stream xœí]IäH¾ç¯È3Rg;oBêm8 •º%ˆêa@#fD1þ>¹8kqæ÷ìøü"v™tÑ.G„ß¾Å{ïÿøõïûþ¶ÿéëöß»¿?}݇º,.ÿÙŸþ¼{ù¶9t?ïë¦Üÿe÷¸Ü=ìŽÿû¸»¼ðõÓŸ?ýoo÷:þ÷çý_ÿvüÇ»_:ýÂ/»ÚÔÇ¿ÿ}þ»­Íñ§âéïÓ¿ÿk÷—ßí=­xÝ®;ÌëÿÿÎØÚætŒ­w×Ï4ç?¿}ÿu÷þ€°]lé}a÷Æ;¿7­·ûÿþc÷ÓqƒëòÅ¡õÆÔ•¯‹)Õö¸“k›jol[ì}éo6:ÿÑYÞè/î½k£-~9¹:TŒ«Œ¼º"r½oí@mü×Õcà¶ŒJ8§“k¥C-^\³•k.à)‹ §å#@¿4eµç“«CåŠ[¼º"rK[Ö€L™übù‹»:r/'W‡J‡\aõCSÙÚ—EÛÀŸ'}—·î´ºŠµ§Õc Ä·%ÅùäÚ@¹¢.®ÉÊÏj¬¼µã¦(¦–,kQNœO®•+nñê‡Æ;ãê£,?!ú„ä²iìñçÚuÿ™ö]÷Yùiõ(iMÊå_@øæQxñã·ÝûŒ7G`Vûo?wÙóü×·#PÊý»“ßwzúãþ÷Eá>ÿaÿíçÝ—oÇ£OÛµ[úâ²emº-‹ç-ýÁ»K$íô{—'õùIshÚ¢²åË'Ÿà;=±-\­}˜ãO–w}ÄA ØÀ…§7G#»ør~R^q=† ñj®Ð$îä€ }ìÑ{- ìçmÛÃù4¯h¬DOÌ'ø¤FOŠ>ù Oàb‹FW•}Ùˆ¹$µÌÂò”߯‡³´ðޱB¥Uõµ–½ìiÌc0ÃHÐÙå±€ß! d°tÒ¿Œ´…OikF3™@·XÌC;@À ¶–n$&ÑJayó9ܺèdõ=ˇQl˜¯Oká´ýÖPŒ®ÂËc“+…a…tUkmOW ^>'æ >Pu3¨ÌÃLy§wM(É€ßlH1þt†0ˆñâÔŒîðW;¿®ÊÞ>XLp[–‹ÿ%×ÅJ[^E"tຓÞs¬>Àwtíªp®CyÐ>>Á.d‡­{«yø~òžÃ¿ƒañƒÏFÁîS@GÃÚ³yèü{¸-à;Öžmþ`ÌaºÎšÞð;Œ<€0À˜[@€J‰F³þRxü¥ŒìuêPï‡uæ _â ÞÇblA èCøDàg¬%‰å“@x¢‚„Ä_ŠŸÀÕ°•…ªÒðLå®8I•·¬L“ØëÐõ >›nl8qˆÊh‘z]¯: ŒÇÓ…}pžGô!¶³Îy&ÌæTíJÂqw‚–©ìΖµé`UmXaú%òâ%ήBúr.ðÌ[%®‚ 8SÎñ «AîvX›˜ð}ðÙ„(Æ)ÎqSˆ÷Áòr-ÖM¹g²kÛ žG÷ Å8“Mä]…Ê‚ÓYWÓ­«¨Bó™.~pÍ— ¹0~ûTÕfÒ¥DÁÖÄ2š¨‚ðª˜c< ¡…¨Ó­ÝÞ!j^rÖü˜ –Òºôubm$H|lñ`ŠÅœeãobn‚Ò.)«jNôêƒFœ´)'œ4•?³y-yBJ36“`µAY±6S/ö¹-íȺ¢G<3÷öšbJÝòæíI<³y{›·—½·‡iãŸÃ¹…†a)^õN›à£BýÎÜËx;>÷2µ¸€9¬à—2ÙVÊnÅZ¾“{< ±n'[< ûx@ã휤Œ4•™pRJÞáÕ˜ª‚EÞ¶P²3e`Ð2ŸD< g]‰1'Xmª¶¦p—>É™K˜\rRYÞLÒ¯V„wÄÈAÁ³V•ÄB”ˆ8sjGÀm™RH¢%Žq.¶Î£i§Ôm%‹üakʧZ™¤k½ºIUÖlù!Q 1•Ð ØÏVíx³ÐÌSeAôIiñ´ýkBÑegÎye\.Ð ¦rÌÏDW™eV¶b-±ÜºÒÖ%¯äI¯Á·&0×27 Öýa(–‘Ob.Yœ WªàÜ ŽÑ3–ÄXÞ2 e™–R§—S*Ô&D±ÃV#°ÅÔ¬f¢3ê)µxÉž0q*ÂÊÑgÂumêú£­f©Øj–Dül5KⓌk–§z3Õ%L†Vˆ!¨Þ¦fâæ0…ÌYlõOY˜äÕ?[ÅPCeá¦T e^eTå”*£¤'­gÙµ¹f+ßNOœT~%ÕÜÐ[Wž­+Ï`Š)Y·T4ÝXÌuŠBIöš‹J5y 4ÍÕ|YËÄô€î€ã;ð1í0uÛf8ƒV_o¥Ml†ÈãÊ4go$L.åî1§­×Mï«uÛ`ÏÛÞ_@·77ž¿ŸS¿6eŸü ey#…NÜL»ÕŽß:ú›1t5mÜ–½©Ãf3Άè®ù›Šë޽ÆËëwÇ$C|©ÐX0‰¨aÈ1°QÊ7íIy CA®`üªÌ³R=„¡2®„j¿®*ÿUÆQ’ê ½6ïáûTAÞÅ=Lq¨j3râ‹@hº|ÍH–NÂÂÛKXx«ò˜Š ÂÌ"4À¢"‹2¨Œã¸65˜ß(°^¤—0ž [ØS ~±îô4ƶcFãPãcgæùˆš°ô¦§ C&PâoÄ"}¼',Bx{ÌÔYF(R&þžN%l]ððÎ'åYEº.ýx!%ÀS—îðB,Ÿñ)(¾ÁÆÐã0ܰélî6¦ñ\²DÎ¥‰ä†r@B#_%db†‚QgZÛÓgùÌW§,]Æ¥ÿŒø‚IìÞ~Œ<ßÎWü )ôÞB+<ÀSe6þÜ‘]„Ň7Ϧ 9S jxÆùgÀgcÁ']=]äÞìõœìõAó<¦ò«}Ÿ6˜*§zb†+Cë CåÄDÿoƒ:ó{Rø°úÚ‡{°¿„­—áA LJÄHâ!ûéfS¥Q#›¬ºTq®\Å`B=ÖRM‰FÔYÇ“ôuV€°brŒ€Ó?[ð]#›–£ÆeªQ5²&ë·´ ß]H˜¡j|ºÐÑ’kÃ×lÛ;FØ5n|¹ˆhsÍ\½šQ—¨…’×E6MyõÊMòóõ¾…^üƒÔ‡/ñ¥¼`å& ‘Æ#tŸ¤ù:ß»>Úá8_<Õ½w•då¡hÝkب¢»ëœy¯– žM]XÆØë£1'`¬Ÿñ)Êè&‚•Š3LH]5{¡\¢„«4 Y]¯2RY¿7¢vø!æd2ØÖí¾¸Ì4ƒn(_/Ø=\.ÝQêvÊѨؼ²{€Œì•Å-Óbî2En8¦ëRgË8ß" ,2u©6G„ÌMà€ØXHÚåHºûÄ®ªb„4߆'æ}宯ýY'n •¸^|åûÏ3¡RÕ®OLã¬á˜¾8ó÷¸)«kŒ £0 ¼)à/Ê›ß]•‹³U«\ÒP)ÊeZÜÜSaÚcQ7>3ÎÌ2N…î½Ñm©²ˆI„ʼ½Ñ#Lu²ñUDØmCI¶‘ oºH#ATGËá}RÖdWå¤ìÄÐi!©G V°…g¶p2Ô'`Ní¸1ÃX„rLâpLѾƒŸ0š!©„«S%gž0Ô‡uÆ0£(€5<£3pI–ðÔºpKªÚ)ãÜSެWßu ZVWOnFŒ¡$ kf£Ü–l޼Ψ•L݈›-Ù.é/^‚0ù暆‘5gêi5fRÔÖ=í5UDäÁTž™DH߀ŒG†ó?˜¬!·’˜ðª*p~É“ªs%­ˆùOÊZ§Ó™nÄÌÔªDw¨”1Øö—ê¿À¹qKû¾Žgön\×ÛUß–È& ½¦ëC÷½q=ÀdÝ ãNfŠn¬ªRœ¨ÐÀÖ–î0ݸ .Þ¤dg· Zt±µJÎÕÛœT>.¶"Æ$P‘¥ïá9±‡MT„”˜&«¥%³WÕ-+ð««±ãúêÂαí•zÎÂfe-±×dOV•ߨkj3ƒ~³b…@&ú?|!‹è ( e~¾$âØƒ2T“D˲Æëªõ.UéÙ™Škò€T.ïÃ뎙µtU_ªNêNE>ÂÍ–D÷d¢LiÜn+½ÑÛJÌ=W"È,XeùEÑ… \©:£Œ¯YÓM ¦¼gÖÔ×û¶bžP-µT«©·9Ò½–îBk«lh 77Ä-uéWÒã[ Þã*×q#<|Ó qÝÕ˜F’>U®¯-Ík– ÒNU¥ÊäE. ^G umÕÊóçoçz¹ç=…J¦%Z@– à ’¥ª>Ñ•P ÷ëJ™cT¾u=}¶Iì¬$¶ÆE˜&‰p5ªWáMËÝÞŸøuöp5L:Þ4€ÓrÄfÝ®d\r¢K¨ )Do}Õ×Hk§€Ùš£ 5ÆLlk•T7k4JfCÆX1c ¤<òÏ céºBÔàôz`RÈÌå_¦¤1S5Í‹~AåW«±êY•õ*W݃eÖÎ\ cuã1±ûj3s#Æ© ènK882ÄßôPŠå0àSe¤“Ý¡[¦|ÎÔµþC,Äœ£‹Ša¡˜etmß4ÌaÌdºwBNXåQÖ]Åìø­Êc•UUám64¶UyH0ت<&PyeRS9îM¬Ú­œê1Ís`l5O߀;”'<Áº·Äýè! û`ªÀ½ÿqOæ´ýèÓPEÛÆäáèQ±êÔy ±ÛŒ£¾"Ê)Õ9d%dr˜Û!Œ{£zG‡ºsÄ W­ýÌ–Ú×Jì&tßmq½¤ñ††A#‚i_¿â)Ö8Ч²vÊ Š75Ч²~Ê ¡+"v°ð¸›}ÊAÈAXÆzLI8ÔÇPÁ÷~pP»¾Ë„åXJÞ¬üÞÜÆdmc²"pÆ6&kˆk7Ì›ªO ”sêJàLå8:»¶wŸ“ù PngÃ!c"‰ê m„­>L£¢˜F…T)ö… JLö=ª–|ª±yyØ\®°ƒ°š_zÏï?à ÁÀûà„5~‡ÿLø)9{²L2]ˆ;0«a™–?[37_Ž\<þÙ?$žøaèFdùš{ŸãŒ;æiß?wŠ»Øc÷Âé×wb×™bö’ʸÁduû¤ƒ‚=t‘þÔ|9¾-xg7T³{ïl?t_Š’ 8Íæû" —¶V·ر.¶Æ©Ÿ;Ÿaðjð.5g‚>½~&[–àN?OüZÜK7b¨BèLŠ0ÀÄá@áŸâ¨sŒ^Î:Ãña1ÙûàÏÀ«}èsXx¤.|~’16šé”\îÐIÁÉ$ý"¿7(êö»ÿ{Þ´è endstream endobj 3098 0 obj 4705 endobj 3102 0 obj [132 /XYZ 32.2500000 275 0] endobj 3103 0 obj [132 /XYZ 38.2500000 682.250000 0] endobj 3104 0 obj [132 /XYZ 32.2500000 428.750000 0] endobj 3105 0 obj [132 /XYZ 38.2500000 682.250000 0] endobj 3106 0 obj [132 /XYZ 31.5000000 276.500000 0] endobj 3107 0 obj [132 /XYZ 31.5000000 429.500000 0] endobj 3108 0 obj << /Type /Annot /Subtype /Link /Rect [194.250000 311.750000 257.250000 318.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_condition_compilation >> endobj 3101 0 obj << /Type /Page /Parent 2 0 R /Contents 3109 0 R /Resources 3111 0 R /Annots 3112 0 R /MediaBox [0 0 595 842] >> endobj 3111 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 3112 0 obj [ 3108 0 R ] endobj 3109 0 obj << /Length 3110 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWè`忣_@`g<CÃrrv³ »‹89äï§%±¥™îþª›ŸŠlI£5b;C7Y,Ö‹Åz|øã—¿oÿùßí‡ç/ÿÞþþ|þ²)vuYÿÛî}÷ú¶Ù…¿oë¦ÜþðëæÛöÛæóæs÷û·Íñƒ/Ïîþö¿­Ýþ©ûßÏÛ¿þ­ûááíÿÁ¯›ÚÔÝŸ¿þlkÓý­8ý¹ÿù¿6ùÝö·ýŒýr˜·ÿÿ;cSÛ=3KÛôÛ4‡_ÿýá·Í‡#âV±eå¼ßïºßZo·ÿùÇæ§n~úb×zcêÊ×Å% u¿w+™º[ĶݪE3ZèðKgz“`rטt“ WÇŠq•‘gß5ÞWÛÒïzÈeÓØîïµ ÿ]¶/ßMpDšñ Ðvž>Á䥯ÒM~€\+ýãÙ5¹¹6=7û:ŠNÓ§À[é&?@®Ž•þpñ슇[ÝüGÕ Pôjú“[“pòäêX ‡+̾kªðü;¹v³_ØÙNÚyÓý=)Yù¤$«óô &/ë„“ OFVxöÄdU»2Y5M0\Û&8œÓô N¾± Ë#äêXéÉj4ûç˜Y0(ÇŸ€ËÏ7á篛Ÿ:zëYm¿þÔw\óðÇ×)åö»½-_6Û¯?n_îã¶_Þ¼|í@¿lÕ,é‹Ã’Þ¸~ÉçÃ’Æì: ³é®¢ûw)ªÃH³kÚ¢²eq±ðï#~çÝñV{ží8s\gÁ¦@#xz lQF\?ðj&~D€ H5ÄÇAá!l-\ÇÂuàls;¼c]e?záVõÔ bKE^FèQ‚(ï!f#üÄP“7C©¤»Qp­- NpÖ ‰‘ÚÒh’Oƒ¼oaœà†bÔ!²"q°õÒÀ0›†Xf˜S‰Ylâ\ÅG,Þev–î‚ù‹OC-¿lÎñÖz„Ÿ4ª$—Ã%‰ÖŸâŽ!=S‚ˆ1ú"LVÕ«þFØFD(Ïê7Ù»»{jÜ·<CäJ †Ê÷Ë9-“ß'gpíû·$ÓYqr,N¨58Ù 'áB„$\œˆ†¡†©M8á-dtä9“SÚ¬p&Rû=ü&aaüRXÄIepDHrVM™v09ÜiÀ˜Ê1g`úÇiãÊœÓG1oâäý›Ä{ÊÇÏÍ)AX $|Z8qK_¼oÌ¿8­SX&" é£sE ®÷„OIÅÌ 3#‚¼Ä)à˜»¡,ä%Né…È@¨qFk1%3¨y¼S¼"±ZWbã2ØqX3rãZ°¡‚µ‰`ñ@þÁtå“ËXˆ¢ñö‰¢WÞm¤•YcÕ¶}{ß*¼F²@ÚšS­‚›´®°ì)½E”9ºQ¼½Ë<‡ÄœqR·m/.W{õ¿­G•¬Òˆ Œ»’xý OÍôš‘é NçÁpÇ ÏDëª[ŠóN/¨xX¶F9@)ʉIºj0dLu‡ä!@¥©ŠO â})WáÛĪ7¦ Á-U?Z-ˆæN¤#¸Äȳà*¦š–£òZQ3CPÆ«?ί_‡]7BW9;­˜KRƒ&e%À®á r-KZùI]0ñ”Êc„ßM–˜¹æ°wÝ´Ê.$èšâ,&ŽjÖ@¸C¿ÉÔ’¥.ì)Lh-_™NÌ'c…ëfÞY@ìMå-=²ó×/¦ÄÜ©ÆFPWæJ¤´5¡©VcñÌFGRØP› æ3ÆÔú5*¡×Kdúu‡^×EsÁ0ßëó%ºCQ!hø‘Ÿ §$ú›d š¬‹S8Îû ‹Å}£˜ŽR70[›s€S¦€Y%–¤8\UVœŠG l‚ÄÆô‚ûßaÉ£Û7 Jâ aÕóÁáÄX.ãóñx6U-¬KoŒ6¡zHAX|¦v<1Âp½€ÝNiD 1-ì‡Ð,‚Õ‡mU<‚a#´qXã•h׿\¸3“Ö4 ¶·1½`™†i™H:pÏÕœçXVœIÆ÷ÚœªýäêÞ^[ß›õë?ªS¯£*­zT‹¹1>õ·îÄçèV•6~5Ç4»<";WaX=/« }l[dÁM»P MW»¦¨’?L¬Ç\tFJUaü>–¿u®r–—E§žC¡Fu% }c§ †#”F½âªè©×À( 3q"ŒFmrê-÷uajöeê»ZlÂ5Slêî ßä:ª©«¡ŽbdŸî3)(LÓ¾åYzTŽÍ£°¹téÂUê*¥þ¨ˆ‚[¨˜6¦÷ ¾„„0œÌ°M¦Èq¨§Üù ¢.)&ã7q"Åú—äWÜÞ/Xµóç~§éE­/ r…ÿR½Šˆ°p¸Ù4¹¦¹dÇ-Ô"^?S–QÁ„IAUîP Ï•QºNø¸°wÓûƒÝÐo€G2"Ûf o3O³®õ“¹–æ€(g†íp]ng`>¡‘@ Õ®5©là7-ú&p ñ»QÔš­o†9þ¦ÀPÊÔ‹$j¾ujÔNx«wm3üæ ®Ó?³ŒÉ®ƒwÚ3öÄ:„Ú ¨“MÑÆ\G89ŒQ ó)ˆ¦—Ê#4Âg7˜ôRâJ‹_*iÔ“ÑEG8"æµòÞ$N„¾‰PLµFæý‰éš›ÉñSDõÑç¶íÝú”º1‚øQõØ%ñ¦ì;"Ñ_iŒ«5Süž`/V·¿ð-p*õ9ºº2•žæŸM;ž5ã‚À¶Ïquï6L¶öÃ6µdí}LMßKC9èOõE"â! óáH)ËBºfp 1Š€áÌ«D™3åR[i›ˆ? ÞÄÅDà‚7yÅa ù>z._f㠳݉Æ$©Rþú•«“”ž:þ°Ó‰tu¨ñ¾“Bq$ÔŸ•/úSW%1MG˜·«l9FoƲfÞºââ(ªÅ›pA¡ˆ„jù¦X…л,SÑ\¢1°h.ÏŠo䡾ò’N¬ï§CåLQ1åb:L¢Lܲ—ßV§^ª¸".Õˆå->Ü –8Šzñ:D‰¦ÙÂE˜òÈÛúäÖÇeڈΑ á,¬íq7%—ÇÅ›rZ­™§—‡…ð°2ZL¡D‡å†Ó(„¿|hÔòi_¤>‰FÓMyvg/)ú,x0F°TÄ¡0-ª–ÃÕ-ôÉÈ>f?x6AÊߤv¼i‹2?ûf–7H™Þõs7ƒôOîUÑ;™r¥uè6ÍI\ø…мTm²uwQ,‘¤L`ÿèQ‰ˆwŠhzÅ4ÝË7–8·† ¥pÏ4GgšäeJ˺@¬ôÂkÁoÞþãOi ¡1¼¨ œ«ÎÔ¡‚i3ÕCQ®¦Ä>®oŽ…Óò\må¾Ì¹z#a¨±,‡,K|0Ö¾nÞ Ï亪ö‰ÆßÄ´m\Þmž±˜ŒB*§1­qI¥è_s“º] d‰$=*Kfýú%LØQéâr>ag•[ªií€Â÷H¾‚–„-¢Ò@ Ûˆ@¦{3hT”UëUäj<¨ŒHâ˜Ë™Dé"ÜV¥‰.S~ ¾¡“F0\]ä| ya¯Äº°»¢žÚέ÷6¼N ×1U¹jhe¤.Öt ˜9µŽ÷+øc'¾a2 „º€B~cGl‡·N€$l½LmÕ•2Òêog7jÿ®^S!¦nãäNà1O9ïsÙ•i¯ÊM°Uïº"¡-Š,š”W¢n‡2qߪ>£Ä\³ˆŠiÌ5`U-qswÙæ­muvt_¥¯9^…Ýé]—MÑ—´Ç‚{W¼…[SI ‹¨W¤âZ¤n+âLþų*å¤"Š^3]l¸hœùEpP¯óŒ;%sáÖ )@·ár‡Žn}Æ?®ÃA¹¦DÞ¨r®jTréâLOç³µw3(wßw³ÅEŸrYhT=I¢qDŒ©›KJÞ¦Ùz}¦ë¢wjwR¯½™*Ë݃5wµ3Â=§ûLJa)Cà9TŽŒ…³Ü%MIG&ôw5¢Ì•E¦ÚvF±L0ãŠNœ®”é.–-‚B…åFQã#×r®&.í=ú‰oþ¹ÄÃÊÞ»”ûm3ÔY×|sP½ý«Xعhðþo¬‰Ó±2„QîV&Û·…—%š1¼‘)û#u~ó-¹ fwœÁ9X¹KŽL×®a²ùûmÊè ;ÂîMÛT¥lÕRWY¤"°TrO‰Ð‹ ü2©¶¡|åVM¦r†4"¥b™VÝGºLìʯ´°` 1ìp$@^ÙŸÒÓÚúÅ–“(K½<º«ÜVÙ"¦à¿îÍó‚v.‹.ÐLmÝèP&îaù%5Ɖˆ”±ö‰ûlM4Û?"HµÒE¢L¤¿jwùõ¨+C@[U+V“ŒçqõÞ«ë{lãÑ/L[ëûHúQ>dÆÚÆ–>¦œT¦Øÿ¢%a„Žõ1N¢5}©éwÔ±vÐíE€{Eœz ŽG ¸SÜ÷ÁÃÓö6Ü÷÷c€ë„6y¨Ü•óg‚;{`Îx&¨öȨàMÝî&¸³‡°S8ÂàZèãOÁ›®LÃRHè¼ù K.¡óŠjž{;¼Ój#,ñìÌö²É#!Ë>öDØj™ àií,íÔU“„ë0Å rŒ°šJ5äXN=ÑÔ󼥺oÁb& pX·`+ŽÐŒç€ÑTx„éš™ë|0¹p ÈKÌPöa[÷ŸvšÏ®nLQÍã*?çê‹×yH”ë–(ëË FWÇõCÞÞ€¼µ—xžu¹éšýŠº2öÝ ÷y|Ào2øˆ¹é¡s®Zç<¸ä¡YnB³œ²Esi†’Ë Ë&vûv±K| A±ø½õ!…ºú}éê{ãúo?,Œœõ‚ˆc)=GÐÅØ!$¹ðZ‹íýk·æN¡Þ”5£K/0­¯×?¹‡¼½ÐØy\©¾îSVÄ¢­ÉÞä†nä –(L$h ©š…bma. XŠÊoÒþQöP””3ZÇÚKN8§Äµ®}»êÚ˜+û8§eQ¸Ý¯í·na®Ïsÿ`A¢b3´3nW˜}ÂøÖž*×­ö©ü­#ë‰t·£bwöU5¶öªñHÀ‚Ý…„õWÜ{-~D븹ºS°} ;å̇¼œŠçÏ X¶>Ú`gSÓ×pÄ£m<ü&d.š¨­×g²e nÿ÷â¬rpÖ'Æ*$‹õ ¸ßÇŸ¿1ÃƵ¸á`À‡&¬Ó @Âû Y³S'Ï÷1$^GØ >ÁÒA¯]Â:˜c°°`øbÔàS`¸ŸÄ5”Ajá´1¡38xU}•AuávA]*ŒÂHÐäsZ|ûyóà$© endstream endobj 3110 0 obj 5874 endobj 3114 0 obj [133 /XYZ 31.5000000 125 0] endobj 3115 0 obj [133 /XYZ 32.2500000 124.250000 0] endobj 3116 0 obj << /Type /Annot /Subtype /Link /Rect [134.250000 375.500000 165 382.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 3113 0 obj << /Type /Page /Parent 2 0 R /Contents 3117 0 R /Resources 3119 0 R /Annots 3120 0 R /MediaBox [0 0 595 842] >> endobj 3119 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 3120 0 obj [ 3116 0 R ] endobj 3117 0 obj << /Length 3118 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·X 7  e ‡‚ä`äÈqÃ2¢ø¿v“ì™.öWd}ýª¸ -$ÍbÕ«·¯oþüùÇý~|óþóŽ_»¿ß>d§2ÏÚŽç??¼ü…®NÝÏDzÊ_¿¾¿>>5ÿÿýоðùý_›ŸþwÔÇ¿4ÿûåøãß›_þÔýGçÿàÛ¡Teó÷¯—¿ëR5?e׿Ͽÿ÷áo8þv^±ÿ\·™ÛÿAéZYsÞÆÈ§¿úcªËŸß¿þvxÓ ì+:¯tU›·GU[}üï??7è—ÏN•5Ê”:·ÍÏuaË,¯*Ýü\šîöã¥>Ýh}l~—U/÷ã—?BËGXÜÖ¿ì\*ÊÊ¿ú©¶J•ç‹~³Ú34ßiTç t]=ø‹²Œ·øeçÒ@é¯.›”K]· +‹0»®ãBªÌÆ[ü²si ô· —¤ã*/:ð4ÿ‹ýëòò‹×™Í#âÍyçâPéï¯.x¹uV÷œ®aà_Çc¤µŽÈÚ‹C¥»\Ïê’—kê"¢zõbù‹çEÄÅ/;¥^yV,„ëBUYõ‹å#,^eYÅeç±XµgõØ^«<žÖõ¼zŒ+©ÏëF[ü¼óHZ^üTÝ?ðgòÓÕQYV5À² ®Ý1ÔŤF‘©¼»õ¼¿™«Ë_{‘i¥â-~Ù¹4PZœ.þ)d¼“ö7À“ôÝóâ»/‡7õª8~ù¹ÙXûÁË__¾ló/g7B¦Ž_~:þ1ËLù§ã—_õ©,òBç—ýµOt}yRª:»}’iøäýå‰=YÓ:ë®Oì‡Ë“üT”ª*oÞ)Ðj*ƒß±ÄwàÞðjFµ;xÞ’ ŠjQædt¥šGÏOð;ø;ø•³YÏ B˜ëvy¥N¹-Î|~§$¶”_ž˜~1Ïf™ë‘EQeÃWÓ\ ß-DkUApAl­1ˆ1gOè¶6 \æ›'b׎(¤eh⌇ãïà]c¾ßQø¶[<}ido±™ÛÜ‘›÷ „”ÕðÔøFŒË'1'˜ÎRñ¬ÁÃ/ß¹\Ó=dl¼Â«} ˜aKu*?eµ¹ÙA*zdø¥þèÞF  ’^»¨Já„ óH1žÑØu` ¿pØF^uêöe7/·ŠŸtÇ zÒ!õ½wÞ£'žÜ{ç >Ñá«ŸØØŒ¼¶…ËÈÅ‹òðêé‹0Z6ÅÅËÓ=†}JÀ¼ËNåËóxw ^7á ¥r½ŒÓÕ¦G”wPNÁz¤””Œ<ôì ~GÃÕ)¦Só.!ß0ùøà:Ìk˜:X£à¡g‚ÛyÎC¼ƒKÕ='…OXcÚT¸­ÅìRÂS§±ÊV[»ŸÚA¯Ö¥|§áùµ*sìT„2뻼Œ³sþ¶§ LYžW*y­˜Æ‰™ƒŸ%‹FïMë‚0 >žÈ< ¨ËKi‘—ŵYÔ±•ÕµYÔÖÚðT¦w¥§âÌ΃vóîbÁQ"µyèŠMœ’Eµ¼ :aœ}ë,ψ/YåHØgÎKÕÒie!@[jGÞl­€‰ªÔ‹kkÉÎ`êz¨šmQ¥þõ¨K6wbNì"zGJ›±ªz÷^ª8Ž\a̓Rã”8ç‰aÏ=Žá]¾M¼“ìNáwi!ꉘãh †5|‡j- W[uǵ°ÛNý®³jœj7Æ… ¦ŒUÆìSÆk]>€/²Íæ—|[IïÄÜÉ’¡(›§²÷å$UR\.ÉÆÚg_r6–plk•O‰‡§¬ ¯ÂQ*;N3²ðÅùiÄX,=oŒ&ÄŠºùZÿÕD™kuVöªs2wúì.Þ×ãhßãíË6ìŽö[¨Œƒ÷DÂîh_©‹kw´ïŽö3dw´§t´×ÊÖ£ûÙZ§²G{­Š‡3ƒüîÛa~.¿;÷Içþ2¸]õHXqwÒùèy½N:][z¤rÒ颯ê1½ÂSù­­Ÿjvy&)‹vf÷xBˆn:ž>;²íaqŽèÀ 4[IêBSõ=D©uHd1|*fÍZß?u˜×–é‹ÈŒ•`Rá;!“S¦Ïòb<Øxµ(Ã0bÊc|¢Ê!˜iÎk®Bz ådÇÇ­tJ hÝ‚G–ã½ãV’H¶"¯šÜ­Éy ÑËÞ˜"uEô1L7Ìèfx ÄùñA1g€¥sy{¥—w²ƒ™Êè€Zp Ù¸æ@…<@QÞÇ}‡Gxw\B¥‰æšPÊ?£³NG€ÞD[Ò6ñå®ù§Kà½v9ÚÍ­Í­ðé¶q-¦stú=v‹i^‹IWÖ%Ø%7ú „¨pÂ&CÓ"Zä’GËe'¦œiäà-Þ¦êÈøä)s•ÈZ—õÈv|éN·³.‹ö΄QÝ~ç΄ѭdy‹Xs³ùžˆ®GD€>ã-¢¶ZHì ³ƶ–-oðˆí ‘»]ý Ã°'"2P‚‰?¢­óel‰‘È!ì™°àæwåRle~Úšî4 à&ÃÞ§1xadkV ”ÐݜלUº,]~&[aÉtñ'ôa¥!†˜ŠïE4™ºýä:áo^Jm5°NéK ÆÆO0ˆ¬^4D™±®/YV+Ë¥FµOOy^Œc'®¶g‹ÂJ££¹bJÈ*wEd|ŸkU‰åÈ#wëµ$G÷"%38áwÒžA7*Ý'²WdP†l ™¬O„AQ&­(…ˆ¨ºR—SÞt©KÕ•º<Ÿ:±2Ó=ª"o6·[€e²…——3:·ÞÙ{˜•®—cN…ReCín—m»l»â‡VÆÁÝÙ=³³Ûh@²Q?j\–”S­®_+AEŸg÷ê2¢Ã¦A|K9…ÕÚjÇ ä5žŒÏòtÅ#SôpÑ Æ+þ.T(N€båL ƒ">AžÕàôÀuN¥Vƒ3‰^¼Ë=ßäUœ`¤AB®˜gùè~(z†÷”÷”a <ÂO<'Åx‰© ¿ƒg˜ÜNXãH7aˆbm(á|Õ\Û[I—æ«q?ª¦Š0åuu‹Ês–ˆd¿ˆærRÉØ½UNöú¯½R4U¥ÂëÍ}‹Ï¡ðN´à™qÎ?53gÝ®ÜÄ'`"_L—lt_¶¬`þ>-iË𩪌:&:—–ü ¨RâeóŒ÷ˆh²è3ÞÕ “¸èyRÆ£ŠÜä}óø Ëã}#"bŸ öaöãóžÅxm°Ï{n±w¿CÄX,<…Åï05<¸ƒ½½xoØÛ‹w°G9“E9=ž_ Q|L ؉ïã~‚W#°Wv×ÂqÌañý`‰ÁÈ,¼k"VOj°¤eâÌâ[Àéïšà.ÊÉñªý”ãûy=ÚO×3º¬Þµiˆ2']²d‘ßz²;àmc:õP##Áðw¾³àÛÆ:ŽG~àŒ(ü¯†o.§`r“<ÌHd&ÿß6Œ†>ª-Ha<£‡36qR¦ÉÛci´¬ªÇËUÚT>ã©Ó ’Üc™m9w·Ôäî.f+Îg•2¯¬´{õ$=iÏ Þ3¨½T»ÙTìÔ“ðrÏ ~eÔe%ŸA=’±\™«9ƒ³™ž¹nÞ‰'gp}\™D¨È½÷˜2^*¥C4Mgó/˜éštGîý/§€mÏžôá´ÄS–”Æ& ûÂ9dL7gá™F[ki±·9|¨ÒH´7häæ§©± + Ósœ™¦êûºTVîWls‡›Ï9€´*¬k¨D—gUQ¹ßœžFïQdøQPB•–‰ößOÖɵzî5…ëlJJE›£Çî㯌‘Já€ßÅSŽÊt×bú|Œ-‘04"¶Áôðy]1ÍÉçu×—³šÐFŽêˆ,[ð'«1åvŒ-8=>/™±…µµ.2zŒì°)\B¸‘Q "ãGlZ{ ±QJ)JL2Õæx–},(‘nºäz^aß'£ Žg¦±5¼ài™1pˆ §‰L_•%¾@­rµ»Dq…äÏ!¿Ê6;T“z0f¸01çS¤7Ôüº„û‰¶ ö|g.EnUÇf늲êfD <ˆuN@;n3•Ñ)1tî€eÝFæ*Kç¢G÷˜$Ø—üq²Ú”²ÃK}í¸¾×8{;¼Àêç½Æ™¬qÆx ÚáE¶ZƃU¢x-\ÁTÊÊV µ“{-‘tƸ‡+=?<¹ñ³×¯ºî6(ÓÞ#ežHÁzŒêÓh2ÏÓUvMÆ#ww}e úÊÖjÝ÷¾Y ï.·÷Ú\ wÞq$ß^qîp ö 9º‡&ö¬K™d“©Xöÿb·S@VôjÙ¢;F·:ö„1îÎaT0À=ÏT6 ̬FÌÂÀ'õxFáÞëñnysb3,'®µe/³ŸodÂŒI®¶ÐÎnä2^Ò|o¾)_¤úá' ’Ì)¸Ã Uµ£h!•”ŧ¸uÖrÅ-Õñ<)oH©Jµ„Z^§¼½Þ·½M@QѓS‘· î™ÆàjµuçΟ«êS]]^z~§‡²ýK®À¿³Z‡¿e¿Ø@¶Ýy§£ÿ{ïhÞo¡]ãótª€VCªƒ· àw0 2±N#Á´µ.†ÁÝô¦Óðl]Ÿµ{ÂX aˆoG‰AjÄ’Tªo=æÉcF¹0Én²†ã^÷õXÝ^„)4 ¨›]ž3 Ì"T(;nPÍ2WgÙ¢…dýt<‡'õ$ù3=’°:LÜÂhõlLqS޼¡4TÂï5ÿð2as1Àô=º¬fÀ/©¤~&;uâJTØ>6\4Ä×ëp£´4‘NÁ ªLO6‹•Ñ>×DóÔÞ0Šò¾•˜iæ…r +BYè²Âà·šƒ*dÙ:F¿¢.p¢^j16_¦¹/UͼÂô‚N3“C,Õ<> endobj 3121 0 obj << /Type /Page /Parent 2 0 R /Contents 3123 0 R /Resources 3125 0 R /Annots 3126 0 R /MediaBox [0 0 595 842] >> endobj 3125 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 3126 0 obj [ 3122 0 R ] endobj 3123 0 obj << /Length 3124 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·ká ´È!€ 99vœÀ°Œ(>äï§²g†ìï‘õõ«"ÙSISb±øêíë÷úüý¿~ßÿîóö?v¿¿û¼3‡º4—ÿö§_ß=ÿkÝŸ÷uSîüºû¶ÿ¶û´ûtüÿo»ËŸßýåø§ÿíÝþÏÇÿý²ÿÛß?ü©ûG§ðuWÛúøû¯çßÛÚÿd®¿Ÿ~þïÝ_ÿ°ÿí´cÿºî0/ÿþõÆÚâtŒ‰WÛõŸiÏ¿~ÿñ·Ý÷„½ÅUƹfo _ìm[¸ýÿ¹ûùø‚~{sh o}íÊâøç¶*jS6;þ¹öÝìËkw~{å÷Öµf_Ö£wŸéìn#lîmoóóɵb}eÅÍmam}ºå{ÐêòEQö7k"èº}è[süK´«=Ÿ\*ýÝâÝ/ךªŠG¶O»Ç¸[ë\DÄ9<ÙâÍ5oÖyÓ§Ž §í#l^˜ˆ›ŸO®•þnñîš—[”=îþeDÒ*«ˆ ÿ|ru¨ô—‹w×¼ÜÊ61)÷iû›×MÄÍÏ'F¹xwÍËmÚ*&å>m¯¿¹3&ž¢|9y4ÊÅ»+^®3M'·Ndø7ñÄ¢«£bÎéäêPé.w¼û§]ðQ.?Æû7áÁ·_vß<ÒJµÿòóñd—žûòuWÿr²Ý ¿ÿòÓþ‡ãyì÷_~ÙYs¨jÛÔåùßW¬9¯4‡¦5•+ͳ¾b*¸Ò\Vž~àà?}w^)…¿¸_žV ´âZxXü¸>·ÃÏ€_Œ!‹·w—keQ½¼'ü5ñp7[h^‹€ ̇óJyð®±3/YÀUU43åyÅ÷‡–0zƒVdÂ×ï‡/Æ÷„Oo¿Cv A–縈݄³npôñ±á».Ï|ør£q$`iÛ¡¡¾DˆÙsûîF:a·>Ã`6ü@Ì›BÈ òvÝ{ àÆÌ%¸ ©9xQ|Т>[X°./ôwTù»£_4§öp>÷‹"V:~tkå-Z1ÄŠ÷h¥¨áÊøžpå#üž*ü=¾ÃM85<›ð=p7ü=A,ù¥ \qá¸ã0¾ÁÝðÙŠ ˆ-M;{Ò—¶eüuUζ1£ÅÊE"õ0„{úp9Ùj4q ?Uå@ÄPˆŽÂ| ¯+6qmçŽñ½¶ó´¢jÈNjàYõ\§êyºÅUë WDƒrÉ@íMР`Õ¤œôyÚúìó šÇ|V‹úbÁÊÆ|Oך×p8¥‰`G”£ÖÛ¡ |‹w0О×ú …‘Êİ€¡è!LO7‰@CùÕÉašÁ&xݪ­pÌôÞÌ–ÏÚ|XxFC r Ó¡!0éA‚‚Pl EƒßD>’ÍÆ4"â0 šQ9zÑ…lQû¡tÙ´¦$$Ö¶‰@9LN!cj¯/C1Dècã ÓãQU;:®_¥+LŸã/Wv#9›Š fF‡oÞ°Œ¬P3–U6f’PµVN=>e¿Ï%~O|ëøÅ*jö1àrˆ•¦À`²óÉ·"úçóö5â§µ±hM;šbÁC‚èaîw‹Ž;•/‡` üuØR8‚ðêkÖl¨Ê ]å ‘1%¦ºŽRY±ÞÆÀ Uº"s‚€zÏ´É‚¹Të†¶Š„ åð}”oÇòdíë­r|8X#§ˆgï‘îëßÏôõ¾{hÆ ã$/˜â¬™jZ¹“(:Ÿ,Š­¦”Oùï\9-qˆrQ¸Œ#%fÜßÔèfOç<‹En(W>CªTbåòÚz\+K¹V©ÌÛÑaGp$ª…°ßA7›V½—GbÌ[ˆbþl¼Äth;tÛRçö(ꦿu\‰ D®ö†µýBú{¸‚ËMà{pw¦HÆãžpE÷«)ÓQ긶ñÖ Ö_~¨…‰or”¶ž<€±©(ÃW­mV¥­âÀ vÇ`¸U‰û´˜pÉPà{Ĺ{H©K-ÜJ-+Bè`X;,…ÊÀï!ú§`γvžTúò:cVʰÿ±ÔÁr¯À³ º¦3¸›Ð׃åXòªr.|?ŽÐr„ûaô`È70¥ãÛÖÅD¡7æÑª½§˜›c,A§Å´ ŠñŒ- ƒa-ø2 ®Êð4 k¬Il“?HRéïÒ<™Ï|©èˆ*'v˜Ò‰0§ö ^¼F÷{0çÂ+k÷VE›ØÂ£n¢ç[[Sä‘d#Ò~Ýz—š†÷ºº…Žf¹Þ1ñpSé˜.²¸·ê=â…Ù¸-^!ˆSèsŒ¡£zªŽºQGÇ–‘ñp,6`¬Ó~Ÿ¹pÝ ÔĈmL¼QQy‡ôêÂ@¬4ýNµG×Ù:çìõ05â·9áW¼oÕ„ßm…+7+uÂ釪¥ÿ©jïãP.“OÌàûü3ÆA¨™¸ÄQ°B(µíÁÙDDéVVåP¼ÅˆZÞº™t7jmp͸Ûç­ë—„ÕR!1HÔº¡XA ø@Lî„÷C¨AÈÁ<+^#P€©Àë|_9åF 8£j5 Ó„ ᔃJ×UÈøyUÈÆ Š)3R­¹#ÔÓ›a7— ÇQµwt]¬ žR—ʼn$ªJ¢ä˜¾Ul"&â ™DÊ‚W­§•Ñ£|¤ Ã)åmPüD‡©Æ  Áòر܅`.ã @SuÆÓ­kŒßg¹u1Ã@w„`¸n*Ucª^¼¸ˆº6frÚ¸ƒÁ@ïhïvë3°›ßCP!žÎH¼TàJÕæàÕsÒ åE·:™Ç4gÐ9 cÍZƦE-Ç6~h°mj"ÛújõCÆÛ$2D…zp¢Çç­ŠµªòçNYÁ]4eb9Óüñ2Íán‚'f :œ]KœúÑüïB4 c<Î×Äg#Nó¯Óæ—¦ožš¹êrUëÌU6WͼóµñÎâÚ§ã?¾{̘š&fKPCB3òÅif<:k¾Yóe¹÷Šsœ³î‘¯3öjc/a‹à¬þ`üTÆ[ü¬¥²íÓ~»D©[Ͱ¥nè{€±_T¥¹?r é¤\1^§J#h!nµÈ(tg« ¾Â3!¬àQ?obS©«‹ÁWoor¸4ÀÝ´³/U`×ð™;̬¨ƒâk…Kb‡Áأʙr(hphŽwƒ¸fM azD3²/ç_®:ÿ2r‚äj’(‚ÂÕkÌtHÈ®Ê-ÓÒªa.Öå]f¹ÈíñŠÜø@Dª­§Ï£»²:Ë®éìšV§gŸRÖ6mÚ\5ÕfÇ{v¼Ï¡Í$X›¾a’ÇmÔ\Ð3Î㮞>%!ÍI‹jÒNHì©Ú'ÌúKÖ_bé/[£…¬d­€Åø”ò¹êË<–•ÏÁìÆ mXŒ:™‹Ë3þ`\ðªÃ2|ªQ¢“Ñ¥ÅÂZa£±±;G9æÏâ¤*­U‹ÙC2ˆx˜0Êœ‰mM}à™›H—‰æ¥˜¿Ÿ“߉ŠÎDt”ÎÇç¿îÊ¢xþƒ_wŸE Žq:ÂKÊfê¬_{’VeíŠË°QÅÄn”‹¨åÖ¦JŸ¸]ã„„™©Þ1ÁP¹RI/ê=ªÚ±Ð_OC²2©+¦®¨t3 ÚClB:¬eŒûlàéÉ*”*Oœ€jfO ГnóŒÜú+9ù¼b}þ޾u1û972^ß#ù~­&öÃb¼bÕª|§Ü|å5w!ykUm_|“5«ÜX«U9sx£™ÃÛòöÌgãÌ‹Ctù}•àß…)+%£‚]ÿ,#ªçgm :£q ÕÆ)Â\‚pX쀾әGf•]ýË“ÐôǸýÇu›iá‰/ arP~¸T«º¬A·Yi2©èêLH/àôLH «Ë7ž/WÝ£[•Òt FeQí!ÊLÀíó>¹ˆÂ«­ëð ÕGÓü‘Ã1TãkLö8²TÓ^ÌU(å•è«;C…q´3]‚SÞ·åf¼£‘…3ƒM>üŒê0‚Tˆx‡Mào«ËIà2ADÁ£D˜r!a®)…4n”ÜöqÜ+\…“àT=ˆ“XÉ3?§57ã׫hѺv’Ju“š„n´ø¢C0UR‚W0wÃ-/ˆºT¯ÞÅËßð õXÆà’Ÿ„%%m•|ÞøâJVª/(Ÿš) [¼Ã¶PîoÛãäN 7f…Ðÿ¨î«+æ(©‰RhfDRžÖTÓXž¨€ty#s;ºÜßOæv™Û©û)ìËWÞÈÁ‹“˽‚|€õe“3Áœ.Ýâ_˜å/ûõ…n˜Î½©~ •1ª8”ªÚ µ„Œ&ü§ÔhfÆKx-3‹™Ùwɧ& S<¥¡÷„l1¹39Ú˜áŒvˆÒ *͇3‰š%*…„)"aˆšÇ¡2Ð"•N SÌŸc­LÐVA#ûÌ ÓìD·ÏË1âðY‚$(¿ØÌø‘pd’y˜*¦®g“ŸËóÖØ–œ®f\‚NOÔ„éö)Ø”ešª Ô™ê ¹‹3Ȭâ¸T1VÅ2ºö‚“†lYn3ͦSù·³fðƒ0â6ÀETÂ&óòéÿðSnÊxßRõµÐM“ìˆbØÂƤdU u]G,E‡R‰Ê)}NÕUJÕ%$xäâ¸5;+˜¢5ªÓ‚ªDÝxƒ”¥‰(‹¤‘òœ.KÞYë_ðVž \rkåÜ3Óç…÷ùlÔ b`£sw#ÆRà›ÃõT®ÎcFm®%£. Õz×÷â­|u)P7s••‰Ï–sMs®©HYËçš®b¬³×ÁÍÌ`Hfˆj9LÏ%\)L8ï´ðA¢õ”ÜĈeAŒFìA÷ã°lc ƒßCèBB¶÷´yüµÿv$B‘F?Mýƒ®¨ææ0•£gìÉ ²wÅKL¸eÁ^aÔ\ðÊÜ9ý|,+«ñJ—q‡Î óì†,´ߣ÷ø)+þÖÙ>v_ŠÓy6èÓŸÍcîôçã‰_2ª[–5†*F ˆZv㎄{m ìxc2îõ|ÞÞòx*"|¦sY=#7쨄‡ÅˆA,¼§¹Ÿ jã ½—ܳD“râÓþÓîÿž°Ç endstream endobj 3124 0 obj 5434 endobj 3128 0 obj [135 /XYZ 32.2500000 173.750000 0] endobj 3129 0 obj [135 /XYZ 32.2500000 208.250000 0] endobj 3130 0 obj [135 /XYZ 31.5000000 209.750000 0] endobj 3131 0 obj [135 /XYZ 31.5000000 174.500000 0] endobj 3132 0 obj << /Type /Annot /Subtype /Link /Rect [417 182 461.250000 188.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn5 >> endobj 3127 0 obj << /Type /Page /Parent 2 0 R /Contents 3133 0 R /Resources 3135 0 R /Annots 3136 0 R /MediaBox [0 0 595 842] >> endobj 3135 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3136 0 obj [ 3132 0 R ] endobj 3133 0 obj << /Length 3134 0 R /Filter /FlateDecode >> stream xœí]K¯ÛȱÞëWh`döƒ/ àslÈ"€aY ²f2 3ƒ8³Èß%‘²Lò+Š«›-‰cÜøÜÓf?ê]ÕUÕoþüéûý¾óúé?ûÚ¿_?í²C™gçÿöÇ?ß]ÿÂV‡öç}Yåû~Ý}ÙÙ}Ü}lþ÷ËîüÁ§×¿6?ýoo÷iþïçý÷o~ùcûŽÿà×]iÊæï_N×¥i~Ê.ÿïÝßþ°ÿí8c·\»™oÿÿïŒ3ÙyKÙuÇ4§?¿ÿðÛîÍóV±…5e¶7Þù½©½Ýÿ÷Ÿ»Ÿšºé³Cí) üGüB¥=®”UÍ$¶n`ÝÀ©¿ÐéÎô&Àäe]„›ü´su¨WyöCåq¥ÍýÑG$çUe›ŸK×þ·ì\uæÎ@sÖÛeú8qÖæá~Ú¹:T:„ãÙ¹ÙÙŽ#òÌüuö¸u¹ H8Çk¥E-ž\³>ógðج Ëô! _˜€¨=í\*nñ쇪hÿƒ?“kWÇ…KW7€i~޽rå,\Y‘ ëÀg¢¨Bô×éõ'÷Æ×áú´su¨t=˜ýãœYðVοÆñá×ϻ7zk€Yì?ÿÔlî¼æé¯Ï PòýwG‹¸òûÏ?îÿ˜eÆÿiÿùç]}(lÞm1ĈÏЈ} g«ÑHö:Äà¸7SÀuìüÙð7Ây L¿u.~,¤‹Ïƒñóžô=ùwð2Ûº”˜Áào<©Àsª˜Ë í`¸al ¼ Jñ:˜v„oðVçmŒmÏãÎ;xÿ¹Q\¡uŽm|¶¸:GëŽ`¹ŽéK.ÌéXraž2-*­]€÷.âN½Y°S‹5HN̆é à RœÃòS–6%qø –6ÊÖaÂv–ﮓòI1bþ¡v€×Á¡“ˆF,–h7 _GÈF>=× »Æ–4¶/¡½¼qÓn*ël gÊ>Ð*À#‚§¡y‹ñÐ2Æ·Æë`9†éŠð†)¯ëW<Á[‚Ï‹OбÉv؇ÇñfSâkD®uEwn,Wï’±a(‰±åïÓk"o©pÆØÞtcXª¶ ¶¦„Ø9Þ5äSaºtýQ>åùÏ@àL}?纷 ˜*ˆ¨+¦>‡¥7Ž naðpV~êÜTn·W#ÛmçvÛ)ëÍí¶ó™n;#ùÅ‚ ÁrŸ”°–S¿!uõvCz“´Kü†Ô›{¹!õ.Ì iÒ7‘ü æ¦Ï’íÖ.2wçK$n,ß\—7‰·8˜¸¿è‹z†7QâáÍ_ÜüÅÔýEŒmaoDTñ ñŠ€Ÿóã ‹}óÕ=}?ðV*uÕWÕæ±Þ"o÷Xó¬\€“˜kn‹;Ýrz¹ÛqÆb§ò°÷‰G t„»9U¿) Yœû| ~¬º˜¥nþ›!2„Œ&ÇŒ‰‹c‹Ž¸[¾ƒl­±BòV:!û°-.ØmX&a ÁÙD ßê+a# ÐÁYÎŒ¯„¥<á“ '%Γ€Üav)ïz*[2ŠÎ)²î~割7 ù„% ÅM„ýóhvð–%*ÁzË{OQØ%··TLb+Çwš˜–±†w€i Ïýê4]Ëx¢JV¹ÀÖXª ë`Ÿ’ˆdL„ë]Œmø e{o6~ 6~$¦¬’<¢Îñ‹¤C¤ì‡ûÄp2YÁµDÊ:gýúõ«hñ™ËŶ7q_+s yy›ÇÎEhŒªº½ð-]w0Eû>üy2ǰGI·S†ͺÓ<4lñ`Ͱ~æXr£^’AÙLwyÏa1ý9õx$&îK³$£%æ]é–T¥ßgD-z•„3¦…*ûXÚ:aèà Aöa5ád‚]ÎÜ=%,Ò°Ê|QGƒÍÃã!_vùnzš·Kúì´de;§ÒŸAœ­Ì _wÕ¡ª³âÛ‘ŽœgóïÎï…õÉäÿ~ó GÞ¼k<Üuë´ŒÍσ×1ð›6p7 Ö-ËU‹¶„¿1o{ÓãÝ·iòÆuDôuÄÁoÎÂÕr_Tåmõn‚R²«õeyîÀþ (Kœñ=x0¤¶Õ6˜žÃ¢ÛùzüxTŸõ‰\ØpMczk äòê+FüaÉþƘN@Ý¢ý0ùcRΑlÃc{ƒ# ¸a]Šõ<†A__QH†àb”+£„Z†¾:Æ»UµR‘¹'SEÑ“Cšàr}‘áSÁ2ÃŽwðJ>B¾ L!Ê|ãLŸ-¡é9‰–€t[ÙÝ„Å#«:aœÃhLØSÂë`=†9gÊø£A¸·u®/h°!€Òõˆ ‹clYa'a]íkšílNá5@ŒnÓÝkæÁ–4Ϙ­XM1„ùdÊk IvvĆ )ÀA2lûcÑAÅ œ « o ¿HàÁd_MžHØwb~j3D Üb‰W‚˜ëŒA«Òµ7hæø|â›àÒ°ÁQ3ì~LÆûµÈˆ [ßÀÀo詺UNŒºg\Yæ ß~t²Xêë¹#E†,é\õ.q†ß-L?# 2ø…FE`Ñh··c~4) êʳ¢§»†›À”ÎÆš\éÅ7Ln§V]ûðv¿¿Í‰’ˆS_žp³°,‹aÒ¦t“D©&–¸L7(Áå“DÜöIHë$®ípÙn£‰w !*îá]3m¬,L6 Û—çË¢ñæ£ñ }Æ©¶¸±#æ@\žÄ4[ÆØž*`ŽC±—'ÂrÜŒSÄ=Nø_¿lZw„ÑtýOß*Í–DkA¼:NcÑÐtëtUnÄÉå ½µ2$Žäº<µéÚM×Þ®uÙåy,¬k)ùK´0±õ -ieý ¢$p}ùKg<šÂ%÷ ½aí(%bYƒ%ܵ Ÿ#DÔÂ.»<¤·iamú§ZýÏäPú9¦Þ¼<<×êñ8«^C‹EÙL#ôMƒˆÜ°zœ•j\G„('a/?ív°îÇ|Š!Š‹¸¡}*4c!ÚÇ属{0lë¶WÆ%¶>ÅÞ«‡>!ö…ñHT~y@m³I­Ç´T}¾OhC«ª§°ÖË™F{ªOm ÖÞцD Õ÷¨Î\žåÚ¢Ä{xÅ=çb“V'­°U€,3}1mȩ٘WÌ#ºÄ“¼w,û.ÏbÙç#ÆALÑel²ïñ"|‚ì‹Ió—üÖ˜>{yNme/\q6¶ß›ÉEinlz dôâ„m˜ÞNÕÎá‚‚Ã<…IKF]2pcêHûm=±þœQ«)°ß`B,SÀQm33àG 6 3šÊ1„?(0%šå HШ²dÚÆêM0§X4RJ]Ë‹²ý˜ ƒñM+Bv®iÄUO) ¢Žhq x/Œ‘z{Kh¦3 ïâ0e‘÷0AèOF¯év  v­Ú71pO€Éæhá‘ü$ÇãwÒÌO¬ö±„Âú2R)gËbr3%htÃgÚ½Çxn«Snå§%º_z)—ؾ‚´b¬¡Õé7…L:¢v¿ÔWuÉà.ÒÛ¿®ðÝíN'œvø ‰SÔýx?i@5¾ÄÅ·Š(B†ƒÆÓ¸ºù:Tk|=‹g»=©uýwÝJÁ³a‚ð`¬‡Þ™ä¢d^èÖ}.–Iod8Ê;Á¬€18Å!»¡ßÓo fý)gM”IŸ©•‘¸ )[Â3TbؤS‡3ñuÓ³˜d¼ÄÊâüOGZã 3"™"¢X•Évm½‡±dF¢oƒJV8F“ŸJe^ÞÎq c%ª®ÖWme´kIV÷”—ÎãöK n"™Â±:“­V&4ÇWRíE¤S"¨ÚõjÛFôQfÛ:¬ÌºSUžVÅ¥!2ÔîTÕC¿3üNLÓ²WÕËŒ ¿|ÙCÕÃù¯3¼ˆµJ™ñ‰çôûÃ\“rÔ {ŒìÆ•ª½딡!ÆJša3ÌpñŸ6¤Àèªù !„ aU³fè`09e”Ô]…/zºkNa'VsLÄÊÞûDüúÖ~CjÌCðð<Œ¹ÃDT¬ñö &©Ú›ck4ªŽÖ‹9–¥G|Ó>æ©ä¿ã¸¾€0Õâ÷ÈᯮÞñM®ž¯·UéoOÊŒ~ƒ× Ó£ LI€®ª—0=1ªÃw™¸­bÜ. U„á¬b`ÌyXçöw5¨ÒNwDw¸á!þ¦KÿtíG7Œ„W`¶¬û\÷h:¢O”y1_PµUcm3’Y˜( Óì› gÞcØŠÂ>q#ÄOTýÙg鯔 hͧ éè>U^¯•yñlz-ZG[Â÷Y¯¿áÂÃ=˜•ÌøHÌ+m „î"1˜n½G´.˜Lˆp*EVACT{ëÇCw'QºË’o/á|„¯›ù€FÚ‡6êê8[Ëÿc#5œí \ãƒâ´4[[?9òM†Ïs& klŸ·†$4p×±~UQuÖ-Ó†Œ eac–iíÂ/*Õc¸Š«Llƒa Ìˆu2æ§î–ø"š"\‚'xÕ­Rå¯J%RNgíö|)•ö BÊ“ÈBê…+a¼7ÝhëÃÔ+øÊöô ELÀE5ZKÕ„iDQÖï¦y_᯵ÄIàkEê½åÕ¯û”»½<º-­3Ñ`KDtD0„™Üa[Œ—ˆ!ß]­ú.×zBjý{ä{ʾÐmÏ(dðbºÅë0ÀWµtt¬Å T– #ؘj†'€ÄŽ© âBÐR„¸WUN2P‚/uc Óo”¹=|Ñ»+{È{¸€Ó]ßç3úxNÈ#é—³¾Ý¤Û¹“Éq{Œ0ÕõY÷Æ?•œƒ»÷òb…¹¢Ø›!û¥9ß×…±zF¤Ÿyó WSo¢˜ ›œ£ä,½[÷}¬9~ÞãDÀö"Û=Ë©˜\·¿\Ât,šÏâA{ e¶ï̧wå}WîÒ0‡õ6 úk›•ZéкÝb…îš-!á*„Öÿ…‰*Úãá{ßÄj¾»¾Oϼí1ãa¹{+²³Õ€e× zl¢!IÑŒÞzê`‚^uÄ”îö¦]r{ÌI+­Ú<ð«9Ì5‰J³(†ËU šç8lDãY¼0Ñd¼É`Ó¾³tª»g݇V:63"OFFì[øC#-’ƾyGÞÏ_ÇÁ‘¶¦jloœÍÃoàÈ¥¼h܆(Ɔ<Áç±ð< ^¢Ñ²ogr?¶š]ãuðÞàyì Üäta×PÖß` VSxõåfõe[̈°!c±TÄœ!ìs!—mBðL†i¨Â:{ž¶?ˆ?ëâ'#(ÄÂuü`^ ¤P>#…ªzÁé,Æ=¤K†±Î¨Ñ Ä7ëkÇk­ÕüÙiC¤›Sÿà†F5FT®ñ[2s Vœ:@\K›±ˆÄyßåˆ3w–ö`Oý‹†] GÚNð64ÅA‘uÜT$rloÚ“¢x ¾ ó_·”ÁÍšö胶¤>6}9áÇŽÃàÙà7m„ÅÌ:ú•˜c îøs³ãnç8¨‚¡ IÏÆ‡ë0qþýõˆé“qAÔ`âÀèÖÇh3èFh\ ›÷ˆ3òÄ¿1˜Ôªå¤VfîЊ©¥4gók=%¬÷wÿ¦ùÔT endstream endobj 3134 0 obj 5174 endobj 3138 0 obj << /Type /Annot /Subtype /Link /Rect [383.250000 575.750000 440.250000 582.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 >> endobj 3139 0 obj << /Type /Annot /Subtype /Link /Rect [214.500000 514.250000 279.750000 521 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters >> endobj 3137 0 obj << /Type /Page /Parent 2 0 R /Contents 3140 0 R /Resources 3142 0 R /Annots 3143 0 R /MediaBox [0 0 595 842] >> endobj 3142 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 3143 0 obj [ 3138 0 R 3139 0 R ] endobj 3140 0 obj << /Length 3141 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯à9€F¬*®@@Ir H@F'0l#ò÷Ãn²©²¿"ëëW »iÁ¹kº–Wo¯·¼ýó—dÿú={ûüå?Ù·áçó—CþT—yÿOvüóæòÝ< Ïê¦Ì¾ýzxÉ^ŸŸ»ÿ¾ú/|yþk÷·ÿe:ûK÷ïÏÙï>üqø¥ã/üz¨UÝýüåô³­U÷·|üyüü߇¿ý!ûí8ãy¹a3¯ÿÿ2:/«ã6–~9œ©N~ÿöÛám·UtU(¥3U˜"Sm¡³ÿþóðS·Àyúü©í~¡®Š:¿e¡Zw+™¶ê¦Ðm7SÓÎ:ýš^~òB­·Éû‹CE™nZëì‚—[h÷:®*ÿqz“—ÇÉO;‡Êp¹–Ù%/·Î«@méBãì>Àßäïö´si œ¯N.s³ª(NðišL©¦ÊÊZö“é…Ñ¿Ÿ½í~ø›ý´wq¸ÝZ'½Ý¶­zéÂËõŽóû¸€Rw ‰Gä9î]0ÃýâÙ%/¸4&ïA$Í„&Ó{¹ßB{$ß~ïòÌùt½xrÑÛ-;£ä B5>@4Îïãª<÷H¾ýÞå3ÜïlöÏ.³à­ôŸÃîÅòÅ÷_o?©BuhUe_ê6ׯyúñµSHÊìÍÑNÑÝèÙóÜ|øSöõçÃǯÝÖo[µKy¿d£†%óâ´dñT˜ÞÆ>þÞiD·§‘æ©ióJ—#¹†#Ïh¶¼é¿3~ à$JF”y2ºQÝÐM ãÙðò§‘òüË10”,ì'1OeQ5õº‘¼„#5\§"îÉL˜ÃIT!Š ø€S˜[&›Õ ü¤Ë1 Ì-{ÃH…1ŸƒØ‚ÖÄI-—Ì\%·Ùõã;_ý«ø6ºµìÂܨ)Gd.›àn–u¦ . <׳oQUª™¬šÉždÊÆ,Ò ‹Œ=ëYRña@´ªV·³t<ÛâU9ímFI”°Lù€˜¯á]|.O1Æâ/Œ¥3¦ ¸Yà[€‚a0—ú@,<0Åü|Žï#=PåSÞš×wûÎÖ“‚Òç!a- scŒˆŒ)˜æK£´¨| ¥yxm=xŒ’çYòa½‰`E”©‡uHÌVD©€Ò°Eí ÅÂöeåZ‚ŒfSªv,~)+É]TdˆØ®.οCLçË›a @©™²Fߌ,Ì=Þ·*Íä –Nð©eeƒ¬'%#¶ )#ÕE}8Á|`~ …1‹Lâö©®ÊÉ: '`ÜdX`Eá“¢×/LPëýÜŒ¨fÉb(1ü‡á²æãÛÅäùh6ŠGéÛ·éKaØÌI„Ô°pgÔ“9ƒ ŒâX2 Èþ›’Q|”"÷åݩ݃òiÐBN›y…ïÑÈ¢k#áÈ;8òî ‚# œM£cÐH÷Và“ÂŒzÝlDÃu †¼ ¬1tà†ë Xî4ÛðàtÛø¤ ÂÚ2¼S àI1 Ìû€ô\ëÅýXvºIŒÅçÑð¬M€±ãÒ°Ô‹ê?žÆðetlu`ŽBpoYûõq(K 0^ã~…ÁtP+ƘîZN©Î^ÇÑr(=Óð®3í:Ó®3í:Ó%W5Í®3í:Ó®3ù¦³òìÙ V¥Rúõ%\É¥â÷ŽÖ• ÎTíXLÇÜzRû½d³­Œõ’•{-Ö´FœÁoPŠ•:ßé”á^‹u^ !™¨áMæœâ W*©Ñõ)¢Úr*£ÖÇS ²é ž«8E—£”2Ë¿ ¯MÄòwÐe¯• ™JW˜Pº…D­5&é™Jud²/e“ž£kâÌ:TR:¡," Ï’)M;•‰ë«Å¹”fÂ#š ¥Ÿó°ì@6 5aKuÏ+wÒùBU±§Ã‰2õ{sɤkûpÁÕ%Õ#Ÿ"®œ‚…)œLHYŽÆ¬\×פ!CÖ3t’­‘J2æ³7†ØÄ¨Áò: ÛjBwúœä‘©˜ÆL¹Š¨NJ™ý¸p ö/îZd¸ ݼMí³Jt1ÃäPþ>LŒ¿êqŒ†Ç<˜DS·ò~E’-YIhî,Ü  ’¹šLͤ^r‡÷BûWÁB.Æü5Ùút{!4R%üð4çŸLù{L'ÌUŠêeûõs÷#ÛLJØ *ÑÙ&Á·ŠP·q?þKÝLDÞFmÑ襫÷È !4—º¨ÃáÞ¯6uÉaa„•„ X¸}¡^Š•K¹¡f=FÕ:£ÞŽŠz"pptRH‚9ƒ¢„å{tI¶ÓÀ¼Ñϧ)”&ï=‚©9‚ñä„&ͱ;nök‡Ý‹O~9|ñÖ vj8îa‚½ñ£ÊEÕ KujѪ”ñŒæ}C6’w·—Ö}¼ÊôŠ(¡œXß„SÖá¬P5ÖNÚZŠ@UO°SÌMʊŋ蠷Ê>ÐJ´žÝf<1¥Ì‚Œ ‚Ë&‹Ô’Íܵú©¨ûPM|˜ô£õ-!DžçduýùPÈNµY®IsoÕP˜Nxo–¼DÅL Üèì]Ä«»àJøL…â@U§-»Xÿª.›Åýì¼Æ¶·×äÄkRæ(!ùF=Æ$í|cç;ß aŸo {óï6lÌXJw›Ê¾BÑwê­?,à°üè/óf¼¬Wݲ%ÔÍTèaf[ÿÂ邼³B-á!æù×áIJ)ƒŒRö] ~ÆS„ÚQ¡CDŠ!›ò»ôr] Ù9ÃÎý¾prĺÒ™!à¤CµËbÄ›·ðš¶‰@=ûÜ`·ñÕÄPl!T­Ç®Ê(oJòa™ù,þ18¤.lK&ã ‹Œ@¢‰ÊYH°¦¬Ã3l .rw¹ ³ú†oÓ¡U‚²§j¾çëø᪦K.‰q›iòÉf,%3C÷²šD ˜é]ñ u„ò=EËüaì“¥HßÛJE‹£"£wŽHPMI5’Úò\Öf*ýÒ¯æô4¦ÅÚTcmfªAÜKÅ n‰Å|{ÚÃ$Tí"F_x É»W E¬†”ÖV 51OÄ!:¸Åb` "F,­-ïSþ8í€ Ñy¸ ¢¥Û‚¡­½æÕ]ã–Û,¯"k³Ç² ã×¥²êñ‹Ñ,½>Ú“K ŽÔ«ñ:0‡,.ÍPÇ(;p>œ¹ÓZÚnϹûyNxÁ2™ÖPs¥š÷b ë§ÄynHFDêÅ-=oˆet¼J¾•îŠeU^¦c¤aÆFÄÏ[Xd+–̇@¤lÌ}òD­t‡¨c“»*Ì-Ǹé F]b‰e»âbå „ÐÆ7¹?üˆæ•NÍ £}íhžšã›KÍu š§.¬t¾By‹î{%ÿv(N–=h5ºe¼7©è]×¥®Ïš¤Å9ëð2ËuHÊ ;ÞeãÔE¢çpŒŽ9ÇïÊL¨³C]©PO›Š¬Hï%C6ì1åŒ8¦œÞÃlBDv­™ru±gJžÏÖôßo"¯'k¦šÿb Ã3Í䃒ﵩàtÍd:Âzv£§¿O{ÓkÌc{Ò7Εò˾puÍ„[ÅQú^h|ŸVWŸŠ}IBAâü#&™•F›ñ®ŒôIf—KFO2»ØÌždf%î©ÒNq}¦ñD²œh®ÅwÖÔ;‚´ØÏ…ùP þ× –™"L¢E¥˜ãƒUy!vãó¦2h™šd,k7ÖƒaàМ P/‡{Cϼ5XŸFüëÆt`¦øSg ªø²~aç4£!ì”ìÔØÑ»Vùà‰¿ÃÑ*qî2Y;S¦>ƒ¢ ¬,ß*`}<ÙBS–ó¼›\ Ó zñÆ99ŒG4ß²ˆ“®2UÒ°H4($LˆŒ©ÎÀ{[yú;}Ýr‚ÁÞô`³ÍRèX¨§Û`|#²Ñ,ßÁeraŒå]µ¬Y~£½/h,p‘U=v¹µË­]nírëá䎿ߞÜZxó/ʱ"L´’ûSÂC; =?Ó¦çzÇíÁáH@Ç Zê-:Äøõ(yn>.S>s<"Úi`{¡Õðé_7'Ë|-~H¦Õ!Lî.Ïá½X´µ˜…à @¹1 ‹Q[ä@Ï#”>­Ù5‘)g‰ÑcêéÁ :L’´^%ZìMFJïcwÇmDY…ÛáD”›ª»›©¥ªvè9šg'mÞªÉe`/-㕱Զƒëhì{Yò2ùÄ[UÍ>&L 'ZM Dù2ù±,LŠóŠD 0&È$r°dÿb½ì_¤º à{ph°ÂªOÎU”SÐjú”b-ŠY3:"Ô {ªÈE‰®L¹”µ•)¢[Ê&%áž6ÐÅ Ûä…*Ó#šPGÕtY¯Xˆ„‰ ž–p$ì6-ðð‘èÕÙFEmÒm±£ ‘hO¨Ã{¸Ó{ÆA<[ŠdzŒœ^_ÛËâ©ÀÿåY¢I£K]°@”íâBŸ‹Í ˆlu­@5+î†ò ^½nf*Q-Š!ñ±-ª \'˜1)›ev'¶–DÏEfÀÅÕ–‹×¼ó2O¼ÌíÙh} O†›ÈDCÎLC‚Pçªf@ÄA-©ƒõjg1¦.f)°ÒŒ'Ê}³‘¡Ø÷%(ö}3wçeÀ”‡¹*!]Š{Rdò¼c–DhJÈ)•VgÝF«P|p\2>8nf/‰èŸQù â_H6x ~: ®bå[ÑSQ(]øq¨_ä)^60òNÊ·„l©\©sŸÕ=Áۚ؋OJ„\â“R‰°8 w„#{ê·xê7nR²/keêÅ­ZFðE¦sìv]ơߊðõ ¥[jµWëZÃòöª'»ècapoôƒ{ïJ%©T¦Þξ6·´»Þ&#´”wƒçy1a¢¹ûyÖ†ˆ¶Ú˜ÝYTnÈ<nž<{(oi¾³*¼Þc?V"Ö,ߌ#h'ïºi£l¨jÄÄŠ(£:â`õŒiÏ9&CŒ"jQŸ±¬Ã¤Á”ùuûxÁÞ0Ýè›<{ H0Zu.-²rL¼Y©Áø -ߤQBÕ+Ö [äð;X{PØê…{³`¬å}ü ¥–uqÄì`÷K[ü³â[ò&DST‹Š?’¾üDÊê#ž ûd13ü*ÜnŠd0xÃ¸Ýæ&n:ž¾ÅÇzŸ7^„ö+a3Ô³°ÎH¼üPZQtQPßM[m‡¨ëV|Y{èvÕéz¯ÕA©ü€XÕÐ\b¬×GE'PO)Ô%ÎŹ,Ãô?£ôkù³<Žþ€WÂHçydeê7ÍBxáù(®Ùsy>&yŒ …'‰q0¾lGIª7Œ?»–¥ld¯çË© Â``êùcÊÁ§féìÛ-QŽÅÂQÒBU¤Áõ¢ˆn­ñÅgy6Ìð¥5ÔIA–“®¯Î†ÁU´è€»ÌÍ_¥¶v²—ŽÍZ¹ðç¥_XÁ¦›k\ÚtgÍÕ1µ=Ó#ŸVö·Z_A§þ5G?éþR/Fz;²š ¶~Rë/î[-@îÊ:fIÈ^Ûۧᤨ›6¶CŠ)»Ä)ŠÕü€:á4|̵®CáÙàwΠœŽ~áõaîø÷|l²©0Éc¨BÀ³1ÈaÎ7Ñ~9¢¦(€ÕEx59ðuZÖǬÕ+8nA›ˆ2-è‰ ~GaTknGµ:7O›ºç†p²a/1ëìóáÿ¸m) endstream endobj 3141 0 obj 4566 endobj 3145 0 obj [137 /XYZ 38.2500000 159.500000 0] endobj 3146 0 obj [137 /XYZ 38.2500000 159.500000 0] endobj 3147 0 obj << /Type /Annot /Subtype /Link /Rect [229.500000 421.250000 282 428 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 >> endobj 3148 0 obj << /Type /Annot /Subtype /Link /Rect [69.7500000 187.250000 101.250000 194 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn3 >> endobj 3144 0 obj << /Type /Page /Parent 2 0 R /Contents 3149 0 R /Resources 3151 0 R /Annots 3152 0 R /MediaBox [0 0 595 842] >> endobj 3151 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 3152 0 obj [ 3147 0 R 3148 0 R ] endobj 3149 0 obj << /Length 3150 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷ЉØÝ C€Áƒ‘C°Ž^#ò÷£Ö£gFÒG‰_)u<°g<œ&‹UÅz±ªøîÏ_þqü×ïÇw_þsüÚ}ørÈN.ÏÚŽç¯^þB—§îç£+óã×o‡ïÇï‡ÇÃcýßï‡ö_þZÿô¿£>þ¥þ÷—ã¯ùS÷Gç?øvpÊÕßm¾WNÕ?e—ïçßÿûð·?;ÏØ/×óúÿPÆdÚÁ˜Yúû¡ß¦j¾~ÿúÛá]‹€°UtQd¹=*kêÿTVÿûÏÃÏõýôÙ©²J¹Âºìš…”µÍReuTª,޹-Ô| M¯bÌ®lqövq¼]y'¥®ÎULê^¦‚“¹ˆ³7°Ç¢.œ\”º&zv/ÓGÁ¿U1Ïn{,êÂÉE©›g:&u/ÓGÁž—1g?˺prQêÖÒ­E)¢ è2”Ù«*æì ìòˆéè‹g—$°ËŠ^7I/æ1»ªLÄÙØåÓØ3»(uo|º"ŽtLÛÖñ·°‹ã¥#/œ\”ºÆuê±Ê£àßEÔ¾ÎELÞ9Ã.Ž—ŽºprQêæªŠyv/ÓGÁ^Ù˜³Ÿauváä2Ô­y§^ÄUµí©k ExƒÙe±ßN^:oòryÊÖÚÖ7¹$e+]´èÑ6‚.ÓG˜¼TE¼É[ÈűÒÓv4ûcÈ,”ö7 ¢úÝóÁO‡wŸkIRŸ~®!kl¾=};ÔžÛç[QŸ~:þ1Ë´þÓñé—ç§î8KÖ¤}½¤úØ,iOÖ´‘íóß5#ÙCl`ÊlŒ©š%Uvªíú²†g̘º„øÔŒä'£K¥ó#ªÅsy*«¬x=RÀÕÂfúéž×³eŽØ´O˜v¶Ûð,ŒYÁ­ct}€äÁ\XYø¼° ÿ F ÅC:eyó sÊmqæêEÓ—ÃI0_@žeØÀÃTŒÙ,ü<øºàYgðæ‘) àYÇGNv§w'#‡‡Ãšp‚y‚I9‡üˆÚ2¯ô@]zÄãûŪÓ ËXU† 4ûI Aʪ àHÙÖ¤RZ÷Âäs³luj y%è> ‘Ž–S#ŸàÈ{8òBPÀ‘Φш1hÄBØ „ «Âwzoõà BÝ™A³e*|?oʳAúÈâàÞ8D¼“ :ßizo45‰dÕNÓ„çîÔCSL9BÿxÖ©b[µ] H9÷ÚðPù)«Ì+Û’ò–XØ_ƒëØ3Ñ»^ {À0”€½²{óþ0Þ<4Å!˜åÌO‚ñcMŒ›ŠW©u°³Œ!Øã‡TløÞÎ8:•1ã+¦¨",h’¡û #F6°ÓOá;¥‚ØÌ!Þ0Þ4ÔIÂxc„9±Ž'´8 8L‹Æ1M|SAbâ  ›y¬ÌÎs»#¦Qª_h ®± Odgx˜–ФžÙÒë¤ÊV‹uÒ¦†{w <ç¸_Á4j1HÖB‰ÊiØRÆ$Å"k;W¾Ñ^+å¨k£zlç±Ui—£þ¼ärÔŸarÔ\æbÂãM1 k% ¯”¸×£,&Ñtý¨š¨ÖóÌFìôÞtÁ–-ö* X"Õí4³ÎpÇc— ±‡ÿ†iÜ nAG O&u;ípz|–=§\ö+Õ‰±<ø3¡,"ƒºÀÂâ…Ð×c™ÉæX^¥…ÙM$d +£öl˜û³B7Œ–- åbÇ…piy3g‡Ú1 b‹s­EÝz‹ uW`2`³ˆH`èòÉÃð¹XnàR2Ò6i­œ.m¯Í`­œ'³çöÃz4O¬ðdÖÃupE®nÃÕ{ÅÆë(`½Ó–)‡+z¶ uªšƒ÷«™ó"ÂÇtèÜjc.½^`®ÇÀzuhty&Y+Jã|&umØz„ §jÝBø¿ISÍÌïFÀ¶…ò–€½Ñ€£»Òô*MkûìgJiÊ^RÆ­ôÄ´pn>‘hF™{]즣„TÁ·ðà >ÊÆ¤àlÞÁ”[ÞÞn9:¶ìm¸Î‹Ÿ£ó¼ärtž±½ÎrE¾ØƒÂ÷„ceºÅ ÃÈ&e;¯ÝTÁžïº„ D/¤îMÏSØ‘M¢äÃséŒ9>L¼†¿EÚ¡@ ]²¤¦É:Ùðugš¥°s¸<,Ëè\ªð‹{ìÀŽÚ¹¦ }æ&ï…×Þ+tá‘eBxɺ«åÕü!Œ|ë´™Íazbƒ}”eK²RxzýC"„؇‘VÌBL¿aƒ1rz‘lVce‰ Y 0$øÁ€4¢-(ê ûàÚ3ÑnQ*7c:F¹è¹Ûá6‰‚4up[Wq1:¶ÄuOœ)<íqO )«¡ñ‰MYÆ0îšÎG5eó>Þ²6N££’þÕ«]×lS•v¨½øž@aþ6œDo¨Ô¼íâdkk¶Ê¦¾™²Ã€ÂÛVJJgn±VòÔeáÔqìåóbé½éÁµ¾»â<ÆàŠ~ÔX’ÂŨØò!Æn²ãÒ½ÝZ+±lÑw:EaæõÓÝ@Pw:x§¸ ßöàÄ}ü¸Ÿ ã'+×Ô4Ù_yO@‡¼Ó¥¦'ÏɉÄ&&$Q7¢ñ€ÈÒP@1Ä÷ë­ 4ìç25R*Ew©=ô`Sr æS×cGòi޽¹Z˜DÎË+ÎÅ9‰¶wy„€ÙÞ  6ÌYÏ}¸U&K®Ýn~{*ssO M©òÔ‡›ÞøÐà|!K¸x¶.–tœ<Œ aó`A¶06,º°YÇWí&:Æ&>”E„-ìaã¢Äg-vàAËሂP[¼„Í`ã·À°ajÃþ=CÀ8ÂX¤޽g¨¤ Ø{•‚yóÛöÅwnfºÍ¬Õ=aM,†ë9h²Q¼Ó´æ³»*|šÊäÆ^"ž ³–‹Œ؈´¨ÔfȵK ¯B˜› c&•#•ÚÃÌÊ‘D(ÑÕ]oÏ^O já^/õ´ø“|\¦40‰Û!#ÕëÔ{O‹EŸ¹ÉLŸ ¾¸f<=Ÿ˜DýµZ¿‰4 Ê ˜÷5eKûD×êíW¢Ô+:Š©QG1µL!©N#Å@#ÝVÒ}@•Ƣ∵Æ/vMËFjÌFgnh˜¡^¯žðÛ¡pîå/~=|IÞóî ÂÀfb ãÉ0ªäÅzaõ'ä“õ5[Ko÷©œ›}Û-ȉîä2-Y™ö8¸E†ç`É-êZ wM“-ÎŽû´Õ3zðŠX‚½Ü¥ˆ<ÙOb•Å,æsj€öÝÜ€©ËDédŸMÖcF¶rs{Áû» >ï×K°D„îÍC\Mm¦ìnë²Ê¾æº L8Ï--ž(uÄ© ç0â̾„é N©ùRó”é>N™½ìucÎ"ªˆ0lžóÀ<Ôµ‰âV§òm·:å²Y€öʵ='|; *×f" Z_ªÖyYTÎÅVºÊ Åš¨'b·çjPMoòÂqµ‡Þ’ZïÚ•¯éwcÖ»ÂëlÃz×Õ%ÿ“P·iøzÔßö:¼ŸøªÙä—G²ám–ðÝ"Ówy~ŠGë1ÑnYErS g«ëCÏ=!ÇÅIœLЀ‹¼ÕƒIuQ­[Ø¢_T¤%%5mlvUwŽ=Lµ‡©0™½ªPzg²{ Å7mÕ»nžW{°Ô¼Pfl×äå…>ž‹ÔÕS0¨B¢÷ÜsŽB\rWÈ› w¬‰XÅŒ«5LÑ%LÕ!±¤Q×ür…u›ÊÛöÛ¸PÎÝ|bÜf„Í~mœ"XèbV¤¤Š9$ËèJuK,¢§î¬²!™Ê\ýÖ{ϸG}uNÙó#˜QÌ8£­Ú1Uæî|Ád^0.3•>&Ò^Fbê.Jäþ/ Ü—"ÀàÔ…oÀæx¤]Y Þ¸œ˜*',D×â«FT^ßºMQº0~w&“¹”@,ëyò Ï U6Dª%üÆs P—²Y87åÆ$²ÿ hk·Á¾„žÙ‰ð·ïèz‚&ˆñÙ‹2 0RiÁÔ½•n)™cFÜ1z4'¶>ãp®¥Þ|Ý3b¼º®®ªìË_¬ÑF÷ Âkb+±ª}´¦íø«¼´Rsˆ†JIdURýÍ™°käБ¤Aù)X£à³†7iëɇ!ª~EÚãbSÕó ¯Š6sq×8I³&öêa^*{ø½„(ÁħS‚pØìÇG¢ë̲HêDŽMˆôm§"Ŷj@B©ŒzP’hï.(#ž¢ÖÌ…ß«!zɇTâvµ¥ì¬€ìl&“Jmˬ„ ûIÕ-#ÔÄk[éž“°¡»YÃ5P}c<ÈJyÆgaº±.ÖŽT,—©/`j-™ƒÈ<„3[Ç"‹˜ –‘mDø²ëßžì6˜¬ ?2æ²k¤8[ß ®Òœóåfc*æÒ YO¶þ?Uü§B½º. ù)«ÌkV€— ]šÒýÐU;É`°óØðLyî<™›@ø™1"Åî,Ê£ª¦ÎG±qö²äûžÑÚ+±;úŒF:™“ŸôðÍ3afëÁÄg:ãêlÙއjyÄ zëè ÍÖQU=ÁŸG Þœ­; ÅÉ42ÞiD–Påˆ' 4]Ÿ)Liˆ)ÌGŠª]çRÄ@ Ot†ÕÔgàlºoòРsÂzžZR¯Ó ú ËR}—V¯žëöÛ4Øoç=p‰|a—)ddÕ€Ô¹2…‰ ŽŒ®«>Ì`bj.Ücüªé{¦òTaÿ{*ªgÓ $05}ôDÝkwM}}²^³Ãc:¯‡ß#˜F|Ù •ÈeÒ~©T &¹J?O×fS—f¾îù¦Û¶Ô’mγü†És(E©±òë±]pªÊ«y ;|L[*Üþ »NlÌCVÌó[¨±‹†^Ì#I^Këùå9-q@1æ¡«í¡ Ó B0Bjð[¿×ˆôâùqîØåL-{j£º†ð¨mÅa‹97!{Z¡§OºÉ}9Òîµt®»>£´1œ'ò­cæÒ̧`ûÜítœóTÌØ†vh¬àòb¼ÁŽÑp)9V÷ÛPx6ø™ÎHQA[wÏlË2Üùçâr¬Ç1V! àÙæ0=%Úß=¾,€ H̘œžuà6ºhÕ{Øæ:™öÄ ?£0«•׳šËÌ©S×òœ~eœ•ÅÇÇÃÿõ} endstream endobj 3150 0 obj 4516 endobj 3154 0 obj [138 /XYZ 38.2500000 714.500000 0] endobj 3155 0 obj [138 /XYZ 31.5000000 473.750000 0] endobj 3156 0 obj [138 /XYZ 32.2500000 473 0] endobj 3157 0 obj [138 /XYZ 38.2500000 363.500000 0] endobj 3158 0 obj [138 /XYZ 38.2500000 714.500000 0] endobj 3159 0 obj [138 /XYZ 38.2500000 363.500000 0] endobj 3153 0 obj << /Type /Page /Parent 2 0 R /Contents 3160 0 R /Resources 3162 0 R /Annots 3163 0 R /MediaBox [0 0 595 842] >> endobj 3162 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 3163 0 obj [ ] endobj 3160 0 obj << /Length 3161 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø¼Àxć$ÌLwÈ!À`È!È!˜Íf±È.2ÙCþ~dK²-R-–‹”dkIw›Iëñ±XU|ÿ§/ÿØÿë÷ýûO_þ³ÿÖýüôeWê²hÿÛÿ½»þ@šC÷û¾6åþÛ¯»ïûï»Ï»ÏÍÿßµ|ùô—æ·ÿíåþÏÍÿ~Ùÿíï͇?v_:~á×]-êæç¿O?m-šßŠóÏãç?ïþúÃþ·cýpÝd†¿JYkŽÓ¸1ô÷]ÿšâôï÷o¿íÞ·ˆEVµµÕ^h¥÷Âj¹ÿï?w?5ôÝ«…¨+]÷ TËÓH²IÚfT-¼NÿxºOйUºÎÛ™³SE¨J„{g\\#›ÁNÒªN@ÿs÷)·²uºÎO3g§J·¸Þ¦êþƒ¿Ç6ÇMÕK‹æwwdqd,)ʆ®²>ŽW¨öÏ»èhe)ÛE*ð×¥÷,`UaÒu~š97Q:öÂ3ª«jÛ’G:õûîSP¿‘À„|sœ9;Uúµ…½'àZ•©êĺtŸ s[$ìü4svªôËìõþ9¦<•öQ¿üøu÷þ­1 1«ýןŽìvóôãkC”rÿ®10Eó…¯?îÿPBÿqÿõ—=T²ì§x«E½Ág>¢–âly…-`Ë œA[ ìMÂ7U¨Eã¹ÙøHøL)*êxàY+8ކ+§`‹†¼#ì ®©‚‚y4°>p˜n˜G)«€e!°>9m×ôõk£–’kiïÐ(”–RžÒ‚Ç)qo –t<ëE±†„zÏ ð¦¸ÛhspoK-¶º=šÕK"sy´6÷àš—Œ35U†WUb¾"H7æÅgÃq0΢èX ^x4–°eC®‘ëÂQ›h¶Þ‰ÚH(rE@6ñ ð3„Þ$ÖOP6I³†zƒBQªÎdÁ6LÃÁ”Å£YW’ßa³®ÌÖu½û!õJö)B«Û(ÇrÍÇì…›Œ¬N“‘E?Ñ2¬(e; ÙÞPK·ÀåAVmÓåÜl ôöŸ±èÙÍZJ«êAo­0Õe g‰Æ‘ê­Sª¢:˜¶;×°ŒÑö&Z¡­J´j4Äk¥ÐŠtÆ9ná8„ãW ßK3qðû@N&ÍR¯B`M+ø ìí [%>m ï@îí¤™A2-°]ºhS‹áÞ¥yµª¦¾V{å©EJ]™á"¶ ÞôüåíŒ Ǿڮ·>hU;Ò`PKÇÙåAI#Æ8adœŽÆZºWW}wSf_]ÃY—(ðÕ=úá÷ Ìv¯ ø að+ᾆbØ%(©{U!¿˜Ë@½Éz²Œt@w¤E+HÂzu›©(úykü(\MYlŠöaÕ1xnë$0!=FàÙnà„Ö­TžyÃZ®Ì¦xæSúØ&hÇñÖë%^mêÞ/R{@³*$Åóa²þ ÐR‰¢×Hös&F|Xë{z «Z¬×0…&1@üæ©Z^K„6|ûCQjo“i®_¹ìÏmç ´½s }&×`Mññ~¯6^…-XtÅÁ¢J¨›ó!&fâ¾ÀÁAÒÖƒF9À'i,1ûúttõ-”&g­à*(‚Þh|'J|Ð iMyŸÅë%ïÑ5yCœòP¤w¼]ÎÃgUÏ1ª.ú â Õ>ª¥X§­ñ 6ìºbìªe½a× (pØ5›Øê†P{¢ïIzD„ª«{Ò²bE£gµ”ýž¦s­l!¥•AmÐJXË®2I-h%0ƒ€–ÅÅÖ KÑð = 0 ì LFÙ<ŸÊv³Sž’³išv`=ŒXßô&Ê#ÕNZåÚoéËÜþ¨-}9£v`M_Î5ëeìÝÊúž²7 K!§“Ž7íô#Ø’MÒ±ÊäqáKœ ›ö|Ž“qo^‰Þ?Àÿ[àEún"EÊò&E¶DAÚAÌž° Y¯êÛ‘ˆÑx,Û™HNº‘1XŸ«ò¦Q~˜g€ã‘qbŽïÇÑÚ”\‘[yiUˆ(•³øÏ³Ç\€ý`ÃfH¶¥­]áÆBGOvIˤJاeÒÌ9)ÍL©ÇY1é˜ÆóáRÏq~SWnAô)5—gp:"ÌÏ dîdJÛMœ»JÉw£døÞ̞͇Òê쪮\ißd¹!GBÍj¤·kÈ+&iÙה対yÀHB&µ6‚Is¥ÚbÈ€Y~z}™G³ú•EH¯A¯rE|fÇ K‚:¥‚Áú€ˆ8^56Tc……*€†K;¨·“[ªë@(é:¸ÖfÄz÷¬¾ížå©Ê5ÝØ€^öåmýH/QòR\×rÁ´ 8 ãÖ–Rµ†‚®HF T Ê ¹—8yXhˆTš%b¯^2˜“U!°e‰Z…R9Û^‚B ÕýoÝ5Ë"JEQôD@ÇShAñ_®“©páÜ®.ry(ÜêÇ`o]M`Ù7¹3HiˆLíX"J!®ÀÆž€ð3õ,v·r_â’m{µ%ñë4BÀdÌ^"ŽäF&” ¤÷El§(*IÀ‘WQÎ&y·‡ž(¦X¯.B9*ˆ¢dX|wÊ“WŸGÌ^—7ˆ“òH RŽ)¤ðb€ ˜Áx=±i+n¶xpœˆB ØÁÿ5(“¥l½2áÚ‡ ‰°°Þ~ žØP°K€²„Ã7¼¸Î #åó¦ø¤÷ô™ómH™÷ŽQÚäf]ü”gGEéRjº¯×3”ØåÊëóXoCHÙÂa–À[+6ÿ¹Ù¯aÑòÊ¥fㇳEÑνJo¨¥{êP¡ûíFz{½YØ[Kv¡î­ƒä#-ž5§ÎñÁâ §¿Cnd-KÔk\Ø¢ÐÜ:ü …oñ)o gÐߦæ÷ÖßKF uBF–¦r8¹¿ ÍŸ ‰[po>{éý‘¹´çâ_5„ŠX3Eø6ÿÚå™G÷¯›PÅ|2Û…jîâu®SÎÐrA™l;|L싃³îRvÆ4n”Ýz6Wv4 Oi¼¬u¬×&Õ+“êÔÎSŽ{Uv[VŠó™pAVÀyŠ7)<SÖ–Ä:Ø’¢Ó#öì³a —”¹u²éJO|"— §?;3¥kù¦ ovÆÓHЪSL¹ e„m;åÐ3ñMé¤ÃiÊ?&K{>á ¥©a!ÁF‹rœÁVoþ†Ίò櫥х”­#> £\/»Ô\6xt&kgÍΕ·à¸4Ìa1Gs”àlÌgó–²f0×àòÂаaÝ-S`EÌjPöK¬_›/k™¾¬W…(¬þæ(¡ý¬ätÌÃ\e¢¨)gU”4ŒLAÔ ˆŠðUðZ†\ÇŽÖ„×_ö¼<[±-ÏvXA{C³!¡NjLŠSb®`à$=Flñ“PXrw é׋b1»È§ðå³2û£”Õöpò×þoSŒ)öUuüQ Ñ}*÷Uy8Í»ùr÷É·]¥BXiŒ8K zQ×c4ßïþ6ÇÇöÎÓuíŽÑ|Ò<3œÉñ[fЋŽñóîã©JÀušÉœñ¶ñ¬˜tó;u#‹×aöc‡Ô:+“­ôÐ ¥~ÉD²?l›rî°1Vña®° Ÿ œaó¦/-2i¥,=Kd‚ ÅÀM?÷Æ+‘#L™c .1"¸šµ.Q¶Ì¡5Áö@o˜›g?ˆ¹Þq߇õ­b}k}¬o›‡8üô‰ƒõÛo©A/êzŒ3Ö·õÖ·•‹õ›O<¬ü–ôb†c$ÇúÍ{ž³æ!ÖÇÒ‘«\àv†±2¸´‚XŒ8ÍŠ]Ÿsàø¾BuïQ¨¶õµBmþ6c U®B•…¯Pe§B/½¨ë1:…Úü]ù µù´tÇh>qjû-3èÅ ÇÈ PeŸMI›gf ­gÞð ‡ð–~™¿še}b6#ÆZC‡uKÚ—°FD›E€Y"OQw,… Hi„« òÉ”ž )]3CQR”w£ø¹8ÜœþʰáU ñªÇð².öh>ñðÍñ[jЋºãŒoT9†o”öÆÐ>¾9~Ë z1Ã12à-ûu±hÃèøÜKÎy`)4MACBúVË8%Ú´wÀD æËg0ŸG èL\¤üpÂ>8¢´å’ó©VU`Yá@»¹C;rœîTŽ©J}çÔlEć $~+Ë!~+«1üV[5Ÿxøíø-5èE]qÆo¥Ão¥òÆP>~;~Ë z1Ã12à·ª¯X%Âo« ò¤Ô—e>¥œ^Kž°(Gõ,÷cÞ˜õb’À™.dJ¹0Sëü'5$`Eö˜:”:EðYOÖ6¼ÅÖ²í0ÓVÀøÛ°kˆäÃZ*t¬K×JfŠ)gF¤ÏS-p;³bâZ1q]Žab7ýô‰‡‰ßRƒ^ÔõgL\«1L\Ko écâã·Ì 3#&6çué*îŽTpùb©Óý4Bî åhÃ;¨ÂÀƒp!€ßýo´®ú¹¢²„¤l.\¢P *ï1 ©þß<…lL±UCSlõ˜)vcEOŸx¦øø-5èE]q6ÅVŽ™bëżZá›âã·Ì 3#ƒ)¶ç;Ý·ð©üš‰P´x!W”+“HWDÎîIxÞ$bÎûLe8v D{Ð$ÔYiu7ïî‹7ÔÒ‰VyÞ-¸·ÎÞº‚#ÏtÚk¬¥Qõ+ra_yÞC9å?:è?Ö¦?Óߎ22ƒ–Yªƒ:‰¶¯’ÆzÃÏ`ê|„3(¸˜2\_ŠfóÞÉ]®»F¬þu*¤÷;‰¸ç‘R.ƒãö-–+ތܘ0#Ê®zz´6ÅG8VĤ¦óåª:Èê@'Ř³†í媯¥«ŽÅ®â( ë/{N8º"%ÆbM—«ÂÅçƒm0ÅïJ‘ÃGó=¯êº÷ ‚m,ÎÝÁZ–!Àe”„ðx˜+=šIz=¯ð,* (7H ÙÎ>{„@‰†ˆ}Óü~®M^¶Ê‘Ó=žÌÇ­‹É¸Il¸»ÕÏà_»Üuûèˆ7&übúiÜDÑ´ù7«¢6'(/Î/Ìô2‚ó8¥^á8KÞ&=ß%ѹ8å&eIA(¬[GÊý}‰ñÇ3›Ö Ñx ™ð^ËêÌfWú¬S^ìa­cXsÅ8òx"n¬`-.þS O’¶Æ”S¦'9{‰ *§8>y¯œÉÿ»Ò›8Š…<:ÎÅ…k¸à?N™knOÓB¡hÀÎ:·$Ç"yäÙÔwPñyZx¹o®þ¥P4 —›¢Z '-¹sùüú-ë´ZónÜ'ȳ¼'ÜèyZÎjÁ®‡´ZZ/†“–ܲY­DV+—Wj1œ´ä–‡Óå„¿ër#ÃIKnÙtyJ]ÞüÛoØ9ÈíŸo}aÂÉ%Ô¡ÙZ43ÜËóÑOë[sηz¨ñ„·(Pä©€óuKë9«ü–.”Pºsƒ+ʵ3;MyAã¨[A,cs{ëÞ]à}}™R'+ºW÷^°SÎcÝ×°E£×¸7øLw¾'¢^ýên*ÃofÜÏÐbªBÀ½‰×xæPýJ´Ÿ_ÏÍÂÞðJ`&|Eb€9 s * /8¿)œAàv%T8À2°+³¤ô:ys><ûz¿äÔ…:tZ÷^RWeÛnš–ÏûÏ»ÿÀ¶QC endstream endobj 3161 0 obj 5367 endobj 3165 0 obj [139 /XYZ 38.2500000 264.500000 0] endobj 3166 0 obj [139 /XYZ 38.2500000 264.500000 0] endobj 3167 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 235.250000 546.750000 249.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_external_run_time >> endobj 3164 0 obj << /Type /Page /Parent 2 0 R /Contents 3168 0 R /Resources 3170 0 R /Annots 3171 0 R /MediaBox [0 0 595 842] >> endobj 3170 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 3171 0 obj [ 3167 0 R ] endobj 3168 0 obj << /Length 3169 0 R /Filter /FlateDecode >> stream xœí]ËŽÜHvÝ×WäÚÀT3Á`PëaÀ ‚x1ðÂèñØL,Ï¿ï¬Jf©*˜ç’qòƃ¬aº¤d%Œ¸Ïs_¿üó·ÿ8ý×ßO¿|üö?§ß柿=4C×\þwzúó‡×´ããü÷Ó0v§ß~øqúñðõáëù¿?._øöñ_Ïû¿S{ú—óÿÿrú㿟?üÓüKO¿ðûÃ`†óÏ¿>ÿœsþ[óòóéóÿ~ø·8ýíéŽ×ÇÍ‹yûï?ë¦~zZÆÊ£<\_Ó<ÿùûo{øå²aOiûi²ãÉ8ëNfríéÿóáÏç\oßb¼ Ýc1aàütÅÄEw¶Í›+Î"Â>?+µ8úèéioR€r  R+‚6)¤UþW8ãLƒgì½Ã±—mœŸWóæ%~ ¿b{øÏðÊGte7®´Cl2î{瓱ª˜î†I“|"v4»íðfMÀw±ÌºªÆ^éaÃÒBŒÛ…QÁØ´ŒÌϨ%§Þúâ%ÉXw‚‰Hð ¦pa±¿n6Âë»qP…ßÁüAXX‚*$Ôù¾£v˜†¡ï¼óÁ;ªáaa1)8E„@ qú²ãŒÉr‡'Qb_q¶á*°)Å‚O•aFÂ+!*¿Þ”µóŽxvÆöÞá-˜ï¥ Öõ¡ë+`KÓVÄÝBLNFkL£…è“ =B¡—Û+8ð°«RjU%Jw¨zåÌݘ㧔½BHX†³°Tf$,¦^lç t W ,]°M jay X2SB«Ä^Þ6Uò²ù™å?yY¥qc\ ~5ª—PŒ5Þ±U¿*’_‘÷Ú¾÷™/r7ÓDñ’š—.®”.F1uTg}iWÌ9 ñ—åR†Ö—6ºVUÎ^ ÝÕrúI!©z Uñ¸Sñ¨Ò¼®¼®*ʘ–5;­Š‘ªQÒ£ó%J6~Yœ(‰UŸñ+wnÉßÓQ£2€?À0Y€SAÜ^7;†i|,ן±‚MÉ䜟¯SÎÓm;”ª÷Gäú>F„Ä ®øHhkÖ[‹39±ºVja:'Z©ÊšO‘µºµ³¸Õ.ÞÆÂ;p½£’µk‹¬fR)“íF™ÐÛj{Š/åYÄÝjÁ ØˆÇ¢öw0¾ŽbŒoÝÙ6D†8Õ¿á>a•óÍu•‰jåøÑð“‡Ð %UãËê”S®‰På¤Z&®[dLÑÛöñ‚B3r¦F­U_–ã4ǪÖ(Ñ ¸!¾§áéo_"jj-²ËU\lÂ6ÆM¾ÑHT-î«ÁJä4š\¯±#x †L””«•‹ˆàšöž‘‰©Ú¿ètªV à¿G ¯~¸}wäÙÅD"”žSC éB `<9›ÃÎ9ã[ V‹Õ<´Jßd|¢ÎŽœ¯âJTœNYqSÙëØ¯kïÎe­7zOÙ+‚cç/m¸’Êkœ§èöi±“´œÇ•´ŒÒ)&È׌ ãËFâ[L¸*`$Çö5.!ƒKå˜,gÝlj&wµÀØnŒ†{Q‡«·ƒÏ² ¬ÃðáZÏøhd·¡|w)"—éÿò+¬Ú(N# ˜åßóè(@AR)TLQ&ɺulEGf<¼ !¶™ì}âÇÇêšÈ¤¾üÁè˨± ™® p ½(È[MÄ™Æã]¤  F¹¤bí¢J¥B¼ä:¶lƒµ”Љ¹1AN;ùú3õä1;G+Y‘U*9óΆÉ$™+L~±på"5¼ «¶ì[6â6¼ U3…`µÆßÃi8xáªeÊ»>¼-YÖ‘§S3ƒ·×q1ÅAÙf¤§tD匩vËœ»VkœâË{Û¼4NÔÖ®Àfh%vžÉ6A0W¾Z€ˆ§æG2Io„ï nÛ_/¶èÒt]62¹`Xê”Bµˆ,ÂT9ófŒÁV¯Æzú‰à 2ý`ÒÑr[).‹¬g°qŒŸ³ËùãŒDòKI} *ÿžÃ0‡Fðß]kpæyè›\žÑ<Ϻ1×}W_ËLÅ0Íœ0ÿJ¥¬\¥žn²=S²'v˜»SÜ`ÌïL>8eƒª„ë²ó® í·÷D¤,¬c(–ØTbÑ1¢ÜdÊà_; wÍBNeì§Õ%1³ë¼ÓÜ•ÀZŠ1ï•çÒácÕõË' ; Ô¹=ºÏHfÊ2”ÛŽÞñ Ë°óªf[XË ˜ÇwÃ+`Æ» oJŒÅ-:˜ç(¿)®¹ÆÏÄ0V¼ê¹›OX•tªÚn¼oùï¦J×-ÿ‰`‰4K±4²sšRï–Äø;©dM"éM­w~À+€'‡{5$£¼‚D’ŸÂÜ#- :3®®G"ªRžájm°÷Š é°¶'d¬°xP?c*·˜–‰Ó®WDÙ©jý3Ö˜@UXvÂæt”Åû–ˆâ)ÛŽÑïX‹cé‚%c«Vò¢Áì°N}Uƒ)k0]û¶ê©®(k0H£z¤ªõ„µذÌ%ð;?‡ÑÈë]]”ªjäh䮿G eÇ 0?ãst5æ3ÆZ º\by‹¥ƒÐŸ)Þ·D»s4;B9¢Dе®þÀ|ÊÐ[2ž#t›.Ïå³6ÖâXƒ1ÚÛ_„ * ¼Ì¼PÂëb¼;OK· Î?£Ø5š"Øù­’üÑLÿû´Jtm‡ß‡89‹ûÝ«¢ÉØGf<:Š·¡Éºž£®WK¡º8¨**”ßždxN9Gª¢(¥XL“»CKXL/X»bê#d4¥w ¹.œ0Û–+ð Æ†T”|%™Å¤™¢$˜±ÀDÌñª y+p=æBV1HR~“Jî”®õžºxÍG¡ ö¸ßOþâ¬ÁÒPEg¢ÈòZc!¾éÑj,9»f |\Æ^W$`ÿƒÂ× ”J9þñn"=‚Üaj`©œ(c$ÞC¡:»ôtCrÙYkzж‰k*mMO7N«ë)™^ÞEÉòD»SÊt˜¢0=›AëÙIXåÉ|Êü>Xö¨nŒ ïA‡qU‚…(Þ&ÿ]7 [#ª‡Œ¨öÍ=µÎùí¢¢]ÍRp–ûû9ÆTÆçß ê¦«s Èd"´£Yòç¹ìÓvgìˆB´x{O½wÅðšŠá±R•èç"äò3&SÑtº:ím-0¼­ZPkŠÑï.RõxÕïU¿³ô5‘¡„}–ªß§ßSy©h”AD¨œ¢‚í•B4e­©Þg®ôûÑ9z¹Ò+ó݆öe™—GÞO‚ûõûÓ;„füjó[:÷Rùiö ¹))³=ìbÓU"Ï#æl3T¶Oà˜ÅüÅ\¢éa±ÇâLEƒ+I6pš“Sgu É 1;MG¹AFµ}˜>3fÔ=5”Tu 3Ç,ÙtêÔFB²ÊgsL¢†cbÒü„‡ c& Øóªi7ÑÒ쬈ši[ßÂ&1žIª³„6 Ó öH4…‘šË^ðdç[£ž±=_Ð} u#YxpªÙ‘ïn*3¬›²\‰™˜˜D©©ç„WØ–”Ç¿g}Q³;8ßé[S `SwÏY/Yaí£á…ó[È´D#m±h„~ÎvÙ©û‚É&w«à•ìBv„àIá½XÜDÕ¿=zÃÐj ¡w](&£;Û™q³šÃŽ¡°Ý›*XLXðÀ%10“@üpÎ|þhÆ$wãnj3j6ýåäÂÐ`Æö%· °)ÿƵ ÑÒøÍ¨-ÀÕ@^©5êúÄXÁž㫾;O1¾Òß™ª5ÍBׯD3ȉêÝ(4sþ§Øgtuú_F’P.±…èà[-$þ»1¶tI] [|·ê9mY‰Š?«‚YÀ•`ó|i å·+ðs²™IÁ´„×cGcê’ÁxÊ„ñlðà}Ĥn*LcB­r×U²d= éï9„Ïå,7œ}*ÄOÀ ©Äñ¾“'Ju©¤B7úRWåâª*\!‚3ôqwœï_p §ÚñÞÂ}³.¶æ={Ú­GÇ—ÓDú«ùàËvÂó4;“ÚLœã—2žd¶È.뺽&Ï8´Êb*ÜË«$¯°ÖôkÁ*o¡.›¯›šë½Z~WùpQ@F#—d’Ÿ­]P.ôÅõx¨·Í>í0læÔ$ÕÊÁxSQYK³×ú¸Jt×tÛE:Fy ‰ IÁ\ÄŠL†{Œñ¸„Ý]=·)µ;ï É;Ø~ »Ì—âcלx¶È½K¬U\‹n’áCÔ´Žw€A.5VíF²»n$ÓÂK~bT©w@oñ^D^°ž  ¢Ã4£¯*cÉc}7%ôPeŠ ±3-ƒøé‰m»3UÌøP8hŠóÇ™F ‰2åßm§‰ø™™£éVÉ)3(ØþJ³ƒm§SNÖ?Å÷g ªtdÁ{_C¥/%#Ò•µ éÀ{Ïi0æŸK­PÜþ 87ÿü´œˆŠEå”üíY¡©*z•[4&2[³U#kÊõsG’WÒzgñÝÁØ1ÁH|Ì…ÛÅÂó÷L¬¾à]] Èc‹S†Ê˜<3ÓI ÓÝ” +ÝG¢Ø—X)®ÚbÌš"Ý0cº…f¯=“Ÿ Ÿ,TW"$H¹º0ƒíÖ‰3ÇŽüÉ JÐ|€9œ/OÐ]ìîñ©L¸T²)«³ qÑÖø"¨:hÉ4ŠÍu[íÖ|²¼=\ÇÆÛ…Õ\,† ’+Ñ]q8»W®¿âpv·hYÇŸKXyÑ_7Ë=¾¢é§Á?ˆr¿^tô„ÝÌ¥0cãsÖqèÆ®Ý,5Rù¶Êˆa ¤òÚU:Rá%1ÉtJ„Ú%ëÎ7æÊép¤ØN‡½PÜ¢/¯nÃŒÝæDeöº*ïÓ&H¢ ̆wT%Ó+r§-•JâÅd$&ƒ(@HE™±³.RÍYšIסŽDˆÚzßùêŒ+Xi1Ȭªq'œ/Ó–Ò5'ªÀ1 EŒœ¥V­ÑÁÏ á/X`k ?Ý W食?Kæh lÃ@¥§q{Y¬i¯—~ž:<0<&9 œ2 “§•ò—¯ÔZæPÛ˜…qAuÖÓÅSÊ áª˜Øùƒð”È@½{2s(÷]Âk½’à Ïã,ÏNѸ꺶ÐÕÃ}sðÁ¥„¥Y-,³¦á‚2\´W ”áÞAø9¸  ?‡8a¯‰^HÌ´(¡“ê^7Ÿˆ7…;*œNC­:FÉaÐ^ û†§†áÓÆÜˆOA-»cƒ´³Ã:×2ÒŽ˜½&H.f¯ ê‚$ŒÖƒR™²' í*P¯èFï¦Qæ ÆÀÛN×G†”(ø9LŠ-ƒ&ãÕõšt-™*¯“Éë’íIŠFuýêDXûÑ¢rexÆØ{ô¡®Œf8c*ïÁsíªS¯ìÖžl!‚&È4(;qùcK寤ò“ªÞÏ´ê݋޵í=r£`‹´ho¦dŠ-Ø´¯n ™¦k™)ã88 »`t#†‘ŠB„àÝ!ø”Ê6Òõ†TíˆãÖŽ¿ŸwñVVgVWZ´½RÑ×¢£eºûF5!j"°t(ÚÊz?Ѳ]ÒŽ²Þ=XÍŠn¿²Û%Î?¸g¸KFg·q„³ÇÈØª³qö¹oùõTµqªSmœRlœTRŒ¢7æL«ÅT¾Å4NwH|‹O˜AûžalÇÔųñÙ3=0àwjOÙW”-&L‰Du'–ø‚ìÄÔËèwF³>?õ|õ!¸±è(=¦øDò­tíÚ6×^g–©ùÍŽGM}Ù1ŒY»FoHkÚþ%1¹6¤Õ”W¤2…Ži}MÝ ¿ѵ:dΦn§pÜŸ 3„S ³Å]ŽM1ɺޓF(¨]·W•ML•2ÿ£÷³ucw›rŽ×±9®Üǵ€™xÕXÛC«ÂâcÑø¡ªœb…ÜÕÜ%•ñڛ̠·¹åÖ 7¢ï=Õ>•¹`”ow]˜«B3¢æ›Æ…W0EGž—lÔ0ñf8¨°)ØšQF½†+Rì¸=s–ªåy)FKáÙÌ¢v<¼“ÁÈÞŠ?WÎ.Î,‘·BIÛx‡Pû´ ’¹±Û­F  ÉUü³Dt~x<8µËMy}1”kV¦òñ06²ÆH@afßšŸs²×ÔnVx©!#JTèú’¥Œ¯Ãþ féì¾L zAa# c ‘=@!ðºàbÅ‹¤ÝÁç°õÓçkúAÃéÃmÀ매Œ¹LÔÀùŽà%Ó^óF»ÎêG…žLs‹T6æÔ¦Ú®@޶¹G’é&€-ICÕ´蘉R0þ‰Yï‚3H¸–Ô´ù`!"Ù¶—ùÒ¯èÖ^£ Cßy[§‚ƒåÕÀO± Oó+àJ2ƒòUgmGÛ…%18㪦ê */­Y–&§ŠÙ­f E”ý° Æd=ÿ& œÆ°¾[Ö# -ÄÁ·_6«†ë¨Ån—í³a¦@‚ãÉL·Í‘ º—ñUûÁ4ãëÕb¾ +óöw­o± wûDÜ gBß±—s0öñ’äøên\[‹®Ì­ÜŸŒ÷ɾ=Õ/©¼ñÚ¡š2”5’çîÊšdœ6Æý ðJ±‚ Àà5êmˆ‘ò'ùºžhèoª¨šÆ’pNØ LªÙx$€2qÈ>æ+-Ì•\—$„qðs4R5°|OQ}ÓŒõôU°ÀRBØïS¢.-x"Ž+K•µUÖŠd€ÉíÃöýSeq*“A5ƒ†J=Ù~êÎr"Å/µÄ4Yçk"Ðb"(ªñD]HÂ}!ôñ>Øøl…ôÍΡ®C¯N¥Õh¼ü®Ð+}Í‚æ ^>ÙÄ»& ƒÁô­Ï¼¸ŸÌ1”N@[œå*&IŒé¯TÄ §£‚tA˜†‚µÕ¾Õ‡ž2KžzfgÎ8ßÿ|ë§Ò¤ñÍ'}ø‰-gŒÑ5ÓÉU®yßë›s^àóúÚyk&óúßOƒ‰HVˆñ·l׸©^ÈaÆl]Ì,ø»ÇÆÕ“µ8z#§lÁtŠUP÷DævâhôÞQʨNeWìi#uâ[D‚rµ#s͵­§½˜Êa§ù ÷„e3•ð®)íR²S²=HîÔòº×;øº—þøwOTK!¤Œâ®Êð9^¡¦y2Ó`÷saz€îÄf¼6µÔÔuë^ºDS=ä‰åÂ{Cªè0ÅâI®^Á³ðs`Z2¾›0™ò³ƒ|†w'ÿX,k0`~Ö­ßT˜ŽÏïÜ·Vuv1–ªB">|Kô·ÇoZôLx…ÑäS|Ú-Ô9Ì)0ϤÞkbò0Õ‚(ïÀ/ð)1c‰:Ì ˜ˆ+…X íp‡µ@]ɮۄÙ-Ä45›*Ç³×øMªbd¯ò.Bö*O²LÕ-#V‚%…`©M;Ú`ã¸~.ñJÕ©VÚwêO] âöíË‹êVí«6SépÒÌ‚i®„¿£‘ Îľ)XŸÙY•š´$T [—·ç± Ì5-¶Q½3£'Í+˜ÔÜ&Å @;ëU@@˜êÚº½%²bòÓ€(}D,w›L6š§àŒ8* `{:sÍÁ:N–Š|“˜GÆw{*å(C›iCœŸ·ògðdn³Ú¸Ö#”T€5†¥N2Àkà´µæÀjÌö§Æúk¾¡ X0É• ™¦:ïÅpªêhKll¹6ÜØ )› ¡¹FªI¬šËÑOÛΗ{mì‡^¡H÷òÈ‚«€©¦ D½U KØ…Ër0̘y¶{°L?ªýÓ Ž8u\“2ß( HJ‹Ü(wš<¾® TS((åZ畲C¡Rcªëñ qLt°iýƒ /Lª~ꪎ#ÕÈëZ<ÈWg+Å:F4¬:W›é_±Ö§@ë4˜þÅî]@/âd%ïýpM%QΖH5O¥à\µ›U²¦ãº“K©Úá;x»B¦±UŸo‹„=¤Ïw |ÞÙÉÈÕ·l õ-»ÞygUSŠLÈ"®i.ùi6vªá1âì«{Ôä_éÍå.·bGPšàùñ³’0íõÒâ'[0ÜÕ<%bÐ! ³»Æè-ªéÃ'ÙÁÃØX”Jûç+ˆØûsj”³Û4œl ¯±KÓE…t˜£Éôö[ï\Á¯©_çF¼DWœƒñ^ ›¤¡& áp¡y(…äSd”è¦&lÊ.;W¦²Ÿ’5±g—–“õ¹'’{j­ŠÞ ¹ì:_ «uÆÕQsZp’b* ¤Ëʺ) š\5bÎ óS5.ÀB‘(c:$ ­‡TÈáÃÆþLë3Pá˜6lÌtûÆÚíJ1ÑTa^ŸJ}¨ê ÍÈ‘)AÉëæ“h¤A)'¿`‡…Å=S²{¦í×ç¹Ã·­ˆ µÆ-Ó­³XZ¤6Vö]N„ÕÌ H^m71º@ fnjÀ 3-¤3Pþ¦û|IµOvü¼O—³¼€^¯ÃÓ·×f/°¦š=‚uÖNL+2aÑõhtK`´œŠYè:ÃÇè³R2’ŒÐ“ #©eÆÎS3»˜qG4v:ȨCe·¨äš”ÄØ®.ô’¬¢“ðx”`# +y¤bMÍ.&5;fjq7yJ’ Vd $°Äþ^Íè;Ÿ°€èÝ òHÕÎ~n&ÄZßTÔH×1uT&F°Lc@+Æ’ €ƒˆ¸¢Ð6Œñ›³[×´`ßàqzØžœ?S€­–½¨v)!Ñ1{7‘TiaŒ‰š_Üå[ØëÑÓ¤À1HCß•¤ PL4N²¶Ž[{¥:^¼ŽCc®]]O/ÞÔñââÔñâu¼¸|ru¼¸Ô¸¨Ž—è Ž/ÆZèÍÖuÛiØîÄTNÈ Lc”µŒéåÕÕóŸÓó‰çùuí6`{ã­Ã¶g/ê¼ñçžZw]·ŽÝeÝà /êb´í¥óÄ‚;û啹3Cû8ûœ¯NÈ Ò|Bϱkù·Ööe~Säöb¸Úù&N¶ë—/8F€0@wã5 ¾üÎŒ‚™ W5\†%¸§¿ŸWüVIÝ¡ð®BÀw3ŸÃ‰Ã^OâòùRåa|#Œ?#6À”…©3C ã7…+˜¯WL…ó*˜ûÎRw# A)ú:»ªZ¾ž¾>ü?<Ž endstream endobj 3169 0 obj 9059 endobj 3173 0 obj [140 /XYZ 31.5000000 618.500000 0] endobj 3174 0 obj [140 /XYZ 32.2500000 617 0] endobj 3172 0 obj << /Type /Page /Parent 2 0 R /Contents 3175 0 R /Resources 3177 0 R /Annots 3178 0 R /MediaBox [0 0 595 842] >> endobj 3177 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3178 0 obj [ ] endobj 3175 0 obj << /Length 3176 0 R /Filter /FlateDecode >> stream xœí]KoÜȾëWÌ9ÀŽÙ¾€ €-Ûr`Ø@A7›`‘]ÄÙCþ~8ÎH"ç«a¬n6iÚXK«Öô£ºÞU]õæŸÿ~øço‡7ŸÿsøÚ}üüPë²8ÿ9œþþðò¶9ößê¦<|ýåáÛáÛç‡OÝ¿ßÎøüøçî»ÿìáOÝ?þú·î‡?ö¿tú…_jSw_ÿýôµ­M÷]qýzúù¿þò»Ã¯§/Ëõ›yýÿ?W¶¾8mãÎÒß.Ç4OûúëÛ3ÂV±µišâ`¼óÓz{øï?~ê¸L_[oL]ùº˜³PmO+Õm7‰íþ±Özú«3½ÑŸÜÆF›ü¼su¨WyvÅ˵Ƶg•uð_gq·¦-#N~Ú¹6Pú«Å“›ªÿ¿'—nNëvÿ×ñ Ó}§ž¸Òébº Ò¿™ëì1®½´M¼ÉŸv® ” NÁÉwÆuGó§[>ÝpÙ4¶û¾výŸ™ k.â¡hcÜHQ<ÔMÄë~Ú¹:T.÷g×$åÆ÷ЯŠ&ˆ®ÓG€¿ó¾Žw¹O;W‡Êårñ슗ë|ÛKgwCƒT€Oø»¸˜sÚ¹:TúËÏþ)d¼•óO€ññMøà»/o>vzAÌêðå§nsç5Ÿ¾|é€R~8Y­?|ùñðû¢0þ‡/??´ÇÊ–—-Æ)Zø™wá³9‡FJ8b 8bàˆ…#xÇðÙŠ~æ#ñïá³< Ü[Œ:í‚ëÀ½ð¤ ¯ƒïÇÂÛè Àë@Xãó¸štŠoãƒ:|o~8‚ó•N1¬ìųaX7‡1Q€5Þ5¼m ïT SüN1¾lJ8¼¼ƒ½G)<ÀX…×!Fr¾Ÿ_:å*¶^Ô—X/¢F—â˜Ò-Æ$̽1ß`èsBÃ`€ù¦t¼7ÈosÖæ<¾m¬çáu FJà†ã¼ÓcÚœ`[A@ ,L?wú!ô¯ë_X Æz†5†ÖA1°Æ'e°Šá½ Í šÁ{XÛ0î@™ï`­ëy˜»ž†W ¸£ªbþ&h€mBmÎÙÄš™{Ÿðt¥I|:Ì—-Ä+a6¬‰0þ„DôÈØ]Éìü”´U¯†NšV}Õ,é‹Ó’¶Ó‹/K^Ð¥®Ê'( ÅkslÚâõH.·FάØ½;gP=ƒÚÁÏœ{yt¶1¯GÎ$㎥¯šúåHo>wùÐóÞ\Çgk¦£€Ó7ÃI(úŒmàg ª©›âìþ7iX¤Ò {n‘—œ¢Š¯qB@lHÊcº“Øóˆ1—Yæñª:œ>ñ.Vx\p×ò=ÅJY QžmÄmÑ/Â:8ˆù0†?Æ L0n¸%<=Fdx ‚˜$PO 2æèð¤J_oá®ñÞF Æô8AÈbÒõšª>Å&ã"¯@È\{WMÐe›·ÓoÞ†p· ¥aøÐ c&¼AUŽøÂ$/ð‰‡ç2ïïhµ·ä‡®ÅÂ#º×“Xq¬jóZM8ó9S‹Ö½¾ã3!{šB|‘‡ˆ…D²R•0²Ÿ1f }‹Yq™>¶a}LO#–Âpt|. j&–#À£·ÏË/Ó"áT‰oð•ÆEÕtǾŽR†åa°xè²V@‰QäT#2”ÄäAØ šÔ ää¤x¼F¨x¤VëjoQÂÒÌðlŒþÈHi Ñ¡¬ì&‰öÄ ”¹f()û4°“~º×Y7%€ŠNIœë¤£ë«J>!1‹Xg¬k%b_Â1ˆ0‹àýRuüQé²nÓ=BdC×u¦‘Ï"8hìb HÝ 5ïÝïä2¦ÉFº ‘¹ƒdA!kŠjT&˜¦â%]>ïNЃ0SÀÂ<®S™±±b[Eq]ˆºa^*˜KÈcŠ›gì'¦Ì&‘$®á¤›ìM=ZZ\˜§Jx¿›óÓߨ§[¾Ð‡z)¶5š~©0“¥²Õ0€nJ³°UOÙ›ÓŸ}* YÔÍ?c(`±7²1²}"¿žíða `.!“èhÝïìF3”«Œ¤À̃‰£h$õDKöx¡V¼ðCJ½(‚µÍNÙ3eŽˆr'B±¢p>)Sò‹)£›ì¤«ˆ€L*Ý󥉓 ¥ž¿9\ÜŸ3v˜êqy ¢UŒU­XÏ_½µõk¶uÃ=¥ÀC\QÒ¿Zy>]6¢$¦ÊçýðNãÖQ16°î¹Ò4Ý­å·¸y÷„×d ¯ñËÊx3ä&»Ÿ ÉcÞøÇ,¬š±Iù~0 5ÜQy‡Âb™W±*é¥DðHðA0ÜtËä0IJÓqV¹\šnβnk¦.a˜µjœ‚\[c–’V¸Š©•ꥭ.=:°—ª«´x]/JÇU}Ñ i!äh2E&w'Õ[v¦n“&ÏDWt K-•û0âŽÔ Ž&Y*7=r ÝúŒÍG%«3ÑöïZ÷)­HI†MGȸx °œÍÿdUkuslâïøW™ÜkÕ×#B•-&g)ƒ‡ÏÃxŠ·‘O%êÙέ÷Y„Ï€JyÑ•éKUN¢¤0fHvhÈ#/ÆJðLÇ7CÑ7s‘â“ÓQAgv lû—¯O¼¸ß$M†¤5vè<Áù.0»IȧÀí—ð:x6Ü`ìa>Îr~p sž·Ñ™“ë[D<_ð 52¯¹n3•Œ\>m€(K$˜íLr@p¦˜([Ù!*¬ª)‡†C”©¼ù²Ÿ9*¯«„ìÖò”(o`³cIŸÐRY«ô¿ßµ8" ¼ÊùÀ£l´ÎŨB')u)»˜ÒF®t,ó±Gޏ„ b'qó•B<)»$¤š+&KübΓÖA3Os]}ÍXc 3^TÏa¢ù nÍø®»Fî–# )Æ0l¢ŒT*¦JHÎÉ6ªÉCgÓMEÒµ)c¸·âû]aïƒ)’À|†R t¥RqðÞtKå;FsÒxʲfÞ<JVtm}=™¦R?jHU¬›z>Äô$ø‹Š¡–;ݬ¿­¾Q£¼.ùö (ÿZ*˜h¤Tuì½/>ÃÌÖÂÙ΀2þ8r‹¼C³Y‹>SàœQÏ„,A똖8)\§×5n­óž®s W?ãàÍa¸™K¨5 ÚxÒž[Ý‚(„›-Ré4myîbþ½9»X^æ£Ö©<½Óm¤êVÑé3«ª~/;L•?<=[_³ lúøUÃyk¹¹µžŠ)ÃÚv(ĆÛ€Ð<’1t߉À®À}ᢳ1õJ²~'ŒiK#BÃø1³Îç^eH>^Ý–*óÎ4bA«v<ü͹ ˪0Î{IÕuôJ<Â8Z—Hw,l9¬+J/Îl×%›1 &vÀx¸…]/ÖfoqAJ5ãCTñ}XÞø»t²NcŽys¤ÛÉ]7F¡Ò0õ5fxÌQ›qꥪ“ ¯QJ\Y'³PiŸ±üË£¤$"wŽy«"ÔÃ"’ºt<©ý/™ìG&9A¥5W"skWØc>hFŠÙ6LTî^†ádõ'‹šjÔÙØ (ùöuËïFî³Å8NC8·j’dÈ %F1YS>Ä »-ê‹g"i«<6Gzä6 »AùjР$z_%¡Ÿ1’AŸ(Üe&Aÿ™ 7ÜT½á•ö+Ê_Ê¢Ü(¾X\Ù÷`Ãýº`Í#¦W•Ð éÁ–Š÷ÁŠPôÞ*««@íó’o8U•üÈe„CŠÕ^)\‰RÕƒÛªn«¤¥Œ@&[µµåÚ† *U!›xv-x'¹ŒúwÅÈy‰šÅ[ äÏòP¨rªU3ð:)ÍÝÊ\ (e{="¬—%T«˜Æ¿F­ËåX¹ËSÖd :4§°:)˜û…åëtÐ8µì¬ ”Qšl(Ëõp¶šò¦Œœ[Ié¬N yå8”ÖBOjÜ›h÷Ƹˆ’q‡Œé,g‡àòn¿””^ͽÃßðÇ„§»öÂÔÅl¯ˆÀÄ>²V>¶bº÷U6”ÁhÒàåò#SÆ®I÷tV•‰ély}™Ñ}3 ¦UÒÙ®II$êwc¯K2YÆD42U‚pªN§Ûa¡M[瓬•¾ý\ T£ @ôËCi•Õù©â¹I—‰ª/Ëf 7“uÂèЯ‡(<³1öÝTöØß˜-ùÆ,Q¶ÓfC‡’7/DŠ›a5€)†€_Æ-ø”Ù¥ˆ<ÝV2LÏ{6‘­,S±ûTÕº˜{ˆ‹_<âG¬5 ö÷|ó½Mí^oð–£ Ž1ì´…Î:ÁÁ‡CYØ5Kì@8Þtðá]Ιv¦ëô»Nƒ}í5ecE"LÂ;PÀu,N±ÁØG8Å À˜D9ÅU÷†éÌã@,>PqDè(ç]Ž¿'/Üãv­1sn+ÑMeŽ1)ååÖÍ¢“TÇË@¸¬cÁqL')oË·sn kP÷FÒœ®jæœ.u s³–4x×ßÃà½1”Š©§VÚj*íŽÑ °NÊèVI¹HSÏ¡³Œy±.m&ÓÛRé9`ŸëÌÖÔØï^À>¼öjiõ‚5¼5Ž1ßÈ„2ìµY•Z'Õ «Vׇܻ§Iâž»§i÷4©¬ÓÓ´?èygcç`EÆP\ÞÎN)yM± ÿcÎTÊÛ²hk­^0gÜ,ßî¼`ž‚ÉäÖîëŠAMå,ŸrÆw÷uåïë2urOëîëÚ}]²¦–e´/pJ_—u×¶C»¯«pGv_×îëRY§¯k_ä‘%æléf`_Î÷¸EŸš­çøF“uÌXÜÇ"Há”·ÕîЙzuÂÛrfþfîí1êÜšÔÀÂëByu¼†î1'Ü= 1¨Éç“U‹eÝJ©ik~«åé Þ\ötVíYµ“ôê­E÷T D”Ñì¿SpysÒ$cž–eøB?ãW.lé|}1®.Ò2½.øÀ bjêá2)ジVS.×­Ua!vPƒªˆ«iGÛJÍ#¦­d@ É•ÏÄØœ°r‹+Ý÷W;cØùDlÓ`yÉcOD—Ç>ÆFe¬W&ã,|©ïïG9N–ǰÝ$T Úš­µ8'UöçNMÍœU2 \¥ïäûÑÚöŠgÜÞ0ÊïSsbnÌHÊ,ÚÊΉtlM“Øß‰ÐÙõ…3Íø91]_Øõ…;úÂ^·bÍúÂsSÁ-ê _ÉNëbN†ùîS#³µˆ(mR½¶³êdŒc”OmÏ-Í@Æ·]Â> endobj 3179 0 obj << /Type /Page /Parent 2 0 R /Contents 3181 0 R /Resources 3183 0 R /Annots 3184 0 R /MediaBox [0 0 595 842] >> endobj 3183 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 3184 0 obj [ 3180 0 R ] endobj 3181 0 obj << /Length 3182 0 R /Filter /FlateDecode >> stream xœí]Ë®ÇÝó+¸`jzºç$])@ ÈÂÈ"°ã†mDñ"¿>†Ôå O‘sXÓS—·,Ø’o‰3ý¨sêÑUÍ7þüõ¿~_¿yÿù?ëúßß^›¦*ÿ¬w¿¾{þƒ²Ýô^7mµþá×Õ×õ×Õ§Õ§í¿®øüþ¯Û?ýo]®ÿ²ý÷çõ÷ßþðÇþ/íþ¯«&4ÛßÙÿÞ5aû§âôûîçÿ^ýíëßvO<¾®ÌùÿbÝ…°Æ•W]§ö¿~ÿá·Õ›ÃL{KÙĶ,×!Å´]*×ÿýçê§í Ž/6] ¡©SSÜó¢¦Ü½)uÝ:”]±Ž^´ÿ¥óø0ÃÃÛTÌ÷ðýÈÕWeû§ >=ì¶· UÝÖåV7mÿ{×lRŽû°}¹þj={¾þë² ³=ü0rýeé7Zz¼"Œ«ãa‰Ú²šaNŸaê²jæÓýÈÕW¥ßÝñÓ?My Šhj¾ |÷eõæãVãêõ—Ÿv\²áþ·/¿®¶tùÝŽ6·+óåÇõ‹"6ZùyÕmšºÚnÃ~|IÙí%í¦íŠsIQBÉû½$mRÁ‡ÃCBªl8ò]Ðß¾ëñ ­#ö‰˜ñå-?*XXlo(FÄÚ µLà£\‰cžXÒ vÝ0J£4ª`’´BPC º*'̇1„Å£¨•ñµó‚Ç6!¾f¶E7¾î§Qlê&œùSÅÙBµ)ºx¾\oáÓžV(7CO+Õýâ³:ºÆ^Ю4{¨Ð[®Y¤qŠ‚ñp0I1K8Ê; n¼NÐù=8‚Q+ty—0q6Xw^'hŠˆ»z¨<¢K p€>à&x %vû‹k¹KH?ÀD}@½NÐàþì×S=½„Wá,ÄI®V.Í•× ¾ ²òxÔ‹ë¿KD0‘l¯|ËpÊÇ6úšÎë-qUÀÜHâw÷àýmð:AK {Îçgƒ$˜lÔ ·Ñë-q¾ÉK¨êÁ«ƒ9ï‚׿;Ä9A7 ´ÕuÿÔÙ!#;è~÷ã£8;`Á«Èɵ×>0;•­ÎØÁF'rÛzÕá³Ô1l›œ,°Î;äd‡®ðzÄÇeꛂ,°ƒ‰ÎÅ®ôJÅÇeåïuÞÈÇ&²’]òFKì`àÛ  °ƒN§®öêFKì`ú7òù&jžºÖë-±C¶{’éØÁö ÊÛ7{E¤%v0}{ª3J6v0Q+Y¥×Jšb¬ÿP“*¼?ºw°9;äc ÕÕ^ΖØaùJj]ïeql./¡nW°pfQ•×JZb!ø|µóF6v0Ñ]×JZbç€Ç“è²CVß¡óZIKìÍwÐíÀpFÑŽ,LœY„൒–ØÁ9àñ$ºìÓwÑk%-±C6ßA·?ËyC™lœh†Êk%-±ƒsÀãItÙ!«ïÐx­¤%vÈå;(wo:oh³ƒ‰z‡Ðy­¤%vpx<‰.;äôÊ൒–ØÁt¦³C¾¬¤…ͪŒ§Ù9;`‡ڣ鼡í;˜8Ñ,“×JZb=šŽô|ì`¼G³¬½VÒ;dÛËÝ^&¹šad$ ìÐjHÅžbÏ·ªÚIJ »ñ|ÛÞãW5uUŸIʃJ´›¶+Î%E %‡¶½å¯”6)6Õ%¿ô™hÂ{âÍCê`ÚŒ… kqXи©RÝ6· )¼»}Æøñ£ÄcÄóbö ¿‡Øž>*»ð´¢‚SÇ[ʨœ5‚÷<‹Xvþ(` Z@'¨€&¥€&¥€_¼HàíüD[™6ÂífÄT«XL*î.sÇœÑ 7‚A>ö¾’`Ó*,7|ZŸ¥ˆ›â§Èhháðú¨z «3l‹•©ë$¤ SÇJE¨ƒÇP~ ÃI¨¡váQ Ê„÷‡Y<Ӄʄx\ì¡5š¤´Â|B‚>#÷R`G EΖŽÁŠŒ%„‚ ï!À,Œ(˜ È·ÛÄò£‚‘Äž¢ Õt5ÀÌ ¼gh©XŒÙIƒÐ#¦Ž×\ðXG‘ñ{jWÍu‘.$šSUf´j]× ¬c¨1_S@¸1v¨‚!ÔOä(}ÂÅ‹òööõƒŽ<ör²E»Œ7K„9Tj o˜=sc…Ê3ä©N½Kp)ä‚#@‡3–L6`¨¾rGPî8æ™QC:hÇŽ9=ª;©µ¥ÄòõèBù0SS½1‘YPÞlæÀù)“iMáx2ß÷^]Šþçåýå“¿Ìá`Ÿo?&°|’EaYÅB¹MÁœâˆ˜HßSn6^Lâµ´º—+Lu7—/W0\9©‰ä­XÕWú}3cãÓa"à ørôb¬üx«°‚1u8ç‡ÕgÀއéu£žù”-O!Ì X•™ y<üü<¨rg‚ªNš9ËåÿÞž žÒÖ€M2ž¸§ãËcMvv!šºî4eâ—åGàȰ° Ë '6ëÐÞM­tõgU2ùèø=ÌiPx¶¼¢‹{â¾ …¼ºÖy˜+6Ê\¯È¦;G»î°ºãÖÈõíUÅFìnU_éËÔååwxù8s9s½J½ÎÃMuu¤‚„©†Â®ÅÀ#ÈT“­î%çÞw鎽¸Š’©…«øh,ŸkÝ®2Ok¾]1ò.ã[ã=õG%þBYØ— <ÑÌCDŸ‘ÀwŒf_¹|å$ÞS*ãƒßCt”0u»Ü,Ñí^Ã_”¬ìA¹¾eÓ7J™®?‚G™î*ü…±Ëhªc c|fy·¿Ö_·ßþéÚ_¸¡Ý¼½ø}r!nа»Äa]¦sÔ\êÌ?¬Vs¡™÷€ÁrS®Í±@=–ô«PnúK$ží×a—ÚËŸÐ{âµÛ .íc?StŸ/¾í0}Rú©&؃Õî¾¾0€Ÿ?Ó·u„ISo¾©-«p»?oG|Nê—:ÊñªB`ž†•#wâðóç’0T|#ܬx;…÷´ƒ!áy Úu/0à‚zÔ7¦V©¯ »À½•œ¤ÀÂÊ^»§éÒ{ðrÕ÷¥)â¦'ÙƒIóY2áª%ù´þ´ú?:(ˆþ endstream endobj 3182 0 obj 4756 endobj 3186 0 obj [142 /XYZ 38.2500000 250.250000 0] endobj 3187 0 obj [142 /XYZ 38.2500000 250.250000 0] endobj 3188 0 obj << /Type /Annot /Subtype /Link /Rect [280.500000 353.750000 301.500000 360.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings >> endobj 3189 0 obj << /Type /Annot /Subtype /Link /Rect [150.750000 257.750000 181.500000 264.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 3185 0 obj << /Type /Page /Parent 2 0 R /Contents 3190 0 R /Resources 3192 0 R /Annots 3193 0 R /MediaBox [0 0 595 842] >> endobj 3192 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3193 0 obj [ 3188 0 R 3189 0 R ] endobj 3190 0 obj << /Length 3191 0 R /Filter /FlateDecode >> stream xœí][¯ã¸‘~÷¯ðóãI]`9} ‡n ‹}Xt6;2ÁöæaÿþJ6åc]¾²ô¹HI¶ÒÈœsL‹¤Šu¯bÕ/üúŸÇÿþ×ñ—_ÿçøÝÿüðõœŠ,¹üïØüûùö[žüïǢ̎ß?ü8þ8|9|©ÿûãpyàë‡?׿ýßÑÿTÿÿïÇÿúÿú/5_øýP˜¢þùóϪ0õoÉõgóùo‡¿ütüg3c»œßL÷ïŸ+ÊÒ6Û¸³ôCûšæüï_ßÿyøå€y«Ø"+òôhRWÿ§Jíñÿëð·zvúäT¥ÆÔ_)’G*l³RêÜÑØ*9–6,tþ§3½ÑŸ<·YlòËÎÕ¡b\näÙ·žÄ\dmþ×éCn^•á&?ï\*þp…Ù5·aŽgU÷}öà/‹*Üäçk¥=Z8ù©Ìm‘fIµè÷‡ÞªržÖŠ<Ì®³8"Iòp§}Þ¹6PÚÓ†“+Òqa¯”fÒз ¹p™ôeçêPñg+̘”‹4¯Bøûô&Ïê?‚M~Þy°dz‡>ð¼QäÏ@³U°½O`òZË7ùyçêPi|0û—9³à­\>vàáÁ·o‡_>›ÔÔÀÌßþVoî²æùÇ·(ÙñçÆø«Šã·¿ÿ$îó¿¿ýýPjS§Ýâe$±hÄþ ŸqhÄäp¶ Îf4gs Á»†Ï¼77ƒ×ù€FÒŽÀ“Kñ®1tà™fª³¥ ¼Ág l ŸÉà:øü¦—óùô­&ýÐT[6£—ý@¬F Ìð3Ÿæó Ÿv]Ìß›…#ò ÌküûÄ9{—=pöÅ´©!Á#˜÷­/ñÞ2È­\^õ)¬˜ÎîžO ÌÒöíÞ"®Z¸GèËG(…ټºÖR°~éணñ ¨¥`gy=ãA×8^Ãk^gððžÁDAËgøòŽU;V‰¥!`ìÝñ-¾Q˜HèBŒDOÂÍUõ¢Ê¶«FÔ+w}×Ýo¶ûÍD~¹¼ßŒÙ[Š%Ô–Ç`¯ ¯ò9¦W¥ÕnÅMà˜wâ¦dÿ®­@3bünxdÇ^ {…]ÃXìãÄ>ñ—ÁQÌG‹9ùnYĵ,ª¼ŒoYäMÛnYì–Å6, | :Ø~Àçcñ›b^±IkÄÂøÛ*,˜¼›¶`^GÓÛ픈vÊ®MÝãé5jS›*¯Þáŵ©ÊWA‚ೃ#/¤¹7øMiMìZÈbÁ?y³AnîZõ ´já}pÖ¡; ::Æ*ìýg²:‰87“S&ä®|GðøÞ:‘¨1Ím×ê1‰yÀêq– z0+ _ao„†AY¼Œ—t:­±hk"Œ¥CÀŠÑkpN±î9.¯oV2‘i…©I€5öÀ7ÅÜ—¡ÍÚ鄾!äñGâƒÔ}Æk†©ž°?0?¬@ÂFÁãŽî)žæ¨ÒÈm;·dyY€gä!Ö1¯QõAà½ížÌ t–-6ÕžBAËs‘݃µYÁ“¨x"„öm9UÊbìȵûh¬Ùvdz›V˜ Iàut=>«Ð¾­ÓoV`É4¹,Y¶ ¿OHO©»7í«Yc#Ј”Æœ-M Ô÷g.¤àNYš—ÍS}&TžÊ*9ŸCŸ Œ0{ÃÏxñ1¶ƒ ù”}lÛ ñŒ×_Æž€¤€‚_³¹>¸àôIAœ-$Æ;¯†=SBŒÄ†÷†…€Aêæ£ŒÁȤJG½bè”}”ÑÀ./ ÆvB#~/S¦¿—À4ñôM4k™D$὆8ØlHAT $¦ø²Xv'ƒ9ÄR¯ÀN‘êB`Rp$·gª,œC~˜ Ø ~ã‹~fL;Ëû[ý×ù‡&Œ0P*–o¨ûÀaİ0æM˜\ß&ŸÃÛ¢¢Þ=ÃÁg,Œa¡ª÷ÜÝl@yPV®/·µÆ°´Ï(v6˜d`J`Ž%–w‹©Mï „³®\ÒØ ¢cŒ]Ö„g›«Lª64%¡¦Ã:RF+¾°‹¾|¥TNlGâÙb¹´œm½hiëm.òl²ŠùŽªn> †} V;!vÆ`+a²RþF±Šd°`úÚ ÞNÖFŽÀ½¦{qõ“9l Ù…M\¯ÍàÊ+v úغINya:v«™ì”T®»7¸ÈcÛ¡)H…A¹üÕ}1˱럺!æéG4ƒ7à3LT WaÆÎy†ê+µ§2IX1«*Ò\šQjîdÎzª•hž­nœÀ¨~.FgÜ¿ !‹ Š<í Š]'Z¥NØß+9N%È+[®Ï!˜k7º5ø¼õ¥$y–¤ÝS+ìN·ÇMÖÜ0Yh €ËÞ­¥„–7DÓ)¡É.¼Ï4#$Zb<Ðâ>eX×Âwñf:ÑÚ‚gÂ4Da0 ·¤Ãm¢„‘µàòj[¥d©½»ªq)n™I´=¡Zë¨6ÆT>{¸ŽÐ„tñ†Zkn>#´~!ð:*æ4”Þfƒ£]2HÜaçƒõ›âàœ+~Ó×áª1[meå#|Ðáv†x6¬½ãs$Z¯D6U4¦FoÚ)hSXbJÅøÂ4¸Æm™õ›lªksãæ ‚dÀ#‘§+Ök®ŠiN¹]1Æ^Œ;P#Åç³¹™›òþ™Ü“›qvêŠ%VÍÚÛºþrÁºÇœkt¥ \€ð/0ë<[rÁ2f¤5n­LœB¬xæwÌùÞnbo¸Yµ E‰×~$*Ú×/µx޲ÇZ’hš'Õ€|Ås:Cm,Á6³}Ñ7§2SÌgï/º&ý ïP2ÅðuûÊëÖUdú½ Ïh\ìx’« ÑTÕ~›R;–¯á¶ÝwŒ’©™,6©êQ‘oiEëvŽå(ƒDý9WמárÖÎ^´ÙK´r”EÞzÄ7åÔX³gÊR?=¹lÊɱ¸£\©º¥#]NÞ;åL1ÑTêªáécžéË}WK ê„r}·¥[¯:šÞl¬:ì±ÔO]f©ž§JmŸÁWO S?˜Š@ÜŠÙõm_ùÇøËý$“òš$¸'™<_’‰J…´"‰YH€g’ó‰|*Ù¦Ÿ0;ÒOVœ‚ŸB~€/¨áD{¡°êl)¾îƒñ ó¸7 7¼ká|ð3æ0bÚ¦’Θ$-"á*æ•§òšp¾Í«µÔQ¼sŽûåöh×01dDº8ƒ£8!TXkf/Á”×KzWKîx©+s¿4[´Ö’OÒt!p2l´ãd ~Qº~ùÝ=9 ½uk”3wªäª[]/t."‰;ð‡" ¿¾¨þäÄõDÓÎ+^üPÆò±»»bfÐ½Þ º×›ièjf¹-úèÊÔãïò¿’ïfæµÎoeOÍóµŽj«Ûþqø*xÎÐl¡§´.0>c’éM0~ÓÍ^åi[Æ &¢’¨à2ÇŽWh ®yìlÂNnµø}˜:3º7õ°# Ò=ƾO !šâ{™ D!î8¢þ‘p3;j°k‡'˜q;S£¢VUY@·~Ñ­H«ë.Ö!vÌ=mÁ1ˆá†Gˆúº5p˜:¯ 0U6¢ÉF¢qkªÄÑqJwÿ´"…bIdLg¥8&¸Ù‰Ê ÜCü$=§MéRxÕÐî^ j 0x¶^a_2Z#^ë“ÞöU¡¥8,jºïmc^äìƒ:,ÞØswyÇöˆsºÖÓ›BWS|Rcî®òؼT^xoWûw½Z™ó¼ùQsù´¨?ÉNÈ'í'ßyz2¦²ei®ßrYÜíõ÷ýßyóر÷tžõר?©Ÿéî¤ùVÙ™¥ì®ñÛáí§@Þ¸Ò#BqíWËîìWm&lmõDtûs!**Ù{FÁÕ:AnnhGD?ÂìÅD6^L„jäw9°±f¾ÓÙªpNÔ¡we’öÄÛ z”NG1Ï”¯ö¨à4îß+—¢!bç:¦g€iÎ;#;á~ð“‹µÔ~vÅR'ཾü¬´U\¼œzì5„Ù"T¤±i³icã¶ÊÆcy™w-ò²³È˪o-ן ,òæ[®3‹»]ãj‘—Ù˜E^¦ƒ5Ò¡EÞ|«ìÌRv׈`‘WmÅX…p±F:$gœšD «@èqFì~†#\J'Ì‚9")RÑp%lz•`ÌY\03á¸9è«âhQ¥ »Äö©/RåŠô“žl?FÁп®+VWþcìT¹òÍ„‘××nc›§Î(ºëDKØPÝõžtµ¤«ð¨ð®Ðw äS gqL}¬†Çê8œ˜B„ߌ*ÕÀ8fbU~&¥ .¯}ì}´Ò!ŒM;éõ2#鯽T…æ“~:Äù[®3‹»]£M‡0Ö¤CkkØA:Äù[eg–²»Føt3¡/ð¦.(D¢q&ê5ƒõ*™ô ¬=3¢‹%ŒÛ.…H¬|É¿Ïúš8è¦;3æPK8–ňžiõI)Úº·‘°&ñ@~õ]¤ ™ì–=áõ,ÕQO¶ŽÒ¾rž «[å“É ÛbrÀzÒô·EOæ0öÆ8‘gäô­P†E¸ª}ÉÄ8Qt}ͪ‰²Ñê™*†»”èò9ÅŠ>išþÒ‘‚¥¦*Æò"d[¤Õ]‘#ÐôŒºÐŒ—ɲ!Ü8‘¿ºàê™Îè,$¦Òî# ¢Y—õ0-òÇøÚèbUO‡E‹}|L—âÅ{±P†vg©F4DÆøÖÍ'Õð§R‰×øgØöaS\T†P®f‹ñ½Ð`n»¡ÁÜ…uÅÌ¥®X7¸×|Ëufq·k\Cƒ¹ æýúhÍ'ƒÐ`ó­²3KÙ]#Bh0o‹Øùªœ³ÄÐ3j™Ñ7@• }LŽªjjÂ_Þša¬/¥é+'ãÝ(±ۭ8[ôHwÏE¹ßÍ¥Úh•—Mì›–èæÒl¡w’‘êÒDã ‹_úŒåÊԽͤ¢ÌGFñÆœC­‰gy¬Õ£1A~¦ ›\Õ˜_[Œ»ä†Ülæ3ñ˜ì Jo¤Ù<5Œ<ÓREµMqªloÄÁÙ.ÇkÒ6wæ:âûz½izÅì¥úô€‘½™74â»Ò=S¶ hß5ãÛ Œ0³e)Á0Àïó† ŠO¡­=܆5~S÷Í–¨uîEäç.­ßnèÏ÷Çy߃º8¹Á´ôŽÀg|ö‘Ï$ðb˜š½º2F™p6‡¹~¼Þ›Öx GËOî,,†Ù¬“cÖñÍ>FfÃØËà(õ>x¶tÅ0ðx·ÚÁ¬òëïð]Ø4ïjDéŒÖá[·ÂìŒL.&©`±Š/oÐ.˜µ¤ÛË7 ® ÁóE£MÖkö`nÂø“T”G–™ðÃS×?U¯¢«´JîÄÎH^šW]q®a´–!‘!‹ï\2W‚Ῐë“Ñv^I´OX®~ä¤ÐTTåy_í%gI ÝžÓub*9÷Il1UíõIÒ_£Ùó3š#­j¨OoˆÒk'Lâ÷Ñ /É#¸Êò¬ÝLÜÈmÈÜõ¢ÿj{=ŠðUó™„u4¼Ž”?WãΑJiÔôKuYZþZ*ã8<½ªwÐ(w'“ÇKhÏ –w%0÷ gÜRd.!ýE5]°2W—¦ËDFŒu—6vÕ÷½¢ŽPuÂ8ÿ0%0õ9°™ñI‹g˜&µTn¼D/œ¹f UùÎÛì@ó3ùGÊù#Š##ñÌÕµ9㙤ÐööލåŠM8{W´«âÓ‚PL ¾" †ˆÓÄ Ë1¾¸ìé~–Cà];Œcø|ð)dóGðl^«{S¸7Kà›€½˜?Až†w-à<íCŸÜëP#ÜÛ‡wfùËæO^ ΟÖ<²óÎw®ƒw>@qxg‘í§õ¾¸ÎÎ;¥‘w&;ï\5† § È/qÓÉšb² o°rÍ÷=ïj–“™‰õì‘Ê=RÉÂ@%²§ºœÞñr5UBÆ0]ÕpLù&gM§Ê7><<²TeÝg©l½æFlËóBüSº—neÂ¥ e½JÅØy0gÉl“^5’7‚t1Z??7=¡;DéA¦wÌq˜*G±Z‹½°ª‹É!VµwÆß:˜gpùXÅxYÁu- þ,×’^®Ù%5ŠÞ êË €Þ«¼²6~–÷ˆ€Jÿ "k¿&e_0WM*Ç(¡zå7–]†ujªæ CJŒ” {£„b±3¢ ªWƒ+:1s³Äv~,R†cu8Ɖó„`t‰‹ 9¹8˾OŠcÐL¬ÛpƒyBÇ_ñ3¿ÎŸžœ…#)>9¢CpÜZÀk!ÛGÁá™ QpïWœ 0ÀÙ{q–ôŠãý8sGõ™üƒ¡ƒG0ïÅ\ Ÿ‘­"`¤Kð+ãÙ˜œÌG šs1%²5»Dž sv‰¼‰ÌÜþ¢¸q—F˜Ù>9«0¯xæ\ªz„Ã|‡áøû­.J÷ð|4ŽÌI'h"¯#sT3jw™³[w8ñn® ë{·w+PÆÞ¨V`VÝNJבȻ¸j‰¼[Én®C¾ïV 9wÒyr“¶› ‘Ä8éþsS†I [W¥Â§JA2*×é…³!‰•¶Û®?‰‚éõö–Ïtº|Òܵº‰ÙÓ°àYÙÐúoŠ„¼xf«žÔ=&o™ÂèÅïÔ¬ðŠØ^uï#1Q¼lér“]Êô»d²ÊŸ$¿5ffžÝ ¾¶·oÏÂä¼}nÊÝão{üíkÈÂÜãHw%K™ßÝé I–=Ž´jÉ"Tà[:{#÷V~Ì]˜ÈÜMD¦þwüQ³i‘‹¹÷… ž«rŒÅ»ÚVML£9ÚÖuåõ…1CêíbÄ\ºPƒ=Ùs©!ÆåÃß½Àž|Œè 2 ÍG´Ž»çÄÛÛgÿ¦¨Q ¾5¾o)›5þÕ/èmlúޤè5 ž >ã-_3ëÕoЖE¸æ÷zÇíαC¢3FמÄåóÛÓGÜ[ F|œÂ:eoKø½l¸gâ‚xä=„é(yî:Â#<Ÿ…Àdï_ÆÖÁàÊ'”"q'Ïd'R dšû½¸¹'jŽ_ÿŸÈúŽ endstream endobj 3191 0 obj 6587 endobj 3195 0 obj [143 /XYZ 32.2500000 527 0] endobj 3196 0 obj [143 /XYZ 31.5000000 528.500000 0] endobj 3197 0 obj << /Type /Annot /Subtype /Link /Rect [219 743.750000 249.750000 750.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 3198 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 722.750000 550.500000 737 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn19 >> endobj 3199 0 obj << /Type /Annot /Subtype /Link /Rect [207.750000 536 273 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 3194 0 obj << /Type /Page /Parent 2 0 R /Contents 3200 0 R /Resources 3202 0 R /Annots 3203 0 R /MediaBox [0 0 595 842] >> endobj 3202 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3203 0 obj [ 3197 0 R 3198 0 R 3199 0 R ] endobj 3200 0 obj << /Length 3201 0 R /Filter /FlateDecode >> stream xœí]É®ä¶Ý×WÔ:€Ë"©‰@ ÝC€,4º,‚,; ;H'‹ü~j êUQ:,ñÔ%5”bÄÝ~z¢8\Þùžûýï¿üuÿÿî¿ÿåßûÝŸï¿ìŠCS—ÿíOÿ|wûÝÜß÷M[íüu÷mÿm÷y÷ùøïo»Ë _Þÿñø·ÿíõþÇÿÿ¼ÿó_Ž?üÉýÒé~Ý5ª9þùËùOÛ¨ãߊ럧Ÿÿs÷§ßìÿu±ûœ›Ìý§LÛVæ4Ÿþ¶ë–©Îÿü÷Çí¾¿l@ÜWtÓ4E½W¥)÷Ê–zÿŸ¿íþ~ü@7|qhkÝ”Ua[øwòã>}½>}XÛâô¯ÞÇÏÿ Ÿ`ð¦Öé?Ï\|W”©Uxôƒ-•jê²)ž¡¬ËlÑ^6¨©ìÐuôÛo[“pðÓÌ¥7¥;Z8¸àɶªîö^•òt3|‚Áu«Ò ~ž¹ø®¸³ Œ~äÇîðïä·ÛÓ‡K]…„:þ=)Yº£©úzþpÞ†O0x]%$«óÌÅw¥#+<ºäá6Ú±ÔªI°C×ÑSlÿ‘«&ü4séMéŽ.y²¶qìÚØJÜÛð vßš£¤Lv´ç™‹ïJw¶xtÁõeiÓ]Û·ÑSœmUTé?Ï<ѵŃKžluÿ¼=¶J±ùÝè)6?¥°½Ì\zSº“õÿ3žÉå'Àað-ðâ_wß:ªvÇ­¬÷_ÿ~œÛå›ç?¾·¤Úw²uõñ¿~Úÿ¶(Tý»ýןwöP몛âå‰.Ñ“â#|ò>1ðÉ'ôÏ­hà ŸÀõ”:þ…Ÿ(bßÞÃÑÚø•Þy¿žžœ®à;ð µ£B \i€và^cJ,~ˆ?SiÏ-ð¾ðÎöS<¦^¸²³6Þ*|Úð;ÎÍ”à.øfáÛˆ© ó‚vÌ…F?~=Чä’ÅØM²Œà›d™ƒdÑøN¾;Ù8$¦kÌññJñ(sðÜ*¼¢Ü[x=˜»Ú‚ãHÜÛÖ]ÖmËî’çOªâP7ªmª›É\–ÖZ[œgú¶€=q,¨<”æ«õYwû6ˆ†ƒ4Äð­7|‡w`UYŸÜ;æ¡û³whh&xŽðw/‡>Œ§„¿ƒî‡Ñ»äÈ·:ݪ±û‡?ŒO£Œ_zà¸)N *Ó-hÌ0†÷€˜µQþ‰^J}y¢Tw–O}u`˜Ì*ôDOßÄ5Å›Bm1¾a˜ò ACðÀúÔõ>µü9}þ^áÓTx»±„ÀïÀíÆ3Àß ÌmÆü_xxG™= xuíði3»#vcövm•wi v_ÍÅm‘‰4Uë3æ20ä‹ß!ÔÙŸg´•É/~G·S«Ë} &bk_ò˜ã“ÄL„ðô¥g"ªÐÍh.«ŒÒKQ¦ÅžQ,Jê}ëGÏ`g 'ÌíÇ»d…I€‰Xý“+¯˜wo$6d•þñ72/ñÙ~HÍ'ǰUW±Ñ¹/›ºò.*O )µEí- `DcB‚'€ÍkÆÑȨ)²œ“QJñ0Ö}€!jrr mŠ„$ 즇Þð„öÐ7"ÖÕsÓãÃè½áƒgt#‚cO/ÏœŠ; ÏLg[÷Òˆ' ^å^ÄRKÖ?ÄøünDÈ­ŒP½<;5N¸¨fëI—µD_xýè*Ë/Û­úÛ}Úµó¦U§|Éýq­ºýÁ/»/É2&áI:'ÛžM·*»D—’ èÒD”*`2’ÏÓ¾„.=¹Løûa«¹¸¤¤\ þÎÍT1xÊá9^ëdVŒnJ„û‡à2jら)Œ¿Õíl`]˜Á_öï( kîïï;8ÚE£PúÅ”‘ܲñ„—¬]Ý×–°)Iä¤öØBYÖÉL¥9­>§(S¨?àx‘GÊZ±"^mfJŒNAÌmÖI`.&j#*f:ãÚLá¥IT4f¼I'*ñ±f†S|µAO”…³&È…Jt âŽ}ÝðC¼‰`ðÒ#®èÚ±x4Yñw‹øŽ«B‰³y·ó$IeJå³ ‹aÈi7‘ºÌL(¬¼çÉÐgx^×iYUᜆÊX}û““×0Ížv~ºº}(—æhžúPàckh|"[Ê-f9¢a[ÇmSqyFîkkëhX«»Láø>Mឺ)69SM-§ËÒ[¸#ЍzL…kÃ`í^‰ë$aN^‰ç†kÝUÛ%T…¯bèi¾œ·/‰¡–2Õùôüñœ³€Q0³yPˆƒÌMöÀ±‚Ù‹…H8:“d¹&.оðz®“W Ÿ`‘7ž€‡}gUœ6!Q¶må_y|ÎxŒY/›Õ ŠΪÌñÄTt›:烉c¤ÉYÀ^M&o4‡ˆUª'rÉXërI_‹&+ÑÑJ\ …÷Ï£!ÁSÐp4¼×­E ‡ û9µ­œ¸% pa%¦ƒÊþ׎dŒ®1ÞH 2(D¬ÿ/c|.U¢¶%‚,+ã@ÄòˆÑMY¢àdOÕ©ùv6"`1ˆŸMXß:¬Ù2#è£-U·¸|+PÂÐŽˆ5 ‰KÎáw0Ô^®õàù°ZMŒf ªg0h†ÚÃûFÀàYSPº\3›ÍTÚL¥1¦’ðå븿1`h†óëG œQOÜwòHäúJ/›DÞ$ò&‘7‰¼IäM"O ‘q†5Iä°7·-TÕMFà(?ÇŒ=H¯Sã°ùÊî+‹Éü‰l¯)c¶Ô>Û”©M™¥L%¼µÑ¾äÅwz‹°¾Miª+U_0y¢S¤h L+Q-ˆCÏ0*±^”"ZŸYÙªñE(su—™ñH”“jœ×À€Nú×ʺc¶(VQâ›3k´kQyµÉ«Û}J{Ÿ2ø‘Lõx­²0±Lͯ \[R\ŽÚßTÜDŠ›'À÷"4MÙ^y´fFXH ]Ìtš*…—ÛM+n¼¸`0Ñ›5ÎÔʲWñw($°vBÁVÕÊl®,ŒZ/Ê0™Ý¥ªâ°ãG–Å1­cL¥wòë´²xn‰-!Ef[²dÏn~î¹Ö@û¹µç_iGø¤faÕ³ qèÿ{I\†[ˆxŽMµþDW9¢ÔãóÙ›—½C©ÚŸè `.y4u¼Vå2Ü!šÝZS Ê*VM¼rò Ìà<®*td²M‡§×¹cú»‰øU™Þó„r¼yiæ¥Í5•hXj¸ù!QQ›O¸,¶è0ÁGôûe–þò®ò”ŽPÝz’ouNøå+"Y<¢§1Ãà2õÐk {•8™ZT18èL(_¤ÓW/`¿„TÈ‘âõñ­E“cmîáY»‡'Síðôêñ|›"®•œ~zDµždŠ`›TáŸê†,ÿÑs0]+˜LVám¢ÌΈ>‰s©R› Ø7Á”Ÿ«ŒúÓÛÀï`ùƒù%5áͧ€ï~ÇÀ'øä4æ°˜'âÅP´ ÷ùåÑóLç„ Üt‚od5Þ_H±Xg{ö9Ž.ñ­%šÃoO‚tPÅ?Ù$eâ·Œ4z~€åûü ÷®ÚEŸÖ¦ñäÓxp? YÙ¶qï{Ï„{óŸ>vg”¹gQ((TÖãä¹ÂL(ë‰NqÙÊ¢3ñ _sE‰â¾Ãô,ÃT¶>òuÓW¦‡\¡€*™Òt¢”å)i„Ô5%D„i=qS8Çpû´ŽJQ|‹¨ ” †o]5¶®aâ%nçÚP3YÑÎý0¤Ç3Íy§ÊÓF!Ž L£âhÜ夀®éb@(RMNDÚŸ¢o2Њ9³†\¹ˆ¹4’ÄŠƒŸA•3íd³ ™õ0Æë#ÁIft¥.pïç’‡¼o¯·Á4Oœ®ˆƒ4ŒûùQaJ‘Úö BgÓ— yK3ŽRä+!öõ˜NÃê¡©fà ˜Õ?†@±è“«r@ØÕ¿A®cÁ£1t7¡ÍX7¾ÀŸ3|£Q%œâIÂôôjÇ„nà—·líkÈ‹( X 8—ˆ¤· Ýø5W_S_Óþ2õ÷Ý6„† )=…›’çÅ—š5Õ]•éYÆèÅÄ­FKmô:}›±gñn—º\—ŸŒ’x*Bâ5Öy½ëMö‰6¤u¶q^†©oØB²Ék‡y¡[Õ§Ûù©ÏNïíèÊÜþà—Ý—€.—F ¤:ã#ÆTÏ/êÌ¥†ãÀsµE]ÃL̘±sbšÄ¦PVeÁ¤£}I)%RÓIãû%Êæ"2<=u[Žˆj¹ˆ™ŒoËaŠÌ9ù’º@LU‘hM„l€S¤ÿH®xã¢àfgÝ»ëLù ™ û`ñ±¼Ͳr)àyB©imíKMYóf|“R*]Ž¡ÙÚ."nX©hëFS /sY>1Q*ðœj‚±T§×|Dð^DÊàÇk—©IEPŒé;t¦,<,õ裢júzÌõ£Ô’c©Uæ Èó:ˆçñ c'1hÅÉ —á= fw'0ŒÈ…׃)Ÿƒ‘ÉìÆ'е0¢¶†3`”CL=f´.šè]`v4ðÃD©J®ú~[é‡ó Ð%¦>e0€ëÏ ç:áŒH£Usí’± Ie¯k}™Ì`•â•BéÆÈ½MRe”Tyq]؇óÉ…øÊxSnN ÊâÇâY häß@1þ£Òš¡w *qà;b…:#¨\_ËfrUêÔíÕ¨dÂD”û0â] é£÷Øáá¶ÃSšqÒ•l;Œpr¼Ù9ú÷rÑQìŽ]Ìÿ¾,ôm.dØe‹æ…œ¨U•žÄË…ó› ¤A$ô—¬2+™öTkëë2Ø'LáÀ¬ ‹µÈ‚U6mã­Z–wSÜ6U~|!5•Æ0%ŒM%Z¸Ûi#¾1¤pÿ&Ë_cêé¶`H™6ä ìn.è¢ôÊñ´8M&ùHW§nCDê3ƒÈ‘3<™–«€gò|"ÆžfÚ„ÛsDàŠfìÉæËšMÂ{ÙÐÉœœÞƒØæá.,1¡8JgeîK_‘’EÇïQC¾=!FlAj_Dº–‘ºùMÕÕðÏÆÝ¢ù¢ ÛkÙ æôÁF& Pö4ž›ìɉ&PȦ!n n¾™«Áe«—óP>O¢Ø ‰ocB¶¾bÕ?üÉyïlä\Â;§ËÚßwlî”È(œË¦¬à k+/ªW6–;emKéÒon„;ŸINÉÜ*­D¨\ÍМ$¢µñ”1Ϻ-E’D÷{ŠÞßL’gL’„¤Øêñ¤PhfªAÃU×åhÛi^ÿžÿjmÙ ñÛ²¹§Þ¨Þõ¢ôˆ-â`fJ$Yx—éaC%€Á†/ÓZ€Y`šèBÞ fZi®­õnül Ùœ©oÕ² ‚BÏ—ƒcì¢ °þJåD¯Í ö-2l˜‰ŽŽoŸ<}Û&to À–Íý¨¯˜>òMÉÍ9ë™—­DÔÞÄšÏæþLîþœ³¨]˜©kµñåçl¢T¦?ÃòD`u‰.Ê307×&‰6î;!÷m=™Ô—mÀäs–.Â=ù˜AÏaÝ ¢€tÁçàï%÷™¶½„¹LYZL§Q /àJZ%dKNbœÛ§‘8«:WM=SeƒåÞYÙï07á)!Î1íî:éÕí©o^k뮑žûïæÐ¶Å¾®O4J¹ŸÚ}]΋?þ²ûÉ»º<(euÛªëo™»QÌí7Ž¿ïþ»:½¶÷ß.{ß(Oïx39þV{7J{ÿî~øMªhàE0Ù¢Ês¹gª8ÔIgÔ-Œp2µ2—NP¢±G®‘Є°rƸ†Ç‡h§¯&–©ŸÎ՘̯¬Z½0¥1žŠhT+|•NTL_°Þ5bÐmˆæ€Ô20K–ÕÒcÊÔÚ“€²@ü}ÇÝJ€H0BÇgú2¬+E€ÎMz•BémëݦWH˜h]eÄÛª³¡20:" ‰µh¯"*L%ê÷Ÿi«±>aÍÙ ‚_E6Lç!oSNŸòYXuï³°jÈga•ï³8ýÄ÷YœËÜbn¿Ñù,¬òYXåû,N?ñ}çßjïFiï¿‘Ág¡¯—âÔ¤^×r­šab?ãùŸpw_SF÷Ç·ë¥bÑ„õÍ(8Ì;‰!ÅV`¼@?€Ëº‘*ŒªÅ°VQåwâú·Ê*o_Á¬KëÏ빆”ã4Ûî²*lÕõ\Øú.¼“±Á¡-®E…/ÔL‰ip¸Ì&Gøä bÉÖt¤Ñ¥6ݳG›êá|¦ßEÙF}.¤'ž¾ƒQ T‰e¶šRD»-ª ¦,Û&o›‹F36†´EùL븭gæÓªå[ =þª*F`µ®LóÔÛà6yxÖx4u¸eê±X'Å8~ ¿çÐcñz°<Âû6 ½ïhÂ>£÷áÕh¼;©BVN¨‹0D¶±{Vª(Ë'¨‚z‚o*æŠøL0ÿ'Þ4>aLÿXÎ`›Cqa™ïöcàÝ™þ),kÃà½Æ– cÃÀw íÛ˜p=˜®ý) ×ú²bìl{ßF|rXã!ö¿ƒíyʇ£,VŒŽg€9¤ø žB…i{"á]Àr7§­¥jóø´DŸÈâšæjŽýÓ/4ñ$ëÙ·ú‰sÌi›ëBMñUÓy^Ç# ëx¥Œ¥NÈ­ez¨¸ßŒýêø–ä´õ5˜¿L_ï%nÃ_æäìFuž¦'byfjʇ;·u[jÎA®' íG¶6ù˜¡ßÕŽRu߯Q¶èÏÆQ6ŽòLî¬-‹NÝvf`.äT]`×’šË`d2xçxgekr˜\êù÷3ÌÔ•¸™Ak¼+? "e3ƒ †þ-£ÛJ3@&˜zñLøþ¦I›'”þÁc¨'‰þ:­#.È,ÜE±„(”¦ùC< Á[pgê`òzÚ} ²@ ®®g-5ç-’^G-£°…Ó>m—1‡Ü´EëËÍ%]ól¸ÓŒlbtÅñÍæ—™ª½6û(BmÀ€œõÊU&â¥àP}]œ‚ÎBä‹âÓº*”¹ êÝ !Þûœv®#Uw3]´ÿ:¡b¡Tãí#«]eÓ>¹b´¿á×ÖÛ£WðÑiíSÆê»c1Åæ¥Z—ŠÑiVšÒ‡Z•þÅŒ€±0 ÿ·,¦h6Hú^Û“9·Éc:ìJXU˜Iá‹c´ÉÂJXõ²WßÏJ&U@” –)ˆdY ¶q)67ÞõÑ/ƒÕô ©B³Ôñ.>=dPïØh‹*PwŠ3qÍÏ£Zœ”¶vÑÔ&Õ¢Ó÷† 91‚dÙ>ŽÍ|O·,Ù Y²Ù2^+Ó3eÎuÚtF±ïl™QÔEÐCÅ=ÄŠLÏf‹±#³ŸŠ«š°Û°sH´ƒˆ«)jC¸ñh à”½ ”/ú«Ž°¤Çkú®.»³í“7 |l2*YêBX*ÿˆIZ$øKjSS‚-TÄs‹àŒ7ŠˆNP dBP„K%™h4„£U¢Ú`¬sú*{Æë û¼L—‰W÷_<¦ÿºx=d« ëz»M‰nÓ˜\»•ݦ 'n»ãoàñŸý·ãU ÞÄÏ~a„û¢¬àVæP¨S4n¯;4-Çó‡ŒÃ˼›mýB¿ú /VðÍ“ËþÔý'¡C\4ðfO4ã> ï˜G©> endobj 3216 0 obj << /Type /Annot /Subtype /Link /Rect [87 257 167.250000 263.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn3 >> endobj 3217 0 obj << /Type /Annot /Subtype /Link /Rect [87 249.500000 175.500000 256.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn4 >> endobj 3218 0 obj << /Type /Annot /Subtype /Link /Rect [87 242.750000 153 249.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn5 >> endobj 3219 0 obj << /Type /Annot /Subtype /Link /Rect [87 235.250000 172.500000 242 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_allowexcept >> endobj 3220 0 obj << /Type /Annot /Subtype /Link /Rect [87 228.500000 183.750000 235.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn6 >> endobj 3221 0 obj << /Type /Annot /Subtype /Link /Rect [87 221 173.250000 227.750000 ] /Border [0 0 0] /Dest /#1c#17#e6_#0c#8f#86#cb#db#8b#17p#18#0e#b5#f1#f5.Q#f7 >> endobj 3222 0 obj << /Type /Annot /Subtype /Link /Rect [87 214.250000 177 221 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn7 >> endobj 3223 0 obj << /Type /Annot /Subtype /Link /Rect [60 206.750000 151.500000 213.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 3224 0 obj << /Type /Annot /Subtype /Link /Rect [60 200 155.250000 206.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 3225 0 obj << /Type /Annot /Subtype /Link /Rect [87 192.500000 133.500000 199.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_attributes >> endobj 3226 0 obj << /Type /Annot /Subtype /Link /Rect [87 185.750000 121.500000 192.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 3227 0 obj << /Type /Annot /Subtype /Link /Rect [87 178.250000 132.750000 185 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features >> endobj 3228 0 obj << /Type /Annot /Subtype /Link /Rect [87 171.500000 171.750000 178.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_default_args >> endobj 3229 0 obj << /Type /Annot /Subtype /Link /Rect [87 164 131.250000 170.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_example >> endobj 3204 0 obj << /Type /Page /Parent 2 0 R /Contents 3230 0 R /Resources 3232 0 R /Annots 3233 0 R /MediaBox [0 0 595 842] >> endobj 3232 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 3233 0 obj [ 3215 0 R 3216 0 R 3217 0 R 3218 0 R 3219 0 R 3220 0 R 3221 0 R 3222 0 R 3223 0 R 3224 0 R 3225 0 R 3226 0 R 3227 0 R 3228 0 R 3229 0 R ] endobj 3230 0 obj << /Length 3231 0 R /Filter /FlateDecode >> stream xœí]IÏã8z¾¿ÂçÚ-.% Pk€ª95™4݃tæ¿-”m‘zhñõKRòç.ÌTY I‘ï¾þü/ßÿóôßÿ8ýüéûÿœ~Ø¿?}«Î¦®¦ÿNߟn/Èölÿ}2m}úñûÛ§?Þ¾½}ëÿÿ·é…ïŸþ­ÿ×ÿäé_ûÿýíôçÿè/þÅ>4<ðû›¦ÿû·ñïΈþ_Õåïáú¯oÿþ§Ó߇çéìb–¿ªk¥–qgê?ÞæÏãŸüøûÛÏÓÄÍ"M×èö$´Ò'Ñiyúßÿzûk?Á<|uѦzd"#‡™êÚœ„ìú½©½yÆ?<£‹ƒ7µH7ø¸rîMªÁÁÏmcÿƒÿ&NÝóšªîÁJôÿN S¦ë¦ƒ‘U—àh.ÃóŸ{Û_M±ãÊÙwe†*Nï4×+®¶#ÜQpæjzGÏ·®ßï¾ã z'ð=b¼cÎ]ëÞïVPÃUÃSÆ+ÓÑFŒ˜‡²£xm!Êø=¨¦““â¬zTï_Úp x ‰_~éiÄcèÝë‡ÍzëjDo£ÅüBêó´ÈÛOÓðÎ'xg#u®uÓ.7ªï´±;מۮrö§Ý>|ƒ¡¬Þ‚Óp˜î1+8^Á4õ<Ø–=Ç›b‰íÚÊ âw(;Š×†GÃ+À{@øÙA0Ãó°î(^åKˆáñxmp%¶c‡÷pœîd¶‚„á[9ŸA¢wxI7O‚ 8š‚ø ¼6À/RòÆÎ¸Ì‘ƒ1STz‡ˆáŠBà(Èæí…¿¹_,¿:Ôg´ÔJŒÓ”š“ÐaDÕ’€¨@âÜŽ4bL«(ȉO#“0xpF‹i' ½‰1Â(A‘ïÈéŽóâ:R : ¢pöäl´óØ(Fæ b ‰ 81>â‰!(h ·›"ü³Hƒ.Bp£ˆRNÑ)Œ•Gšu/dŠ^GoVíš$ÛRಬ‚ÉŽ`’+3ÖÐ×S&‚qÿ)«¾+E$Þ³Uw÷²Ã؈€pOà,ü“rˆ–g0'šî²Îë™Ãr: Ž™W¦ÃÀIX5‰=±z]˜=šyõò„¨$ÚŒK$/ +fDf‚´«§SìÎÆ ±æõÖàïù°Ãâ<(V=ŠTZò|ì’ŠýJ·+EŒ-¥•è/\TDhQBbꑎ´JÎ@ñÕb׸î|X¹#?ÀwºcùëÚ;Ÿá/ñó(xÇ&~¬­­…£iø¼C™ï5žGš<{@Y[à àÓ&œú˜Ïjqw=åw1c„³Ï}”³×Uk%õ~øpDõØ;Éý:¹êTÓÎY*ÉùK*ò?µ,Ó“(?¼–¼€ï’Õß!&òjw1‰À˜°VÒ ÔÍ£x|lžêܱ4ù—×É2Øb;W%âŽb*A-–°{Ì|<!%ð*_· œ"Ló¼å抋šÙ°‡.…Ä‚`¼ÑOw%ò V/Ó>°ÌwWÌ.©5Y;'ÂYˆ%Ñ9jDÅg‘p³QAÑðê9@…½\uí‹Gl1¸Á¦¦mÿÙ›š6p4ܺrÚa¼=µYFBŸ+1¾µážGÛ/g V®4Ï´°¿Öº·J…íUñ ðªM:?Ö[‹â=4*Mo{äaæRXufމËEï±¼R¬’6¡Þ¬?¼gŒè¾´ÝÏA¡ûå[m[¡áeL,‘’>ÏdÚÈUs^¥„[îpÆßŅܤœ,~k¸çw ¬I;d ‡ÿª|q.ßU€"`»9…˯-Ÿ4¤ébPJ=c1NŸÒR’wï)e(ºd¦Þr;ÈÈKKc„ J°)|÷½ãiL!‘ž--½9²Ç2‡³ú–R¡ç©oÅF ¬†ð€´Ãù’ƒ‰µJ0ñ ‚•sp$ BIÓ :é~%˜„ ÁÜLŠ51v6&ʳ'8Ý r‹!¬²#oÛÉ6E›YJ‚äéíÙcGw±î²I#e²t§4“æµx’Ú°íÏHDÑŽeÃËe+ªzHÖè Ñ;ÙlÔ¾ø\}²ÁwDrõö…ˆ—£eHÔʸœï¹õÒj4hœí<šBÓÔµû‰Kdå²ÑPj±z[(¢o®ú>$Ÿò¡J̰¦?ñ¶d$DÄÊrKXôZRi(èŒÉÄиŽ'ÛŒ ®â‰‹ù{rÅÕ`²‚]’˜´nOì%kz¶lþÚŠeåš’Ž&Z ©ºÍ²Õ³)Ì8’‚dyà(¢ÅcØà0Z+½V ñÈy°ò“§O„’ É¥ÒêIFß{rå»)Ze{½¿€Ÿ« ¾¼ôJa.ƒOIdeée14ÆðÂJ\,SkaQQJÊ&)ʺs¿àýŠ˜`[ðB^SkålÞZñ¤hE:ÃNÉØtí`̳ˆ_Å“ W§­}Z›§ŠÓÂÆ.‚­Gô±uífjÎ+Bó yw T9òVBí±”88ÄãI`‰ˆ;•Rѵ¸”+¥ï¡mÅ eýSõ¹êÔòˆ°úh³­V"@ÓÚÒŠU\ÝA/Ž=G‘¥-7òÊ0 îAù #J,eß(Õ¨3娓êo·2'R¦+}rÏ8ÙJ;¥†íµÞq(%ÉžAƒâ=ÞÆfráäŠåUnüdD/£X„XË—/ܦ¿äPå&«”Rõò¤£úqã®è¸±©Mnq‹øà¾LØ~mîxÕx4»ÉãÞnÚp4W ONÀÝÑpBˆÆkƒ»ƒ¿Tâà)¬ QkÃX¢Øl°¶žû“c_éë TÔ›àŽØþgLðŸuºÅ1ÕVJ[;-ì;„”TAÜÂï`Zð^ÂUW¸Á8ÄnL_$¦/g0§ðàb>ƒqžÆMEàZyð/\èÁ~©Äpe.¯ à†xü¥ø0–ÀSxGxšSzïä} d½£±ÄO€1 žp¯J”= ¬cxÔó]± ŽFá î"è“£Hüøµ pdfQàk˜”ÝÁÚ|`Õ<Å\¯ËB(߀kÊ— ¦½Þ,ÎeáFúÂOá,$¨À–), áy0%Æð‚OŽÆ+f=au™•Íç²aV=÷t X_rù€êêbzá PÏÕ‚”ˆÍbéÝñH-^oÔNƒuB!å•tàò®A.ex¸.–<}Râø±0%„Rû…5*aUawŠõ)å oì} ^%ö‡7Û¼|0bùæyÅÃ!³ç'çJŒM»¹[!Â(í²íƒå¥ãÒÄgËK£”ïÉL)R†¥·ž˜‹c½°L¸çvN¥‘•ëXìÞsÏ×Ò•ýÈXJqv—³Œ[yËG±Zfå{¼$p+­ÉEÙ)5BFnŒÞ¼CHy7µHm”Ë× ØÈçÈ`UÔ‰8Ä=Ñ#±Ë¢q¿î`† !jç øÝ´§!ýamÎiÊk ç‡ îèeñݱßœmºÁÍ;p4+x­Ö¡Ñ,îHynôaWîd1^Ÿ½öI];»{7ø"qûw»å¸)uu(y;»–¯OÄžrƒlÝýë1 §„œ”—Fs`q]{°‰±sb 9ÇøMI_¥pïä)•M-6c~æ¨à§±“ÊJÍk«cÉDŠ(&J‰Ì$è+’œ9µÆSO1'æ „åM¦IÓb-"„¯D¨ÝÎm믭9ÛX3´cŠˆS¼:جO‹9l™Søy‡p&)^_?ʼn˜)º?°ùx4z™y&Ó-ÅEA!.Сä¬V¨Öãµ÷À2ƒ]ºÝ@Dwì>¶W(‰×yË^?¥±ÊÛÀ‘·Æ}¦£,¯y¾¢xvÅáv è(”Æ®ô—)£F•q¡‚P€)òFÌÌퟔ‘f뉇Õ(µ|c³Wæwé ihF)`EÈûxwvú”a6çúʵ˜sÂ"J>àG)Â/³Ú7Db/¼·ã}.Û ©ÞRÚ2l¼E;˜ qO¦ íÀýÏ-oÞÈ`Xëºä˜#øV3ç1'5Ív›Ï,Wæ2o½˜À`«áG9fI)ƘýRÂÌyê±±'Úça™¿Ï¿Uu493þe„h§«òÔŒŽÔÁ^ùñÖ´g!:Ù¶âò”¹Åþ²sôÏÛßãk'çmiÜ9ú+?Þœ•ô׿•O£,¿ãÇÛ¯oÿ´Øáí‰ØFDDPÒXw³ÿîÚAC߇ãΈz/$ý/“)÷§Äò¦õQ °“¬:Ž)*÷Ð7_cQYÖÍí…ßÞ¾'ûa¢%Ük[ÒMŸ¥ØÊ·„÷ÏÂÙû¡ÙB·v. =¦ní— ÝHS…–– ŽWkÑ_–lÎW~ô/U–¸^ž²ë˜‡™¶–n^.˜‘¬:èÆ¦¿2L³XÌø”^£—ÓüÚnê,f0­ç>h¶ëÑ ?±z ´{ÐÍÌkŸÿ ©?GL÷ݘ¦û$HXT×3 2Õí…Í$¨1 ê%¶d*—6˜Ê'AæJsæaæŸÆ!AM³F‚šÚ¦¿â‘ ñ)½F/§)J‚Ì¥íßKB|Z¢›YBäŠ'ì–hŠÕGO{°bFÓu$ñ3z&~º½°™øµCüZ³FüÚÎ¥Jýø OYâ63ÿlâ×ÖkįñÝi´OüƧôr½œ¦(ñëæN¢ïHþ‚ₚKØRÀ[î¼[9o;âwê¢x©Û [¿“–ˆßK+ˆß£”ƒ‘Ãñǧ&ľ 3ÿ¬—ˆßëH+ˆßëÞ4ÊCüé)½F/§)‰øý/©§œÔsÀÍø.„œñ]V·ÒY½†‰¨Žq#üÍâ¶•Ö:[ÝoÉd‚t÷þ.­•Ú¡µ²^£µÒ¸Dpt 8¤rxÊÒÒy˜ù§vhíàRói­”Þ4Ò§µãSz9Œ^NS”ÖªËq~…ZH®ô¨LB%z))!‘IÁÚXéiÀçä¬Ûœ–Fj¡o/l&²Z9DVë5"ë™ø…5ñ/häð”%¢ó0óOåÙ~ø"«]‡ÅpÅ#²ãSz9Œ^NS”Èê9ì 'ëQrN|Ì$Û[:ß…½ºš]ŠBÝ^HèRÊÙáç®öSýrÖ.¡zc͘ß%±tHl£ÖH¬çÂÖ…± ÃS–„ÎÃÌ?¥Cb±Fb×!3\ñHìø”^£—Ó%±M;ãa åØR•sµ´*ßtâ)(—ëd/̶3ðfïSÝâÂofGŠvKçßr%pP´Ú ê£ßbú7>enG™‰Eà h«•ÀAa:wÓyƒÃµy¥ÕMààuŽ’ƒ=nÏô£A8Ša ;áb$MŠÎÉZ+ƒÅN ¿XÄÔ¨x’v@F#ldàXàQæ»­QŽ¢m/öÞööÂÃMVÕ‚¢ÉJ¬P4Y)‡ÚÈÑ!³¤IãSæv”ùWµ¤h]·FѺ֥h]ëS´þš¥av”åw”¥h²š» k(+‘r:q:&¥h‡º–­Ft¦::˜äP,£;8ʸ8jYÍaoÒ´·=Lë ©Š eo8’ÐüDü­¡ŠÎNûÕ-¿§€KÑ-p)«\zi=<·úóøÔ¤`_†±?E·TÀ{YQÀ¥pýUÃWŸžÒËaôrš’ ¸”— þcRpÞz¦øÁè0-RÏ>îѵú¢”—+Èȸ´©œ´©ÖÒ¤çÚO[Ÿ²ˆ¦i ó4WDTki R¹>ኇˆê’¶pF/§)ŠˆZ?)"*PêW y±h ç0©»Û ›Ñ vBçe½:/=K­lüÐùñ) æó0óO't^Ök¡ó²víÎà êKèüu½œ¦(4sè<Ž©¤8fxÝIÌäǸcÑ­ÑŽÄÝÄkKãkK³¬-¬-¬=>eÑÉ,‚µçi®èfÖ‚µ¥qƒµ‡+º™K°öu½œ¦(ºµòØ\g ü¡{ÊnÇæö]™Û #2+ãÀ,om.æ>"”¸¯Í¡™Ë=\Újíî’ÔÎ ƒ—ÝZ¼ìÜ0xÙùaðãS–dv‹0øyš+IíÖÂàeç†ÁW<’Ú]Âà¯Ãèå4%IªªÄ±Iêëm&[ª’!¤¾½°Õ±À_‘M¨z¶œú7¥N-œ'¢ò[D¹ª˜Æ.î£w[qÆ…P<£,5u òBLH !4![M]Öö7,ÅWIšë§3·K8²4—tMtRÃ\9¥ôö)«ˆvÂaZ=¤Ø\XÊ#Rzµ±V©'uï3X»ƒâô¥ª¹PÈ=óÚX+wStLÜ&¥—#ÖurUß_­RŠ„ÊÓ‹ÒT{þ1'² +o'!0k×Ê’Ú»¶ÛÌsIík9Z,ðÖ’æéuº¿dœÕÃbDǃW”-ï–OTà0n<ÐH,yßÑ/ö>È{aâU)J!/¹9"ŸHÙO¡3,òRλžü=¡³Ù™°,Jñ®Rô[( û"u.®ÈX4î4(¶JÖ”’\CiÆ—«e‡©ÿXíÁ{,<Ü`°MÓºö­™²OS ‡}2s—i/BÃÂ0âÍG MƒŠ4îËÛf)òÈvccu¥$¡Ñc|G!.û'%•g;dò*мշîýäŒðyó"¿' FzííaµA}{º Ã,¡&s »fuŒΩ|Qø¥ê Ö¹nÎ>*ßarÏÊkÀÈÛS|Š”‚2‡ïeF½ë§ä‹ªÒÛq˜Cd'yc·ó¯Àê±ÿÎóýá•𖳡ÙÛ9¶ž©Š­ ¶IöÜsp¹ç#xˆ°ÛRF¬»"K;\©×åð‘Üh}IÃùpAØi›]\[»3aT3·PõÔ µw:ôŽòºÑ* Gùï|Ew¤Mûl'beÎ]ë¼cõÊjç }+£UèNàÛ îžG|wxbðKñ<’ð¥Ò~i‹ú¯­žÞ·ªKBJ‡ôõRøLBå¡a<½N£/åö’òdø¡E…líÒý†¯ö¦ös厵“®ÝéâG³Ìn펄wà<ÕG¸‚65€ Ug—»Ël÷Ü[&&Á5NèD··‹q‰Ãeyƒ1x“qH*¼…”žÌ†“!}¦véú³X‡žÛ­åáÞsc’WnÓï0·#&¸œâõ ui{Ÿ`Γ‹ž)þ‘’@MœbõQê/9ÔŸzd“µžki¼;õgíü›J‘çLšûëÁw{õ žÖ‡ïˆéØÊ ±ÁòÝ(˜O§¾÷Nô[£yÔ½\Ƶµ}µ_Ф6,AhW Á‰¤k¦? ‡7wØôÊg<|Ç2<õé7í¤¨7ü»º”XXÀ» A 0Þ!RAÖ:Àá_ÀûO^à«Ø[I€–À;p ž`úá ¬è¶†ªx4 –ab×feí’€¸$L,ðææ¹á0TT5•:[2¿g!Ù–7AZwyÙ·Ó··ÿ𜋠endstream endobj 3231 0 obj 7789 endobj 3235 0 obj [145 /XYZ 38.2500000 168.500000 0] endobj 3236 0 obj [145 /XYZ 38.2500000 168.500000 0] endobj 3237 0 obj [145 /XYZ 38.2500000 562.250000 0] endobj 3238 0 obj [145 /XYZ 38.2500000 562.250000 0] endobj 3239 0 obj << /Type /Annot /Subtype /Link /Rect [429 632 505.500000 638.750000 ] /Border [0 0 0] /Dest /#1c#17#e6_#0c#8f#86#cb#db#8b#17p#18#0e#b5#f1#f5.Q#f7 >> endobj 3234 0 obj << /Type /Page /Parent 2 0 R /Contents 3240 0 R /Resources 3242 0 R /Annots 3243 0 R /MediaBox [0 0 595 842] >> endobj 3242 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3243 0 obj [ 3239 0 R ] endobj 3240 0 obj << /Length 3241 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWðÀr¿øì;@ ‡ ‡À›M°Ø]d²‡üýP")ÍüZìÕ-JÃÉ8Óf?ªª«ªëùñOßþ‘ýë÷ìã÷ÿdß»Ÿßvj_æªýOvøóáõ/Lµïþž•Už}ÿu÷’½ìžvOÍÿ¾ìÚ¾=ü¥ùÛÿ2“ý¹ùïÏÙßþÞüòÇîþÁ¯»R—ÍÏ_Ž?ëR7S§Ÿ‡ßÿ{÷×?d¿fì—ë6óöÿÐN•õq–~ÙõÇÔÇ?¿ÿm÷±@Ø*¦Òy­2í¬ËtíLößî~jè§WûÚi]®TK*Íq%UeÚ–«‹ÑBÇ?BÓG˜¼T6ÞäÇ‹CEÛBûg—Dn™ç-€ŒªcÀ¿Ÿ>üë""r;‡J\<» rꡟ—ò:ÏüFkoòãÎ¥Ò¡O.‰YStàqºŠ Óô1 _”ñ~»sq¨ô¸Å³K"·´=ô›ÿʃè<}„Ék£âM~ܹ8TzäâÙ%‘[7?""÷<½üäVÇd ÇGC.ž]¹Öêú®Š *Ÿ§Ü².ãM~ܹ8T:äŽg ™o¥ý xνx>üü¼ûøU;ݳȞj6×®yüñÜ%Ï>4Z`¡\öücöƒRÚý1{þyWï “÷[¼4b#_ž›ãFß©± vjj4¢¾ÀC̦ (Zø ÞÑüæü¦€#ø¤ÄÈçðo,C—ŸÒ¥3 è’Q¥äˆgHË õi¼·¯]b¸ÁoRQlÌ¥¡åF˜Ýˆ4¨äW­Á’N—,mÞ³ÿ–(´Þ箨Êü²Zâ«öU­Žð9‹ŒøM;âöζöåóˆC#šX§ZS#xønEFuþ§vø ü­…;çRùqÄö@šÙî‚„¯S 'ÁHÐ p³Ý½š©àf1ðálø<žo$‹Â -”’êÂu<ÄÔŠá|oöôx6|+1É@Ò¤®ÜµVáW³á00A‰sÝ:ÅY®õ@žð¸[mQÛþL3xÃÙ(µßhµ/JýFøZ=ä+Ì}'8Žû’NY*«ª?.¡jâQíQÂác?·~„BõÜóYų±Rå’' †|–üü_DL‘ø!màmÀ\é'ý¦¼Ë@1峯*–˜+7# ÚŒ€qè²ZbœfFœ"ø¼(5{óèðžáÙ)ˆy1sgð­•Å¥ƒaü`Xæ[Fs\GÁ¼ß9ˆ9†ª„!ŠuEƒá†¥w€ñƒ9qÊ-¿Át€å”­ÓI£Z¥vIy8>Ö…0ºæi˜–±þ„¹|$Å£¹wLíäW½àŽ©ëü-u¾Wµ}cE¢L´„‘˜±œ{̆Ø9÷FxKZ2søÈÏ„mÃð_˜øÃÍzìšØT8òpˆ:w(¢‚³Yh÷ø$0dç;Cü@>> ló1éñ`oL*§>:ÞuŽ±Ã Þž±µ^qæøÚ&ð׸¡ÀKÄ„6†ã:Í`Š30îÏóÙ%ž{Œp¸Áà<0Æ~Éyä¤Ä®Õ—,¢cÈZõc¸cû'_Yäâ•ÕaF›e=5¨‡þˆ0º`L³Y¬[0|BŽ?{^AUUXôûp-!‘UçÅPdE“u1zŠ(€ —b˜–¨ø¡ˆ//±Ï:ø{)ªñˆð×Õ£ô=ô|RЪ¨´àÚÃi·7z¶Šq¯Á›\Z\0áöèñ-8ó‘–‹CúPÖ·)íëßü²û-ƒ^±Ã&Yü,‚àd4e&Ì.Õóš‚nB5JŸâ>dãEÄ+aJ`â EŒO x$$f÷Ìû>­É6"q5¢N«BLÈ'¡Zô­ïÊõ5 ÞflfŒZ¢X þÆ1Ô²LÉ9‚ªîÞ¶4ßÅp <ÂøáJ‘ mOå„z1nçã)Q]ÄmDAZTÅ|AŠáGˆç•ç…y¡«Sùˆó,ñKAyÛ|.4‘»ŠƬޅaŒ“l(žûîÌ2kN'e\NÔÓ'‘Ὁ¸èN0ñ@Œa6D‹Â¬’Q߈{tñ™QHj—)É<Ìc‡¡dh2Ù–xóͼ‘:¨ìt†Õ‰Z“ù§#;Ewö&Ië.ã;‘Këª!d‹yè1Ì눰§x`!k’äÕ‰¸îz]Ub{wyÑ1í·•@7Íx„ÑëÖ^ðŸUå|âÃ)iÁÁ†Šc§ vî,ãY7ΞQTÜé…:õõ«ž¤+bÔV.äµ®‡w-[Õ1ñ¤ªò©ÃèI󮧴Y˜RLÁ½áÔCxR‹å7A£žt]¼Ä)&eÙ“˜É$Mãuî¬Â©œ2ZùŸÜÚÙ·G›Rnz$Žer ¨‰ÀJcÐ7Åé”GºOt×Áßp÷Ö]Ì)½¤†³)Qk¼ƒŽÀ¦‡èÁdºÊtÄb£¼#×0᪠1ÐÌJ¥l!‰Ü™TÁè—B:ÌÜîJ®LÍÖß5ýÐôà8Uøç=„gÇ|”×f(Ö—©êjCHauÊÛŒœW༷]ÌØ˜Îæ3KhÅ(ðº…<üà³% yõ¹¤òöQq\·T@’±Šøäc&.ªz¾¤c®¹ª(Š#T)\$ I9#}ØÿÍÉÉ›ñ´hUÕ*PS4fÍóߊTA¡€ÇUªJ£wáÅ`¾“|ê]D8GÁ$L¤°p\õšC„ta!…㈠ӉC6R4½$$X óæ¥#Ë;˜"A£w“˜À,,¦¬T™®'#^ZAj”}{V­öí3b„»©‘²Ã™šñlÌ75úÆ<öWêÉK01[wËnŠÕ°+•>5RÀ][8×1pŸ´3ÑOœÇ“v÷djÎÖ¹]¦`ÐÞîboµ™Tµ¦výΆ±P‡ÓƒÏl¢*~0¬1 ½uø‰/ ëkĪÇÓffw˜£L ª®h¬Rª\[á|ðͪ·Hº¾UO8 wˆdYp˜¶<»Ÿÿ¨¤‚S“˦‡Š®âx”p.¯ÓË—›r Å„‹h2–"‰«{5K‘°k³üzÅÁ\ÄÞ„Ë‚Ä N¨–àÏŒðÂáï©(2$`kxŒC¶Ž“!´ƒITô>É$$ŠÖ ˆ¯’ ëG¸¨ž–R߇eéQqß¡Naw«„BBÅ’ly=3Üï+¯ÇÔîí ™òOQôg® –<þ8ŽŸÉÄY³÷bÁ³¼kœ—§£>kû¦džl ¢A+¦> ŠD»WÏ®q6A±žÖˆx„hšˆÛ¯uÆg¡<0φ(ÑØÖÁ›a!U9ÜòòAi'a;9cs}Ó7jÝŠóoóž%“kèá ¼gIïLU÷«µ<Ëd+b c ÄÐ%ÖÀˆØhS²ùàp××<š”ÏŽB´¹]E;vãTuq?ž{ÆðXŒ-œŸŽéÓÑŠ|Õòì&õF¦y¸ð $v «Ó®¢Õµq¦\pÓW}3Þ¦‡i,%%¹¢_5]ãlãªS°«ë—yÄÔ¯`4›M¿ôÈñµk]¹²÷³ñbß7+àÅ«xu禷§äÅùÉUºæ—³7÷Ä–I~O6.}\º˜Á‹,†">÷m¾YW, ¬X¹§”TÖ (‰¢>‚óPð%¬97ªÙܦý%¥.R/±%2Õ6=º^‘îÜ…^dYy7·Û@=ÉÀÙ1’’æ +o ¹ÇVêÓA™8±¸qÝÉRY$¶t'åD¨Ý+,n(ÈyNpªlÁƒ4mº‚zg¾µ¹çÕ-<Ì£f³ eYŠ :7\S6i‚I¥e ÊÅ­8Få-ˆö÷[ANÀüƹcl`qÉœ+QÝ–rD¼)“ÊâÔè -­¬h{ Ù`TìâõBo:X«X»y¼¬–81S™Ç1|ñl9žMÖQ˜Ð])³[ïÈH…S´°£ëò8}lAa•ÑKpÃd»Z~W¹8÷d c¿Õw²ƒÜT ïj%Ú6‹á—XObÚf¬Ë¸áI1æÖ¬[å›Ãx¡n•[åÇgÊÀ­ª.ÅW½à®ªóS„š¨»JÆ PBæúeÊï´>"UÅ{äCaÚ–‰S÷‡òØÔˆ‚éÂVÞõ¹Ò¶k4‹Ü®_f”1öÇ÷);QuòED‡LíàDò‡©*Ly¥qYDÌ7ձ횄ÎéIé>s@æÞ'jÇæéUÊÔ_…„apq¨<|× }8¶¡Ï^qyoM’Öjϳ X¼ÚÖœø"Fð%mÕ°³›N¶´ÌØKWa[³èXBcسéÅC—+mK7ŠÕÏQ*ïoª´)áÔÒ-qñVùØ­FsX­.ïGvÄCåŒr_L婸Ã:äžÖK|J ½VÛJ|U¿—ÂêúÔ*ñ|4‹Öµ÷˜D ÂX°ççÒP™%D'Ý€@¸ˆÔ;Šª˜^¹DÿmŠ÷w›êÊlƘËÓIdw.ç‹1Là‘‘9òŒÔóðšÍʃ’N%€eÏSˆ=%CE¥ýªõzYý)¬]h…Eœ» yt#^õ©u÷MI}§±›½eå7ƒÖ«×OE7]ÑÇ6]ñ%åºXp‡=R”Шòr›†{w:Æ­h¸ÍŸì¥¹„Þ;útéÌpŸV“M8µÝ+}tÍNe;ž2å¥j÷]NøB[ böæX:Æj1銸˜}1Šùnw0åD|DëØK>詽}íNŠ*Ïã 9wÞ’‚›í Gì®.&ƒ}»ÇÐx6øM§hè £¿ Yf îð÷fÇo¯ï”¿C’€g6 !HÆ¢kàw5 Žñ/0Ü!æ5Æܽ¾–"EapbÐCýp]ÞÒÔUų1· 3 ¸·N}xÅpµ¸%Ì,0ð=ë¼*ùÈ^ÕRÙ}ÇægÞYȶͫgÍEYö”=íþZd› endstream endobj 3241 0 obj 4479 endobj 3245 0 obj [146 /XYZ 38.2500000 427.250000 0] endobj 3246 0 obj [146 /XYZ 38.2500000 108.500000 0] endobj 3247 0 obj [146 /XYZ 38.2500000 427.250000 0] endobj 3248 0 obj [146 /XYZ 38.2500000 223.250000 0] endobj 3249 0 obj [146 /XYZ 38.2500000 108.500000 0] endobj 3250 0 obj [146 /XYZ 38.2500000 223.250000 0] endobj 3244 0 obj << /Type /Page /Parent 2 0 R /Contents 3251 0 R /Resources 3253 0 R /Annots 3254 0 R /MediaBox [0 0 595 842] >> endobj 3253 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3254 0 obj [ ] endobj 3251 0 obj << /Length 3252 0 R /Filter /FlateDecode >> stream xœí]K¯ÜHÞ÷¯è5R:õòKBH“܉R”H, ”a@#fD˜ßv¹ïí¯l>Uv»M7ÜŠËǧλÎãí?ÿýüÏßÎoßþÏù«ÿùþóI]ŠL5ÿ9?ÿyóú¦¼ø¿Ÿ‹2;ýåôíüíôéô©þßo§æÏïÿ\ÿígsþSýߟÏý[ýËý?zþ¿œ ]Ô?ÿ}ýYºþ›ºý|þý¿NùÝù×çÛ×y`¾ÿÿo´ÓEž?ƒ1òêo§ö3õõÏo_=½m0ï-¦´™5gí¬;ëÊ™óÿqú©~A»½ºTN×ÿÜjÉ‹ óü&«ë7™J]™÷^tý#³½Ž°yQñ6¿B.ŽmsÞ]òpKWy1Pô²½üæNéx›7‹c¥=\¼»àá:UïEÐó[#à¿Ý>ÆæÎFÜü ¹8Vüáv—<Ü,÷rÓ*E·ícà¿Ì³x›_!ÇJ{¸xwÉí´×[UC·Ý# ?S:"ã^!—FJ{´psÁ“Ít­ÐôXû/ÛGØÜê2ÞæWÈűâÏ6°»äáºüfME0•_maóܹx›_!ÇJ{¸½Ý?ÍÙƒÒü¸sß¾ûrzû±~CÌüü姸æ×_j¤dç7Ï>œ«W<ÿ^)ÿáüåçSuÉMւج‡V”A+x7õ>S A5·Ôð= v † cÇ·ã@½#p ÏGUæ?c ÔÛààךñ¢óLéZ\ý±XÌ?{¿› òÀ{~Æ\k0®Å w³gðÊÁÏÛæg|Ú†Þ÷à“ƒï±>ó4Ÿ ѨÅ8ÀïaV{Åb‰„í‚®Š7˜Þ\:M™+»SM‰ùŒ’x7(kZËu ÛGIZp|#£×·0:¹û´#y…çÒÈhcv*£Ô‡-8Låø{ l[–ÑILHiç°–Cÿ@Ö2¤ë]JU§w*Ue!`ί0±¨(¶j+ªž bÓÆ<ÇÝIRÆ¿Ãï!ø™²\á{<$¡¾ç”ÅJ8,“°#,£l˜ú°}ÊX®ø.ŽñúEWLJZ¶ùNiÙ¬.L—Ì3ŒÄÆšž\õ8cÇ Æv¬IHËY¶SZÖØîðáX¦ ¸›e4<ör ¹LY¸²rYÌ­!;u%äÒ´æ­mСõ%syYd¯ÕS^ÊJ]!}>ã³Ó]œmê9ºhXÁ»y“˶ ¯VÜ­BPv+à3jmæ?ãÉuèKñ{,|Oc0ekJýý <9 WðnøKu~Ò¶}hø`V9å3|ÛÙ>p‚ =8ø Æ9–¡o‚"M !ÀÈ/áF–0ü oˆ÷!Q–· ìhBÕ…U1Nâ@‹ðÕNÃ+8à|—ØÁ!æÁ¾KG—•Ò£ð¬!<Šß4¸2©ÍÂ@(H± ô¢éú“ r7N­ „a1U$L\­lµäìï6P^eejnØðÕóJ ¤¦äû¢ ÕÛ'©·†w§²VY»Vy¶ÜÙ 8z„ÉßsçŸûA”WÕu.4Æv³0°„kF¼C®.y¡¿w¦–ÐÙEUö{zøîÖ°ž6íÒ0Þ~è"¿wøYÁ8Ç€I‡pü±CÎp!à\ã÷@úÔa>"Bx ·Ræo;`R¯·õ`ç¥s”6ãY÷L$AÜÌPwPøž“¸eß@6 !A7ÁiJrfœ²ÅLÊ ð”jžMŸw¢ì¥¤Ò¦ZTHUqš#F§7€Kiƒ~Ó`Þ °háMý}Öyl›¿Ôp&ËP,%+˜3Á˜‡”dÕ|Š XqëÓ2‘/ŠÊ1Þ6€t¦ÈPìÞäò€ßB~#ò¿r 8ãqäÿîxSö_ ¿Ç`í(Êg[×@VÛ<³7 tdR‡¸ië:ÃZ³€–GgS9Ža1Ôx7,kVçŒÍKùlIŠ #å÷V TŽq¤ÕÞä˜ÁV$N[†¨H3c,Üǹ¡Ù¼¼,—Üݤ¼ùsªëH ›Ë[—©?cRG|Ò¼Š$˜^GU™5¤\Nx1Þ—\á)&s¿'5ƒ³§àQÙt‰2»dŽ’iFR%=qNÌ©Jâ0ÝágR%‰bÞ#ò¸•Š=ŸAÔfÞgz] ;Db$“í¿'¢ÚÌ´éèÍ™2l‡Wž$õ&Õ¡öISr‹) Š™‹Éž%вûˆO‹ Fz0rE4 Y¤NÜåþl•„”Ð#œ6¬v!> 5ä0œg-c ,‹ÈM— È’ó C‡§ü¸ž²®é®«€ùìʈ†‚V¶g)0=+ðiöÚh`y)j~%ó»äªÅ‚"åYWC‡fòë‘eª3ûF«Kc?õ¾hh¥ð85]£+°~æ#|¦BϘ§V74Åg½SØÍkèg«¨S—æ³Ò†Vrµ…+ð=®à/õ4?ð¥¾d½[·Î¯à÷(x bÔ³ûÐ ÜÍweÂu£mó‹Õ¦#< ®ÛºÁÝði‹EfG"Ù­ì¼€Ù1È“iàD[¸ï”mï¶[â‰W°øS"r;c*ÑÛž!”È1)³ÀåŽ8¾„cRD‘fÀÕ†Ž;eà`9ADZ ˆ/ál¦]œìÝEÊúÔ¬j³¯ª¹­ä>äzIÞï«ær»$Có¨š[€ùlI>áîrcׯ4Z½žhë°y±$Ïïq2Ç6@ËGÕOåÕŠÝ›\Þ]ÐQ5GsF¡5²|ù¿;ž9ªæ’j Â,éd²7 tTÍÝsÕ\á–ô†yqTÍIsÆæ¥|¾¤ÍÞ¤| '±²y©X.éÌò8Rñ¨Á»×ûž­KßR-¹ JYƒWÞúÊ&«Á+«[çz¦ÎÉÝk~‘3ÜKc|ÆŒÔÚ‡ID§ªî)VùfÐÈ÷Þ×û…¬"9T¸À&Q"“ ‚ÑÒ™˜¤r^˜¹Ç)ŠiÌþëÏŠŽò`È(zÅÈ7"O,yG”Õ2’†¹þëÉ}æaN wÆÄ\X~—|ÔU.×fŽTtÚ.¶>¬Š¬ ¦#®gnÏ1ŠA ûè,‹?ª}‰È .Ÿ/Q¿•EÑÑoØ8eÆ{8•ïLú@¢ˆ±é˜f×ø*3…QZ;=AêiB-ÑG¸_]Ï„=hö.h6™}`bë7†Ô*Å)eáSÅjtºËÀ\ä6ÿÓóU(`Ä ÓCNÂse’šƒ(û›.Gem'*G˜É“M2$2×6à¾%ꑸWÍ”*Ç÷˜Õ1ç&4m›_©3Üõ3ÔÂ\€i}z Q¶=~ªceZ‡ O’XùTÄ=±Í|£bï ›Ò…«‡‚)ö9*ž¦¼'Q•5ňpXúb £uaU˜®.dìËDyüÉ&NíÄî‹«ñ(>Le¹/)5“M9!.Yן¯EyŒ½s[-Ì äÔ´ñ,ó°}šcN›±y»w’¥¢³.às5ŠæRAž„ªb'Ê^âÒSدNÕ^ Iþ@tOÜ[B† €ÌÀ3¤tªá:1•¸6QnÊÉFQ ê?ƒW˜L‡Y6Óº)ZO‚YÆdÚ2I )¯ ›9˜íWŸ¢M%˜¤"U{µr‘] ­\ѹ2Š 4¬g¨ý\QVuQFeIÏû·DÜ:ÊíKšðŽ›ÞÁ̄ٙi™Êô'0 5q:ŸÑ¦•%„Éu‡^)×=­±LÞo 6·¨bo¶u‚A]t¸@$a ¥1Á÷䑚ƒ9×RPË&$%N8`‰qÞn]4ºÍp4gN2ëNò· Óók™¼kJWI„#—ßݵԗ*qa2Ùg•lðz“…†•2]%IXEŒõµN ²1u¦e«Äuð®. ´²åt_{ÃþßFÃmÚº.¿ïLÅ0²(`aØ‘èh1§ —71(ž.‚(Ì_R5-ÉN×ÔùÊŠïrcåžù#C0Xù~»ê|Ô¡¨™+Ϻ$s¸29FGÎ{üœwÑ’Ùca†'Ì1V¼uÚu„ÓphÎõ§lêHŒY‘/F+;Y ÷…÷§†s[LVÃ÷é.R*¢Ô|ìÊŽ†.Ñ­ÿ>Ù ¬Ä}“'ìúÄïäæt‡ƒöÆ'ëõËbŒßéWÀŒ'¸[@‡ŽÝP§Ñ‡Å„ÁS‹øzèЇҡ¤™•CSšò¾5e5!·ìД›Ö”GÜo +‡¦ä4å£G÷à,ò¦³£Ín™fp¹‚C+Ñ94pïŸñ‚sÖx¼Ú^ºå³!åpl|`€zs¯64&xÆÀ•À°ûøKáJo<xãMCðiÃ÷Xiç=\»3j| êÜmŒ" ëk^$€O?‚b7p¾˜^óùç‹iO‹aj¤øÃV¶%-˜Ý*û9µô8­ÞÇã<@" “ Z({Uœ¾©×Ë™µ1‚í}œí`—b&Ûÿr‡æô(Í·\møèƉ©´ò.QDˆX*ÑŒI&¼§ö^Ì‘]T”l7Œ ôç¥ï€±‡IK ýF‰º¸½ˆd9šá‰d=ËDûRõ}„èx0ÇÜH?ú¤òÍß_Ù¨i»HUòFîÝÈ´ØcJ#žºdýhª$Z¶m¢›¯¬b×)a‡÷`& —ýY2Â>dxiÍèöõmñT³„ …ÌðÅeÑ5CX ç»*ÄU:m°¡Hÿ€Ñ@aÌ’Õ¢‹…õuDª1;¢ó)¯•ÀÈð>ó2Å…ŠÚ¦’u¨™3.t’•NC3I)3åœû¯TÖ,ãhMŸÛÊ\¢EéÈQŸf¾I΋B#  "Žsõ‚£>„IAõï$bHÂQn‰‘s¨`ýc;S|"Ñ!Ê‚u?…{2Èö1dnoEF ÜóMIÔÁdE×ÞÉ%Œ\ߎ±Èƒ»•ŠÃf€Â“Õ°IÐ3EÖš‚Aµôî™ÒLsìô‘Âa8&,˘Ó¹ˆh-DQ&s;‹yQô>52ëC3zÊ£°]íq¤[ʹï¾Ñû v/Ý’Iw0¾îÅ´KS4¢¨È¥Lkâ 3²¿!ãÊú^I†w öZr²éCT\—¡LÂËDMr]Y;#›9ˆéÓeïȸlX%&¸<ö¸"":̨(Ç8ÙLqz¼?@e©’…^MT¯ÿœ¿ÕìäöOcÿ`‚8(kìêoUúùdε\ðpkˆþFµßÚ Ù\LSäÚ³+óþŠÏ˜3—¼Wݨ!O?¡÷Ø1M0ÛGÿ¥ˆ81¹®ÀA¼ÿž4†¶/FÌ‹ÏÐx7øŒzÖ§¿Êb îùï5Ä-䨴ÅX…$Ø c‡±ˆ ø.;ÄÑÿÆ;;˪…²/æ'ò,Û¯»EŒê²OçO§ÿGóÙ  endstream endobj 3252 0 obj 4631 endobj 3256 0 obj [147 /XYZ 38.2500000 175.250000 0] endobj 3257 0 obj [147 /XYZ 38.2500000 175.250000 0] endobj 3258 0 obj << /Type /Annot /Subtype /Link /Rect [189.750000 610.250000 283.500000 617 ] /Border [0 0 0] /Dest /#8d#21#08_#eclM#0a#f2#2b#dd#13#ab#21#a7N!#19#9e#0e >> endobj 3255 0 obj << /Type /Page /Parent 2 0 R /Contents 3259 0 R /Resources 3261 0 R /Annots 3262 0 R /MediaBox [0 0 595 842] >> endobj 3261 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3262 0 obj [ 3258 0 R ] endobj 3259 0 obj << /Length 3260 0 R /Filter /FlateDecode >> stream xœí]Mä¶½÷¯ès÷Š"EI@À»ã C€Å.ƒ‘C`Ç ÛÈÆ‡üýtOK=3R?J|*–ÔÝôÂÞõhERÅúbÕ«â»?þÇþ_¿ïß}øüŸýÝï>ïŠC]çö§_ß¼þAÙº?ïë¦ÚÿðëîëþëîÓîÓñ¿_wç>øëñOÿÛ—û¿ÿýyÿýß?ü±ûK§¿ðë®6õñ÷_žoksüSqùýôóïþö‡ýo§ûéºÅ¼ýÿoŒ+k[Ÿ–11õ×]ÿ™æù×ï?ü¶{w&@Ü,eS¹Úí³Çÿ´®Üÿ÷Ÿ»ŸŽôÇÖS{WK&ªËç™|»7e{©ö£‰ž Ÿ`pï\ºÁŸW.Nc½ .¹¹¾õŽÿ& ÿeøƒ7GÙOÇ9§•‹S¥ß\<ºäæ¶U“rs_†—ÜW§ÛÜç•'Û\<ºàæúÒV 7÷Õð we:µ|^yªÍ Œ.¹¹®îôfeÇÆ]€þu:µ\E:É=¯\œ*ýæŽFÿ3 ^Êù'À/üxñý—ݻƙ#1ýþËOÇÅç|þíË‘(Õþ›“¯Ð4û/?îÿXöãŸö_~Þµ_VýÏOŒGOJŸ´ñ£>)á8Oñ® Oà÷Øóhß}9nlê=©Žb0µü¤¨%ŸàyÊoã)_Â'Ňød¾<þÉÀ'ßó`!´³§ ¸WG6Kßk„'ÅY]Õk9›a‡yîªÁ2Œe sž‡aÌqy$d8°(u ÂÒ€i u#U+i¸‚Ñ}xm„VÄ£QœÈh_Ù/Å»¹ŠÆÇ±ÂÂý¡ì&£-±Ý¬-Xcó9ãòĶz”÷¥É¾Ãé&ö±„’š}”œe¥PóQg:‚X[ökBR²e¾Öð*Z`Ø\q6lµËâÆl٘ゆßš¶x^éPȪþ•Ù¯½sf=wpö )x!”§mHS{¨œoêj¼wÍ¢ÕçÃd«á‡Ç$€ótÜzí‹ñgàÑÞϧ^,žŽf¾N<"5~ó&5ffKáwŠîÚª1eá<š‰cü¥xLƒù²Á| ÞðFáæÌøR‚øF‡ÛÏÐÍš¡„}Hmª¢Z$L:,»ÌF ¹ ¦–ÀÈÊGV­+¨VYãˆ)ʨ㡿ØJ ÿªl~ …«¾ù«Ç;ณ”êR’ŸcY7ðp€ßy‚+€ksý‰¨öÕà{˜CHr£Õúá1*B×2äÆ’Ê¨"÷¦C¨uÙöÎE^‡Â9D`1ðÃH˜Ð&OÁ!M8PíšÉõP!6¼†ÐžPÄ/H1OJÌ¥ã\šBRu(ßøTÔ„Ì4Eµd¿E5L`4œÆT„Àâ4¶'OñGi&!Æ„úá;–áXE­Ö”N[«1{‚)%£ ÖDñ²Ãœuq^Ê$§°ÆÅOðhPÎÖ—MLk,3š†ÆÙ\®ju|)>ëD¬5½3T|nfâ6TŒq”§‰¸ÏÏ~9¤§HÀ„íssÎfo9È)Âø‰ñ¢Nv2iPÌa[ñ“Ó†WŒi‡¾ÞÃ¥bSŠyÙÔCWšÐ³ œ—±·-E,G!†g/d©Ye‡éƒÏ–„s+¢ncâ~¢ÜªË );_¸ë:ªVW‚àäæTú"¡”Ö ¥D663⦑ï‡ZfÆíU;®òލ[YÍÔ¾V¯ÁŒú=™yd"̌ڙ.ñzÍ„2‡LÆHmNšeÆ:Ð1–¥ˆüUã6RŒóHTµ,Ðw–P3–Г =ËÙsŸáý¯;ߘ×?øe÷9Y³7$ü§%¼þÍÀ›—åB7Bf’ÊL­¥Ž¤”QD0œ*ó!² ·Æ€€ûbèÆ2Î*UBåå¯TÎã½a’œ°ãøîQÊÅdP#ÏkøƬ%6DÌ9{ʳ,VLƘˆ0Fr5ŸfVÛö¬.ô‡÷†Ô±ð{,Ñ¦ŽªoÁøè\U¦YmàZxš“©ªÌ—*Ï\U&™tœAùEŽŠø~_,ª<ÌUe!ŽËUeI8vQÅf®*ËUe¬ln¼ªÌ›EšVÇ\*CµªÊ¼©{g¨sLu(Zû6ØÁd„‰€øÑ‰”hu„dâJãøiâò¥û@GæBÁ9ß•ƒåAAN+iÄç†ëÖòu•©†¦PKÌ#úñb”eTS¬ŠyC ”K7[¸Å¤Ÿ¬]ÝÛjã<šl…ìc"Î!.¥ùð™‚ÑŸ h~¶\¶z:õ¸ábó{­…Ôò‰»Á´zÕ‹škJÖ D\ΰeÛáTk„»8^i.¡ÃGM¤¬—´~@ÝÕ.KÄ¥'«ß\0Kó%m­°Ealsúflzc‚ò7tKRÊ ‹iÊ#G%âœ[xNÔÊH%¾iŠ©‰ø¿«GÝd‚Þi-D®‰ÊŠ(B‚}é{àØÃy·|G` XbîEÆ+Ø:XíÔ†f’— ”l uø^%Ÿ)_Þ <̺%dPrˆã2(9 Çú% ý3(9ƒ’YÙÜ:(Ù6å.×´:®0â³N€’]åßn‰)úfÓ/L±ZÇz­`ʽb@#Æ¢1û›€ å+eÕ˜+-B—éIøbfP#D·ŸÀÌ&a¾®nÆ…IFË8n=_=‹`…µšøË¦/f›ÙîÈ"’ ‰sûÔíóûê©åö×Â0(86º]½·«¹ÎÙÙ½5«ÙÖfh5ïÌÆIQýˆ7Qâ~8¦s$£•©ûÚ`‚Vƒ: J%2ßBpƒ‚ªè«Mö‰à¤ Š@è–1„ð¹ |˜ú.§A"šÉÊÕoEO(íHqiÌ¿ /â°{a XN˜gÁÒÀP'h‚£áUwÕáXï§%H1õà‹ ì¾‚”ƒO\Š¥ó<æRB†Ù p)¶ Ä—J6èÞÀwX†;‡çÁº‚ð:‰bY ’¸Šb›ù€-bN$¤>Àט¢„aü€€ß‡9„€ÉÊ\¡óeYÉPã 5ž¦ 5Þ<Í»%@›{„{oP$CP¾YBEÕ“W»¤Gv†‡8.CSplm–ôÏPã 5fesëPãzxÙf­Ný‚ûÕœµ}ØÖ)}âÃ:ï³ Äé- ï6am³¤°çOU]rÎ̧ª”¯–œg5-MS'ò77|ª2xmDV„ÑÙùì4É—úX·yv–œÈã1>%sÞÚô¹ŽÈ:Éj‡­ŸÞÚâVîLkËzYݘŒ3æSOtVêûF²hla…O¢È*ßÌ f6Œ£DÖ_…Ù6ÓÑ”Œz,2ê1¸j9Ôcl5Pmù[Ö»v+A¿Ucìþ™„ÆJ3¨Z)Ñ;“°ûk…Õð®*SÁyð;>ÁïÀµuBv­~¡…£¢Öx¸V`à¤Øvˆnªª-a È‚{QÒ*õ²4ƒÏ{¸yB汦žÍ£ëÈ5kå"þÀ ¦q&uŸ®©elÎT rB{Ú´C¯%‰c{ë[D݇U9ÑÈ„‘nÙ[Ö 0 r“­1²í(«Lx5Öyœ«O™F=¸oæ)w#y3к¨º¸ƒÑ“3 k±aH˜ÜT3¤a ›[Ä Töf.Ù«Œµ$ñæ±ÔbMŒç¥ŽˆµéžF÷´ ˆÂÜÔ.ÚO¦/+s±,Q6|%¡r/Ç„Vëx†Z~â:刾„T7Ïù탫׽\ü.²ÔêÎ~g]s3ñF‹iüץǣ‚=.6@R:˜ÿ§ì5ÓiïFÚOW8Œ¶Ø5*)¡‹Èº0aKü]õŠþuÏ”@p2%ÄLŒuõÚ‘›Ð LœÙuH°1ªë."Ð !»º™f§{@­ÄmLĵ"85ÿ–‰É>ì)mwN Ž§D£zên±z…foÚ«8:ÿLóÒ¤â¬/Lq8gLGò{íIÝ}@9ÂFâÑà;%ž§Eït€]SŽ®ãêð®'=ÛÚ·lÿÎó=é4âµ/-á;®Z¬\m¯©†ûkᎾàLú`…ˆ£G…v$@)¸W¦ç–FîöYÜ^¿ó® ÒÏÓÅïe~Æ÷XH7Ì•x4Ìý&¿B¼§êJܼtâPÂvܹÓ|}<¯ijÁyJ Šb¢i¯òMTÉs´C˜ÜSvÈvÔu-Äb©ûÐ$cx©ËJ%®m¢h¾ff©¬æm5X€Ü˜Â@ý˜-Š`J¥<Õj×FX¦ÀwDPÆÇ`Ð#Z¥DfD˳dXT 쪕®$ð‚†n¾„1ª1@â•ë§R^Î×4Cs6?I°bÄmid£ìÎnÚÕÊNQî¯fîLëýË&4ÕÒ|[d…p[Ý·Êz`Ö®‰©·~°g7UN.‹øeN+}%–‡ƒòfŸ÷®¼´¯­˜zìwB*”E= ƒÖYL„¨T}á“އŒEÚ2Òñ61ꢻ ÉbëT5¾#¸êAjdR’+7Р˜àƒÌ¥ª&'Ÿ ÅŠÖÿŒs˜kD:jˆ²+µ·wrNñ–4Sþ€‚À3,4âCBw•–[lû8"v‹©vJSŠHÃ×µÚˆ–®ç•SS‹{§ïSg»—f<‰ˆ±ŒËážœ8"ŸÂÀ½pZòÌ•ÜÌ}Ûˆd£‚>¼êôáIºY]Z©w~ÊújŽÏ@­¶ÒªÙ'ša¬V/'Óê°cb„¸ïðЦ:CÄ=v/Ä.•™Òœm'S@sFô­Ôâˆ-(צ¿HLM¹F¬±Ð2áM¦ŠI3z^ ™s[:{u6;«\4©Ý—Ø80(¾Àæ)5 Úr@—A€¾• ›‘á äËeqDkõâ (]<³·ZˆS¦•Íêæ%€t üªTéa4Fâú¥àåÛÂL“îÞ-Z Ï–ý¥dø8ª%ú·z.}¡¡Xè>ûýnòš¸›Ü–­(•ŸYý@€ùÌÈâæDb¤«¶u~ Øpöõîsj[fþˆø¤Z Y|5VÇÌ­OD»ÙÕÂwTñ ƒ·mL#‰®„R)}ÆÈ‘€—ÍÀ µ GÖõ—†ø‚Íi5åË'­_áL]$Ò,³£,z_ÖǕՀå†ÏB¦`3ÑÌ”ž²qÍv›qEªüD)^¾å3ó–k™+ó6]ýüð÷ )8u?e ¬äSÝšs[gç6;·Ù¹ÍÎíÝ9·uvn³s;Sbìd„‚aBa«w’Ë~ð­ùÁ®˜|e€wÌÞ1…""6{²$øV/Û«†ØØ2³Ìï-›ˆ6œbÅøY'ÜiÎ.9áP»OsEOÖu—î¼Èý–=Ù×à¿ã¯ý×ã‡éòiê/Ì \snöHŸÂœãþ bàÞŸ©P_q´Îß²¿ÁâÕ“ó!֟اî?ºSÄ@{BóØ)íwmm»/Ù†nW±ÆtCÿ #ýø;ÄúûWW>ÃàÑà;n3QŸþª;Ëp§?°ÁJ S²@`4L!È¥Eb w3`Žñ0Ýáμ#põfª«‡ÁX¸ƒî‡+èŽÑ×DÆHVpm•~¥p#¸$¬,0ñ󼊊³¢ZöЩù™2 ÕvùÆàM»ý§Ýÿ‹é‚ endstream endobj 3260 0 obj 4581 endobj 3264 0 obj [148 /XYZ 38.2500000 488.750000 0] endobj 3265 0 obj [148 /XYZ 38.2500000 488.750000 0] endobj 3266 0 obj [148 /XYZ 31.5000000 170 0] endobj 3267 0 obj [148 /XYZ 32.2500000 169.250000 0] endobj 3263 0 obj << /Type /Page /Parent 2 0 R /Contents 3268 0 R /Resources 3270 0 R /Annots 3271 0 R /MediaBox [0 0 595 842] >> endobj 3270 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 3271 0 obj [ ] endobj 3268 0 obj << /Length 3269 0 R /Filter /FlateDecode >> stream xœí][Ûº~÷¯ðs8âE7 (l’}($@Š>9=-šƒnÏCÿ~m‹öf%}”øiHÓ²²Hvc®¨áÜ9œ¾ýã—¿ïÿùÛþíÓ—ÿ쿹ïO_vÅ¡.‹îÏþôõæÇtsp?ïë¦Üû¾{Þ?ï>ï>ÿ}Þu|yúóñ§ÿíõþOÇ¿¿ìÿú·ã‡?¹_:ýÂ÷]­êã÷Ÿ¿·µ:þT\¿Ÿ>ÿ×î/¿Ûÿzšñò:Ìëÿ¿QÖÔEscâÕÏ»Ë2Õùë·o¿îÞv{‹nj«ªýñ#»W­Õûÿþc÷óñ—é‹Ck•ª+[K^TëӛʢÝ+Ý{Óƒ¿d¦W&oš&ÞägÈű¢L¥ü³K÷8U‡ më(ºNÿjêxÄ=C.Ž• qñì‚ÄmLaœäV1ð>ÆäUqò3äâXqÄų«yµ*«¦ÒGÓsh ÓýwÙjê“)8ËðÑÊ#ë:}J´§£‘ù ¹8V.dƳŽÜÛý?“ïnÎ8;¡ËªãÏ1µG«ì…îÊF üËô&×e<§¢ƒ\+Ž­†³™ƒÒ}|Ógσï¿îÞ~:¢³Úýù¤ÂÎ/<ûú}gÍþÍÉ5zÿõ§ýï‹¢,þ°ÿúË®9ù´Òå¾nD8¢ÑHññŸ­u7¢ÔåÍËÔ¨(äl™8jmÕ3MC”Ðé5™Ÿ2ô‹iFŒ0ÚÊù&ahǃª8Tµz%mêÝ|ƒ:0úXIAü ÜZaõYzÏ$‰üiž‘5ÓDÌBÖé¼:kï-«÷ð‹±…ÅèbŸÍ›J#—g¶èÖ²mÚ¾µÄ+@7ÏfÄÜ£¶DbâÍX¯çùUl-™¸##²„ÿ¡ ¨=È'  ô2ßìs¾5áÆÊ³ÇèbB®‰Œ¢‡,ó2LAO¼›‰XÌ·’”Ž~0t ¸õõ;yCXAìÆD —Çób‰×—'"™UYõèœÌÇņÙ部ï…#’"jŠ9b ˆ&Å V16‰Q²!ÑL¼•U¢GW"¼44+øY,y©Ÿ²;ßI­êÌ<ĶêˆÙ”3f;¾Ù©Œžmv<"…78„ãAm˜0‰ìî2²ës{·ÿ‚ÍtÞö`ÜC3FÖs›Ü"Ì LS928L{ós5ûQJ)«  Âê.?§´×ĹOŽéÎÀ¼"R…F\Hcl¤ ŸÍvlDÃøžâ=„ #p=ÎÞAíÁ†|„#r\gbcÔ)¹0jcšªpì`šï©íp ¬Ô4÷ajaÚcjAŒÈË>ƒùEãg0¿`:bþg¸ÀµÆ¸¾K`š,mBÉhfèåœ%¾Ç` „9öéÖü",3+ÃNöÒÔ¶÷-Mí=Æ^Û}JÓʰ“»4Uª¹kiRu8M<»bÂpy*¨³ç>Sß7÷Á÷h †úæü"Ìå+ÃNöÒTVK¤ Ç1 åÅ»Â{¦EϘn“­Ì¡Ë#8Y#³¹CÝ1¨;¥|ÊJnÍ«Ù4Á°9òŽ<ãnœ›íS8œ Q%ÓªúÐêÞÄSäÊênhj·½[ϳiðæ÷«ƒQ,Í ¶S|c³1Ô®àæ·BÐa§>Pv1Æ×ð-æºûËä]]oj¸èôz æ|aLdÍ­{kxœ;% Ü%#z…¥ª›Þ©+‰Ké¨ûUà3!׈ã2 æº%Ù›q9G@ q-nÈåcó+`™[‹©k1Úˆ"Åd5ƒËÔ˜ ºd/#ÊòNm[ Œs¡±6ê¶hÙ÷d/×fîLd0Ê(æéÇ»Y2@¬ã¹gq`a ©¡Ô$³ L ¹ÀÁ£mæ3ÕÐl~çwìò3—.†\I+«Ô á˜ÛxúDÈÞ›ŽÜшF²-«¾‘Ä€còªVöJ`›¢c¥:Ò»¿gÆqw"NÍdMâS#&oÓùÜvÖ)vÖº°=s¬]^B…ѬßfÄÓñ›Çd½O “Rì„©Hg3mãî;”âáI‚Ñ<²Œ¥oÀû©v8)ÂͪnûœtóÚÅDZ˞Ì1±Ì<¤BŒ1=ÊË6£róc„²Î¶'<Ïĵ%vÌ%ñÌ›_êdbÊ(ø1»„©ºÏü5­#Þ"ã\¼˜µŸ¡cS.ÔãCèAgn« to[Ù½ãB¦:|ða‹$|‹•cañÓRØÉY&þËläzþâ_ ¶ÞÒ ª#â{5aÛÃÆ˜KqI ÞðZ¢Ý“´ëI”½¸E8±œ)o!Ëe!m`ÿ8›Uïéã M= ¦|¥ÑBåõ²€íeuü?yˆ†·\FÒHƵ%)–ŒÇá¤<Êí²–—+laµžÛ.ó^€ùE«& Ü𘨠ÿ†@t×á±÷[qøÇ.j¢ClsÌe@\„NS{ö 9k¬‰bÝ ô-–ú›ã:÷"g»¨y×Ú|K4‰ô´œÄ°1Ï0{%µÅ»‰’A»R.jµù(›ÂRaÓB µ¨/´:ÊaMŒ5§Ò˜ ¢ÔÎÝ+µù[›7&Ü k¬2nA˜½ÿ”¼àí-÷æ?å@…œ¥öö áèÏÖ¾R˜C²÷Q$Úâ­ÆGñä5#ÙÛôfÉ娛Mßl:M|¢Ïd#1%lÆÚ¬½Æ‘ÌU˜w˜¶ÂLžë–—½WQKò©äší΀T+ñ·NTªWmùš$ª6Š) ÇÕ$LÑ.è“íßÕ_úd—ŸÈeá¶é‘-ûù0šî¦eá…îQž)7Æòé2©~`©Z/1µjL› ªî â|ÐÓ†jeÐ¥ëS¦'®è³P£óTZ[®ú”¨éUˆ yЖáÜIcGÞ)d 8S³ ÁlMt, *üSµ‡’бTó1¢{2£‡Â»>Þ}«lÙf-¹h˜Í8Ûþö/¶ÿwIù/ ëàkÛ¾–£î×î4Ò–6Þ™†+ª&®ð̆³[ÖH“¦Î‡&ÛÉD&\ÑU>\gíÇ£w«¤°Î'¢jqÜžµPý[ÖHGkó¡ãÚr¶sɶOÃI•Ɇ“°†ù…Á/Îxó\ûËøùkÔ<9µj†xòGÏ{¨å=´…ʇöV‡ž†ÂzZ¶r–nêRn"cy•´7ùDï,ÆÖÒDO(‡ŠwŒL^þci‘2ŸˆßVË’˜öu>‘E-³À{<¢úÖSuÃìhˆ³&;íþ8ÖŸÚæîokÿa ·¹-M2Eš¤ÖUòrUúËy<ÉJ¸þ €¸td-·‰^§9ƒ¹Âóp¥°€fhöÚŽ¦Î«N14×HÍ»ëŠ:”õyrl¤#Lup–°è/`ì™=ãê+UsèViWv0b+4›óÂÆ xB#Žªõ¡mfCíLÂlZÁõè õÕ”ó‹[ôŒcõ‘÷8^YÖ6ˆÇócPÕ:_¿'"ó­{Ü襁´Ê3A+LyÌ-‰y<¾Ç¬®-v<µT"yü7¿èLöZSÙ;•<8HeŠç;9T9ã‘Iºäct¸œwuÁY@þªèÍ]TE@ªËÿd/7fÒŠ™J-v6D]7‡»ØúÌÄ\fíAWüRªRõ,ž©øzq‚DØTXn*Böì`Dz]‚·Ô^O–T/s–B ƒìmêLUÙÃ_«TЄ!)g&B*ŒÂöHW€Òžî“w_ĈˆFh·¢Â±kâÚ¦µVæÍ°ZÕ.js 3ó4sÉ#“üH\ö ‹Q†/6ÌiµZÒžž9Šõ´Ô#Ò ¨vM˜Z)1½.7U V·—ˆ »%ÈÃðœÑ j‰6?§oÕp£!æ BÖ9xx÷.®iÕgêl|˜gÞUÓ[5µ¥rÛ½‘˜µ‹f—‡¢íݡʸ„ýõeh§C¹ñl‹‚{˜7‰Ø—ì^‘Ù÷1 ˆŠÆ¦U1M^ÕömÓQwÞ`º‚0â÷=¦g21<À2Ì(9g^LDf±ó Ò;…¢Žq`å$rÖ"›Ò’_à–ê+¹&Æ£Zõ`.ƒø£|‰D¾q†èŠrö³î;‡ŒZ‰Ç ˜‰¬ ¬)~bû‰sæ+&{¸K k¨äES"d{ûQ™7‘!tbRdÚÀâÃLØÿóö[ÉIw4~`Í(ùXä°’iµ=ãÀX¸ÁôÂË·*HnU•=z{b“uÌÎ@tSB<æd›‰Š0ö’qIîi?²!ÄÎ'ûÚRššˆH ÍôóÈïüuyÎLdS}œ$¢µªG'ª^¹ë`¦Ôž5UÈ‘E´°•mûU†j™8ªŒ}¬q«èmϧ fâvúr5iS[{=ögD„ÑAŒçféqDà1rÖAì‚ZÙËÀ¡—MoÝÁ‰ä23—P· {37Š¢Ge§r}nuU uy†hÉeͲ¼:À6¦g´B èU&åš™àÉ]*KÝwp[ѼWO¦*|Æà®)¸Ï î2¢ãï!šv©Pf_fW'‘‹¶Û*–„â]?n¿öÏG¾ô²íç©_˜Á×Íh]ÿq­…:Qæ\øßÁ­ ú;¬GÖêºôù¼f¨ªáˆKQÖ#­è=fÊ ƒí“[)bNìƒØ ¬rK¶!ÐpúzÂ$,CáÙà3N!¨ ¥×/lË2Üéçâ¥Ù-v‘ p 2‚X@W=!]]$h w˜}¶ñó+$ ÈŒq2f( ìG$™Î!{Y†³ÉØäŒ`IMmÌÃx.P*Á6NÅ©Á3HY )ÓðÝ"!® sp`©4›<·I+÷yÿy÷ŠÏôö endstream endobj 3269 0 obj 4605 endobj 3273 0 obj [149 /XYZ 32.2500000 245 0] endobj 3274 0 obj [149 /XYZ 31.5000000 245.750000 0] endobj 3275 0 obj << /Type /Annot /Subtype /Link /Rect [279 368.750000 360.750000 375.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_ref_unref >> endobj 3276 0 obj << /Type /Annot /Subtype /Link /Rect [151.500000 58.2500000 245.250000 65 ] /Border [0 0 0] /Dest /#8d#21#08_#eclM#0a#f2#2b#dd#13#ab#21#a7N!#19#9e#0e >> endobj 3272 0 obj << /Type /Page /Parent 2 0 R /Contents 3277 0 R /Resources 3279 0 R /Annots 3280 0 R /MediaBox [0 0 595 842] >> endobj 3279 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3280 0 obj [ 3275 0 R 3276 0 R ] endobj 3277 0 obj << /Length 3278 0 R /Filter /FlateDecode >> stream xœí]ˎܸÝ×WÔ:€ËâC/ 0îvÈ"€aY ²<™ƒñ Î,òûQ•¤ênJ‡O_RR•ldÚ)uQä}¿ùþÏŸÿqü×ïÇ÷ŸÿsüÚý|ø|ÈNežµŽç¿ï^~ «S÷ïcYåǯßßߟŸšÿ~?´_øüð׿_ÿ;êã_šÿýrüñï͇?u¿tþ…o‡R•ÍÏ_/?ëR5ÿÊ®?ÏŸÿûð·?;¯Ø¿®ÛÌëÿÿNY[”õy¯þ~è©.ÿúÛá} €°·èª6yuTÖØ£ª­>þ÷Ÿ‡Ÿ›ôËg§Ú*U¶ÌÞò¢R_ߤëÖÅà=—¿2««‹[câ-~Ù¹4P”)”wqIÌÚªèÀ£l è_—°x^×éæ¼sq¨ô¸Å«K"·Ôe † äAô¼|„Å«<"r/;‡J\¼º$rë+kEAnsëL©ˆ¿ny+rñêrÈmt^ä Õ1àß/¹¦Œ†ÜnçâPi‘ë[]¹¹Ö-€ò2„®«Ç·—K¥G-\\³EQD³“_¬ø¥Uñ¿ì<ŽìYüTÝøoòÕÕù½•i€eMÓ÷ª³5*ÐUÔ\—€w¥ÎÎi,¢ºì\*=UáÕ‘ÛØAe<ñ¼z Üê"žžiwI` ÿ²ÞIû ˆü|÷|ñ×Ãû§F’4 ,Ž_~nöÖ¾óòãK’üøî¨ÕñËOÇ?f™yúÓñË/‡úTè¼ßbûDUðIždøÉôÄÀï¾]Ãh¸š ß[á–}„OàyL»ë_Šûó/toÍñ…Ÿ`(êrqøøã>NlÖâ¤Èï•à[à6BÚnöpy§=YÓÆÿŸ÷Ù>Qê”Û¢jº0¬NUcžáRb~2ºR¯žè‹Õó¯Vîp'\FÞ§~pQðW3ã¾Ï¢÷uteúƒð=gÓx‘,GO†@ÂÇyHÀ‹º¨f3c·¡ VÀ ìiï‰È>Æä³ÙÇC‰%$g»(ºM {±|ÃZJ>¼†z [/–°XWW±‰Ç®ìUPâaYø|Éʳ–äP:vXû&y¨Rék¹ŠÈšp´ Ü£Ê<¹Ê‹‘.”¬‚dàQŸóu°‡–0, úôl¯†¿ƒ©,OÐ ð@i`Í7•TK‡Êô0Lj‚ß1˜TV8ÆJ•'’íUQº²ÝÀ} Ãßaî¡y­Øœ-g›³“È#üùˆbPO˜cy†%ò"L6FD芹˜þ0Qö•í#3e‘;;`ö×§ÅÌï?Ø/…ï±x]0.Wõ´óq›Ÿ bF<Ù@p1û“Û{’á<|ây!C0/èˆó`þÁ¡ üó)\ÁrŸ‡]ˆDH!ê9)!¯=XÀ’VŽ¦Ñ®¦Úµë›äÆò»Þ¦æ÷È',‰! Ü›§0éŠiT3²†𧲋nM»ît½UºöÐ(Ñ Hò4ú=/wý>ƒ*p£]={ÃeCP¢`9¸ûÈû“”úÝ`ïL”®=癪ö³œ¡Üñø®PR¤Ò`ŒïÊxµ)ÆØRØúaôXyÆ Zý[±–˜z³¤­Ò)ŒzMn*?eµycj5¦ â"¡*œÓÝ!³þ³Ò.í0u¥›î¯âêOÊŠIfáÝIh¦$È“œ#xO¤ò”*« ™<KœD*u «vÁ»†Höœ‡È™0‰§Ò R±Éx³Ñë`léJo¦Š‚ª¯ ˜!9áz1¢ˆ.¼HÙd,Q£D^âwCˆøüø„‰Ì(:ag€)ïÅ€L̯>–Ó¬òUÄuÙçuéë Þ0õƒí! •0Á#ÊʱE‰¦ &ÛÇ#Ñ2î‘NŒ1Á´%HØToÈâF=Õ4ˆ£AŒ0'´âýT­…°f<‡Û„[DE—7ÎÑÝkq‹æ>B'B¶•‡D¯G<âåñ“ùæX²5޽2H´¿/±>‹œ÷Ö…Ãú{â[0H¦µ]ʵC¢˜ ç{(6‡Êý16ü{Ÿ´êËS»Â®oŒrøüXë[Ôì§â›¢q¬e#Û©¨º TÏ„³KE9®Ô…uÙ2nhñ"†%DL¸a k±DeŒK‚³â†9ch{Ê©ReMt±lîÒ¼íE©FcµA'ð¤pyc=`=ÏsdºØœ,áĪHX>­¶—Š'ªx¡f(’¬¢•62êÛÀÅ$ë/¸Šé/çÚÑ’›*åòLÉ\,+Îd«#óð|”R…È8Ô›( -›$“µÇDŽER£ÂÓ×dkcæWmMŽ˜Ð}£Ò™ˆ ºxa™•“è^lŒ¡l!å¯/Þ•x„k4åP¹ˆ]Y"U[÷߆‹0µ•ñ9=]w°Ö•éc ˆqzàG â¥ê!e=£€>PŒ[ ”Áòký³XÄ*GIîCeAåhY\92€c#ðà <ìÂcØÁ‘̨H<˜JÖèTxàsñ‹èÀ(¡Š~`Xãóã„ðw,‡’ ÖxT ÒÇÈ0#ì0 RÞÿV–ýÈée~ÌØi½ïœÃ[žá3x8æ-ˆ{iŠ;2'BcÕõÂZá+Á–ê< ÉÎ^$k¾J5Ó!²#}cc3ðÞ<¡1Ì5»Â[«)Ë[uÈŠxÏòÄ»n¹÷e>+º[ë'£*ºè\ÖW÷½Æ-U³M”á‚A‘u@n xE:“×l(P!~¦7Ž!7ÙŠôõYk6Ò=Í´Là‚•ïµqêªkEóѸ¾I¶ÈåC™V.26[ê"!1gguå‚j`$ܘF̰O†e‰ï¬¦MiL•Ýf3Qüxf­®Ü}#½HÛŒ9l©„$Ä5Ķºèfk"§ ßæDž+âúTÑ&žÁ9PÉħíó§]j,B´ž@C"Aµl0âRÂno®VÚ%Ð{+]‰Èý&«è2±ʘ$˜› kÃËÃq[b˜GÂTy‹–ŽPÓ中:äÇàg&LèêÌìö÷ y'+W3<ÃãÆ4bJûE[5{L—ئ$¦B¤¢$Ï{>$„üuÒî¦À˜ï=Ø‚öà^¬kcD®Ó•<6.ÆÝnsÒ†ð°&9(>ܰæÅßaü\¬u0~ð<Ìgx‚ üŽ+žæMó< Ò‹‡.ñ0ý‹Æ+RÊ1sPÅȱÏÍÕ‚k¬˜<MçKí§siÏ¿p§VÌžÍK«ñKè ;ÿyiOæ2JyÂò5ÎŒïO•ž,ÞÆæ)mc*)È {3{<ïyñÔ<Tš¬v@}ÔjøÜ•›©Æ\l2”è©Íd.,"¦©_ ¸…-‚™ªªdÕ|²FTw ßÈ´ÍY˜ëŸu4Ûc›éê)OLšdé˜Eöõ@3£adE¼s3&Ѹ²|ô~ål˜c#ë¨6WÀœÉdÃ}D&EÅcIÌ*‘½ “*âeñà²òøå/Ö$·Šž ¯áÀ 3éc!#€2˜Û£«_eÊÙpßGCÝeLm“Q‹[‹®Ú»e5Ïu½Ž²íݲ~‡Çpr*“žñuŽå=¾"-ô|Eº‡uî*¬“è2’›ø–êÖ€D|j‹î{88ÙåIë•á'õ¤qòŽ NáI=ïÁ'¥ø‰EÝ üxæfá¡ËGQÎñöਠÝuÙ ˆ'æ;½Õ,OlózùÁ>{<0¨¶€iõbÚø™ë³‰¸:uÿK’„Ý’!xŒ°E†ù"Ÿe‘BÇÆÌG)`E}g}'zŒÉcxÆ’ÓÓ>K(4O$cƒIG®ÛftìæùöSÊÜQQßí=ÍIà[ªjz?+Εì™1 ö̘xf¬,¯&@Ù3I¬¥$î» †U⌆,“WIäîËŽ‡Ç¶Vªû;†åqL—ƒH!HÍ:O%˜8Òv´‰¥ÜUZ½>â™_¬ÓšPÀ'-§N½8ÀüN¾Ó™ Êž@Z`dµŽ¾Æž´´RžêÊÝÁ#zÏõÚhÔo4öž:ü¤ž]gpo!tð{ :N ‚5~miG«añX ±°bœfbJ±Ÿ)üñÛÉš1ü2g{‡.ÞÁRã)‘aTýÍxºáHß¡V'gŽÄŽä9§óø¡Ø×#ìpïŠoiÄÞï‹Älá,ÝÄAâҎΪùij1‰ÇdV‚xïê6jÀkÌLÆÔVuÅd e©†šæJô¥0™\¦$ÔC¦ØÄ{cjCEF'²ç-ûD³*é¢ho¬©\>'£ãW‡éÙ2w úÀ>vÜÚYø³ô–1Í2’$$^ ´øèž€Y =¢è ¯Î]3i£(JÝY‘hŒ9ê5–*/ ñeÑ&—NSaï¾ÇÓ¸ÁØÑ›œ¾p‹’l¥ð]âq‡3-ÜÃd £ôÞ'ˆVBLäÉC”T,¿æÙÕó *ªsÍ†ŠˆÜ‘ 0ܺ| ±r¶|iKäIhÚ8¢Ú¯Æi•ÆD0qá)ÉÂEGñ'®e¥Ý‘Ëûx÷õ{uô,]±OyIQIZÛì„FP…gWp±±\0Þ5®¯Äuœ b;qªqì Üµç ¦7xRÏH‰žóá†1×]MF:äõ4%aœUÞóæ: RVo€óDc*…GqÝ¢µ&3 _—o€¢« Ü©ÊTñ|‹J¦cÀEÜOû[ž7«V®khgäv+Zç¹Å)á[›?»ÿèÚCa'…O<¼¡ƒi¯¦sIî¤z éÓÄ~7–P©z•z®ˆÅ×™¥C8‘À±CjŠüö¢ìªrñK{KäÅǹË7ÕR»,¾·¶Øb>ñÜhò¥¯£ÎÌÓØ“õk0·¿µò"å²íêÔ(Ù;žo¼._-‰1©ˆbB™É嘇âpÏ"O™‘½[`í­ß½9ýM»Ê7aúZi}=)vʉÐ4Æ)¶ŸÃÍ:º7ïB :ëçF©`ÓŠé`2p”F:˜kúú~¤Ãmº»tØCÑÑ%ÊD€V×}.(Ù9¢KŠjוõtp¨# Ò³3ÁÏ,},¦*\cNÃl¨gç鸓>¬&,Ê€ánÑk%”²Ú!f,Pê²==ˆÊf°ÛbF®.Ô…ÝM¨y¬d¬«€â !ÜËáš¿ÇïÍ)¼‡ü4õ 3 Pˆ²ÏÔyã—éíg.G˜µ›=?¼P¹ËüŒ\µÜµè‘;Ô{è=fJ*íí©;)š€CÏÖÕ8æ=2°½#luboä ¯¿ÓÉjtôÑ–àÎÿnvÜïËx‚4Ä&Ûûý|Žxc*é$êx¨¤rˆгYHjŠá%xt / ÷#¬êdÊjóJuªwlokF%ÆÜ”©=ƼÌ\‰ÆHΖ°îûÞ$,ÊÌœ:E3SjÀC¾LîNjÓOÇO‡ÿàŸ=n endstream endobj 3278 0 obj 5571 endobj 3282 0 obj [150 /XYZ 38.2500000 421.250000 0] endobj 3283 0 obj [150 /XYZ 38.2500000 604.250000 0] endobj 3284 0 obj [150 /XYZ 38.2500000 604.250000 0] endobj 3285 0 obj [150 /XYZ 38.2500000 421.250000 0] endobj 3286 0 obj << /Type /Annot /Subtype /Link /Rect [151.500000 428.750000 216 435.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 3287 0 obj << /Type /Annot /Subtype /Link /Rect [109.500000 315.500000 155.250000 322.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features >> endobj 3288 0 obj << /Type /Annot /Subtype /Link /Rect [274.500000 315.500000 349.500000 322.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 3281 0 obj << /Type /Page /Parent 2 0 R /Contents 3289 0 R /Resources 3291 0 R /Annots 3292 0 R /MediaBox [0 0 595 842] >> endobj 3291 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1701 1701 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 3292 0 obj [ 3286 0 R 3287 0 R 3288 0 R ] endobj 3289 0 obj << /Length 3290 0 R /Filter /FlateDecode >> stream xœí][¯·~ׯÐsÈKr¯@PÀö± ô¡€a}(úP8M‹ êæ¡¿º¬¤#®>îòÓË]1Frñˆ—áð›áp.oþôùÛý¾}óþó¶_ûŸï?oŠ]S§¶‡??¼þ@·»þïÛ¦­¶_¿m¾o¿o>m>íÿû}súÂç÷Ùÿí[½ýóþß_¶ûûþßú_:ü·M£šýÏ_?»FíÿV\~>ÿ÷æ¯Øþvèñ<\?™ÛÿÿA•U]‡iŒ ý}s^¦:þùýëo›7'ø¢;eöŸªÒ”[Õ•zûßn~Þpî¾Øu¥RM]6Å#5ú8RµDwûQ‹n0ÐñL÷*@çU­Ãu~œ¹8U”©•»wÉÍ­UÕH•Htí>@çnÃu~œ¹8UΛ‹{—Üܶ.Bnîµûw ×ùqæÁ6÷.¸¹º(ëž@M½ê>@çZìü8sqªô›ëè]rsM}&1Htí>@çe–O3§Êysqï’›[u=nš",_»Aÿ¶ ˧™‹Så¼¹¸wÉÍíê2$,_»—ïÜ(®óÓ̃Áò ÷O>½à©œ>7ºïŽ/¾û²yó±ÛîÝ—Ÿ÷3; xüñåÛ¦ÜÿÏAÅßk_~ÚþXJýqûå—ýjvF·JWÇß;µècK»k»¢Þ7\[ŠòØRîJsº_[Ìé;—t;©Ž-fW•uÛÜ´4è;ª†½½‡Súpl©Îë{Õ[ÇiáÜ0QZkéxJ˜æ¸{Çn@r9ˆwoŧ|ø²?aZëÒâhÝÂÙ0Ô…kÃìƒYN†}p'ÌÀxœwö”ˆš¼.¼qÌyToí!àY `6C^Iœn…eÁ“K–(Ê-xð¼Á3 ˆ¯O-Jš2Ž…Ô¡d.î KcbœQ!âw ì#0<|{Œç{Ž•é;k£µ%X"ÊÁyÅ!È1 ºÇ̃÷ôÙc¼a¤4¥baZ`îÁ§pºBmî O …nâ;êÅ=æܪØÕºŽqð¬ Ñ!Ë1l ci–‰Å€Ä­3ƒ‹ŸÆÊðq‹/6•ê[nb"z\úeËç7€9™V#èÐéáwW:Ș;kÒÆS{^ xtζISB…¯æÍkäáïË„d¡4iB!V¡N3èvM]Yëa¬ÊÓ±öéõc·TÇnðv§€8sÌ·@C©Fx[§kx 邚¹US(Dñ®´¡]àÁ½…Ôü«žŸ·ÁŘiìÅækÂ"Ÿ­üD¡¿2š­Ã¾Â¸Rgç†ÇÁ³ÆÔÑð;ïžµ-Ú·1Ý|€wN|€Ç§Ä±?˜nïý׃Ïi¶£ JYÔg^Æë&ÐÁÁÿ“4FL_8y¹„ò9ó67`‹y‘Çt5:ǹÇȹBãNƒ"eùE˜¥<©˜³ƒHƒ8”¯ÍT4/gÚêGN –.c-QVWjšV¦{œ>~ƒ% ¡9N$ÔŽ<‚g€[0/bê`àõx…å£Èêµ£ñÎz†G¹«î,Â(ƒkh{ KV~C:•E)ʆmZŒ%n`%l©>žE+ SÀ½ lªk‹' 8[hç ŠÏE# ›<ôï'Æs˜_–Ú1ƒsH™UÙ0Dh-í¹5Rk´‡QoæyBã猾Óeõ˜*Š/1;ê²]ƒv–M“¾I¸Ûø2mðõ—¹|âK!¾¬á–bð ð3> Œá‚0,ÀÈȘûîµtq°>?úfÌ8˜q02â]Èé¢NØÙæçíŒ7½e쌆N|„tðuDlг FÆÁÅâ áîˆ{[æ9ËRÂÙ’°”C»‘‡é¦¾ ÉÆ?ûÓ “)zMøÑ„yI†Ø[Ÿ-"ñ¶l̈ˆ÷°¶1Ýlþ2ª)$ˆä'aƒµ©oK‰?r˜ã:c,a‘íqN{BÊ9öÊЪ…REmë©ÿ°çD©Ò^9•|ë0Ócö«= 7\¥½ìŒü«½ ljµˆ`¸»íu\²#E¼F‹ÝKæ44^á`%V”àMÙ¼Ž‹aTŠ5kÇw0Va0Æ×Zûžæ¦KA‘ˆKyY÷Ü\ÄU#6ÁÙ÷Hl,q eòäÚfñ¶¤’F6¤5д–HÌá¦NKϺTš¦{õ©›Òâ eãÇn¯Çó_©eÓ¼üàÏÔ«Ê;ZmcÇJ¸×v+ˆE· 7‰fŒýjmNžû’+Ä]øúK@‹^†¢áJÖê3Óêc8ë¢YEúÍç~è`œ•S±Ö 9g»oØ(ö Ù&Àis³îJ›}Lpö1…=h„h7SØŠpn‰d-5¬ÈeV+&Í ¢¯érL×ÒWš@ ŒH¾ÊËl)`!ÜÂøZ2|à(—€ñ€ˆÓs¬'ý3‰Ke9÷,“V‰çEbÑ’æ±JÀd$ÎHœ›sLdF⥮tuHÌ¢šo3‰AâjÏ‘‰×„ÄÄÎ=ãXG‡™1zÉÝäò'K_éÚ0z™H £™8ìÄ‚³]d¼x;ò„Z™ #Ÿ6Q»ºQ·y,§Ç»9Üy%ØâS¾€pÝðé>AÇ,ìF0{Ž€ùK'ëÆÞ[f„§“iŸÊõ¿6/¦ìÛñHŒË=gH̉tÌYQ£l[KŒÍ_ä“*6;÷§(ÇDÊ0)@'Þ •©ƒ…ÉFÌ0KŸ®Ú–\™óÔ)qsDjwdžØ• Pžû‡Ä¿4càòÀ•}e ïrßÕö˜ œFBKÂLäqÕK@}ž½âGV¹I•VFÐúÜôJ)•~Gë)‚鯂䟭PòC ^ЪìµM\l£bÂ}æRÐ(¹ï‘S-É<‰z¸›×Œ_–é$=0¿ßGJ¨>¿Ÿn‹×òûÚ„ÖÆ«… Æv*©o)ûmcLk“:v*EÓçs¸n¥Á8óìuܺLc/{%8ð§Öæö`%:‘[rKê-Â!˜‹TÌ™ &ôˆ)¼Ì VGñd¸R<¦=U¾s.¿ƒIJ^N”¥åG&<Ž“Áð?.šŽg=;væ–gj‘•” 0ÒÄÁ§ö2ÓlîËæ¾]aòYDÄ'Ì£X¯üæà|N1WaꤒŒ+v^hGÓí„ÄôuÌ küo3:ä–4°sR< ¦59êú9ÉOL8…^Ê2'냋°žÆAÕK2ÓXš¢ÃfKЊá±"kй%uTM_VÇÁ§®ÌZ_ÖúÂi}¢ÅDR–ÂøÄØn~SÄÙÆ§‘ðO ,[8 -aAsàÛÚ´ò§²Ò¶êì«ÍJ‹¹‚y›'v+e„Ì-KmÉVÚ"L«TÖ××ÎI3êëkÓÊcaÚ2ÓëËÞ V§-§£qdÎ54+’Í`'¦bö\È-i´d¶xÜh§/•¨âfÌ_8ÏmmÑšÓÃQe³‚ '²¤èŒ”»Å1Y>¹é¤ÝÀ/3µz¤<ŽÌ%aÓ¬Èfppä[û(0Õ ðI›žÇÖaÞÙŸBJ³®´ÄY™ÌeÓÆáõ›«ÃwÐ ~DZ s•^{ /Q(©òl©®…Òa9Ž8ŽYË™aÄ'¡vx䤧È%›œ‘If¸¢\¿¸ÔIgIIFâ9 ÍHd„¥ò£2÷PŒÏ":½{‘›]oq¾W}£¯ËQíŠÎÜô-ìí´“JŸ›ƒ•e'/öÈöDÔ¿¤”4Ì8g®H½5Bt0ȪkÄTA2–p #XïÊ‹ûé@Õb–%s_È|ˆ…M—¤µºçµC>éC¦¦LÂõÍRÔ %àÞq¿a®\„}B„ „-–*8t"¦FSæ@d™uà윙%».Çî<Ù³M̳M6…‰3H&SGŒól uŽ|Íç9ŸçŸçTb:âœZSrlÎZ™[rË(_g_¿øT] c9óZF»Ü’ >­S¿ƒiMì8åœ#(·¬±%ë\Að©‹^É •;w’\ž[–Ú’u®"LSJR1Ç´æ–Ü’u.y|r{ÅU_žÎB8h/à Æáq‚ª°Ÿ3QæÛ£Š8ãé*òƒ—áð_)+@Ëë‹q3f|‡Wvâã3‰§4¿c˜GIl ?±v¦ (¼*¥-éå ŽqUîùá$¯$¼IFaJ1ᙥäz¥d´ '¢bÌG~ŽÉ(¿£I’ŒFd Ò¥%Z™“É`ƒã’œsmñÖcùÂä´H%~Ú+^ÇÁä¦<‚‹–d1ŒñóR"Ò){ÅŠ` k«q®Å9<Ø “2Ä=lÆäSOR2w­Å¦dtÕþÏöû~Îi~û… ëhï-ÃìU¡BDØV_ü+ÜØ“lkîlìéJ«wúx ^iëa‹yé¿Ó‹ÐWL§àQyAãÌ@ïáÜ>ö+Hñ“1|—6Hãdoõp=Oßë¾9!w–¡poð;ýU^Ko®lË2ÜáïûŸgŽ•?‚4Ü Ìå™Þ§Ï'íCoÌ%=ŽÞ9.i-&Ä tL²šbÎ\z¯ch÷Û°¶Ç e›ÕzeìÞÜRÞJ¼sc&Š{‡—™h jô Wi÷X4…Ùõ‚f"jà~¥ŒJÓOÛO›ÿt®'` endstream endobj 3290 0 obj 5106 endobj 3294 0 obj [151 /XYZ 38.2500000 624.500000 0] endobj 3295 0 obj [151 /XYZ 38.2500000 624.500000 0] endobj 3296 0 obj [151 /XYZ 38.2500000 176 0] endobj 3297 0 obj [151 /XYZ 38.2500000 176 0] endobj 3298 0 obj << /Type /Annot /Subtype /Link /Rect [300 153.500000 348 160.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 3293 0 obj << /Type /Page /Parent 2 0 R /Contents 3299 0 R /Resources 3301 0 R /Annots 3302 0 R /MediaBox [0 0 595 842] >> endobj 3301 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3302 0 obj [ 3298 0 R ] endobj 3299 0 obj << /Length 3300 0 R /Filter /FlateDecode >> stream xœí]ËŽä¶Ý×WÔ:€Ë¢H½€ À<d`0ddØqÃ62É"¿Ÿê–ª¦›ªC‰§.)RE7ìn·º(ò¾ßüþŸÿ~üçß¿ûüïãÓ÷wŸÕ©kªñŸãÓ×w/Q÷§éçc×7Ç~=|=~=|:|:ÿ÷ëaüÀçw>ÿô¿c}üÓùߟýÛù—?Nôô¿:Õ¿ÿòü}èÔù§êúýé÷ÿ:üåwÇßžV¼¼nÚÌëÿÿN™¶­ÕÓ6^ýõp9¦zþú￾à÷–zе©ÊhsTÃù§ÿüãðÓù—å«Ó`”êZÓU÷¼¨«¯oª‡ó[«aö¢ç/™åU€ÅMS…[üyçâPQºUîÕ%‘ÛÔzÐЀÐuõàoÏllñçKå‚Z¸¸$f»~O£t]—}SC8Ô>ï\*ÜâÕ‘kL?ɵ® þëê!pÛ4M¸ÅŸw. ” µxqI̶U³×ÕC¿íÃiòqç¡0 —ÄlטpªöÛê!€ß›>ÜâÏ;¤jñâ’˜.„„g‡€lÕTM@ð¼óP< Äl£ª‹!ˆz±|€Åëóÿ[üyçâP™p;_ý“Ï*x+ão€þÕñÁ·_ßTFÙ¿ütÞÜøÎço_Î@iŽß=ùlçï_~<þ¾ªôÇ?¿ü|NmÝ\¶8>Qoá“=©>À'5zRÃ÷Tïüw 5zbÞÀ÷ ðÉ{ÿ'Žó@`¸i kŒ9ø  w ŒÿjuCì¾GøùðåÌ^Á9c0…3 g„ã  ˜3ð Q] ¨ÏÚ´p`áÀÜ9°†«9hÂÍñãSbL~ÖuáçÂÏÙó3ŒUÅäÍF-Ò¥êýi,²]ⵃò¤<‘RA?q¬–¾Ä#Ÿºe½),Ÿ Ã×±7Â:,Ò®íÓŠ#Óú!²LËÀM’gÊ“´Ÿ›+„|2UÛæÂÑÆ[ÄO஋*O’—OÅæâeZÝE–i‘£…IÒy²¿'Åæò—ON¦…SM̬ªSÛ©¾k^lsN½m™“Ñc¿Ù7È‹ô§~¨žecHŸÓ>­þâI?cÐ{&<ÜøÌ„ï[«Á]+¸š®àj-ÜÁ[\py {xtøâ‰›“®{uë=aÕ:“’ERØ[/ö„'¿Ö]oA×hH"˜ÒÕÈäúB#kÈjÆþ˜-zƬŒùî@a†ÅÜ!ÊŸ“)wCÐáó(àÃ-UÚúSü°È%„$>ñ|÷ø b" j¼¹|ÂÄBÄì°JËÛHÄzÓÁRX×ÊêÍ™¦ƒ/vТ,Å&ƒC2@>ad“:&ÃŒþ´²W%,-ÞØôþÞ_/èKyE×6¯—w˜’…–vOKŽ­aá¶^Wš‚ë ;hQT€ƒ,ˆÍAÇ>g “ü’¶÷C/a´`Ý!^»Q•Qš*ľ ö°pÆÖºQ;xš •R¶Sä༢’œÃ@„Dïàø™¹te)¬°ŠÃ9aeÎGn†\­÷¦ÔåCwÉ/‡û·^C;@ÌÃÃïäeløøfS]u]±wb‰Æ2ü0IØgaˆ&AmÖnª‡Úæø,{©`¼7˜ÖCoÁ}oQ`ó!ùNÅMÓ^¸hg kAè:É4õö©m º…lÃÏh§D;ŸpÉN bÎÂÅ6;ãS¦±4ϓƒHy>aŠ)©,ŠÙ6börœ'}^ˆcɬó„1Œ¡˜>|Úú)–L±dÒà¹bÉ8÷–²%kP•¬%ƒÓg8WlœœmœûjŒ{[Š"éc+3‹©Ø8ÅÆIƒKŠãÜ[Â6ެ%ËÆÙ^›{Ù+ ¥­¹ÌþˆU§3/Ĺi\L0[§ qÁ=Qªé(›ÁiLî ¦(‹©:‰T”gn×§ÎI¢ðØÑfá±üŒ–<Š–g¿m qð±GéFþ{)aÙÕp³Œ¤…åuPÒ´;UFY9·žt%Ö¶€UE?3ÀÏŒhVú46óÎxûÆg*øž‰Oo=)¡;i Œoím¤Ö§ªÃA¿ni‚O'áÖž´ª-ZdΣàjïÑÞ0 ;´º õ»ëô Gƒ÷Þ„úúªF¦Tq^ß&¢D˜ö¸GŒ8¥sŒi}Á8f&0Õî ZËQÂRðЗØîuÀïq} ªƒ{à‹=z¶³™ ›ˆj˜x4‘Rßµƒ¥ðdØ0'tPĦ?Î:Ü᪑D«ù#9µ1Ú5i¦ÖØ4uü: ÷w“ßö‚ûe}pFæyXMa›y¨v5¦û…‰ 0li…iîr(8¾+2 ‰÷Cg‘¸q\áF(Sÿ)îebÌ×mó0̼뜳TbñÑRtA{Û{m‘X,c'&oÖŽ’ßì6æ Œ#”•È-aˆ5+F&íõ'EXÔhqBQ³øˆá’ŽA‘Äp«;.»5 Ž;¤Foz Õ›M·Æ×Ex\  ¨ö¸ÑöaÆ®ùã8è åÚö)sšxMQìE|‘ô€ìÝ%Å'*>é1ªpJÞò–0n±‡åq“!‡ˆ¦~ŠZlRa“·¶jë¬Yñ_Ê1‰ùf™xè–˜ûDBÊÂ<¬¿æÏ#típ bùü¢ˆs<Á¨©è„¡8M4¾ñ™hW3—÷‰:ÿLdÒᮋÞS‡S<öÆÖ-ÕgÓ6¶­ÀÜ‘8[¥9ò…˜!^¼·˜ÄvwÍì̧BÉ"A¿XÉ{,¨ ±X8BQ̧,̧X·Ý_¤5¶¾ˆëÉdS<±.oÛ.æ»ý}ܣ㷻‘™ñ!ñý(GÅÙìÆñôTî<ëB ÷ÆÚZOLÉ C†ÅºàpßÃëA/6,å8ÕõÞb©iˆòxYj•‹y£ÅÓ¢\r£Û`-€¥ÐýžÒ¸ÜòêժѶ" ßkÕtöKs²ø‹5WmßÜsâ-µÐ×|>ó…©Š-ôÕy¸ݺ­nÕmoq³CâÆªÚ–õ‰ô¥©ˆdÙö%F)†“"ÅüK¸!bV¸T ûd=,ØiøgnEöYrKR­&ýT7ôBs§W.Ê$ ©*$|R&·LH¸K~„á)ÀȲŠ&OñÈxx° Õr$ZÙ-PF„÷¨0~H¤ê&ªˆ ˜†kÝYê7!¾ÜËÔÍ"–JÀûx%V#ÕÑCtSf¨5âØ5|lŸ°lO¶lÑ¢ì`šº>[`ï…›¹5ǘÖX 'O£™ 3cZ0«ÆÙÛÚYg¤S È'\ߺ>€w>rs‹\ #WCN2ÚÖŽ›µçoþ$LêhmQ¦½ÊÝÒUÒNò¼…w Ñ–bNc}¼É±ÇY$ ã þyÁÞöYvQÊñÂöö%ö1UŃº˜°#Z>d7”j,èˆò2ðŸ™1D@ØC ŠH†½…$óT½LJÓÀÂFa™.¡ðŠòàî ôˆô“¸£Úåbuç‹–É0Tµ½!²é¡g©ê-[î%y¤Úœ”+Íc5¾1? ëú£%-Ì).^¾Ö°QúbR–«\[¬˜§ô[’¼Î£‰ë ™“V ø‰ƒ ];.­c®xÆçOþ©‰k'”yAörI†³4Ææ¹,¡ãà9±Ç =¥ë¢§r×Se˜FÒÚUî:í…œeÓw—Wât¸è€kÊG•˜ÅË)Šé3´æJ1Eç*‹‹ÏP|†â3ŸaÇ>CÛ EOå®§Rö²Ô‡Ñ¬üN™Ë¡§,^uj;õÚ7£šS5è×66ìç@¨êË#›•nå@˜:™§Ø–'ª/|Jù™ò¹Yi™›ŸE˸­A¶-4ÅÄv$@f𓕏ñSu„(ñ®þó’‹“‚Ö¶“­sð¸×ƒE{Ue j©º)¼YÁÆÔ–d×ër™*m“;´G+lûc‹Ç@pÔ‚ÙÁ›Ð‚¡ëgæ-–©„eà`:õUûxò '0 ÎØž’ò”iE>¥MUÜGB^G¬>Ž„dJ¨)Þ$øl{Έ֔Q$dÒtL{„€ìj¸%ëv‚½%Uu#¥/ÕÂ'£xlNµ^Uý?ãxÏ€>3õk=E¿ì†¸ƒ)PqëÉÐlOZù¶Ú{ô52LwÒ³ÞÁàRÇ®+¸·:b])ÀªÎ¦0¼ ©aÃëBcžÁ¤‰â ïzðª½D¼ÖÀ Ó<©ŠÕ©4Ô—!XÛw*9’ŠLŽŠ©Á“h?Êê‚cjž&sŒHÅQŽÚQ¦DBöf\ÄÌ\šÁ .á ‰¾>ŸZ&¦—©$—½*£¹’9‘1¥î"äG[‡ÌŒkcéµêÐ×_1CüÙÞˆw5½$sõŠÌÇ߬âåÑÂS76䬯’d„”šCêéÀÏç5§§•Ï躗¿øåð9¨»Îõ>MƒHx ó_}£m$`FS£FdÛ™ˆ‚mêZ‹X¬x”QjFÅ”0QnzW¢I>Èm±EŸn{KömŸG¢ÌP¦=.V(Ùƒ° ~\(µ¡ô-¦ÛnL7Ù[_="2ŽvX Ã>Øuz´ˆönº—ci!4ƒ­Q¡v,B½õ= õH—åQ”G8å±8-'V+h+¼GïÑKjñÖÞ>N'E)\Ða¾m©Z0lÚù'BÃyglEÜ8†Â«ÁÏLò:z÷lY‚{úù¼ãËα‘K@ 1IÀ\à=þ~Žxc*™Lælà ’Þ"B|@Çf!©)†—àÑ'#{´~ë'¤ìëä9ßÚ[ʨĘ[2p‹y™Ø‘SbÏØï»KXt•>MŠf¥ÔÀˆ~áÖ,jÓOÇO‡ÿ\ùP endstream endobj 3300 0 obj 5382 endobj 3304 0 obj [152 /XYZ 31.5000000 395 0] endobj 3305 0 obj [152 /XYZ 38.2500000 595.250000 0] endobj 3306 0 obj [152 /XYZ 31.5000000 268.250000 0] endobj 3307 0 obj [152 /XYZ 31.5000000 395 0] endobj 3308 0 obj [152 /XYZ 32.2500000 266.750000 0] endobj 3309 0 obj [152 /XYZ 38.2500000 595.250000 0] endobj 3310 0 obj << /Type /Annot /Subtype /Link /Rect [48 622.250000 100.500000 629 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 3311 0 obj << /Type /Annot /Subtype /Link /Rect [60 359 122.250000 365.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn2 >> endobj 3312 0 obj << /Type /Annot /Subtype /Link /Rect [60 352.250000 119.250000 359 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn3 >> endobj 3313 0 obj << /Type /Annot /Subtype /Link /Rect [60 344.750000 181.500000 351.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn4 >> endobj 3314 0 obj << /Type /Annot /Subtype /Link /Rect [60 338 75.7500000 344.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn5 >> endobj 3303 0 obj << /Type /Page /Parent 2 0 R /Contents 3315 0 R /Resources 3317 0 R /Annots 3318 0 R /MediaBox [0 0 595 842] >> endobj 3317 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3318 0 obj [ 3310 0 R 3311 0 R 3312 0 R 3313 0 R 3314 0 R ] endobj 3315 0 obj << /Length 3316 0 R /Filter /FlateDecode >> stream xœí]K¯ãÈuÞëWhm`4¬Y$˜~È"@£ÈÂÈ"hÇ1 ‘Žùû¡DRW*ò+²>*’WrÃÓ·ÉËzœ:ï:_ÿåÛÿûÇ_?~ûŸãþïßÅÉ•E÷¿ãùÏ/·t}ê>ºº<þøýðóøóðõðµýïÏC÷Á·ÿÖþôG}ü×öÿ=þñ?Ú‡êéü ¿œríß»üÝ8ÕþT\ÿ>?ÿËáßÿpüûyÄaº~1÷ÿþEYW6ú¼Œ™©†mªËŸüøûá×q³è¦Tµ=*kÚÿ4Vÿ÷¿n'†/NUÊUÖLäôe¦¢9*Ý´#)3šèòGhøƒk­Ò ~Y¹8T”©TxtÉÃÕÎtrU 𣧿±uBÄ9¯\(ÃÑÂÁ%OÖ¶/à)]ø\GO|[V ?¯\(ÃÉÂÁ%O¶,ê„4{=ðË:!C¸¬<ÍÂÁ%OÖÕ=ìÏ“Êè:|‚Á+•’_V.•álñèí—ª© ×*[ègrîú 3]´(cUûój3¯°g½ÚÌgÍ jeu91óט1ØevÞm}k‹è£=Ží‘‡È¨nÝêp¢O«íÄØ+€¯xŸîÁ§Šniæx»PÓÚßörf¦©’™7ö–ÎÌ4îx»P·§3KAgSȰkº-Ûö¼ša‘û8,À»ž€Æ™w9µá_yîTWýÿàÏJÙ² ¤¶ÉYUUöÆ’.š ûuøÖ@]¥s¼u+‡Jo FoÑG;[M ~d_®°ºšKpà7Ã'\ët¡nåâPé|<:ÇHGKyãY·!1óáûá×/-ƒiY¿ÿ¹]\7çå¯ï-PÊã/gq‹oßÿtü§¢0õ?¿ÿõМ*]KìÞà›½Q¾±p4¿©à7_ˆ7p?ÆÀ7pÕ¦ƒÁçïí‘?vZ 8*[\ŽJ·<¥ßÀo—)íÉšîBëº]£7ÅGøÆÂѺ­Õ§º).û~ûFÃ7pžþà£FÃûQðUÀ7ÝhæTÚªvå"öƒaðùò¦<]«ûTĪ;²PfnÉ)8øï´ƒNhë ʶÉåhëʘo|ø•Ýd ¿Á ïσa¾: À CÏW‰‘ÁoûYJBÌËsSTƒ\‚òOAù³ŸáÞh¬7|Œ_–Íö·øÑ4”çë4:pm:xÕXר§îбΠလÇ@ìÅ£a Ãc¼!NŸ³j« æø0܈7µ}ÊÈUuù²’vAéK#lÛ½¸7LµX¯oG›:‘ÚúRœ…çÀ~º7J öËÛ7аÁÖÀ/€O ð<¦cêÙÞØh ¼‘XRÀäÆP’¥ lÎ.÷j ;tDO#@ ˜|0¦0Ž#øØ©=9mbkÇéK{Û¶ööÒÄ6¡!Ùz¸ èXÊ1îÈ\Ž^Y}k$[dU™—Ô–:£Ë)†J«^bhb( ^€/Uñ—ø²Y©Á?øÀÕüe™·ëP£HµljùJão`t‹‰ù,äô)q}н »Œ$èEÙ·;ÔPcÔhOørÀÕ9øèMÙÜ=¸ ¨!ª9/ÁúÕC ö\áшKôÀ‰~LÍ­tÕxpøë–ë¶+߬®¢oØ)`cDäãâ¥HCtÄÁsÑ!>0l\áÑd‘i3¡Ec‡n öç&ìËç‹ [íàö©g¥—£®òõ—'Ž•$ òi.7E.³r±É\ב ø</ +‰Í.Âe ±-)Fkg$qµýò|3t›PF)]T¾ÂçÊFä\—±;•Xl`=ãø+=2…̃OÓUå$ ”=iå)ƒ} ÁÍpUÂyð7|ƒ¿kë¯b§P¢™ÄS…°Æ+è½ÑSî ›œJëÒã€eìÐÞ^n RËõBàSÐì‡å¦a.PR ÎÃ$îT7Ï/¯­©}N°D®¤4&ª“rÖfrUeÛÃ[oÏþ Wï2Ô±])§Þ¦="(@Ë/02çÜ&<µ3¾àéѵ8UNݳ­Ž©òT4æ~0î¡WÉ•^½)YŸ ‘}œ±ì¦0“üF}†l # ASïîæRÖ Ã÷r‡ÒD36àèÊuc´§àÏ (n{Vµ2„ÕUÍKSK­©-g—T2ásÎä×m¦C¤.˜çŠ+æý6(CÓmă¦Þ¸'õÈ ù%þ›¾TÅÔ7 üæËi|E ® ?Þ©7UT's¡°ÛÑ>¡yzÎÌèà1 à~ð7¯¾üîÕ€aopÓp?ÕÌÚÒ³Cgݰéj茅!ôåÃS\iC¯}"  0KbœžXÂ1·åÄ<ãÌåiÍwuˆÄêRžzÙø½ˆ‘6!çüÆcÀ{.®•RRÕ΃T†›“Fys27˜Ô5Ñò”•@YŠÑàZ!c"bŸ à#ê:`Ã" ×H»XÙD Yo^,¹ŸË¼6ާ 7#ÒÈw•Î_#YDܵS1­ŒS!­YÁ/«•ñÔ F ±¨iA7É%aãj_¦ÍïÊå@§O4Z6rQÖï;Æu\é*WЦ,kÝ•çžñk2 k&àöÔM#ÌuYË4µžÑ38 +—„«ù(°ØE |ÊØ]UzPÞEÄÞhxB† —2Õü(áGÜ_.1Çd`ÀØ¢aQ”y9"„ w|Í!ªÜQŽGÆõ¹Ü 0›æWuEÖA ’Ÿ¸ÏaäX‰†µ¬!xnUw/è¶ÌyFc Èh˜Ðj†c‹::)¹)¨º%®VùŠ×ë:ÄöZí«¨¹Š8×)L˜$e3º–lôª/îGÒÃàxêåQ Œ+‚Š„ˆpÃ2Úùˆÿ¬N]TÊ'¥ˆJyŒW/í=ã *è3ø´f™ÖZ_Ë´â2•Ÿà,op· ,;dkNݰ²×vÛOž¶Åü ÏIí¸ò´™Nhêåxx§ð S\–ê?%ºŸ\%‡ß[ûm”C®ÝP”¾(áîà›äñia(â7ÍŠW\>ÍP] áNr“‘M¢¥§ñiÖÆ”ì&dA¯ñ p÷4¢÷e˜?ÁµhSs¦˜ê1'f¤Äoù8d£^½_Q ,fOaÁ7d{¿,ñÚðLÏ«Ëa=5¤¬¾WjJ7å,^86!ks°ÆtFÌSÜc…\Þë‚.í¼„} -F7c<øL0GX+0 =U±ÆGØ/ÉŒ—ÙðŸÐK„õ¬36¦Â?§±ÆGÛ¿1ÊÂýŽe50ìwÛ´ðzeæÞy8d£_œëŹ^œë~YûáÅkμ¦*Ôü]¥«™²`=&©Ö–g¶™§'ìqÄX†=÷¦[¯FUT×ì½ób<á­­ª¨ÝT“«‘ê>½Kït 7¡•*ªVl +ÞÙ}ĽEVÊЃ_\Në çØUª6jaª8ýêÙ*TÐ"“2†CßqTaD¢ ßÏ -ΪÊz´ëkÛ”}k­ò %’Æ+OO¦8C£áG!ËD`=Sû"s¹ô•ƒâE;癘ýˆZ>¹Jßn œÄú5ðÞW¢ø+å:„ k§\‹TK6z2¿ì¢ty½î‹%»“k¼½)æÊµisR]»‰·oúž͸&vß¼uµðÕó>EŸli¦*‚L­ú#z˜çÆÂ;)5>)§-ÀÍ9g¦ø÷ë¿õ©nå„+Î9¥êî©=VÍ©ÓÖŠáÉCUŸ”jt]«ëo¹ÛQ†us´¿ßÿ»8vô¾.ŽöɃ·’öÙ°Òn”û}ü8üåðáw0Q#˜¨eØ«b²#/èkÔ54S‡=Û÷Š÷}ŒÈ)“m¤ÑOC¸sÔ~*r^©BäÙbÔ¡êžþù·Üí(ÿŠ{Â×ÍáëÚŸ£}2"üöY¿Ò~”û}¬Lø¦z^‚”-t½zðÜ·‹i׸v­¹}ð8íÚæžvËbŠvKíÓUûdD»çßr·£ôÿêç¸Ò®­§h×:ŽöɈvÛgÃÊë[ڽα*í–ƒ§÷¦…ŸF,Rj1dE{Ñ2¶MÀê!¤j`ž ó¹Xïîäà7öÐŽiÇQ Ùë¹2ÇÕ˪罶¨o<ÎÕ«úž«·Œu‚«;åsÜöɈ«ŸËÝŽ2ü«¾çê•›âêUåÏÑ>qõöÙ°RwËÕ¯s¬ÊÕÝõ`pq¢À›œzàÊþ¸•®n,E¤7VKzyË4¦P;ã£XºhÙ‚úû¬“ÎTòŒ¹Ï)U³z_ÕçiàЦ ÷?u‰È˜Ä ®ŠtO)…¹:X7FÖTÖpTínÑaÂóä¢jÆt ¨C'@ïLøQõ/¢ÅÏjÎ1IÛhɽ°,–e»=g䡾©n鶉i -âc~@ª¬XâY¸?c“ÎÑDÊBMåÉÜw¢âPÇ Ùc„0¡4jÙj³L—ÆÎéÈÜúbà‹ö  DáíŽ)޾4–q.šÝñc5”‰]˜S¬Ò'&X[ÏN.}iu8ZaKYKÚ8ï„„½Ý„F@X‰¦©¹ä?Ó©|}÷â¢]'bÚÎ`&‹QG¢³×»ky¡l§½,‰PRÑLŒá,§G c·Ú Ø©;¡¬”öDà–/Fü™3T§YbføX®æÈ×Ð"W:2"pô`ý¶î²ý}–gF0+¦ß®0]-?8ÙF|Êt|ÔwoN ñ'ªaR†ÞCõMzT+1ÃÆ$$¡x¦n1œëzU–‰æ=ÏjyQqà‚w{ÎÙ Ž± ž†­ú,>dðþ½µ)Ëeñ2Wã¿•ËjaY …<©›Z‘k³åÞQÆ‚Nr9—ý·ƒÚ1çõ–ûëàö¡¹å©Ke¾yƒ;=öYÎzxµ„ÁD,väÇz±ÈH}†—¯U³AÖ§D’ì]é¾S%Br´ø%gʾäÌ›àKË/&6”‹·¾EFÉß9¹Gd¯ïÜÄ·ÜoBõÍ-È•çÖ!—ði08KøúÖ“´Ë3•)Z”5·â Hê¦3Ê—Ÿ"•ÿDÃN#¸/£¥Pað¢7 ƒ¡ T‘Ê efº~fh\7W À8¤…ˆd¥B pr<¡Ñ¥ ŠV’2øÛ´š?Ý„È+’ÉZ+gˆ\4ÞQQ¬)ð˜©:éú‘ª«§&®JIÅÎd‚ýúበ—Ç\EöÆw¹ËD2–$âšÏýÈäá1V¬D¥Ã\J„¨|iÆÔ1ar«ß4ô2æ S§°E” n9ot5š¸:EŒ‹K/Æ6fî ÷ƒL8ƒ1I®¸™ëþlw{vä&uÚr¹ <º¡l,H&õA†[1åþé%븓õ§Š®-W»)ዦÊ\!eíwþÀ2¸ò솳åJ«Ýš3Ø#z#ýÀeLJY;±bäcÄã™3óD°h; —Þ‚­ëûÍŸqÚzV¢EozÔª††%#PN}ÓÀoúyì¨ÿI¯NO¼é»TFÍc»µi…¨wj´hCߘ‰7ݪݩ©½Ñ®ÝÎÏ™Z\ž'ëÏpÕ~W8bÕxcÕ)‚™P•Z —ßLøãúµw˜d*ÙTWÈÁÎBö•õ•ɱø„ÍiÞC·(ÆíŸ´˜nåI¾¾×oTبpÆAâð¸íeySPÚU¬Óg)Džïö^ÕCÿ.Ü8»gÅS ­qKí~£á›ð lÃXœ§gSßÀU—x¼j¸càÚ\<¬qÃqƒ›ã6éð 7 ßøf>äÃW”³çˆ!‚±"ОÀ¤@ƒz±dè°Òvöì |£à‚º5¤:Ód„¢5󔆹'|À¸­ãU¥À«\<ûɰ´.Q˜v~ÖZ]+fc98÷&ÏJÍÕ[¼K‰ýÒtBpÃZ‹ ÎxWëæê]]?¡:IŽ˜<ѼW¦¯ðÑRù¼™<ŒÏãAßj©„€05¥ó™Ýêrɤ//¥J×É]—¶Õ¬îç|'¡ô›é”–R×óÛù½S]Ê\…ÂLÓÝ]ŸvŒ½Û÷†¢íS±ó\¦º¢Ä UÖ‹ÉÍ%ÂA½L¸ØŠáuUûäž«ýÙ+.Aè “‰@Æj½Hvä†õš@-¢º.åØJ‰·g2ás¥ˆÆ¯ GA5!WÅÖÍH8E´Z-o"HïmÔÕîÁ\œèóEuKÍ­¥Zg-oÁÃl0Õâ$•Õsì¨ò Ïá‹Ð•ñhòÙc'ó2#îO·AþŸÞOYŒ 6*JLØÕcˆA¸x8QWô‘ 2Šm1~«µ´‡ÍT´Ü’;,Àö™Ò¢Å6ã6ZÑŒ|'÷&‰¯„#nûÈKOÏ6=Y%s .•oÆ@½oä§<‰Vœ üeº9®Š"’3!¶5°vYÀç©~¹Ob¨*m|kâ9b®nG7m&-x[øÂos¶n¦y´/ƒöeЮaÐb@ 7úÎT²ëe¶Š(õ)™~ßì†ëïÐ –Ò7c³É¶”­ ü²'CƒD”™g¼Š¸ü;><sú›± ©ÚÕ|:ŒlÙÑ]çNé m|ٸϗë7GÝ@(L’¤>™~'{ +|Y¹/+÷a+w­­ÏÞgð®•íhWÞµ5[¹¨¢ö`)Ò¬–RÉPI5ŒŸ!¢”£×DÀ<¢j£ß—+ŧ8Õ(œ¹I•­R*Ê4d›¥3q† “ЮÜÚùúº¸Â }-Õé‰7 ý0¯w~Àu"û–‚So`åV¦Òw šüú•hñ7ùº3¸¢º~è2Šã ƒ!‚GÓðì-„¼…£V€ç!¾Á] ,±Ÿ:YðE]³¼^œg¯œGÃÑ–ñ¤öÏñg‹LA\û:÷ TËz²êN+É uÖ;Ž×ŽE…‚ÊES7!ÉûîÈCÏÈ›7ÉPßô×)zܱ·Çì)åïšÇÌÙŸSkûÒï©^Øc} kª-‰{DÃ-Øh™Ø†Â£Áozm]Emý&”E¸óÏ튇•c¯ÜF<F3À»{>6±&5OßUÕÔ¨Þ¨P³wП•Ðf´$<<ܱš³§p.6óˆÅ‰{džõç{×]aN=Ÿ|éuq+1æ¤Åñëáÿqå endstream endobj 3316 0 obj 5776 endobj 3320 0 obj [153 /XYZ 31.5000000 742.250000 0] endobj 3321 0 obj [153 /XYZ 31.5000000 307.250000 0] endobj 3322 0 obj [153 /XYZ 32.2500000 741.500000 0] endobj 3323 0 obj [153 /XYZ 32.2500000 305.750000 0] endobj 3319 0 obj << /Type /Page /Parent 2 0 R /Contents 3324 0 R /Resources 3326 0 R /Annots 3327 0 R /MediaBox [0 0 595 842] >> endobj 3326 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 3327 0 obj [ ] endobj 3324 0 obj << /Length 3325 0 R /Filter /FlateDecode >> stream xœí]Kä¸ ¾×¯ð9ÀÔX[2Ø~È!@cÈ!È!˜Í&Xdéì!?vYvuÛþd‹E©\.Oc·{ZSER$Å—¾þñÛß³þ–}}üöŸì»ûþøíM‘·²æëËÇ_H{t?gÆÙ÷_ïÙûáõðZÿÿýÐ~àÛãŸëŸþ—ÉìOõ?gý[ýËÝ?jþÁ/#Lýýß§ï•õOyÿ½ùý¿ù]ök3c·œæóß¿m‹R5`Ì,ý~è¶)N_¿}ÿõðµE@Ø*²S–™ÐJg¢Ò2ûï??Õ tÓçG[J£‹¼²ðgââF6«çõšBVy&L5ZüôÅ4}„É¥ÌãM~‚œ+B•Â?{MX÷þL\ÛžpfjFÓ¢þy¼r¥…0¥6ù%<ÝbO)Ñ’¦Ù/?qúécL^V'?AÎŽ•Ž­ðìœÄ5õ_Z Eçé#LnMoòäìX鈋gç$n%­;¹U …ÐOÿVɈÄ=AÎŽ•ޏxö¸ ÁjU$PV÷Bµ/t9åuD™mˈFL 9;V[yfç$®Nb&†úÙc ¿Öö'o çFJGZ89'e­)ÛÏùÖ˜ˆ“7Ç¢,œœ“²•tŒ/«ê§0y%EÄC{‚œ+mG³¿†Ì‚Aiïž>¼¾¾Ô@Ì2{û©®]óôí­FJ‘}i¼ºþÛÙïó\ë?do?ªc)‹Äv$„#ÏhDVhD”hDÁÊ:*‡À*!x‚#pĦÆ(… ‚j ¦iþ>âÁž C@À´#ÏoµPˆ~ž‹j#þ/à01M0Aô6,…(kÂwŠO†„ý@î#ñ2j }$äÒ~(PÃÙŠ2á93¶ƒë&¨(2Ös¡nòPφÏÁ:†"ŸàiÂpÍjñPô¦ÂPãu0(:‰*ø€b j|N=;%@@âxl‘bÊaî…çËu¬Û$ä ¡V)m¡ÊÌïan„R›I=¦'0eYtlÐ’G¨£Òª‰¦ŸÑh$o ™òXíÎLõ?S¡Ï8sEŠ£’VÔcC¦šš­=>BwÓ!ÈáH‹\slÕŸfó:>ŒH„ ¯ƒq€×ñìçàu]džÏ` ›ga®¤˜¥ç âp!ܱîÑó´óÈV9¿IŽëÃïê)᪽£{·‡Va±Bp}{Sní–EÑŒî–Å2\©b–vÙ¢œ/ŠþšPÎUgûy$&oº! ‡Wú­CŽ”¢³$sÈX&xì&BB—‡ö ¥E©.²$oRCbm—Rö”ú’ÏT6Ãmú„®ïßY •]z£‚É…|ðÌäÙ¹‡¢äL…‚\j†è<àg’ÂÙTkÌ, øx‰„(.Öƒ Á0ã™$EŽ…(Í ¶yÇxŽdm­~Æ!‰79"š7‘ç@ K8/ >ŠÑ"ª(árJ¦Ë(0Kˆh¦HƒºÊˆÁ ɦH‹ÿ¸»Õb‰-°\¦Ø8!™î±È3EU.–Ë[M~£$`PÌ@OÊÉð4j%‡'D ³¤îP2uX…U¼y@"@0&NöÂ,]½Ør$*FP!§žii Ö«æ€5ïÊÃ`„ŒÖ3€%E8fzgÐõÓ£0ŒØÖ¿ß4f\ÃÖÿò3O±$W×Lp¢lf,A0x§¬½©èYK/f™‰*ä@^Å›Àå©Õ<ÃÜw°©ÊÏ|»Ê`¨€]hp Ñ®ô'¤©x>³â ç}ž­(n€&)ÏVéùS·‡?·þ “¾¬#9–/pij¤©Çõ‰CRÝtÓá²0\ÃnOžÄpBЩ׆ ÈJHÄ^A*í.G/‘£i4rÑz®Ÿ,Rå]æŠkv3ußä­•‡W`R̆n!R¹i(î†åávJ¬&Àïê¹F$‡Oø¶¢EÑñ¸ý1ö6éä„×x6Šl¹¹T ¨ð*=Ðx÷„JÕBƒô¬ÃtIºàè‡Æ{CŽôÅWeW³ÑäÜýÖ|Uoêšr¬½¶²óÞK`®ªKJ«îª¹†­K·jºX›]Ôw×4é¢Ë÷£ƒ®¯O6ØàÉæ¦˜¥ð®ƒ®ªKâÛ˜G¶¨ƒ„DÒ¬Zt·5gm0Æ 3¯ßî*Æ »7Ø®-pýl˜­å¼lÍ7s?Ù=ΑŸDªÊ1/^¹TCre«(ên;_n¿[æYøb†ÏJ@ ‚p7 Ɉ6“zúžB¿–]5€3K–Òƒ'Fœ¼+®W· ¼ÀÏTð3-ú…KÜsB‡My»OTwx̱Þþ`DÂÏàuàlžÂu$\ˆ.×o|=…Tð̆q€ñ¦ÐN)”£àÍCŸç™u"2UÚÁ)Óí)“b,¸7Æx"‡²á¸§µ¦¨ˆ% ž­îbÆݼäøÉ„ ‹PÜM°Öáux±:º™s¢(OáN±ã3$G“`¹P|¾”Kÿ𝳑óo=ÀRøîÊO°2yíI~[8å)7ÞÄž´1‚ŒLØÑ²¯ÝÃ=YÖü.¥û \GCßBª×;v0åöH#w6eTùa$Øå£P`»~Õ bª6N…·“ nÜ.pù…ŽrÛ%u´¡8,YnÕ”Û'¥2”Ò®@AO‘ Þ ¦ÆúB8¼Þé5—oxO 3 mÑù;“½d¼Û„k° Ý<|°fË¢ÊûD[‚e¹¶.ާk…Uq›kƒw:ì1•Ê+â{g¦“Ô9¥½GäT³›ŒÚ';À«‰Tóz‹CRç¡ÿÙ°zÌÎx¹bЀ÷XŸÝÖaÏ} úm×ë¯ì½žÞ»úëÜ?Xà7·“£…:æ¢ñCe}ïGw:§œM-¶Ì„gÇõ›îj>Fô*Ç# rÜ[¶L¹AŸÐ:j.”6Û‹Û)rÅa¦š…8Énª]¹„Ó8¢Ñ6ž ~ƹuEÐÖÍ™m© ×üœ÷ùGàž0 øh:fw¥4G1*z1axFÜï!ç$<=ܱgz¸ A9\£ƒbËy@²Ã~1÷Ù‹ØÕäêèDÝ¥|+?¤ÇÍÊó×ìõðFÇß endstream endobj 3325 0 obj 3813 endobj 3329 0 obj [154 /XYZ 32.2500000 390.500000 0] endobj 3330 0 obj [154 /XYZ 31.5000000 546.500000 0] endobj 3331 0 obj [154 /XYZ 31.5000000 589.250000 0] endobj 3332 0 obj [154 /XYZ 31.5000000 546.500000 0] endobj 3333 0 obj [154 /XYZ 31.5000000 392 0] endobj 3334 0 obj [154 /XYZ 32.2500000 587.750000 0] endobj 3335 0 obj << /Type /Annot /Subtype /Link /Rect [60 510.500000 91.5000000 517.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn2 >> endobj 3336 0 obj << /Type /Annot /Subtype /Link /Rect [60 503.750000 94.5000000 510.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn3 >> endobj 3337 0 obj << /Type /Annot /Subtype /Link /Rect [60 496.250000 121.500000 503 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn4 >> endobj 3338 0 obj << /Type /Annot /Subtype /Link /Rect [60 489.500000 162.750000 496.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn5 >> endobj 3339 0 obj << /Type /Annot /Subtype /Link /Rect [60 482 120 488.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn6 >> endobj 3340 0 obj << /Type /Annot /Subtype /Link /Rect [60 475.250000 130.500000 482 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn7 >> endobj 3341 0 obj << /Type /Annot /Subtype /Link /Rect [60 467.750000 110.250000 474.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn8 >> endobj 3342 0 obj << /Type /Annot /Subtype /Link /Rect [60 461 90 467.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn9 >> endobj 3343 0 obj << /Type /Annot /Subtype /Link /Rect [60 453.500000 88.5000000 460.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn10 >> endobj 3328 0 obj << /Type /Page /Parent 2 0 R /Contents 3344 0 R /Resources 3346 0 R /Annots 3347 0 R /MediaBox [0 0 595 842] >> endobj 3346 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3347 0 obj [ 3335 0 R 3336 0 R 3337 0 R 3338 0 R 3339 0 R 3340 0 R 3341 0 R 3342 0 R 3343 0 R ] endobj 3344 0 obj << /Length 3345 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`½âC",ÌôLÈ!À`È!È!˜Íf±È.2ÙCþ~$›RË”>J,)ÙÖ’î–l²X,Ö»Šßÿéó?ŽÿúýøýËçÿ¿ºŸ/ŸÅÉ”Åå¿cûï»áiOî÷£±åñ믇oÇo‡O‡OÍÿ;\¾ðùå/Íoÿ;Ê㟛ÿýrüÛß›‡?ºµøõ`„i~þûü³6¢ù­è¶Ï>üõÇßÚ»é0×'t]*Ý‚13õ·C·Lqþ÷û×ßß_7‹¬ë¢²G¡›¢Öòøß~j&è†/NµÂTÚ·Ldd3“­e}²ng£‰Îÿx†O0x-EºÁ/³cE¨J„GgÜÜZ6ô~ÙܪJÿnø›[ª*!å´³cÅmn`ô“­Üðwâܶ¸’eÃ6Dóûxæ²uU«áï7ÍlÅÚ3O¥Ô3ËÕf>XÆi…nHk<ó§˜1¨`¾É]9”»ò¨cÙ{Ó>#×T ‹˜@îMœAK=1ö è+ÞÐ'úDqM‡€ªFGú|/{Ö*v©öÌ{K{V7Òl¨¼§=KqΦˆaV_–¬›ýª; ïc³ïz‚3ædÞe׺¿òn\J…Q…(±ÚÆe‡4ÓHétùºäV懣³[ ÍàJé?CΔ³œsgUíLÀÒ¤@~ÊÀl×Ú$$›rn¤t; çÜÙÒh‡¥ èmøƒ›"!G8CÎŽ•noñ蜛kŒu*yº?|‚ÁÓ¹;ÈÙ±Òmîhtš¢3åM§˜ðL‡ÔÀ÷_ß¿6 @ƒÌêøå§¸Ëœç_¤”ÇïGâøåÇãÂðîÇ/¿êS%ËD÷ÆÀ7|ó½)jøK˜GÇ¿‘p]pÎÃûF–ç7¿4¤•œ*dñtT¡!lâ¾p·2Q’’©BÕOGâ#|#á…Þ”*4/¯¨2REiŸŽ*4ž¦Ê<{€Zd¤ŠºêÖ qUPvS\wñ! 5¦$Ͻ€ç>€u€–¡¤Rj(Ãð<îO¹"æVpOæ¾x· Ü5¦D Añ’×°–±óp»@€ À8€£á ð¬éÕ\Ü»¬[gÖ-Kq=¥(N•Ö”£E«S©«öÅQ—è“V—Ä/¹ödëâ¼:¹åII+®ßôGÔj§lØÀâ¥;Nú6ˆV’—xë£)¤Ú ªñðª€ßÁóÀÑÍ.ß?qç¤à}ˆ³¢ðçlN¡ºÓ²`oóŒ0‹·‡@:¤Ý¨âO¶cµq„ˆ¹Æ^¦!<†Í?·‰™Úˆ ćxf£;YlªÒoéÜ&$”wea<8uï3ÒÀ…Ç0 Oá<ú#‚æÍ9U莇A«Ht ÞTåÀh6¬tb3 ÂPÖYÍ, Jl„òªä£`}ìàÛÍ9î ež\Nx l뻂IÍäªÌa¸.SZÎË)¸[ËìÚÃÒ»±4‚ó`¾¾>WÅ{§¢»äë áûŒ'°ó{B¡ Œ¼nÌ}7|šv%Èí _—Pjd%À†wSACÐÞ9‚î`Ø–X6° ùŽ©cÛ¡„SxƒC‘ð;$§ À¿ÂÏÃG1®7¢¯Û~ÖùfmË"æž&eeOzœ¥ ežŽ*ö¤ÇYª(«§£Šõ=][OzÔÍÏg£Š=éqŽ*J¡ºuïI{Òc˜[íI›¶œnö¤ÇPÒcYu&¡chBt¹>¢¦Ò7(ù-”Fø§£à½Ô™Œ¹²µ©†l­å qä@L„ôº@^$¦%’}6NaƒK—/èÈÈÚ'Q !’ö‰³‰‰×¹eâ`ƒ£á½ `gDð8¡¿™L€Ü™™#r#1™Ñ ¯>r{H)¡jë‰(|^(ÙãDalSr± Ât‘žìg»*¦IJB;Gî¬S颸òˆò¦ãófÅN;– 9RDbà;¼ºa4Jþo£åla{”zŠ} qæ^•ðü¨-©_p÷¶ß½qW\fùHLN}§FßÑt3æ7&"ôÉOaw<ÊœjëÏóŠ ¹¬—ªOºq”)Ñ€õ |œ±æ„u–¢†åêJ@¬àt{¬ÃQ,9Â2(*oŒiBÐáx«2R‚F¨*¤Ôa co¸¥Ë&)gûÆåd¬Å}ÎC?Að ú`ºÃK'غŒ·åIm–ÕÄç­  •”*µÛ™ãw)k¶”ö$¥ê‘TwÉêšÚ@™*æR®ì»<µ§ê¼ƒ£9ÅIv¯Þ˜Å¨)¼Ìh¥S¤¥=üŽ gOqP¸ œz±’S”|1êêB†ZlN¦¾Ö\`{âMMw'Ȥ+¥æö£ÝÃR-U ðhjõXÃÁ¬ó5~¥R¡yðhNgœøŽ„oÄÛy)'åðê ®¥:‰Ë![° ¶NëŸxs¡}iG£Q°ƒq04u–t3ã“t¹¿ÃÔ¢í’xüµÿ[ž¬-ަh!.Æk}¬ê®b÷ä롲'!ji­è?e†£t]æh>ïþ.Ú¯½oÛÚŸ£yòõàAÒ<ë ½Œr½Ž¯‡Ÿïÿp…1‰XÆ]Är9i/bÒÔ]N[€u³šÀf¶Ø3ÃQ?«u÷\^ Ú´—>éµu´)*;|pÕ5œBõVWToÃpLõV("Û'>ÕŸ?e†£tWTo‹z‚êmaý9š'>շϤn”ëu¬Kõ¶÷5aK…À·‚Êá¤PB¶³–øR"·DpDnªáƒÛ‰\Ö×D®Š)"oÔ%›'#"o?e†£¸¿Ü=‘K;EäÒøs4OFDÞ<ë ·C"ïçX•ÈUéIò˜Œ…€k‡&µƒâˆäÜø;XPD¸Þ6ë \ÌTåΩÔõðÁí@Ûk ë)P ÿt6OF ý”ŽÒýe¯9€6S@WþÍ“hžuš!èçX•”}SبBì¤@-¯S—7¸FplÇD1Ö÷³´T#x—(NP—F.ôIŠ™~U›áû‹9gY:þ¦ÊzøàvÎY™kÎÙ°³ Îi Ÿ«™bÌ9MÏ+Ý(Ý_æšsVÕç¬JŽæÉˆs6Ï:H«!çìçX•sšÞëöŠ8çfˆoS½ùî°·áâÃkt¯ö\=¸ýðÚêúðZ3uxGþ&{ö7yǯý”ŽÒýU]^[N^ëûÍÚ'£ÃÛ<ë -‡‡·ŸcÕÃ[ËÇ:¼t>°$£"“ì_?q1`©B°;[ѳ!ØÅ\©VWj„ÖàÁÍ\©.Ê+®Ô,n‚+Õ#`}ö^ó•ó§Ìp”î¯òŠ+Õ…žàJuáû5Û'>WjŸuêWz›cM®T‹> ‡Oì8c_D€ü9Ü>ú•à‰Š(ùˆó—ÔBvGÔQª{pû•úúˆÊrꈎ¼™õÙ›é²öSf8J÷—¾>¢mLr|D¥ï•mŸŒŽhó¬ƒT h?ǪGTõ ³$UW*¨Fy ðMà€à Ûˆæ–» gSÑ®êb­¢ºzp;ájuM¸ZOîÈ WŸp鵟2ÃQº¿Ô5áj9E¸Úw&¶OF„Û<ë •CÂíçX•puwñVÀÕÁÞF—Dx‰"ÜF\a׺,z2ÃKÉ”–¶ƒ3®UKJ½ïµ"šÑØ(‡ß ÈIø§¤Lùç.$fN¥ñ×ӕ鎂©}9ý8µJj A`´÷èËš©:§â’7”Ñð.àõìx á Ó›òØDšò‰ö0÷’òXj‰——/’\a¼·òPîLj(kEX0$£=’\Åí”jã­$–ÄU³šŒOä9£”BâPb–´ºü'ŒÔÁ€žg\0N9ôsßIY`!kO&²„e…A¬KH»¬%ë$ÁCixÀë|c ~l ƒd³Zqö,¯Ê"•.Ïr¡ô"Ub`y£}Y˜+L–K­¡°ªˆˆ'k×›ÌZzBá+–ãIß@A?8Ζ¢¨”¾÷–ç팇;XâûstòÍ#wIŸ§Ø[„öK1í¼FÛƒš2|%£sùðzî*Jã9н¼‰Ϻ–GánÈýX´PüQVE™…Ax.ú‹0+9ÔTÞtGRç@ŠíC°¨I¾Êhç K¬ëRšÜ“b’’ÊxÓ·(4Ú“Lý&B”“úÑn¶0‹I}âµ¶[‘Màí§DÒ¢) ‡¡¬JRêù#bo™Z~Oé´~ûÉÕã&‰{Û=pw«6ÑëZŽ’4kB~ïGUäëG…çªx{ 4…è㧈äºàÑ|ëÏI¡¸âx xìÁÂag/ñ:ï¯Ö³&@®¾NOêuC)âŠèHíJéÓ—ÆC{Ì=\–W›çu[EG(Xýr©ýÞƒptäiÏ®Ú]è‹jq{vÜj¶gÇ£áöìîˆMæ:Æ´gï/ð UÜìý#zÓ…c'Þ¼ •`ƒ+ ÀVd5>¯š®"µsQp&ï ‰e*&ãM¦\YF MG¸ÛÝb¢ØsuT*E¸:†”ÿtáó-{´bbIJœ‰õ‚ÇJíM™]–¾LÜ“†÷¤áU“†1_y·øTçº †”#Œw=­ûò>-æì–()k`ký”IФcöQ§h“”4¡¹ª=Áù|úk@´Rø ¥ê2Sµ*ÉLgíÈÅ›Šc]F¸û"\È®›¥Š9½ÿIÕü"ÄjGÉRd­ Ò¹¨é0[F–}™ou††ß¹ËÊ !(àhØX1€MÀ7ãw!‰ÇµQ8Pê½AØ(oø*ˆœMc3ŸÍÀnÝå©U% Σ!l¯‡p2(´¼s¡ ¸ÐÔ¶Û¦ð§·{Åréx´»äO[>3×;çÊ· ;çb7)U)¯§œjO¸ËŠ’w`3”à(È–rKñ±Téäj‘ÆÍŒ©®¥ô´ÆnPB)p®Îu,µEÖÀÆaÅ”ÚR¥aD^i¦²Ž äÛ§èÚ“´˜¶ô„3 g!’‘»›Rï°¼éOO…=p±ç“q38JÞUš–·¤|²L-ÍH7- hÕX¨PJ¨pþF;‡Eáú•¹$;ïé\uÊZ×°l`ëQ’ëV¥“ô? gÃWúYô]"'%zQ°óÂwOy¿Ñ"¹«æDŠ7kÕ5%·7·‚?kŠgð1‹°‡Ð‰“&üY—‡ZL¹0¥b‹µÆœÇÀƒ5…•7Q{Ñ¥BopÏŽ=Ûž+Û>c™–}e|®L¯‚£"Á0.†cƒÎ`|†Xô¡Ý#´?dŒÐjÓ'¥Ò;]nªcÄò˜S„ÖC1³Çv#Á糚)Kj*G©ÌÔUeµö=c*ËÔÃa|5Å÷̪î3½ÞP ¾à¢Õg«/JYÎ]H_ÚPnÏ¡´°åíKð`Q•lW(”¢o£æZýLª¸ó-o fŠûûîÙÌZÌVܘ©A)Ş˳«Ãú=%Iæs]ÉÀ‘ë@!Þ÷w ¸'Mó2ž( 0õRÙ›˜Aß sfcº#EP\ID(‘€T³”oó6÷}áÃêMÂRûW2åäS2+"n=湎ÕCR]"ø%dÌzÑP’TÈ”)\Ö·Ò($ž+¹ËM¡X:šu}'îRÀ~‘«’ GÈÓ¶BÒì7\D•K0lÕɺ½VVÒç$w¡Íp{­RµªˆN"õ߬Û!ƒ÷OõK¤ðlÐR ÀV¼nÈÖ:<ï-ŽyÞpk,¥˜’kJºA–:Qc%½Ø#.¢E˜˜dò¦"òZ2ke9l¦°dJÑË?Òj'º‰#¨NÒ pÚng´I¤t—í ð‘>¬Äô¤ÑmâN3%€–BÙ«F‰¼u¿…à6Z¢Ä›(yh¤¨RD«qÊ%î¼å·”t‚¬ÍUÊ—øšÊÙðIJçgéK¤õ+Awg–’I(ÍŽhM ."RêJY¦Ù"i„Ô›O0DIîÿ÷ñ¶]ÀdÉn†ûDª?¿Ã[28IK½˜8µ‚÷rèôNR룃5Åaƒ·m€sRB·ËëÖ+Ž ˜µ¤y"¶”#gi}Ï'¥Í)]“Õ¾Ý}%‹x˳úJRú=ðÄš‚'ȵҟŠ•SðúÏ#«ýIé›ÐZVÝ£›$.êžœC wË  #…ð†$§ï©óE¶îH{ •5к1é(ŠRyâñQ”¸µò¾W;K9›áTEîkQp+IùÎ2x…opÆÀÞp†¹áL yC€›"Áõì×¼dÜSÂ<®¬xjxíÙs´ZÀ£euûêò@Zõ9IpWÍ©0ÿ‡§ËŒ•âVW˜[Ai‚eél•w˪»–Éò”Àa“˜C¨ya“|ƒ±Cx³ÆqFõ7¦²6Ž ø4p”RÈ¿á¾w^ÎÒGc Ùr`ûmp'·¥EXŠw9ZõèiÛ¬’/EíK>ŒnŠ£—·ÓÀƒÝ° ‰åÜwÓÏ)D¿<ÞHjþ´> endobj 3357 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 3358 0 obj [ ] endobj 3355 0 obj << /Length 3356 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹½€ €íÈ!€a99Þl‚EvgùûéIó ô±ÅOÅG÷ȃÍLFÓYU¬*V}U|÷Ç/?üó·Ã»_þsø6~ÿøå®:¶u5ü;œ¿~xù ÝÇŸmW¾ýr÷ýðýîóÝçÓÿ~¿>ðåãŸO?ýï :ý÷óá¯;ýòÇñÎðË]«ÚÓ÷?~ï[uú©zú~þý¿îþò»Ã¯ç§×“yýÿPuuú:Oã«¿ßMËT_¿}ûõîÝ@€°·˜J¾Ê{P½Õ‡ÿþãî§Ó ¦á«co•jÛV[^Ôê§7éþDö¦™½èñKfxapÝÖñœ¹8U”i”ôc׌ÿàÏä»»ó‹îO’¥ºC\±ª•XS·xó4z Æ×MqðóÌ¥‰2 \’³MÛä9ý'O çá# Þ5m¼Ág.N•‰·xô¸ C«¶M 0´®u<…ñ~ûzbF}øá|Œ¶æðõÇÃï«Êv8|ýù®?6ºž¦8<©zøF£'ÊÂÏÜÃ'艩à{øä#|ϧ440=Ñø=àzð Dùã™› ç\¹à™A¾Rgà‘Düâ‰ïÁ30·¾žItÐè‹óñÌ˦|öèá=–X¸kMŸ[ÚÀ­üZ^ö‰Ær™'ªÚ²† Ú&ÍêT_Ž~ d‘±AŒí¦4c°­+c7˜nËn€~›ÇËÀº Úˆ©ˆyOð¤ ë¯ê¶íÑwÄÞÂO<¼‡|TØ¿•Ф;õtRNË{L¼^†°Õa,Èûr-È~ÊäN™…ìÚ¾Þâݧ›©V¶Ï1™Îgöpr¥ÙÀ-ÏNÃÔê!Ï{ÛRåk-¾;»ƒ¶K¯Têñ•F?g0TÊ5gá3qôdtÔšcS„{&õ=üL?30AÙéÑ3z2:öaï„êÄŠ™º0ºS¯Çÿ€Þ¬jø¤AoöÌöAŠá=1[ ojgiú8Ìe¶»c×W¹[øfXZ='®ÂŸDÁNS{ñd »9Ö¶é–„qa´‘!KïùˆÞ£‡'JM/Ú´eŸ0}°nÍ;HbL.übø“ñg>8Ëð ‚§%6æ‘–øÔA¹cÈŒÆÈ7ÜG£6kfù)Lkõ¤&‡á¶i&¬KˆÍgí™qw%£Þ0“ñ‹1+±ÚÁ ¦vdù´ZDkY›Ö1—ŒólYBø±r¢Lž5”4ÍÀ£¹Ì£,ÞlÊÝ£tñìÝc½É¼8™X¿uGÏ=ˆÇã!IUǦU¯œ%ÏÓÄ,Í„ Á)Kn¡¬®Å+u}#ÏV°ò²³1ÿ—qCEmýG8¢iêûÆ=Éa €ÆÄÃB'%óØRþnÄÿ ØÌ„:¦ÎïxŒã9£,þS¼Ifu?²|dM#ëì&}âu‚5ÄFe<7f7\’Òˆ’ šZ@˜}æaënȮùTò Ï„n0ýa<ªdªQ$SN˜?øÔ…i-âû$ÚŒL„`m,EↃ<§;L”õ˜ íŒÙÌmFx6‰oGÓ;vTD;Úf$nµ>¬$›ëóHžãvŸ¹£_°ÇJ~¾1±"eâ)Åh­ˆ1o¿$šTÂŽ1¿fSb|MÑ\ÍÍw©¥ãý‹=½øTe”cY±ó¸¾ëÕ •.aâµ³p–ñOîŸfSá?Ùí'‚º‡áÒhñƒŠ¶š`µ2®;q2e²ùn ‰!^/ñá©,í e­™Ã 3Z€’eò¾³ág¿€SK•&ñ4 5ÕÉôVŒÆ5…–=£Íè·>5êÙ‹ŒzH¾`YL«ÖµŽYÃôŸ9ÅÄ–ä)ˆ©µvuùýEbÂQ»Þ¡G²Ä­„±—dö§Ø¯b⠲ą#%Q1q:‰ˆ!“3Ãþ‡'ô%›Ä'ˆÏ$Ïl…*’>±×R31A“ª^m&ñªCâM|x)®ií³›Ö—ÔÓÑЄe‡ìðÖ\¢"C²ÒÊÇŃâž\Žä‰ˆgyw"ÙT5A‰Žˆ·Ê©u‘oïkënƒ|ÜHT6pIAKõíù=ÆK)xøžx|ÓÐ`BJà<<.•DÑgH;¢ÖnvK—D쟒¹So¨Öm#í–…P­¥%ƒ‹d÷m²b›x^Ìä±²ù ³šGE*KŸèT„Wê9Р?³gIoÄÝIÐå¤ÒŽ9‹ "QåŒÂ–¨ÖbÒJžD*Ž0uöPåQyè»È¶ó¬çýzqKÔÊ€J¬fë„Ðx©`… )Üš…Ø5T H.ÿ-Eê fðÆ&©Ï¶ê¶Ìü¶|,eŒEËYDr£‘ŽV¬Ëêåf¾§Ù¼fcXÛx˜+õ4`ÇmÖaeÜÀÚÂÆõ5qÙš'+ŒŸà&ô¸]3 Ó ¶÷ö\ DÌšjf[pÃõxÞ¯Ö3¸-:æ)1kÀp·l¯ñ.3À{¹vÁ³ƒqÓxÈ9ÌÙ¹QR• ­ú…HmS©×¢§êc՛צ‹ ¯”Ü㚎´”ÛŽßC4G™{."q*è|€ûÃmEq2sRÙ`O¤öšj9$;x„I¦l¿ªÈ‡”ë¸Ûj×ô\å `´Þ1ã϶w)Ur~F"ŒñéÅÁ€Q²ØÒÛ@[Éå©Ðg"䔇ÄL*A6:¿»0.LÌØnݸv ÕQi¿¡áöÕ0µôt%ÞÌ©âõ©|}Ù]ÉÔ!s“){ÎÜJj•œãäLëþ©œëRèAâœÕžl‚?§Õëù`".~Öm ÿ©‰m»ÙŠ¢›ÞÎ:¯¤Ú §ªƒÅŠÜí#|v¤Ž‰vkøŠ€@@Ï ®¬F¾ŽŠðÍ=²‡ÎlxYܤÄq”ÒPÄM³9ûqÖ3C* vljºõŠF¶“IìÔ$s{Y)Á’U[)î~d0¨²MQóÇžÇ{Ô£×bôèY¢JŠŠ°™–uÛD›z»aBÁ¼¡[r× ˆ†ôiÊÙ£@Uµkbsd7Øö¸¹g¥jµL¤=ùì’JëÎ}¤ªnêv¢®O—@ŒS€t¦§Q@<ÿöJoòa€0‰&ÁŠy%Ï~ “©ŒˆÜý2 ßÍÄƉ&9™NÚo‚Q%| 8fÜBÇ"QÉDFme½WÅ×|¸i]#½»PË·»YëRŠGä1…ÓI¹‚Q{}ÝöúºV©8; ×.•PžŠ¸o=½U¯Ri\ó…+üðÜDyê™›"xJTÄi\}HT\a0Õ`¸2’y‚«Á<~jsy>ž™–ßE9Œ÷„æ’«ê[Á-Û—Ã-‚òŒñìnl>2•£²Ú*Aåè kº 2¶A{¦Y]×nYÝUú"ØTf?±ºª¹áÝÐéº{‚kúñ>Á„mC²h§[o î>ªÇ@×÷¯_ù®”Ìv—T¶  q';Eó[obX@ NùRÙÞ¿©ºÚÞH›ƒ¢l‘û!Eoö¢0ÔÁZ4jú¨sL ˆ’§ )À@¹ˆüeråõ,þÔŒ­7^ˆãUSã§îÚ±õÆ Jñu~Ò~[v…ºÁ,I‡ÕèEV!÷FËÖ¤ål.;ß Ùt+“üž±2àåÙ ©ÒðLÁZäÞ8Ìáí6X`\ß±Ÿd‰)¬üL¬ nPGÖ™a #:"72Ëú½Ä~2©Àؽê·P»äš (C;4 {žD¬ñF¨ Hª¾ðWyk>*wÜ5œŸ¨Ö½ „_Â81`nÊËd¼YŒà$6g¶›Q¨‚pB„k]‹ŠŽ¹Ê¶Q¶%ñ•éÔ¾¢‡"OX˜É‰^Ôrîܛޞ«ëÌdî›è´ý¸¸y‚ÞvËÇ–=OàPJUÚµb£=Q§c¬3C…¨˜6ã!o0·Âjb³ÃMS\K¶6ÄçVàæ}= M WÄDl˜^lL/1ìUå:Á&k'RPNìXßUpüÌjôž`ˆ,¶+À„ÌAD›OæÐ@ñ‹„¾ÞÌÅÙ³ÿX.¨ìÕ¥«1­Zß:fÍs_l€Ô”×”ëª[[,qƒé`Êt©¼Îäs, à "I~ÙîV% &dÑNà‰ŒF/²Kqß5ŽQ|ÃqXæF9áÌ4quUƒÁlÌ€Ž`²7`1–ˆ 0¦œb2ÞGĬqGcj=Ä®”­sÉÝ„/A\­µæ-Û¨ÑcmEŽãXKb—ËFZLöE.fÆ£ë1Š\QWt¬=²éÉïï·˜%¿ÅlÇ5ľpbw¤°Èeh©®´Ì %húÚ5¬;’€Qر‘‰®°¦ÌµHz‹‰æÌ“Û (ýc|M Å e©vB¾fð©¼Ñ{ÂS¾¦:ïœ×•ªÝ“]É *Ü "%¢]œ„qJ¢õ“ž5ãZ¯<$Ë] –€%Üõæ2}n´&_¸Öƒß³ o.[qéÖ:›ì GN„CP7²Û‡BS­õ‰©Ód/“=îPšÊ‰Ò ¶RÐ-ï].© À%Ã=»¨LíΓÁˆÜo·>P/‹"Muœ§ªÊ™2Ù¨î›Á…æ¿Â›êÍ*’£Šð‰iéŒr•±…’uO–íeMÄöZñÙ°ÛÊ9î‹$ó"ûö©Ú¦*¨‘½±2r·DÄÇèôÄsºÉž½6ƒÚë™AešXªý¶ÇZ‘˜¬]¬cˈŸ¢èƸ(D©/%U·lÉ· Ù³j*ã>‹Æ‰\Ö€|gš0­Æ´ž‰Ö$‚·ëʶü1rº1{â÷îŠòG˜’&M%ªüB9íbCš30@ЀLºl÷„½5ëyßК•I ŸQOHx–J¨©Å›¼Ò¢Ðe>û,»Ë©ºÀ½ÓT¾NSÝGTS—H–ÜÈ<îM`§À¹æeºI3:YÀ}þ °ˆ\È >cɱ·ÆtþÎhèÔI(K©qåK}FbÖTcXPà-7©’Œõ÷ÔGg†¬Ê$2š‡9ËêËe™\-¶ÙqöáÄ ›fbÑ`À¹Âb²)ød½>æþæ´=£˜b7m`Z{0ÎãHYú[#U5?æ‡!]•GM`e©îl¢µT´êªÝš9æÛkÆgEPÞ™lô†é¼ý~ÀIYé-*)[›áÎxŒµ]ï­ÈŠm™GDÕjGžn,—{kå{åj‘!ЬŸìåÝ É4½JŸ!ñeÊ7ç:ÞhD,fm‹êÃj-¢T26w]îã퉅1&Ûá[´&Èsò%ªÚd«xe#j¶†J—HÛ2ÑÒÈ7w¤Š&»8ë*O©J驨ƒÊ DãA|x@ÀŒ÷(Õ[Ç´ÖØÿǬ!Ü“d&ÃW¾ ’³ºƒ¶ËÌXÕLm4Æ¤ÏÆÔ¾>é=—ÖÇËÌ^,àüL>3üT;wàhcö°=öûDÃŒm{tï`²´…Þƒ×c EñÜÔ È=tª‚>£+¸Ò>œ?žÏ@Šjþd:æ/ÌSGÅÖnc|W+óšP  *ãË$Ž®LkˆTm-©ÑHôÌö†û7§êšI z*Hªè§æ&z!¦ç2†€4ðO ¸ ‰q㉦žÍÁèÓK'¥˜øEÕ:Æj9A*Û'Oä/{¾ÆÒÉ`Q˜ÃÕ5¡V‹vtnÍeEÉÀ=e(Z滄—™’lÊõ éJî•{±ýeÜêþÆ1ºùÓST!Îúë¨Ð™¨bÆ7¡âŽ=ª†sƒO(Ä)Qî™êÐÀ aì0·þØÎ"B²®ÞßïWû ®›MÙ‹c ÌÕQ§€T-/¹$ âF_äÝU]Š8 ´ÄÝEVUä1Ô×鮞„¸uËÓ~9ÓðIž¨>±p4 Ÿ|„OÐçÖÀÑ 1üLQ¸RimàÜðJ1çÂ)¦ãK2ÇólÎr”¬TL“Úô®Ô`5Ï4ºÚ#£nHÔÞ¬€ú²€”âzÉfb{EA‰`˜f”†Z´**rSÈ.͇'6k3xÇ¥‡-¤‡4uíQ©/"=Ùbd¸°l‡ =HÏBòv®£DïÇ`Z¦j4ú ËA­Ì“*í[)±ÜQC8†‡Ÿˆ'’ ¹­0TC˜1àÜ0hÓ͈ÝP³bŸÙvßgû>‹¶Ï  Ó(t±Ä¬5±Ó=®ÇóXa ç<<%fåó‡á6Öƒ5Þ%š÷57ü¸=»$!·1O¤°$bꤴSÍ”ÎÚí”wÛ©ü:ÚóÌf7ᕲ:Ú•jÈS¬;=ö=«ç{!Ôê©·õòž™¨Óúf²¦M2^z®6#cîN`Kum£}C ¾^=ÕŠ:áœîVûÌÌ=WÔÇlጠKŸéÑg¦Q;OºM¶n&cç`e³„å=|2šVóÄÖ'4kß3¦ÉÚcß­^)^žÖp |†\øŸÀä§æ©êá ¤œ›GªàÜF«¾@wæ–æ3x=êEßëÓ×áûI£xÎçK°ÂÈwK ÉœVT©óô5ÖËã’IèGé™ëß‘S–ræÁ4ó'æ~üÌ\')h0ïÑ{Ì¥æÒÜ>+EÀ œ¥¶®@cXÔÒ–Òpø>±h ?3šR´ô.'+p矫§kö™êpPá"`&z¿Ÿ{S8ôžñh´´©Ð6Àœ0Xæ:ÈW8ëQN7ñµ­ÌqÔ + §3²~ÔŽ—4ãáóÝÿ‚÷œ endstream endobj 3356 0 obj 6318 endobj 3360 0 obj [156 /XYZ 31.5000000 347.750000 0] endobj 3361 0 obj [156 /XYZ 32.2500000 347 0] endobj 3362 0 obj << /Type /Annot /Subtype /Link /Rect [86.2500000 537.500000 134.250000 544.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 3363 0 obj << /Type /Annot /Subtype /Link /Rect [330.750000 453.500000 385.500000 460.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn26 >> endobj 3359 0 obj << /Type /Page /Parent 2 0 R /Contents 3364 0 R /Resources 3366 0 R /Annots 3367 0 R /MediaBox [0 0 595 842] >> endobj 3366 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 3367 0 obj [ 3362 0 R 3363 0 R ] endobj 3364 0 obj << /Length 3365 0 R /Filter /FlateDecode >> stream xœí]ÉŽäÈ‘½çWÄY€¢é 7`0@m)@…*@aƒÖhBwcJ:è÷ ™áÌ礿4szD° ÝU,:}1·Ýžýô‡oÿ½ûßî~úôíÿw?¿úöTíÛº:ÿ³;þúýëØn?üy×võîç_Ÿ~ì~<}}úzøï§ó ß>ýéð§íìî‡ÿ¾ûË~ø×á/ÿ¯O­i¿ÿrú½oÍáOÕå÷ãÏÿïéÏ¿ÛývqüÜ0™ëÿÿ½©o›ã4f>ýãi\¦9ýúçÏ¿=ýtÞ€´¯¸ÊöµÝïüÎôÞîþñ?O;|`¾Ú÷Þ˜¶ñmõžµöð%WUíÎØþ°7õä;§_2£…ÁMeô?Í\zSŒkLtpÉ“5µ;oOÝjlþ8ºÆæÛªW$›ãÌ¥7eüçîûߟüÞ»³Gìø÷ÎOÚÓ“nßõUcë×Oºó“—x8ˆEƒüÄÂßiÐ;¶ƒïÀÑ"3ørzRï晹~g`\ú“ª>=qûÚ7][/:gÙ7xr¶‡£Á“‹ìèÇ€dðñG¶n ÍUp»:¸Å̙ј£d Ïš8<7ƒ÷Úœž7÷®Ý‰°›3yGÜ~fJÄh’!øiäÚ`2ãáàKÞñÙ{ôåûAZ꺺2¤‹àA€÷Ã[Ç\æˆÌ˜lB àuEFûĜ¼0 ;›ƒ(vzè²i\@—î<Ã~šÍ˜Ðçµï\kÂ;‡)ÞŸ3æ2Î%û0=O.ÃA3i±“ÉbùÌìy:×½k/æóÌ©+^æÞ÷áe¶¡Ú7­¹¾²çëgê}Õ»ëcÅæåY[0v|´äÀeÅñD_Áª 61,º"¬(²9 Ò‘0±"—:‡D5Æv¡H}†B°ƒ‚ó |òIôðI§}§­êÅ:BóXZúÞ”³ØBÎÊ„Â3÷BÖÅ‚™¿x´åj’Q×JG—g×ÎÌœ‰£i°vÁ4#÷/—£o¹A9«©¼ñĦJÛÔ‹ˆ ^:&¾‹¯Ö{OipXéŠÌö$\å/Œá–æ[³Æ6už¼R ßñðÏðÉG8´Ý«%i–˜µ…ûæà;‘=€+­àw"+ŧÝg¼3u-€ïLž™¶]nšÏuÞp4 W¹uxDw'27#É/#3Àt‰ù%žÜ¼G‹PÕêÔk0]C¹Ù7Fž1û¦á=Vå¾q Þ“î’SF-´Póf<¨ ¡oÙ 2e€Ê†tÿ%Ÿ45]S ?Ú¤é&M7išYšnv£°Ý˜Mo°Þ\KZ²ãZÒMÆK¼Ü;›*¥ÆqáiÝ´SJ‘¬mÕ†t­œ4ù«XÙu“:³xŽ%††3åðFÒ?ú Ä¢#Ù0xÏ'ë‡t¼¯Ã‹JDd±ÄñF.¨h2hdn¢I´‘&‘é#k2˦Ð'„±"ËÀ„±%`ÉäÉæÊˆl V8ÁÓ*17áD¬:$(¾É9 BÆã8›½Œš‰•¤–@NНŸD¾#^˜l1R¹¹ª­6¾œéj•ºÉž`ÂþÝÉ]—½”º&[‘Êl>c?‰šÌ5ØüŒ-™%‹jt/6›Ãj&íØ´ÁN­–KÅ^'ÜSV’Lxäò’µÈÝ`, †ÍauKVm ªÂhi¶†á´¬å—’ò­ˆN)Åò#”Èq*¦!¬ à2È5³œ©ïA¦¥e;ÀX)/.:?ˆXS3`"É|gí‰'L>3ަ[æL!8ÇÙ3æ@;ç¯y:“c˜g¦õ%e0SþFÑ4²ez=P¦×v¦ä™Šj"[æöî¸KQkž Ç(gˆCÃ!bRS-’p“…’É…³ªÉä_œ[›ª±©›ª±iiªF>Ø-à\Û“²éRÔAdkbn%»ŽÊ¸g}_ -—üäqî™cîÌvÏfîYmºbh¹ä'sÏp èFïÙú¢ºýô‚B)ÕE"±LÌG‰ oVdnDa$i$K¡_žùm:2ôñ”­kƒR·`€î>a´€JrrÇDk&"ìsŽEÉf~k ¸6¼Ã_ "™˜:EÙ²Š-©NÓû­'ÏPþ3×[6—«SÑêL]¶‡i:¹PI°¹8Ó”g5° ¦`:!Œ*\)™ @³ ±íBÝWVc˜3#›˜*]Ñ$gf™AàHÑlæ¤\€5¾Õx/ðþ%ö-7EDß¹ÓTc¤‚rî06©(CÀº%3iE³U†§ƒ}²×ýgÏ?YD&¡¬®š`Z«D|ø‚3M‰dõ[6`.lâLfJÇ£=ž¬95»Ýýúd;÷ú¿<}ËÞîö8…krÓ×\l׆߼¥® ­)fŠ™œ¬o)Á+S«˜•;ú:¤K&m+‚OI$¨Ef€f Ú%^žƒSŠÃ‰7V³Ý¸Py£, |§ /£UGfp›p0É> ͆Ÿ® YÊM’‚rd£,!wZ.§@¹½—²$»ýJ”X6ayƤ|GäN¶Á5ÑPÚ{(µ6}#:·òõ¤ÓÞ*¬ßÁ7:;Ë76ü…-qf7™t¸q‡9îÐV—RÃÂñZ{ùêV¹EÊsÒ­(òþÎtÃ_ŽÀ¶íçEùº%¢èL|=â¤`zzˆÂ” cûcG—,°l^2>mÑÈP$Š)‘Ù¢ƒòÔ.±E6Ř¥' ¢¹NuØÑ§”H¡Pžâ´qÓØ‰IQPMÔ¶DŸ,R-tgè²0â÷™œò ñ‡I-ždÆá³áÜ Fëöäkkê7i^c'566"Žm¤ˆŒw'× ð)Ì:÷5Àë.dàL},h¼©¢¹ê.[”"‹Y©l/¢P0‡?ÃSA&Uë ´˜œã©m¯–öÌÎê¶Z.žIÈYÞ+U¸ hùyÔ]ý…m.ïÂÄ|açªv“­9O ùµGû6<ûMIÝ”TrÅ€[­›×d×MÞټٸʩö],oK}‹Î­üÔ7ÍTûº¨EßÎ<&¦ßALÏ(/£ZØJ)ÓâÎ<Tòü*®.ÙrC]©Û·¡ÔÝ ÍÈ£ÐÓ…ˆ%tÝlÐ ¹ZËFI‹)Óbà…s£æÎIß ×™úÄW8%$——µÀ¤”\KgB: ø4LøŸ‰xˆB½t2m4FKfâÌ£p°PdÄòÜ#ñÂóî.ɆHMÈ8÷•ГWRŒwĦÂÌby»5|ê7„x["ÑdbÊÁÜ4¢…Þ† ‹  Ÿ"êôc´2CgöÔen×t¡ÌÅž‚ò4Ea½™a“ð÷•ƒôëjôÄÔp«á“œ®ly«óÀ\eTÙâÌdú—0z¯¨e%ê~Þ|Sï«Þ]e6Ù‘ x'ƒr¨}ð89½y[¤}‹´O¡9 ¨…2wtÓé(çcBôò«#}²Z´¬íqL¿õEþúúãý{˜K|¬k0Ð܆•¬ÁÜ&œ“©£ƒìí^9}»éÛ¤`bjD{Á<„zð °–„׃ÁöUî*  ­Ò «B*ðÍÀ÷*‰Þ ‘Ñ"‡øöÇ)žfXøö«^ÿàˆo¯´9.4r0˜´bú€QXDË>*¦ˆŸ`–ͨ¸Ø8žSâÐÒ5é«]}HK¹{%ôc óå 2á)¦O l Z4ð>+QXt‡’ʪ‰wcfØìIó3âb2ïœÁEšMRÔ"38I³·æt¾‹xÃùž?¾ôòä™X~G]6¦…0ãIô07ðƒv^Lƒš‡¹ìºn”'Ì÷æÏ­|,“[”Ý]t^~F ßþ`RÌñ æ;Z[2éó½q‡÷pÛÌr‡ˆ€o-\]DÁòß&¢ö‰ñÖ1|có1^|ŒB·öq81–`L=Ûð$Gñæ[ë.¢q@ßø÷Ü­­qÀ2ç[ã€û;Ó­q€p!§¯Ì¥u;®‘a 72å´¼M´¬êƒ VÑQ4}×¾ W \:”«ƒl‹™(æw¶ôo¦ÄòbÀÇ5g®)[Ì`Ë0eWN©ªTÎù³-òŠÃ)ÃNe‘<µñ¡h¿eß³f²coK8–‰bÌx˜o1p3„ºÙƒ,‰„]¨³Þ¦I¿Á?•€‹GÃâl3`NA¿aCgßf—ªßl‚o®ɬY®¤½e]ª.I¶Á³d*3‰´}ÙÚÝ‹–¨åÎV_ÅT^iѪõ0“ùq,À›ñ}©«Î£ûÐ]l ¦B_¶Ø¹˜B¥<ö½¦ë¯±Áñ2x³æ‚ÇÄ3…Ã|‘”†˜6(˜?¦z‘ÙHѺÆHEN‚SCkÍülbäê¯.ïñÌ0ßw`FÍÊKvåòûcÇSäÖ0U¼Ú²j[HI†b:£MåšrùÅYiß™áDéä´1Ü¥H0ï¬(“ºžqkè»Þ·W%eZÓ7æ\È>ç²û.ÝK‡LSí›Ö\‹ÁÛT©DÝ~LÅ[DÅ™°Ù|ÙíDÂËHDM9ˆ©,t<3ö€ç÷u7§-*ОÂð¯Là`}­IŠBÄž£ Ì"ðu ³ÌòrmÆÃB!?®‡…Y:åÁ^ c£È¶)f c·ÁÖ™ÜW,ÉñðÌma²d‰ïPþAÁB4³vãf²ÜL3dUõ6Ãö9\­l _&o³£7;Z¯´"WW–Rz?{ Jl÷'kiÆv„Óšà”ùf &dŽËi‚™[P4CŒR˜°ÁLyÊ5aï¨ Lci“ýK+ØSÂÌ‘ÀWœš²‘§{SoÁ?¶<ÉxBªLÂ*9k±Ê§1¤wa˜\‘$‹G+úqˆ~*ÿÁÆ•¥9›Es6]¨º È5IÖнtáÅï0 aâi€ÓÉ+éÂ$Aaµ’ÙH&ˆÈxd$4-ªÑqfQôxš1 Ÿ*'ªfNÒz·SŽ ßúùF,ŒL”mýÑ—Ÿ¼÷p“ãLõ¢Žl*ðnA„Á15l¸½öòÂ_C!&–SÖí¬›ÖO”n¼?ùáBMç5½ì\ƒž \©Ùé¯Þñð½3ÜŽÃÝ ØÄ£˜Ñ’@ò?é! Ñøýc¿O_Gdø;_ГÈwÎôÔîû.<±ð,-üÎ3\éynÖ ØjÒwL.”-s7ÏȰ¡n„TËÕó±¤Dk*îÎm%‘k™Rˆ«B( P~‚ã}´yº‰ÂŠ„\Òµ¬½bzè¦Kº@&ÞV×™/R4‹‘ì­7#7Øðácøðšyd™0^#sû˜‘ÆšùùDðpëô'‘ï0t‰#/xeQï0l Ãla¨±H—"|>Ìhxw0GÁ¶5:2kQA¦ßµ;xà;Â3]iï÷þ‹i.àim?»¿*ßyV×_zщ¹ææ¿êÜÖ«&¿.²u ˆÎwôczüÀ=(¹S@Z¤«ëÙùÈ>‘Õ<ÜyánŽðÎØL¨ÊëkC‘3-_~ä¹Míó•“ð3ŠƒVqM RÀÐ"HðŒi`Î DŠ0˜š>"NÀä°É∠òQ…É ç$’q› ‚ ã 2a•„ Y‡w¦ºM¦˜F¶jÀˆwó.M$äù°`‰™¦@êº@"¥T`à\Š%ؘ äèj1LÙTOÑzΓ³4·h›€ì3G(¯tk}x¥K t&%®$0¢iùãú²©øº0€R+¤»¡f‰À¡Ð ™UÍŒ—`„e3µ „¨*‘*Ú~r‡¼Gybª.¼²Úø †h é¬B¦LFÆOȈ ?â@ váϹý5 ÌV6UcQŽ™Ðûàz£@’IP\^¸žÙËb%®¢Bø(DÒmgYJŸ²Âð‹V$ÛœW"TÛ  Óì`Kq×v|Pø˜¡ÂM†è ®àãs®8ĽÔïÅ"ædj € ‘JÌåîM>Jô:˜îð„rˆâ+ÆŸé&K3‹1É•]£Up‹G°Aš¦ Vý@"]B~FÔ6¾MÓKÞµáëfP'# Ö\rX+Áåƒ/YB’‹ Ì–”²ºêjÄj& "“eT"¤$ ²žB³Ì• 4á~`“eà³e$>'ÐRÑÖwkv¶0Ö&ˆ$¸!¹Z PÐK°ßˆ±À˜V¢Ñ‡Y“ ƒ±ég/ôÖí$¿+-ÖÄ”í‹vIG7J»/àQÎp›M¤ïÉ)ý—£\læ#7ÐhS(%ˆÉ­ñ4®ß(&ŽP»ê}Õ»ëõ`62”`ØñÑ’ˆø dã#™[¥r‘%®Íæ!]›Í׿Ê¿ü1sJ„¦²éñîTÜ\îÃ\•A÷8¥ZfÁ„ð\ GÂ~=ÑÜÛiä”q'`úN€ä%tVªåˆD=Íú7š‚¸Ïäa4mQ¾š-Á»ZûåÂVWA¢bܧ[,ƒK³ë%ÏNV¹•õÞ) !&‡V–!F|t¹ j{A‹`*ä¸"!6E8Ëzï‰Seô­;IrgDÐ4ŸÑ˜E•™6“m»34„l­‹4t=s® ¹ëÖKˆ¡º wJ$¢1á7EqÙqÿ¹©FØ…L\-#ðtÝ^ &7°Ç ì1>· ìñÁÀë¾ì ¹%À-Aÿò´‡„702æB™öz{²=¹Ç'6"Y0¿Åð³â•Y–mø 6G]Šre@òe(ÈaøÙˆþ…)„ Œö3ÐuÉߘFån2’ß1Z,Ó,Û¥¤ê龂ßÁ· ¾SÀM‡ßñxøn¼ÒˆM‰¹3üLñØÒÂwNT –•ü¹šݨ }°úB$²/8¸#N¬Íí‚ùÔ‡lámtšÖ½çn07ú&›WróJ.’Öú™­½´ -ÁZ¯#Äò’Æ:Ÿ–RØ¥^`/\b,R®¿~Qþj-P*^ŽûÇTLÊô7yPLY_™€›«W4ÅÑTáD¤\… "É_Ê(rk«Ë‚ßDög·2bˆýÅüár endstream endobj 3365 0 obj 6178 endobj 3369 0 obj [157 /XYZ 31.5000000 206.750000 0] endobj 3370 0 obj [157 /XYZ 32.2500000 205.250000 0] endobj 3371 0 obj << /Type /Annot /Subtype /Link /Rect [222 152 308.250000 158.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.sourceware.org/libffi/) >> >> endobj 3368 0 obj << /Type /Page /Parent 2 0 R /Contents 3372 0 R /Resources 3374 0 R /Annots 3375 0 R /MediaBox [0 0 595 842] >> endobj 3374 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 3375 0 obj [ 3371 0 R ] endobj 3372 0 obj << /Length 3373 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sÙ¾€ €žr H@A'0l#Jùû™ÙáìjÉùjØ«‹=³´`K^Šd³ºž_UW}ÿÇÏßýó¿»ïß}þ÷î‡á÷wŸª}[W§vÇ_ß}ûßí‡?ïÚ®ÞýðëÃ×ÝׇOŸÿýúpºáó»?þô¿ßýéðïÏ»¿þíðÇ¿tü ¿>´®=üþËãï}몞~?þü_ùÝî·ãϯóòÿ¿sµ±=.ãÊ«¿>œ?Ó=þúï¿=|"@Ú[B»>î\ ‡ÿôÑïþó‡Ÿ/8?¾Ú÷ѹ¶‰mµäE­?¾©múóýìu7yÑã/Ç;ý‡×•o²=ü´ruª¸Ð8ù銛[ûª=¨kcú?=>ý›ª«òqÎãÊÕ©2l®ðtÅÍm\µ9èÿüø MƇ?®\*Ãæ OßwÍðü3ùîîøâxx¥‹®Ûe5Ms`ÛÓÖŸcwžŸ¯ÿð¶ïó=ü´r}²œkúøO)Áký–¯Âo¿<|ÿñÀrr6»/?Vwzção_d©wßlY_u»/?î~_U.þa÷åç‡~ßøú¼ÄkWªðÊ;xå ºâëôxŸ~O„+áª;âiýã•_Ì}}[Ì>bO˜} ^»U½…Wz¸‚–øxO ö'Vð=p¼§‚´vSÓ¯ ¾'âÀ÷”ü¥˜G­ds|hà—ν¦Ú.6K´”Í«Wl¾®©—|ä÷Ë–ÇúÛJ#ý_aÙÒ•n¼6,[Fr}¦ß³¾Pˆéâýj‘ÛÙ¦ïµÞÚƒWÆêôÊúL„»8·¯cÓµõ7$8)¡nßõÕ#}ž¯œH÷1œåç+'&ç‡MT@7–ÕK‡ï{x\¬Çߪô÷`¢«†+p˜:'ɯ÷ÁwîÅ׿à÷¸“ÿàÂùqsö§%£o¿ê§3Ìä$ ~Úä3&?€÷ *iA1#OX”ÓÒ fª‰æ`Ô&~1âðiÔöãïÁ4À«Æ+ÀÔI…w¹WíÆÖ +wÌÑÂæD°n-æÇ¢D˜gAÛwˆŸ(îĪî͈(X× 6_î™ßÔ?¹jg×±mê‘áªKõ4Ÿü c§ì.þ«Ð½¬/dRŠ~P… €¯`ž¨CLsìÁ1ª)YC§4|v±9Ñõà_kæ0oŠK¢êõùãÇc?@×ßÀQté„íI 5#D ´‚Ó;72X–'Îc7‹ïÁÚø=a:>B§3òdgÆ2&heÌ#Xû3/䏸 %п˜PÂ+Tlñb3ð㿪ã~b^Âr…}™„Õc‹-þbÆ83þ#a³Ö‡.„C×ñAhF[u¬Mxi«(¥‹}&fÅÂÅPWÕÜL"×uͨ½ŒŸÉ5`¢¨²å›29~ZÁ˜2PaŠN#æÅjª›£a aÃÍTí›Ö½üÒÓª]½?hì—O{Ÿö6{ÄsÂÊœó· ZU@’m¶óaDîõ "1ÃÄaTLŠ‚±0ŒÇ?!$“›3RyT®rÒò¸ l€)t!„VQÝúPµnJ\0Ž,¨[é± É™:îê±S‚¼ó[pÅã”{5_ ¯ï ß’ÅäX{vCY‘ì¨Þúz™Âˆ”<³•‚æ xš[²*špñ|â ;áT~Qß-0÷–ŽÀ#œÂûÄhÝ´9^£MT1×i™˜Ñg*6‡“Ÿ·`>¸0Ò(Âé ¾êŸƒÈ¨,ç“_~[ „N$ ×f)?_ÊÀgÐjM6âNðK& ÐE²Kö¶tÖŒ'ÈDG ü§òYU^ O›”n$Ôëa‚ê®1o€È«èbL˜9§$œÕbèV¨S„+6ÆÑvrÌáô3æN]u¢ZíQ€§@ø±ÓâU€€JIÌ?¸MK&$XI†g×·’×ôp×´pËrä3~QG_d…²0µ Vg˨˜FÁ´ŽZ$àKªZ‚P)þÆúõµÀd*xeÝ(¹j}«Ò-ÒêUÚTŒš#³Â¢oF&6¥ÖJ5#´^ÅÈ{BYf#æH•:Ñ"‰rêiä¥\•7æ. ¥HU¤Ë,º~õÇ-¹±†Ñc í“Îm°Ðü8:^{-š³¾þ°ÊkѰY]›FÜ´~æfµž9V¶Ö?–5utÅie7™,™?}à…zƒ)w1nÓ5¿Ð}ëš« ]t2yu#‹¿œ·ÂÉÕ~´ù¸°Ç½Pñ=°«®Ð%woÇW²×Kyß(•ßð!ŒEóÞ[N\å¬Ì’ƒ…%SeͼG5ÀøTÿÇ‘æXÉêLÇV‰žTöpÔ’õ:Ÿ­Ì¢™Û–»±ƒŠ§ñó]˜öª]Èè/´];¢SÓ9\`8 [aqÁÊŸ@ ¨ã& å­Ì’ˆ`ŒêãlH߉bܸõ ÆæûACgA“A>>m=12¸Â¤0èæ=aˆ@•3à 3>¨”´€ã¥SL aÓu ®9—Áµá‘>Ò:BZS\¥ÖÌi†v¨û«ë†ðèŽs"Þc8°¨öí¢aV´ÒpUåû%ã5ñ˜0a%¡ï({¤:’ k¨@¬€Yu`ì¡qu¿§†÷à+”f/Øîaê`ëf̽&º&¸EÃ-´¯òHfbÀmÄ+ÀZkH›àh±FÒBŠz<°jeF —‘¥Å– `Å2ù’²éëK:Œã”mmá1L¨— e®PÁq<Žùk8B÷ ¸ ¶79Ü[wpI† µx ZGlk»©Ê‰L Å GŽ„'"¬° z‰ùZàD+ïS~©ÀUŠ!Ä)XêËðQÚpu·”¯`½Žý¬×1z5æÌ—Dišé>ö~Ážèö¾¾ÒèÜîÙ0°¢10cÔV‰f¸™a4C&ý­M`í‰Ñ l'˜ÒbF61úˆó˜Ç€š‹¢Á†¨I¶ŸÉöcºaßCTÜ>GÄMBî´O:Æ%hæJÉ•xï¼åó3±9gáq=“ò¥Šc-ñÚd#6k/â½Ç8~üž߃=JŒ—@ÙļŒ9VÀôð=ØKÂ÷Ø^±‘ÀnQ5Ææ!ÛyȪÖÄRË×Õ’,|ÉyÃZ5káá x,Ît`^Æ4€ËÄó²ªlHkÁZ=F<öÂQ•Ú/Éémg¶¼î–×½÷-¯Ëåu™cN¥PÞl ô_¸GÕ·Ó•àÒ³·u´®Ú2¾U!ߺ±ÎÜ[f‰ënI>›Š›VK×ÏÜÜ[±Àø®åÁ’«Q1z“žkѱ£¡ömªEU,7‰ë¬¯!KG_×µùc¶!Xç-ý±¦^rf˜ÒwûVÊkÃgø‰zeÔ {6Xç3µ/ØóTõî^‘×edy ñÇÚ›Èåb^Æ>Îýà÷`? Júò¥%÷õ×›ÍáZA+âNGXÃá8ù—›ÐªuÖ´õ#'JWl©¶¼÷kË{·á2 [Þ»í°å½·¼7»s[Þ» .=ïÝÖæ§–7œµœµm­3Ö8kÛ›ç• ÆY_OÜ´a™EDa†z¬sOoUÅŒðnaÏæ*BbCožAÛúXšYSÙŠK²•–ö¾k–ä-<Ž?!š¯Ë#ÔÉtì•bÎ&¢2¡o{ÁÁTNž‡äò|ïÏXâë™ä DbØ—Æ6*—Þæ,‰2ó>†«\¾ïQ’í|ÿv¾‰6K¢×5¤ï¶®|³î¹É®|¯h2……oŽï] 3ºr¦êEšõ#â#óê®@èxLôÖÅyŠ@0›ƒ{´€— #ÎæÀ¶ |ñ;ÄZ›ªnÕ÷ šyçüK¡»4¯’™¸ÑaÆ%1K3žØ ì«„Yìð{„§ÝÇ4Tf˜°ÕVN™2ä` 9Ó²úáɰxšìÛñêñ‰©¿øip>ãÚöäUwá`£^*Ÿ蘚Q‡®+c,%ó/˜úœÓðø‰å 'Ǻa×§©8³X'sI„±+o–‰½¨Ëùjl)… ÍVB8Êø¸øÅpu“u‚mMÈîeBŒg0ÔÞ^¸gÁ,½öˆrŒËFÕhÈX@ Ÿ*T“;öÄKŸÁ˜ÆL1%KXbNÉá/'Õ,`6›¦ùV,Ó ¾««ÚhÈ=k¾„LµžEpȉàwÂ5¤?ˆã‚ûÂD÷ºv nËÝI@n”½ ,X &¨§êЈÝ`d=ÁRNàÅÎÏDšW7{ÅÔiä/ö q%ƒº‘KRuC¸¼«%¥æãç‚(­‘ðcÓ¾¾¶R;pÞF%;£lUT )VØ·$6YðGï)íë|36XB·wÜk€é»I¨u*‚psð~l§ï*T5@"Ÿšç1që+!ݛ—˜’zÌN“Šs@Ë›MÔ9˜duÌ–<™té”(ŽªœïJØìB‹ &ÚÔcG`SüÇ”š3Ìú AÂ.x,P6gÎU2c4„«·‰µsr£ûÃ4DWÝ9ܤ޲…íxæe“±&Bcclµˆ1)ºü_²–Žtèr,l¢ÎŒÍUÔ÷”YÛúÚ·ËÆ ë…vÙ÷Fȉ¯‡˜ã_ ° }=4ˆÐ˺J£»‰QÕÛ•» 7Ky>ûºi°YÊÊãÁ,¯†ÑÈ[À#ø<^5q¥Œ!8¡zÊj´ ñ‰ŒÆÔÝ& ¼‡@Ιط‰ìbZ3ùü=”~Ùö”ÛS]ĉÁ¼Œëéÿ+å§¡?§v¨S*çV«ÎTés»r>ߣ{‚Ъ õ¤Šƒ(Ñ=£9èN*ñ³W¥è6^Ô=ÊJUæ0ïa Œ–ô‚Ê^vîúlç27˜¶ÊÛ:—]`'¬§ E œ²U홪rÖîyßteø€f?dßgÝÓ£{ýxë‘õ¸ðw®@ádÒ=C휋ûqëÓ¿Ãi´nú4bÕù± kÃW†ÈöÂÚüRLêKñ N÷´û¾}é`G’V0¸™—®àÔn-Z›p%{ú!̯«öL¨)«}Óº—±–î(À{EÂ8°ˆ‹Pô*±BJŽi¤KäíTŠAÖkAưѳD¹›¬î¤ìSŽ–5Fû™é0‡4ï`¢\½¯ú‘£ÑÌ¡pÖùó¥LZtA%g•Ë0õëÙ®Q£/u-“¸#`%«á›VøF©Rf¥EWë¨Zž”™L2LÕà0™òÄ€ ̼xè›J€r3ˆêÍ„¶“ºõØÌ¾µ)›uv¬[<¦q¦j%‡@¢PÁùa”Ãâj…ÉnN?ih5>7aå…iÊÍàU¡<1øDw¸ˆ2\oTæ@å0¯Ö=^M¸ÀwO:uCÒ”Ò"ígÃä¬YqÝh#¨u2%䌌241ßPˆ¬¦”')ÃŦœeÐhšœR× ›:Öm;ŸW­è²j ¦|÷‡™hL·N`²XÇ0š„ðÅODç,H~°´Ÿ¯µìþúÌ/pQ¾¤lƒ™T Þ…IÁ‹nð@T(aa¦&2çatýç×ëNé2÷9,Õ#G*Si_-B–õ€_7‰——8ßóÿª§qغ!•L%4+uøh¾{®’Dc 9Uíº5aH!±Ùy»úi²HîጫŸ©Z¿#LÉÄ©b°ù.I~cë}q´ry‘Ñ1ñ”á\åÍ`¥ØÕ(‰¤<¡ž9w¤Û³…Ù9•C&Fè˜@|Œ2àµ1Ú×ê´(—¸Ý“²À\¨ídÄ=se‚‘f jòÊ ¾ lâ”rÂ@·Žt¾ ¤"ÅIlG ÖT5>Áœ_gª+U6ŽpQûÍ ¨)j(¡ C¥x8ùèANÛ2Lr~6.º»Jµ‚Á*Ÿ™Ï”ú–î)N?™EC—?;üø% ™J7AgcÈ Šþ0'ø’1a|E(Á'®ØS‚gËó›QðSƆiA€ ØÕÅ{[²¼«~Ò'ÙuSÙ=Šà£öëpÿ¯ml¿ýÁ/Ÿ ™Gµ—ðR- £‹.mÇ–¼q™ý[ªèèN¼•Õ;*×L3©{?©¯ÝH˜swFÁñô30&FœüN8ˆgÓ¸îAUšø$”f2­ÈÊç¨2Éá¹+vi“àkIf¹àæhÓü'Ö‘ ÂÐìû«Aˆàc ›ï£ dVë ÚÕøª›“³V¦®Gû¬{°X·TåfÊQ`ÝAاSm.˜i]Fœ<¥\ÕXU7P)mݪ¦”ð#ôÆË;M̨T!Ö³ÊëZ5±º“H8¡tóšñÍÙ44†‘!¥jÙ™ŠAÕÄ·Ykà;“+`MØŸÈZ¢PŠÓèUhhÕ‘Š9*aÖxˆðútÛÛS©uÃ'‡òóM87´ÆCo©*™®$Ô¡0à›*_`Æò–í(Ÿ”+ØæRG æ•XÂZ•=ë'™Ò³+ ZÒµ•Š24n¤)‡vÂEª˜FÅ”KWÞh‘Ž0¦GþZ¥¡©çó;ͱ\_â´nݳí8Ìœ«a´­j=z–ÑŽÚ/º a¾IÞPiÔï×ùâó"º"ÜÓ£+ìxéJ@W¾µˆ‹~ªú²^,ÒÊ&$[SòrXx ›×¼wÓmƒæ]0Õ5¼’Ý w0^ÖwöãwnM?î¿é“>ÒÅnê¬O§B™z-Ì¢TM»jâ4¥Ñ–Uß%¢´œª¹„¢€Çªi%ö⫝̸•4!ŽãÖ \?9ùÛ´£õ§1Ö62Ö–qœn‰Ã‘¨¼‘r{òÂÛ§.ü“_ z[tÅÁ:Â+Ãö] z+øãà÷ {¢ô´é.}\u…aŸþfmþM: 0݆†K—Vð>:x·ñ÷;׿ðÂ+PÝS]­ 0{*È)ä:ªr*H=¡ß0¨'pmV¤4~³ „”¬¯{ÉòjØ× »ûÜÂë⊮¶ÃHé4†/¡~b´ödïÇfï›§"¬+ }±åÆ:I°¨P— RG$4˜½ÿ +À{O\¡ÖöÖǺ°@‹i.§©¥IdXÕÿ ˜/{»}ì*¿`u=]KeæÇB˜î£w¯ogQþðk÷õ@bq>]û 3°Äîb¹” ûʱ§eT/L§u·°ÉïýãDä©GÖL¯ Çý~À¾¾áY\²õ½'\Ka\ZÛÇáKü†Ëxâó’*¸X7|úäæÄEà4¿ð? Þ38|.éÓÛg¶eîøçÊÏ+Ç ›:ð=˜ÜÇáTš„K“/0.u¦w7b5üC®ê'‹u0Н YZøtæKñ   Ö1e:ø¸‚•Ä™¼´6xåÛhĶ ûA‰Ï”HÈ.þ›ãW-էݧ‡ÿ¼·áç endstream endobj 3373 0 obj 6563 endobj 3376 0 obj << /Type /Page /Parent 2 0 R /Contents 3377 0 R /Resources 3379 0 R /Annots 3380 0 R /MediaBox [0 0 595 842] >> endobj 3379 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 3380 0 obj [ ] endobj 3377 0 obj << /Length 3378 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯à9€FìÉ&Ð3@Z ‡ ‡@¶±‘ùûáîpv¥™ùj†_×›³´`¯¬Éê®wu=ÞþéË?ªþ^½ýðå?Õ×ñç‡/›zÛ5õîŸêñ×›oÿÀ§íøûªKMõõ×ÍCõ°¹ÛÜ ÿ}Øìøòá/ÃïþWùêÏÿ¿Tûûð‡?Žéñ/üºé\7üü÷ÓϾsÃïêçŸþ¯Í_ÿPýöøÆýçF`¾ÿÿ7® Ñ¥G0Î|úa³ß¦{úõû×ß6ow0í+¡nSh+C¬\}õߟ6?Ø¿¾Þöѹ®]ó¡Î?~©í†ø~xSðîèKO¿”Þ¯ÿò®ï¯÷òäúÇâBëμ^¿ÉÕn<¢¾©õOé›÷«¿ÜÕõòµð»ƒ\ÿXFüžxýÝ”×`XD1ô <øþ~óö³‹n8ζºÿy€n÷ͧ÷ñ4Õ›GÙÓöÕýÕëÚŪû_6ý¶õÍÄs+õ'¸ò®¼C+¾Ÿ÷ÓŸ‰5|„-bÞøòBÝÂx¢'ê!æ0î'$U Q¥ªÂ NÃîÜ>Ýl|uL©ÄxÔå@LIXÔNó „ýtÓW0% ˜ûHìÊ aÊ'|Ö?˜›te †ÚÁ•eR¦áŒ#Ü`¨BÞ!‰ûºËĘ.1-3”$àÞÈ~òØ ` ĹYq†î`>Ã+Œ6 ï ùÌ·9|F¬0¿ƒ5` j¬éÝÄð&Ô‚F]½+É»‚߬|npExÚ7ç«a’ª…ر1–ƒ‚®%¤¦±®P’Ç707aêÃg€9ÿ0•«j‰OG°±µ\«¢ÆÜ¤ì%` „µ«³Š"cS(÷ºö)¶11ÑeÊþ)X–cžÑÅÇÖ.ÞÆjÛÛ‚R¥D&ZÂX‡QsØQöü0 çÇÄD„g0gÍÎÁ§Eh£n8¢btް‚%>¶\1ÅbÎÀ2 Ë,Ó07áHŽ%î½3Æcøh¸»hM¥VvlÄ5Hq±àL†’-0,"†ßY¼SeßÜRŽ59C¦2©[BfEÉòÅcù‚÷C¬˜ÒoŸsËë±çï½­rg„È>¶§0%þ„r†ŒU¤ÊúœÛß}ZJB×ìc£5¤RŒ;O˜Ì¼Bè^ÊSƇí"fÏD…ø ¤_&Ž œ( ðwT³Ü˜p·Ld¹Qö.¦D|ø&S"‘MGea[†ÐŽ+6RµßGsÎ8 â©g@~h™¸W"áøVB=¿|bâ‚áˆ.ó ·¢Í%ÜÅvÞåĺ(KXÒ%¯RžÐtØö=›ÇhC/!ëuµ”—§ªæÕP~©*l¦¸9ñ$+Ü škDâNÂ=Q±bµ!£Ï’ÆÚœHàüq•ùW¨ª(&ÓT53¡êKYÇÙk—æ_¡$œUf²!%Ÿ“1ÌXóßW]°V^/·òº 1'cx~ Š’¤ª7N¯Çú^«ÂE)DÈ'ª¶KH&&½ÈZö•犯$ïB›SuP²ß´æ2¬•ø¶¿d^(^§œŒ{+H9Z²vd* ßL\†ô}%)g‹éVªÆ…„3`*i™<2]˜´D(üy~™E6ܲºeÎ1¹渧“U®yƒ©ïÖ<^ Q¢œ-Cp­©>k®t“;»g½LÞT¶™pï@Kë.¾¯µ§Ïé—¶ÚpœžèW5 Q™ƒðN ëN7ß² ®q9wèEÛpÓç׫ W¯6ÜžCνûBm¸‚yS¹ÎÂfJc]VÜwµ™¨º!eˈÐkMÂBñ¶YŸÕ#gíÀ^@vêö‰¯ORÚé öYïZwÏèV­ìa»cxþ,«G%½mõ¨FN÷Y5t¯Æ »5`•Ÿ¢Û£Ê”3bÖ}‘až¶Í©³êìo¦u°ÌgüR¢©rE5ž•¹[¦o¾Ãý\°„ÃÝ1Ua)‚#j§L×:ÌD·JGœ›UÇ* ÷“¡„LÖs£Ö•VVHŒíªz:Ôœ¥Ù½~&ƒ-q*‚e¤)ñTºˆg§êjë9Xt Òí~¸Lë²àŠ¡‚©…Á;U.—ܙޡ!ò¡z;)hW¼S#{}þxZ•\ÏÊÁ6$ÁUà»W¢ÚT GóIióÏÂ+Ør5å­Ö|.Ñì¸_%îYªHÖ‹æ§ ³Ð"0œê+ᮬ“.¥gæŸ>Tô¤KÜaœè Nõgj(nm:&®úÇ+Ä\‡ùÂ6#Ò%À£V¶T ó0¥6ñ0ŠŒÐ —ÛŒVad-–pGt‡…âgñâ/ÊÓæ4‚fNÃjâHVΨßúþP¿-ÓbÃPc„OЉ×&q|J˜Äñ3±ßV%AüÑCØð\îðPN&,–1ºÆÞ$QÆÔÄ1Þ³:#m‰m1lìc5M±@ߪ„!ˆpÜ€+ŒTKÐ ‚tñù~|t&P Éù˜0ŒèÛ,ª¬ªç ¼Ð9òò™{êŒ'ý5òý¡ÆÃÆ'¿:²‡1ýb¬Úëæ5ö ð~°6Öð™;KaŽ(ß &´ÒÀmàg°Å `cG‘'bâ2ÉqX‘ ø Œ„#åÅ+)Ÿ útCºv6´ŒôL¸ò±‘—+Ë+»Aå5½Áº‡Ê‘p§Ü…™}L4ìˆZÛQ7"5D¸Zhz‚Ê%,Á8SKý?ûJφc_ÌpFΗ¯º`B6ã] ¯Ç[¿î6æOj³ºðfòR°Õ‡!`,zÆPS*ëÞäOHÀ¼ü¶W™IfK€˜=JO½¹¢"DˆðÂ(Á(ÇEÇé®[ŠÔ¤txXD¿våú%¢÷z¸úucÛ6'5*‹Z±äž'-*WxÕ)¸š²†é©×'öc5mlÑœ5­~ Ÿ†Zµ/’€\›ˆ'à`ÝþÃeW¬&÷<‹3à~+v.“{ž2h5ç“éø…¹©ìxKµVÞL*2½¦ õáÑfò…©º%*[œk³ë™É©ø ^P4gU/»îèN©ÕíBQºvôYS:Í&“`éÀX9x? ×éÐ"út'o>ëѪψ-vvJ>kþ ³BõB5’¸¦|’5OñÖxË êù;ó™r÷2&Òa;‡è8†£‚Åx’¸ÇË«¢±`?‹éB;ûÄ&JW]°^õeMݱšÔ£‹ÓóÍšº£|V7h‡¼É6Dt‰Šb³˜§A ¿ÃÌ2ÆýÛ=Œwãï0ât÷#t§ÅRû:x 5~[ÏóŸîð­;U Á§ƒç0ÒT =ORnÀì:?§ø<9ÃcÖ+Ïx$nÿ…Žâ„§MMÎ];Ò*w/îQ0íèN¸6êQZFä,æÍ#™Ý¾œ¿C.>K­³¦µ,42©{#-5K±2µuN^£UüF—)J*8ŠÆD6)O[¡x…È6›OŠåÖŽD6'#í„» ¦.pvº¤]rÐge Õ_Q÷lª²Óc# ` LÝšm|Zé ø ^)ý–«ÖùáT< ç ` GLÊÕ­‡´‘Ï´ú6õ¾áÇ4ÍÏ {ðLe"α¹5O‰ÉÀ2º {£µ®at-!0QòÓ?s[ ©/`êS•Þž`Áa»~¹Ú>-¡ŠÂ*Љ~[ømóÇ*˜L†’ó§ 5CW[×~¬<£]Ë"ðfÁ5œóûVv“9€+ ¨íñÊè›ømÛìNè«;ð0šßOO!8Ûçq§ÝÂËJ ß6Êx©†ÀºqëGYêÔë;¸Ñ6~|fLbu“¶Þ½-Kp¿ þ^€œšKÐL'ü &Ñ\Špʯs‚p©gðy§RÃÛÇ8œ¢dX‡Áà  I [gvŠ!€l0ú¸ÓH&Áï@£U~ 6¸òm:ˈ]¶£¿#!¹ÿ­:;§Êª»Íÿs…¬™ endstream endobj 3378 0 obj 3810 endobj 3382 0 obj [159 /XYZ 31.5000000 156.500000 0] endobj 3383 0 obj [159 /XYZ 32.2500000 155 0] endobj 3381 0 obj << /Type /Page /Parent 2 0 R /Contents 3384 0 R /Resources 3386 0 R /Annots 3387 0 R /MediaBox [0 0 595 842] >> endobj 3386 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3387 0 obj [ ] endobj 3384 0 obj << /Length 3385 0 R /Filter /FlateDecode >> stream xœí]IÛȾëWèÀrmÜ€ Àx CÃrr<™ƒÌ 9äï‡jQÝmJ_‰õñÕcQMwL³Xõö½ÞþñËß÷ÿümÿöý—ÿì¿ ¾ÿ²3‡¦2§_ûãï7/ÿµ‡áç}ÓVûo¿ìö»Ï»Ïýv§¾¼ÿsÿÓÿönÿ§þ?ïÿú·þ/þÑñü²klÓÿùïÇ?»Æö?™§?ÿ¯Ý_~·ÿõ¸âùsÃf¾ÿÿol|Û·qãÓ»ó1íãïß¾ýº{{@ÚW¼i›¦ÝÛàÃÞvÁíÿûÝOýÎË›C¬mêИ9jÜñKÖôK¸®_©«ÌÅ— ­/¾¸5¦ßr¦Å‡ËƒÅúÚÞXþÐo}ãªpÄõÏUÛºþçÆ¿æÍ7€Í† Xy^>ÃâÎVùܹ8TN­žá®nN@kê(9¯ž%>ä$¦ãÎ¥rF7\üÐÖÃ/ø3ùéöøÝÐÿlƒm÷9‡5U¨Oˆ©š ˜yZ=ÚëœêqçÒ@9ÓÔxñÏ)‹àD-›‡È‹ï¾îÞ~ꉭe½ÿúS¿·Ó7ÿøÚƒ¤Ú¿9š3Ûýqÿ{cløÃþëÏ»îP»ê¼ÅOübµ=1Ÿà“6}5¼ÓÁwÞ0ðèI0è‰û~¾c|òž8)„¨Á{ƒßñðcÓ1çà®=„Æ‚8õ§ /œ¾óñk/.rszk­2§3OÌG‚b!%yH±¡I§ÿŸ¼ä@ÌÏÒ%#¹ÜA?PFüÄ–iJo‹áW‹ì Ë4Ho¾SäM_¾ÞÄ;ˆœÛxןewà°%¢$7°Fœî:b‰@XG΃é€à…×c§¼la|Ra«OSK„nóÕJ³ªë¶ýy‚e,äºäá“o)Ù…pjÛ”ƒ{Y†í,ŒGLcø ö°|ÁË*õ‘,~¶Œðy0~ fP³\E)1b…â"r¡Yû›ˆ“bß ïzy)ÄxŒÞÄqÙ˜Ö`LM—^Ö¡3Õœ¬ƒ0¬÷´eaÀDõ°…©KÓ³};ÓÌÊGÈj7ÈÃ9&Z}IyŸ¢{SÅ}7+Z¦„ûåëä«+b)[Òš4fíœÛòÑ“åŸ04¶|õX!ÔçgE@ ›gy™¤E}²‘ÀB襙ÓóÂØz²qh¦.×FS™bìc*'j=°”wDü“Šß3ô¯Å3%dc;ÛÍé+YÞN¢ä¥höèõØØ”•ÃP•huRä Î&`¿K!B>áïT 0VŒa±ˆX>#½#qIìgo‡§ŠãÛ4qÒhOк7[>`®ÃœŠÏuž ™¨étÚ³µ6ÏÀm/¼Ï×FªDqå"17» _Ù9ý—›7ñš¤ÃæMĨ ËšåéZUÖø9õ›7‘'•ö‚wçM¬ò†,M?£jVq{Ýægl~†¸Ÿ±UºÞ”]92`ó@Ê–›£ªuÞb¨)kj³†Zˆ×åÔN=Ÿ=ubJtd¶/~ó0žú«h±×a y¿e}éÌmH‘žaÌÝ„†›lç¬3Ũ,@œVLç*qÿ@…µ(sß"Q!Lõ33Á©ÿX÷3“ü abA¢4»=êz ÷ec±ÈžTÃíßpÕ5f%7\u›Õ ):å¼€ÙgÄ=ŽÆçQš(!Š£ Â;`î&À}ÂøÎqa*¢p%$®{Â8eî!dr2˜F ¸iÝ*AÍû¨(!ƒv®p{R“-£ØIBÈšå3—Lÿ#Î PÓÛ”4%ÎéÈ%¥w‡6µz~~ù[‰D'‹®Ôº,xÞ&Þ5‰“‰Ó2^`Á·ß1ÉÄŠN¾‘Í”ÈÚëËç÷˘#Û´s$¾Ç6$^¨ª—­TÕÂznZô^Tæî–’-WMÞj­z|qÜo÷&Uxõ,üâTñºî_j+íìsÿX¤[ãÓ q—5ßL†kld­t<O:ÅÃÑ›ÆÝéKø0‘Zbn¤,õ2õCŒ?‚oe_¾ÞFë s3½ªônÔû籄ĕNXBYY¦2ÂÏ8¢¦‰Çn-5 ÕA¹¼u·ù{'<úL3|7ß­ W³r*‹cøuùa]£/Íí,gøˆVdGæŽõÐ •2þ@$Æx ÄÊ®¶ÇmÌñFeodZ>Ÿ…3„¢T!{_3¯›‘Å -ËÞóEU²`>#žhè–°l0'–mŸ ½Ó6­?x×Ú~CÏà89uí¡íÌãNÇì׎©çÚ?=QB8ßTßÃ'À'uújÞŽ¶„‰œëDÕS><¸±×¾c!dá;¼8±<~g ÉkO 6‚‡x¸=i¨BÝ6Ó¾Y ÃàÝdpEŽŽ?ÜN_žÁÓÅòJÌâNO¬=ãgÊj7ܧéÇ€t1T`'Ñ… Ï30‡°¸Ü’(µªjk¬?G´˜'L¯JDÏ3sLˆz^¦g9˜¨"'½5ËQ‡^ª L/+€|šÅ¸J¯&’b΃­sb:‚aâæL —l$¦ª[þþ5üàѹNÕÀã+¦ì=1Ô‹ó9ðI…¿ƒ{ÂpfP4׊ûâ"=ÊD¢ðy Œ¢Þ:óLo˜FqÄ÷ÅEVü ÊÛ^­‡¼· š§¼à*uŸ ×R1ô_°þÀ»vØfü‰­Fœú¤È3Ý947ÃŽÎAtO£˜°YwöWŸ7C8õ±Eá@Þôø‚®{$DŠƒJøø"R)ûKã@ Œ 6VÒ“”-a¢bªæx³øèxDÈ(‚u-‘ø ޝ.æL%)»Çˆ ’,®ëóf²fÙb7¯"véd#<2j²%±Ú½í‰Eiùì8£éaúç[„™. LÿLE?ÓS€eÚâÕEËÏ–¥úð èÈNÐÄ2 Bƒ1s%åxó†è›s:h(j±æP7öûl3´º°)EyeŒÝ'ëãa‹:Á:Æ›Åĵ¨ã))u›p…H•> ŒePa­8STóÃ\CìöÚ?Åx" I pU ¹˜°€‡d†wÙ†›–w.Ëï³ëµº)6&l‘R¢Ñ* 8]Ea˜kº,¢`qJÐÆxkÒù›B‰Àð 3·XÂÕ½CnèÊI/KäDÈÐþ޳`ÉÍÔ“2Œ˜( Ô ª¶›1–xS<£Âë7Rx‘ÌæÇ„l’õ•ÅòH³—ðj ­˜øq™5äለàáˆÊ]• žÐpau,ïÄŒ·$+Y)='b•úÙ%xĬÂéjÆ©½¥ƒÂw¿½MÆë#"UYB"9g7!E86Ê÷˜¢0B˜Àa!`»2r–Jó‘h&Q‚ÁøOÂ`ä¯l?ž¨5–¹rÓÏ铦®&»ÂŒŠ#´;¦ü„Þ3*ÖÄ”õ])Žuæ@l1} „û,ÜöyѨI$”"ìš]±Ö¦'F=fº †%ýÎ¥,gÙÚSÊÎQjŠ—‰^i•÷^x¢‘`4å  Ç ˆœ³d©èO˜†!;žuK7Èp¥Z[¤F®Ø*³œaXç»ò£–l3ÄRµ!÷Ve±Î$òò!ª›N¶dlMeÀVì¼vïÂõRš“viG.ÉC§Ó>ÓHž œZ¯û‚®®½Ó¡w<8w¨Ã#PŸÁqÎï"þÚ®‡'áp€O±eo?^[ >‰œôÜÁ ¢Í¡k'ÃÍCÌaèT¾SC`ètp5­½•;ßà2L—ºRýBMpIð¤$º¨9º yKfçxZ°—Ô¸Ö`JëD»o#¢„°fÊ 3w"1W .3ƒþBñ04(2ž!q¥Ì#µëŦ HÄ©;LL/K ùíì¥àŒðe”ÉâÑÙ0r“ª]Ö(.n«±¸eŠ‹ŸÉËwðÄ^œt““ž¥®b—`¡»·ÓïͶÌÂѹóÃõÎ/"LåÏy„Iÿ{ÿÐ> ›Ï·þÁ‰Þ^ßó±ÇnËÇi¿§}[ˆËš+|sJใ{”a/ŸœÎZ_>’âîÊ ` …Éô+ŒzmoŸ†“¢QCØ"còÚfípt4°'¨± tå¯ßªM:ú‹K[X‚;þÜïø¼s,„ªtp¸ª“&éˆ<1¼-¬ÅO"˜€´`1ŽðIá;ƒÀ¿ö\maaP†ókÇháÑ1PÚчŸE•ñ‡ýsÉÓ¿ØÎM±ýyÿy÷=Óhº endstream endobj 3385 0 obj 4796 endobj 3389 0 obj [160 /XYZ 32.2500000 334.250000 0] endobj 3390 0 obj [160 /XYZ 31.5000000 622.250000 0] endobj 3391 0 obj [160 /XYZ 31.5000000 335.750000 0] endobj 3392 0 obj [160 /XYZ 32.2500000 620.750000 0] endobj 3388 0 obj << /Type /Page /Parent 2 0 R /Contents 3393 0 R /Resources 3395 0 R /Annots 3396 0 R /MediaBox [0 0 595 842] >> endobj 3395 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 3396 0 obj [ ] endobj 3393 0 obj << /Length 3394 0 R /Filter /FlateDecode >> stream xœí]ÉŽÜȽ×WÔÙÀ”˜ 7À0 uK|0 H€††ÆccàXžƒßì*Vuw²^’ù*ra5%ØÒ4Åd.±ç‹ˆwüò÷ý?Û¿{øòŸý·ñχ/»êÐÖÕé×þé÷/ »Ãø÷}ÛÕûo¿ì¾ï¿ï>ï>ÿÿ}wzáË߇¿ýo¯÷þ÷óþ¯~øãøžþÁ/»VµÃŸÿ>þÙ·jø[uùóéçÿÚýåwû_ŸF<nœÌëÿþAÕµiª§iÌ|úûî¼LuüýÛ·_wïNö£ªVW{eÝ«Þêýÿ±ûiøÀyøêÐ[¥ÚƶÕ-jõñKu³Wº¾ÚU“Ë ¯äWÊÔÑ?Í\|W”i”ôC׌¿àßÉowÇ=ëú²T·JVJ7ã¹kÛF8ùËð1ȪV:ÞàÇ™‹ïÊHVžÑ%·UfÜ c"lÑóðïl<™qš¹ø®œYfôµI 3´ªF¾ÓU/8ÏÃG8y=ˆôxƒg.¾+#YyF—<\[©ñpua‹.ÃÇØÿf˜r´Á3ß•óáNFÿ2 žÊé'ÀþîyñÃ×Ý»Oƒ Òì¿þ4ÌìôÁã_ÙÙá?žŒ£Á®ûúãþ÷Ã|>þaÿõç]}0ºSº>Îo|¢OºC×WÍë'-z¢à;JŸ(sþЂï( gðp|b֜ܚç'Ýéç43ƒ|ü:YœÝHÚÝn‹&®ûðMÅ£y6¨>>1‡Ú6]{óhÆÙnÏd!Õ„œ&ž#\—êŸà)™ ./]bÿ¨eˆò–çl'ç$Æ[ƒYTö2Ú•fæ4þpœÞ•¾öä>éÑ…¿£á;b‹Óµ®¸g©;H’X#@Qê‘ÔbI­0ÏáÉbžƒ2ÄCàð; ë^nG$’ºru’G°0&qŠ¡Gì®z ×c¦Ù¶mê×£a½<+ïãJ¿fø±#ý>!Ùã‘‹ ¹È¼ó>éb“|Ó›ÅrÑ#j&:NÖpÅvc8v&e¿à=x¿Ü²ÚC™pkˆZãئxx|ê®eèX_©è""ëöF;¬‹ ëb Øe|TXI‰²î¬++dìèOɣ¹ñd™dØ=2ëŠnЬQê1ˆçX0Ý=&0ŽÚú$6º~Þ6óËæçÓU]ßÒ–_)ñµYùi8ƒ Žæ™›è^{æ¦$miÏ Úð½®Ã÷ÀÀYS”ˆGÔùÓ¨ìi{NR¯Á»Ó'”Bº—Š ¥t×Ü…»É±r s‡S¡„ÓðL±äY©FM)_:;ËϪhˆÁÔÏsíJÏ~ã™ây¦×zžg˜u‹ŽæáMlÙáyõV%ö¼6ÚìŸ{ôã*87æ £›’Êf~>›Ï[ù|Þ”Z´ío8­dš°}ñ9j,0½`‰î´T¥Úrx‹8a*Š€wëq†ëÉ.¬[Jˆu©Ê4·H„‚9Õc=l÷%ØIk«ª®oàY¹ÌDƒ¶6eel§ÕÚN‹’pO<Ÿã*årÒ³ïÍù«éîk†_ó±*¹ùt{m¯&W¨ÓdºËÑŸÂ*O†èàù€ôdtL›Ãû|ñNßéÑ;#)«v¡ze•:¾µà þÎ(’®ÍÎ?â0û:’?-"ò딩¤´®_o‡ªÕ¿^ÆÁ`Ì!FÂ'ùaPÔ>m<^užö3žåÞxºKžxpJL†|‡J³!’îN*›‚æm²“-£šdf)o9‰2IkútNª:4­zmÙMr+ˆ kˆÃΟ« J°Ù&’)„Ïé™ñ»`9Üu³€Be¬£%)#ó.ÌÔ¶œǤ`í‹ "š’$’b¹¾7O\MéªqÈ|ÕHè¨%U:ã†0¥á<\ÌŒÁ)áöO¼Ç2Üç„G‚øŸ­—NæFGK2LDre_=&éÎ9Y=›ªRèc<ˆ›kâà™0ájQŠ1&E˜ #“ï×ÀfÊrïÔóaÌíÙoÃ>²ªudÐ KbêÆÎºÊq³êĺvéÑB늒Â÷QoÅ~L FL‚îdú—ï9…!­pvE Ÿˆ"F‹Î”ÅGê >'g‰'T>ãÔ * AuÄ'‡ÏGÖï^Sö5U7‰P&žº&L¨ ¾ o²etÉî¿ÃD e:Ã‹ÆØ©Z2Ñ5k¯zW³2}RYÖÔÍÌ„?ð±êÞ½( SePVñ„ØÚ¹"™ÂEžÖ 1ÿ™S®2”É®‚f!ê:0º#Äk—­¯ÆK·ÁÇK*g”§ˆ Q*Ï ±(W*´áÚmرaܤd‰É„L ¸kŠB,¹lÝ&À¶˜7ãBÆŒq¥ƒ¿ˆñ²s¾"Š7ÓZw‘£ÌLü醺1ùýQZY9ööʳ‡P6âõ¤â.CÆ%tÑæ¹ödô4ª¾{”CÑÀå…7ßC€ÄÜ(i÷ž …Ç„HPùX÷Ž.¤°Lõ¯DJ‘‚û‹: σ¹ÄØPFÉîuªŠ±"Mîݦ€—©Âoêçw!Q¹T6H~ ©ËäL<|%MÜòN‡O÷ÈÚj‡-9# T6ug/ R¡ŒOlÎþ«¬—pwÇCJÁ0VÞ…œGÚ‹\u®“±d]êå9 2D•­—a)·¢7jtY(þ=§é]Sñ>Ä%å&Á;^‘¬u @' ‚ï0=©dóSòG#çLpù“«Ö|{¤É×uÇ÷.–Ú%¢ÏH”lö¨ ©T“VRÀÆåˆJ½ÊÆù™Cã²B=Ø¡J±3T,L&×…¢±|Êêe$ æK|£’?W)[æh€Yí§°wq.i™H»s%yV÷ޤcÜ™›0²M’DÍíbÚ^› Sÿr/ˆé”—,S¾ãñhD/)“i†0d«;‰ÖR{Ã>¢0¸„‘KQ7ײ,úe˜Êš’XT1Z8º®íjãèÚÈù¸Å0#©©Ôò¦éÈ\¢;œøœB íÜâ2š/{ ÛCÞŒh”MxeB3 FÄ (’,(W·Ûl–µT& | ?Ù¢¸cÉ^”ìݦª‘ŒAc{–kwò-´³—CU"7f½è%\óš©Mš+N¸ƒB@ù(ÂSßÚ¢ÆL’èÄu×C+]"{w+Ût1‘|q&LÕ‘e m0ä,š2Wt¶ 6LóGžD/Ed›X(ĆàÓ;£öû¶j±&.?ÉôdБLÇf˜fqÄuNH`?U~¡®‰ñ*eõ¿„‘M¡üÖWD™ªsÃR0yÅÀT*A4"~’“¯¢«ªŸg1Ù¶!ïØXà$Å¿yzy wiÍè_æ¸ø&Ìo‘ëÂ@ ¦ ý$˜8ip“¨ìÿÖ༣1uôš‡ˆM!ìUâYK4ì¦JbdðÅ Z¶ÚÑ;F>ñs;çîÿýç³`<–ç:{®ÈV?(HsC+ú%!^F®‰xàžk‰€0tÜEôZH¦?8þpÀÕ‰hàN#° ¼Û øÈSÒÁŒ–\«3U\ЉÌvá±´L¯\5µED!“ZTà5oˆ7ŒÅ¦åq%*1{ 8™ßJ\ `ó¯Ô³˜‘ãçG×ÊQ«ªtÂ÷«¬‹@EU" „ ÑYÒ1nýÐx˜™PÑòÞ×äK2–Xy8Ãü}A ŒÂx¡hé2›~ôªuT!“LOÕZš¸LŒ;Q¾Z2–e4¬ÄMÈÝ.û^ìŪ.ûâ¥X<ˆÜä—l|nWz‰®ôćâd»läÿΖq"7ñÒ= ÄÑ-Ytþr…G•ðes]¿ä 2ú”6g¯T“3mËêÖî«.ñ7–Fzâ¹Ï€")Äx]õK¢pT²*´‘ýÑ4ž,å ä8g?§u:&ÙŠ!Pv#Ÿˆ5F§å%ÓÃ@>É@Öh’l.&Ûa¹*,&',vVàMgäxå¢w d‹‹æî3Iý‘‹¡TÑ[YžãmÝ¥9/—ÅÕ Gਲ³G(ƒ 35¨–mÜS¢W4²)ˆ+D1رÉð¢ O¶-%ï²³i²ÔþBSÓa’•R®>“ðÒ¨¦é«”ÿë èßI­XaÈVÜ>`L0€*]*ê˜RE2ŠÌ~9 L$ë¯E.á䉙Ž<§ž^xê“òB)ÞkÌ%61ˆ†7Òç' ý î<Jm¹¸´¥8v¶¯VæÜ–×Wò´WÆu`ûkOçGø×d‚ßÁ ¸=M¡aët…kLá'pßëòU—zc&“U.½ãó{(šBãÑ…¢¹¼!ÑàåŠN6ažØøŠ=WŸ‰ÍÇ ûp.wA¸æOð1[’›¸Üõ ÐŽL‰Šž²]I¨¦y«¼rawÓS‡'h›qJ•Hã—åÕµ©º9 «ZŸ*‹’ª˜K@^ƬÉ^ƒ‹ Y0&WªšAÉ$˜îœ‹³H¸]ÿ*ënªl$ߺ¬³x@¾Èåù™öàc—˜=2{×Þ¤°´²uˆO4{ ñ.*/e"ùXùÖJlv›@Ée»qòpï˜!Ö¶s”VìââÌ-BÉ¥îd±"ñm¦81¥s¬¹”çÀ)k89O6ŽH¿Ô8ɲ‚Oðz`ÊšÅßÁ‰™0YÝOÆï¤¡ŠúRÖd+0ò– Œ¬2;eyÛêÙù¬·¼‡í/¾}Âòµºì¤fÖÀ’ïéœFK³nÝoºwîUPY8·š™”ó¥ëëÚž älúÚ7ëM_{%Êêëº9)]÷Ö]“A÷6Õ¹tjYºwø½ÿ>,лþÏsÿ`Aܨ»¶9F™Ãྠ3Üë³+Ì>ï?ïþ )Ôñ endstream endobj 3394 0 obj 5782 endobj 3398 0 obj [161 /XYZ 31.5000000 722 0] endobj 3399 0 obj [161 /XYZ 32.2500000 464 0] endobj 3400 0 obj [161 /XYZ 31.5000000 722 0] endobj 3401 0 obj [161 /XYZ 31.5000000 465.500000 0] endobj 3402 0 obj [161 /XYZ 32.2500000 415.250000 0] endobj 3403 0 obj [161 /XYZ 31.5000000 416 0] endobj 3404 0 obj << /Type /Annot /Subtype /Link /Rect [60 686 138 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_translation_overview >> endobj 3405 0 obj << /Type /Annot /Subtype /Link /Rect [60 678.500000 93.7500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_file_preparation >> endobj 3406 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 164.250000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_running_swig >> endobj 3407 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 184.500000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_features >> endobj 3408 0 obj << /Type /Annot /Subtype /Link /Rect [114 657.500000 168 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_notranslate >> endobj 3409 0 obj << /Type /Annot /Subtype /Link /Rect [114 650 202.500000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_alias >> endobj 3410 0 obj << /Type /Annot /Subtype /Link /Rect [114 643.250000 207 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_ignore >> endobj 3411 0 obj << /Type /Annot /Subtype /Link /Rect [114 635.750000 177 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_nolinktranslate >> endobj 3412 0 obj << /Type /Annot /Subtype /Link /Rect [114 629 176.250000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_nostripparams >> endobj 3413 0 obj << /Type /Annot /Subtype /Link /Rect [87 621.500000 173.250000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_additional_options >> endobj 3414 0 obj << /Type /Annot /Subtype /Link /Rect [60 614.750000 114 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_to_javadoc >> endobj 3415 0 obj << /Type /Annot /Subtype /Link /Rect [87 607.250000 125.250000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_basic_example >> endobj 3416 0 obj << /Type /Annot /Subtype /Link /Rect [87 600.500000 122.250000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_javadoc_tags >> endobj 3417 0 obj << /Type /Annot /Subtype /Link /Rect [87 593 134.250000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_unsupported_tags >> endobj 3418 0 obj << /Type /Annot /Subtype /Link /Rect [87 586.250000 125.250000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_further_details >> endobj 3419 0 obj << /Type /Annot /Subtype /Link /Rect [60 578.750000 108 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_to_pydoc >> endobj 3420 0 obj << /Type /Annot /Subtype /Link /Rect [87 572 125.250000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_basic_example >> endobj 3421 0 obj << /Type /Annot /Subtype /Link /Rect [87 564.500000 129.750000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_pydoc_tags >> endobj 3422 0 obj << /Type /Annot /Subtype /Link /Rect [87 557.750000 134.250000 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_unsupported_tags >> endobj 3423 0 obj << /Type /Annot /Subtype /Link /Rect [87 550.250000 125.250000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_further_details >> endobj 3424 0 obj << /Type /Annot /Subtype /Link /Rect [60 543.500000 102.750000 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_troubleshooting >> endobj 3425 0 obj << /Type /Annot /Subtype /Link /Rect [87 536 183.750000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23troubleshooting_ifndef >> endobj 3426 0 obj << /Type /Annot /Subtype /Link /Rect [60 529.250000 118.500000 536 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_developer_details >> endobj 3427 0 obj << /Type /Annot /Subtype /Link /Rect [87 521.750000 156 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_translator_design >> endobj 3428 0 obj << /Type /Annot /Subtype /Link /Rect [87 515 208.500000 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_debugging_commands >> endobj 3429 0 obj << /Type /Annot /Subtype /Link /Rect [87 507.500000 101.250000 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_tests >> endobj 3430 0 obj << /Type /Annot /Subtype /Link /Rect [60 500.750000 137.250000 507.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_language_extension >> endobj 3431 0 obj << /Type /Annot /Subtype /Link /Rect [365.250000 437.750000 388.500000 444.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.doxygen.nl/manual/) >> >> endobj 3432 0 obj << /Type /Annot /Subtype /Link /Rect [219.750000 423.500000 285.750000 430.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developers.google.com/open-source/gsoc/2008/) >> >> endobj 3433 0 obj << /Type /Annot /Subtype /Link /Rect [337.500000 389 363 395.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.doxygen.nl/manual/) >> >> endobj 3434 0 obj << /Type /Annot /Subtype /Link /Rect [363 374.750000 423 381.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.doxygen.nl/manual/docblocks.html) >> >> endobj 3435 0 obj << /Type /Annot /Subtype /Link /Rect [241.500000 354.500000 301.500000 361.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.doxygen.nl/manual/docblocks.html) >> >> endobj 3397 0 obj << /Type /Page /Parent 2 0 R /Contents 3436 0 R /Resources 3438 0 R /Annots 3439 0 R /MediaBox [0 0 595 842] >> endobj 3438 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 3439 0 obj [ 3404 0 R 3405 0 R 3406 0 R 3407 0 R 3408 0 R 3409 0 R 3410 0 R 3411 0 R 3412 0 R 3413 0 R 3414 0 R 3415 0 R 3416 0 R 3417 0 R 3418 0 R 3419 0 R 3420 0 R 3421 0 R 3422 0 R 3423 0 R 3424 0 R 3425 0 R 3426 0 R 3427 0 R 3428 0 R 3429 0 R 3430 0 R 3431 0 R 3432 0 R 3433 0 R 3434 0 R 3435 0 R ] endobj 3436 0 obj << /Length 3437 0 R /Filter /FlateDecode >> stream xœí]IÏã8z¾¿ÂçÚ-n¢Ô ‡…. ‡ ‡ fi ÒƒôÌ!?Ú(K¤^Y|ü’’ü¹ 3U¦e’"ß}ýù_ùïË_ÿyùùÓ/ÿ{ù1üýé—·âjMÑÿwiÿü4Õuø÷ÅVæòã··ß/¿¿}{ûÖüÿïoý~ùôïÍ¿þï"/ÿÖüïo—ÿü¯fðOÃCí¿½Ya›¿ÿ§û»¶¢ùW1þÝŽÿúö¸ü½Ñ-7lfþù'aJ¥D»;Kÿþæ^Stþùãïo?÷·Š²,åEh¥/¢Öòò?¿ý¥YÀMßþTÔea+Mþ\¼j¯ŠªY\T—ýVùW®w[¹]4çQ -ÍÂÊßbæ@·yÃ!9Å!yÑ—ú‡:ܪn÷‘‰›ãÓ sïp|Åíøäp|¢#UÝRÀq£uKï~9É)­‹TwæÏ} ;k¶&.ÓŠÝY<[†c\XÝcU{_µÛä9.‹ ]ïÇÏ«,3ù/îZ•Ãä¿A£kRlK»rYäʵ–ÚÈÄV¶ËT²‘WdÃ̤¶¬ëMŠ€O® «“MÞïœýTš{ë³3^®–Êö¤¤Jpþãô).ט:ÝäÝÎÙOe¸ÜpvŒ\[¹QÆ]y™}üþöó׿8ËË÷¿4;ëìþúþÛ[C®jµck/ßÿtù—¢Ðö—ï{«¯¶4¥4Ýþúo Ó}£®F—•}Óÿ¦º6rñü7B’ßTÔlô7Jô³ZuúªUoí¸méù ½¥Þôô£ô¯,¬©odMÎV’›-ÈoÈ߬¬Cî:8sdKôô¢Ÿ^¨«’•h~´Ü $åÕé÷¡ƒ¾~} å>Ðô4*hNø¦A†žMKòúék©|Xn]ößáV¾ýæK÷q ºéðé0D“Óá7_¾7ì&§hôç9« ±meŸ4« AN}¦Î=Û]!·°ä}VX¬Šÿfå}è¥ß§H°NÀ¹W8È•ßЯÐ"à”VHÝvž±¼4*ÐïE/ì¿1$!BÂŒöOveKô)‘g.I¸ôf·Ã_ Cå•™%/è$d¨u {­eš(F¨3ºÇÀ}3ÛÁh?êE“g@̉Q%w§…+¯A“¤ŽKŸ9ù‚+[¢ï9bZ•¤E^…±ªúTˆX4Γ:ùŠDI¿ €ÀôA®(ÀÀõ¯ÈÛ€–0`eJlàuyOû‚'ÌDêžðŸðpE!¼Ó]¡ô¹ˆ°Âd¾ØYÉ_1ÐâZZ1Ǧ„¹µšƒÜr¶žÃé¾B•“æ{LÄ%аôÁŸ$ â€òN‰ 1ñZKi®+>g"üV Ç!k×"?„eÒ„!“b瀹‰†+Ȱ\ A"îgòPhÀ@Qú}烖N‘s£ß'~ ¼W.—Ë;VtÃÜ.I êÒþ<9sHÉK.·c=æ˜ žà®Ée=`UXÜ5+ñäl¹ì ÐlÈ…!€ŽGÀ†LÈ›ŠøøŸÔã¹ZXô„!6”`³4ØFÆ#µÓ·í2Ò]/ZRû—Ñ#åÕx©ïŠØõ IVN³>šý³ÈËägs¬s÷çü‹ ý@"?à„á=¡›Áf6Ìíà‹œ)äaáŸØÍ¦Äë7àU×"èMrž*…ôÁ•¼ˆP,AÎ%€l€ÒÆef¯"/OB¨í¤úÐÎ}šðAeˆQIR§ F€B€Áj „Ì"$²õDˆÂ4äÓZÂýYq﹌Y yaiµÏ _f²#˜É8¬HP¸\Zú&O!@ˆOtL˳ž’.¸("rjÈ22©(4f#bÔŠßÑC«ÇÂPcìÞÈe3Q”>—|iùEhà@Y…<þšìçuDe0û•õ}¤_-"؇Ö}Iù% “%2)I‚—¶qB˜ÒÔZ D< qå• ÇmDØ9¯ƒcô‹ †ûC ¯­!ÔÙ"99Üèq ©5)òØ ä§i:í'øÊÀ-cÒoxMðŒQBe•òYT„¬œXf·ÿ&"’Éž©NQjEôL/ÚÝØÂŽ!?Äs&I"ùñx²®Ý¹B><æ$á Ì )¹*:ñ!§@í¤$o4-oædC§,**Å)íÇ$øÒÓófá7ñ¬b^“aU%™’  [kcö˜DV3áM6)–š űFAgp73IhOBJ¤ŒðH‹”§^ññr•v«G÷*W™?n8ÂHŘ²Öp^¬HKu®0Ôszë/’†Î‹Úwk5¤4"VÒc&ˆÄUæ•#Œ+ˆ~–6­<Ó'âùB†‘ì¼–Úù˜ŠAÁÒ@܃Êw³–7ƒ,*ÛÍZ¼jk6ç1}¥‘V1­î™XF~-(ºPé—Í@šNfíI!Š£ìœâ¨j‰â觺)ŽiÌ0‹ûdçG•KGf$ 8͘Ûi9¥8ã»R­Ü«‘Áøn|DsÎä~Ù+Çâøk=©°f:Ђÿ* ÝO`J7°€ -èêG»¹ º‘ÍŠRǧT=›Æ}, L£þ:XFwËÌ7Ó>¥çÓèù2¿zèŸÔ…){X/¥'š-À:P,JÏU›â%GœZޏOpZèî€[ C•j:°™âXãQ[.Q[ù¤  (NûÔ@QÜ4î£ñ(ŽÕKǪ`Rœî)=ŸFÏ—Ù•âTâDxHwzd©ØáX€Ò ƒééhÔÁÞ£¯Rl^É4ÈÕs„v® ZpDäÆ(;[Å1G+97-ìtàuD4¨ÑoLóç~û˜ÐHÙY9U{Àwoü0„F!ƒfÑ@}™s r#H·wÞ]¹p ¿S(LJAZÍ_ûƒ´¨Ÿ¤¡&+€w9Ì ·dúIjçºX£ãHŸ: 4š·35ÔòäÔu$Îʱ¡ROpVÀYµ!*æ8‹¤š@¬ µ^h}<´VµCk[NÐZ×@kcŸ­å5á…@ïTx5Îm¬êr:À€1euŒ±å»Å˜ˆ¤#¨$+Ш)[ÊÏV³„CkG4ÐÓF[UTõÌh«Šº¶Í¨œ[S»ÏhÛ?ÕeoÓ ‡eœÑ¶¨B£m3jýešÏh;<¥çÓèù2;m›w7íèŒ :±¸åªPƒ¨¢Å$÷*y«›­ÅÍ5¸î˜,0t`¥ÌtÀÑ~ hšcÔåh.yïüš÷¬¬ „¤(QÌ‚àšÏ ApJ/®ñBRú§ìt÷i×|^‚kFK"‚ëÆÜN'Ap“5v IiNàéƒàG¾ ¨·×i†*øÜ«G·1¦¹Î1LVÓ­2Žv.ãY-È8 >{ÂG;âË8ÝS½ 3Nã>Ú¹Œ#d¹ ã4<Ê_Fš@ÆéŸÒóiô|™=e¡Æ°¯/¤Œ‘«Ãá•]ñ°ú8 õ§Æ+jnæÙB¹°/iêéÀfX×¥ëz!ì«­} ÔAØWÿÔËÚÎ`]—¬ë…°/ÕîÁ_&ûžÒóiô|™]aÝÈ£ÒÐDzÝV¶tO9ßÑF]L6Cti<ˆ.ŠšÑʵ2+êŸ ¶,g]¢Ë…°¢fTËaEÃSz>ž/³+D[V¤ )!E˜éøE¤)6âí ¢ðŸÉ‚KÖ¡ÈJN6ãR¥=\ªÌ.f1˜af¨Ð>5àŠ›Æ}Ô.Uj —*ߨԎ¸Ô=¥çÓèù2»âR=ZA‘…HC%:'HY¤>’¼‹:µÙP5xXw—…cpî³^ÐÝe WËN¯žkßÝSv:‹û¤fº»,ä‚î. ß>ÐŽøº{;æv*'ºûm=uwYŒµu_ºû ãÉÔšðÓ+äR¸ ”¶?êd`+’RÎÙ”j É@S–ƒ¦<å"ÝS=›§qåœ I)Ø”¾Þߎøl¨JϧÑóeödC­m䥳+äRÖ#ߨ§›a] Ö{°òa=Дå )Ï@µ}j€e7û(WÆ=åk;æhçÓVL6cNYx˜SŠ%Ì 4r9hä3ÀoŸ0ÃMã>æ˜z sŒo_hGÌéžÒóiô|™]1§ta%/ÅÿDŠ¿,cPüÝÀf\²^˜‡¬–Âi@j ÒßЄ†µ\usµý=5æÍ`i|ž/³+'ªÇ¿´m>B¢¡á(Ò¹£‹1D 6Ó‡MZÈ™ÉB µ`²h %ss‚î,És£C÷”Îâ>É™ÉB ±`²Ð¢Ö(“E;æv*&&‹Û{š,´Ë:Ññ>…šœòZc3I0HH(â*Êæ?F˜ pÖ+’,”ñx±ÐÞТÅ3XÓ­T‰¿¶ÒÖYÄiž¸õXDG÷•ëCªìœRà– Ù@ÍQ#îëÖ0Èw+DÜ\û~N“o>³‘Ît9¼`ñp*4m÷ÆÏ¢w¼š ø»OØÚO×>/I\Á‡¹!zD—L WBýxMHQ¡\Ý8NKŸõ EØÞsÿ¾ÁˆÔ  `s ,qsÙ`à+ Ã9¾Â„ž"ϦÂÅ ™ iíÌ"7FÊZû M@ ø±¤T­@@&ÁàÍáÞ Bͱ?SÒ7”^t§A Š¼¹@€¬|ô%s,|¸JG)õšA­©å#¨…H†ÇÉ^6ð¥l!¯JïBÎeÝÀŸ³™}ÛzáPEw¦FK~¹«žñ\7ûð›üK×B|òälƒ±pá7ƒ±PØ¿ÆBô*w}ávý‘ü¦ fsvð7‚þ ù>ƒ¼b¯|çÍÖãLMÕ¢và|h ¿)ɽÑëлVäÍ‘÷s÷Ü‚¸*¤ã+pDÃ+ ä-Ò³­œ!¹Ž™8ž3X!§Ð»‹®B2Ïe5çÕ]hý¾lšEò¦k"÷ŠIlw'b³‚zl7×AÏQKˆÙ¹Åª›‡*oZ ¼ Ù)”ÇoVŒþ€…¥yl¶4J ù3ÆbÀe”+@Å“Väð‘”6(™Õý¼ò¦4¶pÀœÒ–©ÏKöJÀ²ŠÖµÇ"§*lÿë«c˜±äL]ÊéÀñí¼ƒÍ}ÄLMrÑ™÷Ò‚TÕÊz@Ü’¶æ"œïí:Úáå~(…?™©¯Ëk=›G™×þy‡9¢’¡š@¬œoÿØcf[ó+ðêèù ø`2ß$ÎÎ9±>¥…R*Mîyó,†Žç•Êórîø¥§“]vw¦üSÁ,tÙ¸7eD]!¯™ß¬ "eIýî ò<Îl¦Ÿ¤£:” ŽdÖ­ˆ,i€ò©sÅ]°ªú@wo¶ F¬±¬o6Y•µ@³ Н8¿œlW ãÁí+‚0¹÷È„H•æÒ‹¬A31fíUÀ R…™Œä1-qÇÚ.!fH¹Q«½ha²b‹æE?RwFüŠÇ1oäf”!œ››fš¾ža9v(û2ˆed'N&ÜnÁk |*$$œŒ›5cûQ §ÄNñ…šM‘XC#?ß‘éÓç6‡?»¹ò?“¿¡óæ6SÞFÈL«•¬©!Ãm!'Î}Còò2åË ¶|¹;ZµcOPZ;A‡€ø?é[!Ë mlj(h‹Sçò(œ*®ñé½£¹ÂÀý×5¶ˆêÌ´(BÂ’Øî)ºÆ[Úó¼x,Óš:½Ý˜×¹G`N ŸH-¯;„·la6E ‰ä0—½»TŒ}²Ž·ø„ŠœÀqá+‰t>’ìš"رûnU«éÀæ˜v Þ‘?ƒéô÷ž{ÞDf/<Â("lü¹ÔV€ð!Þzǻֽ—ŠËI Ä™Êc"Iø2ØÞ”¹‹‚¢t)F:}•´fNIBz¡03ÖÙ fê¼e9‚HuA² „e"øÊš%Ã#òrÕAR;x͈ì 6P® ÂôÌ»­ê걾ݩânñ»Ñ¡÷¢9E&~ýüfF¤¶â±|RÂC˜sÕ°æ!w¬>Ú<îRöô°õf¶v.Wu&=ñ.CÅNMp ý-B*'AŠma)LpÎÊ/‰ `³P<G&a¨@f3¯};Pv¤YR¦gN÷LR®ô®ˆYØÞnµ€ì{ WÕ‚Õ•Ïlz¥×lGôéD¸6 ÔýëNlg'Ì…XJkgª†ÌâÛØ2É“füe KG@(´»Uñ6S€’–R{œð‡@@•>È’.ˆ50&ù  ýJÆÁvVÅìG< ö|Í_úÜ—„‘Ã=`z.àˆ)4çÒ¶`ÑA…‚7Eaf#{Dov{ð€uá8Óý#Mk V$Oâ.¤¥ºÆ(ÿNp³é’±‹D!>îŽÚqoÈ7w÷–O­°>L¤ÈºH¬æªz3`#znzáÄÚjó5ìŸõû@«„gXõ¥Ó3DršÒQ™’¶bŠWñVÜE"–#BÁiyëLbãþÕaOMøˆŠÅH“·º9cüqÔÂçìÃðÀµd°IÊSvÖF‚ºi£+퓦à@rD?{ «Å6ѰÙ9èòEðFC寉 yÓÕóv©}:Áæb'Ûúk"‡Í„ÎÛòa0çÉxMÊЪ3s´Ô «¥åYºðv{=°ÔMÓ‰H¶ œ!n Ȳ{dæŠQ8H#}(¹ÚÈÅ´9€g398™ëw¥P›SÚ7+åË¿H Y (ÕÓ3†ªÌpÄå$n'ÄÙ#cS5 Ä€]L^3Ku›çó/Áø»B)–•X&‡÷9¿I¯È UZÿàÓW‚S6¸í{2gZøs¦VýˆWúÔߤ…1ïts•ßÓ¢r §êMĬ†Ðµ?ð*– _™Êä±z|ÚÎm¸!*}~´ÇÛ¢ð“óº4cäï3µ‹Þ?´=uÍãˆfšé­âΗ2òª»>`èC”„ þ+oP‹A°áó(Ó¼-iZ‹TäÞ«rú¡K€²öi€,õ~Z$ =«b ?ÛÍ;<2:ªC™u§²V%g’µ•>“¤1–ö‹D´ƒøéÜÍGq®ì(Ég3.H᪜ѵýµiˆ+‚¹úl§¦ €ŒrÒ€Yàm¥¡ã (ß~CƒtY "ªRwdh4Ãëê†Ù`ú½Èéå$²E2[¨ë@ 7b›!fƪ˷·ÿBÑÙ{ endstream endobj 3437 0 obj 7737 endobj 3441 0 obj [162 /XYZ 38.2500000 562.250000 0] endobj 3442 0 obj [162 /XYZ 38.2500000 562.250000 0] endobj 3443 0 obj [162 /XYZ 37.5000000 531.500000 0] endobj 3444 0 obj [162 /XYZ 37.5000000 293 0] endobj 3445 0 obj [162 /XYZ 37.5000000 494 0] endobj 3446 0 obj [162 /XYZ 38.2500000 599 0] endobj 3447 0 obj [162 /XYZ 37.5000000 293 0] endobj 3448 0 obj [162 /XYZ 37.5000000 531.500000 0] endobj 3449 0 obj [162 /XYZ 37.5000000 494 0] endobj 3450 0 obj [162 /XYZ 38.2500000 599 0] endobj 3451 0 obj << /Type /Annot /Subtype /Link /Rect [213.750000 539.750000 264.750000 546.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 3452 0 obj << /Type /Annot /Subtype /Link /Rect [483 167 547.500000 173.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.doxygen.nl/manual/commands.html) >> >> endobj 3440 0 obj << /Type /Page /Parent 2 0 R /Contents 3453 0 R /Resources 3455 0 R /Annots 3456 0 R /MediaBox [0 0 595 842] >> endobj 3455 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3456 0 obj [ 3451 0 R 3452 0 R ] endobj 3453 0 obj << /Length 3454 0 R /Filter /FlateDecode >> stream xœí]K¯Ü¶Þϯ˜uŒERO (àkû袀a]]IÓ"H‚ºYôïwfDÍKé£ÄïRQŒÄΕEòž÷ãÝŸ¿üãø¯ßï>|ùÏñûû‡/‡ìTYûÏñòë»ûèúdÿ|¬êâøÃ¯‡oÇo‡Ï‡Ïçÿ~;´/|ùð×óŸþwÔÇ¿œÿýùøýßÏ?üÑþ¥Ë_øõP©êüû/×ß›Jÿ”Ý~¿üü߇¿ýáøÛeÅîs˜×ÿÿ**“é #Ÿþvè¶©®¿~ÿá·Ã»ö¾bT^fùQåæüŸ&×ÇÿþóðÓùÝòÙ©É•ªÊ¼ÊÞò¡Jß¾¤›óY—½ï\ɬ®b,^5¿@.}(ʔʻ¸$f+£ÚãiŠçs[=Æá׺ˆ·øréCé0 —Äl]UöxŠ>s8ýÛòò‹™®#ÒÍrñSép‹WDn‘ŸÙÂõ€Š*ÂñßVÛÂèx‹_!—>‹Z¼¸$f‹:ˆÙÛê1¿Ì³ˆds<fáâ’˜­tÇ1‰p@/ËGX¼.âiQ-äâ§Òá¯.‰Ü¦1ö€ªGô²¼üâ¥*ã-ÞB.~*rñê‚È-²ŒÍ˜ç[>Æâ1™r ¹ø©XäöWÿ² ¥ý 0Ñ¿y^|úzx÷¬ò XåñëOgàÚo^ûz>”âøÝÅp3ÕñëÇ?žAjþtüúó¡9•ºè@lŸ¨=É4|'‡ïàÕžà“ð;%|ßÉ>Á'àx:x5aËž‰ýÀÕrøƒéã´|b <ûÁ°)§F=g »¤*üŽÁ7‹ xløDñ Æ_…Ÿ¨‡#½'öÃp ø µ&nÞ©&¸%æH˜ï0b¹Ë§¯g1]‚å8ýã³Â8téÁ¦eΨ!Çg¸s›ŒO0Ú% % ªòÜgæfÍO£„ ¥vj¤¸]XÝÙ.º°ºJ©ÌöpëSÝdWx^€©Ð»é¡wÚk‘ŸrÓF-Ý«dNE^ÖÕ´ïxVk·~ùA miD™“ѵ:?réêmV.‚—7.ôðp0z,} (†Þý°û½žþWs€ y¶G?O‡~Xפ,üjôQ›73sW0…z°ß2¼¢»3“’¹høtØŸáÔ1ÂðÖ{÷éS:%¸*óÅ(Á©<ªyØ4ò˜SXeÊ ~‡€Àˆ©è¥6ãªÐÆž$spjçüfŽbÌPÆ-‹Ïš””ÿC@í¡Þq’ä¦×™^Ì u Ä7¡êâïÀ꣪0ÔT=: GI—U ­iWþÞ|Å5íŠú‘=— YȱTce +¦P,z`Ã";KˆGÝt»{JøÕ¼N- p„R¦žG–|ÃÕoâüjã½f”7E—åMT!ŸŸ+z΀Q,q|¡Q1%Ôa&º 1Ô„rí1½ “M8ž[c<T&ä|wJÂ8oSV£û^²œÂ’ų„`—Fœ ¯æqÎ<ì8¥¢’ ¦Dœ}¦‹„Ü¡.ÇOqÁÜߌ¯†) k¾bŽ–Qœœ¿\t45–DŽŸ"+õI©Îòr88tˆ]Bø‰¨‡;qLË:ï%اB„(e>¼jgŽ'J‹s*pœ˜¡˜éj|| Œ8$O¹Z™4Q—.Ž™{vš*2¿cÕ˜°Ì‘{‹¯óa|}ˆ#öpŽ€»Î`plë_¡*WòõÒ p§ŸàÔ)æú1Ø„”fk>Ââ ÏHðÐú{ç {¬Uá³`dA”ž¨Ïô4¼”º%ÓÒô[¾UM%`_”zŠ÷Ťïxn\@B*>jœ[‡u¥­0=ÞeQì4MÏàŠ{¥„s¡%Òbõ$S(õLVI^ ê¸&F*læ0êæ«ëiµó!¨1uaô‹å{9¹ª.ƒÀ£saICdélÂ1Jk3»kew­<¯fŒñ[ZWUa0‡P µÛóët‘5ù(´ä);d-„›-¾Ø,{bÓCi¢ Ï!á.KâÙ©¬ÔkŸbËÆTqÊóúÖ½‡«µùJwÞFÑ¢Â+P»ÃôÙaÒû¾˜Œ¯¿˜aÚá7c¨«}EKÔ1h5>VU3ÄÇtyecJÝì²÷ghõ›žæ;ðÄn­8iW)²{B`yÓÀ;6géÌ\~f™ïÅÓåð3K#ß±úCï”jŸ@4|‚wj¹ðY9i7ÚçÂýÕ Ü©Íœz‚a{†çFìÇ*[åÉ\yðý“övW'Ó»sÛ |ãC éãG®†cÄý¢^ŠËVTܪ떲Ü`{±Qhky–Ÿ½…ç;‘3¤zçO «ëTÕ#¡Y‰ Œ‡ÇÓo9.Y5Z¶?¡>Sèa2„¦Íx‹¤™ÊxøP]±æñRÝ„º2ÅN®eh~ÁŒÍãW™nù çk,Ð7?¿ŸS´;ÅQÅާ¨ 6¥Ãs4®paúpâúDÜ땨´H‰™£ŒË‰¸žÇe<»f%#&FêÆÅH"NFYŒ+ ‹+,”sVBÃGL™cŒV¿ùŒ[Ùð3\ÍÖÍ ÁÖëš¹õê.ã6Öô\½§É5Š‘—ÀWÝÔ„–‚q2! B²å"«d! ­nåôó‡$ð;[sÔ·ˆrlCº-°‚À^Ú!Øp ¥‚°a§;üÆ\n1Wv÷bž³&‚wÀn¨Eó€ÞðË ¥ò&0~ž°{³XYÅ};÷rEõ¦ó©iI¤¦p$Rnñü¤e׃L¦„0¡ŒgƦ\^=‰'­Ïµ¢GýV75¦¥Õ§š ò¯¸//Ã"¿J£îðËáK´q‘0÷ ‚CbímkðM·ŸlºOvBÊÌÕ‡èìc¢w ÔÖlz§ëëÔ×?ŸÐƒÓžà“ ~çòøöÄáwð~¬4´ÚkxXV8…¯av—?cÅ0Cœè9‘c̸C1óéfŒ¬©@{¢×nÁíÜÄ+±äD ¦á¾â 1q¿­]ã'”e#½z¤Ý7‡EÛÔô8Uq…äŽðµ`bµLucS¯©â4Õ0ÆmA9Nb$’¾-8ãSׂkßæ¿ãLÁk²~ Ó7©üÆÉ£Å`ÔÖZ®”¤ú%DöåÔ†d3eL 5±cÆHêk3Ìu'ä eæ2i^²Ç”²Y“•ɨ›~lø²»fƉŒ¹ÈŠ<†“”1â–6çÅ(Ã#õ˜1|TébôÙªÔÎyŒ¶ÅŽÑôÄÄe1óäsãÈB N‰Èû:§:ÈÕûŽh+Uv3‚1õ1,-`Êø:uÙÀ¤H@Æ ‰“¹8£@D„Åç{:Ý}(;I^¶D•Ò™óc”~Fë#Šd™>¿!䶦ò¬7¤wÆ;…+w–\d24gååçaúmQSXd­×¹L8æFSºËR¤…ñØ%gb.¿›dÌ–Puéʦ5£[g®j¿H’sU:¢1,„C0Lx¯F„®l÷†“A ¸p5O)¬,É“tͳ®ºÄÙ=‰`O"ðßgÙ$Ï~0້)¯ÆÐ|’ª+hªÄƒSÑ*Sˆ‡{ã;‡9nÉÉ÷‰ HªÊ¹˜bî‚q*‹9Ù»Mð7æfyÎãC€e#–´LrŒ,ÃI+iù[í§©Gõ[Žƒ©ß±É&㻫÷Ñ]·{ýd×ívÝ.1­MùËt€õHÄOK¨õšt©¬Jp@[äf(6Íç[£Öï,­{'âÅÒeíàjkm$öéiÑ¡ë! BÚQg¯» Q¶Žlæ “4)2”8!ï­bóÒ˜M1QÂT¥° ždƒ†´‡gj}™lဴâ1ô ÛˆøË $’¬B’`ùJ†¨#r3×”ÕMÛ–Ó#aÝ{ÏŒ?ñ¤2s©†[$®³ýßG„Ó½yUø‰‡Ül»†~E(®Å’ …kLWƳҡppxÖ …ƒBC€¿ƒÏÀzLÊn‚Ù”ýìã⼫qìeŽ‹knµ³MZgíŸÇü'JËûÇEjD«ß¶ZÆ%Ûa=×6™H²=9ÈL¼ìeíî·•žÿë™ãÓM«\µªÎT?߀xó ä)Õà\Ö¼d|mØæfŠE¦7¡®Oà4P«* 1-¸ö•ºž ƒpÅ ¥¢¤í7­¢É G<í¹wÙ[rï¢z¨«ž.!›¡0Ý\cjërh› ·° ˆgýŠ©,[&¹ç©ùG€m¶ù’e¦»|É=k{ƒ’K “zHàÇ5®‚ßa¦ºyê&Š'’,=%;|"›Ïm ѳÆ8ejˆ:\‘‡9>7“®.¾Ìrg¾ÓÐîð„Â*!¤· #ž 2Ñ'žŠw¦†mc”ý@Õ® ©\e:1•ãB]Vf”¬ôÈ=¬µ-x-Uk=»ˆ÷cðé`ÌáVû‰êÀ=S¾ÁDçæ˜:}Ü·†¹ÛD½¹l§Y¹+Ëwœzä.„À#ß™>IØbN)‘µ=_¬![­: ¤ù›î0Á­ð¾wÛonÛÏŸVªf|°/Éì}•,É KU)‰ˆãi{¶É(«ÔEüw+g\ÛˆÈLYºÙúX …6/ÍdÉ Üð7 ¾rkƒ®RÕÕ0²iÖL®çôJ/ODU¶R6?T¢ŒÉÝ÷dOÅâ¹$DÝ]@ʤp³wÙ³D‰ëɸÍt†NµK 6šIQ²6ÆUqdÆ?Ì5É‹Ñ dÛP:ÜìM["gÉöž˜¯ø‰ù0–ñ" @| IüLÙzªA÷©$1ÝŠ‚ z[/ëWÓêÆã76²b†.NJÕΡ&«o`¼–Œý'2‰@RïÂìëqÍ$aÿ’èNÖ:/ÑÔÔ <0ëqqOÑ0úqцýZŸÈf?cÜÇФZ€Åí8·Ò2U¦]"„šò$Ïnã ;l¦·RHU’³•èÌ =IUáʬ^áX\;6Üí7[Tî‰ìÙ¨KÓV™«q ‹•Ù†µ¾énž{³·Ò‚+ówYH‡Djãp“ù;WÈNÖ¿½HY:n”™|P9ãO¿oG]¯ßýýR¯îWû“IS¸\µroæº=+û0 Ææ½±þ–ÂTŸÂ®„r¥“3]œ8“Ž©‹ûŸürøâqäʆA55/²z“\’MWކĊ<“Ág%òÿBæÈf ‹fNQŒ9QŸ8êt¦[HTø•·bfUÚáIýšIÀ‘u6ÇñÑ¥ÈfN‰ö¤æú*3(YVHªD|YæÄ„áe½©:…í·r¿•K¼•%jÝå"%×ò)W…D/O/†1<˜LÑY<¥žðŒáQ5™‰EirD0]fLW¢Ë˜´x²îÐU±Ç•Ϲ‰ØøÉÕ2™NÓcúÔÔ0FÅcšAÏ9lÎt™Õø!F6ï£pœ¸Y;²n^ïA*A‚h0ªaòn,É4 ö´·‚°YbÒsQcä\º‰äX*ù¿¹IVL–%Äèé¿C.Vð3ÞxÉäæ5è¸TXÓFœò6{=Ül '¶M”˜ÆÝÔ~ˆFhž´?¦N/›8–K=•–ÓÀS«8w+QUO=¦å'l)Æ´dÒV=PcØR5ê%nÝmÚ§~(~‰÷OÔ£iãeƶˆ6¹-ðý!îÜÖn#–|çR6é̳qYRj媙 O%0–/npéjÁ#I’q†Ë3­E]‘hn:?Ç^'£° jQQ6Ó|\¶m°hoÙ¦½²­Ì=C?››^D4S§¾CP<Ãý)êÅþbQ/·Ç#Ogì Òh%¦Ž¢•0ÍÝ á©÷`˜,”õ» m·¨ºSÜëíƒõX ‘Âc¯SWõŒé#†Þìqã q㡳6ÇŒyÒ˜“‹êÄKo˜»½Ì‡Îjã µ ñ†²¶ð‚é÷1‡ž¿‰ÖKÓŸÇþ„t˜z°4I™S¦.3κ£yk¿e´§P d!´XÕ'Ý&öΧì?1í;vÆú†Zp/»ï˜±¬—!ØžíNјwœ™¿€”A`•Ýzoƒ–Ðp~9Nª؆«Áw, VA[¿#[–à.>CÜAŽS{Þ‡“^M–l>ÿ ØÔè;šÀgÈ`Cñû ].µ`jwƒ5"ŸÄÄv\¥OÎ=xÂ'Û[ï .¯ï2zÙKVeædôÄÛVÀ'Ù½¨SÇχÿ„ó' endstream endobj 3454 0 obj 5629 endobj 3458 0 obj [163 /XYZ 37.5000000 189.500000 0] endobj 3459 0 obj [163 /XYZ 37.5000000 189.500000 0] endobj 3460 0 obj [163 /XYZ 37.5000000 159.500000 0] endobj 3461 0 obj [163 /XYZ 38.2500000 130.250000 0] endobj 3462 0 obj [163 /XYZ 38.2500000 130.250000 0] endobj 3463 0 obj [163 /XYZ 38.2500000 66.5000000 0] endobj 3464 0 obj [163 /XYZ 31.5000000 101 0] endobj 3465 0 obj [163 /XYZ 37.5000000 159.500000 0] endobj 3466 0 obj [163 /XYZ 38.2500000 66.5000000 0] endobj 3467 0 obj [163 /XYZ 32.2500000 99.5000000 0] endobj 3457 0 obj << /Type /Page /Parent 2 0 R /Contents 3468 0 R /Resources 3470 0 R /Annots 3471 0 R /MediaBox [0 0 595 842] >> endobj 3470 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3471 0 obj [ ] endobj 3468 0 obj << /Length 3469 0 R /Filter /FlateDecode >> stream xœí]KãÆ¾ëWè`µì_@Àó C€Å.CC°Ž±‘‰ùûÑHMÍ É¯H~Ó]¢¤öÂÞõpÙ¬®ª®wUþã׿oÿùÛöóý×ÿl¿‡ßï¿nŠ]]Ƕ/¿>½ýmváÏÛº)·ßÙüÞÖfÿ§âôûËÏÿµùËï¶¿¾¬Ø}.óþÿ?™²±µ{câÓÏ›n›æðë·ï¿n>°ì+ÎT¥¯¶Æ;¿5­·ÛÿþcóÓþÝòÅ®õÆÔ•¯‹|¨¶/_rf¿ˆm÷_ufð¡Ã¯8˧X¼ò ?@+ÆUF^=&qk㎲E›E§åS࿵&ÝâÈ£c¥#.^="q뢪qmE¯Ë'Àm[Ÿnñäѱˆ+¬“¸îEd|½.Ÿ`q_¶é?@+qñê1‰[š Ú܈rÿ8ŠN˧ÀSÚt‹ ޕޏxõ˜Äm ŸPç¾.Ÿÿ1 ‰{€<•ÎVß5Uøþ™üvó‚3_”{SÝ4Û[}Y²FÂñ'ÀÝx^¼û¶ùü´iOÆjûí§=ZŽß<üömOŽrûéÅǨöÿ÷ãö÷Eaü¶ß~Þ´»Ê–ˆ)ž”wè‰mÑ“¾S<À'>Áßy‚û©à;÷Ô6K@ ¿cø|‚)çá“ÂPÌ;~S¢Þ)æk¼SŒQ¼ ƒÏ^í2϶© ÊaIÁðÛKˆ$àåû§F`æ`Âõsfyú6¹„­< “.oZÓ­lúâh1ÎÑ0™‹äöŒ)ªñ½%óU°\câ­Q½‡¾ oTþi™Ö´}®ý€åž­­çs`\Ÿa+&‘°À°ÂŒAf¢ÁTfAK•ã˜5a¢ çÊ®h„5  /:œ8SÓc‚ǰ‹VãÔ/BÊ ]oÿ¨ êB=Aí«ÎåÃFD\ Ût¸ZH¨z¶#†çù=¶qŽ;âŠ\Û2e½.³…q%Žb˜º‚>jÌo B´×áá'Lµ*Ò°TœÉ=*UP5ix?˜Wñjk­“¶uÓ;ŠÙ㉩ۑtïá=n6Z£eG`+oÚùl• Е2iYÎgÒae&Ñ3(<‰{Ôi3%×П£Oc X\Í2¨7&úÂh‘¾„½rÂãò¡Ê„i•†ø£ú µ Ðð™'jp&!HÙëSöeÜVd5Ф°Q.^ͤ­R<_çFŠC¶Ìð=Wkÿeu*3Õÿ"õLl=I_€B0«î$¸h6C*))|‡ßB„Ÿ„„ƒf}svÒÐHÙãúÄcꊅx#6¼°Xbø?nKà­x)ÚIç$êL«(3L„AK8|ªÕ¤Å\JÛq¹ñ´á{á Ü̼7%/ñÆ ¸€þ’Èõ„Z³ruOkf7sn¦nœd‘s"ZQ;ÔVàË-`&Â^ˆü ãûÔ{5Ü â.1SWeÞ‰µû%õé-ðû´1Ä|„FþðEO¬¼Ö)AqmÖ%„‹:U'î )Lßû`JÕÓ|ûp¯Yo1OÊä¶/{ºK{B=.¯5¾ã‰v×U5¸ðÒŒ'ÊÅ.É¡©ÃEJ£ÉŽd|cf64F1¶ÀˆcJ%M´Â¯qKN´¼œ¨ **X̨Kf´2Am¡6ƒ± ÏX±`öR¢§8ù‹·0ßìת¢†1E äS£S¡bN÷X0xŸ 40J™¤å.a´Å¥DÈJíê­rŠó8ÿ 1[@Þ¤‰œ¿•&ÇR*æ¶ê±ž -”RºÙôS7ýfð]v`ƒð⎠¤2{ZŠ׿W*žn¯¹!îE:u=)«šºoº-Ⱦ̷8¨Æ Æ•K{ÏSâyΦ"‚°õ~û’ÂÄÈ‹_¦›³æùBqúµ• ¦ˆ¯¤ôMå§Ôe^2ÅY1,œ,bÅ£Äm™”ë”"Pˆ–/°/(ž¹cèòæ<ã{x¥®ÄÓð'fÜ9‰‰Bã§… x$21hã Þ`]x‘LÕô(‰Ul)'¼Ø’9q¯Ú]iCŠ·[Ô¦8qW¾Ý"ßn!Gév <PX 㚘Òí ‚¦Xéâùº„©`ð9Í÷k¬ú~ ­2÷ÆæÞlìë1öÏ4ãu†-eºéÅ+¿y£6®™äyµ›7˜›}0/2wX0²<îç|WÏËu¥ÌËxÄg¶\Õu¿µ¥2]Ûm×v‹†°S|šð™‰+k0W­X:hê k´oÓ ½f _®ü·ÎMRx÷’Ô¶ìn[Á½$/Ó~_ó#µ³§ÌäÌ‘YÎTu SηM4ßð1‡¸â#jŸAÜ0ªF”©Çת‘šŸà¤æ¨3%X :ˆ³ž¦ ’ªê‰ZsH•†CÀžA8Í\²;ÝÞ–sÉ9—<ñ¥\²àÛÄÍHb”áxŒ"RŒmjüdí¹÷zÿb–5YÖ¬BÖ0YâÐõ·ÌGÆß!¼gAb¨1lZ&œÉu+’Ä'rJ—›‘÷¦ë ÉZ"k‰uh‰›»¸1ËèhgAÈû¬]».<%q–ÄëĹZçú*u³.8>׬›{syqóuæy~ßš÷Ç^æÜí-‚¾OMÁ‡ Yƒ¥.»Àö¯y’w¦œÿúoKB¶Q˜KÌelú21AâS .«Ý&Ô¬­q}Íš£Â3@ZoT8yçeŽÝ΂úVb·í¨ËW¤Š{ipôIL±;ÊÉây¶Vîì õ@¼óßiÑ;]ǺÛÕýÈÜãÉ/kÝÜ'Âv$|µsÆŽZÖ#ï„ÈéØw øÄ"•=öˆÀüc…°u±Îªã×O¨ñN!ð~0ÊAŠ)~Kxüœ){çS$D¹Çp¨Å•ZQnç›N‡µqúýꦄòÔ wì‘qŒíDíÇ,Gb5û÷w*À†ßÁá(øD€¯aÃI¦4v‰àÁbÛiAñ‘RÝ5ù„Èz`C;Èfo}´¡FÍÖúфñÎÁ½NÕÿádƒùž lГ`tT»j  žà;-z'4E˜zháêw ù;õ|R Õ µÁïÀý5RïÚ¦¸¼Z'›F`ƒ8p¦øóaÃP§„™÷æ=³ÄJ‰æš¾H‘Ê¡&Õ RÀÊÏÃz íÀAbÍDʅ÷üYkr×E¼Zpôú•™@uê E_5ÒÕw$®ƒ_Û&âÔ.‡:®Ì¸È,ÞI'xGDòiIÂéd™¯ W`pEiaX3—1 20™K¡`ÔÊC*-‚[/¬­¢múþ[’r¾EºC`ÆT˜Q5.(`¨980ZY/ߘ÷xŠ•õÂü„@Èz•Ýd½p&¦…Op®çpÎ âÀaØàœs²"8Sö¦Ayÿkû¼ç$‘ѾLý…‚¦Ïÿ¸]a^À;„=ÐáÆê#¶ë‘Óuä;ìfA°‘>‡Ðïj‡¡;k tz@ßqSfÐlOa§ÃnØÌ ßW-X…En-\OQðh¯ß "Ô,Úú›,ýüyq9þ0\‰YÀBJÄe *_Y (µ7> endobj 3472 0 obj << /Type /Page /Parent 2 0 R /Contents 3476 0 R /Resources 3478 0 R /Annots 3479 0 R /MediaBox [0 0 595 842] >> endobj 3478 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 3479 0 obj [ 3475 0 R ] endobj 3476 0 obj << /Length 3477 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€{Ň‚»³;r0Ør0rÖqÃkdâCþ~¤–ÔÓ#é£ÄO%õpö<Ø¢Š¬w±ªøáÏ_ÿ‘üë÷äÃÃ×ÿ$ßÚï_Oé¹ÈÒæ_RýpûYžÛŸ“¢Ì’oßO/ÉËééôTýÿåÔ<ðõá¯ÕOÿKdò—ê¿_’ÿ^ýñ§öCõ¾Ÿ QTß½|7…¨~J¯ßë¿ÿûô·?$¿Õ3v¯kyûû"3R댉W¿œºeŠË×ïß~;}h6Àí-J”º,¡•N„Ñ2ùï?O?W/è¦OÏF QäºH—¼¨õ›2©!MõÖ2¼èòågz±Âä&•ëM~Üû®• ûìçR+¡ ™éÑ5’³²”ÕÏ…jÿ-Ü´jâ˦µ NºéW˜Ü”åz“7{ß•ápvQ£YŠ,/sYÔèOUóë’ÕÈThÑn•6ÆûnÝÎïr‘+³Úä äþ·¥AôØôO.Ó`X¬êçÅòà§çÓ‡ÇjCóäùçšÜ./¼|{þ~ÒÕ/µS½`vv°ØÜ}ðžk,\†,á3˜™õ„¢.Lðx6Õ§;H)"…K×pzLøŒ0C¼‡€‘P ™A„Mòë—çJ,商I4/²Fšgù[HÍù²oVW ‘L¡‘vçGF4I1p¤t‡ÀïlîN+Þ#1lîëQøŒ€°¥ÝwDzžG8òÅ}ß(Ì¥%bØ0/äù¹ú>µîLº¯®µõÆžÁ³á]ijA*·àJ.ü'FOó ”"­\i®däÛòæ>ÄV&&×€ùÖ¢0†!UXèEÜ‘bõ옮|Fë J‹¥Y²óÌ!SBáCa­ŒñhÂá±HË8QŸB*‹%ba,phYì&LqPþZl:hE©¶€Æt¾€ÆÞT“3ðHP©–O{E“Rmë5”Ó^¥À>’_Û‘±¦-þƤyËl0²¡pœÇ—¼FÒãcŸÒ2–Œ·n‰ `ü` g³ì^)–ŠDŒ Ïæ—KOyQ…òzbèÙRÃt‰¹Gkix by‹qOX]Õj¿ºàîvë¶)ó`ZO˜c8‹:s"¢älîíí^I9½‹ï&npLiÇXp~Æ–O¬&B" kYâ•RXÎ8 aø¿gÇú#gí^Kh1 iÔé¾µãd"Уc$ [ÔSQO½3=õnx{÷š2Ÿ¡?0‰˜¯E·ágˆÌj=L^%Ý>ä9aÈó²²è2RBœßMÍ¥ß"A¤ç¼o‹fpª¸×rÕÌ6§4çÂãJK!!ÊpÙ‰e=xóJÙ95ê-álmý“ì†æ@Я«±<à:\¦K;ˆb ªX«¿@X¦Ô‡*Á³A˜ ªr£#ï(œ­ÍЫâ Å•ý%ËÒ™‚øb……žmMYS•YOaá…ßC•öyæw¨0¿[êÎð;ÎÏX-¡À }êO®ÊÌTýkNÞL;R9)†!Uoœ_«ÞÒ÷W=†Ÿõ’Ú+KÜŽˆ¼ßi ÝÖΧ³Ë&1Òr:ó`1=#ä4o_Yåï"ù;†¹pµFd]¥QŠi~j$ ¤æ(Ö«ëX¯1Ÿ<}ùäa(V¤6ÞÈlIû1õèö¹÷*%Î_3|2ugÙòÌ™Ax=–úƒ}×vY,É>fK]:„@B¨-VæôÍ÷@àZUŒ9¬Ç½Ê',…,>íÂ1-G4Æ‘ÃÄTæPQ"êÉÀ¶gy0ëÂH³(o6\ÿ£d—²w¯NééžÑ«³Í½º°^ʧ{³ìëSå’ÇôêŽéÑXÎáy‚{÷htº¤Ë Eÿ‡ÌQßÞ‰~˜w?Ì«tˆ~Ø.ü°]x4Z.é»Ò£ÑyÑÚ»G£Ëi/‘ñhbˆ]Hö€žFõêƒx™XÒ!õ˜žÆÎb·¥Øm)äîÝ–öá=fjIçßxv~Øö²3z[Ö÷l~êµ½–XÐÝ.ŒTÍu)è=f¦‹îÝ{ÌEðœþCÆ9ï´gTSKª Bú•y¶$é˜~å1½†t-ܹ’K²Gâ V=§}xN›szôœ¬ï¹ÃsªÜ,‘ƒ!=B^+¿vîizISô4lœ»þY±Ð×)òé¸}ø:E¹$Ã)ú:±÷®N=®·U¦‹n‹ÞVô¶öámEYý½wçï•rÑ­jý½RKïoµ÷Û5Ft&í5%°È³Ë.ô1O½$·kbùØ{±{À‘¶˜iIõ uhy­s©Ö¢D¯KŠ–˜>œ·}·ÐnOK4âÅH¶´Û…ÄË´ùdÚ–ZØgs¢¥ZöeJ°F¼ }¯Þn7K³ž²4ÿeV€ŸÁ½ÚÆg‹Ñ6¿rŸê=ÌÀFð…e¯ñJ?örÐïß3E½Í©Û£¬ðÒq÷nFŸdír/'‹­Çtè'änhmY)¼—â´ßÐÆ_Ý ƒmx}Eý)ÒÊ­ëÁQ*/nЀWŒFŘÀm÷±f€WÂ0~'uGCã ZkF­&aGcpå ¾3“N¨«‘:Ér‚J*sdzs–µ2—^̧IË$xŒ~ t³ŒE ÌH1f,éàÄŠ´/eÑ#~FpÛ‘‰bwý;{˜ÙæG©Ké‘gá|SŸ;N¢ÕÖxb¢?ÔgôcÓa%b¹†C,$¬c»¢&ª¼¿ž&ЦÕLøº@L®Û‡P6¿Þ3ûÇøÈëI¸–CP\'PÁ:GùŒí=Ä!s@û~ÃsÛ›<”IUz 2aÍ¡-ÌCÇTxDÉ¢¢E>`.©žWÛÌaOÚ+>—yk[Ø™ê+¾=Ó±ßSK¿¹)~ïáÖԣ̉*6xéÛSÞÓ€!™à2~1“l„;gÝD><ââ}Þ‰IÉ@ŒÇ(ûNëÅô‡ ¾‡ÜOè èÞU )TOúÛZX [¾ýmðÑ%D²b>ÎxSÇíd”ð]˜®Ì X£3#<…r}lÊf'sžÉm nóMãl¨©F€Yi&ékp¬ËÈD‹T&ŒÿIºj›émÎÛ¤ ÌVæ´“Ö¡ŽS\üpìwB.Ö_ k—ŽtxMšÁN¥…þvìz.¸ÚO|+Ô© _gµ¦^Ñ"JÇPÒŸžRZù Ž1ÇÓºì5©ÎB˜±¼Æ©@ s¢3°¶ñ÷™ÑÝöª€ü\òÁ²£™°ÃÊà¥6`A íš‘(Ñ÷ ,Æ*Í`¥PM¼žÎRn¤CôÚ%é@¸Å#òG׎‰Ýû 冹´ Ô”ÀÊhs“TëÛzNùókÇe½ÄI걄ö7?êah>Ô‘³£:ä^û¸¢!Bž9ød~# ¢‚#ž£h^ø=èÝu"ãÀÊ 6äNf/°qÆSÊê ‡nUßö¢Õ‚"¿ÕöLºÃVÕÐLi %}20üܼ¦˜„’<÷RCÆø c‡v>ú5Æ`À® ŸíÒצ ïU³-RÑS—~LºÄíñôD»Ï@eq²¶J;Œåj÷R®vȸ™‹)7ÿ0гã×åp¢°²èV6ˆ7²¡ùË,¡"æ ¥UOªèfIBŸ¥˜í´í™J™ó{l2ø0J]’™záÞ†jÄjjä_p¯Ïõó•Š)Ìí~=}µ(«•´\aú‰sO¼åÕ–‰0£Ý—ò˜òÚë¿1ƒEzn’Ü12Ò*©ì,™KÄ3Ÿá3=ózZѦåÏ‘WŠŸ_®M¿ÍÃ'8òྞVägu!ˆY°µ÷±Œ@ ¼Ý1aº Ù]¯*_·£ïú… {‰Ð„êÃÌœåî¯,ÝoAß]´²u;´Z·¨>ÔIÞº—;ØôãÅk|$T|.‹3½ñ-ÉûhùBkž›ÙÓ‰ÁAï$±—òƒ±ÈöÞ"S>îÙª§QMÑÚwyGËøš6˵sð:E/ZÄ—±a¦®’uº˜°%7Ø„7¤àËÏ®H)»[63 òæHZRÊô²\ ˆw•¸Ô‘ºî‘¸V›ºê#_]¯ÕÃû†/&Þc¹Ð¯^_i¹úC0EÌX&„á;™sùÎB,¢ãÕ×ED^ È«ÌÕÞ‘‹Wáb•.àbË Ñ)aÉŸ»2G&¨‹ d¾Ûr¹0æL?jÏï¶tálFþû ¿+Gfê8‰‰9¯^7+òjäÕð¼Z䓼ªòüp(Ú³e1ö¬‚°E«u¾3f’路Sß9|w(ò]8¾“¬ÕðD.ËÅJʹ\ì‰üDH]üº¼(ÂÉ„A ÍÅ:[Âż ÄÅ×åE3œ‡©à3Ø÷ e XöŸ¢#Ê[ÅÉ.ÎËm¸Ø ùXì[Œ7‚d±ª‚”«ì¹"%Êž({6=c#p¥¶ìA½.¹7–(电Ƭt]1T(ÝC~¥¬eyŒ€bˆ Îf!%ü¿³a²À{@œ×LŠâ@ˆérë< )!–wUå×åEUð  +8È] HÉ¿ñJ½’¹§D8‚aAK@ŽPºï(\O°°ó!iûAÙ𬾒—JJZ…èÓÔfT”£V¨s*êjÀD^o¸Ç šý)FªN‰ »²èÁÎåÑÖL–ç|PØ@0Vµó½GM°ÁöØ®]Wƒ»ìéWRlWˆ9X`K‚¸ .BY†À³ÁgÚlvá´ô²e ®þ¹‚¸ƒ— Á^÷˜$Ä„_h«_I ­º¡ ¼‡ æ1ô¿8[[˜¢gV[t1ë£SÅ3˜ÉQZ‘ªs+¥f’\Gä­¼ž’ÕÉÓéÿÛWÞà endstream endobj 3477 0 obj 3860 endobj 3481 0 obj [165 /XYZ 38.2500000 324.500000 0] endobj 3482 0 obj [165 /XYZ 38.2500000 324.500000 0] endobj 3483 0 obj << /Type /Annot /Subtype /Link /Rect [354.750000 302.750000 417.750000 309.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javadoc.html) >> >> endobj 3480 0 obj << /Type /Page /Parent 2 0 R /Contents 3484 0 R /Resources 3486 0 R /Annots 3487 0 R /MediaBox [0 0 595 842] >> endobj 3486 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 3487 0 obj [ 3483 0 R ] endobj 3484 0 obj << /Length 3485 0 R /Filter /FlateDecode >> stream xœí]M㸽ûWè`4"©O X`¦{:@Ó@‹‚Ùì‹E:{ÈßlÉ’ÛÖ#©gª,¹¹ƒî±,ªX|õX,KÿòõŸÉ/$¾þ'ùÖÿ|øºËҪȺÿ’ýŸ§è:íOªºH¾}ß½&¯»çÝsû÷ë®»áëÃßÚßþ—èä¯íÿ¿&?þ£ýð§þKû/|ßUªjþvøÙTªý-~î?ÿ÷îïJ~ß·x|\/ÌÛPe¦ÕA Ç£_wÇnªÃŸ?¾ý¾ûØ)`ÞSŒÎr“%*7y¢š\'ÿý×îçöcóYÚ´ß.ëR·}LëÌtÿdYéý3UÞJ­›ýƒ›æü™] Ú߸*M³XãäáÕ¢L©ìÍ/3Òª*L¯¬º2 ÆØ~øÆM©‹å`t<¼Zú‘žhþyN3X+5½Znüü²ûøÔ°Ug™¼ü¼GÜᙇ/­äí•{BÊ‹äå§äÏYVè’—_wMÚÄQÆîŠnЕì3¼b`kŸà=ð –·¦à•®§_^ÚQZLÁ¦%®· ÆÝSå|5fOðÊ—ù‰%P¼’C pð@BøáÄPjƒ³e0O]qigY¦jœ cc„¡Y8šV½Óœ„¸gP½%§°ãª†÷à+_]¡ày|…µ9ÁÂ=øžó%¦È´›aJA»²Ì„„ÝY°¯ÜÛÌnˆyUÏ¡fÜÇùìG±FÈ'I»Ó…Øð„'Y+ÖÑs_•ç­KaÙxÍò¨ œóE}í"¯oc‘³£>KZñ ’hÅÑŠzsAv'0> jë1Œ AeÃ>ÙZ¸´R×pé£$Ç ¢Æõ†Áq½±éõF“_a‘ MRtì òq ,jŽ$fOKTÏžÌ@b ðsðìbï&èVÙs´®RU[°.×sd¬kTV\Ud+XUàµL‹00‰‚÷ãí[<ÂS¡°¯„W¤ÝY4 ÇGt]Sæîi,,ϯ$4v– Ç>Œ”pˆ¥$À›½bHz^#ds&VF°_½!_ Ç×4n™ˆžZZ#bD–çà('nñŒs0Õ9ÿâ´$€àéo…3øô½˜F‰ó8b;Y8 ͤ60GÍwUf<ÎÉ0±æ ®ˆ$˜_y¢’ä²ZŠÔÉBì$ËÂož3¾Š¬•çÖbßXÁB–?(+Z~´ü­[~åq ‚9>.Ì$Â Ö 8QI Ö¬"XÃÀoE1ÏLähdËXäöTr´ÈQ%Ñ"£EÊ[¤vŸhXJníÊŠ¶mUÞVsó®Ê›B–’{$åFK‘³¾¾¶Kßµvb@} GÔÏA}ã‘‹‡˜ØúrÕ„,eèx´”u[ÊAv´.­<Ò4‰@®˜XÁ’Ö5vPðÞÞò§®TðJ7ÌyšÔu9?LɈŸSŸ ‹›·4‚Ez€ …­áçôjŽ]PÛ,¥`©ñ`÷¬5un Êfé)†Œÿ€]|µg¯©VÍÙWµAY¿±¡ÊT›ÃEÑ·<êÞ‚¿sƒÆpÀVŠ…½ 9”©c]¥õù¼ƒqXøF0NÍÅŒûÖ¿\qJAØ ñs¥R,ÉL7jp7˜i­Õxu}†–àðXvÎ’XèþLY‘]««§7ˆ`eæ_±hé ê:ÅÆxœÖ7ãZÈ+…`G °é]tCj4x68Pù)W«7\Ý}âEòÊŸäëêœä7É@Aš·pFçÆ´käÑ Í2”?ƒçråç¡Ã•ºÄÕtéþþïí¢Ö4§Ÿü¶ûjñ/–qL2¼m^Àèqþ”n†ðFÙÅDÓ#f†8gL}Ä’rÆœkaÒ^2Tå®oÚÜâ*c–þ˜´Èvï°+cž=o²(S¦4ç«2—s*T4Ç N‹w͸‹Ì¸Í˜Ö(aañT€×Àþ𛽅 ØåWq8šñËÂ.4 ès?šiÄ2ã0ƒ€ŸÃ,uü±{éÉ˲üüO¹Çmòê|¯Éb‹3,Ž1‰%Öø‹Æ,›³ iéÈP}Ž'Mªe_ [Ø=&¦5¬?,519_rÃ3Dx)l:×З™á}¦lƒ‰’IEð°·É  šcí„Ý‘¥lOjB]áÆ?„&Úå\p¢k íšè(æYx=1r™G‚ieÆÒ/èöSÍì9[ñLPnK³Yب­“żÓoÂîTÍÙº9_/½­vó„£›-š^Zæá^´ÎôüRÝôR ä‡s}q=8|î žÈµäpï[U®þ©+Ì;Öa n ¯Âõ6pýAœ %À:ÀãƒïÁyâX6‰c¤Ju`®3wN`áC X%D‚¼å90ZâÌÀ FíQR9¬‰ª]–*WD­xËû猤êsšxD17ê°ë•|B*)=^ÓÄf*Ò1§^Ö[‡±WpíQM‚)MÉã—¨Úuìx“eWtÜÂGO‡N(÷Y4‹õ%…-ņ”04Ž¥Æ‡Ü$‘Æã%[§Zç£HöX+ò¢ƒ=¹áãú8¿t¢ ·ïéSýÔ¬®ŸÔa·ÿ½•ø(9Nëþ4ŽDXô)û#ú#'˜À:dFKÇK[ëkåÀêç`¯¯bÃtÙUH«2“ö,å ¹Âq¥çkW'Ï»ÿ´ endstream endobj 3485 0 obj 3686 endobj 3488 0 obj << /Type /Page /Parent 2 0 R /Contents 3489 0 R /Resources 3491 0 R /Annots 3492 0 R /MediaBox [0 0 595 842] >> endobj 3491 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 3492 0 obj [ ] endobj 3489 0 obj << /Length 3490 0 R /Filter /FlateDecode >> stream xœí]ßoÛ6~×_¡çuH%’À0 Mš{$À†= íº¡X‹e}Ø¿?Ù’ãÎñGžÎ'9jÐØ1-òî»ãñŽ¿îêûû_ëß¿ÔW×÷Õï†×ëûJm\£úõöçÕ׿Þ×Î7õ»OÕcýXÝUwÝïǪàþúÇîÝ?µ©èþ¬þ¥ûðýð¥í>UN»îõÏÝkpº{§ž^·ŸÿQýôMýy[ã¾¹˜ÿþýJ·ZûvKF¢éÇjϦÞý|y÷¹ºê× CÎÔÚ’­u°¦þû·êC×À¡zµ F7­oMÇãÆ+êÿ”6Ù5FF»†jm‚ªµwtÜf_C¦úóWN­i&«¼§tˆO–UÍ4` jÓ–8ØŽ/ –±i°Þ@RÃÜuÁÒì颒hM’T¥Ç« îãX#µ]_¢–x}ô˜=À¸6hK"c~ð3xP€âµ¬~)%+#ü®ís„ŸÁ#¨F,|#è]›¼”ÊŠóJj|ýë’0’OÈõg pT;Ç*"ü’ÃyÓ¸3 iÝݥ㛀5¹­õ‡7%Ò±—ÈÃy=Þ!Åv‹x0leÀju:ö%TE~=típ¿+jVZJG3·“òÄ ÁØ0"SŒ$awwA@“q!€#þÄ +ïü×rýà60b¼)Fê2ì9ň–°3õGbqh€Û£{Y #ZÀ˜ôÍ–Ø¥œeÄ7‚À?CØùŒºèK:Ì®eD>XçR‘O!&<Ãë—31Î)ûd³WŒ‰g”êl…Ø3Œ—)Ø¥Y’Qj&A·io\2âDº!|›äÂ{Þi†B‚l^V=%µXßÌ{†¿\×Ó†/aw6$¢Ú0Õº ÀA3|{LªÀjAÄðÆ1{xnªd' Ã0GÑ TjR¥XŽásϬQ]*2k•wÄßDÎFK<×yXÀF¥#ã’A¡ä acÒ±Êg4 1aÓ1fB²­)2²ÍÿŠ‚BBiQŒä8v7ðÄ^@OG>‘“¼/êjU:V‰€%ß0ÎôKü¬›\0€¡U=„O·Ù ÝÉn,õ7 ô¨d€ðTIÏšßø vÜJ,1°DÐŽˆj 19©ŽÐùz#mÛzÇ+‰ ÓÓ¦õþ¡Ã3 ¬ JNcic¬o!ƒ^GýatÐGD(ÁrÂ)Ð Û‰ÐæØÀ Gª§ñ%ÜÎ0V72^çgcD%3许³Œ@ ²QLÿp;k ’z¶Ðx¡9ñèXØðôvFÓ^œŒ‘Ábµ4ãá &‘vÈAX’1C4.ÜßA1·|£‹-ÂË +‰) (~[al&-*±o³7ÛjOÛ)7˜©§3b¯ãÁØF4)‰#z¼*ˆCÄ•Pj1Ó2F'ÂÞ ùQø<i+xxšœaÌ£K®ÇNò\äD³ŒYù¼[´$Ësà ¼L€\ËX1($”˘‘ïD°dŽ ,دZtâÓ32¡HÖ"ã¾ä’žçd5™û‚¬çä.‘3ñRFPÏÈ«qDp÷(¹ÊéJ$ûP"2ʶ´À`/(u{/+¿FnŒåÞH‘³b)›(pr<¬)›&ž“1bMÙt™GqÂTY&ÖÄ ;€­ZFfŠ™ÁµŠ“b½—= ##ÿÄroL¶Š‘ýa½1ù€ÙÖ“…f¥à|V÷Æ:†>ë.`ÉNɤ__FNž‹õâé,Nž‹åŽ­š“b½c4 #'Æz×a FÃȱ€»• ÅÈ´±°rMgÌâ"*kÙ9Ö+b¢‚\ì¼”5œŒ/ê> k8y;Ö#¸XŒ, ÿÇÜî§~ì8Œp—úcK¶?…iÚ(ÝtÖOËúƒ¡<µa³çÕØwÚ+“Ù½+x†Bû¼„n†gÚ¦Gè ‡ž‚S»×oP;”ÚÑ{жÛS7pløñff{ IAbõÀú3‡^yªzK,bCãÚà3Ã^J=Šõ¯i©Âmßwï)ÇûÙáQ8¬J"¯ G *0úJ'0†Écê±|1°6º=f;˜nÖWqÇLu²³4Í)Ú VŠ©rMB{²Õõ]õ/ì0È‚ endstream endobj 3490 0 obj 2109 endobj 3494 0 obj [167 /XYZ 38.2500000 686 0] endobj 3495 0 obj [167 /XYZ 38.2500000 757.250000 0] endobj 3496 0 obj [167 /XYZ 31.5000000 727.250000 0] endobj 3497 0 obj [167 /XYZ 38.2500000 686 0] endobj 3498 0 obj [167 /XYZ 32.2500000 726.500000 0] endobj 3499 0 obj [167 /XYZ 38.2500000 757.250000 0] endobj 3500 0 obj << /Type /Annot /Subtype /Link /Rect [428.250000 240.500000 446.250000 247.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://sphinx-doc.org/) >> >> endobj 3493 0 obj << /Type /Page /Parent 2 0 R /Contents 3501 0 R /Resources 3503 0 R /Annots 3504 0 R /MediaBox [0 0 595 842] >> endobj 3503 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 3504 0 obj [ 3500 0 R ] endobj 3501 0 obj << /Length 3502 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àhø¦ ¬Çž90l ‡EÁlvƒÅî"Îò÷#µ(·-é+IÕ$[íÖ3ö4-ªXï*²ŠŸÿòôÏâç?ŠÏ_žþS| ß¿<Dé­èþí×§·¨ª ?¾²Å·ß/ÅËáñðØüûrèxúò·æ§ÿªøkó÷—â‡4þ~©ý…ß^úæû¯Çïµ—ÍOâõ{ûù¿ÿSñ{;cÿºÌûÿ’NIë[0f^ýrè—)_|ûýð¹CÀº·he´4…4ºù§6ªøï¿?5/8M/ʺùuW9Õ¬±¬„îþË}¥WÍ;µó¾ª…«Íð•Ýq¦—ñ'7Ú‹d“wGÇŠÔNÒ³—• àÏÌwW-άP ɪ1XÃ^FJïL‹U>'w¤qÖv¤Ñ•H@ù×éPÞŠVSñìòèX lEÌ^VzÑ^YÓº%²­*Õüìuøs&Ò*ôˆq)hÒOŸ‚à^Ë„ÜÔB+àÄì¥ÙV­Ò8"ȧ@Ñiú“×>áäGÈ£c¥'.ž=±4;¡‚ T¢Ž¶Óô hâ”NGðòèX Ïþ¸f J÷ ða_ˆïžŸ¿6îBƒLW<ÿÔ:¡Çw¿=7€K[|j=1UÏ?ªïŠç_ué”íaìFt…FÄùryxn0‘~ÆÏ.B84"á^žð™ïgP25r‡F:‚«&j™Â®rGäÑ#WvK“ wàœÀ¬ÐˆðÇ[*× Ðþuý3ˆSÏÔèÞ#K[kÿn¶{4";RùR×bµ<ޏRËŽ"'–ð=p¥ø=x=òñµTð !pp¤ŽÅ”5y#:¦4¶G»âG„Ì¢JsÄÓHM?ðæ™‡Î˪.mbϦñ3'¦4ná~æ>ž–hLܤîRë–Ð¥6ïù³×ã‘ ñ®t#¹vð™> hÄJU-í4åY´‚PßÁfë 2~Fâgàz‚ôú²®†8€ë!f ϸ+ìuÍÄüøÍÑ,ÿŒ°ºzOð)y®Ð–ZaàÈCP|¯Fj´*«‘"÷p¤ƒ­:MÒ} {)^4=Ö¢Ù‚L­£ ¿g¸@bþ0R‚w6õ D1†@4bôzîRiñà@T ^LPP/Æ9!xz,òU‰ ”.‹yñƒNßЗN,ŽpØšXú yþªª×ó’dˆ‡X\ ü¥·2•˜ÌÈS59œ× ™ŸX &8é3Ì!ÖX÷bŒ‹‘PÇÕ¡ó GˆìœXœ§é°’'FVP³*fl·—›Â xQ+4øur‡AF~0Ç}ãP»–˜¶˜E±€5=T?,\ÐZÖÎ.¶–ÞêÛ‚1E¾0ã +F8ÔYÔ ÌýzJäÍ¢j„¸ä‰Ùa‘Mî2Ô1Ëz]CÊYñ TckÉPòÕ„ïì’‡*!!fýüfKÔ örQ4’Ð09§bx ®‰’Z\# 0T¿/SR!WÞ†°‘857ðæÌ†Ãê¨2üQÔ?G cÆÚ`"6Šx …<«fë4gÕˆsgø|„€8«f{Nè‚ò'LÓªá<Á8aløt™Æ°Á‘ ÔÒõŒuÂzõ‡§ò๳[úÛéþÜYhfÂmÍå:ÅÈD±|)Æ1Ž‘¶ ,V‡ŒmBfGø›Kî¬K.Æ=ÀÉGs 4'+—»8[b£M@ì÷ãÜ26©Qý~ŽOÇÊnp4TÞm´…¾Ëµ¹ªzéÔ |F¬F#ó#Ž Gj8 30qg“;DU|°áÚ øŒÆÀg$.uu;Äz¾Â\RƒaãPW°`NİaYˆ¶û1/ÏþTª×MTÁÕU8x6ŒE<är‚ŽPsá÷èœ4iB³Y9Z$èå<:³ËíýaÓw©UéÙ5`¹%l¦0ä ‚_L>Œ´Edzܳa¾ÒðÍXON^¬”<óœ†NÉEG ÅVÓ1ZIá:šsh¢£e9@jës Å<ÂñÀ¡DøM˜ã þ%|:èíZí óÕX·8NZN'J¢aE(„œ¨âË%•+*ˆ9=q»®¦@JÒ®v`Xeæ+úPe*í‹,ïÐ2pz@(ŽÑÒn¶KCKžšÏã@dn$¤Þ½'æªÔÓí”5G÷à4Ÿf¤Êá[›p˜–¯(ÁÊúœã/œ·ügG²`DÉs¶`YÙ‹N÷¢Ó]Ë¿…-¤ës¶ÑX’Ž¢_¼„•ज4±gÉqFøº—æß:F®ÖvkqNÙÕìHž5¨Üe=[Nׇ^1UÝY2Q‹jë 5Þ–Œžç0†:î!N¡¾¼okm"ÎÔUî8s·‰æÈÏæÙÔßZÄfTîˆm×"ó&{\–Ëû½Ê£l8ç}y@d°Ozq¨‰]„Ýý7¬²k®\qÜÅË–²qù&""S'ÍUí¾ Ä¼•ÙçäÁúûâ¾LNÙ²:iÆð’ÞêÇ,µËÃ6{v׸æýGÍþíÑ#©+öèñöüê,ÅÉì™À\qØÍn†c/ì­:ýQs«[÷KœÍÞzóÊ–ßM®3¼{”3uÕžý»ŒÎ÷â£fÿöXTì±(‹ÞŒ.ßLl‘¾}ƒw¯7íÀnD%wÔË!W´o ºC0®?ä\WJ”»ˆ.ÎՌ˯{%*áãRQóÏêª1ªžÇ˜Å%Ó¸BSLgc\®ÉAq\Ždõè0 ¨3]›LÀ†)7ºE÷õÈuíoÔ›g¯ HBCg¥ZºpÙùD_ÌôÃ+®GÆŠh…÷¢ä=Epw¥LŒlôzÙÁ0ós46¿}DFÄàÎY¸Çå­dŒËë×ð9Ɔäò*Ó‰Ój(…Zž’€¸j.ª·žÍ 2ú—a؈X†1[zƒ*…Ò‹J:ød]¦Þ.G¾[N÷É"<È5xpnèYÀ^K˜È„xrP5H†vË–ãe¡?oÊv‚f=RÚ·Ÿüzx"X$oµ0 púÑ}–>KaÉSê ¥ê!]—Ûw‚ÝÄÃâ¢yy4Ìô¦Ï{g3ýCjúöÙÄJÍÒaIq²oœî°¤,ûDÕëÅpœFì*c„ê¬KƒX#pƒ•ßgœBÆÏžâž·Ãû<œË*3µææ´'ßÀ\†;}1öyX— à®]øúÆ…œöñ‚«rj®³ÚósF,–@,µœ:Fü ÞÅëaè Öu5˜+8ëaH:§"«oãj BÒ×±ø£o9Ú›sn9WÇ‹L²SÖ2÷9ÔëÔƒ„2ü'Î <¡7ð‚¨—ñäÒªÙèƒ9þ*éÃÂή‰Shb=¿îM\mekSÏr)o2¼œlùÜ‘õf"x|~‘ˆ9Ñ^Ôìçì+î–ŒOß^\[务8½z²e™v?:›Œs—™®|sâµ)$qÃÒůøb]Ä8^Á:¨°b#åòç æN°äðeœ°¯ýZ2UYïKlk@Üϳ[ÞÝ"2-bÆZa'|îþ@#¯¢t"û½Qûžó¶õÿ¾ç¼ï9ÓlbÏÙÉì·> /+Ì}üí7à›a\ôah;NUôì=ryø?û [ÿox¯q—Œý4Û:î§1®wÐIŸû4Æ–=„=s!(›Ã¡6?îÊÃÿÙNa—ŒØ’±ŸSÚåösJ‡lÃGQioº’Í33ÒÍWñÒ,ÄÌãÜ/,Øø®¦Ð¦¥.…lËí eÞsÙTφŽ/üDZ·"UªcqðØKwã}ž å~od½ƒ`ª¢ô½GÏÕOÁö5¬Uâæ æ’€ÀʰôуˆOMïáˆAËx6øL8’'W-ý s®ý¹ø½ Ÿjí{¶aÀl—Bç‰BÇœ7^è2¨ž…|dáÈý[%<§€‹ÇÃÿ§7ôˆ endstream endobj 3502 0 obj 3499 endobj 3506 0 obj [168 /XYZ 38.2500000 487.250000 0] endobj 3507 0 obj [168 /XYZ 38.2500000 487.250000 0] endobj 3508 0 obj << /Type /Annot /Subtype /Link /Rect [86.2500000 494.750000 123.750000 501.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.doxygen.nl/manual/docblocks.html#pythonblocks) >> >> endobj 3509 0 obj << /Type /Annot /Subtype /Link /Rect [245.250000 494.750000 265.500000 501.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://pypi.org/project/doxypy/) >> >> endobj 3505 0 obj << /Type /Page /Parent 2 0 R /Contents 3510 0 R /Resources 3512 0 R /Annots 3513 0 R /MediaBox [0 0 595 842] >> endobj 3512 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 3513 0 obj [ 3508 0 R 3509 0 R ] endobj 3510 0 obj << /Length 3511 0 R /Filter /FlateDecode >> stream xœí]K¯ÜÊqÞŸ_1ëžËf7_@@Ï^$ #‹à:N`ø‘½ðßÏ<83çóU“ßTÉ9mÁWҡج®wWUWýòïßÿk÷?ÿØýòéûÿí~íÿôý¥Ø7Uqþßîøëw¯P¶ûþÏ»¦­v¿þöòs÷óåÛ˷þœ_øþé‡?ýsWî~øÿ_vüÏÃÿÔÿ£ã?øí¥qÍá÷¿ž~ïwøSqýýøóÿ}ùÙýí¸âås=0oÿþ;W{W¶G0"ŸþùrÙ¦;ýúǯ{ù匀y_ñe]VõÎv® åîïÿýòçÃ.Ëû.8×Ô¡)ùPS¿äýa‰²+vU3úÎé—Îê.Åâm“pñ#äÚHq¾vââš” ?£§,ºº.ŸûM‘oN«cåB[¸º;’·tUÝÖåA5íÛŸÿú ªª ª±¦P D•Ì]òÐru¬\È WOCæÆ•uª¼>¶^­¯¿x{Ü}ªÅÏ룥'ôå¿ÍYÃ"º?…?þxùåk·sõîÇŸìvúàé·¿½„Ã_ŽÄÁÓùñ§Ý¿…oþm÷ã//ݾ©«ƒ_q‚ïü¤ìNOÚ}ÛoŸ%|òéô$ìƒ?{l·'=ñî¼ÚõÎn‹`H\1}ø=棠l!rj¸Ú—Ó“j÷0ªuIŠéäðjp?øwfç//Mâ@x‡ÀµÀ˜¦~Èð#©­7ó‘" #²:=ñû*Ôm3që6ÌÎCtáå)t1òŠ9…ÍV’¿ü8˜¨DÖ¥kæ%|î1U7î-“¨HNb«‚¡_ÌÐa6(þfþóç.â=…õ°FNXc/?Ãúc¶ƒø kºM:wµøÉš;Ú‚rÇBXV÷q²‡º Wœpb!¾“Ü&vMØDAd± ‚êX 3VºB†f:+„Ášç3$8vÃà;z¬à‚+7¸¢íìÐ#©ÛŸ½Ãwž¸¾ˆ'=¶î=é Ôø;R‹¡s]5D¼­^JÌX¥†v²:øäË|‚÷Â6‹Mf¯ÉŒ> PJ—œ}5dÆPÍ÷É<ŽàWH~ìù°›`ïtã^Øå&þ3‚ »Ž+pUƒL@¬ü:L´ “31¡!ê‡2׌˜:Þàâ‡Ââ3ò²ýÇÞZøþ¥ OM¥'΂¶^ž>‰ÕOòÃ`媡qÄ;BýSa5+fj*4Š3l4ÒI3R <_)E#…¨š•“a H{^jê¡›=9'Ô MÓ  aÎö‰Ü€×ÕO*ؽ¸²ŒFµrÄØ3°îYGXäu*SFF«¡1œ‘&¢B4x³ªÎ•!êÇà :½ ÁŽa}z&ž!Â6Ss©q΄;° Õ¤ê‰t íénÆʱÒG鼃ºWçLoT“&üÕÁ)cÄÁ)¤š _,¼ì³…÷u¸Ðé+t²at¿üß¹œ“èc<órð;C€StáNaêÌ ;‚|âáN1lâ@ N‡â „:@ØÊ©Â&ä³0@³pF;Ÿö‘¡ ®{‹Â;ÞåŸgnªBžÆÇ(¶Ÿ_¡cˆíô‡ÁòcSË«–*¶ª¨Ö©‚-2úù1EتÑÝT–PÒƒ¢ð!uÎ^1Ôì+s5B 2\MØ ÞÆ–júfB”o7ŒÔPú´‘1Fáw¨41SDœ¥á1ÇA·ö…ÈÄSµ/3©kƒ™ê&p©ë©^žc²x”:žáœq^&>æ.ÂíÐ-m˜á«3©/F•¤‡e;<Èmê<À¸ÉŒ¼cØFõL‚×Hl 8?Í>k H‰sTá-˜®Ú¿1¸“vPÍö[»‡Ü¯…e !ˆi¬{O } mÞ}¶Âö=¾ñ&@PAjÈÈ1*$ÔÍ¥+‡¼‡®C\IeÍ™¥õÔ¡©\h]Ì#ÇÖiº¢[DU›Æþ”±iß çIœâ|%œ¢ž4$¼Ü¡†Q¨XsnQ̸ϡO˜±ˆQì{¹³`N-0JY€é«ùÑ=v1ŠA@U$K76ÈHSÇMàÀ,^N¸rl#u¢Z­R¼«Ì]£Ò<ì¬aÂQ×ÄW)ge÷Jùl¡›ã!P,˜Ú6ùé¦H5¾ÿdu‰úŒ¯Ja¸Ð¡Õ–,Ûl¦±¬âM/Ÿ‘Ç;õ£eãÀ,Ûú$§ô—û„ºßi1Üiõ¥Ç-÷”wÌ\æzqŸS÷ ‹pLÇç««‹cgùK‡VvÓØõ0­ ªÊ]žPî¨Ëð­FƒËu¦”†+BéÐS`úR¢käωsªÜ»Tõs˜£uý‘ˆ:+7¨Ý@"‘Jl1–´¢ªn6ÑL¯`VÃ:B£…´ÀÉLYQŽíRF¾¯H¹#n£ÜÓ‚ˆii"h]Ã{²UY¿Õo÷îTâÛ–!¤¡zË‚³ î’â¾ ø¶$¼«èñHx™¹K*|ßsÅýT1Þðwðj˜>ø&'|§ÂÜ9VxG­Óê޽ÞA·âXá67qÓœº- ¹·b.aoà€y w&n2 ØÁÝ ‚FÁ:vË”³‘¦ÖKÓýó2õ¸þްSÜ·Û Èÿ%~w €œ$ÐÊ ES¸š.2µ9j{ÂCX5µbÚÅDßÖEùîô-öƒ l:–&â,°ü]þg¨°<µ™îKî´8M7JííêÛÒE1Ÿõ-©o™ÞR‹ËÙF%ЈÚÂiw»Ãšûª‹[äUS{»ú6LÐ(YßJˆgz1è,+§6Ž6Ü„'˜wŒlõª©½]}[uQÌ+ë[WF™=SÌ7í˜ï±˜þÖF㯅’Ï^ì®rˉºÖ»Ú²£y­£‹W†%M[GÅIh½þ”¦ Û"^Î!ÅÛLˆ0é¯÷ƒ&]T©Õ9Nàò2^"Ð;nùI~2å‰ —‡xi†®¶z?©5;ï'eªËëxB܌˟,¡Á`çý$L¹¼§!•éønÂÈvÞMØUË# k;9À÷“Ô]y >\éC÷b¸íéyõ¾<…VƬw/ˆsAûŒ¶´BSX ÓHöìFÜ»8ôB [ÙâfºBÃZ|ÿã 7ÓMß–¶{ým¢q(N¥a“îå[!0JŒ¨ÑmÍÌ+Óª‡œ‰)@ÌÅ:«>çÂMÈ|‡ãÕ˜­™°±ÉÍÝ”YºêŠ!.ýEÉÛÁ'ˆZ Ùáj%3ú—Š}T³6”|0”ÛRvèIôÕ2p:†ÇÀ‚qcOÜ–LuÂÓ¾IÙÁÒèÁ!4\IÑ+e×á¶šZ•&Ö7æ HÝT»ÂD1]”VDž|„xZÓ»|ÿRÁ¹Uí\íB•¾º««ª80Vþ´Uüaƒº=eû§¾ûÓ¶9smµ±)ù9 ŠÞȽ˜2í®À¨v¯;FLkE«HŠ‘‘V*ñ¦2Hc›0Òû«ŒŒ©NæÊ3‘Ÿ&‚ÇÄI¶Ùh;‰g’ÒUÝÐmz`—N|tF¯ìm*)§z«B­ùDÀvVõÞŸ¨ýúÉyµfïAÕÇ=¨ Ûmèý膿¡ÆØqéëÑÏPWÔòÞ@£þ73¢£Ëë+ÆÅÑ)¯Pm`–†ÚôÉX(ÃøÃ°Í¸õ°øU=e©!2ÇctbX áx./_ð«*âLTðÆŒx¬šÄÊ•›hÕùíé+y—¿>lsÓG£ÓôqYTäÙ;máÚ‡7ŸÇS·`Ãb‡[ã6Ë‚Ød¬{Oð;ŸØ,f…]‰R_2¬UlHZZ€Jß Â¬â&Ù¸±6|"´'&× ûÁÿ1Qˆ™ŽžMŸTjIÅ)ÜØ•S¹q[|°äàë&žƒ  áSÜspæúøj6òPºêy¦_ŽNg°‘®JéÂ<'ŒãÃÈ"F˜anÄ£ 9Ë[±•ßnG0ÃIŠo³¤,EâËPí¢2Ô?6âÓ+@ÙãçøT×÷YÉY lC”OKµ/Søô PæS;>­`¤Fxbɧ¾h¦ò©‚¥v¾m/s½6× ¾ã}á‘Îpp33$¯‚° Þ3nÓǾʷ/‘o¶Ž`ŒäÛÇ¥˜‰I cçñ sý“I>¶wB.ØiƼ÷È;ãsè ÷ã ¸æbl%† ÂÔ^ÇÉÏ×ñèºÃx¸š'ÔP‰IŒw ÅÖ«U]NÑ¿Õe˜zÖ¿EÖ¿YÿF0ŠÕÃñŒ7æ*!P›È"(›º CeƒÙ‹qd”¨3Ó¾™ã f2BœEȰ¬€¬î°ÀêA‰’!y½¸Â¸×J a®ÂA¦ðŠ S£Aášñ ðF„pJÌ„›ÅQìÊ. –9œŽ#\3\5¢óÜ9è:—–ÕB¾)“ 1º=%Ã+¨U(º„ô6øÅ–€bóPźxUe‡cÅjFyÝž DÆC0ø áL0u걃ILœÈ±Ax€•fla§ªl.ÐgpT]áâóü'Œ/`T5&D ­’w¢Q Û\¼BbLÆ!ŠÛ„$*6Ø¥¡uº!øÙªú=¿¶˜¥ãle5Ä+™ØˆîµA[¤pŒ¤øŠúg“â€m×s2̊廎WPšÖšÜʵd¢D>ãÝ¾ÐÆë$ÂX}™òöu{9¿®÷ø¼Šaã™l–ÀÅ/¦Y¹b‰œçÒ|4”âJ²g)Žà-Ʋ³tBŽnqÑ­µèR©¬¡t©eÅá Ôì…‹üŒ^xUÕð)£<6œ ¼!+{k!ló©>'D¯)å’´MZ霿,„:[=ßÄûzéêùµœà®Ï:›Ô F'8Sy¨‹øÝ'ê~VyXLf˼!+ËÐdû=«aÌ{ï¬# vøzÉgS@p ÍH[\œµÅ´…pߎ‰êàý0aþµwǪC¼~ û.FrÚäN·3(sŸŸüŒz©(K$¶ÅD­ŠP‹†¡^{¥º™P¥Ù"XÆ o f‰\¹DªÞò_^Š×b=» g¸ó‡eœèj–Õ,«ïPV¯Ç[IL÷j>aJD1‹GÊ=W¾p°Qw‹×QÓ„ëgy 3ÏðÄÚLé«ëƳ¾Úª¾Zæðì—õbÖ‹õPÇkQ·ìy~5Ï2*V­ãV?˨i'TZæ­ne+mÇÁ‚cؘK(L­ q @°¸D‡“QZ‰l‹ 5bªÎŽiËm{Y¾íä[°P¸C¬ît€uØ»ÖO˜e‰cጚdZã]$Mkðoh|ºN ± Àó¤˜iÓ©»ÑùŒ©Á߀h¤×óªÙ!rBPÛ:ª¢Ûn¦ÏY%îÐÝ”Cu§Ú^·eÙfŸgªouLÝ9Õ„¡¾ÞÒÄ^ÊBE¹{_ƒíÚf°]LâeϸWÞn)’̇@m®œ^6Õk Æî–wE¼|ò)ž÷Že›ƒÛÆ)w§Ïâ9a>ö±ë Ф?êYaÔ–™“ãšJÂê¶M$RºÔ!ÝÒ ïÊx©êò¬ð½ZÕs1†çÙƒe"úF.¡T•@0Õø ‡ ®˜ý˜AxàœP~ŒÃüO¦©2ŒkÈ!‚å$‚cÂõþؼ ´ê¡êª¡6gCc>€’ääÂbk†æe”Ûjʈž‚of¹¦Ò!b6j@¢Žµ‘û&Üa"nÌõ<ü¶°tQC¾¥2I†¬ª¾‰1‹IØo–E[IõJ×L8Ÿ¬E¾1‚$¿y%Yò³ä¯Hò» ·6Çn73mÛò>× %«N%àÐÏ&ýóU'ÀT`ªŸx=’OI˹ ½–m ¿ ³&3Ѳ¯P’µlÖ²«€¬e7ªe}ü†Óª™ÌTÿ^‘•õoÖ¿«¬7 ë wàbõFÚ¯Î=Ï'q½U FÐèósä„{L«ˆîµE;áò sAÞðf÷«MdYͲú´²êŠ pTwF™ÙF¾oÏò½nùNÂd+–H?á2 Ó,j±’2•HÿHgó,‘Ú™g|<"ÅÕ»j+ÅKÔ¯ò]e‹;I²¯FŠÛ‡l1Q¶]ö<µ½,‘"o/~qÝAŒâ¦+øiÒuøµûyà3‘ ¿ÅþA”O»]{G½óûÂUw·kyglWû#ïAÒ®ÙW¡n›7OÎy™r_ºÓƒ‘¨Õã'ý<Ñr_Wg ݸô AØzå¶?£ïô÷Tî¼ÓKÝ=ؾö;mz†ü{oµ³<†HÖõ[m°gõ{Ë7ðI@Ûpx5øNQž¸Y[Ŷ,Ãÿ\\ïó»Oè[}¢o `¶Ñe÷aÀÞ yã¡<†ÓCW+=üñ±´Å$ç!öi ¿ïUÏD>ªÐÿªî4ª_¿í¾½ü?î¸/· endstream endobj 3511 0 obj 5500 endobj 3515 0 obj [169 /XYZ 38.2500000 639.500000 0] endobj 3516 0 obj [169 /XYZ 38.2500000 639.500000 0] endobj 3514 0 obj << /Type /Page /Parent 2 0 R /Contents 3517 0 R /Resources 3519 0 R /Annots 3520 0 R /MediaBox [0 0 595 842] >> endobj 3519 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 3520 0 obj [ ] endobj 3517 0 obj << /Length 3518 0 R /Filter /FlateDecode >> stream xœí]KÜ6¾÷¯ÐyË|ˆ ,ØcO€=,0ð{rX8/IÙöïGÝb·ÆÝúø¨¦ÊÒL{`ÏxØ"«Š_«ŠTñí·ŸþÛüüWóöîÓŸÍçðýîÓN´½ãŸfÿõæù/”kÃÏMïLóù÷ÝSó´{Ø= ÿ>íÆ>Ýý{øéÿjþ5üýµùîûá—?„í?ðû®—ýðý·ÃwßËá'qú¾ÿý/»ÿü£ùcßãq¸@Ì—ÿ#m'¼ß“‘úiwdS¾þúüÇîí(€²Q´rÒ»Fvºk¤ïTó¿w? LÝ‹Ö+i¬³jà±uBÿ¥Ù«aÌ^*ÛHåÅ0p§ÏÇ{¨ÔýÎÝžû¥:)¯/©­Œw¿ÌL;ëT–—Ý“1õ_½s-Œ7ËÁè@y}±„™žéþ¡¤LKÔ4=E|ÿ¸{{/;9ˆÓ6?íwóðíq |hy3P®¤nhþ)„Qß4¿î|k•9Ò8¶Ü¢aËGØrGxæÃ¡åãã ×ÅD¢´? &Hö„–µøŒ€ÏàIQïʧKÚr 0Õ˜ÓˆDÝW—(/˜—5–›ðåü`„(Ü6ðq€1êÌÃÉbj›´˜$& è5~ƒŒ z^+{c?ïË­f‹žÔÔ; ?Û{‹ðC°7Ȧ5ßxf͘t¥aÒï“°(kJDîË‘…5²® Ìe”5ý ½ŽÕ“â1iþß%£$ŠÉêApä™wœšVÛ¿9Ân!X ’A±X:XS(šíÈj€¹^Í×Â$5_Ý3j×DPdÄÚE™#ŒSìì`ïj$É£¦c› ?Ê%ñcÞsâçDÐ6ñc¶qËø12ʼnŸAÅO݈~õøé»4~8ó>AÅŽ£^$~|ŸÆáÄω âǼ*üt*mx5AGüLm?Gf/?]zZINüœÚ&~!«¸eüØônäÌŽMm?fl^&~\Æžgþg"h›øÑ¯+ÿcdzç ã´?AÛÄO÷ºìÑéü³àHˆŸð£·„šEðSô åŒUr_— Á&Êë8±m¶ç£k¤Ÿ•¡=ˆÐž¶§‚£(EkFr&0;Ô”Ó´ÊŽMS‹-FÞÃgúvtÇ"+-”y5ç¦/’-âX{Dã lˆM»¯8×·È_(+nÁ‚1ÂFŠ€¤#+\ÇoËa($CÚ.¬®ë‚Í+ÁSY~Õô½?[5»Z-̶tØ¢j‚~àq(3r±ºl-‰X,ì~äÛçNW0ÿ[ˆG.?Š3£;"õq6®2}‘%Šà^…×îªN"«eð8Ø«á[\€‹ÙÔòû]µÃy©TšUéy§¸¬‹/RÖ1Pâ%ãe¶TqÜKj‚NE²wX/êfâ(½aùaª ë襡˜B‚ªn°Þ)èv8 „IºAÉ,Pr€”;X” ÃÎ3”)oMÐñ5nN@`”db ¼‹ü°ð ÷zÁ•Ðhu¾Âù¾ÌÀa¥.ˆ‘y›…î%Û”ÌØ–Ö’àMÎ%K©S5mhgo^áB–ºe“tlaaåškS”$®óüÕb°µ ·Ü3o»{3šn<¬ñy$\ ¿ß[Šœtõp%…Ô1ǹ|&Ÿ¼‚üDÞ°Áõ›ð©Âªµg"Tcàs€ø]jÌ)>c†) ð™m|ÓÆñŠ”£ ö:ýÎmÝÒ’”£‡‘qp©?ŽÓ˜'1šŒÒ¤uÅH¨È©`‚q {S© qL¢ï3ê õRc‘ðc"ñéB ¤ÚvLõ W[0î(`'ERÀ‘²‚”cÙXÀYNŒ«ŒW̰INY&&&ºô)ÿˆöcÅÁ¼ð‹d”PÌ8¦¿>Àéˆ8›.ÞÀ5)/SÀ.ýv1IÀ”—z°€S+èÕœÆÃçYÃb¤ÔøKÕdb\¥#…ºå„qqø¹¶úœòL¦\c›¢)¬¨·éèâëOJ$H«övRް\:îˆ0A_bXØóûéì­ÃÊx!ÓüL¼’¬ƒ:CÜŒèQX&íÛ_q}Fu‚…®› !å³ J°²%±Í4)>íS&Ep”)=2!eÚ³¾‚‰2cM@ ëŒKö’)ÙHR~%ø1iµ®H"pl³ðURx•¢XMlÍó^ö¾pÝI©ZÓƒ’˜ŒŒ“ÊÏ1MŠÏðàëN Ó¥ o'oW‡”ȈU¸¦‹ ]Zp +£zeaa‹N¹eÃ8í2â.ѧ&‘äÔ2­+œL øÁF£Ëˆ‰ªŠ>²ø¼.§O‹ŒHŽ úHÒ‹çRÁÀžº&öŠ „ËDp&½t—•m7ßß&Ngó´Ž×.íõGîÊ#e~)GyWŸöà#É©ðˆ€)ñqÕû¢I§T`oŠpb5cÞÉŒjª\™¤[Æk­ËˆHn»Ä£°z‘‘âVü ~M†ôÚaª“UF<°öíñ¾ËðÓéL”ùÜkßDèmÚç&y¼)ecb¯Ï8å´{EÈ¢¬R+‰ÙzŸq2аâDÔ>ys‘7Q7‹Â3‘NføÜUqœÒ-úfNgxðÛu=Éðà)ìQÞðõ¼ë3|{L*Áj²&HœÏðÆ 7k²*ϸ±¹îõ ¤Û:^ßõ:Ãç^¿°ŠT*’”«{²e'½¼IG ¤)&xS¤×àô³¼ÍÈÎ×#%­\õžiÉq1ùIÀ.#;ÿ2|3_z÷ªø¦*,’%EÊÆáÛ\Ĩ®‰|H±;åø&_¾Qï‹¡oG$7™H›•¥‚“¹¾þÀ„ˈ½Lpmh3ú ZH‘ã­_Xeã¤êÖ`eš•K®xRžŸ[¾š§A*Q¡=¤>q‹›“¨–ºÒ 6§ƒ!Ï5woÆhŸû™Ë#ÆIµêp±ñ%0ìe‹þž±f”дvŒÌ]²ð£S·UÌÑv8í S‹…½…Kw&’$VÖ/  ÁwÙâ›'fظ7øL(§/‹Xfx©€Ûÿ> endobj 3538 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 3539 0 obj [ ] endobj 3536 0 obj << /Length 3537 0 R /Filter /FlateDecode >> stream xœí]Ko举ûWè`4âC/ °žG€ f€‚‚Ùl‚Ev‘Éò÷ÓmQm›ÒG‰ŸŠ”º§Çصݴ¨bU±XU¬ÇÛ?~þ{ñÏߊ·ï>ÿ§øê¾¿ûüP•m] ÿŠó×›—è®t?mW_yøV|{øôðéôÿoßßýùôÓÿ ]üéôßÏÅ_ÿvúðG÷Gç?øå¡Uíéû¿Ÿ¾÷­:ýT]¾Ÿ?ÿ×Ã_~Wüzžq|æõïoTSWmucáÕ߯eª§¯ß¾þúðv@@Ü[Œ©”­ e-Touñß<ützÁóôUÙkU7]£Ok,»Ê ¿²¯luat×tºPº?½¸WÖç0ƒÐüâ“›ªîëT“;ÈåÑ¢L£¦/»Æýƒ?“/ïÎXkOü£¬êŠ 8Ì*Õ6¶­¶0ó@œÞ4q´îÐþ2}ÆRª1é¸ö rq¬ |š]¸ê$y÷yúĵ6H OEÜÀìie†²}“Afœu¤1&qž§O0y›ð¤ ÇÊÈVxöò¬mغê;øó¦uõÆ!­m`í2{’èªjÓÑû ri¤Œäö'ÿ3 †døhÊß>~yxûñ$]N¨lŠ/?Uݧw>}ûr‚û$õÞœõãÚ_~,~_UµþCñå燾lt=Â8ŒTïЈjà3áÈ8!¼§#Þƒaó=>|ør¢lz¢´& Qàl†Gc&”ôzJœõ¸@ñ¹g0² gé2"K+µŒ,¸Ì?ºGp…ŸYBp&d™j²*¿¼E>Í´pÛç^8–LK›M–™ãΦáléü.'ñ›nñME Øä\^×œ‡©5+ì58¢á!Ç(Vª%žÉéB³õ²}ƒ%-¥¹D¶Ë–µpæPÈé!<_§--œrsæ4ËkµlCàE,úâN6Â: œRØ5йqIÊd"ŠYaÅ`±‡ŒÕ ì€Àb{±R]u9½5u½lùh A}Ox^®×¹_·Ë¶JYĵQàŽ„°!ûá½»Bõs8ÔÍ 3¢P ”SUYà<£°C#Õ •êR7Ã/¤žéÑ3zàD¥Êº7m=Eá̈ß–¦¯^ϦO~S5PäY )øžjü¼õx„ZiøŒ4p¤—bÊll[ LÙ^Ð>{í„ðŽYtiŸð4Ù×vxñ̇M«ºÓ ¿´™<›ÁÏ<3¥mVŽ ÀÏJ mç%íANyR”ƾæÏQJLGÜŽoÊf"Y,|¦GÏ(÷Œ-'ü9 t£;õz¿=¢gF)13[ GÛHªézFòNGFÉ2†Ž8YЖ}çC` F+4›®2íøöâðu„WuYyÐ)Ô]ÙMÄ©†#-ûÚé¢õ”¢âÞƒG3ã¶^óŒc½¸õ((Y ®n=7Û#!wßAyˆq`ál˜0æï|]cÅê²Sú¯!Ðɱ¨e8|]3¶ F$Æ›³AR ÆŒ¾´¥ÓÚ¦m<‰¥±ö€ í•€ÛréÖ.©'Šö“)ûSÖ@FÀ GHˆÀ"¶°; ;ú„¨««Þg2(ô0àxGöªìQJñ€,%~‡–óCÐÁí€qMÀÆðA@ÎãMŒù¯*uîJ«[³DzO„ƒõ øbF@cþ, u”¶‡§ŸsÙ£÷§AK¨eŒú÷Â¥å¡ÚŒú„ñÙËÒŸŸê˜w€æRÑexo/ Ǭ8›u‡™Û匎ˆ•#Œb›°¤¦Ô_#¸ëÖ–íð=°íë\ÁQx 8×—ð–Á#Ø™ëÞ'e0çµ¹RžâµõX!p±‚÷æR'ö|À©*k §uBRÀbòFh+ŒNÂÈ_¼ LAÑó¿ÇÝC¯²"ñ2ÖãÜZˆÙ\§!6F°ÿä€ ÞiøÜaœ#Ì&a¶Üdé°Ƙºx9Pã¶8É7ÔeQãÂ#`g'<=›~rzŠJ¼ql-ÊвæùþiQ*Äì-_208g(({Ai¢|7Á9åÍ¥41Ãû›Úi=¹¬eFrØÆ¬Úà@d82F”ˆ^ÊÆ»LSª—p@ˆ(h×$ûilXf4klÈMXaò„DÖç³ÁpLï6ëª1ž›’J„®%‹BY>9`ç1ZŘ š[„µrÀƒÝýb ðQ²¤¬$”*F_¬i­ú\þó˜M&Ê”‡¾Y/_R›¦øºÑ‡ñ€>1L/áv²ãð‘È„µˆ`¤D`6À»ŒÕÌhë·„°>ÇÜyElèã{žš]í+ãy"ªââ+%˜òÈ7˜Œ“§ÆáÂľè=Ì)vëZ@¶;€ H˜‹ñÑ΄0ɦ»ð†Þ‰ “Ý58‰åÞ4º÷ϦEÄwɇ·e🙱f1 #ð³ûù˜K!¾þ#N´—ûnI²‰08±'l„³Š¹Ë‘Mž¾±¼®CGQßS¤eEÖZ{GÒ‘г$_×­Jß“¯Aô—m=L1æðŠqÈF¬w÷NÅáäƒGÙÄ.Â)¹„].âf–UÆD±%㒼ХÅ+­„B¥w^œHÌ™:¹ì!œ,Â^Ò{ÙürŒ93ÉîùŽý§ˆÒ¸çgí–Ÿ%Y 0X2´kýb€2%CÇb€1Ï`%6/Æþ¤ äÀs;Ÿ£^üb¢5…4q)O'‰T3²ÂŠõèKA™ìK¼90…N!nKÍ­ã­‚#°*³ü .¨Š©-V6mLãê!?ïL†"˜÷´&(‚ËÈb¦ bú;ƒ^åöƈk<沎QE«L”D‘ \FÓd|²×VLÉ kÊj¥Rãr™-Œ¾OÜbíïñ¡öE q—%,`‰í&"ØYÖŽYÅI/-jÿL¼Û„ÙlÂÝ]8‰µ€ X4h‚ÒPD‹IÄ­Ì G¦åWvËðÕ·í)¸UmÈnƦzLëª@×0ÜF·ï‚±_øÂgLŽv{#»n<â¸gî^g»‘«S'&Þ°:<‚W˜ wÃ]š`ƒ¬Àe=†€è&F5ŒËIaÝd¦°ãù<«³õÚ5<Á3¾PM^¨ÖA:}p Ò¡lÏKHqè nKHð߆F¦BûÖ)#s#¸‡š™RkÊÉùª±öF 'Ño.@G¢q |Ê%ý lÊklFÉñ\„¡p> D©Kd?©Ø5â HµÚ)–‹Lãî@¸à’”̓+ëQhŽv™ô)Õ‡Ó†Âq–òäl]SzAÀŸ€‘/áÍVìã»suœ:xoܱ¯Ê͘Ñí^#üî÷a°Ø¬öŒø¶JÙ©ºéÝÚbbµ¼[=œl¥Ýùbw»óðv§î¶xkŽîm4ÕjoÍÝÛx•ÞF£·øMŽîm4v“Ïàî:¼WÈ4›|-õÓmñµäô ÙjËÎÿ¾¼BVõ¯)”Ô+Ôgq=W3y¦óTÇ™n÷cbÀtÄ;3ýéuŸéÑ3.WµSCí#šÍ@¨ñ3Ž©æ pɶœxÆ4 ¼g4¦nˆ§¢ÎTÇðmÙw>àz° Æ¡V(ºdn¥ A€×€-S¸ªÍxP.QïßòI ¨‡qÁä°¦-…È„$b}©¢»óƒ,('°Dqâ@ ?“ ,¢†y•pbÊÖ%JLù+×VcÔvwî\y 58L“õ’[8¹…‘Ï™2wUÝê×t—ÊÜmâŸa2w«‹‚>$îNÀi Ù†c%û™˜ÿ‰3wqÎh ç;ÂLä@ö$ÎZíá3¢Yš\LœY±ó€TÀ+…¤˜ÚÙŒ‡Fy,§í\®4 Xª àneGµŽÈéi½%' h*[†  Õd÷Ú’F[Ù’lzMšöÛ‘TÅO>/e6hUûçãljËotd)’¸—•¨•ǤMS >qâ¶l³Ž }‘íÍ>¦ܤð»)B9-˜]ÉtÛdâ¯%B=…u^«M{)¬ÎHx}Þ~ßUUÕ´¾B”OÌUìøö«'¤5ke+þÄ(<™ÚS1õŘ£oz¿E4ü“m¥@ Ñ™kƒÞ–Áh®SÿKqS—´Ó{ë£ûªoÐPþ›¼Ìí^Dm~Q¦°xÊ$³czèŠ^_NÎIÊ纡3ê1Ôq·ÈáWM©‡(¶g˜Ræ„ÁÁ ZdéÂ^4&Ýò°m±R:TÅ«û·mfWÑÞ•”Ô(ÅyVË¡m2T¿ûÈ£|ä²åDÐŘ·nÛ÷ŽS?RŠê[BtA™j…¤ ¦^Uwþ¹‰û36Wm9^¥ò³DBs)þĤL×0U1Pî'eÂduœ’Æ\IòÇï $/Ã2x=C€“üpr.¾ Ù?µ–3P›)é€Iáþ $5gL¨lWO«1áN”IÁ‹ŸÁ…ðÝS ‚IA-zÀ`‡JçeÖäî3|€÷&œ- Ó`)GŸ<ûlEé¿À>ƒëÆò2 ûð‰Šg#Ê)Bö™œ4±ËkÐcó"œ-@Güž[<ê~q 9Š,\YvêRÇ%—»ŽqÜlè4œ+`ýîèHÕàúJȯڳ€ý…7ŸÕ)\W•ÙiLc.§pt¼WÊ[5eüSìÀ$bºízL×?|ªˆÔÅH¯ øwqœL®.ƒëÏ^JZÝïÁ„.3uM“-¡±ßîÌU—\¤~<Ñé“Ù I6p³°wuEžÏÂi`£[-›^»Wº•$ûw,¸µTN&‚³ c{B7p¬ïKP]3åŒdÞ|eæR˜Ù÷D,=åŒ!¸”1-öðÂ=e(‰5øðý0t Û“ §õjk¥=ìÕøò_n×kvÉW}'B×åx=«|]ˆ{,Í–pߘ¦ñ÷Í^5nd•ã·lòõÖ½Èá}.Ș¼î$–H¶z|]{ñ7î_ï=|†©Ç‡+´ {{®ªÛ{4‚+´j·Ázo¸N^ îQÃÏ]ºDÕ¯»ÑÚ‡ ·’©:o/åÕgx×4ÄõaEÁ>˜j‡L]G\!ñ^sr\Ozƒ®W›J¿ïžß$ûž€ÞEXÚßiapM¹xNaj[5 ™Ë»Àu[.‡¨Hº3aœPŽ0ÑRïL÷PY €ÉQJ}¼”.”´|ã@TaÑ!IêfŹ·6Å#ÌÅĽçÇ‚)¨k(Ñ"6rž„åHá¾ÙÒ,Sã¨j"s g⺡K•í0Õí¢Ö#œ?$êV–mÐ)Ì£8’h•ÈzÂô!dšh2ë90Çò»®’ãqNXàú·TÆ4]ÊÕŠÛY»KòÀH¦L[æ=8;—É ðæøy»y´’nKƒç»Vr­„Èùc²sç.qº Íê¼k%7¨•Ü9þ®ýܵŸ»ö³!ºCWö@ÑDÄc#©þ{øÞùEŒÀ髸vÂ|0Ÿ–þ`…?½›%P¦¬Ôò§F÷ÃZ•Ãj¼Þθ zëR¡¶l¦#æ½{fÒÜ\àò3ï1K7Bs°}t+E‘¸øÆÓ>ƒTA`G˜vo×púŽX´ …gƒÏ8¯¯ŠZú‹xq–áÎ?Ÿ !Çwݰ†4fñYÀŒø>ŸJçöļ`0—tx=Ç„î_¥Ä0l÷e‘–mÚÊ”NälæŸw”‹rõSñéáÿ‚ñK¦ endstream endobj 3537 0 obj 4487 endobj 3541 0 obj [171 /XYZ 32.2500000 611.750000 0] endobj 3542 0 obj [171 /XYZ 31.5000000 613.250000 0] endobj 3543 0 obj [171 /XYZ 31.5000000 376.250000 0] endobj 3544 0 obj [171 /XYZ 32.2500000 120.500000 0] endobj 3545 0 obj [171 /XYZ 31.5000000 204.500000 0] endobj 3546 0 obj [171 /XYZ 31.5000000 376.250000 0] endobj 3547 0 obj [171 /XYZ 31.5000000 122 0] endobj 3548 0 obj [171 /XYZ 32.2500000 203 0] endobj 3549 0 obj << /Type /Annot /Subtype /Link /Rect [60 340.250000 91.5000000 347 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn2 >> endobj 3550 0 obj << /Type /Annot /Subtype /Link /Rect [60 333.500000 141.750000 340.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_suppression >> endobj 3551 0 obj << /Type /Annot /Subtype /Link /Rect [60 326 123.750000 332.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn4 >> endobj 3552 0 obj << /Type /Annot /Subtype /Link /Rect [60 319.250000 132 326 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn5 >> endobj 3553 0 obj << /Type /Annot /Subtype /Link /Rect [60 311.750000 108 318.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_symbolic_symbols >> endobj 3554 0 obj << /Type /Annot /Subtype /Link /Rect [60 305 94.5000000 311.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn6 >> endobj 3555 0 obj << /Type /Annot /Subtype /Link /Rect [60 297.500000 110.250000 304.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn7 >> endobj 3556 0 obj << /Type /Annot /Subtype /Link /Rect [60 290.750000 120.750000 297.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn8 >> endobj 3557 0 obj << /Type /Annot /Subtype /Link /Rect [60 283.250000 131.250000 290 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn9 >> endobj 3558 0 obj << /Type /Annot /Subtype /Link /Rect [87 276.500000 168.750000 283.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn10 >> endobj 3559 0 obj << /Type /Annot /Subtype /Link /Rect [87 269 150 275.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn11 >> endobj 3560 0 obj << /Type /Annot /Subtype /Link /Rect [87 262.250000 150.750000 269 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn12 >> endobj 3561 0 obj << /Type /Annot /Subtype /Link /Rect [87 254.750000 169.500000 261.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn13 >> endobj 3562 0 obj << /Type /Annot /Subtype /Link /Rect [87 248 158.250000 254.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn14 >> endobj 3563 0 obj << /Type /Annot /Subtype /Link /Rect [87 240.500000 167.250000 247.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_doxygen >> endobj 3564 0 obj << /Type /Annot /Subtype /Link /Rect [87 233.750000 183 240.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn15 >> endobj 3565 0 obj << /Type /Annot /Subtype /Link /Rect [87 226.250000 147.750000 233 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn16 >> endobj 3566 0 obj << /Type /Annot /Subtype /Link /Rect [60 219.500000 78.7500000 226.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn17 >> endobj 3540 0 obj << /Type /Page /Parent 2 0 R /Contents 3567 0 R /Resources 3569 0 R /Annots 3570 0 R /MediaBox [0 0 595 842] >> endobj 3569 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 3570 0 obj [ 3549 0 R 3550 0 R 3551 0 R 3552 0 R 3553 0 R 3554 0 R 3555 0 R 3556 0 R 3557 0 R 3558 0 R 3559 0 R 3560 0 R 3561 0 R 3562 0 R 3563 0 R 3564 0 R 3565 0 R 3566 0 R ] endobj 3567 0 obj << /Length 3568 0 R /Filter /FlateDecode >> stream xœí]K¯Ü8vÞß_Që¦Z|‰0`ûÞ ‹† ddx2i ¦éÌ"?zÖ-‘ü(ñÔ!¥*W3v‰ŸçÍóøåŸ¿ýçé¿ÿqúåË·ÿ9ý˜þþòí¥:[Sÿú?¼~ ›óôï“mÌéÇo/¿Ÿ~ùúòµûÿß_ƾ}ù×î_ÿw’§éþ÷×Ó¿ÿG÷ðÏÓKý ¿½Xa»¿ÿ6üÝZÑý«ºüÝ?ÿõåßþpú{ßã<Ü4™åï?Šº®´è§±2ôï/ó2Åðç?þþò˸i£(%«Fž„Vú$Z-Oÿû_/阻¯ÎM-­6UÛÀ·²]Øn`ÙV'c½±‡?<½‹ KUåë|˜9÷¦U‹hç¹O[U"ãi_zÏq ª›r¾Îû™ç:mØywªÓðßÄ¡›~\cMGXDs P•V akm«[È׸w¶£ZãÁ(•áh>ºÏÐy““> 3gß•ªpïçF+¡¬4º?èþMÓñ˜Žïªé¿ÛÖÕÊzÚ4ãCÖíÛöÑ=窲©È0sö]™÷Þ})Úº²†ÿ¾Ž(¡[HG ìŸVî‘Mµ×Èýš‹nµÐÒFþšÒušc·½œ-¯ålyÒ'_Ö¾ †ÍíEFØÜ›ðSKè{‡í«>¶ONÛ'ªqjât=Ñ^3úv/gV‹|gæô}¤3«Åõ™õ¿îèÌràYŽq`í¸dÙW;Oò> ЮŸÇ&ž7žÚü«ìÁåUÿT]cõ/¯™¡Ó=&C€­3Èð—Þs(¶Í¨} 3çÞ”I?Àg†³¦Ù ÎÚ:'œ]zÏ ºRál˜y.8s;§to&´3`q±»Ïß_~yï4—úôý/ÝÄÆ‡¿¾ÿö¢»½½µ§ï>ý©›Ïû?¾ÿõEˆ³ÑucÍðÞØR-͹i«Zšê£E|[.”pøm%a‹…-_†}Öj¼*ùhѰÓ8“tâ½ g"[¸[p&â³Û=ž4XU„­f=„Èuz ž[ä €`%ô†Ÿr¦ÕÛÐbÎJ6bëî`t…"FøV3îo9ÓÈÜðzFú ªsmÅ’ÈŒû&̹jÕbÕ'ØÛˆ6BÎMû õ 7ÅíŸFeÐiPf/^á7˜–ŒØßžmm–½‘à›ÅÓÜÞ¾wl44ªuX Ö XÃ-¤Ç¬ž°MÍÓ¾WPðÒ"Ù¤Cåq˜ÁÞ`Ë´%¡–¶d'Z6®ÜŽÑ…VeEžœ;Õ*¦Z$|xzLD’…4U¨té*n),ýt"MJ·O Óp¼âˆæH‘Ôv®…I7ØWÓ_s£ãdoèÝ2¦!MúVÊww[x¥/H½ £ˆ<Ìô©~%ÉŽ.FEÀÀ¾ª§Ël;8Œ´\J¯" <\`SV´J±è]NÒ®—¶?%­‘´"{á‰(ØîˆO¶DØ(Öb¡¥ ㋬‚ ËXA‘#Ù~vã2¬ôSŽ-¡;.ÖDØõö³åÅfM`ñ˜ð2Jóy­P­n>V%d7zC-z¥Y”°åª…3éãàÞð¬'œ Í@¦Ï ‚¶3Ü[d°7 ­„Þѵõd”¡„0Â>ŠŠ¹¦æÅ !¬z¢P +ø 6YC0ÅëÁFslÌ> âç…ÙÙ0eÔÕ¦q–Æ{¼ê8‘“^JïØ é‹èJ»ßƒD V+Åpí{%áW±6šàMÁ&ØâYhyMs¾ÅÚ v–bUÕº˜±? &Hp¸7µ;cÂLï(>…ˆ°:¼ˆ;P؈´äØÑœN=µp¡ÿy?ܩڣ$'@‚K ‰%üˆSÌ©jî™r°¥;;aôº^zo=·_zõž%ÂÜ#]¤…ä»CQ˜T„E¼³²³7sÿ)ÌM•2a>™wPå<(i¡(Úš¢hSœ@0“=Þå¬~+@Uíˆ ²²K°LÒJž„øa qÒî(¬³am› OF´m ÌFp×þãiXiaG1–DlxwžVŠØƒ¬år CÆÖ8™ûò0Ä~pS"– l¼Ær‰;YŠQ9âoÃë*Ì"ñ±B ¹ósÈÂëÁ—NŸ-ÏŽC±ÈÚüÜþ”ý»'gå¦áq(v©ðÓ‚/¬ËyC÷·3 ZÌÞx¼ü†2R¶‡í •r‚/N æà¥SÄÞÜ%”Ý!Ü5Üà6Ïa™±}h`™ñ$e±©[¤œIÄû¹úxµMŸÉ¤fZ¤½Áqüuµ¹©sã«.9ij¼PÕX†ªÜÃwXŒß làp' ÔŠÖÙе<ÊÈÆ~F XĽmfIù7 ±=ÊÝž5Ë;%Aélwçø¼ 2)¡ŬyKH"Íve—’åd,à°­”ˆ ÀŽºSHÀ¹/…ø¼šünÌÃæ>£Y¦kÄM–Ô…ø 1k,ZätLÙ΃å z¬F‡ˆNÎAny#`#v퀟ÂÙ–Q’I±aål<œ¢x=»ÆÓ!ª¬ÚÆ%ËOÏg&Z)½D§çÎÓs'ywîÓs'â…ƒ}`°—Å~3oŸHÌ Æ9ˆ?”p] ìDv·`,Á+ÅsÃß`/ŒY8”8Çzò«0ªig´PH %…ƒb¹_ª°ÊvÇÉæÅ6¥Ü$ Yò)f§ýs‘•ÀŠùVðúô$èf9ÑÈæà9n céždDÝNc §#í!“Ò.i‹ ·ŒÑ㣸’¼É(¶ ‚¢ím7É'Æ‹ý£¸él·øD¼4y«sP’ íU ¦”q(Îh w–5ñnÄö„{£X w÷ ÷˜%®+eð~)á“…,Pbð²Î&ˆ÷ÛÃÚ)?B8Œ|²„²Gïy]Y™ÆÕ$Ÿ¼cÞá‘…S ¿£ü~‡ÒÞgD¾0Of¢T g@‰Þˆ¨9ÛS7QPdàJg~»‘®´s$A+ÿ8[ Å÷ˆ÷’«<¬F÷‰×à-ìD05òÚ;nðNˈ©²¶ª>ˆHAïK EƒÇðDO¾^€Vë9{s•ÂÂ@]OÛ_Ýâà{WQxâJb¿{YŠSNƒÀ†#¹c4Ü‹‰/t‚Ì€ˆ}ì ü&oDÀ~܆7úø˜•pZë°¨»¢ÏR!é…‡ S<ƒYM·)×s”˜$Já Ž˜ƒ„Ü þíU‚°Qˆ—P’}’¸)L¯@©>¶?x³p3ŠR¾j6ÇS+e¤aNy#5~V#|¥]>J!=V,œžbàbÉjÂ’)ƒÕIEL "3Š%tÁDà*AqúgöÉQF-sÍ"ÙH×®”üH]«å®¦¹ãÐBñ‚HÂ@èB¬¡3;ošÃHxìTïáVÓjæ…1©”dûGLPòbRJxEÀT²¥Ác“ÃÇYQ}±{¬™3(ì‰RrèйÝöWâ)QØ,•Þyc­ïɀǣ×PÜ›J‘ƒŸ 0­¬Cºï¢\ ¯Sǃօ Ýà²GÛ“*^ó%)‚%à"Á¦Ã‘ÆâAés~+èOН¬W/²ζ®é#’’^3 pw‹_ ,”g÷Dy>·'ˆ ¼Wƒ«ºwºF­Ÿv ÆÊ6>è?_7Ã_s‹÷Öx7ºË’k»@¡|ß‹™„c "u¤©ü†¼c9{óõèæ&ä}c±¾”r¨,uwWÊÐIa8„¬) EYEOf"‡âÎ[þQ,…ËàÍ»Œˆ=%Á/1Á<ÄLQ̺Í{”ËdKHÎêB¹Œ•ÕÔQÊ(A tRLÙ£˜¢^ Ãþ4v{ЧT ‚´/2B ¶Eb›ŽâU´§%’µF/ìã<»‹”ºŒn‡HI¯p0 %Dodñ($ ”‚=§û™vx“t˜@<û; +`ðR—Ú-a#™2ß™|Ã:Âk}Ä>,eAàræ®7ÊARéJB•,RÖHÝ"å du;²ÒÊ{½š±žërwöŸ;¾¥Tæp–‚›˜rZÞ¿Ä£DØdvË㌾3G[7CM [ÂD*s ™BÞ‰ 6$Þ¼ÌeWÆÌ”kÕ„bÊ” O,ñÎ)Œ÷¯LÑ6<Ñž9Ý«×/I”½+nFPˆ#¡Û/9y.‰YõæpõüFà9Ãñmê'Å¡ƒ²½¤[šRŽ#ÅÌfº]ßvÊ-?>†B‘=#qX{Qb÷ã¸ý+¥sóæ¹+$ÍZªvÿÈ#K4……ÆœÙr¬KR#^^”ý’De™Âó¤©ñR¸;™â¹a^ˆoÏ2›&xªèàØ~JÐ^¯v¡þ8k?ýíîÁß.gêÙlæ’¼•¯Žl‚<2¡Èaø|H×§…rQ=l(kXÉ 1¹»ÃúOľžwɬ¸—Õ¸Új‡qÞµðQÀ´Y7dïôäÀ±·¼õLc.⇒‹#æaÿŒÇ¤JÆ»‰ó^1S´kÖÔ` GNy%RR^F¬,Û=¬)ôgÕÜ—“«LÉ)®Ø E5cq´`é„âðC‘8(À¿XX"œS.ò)©¸JÕéæÍ!O¸‡?ôM¯‘üåòÆ\æNG±¬%„µ°lA©Úr„Û„ˆJ„÷œ7YvVØZã°Â;UMJ”Ž˵WV×HÀëˆÄœ«V-ÇÁ¹¬&1VÎM7 Å”`ÜrvÆ®O“ro¸=fﲿ‡b\xö¹ƒJY ±e"S‹Åk?t1§7‘´.¶o—¿"€VJ$<òeë}ÞÕܳµÿqÄ%Jxé-a³÷¤/Ý‹§’Ö±Ý €Ùª¶û}Ë®îEs„ ÛÜÿ¢Tí})k\Αëj¦¤Q`ÉbÂâÓ³}9òýxŒèÑq„»”q¶{ÄqÖ7ˆÚ?¬”Ëy E“à嫪Q·Û¡/Ô‚ö6e”ÍŽ3™,Bãà pœÈJñî|æì Ÿ^g2†$R8k!dº+µàå= !dÄûú,Çìp› Ãvr©Óy0v›¨(´¨PzñÃv/p{&³ÀM‹ZŒB-—ÓòZ4l©liaK“>ÞÞÜ ^’Æ‘xn_Ò×£ð à7Îm¢(i»ó®¶àDvGN›0¼Rñ3µ”ÁôV¯®Áà]„˜>‰•i‹¿yMßy‰¡Ó åø´ðÜ žEf@Ø\B*DZ†r¼o8À¸ {‹Ð´÷•ó)‚g}óð ®ÓËíÃ÷O+Bå ´O•<%o9¼#ao‘sÄã< ?jŒX]–<'i5¿ÊÝ ôË#}•«Muó lÁʯÿ†ö:²R“~>x¥  3ÀŠ5îMQ¼×«Ö?lŽƒgÀæ%´N\ZsÉíDPkqËS­}ªµOµöHbDk›Õ5Lø\f>­Ý:Ÿ¤s0x·ŸªùS5ÿÓS5_ÅMU‰º4n>Õùç¨Lés|šrœ£Y7I—0Ä£”¨.Êöòãˆþ¥xeE|/wÏÚpŸ•d$eÆ£8ퟔw»c2sî/–X÷Ýâ»á8”¬w¼þ`Øù/%rþÎüƒukvF*ÅÎ’ðt÷T6ϸ€MxòŒ x”Ìå)Y*%Qr&¦lJwB2o|’¬PVï¬òên­ò´"h¬ŠžÖ õ9s8Ô­»‚y#Ôvæ{Oò˜B&ðs„К@$v³-PÄq–Z ¼˜³l³.}ôI‰³¢ò°ßÉvõ¼I{JÈwD‘ÏIâ%—0‹E·ùåL!\KÊæàaqTë½q¿ÃÊduq§›ìÙ¶ÁDt–jMéUÕYv`° «õ6y–õ»aœoF–)ZOŽ˜˜à7¶àõ¨qYŸA¸Rh=pß"-pw"³^›ÁEL>àKøðeå©Ó Û-ú·ùw]›¦:Ùá/+D3>•§zxq€òéÉ—º9 Ñʦ—·ìu/Ó¯iŒîýé÷ðÙÉùÚXwŒîÉg&ݳyæc/Ëuüxùõåó{"¼=ÛpN$ÄÚëéj³N(V}B6Љ¡ŒÖp¡}Áf·ÃnÖlŠº¹~ð·—o7B½m–PoÛÔw€é@d÷ăúþ-{ÝËü«YB½µ!¨·µ;F÷ăúîÙZëÊ5ÿôO\´îŸÍ3­®ÐúcŒ=ÑZ‹KyŽû䯄ry”‚ß$7AJlá~&B(s£ˆò EøVj¡Å|µ+íâAO-¢4Aèñ}5K—bÀg¡å„ŒãSÕ=ÊÎO~tUb_ÞRí¢›ùg5áìü@¶J;ÈÆF6Ã0‹É oée7z9̯µ,A„©GÒ .I³(³¼W …Ò‘S°Ž2kRÁ3UbJ†’iµ"-¯„qÖT…üwÍFšÔ#Àÿó½°šˆÒô`3QÒ­C”L"JFºÔb°894¥k":s7ÓOÝ:DI7!¢¤­;Œ¶>QÞÒËnôr˜]‰’™µ¤BÖaReh ¹Ú^Úî&ç ÖÀ·V¿Âj-QÕþ–(Þ’r‘û{Påµ$G †p-q¢”"%d‹X¹0̲ø’²Q,} PŒ‰ ¥^r¤€êÃÔÒ5•qx‰”JÏ—´»”Ü»â}´Ë?RÞŒç„Y“jHðf¯½=>‹‘K‘5ßèžFñ`~°b³û›¡)+¦PGJ o\kDƳ~â}PÑUKhF>*ºývéþbr±ê¬èFr"påòå$à’$ä~áññHð½ H«$Á4÷– ‘à­&È‘È)L8rCP%ÝÊd6f'ÃR£–^ßõÈZ) Úî‘ÆO,·aµ0{óÖÙ¹}«\ðÝ+™a©<ФâÂJ <¬ØÊyÀÌ›žQ½%bˆÚvŽêU8‚ûåc?vìcO‰”ÃQ?˜âè8N$ÒGý°F:¬Rôì<‘è•ÇŒ2+gº#O<{âÙµ¦1ƒ2þ&2Üë'ÝØJ7º?§ß;¥_×^Ø „7!â¢:Y¤½ä484]cPH<çm²Èˆ©ò,uÐǺÚo™bI¤ï(2õÀ×&qÔÚmlhnïÓJ‘ðˆ5ý1¥ NVLKG>YØv‰õÍÀ2î ~3Iî"iéW *Àõÿ®.9yÖƒþƒÀäDz˜|r:²™„ãkJUèhpoøÐ0ôãõPzÃßÀq&C V·B-oˆjD¹A;AÂ^GH'rrxnÍíˆh+užˆøÍy¥n®rª¯§¯/ÿw¼G endstream endobj 3568 0 obj 7882 endobj 3572 0 obj [172 /XYZ 32.2500000 131 0] endobj 3573 0 obj [172 /XYZ 31.5000000 412.250000 0] endobj 3574 0 obj [172 /XYZ 31.5000000 132.500000 0] endobj 3575 0 obj [172 /XYZ 32.2500000 410.750000 0] endobj 3576 0 obj << /Type /Annot /Subtype /Link /Rect [396.750000 643.250000 444.750000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 3571 0 obj << /Type /Page /Parent 2 0 R /Contents 3577 0 R /Resources 3579 0 R /Annots 3580 0 R /MediaBox [0 0 595 842] >> endobj 3579 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 3580 0 obj [ 3576 0 R ] endobj 3577 0 obj << /Length 3578 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€mó)Q@`ý˜90l ‡ ‡`7›`±»ˆ“Cþ~ÔÝRÏ ¥««(©GØ3nލb±Xï*¾ûã—¿ÿùßã»_þ}ü¡ûþáËAj¯®Žç¯ï^~`©ûùXüá×÷ã·ÃçÃçößo‡ë_>ü¹ýéGsüSû÷çã_ÿÖ~øc÷Kç_øõPëºýþËå{Sëö'uû~þü_‡¿üîøÛyÆþu0¯ÿÿ®j¥ÍŒ‰W;ôËÔ—¯ÿþðÛáÝyo±Ö)ãŽÚÙöŸÆ™ãþqø©}A?½:…ÊÔΫ&ÀŸ‰/¯MûvÛT-ü¦iñ_ Þ}ùâ™]óOî”­Ä&¿BÎmÛYS“Ÿ§u]¹ZÝCVzB¸¢§ñÈïg—ØYŒ Ùœ!çFJ·³xrÎ5Öwè±VAÏÓ Ln«Znò äìXé÷Ïι¹Î6WYåPt›^ÿµ<·ÈÙ±Òo.žssëÆuòCQÏ€ÿÛô“7N-\ gÇJ¿¹xöVêþÀŸ‰ï틽ò¶Õít8Wì¼Öêº]¾æß¯çÙˆÁëJN±»BΔŽÐðäÒ»mtÜíÛìÒ®_pò3äR» 'gÞšJpgo³K ß ªñWÈ¥vNι³›_lgo³K ß5‚ìÿ¹ÔÎÂÉ¥9´¯%9ômv‰ ©$Ié¹ÔnÃÉ…õ¾ºi ÞÇÈA‚—” ·Ù%¶½Ñ‚²á¹MÅ“ΙCrýxœ¿%|ÿõðî©%·êøõ§°ë /ß¾þzpíÎn©*¿þxü½R¶ùÃñëÏ­NU­Cí/¿wÑá2bOÞUççå.#îäìÕuÿÀ´ë8: ÷ Ô–±® Ì€tàÒäAv˜„ðôñAK°?·ë ÿôµjBò¨U£_ $Þ“Dš SÀÝ÷aü &AÂB$aÓW† m?Ý}‡€Â3ðq']<›iX¥ …aqƒ% ÆÖGA›ÂLbÇ}âb'­-¥G©ý…¡h£{ötyksºójuáÈ{4¢k4bà3 Bг±—ÿŒÏt< –¼ž2;ìnoýž°†\á÷`,ÂÙ;¬àˆ†#Ž@$ ù'CAºL`î†ÀÀ•:¸RƒG|AŠõÍN±;ÅòPìȈ…PSÞƒŸI¼îv‰8áô2Úõ`öB¼®<ƒË„`Y {˜†† V豿®Ë~„&VÁ). ‚7€×i˜0)Ž«Ýñwþx ÊÇøxmð!ÁnD‚íDqëñ/ž§0—! a.ºeþ (ð¼‘Äcñðî»ÉÄ­Pxí|V”Ø8Ì73ÞÇê2ñ» [qÖÆ§ »– ™7 ÁPc“ ¯Gœ›ÛDxg–é”Ý@ÁŽHÌ7V=ô ¸ÏÍÀNKàãûÙzX"býë+÷n›çüÝ»ýÞmê]ÈÌ€ÚüW$ߦX<‚ñFé2µŠPŸUÕk­o Ò©‘2?I‹ ß0¦ÅR»Šùëz0ý¥+çt·°äija™j1'$HÛɽÏÃè>Â<¢ ÔÁ#”XEZ't8Â9Åï10R™À^ž'Ä:ÆNé8ï²Mn¶Ð\¯³ÅÄkØÕà6¸®C„÷·çkIÄïàiÉñè.Ÿ‹8?ˆ…',/N8x(y¦”œQLª²Ëp¸³öÒñÊ‚>?|Äoö S^„PJÊ„š’#L"¹ŒC†´xO¹b@VÍ©ª˜þzE Åê.ÁiÊçEü ¶±Þ7™þ$¬‡•i¼Ak±G$ƒqªž¯ $õdž‹ìv7ßîÀö@BƒÇ§Ú‰ÐË‚„Ðè&÷¤Þ§’N±,ƒ—XÓƒÂm=Ý:ÝÁÆè¾¢N»“ѳe5Ö· :N"­„bæEçûŠC=ÄáçmêRUlVåõËO~9|Ú…Ë›fë«Û±‚§‘ã¸ÅEû'Æzév抣^ÃlŠ¢¿š<<æ±Âl Š0¢X?8ýoX‰ 2ÌHysÉ)Þ”ä©â]y·¸Ó7V±Éά Ú­H÷ƒwêÖ3±$Xo!?%͞⥥¨Æ—oñ?o¿áG6jV¯é0ÇÈÁÀ²Ô¬ ËËœ’8Båå$ž)•Q?¿º dz««MO{Ôw«É8¹ÉâbqœŒw§¡à”’LætžÆ¦X|š°ëŸ¦MÒ †Ú¾/·^G²L<¥s¸]AŒ˜fš®écÛLA}Ä„aï¾ÃÏïÙ“Œ÷¤Üä.ìI¹3’rËp®ª¾‡úV^vãC_ da¶HI9Q™¾°dÍ:®£d à¶_p¥ÃFHXOP)…²W¬»îÖÉ'ÐÙ ìpI뤪Ì4]½Ýõ­“*è}‡gHÝ:Ù­“Ý:Y“uR«»¨oåÖI}‹Ú—°N&òMê:ªy×þ¤{wUÊÞþqÀ>ÛBök6Ö rZd@ê$KÉߤ'1¯1ׄç’ÙC“ÑyÕwûÝkÉF¢v Ã(m° éi{"ôÛÒ³7-›õž·Cót–ôí„ÊOCºxDaÍ»µ¿t7ѵû¥/i”¦+ Û•ž´}d«#¼>P‡ã¬ø¤c(~«„O`§žEŠbàk©2p>]¦õ$´]8[aí¥Œ3·ú€åý»M}3zxÛìñºŸ8î‘Hø×(+¸{Uo¸Ä|ýì&Ðgå*´Ú:ç‰:Uµ~U¶Šc,0›íÊòµé‡f@°éÂY®ÒIJ¡Ü0ñ>Š“p­½P¡ VéHÌ줷Ò# x%z©&”¶Ë1Þ+͉Ò´ |Ÿ&e„YC¡taöÒ…á„sDêšÑ˜/°T§‡õëhšXJRgÂ'sQ8 ẕý¨™³Ñ‚;xŒKú Ë!чuøŒ©Æ‘„©H²O‹jª…Žð°%Jø™² ǰañž`Œƒþ¬±lÝ%ØűfnËÖjG]Ó׬mÙâd¦ºŽŪç,Ç1á{ðÁ õ ÂŽ8Ê1Ãm<±~ý‘‹HÂñ\R9F$gñêv“W—ót>LîµÇ­ãa##r«Sçƒy±€'øLƒž±W¶D‘v§ØÉÓQôÈü–4öL¡µpB`à^¡‚X±x=×ÓVŸšô,Ô', û¦c¦!×¼s¬¸Ö…ÂC^…[»Iì´æµ÷¶¬ìžCy­“Ô²z>–÷ÞòW)u ,©î”‹h(†¥Û Eû¹aI*¦F̲JÝ ÄÛN™Òb<£ÆB>ºåC,%Y½×¤Ð8–ƃöùXE§\cE‰«Ã÷¸|©6÷„Я<# yŠ¿h þ)(ž¼Šn‘ðŒÛMA}Ô YÞ›_²·”L,à[S¶Š$]‰‚*dPÉÝ—tV)¡Z+!ÖàD]Jé NÔÅM+p29[9^‹kcj“9˜{ (“ ]°Ôë[°ÄÅyøDáôr\Î@IÿÇéòëçLëI”Ãáò 5Ä.¨ ”3pM¸êc‡Òø(QWÊ­›¾“2ÖûY2Ø)iaë¹ü=ß;²¤â,¡ß'íÛCñ£=š¥øX¡Œ-\óÃk`çØlkÉ’”-„ËC\‡*Æc ´¬ÙvËq‰±fe–ʨ㭹Ë,ØeÆnlà’\RQÄ|—¯Yžqæò°V͸³]îÊ‹öö«'ñ3¥ÊkEêQ%Ë‚Žäé£é¹‰Ùp<¤xÆGTm÷@.ì4¾oÊþhH dzanB‡[‡AO†ÀAÏ n…c)mîwÏ`¦´é<ƒVU¯ Œ‹CíåV›(·"•qjHf–°¿?CÈ‘º£î¾ˆd´þ–z€#<˜»âR‰F_˜¿¢\ø‹DÔË|Å †€ÒP¬P‹6Wú zƒ¼ÌtÚ½ÞÄ…¶«öÎËs Æ—ô(ŒPºp®ôöó‰cêŸâBO|€ Z\géÞÙÿcÓ!tÞ›;˜ëŒJ¹¹pÅ1Ö©-Ø=?ê(ÃæÕÃKd¤Zkcæ³ËäÁhÛDx/ðNïuNõåðRÚPj‘dãÝ9Q1ŒPÌæá3 ¡ÁZ“”ãžÀâ˜P•åÔÂé;‰4(LÞXÖbA@( ¥´ƒcQ›(­Ì˜ë.U‘ØÁÇÖÂd FP¤„:††”æ9åéFic¢ElÀå(Ø÷±nÂשgÊö}.뺡d5 Y_&¯m5´ŽyãJa ’j’јvÍ{!tQt¼‡7Ë‹e²¾•[6á”oú¡B$™Œ÷Ú§R–Pªcùž¶"X•~Ô´­‡+ÅPŠ”í)e+O)«ª>¥L井·¨‹•ºÅŠw[HîêBþ¼D•.V:žf«i¥j‡r«Sœ‚˜º8R ¥Ã%‹Ÿ€1-Ϙ$mSG¢h'¬ˆŠ•ÃãÚfÁ&Á-ÅÜÃ,6¨­NÓÌ*ÉX²>ŠUrÜ K)é#IyÙšèÇáò·p½$WЬ„°×¥k `w/˜´Ç'õ!µZÁØÁÇ‚Õ"‰ð]:“ý$}5[mÚ&ÙƒÒ¸ù‚ëíeÌ1ßÈX$ WÀi*¸¢Åù/ÉZà ¯.´–Àå&b«mÆjo©Ü›ÚôA-|?!%iE8 3‘ŽOxOB}£4¯!Ôvðxm÷¬&‡a©?v†g# Ÿä¢£´ç’u‚oRüFw$Ò0gúíÿEïèöªŽ„"s Ö¦9Z5G“ |êH\¤¬I¾@玕Ɖž…³NÑ?Á¹È/ÁõzOÒg»wÜ¿Px)öþâ}KWpR‘ò c–CmÆIQôñÑ^3‘¯±Ð TÇü‡Êk¸/¦¼·ê7h)%£%2ó“ñ5åqbð-ù¹Ùºp~ÒăU±`M°.l¹cß"K5¯3†rS*=RPÀ!í4¢-,h R”{ŽYZ¥ÂûØÛ@)?"> C)I—ç¯ýI5ö5¶7]Hë™tÇV1¾Ž%cœq#®*V[Æ‚$ [Å$AJešsU6G2o@ÒàïŽV¾YUµ(e´ëóè—r¬ßaëÝ'( îæµQ‚¿ã¥mçÛ0ßÀ^ +ôÑz V^c‡ô"Yu¼1:BãÞݲùjebŰ„7(å)Tvp¢Ößä+¯À~¯@¨‡U7óÍ`Þv,ÛK#Ðf`!.Ù®P›>^p׿-åK GãÆC+WD5·W^ÙØ¹ ÎúéFFºT§.Ù`°è±gøŒE#B€G:æ«Ý)Î„Ðø= =cà^OÇ|³pÐ è0„Φû7ŒB¨Ká ãƒFk+Ÿò÷41±“€ZÜ¥Ú:B«›¼BÔˆ3|Õ'6зxSübÍBI7„²øàçûx-Ç„ ŽR@©Õ…Äl ï÷ï•¿¯ÿ£œÛ5ß:,ŸxïB,Y +H*–NWÂqܽÁìàªv½vñI&ªŸ…·Gײ9Å::aÕ$#C‰ÀÍ}Ø©7„þÙxþñ‰ÐEŒÛlàÖxDap¢+NSÂñ xg3Øé]Ñ;©ñnãõ`zÃT…脎À¥èï\â¸?·œù^Zàvþ˜Æõæv—ŽÜB²×ѧÖó`~Ò&ð6˜]>äÀš—“>Íš_BrS ª‘X`ØDÏÀÒÞ0€Æ©Þ¸·Å„Hâ17¡3› BRgLœ¿Äl‚ÄÑáEq¸ÿÔÊž::ó<`_Œz)L¦ÉñóáÿY´ÔÓ endstream endobj 3578 0 obj 4793 endobj 3582 0 obj [173 /XYZ 32.2500000 475.250000 0] endobj 3583 0 obj [173 /XYZ 31.5000000 281 0] endobj 3584 0 obj [173 /XYZ 32.2500000 413 0] endobj 3585 0 obj [173 /XYZ 32.2500000 377.750000 0] endobj 3586 0 obj [173 /XYZ 38.2500000 260 0] endobj 3587 0 obj [173 /XYZ 32.2500000 279.500000 0] endobj 3588 0 obj [173 /XYZ 38.2500000 260 0] endobj 3589 0 obj [173 /XYZ 38.2500000 74 0] endobj 3590 0 obj [173 /XYZ 38.2500000 74 0] endobj 3591 0 obj [173 /XYZ 31.5000000 627.500000 0] endobj 3592 0 obj [173 /XYZ 31.5000000 476 0] endobj 3593 0 obj [173 /XYZ 31.5000000 413.750000 0] endobj 3594 0 obj [173 /XYZ 32.2500000 626 0] endobj 3595 0 obj [173 /XYZ 31.5000000 378.500000 0] endobj 3596 0 obj << /Type /Annot /Subtype /Link /Rect [300.750000 669.500000 345 676.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 3581 0 obj << /Type /Page /Parent 2 0 R /Contents 3597 0 R /Resources 3599 0 R /Annots 3600 0 R /MediaBox [0 0 595 842] >> endobj 3599 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 3600 0 obj [ 3596 0 R ] endobj 3597 0 obj << /Length 3598 0 R /Filter /FlateDecode >> stream xœí]Mä8r½×¯Èó“#~†¦«º ø` Ñ ø°ðÁ˜õz±Ø^¸½ÿ}ç‡RU"ù˜Rd™ªæ v»§T¢È`ðE0^ùë¿|ýÏÝÿc÷ëó×ÿÙý>þùüõ©Û“ëÎÿìŽÿþòþºßßQïv¿ú±ûñôåéËáÿ<_øúüo‡¿ýßNïþõð¿¿îþø‡þiü¥ã/|"E‡?ÿvús uø[7ýyüù_žþý»¿[¼|nìÌü¿Qž†Þ»qåÓ?ž.ÃT§ÿñûߟ~= `ÝWŒqƒ÷;eÝ©ÁêÝÿþ×ÓŸ¸4ßí«yKÝ-"}ø’ï 픺£è;§eZW%LÁÆ=—Š2^e—œYeýY<ƒ+ Ÿ©õÂ×¶+×ø©çÒB¹Ì,l|ß{MÖuCÿ~›È}ùri½Ä„_$N=—Êe¶aã‡Yÿg~º?~×ê:XÕïÊÚ;”´ Së%¦Ý¹‚¶áÔóR¶6.9³¾ógvj½„ð½/E§ž—šYظäÌ’²gvj½„ð‰ ZýSÏKÍ,l¼°èµ…v ì—‡ã4ÝãËÔõ¹1—ô±;É~TÐÃ|‹«è»æ 4®U®ñSÏÅ¥2®®Lë…UÍX¨Ú—5m`!œ" ?2/~úöôëë°S~÷íÏ™œ?xúãÛ÷§Ã¦é—cì W»oÚýÓ¡?ý?ï¾ýõ0–îò}þÁ¾:¯Ý©Ããþª=ýÀî­9‡fÞž¸Ó³wÖ÷4kÄÃæ =Q/§'Ÿ¿d[R,¾;>=}Òœ;3ìÉ»ygô€%÷,5€ƒªu` ‡eŒáué3³éà“ßÐÕÃw>Á'ϰ5ßÁO>3¾Ó—V#òÌå>ö&±,”…‚ÌyÔnot¯–ê›ÄJUŸ–#qf\ðàF`ïoXŒ©ï„]R°¥NO”¹LËMÆßAR* %ÆmKJš5¤×xÉoj~kão¡–D€ß5P÷0hˆ.ÕŒösz€G¶µheFèÑ1Ài9*fÄßÑç'J]Ƴ¤5l€ Ç–öò°gˆeÀáë‡ î£èl°ìž <ž6«¨Šâ)eáD„ÉÖÒYì.wèF šrÛ3È’¬è¯¼=\¸ÇñMuÅ1 XÓ ÖŒ»ãUfÍÂímfò°ÂeáøÚØwÁëwÉ~®àZ“;k!]¾ºϺÖ.=ñÄôÄBhØ7ëàw4ìµeHö:#Q(ŒDq¯³­ak ËàuTÑzÝ1p¤ü4z`†ÒVz ÄP~®`Êí»ÁÜìè´ ï{ØÀGŽ)g›7œ-´H˜-ú–ckÁ!UŽŸ§o$[NNÜ$³™bDˆŒ u ‡¦8Î"'¶"ƒU5j¤Ö‰›—uí BPÉÓÄžLæßJÛCçúPxÃ肟`# ÕÃufu0/£òp™d6ê¢ñ«má[‹R1Z¨eö΃‡Z —ˆC-pË£áV‘µ¹{a3øá3{Ùú>¾q^µÁÅ Gªá,hnÂA%‹unå5|’™9ÎüàP þ'¸ˆû†¥Ÿàœé5^õ8 "ª£™¾1‚=Âóƒ¥ÃivÄ2Pë秃óƒ{€×n-£×X8këCC4^YßbV²´µÆ“YÛx¶¡€Ç#²6x5b„Åãk.3 08Ÿéõ§Š^ãÐ_íOfÂÑ]}RetZÑE¦µr«5é9Ø¥ö0Œ1+È%’•º"ô½<ÉÞø½»çǶì±ÔT>^öX†€À¼‹¯ÅÎà(#™Ñ®»S-$»ïQéhˆú!´D#V+bÎ2¾¼š‡ù3#f`R4=2¼œèúç0áœï”[†ï×™ŠŠÕ²ª–/PÒ>\ ‘qe,C‚žc#üe¹IŒÎfx8F°¾ jèίâ‰?Îßiú̱Üu÷ý©·öýþöôµzÁë± Ný4ÕJÓ;²0V b% _F(_烋z¾²IFœý(''¾Qž‚á3e‹à€¢æPC˜¾ÄT$ (f($ÃA|6Ä!gÜFÐOaêáÉP<žZ”g¦ mdh¾o mdh^:¢dè6‰³Ìœ2Æ£*Òpæ°}kžÌuOÆâ•Þ<™æÉ4O¦y2Í“ižÌöd2‰e¹‰ù8ýNÛä¹qçB'«.qé1fu DÙy¥ëÈã$žŒî…ßµ‘S”zg@xpÈÑ¥Z9«‚VqØìl8•ÝGŸÐ“q9$ú4áR½}^?B%ù#­U\mÝ”üµÙS.߯AŒpŒS ª•:àg¤Å+U߇3Â!‹{äóéVäròž¢æq‡h²Æ‡«`Íd·÷¤æ=€‡Udr^GS¡/–ô Êhà¹Å˜~½+ŸéE*m%Þ:'xA0CÊcJ—AþË̪Ä*g%O–=ÏW„—‹:“Ò†±P4—!£K+N)©•Å{¯t;4UñX{ºÝxƒ]ÉÉÄߌk̨ž¾zÌUA#Б¨›«YV­†1YòmxŠQ@Ç:m ‡QÞža!:øG›°*â"BÜÎIu[»¿@uC¨Hí˜ ¡ÌÙÇ«Z{€-øGØ¼ÈæáWˆù]WÆn&£ø$&Ξ_øW;; ¤›‘Gû"›Ô™i«€3 0—ƒ™.QΕèUó0`k[~è-hÜkØšed&Xüdó!›Éß/úáRuÕ†Ux²Ë^Òk|BwƒÄ‰S=àœS‹‹ððª‡Oä®/»RÔÑ«)z&[Ôáá;¸äá<½ŠâC.a‘.yÈÉé–{äÚéºtº®HÉÅŠF:u·“3Y7$‰Ù){ºZt .ÆJçÖ Q óšÀðq‚ÛkŽÃÄè%²' JЙ©9WöøX\Ãó…šS·Á±É+¨5ç³»ŸyCM„Ô$ãÛü8‡csá!9Ñã¶'Q&ÈàvY@ÁY-œ¥å¿md—ëQ4ÔG–# V,(o샬ðÔâ_å¨6‡|­tñî–ßš“ôEK8›hV=@ÈoßÿjÙ-ƒìùé™]¼ºç±šî@å”—àu¦^—câ|§Öm.X%Dâ_í¢¦”PÜþjӇ늎5EœxOÙ[{2H¹bf¢pî„—-+ûéóü>Lˆ¼R€úƒ ¤ªuƒã ¦$”$9VÕªådØe‘{ÀÖÒd—ÿÝO*Ú´_~c˜V4úÂZX ¯ˆ]s‚b„ùŠ˜¼D€ð¯·½RLF 8È/))Ên¹Ð¾‰†XXwk­ *¹Kˆ@™à»Edlˆ¬#õÄ9ÙÓ-¢ œuPŽÊŸ¤]Òg°A¬H/^,Qlöçujj•P±‚-Ëgu¸§lˆNÖ\MÕ¥®´ Í&‡ f`QfŬà9LUÙL¯5™ AÂxs{þÎ F*íA6+r9°±¬år)ez_˜TˆiÇÚB¥·-XYß¿¼AóC ›Ì`– _)rz5ßzH¹ôð|sÉY>Zï½= (”öªB’LÁ ¼¿£qkX:¸œ‡ÑZ¦hK>ÉÜz‚[«të uÚÏÅ‘ˆ}oŠ÷Yq˜ Ë+¨t0Œ¬/“‰=VºŸBäNú°·Ë;+’³fÓUËé)‘­S¶<ßô6;kxq9£Ò=óWê÷é¬Ó!øWø¦¿Y¶¡V¥H­³m9!¡ÌÆ‹ æT¾ÕŠˆœ¯œªa‘Ën2Û"‘š¬N’.‹^Nqʽe•Jöf® ʆ÷89FËãK±½XQ7p5þ)\à0QÅíép¾Ìë½=½—†¯1äŒ?N ›“ÆY&M–,L ˆ0sˆ¨JENœ­q­$uTè”F m<èK —£lÞÞÁ!6øÌþÃaF܃L`Ÿ ô‚žàÓ|Æ“!…ZËG ¾ÃMf.~ÆAXUÚŽáL¥oÚDÈn¾0NáD&Ì¡1Z«•ÊÂڄ߽׬P.ã܎˾Q¿âÏñØRÈxS Åš4FNI[äV*iÝÜ)Dʦ¯Ö) À¦‚cD#’©¹ÛÁœcâd;ÙÎrbÃAËWh„ÇH5¸5JqdÀY•Œ(=–ÁýÇ󈎈¨šÝÉ©(Ï<ùóÎŒm¼­pyÓ6‹%e€ïTø¨"¯U>^ëháŒdÍÎpoX.2‡»x”P…° ¹~MŠ¿àÐ<CãœÅ²"‹LæðdF §~°}2;+FqwSEj¡°@ËÎ+£’EXq{,kg*r^¡ì‘&µ${wòŠñVèç N7cZ®º›5b–ovùQœ)‡yÅ^á^wÀÊd¨32zXÑFNgJWdQ­8tŸ“ˆË9‚³OÃùœvë¶xØ)—HÞ}€ŠëZ[aB¸·æ„޽^îqeþî)EìFÑÓ&L¸Ám&i£&é[‘ ó¦rÊž$Šþa'Ÿ“;ÍqšÃ A?×C×*Í>\¥Y¤œÖÜÏ0ëÎ:X+wqÅþ%cÙ°®cJ…‘äeë]ÎMZ]æÐð‚e|ån¯Î\è/Ú†×ãà’å^s­áwð…Þ,€Æ%Ë™kÈãÉ\oŒg^Ûé5­o —zãÖ°tp±¹Æ:Šûö²^wðeð™Bx,7±M¬tóÁ¥˜z‚¯“Çë™qõ8¾Èc ^gœU‹g޳šŠݰβÀ9å *§µŒýÀ#…3gpk× UÄ ;±ÍCت‡€1ÊZãYà`Ö,Æ:k¾C ðýÇ–â*ÄÆ¾Fì B6£ù?¿q¥Lߘ˹Âeú°µvNh¦à¿ ë3eí¾Ã8'4Óküþ.íçô ¿ƒ%ú õíUn)©!e=)w<Þo¾”º=:½"~2.%·×‘êÁÖð;¸ãÄ'Þé¦%{®ò‰'$1žqaª½ Ok}UÂDádØÚeã'H ö|’Øó±çÄžŸˆ=?#ö|@ìù$±ç#bÏ'ˆ=?{~FìùŠÄž_@챞4X~\X^@ìaXÆyË™LŒŸä/á ßhBhBŸ¤ }DúMè'šÐÏhBЄ>Iúˆ&ô šÐO4¡ŸÑ„¾"MèЄ™'­–o‹ M( òÍd¬6†‚Yl&ƒo2ÚÓ'iOÑž>A{ú‰öô3ÚÓ´§OÒž>¢=}‚öôíég´§¯H{ú´'~Òê7i2–Оø(r|D8N„GJfNå=Ô÷­Þ¾ Ñž О>I{úˆöô ÚÓO´§ŸÑž> =}’öôíé´§ŸhO?£=}EÚÓ/ =3 ߪ0·òKhO|ð†e†aØ\¾w?2l€Íì€DõIÕG$ªO¨~"QýŒDõ‰ê“$ªHTŸ QýD¢ú‰ê+’¨t‰Ú**·Ø´„D­ØœCÁA™ ù0cE%5âõv(§€x¥$ñJñJ â•&â•fÄ+Ä+%‰WŠˆWJ¯4¯4#^©"ñJ7¯­¢r“P^èpS÷ÎÀ?¾³£üñSãá¦ÔQð QJ¢¢” Di"DiFˆR@ˆR’¥ˆ¥!J!J3B”*¢t!Úê&7 ¾ ÑÌõ1HËûªãi}ÔÈ@¸ È@J’‘” i"iFR@R’ ¤ˆ ¤HH32*’tØj ·—KÈ@N!ô;3‹ožÃu“ð;ø¶­‡ñ½S½¶¥ÍŒq>\íb s”$ç("ç(AÎÑDÎÑŒœ£€œ£$9G9G rŽ&rŽfäU$çè&r®Õ$ntoªIÜ&è².f\Pˉ‘WÝ^t‚’E%6š6šll”$Ø("Ø(A°ÑD°ÑŒ`£Š[¿„`ƒùЭJQtS­EûN›?积u ¯ÃÄOðIr#€¥6ãx›{™A,H,7¬CŒ=>þNf<°×Ö"-6/P¿¡æ+˜¦šé'Îõ Ïœ5ë##<šHMHM¤&¤fR3R©I©‰€Ô$€ÔL@jf@j*©½HeóFÌ%QŒ¢{ÇI_ÕúQk;Ÿ¸_¾\«Ÿ¡ua¸Zúu¹¥ÀÐ}}†'‡‡ž™'8·ºgŸa-3#å@.v.0´GzDZÝCyo\nÒ~wèdöÑHû HñÅðz2.·×ôá‹îá;ã Sï ð³ÁVzïIÍpf4 ´7ÑT½Â‘ê µ3w pkŸÐ;£f§Æ{  ¬ñ܃L¯¡DÇbt¿7JëÏOÏxâÖk~2šçÓR:ü»ûqX3Ù%õåÚ/,p^úd”û°…ïÔ±;m/RP•†qîb=UïõIãcMðñ“1(rX&‘äÄßôƒÁîöíuiä&†Ç9mh¿RUãУŽø›jžà‹†¡pkðQÕÕª¡¿S[®Âÿ~èñ RÞôz± h,¬PÙ 'N§*€…9î¯S€§&Խ̸úàWï7œþv­¡ÎìGÄY¨>¿Á'ê=ö^ÃÝÝ—§ÿLcSv endstream endobj 3598 0 obj 6211 endobj 3602 0 obj [174 /XYZ 38.2500000 735.500000 0] endobj 3603 0 obj [174 /XYZ 38.2500000 206.750000 0] endobj 3604 0 obj [174 /XYZ 38.2500000 735.500000 0] endobj 3605 0 obj [174 /XYZ 38.2500000 206.750000 0] endobj 3601 0 obj << /Type /Page /Parent 2 0 R /Contents 3606 0 R /Resources 3608 0 R /Annots 3609 0 R /MediaBox [0 0 595 842] >> endobj 3608 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1701 1701 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 3609 0 obj [ ] endobj 3606 0 obj << /Length 3607 0 R /Filter /FlateDecode >> stream xœí}߯ä:næ{ÿç9Àœ±Dý € Àíûc}Xàb.°A‚™dƒÁÎ`ïæ!ÿ~lWYÇE—Í#ëtö\$Ý­R‘–ËIQé?þ?ýëËÿùÏ—?þø§ÿ÷òçûŸ?þéËðýpûßËôßÖ_ï‰è_þü·/¿¿üþå×/¿Žÿÿ÷/·/üéÇÿ5þí¿^ìËÿÿï¯/ÿü/ãà_ ûMÿü¿óŸ)šñoCþsÿ/ÿû^þ>I\ÔÝ/†þû&`ònºŒªÿ²,ÓÌÿýçŸÿþå·pL @L¾îÅ$g_þÿ¿}ù÷imGÄ,×r›¶¾–·e¾Œ€³z'¹ã]\þ¯ˆÃKÓјۨG|þ±î#þÜ«1É"š< ˆXëçßÿ¦¯½ß6¾Ô1ŽŒß¡W2ÍB"©Žÿøòõ¶Àß7nÙ×ß¾üñ—ôbÂËoÿ>þ²·[=ÿñÛß¾Œ+úüNxùí//ÿ8 æçzùí¯_ÆÅ¦!X?ÿ2·OÀIŸ˜ÅO~š?q¯nÉŸ ?JŸ€Ÿ?1æÕ»€ã‡o߉¢+^õ ~çO`Q³Ò#J“¯zpâ'á¸4‹¢4/^µ|wn×öóo# ß÷™8áI²ŠGi0â"~–>1F\ˆŸˆßýfÕ>‘æÛcà,뙞·QB£±„ãOo:ßg!P«±f!•kaVqšD ¬ud«¾fGÏPêpÜ*N³HAª£ƒUÝ×;¬¢øU~­¢h_ŒÂöq=×&Zž Û'ÛKYh—Í×Û';ÂÆÒåÛ%;y'"_õåA{îüb¿v]âù€ìwäß8vð;ã* °nø9P)ïïðUœ g»PÚŸfnÀ{ê|¨¹¥‰G˜˜f‘kÙ xWs˜àn`š…D RÜ@0ïpV¶* 7`oW`†×ÍN7 Û(›6J€Þc·•õÒaÙ3ÉfSãä}xS6Ä£¨¼ÑÍ¿Ε°uÃSÈŒìCćé¸×Ï'ëQÞ¾møzÓgËgAŠäO6nâJíÒ¨Œ°ŒÜ¦VÅÁñ{íV ;m«bÁ™â®^Î+€xƒÅt×FZMN‘…³÷9cq?î?ƒ_žÞ3¬bj“«YÅJ‹5Ž0«8Í"Ö:²UL¶f“a: ·ŠÓ,$Rêè`SzU”ÝãSZÅ`R¶}ò'Š üÛµpC*˜”‹hÇ6,~\VÆ:(Öv¾µÂÑÑ®­ÕøoàÖj-ç‘ÂZÝf‘kwk5þÛpk5ŽLÇPZ«Û,$Rê8ÝZºð=ÖJv¢3Ûde#Un“49lUòBqDj)/V‘iá»XErack¯9ýÁ#tr:}(Atw¸‡¢Ê .ûƒPþJIü•dÅåAÐù‡¶ØÓä”ä-&«uãrJ‘ÝËG\ƒ»Œ/£Ï¨yßp»É>Ûö–˜ÎÏײBj’>¹›ÿjƒ/Ð-J“¿c~¿“ÄïܬÈèË~:þ·íã`ç'×vû½GO]FÉw«XYéú_=ò¯ Þ7Yš|Õp3áfpìû}Pñ‰?®G~ªäO`uhú¾Ð1 4tL¦:&(ú®Ò+i-©Ó‹|œ]bëÈÇuë•„Ó¯| ©Íð_EËý9òm~ɸV˜Ø6Õ¨q›ÕkÀËqAÓÄeco)_AÛÇösîˆÛ¥LP¿*Ý¢ÆÑ’`ëu›D ¬ud¿*Ý¢ÆÑ’å00¿Ìâ ‚]û…¬£ƒ_Kƒœ ηx´Qä‰%obzeÝøÆc¥h¥ª"—6uªŽRñ?[ im¹ͶSÕ±Eš=¥Æ€*L++ŒÖÜ¥$·|IêeÓMóó¤‡Zøóât¡…Àé™WJ×v!HÒŽukë,c"YäëæY@¤ÀZGŽ˜°Ö±ÎbɨšFXÄ„KǺ,©Ž.]4SÛÚn^ñb.͹Cã—Ó0çEÇï]´Ô­Ñ[¨|«iªÚôp[þCßq‘É'õ•gr†a0Ä‹Â`+^ n4*âçY@¤ÀZÇâEaj^41:XJÜ‹¦Åof)HuœïEaˆïð¢mßÓ£ò¢M=Ê$! ¢ä6+±TÜÖ¶ Nª’³MÙ«Ì?¨ö~lOoB¯gÛK‚+W wî¾¼XK/fiŸ/°µ>_À¸^`yŸ¯y)°Ö‘½˜©õùSrÖ¦‘ҋͳHAª£ƒ³û|mx±¦ÅÔ]+_Þ~U¾´¯|y»»Wùb;h9ônd§ÛùAÍwÊ¥?|UÙ™TpgêOê±Vhß½í>מøûûbW¿’| (æg72ª²¥ùú`xf|H媟ém‚¾= MŸ|@Š÷“v¤SuânÇò-óÊšíi¡ÝÈœ©u#sŒÙå ïF6Ï"Ö:–=­3µnd޽‰ÒÞlž…D Rö´öq7²Úë?Õ×_²ìêÆï©•Ùß­Ijøãßl¹avZœ¾hvõ½Þصñ¦ã—¦Ç™%a'çrS,ŒÒçéE•·okë Ó:/Núñ¨h§/µN_ŽñøðN_ó, R`­#GPëôåØÛEðN_ó,$RêèU¸lne3(V!·íèbÄ2H“UÝp¥û=µª"ö»I(_ÛüóÏ:žÒú·³ñžvír¾ÖµË1Òžó¼k×< ˆXëÈ6Þ׺v9_’§fãýÒµ+KAª£ƒ÷;ºvÉ&äOEcL±9Ò¼h¿-«‹|yßÏ}ÕÊÆ;š¸tÙrïÏ l÷ÃF5ƒ&W¢ÙàjŽoËØàXµ}ÙP¯n5ÍÜY¤-•\¬µTrŒèé"o©4Ï"Ö:²;‹µ–J.–„Õi„¹³¸´TÊRêèàÎ⎖J²;kÛRIÃsWp¼5o{ïõ*ËÆ¯}ÿ¨wÔÓAS‚S¶ç½OáZŸ-¾\A¶§K´;Kµî@Ž11]âÝæY@¤ÀZGv©ÖÈaÉ(F˜CÀìÒº;ЛŽ!íè$šýÆÝ¡MÇ4Å69·9ðV¸ýŠš¶Ê¹Ú¾z_©úÓù’X® ƒ/ñ†öèñ¦Ö£Ç3„7¼GÏ< ˆXëX|‰j=züP29¦‘җ̳HAªã|_âÍŽ=²/iÚ£§×;ß>ïÕëæ:€9xÕß`cÝÏÞfVc#í=Þ®¼QNó"¤¦ô²3ZÒœI1¿÷{sMÞŠ b½µÛ‡ç‹?îu#ß­oÃfhÞ¼(¶ßølN_&„u VyKÛ°y¨µaóŒöä·a›g‘ky+akmؼ-é[ÓÛJØ¥ [–‚TG‡­ìhÃ&o%z¶»„ë'sB(î¸Ì°¡Œ¢äãw9ÉÐŒù ¿§T.éãÐëÍŸ-ä~ØûäÄ^tåSþd‰=gØ :èÄú]{2R`¸ÅÑ>‚ÞÕúzFåóž÷œg‘k9nqµ>‚ã/Sêp¼à< ‰¤::Ä-~GA9niÚGpøåxÜ¢z7òùo¸åàÙïÖP°P¾åÍ÷É…òá¸Ì‡Sì›fžìÄÑvãé£og|¹¤oø1îóÞÑeõvKž,Tó[Á£[z¬ÁOi36p©h•³‘gÒX Ùô=“!=ù¼«íû•?¾™ŠöòQ/ÇÒpDÛ)|*Ž÷>îÏkÀ1–+èA¢ ´Ý³XÛA2ö¼¼Ýó< ˆXëÈ;ÈPk÷ìCY0°dXÚ=g)HutØAÆÇížåüvÛ¢âÆ,Ķôñ¦},4”œ‚¦«U0Hûñz¬õãõŒ=í‘÷ãg‘kÙ `­¯Ç’>0ƒ€K?Þ,©Ž!=îÇ»qàõ¨õ2õ¨\@©^&щÂö]˜—0ÐÖha¨µF ŒPÞmžD ¬u,æ% µÖha(‰ÁÓHi^æYH¤ Õq¾y æqk´ óÒ´"𳙸±Ò+ÜÅ]~aKûjjfD–`y¢y)°Ö‘!lk}ˆ‚- 9Óƒ°]úe)Hut€0 ï€pÛ®OaÍiÃwaGÛÌWk3Ø™np¼ÍÌ< ˆXëÈvµ63Á•gÓÓƒ°[ÚÌd)Hut€°{ÜffÂMKg>„Ýíî„åÄ÷‚ðcÚZ#„ZkÀ’j!ðÖó, R`­#C8ÔZk„P&§á°´ÖÈRêèáð¸µÆ„›RV?„A~ÐaÂH›!¬5C, 7C˜g‘kÂXk†b™Î›F„c-®›!¼éèa|Ü aÂmÙ[Ÿ ÂÄ« ÂuÇÖ Ç¡VƒYª)¼}žD ¬ud§Z zH,e–x ú< ‰¤:·p× o@¸íÛR?„ýP—çà‚ðcZûm­ö+²TS´¼ökžD ¬u,ަVûM™2›FJϳHAª£„íãÚ¯ ·}å'ƒ°»ŸYWJ¾/ Z¡VYª):^1Ï"Ö:2„¡V¡L™M# °”Ad)Hut€°{\±Ab¹öÂ[^xi†lüü• Â!ì)-z¬A˜¥šbà<´y)°Ö‘!ìk<´èË”Ù4 ìZ–‚TG‡<4qÇ{ñÐ6!|»o×¹ðGÊ‹±Æ‹,Õ#gŽÍ³€HµŽ áXcŽÅX¦Ì¦á¸0Dz¤::@w0Çä¤ÕÅÛ‚°¦ÀwáDÙY1ÕØY‘¥šbâì¬y)°Ö‘!œj쬘XÊ,qvÖ< ‰¤:·0;ØY2„/vÖ„¸¼ðA£¡ì,45v²TÎΚg‘k „ÑÔØYã]a:8;kž…D R l‡w@øbgmBØ^> a ì,„; Yª ³³æY@¤ÀZG†0ÔØYSQ]©ƒ³³æYH¤ ÕѰƒ%Cøbgme¤Óá£ö”…¾ÆÎB–jBÏÙYó, R`­#CØ×ØYèË”Ù4 ìvV–‚TGûì,ÂWFZUæp…ØÇÁ)o c·…, …‘ó¶æY@¤ÀZGw¬ñ¶0”É´i„;d8Ç5oëMGpǼ-ÜoKUqû8¸etaª1º¥§0qF×< ˆXëÈàÆ£kü_©9£kž…D RÀv0ºdp_Œ.UiÄîÃàNåz%Sãz%–¸J†s½æY@¤ÀZÇî4Ô¸^i(pÓH îy)Huœîdvp½dp_\/UÑÄîãà¶”–l–XJ+gͳ€HµŽ n[c%[¦æ¦n»°À²¤::€v°Àd ɵçV•S\à>nGùaÉa Ü,Ù•<ç‡Í³€HµŽ nWã‡%W&í¦n·ðò¤::€Ûïà‡‰Á÷ÅÛÒ#Z\à>î@™c)Ô˜c‰%»Rà̱y)°Ö‘Áj̱ʤÝ4ÂÀæX–‚TGpÇÌ1yg}1ÇT%¸ƒ)§,aS–X²+!ç”ͳ€HµŽ n¬qÊ–I»i„NY–‚TGp§œ2ܧLUœqû(¸ÓøÛ¬Á=þ»Â6G‹d×ý÷apC¤à¬›%ÈŒcܵÛ, R`­#ƒ*ܵq´LôM# Üà8CXƒºqׯuîஉþùâ®évã¸ƒÛ n_ᮣeÌxÆ]»Í"Ö:2¸}…»6Ž–é¼i„Û»ÎÞ¯Áí»q×’ ;¸krð}q×Tܵ«±ðqpGOÁ+ܵq´Lv™È¸k·Y@¤ÀZGw¬pׯÑ2i70pGXàÝܱw-ÜÁ]“Á}q×tܵ«åðap'Ê]3©Æ]3,Ùeç®Í³€HµŽ îTã®c:8wmž…D RçƒÛÃ;À}q×¶ôÈ=Z®—Ô·5”»fM»fY²ËÎ]›g‘k ¸­©q׬)“vÓH îy)Hut·ÙÁ]“Á}q×T=Z®××7PV›…«Í²d—Îj›g‘kÜPcµY(“vÓ7,¬¶,©Žà†¬6ÜW¶|kÏ Š{ðCØS†šõ5†še)-ë9CmžD ¬udûCͺ2570» Z¿f¨½éèa¿ƒ¡&Cøb¨éz¨‰Ga×[«Ã>R†š5†šeÉ.9CmžD ¬ud؇C͆2i70؇…¡–¥ ÕÑöqCM†ýÅPk û ܸ‘2Ôlª1Ô,KvÙÄjó, R`­#ƒk 5‹eÒnaàÆ…¡–¥ ÕÑÜiCM÷ÅPÛ Ëø‰¿öÜÁ e¨ÁPc¨Kvá µy)°Ö±€†C †2i7”àžg!‘‚TÇùೃ¡&“X®=÷ÖQØWIš—ïÁnÜ–2ÔÆ««›%»8CmžD ¬udpÛC l™´›F¸íÂPËRêènxÌP“!|1Ô6ÃòïæÀK^½ñy“׳ñËÉ¿ÂýDgGØÔÎ9J§W£ÓËÙãtºy)°Ö‘-‘«ÑéÀ•¹Çi„Y"·Ð鲤::X"ÿ˜N·L\t:U‚à²DŸÜÊýƒPãþK#BàÜ¿y)°Ö‘-Q¨qÿ ”éÐi„Y¢°pÿ²¤::X¢ø˜û·a‰.îŸêE—%úä–)Q°FT–óäDÅy)°Ö‘-ÖˆŠ€eîva–¢b–‚TGK”†wX¢‹¨¸i‰¾›B‚ËQKäʪtCUéX‚Ö œU9Ï"Ö:Kä†«Ò e¢y)-Ñ< ‰¤:ηDnx̪ܰD«r ÓòJeÛ!ßë»]3‹‘ÊŸ\Éæ–FÄRö¦³5ö¦c‰`g9{sžD ¬ud#bkìMgË„ö4ÂŒˆ]Ø›Y RŒˆ}ÌÞÜ0"×I’ʈlòE Ü÷@^øË$Q“ô>øáËTûÀágà ~aŸùa‰}Ë:;›¤Oî7Ê¿Úà `ŠÒäïÜoní;IúÎýNž-ùyíWq=VúÎð‹ô#ßùÚ¬(m®àž)ª]›¬gÉŸÀüàvî¸ Ëóºc¥²Í… ­tãÙAÅ'þ¸ù‰—?Ø(ò¥’ÈÃ5ö©Êtë4RFó, R`­#G©Æ>u©LO#,òH û4KAªãüÈÙ}*nE6³›. oxÑ·Þ ví;¢7ÜØÂËW ®ÇþRlá5.UÞµlH“C™± ç5ä€PþŽòÈA ·K޵6bG,ï9“>á®o8ð\ÈqÍ O–`hG,$_*’_?û,QßûÜ¡|eok|eoËœ÷4ÂÜ]øÊY ¬u,îÀ›_Ù›2w?”î`ž…D RÜÍ|e;hzÂg^"†2}þòÔËi ‘f“y`éßÌ~¯ %Þ 9¹ÑkËßÎðår{¨q¹½+SìÓ3|nárg)°Ö‘ Ô¸ÜÊ£‚i„>X¸ÜY R ŸË\n…ák| ø“ò]†hW+ëQäÁ6öŠ w#ÌVx*U8Ï~~yšä-3Æ¢øvÏS~»÷X3x¡<˜F˜Á ÙÄ-R`­#<_ã·{_kL#Ìàù…ßž¥ ÕÑÁà…Ìo ž|°Ð˜ßþ‹¸Ç•‰|¡ØŽð¯­kWPd=Œ 9˜Ùˆ„4÷\ŽâQq»7#¡yÌÀäjR*ò2˜É•q+¦6®^¾çšc?9 øÕ;b|¤% >ÖJ|,K¦æ\âR²¥ÀZGv.±V²àcY²00ç—’…,©ŽÎsɂ¹4.Y0RAµ}“?é”U>°ÛÝØ2÷_‰*k,ņ Vp¥Í×ý^¾$yÿ ˆÄU‰Å®gãÚÊHbC¼âbeÅühD³›Óì45EB,Þjæ[-Bñ©V„âÙi¢O¼ežD ¬udß’jE(>±SÑÄ‹PæYH¤ Õq¾o C.BÑø–¦)j€ã—#)j9Š*­ÙýÇûÖ`hB0µ:…ÀÎ:‚áu ó, R`­cyXƒ©Õ)SžÙL#åÃ:ÏB"©Ž«Þñ°vK+ÊO Al$æ¡„fÏ©ÉØpx%²â¶¥&B‘°G[¥ó¹Ÿ$×±?®Š15±Ÿ‚ɺ‘˜ÑœÁ}äIZ· V·ØaT^·2Ï"Ö:²g‚ZÝJ€òPmaž –º•,©Žž rÝŠì™Äž¢mó¿àEc¢8fêµáRÑÔeÈ6½Øã¶!ÛÄ1Н?ŸÖÅâ½gpj«Jâ'?”7í냛Ö`UäF_.Iã2šøE¢^SòxàpÃÝh2[M±œ “oŠ&a±±žóOƒ§[Á×*¶;Ú žWlͳ€HµŽì>}­b+øòˆvaîÓ/[Y RܧÏ[ ÷Ù˜7}¹ÏÓݧ&\o{V©°xOäô°zz§6–KjËzüTžüÜÇË /Ñjò¦g]þéÏ™sûŸ³v!C¤ï÷±ö~À¬Cäï÷˜g‘k9dˆµ÷{„P¼O#,d9Hˆë÷{¼éè2Äü~MÈÐöàâ š”ög?pÞ¨Y“S‹Ÿ VÑzP¯vm¿ÜWÊ¢•»-•Í®+"óœ_àýq’ÏÛåM`eF–&~çŽshé«;Únúûû®ÙËÁ§üXù>È€ø°ß-­Ûñs‚øÈ7ónrk?€üÓ”ÏÞÆº°˜úqËÁ÷?5q€×»ÅÙùøˆ±¾]e±šÕ__~ýò߈¤'™ endstream endobj 3607 0 obj 9669 endobj 3611 0 obj [175 /XYZ 38.2500000 181.250000 0] endobj 3612 0 obj [175 /XYZ 31.5000000 151.250000 0] endobj 3613 0 obj [175 /XYZ 31.5000000 109.250000 0] endobj 3614 0 obj [175 /XYZ 38.2500000 743 0] endobj 3615 0 obj [175 /XYZ 38.2500000 485 0] endobj 3616 0 obj [175 /XYZ 38.2500000 181.250000 0] endobj 3617 0 obj [175 /XYZ 31.5000000 109.250000 0] endobj 3618 0 obj [175 /XYZ 32.2500000 150.500000 0] endobj 3619 0 obj [175 /XYZ 38.2500000 542.750000 0] endobj 3620 0 obj [175 /XYZ 38.2500000 743 0] endobj 3621 0 obj [175 /XYZ 38.2500000 542.750000 0] endobj 3622 0 obj [175 /XYZ 38.2500000 485 0] endobj 3623 0 obj << /Type /Annot /Subtype /Link /Rect [60 73.2500000 115.500000 80 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_introduction >> endobj 3624 0 obj << /Type /Annot /Subtype /Link /Rect [60 65.7500000 77.2500000 72.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn1 >> endobj 3625 0 obj << /Type /Annot /Subtype /Link /Rect [60 59 123.750000 65.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 >> endobj 3610 0 obj << /Type /Page /Parent 2 0 R /Contents 3626 0 R /Resources 3628 0 R /Annots 3629 0 R /MediaBox [0 0 595 842] >> endobj 3628 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 3629 0 obj [ 3623 0 R 3624 0 R 3625 0 R ] endobj 3626 0 obj << /Length 3627 0 R /Filter /FlateDecode >> stream xœí]K¯ì¸qÞŸ_Ñën‹,> Àܹ÷È"À`È"È"Ç1 ÛÈÄ‹üýèÝb‘Å–ª)v«ì83‡b³$>êŪ¯~ÿÏ?ÿçå¿ÿ~ùý?ÿÏå×ñŸ?þüÑ\­n†ÿ\ºÿþnÙ Ýuü÷‹uúòë_?~»üöñÓÇOíÿÿícøÁÏ?þkûoÿw‘—iÿ÷çË¿ÿGÛø‡±S×á¯VØöŸéÿé­hÿ­™ÿÙµÿéãßþáò·nĉܸ2áß¿Æ{Ù¿ÆÒ¿}LŸ)úÿþý׿}ü~˜€mT¼ÓÍE(Pᕼüï}ü±%0 ß\ÿCþ;“¸»€Ú¶t•p—eÝoëùïP6Ð<›²¨OY2p;}*1ö¦¯¹MŸ§O4ëÉËòEeËi>Êš9gv[34ö+­™sö²|Q{¤5Û㜥6Ãk,˜>ÚõòÓKc±Þõ ÎØ(ó†U›þÚ}á艽ýTÄj¬qƒúé»yjßwüÛ´º¥k.Ætÿh—pl•£ge}lùõè«^:'æ^ŒKmÿño×ýì‚~­-¦Ñ¶´¿ ߤëå‚Q\HãO_þ!¯Àçöù—_>~ÿÝ_„¹üòÇVq¶Nÿ_ZnÑþѾüò‡Ë?6ÿtùåÏîê|c¤îwÚøäê‰ø‘|òµ¢® i~ÒüH=Ý?⪕qíÃÛo,IGRO !ãú'0‘YÐ!G£ßºQä³}4A¾u3¼µ{ìe¿õOô¤rå§“˜yYš¹”œ)&E9üðß~i9ìcGJØF§Jz@ǪäWyòÉx©¿Ü™´_E1 ½P𦆯8$4»ç,—Ë]»¿çˆ£YÑ Fÿ†”@,=à³éO;ÊZÑ~%¶‘kãžýµi/¨o5l¶FÁz£Íà¾g]ÝQ‹óŠxzE¼KxE|Û#ôXøÁËø5ú^ŒK³WÄ›”WÄkìi["¯H×Ë£¸Æþ^ßÀ$9^údõŠÐB#Ã8<ˆäh…o1ÖË–êSBëy×Î| h~rQt,Yþl†yœQòŸ¯3¾™²ÅQ_éßd4꺬{:6¬ÁçâÈjééÖ;ŒÏûôŸ½‹ÿL,¤÷Cv†&°3¼°);£ÓçC;£m‰ìŒ®£À’Ædgx¡v†*¢¡";£ïå‚Q\H£‚!å#v†.igŒ©'ô™¦ùG¨pD9š´«™#çe3rŸf²ÁÿW˦c°H-ltÎ$~C?a —#mDŽª­¾—|¥-k[L>€å˜”|‡ywÛɇ®£À’Æ,@¥ä@DbùÐõrÁ(.¤QA>(ñˆ| cf9‘±ôýç¦àMâê8ª+=çr®„WëõRÖÖ!éd®W9Ò¦¨ƒsõÛÔ¸ôˆ &Ø]Z~ò$Ž7}‘ÞN4WÝ¿Kt€OÆ¡¯Òè$ÇÝöEþÆS¿e~{Ô¬@›öËÌ(<„JÍ7êIó}ûŒŽâM£ Îo†-a¯5IþfØ¥æ ={ÙMâ{2óF¿59;`¨7Ȭ¶c<ÑÛédž»l%Pu+°P»¿U¤v­aøôÐ*c/F%A ìþ–‘ØµŠˆ†@JàØË£¸ÆÞJ`GËO D'Ñ~ð¢éQrØØí\Œn£})`åpâ–2ÊCQ({ ±A/ÍÜhÖº™©äë8f˜ª(v˙Ӹ”DG>£qÝ Éøð6Ü3uËjôI,¾“h2ƒÆóØ*G¼Š±õ·¸ìö¿ ÔÏòÉ” Ýh¹ _+|Jðµuéƒ_@‹j‘)-4Öð@ÇZd× ‚Q`IcÖ"A¤´Hh"M¬Ev½\0Š iTÐ"Á=¢E~;µÈµÈ a²·Þ±Ÿ™?Z²=+KùÔ3:# ~xÑ}\Óò“NqQâY>uÆCéŒø”þàkëÓ¿€Î¨E¨3j™ÒµÂúœV±ÎØõ‚`XÒ˜uFݤtFå1 åcQÍZâ4Š iTе}@g¤cÉYáIÃo7 œ,AeÆ£Ûlˆ¡% };Ë`lœ;QU#-Ax‡¶ÅxӒ††Óñlôíbæ È£Ìohf¸;ï“Ïnf“rÉèè0NO¤¯lˆCàÄq0Ð×8ÐF/CË ÇÊiÙ¶§‚7LZê|,XïÉɈa(˜¬8ŽZ\L-²M¨Y‘R‹,`•ÅB¬u½ –4fµÈø”Zd¦a\¬u½\0Š iTP‹Zóôµ¨(f–¶¯¿Ú(F„! ¶øwøFÖÎZÊä<˜W)cÑǽÄ2:árW¨,¼9‰[¼m˜Œ|ÌH¥ ~ߢ’ó#-eŸ‘é#GñÐ>&Gå¨qŸ»V‰eœÇ¸Ïc/F%YŽº÷¹kµ˜†Ã¸Ïc/ŒâB䨟qŸ9r´,ʈů%'µ¤V4k4Nf'4žÃÛi%™á‡gÁárLˆõæ2+U"~¶=¡E¯B‹ñ^Ѹ€÷Š&Æým[£€O!0îïØ ‚Q`Icâ½¢‰q»V¸Úµ`ÞÛ÷rÁ(.¤±?ïbÆýåðÞ²™§§k·Œo‡uÆ`Ÿ˜ U°¨äßW›‘òœy{†‚ÊŠ-þ¼r¯¬3¸¬zUCªIJ5éRR- @€qÛÆ^ŒK³T“1n[׊麖HªI=É1i–RMÖÂmë¾sÆmãHµ²ù²sþXdQЛ‡£ê•Íúg-VŠ} ‡ímÿ¬ÎOi%:ïãüað·1¶qYà‰34­MI/{ë©ù‡ ÖTšÔ§Š‰teB‘®bˆ¤®Ç …!’Æ^ŒK³HW1DR׊㜺–H¤+5 q¥—"]Õ‚Hjié"‰#ÒÉ0–¡ú4ÎøÈ-ÑœÊ(UBœ¦ ¶Û®;š””'Œ(’k¬K=Zªì trÆ1—ò1D*qÔðH„t“²k…‹݆tÖµ5çµÖ¶e(lð•z¢Æã¯€sÅh”Vål<™=NÉÉ%Ÿ¡ÍTÑYl¤)—Ìö ýó4ó¡­ÒÔ+qb»i0z½7¯wcœö«œåhth9š<±kÅ!”Â`ðı£À’Æl9š<±kÅ¡ ]Kd9˜lE£––£©žØÒ²3x"Ãr„¢á%gÆó¦Å·ª÷*µFû±NžÞɹÑBX¼ŒËGZÚg¼EðIK\¦Ðœ"ºü~·l|–î¿Á¼ÝÝÊìÈ£ý˽æç3¯Ú/è9**µhßÄx‚ö•&FÂ)M^AšØ‹õrÚ¾S¡¶ïtJÛ½Åèêë]/F%YÛwÒöXïZ"m¿ëå‚Q\H£‚¶ïgF@wr×gŠ&eqBÆYqPEq¨_7šbÛu$‹öãñnð°n©#cá² Že“:–Q¼¸lb ã¾£À’ÆÄÂe“:– Ž{ïZ0 ï{¹`ÒØŸ…Ëæ>Ðqθ(Ðñ+Ǥ)~L¯áH‡ ˜~~¬}ÆÓöyÝœï¢WE¡ŽÅd¥ á\¥LÁ¹Ê( ]ÊεïÁ(°¤1ËJ™‚síÂ0εïå‚Q\H£‚¬”÷á\3ñ„s=/7Š^nÜöãéŽzêåÆb!ÞÌ6cùï_°®&g"ÉßÐSÕñ¤÷¿ÿmñOÂdµU'“}&k´)ÀdË7šƒ>Õï¥B˜]©R0»2J?‘*†Ùí{A0 ,i̺¼JÁìJÀi4]K¤Ë콫%ÌîF]^݇٥uùϳ›‘¶—K­øTŽ ®êDÙ`ñ-®*~ÍÓMu#X–W†š}™ú@⽕‰¿›=RNd™UšªŒâ^¥‰!Pû^ŒK³ÈÒ)ÔÑÐ1jßË£¸F‘eîC fDÖ=Ô‹jC<>éRx|2 o.Æãë{A0 ,iÌ‹jSx|Òâ0®%ZT;áñÍ£¸F…Eu÷ñø2‹z/`ºÀ¢úèKúÐDžÐÄ@_}/F%yQ} èKúèâÖÇ@_}/ŒâBû/*4÷¾2‹ZèëtŸŽâÛ~<}Ou/âtWrï{Ä”é#¶7ÙèdŸçwO/88¿ïìƒ"çp)51ºë#çõ½ –4&5D 9ŽYèZ°šØ÷rÁ(.¤QAM”÷‘ó2jâ=伋 !vR+ÆR‹9}b줾£À’Ƽ¨ÂNÀÎë®%ZT˜°“æQ\H£Â¢ªûØI™E-Š”©ÆY䌃šQsÕ’6gàx€Yxô4·/zë­Èšk¬d βȶÌX¦òv¾2¶ § ­úЧµXÉQQâ¯.ŠšqÓËÍHÓã\ÈìØÊ¹ïaå~rn©™6OΑTÒçso²“­uøýÞ‡_y³úðÆÝÙP¹¢DúC›‰sœ68^qùa½f.bÕ©ˆ™Jû^Èxßp¿Z¸Ά—ÑÉõµñ°V±å¤›–@zääÒj% Ìäo2A6d(=kù½;2Xßrñè9Ì(ú‚´ ‹FvT/t̹¦áˆ¬:tÈG†Þ»uJ=©T ­V ÏÞˆ+‡,§]Î1¨Ch<Ð)h<ˆBk@ÇÐx}/F%Ù1¨SÐx qˆP×9õ7âBƒæ>4^,£(4žvºPW)Vk¹ŒMš‰‚äpKÆ»qk70}–ÙÅð£–1ÊæÇ<dz*Ñ Ñ!÷÷b\ Iç—Ž~øVÊÈe$II›–“=C × l7Ö¾\JƒŠâXÁÆpc}/F%Yƒ²)¸1°8·k‰4(;ÁÍ£¸F ÊÍ܈>£¤kà.ÜØ¾Ç¨+r~}5^í§lsú#dZÚ§¼@_È#á)Cæd“‡’>`±_”¾)¶8$öV¼2϶úŸ§6­ßf¤ ûÆ[4Þ³{À¶=çâVšB Ûñª9ÅÌšæsï¶«ö¿ԾĮ*â{VµÇŒ…@[<œˆ¢ÙÂ2æ&'Ìa=²\aè· Uq8nÜè°è´±r¥95E9ŽŽŸ€Þ³ÅœÂ>„ߟ‚ß„(‹ | ¿Ù÷‚`XÒ˜MŸ‚ße£ù~³ïå‚Q\H£‚IãWÀoÒÀaeá7é«&N”ý=œÄ0F4«ÖÖËäz—ÍÉßÅ%»wÀ§AGäÊjK|ü Øö•“7J„–J¤ ,U”¢D aÙ÷‚`XÒ˜ä)K%pZKׂåMßË£¸ÆþòF‰–´¼) a á]Uv¶hø0Çv愱n9)j«ãÞ}zÙ»i»ÕqüXÌѤ²jðö®pêgБôæùaýN?XT¤ò2½Ésf±p'Š–(ÞqÏ Ñ)š¸ÿ´ËS¬¼’XÙPvŽSV;£ -!÷²ÕIwp‰ê þ‚ u›„p¨ Rp¨*Ê(Wáö½ –4f»Rp¨JâÌø®%² ål ÂõF£‚]+àPIë¯,êi¾]xº`_I^×15 Žr4¡Áiº-Þn¬U(í|[çÓ |I3ð”"¯$EN«og«o„|9®uA «O‡ˆâJ§ÅU”.¨tŒ(Þ÷‚`XÒ˜­>•BW §=v-‘Õ§&DñyÒ¨`õéˆâ´ÕwQ|›!E"DzLá œxBŽÕÇHûcÝÅqÒ eZ9Yd™åçÄa2ÐÒ2‚‡a-×ÊM› ab„¾gNR&P¦‚•&¢9ÜŸæXônA3Š6æÈ Èh Eó©l`÷“áäL£Ÿ{tö¬h7BûD[z¯\ÂNêõ§SS{[ÉYHç¡!ŠY÷;Ãraù\yOt1% ba83¶+ŒÆ*£!õèZiCòq¢"ÎÉóNž÷¨Ÿyt¤ï & ·Z=¢oç3Ø´ûV¶È'¤ R “»«a¢+¨‡˜`1o¤ Ká)›*…§"è eãRx}/F%ÙiR¥ð:€dDÃÄ¥ðú^.Å…4*x#íŠRx´7²¨ZÒ Y³©”w¸rÚ™;9ô,;F› {"›Xb_C“å¶àÜh’ZDñ #ת ~°Ë;0Ñá-Ï(ýüÄž)Ò  *{ÉÌCȘ’ô¹+žR-ì¡~}ëÇv»´:TŠ%›G‹ióˆëk¸óY0SO=Œ¾Ê3-óCþÆS¿­ë–CYöeÖœE>Bئ¾ô ù¤¡F›4´ø7‚þ ý=?’s@~ϸ…™vÚš'Œ·u s…þ´,ŸÐ;„üR0ÔhR‘«@ïG>Ñ :ôY ŸŒ—¦›lZ… µr “Mkœêݵ`“­ïÁ(°¤1™l-óJ˜lZá”õ®›l}/ŒâBû›lZ߯`H—³¦95Í2i¤†ƒ#1”‘LQ Îí myÒÎ.샌ЦX®­…ƒ2/Mã5qœqÊUP{aL⺕-xx¤ñH›ãsº;ü¦j$š b^8mÂú¥Ú¤ê—jƒ³´º–ˆ¥›©~é< ,iÌ,ݤê—jƒ³Íº–ˆ¥›©~é<Š iT`éö~ýRš¥ÓˆTµXúÞ75, ¢ñÕR4ЦÇÒ¬Ú=]Ù­³åÓU¡ÊB>†J»°Žv©Z8Úá ð®%2nª…3K³q©Z8Úáàö®%2nª…3âB„Œ¿_ '#dÈK ŽÙ;ðüiãd½ïiHxTþãx†ÄCüÖ4aå Ó¤*g˜_{w-˜ßö½ –4&~kšTå Óàëû®óÛ¾— Fq!ýù­3Weð[:€„ÃoÍ—äêí3Ù–Ë ¼‘¾k‰ä³œ`àçQ\H£‚|–÷aà3ò™LÄ-k=_¾dê-r¤âúÒ"œäwU^×4Û[D9tXk€í$T¤DTEu˜²Ö¬Ë©:€àUxºi~Í ½þÊ`ŽOw½[E[zåT­9c|¸ËŸ#GÇ9‘‘VSjc"¢‹Œ„££À2‘p_·ÓáÄÕe¢çèx72zntâoûC¾ã­éè¹Q ß6;dá, â7ö[*²üM&R‘óGïkÎ:æžëgÆüµJE`«Ú&l¼Ñµ`[µïÁ(°¤1Ùª¶IAƒPº–ÈVõ“u:âBûÛª¶™¡‚ÉÜL­å²%Ëèô_ŽEZÖÈ{:RŸRälÖçý/xÊITx2’ncÐ;\.‘Â_@*MÚ_ Æ@o}¸ieȼ ãXîbá¸õŸQ@hAÕh!Õh ”®%Z0E5ΣÀ’Æ,´ Õh# } qTcßË£¸F¡¥æ¨FRhÑ¢)#Î80ot¼8‡IʼÌ‘´Ÿ“Á@cG$#L†c§gèÅ.›ÕZV®=pãºsùNïÑÉcy¾"ÿÖ—;s´ëÕ(àOâ œs’Ùà_Vw­!wtèhu*ÐÑjèØµDrGOŽó(°¤1Ë t´НÕq cßË£¸F¹cæ@G†Ü)k,U“;ûJŠSD"ªT°ŽE‡ôø"J üIŸJDÙ06ÔÚTl¨µ86´k‰D”bCçQ`IcQ6j#h'kãØÐ¾— Fq! "ÊÍ•#¢Ê–„®%¢ÖC52ë”Y¯$³Fè¡Û©}™åñ'}*™åÃxIëSñ’ÖãxÉ®%’Y~Š—œG%YfùT¼¤õ8^²k‰d–Ÿâ%çQ\H£‚Ìòs¼$Cf•-WIßA±b9N»¢÷V/Ëú„whñ·Äßq %Á'ðšæBFZ<…œºoôuÈvüí½¥¥X¿e8kmˆA+‰¹k5Lƒ§pˆ½³ùw ¢ËhÒt²£f^æÚ›žQ:ÈžÉ_¶B*«°$\UDk˜BÙéZк ØfêI„¬Ho^z»Ñ†(ç׊4)Zøw³¦pHÅQM¯vÜÀôr-×M/'0_ׂM¯¾£À’Ædz9!¦—V°kÁ¦WßË£¸Æþ¦—k_åÓë^ÍÈ‹ aL§ƒTL§‹BWÄ1}/F%yQ!Óé$ÁéZ¢E•ó2Â2¦óF£Â¢Âý˜ÎÌ¢–­‚XÉ\„I=ð%Ö¢Ð7„þ„‚©ëÁ(°¤1‹5gSbÍ᦮%k]/ŒâBÄšWˆ5ú7o/ÖŠÞ}Âë^œØØÛñ=¾ðccŸô™„—ošl¾q áå£ËS/âšl}/F%IxµŸ™^¾Á—À] ^}/ŒâBû //æšlœT÷Ï{—÷.ETO|ÊàçÉà1ÂøÆ…/ƒ•ø“>• –!ÜŒ—)¸źxÃÍô½ –4f,Sp3^☮%’Ár‚›™Gq! 2VÀÍ™“Ç„›9eðšßœîÝS:?Q:;‡øÓñ¥ó:¾ø¤O%UÊãU ”ÇG‘3^Å <}/F%Y:«(W8¨k‰¤³š@yæQ\H£‚tÖ+@yh\ƒ{ <Õ„0Þ¤`,|tMìM cÑ÷‚`XÒ˜Õ¤`,¼Á×Ý]K´¨f‚±˜Gq! ‹j›Gµ(Œ Â~ƒ—aû³Ò–8 G£“­hm‰“Aý,=êLÐZµpg‚ÖC\gª7°©pÓõ†2ú<Æš\ýLÎ'#&43´¡L³U2/#“±±»N¬Ç‡›L|¶¼¯}cƲv‹V¾ÿAÌ'©OŸË|r!øŽw)ðE®xƒïô½ –4fMÛ¥Àw¼Ã8]K¤i» |gÅ…4*hÚnø©O—ß9”ssKÕZY]G3ã ßà=Ý’§[²Ð¥¡EœåønÉIq÷«ä½Ÿ\íf[ÊÕöï²BÛŠ‚jú$W‡^ŒK£\mÿN +ˆn`L#BVz¹`ÒØ]®¶´V +Ðrõ²B!¢-04Ϫ¯›Œšðcrr!ž‹HÐr¼z´T+{ŸYÉ™ò.׿gÖ©M=M›Ò@òdÔ¦ö&«1Ùc¨j¢ÿTªš¡ª&xIm«Âj”Œð’†^ŒK³ª&xI¢Ó^ÒÐË£¸FUM®ÀK¢Uµ²¸l_Ç-2zýßOšq›0¤Â†ï¢!#žw޳‡^ì /'L/•¹):€q—ÎÞn‰¸ÑñÝ&CÍÓå'UpÕ`¦NŸæÓC¼7W<”µs⨪—jBR% ÂÚVÀêŠ Â†^ŒK³ ˆ°¶ÕaA„ ½\0Š iTP!Õ ˆ0Z…, 6ðµF#:¼mNpSŽDŸ¹ Ü“ñ޳ž>µb(žžyY¢®C©X-Žü£Yo•²í`Ñ?ˆî¿8]­½lUáØ¯¢)6ð•:EX”Ü óé³Àw(ìéWkÚOµä g¦XZ}æØöe9çzS‚uŸÅ0é3°Ÿ€:kHo˜?ú‹i …RÊZAéû&¬«"ÎÉ>£ï×è–¯çE-ÜŽ2Ë5æ2‹Å1ïÈ„‰s²|^8‚sÜY)œÙ9‚’ÇZH¼m0ž_Çÿ2y[Gd;òÑÉÉeô;‚µ¯9£Ñ#ã>±2ÏÚq…Ç«xnxúä_¶W¡OÞ'rÈÛV‹ýå>Ê!zA0 ,iÌ>yŸÈ!o[eD#Ê!z¹`ÒØß'/šy’>y:å•a{6\Ú•‘œïq¿wF3®0&«”p^œÍÃ9€Öø“’‰™òÚ°‚Ü"ȨlÿNdT¶­(£²oÁr§ïÁ(°¤1É!•m«ˆhD•C/ŒâB䎸ŸQ™É›¼HóRrg}pÊ)ˆNAôR‚È£Ãz|AÔ²OôIo$ˆ LAJA€S»–HÁ”‚8K³ ‚T ¢œ‚صD‚¦ÄyÒ¨ ˆà~ bFѪ-ˆ2 §ˆ:EÔ!D”è_DY?éD”S¯„N¥^ S¯º–HDé)õj–4f¥S©WBáÔ«®%QjJz™zu£QADéû©W´ˆ*‹>3ž!¡¯‡ÇïkhöUé:íe›¯åo‹ŸÁõ2˜}9{ë¾bä/|XC Üý©´x 0”2úül¸E•UÌ5±~Ëì ·ëŽÜ¿ðýr +$€a6Ÿ‰”ã‡sB£ÚcYЕLx-Ht1ðDÊF%r+D˜ÑA§lp¢Jä¤Éá8c÷¹.‹ûÂ0ZÊ?¼ªÙdÃtCaSé†Ââtî%2›ì”n8K³ÙdRé†Âàtî%2›Ì”n8âBÌ&{?Ý0c6Ý+°¨Î‡‹ê›Ô¢F±$bˆ% —¥ëÁ(°¤1/ªs©Eu8&¦k‰µëå‚Q\H£Â¢zýÈ¢ ¡ªî®-ê Ì8¦ð€I¥ð@ä9§ðô½ –4fÁ§S)< ñ @× >=¥ðÌ£¸FÁgV¤ðЂï^ O!÷½­2£ÑL*:‘ëó)3 ›‘[¶Õ›IÉÄ$ÍxÉXØ ÏAÆŽf,%] ªðú£iÆ*¬8X•ê±ülû°’Z’>[áç==IcŠÐM8>¹(³ö¿PM”^Ë”—“ÞÏ_ö^1c°:ó&fà§È½¦iƒK¥iC.NÓî{A0 ,iÌŠ»M¥iƒÅQ]K¤¸Û)M{Å…4*(înEš6­¸—MÓÖÛuÎ1a¥Zsª}©4b÷Ÿ†ã9ÚPü¨Ä\pRðïÞamÓ¤º÷ÝO¯}ã/£ª‘ºa%¡ GU#5ƒ. äôè&h¾“_MÇïF[wœ’Œ"@ÏçÖ—¾ÍæpEšÑžzëÏçjyå»~–dåÈÂ²Ž¼§™Ôï^1–Å#;圿=˲ ‹$+†íéÜ÷ºÀ7h‘8|” ZÖ»¼¯bËQò«¹ÂO÷åçðè´ÿ <:J¤rj”ÀÞ–®{tú^ŒK“G§åä ŽØkÔµ`NßË£¸Æþ%çD{tH‡²…"Oú¦.ýmñOúÇg¡¿M¡úÆÐ…¿‘6ìËÐËõ[æ¡O‡AY<…@è¦y‚П ô\Sá¡ìLœ¹a{okNΖüB™3ôoÊT™w£½eäšÖ0µ ÌtWÊtW€3Ý»–ÈÔ‚)Ó}–4fS R™î p¦{×™Z0eºÏ£¸FS VdºÓxz÷2Ýw¿¾xl¦Ü¥«¸œØ9C®£²óDý0}šîß2ú´Ä“ñàë«4:É'·ý†¦ã©ßL|®Ãz,¦í;õdäáö Ñv'ß`Ãè85w é s`®Ð/{ê(ÆtúÝè5Ô»eÖÔ1žèít8O X(.mÃ÷GI ’ôWKlñ¯ˆ9&í8¥ÍR¶±’1hídƒQW䯫R’Iæ†hý’r”ú36$öÄ]9`Ìœ¼ŠJÙ4¬ÀkŽÃˆ¶’7ìæJ—è%©’wƒÃS›9¾â‡™Í¨PHM Aü¤™¨‰D9Ú$ŠO<5Úh «÷@¾ùÖ#CµWïðŒuÄþ£,‰uÑÝó'FÁf’¥¥ãhf84˜†ã-RΤ fCÑn0#(šfâǼDf}Fò?r"M]Ø a±–gÃðȉ š#ß™júº‹RÊò°ó9ÈžraÄÔº †ZÙt4ÇýÊAèÉй‡`WD©™ô`ëá&tíI ²WëÑ ù¤¹'¡¹ÊB7®”¹Åóêð7cLRâ 2ÚuCÑ‘äú{Æ 8©¦GkÞà¶Ã±ÃDlèH–™Ño$¯äoh.ñ\Û­Ì;(+»»«&ä•éï3Å6Ë›«àbüò~¨kùõøå-RßË.G™þš‘W†¿aÂL ~ Ó€y½IÛ6¾é8JøãÔrND4'bÝÙn§¼!«¦$f:n‚“Áе(’Ï@óÿZê+cR¶`Žñ-óYTꈵ»¢ßSA5 rÙð—Ÿ<¼Ú‡‡×4©Ãk$>XFƇ·ëe—£Œi^íR‡W[LCÛøð¶mÓ›»åáÕþïìí(Q¸Þ¥4þvõ†2S¥$bÙðø†².ÜPÖ§6T»æh±ˆ7T×Ë.G™þrᆲ6µ¡¬Á4¬‰7TÛ6½©]n(ë^aC¹©CУ‘¿Ï›Øôé =‰»áºoß84XSnÚ@nz4Îæ]ý©ÍAÏC›#³ô4£ÎÅhõ>´¶ëxxW®)OÆ‚ëýëÜåP?]~úøÝû-  endstream endobj 3627 0 obj 10884 endobj 3631 0 obj [176 /XYZ 32.2500000 542 0] endobj 3632 0 obj [176 /XYZ 31.5000000 542.750000 0] endobj 3633 0 obj [176 /XYZ 31.5000000 742.250000 0] endobj 3634 0 obj [176 /XYZ 32.2500000 740.750000 0] endobj 3635 0 obj << /Type /Annot /Subtype /Link /Rect [60 778.250000 139.500000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_external_run_time >> endobj 3636 0 obj << /Type /Annot /Subtype /Link /Rect [60 771.500000 160.500000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn4 >> endobj 3637 0 obj << /Type /Annot /Subtype /Link /Rect [60 764 90.7500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn5 >> endobj 3638 0 obj << /Type /Annot /Subtype /Link /Rect [60 757.250000 139.500000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn6 >> endobj 3630 0 obj << /Type /Page /Parent 2 0 R /Contents 3639 0 R /Resources 3641 0 R /Annots 3642 0 R /MediaBox [0 0 595 842] >> endobj 3641 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 3642 0 obj [ 3635 0 R 3636 0 R 3637 0 R 3638 0 R ] endobj 3639 0 obj << /Length 3640 0 R /Filter /FlateDecode >> stream xœí]Ë®#9rÝë+´ ÕÉG¾c€®—/ ª/ /Œšî˳ðï;%eêJLfò(øH]uÏtÕU^1É`0^Œ8ñë?ûÏýýcÿëÇoÿ³ÿ1þùñÛ®:´uuþgü÷—ëtwÿ¾o»zÿã÷ÝÏýÏÝ×Ý×á¿?wç/|ûø¯Ãßþo¯÷ÿ2üÿoûÿáÃ?¿tü…ßw­j‡?ÿûôgߪáoÕåÏãçÝýÛö?Ž8½nœÌíÏ¿¨¶êúæ8…WÿÜMËT§ÿñãï»_Ï{‹±ªíõ^Yc÷ª·zÿ¿Þýå¸6n²úz²zo÷ó Ÿ™œpwš°Rà .SXYmïŒýª72è‘ êLo¥÷×/Ôƒ|KMîk¢ÑÐ; »®Ý_¿°ÍAÃ|xosd ØŸ§núõÓËÒœµ ñ Õõ§Ÿ8BºfüþýVêí †¹Ý!óax¦ÚƶÕ#*¤ÕÃktÕƒèá?u+ºÎè*ÂàÊ6ñ?Í\š(Ê4Ê;¸äΪ¾‹¸³—Ñc_×6"Ûgkgáàq¥…¶­N!-êNcL„­y>Âà­ŠÈT§™‹Seâ*<ºäæ¶f"P…þ&"ýû*âà§™‹SeÚ\<ºäæöz$Ð *bÐ_Ç£¿QmD+â4sqªL›‹G¿nm] ýý!¢éf”¥}aK.£ÇØoSÇ3ìÎ3—&ʸÝxpÁ£l¬M/­»º ƒúM[Çü4sqªL{;=È5ÅS9rô:Õ<`xZ˜ê*uwÿûåg}èºjßVÇ?oü|t`Ó_¢ã'?vMwPª×]§.¿Õ^2ýt~ÇðûãÏÕñkûÛo·}ï¼ãøÉÝíLŽŸM3=r»Ž»¿î>üá†&jF…‚¨?=_üð}÷ë—~¯šý÷¿ Λpúãû`)Ûý/§Y´ûïÚÿSU©þûïÛ©êдªkëÓïŸüvzÒ]>¨ìé{°æ„~{¢Ï¿zèúªÑõõ“ϧ'õÁèNÝ>iÑwMu§'æPÛæ8׫Ñ>¢¹áÑ*ã.pöþnçþêì8#ø>b4ÝÃÑðºð{àNª Ž÷ØCƒí±RgV5ÓÜõ|þ>¤·ssG–tçøZÕ²D÷íõÇØcRJW·RJ«{RJWJ ŸÌ¤Ôñ·ÚëQ¦Ÿª[)¥ú;Rª^å¼cøÄ•RÇÏÆ™Ž£Ü®#³”Ò͸ÁJ)̰úüD©‰“Ö3Ìä–82ð=ºƒßÁ£¹ÒÉ#'ñ‰$·\ø|òØàYÃP+Å$ž q8ˆG­0$žiL?¬áðÊb†gt:^à’&]-»u;JXSëë—ݦ¿•ݶº'»­våêðÉLv«½eüi|ÇEv›îžì6­ûŽá“™ì>›fÞ]ËîË;²Ên[OÌg †Lá‘ [âï`l ®æ`ÛŒ|¦šæúƒÇ9¸în9¸îïqðàË9Ü5|2ãàãoµ×£L?u·\·÷8¸nÜw ŸÌ8xølši{ÍÁ—wdåàÆ>ÀÁØ^ð¨¬Ïayн§‚}IFè!eŸP⯋)ìÅ`ýÍxe3‹¾X·÷%Új¹ÕÔ¯©¹þ`­ÜZ<£ÕüŒv{mïQ¥Ng´7ú6ZqtÏDz[7|2¢æÐÔ'z_mþN¾3I‰þÐw§/½}çÃù‰¾ôöžÏèIõ ~§A3¨¾ YOQžõŒÒèu*8·³‹ÞN$¸zrfáþÎñ¥ÎxTîÑÏ ®Ô3·êöðð,ŽÔ­Î,Þ®Õ­qy:2ŒúàJ¬—Ö;¶ùÝWaŸ^Á¸Æ¸Ùõ¡êûmäV==Z3ÂjÖŒmƒ÷‡±Û×G[=Ì„¿ƒ#8AEØ`"êK1U!;’‰l{¢–e$®·ÐÛr'>…‹ӎʸuÕÚö~DUX[ãêÂ× åf€y/@¤âƒ9„àèd7gùw#ûÝ]€Š¥ c¯% m0nÏ ›•ò{fMÐͳ§ø04Àûƒß#’€Müõ‘“<ˆˆJQUVoH+2vJ@rJHš p]F­ÖŽ8ȉ…:åñʪÀЎŒ@“qÿ°¼$L“Åê›e²¿là5Œ†ýJ"­Å³@<7âF†ÑО€}ŠÈÇǤW‡‘e㊩\—=\€=lM8 Rü‹œ‘Øž[[ÙXKª•_ŸÜŸ0 {„" ‚ŸxnLÿ9ecD ×ôÆÑpÏ&u 8Äë/!BZfŲÆ"C "()â ËÞ+Q÷‹Î–±Tà&ÿÙÈoùÈ®4Q„;YZ@…¿-1¦ªsƒŒ)èÑŠ‰Ò磨—+ØÔ˜hp÷¡©É–œ1\°^G1n J²Ó•š2øK¾V8%žÉÞ*UóÀÛ´ÛòB: B½{07šO¿žµ“»%ä‹Ç˜À“Ñl"2Ph!‰rO–¹ë8˜\ð;Ø%Cp³²e«<™Ú^WÄÀœhÆK© LÅÖîŠMÇˆŠ¨5®" (œ¦p$Ⱦž5Ês£ò§1xxSö>…q{?!kÇ³Çø;gQØOuBkž06øÌ飌)àp'ðëËBb$¿Š/¶r »ïá–0 ©êÌ='#–EoM…«Û°Ê`°yˆÜ;A:»/’ˆi¦’‘Ôýz€CΤJdÕ=Pà³üH7Ž.,§˜,àÞÓ³CÄ~{Ž0ñª,9U†OâÍ~Àå8ʪ ù}•{Ì—QÞæyC´OðÉôDµè‰†ß©à ÆML?¸5®\`²¨d+£%"óâ}ѲJKŠ$m?é&ÄW½µ«{î̲[˜‹£DTh” भõˆîôy.ÏŸ?IUAšÊ'’5ZZ‹<{"ïqSS%D•ì R7ØL(¹gvðãÅ.Û,Á`ã¸] )U­;„ÊW:úܦÙcû9…wWŸxAi³çîΓ†/hnþކOz‚¤A ŸÀØß à{Æ#Dk¼?xðz<³†s…ÃÆöÔÀ÷lsOñz„÷J æ‰ïñÌ `ù†ùÍÃp=ñƒd£-¦Ún"” ŒúÝ;+úŽ;ÿMv\,Ù\*°C8=É’…RÅ2ð™Àq½\‰yTàs—lW¢dáRæ=cå#Zå•Ê+™Su[£xœ¹±.˜:L[F¿xn`D EŸ! ’ë(E®Üc)ŒÒ‚%‡Lú²¬ý^L^Žlža1xAQñ,•ë*n Š(eV5I¦Mi™Ð‹†A¦bV?Œ¢»KKÌD7‰!õ,ë« So†$ÇÈJ-ZG‰àÆJ.þ™=iJo\lMãH摌ïTQÕ•uè‘ âRuî;EÀ?…ŒT8Š%; ÅxEaò\—4ÕµÞž |ù.YfUëì<AÄ}ïŠÉÃIÃÚ53^¦29‘Bŧ¯_Þ&ºýËì !$c@ÉV‘zö' ÇÛg ˆw^¥Ji7U“úH¥ØQñ_•KÃbBq©Ä:.èÊ Œë|hÝ:{¿‹“¨X’Ö= ï®4#†Òð¿i2°«7urK¬@ä —~Y-Ž…qØóGÏu“§`«%Zˆ`ÊFö¨;O‘Ä£õg‘JÇ!N¶Œµ1Û/¦q“¥Hp,‚Ǽ9QÆUQ}q8nÑhRÉ1°TåáÂÈU©„˜Ÿ{¸âl1âÊl¬ƒÜ’÷ÓGmK"$•Ñô‚êŠ$< ï¢f¯V®&MÕá‘k ÆöE(F¦îKšð^˜΄Ñb+(AE•»pØ1r; ¦¥l¿6¦H‹iŸÊ¡·FÅážM"/1VÃâ-CL¥:VR¾íâF;åç²9í²­ÁRµHvi/á½w§´9 A×{3ÍVd»Ö%‚¥²9š9Û‚(ìÐccË|¼OÙ#TzL½˜màmãè\aý‰eV<ë£Ô½™ÞŒèŠeû¥QmŒXqwÃ|BKgždü÷dô´ª}“ÃïÎÑ »ó¹#EVŠi^5!±qu­,³'s±²ÛòTúiEaÄ©¸9Î$q/ÙO â|]r; # ¶[H> “äp#+«PD¡„+30!E£ ÉÌVÑ|/Ù`_|ejÆæTW’€ÑJL>Ó¼[–ÃÞo0š0s)˜V—®Qs—ÐóŒjQú1•“ÉŽ‚¾¡µ¨‹XY›žAa9ëÙz]ÛK?ûlêâ™Tª¨Ð—ÍuœS) ñÒžòü%Ö Û6]Nò ¹zMÕ5n›i¥‰ÐCQ&nŠPü,q[Š˜Õ¦s]Ü||˜‘²Ó òÕ"¥Jݸ5Q%Š…AKduTÁ¥J"ïªG/òõ}Ñ”M¤žK…d€pV]ãh¢—äYõžGꜳë**­rvG†³äã¦x®ç³'/ÈÊ™9Í1{o Q1YæM"ŸO. Öíµ½Ÿ™p–ÎÍÔ v-=êX{» ŸŒ;ÔÆÚl÷¾Ó£ïŒEU‹¢¨wF›L’;O zϸ½x´øqÈ#œñù•©@þ™kîÐÊLI„r’Ý®ˆ8‰Lÿü@2ž Æ:f`œbàoÍwÐcqáÿS]¥>ÉnxÌ\&æÄ4˘ˆQW‹QwX©q".¦ålãÝ<ë„ËÅ4 ¤Â͘¯¸¬õ–Y8Gü’ˆPåpä‹§µz7&EQš©ðÍ DÌðø)0Ƭ zâñ°g5<„Kâ&*´ŒmêYS¢à±0êX‹ÊŒw‡g¼1*a€#XÄa7šAh%`Èb{<³}"*‹UÄİ­†£d®­KV93A|M·‹Ó,¹òÒ“Ó†Éîvò ÝüÁ<’˜ª´®]XÅ”íÆµ \шڳþ8s²I»ØÆ™g³vëÅK6c‚‚-íÄ¢@Eu •¢›½’BF©dli_w®ÁñBòÓR¡zQ§@¤£$>!õð­C‘‹±?"cø”’N·*ûH¢æE¸3¯l\øýåb#++F³‹p:yz”2UµÊQ­ÙJòÇ—d/œ“µÈ.Î+;‚¢S Çï“þÖÍ„Ù/˜¨pœ(4ÕsНC{°:(Qëú€ÀƒLV}®NÆ‘“eíg*Ób½ËútUBüÇ (ʺxqÑ2¨+ç"«mm¯íBÅ E­±dH°LÄ‚ÑÊS§.«)`îì¹qT©Ïû±°, æ> šnÁjbÂM‹ ¿ÉjÆ™F$…GÁ‰ýQÚuÜ$ZÍRI‘L€v}M«pjÌ„ Š‹ì­"dOûYŠ¡”Uà©öœÒ¼¤×£iqZô5Üy22Ð'ÖÃ'_à{ø8ÏÜðhŸá“Ž˜[ Ÿ¨„;lì­Ø ¢íë÷gŸ2\]am×c«Ï­|{£Xk·oŸÕÚ}ñò†mg3lìV€‡V0.ä‰2á=!â\ùuýxŒ‘—yíhSÕËv4KŠ”ཚc–>oɧºkÙ¨ÖÁÑæÆ à{—¢c%Ü’™ªßÂn%¼%3ªê—Owö[2ŠK¡|)ü–Ì(}A/NpK¶b>öR!– Væ¯41ººLæês@„¤Ê|:€Ù\¢³º¡ÊýËOÚ+ÌŒVŽÙ¨ÕZ¾S Ô³‹Tú¤¯Þ>Y:d-*šãìéÒíA$lS˜m¢ Ž¥¶ˆò½Æô®ÕÃá‹ÈéM;ãôr‹’aêäÇ›e ³EÚ10„9†ýpx„ëˆi]†ed@ŸÆ%Zbï˜=ò¬+ý„[ún¹ºhc>SÛšªù“,Æaf“A©3XúµÍðºŒ|]F¾ñl¦ËÈ¥À ÖËÇ‘±´nÚ–õ1ëCUã5›G(ТVp:‘N5ñi_yŠ[E+âŸÊÅ6ªsŽJŠ*MtpiÝÙäÇ‘ŽëëP]…—üR âr¯­­Ã/0öbV§[÷üD}gí¾S3™é/.Ëõå7‰~ïl‚ügJµîYO†s™Ž€ÆhÅ17Ù4ƒ–È P¿Ú¾g_I €fkç” Ø#Àñ]¶éâ‡h^í½?¾yÉáÖy¯ø¶  e) {sÎE8c%1Àl¿§e3ÁÖ£‚A3-‹0d;,ð ºV//-¿¸Ì LÖ³#ùÛ5ÆÆôÎPZKË–¢Ðb‚ÉáΟ“èD'2»¼ôHkÍHGDDq´`0ûqÊÓÆFäŠÁK—Í6á;xDí+øÒeqª'^p¥ÃX±¢ŽO@¶·lfÒìp{D½D‹ÊÈ(_O1â s1vU™Ó»H´|‹ê‚Ub*ðíü- ½ƒÂ8ïMÿntþXˆH®žRÀðqÛñ1JŸŠß“”Þè~¥ý•/Š¡74^)úþHÜ‘ó“=9Íp=C]`P>†¢x´DP"%CäÔð,¤Ê9Ç3`><<ŠéF¤|Éûhüü,GáJG/_Š:˜'–¬1<ÒÓ Ÿ¸RjL«‚ßòƒßzh€å~+t0Èî¢-–Äj48ÆgJ}]±nc¢ìG&aÎÆTÄO01å™Ñ0Wàõàz5†n›”å°a„ßæ‘åpç<ðz²ÚDÛ³ ¢ZËc-Ó…gí±äñ.ÀõhŸJ%ùòÛ5IŸd§Ûû‘|ùi½’ °3ÇÄ¥Õ#ÅðΉFG?~šžé&ÌJOA³,ÎL@ÞÇúä"Ù›gÏ%$óž€{¦oÀµþèI|H”pI¥”;è¹±--ÊŸ†ÆŒF•ŠÂÜP÷LœŸüð@Âé•ïàú½®”«ß/°Yþc— ž/2ØZ¸›l DªìfYК?Y*Õ«h/¾¹)[‘ª´, >8ù8j>›Ò®F-dbk~…,Èûµx<Ú –*—V¶âV´½U™€]*"C›Êä+]‚2E=ÖQ@^þkÆÚjj+óŠV1Ѫ¨¥¾­³Eä¶Éà{°XÁµ!Ž™gÏDõVÀóVÃ]Ç% üx›ö’hÑμ¾Œ`QÙ§W˜— C7ªE#1˜0oÖú_ë*88›ŠÌ¸xJž}”v²a}ÊO’…ªãÑøƒÖRº?ã†ífn¬ˆ9•ÈGMŒaZü—þ ÿ1:>IŽtoµ+BKIÉŠ€¬\ï5EÔ³rÕ•°wBÀwx$¤ï÷°dl´ê~\—OÈ ¬é°„óH‚ÿ=ø&Ù±ª<3Hxšš7<¨‚wkä¾4¹ EyNw* Y.…òÛŠØF0 }Ħ¾´ò…––Ü|’¼Û·›ItÂi²÷ÅÙÛÃØó†ÔS·« ‰ÛÂ~à ŽÉ0$U¡kÁÄ/‹=Y!÷–˜iž0˜7âR©Ì>yµ©ÕWN*§‡¡ó}¦H™jTïÚ%åÒcö„ï—Y··©må.âåÌ}—…®3j5É(Ïew¢ò©lú1szj?S„¸Š›Æ­·/lU¥ÝUl4~û’Ý¡ ¬ZWÑŽÉÆ§—ÿî£{_þuéVÌ®»793x3•:f/ïõ%L«ÆÂÇf›ßÌŸŒ6}³§¯6_A­ð ½Ç,9/÷æöe\)BmÂI“ömJœ¬—>[à(6q˜ë²;ËPx4øQRª ¥_áâ² wüû0ã[ir/® ³ ³À(îí¤ƒ‚¬æá…Òï^ç°š‡“ñù#j4÷ïœLY¢ÌÎRyüÚVæ0ʺuŒ«!’³¾JXè_÷_wÿ\ç7 endstream endobj 3640 0 obj 6388 endobj 3644 0 obj [177 /XYZ 31.5000000 89 0] endobj 3645 0 obj [177 /XYZ 32.2500000 770 0] endobj 3646 0 obj [177 /XYZ 31.5000000 89 0] endobj 3647 0 obj [177 /XYZ 31.5000000 770.750000 0] endobj 3648 0 obj [177 /XYZ 32.2500000 402.500000 0] endobj 3649 0 obj [177 /XYZ 32.2500000 353 0] endobj 3650 0 obj [177 /XYZ 31.5000000 572 0] endobj 3651 0 obj [177 /XYZ 32.2500000 311 0] endobj 3652 0 obj [177 /XYZ 31.5000000 404 0] endobj 3653 0 obj [177 /XYZ 31.5000000 354.500000 0] endobj 3654 0 obj [177 /XYZ 32.2500000 570.500000 0] endobj 3655 0 obj [177 /XYZ 31.5000000 312.500000 0] endobj 3656 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 544.250000 155.250000 551 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 3657 0 obj << /Type /Annot /Subtype /Link /Rect [366 104 414 110.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 3643 0 obj << /Type /Page /Parent 2 0 R /Contents 3658 0 R /Resources 3660 0 R /Annots 3661 0 R /MediaBox [0 0 595 842] >> endobj 3660 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 3661 0 obj [ 3656 0 R 3657 0 R ] endobj 3658 0 obj << /Length 3659 0 R /Filter /FlateDecode >> stream xœí]ÉŽäHv¼çWÄY@GÓ; ¨%S€ Ý€„„A÷@¥9è÷™ÁÈÅIó [˜/Œb7¦+'Y$¾¼Õž½Ÿÿù—ÿ8ü×ß?ùå¿M~ùå¡:ömuþçðüïOïa‡ãôó¡ÚÃo<|?|øöðíôßïç~ùò¯§Ÿþï`ÿrúß_ú÷Ó/ÿ<ý¥ç¿ðÇCoúÓŸ¿¿ü9öæôSõúçóïÿûáßþáð·ç'^^7 æãÿÿÉôfèúça\yõ÷‡Ëgš—ÿþÛß~>O@Ø[ê¦îëæ`šçÿŒ=üï>üåô‚Ëã«ãÐMÿÀŸÉ—Ï/ªîôr3R¿¹©ëÞófÛ7m5ðgòͽ}~uÓÖcÇêÐö³w¿ü«yº‰ððÓÇÇ{øËÈÕ“bêÎxyŸ=Ë•<;|4¾ñÍmeGøæ±1¦ïš¾ºEp½ì—ÖÖö¼íiWÊ·ãÛã#ìõ¶iªx¹|V¦“äyúéN3vU?4ðç[¶UÛá èÍóÕŠþæ!Û›ûçeNøZÓØváÍßBžwº×¤úî¹ñó¯??Zwøõ/§q_øòǯ<œŽñOÏFT3~ýó᫪ÿéðë_LuìNƒ:™šÏïåJÕ¿\ŽÃXu¶­Þ]éà•æåJs<½¢¾ö|ÅŽð ¯<¾\iµÌÇ+_Ð{ªöåJ}l›îùsÞ]ÎïÁ¿01F<8žùƒO«‰±ÙóÓŒ¹LÆÛ—2sÎÌüR;À{$kK, Þ¢žé‹ G`ÌyYê˯؀f€ŸŽG§ËÔÄ{ˆå7Mø¦ÅcóŒŠ*fÁG¬6>„ø¨áýæY9fÞðaêñד~‹¤šFãè¦Ù * ¯Lлöeüï>à Þ3Â{ΓkšË¥7±bЕŠxÏEÉvîV°öØ5/+áŠÖ¥§L£æcÂ_xÞ$ãÂfüоp:(KWÎßÑÇÁùvƒG}>ÖÌ… 3“_à=Ÿá¨¯¬eL7ÿ{L­l"D3mÓUFƒ68™ÈllºIàWQ‚ ”‰¥«6pŠ}R&4È„Œ°Vbæ À³a i¨À³”LDŠ1êf©µ±¤‚ßã±ÇðRº~f Œâi3#¦¡\|ø¡(A $¢JlÛÚщsç‘pp=™&ð(ñÓµùaøžæâOº8½šf¼!êü3QE|”°~ûJÌ5ŽQô“Þ»(µÄÿ.–o2õ(ΉÍK}~O°†PE>+—0Á¨8 i‰¨?M5S ©Í6…9³À³]OÖ›ðóS6“l̦'Ҁ؎òì%,Ôg‰üõ5µ«¯§,” Þ X20™qÆÙ|Œ-.A­Î$:G-Ï ¦˜ @èemBÊsê|—RP¯÷±µvõFpo,!Y+…h•ø¹â<»Ú·^«„ÌãßHóÞÚ(ÝôYXæÝÅjPÐ/{pÔ¥H¹K:on¶Õç¹/³5WpüÃåÀµý½ÉlÁU(`DõÖWÆUo„ÿÆ@ï(ØD*v½,§"ë]!-5$N×\׆ZömÆ-u·hÂÖ®Íî™Øõ¶3}žÙRþ£ˆÙ˜ÑNӹц{;uŒ .”ñl(" Fm2–n1 <†MÈ|K¤5‘“œ*ÈÀŸçåŒ4—VPN‘Ô L†Ìgæún*ej[»ç~“‰=m”‚ªÌîÎz*Kg!–yLqwt ‡ë}Åö“4ÒJEø³ã7îÍQ .K¡8’2ƒTg9½ÕÁÌ4ëŽÀ¼E·Çw~FÓ^v¹¦yg ²cIW©’±¤ë—Ú"-7SE«¡%帤½äLg2£Ž¨ŒÁïÑæ=¯:¤1Ëj¬è³låúE§Œw…½+ìu‰!~™…K·•ñ÷˜-®²ÃkËS¦Ø­˜ÄS$™›N‰H›r‰É5vŽÚL&+ÖóIÍw6ü«ž<°–C-Ir|g"‘ ±Q^ÔÝ„¸Iµ{Ò™LH_‹¸Ó‚2bPƒ%þÕÍu »|·r)Ï#˜çU×ΊdÓ0Úr­BÖVt¦²Ù©§)èïÅ*”©fŠ“¼&TÑ1ò”†Å\ÚU`”8cA•¤ÚX9¾®íº™®•[r}›¦¬¤‰BaIC4ŒR¤âV¥·‰<Ádù<6EyGÑ‚MÁ>àq©™œ5#²£¤Å!°õ}g’5ÒJÂ˵j©ïÖ«XÅOÄ ’_ü& qHü%ÉCÖËIjÏBª8¹ž v×Ö×7)“¹—fÔµu+Z–‡dŒ.Œ°bŒáõ§OpÐj¿‚ÝãïZ(f…Sݹ2"€•YÚ ,$·•½±D[p·›Ä ÖžžŠD‰Kª‚p±\&2T°uvú¥øÃd¼ºq³îŒ½î1QŠÍ|Ä${û«0Ý®·ÕÚh,Š Ò ¤#¡žµÌÞ!~f²š«a¸Ì6ôá%¡,ÊÈ“3¤*ÿ¾3¬‚¸KUds6×çn«›¸ìº12 ÜU†•˜Zfè5soü¶ÛAçk·° P.Õ)It¥P«üP-›1Ó¨ÛcÑ¡ƒ€bq{""˜%®w)c³Jªºözj*F ¥"†™­OV‡˜ãÒZˆK£éy²Ï¸Éîõí"hå$Œ×ÂðÓl¿^±mªX !msúøÝr¿ÍÀº ƒÓsúˆÊd&ü&ýéº L⃱6%) [ø ìiµ>Vß:<·iÍ®g$zÆ3 PÈiÑ«5Çser›êµ±¸à\Kµ’ÿ=Ì Â¼¸¢›I0 \†èJªž<ó¦€ï¥ñAW²•Æo«pdO€lÞÄ$ç4ƒ£.5gx›`Á°ŒDÆdÉ%š³Û Q‰a3ÚB€ |&üÐ&W¿ÃØ*w}Á£ƒ%´  Ž`ÌšéÊö®OÉibƒûDá~*’¡…nÉ|QÉŠ4™Î{ bq´×ÓÅzÓ©x(¥©ÏÆ œ–‰E9Aí­E;1ZôŒ6\§õÏÀ¢`?1ânµ•u¶ëD‘Šî>‘ÝW¼·þ!\Ò8·Æ×‘´½©x®ó’æ +­¦Bc³5ºb`›Zf¸é­}„#hᙀO‹båÅ,š>7B~¯Ï´ºi}‹± Ñ '¹i ·u[ñ’$®¯ÝRê‹ å0Ñ„®*Zj®¸U*ÆÏuâm-mK…?<*sä`Ü@€¹Š³¬Xøa$mIEU¾gGÒnº±f‚ÀÕk£kl—&ë}„õáL6ºö ¬Ä¨MM…bcÄ‹”·'¤õ ¡•<ú*†”ŒÞçPãVĸ¦nwÅKpÅÛOÓf¬¯ØFñ˜o¸±ÄyHY§ªx½7V‰yÉÀû¤ˆ­±š eN•3›–Ç'+"07µ,g>šÊ÷dëGw'¨‘ÝØDAˆdÅ»éU€éE¢¢ÊL²Lllï¤ünƲ@$F¶È ¿WÝ”XuC1ù`'åUeªâçÃM„·%#±ìbE\Ð2%‡rÒ´ ãjU[ ï -˜ëµR¶Ïm:—‘Iž‰$¼$q"{w*¥NeÌ̶[7Ü“,ÂôÖ†qÏ[í<ïy‹Uºð‹.GÕæ:ò3òÆ-]ÍorlÊ®,&^“a¢o]M·GbÖØJ{$†ŠÄx´¾´U £rkL±®˜Ïì>â:M7=¾*˜©XÅdÞP`•¾¡2®ÊÞA‡!×Kżª)2`„‹J‰KäÄG#”´=Hòå+ öÒažºñ²H U©Ì–r±o­68\rßäDu2%#O·I_øWœj}ö€E¸>û†O™£ÛATÀ ÆU DL%yI½jIŠÖíÞº.)Ž>0’:©d ~-½'ó¥R„¦ØgY/“’•ÀHÉ}Š&lÚ£Ü%F¹ÓP7ÄDwõ£ë:2î’1›u™ç]«}RSSµÍ62¸aâŸLy™¤6 «t†Ò!ÀÀJÅÿz÷„T×Òx bq¯]{sN3ù´z’™(PÑ8žõñ3_½u·Q.Nûâ$ P·ráƒ|ü…c„9aÏ¥‰ÄLÕx2;Uüt’µ°+¸¡Š¦°–hì®-2‘Äm1þ*gÒi,Ž* ñ­‰ìiÂœÔ 6AŸþã™ØÄ©²©xºD&SG¥ñ­gŸ+ZÇçWµÙA©l½V|l3*ûk_» töMM±ECÄDSí# ‚CŒÀsÎñ)‹UÜT´/VÎVýEœ¿u)(®m'!éĨÝT)¯¸x yQp®_ í/Ú\‰Lé/M7çTÕu=8ÂidÜËx‚0š‰èÂ!VÌ‘k±¶äWŠ$}d/§C(€!ä{ý–a¤Zª¾%‚²ò£¶,ºõvo| ;Œ«a¥¡´Ø0“ìØ‘½Zð6s  hÉæéüôׯíU ¦Ð1ÊNËäÛB£Ðú‘0£ÇðÇi!Z#)Y·ð ”¬ž.ÚpÔæ|ÏRn‡0ŸÍS¸1ŽçÀ³>¸† Æ ñ¼Qø:n0J 0UT0#î½­ëÕê§?>Ä3Û‡¡aê(ˆ^¬ÉúÏH¢v'!î)´IöT>•–Ç^+a›2¨Ï*ÌQIJ„¸k÷ÙÎ1ìTœdØTçb#Z4Q%[×DUTZ§®qµ/sºð®Ì€–ÐÖÈJ)®6Ð9'ô Ë-bG2ÎpHycõ­'â#û‡Øæ;Âí®)ô“øÔV›‡ÒË„Ôå…lÈ å³Io×9f·vKH00ø[ìe%#®d¬< ?o~¦´˜¸:VÞÀ öT$«RÍHêøCÈ!ðä|Z¿s’Mùû”e;)1ucßZט¼o»¼¤ÊÑ;i{Zņ?ëÔ4pÕóg@wÈ_ш…=w]xg;~¤¸îÜP%ç±Í5ÀtdD©†×ÕÑW¥šX¢Ž´ ¦8Ù)8µ+7Ï.ÉÕ)¦VCáA3jHó6Q½-f°Þ¯1Tí°Z{Ý]÷–\LÈ©lmL\ÜÃjoA¸fmwrfaÂp°Í2µÆ‹ <}ú啟^§£ùhöYxeú€î8ÙO³^ºgD÷Lú“Ð~ýEO™¯?Žƒûü'xÏ—ÉÜCMÓ]CÐàtðÛáâ§M%ì þÒ1üŠgÔx®?£ycž6Iœ¥§Á/Þñ Ô¶qO ÜGÕW¸ðƒó1 Ü¥v>)ÖÌUóSlëirýë¾¾ê+…Dåzå(T@ "1GqÁûå3–ïü›UënâYS2éÝÂ3TÆTÖÔ_ážHÔ¬ÃõpÎkeækõ<å/3ÞŸïÿãÁ6ýû_üþðK¤Å~~ÑÇÅÎg(T”®Ð?®\.guΜ(Îra¡GZ_hYÞ²äV1 #뜊g* Î4¦BŠy¦™§Igóa.¶–®Xx¥†W¾ +SruáÊäT,\©ð{:øžGøžÏáO«à÷L£ŽœêÛÐw[µC]ܶ²xxQñæO«àæ™üŽ¥ ð<ÄVœ2² Wjø´ø-Dú¶è›d%”ÙÉ(âÑPVi*ëWÒT?^ë¤IY¥¨b7— cIaC§˜ÉBñµö{b°Få>¾„hWø`”PRÐâݹÅVŠÀpc *e§‰ì¾3¹ªBÿ*"Aàs¬Ñ¦az.zf¡Ç”"|5u~’*eé–ßT™@²£‘öB G:Ť1®F÷”+£Í!$ëÅœT-íjŒ#;êÖ9‡-p»ùŒlá8YÕ£+V–.…ñ+S»ˆ1¥¤`3FQ€æõÍ{(ÖP-¤h_à,>ä ï‚R4–WmuÕV² W£zoBn=¹ƒïcÖLËM…2pñJy]ñî-¸;–ßÏÈN=r§@Œ=¬å—PùÃZR‚xq'~ ØNõ ïLj3ߦ±l±’„'ÂÚ55?¢Ù˜ú†ÙÖv»f ;vC)~˜'À©Âf8ßT1ÌpÆÕò óщå7d7 eb Ý)@ö&u `5L%âr5Ó#/6%Aµé½üNh\:ñN‘zÌQŠIDƒïÑëõ&Ê¥†´¸Î›7†Ñu>0ÔæÍ,Ä—‹Á¶Ô‹ós ‹¿Ôƒ<Ç8vpŒáËShÏ[Trývf%2v+¯ÚKjqj""FEu¿IµÍ˜Ø°”¤B6u}}ÿ¦mI7‹¯F$BЃ³c¨€/¦ê¦IŒ*ØL°A 3#T-ÃË'¤¦ÊÁ0QÓ†‰š2Mãð¨]¾r†›Ê³‹™d–SûÅš*>›¡»lè9ìï`/û;Ø €Õ¹x¯"=UÀØwE¦¸\ûHÌ÷ìþhAþhКÖxF‰R_<£ž±1+GÌ^ê;Y¥ms¡7NÅ“J‹zL¥T¤‰LH~'kè— eÁÚŠý4bòDìžZäl[F -ÓŸ^wNSeý´ÁœRZgÆ,ƒ©:G;Þü£…ó‹“Ò¹ˆD¨Ê)m” ‡¡ŠK‘9íûÑ-©|Ê×z°²±Šîï CëÌ;EmÄ@xBEÆÜEÊØ×îI`pÖÙsXT…"±"Óï=¦ñ¤´Ki€Â—òѨ9­¯õVS%L5X•v$ÔB( Zþ~i¬"Q#>‡á%°Ù]×*Å #bÚ=ÍêéH\t·”ń;<^ÉòÄs°ò›¥™H&‘‹O•ÙO¦”\ÕS4Çè¬'mxg@LfÄÍ4 ö|ò‹ë¡à™Í&'µ™F±ˆ[nâé’¶Uð•(b*ŽæÞ‡_ÎØš*ufóæ"v¼·¼I*ê©ûbLŠ› 1ÕÔ©èM»æoO±w= µ‘Œ¬³Œ™Ûž3ºa ükï{RÚ÷ÄÔ]½¼#ÓÏN›t(g“ÖXÆß#·6]ø¥žÃ€QËñ¹¿.¾ãëú¦xçàî©T¡²ü奪T&c **iB¸ wœ2‡ãdVÚNŠ£@Åýµ¥c{ÿ›·+¹ˆB=;{õ8ŠîÚ錨»©çá;X2½6þŽç,a1Ñ¥RQ Q˜ðõ‚³í¤Š”)xŽ+åSõ ÎžÛX,¾g. ò7Çrý§ò¬÷nœ2*S5<¢ÚÙaès’`~}¨¦X\gúË`0ñe€%Ž­j-£ÏžèÍè‹îæQ!—6—ÓÆ¯ç˜‹çõ@×T¡åT›ªD¤¿©b¢âlíjKÑ$m÷lÁËoš™Ý]4˜›¡êÇz:rsÆ‚™RËL <*{ë'#ÙI%z@•ZNe8v®ëÈ„Á˜F›†â~«ŽlönÌvõ¦(Û¯xÕ%òR›ÛÍ…RžÀš ƒÜW¬˜Dêm®c*,÷Ôf‚ØbÝ]ŸB‰žLcw¿è>TÞžª“§ê~\›™A:ç8-8×±Ìñ!Ò¸¡ˆy„ŸÁ ~zÓÂ÷0æÏk»Áa"¸LŸ/ ëæúšøÄaôÏWwoð¬|)ÄüQ«‚Û,Ì—ð¨XiO­ ÑÇc·1N$³óñ=xÔxòá=»ƒ(hõŒÚm®¨5 (/æ»ˆÆ ŽN"ßôf²Þb³S=“<Ì:k¹èñãnÓ©¤ll ÎÅROɱõ,Ï JÛó´zªÝ ‘Óˆ"$íÃÎN¼lÛÄt~È_b/#*ü{tV„’0 —8^ uD²{];ù]Bÿ’!U/Yj¸ Ù1kùȰ°ï‹÷S©ÈÔ‰_-ÓÇT' …UI¡èÁ?‰iZG‘F pvQÛ–á Èšî²Ç%`È‹µ±ÝMŸÿbhú}.æ9ðÿˆÆÅâÞÐZ›LkKiÏ‹Á Æô䪾w4Pd䋘$RºO1–/_j?9Çv¬ %ó(BÊR•§2{hê2¶Á¾Qžµþ¨ðãñTbÈP€ÀxØb”#±[‹©ÉŠ©JÇÎÙ”{)’hû¤JĤE¢ÖTÚdoÝz._)õÕx™Ÿ½'aBmH¾<ù}¿ SùÒ‘ˆéDê¼ÔS¦FW ìCÃŒÀÓտޠ…»>MLsøÄ8 Z®ÏpäÉEýåN¨Ä„¨OEYo*°€VdWS¡ñ"WO—׈²«È9§@Þ¹²Y«={íL¹R£&nÆÆÑµÌŠ3«'&ÀJÆßýŒ¢ýŒ’I…nØ£ âMv@‚PÜ„14 45ÊgîVÙ¼5ÒS1s"(°l@jZš‹x`kc›ŒV”€ÔÍ'5{Ë`*´ºœ0ÿEÀæ¿Ûi8Øf¹ ã¼›úWœO¯’­ùhÈXxeZºî8Yïîià=#¼g’Rý\¶â{&y<]£äbd5³+¯ÝûÆÂ=xž÷œg§?ŽÃê9˜¶â¼M[qiF¿Â4‚I¦†}O>;xÔ“¸ô48æK=cáØð¼áïaæ®¶gÔ¼߃çÚsð—â{ð—>Á§‰LÝÁš“»à³¥Š+Çæ%R¶ pÔ±­¢Ai/©ü!ˆú>®ŤÃb—Ïj ²£±M,! )¾Ðº9©po¼‡3ûÚGKƆ•l¡AȽ“?2% Œ‹I™qüq}‡i&+ŸªoÓ¼5›ò¢ò­G¯h wÙr›lA8þ1©×V?sÔž&Qsö&çþñ•ºCW¦í¸ô4æJ¯<ÆVÖæ$„Ý©J[ ‘^eƒ×S(Ý$-\Ì×ca½ ÔÜîx‰c7 ¢xY;˜ [%'‘GoœOÛ”m@™¾&Mµ,úð–\ÜÂ@,µŒ•øiжA©˜(ÒÖî_)ùLrnI­©½JÒ:7"?f³]AÂFÂ硾ó“é1›‰:f+‡Õp(DÂ$g™¤ŒêèU‡z@¶q?¸‡zDãl,Òá5ôó¦SQ, ¦s¿@ ÔÔrŸÅ#ä8Öu‹æŒ®æ8ó5c“:2ì[%³|àMÏÞÌ2Y Ö9 æ§Yi¾ÏcãDY¿~óâ!Ia”ë‡e,1ÅTᆴF“,dâÓxR˜f1p‚ B¤Ýum»Ã ³¸¨¦¶Îa¹;·Äð¤2'~}[˺àÆ0íã!÷«¢ãÒ;¶2¶RãüK ÞØ:Dÿ’atŠ çHäàý(ÀÎŽŽ,·ïÆBýJ@hüÂñz-cÕvðXRUãÂC\¶„‹ûð=°pÊs.ºÃÅcù‹­Æ¶v³ñKD³ªKLݨèÛL»:&[ÒwwyE•u»^.I/çÏgÜi¥eL<‚©]x÷^þ I¯° Þ$Ly&O*5^´}ì=šŽô«Í„(œ}®VÊø!±x”*Æ*£ºaÄV¤l¯Œâ1;µ¥ÈëÉ]µMæë™UËÍk›*jýÓÔúòj…|‚ž¹ H9Éý¦›žVÝ€k.¬øS¹Ë»Ñã/–D1{½@³Ï’4…$™.¼Ø‘ñ‰ †’±´®FÃD¦z{‹Ì–ÄkþLæT0©ÐDà¶²¯¯Ô€x6Œ¹â K™‡Ý swÁ°eøØ KÙt—žç€áåcǬ…s¯Pax<çUxÃIìIF˜(xv4ÅR…ž¨¬Î<*ï¶#0è†bg‚™Ñ3UسÀŠM ŒË .É®…ʼnËl†›ô)RƒD…S-c4ò ‡W‡É8hûÿ*ŒK.<ÄžQ¿uãš<ø ͶÞÝd¤uÒÑ6•ëX^˜Í«—š!Ÿ^Þjä ©kÉ5­mt©…ÅÓ7-Aœ°ÖfÕS¤ ðާꢤüjg.“!"âF¸Ä¡QâfÔ¢÷H€Ew!>à%¦øˆÞHÀRGI³ïóMUÕˆ#b4ƸµI8 üZ~¬?nÛ $ný ~,ñ™¸ºKwvþ—ÔÀ…# ½;™‘1ýäÑÂT9\k. j{w•ë’ßõÛs¸ên1©ìæ¦6YsB3-Ç{¼`¦l€ÉU=3™k­£úB¸ƒ±¬ `zTÙ ÃL£ wI‰ç7šÉ’p®|…Ÿ.ÂjyÙ™ØQªl( £l,ö<ˆàÀ…k+= ä åð¯gÔײd‹­<‘ëÁ8³¤nó¨ÒŸ6ʾ=kÐ7&¢ó‘ÁTAô‘RNZLm ß3 »¥+-|Ú#¼¿t:´A#¨?'\­¡¹>#x¤x…ñšÀÆ«…×Þ³& •ú<ø¥¦&cÅ;ÉsšLø÷àQ×¶Æ3*ëGy}/×U}Ã^®àw_½’æëìkP³í6øÝ˜œoð À' Ë.86,S<º‘Äžÿ±t]Ý7ȇ]×ù¾t×u‰¥ï8ܰ—K×uéêº+ٰ浟Pýy]CA$ˆøD“í„Ý àÚf¢DZw‘ ‹ætà÷H[‡cWtýÅr!-œg;Gn^ŒfˆZrØ:*iÇIì8‰¼8 Eššê¬ 2÷·¹a“HŠ·-’1×'BÐ7e·ÍÌy®”‰JRd]›ª*Ø)÷È$|î pÂÌŧڄáIƒ¥ìæ™É*ÅêkÊdEw•x-A¨j¼¥õ5åD. vûâê$ckg¢wtO:Év½{¶ä{QÜãÒ!i««JÁ¨ÏÐò̸«¡%pò| 1ØyR€Ñk¬U«ZÛnO?Ä XŽvYžF}gç¾Sb¤”WM-†³GãöhÏŠ÷Ä•œCmœS› œ´Û þÖ¸¶p²²ñÖ^Ð-͹|“ÛÃýýDLq8,5Ç#¨;ôžæ|Olûíq™/ÉÇG86¼>pM=cÃëÓAʼnGw\m[Á@-…W»Žïä­sÊ’1 ´Mÿñ3Ó3 l´C.º”|½¯ ®ƒß{¬ßŸÍ¼)W2¨–“’jcl¬‰tÛ¶Žv¼ûÍ(&Äǧš(j÷`àmÊDähÚvÌY#,ð—*(Ä]‹ò-ø!X²ƒª®>íEö½næƒp;ÿf•T4ñ‡Êõöü‰Ãüª)Ï{ÂÌ÷ÄóÒ¾¬ìp|~ò3“íÉ}÷›ß~ñ(Ó8Zøe 7¥WœÔ™ë@‰ ‹Êƒ¿Þ›ž,C˜M‘™ê=ÂEKý’«u¨2ê]ÛÅÜÇ‹ØéÌøñ¦?ö£c6ð fƒ9O­¦ë÷÷LáÉ…§y¼®ó‰2ãÜ¿„Wðئ̇5Çú¼¬î)¬«£­êÛêZ=†m.—VŒÀtg¦-_]{s‚U„ÍÁ¸¦ðÊtL‚îñŒí)|WM‡na6ú¥ð{ð)aö>%SjhiŸà—öÄ*œ5ŸŽM[/Á<—VŸz‹®à§y$ÅÓ›¬=ý{ø~ª^™ûíÚ_XaK2¹>)´Ê> endobj 3676 0 obj << /Type /Annot /Subtype /Link /Rect [60 764 90.7500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn3 >> endobj 3677 0 obj << /Type /Annot /Subtype /Link /Rect [60 756.500000 100.500000 763.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn4 >> endobj 3678 0 obj << /Type /Annot /Subtype /Link /Rect [60 749.750000 119.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn5 >> endobj 3679 0 obj << /Type /Annot /Subtype /Link /Rect [60 742.250000 87 749 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn6 >> endobj 3680 0 obj << /Type /Annot /Subtype /Link /Rect [60 735.500000 102.750000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn7 >> endobj 3681 0 obj << /Type /Annot /Subtype /Link /Rect [60 728 108 734.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn8 >> endobj 3682 0 obj << /Type /Annot /Subtype /Link /Rect [60 721.250000 138.750000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn9 >> endobj 3683 0 obj << /Type /Annot /Subtype /Link /Rect [60 713.750000 140.250000 720.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn10 >> endobj 3684 0 obj << /Type /Annot /Subtype /Link /Rect [60 707 127.500000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn11 >> endobj 3685 0 obj << /Type /Annot /Subtype /Link /Rect [60 699.500000 105 706.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn12 >> endobj 3686 0 obj << /Type /Annot /Subtype /Link /Rect [60 692.750000 147 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn13 >> endobj 3687 0 obj << /Type /Annot /Subtype /Link /Rect [60 685.250000 115.500000 692 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn14 >> endobj 3688 0 obj << /Type /Annot /Subtype /Link /Rect [60 678.500000 86.2500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn15 >> endobj 3689 0 obj << /Type /Annot /Subtype /Link /Rect [60 671 175.500000 677.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn16 >> endobj 3690 0 obj << /Type /Annot /Subtype /Link /Rect [60 664.250000 86.2500000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn17 >> endobj 3691 0 obj << /Type /Annot /Subtype /Link /Rect [60 656.750000 85.5000000 663.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn18 >> endobj 3662 0 obj << /Type /Page /Parent 2 0 R /Contents 3692 0 R /Resources 3694 0 R /Annots 3695 0 R /MediaBox [0 0 595 842] >> endobj 3694 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 3695 0 obj [ 3675 0 R 3676 0 R 3677 0 R 3678 0 R 3679 0 R 3680 0 R 3681 0 R 3682 0 R 3683 0 R 3684 0 R 3685 0 R 3686 0 R 3687 0 R 3688 0 R 3689 0 R 3690 0 R 3691 0 R ] endobj 3692 0 obj << /Length 3693 0 R /Filter /FlateDecode >> stream xœí]M¯Üº‘Ýß_Ñ믟HJ" |¯}dÀ°,‚Y œA0 Æ“Åüý‘Zb·$òPbu‰R÷Õ3»I‰¤ÈS¬*ýý·ÿ<ýýß§_ß¾ýÏéGÿ÷Û·—⬫¢ûïÔþùeX ͹ÿ÷I›êôãŸ/?O?_¾¾|mþÿçK÷··?6ÿú¿“<ý¡ùß?Nþ¦ð/ýCíÿ|ÑB7ÿ÷åo«Eó¯âúw[þ_/úÍé_m‹®»~0ãß¿-2í0fºþùâ>S\þüûÇ¿^~í& ­UVµ®O¢TåIØRžþ÷¯/k¿6X9¬<•'ÀÝÃÄ7`yº•¥aQÊ2ÐöÓPܦAöÓ úùÖ§a‡ºÈ·ÌsXJ¯5‡Ó¶W˜Ã¦ svh6˜ÃUpZÞ ´ÝÐÛù³®³¼“hí0XÊê6‹ý/âDžMÝÿÿ}”¬l˜»0i^¹gÑÈÓmzV¥Ù¨çf¾7êYWv›žµÒÓž“ˆ SýŽ„¯iÙ .ª¶ÝVë×gc]®hÿÒB˜®Ôœj{Uôú’/µ9 a¥1âú”¶â~u}4Ï÷¿ËöµÓômåõ¡šw¦#Q'7Ò®•ñwüh4Å×ߌæDxs"Zø3òâë÷—_ß›…ªOßÿÖTu‹pùë{³Žåé—vBœ¾ÿåôÛ¢Po¿;}ÿÇ‹窬M£.·Ïu5¶«)»uVÒ9¬éÞùò½AÆí‹j.bA Ù/ªPŰ e®÷ÁE–c¸È*©§KÙ”xpiŸÒÃVܯr ©Bp‘ÒëCúpiÊÜHÕ.×>6…‹r \в@5b²îjä¹T—Ú­F¡ÖðŠO—šÒ5æ½³–J8X6sPp?,K5†eY†`YÖSÈ4%,Û§ô°÷KaYÊ,Káõ!|X6en¤rËk›Â²´nßÄäb }† eÕñQ{ÖuU˪XÔ$™žÌƒ¼*È­ÜòZŽA^«Èëj À¦Äyû”¶â~É1Èky£¤Mû(|7en¤bòk›‚¼6wpËU ‚?&¦·®uÉ«°+2˜œ{i¶˜˜:”5—¥ÜOLFŒ‰ÉÈ15ؽ)ñˆ©}J[q¿Ä˜˜L"¦FûŸôÑ”xĤ¯äÓ·2þމÉèÇ!¦Åà3ÆqòªÜ >S#ð™BÀg¼ ‘¹lˆÆð¹<¥‡­¸_Å|Ö†Àg½5>øš²n}+ãïØ|¦¨gáBá°–‘-\ÇaÍÙØbü®‰ðÑ-™fù¯ŠŒÜaÇð—EþÞÏ\6xø·Oéa+ý¯¾#LþFL7ªmÉþm™¹ÂÿÚǦð—Õ¬N®jȡǀÅJÉÉ#k§”5,¸Ÿ0”†²!Âð¶˜æ²Åœ@»}J[q¿Ì˜0”†šn•Û0š27R=$Œk›FYÎ…xO·‡`’¡ÀrÖ˜ô=b‚D‹ç€¢ûGæ ¶&¿$íœib1¡—Î6.m5,¸ŸÐ+=&ôÊ„ÝÛf›Ë6{Bªõ•´ûVÜ/=&ôªz55´%¡7en¤õЯ}lJ赚·0aPÀwä+ÁúEØ–c¨"ZÊH[y‚£xEÌzf·˜ÐëòJèvXp?¡ëzLèZ‡Ý3˜‹ `BªíSzØŠûU ]W!B×SSF[âzSæFZ ýÚǦ„nä#:îjþõJZ’qžÀžøöšÆùod=*¸ŸíØ¿mlÈ¿m<3ˆ±¾ûò”¶â~ýÛÆ†üÛÆzæëû·Û27Ò¡ûÖÇ–h 1K2EËê\ØKÕbÂJ#A¡Å#ˆ@’Y5GLKáo çÙ‘E5,¸þVŒýõV„üõÖ3ƒXáûë/Oéa+îר_oEÈ_oÅԜӖLáß–¹‘ýõ·>6…¿œ÷¤PøhÄ4U)ŠüÙµÔÄÌÀðØ"#€ÎîÙˆ4ãÕÜú,fÒù°”¨‡÷³ 5ާ°*Oa=#‘U~<Åå)=lÅýÇSXЧ°jjìjK<¶¡\<…keü³ egá‚Ëljae5Kpf&´˜˜Jç““J î'¦j·a«P܆õ 1¶òã6.Oéa+î×8nÃV¡¸ [M Jm‰GL•‹Ûp­Œ¿ccbªÌ­ïPJ1\±~¶ÿî9,ɘ¹?þRŠó›M¶7Ï`P\Y¿Syª/SY9,¸Ÿ¥ÙqôŒµ¡èë™[¬õ£g.Oéa+î×8zÆšPôŒ5S³Q[â±4ã¢g\+ãïØ˜¥ÙzHK#AFöL‰{]©F÷‚¯nö©CðÕ…Ä®4¥cÇ¥d¾î)=l¥ÿUŒbWšßØ•¦TOû(¼Ø•K™ù veÐdžàk¾»šåUØÔBÙþÏ*s !Ö ½¾BL –Blv: :ÍI–¡é¢›Nã¡âóU`•kŠ5ÝtÖç~6Tþ ¾cÑ;¥ìÞѾÈ|C5ŽÏس5—Žn5_Æ‹CŸB„Ȳ¸L¡n{Qtƒ1·o‰ä¸÷¨´ðQ؈êÖ°rÓä­¡ñ¦4Àl;êQ®b°¨5Þïã!a¯3ž%-f­M'¥(¡ ˆ•CoÑá, tB¡àñjTƒR|I_UAÌ@ž3Nh§­0s8ÜäpnûSßxžòJ T½ˆ2goË÷:mÅï©_<ªõ9¥”ÍÁ)«WÈÛv [½åOUàÁà‘ýr+Ïÿò©´ð õtGŽ¢Œ W±â  ƒ‚ "ë×êêªfÖ¯ß úõ'¨;™×{r ½ íX«öurÑí.Eéé︬ó—l¨©L9æ¡x-âÞ¾uÕàñ$Ri#»Ch–>ÑbMI¦¤)b"˃ç` ßI€j›ÇƒÅ_ŒqAaû#‰f1@0KÁ J&¶†©Åúй•S±ƒ½Œ˜üð;¯H ŽÔ¢ƒ(Ñ©¤ØÝÐc@@ r%³“•˜<¦ H'ááÆÖkŒfÉgà5†«’ÀäwÈH#eѳ0.0Ñà~(„†åÁr’ V’Àz7E'#‰58¤¬.ðDÔ1‘xž"ˆ™¤? O,Â_wS†å[dH¹f0‘0ÅDbÈðÎe¿vX0Ò‰e}SY¨½,EÙ‹lÿX´1Oöঌ1ƒ•Ø9ëÆšòÒè h"ÛUÊ·Qòq°nö’³m¯uo>;dî‘/&ìP)fAŸÑQ ”é…õÊV O×rè(¯:žH Q,: K1çPVƒw'—¬ú¯(ªj=ÕoHŠ»ÇÆð"Rvƒ:Ÿ¹¦nÆ»\VbÜ%“w¹Ÿí$ïrJüå*¾ÞÿÙóLˆ>u%’âêaM$JÖ”jmt[Œë¡¥È!àLÂr;ŸqÂN›wp aþR„ Ý_•ËL˜4êÈ–,—o0aЇD±9|XUOrŠRè¬Ü…åU×KYúO°çN"ø_¨é%ØQsÔ$×`Tõ:H¨æÖÔ¬#°æ áË:Øš$ôC™‰Wá3¡Ï(äHòS>y»Ð~ÂödvÔ‰Z)€D³eXZ.»"“BÉðÅ;]Ëo£f ×`ãF<5ë£0´lÙ‡7#§ýÝ»ÅAðÑirM·›R‘•+%qÊR•7qÂÕo”!årüyˆÃƒÅsî-GšÂ•Y‘”Ëxî1MSh$áš %àÁrxˆwíŠ|l)Ú§ÿ „}x˳ÆÅ6+Škê‰Ø9"u’ Áˇ™XŠ_òÄ·ÜìúÒ­¤Ísª¡¥jP<Êbõ•œ…¨è‹Må¡®—\+RT°v¼æÄêú tÄaèÑp.Ï”Õõx™èÞg`j×p¥Êóì?$ß*%ƒý“î#>®’‹¦t#ggiªūӔ.n—®¤í·‚å‹ûg‰"áubÂ<)¾ÒÕ¼lRj޼o×8Cò^_·ëÉ[ÜÜÖýéWßr@ T¢¨º;$ï=>㽓° ‹Ø~–Ï_T ¡fx#MÑ0XuÿgEfĨžëöö„ˆM,rE›ñ’ërù,õr} ÃáÊr*nv»iNs‘`{ûæÇSxnlÍÄà„ʃpîö¨“¢N¡Û(*> “d•Èšõ]ܬð˜„+å²PñîU(ß%â92*d;²@î϶iæøôˆ0L Ü%V –çŒÁJÅn@YJ,öÊ)*H'Â(~Ê,¶»…¤.ÄDHR‡#ˆQ³Cæ~öÕ Â’´»à=ñÊ’¾–p`’Ùú@Ù='Älì9ÏÙÇ#°5ýpǶñN!½ˆ²PÉìÁ °J°räHàÝÒf‹·•OrèÓ2ÌÐâP+ kϹx5 Þ³(»‘S¥"ÈlÊ)qŠÖï©8kœå=~u_ªÏµò<.Ùb¶6‹™—BŒ¿(tÅÝàå ±h~*wËv‰‹G@¢<Ëi{¬˜àUÕPò@âî©"´ªï°ˆ¸ò5“„“×ã Û™<²-?ÒI4RüاŠ:Ò<%äþ0¥D¦Ø>7cÙÙ$*%Zƒ7§åpÒæ4þ‰CÖH¿µfxrYND“§¶’ÀŸË°JüÁ’^Qt¹e.2¤ã$ÈyðIv˜›?×µkgæâ ¥É´¡§øÊ#æxJ®Ù E¡h <‘…zÃrª§ß?‡L¯¼"•@rI ¬Ÿ§»d¶Ü,*ÞT<úbg°T]s_¤xÒ¢€÷ò©›%ˆy ‘ÿÌ”Õb\á•áa¿ ü„‰rš²#)ׄëo"&)VSÑžÅ>å %s.ïÉF±‘SBa)Gp(;5ÖÈŠAZ¼ÁÖ*ø=ÙÜ rê(…~î?©Ý}Z½5@¯_6ßžºf=|{‡ooßæËub8)憲›áPf=Þ;9æž#Åf'™yLº´ÁºÃ—¹jÚ5 ‘H.B~úˆ¨ÅI¬=lPÎ9xIî !x”£Ø0¹Îoø§º)–d8¤ýL[ÊH2ù”(¹$a¦˜Ðf;f/äyº Ѽ&¨L¬TS ¨l<²ÁbÍ»b¬J±­€Ýã¤ÙÕ(ç’ñðšiV>aþ¤úήx8kîš¿­ˆÌT·l/,&§Gö¬KRÙÉt¾"I¾—Ã÷’æ{ù0ûfN'“,ƒ|¬K¢ô¤ËÇÝȧ£ Õt$\Ÿ{åg°5|Ç¢wzM&PSv3'´¿Ã쩯ž Qž=ì µâ® ¼ƒk`kxø U¿#7Þ;åê‘A½¿±î¦)f¥–õr¶›´±IJ› m³G¾ðÆ/sÄ@¥äüy€ƒBÏâù­²Ó23 HÖ+äI=ÿ46°ä‚£ë|¨è÷õ]zÊL$ Ïñæâ㸠šr•6‰¨1w<®$÷:¦Ü&Μ6nݬ”k‹ª„k±)¦ÖÜÅ$ÝÞz‘Rà5¦œ®[~¥ ©yˆ ëOp:Sê(gúIÉŸ2ë­š1 øQ¸ñöGe··ÀF6”»8¢i¶K¶üô öò«sùì’sÆ(å‚ßsyXIwÈ$\:ÌêZ ‰+Ê lYާ¥}:Gû çâúK8n@fI`’]+” ¼w›?RNýÞŸ£ÀAÿÛp®;èy=Ë,™LH«N™”­UãlÁÈkQÂÅŸO⤠\ÖFQCèk»¢œ«k=•sÞ¤tß§½u0ÁJBqe`#bzñÊÍâú¼›?§Ÿ —Ž2ñ¯s,ØS›‡W^ˆvó|ÉD1¤“Ðf°·¨ŽÝ,H—›ÜCBí×ôV9ÈO! ¦ýõ£æ ¡¡±½÷_ŠìؘYÞ†TÌì CÉ4$l^Ïèúϸ5øNh‘ôéú[*àÚ7#v#ÿ‚úÂˉ! ð> B@½!(‹È@ÀÄ*ÂÞ?CºP瞺FS… >Ÿà$²“̲¯§¯/ÿHÎìÕ endstream endobj 3693 0 obj 5689 endobj 3697 0 obj [179 /XYZ 31.5000000 653.750000 0] endobj 3698 0 obj [179 /XYZ 32.2500000 722 0] endobj 3699 0 obj [179 /XYZ 32.2500000 653 0] endobj 3700 0 obj [179 /XYZ 31.5000000 723.500000 0] endobj 3696 0 obj << /Type /Page /Parent 2 0 R /Contents 3701 0 R /Resources 3703 0 R /Annots 3704 0 R /MediaBox [0 0 595 842] >> endobj 3703 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3704 0 obj [ ] endobj 3701 0 obj << /Length 3702 0 R /Filter /FlateDecode >> stream xœí]ËŽ$Éq¼÷WÔYÀöæûvfgè `°è è ,I „Hhă~_ÝÓYÕÓ‘eQV‘ÙÁ¹Ë©Íw„?ÌÍÍþ§ßþãôŸ?ýüñ·ÿ9ý¾üýãoÕãØW/ÿ9=ÿõÓÐLË?ŸÆ©?ýþׇo§o_¾<ýï·‡—~ûø/Oÿô§æôÏOÿýËéßþýéÿ¸üKÏÿÂ_Æz|úûÿû<ÖOÿT]þþüçÿõð¯ÿpúÛóÏ—[næíÿÿ©Û©šŸoãÆ¥¿=œ³þþ×ßÿÛÃÏ// ì*m7õtª»¶;Õsלþ÷O~ºÀùôÕã4,ÿÿL^|z¾øôôÆêî鬯„_§Â÷¯ƒßNï ™á1ŸˆëÀ{kx ¼üM=ïžyRÏ15¼kø¤Ìz«ˆ÷VýRVï>W/þr=ürË/Ÿ¾>y€ØÆ»¯‹ñ.Ë¿ï­ë ï²z_11ÑãíåRLtYäÅDýþVo”u 0ë³×¦M~Oãr/O¡ø÷Ûq¿Ôô8ÍÕÛ_–·Ñ>öÝ0ýúmLî²ê»ödt·V]ŸÏ²áôË ú…ºƒ>úË"íÛfªß¾®Ï›½nàé·¿?Ïã»Ñ/5>&îc´¿ÀÓWÛO¿ŠçôÌûk ãW€Oo©ÅOŒwü¤ø¯?qýâ4ëöüj_‘|}üÄðôÍŸ‹Ø¶žÇÀ﯃&ÛLâ:u ? >soÄ“zÞ5~žíkýc{Æn®ߨuÐØC×AyM÷a©O¥pÊ6ÿ«ŒQô˜ËzóÝk­d2Ϥu]î þ¾HüR^Vf]=cývác³Œ6cØ`k?ÿêƒÁ›Õ.kæf™ m½}°¯Çë à×°£™$aõIÓ;>¼š=ïü–ÉŠè çnp]á¯Ë,Û>kWxOœÔ,J"¶Ô:ùdÂÚí.>}<ÍDÀé#ú€ÌËóŠ™—¿º0ñ–´Þ,0‘ĶL®iå¥C"J†tð—_c{ŒnɆËÛfÀ5"Pì™Ýþ™¸7|6쨙'»F(4‡gŒyƱ\¿ÉLR×â;­.¼ ÁqÐá1›8“`¾ @|ì?º6/N¿{’¹mãOTl°qü[H) ®Aðd, ¢kŠøÂÒ ŒIð0ïytxØ¢z–8^]¸B³Êçdaàtjºkû¤®¿o“©šÞ^òùî^Þª{w×~yùªÃãR‘þÁ àcftLûò…žöõeTîŸ,¶³îÝ"ø9ŒWo·¿xîå…QO«ëÔ¶ßÓbz‚Îß5ðnk£Ü`êÛ·/¨î«ùíg¤²m¦‹Vé 4xð&löÿ­û=åÂ$Sþ¿|b­2ÉÏm4Ó³t€V&KÙu!q±–×NËIqH ö»Ýè˜!¢«åÀD:·.Ñ»õmãº7‰í%ªZë¢M©µßöLLÁø‰ÿÎp?=pˆ]×fÉ”Qš?SèC2– Ï“J˜GØiýr+Fó›ÞÊEwŸuÕM®ÿÔr/é¨7jNbeösvµ8N–ëT«½{FùÖ¼;øKòtÊsk+NÓ*èÇŽ~@üú¬Œ¼˜Å‘Ë"6ÓÆ†X¤ –aM¤â9˜ñùˆ"Iž…­zìn­§|@¥wÄ#òèu¤¹göº$½ج0½H F‚‘œÄÆŠÜÄl&¯Å-UØ5ÏÃ, ÁO*ÅQ)"T  2¢/ÎHî«/ h% P$OH@„8âHé=\Û¸AS²jŽÎÄ(èï]X¼'ßn˜1¯çj<ß·ØJàÙ!¶C!&C÷”ž{ö'³Û™Þ¢.&o¤‚mÅ™j¾i¼ÇÕã#©¡2ÕéŒa(*FÃ[/˜Œ“UÑ4Ž[ÛWTØvOJà6Z–»'¡6z×L¶ØßH 8-É·àCføPz3pü-`ÀÅh'×ëȹà!]%Ôf_X…ÝÒjŠ ÊÀÝ̺ à¹f(áªýö³]z1]ó4:ë;ÏÆNÿE­ÂLEͪ½˜‰40ˆ‹‘"Ký˜9Ìí„â›ÔÞµ*û¬j‡1¡®¶¼7w'‹Å)*_ÌÙ(-µ€„’1oÛWr©&ÄdŒƒ©It;$Yמ*ž©«Ç­é1PZ×/À¨06ËÊÑZm–R\JØœ|3†±%~Xª˜IgÝ÷®OL%h’>!‰ìDÄt*†0.¥`–²ŸÕ*6@/»þö+4s=¸À®5g¨ˆE]íŠÀbrCªMí›EÅm­¯òŠSi&ÄwÕÍÒÇ÷ºSKôëžL&$2-X<#k»d…™“ϸloÖbÔ›'昗øÝDÀÞ¸ÈÆ¼:¼ 2ÄäÁ±yÔ³ßKËä} ¤´L’›þè Ék¿7°<&¼Î2sŽÃÍäîç¹}{I•Üý ‘»Y1W¤ßÛ•¾GZþ#< !:ß¾\§žçéû£Q÷ï‘ÈÇïgõÌXÈ?3~OølMiÑs¬ß†•\ÿôÜ €ìp>­¤Æ Êa…Qhf“Q_E/e|í÷³`ï •ü§R2iúêÑ)æ Ž1þ*M£©‹2±À˜MæÃËí¦ÈŸ äd-F¨–Iêەã٩0 )Y2L"ÀMGñ–‘k(žñrL³Ãͺç-Y0çö“Ès6óë3ÔjW2£ ©Î›í/Òx”dt¬X,Š?˜ñ§‹cûöå^ùTøüy=Ç@òK É"=þˆ¿À»°Ûè±É´¼Ü¹¹¹™Ä¨6fá׎gàÂcšðÃóuŸáóàÁÞ0¤;CQ!ª’ξËtv{畟­’VøÄ”÷PÄ3ŒÈŠxnpö=j飗˜ÉòÐ9)dü S†%RG¸S±z4@V{¦,!*å8åÜ¡¼Ó|0nï žüŽÓŸ6/K³nÎz}ôn5Ó¶0>õ,³Ô¿P³´³nÆ· ngiç²Q¯|¶sÆre}}@ÇdÞÖÝEÔ¦¤·žô{|6lŒÎ¬ƒ+ÏSÒè’F—4º¤ÑI¢Š÷FÕìx>«dŠto4ü±g%K³0¦dŠ{ÉÍÂÐÕJIß'ð–vDkƒ[jk3¼F6õœ¨5M[rÈwœCRMwÌ !ø}!ìô}ÙÈÍp»(k=¶T8Y,ºŽ—%m¹øåì`S§eܳK7r4óÎŒÚY™K(ÖÍÀà³Z` ¤„ädöYL@Å« '!#kϼf#FR˜EÀÍôN1¾Á«8fZ·®#,©Å,ø–W¬)³ŠyS9öjgó%å¼V1_"œ5#cÙ!W~Y¾Ã•³áº¸ç>å]M=ß ··[õ. 1GZÛ(ÈÏÓ1=ÜRÊTÁ-ÕA ¯H|øy { °’Ä“LD[Jç ô¹s\ çÙ˜(W[iÙŽˆ+|„œ%ÚF´+jÕi)…¯ôR°Ú³åch˜áBŠ~ 397fzæ*» ¥E&­@83~N07%ê°ï©vsIÉø/…$—‡aÄD“Ì c 3†uǰáV&|»¾V²Õc@1Ã5F]3‰N›«x\ À}÷ö‰vÿõ¯´Åà†L·îá½a0±¾qðßEl£À÷,ïþûŒŽñt%Š=žÇãáÆ)ð_ÿîÞ•þ{ðßPuŽ ¤êîÛ;Í<¯¯y…޵·“ù˜Ð]ÛŠ¤µ—A\px5&«\¹\¼àÌ¥~—‰*&ò1+CkǰM€P²&9Iƒ˜kã›]oY๠_Èĵø¦ôfåá…Á莺3Ð5­üüL?Pæ"‰V0É0L²Ý»ˆ”ÝñÜþid¯ýÆ‚m/-“Uw5õ6ëaTÒd'$ÁŒ ºî Å}«øÞ<Á&¼7ª"È8ïÈéªt6¤d­RaÚ (R)Ïô}ÌÙˆE%ŽŽë+ ­˜Dè)ü¯Ð䉟4(mN '°Ñ®Šæ No5刺7ífÌPî))à×¹¹]qpÅÁÅwp””æv+Oe¦ÛÁÉ’RŠONŽ÷H˜½6À^{ÇK‰Xdo¬„Ab4AÄÔýiÛTK?µQ³UùË Ë ž¿òV¿¢r•0QÓΰ¿Ð•]fBF¦r{È{Dv6i¦Q0GZƒU)´«œÛÜ[)ôÖ]ÇêºK?[)k–²&ë{wYÖdîÚÊሕûJß2sR”ó´öw’-Ç,kN­ãúÄôi´TjJ¥fg•š}åM‘*5B$L,fÔä1)m—‘Dß—cej ¼OÜ6 ×jQž›NÑXعîæXcu|FöuA ŒK³Nºþ¦Œ!ª¡ZÝ‘hi…kˆŽ,O–³*ƒ[aÏÅÍ­#_”u-,ß°ÛS,eZê¶[1a;au¼kÇóEn5O&˜¶/Ó—:£šÂñ;|o’Q>%‰œÑê€ÇhÐ5Š™)9 Ô¶i½„€²VÖ-_/Ípï诊ŠVŒ£ã-%H|Ïõgµ‚1újz»iwc,kËO ƒºyž [f0½¦¿ôû諭sùÊ"œT9;¼pâ>©.ÄRr/¼,t*žfT*›Ù4ŠEm@ïØ5ð>ãŽø¼;Õc,M×†ŽŒ½×šþÏH_Üž¨rtD/àwUSk—QiÙNC¶Ko‡æíÝí,½¥jñعÃdOgXÜiPâ»Ø7ƒÄwª­­Æ.ƒ{ÂÖX… †!ͧF~‡¢­2þ ~äõKѶþh-"Az¤xY:Öºš§TY¦µ+:|+a ]ÝpˆRõ2̱Jp”*ízfÃv P1Õg ji$ ¬ê`0òh…×aÀ¦íðüÍø9âNjëÞÙJé+ù±Ñ\SR¢Ò†›ôí.É‹Øy¦-I‹HhóÌ¢Bte¯Ã®U|¶zD6+AZ9áÃý×ú ,èÀ0àƒؘAëÒ%öƒ«Í·4‘^ÛÜ£fˆŸ‡:­líêcKãZ¦’“+ȪþÄhF*rœ(ëÍØ@CÛ¿½ï±ƒ©?%@JCI¦ %Ãì:-£Š}lÚŽ•¿1’ºò¸Šíé7•¾)/h5†=åv™Ï×`:æÓ×9™/öZÐ<¿v²œµÉ´òo¸ôF]¿·ÙõÛZü¤»¨4š~r»N°,VÅ÷†9·’^N¤³jñÔ‚å—øIËØ çK–Ž˜û¼péˆ òé¥#æ(1ØôafϽÁc%Foú¦YÞÛø#1vi"õä:E¦ã&Yí†ù2÷LÛH6ôÒˆ Ë_Ç.ƒ»tðQâ%k)YKÉZÞž­‡ï Oíù ÁÇÀë0YK}ÛÊØðPÜq+Ly6D#—à<¦X÷<:Þ‹Q•ÀÆ‚ù™¡Z™0&Z ¨öâÓ+2手 ^ÖiJœ‹‰ì$ìB1såˆÌTéŒјÙgâŠudé)¨êžÍ§ŒÊUœ\GJ5îc›Çè;ö*ùHl7&Ï5²«•ñô˜‚•,É1ÖÃD¥DßæjzkUw†¾á³á{ÃI÷B?Âò*È—ÃÈ`ßÅ6É .7_šÇ ³"A \0Ê‚QþøË.1J|6Ïõ†SÂ=H$žMy_8y& ýT;®)=E˜*á[z–:8zŽ—ÎÏ/TL¼â›\£BkÃàfr©vhÎt%mÙ,ëqjØõûA,&c%gYªÄ¨ž™G…žiD½ª˜¸¥4³æ©VD‰…7]Ï^Ž£éGg35Ír·‘P 3«Šr[ñ~\MaÏjÅŸ4n ¬â12DdUÖ¶ƒx³Ý°œ¾ ¨bÃö[ÂÎYó‹JãùIJtxÍâ]CÀÔ@ÛCh+ÕsR^7¸a vD€†T.íý…ewh#…yt¼\ãÊ͉¹+]ŽÊþ¤“º‹ìNFu²ŽL;ÒT¿½ï±˜9ÆÏ♟ærÉT²Åæqe%ÍÌ™”øãw,%2ÐäæN’øX«TŽ –’ ZÅd” PJl'*§e¨èö nßŽŽ§ÒÆ<¡0SžÀ´( Pácv½»3HGóS‘ÌÇud]xP´•hTy¤¥ÂŒÂF-?\*CÚ’Dôfó¼òfØð0¨0“2ÆÃ e˜«ö¬*½S”òðìCO@ òVÝIsu‘~J†h:âŽõÑjB3 öZì`U@È²ÎÆAZõðŠÕw$Z4L,Ì<º”Aqò`Q¶Û®ƒO±=“¨j†ôìM)hhuvt×£_Ì„+$n\"Ï@°FBtb< ØÍðÜ?‘¾Ï$rŸ:Ó¹¨ŽÒVj¶ß’ܦùpŠ0rW"ç”_5hbWî“(Zõªh ŠøÂ Fš§8ÀWÄÅdU“Ÿ¢Az¤'ƒ–‘T\á¹~‡Š…¸V‡Ï†µ ±baÝ‘-±N}Q³H2–“)£j°&CŒ‹›ÅV7b\ƒ¨I=‰¨Ý®‹ÆV:Eáé¾už0óé«ÉñFÑc•·oP³0LK´[ödÊÅø£KT€ÍZÁw ™dLl*R­ç§*ÛQžvO)kä}›4"&›wì?§mŸÖt4EîØ0¢wiõ¾0˸¶›2 0òZÝ"|6) Nuì•4ôi¨RvQÌyYìãñb²Y.h½AË(ýè5¦ÍŽÊ7"¦5ÀÈD3QJ©•^{@¢7”‚¯¶+®QñR\ýJ*ðŒ«wtÔâƒÇºá…=iMJ6=Þñë04®c-u_¨ NŸ7å›p”ºW¬Œ!ár+q½÷„„ϨMóàº/f5™k!›í›8 “-_,?huRãÙbh4Ç*C2É358«[4AlýÍØÈfú› Nêjc;²ôÌg‹Ù!Ñ5Š…,¡t”pŽ’ÔökÆRpÍ$]£«lŸ%qÙcç³ì¥Òw’)9YK9ó-øÒÔó1"Ûôò.FòÕk>ãá#ÁŒÀ“’1WN¥í¸"žÞ9á–jlÆfdÆð1ž¡‚ðlÝçp£è‘Ђ֦ƒ%˜®‚Ošs˜”/¹‰IMïóÙª9öŽ;‹<šÉÌCà}wç˜ËÞj—ƒ6üBeËxŸhÚJÅ÷Òk†Æîh=f¡mSkEÇä¬ð­²g‚tÌÕ€¯M ÃXU]wÉ*Ò ¶sÐ Õr£µ-âv!»VÜ.ò°Ö †½% Æ ±¥ÄyÌVÂ~p<ßû“ ÔVž)‹ƒ8l< @CåtZ—¡•¸³ª ¥×‘•t\çŒéIU)>/‰ÅâbôÍÖH1 ¨Æ×ÌiëúíúÚ›f<c K$z%‘óœ +ðÔè¬Í³4Ä×Íù'÷:ñQ„¶½Ü SŠ6jŠ#všwUª™™!'‹Ò•%îÀ,4Q i—¬j&Ÿ¦$ÄV7 ä“KiÕ¿lψ$=VA3ob¦ÏÝà8¯ÈJ<ÚüIœ£Xmf¦tH´ñ‰ém¸@X$_< ]Öf£ã¶‡7žn·€ÓkiB»¬Èàë¬ ²L÷£ÛÚxºaTžzrS;š´"Äî HótÜ1•dH±Br=-~D¡UëÓ592ш€æ ™$rÖ;Pª›oî1Ï ðÙpùvÃòæ*E 4òŒUjì¸U³=MöÀ&„±ÏÓ!7Ãà,ñô¼É;c¬(Dø‚LzÀF+äIÉÒB†móò®TVpjíaØèlL×,g[Wp¨œÍÝ{ëH' O•0­!ÚC}C¢‡‘,¤‹=n"2gJˆÆœË5޳L¯‚žs+>:Ì`öœ ‡³¸ð§½@³é¹áˆÒO=2½Àï@©g”ú˜Êdúðp—üäô±Kúø-]ëaŒˆÄr¦Û¯£(œ^ÙlGW8Õº¦î¼Ë— »åxŽ!Šç—;Èè ¦„±+¬ø¼]Õ¾}€ñyqRáaíâÔ‚å‹)¿v+7Ü5Íí|)?–cL%¥ô•Ðç]†>»D°¹ÄXOÛÂ'Åv¦r”S/s3µâJ™ÎÍœ×ÑT1+‚ã¼äþCëµx0À3}Õ›*e¯œ=æ®Ê[G+K‰Ñ£?›iÉÄ• ÉÙ‚d6è²sýµ¢ ¾ž8èV-͸eVy!  "|%Ú﫹ݺu¶ÓC73&È£´óÁ R«BÕÅÌ_¥3¢3äíÓÿÞÁHŠÉ¯m{g™2&Z¬w‚ÃD-Rg¤çºOÍÉVeº[ÿy0 †®â2btŸ{I £Ôu`T”óBdžº=}Ã!fÊæLê.%I‰e"¶¶ð4b¬¤“{ûä@x3æáòC×Áµ¢EV),hßþ‰¨ígŵÙÁ´²®ƒ§ß^1`ú™¬¢ëÑÍ2Ë =8ÎømªÀ„¬šzŠ$NL5…ÒÉbZiµÐ[$©WÝùƒ‘¤–×~ UÄ}ÃVƒ º¹¿æ¿ç>XüU1V ”˜¼rÌi°Ù{€¥žT«[Å?†ÑèF˜?\ƒþZ܉e*VņC„á |a)ãÂØ¦Äd> ­ëñ$·g¤Lú’Õ’b°ÔlÊôÔÄÒöL^­‚¤B/Äñq>ƒ¤’ð¾cfeÔrÍ*«ŒÜ™¢ i¦!ÓX¯•mÕrºòeák·PM¸ø€M_wðKå7qJCg´":%‡r»IšWޏéÚjvwÝ>Ct|ØE†©?ßWRÖ!jCú ¤¼ *M˜`…â®Y+É3OŠg’<ö‰-ˆ\š–îXç1cÈnrÜYì_(¹Ý A‰(¤uO4)©ÀWÀ<`¾A×qÐËô¡Q\±Qê#k'fÅÀ±¶¸µ€&`)œ˜”¢eOyxUÛ• ®N²z¡‘%o>Ew‰ ¬Ò^4š˜’8ƒ73])F½'!©‹TX4=ÔcÅð(Ý{Þ'=z÷ž¤.ÂÀ…=N™ ²Žg3@i>§-6jtú™’PJÎÌØºÞ1?ŽfÁ8*#ÓJ·Zä‰ÎðíÛÑÌK«ÔÝÂhï›Í¾žGŒÑŒ¦ìôöwyJ šiFe 'ÅÕj/†Ù³-ÄoÇà©W1µ ©t޶B‚ßèDO¾=}Iï‡þrë_ذ¦«ÅܧwZÕÏEòSÓ½}?×<ÚËû¯Ÿ—÷Óœíïêý ë_§y\Šô?lúFxå:í­íÚ½}^žtÅX¶-Æ:×€\»ÙzyôÕ.–Óô°A¼ò5>.väÍ¢ÀÁ)LîÛšoË/§/ÿ5Ÿ¥• endstream endobj 3702 0 obj 8581 endobj 3706 0 obj [180 /XYZ 31.5000000 134 0] endobj 3707 0 obj [180 /XYZ 31.5000000 578 0] endobj 3708 0 obj [180 /XYZ 31.5000000 515.750000 0] endobj 3709 0 obj [180 /XYZ 31.5000000 410.750000 0] endobj 3710 0 obj [180 /XYZ 31.5000000 356 0] endobj 3711 0 obj [180 /XYZ 31.5000000 265.250000 0] endobj 3712 0 obj [180 /XYZ 31.5000000 785 0] endobj 3713 0 obj [180 /XYZ 32.2500000 784.250000 0] endobj 3714 0 obj [180 /XYZ 31.5000000 203 0] endobj 3715 0 obj [180 /XYZ 32.2500000 728.750000 0] endobj 3716 0 obj [180 /XYZ 31.5000000 730.250000 0] endobj 3717 0 obj [180 /XYZ 32.2500000 686.750000 0] endobj 3718 0 obj [180 /XYZ 31.5000000 134 0] endobj 3719 0 obj [180 /XYZ 32.2500000 577.250000 0] endobj 3720 0 obj [180 /XYZ 31.5000000 688.250000 0] endobj 3721 0 obj [180 /XYZ 32.2500000 515 0] endobj 3722 0 obj [180 /XYZ 32.2500000 410 0] endobj 3723 0 obj [180 /XYZ 32.2500000 354.500000 0] endobj 3724 0 obj [180 /XYZ 32.2500000 263.750000 0] endobj 3725 0 obj [180 /XYZ 32.2500000 201.500000 0] endobj 3726 0 obj << /Type /Annot /Subtype /Link /Rect [60 98 84.7500000 104.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_overview >> endobj 3727 0 obj << /Type /Annot /Subtype /Link /Rect [60 91.2500000 107.250000 98 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples >> endobj 3728 0 obj << /Type /Annot /Subtype /Link /Rect [87 83.7500000 145.500000 90.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_intro >> endobj 3729 0 obj << /Type /Annot /Subtype /Link /Rect [87 77 135 83.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_simple >> endobj 3730 0 obj << /Type /Annot /Subtype /Link /Rect [87 69.5000000 137.250000 76.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_class >> endobj 3731 0 obj << /Type /Annot /Subtype /Link /Rect [87 62.7500000 129 69.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_other >> endobj 3732 0 obj << /Type /Annot /Subtype /Link /Rect [415.500000 383.750000 513.750000 390.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.erikyyy.de/compilercache/) >> >> endobj 3733 0 obj << /Type /Annot /Subtype /Link /Rect [147 175.250000 229.500000 182 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.samba.org/~tridge/) >> >> endobj 3734 0 obj << /Type /Annot /Subtype /Link /Rect [383.250000 162.500000 460.500000 169.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 3705 0 obj << /Type /Page /Parent 2 0 R /Contents 3735 0 R /Resources 3737 0 R /Annots 3738 0 R /MediaBox [0 0 595 842] >> endobj 3737 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 3738 0 obj [ 3726 0 R 3727 0 R 3728 0 R 3729 0 R 3730 0 R 3731 0 R 3732 0 R 3733 0 R 3734 0 R ] endobj 3735 0 obj << /Length 3736 0 R /Filter /FlateDecode >> stream xœí]I¯ì¸uÞß_Qk]-NÞ ‹¯,Œ,‚ç8 £ÛHÇ‹üýH¥áФKüê’ê^ö»¥¤8œù|ççùþŸ—ÿþÇåçOßÿçòcü÷Ó÷—êÚ˜jøÏ¥ÿïOË Ò^Ç¿/5—¿¿üqùãåÛË·îÿÿx^øþéߺ¿þï"/ÿÚýïo—?ÿGwñ/ãCý¿¿4¢éþýíöoÛˆî¯jþ·¿þëË¿ÿéò÷¾Å©»q0îïŸD£[õøÓõ/ÓgŠÛÿñãï/?Ö‹Ò­©«‹ÐJ_D«ååÿëå¯]SóÕÕÖãÈ¿ÁÎí­ó¶ëW {)Þs£ÅN=[£véÙTB×;õ¬„Ü©gÓîÕs£Úzní>{Û¡²çnÿµuÕXMþýHϲ¡OU¡žEùžõn=wß\tª…–f¥ço)m Ã|åÆrÉåE_BŽ<<üÈä*£»ÂÉ}¤ánúôJÛ;L_õ:}rœ>Q C3—å@M'9}?Ëš™ŽØçZ3¯í#­™ÑÕbÍú_'Z³çlm3cÁÚá“ën½ÚiçX,‚v½36ò¼aÕ¦_ÙŽžØ×WWÔÒØjüååç¯l¦/¿üµcßÃÞþù¥û0qù©×; ü—¿\þ©ªÄç¾üò·¡®J«^[ݩ,y§¹Ý©¯µ©¥©wäò–zGŒý4W%­èî½¶ö‰ºyç3uG}îÔÆT‰àYE=kêáY=Ý‚zTCû¢½¶ö6ufAËô™«ôpÇn-=¦ðYz,bèñË/ÝIlSw:^½¶©;VØoêZÍŸ?¯ºÖ°ÎÀ‡…µ¯ó1Ì”¾ûµ Æm¯¶­Ü™ª$uGZ²5òQ‘w†ÖÔÕèÚº§ISýÐß3î`K_ Ç<*ÛôÉ¡‡F·’ݾ’Àªš|§áütA÷c¨Õ§ß¡¿T‘»,<ôæB>ÞÄôŠ™øä‹|:È"Ó­‘#à=-Ç9·á$—G6þ£È^¢ß!×+BÆéï¢WŸÞ1Ÿr³9Óɤ.Ÿ£ÏI„Ý|ؼf‘æižE]`º‘~hJÙrƒÀ`¦Æ#´aô;ôúФu;Û€¤Áꊒ¯èI¡—’‡Ò!; _tówAÄŽµ¢I+¹u"› 9 Èä#óv`‰!²‹·ó½»Ç^J‰ÙXÛ´ÓŸÇ-7R“Sè,ê3uNDCíÅȇî.ó<Ù"èarÚkãÛ9Eˆ°5>š2 ‰Ox´ÄÑ`$¦1mY0ú3V}/î\L[{\G*`:ÓíaT¬'•ù3.¢ÐÖ[ÅÝ´‰CKu„êSàxY=a -Â\«Öu@Tg+U‘>ÓÖ€ä1Ds¢× h-³Ñù㠴̃ÉÈ&æ]cr"ºi°Ȇ|{æmš^zºøB½£È%Õ£Ÿ[_庮’Õܬ<æ…HY‘cAËRôÁÜwYnÝÎÅB§¯á6µh5yûéFL i€—ÏÖ>È1I®>¯é@¼T‘^…›·h„_KyÁ Œ½ÇfÂÁH=õ¿QN½½R­¯"†FàxG&¤”Ù’—À g 1æ ±14`3@܉÷l”t»dŠ÷t¼'ÝÚ©"AéöÕÀŸÖ")ɸɑ§-c,É/[e•š§JW—237M3-Î{„fîp´ˆ…Œî'Ð 9É©"Ö€E¨4">ÓÓµ]­z·v%M-ìБg´„˜_ƒ¥å0óNÛ}9Ì154½ Mɦüœ–²Jyì ²°êÕoOQ|+¡Yk­ùˆG-b‹|2’ΪÇ"ñ³˜—ØóîYzFY˜ =ùÛm„¦4R$é(gˆ¥ ´I3Bö€í”&I¼{ž×¶VJ/Œš,žàÀ»ÃêäCìï톜 $N’9ÿl;kŠz±yýe,Éä,Ñ{(Á"ÉÝÁ‘à¼IˆJ`–¸dYÀÌ×Ö÷9÷þÞòül¸õ§ã9RÆx·%äŠbˆtóúûŸT[ËÉ…4§£K+Ö (cðݰ_Ž)â“Ç-Y9M¥¦ñyb)Ò÷™ÔÈ;ª%IùŽüHê5dkú+õ=ŠÔkä;$§OÝ26ò:gQ*jÔ“›;åK'‡uÒzM‘˜‹ÀÚC!šò †BÚÁX*±Úÿt(—–-ð(˜«TÔŒÕÚí2{ÔL$ž†ŒP‰Ä¹ãäJy­õmv7ôCG–Œ›´Hkä"q5d¬ŒÑÔ‘¬äWz­’ï™zÌœüLŸªÁh»½Q†®‹ÅÁÙŒÄc#á…Á:!j3’ÿͪ/eÎH(–¶—YB,;¥¼ÝÛ1§Ì¹-Æ{ÁD‡A±@:Xãñ¹”­ŽÐB^`%2ûŽ×PÕXð´ÙaýÒ”x›§›òžR´K„¿m÷¼¦ÐÀò,Þäff©ê5f©ŒßGw%`–ýSÖiź}`–zrƳÆI™ÌXmôÐDȘáL›Ú=Ó¦Y;Ó¦õÏ[w%8ÓýSÊiE-û˜Ï´1kgÚè žéþ)ë´bÝ> œéZ–>Ó¬aöGLH/ÅÁl6OZ°Áºà-µÁ“7sdì%Ü}Å@ÑãRô¦^£èõ©mw% èýSÊiE-û˜)z£×(z£‚>THÑû§¬ÓŠuû(@Ñ»ã§0Å}´4†£ðÍX "z0„S 0ŽÕ‰Çb?—ÂRV´È#iú}<-oŒ$ }¡±ÜN ÖCw@P•Èy!?PŠô~´h!“dN;¦8óÕ&oÓ$NUy€”`ÆÐ‚œl§­=¾SÌ+^HôaÁà ©*•ÿÌœ7¾[¨Gz+/Bi1H«B ×o0©NqhSGT €Õc³'Ž˜è‹Ç@ST­íûõÙbðŒÌs, ¥ú–ÊÕKa¨´ÉÀ½>·é 2Í&G°K)s\[ª‚éaìß9šÑÞ‚ÓV,¹ˆèDSÀ1Y*ÖšڜƀD6}©ÐÃ;"û{1— ¬ô¹!Í 0¥æÒ$‹Ù1|EËkUH˜j@扔£i93ö €A f…ìBÌõ ÉÉGØ\¸` ÚkÊÇ~‡ßñ$ö¶BæÄ“¸Õ>Œ³¹wÝë±Gûûf2CEÐO„;#îh$ð‹ÿ‰9ׇõ€ ŸP¹ú@΀ö›»rx´ Nœ³‚¾û| ²çÒ^sdœ¨"d8bù˜áì2#ÄF›OhŠÇB˜ÙIÎ)ÆÝƒ¤(`Ñz…Hea"ˆþô:ï!¸goÉé«ijo× ÖÜ%{\_VÉ7pA~õ?ÞHi¯2ÐݦÛ*Ûe~ènº[ 䂆­ÞTØ},ß¾ÖÊ‹½¼§ïL žô [¾`ĸrzL‘| ß!G®.=¦»ë‘Ÿo +Ýa>¨Êlw}²`sí\{‡CÝJ°0³à®òúй"}Ä.^UŠ;e9h€'/Ù‡(*¥Ð Ž'ð9h:Å‘†¤©ÝÇ„Ëïxª¤ÏÕXÑKŠYFXÑ'Ou‚˜Uæu^u£kàÔe5÷ïŒlÈBá!§§˜£Þ9Nv$D«¦Ù•’Š9ÝZÖçš»û1 úí ´Žˆ8O>SýèR( ‡N,äõwB ½ï a—DF€Ãå·ÃÉJÜŸŽ2,¡½Ì„£‘œ.0m½…ßéB‘ÑnD“8¤’äCNÅŸ÷ú f)™Ï’±HQd§D‚éÉ0TxRO„ü½ÈE¢ô+%!%¨í¥;ÎZ˜kßåïóïújmu©oÿ4BŒWí¥¾=xÅxåÇK­¯B´ÒZ1?¥œVÔ²îùñ÷íµ‹ÿ¶ úPý;ÞHº§¬ÓŠuûøõåãŸ2Ñ@;ègZN¬SÕ¶tªì” æñ‘H.dÉ2­7ÿcR mÛX‹é%ïDâ€éwhÜ™±v]˜»ghÂòÜO¤ˆ¡òçx[ëÏû;bXý\ˆM9McÚø{â,‡ˆ++íreeÖ¸²j|ŽÙ] ¸rÿ”rZQË>f®¬ÔWV2èC†\¹Ê:­X·\YÏ{›æÊ rîQÜ9ê*ÿ:uÏÆPéÖè±)Z«$Ùóñ¶f#÷„œ¶f²{”PþÊ¿³ô·ËÒ8–Q.Ç2zc™Úç&Ý•€cõO)§µìcæXF®q,#‚>Dȱú§¬ÓŠuû(À±Ì\ξ¡v-½Ü nŸÍðïòšu3Q.TJ‰GŽ8`“S"¯Ò’ }â"£¤BÞyg«o˜­–2^çïh­Ç«i˜§ïˆ/Ôb®3–|.d¯gæ°gª¨øžM -Ü".îJøÐ½ªK+¾ð¬²-kBèÙ D5Ö=^¨m»C-.aPÓßéêïZÓßãëÖÝ•@ïŸRN+jÙǬ¿7bMoª *Ôßû§¬ÓŠuû( ¿734ËÛÓßw&ŠÁá']˜ÙŽƒ3"ã¬(¼ˆ«=7AH(R‡°î33h.­ ñÛòÀ}Bsªú“7ð•­=):f _“”ÞãÀŒ5A¿@jü!È™«ÿ½=Q‚ˆ}·8ÅRY*,õµ23mÈÓæ$¶ÂU[¹¦$¶ÚWàº+’Ø?¥œVÔ²YIl«5%Ѷ~Ý•@I´³Z8µbÝ> (‰í”úþ®$–çe»Q&Äí1'!ÉVHbo ŸKæÀÌ~c “z¶LÃKH¦ã݃…B8!|IJ@WÀC|l,”4!|‰ÂØN¤"n€í¨?e.IDŠÐ©mÀêBF ± º »»@¤Š(Žù+ûY©\…Oê5…OÖ¾2Ö] ¾þ)å´¢–}Ì Ÿ”k ŸA"Tøú§¬ÓŠuû( ðÉö _ÂHx ž!’bNä È+ ¦0ªÝ«#£¼H`Qæ ãÛµh¾–.Í×jækãÓãîJ@óû§”ÓŠZö1Ó|-Öh¾®‚>ªæ÷OY§ëöQ€æë3Àó%[èsDoçGŠw– K°}lg,!b›…l}ÛLq ò»ŸzÏfÅ@Üj·Tµ­×JUÛÚ/UÝ_ ˆ[=•ªž[QË>fâV¯•ª¶Æ/UÝ_ ˆ›™ÉY½,UýÚGâV&Ã|?– úéÅãS$ðÖƒ£—‚‚Ïï%0PO[¹ÔÓŠ5êi•OÙº+õìŸRN+jÙÇL=›vz6ÖPÏþ)ë´bÝ> PO[“§ä0g!3õ<ð‡ž@¥KKÜbõAE° y´Š™ßg°­iÛ _À=°e@1Fô\ðúX9ªÓF2ú U\ØËÙs!¥ °jä­N%ÇÓ%4Ãàˆ>‚`‘ ªOšfÍlJ¬ú?§5(6hëV&m«µÊ¤mÚVaeÒÛSÊiE-û˜užv­2©mƒ¸Ú6¬Lz{Ê:­X·ü:O[ Æ:³Îà ð +U¯à€4è‚Äm„²#t‘” i<Õߎ²øäÀ-xœ¶Âº P´k 0ˆÏi‡ø—öO)§µìcb€­hV`+ü8£þŠÏoOY§ëöQ€ö9íGg€“u ê úMi3CレSÑ¡ü¼œ7w |)8 à3xÖBþsdwèü2:áóy´Í S È(2‹HÚ@à@è¤#àFvhQ‰ÉÑ@3ðÔ­â0–ªÔÙYÔeˆÞ#qø…ò¤ L@ÔæeÐ'-!‚TµåÐè œC •""Ÿ!.ÊݰãòJaY¥–‡uLQéz©cv¿›PÇì®z!s·+žŽ9<¥œVÔ²QÇì~›PÇì®ê íë˜ÃSÖiź}d×1Eefê½&ë äˆNôô%SÎiP<Œ ¹Sv#Ãhô+Ãè³Ï0jëóÚ† £J9­¨e3Ã^óF­‚>TÈ0ú§¬ÓŠuû(À01-d¦`gÐë8Ò)gÂiLª¿ºý@!Ö¡§ã-¬Ž4ÈÞöô.©Rè$¥@ÃP ²Ê™|ã!4Êí¨òï!½H}Î ÈZú¼p7/¯ÓëK:Ï…²¿óúw"­%ŸG)ÓjWÊ´+x‡ÝÕÆ—m€w8<¥œVÔ²YÊ´+x‡ÝUôàOY§ëöQ@Êlg¶2Šg¡YÉCôEZ@L)Z¶=ô™×1[¬@c‘Èö-ÚgdõwÃãÞË \¬îQ)±Ð ävÞ¼_„*¦oQ…’Eq5!»s_5á_sîÓ­ÑÕ(h¾¡îÐnùH-º²Dvwtå «HÅæ0ÖG(7ííâÓÔ0ç*ÚW„°@£, àh‚ìÓt0=’« }†" El£b;…PÝe—DDN5°é‚F`úµ's7é; OàN$ã4[‡HØÂ½œ&&…€Þëô3žÃ‘énÚ)»ŸÐñ{f®+(­¿?·“1©ýF5Ë ¿½|ßdP`µX©Æ;®P.ô›•"ljÞdüÙ9«·&ø{·"e—‘›ZMHN¨X e½[£˜ù)ÁÇJ^YISœ &®ˆÜ£0n®Uë)±4vŨ\ÊkÀ‚ój‘Á^O¨´0‚—E~&u ÈååUïØ ¤°wwâg÷âÄä=Ô ÕˆKq_„ÙÒB– ÄáuÖóæä!ÄcL š/oÜÛóÚ”ržð:(£À•?Š£Ò>÷Nwäc‘0®Ý=lûË™PLàvX-$Û Ê5£Iø^Hß»•»áÕ6#Ñ|»mÞ¸ˆ€B#ØÎs‘2–)\e¿)íLiuíq¢RΔ'ñðÒ—ý=$¥ˆý¥ÈŒŒÚÇ }'ýI¸„ .O£–WöpžLVsC/„@œ u …½(6š¶!ñ ¼p`¥„4R4W$5"œR¢."*¢ÃsÍ›> Hæ…â(”Açè¥4¬‡×%,9AÛ*dÖ‰$Sä°æ´”LòéÌ#"¯—>Ô@üBäèîlæÊ¬ÕìÈfR“̘xŸIÝ£¦X½StEÝ¡­`4CEìcÅ\ê,¬i7ÞˆkHAd…)XBì•\Í«ºp%Û£h®Më©Ý¨;MÍOŠ0Ž~˜8U]e¥Ö@ìèeèë;·6Œ`\ µïl¾Pwè~FKƒTW1XÁêG|š¿ñfç#ùí«y¼xk#{e[Ù©`÷ô{(µÝT˪`öצ‘ŠÅ&|ícÏM¨«É´\,w£Pž{D@ÿà³YÄ¿Ë ¹Õ:œ.]MvP)ÄòBº¢gHè¡9Uª/ Ef»?ÆÍ;\ÕÝ1nñéÊî¥j<óSªuš™~N…dç CY¯Û§ÑÞºqs{J»Íh·›_=êRâ$ 3hÁZN·4dÞq·Þ&û/RÆIÝ ]0tT}¶TŽÈžûG·ß'·m2U»ºòήkgW+ÿPižÝþ©ñlNÍL?+ïìªvíì*ëw£lxvoOi·ív³ëÙÕsÙ::Î…fO¥Ž*`Ë8#ƒÜ~–t3ñAk–6Ÿ%Ózg©®ÖÎR-ýM^Ëð,õOgejfüiZï,»v–Lãwcšð,ÝžÒn3Úíf׳T›»»rLb_Iõ£ï¤À!fèûÐ,O}”ê $Y¶ÕòÂæ£ÔXï(5íÚQêt'oß4wï$ôOGejfúi½£Ô4kG©©ýnš:½èòZJë7ì†fe²†U’Wyx–wb\‡wÆXK¹‚ƒ"Hcùgªu/Qdml_Ç/ Qê;ŒBûZ´´ô2î­µæòަ>CЭ‘¨Húô…š‚n¸þïnÄ®YyͯEûKè-@Ͻ>S[`4f­òù‘º#èÖè±Ñ‘> endobj 3749 0 obj << /Type /Annot /Subtype /Link /Rect [90 716 124.500000 722.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 3750 0 obj << /Type /Annot /Subtype /Link /Rect [107.250000 505.250000 165.750000 512 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_intro >> endobj 3751 0 obj << /Type /Annot /Subtype /Link /Rect [113.250000 665.750000 147.750000 672.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.android.com/sdk/) >> >> endobj 3752 0 obj << /Type /Annot /Subtype /Link /Rect [160.500000 665.750000 195.750000 672.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.android.com/ndk/) >> >> endobj 3753 0 obj << /Type /Annot /Subtype /Link /Rect [169.500000 505.250000 285 512 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://developer.android.com/guide/developing/projects/projects-cmdline.html) >> >> endobj 3739 0 obj << /Type /Page /Parent 2 0 R /Contents 3754 0 R /Resources 3756 0 R /Annots 3757 0 R /MediaBox [0 0 595 842] >> endobj 3756 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 3757 0 obj [ 3748 0 R 3749 0 R 3750 0 R 3751 0 R 3752 0 R 3753 0 R ] endobj 3754 0 obj << /Length 3755 0 R /Filter /FlateDecode >> stream xœí]IÛȾëWè`dÖ ´Ûí90l ‡ ‡À“É`0Ä™Cþ~H±Ô’ŠüJä§WERÍ1’¶U­Z^½}«wþüÏý¿ß¿{þüŸýW÷óùó.;”yÖý·oÿüpù®îïû²Ê÷_¿í¾ï¿ï>í>5ÿÿ}×}áóó_›¿ýo¯÷iþ÷Ëþïÿh>üÑýRû ßv¥*›Ÿ¿Ö¥jþ–½þl?ÿy÷·?ìkg<-ç6sýïT™—¹j·qcéï»Ó1ÕñÏï_Û½ë0m“«<Ó{eÝ«Úêýÿµû©=·Y}¹Y½·ûþ†»_&7\µ6¹mxݪÈÄÊj;0÷`ÈÎ`Ð *ë–È÷— æ ‚|N ÃÜÔÑ`è͆¹Í.`ØþkÆÀáˑ`Ým½hàWŸK <@k+ÂA«ó3Oÿây¨ ÷üû=¨Tèºaîªsä•K«+ëÒæY]Á¿“+—º]º*‹½Òu#ƒsQäòfW&¯Ë,ÞäÇKE™B'|Û:k­Y^ÊÃì<{„ ÑY]Fœ¼Ý¹4PÜmãÉcß¶."ÒöyöbŠx´Ýí<mãɵUª,l˵x3¤;UÆÝlQGÐëô oL‘Kw.•ÓÝâÙ/×íË#“Îlø¿NãrkKw;‡Š»Üþì“a¼•î“VÇU}÷D§läJµóþ[ª*Û—Yû£Tª3u”Ýõ«Æ}òuWT¥j]Uêõ·ÊËYNÿêÖh~ßý;k¿¶÷¾ÕþÍ'_wÞNšÏN;íf¹>Ç×ÝÏ»÷¸‚‰êÁD!—Í÷ÀßÙ½ûبéÅþËOÍPw Ç_]Úî8î¢ÜùqÿÇæþ´ÿòˮݕ-ª2?þÞqļ?ŽÔ‡æÚ.®#ÙóqÄÜÀňêÖÉE©®×)Ýle‘:¿øŽÊ#/_<;ƒcEªÎHS•CeËËZ3j òÝt6Ð6ëÝÜú­cêú8Rª:»É:˜ÓÝ\ŒTÝwÆ@Þx¿Š×SޏG †³e/Ç‘ü`t¥®Gà1”…³áuzPòaØ „½É$vBPJÖ]œÊYm®Ñá ÎÖÑjÃç|Zµ…;`vrù¿ª p0 « P#$>\GWÓg35¼Á£7>)†D^¼ŽúpÍmyžXíµâ‰Jyb¡½%•9I’ófžÐˆaqpltÔwjô'ÊAáseƒgûwý|ŒþUáÙòì ¯£•ÔUÝ_E‘ß#¾0;|0Úyxé+¢‰`^ŠXCUPt+^²ð<‘” @éÍIì€\fvðvø‘ˆI/ìaSšU•'ÎúT€™¯zÃÝ¥Ý%ßDh8ò¥÷£Õ‚Ü»‘7…qÄ•F¡†d·XÂ<0få˜ù›¥.[ÀOË*O”vÓóGG·m©‡1øJ1ül>“ºˆ“þ$˜‰ñ³×ñ@€l¡âŠGâKϺ'=ò‡Ppöͨe©y{€@vÉ <0n:ʦMúè1y‚FDÌ4dùå„^|9Çä-oWeOKBö2EY8ÙwC0*$AŠ!T†UÌ`:¦¥ªÂzX“œ‰/Ö·x;dÛBï¼ÜÅlu^\~0G̶ÝÂõ2v<ã5 pjL}"Þ@Q™`/x³˜‰œUÖ2f¤qÅäüî¢)vî÷‡Í"޲ÍPYž¡QÅ+zÒ:Ö:-q`˺‹M¸RÆÌ¥¢”x ž0Y¦gÃ^ö·Ãàú‘!ŒÖäÜcàž0Rõ¦ÇÇÁø‡Ê«63ƒŽ9ÕÓx!Fxd¿KíR¥c•F_/)•ŽgÃéX'Tö¡Ý”í%j©8Ó±NY‘ßéXx|œÂe4„5qÌQ«t´†ç)¦ïÍy¿DPOÕƒ–vgh—•,ÙeõõGêåÝ;4œ-ð¼N¾cJè~R»†ç#îzUqâ½ëmä²—øë®w`o§ëØA=ý¤Ž,†F2¸7åPω¯O˜ •÷Øà{8Û ¹ðãû#Ïxoð¤½e±Íç¡®Tu©ÀøW-Dç"R@4ÎÆ¡j"q1I(³øÕµ¸þh&®ðøˆ °ÜKù†Žõ|GèÕαnº‚´Ós8ÖÛ-\_ibë`D6¹y$D¾zí¯P¯-öP/¨Û… ¬ ´ÀZˆb¥±cuuótØ"ÄÜßcc1À8†­UQ¼LEMx×yˆGðIÅÖGà˜-ïÀ1M@qÊX=þªÛtOðomcz÷ìMÙdª_%®\fZ8§Êûij‰¾ßêl®!ìZSSW*o–¹~&6÷Ñ ¦å-Õ ú”tB¦›¾'<’JCݺ€Äw¬iuõx.Q¥ÎhÔ8Ó™JÀl6³¾ÀZïòV•žŒ®eJÙÇc{©æL0øóê«Ô¨(OÑÍc|µ‚Üs*7ãl:+OoŒQ±ÜUfÎCäP2dˆ|é@^ÎSÂp{‚;À¹ x©b€JŸåSÅ™‚Gª"„ié“J Ô8h¢Ê§)ÍÔˆ¦²LT‚jÊ ¢híÀ¡‡;o=ÁÙ\M£> AЦzÍßZ5~L.WS¼X¿Fc ¦ ÷¬˜Ý±þX­#õÜ#ß³<ä}¬›êGRBºÅ¾Ù^ƒ{ü«Ä¥©â T ¦§%‡‘}_c~j™­æ;Aô.÷*åæy gM&ƒä+µ¡§Bµ*êë%ç|*> yÒ¿ûO…œLô hàÙÏê„FݦG®³˜GQã{[töÚ¸o®ôO‘†·Âz?Þìù ×ÑMrVÅ(e\‘›WË.œ*$Ñ¥—éßK%ëxŽÕo*1a¶Èâv»¢rMRáCÜw‰™ðu‚–ï¦ôDa*Û†i…Íøe0aʸGðw˜þMð;sX´ßù”¬GLX‰I”õÈäÙX¨R^?‘&‡¿´…Ûl÷ ‹Gi ,ÊÕVêµÂßÁú5“9Ã$íû.P™Œíø líë[™V¸ "˜»Îb£@ª'“ò%’žªœÆ§ÌÀó8H-’²,ÜYÁóP |cúÔ»”JCd*‡1Uˆ* óÕ.ÌŸÝC Šˆ‹Z2¦Ò¯d+“¨¯\M2¿à_ ­¶ÙCc‰úG©ÌÆÙ<鳺)iûyûŠ ìš–áoœÍŽ3Æñ:x6ØëéÔéT°¨-ë•Ýmòý~lQ"·ÙT€µ½¹ôÁ·Ê”ªÂø(Œ‹b†YÔ0‹iÑÏñ©[͵lÍõ}þ¥TQÇôëªî•ìK£”x„ö±*“ãrY¥3ë÷7¦:‡§­0Œ‰ºÒ£ysªh@²òIm_mâ]JáwÉ™ìÙæ‰Œ—;a1'šÎ$ëÞ6¼Äau…ÃÝ'£_Mñ’*ûW]g–ÌÃJP¯Êc±$™ï•»v¦úÖâÉMÊCûýo;ST—üºûà¿qw»wGév©iÌ”…¿O¢œ+ ˜c2LÛ£vˆÂþCë~7"Àp¬qÌo‰â„æ%›¤XÕÌ%iÂ×Ê!m™À-*;7m·p͘RµCÞº¶’È+ÒnIÔÓBõý†€Ä ¨ˆ9G´ «Êøô1Áï(s•y/€ öJ¼‡Á¸PiÅD $ Ée[àL(ØIÔ‹iT$ÞT™âÚ$íý°^ÂNsº¾çõëGë4‡_¨Â{ xT™7,ál[À8¢.²:io¸ÝöVí?ŸvRøª¡,t05 ¿ ޾¹|˜ø÷Fð S=æ;Ì˨KIAˆ?ðn‰¡cˆÂu4¦¬¶MÛ«ð ®NAHÀ§`Þ߆;ðL ¢˜Hí`u)V·­£îysXö=Ø7ysÏK¼ŒÝÆè·{„ôˆßóÖ˜‹p§L&5‘‡ƒÏ3?¾¥äÄ…¹ÛÃ6Î?bð2ãÆT¡àà˜Æ$ŒË[®/Wå kÛÜ!Àñ‰Û^u„) ¯ÉóÓÞ'\µ´·qQtäÑìy&‚òÏ–ì°lb²€!u`@h‡IuŒÚ$¦À%ëå  ZŒcóCŸWlnxƒK£S Î}ÖPëÂ#xƒsá°–/Š—Tý Ær¢¢< á2>f„§lZñ´“âuÛ‘ðüx´h¥Ò¢;?0^<|Ò[UÛi¸wIK‚#9öZayÆxû0Æâ¦2aµaYÔ‰okž»ÇNÔÁ†Ê.ÁúÆì¼Ï@¸ð$ø²{|²D¼ )Õ-S¾•Ö£ÇþŽç†–²RÒ™fJŸ†Î¨—C >÷<(XÀØ#]Œ‹.R¹‹*LAª+ Àág˜·ÃÙ:Vk>L‡èüªd™z`øõpkƒx ãf„%F ÀÁX†õ¼p~"Œk,xzYP3z¡Þ¤„ˆR³®s_‹ |ap'¢k Y_€,n¼‹&dÆõ9(•ÕÃË´LìÛÅ>«%÷‚Ç»NÔ g`2«ñÞļsˆg(]ëѦ¯ˆÐòDí¿€ž‰-ÿöå|ÍŸý÷ÒÁ‹øtëFÜT5tQ¦áq™j5²½>•³:7Ë7ïP·KGŠú Uum›8R,ú#Ρ©N#¼%vô|@ë˜[íÐÞ>º“ö”RwÍC³9yâëCXŒý:^ƒu¬k CáÙàwOS“Ž^žÑ–E¸öïÙ9âôa‡ÙDüŒº@èéÜvÌ¥½ LîO‚á§×Ï÷ýÌÌÁÑìÕ`† > >> endobj 3758 0 obj << /Type /Page /Parent 2 0 R /Contents 3760 0 R /Resources 3762 0 R /Annots 3763 0 R /MediaBox [0 0 595 842] >> endobj 3762 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 3763 0 obj [ 3759 0 R ] endobj 3760 0 obj << /Length 3761 0 R /Filter /FlateDecode >> stream xœí]KãÆ¾ëWð`µì_@`wv ‡‹ #‡`'0¼F&>äï‡I͈ÔW?U7I‰Ø3ŽšÕõ~uõû?ýGò¯ß“÷O_ÿ“|k¿?}Ý¥û"K›’Ã×»·¿°å¾ý9)Ê,ùö}÷’¼ì¾ì¾Ôÿ}Ù5øúô×ú§ÿ%6ùKýï/ɯùSûG‡?ø¾+LQÿõø½*LýSzú~øý¿wûCòÛaÅîu-0çÿÿÎya팑W¿ìºmšã×ïß~Û½o0í-.sÞûÄxWÿ§ò6ùï?w?×/è–O÷•7õ|‘Þò¢Âßtx‰­Ò$KýàEÇ/åM€Å+W„[ü¹:VŒË¼ú¾Ìmá³´*áÏ·!­¬Z‚!HÒ­€$>õY@f:@®”ŽÜpñÀÔ®õDÞ ¬Êä´zj[“†[ü¹6RZjãÅCSÛæ¶E™  Ìß,`qW„îru¬tôÆ«‡&¸/Mƒ´"€µÓê!H’euÇrm¤t䆋+úe>÷­ãä.8€·#è´|ìWe@Q>B®Ž•޶xuEâf©+[Pôfù‹Û4àâGÈÕ±ÒWX=°žÎlž†sº_WAÐÇk ätÿ2e Ióx>øñy÷þãnmž<ÿ\ÃÖ¼óøí¹FI–¼;„†Y™<ÿ”ü1MÝÓŸ’ç_vÕ>·Ybó$ËÑëÑ“ô|òzbàj®„Ÿ°¥p?)\-­à“¸šµè‰ÿ?“A ø7ý=×£ÂN¼Áý`*`RŒQ† ê®fàg,äD ¥Ã&H£9>ùü\+Ÿàz£(Fõ†'ä SXôÏÓu€\ÍBš`.§8 ʦ²¾Å8ÀO0oM±ÀÚcsÖ„vHÍtš O öp­~Âho¸SA1'b9Åü†9d•ü&Xq† ¸Æ|€©9Ñ¥Ä{ FÞÁ|@ìgÉ|Ðj—8¶ºÊǽ>Õ'뤉 oñ{0lÂÃì–gü™Ùã刎ة o1F¡/Sž3“mò|›bÞ¸H»ú¼7ÆR‡½;F1uÜUFô´´þrÌÛ­Ây£¥zœüô’%ˆ1cjöÂÇ®ûÝœ­3—³ÊŒòÖ/ á:ªÞÈ»Šú¦7JoÜYxÓ(F£j”2vGJÌH²L»· §,‰“¼LÖu½Qai¶ÊãVçq¢B¨‹©ì!ÔÒÌj±$=¦þ.ÝVu{Hp•‘äVû_¾GXf[µò!5ÊŘ›®Y®)³ÂYVãΕV^BD¹3S«2þjmSœ8K¥Gá ×§ yó.½á%oÌ>óyYd0Ë}Y¥GHOOÚV‘ O |Ò2‹ë^3 ü¥'®Ö×ïS™Ï‘ëÑ“VQ\Z î¿Ç8ø™†²½³¥9’£Ïx‹p ÀÖBpÅÖñ6Ú9s—È F¡BàLKwaœcNéãCo0 ø¸ ¤e$ÿ9šÊ÷µÇÙ!‚·É4Ì8;œ`3á°IÅJZÍ%”U±O_§"6ügÒ}^˜3YÄ*’’EBÀ0732¯¬¤±ð3Š=Ò{°æÀôaVöƒí6Öûښغ-!ò±†Çèš`±MÃ8Ç/¾Þ´`"Þú¾™ Á;föɹ’«,ì#Â{7ÝQº)„\鼘ñž‚[³ªoÎL¸q¾¼B†›%7O{`^Æçy0÷áóïÌ|ö ïã ®†ŸàûÚ•wŠŸ`!ðæág0`ÞÁœˆçžb¾fv*ÈÃUµàj+°á«pÖŸ.Û‚5÷ÀcLD@õ'Nh&Rl]Y¼pš‰húb(ˆCÓ ­­Ê¥LîâúD‹rÎìUÝfC*Ëu}“S¬£8k?ú$Š;lO‡Ë—¢3‡Ÿ™€”¹Œ\8Þ÷ƒq@í”8üÏŒÂc:„÷àÕðáÜ ³S²J«Ê©¶ï‘mþvØãÊLFz0à{æ?j,`gö#¹TóŽÊ]oo¸’À$ì&´‹1çú"%}ç†ñkvQð®­Ì=ë¸å¾o+½­óœÕsÌtBNhÁ4W3µEfjq<ФÆFÌαl;5UQ·y;ÒÄLåJ¨Æ¡¦TÞL#‚-Rƒ&aäeÏ*µ¾ó%€pÄ46g$d7týúþ·`×ëǺ̘^¢Û?–Õb >­àèc38x±jÁ)¤z` ÉXʶ€q) fìûÀk˜à©ñ¶4¬ú3Ö÷åxuúÏNˆÅJ•Ó¡5yÂC„”©Ío•±0{f,ÆÉ©âjt¶Tj›fJᘱ‰Àöyw7h¬JÁ–s™¦%&K,¯œíeâÿÇ-Ó>3ª›‰˜Ry[J2yS?·ê‡ä¬f_’™¬g%…Qþa/®\@¬t5J_›…˜ÑB¬sPòºiàž®ßÆ š¦T«ÎF¢\¡ Ó’'ÌŽt((¼l_õã5ÎÉŒ0Å†Ž˜½(Tø—×®£37‹IšßÇäÀ™É‘Ç)e§“UK>«‰»£…Œwv¾S¸&víSÝôº×°3Ä=!G_Ï\m§jt”ÝÄ0‡kçºõöÙ¯Ú <$„Ù†Ê1ÔõRw¡ÖÝMöžÿ4‘J–.f¿kBw\´Ê9oó¾9ë3˜`ß>„}ˆYÜK0W«ò„û=fOÎì GÚà¼~Í»fl÷è¶X½¹íÜâÙ®p›"lªsËt3l£>IØ0Ǹ²GP‡g‘ŒE~!›¿ò¢çó„}S¡¥’¹}“ñt'Tx ÇiBî5Z½^·‘C£1jÉ "޳uéÅŸ ÜAóµ4 L(ªrEÉ\^Þ¼-0‚y©áÑ3/ÓÆàñ&Ì”õH#^„VÁMlíšö}»ˆ¥Žüõ6g<1zlžü¥‚]„¹Š œP`FeÝ'÷N++á„Ú¹œq¾,L„/ñ]'ár 1"LIJÍ Äz¿͈ÁfÂNU%}!뺢±0º—¬~QÅ¢ ±q‘•¸#Æ·ÔàžÌ(J§fÓ¯àŠÂžó¢–}Å: S‹°GÂP:b¨© cq+s£Ë±e`4¶êÈWæf'a%Ã!ø цÂÜ ‚-s7ˆ€k¢¥$ÖýZ‚߈¡f°ƒ¥‘ %§L£#sx$)þ ö’˜1ËËð^*ó„&¢Ü@‡%#Ò~p„èpC`,þÇPC*8"~vãqli®°&³ãsyL/´´Õ-¸Â:R×Ë_®|y ®°Õ€~l¬ŒÖ‘Xw Ô".Ob²¥k›¼¸+-u¿1¥®Ì#ã—âyU­&p6‘ï[«4‹MÇHr² K^Y®\Ä Ï*˵)T6ßRÊÄôÌ<Ëà‘ܪÓ[nLËêȬCn_Xp·Ó¢«»P¹ÿ@õTžÎp f"4n.%fÜ*CÀ mÐíÛÒ8 =Úˆ¿gôÀ@XýZ+ºž¶ÛÚj¸Æ„ð«¾X&|ùJ¼†›,-Ì(µ·†›•óõú YZŸTè±S®Ê—+à±(6¶§0“W]JlB"¦3ã‹[8Ž)^ꯑJ"±Ò¤[1"ÔD1bJ$3y¾jÙÜZ #óKÙ¥±Û+¹f}OÙ]ŠñY±ÁÐ <(DcRñüi± 3ÒtÓ;ÔÌis@vßNázC|%æ'ô76uël?´;ËájmÅ+H)Ö´[l°åœ‹ÂšáÂ6 ^ ~¦åp3iëÅ+Û² wø¹†¸ƒü3Ä6ðg0 ´§£/°g›ûó×í3âäá"ïpyût;Þ‹Ôí[™=#VŽðú›¾Õ^cš+ù²û?LF–/ endstream endobj 3761 0 obj 4079 endobj 3765 0 obj << /Type /XObject /Subtype /Image /Width 256 /Height 400 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 3766 0 R /Filter /FlateDecode >> stream xœí”UU½Ço|¸ö*Ïû?P¡úŹçž{ÁÌœ9s¶Å‹û?jï…^¨œ®Ô¸qã&Mš4cÆŒÙû#+ç™gžytè•Lœ8qÚ´i‘zPºöª ¼ÿ£tˆþu>W]uÕ§ZI$>øàßþö·ÚÚZÅ]ú¼yó¤vWj„ W^yå§|477æ3Ÿ¹í¶Ûî¼óÎþð‡7ÜpƒÛõÉO~R—üþ¯>ȶ_qÅ7ß|s2™|衇V¯^ý­o}ë›ßü¦õ¹Ï}î–[n™;wîØ±c#ËŽ1üäÁ'|¢ÂÁ¡ÈE†v-§PýŒââ‹/žëãÖ[o}ñÅÿùÏþ⿸ãŽ;ü»¦NêJ©/¸üòËÝ®ÊÊÊ7Þxã¯ýë»ï¾û—¿üå׿þµÚ‚Û«œ¥¥¥‘G‡Þ‡”yíµ×~õ«_•ò¿öµ¯)ò•¯|eåÊ•uuu_ÿú׿ño|úÓŸV ,WRvñä?;±êþ³ï¼‚¶ªûÏq‘…÷O¸eÙø™—NöxuÊß!ú—ós‰Ù|­ì¿Nûšk®ñïšÿ50¼ì²ËªªªäÈm(//¿ôÒKÊ͸îºë¬a´”š2yÊü;Æßÿl¿åÏÇV<{ðùX òÀsºëÑS§L9³dÜÈÂõ?< y2ŸÈF§-K~ÓM7É“yçwô=¨å*ýüóÏw¥äÿ«;°ùW­Zµ/Š5kÖØ Ê)ÿ?òèЩ<úè£R¬~ éߦÜ~ûío½õVSSÓOúS¥«¯—ª®®¶¿à¾ð›òì³Ï¾÷Þ{RþÚµk—/_žÿ #FŒS¡ßýî»ï~â‰'^ýõ¿ÿýï¿üå/Ÿ|òÉ%K–(]{¥öpÁó'ÃÝc–oûpͶ˜Â»Ö;ë²KãñYñøìø¬9ñøeñø%sfÍœ>szÉ™%Ê_¨þ‡DqÖYgɰ«>ýôÓ2Úú~d¤uaòjÞ~ûm}ê”G6ß•Òè[GYY™®E_ò‹­È¤¸¸,F™‡ÆÎ§Ÿ~zäÑ¡ó§-ñ¯[·NáÏþs—®_ÜFä©îÙ³G‘ùóçë‡þîw¿«¸<iU¦^¿ûç?ÿy»Wq õ[ËïÝïqO9å ÷dðÿøÇ?JQÛ¶m“´¾òÊ+þóŸå`hï°aÃ¥Fqa¼dÁýƒRÏÄRO÷Im‰}jáèOLûÄìY³¿üPí;ÿ÷ÎÎ/TWvúÔéS.žrúiFN¢DÔ»©·ÒÙê2å³i`+ý«·š>}ºÎù'?ù‰R”çŒ3ÎÈœí¨Qú*V{lذá[ÑÈ×Å¿ÿýï«kÐÀÇÞ8*䧃ŽáÆo”žõ³úõ¯¾;éK_²}´RÔãÿãÿP§ ¸~Pµ…Ç{Ìé_½¿â?þñªc¼ßãž}öÙò+díeWÕû+>eÊ)Jã_yÚ;tèPþáÇŽ{Ú­rÏÿ|ø¾§b÷>õ/÷>›{ëÐILZ’L¾þêk»_ß}eâªIÏŸ4q’j9zäÂõrR²½™© TÏ8cÆ yk² jõ’®®WNà8iØ•RûUs¸çž{”þƒüÀù<²'.®V{/^¬œê­"ô°#Kg¨^«\»suìöGbU+?TõpŸ[îsÛÃ}*îsëÃ}®{ Ï âAGsÔ Âõ_EQ6j°:[ëɨÑöºRGu”K¼÷Þ{æwïÞíâ2þ.òG:¹"Vÿö£\i^j—ó£¾~îܹJT¨òs\);æÕpÕ~¬ªª’e“W ¯øšk®ÉDÙºÃ?Üþî²ùÖ%øÍo~3{öl›¨½jáR'Ÿxò¨SG”Íû+«ú\v‡·y‘+¼Èœ;û\^õ¯C‡sú5)TÿÇEqÈ!‡|ÌÇ%—\b;Áwß}÷ꫯþX6®”.¡ÿþ6Qm\Våw¿ûJíܹS¡FIrüÔÞmå<ì°Ã"½ù N]t‘”/IhX!ý;=}ôÑá‚2éLº`ÖÌYS§MM“™6}úŒøŒø¨Ñ£lÿÒ!úÿèG?zðÁÿ{+žËo·OLäºtå9è ƒ\©üã*èöqÄ:y9j˜ ?òÈ#Ý^å<ôÐC;éÛ†ž†ôÿ‘|DjÑO¯Ë–-“=ÔpR>¿Rì®Hý åÑahäwi,yìqiçªPý…ÎDš·§m™8qâÝwß-¯Ï¥hïØ±c•Ó_êÔSOUŸY§å9í´Óüe¡w£ßZƒ\™ÁȽvW‡è¡Cô/?JRŸ¶?”G¶Ý•’ªÏ=÷Üý–²L˜0Áß¾ w#m=Úø+QL™2Eö°CT¨þèEªÿ"€^ú‡™Bõ8@/¢Pý×­¬«[UGHØ;Âvè¿fe)ëmŠ×¬Ho©):qâ=?^¨þkjMA¦–§’K“©e­á²¤i Ùy*›i ­ax¯©gY2.Kùó‡kËæ? !a8,Øþך‚vS¼zIuõ¢êÊ…•Õ «7­@ò[^ãÏ“n&ËÒ ÄdhM·»RKS¶m鸪r ÁWOþ¸­ßnŠï7?qâÛÏ »PBmÙÞòö{o‹;wHÀjÉ%I.õ¤¸Ä„J—¯¥<M/݈|IRmG›*ÙûÖ^m;^6•¨aªÎÆ é ]Ù5ÛÞ'®£,¬®YU³oß¾¦MM¦5yíÑä´­2ûÌ Û©ßÖ°ÖüÇ¡yk³$×¼¹¹²ªÒoaµ‰,ôº/¢PmÞÒ¬#V,¨ÐG»™] *ë×Ô›J¶x•l1•H±-ÛZ²2/¨t[³ [#ö¸Ú¥"ªJ­Ìæwylà œ<[¡úøØM›¤7™ëò9åó+×'öîÝ«Ž â¦ YríÒ ØjRÚVذ¾A’Ö.û§xÛvÖ5Øœ‰y Ô¦ÊmfiÚÜdz‡½{•²çÍ=*Û²µ%qSÂÖ\¿¶^»”^½´Z§dô¿¾1>7®îCé&óöÓÝȹÊYlÿ—×Xß…o¿eœÉÛHw~…q‡Þz»|n¹+Mªƒh•A#n#éu Ví¤Zô™XP\™m%2ÚjDiý¯k÷bþ7úÊ.s Õc›,¼šŒmAjFçÛZÔÒ—&»µ¡QylÍÉE^:Â9,Tÿéa©·).ÍKT2øRBÉÞzDR$­ÞA¦[²Üµ{—¼qk«µ)RQeZŠˆŠ”Ï/w•(Q)VöÊiKIÏ¥•îÙ³Gõ”]T&÷ÆÔ° Âª]î“ÕF”!p;¦°MÃú`ó'~€Ç Õ¿+h7é_rÏŽïØ¾cß{ûór3ŒŒ·µÈJËVK±’¥ZSfù¼r¥H“R¦¤«*%ÏG”J)]®KPÿkʦ–©±HäŠÈª§õïöJÿ»wù[™:Û ­ì•n#óg;À·‚íÿÒdjië]—¥ÉæMͱÊ>KÒÒ³1æsËm\š—D­ùUC°’–VÕ@¬gR·ªN5Hù²çªDmaÏî=Æ#š›Hyn¼uclDMÌê_‘´þ«Òú—ìUVuÊrùµËš}]£GÔÖØ1ràü‰àñ‚ív%Æ·—ÿÿÞÛÒmÝê:cÉç'vl3žŒ>šQ€7ÕXÕIºra¥…üš¦Q[#õÚlRxýêzÕàÆ¿©Öñ¬š‰Ñÿî]ŠØA·yè°¤ÚýSX{íQ›_#·Õ*TDüÄÃñ‚í¿ÿ>ü’¤¡fØ{½ÙÌ-G„¥mÙp™å²eŠ›nbS“"ö¶ÉÖz«ÓÞMßö´5x÷?mUêYT*éY{ÓÐæ”›sðvÙÛ¡™shMÌz6AH¸¤½ú÷mi±Uùn¶nË/L? 6›§^jsƒtA…}"&õšfâ«ÁöE™R™[ýÙõ«*×§¨-¤[Нlº¶ÖsH?`cóm…êߪÈZÉ) ¤G攟ïÝ×[bT©-ì·l8T©ôÓ® f,ܪpB¶‡í°ÿí>\õ¢jçÃhK\ŸH›ývI×Ùvgá»ýË$üÀ…ïßþ·£ H®nbCûÄŸôõ;Õmë} ÃaWÚBžv±ý'$ìQa¡úKÿýK'•ÆçÄËç”w^¨C´ãúJ¿ƒúÕ¬¬1ÓÛ¶¶4omî¼°yssݪ:µµî¾b€ ©å©]¯˜)g&ì¼mw:LÕ'nõ?zÔè¶ëßÕœn_=£I+Î-&Lëß‹*nÜÐØ¼©¹èè"»K‘ú5õjFÿ^³ÈóÊÅSËS6?âêÌ4ô= +K³mN‡Ò¿×ÔÖÈò+.‘«-”N(ÏŽËÚ7m4ú·yÌ"‡+kÔLŠŠŠ”’Žliv)þšM¸µ¹»¯ ƒùg–çææ¦ÍM6ÒIqÛ t÷d0¯+Úl–÷—WÓÙ›mÝ}Ŭñ·âÌuS'Ä7§ß ÖÝW !#û]nnêî+È`ýó.¿× t÷dH‹cSãÆÆN½&ÐÝW !=òÅþÉóÿÓöyc'DZÿГh\ߨCàÖ­qCcw_1@†äÒdúA•»º¹©Ããéa[šÛñª&€Î£ÿþõkêíÌœ6Íálw¸µ¥amCÑÑ, =‹¢¢¢øŒ¸}ùcâúD‡‡ö•Ž:DñÀâî¾V€^NÓÆ¦ºÕuõkë+TÆúvL£O]½Ð¼Œ¸qccýšzm•Um­Ü•u”Œ+iÇ9´½Tûê‡ÞAz*N_ó ¼ÒI¥Rgñ`³jhVåËÚZ¹+›¦o¬nU]ÁgÐöRí«z n*ZùÜrmýôO.MV.¬´ªˆÏ0K=h+oŒ¤öÖ¬¨©YYS·²®_¿~ú˜Z‘R¼¦¶F]J/›Zó¦Õù+/:ºHÅmŠŒ¼ ¯©°¶¦zQµYeqiRjte-‰ù õPÚ;dðÿù(⿊À™¨”ºW*¹,©s®_]?dØ›Ù]c ~8а5ïÿ­­‘ï!mH9V EEEêbÞì †u 1O~åóÊM~Oíjb^Â}Œ¨Ük\Ú+qŽ5Úè¿6¨ÉOõǼ9xʬ¢o¬amƒª¸i•ž¥zŠeæQÏÄWÊ%ªòä3ïΜp aüYÔ•i‹*mÈNÚ]òX¤ cðkkäë¨Eh¯,¹â1¯¨¬ûÆøÿ«ëÕ ¬I´ÿÎýФdBÈ÷é³ô¢Rç©ú»€à™¨ÔºWCÅõR¾zÙùÀ5¢ÿœÀT|¿ Ë.*3ƒâldKã³ãÒUZúãšúÈ&`+—e–›³úwöQPÿ *J'„Æ>}ê|œþUgÀÊ:©©efô­‘Å âtwæ;(ú?ÀiXŸõëË‘«œŽ0“¢­ó`]ççÈW‘ÿø˜³roŒ)ñ+ýÚz›¢š»å;œ´aÿ}gh ­™åPù瑆ÏÄ•ŠÏ‰[×Hû¿ÿA³¾¾±ôÐ#^JýÇ<ÈŽ7í=I}Ô^mÖ¢>æ©\¶¶7q}BÊ—Uaõ¯Êuvè*5Ú#JÌþ<á3q¥¬µW{É¥—Ó¬kê5Ïp>èhÔi§èØ›$“¶±`sjœk‡®= iØ-EbîpöùoŒä£Í9Ñ?ôX“-Õ4nht·Ð1S}VÕÙj ÕKª+«*•ÈénKº¹”åsËí]G%¢豤–§¤j7&ëv·7ÓFêU†˜§i>œÓÌ=óîí»Ç[æ9¯í¼lèz2%JÒO”²õ/#/åËÈ»ÇFþi.gé¤RÅeêµÙçÅJI\Ÿ°{MãBÿгI›nŸª3ÓfG<6ÍÖÖŒ}/ýCÏÇÎê‰y"·ÚnÇ´™ð4¡,ÿgçÿ0µzò|¤Oy5f”ê9öí˜6 MеŽíx™©5нØ;öÒ«ôØ]vô¶Ï5*4s·`gzî8r¥¿âsÌj›Ï1ïgµÿ²ìí£ù÷¹ÀEÄ<–¾&Ñÿ×'»:‡ÿ‰ýÚúôì²Öûá–ý~Ñg:b‡Zžþ/agüF9iû\£B3wN!ýôÌ+½ÝHlî¶CÊ×jõ߯_?{J’}FßnÂúW…RµScúß©}³þ^gm¥üßF䙎ØQøõoïaÚ[—voxnC9“K“ 딿xp±›Y*0›(ÿ "‰ÎJeÊô•2;TJšžË+•ùw䌸«DæÑÌñXX]>·Üš}óyvE׳"e/Ö}-ŽÀL'gCLmž8í·êÒ—y8ÿ7é¿X6…úæU•_–EGé$•3ðÿÐHËžß¾Ì<ó¸¬DÍCÏy §(ûwosQäù6rå ±£ðë_2³0bóžæö8äØ3Ñ¡oÛ?;(ºTöl¢ü3ˆô ê›w¥‚“<üËÅ¢þoOÉ>˜SNû¸M§êÎ6zWÞz³Ã3Üï¥ó·ÕZa¸ôÀ¥å:\ ¥Gþ÷_gXyI_£]@, }LÔOÔü.ÿeîw—_æÛk]‘ù‚*eµp_s}agÞÙúϬFrS…Œjxn+åæŽ:E¹²‘¥³‰òÏ ²}¨ªuëY…õïŸeø¨oL¿…ÿ”tP{ã([ž]ùë±_KäA­fÜ/ëæØé…‹—}iù—çêb!ý«NÛâú7.D”uÍ3¿Ëýúùç±ä׿˦¯Âήqäú6‚õ‡Î¼³õX!<·Çí(íÚ¶þ²áRáÙDùgÙ vté‹ê›¹×p€`o5˜˜]B¿ƒÞð@=‘zOu #×-€žŒ›ü“ëQ];ÐpÒ>Ôs#S?áY"ÝEø¾âûÇ<À²þ[o…9"g‰tý&™D¦´ÿÀ„™üOIº¿þ#žÅä~å„”lg,Ø-ð¨B#b{+8ðü.ÏSr€®Çùÿ•U•á‡ì‘ÝÛŽEÀÉAÿУðÛÿ‚ôŸßþ;S8ð GÑnÿ'Nðf‘“5é~Ù©‰áY"ÝHÎñïœÐøwN[;ÄNü¶ŽµŸÀ,€. ëçÿäZÅÅ­Z™'¼’Œ"þ•{#WŒé? ¿]å Ï¿8á@¦‹çÿÄr¬ââ_µ&2Oà9šÕ÷OºˆcV¤xÄyèâù?±¨U\«Öò„W’ñgÖ!"ÿ[ù¯=@ºxþ% ÿÈUkÿ­¬$cV_ñZ–Y2(û¯ÙnŃœ(eSý¼k"éâù?–Àº1Ñ«ÖDýÓÙ¿’Lb^BÂV÷ÿýXöŠ1ª0`éâù?¿¶#W­‰åþ§`%áÖÖ¬#ïËÍ5Òø—„éâù?–Hmç±ÿyV’Q“´K¦„WŒI¼Ì؈¤ëçÿÄ ×äJ2öƦòØÖ¹bŒ†´cð½ ÿüŸ<ï?ê¨×Z¥ßŒ0 gÌ»(”€óÜ$ŒÜÕ>ý‡ß&Ð-dÝÿ÷¿•)ûUP¹^ØÔÆW†_#Õ7ߛѺŒ\ú¼ *çë«ÚðʰÈ×Huàtk€vãŸÿã×àUP¹^ØÔ–W†E¾F‡™™ÐÈeÿƒ/BÊñ¦¶¼2,RÿJìÜ h…ê?øúª6¼2,â5RÙÓº‹BõxaS_xT`:À‚ÿØN¯S endstream endobj 3766 0 obj 7788 endobj 3767 0 obj [183 /XYZ 38.2500000 101.750000 0] endobj 3768 0 obj [183 /XYZ 38.2500000 101.750000 0] endobj 3769 0 obj << /Type /Annot /Subtype /Link /Rect [66 652.250000 141.750000 659 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.android.com/ndk/) >> >> endobj 3764 0 obj << /Type /Page /Parent 2 0 R /Contents 3770 0 R /Resources 3772 0 R /Annots 3773 0 R /MediaBox [0 0 595 842] >> endobj 3772 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << /Im3765 3765 0 R >> >> endobj 3773 0 obj [ 3769 0 R ] endobj 3770 0 obj << /Length 3771 0 R /Filter /FlateDecode >> stream xœí]M㸽ûWè¼ÀzÄQ˜™ž ’C€Á °‡ ‡ 7›Åb{“Îò÷#[’»-ù•¤g’’ÜN#Û=–ÅbÕ«bU±øîO_ÿ‘ýë÷ìÝǯÿÉÛß¿îò}YäÍÿ²ÃÏ÷¯?Ð~ßþ•¾ÈŸvÏÙóîËîKýßç]óÂ×­ÿú_¦³¿Ôÿÿ%ûÛßël¿tøÂÓ®Teýû×ãïªTõ_ùé÷áóŸw?|—ývh±ë®Ìù¿¿Weé*sÆH×Ï»nšêøóûão»w æõbŠÂx—)kl¦*«³ÿþs÷SÝA×|¾¯¬R¥³e~MG¥>ôd+Ÿ)]ÕdÏ«AGÇŸ0Í«—¹‹×øqäÁ©¢ŒSrë{ïti‹¼þúû:¢•eK4cb¬É©ùW5½âqÓaäÁ©Ò-8n=¤4W^5r¹Aÿ®ùôw…Ç‘§J·¸¸õÈÒìœÍ¢UE„%9µc½Ëƒz‹Õøq䡉Ò.÷ ñ/sÁ#y±/ÔоpþhTÅ¡ÝÚ¼éþíöÞ×â~üU*Õ~ê3Wœ¬¨ö“dz{¥*í½:}Ëœµb^÷Q¿ý÷ñµ¬ÿ¶ôaïôFRËŸµâÏûøy÷á;Ù²zHöáÛîÝgeU½.ûöS½* µ¿¾=íêI}ж¹Ê¾ý˜ý¡©ÿcöí—]µwºè§}ò=Ñ|§€O>Ìï'Oôƒçãà<Ÿ°#Àý<À'>ùŒž(ú¿åÏZñç}¤A?}G¿;úM{gÍè·=¼2=¼2ñÊ ðÊ\À+sÂ+s†W¦‡Wæ"^™^™ xeNxeÎðʤÅ+«F×U1rwcò 0–bÂïàùàQC‰lµÆQ†®ã— 0‹m™¥,;fi¦¦Ô¾°Î—Å«a6&ßû*?Žô…„ äû—¯6ëm÷Ö4é>å.<ÑDǸµ–¦—ÞÁ­á Zb˜ŽhÍôIÜ0Z±7Ú«©ÓÀSǃ%ˆ/ôƒ'è'óÐ<\u¼‚BkÄ ?˜F–U¾w¥:çobÔÂòcîjÛtvå|°¼~FOÚ×%à~rHøD˜©IƒÓ¶ªÖ3l-ÈmK6Ó­ö8õ°‚8£(@E &M‘}5•Ȧ±PÓã~Ôç‚Ý€÷zpÔB?ø ´ªZ9‹hk¸±a?%`ž²áÂtö°‚;TíTƒ÷®˜«˜ÝÛG£ðKq¢/¦"\ay ¯–Ð~z,…~ 'Øÿ‰wpð‰†>Sܚƅû'Á·†wc°Aj1 ÇjÈK-– –&Š8ÿ ó ¤ÎÃXƒ¥–By̱ÄÆ°è œ "¨skÒ$T4úPÎ|w"FÈsÄ#ÅO°Ltân›Oîr–\ÎfÑÛ×H´rÂLñÙtB³à5ÖŸÜa*ÈáùÜeaa3Š©^ŠŽa_5Î!ÀïÿRáºÅ#Ð-ƒÍ¢ŽdK`ã@'Â$F¹‚ºÌ©UŸÓ¦ Lzñ\SÌÖÖÌç”ÀÕÝfäL$‹9’H,¤þú§>HB£Òf¤ áÜ ‰=£õó"ê¹BÙž¢›Á‹¸ˆ¼ÄÀE Si>¦LLKé7&§¡udÍ:$"ˆ,¤Î4N}€×ɽèSéÛ¸‚ëo°ëoap n„° ¬Þº>°2Ç¡Ë^`8FnÂâu Æ®´é“þ^áþ^áþeGnB?ËSgzùq Vi××`‹•¯Nf$§:‡5ÛÑ’Àçà%Õ&.ˆÏ…9eMqã˜Óˆ)Æ…í-o²ƒÄñϰ¥óï+ƒœ£eå#C×ù_3rÆA¼'ÅîÅéÇ!ÂÖE«¤d`Db…Œ?z2å9þ bËÀ³ËŒQ· æíûN*ÁÙÒ¡YªØSÜ€!ÃŒl¼&ìSc*(aÝ„oÃÔÁç"™Úx÷Iœìg¼ABkamb% >~Bì< n&ü…˜Œ‘ñ`ê^~,?øÊcO¼ÃôÃÌ˃U+ u¢~(Zò³a!ô‡°ÚcúyÞú脸Qm"žxßÛß÷ö$ltokVìù_ïÞ^çXó#Áز š‰JåM2Ù 7èß°Å&b·¦6éßë{_ .—©yÙ<¤›]‘§öѧªÉøþ6â¬8S_„ªGö;\ãï7™øAг 먢SèÔ±€mryÊ:&…݉Bê ôãásÔ9.lq`; Ë#‘¯,x`oìþZÆ3´MÛwíûñúg³vŸ\Ý9Ý[ìY÷._ÚsùÂoæ² %ì…ÚÙýFðW™;˜»ú„Á-!¤üú6¯‹ ..Àl—²/zÔe›ƒu‹ÍT¹&¨$\ ±øÚ ¼ µƒ 7â_iØ\ÿôZ'w¿¹eQ’É®N\ ­‚øNuWˆ'øêÄøÎ¦lqˆ[c.ß u)+±»²«ö¬™¥L>sÚŠ¨³wðBK°+©&P¾Òq(sM˜,9Æ×ÌÔ« ë½LT‰—º‘ˆô¾‘AÚû“H`©Ô$ðÖ¤Ið¬23½ßÙ)y}qü,­F‡BD¾æh&s|_jy*XÙºî/˜”Kiq3:ÊN~^?ÄÅsWÜ3½ä~‘YS<Óé®YÊÁ\@Ž]éƒkåðªc9Â×§â]*wË`50•Vò –û0„­ L„¤f\è) –ð"GLuVÙ¾>Ãs#FÌõÂLøf m‚07Ǹ,rI©&ØtNÐó!Ì#"‘oeŸ¡„›ÓoÍì¶þ0ÕZÕEhm´M•¾Êé]öø$¯.\ƒ¶öØïá¿OÙ»??™ÒYöðï«QÝgªº„êÚ@½Ôú”×.@¾/š=Ó íÞ£'-{튽akÂ;Ÿá;|Çwg©z!¹²c¨¼2Ÿà~Z&¼DǦá;Õü'ÂØ Ý |Òâ¾r@¼ÐMŸD´G7LƒvlÑwÛ¥vÝÁÜSùÛ²?˜È—…SWc+tº–t\Økå#ëÅTT5¦ó[™ö¥ O¶•šÅuŒ/?vड़!i„)EŸ1¿¦ï+ÊR®œTጵe 8¨k/ŠÉ3Q)÷=(hÆù0H–#òÜfdznj“ tŒ ú~º¸)ÕTÊÔÃ|D5'[Õ5Æ÷uÚù-èj :FJ5d^Aô° ÇpRÆWM3d}ÅgRÅ–æ`rØiD׉ªæ¬žRœ‘® u…-Ü#Ì~j«Ð—2<Øao1.VI3²Ì‹nß§@˜Z¤ÚºÆ1ÛŽ±ML'šï²—K;Ø Õa^ f[èݤŒ¹ ž•ÕÅXˆ +<¬mÅl(K Ó +Æ­Å$Ec³š0U¦§X,ç¨^4OCHd6yу‹TY¯Bu{æÆ¿±L戈k*Ý£a*¿ã’û%«Ëþ¬§çrà| A‚ºæ aSÏÙÆ¼Qè9Å8g ¡ôÓÆ Á)Ó‡UÆ]úæâÒËç ¾a£•1ÿ '|ÈW”lˆ(ÌÞ©¾¦[ª4ŒÁ|ûž0z¥5„=ý8ð ïEæxÁ™½ÈJ£É‚.Wu§}eŽ+–á3¯ÌÙBâíhÝÛ˜q5ðÐNA‰\€‰9±6÷…)6ÉèwQaòÛ¯wüšQU¹–D›ã´ëŸì¹žŸ8ý/c_˜@ÑQP M®¦|¦O1F—«™Qyr °é½n2˜_=i´³>i+Âè½ë§ïjEýõcÆÔÚ¥±}ng:ôC»›ÛöU/Æ%7œ`˸º f´ ÓP¸5øN+jÖÔ_…pX†;ü]¸ù'H;Œöð;˜Ú;ë.°g›1f§,Ú'ÄÉÃF0Ýaóúãõt/s³oeölp@Ú´­t¶è5†\Ù—ÝÿBt+ endstream endobj 3771 0 obj 4220 endobj 3775 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 778.250000 102 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_intro >> endobj 3774 0 obj << /Type /Page /Parent 2 0 R /Contents 3776 0 R /Resources 3778 0 R /Annots 3779 0 R /MediaBox [0 0 595 842] >> endobj 3778 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 3779 0 obj [ 3775 0 R ] endobj 3776 0 obj << /Length 3777 0 R /Filter /FlateDecode >> stream xœí][oä¶~Ÿ_¡çÑòN (ìÚÞ}(`Ø@‚>›&A êæ¡¿ÒH{4úŽFG‡òªFcïpDž;?òPþúô¯â—?‹wOÿ)¾t¿ïž¢ôV´ÿ+šŸïß~ BÙý]ø`‹/_/ÅËáñðXÿ÷åÐ>ðt÷÷ú¯ÿªø[ýÿߊÿYøS÷¥æ _^úú÷ïÇß•—õ_âô»ùü×Ã?¾+þhzì‡ëˆ9ÿ÷÷ÒçLCÆÄÐ/‡~šòøóç—?ZÌE[¯U(¤Ñ¦•QÅÿ}ø¹ ï^”Á)o¬¨ü›9¸WÇÑ.¤ªjþ»‹±?qz—+tntX¯ó#å±™"µ“dçee¤ôÎx±D­:öT²e f î÷ݯÀý ½YQoÊ£s¥—-î=¢pƒR¾e­{‹ÏÿS÷k×Wn½Î”GçJ'\¢÷˜Â ¦j¤Dµ‹NݯÀÿJØ5çHyt®ôÂŽ¯„+)ªÞšWÉ©÷5ä-]±ó†òØLéÄ}ÑùãœNÞRrníí' s|!üô|øð¹&ÉÏ?×Mí€Ç_Ï_¦þG“8]<ÿTüEYýP<ÿv¢t^†:£n¾×¶|<¶„×TûA*á”o¾*ÛNtY'¡R½íDÃg±E—Ö¸fÜ×Ça@’¸;~`J£ÛÅÀk‹…Ý{ؽ½=[l?¿7-NÐÀ)Ðà b’ð!IÝÔžk%}Õ/y©_¦]QÓèm½0’•ûÁï‡'†ÚO®Ò\q½æ6$ T÷þ|6ü1¥‘ ëm;jk´£ªÏÇQ«òÈZq)ð‘–N}Æž °ÅÃÞî`Ë'ØRÍÏGÁÞ0mÒÍçNç fõFHAÇ䨖ói#ø†gŠ¥©Æ-xB ¸· isfjÓp[#Áû˜:Ú…†±q0G±VAùhØ" #x€ù†ý[\½Æ¶Íð.Û6ö.Ø_Cí%üÁ6¥iãx>¬×Ï”1ŽÂ^l·Ó ìëŽÆRÀ<`Ä,ÂêqÆÅˆš„Á’‹ªo˜‚ |Ϋ™7ŽÛ„ŽâÜߥ[‹i¬E°#¯ÖЊü@Fàµs.­KÙ¯°‡&7²ÀVøŒT\¬ù1Ø€Œ™`?‰%ƹK`RWC)áTm*IXQ™¤ : ùA- iØ‚Á&'bèÙ€ ÃPpàNš×|„&B€àœ`çûÆzcÐö­8ˆ±qî‘×Ô}z¥»‡®hÁãpF€ÞX™0°ä¢¹Oà‚ø$ D Ó`Áö)Bƒ>^h˜µŠß@^:o­!×VE§‡ªH-L©sÆ1oèK‰N°cX>ÇÖˆ`e‹ o]á ª)6Ïíâ©3\(z0Õ×ëÌ܄X `5¸>AÄ4Ñ nĦðÛÈTBÁP 8àò¾0‚‹®Ö<$ˆ^ÝÒÞ*3nc™®aoDÀc(ÃP*nyŸuÀ2µ­F/:÷=YÒ(9Oе‚£ÿÝz%´‚œœƒÂÛX³±„¡VúbÒqĉ+´'c½Òð͘OJ]t²ZÂyN 礒#¦ÀÂùà ǼBŽ:,‰NxTËY¿„R4À8nƒý/¡qŒí‹a‹Ý«ñuÌ»:öíx5Τ^­² d’Ò«yi–h^E@?7Cd†Ã«",|Ô÷†ßàÍr¾u§Ñ­—h6ö)‰ŽÇm!ÖþXËQpDÛ¨âã@Q-ðÝq{”,²yoÕkzo9ò6µs`ŸS„7KWœãÿ˜‚”6ãån3[·ÎêKKŽQÂ)v´íVÛYmµ(oÄVË)¤b”:Çu9óÁ½1fúÞЊ”zD‹kè+’Òcü¤ÆÝ~‡(‡aDQÎLSí}ç¼s—óNYøppnrœ¼‚È"£Q§Ü› a »Ñ<”QBIÌÛ0^ d+a&íäöþ.¥5Tjn›q||oØ(±öâÄ{Î39{FÜ[°ë;ûvÍ]œ ìyGr°ôŒ‘Ö¤ÑÚíèæuyG@s±¦0ˆG·¥'ÙŸð˃åä/Q=ûŽíÐÉš´ŸœÃŽu¼²‹NSn33®í!fʸÊ,ilñvÒnïÕ’ê|µèÓVØÒ–¢Òçåao­ùHÕ7]C§.ŠÃ7(9\ŒBpô¢ÐÁüTU0, pñ6¸åjX1.^£Ž†–|ºãAu·Ì)<…ü#êZ£wN–®\îüÀ«îå~dR2•­­TÃ.eI]MФ´÷’ºëõ,äq0¹' g½%™á…I\ K#a]MJ8å"¹²{A榴tž'Ì¢ ³ò~ZçÓ©µ“]§lÌpÊ… \b±T9[Ãbl‹rØ ì_À¸Î ¨ŽöùaT¿÷V1ß8›úàšÈE¥]‘³tß¢ÞØE¾[ }*ÄcÜt»g¤=Ù ½W"œêH0¸ŒoŠkUâðM}~u“ 9L_rÀ_ ?À4–FKÛØ>ËpÝ cÄb9a£Û7¿âµ]tóK»…ÁØ®ÀŒ¼c]…wf}àŒÍ Æf¤‚»ÝÙy;1œíPƽž«ìS­Öª0Œkïc#*!ú_ÉÓ;ëg̓×VŒƒxuGäîŒÒ\´Œ[8`œXË3V«Úˆ¼Žƒ9ªqÁ0Îɹdœ£ ¼)®Æ³.ILõÆ®M®ÍXVÂ8FJàŒ]:¦CÈ”SH†÷qãÚ'•Ía|·¹ lŽƒèï§^¨â5Â~ûÕ7¿òw×\ÏEuè¤<Õ’d€üáõ.çU Œã²‘3Ï€;AYY㢌㞄ÊÜþhòÎû`ÀVûjîòÒÜ](j£UÊ•ÍH_Oÿöe¢p®ùå¥ì>­ gËÖ³ˆþ“/gJ)+‚<}KŸõ¢ßŽQ¿û·m+†O›‹1LóÌ€’ú[ᬗp>Ư‡Oß­º„ÖשÓë¸öT ³{ªž.À)MÎõŠø.‡5À·Ó <¦õ˜æÂcšiNÓœyL3ð˜fÔcš iF<¦9yLsæ1MZiw¹{Ì+)¸½ÇÜä|,>ɸãæž¹þ)^jwCz£Ç©/\±’ £ÅXR—BÚšÂBõG¹ºµìØþhku~$‘omX•ê¸ú½ôIî²¥; Jg[½ÊNÂUî=GO£ís7Sß‘0ôcxÕ S1be7õ‹ vë|4¯rG¦!qoð™ÎÈYS÷¯jËU¸æoqª’‘wè€*€ŸÁ*н> endobj 3783 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 3784 0 obj [ ] endobj 3781 0 obj << /Length 3782 0 R /Filter /FlateDecode >> stream xœí]MoãȽëWð¼ÀhØd“@ cÏÈ!€1rXäÌf³Xdqö¿J¢l‹ä+JÏ¥fSîY{ÔbTW½ª®ª.~üó×ÿú½øx÷õ?Å·þ÷Ý×M¹ Uyø_±ûùðúÛlû¿‹ÐTÅ·ï›§âió°yèþû´9<ðõî¯Ý_ÿ+lñ—îÿ¿?þ½ûð§þK»/|ߺßÿÞÿnƒéþ*Ÿï>ÿeó·Šßv=‡ë'súï&´µÛOcfè§Íq™fÿóû·ß6¸lWµ6”…ñΦõ¶øï?7?w»/·­7&Ô~÷%~ `w#yÛuaÛŽì¶ ´ÿÑéÞ\¡óÚ7×ë|?suªW¹÷mSÛ૲màßoZWè>>­sÖÛÉöÒý:oª+rÓ~æêT9n8î]SšÛÒ÷Ò\Ö×ççþõ7 6;t¾Úîîg®O–ãöŽ»¸¤<—¥cÆJ§m¯,Ú]¿ÎëÿÝt`Ñ”E]ï~cúOmQWϪµÿäÛ¦ö[cº¿óü-wÒ‹{=F÷ýþßÍî±bðtÃ1ºOºgNg²ûVsÒKs:Æ/›O?ÈêöI Ù§ÇÍÇ/Æ›Ž‘êâñçn_ÔÞÿzü¾éõa¿Àªxü©øC7ÓæÅ㯛v[Ûê¸9}Ëj±-|¦‚-Ÿ.§ü1^O [ðzˆÔù[>ë-®Ôzb÷°Å]¾R<7LÑ•®' g.ŸµÃ|pxæó£ˆëç`i{Š¥®œÂRW±t÷ÉK÷ßr'½¸×c#¦}˜Ç1ŽˆéÌb:3DÌÝ'CÄÜ«9é¥9#bÚŒ˜1ÏœÁâˆiJø JxÖ·„‹n€‹~ýý.úg\ô'¸è¸è&qÑpÑMà¢{ÆEw‚‹...újv_ Þ=×)«c6–!ü !«X"ü޹¹{µ€Á|Ï`Pô v ‡1ÛÊ×M¨^MÆî[šmÓ–û™¾ý Žš—¯xÄo½;„°†Ôžh±ÄÀ¸·~¦žÁ½ázb˜5Ñ›’øÀœÕÖÙÆœ» ¼t 0‹b¶¾»º C%2F+8q¼EÆir)~F@¨!›öÀe* s°Â´®茖KÞJ s TàNÁŠ®»“ÂÀʉdF{h\âq 4!S»1ଅqp 4ä{msE˜ ! vÑÜ_nfºãÚB]²âäóºìÛ˜áÂ-f+ÆŸe‰–öÚÛÝaÚP«\]“5¡]&ÃÜ8g\dl6¸‰5óÈ„ªÚ×}'å¨â,z‰ñ‰iŽ×5b*Ø=Þ„±Å¼üaXõ}3XËb»€gñÀç;T‰#P‡Áï]Ëœ@qUÙ,$4¬é´ëЊ#¼E=ø]ß1êKÆàBJøDyú°?KëH¾ðÀˆb¤³­spxJÀ-}PvbÿY‹[…SBo.ûÊŸ*‘©C á8ÀÖMè€3ÀsËgé«ðKpGúb*ÂÆICx·„qð30Ô.Œ9©‚½aîÃká!÷f1Ea0P â@%NíÀR‹i9ÖB>\X2ˆ„3çãÉLeÌìL1&1‰8b¦¢&WåK°¤C(¹ã†Kq#*÷ùvˆí0_¹yÈå΀á1Ìÿº-º:c)9qø¿nVÀÿ+0¾à¹ r†S¸ Q2³¸Í´þ¿hçV’öv.ÕT¾3² +@H<Æ4<Ž`ÏaŽ%0-e á–ÂÂó\^¿\ɧ°Òà‹X6 ÛèŒ-„=1Ôù Ÿ*‰Y ˜†e[cpÖÌJ=浓èLd¤nž‡Ä ºDØq&D¤'_ĹƒŸ† Äñ¸ad‰ŠÞà9â‰llÜ›Š$‚®8†Ö£ã«ÜáƒA8ÏL9Z¸ïÀÌ3¼Jjçò¹M‹gÜ Ù†#ÆÀ„ɵ|FúùZ&f?+$×ÔY(-!S¹½Bää%pç|õL¥0W”˜Ë$p+1þ{KÈÇùi{æ$|ó…¹<)L1>|fD%&÷ÛÅØí0G„ÉG@^5»myCAØd laLj骉ÓÌýΘ‰@Á;°;ApY)5æ±cÊa×0‘†#¸yCDÊWöT LͯŽqo«&gU8q†qqbg!¼„%ì=Nš"mŒcöÖÂB2 ®´“ÃwëßÅÁÁð|Ý2ã`ÆÁÔ%=ãàMÃC;8–]&›˜òsAЋh…ƒM¸7,é”Â\N\$ÐE!™¡¦5–g‚ÿý!\ˆxvlÊv^f˜w8Ô‰qR$ËL<™¹5­%`À§ˆrf©¬BJQi“ÒgªWEÖÙ’å,ºœ]Dklo[\Ðgy«_ª$4 ÞSapÊ9S}¯'ËÂÂ:g&i«iŽA¡ !ÎðÁÏ$|{}ùŠlBdm”Ë„IŒCÊDD“xÖ­7Äìúù‰)T¨R·\i¤œ3ÌÖL©åê»d4$&ËTcRͶI´Pºg˜"Jeê¤W–d¶¾ñõ\eü@Ñ]À‹Êé•DÖ°rÑè¥*[-¦w˜¬ ÞÁ4•dˆ¤NãD¥Ü®\µ CQÉ/]É/]IãżtEuO…u¤[âå.×Qʦlìj˜lw¢t?“íBa åZ±YƒO$Äéb½‘­;^‹À †rœ÷(Ž Ê •ñ`é*T&Û +Tan.âÅì6Ì_̦֭z‰]&|Áx…™¬C"_d¤–È¢Lb©*3­Ï2“’Ìàqƒ](΀£  Ý’Ö õîÎTæò„¸œARáÐNÄDqFÝDårg3—'ÄåÌÙD‡8¹ VŽªÎ J6(ª4UóÅv³4eiš9›èÞÇÀ|p‹ú,œq¾Ê˜%PÖgøv8Qî] 5“Ç|‹RÛ´³kÈRQj1 T5óÂJÒq’(“¹NÜ` !gÂ…Oðž| ¬rˆð €Åù-&;wÄg:!CŸàK,3­‹åcnØz7é Ê7Ê mDé]b=«Ž#ÅA_×í¶b7j]Íó¢jË­Ú™ ÊÛGèÜ[´]Ð}].ý®jFµ$YS¶¾Zæõ±¨CT:È8'ÖÚÈ($—ã,9|òÂUް…«[3€¨ô!Ps9¾ÎX¸ªu½¨O"35«ø²•âq˜ÓSGc4S;ˆ9Y•r˜ZUŒ4 ¾:¼RÜ[½½™çÕ– û¦°>c|z˜cq áߎ÷¢Çn·ê+Ù´yVéŸ[5¶Áœ^…lo,Ž}Ôk¶ÏädÎ)Ì…1Ê‚[¼¾ó*8a¥‘jI <ê#"qhgyL·%¦_Ó¶MäÕEÓgÌ cc}1Í[Ó}o}§Z"z£œ9F–—ÇšXÈÅä0õ癌Ýü‰hYiñ±Ì–«àÁ"ö‡Š‹¹QnÙ?‰àF;’ 7rU9ŠƒÑáÖ¢óX62sêÑÄ^ ì¯'jã+kÕ|\ì}?H‘ˆ6 ѳ²6ŠÆcL5ÆÆ&3XBìôø¼Êø-T³G+ŒØ^'NMÂ8 WÕã•ß—@Üvdh©¯æÑDtAëf÷q-Yˆ\®ëïÉ7iâݤÁ6>CQæí… ç¨æb·Çׂ¦LB‡z;Ëiù¨Àò’¾|¾µ€Ä #döîi¯4{÷çx)Ñ,UlÄw÷W×ÄÎÊù¦"^ªæ›êz³’®ÎÆÜU'8×=4ÃâwöbÕ¼Œ™ŸY•±ó€bægV¶Ž¼ºìßS÷ï©Ö ×­QÁDt”3™ÊYª7·rü¡Ç¿ŠÌ("£X÷.¨é1埋ÉIõ²²Ö*ß‘ÖrøUyLœ‚¸§M݉ÇÒà&uS“\l<ʺë2vÍ Ý:ÂË ñ8Œ<2·½ˆü£•Æg"eé¢<åcr£®Q6:Ø5D;“– Ý{Låh&w`ù¼]2sK”ˆ07X…ØiÂÚ§#é9B”D„×e"*때*v冔[ÞÆ6 níÅ”ó,r>TI½“{‰„šeÐwb±ÅwÁ@Z{¢žš>'‹#ØIx|êp«•ibæõÔíªd8(÷iðb0±£ð1y$T±£5·V×—¹{HET½uuàþàg*8nrÀ±-BÜg`ü¹iTm !vÜ#Ÿº¹SwÎK8ÃWGfÚØ1³˜^ƬÂ篴أ©E –,D&SéžÒ¯‘ªI L!Þ‰ƒ~ žÍœ_UÞ\~Þm!ƒhñʵº7Ñ»`…2÷Í ™[^ ÔÁgGÕ\6Á‚KÂÏÔÔkðy òLXÌV©ó<óöWÕ7)ßåJx°þ°Øó—xN{Ó¬Á“žm®2Û\iè‚ÅßJÀxñ\Uuù@×+¯;^Ï-ÞmhË5ÜñÅ öäc-AÜÕÍÊ_§Õ—ò.Ü¢Õ×Ú5܉ÍV_™­¾lõÑVÖË£êòVUY;[}sš¥NîFëÔÞ¿›8®'NqÌûÛt+Ø oc¢ªoÓÍðaâ$ø Q®ez{ÑgÓ­7|Ê6±8ëls¶!éLn.…·Ì-Õûò±ìN¡Î®vNðµ€øX~0 ˆêíø.SMF™‘n†êž(ëgqŠ ³ÖµWTãç)ŸùßUþˆéKÆþÊgJò‹ŸY„šÌ)9¡âê" ŸÅoò¬V‘õ¢‹(Øc,yUŽh@¼ˆ‰@2–eU`Ü dSÀ4ÕŠaÂ.#º1õ¤"eA3õ7ð ¨LcÕ»%”½Ž{#N LVófÊ/;ç÷ˆ£§Ú5äÐèê)…ŒÆo¯M9™yç.3Á&&¥÷8E‘cÖÛ"ìI¤7ªVŒ ûúÒÎx2Æ­¡vûò\á‰[ðkøÔ¹"¼¿:ÔÔ99¶CÚÝ]ÎøÌýqa‚={ÇŸ³iŸ';Át‡Ý¿F±t¥Ûö2{²dö¶¼ªÍ7 LÅÃæÿAùÐ endstream endobj 3782 0 obj 4150 endobj 3785 0 obj << /Type /Page /Parent 2 0 R /Contents 3786 0 R /Resources 3788 0 R /Annots 3789 0 R /MediaBox [0 0 595 842] >> endobj 3788 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 3789 0 obj [ ] endobj 3786 0 obj << /Length 3787 0 R /Filter /FlateDecode >> stream xœí]Io#ǾóWô9Àpº–Þ#ÀŒ¤ àƒaä`äŒãFlDöÁ?Mu·4Cò{d¬~]E–[²J¬åí[½zÿ·Ïÿ,þýGñþîóÿŠ/ã÷»Ï›rÛTåðO±ûz÷õ/l».š¶*¾üºy.ž7›Çþ¿Ï›áŸï~èú³°Å÷ý¿¿?þ£ÿåOãíþà×Mcšþû_¾wé*_¿ï~ÿŸÍßÿRü¶›qZnÜÌ·ÿÿδe]Ö»mœXúy3Ó¼|ýñå·ÍûóVqµ±ÆÆ;_˜ÎÛâ÷m~/·7¦©}S^²Pc Wu]Ù/b»ìeݬôòf~|òÚìð¹ÐäãÎÃÅôû>1}8üÖ¶ô#ü+ãÂcàmúÐk«ª^nò—‡Ê€]iöm[ÛÆWeן/:W]¶кj¨½Î¾JšÒ.7ùËÎCeB÷þäs&Á;5γðÁO›÷ŸŒ7=(ëâéç~oÚ/ßžzTÅ»š±ýèOÅweiü_‹§_6ݶçºi‹±Œ”-1päŽ8¸ƒ~¦™¿7a6‹F*8›ƒ»¶wp¤‚#p6±àº—‘‡§ž¸§K_EC}™.ËÒšO—>vk]4”$ÐØGÈÃpãÓ3›Çç4fñIñ®1•ÜÄð™ÁÜ÷†9cÛ€šBï­* µ‰ŒÓŽO …@y+œï ÃîÍÂÙ΂ëPXÀÚÓ†5æ|¼ kŒSü¸ð¤ ga>ÅCë¹ÞÅŠE·e­'î:k=5zspŒ–Àº „v4£]-!×{ÀBEÀZ€¦x¼7%/Kï°Ða°p;˜cüÐõ1‡wpc¶‡5ÑXÙöwm=J„^zÅø”?A=û4mÁCͶGÔ¶Çú˜Ë¶GÒ¶GÕEcaT3vxDÑØCU¡BØ5a1‡#”xd´t¤Påã‘5§t†Dšjsä#G>dlkek#Èj­®é°/€5öÅt½~ì)áÙ°½ÁXc8ãq6ðƼþ.…Zç¬õ²Ö‹Cë­?6€g[ÿ¤aãOÙ^Q´W”h4۱ؕI¡n9ÛÙŽÈvÄš…ðÃVpQõÙŽHÕŽ¸Í–L4–Œ‹GF °ºW„HÝFsnµºp=e¬>œc&êÆõÍ%³ŽVÝX’~¤S!¬ØlÁ…Æ®mÁ>Æœpã[«o SG”˜['öƒ¢k“¸¡Tƒ1;GT;¢6>jÍBÄ-ÂV¦S2Ÿ‡Ä‚ÝÉô¯"êé©ÛÛÌ ·ˆï—11IÁ b…Ö‚ÖÃ|JœÇÁ½9BPººÑÓSýâÑh#5O+â¸óæ¢Æ5¬ŒÆŸÁÒ›±ÊmÐúÛ°FÑЛŽÜ¨S¨]Í™´2gÒ¾ãâɆÀ6uw±Ÿp'â&cņí¦HůðÞ˜»¹ÖÌýdxÒÛÊl4e 51ÇñžaNÔJ¢¢€LjÖï~~;Q!ÁèPâ~>)峟º£ª#omú`Û¸ Ž¼Úž³Çƒ?ÅHhàÈùEOµu¶5ßL2*´cÓìOwÆÀ°a1rxœ‰)ã–a= kü™4DÃ`€àrŸö¶$ˆ®p³!XO ª°dp€„°´¤ËËêRß¹=Í&¸âA.¦œk‘‡ 4ª¶Ûƒ® ¦‡äq“¼9‡D‚#øÓÜÏ nrkšºúv¶Àê€ÓÖ‚²dD…’Œ_M3³a¢ç2‘n±zÃØ`øh}Ch6; ½ñ^RÅ <±–14ï€3 c@ Šð®«÷D8&0½ç{9 Å bŒXÂ\¢Ä c®ŸHJÎL-xk«‹µùqŸý06°Âò »ý ¸ LÍØ>€ˆŠá4Œ„çÓ¹Ò1ŒZü;z) ´–ÓR‚m¡}kÓE‚¿ÖÙ=@Pu[ØÅÃw °…{ã`w-lõÞµR…Î ù ¼·ÅS;ÄÐéhyÍ$TË„ ãõ;Ï´Ç2°j°x ƒÖ—¯G”û0³’G,Á „×"pa˜÷®$}‘ìÁ’!·¦Û—lvß Èm„¥@aÍJ"r ‚„I0ÍpàN°çíl¯Ig6SUü*qÅÔ3œ²æeâƒv8,Æ Õ~ø \ka±õ‡­2¦F…¨*§º%ÕÑa{ÆQX`ºÈ`/×A.úlan4Šrãõ$–LÅ—p€¹]ÏìmuP¨ª +o™:e¢‚¹×Aõ^ÆT…e'!„›oØ«'n °&º»`œR]ÃÞ£#biÒ› Å™ÞÖ˜ˆÛ\¸Ó—°ŽV,/I:ðzï$X£~3Mœò–¸#쀰°µnhù9=º ÷d˜ò+U~V¿yuüqþÇ`è`Î` CôXc8ûÅ‚bz’a¸a ;èKdŒôV••v?ù,7¢Œ‡y3¨_œ%JÒE½[fŒÓ¼ÞÇ1Nƒ»'0µLÕV"VýîöÕi¥eσ;‡Q'Åݤ±FdÞ9‹…ÏæiªS¯Ãµê7§¯ŽkÓ´û’ô…]3=p0œ• Ûó‡yŽ·ûâ•B^»“r–BQH¡+ó>³|ºRùTk¿&~uò‰ $¦S)3 êU ÄHôœÑjw»¿:Î hLhí"Û‰k;(íÈøö7)X§šÑaWª×`Ü+ÆòóBÜsóÖ`Ø×pUQÓ2ÚË:÷9Ãy¡¦ºøtÌHø˜ª’½VïR~m|–f,'Ɉr®`­*7Zõ~ìYnÄ 7®,œ%ŠQM‰âËeäFHÞL™{á–%q“—‰º¦ëz—3jÛñ ¡,¾—àTåw•³n7i&éIæÜa“³•7)Q®ÌÇ̲&YÓÝf†³2§3œ‰f^–ðrׯ–s`+wqâ4U8 Ÿè#]µSxCh$Ž[?mµ…^ãJ Ã6Z=xUJèB¾ßúQh)á '3Þú“œßóÿ)óžw Ìfƒ>täaA¦ ëúÜCµ•=ÕT÷¬®«ÌC!ç¿›¶õ0žMh[½:nZÅ.`½±|Ãdëöu"ñBà'öV x6†ý´^Þ$ÞrßÌ=ö™¤¶:¿ @!YkÉ͆ٵŸJX,ÑÈš 2bqØOx;«ØýQ ¶Ôu¹ ä!¬0D„ò&4Æ4¼Û* •„m—ˆÝrÂÆ0òeš¶Atáãnv[Wƒûšé­ãNI¯c{û4ž´·°OE˜ü¾¨=¶Y3ýà€#3à–*GŽaðlð3£,4³ŽÞ¼‘-Kp»ŸûO;€°ÃÆ $üL¶Fä9ò³?iˆ’'Áp‡ÓÛ»ËáÞ”n;òì7À²÷Ž|¶;)˜‹ÇÍÿ²ùw endstream endobj 3787 0 obj 3340 endobj 3791 0 obj << /Type /XObject /Subtype /Image /Width 256 /Height 400 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 3792 0 R /Filter /FlateDecode >> stream xœí}”EÕo¼õ¼'Oó)êª D‚$BÂ?³È³$!Ád’ Y ”ÿ%J\áã‹+hÄ%HX£Æ³ûžñløŒnT4 'º¨` " zPðÈTÞ¯úöÔÔTU×ôLOO÷LßßéÓ§§»ªºªçW·oUݾ÷­oe0Ú^8™Áh#0ÿyF­ü?ɆOö±«¯¾úšk®ùÁ~ð¡}H^zï{ß‹&Ço/£%Ùþž÷¼çòË/¸õÖ[·nÝúÕ¯~õ+_ù õÉO~òŠ+®X¾|ù)§œbÍ{üô㎞rÔ±SŽÂ~Šq0ÇM‘=§VþoÃyç·\ÁUW]õÐCýë_ÿúõ¯ýÑ~T½´`Á™ ï‚w¿ûÝòR__ßã?þì³Ï¾ð ûÛßþð‡? /È«HÙÝÝm½;£ýf~ðƒ¼ãŽ;Àü/|á 8øüç?¿yóæ¡¡¡/}éK_þò—/»ì2ô3c׬®yçóáÏYsÓé×Ü4Ûš›Îkoš}ÅúÓ¿kái§Ÿ†×Ò7„ÿP~.P™ÚBþ£ÚøÀÔKçœsŽÌuÚi§-Y²D^ú¥ûï¿<ðÀo~óyo½3Î8#¡§Íp㳟ý,„¤™vþÞ{ï}饗ŠÅ¢vgž|òIdÙ»w/tƒ(Y4``xá…®Y³:Ô†žžžw½ë]ØC͸ôÒKI0µ\óÏ™ÉGO»é'6<èm|лåAO;¸ùþû¯±`þüS»f_;ÿ³šÌ;+jC’¯^½šÌóÏ?&£çâüYg%sAÿÇë€ÒoÙ²å%FFF(RBÿ·Þ‘(¾öµ¯A"á¿ÿÕóýýýô}æ3ŸQσ¥/¾øâSO=µ{÷n\á«f11}út(øß¯¿þúo}ë[¿ýíoÿñüîw¿ûÎw¾³nÝ:œÇU°ÝÌxÖܳ>tý‰ö¾lp¯‡ýŒ¼iÉ…ï*– K K–  ,[²xáâ…]§v!}­üŸjÃÛÞö6vôÓýèGÚùÈG.¾øbð¯0h5Ï=÷šŒ7Ò@æË\}ãÅ1oÞ<´ù¡öïß/¿ùÍoÎó±óÉ'Ÿl½;#9@Óù·oߎý¯~õ+yºØ’ãŸýô§?3—\r þèo|ãPWpòsŸûN" Þ ‡5‹Çs †{èJùË_À(¼G@-ìyä‘¿þõ¯P0põØcÕr͘>ý…®+oš\ü±WüÑAÅ{½÷¯ùÎóß¹tÉÒÛnÝôüÿ{~ÿþ_ô÷|á‚…óÏ›òI‚N á?F"oûÛñ¶BmÑ:èlØ‚ÿx[-\¸uþéOŠ3HóÖ·¾µ\Û30ØêcçÎÿ·Œ|åñ÷¾÷=¼0𡉣Úÿ@F\|øÃuñ·ªüÇ_¶ßyç’ÌxãÿóŸÿܵk×·¿ýmœÄÐ'¿ÿýïã:°5‹§Ÿ~:ô H{ÈU¼ýq<þ|0 ã_h¸:mÚ45ýqÇM›uÊIW}ñUŸøöË>uwã=ÿíÆ{¼åWM›{öÜu¿ýÍ£ýö±‹zß7wÎYsçÌEiÇÏ<~jíü?Ú0™&3øÃ>óÌ3‹-‚¶†1,d¨‹·!ô½Y>Àa™ ýÝáŸøÎÓƒ"<ñÄòøg?û®^wÝuH‰·•õM›øO? …˜Œqè¿øEœÿÔ§>Eç!ßÀÉ{î¹'ñ×ã Tã%–żî‰3ëׯ߳g†“‡‰@…ÀI\2eŠš~Ú±ÓÐ)ú·M¸î¿^6ð-o`§Ø–~ðÈËW_þ‹~ñè#î}`ï‡Bhò¤Éo<ì“kçÿ$:+‹Ú’&ƒN§]•¹ÞøÆ7Ê“7Þx£äüc=&!üe¤·Þ‘4 ŠÿµóCCC8)Ž—/_þì³ÏB»Æ1Æküã_xáè-èaY€¬{Ýë^Gÿ;J •e.]º”Nâ*z™ë裎žqÂôy+þ×Ekºð£þæ¼Ç?XvÍAï^óß§M;âÄ“OD÷A–Zù¸ ¯zÕ«þ]Á\@ï;<‹/¾øß+!s¡ 'N¤“èãx@h ×þýû±ê©§ ø¡¿S¤|ík_k½;£ý=ArãÜsÏóA Œ ÀɇC=ÔÌ‘~öܳ—,^²àü*Î_¸pQaQaÆÌô~iÿ_ñŠW¼ò•¯üŸ%`x½ý%źŸ<4|°Ìõš×¼åÕ׿þõ¨<HtLìqü†7¼A^EÊW¿úÕ =mFÖþ¿üå/[ð×ãçúõë!1¦€Î3tÉÊi0F˜¨ÓK¾éð@¹ª•ÿ‡Ù€š€óTmœ9s®¿þúsÎ9GžÁÕSN9)Õ\'œpÞYÖ2U ÍI'¤æe´7ð_c 1h½J—‡†ðz¨~~5 d»ÌVŸyæ™UsfÏž­ö/F{Üž9s¦ÐWl˜?>äaCnT+ÿ_Ï`´jå'ƒÑF`þ3òŒZùÿ:£P+ÿ‡6 mâ=ïÛc_ÿ7мþ†ãÁÁVÜXTÏó1gÿ¸Vþn徸¡8pÃ@q}i¿~@ô…Ê4Ø#™è ¥½v{œGÞ ¿LwzÞó¾!ûšåÿ&Ÿ®þ†ãþuýý×ö÷­íë_Ûcbïà†A5MÐMÖD$(§hì(gàÚ*{J/úTez>æãF×,ÿ}ñ.÷`éžö<÷âsÀ¾ýûÀ[0y`Ý€Øß ¨+Ž×àê5HŒ¢  á':ˆÈ¸~€:ÝðÈððöaïú‰Ä0‚Ãg£ž¼ç½¹¯•ÿ¤`Ó†cpdƒÀ±WI#‚ØÿATvÏÞ=ÏË‚¥Û†‰í«Öˆž‚RXZ€ øI/iP(–ä?J¯’ýûHþ‹’¡ÿo*Ò0E–гè'ø¿jå*Òµ´zò1[kå¿ÌHÈ ÎƒÃûØ÷Ò‹/À`¯øêmïˆw0Ì3Ñ $ÿ{VôàŒPWžyzhë²£³‚Ô»¢W¼D®zxNü‡ „¡ÕøoœÇípkqG_AB?ÑãˆÿZ=yãͺÕ,ÿ1À¼¡(g]Æï‡NÁ JƒÏ 36:çÁdšÒuIÉŸÑAÄDÐÎ1|” ²”zºÀØŽ1¼0æ¥N’‰ÿPoè-#›‘W¨^Ï=‡áƒúýNŒ—i ¬Ô“ùØz\³ü¯,DèöÐÿ_ô‡¢[…ƒmß^AT’í8Zb<Èóí£Þ’&ˆ®±ibâô~Îúdx ÿûãY¨IÈ‚®«k£òLéú"FêÄ)iP©?X>n‰ãšå?Íí—ö¶BcY)6ÓOy`žDï8ðÈHéy‹æáX¼&0p^)tž œÕþìè•¥ÙÑR^y 1A¤”©ý¤\j yÏ{Ǿþ+MàËÉüò¦­¬í›?Õa.&H¯\E+bPlo×öÉ¢ÄÁÚ>šÏ§ŒÚ%¹p`þ V*+Éoa[­ü'v©{âª0]¨ºç¾=]³ºpÜ=·}DÍëÞSH»Å F‚œ{÷¨øO]§uí»îÞ…:#üÂm¿w:ö8SXT=¢²„Ðí±¥Ýb£ áámï>ˆtÁO/ôÿc§¢7q¦Ìÿûö_D0:ƒ1t$™·Ê~¯x ¤Ýb£ p20Q¾7Ø“üï÷}Ahü/,+ÿgΘÿ²ä 1™à$‘ó^±øïOš:¸q°>þ¦8"^÷Üî†TiÒá5´¢ðõQ —ytxèÝ5× z®úÊgdP~ÿ7Åã¿çõ,ïÁ6ñ‰7 ô­í#V WغNBWÑÑ7m‚Þ…ŸÅEãîø)ËÄùy æy¾YZxç¡ÈNg ä!xE›û¯í^oe^Bï%½xCáªPð”úà@m…Vä«GæX?€:o†¬ Ä²ZùŒ–C\ùïSTÄÿÝ4ÝÜsˆ x)x¾unáùôëYÑãùƒìAÔÞ½ò§¥p¿sá*ȉ~*ø¿Iç?èG5'‘F/¢ÃÝ6J‡È.z¥¯G¡œI“ËvzM”\ò$ X'ìîÔ6j)-’ÿC›†ê×ÿ!Q7Ü€œ¤KÐXÀ !ð7 B‡GAÀUHr{~A^ùÓ„Ðÿ·£H·Ê©~`Ò5ÛPÅ~vŸÛ-U#tCõ ×¹¶ÊV­\æã-9¯µ‘ùßê€üÇ_Wÿ/A%ä¼sç‰Aq% K K à1-ø92líT8$3Ô ø/åÿµ:ÿW]¹ª{¶1FPø‰úHþ£LMª¨‰škÁ<1úÆÈbò¤àu¦Ü”ùßê€üëÖÿGwTüû(ªrp|ˆ0Š&å —ztèÚÏÐÂý1&ÈôÃÛ†é Jê–r;pÛ"ÿ•ŠÁB)1*ÕŽÔ¬‰ÌUXV ÕôÝzÓŠ'ÐáCó€‘UÄ”ÿþ{¾ DãMš“ÄO\ÅFUûé(Ä&ÙÛ»²ÌQ`Dþ£pT€†®`#ÝdVÓ˜5‘¹HÚ£¿„ñ_¦~Mýîi02 ’ÿuëÿ FK#¦üg0Z1õ£¥ÁòŸ‘gÄÔÿ1ê$š$Á˜4ê}£¥Ä8—†® Fˆ#ÿÁaéŠDdïðÔ‰"§dþ3Eý_3¶Ä+`l瘜BÇ0õÙ2D?Q~ÿºþ¾5}8©¥”Ó’Ò–²gyÍ:â$óŸ‘bêÿÅ E°ZÃTLwwå#çóœ7S Û3n_.o‰u^z;øÉ˜ÿŒäþ¿kvW°¢TÉy0B^.©f2e÷ÜnCÔc£õbœé]ÙKWEçbþ3CCæÑ­°ºl6sÄ$˲i%ÿ+,öý3ÌFsGÿ—Y@râvf3¦™P…þ3âë?lZÃHqä?4ðSdÇ(ÕWìë0›ñ 3!¯4þ¥ñ2›Ö0’Ûÿ0ò ^ÿeälÿÃÈ3Xþ3òŒ¸ú‡É’ ­sÕ\’!6@Î̺ÕTÛèfQŒ&#¦ü¸a€æ9=e:´TM<$£ï +Û£Ö6ºY£éˆ5ÿïOÝWœQŒ|<›af¤IŽá ¸±Ø¿V¬Ëw ýÝ1JßËÛ7!¤'s‹òŽäÂO°jõ*a§±¶¿gy ÄU¢®Y= ³´…àî´®§ö³œAJdÁ­j…y7uÄšÿŸÕ¥é<ª‘iØ#PiTa¤ð…Њ­ÿB Öê§» (-‹5¿pW‹B3iÉ %`³WÏs•CU®'dmmöKÒÑÖF­Â¼Š—:âèÿVþK#Ó°Ç3Œ‚Âø_öj²zî" M‰ºåÛù«l8C…«† :‹ZîH>ºfw!™µz²æŽrÈY–¬­Û~Ioce…©#ŽüU+0 {L£ 0þ›^H²8Âí¼jÄ“¼•E™üת'áæ?~jüwØ/imÔ*l½;£™ˆ9ÿOt,\z:ýÿ˜FAžjäà‡¸‘ywÍoUo ã¿Y=‰Pýç»þc·_*i8juGC¬ÿ¤˜ó?4à…|ÀU·ÿÓ(ÈSM†œü§)VárvE¯Z¾æ·Góðãà¿Y=f9ôö±ŽÍrÊŽý±l£Vaÿ¦Ž–°ÿ[‚)t.1 UÍòj#:Zbý·¸¡L¶“¿ý „ª!—éiׂ-aÿƒN ²AÁÞêä°ÉÀËݰQñ>)¢%ä?ƒ‘š¡ÿ7ÎFÈ ·³”({êZ}­H½ÂaÈlÅ44Aþ7ÖFȪ΂ªZìdá_«É* ¶"³Ó´þßX!kz‡³ ÕG_Õ*`¦±ÞH-V³R Œbª„cº„Œ4‹»hÈÖr6.©wtØJQåê$Æ54‘k-ÐjL)·²WDF‹`•$-ÿl#T‹³ ÍG³/ ‚”…¥©Ý:ˆ Œhª„NMÃg1¨§Ð+z1´—+'¬ÂæsÓîhÚJ™ ÄdG2šgxp²S)—Pm·}T¦´þßX¡šœivVû¢°4u[E4UB2RÔE3EŒ¿ "³Êk9a6Ÿ›vGÓVÊl :^7rIÚáÁI_L¯Å>ÊË’–ÿµªÉYƒÿjÂø_“uªëF1U"‹dG…ÁIò!¦ÕÍZNX…-ÏÍ3l*m¥Ì¢2xÔôšp{pª‰ÿaO2 hÂü#m„¢8 *A³Ã±ò?4MÖAªR±.V²ð1CŒÑŠÁtµ9¤œ° ›ÏÍmÍÒ@žÊÇU·'“ÿÑí£2eõÔ„ùŸÚ™é=ÃYzkÕÇÊÿ°4ÖI8¬Œ4S%iácš*Ñh‘Ž‘††*ÿ­å„6ÊxnU£­i ¤ 㞯zÑ‚»Ãƒ“Uþã/ˆb•)«§–°ÿi!4ÊT)ƒ&O´Êl§ ^ÿm,eª”A“'Z—ÿ-aÿÓBh”©RÖLžÜh]þ³ügäõÿÓZp¡igŒ—µcu6‰ÆÔ"úXiJЈ\è Ø„™Á²”L–!)ú’y¦¾\¡ü”L%i5––ò³¼šÏ¨ ùÿ©ÏÆg°AÓ˜”“ú²ÐÝ1*Å2)U ay¦¾\^Iá—cµ Òt™ÑHÈÿO}66HIKäèx³ÈuýªÃO‘är^h¢ïœ%›gêËE#UÏ Få>Ô~Áhu$äÿ§nÐŒ>*‘åkw”L†~B 96ÒÛÍ3õåBJ¼,‚ÇȰöþ4/} ¢VÑêÈ ý¸J“ÿØx²‘(xý—‘g°ý#Ï`ùÏÈ3òãÿ§uQ«uef­13X±\ùÿi]°S „ÐÆþ&o´/%;í”–?ò{+Ó黶쨵±ÿÍã™ÒÊ«ÓWmK3?Šg§@Ùw ÔÆþÑÁ(¥•ÿ§7ìÈý|ZÑ)Pûÿ¡¼Öè`”Rõá^]n§7ì¨ýœµ±ÿÍ㙲üòõÏõµÃé ;j?§@mìÿÇôxŒ”7I§õ|kÔJU_þ»ÞXï.ÁNZÑ)P횀&Ï”²S Ì"Ÿë¿Mæ?;Ê,òiÿÓdþ³S Ì"ŸòŸÁ ÄÔÿ1ž <çT~¥ÕX4ß#„XPüÿHÈw{jÄ‘ÿ‹ÉÉŠä^Í÷¤.nšopâ?{jÄÑÿår¤Dã lÒð¤:‹@ÝÈÌF³2b@í˜ú¿°zZ×/ýü4ÜÀ&@ôÝ}P‘ !¦•{jÄŸÿ§ezp) ›´<¡’è&¨3ö8o±²`@m†Ìÿ¸NÂÀ&u@äÅl{jÄòÿYÊ2K+ñ»q6©x’(,*ÈÕy­iì¨=Ëÿçì.²E‘ó„IØ4ß#W¤ãÖ²wèVFì¨-ýOcXÙ##!$´þÛÆŸâ2Ú Ùÿ0ÿ-¶ÿaäù´ÿg0,ÿyF>íÿ ËFžÁú?#Ï`ùÏÈ3Xÿgä,ÿyëÿŒ<ƒå?#Ï`ýŸ‘g°ügäñõÿy æ™>¼jA»W#ú +,_å÷’äG‚>c1öÔQ~;!çÔˆ/ÿ‹Š(AÿдËy5"?ÅM•:O˜0þ;ŸœHÄ,¿}ÀÔÂSÿ'ï Z8/¯äO¡ )4Pƒvi±±Ô«U=Ì4þã<þåÀ·[¥2¦E¹2ùo­ƒ»Ê3|™Á³$¬a¼Ì¢³†÷²—Ù¸jyÛÿX‘»9Ò¼‚×­`þçlÿcó?'`ùÏÈ3Xÿgä,ÿyëÿŒ<ƒå?#Ï`ýŸ‘g°ügä¬ÿ3ò –ÿŒ<ƒõFžÁòŸ‘g°þÏÈ3Xþ3òŒ˜ú¿ü°È+}KRwM¢˜\J?6Q§kÃÑåŽjjj;#"bÊÿòßó¿]r]VüØDä@•“Cd—;U4¡²ÀÔÚÕvˆ©ÿ[ù_Ÿ—Ié0¿:ª«ó¾²@µªSÎC;¥;¤„°Us¹› *¼±ˆÊ nTÍåŽl Ã§}Ôoº*¢;jm— ±d¯¬ Ú¥ySa¨ˆ)ÿ¥ÿrÇËü[ÃüêTø±1|øXï+ù/+ ¡9Õ±ò¿\mgTgA ÍÁ‘Rgͧö]¿éªHuΣ=(3»µ&(3Â?™S4\ÿ¯ÛËú·ZýêhÐ|øXï+ù¯ù¦ð §"VþË\î&X …ðßô©¢ùu1]9øoÉnsmÄp áúÝ^n*Tú¿:&¢Ü×:XÐê2Qòúñß:Üp70Pëå¿Öö:ø¯×„áDÃõÿº½ÜÈd¿:e?66&a÷µò_sªSÖÇ|78þ»(Y§>YˆéSHS`®ŠÌ¶[õ³'²þã@ó?õy¹QÅZ˜_²× åÂî6Y¤:Õñ|§= ¶9:å¿»²2ªËYˆéSHókäpUdm»–ݬ Ý`ûŸ¦çí3^ÿm˜ÿÛÿ4 Ìÿ ‚å?#Ïh†þß!Æn´F†Ñ_sLwÄÜàŠÞ‰¶ `4ì´Å: »4éˆI´,+Ë5•C•‰ÓFBh‚ü‹þ¥?˜0¬f¾Ÿÿ4Ei æ ;‚U¶Š›†_¢©x¯4ùYG9Z´2FF´þ/ S>b–£…¸2§ø¢¯f–Cÿ7UE± ÔEp\’@¨äZËÁž‡Ï ’–ÿ’0V³3Ä•\â ³ÍÈ65ò…Lž¡ú´p‡ŽK¢!³»hΟ^^µ–ƒç`.g0RGÒú¿›ÿªQ5ÄÃ^È¥ [5(XÝü' —Qk-uÑ(ÙAÒòߌ‹d]–uðß+Lþ«Ê†,¦þãùQoPZ­åà93ÿ3ˆ&ÌÿS,:ÖÌ2%ÿÃB\9ì… ë2ÏL+™nGÅrIæ*uaN02\G9ZgdM˜ÿ¡q.ÔÂ<Ì,',Ä•#*VdL7kP0hc£/ U í’§ÏR¤ªSS9¨<[#gíjÿeà 2ðÊofѮ뿤¢§]‹x h†ÜŒŒ€íyF»Ê# š ÿcÌKÃÏtm`,F8bXª.KÕaäù®ƒ3>øoúç‰è½G .·?xÈo?{àuÍy rèCu4–>NÎI–Ū¹ð‡RTµ>Ž»é‚< É{…Å;ÓZW®žQj]…C˜Ê[àÖÔåE Ï©‘7ìÏr7_oKÉQ@Šh¸þoúç‰î½§>·?ô½<ÈL'U xÚŠj9ò+`TÉ\Å*¹È}DXÀ2ó.”Þý(¬ü·d©l„Y¯ÿå­Å?5ËòO…=R3¯ûÏ m~H[RDÃõÓ?ODï=u»ýè<ÍâÁZ™)Ë1ùV¬•ÿÖ€eþ;Eÿ-õQZ'ÏÕÁyë°*ì¦f^ëŸUµùamI ×ÿMÿ<½÷ÔíöG>É@ѵi&aüw«¾ô!è´¨LaúOEzç£PŸžæ)HÍ¢µ®\½(úíŽ*ô‘y­VÕæëmÉ€þ“ÄüæŸ'¢÷žºÝþà< ²ÌaÅÝsðßUô­ƒ>9þUëcÞEK_õQ ™?[A0-‹Ùº° x6þ[oöO…=Rkß1ÿ¬ªÍ׊ÍÂø—íÂPë¤_OFA‹6Ÿ×ÃÀü¯ -Ú|¶ÿ ó¿&´hóYþ3òŒVÔÿÛF2G­X‡ÆÒ"#˜QrUMCëV4{!­ÊØÒ±Ý,,ÞYM¹h)œ†Ãr^«wEo½Y†4-*ÿk²–iuþ »‚’óö`µZóÝ%ƒ]b¦´ ¬…䇋Šêœ’–Ýï¬Ö\|ŠîNËÄrF×n ’ÓÿMóÕx¦­>£;FñXdÌÍ>DÆŒ@F]³º ¬Ô?×ZŽWr<i£ÍÛ›V+š¡K˜)-zÊuŸî¹Ý4§g-Ðjkd5( 3û‘0#” {$k“õ’ýëù«fTyð¼•ÎÛqYˆÉft3k¼³úr™Í‘a!Ž„äØò‘š€®!%†g؇ТçsŒþ2œ“Ï¥VþñKòM[uõ«펦)‘i!Cf(0ÐÂÍ`t[#›AQ˜Ù’i‘ûTžÈGÖd³dŠ0‚\ôèÐ^TžºµY$“'ÑÍÌ3uç"¨¡ÙdWmš§ú„ô·y€ IĹ4û$ƒ Å_Ú£ ‚çìCòßZŽcEå¿nµ¢º¦D¦… ˜†×\¸t˜ÁèkÍáS7ÿ­öHj³dÜšŒ¨ È…¾€MüMË tR2YÂŒn&ÏÔ—‹ ”i×Ú!D%YM¸ 3Š„ä¿ÛÇó¹Aïnͬ±Â>Ä $ ð`)ˆžg¬çšå„‘Á´ZÑïèé¦DæÊà$‘å¶Yª‰ÿaÿx ؘ ƒ£ÉfÉ8ƒ ¢ƒÆxÂRÿA–Àšw›°æÕ"fjÑÍä™úry%%AŽeÔ&8‚¬5 éÿn#"v9uÉÄ´uA2Á«Ž€`ºÚRNí¨$UdzÓjE»£iJ¤[Èø_”Pù¸ê¶Y2ùfPd½‘|Ũó*ª5šz¯°&›%#%½4Ñ/P ñÅðª28šªÉh)º™%ÞY]¹hD ê9Á¨Ü‡Ú/Eró?# uGqÁð䥈iëB£E:¦ð‘^%ÿ­åx^ ÃÅLZ%Í4«íŽf4 7’o  )½›%«ü3(Òn¤¶…ƹ4¨ÿµWªµÉfÉž?úY=ÃøÍS˜lF73ÏÔ— )ñ²iïOóÒd‚Z½D‘Êü¿çZôôzoݨršƒLM«4fÁ–ç¯VS™ÿ'É)Ž:„ô;x!†=Ú½¢ÿ˜w·ÖÐ4XÊ2ZTþ×3ó\o+>´9«õÁ4¿‰b_dõ‡SÕø'ÈÕÌ’iu–_IXm™Ô4V¡ªfEæcÉ8² ÿ›Žqë—/V°M)# bÊÿþuýô±•çîÔЪåÓçZ“Ž˜D!Ô™ÿŒ"Žþoýš½ ¸±HÇ2>»élR?EÊý§ ɤA!nþÓ7†¨’ø‚XIP5|˜¨ÀFáAçµ€Jfs¬ÞŠ‚b+GÞ\@Èïߥè@­ôOõÍBù?Î ¿e!Œál”èYÞ#Røl×~ªü'8øûª!àÕOΫ†Sýiw´ò_óV¤VO+'ðü惎çƒp BFÜõ~´xò!%Ä‘ÿ¿¢ÿàÏ ¯•M€øoy¿w.aÎk?Khÿ«†SK¼U¤±Ù7ÿµrLþ£¥(ÇAixœ’"bÎÿ‹ Ñ%ÿ+ü Ž “þ£9Û‘$'oœÚOµüšôò1K·Ö\î¸Ã‡9øoiŽá­È¬ž,ÇÔè@Ü·#è€Ú ‚ÑLÄœÿ= Ášÿ <Í®ìÅO1ô¦g8ÛÁOÒ_¯ý”Pç?éŒ{üKolÚø·jø0ÿÍæX½iÕSË)Kn‚hìLÇh ©€íjϬ¶xý·V0ÿÛ lÿS+˜ÿí–ÿŒ<#¦þ1¬U É̪*#>âÈÿèa­Z‹Tõc´&âèÿް¦…M?ÒÌ!¥1p¢D³Z iÑ»¬¹Â„™Õ( 1 b´ âÈGXͤG]3‹\”2Ü', X˜¥ÐD5:XHl/k˜0k5ÌàbÚ2£mGÿwð_·ð±Ø8ŒpB£€…X ©yݱ½Ì0f5ÌàbšQ£mGþW k¥˜ô˜ £V#œªQÀ´bå9mµ×ÛKã¿ÃȽ(ÌhIJÿk¥™ô˜\²áTf)TÉÛKã¿ÃˆùŸÄœÿ k¥™ôX ÃL#œªQÀÂ,…´ù%Gl/3L^˜-ó?ÈŽýOkÍ‘2ÚÙYÿeþ3šìØÿ0ÿÍGvä?ƒÑ|¤îÿ‡Xø3RAêþ˜ÿŒÑpÿ?žáñÆz¦gyM<’í(ŠŠrò—‚åxëÙÜø01Ñpÿ?æßæ™à[uÏçö¶aâ¿XüšX^ü¢¯é½’{(»#îÿÇôøá>ø‰2ŒÈüÒ w"³á †—€ÿŸøüG²IŽ¡J_ØmŒxh¸ÿŸšõŸEÿ©tªƒ8/–hV= F|$áÿÇôxcž¡ñ/}´Bü§cÕø'GwŒÊÑ®fÕÃ`ÄGvì¬ú•á—Áh²¼þ;uÊTõŒD‘û ô‰n15 ‰,Ë#iÄÔÿÇvŽAEK·‹†°Kµš=Ƈˆqqµe04Ä”ÿžs¬—êã?/3…˜ú¿Ê‡çœŠKÕü™v>š±2ºÝm1Ñ@ùïðœ#/Uõ dÚù˜ÆBž¿Ž«Ù †FéÿZp^ÍsŽê)ÂíÈ´ó1%<¿³Än:ƒ‘”ü×½=¨z¾Ó/içcå?ÇLa4 éÿaü¯êÈ´ó1…p@> Œ˜h²ü¯êȳÙùhÆBÂî”çäÿèöÑÌÚÿ0‰âüçõ_F>Aò?ƒö? F€A(Æ¿ë˜ÿŒbÂÁºfuá-Àfö ƒÁ`0 ƒÁ`0 ÿÏýÿ endstream endobj 3792 0 obj 14559 endobj 3793 0 obj [187 /XYZ 38.2500000 626.750000 0] endobj 3794 0 obj [187 /XYZ 31.5000000 577.250000 0] endobj 3795 0 obj [187 /XYZ 32.2500000 236.750000 0] endobj 3796 0 obj [187 /XYZ 31.5000000 488 0] endobj 3797 0 obj [187 /XYZ 38.2500000 81.5000000 0] endobj 3798 0 obj [187 /XYZ 31.5000000 237.500000 0] endobj 3799 0 obj [187 /XYZ 38.2500000 140.750000 0] endobj 3800 0 obj [187 /XYZ 38.2500000 626.750000 0] endobj 3801 0 obj [187 /XYZ 38.2500000 140.750000 0] endobj 3802 0 obj [187 /XYZ 31.5000000 488 0] endobj 3803 0 obj [187 /XYZ 38.2500000 81.5000000 0] endobj 3804 0 obj [187 /XYZ 32.2500000 575.750000 0] endobj 3805 0 obj << /Type /Annot /Subtype /Link /Rect [60 452 91.5000000 458.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_introduction >> endobj 3806 0 obj << /Type /Annot /Subtype /Link /Rect [87 445.250000 144 452 ] /Border [0 0 0] /Dest /#97#a2#b1a#8e#a6#3e#85#83#e3#fe#0c#c6#8cN#60#f0cv#aa >> endobj 3807 0 obj << /Type /Annot /Subtype /Link /Rect [87 437.750000 172.500000 444.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_commandline >> endobj 3808 0 obj << /Type /Annot /Subtype /Link /Rect [60 431 141.750000 437.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_differences_java >> endobj 3809 0 obj << /Type /Annot /Subtype /Link /Rect [60 423.500000 94.5000000 430.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_void_pointers >> endobj 3810 0 obj << /Type /Annot /Subtype /Link /Rect [60 416.750000 86.2500000 423.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays >> endobj 3811 0 obj << /Type /Annot /Subtype /Link /Rect [87 409.250000 156.750000 416 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_swig_library >> endobj 3812 0 obj << /Type /Annot /Subtype /Link /Rect [87 402.500000 238.500000 409.250000 ] /Border [0 0 0] /Dest /jlP#7c#e2#f7#3b#c7#9c#8e#92#b5#d7#ab#7f#d6#bfJ#b2#2f >> endobj 3813 0 obj << /Type /Annot /Subtype /Link /Rect [87 395 166.500000 401.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_pinning >> endobj 3814 0 obj << /Type /Annot /Subtype /Link /Rect [60 388.250000 98.2500000 395 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 3815 0 obj << /Type /Annot /Subtype /Link /Rect [87 380.750000 208.500000 387.500000 ] /Border [0 0 0] /Dest /#b8#10#d9#16#cetK#a9#2d#da#88#8d#06#94#15#e7#7e#40#02x >> endobj 3816 0 obj << /Type /Annot /Subtype /Link /Rect [87 374 195 380.750000 ] /Border [0 0 0] /Dest /#189#8c#efS#2f#bef#93#d7#7b#1b#ea#d8#a6#13#9a#bb#ee#a2 >> endobj 3817 0 obj << /Type /Annot /Subtype /Link /Rect [87 366.500000 227.250000 373.250000 ] /Border [0 0 0] /Dest /Y5n#905#caw#b0#e3#91#3b#cc#21#abU#87#ca#fa#0a#a5 >> endobj 3818 0 obj << /Type /Annot /Subtype /Link /Rect [87 359.750000 198 366.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_custom_application_exception >> endobj 3819 0 obj << /Type /Annot /Subtype /Link /Rect [60 352.250000 93 359 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors >> endobj 3820 0 obj << /Type /Annot /Subtype /Link /Rect [87 345.500000 135 352.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_example >> endobj 3821 0 obj << /Type /Annot /Subtype /Link /Rect [87 338 153 344.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_implementation >> endobj 3822 0 obj << /Type /Annot /Subtype /Link /Rect [87 331.250000 129.750000 338 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_director_caveats >> endobj 3823 0 obj << /Type /Annot /Subtype /Link /Rect [60 323.750000 104.250000 330.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_multiple_modules >> endobj 3824 0 obj << /Type /Annot /Subtype /Link /Rect [60 317 120.750000 323.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_typemap_examples >> endobj 3825 0 obj << /Type /Annot /Subtype /Link /Rect [87 309.500000 272.250000 316.250000 ] /Border [0 0 0] /Dest /#f9fqFI#11J#0a#ac#06#1f#ad#aa#20#2c#ef#93#96#fe#02 >> endobj 3826 0 obj << /Type /Annot /Subtype /Link /Rect [87 302.750000 240 309.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_memory_management_objects >> endobj 3827 0 obj << /Type /Annot /Subtype /Link /Rect [87 295.250000 263.250000 302 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 3828 0 obj << /Type /Annot /Subtype /Link /Rect [87 288.500000 244.500000 295.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_properties >> endobj 3829 0 obj << /Type /Annot /Subtype /Link /Rect [87 281 297.750000 287.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_pre_post_directors >> endobj 3830 0 obj << /Type /Annot /Subtype /Link /Rect [87 274.250000 195.750000 281 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_partial_classes >> endobj 3831 0 obj << /Type /Annot /Subtype /Link /Rect [87 266.750000 197.250000 273.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_sealed_proxy_class >> endobj 3832 0 obj << /Type /Annot /Subtype /Link /Rect [87 260 215.250000 266.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_extending_proxy_class >> endobj 3833 0 obj << /Type /Annot /Subtype /Link /Rect [87 252.500000 156 259.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_enum_underlying_type >> endobj 3834 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 188.750000 533.250000 203 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://msdn.microsoft.com/en-us/ie/aa290048\(v=vs.94\)) >> >> endobj 3835 0 obj << /Type /Annot /Subtype /Link /Rect [383.250000 188.750000 398.250000 195.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.mono-project.com/Main_Page/) >> >> endobj 3836 0 obj << /Type /Annot /Subtype /Link /Rect [254.250000 155 354.750000 161.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://msdn.microsoft.com) >> >> endobj 3837 0 obj << /Type /Annot /Subtype /Link /Rect [240 148.250000 311.250000 155 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.mono-project.com/docs/advanced/pinvoke/) >> >> endobj 3790 0 obj << /Type /Page /Parent 2 0 R /Contents 3838 0 R /Resources 3840 0 R /Annots 3841 0 R /MediaBox [0 0 595 842] >> endobj 3840 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R >> /XObject << /Im3791 3791 0 R >> >> endobj 3841 0 obj [ 3805 0 R 3806 0 R 3807 0 R 3808 0 R 3809 0 R 3810 0 R 3811 0 R 3812 0 R 3813 0 R 3814 0 R 3815 0 R 3816 0 R 3817 0 R 3818 0 R 3819 0 R 3820 0 R 3821 0 R 3822 0 R 3823 0 R 3824 0 R 3825 0 R 3826 0 R 3827 0 R 3828 0 R 3829 0 R 3830 0 R 3831 0 R 3832 0 R 3833 0 R 3834 0 R 3835 0 R 3836 0 R 3837 0 R ] endobj 3838 0 obj << /Length 3839 0 R /Filter /FlateDecode >> stream xœí=IÏ#¹uwý Œ¦¸WA€éþºƒä 1øä´ã N:>äï§²’*>=²$}rÃÓ­ZHùöõçúõ?Îÿõ÷óÏŸýŸówû÷ç_OÍŨfúßyøóÓúo/ößgÓªó÷÷ÓóÓ·Ó·þ¿?NÓ ¿~þ×þ_ÿwæçéÿÿ—ó¿ý{ñOö¡á÷“a¦ÿû¯ãßaý¿šùïáúï§?þáü·aD7]Ìö÷O¬eʘaW¦þqrŸÉÆ?ÿþ·ÓÏÓäÍ"´`Jž™ý:ÉÏÿûŸ§?÷¸á›K«íÿÀ#'o‡Éýä¬=Gfî$cFKÓÜò‰†Ó´¢;3Þõ§¬ƒyÆ?4£³ƒwL–|\9õ¦0¡YrðþEÖ鯴ü÷-0Õq¦*ÍžUñ™åa3÷ß\u«™ä*2ó·œ1°Ë\è2_Óe~–ç6ß„EÃæÊ¦‘ýáæÞ„ž²‡•p춯Y¶ÛícÍ´4u^/Tõ<ô×G93Õ‰bgæ}Og¦:y^/T>Ò™•À³0ÜÇuÓ'ëþ¼:·ÈÇ8,€v}›xž=5÷«îÁ•U¤–­'¶ýXš‰wÒþêolÎ o½\éqìŸä8ÒðßïïçŸÿù]˜ŽÏoÿ†*—}hw)TùôÛéç¯ý6uçßþÜË>Ó„ã_¿½Ÿ¸>ÿÔ‹EéýíOçhööçßþÒÓç‹Ò\Më³w~î4f¼£.\O·–wÀÑàw ¾ÓAïˆOÓ;òb¦[Ë ØxG_[½3ÝaìÒ£„Ù¬à+¸ŸÇ;æ"ºÆ[5¸6x4ÁÁyÀ;͗鎾´Óæ;œCßÃtþÚØô=_~ëá÷6Ðë:=ÙŒ §wÛ1DçÎpõiÓbZ÷Í«ààé¨äE ³=xûiýGkÃZ£oýsˆ o኉‹à-Û@œßiÇ;⢤nÍÎÏh½%‰_Àï‚1à’$øÎ 4öû½£ LÌŸü8ObÕðîo‹ -)ñéàĖδ;¾8\ <x¤ðêo(<™ðwñ\Rƒ€?ðQtž>'˜,<IœÓç™…LãïÙYt|hN ²%0TÎ_™)!|nC6‚gÁPšÀ kûQž‡ÀßCBp”Æ nUûtÌÁ+6æÛ ‘J¼o1)NP €ïÐòŒpXfYFâbŸv ¼) ·Ÿã%öä…¨szh‰Áªñ”AmûÄl?ŒZ*‰@­á×v8rKma¤Éà|>Ø¢6!S$û$؇‘öS¼„È‚øt”‚º_ŽKˆ½L£Ð‘ªqÜç°~@;[’—èÎc&°ý!óCY3à¼å³ Û„‘ !ac¬ÙôÖÐ]„}iÇ–bü.,FÃX‡1š$JªA0ðODhÆ !ŒW3rTbEÓС»T˜:HþH€&F°Gr }bìâ#l¼AN,ÈH»€‘Â_AÂ1hƒŸ3f»1j©A¯š|Ø`0f®ý–DZf–õà½G#*üí¸UÚ&,]Z°¦1øø1` ‹¹  ÿž]ÝR z˜ˆÁʆ,®bYs]«o9^qâM;† ¹ûdPÚ*E81‹ &FpÃÇ´äì9)ûM|zYKd8| |ÃûÒŒ¯þx×o5õáÍqdø©I¬˜¤"*k¬=s%él¤èFø!ºÂ‰žþ®GîØÐz~ßéÀw¦ƒa&à—|š‡ÉKö¸ðxgØÐ>Öõ£1¢¢’ÐcLç-/”Bˆðg'l ÷l•ªe©O ‰±h"4gÌÉÁÖ<Œë#Ú{Ý`ѶNb˜8Æ‹HÏ+%(‹šl¥çA(–´ñ‰ ›ŒPðÚH}Ÿ´ªú±‘©L² Nm´Ç¹äg dà ©¼;_Á;t‡ƒwìAÆîðüyšOÐKåbïðÎtÇ¢SAñCKæËuáѨ¥4 ”- ³&¢˜~f¨±¤‰—‚!Œ¥ðÇøäøþ² G%ý›] Ñ•€¸²Ì5Ììæî0Ïc0σe·Âü81Ï]r]ƘØÍv?>?VÆb¥ø"Ì< ‰­RàÞñh˜ÈT~H-ÿ¨éŠ2–Z¡`%Ék³§0RzN’i nÂ*‰ÐŽ—‘Å_¡; Þ …?ȆMéù–qNfSISpè!)h ½Ãmaî·ãLuu<(P€¤:C‚¹b\Rø<Ú’™û¦ó9PFb$"â.<*Ø$wYÖÍ+žŠB {P+Í#Þ@ЃßçW¸%„9PVIc˜Áz €i‰É—–öj88f…³.ñ¾¡' z,Äý¶;ã«?/ÏÜãyæo”/CܳkŽVÃF˜šøWŸpÞ±æKkRIHŒ˜ìêZ–¬–ÍMQ… ¥r3 “ˆÓ; z¥0ÞNš;ãÁ/­¡½°åQ~© …˜‰yµÆ•®³BdŒ3KË*„J'Öë{\¼¶—Lu¿2Õ¸ìØÕs”Mþ{ÉáÑ`ƒ=ëà;0,sðì£ÁX ®Ã|^`¸„ñÆ@Ì<¤8ÃÉ*]·ç¡úgÈíÇ]Ïv7¬uÍ\L·µBÀwX¦ ÎÂŽi7DsáØ:;®Õ!áÒÝÚ±W­<ò=&±.°·°/ÐÄ<¬pqaÍXâ|¡Gír†{Jè³ðtÇæV²b(Í~Ÿ÷Ñ6gÓ ƦÖBŸu7·³W¾Ÿt{a¬ãmËæ§Ìz÷kš£ÞþæÃkgÿmÌÁúwü•°³[é4Êö;¾Ÿ~?}úÃfOX°'lijýbW;f¡ö«è¶Ä)/PQ,á±ÀD›WÉ*›)ƒ`³˜ÈÆÂ&ÓíúÂÐÎ# ÛLN(îpÄ—Lr TÓU54Õp 2ì•ïýKÐù)Ñm†q?¹…½ùAÓ  ¦_ò3<%·ÃÈí4¿¯Û™T‚p¦ô⪽j'°©Kãwš€ÑÂv´½ •ãË^E „´á³Æ¯ê,¤p¶¹à@~C‡‰¼ P ,ǵIÍ ;ƾ‡(¨a- ×Û;Û÷^Rhc‡}•®æÑÃctÅHáû+]ž²tà ã~2®˜&FWtçOÓ_ èŠ^É<ŒÜNs(]1sÍ%¸] ÌÒ0¨µ2¦1=ŠÔm ­$ŽêuBZÖwE Ûͱ/Ó:ŠÖªõ…¿z¯tÍV?èXL?è„/»÷Wý`xʬGq¿š­~Ðv1ý §vÞý•@?è¯Ù•ÚQ¶ßq°~ÐÍUjÀH-’`K.¦š *†Øý5AË`«:ê{ûhü$­vxÕã±[±ëÌ,€ñõ…›Ékº ¹b¬‰+ƸGJ†+>¹Ÿ2ëQì/;‡#W¬i#äŠ5ÆŸ£¿â“«áš[y»"WËG’+Æf ÞÜ7/Ðõj5GÃø‘1¢¦®Ãµz‘{ƒ1í cÖnG Þnƒw1Älpl´Áy =eqÆ ã~z©.BÄR]„ð7Õ§Äœê² #·ÓŠSR|\œ‚Ó*+Y˜ž´§Ì~’ ç„Á×v“å%´Kh…\¨0¡e|Ê¢¼Ú$´¸i’ b -BùöþáJ@Ԝв #·ÓJ42’°¿LF}âfº™uJ„ž³p [_¸Y-ëW¶UËŒŽ©eƯ!"F3š§– O™õ(î—Ú¨eÂȈZ&Œ_ e¸â«eÃ5·R¹RË–9UËÚaç´Y%0W«å¹—*·G”ŠÖñðF¬/ÜŽfÝ6°Zt±ÀjX&DVO™õ(î×6°Zt±ÀjÑ–. ¬®¹•®«—9ŽD3Ù˜˜cájp¶ƒÙžÄy;ŠÊÆÅbpiÖöÊ’yAß’Å‚¾e`C‘, úŸšdÄy÷Ó ú–,ô-™o®ø2äô”Ü#·Ó)CʹiÌöPjaOêݲ–äs„õD Ý…’%M[i Òf­URc‰Í`w6TP4ÆÕƒÑ{`…Q⺗#öàUpïF‘•‰ú&øF«±UgÔ䃇Gô8%î5´W ñØÃûI+ãW%á¥HKZŠ0u`|ÊJb“:à¦Y$K·§W‰DÌ©Ë0r;Í¡‰pñå÷+‘P•]ø8l¿DG®ýr¡˜«Ÿ;ü)-1L´…føCa"(9‚fØh3ê`JëÃï©¯ð˜¥sv×¹IøÕáà;˜új9•$®É×qÒCÁ¡öŠŒáäUÞ«¼Ô©b©2põH¦vŒOÙ…©Mj‡›fá½*–Ú!¥ï¸®¼W.ÌVmR;–iå½jÎx=J(§ ©qú£Ô1zøL‡Z4àx_œ-d¨¥!X_((dôyh{·ùÜyÀ\«%Ç-² ŒûSUh‰)ñÀ+ÀtmCqMÐ4 «Ùkðð÷ý¤§rq>B_•PŒ—O#M,ŸF?ŸFš0Ÿf|ÊJ f“Oã¦Y$˧é·ÝŸF‡ù4ÓSr;ŒÜNs¨„b®gn`ÊOÖ’jËÁGZÇeš¹–·KÍÅÔ‚Æ„ÛᥧýR†™ûˆLíÜ…‚R†1ê½Dó<œ‡kêÂf±©yyÅ1 X1‰½ð<$`ÿ[Äz?©8¦]eÿmç±ÿ®‰±ÿŽû|yŒêñ¸÷ð”eïnû³í<öß¶1ößšÖ„ì|Jn‡‘ÛieÿÝœ5I†ó0î§—“¬šXN²jüxÚáŠ/9NOÉí0r;Í‘’£b.'Ì`>bΗ]3b`Â,-„Ïù–¨’œRTä 鹡¬(˜<#„9%WÊUÌe©‰N®/”r;é¡ü½æ²Ý¤¡ð¥‰íÚU½|ÅÛ B•Sðǧ,‹pøŸ^ ¾â±|ÅýÈáJÀBøœ‚¿ #·ÓÊBÄõn“/òb!…XÈ~’+–î“› I®ôQ$'ÖÆh#ïêvðé±T,vÄWùƒôê1(«Ç ‚°6%Ãz ãS–þËM=7ÍÂd¬ƒ’~Þp%àr®Ç° #·ÓÊÔÜõ2£€FÕǘ¥^¬äŽY œ—87Œé6—•(1Û¨7JÚ¨lBÐz"Ô*¯‰W»ŠûƒCS¢Äî‚cPõܬkcPv•›i¯§Ò±>œ*R:ìÃ9>e¹•ÞôátÓ,ÜLÇúp*ít Wn¦ç>œË0r;Í¡Ü̸‚(BÄ ÃˆÆ /B~pxp3‰äxã=Jü€}°Ç8³ ’2s MÉÖöVz¹Š,Mˆ,íy(iA–©S„söÿÛüÓŽ.;Þ±û©/Ö˜ˆ?±w:èKÁc£M§Ãä%°ZL§c.]ë¯ú³µt„ó í tÇñªÈÏà¾Ák¿4±¶f mx€è§-1®ÛëþZ{žŒ0JѸ¤1a5´ÑrÇgña¢òî¹0ÆvT9 0º ;ÁŒ† 3@t“8>—Ö¢sR\KP¦’üÆ&- 'qvwKI•Gè ”A’ê† æñ_ïfSÚ¨ÔŒ=Ñ Ç î1M¦7 –iS÷1 ™Hë‘„ ÁÀ-ÆT|¤•ì¦YD02¦«­ØQ“ 2<6|Í–ã½ Ä#ùi¥œ$þwZ«Rx-” ˆ¡Ø ¼jR{$ªY,Á'T‰‡…û¯qà-oC2‹¦Ú0ø˜Ú–È£R!Ømp ‚…€£`aì(1BØn§= ®ê{׺Ï0— É%sB`øÃÔ%Æ›» r5Óp«ûŸ@)O¦†9Lös&”Ï.É»¿Á1Æp—Q~+¡`2d3j¤ÂƒŽ/LË”iìÇ¥Ó$ÔÑXÖ‹‹Š@ä¶U«,_É_`¬ðhqÀÔEnc£Vúâ“2pX7º4¿…ñ)Â4þØ{‘ÍxÓh#çWƒ±s‹7Ð>c|%wmK¦p@>­r\¸+&…ý‘£ ’@a˜GáÀXš‡é\c5a–ƒï0h4>"ãî¥=gE›÷PŒ;~áçtîç!Ç;ƒ1t3 ‡©+˜Œ¬Œ‚à´†4Lá*Ú’YàÏÀ覴A¡µòeª6XFàbqÔ6Âg@´ù¿ˆ öœj`•"cP¹T@ˆ©™†¡éµº…eÐg nÌ©éó²;ãìÎ «/B«MXZ2JÐ8§=–bÊQõgn|ÛƦfÐî7\áZó¨-LJ“i‡-w`î©nK˸+å*<8ÃdW¿'!`öºR"GÂ2D+$╯CˆœàCÎn5[_(™m â­f>ä`ôOÐ ‘0×Ã:«M5>Ît‘`<'4.f8"aæˆIN%å…Ñv‰ ¥eϫ摱2¢3ú½<.{¤IZ»6mžÐÝ´MØ£ †8œa Á¤îd¾ “XF€YÙÀ‘„Ü…9b˜’û‚²¤lÆŒwQ㿎/=ϲ — D¤ ·œÁ,r^œßuôÅ̓›ì¢-wÒgû vŒ\ôN¤›Ja/*Iך£U’a Q•¤BàËÜïx†Ãˆq8%¤ Q!ö¤!º`t)â~+ìîøâ  JX[­FʘÑ0U£0Ö˜œzDý¿;È æäHçÉPMQ½ââ•bÇLj¸R9ÌÐ °?3 ¡Ì×rZû`„ÑÍ`‹ÙñøXÍ ûÔ÷ÙD”£D¯?\ÐáŒRЩƖIŠFR BLÄ4Ô³þ$|Öz°åâ‚­™d ´±¬Ñ¾îÝZ˜—‘"w˜ß‘ùwìnÅÞùÞyïðÎWð{4¸¶âY@ŒsîI]“CaãÊÇåãA…Æk«. $BÊÝ@[ÓmßTéOpF¿NouWü9m¡9Œ8‹ö$­ò›Ü võÄQ?1µ21ÎããUжå(ï8¦Øõ=g—‘ˆÇû=Ψî때åÄÓaH©ÔÕ&ˆ—Z>-ú^&”C¨´–4ÆÚ:H ë{6ûÏøtâëà|?`LPŸ€'ŠJµ‚ù|2FR Ð0ƒ‹¤0²[_(û?L䉨ˆhÛ„$U8.¸BoÑภTáí’{s?¼Ã~?µS.ÈúôkÇÑ´ÆW½+nˆr½ÃÀ…¸ƒrb`Ø5m§#ŒxNRD £ Âþ5Òö%(¡•4sJQÞaæ4f°U"U²¤Ý’Ù”‹…,J—$aYÆj9ˆªC÷¬¡¢„÷+Û( ?¤*5|Èõl j‡ü‚öÍC4xŸba¢WçíKÿ«8&þ´VõÊã»k_$ŠQ5Q{-9öówTØÁryÑÔÇ€*RÚÎHJ%i®”¨x!8/™óP™³¶ Qiå!Á³‰œ ëâä1ywØÁ“YOœ¨x‡IRÆ$k^cF×-h&ŒˆÀœýTm.aA–à±(2]¡=³.6'Ÿ¢áúÜNÉšËä/ —È òꃨš_Hßé wœ–‡vØ V˜¹tÜ»#ÀÑ&tdÒyv¬ ±;]éCd*8ÅÖÉÊáÓL ý| ™vhµA½cñ:-Ӊ英:$ë±=Tà<ð;¼¿®*-‡Zå¼ãí-Sw&δ1•jóŸ­‘¨ lx3ªÀ>OlOÔªNÆâ–ÑN‘1U«¼/¦.qß©Z@•aÀÄT’Æ©Òf‘£j} jhe¨èGz@TÈñhu}ŒÝ.“B}J[öð"Õ:lß!•¢°Þç6’Zƈõ/¢^ºíìË'T=g·hƧâŸÄ#-},‹G\DîŽ+%Ѻmhj¤V*èJÜA‡‚—W£N2C­äŒŠõV0—Is ÅÏ‚žûPÁáÙíŠæf·ÞþK8ƒá"ÆDL#AL!p‡£e„\%¶Ã[.µ*‘Ä/„öÃ¥àkºäárq˜æ½:š€DÌ4&‹¦÷G­°² B0¥(ªGb£1]ê0ŸNò¨ê.@½û<˜Å„ÇѶ—=² c>û¬Õ ¶°íæ¨Ôáj'\×›ÖtW­®wû[ÊîàÍ*lyz¶åaòi(â! §3ß`˜-]аõŽ ²#öX£ÐbK¬(%8ª²"Xü.²)È‚z!láJxgUžßºJ•«9ñLµ,(s£_ LÊ XXÔ2èØªÁ½Nì¸êDÉQpÕ‰/…¿Þ7Ú½þ Þa¬Ú Ãf p}âÄ ÀyÊ“N-xœt¾ ÚaVXŒ €åð2…mÈÄí³ö[;Q½®ªWÇXWQB¼¡$8„ƒ;Qi±RñЧ?b›iý‰ ëQ†‘ý¡î1[Ì_ Ê(öc‹<®˜b†- Ñž¶0<¹Ç±‚Ñ®5ÐÇ¿<—©µåUŒäŒ¨œû×h½8˜ö^• ”AÍöA^0=ax`àØ\8ülÆ€pàªxG‚óÀ&0Ù”'½Â§½Å9¿l(ÀøÜ)ªŒ£Ä6P;Øó"|a×]a—êÉc!ËÈ E„.¢RdÑ¡ðÚ>PDû“Eâ(ßÚþŠ Z=O |«|"^ž!·ªõÇËcñ ªU¿ü Çû>AþŽ7´Rí‘;2²WõšmÞÊ»¬ˆ×äæâÖÏ~NÐ N[8u‡—â£5\’˜óžM˜§-*–C„×åà0ñj ‹´p¥m†Š*Tˆ±U`Š·Ýs‚D‰FÄ%9Ò”PºbI´’&¦\KHN*µ§Å Pí»Ÿ‘šY­ âQ%ÑHx!Êk}]þ®ÕËùñ|’­ðåoú$’þò´êi馮#k-ª8›ìtçÏI·‚q†"Ì´mêP †ÖU*KHÜ€!ƒ¢(&Æ4 ï›oXÊ0ä£xz .U:ÛQ³¸ù&æ=‚3Yàì¤â'&ŸÖê £Ùn§<²'̵î*‘wö†=P,3Œõï º‰ÀïÀ]X,næõZ{ $:æ|wÑ!¾“X5ü¥à)$úï`úÀ€+pÝÛ³zû–èŸS vŠçÜ9Ky«d‹1´Ñ»¦íV0¦ªJªÝñ jiú¿P„úW‹TFXñQA•úl¢ª>®|öaô0T{ÌZ Xë»’¥³%Ì|æÕû»xÞa5ËõÄH¢TÔ=GàTó\Â0zK ©Å^ʃšh]¦9a •<¿…š““ µòËÂ2ú?ç=oH²ŽoרÁ[ÚhìžR4l@­3—î‹H-'œ3‘]˜ìü2õ› 57Þoöí뛜GöÍ#®yæbkûj¿4ì„ ¯éCLŒuøbÛ+ )ò  |Ç4Ëút³€-à†÷+v+ÿ pð$ ð€ødGÓ¾) ¾“˜D*áN|zcý¥êöý6¸X\Ýl<,_\š¯Œ°W Ò·ó·ÓÿP {† endstream endobj 3839 0 obj 8541 endobj 3843 0 obj [188 /XYZ 31.5000000 669.500000 0] endobj 3844 0 obj [188 /XYZ 32.2500000 668 0] endobj 3845 0 obj << /Type /Annot /Subtype /Link /Rect [384.750000 641.750000 438 648.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 3846 0 obj << /Type /Annot /Subtype /Link /Rect [70.5000000 527 110.250000 533.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 3847 0 obj << /Type /Annot /Subtype /Link /Rect [303.750000 433.250000 342 440 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 3842 0 obj << /Type /Page /Parent 2 0 R /Contents 3848 0 R /Resources 3850 0 R /Annots 3851 0 R /MediaBox [0 0 595 842] >> endobj 3850 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 3851 0 obj [ 3845 0 R 3846 0 R 3847 0 R ] endobj 3848 0 obj << /Length 3849 0 R /Filter /FlateDecode >> stream xœí]M¯Û:zÞŸ_áõ×W)ŠŠIÎI.  ÐÅ ‹âN§ƒÁAÓYôïW²%‹ÔC[ÏyII¶æ¢M"Ê$E¾ßŸ¿þË÷ÿ<ü÷?¿~ùþ?‡ßú?¿|)ŽuUœÿwèþûåúAéŽýßµ«¿ýíåçáçË·—oíÿÿùrþÁ÷/ÿÖþíÿåá_ÛÿûëáÿÑ>üSÿR÷Âß^jU·þ~ú³©Uû·âòg÷ü//ÿþ‡Ãß»‡åúÍŒÿý‹ree\·Kÿ|>SþûÇoùõ|óVѶ*{PF›ƒjLyøßÿzùs»À0}qlŒRµ5uñ‘…êò²RÙ‡ªÖ9ý'3»J0¹ªÊt“Ÿv.}(J[üèlÿ?øwri×­ktÓ‚•r‡T0¥ŒéÖ±Z”röÐT²ççM/{ñýìuY'œý´wñsÑe\òv­*ìù€:h–?¢÷ù“ÌnlÊÙO{—?˜óýFf½àª¥§#ªmŠ3ºLŸäª&!q8ï]ü\úë…“‹Þ®5UBâü>}’ó¯;–löÓÞg<¹èí:cSâîeú$çß”*áì§½§Â]8¹èí6õ@Ü äê„ij.ꔤá´wùƒéï7˜ýÛœYðVÎO€Rù3òÃÏ?^~ýÚ ó-XÙÃ?·›;¯yúãG«ÆT‡_:%©Ýþ?þ©Ý’ûçÿ¾4G[VÃû G8ò (ƒFÊ/p¯ƒw­àÈ;(´ä÷à½)|Ö_é½½ýhÁñcä}£Z Kž/D©ce¬««÷Íèóˆ;º¦8íÔ#s4úlçyÿ€ý¦,û®[½f<ÛW¸Î4¢4ÜA}©ŽºtêÎßàuð—ŸÑ÷à/UŠØ\Gp¤‘£æ5f–Wøi^âÀôy÷ŒüÍùp•¶àîÔõZ8ò†¾§07Àhb¤@B÷C:“üzUãßoy>)Uƒ/8¨{?†’8T<‚/]dðŠz*4A)0ýéÓŠÁTásóáâNuÑŽDvÀÀA wgÃwJ톃/É)~Uz$akD­çY¥ªoò¬l@à<Ú‰i@7õý˜àP‘³€_œC½ßf/(Mp¨ÈyÀoc˜E>‰»êõ” VÅì-r˜!1,Þ‡õ„ü!ra<ÕœúÍ+ÔŠÞVÌSvròAÞ`ë Ã0 E0 ã ží“wCZe#·ÆÓKŸ€ÜâÙJhí`Ö‰h0+ˆ(äxLîWò"ÓcŽæà¡`±S@Á0<`Nƒ¹C͉C悆E®E}¤$ëõÉs¨äBœr6°Ã¦ðÎ"”çaØSÕ 0ŒXq·~›Afqåm™_>¬ÄûÌ r‚~òÊÄ9€ïrc)qÜkæÌD¾Ûz‰½õdç…“,F,ÄxÈ\ÿRj%#ÈQ6l|a"$ˆ·ˆš«ÓK@Uá|â´eëQzvª‹ê#ì”ðRDp(l³¬5¹ö–Ï`ü~¿½o_UÇ¢ÑõGI†¬ÍÑ$)SÖι¸Ý6Âð®öF|†"$ìM£ê”i7½>¯|$fŒf¡n(jIÌ&É/n±”åƒQ‚ñýcAèŽ0Ãƺ[êMJl+ÎÈÖJFý’uúaÌ›(\=äE¹Œ2Y³#» Ô7±&EC í5›Ô•Ë£„o}“>:гÊJ¸3 _6OL 0'Ø#¹æDråŠûdÌdXKfŒ ŒnïN„Þä²fì¦ðl¦ðå½Ïd‹H,© ÎùÚ ag¬VǬ;ëþø@²D䤈6-jÖ\¢ÃHáÌ—.er½‰çÌrîRð1¬ñŒ ©ÆSâô{¦jØmq™©Ð•ÖXGñ|8²¢â-Å'! w3<­žH¥¼ˆÔúatMy>Âv?E Û¼YéI&Ë3Ô1o® ëáh¤Öðg4R‘¢D# ÿ×h†•‹{+jÊàI§½“ZÞ_GY¤°1ޱDg²éš’Àöi.ÀÔ&Rïº4“êª:“ÑÞ’£;ïÏßÌÄHÏì±U»ë7 úM_VÕH\™Z缃úØ8×pdg'¾t >!hàßœ‰­2Ç ~÷xx¶fþ¹õ"ÊÔ—~†{#fëõó©Ùà÷àu4üÒžxLŒèOóSˆeP#TÒÚx¸Ô“˜R…B#¼õO÷þÆB\úšš!õ²©/e2E®Êo4bCBœ)P>'á~ešÑºd¥‘\²z.çþz·Ò3§†Ì&ñŠ D €WV1c¢™SÄÊ–ug …J;OŸà¦Çë(¦"K‹­Ó3ÊL`ìf @%a?™¨‹™ S¸_  ¼©|zŒPäe 9`˜ˆ,&Ϲ~µ­ˆYƒ½¯©÷¸áùÉ]d_ÍH˪”¯ å¶v*LPá‹$p ‚Dw³§‹µ]ÃÃCäјë'¿¿|OÖóš4Æ3˜`‘Ðm"®8BWrµ´ZÌÛ’)S¼oË¨Š£­Õ˜£âÚ~°3W¤£h4ÅDÍD™¶3Xç.M©žÎj–4ï«ôN7±Œž­nÝýžñ\6¼ƒˆON6+qybŠý¹¢…L"œŒ±·ˆëC’Ý’ºÜGÌD`–‰µZ>p¶{(eŽØà}—EfØ–jY4ƒIRm 4d‚Ä?+!„RÂ%Ãdëßož¡²©]«Ö啵ïv»ÔÀ+#Zò±Ø)ÕPe|=”‰pŸ#ó¬O§rßD™Sì ‚Œ®GIº38Pâñ\™8€é-w•Ò·oŠÈºX>×aÇ—R)s 6²gŸ>WÌjë–/ÚÀô¦$º¾Pâ=á®2oï·xÏtÂk]ç|­LÙ»c‡ë£sÅÁÚîZ©þiu°Õñt¦íËý“ß^¬9*ՔΩË[z4‹¾^£}¿ÿ·ê~vð]kœ~ãí¤}Ëfqã5þòòù‰ Ûõìĸáê Ñ:I9\!>ŒUÆðìÓºçñºn6dçc°I0,ûîvïð Kœøçàˆ‚#op§8êÔŒN[åӃęæŒ~&Z'ƒÒ‰™Ú„C`5ŲSFE«Ú¹§o_‘8«ºñ‘=M0Éá[jh²Æh®se?&WZO®´“r¥ äJ;!WÚ‹\iGr¥õäJ;)WÚ@®´r¥½È•v$WÚŒr¥®!‰'-ž(UzñDa˜Ç•4ùD!x¶äbƒrwR»Ø°‹ r>-‹Y¦ê4sŠ\J8]äø›óø››äo.àon‚¿¹ s#þæ<þæ&ù› ø››àoîÂß܈¿¹ŒüÍ=s·ù[„»@9óªÞ—0O-†<1}u s;ÛùÛÎß6Éßl1æo¶˜âo¶ðù[÷Äço§·ôh}½ÆÀßl1Åßláó7[„üíô–ÍâÆk¤ço¶xþöþ”þ†9Òë Ž4ÏT,Êañz5Å•?R¥æäe]{0ñ œ|ç׿^¾.þ£µØ¡ ·ò'šÒ5aŒO,ž·}¶$CLüd³ ƒàD¦[åŒà®i•L¡`'D´\ÊD]c8–Õ‹K+):e}q÷ d!Wûä*ÿ/š9â;ezp1©¿³ãÝSöøîŒD¼å¢MI6NÜÓf>È6K}» EŠÊLža«ZM[£¢úbµ2—>‹”|¹·½•·IücRÍ”žœºòwy€pA€**SÐC¤v AAE¨Fä² É0%gäg ëÂujîç… U‘­]Ù'ƒ,!iŒ¦»ç`nTŽ~ƒgPÔhDãÓ½w";€‘| p×Þ5¾<Û­8Üç(!_­û(î+¡S¡ç°Ó‡6ÙÒãU¹ –¯ü¶|]ä@4£„ϨØÍ”6eªÇ2$6w‘µL<*©{ô;M¢)T!åÙÛ“d-ŒÏt‰¨ý°€U.SëêÊÊ*"¼A%Q^8GÑ–(ö Ü2ƒå¨•ÊÑigj·»‚î»5ƒÃ ÕÙÄRw뺥îÖµHÝ­kç¥ÕvOüÔÝÓ[z4‹¾^cHÝ­k3‘º[×:XC©»§·Üh7^#}ênÝn8¡t¼H+Õ!£÷ýÛfT„[,¿gý¹n÷:íŽþtòC}Ùƒzÿ`‰V§Ý.§jÏÿÔ=ñ}\§·ôh}½Æàãr-4…>®ö¼‚5ÊÀÇuzËfqã5Òû¸\y¹ í–§}ÿˆH’9N¦ÁÙWxçŒáÌ0,¶á,/ø=TVÔâ)øùÊÓ¾ÃÄ^žö©•çm׆\Ú`–2¢ô©÷ Âl7i­ëùÔ„Ô¥*xnpdRäJ!9"ŠØÆxÀl0S'Ù}f#e§îfÝ”Ž…GDƒ"öÑÌälè(’Ð(¢Æž!zª4nóœ¦åõ‚Œ³©­‡'dˆ,“£ÃTD†·™ ‹¶výâ ô‹M™@ñl¸Ø "?#s!‡ÄÅî{Û™Ùe=Ú=gkï sT®Uþš™§(¶"T*—>˜l2’H<ó^ža ¨- ^±žWò ¿‹ªbÀzq;sÀWJ›Nð\ë‘]6)=rnƒ oŒŒ’9dëfr¬¦Éu/Ï7e>a2Ö´VUã3«û ‹:¡°ÆÃ¤3Qf ‚®¥f¤Å/uJriSŽÒFO ¤Må ‹í“@ íÞÒ£Yôõ´QSiSk¡@Ú½åF³¸ñÒæÒÁl# ±1"ÉÉÖº_mžQ<½åF³¸ñéåÃFÕ;e“øÈV³‰ H%¯åªÆµxdhaŒ‚LHÞŒZáD°…¦ŒÕË”¾ïGúHY£Åí”T±eÙÀÜ+XWºñ8¥f~ 7× <™‘1)'Îèb,Îh5%Îh¿…C÷$gº·ôh}½ÆEœ)›)q¦ô[QtOq¦{Ëfqã52ˆ3z覞­‰Ú&{ù®€†¯Ù‡š)&Hx׌sFXÆy+’•°fŸm&¿õb’•+šI~J-”g£SJX®ñ˜âb`tÓÔš>¤±©ª:0ƒaàS4=€ieÎàŽ9ß2ÇRݨˆG—´¦Wc ð …/SÍ'ÙL°“l6Óô†2Q1ÆT2£å*½þ<¢éšÃW—63¥dÙ­>fVËG`îò÷š')µˆ‡EbŠ„E¦ÅÌ6Á޹R&XG¤ÏdÏ6——Î"’ sDžUL°£zÊdÑÂÕ>‹ÅÚ;Ãà,£RÜ#Å5[¦üƒ†˜._ÒñI¹X^ëRmrsL¬¥26¤´¹ ;Rk’$–¤la+?rÕØk`a a2‚Íâj¤¶ÿâBÄ}ýR‘LñCY]T°€Åä-J+Ž2³-¹kfäÔF¼'¼®²‚ž¶7cê`Q±ÑMîçT~tó‹ˆñb‰ö-уçqß2Š—N §6q.TÌý4my+¥°:Ÿ<¤4––Eã3¼´t“3]MDà%‚s)Þñ`ÉÛ°sd0é5: ÿÀhAÄéREðõ2éFË[ðÝÔ³æ¼P€!NIÖ5¶·&ëȘî[¬\ѱaa“Ê|²í _g>µÿ®Ã̧ö©—d}zâe>ßÒ£Yôõ}æSûï*Ì|jŸš` ãg>ßr£YÜxä™O¶½Ëá–e+æ=ˆ]xFa&,“ ŽMyvžÈ¦päj‚²|Ç`"`$¢p| ½!S2G&6î1ÊìWÈ”$²Þ‚I‹YŸŠÚÃN´‰ˆlv©D:¦kjdFUxš>Ô"çäªë@\qùÉ&çà]ò©ïŒ:\kno—§" L£¥¼Ý/’ÆJŸ+E_sÖõq¼-ÅŒ in‹[lÝo€¢ËDRdJ®Mïeü7²y·‹3ã\>Û ¼·‡¨;#&‡r%È'MÁÚÒvï;À]ÝŸ†-Ý{fªÕúü›ÿ›^²›é!hj¤™?[¤Ý| Gà:¸E}~)=ÊÇBÙ¸Ù “sŠßâà¨\a¯²2ØòUD³i7®6Ý/š0Á-‘Âд9c'¢\ôF”„ôÌ–µOÏž¦m.V›"Egh"wAÀõ«Àa­îƒ 5'”Ü—X„ý¶}Oï0â!ˆÝk %èøt¾CÓ §ëë¿¿|¿+JATËÐ>A wg:ùDBQÅâ9L5Žç0v*žÃ8?Ö¸0ž£{KfÑ×k\â9Œ™Šç0:XC‡ñÝ[n4‹¯‘!ž£ºh2¹*ÙnS¸M8Vfx¨V j.[£sn} ¯¨àÐYþSÙ÷8 ;é°jl “xˆk.üŠ©ŽH§ÏÄ'+ÇV]1f«n¢@|û4`y.(~KfÑ×k\Øj=Q ¾}°î:(~Ëfqã52°Uw»@üé*“¬õÄvjl…b*­Üï6oR6…˜±Ûœµ¥›1Äb£í,°‚æé}dÉ9ҳש ñ„s;JÊOð7ÐíÒ³þLD :"FüZ)>o•³<Þˆ,ˆx>_‘<Ô—þŽ˜<`a'ûÈÊG²Éy±$yh.êp¦¨˜ˆÚg[Èö‘­Ž¬€<Ü‚ø<¨^ªKÿ£\¨CÉJ8‚iéò ´¬{d¨ÎC|&" ‡:NÙ¢`kø|Àð"#1µ„q_ÞÁ.¿¬{dy"ðtŸ‰tUC›t‘¹Ëc«ÙI׊ >Q«‡ÄÚ5Û_"Dg%a°ÀGwMåEíòØ F–'j;ÄÇN4"þlb¿9ñ›Ã{÷@|)>kÌe"=±„í{˜hs •ÏÄD5>`Ìx™c\œ|ï#kYž‰&ø<ä¡Ë*ÏK" «0ÇÁ±,8¿ŸPþ"ü‘႘;í²üªÉÃñ‰ >‰,oG’g#‘ÄuíÔ>²aÉC|&ò`îˆ1Ïd¥ŒÐy\‰1cCô.‹<ÜÈòäaŸ‰ØØ;"ÖsYsÊŒc~—ó}d #Ë›$Ÿ‰<¸Üë”ÆÇÈ’q$"k±-Ë{ "n9¢¦SùžIÇ`2 g"»—«c@$)SK“4õm0ÏÅ öÂûÈÎ vf0̆³3ƒÌ Vö6˜3$n!‘ ìÿfÈ^²ñáFd™ÁñÑ[À; Ò¾³ÝS GèåÊ¿ êç1J,LÉ `™J8Q© Ø“E@\£ã1®Š#|ÈŠ_Ÿ ç+~}6š{VüÚú­¶»'¾ÿô–Í¢¯×¬øõùgÿ×~Ëðî‰oÅ?½åF³¸ñé­øu})ý¹[ñÆŠ#Úpܾ<‚CÛàUjØ:=ÒTï`‰Îâ7PÊ— 0 ²ç³`ߪyíï¡ÇÜ»ÐßD<ÙÁ‹1²‚I¼9†Heƒ7H¨™e êAuFÁR0äSPìÓZædÃÀiˆ¥#ð _b(‹ˆ*_R3 nµ1Š\–ÞëÍ÷\QäP ‹?þ¿YF ŒP-bK¸ÅPƒïI ž"X«­R%VcÔB¬‹Eí"t±Îxß–ág‰ ½±ïRÊpŠÖ12Šèq%Á›©uÎ#J ŸzÇl Û§âæð¹Eè¾Ó€AgÒäñ"='m*å“B¶¦4Œ‡¢‰u"€×atüô+ÄÃ@6ÁÓRKŸ1ëÂ4&'Ù¢4B•Ô¤åõMF˜ŒÐ>|\„M„ÁäЦ"#Ì7‡ªtH b‘ˆü+­üE)ù0®yä8˜„zò•ÁøYf ñSVh›#K3f,ÅašÀ CK% OfÌåñY0²®¬‡±0av0NÆz¿E’;±fˆ‘243ëlS&Nk£ÎeÅH,rgM=rõ¥¶H­?s* Ž0u&e¿T3!t0Q” Š|)SW'åÂs‹d*0UÄaD·ÉÙdÀ½—zt’MÑL6 üÔlp×Ì#ð4D@3¸Œ&1ÙÛ•†ø¡(¼ÆÔ£(¼Æ¸‰(¼¦ò«šuOü(¼Ó[z4‹¾^cˆÂkŒˆÂkŒ_­{âGáÞr£YÜxôQxM5”ÔŒhÍXõÉ%ê2'6ÐacÞ#%Lj‘d<]„¶ÌX(‰»-ÔÅ{ä$«î–Ê4ÑÝ“>ŸhD¶Æ’lÝRyˆÏDRÞkÎì$…ËqÇ@†w½—‘ÞIÊ3Bü‰¨µÿ~¶Ô+JܾÝzá ÁMQ>Ý |…êTÃ¥GNŸÔ7%¡Ÿo¨žmÏêwy,Ï‘ÔÁÝÙp¤W Ëc¯Š°8¥W¼¢uô-Ayjo_û/E>Dì'1ï[*àfUÿéÁö ˆewl\Ÿø …gƒ¿éU5ëÓ¯Ú@°×ý½Ýñ°ó7xvx‚þ ð„zïÝÄlx$rão ((ñÁ32‰ó_ŧ„áC 1[ϰ¢?kž=]¡*œ¤×ïïy¯ÁwxJê– ejÄAܽ’–Y ­ }ì©ûUq(Œ]ÓW۹ɾ¾½ü?7H€} endstream endobj 3849 0 obj 7848 endobj 3853 0 obj << /Type /Annot /Subtype /Link /Rect [211.500000 570.500000 282 577.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constructor_helper_function >> endobj 3854 0 obj << /Type /Annot /Subtype /Link /Rect [200.250000 555.500000 269.250000 562.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 3855 0 obj << /Type /Annot /Subtype /Link /Rect [282.750000 555.500000 387 562.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_properties >> endobj 3856 0 obj << /Type /Annot /Subtype /Link /Rect [99.7500000 548.750000 190.500000 555.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_pre_post_directors >> endobj 3857 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 417.500000 524.250000 431.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_implementation >> endobj 3858 0 obj << /Type /Annot /Subtype /Link /Rect [425.250000 182 476.250000 188.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 3852 0 obj << /Type /Page /Parent 2 0 R /Contents 3859 0 R /Resources 3861 0 R /Annots 3862 0 R /MediaBox [0 0 595 842] >> endobj 3861 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 3862 0 obj [ 3853 0 R 3854 0 R 3855 0 R 3856 0 R 3857 0 R 3858 0 R ] endobj 3859 0 obj << /Length 3860 0 R /Filter /FlateDecode >> stream xœí][ÏÛ¸™¾÷¯ðõãEŠ¢€E$“,°  °E/ŠtÛA1)6Û‹þýZ¶ìÏ¢üPâ#’:˜l3-’zùžù~ùÏ/>þíŸÇ_>|ù¿ã·îï_Å©®ŠëÿÛ???>(Í©ûïcmªã·ï‡Ç‡Ï‡Ïçÿýq¸¾ðåßÿë_Çòø_çÿÿûñ:?üK÷£ößµ¨Ïÿ~ù»©Åù¿ŠûßíóßÿóÓñ팷åºÍôÿý³0²M»‘¥nŸ).þùí‡_®ð[Eêºæ(”TGѨòøÿÿ{øëyÛôÅ©QBÔZÕÅœ…„Rç¥tSË£FE!+]þ„š?ÂìuQWñf¿î=<`dÙ¸gyÀµ(ëDÕ•ÁÛü1f/kqöËÞÃæzÀŽÙƒ°”ÅDeÑÄÒ}þ(GPɘ|Ù{xÀtŒgzÀµWÕ:ŒîÓG9#uÄÙ/{—îxáäAO×˜Žª: üMLújÎEÄvïÁáÒ.œ<äéš7%Šô5Q S–‰÷º÷XÒ×1{о+(q¤¯‰ªebðeﱤ¯cö \‹+U ý6”#hªˆÊÛuïáÓð`öÏ>³à­\ŸCþ‡ãÅ÷_¿|JœAª_ÿzÞÜuÍË__[¨ÔÇŸ[«ôÌt¾þåøE!?ýáøõï‡æ¤Ëê¶ÇnD ‘â#|Çø¿SüŠF„†ï”pïú=\§öß5[ß³9ÞÁÐùGàùµ¯‘ „‚gÃTRÂóÁ°ÎŸã?~uòþ7†+† W›‹¯¤-#?~¿ÿ»<SµnÿªÏ"ìúTuu÷wO¾´: єƈû¯doù¸Æù÷Ý¿‹öµcÿí¢i¬5Ú'çwz;¹üÊôf1ý5~;¼ÿi¦¨i€œ9ÑÏ—µê™ÈË1ˆât~jêj ª“,hOïí¸¯(oN¦)tDÑ+1y›nÂlò¨“’W'¿MtOÞ)ÜAש.#òT)Ý‚`@ fʧ4 ÞlQÃ?ÎæØ5<Ç®õñ”£kHBóþBüëA51¸·Tz\\È#kжI%”^GP–˜‚UJFX7£ŒC`@0:ŒQ ƒïŽH¬Në`åtyRÏ#é!ÆxÌ vJ ‰TcvÊ –ßÁN½«dC™AeZX€Ò0éRÜô:#a5?L%LˆÈN1>ë2åè¡Tp«™©Í:âU’úÞFR±.L%™©%fjªã’Þ‘d¦6ëˆWÉö6’LƒT’™Zj¦VŽ×6YWIŒdÖµ¿‘×12Wƒñ‰X—lF%Yj±¹ÖèÑÃ_þN0£Ò,TZ%ëÚ‹ {'˜1~Ƨaž•¨FÑbù»ÇŒJ³Pi•LmoÌ3ìÝcÆøY??  Òý,€J?˨´Ð>±³.¿’½Yäã·,€J?˨´Ð>±³.¿2½YLøYU}gò×xp!n±ÜoG‡C¬qø7Œ.ïÈÑØ4à ¯ÐH‡Ï~) puÅÚê–ñ0R¢tÄ{d(@øáÓÀ›eÙ) ›%’A˜Êžx%ág¬S† 1v*A>l/Pw¢þÙ;°Ä¬Gb“kâXÂܱ޽%œÅƒáç€,Þ,΋b>#é°±Hlea_&*Ýf1`òîº6#`oÉA0¨øXñ‘<çH‘à jxvÀÀƒ$&²üD“‰OÇén¸$7ä±^4Ûq÷\£Œ‡˜ð;Xš`vTSÀ v°bo`j!2,‘(¡¿¤ÜmO¬¾àê¼vkPüd°0¦L¬uc0cÞŠt<8“h½8PZ œêÍ(xo¿ú‹ysLֺ꯳ £5"/º¹µL3z˜›²y·eNW¶PÂ(Ö 1N&âx3JšD¤ŠÒ(›,°<ÆH²~¾¶ñëaã \ÌýÌA»XJa—Ǩ”rÈKF~…u¾`  ¥°ú Ö¨ˆRÔI+‡'o§ú%%{ÙÃâb´Œw#Em]é¬f t“¨Éf=1뉛ѳ4GŠé;.KÛ4M¦\íÕ¬Ø2»ŠïÔ…!N‹Aâ:”an7*Œß?l$Úò7è¯s¿°X¸×ò.dµ£‹AU”sêbàŸ„€P„‚I5ÈM#£Qƒ€p1ÓBxÄY ±¤DÆ;P¹ Qì«‘}0þ ‡ßBF įjùøà÷×HçÖ.dA&‘Í0H‚*JéŸ>F»$Ñãxa¡Á÷ƒ®SR?B²Üv ¥cAƒãáhb‚w¾Í¨1ŒJÂHl&¬0l~ˆ›WZ™pcÆeÏØ›3äF¨/Å;˜.]³©íDÍI×ÐY[z®¡ìIÌ4Ä %&°œÀ°>ú¯ÀA68'ƒØÃ2Ú‰sÌûn2S´¬(·7™ag„¦†‰œÒŠhEP=¶èB˜âbo®¨;J$sEe£ÈTÛä(„ëuãÒV¸tRû€L9ý€¨ÎµÓë KýÄõ°{Ø’Toà Nr*îòi*5=Qá%Js]±ŽÎ¨+tx~FTßnSY\*û\]»ÞhæQ¤œð=+Œû¦Äc*—¸Š®BuNQUŸÃ¦AïË£8Ÿ7S¯3Êç$òHl­²YYU6F3ºRX¿¡g{ÜEy¦ÃJ tôò Qܲ§à-¦nÎð_IY Óè$y\hÕXÔõzb‹… ³š|Y]ƒ/•é‚ìTS?>ˆ|Ù.d±—,O¼èïúõéLd»#bŒ%M@»>–}?h¥l´KÛ©”M­i­¤Ex”®WÏ£Ú-ö¥‰xT»PæQsx|Ça¤„-Š·¸þé€ulë ‹‹¿šj@Ù©Å@»…©b •¥M%x¨J)ØŒç€HKqˆÏœ—ºõa6»~ÎÓ…/†&QXl aàn¡-S§‡âåø{¦—ù ®ŒÃæïÝ-/RUIÕúÞ†3;­bÉÔ BÑØçœØ Ì7 seÿ^ªøíÒæiéëB^õÍã*åãƒ%lžv Íg›'Û5umáÓî3I˜Jéç%–+ Š/f6y×Õ{6òŽ8Û°.Ñ IÚ›Ò–2ûOž´OØÀn€[s ݉Yqg»Æâ¨K1zº›.Ô3ˆM•“aÙ¶W: ØÇZP/3þxŒ?«ÂYf)-l™Dœ#h‰– Ò2 ­M­]TwUa½¤”……äš(€¹ØÝ‡È}gSÔzeUbC1û±6fÎÌ(eåGK;U¹¨bËûtxE \’êeôGqr‚ìßx¦Õlb0ëªw< V*çÀ68qoêÖËÛ²Ë=8¯Ø=‚„Uµ©˜ß+¸žüSDzڔÊyÔé@*œ-†+¦Çe„3ŠžGî}PV–(-a‡ƒ.åÙÈG8òØ/¡ŒÞ¡6ÒújÇqOï2䈈ÅÉßvh™/œ«±bÑÈä\bõÀ¡80ÆXÀLÚ低ò2ƒ ¿6v…‹«q0I¡:{£Q·}‚ ¯„lí|GB& [ÇtíŽü˜1\GÂÜðÆ±ƒD0ðK±p™jþì8¢ð—âŒUpocƼ†noT§{VAˆR´PÃÙð:ÄÞ„~«Fw$>¬N­E¡ózÇA?Äùà]Ï諆wF!7}ĸËfÅøP0Àhß!v€…èšÏ³”Îÿ‚Àhs[2QºóFý¸‹¹F—r û\Ñ Œ…ƒ‹#Rá¯︖‹©ýÖô¬ø°õ”6Pê"f%ƒóã¾ô¢œ,iõØ÷Ť”‡­ÐÆøË˜°¦“#ãÄÕAˆ½ùtªâÛXÏt^3% C06õ1¡ÍÔ¼Eìamq¶`— îMOì†aŒ_lI–³kìºÁ]³)G¶Œ ܰΎºì¨scUöm¬Ú‡ÏGõ»à”ÜÁ$¿Ë¬º›M]ôên6µxRw³©íš˜í»îæåW²7‹|\ãVw³ÑÍ“º›¶k{¶O캛—_™Þ,¦¿Füº›M}¯”ënÎá‰]tòu’BTYAiÉ\‚1 s¡ÄÈqœ>î¸éí“Fc‰bº¯*e <*Rë½ —°Œ;×dLªkm«?Œ&Îx‚Z ØÊfÂ{–¬‰MŸuSÚ'²¹"ÀÎ" µýyA#³2*†ìœ P1Ꚇ´)}![)Ù(ÉÚõlj ©L{£C˜Ä}ézuíøá^M£G!—UuÇU¦ F/O—øRë-Ì5ÖuÂ^d}/Ê®kä¡îÉôÚ쀲)µRÒªê Ü• ³ÞäP)ŤU.Öt#ì±8fóØlˆ ´TÓ 9ÁkìÃÊ| £Zãw°Á âtLaj”¾ê |a vPí0‰ˆ`ê(ƒÚƒ ÊJŠBØŽ Êe€ˆiÌØõâ#L¹Ð½0ÊìãLÞ´ÔˆGTƒø21 Ç…Ž—ºœŽã<ß;(6ï‚ ê.:OÈR>>ùýð%ø¯8S=NøY‚Ì‘ ãx`Ú8ÈóQܱÀ˜Ç-L‰þ *Œ±ðƒºÃÁU¶˜Ú·AKÄE)Ñ?«’awŒt°©L/dì/Ü%¢Š«´°Ð\;g›Á ÓÌq?N°nGúkX1=7:6¨«µMU'Äâ+Œé³Éº¶@”©àlxdù°œ*CÌX´RÚjñë²û\@{Ò:Ë3WÑ®® ³v6Ûvkn2ú&¦4HÐ{ ŽQD“3…¬F€TÞŸØÃ±»Â˜W(• ºåµ·-”ZÌXXµMäÙr¨÷K£RÐb^ar•'nÄyàÚý‹ÑmÐX˜õX•º¼@ÓÇ ›»&o=ŠÄì—|ßä€Á€ =²G¦#t 7”#Ú4;d9.‹ß¹#Ëî¥ #‹i”ŒÛ>0¥-ošâØ&d1³azÒ2‰¦5:¯¶Y¾xE¥Õ˜5‘SÞÊR[°—8e‡)à†óʘBq°l£ÛAL–BÚš`Öênfkw^u»‚Vo`¾?z}­S–6¢¸wœÈ¼ÖÓÉ+Ñá—u_Ÿð«ìºÉ‘œR=!ïóÙ:p6Ü JaÕ$W”^CEi¦63UîÚñ¥‰*d3ÕÕ9êX@Üav ñ—2•ì NÏg§¦Š—òQâúûø{ň’f¸~8Ä\1BAnXmÄ;€0ÀÕï152×6WæM/“*‡ÊÊK[¥:X9ÌåBÖ­6¥f–QPÆÁV|ËjpVƒ³œÕà¬g58«Áý‘T½ßÏðQfo‹7ÅfúÒ‡Åíö¥7¨Œ~‘ÐO0,BÇ!’ $Ãba]+üÁnl' sYÈqÝ ë}˜Š™ÃgtÅÅ?3Ž 8ô>æ|VJ‚#Aeelt‚œ;Yêd=ˆ=Ćs⧃†$3QÉ÷ˆt“Åú ¤ŠYdRˆ=’š(ø18DpGbmL… ¤ëDIôYþ[[¬Á`FV7ow¸†¸aø63Js?¢5U’H‹*…·Fð}¶FÊa{â;U|c†÷†m¿ a€÷æðôâûQü¾¯Â÷øì³È!¦œ€øð±a;6’èóT3ãórg¾Ý¾ŒäÛí|»Ýò LX¢a|c$'ÓB ûá:Ž»±mjc!‰~s£GÜb®Œµ!êƒØ5'™× Þ{Ãÿ_Ô11]ÄB"ÕL›qrbT³H™UͬjfUsÓªf¤Ì”#<ñÕ)©%fNâ8>,&" ^†Aá]3‚ŠÉ ºkÊÞ *Â0ã`â»– }D™’¥¨²pvBgË [Ù2×Ô²:;¡Ý²$;¡_É ½â„Õ;¡•Rãä”­½lí9Ù#–'çQ–[6z²Ñ“žlôLà;ù:$_‡¸©dŸ×!ÑwÊ·,ÚPpeåë´~b}OCO•z[‰{ŽÑ8lƒ& ‡*aŸ6(2îÔÚ:Èú#ÒB©¥ÃÜ3ÁI&AºQ©µ8ÙÏ6ÌkôØã>»Ú2¢"’ŸÈ"‚a‚aZ6ÅÉqÆ'ƒÓ<ƒ¤ãCtu$W'i}èGÿK™Ìi84œÆLð³,f¼Øñ^K$ëNTU·ÛŽöäÍ(¿d“Ä9ÅyrsÓ0ÍMWÐpñ†¨Ž~cAÕg¦þVØ `‹•Ñ`ÈÑÏHPOçMzQ¼ÕÁÜñ:AËÌ,Öëó<ªÆÍî)&¹0Ôq&B´‡i–K3X#uèªaU¦>"AV´¸ü|!Ms߸QÌ9²æ} Vg¬°Åä–Êqùp÷Y™EÒxaí ÆAí:Bõ‰Š\Ž2É8"‰.c‚\_­ùmD*‘EeaØö\2’Êæ»# ÜWz¥¤U)›y§¸«Óöš›rBfÍhÝÁ(¬³yÜW†5q·yí…¿”‰}Äï`ë4lh†‡ïi“ýf¨pY†’=" ù“I.Á(Ýç– Ž…´¥¸ÃÁºÓ¯£˜8+G¤Á4˜è—dñv Š“®E?ʆé^ˆùœm“ ºüˆàæCÍe>¡‘.ôBÖ˜nß^ ^›cK´ÒœÚ‰¿ßÿÝœŒ)ŽZ·ÕB\Ÿ*qÔÕéj ·'ßZ„hJcÄýW²7‹|\ãüûîßuûÚÑz[j{ó“ó;ý´¿2½YLßïŠì0»—äÁtƒ5^WÁZ?Ã6‰+TŒ{úsªÆ€c׸Ùè›­ 5^‰êf¨?¨i·ê+޹¹ Ç$ÓcLªke|pƒÏH¥(l¯Ô‡9}þ!aÙÇíO¾ÖLp÷Òhm3; ¥_Ö)V66x=a'‘ñãÖÄÀîÓ¾Iø|SeSW„L¨S)&g¦¯e¶å©R«Ãb4¹‹.§9üªs ÑTO~?|™ä‹ Jgí,•uýé1Oy»SWãI6ɪ–eŸÇŠË0$ˆ0ÔìÉ|qþä±OŸ*ö»Ø—b¹À‰.2×›¹¤ÓÂãÓ³ÀŽUÂX|+[« G JeÈbU,ÂÆó1Úª‚ξ^á§—b Š9d ü )kÔU3a©É$¦ õIHèl£W 1]wE\µzÕ&ÑÒj ¯¢+ßé¼#ëðq/G¯"_ÃÑw-Áõþñl¸? nO‡µ£-ëZ1E¢6"1õ¹RE Ä̤µS¥4ÖlI15cxHL„•RÛ6ÀàêGj25?< ‰dɺ&RÜ NQ® ÎÔ= Ky0γ¢:ìïW*½ QÞ†í† ¯bÔ*›Æ˜ˆ/Ç N÷m^8• w…ï°&HQ¾!Zé…b%mÁ87pz1*ruq°+¸ìH•Š”è¢)hi˜M‡í±´wŠ÷6ýÚÏÑj ê¥*X=¼ -ñjYßx>n^íüÀÝ"‰^šxGŸÏ|FuÅ]qïIìÙ’LŸi| øäˆ®â¯3¢à)àáÙcëêÛA4û®ô(ûÎìŽcwÛdj&ÎM~ãŽB_DÉ,ŒoŽÞ­¸õ6fŸ{fßÉØ·«0w!Ô;¸ Þ>핺ÊB' xB³ QŒ˜©aÆ™4¶7×å³ÍàÂë5 †‹aŽ´aÑbĽ¨?f]LEá ³1zþž®‹c"Ër\B/îY³¬sqÒƒ¬Äm«ØÑÔÚÁ”â@%•$õ,©¶bœÛ›Œ¡ÃhQO°¸¦)ègšè'1Z`ÓË.¬ìd…|ý¨Ô¼õ´€wb²I¹¡rüšðBç?Çç•û<öƒ QæiS!O…hà ¥UëðYÌõ“+à+ã/oå!˜ª‡#ÊSÖøÀv¯;xvgÿ+ZGŽ¥«?ÛÛ§îKQ~[Po[*àfE÷éƒìHþÙô5Qè3ž ¾ÓÝæ ¯O¯ßЖE¸ö¿Ï;¾íü#„(€ß¡PB¨ Hx2qœøGD–Øèé˜ÄØ?ÅPÂx„±…˜­Sqdœ×:~ U8I礘òS¼žƒÞ!”ÄXÁœ"ñŒv =°ZòÔq÷©âš*TÅ‹GEØçãçÿ6‚ßß endstream endobj 3860 0 obj 6950 endobj 3864 0 obj [190 /XYZ 32.2500000 275.750000 0] endobj 3865 0 obj [190 /XYZ 38.2500000 149.750000 0] endobj 3866 0 obj [190 /XYZ 31.5000000 276.500000 0] endobj 3867 0 obj [190 /XYZ 31.5000000 199.250000 0] endobj 3868 0 obj [190 /XYZ 32.2500000 198.500000 0] endobj 3869 0 obj [190 /XYZ 38.2500000 149.750000 0] endobj 3870 0 obj << /Type /Annot /Subtype /Link /Rect [53.2500000 326.750000 102 333.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_module_directive >> endobj 3871 0 obj << /Type /Annot /Subtype /Link /Rect [432.750000 128 473.250000 134.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_carrays >> endobj 3872 0 obj << /Type /Annot /Subtype /Link /Rect [426.750000 291.500000 446.250000 298.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.cygwin.com) >> >> endobj 3873 0 obj << /Type /Annot /Subtype /Link /Rect [454.500000 291.500000 474 298.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mingw.org) >> >> endobj 3863 0 obj << /Type /Page /Parent 2 0 R /Contents 3874 0 R /Resources 3876 0 R /Annots 3877 0 R /MediaBox [0 0 595 842] >> endobj 3876 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R /F8 8 0 R >> /XObject << >> >> endobj 3877 0 obj [ 3870 0 R 3871 0 R 3872 0 R 3873 0 R ] endobj 3874 0 obj << /Length 3875 0 R /Filter /FlateDecode >> stream xœí]M¯ã8vÝûWx=@»ÅI Ðõ ‹…* ‹AAOfƒîA*³ÈßlK~6¥C‰Ç—”ä§i$UõôDRäåý¾çþü¯ßþëø×þøíŽ¿v~üv(NuY\ÿw<ÿ÷Óý´;u?Ö®<þúûáÇñÇáëákûÿ®/|ûøïíßþï¨ÿÖþßßúÏö‡î~éü ¿jU·þvù³©Uû·âöçùç;üÇŽÿ8ØO×-æñß?)gmSœ—11õCÿ™êòß?ýÇáçëÄÍb*׸⨬±GÕX}üßÿ>ü¥ ¾85V©º²uñÌDÊÚvª¦PåQ)WuÑ fºü'4¾J1ºÖ&áè—µËoŒÑMxtÑ6¦è¶¨’’À&½ŸbtëTÂÑ/k—ߘî€ñè¢\šþ´?N°Ioã§½Ö:áè—µËoLwÀxtÑnŠêºEebnÃ'9¦Jy¾—µ‹ïKw¼p𓫺ÿÁ¿“S»£© s¦«Ü1ã¨õykë£ÒíOêJtû¼ÑeÏý:xyf©¿¬\zS”©TpðÄ4U¶Sf )W”ÝÁ´¬QþhÞ†O0xcRìeåâ»ÒSÕ`ô¯1£à¥\Lž?|?üü¥9ªêøý/íÊ®^þøÞdû³‘Ó”Çï>þKQè<~ÿûA©Si+ך‚çß»<)ÊËÓ?x{¢\ü“â:=Ysµ7ßÞ©.OÜɵL_?¼£á“šxçóåIy2Ú©‡' ¿cѪóà/%Þ)>¡ó1Ÿ‰˜øÝ)àù¨_®OÞ–¤¼¾Ëx¿ *¼mΟÏÿ½~Öçïíµ|îFµ¼—Jµ‚å§³Ui]?í•>›Óe½÷ßm-zR(øä#zÒݱw>ÃwàÚTAŒö!~m¶Éy(UýHr# Òð# Þà/ðIçO$ üN`𸺠õ¯ÍBÂ4¿¬wÕ|x‡ù†ªðày˜/…W]ã/ŧ  õ >Á Îcá^ãÛøÈ)ð™FƒgÊp¼£˜z͇œ ×U“ \4xø“Oò|ž*Ê'>oW Bk3ðÞáÑ(މ¥^>ÓœêŒÒö™ÛµIhÍjF€d1¿‚{-{ Œ¨«—äæ•Þ¹yvnŽõE¼øj¬Ÿg;õîx¶Á¼”PÕÄÌH <Þ7L²øBc’…+À—æ%ù¯.nŸ÷IjÚ°ï»Ñe¯ÀwFýˆwR;ô$›§–ñIã'Ø» ½ü¦@+Pð å/8qñ3nø¤»6BÇ‚G Ì7i \‚÷ ‹èh ˆ;ŸØÑ¥÷ °ûˆ„,Ê”Ö_'>|tø¶gÙìºg´+Ûl[ ˆBl{ðœ7'ÉD>`|Ó BZ” XâÑd÷óõùbКøÍÇÑ|Š5cqK¬€‰¿.>Ê\B:Ô+ïô¶‚é^šñ$pm>xÄDñœG (85$íUWžJq½ix«esS(Å–Wº ߯ø?`É ¬’Åuõ'´ë‘ÑlÕ}O1øŸn{‘˜½à ,š±¤ñÁ¦áòŠõÂ`g¶6`›Œ*¦®ƒ(ÓûSDŒßïù|ÙE)ŸÊ!tÎqv éá~ŠÅ+‡˜SN¹”2x ërr1˜9Sž¼Í9_Ð*ãfï¡“‚a/ê4 ˜Ñ¼gAÕa›FyŒæŽU“¡‘FÀ¥¨ŒpG0tÎhtËSó3z[b^öò:£DGí6&O+Õxò4@$‹ï(Љ) ß ¿~&Fîà5Fˆ¨å¶ˆ¤ÝË[Þ…¹faüþŒ‘|ŒF þuä¨*µ Ò R•+̨ۧ])T§ªVn)†UΗ÷ùeV¦™ÛâN YÊŒæs”R"êy?—ZD™[M®Zܧc’Á›Oà\a®|éü`YT€‰ž‹XV`„¯¬Œ'ñ‹Üœ†£9™ÒXµœæ1#ñÝ´gÒ}8®È€5"m\Æ”bãZ9\§€ëU˜Rl¼\‘A”áÚ\Kƒëo¨‚x\cHT~*#‰êC¦Æ00.tÃÕ<ð{pÞÚ¼Y™@J ÌC@3("׿ƒ÷ ו1•`SÀT… R‰òIL;NNpØÀ™bNŽG#èˬCŽ@º¦(žàH ‡ÅgJ}éT--“šåúún¬fíj ÇÅÌxwb&ª‡vE"ôdW$Š]‘؉Õ+˜è žÜK x[ôØ»€­@XÀC¶˜ï^õ.Æw1¾‹ñ]Œo[Œãï! ¿}MѯoK%@­Zt4 ¯® +’«5Í´&€ŸtÐl°Æñnb s²»b 6bðªñÄòσ¯z®ïY\_6p&'¢-û —+°T} žÂMÁ)©f J¦Æ,2UÏ S»|)C¦$Kê™$žåqtÀ¨\éiYË”U©¿;7vçFx´Ý¹±;7ÂgН–Òð„s#cwå$Y¬å{·ñÙøyȯ*ži&²ë"».²ë"».’[‘ÍŠX½ŽPéÞKEyá×âÿÍ´Yö™~>p;gÚÆê™Ž5»b°+»b°+ÙƒÅó,Ö¯L¸R0o3Ó‡7}.Ã}xû¶ 5\PåŽíµu§ö“Ž¿ßþÝœ\»¿Uuþ£VêúÓR«òtýö¢ÿɯ‡Êž”j´sêö[æas?GûûÝ¿ëókGïm[ùs´?ißy\Éù·ÜÃ(îqŽ¿>ü!mȵ.{Ã5×Uy! Ÿ•I!30Aâ··À ’Ñ•¯í©v8¡0øÓh9TP–rN‡êê´¤JïVY¨âÞ鿃ù=Tx,~GLÐÁöYN{ûA5¼`šÎÈ¢¯dêYH?倯WjÿÆxNáÀ-UdûçsqYJ.G  âÏ…oä›§¥• uák\%lTÉ{,ÔºñeÓø,ÄþÁýÒÒ™ÓÖ—¹ØUD8]dƒµ'vVïûÖÃçæëab渳æ¸+ÇÌqWû¦rû“9~þ-ó0йŸãfŽ;3fŽ·j¨?‡šãçßr£¸Ç92˜ãÍÍLaŽ'ví(í„l 0ãíÂîQÑ6ñ²<6Pׄ¹/~‡ñºÔq-çѕݜŵ©bA„sÖñŽÚÔ¼½÷^šée2™/åPÆx›õ¾ºð‰'‹}«»\¦;š]¥c@É%Ëö˜Ú›v7ÿQ!§OH»ù/U36ð3Z%£5 &†rf5OI}·Ê'ñ ÖR E†(•ƒàÂYbX£Ì´×”KÖJ ΔʶŸò« rUñPAå*5RAå*ãU7âWP]~Ë<Œbîçè+¨\ÙŒTP¹Òùs´?ñ+¨.¿åFqs¤¯ r7höl€&Ë—nó5Ï f$ì@0¡µ­f©r&Ùª¢ˆf0Ìg0N¦˜(p³™À ¾ ÌýÅ·4Âg¾ÉÄýIË!eºA+úEà ³óÃ'kΞÛAe¸,o‹é+UE ßßÀUwð#£é+ŒÄ J“è€ÆÖ¶Ãd­&‹±:s%¼&K™¡^ÔÚ“œT‰fZ§dÀ¾ð ¶e«íKÂO‡M ü[̅φÒ8_Ã?XZ("ÂÕ•8ð‡ƒ’8Ü“¡)åe6}ðmã7Ý“P"Cv€«¦ùGDûU¦G‚û 'ql›œÍ"š[›ð@ö5cÂáf\P~ç­¡–h0}$ÞŸ ™€èDzjºÞ˜$íX|ÓÜ@¡Å¼0¶jc¼•nm«•Ñþ^§ÕY²y¥¾™±I1ëJߨ’Ék¬Û/¾G†?ÿ{ˆ þé#2üõ'yÝo™‡QÌý×¼Æó¿‡ÈðçŸêÁ>2|÷[îa÷8Gê¼Æúñ‰O&&¸¾jY àêÝ´R°CpwlÕ½SÌO!§ð‡pJüŠ‹¿±VI¥tb ÏWª)ƒ••6Ì- g,LßA(&»9Ŧ¤LE4Ê“Zì$Q8SYørFnb–š¹}y·Õ(Àÿ@Æ1@q+¢þ ÀŽ·\‘¸ó]ã«°%쬅í´@%7¶Æ¯¿ó!5Cuuíí¡,¾‰Õi…:AÏüÏÖÁh8׾싩‘5ÇdY£Ò âŒêž‰SŽEŒ•ÁÈ¢C¢šõå‚È"Òù•ñ›ªÛ“ðÖ0§øP¦P³QSK匯ÏúÑʵ½@&½÷ÌáPã0Ë4Œÿ²å1þž\¸ ´&vÔ~’¢hu$t·Ò•ý¬Ø¬`P¿ðœîŠƒpŒùÓC»[•4ó­òv7CfÈõ@UÑO™‡5Yý£»] h¤ÄÑ|–´3l2*s'ÙàË«4Ú\3<ø– )–+$b XˆSÜlæº2Úa`žh‚”‚©)=ÉÄX«ŒÂK©ÜÅ ñ ?p­׎ï2xÕ2x²ǦúbFø´¿¨œ emÁFõMe<á˜Íe<ŸGHAÅìE[(2ªvŒ½¸RjHÂ:î5DÓfBáL›î€ÿ û¬pšóî}Òî¤Ö×¹SûSe½ÛØ7*šù"~p«9p|‰ºœ\fŽ"iÜŠÐ_æ‹  Eè›,›kOáäEt÷‘ñLœþó&ˆÚÔÔ,ʰ”Mó]®…r¨ˆÛŸI5hå”_LÙ“VÞYõ ÈÀ!rËù<¹):Ãw*¸»éûîªÁN­ÆRxÂ=“rÇj_¾ˆã'g\U·Y±ÍÀĬe{e©ø'» σ¿G¬™´ZÊÊ;‘|Qsw#äÅ¢æÛaiïÑãÓGˆ© b‰%ªh֜պ7Ó­mSI¹™0b˜¢…=ÎÊ¢ñd–pÞSZÔÐõàÖ°ŸDSY—våÏR6V‹`Uß_â#]1lØ6Û90%ÁÖ"¾ùjgjür>|`ø™-ÞZËΦѾ æo]€9Í7;l Ið®S ŒAòŒÒµ¸š¸ ™4Òå± ™d™-w HAyÑØÞæo¿XÓLRijI&÷+TÔ55ïÓÔüO«jïÓìõ¤G‚+kV0,çÚüÜh[Aؽú W§‹¾ð¹7ÍÝ~;|›è'êÁnœG[r‘Œ‰›ªMh˜­½Ö ÉŒÐp‘už8Î8ïØŒ iÜ‚ IJ`™@”«„߃ã_x4ÿÂ{€£\&õ­ÔN{çË€ ˆxK¨JJ¬7Ö8UPÆ40”E†l1aç×™§‡–µO·/¦¼MvƒFÀ´CFÖ¹ Rè¹cÊÆ(™Î€Ác ø5¡'k<ÀȈ{€ŸhÌá"ø ƒ[ʘð¹ÀHe£Ý™Àc2.EæyH·”¾dUùZµ„똪)\·ñ“îìªSx÷ÎøNƒÞéô¤–ÍÞ~·sfÛ“>ØÄØÌŸÑ;xf­á;Ì øÎ•nëSãü]û¥úŒž¡IÒHÉ„‹ÐU¿QÝæŽ`ªÎw0,f·Œã7Àõ!±xùÕ£Ž)ûÄó¤Kúdàé¢öÔÙtl£p.ÌXÓÉñmuUy_M"Èó‰…‹§¼WxÕŒ®“¢6W_J dýN<Þ÷—#S`!Â]IÕß1¿HwxY¸¢Äµ²@_Äy˜ˆ¸fÀ*aV-Ñv"Qa nfc8­TwÀ'oüQaض¯Û¬±'°A¡……­ -^ÖÁ`EnžˆßI¢¦ô.Z3_×{QY2Y (òÒ«è ËRégnP“¸ T«r¶TÑ¿@¾‰y-–7¸® ×Öa+ÏC¬ K/üNŽ\È—.›Á飼iv!9a|a²@Ù<Œ•”¶ŸO`âÕ6ýµXÙ‚,ÙL7ìì!8…C…irFé ̳›¨SÚDlùÆÍ3;éž«¼ÏÓxA¸žÚÌX‡±¸¢Ú¿x4 µléãy°®-9twÕE½ï Q‰LEÎ^$-Q¢¨s**Çé]ˆÁ#Z›:8Q·2ÕXT}`VQå±GISz;›á·+ª‰U+&mCá‰Îän;õ ËŽýü'pì¯Â9«É*ÙuJN§Œ;mwkÕ‚W-–f:ƒ4ͦ÷JÁµÈ…Öü¥xmÓ‹XÆéDZrYÕìM(-¹S¢¢Ò’;…RÕ9ÜmaÔh}Hl8Z Ñ?ÑhÜߨ¾åJ®”Nb‰Éz·©P+3_ECMLàÄX梡÷¡qá,• ´3eOd#QGK$~=³ÃË—Y #VÊ6ÅZ¼Åò¯­àH(øJc=É·‚DÏL¸|ë­AÙ(ƒ–ÉŠÞfýBÚÚÊ­,qC講‰tØÛTÅžŒ¿.o¼*T퉳\yþ‰ Bd ;’™AÁ’E¼Ë•؆çY¸kŠ.Jº÷Ò‰à;xž©dÚé¯wLŠàôOTfp¤™Ýœxò¨C?ƒ€-µw¾¯Ð‹[¹Úÿ*žsD;, vØä>omKÿ«W dÂS¨–:ºô¨ FUÞ·eó°‰äÏæzLÖÄ™ü¢ºëò=c6’ñ‹E@p¦@eLê"Uþ5iG”«p"W=!Ñ\BÅZöC§æòÝh AÊsÈX³²I‡˜Ì =,îhÍvÃpÄ2»˜A;ÁŠ;#%#Â|©Bõ7Kœ<+W@P%uÎvpíw‚tA-]X8ÔO06ª(-•,<ü#D\ Ѷ:1#üÉQ±–^™å´£KVÊ3­¨êÛLèèÙ\©Œé»¤8¬­GaÂno&'n¾ÒF½ÏþÊ*^ÍV_aM.n¬Ðw**±Õœ&¢83PîÊØKðÁw1ánméòFñ“ˆž X‰·n9ãsU—%¹(¬jã‹ÂÁ™Ë¥/É6Ú ¥3&pºcfa"Ù C5ãQÏë}i¼À`Ëĵ`ðIw0åI ûªøwº¾šcï4ð{Ó<ݤÛä‘'}Û‰˜yzíHµ£®­>5Ú{bàhݪmQó¥·º»ëf½£á™^/A}2ƒ‹ƒŸÀÑúº»‘yš‰½NJâ…OãÜ)xVªDtÄì~§ÛÃôþˆÚÜ®H¦Ê™]±_bPß#tå´hq¹ z³…ÛV¸ã"€ŒïƒÐc|²­לưåˆ}ÊÌ™”ùMh1ÅC’crCÖ\›ú’(1èn Ѧ;@ŒƒG´šŒJ È$©r*Âùp³‰òKÙô›<¤,U­¯ü4ž$mJ¢}I„? SÍüƒl€eSõÖ¯²]ˆäž Ô\2‹|TLêRí<ú‰AL]Æÿw¾[ÖNnŒãzòjxò—¼œŸ:8Ãv¹êþ'¿¾˜K®tYƒGVéóTã»’bÒ’D’7™Îê„C›(}„ô-8aâ•Âe%²é‹Œ\˜Ò&2¸^m³¡û"›`F…™d~¸;²ÖÞ[˜Èœ†Xþ‘ÿ\Q¨“æÁè»òºH²ò$¤,÷ÔÚç3‹W”3°vy×¹L÷l7(×áypî®h¡AîŸu”¹pš"Ê1èQ,šDór!þ/c+SY3?·‹ÊxÏÔíD6O_.iJ'v¶—œ¸èúYlZŒŠ¦ôöŠj)QŽð8Z ¥ ÃÉkÜ~BnhÓhMŠß!VÞpÔ¶ñNþEDí ú…©‰`LT U, X­NžRÕ>{et`&ÇècŒn³ï‘3îqGvhÁÈÎ&Xa1ipqÜ ¾ƒ1«°BÀ¹"°±ðÚ4±¶@u¢›V _;îV•ˆÀhø|6IU–Q@EUSܵH—ð ît4Õ3(Žâ1]õá'þWpwð^hß9|ëeù¾Y §HA‰yänyk…ûlá'øì1%aÞ™ AσeNà>·¯ÀÀ¥xèÚJø~br4ïi¹®&¿îé»L§ÜM£s1®#BÒaª pU¸;†ÐÊœ‹éŠù-¦^¼‚LšÕûy"«C,{âfÉZ›þ£˜ÇãÎÉØ-\e”‡Mù¢²-0æë²Ú%!–·W²`çû“ýIVyˆ½É2VŒû¬·2Ý3ú-ÕG]^M¶z—‹Ú`”§m÷ ïyò’O„eÛ”'Û°œÂ÷óìZ•ï¿ýïø£–AYúuêf$8¸ñ.@æT¨sNÝQßÒˆ®ø±Ä¹+OªGRM®_¤OW «á UÃ'æS÷N5º®`,ÕäšÇL%®Œ­íK÷¥(­×1Ø·%p±ªûôÁv¤Ž!.qŠÓÈg(<|§»î*êÓïšR±wþ{»â~åŸáÞá'4< Lê $v¼pïA„ §»+`è'@ŸÑ½Ïodi¡.Ì©ã#Dó›àBÕ]&Ø$³üzüzøã^;r endstream endobj 3875 0 obj 7852 endobj 3879 0 obj [191 /XYZ 38.2500000 173.750000 0] endobj 3880 0 obj [191 /XYZ 38.2500000 710 0] endobj 3881 0 obj [191 /XYZ 38.2500000 710 0] endobj 3882 0 obj [191 /XYZ 38.2500000 173.750000 0] endobj 3883 0 obj << /Type /Annot /Subtype /Link /Rect [162.750000 633.500000 240 640.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.microsoft.com/en-us/dotnet/framework/interop/default-marshaling-for-arrays) >> >> endobj 3884 0 obj << /Type /Annot /Subtype /Link /Rect [123.750000 124.250000 164.250000 131 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/fixed-statement) >> >> endobj 3878 0 obj << /Type /Page /Parent 2 0 R /Contents 3885 0 R /Resources 3887 0 R /Annots 3888 0 R /MediaBox [0 0 595 842] >> endobj 3887 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 3888 0 obj [ 3883 0 R 3884 0 R ] endobj 3885 0 obj << /Length 3886 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤ž@ÀcäÀ°‚‚Ýl‚Åz'‡üý¨[RÏ´Ô_IüºH©{#ghñQ¬w«ÞýñËß÷ÿüïþ݇/ÿÞÿØÿüðe—ª"ëþ³?þùáõ/l}èÿ¾¯êbÿã·Ý÷ý÷ÝçÝçö¿ïº¾|øsû·ÿííþOíÙÿõoí/êÿÑñ|ÛU¦jþzúÙT¦ý[vþyüý¿vùÝþ·ãŒÃrýf.ÿÿ¦.òÒ·1³ô÷ÝpLsúóßÛ½ëà·Š«²ÆÚ½É]¾7Mn÷ÿùÇîçvaúìÐäÆTe^e·,TÙãJuVìmÚ™œ›,tú£4}€ÉW…›ü´su¨×þg׼ܿ›€Lþçéõ'7&s1ç4¯6T†Ëų+^®qMÓ¨¨€ÿ<{ˆ»Í‹p\¡Û¹6Pú«Å“kÞl‘UÉöÕô&/m@žpÚy(²f׼ܲýqPS„ÿ0{ðWeqŽ;×ÊpµprÍ›­]P²­j;¦)’íiçÁÈÏ®x¹6Ël8iû2{ðÛ¬¨N~Üy i‹'×¼ÙVÓ H¶¯¦0¹µá”änç¡ÈV˜]órmU„“¶/³‡¿+ÃiàÝÎI[<¹æÍæÖ„$Û—éL^=;¡&?í<ÙâÙ5/·DVi[…ˆµ x·§‡’¶ãÉ?ûL‚wÒý¸M¿ >}ݽûÔòÀrÿõçvcÝ‚§_¿íòöÿ]--“üúÓþ÷Yfìö_ÙÕ‡ºÉJ[œö×d19üæÃi$?ä®óLŸGlF²Îö|)®E…ëd9ÜA×Á0èÖyþÚÞêmbò£à¾z'¦å ——â>–m§ÝdS\ù@ŒÀÙì{4bàl=€¯­Ãœ§žQ¸D%¶µ.oD@8ˆ<¦ƒaýò üOÍiĸÕ_Fü¦ƒ;´¼¤®–ásîà1âR” -ä7&ƒë:æiùµ ÆlE8`½ü˜ÃFà|P•nDd¶[Ó˜Þ d¾1f%L–3†&¹Ém|OŠ*˜ng/÷$+>úŠ™A…-F‚gQ¢IWÐm%KõÚ: ï "6us†…´8Ì_ÆìX@~ 6†Mââ„7ÌÈð>ŒÖø’Fƒ9)£ƒ1: Á8™”J†(M ŽàÙzÃj‰¸2’‰Í29Ñ g×åßÂIÞP\šÖô† ßÇ÷й-„·®Êì`ËçapNÈ@ÆëzFïÐö;iï±)ÙØ+Âè3[v^<ºN"¬ãaRÝÞÙSt]SÅVû_\Ò#½ÒPpP%Ä ¥¥b<“‰²E»‚Ì®Ì7mwºq|!‘´¶< ×¾YîBcØï”²\xÙJ˜)”'Ð3|~oÂñÓ^_WØÍÆâÓ—?_ÔÕ£’Íñ½ =1åæÄª–GüAQ (5Ë&_,5#O0@²`tù嚣byp}ÊÿG¼—öaر8á¬\ÿ•¼n½]}'YçZÖyXþ@ù~`jÆ–1emÇzHÛÒv,&“Ï^DZ¥›8~ÚpÃÓó)7áÝqö8Êosý¨B,Mc"ýIÆ·jûTd’®+n·nÙ:׌™ÓròÃþ¦i <Ì ™¼Y HÕœr¥0ÂÍnF (YkkG’uƒºH²ÏWä—É>¿}½¡„¾dz/IBy0[\E3ax¥G¨–ý„ô7;WŒDìfŒ¢îÄöð7èa¹ÃúžðÑ'‰ yZ÷é‰H.ÂMªåÄ»íhêòÃûO¦‰•G¬"âu0ǘ8ÿ‰;—¹×AˆP|¿1céŸNt™m$úHîå;±å§Èdú°IdÀ2Õ" ºÙŒ>¹ÊžÓÕKˆIuæCmÊj\Åh}Ù‡„ußÜGjDv_o£"9Ó#§$âÉOÝôsáõh/>ìb̵ã‚…©FâRY—Ó}?±ÚÛØÕQ;ù¹8!å“ ŽeSný™­òáaNùxbi>ØGOàãU¿¡ äAFßUÁ¡œ_ˆrûoc‚&Êš±ŒÅXâ¡ná„ ¦Â¦®CÈÃ]¾¼·k¬˜œÌØ^.6ÿ¦çŠ•£b%…Á©¸6ÇWÝøŸ•©§J%Tj<ùVî-#> ëUõ«é*ýS²¢T´fŒ®ÔE0Q\'Y%ŸÍƒ¨™ÌŒ—I¯Á$޲´J&ý£˜ô ™£‡ Òn8A½ aœ£ÞÎ’•wªj¬cGRŽMDÑBåíëô ˜‡pt1/¢=]]V1 +Ì{_Ò½-î¹¶O,¼mçl>èŸ0©A9~¯Zn1Vó† Xaë×HÒ-Ÿ™¤”b/ÝZAÊöó`c[‰BžøÙk†e.V÷›EœÎx”€(ê«ú^ Ð*ÖŠU;Y«¡X,$V>šmØFunï(ÇL)çH'ü/Ç ¿íвxý‹_w_-"Œúq܈(u½*5B™0j$ñ‰i>3!!ßs°lIÜ'n¾0âþ.šÃi7WˆÕoÎfßÃoj4bà:=€½fëe¦×®…“:8RÁ‘&´œ-J3¾_&ã›qw2OT:lL$/mnÅFöR:°Þ&(7Ô¡âE5]èx¼±ÃÐM;Ð=Ïúñ=êNU!Êàõ„ö˜ ªö^ÇûÉx@ÛňÇâg"Ìkû¼ìùWvËû_æ5„‡ÉÂЖJ‡è2¢Û*bŸb*Æ ú´ª?Â#¥Q9$VMÌ{JyZ¿“‡òCÌ0 |‹f!GóiUÍ,Øïê±}®VýK0D«N†æÎZ¶Ûžfì©k–#´ÁzZ¿6ÛG4‚mל±‘U­g‡íj 7h» ë`{ß¾Së?ÛÕîX ÂëÐs¨mbüF …õïÎFyk tðÍá¤;•ÖfÃ^;¼¾ȯ1?pp×.¸o®×òººÇ•ÆïkÍQ©<øF ÔMtœ¨úXUÂnJ¬£i¼¼"¶ p ²“^W¼DÑê…h<À\ßTJqT‰&?Žz×^Ðâ›Q¬»"?¯úIS+¢p¬ï ¶"Ô=°ö“c{,EZcGZñýÄÁÿªžÇ |n<‚ñ[@ë[ ð›Á{„#î-ÇT 1)Ç0ÀçÁVãËJ^”-XÜjþä|ãÜ{8ñ ‘Îð®°a޲i¾‘Õµ^·1å©"ˆºnÄÕx^~¦JºG;t嚥vÔû'ªXù„t˜!ÌKìõ«¯DjÝÌ ¸iÖnYö"›H¯8þwêcr×kn°6¥2Ÿ^=cŸ:©GˆŸ‰LÊL¬.±*-§tÉtËø­ó‚C%£ïžxÈÃT/`ÁÈm”°íâÜHö¹i~í†0T™ÂëëÀ‡£R«‹^y1>`A ÜJ˜*@T  ´I\àƒ(Ÿ©«3]îi϶åEÉ|,ÔQ5à`^ ÚT³WÆ”½Q±UŒý¼€Èé%Å^˜<ºõ™p¤þê7ÜOÈ–uE9¢©ÀOgÓ“VQ6<ú“ÖX5ñ£å2—¬X{dËúÜõ§á ¢RÉ$hâ'^Rq@?À!ž´*‡ qâ$—â'ÇL**Šâ” |R| 7]Xã4‘$q‡ÙtË$÷âàup †¦FœJ„ñIY"RH0îàôüÈþNÓ¶t+T“…䜂©‘JZ'vmq² ‘¶…¹K¬R¸@CJ‘OŠw€ŸîFLñ©_z¦G5ÑÕPRBUÇÁ<-=G6Ìk}%ÙpɆ©1ÙpoɆcî‡JZOÜ%q—Ä]ÞwqXÛ`lRÝ2øá±¬qá’MŽbÚÆ¼φa@x¯°¶ŽKP <S Ár\ —ï[ß*˜³ÿ½h{ýGÞN×áf ZC‰âQi²zVi$¤‘{I•dó$›'Ù<çÙˆÂïBä9ùZßI|'ñÙûI¾–äk™á‰É×’|-2D1Üæ4”8[ÍB$¤‘4ò˜#±Š]Fó`C¹»ö M«Só¿ˆz?Úó)Îå$öæñ2¹h¢ºhò"¿ SõÅTmF<¦*ho¨ ZêI˜zÎÈ’Ô“0õ$”ïçÍ8 6Þ“ÐæÕšÂw=¯¾K} SÐQŸ?¥>†Éîc¹X²ûÞ’Ý—úf‰»$î’¸Kî’zz$¾“øNâ;‘ùNêé!½J==D*I==ROG7Þ?Õæ…UI#iä­$ïo²“’”ì¤[î'yawIÜ%q—÷“¼¿‰ï$¾“øNd¾“¼¿Éû;Ó÷7yeˆn»£³-Œ™…HI#i$„áÞësâu»@×{Ó\cжìtufÐ}OµìÐW|B8Ò+ÅÁŽ+2ö‰â^ßô†øµoôM¯Zšâн5›…çéÔcøQõzü…ßdp×½Ayíxa×êU7yÎGðyžà:ÿ-¼êÇ7†(œ­¯Ÿ ÖÂ-À½õá®íØ0Ÿ'|½Š2k.ù”_³¦*…FK=¡8çdz¦%9ná€g»¡¡:î \…ߤ.”T+Ë>HgÅ vW¾'¦ QÍW¥ÚË–ß =+ñÞÞkÜ:æ€k‡”PE=Q3ÄÈâÑâ Ÿ>D§Þ·HÊí³á–„¾³ð’ÄX_œåÄÞ˜âôíÁ(íiõ*f±´&†û2Ä­þÜ5U÷Ÿ!(ˆoaê´ÅiÖ²‘»scÉšHv­-bõ!n›)؈áöÇagþfHpã>‘x„ѱ…景=䦪.ɘ«µËQÆUÌpËåš Uý}êuÀ»ÇI=\uhñ2¸m=O7sÜ8à6K;Þæ„ˆñM@¬œº œ€ 3š à]$Ì$e¿a½b"¶Ÿ|É ˜¾§+þ Û{ ÂŽ$E`MßÏÓ6SVÖ‚̱â‘M¹ð0 'ÓZP5ËCd0>^Ɖ= |.èæ IªngÊ1E8™”…ppQ[ÙZCÔ2©®'7¬ÄSÎHÀ61¶U'š ÊT©@°oqp‘Ȱx¸ _¤D55±Pİf`ÀpêG»í{ñ†ÈO‹à‘¨‡¢Á9LoSV#T½:î Ý e«DB=êE‰‡Ÿf+Ñ¥m½&sA<ÝoQñpËùˆìtܼ-Oæñ/e:¹Ï98Î<´»M3½Í㥜î¤uûý·+íë_üºû"pÙ0ìÙ i–gD‰æžå'ÄëÏ„‚‹å>cl3 {,eˆ…“Ñõk{dúÏ=ý ¯ûTf0Ø‘B*¤X*À?o+ûÙ²[0i3(*N0&íY7k #çXô d•<ülCµn…à Yî\Vë¿À#«?`ä¨Ï…m0—!­¯¡˜Í6ÔÏ‚R!d²±±#¹¦ó$Öµj¼#6«’~ŸO>î ;'ÐkôX¹îʼcfŒiÝœ€1P¢½ºx#ÔêmŒñaª&!Ê>ãb⮃ ·+GÇ'…»qYîL­Ô'NJ.Šñ3öQ׎a*)€”›Rט!ü+Ñj鯶=p˜ÌŸí=á¥|ZL€jÕ'ߺàPdŠ;0!´‘Ÿ<œ¿ÍU†o*^Ng°#9Øm÷¡)°‡¢< ..'×ÏÜÜDVQÕx{XXGC¿Å®„õ\Â^¨­Pç"V«k+=z$JdÔ ü»ãðPÖùX2*£‡g—@ﳋX ³óˆ{ªfh!ôNÃ}Ýpïܧw¾°ã`«°Sƒè‡'¬ƒ ‘:¨XìÔ pGè¶I¸|p‡´ `Ó#tý;…³éöËzÛÁ¤;•ÖfÃ.S¼Óu÷†ŒÐiÆÎ¯óò¦8dãþ2ŒBO<°`²t„uˆ´VÝâÐTÃÆI8yqÇ$ØÝe&AyޤܣFåÂn(ï­o¤Š…0!]Æ"_îX`/•«ÖkÔEˆ–t°¢‰^¸±ôº¯ô¹-œƒëµÞþÙo¯M¼ÕÏsÿ`Áµ×Wóì[~•™cfÁÞæÃv ¢uÜ\Öìµ½}êOŠÞ|aA“Y( åô€=aå Ëÿ+Ç0x6øMOÆëè¯ê±wü{»ãaçÏvx¢€…7QÀ|‚ÈŽáag$4XÞ;`ðGÀÆgD¢¯ëÁ³¸PeîÐó‘ ¤ÀÉPp£æ‚£ÎqÓýçÝÿRäô´ endstream endobj 3886 0 obj 6508 endobj 3890 0 obj [192 /XYZ 32.2500000 508.250000 0] endobj 3891 0 obj [192 /XYZ 31.5000000 509 0] endobj 3892 0 obj << /Type /Annot /Subtype /Link /Rect [379.500000 474.500000 443.250000 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_exception_specifications >> endobj 3893 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 467 522 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 3889 0 obj << /Type /Page /Parent 2 0 R /Contents 3894 0 R /Resources 3896 0 R /Annots 3897 0 R /MediaBox [0 0 595 842] >> endobj 3896 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3897 0 obj [ 3892 0 R 3893 0 R ] endobj 3894 0 obj << /Length 3895 0 R /Filter /FlateDecode >> stream xœí]Ën$¹•Ýë+rm ³ƒd<Á]¥’Y P¨¼0¼0Úã1 ÛpóûÎTF¦$FFðä%ãu[è’J¬Œ /ïûùóo¿ýñð¿ÿ:üüùÛ?¿öß?{*ŽMU\þ;œ¿~zÿ ÛûŸM[~ýûÓç¯O_Oþxº|àÛçÿ>ýôÿ{ø¯Óÿ=üþ§_þ©ÿGçð÷§Æ4§ï{ýÞ5æôSqû~þý_ž~÷›Ã?ÎO¼¾®ßÌÇ¿ÿdÚºtö¼‘WÿxºÓ¼~ýë×<ý|@Ü[\cO;˜ÒþèJ{ø¿ÿyúóé×ÇÇ®4¦©Ë¦xäE½½Év'X׃÷¼~É<Ý$xxçºtݹ4PŒ«Mðá’7Ûu¦)S@ÿöxù‡;S¤Ä›î•@…¡r½[ütÁËuæ }kÛðOy¹¥ibÎ+ø¥¡Ò_nàé’—[U:žüöôà¯Ú"áÃÏ;OÄ“ñÃmÝÿ&_Ýžß[Ÿ¥ü™$’Êù²¨¯DW _ôðÕ¼{|‚‡[“NÐ_v.•«O—¼\ÛôìÚu] ø7é¤AY× /÷uçâP¹^îàé_cž‚·rù 04~>øéûÓÏ/'frf}øþçÓæ.ï|ýöý”êðÓYýìšÃ÷?þ£(Ü˾ÿõ©;Ö¶ºnñ²b;´R´på­˜~ÆÂW>Á÷4ñ{£ž¡càÓŸÁÐù ¦Œ‡ý­”xÌÊ—ø8¸‚o®pñïÁp+ñð{àÞ¾mHw0âóà½LÛxÞ)¦ŒñÖîrÒ/ßOl65‡ìΫï¡(ðÖ¼²,.¯< “5űnLÛTïÀvA·öØvÅ+|¦¬\.Ϋ²>?ì@/ ¶õé¶<–îâŽ{[)ÑJw^Üsö{+ð=~†9z™ÕÑÙÖ|\©EŸV!ãó`ˆ2pÃO\rà€ø—‡w=ûCÖ³’Çðßà’±8€Cp?-‚€äCl6pëS€dHÒÇ®òK6¹á [ŽjÖ=ÊØ€6Ž5xB¯År™ÒŽ fKw hÉð=”åƒmP«,‹¤¿Ÿ<ø_ÛqüÇÁçÆ+ÿ MŸ¡MlÁâ÷¸ ~>­Â¸Œïò€bRIXޱzE!j1eà÷À]cÞ‰©6`‰akg~ëú9#who&ŽråËàØÿÈHnŒU„tKÜ!ìýpÆ].îrc®Öô۰ɇ-hš÷L£õï!¹EIùrٴجb ƒáhà‹~> ¶vËøØî Ÿ_ >éÄŒoMÔ9 ìóÂØ/¹t…a_a!Jɲ×O@'ÛI·à­L(«¢ó„b€¦"8©;ÎäCˆçï³Pí Î…i »h1 H·!¤¥½\ÂHT”½wqxïí“@¸Yû"pÙ¹ Ÿ†åv€«À+ÅQ9†¡2/ƒÎè²ø€£‹¢µÉf»LˆÜFpØÀ•anÉèíþ–d±•Qµ0¦¨s¼%›`¢–E†˜ùâûÉ$‘dã‹ûÁ%l>JŸß°& CqÅ“@„J9gTÙÞ¢ÊØÃðZkŽšpŽZÖ„×:àgÆŸ…µ#"dÏ=Î.ÐÌT*3Õáø–hüD6ê£q×àbŽ”)þ(|ÛG[ôm4ü4œ …߃ïW`À8Bßé£Íy4³Ò= ™Q+„D¶øiXÇ!¤8–Sóc9•„qSæ\L¾æªði%†5Öu‰:#•âA|#pTaÍÁzñRâ–«RB¥Ä&¥„jÿù¤„Âz›Râ–KJä<+I:ÙˆóX:¨[¼DÆz@7+àg ¥ZüÜÅî­ÄŸÁ2èÕ Þàþðã½áx´€ßƒ) Ó)Ä^¦PØ›…ubüÆ aÀèƒX:ªæ«þš'~oåbÊÅ”‹eæbjSŽs±]W-b§#5!euS+.ìÁØkªòXgî÷’óì§ÊŠpÁqô@UŸh­=“D?,»#ʹæÇÕ@á4¾J‰®˜…x‡‹xå=²ý0ÛIÛcÑ-§“BDád î‡ÀÙô…çeç<é¥EÉZ”&j-J–AëUugèã½Õ•'é;˜± *‘ „ÇÇÀ› 0¦Ž‘¹˜°"€CÉÉVppz®ÀC +¡„íZ_Â2*ƒ0;`¬3‡÷†±sz˜UE´AL¶áÌ®™6tX®a¼›]~:8á§1uù˜cK¨5Ùº–”íÕ‘˜7ou@R 6îæ¿fÆÆx¶3$Oo…­¹%™V+1ÆfÚÞBkÇÔƒ=¥¢m@6ç›#,ðÀ®™É8˜öòrø¤kO8ªW&J}ÙœWïú—é– †91¶‹á†îÞàìÚÙ:eºŒ».»ˆF¸Ãxám¶ÒD[¦2nýêÀÀBnDkf™f¾+“¬æ„b¾hÝÏL²ÙZagÌÌ©n9c¸³fðKÈàÇ9ÐL×=¢K5):SE5™¨ðøÃì ÐÃéˆw€ßƒû‰aè`jÄu°ߘz[¢ ã®]ÂSWZs,Zó…«„)¾ƒ«èpý0®CÊ4½ ÷‚Àc>O¦Y•j#­ïïÒO™±6 ºeϯ³³ð:{ôRRBTÇÁÖÕå¾úwï3úL½¦xÄ{…-êi=êŒMï=å3\yA+½alÊë«ßÎqA¬æØµ>$Úmϲï=­€+bH2’”W7–ÇX¥VR–ãÉ^pk8_XxbÐükD:N Y4ý«âwÞÓÓ}\üçšúïˆjÄf2o¾6o™IXø1“ÁŸ¹ª¼Î¯gÇ+¥T–ÆXü3ŽW„¢½4Õ±è<á…Ù‹›;åÿ™SÄAä£lá”Iy¥ñ„c€ÞšzâüjçNêâI²ùéEŒA¦D3G—¿>¿+ERTAˆH‰[—‚ 1§=€¼Œê?›!ïi*ÊâЮó#o˜ÔµˆLQQ–Ç´ÔÉfßÈjº[el"º=A÷ÙJ—,ã±$ÏUGZ·×†¥:R v‚S%, 5DÔž%,2¦f)´Ë„Øj‹ÎCWW*®T\-D\¥.´š­EàFc&TŸÑÚ¯Å0Ï„B«n­/´öÇ–RD*!e»kM×PŽD³%,™Öc1]ž&B¾'Zóh/¿™Dí&ÂýãÚ÷-UjÄ»|Eä4Cä<ãØźâxþü9;©hßÿæoOßÒ*˜{݃‡ùDàÖ]“ ?çÑ’èÜœÀ˜rݱ‚ý´®£bxcÆÜ8/xŲÌÀðÑci0¼w6Å­f¼O<,ÖoÒº•wü6NyHw½ ëÞÿb¾lwK2Ú—ˆ—Q”×È:Xü g–D´Z\]S@Q¡­ZÇQŒkà¨wfRîu0ÖS!¡ÁUåd fzÜÍ?…Êðƒn ³V4rc”‹6eNœ€9"Ö~ÔÈM(J“H/¯&w <ò&”'‹Ø“Ù EÑ4–ºÂT7Þºœö FÊ òùÓó×h¦li­ñ¥¡Q +Û#µpœÝ?™«JwÂ~þál)4ý¤ÓÆ\íKÇýÌÚ?–K*щ‚ÅVo:@·Æå“T|W­g·$ÎúÈœõlk(=ÖÓIŒº7#¯Ï‹1]í¡Å0EÇ\2±Ãn»€ ]©¸H3ÑLî?Ê©Ãø¦O!§’¡d1e/úÆb u¥òè"œÙ³këÂ+s‘–?ù¯îìtµ‰qcËr¯¥ØÖ{bIë´xD2g"œ˜¸±7†RD’ˆh>D6)-QÔ—+I$Æ/Baj7˜{ZYKIcêÒ·Á6Êc©~L¢IMÀçnn4@”ÞãÕf¹ºf+áÙ[¦Ãc*Žp>Œp¬DœK4ßI¶Ùs ”}̦Ošcî3 ìÕÍ]fÀ ås]r´E¤®&íôæÄÌ ,Ù en'΢ 2YñÌÀˆ¾‡Êx‰è[a 3ÉŸ¹”¥é'¤0™óéE`Û÷}'§ç2Æ:£xÞ³Ÿ—D,$0m2õÃcâ¹sM^ñ„3E¯Âª}D÷£wEØšn“Ľ“jò”®VWY_&¦x›Áf±ËÖÒBT"T´öyÝhͪä_*]~þÒù$-@XKŸ­Þº­ª+‡€©;£I$n-Ñl]a›.¡²£\]Ýqm¶L±ÙK¢¶HåÙ{-À^J·¹w•x®Èt7ª¥QódÔV¼e²m°WÙÝ}ÑLIßë`(å…cê:Ħ´¨ µ+}Ríà>Ÿ‘¢ÙcØ=ô©;3d” Ÿ†?cñ^à{¾ÀÏ`|†wõ î¿ç%5+nëοßéZ{ÀÁ…ý©LCc¢““LtzLÕKx3]m¼›¡xi¡ºC36#CÒxŸ·oL`æŽ)„ŠÇä_ÐJò¸19®|†+p€NOåIs|ËÚ§œ\O‹É¸YCƒ/&+(P¯ŠÉI«$üÑ^DÛeR[z\”M±U¶ “âÅÔ<ˆŒ§ÉwÝÔÊ4™+cY8˜ \kr´8˜F¼5×È‚ÒßeÓú—',©Î÷ØŒw0Æ4“6š´ž„ Ì>‘͇ÏT[¶€j0­Ÿr·)¢çéí8UDTÙ¥""ÓÅ<vÍèž5EÝøV,õ‘"¬¢(¿(bbû¹s•-òƒá„Þ³èá?Ù’»rëJö™ãh·‹Äáã<@ß‚Ôà Œ§ƒéùݽƒé•–{Ÿ{ Äz`L)»ÆÐ©áÓ tJâi8f¸q ÄÕð-À§Ù®à`¸Á[ÄüplFö0 ÜK_ÃÑ¢}£Ì$é[iÙKY*{Qö¢ìÜÆ¼áfqê³$`èÌÉ.[Ûúœ†©î3”«cѹÊ^¶¦QËË’mÈ&k‰lÅ,Èàö茫1¦/}â6;i %1Q«0€–¬3|þÈãÚÛXë¹@¤PËe+쇭š˜çct›ÞÔ™r Lß{„Çæ®)2¸"›'mQzH3CG4º–Zún£vž’ !‰#>ƲˆˆT®‰± ÈìÉÓÖÊAˆ®Y¿M(6[ŠÍm4mpÆÊ›žiÁ ¿l‰6ÕT³°–˜…µ;~¹’|ÊÙ¦q¦Uš©i1Y ¥ôäÚÚwŠÈ:…æ,C73¸ œ¥³+#º1•|ÂNÙ–²â‰iɈ1›ç‡ïT —‡L$ÀÌóJÿ®¶‘L&3 ¶JÊ–¬$[»¡‘')ßK’džÔÚÔ¾|ÛXho³¡°ÌùWª÷Ⱥk! 3[ÁcŒ¹ï3¸“ìš{µƒ$hÉ``ÊR×ø¸>[Ú¸¬&–v"U¥®ŠÍ*›\}f„3ïÒŽNZŒ KÛ(®ªZê”0䘬|É‘ÁÚyïÔ‘~R”/!/8·›˜‡êðR(£n ™ pÂéÉrÂÊëútcŒõÅì›Éô( ô…=WM†q¤ÍÀ³‘ c^îF­yÀ;™¸™tŽÝÍDx¡ŽmÓgÑxðˆ©^©œ'Ê)ÅÊOˆ£ò߉͈‘h)˜$y"¥²oÞþÁrÍaÒ™&ˆ%›g®¦Bjçõõ‘Ô~KűnÌÄöo‰'¥SŽÛÙ#ª‰3b×Åö²LÙç®î|±¹…`è6lùöÚ»¡Ó8C»ÒN6/Ôl¾G7P0jƒÈÖN-}±0ÖA¥4ÓYŠ©>‰è³#Âzù¢§ÄÎRkŒºi>¤i§ûiDBŠŒ¶JØ’Ù{aøqÉäyåIcN©8-Ê,_J5Ðl1£K©Ð»;߯³—ô{LWqÖZÿ^ø¼¿¦õ–HÓ$jHu•’sö„0, ±Ää­ª½ªöªÚ«MQûÒ`׿jÓ8 ž/:UB ZÆ ±¨Ô¡ú!i†½fÁt/›«È”6ˆ"ÝX©¯´¡u™yJóOp›×˜±…ñôÖDd(< ùa ÉbàHwMGÔã½L#h‚Œ&¼k (ܱAWOÆ#ûT"f(¾ø4F À ÞBÀDfÔ%wàÄV‘䨊ΣÌÌ ì••2e<Êxî߯¼áf±ðY0tæd¤óupFS\Õˆ™ÕcVsbÇÊE>˜Â|o,à ¾d”ïv‚Ó]Ñ]y`…âX—"ljo¢ò=°¬iBAP†:l'‰eÑN9UûÀ=ªM©Úòˆ¶¬6åŽ,†ýøj•êCø¦¿ZŒW›?¯Íß4£çÖ]Ñ]Ñ•eú0¤}9%eW/ûtEWtEWÖ°¢’’””Ø·ÀøJðg°eσoy¶„3Ä(FÊ…luMzËU.D Ç ‚ƒüÃ>ž¨`brý™Ýø%†AÉÔU2ƒ " °`}"Ué1¬C6Õpp³½‡÷NëTL¦ûÃSÕ=(_­ÓÇd[𨵠óâÑgmRW”£ÚÅu?Á>}Ÿm°ž‡õI"ª@E/°†ñ)ã=Z÷ˆî­±À."dXÃÆ+°£“W"›¿ÂØSû‰”æôºò6‰]é9=ãŒIL‡/Â’ÎGSªMAµµ§M¥ZŽj‰lÈ@n%“A‰5Ê*^w®ˆÎRLg@¥ô$”ÞN g¥t.÷Ÿ”È„eú´H› ïS:Ær Q¦ )¾mÌÓ”o¤à]§|cA|# !à½<æO|U¼&†©ôœ€žKs­>RzVzK{Æ[NÅãÕó·fŽâʧWŽÂq¬£+–§Àòê¡\XÅò¾X¸ƒ€õŠ¥¦ l‰2‘\BR1^‚6•$á§ïÊIºÙ=XŽ©©Äµx×:Ø÷®ôœ„ž»k.‘Òs>zÆ/%Q al*•R`& ¬Œf%£@¬Uc.ã§%¤ãF©)͸k¦•#r<•f‚4³M¼Œº…\]Grö\«šqøjÖx±ø¬ñªÕht*Þ·µ¾J;âå5öºÐø±Rà4,Ïæ×WJOAéVãºJéÓ°|~ï½æŸ† ºb.T^ãîêíá²z;B»5~»%ïÍH7šæ6‚êã!:ä½¼ rT#™l㟧7ô`ºÑ0édZÙbÚÊÃ-!6­ Blz£b4%koGrdßÙøïô5b2!F=Šm“ˆH¶]Í‘p¿&¼%ÙîED—$í«õnE´¯ÖÌ»)­G½*“T&Éêè„™š¾¥è˜™–´ºÆ?øË^9Ñü}­!n°8#7³%'›ú¾†"¥ß/¿!nJô1×î¯ÅCý2©þœp÷È2cg×E{d¿£qÊùÏÇ|gÖŒ`Ýjiz»ñÄ7‘Ê™„'¨F#À‰ã뼪ÑÜãDØ´ÆyOðñöe:£ËÁLN°T£!]H±ð&PX<3DÁÌÏÞÆ¡²c›¿˜8 cyôå ä¿ ›Äm©FÉÄpCm&ËåÝÙ)oíÀÅ#a–ÄX=Lfÿ€Çw…•ÆO9᜙,Fg1fð-7õ8eLG8ÙH%9ç_€aern5F’ØØÉ¥U aN~¹bŽïãR§¯Ã“ò¯cÿ`“iïº2;æìÂ:ØÛ|T!w¡öæF\hÀík&ôP'ª‡+}]¦=ö.´w\Å@>ðŒÞãÆæÞÞ^ú“ó´ëD+}xo³¦?úà€=Ò`zÁú×cü4ø™ž¸MÔÑ›7´eîüsñ–)û¯@°ž 8¸ü´>{ú^Ê/Ú ðã„ÁÆŠûÅÊâC7ßîØs(€u/¾?HÏ?ÇxçáëÓ¿÷ÿ¯ endstream endobj 3895 0 obj 6896 endobj 3899 0 obj [193 /XYZ 38.2500000 785 0] endobj 3900 0 obj [193 /XYZ 38.2500000 785 0] endobj 3898 0 obj << /Type /Page /Parent 2 0 R /Contents 3901 0 R /Resources 3903 0 R /Annots 3904 0 R /MediaBox [0 0 595 842] >> endobj 3903 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 3904 0 obj [ ] endobj 3901 0 obj << /Length 3902 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·Å‡( Øž™90<@A7›`/2ÙCþ~4ÝRÏ´Ô_IúDRR7רµwhñQU¬7«>þñÛß÷ÿümÿñË·ÿì¿7¿ù¶ËEžþÙ¿þúðþº<4Þe¾ÿþc÷²Ù}Ý}­ÿû²;}ðíËŸë?ýo¯÷ªÿýeÿ׿Õ?ü©ùK¯áÇ®PEýû¿¿W…ªÿ”ýù¿vùÝþ××ÛåšÍ\þÿU63¯ÛXúe×Sýöý×ÝǦ­b [fn¯¬±{UY½ÿï?v?× ´Óg‡Ê*U8[ds*ôq¥Rï•®²}^ôÖ9þò3» 0yeÊp“wî(Ê8%Nî³y¦Ô <¶²þô6}èçyfÃM~ܹw¨4¸f÷‰Ü>ÕŒ°Ú?ÿ\ïì´àñ·ç;íö^5|m÷Ï?íŸeêáûç_vªÞ¡ÓùiC#YqÉÚ†Î#ÚNÿF}‚ßTð›òô95,ߘrúlÙúÆh8Û8gÓÍlêWæb×JGÜÁ¨ã'ïF Üõg8[†F<>×TˆÀ²¢Ca t†ûãiÄÊ*{]7óµ<Àu*xˆEŒ+=„Å+³ÙÓyªdjœÏ/~KøVÃ[ ?O¿SÂ1 aºkÖñpsj5Æ]»9µz¼8N·›ÉK–í.ß@ÑìÁšâ„öt Ì¡þÓ%ËÌN,³ì¢ùÊ$½¿ªàNú3«þrÆáiocŠg«Ð7x³êsw³ÄÂöxKÔK¸X6ØÏ»ØÇ#x6a9œ­€{ƒëL D¼pÃUj]ÁèR]Üv3\a< p™ÝUÓ|4b¯ƒOÊ0 h1™Y4b}ñOeUXh‘Yh¥òKm°:œ¸y_{º6R¡UÀ g3Äð®áÞ OúC§¹’ÓöÏ£ð7OhD‚»ÆŘÃ;€pÃ8ųiŒÓxk _àlpׯ›î? ÁTŰÀ¤d!Ñ8sÌ`M³^a6Ó‘•”:Ò›äi¼ÖHÈÔ^êW5£Ô¬…d4 ÂÊY]åÝ›¾–½™ÜtNMÂxkK°W ~Ê0¯¾©öRvè¢KRð^Lp¼Y \!lJø0c E| Á€Ä³a‡±‹SŸl‹¼5{ÆìMPÌ1¶ßãÀlay¸3eçÂY¨Tbu3ƒj:Ã÷1w§xl\ཱི)lø<ÂuàˆpRknÐ$ÒÐPÐØŒÂÒe„a:hJDeÕ½M ,¨²…vSe]±hZ'DÑ ¾yUeíCÃT]7ÄÉž6@HžŽ#¨Xí®Dü ^'°öˆuŒ• nU,ö±ª€¡ÄXý„\P·Ÿc¹Î×b£^£Y¼†,D©p)½zÊ…o0¹õ"iÁM¬Æ=WI°‰ƒf-‹sQý†‹‚ вìºoìâh¦mƉY)œ›Ãä¹–(g`wU¦»”UOF1Ç*®"L*lœ¸Ð·EUR”5Œ9%ÁœÞï'%•üú{g$UP2N¡4A[D)ž~¹–÷ÜwO̹cð9tusÕ•tŽÄ„¯„ûOh˜^ÜâÐËøÖ)i̇òûÿlW(67ùšèƒbLaô)¼Æ.¸7AÄbï¾x×:Ø+¡c‰Ù°‚S¨”Œ…Ûô&^ÃÏùÂqÒL“0P2©¬í½±š]ª*3®kFò©bÖ¢<‹#,ö>—‹gT®:¶«ÉDL}Ì3Û>»00^…yŽÀ)¡„xŽ˜aÞ†“îà7Xö†–=C牃áRcÊœV)h>XNc(bÈcIGw ÖL1½à„X¨•ì"4Ÿ 8™®SU> ]L‚[Jã•vo}ód R™Æ–&øt˜àlH}Â:äõ=m1±¥GÜ<’üÉ/ Ú·É/ ÒÎ&ýéÖKôvktr%™ˆ eª9ºGI#iäÎF,öREzd|?º·éÁ0õ,ÅcÉw?І÷„ñVâÙÖL "<„¡ýäå >(ø ß‚€-¼qϰ§Ž¢$åÀžÐ˜.ŠvUoÜ#V­\ èýÄ#+ðõA¾šc«s(H ë ˜³‘ ¿òHø†ˆ¸ q(">$Ü{BÿaäžàSDZ+FÓ#`-p8f„ï…‰ˆ2q(ªˆA”— Ãm“ñïÌÛÛÖaù¡ßJdaio ¾µLY-¿V˽I°8ôbì ä±.žcørÓïÈòñë5çc ñHÌcñ78šéƒ%æ\‘¸CŠã®;‚)d›˜ÃÞŽ†+Ç‘¹¹Q)AI–Å3öM’FI­ƒ§%i” YŒXà.ܘhÓà;¤k#poQe[1œwï÷6Ͱ¿ã@¤RƒÙ¦'†z‰ÉëÅÄö˜·3ÂI =@Ø–g÷æÉ™ÄÄâEïcæ¶[¯tg|g b^ ͈‰N:ÏjøFJÒs2cFm³ „×@1÷SºÁýP¶×Ù˜hÂ:^[Ùs3µåyû­å¿¥†&bÔzñ ¯µ¿­³¶õyÆä¸¶¶½üíG®(™çÆ]¬ÊY·›!SHW‹Z¼^ت+PĪ$Ë×¶_¬[°"~ã «L)»çµŽá*º³åyY]w’ØÁÂ…Qw1càà`S r&¥ŠQ QA•`®B(»lVÚ5S„c˜Pdº\Þ4080„¡C¨¸La%t©‹tI¬¿lÒµo0%%ó3šù©±4! þÄ|”ᬛqgbrÎåÞW0׊s5˜Xu§(Ç=+€é¬‚•c¬ë3őی-ë·Þ²Ì/ÉõšsoØz­ƒ Óà:8­kfËætÀ&2‹˜¾pý–²[ê|(dþ0™Y^û4ûÍrYcî> ‘…Qé¹Y£×ތѺb1mºñIqjf. íŒo!Nõêd6"¿0dkT­:BQ}8¯sqN×éI !6Ê´ucb° Áý´ÞÅ‘ÔI’ J÷"ðCé8£¹µkLóш‘5êãóbFø+S^Rá5{kñG¿B ìù‚6§ÝäÓÞhøë`¸áÖø¹6޼[LŒO`ÅÍlp žäƒ—m뱟ñKU8 ÅkSȘYÚU>'K;caKÀIČުÊçàdqX eNÖ•Y'¯ˆGc®x˜{ïµìò´|WÍS]–ëTA¤Ö‹©áªxkï'·ôÖ2£SÃUs©ájÊ¿A.±áªËŠ6ÇrùةţHIée@z j©Åãê[<º¬ŠÍ;·Ù2&NT¶‘RžNÙY¾æ“T«ŽÏ,‰zƒÊØu)œ¶çƒ2i?>*.i…LN“µ2!ËØKz ÌàÒKÆTH§# U›]<9¯é “\¡:ô×ŵpo’§Î„ ÜFFáªo-n… jk©2S9·Q(°<#LB=…Å^!SF°öÄÌ„ÒI«Ìstº2—šd¥Ú§¢•´É÷Ïëˆq5'ƽMZNU^%Ïcò9Hç¹µœÐ5ûמdLôxÛ&%Ý­5oM|0Ü&Šé¯5y ^³x¾kâvkàv©Uu–ò1E Ù&æ"V¤rÆÍ‰JGã똒p®'Ž€bùÌä+%YdÁÊ9J’™[Ìd( Ü…€c1‡¢jÿåœ~W1ó¬vÞWÈ+y×+s©¼’õ$dÜH†KÊ+¹FT=2À'&KÞK‚IxŽ”«3Œ”Ÿ’¨(^á³6…bR8zõÛøQ©T>Ä\´â©Dò“PIÜÁ…ãðy>¾ü˜š™„³Ä b3¨ilFwäÜœ…æŸ8o‰¸Iª³ *+>qïVàâ¯^RÊ™j—ã{9çú1扃“Q68šøßr“ì‚M$’2™ÝMà×W]{¼·žD$Ñ‚à»Ï°#/¼³ûWšõÚm4Hõ€PÕW§#M‘Iþ€èC"ù­S,\oH%˜æ¨½ÝÏ“¯Z² ˆÙÖøeS*}š£µž+“_.9OP Â>gø'¾ ^»kPÊ¡Vúe—S^Ü 0 ëÌty°eIظ˜®|¹!M¤0¡e!ä‹».8‚Ê.‚¦ø( NÜç Ø±Eµ&øÚ—Ù¬‰ô ÐsׯëD¹Û¶yÎùŽÙÜÁ Ε}ƒ)äÕ‘&\F‘å}!1Òã©MrŠÊZ/÷àŇë×ý©¯Þ U),‡qež´‡‹,£ñ¼ÇKl‚Ÿ›Ì~¥_·SwÊ-é2_ÊÕÀó}|U7>ªj®u‡ªšÊŠ®üHº ’ɘèUÑ%z¬=©ãðqp𣠼ƒ§à×AÛ®Á8O‰ñ(àЈ`ò·¨Þ”ŠÍߟ !®8¿{ºô°*[ÁêTR@|nto%B²·VÝ}ãkÑyæI  9gB°óm,˜ˆâ„ÈV}±ÌÅdrÚ6½ç Ú€·Îµêå›VË·áW{ažŠš Â^^òD#U¶Œ"ôÃ2+“‚GA Èn*k:Xôœ‡º¬ûXª d=»³Ã†,ïž mHY›²W>½y’ѹd㛢r]v6¸^ä×Tb7ʼnøAûâvÝýðOÊò'vM{¸—JO÷ýè0Ì ¢M½ú&Á䆋(=΄Í;ðû{]M{«zF)ÃÕ1à'ÈrÆÖlVåôu¿Å"n4±ýÊl³Š¡1/Îï¤äÙ¤k/J8‰e¼Æ˲^ï+ÿ`êÄ*KYSu˜|¤¾Ðq^:·ï«z÷ͽŅ&e;osA_ªvoÌ øË¿Û$ª· ®Å5¹Ï\™¼Ö¸Þîa¤ YAX½ÃëDÊ Âª'r ‡~k\ïI¼Oïw×(¤‡ÎÛ½€±šU¸sã†Þ¯ Í›&8SÂ`÷ì]ap0Šk¬ôò êÜWîE©¤çz¤›ÍÔl§pŒéA¸a…°8Q¥˜yjGµY0mÄ6…ÍÞɨH™>L\ù2¸L4dB sÇHæQJF‘ j}ÝÇá>®´ƒ6 ~hŸÓ yºØæÂSÉ ï¿wÄö¶Dn¬ ²Ðôs<º,23 _ ÅMÒ²@}ØÞÆôBx˜]c](†‚×Á~ Û©‹D½L9Êÿ†ý‰øn¯¿ìËzy§Ö3x'5²II·ª“<¹‰ÆãƒÛäO1{ݶµõçöº¯í_ê-‰;þ:ôF8/ÊkÇ1Ê2õšÇµ×g[I!±¹ÅÓýDeú OÞå5»þH}hòÈÞQ™B§z@ë˜!Oêµ½=5'í¥²5nü2ʾm)ƒ›UÍÑ{l˜ v"c‡æ•c(<ü¦ñ¨IG/ÞÈ–%¸×?×;nwþa‡G h Lˆ Üž­l×Ü+Ÿ:dÓ£#L ;àCàW´™…ùÚè=4\ã‚°‡ ¤á ÿâû¯»ÿÔõ@ endstream endobj 3902 0 obj 4664 endobj 3906 0 obj [194 /XYZ 38.2500000 605 0] endobj 3907 0 obj [194 /XYZ 38.2500000 238.250000 0] endobj 3908 0 obj [194 /XYZ 38.2500000 605 0] endobj 3909 0 obj [194 /XYZ 38.2500000 238.250000 0] endobj 3910 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 575 520.500000 589.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 3905 0 obj << /Type /Page /Parent 2 0 R /Contents 3911 0 R /Resources 3913 0 R /Annots 3914 0 R /MediaBox [0 0 595 842] >> endobj 3913 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3914 0 obj [ 3910 0 R ] endobj 3911 0 obj << /Length 3912 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sÙ¾#€µ+È!€ 99vœÀ°(>äï‡3$gµ$¿"ùMu‡Ó–ÉÛb?ªª«««¿ªúöOŸþqø×ï‡oŸ?ýçðC÷ûó§§ìXæYûÏáô뛯`«c÷çCYå‡~}úrøòôñécóÿ_žÚ>=ÿ¥ùÓÿöðçæ?þö÷æ‡?véô~}*MÙüþËù÷º4ÍŸ²Ëï§Ÿÿûé¯8üvê±®›ÌÛÿþÆT•+ýi3Cyê—iο~ÿá·§o[¬Å•E髃ñÎLííá¿ÿ|ú© ï>;ÖÞ˜²ðevÍ@¥=TäM¶nzÊýh ó/¥ît^e>\ç癫SŸÂȽk2·ÊËŽ@eú_º×ï¼Ìl¸ÎÛ™«S¥g.î]‘¹eV×-Ê"ùûÞCðÖ”á6n;sm¢t¬ÅkrÖÙ¼%›Pþ×èÒ}êE®óóÌÕ©Òó÷®ÉÜÒtË6Æ>‰.Ý •e.sÏ3W§JÏ\Ü»"s«,ï¥ß¹ôÏÃm®ªùsš¹:U:æ ½k2×ÙNúmàÄ}í>ýóÌ=Ï\*=sqïšÌ-|Ö¹&s/݇ ‡;ÐÛ™«S¥gî¨÷kzÁSiîê_„ß}~úöƒñ¦™VqøüS3¹vÌóoŸ¢ä‡oNôÊ>ÿxø®9_þxøüóÓûÏÍÔ¯µC6$: Y¹¢Ò¾;iÌ1÷EUæç¿wnÉì¹¥:VuVØ<ûªåý¹%?:[™·-ø›çs‹?z׺g.-ö™˜ì-«Úo–tÂtïá2jÍqŒ#z+Q‹ñð›üÜâzÚ/ê­ ègm¾2Ì-æ @%È'aÅx]Š‡Ë dÔɇ!qb1pÄ؉ mÌŽÃ muÜ ž¬iµë•Ù’±pá,Ä\æö†Wú=l!„ØVPA-—YLïfð$Ì…±tûͶæ™Ë`oxnï–Ÿ´Ìᆓ5Ú²!áÜ¢0ÄÇJ—8ÑãLزªj‹ÑåXÑD¶Å4Ž`ñW¶ÚßíTëãy6Ù˜‘-˜O}ca‹-ϰål)B«ç†=CõLè5ê¤Æ·(¾XU`eÅlºðÇb]º¡„B-Ð}…i†uÖ˜˜tŒÉX÷‘lÿÒ cQšÁ¬ãÜ/„ ÄqfÐ=sÏÅ&;H<ά ºÄÉ ìòlbÜp&þ}„c¬s\5³éùúaý‰d¿‡ß8xòð›—õç(ÇÁἆ',ž5î­;Q¦Z<¶dpÆ–ÀãàÞ,¶% 礛 КÁ³ÆÒëÞÅÛMuVÏs RQX–e¸n›ã”·xR•[¶šß ¸înƒµÞX_Bž8¨}ñÜ„;Ö±øvg©ƒ÷=¤Ž'zÃzÌ”ª:söfñnÂ3Àtƒ\î’ø Äú ÒÀc Á-nÌ9ÃȦַi×Kò¶790øtÅs#zlÌÆ·„eÓía´˜‹xïª}yí‘ZRKjy°½-„¶ËðÙ†O ìÀÚŸ”xnX¯gÃ7|êÝ¥STà´#ð)ë|øïpx—8l1{nËr Ð{^êˆÖOQÌï3,±ØKEønáqˆ}†=u”$ao=ö„Æäp•÷£ªbgG-ÉïGÅTˆÐ-³¼w;!sÅÓ²Ò['õ$ 7Ò½fý›æÐ 0ù1«ÝÛÇN «ëÔ¶oZ0 ÖÅðt9oÅ‹ýè—j 0B¨T°hÂd—ƒÊgaQau™sn ?’Ó1KO ¯lê›ÇqÒÍ=7<Ø o;“« à´ê¥(’zIê%©ÀŸ½`ÝR]šÌW‹õ¥E@ñ=ÆÐeî;+‚„s¬˜±ûèSùØ%„> •-–[4Ñ¿Á½™P‚BÀTZ~zOWy1%™)B» ²HWè K)Ž8ˆ¤š…°×A#b 'â{…]Á0›8õ´÷¼ßÛ8;k=bK]¸/aD>¶Ôñ;¶û‰{L†_²ð[ÄDãÞ„*Õ¨`oèÞåð rÛÕz,E-¾éâ•Q#Bo˜s vʵ@æ>‹Ç!Ô kÓš‘xUìE¼âµV˜5¦([ÂÐ y ³ä1”uâ>=†q¬¹¼O&Æx )ïs²0…K!V KcýÜüÜö&ž–â<v:ï€%„ÐÄ”N#î" ÆuÓšs›¸+ÞŽVÚ 5,̰¥}­lÕoß®tþ³Æ-xÖqŽw£Gçü&á=¼6뻈t y·©&¤ÿÂîÇ9?÷ÔƒÁÈ]Ïä–!üÓAùSsSɹ¸"J¬|«#÷æð€²<ØhÝã \ÏŠ&$¤Är‡‰¿)m,“tP&éÕíe5œ#¢À×fp &X–`òµ+9ÀVšše5´5Z¨Nu0õÔ˜¶h‡|ÆéÍÛ¼%Á+`K§9ó£-ò·Ú©cõªo„qjøMËãŽÃ Ý-÷¸Æøu;ÌÄlº7Û©y>ÃØ›µ—ÓgÔ©çâèŒQ·šè-C-˜W ¦N«¸MÑKhP¬Ÿ›°ž8N ×i)j Zwq°ÔÙ©$Fð\;MNÜ¡‰ç‹Î,Ì®©°<-»`"¯@&1A€º7²}¬˜ ®ÊhPgÇ\»WÀ‰u™e0i•——‰œ}x0 °à%»Ïˆiæ:Œå2Y¸ª/×¼”†zA»þâ†Ù¸%B¹‘Ñøx%‘$!z‚Nº½gI5Ù¼.`)"(N&û\Œü~¿TI'œ•BÃ`<ö“(DqÌÖ¶hdœ÷e§h‡ ñ›Ö ¼à‡l3è§*5J¨h¼ybÄ‘j7ͪ‰3Ç¿féÛúºíOÉ‚Y! Æû¡,@øÁn-.æºA”®O!Þ /*¤3›3÷ÏÌ/N§pÕêÍO~yúJòl5”¼ vç* Ö|ª•ll*t÷—õ4ðÝk‚?Úa%¡=Ü„æ¹ÑPäLW‰t_ÿàÄŠPE¨±¨º—ôžÍæ±ê.ïkh<œå¥„¬Öƒóý2GÕü¸BîÞH¹ˆqf“X•’„0 †‘¡˜ T…-TJ*›ç%BO˜ ÕQWW_“ßgŠer5oõÖ9OEo9dƒãÝ…,ÁLÍ8,‹Xw1 Cš0F·@ÞSØuó/TCa²sŪ“BÄÙl¼BZéŸ_]ŠN Iv7í$¹Jã§]"ñGÈLjyJä¦ÁÜÖµ#”˜,L¾!ü #ñ|^Îu-ñ*;”>wWØ©vG¶õÚ¥/ûlb1kwœ‚lºQ#ÔOnëÙùPÖjoÌ}d Ü_ª/c?'Aá¼f|oª>p}mÝ{ÿ–=îÖD”±¢÷2 ¾Z¬§1Eˆl5é ½ÐZèn=HyuU¥7ÌG"Ó`sßœ‚í ï–X¡À¼T¯oÕ‘j§n:_Mòùß©Ïk”û¬JÉ(‘U¹S ê<Ž·ñ*±ea/Õ<#Þû ßû·6PC´¨/ðª^üËQ’¾ËNšÉòOà—™¦–ƒ“fÂQ„ˆE¦«Z…Нˆ9e¢ ·—.Œ”RQ*q=x²ÃN(ý A6]Å$Zôºøåí"™µb‰8‚q¸E>8Uò>¬)@Œc]5ª3ëæ¢¤¢~æÊÚ~¶ûûð¢'™‰Æ ¤/a£P¿Õ™HẌŽ2¿Ô’Š…L‚\ÈqV<7ìA€{Á3^ôÛ¿(ÅâÓÍC`´Ö£Ë“Ù}Ãx7ìíÜ›÷)½^²&kI®C ëÞmýý°,Íì|¨÷CU>Æâ–À“ˆ~Ù*«¯áÉÍiż›ÆÒ‚çýöº"¦Œ½fäÕ}í½Û˜Âª¸IAµ$‹#žÅqóó>æî>Ýpy¹LÑ ÒÜ2DÜ3)”ßµöšÈA*I_Š %wà>½Ë«N‰´K$þ¤×™|™’ÑAºëßÛyÊ뢿ï2ê4*OŠkü¬1ñ™u¥?ªŒÂ¬2wID …™Ð„ ΪgÅß0Ô¹¢µIF|X§–®é]^HM¹’.لϵØÊú¡]ühÉŸCÂ?íðÖ¡\àÆ»>pI˜jH=ÆýÆ@7‚’­´’—‹ºÅà¬l¡nU.÷¨RQSµÞ^`ýYT憸= u¹°)„¹ Hÿ>‚fhýGUV]…^ƒÇ ö â(tÝ×Ý ºo̬7€°O¨ýa®ožëgã8ÊdÕüÎÐm!. · >Œy×ògàwwüv„¿Á¨687¿ÁF/ÖƒIÛEÓv[ÖBßëÿœ÷–sÊ%¶  •Ðsrέ’ûä\Äl•ñÑ#Ov–á1é,غFIgA&dˆ`p‚‚v!èÆÜ€(ŒhL뿸&°þ¯:˜zjš¶8OÓÚAi]“[øßH½M´tâ–í3è×Ó)Ë©oÔ‡ÈÑÖÄþš]=hw,õ ;iÅÓœXZ—æ,ìí¶ÀÞºøïÆ vSéüŠ£3­° µýÔ¬ßÁÞ2Ô¢Kƒ©Óê3SôÏ4KhP¬Ÿ›°ž8N ×i)j#Ñzoò†¹€g-ȤŽÀÓ’ ï’H´6jjx•n ÷–½&?fÃmÁÀ4¨RJÎùÚ¢ ‚( ðˆpö´ ¯X%o­.A—ƒœT'ÞÆ0•åÀŒïðR —éµeÑpÃcB¥t7È©Þ:mi+6´FæfÌA4„a*ªI«©|©L u©…9ØRH0º­‡Ç>¤4ÏÍQÏìž™uÅÌ'Lǘf<ëXœÃêÏú>ºù¶Ï$ê*«¸nߣól÷Ê-òÂ&ÁŠÒ@ NðCªG—¿R kŠf¶êr[žaÑš}¸³ÐÝ FGëš­ÑË—ÜÜnÛëÙ¤VHXe×ï¨ÛÙgýK#>3•Eî:·FØgYÛv¾8eϱûÄL„ÔÔ¦Já·T nÕ½çQZV5oJü`4×=_²î"ià—δ(†‹ ø¸†»M˜,!r#¹eÞ¾˜ã^gôG¸©becÒQ~Ft¶—bH,CPRt˜'z ìh÷L*ÛÖhb%ÙÃ0ŽÈØÃœäûRù!/„ÆäÛÿ]&„Ëœª‚¬âTSyª ‚P&¨ªŸYÇÄ{æÂûß\fç©°SÇhÂiiTÃ…‹—!,¹É+šZ]|•îÕTdæŠÌ„Tß¾È&\n–«Ø#šá.¶ºAc‚ŒÆM¨ÒÍf‡¿7pö ö•ª‡'bÑòÊå}ˆ:ÎD*tÀIlˆôBx6~°ÂšÌÓO¤€w¬˜b+w§sj=XÞTË1'ûí.ì·u¡ÍÓ½5'Çì|R‰>Q^R‰¾”Xâ;,Ãñź§Ea¬zHTrPäSrð.åàqv0e·â{,´óî´| C¸-Ö£DË6Ú¸úšÂæ÷Y¦Ë?îM˜¾¿Ã–˜ö¦ü‰Xô°òy_žQðo0V›joÔMs5âÈ——™b_AÁ§Á$óʼnËÊc[DÕ£°å @ÖD”±Kበ6Øç‹Á*;'VÁj¢Ìˆ`ëí,ªÀÓä ½S_èÖ‹bäWň•t~ºÛs„îÌñ܈ÞìÜ7Ž$Å/y°a]ž4öÝjlìÿĽ1èåÄ…Õ„[ö}ÚK/STLØY„¶‹eãcnoÃ'—_ÊÄôØäÅ|m\½ù̳ {v`x­n²“‡Éê8E7î ĺ9!oõ´—pÖ°Ñ>·À;Џ;02<]òjp¼¤¸Ÿ÷³ˆ LØüíî.%]Øq¦üš\%›É7G¥™Æ²4šÒ‡Å4¡.0ÇÎn±Ú ïHÉܼ¹y³˜Û·à6­ú¨Kû\ªH­t*øè *ÊK®àX¨Yè¯Ì±Ï ã» §Ù3¯y·GEÄâÓÍC`$4Æ!3KsÆb㔄÷*ÆércåU#ë¾Æ4¿_šã@<->Îý…Vj5u”¸ÆËÌ)YÜÁú·;hÊäl¹ZNœ•-åìѶ¹šF²XŒ[ºW {,F%â ² Ì ÇÍ9ì§æö¡[é(_^g%bãÆUð.Æ ìD}ªûrÆœX†Á½Áo:óÔ¬ZúWù~X;ý¹™ñÛƒ~Šv¸Š€ÅtÀ"ð‚DÀÁàÞL¶Nç¦ôXްLœ4#±3ò*Η™;vZã`ç$HÇèNÎéÎÃǧÿóZ^n endstream endobj 3912 0 obj 4884 endobj 3916 0 obj [195 /XYZ 38.2500000 665.750000 0] endobj 3917 0 obj [195 /XYZ 38.2500000 665.750000 0] endobj 3915 0 obj << /Type /Page /Parent 2 0 R /Contents 3918 0 R /Resources 3920 0 R /Annots 3921 0 R /MediaBox [0 0 595 842] >> endobj 3920 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3921 0 obj [ ] endobj 3918 0 obj << /Length 3919 0 R /Filter /FlateDecode >> stream xœí][ܶ~ß_1Ï2I]¢€½v ô¡€}(úP$M‹  êæ¡¿³;œ]/¥ïÌèÓ!E#YÇ´¤ÃÃs¿ñÛ?~ÿ÷Ã?;|ûøý?øŸß?TÇ®©Îÿž~}óõØþèèúæðÃ/__>=|:ý÷ËÃùïÿ|úÝÿöð§Ó¿?þú·ÓþèÿÒÓ_øå¡3Ýé翟9ý®zùùôçÿzøËï¿>½ñò9ÌÛÿÿÆôƒ«ŸÁ¸òé/—mšç_¿ýðë÷gÌûŠëúv¨¦võÁ µ=ü÷?>py}ujcº¶îª%êìó—êÓKìésδ£=ÿÒy½‰ðò¡iâ½üru¬×ù튇;˜ÞœÔ ½>Š^_ÿÃÐõñ^þ ¹:Vüá o×;ܾ²íûÍXD,EÑׯðòÚØx/†\+çÕޮy¸u[Ÿd[ÿ—×ÇÀgÛˆ”ó¹:V.‡;zû§9oÁ ˆ¦ÃáÁ÷Ÿ¾ýÎÔæ„Ìöðù§pço>ÿø|BJsøæ¤Nºª>|þñðûª2õŸ~Ž­m. ^[©øLŸ±Äw>•G¸ò­Øf>î¼ÓŸOýLN–Û‚3YW–8açÒИØµ1š”ÆNbkAübŒXˆ*Þ'ÄHå•îR6~Fà¼òžxÛwóOXàîT¼•‡d†ôâ>¤ƒ´7ýH-”ÙÂyC™"¼ ÊlâˤƒÏ`‰W ×Y¸"À†ùs7^ÁoÃ+ðL)‚µ–p£Í‡ùû¤/Û 5UïºÄš*éîš6µfV*¸e’Á< ¥¦_‡9†å%¥‡1Ô;ë°„«‰·aÉ#ÈrÆÓÀ§ßf ½)à k:l¥cJX„5£3° ‡u –òŒUŒ}D†® ×ß쇃¶àˆˆM*kÌâX¦x| —2DðD‰S°ë-–×ÄJþsú™ˆý;‚ÊïËAülýäqŽÃ’¬CÁ¸­@ê¬úWðɺ:²q^φ¸qGg{sBChÊôÇ~¨žñ¶;6uÛw_¯øpK}¬Ý¹"èu¥AÏxlÞw,zƳãþ;¡M8õ¼ð%ÞÔ˜ ~F©ƒÏÔªø;«¿æB_­ôÁÖñ…mà×Gê%ùÔ3"¤P4ŸÁG)ux,EBt1¼N ‘"@ˆ˜ÄEšÉU| ºûapÍȼS† c+ÇÆÕvXõ]( CÍ < 5£?),ß.N`ñQp¡÷Ò¼«hr]„ÎPŽXnÞŽPA,«ŠKÁ¸P³Uûƒ¦ØÑ¶OÜ8T¶{ûIS›³Á3±â¬9Ú¶y»>šõŒ'©gôŒ?ª“&èL@hjsl÷ö¸Ó³^iÎØ€ ß£·ùƒ7íåAíË"0"’„ª€&|øiN_5¼â Ê)|8Hð¬ìüS¾Ï×[o+>˜eì±=£çu†÷ã‹N&VŒ&Ú)¦d 5Æ>9ÌK UyØ¢;ü'P/1;wɼu#ˆMp¬+o×{3l)¬Ã°Y,Œ€q]ô÷!–°'†ûè%zW?ƒ=¥Ñ‡kDÕt¢ LÂ=¡Üá;u/¼96õì~3rI# Hmp/bZJu˜R°dŒïlh&L5îñEµž}ÝÁ‹¡<2p =í³E3úã€Pt‚å€Ok/¬Úow‚Ž‘†)’Àù˜I˜„jˆ]×Çef˜Fª…¨²šÀ–O9Õ·2[¨6Âõ4xv5àJÝ*wÝŠž;­]ŠhSµ‰QK¨(嬡 ,4s(©å‹ªs+˜ôæfS[›ŒŸ¨ªë)Û%¿Eb§,AL«ñ0:kìªW¤Ë85ØQ”$+Á?e\D¶±#Ç3°F-լTâ}Fvi;!›)ÿ¥DÂc Qy[¢’ûÁXsõíD2Úâ*hÈÁþ:¯4’¸¿áìSéZ‚Ê>+¹É¢sŠÎÉ^çäœo.u¾•r/Ƶ€\G”yn¥–Ô—ÜÊýÉ´Fè1FñsÊAcú˜2GиKU©0I3%<]s;±­ˆ¹s¦Lø6Jßc:Od/3Z° ¹3 ¸',‹‰µÍ°$‹¹þ9–êӼ헆ñÀ ‰Ou"daÙ·fÉÌèõ³º“z÷3ç0Y<Ñ´£mΈ-º@ÜOñe/¾l]à–TjQºû)¸³ˆÑܪy—ýh‰õ3LÅŽ–¸¤L²ä(^ˆ2´ƒc©*¨˜Ê@&‹Cį˜›vRFIÛfI ׎ª Š$.’8¡í‘³×´£S° %qGÞ–•²RV¬07IªÆðÖ—øÅÂØªn£fÞî¦>³ð\<—‡'ÜUKê…˜•S9–8ÊËÄŒ™Ø?öì‰Jya–¹îL#\G„ã²8c‘ñ ÎÂ~0ÞÍä ®žÂD/%Uñwàù`ÛƒÉÄáÓxëæTâÖt<9Òâ÷I3Ù²õñ&Ìâ$n]Ã%Åð}÷x"3‘Bj\#ÈÌ=-V£¸Ÿ2[qG³þÁqJ{ß.šå¼›zmæë²™µ†–ë%Sž÷³R*zªb;Û!{Û™Ë\ø'ÿÜ[–d›uwÇõyäú%]y;ªˆ[Ý–*Ì¢óЇ¥¢ZÜéêÕyt›öUênSj%ÑT³mÊÛýÈ4!¬ªw… ¥Ry'Ü&P^QëÚ Tg7ÜÈÌnÚ¦®Îà ìmênà”žú6µU±Q7cͰÙ—ó!R»7Ò¥žjIIÅÂp`É—UyGΉ‰‡ëóϽe‘2±\‡Ô} )-×Á,©ÚJ ©[R“Sìemi³m³½¬[±WÎ'Ýù0÷¯–n‘;yÐ5ã§§´Ú†æúÌu=ëeÀÔ§ÿqýS†çòÉK¨k›gxBíýP½]ñä6µr>žúX»®y{¤çÔ¢qGg{szè–·Õèml-ZñÂeÔ^„ô7€„?ì­¶æ²ó[¶N{žëŽMÝöÝ›g:âm ò ÂðrÕ˜ دÜð‘ 3Œ7Œëâ ?ƒÉŒ g oÌißNÎÂ6ðë]øzøwÞÔ¾Èd×›@–0J'ŒQ™5§?~{ŠzÄ¿iC *0âˆÝ 7ÛG$±´¥$ –œX1ß¹}ë#©÷…%5%à ë#´Ï8sûŽ×W­ïˆg.RÈù‡nXYíÔñ9 \‚ä|ã‡ù|åÕÇB±Åˆ¥@ÍïoV¾Ø ½ª–פføŒ…Œl `©=B$C™Â±ùDHmʉ®$ÍI¶†Zr}™W܉dü­kš¨XX`QºŒÒ¥h Y c(jÐ_ÝQºDýÜõ“¢b{ø™~F€õ0V`Äé^5öcªCgðo{BÕ¡Gêœá‰Ìp‹c ¾‡•`qHxÇT wBcâÙºáÄ2ãâÝíÞÉHIaº L Œ6Æ»£Ò'*¨ÖxɵÌlGÃY]-JãÛæy•˜ ñ ÈÄQZ8¢Ölë>КTÊ?Cœ ¸S)· ¿ž1 6¥™rNk2P3 Bhá1wáäžÀ°Í –Ìì™.ðC(åmV˜6v¶#ç0ÎÆ9}QC®^«UÔs´Ð*u„I¿¾8aô¨õ2¶:¶y+cq8ÛÍ#¿çàÂ8¤‡>A˜®~éÛ˹h.¤I*N;"ì\›eŀʆüHVE×}¶ÑâíiQ!êHè!«À¤_UB,Åñ(&JtE¨Á8QUòºi¢»ߤ bî8G$ØkxëñC•GñE[îÖ<žG,[²o³6TRJk+<Ê¢dQ~ÇÉr âiBßÅkaà«_Qº‚SwOÆŒ™š¦Ua‚Žõon¾úÔ‡ïÄ£&ÊAf„:…d;£’Œ&ˆ¶/”^êMg%®®Ö›Æ®‘*^ð,‡‚Pœ{7iK; ˆPéhäpÚ¢ŽÈÁMˆ½Ò\m®3¸êPMFnéŒìRî¼FP`ØftÔeVP•·[&ŠJ¢6ñDш¢¶ìÍ¢6ëxoÎáÝuEì04EÄf(b÷Pº›åË¢~:…‡3æ’á: ìÑ`T{FÑ8ÇØã(ü4{U‚ð\¿(¬2Qˆ©ê¾ýõTiff3¨v§U¥__ôTšdg‰PåV¤Û½|Š¢‰sR©ÃØfœ>rÌŸ¬³bõç½±ºþg L¼lóõh\7í¥a¶ßBèz?nZ‰ÈQ;„Ær©….Yà<³À‚°×(ðap¾êH£ªkCæÝ¢‰kdîmôUazf”©êr•bþÈIÓ¼†³ –›™*ðò§Ì Õ+Ú ‘î°U6ÁÐñhÕëÉË5õ[5Ÿ×wb®^:5ÔÜR#góy½ØVª¾Û-š?[,Ýô]Hó£X0sÛŽª¥µ>-âÑuL †éÍV.K›1Wòö;h,­?m-ÿš“[òï‚ dJý&tÁĽ°cÁì¬ÈÕ<>L\¼ õ]¼½{+Zô'1x»IOåóÔ¶pC0ÃñRÄK/Áù` Á+Lç] :ÀØY5b›@Ò(‹Ýžßg‚ëÌ€Á†ãofIJ™êºÍÞ˜†ªÖï¾¾sÎU1˜6˜ð&3óîf¸™L!–î°½ü&u*Ï öèšÈhú\gs¬÷6₵¿Ûq¢(}­Ò9%3Fmdìdb?B˜)¿Q v2s[¥ÅÜU’ |Äwí~å%2|Éõb -òŒ,Ó¸i]?Ëe¬yÁçÅÞ öA¢·ùëÂ`0aní!&2 9<Õ+®tFîõÑý7v¯£à˜DÓh¯3®».>tm(&I˜œÌ\ºÝz‚É´Öý¯ ̬˜ÃzlȔƊ;àgýIrû±ñtºšV»d™‘páëU³Œ{ª;=›i‘Ê&yfk©W,\÷36Ôñc¦ ³ý˜Î„ ¢ØŒ ñã"N£9_H:ÒLASq*|g¤¥ ‰+¨Õ ÄÈ“q½ÝŸÀì› N·7Ѽ³ÁRU;”LF™þ˜bÛÆÌ|azÖ¨*b,yfdDRß©âú`Žu#cî‡ 1©lÁ”€Û`î÷S6ÛO0f“Bê5Ê$F Ψn/i’iºA<­"{ÕcÙ¦P¼³™9åÆD ¶ünLÌ !1cü¢î½{I®/Y%2ô.Ôš¥‹í–gwÓÅFET»A)»§!ü^bªNwÎ«êø¸û¯MÌùÂ)[5×çÄXÔYÖ.À%EZ„Š[ÿfª|4¿@]3‚ô‘£JŒLX]çÍè§’%©2¶^d{ªŒ)ñeztƒXxS î̵†E+×q®æVí¡šS$I˜6ºÃ3ç«+×TýFæR^ìú~ j\ðê(Î˜Š¡1fHeÂÍtDiÛi€ÈUdc-ñ¨8¡óçªñ ž3ìD]²ÛâJ]ÀLIÔ !õ×0]w®F°CýV‡La®x¦9s0µÁ+ðm…xºtÆ]—vXvb9ˆi Ë´MRyÑS;ÔS³¨·Â’ ?ƒïÀÀ¡fnº¾ÃìV_Z¼SÝ›j!W°–³ðváí+šé}B]íìu[ó&Ä"Ö¡‚ÜP¥å¢ù‹tØ®tÀ3Ý(JÄT¥ÛY€%1 ±÷ÅPCÜ5™˜FF7fŒ¦ä:ñ ebNÇg‚9ã>ilm ¡[BIN-M|¤/×`é}õJrº®/!8åDÃúÙëi[½$\gžg~ùò”Aêzè.L‰Qh¸Ž<æÌ¸ëX¤ãẌ‘côÁ,ååð(„ÞÀ`ˆ©ý`zƒéFMSÁ&ÜL˜k;‚«‹a#NÁàf 7Co„Q–‡éÕ<­òæ}ù_FþËô¿ŸpJÆ!?lGXh1a=…‚µÀðÄÁÕëæ­ å­{i{c´=”BŒDè‡H6`Ão`Ã6>\IzÂÍÅ_O˜h†K’EðÉ®ú6ʧšÐNjÍ%@ê0®0Íb\AY*H¬ðÛ°Ì&öÃÐ ö³/—¡Xl_bŒ2ß!“‚Fc´Áê^®ÀµªÉ¥â±Š'—Èc]šF8ý:|9 cQVºönˆ§÷S‚Üw¬ÌSW×ÁÖoùdª ê,º‰ÈðsöhŸcÖãónÇ+Þ°GßUöÅ!˜Šÿ~@ßq×:s¦`ûÎïtÔØæ¹‡ˆëW*¬ñ[mÐ3ž¤…Û0ømðä7³¶Þ½’-KpO¿?A|ü#Ä^$`10 |@$à ømÞ±ŸjKy͈Ž0M<|,ÆùâžÖE'ßUîè¥ÆÀ}s!Þ ÷òóšì<|zø?‰ŒAi endstream endobj 3919 0 obj 6167 endobj 3923 0 obj [196 /XYZ 38.2500000 611 0] endobj 3924 0 obj [196 /XYZ 32.2500000 671.750000 0] endobj 3925 0 obj [196 /XYZ 38.2500000 611 0] endobj 3926 0 obj [196 /XYZ 31.5000000 673.250000 0] endobj 3927 0 obj << /Type /Annot /Subtype /Link /Rect [468 625.250000 504.750000 632 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 3922 0 obj << /Type /Page /Parent 2 0 R /Contents 3928 0 R /Resources 3930 0 R /Annots 3931 0 R /MediaBox [0 0 595 842] >> endobj 3930 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3931 0 obj [ 3927 0 R ] endobj 3928 0 obj << /Length 3929 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯à9€Fì_@@Ú]È!€ 99rœÀ°(>äï‡3$gwI~ÅáÇê&g–)Ûb?ªªë]ÕïÿüåÉ¿~OÞ?|ùOò­ýóáË!=YÚüJN¿ß½ü-íß“¢Ì’o¿¾'ߟŸëÿý~h>øòð×úoÿKlò—ú¿Ÿ“þ^ÿðÇöþÁ¯‡ÂõŸ¿œÿ¬ Sÿ-½üyúù¿ûCòÛiÆn¹v3¯ÿÿ;S¥Îä§mL,ýýÐÓœÿþí·ÃûóVqeš;›ï|b*o“ÿþóðS½@7}z¬¼1Eî‹tÉB…=­äóz[Õ`ÏÝ`¡óoéM€É ›‡›ü¼su¨—yvMäEÕÈ…@îóô&¯Œ H9§«C¥C.žýXæí/øwríò ³<«Ù†)“ <ØÊ5¨ñ•×GÎóô0oò2Ïhv®•–¬„Ù5‘[¸öRÛ´ ¢Ëô!à_ù"Üäç«C¥C.ž]¹öôã@õê z1}€ÉMŽrš«C¥E®0û±ôθÂfþ„è’³²´õß ×þZv.[«g e>Ø.Ó‡˜¼(N~Þ¹:T:„fÿdM3‰qÝ‘ŸGð7x|Œ~Ã@¯Ó‡yÚh\®›ãª£Ã¶œsd¶6„=º>â0¨ázxd¼{“w„Á><ú$öò×ÚPì±´$c2 ê°KM¨»`Ëa­îMЯ¡–&hvx×:X‚ÐñÄlX«´uÆZÅX€³Ylâ`¸aëÛYXƒÄZ„¦DA‹&ì,AÅ:9„Žžô Â—=®™¢-шÀ|1#í ¬8`‘ˆå°ð YŒ§'ô¬Æay*Eu“ªl@,«¾äÔ¿} ȈQ×'½ëU,fz‡/(aÃÌÑá«јJ!ž¼›OÏÐHûÿTà…}°áƒú§ck×Jñ´Xƒ –ÅÊvr|Œx:g&÷#Œ@•+H‚š UAA‚NAÝÂ꣪ƒKP ŸÓ˜ :ápË&œoevYR…–ÁÊ1¦>a6l(¡¶-+áž0!™[‹Í]œêšOoÇPddæ(‘yµ@ Òdj$ÎéÊ‹_-lP&Ö-iÌyÉ*»d64Kž|²jø P8Ò'?¶‘†W&‡ßTè›–”M1ð »rþl­¯hd¶ÖzÛAÇ:‡ÖOpnÈ)ŽUÙÿ¦¹2Æû!¼£&ÒåH’©—êÀ)’ÔÊf“vÑ™>zMvL«?ÀÙZàÚn芴q“ð°XˆÍ«ò3ŠÍÀí õ-’#t=ÿ‚^r=,(N‹Jh Ã`§ÉÁ=¢Y)òÃWžÈŠ4?F°%UUõD‰ .1<®O‡ÂÙVŒ7+ðDLóƒ N {œ/vZ£y̲\ÂñE%¯º)hì3ñD_÷&û¯—fLj“ãÉ…átÊfBç¡v}¯‹žxÊqe±T¼M8p¶*¡j d;È ø4~µ‚É}ŸmK‰wÇÖº[‚Ç’q•b„}ìqQæv3t'Ÿ±wô/ÈJºÍLFʫ꓋å8X+1b6øþbu}ÀV´%ó¬¯ú\’q½b&¢JêBÅ á4Šˆ˜:­¸zòÈÈê—ÚDªb4iÖ•ÇÇŠ=3Z¥l3µv„ò*¨3d¬J[7á|†¡®}º^T¶% ìëêÈ”é²~‚îl‘‚ÐÊØ;Ég ®@ùÂ÷O¬ªe¦0\×%½åKLùFÂz3”A¬¤B<‰Êøö±ZƒEÑúÌv­œ0$D„Åéw8 ¢*¤(¾ ëÖH6¸Ÿ2Ùª¨úBw×~®Èæe"àm=Ò˜uÉX¤ø’Íp‹ÁS±ê`Äÿ’ºÍ ß¤¹îZ˜Ñ+S¸¾¤Cœ^}0~¸ûº9ÖàÊ quùâù©ëhR#Á6m»Ÿürø¬ñ($„Óz 2|ìÔyÑ[ð ]ïÕ¢bXD¶‰ Þë¤ó–~š-ÌhVµzR&¥Ým9;“± tãX±4\|ƒ¶l«– Qç™Ñ4OµÍˆò1xb È&]žõùä]é7!tebª1XÚF90Æ¿^Ò¤ÇA-i (;ÚAP/ŸÿM[4öM…¾éª‚ݱß´õᎭÓjqt }‚;x€ÐiøT~tgœ¾üæÙTë»â<'8Ï€ÜuÛjdl×p¤¥R“wüŒS Ï“Oì-¼îd2ûš$”R÷„ø+ÃWus)Tëju…ç2@"EÛ•SÁTóI¨Äß*k›t0îl›e=æcà«B«Üò%®RU¾wÆg·~’f7TÓõýð"„´Ë>‘éJa¶n”y¼{; ò†u ë~0ñIÆÛMä¿F3)USe˜Ð nK£ÒSYCX=½ûúÏÀ>[AEj8«œ¶ï+íS-7›ŒÁé:“u…¹¾n¼’ñü¾ ]Û¤¥ë!wí”mÜÿ’ég>ŒWƒDCC_Y?^¡6l;Ê÷²W"ªV"†e8c±¸˜]ØN‡-`…¦Ò¸ 4nxM¼ÿ"¼Z3Õr;$[syº[ö.îÇXí÷fëáéVÄëÅö&;k»vÀ)vL¡'3îcŽ{^3úÕþ2BÇÀãЋïrÅ„žïXƒ&\ÜÔ£«!œì[í‘nlî')¿R€ŸÕU~ Þ£ÛÆ–nšF0î0-âÓ=ÌW¼„—#ëTxVóïH÷dò™8ænD”œÎ.yçÞh ¯#8 ˆÇÆþ )âypÆ” úÖŒÉY|c§7uzüjÛoÄç¯ÐUG˜—„·Èð:Ì+Zðf²€ ¥Á³y|ÏV×å-qž{KÜ[Àv$zÃÜn}ŠÇüv}¸­Ïù”%‡ºnÄË–¼rFI0Œ{‚o’¯Cøu%&¶Šrä£Ú¨U±d§wf£ ç!¼ÕŒ.M—Áëà“âÌ#oRû`tgʪ$´êõµÝ Æ3°§ØÁ½ ·Sˆ*R1*&‚Aès[÷qz“¿^ueÉë3?}‡W>m&댡¸8x,ºøÌ±j!RÙi~u“ÇÄ~˜¨>ŽÃ¼7|žHñ/{‡‘±Ì,‰Œáhå½Q9ƒG¢Œ.Ža°áȰÃ6Ù&¬îÌ]­ [© 5Äðú¶ŽÅÖ#¦Øý>oà>oYÚ ôÆÄÙ0¬·Îý¯öø ã#Ä;cq¡·sÏM|ë÷,_Ø3iÔ3iöØ4[mÏ‹H×!2ÄÂKäÕ£Ö[–¡8·ÉB~°ó7‘ï·dëFž^ªÄpMŽüÃÓ :>¦rLcSUbq`e³IÜm9þ‹}"[æc1£¹÷ 0¼¾]ûvÐaÍÇj`²ÝÚs ]3á'ˆhwÏÍ!ܰWð`,¨vs¼>Œ/ýÞú¼^Á›ŸE¤ËªËw8ÆáKÄç„Ø.!‡•ÀŪTpÄ“ˆocÞ‰=˜¸+…|ƒé~pÓ7=Ê=+M:yÏbÖy•ö’Šóˆì¦úOÈ"â:T'›íSé*Ë­X±óˆÙ•õ“ô¿óüçÓñÜ“‰ÝX¤xî› k„ ‘*¿„ ÛŠ·ì~^ú‹De‘_òüø««z ëÖ¼™§Ng¯OàŸ¢i¶V8'¥Ûú]BßÛMö¨isfÉ~aרӄ­ Æ:RÍ>W®ÏÙŠeçÖ>¿¾ÏÓdÓbIÏ‘Ûä/Ø~e([¸AÄÝÒµ¯?Æ^Ó¹…š§õñ3Uu‡ UWpö-t`³&ÝqX¨Ö­ÔUüaOˆÁw‹à—L͇'ª•™šdÆï»ë—ñôËý}‚TYžáê0¡&Wº~c¦£î‚Êã82Ç.éS²w¹Œ-¿¨w|¼ˆ«5y®¾ªƒ°öòø[D`°Ùþ¶ÒX3è{Ò}Ìm9H0Ø‘„­[F%øÒ±Ÿïm z€Ž¦¢Ê°‘É8ô`]ÚßœÂR˜jœ—„\s€QáFƒ)ÔaÊ/pˆ°ëX1îëÙ.ÞUÇ"T:¯¬£&ªÖ è×-ŸÔƒ1·…é1€}™¨òõÙ«ŒãÁ:lVŒ.ÇL°EöúP7ÔÛrÒvsPÍ6q#Ÿˆáj[]ÒU#†_œq“ÐÖ}„“I×¥ìõŸaÛD€JYЪ,õ¹E ż'Ù’´Ž{{J‰iŠf‰Ý–OÊ4Rc‚ž)‘¦²eˆ.x˜#ÎM/£?ŒSìàˆPB§ê>Êè»L€Œ¡ÿ ~ƒG6£#G¡ŸÆŽ T¡šX"4ÈÇ”´áG£Y»þ®·,7·ÜB8fú ·KBî[×å½Ï#ŸŽÒ p‰%¤ESÚZŒ¤+â{‚oýYL2Õ–¹ü64vŸ/zè`ãIEYºÄC·Û#’‡î6[?0˜£ ð}™zš`Ë)Íwháev‰×u·ð8 ïÞ,¼½D›wnÝ–Í|ôÈMD[6Ë·c±î¶ìnËÞ®<»Î–­'ßë‹+ÞëÏSÿàŠäÛr4›Ú¸c z‡É¥¹Y+Æ’,›}#)` ´íÑšóÀ‹‘†wåÃ‘ÖæµÇ¶¼äå>¢uNŒ€{ûÔžtPáÒj8¡Ì÷ÅüØfM{ôÁ[ómlúŽxt ƒgƒß´†™uôéç,Áþ^ï¸Ûù„$ÐöäGˆÜEPÞOèTÒ'BÑxár9¢‹Ô[&ñ ã8}žÖ¾è¿7É ?'Ÿÿr> endobj 3937 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3938 0 obj [ ] endobj 3935 0 obj << /Length 3936 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯà9€iöƒ/``-Ùr`X@‹o6Á"»ˆ²‡üýpf(yEÍW£ùØ,6gÊ‚­±ZdW×»ª««ßÿéËß‹þV¼¿ûòŸâëøýîË®*Ûº:þ)ö_ï~ÿß•ãç¢íêâë/»Çâq÷y÷yø÷qw|àËÝ_†Oÿ+|ñçáïÏÅ~øãøKû_øe׺vøþïÃ÷¾uçêùûþçÿÚýõůû7>M7óòÿï\ï|×îÁ83õãîi™îðõÛ×_wï¸l–Ðùº…‹aø§¾øï?v? <½¾*»\h}‡Ï}Ûªî:?|nÃø‡¼õûÙý0§ó}UÔѽšüð•æõK¼¼í|ùòäXq¡qòÛË®ñm¬«¾ƒŸg­«ÛsÚim³Öžß¾Iúª_îåÈS#å‰Üðåek÷b=GVªÎè‰1¦ÇÐïÞŸþå±öË1Îòôh©{âõŸ/y †E´Bƒvï?¹èt6ÅÃOtÇ9ß´ÔÅ»½ééºâáÇ⻪rñÅÃÏ»¾l|ýâ#áþ0òña@ÑÒ«kªv+Æz¤UG<ùH<Ó£Güb¨?\k ¼Ý_ŽPÁyøÌ÷>#£!¬ ÆNu—’r®'ç• jb=C0Ôi© uˆŠÚ»‰sìÌEH» lï¯MR+hg.Ŷkì HÝ©‘^ËÛÊ—/ÄåsäeGø§ûs„4Uîr_{”Z”Ã:ÀCy>w©õΤv)Û„}l<’=Ë„ûâNÒÌ´uŸ|ÖL9 e?eçžÜêÈþ±Œá¸‰35 'FFæ;5áÛŽ¤ïÊ®¯Øž²Ø©8ƒÏŒáü©·5hÄMF7 ¤ê¨ÁCYǦkë×r×½å%G•S—a ÑKñºZ4C¾¨W as!åÛ–&rZcòÔÓa]óœ™]=‹á‰ü“yÁêÞ©_vÍY?ÏÁ °€_ÌËØ›ƒø˜ZŒ×sê8C/È‘‡7 ¼ ì ן?ßįOâ玮­«ÊúÎ7tÀ‘Ñ´Õ¥oê—¦m\ÚEÏóôè™Ñ;v¡lÝK{?z§æ92[†W¦ú„àbçÈ`MœŸ¸Gs®¬ûо ןÁÁ‚,áÚ0å ˆÃQ½ºæÉ«ùFyWÝÀ·a¼Ãyð3£¹8¤Õ¨Â.¢¯€LùJ)€ì»§òYŸ¶¯„4mÈ]|4áy^‡|سg"• ¢W¿Š‘¦¿ŠCb98’¨/§ñÈòƒR 6¶WøÃHÁÑ5Æ9~^ F ‘Ѹ„u Õ1΅йƒ<Ä‹Ñõýdë/ctm÷º÷øºyêŽP]ëçn.Qžx8™ÕªÀ˜Èw©L¢mÖ±ž˜Å› gô9šè&ØxBÇ rƒ½Bûc­"Ø… |Œ©ãÀ£G)\à}¬L050?`tÝ#j„')ãCo¹€,SAäSéÿ &²R0& ŸQ,Øœ|„Pß_®»gdbO…vsKžz›RÚ¿M­ê"‰~ÙNîjA÷UûvOQ&  [Al0Í’ªAaF‚Ø.È—aÅ"•¶ „Q_c0 vÖ3HNa{Ïd©’(4L<1c'ˆðt…ݤYK™¼ùOS²L…žq­p•$%ôSËàj¥h‹›Ú¦wS‹5åQñú{G ç‘(U”Tå©¥ây%uU([ˬL•àÙlè²;DnÒ‰ê²-¢”ÉоŸaI#‘³zyaöq!N-ŸV¡5ž·uÀ#øpÜ-°©o¦lÊìÒlz³D!×èãy©µ`0Ç`0MæŒÑïĉ² vÄów³—µ‹¾í§"¿„Y\Pg×MVpI®Ö¸ ndHuóÌ`c!vU6ÇJû·ˆ¿´™Ë ýyþʇ®:Ú*ø ßoM[ùÖMVpÙøÍ©ã³ç%ƒûÖŸEƒTÀ´!~F€€4AsîïÆôTÁýQ0Faº­0+…§}q¦§´À]*q ΃ÏcÉÖƒ»”áyðÛp×MBS0¯Ø‹/¸0§Ÿ€ù¤'½™>±”®1½‘ƒÞ€ØÁVœÙct „ZX)¡¨©î XB ƼCõ–Å+e|)¢_¦O{iàŽ¸ØÇÁýÏ+!ÀÏ`)aºwc\cù!:×EL,Á˜ßôº¶WÏéôIÙP,Ï„Þâƺ½WK™t».gþ§¶±Â~¦îÜ®)Mýyj tÄ6CÉÖ ó^ßú‘¹ÐÚ¼å¼å¤ÞeZ+Ìä¼ûÄë[#Œ´VB€bTèïžÖæä}‹AðUžÄ¢ÍG‘â.,MXCšfâõy¯}ØúÒ¤fk þä cÇ2®[õ!-ãjWÑêYƕ˸ Ñ3SNìŽ2Zt–íÁÇÜÐ|7ë†Î›Émó.Ró…8Ê™/$®Ç|!ó…²ð…ÍGÝò¥µÇŒ¹wýªIÂ.èwæž‹ Õœ»o)_йËßzAd™L¨$å&•6K%`”¹“àšZ˺Uæiš§iž¦yš³çS,ÙÛê^{§ýv΃äÌ—‰O—$#©HI1wR»9yÒ¬GpO ,g˜Âئc?š°ŽØrcÁãg Œø¬Q°v`ôãU0Ý@pýÒê¹óõ5þ5ž¦¨Ãœn8Z#š麞³ût;þ‡•ðf™‰¬2O\UæYeéõYe^eZ9­lù[ª2OÕûoóñhMž3—g\­€¡ÆoÃ8 |¦++åàœaÎñ3œˆý"Â'ȹBUCvÚ}ã4sM5§—*¤qNÅ‘Õ Jr«U'(Ì“¶× †àÖîC¾H³g@, ™ï´7vUÜúÔJ{ª>qØö:sØëÔꬻ¯šÆ¿¥=U¦{as4#¦³n)úPkR¸­¶r2³söÆ- #åäÊNk©yxž¤7ClÓö¯ßõLè °É{@„:Yæf`ìMe ·Ípe•­í%ö̲TX‹*õ8Qè•se]Zo[=†r«[qÕØ³U¿‹8™-ø5Ø¿5Ÿ ŸÃ†ûÑâÌ,ĵ€7æüÖªÌÞ ÖÄ8Só•L•+SÍ©ÍTUCŒn“r£öÖÑѽömk”^güN¦éÔl¶ÀlAæÅlAE^ ê¿ ¼á¼ùvûvn+wiuõ¬»´6¹ó´þ™kµþÁZ5Å-æí!¤=·»zž˜Òÿ̉7 gc‰L[;O]«Þïg?“溩§DE ¶S>™!£dô³Òìý¹~+•D}X¦’ˆñù…Šâ–QªbýšÓc¦Ç6`áûz!;¾þ~ÕêHp'´ª !qµsœðåñÓõCˆD7YÙ!윅„*¦Óª¢É£8óõ‘ãÁ¸öŒÇ¯¸7Ø7Úõ9w«£lÓñs_Òˆsß6ûåeíãdÌëWÖ z0cv£1eÆÙü¼\r}}§]d‘°$µ sód-éD$lgPôècwrŒ®qC¾Î"âŽU5§fÊ"î*ëH sŸEÜ·ÄDÜXfì9[Ä]%¶ÈæOêá:‹È>V^ûve«~­r¨~]Ýæ0g]rÖë‚uMz¢eýºë¹ ‡ƒkóu…½£B‘g&^IœsK±¶8VÝœ*è««-^¿/ÚêQ©íçH#¶Ÿ#â-íùbæd8ÖU̽ƒZ• Wë±â$ ›óRF…¨ µã1ÄÙøœ5ßú{¨™ŸâÆÕoߤl¦½Í•‰~©LR·˜œ=M¦R Q_—³†\;Ìž½V—æN†¦ZvŠ9mª…ƒœuˆ­f,ÛYÇ}ã-g¯Q3ÏìüœÎTnzõ ©ÀIDn£yÐŒ5qb?"c-¤å™ ù‚{…(…É¡+åuÕ4>Am¡®„¸¹kØÄ”#v?puækævôÄ4ÅRB@­Öï\ÿÚ¾G\ÆÃ¸º»Í_ÉÚ_Q•™zN ͺ×Ï9¹smu!ëß¾~]È6«ZsÖ<Ö@ò³Ö—9æ¶ë<ö ½Ó>±MßÌ$P”ÀÌ#¶Reë[«²}ÖÁ×¼)RÙÙO=\ 9=«SÌ¡*©÷’ö´šÝq/òèõÝq}¯^Áh¶ [ Ö·eýŠ’j.Ao0V/íÞ“Ý~FÛ7§&G3* qÎnÄFï d4iÆ'¡mÏâúN·¯ßÛ„é`½>¿åž¯ Íœ.Ħo³MËjš¾M¯o‰þ…–i“¨`™6Ë´áÑÍF˜±š³»m»‰fõHŒ®oõˆ›¬cGm!¢ÓÔ\~Nņi.ãåL4ÑùÞ4Gm!6ÒÔ\Up½‰—qœBÀ–6e3G9ë¡%â-mÏèŒwú×ïºpmw¼šF%Ë4Òù ®Ëøm“'®µv©::ÈoªÞi7§ÂμS6óN¥³æÞ˜wze÷!šF%Ë4’y§ßée£ÓÖdo×Z•Ûêʽ„ç0ëðU<¯gÿ|î΂×Ý)Ђ å &^ _Úþº ¾s{„Mý’¶¬cÓµ/FŽœéKï¯hܼ±à˦>ÒåŸ!ˆe ‡G~Gã{4ÏÈ'ž#¥S°}WÚŽ Lmò©·% NM×)`ݸôW EüÔë[8Ñ2~|¦:ªFwÑÒÛolË2Üþsõ,ccøS¸Ã#F'ï2¸G, Ca|Db pÉ” Bcr≻ù„n«PŽJâÅï8®Ö¿P—çTeñy÷Â˺9 endstream endobj 3936 0 obj 3898 endobj 3940 0 obj [198 /XYZ 38.2500000 174.500000 0] endobj 3941 0 obj [198 /XYZ 38.2500000 174.500000 0] endobj 3942 0 obj << /Type /Annot /Subtype /Link /Rect [250.500000 224 298.500000 230.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 3939 0 obj << /Type /Page /Parent 2 0 R /Contents 3943 0 R /Resources 3945 0 R /Annots 3946 0 R /MediaBox [0 0 595 842] >> endobj 3945 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 3946 0 obj [ 3942 0 R ] endobj 3943 0 obj << /Length 3944 0 R /Filter /FlateDecode >> stream xœí]É®ä¶Ý¿¯¨u—ÅAÐÐc€,4º,‚,;N`ØF:^ä÷Sõ$½ªCIG—¥¢IÛOEÞñÜCòû?}ùÇé_¿Ÿ¾ÿå?§ú¿ßy(ÎuYtÿœ®¾{ùÝœû?ÕMyúáׇo§oŸ>_þÿÛC÷À—÷¹üÛÿNúôçËÿ~>ýíï—þØÿÒõ~}¨U}ùû—Ç¿ÛZ]þ­xúûúó?üõ§ß®=¯ëóú¿¿S­ÖesÆÄ«¿= Ÿ©ÿüþÃoßw°ì-¦±¥ªNÊ{R­Õ§ÿþóá§Ë †î‹sk•ª+[k^TëË›LÑ\ºÐí¥'kíèM„ú—ïÜ–Úë¼¹ü´(S©‰î××ÖMÓMQU•Và©û+P^Ö7œì<Ž\|VúÕõô.¸¸eyéÿq‚t`qŸ»±¸mÃuþ8rñYé×Ó»äâ¶E/ýu`†žz1ým]ìü:réI–v.¸²UQáVö¹÷“_)Î$t#´²¸sÉ•Õf0jƘ çîtnêp‘Z7rñYÖ÷.¹¸ÖšÞÛê‘òs÷!æÿòO¸ÎG.>+ÃâŽzÿ¼¤<”î' ûæyðÝׇï?]®:}ýé2²î…}ýõÁ^þãš™”—ÖOoŠBµ<}ýùAçªVÍ%ͽþ^×òî±¥yúA¡»œ›¶¨tY<ÿjññ±¥<ݨW-F¹ØÇس5]NýÔ¢[Ø}ùØbÎ¥­®C|ÑR£gT{{GРü|ê>]™á¡# f/K÷ž_/2¹Nœ”U(ÕW¤ŠÇ×¶çÇÑãɺÕÒ–·¨Å¾#z{Z›Æ½iØ‚ÇG`à—âÞTC´ˆ~©1°ÅJ‰²f—ˆØ‘=¬ZuÄ Ä¨#6v¹IRxlØôï1ÅróÒKØ-³ ç@w#Pjx(€±BÒRê‘´`ÇÒ¸~ Ûlãþ*#SF\ÈYxä öæÈüaOEŠÞ8àÀº…_LhQ«õ‘Ð{¬TÀg¯5–.Žá±ÔO1 üâùïYuæ»°b1¾>ƒ=„Dzª>,·C¦îcº*ÇÍËd÷6 (Öƒ4¥Xݦ*´á/qy0ìR†PƒgÁŠ0ªŠÕî2©æc‘£¯ ¨“’ Ac!Ì{<ÏàyöYm m¡¢ ¤0®•ðp¡umWï"ZÐt«Ÿ’´Æ„:PŠvÕŒ,¥fò^¶ª!Yàd=):¶=8MÁ–yAPEœ_EËë±JqÙ9 ÖGi-¶û&¸V%ñ¡pÚlÕW±2Àfì­ûÅøW±õb¼}$gc´ßÖ®™êÅãfü¶Ø´ç=kÇ-ŸPËS.¹`lž:€Z>6U‡v6•Òî*~ˆ]_ÝOÀ[¨ŒÙߟ.5Ö™‘ ª2fék*’ï"šÍc(˜a1±=õ‹€þXˆÉDE¯gmc˜…Ë„¸v!ÔsAýMŒ‚ziF^Z¶t„m€eÖÙDÊÉ`\E‡\’ïÄÊBsRXv,àb+A´6 ‘j´k¤¢…>‘ô0ãÃáña hÌ“ÂlOb’Nqs4mX–`}×Sùe 3Õ K¦5’Œ1éäx Føx†!ôçÉ$ È`6¸¥ÄëC¼'3±üÇ®^ôڸȺ¤˜-`!Œ>fdÿǰíp¬ÌnR,Ÿn ‹aêvëú+&bøJGÞ¾~ß“t©› Ÿ2ñµÝ"ý¸p™'ê¤÷Öî¾[CؽÇXàOǹz}°eÁ»`4Šb!"äDfk O èÇÚV9~Œ B0y‡P¢›)(ÛŠ£GÑ­3²6œ‰ µÅÉd¾éfŒÓr•Œ/ˆØ™Àj+üËÃgO—ì‡M*¤djCÌVf'_ÚØ[©§…ãû"k𤕠º;©qg9Vhs7;sd¶ùÆþ£×°…£2$MVådwÁn&¼Loøw¹AË“`ˆ R˜4Pû¢ð:B²Å‹r¶‹¥Ôa+&«gKû‚탟¦/¢S}8ÝÝkXS™|L¿CH±ƒÇ&qØ…6¤\ÃH/aÔ”IEä9ÇÁs0ã·ÜÑ« ãøÍ”ËK  n°·$‚=t”½ÌèFlt#DX«.'årÐö¬Z™ü_Vë¶ôJµvE.f2•s*÷Ýß¶eÝÔŽmÏÞéþÄ„Y¸ùX‡@s’%Ù–®mßG™Ï3B¢ŸÕÈa«&Ù€Vözlbl”çŠB:ª•#[R,òý[o¢œ?_Gö"‡·ò“­"sêlѹ©NH7Ö´îzçýÝ\}p+ÑËì–ˆô†ôèÞ¬x[ÕA®Ìü]òÂÆímëÆNÑÊÆ8‡…Þ}FôøK=#ȱ>ØÜ¢ìì`?EÞšH Šy3>Qf{Gz‡[NF¹й*vVƒK‘Lƒ ¹·¾Ò+066TíŸVc<Ô –°_†ž§€6Üã—sd#ƒd#k´£eѶñ‹œQš~&rk"÷pC&çxêw Â4†€ dnÊ-‚üþ¯ z48•Øíóᢪ‰ç=Ûãubä…¤ÛpÒèé3Œf=¬³ÂX¥„‘æ£(¸AÁ8×â­5°ß¶î‰%á—z6‚Û~„׾ϮëãìÉÂxÚb9À±1^¹œ¿åüí¾ò·Ím•Ʋƒ-œ#«ÐØ›Š± tðÈv†/È-¹%·Ü[Kfi {þXQV×·D‹÷v+ž˜y6‹ãyƒïÁ²cà¼ib°$z¢,×›·>bŠ•m:–8·ä–Ü’JKŽ‹r\”ã"Þ¿ÃÕÎq7o†©0¼‹KÕÍ{ ›Þ_ôŒ€ŒØ¦<£X–“ÆrÛˆÚÔÖk´)G/;^m:\UMÔBâÙÑ¸Š‹«]xµ?,_<£Te‘DO-¯O¶.wd]4ô®8öõâ8Zˆé‘Ûk+í‘=µpÌ`¢¾ƒù‚Ô³žÖ”kâ4¦å`+¬q Žë±?õ@Gã÷Ü3 [ÈÃ!FS•´eqÀÑf‡ÀÓ¢F¥]á LDVw[›øo-‹§sù<’‰åɈ>pΈŠÃeDžj~{"#òÈ5ƒ(l޽3þh§3É0µÎÃÙòÀò‚ì@b‹xœó²°«¸UÙ£îÔ£Nž°mÄ]Õš:µg !/xí±­`ò0O¾G žØ™ÁX˜¨Ø?äA`‰êˆgFñ÷ˆž§žÌuX‹l@–7qyö* {Û¬a2ÍÞ–˜—#žñÑ@U¬©\M·ßÉœ/æôÚ€H‘Èö£l ‘áøxüd3y¾çA>DeÔ£Do ÁìÑ4|]SoòXoŒQb dâmü Á£ÉÙˆt6â±·ù¬!O‹‡Ý›w-%À¥`v-y,~ÆG„-R"Þµ2“ß}?ÞuûL+{£ìvìD÷Ð2Þh{ öì!dØÙ»îÙ»6z…wÝ^–3k=³Öý#H ^¹ïšOîâæ-óbžQVêBMÊXnÉ-‡lÉ^/éœò~¼^®Ùûä@Ø»&‘mj3ð×1Æêá¹`cÎÁ8u^œ¹*Wý•­üNs›¤}®\ήâZù:Ì9kÙr¥ŸfË%½r9BöIâŽ-dˆ=~7Uª'Z'9š­Ákšú^ £†ó fXÇOi’ÑÔ¼Ê;× ï€bΡØÞ.çjxÚr«áÇCŒŽ‰d¼f/N$S¯a‡å–Ü’[rKô–ÉìA>Z$“ñ[ŸÄb8xÔˆ§šv ç0éÌ~—º™³ ¯%ÎÖ;KÈ›¸¸ùõ²…LGþsôOϲ%Î’˜†$FµøzàËÝÑ‚WÚ¢{e3ÖÔ_ƧԹ´US—#‡Ñœ›¶xœŸç–NåìÙšº¼µ<·žyŸ½õJr£7…߃ÇGЇ8·žÁsЩ\y6ºQs¿ŽÚó=ðÒ̘üâÞFÞz¦Óu3¬þ¬œ?XÏjÈάûâ>½ñ]ž©nÜÑ~€ÐYUœ«Z½V£n½Ty.Zóz†ßÂÞ:‹¥ôÐÄL³€”^-˜P,¡¸“š÷byo=*ªÌ0_«Æ†ŸQXðñ3XïDçºÄÒÇ'nnMb9$Fæõ'÷3°8aõÀŸ!'PñÈhõ±^b¹€-Ú¦%AÀh\áR–ÇAv‡ëªt+z;î±ìšåë5)(a3¦l$Ù hE›¶v­(6oL\¬gØuir×%SI÷@% (éªhËÙ¢NÅŽSÑ^X™Wʸ Aú»zÝÚÙBï‰d„X °Ná`©?´™Ñ½épž+‹a’=™þV¬á˜)Še©+çëv§ªt¿€³1VäIdðšâ|g' žÀ¤RÝìÜ—{fïÊÄ,rZŽS7&ÏL×À-úŒCY(S5;7Q¶¨/°†0Q!°–_Ýcx/Ö€E5Ò)W#cAhØÑ­q+¸%ŠF–å(hÈÉÈ'#µvÃäÀ¹H‚µ5ÆU{l16Ê0h±,?`ªœè­÷`´Ê 0˜ÈÀRö† .Gž=Ñ{"¥´šïжÎ_…m9AÌðd©‘Êyž“ùRì¹%¸/L}ù8I2f·° †ËçÁƒ¥M­QPXÛ52Ì,>†ipôéÊ=?0áu‚|§Xi}XÆÊS†ZqÆ`yø(¢d§” ~cAdÔ•Aõ¡X{°àÃx%;Ô€4¦ î€0f ù˜*Ãâ*ËBŒ áàøL¿ä†Gêï«›SÆ¡ /©$ñw5P’¥˜@Ï*ÀÞ&Í~`ZAOMy g`fÀÌ­gˆóó¾H¯ðû"ƒgJ»a¶<®7fRV7:FÐ$¢ ä ܆‰ÀìE"Ù\‘¥EáJ7áÁ+Ò3"€aÖN/NÞG0"6‡Úî˜9nF‹“#ɇ@Ü}°cÚ‘^tJ†Ñ&V‹¦‘ ¿‡°¹Tñ^Þ²î¼Ë7'x{Ë™tΤ÷á\n Ÿ¨k˜“³ˆû+¿Š}Ô*ö-f >‡e Gìž÷àÛ|cμYsç ¾Í×Óž_,Ù¢RLOuårÄ•ìí³ó¤ÑCј‡Âûpn1¿ª«6¹Ü>g¤<š‡Žé š&²Tä<Ù÷žœ'ï6 ¼0U Úܪ¦‘A4Ū:ŒØÝ&3Fª+ñ·N›F¹ÊxWÌáöi‰œâ̹ ¹ÕxŠ=‡â/à±No_¶ÕŠÙåtBÛ:¶¦€ÎÃ%ž ;-$i14u¢á‹¯&N蟹'jX=´M¬ÄÉ­ØîÄd(¶fv%ó–0¥"´Ëò+&FƬü sk:έü†áňr ¶gîtMcå¥8ÓÇÙ¡õ±äMã¬%‰Ì«-W15²½MA7f(f{K®éööŽÛ[Ïì`Ýf,ƒí2Ü |w=þRÆà/…5ªk#~16‹5ã´¸nN°â3ÇÞ§Y1â?BY],öðJY„r„Û…=C€Ùt({sÇ‚;™©£åb 'zŽuzÁHtDj¤®¹™Â(u#Îþvõ_&ܱžr.n #Üéσ¥'ž†(Ú2›<ÏàQÃõ)‚Ë[6®^¼TÇ—ªWv?™5µ`4­vFc»Pö¬Õló.z{…çľIJ“«Î_Çõ$©l¨±l\—øºÂª8_;ìîAyñƒ_¾xd9ŒôW±¼»|ñ´Pé’98Û£q B-þ£À—§Tµ›É`Ê@M„G¥hé8‰† …q@ŽÆr4¶“hl‘\3dqÜ›p)‰˜Ï{ ´ÿÒ°‘~2¶ˆâ 5ÏÎdÜð¶Ý^$Ty.ZóÚÂÃÑ{õSzh àñIŒµ³"ž€ƒa7-ò6»ts?¢u^r™’tùZ'Ïɶ8 ‘½Y(=@ô ×-eð¼)ž¼ &ð­µÚuž»Ž?B¢h­ëÔ<0A<ŠcU4kŽ?Øõj/+ ,óÊ´ÈLÓyá…–½'Ó"cÒ"+U¬9Ò"ÛèÝês¦Rf-o£3•2S)ßd*%íeD¥lNª½xèª <ª§À£×k¾ÎótÀ–^˳Ñ/«åϨOð™=ÓO®2çÚ¡†ôˆò­÷t"^ŸÍQÁ#xg§C嫳QÝ*ºByE3TÞ3ü¥xµôW£Þúø¥¸7ü¥*óWOŸ&Ëü•-ԈܻżØí³(<%0Ì‚’ݶŽMÜ‚aRà^´2AÁ滢†1…Ï‘ˆ,+\ÕŒÅ÷Þ~—åŸ÷tÅÚ®äY,ñÄv¼™Ë³Í+ +d‡»ñ­²ÑΣµ…y-:·ò·ù)DÊÛú)˜ksÄ éJoØã1¢‘P3Uò0TIæ ‹N$5)ëiÉýrø3×#C!(!ÏðÚñŽG1ò'1ô‰ùÁÄYyYäún<Eü^P™—¥.fBÙÖ±u\ÚÈw^„d¿Æupãj,&’íÛ>Ïðô†Ç¶íAiJ•®8dh®XÍ…e®Õ®în•%PeÊqE½ô.Ãú—íËŸÓ·ËDxçéóÔ/Ì˜Èææm4— +ÔuóúIÛ×ÚrKºi©oXÞŽK­‡Ë1FV[zÐTŸ+w“¿V0Xú€Þc¦—[cûÔ)º(‡öyHìpVÁè{™¼Õ}=áŽn|†Â½ÁgzµV‹>ý…Idîúï—#ÿç·@èk ËDàG@ žïH ?üItžM endstream endobj 3944 0 obj 6116 endobj 3948 0 obj [199 /XYZ 32.2500000 655.250000 0] endobj 3949 0 obj [199 /XYZ 31.5000000 656.750000 0] endobj 3950 0 obj [199 /XYZ 31.5000000 522.500000 0] endobj 3951 0 obj [199 /XYZ 38.2500000 487.250000 0] endobj 3952 0 obj [199 /XYZ 38.2500000 487.250000 0] endobj 3953 0 obj [199 /XYZ 32.2500000 521 0] endobj 3954 0 obj << /Type /Annot /Subtype /Link /Rect [76.5000000 629 120.750000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 3955 0 obj << /Type /Annot /Subtype /Link /Rect [90 458 131.250000 464.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 3947 0 obj << /Type /Page /Parent 2 0 R /Contents 3956 0 R /Resources 3958 0 R /Annots 3959 0 R /MediaBox [0 0 595 842] >> endobj 3958 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3959 0 obj [ 3954 0 R 3955 0 R ] endobj 3956 0 obj << /Length 3957 0 R /Filter /FlateDecode >> stream xœí]ÉŽÜȽ÷WÔÙÀÔ0n€a`´ðÁ€ >>ã ƒ™eüûfYÝ]ÉzAæ«È$YM ¶4M‘ûòýï¿üõðÏÿ¾ÿå߇‡?ßy*ŽuYô¿§ßß½þmŽÃßuS~üåéÛáÛÓç§ÏÝÿ{ê_øòþÝßþw°‡?tÿûéðç¿t?üÛðNÿà—§ÚÔÝŸ?ŸÿlkÓý­xþóôó=ýé7‡_O_¼,7sýßß™ÖYÛžÀ˜XúÛÓe›æüû¿?þúô}€¸U\Sù²9ïüÁ´Þþó÷§t \>_[oL]ùº¸g¡ÚžWòî`lÛ¡ÝúÑBçß:Ÿ7 >ÞýJ÷ñ3äêX1®2ò×ç}÷†þN®Ýœn\ÙQ–iiɪ=}ät4u•àlž¿žààë—é¨ê ¹6R.D?ž–¦êî?3ÐTí;°*_'8÷çϧ ªÊ6é>~†\+U _×<ܪ¹\érLE øorŒÆ™„”Óœ±«Œ•Ëáâ¯w¼ÁÖ¾,Úþý>¤5.„xùzŠ#iË„—ù y" ?®x•›¢®ƒ·¥>‚^>Ÿû¯Ó ÿru¬ g;þú瘯`PúŸ³ç›ð⻯Oßêô‚™Õáë?:àú5Ï|íR¾;©Âr¾þíðÛ$÷»ÃןžÚceË ˆýû=qzR|‚OZ¸|b|ü;á“&þ †Íýß)à:†€ú=|ÏÔÃ35ðL |ÆiG8«y |‚ßÙ4v>~í˜Or¾Ñš •¿Ë·ji¦ÏN „Mr¸Æo†ó üC]÷óKÌ}ñ=a`{°{ïˆS¸–@;ïœóùF§fñ|#+‡óÍ2OvšÏGóòX[Â'økSwëÖFAØð.OŽ’3P//á;ø‰°SF:.~³(ùŒm†š9S„–4œ\Ž_Õ÷Ȧ!mª]ûžqví{×¾×®‰'‡é€Ó[Fý¿*Êèÿ•õ‘•wê«¶`I_ôK¶ã¨èU8ô®Ï]z!RŸ¼GOLéŒ;:Û˜©/Oz’oŽM[œ±ý‚êþfÆç‹}¤¨àb®€_ƒÛ vÁÆàŽ¥¯šzÞç1þö\^P>ëœð×tÙ¾SÂb¨› HÞiž­Á§N e´AiŠ"^ ¦¡©E‘¨@øŒ®Ñ ª¯@T˜?àİÁ¯1( À¼+‚§`Î)ó¡÷ÄŸ/Ca´ÇùòÅù ¨ëns§Û´ôtw¤ñÕ® U>Fc>…T¾ÖkÀÆ\xÒ ¦.xwÃK3ž0ú# ópã8Q8’ÁÌŽÃ}a!&h*ª¸ˆ°cDì ]ð2?­èm;f°‹Þ]ô¾eÑ«ë¸K/Èë~~}i͇xùö|XuU^sÁ@Õ3“IïöªÍ3»c<<R^Å6&äŠp†Ì:Œ¥ßÁÒ¾Ã(z^ÅÚô´q pyM‰¡´LV¥9gòQ÷ÛrðÁ2Äš,±Nfž—ØÁ5˜Þ/lb×ïŠ]¿ÔR™‘PI.ȪA¥|YSpÚ1#*æA0È!ðÃT U9œ:d¨«N0R‘‚ŠÖÁ¬à}ý"Ô)LT)yS—rq*5áGÐ’j¼nÕlu>R2bJ®hG¢°h°^Ì8ÂÅÔžôXƒÉäÒØè!ëꄱm˜$…_“a£Ê¡³åÞÕî™á¼G`:H¥øI6gðúôY!§k¾2g??p05’a"”6Ž¥9s“2xCí[W…ÄOø…½N“ fèr?F¢¥õæ®@×LlBæ|®Å$jÆ$º®Å-…ÙÁ?y_¶§À HñgÆó±þ›–ÖÃ]ù:`뻇»Ø=Ü€Z;Ò€ u8ù[¶*æþؾŠAƒ¯=|âªSF?jÊÓ…SöLw<ÁíÙsööœ½·%ñrdÙ¡J³æ°ã¤Á“ÁŸUÂ$¨5ÚK‹%j-åˆ Šª„>ÓÇnZPÞ ±%ÓÇt“누/*Y( UNSSº`ªXÐÈÁG©ËksE]Ò¦Í aʱÖ.¬ZfLÕâ/É]M ǪmÓåŒ)3Û6Ôö/BBH0»‹ Ã1Úq«©À!(©¿©vøø#r5rÅ6F§t>†–Öëc³¡e±ûØv»ÓmúضU2ΛÐQ~Égƒdp­ÕÙ•­\•s–†92Ô)ÉLÃÊF ó¤Ì ³6¤u US°ƒ Eè^ˆÏL#cƨe¥6‡SCÌì³gž­®—"ÓYðMëÆUëú©ˆÑò)*áEàÙLx6î"ª"Bœ”·J5”÷v¦NéF­bÒYt]i!…Sã¡t++2¥^m´ÅK¤À’šƒõ·;\ö,©ñ×Kž¤•¿îF‡Ÿ ÄY‡Ì´Ñ©Þz§Eï ÷ÒÔcyÙ_ë)Îøã¨Ý;ô5kÑ;ƒUy ‚þT­AqÙ¸uà~0®ƒ!ÀPc؆›IŸ¨|¦ckÛ 6˜Îƒ*µ#”–SÊŠ#Ê#ú¯aM”‰£ªô]cB¡L¾«J¹!Ó'—˜`¡“S˜IuXcŸaƒg|ëvq"f8è¶,Ýö ˜ÌùIY€hÚPð%vÖabÁ¾Ì°,f\eø41!cØæP.çå$Ì… ·šŠÈðjÔϨïÌ>¯RQ/ʻá–—ÔìYW9S{Ç,×”6@ Ž ¹8ó€ÉÀDŠIÜT”:eЇ¶ßäqG‘â6‹sÍ ¤19eüvø±É èiëT²[•=}œÚÖÁ’Ý |VðÉ@qåѯFÔ;ƒr}ë½3ä?uÔÓ£ôÕ;Ÿà×ús0ÕåˆFtÕ™Ë-ñê£éeï& Nxˆ¦²Á)â½]¼n7η€»†ïXø…wøŽ[gª£ë~µØ ù‹ ÞÀ¨ý`Ø0˜Ž„uðN?ÄÓ«€Q¡†ït ‹ƒâ¿Ã¬ƒ÷óÒ5þæ‚;ø´!wÂ_cîœÀCJâ–àSÀ\J‹aŠÇt¿w:h··p=Eécù®h.(\,à°)çÙü¸ 3I@p¿GL5Õ]8Wa¨ê,õ˜YnºénºÛ`æ‚¥˜Ãw”LQ6¶upÌ ã,ªÑØP7ÍiV>(–2Œ0´|gNLOÞ¦=¢¾x÷ŸlM¦0Ob¥‰É´ÍU*ú¿»¦¸Ð‘…Ÿ,?yÀÈ]ù¦1j•ÉΠR——OT%õ5‚0˜|Šçgeî·’´«¡+KQ=у)@PîfÑû’¨·ÊÕû’jL•iò£x4<"ÔÅÂ:‰a~@ßÍલÓ-å,Ä‚ ÌsAcdr<äšAªé <Íkª0WTÑÿd9™IVù€ž\˜)¥Ó™àuE¿Ï<¡?D3>ÄÓYœ¢9žÞÿåÉÖåëüüôEàiØæÅ½Ð‡^p}ŠÅU—uØ|¡+HÔuâ1®õGw'P#“á!çëMy}wâšjÀf²_6]bùÛõ©Å1ºý£lª{nàⲥē1]Â’9|kÇ@åªt)`7ƒ%0Še 3ûtÕüiªêÂÜ¡*ÊëU“jPÎúªzFN¦bßÝg^dó™G´-Í•†¼‚Ñ&8ð‘@1“É•+› §‹ «Â“õI–*¿üä!æÚàŒ,¦KÌâõï9ƒjµÙvH`ͪ›®ãŸ™iq°f—‰…0Á¡ÈnäeunÖÎNS†”˜*#¸ØðlZó?„ù,˜^pK'&!Âæ‰@Ã…0]z|¦+æÞ¹ ŒCc¿SnÒqK51Ó P¯ƒ«–æ®Z`iŸëàiG˜sA·‘àäc¡ðF¤{`}ƒiï'ûð×GÐbñ™2'GHW&AO Ä)="Ï}®gÜ3†Æ0晀2ÃòLt›œ€h°&ޡ֧¸ø=[½5ÒÜ“2³ß³Ç»g‚E†O¹Xç"šžIZÃV1T°²á)8`Öan‰®­†mvõÚ9dóRV¾sÈrÈÝk&ÝôÝk¶{ÍdŒî^3íóÉ!Û&Ò„šÊ]#J©¦WwN0ÕIe~/L¦3ÕI1¢êpQ&ý@yêŠêÈìlù"L ’ùÔ%äž1uSr˜¹F¸÷npÃÌl'z{Fô¡ÐÏ6¸55|9ì©RÜ”u(oVx·î8^ŽÃ¤3&á*¢Á!î£5ù$‹-ÝšçÝ‹ë€ÛÔÑ'³‚òœ£+÷sLuŽØæÆ¹bD™Çëàwð“ÉjiÛào¤›æÒl©u4Úåg›¨ŽÓÃUJu×”ª20"Wkê½}þ6öª]„sŽM tq7G£HÐ¥JÓ-IÒyÊáƒe÷J&ë{œoH3æ²JSlûŠ‘ÃxBðýaØöh™<¿Ê^!Ôã¨uÏIGç T4Šõª²k溎‡^0ÍÜ1¾É¾åT”« a¯st)ç·#pÓBe°ç“Î%ôS”¡’Ù›“r*„)ª`s“è¾O‘f𦠦BÙªü÷É'J-ìuG0-B”&‰'w6ÅK{Fر#^uOwí¸)UŒ1Ù3Yè:9.±ŒnÛ,6æ#°® vðö|š,è yûëJè4¢:STHÜ`ºÇ¨Î©Xr›oF ë1Æ'ï±RuÞsÒí,ß m 8ßr±´J_ӴܰÒ×Ôþ¶Ò—tÍ‘¢ù êäî¼YÐy³A~bŠÚnœ¡˜î×l3R¶:¿wêòµ*‚††M¦Lñ»ýNÙª òq‚'΄È£:mrMÐl:æ0,9´*¸Õ@•)¼™oP¨ÔÍ2Yx¬oÏŽÉ7ÐeÕ[6vÝó ‘{Ð#^¶º¶ Xæ›ëQ›Rµ6Ä®j¤š"8¦{⼺ùÒSׇF¥ÓEØ5&\ö‘ ®G: S$ØÓD*ZÍQ¸ØÍeê²ÃÍAð¼%Ür2tª‘næ„.ÄðY¦=(nWD´AÙæ¸LUç 6¦¸gœ…r3d¦‘¦KfâÓØ7ÎeÚ#23¶ ˜2Í#…¯áÆJ˜oàˆ†Á'%†€™3¾ÉæÎTÃn|ç:X|î4Õ@“hTHaÃÆì”‰ÃŒÞ!x¯pKˆy¤Gú!£tµ÷ pÁÓº‘šÎ«:`ù›.4EÕ…€h ‚ï ÓD—ieÌðšŒíu›î_Üs›tçŠ3g¢ÚŽ™šlŽy,ƶÕÝ ?y;· ûÞ ï¼c¾v.TMãûd—Zù4dfÐd¶›‘SÖÖ÷ ûÈ8O½1í¥é¾àQËuÏ U½cßF¦2²›·¶â `øÃƒñ!Á‹€wªjI |ˆð"P:v¦ýPÑùÉåwÞ‡ã­ÀzÇp<-®LŒ&Òå½T †ˆ©êT(C=ÅùòhåsK]U C XBæñ‚–©áH™èk?xä 5 K=Ư“Éë%Œ&Â8À¨BMñNü5f§øä=ÓŽ¡‘!²Mä|\uÍQwFRêj Þ¶ÉC˜Na4¬®/YdʲúÍØÈÊܱž™Ñå ¿…ï`ëŒ:9&rDØ”‚m¿&Ø¡üXÄ<7½½dÒíù¢Ò­Å7Px40q7€ªw‚Ñ!…øŽà,?ü5LUp§%Ì‹­&x<ÆŽšl2¸$ò—­Œi±[gîÉÇÚ‡:K\hÍCuý x€¼ wÚ–9Ù `ò  >SAî2#ÄxÌIÈ«Gäáîžì;æ Æ¼r¦LcDf8•ÿGØ‘¹|Vº|Cð¨ÆÿrfѸ2ÍÍ ²\ Ïcùå’M%†ñæîzÚ®§‰”ˆ¡.ÏQ³öÌXWÝ“3˜CnR °1¹6»fEiVËËCÆß)XdX³bbæ·Ã<-«žÖ4Ówsñ'ºœ ˳½zG»z‡ÊV 8ñ¼ÛÔý>|ë®x«>Oýƒ]¥š›-»Œ;æ4Ïî`ý5nµcëá®oôÅéõX{´çΈc®VŸ uö8ÌÓ{uÞ=·&}@ë8ØKg Å[°}v:é7p\Ü_Ê¿€T@`ͰõÑÄÓ.p³ Û0økð!ÍÁDmýU—%¸Óß;ˆ¯ÙÑ-Üá',ž!I``•7ÎH8×âŽÀ·ãí„uð‰ãbj„'nॢ°ƒ¡nºpÇ+Í#1Ì1^7ó›d½ŸŸŸþžíte endstream endobj 3957 0 obj 6741 endobj 3961 0 obj [200 /XYZ 38.2500000 553.250000 0] endobj 3962 0 obj [200 /XYZ 38.2500000 553.250000 0] endobj 3963 0 obj << /Type /Annot /Subtype /Link /Rect [153.750000 530.750000 195 537.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 3960 0 obj << /Type /Page /Parent 2 0 R /Contents 3964 0 R /Resources 3966 0 R /Annots 3967 0 R /MediaBox [0 0 595 842] >> endobj 3966 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3967 0 obj [ 3963 0 R ] endobj 3964 0 obj << /Length 3965 0 R /Filter /FlateDecode >> stream xœí]ËŽãÆÝë+´0Öƒ/ 0=Ó ‹i #‹`'0l#/òû¡DRj‘:Wâá­")1»']f=î»nÕ=õñÏßþ±ý×ïÛŸ¿ýgû½ùùùÛ&ÙåiRÿo»ÿóáý/l±kþ¾Í‹tûý×ÍÛömó²y©þý¶©?øöù¯Õßþ·µÛ¿Tÿü¼ýáïÕ/lþ£ýðë&7yõó—ÃÏ27Õß’ãÏýïÿ½ùÛ¶¿í{l‡k&sþÿ?˜ÒÛêoÕ4® ý¶i—i~ÿþÛæcM€a£¸¢ðÕßw~»ÿýö¿ÿÜüT ÐvŸìJoLžù<3Pn÷#%iÕ…-“­·io ÃîM€Î}ž†ëü0suª—¹wM榶h˜ëò$:v‚þeæÃu~˜¹:UZæâÞ™[çjY€¹§îпty®óÃÌÕ©Ò0Wè]“¹ÞµvÓø$:u óÔ‡ÓÜzæêTi™‹{×dnZf5Ê.÷Ô{ògû~ƒ Î~æÚDiY ;×äl^Ek5yªô tê>@çeH›p˜¹:UZÞâÞõ˜[V¿mn¡¯·ïº×§™Ø"×ùaæêT©™+õ®É\çÚˆ¤tHtê>@çi8Ímf®N•–¹½Þ_†ô‚§RÿìÕß„Ÿ^7¿o*bfÛןªÉÕc~¼VDI·ö[Ï*DxýqûÇ$1þOÛן7å.³i;Å-îË¡åùµ"QðÕU1nÜÕ%Ÿá7üÆ¢ûDŒSL=kWFäpjg!‹%˜¦OÓL“¼2o&“géa>'f×d+vE™œ·4¤¾ÔR3ÎïªMzzÎWsúE†:iè£5pzhq»ÔgE~öMNôæQ‹.¹lA¬çùÐ’îœ-Ìù8E—øpÌÒétoÜpZ˜ºãÚéŸZð7x¸ åNà&W²x`¼ (ðŒ*ß¼ÅjYIšï}âìÜ06òxÉÓÀì¿õ5¸Í·ygm‚bÂÖ[òOíèY =æÂÕ7žùÝê»®¨ Q.˜T¬³}ÅïþÂ|ncWo<½¡¹ÉÊãNn§,^±® _”{V¡ßx $üÆ$D 0À’L.ï./QûõöBf ñääŠcMúȲ°]¹H;MÅöx=ø a®ú°A±1IO.>.ÌÌDޱ/e\lñ¡µÎ˜²¸90ÇöOðFX´{‹q„göÏä¶ø3s¾ÜAMGHSRÂq` Îâo„<؇Å-BsrͲÇLžÚ5ÖŒì`þàq˜•&PªðJ±„` ŽWú¶ä°78ŽÇ'XKðz =À<zƒQԵ؋ÇÌÿɘ“Kªer‹UŸ¯lñ™PĽ“¨ÒgÇœô)Ÿâ 7ÖT¼‹›<ªHñܘ[Bk„½FØ¢$âY§D¤ÈÜšû¾¸ð±O§G։兹17˜&Q¦÷,Ÿ3÷»Np{&Qu6æTu™š.då×[BÊ·„¨Zâôk&ÚTÜ3v^™¬ØyñgS~K;ì¼fêú¨Wûʲ Š]Í`cÚŠìqA6ƒKrOø^&I;d\½í Þ6 \[kº¹`EÀÂX^¸EM‰‹­)/.6Û¯µraùù&ÙÕ8_½É\hi"Çtg8Ø o„qJôMi™tWÞ¼ûæ+ì­Ö “µ¼:µ< YéÎRKB¾s= §á³Æ3hÄè87ø…ßPÔßs«£Úlçjöô¨RÄ‹´+ã9œ Áy¿¸·µø ö†yõrÒÝ`Í„ëi2>ƒd#ÌKØ3”d8kAö ˜Þ4»aZ†Ç©‚q»ÜtPËòvœ¤3nÆò&Ølë0çÂãi&µš/ÄGìÄ>¿ 3*„Æ‚âÀASKXøƒ‰1Ò0ñæƒ`¶…Ë€°à›|\dIË1DÁßÄBi,¼KôÞÔœ¿'Rÿæ&en·QÎù®‘êbP |¾]$Vù=:šš‰¦ÏÄ=/¬Èö¯l+âÓ÷¿øeó-Ø{#Їù´# Xsß‚Ä01ã°r(Box¥Ðk2€Á‚±‚î‡K0X¦W7•&¸^ÌõîÒ{лèhaž‘ŠëR ±çm"iBsåQ\›ÍsÍG7´Pž.j8^Ïó•Þî1ŠÌtíó4ïÜd^‚¼0/|Î P|»=4cÀi‡X•»ßŒvW,pC³ã©e`þ5V,ˆCÏ›bâ¨D#lÀôŽ#Äî1BÚꈎp',ô†5 «rï©•œ‘ëXÔ–ƒyEy'È%RÚJxºƒ`‹nR4V4GHa¢Çé_‡£ØkÛÅ( ã ™b‚o»ÒÂtœ$•ž`ª~›xçjÈéÅünÂr…ÓVÞñˆÊîq³Ÿdü¶îËHº½õ$rÀËTŒ²F^ˆ˜KŠDœ0ý¾‹z²GX $ר%¸[3‰/º›?æ\Ò[`'‡Èjï)@Sé<¹ˆÏ,qˆsgz.X[âš*•‹u.‚iÍ\W±Ÿ\2¦-Q™ß!Ać×J“eçÓP*µÄ%4ºO}7L‰6†Ò!®ì3ë‰X¼]šbLI§2(= Oàb¹œxqi“Q…‹Ô¡(t‘2Æ€60°½3Ð è89EÕˆW~XZëÎGÚ¾ø¶psÎ0Ú°Lx`MõY+ÆòP¥€³ˆl6Öx™^ÇÃPÐl“¯4ª}9>9:g8èîè õLéãXB]ph&žZ¨vc= ·=q<åF=K8ƒçÅtŸ±\¤çž [äzt# ]ݼ7k rÜOIDµƒ£”|=S_$Ý‚<»1Œ ‹„çZ¦…œ½å:>B##våЛcâ#Òeü%-º—‹©Cq¦` ßËœéQñu™õÙ˜S™ÇÙÃS6Þ bfÛ|1 hs‘ÑÌÝùkለèbÊešŒ}[!L¯y"A3Rb³^é<´ÖŽ9d´VØÉ1·8°O&"Ïdf,cØÖL„9­øIBV?•¬ù59‚òƒoÎÂç¦×ÓXšÅðŸÆÅxîJž)Íï$ÅÊ3©Øë8Rã ÈbïGA†ô°&/ \®(Á{f×kF·„2k8§~ˆé»Ç‘Q& Œ™(Èü¨–äß[Úy™6`™²s)þ,séq|íšâç4c™V5†n^I5äǧù¢½ö ñkBƒ[AÀk ûz5‚ÀèÁ½áYãÞú@Šðx>ºîs Ä0“ HÜJ¤wÃÇÁaºë‰…Ë¢’– [Wœu‘!c©Ô†ð[C(Ú´ã.1µNþ*…æÓ@ááðb¡.ò(¬‡³Ó(ü´O°…‘Uâ`kz 5 ÿ—?T^iÏ ah¿H'« ÐnÏÁ] úº¾²´]×w»Ê. Vz{[+bnB é€tˆ9fö¬*ÀÑPP…Þz“íÁ2È¡ª;A2¡O¼Ú%YœçcæçàoM˜/õ`êqdtî‡ÓyùxŠëáôlÀ2eç§ 3¦.òq|íz8ÍiÆ2­êLtÓ© U޳<0†Ã¹V{ZË ¨Ã¹yLU+„µi­´Kî®Ò.]ýîZO§‘b„©ëÜLün:¦º»ÉWjÆIߥO¨"gÌ *Ð ŽÃ`Ö ³Æù¬Ï¸7 éÚus„åbÞœ$ñš7Š£Ïù zÆÈ¦<ƒÛMØX£Ñ ´(¯”ÉLÞQˆþ±§Ã³ÆžŽØM¯gsÏ'ŘÂÊUÏîOÏ„=;±³4Ç\ª‡œSF[`Þl‚\hÀŒÃh ~_ÇvÌžÎzî²LÆ”ƒ®Râ}, ¹æU%M_óªsÈ Í9dzæUEZ¯yÕèÏšWU/¶-³ã󎱊m™r1\’…‹Ü˜"æ‚4(ý¶@âz²õ4Y¡ ¿&ÐpÀOw&ùºp•‚#ÍJˆÁ¼ñ©ÊýµÑsátCE¸sÊÜ*ÆÉ]æ†SGÜë\‘‘Ä;Îë½è…Þ‹6po2cmÄëvG¸1MÜÀclõèSDëAüîŒ^k‰²:cÆà¥(×m357°E¨ÛÆ6–©ÁÆ>ƒ©ä"Ș0+eê܄ްü37䱯…-)žƒ·È:t [ë#‹¼™(ÐMÛ Ó°o‚$bº±w“­ŽãÁÜ|G˜]Ïôv]¨Ž *t©Ê\¹£wÕJ`FÊqµ”rÕä»lf§ÄT‘Sþ]¯”‰æÿ.Ð-:ÎRÅ´ëé >óïx‰ ]ªMééÞ¢¤eÖ“ÇiTXóÅÕÑ*M/F!<,2§.X"ó'Dc±ö)‹´Oó"×ÃØ[\ç<ü«MÆ<Nµà ³óÃç8F!dL@`µ’ø,±pnƒµ)fÌœOöÔ¦ÕFKÔÁ;%áô £„Á¬s‚¼a,Ub¿ºLžÆBR‰Æ9â-_d¸k•ßµÙué‹äwç,˳'T~7i{OëG½ñ™Í¼ú¨b}P™8Ó‚ÓÆÂî‡êàÛÿ ÞŒni¼ýÙ»-É0(Â8îÈöÞûêÏö­²ê¢Ñ¹öÜàŠ‹àU•ÉHÌÞüom늚C±Kwókªçh[åvgMÑ©aªÃ¢¬ßÒ¸<»kÜÏ;î(û_Ð8îZ!凉}mVÚó€ ¿±hø®UÁp*Yh\ê>¿¢ –apoð›FMÌ ¥¿»ÃÈ ÜþïÕŒÏãl\|7Hš“ÌA"ÐdÙ/ðHàkiGÐÛ@haÌq¼R,ã*E<ëb¼då‰Û5Vé6Ãü«ç»jz_¶/›ÿ•34¶ endstream endobj 3965 0 obj 4495 endobj 3969 0 obj [201 /XYZ 38.2500000 608.750000 0] endobj 3970 0 obj [201 /XYZ 38.2500000 608.750000 0] endobj 3971 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 587 119.250000 593.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap >> endobj 3972 0 obj << /Type /Annot /Subtype /Link /Rect [89.2500000 572 172.500000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 3968 0 obj << /Type /Page /Parent 2 0 R /Contents 3973 0 R /Resources 3975 0 R /Annots 3976 0 R /MediaBox [0 0 595 842] >> endobj 3975 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3976 0 obj [ 3971 0 R 3972 0 R ] endobj 3973 0 obj << /Length 3974 0 R /Filter /FlateDecode >> stream xœí]K¹ ¾÷¯ès€m—¤zA€µÇCÃrrv³ »‹89ä狀«ºgFÕ«ëkJ¥êQŒdœ‘K¢HФ(>ÞýñËß÷ÿüïþ݇/ÿÞÿ0þüðeWšªþ³?þùîå/l{ÿ¾oÚjÿï»oûo»Ï»Ïýÿ~Û |ùðçþoÿÛÛýŸúÿþ¼ÿëßú_þ8þ£ã?øuט¦ÿùËégטþoÅåçñ÷ÿÚýåwûߎ3ž—yýÿ¿3]eúÏz0f–þ¶;oÓœþü÷‡ßvï,[Åu…+íÞ”®Ü›®ÿÛþ±û©_à<}qèJcšºlŠ{jìi%×ííú™:7YèôGiú“W΄›ü¹:VŒ«<»&qkëF5!Pô<}€É›.àä'ÈÕ±r&.ž]“¸–í¥¤>Š.ÓÀ¿±& qO«cåL\<»"q+쀠ãªúø¿Lbòº8ù ru¬ŒÄf×$ncªAMC—ÙC ¿9Îlò#äÚH9“N®IÙöÂú!î‹éõ'·… xlO‡R¸ÂìŠÄµ¦–s!ð™>Ää¥ 8ù ru¬ŒÄÎþyÉ,”á7à:÷Møðý×Ý»O¦4=2ëýןzà†5O?¾öH©ößMüªýqÿû¢pŸþ°ÿúó®;Ô¶:ƒ8ŒØïá7˜~óG>._ÇÁÛÁÙZâ›÷p§Ír¸~G¦† îS[ Ä^Gàƒ ÷º¿öG2øiêÎAŠGŠjùˆ°Aÿ!' Ô‚p€¹Ï| gÓ…€Ù©Á’ žga6(k€O >µp¤ÂT`äm5Á8 `¸ ò(Æ(̩֮gp€5²Àñ„fðÆèbCÈ71Þ-n¾¨Áº2 &ÈuÌ«Ëu¬)[ˆ°¾„']°×kO˜Ë+ø ¡ôÖ¿QœÈØÞªö5Ö`ÌNkŽÐïÞ˜³ÍX%øQ®—ÆÝ#×á)qå0W0–;AÜ™šº:Áã#·=´ÇÙjºµk#yËCé† ç­ ¬çýßÚ¦š"·õi× ÿ¢FŒçÐhp;E‰Fœñ€Ÿ7d†IŒ;8Ûš~èyƒ×ÁÛ˜ ºqQù¸@‚ 'êÊl,a…Cb l0Ù1FÄÅ({—¡rŒîA›lá¿é‰ƒ¸°-?‚¤ÂŽÃŠel€¡N€©£Æ˜óVŸòÇ™Ù*³ÊúÚLàõÎê,½nÁûøÜüÌX ¤Ö„)±,Än*¬&‡û AÛ„Ê'ŽÖÖãÌ:‚$òÉCñÅEKŠL%7YLA¼Þ)”iwAN0Š÷CÀ¶ÚadLL1æ,•€ŠÏ¦ó4Ÿ¨./@$ † ¶lT¹äiÖ‘iŒq>½tÃùÒwa…<¶˜BU2P`9æWB­¨Š±­&Hv,F&¶ÜƸp[ëfIׯ ª¼jA”ŠG°NöŸƒ¶e婚 ÂÅŽà£b®ÜäìÊ.9Æ,gœ%kù‰0º›iu›[WàÛù¦8ÔyÍwßCØ0ùßßLÊñõ¨½ ú©7Gõ¸nÓ‹GS/sç$è b5¤_´«| ‹ B–Œ¢t¼î3ÁêÞzÌ­šQ›ªbk;\0°#fê œù¬Œ³2&mç¯å)?Ùaþ»Ýgo?þða a臽©vþ]~ óBF} Ùëj»Š—¯ec"óáIôeXË»Œ˜ÿT_*eéfáXZGdÑà8_!OÇã㣀#€ñ:8²=Výô…Ë¢ñmî‡É£ê¢E¬üUßUù‹’(D¶SQ(*ïª>³~v£ejÙàœdœ}Jœnœ·bp^*þË [‰¿Ár êŒ7TõרÈÚQÐŽB6†ãò[´\1¢Ï6iúv²ü‹G‰Xg¤¹«¢•LTÕêú1‘ªµ©R·ÆšK%™l®\k"ךåeLÙW™ud_œÝ5i@ÚîMw L;øH[ç]FLqb‚^€ GF£:XH´è›ñÒsí›}3š2Ɔ×è³Y¸ŸÁZœðî »e BÈÔg÷ì- ¥9¸‰GâmôÛ£/;wëNkˆk<âàH °pDÀÛÜÄA,Ø0‡`*ÌòNÀÃìz#ãõiUÖ5ªb—Áá謿Á¨Ì–a—8Â:x?ø”A쌊Ö:˜rXÚ¾‡`Á| *S•±!F°Æ8¨ ÔX¢1ØQ“3Ù&m}®‘$.ø´—šIosÛÖÌí[k¬¿5˜»€_Wñ7ÂSðå$úáq“ŠÓ·a&ç&Vdåáï˜I'e*Äø!™) ]$Ûº;ö”Ú÷Fqùê¿ì¾ë*…8÷ÂkÖ ¬fËÚ_3pXDzU…¨ÀºdYÙ6pÌ-k^=Hu|«Î‚öň…,ƒ©à" ÌËÔÀ>~}‘XéÇLxèíÂŒÊe"⨙ԥ·“;›íPK6FÅ^ÖЬ¢x˜0w!°š1koÏ)Œ•Ÿ¶€ ˜ B·®!‡Ë¾_`ÜøÑ # )“eírmc\ú2[l’”ƒ/» !/tu›ÂùB‡àgh¾åMÈ8tSosoÏY›½¿Ým7ÑX÷3ÚBÕ`¥LfÆ,e´R*…>#8Û‹ËávU¬{¥ ’‘˜:LÐvœ“ЈmϬ+çÅlX­fmë1·‘pBo&&"†éÚãƒ(Ükëàˆoy9cPv¹óóBÏGëšÚ[k×%Ò±ŠÖ¨«KÕZJ¹ŽœªG‡±7US'–ïAŠÀš%ÅX‘‘Šªf¡xúøÔì$P¡ô¹‡Œ€*ðÝä©ÝÇx"íŸk'(ý& ‹Î£nÝv”ãš¹ !åR@ù•5%RVHP¤\òA^«BÇÄ4¡õçèrë.=1³œÞ¦œ^%¤ÒÔÖcçWäÓü—Ÿ‘Ä}9>xDÉ #—øA×¾üÅ1~0 1Ž ½&ÕÆßÜ|‰†¹U¹‚b,'S²:iží<.ûuçÚÊg»Øa«G<†LÙ"ÁªŠ IY˘`” %*©¡Nå|=–géq¦J^˜¹Á=Su;1­U. gTƒpu¬‰G“iahfúÕÝ'±¢àŒ êu‡åHÍ’°º¢+}3ûq¢ÓºÎ—“ŒÅ6fC.;.Ì£ ÏÌ÷ÄÅïRª Sµ›ppŸ›h¸µÊ™SQ…‘®•Bt5ÓpuýèÅÀ>ϱîD‹ÐÕÚŸÅ,©ÜÕçS¸°PX ë&|ÃÁqA›¸z3Ùr`]{.z”r1ëQ=ÅÀˆ9®;G¡”ù —%L¢Äà©ßócâ—*>H”KJ âóˆq Zš4•n¡`³Eìà¢ü˜0W%"7\;¿ïÕ1¯[ʶdŠ]2'=uQ5oŽöŸáX.u®hîjÞ²I®`¬A²§NáîžBÁñ¹‘(»3æÜÁމmã.­9‚”@žn|ÄI+1Ä:Âk"!“¸íSÝSü›â âî¥Ûî*›ó nH€åÌfaEa9TZCòæCHÕÛUq…$•„¥%Áúî Ød¸®G”~B$™B2«• Pë÷6gˆ^âÏJ\@†ÛF)ÝÎ$&'E…R?cZ¹FÓúù.k…' ©¢B0S1å˜Ê¦ª©ôŒÍ§S×à.lp F-NÁ’‹,¢ àú¹z“æRÖÓ’º…±¨Â’X‚ú• œH…x£\|jc<ª=N–^]u>GÖ@kå3)Zë< hŒcî‹ÑŸ š FLª2ÎU¯\äÛˆ•¦#¤,$œ –òs±ÖÄpáò!˜ WaÊáu˜n²P ~¨ŒÌUx?8Q ¯ƒgƒ4e¤Kâi‘ÆUå,<Û 1l>¿’@Íh¢.·?b4Ž|ªÏ9¦Y>‰\Ax±³¬É²&uYóvb¦t9„zÕ"2ò™h*=ý1ãníùÉ=å.O¸Ñ^…›ÉL\DM¤Eø¾K\Ÿ„î%¸aàÖÍøúÉ8 noJÑ+„+|³]ÏÈ£6(ŠÚrlQ¯]å£>×Å/pèÖxÊãqÚ¡U¶óö¶~§ø@êñЪ6CÎ+k¬54V,1Í´(ÞtVÇ›púUß )\§ÃCÁ" ÔUÎ×@Ss§,¬!Ð.ÈgP“I4S8ŸBcÌñ¢S[ÂP¬hïÔDLÓ@:š\Õ ”™ ÆÏ0Ó–6¬}DLµ».eXL.†X¢2ñ ÛTãN#xË‹0Ä¢ˆ‰Ò‚(L%ŒvU“y p6Å¡nÌkŸ©C#£S~‘¥Âl˜3Œy"<MDXo°‘"Œ„sYó“®$šN·Ý¥¸Ø&íÆ ªÅO«B‚ñt'<"§bG/‚š*Ý©ÛêŽx–Ïã…D1¢‚]«å#Lçn0³ PAo1“¬:SæÓ”ÐiJ@¨–—Éš%Ÿ…š% ÙY]ܹPþãád0¥¨U͘@*a?˜+0_â>Äwì¸=uký¬K[´™†ýuX!­.k¢eÇò;á28LI Fz/¸¥‡È  k©Øþׯùþq ÛË­×{[½ÔYÒ†Ò¦+Ø|!õk|…“_éò2V/µA$a_L§í°rdž¬¨M¼>oÖ¸Ü7bÂŽ+
åž{qAѺ•ᳫ<…@­ˆ=-¬©rO‹›x™éi1 ‡ÂM=+mDèHM$;âÐZA’FÚiʺIYþ¿™nÛ ò^ŸßN?Á‚;¨©€{Ç0Á×o† §0·"Á2ÓG<%„D¶îl‚ÀÚ6þs1ÂÕ-3eë'{6Øå|žcísù³Õy,ÖHî×'®“ûõ öm¾ii§ÇÔÏöR°,ûàD~Iøýbš[IE+fß"ÞØ[„½”ÊÊrPäå`oýŸý·ž”"¥?ÏýƒB_ÚklàŒ;æÊ´·—À¬ÁÃq-TcÀBs%^aà{°§†SÙUOGÜÓøÍJõ‚B×LžÐ:n.5ílŸÆ¢Ì~œVúBç¬×Ó ŽG çkã ž+Û0x6øÍîcm½yf[–áŽï!>Cþâ@°sÝG®á®A4èÚBÜø60áOXSïs#¤¸Á1æ v0ÔíýœÕî0J¥ÛX K ó¢mɬèý¼ÿ¼û?ÜøŸ endstream endobj 3974 0 obj 5439 endobj 3977 0 obj << /Type /Page /Parent 2 0 R /Contents 3978 0 R /Resources 3980 0 R /Annots 3981 0 R /MediaBox [0 0 595 842] >> endobj 3980 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 3981 0 obj [ ] endobj 3978 0 obj << /Length 3979 0 R /Filter /FlateDecode >> stream xœí]ËŽã8–ÝÇWxÝ@¹D‘)`Ð@feæ³ Q ̢ыAU?Ðèjtv/æ÷ÇKŽ¥CYÇ—e³•‘iY|^ÞǹþøŸ?ÿïá/ÿ>üøÓÏÿ<üÒÿþéç—êh›êòßáüóÃûjwìÿ~°®9üòÛË÷Ã÷—¯/_O~¹¼ðóOÿ}úÛÿêÃþÿÛá<}økÿ¥ó~{±Êž~ÿýõwgÕéoÕõ÷ùó¿¾üÏïÿ8·8t×füïT×*SŸ‡±Ðõ÷—ašêõçß¿üãåÇˬëEwuíÌA}ú£;}ú¯?½üùÔÁÐ|uìŒR¶5¶º§#[Ÿ{RUsPuwêU«IG¯?2ÍÇhÜ舿Ž\|U”nU¸uÉÍ5Î]ÈV:ÆúÍGX­ÎíF£œóÈÅWeØ\ܺàæêÆô«ß5–ÿÚzŒ½mOÿˆÖøëÈ¥¥ßZܸäζ]Ï×lcñ»x\S[ïÔ^F.½(ÃÎÂÆ%wÖÕú²êþ÷À‹¿½üøEuZÌöðíϧÁ]ú|ýõí´(ÍᇳŽß¹Ã·_ÿQUÊüþðío/ݱ­›aˆù¤ÒðÉO°µ=©kôÄ|Øz¦ŽÀ|„kð>3ūآµêÓú=­¿À'lÍÁ'ð…ßÁcû€W®(¦ÄíÀQvØíí)QÃ]ÐxÔp·ñÙÖpÔýê|þv±ùºV6~›_Ç4†O-¤±œ9>ó¤pÈ8¤ªà¨!U1ÔKIW»5÷6øÔc…óa¤DÑW¸Óˆi§Âܯ(æ½pÝ­a…–¥GÀ~z‰‘F'Ðm62çyž0:Aá5yóû£¬žJÃ… %î•ý ë“©¨ªÆýäÜZ œ äošläa2«–áß2…Á °ü¶„Œß&Õ£­É†Ê…ýæch>%¤ŠNg³ÛÛ6²ü%ðì'@c˜'a¬¿ƒû!ð§d >µ‡ h»ZR, NÒa-';ÀêLõÊêL;8—®†°m›×ñø‹ëŽ®«ÆOú©Í=¹‘9}‰ÄöYsÔµS·¶vÙ÷¶Cúj¿wúؘÖÙQ#©ïXØO»~êwðÔáïÀ%Vø¼:ð^š¬[½~Ô\7õÁ# ­¼„¨ý¯ânðD™@[ 5¸qwœÛ¸j–ÖÇ| ”:ÎŽe~g Ó‹Èqug½Y¯ MÌÖGÚçšÓÄvŠS{“®œ4>xö˜ÝÃÖêˬ•^ d";M­îÐ24Ö´°^ Ï >uJ“J³ÇúT.üeÕ¨+&rãQxªÂ;‡ûafºËX Å üŒ #'÷”á. Ê£?&ä·fyW¥ÎMÔ ïpõ=9ƒIGÚÞ;ÊØÜ ¿®GÜ!ŽG€‘ødÙí¥hèU“KDш=iK•¿Gi” ßÁy©¸j‘±šsþk©ÔÈí‰*Ú•J…®‘®ŸªR£s©#¹·Ï²x"Œ§TjÌ ÆSλ]*5¦[Ñ °ò§YëG¬ÔØU©cð·çªO$«K4Wô–{äsWÇ9éT~Ìn+5v:u¤ðóÄ—œ¥*‡œ%YŽ )dŸöör¦TzØ­ž–¶.T¡ÞB½ÙZ¹×)éšä÷•Œ°´š¼ÝEÜþ.O÷>1„âÇÍÁ[$jæqÔ%#lI²t©ãŽË“ò¤<áŸÉê§d„•Œ°G¤·’ödaºR©ïYK˜g¥O‹¼—‘Ú{bG1¿ÃÜ&q„±-ÑŒ°}ú» &’&’>Xr6 ]?"]§ÍÙH#]»=T\äæ2eÄ-•ø×Úe¦î®ÁV¸yÜl 5<¸-æóÅa’z£E5¥ÅÖÎÕœvöÔðo××GçªCÛžY¥úOÍ¡mŽ—ÃV ŸüòÒš£RçFêú-=jE¿ïãôýþßÕùµƒ÷¶éü>NŸœÞäü-7jÅûøëËÇßE:…®?…Íõàböwn0¥ÃMÅdÕ+=ÍpØ'¢ÓH’—VÞW{ýeÕ C#ΜÈzÕM飮ªßñ,…ßÁý`~ ÷÷³†3ù[KõÇpO¼J†`‰Œ4 ÎÞÁÀê|'”›(RW`Ô‹ÇcÛì`E‘¢qu5ÓÕÏ.! ÉC"*Æ­n½ý )¡c®§¶)ËPበ(øÛ³g„ø ™¨ˆ¢ht‰ãòiw2¦=Ý:m‘…ˆ<ªSÍ<ŠÚgçË=,𱦉\}ðøâTÁxŠÜg¢ZÏDµ³&ª˜¨vÆDµWÕŽLT뙨vÖDm'&j;c¢¶W£ÔŽLT›ÐDµ©MT ù€ïèO$'/Ñü©ž‚û,gÛ6/1ƒAÖ&:ÜY7·9Ú 4‚·¯,¡¤R¶=£á|2C¶sDsª©kO|­Àd(t3è9WMÓzó-ÉCY$=Û/Ï´í¬¦±¸ú°` FU©ºr3<ŽÙ“U‡;ˇûÁuhppQWJ¶NÐbbDö¢TíóÓ@uK “ÐjŒIh5‡IhåcçO|Lâõ[zÔŠ~ßÇ€Ih5‡IèÊÇ$Οø˜Äë·Ü¨7î#>&¡UÁ$“X‘©§Q@ näÀÍ ˆÍón ñØPDÚý&µ"Crº‰®Æº‰Vsº‰Ö¾Þpúd¢›œ¿¥G­è÷}\u“º›ÓMjç÷qúd¢›œ¿åF­¸q t=ÜHäß3reEdJO«žPµ˜L}Ñ3°bQÒ£}XY™dä~¹y$2ÑÂÏ–t4G™8– Èç"íw)íï Ù”uÜaáÅTZ*뉳dWæÃí©‚ 3Ü•1^€–u‚®¨`Ì¡d´ÝTP#³ ÂA `‰þÑ'Ñ`ñÅJ1£¹mí‰OöÀøV§ ÎÑÓŠæe ¬É†43¦Nœd$cðˆXíþ9¡PTB±¦Ø²¬câÄ6—ÊT ÎI˜`á"dPD“É„ÁÔ£À–j ’‰(^¬±îX,0€¯Ý He pNV'•„—HK“ÉbT•D(q iß¹ÿl[_ÄÞ΂„ LÍ FêGΜLTÎ@F¼Ün§2’,\aI„rRgc{fXôë¢_ßÖh…¡3jt±©ªf"7ó×#î´˜¿]nnPpm\lYV´®¨ÓAÑŸDñ>‹p•¹”ÑÌ‚b?zqÉ`³fq0^G‘"mÅÙqh¨ss¡¡]å‡mvÕ44´»ƒ­è÷}\CC];ê¿Ó'“ÐÐó·Ü¨7î#Ahh§šI•¶Rœfwõ—Ól…½Ë–»¤ 1ãÇ¿‹H¤ü­,dÙèãQá4˼1~á«``®wo·Ç9Ë8÷v)_7&k;o ™J|8 œâf¢§s¤ëÆùðFl˜)¢GT 0¼Ûm´’”)¥’7aËà»Ka¬1# ï/>¶&ÖR”¿ÈÞPK]8±=Š—ŠÃ=ˆe¹9ûŠ\8y{ïd`Qø`‘ø¨§Q:Î20Sì~‰â"_Ôd¬·ŒO~Q“2>Ym…´ˆ@ ËÞ±±™š±Ù¥KŪ© T´?³ Ç6P÷3g²x… ¬ˆ±e”#<¤×tÃ;œå ÑÔ (ªÚºÃ%‘éJ%>¼¥³"ØæipºÉ¢$³í6·.Ç\ž*'¡Ô l1õ8°ÅÔn&°Åh?°åü‰Øòú-=jE¿ïcl1õ\`‹©ýÀ–ó'~`Ëë·Ü¨7î#~`‹Ñ©[D, (EJ(¹9†RˆD4ˆjä;S_˜ŽåÅ Wãó Læ”¶bF U`‰WÜJÔ{¡ˆ*~¦_ã8½°µÚÞÌ6›øë\¢+4X\K@ÌgжcŸAkç|­¿Úù“‰Ïàü-=jE¿ïãê3855ã3hý{âΟL|ço¹Q+nÜGŸ­ï±`x†[„Ç)[ çå–2iÁ7רÆ&;ž:,“íÄ$í¹¬n\ôUáDW.TÐׂ¾Îm<:Jà°ÐÎï³ØÅ}ÜÛÝw›â“,é ÃÔ²åëJ ½{„¼&˜“ÉžH»\Ÿ 9íªª}kXÓ dWÁ*eak²Y\¸ªÇÒ|b‚fª¶óJv»B3Á$.›o- ˜æn ÈǯÖÚ7©žûXèÊGºTô\Ks鲩Ü0Ï^ÎÎ\BLè[­TVûÅ>&ÞŸÐeî&‹c—aW£s$R’)ʪ“U,7K’eŒ-¦ø.¶¸W4Ã_äÒÉdÁD`¶%Ê&ÇľTã ¸­È'v& H$¶D-ã—%xlÀ¶Â«³oQ›BC·uíœë’ô 1#§»‰²ü|7v©Lôt[¤£GÑ];‘Žù )нG–½¡¥Ã¸÷“…槺£ÇõL÷/Ýðä‰ÝqTd<6‚L% ¦$ ¨8Gx‚b9ÏÈãB¬ÝâšFATbj|­?5ÆÛ¹|W ,pÆ~NaOôʆScÅÁHØœÀ¥å¡÷ Ø8 ´ŸèWëÇæ ‡ÂA\øßé¶ê‚T£Ö˜B0U-] äF®áž&£7ìâ†Ozu* ¯i«åñì“.£&(i{î€9×ök]ãÀTûaÎ&M$Yòƒ8? sæ¶çi Ç/4ú––³B›cäaçÃPoÙm’#3Åg›Ú9ü¤K¨a¨nè5U°NûvÉ(ĵ™¨²>‹@ S|%FØ\äè5Õy{±½ µ¥oL9ëÓ¦H5\;€©¿×ÁŸ5¾eI´,~ÂLý„FûÜŽB™¼cÆÓ†aN¢æ†R1Àhð¢<6Uy,ª.ÅŸ¯d\Ä(kÉÀ{^“(ØöÍù3®±aÁä;S7ëb§@"íÏp4ž¥eâ~°QŠæÞa àûûQplØ¥• ÊÅJ€®‰±•Ó˜Ãi 'pÔ5¾œxÂhu³~ÔL?¸5ƒAÄ,`%kìâÞׄ[›¹¾bœD*ߣ¹ÜqkY€¡ò"w…å®,ç pÈ%޲ÎùG€ŸÚI§³\ZX÷Õ¶eÝmx­™0¼Ö„è+Ä9 8Õ}·¶¨•Äw!¹ªs0 [X¸ø?ÎJÀÜr„&SäPôŽõç¹hðAÁ²¨Ìƒ¢¶Î;òÏí©Ôýý'oëñ(—‰/\6O]Ó  0L€ g ÂD‹•u¬ˆ*·²k@E1‰»ÂP¥ÁqGBÌBÄûCEwç/\V½ƒW'¼SNIF§$tí®AeEº†h™ tÂL·NéåÓý`On‚_RZE¢™æ,鄹<>µ¸’b¢ó›hÉÖœ]ñÛSb€¯?…4žT9ZŒÛêiv!ƒ,¤²?ÂvA oˆp­ìÝ”º¡®©âÑžtCL ¶–±ÖHå¡?wا–Up˜p˜@¸U±y„eõóÔ0À:[Jܯk†ÊHÛËœçyÂè…×äÍk2°SÕ¢(”˜5%fP'ƒÁ#dÓ=Rµ¶_4Àæ#“Yµ ßÀAéGap‚dIÆo“êѮˆʅ}Žæ§” ÷\¤ SU.›}ÜÞ¶‘å/wp ‘ÄHÁïÉTb£¬ƒO-¾xk»ZR, NÒa-'Ãé=¦j‡À£ÞÜUõÂî/ǪĈ@² XÇýˆ\HC\GHeÙ0wVã"IL¶€Y?¼a"— ßÄ(z®Û$›˜%s÷rÚæ×2yYÌu8ù<<é\”ÒâöǼ‘±r¾ŒÂãüpûá\*Ì…‰¥cJÈ¥b {LW»I12~Rœ9ÔpA…/¬ßœtž.éöκ´˜bΑO6JµãI­²m4¶ï°5í.lÅQØp*<£-»,È”Å},Féfy}‰øÁœi™*}C௲£.wswa—…ÂJchlÛPÝþ^‘rÛYð3Þ·”Òµ1‹ã)9Òþ‹íOí>ãé·§œïœÛgžaÎë–AL胭hâ\¾42Ô¦®ÙÀxíºPšH·‹ìÆ]"98þCáŒHü¶`àØ ~[J¥ xO‰^z<í_8ò?c+;¥P«Ô¹xsU܃Å2‘’+ÇÑ{wê(§ŸÃ÷ÓVwúëÒnˆSp³eb•>Vª9ðP_¯´¼hös~èËjÛåeêc­Ü8¯·:Ú铞êcÛ\VèmM/#˜‹€ù„úÑKNì¹±}égjû!¼=iak}dÄÛ*8XÕO}2ÁžÎ5oღ¡pkðÞÛ¬VMý];Kp翟F<Œü3\;ü’@﵄$ЫX3{ØW׎XoCmýàÇ3ÅÔw\ÁCE­µ»Ÿ²l¥=WºÄ0Çè툞?/ñæÃ×—ÿ‰'¢Ò endstream endobj 3979 0 obj 6063 endobj 3983 0 obj [203 /XYZ 38.2500000 476 0] endobj 3984 0 obj [203 /XYZ 38.2500000 476 0] endobj 3985 0 obj << /Type /Annot /Subtype /Link /Rect [366 350 430.500000 356.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_structure_data_members >> endobj 3982 0 obj << /Type /Page /Parent 2 0 R /Contents 3986 0 R /Resources 3988 0 R /Annots 3989 0 R /MediaBox [0 0 595 842] >> endobj 3988 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3989 0 obj [ 3985 0 R ] endobj 3986 0 obj << /Length 3987 0 R /Filter /FlateDecode >> stream xœí][¯ã¶~÷¯ðsxE‘Ô( ìµ@ ,v>}(’¦EÝæ¡¿²%ÙçHþÆÖgjDÉÌ"ÙÍáŠçΙá›?ùÇþ_¿ïß¼ÿòŸýÝïï¿ì²Cé³öŸýñ×w/W‡îÏû²òû~Ý}ÛÛ}Þ}nþûm×~ðåý_›?ýoŸïÿÒüûóþû¿7?ü±ûKÇ¿ðë®4eóû/§ßëÒ4ÊοþïÝßþ°ÿí8c¿\ÌëÿÿÎ4{ãÆÒßvý6Íé×ï?ü¶{Ó"`Ú*¶vy^ì³noš?ïÿûÏÝOÍýôÙ¡vÆ”…+³G*óãJYe÷&¯´—Åh¡Ó¯0Ó›&·¾šoòäÁ±blaäÙC®³Yw¸Å‡{ž~üµŸoòäÁ±Ò.ž=äá–®£þ¼‘’áQtž~üûÌæóî òàXéÏðp½é±ïËÐoæ<Ûò­73’ÍòÐHéONòd]Þ¾o~AçéçÀ~m‹ù&?A+ýÙâÙCn]u"Ó6³Í€ÿj>‰\Ø9… òàXéw4ûç)³`PÚŸ_î›ðữ»7ŸŒ3 2‹ýןàÚ5O¿}mâ÷ß8×üßû?f™qÚýyWŠÜ÷ Æ2’Y4âÞÁo>‘BPL‡-dzáVÓ!ÈØL¡~ ×°1xË>À‘ré3u˜ÞêéûÁëXH½1Š×Yœðig…Ù î1Þéûégj!UY¸Ž ù…¦‹×;Åò¯“™D;[£f?XÓ>@¿6æì¶¡¯£±ÓHy®‘KB¨Í†%W­(¹ÊJù´ìÅÝÕåJ µÇQRA«ßÑÙõÁqZƒ%]Ö.YÌØ²ð',\˜³e´êPÕÙë‘ΰ¹6Ò::îàl›àp™­B#]@âÊl¹lÞUyßž-oa3¦ÿèò‡³•6¸ÆAæÐˆmüê2½Ž|ÓNbìÁæ•É_lÐàoð:x]Õ` .ÂÒÝ$ÌÂx±$A«Ö}“»ñÝpƒ˜b0ógðgá$Âôçþ\HvÅHÁòhŒ¼ x¤ÍâÙ&ÓùŒêÍ[3ÐoŸ0š‚awüÍWRQÃ*·‹è\¶‘º_ô ¿0Œ¹‚Ø(%?'œ$Xˆ5«‘¾¸"bäŒ`÷`µF`G @øÍȰhh¨5™õ°œÀ³QPpc QÆHPA‰„eï þT²Žó.’?:›" 9Æ”HšQ …ŒAÍŒ'˜ïÕÜb¸‹¢¹¬V¦WtÈÍFÈe4lê`ß”qD·’0Ðì̯™]=  j× §Ã ýˆX߯”ƃbôI3ï5‡ÍËkä8ÿgÈÀ\:!«æíÜlo»;œª šØJ4žØ¼äåü¼0a³DNëÒxpJèâɈÙ솓¯òëì2ëšÅP33=ŒÜ%lð¹ÝlicŸŒQ®“£&“vÌÜ·PþÆùýáiAº/n8”1FIF’eMUØ¡ðÂ9O0³lGÌ×cÓLÄÂØ(æ8¹†º:^t€M¡æØQÙÛ˜Þp.Œ¡ ~€f¶³kLœWt5-W gÇC~ÆçˆkÊÎg×ÊKÕõ§å6bZ†³-_A¨U§‘Cù¤ÅÏløˆúʘk2—§DA®oŒB„S­:A&»þiN!‚Z¼t>+±…z7,™:¶‘4íIŸ™yìIÆþÂþGÄ–&enŒ7×i㤾lÏÓwbkܘºXH“ vk{‡vÍãÑ9Ì£]×ÆÍµx3ë,’(‘Ô±ô)™fÑn³ãÁ$é¯ê¡ÚGú»P2ßmbéÀp-a¯ ~5„:fïÙbŸ©Ÿ>ò<’îv¢ˆ{Ä|ÿˆÏçÀýà“³0¾‰fñôß¡(ÚÄÌÙ3r¹ç7Ø/xš§jÔ ¼Ý9‰º‹XüNW ÅŽH¾~¤ßæ­°4/|ƒ¥4>-Ì'8ÚÎØ%DX-òéj*&=?E´EØé‹¥¦\.¬ëáÁûÆ»ÃXÄÙ¼ØbOE(d'OâÚèÍI¨–ÁÅÄlYÃøgŒf Ko|6‰Ž´óö&<ë¤Ë°Ù ËKÁÞX×9ŽJb_øin©JÄ~zÌ2‘ø‰FŸéN6v ÷žQô?/ʾ–I­3u™—C–›»)ÑÃkÜU˜éíÀ”íöI5w#*ȵ:ÎReõ£ÖVLÕ~ˆÎÔ[ÕFØûlký{biu6©ÅË ;õ-^.Êa;„|æ{Sh‰’ÕCe«Ü›È)Þ"—•y W¨˜,¾å”†#¯Ô=¶Ö=ö±= ânJ¨c"¢qÄïªìü~ZÌ´ÌTçPYxA¡N·IÒ)lí6I+'U·ÅPÝs$,Ýωùý\e´ß=:§u•·÷Ïóöñ:+Ä—§˜ïv×Ù·&f¼Ep¸1Œ® 7ŒŽµ`µßf¼@Áê‹‹þ‘7ÕFV5Ã9Ø÷Âß`_ Âæð7Ø'Ä;ÅTž(C7Õ0lÏg Ü7 ∆fÖOU>R}¥UcŽ#®ë¸ñÍ®á‰ÝJª}<¶PÄ^Ë:c"é^!†{…¤Ÿ¥Ó~ž ‚˜ûb=…D·K´³RÚ‰ @1[®6î&¥‘4’FæÙhïBÉe©‡~ n¡³;ÿÈ»R©ó_–:ÿEnÏ­4¯I·WŸŽ¬)ysDU*ÖH8Áƒ¸5¢±»få:8N«ý1-q¼d^´Kç¤ÅvI“ÚòÛ…#rü!5»“¾é‚Ÿ×¾©á:]A¤=”fP®¿1­;QÖöõ;Ã9ÄAëèkZ ²ý$¨ñ7CG:±lо2ë‚î´˜ƒQa6u'.¯AÁHoøäLK;åÁ‚êÐi³YˆuG²`†4¶J|">0á‰tO‚Oã?H¯ÂÈ'rc0½–Pj`^ªDëÊ’¦ÉG,àÉáýàÙ0Ÿ Bð’°N0Ž‘[Vx“i·¬èÐ1©\^èš0zg¨kÇ 0¦4"ýUŒœQÛ†ÅËô©Ji\Ú?,™Ûö‚êw¢‰†Ð‚aD‡DWˆšª01>œåè ÇùyJÛ}tLj¤”°X&P 椑œÑìD Y•&U>P')‘C=‘cFk¡è<ìËùb"úº`"Å2‘0$æ#š9 ½zÂÊŒƒQÇ®ÓÕeßaµó,†‘`¹¼½X¢#™`ÍÜ+È¡ÃI˜Fd”Y2VAE"ùY—õP~'Øîeh#„ÕD©¦Ñái‚µ ”þŒ–™Ð7OPHØêÄ^œ’FxÀ…q«/|¶Â9H ëÉâˆúMhÂÈØJØ&Ãaž4âc—ÎvZnî0’@ɬ~álT½ ]foÙ¬3¦qÕݧI™#ÙÔüa¼#5í>:ç°Ž”Fô"¯Êy(—|ÎHúÖú!éÇßB˜pXÓÛâl“nAbtöªfüt>Ì>g(/êBlç3·B‚Ax4›·“› {sn&¼|K!å (1©¡Ä“æL;W¦àjy\oíIª&j;|CŒP%6‹Kÿ˜upƒ BÄ O;·}çµL"0DÙ”AbbüÕïµ­O°õ–õÍL—Ùw!t³¼¥›ek†ìµ{ˆƒ€§sáòÑ_A޼³Ñ Ìq1§ŽªÝJ—ºY]> jJìg±¤˜«~æ:hñH“nCÝ 2§ •¶x¿9#!˜å´d;sý½8i –x§Žz¦ÁñÎÚWA†9SW*3P}[lÙýè%K1¸n—™È܆fL.¿®²±.öxRO<ŸÅãx©¥ŸD½«ö×'ÅLqô7MaFÂÆL…X&±ŽÅ#14Žñö\fŸø,>c·Jú;ÓÀú0Ù_‰Þdª)×óþI|ßJµÿdž K—°Í¨@IÄ“‚.Úx‰±¹nÖô4\+HbÜÀ(lV¢í’prðÏ´wJÖ‚ÞƒZ9¶²¯×øC6lK¢tõ×u{6Ù¡h{³ Iï l]¹k³umVò~è´JO¦\®1Qîm$"†½.\ªäâ4ÞŽóÕè[Œ>Ì4øzìþl £0=–KA3º JS*:§¶é}ˆ³º‰ Ê/l  ùk·ÎÐ…!`²¶£PJRT+aÃ2Ï Å?AßËwJQC$Sº4Am©ÌÄÌH°Ü”¶_ºI'õòR˜Wú£ýÉ]ŠÇLÈÈF~ö2–2d„I‚fÙ„MÔ£Ô ‘•‚¿z/ð0ÎVPKŒfLŒGš:‘”;¿ÿµ¡¥2ù“_v_Ci ëÃkJWëÉŸ†cz¤ëħ¨Á‰l‚¼gT+aXÏ\«" &WÏ\wbs7àðõ5:6¶šÚeg1ØÛHhúᒌȋYiËÇÇRׂ°ÅéZ ăºjXÓŒ3c/O©4ÂB€Á9¯[ç–Þ~ K—¯Ê²qfW-®´|hDYËáš«2³‡¬ÃÑ…¸2‘wO•%©Ô8‡Ò¹XI¥×êýË !A¢à$ŒA¢dÐ ¥<#;gD\óÞ{ ·}hÝÎNsV]Y7P.ËcƒC:fqÝbÆè=-è?w2Ä9⺜q 3̨ªlâ*\y‚3戬´°8`jR„‡6±E÷ƒóïpFcª(‰ ¢ŸÎhŒ¹{×M?1P>.Îl`Ãõ©¾q \¢£]kŸ´ë=´LTSXÅÚ{oÜmîÞØˆP#@ÈKʪPÚiÌš.°”Ç\ å“? °Vì:; ,O‰‚\ß…SňOJKªÏÁÓœ‚ŵ}L5+†V™¦ó¹„HØ¢½Ys7ÉrPµ ­½I[¡êG™ØZÄV#3²5é°N++ÅabˆÃ`K3ù<¡uu†¥%Æ(–½Zö1Ž>ak®£÷ó>Fç<Ïc$Y·¬‰À *…%®•û»JT¸Ë¦Ölë”ææ¾·6BÉ ÜÛ(Lœ@ëÖkòVÕŽ®ã¡òÀwŽ»§ W¹q›*ŠK'ãÅÏqyß&¬|¾Á,˜Æˆî¢‚#zè2}G{0˜kaR°v‰hIò,8M‡e´¦,\Êо‡^,#7ˆ>Â73Ò¦I|¢—¸€lŸâŒY"g ß àžÍ¸_±Á”wêñ)`é ùÛO潇UÛvÓöqmß)Ê΢¸ÍaoÆñ;$×)™gÌzŠ:Ÿ ’˜áÍŽuø¬òÚ|Æä 9 šÒªÌÖe³¦JžÎ3åñ,O‰)[:eKÇq Ü“§ó‰'[ZÇ^É×ùŒiŒÉgèË4 ö’á:x?ÑÄ’t¨ÏiçØY|ËÀÄA»|”ÕmxÖé›GCÚ—#E—StYÖý1{J[Œ.—µvÂæ¢ËA%dŠ;KÝbܹ2•6Í ‰#î\ÙR‹a1/øW,›Âë`¨7V…(ØYÌ‹®A3 y©{_säBGryíûýtc&Ê üŽùâ;e8‰.,/Q˜&íš%í*ûjjÏÜ>!ùðLœ¥¡)ndôOºuW“Êaï:…ž9ø|˜ÓÆû!ê-Ó=Tgƒ–Ú¹o”÷LT; Q3L±x"_4uÊRG  z)©SOÜ=2¶Fd‡% ‰šB¢én¢c³ÕkÈ´O#id½#í<¤"Ÿj£Ykn#|Sµ}"¼.ú×+ʲð'x. ¿¥‰Ÿ°cÞÄßà74ñSyŽÀGô„ÇO™·:‡¯2ÏG3 á­ ÀâÙÞÞ¿ ü®ñ¾§ð°-ñ€®ÖCŸë~:QØñŽùøeF†õ B`‰ÇN—'¼‚`1ÇH8›ðÊ4Qá!øÙŸuõY5PpãÇ[ Ý!È$=÷«ÈrózS×L4ær™H˜ÁTú¥V“¬ )ÿLc-á "èE"d‘¹GLèuÒ2sÁ„¸ÂB.lb¸°ÎÓ#QˆëF†z©$›ÅÛT%¤O%/wpj¨” [á³R½°e{ •Ь^CaËò uË_§R27Á²B)q<%cÆp¦ëlZ3Þ"H$ÙF7ب0f eY댔áDvìsçøìõãvøl½%/)R Í&X2x§Am|Aó/n•¤Ç¶g¡ º-­gµ An&íèìÛk'Sn.&˜Úàl:ZØüÚkXMäÄÏ·þ¹Õ56µÆ2sLŠÛç=§vþÕµl˜§å•D‰–FòCnN#lã‘NBå‡.)ïæZ®eË}@ëØ[©4×`ûÔíåâÌ7w)ƒÀšnë£ vÌvmúŽ8´ ƒgƒßt$h&mýÅ;n,ÁÿÜ@ÜCþâ@èÕ$èXþÊ çZAÜø60áOXŸ8Þ)¦Fxâ2… uõ8e•™=tRé>ã“?|¾%›÷Ÿwÿêð§¥ endstream endobj 3987 0 obj 4970 endobj 3991 0 obj [204 /XYZ 38.2500000 248.750000 0] endobj 3992 0 obj [204 /XYZ 38.2500000 248.750000 0] endobj 3993 0 obj [204 /XYZ 38.2500000 607.250000 0] endobj 3994 0 obj [204 /XYZ 38.2500000 607.250000 0] endobj 3995 0 obj << /Type /Annot /Subtype /Link /Rect [442.500000 584.750000 511.500000 591.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 3990 0 obj << /Type /Page /Parent 2 0 R /Contents 3996 0 R /Resources 3998 0 R /Annots 3999 0 R /MediaBox [0 0 595 842] >> endobj 3998 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3999 0 obj [ 3995 0 R ] endobj 3996 0 obj << /Length 3997 0 R /Filter /FlateDecode >> stream xœí]I¯ä¸‘¾¿_‘g-n ººª ø0@¡ ˜ƒ1‡A·ncj|˜¿?¹H¹Hú"Å/IJ©'?¸ß«TŠKD06Æòã¿þ÷îoÿÞýøó×ÿÙýÒþþùë[µo\uþßîøóÃíÚïÛ¿ww»_~{û¾ûþöåíËá¿ßßÎ/|ýù?ýßNïþtøÿ?vþ¯Ã‡¿¶_:~á··F5‡ßÿ<ý:üU]~?ÿûÛþn÷¯ãˆÝtíbîÿýƒ ¾òö¸ŒSë¶©N?ÿþå_o?ž7‹ µªýNYcw*X½ûß¿¼ýõ0A7|µV©¦¶MõÌD>Ìä‚?̤ÃaÖÃhý‰N?i†Wé¯k² ~^yr¨(S+yô„È­ÎÒ¶ÉÿËð9j—oðÓÊ“C¥E®0zBä6•êŽV“D7Ãg\ed ç•'‡J‹\aô”ÈÕVµl¹²@t>üµù?­<9T:äâÑS"·€Tä^‡Ï0¸¯òÉÜóÊ“C¥C.=%r½ë„¢jn àïòÉ\_©*#åWž*rñè ‘ë«ZŸä2èS×ÑsàVe”çç•§J‹ÚÁà_bÁ+9̹½ýøYÙãY©wßþzXÛyÎÓ¯o¸ÝGÎëÝ·_w¿¯*eÿ°ûö·°¯µë–˜ãIõ|§†ïèøẏӓOß¨È E]©ÂPL ùê3|òÂcë1^5Þi…žh¼SOÐÞéGø¤£áyˆµYüNõs<íè0û €1§1½aêÅØ6ñ׆!ŠiGãwàª\›Åï@:`(ž‚(äH˜ªJ„ئN#^¦*‚ï(¼Ó¤ÒÕ@,,wCA¹«—#]M⤽`n—VêAz™§ŒüÀô¿dyÈìtÓ «M7”e(\µ#taLUïu§À°Ö˜‹aêÅÐaèšXµ€:óK³ù¹²ÁZ#ÆLU¶¢³™°ÍL8X"z´À7ð<óó€×”®¥ø“ÅT…­glq|pmZ=ÆiZ{×2š Þ)–Œ]MÈœH¿žî”ÑÐ+µQÈkR³,ŸÀvÍùÅhfÛ“íÉŸh̾^l´eØ”MS[ëë¶à¾CýüЬÔ(÷ÄJ©þèI™Ý›¦Li«ó”¾s£´J¤ªöu£|ãn@pVlüÞ‡êŸ+¨ÛwÌÞh¯ôí;½Óš3voÍ9æ:šïÀTîôÄì­‹ nì‹VÐ:ü„Å ƒàÅâÑðbñhxøöFÛ›-¦†WûcØ¿U§Ì¥Ýo—‡½÷Õ®®¿šcÞñS­vµ»¤8µŸüòVÛ½RA{¯.ß2w£˜Û9ßoÿÝ_ÛõÞ>ÐwoŽÃ'‡wîWrü–¿ÅßÏñ÷·¿ËtÖüù¬Y}9Þ»ijw Öõ<†î´'êL®;¸“N; ¯ ÏÉרé§pp`ñJðqÁÛþðiYátv£=\#ƒI¼X‚ᥥY[·½pô6úðk/Gn>`“)¢ €sò0Ž1P„y0Á †àjU´8YˆþÖÅ33jî •ïÅšÂºÊÆ–7¶ü$[Æ`«â‰kõ [ÝXÏiú¦¹×ôÓôödO ·ÕPÓ·ݾÅÜÎqÑôM=¦éןãðÉ@Ó?~Ëßâïç( é[SXÓÏL›‚¸Ä‡oºnÎèëÅbs—ÙìºôŽMj/‚¨ž‘Ú™YÊ{‘ÀQš-%.°½ ŽDN£ ue_%  ¤œHCŸÔ±Ìj£/F¡‹ ÓÓO“ue\1Ìáö‚‰RW {1.9»Ñ!ü„ðz|ZPÊmf//s‡4;Ѿ”,œß}˜†!aJyDwe®:¸ºñ:Á”cG=.MPËñv›Òš¤<"-Ç™ŽžÙ,ï´ü’²{á~b8‚9 >)s§¢ ^P$eä—“®ÖYú¡=£€ÕKAù†\k¸õGVxFBÓÆô(­Œ}ŸK⨚.ÿêI!ÐV.×fÇlÆ·„¹ßÓ0EføÌ(ú÷É”n—ö  „=‰¥X„¸ŒR¬n|OŠ 7„È.e ¤ðŒMŒaŸ$¾™×m!°¾¤&ž‡2¹Ó b§˜ùF\{ ú΀aî̹|2ˆ ?~ËÜbnç¸D…7ì`;Œ ?~ËßâïçÈ® ¸€dź· MT¹ÂõÒ±Ž,ÔJÂP“iZ0è¢ =x,'Bp9`žÍÞ¼I•x4Á÷4Š1&“ feâ˜ÖQˆ€Rò’:§–‡Ê„›äÜ®úBŠ:極‡9"RG`ØL@:ÞqƒFa<‰bºyî\Ö‡X,ÂŽ ƒ˜¼.Þh3ÝÛ¥øl!QÂh˜dˆåÊwÆÝ¹ò©G\ùÎøž›ýøIß•ú–¹ÅÜÎѹò±#®|gÌ`3p埾åïFñ÷spåÛ®Sï+»ò/›À®|&ÌApå3-Š>çfVWþká&›Ë;¯º•È #€¸TQ ¤7‰Ò–x&¬<¦—ËX s~4u_Rõš˜cÇèŒ)2[(ý•µòj u=  ­ÅzžëY=jºÞ‘áXæR£ÈõŒ"7j¹QäFŒ"w1ŠÜQäzF‘5ŠÜÀ(r#F‘»EîÎ(r¢z FQýØ( µŒsð;D6G~G ò¡©å\Ýn‘O3Þ3/ cüqQË­¸"›"se4´bf(]©úbìÝzIòŠZL__À"ðbá˜?,¸¶j²p,UÁú5+KS)þÓ¯O„só|RJ(&©øQ·#:ß&s £É«‹ ïàk̈0ó‚OŸpjÌßÇØÀѰ‹DÈ …™¤ó÷ªi«p ¢É²ò¡½¨\„Á¸n•«Hê·óêñ±\Y#õ÷À ëʳ° £T’Ó9vCϱF»aàØ #ŽÝpqì†;Çnè9vèc7 »aı.ŽÝpçØ å»u•Õ±»¹xætñdîá€!›¶ðsÚÚcÔª±Ñ>½µNâ*•IKè?s(Óf‚nµs²UïíUV%¾ŽHQ“¤TJíü,BÀ:“îK@gþ¼Ë­s`”’q‹ÌD•kÇ–¢Ær±äˆ%|fŽ»v©_ ý6øžÌŒ–ˆ<»R=¼"&Æb&©¢:,` 0b“iÑz1iÐ8Õ7×ÿ#z<¥µkæ×%æoó¾yoFžÜx?ó°òÎÓ§K«>iSÜç,F¡ÚÐ+ ‡G†aÈ Ç\~¦ú\±Z‡>–¶›ãYã‰u}Œl¹‰wÎÖQu"Bù›´7¶«“Ú*Ez‰æôÂzÛ?ËL熞’4†Oš>6M™)¥Né™yÓÊÌ¢R·˜›‹+¥äw*Œw=8³¯ºw¢ªýÙ ,fäIKÈn¯é÷Ž…ïôN~ÕpÆös–˜õÞ(ÝCÈgbðƒWŸ´D©êŽ&®ÐÑ®ÌØ TÔÚªd9³ÀÚ4à û„v ¬£-–> >T‰iBÙQ³7@æÄf®ðª5|‚©¯ uúÄaÎcCËÜœêŸfL¯¢xx?˜B0&…@½RУµ&òÈ „ý'ãG˜‡Á6>Ì©Ç'ØÁU„Ø&d¦: œS">§xx~¸ü Uã¤;±Óüµ%lë¡cгGž.ZÓ/è÷ZÑ+3Öoel_÷Í– —L\&è.¢Ø5ÏÆ\b°­ãú“:üÑEÉsJ3ßg̵g{ôd[¼Ù«¾g¶ü’­2†¼–8÷i;[Á»“£›ÂŽç¸"h°¤­îñR×¥bRÛêdWQK5zbÂ)‰¹Nì4& ?[´Ï-®Õ £WM#S’ ²}*ùŒðZªÎñÖ™fÃP(»û„ÒF›ªjó»•Öþö“¾}ÍENÇ™zä´X®<”=À7è œ’…Ÿ4¼ò¸†“F•Îg^M«°ŸRÉO!D²mªÖ8}¿ô9ë%Á"Ðó—8Öö¡ ¶õp=ø‰P¦åÑ“2» ÷ àS¦_‹»ŽcøbÊ&ŠÝX¢T¹@óL±&úøQ ª±'É.šÓ˜¯ÂFc×ýàsK¸¯ÔF}'ê;è\õ=#»5ÔÞ%Ù¦›f©]O]?ÖüˆRl8gEÐW±~qgñ ˆy„†j_]†îé½Ëû0¬ N0ä…'¢pÞkòbaDuYl{=ÑèolB«ÅgÓÀ‚XN,ÙÊtsX‡Kº¶eȽPÙ ]©Â½¢<Nà2hL›'hlé^–`;_ ÍñAèg[*ì‘JHLÒ׌/þ–¹)V{¯qÅ…Á¬ˆ¨$̈!BÆF9o!+²¸r5>Æ„z"2Œš€ÞiÐFõhoþN*/Xï´ÙW0.Fþç”!VOÖ9ëþœeš^2å]Ó†±£á0¢¢U{è—I{̤ÿ3ʉÀsÔVŠ+D ÷CEò3Õˆµ‰ûKn?Q 7hO[gz@wÅ#s“?Ðé—ïÜÊ0êÜd=“j9„©6m;Œˆ×¶äjɯ:ž–ûGDë œ³&œŸ2ŽÛbïòyâšÊ]:îàûì"Á÷2ЩAÕ:ÄBûqq B¢ âÚ.L<‚)I—Íc‘½¶'˜–)JÂ1/Ø­o,…“NÄZP<žÀRʣŘç–¸í(dö ²ÌNçï=Š!ŠO‰p‚™4ÛÛi\Âi|â¦8¤tõÏD ¿æAºbŠ%N#w—ì)ÖnCt“F FóÓ¨`Ñ­ŒB „›@I㽘({F:Lp--")UõL¶Äö„{‚%å&Ró!"pm¹„…h§T4´`ƒ•‚õ9¾¾„ƒÎÎßÏ“ã¯ã/:³÷ÝÈ‚`aRÂv¹¦óóÎ÷ód“ë“Å2ðß ÇO Qþ–£ '®ŸÉ Í''Köß.9³˜’9¸.DÒ[íÖŸƒh:.$g6º|3kYIä°Rq»Iラ,Z¦M ÎêWËŒ©W[&ý*bTQß´ùX¸+“ùQ*S’)¶>øLWYb^²f<“ÉB‘ 1'ˆ6EIáí>LO {cÒCp ‘ïÀ$BK¸NÑ¡yþÌ5¡áÈ@šx2!dñÙHqÅ$Js&%ô %³±k|ï¤oµ·’×ÞÊ^jÂ7}~]2×G7]ݪ…×jtxªú‘G­U¡^W©êÞ³×ùÑè8’Pð0ž¨—̲ÂwoŒ§ß° 7y„“œüÀt-ìšÙ0æ–+Ë?QÄͱàCÄœ¨$,pØÙ+h.¢Âoc”~ «´O^’Ê×–e5ÿíÇü7MKÎþØNÉNÉ«Ö6ÇRŠe¹7UÏç¿/CºL’.-ä7û!µý°²x‚ùuÚ¢¼¯.SkgSY‚L¼FÒ¸x¾ì_!°‚õøña4¬+2nR/^± x"—©eE3|fðN™N/ اNTí¢ê†þ&Û‘Ï‚}Æ`ð 3/xÎK‡É&a¤#?ˆw¨òÿLÓfÌ{ÍŠà|R¢ Å2žFÇaZ:0ÒŒéHCxr„³@`û Ú)¢Ùê2s—g?–Ôæe]6í`ïD1k~µoÊpHý Y©ï‡ mµU^Õ§øµUÊpû Ù•G©¶Ú+ä5 ÀÂ2¸PýLÇÝ •£Ø­6„„¹ùñS¸6DîàŸÉxâæµÈî\õLDdÑ•jõ˜?È/y­ïšÎHÖ烪ª}ݨ»dÉ$‘)wTÒä »'V)‹LGE!ÁŸHýgr¢ÓöZ,ÕY³T†5ÓÔMx‡È³éÆ´¦dÚf3¨îx 9c’™Þ5lÈmp.ðô"LËߘ$äR=Ó½ˆ\êì5œizb-1çÆÙôy·IÅ´ÁÈŽÍ'SwüN…1pëSïí¦Võý”%â\ñ§ê/fäIKÜn¯A™ ¸wjøN@ï´ã±ND0÷ï#z¢Î´Üì ÀêØ;®¾£á¼ŸöV/jÕ­eäÖÂhÃë–ŒQH ¡W  …à'í]WÜ;˜vœ¶¢´Þ¥{§b¡JfC¢Ã|ÌW¸?ÍaŒàsw-ÀÏ©å¥i/¿ÅW»Káƒ+së•Çi¯ã´Šé*UI‡©pƒ¥hD9±B†Š +ã­ÏoâÂR¸XQ¡Nß tÒº JÕ‹x—¨^GÑ9Æ ö&A†cB3Goî’…L &á|1¥ðð;eyLNãPÕ} 8½ÐÃ1ASbº•ª½–Ö#Ãx~˜oI]uZý -™Q§-m±J¢¾©àiüHPâOñøIãidJòb„="ŒŸ‰@Âü÷‚w à¥ÔzÍ(ÆBë㼊±%×9eŠY †iwcoÚ—&&QáaõÜœŽ3[Of–%kx7—îÄó‹`!õ•©*.¾¶`ý¡æÒs”é“%Ô7#ú~ Ôg Bä©ÞT"{\¨!ÌT¡+а¾S7ò!ÍÇÁš©ï„wÊÔñ ø˜QL;‹ˆÅo¼½Ÿ5kŽÆƒø oºÒxÅúã%½]´CÆÍxç“úk¶Îy}îGv+k¤qõSRÕõAßSÉ"Õª<Ô¦ SÐ…öø­‘ÇŠ·ãFT› ¢é°P.Ž(ÕÉp¤¥›¤A=Sð}émÈ‚™ÀIñî^RjmFñò›ä[ºÔøâOjýLiî’†yðMòYeóÛW¶S¤7ó»âÌïAþÀÂ,cÈ2±Ÿ2 áGEZ3÷—)’Rx%Ò,œ<|‰<{¼ÕC ‰Á€l6,ÞѪ0Êí«~F!™m³õ>âû‘ߤ„@ñUèî@ V±z„ @¦?Ñõ@¨s…è-di9!K‰hì¤P¸·6< íà^m¸²'6V°#M0}ˆ3·d“qþ“ÕBôÄo?»ïÆ*òÝ/¾0Açö£å¢RGåz§/)W ª?gÈ5#ä¼#½×'Ù6äõðIkPè}=¨Z  nýÍcéÉckûÜît`_´ê)Ö­mŸà̧z¸ÁVÀác¬PŽlCáÑà;­2 ¢¶~c!³wüû°ânåŸ ìðH«KZ5‚#¯ÂŽ€·‚%‹„y0ÆñN15BŒ«G©?©Vퟧ¬¦2û–+M#1Ì1ôM`ûCÖûe÷åíÿp’ê endstream endobj 3997 0 obj 5932 endobj 4001 0 obj [205 /XYZ 38.2500000 112.250000 0] endobj 4002 0 obj [205 /XYZ 38.2500000 513.500000 0] endobj 4003 0 obj [205 /XYZ 38.2500000 513.500000 0] endobj 4004 0 obj [205 /XYZ 38.2500000 112.250000 0] endobj 4005 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 83 90.7500000 89.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_class_extension >> endobj 4000 0 obj << /Type /Page /Parent 2 0 R /Contents 4006 0 R /Resources 4008 0 R /Annots 4009 0 R /MediaBox [0 0 595 842] >> endobj 4008 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4009 0 obj [ 4005 0 R ] endobj 4006 0 obj << /Length 4007 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·YÀ iFr H@A'0,#Šùûaw“=3Åþ^“_¿*’3ŒKšky{½­¾ÿÓçìÿõûþûŸÿ³ÿ±ûýÃç]q¨Bqþßþøë»ç?°õ¡ûó¾ªÃþǯ»oûo»O»Oí¿íÎ|þð—öOÿÛÛýŸÛÿÿ²ÿÛßÛþÔý£ã?øº«LÕþþëé÷¦2퟊ËïÇŸÿ{÷×?ì;ÎØ/×mæåß¿3MS„Ó6n,ým×Óœ~ýþão»ïϘ¶ŠkjcнñÎïMãíþ¿ÿÜýÜ.ÐO_oLUúª¸g¡ÊW*J»7¶)ö¡¬sú¥3»I0¹1uºÉO;׊q¥'×Ĭi‰=f/³§¾µUB²9î<fá䚘µUÓ' …ƒô/Ó'˜Ü»"!Ýw®•·xvMäúº™Î¥€P"—Æ'¤œãÎÕ¡Ò#Ï®‰Ü²,ÏjB ð÷³§U&dÜÓεңN®‰ÙÆôú°å}=M¯?ySØ„l{Ú¹:TzÜâÙ‘ÛU™Pá>›>Áä)m©óÎS)\avMäÚºlíj À_§›kÿ’ŽpŽ;×JZ8¹&f}Q¥dÛ§éLBºËíyçÉØÏ®‰Ü²×ˆIضL©oË:¡¼?í<ÛÂÉui+Ц†¾dU:gÆÓì)Ry—’”ªdÎ [´Æß0_Ì¡LÒÕö6@Xcgí¬\W6wÐå«äÔº¾ãtî!ßN¹ÑÚ«Þp<øÒ¾d:SÊʌ̑âE*)<8‹ WŒ‰ÙŽh39\ø¶­‘“@Å_U.Ùø\Ì12 òG)B$â¼Ùü2¹X!SêËæÏºÇ%šRg5±Ò’k0 Æ‹<œ‚¤ÌÃðï¦óI®<ø±_ hœ…Ùã2£·5˜°î{Þæmݼ­?lÞÖëlÞÖÍÛ*RoN¿Opþæ~6¤È3³û#Y­?2w]R´ !/HEì#Æ’¯CØîÕªŽF`«²w@>§¯44F}Õ¾ÒÒ—·¯É¸…©,ÕÈ r³°‚¸aÍï¸Ùj–¦‘ á¶Íy.›K(ëÍ\’Ã]¸øÆŽ¼7椯 §Œ‰–SµW¦ƒ:|ÕÄõL6ˆk–p=…%ã‚ޝ§y âŠÂÐSË+™‚qü8H;ó”:Â@WFcê]g²ËBdš»$Ll2m“iê<ƒ/å›L“¨w³2톋¡j"ÿ‹RC !ð«Ò©F©þL³·÷xu=Ùæ.Š›à•BKØ´J‹"œ*ÄTã1Hgœ8w G¹»Y&†J/uÓô˜æOø¤D a6Œ9 ¾VB•|éÄľM°~ËÒ„&4U‰\RFYú˜2T“z™Pͪ¹8a±¼V›Xê¬à2“×ê:Ä7¢ïd’® OÝØ2:õ[%Ìò~÷kÖ­Z¢þ™å8Í›ÐETiÄ&‘ ¸0 鶨_ØÄÜ#t[v2ír¥žIÚ¬À¢Jï¬ãÆ-ù ²;h1¥†®bøäª#ÈEP „¨¦²êåà͵û2j9†õÞ4×è¹38ë™Ù¦8œ-æ"ÞÌ•‘ŽÎÂÁ3{Ú75ü¦AßtÔt4R÷R9< sÆnupÊ(à7î~cá>O—A5i×]ŒøÊ7Ýï D»4ãI°î¸â…”:pRébÞÓ¾Q‹¥AVjLÌKµtæGypÆF2âWà †W¿ÂlÓw½ Ë`‚5öÍÕ›“¹ÙM¸v`kšö_˜~—ºOŠÌ_¥ì!l‘ ®È(L3 qÁ ÝA×&¾ÏD…çê4C5z]àëeº®âÒn?ާ²u²úýWŸ”qVg#=7{ºÓ…x ›0Þִѵ¤×Öi9I°1¸N™î+>L[$Ýné}R§ë>12;]䉤ìg‹#©8­÷Àõ·¸èê!¤.3Ý)ø¾")½©eˆuÀRÒ&“>YT˜øŠ7пªÍGW_v¡˜$žA¤ìfÕtXÆU¶Ïuµ“F|”zë§10æ+NÍuÃ'ž1ÉYÃÜø¾- ÓÆ§á¶B³+¢xSÙܘV`9Û²4å=mY6ªÐ¦Š¥W7õ=aÄãFIoŒ’š£ÍÝ­ + sÕÛ5Eè[úäŠí0v$6ÚO´~©ŒÂí¹ì>Ð%—–mÙQÔEZ¸û¨–¡õQóI;81/b$«<'°JÊŸÙŒÐÆ}­uöø\rïæÍxÍë­{t±u–ϳu浄½ç¬…¿Ö_ÝsºUêMG´o¢*Ä1o©¾á œ‡"¸õ£Ð|ÁÒJ·-åBdRYÞÜÏ›zɰ1u¸ãt»s7¶ðê«ÞpåÙÐ_t–Zl.ÍFg®=PÌUÌCÜ…³ߌÈÇ*«½ä‰7ö\÷õ óLzÄÀ¯)øn˜Â|¢ÜzKËÈäE¦eSN0\&#S\ï)R¹S* ÚÇ<¼ààA&| îP&_*mc]]¬•Q 3Cxˆ€x_§ÀŽ“a3@& ¯ÚŒ7@n'j-„vžÌCÖ*mQß¼%’4Ç|@iºå~¹*À˜L`•^ʘ&_ê>¼Y©¯­àP(*˜¥ŒÈXo"¹±OlʪWÔ£Uö’s)r¦A8Óç;;ì ÃAâ% *ˆŠ½qØÃS›q9&¼RfK9Ѧ7!àGpý’C ~¨ .Nv ®óK¤Žòè)××Y`=µ9mÖ*ñ7¹žk™»­N)~ÞÞÅT…_ ]eú>†ðŽ]®*0W_ž‘ÌÕái Çô&Š» äjå°ÕW¼²¹:vkˆ ©A”ëqJO)Îß—s4Ý/s}yæÇĤ— ·Ý·¹¤Ïÿv]ñJÓùyöÖ­ºM—¨÷yÓ—…*Æ“õ>h甫!œ*‘(7ë'kŠŸÑÇu꾇@ÍF(?üwÓÉŒy[: |ó:gP¥|êl½J7Ë’ÃØ‘@å#Á“b—‰n(ˆ l&c>zËé´)/Çsôÿ½½ŸÊÞæ ,ÇŒnÆ%ä-&ç;ö<¤y)Îâ ˜ ŠˆŒD dÁRË ÌA»…ÐÆÖ¨ø ¦c;<Ï:uSÀîYF7an„üƒ%… CM'ðÖÜócïšàSnX*¿²ô›\ÕlŒ Ùl;nx$¨™nQªªÛx˜+˸€˜79ñȰª™p1Pmop7ˆÄ/Ë1 ·Lb/Da^–þâùrî˜ܵÐòƒÁ6ƒ6!OÀc0<{ èv=`‚«SzjiãB›…\ñ—…q\ÄDh+2$ΔÎr*Í“’ô¸ËéÒ®/]Ð7•Û0’ɵE¹©§—ÅÎKÝLx抉éȾÁN¯\Ž2ìÈÄ×_œ ¯ê(Ûd·F†ß`þÁr—¤âƹ†Q¢ØsË9 Dñ‚#Ÿ”p ùό㨙¡žRÖuâ1A$¬™ðÞ°®£Y9w­‹Bk¾6GsæDŠô.κ¾¼óÄu_rÔMèšú‡ÓL’^æ¹m¾6/¥nÜÖ›uër±¬.ØóuÏ3ÏÂî¡D®—‚Å*¾àÊXóÍÿŠNè'šÍÛ9P´²®äK~W^ˆ X6¶%¨(„ß”Ùoîí¦´4bB_7IHèqÄhilf?Œ¶âû”KÓµgÊ–æíª±Z ½™KeŒÇ¼P=„†åQÝíR³xŒ'{Þ±ý ÇœG5ŽÍT' ;`Ò r=óÚÓ%ŒZ“€zoš«EËg¸±îå’¦8œÓÛ›¹2ÒQO8XÐ?Rë›}ÓÅ2[®‹]V]DìÚyÎ<\œ±ª>ÂoŠ 7î¥äy„#íÏfᆵpgªn@¿ïÑ7n]YÆOJruuD¯t¸†«ÂÓ¤=<"P AɶÓ,¾O0CG’;m>‰Žè`g¨îƒéUàL|H!tê^óŸÍ3X×Ó±©W8)„uG‰écMiúCgj¬ë˜6IÁF.“Á:ÁÍ¿¦Bë)Æ;ñfåû"¼oÊ{ËÕ@(mг@)Lßݘàs'jN þå"æ¢1ã ™¾©#¥"xh1àì„;¡t‹{˜»JˆP—ҶࡈÕV=¹ŸÊœ]æ Þc¼µwK¤}j€ƒé¶Åƒg»­ !L„b ]#”n)€îžŸRol~Ê'©ªÖ­|d¤2•­¥+¯ó޵Ãb,“½«ÚŠJ`Ô*þ¦Oªvq ,0„¬’/4åî¹ü ““°.ÍÍ i~þÉ(5`¦{Îê~3¾súƒ5cußõ}¦ri5nq¨9òEýŸñn†xoÑwÂ^+'Úù¾îLY>ÿÁ¯»Ï‚}ư8ná%I1†±Ð\—÷jеW”³¾±üOÔ–KûÌÙb uÜ­4’k{ûØtØKº„³u-c"Å~ÆrxÀŽp!–WŽaðlð›Žͤ£?ëöÍÜñÏíŽû?BØáHÛj: ~G^k;ÞöÖÁÇ'ÅÔ1n SQÐÁ»®ï§¬ªp‡N*#1,1ºþ›|¾%›÷ŸvÿÎ\@x endstream endobj 4007 0 obj 4610 endobj 4011 0 obj [206 /XYZ 31.5000000 471.500000 0] endobj 4012 0 obj [206 /XYZ 32.2500000 277.250000 0] endobj 4013 0 obj [206 /XYZ 38.2500000 623.750000 0] endobj 4014 0 obj [206 /XYZ 38.2500000 623.750000 0] endobj 4015 0 obj [206 /XYZ 32.2500000 152 0] endobj 4016 0 obj [206 /XYZ 31.5000000 471.500000 0] endobj 4017 0 obj [206 /XYZ 31.5000000 278 0] endobj 4018 0 obj [206 /XYZ 31.5000000 153.500000 0] endobj 4019 0 obj << /Type /Annot /Subtype /Link /Rect [60 435.500000 91.5000000 442.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_introduction >> endobj 4020 0 obj << /Type /Annot /Subtype /Link /Rect [60 428.750000 126.750000 435.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_command_line_invocation >> endobj 4021 0 obj << /Type /Annot /Subtype /Link /Rect [60 421.250000 87.7500000 428 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemaps >> endobj 4022 0 obj << /Type /Annot /Subtype /Link /Rect [87 414.500000 159.750000 421.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_name_comparison >> endobj 4023 0 obj << /Type /Annot /Subtype /Link /Rect [87 407 140.250000 413.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ctype_imtype_dtype >> endobj 4024 0 obj << /Type /Annot /Subtype /Link /Rect [87 400.250000 162.750000 407 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_in_out_directorin_direcetorout >> endobj 4025 0 obj << /Type /Annot /Subtype /Link /Rect [87 392.750000 176.250000 399.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_din_dout_ddirectorin_ddirectorout >> endobj 4026 0 obj << /Type /Annot /Subtype /Link /Rect [87 386 141 392.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typecheck_typemaps >> endobj 4027 0 obj << /Type /Annot /Subtype /Link /Rect [87 378.500000 152.250000 385.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_code_injection_typemaps >> endobj 4028 0 obj << /Type /Annot /Subtype /Link /Rect [87 371.750000 150 378.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_special_variables >> endobj 4029 0 obj << /Type /Annot /Subtype /Link /Rect [60 364.250000 101.250000 371 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_features >> endobj 4030 0 obj << /Type /Annot /Subtype /Link /Rect [60 357.500000 84 364.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_pragmas >> endobj 4031 0 obj << /Type /Annot /Subtype /Link /Rect [60 350 95.2500000 356.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_exceptions >> endobj 4032 0 obj << /Type /Annot /Subtype /Link /Rect [60 343.250000 90 350 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_directors >> endobj 4033 0 obj << /Type /Annot /Subtype /Link /Rect [60 335.750000 98.2500000 342.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_other_features >> endobj 4034 0 obj << /Type /Annot /Subtype /Link /Rect [87 329 191.250000 335.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_nspace >> endobj 4035 0 obj << /Type /Annot /Subtype /Link /Rect [87 321.500000 144.750000 328.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_native_pointer_support >> endobj 4036 0 obj << /Type /Annot /Subtype /Link /Rect [87 314.750000 143.250000 321.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_operator_overloading >> endobj 4037 0 obj << /Type /Annot /Subtype /Link /Rect [87 307.250000 144.750000 314 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_test_suite >> endobj 4038 0 obj << /Type /Annot /Subtype /Link /Rect [60 300.500000 117.750000 307.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_examples >> endobj 4039 0 obj << /Type /Annot /Subtype /Link /Rect [60 293 162 299.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_planned_features >> endobj 4040 0 obj << /Type /Annot /Subtype /Link /Rect [248.250000 161 255.750000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp >> endobj 4041 0 obj << /Type /Annot /Subtype /Link /Rect [291.750000 161 304.500000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 4042 0 obj << /Type /Annot /Subtype /Link /Rect [68.2500000 251 138 257.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.digitalmars.com/d/) >> >> endobj 4043 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 236 540.750000 250.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.digitalmars.com/d/1.0/interfaceToC.html) >> >> endobj 4010 0 obj << /Type /Page /Parent 2 0 R /Contents 4044 0 R /Resources 4046 0 R /Annots 4047 0 R /MediaBox [0 0 595 842] >> endobj 4046 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 4047 0 obj [ 4019 0 R 4020 0 R 4021 0 R 4022 0 R 4023 0 R 4024 0 R 4025 0 R 4026 0 R 4027 0 R 4028 0 R 4029 0 R 4030 0 R 4031 0 R 4032 0 R 4033 0 R 4034 0 R 4035 0 R 4036 0 R 4037 0 R 4038 0 R 4039 0 R 4040 0 R 4041 0 R 4042 0 R 4043 0 R ] endobj 4044 0 obj << /Length 4045 0 R /Filter /FlateDecode >> stream xœí]K¯äºqÞŸ_Ñk·¯ø(yÈ"À`ÈÂÈ"Ǿ0|L¼ÈߤZ"õ±Åê"¥>sîÀži=HЬ«¾*þú¯_ÿëò×^~ýðõ.ßíß¾¾TWSWÓ—áÏ/Ë ²½Ú_L[_¾ÿþòãòãåËË—þÿ¼L/|ýðïý¿þï"/ÿÖÿïo—?ýgñÏö¡áß_Œ0ýßÿîŒèÿUÍ×{ù?\þ1´èº³ƒYÿþEöËfÆ®¼¸ÏãŸ~ÿÇ˯Ó¤õ¢û×ò"´ÒÑiyùßÿ~ùKßk¾ºvZÓhS=Ò‘‘sO²ë[ªÃŽÆ?LÍgh\V*_ããÈÙgE¨FÄ[ç\\Y×ÓɪË1ÿ®ù󯛌‹;Žœ}VÜââÖ9·6­ ¡3LÑ­ù 7È×ø8röYq‹‹[ç\\£UÎŽ5Ÿ¡ñ¶nò5>Ž<ÛââÖû7E×T¦ÕðßľÛqΚ^dhÑ^6B¡žÃÕÊÞssXÏ£€.حвÞèùKJÔaNÍv«\Ú­=;]BÛõ!6'·ÓMß³Ù¤¥Þhû€é«nÓ'íô‰jš¹,jú=Æ×'Y3¡Z•kÍü¶O´fýÐôe9PýDk–…϶ˆá ÖMŸÜöëÕ¹A>ÇbÙõð˜ÕyÓªÙ_…îÚÓðß°ŠV-4ÛòölŒðz¦-z@}·ùÝðrÅXâý·—_?÷Cêíþæòí/½™3ö9ýõ­·ßëË/ƒç£­/ßþ|ù—ªRŸÿxùö·—îÚÈÚ qºSItG¾ƒï(tG4ððΧô~¼#;ØZKxç=üR“>JÃwð86 ßÁkŠÇ&àìà/U„9À_ŠiTM«ðé[Ïx¹yFTúþšà™Çt )IažÁ\‹©Þ‰Œ¿©"Bc°]dÀ‚äˆ% aµ‹Ò¥TÐ%‰–áÌG¤<^Hÿ‘~°L‚£Ž¬}Wpµ´|`æÕÇ‚#mÄ}ùË6ž FWã`¤š §ZLSãñ\{m»j}ÇßÖ‰ÄôU«)øé“rZk†ðÎ$àê«’­XÝøFû±D•4Ö4âZë¦íoÞþaFUúTpÄd„¶·! ïBä»”÷¨•'Ê}ç®Ehýþ‚ pòšØª†#Ác„w"Sû‰qð:d¥PU¥sœþTNˆÊ¶}j0²Â#À&6 ýçÙU# oÒñÊQ(¯6î‡ò¥p‹qGP6)G^mØÆf/ÁQ¥ ^ÓHkpM)‰´å/¸R•yd3×þî2_'›G¾î)µÖ›Ûâün ¥ëèòÍmQÖm¡šGœŸ%ÝChëMÞ=¹¼«_Ÿ¼ÓÕ#Ž¿×h™h)žD¦hÍßk{ÝV—½¹6t98,ìX'\uü‹Éwì2ÖW œ¤i#ïtè5±°PW#¡;VnÍÁ$^ÌUî¤~Ï{ØšBïàQKxÏŽ˜|•ÍU‰‰®wŒMÊôÙ‰ŒÀ Ø ãÖúÀ¹®ØLÌÊã‹MàùïXÚkœ¿ðÖ۷݉qÔª ‡Éàw§Ä+ô«ZÒíÛ:ëo­í÷ãæÃF±’sû²ñg$ð`aÇÌ-<ç˜ °KžЂqŠ0vCXÁHÄŽ0ùÁ"á+ÂjÈ “˜?B¼~x,BˆÇKŠ Ä­à¬–$9¬w>0p,`6ÅRàCn=W÷ª}­è(qÐ@´’¨SEŠìg˜×QE9¾é›ŸPß0|`Þ`ƒ%7ß!ÑR+ˆ5†aì7jµ"(^ŽÆ&òaö|‘•×sÔu¯ëa]RØšÜ^Tµö÷²GɈÁ†ßýPŒ< ¡ŠÅl|$ùt<]xR°Ä£l‰ 1XJŒñØÑ”ÄvRö¥w ÕÈÞ3Å 8Äêöþl'è—ÿÅÞ}¿Ÿ×0”“€gŒ ‰kÅæ4err*£Ö'#ŠAÙ°•òL3÷oÆIŸžÐa½0ÝÆI@¦?•G™9L‘ ›¶ Xÿ€\;'ès–털Ès-å 5:àõŒÊ²ijOY’Ìq,ã9b á[ÌYFð%À>+ä0ŒD5(QšR‘_ÊšžØ^¤81ä âk­RÜÈa82/Ë3y\Jæ»5â~Òð[a‘LŽ]&T¬€èÛHf\9‰ó¶0‚®ž·`2¯ñ—2º(øl;‚2ü¬æ™'`Ù#_ÇÚÚó•itwŸñBÎ*…ëÞdMV(\$ ¿ƒÇF™Q¬k±>ùHp®#­øŽ‚º¶Ôúà;½›-qpYÓ8ç Jʘ¹nÒ[I™ª\I™Ãa¡'pþáu²3^Jß©[lfßPÅQ$´í=©–S5u§›^I(%á3"ÎCŠ[1è{G÷3NI—š1Íú[ž,9ým“õñ›TJq©R®®s¤î›î‘R%¼ÆÈšfñÍ 0;ŠPR+*£r×C™¹Róþœ±è‚’[]¶c˜ Yd“¹šn½GŸÑ om&óA Õõ%Ÿª®²Rëý+6Ù&úÚÝÚ1ko}Í•ï‚ݰ«ÆÞ‰|é"4±çt®átÂXgêáÔ„ËïóïæÚ¶ÕÅTÃ_FˆéôÓ^šÎ¯à®|iÚ«l[1?e–­¸_Sýóö·^»øo« Õ¿ãD]ÜH§VÖßñýå·—÷X͉æDì£k±?ÑNÙ]+Ö ”† î!JÝ^¸½Šl÷ñ‘--ÞqxEo¢Ív:C¦•–6EÓ./¬NT!Q}§×TßÕ[Tߟ"û+ÕO™e+î—^S}§¶¨¾“A2¤úþš©ZRýÜÇT/†¯Ìï-—e7MH,zÀÝ´S%á… UØ=o˜#ƒÝÇuvQГ˜° ;Ô§Y\xTˆª'¯…(èëPôW›5›ŽWp„/ðä Ä’bÃ9l?7㸹UË Ž›ùivèhM³¯e%é,q½¼åÌ¢nk½îJß¶ó¤oWmIßNúbqt£yÂsxÊJW׌ýi»¹Iß¶Ý’¾­ñ»iM(}ǧôº½îæPéë‡YÓ(™U.GFPVbïA]ãD\]È(‚äþ…{-Âépú{-™UÊK%T§·Xâž”ïãZÊ÷-lHùþ?OüŠÑCºÒãS“Ÿ›q?Ûµ”ïÕц”ïmf¿›ª ¤üô”^7£×Ý)åÅ È M¨8ÐÈgŸ-^G}»Ý®f«n„pzU‰å…ݼ%Ç[²Ýâ­À ,¬xÅêÆL®÷Óx¼%›-Þ’¾K{¸ðÖø”^7£×ÝÊ[3d†ñ¤ÀÐY#„ZÂwXô= x&¸ûÁŒ¯FA©jya7ãëÆc|m¶?põ ëê]ñíð”el׌ûÙxŒ¯ë-Æ×¾ãz¸0þø”^7£×ÝÊøµ;\ÊbÍDum¦ƒwxuhÄL©‹ÌQz‰b¬ãÖðÒ̵¥( ’`5æu2¿×ˆ ¤^^xâ šƯÿ½ñÆj ?M€ñ›ž2ËVܯƯÿ½ñ믪 ã7^s#]`ü} qfÆø"¶¥Kz¢>¡¯Ò;,R!Šr„ Îò¡îÝÜ™pÂÌ0Š®^^xœeZ½f™v Øÿ¿ñɹ ‚ÓSfÙŠû¥×,Ónû«2è#Ž×ÜHÕ’eÚ3E7ŸBZ“’KS$IR? $º[À¾]^x˜ødµ†¤Éj ’&+’&«’6>e–­¸_kH𬶠i²ò!ißø†kn¤KHÚ­#‰OVÝ#òºC K(1KmªÒˆ]Š9nÚå…lj]Ê5±KµEì²ö qtxä:ªØûkn¤bIìRžØeû±GÞy*—w"mË9ÄØ¬.}~óšAè9^Ó6Ë {}S²ñ@U²ÙU `ÿµÓH6!¨j|jò=Í͸Ÿ¨JÖ[ *Yû ªáŠï›šžÒëfôº›#}S²™* F ¡oRq£R¸çàT R9áX„ýÁEj5á1b³“¢f e£µ†­Ý3U‹-‚®Ów²q6­ôòÂnah<Œ“l·0N²õ1N² 1NãSVص+Œ“ëæ& ÍÆIã4\ „¡™1N·fôº›C…aë 2 –!ãÍuK©w…·›å-ÅÎj Wlígïv·8>L·ÈηÈn Ü2„÷×|§ªÜ2>eÙ·[[\77öî¶À-²óÁ-Õ€½»ÜrkF¯»9’½UåÀ-x/@ŠÃñVtä=}{;D¡œ]¤cŠUG¯…·›gUuͬ.ìåY%<ÐŒ[ %}ÐŒ’!hf|jâɹ÷ÓÍ(±šQÂÍ W|žžÒëfôº›CyöVVA•L¨ê¹sxÙEæsÀ(Z;ÈyÄ ˜Ïš ÆIÇÌ$æt)©×*Ù]xØc§”Söî·ÙðØ©À›¦FoÚÚç6>e–­¸_Éâ~×;¥|¯àpÅ÷Ø ×ÜHë…ÇîÖÇ‘;¥g´ Áý\^Ç6‰~@¥]¤RZý¥™0+ª^cVT½…YQµYQuˆYŸ2ËVܯ5fEÕ[˜Uû˜•áJÀˆµÃ¬¸VÖßq0#63fźëkÕ©V¶S@Ú”]*eŸLÉ„ Øéœmz<<ˆ"5H'{Š!Q¾ç§ˆº¨Æ…ÊUm–öJ[Z%G©7­z1J-çsu>Î*Ê+¾èJ9†w,y4W«áݸõN‡Þ±>Þ­ÖlñE}õM «X͵kýQ»â¿á‚¾‡­}Bw\žÀÆpÞðØà—FÆV­‰-×yBç›ÑЂ#IiÂYvfAÕÍ"»èÊx³K±©)ø;^½I²qñÊçØáïØ‡V£üÕsñT)ÕòBÎT`å‘-ºž¦à“ñÜš»·üÞÌe\´?Õ¹t\„Nû¼H9‡‘iyÀ³å+Þm†Ææ¼ªÆ× 6Ë&ÌܘWüޏgÛîh¤Âæ)î8hmý}3G×1‹F\{¾ïýïGÄ?˜¡‹´v¯rñÖâ;pÑ+(9#{aÉáŠZÚ̆‹;,EöUw·Ò™Ýjuí ·ßúp8TÊëÈLeܳuH<«@q ¾6•Ù‘âÔÄßE± I‰›ÇKŠï$H½{fÇ¢ÂÖ“" ‹í˜8|FC›zxáXT7¶v1Ab» i¿…œ›T±Î+¡¿Lg<ýEñ„ÓIr6a¡ÙýB1Öe͵8(ÚUÂßÖ`8/LJNÀÇ¥Ñ÷—¥å=­…’›rf!+:bË’n`¸yãN(ˆÑ„U9qª )u÷œ2ò>¾–$)Óí$oˆ ôŸ§ÏW»¯’ÇÀìTåo–ϯÆèæô‚;ÀmÃŒ3ಬ„jšå•|ð6ë&­…KŠÀ§ 8úÄLƒR¬çG@_”¤dŠR{¨®Ç™z>SWèzyá°Þ0„5MÙP^šÖƒy3˜¦Lœ™S™8‡ƒ’+BÑ”°:v$élÍ‚Ú7ê}ê>SÜn”¹¦X‘<ÞZ”|L, (B9&’3DÏ3Ê™*a”'”˜3(§)°fè•ʉp ÅÔÝŸ-_,¹nå*Õf§[kŸÍ¥#âœpN¾CqÑÖþ=é—oN©¢P±D¶ÕˆPœ8âÅIp âack:fº8³Ã§!6Z”Š•ª‹©Š^Íaׄ@L,ïð©ñÚ¨µf­ZOm’Î'ÀŽdJjA §øì«…P¤ž%Ð@qÅ‘jÒ²2鬂3oyDQ©=0E¯±ÄéX)…â:J¨èBŠ–ªÂÎ{\b RNÜ(txYälG:ûä _U²ö7•ODi…C©:Hi£zø ¢(G [J17æêR''kœÀ©ßÏF¼ûÜoÀÍÝ{¤ZÀ'7ÿÀ{È.%üCáiŒ†ÉrtKV@†öV„]IqESÄç;Ι²¯HÐØ”ãq™½o”8 ôŠQ,óbõYý)‚K¼­<ÜõùÔå s3x½ØŠ Ë›R6œ÷¬°œŽG#}Ûàp0K©òRp[ÀŠãx§ˆÄZ :E´–‚—ïWö‘å!RŽã}z) HC1¹ 1ð <oøÑP¼Ýµ]³:•¿?£sIˆœ I…8%Ôäf,$ 7RŒ”áe »¼Epw}Wæn‚AEðž0³^1OàíìC k?B)[fëä9G,æÈÁÖ¢BJÓž$r£­zš‰î:ŽfE'*7¡ËJù”ŽÏ®b]KæRä/jeŠd,òî¬ †l¨ñÎw K îç[8’œÅ xâdoRì•bcâï¡ÀLX7ã! ˜?£®jŒo•E¼ýÏ|,J’`³'å<è$ÅVÉMy¤¨Ù‰Ý> ;GÊ!®)ð»iOíT<â>Þâ"ñ:EÚä÷fŠªñô rda¥ÃâÍgF@„‹@1).·¹Iκ™yÿPQ¬PÍ’©¬jfzBé+œ†ÏÛ¼`&Þ™3x-$íK‰ÀðJ1‚˜&%¹,Šå³^B˜Y¢³2É|{^ÒMèó 1qF<»,Xõã‘D¥’&;"b)'|R2.x—ðOÀmÇûSW '. ðJÜ(ÌœL«d†jv7G‡:UûŸ×žèJ2ÿ hÐ,)>gØz•‚z²’Eë“êa}J+æ¸$ÍBXjoqê„ÎF瑵%BžÞ0ç7íO–à‘’°¡«&ÿÅÆéøÎs½,qä—RE‡à* I˜Bé4)éóÍFA{ðžñTU؇‘âP…„Ø[ÞœY”•öô¬=á Þ<û„wx“qY“Næ¨\À[Íùn"|^$yÓu>75VRŒß¶uZmÜ© ú·f?oëÝQ Þy‡îÔpÔøŽÒ¹¥Xk6Yl+x÷_û½J¤00o" !¶›¥Æüér@ óS7>ùÀ'¨&øÊœ³G Ðty„e Ÿ:GÙP“²ƒX3}Îl ‘Bà ‰¥`+šþµ¹—ËÉ 8PºL̹lüÑOØžº ¯µÅe?®îYp3à œ°x·›3{Ý3™¦ÞmQv6$@#–È¥¶,u¶žé4Û×Î>õéðcý"žhBFá©OLøy½3¼'@pûsš…µò4s 畸7°×‰ ÆÂ)ïÙI)¾˜„–Z؆IH£ Ø×Ì»JD—Õ!åyÃö<‡bŸAG‡ö&éªu+Z3KÚ¬õmÆòBÓÏrÜNž£0oùÛb¨ßÌ»$–”lz\}K~å-ºI9õxÄéHgÖHœÏ‹I'Œü>9#tN•Ãelá Žªã•åDÜÚÆúo Î @;î00¼±Å›üé(NÑNUJñlñžÀD‘m'®Á[¦‰çTåg¨çÐ…ð¨ÅüçE;#>8Þ²Åø3èÚ`ÔZKµ$Vjiº²KŸ‰×jk|}v/Œ0k×i4"ÍÐèØf}¾ó÷—¦Z]øûË׈þÍ£¸‡!x Qk´ðÇã"b娲ZGÒ¯©¤·¬Ê—”釿ܧð¡Û…ÕMáÃÖSÁã x%ÎÕ·¸)ÉRä‰Óœ2y©Óµ¯xË5¾ªønÚ`KUk&ì u µ;„«½H½]’t¢¸F®»>Z¯Á!â3ºc骹ZÔWð[ïtði… §Ý‚Pô5€—MË+Eø¼cÉÖ—V¨›-±5ü= ¼£à8‚ ¯¡›2µÕ^…pFñ\OLf®]ëߣÆ#(æ_m{ëÝN+æ1ó!Ð)§2²†ï¯bÿœ)G„à9Ý3-»¶y[eÛyl,q©É-ST冲&ùš ¥±3Ãㇶ>K3§4§ׄ*W¬Á{Lc¡C="ì€÷6ø#¶3r§ÖâÏÀŠ“£ã×vdÌ“p‘è™u KÁÎ@3©:ß&7Æî,%JóÂ,§QIØ?BŒ™tš1fñœÛ¯ÂHÞ´À[Â^žbÊ\¨‘w‡‹¿'¡Áán Š×„©ÆøŠ^áM8ýœ}c}yÒ J •qØ_G„ž šç'àºÙŠCD<5næÅ]GÍVÅ.™›”Z;Ì®uô‘‚ÐG‘R׆PÆŠRú’¤4q<‹å?Þ¥C1j(lD)×KñÅ?p’X©åYÀÖIQ\_SAêž^Ó<² ÿQ :K-†“ú0cª%Ú§Ô-µ Ìã,á.”?7X¯ö'¨“Lñ.bÙMѼ)õ†%™THëF˜~i$WÏNfÌVB²*¦UJ 6äÎ}Û¸S.†åW«æV°j®¥µ­;¼kýFúÁ£~îàjÃò]![¿3s—o¶þ›­ÿ,¶>¶Ó(ÉY? y?Jú94‰©Ò$Âx2Í2)f8}‹œŸ°ñÎ;Ÿt³ËoÝøü9IòÈókÙøsˆw¸¬‚R!ë¨úññ‚„T+RâGúÌ™Y‰’zi7òΛú !^æßŸ¤]ìàïc_uîÜ„·Â[½é›3ì,“ð¼Ù´Æzμ«`GW ׫Õ^Ÿ¤sï)Xƒ,‰¼8.R)ü7>÷hLÑú„ý°³&0Nß@™?3(gXRüW¤ãÀ÷ã9l##ƒô.?zNˆ2Ê—{ìà¤v3/¥'èJ 1Î1{t®€’y·ÙøÄiK/¯rt÷…B§ ï¨ö ûOBÏ„øˆúQ÷B-[cûl¿%öai¢oCªîl‡¶Ò%lÞÜÑNŸ!pkðK­"éÓiRT‚þÝØzØ$žUHK.L˜p +áR‘7VΪ¸W`žo¡M¥®VHì[qÌÀËxÏ]Iøåòååÿ6YN1 endstream endobj 4045 0 obj 7479 endobj 4050 0 obj [207 /XYZ 38.2500000 427.250000 0] endobj 4051 0 obj [207 /XYZ 38.2500000 648.500000 0] endobj 4052 0 obj [207 /XYZ 32.2500000 668 0] endobj 4053 0 obj [207 /XYZ 38.2500000 477.500000 0] endobj 4054 0 obj [207 /XYZ 38.2500000 427.250000 0] endobj 4055 0 obj [207 /XYZ 38.2500000 648.500000 0] endobj 4056 0 obj [207 /XYZ 38.2500000 363.500000 0] endobj 4057 0 obj [207 /XYZ 38.2500000 101.750000 0] endobj 4058 0 obj [207 /XYZ 38.2500000 137.750000 0] endobj 4059 0 obj [207 /XYZ 38.2500000 477.500000 0] endobj 4060 0 obj [207 /XYZ 38.2500000 137.750000 0] endobj 4061 0 obj [207 /XYZ 38.2500000 363.500000 0] endobj 4062 0 obj [207 /XYZ 38.2500000 101.750000 0] endobj 4063 0 obj [207 /XYZ 31.5000000 668.750000 0] endobj 4064 0 obj << /Type /Annot /Subtype /Link /Rect [481.500000 328.250000 501 335 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dinput >> endobj 4065 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 313.250000 541.500000 327.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 4066 0 obj << /Type /Annot /Subtype /Link /Rect [487.500000 293 547.500000 299.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_imcall >> endobj 4067 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 257 545.250000 271.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dpcall >> endobj 4048 0 obj << /Type /Page /Parent 2 0 R /Contents 4068 0 R /Resources 4070 0 R /Annots 4071 0 R /MediaBox [0 0 595 842] >> endobj 4070 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1701 1701 0 R /F1410 1410 0 R /F8 8 0 R /F4049 4049 0 R >> /XObject << >> >> endobj 4071 0 obj [ 4064 0 R 4065 0 R 4066 0 R 4067 0 R ] endobj 4068 0 obj << /Length 4069 0 R /Filter /FlateDecode >> stream xœí]IÜÈ™½×¯ÈóÎf,Ü€•ªj€9 HÀ ŒöØÃ6FöÁ2‹dVV0_ñ262£…n©+D2–/¾å}Û/ÿñý‡?ÿóðË×ïÿwøuüýë÷§êØÖÕðÏáüë7×?Ýqüó¡íêï{úyøùôíéÛé¿?Ÿ†¾ý¯ÓŸþu‡ÿ<ýû—Ãï~úáÇ¿tþ {jE{úý¯ï¿÷­8ý©ºü~þùÿ>ý÷¿þ~~ãô¹q2Ÿÿÿ7²ªú¾=OcáÓ?Ÿ¦eŠ÷_ÿüõïO¿ àö]‰¾×¡Õé?½–‡üÏÓŸN˜^_»füþ™üxwú¸Tª;}\t‡Ù—ÅéÉ^ŠºéÙž¿W©áÙïµòüA­êƒ}uP˜-öý—Ÿ×‡xyÛ|ùû̽ïŠ8¿Ðöö0Ǭt=n•Ô­ÿÍúx}€“Pm%½ü}æÞwe<æùÛ¿¹¼OÅÊZ|þñôË[ÍáǟδvþàðÛ:ýω6Oß?üøãáßOóQ¿=üøË‰3UÓšáÇ®¯Y¿Oxiáˆ~ÑG­As>S¿¨c­›®]ùΜìW÷‹}àïà¥Ë.o ^‚ϼ¾ÔG%;ñy¥øbl¤«wvF1– Å äìëŸÕ ήBvp§+âÌn$ Ý37ÏÇ^X¶~ï’HI¨‰ £MïùŒd_Ð_e¦d!s¼ÚÜÁk^œäÒ}"E¼ é›R¥µ)VD”ÏöÆgGÚ»u¹j¸Cý‰ß:=…xîx/nQ?|[õ²p—n­Òž[õÅס õ¢©Z“ð­Á|Ë-¼j̰T'ä°Öpwñ]ǺÞü Á9,{Å‘|[/‘‹z´ ²f„›Â3ÀŠ–ĘRLå¿ënxÓùì°ï¸zYkß*ƒµÊá›BLkZ£c2÷ÑÛÚ„Xž8]S˜ßíïÓùt˜=y }¢R¦²£kÄb(Ë«åˆð›ªïâ9¯ÑŸ H$|e¥ÍûØ ['5¼à·UðÞ{cD)8òŽèà¼Böbµ>¼ED"àÞMH¥¼¾øªxÁª iy&þ“J—á— bÅÞ¯™€5Çg“ºzðjí0Tl™Ûzêbˆ_F{ 3Çõ2EçŒnÂ>8q ‡ÓÀÖ¢‹‡aß A@¡yv"R3c8B7Ö&%¢ÑÓd¾¸«_é uŽ`@ } \³WÀ:¼³”QÏà3ÔŽ¹¨„xô" (EgÙµLHnõ¿ìÁ -aÂÇ×6–ÅÂ( žœ)æE·¦¬Zºah‰dR “WçF,0i™_ôNˆEªøjé˜`Õ…qM3Š$aøú ‘±ÈªX2ïeáõXü‚„T®ÞàÛ‚ËDQIiÅœíYÏXÑŒ[0wˆ¸]88΢íËèmSÔè²aÔfó7 Ê7zBÅ ¤N¹«å›r†[0Få Hc‹Ð 5Ü€—A¶MÛ°^Ô1;æÇÁåUФƒ†föŸƒ¥É·„¤è Ñ}Vto…Àp‘—Ý bAe#”éô¶ †àÀÃh±RˬáÜd,q*êI¡—ÃŠêØ´â“}ᢠx¾EÚ`:g”$xÕ©ô—}ûFtkªq†X,?fò Ï 84ˆ˜Û#߉¸@hÐ i 8 Ç1g~!V¿ªk+þ!µ˜HFϾìYô¾™”eÑUðì—ôx7识ô]ïkô©H°•ü5Ix¢ñbŒ2œj}Ø”C¹%cZ.¦ ³¹„\õ5¦éH¡DX5$øå^åÀ¾V½úÌ~`dw5¤é9 ­aÒ Ó$‚Ö<ç–ùüÚw˜0æ:‘ßëS¢“eËX |Ó"ÅKyf%ƒ$¾a$*|oñ3Ï#TæÆ#LÂ=s;-êc}0IŽDDçœh³4ê^²¹B–йYÍ/ñx&Ìñ2(*ƒ8(¡åö˹Ó~±˜'=Ï {‰uò8òŒFD‹F$|kÄw\Ë(¤NÞ ãDBgBmÒÃÍàÉ?DY£dðqظéÞ$Ï‚Lç„LãÉš5%(EŒ)fáׂeWD*ºHåadœQNÊóž´˜íÖ¦/ŠÖÎŒÃd˜^4¬ÃKxÕ’_'dŒµ– Z(‰‹'¤º_–i©¡›iÒ¶Å6Sjv\¼¿$ YÛUóôüI˜!.EY'H2ŸB¸É±®Ù^à­ö(«ÐA,Íb°9ûŒBÖ×µÁ¤b%ÂGÓÙžä—L ì‡ñ R©º âÙGÕaÎ6uÅ ÊôZ,(š¡<ÌúVð RÀõÀ£U¼;}x¢_&XÄG,,ãšÇte™,Sj½Ð 3ša¥NJ|ú¨ÂÊäS娉ÞdH4 <§BÇJø`ÄÍ wðào2þÌ%÷ڇǀaCÂ=jmH³hàUØÊ×~ÞkðhµËsNCôÑ 0ZÃ$/å!±v“¿Èí; \°Šc¢#¢Y^Éâ¸ýæ{3áÇ>X¿çtÇõ ›^%LY[À×@Žþ`€î õÍãS}ôx¹ˆýYqohd¤îæ8"«žéá3é }œÏèmR¢g*<ƒá¤@¸£ÓwDïï¨DÓß;”ÔRmkUuDÛ>ª>ÊÙ˜g¾ÀgzøL7mî`2]‘çþ¶ú’T‚›£z¿dW#ú>¿3Zm7fmYi5}§6¾3Ø•ŽUŽš‰oÌÙewF6xë™g47<ƒ‰ø]Ö3Fò¶G¬’[ûÖ»ÏzÜ뀂oLßÔ¢þLn^ÏTèe·3"™Ö`äµ!rÝ-¡Zé­ôˆΦz%è.c+>Ãpâœ}!L¨È6#k˜¨*ˆaQ!°€Ð¬êM¹™>;,"æ9îf†2DòÇjµ)g¡~õuali|CpÓéÛŸ™¥S1ZÜQ×Â`ê๕‘­ŽàÊ'¸fÍXßÄÓ "Óuœûܵ‹ëƑߖ|ÝrÓËHæ÷9ºŽrÓ몹‡Ãu妗‘­Þt\#bÃ÷ù£ŒŒßû Ÿð™ô4VFÊ}^E½qî¦Öaî&¬hc©u9\zJ*#u7yêskµ¸:æÖ2Ü WŽÂ2ƒOà3±Ô®*ÂÝÚ‡£Þ8¼¦“…׬9­¢ñ^óˆÔ… 5•X<­X‚åÖõ5Þ_¢‰¦eEãÙz8êÃkäò™^Cò<7,k™ªÅ¸žöèà¹^S¨wÔ‡wª~‘ÆÞiét„ë“3{•\ß(#ûãA¨7Î}®ïŠ¢„k°<ƒëz{eñÚÁÁ"±Ôbd–;³ïr¾Ï…zQožÖ.G’zæiÄ™e#åi<õƹÏ} xQ&êw‹ePyŒñïLÚos$çû¼êÂZ&úÔbÓ1àˆËe$¹CêsŸU˜ˆUÊÒÁº¶öˆ¾%¾­X å>¯ÒÄÝ4_,¹ñJqIˆ–8¼¦Î(Ο£µùõRí¥ðš,¨7&îжEÆn“;lÙŸ^¸Ã樗陾J _6µSV—¾l*œSÊs,Qu£ÐéT/wþ .å‰ËŒj¸K TXä—Íz=¯è;Af¾œi×7Ñ© Õò.y1¿ý¶çE»™FPëÛˆPý˜àì-…ñÛü¶¸Çsó[Y×5ÅõSñ3“ìVfeU<²“¢ôLÙÔrÈ;d¦ÏØ݇,tª;C¢Zªd›”-‹Å¢/lû‘œ/3Sº×RLK­Y¡X¸tËæ3õZ}4˜ŠvNoÄ9m™‹l¬Î9Ów‰êÆ´tg.TÎÜl}a⽚ªÖI{åTg¯M§g¸­åÎ⛉ù–©½8h[Ì…ï›=â&}5ÅdQ}³#0›÷GkØ^µeÈò¤y>É0‹%ªy¢—ôQjß/Û¤Ú8<ƒj[‹•T¢ƒ‹EÎåÜ(5HÔ3 ù¸ ž{Wu«L¾™³•¿3ëq¯Zù¨Ž¹uØ ¡Oe;,þ(F;Ç(®È¬ÃvɰvÔb±éN7¦Þúm^’öZG”N·æU”zåz·‰_ÕoŠÖð¨½èÚ] ÌSÚ[:2ö c7¥ÂúbÅ|ÄA†HQÜ‹€)^ºŒP‹Žc0" û™Â+P`yÆ®¼l ª°Ê½ÔÒ¸Ûë*„.ûI14oûÞUx§Ãß,<„á£>pÇô.¿DðFÈ«ª7™B1¬Çsœ³X¶—z±ÎfÔ €Öði4}Ó|þdÊ4ü ‘2RÄd &QdÌíº•Úñ‚Fp Éâ ¼¨…yò8 ïîp¯Û£š7>E"å ï;žA,šØÛ¾ÝAãÁiu:¢‰9×Pì…Õ,˜)V½‹Ç¬‚§2Žæ,ÙQ¤n¸o¨ß[“sªP¬˜U¯‘ûEw˜ï¤wŠð0¤¹ÝCFãEac„3`=‘6²„IY/þ¼_Ç3óáäK€:äF2,ûöc% ¨êÒ¦&ZÀ\†l¹ÄÇ!šz¯è$F3^˜–ÑKs6»wz•´ †u¤C(¼F bÍÝây b.¨x(™!E`oÊÀôúKÑ·¦…Çâ};Að2”Q›ôÂç̨SHeŒ¶qX5º—­!jö“+ÝU€W)åêѦžöcnž3 ¶ÓñÛdßÿ‘ÖËã1¬‘Mù¡ÀF³¨gV3n €Ë÷¢+µEÏ`”BïdJúÉ6¬R´¤¼F€&ë MnÇî*gm™­ˆ‘FJ.IÉE!O ûµ›s>–›¸ñ"\²)DïŸ(_ï– ©€"·©SÙ‡‰¶h‡‡5šÎÜ×ýÀ!ç¶ŒŸ×–ƒ›¿ß|Á«5Pu¾.D¬~}L/©@Ó»[€âRÏÑ´vJ+ô[£„r©û-*“ªŒa®ð+vêÏøYñh®¸Ãé*¯˜¨B˜vrؤ, ãƒ#8ÏÉÂ@Í)É·Õ¼i'èåÇÂ3ðbµIØ$„íQ; ZP˜¶×J ótGõ¿B ³&Tí!°S·šŸÅÞìÐLÔº]m¢ZÐO‡ÂyÛ`2†-Ð&®@ý1`&{Y%T>e=Æ-t+ëÁ”VˆTÜaG¥@Æ€±+jÁû¾³béého;šuùÑ^ʇ@Ü=Gì4Ã: ©ÂvW&À¯·Þ/Ô´íÒr±Êm¤4÷K©ªžƒMÍ!,« yßQÂk` ñ®ÕJó,®Õ¬]«ê2ûª´ð²–f\¶øŠ÷;¥.T"Ý3Ò?‹CÝ(E·W/ôCön«LAËŒÙrÄQac›ec¥‹‘mnÜňò g¼fçâ;~²JtAÎA·—‰“Ãv6<–ò¢/‚qØ1ß÷u—uö^p^iS]ÿä¯Oß-Â3ŒÔ}ŸÃZ0‡A[æö%ÎÃ3 GÙ//A‹mg}ܾ:‹Nñ‡õ|Þ8ªQ<ØñJ`Z‹'@‰Ì䧸5h³Ÿ1ÐTÎp&ÊÍ3ª×wróZVš \ÄÙoZÂî †bÂú1a]oþzbŽR¹¬í›Û¢†‰d ‚ÊÚœ'–Ž.ì–vª]¿¥8̾ƒ#Áð»vFqc ׿Â\̪À9–¬Š8²œrë™×B`rA‚ÁT3úg¨KCP7‹EÉnÉF­Oò+!ÍcĨ^‰ûŠ}5<„´ä?¯ë¼,uùUÓ]ÿä ò‡ÙÓ ŽÖ—èQ®__©Óœg£9(¬R¾™úÊ[sýƒpç(Ƥôpm3x…Uï$kÜ^±Ýl£;½ºÙ'eÒžÑDâžùÝŠa%WͺÕàzÝ-ƒj~²[Î*Ìb’Æ,É™Ö#Æ JZGIë¸e¨—´Žû}Ÿª3.ÛîÓ:J%§;EwIÑØ( •ˆì¬tââÎN‘Ò«§Lcb›±Þ€ŽsbuYK†ÄK®Þ~ôk¿!ØÙ¢)BŠ™ô6®Â!zAj8‚kOB #:á#ƒ„ìêÛðLØöæGg¥]6>»=„¦¾ÐÉKªê¢I¬7©ÖC8Ö/–ÒÁëí¡[¶æYl ^­c{WB~|à­;ɲڢ‚öŽ«F˜wü»ýNùB ‡Ì±î§¥õ2†‘ÓÛ‘^S-scN!Uˆ+µ@Âì¶ÔÇô0°ìjØ›2Ç!ØÊEÀl2–cnKþ$’¡¢‡˜Æ­Dáä US™_xé‘’Ó-¬ÈÁ¶ðš!좔ãÛéwgCDC8%'l/TÝ FJmH FZZäÀ„)‹Í‚Ó¢ð Þ>KMKlîi]ï˪/AÎ'yxõ“QÎsÉ›(ûβ?ŸwãÍ?„3ûÛÙ)iBF²ÃÐ4¢q6Þb>àšTˆÏ[u^O§ÍÍ‹ú=AºrÙ9º¦‘C„!ƒ2Gò¡fˆ¬eɬê eèsÂÒ „:E« :±@{ëÆ—°ul{cßÃC ²›õöŠ (¡—`³ô'jeŠš½ø "ûKþÆ*þã%ád]Æí¼öÕ=$º®MÑWú¾çTˆúu¹EâXTǦk»¨aCŸ$ã dâ÷34Ðóáä„3ÜoOÀŸ“.³„Ÿ q²rfeøž¼J6±p¿¶BÂ~ºµ†•E¨úʯëÂv#­+YÅäâΡáµÎà¯%ăõ$·/ûžMA䬓éŠNÁiÉ9'©fX#p"I±¦×,=B nTyÎÐN¶@\Tu’Ôj|hÅH†Z KiL/‰ª^àÂÏ` ul=±ÅCTcù¼‡T€³ô/ Ñ™6É^ÌðÀÚÜ»‡ •îM$ÌR·^ädÑý{ÕgÕ}”ïÖÝõODŸ¿´ö¾ÝA´&r÷óšÏs;ÍÉë.XHh‚Rûe¡ÍT Ø¿f=^('®«Ë–Víõ’”Á;˜|ìtÎ8™ýøf À¾ïm%û÷ЪžHØL(ˆç‚³@¢CƒgG.Î)öšlÚ\Ï) Aç$ 31©{Åà’ „¾«Ð½ønÙØvî@oHÙÒjC¸PÞÜÀLr¶Q^á`‹Á4é0Y‹ˆpØÏXÙzšÔ¯¾hÒÖyb( ¨»î3-Ü2~’`èL~q7Ì0x—~¥3¢àÉéÊ}¿Í‚ð`T›ûxS/Éý–\j # 8B1S¸1oòÛˆONy Ú[æuÕfs›îyß«ÅíЕÆE*¥±#%®{³ nê£~¤{Úð2’ÃÈÝd¯ºæØà£AýÞÜl+xlÂHgìú,ŽT›„28ÂO©ó=U®$y%5ƒó ]gCYè.—ý¥»ìcÃËH#Þu—ê©»4:·õ$1 *•÷HÖ¸ ¦>ŠéÖwðJáwð]P™Ã2߬E„)KºÎyÓu Ÿ©c¢yZ¦Š2RFÊH)#ed>EN5•ÌF¦[$%QÐ<½ÖWFŠÕ”»Õ´Í›Uì)ß#ú9¢Ì‘"›uçà-øØ@Þ‚lxÉaÄ··àŠú#z }ÏV0žçÝù¤K¤C<´³Ð[ö1ÍGÝÍäô’…VóQp;V³ /#9Œx×j>¨?¦VÓn!ÿÆ"™’# eä.üà–î’>—Ó[Î$¦ëŒïOŒ\šî ú›]®†V•­º0Á±ô\uÊ.\-à ŒÄR¥Y«yFjøL¿3QsTbØÃ·=£·ÉáàÏ™ð½úœŠgýŒ¥ |½-ç=ÈU4SŠíÇ ¤ûwDï‹ÄJ‹´í”§!_§iÎ:ž¬O†·äçûhæÀÔ3¦º¯§ÊàöÛöÝ¥òìªႸp‰†3‰TSž*(DÌÀR0_¼‡ÔëÛ2G\ Ÿ-SÓƒ×*^:$ŒêÙ-V9¶ª•)9¾À·rHNCw±»IBÍ+ÙPud<b@aVëÖf–ÝM”ðtƒ+q 9È©QÛ˜‘‹ŒRioܹÁZ“G9DCÍÔšf>¢^ÆgšY茀—ï}G-E‹ßšÛÛ¸ÒYTÌxÞ˜Àµyƒ1“læ içÀã|c¿ >3²Oá´ô+°‘%¸óŸO3žfþ ¯1ÞUHøLjÚïáçsîpuÐ÷„€Išå;ÝýÐVê8^Þu'/–üÄÆ–XØáÛÓÿýÎX& endstream endobj 4069 0 obj 7120 endobj 4073 0 obj [208 /XYZ 38.2500000 736.250000 0] endobj 4074 0 obj [208 /XYZ 38.2500000 736.250000 0] endobj 4075 0 obj << /Type /Annot /Subtype /Link /Rect [296.250000 714.500000 365.250000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 4076 0 obj << /Type /Annot /Subtype /Link /Rect [156 674 180.750000 680.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 4077 0 obj << /Type /Annot /Subtype /Link /Rect [314.250000 618.500000 356.250000 625.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4078 0 obj << /Type /Annot /Subtype /Link /Rect [120 536 130.500000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_din >> endobj 4079 0 obj << /Type /Annot /Subtype /Link /Rect [132.750000 384.500000 147 391.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dout >> endobj 4080 0 obj << /Type /Annot /Subtype /Link /Rect [213 161 252.750000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ddirectorinout >> endobj 4081 0 obj << /Type /Annot /Subtype /Link /Rect [266.250000 161 309.750000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ddirectorinout >> endobj 4082 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 119 107.250000 125.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 4083 0 obj << /Type /Annot /Subtype /Link /Rect [148.500000 65 192 71.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_class_code_typemaps >> endobj 4072 0 obj << /Type /Page /Parent 2 0 R /Contents 4084 0 R /Resources 4086 0 R /Annots 4087 0 R /MediaBox [0 0 595 842] >> endobj 4086 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4087 0 obj [ 4075 0 R 4076 0 R 4077 0 R 4078 0 R 4079 0 R 4080 0 R 4081 0 R 4082 0 R 4083 0 R ] endobj 4084 0 obj << /Length 4085 0 R /Filter /FlateDecode >> stream xœí]ËŽãHvÝçWhm`ÔŒ€a ººË€ U€/ŒÁôÀåYø÷-J¤RÔ 2ŽnDP»Ð]ÙbŠñºqß÷ÜŸþùÛþë>ûŸÃoÃߟ¿½UÇÆU—ýŸ?Ü~ Ûãðó¡iÝá·ßß~~¼}}ûzúï·Ë¾}þ×ÓOÿwЇ9ýû—Ãÿýôំ_êá÷·F5§¿ÿzþ»kÔé§êúwÿù¿ýÛ?þÖ¿qn˜ÌÇÿÿƒ®TW·ý4f†þñ6.Sÿüý·¿½ýtÙ€¸Qle:S”5ö :«ÿûŸo> 0¾¾:vV©¦¶MõÈ@ÊÚÓP¶vú T{ÏMG:ÿ‘zŠ··•IøöóÜå7Æè.üöck2v¶?ìþ ]ÛêÓÏþytÛœ»l[ç’œÊøú$§ÒÙ.%Eõsß—áÈáË%¯´«šæ²AÚ6 ¶èýý)ÀðJ_æ.¿1—ó ¼=õ•v¦©‡mkÒËõý)ÞîlÊ·Ÿç.¿1áOÞþ5æ-x*A}ãGà‹?ûéˉGÖ‡ï>Íì<àå¯ï¿¿ÙÓÿô†S‡ï:ücU÷O‡ïySêx:„ö¤‡õ¿w~Rµç'íû—_5ãoÞüjsùÕcÛUµ¾}¢jô¤ú|~òë÷Ó†=¶VeU–{Ò ?.W]fÚÏ“©næ£;ô¤ú=ÁoÖ-°:t’êÄ3>®mØQ{´æ¢O¿ÏFÃSÀ'g‹žœ:Ý¥GWá£û>1ñÇ=,üÞ Ÿ´© A[ŸÈ­A„€IÄ(ÿ¶Ã›«ªʸ7°ñ^Ïdàõ>¯R¾ìÏ3<Ý.ßG±Û‚ÀÔUàñ­ÜwÌ÷-<ü,0/Âëiá8˜X¾@‘·œ~×o$&=8°þŒ&;¬¸ó—x 1%<0>'æ æ@Äãï¨ËeVæht«ô¢•î~BÜ×Àz=-0·9 .j¥zcNn"U0™á×OôÜÉ !ü¡€ìh&rõëyL7’ü¢J#~ é¢~ö_Bˆt%)¯ò¨À!à;OŸÆòû2ýÕ´äÀ(Ù÷a}p¤C¨;ÁGð5l0„?³ÒW;‚_þ’€‡™@&µgöv¦t¬èz" íHý"5Ñ€—dtçµÍ8ª¬«…ßÁO°+ºO4œA`Öxœ9NJâqµw"³Î˜Ô~4»˜DfÝ™;!,÷Ê5þÕ,Lºi!àjÅ„À¸ZáÛÒ{ÖsÞNmʳnºåBã áÞÈ_(‡½þp 3ë&5a;ëËаAr~ë_ðÂË­PÊÿ&êK DPõ™8Ö)0ªýn¾E'9>Z|G"Ü/„7‰ QR•§Þ¥Mé]mëkÖ. ÇØäæeå|å-ƒM[¹‰ ‰ýƒ„°°wÂÛȰ–=è1 z ¬¸,’ñF7µó<ä¢"<€}ÍŸü]"¢ÕïšUL ©XmÌI´„<éâø´'i7K_²¢’!Ò# ªÉTøP6õ€±AS˜e)ý„•ñ(9›táïwâ?fÔ—Ìð¥O˜¨)Ξ°Ò‘ˆ(MY‹1:« |¶P?¥3°½`°÷ŽHÞÖŸ’‹/«ü[¿%SÏ^œqåŽnw /&źòIqVñO9å+vö"$Tu¬õ1Má©2Ôñd—[o™@¤lÈÚ ²jKÀÁÂR‰S$WSl‘èÍÜÔ%À,t²[b‰1sÆ¡5³ªn.+:1w¡ $&Z*aŒ gâºhjS¡¼²ýœ©ùLÖ)f/˜Mã ìûûñ¶åƯŸ¯,×êÖãÐæ Ô§qXëà8ÌÆ[ÏVì´õvWNä¶ÕÝuc _k?yRÛ/€› ø‚ž ôêŽÚ0ßÔ¦{ßéÐwªAíÔcCë+?ëÌÇ[†çöî+Õð;5œ5\ù߆ǹ̺9š ×`fíоÖƒwŸÜEB¨zdi æ8¸Õ¿·ž.“^«´7S¸-¡)maÒ•½L”0q2\6R¹cåßûOðm?\$ÂKžÙ¨”-©žø0¨ôAb²Øþ J‹"´ù‘q–]Äž3uÙ¹ö¼¸?G$QT¶\ž²ÒŠr 2ZiOh%ö7êañwð8"!â%"9Ž1@ð\Ƴ“9þ˜Ë½q¾·ôÿ¢ïòÉ¢‹£"*ó•]¬í=ùÅÁTƒùüÄAƒ…“«Hxã¨4y¾rýʳ/¤§¦¤×SЙ€L>wøý­íÚÛþúö-;þ\?O@º`9³Å€ð•ðÝŽÛC@7< b%Nïîïd5ôéi—ZíP•ª½é”.Ä­´ÏÐñá$‚@I6t”âªÚf’Dë+€Å¢óý(ƒÀY#DItà ð Ò‘rþÕe_@ÊM„u®°ríÇuÇC)†LŒö9 ùre5ñBÁ„Ñe)WV*|͘ª…“õ§À·¶˜qYíè“”™cÐãîÎÍo“unZ±B˜Y «º1Ü‹Õ «&¿Æ«@ŠKü<ÄwÎÀmkoߦ¬…×Waü:CUÅèÖ.&¸Ya-y'ÅHR4•Ïlr »½ ©u7Ò+ŒNRn³‡NóK:JK'\r«áp7–§Î1ÈÏTŽ`BÆT‘ŒP-×PïôÎ-: fË8ábÀá´>ì/ó6ô°÷ËêWeªÁÃn«ööƒö~ ·zͱ7Ê%Á¬‡ycëàðާâq"ÐÊg|34›Ë„Ï̸XR×Òà:Œ_9"{[""bØÓ&[ë .IJ<}ç º½|#Èá¶Y¾±5^˜ìŠñO¦Ž-ShdÍaŽ€GŸ€Â)Õ;ÑJ%NEg)&…Ú·/.±Ê‹×D¨+ŒIS©ÏÃydðÙÙn~2óÒoyr…š–©$÷å´ ñUMY÷Û+ ©5k/³Þ×”Juë1ã—±ZöÄ^©ô‚²™”µ›è3êžO]Á'Ðw¯ ‡ÞÂ2~ ã Ï gÛ∎ˆ~ïhÕz.}œŒˆ“à'·¥á§T™;å³iAðÈ„ï”?ñ'M@Õö©vÊ¢iÀ+Їž0FU]·XÔìŒ1ôDaœ˜Ü3¡ô¥7Ñí'/Ý!­OGO#S®¬ì8ƒ”Iä!Â&1ƒP*'‹B“ÈëÞJ¾uYƒÈ8ëqœæä°,Ú“´å¼,Ïã7´í*·˜à°xß NÀZ+ïDÖÜGGÖ«Fe0ˆ6?£ ÌDê¢ðw1&ÒÐ)[ncN2å~Œš+Ñ^‹©¤\ÜŒo‚éa%k<ˆ«“† wuç³a&˜‚©%WÓ"¦ fÃ"M"JL_S¼.BZ(H…ÃFL&}ZTÍ)ï“ ÈížÔ§ô¤åsFã "=©ùzþEÓ4Þ²¢O»Ýƒ‹ÑT»}vó¤dÕvW{'"[¹À¡Ã Èn¼Á¨D*C Ä…hÜoWL‚^ùΛÛLI,Ÿ’”wˆÇß0žå-}©Æ_Ë„jõ*kÜgj‘›£Õk(cÊ82+_)=Ÿ,ÈûÚä"¸óè7})öœ†•KÒÄ“§Ó£ô›÷}1ô›%WýæHqD¿y?‘lè7½U9ÐëŽ~³£ß¼P­K®8$eOÃ'¦Æ¡D<%ænÈö}µšâyTAÍð¥OÖlfn³/gJsÖùb_þÁOà½WŠIg/îh­¾¤pm$ÚmËW ­©‰| kÿ¸äi)øY?ùóÜÛ±½ˆV·ôàgíT¾‡«÷móùœ´7Çþ].פ7i›ÉU Çôâ uÞ†6“ ÍÞd¦ñ·ZbOÝ£ «P÷V,ì)|xÂ{Nå%2wÛèâ(ÓÝ/“i“”)!2˜PÛùjA¦{ž93-ƒ_³kæ½ã!øh;o÷4.Rå]éåƒ{ßÁqL“ÄO^gß D¿`öÍÂ=x6Ü«[Ÿ â.<‰£žWÄRzþ´ñO&¯÷4qIó—÷:Ì3q Pó:»ƒY5ÞÌ Ï-¥Î8aÙ ¬Þìñ÷=þçN Ì×GbZ"p0es¸E ²øò^¡©«‘¸>Lð^8¡uyv|`—˜ò2Ñ1[ñeåGss¦ö^ùÞ=/‡UÝ}“H‰è”Ù¶„3@ œž!‚l9 ¨¨Ý‰N`¾]<éÈ"L“{ðKŠÃžm-ìF%Nz+L0SÕP0u#ò!µÜÆËY®Ò£Øô¨<|Kƒ°WáKêlrWÙqHØÎ…RQ–—Ë1.ÕÔØ¢ »pšï6³_£´™×@$uãûš)üIu¯—3x©,æ´Ò;ƒ >4«zp›÷žÊxÈwp‰%»Äøàò"%§ÕŒç¼ë¥Åz`»ÖÚ“3cÓ¢}î(*ê¡–mä-륧Òp™¬ F«X ŒFR0F_p>AšŠ®8üüš«nרâM>§sS^KÙÒb##݃–…,[±8–í}LµØŒšô0›¹Áͨí<]¥-h-›Ã€ºô6(`-F‡,âxàðd;Ë2¾: ‰òAWáLG±¢|ž«g5¢<2"P;ÉOܳ¦m=vQÁlÖ@v.Ì Äªð8L÷²¼q´{ùÁ]jÖî”õÎ GùsF3]½à ø^…s±‰œïÀ™&WMTÕxûñ* xÖ-&o;$¢µöv*XëꑎJ%Ëï“E»TÌ á5ÅR:zäý —~}Å2M4ýM¸Œ)OŸ§˜µ¸NW™Ò–­âµ6z´rµ6ÛL±Ä4!u;°]sžôÔ.€‹ï£~ï+†}hØ[ø ~šó¯$®¾Ç5öpƒg êÛ2Ðlj½Ÿ £0`gÂ`ðùäÂ3 úËáïX¸ž×ÙÑ S/Þ"€Wj™½f\‚Á¯F)0?x/xßnIÒè+¦¾Ìf‰¾  f6x=ƒb™iƒ­žj€Ë–o9¹KÁ‘Á•¸R¹Èåò«Õägðf1¢‚PÑ— ? (•;1TºÀ  ÀÆê }y¯F»@Täò4´æÚÇ©YgÜE¥üoå® r ,Ι–¹ Œ¾À<#t}®"tÊEœ«öçeªª­÷iж#FÄ®ôÇÙ˜Ò“Kµ™µ!òyW5ó䇟`0[fƒ±ÃƒÌbgöàƒÄæ5ž¾ÐûµÝ¥aaPÜYšÍ’[‡×ékfÆ í®9ì›fXOÀˆµ FÕ˜¡ý¾™€¥&2½ü¸1·Àr‹ð‡§OÚÓ•Oä/’v¯M»ßîà·¹’ëOK½ÚTr}Úº­¤Ý‹”æË†î©ú˹UÓzW% ‡ÂiyñNâ?Mä<=$ñÕÜ~P"‰¿ŸÂÇÍÉì~é£{;æS—ÌG'®¤í:o;_[Ûº¾OÒùÕLRáq*áRƒÄ}.6ˆF¼e"L›QŒQ„"âae1ªÇLAŒò¦5>Ç__½‹pðÔ7%¤Ç@×ÇZ׈}µæê£´…帄޼ªñíWðä)eÜrqyQc CiŽ…‘Dñ…k”‚&mÖn|Ñ™Z…•…è,U­ÓnR¤µ\è¾½ îX­æo“h™¤p!LûxÖ¹2øripn˜ô¬&îp­l¿%LšL>–~„­IEÐÂÅ `ËT¥ðKËl[i·ÙTG4æ0GÄd'”’ð(ʨøRcW¶(#8·,&‚èÛÔSö½(\4¥ÁŒhSHñ‰Wnê˜ÒùÊ..¢ì}üçˆâÜM?ƒ@È+½%ÑÖ¾¸Ã:QÖ9‹ÇiÔ8‘)±EH9|Ÿ²?Æ •k=úOÆò§Ô•³í@7$ì­¼N ‚,NÎb§t7¸pç)‘éeU¯ýpÈ;«É¸º·ø6¦ßAæpàjKmœ²×Ú¥6×aÛk…Ï`”bƒuåf§º­œ…çdú½WØ®XJ+–™JŒW"StýxÚËùçâv¯‡¨^?)µ¡í\)Ä•^Œ”Lµ@EËå‰6îŠ-[ ¹>T¦×A>’õ’Ïzý×M;ŸR3k1)‹á»Ö[Û¦£Í7zÃdò²ú”õ˜­Z~tD4)gš„Ô#’K˜Ì·å!ü yM®ö·=mGˆ¬a*[]=î»Æ¸ku%«ÛùÍÚ1{ &ø$)ÞqùV€Ë0O‰S`ÖL8Œ¸+1·­s­²–ìµµÒëp˜5{ W"Ê]õHtcå»(ßE9/Ê˳!F”ãŒç†ïöê¶{ï)•tÕ¹k¬iölpOƒßñ}Ñ›ò;ªÁï¸äLqÙ¼MÞÒc®.:î-b®."„À†Çýl×~À\½ÙÙÊÚÄqSU`3wØtþΗëºkjæ—ûÎôv¸Ü¯Ï —[zŒü£,mõ sß›RšMÄ옆å | ]<|naxhÛO4Um”G“ßp .‰ñσZ÷ÛwÞ½nµ>ýtûA Pk7 "¿i ›°-ׯ¾.-§„nï7ö•÷6ca*oœ¯ÓΑߓ¢zp „o.Ý€ –0à›ˆJ¾>¼[fϧ˜) QIØn· At‘c­òØÑÅ&Å”­Úh!é\Y_qf Ûqk)­|, M5± u”ZÊmªtãÈèÙ¸Ãà¬U wïDR"+[5Ê?òh¢˜àÓ\fÉ€°RdôÌjνq.×ùœU®ö>h•L¯“5ˆŠRÊ û›¬Ù. È Áã0Л+ì^"‚¿–( E`m­'pyøDCm ærzZ –«ÎHM3|iÁ“©Mç<zí¤¥¶Ö¾N¹w$L$.)VE”¹Ëje²@µ+¾¥Q§ñægè5$zÝÜfQæ-Ý<Ÿ*\»±†#àt!òðîœÍC•ur=lGw=&,&Ò3a#I`‰;KS6ÏÐ`ù(y.(auËFG(rc áç (8ıdöA–T—D’qÒ6icòÙ«áXªcݨ$ÃtLq”I«Cf<œZ@#°ž*ŒÈ|Ẩ¶È†ÇRH•ù“ö\fÒô§Tõu'}ŽéÍ%êNÆ4×RÊ ÒG~L’ $ Øü“bÓŒžÆŽØmLV-2D@deî“>Ô\{,`6K¥b1É` „Ô‘¸˜ëòS1ÙP<öh‘÷Äa/ªP /p9¥Ìf%Å->Á=¹Æç¬RJ/‘HMÝ FÝ{f'k..¡äsÖ}TF¦›Ø—’¤f6€<LøÐã´@S™ãpy—¾Xæ& 0Ë¡¾¾¾ý?t²¤a endstream endobj 4085 0 obj 6169 endobj 4089 0 obj [209 /XYZ 32.2500000 454.250000 0] endobj 4090 0 obj [209 /XYZ 31.5000000 455 0] endobj 4091 0 obj [209 /XYZ 31.5000000 254.750000 0] endobj 4092 0 obj [209 /XYZ 32.2500000 253.250000 0] endobj 4093 0 obj << /Type /Annot /Subtype /Link /Rect [209.250000 428 248.250000 434.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4094 0 obj << /Type /Annot /Subtype /Link /Rect [286.500000 167 318 173.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_importtype >> endobj 4095 0 obj << /Type /Annot /Subtype /Link /Rect [301.500000 132.500000 344.250000 139.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_splitproxy >> endobj 4088 0 obj << /Type /Page /Parent 2 0 R /Contents 4096 0 R /Resources 4098 0 R /Annots 4099 0 R /MediaBox [0 0 595 842] >> endobj 4098 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 4099 0 obj [ 4093 0 R 4094 0 R 4095 0 R ] endobj 4096 0 obj << /Length 4097 0 R /Filter /FlateDecode >> stream xœí]IÜÆ½÷¯ès·X Y$°¶9$ #‡ÀŽ–Ňüýt7Éžž"_‘õæ«"ÙC ¤5‡µ~ûúæÏŸÿqü×ïÇ7ï>ÿçøc÷ýÝçCqreÑþ9^¾¾»ÿ@×§î磫Ëã_ߎߟŸÎÿ~;´/|~÷×óOÿ;êã_Î9þð÷ó‡?u¿tù…¯§Üùû¯×ïS矊Û÷Ëçÿ>üíÇß.#öÓu‹yþÿït¡Ó\–11õ·C¿MuýúýÇßoÚˆ›ÅeíꣲÆUcõñ¿ÿ<ü|ž ¾85V)WYW¼d"eíeªFgQuuþÇfº~IŸ`ôªÐ.ÝèíÚåÆè&<ºäWÊ”í•.Š܆Or¿ªQ)G¿¬]ü\ÚëŃŸjk”qº´—›¾ÜrY×úü³3ÝŸnKÛåš2ũ݆Or'ÆÔ G¿®]ü\º‡ƒ‹â³µ.%Á¾?ÅèeU$ýºöT;0ú©®º?ðgrîú2±kôYPõ1­,àTaºËq)®çnü£k—rôëÚ妭ÀèiAË™‹•´\Ý1r—B y>ÉÝ×eB’Ø®]ü\:Àòÿ3^Iû Ð…¾^|ûåðæcsTÕñËÏç…]'l¿}9Cäù?í§1Ç/?ÿXÆýéøå—CsrgÆ¡ËëúÚ'º¹>©OuS<R”×'æTÚªvÏžÔí;O¼»~`OÖ´ú§ì 5Vè‰nGSªŸyÎb-± ŸÀy”M×p4øŽ*à“^ <ƒn?¾œaÿe`{¦“€\m•ºªÝëF.eäIñ=é6>ö~¢á“wpmpUãyàhr—‚h‰9Óìç7 Q¶+ªD™“ѵÒå,Àó`üÄØéM€}ô Ý|ÊX $¬ÃùeÛ›,û“Ü$Þ9¦?éÁ¶Á£aH„;-!ìˆs b°ÅçW`²’¡ªš¥G{A¶À‘3æ™Èƒ,ñ <Ý)&"Z‰Q¯š€ÁLŸÜ&Û„DL"× ‰X`1B œC/-£™¢…+°˜¹áµÁÓÁ;5os²½º| yÀH/%€ÐXâ€×¥±Î€çR~i°üWŸ0r¬¬ÄŽ ƒêøV-}ãUï‚Qnv”…ÜUgZÝóû ÓÚ¢ÕšIcÈ6=0@¹Læ—€ÁrØÀNá¹á`9ËÂg`¥à2ì+¯ ×ôS.å+gÜ[C[rËKG̘”½[d_¦cì^ÁþfõØ@œ7: ±7½l<à¦Xùò·NMŒ©¼“zx/7ãu’u21q0”à b;³‚íð‰1rÒ¥ô{kë2ã&cîYÔ§LÑTÌû0´"¨Pœ˜>>HæZˆƒ \?öúŠ2u¥‰—xgQÅ©rêù­·p§ÊSјç2Ã÷p´–Ù)Ý?Ê&Y'KÝ¥îéaC¶$B(1ÛÀ„¦To}íDÎ1ªÌp³Á5C䣆íd 5ˆr ‰H6*›PÏp>Al¹þùÑbʼnñ’‘- ÜåŒrªTU÷ônr ¨ÞX&ìÌÃ;Å6y¬®Ã3À6ìÀ °OKÔ *k ¸¯1ôbØ!âÓð`·²Å·ç!)¶ ‰ŒÏ‘9Ñ$ÞbêD_ÍB,šL"¬Ö褆 ô"A,Â2³´åÕnÑtaý;‹K ² î|â¶‚”çYëÂ`e‹R¬vf¹=À.;ã°SÎYNÙ4¯LÖl# €Î!#`›OÄJÒ&¶ÆXk‰¤±I¯gZ ê´GªÞ¦ÂUås¡œV-íÜs2±J‹Áƒ‚UÔ„µi—“w{ÊëºÓu$eTºyI.bÍîSOòlÏܼžrAØVª‹2Ú¡ ´Räæ\þNk˜¨bpfÇ5¨ÔbÍ¢"¨j*“ß$"Ä!Â]ÂtÀƒƒÙµ(ý¤˜—(é‹À­l4^r4ïrãÆRN¶é„~ã4,m0f»\Iö¦y‘X&áÿ"(>~QÔ]m’¸*+ÿrö$ññع^nk^ëÍðŠ“|:5w¨SŒ€‘Hð;D’XâÊÞËK>à@IÐ`è¬Õóp>4VÝ3•K_uI†u_´æA¶¾0˜@Ï/4p*SNàá-¢ó-×–J9¦µL Æ´¼fÅ@Y“E.ŒµÅRýœ¢óv²ZuÞœÏk™Š ¹âd¬î#¨l®…õ:¥½Mìås8½µª½sßTÉ?ž– ç³dÉ–SK27‚H„Q@¤GÕðJ™#i-è’~Æ”N…òˆˆ¬ƒ9à·b ’±¬ù¶¾mo¯*²nž.[ç0÷Cò"ðýPˆÈÇÕõsÆêÛ¦/;¹ ›A°À7öë,õÀgs©ê˜³óèý¨èd¦[[fK*ÝŸè¼Çë¾PzØx]Y«;V ýó£\a‰}Š™JGM"XâJ>j@ ×"⤠¨j×´?çë <` ¯¹ðòz:Åhx&±HÄ›leÙÏÕà"W]lÙœÑÓ‘sñN÷£«ô 5Ÿ0ÚÚc8Õ:2½fTU}S@…C<_¼–o0ª ÷NQ!m•‘6Ur×£Q2=Ö©”•$r`üt¯‡µ8“¨Á £&1È/Á}r5xapP$ D3d‰šY³2´³ñ|eIƒG Ãq L^S€2Áµí2€ªÚŽÇ˶<ª6ϧ¼‡}î°QÑ“J«S&<8±wøN+*7¼øNWc«n/DÙ“ÃÜÐŒ<ÁótÍ6´ Üí¸SSû;…çXµ‚£½‡ûé-ÉCûcjQ§“#ë›Q!Ièø+ÀxÙ$5J$`Z§Jtï¤ä |øð’©ÒŒÑ]T¡²ˆ‰D©¡õHEŽ gž:¸)eVäâAr¹± Ù~éBEW¦rÏ5Ô3®Ñ~2‹Ý¨vSkß,@j¢2U@¹Í‹ôëG´w¥†wu9òë‰7§Ëû_eíî?øõð9 <¤‘:.KðÀ "Mƒñ%cB@$}P‰ i 6PÉåoÌåø¦¤-8±ËÊ2r°µA=Ѻ'Y2tz¥¨ºuGÄÆhÆPŽ@pÀ.—Åfw¢±m »ð ˆ6(飧Tm½û• |[ºg¢jÀ7óuWãwpNÜ)ö41™+X[®*xõ“‹±BµpõÐMúÖ‰ùns*llq ŠªÌÃX«d“ÄV±¤7ø bósÕ)i›ñå1xÅØV"ìL¹¢rq8@–˜÷Zy”YÁ9Ìài»8(K¡8ÛsJ MÚíµöN*C-„Jû·“B†ŒKÓߨñ‰:~’¸æ˜LòãeX ˜r¢Û+°äº¾FOp¹kµ¤ÕÖ®ð }RD2û$[f™Òví:é±;a²¹2Id5Â$ηÍR)})"ZU4v„: Æ)±uÆjò ”ޜըžàÙÕ$êÒ›õqÕõxÚ[¶ ÿ»Pº1ÇÑÂÍj;ŸÃÓaôox©t‰ä•H´^áu€×]B™%WÍ–¦ìÓGö¶ÕQ÷½tÛê% ° [ì×gö¡B–7ë.Õp[’±}EŠy’íÿ†¥~ ÄáÁR~‚™£¨$Ÿ ™%J7¾ +#¸#M)Ñ(7_%ÚÕnÕõ‘OE–Ê<ì_îV™k›y»â6=—Y¢Ñ‹Êƒ†=}FÄwBô4Z{7²)3†H #—SE_"¬ŸtÄé…¸Ú–U6el (g Œ Ð ù¦bö39âÜ%Ö©CûŽ¸ÄŽã¢ö6±5Çq×Pãnt È1m¦ !ï±Î"?ÝÞ.?­B~º‡ç¥ŒmTE…'S-öIÝ>ei,ãcÞnŸ“‚´õ oÂEŸdm_²–s,ù1.#ÙþÄ ÖœL‰ÌY…;©RµN‚Îͯà"ì'Æ´D´hî < )µ!ç«Cr‘-Ú4_awWؾ“¶l–^ {Šî¸]%Sò]¶€<“Ax‡h~™+sÁußx‹Ê>•úxTsð®À½Ê:gw5K/rÊ40ÜÏúJ0u j½“2šWW‹b}¨?`âk˜(ÑlÙ>"-ad³æ—8ÚBdäò:&M9HxöeæðzÔÊy·èžƒÅy¢[VÇ›“j西ëÅ‹ýP fò–ðOx#óáðA[&ßµ™Æ ¢$åT„vŽô®C¥ ;Ã3™µ¸ÏXˆ%¸OâÔ˜,E¤û°evKÞ¬ÑÖbÉÍ¢'ßÁO;%žV ëEn€>GíLj msP}FŒ3SB“‘V™‚œ`ð~:™2Ó7fWÔB0V!SN j8úœ¬•ž\P`©øRŽK×f" úïø rmT?-äÅyTΠ™zc:£úîB²½1»ŽÁQ½1;À<ŸÞ퓞  í‘ñ5ì‰ÙñÓ±þ–p4•Ü Ñ9³ÍS' Ùº¹Œk‘1y嚇qgˆfU¬ —á¡BÁ™<õˆòÕ‹êeß®8W•ñ™¬°÷æ† \$íMPzÌQ$|#ÖÉ€í\6Ê[ÂA¹MòµX‘¾HÞ…(cïCgš[Cxl|bl…Øî‡m’DÏ ¬ºc³Vê±Á›/–ûLõ@Ò'öD@ã •B8Õ}(}Ô¬57›lŠž-ùêä Øœ_:‰)çÖ]S¥×ÇípéÔÅõ"öÅ´Ó…%‘ \¦q6ΤžmSùeÂd <0¡CDø1c¸‹i >E˜’*‰>[³}bÕѲ%‰À¶ÓÏdè¡ÒF#ï ÙZ/FÉÞm&ZÎtI)ÄÊÈ`’Å$ÐóT emSùlŒ8w*û0W¢“f/›!4?RØN…}„@ Œ‘ö>'B†´þ ,CD÷Rl×ÙÒLÞîàXŒbüæy@3æ,6n[ï6î-{Õ6nf§Ákðƒ£WsÕ™(õÍbÞyî†>½]H+tµŠj²ªx6…q`,¯Ñ-nû¥ê81Ò§D³è1qáDÊ(YMꔡ¿ò¸ÉòF¬×âØXX#å-N†÷ð®žÁ{ûÉ,DQó¥ªkQJÌ‘×L×õÎ]j[ ûrj×C+O—÷¿œÓ÷üzø \iHÞe ÉKNf«¼9©Àö÷$ŒâLZÌy+f²5zœÿ¶@:¢lT·¬¡Ž 7 ¼ÝW0*P?WÿfY]g±hö座2J‚D/p«¡Xð:kÒÀú+Ú5» dÉf &æ¢lâ"\=ÐÞ\ ¯Æ¼µ`g]”þ]m2Ã2§û§<Ó‚ŽKïîŸû‡9\PΣáéì4$cÂD¥Êçhq§¶Eˆt„ü™§ÜXêBÊ;Å}^úè¦ônžŠơ̂Øϙr¸L›IY­öÕ%älÀg™2eBYª·¾{n"ãT)·èâiçK•qZ9]ûbÎü‚7ŒœGÉ“«Á{áFsd—[º^RÕ9Éjkî?XÂIvY‚9ÉYBÝU§»c ¢yA”õn§Õ‡í_7ÕVëPÐ<‚õ‡ôº@S´@ÑÒnLG@y-o'Óh,­vù•"RÃl¹Uš ¸X´Ý¦>c„0œ¢ûœ¤”,aX® ìˆm,U z\„p(þÉ€*“Ê,[jF¤¸-Ó}7ãVãWvñOlM¦¤áâEs6ÊçÃSÀgD” x«‰0÷€•ŽÑƒE« gi[àŽ I`êUî§@Š S z~ SþêÑêÈP•a¡ ¦P)€Eå3P¬R‰!²¥¿–Ï5'e&&óŒc WDX„ »M¿Ãƒ”®rºœ‘cKND` !ØN¾„9ß &®Xºˆ.¼T¬ùâ†E)ã~õ`Éy´î¯îPg5~ºAbá0EÙ¤Ñ=Ö.s¬ÝX ÔÌ˜è’ õDÛH®÷²qo•p…Ý»{bQ8uíÆeˆ8¯¦èŒÜ)Q ¢7Œ\ôÈ”¾QõM³÷Þc|-G—¹¾_x­nµF1q‚ˆ '8¼N"ŒÏÃø`"ˆƒ¦™  @j¥"Î’T wjñNáª-¼m|Ö'žŠÞ†ƒ@R,„k|%„Þ@flðN;Å8‡wŠÏσO' c¸]A@ˆ``ž¨Æ8‡÷ƒWÓ¦‹-žÁ£a=ÞI¼ƒ÷Ã$ðã'x?%¿Šç¯ã·³,5>Mý ™°“CÌYœ*ÔEø;>mTPÂkaĈSíŽôI_“P‡XW Ÿ˜÷Ý;ðywЪޣyÌ”Ñflm»"ù[¬O<°%¦n°CŇ#ÛPx4øN§²¨¨­»'°eîòóyÅýÊ? ¹4>Ul(€ïÎÞž"ÀÓÖº)?ƒ»3ÁŽí® Ûè4‚¼÷,”¸Âœ: 3\6,Ú{Z;EgŸÿÔž^< endstream endobj 4097 0 obj 5433 endobj 4101 0 obj [210 /XYZ 38.2500000 479.750000 0] endobj 4102 0 obj [210 /XYZ 31.5000000 674.750000 0] endobj 4103 0 obj [210 /XYZ 31.5000000 599 0] endobj 4104 0 obj [210 /XYZ 32.2500000 542.750000 0] endobj 4105 0 obj [210 /XYZ 32.2500000 674 0] endobj 4106 0 obj [210 /XYZ 31.5000000 544.250000 0] endobj 4107 0 obj [210 /XYZ 38.2500000 523.250000 0] endobj 4108 0 obj [210 /XYZ 38.2500000 479.750000 0] endobj 4109 0 obj [210 /XYZ 38.2500000 373.250000 0] endobj 4110 0 obj [210 /XYZ 32.2500000 598.250000 0] endobj 4111 0 obj [210 /XYZ 38.2500000 373.250000 0] endobj 4112 0 obj [210 /XYZ 38.2500000 260.750000 0] endobj 4113 0 obj [210 /XYZ 32.2500000 158.750000 0] endobj 4114 0 obj [210 /XYZ 31.5000000 202.250000 0] endobj 4115 0 obj [210 /XYZ 38.2500000 523.250000 0] endobj 4116 0 obj [210 /XYZ 31.5000000 160.250000 0] endobj 4117 0 obj [210 /XYZ 32.2500000 200.750000 0] endobj 4118 0 obj [210 /XYZ 38.2500000 260.750000 0] endobj 4119 0 obj << /Type /Annot /Subtype /Link /Rect [261.750000 606.500000 309.750000 613.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 4120 0 obj << /Type /Annot /Subtype /Link /Rect [348.750000 551.750000 361.500000 558.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 4121 0 obj << /Type /Annot /Subtype /Link /Rect [375 551.750000 382.500000 558.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors >> endobj 4122 0 obj << /Type /Annot /Subtype /Link /Rect [353.250000 501.500000 375 508.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4123 0 obj << /Type /Annot /Subtype /Link /Rect [237.750000 174.500000 300 181.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_name_comparison >> endobj 4124 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 167 534.750000 181.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_typemap_examples >> endobj 4125 0 obj << /Type /Annot /Subtype /Link /Rect [194.250000 303.500000 201.750000 310.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.digitalmars.com/d/1.0/operatoroverloading.html) >> >> endobj 4126 0 obj << /Type /Annot /Subtype /Link /Rect [282.750000 303.500000 290.250000 310.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.digitalmars.com/d/2.0/operatoroverloading.html) >> >> endobj 4100 0 obj << /Type /Page /Parent 2 0 R /Contents 4127 0 R /Resources 4129 0 R /Annots 4130 0 R /MediaBox [0 0 595 842] >> endobj 4129 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 4130 0 obj [ 4119 0 R 4120 0 R 4121 0 R 4122 0 R 4123 0 R 4124 0 R 4125 0 R 4126 0 R ] endobj 4127 0 obj << /Length 4128 0 R /Filter /FlateDecode >> stream xœí]ËŽäÈuÝ×WäZ€r¾Ã@wWµ/ f//Œ‘eA˜<Ö¿ï|«2ƒüòÛËï‡ß_~|ùñôÿ¿¿\oøéÛ¿þíÿúð¯§ÿýíð§ÿ8ýðÏî—οðÛK«ÚÓŸ¿^þì[uú·êýÏóÏÿúòï8üýüÄáun0÷ÿ£®L¯ªó0f^ýûËð™êòÏ?~ùûË× ˆ{‹­ÚNWe=¨ÞêÃÿþ×Ë_N/_{«TÛØ¶zäEÊÚó«Úîô Õ5‡¶½èòÐãUЧwu›ðé—±‹Ï‹Ñ}ðáÇ®qÿÿN¾º;½·S¶;m-Õ&öUÚ7›º*ôfÛ·eÞÜŸþ[è͵VÞ›ŒyÞëA1ø{àÆ¯?¿üðý4¤Ó.h?ÿå´û/ï¼þñóùÔµ‡?žõIîýüçÃ?U•ùþχŸÿöÒ]c¼^© ¼ò ^yƒW¾À+¯ñO3plª…÷Xx¼5ž·¯p 1o²ëǦáh<=±¦xÔplïÑðJ¿Ú> ßcñìÀF÷¾®‚†W;~Åk51£ ¯^Sü=Pî0ûK1¼¦²#¬ÞUÄŒj,ãá{ð™s÷¼ý|ÒÄÉ”¨­®:´5»]r6±ÖcæÏ(þf„~È8£ÌØ2Žmvg¦¦»˜þd¨»m4 ¦mêËxüOëŽ]_Ý_q¢jêÊu¢ìÑškˆÃ_D¥ŽµmºÓÅ%÷\·Qçï߉»=/4XÝÁ!Á¸WîÔÂ÷8)m†9Yò¿'05|O Ÿ†¿/˜…3*º™ô7¸™à*æÍÄ_ ŒZvÀ•3Uüðà{Œò!ü ká§ã ·L`›á§u‹#\ð6À#aŽ)q°)ï1M¨´je<­Å´ÀÇB]…2Ã¥ÇV~Oâ#˨åÀ§úYA9ŠpRl ì5^Ð$1ŽÒzD­ö-<ÍçÝvaEÂU§B«t;z£} ŽÅËWOz1"¨Ø¢b$‘¤ù’peT5V®xVÎ]`]G¶™¨5…:Fsfòuß`¼+*ó€{,bnCû"pÏ,öpñÖYîFä Ü=ƹßr¨ CxL÷³Ë‹íÖ€ 2:ø\âuÀ³_,²¡ñ¶%Îòó¸§Zi×ìñ©5Ƨ6E™zvG_ŒY`ð‘Å‹]c4å§z+ía¥É{^sYÍ€S×­ªcÓª»)Œð›ǃ‘’x;ÛVø¸Käú”ÑÛŒ‡“%ž°DËP¶ÅȾ…C ˜™¢9kà{Š«f»æÀ›1.DÀ«‰8FË#xèÉÖcn¶Óž°,ÈhU ÍÍø#TÊ–±…pXALéÎ#Èúþ³#ÈvYpÔŸ'e؉Äuróº«L=Lû“àÞÊÇÊ3…[b,“Cþö8>¹>ORÝ ‹æoý‰…©÷¼¢½j¾÷ êÙ¸›\IïÃ4•ò4êž$Ø“qaOpZeO¬9IðìSu€'ú1ÄTá*g T„~bÀ‡%jrPÉ.µúTU×{“˜ë×_i?=Ør¹/͈ïÀt1j"BwæÒvØ[Ä‚P6(‹CÌ5oßSŸæ!¤U׳ӱ-—òÉìÅ\‘‹mM«ÉϦ5šŒRþiÅ9 lÿ9£@~Çý“ /ÓvÞ|ì!:Ó{ÕÆŠ„þn6‘£^OkËfHBÉÝ6¾Ý¹©Ào.$gWõjxåŽäÜ‘œ É™]míHÎOä¼ö;’gF¢;h;Ú¾º×Êô÷¯< æë'| æ;ºâ> 9º\ÌÍ´7ðžÝ㞪kRx¹.âi³½ÿDÃ7ƒWà:ZUe~ºÉ)²öØwþ|ø…_áÓ*xEŒžÉ«ý¥:ë-ž6óÉT¾`>“ꢼ¦/ž(£ts ÄK”À}FLküõA¯¨€™(ˆ’É@Bв1Ѽ_À‚WbXLðAOŒc…xf‰£-èÊã¼RRÝU§½„õÞ>ˆ¿Gé£@PB ‘› ±Î™N"[­ÈÁ—­Ì‹WðD2[sd2q@&i¡àöh®À AK޹bZÙÙˆgJ‚Á¾öõæòƒÉ˜lÙêkdA²Ä– è=R$+êòD„#'™™ü€ZŽ9óÇ| ¥._¿g6åÌX@T‰`-Jú0š® š'&«³Ïž#«ˆgIÖÓÅBß¾ÍË”s‡óúØFŽ_áF/G$ª›7Â@ÇO›Žvåž5àùl.÷ZÊD ‚–Ë3XÆ(ê\6jÉÊÖ’¤­ÅðåG4'çÕ³¹d‹‘¡/™Ër§"yÄJûFF63sÅ"¹dm±¶m”gÏ,2aì¹øÜ ÆŒ›ÌѤG\¡ Ó –[.r¯LéÆëÏ…w(˜)%"ZÑ-ÆR>&#ËxgðõùšDÌ) QqØÖŒCÊÂ#siI'Çå6w«êcÕ{ˆYpq×1xô=´W¦¯ ×\ýÍojWÊð0*/m:Z$©$ãO?Ђ7—îØ”ªŽÍDhr¢;¹,øAä3VØ{z”«D¿öµö•—¨mSï˜É¡´Ly4ųƅ"B—ÄI¥Âßxºl¨lŽ„ UIlÝÈÂGW&v±µñÆÆå¬Ù"{uûÈòF˜ÞiIæ·Æõ¡Œöæ?þ`ÍV­)c—å0ÓMçïíVö2š»•UðÊ7xó‘A3Ü÷¦‚P˜+®WNJF´Æú³»fø”¬‘ÔDi(:¡¶F–@>ÝÝ¿#?!Rj¬’„ÏØ èáf¬r¤ƒŸ&*\x%‹?X®bØñM†NÌ(˜‹€1umÈúš¹zhœ7¨ ç¢èIsrÖS…Â20¹8A‡¬Ê)¾].u·\ן,ZgßÕÚ[gf§R@|¾FF)Ž[>'–èý`_\ü¼n—e³Çóý¿½´µºýÁ¯/?Ž~™q‚·—ŠËÝ’ÞmïŸ-× AZ3ðLÖ^°0e9Å í\Îu6VCcÕý+¥X ;x(«!¾s ª!L8>©øK¿ÁÙì†C8‚l†¦kî'wºFI+¹S-m±‘ñgôÉYJ#–hLÓSD4&D1eG´À[Œ!`~²ëâŒÈµà‘0ßµÂ;>§“2¼bO[2œ¶”~+®-³åã3û®¹”.†=OöØÉV‹:[åúx0«y’ó µ¬÷Êà ±&bÔ³(â0"%$·ÁƒÉÒ˜sDvIùZã©<Üdh3Ès€B³5ˆño˜îÌ:¥…VÈÂ×)<†’©L³œˆÄ2nPˆ?JÏ0jæî÷Ôô±,[½÷‹“åäõ½°˜zéÙƈòû$q-R*žñ6Z9?Y„\$6¶þ) E¢¾/朦mªEu ÆÒÌVbvAD—8üD´˜j¾°M¤ÿò`5Ü)iùM×È®ÑðŠˆ&PdsêEÑUëeŒÔbäær-ÓŽcÛ¨ – óoíû`žƒº?ð¦uKÚ°ôJcvcÁbªbc8Øj*=Ä?×g|zJÊì´VžNÜ‹¦Ä‹¦èhÎX1gX¢å¦¸´2¥ …»m©FŠ2o$U ¥HUMW×¾S1j!ƒå ÀùÍ…œ_{y«rE!]×ßþ DQÈyž.É‹Ø)²zmý¯ž+«š_ÞóCï–··¶ôòž‡pÿ¡ÙJ l×Ý¿RªÄ ‡÷ÀrÀPÝ’aüN#OÀøq¹@ ÄŽMµh÷hx—%¼¢ïa #ä ºƒê§¹a.Û¨6·ªãh ¿£+nÕG ‚EQ÷¸ÄðÔ==ºÇ‰¥G(£á÷(·YÌe9&dâžê]€y¸mõ†®ž†ï_üRg8ªfÐKÆWNkbß༫ðà]õŠÆ†G¯ ˆû‰/ýæ€.ÚԮ»·A÷V»øú¯L7YTºn‡ÞÀúmÌè˜/÷옌 Ž´0œt×_4lW¾þ$0oŒŒ?YâL Õœºx½%§¢RË“1¨™´9u*”–¢!ûcñ* Ýž‰Åš‰~Q(ú¹8RÊÈrÕyzíóÔ(<«|YsVMi”‹«D F(%ke äRp_åÊ=& ˜k»¦™–”S°ø æš}CWÜdM\qòpA ú4øËØë!Ry ]?(©t!٠ݳËqÆáò⪡+#K3¥q³±B,ÕléÞÔèÏR-ƒV˜˜ÌL¸!km®XEÛÚ— OjÒæé™!|ØÛÙYÏÕ–[–Z!RUd£ZÑ »œ#F(øWÝXqtÈ g0äF´õ#ð…!DËC/–Ën&†÷‡G4ŠL®dmíKîl¶g.Y:#QÈàÓ#AcN‰¦;m¥§´ê½=ì²qS»ámFóâõ+r>Çq|ómËq»”­HP“¥­©–õÇœÁ’p)(ìúZÔSµaJ]Ûùçñó†©DФê†0ü–³Q”²en+¤g’(½Ê%"rá>„ßøX9BüBµgCû䊼ä"â&¢\²Õï…ˆ¢’6Tu]oTì÷Ô/uñËF=Ò9#WàJ²â!UojsÿÊ’Pu8 öµïUWLæèxFAÕßÄ1¨Ãè È5’†c ÀšP>coBžA²ôjüÑË#Æ ’áS)ç•h2*6-¡•Í.ÕÊ1† ‡~dÛÌOCÝ2Q€Î˜#ž©hƒrëç’ÇI›qvžÒb "„Õϲù#5†é@âý–Ä1×¼h¹5¡²U LXJ Ëã& +Y±;+œß •­KŠ UÄóÇPLŠduDbíd­xÛá­š>öTU¾æ£àƒ#@GÁ;M¢7G6#"PÍ@…úôjŒªÌ.ÕBRÄ*”¡znn`Ǥµj^ ”§»•Å&3àÀˆ¶²¨›Y5¥Úmzo“”GvF(Yʽe“Ï]Œp+†å#}e ˆV¬$VP/!R5È4:`’è†Æš cKå%„ ¶RPy2¾DJ(°®=-™­ ž°‡­…'G”¨=×ô§#`ULU‘üx[£!1ö < ätðä‹JC¹Nr…®Ñ¾µ‹Ë¾Î謩¤ÐX‰\:¼ÇeÂpLyQ!3® ÀŸ_\šÊÃYJ/•ûÆwp)BXaš­½Mkß; b•)k1áD†®YZ‚Dßú¶#\Ÿí¬1Ìk t¤=Žò£jãƒþ„Ó†®î§CÊw6Æçu~œ´ dnï õ/t¼œc3‰ª‰Sª_ãGøRø=±¥Ïc+¥w YLCfkðÙvaáž¿m¨2Ú?n¸h9G‹5‰š Ÿ6õüèà¡Z±éŠ›L \€ú˜ž¥ ¦ûÙÊGû(;`^ìÒÐim4ÝZïÔ>Ÿó.cß¿-R00ÙÆø"20Ùs¦eʉÄÕL\Ó.Ÿ8h­klÇg`nb§tJÂÚ.æ †MPê°î”’Ç¢F´°Ý”q›JäøvÀr~Y #C”Ù–ç5c¸6J.B°LéZ&1-ËÖOZ™2Îj|MÉ w(sýáN*ÛO-|tz3½_ÞUC]¨…ÕÞTÝrˆÍše)EÖƒ#Š˜‘\¸–ÝjY"‘˜Å&Ð8<ƒ[!AM®s»ûGÑ ‰Ù7uÒ›öŒ1žzUûÚ2p†WØÓE–È ÙºÑbE"ÐÎùFÂuoÛ¬¿•(G¤N±¹(´sĶÛ–£k•'w,Gè{Jb9ú¾ñuXú!_qî(‘)¡@LÊÞÐ4®Àf}…ïåÍ%¦þ„"øJ«³cHÐaF4µzÜ’!r¨úx¦O#E»ÊØÉ¢tWs4”(¥†¶¿š;0*²•ã(à×mïoXÅ(¬Ç%Y¸&~޵oêÊ+¼‚ßÓï1ðKGõúüt¥ì8|ÌͲwøE:Î?IȶüjlQ§ ó¶Ú?0;æ!혭÷²È:1òŒq81²šÉÿ Kbœ—Rv7ÉÉ!Ü­h?+:9"¶Êz:0@|ǘ)LG¬“°šÄ#­Ú•¥c‘%å+Ö1­ç_¶2#YÀc)†úÄÝØee-F9fĹ8©ßhøODEb®e~NS*¥R­­¿„<£mE+ÕeZìÖa*ë0q?¨R³˜ÒdfW3Éw,°™üR.ÓÓd £ý/ñÓ §sð¨ªÅbáê-%€™Ê'€x„,÷#’˜Ðñ³köÕT*¥EuZÛxÚb'L2YíÍîN©<@²¤“‚¦jbê×Ú·Ùž‡ƒ¥é»ý ÈìÚˆôf>a0xä@Í1ìKÊ‘jü}‹gÊ 1 ¢¨^ŒŸÝ~émÿ´’³w”ÕK$çÑ=¹0$iw ªºÑÄ%Fßá|Ï\1URRX³|JÖÌ%^35³}^·gJ Â÷X( u=sORÕÊ÷^)µ7Úƒ¹z!eËKöõýfÎÏeì J„hÈ´AëF ñƒ~çO_ò=%knõ€ÀïóõTЃë?a› ÄÄ8ˆIӖõ…ãY |B!:Ò+ІAÄ0ÅžsIÙ©/Æ£&b tojÓù"&¯w3%æ-´F¡óﮤ tªzZ¤¯ˆX©egªñgj‡Ë=9\. aÚ¡"uÆ@#ËCPLÓQá &Ó^PåšÈÕ sñåW†}£weøÐ‹3QÇPÍwà=ÔØˆüÜç3u…™CsQûû3KµªÍR©v†1¡>„‘!D¦»-Hå\ØÆ»˜K-'-.íüUt¹:6­º7e‚³>V>~vá‚z¸DtÙ0y1žP¬™š1"/'|r–¯S@T‹Ì,^Rfëä’IL\Gˆ±QAÑ\’t…5ܲ|Ý»µ\¼†)iùW¿%ûHÂk­Â{%™ë ¦—¾”‰ÂdÖd+%Ô>‚<"›D¨$*õOX1®HuÅžÖÌë‘åÅÇœ¹ˆ~Rþ®!Bü®k+Êy=²Š€†É0ᬋh@ÎÙÖ"f¶5ç©iE—F8湺=ôU§‡1¼W¢TøhÊ–ÛˆºU1öc6ŠFü?3to‡??¼X$(%³Ýð>/e2‡\‚E´IR<‘²ZòÚwôFi=½?¼Æô(e²óšKiØLÕ¦?F%šºYs9èÓK¦\°Â‘nÏÜ-Ét×wf¹¦Û£¾'@Ó"â ߉šðŒ’æÍetD`áÕ‚‰ìMYVyÍÍÈö¯aG„:yôL3ÐyÝïÔÓÝtþtƒÓ¾xë¬T•~àðæ””ïÝJ"usšÞ›ñÚ$?Sʧ0EŒh¬‹jd*š¨©a:Š©1-bs²A¸,…dÛÒ§ï.¨¬y‘p·"L݉°ëOÉ>¡à¬ñdß,Ü»$¾ŽFGs~èå™§i8}çé-ÍÝ~}ù) «iòfô¡¢å|ã*¶u‰ÐªpD©#d4>lËÙL«¨\ÅðÂçIÍ•l™Hò؃ H:?ôN$»üI®Ñð͇fC_œk…œóiˆ-K;N‹N±,[¶H]Vœ%q¨>ÓvÈVû‰Íä´u²µðL»9ê{F&$SM$:˃V× F®mïkË\9L"h‡ÿÞçR/û³l‚&W$jüÓ¢ÕCÔ—2ôH‰Y³‰MÐÜø…Ãl@†P £µ 4Iy:ÐYäSÊ<͹Úâ^˽Ù*¬îlƒw#6—#v(›p$O" T²Z„a]`Ž7žjbþ„Ý–M’Ò1óö:&C¨­~/{vÒ˜ëDZ»à¥,ékÝz[{…È[Ê"Šð 3¡) [,öiüHY­4®[g¾\½Ê$ºàƒ%3Š kðG¿£o…å êš’+º¶ªÛp'LœƼˆÎe2ëº1ÝјÆZŸ'_–Ä @m;Wêó±¹ßë7/_p; Û§>j}¥ýÑ0F6R/ÑÌš‰h\’‡ºWÝ&cž,š‰/ãuÊe²æçðWÊúZ·óÈU¬¹Þú!Õ7ÞlUCÞHÌ:3qÅíÁ©{`yŒÓ7Œ‡Êh¦×CúÈnm½™Â>,%Õe¹Rp¹~Fu§©G)Þ) wµ]¡!K5>HŒ•& ,±pÿ–{-0.µ+‡Œ³Ÿ"=K‡Ò´/´!®ï„êÆOÃF 48A6EŒ-¹ñ ´y•XäÁ~ÀTu;ö$ îsÑBf«ÚaêÂFºÃo Í3:ù®¢–ýŽ¢ŒÉôSIрšôM„A‰²Í96‰ƒ•éa•µè=¡L4}ï ÅÑ (|“e²ØŸÄpD™©"|;Ë“²¹r'ÝAõ“Ù‘kÂ]›öþ•ª:^ñ°7ƒùŽ®8iX5ÑFÝãfêžÝc¾ ÊðÚçæžü²×½Ùá¸+ߣáü=N¹7G£´'|^â=øi ®iài5º‚ŸX9¼ sß“ÞúÖm=,nÖ$Aþ² ´‚bP +nOE9„iHYßDóïÕàЧޣàiqç¨>V¾ÈƒŒ¢.ï¦ôpé¡/±h1ý)þ-÷U³…g¶D:D1Í0ðH"[“­f‘´å“¯úb:,oÓÉÎ'h{o^5Lók 9%îÁñø¸àÓ#€OÓR3sß“2}®Œ·ŠÌ&¥4„‰ ƒZí»™Ía"ß0¾€Õ= ˆ`#™kþ7µ»®2"*˜ÍèÔ²½nìrÙž«m‰1j˜l‰2ôkXÞ¿òfp˜HÑØc'RnÂå²ÝâdËî8‡“€Ê 3$äu¼Já*#:CŠfЍ½ºæ$=Q¼E1^‹fò%…«-õO©BɇÖÚ&%sDp1±²V¢ iTO‘Ök¬ò÷Qød°Ý—ô೦ëýo+IÀ1ØñÖg"_X‚.—yŪ ‹¦ÐrËðŠ%YhªL$Ù~Ê´àȧcäqtÅpÀ{F§€ &ÖŽŒð úÓ0™#bGGàÊ“Íj±2²`Õ´£ºø8h¸4JJõf±%ðô5„Ây—%?gj5»qÜ7ÀqlœÏ€ôFØ7>QÉQzC~îc7 IA¬‘Xê:&¦›í ·æ¬ R0›tn+Æ¥•jèMbU!›dRQ£©oOPF$Sfá">Gü<`t1¢)w]õ¾ìÎÔqh¼YÖ\YRÙ´ÕL±<µL ÌöJ<šÖø[ë$ìŠ`Ý)( ¡/™HªÁp¬ÿ±&%®›Zhuº[np.¯2îvŸ«+µ ѶÓ~ñe¶må½òüiö¾ªt :_qŸÖ¿X]÷ôèw6U;ž\xÛÿÊGT _Ñ4fâž éõj…"qïÁsG`à{ðð¨ñØœ-56•¼#ƒóè­}'`ÕÉòØ3ˆÑ÷Pv©Ôfu–óÃ2…S1$i¸XÝ·™e‹÷0 áõõ|!Àôñ`jâ¾B/ç@0ÊP$kÁ·†[gqN.þKìHµE§™.:òV ª;%xýÉ"í©"uï©Oa€£E§)Úa!¦FRcɸ/Ô¦¼ÛiצÆ;í¼a.û¥9žïÿí¥Õõí~}ù)`É¥1ÏC¸ßÄ¥óè)I„þæÄ~bšÆLZÙ™2\²E Q“Ï´Það¾Tüç9h ¨<µ(Ubd`À,Am3…7b²Ð~nÛTé‘^0 …³Há ¦j½<*w}[h^ÖëÎ6Tç½g¦Ù+Cðd!»\‚iù®‚ùù;}Ãåj7{½ºý{ ÃÚ5„ü˜ÕlÙ‡ZéûW eÎ>tð ŽÉ_÷”ÖÇÆ^Vý㊋ MDчÜä lãGàÄÐÔ• ?-û‡£Æ_ªáO›Ë$D] ÌΙàQ¿‰Î(̦Pcëgtî{sk*ÿœ_Ïl{ì;ñà™Rði¯ veúüVýÞo|Ïoq>bLX‘é€#Vå…dúO0^ …é’Èÿ”®÷ÝZªW+˜ b#Û¥Q$5) é¥Zš¥Ç¦¦ÿ»¦ äŸ-Ž-‘Þ‰œIà±ä©Lð]4XÍ,éš+s¥M¨‚CQy)ÜÕ6W±5§,ÂÆcĽ¬%goBˆKbXÁ±¦;Ãên-o]WšæüG«”ûi¸FÍ.ßä~òËKcJõºëÔûo™»§˜Ûwœ~ßý½>ßvðï¶£wØó=ÞHN¿ÕÝ=¥»Ç__¾þáQÐ|[)vÎc?xÙVöŽÁghj/À{œ, Ḣ¨ ›œ¸¨J û/f‚ ‡øOYxÙZo5™pþ“ÔݬºAQZ°u Ê ªQ¯¨:Љ¶–Ej:û´4á^ùVl§|™ÄØo™è4¶ÍÀ$Ë9¶)Ž ŠÇ¹dîë‹J#Ÿ—IÀ#AÁ­Eã ”,á~¼CxɬLb<–hœÉñdà/s úT†e;>uŒÞ&²Åp„Ù„â\çÉ©m*[Ç Zü$KIžºt{ÛT—"ܱOÆpÉ &ñÎd’äI#)©®ñÀFͳcn³owNUwÞ¤–wËÃø)Y“6éI5¥ˆˆ-ïMN…ç¤{ñžˆP‹9 „g /Xîj>P6‘a¤&c¶r9Ñ‹l0;[ÛŠ\f6ϯó6‘tI²)&½äŠ´)RYß7Og†8–ÉM–Á¾æê!‹Oè ®¹Åê Ò¹¤TÚD¡lkMaïQ¢ðL¤ß}L°L´#D 긜ûiÑ‹¤<öFù¨- 6”ˆy :²0 ²<©#÷¯8 ^ÆE â˜1®°h0C·{6p$njZ'6ÚÞO¯™'6ºõ€ƒçŸøàÄËo™»§˜Ûw àÄF› pb£õèzN¼üVw÷”îþYÀ‰ñVbÊèÁA¬Z 4”à•ÔqÔ„IÏA°µ5uåuFC Á#K"u¥¼­ðâZ(g‰ˆuLrï4¦TNT³Lžw¹9Z¬ÐO8¨¶œ¼MØÇl0h¸ghYaü  ¾’ØŽäûŠaj%²o#ˆkàt¦(45³Ä:Åø£›šÙ\>¬l˜ÉÍ3‰,Ù¼©,ž}-ýѤüd¦™s„ýA×V]žùçÈÎnÔe¦º×lð·-¯|ª¤Ê=@⻄•ƒÉbƒ…øLÊóÙÛ–2y2†¸þÃ-œÏöLÇjªSæH¬öfª\}¢¨!¹Óisß3^þÑ©ÚÉekI4Ï øL6›eD]„lUeä}br}Æ…Ÿ?D¨o›2†ª"äƒ0)‘yVùê3Bò¯Ãu©:Lz¢êcÕ›û…¥n6,k‡4!Ž‹%í#6ƒ”ÅØmª 5ñéÔ’n»:©Çaüh&±Ã„ÓæD VêS¸ñTZÿHŽH~†7¹éÞ;`-)ëûlˆ 6—ò»×ÌîȈô˜ÆsÅÄ¢Ä”ÛÆl Ù¬ºh®a£i#ì`I”Ïf’’!מúÊEc‰2a Fk‰Ô-l’W–ºSàn¦[qùþhL-J„¢­mOVÇùM¿½ÿÝN ÃÛ“(¸GmŸâ#Ã/¿eîžbnß1 Ã[¥'á§wÞ¡FÈðËouwOéîߑު!ÜtÓi:ªŒõàÔ=¼#×ã¿/fðßL¯FfRà=±Aþß ˜qëo’€‘Ù#×/  _Ü”Ìf”-·6…"Ù÷ 5²Ã ¦­uk|YT*ÌÁôL TzŽH"z21ØSQØeº2T¶XïFhˆzökÆ:òr {® ã\³Ã$H–C\JËi±¨ˆŸ,óƒìjȲë®%€§Wi_“ʆ¨cºDlÜÌ%bå¹¥`ON› 1üq²F˜,FŒÁ¢3^2ƒÝ Ä¯ìjó]ÎÒã¼[ÓÍ‹¢‘ÔåW#Ëhku­õTH´ö»l2 ‰žËÜ=Åܾã=$ZWS!Qëw ;ÿdµïAÐá)Ýý;ò„Dß›c]Ï£šKà˜¥ö· >_‰+LÄ5ykmušÌûIuÿ(›1@™H” ¥(£®Vl&6c.¡J72! †hv¹IÓLx“`Q ( Š»ÀªÑÆÕ–¥DÐõ'³]‰öÄ«Ž âŠ˜†£„-~Ïzf  Ð)1¦ÍÓÓÒ±b… [?# V•%Ïa@Q¢ô&L9¹~il›zqQ³Ñ£»)& fV¾eX‚)v¹bül[*—L+% ­šñ@VH¾ Ë<[> endobj 4141 0 obj << /Type /Annot /Subtype /Link /Rect [60 720.500000 86.2500000 727.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_examples >> endobj 4142 0 obj << /Type /Annot /Subtype /Link /Rect [60 713 121.500000 719.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_running_swig >> endobj 4143 0 obj << /Type /Annot /Subtype /Link /Rect [87 706.250000 177.750000 713 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_commandline >> endobj 4144 0 obj << /Type /Annot /Subtype /Link /Rect [87 698.750000 153.750000 705.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_outputs >> endobj 4145 0 obj << /Type /Annot /Subtype /Link /Rect [60 692 142.500000 698.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_basic_tour >> endobj 4146 0 obj << /Type /Annot /Subtype /Link /Rect [87 684.500000 137.250000 691.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_package >> endobj 4147 0 obj << /Type /Annot /Subtype /Link /Rect [87 677.750000 115.500000 684.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_names >> endobj 4148 0 obj << /Type /Annot /Subtype /Link /Rect [87 670.250000 123 677 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_constants >> endobj 4149 0 obj << /Type /Annot /Subtype /Link /Rect [87 663.500000 133.500000 670.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_enumerations >> endobj 4150 0 obj << /Type /Annot /Subtype /Link /Rect [87 656 117.750000 662.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_classes >> endobj 4151 0 obj << /Type /Annot /Subtype /Link /Rect [114 649.250000 198 656 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory >> endobj 4152 0 obj << /Type /Annot /Subtype /Link /Rect [114 641.750000 169.500000 648.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_inheritance >> endobj 4153 0 obj << /Type /Annot /Subtype /Link /Rect [87 635 124.500000 641.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_templates >> endobj 4154 0 obj << /Type /Annot /Subtype /Link /Rect [87 627.500000 140.250000 634.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_classes >> endobj 4155 0 obj << /Type /Annot /Subtype /Link /Rect [114 620.750000 164.250000 627.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_example_cpp_code >> endobj 4156 0 obj << /Type /Annot /Subtype /Link /Rect [114 613.250000 174 620 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_enable >> endobj 4157 0 obj << /Type /Annot /Subtype /Link /Rect [114 606.500000 184.500000 613.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_ctor_dtor >> endobj 4158 0 obj << /Type /Annot /Subtype /Link /Rect [114 599 178.500000 605.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_overriding >> endobj 4159 0 obj << /Type /Annot /Subtype /Link /Rect [114 592.250000 163.500000 599 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_base_methods >> endobj 4160 0 obj << /Type /Annot /Subtype /Link /Rect [114 584.750000 178.500000 591.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_subclass >> endobj 4161 0 obj << /Type /Annot /Subtype /Link /Rect [114 578 239.250000 584.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_finalizer >> endobj 4162 0 obj << /Type /Annot /Subtype /Link /Rect [114 570.500000 208.500000 577.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4163 0 obj << /Type /Annot /Subtype /Link /Rect [87 563.750000 180 570.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_primitive_type_mappings >> endobj 4164 0 obj << /Type /Annot /Subtype /Link /Rect [87 556.250000 135 563 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_output_arguments >> endobj 4165 0 obj << /Type /Annot /Subtype /Link /Rect [87 549.500000 155.250000 556.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_adding_additional_code >> endobj 4166 0 obj << /Type /Annot /Subtype /Link /Rect [87 542 122.250000 548.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_typemaps >> endobj 4167 0 obj << /Type /Annot /Subtype /Link /Rect [464.250000 438.500000 501.750000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 >> endobj 4168 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 431 548.250000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 4169 0 obj << /Type /Annot /Subtype /Link /Rect [327 521.750000 355.500000 528.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://golang.org/) >> >> endobj 4170 0 obj << /Type /Annot /Subtype /Link /Rect [225 486.500000 258.750000 493.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/cmd/cgo/) >> >> endobj 4171 0 obj << /Type /Annot /Subtype /Link /Rect [257.250000 466.250000 295.500000 473 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/doc/install) >> >> endobj 4172 0 obj << /Type /Annot /Subtype /Link /Rect [363.750000 466.250000 381.750000 473 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/cmd/go/) >> >> endobj 4173 0 obj << /Type /Annot /Subtype /Link /Rect [466.500000 466.250000 507 473 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/doc/install/gccgo) >> >> endobj 4174 0 obj << /Type /Annot /Subtype /Link /Rect [147 396.500000 194.250000 403.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/tree/master/Examples/go) >> >> endobj 4175 0 obj << /Type /Annot /Subtype /Link /Rect [143.250000 348.500000 161.250000 355.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/cmd/go/) >> >> endobj 4131 0 obj << /Type /Page /Parent 2 0 R /Contents 4176 0 R /Resources 4178 0 R /Annots 4179 0 R /MediaBox [0 0 595 842] >> endobj 4178 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1701 1701 0 R /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 4179 0 obj [ 4140 0 R 4141 0 R 4142 0 R 4143 0 R 4144 0 R 4145 0 R 4146 0 R 4147 0 R 4148 0 R 4149 0 R 4150 0 R 4151 0 R 4152 0 R 4153 0 R 4154 0 R 4155 0 R 4156 0 R 4157 0 R 4158 0 R 4159 0 R 4160 0 R 4161 0 R 4162 0 R 4163 0 R 4164 0 R 4165 0 R 4166 0 R 4167 0 R 4168 0 R 4169 0 R 4170 0 R 4171 0 R 4172 0 R 4173 0 R 4174 0 R 4175 0 R ] endobj 4176 0 obj << /Length 4177 0 R /Filter /FlateDecode >> stream xœí=É®å¸uû÷wmÀ¯ÅA$j E€BEEP¶Ó0ÒFÊ^ä÷#J¤žDêèŠç’Ò}ê‚]%J—ã™'þò/¿þ×í¿ÿqûåÓ¯ÿ{ûáþþôëKóªÛfüïfÿüqÞÀÍ«û÷M›ööã÷—Ÿ·Ÿ/ß^¾õÿÿóeüÁ¯Ÿþ­ÿ×ÿÝøí_ûÿýõöÿÙ7þÉ}d?øýE3Ýÿý?Ãßfý¿šéoÛþÛË¿ÿáö7Û£ÎMfùüGÞHc˜Æ¡¾øe²áÏ?~üíå—qÒF‘M§¿1)äu’ßþþç—¿ôøîíOY§m$øoäàf¼ÓýàÌÜêÌÊlªÜ¯¹èV3ÉÛ•‘¿¥ôæñ9ñ›¼Åx4~üÈæm¡8ÞÜG:î·O®ô]aûš·íãnûX3N­»Í'Úõôî×sœk$ï2YÔ÷qάŸšhn³‰Šæo¾|ïwæ±EuÀŠz²,©ù4Œ)_¥MmÓlD®€ƒo>e_lôà~à¸ÞN ³Æ¨Wp ÝQÏ>U`¯ú¼˜=Sû2¼i_7lo÷ðö¿að22ïE´÷ßÏà^$ÌÞPø |<ÑÀàì7¶ 0 îžc¸FF¿ÌMðUŠ<ྑÝrD¦_u7@ox¦ko:p©lxÃÙ«nh^y#ìqG›n—þÕŽ0ÍÚQ*Öy<}{óz³±RxnßÎpËeñéZY¢éºF[V~û}zîçÑsTÝØ¿´åD¶•57ÕMŽ×òãE™WÆ:ny¿ÿJÏ{ñOãý÷îYÙŸÝ‚_7m8Fßòã%˜Ißæg:ö²\Ç—ß^>þa±',Ú¶âÙ~~gäòlîò >0Џ˜?€Ýó@ `¨9¯t ÂZ6oXØ`P@ÈÕ¹^BÞ…Ò·D@h¿Òó^ü“Z!o×€°{Ã1d „}›Ÿi;ÂiŒª@h‰ò%#eaÍ«ÒlI>„L„6’[&<¾½‰*3éÐèØànhb‚ÆEÃãÐ(Û%4JµÒ„Ò·DÐh¿Òó^üS»„F)× QŠh Ccßæg*çÐ8Q{ZáD½\‹y#,ßÃV}Q™AØå8:k_›.P>€½}„<GÀWvtc@A‘Ãr¼ð¬U:·Ü!—fÞ`Ñyi™;Pwò í€pLr‡-cë`rv8å[~ô?jæM_‰nÑ”©¦1à\؆áÃ0ËÉØ¯ä²¹æ·€œ•@]Öªwõîs^š Õ.Rðañj “bX#')ÆÌ0šq™LÞÚþÏßÿüò±ø‰snÆçü9N&Û:ÐngD°§`“E9ÙHµ]Ǻ'„ÝGD © z?”lù¼…8"Jö䈸cBÉFìÆgƒˆ>A)@Ìý~`—Þ¡"´š7ìŽX+—Âkã¨Û*µ¬ £NÜW£ð3uãåR8bmub[Cݶ„ÂÑø•\v#—ÃTŽT“Cì/,üHëN±›”èEÃn`×"v‡(ØÖP»e: Qp_9`ÖrìZÀ®ãÛêê¶%vÍ&èÖ|ìº~ˆ‚ÅŽ ;ú Š`âœ9Y“¿s~K‡‡Æýygæ V×@Âê¼_ý\ñç‡4©s9!ãm#þ'Uê&g¯ó†Ç¡‘7]}häLß…FŒf·/A |'ý„|#X¦ A |“ˆLœy7ƒ0ݼ™úê#“PwibfGÔ†m>àZ°M±" "Ïa÷|?þ ï«LÏðOêà_ëÝÊ™óK1¶ á OÁ 6$Q˜±ÃËÀs1)ZQq¯âⱫõ^xÙ°yv)uìÒ“CV.Кp\ Þ=ÀêvÒmšyÀšöÛMnd0&t•ƒ¢’!¥}‰û‰ÿÆeT`èÇÔYÚH¾ÃhuÇw{¼èäDÈ›yÃãxa#Æ«ã…`S„S9¥i3?ï”NJP)œì¾™›æœÍ¼[…Îí@K8Gih˜ãé0@\]¨´Ú )“)ˆB,DJ5שêÚ}È ñ÷—v4íÎ!óA2ÏÊ!ÄÊA›OëWÀ¸v1I¯0U‡¿€b#Æh@ëÁ„Ñì°Î£ýLCøÀ9z£}CF¦!eˆ59ÅüTj¹ò~†c€r¸÷„ bp„\‹Á2ŒÁ±-aXÂðÕv0uãƒ!×bp„ cplK–0~%—ÝÈå05ÃD;'H–]:˜Šñ§!ÄHâ\8OcA…e(„ˆ»1N‚‰‘©<¨Š{)ª‹ªíT€E´ó†|Õ´DŒW8 ü³Z°³Ö| ×¶ú.ÅVA ™PkdB…d¶%¢Øj $›ºñA ™Pkd¶îy8LH6~%—ÝÈå0U)¶òd®!X„%0x"zC¹JaÝQi£˜!#1*Lè)*l¬Âàv#•áR±†T&L ²-RÙ¯Òønü#ʰ5¤2a:˜m‰jøJ.»‘Ëaª"•¹_"¦°‘7M<)eš.”üHì›EhÌG‰ÞóTÃLÑ{ÓJµÈ&(Õ"›µR-–Ñ/ÑÙ¶„TcøjœÇÔ JµÈf­T‹èÂR-¶%¢ÝD&Þº‘ËajR Ùä)Õ’Yâ¦^SùŸl¦Z*m3oØk¬¤¼¾D6ãA*o_‡sG6 7žì§*ðx¨SÂ'1p$j…EèØ¨ûrΫPQh©Ü›G€kÿE;(-K‰1éÂÃÐì G­%ƒz¤îl”¥!ínœbÖ(Ïz©‚¸¾Û[Æ«½ZçGxcŽ(/;Žê›na €JŒ(†1Óê”'b¨]Òâ‚)ñ”»ìإݩU1*o±‡™(¹öÆÄÙMöÈÛ¤ÍX¤Ø7ÔÐ?ì ã#áun\®_G9L¦eÁ–I±Æ×ÞŒ¡^´3[Àð7ô—^ÉÌk(< ¸·¯ÐöɉbqôØ›c+sƒÇá,7svŠkÛæ)?¸¡Æa(o‚¦ <ðÀUâ94¢#&î7qçX”ºŠT Ý¡Àt&œSŽj…{PSZå‘À˜¼0ÚæÅ¿kãÈÉÖ:ð5”AöBzËeȳ#‚Hê¨:â{_j·»6lšOITlÑPCj·SN’4×#!•ä[áÓXÎ~ùn^{Fú¡ã“Ád£c<ɧ¼^êР`S š)`ä–m1…â‹D0¤, c8l"%5-K‘.Öo¤u“FÓ›äK¹ƒ2( CiLˆªÆ\^œ#Ï2#Ïeœ·Ó…™‰Ðóô¤û¸åæ`s~cç[ÙŽú7r#nFA…@“9tiÃÓƒK“j| =±”‰¢ò31ù¦’Tã@x•QU÷×6“-¸]”‚Õ#Zw â®sL¡E0‘–} ¡MàyˆÔa⋇÷볘´,&T"ž˜¢Êc€ŠD)ö´a\.ÕÍýÕ°€K> J• /Í5UŠ…Ó´ú¾ÅßgGc>ON 5oÈ—çkZ.å_§¨·Š‰kGY–ð^à'¹<8kžáI–öÝØ),ÏcÞCY¥H£–1ÊdЉLÙÅ`‚Þ#ý€;i“f.+ø4¤Ýt2¤x´¹’KݽÕ×ÛwrIx:Ék;…`«,˧„D“ØÔX~iŒiâíau¡*¤1Õí§}pä Ý9#0îȶ[¾ ËŒk]›0sx\$„-‚(óûþtàÌÏ‚JùìñÜ×à  @™) ÝçAìɬŸŸG£dŽS9 LcÉû³PИ‚¼eEÏŒdEpÐT¤6iáLÁDèòÛš„¦zúƒÛò”9g]cÔå¥.pÑ¡GÂC‘Áø¬dÈ’žDÄ¡ðS×ê:WVè~®²‘%‚ȪE©¢—­nÖ \Q ™9˜Ù'd”’úp`˜%‰®«³°ž €æ¨¦ í!¾lÁ0Åú>@oÜú’ÞÀ½9ôÍE®DÈ „®«HG$!-´h2+É-â¥bæ)¯šz9|¶$ñ I¨¸rL®+B"Â\ ü@®vN‹Cãój&þ†ò cÄþê‚- `jÝaÿ°eükEŠÐòpʧi-cþŒH~ïù]‘”c&™®DåJÎ[êDRzÿæô”%:u†w¡ÎòlHC)˜í€n»¡KèF‡Ðç0åU7SAî„HÜý^´8 _½vÇ ÌCF¥n¦Û81o¨B+ntõ¥ŠOg.³X¬P¼nƒ!© ÅýÁ…âÝ ÷ê­…C½0ðƒ'Î"ªÉÝodTˆÞaaRxÖåV4<ëÚå֭ɳˆ°Jú•†£0B|9æÚÚÐÉ?1òQ©:±˜¨DŒàƒòžÐ–ã~š|7ÁTHêÛÄ#üÀ€,dŽœÇ{e`{\Ãiùº×RŠyC•Û2¥A–qJÅH1a¤€à9wѱú²f¡*´µàŠ?«Ìp|VwLWì{e;i†R -u£{DŒdBÙÚ­éèš5DB‡œá#Žï/U#ö°Ã+=2)z¿)©Å0”B. ¾L*"…n.•N¸Lð€SV~ÃŽ“¯‹‘·1nL Æ!X ±—5âÂ>Å.ioëüÂO)W€Ñf9$•+4¡o¸ÜñêØõéæ¶bÄooÀ›aáßpð ¼/¥¼¹6ÏáüUÉáÄCz´ÖËÀ+7éÂ#»{lW~³±öñ7úµ3Á‰9äO[;<ëì)iÎÀÔqïÕg¢àXKRÆš–\ÿ^Àµ-&ÉL"õ— ™Ìíc.åº{_J£CÒð eSí²†Uù°Ѷó†>;…`«iKK`p_Y0é7°óŸ’,M(—J‚zªÂ%ÕÍ¥ì~´eöPt!¯£/ß-r’³“û7,©%\ Ÿsd ¡uBUþËè}L£÷ñœîOb\ß öá”P mòßêWŒÕï~jÔM€øMÉ{õ®Ù¯eÂ(€5Š­‰ðþ”p{·\m“¤³SJ¡ F´ÝЫ~):mdÛØîMNðîFï|òé© Ç›Ü;ä-•ÊïOá~I´¥ÛaŽ—4œ?¡dDîÛâiË]Øu],†$: ºèxªê÷õÕõ«8!2j?ºêݧŽ– ^+Uz¯:Þ×çkç’^ašãÚ£´£<ð½E¬:þlqÞ4ñ¶å=¤¬GÑ€]fê3›ZšHí<µÕ-inð-\f&u°ñõŇ”PÞÜÌG¤ª—¥aé(` 3v¼7M¯f\v*»àÀÏÈMµq1SO “ö {s)ä9cß¼{Ä<™ej¨Ã$| ­ÅCaNz—ceZš¦ a¶˜ÖtVʰƒa¥C8iŽôx¨ŒôK5!ý‚mbp`¹pq±í·…moï.º­TÑfÖÓž<*­’4ò›ÄÓúlzÃ墤rQ8hûr¼å—òª§ˆÜ-ëÍZ^¡àÔcÌqCçn[0È Môž6ž³µaÁOm}àœ¹!i ¥9gƒ¯Àið¬á•"ÌN$Ö@ÚKQÎT8Õùz·Û†18d(w°uÞˆ¤ D.T"†øêSxDʲTÿn½C溵ø*eÄ cfMüAŸ$ ,}w6*@"æ¶‘ î5\i²)1L7`E¬žÛ¼aÒ0{M»o0Ußl@LUÉê}î ªê¡TØSRÕsraCl)(¿Ç%Ê@¬9Pb-œ W†ß Ö#[JzyNÌØO Ģ߇XÙ´Äî€Ø‹–oö†.pº,¹¼ |¼€ÐŸ°hHwô’¦¶x8·÷³0~¶=(E‰1;Zßúó~lœGÖ®ŠÊªR\\|Ö¢¬Q0,Ãð‚±”]Rü‚±=0†Ùê0æÖ“?€¾eÞtYª Wæåz7¢Â•dh+GŠÔÙˆÛÀ„¤Â»ÇX‘pW»º~„5ªÇþ –iÓì‰ãxZ¨<•ý7ÇùF’°9K}10¸+´ö=¥ö^éùDÊÕ*d“tR Áj!I©È‡Áh‹iÒ t®=•%Ï*kRpÃvy¢®léW¢U®D+Zþy<îE¬ cRJê×"*>Në(` êîd®¬š”Ì iÍ•òØ8çÌ Ù˜ìiWºá…ÏÞ70^ž6ŽýÙüÉÇÈ™QÍ;Ì™©ŒMðÙ“®ôÙ`¹d|¡âï/Sá‚ejX>rœOQl’y²(JaJbAdÄaò·ž g®øÀcÓ ZãýœéÆŽÞÓ#ËÐhuå ½½¹2Ý6!ö‘Ê\9@{ ö’··NûÑL·þÏígΛÐþíÞ;Œòfõ"&^f/¹MqN&]s‚ŒóÖ+¦èqø+<ª1”ªøøì~ã.2™íÏ8ƒ5Ëýghq/Äsmn_ÝJ£»Tœœ;<åÛ”p²Ì-=Z C÷µî5øFBË`poàoœW%-}Vê pößýŒýÌ¿@ca@€Á~¸‚ÀÓ-äžCûArÜ ¼ï`÷üÓãû®ñêpvßÀ›Éf^¦»„éÛíÛËÿÁQ­‰ endstream endobj 4177 0 obj 7229 endobj 4181 0 obj [212 /XYZ 38.2500000 299 0] endobj 4182 0 obj [212 /XYZ 38.2500000 503.750000 0] endobj 4183 0 obj [212 /XYZ 38.2500000 147.500000 0] endobj 4184 0 obj [212 /XYZ 38.2500000 749.750000 0] endobj 4185 0 obj [212 /XYZ 38.2500000 147.500000 0] endobj 4186 0 obj [212 /XYZ 38.2500000 213.500000 0] endobj 4187 0 obj [212 /XYZ 31.5000000 377.750000 0] endobj 4188 0 obj [212 /XYZ 38.2500000 749.750000 0] endobj 4189 0 obj [212 /XYZ 38.2500000 184.250000 0] endobj 4190 0 obj [212 /XYZ 38.2500000 335.750000 0] endobj 4191 0 obj [212 /XYZ 38.2500000 503.750000 0] endobj 4192 0 obj [212 /XYZ 38.2500000 299 0] endobj 4193 0 obj [212 /XYZ 32.2500000 376.250000 0] endobj 4194 0 obj [212 /XYZ 38.2500000 213.500000 0] endobj 4195 0 obj [212 /XYZ 38.2500000 335.750000 0] endobj 4196 0 obj [212 /XYZ 38.2500000 184.250000 0] endobj 4197 0 obj << /Type /Annot /Subtype /Link /Rect [412.500000 249.500000 472.500000 256.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 4180 0 obj << /Type /Page /Parent 2 0 R /Contents 4198 0 R /Resources 4200 0 R /Annots 4201 0 R /MediaBox [0 0 595 842] >> endobj 4200 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 4201 0 obj [ 4197 0 R ] endobj 4198 0 obj << /Length 4199 0 R /Filter /FlateDecode >> stream xœí]ÉŽìÈuÝ×WäZ@g3N€aàMeÀ ~€‚F˲ ¨?káßwf%™Uä‰dœ¼1I5Ôïu±È˜nÜáÜéçùõ?ÿýÃÏ_~ýŸÃoß_~}©Žm]]þw8ÿóÓÇèî8üýÐvõá·ß_~~¼üòòËéß?^./üúåßNû¿ƒ>üëéÿ=üñ?N?üÓðKç_øý¥UíéÏ¿½ýÙ·êô·êúçùçyù÷?þ~þâ8Ü0™ÛÿþIWuWëó4î ýãe\¦zûç¿ýýåçË„b•j+{PÖœþÕ[}øßÿzùói€ñóÕ±?ÿJcÛê‘Z}©®›ƒÒýiÛµ ôöÌçU„·mïão3ßeåÿºäáv­½lPÝFØ¡ë×cloªx›¹ô¦ŒG ?~ìšáðïäÐÝi\ÝéúÄ3Tw¸2Œ_B¾÷ÀË÷~x^üüýåç×Ó”N‡Ø¾ÿù´+oc^þø~:ŒúðÓ™ØOsþþ§Ã?U•yýçÃ÷¿¾ôÇF×ã/O”EOªOðÉgâk:ükž'Ìz |ò =Ñ=zb*Ñý><Žjà×ðÜàT_‰ÅççVµás{ž=°õ³ì‚wß|Kîîè·ï'v›vçÄ h¯Ô³L—˜–1Wíþ$z>ž'ÄîhbnŸ6¼›ž້wî5憑ø´ñÀûÃÜ`„sóÈÌ;ñ]ÀëÁsÃç÷À`iDеÂú—‚OðJMBYp²PwY°@0»“]ÈiÝAõsd¤›72êÔHFê²hu²@/ÓyŸfŸ\Pusyô¾èWâOð½S]QÙc{yä˜RǺ7íÍ;—ÍmŽF]öý}=šÖðkx¥_ГQÌíA çßÁãà}ˆR™ãɼ¿]Þ· ñ«æØõÕí^Ã'³œÛƒ £¾Á' \ÞQ8ŽçäྙψÞ0… ¢$ìLá)xö­—b==¶º0ÚŽÛ1r°Ö]À ¯u#EL¤ÅÜ“ QvK~õBóöhMëì)~çÛ°ÛFwjé”à8ç™yB-cÜMiÐGB;]êa…Kžà)µpKËålͱ¶M7ÇŽçžÀP‰÷ÍÀ¯ÁCöÌŽãYÏ„òá2t¾@åãíR#wl."Â厪>V.Gý¿6ð3=>zWuša#«ÉF.ßüyϦ`Z…·ÅCCðN {î ¾¾5mnàzd¹´QËÅå] ·>Q¬ÕV;r ÏÓsfr%HÏ@b¡X^€@åO&hÔƒ/Ît]„ Qðxì7)Š»oÇ÷U{»¨9;#5cP>3gðÏ8uÁ{-üJ éÀ!6íåm«0Ì ¢q£&L¸’4ö眺L³=¹ ò}­á4_ïð¬YÍ]$ø9I7ê"ú®½{jx£õ!lipœ+D9}ßÞ3çíЧ9ŒÜû+T$'¢K¿&ö¼•v'îQÁGؘÕ„Ì÷ØPH2ŠhˆvŽ˜]E Q2°RÈÄ";Ëè=ÐÚõì>Áü†j* FÔÆ ç—YL#Ûj—“2—›Íó$3tñ¹‡lR–=Ü ~ _f©ÌpzH ís_ÛÁª$õµéN×mØu§"u'̨íJâmXÃï`ÙÀ8¤&î Ì1!eN@8{Ïæž{"z])wO[Œ),êÚe“²7•¸Jê³K˜k•ìñ,VÑ–²m7¯—ìjeX8GDÆÚ$e‘BjÜÉ%ã@«_/Ð30>[†Û¤rcÀ^S-²Sôõ Áöd5w¬rìÑ­À¨É"Œ“Ð5y «“2úr*tpª1êd€¿9nôþ¼gCqEÆ’&Æb$xù¡ŠßI€R5×\0Œ+1‘uØœdôæåG·ó5ÁVvc |=útÍä>¸ ±Ñ¯W îšéá É“E|RzSG‘2g¥†2œõ.òXq÷–7¨Ê¨Ö½3L^NtÎclãÎ ¨UYþË£Õ书R o.5K,À½jg‡ü¶)a°ˆßãµ&š~"“ãA8o=c›î“Ï_î¬ÈN$#?*®ÔbÚ(;ãŠn&“ )žhœîÁ¸g脇˜bxŽ@nd¶ÏÙQÓ¹¹ÕèkZeçÏ막£¨zÀRL: Å@/Ë=ù;¶Ìåâyæ&š[_*£'F0¯c§¸Úûó¤‚Mw ™ŠÝyP+ÆÆÊNÁÎSCpa3!ûàw˜è-™ôƒ­¢"¼—-.¾ikë²Ì"ñMÛMX;£³çÌ W•³ÆÀ¾9ÅÈ"|Ï]G…Ë€ ¸™S…trw‰ÀÔz@å—Ëôè|¼–2»1ÆY‰JP²#ÀÑ̰}Æ>ajxˆT@ZN:Ö¢uå×-eña®š “fDMòR½##ï÷P1~¼_*þ%´À¤ëRHɹ«D0™rlH¥*H”™ÛÚ 2e ¬XÑ™»¸Y¿ÀS&ZÄ/UM8ÙLû +oÑ¥©ÖÝòSœ("›{¼ÈŽ9„júÖ!ÔB1'ݸóÜF½†QbÐLÄjyÆÁÚ–ü¢òä-År?Ý‹Q;„˜¤Ášh‡%–¬x_ãó”¬È:˜,+&Qæ àyšÊ=ÙÄpÖÂYƒ6òΓ(ÿÀΓJäI+Mðé$€Õ,ÙI̱È&Ç®ò©:D.Z"LÑTÁIY„/™þmïW•óTæ\ŽÛNÊrxÄü=‰”`[= éIS`ðYõJ—Ò«êqÕ›KéMtV»ð ҉ƜS¡7—† în1kf»›ÎŠ]ùmËϱWÆgw–Ü*?™¥SèûkD¬ÐKT£õÔ÷Yž6Ê´ßì¶úpWß•ALæ]ÿ~‘\8q…¹^¢!èùªdVaRr¶p®ãS;£ÂóÃyàR <|gZ€iUYæqSÕ=š…DÚ4¥„0Ñ4c&j˜‘–»ÇEJòí—5rÌ8õD$í¾œʤAãxbJ(.Ï0d,eª2¦¡lÙM“ÂñDý{O 8£G6kò3wælñ Dñ?ê29¯1ZÌìFØ#•j†šo«²Âàaº²wïF”|©d²¸€ˆÍN…þj³ üúdE²)h÷˜p‚]¸V˜*Æšâvêkwð­Eo`~‰ï-“)‘H³(À·¹NùµÓvÎõ^2²’¢Ù;O·K–5,‡<³'È /cjeË"k*YLåùM’‰ð”ð2Dý™Â—r•Â~l‹ØÙn”«8¯)äkï{lù»ÚÑFÌ´Eìd¹õŽ?Ïðr¹1-8˜0<ò²G$ø÷\$"!W{a ¾-w®€½–ØYgnŒ ô%êíQ$RÇ’ßѸG‘ìy»ñc=ê&œ0¢ˆ¯hÞ¯•ui´].k£naÂ’ñ lÿ‹vØ™t;g*X&ëz¶JË´dﺧî/&ÀœxÝkbÜñ¸%û¶w˜é@©s…qÉÅÏ艧Lã7øä+üZüo•m ITÕÊ´àZÅÂøåÝŠ³²Ð‚pÎ[*d¸<…ÃÕP &QK¥NpS-1SàbMswž ¢@] ‰ôÇT÷~ãßY H=†ß4k¶éM»þ>ÑÖ²IµSuwOmê%ŽžAÖuô Ñq®®o)[îþÌ¡-ÉÂmMu€’x»ÿè™ýGÅAš1Ãa›Éõ (YQrèšØl*‹Y&¦`U1 Ë™•‡U0MÓ&½{˜ÎLXO®„ß"°m¥î‡XqÖ¡.T6ëAz z2Øma3€_ó`À>‰žÙ©Ö•GñWµK%Û¤ÉdEžŽ Œ´Ú±Žemí ŠßŒdñ¨Áßû”js›È`,àÄÛñ¡m:;·7h·sw;w·sï‚ 5ÓŒîz÷vg·s³1ÓݚݭÙÝšMoÍ6«b”lÍVxn 1kجv½ŒÈüÛ¾r™ùY¼¿Õ‹ÅäŠlÖ0VÏܺ×õbö±C^’ˆF-çjDäÔÂþ,«ª·Åòv¤Rýrr]uè}T4Ⱥ4êÙF–3†AÉ¥øL?6äòÄ͉Æ7R[Õ™d‘XV©Ò ‹6ã;ì|˜ƒmu%Ävž©f¸ƒL!)U¦XJÕ!Äã/âãOÔãÍ1ñ`[9×Î^ˆ^Ù£v«Ç,µ¶Â˜ÊpÙCØ èQÆì&&ÂAÈN›b=²N¸T%ûe7_–ƒ2×f•|. úåÌ–Í—ÍÜç¹f‚h­wѺÎR0© ƒQ[ÜŸS¶Ržµ+Ü™bTî".=/Úx(JQÄØÀªqI !J\bÀŸb(Ïbú+p羟àÕÞÆ§€ J´p¼Ò×;ûü¨k× #.qNCRé¶uÅÝnˆš)Ð7ɬˆ,lç,ÏÀÛ^²<欄ÿYÃÝñxÀ±7Î->Ï5J;4±9ï D¡NáÆ1l–˜^ëòÅ(ˆ+Fê¦u©a•ÂÂÊö ô¹wê'˜ø´£"]®z%mÑT?[Ÿ§¹ ÙšÛ!OÖÆ š0Ù¹'íÀdµ ©Wâ<ƒ½3p4eGË%÷™¯ ^γ6âZOø if¡5|ç»›£QÚá¶xœopnx†´Ç^ßډ̬µF3ÀO˜}Ãëê6ÌŒ3(s´ÓÀÝÁs‹_-è⮯‘:­‹˜FëÇ{b3!Q vlµ{ìyÙ}õì·¥aJüôTb®@®´¡=¥Ö·;ž›L¬G¸…á¿J†æ¹äœ³d”â¿ßÅWHZ"ÃÇþÂÀD¢µŽ1´ÒÔ5Öo›aSª¥i%‘S‡ðøwó¤2¥Ññ×°ay7U$fŠá€ª~¸s«L1,¦¯g\òí*WÃnòíšnž|cŽÙN®LÁƒ¹Î‘RföØNÊÞ/WÑó·tÜ¡ôÈ€2û‰Hˆê¼&Çxà„ ä0 È—p §ECôÿ!®±}šj¬5½ÎÄBë*¯ˆÒq—TUCâ%u<æ#Qn²dõ(r €‡m®³¶G¢\r‹wgr”©œ`q{ÀR¢#]Oƒ%0RM”tòu9H˲"Úµi‘4-.Œµ$bIDQ´eعVAbúr¨Û1,Q+–djÇW¨÷Ž@í¤n&~²_íÇ„#Ñ0hDšðÕ¸%Ò]›Mýò¤Þšž[ªZOÙšÙPaϬ¬£Ð#¹ùÚùñã æb-×™½¸«ßÄŒ8)MäEPUdëĉÆA% ;(¯‰é“6vÍ$ç1>„Ð<­7ÆÞ@ë©g õæ¤^ÜÂÞ矸ÐúÛo™›¯˜cŒÐzcÌ ´Þ=CO õ·ßên¾ÒÝŽ‘Z·×c(Z·¯PꥲJ±¶5¹…‰â¦ö:°iýÑåÕÆó£<[qÆ`´íÇ6ÀˈjSS)GÐÉ¢T¼Æ$F[u“Tª—Ë×Ë·ƒgçrîípÓÚá¦TŽ¢U™¥+@B¢bí}ëHÇd½ì—gžy®ájgTÐT&]*…vUW4rT›[䨶sÈQݸ¨Îé'äèü[ææ+æãWä¨ÖsÈQ­&c¨)rtþ­îæ+Ýí £k7Óˆà€Ï7È* + ÒÕ'˜Z„±c%äv1ùHa!¢BÀF•±‰05wƒrófgÌXÏ“„»•t²…8„«lN@%,˜àÞ€ð(Ùû˜*¤Š°ÝVZÔ'Ýe{2‹n+òl¹ÉêÑj˜X€Î2%VXÉ)*–¤­kÌ£(Ä'‚—7…!f»z&ß½0LÉxßU±»@ãeMþÙ(Má²;²á“Íç%Cm;x?÷ã„A`*’Eà—çÒ="¹)"JÐ7 ŠÖÞ8ÇìAåá6p]áÌ1ªðˆgHÐL˜E¥¢2‰â[Ê0^ºhŠï7':3Ï—¾¹( “@²&×ß ¼ó9ñ•§w¡ÇŒì:WµÚó¬s>Î •Q[5ö/Ä SÕ+µœž¯öçÐnä}Ÿ»ö§ê&dE°®üµ?%aÃXPŠln¬ÇXÄ¡Ø ¦¿¾K>V~_rÉñåö̫l«fþ*ÇSMØÇó2‰T(xÌh/£LÚË×çñ<ËÊ<êÀpUÆóœª¨q›ÌË"Uk¶µ·aÍ­ kn­Ö|þ‰Öüö[ææ+æãcXskçš[ë†5Ÿâ†5¿ýVwó•îvŒøaÍ­]wX³‡õM@c‰œöüRfó Ы*èIyºÚ€ïw+G wLÿ!.3޹׎\aQ5Tåub¡0ÝÌáç…ãeDïaH8öÎÄ’QÞå­…S” ÚÆ. övMê†0‰2!¼Â5fÙ61DžgµÙ‹ý>‘.µ&^G‰ã‚ŠTÝpVßÁxÄš.ÊþPÁŠDãx/¢Vª]¡%ÓJl¹]@uo\Î…)@ *ÄD‚/¦ÈµH9Õo™ v”™”Ћ:¼t)uCÁPñVùc~$º€Ò"‰ðædíO®}v¤'YŒ9ƒ¢gß­ê੊F0¨ý][=&Ì¡µ#-D²AÊ;š¾64=ƒ:oDåÊ •RØ#º£âY<>1ÃÂTïH ­zŠÆÒöÓŒœá[5š‚y¼ƒž>—y«cÓ¾ªúÎÅ$˜¤©=8|Û­´‹¬(˜èœu»•uéâyD•‡C2NJ†ß2‹€Tlõd½v”j\RÆ[õi±8c:‚1J*äß‹‘H€›ÔFÉŽQç4˜D"_bÿùÁÛqÕ=¹3¦ƒ²—?‰ÎJõ¨,^çY@§)zÌÞ¶r;e;M×:4![¶3Y™™ìÈé&ÜqåP#ö#±ñÖêÜ;¸®bF¶[w«R¥EAâj£{¨¼M¼šCm:定0ưTbÜT÷Mi¶¼m]A)Ìœ ib°Ù¶Ðyêôv® ÂU =Õx±‚ŸD‡ýzíJJÁçq øùe—òüxnêæÜ.?Ytà*Р­k}âÂÓ˜Ô±”…O<…§¡4Ç2Û`Ý`qëË«é¿íÒÛ&L¶Ó,ÿÃOþöò냇„Áx=ÁÔD+W°zÁy8»ޥκçÙ`þù6‡¥'¹¼PH-&–RÖŸŸÝ.߈[ —ÀÃP/ 8Á"™1më®(Õ¯3ôvkç‚Ó»Îã½»æh¥ª>T\ÎÏ~¦€‚¶“¬âDÝ•3fNßCe8Ò9Ušî3úšp‰CæÞbí¢ Â=aeKP$rÇQµ°¢ëv¶ï])–ÝÕ¸'iÜ—¹w°sÃ'÷h*¤m³“IÔˆ¬aˆb5žªf*èò½ Â¶=V”ï{„aÞ*™” *á¢s.K¹Ò–"Cwy‰ 7&K‹Ø.Ê“Êøý$ÊFQÅçDyrQqÆÄÊBkEuK…­âTÛD[MåÅ 8„€°kÙ`…€ÓÖJ†w‹t¹ 8„ÒÚ»E«¹JÁ ac„Âç–K ÉŠêq«WBÉvÐf’ˆD©Hºê^Í|:×ÍÓ‡llAv×B².¶¿j‰ÑžÉAz‚;¤HÜP#îý„ Ì"Çw<Í<‰4,\¥Î3lt?ó\ Vn Ó ({4xþØüuF{ì_¼£¢~°ÔYˆ¾˜Âª1Î=d„ªý~wes˜fä”%ˆ#†tew‹?ññí¦P W« ¢œ³³p«áײ©D!eª°l·dü¦U"°$•Ç1UÀu2d9•噉ÅlP»Â7•¯t |ùÜù¹¨³äÀøýÔ£Yë*«.Þ¹Dóø«Õ ÑÝ:{è‘aoÜ£µFŒ¡@µ. ˆºJ› ¹º¥1ÎÍ{ ñÉÌ“†òBkûżp‡U‚´4ÌLô«€zÈXW¨¾~Ìx¼ÞUXö–^Ü©âe0iYL^ÜÈd!ÜLü¾åLrÆ÷°ª¬ò­%‘ï(D\"r,Eeôn5?j5+媊»qLÇž Ò½`ôìbuÊ4£)® ÜnóKpòÎ:ç{ÿŒÉZ·j— øËV"¾“àsŸßF¾óJí¨M‚ÇJÜ<©“Óÿ4#ßö(Ò°2â‘ù¬ÁI­]žî¸äÊcâBb¯ÓªUQS r…â6Ø^†§rÜrãE8.Ž‘íËË,x¹)±Y^ͽŠI2šÐavåL¸ v’¢ái°ÓþzôQÄè F.aÃhŸ0xëÂ…uv„3XBÚÖÎ)&ŠmïŽéý”‹Zžç~|r/¡é »œAoñ•¥j§.,“5^ð;”tèd²5ãåYÀÀüîY½Ñ£Bˆ4g¢£˜ê‹Ù;ö$‹x ðå¤Ý”ˆò´é\¾•Hý¸eèRÅ{g”îˆå:„~aœ,l¡ÑÍ­Å´‡-> >> endobj 4206 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 285.500000 96.7500000 292.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/pkg/runtime/#SetFinalizer) >> >> endobj 4202 0 obj << /Type /Page /Parent 2 0 R /Contents 4207 0 R /Resources 4209 0 R /Annots 4210 0 R /MediaBox [0 0 595 842] >> endobj 4209 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4210 0 obj [ 4205 0 R 4206 0 R ] endobj 4207 0 obj << /Length 4208 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸ÞûWx] ‘Ô( äf&º($@EE¦3ƒ¦³è߯lKŽMé£ÄO‡¤d+37±,‘:<ïçwøô·ã?=~÷þÓŽ_ºßï?²SUd×?ÇóÏoï?Ðõ©ûû±ª‹ã—Ÿ__Ûÿ=\oøôþOíßþwÔÇ?¶ÿýûø—¿¶þØ}éü…Ÿ•ªÚß?]~7•jÿ–Ý~Ÿ?ÿ×áÏ¿9þr~b¿\·™ÇÿVge­ÍyK=ô¯©.?¿~ùåðÝ~«äÊ”yyT¹ÉªÉõñ¿?ü£] |vjr¥ª2¯²% Uú¼RÕ˜£ÒMû$c ]~„àá.Â=ü²sq¨´G«ÜO—<ܦª®ÒYþýãÀ?WuÀýì\*ýáâ§ nÞ.Ó¨²ˆåðÿöø/ò:ÜÃ/;‡Jw¸Ž§Kn©³Žr[2Ñíñ!àßdy¸‡_v.•þpñÓ·Puý¢©åAôíñà_TyþuçâPéwøô>OÁ[¹~ô¯Žß>¾ûÐUyüüvg—¯¿>ÿ|ÈÛœ5ÁvïŸ<þ.Ëôûß?ÿû Ô©È˺՗Ïß»\ÉŠËÓ_¸»’_®ä§Ü\ìÛÝ\®Ô§ºÉJýpÏ{tOV¡{”†WÔu׿dt­ôý®á=Y}½2cKª†¯¢?ØÇ;¹.üÃçW–s«Ðdà¤U‘[G­ÌeÙætÙÍÃû–èJ÷#WÌ;xÏxåx¥ö¿¢3bïýa ÞÃ+ðiŽÀ§y$C¼Ää•a߇^³ç_­ºÔàíÊ tOÅ3HU½Í'UÈœÜcŠðÇî±·äà}9© .Ll)+Ñ=º†÷à§12ƒÙ5–Zø(áÞ;¸’dÑ  9Ðq †ñ^ 6ÊÆ.ãóܧީb—ãi(Á‡¨\©ì…'I0 ŒKŽÍbœÅOô¹¯ŒKü!¥L¥,1ã ŒÈÉYs"aÆbîß#cżuz± ¾’Œ“â… ”àƒ…E¸•C— L ‡%·¤ ksU¦´ùÖé±ÍÕÀ+ÐæÒøhõaÛ.<‡­•±y¬3Æ>ƒ<„6ÑY<^J‘©:¸Wea)Öxo˜è€[#àá5*·ñ"Q¼'’å°¤ð:»©ÚT””¾½oYS<“(x`@¾Ùò‹ÆB ƨÆÌ–’¶¶Hùð½ÅÓÈCrMp«Áã±a3Ņû-ÏYC“ª²lÐcæÌXYŸ²4C3ÕÚ£~ƒt¹ ÂœsÁU*Ѫ*,xPêèR*;••zÔÝbùõR™ÛEÁzxÈ0ý øæ¨Ä“¹6±Cƒ9/9€Ù(v Çr—­í¦¤e@îUd•-£]BóX£I%Šq”‰é'A@¥Â¡n0xË0)B3|‡3ce`Îí@tÄøÀ0¢3QQG³ƒ ¤b|+’D© È®ËnÙj Pei+’–·s€ 4 2?1QM}REøGvæ|ž’ù˜¸E£¥>q[¸°Æñ'LyóÓߘ7ަMéÁa]N½ãÎXaJ¿$ZQ_”c¸7‡ÿŠy¼7œÜŠ£LL ¸ÇV5¹uòë õŽmÉþ*öÆ&愌ha”N Žû$Þ© ®ü9nFÑ÷ˆ6Ø(uo`âˆJ~Ϫ‡®cuÒ¶éÂë*îÄãàÈ0QH}`*P•õZ%÷@9ÌàäòA„±.pŽN¬[Ó赆¡s.š$‘ 5V¬Ç=îWw¹;Ý/B†@ez"&òéü¢‘˜ßF³û=ÌTñKœ³ÂÀÜ!d}]pØbÀÙK>º)>'hf,Õ„xšãÔ™½öÊæ0 2¦[Ùøpüôò–,Ü6=ʲ8²=¼ X?÷°ñ½MÑðáß°†¢0Ñ=‡ÖÁøE³‰Grá«S©Ò‘V»DxØÒ×;9Þç-â çÅä~ðáX¸ì Ã{˜Xx§ãŒ]U+Øók`ß`4±¢Ì—`S“ƒi ßÃøµ_†‹hŒ}Ì›þïãøLq ŽH»Æµf˜sQïƒï!v°z¾Qß0%·Ÿ‰èKSÜêr3UØT‰Ô8Á¡‹Ærd}'éZ%Š1¦”ÃÈd'¯­Mjüz‰ˆöRÞrI‰€¥Îët´3}}&}ޭº ¡QgÏ2ÌÛ­/°ž®? ¡y9tó—èt0Çòz8¦0¬°¦¾Iî;‰åq°¢¬`Åî+ $Eãœ}Ý{œX–ÞôªJßü]ð„d=Ϧ·í>¥Wò)=ö®CãV¹™Üƒ³cj‚W(¾¬n…wÀŒãÀ˜$+Àž²+cÔ¾ö8VjqùêöÃæúÖÁ`Ï‚çv ›ñá3¸‚É4—(|’\ ªãÂ÷È_”¢ùB-œ÷<Ò¬( !FÒ…OÒËËÒ’Z"üÒQ]™¬CÉš)T¤@&Vø29ùžRE%…¿ó—í鵦UÓ„l§©MÊ™'i}ëHlfªðá•”í$]Ûæ_ØBÐsÝ"õ“K_þ’ªå>/+Àƒµ[T2~ÓÁ±`ùC CÌsx¥ð§€ ̨`Ü5`Ü:¿òíÂê—á§*T³‚÷à–‰øž¾Voäžf‚êÆ&!ô‘•Aï7ü´Ž‹ŒP‚沃[a%F0¸·.ê3†â&„‰ÊOZY¼B§ë#Sö·Üé›ä®pËàÞp‹Nxxco*´~Ö{ç¿ÍìƒýY6 BÃOcÁ «r€à•ôЭ ßÒYccor½™qDEI0P¿0á.éꃶ©q§oæ¯Ü?¼g]å6M_/#+Ù<Ì&¨Ìxº SÆqOب¯OkÈg³Ãc5ÇÛ>lŠ: Xlª ù¦Pç‰Áhe‹êM‚™´Ð…¨ÍÑx‰¡êù£v“òÎ 3Êøô‰¥yÙA6[Âò0–1Íò™&L¤Ðša†©2 w Œ¦&îŒÞÛh¾M3c:…¹½ýi²ŸœŸLYa'óH:™§Få'uƒ²‹SÖ˜‡C hšI) ›«q4•É̲¨®O±ôô"–»x…-š£ÐQÐFØ•%–Ї#Œ€X,ƒ!Hî÷ ý†aãei,ÄÉq™'Ž>ÂH5peÊ ¨ÉŒaJŸ‰ ¨·:|Æß(©Àô'Á ïÃÙŠQt–ÌÍÅèaxK>^ ѱ7ü°ˆˆåÀ‰¤hnË×+1zÀmê\µÚ¿µ,<ʲ¶¤˜ŒÏ%ìà-ápgÝTÙêž—%Õ&+]Ú¨¿Í©ë CÍ-znêáÜ®ŸÌ:påE…µ®¬3ÇíÄm'«Òb2××SÃ×;oñ²Ãêt\»çª¸ÿà§Ã'Ƈ!•ºë‰2‡T(¼–rÖÀ)ÐZ[ÀÚ½Ï$7TVÎU*-ª€’ä |€JåkañPO5€‡]´±eÂ{ƒzLͪ$…m¶¶Zs"‚¶*'·¹dXÎܬ„/bÍI2IWó½m­ÙV›2ߣ,†óô-ø<’!™ö64bÚèl¹Þ%¬nœ÷Úcõ|ªq‘[ð`˜ nÕgT°ƒiµÍ¶]#¶s„§6+Kä8TTéNÌfªÊ–ÏÃfjÕÌf3—=q¨‹&–‰"‘¬-œ,&Ítb8E×>|Œê‰ÎY,Kß–y(Òáë~”8ˤkŠÔ2xä%.hŸì#QO†uZHW¨î:3|cÿ}£¥‘·íê&Ff©ÂޝŽ+kΣ#ô4¡Ó·#›AÕŽ-Áj#¦(/ædÌÜLk@±&,ifBÌ«…½&ePf®PsÍDw°Žy@y¾d§c¾Ó Âã{öT°-ÐY\.MúŒki{ímOƒY9ÍÀó‰Šÿõ’™¦²³ÝdõÇ®‰ ©ÔTì—ÁrFÚL3Ä)LΫŒBMEV.¡&Ìå îë˜å×!&Q.ýqÎD=^Åš,XÔ·…Ý¢µ`‚º–¬ß:YÓD6C‘|÷ ƒwáä|¯8ê0Rˆ›Ëx¸ ±#-Ùä±-àÇžÓ–¤ü¼h,ÖNuµd‚ÕL¿™@Ìfm†@ñ›X©žéT Lô_"'“á&2³õÒ'Ïð™ÅË®äè/xžŒ‹ª¨°/œØ%1#̇AÈÖíÇØ6]‘ï)ÉÈ5GˆUthc´Ì†gƒŽGnÅ k«"(‘j&d{Kȶî^s­ åwÙ•eûÃ;ëÊlÉ»ÊòÜ” ÖêÒGºؽ„1‹`ó”?+bUé+-âÐ]_“†ÎŽÝcÌŒäÂ^õ0·ªZ„îð$e„1SÍ|Jg×°U-ÿÓw*m?,Ó[Ž@J‘`Œõì¢ ¦¤•qŸÊªÑúùE²žž£®€?Ì3#Eê…vÝÅ+(Â=´‡WaËÚga‚4p[Õõ™\”à ÛƒfSȵz ¦–…yTz)˜àšM¥±z%-¿N2N³w$§í€>˜n‹ñm2Ùë}˜òÇùÀ§eß Ü \ÇA?D Y,ªÇ˜øBÔHœ©l æ£Ú& ™”…©BÇ!K0¬q<9¦•ã Á«(N1c<æ°;^ïx-Ž×ë(ê.+= «½¨ûùdõ®9oUsŽX&\6jwØËä]Ø·—ɯ¿L¾R3°üÉ {1R§µbí}»íK*Ý·â‘+nž±jYMâÈÞ4˵ƒmrܽÕźùØî…pAgÍ^L²þ‰5ûA(¸EôTõ¢æ.{«¤]~¸a½–VI~»ÆÒc"ÑàÒ±~!Á/ëÃX…½ kÖ0báÁ6méäÒ5fË­:“o¹5cÕ|=>X28è‘ЪÙ+צêrI¼iÏ r®³Ç^)DHëÝkFR‰¬f´k®Ñ4ט^ùºî£¥ÑZŽ6æ6"婎ׅõºÏÓzKc½›pã J-fTîŒ@TµREjÉJ{˜BÜë W™âŽxp½ì ðh§ RE³Lµ)_ RÜtó˜ï˜Tš.vÁ˦©þ „ØÜÖÀÂ.Çõ¨?d˜FªùÝud%º£½š¨t̨ÊLÿƒXÍc1@¦ ÃmÀ-QŸöšuYiôBXEH–˜O®—ø<·éÙÜC>‹B>^Xî,x§|K^ÐaÎÔ¡½ìÒÕÅ#záò|I4Áá'%ðóAÇ:Œ·#¦†\&‘TMï[Mo›ï|h³|ˆ€În鋟Á—cú µÈÃ-Ù…§tlF¶ˆÆ²:)ÖòÝ^Á»vÀ@66!ªû:ö†1_a"ÈD„Ÿ‰r),C±åFàus&(íŸ6<Ó"bÞSaÊiȯØ7•3¸I{!™Îä bž&êsi}¶–PSrX9´]†ccŒÅÒþCÄÓªneÌw¶lûsüÚ>Þ¹úÇ©/ÌÈ|®G§ª*sÊÔ¹–úx+Fë$ÒXQÆŽÕHò•÷蓾¤D±¬^é  O]-÷Ýé_w0–|ý=ZÇL•ÈŒííC÷¦ƒròÏqEQn«¸ B9|Á޽=¾‚Wrô ? ÞÓ™ÊëÕ«ohË"ÜùïíŽ ޱš!ð=º&¢¸¨} vªvK:Ñ8BŽÀuºêâ±{0 0c̪-2p ”M1Ž÷êë´1˜Áà{ÞºÝw…s®à½uE“cÌž †_ç´ñºâ1ä÷‰T,ÍV™9uü~ñ*\yªî%ß”Ô;~<üt4¾ endstream endobj 4208 0 obj 6101 endobj 4212 0 obj [214 /XYZ 37.5000000 582.500000 0] endobj 4213 0 obj [214 /XYZ 37.5000000 706.250000 0] endobj 4214 0 obj [214 /XYZ 37.5000000 224 0] endobj 4215 0 obj [214 /XYZ 38.2500000 670.250000 0] endobj 4216 0 obj [214 /XYZ 38.2500000 640.250000 0] endobj 4217 0 obj [214 /XYZ 37.5000000 706.250000 0] endobj 4218 0 obj [214 /XYZ 37.5000000 106.250000 0] endobj 4219 0 obj [214 /XYZ 38.2500000 670.250000 0] endobj 4220 0 obj [214 /XYZ 37.5000000 582.500000 0] endobj 4221 0 obj [214 /XYZ 37.5000000 224 0] endobj 4222 0 obj [214 /XYZ 37.5000000 106.250000 0] endobj 4223 0 obj [214 /XYZ 38.2500000 640.250000 0] endobj 4224 0 obj << /Type /Annot /Subtype /Link /Rect [279 233 331.500000 239.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4225 0 obj << /Type /Annot /Subtype /Link /Rect [152.250000 69.5000000 220.500000 76.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_overriding >> endobj 4211 0 obj << /Type /Page /Parent 2 0 R /Contents 4226 0 R /Resources 4228 0 R /Annots 4229 0 R /MediaBox [0 0 595 842] >> endobj 4228 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 4229 0 obj [ 4224 0 R 4225 0 R ] endobj 4226 0 obj << /Length 4227 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¢ž@À{äÀ°‚‚Ýl‚Åz'‡üýt·¨žiJ_©ùu‘Rk#gd‘¥b½Ywüò÷ý?ÿ»÷ôåßûÝϧ/»ìP—Y÷Ÿýéϯ‘7÷÷}Ý”û¿í¾ï¿ï>ï>ÿ÷û®{áËÓŸûß>ßÿéøß_öýÛñ—?¹túßvµ©?=ÿlksü[vùyúý¿vùÝþ·ÓŠýv˜ëÿÿCžÕu[œÀ˜Øúû®ÿLsþóßÛ½ë¶Kaʲiö¦°ÅÞ´E¾ÿÏ?v?7è—ÏmaL]uvÏFu~ÚÉ4ÇEò6Û—m3ØèüGgyañº®ã-~†\+ÆVF^]ñp«¼l:vUGÑËò1¯LÄÅÏ«cÅ®°ºæáVGavFP^Ô1ðß/ÿ­‰Ç¹äêX鯮y¸mÝ‹åg{Y=úë,¯"ιÊHé.®x²µ)Ûx'û²zŒ“ÍMoñ3ä‘N/®y²ySE<ÙËê1oVf<²9AëdýÅ?‡,‚!é~lýîÞ=›ÂQYí¿þ|„í¼g÷ãë%åþ‡£ýWåfÿõ§ýï³Ì|øÃþë/»öp4z»'9|bøN ß)ÐkÑ“ CWËkø±}ßy†O>Á'oøIžû|„8¨à—BŒ 'Ç`âã@€ž)õ=lŸ¾Ù8:Óðà'YþDØ'‡OÌàj™ ?a†úJø~"|–˜.‰/ŲcT€BÀÈ'a¸Ú’å†ð=„ìd(^ÐmPƒeuBùt4YïOø´ðל-¼ÏüÔ7©µÒœp[oè.Y±Y”¤Œ}LŠW#ô¦ ¹Š'$—¤QA>ibÃFY"ÄjØûxB€éŸÅY6,1×c.Áß“ÐF©OOy )–‰|øÅrƒ±5q|ÊuÆrµX¿3Ö¦1,¹à>9ætB>1ñ'Kx=v0…@ì0ñ e›9Hñ®Uý;lO®®“Jb[Þ!‰±Ç+|7¡7}¶Ùøé⯺òIÐ`ØVÅtÀXc[$4™ß–TÚ•EÿuµvmÀ–yqÞ²1ý–¦Û²94mvÆÂ *ø¤CNq(l—èx×;yþŽu aëö1yÿhHˆuUÞºšSâÆÊ¢jŽ}B{'GP›6ü‰ð¥B¡/½0Ö϶NðU‡Ü4×5‚nŸò`óÆ\¯†±¡v¢w ;ÏZ¬ÔV*²Ž•.Üë4ÞIØžÀ¬Ozø‰û4|¼O‹¶ß÷œ:eß¿À”h?DZ#û嘎1ŒŸ­á܇¡ Z–A×í8ŸäŽ1 .°œvüilô[ð‡÷ÁŸ> bü˜¼á'În¢fLe$KÐl/2¤ŠV½ªÌ/¬ö*elJ`&ß#0 ÃÑcQÅûÉQß•¦ðž€ÔŠÆx¸ÌøŽ.Ý<…†Z­ Èǹ3’ƒ°dûØÉÀÔ¢ø> øéñbáµ a1˜–©Ãô5£oæ¶vó'dÖS(€O¦TU^] d I0C?@‘`ñ]7¶ÍÀÔU^ðÛ6±¬$–“YÁ6Ý. “ Xb<æÔçå©ìžóWU»KÇ;}g]h)â.AÀ¯¶›µ]£ÓøØ†D1öP6ÈcF<ˆp]@lLÙòd´Ö4-ꆷTC;Œt, |l&X;u­öСbägˆƧŽi轆l 8„€k˜DNÁflÞclFÔ‘U^ù:ò±–À„z3L˜;•ËÜçøuìXÅ‚£M þp‡ ³0Ý1ƒÑÁŒù¦¡)„c¹]ÏQ!‚;#[×qL?„Ù?Ly(Ë(±<ŠéQf­õÔ¥®{‚ïÛMÅü9ª¿ƒßº‰ØÀ Aÿt9©!F3ë²ͺìì´ÖØë-Mvè¢Q3ö¤v"-dÁïäøîã2(‹>JúòäÃEJ´öú0ájŽòÆÞy†°ubÝT=)¼|OŽVs¶ê9ÚÇ‘mu°gåql.S3~²-ûn;®²rL1¦ qý,ˆF7§ ËDN\I•ʤ|á€!a®R9ß‚c²Œ}7T©8“(  xUçA D]§Õôb¹ªÍµ™Ú‰eS2_Í`é‰é!UNàÀÛc¢ºÜ™ ÃÐx Nð>°J"²vc'­Mã®%ˆ³ýš•ù)*r+…›BÓ‰µl-üg4k RÞpÇ–Û5ö›)S­‰¡´â›ÇŒHvwû¯ÕÙê¸D•¾‘;Œ­3ø®…ÇUšµ7y$„AD™qŒy…ù ë,š¢tá‚‹#ß01¾{lŒ4" £ˆ…†S^ns™(1ÛuQyÎDö­j ƒè½Ò‘"rÞD@…s‘¯Áæ‚:Óƒª³ÄÊó>6`°I•«ÂØÚøt3¡TÂgÇtÐòÆSf›=¼%Hy£” .ßTKôK‚‰0‚NÕ+QîaÅp !Ôi™íŠR']‹ñ¾™¼–¥ôšUÒçQ^”"SALÕÞ'² #û¥K6ËçËŽÔMyTW‰Ò܇~6ã¬ktêV–­ª-{k‰1.‰CJd5±å±‹·™¬oìµ+|%%YIzÅTÕeéÑãë¨Vß +Sx½é‚‚CÊ›ðwúî«#ïÀ9¹Öu“&FZ¦¸Ï­Vôãp_¾§¯aáñ¬`¡h¬§ ¦ëŽ‹@ó‚Ê&hÑjÂ]F,3v_Üéè”· W{pT¯LÌÌ_0™¨ÆvÉr Õns!DsVlÙxjç1ëhtºœ2™8è©zÑøPíí3Xéº QUZ˜®,J8õDŽîð}‰âÇœò¬oj¸h®›…³MmÊÖ;Ä!3Qƒ“R5±^ð`¿Esк¬`½k'¡Eq/"mÝO¥;à3¸ÙP@=1x5Ümø =)à‹{$7ð ìjŒ!ÀP;6ÃûÄ”‘uéâWyõ]W)>%`þžlZ3MÄLÛpÌzð‰szÆX|L‹LÓ4fÇtivÍÛk¶Ã¤áì07@l çP$ÄHÑLrÚÆƒÉyp jH±–99Låpˆ„Uk¼~]Võ=t‰ÏcŸ#<,+Š…²O 9cãÀãp`‘•wp sަ†ïà}T!( Ò‹Áû¼_—FBÿih9/î eŠþ!…ñMŒžÁû>•À†Ð¨‚BÃ}t9C—–KâJ y“YMê%SÈüÒ.©~~)`¤ï2lŒæ2à ¨Ã:ó=¶1 ôe,B¼Ú¤-“¿Ç­7/j³Ie“>®Yšönz;V¤`Ù¨R’°OBVÚ»"¨‹ÐÃe]mzbÓwê‰ùío [ŽO¿ƒ!HÉ›m‡›YV¸Ô£QEš+S¤_ÁÓ°ZX„‰yíápK`ˆÀ2uviij%0¤fŸ0UËÅ ¾ºÌÓ~苺4%¿´)HèpÖE>Íu[xŒÇoe&ùvs{ÄÞÜž-<ÖsSsƒ‹¸…Ǥ°|‚¯êt¯u/ 7›G‚@79‰‘·óK®””º½'|oSTß8H»%?nvÉÕ;+ Ǧ´KšòžËÍ.Ig—(køE\6õ=i´IµN[\ïs5úíe¤Æ؉(³lUy4ÁLªdÄÓí†M··CJxÑWg—>Þ©Le—™Èô~c,ºyPgeŸt•¬mô:怬¤moaágèŽ$HŽÀý£±ÀMd¬= e³Òçô¥Xc«a›i ¶˜vI›{8œ= (†°µÿÑo¦¹žp2XW`D´Ÿ§ó€ôT;G }Œ˜1½Ìh7 nëã;‡î¼æ8sÅqÝonbUs;«VUã³j Ef éžnu‡éhö¦~‰ûÖ^”AGafHa'B9ÓI{8½ÿm×díë_üºû"¨‹8zæÂ5ñ¦š Ug/7™9 CMÌ…r496ß+ä¾£;ý NX2PQšŽ/«~dÕMÀéOÎôÀ fÇ`Ãà/­á>êI?7õ ƒ:Ñ4«ÚØKP8QXb-“{‹™§{14׬*êÔýd‰ÎŸ”óCØM*·KLÃ|j *ƒ.Lˆª¨Á¼_ß°È -7 YÆÀŽ9i§Å„øˆJs`â– ³aþ¬@œÉ†äùĉÍjp) x·²^õTx„¹c2ƒÑ.C1¦µ"ºžP^ÂFÜ.~˜X¥`@µ¶è)f"W½~5¿8Á˜±&÷4¬` àI‰bùk“ÿ…Å=.ÜÏi4”?°Ck“7«1J.cÌBbŒÃåRfS™¶/7¶¸(¦ Wí°CHmÇ…"0…—(å DIŒn‘´ €KHpßL¸N‡Ïa*„BÏ”E,˜v„Òœ¿Çí?àœ— ?N… ïGB;a%`-ÄÈqÍPIX\!r@#nLm~ê1ãôEÞY½c„?°(!°oÎߨgèakC€H'BLyÈZ{½Ú{¸ž^ÝË.».k¯”#ŽÝRFúí±Ûùó-U½þ?¥ÊN¯˜‰œQ¡oF£/PâiÄǘ® T£K©’Xñ0?º–<ê×Õ%¬ö@SLc6=âÁw“&ü‡‰¼“e¢q¯¹em½í¬-æ~ÁùUCžHto3yÈ bfUuǬMs ŽšFZKr¥¢XK‘sSù´H$§PTÊt!Ü#A`ˆ’j*ÝG7%d»z¼ûêÑ^Fëà«Gƒ/‰pW-|y£Ûo‹¸”ºp®ìºR÷qÉuàkë*šªßWmë¾ùe,.Š`0Í{Øt=GÆ}Âï覅2q\üÆõÀúÞ֛)É_]uò•̦Ò0:˜PQÂ,‘ü²è®œw$j07iéÊ`^©ªDÉGEåh#»£úÞúÁ;}ö ¼ÎÍšÏbV[‹‡Rƒâ78*Lq½eíÏßàˆiÔ@O7êÁ­ð ,l­#4ÐMwÐxhª/ÇØ>°-ÓÊIhpôȧ?è[”©õHgB S*n.s?Y‘;㻪ê}]_!ÄÈ&œså ¬F‰—N¦$Ž6ÎhMæ$3—6kÀyLR[O‡ÍUˆþ»*…F:̦ëµh´“Ù®z¶«½ÄÏ€È ÓÊ[Õ4Zò ug–è*€‰{9gÄ#¶½ïb}?™=®?YX7Ó®­j_aöþñùK®N '+Á'N¾zȤ5atSÆp’îåÏg™=)Œ©~=ãc2eÍÌ¿†¡RJŽÅ&‘“=ÿP¡å^ý%ˆ\]n®Örs˜¨?œr/QB8™ñSB6G>ïØ6,òpÛ0¼5ÌÑÕˆQAL w6J(òx4ë "l ÖÑ) [YøÍ6ÌÞ¸mX–Æ—|ë( gª$u'’©´K!Îà°Æú´¡Šnª‘OœÒª5Y{ìs3}`ú,ðÚ› cb£ž¸}žìç×¶3GÖð⪓ ØÌ±P•kLÛú ¢ï—+Tž±2Uèç{›q¾veq>j|ñÌù˜r°lýsfîþT‡)¡sµa:tF/¬åL3¡@þøgÈ}‰*¶Óñé·¢§§SŸ°vFZé¦SYùú§éÔqÎë´‘'¾«¬×V7M|Û•Æút‘zjù b^õÿì¿÷þ<õn®•>ÇãÎÌ©aŸ{…cDÚj=BV;˜TPtÜ1R[a?ºw\1Ä+â1H?¢}ìT„i ¶g÷¥¨ï ŽÞ>bŽª†è8 â±í0ò¯ßq2Ê}zýB¶,Áþ~„¸‡ü” àw0 ¸nKØ(ÃÆ*Ħ§FØ@€î㜱w00cÊj<6Êçá»úƒE,0øúÁ¸ üÃæœ¨1aOãÏÀ®‡ø‰€b\ù*®ÅòlÙƒ“÷·1¯Á¾pþZóMi½ýçÝÿq^ÑV endstream endobj 4227 0 obj 5149 endobj 4231 0 obj [215 /XYZ 37.5000000 651.500000 0] endobj 4232 0 obj [215 /XYZ 37.5000000 224.750000 0] endobj 4233 0 obj [215 /XYZ 37.5000000 651.500000 0] endobj 4234 0 obj [215 /XYZ 37.5000000 372.500000 0] endobj 4235 0 obj [215 /XYZ 37.5000000 224.750000 0] endobj 4236 0 obj [215 /XYZ 37.5000000 372.500000 0] endobj 4237 0 obj << /Type /Annot /Subtype /Link /Rect [328.500000 659.750000 391.500000 666.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_subclass >> endobj 4238 0 obj << /Type /Annot /Subtype /Link /Rect [279 432.500000 331.500000 439.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4239 0 obj << /Type /Annot /Subtype /Link /Rect [279 233.750000 331.500000 240.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4240 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 203 142.500000 209.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_ctor_dtor >> endobj 4230 0 obj << /Type /Page /Parent 2 0 R /Contents 4241 0 R /Resources 4243 0 R /Annots 4244 0 R /MediaBox [0 0 595 842] >> endobj 4243 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4244 0 obj [ 4237 0 R 4238 0 R 4239 0 R 4240 0 R ] endobj 4241 0 obj << /Length 4242 0 R /Filter /FlateDecode >> stream xœí]Ë®ã¸Ýû+¼(R/ 0ý E€F7EE0“‚é ,òû±-Ùצ|(ñ¸HQ2çbæöXmñU/Vªúáw_þ²ÿû÷?¼ÿòïýOÃï÷_vÅ¡©ŠþŸýéç×·”íaøó¾i«ýOßvß÷ßwŸwŸÿý¾ë¿ðåýŽúß¾Üÿþøï?÷úóñ߇¿tú ßvjŽ¿9ÿîuüSqý}úü»?þjÿ¯Ó/à “¹ÿÿ_—EÛÔçiL ý}wY¦:ÿü÷§í~è7Ào£šJ{e´Ù«Î”ûÿüu÷·ã—ׇÎ(ÕÔ¦)ž¨)O#ÕU·Wew|“Ö£Î?B¯ðò¦Sá^~ž¹ø®(]+÷Û·-ª¦ß Ýò[ôöúûß]‡{ùyæâ»2®ãí’‡ÛÃuU€º¾=Äö·Çƒ½üÑ?Âï|‚O>Â'­ÿ¼Ç8&ö@àP ¢ê:ëDäY6daI¹ÒÆZ„yG2$KÇwJÿïdÆð%Òºi3Æ#…¡gÇë=T)TØ,slpJë:ÆhÅo-[¤Œaãa¾ˆî¶"(k…ØóññÀø%ñ­Æ±çS÷ƒ€ìÞ••Íî˜Ò~´·›f¬ëÐ̙ͿQQv?s‹ÀËð`P¸K¦v¶¸‘:Ø`PÌ å§ÙÈ”P¶{HVÙ½À7_YŠèYé%Lø˜çaŸÞ˜!|Þ2 ¸´Ö^3M|6x£¶¯¨¡)lï1-ƒý-K©Ë&¼íÛåF«‡/ÍxâsKÂWµo >z,’wžº*ÂH½›o¡ŠÒŸ%Ì\os #lqYgà˜uÊ–Î*£O©ú%¡gµî,EºyÛ3s€0©=ßx€ðѺ÷ #Uo¨êËqÌXúØWË,Ê`"ÞZÇ9‰z®–ô㪢*í»¤GtFÖÅNØŠyÎgUJFŠ9ü>NRÙÈ[Üø†ß±`m`­æS £3˜S‡ãD¾èDðܵ&­éèÔ—5ZRz©mRߊ9ŒÉHš€¹{{hùÀ^¸° Œ|å D(6›p WÆóÂPŒ„þ¡ðP£ua*#\þeO1ª8Ôº‹z8¨Œ±.²çjI…T7f£ É>x££šË9.Ãí³üùl$J z›¥XÙ.Y$L$ˆÕÁãØ Ì Ì>˜h Ï"#ç±ÊûžðedùSÈ·:¡[]ñ?åò”5Ç„!¸¢ɈDf¥”‰-êèZcH$hnKgká-["Üyt{™ÌòW`2-¬ó`O¦ƒ¯ Cù…GGò}Gõ4[ÊsàêÖ~xúlTQÛû×Î [ÕCi{y¸ªÇ@ž¼GOp…Ž¿ Öû(ðÜð põ\Õƒ¨8☞5¬‚w'|%]ŒäQ&4¶ƒM˜œ}‘’Ä‹™Ò Œ„T‰õHì.nʆAp¿0U4åîU,ç͉±H¡ñceeȦÄÌÏ=žÌVkìµ¥²„ªl5­™Ž¹ˆœ¯ÚVG²ï#PvÓ³ª»r’à°5>0¿ñ4¯Â ½G=b{ Ÿ@ Á´SÁ·•xwð8x¯1àš›p-æX™æÚF©éuÃ')W!Ýš بBô’xßé‡gôuT¼:ÌMgà3ÁoKD¾˜n£ò%óc2üX·÷ü>\Ô–×øÚòᢛÉÀpÑÕÞñðLÞ˜1`ú‘Ïm ñðhœOÁ/Mªµ÷0¤Uï+È£Òþ±Ó^¤ €2Ï䙘Šh¡¸åÑ#޹ÁÝaB(Â5p^š4ð3Òn90‡ô†¨uÉVmííJ+û[FW¨û!Ô”éË˜ËØ¦´ix[R3½ V@t¤Áá'0¥M]0}j0â•Âõ8f€g Sô®É¡ã$A,3jx¦p=ƒrRæ2¹9çÃÔ»ÄU-áù¨.´¥48˜:s•S)¤R7\¦3CÊ^Vlçô1³ ü$–±8߬pL–èëÄÄìVZ§Ò.#ë:Ê^Ù(–p¿LѰà9  ¬ÊÖV‰ÆÐÅ'ªª²‘ ú¹f°Ñz)Ù¤1#6É@·W]yØ*" MüW±ìay &…õ]k_Ù¶&œ7Z`2lÖ’™-©n‰LY|Ñê5Ž›c¬ž¨Ì¥y…¶¶l”OV´^œau–¬Y²ö$QÆ¢ YÁ*Üš,0vÆÇ)Úk’iC öŠQ‚Ä;\šó;ð.Ÿ† ‹E£À,£¥º@$ã'é^3Ê [±‰V)­6æµ§p¿½‡ïL=}NÝðcñ’8Ì8>.&QƒÎ!d”(EŽÙ”“8Ó¥ ïÅ“hÅ0ÚR—hÔ›ºŒu«`¼Ïóoßc+z@sE‘ø2‰ ˜Û~´_â¡G±¾­üÌè\Œ*Šl,Åq µÙ4g/å@jcÅM™òª"u]ƒkDz)­½¤Jc¦l/'ŒB’ÝkÊt·ùƒÊÝ‘­Ø0ßÜp¼ž°Ë™{§pöªlæ I]—@Êþ//Uµ÷ÕV¶ý"{Tqȯ(_bÑü:åØòEŠ„+ô‡MDaJ¬P½Ê˜˜!K–·«£©¾—É" aC‰¢Q¡øJW•mgk]ÙÓ¿ÍÃNŒhê© ÀTÁsÛ¢ òý©ZP nœé«ôÂ`‹„¥¤\ÖÒXU’*•¾ºxݬu±Ï /8!DßÃøVCä«Óº ¾ÊÞ¥V…íéö¦\…™)N×´Ù.„Љî;Ä œ`šÄô%w¼D–µËc›pó°h…²jlnªÕå€O~NqÆ=1ƒ€bGkcíÔâžó1…4U¿ì΢ØG œQã?kÄ‹Ü4D 08\ Áñ…C c0Öæš×è³xnÊÿœ®… `ÍÇJU×À§@à§”H`¡”ˆ¹QtÖ%<ÙY˵蜖ªè&çãx‚¥!;3Ïâ™8”T¶—»g͵®'ió-–ßL&¦ß)Яf§Ä:,[ÙúÈ’4ªõ¡ ½){>Xî0sÞk,Gñ8ð®–ˆÍÔVOØL–SO¢¬î”_—×þzY;y=ëñ¬Ç³ODËîhÖãqõxù–ļE=Þ^÷4¢×êâX^ËÖNYOŸ‚K›­íNJëæ %j­˜Ïwgmßlû¦.Q6gûbž‹i;TW_þâ±(Yi—»¸f9="§‹ú¶´XRÌ éÐ<åu%V‡ïq²²†‘(“3ˆs&yæL¿A¥ÅµàrØÔ× z¤ðE}¢~™•mà ìQ) ¬\·-Vy›õ¡šuQÙœž°ùøN"à»ÒÚÃÅñβ¿tc/'-EWÑz¨0ºB´Ÿ%˜G¤'šÈ#›KæH*!šëÈ–ë"uìÌ·§FmÏÕÙò$¹>¨—Ûfùú /S·Ó§[˜GÝ}¼b¦(Á2MƒDËí3ç`…-êÊÖPÙÒqÍ`Ù¼y\·¾}lglÄ;°]Ñ«á]6„„,W%–¬:PE½¦›¯&êp OBº@”±¯`¼œªRö QÛ‡‡³Uå5—<œ-0 °´Ö°5Üuî–èKÖ¥®-šˆVï6î„#—ø—ÁWÉ–mUS¬ 7Ò!ç2æ\ÆÄ-òì¡8(mÛ±|àc…7vêâHŽG;BËÍ@¥®Ä‰FÝ *FlÄLÙ¶g'È1ÓÐÖ6»¨ö¢Öã Ez<Â_ë³ »ÎÖ™ÙòqÍ MËG)=RÐ8Ú¾S,ïèu˜.ømóÝr8 éĬªÎ>Ü‘ŠÈ>Ü,šW%šuÝØÜ,RYŽhJ¹Lx‰¸ .-f0¾+®‰[P‚ãP øa?¦#@Æè*ì ƒã”8äžkä‰[t[ ÕR ŒÅCµ²   8a.]i&çó:0憶<˜esñÐ,ñãIüHÒ›±±ïÛÇøýGª}5 §ë.xŠ޼'aбnÊŒÏ}pu£á2d½BynØ5ÏT˜Å±žT’»ÂÊ]T6§'¬()gwp÷´îJkÏèŒ(®{ÑÙ)Í)O æ5ÕTc0 ˜*rû™!o9NÝq\ÿÉ,VUóYµ®[›UÏÍ>‘Uf.2uÍBv*+ðª z Sc ;Ê™NºÃéûßvmÑÝ~ðËî‹C]„Ñ3§)Üo¬šw]qÍc\iÍ;<®÷†Ñj—+õ¸¬R7Ð>6¯ý ¸ª æK¸Ò Ç~Šï(®ºkë9vWÝÃuòð¼Ò}g€´/¢Éz·DW4×ã’«G˜™è…­cä‘ñ$ƒöÕ.Cš²µºùÞ¥m¦uú‘eNÓƒJ/ëêöƒ“Jë§î™59{ÇÚ‹“7ÄØ›ÛÞÑ…±¶-C•(8Á´beÚ¯·C–Å~3I‘Î`‘º9åVW” c«Y_í |Ç8/ a2•-U‚ëum:{ÌìNÚ¾;iþ}Œªg©ƒ·pç$Â_Ã̯”qñG ²‰6JJàF–Ž„ò˜ã:Ø2ý¿‚k¾ö0zʆ—…-ø4e85¬G‹º¨{°¡DNC¿ŽòXL}»ÅÒnDÓTͰô\üÑ(„ò2õ0ƒâ™NM‹íŸ=DZ{Àƒ÷™,¬U5Ôâ›^_]j[I.c7…÷å)—ø:w ÊœÁè0…)[MtylÑbä²O&þa3·ó­îùVü` ¤l¶zÍê&pøÏaç‰zÀ˜‚OÆåî6†XUQ錇KಷROe,{NÖ•½•r]ÝØºqy’X@Ñã»ËÈlΪÊ7ˆtl£nJ‹Ñá‹xÐ#xÃt3M²tQƒN®>ÁÔF5Óí…‡5i¤HE¿(ž%z’¬ºúIànŽº¶bÍEÌBbî”¶v*a‹'Zß*QCjU#8ë΢¸Ü_bCý%º²¬ï7â㱡,tô/XevÙ*àTÕx¢W„c=xG‰ZÒÔiÇ«hß•¦šœÏ:érÕµÇãœ}ýL7ÜÑÄÁu¸£ ÑÁÑ9;Óeºôªb±†|W¶úZÆ»¸ÊN;ŒNNãuq½éŠy›fŒj¦é<–­ç°?VIW±ú á~8ŒTKÃ:ÓU7M/Ù:Û¤u¦›kよ’Ш˭7宊LGÜ[ÌÑèĸ5ùÍt’Ëwî|V-›2YÍkô3~\wbyúß\MŒÌÏ ðs,Œ»Üe:ˆH=¦ºx)oíàãÏþûñõÎÑ?Oý…Á¿D›G9îËþÚvh0ñ(@Ûïpó ÀÕs@yé“0¢ÌzüdØ…ò0 bnN²ŸÁ£xà4Žž‚e<šÛ§a¥¨'޹›·)p²jXúhA>z=îIbÐ2~üΫT^KoÞÈ–%¸ÓŸ3¾Ìü#‹!üLC{ ŒFx´wxWqÏH%ƒ@{ÀŽÀqDÆ£ïà=ÀŒ)«µØÀAP6Ç8Öõ1¤ÆçÝ0û¡óÈœ'xnCrÎ#aO¯ n‡·JÛÂd,Ï6…> ò~ó* ªn5ß”ÖÛÞý‰ID endstream endobj 4242 0 obj 6510 endobj 4246 0 obj [216 /XYZ 37.5000000 314.750000 0] endobj 4247 0 obj [216 /XYZ 37.5000000 314.750000 0] endobj 4248 0 obj [216 /XYZ 37.5000000 627.500000 0] endobj 4249 0 obj [216 /XYZ 37.5000000 627.500000 0] endobj 4250 0 obj << /Type /Annot /Subtype /Link /Rect [279 665.750000 331.500000 672.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4251 0 obj << /Type /Annot /Subtype /Link /Rect [116.250000 605.750000 203.250000 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory >> endobj 4252 0 obj << /Type /Annot /Subtype /Link /Rect [111 323 196.500000 329.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory >> endobj 4245 0 obj << /Type /Page /Parent 2 0 R /Contents 4253 0 R /Resources 4255 0 R /Annots 4256 0 R /MediaBox [0 0 595 842] >> endobj 4255 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4256 0 obj [ 4250 0 R 4251 0 R 4252 0 R ] endobj 4253 0 obj << /Length 4254 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤žÀ"€íñÈ!€a99»Ù‹ÝEœ=äï§{$õÌPý•¤¯‹Ôc#gd‰d±ê««ŠïþôåÇý~|÷ñËŽ?t??~9d§ªÈÚÿ/¾{ù [Ÿº¿«º8þðëáÛñÛáóáóù¿Ú¾|üËùoÿ;ÚãŸÏÿýùø·¿Ÿùc÷.ÿà×CeªóÏ_ž~6•9ÿ-»þ¼üþ߇¿þáøÛå‹ýpÝd^ÿÿïlÖT®¼Lcdèo‡~™æéÏï?üvx×`Þ(¹iòÊMîòãù¯öøß~:Ð>;5¹1U™WÙ=‡8dw4¶ÉŽE™zú£óyàãUQ†ûøÓÌÕ©b\iä¯knnS7-¬­èúy}úÛÌš€›û4suªô›‹¿®·¹gõÔ¿Œ€þ!7·ÌCrÎùµ©Òn®ôuÍÍ­³7]‚FÏß×ÿ¸5U¸·3×'K¿½ÃÏžó<Ñzø&¼øáëáÝ£ÉÍ™œåñëOçÙ=Ùþøz&Kqüî :EV¿þxü>Ë̇?¿þ|hN¥-ú)¶O,|bjøNßÉÑçà;p®DO²÷ð œ5ž›­æÏ-#ž˜¾ó >ù¿)Šgà 0uŒOk‡WºMºÁwŠ:<ÎÃÓ“O_Ïr·t°|c|’¸Oä¾QgTÎâHSiÇ‘>(ÿ@| ËÄrüµÎ@àX¬…±ìEx‰ßY³tëFºtO ÞNtìŽøtI¯LÙ“ÎŽ°ÉÄrìNÃFâãÈŒëOnôtr†Ì³vȺw®aͪ,ž¨à´>ÕMöúIGÐ[OÚËO¹kÓýžŸ´¤®ŸQ¢˜66jÜÉÙÚœùˆyë–ËÜ©È˺š8ÙN–Y |Ǽ÷–nð?´ôÜÁeàpœ ’ËßuŠ«ÆoÁÃÉd1ÝìkeÐr˜rØ…Qžø¤¹dµ=ÔYóò¿¾ËkEÌ{™Âkæ5Ä–¾‡O¨£ƒPÞ·8«KÌ­Uô:q’²Ú™¤mÊéZž\x=3a`ú0Ýîà]í°n’Éj?"²éÃÄ€Ž1ÅÀ3À=À>Ìõm9ˆ&1G c ¼ŽÀâ]ȯζØt„9¤ðu±âç]\¬ö‰1=dßgÅø¢&|+ÝðìtÃjƒ‘;[5ÞV'âsE9Y(ºÙÛ?z~¢vÆ7аÍEXpùC§,ËÊx‚D/( ,EL.a=L°¦Å1W @Ë[åLt“™KŒY(“ výdXà.M–Öæ-­ª¬¦+•di]38¯nð“µ.Í:è;]œ£Ž2ìÅÊXGåL¨6V¦‰´Ã\Œ“°á0ÝeŠÊ2™ÙþY6”UÕÓAž9dâаÆX$Àã€UãÒÝœ5æÍP¬!¬Ú8AB»èH¦ëHÐz¨tÌÆóíâ%c­2i”Á48—N]´ù†ÀhI;&ï->_à·ž%&œü ”-sîÆHðŒlfÅx²8àŠý3lË~ ÃâE=Ði˜˜ˆD]+sU7áR q P `mÍ Y£ ÁÏ•“•“î‘õ6“³(\óS°¨s»é*•ÒƒÏãì÷²ûH6ý1¼ jšÚcdA½bL¿CRáÉ5û/PÜ™"A…3)ç8 SgóënËRõ–˃/S•¤\ꀕ0Ù¾‹U\ç=Àåð¬Fð̈|tÝaãSw-¶BÈè]Ñx;?7æœÀ.–ýËû8 êGSˆ}Ð\æes–¡Zذ’W:Ö1µ'ß©5w!0[ô!ì|Ü÷ *aÙª¨ÔUk{LZ6Ó™”©™· ¾Ïœc ]SN55lw9ËL¢³?K™}M%¸ f‰#0ÕŒ<3•3*Ý ~f¿öã_eÎy«r´Iqt¬8öÒÉÊÖâc@Bº)M¤"¡aÅ|FJ· Ñb>ÂܺhPÖ×=?ig`ŠSָ׈ŠÛIDHæh‘¢¼ºj8JNĨ•yŸQûª–Ð ËÖ¨´µÏ›Ìë2ïÜ©"„¾Ó™)Zï4è®3ç­PîãH˜üdýZž‹†áì–‹Êþ•³þ0Öx‚\fpnس‚ïPÔïs3!ulÈÃ\»žáqœ4h‚ fc|É„|t½å¥Ì¢.¦³¿6`剹ÎÚ>•â'䢋ᢠ[\ùÉz¼ÀðÍ[ yŽÈ¨ö·zŸ2ÙhÌY>ª¹¡Û<ê0i›®E¸ÄÂØ}­+|±Û—©ê:`£À %žÑ7 tƼüÅ¥Q`˜=¸ ôz¨raÕ •Úf*Ð6¦áæaGˆäq^òXç¬ÜÊÊç¥ØM'󮸿¹ë\Žq¥±`Ïá2ÜÆa…Å)˜˜ðþ"")‰éï2åÿ¶DÞe§èžÛ1å‡ ÅTõÀOÀªFЏ å˜ÕñFL?¦²§[YБDW«åûÈSðO¬t´`ØD”¦t·õù­Zâ‚9¡WÖàk*qZ ¾ŠÉׂ³RaðUz˜:8á¦öàq,üÚè%óa»Þ–“MF•^àŒ°Q€Ãׄ¤·µ¾#H¥F0¾¡7l¥ ])Û– åE©ÄÒJ8fú÷ñC„Ðm 3éçç+NX›á¨ ]Ûé®Ìšë×’Ë9‰æš.gè&UÓ“ìtPô'hÛäÚƒ*ư˜ãWneÖÜâpq ½£WȆ²:¥ ˆÊz2”ª @•AÞø†Ñâj'¬§œàßÉ?E`ô§–rö< ûz>·x|7¾ºöø–pávtª !Ì*{Þ!n¡fjšpPÆáP0ÊÌü]À·«ã¶7ׂᕮq7Ýhž4ªÎiugíÔôÞìÌÍè|„'íìL2HfâpRy¥ˆZòù„Q›ñ‹ˆ˜ÃLSÌ¿©|]šƒï8yöFuhcª;´@y|숿†åŒÐ©œA²Ø“žvDÙ´õ1íÖ“ˆ¶ƒqåjl_]´ÓµDpÿŸ°v„ã0œ$È&–™$éñ$°…°µÀXŠÞøDWêq•`a¨âÁ(­ãàmQD¶.…Ô5UôföDYèr9iÔFL*ž`Áa­‡wc^)æDÆc`0'*Âsa¥D¯3±Ö#VºS¼½ñ¤p‘¸ÊïAbì‘=‰³ºÆ©{bfÍl ¢hª%3Ó UµgS)¥|G|'V»zå:2•Æ\1’O¬µ¾D¤ª‡Tõ  ¹¦¸ÍaAÇlü1‰Â@QTÒ(л'‰)R£¿7\—A•¬2EŽ»¾¼©0G2å%ª’ÃÉ7§0 d®ºb.o_séÙÒ×HÏu^²¶îÒ®ÌÓ°K'’/߆8g¾‚†Õí‚®r7ðú,”ý×iÁ¯až[B€g,PH§ßjCÝg<ã&W¢H9PÅKMà[fº]ª…m&Py”Zs- …÷þÔˆÞcL«¬=]É&Å÷ ³!Út:EÈ2Ûºœ,ìû2TB óÚ'ꦭ ‹c"ÖYpªB°Õf“i¹µLÑÿ¬”Ã;ù„Ò”H„s¸³S—¥zÅßèu²a™Êä…·ÅÉRqyŸ–bÈÊMWßæ°`W¾ë¶˜Qld8¯õ^F$ØÜUø%éÊÓeΖ7µ±© ã'ø8Vg ¸CÞŒj¦Ã Õpvz•³`ˆ`0Yªé ¶?„ÉÎ(ÖfêBu;ХÈEؽŒ}=£µ(Õ¢L·3Ôöô]SøúnÓG-!ûeÎL·P×£¶„xB™;ü<ÕÆ%’º¡Êö {„iÄ1Ú3|ówØŠÒ.3šPcÎ'äH`@¬ÖpG¾ø_•™ñEÇj‘¢+©cƒj–£®m%Ãd§²2—ÅÝEÃ9­êb™‚ºV\0»ë厚W;Úþf+˜é¬`­ñX¡s–éwü)z£ËuËžðdÅ­™¾Þºû9¢˜žXŒ™€—Á…׈WøkyÞ yþºOœkO—÷Ï:ã<ò‹_ürø"d µUøz+B·¼Î£z1¦/ŒöÈ'ÓC[°¸ˆVdŒ‹ÌD!„³¯Hçrs¢û!ú˜…”HI:ÜK‡{*˜X[w›Ã‚û˜öÑ—O¬éàçíGdƒQ¡ ¢y%ÁŒ‘2ûÇYߥ¡‚13¬GÌø XCÙÕ¾Z"N܇ÎôÈíë!ç‘¥"¾Óqá¼w°×Ö@¨¡Œö*kŒÔA¯ÉOÖxé6½Ó1Ú-ê<ŽXä·Œø^©}„ëÁ+…Olè& X+†eO¶H{xžxnMx±(=¹ÀtwL%ažè€Û–ó4F;µ½‹4ÖýV9˜K¨Û°wx¦ÂtÄÖ½`qÊ¿ö‰ê™NXeÔÑFˆŽÛ/¦èºï¿ˆ'Ø/yBëz£óJ©5‡;1¦ìÐÍQ™ NGŒ떘驟1;V××qºõÿ›õyõ!8ÄÔ%ÕcB’#¦5ÑaW¨ bº¨VÅãäŸmòèÞê½(ŽÇ\…¦xØçŒéÁ&ô¢ÜY—U]´dº¥0õoB¦;j¿Š{U{¢d1-Œ¢ba=1¦1úÐü ÇRu¦X6‰2 Ó˜ã.æÀMùžLëMbôÛ±ðzŒf¬¢_*ÕëŠz希ÛY74ÆëVÊôÄH«ëZˆd‡8Ƶ߼²…ÁHc{àwªˆT¼ö_þÆž5ëÚXÑ#ÊJ"8V°ŸT-ÅutÓoîê/½f¾Ü´ gïïêœ:W½A¾¼5ë±;Sâðr1cñLÅMÞÅäî›8ûxí£±×¦É®Ñ”-fìß0q_Æ2Ç}Ꙉ0ÑDzè ]î÷=kìu0´&â7Ê·Á¹á•R'8Œí<Sذü­Cé,ywXĨˆÉ®Ý(—мÄOwÄŽòe^ŒóKB«=Æ1LVöñî˜>à Gq(Ö­®ËwyÎ…ˆ£–—:ʃNQ´„ФU¾y8¢æ5öž(ò𛲦;%“<ëËs,,ÜÙ–ø`÷z“_GiWý=Uº±ó\7s=ýp‘‡G9™ó!ÎT 19ÊLl–¡(æ&–óv8>Õ¯¥úµd׌ñÌÁ4aNç C"apò‰yŒÁNB¿gº¹Ùª¶!s÷îµ,­™º%7„&L78k|j(пÃX§ËW©éÚ“ºgªõ›BÝÑð@h?‰ÇÁej, Žª/uñ€ç(v„5az{` FQ£ƒª¯[ÉEc1ž½®õOPG·.ŸÊØcübÖo§§ƒpý#ŒÍ¦ÛÏ –>ÜYìto^z.3qtµ Ô%cg ¹V|0z‡c‹> -僥|°'ЦJ´0•hódñ”Ü6×V¦ºúL÷ìkñœþåO:OV@.¦'ÖâgÇÌÎí-[NˆÛí¬‡Á´&dŽŠ8©FAtã0ËK£²M°x·Ò;¬’(úÝï~%ý¾M¿kÍú]°;uÏI"UODz²buó¼yÂÒ¤¬øÃ!Fã•“`»vScQ|?yC˜HØ8Û×Û?ÝÝ3!÷;ŽMPÖ£3eDC¡X~á1½E©œ÷Å•¢Æ êê™ar’=(òX°žmç?Çog–9êóØ?˜pp}ó`ãNç-9Ïðhó×òTôWu0¥ºq•l«Oìûí[N¸qó}—dOÝ-å/(×ÎàÖÍ»hœ.c ßô~knÝJ¥gø®ù6¾—?O)ƒ“5ÝÒ ìàÖç+ø$GË0økðNyšYK€,Ã]þ~žq?óOh,†ð;˜\™³ ¦*¤æ’@nˆ08Ž­á;˜˜ƒ1gÕž åKŒ°®$ ~çC7û²2¯á ?Ás³!XÀÄôëÒ g=H QãåuX¬ÌV™;ux?Mx ¼Àü¥ß1ªÔ>?þs èê endstream endobj 4254 0 obj 5269 endobj 4258 0 obj [217 /XYZ 38.2500000 286.250000 0] endobj 4259 0 obj [217 /XYZ 38.2500000 286.250000 0] endobj 4260 0 obj << /Type /Annot /Subtype /Link /Rect [196.500000 293.750000 272.250000 300.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/tree/master/Examples/go/director) >> >> endobj 4257 0 obj << /Type /Page /Parent 2 0 R /Contents 4261 0 R /Resources 4263 0 R /Annots 4264 0 R /MediaBox [0 0 595 842] >> endobj 4263 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4264 0 obj [ 4260 0 R ] endobj 4261 0 obj << /Length 4262 0 R /Filter /FlateDecode >> stream xœí]ÏÝ8r¾÷_ñΦG$E‰ Œíq€6CC0›ÙÅ¢½Xgù÷£'Qz$Åj•J|zÝZcÇz”Å*~õƒÅR‘úù_¿þ÷å/ÿ¼üüñë?.¿»¿?~}ªž[] ÿ»\ÿüä7Hóì®/­Ñ—ß¿?ý¸üxúòô¥ûï§á¯ÿ½»ú¿‹¼ü[÷ÿ¿]þó¿ºÆ?»týߟZÑv¿ôÛVtWÕô÷µý¯Oÿñ/—¿_{É9fÂß?IQµU{ecô§q˜¢ÿóÏßÿþôóÀ:*µµ¨/¢VÝl-/ÿû?OtÆî«g[ Ñ6u[m!ÔÊŽRe*uÒv=©œ˜Rÿ‡©þÎ¥h÷ë|àœ¡±Ð=£|»ÿ5DºÝASï{HW¹cçWιAq²ÅsJV)=À#ë=D;u¿úÚˆý:ï9gGe”-îS¸ÍÕ÷ïf¶Sï{Àß\ûÝ­ó+ç{™-ì¼{PئjM ¯}Ò²‹\:ïþÝ]8²]Ì!äô#j¯û'^ÆG¯áÉ}ÑJ]ÛŽ¼éO”Ub$Ó³c•tôü+qc%ýlÌ,¢âµ3⑆ý»ßžÂe Œd¶I@Âfí Èo×c£<ñzÚ(.yi…Ns%ÇÄíB{ÜÈð÷ÞõLÄD¯¿÷†(’Ë÷ aŽ‘Ov&Ò- Y‚ÓÿÖ½ÖÊÛÕM=>ÂG·Áa}™èŸ‰yƒö¹JõÄÒ @Ìá„lÐ÷áj%ŸðMº\Ö-’#ÓjÓ*ë·ÛáÁ—¸§íîGšˆ))àÈÎ;Ëï/vCÅ';QëåÇCôÐÓ,¡Ò3¤·Õ¤zp†‹H3£†›N·Îˆ6ƒc™8>üÑûdq{dë›u'€%FLÅÆªÂK„¾ó-kqéÙ˜ ’˦¤½±ç·«ØÓ¨I«í‹tOÛN]¥¹ª…câvQyÜÈð÷ÞõLÄD{ï Q$—Ð Í1òÉÎDºÕÀ|p®¿ÕäwÔLÃ=>ÂGùܯ9W=>ó†Êç*Õ?Hƒh1 4†²Q@Î'-£ä¾I—ËÂj›–L«¬ßn‡_âž¶»­"v´ ÉÎ;Ë×›“9T|²µ^~ì0¤A=Í*=Hz[Mªg¸ˆ43j¸é´tF´ÈÄñ¡Uš,nl}³î°ˆ©ØXUX`‰Ðw¾e-.µL ’˦4È]è8¿£ÇüŽÉ ͘ßiUš«¶vLÜ."ÐîCõLÄD{ï Q$—Ð Í1Ò ¿£9ò;:J]è)¿£ãüŽŽ’\pøÖëkΕF‚Ïļ8.MJ4ˆ³@c8!ä|Ò2J:ÎïlVžÀ’tlZ:­²~»|‰{Úî~L±cšìü·³üþb7T|²µ^~ì0¤A=Í*m<‡´Œ)Óœá"Ǫ̀á¦ÓÚÑfpl LJ?zŸ,nl}³î°ˆ©ØXUX`‰Ðw¾e-.­N ’˦Œ—~ ÚM¤«}ƒ žx=mw8Ö¤¹²Ö1q»ˆR¼þï½1Ꙉ‰ö"Þ¢H.¡šcdÀËÑ@õÁé›Q]Ç«›†û/#¾õúšs¥Ñƒà31o‰_.MJ4ˆ³@c8!ä|Ò2J&~k°Yy<Ã0±iu I• ÚíðàKÜÓf÷c„ˆØ"$;ÿ=Xþp±*>Ù‰Úõ‚†4è§YD%+½&eF[ :ɉԌF´ÈÄñáÞ'‹ÛC[ß®;,0b*6VX"ôß²—´ ¹lJxé§ ]EºÚ7Øà‰ÐÓv‡#Óù#]Ê»S+Áï½1’u‚h/â!Šäz¡9F>Ù™H·˜Nÿ[ê:^Ý4Ü!øàð­W†ùŸ‰yC:µÂ¦I)d!fÆpB6 Èù¤e”|Â7érY˜Ô±i¥ó;A»|‰{Úî~T”ßéB²óßÎòc~gŽŠ ó;7²ü0¤A=Í*Rg¤·Õ¤¤m)ÊïÄ 7v‰ŒíàØ@&Ž•ÎWdÚ#[߬;,*ß™“åƒ%Bßù–µ¸H$—M©tî¨(¿34Øà‰ÐÓv‡S§ó;¦v) ï"L­¿÷ƨ¶ ¢½ˆw†(’Kè…æ©t~géVSaêbètPtkx˜¬`ƒÃ·Þ:Ìï øLÌÒ©6MJTÛ 1 4†²Q@Î'-£¤¢üÎvåñ CǦ¥A~Ço·Ãƒ/qOÛÝOçwš(s1ÿí,¿áÌïÌPñÉNÔ®ü0¤A=Í*:'½­&¥G[ò;é‰TF´ÈÄñáÞ'‹Û#[߬;,0b*6VX"ôoY‹‹N ’˦»hâüN3æw¼h˜–ž×‘š¨`°kMiþÛY¾á\v"pL”Ï™¨ïM$Ðý,aä31“ìV;k¢ F3¥yš8ÍÓD9 .pl !LJIWÅeÚ#w°Y¡RèΙQß «Q2Î'­EÉgã&d.³3éz9câ|Ñ£ª§ æ‚ö­>ɦ÷Œë¶AzávÍà÷ÞÙ&A´ñÎEr ]Ó#“®)DºÕÜLX.7t:(ºŽ5<,cƒÃ7bî@ð™˜7¤·k²iR $'~{A6 Èù¤e”LTS¸]yKjcÓi¿Ý¾Ä=mv?¶ŠöŒv ÙÄïÁò‡‹½P ÈNÔzù±Ã=ð4K¨ L ém5)ÛŽ¶g¢†›N»Í‘ÛÁ±L>‚Ñ{d3í¡­o×–P1« ,úƒoY‹ËÀÆLL6e«ô~H+"O34Øà‰ÐÓv‡£bvT˜kJüv.€s+ǧ>íe»36‘@B÷³„‘ÏÄL²í,€êú[Œîgºº)z¸’ HÈñáƒà3Û#ÿÀ±±v†N š˜˜ŠÃ‰Õ(ç“Ö¢ä³qò•¡/kN‡š¸Ÿ1•=òGæÁßž~þ,êŽÑ\¾ýqý¿øiøëÛ÷§V_~ºž)ÍåÛŸ/¿T•¨ÿtùö·'ûÜH=²¸t§ÒëïdèHxç·ßà3íú;•…w ×™gðxÌúñTŸ×£#yyÃw0:!oƒ טì s@Ñ*Ü[õëú‘VŸ o A>øL±…éàñ@~†r‡‚”)¶zÞ°´¡ä0Ž”×J(z€Gй®ÔzÉeüÁ+ã;Žëß¾uáÃî3Ýfæ'Í¿Žu Ç?ˆé0ë?Æ1üFFÿq4WÈseè@t(>:3óã;УP¢Sæùƒ{të(ŽÃ ã¡xo n™hŽ5úáµ,íª-85ÍhŸÊQÕU=âƒ×„õÖ¸LL‹ãÊ*k)¶­R^‘ò eå‡g ‚¿Tï{¯ˆsx¤8¶Ãšˆ¹Æ½V 5¼ƒ×„¼Ù Ì5%;¡±7¯|°ß¡ðÆŒ5ö£˜a½ª>œs¤:̺«Æú‚u™°‚)•·;=WÖšx=/Ö¬Ñ;%÷BÊ„Z¯f4cÀ»æ8ðš°ÔLyúƒ,¬;…äSr½ªk¹e'Ì¡™\7%Jðv5ެkWøŒ&HáŒ~²ò9½]±è‡7÷Sá™s¥àVe¼j#Fª%³€Ö.âsfÏ,`Á™1ƒïü¾´~/ãÓÔ¦·æ¼>í´Àó=Ç/çZoAK­õ(;qX÷ì•Ú»œ)ënýL}έb¶Ì~gÖ52émÆ ¿‹ œÀÀûn…wOX¡ Žë2q„‹c(GPÞÅaƒ¶É\_Æ{J^5QlÏF;c=7EA¿+)µ‰IÝa­Ñ¦øNæ½±˜ž]Kyüó|£ó|£×è[™¹]–I±ù<£éíåKßæI?\ëœ#Ÿ’CÉ}>îÊÄØÅ1œΜVœΜ¥ŸÎ:‡Îp9†,¸sÒT›*ŸYwÁà©’ aMXžžøôħ'ÞÃ+lskëÜrÊ&e¿f)oÇ[©îÅ>-lé¬{fKîw6u³hg¼±ïÞðŒw xfoÇ»“‚`X—ô™\!‚éðž·Ä{ò)ï¯8Ó–)o}åŒ&V+ÁVŸY°Ú6ÅWiUЛ-»¶H2ÁykJ^´ÐJ6Sãz÷¸†´£ß9#¸œÆks%W~¶:ÎþCïÝa­¤ ½WÃV[¶vnÓ?å8(•Õ'UÔ8oAz›ˆý-å{C¼o](gÇÚŸ9ƒ²â.ô•‹ÅºŽ2³«<ÐN"ʺ˜bµx¦d­Û?r LfýA©g)»ÇnwpÆ´Uà9äFJÊGàìåt:ÊùçØ»ðήXã)õ”>#K¡äw m}œ½?¼§¢‘fþR5È…Î`,5ƒ‘ò˜”¯JàÞÚÌX³¾kÊdxxÏ¡!¼;Ëðv÷ïgdö*,(õ‡¹G•â{)§zdrL…â<ÒZäàuò¶ÙâJíà¥èi¿%o޵‚R™EùÒež¢dp¦[ÁžIµÛ¼ûµ1¢„ú8Êù»™u!—•)åܰ=²•\±a¡Ó§28B§äx£Æs—yáù½=Î>8\[Ì{Š+%óŽ2©ØÒ ;62V‹%Çšó*uª`)MdÞÛKÑÂÉX¼g.>htÊ›¹gݯÍ[Lª/¥ zä,äQ¼™8ÂnÚ-Ê›'8ðÞ :;#Ì$_sžaD[Rê=³+ó©‚Ø£VϤsêÌ»JÇV_ê´ÌûÇ Ì6WîìÙwœÙèÌZŸYë_r»_KíJR„™å­å=2z}wû˜Ù§·¶‡ à¾rÙA´ežzȯ‹îâíÊHKßß,¸?MVvܟƼSž0»¹&Žô%ÞŠ Ê/yOߤx„B§a o}Fâg$NÔ··–¡/¹bÚFÈ·ð~·ú|ÇœµÍB_ÁæßÏê•ôõðro¤P[ö|0¯ Εþ¹ÒÏG<ÐK愞¨²­*- YW=Én%B ij®ÓêlæÙتÇçvg§~®U«Cu«à3ƒàô³’F„wZø äÀ¹Ô3oNÍ+†‘av°'5¢õša8[_Ŭ‚@º“ÌkF èŒeæE>R"++èý!oþù0#ÝÑÿ¨º‰ä‹ÕW š.Ôh†›\SFå¡}’Ü ö±ª+7ÉHm7(m©›ò‚Šw<Ç47m+1ž}X^¤môkµ93«amVñlƒš«“PêlÈ”)x6Ãc,pÐñ–¦Sad¤8‡™dRÖOù@ÛÑ£Èödc# W˜‹Ë]%”5£ú35ž5à9ÒËØ¼#?ï 4à9½%óá2ÓcNÚª1!ëë²é„ýy¤{oÓ¥¬ËôSÞÞC:¼µ‡¼ûN,í‡ÎO•ñ(f¬‹,™®«fÙê0¦„ýÌ÷?©*˜A¬¥^´ÛŒE¿±/S,zQŽëîðú”BûÅ™—òK¹õu¼•ôVõ¦/ ¼›:¾êŽº4ì ß¡pùbë™gÌ“ãš÷ øÎý=—²ýS³å{%+Wuµ¥àŒKθ„ß_>n\¢å>ÑÇ—pÇ%Ì3<OÁYG«-çu´ ©îŠÜÂ+»FŒ“õùÊî¼²[W0tVQUTsf÷u„J™ÈùyËûŽæþëÇc–hWYwÓ‰4›ˆæYÓÅè4M»hB¼íý«½ „ß?¨l§oj)T28;•¸X„àH|} J ÏføQxÄ…:>s¯:™ aþu‚Å´lE­î„°tÁ±+…ÙŒ‚PôGé„Ù•™e}ê9nß3‹À3-¯réb…K¯MäÓÝÉ•¢znZnÉ SèçʪP…ò¦_!Ç[ñTš’ˆEÑBcÏ“¡2ÓÖAì&)‰‚ÙÜg>B&IEŸT\ÌUüª©½¢vãêžÿþÔt2õ^ž¾fâš}¢+ ¡õ¶L£¹›.H6ÉÎ\†l&ÔÖÉC‚làªg¤…ÏXHç×Ñ>÷î|F½¹×Qͳ22 9pèˆg9-gŽ ÞœïHÐÉŒg° Q±ðÌÎ9À½I ¹&‹öYͼ—‚¼ Ö'šÑ0_ñ Æ?ãl9%(ÓŠ- ¦­b‹cs/‰|b‰,ŽmD &c2Ú‚å[ÁÞàQêµ…©&•*´Â$E¨xwa„ü8Áo….”¯Î¼€ˆâuïr‡²ŸcÍË‚ëÇB/u(k ¬Å™@™"A $·ÙÛ¡“€Ä+ ^#`Þ ™iÆUáðž/ˈòSE® /W2ÏŒZ5["Â;5ˬNpopùšAôÓ‚qìùÊCÖ(KžíÀ³ e®%Íö5ÅN‰•ƒù;hJ*Ž1Iïâ$D¦Vc>à|ÆìáV¤Ã)ÃX‘=b Î)µK™:7Jby \ØXX‹˜îmÈ;ΖֶÑl™‘Ùlæ[±ƒžUã21#ž¼>¼ž{J¡ÛC„,~š5á›Î‰ 妎fûr0ôÄÏÈaŠï¸Ä^l%Ü®K­¥V­cÍö¼4õóÞà SG莉ÜD”ðòùpxÀœS¶f: {DÂë,Áv\>À$ЇÁ(K˜3Ë£K ?1¾¦vi=´?àVL‡ÂÍ&p<±Rb-Þ’èÇÒeB¾,“|ÝÿðR§&õô¥IJ€ªÖ~ª5ÍáæxŒ@ÚA)1ά|ÙYÅmH¬VîÞ~§‚&]FZªšN“yûöÿFÔñu2{sŠªl°„pÎç§~?vH9LúòAr£&M“#é¼Ì¥—É%D°Óôî|cÊkŠBÂïgzTí{•ˆÞœ^ª]ÆûPŽHã êñ~¢“GÓ¾QB­~ÐLæ3¥ÔߑߕÕD¿é'4“0+Ißml)Qãү݈£¨ãsl×½Â9GzU[ %˜F}%8€½OŸCãÌ~¯*CªÇí)rØ5{¦ ½7 ú¼³; “mLŸ-º÷ÁC»ï¹QªǪpu,ŽOxC ì± ø› …vA“j”¡‚Q64pë . +óÀá+qžEdNðÎj‘FG#8`óšO±Pî<¥ežYQÝK!|Ç'µªc›QЃ X)«GÒY,ªÇ{@ e휗F¬˜ÞÈÙ@ô…”#;îT*©ymc…Ôx¨hÌÒ¢oOéì{ç÷ ½L#âÀ…r ?>æèMøÈ’(ñ‘%+̓G£¶i>Ôyj,Û”x+C(óüݶ ’dËzæïŽSJ°!_²óWƒ¥´îñ„lb§}ïuðž£UÕÌÁßù…rt©´‹lfŽV§n& Êw(ù Þü…kÞÄ0a"?NaÊ¢î‰_2®øLö»y«‘YÊóžnòúóº×%ˆKp~SÇnŸse‚dÞЊ&X2(¬qnfaGH¿d¸Â)©kŽX¸Ûò—% dÍH`QsÀŒ$ë2›7l[ñí¢R:Dú\ØLûfNÖ jÇÙÌØ:šÍfÞ‹*Ö.þù)ÝŸËnTÙAYú¯@Å$?[ÕM•¸fÊ/rüwïpÙç61y Ùg™(ß@Nv¹ƒ[äs3;õW@­ÿ„訥@)ÅÛg7Rô}@æÕ±àsPšùjàˆ{´Ä0î >ã¼­X5ôö¦¶T…»^W·oÿ½4Að3X”…ÊŽÕ£ ±ÃZ⦅„d8€tÜ\™zc€5k–‰Ì £P±ÅdÆõ ¤Â?3VS6ñqûøæÍeÖSÎJãç¦ïUw2C¯á—RRm¶­Ô³ó÷¯3^_O3ßÒ¬wùòôÿ¾òõ endstream endobj 4262 0 obj 6092 endobj 4266 0 obj [218 /XYZ 38.2500000 476 0] endobj 4267 0 obj [218 /XYZ 38.2500000 771.500000 0] endobj 4268 0 obj [218 /XYZ 38.2500000 771.500000 0] endobj 4269 0 obj [218 /XYZ 38.2500000 476 0] endobj 4270 0 obj << /Type /Annot /Subtype /Link /Rect [243.750000 538.250000 329.250000 545 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_adding_additional_code >> endobj 4265 0 obj << /Type /Page /Parent 2 0 R /Contents 4271 0 R /Resources 4273 0 R /Annots 4274 0 R /MediaBox [0 0 595 842] >> endobj 4273 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 4274 0 obj [ 4270 0 R ] endobj 4271 0 obj << /Length 4272 0 R /Filter /FlateDecode >> stream xœí]I䶾ׯÐ9€kD‘Ú€ @o ‡ƒi #‡`'0äïGU¢ª«%}”ôÕ#Ū’ÇÉŒ›#.oßøéÏ_ÿ‘üë÷äÓÓ×ÿ$ßìïO_wé¾ÌÓöŸäðë‡ódÕÞþ9)«<ùö}÷–¼í¾ì¾4ÿÿ¶k?øúô׿OÿK²ä/Íÿ~I~ü{óßì_:ü…ï»R•Í￯KÕü)=ý~øù¿wûCòÛaÆn9»™ÿýC¦TQV‡mL,ý¶ëŽ©Ž¿~ÿöÛîS €e«˜Lë¼H”Ñ&QµÉ’ÿþs÷s³@7}º¯ReaÊô’…Êì°RžéDeušäå`ã/™Ù•ÉËÚãä‡KEéB9'—¼ÙB«§Ù}¿L “w. ”îfáä’7[æñëÜðsdUåÂqçÒ@énN.y³uš{¤ÙÓì>€_W©ÇÉ;÷E³prÁ›5iQù£Ù÷Ù=ߨ"ó7ùqçžhO.y³YY¶à1Úƒ õ>½è—Ê;nw.•înñì’—[–eæ ¤<À¿ðÇ‘s¿˜sع8TºËÌþeÉ,x+íO€ ÷æøðñu÷és£ÉëÏÍÎŽ ¶¿½~ß™æ?F[c]¾þ”ü1Muù§äõ—]½oÎQdùqíHVGª}U§GÒ ŽTíÈœ¿út1û†.r ;bЈV½é•&öVíôJïuV©æ£÷8ÞcoùqDïsST凑ÎV̇9> ÊËq$ïN~! ÍòkÉ*ˆ¸ð:޽Áóè}3ÀH­)Jƒë˜g{•E©>‚ËCxÄ/1âͮƄ¹À3<¾ÁÝTÚAeÆ=)ˆ¢²ü!üËk#øüȬ\«žÐJuo˜‚,áµ¢âŒÚ5œíFÆhâ€øÂ°\#¤$–ŒTa¤WÖΦT' çœç±Éø€µþ2_¤î#<¾u<[Ÿs8&Á׃·„Ñ sns| ‡Æ×aP'}Fßèâ›GkkhûÑŒ‘õÌ„•ÕjU¥¹îIÔ`¦¨^NY²ü¤E\•íˆËÌ¥­r*€jU¢ê1TËŠ#¢¥>.Ùè¶­»a°±‘ÒRQÖ÷Q0ßdð›}cù“2›dŒÛÕú£Äl¯¬Øë#åŸï Cß0³á][Ò9©jQ°Üë”H—ïÍr9Ut(÷>òOªjߜѺnj©;p¼@S “Y_Çp°P¬U‰xÒ°2€½-XÌaEòa,W¼rAÊ,Âë0ªß|­€N«{°–¸Ü'°#¤€ñk Äl² v"à½9¨…pc8N¡Ëë3„M54óèùó9o0Õ¿-«z’o‡ýˆÙ?¼!ÆàÀEÌÏ  s°|¼ %w†ÍHX‡0Ùxú­ðtŠ’±gð_9HD¢?™C'ï»K…CÉS0 .ã #¼cc0j¦~Lãxå¦jNÙœñ¸Û™ØcŠýº Œ"Œ¯„–Å(Cc%TLu­ÏÈ3Lï—辢ʘCÉÇl_ÖǢ31ûŸ¹.êp×Õ½hû¡°ÇÁ§yEЧ6º‡ Œõè̉ºN„qb0bÒ.eÐȺˣ6d×Ò7ƒ©—øèDBc„:ãPqÇ6"sÇ·¾ÀqϨ{Ãs¤%®ÜkŽÅxŽEg£ž„#ƒ, ¹"ÑXå&2Hb¾Jß§\Ë„¥‘§º#°nF6Õ!~æË}ì”õRù~…Ÿã6$2,¢‘ ŽèÎö(øc³=/ß5>©ÂçÑËg‹nÑ/Ëg»Rà]×pâÆ UÿWœÊUCµbYЗ€I ¦L—õÝŸRx‚J(ˆLíl*ß§ýÚZœ0KϳwAùVˆ&’ie1ÐêEa:Nù+æˆcüsQ¸– ©Mð~ý÷–Á½=,— xoÍJ`¼N o!%¤\¦b_¥'o8f-bÓ@7 T^U˜CBJ7p« ͦ[êS¾´hÚŠïŒÉù-6¨¼RÏm9"ÍtÈUš¾8TFìâLÀ¾‰$ÓYŸJ0Î` ›Œg^"´ Æ5¤]ÖÙ¦@÷ïdS a_uòúDÃÛ6Õ-RÕÍAϘoÜÍÍ1n_D!’S“gp}Ý·µ™×›y¥G`öVUÞmS´ Q¶ìzÅ«Ÿ|[࢑%&¹4û,q Æ‘€¾fì¤~7±±º ¢QˆÙ\Ïf ‹4Ø`…Œ³o,&¦ <ÍQËÜ ß„þF‹õÍÀ¾¼œ¾l¨CÈ;—ñ7XQƒ&L(ü—U/±ÊC)6Ø%ižÇáHçÑ„Ú'«|YÚ$T_Y¾n•H甆IUç“t¤o0 ®"Eó~JZ´Š•I"‘d -GØéCòÅ­E=}jj«Àu®ã·Û²~†àbª˜<{¦Ü‰©ª`žw¬c·pŒåc¿A,ˆþŸä;޶'SCpv¤ó=«Á›¹jÞaՂöFÂÙa…_ˆcœ—÷ÝJ]¾HCmágn©¤™Ý* ¥5¤œñ_ž±N«¹¨Îðëî«'Ò;,Ôã3¢µd“ ä¦ÓƒÅ÷]•ê>pB¿ò}ØBl¢Žì󤌩¼0½¾–çÙà¡’“˜`ü ñ~€ÇWé¦L{ÓyýNþ™A7¯õÛ»†z‡z“!Hî¡Î{×åp«B·µÃÕG® kÅg^d®z7ÂðÖŸyBÁ:¯ÅU™FoK*¹ínŸ¢¢Èz¨.û ®ˆx¿Â„ò“á…à( f÷8MGÄpœ3u,bE>ûçŰ{á&«½‹.q£Ÿ‘5½åìo9û~°/K§±/âœýM襷j-ã(8©*bX39ËŽdHsÌlQT ¥»g5¦t|:,7 ªeÒ†6ì#±/@Ž{•¨zÔ;Ójëª>½Hiû&§ûÖ¹yv€Ž´`Ï÷xß`Ñ7¶ îØ7©Ñl³DïÛ üÙ:-êÜ(½>:Ž w¢o28‚wmù‘“ ïº%Ìb¯UöÑÈÀߤpxRÇy ¸¾S Q¸·Ô?)Uu–, ÃW Cx‹V™ôêÈôÉwnÉwX¢âèëä#î¼bN8ágAÆã–måèm¿Äãé7_îJ£q¯2Hµäâˆ$$ÙfÔ²ÉNóQÆœ}SiÎ^£#UO¼,yžœðÿ³Á0u‹>a»ÅqÑßú/Ù]gjÂöÊ^¯ì‰ÇWk¨+Û!L&¨ÿþ–®,-s<$’×}Ã-P1ŒC,‡zÆoA3ì@y Lõ’0Ù1¦Ü™â³š½ÔÍøuÿwn—Ó«²Áq6t„Œ‰ 5 à ¤£¢ï€ÙµhX—›ÿä,Ó=¹édŒÙ^LÞ¤ý‡lÒþš¥}å§É–m•Æ“mµLÎ@<°2=^æÊOŽ”õ|;$Æ Œc˜+jlBÑ™hÄ€ÊÀ~!ÂSæðËFéˆ1¿-æíÚõ’“U„³Ýˆ#²qiጠ㠟¯p¬”€Ž£Ù ¾&+•È’Òs{sí)ûB6(“‚±Wecøëg0ø¾ÂX‹:f8ä3Þ| •_°þû€Ø'rÕ±[);’Éc}/ûº™vkL&÷•Þ6£ßŠÚmÛͤÓ^²˜†<ãS!â)Û[ÖÛ[Ö'¼¬ó ðò~äC[h8½SVrOÆ®‚Ðf¡Ì´ykz õÎã1O#:.0½û{Û|`Q[í‘h¾E×* _A³òŒXËÖ/-ÙWýÒòô=­'Ðk€·æØz’Eâ­ËÓâ’Š¿[‹_5…ÁŠê’Š¿MÛ”îâ"Ë™ÊåP6LÀjç\¥+ÔjæÊLKš`}0ƉúûÖ÷¶9|«Øc‚yÒ&#Ð/©—ž6©µI­Ë¤V´Z¾Êëiü¿›^PÂxIôh ªo”Õ%wó1 äu÷²:Šãõë“雤sñ€(:1åª.'ñÿ zîx—3ôNÒ1&9d|ÉÔ)9 lÉòé÷ëÎ÷ÓüJÞš…ûú2õfÔåVc›ÖJïSu¨vLNïîÙØ÷XIc‹%åHý`+C²}¦Ž\(†# ÙÞV[žái»ƒ±ÚÐg´Žž*ÛÛg{RTð‰[š˜÷-¥p³Ê}p@ËXƦ/áˆAÇPx6øMR‹Ž~–^À"ÜáÏÍŽ»¿ µÀß`°Á[\¿;; U;Œ%Vðcp[ 0ö †Æ`ŒYU Õ§ǹº¢ýÁ$3üÍ£Ý}Qªì à½ÙöcÌÞ †Ÿ‚ÍšðˆÄkXåæ"š-S½·ü~ñ*Ü ';—|SR/ù²û?Z–¬Š endstream endobj 4272 0 obj 4326 endobj 4276 0 obj [219 /XYZ 38.2500000 595.250000 0] endobj 4277 0 obj [219 /XYZ 31.5000000 140 0] endobj 4278 0 obj [219 /XYZ 31.5000000 85.2500000 0] endobj 4279 0 obj [219 /XYZ 31.5000000 347 0] endobj 4280 0 obj [219 /XYZ 32.2500000 139.250000 0] endobj 4281 0 obj [219 /XYZ 32.2500000 83.7500000 0] endobj 4282 0 obj [219 /XYZ 38.2500000 595.250000 0] endobj 4283 0 obj [219 /XYZ 31.5000000 347 0] endobj 4284 0 obj << /Type /Annot /Subtype /Link /Rect [477 572.750000 504.750000 579.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 4285 0 obj << /Type /Annot /Subtype /Link /Rect [459.750000 521 503.250000 527.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_primitive_type_mappings >> endobj 4286 0 obj << /Type /Annot /Subtype /Link /Rect [60 311 127.500000 317.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn1 >> endobj 4287 0 obj << /Type /Annot /Subtype /Link /Rect [60 303.500000 114.750000 310.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn2 >> endobj 4288 0 obj << /Type /Annot /Subtype /Link /Rect [60 296.750000 106.500000 303.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn3 >> endobj 4289 0 obj << /Type /Annot /Subtype /Link /Rect [60 289.250000 81 296 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn4 >> endobj 4290 0 obj << /Type /Annot /Subtype /Link /Rect [87 282.500000 127.500000 289.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn5 >> endobj 4291 0 obj << /Type /Annot /Subtype /Link /Rect [87 275 130.500000 281.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn6 >> endobj 4292 0 obj << /Type /Annot /Subtype /Link /Rect [87 268.250000 162.750000 275 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn7 >> endobj 4293 0 obj << /Type /Annot /Subtype /Link /Rect [87 260.750000 192 267.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn8 >> endobj 4294 0 obj << /Type /Annot /Subtype /Link /Rect [87 254 134.250000 260.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn9 >> endobj 4295 0 obj << /Type /Annot /Subtype /Link /Rect [60 246.500000 111.750000 253.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn10 >> endobj 4296 0 obj << /Type /Annot /Subtype /Link /Rect [60 239.750000 87.7500000 246.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn11 >> endobj 4297 0 obj << /Type /Annot /Subtype /Link /Rect [60 232.250000 156.750000 239 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn12 >> endobj 4298 0 obj << /Type /Annot /Subtype /Link /Rect [87 225.500000 105.750000 232.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn14 >> endobj 4299 0 obj << /Type /Annot /Subtype /Link /Rect [87 218 138 224.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn15 >> endobj 4300 0 obj << /Type /Annot /Subtype /Link /Rect [60 211.250000 114.750000 218 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn16 >> endobj 4301 0 obj << /Type /Annot /Subtype /Link /Rect [60 203.750000 111 210.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn17 >> endobj 4302 0 obj << /Type /Annot /Subtype /Link /Rect [60 197 128.250000 203.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn18 >> endobj 4303 0 obj << /Type /Annot /Subtype /Link /Rect [60 189.500000 122.250000 196.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn19 >> endobj 4304 0 obj << /Type /Annot /Subtype /Link /Rect [60 182.750000 121.500000 189.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn20 >> endobj 4305 0 obj << /Type /Annot /Subtype /Link /Rect [87 175.250000 126 182 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn21 >> endobj 4306 0 obj << /Type /Annot /Subtype /Link /Rect [87 168.500000 105.750000 175.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn22 >> endobj 4275 0 obj << /Type /Page /Parent 2 0 R /Contents 4307 0 R /Resources 4309 0 R /Annots 4310 0 R /MediaBox [0 0 595 842] >> endobj 4309 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4310 0 obj [ 4284 0 R 4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R 4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R 4297 0 R 4298 0 R 4299 0 R 4300 0 R 4301 0 R 4302 0 R 4303 0 R 4304 0 R 4305 0 R 4306 0 R ] endobj 4307 0 obj << /Length 4308 0 R /Filter /FlateDecode >> stream xœí=É®ä8r÷÷y`²ÅE" tm|0Ш|0|0zÜn ªnÏÁ¿o-d&·Ð jɧ.̼%‘T06ÆÆŸþùëÞþû·Ÿ>~ýŸÛ¯öïǯoÕ]ÕÕðß­û÷g¿ë»ý}Sº¾ýúãíÛo¿¼ýÒþÿoà _?þkûëÿnüö/íÿþvû÷ÿhÿjêøñ¦˜jÿ~ïÿÅÚ_Õão×þûÛ¿ýéö÷®G7œLxýgÎx#M7‰¡ÿxsŸÉúÿøõïo? X6Šä57úƤ7f$¿ýï½ýÖຯîF2¦©ª5)Þ$t;7ÕM“ Ôÿ£éžè\é¦\çýÌÉ¡ÂDÃÆ{oßd¦©”–àolޮ܃bZ´ï¯M‹ßi\«kPþ£ß£W;ŠøÍ›S¼–¦üNãA´uN§nÜèþ¯`¹wãù¬Ë0:4˜×^ HÑ’üðrP NÖsÕr±ç׊>Aƒ?j¾] /~{Z¹jü&$‹¦#Y8lzÝMƒÛÅ âû­ûA†<ÐíSPc«·H­€3üðQ¥N+QL¬‰‡ÿõþ°p{? 'B°‹¢bT!KýCÃR¸ˆìBRÑ”äCöÛE„«}ƒ Þøô´žáÔ"?«ZÚI<o6<¼. £~ñ =* ¢h]B.”ÂÈ6Yҵ槿]ݯ'†{ó_¥c?>ætcô@ð'‘6V¹žè4, 0˜0†dn,Oš†RˆC5ò”TǤUçQÖoWËßãžÖ³U?—Ëï\5vØço>á›ÓÖó!rhäa2œ*ý°Ð²­¥¥Ã%£†'2×–zVƒÃ'MIºÎû¯÷‡M|äÍöDa1€QTŒ#$ЉÁò–i¸Xt©éð$ “Êó¿] /~{ZÏ[ŒzÂÇïÜh;ìó‡7ŸðÍ‚ÀéGGëy 94ò°yK •~XhÙÖROŽáGÄ[¢†'2+K=«ÁáÓ¤$]çý×ûæ >òf{"„ΰÀ(*ÆèD‹`yË4\,ºÔtxP‹‰ÉÇøh’oWËßãžVóÉÌ>^ç’ÛaŸ?˜7ŸðÍrÀFGëy 94ò°xK •aXhÙÖROŽáGÄ[¢†'2K=«ÁáÑd€$ŠÙ¯÷†MüåÊ÷D»À(*ÆèD‹0ð–i¸8t©éð$ “O` Ê·«áÅïqOëyËÓ<ÎJr;ìóGh• ®‹§=­»¦‡Fö!oI¡Ò -ÛJêÀ1üyKÜðDæÁìIŸV}$é:ï¿Þ6mÈ›eÉ&€Î°À(*ÆèD‹`yË4\,ºÔtxP‹ˆÉGøh’oWËßãžÖó–ZFÓ©e8lzm©»ÿQ *þ°Ñz&C†<ÐC¦2•Øf¬ÞZ"ê3üˆXLÔðÄia‰h5pT°&vþ×ûÃÂ푯Æ,ÁbÄ£¨UHÀAßò–¥pyìÉÐ% ¡¼)UÖM„«uã°Ú7jf{ZÏpTMG5÷€”ÒkKùýÒÀñG Ú3 Â°‰$d?S0löÃÊ®¥3Týuã°¶nbD tÀQÁ Ùyø@ð'·Gì`5Bå ,M<˜‡Vne,OZ ¥Ø´¿‡òÊ›`¥Òæ*íPÝ7†f{ZÏ“ŒŽ¦c¼H#•½¶\¡ÿQ8þèA{æT6Ñ‚„G/ ›hABö3#£•]Kg>¨úkƒöøõDôÀPK¬G“aiØÁj„ÊA§ÉǦ£—‚•[Ë“–B)D¥:‹CË&´ wYßdûSÊ“Lß2iéœf{¹Þmäö›75“¼ÎŒüË’>°Ó|Xà~~“·´Èª4ü¸uû¥<ÜUùý’ËLß;€¯z‚[ð±j˜Zç*{N´óv}=Ëš™†[³¨ï#­™iÄÍŸ¨8Óš• ³2cÁÌðɈ7n’çX,€w½³2oX5wµíÂÝucÿ¯ UÕTÛÊŽÌŒ‰FÆ-z‚}OøfÊ1‘ćoo?}i'ÕܾýÖê8ý€ÃŸo?Þd{ÑÕçaâöí¯·¿ToþéöíooŒß¥è‹TuÏ wtGºÏ;ÕGðŽèïègÃн¾kS5¼öet§úÜß©ï‚kÞÑq÷êD Äìëþޏ·­ê•°Œ`÷Ü€½@afÃoJ¼~àHoðbƒsãCoŒ¹…šÓ¸¶#߃€V 7…9ÐIО H°{!ƒ3€ñŽ\po˜¹Á´'g/ -O©>À´ß¿¸v}þÖŠÄBÒÌèHœI{„ÇR îƒÁûPØIKæ0Fï%%Gø H˜ Æu(´(“`$ŒC°,„€?¼3ò0;±Æ| ¿DÐ ÞÁꆓÂK‰ ¬%\ üŒ‘OO4}ŒÎ‚`?#Tƒ™ÝâO¡'~ªØBA k $ìVšaò±#ä`åâ„ó˜Ýň²%–ßáܤª›±V£F–r>G¸i¢mfn#³F€¦°Ùô­0„”ÜùX;žà%ÙrÁhTü{ñû ÆìtàwÒů^CF°O[ÑP‹Šv2?ƒ4t<û/ i‘†Ö 5(.FT(xðžÔêJÌ;ÍƆÚ°";ŸÜù—xëc$†-SXlKÓm²{$µ§2†(1H k‘$f-„#gd²dŠ“¬‚Š%èÀÜûÙÿ¼óºÃ>‚ïðÎ'ðŽX>ƒ ž/-Æë¦‰ kU‡ET/•ýÕÔ¢¦(˜áý<Ÿ7"$âˆiwʉ^–:TÝ/_W¦ëGæŽÇ‘ <ø{ÀÀãˆÏà äòU€ßgÀáÕÖËß©Àw¬’»£ÀYWà8 Ü8ˆ‰ÑL%ð÷ЮöƃxÁxœ‘•W{¢ ý`0Äj0˸Ë9qGn(?j3-?@X`‚;Ðr|b©‡™5Œ/ð¬aJGÌ@À’¼ãø°!^š‡Z ®JžÁ¸ à –ˆ;0Æ¢VkÃ5©»»S°Â@¡gUM¡ÓŽp8xn Á½¡4WøK°‘ɰƂí*À\¡m¥µÁØË0ü„õ†ì¾>>¸¥fT‹ÚJæS™1ªzDŒÀú.xg„ûÂë½û®¯F(žÛˆ+Òî•àœrG„Z9˜+‚ß3¢bæÛÃà=båPû&˜¶áYð†å b?oeí6\Õ<â%h¹*‚C½Áx9Ò¬I`pAM°¶;¢Ãž5æ{0\ˆÖrsHRj"^SŒ¤„g€Ø§Ã¸Ã,ùGö¸0¬aÜAì®0r cÅ(¼‡ÂXe0Tã‚+o¦5دf÷«›Èê†]MOÙ£¹án¼KüŸÄŠËOqù)þ²­M¼ÑÇñSÀºóÈ ÃkrZ?…ª.?Ŭ¹m䧨Á/áˆ]%fÏ=Â/1r†(ˆ5¢[J^Å÷°ƒ«ÆÙÁGø<Ù|ô™Üdø#©¹›Œ‘dÕ}wL)wgXúúÎÉEïØxÇÌ;ðË6r3‰IÀ£JlDøöf,›»`ÃZÅ"037ÎÁq¾€ß3ˆ3Ö¸ØËç øòq˜¡B£‰”ݸåýí4ÅÂ8íSEÍ/(BZ2ißä¼îÅšx©G¶+ `†M\(µV[¦ÿ‚4Á…Š …Ê΀Ó²–Tg€ó®ŽW- S] s8ß/Í‚?¼q zVß«XT€)ˆNŒ¥…údc?£Z‘pC[Åe$u®ˆ'(L%æ•”xºŽ¨ûõ!6ÊÓ‡sGp‚¤,!ü¤É8#i½´I?1bj¤<S®†lÒ=ü9Ÿ 0û‚ßqÛS36øFÞ$œµÉJbrͶRš_,EÃ0ÄI¼Q£`¹¿ƒO/Y ªÑóea‰4ÝC*¥­Þ©`;‚¯ˆz~¨BKû¯Ï«¸`VAz&AŸ\YR$œÍ£s6ŸÎ3M¼ùÓ£IÄ*†ºFÆÑ!' ÄRõÚg.dWŸwGÒ>[‚ ù ·,Ãfû9Df6W½È* [r}Ö®HlàHêz`´~xýHù&FCƒÑ}EaÊ ì²ú”+DS-Qù`dÉHª "Š÷£ÊÃne};e¥_Leî»HZq·ƒ#)ì³ÄŸBaÄÁó)m¶$¿2bØ4õ€ˆ!v¨]ö€m˜:¡ïÆw&µÄAáŠÅت63ƒŽœJت¦ydÆx¢0öÛž—63Ï„À¸%žÝ‡q•Âë@€’ª¤6Àþbbó6ÂM‰:$ ³Ĭ:f¯¶{ Vbcê‘o´B·’¥&¹Š¥$^˜—߯QˆŒ¥b‰~{à"˜©'eŒQŸ#2‚”Pú:â¨ò #|Qʬçó@ª¼Àb™X$‘ê7˜}"‹—D×%çE`ÎAD£aö–+T»’žJèHžÑ2‹XÏMz­ðE œ×ñ«°Šý4æh½¦„ARSÌ®–@¿ùÚÀÎõ¨‰†Ñà1v.LH¼ÄçfØZHÑv‰óÁ!&))vŠpðÈšÓÒGaÛÝ%Ý/é^Í#’Ç2Ù̇ùRŒÇsrÓ¡Ù(¸>{3Kš¬ó¼²5äNU‡ÓÌ™1?@ÓäzÇæUÃ̃É;â%GŒzdº'&eëdÍaøml*J>÷Îp§qàH(0GM Ü-;ÏY!aªýöV×ù{4lºéLêȈóü–{|K*—Žy»™ë€VQÜÍÁNë]([X`«˜T åkdü+ºrª)ɪ›˜}¡ŽÆlµ0[:Lò6BM>@äÁ•ƵÝaܤ‚ôå Hñz$m–µ0†ìcŽ+´ç“ïv¶/M'˜è‰눘JÄ›gÓ ØÖFånP¬n+U¡¬ºQÃO]Øg î±SuÍþ8)>–0 ϶qQësò¼ë.«»] öÈón´ß²Ož÷POÃG‘òyÖ&ä4k„½6'³…= ¿PFa6E™K›ÛŽqÆ!êámå\|ân9l{î,š,\ÔeŸG#<ƒ=ãCd­#¶E )L‘1'VÀ°8N±Ü*Æ.¿-j/Sº1Á÷×ò/ZþèõUsÍß³©íT WÞ'M$Yk‹,nÊÙßbxRïõî1x…©£ À?¸IäΑöŸÄÜ—¶ÆÀF÷IKææ%éli…÷ýÇ E)y¼ç”Id6ÉRa|Ñ,'N¦­ßs@¾K 4eÐZÞ*ülðBrydÍm ×Ùè3æwmàSz ç›Z»-´’Æœq…7ãgಘ3ÆŒ{_D! E=æD[´"ªcÑ“¸Æ6?µëÜH¿šyê=Gè^1Ô¦ÀSÆåŒ`Õ^ÕØÎ­ðœJæ§etËÜ žýâ½6 ɾY`“"ÉÔ u_b=¹Rk Y>/wöØÜPÞÑ­j#GŸ´.i½×1BãE`©T%]\ÌÄ@]àH „÷¯(¼Çp’3h°»}@âúDÈaÝÊXÏ8Ÿ‹ò°FÆÄtåËŒOÌ0»Ú­dçeYäÁx?¥&ŽÂ¡JÚ!XÌ—?‰©ô[8—l+Íe7J£¥å¤¤Iï§é-»+Î…^f4!­w*‡Ü-Ø\Þήx,£à/˜ò5MÊÚ•OEÜÉe_%%Î1‰·ƒ(n²ÕaŽ[yõ盼0öX’íšK*ìæÚ-¬M‚O’ÇaÔÌ’ðÐ:‚M¹%ÒDqZ®GYÞv#mÓL¢ãd>ûU«3ì€.ó-,¯_Î|{dD¼¶â{ˆ;ÙÔ·º6ùÅT_LI\#«ðžÐì]_Íty¹».w×%HOï”*Z HÇÚþåî:¢’µ¿å‹ØªtdeâÈYýˆ$æËQq9*Ž…ù{ž|ý0p)gˆ»—££»³ÞÑAļ©¼Ü ³¦´•;WÌ ¹m ì 8ôóÛ®Ò-/ç4@ás‡u‚zcÏ@I~/tÌð_„y¿˜ÏaÿTÂâ6Ë¿Nñ¹ì:H|»•…{ç¸Ô‚RRÛ¨}O¿"^çÅQ"^©À6"×)>óÅç–-&Ñ÷õ-)‡.Žô\¢ËÆrlÖö~m,‡®¦CjÔÙx£[RÈ*W èe¡²ÇÐ(±™H:ž)ê²Ç\ö˜râò²Ç’ոȽu¸Ðe™#€.{ÌØò\ö˜í1’©S¬m[‘ÕÃb~䌑ËRCÌô.KÍe©9‘¥¦©#nuYj.K ™¥æÊÖ½²uÉ€eë.Z–3fë.cä8€ÙÓòg™E#ÞO…‡ãy¶JˆÞ,·é”jSÂÐP# &£&{äM×»÷ÿlagâjz!ðŽ¤’_ XôçtQ€ÏÏt%\_ ×%–+ázΔÈÜRú&x6µ``þ¦ Gdê®Lt$ „îT0f @àÌíÈãoÕ·  ”Ò)w5—îÖŒXâËÌÚrZfÞÈ>CwF¾žÛ'p˜­Á”ûå‰ð’?q…¥¸¢ø­]òº–÷®ãëú®uuSU÷G1¦‡Vuk̽GíöaÛòë[£ïŒ®5{<¥ü^ÜÕ0Fû¼½Ýk·ømžŒÁÛwâ™ð››éÐKø¿¾ýþöáOLX6~؂ԜAÿ«›åYuoË!\n¹aDÀœc‚q‹ÑrE0Ž}D½A($(ÁóZŸ#FWDÑt‹†=2KÓío¿áûÛוÜB‰[(™ãª‰)¹mI¸E÷”ò{qW"äŠç¸E»_‰Ç`)·hÛÜL¹Ï-cìÊ-ž‡+HçÅœÀ¸ÿ‰³´‡úÈO–î,©zsƒá†°B¡ÎÕ‚ ¾Ÿ–­®ÑŠÊoXO´†‡DkDŽhMTÛ’m÷”ò{qW<$ZÃrDkªdŒ*%Ú¶ÍÍ”ùDûcW¢5ÎÉÀP¼ÑZA1Ê?€ûúS ea ¡Ì(®^FfÆ82«´ß°šÌÆ2kZ§dÖ0‘@דYÿ”ò{qW, ³¦HJfMeâ1Ú–˜Ìº67ÓÊ#³ç{’Yó ¬)¥ÿ2ß:7岟‹s Ó3˜¬ü†çF1«³+wÏ‹êÑm`=V0Éí’­¢mavá]˯ݨ=O tã.+»ò®›1¢¸Ž‡i[ºa‚ÉôOɰó{Ds[à«›Á„³uÀ[µ­Œ”¨ ̉ɢ[ƒ~ T¸Oq ³éBšˆ.ê*G5¶·,DhÝ=eñÞuc/í0Oº:GRÅÃH•ÒEÿ” »‘á0»ÒE]OÊÜU•­ašZòûÒdQ7Ž,¬D¶ ³É¢ÑY´Ú@†,ÚÍq„¯ý:Âêî)‹ö®w©#²hTŽ,š&¦iR²èŸ’a72fW²Pî\:ÓPq!eÉáÈÚþ‘7ï¯Í`TmùCWIÊk˜Í`´ŠŒÖ9cª˜òûí~ÄÌ“£¸nÜ¥ŠŒnr F×ñ0ºNLÿ” »‘á0»2ó(¾‘]ÞmO¦l-2ù g¾KC’aZ‚9ÆE±•Ùóâ¶·M¸­qÖöëü†¹ÜVUMÈmU¥2ÜVU&bƒª·ú„̲jà¦nÜer[UÕn«*™ #n;<%Ãnd8ÌžÜV1>mC…9ˆý#1D0¾Â±6 ìíËrËï Ð’bÎÿȵðV[ow:‘»n2Ö[ÅudYU½é+´¿öO)¿wUÖ[ÅeÆz«¸HƉõ¶ks3•žõö9ÆžÖ[%˜#ˆDTXôb‚Âøæä'cºa?æðÅæ®Úý\u£òáÕ¹&m%œO‘sá7¬'D$)™ HR2HR2 HêŸR~/î* HR2¤dÔµ$„(]@’ë%üŽ ±~H&ùhBaƒ8ü<β€U;׫߰›0àE5¹€ÕÄ/ªI^ú§”ß‹» ^T“ xQMðÒµ$ØØ¸€×Kø;ccã^„Å]0lz~¦$&ÙŽÖH\’‡4:›¸Šø‚âC ph~ÄH:bß±”a*çP’û ³÷¤šG{R-r{ÒÄ4§¬i.ØRvOÙ=§ëÆ]òhOªYnOªcCc×’ìIû§dØ ‡ÙuOªéËpðð>Xã¶_ú<4ÌE]±mtÅ3h£ƒ¶6Õû§´xtã.Yˆ6ºªrhc‹‰1)Ú˜ž<»‘á0{¢M;Ñió#‚CbÊ ª\ êE öKÃä‚7xá=›þtå»Üp¿aµž«y蹚³Œž«Ó„îM¡¦Ú?¥ü^ÜU蹚™Œž«YlbéZb=·k³3µ½„ß±¯ž«¹‹-ºœÅTŽ€3k™sÕ2ÍQ‚ù ëé[˜¾e•£ïÄâ¡{‹GD¡ÝSÊïÅ^ Ò·Ð9ú±å¦kIè»ms3×>} sú–.FŠÁ>ÔŸ'ÍŽ˜îî›GØ_‚IHñ0Â주ySËGg~ÃzB¬uHˆµÉbbìѽ±'"¥î)å÷â®tHˆµÊb­º–„Û67Såb­@ˆ‹ÊI@”×[B«9­[U9©Nkû˜ºAÇ·˜Ífs rKMMMÄ ” YÒ9V ãœ)ÝÛ6"b~¿íÅ]©¨&Ç TœûÕµ$¬ ms3m|V ÔXÁ£ÿ볂ùfGLåTí•_0t¾«V®G²c~^Ãz`š•ã&NçÒ½™*¢áî)å÷⮚˜:ÇLœ–Öµ$ ms3­}`špS¹˜ž‘ŒI0¶räÌOàÌ!˜"I¹S²ËXrbh^1¢­Éü˜zw.Ašê$ß0× m˜“é†&c†6,Nt3L'fèþ©ÁÌüèÆ]ºXœGƒÌ˜¡»cdâaDb†ž’a72fO3´á„ÍkDÉÜ*v.A<‰Ù¨jm }/†?"næ7ÌFz!#¤uéEœÅf„J‘¾{Ê"µëÆ]Êé…È!½ˆsòº–éû§dØ ‡ÙéåÊWµy8 “²1•òæê9¤g! ‡Vã,mpüR麢 äØ&î"*ã¦$-üư s¼©kÎbIŦBu‚:àìQEV“îDª¹`mít¸7XÓ·€ú^™¨¶!¬QÀŽ6ÂJ\fEW_çWUR„CvªWTœÑ•zLïX6wË‹“ Iî½ã€Û<[ìœä=aö|ùîôûh…Jšš6ÌIÝŽ¿ã ô…®`dfð·[ëô–¸rÐoÀqÀYÃs³ þºÀßCÒ€ï€ß1²bxÇP‘θN¢ªqZ´\eßCðÙTí<•¥ñÈá g8Ãs:öüàÔüÓòwR':&J“hóyùgØ10ÿÓQG{Ÿ³ -æ5Ú#æÎ@®ÅÏ„¨y <݃–ºGÓ3ŸÓ¡ÀøÅ1;xŒÃCÝ'‚[¡L<aLâÞÀœ-{¶R> >> endobj 4311 0 obj << /Type /Page /Parent 2 0 R /Contents 4325 0 R /Resources 4327 0 R /Annots 4328 0 R /MediaBox [0 0 595 842] >> endobj 4327 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 4328 0 obj [ 4324 0 R ] endobj 4325 0 obj << /Length 4326 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯Èó“#>ô Sý0àƒÆ àÃÂcÖëÁbgáöü÷*+“ÒG%¿Š ¤¬œÆtU§R"EãùEÄOÿòËîþû»Ÿ>ýò?»ßÂÏO¿¼Tû¶®ÎÿíŽ~¼þÀvûðû®íêÝo¼|ß}ùöòíð÷÷—ó ¿|ú·Ãoÿ·³»=üÿ×ÝŸþãðáŸÃ—Ž_øã¥5íáçßN?ûÖ~«.?Ÿÿþòï?ìþ~|â0\˜Ìí¿´Æ5¶:Ncfèï/ÃkšÓŸüö÷—ŸÎ 7Š·­õÕÎxçw¦÷v÷¿ÿõò—ÃÃã«}ׄÿàïäàÝiðö0®7Ý®øÈÞ<²wƵ¶ö‡ßûÆ·UÝuöð{ëÂìÈÆûãØM×ìŒ9ýåG£ŸþH=_ãémß+>ý4wù…q¶O?]}Ó»Úž—­n5Öíòx•]é«Nñé§¹‹¯KØrøpõï›JsÇ/ר“®2š<ä4w­‡×Þñ®j:Å{¼ÊŽë5éé8w¥ÇWßqÓ¶çEëk•=¯²'¶5šôtœ»øº„‡ß÷Þ˜ö¸ÓïÑŒÃ+¸ÆkžçËãUÖß[Mùpš»Öy†W?Ï]]ižçËãUö¤÷šôtš»Öy†Wßñ^÷Œ÷šg¼¯TÏx¯yÆã‡ËyžÉùà9ùž¸ñõ×—Ÿ¾v»ƒôë_; xþñëaÒf÷ãÑ]ÑÔ»_ÿ¼û§ª2Ÿÿy÷ë_/³wÞJÇï®X®TíéJ³oêÆÖÕÕóÞÓ£{Üëùžn¸ôö´Žóå|݃ǩ<dž5h÷î¨=Öï{ZõÍÍ8ø>ðM+bEí'ô>&¬uóö”óœ¾üz Û÷‘\¿;#@±ÂÃx×B(~AŠ8xñ xeOQ€ö} Pc bDc*Â{VsB - ë­X8s÷9¤8vYi"Ækj3#ïš¹LÍýdjLc¶äì€gˆrO`ó”î–sœ·ÄŒ·ä´²§…5GWêî°Ö¶®¯?ùÛË/jÞT¸ßÇ9D|鳺1üi~páb?±%P*&ä%ÃXæ… ÛMZ«VËD5ù„»îãHÐèbJÆiJ å§!…Òk±Z€ß‡PðñLÌú~+ƒr3ÛÂØ9˜Š1iŠž£%Í€Ú™Hö%d³Rب` ÝA¯OB]\±?(„É8Œ7ù5~Ãÿ3â¢| ?-AÖ‹¢¬BEÉ™û6cÈ$ŸA³„—PíMSxªÑÄ¥©¬ååSCWígø³¿ÀÉBiï±Ã;Hh8šÅª ápÑN)‘·qˆ>$ôÝ‘ {NfðÓ5~~ù™p ¡F䏸A(¤P’¶¾7üé\[NtË9âg°ÔÞØÛ!…°Ôa9ò¿A4ga+tƒ³t5õ¦ðiɬÏq}ÝÎÀ˜ ±ÈÝf°FDÎa8f‰W ožýR@Æ/!ׯ!ëÞ‹×Ï~½ŸDýb2€²€ÃT¯à÷º¦wHĈ¸4¹ïbN~ÿZRÚáýöO޽ÅèУ™d™…ð@¼1ñBàÊŽ‰MdH9QÔÂqd3WBS¢\+Œñ …´ûŒžÆè‰€3ãu‡÷ä¨ ÷ Í„ÉÄ&Ô…K°¤”pIÀßDäB)lÅh™è2Ìwȉ ÉÆÿd5Gº±5_•¸$Xº¬u…9Z”:5¢„”Uµ0‹}ŸÅò(Œwlpdµ ÚÙ¸€p†¯•ZŸ¥ƒÔñúôp2Í wÇ's6•¾Â%´ðiúQSûh¥$Ý⦟Ó6§!k yÐFîj®„[ïíhÑšü{ÌÏðžŽD”G¹¼'”%i*x{Óà0?à+èÔÓ¾æÏzLŒg=Æ÷8¸?C`bOáÓŠêzˆÀ@*&éTØ´'<¾ŒF5rýÓgD‚¥’Ñ3|…Ôô ?X å,…1ÀdÀìF©:"#½ ¥ßo 2JàrÚŒv.Š[K€çìM™Õö‘Ð&ñw„a•±y¥8kBÒ21´Ñ-k« Тñ¦äØ8‘ãÅ:+zc14uÅÂ+^ù„®uwêž.ÿž ÎÍÁ¹EX‘ ´#ÝU[­Á¼õçûŘ,ʤP]ŒD¦Ìò*—~ü£«ãþ Ú¾nòlm@T «•­Ý‘1Y  º¬Ê‹a‰â.£ ê ñåíßS‘b¢ÜEsjíSw>»þ]ï»®Ú5ÍñGkLø´Ý5õ¥ÿSøä·—Æïémי˷ÜÍSÜõ‡ï‡»ãm»øn;Ãï‰frøVwó”îvŒß_^Pò wA~ö—ú¹ü¥z°5—¯ƒ€|µS„÷݃¯0OÃ>î¡ñD®æg87ìýÆ–<œµoá=Ø3ýâ¯ÄÀ=ÅOK¬5^7bu ¶fZmiïª.:˜ú ž&÷R”íÊV!•­»ÇĹmâÁ¸¼÷Y l^³”„‰åÅòe(…KŠÎ­XùNâüå§ý ½:µaxn„1Ї!ëa\õÂxÆÈbœøDÁm*$á '`ϲ™ë"i$+(6" –%ÞŒ)%€Š8Í“p&$8T‰ò"2vñøÃÌ™&Ã5˜¤Y E ŠÆe0´£Œ¨+«1vÀZõÑÖ>ƒ5ºœÍ9{·U½ž§KŒÁÿÖ˜÷BâJI’b‚H?Ã+_$ {Q"í›xG=B. dª}.®¬ø!5-¼NÊJY<Ú™˜,ãÑm†çF¥®â#€µK¼?qˆžYÈáfІ"ê»ëX¤1ÌP¥›ž®(¯C~ÅÕ‹CÙ üy’K_(/Ct%O3À g ¯ü ßôÞƒÕ×¹Yk"ŠÜˆ|¯r?Þ˜n|u˜n¼™L7ÞEAãã'q`úô-wów=Ƙn\?˜n\qø$LŸ¾ÕÝ<¥»C?0Ýøæ–ĦŠ1¼Î˜ìSÉ9.2æž+!1õ´M†^™YãÕÁu4CÁA¼¸zXØ6>¦ÊgXX:,<2ƒD @ WWÞrœxcST FR‹²^ºc½13ø3´:CèaŒ_É2Þ#87ü¦ ½rAí±éšh¯˜ºS"0£K0-ÆéZ(MŒiHyŸWFi/Ùêë+ñ^ÊÑôX˜Õ€rUÇä §ÈÑËè ºêÃhý …¯Ûú §¯´j%_½JÐàXjšù“‘¸¾j‹²u*JU[”,â¦é 2uDFËz—w,È•IJáw|{ZúöXHéL›pó´”ßc)O]‘+¼ ø},ŒáqÖ¼:¯Žr垣áºM fó1)%ubR"@‚üðÀscBÄ8¯àuƒGƒ‚{aô%\k×­‚k_ïã0õb–¿æ°?^7â”àýY ‹¼Ô±þ8Çß“˜>˜Èˆcûq ؉5X±ØÃÇ6!ñŠ2ڤф!TŒb”ˆ× 3iFÍÂŒ¡x,xÅ\7÷°ïKi^Ld ùáÍO0OLx#!™S$»¸.Ï0ÂÄ=XûÆ3À®# 35|h;ƒ¢7œî¡×Ιá`âdM\÷—¸‡ÊË_܉–ðÛn¡iqFR·l€Ñâà])ðÖÍyfŠRa Ѹ}¢¥ ó¦%X>Ðß8Ø£Y†*Í$k¢)ØbGT qd”Á„uóबâäЄ ¶6Ú‘ëJˆj„0RǺ¦áÔîD¬¾&hLpsJjžKÛäØ("Ì Y3æéòN²ŠMº¼ŸþÐÔiœ 蛦½¿ ItgdðTTi:Æ’µõ}K¥z`ì Nœ–µ3ïïA€Ì~@š(Â# ¹-í@Hñû0›EM¶Tƒ(ògi±ÓÝÒÞwˆçÍëÎTäVèã BØ$dž6C0pC\¡½Ø€„oZÌ@1uT}/ϤUK·o]¼x+U:¨Z6¦2¶¦˜ž¶L“¢%rÊ×UmtðÞÁ¡4ûã¹&fe )oCk¢×{WÜ_øt1}4æ Y®Ð×R¨û7F$D›l/=Ì-#÷£ì3xŒ0W®!¥Üù{‡…Á•<;õåhØ a@xÈ©2*°¦­Õ»X )™2íô •û\³7Æ mCæ“«æûÞS¢/>˜Œz„hû‹µ’~({éÉÀÔZ¾:Uñ ›Lf9!  †y`° ó>,€ÓZIÙxL*LÏÞ=ÇÉö³¯÷¼"}åÑXךÿµ(‹Ld£1³&V4€‚k°Í2ƒT¹F¸aä±Ö‰š ¢âh¶†Öâ¢åù_žánóÊ“ U«fCÅb°®°í+@@éz 'ÜØžfœ øæ çv©†UËEÞ7Õ<å~' ö,%\½p`ï$|‚L~ÛœI¹ Šõo[¾‚Ù¦ uk‚9}Ë!}iíbúÀ\ÑTÍYé¡ÝCxôâk1¯5K Ô&zkƒæ0mFZà¬TèôO¨-XHù1=ߟÛ"ÍÁüÃ9&ÄáRáôø/e–¡QñÔljšöÖÆb)£ã>IÄcâó nÂd£1¶ØÃö ƒôbtv>)DÙóUõ±žÄàNT/ú&ãŽÁ…¾Õ5JcÚ&ÖrDÚ H ×ÛXª“&Â(†Vú¸èÉ;üñ•p›ãý‘örZbÆ [¡êÉÊjí²¤dÚ J¦ÆGû—p'`÷v©`h<¶PÅ2"Ù*âÛ‹ÿf%²f—ÁÆÄo ›Ü¹|ƒ`eÒyFBœq­©”ÔaÚ1mĶcBŠf,cƒM£¸…‘*+)ZçÄõí '°fϘÆñ¸&ÖÒqÖ$|ÇTÕ}6ûy6ûI¾Ï£5ûyv,­¶Ð:HŠ'ªÌ‚‡Ò×vx5èU[+ËSÓF¯·yªéþì|´OkçMµXmÅ C¥P;“œÀSÓW´TkÄ”]ÅsÛzRo›˜lª<ÃR9+h S —ý`Q˜Cá”Ý,¦ùµdL= [Lñµ¯Ú µíl´ºu3#Ù4gÓ›x¯esÅ%\­L°LÄ™X¬fÕX$‚§«ñLës}±gÍ µÖ 2U[Þ”˜îPô§ÎŒ}¡"‘±>æ6Ë0Öèj×§órtC]W u_aižÓ~v9LˆH™E¬´exø“’)ޱ‚‘5C¼Gk×b\s㺇XŠæ¸2ÍYÖ¤ê&¡0Õ,2WjfŽ#‰v²EÒ—s:kÁ{GÑBÑ\~Fé ’]E«è gfhFDÉOJ>Ìö:ü8áO#:ܨ6*Ô^1ž uúþ“DùF© D¶‡èŽÔåAöf´.¸ß,a”Zá´d]“‰yA¥B¸ëú'²_bQ›Ž’å…Ân²½½Ÿ~›ò´J™9¢». àÓìSaûH¬1‰¼¥eH ªkY¥Ý3®—RÇ|Ͷ@uèÇ,oo‡\2fIÄøBLä°«g…t$ѦâugJhöît¤Ç´¨™ çÄøóvåó…‹ß³là8ÄÜB-SïÏïêžW8·/èJâ}DgýŒõswrñt…Sðž1¿3«'œÄ$L0I7D!ea³h±B"²ö˜lÇ/‘æ2¥Ê,-î@Çœ0¡Ûjy»jWߪsM$©C,ô–eݲaÒ µh–Š×KL6!ÆD_c…™ÐJ®ãBÀ P謋˜. ≤»Ùv:yulqÝ%¢ÚóG(uÒ7]lhéG“C_µ«13YìÞcšláöPÖvJŠúÝ)m¯¶I êbÑÝöxõ¼UE·©¨®!“—“fúbm‹oܧnm/¬6ØÖDG1QQ W‚‚µVQ4©ù.Z©íÁÆ„à:w?!|}Ë×±Œ’qï=µ¢jE"éï88"ÛPDþ,£–§un²°Uyfýúµf—“ÞNËÐ%uÒGªmÕ7}l8b*)‰Øs¥½¥šBáö=X"®0nÞ&Ú’ÙŠäú–ÓÂÂ<ãtq9 j KÙÒ!‡•Zûð¨:sÏ èÛºepDº§÷c¶³ÇÐåìm±p_²„¸s.'œ6ñTÅ*W§V¨ ‹ ¼™¯%V¨«£©bäc8‚ûjw?å3íJ°:WÙé×ô™šÑ˜„Óĺ“,qy]±4m‰ê’NÑÞDûý%p<¾¦,pùØàƒÂ­©^LK?•«PoÍÖi]¬Ø/Ÿ–ðàn•ámÞDšh±ü@Z)„fUÝ´fUµÓ¯É ,at«(,VŠúA²Ë©x—„^a/ &2:ölZæ|yc˜7¼13f*M·;°†®:Lì0ô—Ûýá¯]Ó´Æ„Oý®©÷gžY ŸüöÒø½1ýá_æò-wów=ÆáûáßÕñ¶ÝíÝmßGc?9Üs3“Ó·º›§t·cüþòúÃûÓ §EÚ™f3lÔÈNÿ·qªqdиžþWHx_Ð=ø ó´ Xa–8¥>}†sƒeC 8ÁYã¹Yƒæ–˜AÇßbu°ªj¡ªŠ‹ªâµÆ3€ôvÑ rhï)±s ÍV[rÁøvf…à )G–IÈc¦Í‹h¹FÊt^KÞ¦fdSÇç‚QÚŸ-V¼D›`ÉÎMXÙ=2@¦ý–hŸ±„ Âèêõ¬íB MKù¼Œ™©2ÅxИšUïÈi¡À4¢ dýÖ‰¸L©ÊûŒOçL$ ÂÅA§D8J¶šœ¨–¸jh°.¶¿T ʱè–p©n³\Ê{ (‡P‚¿É6·TŸ…[ñ•ÂÝñ ”1^M/ãÂX·À~›P]^b…lO((Ø(L4VŸ@ÛáÀŸ-°G¶uñÙ‰.v½è´€­Ðﺶ·®T€l¥PŠÛÖrtžÇq ‘Rä‹¡ßL]X×O ª\ãòÝ¢¦6¥&_ û÷Q}uDõf*ˆê]D=|2 ¢¿ånžâ®Ç¸Q]?Dí\qø$¢ž¾ÕÝ<¥»£@Õ_è,TKž¨Eÿ:cLN¨æ ê©ì\ìpäšC¥Ï0!ʨcª|† ¥³ýˆVG  ü8^üM¹î¨è-xˆ¦†T»˜GH„?/ '°…‰ÀS¶–èæ(BFˇh—‡0QÏÄ¿#æX¬gÞ0&ôÇÔÄ’-Z­óȈ¾¬:¨ª_V¶obÑG.J(´*2J²Šâ‰(%uqQñ j¥\zM²nA.un XèÄÃíD mìëf¦¢¥ºqU¦Dý?Ä‘87f­µ¤ðܰ›»†áþàXmb݈jVLx¼Ö®[׺ª%ß'QK´~S‡)QÌA³é/Í(^,L¸láã¨ Ž´àCƒL6& ´åžy³†»X7,¨ð8'ÞÓ>hxOˆYÁ,ϯ(\\ˆŠ{Ρ3 15k>œTO0\<7,91ã`¤úcbÍ„4Ü `]òØf¢ºÕ6× Ÿ’5ÛMX[Õ¯#¢ü}s™ . F8Œ„S¸Öìr‘(iÓ1^·Oàb•k©DÐûã{‰e#JžQqD¾O‰zjߨ5K¸L©ÜEÑ<j“—ª2s]"D_yï/%1pÑ]¬¸ba­W,ú KÇVXÂÇšQi±úCX•Ç—xB™bTÀ§q•šõÓ¸zWéS"çTïv¦ŸÆ}ÅW_Õ—¼ßóB™jF´ŽDÄÄ•Àhê½dÑ{zt Œ¸ñ²OÜ`½Gã*†"ÂqƒÌíÛ>ü=-ÄŒ›½3vÚ욘Aî±ÞŸtæ‰Åkôß©u«Ð=^Á+:€ÅÇ;—XQ<7¸Ûá`æQUXëzÖiïZkLUø}Dg)„ÙSO=¦ª|•bh銟}Õ×ÑV­Ò·!QÆSN;GÈ“RE«©+. E,•U ‹erë2êG3˜ho—Î+æUOÃ(co ®vÖ"îßšÓ†–èH© õ缩+y³Eˆ`›¤ß«4cߦ˜¡|Û÷¯UKKVò1àx¸Ä£"ÞÂYA[®Ó˜Q*¾[´<Ã&"xxö03ÏP9ë<ެÆ:Kšiçê.×Ö™H×¼áøJ!u¶X[îû2¡ý3b“I%aôÚŒI ¬¨JOu8“­L,[\°PxN—7Â`¤j nJ‡+£5ã­3ÆÏj¯²ÞºÂ~ÕÚ­ñ–ò+ë¦}Æléƒ#å5 JaY©œuvÎX| Û&o!yi©lCÿZûC)‘P»âD½DÚ,|ŸåSzgj5ÛJSK)ÌŒn¹‹g9ûÔ=(-B·wœó}LlËö9tMO¨.±íhXX/ïÃ÷9ôu=½G²ÅtwÜ÷>~‰µvM¬íH"ðe*T›Ø»%—÷åó2M—bên¤Æ-Ë+ë~ļKðʦ ûä•p±Î}{·Í+[;bøkå•m=bë æH¬â•mót¦ÙNNh¸T8žºÆqHW£+ÅôÆ£Èä¤ë»ƒ]|¾ÖÕýûÆ#D´Ýî,D€·| D&†s=4òÓÞ_¡½¯ggüÏLgæR=6©£ÑŠÉ‡cøéɈÍðü$ovß‚%)w¾Í}áÁÔMze¢2ÇŠ ;{<È;ÎoÔN,å™mÚ¡ñHóhÆW4Õî›Q©&·ù3ÇÍÑäÔܾ†7÷Pƪbè aŒîkÆ/CK0¡M¼†ÁOƒ÷„Sa²^ý óÏÜñ÷ÃŒ‡™C¸¨…ï„IÀÂÀ$`DžA´M¬aH ƒ š"Bâi˜ñŽã7MÐ)œ›jÀ1Õ] ìã]”ÕVn¸Ò}$–¸re̲Þo»o/ÿ³/ý endstream endobj 4326 0 obj 8124 endobj 4330 0 obj [221 /XYZ 38.2500000 757.250000 0] endobj 4331 0 obj [221 /XYZ 32.2500000 664.250000 0] endobj 4332 0 obj [221 /XYZ 32.2500000 615.500000 0] endobj 4333 0 obj [221 /XYZ 32.2500000 274.250000 0] endobj 4334 0 obj [221 /XYZ 38.2500000 757.250000 0] endobj 4335 0 obj [221 /XYZ 38.2500000 197.750000 0] endobj 4336 0 obj [221 /XYZ 38.2500000 134 0] endobj 4337 0 obj [221 /XYZ 31.5000000 665 0] endobj 4338 0 obj [221 /XYZ 32.2500000 74.7500000 0] endobj 4339 0 obj [221 /XYZ 31.5000000 617 0] endobj 4340 0 obj [221 /XYZ 38.2500000 134 0] endobj 4341 0 obj [221 /XYZ 31.5000000 275 0] endobj 4342 0 obj [221 /XYZ 31.5000000 75.5000000 0] endobj 4343 0 obj [221 /XYZ 38.2500000 197.750000 0] endobj 4344 0 obj << /Type /Annot /Subtype /Link /Rect [256.500000 282.500000 351 289.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4345 0 obj << /Type /Annot /Subtype /Link /Rect [174 212 243.750000 218.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 4346 0 obj << /Type /Annot /Subtype /Link /Rect [258.750000 90.5000000 350.250000 97.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 4329 0 obj << /Type /Page /Parent 2 0 R /Contents 4347 0 R /Resources 4349 0 R /Annots 4350 0 R /MediaBox [0 0 595 842] >> endobj 4349 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1700 1700 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 4350 0 obj [ 4344 0 R 4345 0 R 4346 0 R ] endobj 4347 0 obj << /Length 4348 0 R /Filter /FlateDecode >> stream xœí]ÉŽäHr½çWÄy€‰¦/ÜA@­tP¨tè ôh4tTšƒ~_Œ gf„;Ÿý¥¹;ƒݘ©êd’túbË3³g¿üË÷ÿ<ü÷?¿|úþ?‡_ÝŸŸ¾?5ǾmÎÿNÿþñòz8º¿ú¡=üúûÓÏÃϧoOߦÿÿùt¾áû§›þö}ø×é;üé?¦þÙýÒé~êU?ýùÛóŸc¯¦¿5/ž~þ×§ÿÃáï§'ίsƒ¹þï?jeÛQ†qãÕ?ŸæÏTÏÿþã׿?ýrž€´·X=ªA”5ö F«ÿû_O™^0?¾9îmÛŒü;ùò^ŸÞnÚéízœæ¿ Þýü¯ÌÓU†‡[Ýç{øóÈ¥'E™NE>­ªûþ|õpzokºi«©á°¸Ïr¾¹ëZøæÑ*Õw¶oÞr””µ§÷ŒÚ”ºCÛË®œ÷xÙ-7?½s>ý4vñy1zŒ>\puMÓ•ou/Ÿaþ§§}ΧŸÆžgu#]]ÕÛœ«ûòø,ó¯M“ñéÏcϵºðáÇÁezÝÚÓJŸV¹&ce2àŒûçŸ5ý{ž´±Í1k/ϲ&fÌyžŸÇ.>/nÅáóZ¦iû:ö‡Qª¼7KyžýóO€£ð3rãÇO¿|ô}wøñ—i1ž_xþãÇïOvú“k0m±>üÓ4žáŸ?þ6}Kã~`”÷uþ2G£¥ÛæõW›ó¯‡±é¦ ¯Wš]Qç÷™ck»¡¿ºçÓó•/?¦|ÛÇOëрæâ÷Çça6ãÑ#ºÒ|FWÔ'x|š‚#À÷4úÆ$f±oÐ,ž¡§E4c‹®D4ð—ç+í¬´1tO`àÏÀƒ L j.°e¿KÙôuÂ÷ÜÜK߃ç¼'F'¿Ð^ÕüR¼#á—6Æßð3"» nŒÈ‹™Ãc]álÍÌÏ%9‚½ pŒ‘Ñ3B£ó¥æ­™ æˆgW›CØ_øÔá“ÊœG¬èðî„;Ÿ‚ˆ˜Ä_ŠOjÂŽÆ[l‘ÉÇIèOü4FL2[†š7âØá{уŸ¦{ËŠ»˜1‹Ï>•p›EÎ+#©Å‰(›6fÌyrU{lFs½ªÌ´3çž8 ꣿãàÚ鯫7ç(ÊR'7(f¼m¨!Ð` ã(Îb\zÚxå|DÁFÁ0‰¡SœÜD7€&'ˆÑö¾Zo0G4ê‘+¢ž¯ù mB£Fäh“ •G×ù‹‡WĦ§¨ Í !Û-ͱëÕµ4‡zÒ‰‡¥§šÒó¥5æ þRFë2Î ãÞã{ 5Y³«ùÞ"{•ðI˜Yb,-²ïØ÷¡ŽO!ìp÷àè~`«±ó %Yñ9PFä$–†Œ…€ŸFœjJkaù…mC<£t' 5.:aΘëíõ+'ã§={¯Á¢+n:Ú£îÚEÕ™tOä=#¼çó<¹g‹-4¿&aà™lª%®4·¼ÝÑ(ím<à¨ñ—bl ºÇÀ¹vyiÀ§9?4?r5Íñü³SÜ% 2 [)ñjübYȇÄeÚ£‹ÈRÆ?Z|Œ˜ÁŒZܲûP=Ž,Ue<&”–SáµÅ+XËé~•Šû3_Ì$‘Àó„3¬†» O‚g“ÝhUçi¾-çcEu–íq\ 1ž?Y|»è”2ÁâÏ[°ÄgàéJ0€"ªƒ‘@ìÛ¹{šµÊ+oH­ïûØ8û8 )x†† uá+L•€…cÃA0*Ø&{-Ð ?}{*ƒÑ1nL^iu1É‚ÁðÙz7<· Ý]%)•’ײ0{ýT¢b‰á ®w)–±Ä™³ÎâÄfŠà+õçmÃLœÓvžŠ-kg`¬ˆõ%‹àm¹”;n –á]× 2޽…޽,Ä›’Iœ§ˆ”'ä ãƒ1K)\{ñ°þ’D‰ní)­ƒÆr:´×ÃXB…,—‡@\—»à§E82ðØn±gHÇ`Y f1Ú@‘,žÑð=î¨E!pTZáÂ\ÁEGc¹Sk›9=ñqj§v§6²>[áXª(…ö$ín`˶¯·ÄRý& ±Át·wލD´¨µ··"i!„ø”M½¨oôäOä0Íè­H)°èh¥, 9Îø¸” aÉRÊT'£ÂªÉYÖšïÖß®ë3;DR )<Kw Øá¥Âú…á æQóånv˜ c RŒDÏ~m¡Ò*•Wª.}½ Þrö£½¨%BÁGÊrfÊjߨ‹ üX•"²…¥ÞSLaƒ,°¤‡˜—]Ÿñßc›ô{ÚÙí ƒ~Õs # &[çÃŒ:ð^î*•:øÕ ¥ÐbÂõ‹y>”©ËdT!>=G O/^üëÇÛëž@\$ZºWŠ{–±’Ú.]K”…øÍ–óýµ’T.™+°·!’µ‘BA*KÃ,›ÀZÙô^ú@†…›È‹ÄRd}2¦Ô–1ˆ˜õIÐÎŒ‰ŽA#mç>G­î¯_yÒUç{Ý ]qëÐ;Ä|´pψî1ŽC¨ó¹œã`OÏtÅÅQFðÒœ'ZF8êOðÊG86ø<6<;N‚/})A‡ž†çÍÙFK÷ÀUpüFù­½¶×ÞfYOÕ„C‚z¬U&¬‹JÕÙd!ìˆX¿ (Ó»Z³ ì+1‡SÔ@¤¢‘‚ƒf0Gr}FûbË_ Ó´žòb2×ø_" ßhÄ(EIý(qäœ~¤•…D6H|ÇDY¨LÀGæ4£6Æ? ’¶R%UÌ÷£?¢­UÃÅŽÜûU“R¬‹o`ã¡êÔˆ‚¿ÈèE+Ë(h}ü˜LïR Àºæ¥¥1 f3¹æ"„PŸ}^>ÃRúd hK€Ac$ºG¤`.Uhuß{çÍàb\à† ¨`Î~öèºõ¾­p*KÞ¥3/*ñÒ5°†+RAugËmµ¿• dŸå¿3/á•QH2šKé PJmš«N sŸCŒ §PÏB¹Ë÷ÕÑ*o—<*oÇ7­dÙà‹1­¯ŸYœ­•âBÔ„Œo±8{aá¸ë芑 b°ðÀª> »:7+Hòç“tmwýJ©|’Þ3&Üé]ÊWøǦÑ=‘œó1Ö Es’Þ£J•Í÷š÷g©Z¡ F÷YQGÁŸ„º«V¶$›QˆÍ’qh¾8`˜µ>”‰_GÞsߥ*L`V”ê’âÁ«Ožüœ)/yÕ‰²ì,ŪˈðTP°k¬7ÁÃxÏI„Žª:ÅXdl°O„x òÐDF€ ±0dŠùnðÊU$ƒêÇÞÛaTZŽ#1G«T}¼7)§lI&¾+šª»E(»ŠSòHBžf$-L¢‚•Jí¹+ŒQ6ïþ®l «è’ßï÷׃¢ÂƒÒ ‡Óf7êxzðï/ÿ­ÃкîôG¯”û©=tíñ¬³šù'¿>uö¨Ô¨‡A½ü–¹zй|Çôûî¿›Ómïn=úï˜~2Ýs=’Óo WO®ßñ×§Èg§ 23ª±Áƒû bCš˜Lj#f6^ É¡½Ë/œ‡Î›wzz¦¡ˆÙD±šía#¤g·‹Ì˜ “6/Úca'íz#aa†@àV'…œAAû(Gh=/ÊÐ:ŽÐ×P\[ᆹPE(ì{C%¥ñ°š„W,& 'ÐŒH*ž˜‰7? mßÇdO¹{§ÏÚÚ2 Ãìç¸5¼ÂlìH?n|P±š]ÊŸ|‘Åí›õ­ïSì4ùè2Ëâm^këy­í¢×Ú^k»àµ¶/^k{åµ¶ž×Ú.z­6ðZí‚×j_üÔöÊkm½V¸¿œËÚ¾TfêF(LõCíÏô=+¿Yg—¹Ä ¼ƒ±±Ž "Xa½y  «ÑŒX/ørúÐãèK”B0G1Þù ¹15Ùy;/TC#™Øøøá(9±˜â™¨ÏR…þìµÒÄ¢Â]¶Ò§¾3;ú”8•môU¥w4ëåH–Î6"`™‡é-™2ãÿÛûa{ç²½+KYÈ»0:s¢Á­ë_кíÛ¬9å®ê¼ù(U s§Öð$ãíÍ‚.F®4½wY¸úu÷%íx£1ÛV–3:Ûaæ¿Îâ½Øu8‚I®ès­•÷ 4ÄT¾ÊJЈ ÁpBùæƒ80nľ^Nõâ*^Ï ðàoK¶ßóJ¶é“|¹åW¤.»/`G]öUÍso:¼ ²ØißøÃ)g8Ì`,gfb,'½Á+8áKázVø=8…ÎÀjÒHÚý˜û÷õÖ—j=¶¥jñ~ô·,åò1à¡6'2äÉ[–u¥ØÙEùº¸Å"`Ó7]¤e æÛ-`Æ<ÁIøGªp4ˆHT®i~©ÆUíÏþJN5,•–s9u¨¥wøšÏ`øs¢ob Ã1—Ï-½Ñׇ#ÉìÅ$&kÁ¦%6¼-¾"j^c3ÞâÊ\ÄUBdàð*๶ÙË›´6Þ>’%¾¢¤-à R(1^6c@6Ô#Lk[Q³Mcñ¥[5C¸Ð&)¦û˜.ã ÏB4àû‚ÂïÍ—¾µ@ »æWöЬdØa™./Dã)Jˆlf™#(¯+áÇ ˆ¦s ÁMÆ (§ŠiOÌâçoF þ•²£E‹)6ÐÆƒQ‰¢/)ÍzDJŠálû«ZñajÅÇé7®ë¸O?ñkÅŸË\=Å\¾c®Æn¡V|[ï§ŸøµâÏ¿5\=e¸~‡ÃÙ‰ä0š€:6f^+‹NsD,xfG(0¼ç#ñžOðµZO7ÄÞÔ­µbŒxH)Á£‡‹>¯¤ÿ«ºÍm]j«½mX_öKé!N`+LOOY[˜Âù‰®c²}$„ó‘ ]Zª_»pAge(+ÛèŸw‘jOQ3[ÖéÙ4ÄÁ$ÔJÝ „W ñ¼°Bä¬'„(ï3I4À±7ñÓv’gð¦zÈÚž¯÷u¡ dyXS@"ÙBÐàÅ_+©vJKH-Ʀ`ìÚ„\ŒáN)ÿätšÌiqÖ»—žŽ¸‘w¤t gÒaº5œžA0;à”Š? ·9Ç<¯¹è¥óèМöütxúï.€O?®`½óO®¡C÷[æê)æògèðôß6€O?5Á;Œºß®ž2\¿£thN>þ¼èpoÐaø¡xhÿ«pgƒe‘öá¯R1?ÊØuÞÏŒ2¦˜ ë{Þ¼!¹¿„Fæ·³ºâi Yw„ljg^º¡…óœF§nNzÉ&E—ÎÛ5ž"  »rcvë—‡ñœe‰h„Sg$j"Í e(Þ§Sm‡+Û[ÙqÁöV­òìâÓO|Ûûù·ÌÕSÌå;fÛ{R? ¶·²ÿŽé'¾íýü[ÃÕS†ëw±½Uû¢9¶÷–lï/’¦od.š­úWhþ×ZõÈä\[§<–®0sŸù@|…ñ¥¸2OLÊ5^Æïì½wºEYhÀñÒÔ)¸¢ `ª0àŒRöi Rü=î`'½Ç QeZ- ¥yÃØ7udpÔ ‡“à=/õwá¨oå-ÝC|vÙ8z¾´b øìŒ^Ý3ÍòÕù}0ÝÌt›€i>£+‘¢}ü4 >0$Ò¸+/¦Ë&`–úPS1˜Ew/Å…¸üQ¸S<¦ë=ÔÜl Æ/˯p—çÉ|^í³m ,9‚™ä\¦þkz&3¦P®pÒfyn²ÖY¯êl'y€&FænfÞBçö¾Nt$òD˜Q Gß°ÅDÅ`ƒ_<‚͘’9éÿzå1QZ“ú[Di¤D+ž>æiÁwm–.*k¦m¬ÑS6·P>rp1Mê­4€¬$yÚW¨ ÷á ?mk•âs¡4ø=u²KÈõÌôÆžã߈R0É ¡=ERÄW) 9Ö¥\Wº·ž˜0˜ã‡LÂ6!‚‰žpS=õ,a¦EVe†ö†ÛkIÄÆúé bkï ÷‹£6ù9 Uë­"¥€qG¡7HHµw)‚iÙjo¦Í²ˆº(ж;"(Lgü=å c§ÞìTŶµZy_ý^ö²VîwÞ¤2B[‹`Ó¥³ŒäÄ9±wMÚ_¬1NŸÅŸg– ²«zq:³ ÌÏ`[Œ¥#ÊÜÌìëÜNn^ºÉˆ„"ZŒ20Ï%]6³lN×1æ¥;pÛ‡)“ÜAü¥-ví°;x«ÏHšÑŠ¿‡¨gޏÄÄšF@Â_Š×ô–ážVM&æF¯9Nm{sêe¯àͼ?+é{4¼Çâ/ÅOƒ-Ý,&(ºaú µ}žÄ€úÈ(_ #™DÏ’FŒ&<2«ºi½hð! ®ä‡ä®jõ\™Z¹µÞ0ãàt«ûÆMï}ÅqY(q nÂÖgB•1ÃRÇ€ 0“¨˜£Ê8³Ìrii+Š;gã5ú‚.;~h´ñÞ¹·íÈÓ\–ð>3¬| p‚C^IÖêÎ;_wíOç,Fk|I$ :¹Â¹‘ ­-EÒ(oÍEÎL×à¬Ü—5U•Î4"ƒúÁ7êwŠtåôA]ÂÕ…EZ¦Ç×ôÊnÆÏ"†D{Ð0!ÃPPmØ‚±sM•›Ç‹¬_=V+€‹'%²`xlÖžsÑJºb'öôÒ+¡™Û— *«–ëQª€6eçáqL½L}&z‘Õx'¹W›LbÜt “D^×Nšhl¦ö&§Î{Oi¹–ð Ä@XX´–—ÚÑØ°±èžˆÉ#RÈ.¢¯V~Ã_n[8õò„9;ñVÅæ&cˆù‚õAdfåR ¶s®;X¶á_Äï!¼Pf¶ ¨ÃÞ<ÝèéªÄ"¨%[ìÏçD¥cRQù{'õÞ¢¼á*´zlFÕ@›"ÐB4í¥#Á™E&²&’ioñ(›F"%K¸oìzW‡ÊŠ!4ΖSôö*BëgIɺ±~C˜™ÕPíðñ m7‰ÐÕ;N¬¢Lü¡í oŠ ú¦¨ušO¥ä1žæ³Þ2j*sï2éjoxdåð*0ô ¹i™~R¢‚M¦3y:’ºq]†N_þà·§ï«ú+‰fu¾…L:È‚@„Oµ˜Âe,0ƒ-»ê¼l€"¶Ï!y³ò(:Š -¼3¡.—Í4´]œÄsNÛõׯÍUç-ßÓÀœ`ÿ Ÿ†ï1hÞ\ÁÒàØð*DžÖ£±á§áõ‰¼~)3ב•ƒ;$²à—FÖ”y¾ç,N´ O žÑ^ÉÞŽš9¬"“¨½CF˜³¥˜má{]Ï@A"OOßmèö،ކÆ@·¡Ã–[‘U—hÚš’&ÇÈô´æò ²‹0¢Da/‹ Ú1¥g‰’X “lX‘H…Ò_ן¸ì^C«¬§ˆ(¿g=ã´Å}l‹§ÚÁû^—:°TLyŸqÑ(Ó Ž€â2Æå±˜—ÛFZ®tS_s a©]ä 1£áá{09ÁEdàŒFØ` \¢ah!ÚÁ¸ 9 ;ÿÌR©è¢œ£Â‰M¢XSDS—­aÊÜHeô}(¼I)¢ŸR[ ]J ÁJµ­(óbŠøE _Ñé’=Ô ŸÁ$N¥ô’ª¬ }“BÙ ¹Á†G¯ˆe4ÚE…«Ö |ëKd[”=Q8i kõÈô'D´e™0²½Œ& q,¤i—ÄjDôÑ?OØðÄSŒ)v†{o9Ï•¡H/•ÁIEÖ‹`Š]??–×ôžŽÊ¹½½ºù}ÕKdn°l”·_Ü-á?gRÄL݉Ä#ÀÈ*FÇàÓ"ô‚W %¨ê„ |šëƒ™á ÐXkëí0Šà«†„XeðƒB•{ŒsŸÆJbèvô5\)&€„*‹í9]T²vM8²UK;+ýkP8Û iÑ–0ÃRmÂÚû7$ð†Õ‘ ¸™¼BKV@ëöþÌ•’‚¸F¯:Z@Y 'MÅ—6‚f°;Ü@Ú¹0iõ)ëS’„í&Q•úmæ|°{0¬eÍ Ê1Á÷Ȳt>ìÛªnÛ¾®Ý½ë&*/qŒ-!BÍ—~‚öZóâG¸æ®¹Èük´§êÇk Ì´ÆGa<ã8 ŽÊDâBDö|Í‹š¶¾nŠGˆe÷(­í5’2ì›÷cŒßs%§˜í‚­ ÂE+’Ý'ê@½¹X-ò´¯žfUçÌ0xç±X8Q]¸Àg¸£¶°};ˆ$u‡I(»þr­O ÉÚi>ïÂÁ‘¬µ½½üA ’µÖµm|=²üó›.= ÞfJ”vece‡¡àØ2XGæ¨ÉZj­};w÷L$¬¹-â3) <ÓL• ›ÂéÊÒTh7ΙpSû"X»V dhÇl0š@º1JƒÑ~ÌõG€Éð=r«³ÀÓj Fè×﯒7*rN^L˜’\°'ÂÜpóès`¥¸`›cÀçiÑ·díQ°Ä~Û¤K÷ŒèžÙ€Ó¡w^UÕͳ˜i“%í™v3gæÂ•Rœ™CÓÞ¶3™“Â0ãƒ!Ú$“búL ôÀOˆé‰0”Jw-äÖPy;寮=aù#IF9¨«Þ¥;(HÁ\6 èåL5¢“­ {û ‹(ÂmÃô?c܆1j‹Ñhæ”'€ËLïg&P)*§e+âŠÁÕÝ©³Þ/E‡VŸÃ±fC5Úx ”‘=̉”írºÅØ<žQ+‹*¹‚„;é\ \ÀôË\;Ɉy‰®÷Y4v(ìÔÅêÖæLp·—_'Óe}R[$!k{]° ¨ÒQyÍÎädld–3w ‰Œîkáò®½ðÂßU‚P°-šÐ,Qߥ{ð:­¯%ˆø1 ÕzÌáf,ƒI "¾âÚ-/ #¹!ê3™¶Š‘–à¢ä¾ ó––…ˆTÉRG½!8'~;zªo;™±{«ÛrãØzèøöj"fšD¹7…Ç1ØH)ûpÃÚ8´à-]бsfCìÜpvn76;‡aüé_xšëÆÛM°[1;7|šnÐ=Í×ôïqÛiÒA-æïàÓà•ÈØ>Áy›1ó,ªB±ô<ê&·)âpDZo½Á,p“=²s÷÷Ô§"•Å~ºh"B ,;4¾e:@‘~Û ¹6 D§[l5€Gÿ îsˆˆé6ýžÜÌ•e;µå$@׿%­‘%ÃÒXE¥¾ˆd³nXžÙó6l9©³ûÝC®o'!b¿áE&’Hds}rpeSÀ Ëp}ˬT¤çžœÅ§õ•ÕíY£„ ¸1ìá 6”„žáµÂÅÂEB–|Š@}äÒ¬8_²¹4»È‹)€»–˜0&ˆ"bØó¬ƒY[q´þ\2æòzM ÷adø‡«gWR%Œ‰£QÌ#¿„½QŠ^w3ªç L6i'Lô=ÔËç(`ˉjZíéÂÇ *¶K…Eß#çtÓÉ[T³>æiDý}VuQø#a1&¡–™õ©¯Qp-ŽJ@Yó:¢æ ^}¡ôÚ”6¾Œ„™„ïM¹¦;Ó"›vNÞŠ×ãRôrºBeÑj:Z·÷ c/K0†G^Ìç3·€Ì¯õÖlEcÜ×Ç8ü‡à_e …gîWdÔx_ñ9‚N+"D9€ö¦­¶lMPàøÃëz×^W©R0fv$Ò©"Ô§ð3ÐãsÒù‘ÛKµ)±¹ÏcNµ®%öà9›rw³bG\”\]¾<º$THð+åún¦eËHaiÓ…TïCîÄÞË›,RD„ ŸÛ)ÛÒ8b²•â–Í£ÉB_q×cðŒk¢_+™WgbëìâdFßZªW˜l·p*¦M8QXK$«´½W™¶Áw¸Ö··8Óœ™©¥º <§-ÂYL ½h:cŠJdLkQ“ê‘ìx‘ìL`ü¦‰dª*Ëì»Cê|ÈTxÈNgåù¨Lï›xf\¼øÁoOß#¦VÍ‘>^Úh9dSÍOYr¥“Æà3Ș~ØålÎ Ì\yA,Kä=ZUNÿx‡W¤‡g©ÀW‹[_-¯g|bü7&Þ°·v)8!O(¯U7EË–™¿©Æ|8Sˆ¡WMˆ†­÷¹ïSÎ0è/ut±žmÏCÉZÈqU½{ÿT3áO™Ý2ó,GÎ]2pÚ/pÔ¢­$•´¶Ëäy‹ãõ+OŠË^»D3•txÅ}twì‚åÞ3¢{œK®zd•/<Í©Ûþ8þƒÞc>À±}MõLf=e7£6¸‚ÇææÒ{ˆ±iF0;³Ickà=pð¨€B‚ãëæŸþ=üœvyô|»õ +4Á°Øjw£Nû|ŠÎ_¤ ØÝ,„‚ø¼ãôB#¯n¶ƒ+æ³»'\U…Ýgôs !]ÛW÷¥×€S86dýMƒ±‘¥­®oHYìº,|†ÂOƒ÷8ª’>½ݶì†;ý}ñÿ|Õž˜;„ó™%¼÷ðœwoß{}cŽNn­Û„7¯8 ~Kz¾=ý?ƒ<ù¬ endstream endobj 4348 0 obj 9007 endobj 4352 0 obj [222 /XYZ 31.5000000 764 0] endobj 4353 0 obj [222 /XYZ 31.5000000 623.750000 0] endobj 4354 0 obj [222 /XYZ 32.2500000 377.750000 0] endobj 4355 0 obj [222 /XYZ 31.5000000 471.500000 0] endobj 4356 0 obj [222 /XYZ 31.5000000 379.250000 0] endobj 4357 0 obj [222 /XYZ 32.2500000 762.500000 0] endobj 4358 0 obj [222 /XYZ 32.2500000 623 0] endobj 4359 0 obj [222 /XYZ 32.2500000 470 0] endobj 4360 0 obj << /Type /Annot /Subtype /Link /Rect [138 778.250000 206.250000 785 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.gnu.org/software/guile/manual/html_node/Foreign-Pointers.html) >> >> endobj 4361 0 obj << /Type /Annot /Subtype /Link /Rect [440.250000 778.250000 510.750000 785 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.gnu.org/software/guile/manual/html_node/Void-Pointers-and-Byte-Access.html#) >> >> endobj 4351 0 obj << /Type /Page /Parent 2 0 R /Contents 4362 0 R /Resources 4364 0 R /Annots 4365 0 R /MediaBox [0 0 595 842] >> endobj 4364 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R /F1700 1700 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 4365 0 obj [ 4360 0 R 4361 0 R ] endobj 4362 0 obj << /Length 4363 0 R /Filter /FlateDecode >> stream xœí][¯ãÈq~?¿BϬe_H6ÀÀ\ä!À`ȃ‘‡`Û0¼F&~Èß%µt¤n~Ev©ºII½‹Ý™9²oÕ_Ý«~ù×ïÿµûË?w¿|úþ?»_ý¯Ÿ¾¿5û¾mNÿìÿþþúÚíýïw½kw¿þöös÷óíÛÛ·ñÿ?ßN/|ÿôïãïþo§wÿ6þ÷·ÝÿsüáŸü_:ü…ßÞzÕ¿þýøëЫñwÍå×ÃÏÿúö¿ÛýãðÅóp~2·þ½VmÛéÃ4f†þùv^¦:þûÏ_ÿñöËiÒF±F)mwÊšñƒÕ»ÿýï·?œ?ßì]çÿ¿gîƒWn71ò`•ê;Û7÷,±×ÇaÆ_”Æ×.èø¯ÌçU†ÛaÈ÷ñãÌÅwE™NÑ_ÏLV­s¬ÜøÜôºµ;×ø—õøûÞøîÛQ§Ô鸆6Ãy]¾žƒ†¦Í÷ñãÌ¥7åLhðã™él0|eYk« §¶½ó$1þ'NWŸÏðñ®ëó}ü8sñ]ñôL|=3|ˆÝœ6ÍL÷oÛåóÎÄ4]>p<Í\|WÎ}ý[ÊWðTN?räOâÅ?Þ~ù: ÝîÇŸÇ™<ýòã·7;þá 9ša÷ãO»çóá»{³{kNÂõáïžôÇ'nÓíõ“Oè¥Ñ;ʦ?iÚã³omçú›'οÓÁq+%f€ÇÁ_SÇ'ªÙw½:LûýÉpzÒî›ÁÜ®ŸÜÇÓ;úühÉ ÜiÖïÇâ§döF;¥Û% 4 ƒd |o$>d|”øÀ Ñ6_ŽOÚóÛe üüié_~È£¢ë®–]wµüºëA‡÷҆‡·[9xpSmçßi¢wÂM%Èž3† h¨á”ðçŸÄØgTˆ"xéúýZ¼¿Š‰ÿ@öG&ºyXß^ÿàïoß˳Ñq Á½bðDbï9T†ß1!G?À| ƒÚ^ÏY×r¼à‚‚—C%Á5ñ 8:*E%}z¢Ô˜–l$ƒºfƒC]°‘G„~ÔDX]¦Ó^Ìë11F QJDÓÏ3²Ög:}~Ø÷]{ûy=0xpÂõ ·€"†BˆÜ‚¿­~žCv„ É o‚ÊâR ¬)úCÀÃiM%C5ƒ °ïA%Þµ˜*¾Ä‘@Í’º”˜—½dØ>ÄPèÔRåâH»7Ú…Ò®[[½8Îa©~ñrò]F)îlmÝkˆP[évÚNÒðIÖMw;äA5²·R¯¶è‰_Q·÷BÛÕ;à;zÇœ(x<úËO4üÊ'øä+\‡ÿšÝ‡2¦W ûýà‚wü=˜˜íYâŸøZƒžàµk¿û}¤˜*¸xõ>éÐ ðJñ8º)tãu«6£¶Å( XãeHÿ ª –× IˆW§«¬j/íLxÂΫ‚'2ŒUÁ‰'ÍgôD}‚O:ø5øñäãÌ;/É.‚=ÄD$ëfÃø!¤¦ÌFMQ†<ë.ºS9Ï¡\&Éž„Ue™r¢½Á€cD`ü!q:El´–ìE×c¿àÞÏcšö–ãNÁýêO.6Î艅lÅ6ðkξã)iꉆOð8pÖx¥Ó…,|–µN‰ à °‘ƒíOíΗµ)?±pß°XÖà3Å{ ÇÑx¯±·:UáY3“ÎÔ`¬ ¢÷ÁB±ú¯èM~íkEÕ-?Ù4zã¯ÁÓ®¨zªZ³º¬¨z±ÉNQ9¤>…o-œqÏòSÅõ£*–U7LU×ïÀõNo½+®“_ƒ÷L1ì#ŸBÅèçÃuøµRTU1úŒvj3T^1zœ5¦rŒxœ*-WŒ&¥eYªªHÌGbÛl‡–+³Æ4ï¦Á7ßgÎ; YµéÐb+:ç>ÃYËò‚-#1–|“ªðJ æŒ}Ó˜BD)qó\B wÜŒÊ%Äm*!ñ­åP¬ÂÜ΀’ª^°i.Apʇ¤ªªÜøÆe¡ÿŠøLć3 "ù8~,ì…­öõçC|,a¯NU½ï@ï¶ß ýWônι£I7ËBDäB•°_½ M!ªª}F÷Ýf¨¼b4OÂ&0Ï‘‹QÑûQ1š#a—¢ªŠÞ½gª-´æ¾Â*ËÆ)lfÓ¿FÔ~Ái±œ gÃ)ÓÃÚ7Nf>~§ 3V—®aTŠkÀTd"!§/‹Îb7Ÿ‡?aTkÛ©ÀIÖÁ+]³V„¯Áöά|,FRe¢´.ô¤EOªÁã`˜,Uþ“!:ÌV&”ª²¿Z]·¶n‡ªë¦p]7ŸÀªgÞSzUñí¢¿Æë­qjÁá i^Ÿ˜ª†çÇ!ÖŽgÀY)œµ¿SZÅ%ÏñîàÊr¸R®S—£º^~-¨»”%ÀõããHo𣱏^Ñ×å,‡#ýrÊ!A¸%dé²E­î¬ó‡+41j7d Ë©wâTtæl$Þ·Õež"5/köŽ(„A šv9(\1‘™ûšÄfõ Ú¬CÄ~¿ÐBαe6оæž—¬‚å(›Ü†crên±ò*ìÂj@%Òãs[ \QÉ×Õ[ÛÈ6ð.Gž&Ù²ŽË ¤”Æ\J€"6…C‘œQ¢w]X\^½^ÿ,íddIƒV¡Hô¤¥üY¥„96­h¸%Ã>úÐ5ŒÓº@r¬ö †_xØáËú“–×§&NP´åg©¥ËjáÄsf-»;œ~ѡىÕq€Ñ̓f#Ÿµ9)!gGC,€#j°ZxK(C²¨Nè>|ÿ·Œ™C¡¾Ñùyýƒ. ?u~>ÉNšjhÃË%æ÷š»Ïývú{fn-ùlêUµœTË —›p<²¼‰#ß1®‚¬ˆå„!¡ú²"'ññ‡(Àq8f韑¶Æ…¼py á.éJ*Û{>r‹cÅ•£WOsõ4?”§Ù5]põÚÓ<õ5œlÁHà ÚÃàC-vØ >X5­Ï$yÁ‰ºe0Œ¨Qk¡m5.4Ø“ü®sÕ¨pÐëÆfK:OO´µîŽM­ûfðM­ýŸG]Õ¹f×u‡_z¥üOõ®k÷§oÎ?ùõ­³{¥휺ü-sós=Æø÷ýŸÝáµ]ðvÓ‡cŒ?ß¹Éáo¹›¯¸Û1þúöñw9Áíx½:7{#Öe1ás„5¾,8åTe'ç®÷ç\XÈè2[˶h=Ú×Q„Óú’ÈòlzkBrÇÊ0a·+K?+r’ÓÊÛÙ¿à=䜕ìîú„©S„©6Zͼ# wè@î0“r‡‰ä3!w˜‹ÜanäÈzRîБܡ'ä}‘;ôÜ¡ËÊæBsXsÂÂ3Ö'æÄ÷œò€vÁÚ*/¬¼°òB1^˜t[ž”c%S8T'§¬â !½c+##‹_,ÄdÈí¤ ÑF2D;!C´¢½‘!l CØIÂF2„!ìE†°72„-+C´ííé¥Ypê Ç8gIÍ)wØ>Ø*w$É,[T€á–aqÉ„°ìÁáÄ<.Â}_5–*´0ÄC"PœãÈÃ7Ž“ P€×»ßeƒH×GÖÈf]?àÈF qô5Nn‡h–«¾'Ø#UŸ®útÕ§“ßy}zhCj[út&ÉÂ/z8W9óÕ‡§âÚ9²3§€$#¢••3%ÊÁXµð8 %E)nýhÅgË;`žÖŒ„Ü œB¯ÂÌú¥®¶,Ú0¢}j““×CÀZY‡·œ\Þ·¤ùî î’z‡{ArŒ~xD 1²Å=9`1kN_]¼R\‡»ÿ¡žhfì¨Å}ppÑ0lâp—a+á; ÷Û pEá)[9.GØÂ'Ÿg®+~'g~RÞb¢ØCšã9¼ðYqb09–Q,Å0$YöÂòõÁ'QÖÛcyV^8ønyHIaù:k* WæÈ Gê–½æ5®þáãêK<;¢b}·€&ä÷oæJøý”v¡îôêÑÖ8ä k«™³¡ªùm¡ªé!¬.XbÌaAôò>DDÜl$©ËdÏ[šG$¬¹PD‰ è³PDI8ì«eýôzÀÕf­XmœGˆhOÖ7ç雯 •2×õÓ–Ý2Ï©Ý[&Ôô]ZœÊð\Ó¤W«Ãa½ù:ó°&–CøÈˆ{Tä0](nçgˆÝ‰ø¥Úðˆèɵ —ÍÙ°õ¯æÌ,2çÌä®ráOM®³š«i°¸i°q‘L·•ðݼ,]©S!Ë«•IÂPª Ç}¦ÐchXÕ è÷y ©[¤¼@µµ.ùÈæl­ÌñºŸ_ÑÆLµ}8õ"¶mØ‹°ã‚…—á:6ö™˜ÙÓ¦ ^ÂrΨ½¦~ +Ø Æ‰Ñ]7óH;MvŠÂ1«SaéN…LwÀšašÙ¾°S¡é_Sh}¤ÉÕÂᄊÈ­ 'ô"2Bg#.ËT¾<ïu¤/”ðkõ&V¶”èf]O½ %÷Å%‡H[x@×SÎìg‰÷|§V³Ä¥ÿpÍ˜Ž˜j͘¾ÙÈš1]3¦ç3¦ß…ÈWæ‚Æe0ps©š1MfL¿ŸÕ¬+ çl|ºô/zμڼYç­¯™m#!L%¥xˆIb-Èa"w;„k{$Ü g}m7v…:Ù«…@aÌÂÑsŒ*Õ¬F9êâgUð"Í©Fùm€Äkšn^ÀÎìünúðZñ1¨Æ…㾈“A]â B…-w”[¤|<•3ØñKÄÁ;­Íùu’|µöf ¸2V/VFî0€eö7{ØsEá¶ GÝ Ø¦Ù{^°ú68®Z˜‡JE®´i¢;ýå†Më‚U³ÐxNRÎk»3.¼i„í[è°U/çêsÿ’càDÀq¼5Œ9²ör~\·ÓvZœ>n»6úvÈ‰ÆæÚ¢'~s§Ú±@ïàqpsw¿¹íåÍÇô'žoŽôØÜ^šëŸàFóÑÛ¸ñûÙƒ7²7îöÇôýñìHõ±#µƒïÀøvõIO<úãwò‡$è>ˆãÙR·3áª=œª} 8φÀ)'ˆ½t 6±GH zÑv ëŸ~B§`Žç€°ˆâe$˜Ùe£3°Xçh(IÆ©È Þ\Æ^̶¦˜:Aˆ)˜ò‰'˜†à.á¶ œò;ë¯çŽÊ­w rù+ŒL#äIËUìÞ&Øl–qdª¬ s*´gæŽ AMÛÑRi¬-`xg9µîÂsò…^‡ŒA´^Th‘0Ó0¢Ê˹ ÝÙË˲£r–ÕƒìדZ_ÙÝ€ñzy…MŽuŒ8dQ=¿š@ÓÄ Ù°«- ¸[M°ÊÊuUÀU8!øp·ãJÈ¥BêKù¹`\“9;þM¶Ÿ¬OǘUqܸ²b¿#²Ã4FŸ_Ƴú"ÇJr•º…[æ Obú`8±Él¬XŸvá…Ã]„Ûñ3|‚}y°*O-õ°± Á±·—$~o‰Ì–L0ÓÇ$dV=2Î `Õ(ì~ÇOˆÅ+ÅOðJW¼~Ú·ƒ¹º k¥æ.)’Ç-jJ™‰h•Ž×‰ý]µ‘D]6Y%uËñ1ÕÜ\Í͇'ObnNHX^C}¿)å›d\0žÎ-–bÈ.¬;²Z¢8ž,ÞH žå ßCgCûѤ›uZÉ›ÂÜSö–c°b\Â8ËÑ„ð¬—w9ç”v(–FAR©T´B‘ê„Êò] A2÷ >Y[Ä’&Õa'ò-°1 g|ˆîô¸—3§Ô>§H—gZf~>²Op.6.o°ISÃt(p½`çíPxç9OdiÞà<|Ù^ ˜úà8†CËœw Zqv‡3kƒÏĠ³€þ;·*çЋ0]bª+¾àL\¿™ßÀ™ˆvÄ20ûó=‚»áõ@ÄÆ ­Ÿ —1Âq6qN›8S<C&ŸAÈØYçƒ)ŸOA>Ó5Ýì|ÖRJ·Æ4Yé°"dEHq„,¦Á¬Äx¶ŽÑº½;a ÔìºË¬ÎÚÊîšµ…­99m±í¯¢|SQ^å[Qw«(?µÛ gsçúÁ,Dð?§Ý §ABp §h3§O‰ÀheûijHƒ›]#£QÜo2GFñ(œà› „ÎÉx|PÑ;%ÌöÏ‘ÚvÑ6Wœ˜>N ­¯À_D%êÛK/q(j)¬C#zÞ3x<FìM0ÀYËŠÏZ1æéÏšØÌéðù@¯G®ý‚;ÓëÙ]äì/G¥Qp¯ˆª¯˜ÊñÍ`ÈYÄ Ä3À‰™økX¹fÜMÖŽ–¢Œxx|Ÿ9fU•4þõÃ=ápÂOdi¬”ÄбÀ L#(v®<´ŽJ˜ƒ8iè…Ìh,½¿#j .‰N¿éφ¢ÅZ¬sTtxTt¥’r½Ówsî3¤>Vé†r˺ðúRõëœ×¬ËÜ3{WÀ1ãžq,K˜ÆO ÆX†ŽJPÅêZråÂå¨ên_æ>wç`õ¢Üú½âó“Y®…¹´™ˆÀ‡#ìš/¾ÏÚBRŽâÈY—)‚[ö‡°’ÎæBƒŠààÐܲ‰é²rørzvEHiì|6›xåMËh);·,\bmþ¡íì=«rtó|rôˤŒU©¼JåÅQÕšÙ™²èŸ=.\“vôÞ0Uû`8 E¥¢ÛKÝôª>ŸXù{Õ)iNYeœ×Ó)×–‹œš½UÛlª¶I>)•†¾q-ÃÆ­ZFÕ2ª–±p=Ö2*Þ>¥ÄcF2™—x°¼Á‰Àâäƒ3J¤l£«GU|ª=aÓ;º>F_£êøïîçŸ$º~›û J¸ÉÚÊìÇ£g¸»x7½F5U¤åÄ[ú‰ê§óÖ{}쉟C?ñ…|ôÞ÷Nˆplª¶Ág4Ž™+P15·¯~¥Qûo×Áíìû”8Yå—-Г:®Í;ÂL,Cá¯Áw|!•´ôþl¹wøý8ãóÌ¿ ±4\Ax øÙS…/><>E…{ÿå8‘¤{(› z‚Žà8 ^;¯®M­¯ÓÝO{}cö·–!AžÍ5‚Ï¡÷îÛÛÿ¶1Ì endstream endobj 4363 0 obj 6684 endobj 4367 0 obj [223 /XYZ 38.2500000 224 0] endobj 4368 0 obj [223 /XYZ 38.2500000 65.7500000 0] endobj 4369 0 obj [223 /XYZ 38.2500000 224 0] endobj 4370 0 obj [223 /XYZ 38.2500000 65.7500000 0] endobj 4366 0 obj << /Type /Page /Parent 2 0 R /Contents 4371 0 R /Resources 4373 0 R /Annots 4374 0 R /MediaBox [0 0 595 842] >> endobj 4373 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 4374 0 obj [ ] endobj 4371 0 obj << /Length 4372 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯès÷н€ €½9Xx‚;N`ÄF6>äï§§[Ý3CõWj}]¤(5½Hv<²(²X¬7¿z÷Çïÿ¾ûço»wï¿ÿÏî‡áï÷ß?Uû¶®Nÿìžÿ|óú¶Û?ïÚ®ÞýðËÓ×Ý×§ÏOŸÿÿõéôÂ÷ïÿ|øé;»ûÓá?ïþú·Ã/þ£çÿà—§Ö´‡¿ÿ}ü»oÍá§êò÷óïÿõô—ßí~}ñü¹a2oÿýkšÚ¹çiL|úëÓy™æøç·~}zw"À¼¯x窦ÙïüÎôÞîþû§Ÿ8_í;ïŒkmí?÷o«ºëìáçÖ ÿ°oíó×MewÆöÕÎ5fôñãác ƒg®Nó< 8zì ¯6ܺd» cO:×Äü8suªœ7¾ï½1íóFß#JNkèí@}ëÛ$º þÞ< Öæg®N•óæâÑ#Ÿfo½6ü Eô÷ä2|Œ ¯«.ÞàÇ™«SeØpaôØÞõÃ)icì÷eô[Ò7u¼Á3×&Êy»ÃÁ?ÏÏäô`d~^üîËÓ»OýÎ4»/?&vüàé¯/¿<ùÿ<›•Ù}ùq÷ûª2ö»/??uûÃ2[çwzRµè‰ñð÷Ç'~ïÝÉŽ¿<±§'Æìkßt‡‡/ïÔÇ'îüàÕwºùO𠌃³þx|RïíÌÛ'Í|˜ ~g˜ÁË/0ñá2¼‡“…„´møÎÇ/¶½ãŒ7`:Óv× ÜÐï«~³K zR}€OzøÄ¢'xUŸ|‚O¾SÁGø\)~"P¯?Á+¢¨“!±æþü[Óaž]¸¤YÂD¨£áG¿€ï2"wÎLÔÄTÀ³¨ƒ5ÞŸoç¯Çù„gæàÃMQ‘¡/æ>á;V|Gàr|2ûG8xÐføÎ@(ºMÅÿXnààïàóŒ-W,…®2)Omëî8µÊOty,•oBxnØÀÔ©°„ÄsÃ\®ê;âwð ¼0¬%tíÆßÄï@îV )šTô¶È€ûdÃåð;5ö9ŠtX«tPå”ÒÁ3É}Qžh¬î02 ÁZ,ÏC¦·ø80Î~‚…tñðÁüÀG¡qqëú`SRz°Ö%×\±©ÀDÉsŽú,ï?>Îþ 1¤4çÌ÷‰ÏCÅ<&äê°5ADc®X<TìÍt\u‡]›æ<7ÝÚºkÏ_ÝXŽFYë`ÓKL7&‚¯qpnBkQìcÁSgñzê$²r cga¹ iíðÉÊ8óçKDÐ3 å «š;¬)/‹†OQ*R[vn-ûS´DUC¾N5·(Zbiýa·ZëTìhi=ººm:§XåÅ*$U}¤j8¼÷0ì*BzgÌÊ9B%»_‘ê¤/p{^`Ñïŧ”5e±qϧ\Ú.êìä ,ÞfU¼Mñ‰‡-–Ñ‚žbòßYx¾º§6¯xÅË(^F.^F‘·Û´x¼ë'ù_°7˜ ,‘`ªÖáæ©ã1V机›.”|œäq*Y#$h±DIÈMå×À‹”äÌ/‚<•¶OÃcÖMóX &ã1¬Ý’r…_w)Eª}tLjc•eåÔŠ§ïBöeÓ˜iî[Þ’(öeZ®ènIÃë”ËË'«²±Œ6u6[s>Qò—è{‰¾/@·4gÆ­¶gy[¢ï%ú.óÁ£ïm=µ£ZEèÆRR¤½'‘*ݚgáN 4{ßßu(á|üž$\Ñ™òÄ©[§×]86ßhèDÉk÷‚(Š»¤Â@¡ïÜíŰLu'S)ÔËâehJ Ű£ÂL<ÜJpFÓW<<ž=îPË´ÄËÀ…¦pT¯D¼˜:3ºsK§ê›7ÙtÞ øÜ£yF‘4!ðd…>Èø; /¥ªðOq3ËwM ¥² -DT͵÷Áª…ÞæŸn>Á£ëB_tB]É?Ì?Hƒá8knB—uâX Z‡è ?çîQËßëÁFÏMxGU‹.O 6ã ‡à7l¬ 4 f@Ñ Æ ³ˆâ¾7}¨ä¾ „…Ð-œ°t&M¹¸J½¯C¥^ò,9äY˜H¬îܨ“ñÀ‰JÿR˜~R¦Ú7­y#â„s:ò;Ù*XLðf™Dº\×8^wÍ>cÖ3ºÀŽ•;?b˜ ›>*Ñ<†‡F1»ÙÛxcÞ†àRâõ0Ö9a™RëL!¢t»ëGt-fœ£êý)ˆ¸xó„mÕ Òâƒr{®ƒ ’øsÞ­m꛵>##𬿽ÝSÁ,ŽCÙÄ!ŒÕ$i྾”Øát&ù‡Ëò˜„*ãöPe¸ü5! Hßד{â˜kØ¡!Ê™>´BgS¦Œ»T8™®š2¯pÑ9.«cz`>øŒ/}åÜä|¨ÒrÕѨÉÔ9KCßÚNŸa]ÔX⺣ #ñ9!ð®qpJ·?2Ýé†Ç„²]&DHpHR^nïA›¦øËâ©'i(Òß³º”rÞTÚ,ôŽñ7بłImÁDK{[]P  ŸMPcªhá Ú5Z þï870œ>Sï«Þ½Á·p´¡>žÝ0ƒåÃ\?ÿåʺ4ã€^ÜʺqM Q‚™ ÃÙfmsüG”•Lcj&oÕ$Ôláybêâz`fçñwBõB Ãð¤ g8BŠéÇp¤ÅUu>p¹ S–AÒ S”É ¤Êqª–tc»cp›÷ÄA›[KÛ7Ëk]ua4,Cp ⌄%®<$òd31ÙïÙ˜bº6Ш+,óï.bÍaÒˆÛm*oBR©é02T8*ªVU“96ÁÜ¢s )c0*NÙQR-´Ñ5îÿ B’ÖNóo) ¼Oz²:8XM4Ì‚ŒYü>‘5‹ß÷@~Ÿ¾‡‰’ýpL½Ö[Åö@F7`¤pAë¶ 6rÕ.è¼J襚ևÔݘyŸóÅ›"^n/WžÔçú>Ú/Tá=|â{ôÉ`gÄ3ÛõMpf©2’bo{;¥½Í HaKœ="ÀæäLTAPJ&Ie¢m/@³¨{î«ÎL‡æ ¿-´  ¬\`VJ2÷£(hÍYúÊ4À{ŠÏ&®¿%Z 07è(‰å¡>²÷îrS‰ªµÇ<†Ÿ`®À<†¹¿ƒ¥Ö@ °÷ÃÜÿQ–5k¢T¤ªØZ(ÑÜ2o¸p0ä/íè6hû—ûP³ƒ™P)> D3“åmF3àY§’¤“¶Yš3c»I* ôÝ¢y¹Å˜r^Ñ¯Ž¦¥8µ]þ¯nšÁòYØ58·T}bÖ™?Õ;e:;¸|’` ¦²?UJŠJy„ØX‘wjî±Å,\× ù0ubê¹ÎŠN(ÖÎÿ>ZäòW‡V!¸í8„ì À; Ñ´}°¿›SÃë;tmÝ)ºÄÈ`1+Nl(„T¹Øð`·–™Ì~èôŒ2îF ¨Û™þÚí©§îÌÛOšj2š^ž r­ÞÛÐÒìœ+ïàï0£ L{åÁV1nªay5š…£¤iÎ{öòŽƒs«.žrpÃÉÂ'xÖþN) Ÿ º÷Ú >MŒ?ØÐ˜K "äg\2ºgĔݎû ¨!]4—‚üyÕsùA 3·ü« 3ïí0#ÜŸJt]2UEåÆL×IZ`Ð̈æ!ÌQ‹ÒN** }è(•»TB?4¦9åŒN®#X¡Œãjº‘J]£ž ýÌPc‰›’µtl\"0ÈtcZÕ†QpÓ¶”耑W&»jÁ€P7Õ³,êe—>Tñ¡{*|sj)…ŽG§Éð?gä9tÍ^<Æ=ˆæ¹a@À“ÑÏ98!Sfl>¤b…T7“µ£Å%Ä8 Rµíö˜˜­ y¿+桵CªóåÐRݘg Þ-ÓwJ“DnL?Ä5ÝE4ãô"q'J×äò°!.ƒÔ¯G_ÈÏ® ¨K>Bбl$sd¢s…Ræ©ížW2½xa4sÕH·ÔÜFÕ8èÇPEW5ÎÙð›Xõb埿úˆþ8éÐÅP- M–¾Â%¯Ë'1ÆÕH…G¹ª€¡JSÌ(L¼• \Àw(tðûE´½ M˜86·sÚòØ‚º˜òTÇ"ö@Ëé(æT3{J)ºåÕ¦ fï´´_\o+÷%`Œ³TtkÒ蹈ոá?hI]‰=£Ž¢P¶W‡Þ®òåé«8‡*ëtY¤zôÉÅíèdÂ1{}VD´XÕë°ªUF»s® Ž*¢ç¡ñ0xmLÍã`:¾ ‡q¡â÷%nL°WTm¼A °ïí¶$ƒÄøš‘jª}ì,sn¨r2e,—äЬ ¬Ð-zJ«u¡„Hc®>¿’J b4ƒ;̤˜{% ¶ý4&׌^Žç4ˆÃ+fz~©Þ›¡@Nt=­ùºÑ|˜•D DèLDJ™6´µÁ28G±ú .1fð̘ÒR|TÛ ¸ÐèÀž5Æ_Ò½ ’K×…Å¥˜„ãâ­AVÕÆ5çÛ”50£x„0ȳ>Ñ3VÎÍ5ÕòìFx B %)ó k/æÒ7s½}†Ë’3âòÒfðú*« Ë…)²éá~É 67r‡7¤,”ŠBó¨·_mèfêDH5€ã–w<nÑ­ZT¸­Ë‚ê8•*žۈ5GØ&·C/ßLÒ{D¶Äeº±«ÙL·”õg­9Õã0"KêðåV|£(ݳD³"Üð†)÷ˆÍj††/»(œ§šÒº°;«ùcƒb$g±ÿ}{ð øBfh•âû޲œÈEkµ N.—Ùœ´Äé%Ýઠñz„B'¢¢ KðJa±Ö%.ºÆ¨{ê}¨–lsßT]0Ï^”°nQŽ.)Ú,qÚ–²›t«±6··‹‹l± 8À*É"Æú×ÅYYFјª ¿Û“½;~’*NÏ 0ýÎÊ%ðUˆÐø¥kÏuæ“,¾µúòůl¯óÀ N¿ñ{6´ÉåÀhÕb0•V3âVŸL†:£B±™@®è”aÅÍ;2ÖgªüæãÈ—9µŠD‘Â>® óõЄݽ»bëuo˜(LÅ-Õ¹šIÌÌhA8£º]žßŽÜkÒ…V¨Ðk2—„漯øN-¾?TÙrb(Ö}¥¿#ÇãfôÓ½KšK $}ðP™\ŒÁÅ4ÓGi ×â9ã'+Î`ùäÏ¢ÍýUX¦¤‘Ò¥‘Ö¤ªÃI’¬ëI.Jÿ+!ËôÁL¨R&3<"#Úʇœ¸M脸§ÄÖM@Æ(Þмò'e Tá0àwà¬ï(‹ÑÐÎ_vq+øh¦¹³ô†6*Xô­†¾lêPw¡Iè_ ZZwÔýÆ 7ÚVC¹¤ªÝF‚êÓP*PÅL˜ 2®2æsªr ³[†˜A™ÆøD´4{!™ò ;öÄ“%›ÄS}³g¿Xfk•x&ºq޶—]]e›Ç%˺l=íÇÄ6Zx9æ×øà(ÍVQÈê;yÄ•ÔøqBoºPgÛ¡| Õ¤¦JÑ‚ ñ;ëÌÚ>h+™Ã'ƒcµ|^N¢Îgë¼]]5Á!Ãn$öqt¹9ºF2Çe$@1‰ñ2˜Ã¯ m²U‘•uTnÍ—æbF]›P¡,ÆíäV…ŸæšS=JÁ°”ÈU$Ó›i+€yŒ î Êò’^ïB·$=L:ãÏ5ðœ¨}²Ú€ëò“âBÿ1”ÐZ7c¡Ûü}L|"i%xéÓ‡vèðêœl­¤¿KŠX8mY–¨*_+ùÓ|®`ÏŠVÎh‡:yG9—˜ìfOW_¸è#}·[aÂvÏÐÔÒ=7‰.@«Ô ÷’G{†; ÑêxœúeLÔ¸w¦}3P«ša¤Rs3S·^âJ7ÁbÁ„Ì%V5€'aÉU6TqËß˜Û zUÝwu3¨ -ÞhÉȲÎJ‘3£X7ž‰Ì2Ρj) g Ȭ©Ñ¢†ï«Ð׋\/’£Eͪqª ¦Z·¼(P–u3âî8©Á¤[]„¹qaÜ8Æ™˜ƒ%ÊÄ)h[pžCdí ‘q¢?±óe*Ø‘bí*Y»¥”n5r{§Ó9è­;s!Œ_%% ªAÉ¥fÞJ1J¤(~²<€ÈFãX×Þ!Ÿ lØPá¶ nB“¼§ÆÒZà<7‚¯4/L78kʆ8Ûº/ìœ*™ò9…sÃ@Ó˜j hý02Ÿz,]&Ÿ¤ÑüÞÍÿ€š¿h=qnEë­Çj=¼Û˜:ø Áo¹j£ngú눴ϪèðÙ³*b¦ÚŸÂ#f¹òdœÕ{Ʊuåüa4üNÞ9'f;îÝÛ@‘ƒß©Ð;Ò€;jxø³ûzØGq›?Oý7D庫m¬ŒÛWæyâ;{©{7ÊÆQžµÛ+!•Ó~Û½=µ–³füd¾Ù}3â8 yó}ÇMeo¯ÍíÓ°RÃÕ]>Üæk“5ÃÒG lœêÂé—+Ë0x4øÎG5³–Þ¾°-ËpÏ?f|žùGô- ×$°¦dÓ#fD˜Ç;wÑàjŒ™µâÁF¿ÂôÁï\[ÝÁõà•âï4÷ó^[¹ý ·ncB=_å¯&…óçÝç§ÿÝ¡$ endstream endobj 4372 0 obj 5557 endobj 4376 0 obj [224 /XYZ 31.5000000 175.250000 0] endobj 4377 0 obj [224 /XYZ 31.5000000 175.250000 0] endobj 4378 0 obj << /Type /Annot /Subtype /Link /Rect [60 139.250000 84.7500000 146 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overview >> endobj 4379 0 obj << /Type /Annot /Subtype /Link /Rect [60 131.750000 94.5000000 138.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_preliminaries >> endobj 4380 0 obj << /Type /Annot /Subtype /Link /Rect [87 125 126.750000 131.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_running_swig >> endobj 4381 0 obj << /Type /Annot /Subtype /Link /Rect [87 117.500000 174 124.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_commandline >> endobj 4382 0 obj << /Type /Annot /Subtype /Link /Rect [87 110.750000 161.250000 117.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_getting_right_headers >> endobj 4383 0 obj << /Type /Annot /Subtype /Link /Rect [87 103.250000 163.500000 110 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compiling_dynamic >> endobj 4384 0 obj << /Type /Annot /Subtype /Link /Rect [87 96.5000000 136.500000 103.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_module >> endobj 4385 0 obj << /Type /Annot /Subtype /Link /Rect [87 89 154.500000 95.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems >> endobj 4386 0 obj << /Type /Annot /Subtype /Link /Rect [87 82.2500000 208.500000 89 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compilation_problems_cpp >> endobj 4387 0 obj << /Type /Annot /Subtype /Link /Rect [87 74.7500000 142.500000 81.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_building_windows >> endobj 4388 0 obj << /Type /Annot /Subtype /Link /Rect [114 68 204 74.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_visual_studio >> endobj 4389 0 obj << /Type /Annot /Subtype /Link /Rect [114 60.5000000 152.250000 67.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nmake >> endobj 4375 0 obj << /Type /Page /Parent 2 0 R /Contents 4390 0 R /Resources 4392 0 R /Annots 4393 0 R /MediaBox [0 0 595 842] >> endobj 4392 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1701 1701 0 R /F1410 1410 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 4393 0 obj [ 4378 0 R 4379 0 R 4380 0 R 4381 0 R 4382 0 R 4383 0 R 4384 0 R 4385 0 R 4386 0 R 4387 0 R 4388 0 R 4389 0 R ] endobj 4390 0 obj << /Length 4391 0 R /Filter /FlateDecode >> stream xœí]IÏä8r½ç¯Ð¹ÉIÐ0P« ª Œš]÷ÌÁßR¦”™¢ô(é%IIù± 3U©…âŒ/~ýׯÿýÏ?³_?|ýßì{÷÷‡¯§ü\ùõ¿¬ýó§Ç Òœ»g•)²ï?Odœ¾œ¾4ÿÿÇéúÂ×ÿÞüëÿ2™ý[ó¿¿eÿù_ÍÅ?wµü}²›>‘_»¦³ÇŽêì÷Ó׃¬™1B„Z3»í­YÓ5™=vThÍ‚ì³)bØÇ‚Õ×!ÍzÕ}'±X€w½=Ö˼˪u¿Â/žØû«Î]×j¿ÿvúõs‰2ûö×F|_&ðú×·Ÿ'ÝühݹReßþœý–7&í¿dßþvªÏUY”²¸Ì÷õެ/wÌÙÔùðN.á—;ú¬ÕÕ~»#JôŽÈakÅåŽ:º4Õàƒîྩ—;ÅYɆyZ—;Bõ·î­á^ëõãaz_ß1OM±£ùŠxçœHüŽF½ÆßÁS옼ü˜Ìð"¿·'Ÿ¡|<@HJß¡–Òëä;“&lͱ`Ì*à…\Ϩü¼˜0bM$µûáw(æùÂG8žë|úÖ¨a$^! Käå×]-dßû¨K⎺ÞÉÏe%Zú¹MÀ;xåmvï&jýÇ>„‹ç F< Ü$IHTÇÞ%z°BÖ:Á]Š´ÛL“ÌŠI]ÀjšùIÑ,ž‚=ëz[I/‡ŠBH•Yn?%ì#™!Ž^¿³'%åU‡€bSäêHr3™—¾Y޼Þ¢oî©yc ¿€géK˜a.‹)Ä«À”†Påøy Èžz?––H+¡èÎÜ«ín‡¾‡é—±dGË‚‰†`á†Ctö †Ô¥ª-ZwÖLÔb/–¯ŽQ])ŠÆ2óC¯ºc–/ %\çÌÝŠ*€tU-m6-àæÓ8¯ zT3šHH©¥½•±­42³G¤%O4 ïà®”7""|qÀÑÌBv™—øòêÌ1ÿ€´4ÚfX‘ÌÇZa’cŽ ÝÁÑ7戎qB2«Àˆ}¿¾ÆÍZ߈Á‡wÌ‚Q©7– tB=Éje[›JuÂòÒÏÁðÞ£;ݼNÜéèdªµ°µð쨈^^ßkÇH5ºÓͨ}-¤ÈËbZ›E±~x†qk9~¯Šˆ1[BÛê»øGŽ×¼&(Îp7'a7¼ùhÇcÊõfIA_¼¶ `Ï~ÛíU ‡ªºâDJ|%«à”í„=pep µ£ûRÎvÆsTñN,3ס­Ùº¥pÅ:™`Ì|ºÿó‡mܵZÛ[(›¦sÓˆòwä(¤|-„WɯCÅ0±+Œ5iCµ!O§óÛ«3Œ×y<ù/#H«RØ‚”á/Äa&¦u¬À8¸âˆ ó»ÃÙGdiïÙKâЖ§*wökx}YˆªŸŸ­Â¨™…q:NÓA_¬@¨!À ^NMfŒâ°™%k¬Ö t v•ïµ²Åm+„.[Œ¯ìçíwu6&Ïʲý«¢»ZgeуõW¾ŸJ}¢–ƈÛSjЊzüFó|÷»h_Ëì·õèº}ÇêIó”´b†ßøqzÿË“\Æ.c:.SÜ´ç÷H—wHcì¯Çw ¶©ÞAù ïÔp»ôn°×Ä=è˜ÉÄ; ë☭ÁÖ¨ñdŸ9Æ#cè|S}{ï|„3 ¿ƒÇ“cñ\ü=fBŸ¥°yL‰¸×x¤Ep»VÛ;SZ¯‡)2‚…s®¹—p}_¢Ô‡Þt(h•pY¹²(zÅ1Þȹê9´Š¡Å‰ˆ±LOX†Ù]lD2áö)XžÑ8bE)ùˆàsĪ0,oŹœ— èå(c:÷z³¶@xI("ŽrÔPxÕZØÂë¥ð¾V1R‡Kzņ!Hâ‰Ôî /F„ì×kÉ{†‰LµB÷ö(HEý2ûO8Ç)€×ý#ôäÿ½Ÿ¬³ÊW:eÞVT‹ª´×*£'4#LGñ‚[ñ÷šåóc‡ÒÏacé‡Yîìæ¦ÍnBœRdEÓ‘«²â Ñ+†RàâODЇL Êm‹wÎSøï›óÇÂò“¸ãлG¡'Œ7ŸN2@•¶ƒÃ¯ÆðMJ z yòÿ±*˼è%Ya³ã3†Î1̲Wå ³KüY§È.×™&¥”-P >™Ó c;ád(œ@…Ò$ñÜD±r ±áwpßà;j?.hª˜©¬¥gð_Ìbs?ó,7Œà·ªÅìD=¥¨í8òÜaº]w„(Îy­† 9268_Š#Ki,ÂÁÀ”{fÈPÑŽHÜ Õ§:ô§ûŠDH®Ò6ì:'V™ÃÓøb)G/´}Ðøþ·‚²±ƒâ^ʼú6ÚAœî†çŒF–¶ŠDø‚3Å€j2G5ûÕ\u¸’òûÓá×e7òðëÍ#Õ#îù&€‘ŠøV\óQÛŒ{ƒ˜K#H„÷ñIAé ¦7¸ÿñí _$ ÏPPbþà&\2Y_Ob¤6{Éë þÀ^+\Àh®|ЪFŽ‘â27¸„’ߣPì+‡­áã :fímGmjÞè yì•6`„³¶†SÙ]¡ïâ´|'Vr»W4;Ïúû1sÉFhVÞP%xùUq–Ƒݵ8ØÞò„ïÎáá~1&ê8g`<Ž„hÞ~vaê×ãˆ=tþ"ü—lκè?‹µ<¼gâžô0ù9\ûÌ¡YܬºuÛ–X¿-ÄwæV!ÎvÒBÏsÙtš›NsK§¹î¤ÓÜ£žJ¦Ó\nÞž8Í$Ün´X¸9¦ä͘^T(“¦LhÅ~õ>¿z9´€GŠ}Óxå0Ë'ÄžC„áyÃtÍP<1׿çS告\ Ê#¹œ(Tävé¢öŠ]éò”´¢¿Ñ—Gjþ=QI×v ¦öŠ]éò”´b†ß_©È{_Y*”§òHΤ‚FKBÖ^b u*ÁÔI´×Œª°D¬ˆ X€³/+´,„4µpß~;@Yx#UÃÚ¥.­•Uص´¹FÅÀ;Ï“ëoÖñ2 \‹ÂvDæckU¹@¯ì­Õ‚à(L¬Ëã8Á)•#I„ßÁ:©ã;£Ü꥔l£*Æ7µýM&Íc'bQ³"7Þoù¦Íc6qœÅ3Îv²dv¸d²pB¦œƒ) Ç‹c ÆÑ ¸×8ZÇ¥39¦øÔƒIÃñG˜éÜXd#wé¡ZŽvtª~ô6± a­|BÆ dGNÝÁ+Ïì ¸ Ò[i G¸SiÔ´¤›òi¸üãú%î,/l}N½ó‘ßkiMÅ_s&¹­]{81 Ÿ“R+p]ýòe‘Æòžl~êMU#æ#ÂÕm3`¿LÚöò~7Ù2¡‹Vå¶®µ@¤- ›´ßÞaçŠ(‘o¥}±+£IÃ9XÁf.°¼ñ_hÉyæ=|©@Ú‘vóÝL¡Öt‘¡c â-ðsÙ'Œ•‰ss’¡Òèp~Ä‹UÐy5ð!*Xò-` ¨ÚEÛ~S ޲b´šµ³¶?s{µê±éÌí¨gnQ-‰¶´i÷YìNÀÛ‰p·ïùÀö…E&’sswßÎ~7mL¬Å"½†?0Gå˜Geu¾`²’÷4yO:=•âߘǵ}üObw‰ÝížÝ¥Ã¢tXtc]ÅFÈÚ¾rÇ>‡0ðjÌú5×üšÓT i$ÖEE6oκvâ5ª«rv!KqŽ”ØÉqËÍh2þ\ï0ú?Ãò%ßÖî°ÆN 8úÆ(„W÷çŽ0Éz~éÚï±F>ð¼ñ®¯cŠ×º˜%²t'ÝIwÒt'þ;ÞŒ ˆÕ¹Yß¹ˆW,?ï‚WŒoi2­Ê¼Tç¦íìçí·>“geÙþU Ñ]-³²8_;‘÷W¾Ÿš‡…¨eÑ?¥­¨Ço4Ïw¿eûZf¿-Fßí;VOš§Ì 3üÆÓû_žT9Œ3€»ù–u¶1™ÖkFUY\VïN"ŸÐùŽß¹’ÕT´âU?ŠÎƒ¸RÁï@Àé››iôŽÂ‘v0ÖOÂÖºñ„DGÎíUÔŸàìbÔö €ªs½"¶ÞG#^ÐpW5w ‡Žâ`O¦¶­_”_"xÜsm”ÑD®˜YèÙ~‹©ÊÏV—¸·Lhº× ÊOÔ¥Y—>>ü[J‹¦úãó¤¾êÆ¥"á®ÖFÄÄpÖT+x—E»ëÉ®ërû&ÖDZ ‘ªl°@Ÿ…µÑv“»¨JÙì%è³ç‡ú’„®G$‘Jÿ¥Ò¤î¶â8)èãœZ‘0Žü¢,íYÛAE¿4º¹iµ½]³˜[)î¸9{Ñ!×9öRɶT²íÎÖ¹FSɶT²Í݃T²-•lsÎÛñJ¶ÍxoEÝ—àH@»Ïià hwjÐnÚe×ôÅâhЮh÷Amo”à°.ŽÃ@7,Ï´›€vw1;Ûã5ì2¥”÷á´›€vÉõI@».öðŠ@»¥ÊÍüd%xrÿ–\àî$øQ]¹ÉÎÍÛÞëv–J' ÁPÚ]Â&Mؤ3tý‚ؤ¥*‹Ù…L,Å9Rbk$_7£ ›ÔõNÂ&%]1ŒR°I6éñjôK1™‘BJ­ÚØÚ=%gF¸8Ý Ïr$(ˆíÑÆ·‡£v)8M1Ev‹5Åǰdð»ÍWhKîü‚NûÝax"×T©Ø|“ÁŒ ‰ZÖ9Õªj¶3ž.±ÞcA»BIk­¨ú#^¥“VÎ@´m¯š3–æikêÃøõó1öøæÆ¯$EªØCw vçŠÂK£¹ÀßÃãÂ>5‘ –føòH”L±+†DF0sâ±'—j)µ-%™%b4š0ÕÀö_T!$¨ SøŒ{y3U,f`g5æÀškìW¢Æò“íYÑÙ*¨2ŠgT؆òþÂbÅ·;ÌØQø$Ü™Œ2Ä»ÞÇÏL13;ÛÇ ÇÚG’±þªØÍ$'JöâVÁíÞ»rÇ)»%œ­ œ¶,×§¤™Z;˜êì)NNþ„î0³ƒ{-¼Å@±TÖÖÊûMu©m”)Èf*ãR ´å ƒOù¨ßDÅÿcÅ¡ÂRúžÓ£V¸-ö”/ÕtÁb£N8&Šñ ùÍ‹&l$æ”ECè7–Ü1žwö²àGWAóT4bö”¼,FÁ/¸ez+—ueàEì÷´ ¢À=Æn„6 [m]q`M…/÷®8h>H õèQ†éÉËŽëº ÊŽUðБ«âÍóã´q -*±jy3•ï&äÖ•cUê@ô4ËL²îÞÝXU‘®jk;H›I14ÜþL*H|X"k{ MûSÊØ#.¶”–Ö7·| t/²6RLëv`x€Óä–kûŒë˜Òyw§EÃcˆŒ 8€ºɱ脅à@0aÚ|M/ÞÛg1Œ:ëñuv‡µp\”jZ…˜ÚYø¨7Œ‰i?:€ûÉq,Í eí7pVg³Õng‹Æ°Þ«¥zñªêàÜIQF·p„#çR²ý©™5Ã/øÍ4ø¤ À|B‰Â¢÷ÈeT㸊«@"ló‚¢L!Ö'øýFU‘ »6ÚZ_ ãëúÎTŽƒsÈ8Gd—åó¬Òp‰dYÙ[pó9 g;¶[Û¾0–þŒ‹ô‘àöš!±d{Eüd¬U¿†‹—:XÇdÔ68çΊˆ„Á¸™þ»ìý#Õ°xí,d €¶õ—úªJXƒx P”FÖöÒ%(Ênã(üZŒvÜÁübu¡<Ø<ÝVin#5i2èpN[ì«îóCn늷 £ÅGÃìßܼ[a-PY‚ŒÓñ1‘R\Ÿ æG5³¨åüb&³ô>ôHf)• é0 Vޏ<¿^1&ȯdŽH }›…¶ö!F€°8 jL•ŒoóÕså©(BÖy®ˆº=d€2èí-Ådm*Ï„ŸàÂ!ÊReƒ¨ÎUm•q*Ñ/êuÌRœ•VSó¤ò³l ·Áþœ+%ukAºm2ÑënO‹z|¬ö ÝÁßéa¨'¾{ ÞͼsYw¼°wŠcŠhÌ´fa+)Ïm7Þ~«³1yVåí_•æzµÈÊú|õäý•ï§Òœ…¨¥1âöTõØJÿëúæùî·h_Ëì·óÑ7Úwìž4}“­ Çñýôãôþ—ÁœˆÑœˆe»D¬ð¦]i%µÆvŸ—*dãF3ÂŽ`ˆTšÑ]Ww¤" ñxá÷Ó×'‰P‹!j9E„ZÛÒ\aûTõØJÿK ‰PçSD¨jûÍ•ªÙu­ DZ1êÀ1Ö"\&Œõáвür¯Ù¾³ú×â¡M¿1ªòñB»1œä/ôµ2ïè/ˆ éŠ+ 7tw½ªš+¢£ÎþÊ÷楼£áÛS >6ÓÿÌ;òì/õ…z­ c¦¹Ò~fЙËSzØŒ~æ‡ÅblQ\£.«²ì¥¨B¶¤Ã¥ˆ­fØÄ/"å<­·{™×ª£UÙÚÃ…ÅÄ^Õ±›|ŠØ´©°¹2"öö©Ž˜ûfºŸÝgîÄ^™)b¯*û3Í•±_žÒÃfôð3›»),5s¢Ú ¶í˜ã½HX=^,)ç8šííÕíçð2`m–©EÍi93eÇTÏCÊu ¬6«ë fraq–öŠÍÀ.Ou ªo¦ÿi,VWS ¬.mÖ\1°ËSzØŒ~fKfr=”GSfÌéC„‘êçxÎYeðn°ÿ÷80aFJU%ô[Ú#VrÊJfò¢g`Eñxa)3¢20#Ì“¹ÍÀ.‹ÉǺ5Óÿ¬† ̈r‚QØŸň]ŸÒÃfôð3›20©ÂèX¾2D‰é1¥‚ð¶‡73ê"ã‰Öïÿ8i9‘ºg#eþxa1Q¥ÅFT5ÅFTmïï‹KÍâíS›è›é–QÅQzô=f#—§ô°=ü̦lDßbP ÈF| 0»ÚO"BpsiÕ{I:òì.,Þ\Eam®¢œÚ\#_é|uƒ½Ñ>Õmž¾™þgam®BOm®Âö<¶WF›ëò”6£‡ŸÙts•¢_ÎÏhsBÖx•ïòóFìä˜gñ«µõ²?`Uªz¼°˜TÚâU1Å FŽLÓ92¹}ªÛé}3ýOmq‚JMq‚Êv˶WFœàò”6£‡ŸÙ”˜@A¯ÚºçD¿Å@¼yÎâ‰\Î5L"®ôàBÏ5üïöCÖÞ[¼uÏìJÁAƤú´e{HÕÒ³<‹¨~žô5üÁ¦²YÙT+K6ÕzJ6|Ô¦óQDKûT'{úfúŸÊ’Mµœ’MõÈã^‹±lº<¥‡Íèág6•MuÝ“Mf6q–‡Í+FÎ0ç~ä^e“ãœVî`+ÕÇ:ïCCT®/<t%¯¡yV4þñ—ÓûèÔ.å5°´}Ä\ ÓÈ=ç‘E†ó›R¢>Ã9XÍMå 0ÁxÁˆ¤DŠ©– ™C»{.›§¥i«Ô=\ðÀd½æ úHÆ=zC!ǹÉ8:§€ÄgWA% en‡üñBK_N_²?š…¹“Àĺ}™{`A‘™41š)ÉE ÝœI=ÜuS¬è:ðjb!¯lRžåeªÆl²ßQ»w:èè6)àîþˆ¾£æNÁ§úö¹)*‘ˆSµÍp°“¼°³”1ž[˜†À­Áwº=)V ý¡ Kpí¿›÷=‡µ}%“ƒð<@èöòT@ÿ;k¡G+WW‘²"«FÜ! N½ƒŽàwÄšÜÔxðHñwÊçi¯ÊÕ¹ã[ˈp–> endobj 4396 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 214.500000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_packages_classes >> endobj 4397 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 112.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functions >> endobj 4398 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 129.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_global_variables >> endobj 4399 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 114 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants >> endobj 4400 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 123.750000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enumerations >> endobj 4401 0 obj << /Type /Annot /Subtype /Link /Rect [114 735.500000 165 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_anonymous_enums >> endobj 4402 0 obj << /Type /Annot /Subtype /Link /Rect [114 728.750000 158.250000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums >> endobj 4403 0 obj << /Type /Annot /Subtype /Link /Rect [114 721.250000 165.750000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums >> endobj 4404 0 obj << /Type /Annot /Subtype /Link /Rect [114 714.500000 166.500000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums >> endobj 4405 0 obj << /Type /Annot /Subtype /Link /Rect [114 707 151.500000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_enums >> endobj 4406 0 obj << /Type /Annot /Subtype /Link /Rect [87 700.250000 108.750000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers >> endobj 4407 0 obj << /Type /Annot /Subtype /Link /Rect [87 692.750000 114 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_structures >> endobj 4408 0 obj << /Type /Annot /Subtype /Link /Rect [87 686 119.250000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_classes >> endobj 4409 0 obj << /Type /Annot /Subtype /Link /Rect [87 678.500000 129 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance >> endobj 4410 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 210.750000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers_refs_arrays >> endobj 4411 0 obj << /Type /Annot /Subtype /Link /Rect [114 664.250000 147 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_null_pointers >> endobj 4412 0 obj << /Type /Annot /Subtype /Link /Rect [87 657.500000 154.500000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overloaded_functions >> endobj 4413 0 obj << /Type /Annot /Subtype /Link /Rect [87 650 147.750000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_arguments >> endobj 4414 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 133.500000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces >> endobj 4415 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 125.250000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_templates >> endobj 4416 0 obj << /Type /Annot /Subtype /Link /Rect [87 629 139.500000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers >> endobj 4417 0 obj << /Type /Annot /Subtype /Link /Rect [114 621.500000 192.750000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_shared_ptr >> endobj 4418 0 obj << /Type /Annot /Subtype /Link /Rect [114 614.750000 176.250000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_generic >> endobj 4419 0 obj << /Type /Annot /Subtype /Link /Rect [60 607.250000 181.500000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_further_details >> endobj 4420 0 obj << /Type /Annot /Subtype /Link /Rect [87 600.500000 157.500000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass >> endobj 4421 0 obj << /Type /Annot /Subtype /Link /Rect [114 593 209.250000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass_pragmas >> endobj 4422 0 obj << /Type /Annot /Subtype /Link /Rect [87 586.250000 147.750000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class >> endobj 4423 0 obj << /Type /Annot /Subtype /Link /Rect [114 578.750000 199.500000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class_pragmas >> endobj 4424 0 obj << /Type /Annot /Subtype /Link /Rect [87 572 137.250000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes >> endobj 4425 0 obj << /Type /Annot /Subtype /Link /Rect [114 564.500000 171.750000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management >> endobj 4426 0 obj << /Type /Annot /Subtype /Link /Rect [114 557.750000 143.250000 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance_mirroring >> endobj 4427 0 obj << /Type /Annot /Subtype /Link /Rect [114 550.250000 213 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes_gc >> endobj 4428 0 obj << /Type /Annot /Subtype /Link /Rect [114 543.500000 335.250000 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 4429 0 obj << /Type /Annot /Subtype /Link /Rect [114 536 237 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_multithread_libraries >> endobj 4430 0 obj << /Type /Annot /Subtype /Link /Rect [87 529.250000 144.750000 536 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_type_wrapper_classes >> endobj 4431 0 obj << /Type /Annot /Subtype /Link /Rect [87 521.750000 123.750000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enum_classes >> endobj 4432 0 obj << /Type /Annot /Subtype /Link /Rect [114 515 176.250000 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums_classes >> endobj 4433 0 obj << /Type /Annot /Subtype /Link /Rect [114 507.500000 183.750000 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes >> endobj 4434 0 obj << /Type /Annot /Subtype /Link /Rect [114 500.750000 184.500000 507.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums_classes >> endobj 4435 0 obj << /Type /Annot /Subtype /Link /Rect [87 493.250000 113.250000 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_interfaces >> endobj 4436 0 obj << /Type /Annot /Subtype /Link /Rect [60 486.500000 181.500000 493.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 4437 0 obj << /Type /Annot /Subtype /Link /Rect [87 479 134.250000 485.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enabling_directors >> endobj 4438 0 obj << /Type /Annot /Subtype /Link /Rect [87 472.250000 129 479 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_classes >> endobj 4439 0 obj << /Type /Annot /Subtype /Link /Rect [87 464.750000 153.750000 471.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_overhead >> endobj 4440 0 obj << /Type /Annot /Subtype /Link /Rect [87 458 153.750000 464.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_example >> endobj 4441 0 obj << /Type /Annot /Subtype /Link /Rect [87 450.500000 153 457.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_threading >> endobj 4442 0 obj << /Type /Annot /Subtype /Link /Rect [87 443.750000 161.250000 450.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_performance >> endobj 4443 0 obj << /Type /Annot /Subtype /Link /Rect [87 436.250000 168 443 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exceptions_from_directors >> endobj 4444 0 obj << /Type /Annot /Subtype /Link /Rect [114 429.500000 198.750000 436.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_customizing_director_exceptions >> endobj 4445 0 obj << /Type /Annot /Subtype /Link /Rect [60 422 140.250000 428.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_allprotected >> endobj 4446 0 obj << /Type /Annot /Subtype /Link /Rect [60 415.250000 145.500000 422 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_common_customization >> endobj 4447 0 obj << /Type /Annot /Subtype /Link /Rect [87 407.750000 147.750000 414.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_helper_functions >> endobj 4448 0 obj << /Type /Annot /Subtype /Link /Rect [87 401 165.750000 407.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_class_extension >> endobj 4449 0 obj << /Type /Annot /Subtype /Link /Rect [87 393.500000 175.500000 400.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxycode >> endobj 4450 0 obj << /Type /Annot /Subtype /Link /Rect [87 386.750000 237.750000 393.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 4451 0 obj << /Type /Annot /Subtype /Link /Rect [87 379.250000 201.750000 386 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_method_access >> endobj 4452 0 obj << /Type /Annot /Subtype /Link /Rect [60 372.500000 113.250000 379.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_tips_techniques >> endobj 4453 0 obj << /Type /Annot /Subtype /Link /Rect [87 365 267 371.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_input_output_parameters >> endobj 4454 0 obj << /Type /Annot /Subtype /Link /Rect [87 358.250000 128.250000 365 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_pointers >> endobj 4455 0 obj << /Type /Annot /Subtype /Link /Rect [87 350.750000 180.750000 357.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_c_arrays >> endobj 4456 0 obj << /Type /Annot /Subtype /Link /Rect [87 344 142.500000 350.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_unbounded_c_arrays >> endobj 4457 0 obj << /Type /Annot /Subtype /Link /Rect [87 336.500000 144.750000 343.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_binary_char >> endobj 4458 0 obj << /Type /Annot /Subtype /Link /Rect [87 329.750000 228.750000 336.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_heap_allocations >> endobj 4459 0 obj << /Type /Annot /Subtype /Link /Rect [60 322.250000 99.7500000 329 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 4460 0 obj << /Type /Annot /Subtype /Link /Rect [87 315.500000 170.250000 322.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_primitive_type_mappings >> endobj 4461 0 obj << /Type /Annot /Subtype /Link /Rect [87 308 194.250000 314.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps >> endobj 4462 0 obj << /Type /Annot /Subtype /Link /Rect [87 301.250000 136.500000 308 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_jvm64 >> endobj 4463 0 obj << /Type /Annot /Subtype /Link /Rect [87 293.750000 139.500000 300.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_what_is_typemap >> endobj 4464 0 obj << /Type /Annot /Subtype /Link /Rect [87 287 220.500000 293.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types >> endobj 4465 0 obj << /Type /Annot /Subtype /Link /Rect [87 279.500000 150 286.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes >> endobj 4466 0 obj << /Type /Annot /Subtype /Link /Rect [87 272.750000 145.500000 279.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_special_variables >> endobj 4467 0 obj << /Type /Annot /Subtype /Link /Rect [87 265.250000 199.500000 272 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_for_c_and_cpp >> endobj 4468 0 obj << /Type /Annot /Subtype /Link /Rect [87 258.500000 141.750000 265.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_code_typemaps >> endobj 4469 0 obj << /Type /Annot /Subtype /Link /Rect [87 251 156.750000 257.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 4470 0 obj << /Type /Annot /Subtype /Link /Rect [60 244.250000 112.500000 251 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_examples >> endobj 4471 0 obj << /Type /Annot /Subtype /Link /Rect [87 236.750000 218.250000 243.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes >> endobj 4472 0 obj << /Type /Annot /Subtype /Link /Rect [87 230 240.750000 236.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_typemap >> endobj 4473 0 obj << /Type /Annot /Subtype /Link /Rect [87 222.500000 235.500000 229.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap >> endobj 4474 0 obj << /Type /Annot /Subtype /Link /Rect [87 215.750000 192 222.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_converting_java_string_arrays >> endobj 4475 0 obj << /Type /Annot /Subtype /Link /Rect [87 208.250000 210.750000 215 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_expanding_java_object >> endobj 4476 0 obj << /Type /Annot /Subtype /Link /Rect [87 201.500000 183.750000 208.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_typemaps_return_arguments >> endobj 4477 0 obj << /Type /Annot /Subtype /Link /Rect [87 194 223.500000 200.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_downcasts >> endobj 4478 0 obj << /Type /Annot /Subtype /Link /Rect [87 187.250000 207.750000 194 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_equals_method >> endobj 4479 0 obj << /Type /Annot /Subtype /Link /Rect [87 179.750000 207 186.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_void_pointers >> endobj 4480 0 obj << /Type /Annot /Subtype /Link /Rect [87 173 148.500000 179.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_struct_pointer_pointer >> endobj 4481 0 obj << /Type /Annot /Subtype /Link /Rect [87 165.500000 272.250000 172.250000 ] /Border [0 0 0] /Dest /#9c#cf#9d#92#2b#92#c0#24#15#08#bc#83#ff#8c#e9v#60#a1#01#b0 >> endobj 4482 0 obj << /Type /Annot /Subtype /Link /Rect [87 158.750000 240 165.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 4483 0 obj << /Type /Annot /Subtype /Link /Rect [87 151.250000 268.500000 158 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 4484 0 obj << /Type /Annot /Subtype /Link /Rect [60 144.500000 127.500000 151.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_faq >> endobj 4485 0 obj << /Type /Annot /Subtype /Link /Rect [60 137 100.500000 143.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_odds_ends >> endobj 4486 0 obj << /Type /Annot /Subtype /Link /Rect [87 130.250000 139.500000 137 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_javadoc_comments >> endobj 4487 0 obj << /Type /Annot /Subtype /Link /Rect [87 122.750000 198 129.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functional_interface >> endobj 4488 0 obj << /Type /Annot /Subtype /Link /Rect [87 116 163.500000 122.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_own_jni_functions >> endobj 4489 0 obj << /Type /Annot /Subtype /Link /Rect [87 108.500000 173.250000 115.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_performance >> endobj 4490 0 obj << /Type /Annot /Subtype /Link /Rect [87 101.750000 115.500000 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_debugging >> endobj 4491 0 obj << /Type /Annot /Subtype /Link /Rect [60 94.2500000 100.500000 101 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_examples >> endobj 4394 0 obj << /Type /Page /Parent 2 0 R /Contents 4492 0 R /Resources 4494 0 R /Annots 4495 0 R /MediaBox [0 0 595 842] >> endobj 4494 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R >> /XObject << >> >> endobj 4495 0 obj [ 4395 0 R 4396 0 R 4397 0 R 4398 0 R 4399 0 R 4400 0 R 4401 0 R 4402 0 R 4403 0 R 4404 0 R 4405 0 R 4406 0 R 4407 0 R 4408 0 R 4409 0 R 4410 0 R 4411 0 R 4412 0 R 4413 0 R 4414 0 R 4415 0 R 4416 0 R 4417 0 R 4418 0 R 4419 0 R 4420 0 R 4421 0 R 4422 0 R 4423 0 R 4424 0 R 4425 0 R 4426 0 R 4427 0 R 4428 0 R 4429 0 R 4430 0 R 4431 0 R 4432 0 R 4433 0 R 4434 0 R 4435 0 R 4436 0 R 4437 0 R 4438 0 R 4439 0 R 4440 0 R 4441 0 R 4442 0 R 4443 0 R 4444 0 R 4445 0 R 4446 0 R 4447 0 R 4448 0 R 4449 0 R 4450 0 R 4451 0 R 4452 0 R 4453 0 R 4454 0 R 4455 0 R 4456 0 R 4457 0 R 4458 0 R 4459 0 R 4460 0 R 4461 0 R 4462 0 R 4463 0 R 4464 0 R 4465 0 R 4466 0 R 4467 0 R 4468 0 R 4469 0 R 4470 0 R 4471 0 R 4472 0 R 4473 0 R 4474 0 R 4475 0 R 4476 0 R 4477 0 R 4478 0 R 4479 0 R 4480 0 R 4481 0 R 4482 0 R 4483 0 R 4484 0 R 4485 0 R 4486 0 R 4487 0 R 4488 0 R 4489 0 R 4490 0 R 4491 0 R ] endobj 4492 0 obj << /Length 4493 0 R /Filter /FlateDecode >> stream xœí]I%¹q¾×¯¨³Õ$Éàf5àƒÁ àƒàƒÑ’,jÁ#ü÷ ÉLÉ|ÌxÌä{U5 ©;£Xd.±1â‹à7ÿöË¿þÏ?_¿ùþ—ÿ}ýâþþþ——áMËaùïuúóû-›7÷ïWmäë—¯/¿½þöòóËÏãÿÿö²üÂ/ßÿÇø¯ÿ{å¯ÿ>þﯯø¯‘øG7hðõE3=þý·ùo«Ùø¯!ü=ÑÿòòŸ¿{ýû4£_ÎÝL|ý{Î èù6n,ýÛ‹L6ÿùç—¿¿|³¼€c«€PV¯ ¼2 üõzùóôl´›åÛ›å¯ðšÞð2˜xÃfºaeŸ@¸Õ&3à™ûŽ×0¬¯»×À†e xÝ.#ƒürñ;4†±³Þ!žû„w8.Á_· òïð>Ì}œ¶/Ð.·.Ç÷gýb×¾¼‚¬=—ë[tWõ/²ü ë¯²Tëk¾hk;Ý÷dt–k5¼3š¯ù/͘Y¨üUÙ`ÛåË‹2oŒY>Þk¥·³¸+·Æ8Þ]Ï¿öŠ~[j¼ÆHùò‚îd¤ù;_f‰ŸãËh¿û]ôNXòNXÉþ¶ó‹ßýúòÍOö•©×_ÿ<þhþÈË_¿Žr¯¿ŸŸ[¾þúÇ×aÿõõ׿ŽêåMifFa7ÿdø~þ ¼X‡õ'Pü‰šbÞŒ—›Ÿ°¡ô“áÇù'òMðQ¡E?)ßAqnŠ¿SœMïñâ]/똕 g‚x“ ¦÷¸*ðÐòsý°| ægYïñ[Âï|7ÿľ ÷K?)ßÿ¾´Nù –ßDzóŠuq¶…S~üuÔ…«HeÔŒE!(§fÄb —ù}ËxmÜ`g3ªK§fê¨K0§E<åËøKƒÓ5a”°Ñ4þÒ85zÖ2h­ð2#eZ&º™yÄÓ@¼Ì_Æç¿ZY1©m5~÷5—ïÌ„gµÍÇu3EN«× Ž«¢±(/Œõ ÿ vİøÚ<èÎã”')Klñ{¹unËòÄ83ßH/ÌÜn ^˜Û³ì´bYÊ.¾œß!(áC^æ˜[Ÿ'g`0äwÕCwÌ(–ˆ²<±ð áÖïÞæTĘ__Àê§Þ4;V#³cMjvôô’"{0SÙYF9³â§ñ—™«rfgÜ ³3R³3‚xˆ—éhvÆ× ¼&×Î]ÒJV»µeNüÁ²–=ž²Z)/\Ë•‹þ_8¦âóV/*¹RÊ/âÊ‘ s\9ùˆ+GJ•Ө™ëÖiü¥Š¸r$È”+G*$ËæJ7 âi ^¦+Wrî?ç¢*ÃNüŽûRdÊ&hg²Kp@Á—w†E¹(϶ó€to¯^–¸ð²¤‡-¡Z–„D²$TN–„ÁL>RYšF9YñÓøK‰dI@N–„H–©,Í£ žâeºÊ°››è;m†§xÈ;öâ(WŽŸËkx³%Ts¥Ä•Ræ¸RjÌ.sÌ 1Õ4ÊqŸÆ_âJ)r\)y² O¹rñ4/Ó•+U`Žrp®¼}*«9VÜ<_µ«èëÎ(æ™]Ê-áoècNsÇRš½ÊñÏ?þôòÝå|3‰îÌ7ÚÞê–ß&á †my™Å(‘áú@e/M’”ZžóúÔ >¡`KhÀsvxž³ÆóBq”rI9Â[¿/ëŸ%–ð¨œe}BL€Úîç,6ØþœÅ˜ößSµYyƒPV7æ#¤¨.y=(Ÿ2f‚T[B>WèϧB]¤Ë[jJêSŸ">:ðiDhÀ§ €O¥Où¬¨OËa•â{ÞÉXQÂ*ÏÇ72dŒçX~ Ôn¡™Š3Æ#!“1ÖL£ŒñLÁ[èyÔ²EÓøË8c<2㑪ð2*É»QOñ2=·ÐLûôÛŽóPÞðp”TÚŽ[qpkË´r&·„j&41¡Éå˜Åù£‰’0¡]¹ÎOã/5bB“ÉT‰—1IþÈ‚xˆ—éÊ„VÜÖ¸e¶)G^Êæ¾>³DÂc5‹†3»f–ì–P˯|@™%>ä2K|À™¥‰‚ùuµðc˜Æ_¢Ìr™%>àÌÒDÁüºŒ‚xˆ—éɯœ…ÌÒE²çÉÓ;¾å,dq@l Õ|ËQ‡ó\gò-Cñ4‹3r|É£,Ž_få[žËâp޳8%á[²8ë4/Ó•oÅí,Nc¾%8Ü6;”ï mª)±(ü ÄˆaZ¶UžP-1€2Lr&8Ã4Q‰a ÓøK”a<'1€3L%‘¦uˆ—é*12på3»Ç÷A-)~)Bñ§ äi€TÊs’†Iˆ¬”ü©×<Ò§û„Ô[‰èÏq¡X¾NÀ¶Â ßvœ%é‡lÚq Ë™ZS…øãë …æ¾ Wæ*䇋¥H< V€?¾Ý©Ž r²¿Lo ÕÎáÈù1"çü$ñîâ%‘ï2rΟÆ_räü–s~ ŽþL”Äù™GA< ÄËtu~ŒOY_¶]('#±$!qhÏM[¶>MkʮԻÆTsÒöBo µ*A ,V bà• ’”p!©­DÏ£‘ÓøK«1 9•`“›µ©J°A¬Ó@¼LO• }±J HÙŽÄ”%“z.‹NÓmB¹2ª1†ñ ­Ê™-¡Z¬ù€Äš³œX';á"v‘XO£œØúiüå€ÄšÙŒXO–a&ëeÄÓ@¼LW±æêb±ÞÙÔ•E”ÂÒ z£EÝh»8¹à>È ÛªÅAX$0äÄ! Ç Ž‹¸yåØÝOã.…Eâ LN.N”DæQOñ2]ÅäÕâ@©/mŠ4i[ûzX Àg)¹´[BµH„ 2‡  cC&J"*`CÂ4þaC„ÌaC„ÄØ‰’ˆ Øuˆ—é* ®ƒbú‡Ù)á ‚ãöÔ €zATc#Âý¡½ñqú‡ö„ñP“2•”€,ó4ö@ÊÓ“X™k€ŸŠ¿SŽ6ð7O èÕJa|vU˜ˆpb’Ä`ž}T‘D0è…‚3¥›z§¦±Ð_ÓÀp»üüªÆ&mZn=ŠÌ~<ãìt T5qø†p‡ÈÌÍö40oöýµJ›ŽT7ô›)¨ià2JogñWå¯!m8RE²†ÀMgš¿SX›nÖèØ4P÷8+R?‚d4ÆL5Æ’pVåúŠr4ö@,%Aؼ·õ$?\ƒ¬Ê^„£¼ùä¯`jK8Ñ7c ‰úg뮢ÔÑáLî+ÝŠñ€@G9€#$1H)Àqµ8ža‰Ž rG8¢:QpŒgñ4/Ó3Æâ5W퇻»]”<ÂŽ®"tX*ßÛPX¢pÊ`¥¡Ü·~©ŽGl¢h5ùP3öSþ>寣}§ )m¬ËJôàèÎYyо%Tûá Açð…ÓÈ)Ð)¾på| á ý2«ï¡søBÐ_8QßC|á: ÄËtõ=ôí–8mußÕ>:©ËÓU]¸Ýòë€ÿs1ݪm˜hÛ3õ/þäþÆýÎîZË'ÕöÚO2„ö“,‡ö“ £ý$KÑ~ó¨Å®†iü%BûÉ!‡ö“FûMlw—QOñ2=í®dª—F °öŽ®ø;àõÎûóDÏœ9”,í°%Üo%€®KRxÌÝÎÑ%hh9hÞbHR¢ì+!ö ¼ZõKÚ=±%4`XPÀ°2 ãÊ»ûÏ&ˆ)d8hfÐ[B¦P/“ºªóAM]·c¥RIACʉ”dîAÌšÔbµKâ çåE§…bAHuFùÝS*§TmœQéxûc w?\ÄñǸSõ™À»IëñnWÅ3H» J9ÚÒ¶kÜûTd5Æê}i‹žü} ‚ž’<ã¥Ô[:ë‘‘R²-áTêóìÃO¦Ç¾º øN+·„L¯ß9¾tÏjŸÇ2~ŠÐ)"dºr9Ìʈ}€#õðybä§*BzÐA„ô–P»™Ð õ_Ô<×Q'ÛoÍÓþ‹ó¨e³¦q— õ_-If3¡&L¼™XFA< ÄËôÜLhú/ umS]”^Â'ö Õ<4Jäáî0Zxcâ¯m¦Œ÷¡q{=ïVã&.ó(½Å_ù¾†þZgZÀh¡ðB%-`&š¿S½i³®Ñ³Œ†Û½)Þß]‰BŠ.¦ä„º£H(‡f”ßNêb4E›—ov'Ž_λ$ÎÁŒïx= »5M'lü¢!À‰Ao '6~œRšN@(Q°Õí\âWÚ¹àwÓs’è$]-MÎsR¸Öy¢$ž“Z]%?¿D'éj™;IWK\¹=QÏI†“t×i ^¦«ç¤<ì–†-òÞ0ð @Ç1eÿÁäÏ{‚*œ ¼Ô×xBµüit2ðø_Nþ4>¸d¢$ò§ÃÉÀa‰NE%'Ã2QùÓádàuˆ—é*&4ýü©èö=W¾ƒ­¾Ž$VvK¨‹Ž$Ö6w$±¶¸Hx¢$cÑÄa‰Ž$Ö6w$±¶¸äy¢$cÑÄë4/ÓS`Ìàa3|áÎL—Ü&gQJÚ"_.ÀÐSÚyŽºl{ðZu%ª|3„öBn µ‚oBò–Cò˜$øfXŠä™G-‚¦ñ—ÉcXÉ32v²LŠäYFA< ÄËt|>'ªÚöìRˆá]yU@÷²6ÄðyJí®^ð°%Tk CFä CF`è)thå$]DÐ!¿Ìª D:d†M”DˆZ§x™®š@xèÐû÷™²{Ñvý@è2eÞ:ºÁ6Á@8ŠXð-¡ZGHÔ*ÐÈ\«@“œŒL[ΣœQ«@¿Ìª#d®U ‘8|6Q!C«Àuˆ—éª#¤ù(:¢-¾§m=^Ûn7GÒ¤•J‚nœY„æŒ À7 [Bµ‚Ñè`c£s›$¢ftz°ñ<Ê)?¿D;ØØ(œ(‰‚Q«F Ó@¼LW£C7ƇÁ½%nõ!äuI1×±¢a @òV³^RõzV1ßÎõËŽ~¹¼ÓnCør½n²"¼4ç÷„JÝdÆ7馑Tž)H7-£fݳNã/cˆðHÈ@„G*O–I ÂnÄÓ@¼LGÝdFwÛèb÷É„SÛ2‚þå{ë¾Z•0r_À s³%œ˜y[rÃÆoãö½‘¸ª~¦üÎw„Ž`„ÞÃ'­H¦Æâ4õ×ÍÊ×M“Ë2¹<ƒÅ© ÛBž`ñ—QΤrˆL.Èäò ¤²d™‹ïFA< ÄËt5¹<´ñ$œÂHRË#ÎÍ÷>Ÿyæ>°-áDó60ÄdÝTmÛ#TÚrwÛc³w2måäU™3ÏL†#FüúJ`μ'nF®ÚfÃÇk‘fÃGªŒ3Õ3e×Qz;‹¿òõþš¥Ùð‘:$k 8>Óü²5¾Y£c6|¼‹Û]}w*8ËnÉãÙ³£%õ¼¬?Î,’2‹³®¶t¡ „jßM1仩L ÃHìT©¤„aå|3Å#ßM1仩L ƒ¤ÅËȤ„Á‚xˆ—éê»)§tMÜ)¿-óSY,ú‹,¡=Ý㪷óqŽ#ŸõãX ÛNt`C’Ö»Q^+H(¡Ñeû²³Î/MÛ>R>Ë5’ÐSyPe¤VÖôZ“zÒê=I¬[¾¾(¡rÊæ¦Ãcäð–sxpRy¦$Ï4Ê94~9 ‡Gۜã ^F›Ôá™GA< ÄËtuxL(PyÎ2Ϭ®êí´ñèO®"BµèظúaC¦ÃúHÅ9O6$Ö—Q‹h„iœ¤X‹DÇf:¬Ô$ƒk“ënÄÓ@¼LOÑaCè°îR«òm°¢²z®ñqfW5)cö)·, „÷–¢ 6ÂüGÅôþ*Õº  CD¨Õ}Œ¤û˜Íé¾$ùÄ\ò)Ò}Ó(§ûü4þÒĺ1Ñ}ŒáTÚDÁºoñ4/ÓU÷q_Å#dQrŠšg§PŒq ¸íMËè(Zq§ªòÁä‡Ò•An Õò'4’?arò HJW–QN¾ü4þR#ù™Ò•‘*ñ2")]q£ žâeºÊøÒþãq·Ò½¼Ì{)‡*º(f/‰‘ÀÔ–wHåÝ!^DrÙŽJ5¬…*ÖP-ÕR!©–™B•‘ŠÓL&…*Ë('µRGR-’j™)T©8É1Q©–ÄXÊHªåª¦|¡ÊÉœIQÌþ]Ë»órD­ìØw’ÜJô„» äqï?’Æk'µ–¹È-á̼„D2¸³+sšt§å}É‹[†=À¦·q{QÉÕˆ‰¿¾H‘põ] ¦½î¯U”ôA€6G¬cX͉9þ¤SB›ûÆ·t,g¨„³\=O‚Øœ¥õ ó¨E‡†iü%ªá,W2õÅˤõ Ë(ˆ§x™®:–UœÍð”:öÝ•;{)ŸÙ®Ô+j¾V•˜-á̪ƒYµk!$ŠJ/磘éë¥ç@Ɉ‰Ù€çØî¦íÙ‘9³c¤â É™Ë(g„ˆl‡àÈvˆÌ™#§“&Jb;æQOñ2]m‡gvPàYõ­>$q(Ú‘Ô|pHIÌ„§~*}„Rσ™.B]ˆçäcu!\¢º.su!¹³±±¤ø¨eåщ·s;¥d¹Õùª#kyðàrK¨•w1 L¼r˜x‘àK1ñó¨EžÃ4þaâÅÃÄ‹§& –÷eÄÓ@¼LOy zÉ{rÆ/Åæ$•Ÿå¸žVÉ%•¦nvGº)(»ƒ2,Øz$ߪe˜#\ýøRr2œB…Hqõó('£~‰põ‚çpõ“"BËðW¿Œ‚xˆ—é*ÃÂãê?7œ÷m8)5>m+ê×*¶mÐu+*DÿëˆpæV ؑՄ2óƒ@iÅީͧFß ¤Î}¯›¦P±†€\±†HbõÒby”3køeVS¹b 8ó0QS¡Xcâeºš éâ—»{ »»¿ã}åQL†šƒo ÕB¦$2•9Zc¤âȼPÉÑË('DJEB¦$2•9Zc¤â<ÃDI„L‰ U "!Sp´†:­QÆN=áÙۉ#µ.M¦ÿ ºB‡£.¬Œ'Ü]É!Œ7õþZf*9„A Ï\É1ÒÛYü•‡žûk‘©ä†'kð¤’c¢ù;›JŽuž•¦{ªí\yRˆ¥qaã®MÇ D„ õ%¨é µ^†!^†$ÚC ^žG-6Lã/x†x;(Ø/£ žâez`"ô‘ûƒQW{í”ÐB9BYFº>^,¨÷£WÛu`z½AO810b´ËzQ5íîK«zv“àÚ”|EýéÚç6ôñë‹TŽ3oGŽÐÙÀsèlHÂøÀStö<Ê?¡³ý2«qä9t6pœ”˜(‰qä½Nñ2]#÷èlþ]IfßÛQcW{ý.r*¿Ùz“Ä=2G¶%œh’Cìý”±‰‹£ù÷¥åŽœû.í“ËhµqŽEr4ÎKDËèMã ¨d W²Iâ -Ù˜G9ã QɆ_f5Î+ÙÓ@%1ÎbµÆ•l¬Ët5ÎàK6DÑ¡ÞÁ†PúF}¸VËuPi5ìÎÞÖp¢aŠEã‘{U¡EÓ&ö$(…á牀#Ýì% ¤ KËàt *Ï åMK®P¨\$ÙYPiØ<ÊYjUùeVK.sU` q®y¢$–\†*°uˆ—éjÉU(_)Cº»M+MŠ´5Õl—{ýÜ÷¨V¡(‹ó-áÌÊ9âêÞ­ø¯/×:p®c[£Ë+Pþ¬Üä'5Goó˜sÆErœsÓRhTr&Wr—\IK®æQΘ¨äÊ/³Z +¹K®&Jb)t(¹Z§x™®–Âø’«#‰rŠ÷EA_uxA§_nCŠÏUÆ—³nƒæêÚñL¨èrާQ§ï9šrº¾mG1Â‰Æ #X•²,’rÕ”ÃùÊo´:bs×h½ŒÎ±ÛMëeQ!Ø\¡L@0rH çQÎ:Ù¨€Ð/³Z/›+ ›@zlZ@¸Œ‚xˆ—éi½äPq¨N¯#QŸÏy²c[­Üåà‘áÜŠ-áÄÖ«ãB1O‘ÀÐå³W( ½æ«¨§ŒŠšÉëÜRÔ’¡*QÉLNQ'€ ÉÓ*ÑyÔ¢ˆÃ4þU‰J–«• ÃK& VÔË(ˆ§x™®Šš‡*Ñò6£ ï¾C¸ü¬Áòï~Wxñ‘¬ú-‘}cÂCñ&D„w €ùžrìnÙƒO=ˆ²6&$kÊ7»ŽlRó”&÷azâwÉYŽßoZ@Š_¥È¿Êõ EZü:rNDů~™ÕŠ\ñ«Ã1Q (Bñë: ÄËtµ€Š_ŸÒR"{H/¿ƒ²+JA+@šQ<ݶðrJĶùÊó4;‰CB¨46áÌ*ƒDn{­“p ›'„vÇ ¯Úä¾ÒM»#Q=¸”¹zp™äè¥LëÁçQήȨÜ/³Ú™«—#&Jbwd¨_§x™®vGùzðr+î…@9Ü’rÂáHÁzáɘä¶ç`žÜ£Z¤l3(0É‹uíNc³ªµ½S¾ô€m çÙ»i¡X_œjn¿ ôä“QѹWqÓ¨htžÔ¹Cðd’Η:=o匆ŽÁóˬFEçÁ“ƒ&JbTt8oâeº>gShÓΆ½EZúIíÏE.þ¼zj±n.bŽuFuF6×A&iTiÓÎó(§lÔÁ/³j ›ëŒ m’¶ig„eÄÓ@¼LW­a}ÁöÎÙ/„|'%ÂyàôJ¢uÇÝ+?`ù1(/¥mî £†Ð€E„7ì sY9!BŠYPÂ\ξ Ax;¥'Jù¦õ…TÝ0Áá/ÿÎNûÙ¦NËGk^à×%YN#ÞòHCí(˵£P ^@±´Ålí>a·„3»OXÄÍ?E¥”Ü‘çx§ÙµŽ­h(‘ÂTÿÝ @"8u›€œLÞ´½u›P"×mB%H%Ònó(wc"ê6á—Ym¯Èu›Pã.&Jb{ùjlEÔmb]¦«íá€Ðb£bRC ÜŽbPëF”Z½êÞ`g#úx`û¶´l%Ûd¨(ñÔ£Šm4lD8ÑC±‰Ì?UqÄ#'|o;>eqjq€E7~õl;$¿__ X ïê­®¤Zøk–é­®¤@}ÏÕ ”‰»£Ï£ôvå;f¸k°™Þê ^LÒ[}¢¹;u³ÄÏÑ··º’¡ç S0þ†·æ$$ùãáÜHmÐo=`µ<èPaù–P50¨â[™\Å·J’ûʦßó(0QÅ·_f˜\Å·2ª0Q’¨ ßë4/Ó5j`O>2¶¬ú¸ÑÝ@˜}*oýÆÒ®EÛ¡V`ô€*oõ`2£“Ü“fiåí*ª‚óˬÊIåªà´ÂUp%QN*TÁ­Ó@¼LWå¤+¢F8rù'eO¦i‰–›­ž=u8ˆVˆ-áîÔ6Þ*ûkȤô(qX_ϱÍ8ø?ÒÛYü•¯Žò×<“:Ðã_x –¤&š¿S¾I¬kôLhãkc.ohöŽaÖ6œ`±$ <¡–ûo~é¡þKÃr`'/†ýHÆî@±K‹–õ¤SŠÚÖ«”݈’Ä“jŠ?iSœT.åvÂ+ß+bv(ï/Ýùžin”{ÀáæJÎW,Ͳn T> endobj 4510 0 obj << /Type /Annot /Subtype /Link /Rect [78.7500000 660.500000 156 667.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_basic_tour >> endobj 4511 0 obj << /Type /Annot /Subtype /Link /Rect [222 548.750000 264 555.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Android >> endobj 4512 0 obj << /Type /Annot /Subtype /Link /Rect [177 333.500000 218.250000 340.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_output >> endobj 4513 0 obj << /Type /Annot /Subtype /Link /Rect [333 320 344.250000 326.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_packages_classes >> endobj 4496 0 obj << /Type /Page /Parent 2 0 R /Contents 4514 0 R /Resources 4516 0 R /Annots 4517 0 R /MediaBox [0 0 595 842] >> endobj 4516 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 4517 0 obj [ 4509 0 R 4510 0 R 4511 0 R 4512 0 R 4513 0 R ] endobj 4514 0 obj << /Length 4515 0 R /Filter /FlateDecode >> stream xœí]ÉŽ$9r½çWÄY@G;I_A@­tP¨tè ôh$ º*ÍA¿¯XÜs!ã1œ/ŒFzdLa¦jÒÓé\Œ¶Û³_ÿùûìþëï»_?}ÿŸÝoóߟ¾?5û¡kÎÿÙÿüòúvÜÏÿÞ c·ûí§Ÿ»ŸOßž¾þ÷çÓù…ïŸþõð¯ÿÛÙÝ¿þû×ÝŸþýðÃ?Ï¿tü…?ž3þþýô÷4˜Ã¿šç¿?ÿï§û‡Ýߎ#.Ÿ›'óöÿÿbÍÔ¶ýqW>ýóiY¦9ýùûo{úõ¼i_iÝ8NvgZ×î?¶»ÿýϧ¿>° ßìÇ~þü7ùññøñÉö‡›q§ýåÉ9üå©5fèÛ¡¹es{üL c§ÃH]ø¡Ó¡á3 >ôc¾ÁO3ßãz]òpGkÎÔ vèyôÛ? ç4séMYŽ.y²“k2žìóè96ûŒƒgžëdáàr'Û6vtÙNöÕèò›ß6ÎMù?Í<ÏÉF—<ÙnÙû¡Ï°?]Γí»l’vž¹ô¦,'ëþ-e<“óO€þû3òâÇO¿~=(uíîÇ_;}ðü×äÍî—£ÒyP~üy÷Mc>ÿÓîÇ_‹Ù»ÖÍ‚ãïžØ=i†Ó“~ßw½íšWOÌøÎ„ÞqÏïŒË£—'x´¯è‰ùtz2íÍÊÑŒCsÃß±æôäËÃyßvTŽÖ_:ª¶9Uo— óÒ£ìysÇý85oŸ4>9oT»?/,Ü ï¸6ýI;ž·°Ý[3ëf`Ïbš}?œ^z™[×óåô¤ žÙw>øñåÃpóqõ¯âïá9Úî|ÒôÄ.µp4<ëîôÄí»¶÷Îvô6%BnÌv9x¸bcž¯ðyÉ+žD(f€ß7/ÐAj6#ÜÙ¼Û…‚¯„ƒƒ@*k]:ýEø\ =f̲µkÖã_ñÈ!à Æ\#|x4¸Å7ˆ‰Œr®k­'èVáÏø*aÂÂDB°V<Ì4"ü_.¼o˜=2ëÁ{-ËlñzÖ‹—'ÀòËBB20R?Âd¯7îðJñw0ÉW r>˜œñh»qŸáåÀj@´Œ(—=~Lf aàCþà/=AsćMÈÍ¿Ñ615±¦ ŒIÊDÐÒ` ´{êr&Ø0fK‡¡qF‡_/7± Yþ0c]Êry|`Øöö½”;…})>bÏ#SÂ;Ëܧkº—‚ûl4‹ÈVvéDŒ{¬"×$27Q—˜°»)Á›pMCÌ)9Gã‘%êD9YІ©¥!“Øx¢Â6Å'Û¶ð6|FÂvŽZ\š,~ç<Ùi Z¬yÒv„Ö—W/žCSIÌP+FRO| 4­d ,…QHµ´¿™ë„¥90iº}3yAF|õæ¥Ýû×(µ±kLDÿš}FÙ84ÓzÙÈ(6^wgV[<Œs9Øö”ïÉjÐ-q?cR+VkÕÜ÷êf*®”vå·:+*XúzÓ%¤² ^9çÁj·²’Ãz°‚Mhç ¾âêE$b‰©…×É'¡¢ÎCÀÙ=TÓqÂót—k)c6B¾Œ„Pí0ƒLaæ¢v|@pøHñþUhŠ——Ï¡^ˆµZ£¡s•Œ¹Œ ÈYëq mÀ‰S в>ëŠÃN5:k•¤oÛÏëiüõ´Š& /OI˜0s"²ÑÒµß*=`«*Øw!›ÖÇ$»áD¼‡ïâEpëú.rú;§Ö—™µ.*%’¸pz „³4";JIˆr $ ›ƒ¥X}áPFäjG×"–$Vß %´²»°ÁØ|þ2"²˜` ›J†cÒ¯Š¦­ØÞ\•U²¼=³ÇPW¿Pðú™éÝ0тʃïn¥Èd×Ó1ågªÙ>“µŽª½öÛ‰VèRʪ°ådÆíäqcáê:ߨOIÑ¿® %ÄsýHÄ}^A^‘HE£%0.2ÆÏŸ9jó~jT°["ŸÊÖ¨”Ê~ŽÂÈš®|‘LFY6Ù@–uÚÔe®Tæ î‡J)Åßt®™lÀŸ"7”ÆÜ*E}dlxÑ?ªǦHŽõäv5QGÁ%䯔½]B"_ĘÓÁêzïÌÔP1”4¨p!ã¬Ï›QÞÇ %ȆH ‡¨±´Ãªh¶È6}µB]^ì?íàð6ñ¶²XÖj?t¾@É0!xÅM>Z†NÖM§…Bð°£vt|/>B‹J$³‘±;ñ‡ó^䀥0©}åµÊßžàèì‹I ´Ž,€¼9ÍPŠMYÇ9ãêf,aÙ<1Ù\Ï-š‚–H–ú‚|RÁ£Ö-mÊëKêˆ1ïW’U3…uŸú€É·©‹0ÊBd‹ó[½Ï“‚´A¬}`pìm!\Á¤ªPÖqB®3Þ¥²¨|‡Í`ÍÊB|2ô—`'1‰ ]N6íXo¬2²J-s®˜þ)’²wgfH ÷*žËŒòôØ´÷­ùI̘R DTóòy¦TZ®CûW½TR¡3׀ݭBÂHpµ`±Aô‹ÔÒyÞ‘+‡) Á-lJå” ƒM+9º©fœ›>˜`7ƒ ¾ˆ³ò1ªÑ‘1)šüƒ!q%é•78p­…±Œ‘%ßÏ”qÊŸV£ü¹bJ­0ªªÓ¨h°hßz€ÖJBS˜ƒnå Ô¼]¶Oª,C{À‹{†™XÅzß”,Ž¢l[O5¢•€÷`‚7@¯+xµÞ…‡Ë`cú‹¾Ó/"»”µMë‘k„Ë2Rƒ!Æ 4ϤM1“҇™²¨ ø¾Ë¶ -fØ&HÐ1¼¾DV˜Óie/i9<îŒÎ—U¤8œÉŽAPË!E©VeÌY­;OlbªIÁ%¨¦x‘ê#,Nõ•Jû`‚-ËâHDFcd£Ï¢A¥“g7c;Ïš“…§²s6ÙU‰’x eÕw–€¡„ÌŠéo[S=¦àë’ÑE m¸|+ˆjTÇ\;!J àg?œ¬oB´YÁ6sðYʸŽò¶ ’äI° à÷(‰¶¾ÂJ˜I2º©h$bkíq–ZÜ^X¾7¡p /!g_´Ü¯â;“ƒ@…/™;ÅŠ0üÈáL˜­ÖêQ’—2Õð_să“®bëˆÀ±wž¬Çùzÿè)Z¸_Õ0½¦ó†NÎ?YE`&)-08‹ßRûÍ@S44<«þ¼Í&ÜæÓn7«köÇÐnMûú'¿?}Üõ…0=¬T£ý쵘9ˬÍU¥¸B×á6ñ#+ˆSÖªS ¢rñîÜÀå-F‡*•¡‡ï (D&*µJcÆ.$¢÷Síbœ›J­‚ଠžº~Å¥©Ù}¥±wÏ(Ÿ^"\|AKD(`dÄã_.exT —kŤ×kÒ6-o.å&ýàK-æÄuÖ£››¯H7ßVÖz´ð”¬"Æ [oj”ǧÔy¦×ˆ•¥Ôª)¥¡–äDy£%šÔËô}÷H™åÎd'w¨âÆb“HëJ)n¹å²²”I ”M-±MÁ<‰V˜R«ˆS…©7(7¹‰¸¼MË\£„*‚4¾k3Qp Ó-÷çNuYW`PÞÞ¯‘d$Æ)R ! ~R_bu3ר%5²a›múôïÔY˜ÜÍtž8“m%“ º¯çjË!·Ž;Û^.9톳ÃÛO™PûÖ®µ=z2Ÿt¿Ÿ­€À¨¸ôÎß™­äþå'Ÿf3#<‡¯hü™Æ.ïГù¼­A øÒhg‘mÚ½oÍ÷ìÒÜàz"sÃ+”4@7<—×O¥˜·0ÉŽÅïP –PBl£-Áí©<8ٿòéVjÅʼnXb@dS˜¥[“>Ù¶E”¢ÝºÒ|!Uñ=o»tchk¹Q]o|É·¥†ó¾wÀŸdÑÌR³b!ÉxB‹BaO¸lf–ˆ×7ÁÑ%áï¦2‰±Â*À ”K"ŒOœ#«š»©eµÂ!+No $e=* ì`ä‰F±"Í·Ê_f5a’ë´mé¢å^Æ:>òÝöó47ä3ËX…ZªÜ´Ô:h¥0”w™©¼ H=Ç¥B`‚5Z©Õ:Ÿ\C[3#¦Ž@6GsK¦c±÷ °ùHæöï?!&)ÊÄ<—þ“ÍD÷÷œ±gLG˜X˜D1‹  \*NœÖ‘·ƒ ›-wê}A„k·ˆ*÷²ùź0Lð0iëݸ‘u1usX›eXæ Œv“NæNZr`И ãO ñ¶âÜôˆ5K¾R`OÅ´5 <‹ÒMNר5£'6…û.öbmÂjî¼LyŸ ìsSãìúj¶ª¾Ñ6mL•>^f¢ª(“*,ŒØ)Û½®'o>!…¨°†('¥‚‡É±œºsÓÏ.ÅšTý#ç,ƒJ.ª“•πѢ΄-vxSpˆe}˜ŸiÉ@²E5Æ©Øtº7õ {¾#ÌaxWq°œºÎøµT„M¸5Oà˜‚Ø©\»QclQÉOë\º>"’ê#î´éfÚÙëD­HÍZ…Û&‘a&Y¯”'! ƒIéN øØ5íMÁÿe§«çM´Vã‹ÌÙÍ¥0"מH5ƒÚÉæ‚â½&ð8„M%-eÆgÿ+:‰0öQBZ¬Ùl©*ãV’uê”3[DÚ Viv®÷db±ô~µ°¾ÝA»zµH©çNK׈û Õõ^W*l¥T§# •мDè¯|ÜA«Â‚²¡„Éä– æè€±3Pù+Ùp^ø´?ÍæÍ¿ '³Váɬç]zÒ¢'3‘¥}G 1²Y¦i[ߺœàn™ô=Á£Í+ÏZá9YŸ˜,%Ð5M¢xE•,›½P!†4a ¤”þI7øÝüaítýÈðƒ‰n”¡X¼Kí–‹:Ÿ\õ4w嬉4Ö§ÛâÞŸ|¸×.ïØ.kÖŠÎ<ªˆo“ÌX~0Ö²R6¡´X¬¡øeW ðm*ËLG¶•©N¨‘¸Kar±«õæt]0’ƒ°"nH…»³…!=ÌYâÕ›ÕòHDb0y9™Ö¨¾„ò!ƒj ³(ÞÎø¿™Ãfòwµ’†´˜L±ÔübÙÔÉIÍY¶Ýà›‡}½ÂœŠ?Ëv¦“ a2yÜ„Îfo¾Å”ÔÍ;±Åq–ÐHVËëÕ™Åõçfìï,cµ0ñÌ*%EXô8¯¼Þ¼Ìâ¿|EûÆÕù2ù¸n„*ZN¸êJÎjY« ‹Q}’C¯y#hÎ?Y%¡LJ{±þÎET<ÕÂQ V~>Vëñtއc›ýñý?žz;½þÁïOß#ªIæ8…·#ŒJ&a,GPE-$.&³­Xäš]^µ]8ó@´)ˆÉÜäA­g<‘H‰81P ºu=íÆ©¿©,Ùô¸²kæê¦·Ÿ™·°ÛÛ '&-òÎøÎ„ÞYÌJ·?Ÿî«w^Ð-=Û`éä™ôÄÁYÃw,|‚׳Ø:6$×¹Ëè°Ÿ¬÷έÑêßMƒ·€(saWZ©Î,²¹¥‰i¾<»§¦¼cáî’Þ*´Úˆ1g[_°Þ+fÔD0 ™¬gƒ(cÈZÆK!B:ëÕÈ]¼D ™¸¯,¤hÒ ƒ5œR‡¤[ã‹5YS(ÂD•üÌ¢L¢–s‘MaUøÀ˜´nHÑO´–(Á’«WIRcï¤Y÷#~RWU‘œý6îÌt1‡ùŒ¡nm÷ö“¦ÙŸÍ·W»Ð£'óyw{ëÛ|x4ê ½³G·Œw_žÅæäÖ>qpngÚï±uî ïÌ Þ—¾ÓÀ'íÁ|/}îÎL‹vÏm¾¦_ÈtœȬñJñ)À•FÎ~gNŒO¢ª×Ù´‹3ã…Þ,œµ…hu4µ½6 ñõÃWZؔޗK__oáîïD©“0ª‰¬óEÄÁOD•|Y£E¶¥‚è­¾¯¥í;OÎÈDÐͼ¡`S£Í\«Ù÷ç‚”—'çC0ݾñë7pSŹzÂîU®xá`_­,¬³íÛO–, # xæ‹s¡€—E xˆÒ\Àcq©.ä‚3˜E·PáÓÜ,{Ø;~ºT‚׃ç†×)Ê"V)Lƒåg‘Ñàî4b6º˜®iý›9T‰‹ñªµìÕǯó|Y†ƒ .†h>¾H;Ù *Ž–Î½™.E>1âw–üÃÀ³„ŸP~ &Ë‚I”c]¢½½Úñoê¶0Ì…É•`¬Ãí÷³ŠAÙN'žpÒ¾Á©ù¸ w¸Ìôìæà+Ñ»9¤ÿÈÑus£¾\GgpílûihZúÎ'r ÄJÖé$Ê +ìe<å“ "v׺d¦]rÙLmÑôR*x}¡ãÅn i¨ƒÎ¶«©9o] MK•ºªÑúúg¤Ô…È ÄOR¢`L¤„Á›d¢Ê"®t¦Àžh›œ‚þI`Uùj–÷ú(‰fýoÿRÿÛ!½*ÒNkƒXçƒßѪòÅ3ˆè°ð;¸Ç®òÅ;Šõ^¹+¨ÂuªØU¤í(>|¦¸.ÏŸ‚•<… ž>S8Z„âáz"û­b›Ýƒ ýôL,J¨v"å)úŒhuP Lñl¦j9Å`hýž¢z‹nŽL’“áÉÔ’'83DáÛ˜€E¤P\ð»8ê!z.Ò~ðNXW–nòŸ–ßojÀŠ˜(šHgµŒªÁyŸ,˜QÕàï(AIG`”‰Üµ,,˜MyæÍFQh6žçÆðÓŸÒ×Ç`Ö8×ê3|çZ¦R~SaèŸá”L…À»ïpÎPIx`¢r&:’´¬{›QmàV‡»l‰ÚzѺMàUÙ”À„¦à…*å`ZÚ±…ˆÚÏ@«HØÆm · FDM7>Ébg…·<á)­`ªz0É1]‚Q—~ýÔšA1eÍ2Š1~end›`WXƒÖë<çÃÙ’xÐ÷„¾s9$"-¡/ÚÇä^KJ‹éЙ7T-W8G)DFyjšÁ·e;‰„yZÅ"Å-µ”̸Ñ4«.HÞlc5Gm-ÄŽD»a¤ÇÛqþ@$¢ ólö²5³Ôä½l"Uî"z7]ì¦àÓŸ}zLÐŽŒa, †•Uë„ÈyÛÎ;Ö;qoh‰F*ÜýÐDsY åË ·”>Rµ‡¹¸v-ÛXQw;.‡ÁÀí¨\ן³ÊÏLž¸Ôò¯=ZûFC øaÌ Ž£ÖCB1„Á\â„úx]Ùrø³ûy¸¤Ñ;üíÚ/¬¸äãE ˜?lÌ1Ma÷ ÓÀvZsph¸°øsdÞîí9ßçÕ“³µŸÌèÑvß©MŠ©Ïè;îZŠä¥¹}W6Oë¯(h­¯#`™Ú‡ œ™"Ög±¸° ƒGƒïÌtl’–>¼-KpÇf¼Ìü ä(]: Ì7 ÌYtÈs´kí ¢äp¼ïpxûéö}·Ÿï캈͇×ÜëçÚ}{ú0zÔ™ endstream endobj 4515 0 obj 8297 endobj 4519 0 obj [227 /XYZ 38.2500000 449 0] endobj 4520 0 obj [227 /XYZ 38.2500000 652.250000 0] endobj 4521 0 obj [227 /XYZ 38.2500000 652.250000 0] endobj 4522 0 obj [227 /XYZ 38.2500000 449 0] endobj 4523 0 obj << /Type /Annot /Subtype /Link /Rect [297 687.500000 363 694.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types >> endobj 4524 0 obj << /Type /Annot /Subtype /Link /Rect [161.250000 667.250000 229.500000 674 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems >> endobj 4525 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 715.250000 72 722 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 4518 0 obj << /Type /Page /Parent 2 0 R /Contents 4526 0 R /Resources 4528 0 R /Annots 4529 0 R /MediaBox [0 0 595 842] >> endobj 4528 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 4529 0 obj [ 4523 0 R 4524 0 R 4525 0 R ] endobj 4526 0 obj << /Length 4527 0 R /Filter /FlateDecode >> stream xœí]ËŽÜÈ•Ý×Wäz€Îf<ø j•4€ ˜Å`ƒöØÃmŒì…2+ɪ¬`žÆÉ¦ØB·ÔE1÷}Ïýùß¿þ÷á/ÿ<üüñëÿ~~ÿøõ©9ömsùçpþõÓõôpœþ|è‡öðëoOßߟ¾<}9ý÷ûÓå…¯ÿxúÓ¿úð‡Ó¿=üç~ø§é/ÿÂoO½êO¿ÿíå÷±W§?5¯¿Ÿþ¿Oÿño‡¿ŸGœ?7Mæýÿÿ¤ucOCœ¦øô÷§y™êå×?ýûÓÏ— ˆûеÍ`ìAÙóF«ÿøŸ§?Ÿ>0ßG«TßÙ¾¹çC½~ý’O#)»øÐË/¡á >Ú>Ýà/3ße:å]ðp•îÚËéÓN‰oÑÛð ö_µJ¥üeæâ»2®gtÉÃm;“ðæ^ Ÿ`ð®ïRÎyæ©n®gtÉú™úÛ%ÿ¿‹Þ†—\7J§;Ü—™‹ïÊ|¸xtÁÃÕºv_ë!Áþ¿Ÿâpm?¤üeæâ»2®gtÉÃmí8m1 ¶èmøƒwCBÊy™¹ø®Ì‡»ýKÌ(x*—Ÿ¥ÿ»çÅ_¾=ýüYYuÚÌîðíϧɽ|óòÛ·Ó¦´‡ŸÎŠ`×¾ýéð»¦ÑŸøö×§ñØévžâ割èI3À'|2Â'âg ?¢'FÁï|‚ïàõÀwðÜÜw~§y†O |‚ÏŸO8¹OßNÄœ.‡îº„”¤!õá' õ©_ÐÛÀw4¤KÑ›Á¬t›´¬àxø~¯ÏÞ&azƒ´Ó´p4H£¾Žw~''Æ3À2GÁïàóÁ”ˆwTA:ðPïN;ø×ƒwŸ)œµgGñiãÝòi cÓîÚ®-$Ó|uFÍwÔöZÆï`ÎÃP,ÜùG£ŠšuHÌåíd÷Ó53šG¢BÞi0½=Úù„t®:–j› KíÇyÛçiö]û2—ÅÇalÞ?i4|r!#{´æ’?°âu΃+Ço oœ¿ÚXø=<“Å œÚE?Wæhô NÖ<Á³ïáw,|gp' ×¥¸b¸Àéš´ó*ÖìŸg²ø;…Ý[Û ýÊMÁ£á³…ôà¡f<·õ›?é««ˆîùdÞyØøH :÷¬ØÀÑ´¡žMÁ'JÖÌJ=L† ÑGÛ7õ`Á ¥Ù9%å½8›ü JÍ›¸bÕ“îsë,´ÜûpS­!¤×tͱëÕûÉ^8œjÍhÞó±p´i»ôüè¾ë€Yæ±xßÖs_áŠùdC¨D‹eH¬KX9#ï’gnŒº†OrRÏw0!bJ*JŒv™ u”xJx#ñÒ™c‘Кµp9<œ=›Q Ÿx„ÔˆK ÇqèÒÚz˜iÀw„møF².µoF`©BXŒ1ä/ŒAJqQ!,rÍ=¤C,У'¬ÕsåYè9JFÀ²_àZLOØ8„ùûz•ç–vŸŒrÌÙ¼*iÚ0’j;税bÖìQÆ~ã¼ oåéҸגqDb’'”‰¯3¡Å,„|Pi¼õšø¹86ã£v2GpKÈùl7‘N#a%yT‚R¦ð÷Û2*Ts%‰²Æ0ñ2ªaÛ%Ñ„²ÖN—µÌУúˆî”¬ƒK6\gžÑ¾y”<¼o" ­xXP†¯–‰çb_"Á¶(§ &^Ùˆ2þ^aB,„•ì¦ärù{f-ê#ùú Þ%»Å¼ï"¡ðUª\黥Àc“L™º·B•™<«å‰ A,/ã?u¥"Å`ƒ,˜z2¯ßõES‹ Pµî†ªX :Ë<™ò‘vüHØËjßó¶ËΩåÎÙ3ÐÍiýã¹&÷pfYýõþöô5YU.æš½{(Åõ\Æ¢¥à=[¸J ß+ Š©  ÷£Éˆ96C²Qͦ⥕ÉdSÅØ£-$‰$¥v6Qß¼|f¡cÁæ’gJ²zLÚ„pÂTø*‹§"cÎìùcJ“f«DªÆøv2Ôg|í†CbÃ!%@Å¥œåJŠý8ªŒçܹû%ªØr§-õsŠÌ…A„ÁÙIø9âo\'~’¶2&0õSÂÒ¨§ ¦s·²«œ3˜ÂÐ:‡`Ü4¬‡ƒ‡S»,/ò‰ìàwðw†µ'úþ{Fãžhóœ '’ê¡ñÈJÅòuåýOŒÉÂàH˜rId_‹Òsljl ‘L–¢¨/´äƒû¬1Ê6fª3•yüéØm–‘ ˆcž$ˆÑ(žž)t8ŠŠÚ3b†aÿÞÎ6Á6Àü“ÂRjG€ÊŠ•r¥¶ÅKb]ÑS—ÁøâKñ<+¦÷y°rºQ9¤»ôõ„W¹og?ìœì3]«b’“¹nS³NHGÃàÒQDDÍêE"’ŒbÄs…Evk(»5T]±þÔuÉ“I@œ:•VV3Pj]¶·y©´Í‹2Ú®Ö[2$ó³˜,¦ ÊÁ žOÛ¯£&¬ŠˆB*y!Ò/ã.g¢NU+¢¡–b=U--Â$¡‰¢zDŽઠð›Öº<é"¦nëd$köEäkCËtÿ=üŒÈׯú ÕŸàÚÈû™ê^ˆ®Ÿ"ï­é®P"ò~ž‚söØõޏâ]).á­¦¦m÷ÖÕç­S£Ãi~à¸CŒ¿0"½ #˜®$aŸ\úJqx™zÛ.œ¦æÜ"ƒFØ]ƒûãîäð’±$Ռ똛¤­€, •âõ|Ú97O»ìÏòï&!§ýèÂÞT'çLq®ÎIJuáì–òHÆ¢‹ãÍ–5¦®›îý'Us¼ W×¹CO¦´G½<„£áw&ßô­wFôŽiç{àÆ¦nI7F›Ž÷Ö¬'ìgul| Ÿà¹Í]}o¬ç8Ú3z2AUöG³ #8ƒ,³›)lÅ &`©¸¹upŸ3ÝkmmÐÜ¥0 1›ÃüCT¯/—7·¥ŒÆùPLi|ô‰‡s/01°$%s21#Ñts|1“!6Ñaàæjéj³=–]«{Gä½O/M±ÐÉ=ñ$”`§š`¿ 6 aê 6G-^)‘ðÓ`#§õÀw¦óI™ ܸ ÅÐ !J¥²1¢_”¡3uÌÙë¦]‚'Ïïð0+–¹äáfý¥]¿u‚mañ…síðÕÞ-Ì0 ›críjms>-coVÔþz˜+‘›©áLøÏ 0{ÇgŸÔL±xnF,tµmp>ž]$ÔÏ ãwDé2ëþööŽý¥žìjê¶ÕÔ[3€üßÂw¶™3×cð}3ÞçÑÜq7å°PÃ3µFÝ1Ómj•G¡j¨`ÞçÙ7|»ñîàÀõ`>†¥–ç0÷%æÖ`NÊðK<7ÌáàÜ,–gXj1ü)£fdÛDúÏ£iFx2@ðÁßÁr\öžá¹a}á(›Ôðù(BöXàð<º&ô¤xt³*´6Û[ÑÚ†Aü« ~kÍ{"¿…½ÉVHL¡$þž ©#·<[å~á^QÈäžè*.5Éè5nÇ×LT,0¯Ká-²“4Ö]Ðûß©vçX‡=Ï™˜×ü7¨?Y±.Ô+æóÚ‡ZçJì›×¢,” Óíž)‘Àé‰ò szœÆÂ@râfDEIJ º¾îhŒšÂdzŠ×ï’l3™\Z$SáKéËx‹™5iqÀ¶…¾÷‚ÛˆÀìH^ÊcÛÞ3TµÛâx¹<9’´aÈl$âN0Ùœþ-—Ùn½ `S9öÙê½z;¼ÿdÉz/ü\Ñôa¾ÿn½®¶ÂU]ÓÙÝš¬œÂÕc-F­WN1UjVÐ%©yKI®¦uèUkxЏ2W¹µðI¨–-ŽZÄv*dü¯p¯… ¸ó;à3˜dn2Í4ó”m šIfRÊT„!Kèõ1 惚)Ù4¦úÐn³–ª’ØKBÓ–„¦lFÒXG¬y ww³$Ñ9c:Iô®Ä½AŒv(i£ÉV{ºt:TdÊi‚‰ãI;x,¨?‚¤ŠßÂ9Ê€…ñán˜Éåå8µì~;g*’Á¨Å¢ 1lázÖ÷N†v](™@ 'ï…ËyVT؃Àôô….öl×—­,Œ/翸­š-¯,-¯•mÃÀÈ$±£Ó{ö†7ˆ6Y#æ`:Dæ–ó@ÎI¸'BY1Z†‘ë¼=ع¬Ï6P€0^IÑ> 1hELB“&Êh< )‚|Åèõ”;)“Ï–Òå׫º9óƇqÎmÝó›JòGõZmŽ+Ž üÓ W³ÕÐ\k³…¨6ôŒ†×ƒiÒ˜gG ÷ ž5vsåªáö¸úŠsʱ‹Ï‡¨Ç3ИF d#YÔ‚ƒ@€1D➪`|À|ÔãDÇOðîàw˜Êu!Â3Ú&+£sÉ…ªyUÅÁ! Y€ábë«F£Ã·i“O˜ßèÉ$ß ~'Ú¡G†Š¯=º.æ5{È]8ä¾ÓGoÙx¶Ë!®ƚ|W"Ë%>¬”í=hs5?Ù%¥´¤T‚ñÔ1ö®(Âô.Á|Lc †±»ŒBÊË«¸õ®4«déë‘»dñQy’eO:~8ùÁ`ÆÖ|Úåe†³Æ¶„GŠç”Ã=8Ž5?‘•å»[xèÏé Ð¨¨cŸ¸¹œBq.d3p.nV´3.T&š9.¯p©´ý°…SÍÖ'I'îuÈ`eÉf¥¥®ý‘D8µ’ XOÞTu…HÙ½h 5“c) ˆÄ§— ¨¶^=e¡··© éòçLÔIõ% Tîir)܆¼|w†Ëì3‡{íÜç݇Ôdhó;ôƒ»ïLÙ3 _ Þ'[%{Añ8ö®xŒ±¹°8ɤˆí,»ó°l¥´Ùyvž­ôBù}x¦MsFxRDm\ϳ9;>‡õÇì©eÄåà™éê”À§KêD¶ÞC"%¾øB0®±õ•¶Â~×âÖç6áG+Ô§èJrœp Œ7ZBGë¸W(¸%-\Äs@Pà )%Ý‚Ã2ž]ÁXøìR*Ç0Sf‚{ܵÎăÖsÊÙôÖ™M®(g…ü°B8ó“ö–uM·ú–5 -uK1HNú]»à å‘¿Š@Bè›~=!@ 6]£[OB8z›!«¾[ìTñÈT’·)]èj!#±û’ÁÂJ¬è‰DôHb\èsÛ=?ZÃG0ï™°&Ûcã6a¤,Ñ\Ñ”‘¬RqvÇ´¿/’_Î1)KTÅA;c’ç  ¥UV”¶®ü„ð~w¼í*–Õ^n±Îy”i[U^û9J3†W0·RYÀ¼7_ 7øzÀR2D¬/mãJáNÔÕºv©òÖo´ÎÝ´ %D øIMߺÛïO&`e­ÔÜÑÓÛ÷áHé—Lòê¦j?*û.îäÙ ßÇ5|ey µ]ÛìÇ-Q¹D)IeªÓ’–‡ Ž”Õe*Õ2ÝÙ”%#`z30q&)˜IÙÛ2Îm¦ÍÆ¢©”H´ž"ļIŠiÍÁa*¯¹â‡Øü%Þ€›(öÖ›Լ~œ¢½WkK__¡”ûMÆíÑ–›é“†?̤8bFÆènîÒ©ž(XÇ}|p¾²l®mDý6±³L£É˜üÜâ†[.i¿éŸÝàÍhð–× “;2ø!M¿k„Å2Ð%íµÄéA9ô‚•T£ sÚå%1páx4¯öåúÜð©+h‘Cy ¹ÍÚ )êFt»g[2UúQÀ$xnÕš^)Ëã˜ç °]!+éÖ''Q¢\¢‚ÑB°áÜÈõ0=Œ°gªSOAb“LÄ|©’¸m&•ßÅLÐRå¹j9øÖgŒzÆdY]È)a5&œÔ+]K#9™ò¾=Ñ Ò\à²×\›2"[:…£8-ì0Çk_/ÏÄâ0Vq·!¢ƒ”\é4ôG™Ë î ÓPBDÆN-0ͱ‰H1d˜VaÒlj­7’q ö—Ô 0¢F¢¤¨´{³³¥¯‰ž‘¬&æ‘u9JŒŸ„pæ/ØÊ” \³¤¶9z>*3A}\Ý+ˆ˜®r¡8¨¾ ‚lTŒQh= ¾c[¨N2HýFõ£;6÷¤ E /¶Ö¹‰‹Ë³áÃD¤¼F¸X™CÑÅ´ÌÖLm®6Äkã:¸Oî‚¿“>M»mÝ ÉÉ[,5„§ßcÎæºa0—¿––j[ã eb›SzòèeÛÔ4Ùñq–×dК]~FQ Ÿ›fØe `¥bÈ~‡©ö—í2ÆÄ¶%­‹(LAÓ¨reèéž6O–•~±É\+‰Ìª±hxtž•[\'K‹ð¤~R³°1'ºáâÅíãÆ`© ,ìSD.Åâ÷´df$jÒ'ΨaÂúAhÌ þ˱ î6g© )¨(r ìz„UžóáK¤P2©”LV1¥Þ0UÒ¹ò#RÔ×;@<—±¸±*¯ßœ|%wdQyñh`¥Ì(ÏÅÉ¥šFnå`ÍpHj ¢‡¹w”ÆÑy‹ž¼âi,cý0KÞÀ<üžÎ6ÐD&Ì$*“f(„ÏÄ4¯ ¬`–…†;‚33¦5ÄU;àšÙ$|Âx=Ìh¡(óì(¦e˜Õ…gm?ÄS¬§N…ØQ<ƒòÜ¡;Š3Ž<çƒg€OgêaÅßaö€¹§¢ø.`Š·x¥NÆò­w˜l5üï~Þ¯ÂÔ ×cð)À'X–xè ó,KBùqwÓ>â=ÂÃãñù0wÏ tóh2ZOK² S¹çìñm"¨ÂsZðÎxrfåºm„ÏĪðê6ù„‘Ž»öâ›Áïsópl¬w2\žÑ½1GÁ&Ü 5Y Ó^£syø-ÖxðJñŽ4ê¡DQ 1P¯©ù´=ü¹ ŒõŒõ'¼×9ê^gyØÕ#ÁvyHÞô]V ËóèmÊ6 % –9;%r”˜‹‹"–á9S¼£ŒÛ¡„‡†ñg3+e($«ÑÕHþ]ðñ€]Ø*÷ÞõŸ±k »¶°k ÑÆ!¸îm>ÙµimAሓãÄd „ò¢v).&ÅoÀ£QÈ.w½{½Ë]ZîZÕ×½Í'»Ü—»0®ç‰S\ÕÃ!1ߨ¥«°¼ÍÓÞ%¥ÞvIy‡¤4]pÝÛ|"+)3W Äq<7âÎ0y¨ž» ÷ZCž†¹wÕ§K—Âõ#ئÌÉQÚv>“ÏR_  Ë´êu¡L)pt§THÎŒiá°AÝËH «à'ðÛ*p¹# O©É{“mÏ• ûO_ÞX(¾zø"¨ " £©V/D­7FS±îy®cˆtRâ›7­#ð(üW¦ûfû’^C£yî°ÈFn'uw«\@'å±$vÔÃm fbÁ 4Òä~ŠÂ6i('ÒˆÓK‰´Ó®mYOOñâ¨fÓÀ²nœ‹×â61—ï¨öØŒæýŽbü6Ø|’Â[%˜¡ŸS•h¯ÉlÊlq4õ¡EíÂxf™ÁM¨Çð1‹"»VpA+mí ÛZ˜Þ9+Ê Údï]yß•÷wO ²P¬ƒ{>]QG·0£x >—”ÚS´eÇZJ'ò°±»%óp–LyµIFà›¿ëQ«GM9.Ui>å»ÞdÒ–<4Dt׺§žpǬôfmÓ/„îb‘˜Zð2&*é¶ijÿ8­rÂÌ·Ã ºÃÌ7•ÀÌwÍ+è3¿ÃÌÿn‡™¬§âRµf^ºTíÇ™ß&0| o=†cU˜zñÝÆ…ú˜vY<7üÄà3Í(Þé4¶É'²…bû=«áží`ÍO­¬¹3;ÈâãòšòÜáÑö­|é©náwBzMŽÒî@l«F«¸À:—wb/?—æ·xãÜÏ^ÍÝ6±ã 1-^ð0¾apÖ}‡pMS½;OÁNÌ%Ëàˆ˜]8ú͸ÉT‡«p"~óà×—EWÐ4¼x ùœ.*÷š`Á²ÁÇ”R¬ë\6Y<¿+[¬~Ï Ì–rnFÄ5<3XÁˆË‡(TÍŸ•æ¡ó;ò®˜Ü0Ù\·Ö夣¡¼ñЖ Ä JJ¼Q·ŽÄ«9S65È&wêúF#dd"ƒ)WÖøWªÛS>»NCïEþ8ªm83"W)¡™ÒÕ¢{»Þ×"RÊF(uL‰™,£‘kÓòIÞ\l””wrHøã½QÆâ`$m†(êðÁf2þN §¨ ’­b{aER¶O¸–šáÂ噋èh”[™¡ƒ8Ll¯¯+,ê“GWŒ¹«_ðL‹ nT„„`}ùð-§7ã¦&ì¤W Ãؘ¤TQXWƽãQ.°2¹¸}ë!£…D)ç.bo¡~KÚmzÓZ²bÔ·Å7 #QXo%ˆx³3”ù6ýjÓŽ¡J&zÃÐD“*P¾eÃð¹ÔØ;l˜1{É:"Å'—÷†Mì%ƒç­ Õ)ÁÂp•ç·¥~¾ŸÖà]â—Ð_X±í-0'~ܨs$ã í¼"Éó²¢þ•\¤·>ê—Dë'—{Ñ-Ÿ˜çé)’rµs Þ²gô2ynÍíó´ÒE0g"X¬¢Y—‚±Èë– œxfÝX|ÝX†Â£Áw¦ ¯¢–~•ÊÜùÏÍ Á'xyÚxP˜½A˜Ìúä91t»æÐ>!J^‚÷¯?Þ¿ï}cŽÓ]wž£yǽBœëðåéÿËÛ endstream endobj 4527 0 obj 7226 endobj 4531 0 obj [228 /XYZ 38.2500000 506 0] endobj 4532 0 obj [228 /XYZ 37.5000000 256.250000 0] endobj 4533 0 obj [228 /XYZ 37.5000000 256.250000 0] endobj 4534 0 obj [228 /XYZ 37.5000000 461 0] endobj 4535 0 obj [228 /XYZ 38.2500000 506 0] endobj 4536 0 obj [228 /XYZ 38.2500000 749.750000 0] endobj 4537 0 obj [228 /XYZ 37.5000000 461 0] endobj 4538 0 obj [228 /XYZ 38.2500000 749.750000 0] endobj 4539 0 obj << /Type /Annot /Subtype /Link /Rect [456.750000 439.250000 508.500000 446 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 4540 0 obj << /Type /Annot /Subtype /Link /Rect [283.500000 264.500000 351.750000 271.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems >> endobj 4541 0 obj << /Type /Annot /Subtype /Link /Rect [80.2500000 764 108.750000 770.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 4530 0 obj << /Type /Page /Parent 2 0 R /Contents 4542 0 R /Resources 4544 0 R /Annots 4545 0 R /MediaBox [0 0 595 842] >> endobj 4544 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 4545 0 obj [ 4539 0 R 4540 0 R 4541 0 R ] endobj 4542 0 obj << /Length 4543 0 R /Filter /FlateDecode >> stream xœí]IÜHv¾×¯Èó“͈à $uÉ€àÃÀ£ÇãÁ {`yþûÎ…ÌJFð{ÉøêEÌ¢Ôd2Ö·¯?ýË·ÿ<ü÷??}ùö?‡_û¿¿|{)ŽMU\ÿïpþóÇû¶=öÿ>4muøõ÷—‡/¿¼ürúß/×¾}ù·Ó¿þï`ÿzúÿ¿þô§‡îtþÁï/iNÿvù»kÌé_Åíïóó¿¾üû?8L×/füß´Ö¸¶=/ãÁÔ?^†mšËŸüú÷—Ÿ®7KYÚ¦©¦tåÁt¥=üï½üå4Á0|qìJcšºlŠ÷LÔØóL]yšÉv§‘LLtù£4¼þநºdƒ_W®~*ÆÕF]ñrq&áåÞ Ÿ`p[–鿬<Õå £k^®3jU!‰xÿ½ Ÿ`ð²nÒ ~Y¹ú© —‹GW¼ÜÒ¶=jµ'ö¥~DoÃ'8ÿªèÒ]îuåê§Ò_n8ú/1£à¥ˆ¢ÃáÃÏß_~úzârõáû_N+»Lxýëûï/åé?ÎÂBgßÿ|ø§Óz>ýóáûß^Êcé®òÔùw×7ÍåM{l»¢¶Õý›/ð›öúÍí)Ð Æ\Þwt§#<½šóÆÂ%½^ÞTÃ'ooœñ–T:¸z¼/<1>¥ùgW/LŒ[¢7¶ƒ·ç£ág^Ôpb|(px ˜ƒÖæßmQ]¸cUÖm3@ <Ý»¥`È;AáÌ™Û&&à¯øùJAÌpo‰ÉþæóåMwtýG3Þ¨œ¬@B½´®ÕóI|æ” ¥ ÍV•‘-8 fIƒG-èI/Ú‚!ãH„r’KÓÖ‘¸5Tüp%˜ÎõGŠÔÔi])rwlêÊ#¦«ä•§ù|y#“(%\<¡ñD€‚@À!^ oÖl»ÄrÉ|2È ÂùáÕëò~ á&BµN L #–İS ué&c°ÖÝQæÜ¶iµQ7 ePBMi<ΊI‚ 810Ž Í ôG˜À0Â/ÄŒ ÂŒ†AkÓp§z3'úæ 0á7ådLy´f¶ ï´M«ƒÍÍvi¨*A½€|WàÕ«ÒdîoÉ1ŒfÞõšRìZÿ~—×qð<ðæCá¶cÆõèLxtç8€»Ä•~±¦ºðÛË·ì‘¥ç%x·BÈ€‚¹1à[„xE¹n"æü52hŸÚ¤—Kú]aø‰JP¾R  bTŒ±ª3{”cÔ•.åX÷w䙉P#ÎPÙ¢¦«n/m“Þã:ãl£A˜àZ$a%æÅ˜¬U‹ äH‹`:æžÅƒ…Ë©167¼/Âe¢ã«YX@Nk¬}>š+q$ } › «§D´H8¼jLqL’E&'\–*á<‚I™kRq–=t3˜øÊ– ,˜Ç2vû,ŽÂQ¶ÓMnz‚Ö¶ã)Mq¼ŠGwXV£7ýŽª£õe*<þ¦'=SßtpžvöÆ7R¾hß6wEQSñ¶‹¾é~j5|cÑ~z­îB"f̓÷ÓÃïÔNá¹ ;½Ò„æè(Å+¨àx:ÅWxÛð~Þ"@„¤D˜®ð1ß/¼óW=•žÚõò0Ž¿g`xí™Z9¨osV±¬×÷£V€)m†Ñ|/@ÿ&=GìNä|L¬'ÜŒ*Ä7Uâ_˜jAБ9!œÒ|_Ulb~Þ‡n~cè}’ÔÀl¡ñïЕ &Bx)˜*Hî_Ê Eí1¯½Gu$Ìà%4ƒ+ûV·” Z¾jÁº)MÀ½¹FJtÍ`Bt_û«¸Jõ!AšxÓ—©75|ÓÁ7ŸâWÐ{¦ÞÀy*8~ì gýS;}…ßà…ßàµx ß)œ§§‡So|ƒ¡ CHóvò`F×¾3 ,ç‚> ÿÌhæ3q÷pÌÚž –ñàýX5›öCøw…ivøßáÿðoà‰ þï¯:jA•…«®àh±ì€OΓKzaVàð¹Á½Ý`ê¬áÚ0T•øÜ0$âyðLCà`ˆÇ¸á Ÿ¨@v,Ù±dÇ’GR#Þ\µS¸ê¬’¦,nÛ”4ŠBPL…ªŠaìÉäIÁ6€1ðÉÎ`Í25s f£1Òá³Þ$„÷ƒiÕg-Š/G¸"QߦJ*U?uñpa¹ux§Ñ©+²á~|*hC7óM@˜ðߧɼ [gúOF¨Ä§Š¡IÉ«êÖcVkŒÎQEóÔµ±2•Dò͈‚°RÙå åÀD%2‰B{Ý÷wqòÕÄ~MÍk®‡ÂÜ)"Ár¯îšh¯j=GŒS뉺p\̇Iébvºi ëaå-¥‚‘ÔÝ>™z¦¬×¨&aªÈ*Âq1jÆ®ÍvÐçj_ ÂÆZh¨tÐEƒÍÒ‚C-Sí>gÌ{šñé¨F‰msù"©ËöHã=ÒXœg~’|‘ÆÎ´î˜‰+~“+žòÙ bí1»¶°;$­’Öì©ß£_¥y–ëÛfäÚ;<ØÏ£”¸˜"ŽNÐ ÔT˼ÚÚåšyµœåÙxõY¸nyE7²°ÄTS.&ŒàmGÚcŠ¿1˜ƒá3Àû!b5u£Ù…XÍ=Ât Ô’àïÔÍ=›¹Ù6·Â#¸½=t%•×U»c¡Ò8‰qf1}L ,® aO¦‘ªj˜¥à+c ’¹õLq)ORW8[çÕðš†C… ó¶iKÉÅšÚccL·!p$À†%1Å‹{˜ïÈ]A“LÅÒtk ;%Â7tÛ~çªÊÀw„ â*Â60U d/ÚšV¼Ik í¬ñ•¬b;tòÊÆ](ié£x«ÒŸ3m‹¸$ýÄâR4ˆ8â\ÙN:•¤7c8µ "3jÃÀ#¯ÍoIAó5‹€Ùç(õ,Èm˜‚|öÏ‚ÐìãÅ †Ã®†×«÷«Fºo|NdÊ&[¶òw͆-ÌQ©ºýÄ >Š%J¸TE b´§ù+¡‚n‚QjTHl\N¼/Æ>¼7#I$á?”PSvƒîs‹Þ8ìž'?å÷̘£ãÊ¡€ertxËMÜ<)ròœoÝ>ÜÝ6ßèÆÄ7 ã©0$éæg1)ÌàU—D½U\;UÈÓ æ¡¢{qÍY|Ûø~à7F p½xº2fåšgÇàƒI v0RÑâ7p4\iZ ¿'Zb8`æo\Æ|B×6ok›o”©ŽºÍ„g˜¢,Ï)7ÊÁ6y§k¦%¦iOH;Ë¢~x[Û|“KJZ3ží´óùîtÕ´Â~³aÚi«ÕP;eÚ¹bLôoUùýh¤(k¶Eí°ó|°³fn´ü›¬Ü¨*×õ^±ô!]e78âŸ(“ÙA$ª¤#.W\~©<Èl¹†‘Dxƒ•Âu -3…‚q„J1×Á@®ðLz Lp‰jeì6® Rp°[DÒNÚ¶˦Ù@žÒ:©ì4C A›L•iz¶ª›©ï…Ç4 ’u3h…s‹ MA¼º½!(àeB%n¦ÛÅKå#n#W¶ ! PrOŠH÷” šƒ‚xc¬+l³¢‹~ºœ\7™“ €qÆI2«Æ-3|:bw1È8áŽI±¢T,Ùi:ù?Ê1¦Œ>â_*¶ÓMQE{ ë¯\7žò¤j_-Xw'W£7=@WG뛽ðhø›þ†¦¾éà7Õ€ÿWûÀÝ7o¥N:×L ÛÔªkøæ•­@ßXøï´·hO­€í ó¦9vÖëÉFìŸ^uï[1å`3}M­«ÃûmÕ söu½ˆu ›g(³n ]%¿GÙêXøÏìŸ6&à**úXÄ Le#Ì0‰´Ø4% 8gÒ}uûïåʺÍå&PµC™.Bõ°G´6UÕ7™ 5ÔM¦7þvÎãH‰ rQ ’ Ä$uM“ËÂ+ Ê ªÖ@¥šOê–ヨ*Üv)bl¯ø ¡oÑTpðÍša•Ýz LEÆX‰áNÕIË0|1V&Y"©Ë,¥½¶5/4_!ãaJzcÖƉˆø$7¯°æå¶Ë£ ˆ3ßà™Íeá—H°8ÑÚ¤¤ê£NñF£ Öµ·‚w8Š Û`wÁ¤8QqùhŠÆú§‹¹IŒ·‡Á®ùu <`ʳ2òÀüS]fŸ«äº%”j§ Zd2€~`þE)åº-eˆpј õªúç“X¹3óµ8s”.Ê=:¤5ð*_¢Y_‘ŠÀ({‚¤¦6,DK,£Ÿ«ò¡†Ú]Ssù«U á½$n0H}ZaS«å)T£•µÄ¥*ÙóU I3îÍ\«”Z­ Y,cÅœßüC7ÇR^U­Š‹„ÞVk'ÝdµÈ7éÍ|µ©"rÃ>gb‰uól,kïù°:ù°ª¡×“ˆc¯ ÃêªO9eêzÄ ¦È. #Àžçü¦ƒ Ž!{(ä¸ {¦÷ âø ßàýž>Àz³•„+nMy6à LƒpË\Ϻ>^¼ïGû wÚÇA—ÃGs ·€á æI5SaIó5E*†Š°9êt–SGˆž‡T“ù^×5g}fs-¨ªW»3|ÖŽ³8Ó¶±·>Š0ý0=ά£šC/*³©0bŠicêüÚfTÅ•*M*@#bÎ+àB'%[J&aÄä«L=[¼.#ß2¼Õh}-Ýȯ )¤¯î˜{sÚƒÇP)^ȨOqØ„í<"ˆJÔIK¨QºÀ‚ûÝŠÊõÉ,31¾Òù"Ûs$o‘¨ÝHÉõ¢MxÑ—ûº\W}<pŽU§†xº¤‰y}h(ÊŸ@!‹GÄ+Û3&¨´ÅÓVÊ`Dpc´:ËZ>»$¦d#‰%òÖáJ¨[TUå±™MIr÷QÌïMj;Mj7%šÔ•/6œž¢ÉùWn4Š»Ÿã&šÔfJ4©‹`Ž"MοjG£´ã92ˆ&§)’Eœ¯¯Z˜L9?{qF³‚ÆÏØO°ØuäÄBQ6{aúÍfúÁfU ‹Ÿ(¶\3QjŒpüžÔŒ~%°kÆÄDïè&Â?2>¥†Lã1¶Å,‡¹ÀuÍ ƒTçX‚Ǭ@µâ]®sŒX#TÍØhޤêÍéV=^¾¾…rDóúyËUJÎ+맬iÜg ¾1PA%:>ôõ§mÁn k¼ýõ"ÎT»ø½)^ᛟáØ|¾·8M¼Ákësf§Fƒßø¼¼êž[ò¶HÆTµ¦Po J…A# ?WÖ=¢óóÐry6T’c÷.em[ÊJˆÅƒ²½‘b"2:&–#‚¦¤r}©©·øªÁS¥^¥é7!Éá(1üf¾:bÕàÛå5•ˆtF%rE4z“.CÅ/EtiWÕª)2‘®¯æ>l 3r¶…p¶Eé¹öÎO|÷áåWn4Š»Ÿcp¶E1å>ì:ß}xz¸»Áax¥Ï‘Þ}xZÍcB·¾¨€Ý(†Ý¨cr̘…IíâeŒ³¡ZDÞ`.×YDÊ&ã ÁK¢%“‚C4þLR”1¥?±l|N·iH£*½l Ð/)½´çèwß@¯÷ K–,ßE^8È-3QÐCl1ÖC¬™ÒC¬óõÓ“@9ÿÊFq÷sÜôÓMè!íi*oŽÓ_¹üªÒŽçÈ ‡Ø[‹1ƘKà¥hG&EB:Ý¢â¹bß9# ÆnL'Mº:Ãü…b5²éº1Ù,‹)²YZŸ¤ždóü+7ÅÝÏq#›®"›®ñç8= ÈæùWíh”v¼j|?Dð „Á'º™äX²<xŠOŽV@<íá esÅÖø<‚‘õŸLÒÆ;]ÞȼʴÅdÚF¦Q!3°ïeªû¤«”jZ@åiõ¤PZ@=¡Ô7- i•§T“Z@hÕ„PÝ´€j¤Tµ€z×|-àv$»dºK¦R2MY ­ÏÑ{ò]Zkai ‡Eá`db´ ~VÛù”w±¼Í"mMÀ ž5¶ñä°vRk9¬ÃÚ›ÖŽä°Æ“ÚI9¬ ä°fBknrX3’ÚŒrX;€¾Ð{0"þbóð>¾íå Zf»'&*š¹ÝV|[*Þ´?Š£Á ‡÷ø›AÕq¾€ˆß0;Å7'ägÄë<.™­VÆÎúÞF».vÊBÄ$ÿ¯¸¶º.ÇSi§‰Ï‘¡óÓ~©ØàLåä²ÉŒµ!¸u¬¬19ºaQ[j•ÅhÊyÚ'$í|æœÇ³ÕÌõÓ1 K6˜«‹òtS¤,™`‘-‚´¼Q–Oe^A$‘*‡‚릯–ó¤¯ Ñå{îûIÆ$ʲLj•é™]g<`2oú¶»¦:¤B Êô>ð<ÅO &âÅ®—8LÙ¢èÜïvw‹·ÁÁÄi^!Ü¥÷wu¦ù»:ÓNø»:ë×…??ñý]—_¹Ñ(î~ŽÁßÕ™zÂßÕ¿¾ýù‰ïïºüªÒŽçHïïê¬{¬Mìþ®Ø>v×Ñnù{Úý]»¿kI—ЇaõA °çqf9ë±ÀÝ™µ½Ä•JJXË”-EÎËÄT[5Dîí”W½šØÙ%›stÎgL¦ÞœO(WÝFìÉhBX8˜A^B œ˜Âù}žÏI™ÒmxÇØá… _¹Ú–¥èö'ø6êN$Þ p•D©ä‡Ý l˜®Û0]3eÃt~qÚó“À†yþ•âîç¸Ù0]5eÃt~‘Ýó“À†yþU;¥Ï‘Á†YÚºì6ÌUKÖÏATÂ3_Ü µ©“-¿BQã¯n/»]cèÑnÿLCÌ2tãb.caI¹³ç·ÑTó tŠ»`¿”*e@§¯z'læ ˜Õˆ³ÖÅèm– Ø¢c4©U°/qÇ­6˜ Ü–0¢ù\eËÔUœB‡Ì"ÖœSñô1:€0eˆ˜¯Íã“[JG\¾¯œ€å¾ÉŸl ª²¤FhMé£ E4ŽÝ©úóPu&0‘hKL~ "%~&½ Ÿåª¨ª*íéù®šrì»jª)ßUP ª»Ö‚{ŸÎ¿r£QÜý7ßUã¦|W_Óêü$ð]ÕŽFiÇsdð]µ7Ýp(ØÔ•Âu3ÅÊà›€—0ž0†®¹Ç”6¦a… – ÊÔ_EX›Šg…«"2'ƒñ 8^ìÈË\³Cdʺ¯]é1Á쯦B{ù5ƒi2¥•žÌ¿E3ùû¼+´eç*<ÀÌ#ð/îésÊt%„:„Ê$d^]ßàNkº ¸õÑ^ÁjÎ%>µ>]çÆútWNéÓ]í뺧'>}þ•âîç¸éÓÒ§;ÌaB}úü«v4J;ž#ƒ>Ýuf®¸ñÍbá÷›âÓ÷†©DÂðhÊ õm„ḃ Éó8UÃà/&$¦v&ç²n % Eä$1!⥪%"[t`å¡ Ã,å3 ‚øŸÍ™Íøsuc¦1ëPõSår™3ô! ì¤äomë1¸M% èÐn¬ªœwF¸™”…ͤ˜¦UBc(ØÒ ¯mí¬¢NÔ&o%ÚóL‘í ÒßhvŸÒ›2Øï3‘0ÓºÒ§¨º&V»³j¸Ë;2ÏÓÂsgÌöà9¥u¬ ¸ý–` `ᛌñ;è:¼5œ×‚)Z%Hsñü®\A'ØËˆ®ÊMEÊ1•µT‘2„!Ìd‚ t¼9*ƒ)±ºÑ^?©ÀëYQ{iwÔuÆ8Š7­Bö¸™^‚£Às¥Õ¨FëQ¶"ݲ¥ª+ Jµ0Ö_\È®oŽQ‹ÎÏgdã†+ÎÍU.OqcÂuçwT ³]ÓÕÍ È+´$íˆXù\RÅ·»ÉØÎÝ­áÖŽcMå’òxÀÏââÓšñHYÖHŒðS <¾[•}B Ðíìø±+™ÂÕ3¤ v„Å“yl£Ž‰ldüò‹^^› Ò‡#w¼$&ø[×$¾¸2I©rk¶­™¢}LÏw½òë•ë,¥nMå諭ÂÔ«VaqT("Ñ»C`dxm*¥D"BaUsV·ÙbEäD¸l¾SÞºýÁj‰›–çΧrÖ:“w¸§ÔnFä]\HÝfӘзKä 0zr¦Uö ]_Ò «^( ¯º¶’Þª0»‰(¸žˆ`/ÎäUJb¶M™x·5‡åu]%.†žé©·ú ‹î↧B+T\¨·^ÚRêÌò-‘(÷ao‹0)e(PP·ç‹0gë¶t^v îh*—*í[a¼sƒ+h¼È0žLÂËÇi•¨k”&b²Í ²zèk [‚V¥ÛiLÍAÀ²ý”Á%êÔ~dÄï`ø@ÜÇH±¨d3E,®"è–1•<Â÷ƒ±ó­:UðT]YTP£jA›lPF4að–`†ø›G?ÅÄ4ü!ŒqKXF×L}"$¹%µÙz\˜ÃOU/"&‚„ O˜ÕBëþÔLP¼ÏÌ;nqÜ­/¾`£Wˆéºêç ²º”oC3t6\›ñ\ñtICqƦ«ïüöò-|œ'òÐQUe£1ÀÕÎOhŠ:;ûتP•p´×ÔŒ¾×›í­©£ëÃ?&Ч21×LTÖú|y‹õG¾i ©8LVéZ£Ži…‰PÙpý ‘+ûeà71qwªÆ~ÝP"&N•rf1QÕÄ’˜>Dج’¸=SÆ0¹Æã‰Ù"؈0V2=ýðÄLMÕŠ"1¾/»•û4kø#²ñDH> endobj 4557 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 4558 0 obj [ ] endobj 4555 0 obj << /Length 4556 0 R /Filter /FlateDecode >> stream xœí]KÝHÞ÷¯¸k¤¹q=ü’Ò¤{‚Ä)šH, 4À  þ>î¾å~”ý»¾>U¶oîD3É´ãrÕ©ó~~øí>ýõ¿§÷?þûôSøýþÇ»êÜÖÕåŸÓã¯ï^ÿÀvçðçSÛÕ§Ÿþy÷õôõîóÝçá¿_ï./üxÿûáOÿ;ÙÓï†ÿ~ú㟆þþÒã_øç]kÚá÷<ýÞ·føSõüûãÏÿv÷‡_þõ¸âø¹°™·ÿÿµÖÕýã6>ýõn<¦yúõߟþu÷ဴ¯xï[ÓŒwþdzoOÿùËÝ/ÃÆå«sïißVïùPk¿d»a ÛW§n€Sü¡§_:ËýÅëªo³-~Ù¹:TŒkŒ¼ú¹kÂ?ðÏä·»G˜Ùª0k@¯¬hU×M¸š:V½¬ž«ëò-þ´sm ¤Â‹kÞl[ðôuø<¯žøÏˆ6O;×Êx³pqÍ›íú>€Ç¹Ð^^ñ¦råÌÓÎÕ¡2Þ-^]ñr›ªóùòËê9îÖø*#â<î<CÆ‹kÞ¬­GØÿêèeù ‹{ŸÝ_v®•ñnñêš—ëžñ9àÿ¼|†Åôψ9;W‡Êx¹“Õ?§¬‚·rù 0!¿ /~ür÷áÓ ·ÀlN_~6÷ôÍËo_ Ô§ïíÆÚœ¾ü|úuU™ïsúò÷»þ< ê¸ÅðÄ£'¾COª=q |ç>ùxîÀàÀó`Xøê#|ò@<«bו%¾ƒWÃ÷ó)ý‰€opo½<ùáË@¬Ùé¬]Þwbjø¤J‡â·óÄbˆâw ^:W/ž%ˆ–àƒõ "wù”5~&Ê€½2›g„íÙcT 7+›Ìc(Å£±OsUÌ!7Ç·+•Õe$‹»Ö\¡®kØ„ÿI7÷{À¨m 7ì·f²h XðØÓ¼TaS†fêz7X¾½6Æà¿` @= ”4)•«¬›u‚íb!§S ÞÎ…Åœ{™˜˜7ÙÆF>wa—”ÅTM1˜xmx€ég þþ+ƒ¶´o%SÙŠwãæÊh ­_ÆŠC>)å'fr,Æ‹Ëqë‚ùê ÁŒ}Gk›úi?1™v箯¢'2õgï.Ýå^ŽV¡w |RNܹöM×¾y§ƒO|úÞ‚‚2ó$ ËÜj–øÎ…Y3n;´sÐOðw Þ[ ¿ÃÀíÂ`»ˆ¼*ÆíŒ}}t§yýÔµºþ+6w¸ZȈìÖÜ­Ê=a4€ö~oéÂÏêV±ˆ¼Û¹‡$×"Œt—[7Õ¹iÍ›w‚/zæ‰ïøà ‚ìXua\˜?`b„—<ݾ[|Oy1,1¦Œ2±®ëH(b^ÁÅ,TWmª‰ž@$öPI$ØØ4á!OÓ¶1ò@D¡Ÿ9B#O€Ç+Z…Xëkˆé\«Œ‚$Åœ’Æ"Œh´|=ø;˜»À')Œy ¬aúš •%\^d¢ßàû‚Rß~ð¶u+.¡cF™]T¹2òµ¾‰ùeÛá{Æ\3¬a%nŸG°Há“ÒÅÈ™À? ‹‘ÑI |G¸[Âpc”1¼7Šac!™W¹OਂÀàŸ˜Pá%#ètÆŽÖp_ÛßF‚*F(éSÀOèGîŸÙš´Ø‚g˜A°ï`3ïÁ8£p ºM afN¹&Ƽ^ö \¼®/$û0‘10˜"ÕöÀ@tcÄÏÅâ?a ,OpcIŠÝdï’cð›pÜ–rÊ»ˆL1WÓÅà Áòuc@”ÑÏ8ˆ³ ÔÆ7‘@¥¬JÆ© œb,5±‚ÁÎÆP+Þ$hô}ûö“ìýr‚h4èI@„æ\ð¯ ñ ¾Ó£wÆ;l'¿„R{î»ø;9iüy’Rò€žÆñ%ºÈïqn¹y’²NY6&oo 3|FÜ67«#FÃ0£äZ“XèðïšTúÓA"¯…œbá­7ëuL¸iªG‡F° ˜}J¤5á 5jÛ›^L QÎô©œB+ô”|a/Âm™.T¦¨jv –0Þ»ÂÅþ›ñÀW`]búnÓÚãé×Öü7#óêL¬ù&`mc-•Ýà  ÄnóÜÇJr°pRÖ?ïà!Ò9}@ìž{îºÂ-O—dÍÜIó7DšÞHþoÖ.–ÝDÆ©n WÐtKoªsvÕy}˜z×Ç(týT ƒùD|E·a“n ËÌYv»éHQÀóX_« —Å“šµ/“‹oäÆr—Ψ|8¥—”éõÐzë{¶7ñˆ„&Ì}“µ»”µº #’GYûð™‰$eôò›ŽLbR).•Ì´• ¤N·à›iÆ|G%;ƒkÏÃÉ'0äO0óf$å)WgD+à ­YhÆ~ÌÈŽªª€¡£’5°;%§/¬îé$‹ösóÉg÷.)c8ñæcViE%ü”⌲B ¦ÊÝ95ï°&JÅúSÙV-Ùb ^{bTô¡‚âEòæZWÇT­zBüìDpã¼³I¬ibúSØ©—BZVûðÞˆ] ;¸º:«.´"}…L˪úúfÜ–ºâ[>·R9aß ^kÖÒd®Ìµ•ÛBšßmçy'&+&£` ¯NÛu0©ÎÈugðªœÚjϦkßcab¯ÓÙ}›.+…#e{€ùÖ‘Tjæ,_»•‘ê](°y!ûK_ðE™n›)'; ªË*ô2¬þ3·¡ë}Å@a̦0^-¥UYÀ¤RlÜI5L‰æK;th^›1vUrö i®/Oc´Lõ&#Ê¥°kÕþ,ûi(Ádr L‘¡±"´WElð}i Ed‚.z£«—¬ÚÖŽWh²éÄ&r˜Íàà!îÞá!božäåk¸7ÒPåû·ˆ…£ÓM×(”F±}Ó¬~PB¥ àVot ÄU­¶ôŒœ5ZU‰³b¥$·BHåBÈ[Ö!¾Ê¼=ZSÑ1›˜{¸ž½ßÁçÁ»ÆSdûtˆ†'YSYú˜æ«äEß¾27ô-ƒ¾Y»0¹&¾ÆíÇË©¤ŠBc²XŸ¡B5K{,¨L°£KÉt&*´}°.¯)BùŠŒâ+àŒë³Z/f½`ÏfQ1çjmÇPJ)çêÍßv½I7Y¤ n*±n-#mæ€Ü¼¼åi…J«™xn6ÍðCÅ:èœ.OÓDB&¥õS¡J…½ê1‚¡îê®ÛÖØ‚†V7v98ÔO°áa?Ìp]9•¾ÆFÊm~-ò˜‘$‚RÉpyF§`ÒÅËæ&ä÷ƨ${¨,ÂäêZ¸y KÐÛT~Q±Ê9{³só|=)¿h×$Må“z2[ø÷J6Ð+]A™Z¢‹™1ëÅ ªÆ?m’ÉÔM1¬c³>@G0®‡ù Ói7![‘+$Üñ;Bø¼r¾}Ï5oï-Ëa»e-Oá^*TQ¼›äƳt3g‡\ì⦊¶‘§Æ’[²81jYf$(íí^ƒ´“â;ÅZÎ¥Às/0VÁ, ax’~BLëØ3•ìF?ßßêCâÜõöøv̬+‚³ç<Í´©ëñ“¸3îr„«X.Hiìøh.ƒ#›Ï¸˜:ªÕlÇÌ˹V+“je£2mø›ÈCµ4ÕȯOñÒkäz1y Êe ø;L£&È¥f3v'ÓÏöº¾¨›¾~ûÉAª]‚@¯Ý 'áhõÙÆ‘#ó‰xî ÈÕ™wìKƒŒXâ> 'cû±™wîÑ¿iÎÎØˆ9´·Q²§ìÀ”RgZçFzÓM+Åô2kQeÊ¥ø¥z]æ ‚7+¸ìà;XâP5¥pyR£³·ê·[•<$.-Ö«ä!!£üE†\ ¦©p-U xmãjt(ªLSgj‚™Lí9±%fš±p=*9ZÛψ¸¶Âÿ2Å LŽ ‡F¶Ç0¡ÌÙHDª£@𫉷]óV?MóóØ Ž8 ñ+¦"ûȱŽ"7ÜUÏ¡ K282…cŠòø†‰(:ÞÃ/uR¸šƒï¸RNžÇÎHqÙ>*“ylètÄk1›Tõ½w´× •BÚ˜†4i $Ꮁޑ’LTÛ¨ÄÙr·X-äUÂ"G€/§$©]$J˜©‹ØÇ&€žÚ«e#/ëN†Ä’–‡õY*K 7¡Â: “…w€u`¬;Á'‡Öϓκñ”ÁËÚ,ÃCñ¸,`ÔÜ|ÁïèîúfsíÀæÚ Õ¶+N§úDÈE…O„Õ0Å™û0^È÷$¤‰€Ë˜`Î…%Þ¦@Œÿ Íy¿5¬¹°ø~Ú¸*ö2«ÁóP’›É¤&òóñ2œXÈ _ÚAn×õËPÄwR®nªTý«²o®©šL X»I?);ð.se}m¢[;€ñ’‰­é"xäNâã#Çy§åÚ&¦gaˆ-|ÛÁC<@"Åñ}<÷¾su£w]ÝÄ4»}¯âì;×·Ñ©¯?Êp¨Æ‰ àö—y¥<ÀH°:*Ç`¦Dóó(c=ã1QoÃ9Uˆ©žÅV'öëºõÕÂw°‡k¿U=i‚¢ˆ=ip×P|“îg{¿©‡¾ !‡¤@v‰\;Ö˜ö™l_;†ßµcAq1~Tíb4J«éªá‹ö&|î:¸ªæVÃß¹0šöì@Ú÷Dñjø¤ø<ð~JU¼5ÖlòÚªQRüEXÁÂép5á€yG–«ÿ Œ7FáNÈ J¨€¤êM˜„òRã ’›ŒÏm©PÿÊÛQºç<¾¦ÿ_æ¢à ó°jÓGRŒáàÊ÷æu>‚Mc'U²ÎÈ*¦Õ‹n_¦#öæWIq¦ó Ó½½T÷PÝr*ÕѺ\æ¦A× S’É×áyÏL¤-;Í› bsápŒ›c“M˜Ô¸C¦´CG…>ˆŽJ)lrP¢Tù™‚oVµœ ©­ò©ÄØŠ©Dì˜TÀ[ç<$†[Ã¥\ŠG~ñ[Ûèz‹{nÖíÔc¦_èfúk©A1·hÄXÞëÍÔú”Fw²Þ‘-±œÃëzI)Úawƒ]Û¡7³3(×’Bzë{–‚¼×Ù÷¬Hr¤íÚ·ˆ¤T€‰S- .ˆÃ •8ɯT93NØÃÃgTö¨ÆbxD»fÔ¸¦˜ï§öx„æDñ®PTHŒcÒt…rh¢Âb¡tžæª[£ÀUø²ÓZ¾7lŸcb8}éI™z¿Œ‹Œ¤R]*E‡;(ب¢qï«sÕ•÷D3ˆR­Hæ]¸¥<éµI'½R„ÛÙCc¬0 ‘(TÒ½Gf×ÂjD1F«ÅX/}56ê8{AËÔÛÕ’<«Œ_ˆÿúvTEÑÁ“ÊYÕÍp(Ö,YùYÛî-Ì”œOK.T))(ºÓxu TÈX„NDŒÓ¯Æôv"æv3}šnŽ ‰J²¨‚e¸¿ÕŸ¯úΕ՟{¬ÖÝŒ1Н[BNá[z2-÷ïšK£F 7¼î)pÃxÉýïtÛ¾ +d[3ºÚ‹… ìÛAßΛ¶|ӖιÊp”®^ÄåƒJT"ü‚ù“gxÀöMÜÏßÖàâNEB#¬½l>!«iüD•ÊÜ…7ÁÛ'¤A©¶$¤*p¾)Þþ‘F¼]ÿŽRÉ|‡ÌŸ\ï8£^·”œ (¼k!Û‚2ëÓKKõz*oÒK,fØÛúÈ‹°<“õ‹G¤-5âÈÙI¦2‘è+ÆÐv(úTÊe×—RÕ„ *tSÞa‰UÌÎŒqÔå"›²¼éITù-ò$@ +LaQK’P´»e㘾w‘ØÜu/ô͹Hž{AʹމxyU¥N™`T{Žá»Mù‹‰,¡øŠ«{”ìÕåÂXÌšC¢¬ìaŽÏðëôuàâ"“ÿ¼ôVHnv¸ŠqçÊ<ÂÿdŸK± D€Ë‰Ú€]<¹ölŸ˜Øë'^ØLŸ„$Q{n&MÖñèžô·„s{ûN:AÁÀà°mäcE¯6ÓÀŠ0¢ÍÃàÕà;÷MÒÑ_åʲ÷øçê9ƒØü‰§NG o£€ë!²c´ÁP…°ÃXøí ;€ß :ÜÜ;ƒ1fuSŒp®D3üÎǰû Z­y‚÷tÓ9foÃÏÀÆAø‰bÈ5^‡dYšm+wü~%ñB„ \:H¾%©wú|÷;U endstream endobj 4556 0 obj 6459 endobj 4560 0 obj [230 /XYZ 38.2500000 542.750000 0] endobj 4561 0 obj [230 /XYZ 38.2500000 542.750000 0] endobj 4562 0 obj << /Type /Annot /Subtype /Link /Rect [324.750000 626.750000 399.750000 633.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 4563 0 obj << /Type /Annot /Subtype /Link /Rect [493.500000 375.500000 544.500000 382.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4559 0 obj << /Type /Page /Parent 2 0 R /Contents 4564 0 R /Resources 4566 0 R /Annots 4567 0 R /MediaBox [0 0 595 842] >> endobj 4566 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4567 0 obj [ 4562 0 R 4563 0 R ] endobj 4564 0 obj << /Length 4565 0 R /Filter /FlateDecode >> stream xœí]K«ä¸Þׯ¨u 5–d[6„@?YšnÈ"dfò Ì„t²ÈßOUÙU·®ìO¶¾{$?JÓÌtÏu[’ÎûùÃï¾þåø÷ÿøðõßÇûß?|='[Ý?Ç˯_?þ@7§þÏGÛTÇ9|?~?|9|9ÿ÷û¡{áë‡?œÿô¿£>þþüï?úóù‡?õéò~9XeÏ¿ÿ|ý½µêü§âþûåçÿ8üñWÇ]V¼m׿õÿÿZkcLq9ÆÄÖß·ÏT×_ÿýñ_‡:„íR–u]GUšò¨ÚRÿó×ÃßÎÜ–/Nm©”­K[¼e#«/;YuÞD·gØTƒ}®¿dVWoŠ&ÞâדKE™Zy—¼Ù¦µ=xª! @ÿ¾¼üâ¶(#^íõäâP¹Ý-^]ðríy·ˆ—û°|„Åus®'u¹žÕ%/×4¦ЙOȃèeù‹—mD̹ž\*·ËÅ«K^nugmQ(·ŠÈ9mݶñ¿ž<åâÕ%/·QE D/ËGX¼m".~=¹8Tn—‹W¼Ü¦0º1ò zX>Â⪎§ˆw'‡J¹žÕ%/·,lDÊ}X>Â╸øõä±(w¸ú—UðQºŸ[ý»çÅ÷ß?|>K¹úøíoç“]7ì~ûöË¡<ÿÏÅ:·ÕñÛOÇß…n~{üöÏCy*MçÀ¸ü½ë“¢º>1§êl\ž½<ùt}RŒn”~õ¤[­yùA —ÿ€ž¨n¬»åOM[Ô¯7Æûà'x5üÝ©?};_sœRʽ¢¢Fçô\„.†‡n!<0¤ð-¾wPA1à†8ˆW3zB!¤…ûÀÕ”º>Qæö©o;¦ÐâEÌì{RžŸ¢›g|OpmÝ/ÆË—6ãëÁhÀìƒAŒ‰ŸÍ½[ (¢€ÔÝ¥nWø&ò°,ŒðÚ`¤ ^rëI©2†x5âÔê#ñ=ï ð§¤OD)YÙÖ‘’F¹× A§ „ðà-Ä4sE ÅäSÉk,šæ‹J0dß dÇðEU/ïƒ0`¤1%§±Ã7Ç -†±Ï^”Ìu` 0æ–úX;ƒÔâ¡#Þ< ã?óáU… £¤cVßÊ,jåš™‰Í^ ŠÊðgøšJŽ c ãgÂ26û³‚¦û¥!>kcÀÖŠÈÙnζ¼}QwUž´š}ŸÊ냀ÑÔ\nL©Œò(ªŽ¯FíˆÙÚÔjg_îÖ|¹.?d<2ewØödëÊY^Ô÷äqü½›¯ÂA(yìWânËORä§ÊK,~”Ϻò…mioøù¹¿ŠëaF®oäIÏÇž4pµOðÉGbŸ=1ïà>øKñÙð÷¨ð³)¸Ï j× QÓ&¤Œº~-2¾¿ƒ!¢·ˆåI魯[ø-A'|5Üg{ð03šò~>No|b-M"ÞÍ:‡.+ø]ÌS…ª”â²!m\Rñð(<jŠwÅ4Élã|ã?aœ™‘©d¡ª…‰‚aÊ1åª]Ãð¨æ#Üg©˜ÊN$cühü§ŠÿÉd-†:Œb%š„%!5š¶Ää£áÄÈdáyÊö5;cUÐ…ïqûc†„CžÐEG ÛßDÀgÃ'€A½ž!ªÖ&jëfĄ̊çifÙ÷)¸—Å{–™sdÎ1_t5M©ONu~·‘-šû–„waSËj÷žaÇ,Ô¨º²•9[°‡Bjy‰ê¡ë'À—ÆW÷WÂTÈøœð§3ˆ‚ ¿ÕFÔ£J å2„“œ1¯ñ×Ј©Ê‰ê1œo‹*ìKä/;qæç31!d™N^ï…ÏqÕªºt%ÿ¦Õëˆ,ÑêÊÕè¢wJ§Úª×)OÓWLyŸ4Sóà®àÞDQ÷ ´1ŠÃ0µ²öD}–ˆù/uô¡†ôqAó+–«K¿ã/‡öõ~>|MÞǯ’žHÃ# ËN¶t]¸¥ ±GÍ Z×PLžéÅä¹Ö3e¸2ÈøŽ6¥îkÑzÈé#¥†@Ð ÓçS ,Œñ-Zî¾X“w:$"[>ÀH§zg –ß½Þ@ø‰¥ JnZT¥io¿XÊhå*= ZÐhò˜FØ” Z‹&H UÖ%ÏTÖÛë˜qf¬°°…š¸ƒc˜wcÁ~M¥Ç.êžµKô;­Ë× ^Ë—t†õË¢ ^YÀwpà;Ú±c »7¡+¹„îtÏ;ÐÁZŠIêøbªâ‹Âƒð °˜c° t¼Æx?Ç<¸Œ±ï]Bì«n~â*?aD ‰á ~‚y,q6ÌI \-e0þ¬øeŒ]Ñ—æ`¾ï{„irÅÅ·ÃâXÒcn<‚o“¬¯M¥oYŽºû€‘êZ™2¢s†Çcüߢµ-Âóû˜æÌDEÙ¼qÙ 95‹Ÿ.µ|¬šê!Ä4¸!€/2[–1> I5¨A'Sa˜¨‹dœkk$:¥{J›˜žQ²…¦²3CR©¢³ØD†ç*qôU4P¥ñâîâç+ŸY¹%UžßE¨­-šÊHzÂF‚`›<`Å“°^Ťkbý#|2T™±¾.2'Š¡Òù½SF¬«F½Æ¹ /"S ã,Ø#˜,jÔºƒ¼=_ÊÄZ™r?b$¼ÇoΔÃ`ö&ã4øžX`Â"üº˜IDiïš¹ƒl—ð@Tc=ïÈBGÕp¤GCV½D¼³M]áÌ*¢8†º§Ä¹Tßp~„¨Á|=aND­ÚiìË|=óu?D!zN€)¹¢L~oY†Y²HK–bH–ml3Í4þgÙ–e›ÿÔ9³7K ¯”¾¹Ì½;î]Ùi¼ÌÜ;sïZ&ÛÌ1ÏR¢ð5sLu§Y~tòÃÞÛ®¦™aÍ-êIôÃQmц%L”™ÊÎa¦„õMÕªSá´Aó¤AöÍÛôíÑŒP_7;„šAŠ“ÀL–X„‡¢g$9SCA–Ï‘hª#ÜI˜9 Ü3c>'ĬFTÈ2ò¨­è"ÊÄÊ´ŽP\ŒR——…ž&‹ÄP0&gŸ*˜Z>Ëž˜*Iñe&3šhÅ LKUÕá¡9 š?N8Õ¬©Åj+TÉT£ŸX‘c*]ÂK±# Tu9Ùk‰º»*ïÅMƽ•ȸ£{ßÔ6~-•U®¢×Bðv€¯OºëÍ>à#Eewîð‰‚@ÄÍK{’.oGxyò~OHcï¼'¾k£øK§ˆ6 nÑÛ](£J—‹-^ƒ(3÷pÊ“ÀYÍàISȈ¼¢Öî1Åð nY»[$‹™Æ=N2$2È‚z3†ïygfNbd¤•Ç–U:êÿ1;`Ú|'³V6Õ)–$6)Cw)G1U&wþ7ãpóРKi%#¾cU DZä†MmQÖ>u* q~™md¶œŠg`v*¿jšNGo䟉ºmp8Bs‹ûÜÙ“g /ÑÍÓùnË÷:õŒdÄ98ëg áN–bÖlHÒí9êžÖÙ3t`CX /&ˆI¨ýÃ^ “–êݱ|‡5á8 ‘F`Êú»²ˆG ^ñ€î'³˜‡ ðEêR9ܣ짇ŽxzˆÌ-FÛöh!²ÍÀvÊ'݈G‡6jˆ6×Û¿^þ™¡¸ø¦­}üÉχ¯¹G ]ÏàH´dù«öMÆ“,n3€l@ÆUÆÕðf³2îQÆñh•øê³î§Ê½ÜÕò*ß"øŒd ãh§)K² vŸ¸köòšüÞÆk?MïO¾ÏäžcO9‘™ÊFH>}>r1šãF:å[[Ï–sf`‘­¥‡~dÏtYfe8D†} ä”a”¶ÓÖ­sWž¤ÂÛ9‡y;8ŸÆB>‰scpÎçØ¢Mú³¬––Õ+¸í,ß;ù^Þ3Rõ´hT{—g²ËWå™lR…Økå—sè¦qèxy³=Ê b6Îè Ša¸¾qz‰ëíãbmY¹Òç ƒ˜BÒ¶³1#Ï;”j0’箩çÄR ¯L’rhl ñ¿ÆÃ”Ä^†¶Eê•6;¾Ó×/£Ú:î4m€â#Òû=•R>¨"Äuk²®舱Oç÷b èFu”1´¼Sbùá¸LÇ‹Mõ“ÞE£Ä˜½Utëʺ<6v€¦ñ½µZÝõ²n§ªvÏ“½N¡4Õµ[{€!ÕÏ{¬±pÀÎF 0µ pµ€y4Q¨;²·¶þòp牃o1;ƒ4vŸ°Åê–ƒ'R‹LzÃtÓ À Õ=nŠÛ+¾©dËm–n #:J9wõ„ƒ>â:ûÞ0AY¨EŸ°›@¡†b¬.]t]ªÓó œ ŸNt£JÕ¹N„ÈvÖ`œ1pJ8j片)Sl¯FôT2ålŠbS»ŠâžúqÀI“z ÃâO·Ô³çr^É=¹)ÚÖ½Ëu¦ç¨3-ÌÖó)…uÙ{PEå^Äs·]QJÏ7ì6HxJ•.GÛƒP©ÖŒŒúìðŽ•Õ`³9j0mpÉkns½»ÎFøK%”}Ýíus‡[ÇCùÌöcªQ­;±©kÁñĸóVk†ÆÔïx¦i`îÑZd†Häk*ù;&ÃS¥Ãñ¨á<ÙÇ8¹eçA1SzΨ²®Ÿ}MoZ8Ó½.‡TÖiÓ×}FþI§-¹‰| V;Ÿ·ÏjWÿdJ˜å%NqݶVã*ùó$ Ĭ_¨\^!œB—j$æIŒ2<–uOQ…È4=‰ÊÄDnqžŽ,7“Ë£”vEfìÔ–DUJŒ­Í̤² §è?ªƒTøz俢Ó>™òáÈ#{=rdŸŽß^Övñd­\›Æùèñ©=a§Ã-€.·”Ò&N¹ÚÜb a¯ÆÂqœÈÙ†Ö8 %Çd¸³ñc2Më2ÿdíÒLÙÜ>S¶8Šñ°Æu“'›YÀ$R1€Ä¬‡—‘ûL=]g-låzèi~MÎd2ûÖ5†Åf›¤ê,l ‰XgŒ7“çôQÓŒ#ßöjOm¡ùöò6ÓUa1C.{#÷âLÖ¥@$dµc]"WåÚBÙTæÆ|C¸á±òxx¯gDïògKPëTT˜§3¯˜ülÊðZ©zëë¦k?“EÜ”—'/犩¬$ððÕ„$\›Ä¤½MŽDÒ…eS4)[e›¼Ïó%Ã,Ÿ„°%Wß6ÛQSæ¦Hª~ªÁ,1£-ã ìd!†®‡’"ìk}:§ˆ¯?Õ%ÏœÕÅê¾ds]ð§'ôÂe§ÊR¢Ú'vÃÙü\¾ ˆ jÅ >.9z¨½¥¡Ü¥ä G(DiÝË`pÔ 7 “Ðé™tyÆ×6®Ž/["ƒA$Æ$ì $̧5[Þ›b—iT']c'‘3YqL"%o‹aï˜.ïÊ8¨êB¢A¶$12PÖ‚êaFQ®Ç~/qÅ0ý p5–Š¢!eO=ÖšG| _Ù€aë¯w¶HÌñ¶u¥fžZò&…²M泯ò“JøŠŸª+R”¥£=wBßnì‰Ø÷XµùßtêT‰yå»pà} øDa¼L„……O>«ÁÛ.ð÷Àài.Æ^|sðl¼ÆïàÛÆ'Àï|ÇÑ ž coªQ«ÔÙ -0ï`ÊJ<œfi™cs2ø6dNª‰ê ͼa®ÖÂø_]ž>Ú•c'ÅKnx÷X61ºƒçNà>æpÁáð÷àÕðŒ/˜ÎðjXbh®&K›–M º7Ì Sí•fDùÞ'/O1¸~¾TåNñey]ÑÃáéòz Ç&°ïüëøýŒf^,ü2õfxV›Ñ™ÊœÎd>áQß°´·EÇÜûÝ=Ø`‡Ùú¤¯óô†ºk=|b>öïô>ü˜v'‹Ô|Dû˜©xÌØÙ>÷_:#ô> ›*]a>vXÕúà{‡å±Çvä3^ ¾ÓûrUЧÛ´eîòçó‰_3ƒ1/tŽÞF^ÙÆIcc°ÃP…°ÃXÒ›V#dà9ܧgGcï`` ƘÕ8dàA(—b<ßõ¤Á ¿ó¾?}?åsÎ|¶>egŒYÀÄðS0 ?ñ€rÇ"N–fmaN=¿ŸI¼¡B…“BíËñËáÿ¦*ù¡ endstream endobj 4565 0 obj 5787 endobj 4569 0 obj [231 /XYZ 37.5000000 210.500000 0] endobj 4570 0 obj [231 /XYZ 38.2500000 577.250000 0] endobj 4571 0 obj [231 /XYZ 37.5000000 525.500000 0] endobj 4572 0 obj [231 /XYZ 38.2500000 577.250000 0] endobj 4573 0 obj [231 /XYZ 37.5000000 525.500000 0] endobj 4574 0 obj [231 /XYZ 37.5000000 210.500000 0] endobj 4568 0 obj << /Type /Page /Parent 2 0 R /Contents 4575 0 R /Resources 4577 0 R /Annots 4578 0 R /MediaBox [0 0 595 842] >> endobj 4577 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4578 0 obj [ ] endobj 4575 0 obj << /Length 4576 0 R /Filter /FlateDecode >> stream xœí]Mܸ½Ï¯ès€m‹¤> €=öÈ!€a99Þl‚Evgùûéé–zf(=J|]¤(5רµwdQd±X_¬zõî_þ~øço‡w_þsøÖÿþøå¡86Uqùçðüë‡×?Ðí±ÿó¡i«Ã·_¾¾?|~ø|úï÷‡Ë _ÿ|úÓÿúð§Ó¿?þú·ÓìÿÒó_øå¡QÍé÷ŸïuúSqýýùçÿzøËï¿>8|®ŸÌÛÿÿAëÒêy3Ÿþþ0,Sýöíׇwø}¥,ÛºÐUšò ºRþû‡ŸN†/Ž]©TS—Mqˇ}þ’iJw§‘Œ}èüKhøƒ7Ï5øyæâTQ¦VîÑ%7·=1Ï™@]€B×ÑC¿3u¸ÁÏ3—&ʰµppÁ튢¹§©åéó2zâwEŽm.3—&J¿³xpÉ5ƒP«šô1EæIU…;³—™KeØY8¸äΖ͠ › Ôo©ڮ.~ž¹8U†½Å£KnnSáTíËè!ÈßVe¸ÁÏ3¤jñà’;ÛuÈcû2¼øà§GM@‰|žy°c‹G—ÛܪÐe8;êÕè!öÖè`vT?ó0v”cpÉ5M/Õtц ~LhVEÕª€|ó¼{êª>|ýé4³ó/¿}ýå¡<ýϳ7®šÃ׿/ óø‡Ãן”:VeÝ6ÕùïŸõùI{lO’IWÅ«'åùIy,Í%ŠõòDÃwá;p4ÝÁјﴗw–,ãÓùIu4ºUo‡¯ÎOÌ@­WO4%… '«K8ZG“ݰ¹ðd[8<ž&ñå;Ÿ¾žNÒm‡@•ªçàt­ƒP¾?¶;žçùzF£'ÚH>ég °ptúu«­UãMU˜3ðÖ1ÇÒƒõÂ'Cðnã¹h¬¢Ž=%vÓ€á<¼sæCÄ“Þ-à$Ì/›”޳ÉÈ |f0ÿcŠŠr¬ã”å-Þ9ø ~§,àhø¤ãõàÑð¼RÈ!©£ ŠÆÑÃ3¨$ÝÆ ~§„ï¼Ò.žTmŠ.KÕ,Uo•ªxç[ZVŽ=…çÙ!Ó ÷ÊJ.YYƒŸD•ºÍr#Ë)j”ÿÜ CÑ>ÁÞ"C¼8,¹0­Ë'ÙxžƒÀö¶–ñhØZÆŸà^Fà]pЈ©ä“•O–ÛkJæ²-]ߨ¼ÞДúêLR@[èá“‘’ú`½×½ý;®%F‡øš*ÖݾXÂ$Æ72Ë/£¤sÏC]\*N5¨íã…­Õ Ñû€’íµ¶õ —ÆÄ Ɖ²)‰ñ3Tº±7œ9Öz58õB`bÖ¯‹Dé[,2,ÍÀ0G–…D¦—c˜ÔÏ3‰Tê NßÁiv„LrÐÍV­ãxlÜè²’ÓdôáHù9ÂÊ&Ã`CŽÉ­œK~QRÆßl#ܘóÅð,ÈáÕhg´­F#eA;¬F‘Ûqk|ÄŠGv·‡È䥭ŸFêcÜÄÊÿÅlj5d·ÀëÔŒŽ‚Hðnc?:6Ûþpä!$§õ<ó¼ç-H³ÆŠ\×µJ›–xmLŠ8£¹EÒʱܒõ××"†áèÑQJF” ›¼L>QÜåШ„“î€qDO?¬Ë娼aöVÔî jrdE$S³beU¥k[‰Ü§ÌFú*Pµ°Žƒ³ÜÃêsT…LyÊW–UU¢~|‚þZö£Pþý(æP2v¾ÿWbIó©'&~K¿ä ˜þ‚ÓIÀLqNƒ’MvJ¼H«íÊÙùì-‰5r*E#•;&ý&ÆJÆtçDL3딾 )"7ŸÖíêêö-ƒL[ÂuýaTåQ«·6ôu{Fï8 ¨¯9Ÿãïàwjø¿çÖ«œ)íßA \ûÓÏ ¯˜RöehGë´í9Ììîe¯4Uq¬õ–†º«êXtæ­‹gp¡»Òã—£“`Ô#äd×8LßÁß1²DÑ|&ÉáÎàPZˆ&PwµDè×Ç9ZþW)÷"ÄýxÈ œjé•,Ú—HE"Å(îî&Ú-@¬‹1f·{åk†mX0kÖW¤»³H1àto,|Ç]Ê×IhUm«¨H7‡Xnâ›/ŸZFˆ`ÎÆÇøH®²îG+–_’Qví(+Ä#åó<‘`£?!ßÈcKõ“ýhdP=ÞÉ —Xe9.DD3ù·D†=sõëq·%’.ã 9¦¬¨@þNÜk°ðÉn]ÛÌ’0Mg¯n¬d“”2I¢‡˜LÀoÜZît¶Ÿ¥ z¿Vnƒ¿±ÆƒÙ8Yö&jIpLÈñŒTÂÖ[SeUUk+Ý0çŸñždcå«åg/7}™d'LJ1«ãÄÒ,.ïÙI„8GLTZ¶°ÛQ‰/ëže›>‡C¤6~¯¬Ð#ÂõwEiM}cŽ\/<œ¡Fdí FŸÉ]‹57üÇz"Aïos·sÓ„¨ù¸]Q ðÞ± ì:¥†àÏ~*#‹"õ.D˸òéÅ£˜x€ˆùËÓZ %(V3-YÎñÈ@ËAO?☠ÓbýÉŽòÑ£ñ¶K{½W*§GyÌèwQ|ëÒ””æ^åÙTatˆF¼·¥ÍVØ¡Î2¬3ÔiÛ5Ù¦÷쀺¿·vc!K˜ŠÎØvB–ç•Y;Ûdúû åãåx›ft0¢ÅÆÌðI}á÷‰úBÊ€–Øl $à¢:_=N7Š´UN–H/%bÛט2 ʱJ–g(%p½©IF0BŠqµ$“+±zØänRfÖé&SU¥Ø²e]¤cY‡´h”±vž 6ƒÆòG6YX6³Ñ£`‹ÑT=:‹n©ЬÏðò˜]¶b$³Ë*‘*lWJÎemª›î™vù䙯ÿ¤*Ž$¢W¨Ñ“^ÀTG=‚/zò§W¦SïtèÓ—¾êqékqµúlX ðI?Z=œ3[OÌ­‡ëiŽðSï\TD}4JOºo+ ‹Æ³Æ+Ub¸b3‘}9‹…Ó$›¶Ãø@9²¨‰®T&Ѝk²;ëÐÑØ¸J˜n¸<2#‰«ïqe“=±Üt™ñT" Þ[ÈaÜå-µÂ]¿ëÒ àV!3’ÚÖÖŽ"!Þœêy•(Dt&…Ï|E$;3R}Wøô±ÒiÖ䯼kM)ð;CHÐØ†6~’€þ\M‰T/‹("TöBsV„í<¦•¥be6Y-Ñ£Õ#˜Ëto’íîsßé‘ù¸oH¤x„ãj9pÊ-‘ÚÏtDW‘@ª:m4¢œCG0Vs”™¾¨«ç ÖºŒ©(Ól›€Ës¬‹9IéGµžX=8¸×#klIRIªÓ¼,¨(á ÈöP–5/>ãA¶ ~âN¹^!nV@›P@ŒÛ×ßÝšK\«ì%0%{œûäî[ʋɸôÑb¢¨QT†ô°ë>>ÿyã¢oe-‡…ÉfÆÊjgá2Þõu}¬Úz‘$9Ñ2w&鯄ŒÎꦶT,ÕXzyø”Js ‹D:{"DÔ*5oSc¦Éu]ßèeF#⤂ 2v± ”2²é ?m.Û žÐæ²eU ÜtÒ(ø•B~$åST²‘ÌEÇFàzÔ—¬æÚÄ2· C’é¡@®¶iw„ ¶1õÞˆ„M.Œë%QÍ-’ÏA•ä2¥Ú!ïêBvUTÊRx¡û@,7:ôÓ±.T8 Ê…‡KÚÝð3 Æõb‚ò;ëî?… :ˆ+c§]¬}Ó!fÖ !ï5µµÊ'Í¡¬;\eÀÄßw∈8AÜE nuÀšõAn)ê—Xÿ>I(‰,­n# çâ3!Úœ‰çP,³ffm,]èxm8ìk›]± Ó(óxõ‹éÉÓH”‹g"%­’KMëÉ¥¦ëy¢1@ï1bTm{©{…ïHpç×O Øx#i&[Wmº–©<Ÿ(£¬ON™}sÔžb'ÿw4&;þÎ{øNç¯e¯Pz£Ø×Ctô¿Ó·~Å̢ʣV––…߹⨎g€Hƒîƒpx=Ñ ÙLuÙ 'RÉ$G0nuKl}ë:Û iÛ ²õ"ù ¢‘Ðh — ƒGR7¹D…ü8ªµfÏÔ–:ÛY>&ª[B~Ï]è>Iñâ|ãí²à†˜Vñâï;ZÒÏ5÷z§|„OpËsÅm0|7ž† ‡sS°?‚&ÎMkø¤‚Oà ` ò¿ƒÊ1E1ï0;GÀ«;¸ ަñwˆÝ^¥Þ9<Ú&iíUP¾™X~qYµ³ÂQ´ ÙX¿lBÄê>Fô jn伉FÎQ÷4lž”ã¦-DÂæ=Ãð¢YÄ’Ø’!5S«mÕt/² ÷#ðÉEdrQ˜ÌŒåIÕ«e©ÜT^©·dˆéÃWJ½%„—§npwhçÐ–ÖØÊÆñ;Dw=G[zìã8öºñ¬q${ù3c:™¨Uœ“npæ—MJÇÙdä>3˜ÿ1EE9ÖñNÊò6RlGö&o+gMÄ׊&ÒÎÁÑ ¨?Z®Çà˜6–ÞbѺÒ»ì²ôÎÒ{+Ò{õ{­,ñ#Jüõw;k‰‹–¨Ûy^ÎZ"k‰$´Äú7ÿYKÄÓ ìvÖ-Ñ6YKd-±-±·ìŸ¬YÄýmrHÖFgmTuÖFYÝ¥6ÂÙ°YlU8ö4Kü‹Ä×ÕðÕX@†u{]h¢@†.²i{ Å <2ø8B±`+y3¹C¹bõŽ…<šýa ÙYV×ÖÎo¯k®ƒ¯u­2c‹Ì36¶‚™YX¬?·à‡®lÌô¡ úÍÆú&Õ’)—H•i3,[ Á ËáBuœ”¼¼@#Z!ÒêEE9­|½´òhIî¥8㛉lÑ”£ü_Å÷ÌYé¢ëûQ¿Ò„@ÝŒìuµXÇI£:KÀqØJ^¦J3½6a>’AS>Šù¾D;U›;Í…ió6¢ÐGûšâ*”r@ÁáÎ;€\‚»ÙªWô/{%Y§,…(Ûl‘ivGàQ‹`ÏS”EPÕ ³K˜²ËõëÅ,C¸=óò݈ÞS˃ö„îœ5lCùºÒ’x}Ô«»“ãxxDP a|‘Õz{t3&bˆL?|ì=°Ae‚¿Œ cP™+)ÙÀª(Z“C(â˜òêáàíkÆz[ªl­ûXë1¼µÞÕõ´µò›íÍÝߥØ6[\1ÂÕa/7ŽP6uGÊ–¹Mbâm{‡¦£Bš[ò’R´sUĽfq]úÙ‡O3lôüd‚€ø‡ì¤lì¥á ‰„[nHd¯ÅÃ^% §ãøFн ÷Š ›Ñ³Z+eæ¥Z–c”ĺç¡BD³î$²‹™W4°Â³aÆkÆm«ª±4 © ‹{h1¾sjظL]h{½9.“h\¦Ñ6o¦¬Ü™€ð87‰ñ½«ð„uºmä·³t¢ÈíÙ‚6P.jKz8TCU‚ ”1J\¿$F0NÚi#H‰{æª:V?ùXïX‰º›Î쑽sÍ_î+P.l’ºìpôl›8²9÷#Ëc6 ?¤¶mÅ426 £ES6·ùT°® Áö›TÌfD%¼ Â<‹ÙM¤é†Ž 9dpSÈ`e„ŽÓÉû¸d ¤•½!ÝEåK3t+ʇsÇa–ë#Ѯ߇7wvqâ6itÇá¶½Â<î,Æ8.8hqwfè ³M$ÌÜ¿ÏõNÊ茹_Üþ}]•{{Ü(72Nnîßçö&"ú²]“»0äó¼™ó¼zÜ@X0±†˜Ò¡Ë¨øY:lE:¬Q“•)K»Š¡¾oŠ&ÓNVÕ<'e™–eZ2mo1àÜ7ÄIëÕû†ä¾S‘µ‘)³6ÊÚè.µQ¬¾SÛ”Q¥Pu͘‹Ó ©:‘±}»Ð`Í ·(ˆÝ, U³³’*¦G­'=Ôÿy ŸZŒµ@Ó™j (.¼Á‡T½_¶€hý~²:_—–Vsðž(PˆpîHàà2­0@¶‡ÀZz|ÛšðŽAâ# ZG ¬èÒ«Aš%dXǦ+Œ-7EtÄýøÜ–°ÕüEøÊÞíN^XÆT…Ñ»àÌûɼÜÜÔº²YL,¬Ó¢6º½\vo?9åÆÌGSÊýÉÿ+Ùñwà¬ûëÔ;Ã)7óþi Ñ;\©"°óT¥¦(\©cn\ÏGøär~UyÔÊò-âÔƒœØµØ•êÈ.‘»¥fs{ëæ˜¶†eÁA—{-TøGíÄŒA”9Q$Ž…ÙƒG´ ÐVbáüHgPrUan£wp×ò˜fG8`Í¥©,—\Lm¤hœ‰º6”På‚ÓМ‰ì†í@"‚üOµ&Õ6~ÓôѱŒ ôIw˜碠õÂö_ó…,ˆ'sõÌ uïæÖNMK)RRqd¨/ßhጌµ,ÃhÍâ$±$ÔäC¶uTdÜDÊfH-zóK¡|ŽôR }Ú÷T6&ä#Ü'èqi¾KÁÔ“÷3„ ŠÓ/ X"yä`F[žTÅØ…ÈT ªÇj‹„²q:J†K`õŠônŽÂ-`o°Ò±0”dµ=ü¢V7ÎÂÅûÃ`‡=ëïœi+Á,P6²+z f±É¥oņ x¶­¥ec5ˆ4„–y£¨‹¬+8©ñ–´ôXNùjÅ$A aôôÀןÛfYÂ&ÃI/‰2–—.[ùz,¨{ØØþ¡°©CÜýÉöØ rtR. Ì>—k¥qó"ľt3K¨X‰û±Ú²¬ÏF¡sòÒ—<9[+m±vù±—(½ ¸‚´ÛtŽCê-o`…sáÛÄ:E‹R>GEì dGpѾÐዊ¤ˆ&ÍÊÚÙ)VµEÕ?IÎö*`GÜʃ!â’XÀЗø“l«\ ¤qÁ]Ä…} Nb 3À£A8v±A@HüÄ1Þm\øF4Qåm² Ux4¢}ÀÞ8ž–!Ì.à=Å`¯  )Z3zi‚‚ßÁZS̯_ Å».2÷9öKU\æ‹y™hsãàrFóç¶x¹-Þó;¹-^n‹—8­n‹W¦Ph™kÙ꙽5æ‹2(‹ë=BFvº˜° ã¨1ÎÃÝvqN“ÎÝoR:ÛÄæ¾Ÿ³™r·=Ì£Š2aí6¾²|€¿“F‡²Ìý„²–¸™¢;“)¹²fIC(Ͳ:ï8´ìÜ$òg´ÎV«ïvÒ]ªÒ°~êÜ¿*[?7Stgº-åë­lý¤À!Œõ³>ï$ï‹·fž“²6ÊÚè®dÍÞÒ²K«(ÿ}“ü–ºÖ« µ^ÖzYë-\é6»g=ÅñÁúz sHŽ&GŒ&Ç:õ9f1Žu °:£A 0øýìG =ø ž[_ì5%,àbú)Øñ?q·h­o?³Ma޽¼_xx1C½ªïšUjŸŸþøð‚, endstream endobj 4576 0 obj 6209 endobj 4580 0 obj [232 /XYZ 37.5000000 295.250000 0] endobj 4581 0 obj [232 /XYZ 37.5000000 527 0] endobj 4582 0 obj [232 /XYZ 37.5000000 295.250000 0] endobj 4583 0 obj [232 /XYZ 37.5000000 77.7500000 0] endobj 4584 0 obj [232 /XYZ 37.5000000 527 0] endobj 4585 0 obj [232 /XYZ 37.5000000 77.7500000 0] endobj 4586 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 758 117.750000 764.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums_classes >> endobj 4587 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 332 125.250000 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes >> endobj 4588 0 obj << /Type /Annot /Subtype /Link /Rect [351.750000 317 378.750000 323.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants >> endobj 4589 0 obj << /Type /Annot /Subtype /Link /Rect [384 303.500000 515.250000 310.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes >> endobj 4590 0 obj << /Type /Annot /Subtype /Link /Rect [186.750000 113.750000 213.750000 120.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants >> endobj 4591 0 obj << /Type /Annot /Subtype /Link /Rect [315.750000 563 393 569.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://java.sun.com/developer/Books/shiftintojava/page1.html#replaceenums) >> >> endobj 4592 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 555.500000 549.750000 569.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.javaworld.com/article/2076970/create-enumerated-constants-in-java.html) >> >> endobj 4593 0 obj << /Type /Annot /Subtype /Link /Rect [174 555.500000 277.500000 562.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.javaworld.com/article/2077499/java-tip-133--more-on-typesafe-enums.html) >> >> endobj 4594 0 obj << /Type /Annot /Subtype /Link /Rect [290.250000 555.500000 431.250000 562.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.javaworld.com/article/2077487/java-tip-122--beware-of-java-typesafe-enumerations.html) >> >> endobj 4579 0 obj << /Type /Page /Parent 2 0 R /Contents 4595 0 R /Resources 4597 0 R /Annots 4598 0 R /MediaBox [0 0 595 842] >> endobj 4597 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 4598 0 obj [ 4586 0 R 4587 0 R 4588 0 R 4589 0 R 4590 0 R 4591 0 R 4592 0 R 4593 0 R 4594 0 R ] endobj 4595 0 obj << /Length 4596 0 R /Filter /FlateDecode >> stream xœí]ÉŽäHr½çWÄY@gÓn€  V:(T: tz4Ý•æ ßW,ŒÈL'Ÿ“þÂÜHFºÓÕ ¾ØîfÏ~ýçïÿqø¯¿~ýôý¿ ~úþT=·uuù¿ÃéŸ_^ÿ`»çá¿mW~ûãéçáçÓ·§oÇÿ|º¼ðýÓ¿ÿëÿöð/Çÿýõð§?þøçá/þÂO­iþ~þ³oÍñ¿ªÛŸ§ßÿûéßþáð·Óˆ×Ï “yûÿÿbmm[{šÆÌ§>]—iÎÿüý·¿=ýzÙ€´¯øºª½?ïŽÿê½=üï>ýåøëðÕsïißV÷|èøïã—\{üˆíÛ^u£ÿ‘Þd¼îL¾ÁÏ3ßã]òp›Ú]6¨¯3ìÐmôÛßú6ßàç™KoÊõháà’'Ûöý°=ÇÿeØýÛðï».#Ýœf.¾+׳ţ ®q]F¶}=ÃößæcÛËÌ3±-\òdk›“m_ ŸaðÖäcÛËÌs±mdtÉÃ훜l{=ÃöÛªÎȶç™çb[8¸àÉZS]ùªÍ±û/Ãgܶ?Ï\|W†³þ-e<•Ë/À‘ûyñã§_¿oŽ›Ù~üå8¹ó7/ü8nJ}øåä—ÔÝáÇŸÿXUîó?~üõéËãÔïûj>é«ó'ã†OVæüIS=7G‰}t«OïòÄžŸtÏ]_5¶®=ùô²€×34£ 5Ë–f–/­uÁÒ\{žLÿÜ6õÛiºË¢»ÛÆkíÂAà_µ—¿êŸ½».–oeÚ;-zb*ød ÷ìlgl½h.\úeî¹ö͉ˆª›2Ú¿ñsïÞåBMfLMG¢8Ó„?±ýá'ë«×?üþô=ã#:µcü”›í­÷á7=<܆ É„£c(NÖö¢ßKpIH?²Åø œµñÇPFd#¦”/ç'õu·-.#²ùø’ÁÇ7´ÅŸÓè.OŒ¹Ñ’-&hH–Ã"¢8d5__{2ËbÓ1·Èù`–&N!¿šlÝHMâýÀódξƒw ]x4Û.WÔX†Ãcõ½cjô×Cäã剽~èe4øŽsˆ´}¾žÈQŽ,fG§!ÆhY_8½Ud>†Ö A)xJ²6¸ÃßÑ3 WŠúhó¦TlvEjlՆј¯Áj#FïÂ|…$JÆO«Þ~L·ê#¯gDG„N÷.})±]q¯AuöS»uðqÐ |ìÈbš`Ðhé­åSbЍ„b†9Éñºý…‡ÇbøaŠëHHTÿG¢èº¦œ€t‰Ü ¹ÆfPýóy6ÕX&L<$ýÔ;]ú;ÃfM½ó=1ø;ø‰Í.¾ë>ØÝ¥cUöš1Y„ ãã%X™ýÝåâ-²[„\5XíAÃn¤U#ë9Z⊊3jOöòAö†)ÜH*.MŽÚ}U2ëe”’ñ¡"œ|戜bÊÊÅÐÝ>d|4]3«Ú+¨r±b¨iø‹x Ÿ4ð‰GOüb4¼R8ëêóŒq15œÛ v’f1o eð)àïÀó‰Ì÷ rrð´®Mz Ÿ6<|Ú˜³(cž)æ¹ÈJñhp‘ÑŒâñJÕds øL?IîA„â¡›Hí5£ð^c§¿ƒµ¦˜9¯ÅÛªžÕâê OÍÊ %¾ƒ4æÄ⸠ÎÑze)á-¬áÜ0½D$6”<iÅXpø„1]bÎÚã=€œá°nÂ3€ßÁs3X£bs:Öév,œ³ƒw5µøìàŴÜœµ;¡*8šÅß!N{ý•Öøäðh»Ü눬‚’\NOÍÜ7¶m]4qaÊ\yGââL°ŒHªÀÁ*õ¾£úé^î°ÁU£Ã $a£1"ü±¹C¬dg&üÅ8ÜŒøî ;nªÍüÎc‡¹p tøŠp#3 BxÔŽ¾Þ”u "’ž\ä˜eÂWvÚ8ð‚÷²t€¿³O×. Š¢%Š–xWrcËA®¢Y¶@!”fYv"Úˆ¡7&¨º ­×õó[´^ÑzïJ¦mùZ£h½-P£õÖ§­û`}ÕÍSRÑFE½+Yóh×ÕEƒmª(¿m—ô¶y­gÛ¢õŠÖ+ZoáJµR—ŠžÚ¬¯§0…ÈF÷©]7¢C}3Ïxçq‘”è¦ü#RHg€sœöYðÄ$Öã¢/ü†¥¡ "IÿXÞ…;‘“#Ê©Ò;\$ÅÐ(Þk¬) nŒX§…D²àíÊhqf¯qñ_„D¥¥×ÔÍ­LK ^ßõðõ“ƒ^JðÑR²3c31¹QSð^$À¬á™ˆâ¼ c{À* ŠQ >Œl£`g2ÃðZà-Lo#fdH“Á8Ë WÈ q2øGw€ªfÔouå·s@¼¼2]*R… ¸ml—’X–ÅdX÷ý¡ÖFàØE ÏÑ‚á^~"—ÚeŒ€‚Uš_ïõmê=%âd<L`ñ‚ñyq…°Š^Í$0UkCŸ½ ¹ÄÐ\æÒžsÂÊ›~ćyÍ} Â[Ô7‘-Ý‚¶SæË›DäE‘ŸÝY…@¡'”u(·j#vaMGÓTተóÈœO"¥<ÿ¼!ÉÒ•Bª½ZfO¦ G¯‡Í„$Ôb.«vžëù[¬â»03êÊÆøÐ˜È®ŸÓ…úùÝ5KØiÿSB¸FìJ¥Øí¸Mƒ(ø»°T'çxnL4gÌ$²qÊÞD6~ƒö ÓÜD¤… Nh`H·H–¡ð·çYÝÛvÀG3bæ{.,ˆv)·¢úmV‚Ý7€Ø‰8Ñ)â7aÝ+¡‘ÖËðÊA¼ áÅf lï›+•ºÃÐgZ²‡hD…±bóÄ=gÃ)ÜÚ> ñ,©¶y£,¶1á"J”…š5Õߊ(LÛÀÜò+ÖTYZdFfB¥½ˆ^MQ"LÎ4øÛ`æc–䪜Ô>4Õ0e;€c£g¹Gˆ).²—¢™ç™»†SYŒ½Ì„ý6ì/3ítñî`ùB‰¼í‘Æ­í(E`Q³ƒ‰×‹Þ7o8/%nJˆ-æËà„T[µËCÄM$ì>™† á·ZnÔõåú &Áª'¸#bp&Nu½µtÃK žìËà- ¬S·K‘N)æD›Qҹ΢N×´(Öv±¶Óg-RÓF ÇQLÑ䛈¾‘u±™S¥ü÷êI=ŒnÌ’í˜QÏu® MzeBNáøL)% K‡äZ“17€(x…\BïÂ. Õ¹¿“•<Ì-§l©J‚p!l²;,‹¸žHUͨZ+ÈAÅÎÑ+«É•ä)rÃÇ/’?>·]9‘˜L(¯õ/ eEë]‰hNƃ¤Fl ºõ © ‘´T†eƒD¥F<»(WÜY-KÁÙ}¥‰"1%œ›‡ "Œ!¶“¨ŒaøÐCT) sh'ˆøDn>“¿>¿«[&J DÅÎYrY p§8ˆA£Ï…½œ‡ç!+X ‘!Œ ,r{È#AçL€ªýìi2VÔÌUͶË壖æÎ[û-뚦Lid‘âžò&."nQ–Qÿ™ÁY™ÔæˆS^=šSnA•63~§Rt–q˨øãþa™’Pp­³·òÛê3·ÂËhD­aÙS¤¢cJÊÞ™‘­gÚ{M\æ q]~YD•f9U¶MPåP‘š]“½5’p0\~µ‹h­ü"ç3S.ÑÜ»7y{¡l3¦ìžé³~>½ ú×?üþô="‘óˆòÓOˆŠuÿmeÐTû‘ nÐTÝÈ2XvÍIµˆåóòW{ÈÅ’å( ¿Yq²<ùÿUü=ûú'êÛ.݈Œ6¨3¥;ñx<ÙãYçÅnwËù“÷Û³›Ùßj¡6H£ì ¥ q8\$a†.ë¢m¼‰cDèu_´õÝì&Îköóìߨvãzêö<;w L×î¿–2÷Y|ñXý}´.t·çÙèHÊgJöÙÚ½þa ûø4…€½´«(ï¯~®z·ÔuÇ ˆ#Ù Dp'¡(Ëø*ŠÏu]@`Ú58?rŸE`[èÕX¨}ð“ÙÔÔ Z¨Ë´ÉÊ^­=hf råżb:1éÍÔ4~mÍtšÂRÍ”ï~^[\6}ÿîÅ¥ù’þ„—8Ĺ¢ƒ®°V…¹p íÊØ"ÒïéZNi޼×yEto‘©ÚfmMtžCq’ÒYšRëUü á Σ^ ;<ïqµlj˜».œÂÃtAEÞ >îÙßZyZÅ ¹Ï ‰Øæí#"—˜—5+°nµÀ7µ&Ó8kuͤ&¬d±Uᱨ£µä àÍt‘Z"EµSL&+Õ\Š1„ˆÊ-k@V»KÂY—õôÔÐçWT¨¦P¥_iTQá-<Æ„\F£2§'a20ØŽ K‘\g|pŒ ÁP2S儹y9$Ô)Ë`*m§Ùä"ç¦5 RJK,×y&Þv鿃ƒ™¸'4YÝò ú6J /?L„4k˜Dª R›.$|+9ÃÊ&*0®"S’!ÚœÁ¿(î"JÙ` -¡7*áÔ1®Á{F Yž,ˤoãe0<¯VØÆ´2aÌh JIG„ÌY|\‡:Qw—v ÂIs˜*]Újgn’®Œ-hW&C‰¦º²yÀTCt¦b…i Ÿ¿/ö¶¢5¦nEªfÊcØg{ Q>—KèêPQÓ%sÜúöí'§Dóܦñkú;8/ˆú®Â@z'J‚/DÙ<Ûóï¯G»¶ +b‹žTpn‘ïÀY;ª Ò,A8ƒÈz*¸Ÿá“!³Ü_7áe4- GÛÝ܈´önÕÎ>Âòâ~Rw× /wga¬rf3º:Pk2yY« ¸„x ¡.jåãà>“Űà4æG¬·µ*¨™ÑPøõYDö Rli¥Î‚Y³© Hݹ2’A60»œÝ#Ñ2¥ó·Y™»Jز͉¨{”õ³³K«"Qµ™?Úåªf^(µ»rïƒVfYYaÿ²«j[5QRpœ¥rTŸôFmDœ¶œr§VW›UÂ{9’žHí/•(Âä¹É¶1X?'xy•uİ8s”Œ›Ã¤‘ï8œ’QŸ¶¶ ôé5”×Ì8•J} u"(ù+cdµæ®Š AJÕ£} hµÜÍeº›£:ãu é×…I" ¿BY¯ßa‚Çï\“®ÜðÒ‚' Qf[tíêI“"ܹ[dêE 0G a2{íÆŽÕ`J}8¡1õ.ªÜËEØ’ÑA2Jxn„|Á]èQIì%…Pa×ks"ãR€§‰D!ê:[š„6k¬d¾„¸æ{ÞμÀ«Ü¯’3a°ïBþTºàN‘¼xxlQ3itJ¢éýYáYßòJ1ßöEŠ‰ÌšVÃõ,¸öyý¹e—×MoËk*ƒLÄjb‚£"Hÿ ö›„¿.œÅ½z§¼m–u i"©3ÙŒ Àº²–W·œvà´}5”·ôοþaò–Ó[Ž ¡ aBQHL‡éyË\ 6”°Àw…Mõßb’\™V¥hqÉìU`ê󇲺—¶¿Zå<¥|àñ3å¥ ‚)#“5£•®”„Õg)Ù‹%»0 A:`v”(3VkpºâUíL /×Ï´ÙbZgi‹˜dì!›“¹Í{Ô]‡ä(¼Ù”ý.¿Lù>Ô;I Ë&¥ž:ŧ紦RÐg‹K×ÊÌf0Jb¾¨25p’vga× WÆöo~Yãnà<‡@ïúr@.¸Ø¡DœËmJ×Ôo?9å<Î-`ÊùšþŽÅ|'²¹=œÛ9rFý÷À¢w*¼R8ƒéh´^òø 㷵ߙYÃwð¬ñJYdü³ :Ï­)}u“²å×ò ˜žíÂ×LËe)U£…¸Ö‡.”¤äRŽsÅCÜsPa- Ñ µke;H¾ˆBl %,eã@[Ыë&P—ïŠd=1ä:2â/Ÿ}Â×ÎŒôe4s1¸z8‘¢H%´é]ª3 @G+­UÒÓ>öð;×o7¼´àÉÌõ©W«þ#ÙÉY€Y A¯|Ô¼¢Ì•S¥ÈÄÇ ¤NAœY+ƒtŸ]Zª\ý¶)sÇæÊÀ(ºã‚X!Òf}Ñ©˜Fœ¨v]&;š¾’µ• ©sux=Àa\œ’ˆÖŦ’-HÐÔD8#2%&œAdØÊ$“­N]ûLPíÙ•Ö‘¥õŽÜ‰„ØÚúñ‘íå~g®,}OáD×p²²ùt2·Û™ïfDãwT¾ß×MM8I„ÈeÀ¹d­ yI‚‘B®¦oBw°$òLŒ¶\â(ûQ q,ï®Kû<ìéâ¿‚å‘×Tpírdµ¸Ãr%‹ÂÈ‘Šf PeL< Aî®_œ×Úcô½©‰ÂôÍpêÕ=^ a—Ùð>Ed7»böÖÂ7ÂAØ>ÁaÆÑ1Û ÛCŠ1(1[|X,–µÊÐä "Ší¥ñk´ë‘Ñ÷*Üg¢üEД¿>ø·J†Ñÿ ¯Îú–ß?~báhpnîgÙQ‰"7Ÿ±‚g™ îÛpÚÜdjq–›Þ>)²<õD¬òeÁ9:?K¿²K+÷*‚} çáÇOé4†¹Ž‘ËÓ%–åpÖ¸×*î›ê°„Ã3Ðíé:EoX›@Ú±¹—؃[Ûxð;ØÀ;Ši‡998kw4BUp4‹¿Cœöú+­ñÉáÑv¹×Y%¹œžŠÇÛlu{enM´ù÷ƒ˜æÅhÏÆÛY›+t¡ÃFcDøcs‡pxx<7Æ Ì€0‹aw3ìt¸©1ó;Ÿ”æ@ÆqŒÌ¿#º£Ô¾Á¹i¹/9HÌ-â"(ºâ¦[@ÿ…Ÿ ?oƒŸWË&€ )ú~ž›Št(ÒaÒaý0™¬tز´«™=À׊2íhò™VdÚNdÚ£v9¸e¹¾c9èÚ"‹|—r_± [p»”ÞªR¨¾%È)55³Î˜· Ë×n¡Uc›P…—\ “7Cµµ:@‘ ÙÞ P?›.Û'J·pqA$—€ŽÙ GD”9;,%=1–žˆc›>»ðupV;ABõ­ '®Ã`‰R(£†gJÀ‰l Sµ”·YŠð Š õa“A«¬Mâ4Ô¡äöž° î’ôRÒc§õµ U!áLä†eJ±ÆdPFd1˜šØÕ±Q4ªJ#>ƒ1®/NCŠÓ0WÓ”žÃ^‘—y ˜´1‹È/¢AA‚ê¤ÊØe…àF;"l~ 9ºÂä÷Íš*kÆyÞ8±þܲ‹3[Û€*ߟ4{Ô.Î¥S2òp!ÍÃÐÕdJÆŽ‡—›ïžzÚóØ¡{ªïë×?¬Ñ<õ4…¥’h½SWƒ¿¤ú=6”pþv…Ä´Û™1Ž™] RmºМG,™kQàl¬¥ï@“ÊÙ3M "Tˆ+Ò¸‚ Û#`ÊgÌõwSª®f„+Åd7|c¥ÝQ ›‚å%L=7OGjçºQ«üB›„›±„î ]®•SÐ}ÎÉìnÅjï-è+t¥õ·EšH”æ’žŸZÁ[éiµdg ‡Åâì\ÌÙ²I? '(ÒÈ ÏQ¢TwM¯¤®L ¢"¼Œç™à•,¯ÕiÏ'”¼†Å3%¸®`âåŽæøxd›^‡öâjåb²áMÇ µ|Æ2Úƒ½«|“kcŸ¶©…Ž ÿ9»B2h•hªk6É‹Nć†ÅÓ,—#¢®>ãêQ†§lÚÂ.ÅÕoßd7r9îŠZ £h(p¤p†’Ž Í]Ç3„Oã\:T–Ñcs¾rþ™¯êy:fRjµ¤#AW¬G.šÙ¡úŸK1ã åÍ'§–6—?µè¯éïàXõN9r¯Áñ¬ QÿlƒÞÌ7H¸‘)6 S£áÝÁ³†ïÜ áF3¸õÂ?ë1¯€ßŽÿ~i,J‚ßæþÂqÒMB*ÅFeN?Xÿö즄ÃeÞíÓ^¼Q{]ê«'ÖŒŸ @töyظWçm ÍFßqs>ûÔܾ+Ÿ¦«~CÒ˜š¬–>Zà e§†‡l8X€Ë0x4øÎ MÒÒÛ²e îôßÇ_gþ :,< L4!¶C§öï*Ü;L%ƒ˜˜`ƒÈ àw9õÞLÁ˜²º€ "rLd]ŸC:,`ð;‡Ù:hÉ<·!È4%,à âýÃj0¢ ñc#¡¹ŸgÛÊ=ò~!óB‚ž šoNë¾=ý?íLJŒ endstream endobj 4596 0 obj 7846 endobj 4600 0 obj [233 /XYZ 38.2500000 729.500000 0] endobj 4601 0 obj [233 /XYZ 38.2500000 729.500000 0] endobj 4602 0 obj [233 /XYZ 38.2500000 352.250000 0] endobj 4603 0 obj [233 /XYZ 38.2500000 352.250000 0] endobj 4604 0 obj << /Type /Annot /Subtype /Link /Rect [473.250000 764 523.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_anonymous_enums >> endobj 4599 0 obj << /Type /Page /Parent 2 0 R /Contents 4605 0 R /Resources 4607 0 R /Annots 4608 0 R /MediaBox [0 0 595 842] >> endobj 4607 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 4608 0 obj [ 4604 0 R ] endobj 4605 0 obj << /Length 4606 0 R /Filter /FlateDecode >> stream xœí]KäÈq¾÷¯¨³Õ2|†yÐAÀ`ðAðÁXY6­à‘úû®®"«»“ü’̯"ƒÉêÚÁîÌ6‡É|DÆ;¾øåß¿ÿ×áþqøåÓ÷ÿ;ü:üþéûSulëêòÏáù×ï^ÿÀvÇáχ¶«¿þöôóðóéÛÓ·Ó>]^øþé§?ýó`¿?ýû—ÃÿóôÃ? éù/üöÔšöôû_Ï¿÷­9ý©ºþþüóÿ}ú9üíyÄñsÃdÞþÿï¬m¬wÏÓXøôϧq™æüë¿þíé—ˤ}Å×ÖwÍÁxç¦÷öð÷ÿ~úóéãðÕ±÷Æ´o«[>ÔÚç/µæ4ˆíOÿqnò¡ó/¡á3 Þö&Ûà癋ïŠq‰.y¸]ï/Ô×9¶=Çö÷]—‘pžg.½)ãÑÂÁOÖY__¶ÇÙ ×öeø »ïê¦Í7øyæâ»2œmdtÉÃmM3lñ¶èeø ƒw¶Ï7øyæâ»2.]òp»Îd¸¯†—ÜWÆe¤œÎ丑Ñ×›v‰§å÷ÿeø ƒ»&ßá^f.¾+ÃáNGÿ–2 žÊå'@ãÿyñã§_¾žasøñçÓÌμüöã·'úŸ“žPWæðãO‡­*×þÛáÇ_žúcÛÔÍéçç¿w~bûó“îØõÕÛ'U}~⎵oºöÍ“îòÎË>àÞ]¬¬ëcÑðÆ¥?©¾œŸÔGg;óöIGƒ3¨\°ŒÈ^ÀŠìÒô¯ÂQ9?1n܃5ïtð Þ¼Õx>ÇÃŒ9'¼â;ÎÇ¡Lâæ‚ï´ðIH)ømWÌLö>.²ù 7/ý2š©ŽMkžïoÁÃCÁDá wÃwSÊÒ ¾ü8ÉÕ<"±v} sË7Èt§ÃÜÑ^ž3Ž¿ân ßa<š—ä/"§‘"{!eG†Ç·SYÈ""‡Y9³†f¥Ã<ð%!”FØðÊÁ¹E®)^éÇ0ˆz—¾@akr±˜Û¹Kê’aYxø¥Ì(GMeÛPâ“À»ŠÏosFxn ×`€¨˜¾„âAÉØPÔQéäR%ØŒ0ÄÚª’æû¹ÉZôÂ6øg$&Ýâ‹ínx)|’‘?Ž®7{ obŒ8F£©ðæ®÷@P¬¸AŒFƒEFDÕ…ï8|,¼JSV÷íFĸµôÐ ÕÔÊĸƓ•`u‘³ev6A³Q20Yc-%Á=¡sB®9챕ðÊQ¶uœsF%e‘çnÅf[¹Pl2k“µ xewæIÁ–Z$t#â0Ó’L˜b3ìý‚Ø×C¡‹½Ã`‚¼Æšd“púCQ=mÊ×á®gs‹‚$§m95.…Ãý‚Õ¦ÏÖRL–gP§äí£ F5jsSôè¹sý-LHTÀLá‘À&¡*PYˆ}ÝWŸ»7ïõªy»³ R纀ïÈ8T ¥«e<ò‡×ì¬Hþ0ᯡÒC×SY$y½µ.bK)Ç$il³”èË”HÄç¹,J§!Cð;K6êl¨“Sæú™¦þc*Å¢'øKðö/ž®Ôâg ñO4R¼ç8æÄ¤ ËŠŒõqR&\”Yï‘IgŠz–Lö3S|Íõ̤ìϬc—&Å'×5~©Ë/¯ÒïrœfzœçSy>®=<•Zóú'}ú®^"zžC@+L¤),µ¹õ†Ñ•WwËÖN¨Ãš>fè¢Ù¤L¬C¸F…ÉšÉlëîÒ!è?cHH)A¿ÛþN`†NÛ4Xë‰ì¹h¥Õ KàÝìÝÛiΙ…c¢È„‰zŽñGl¡µèÅŒú9 ôIš~¿Ó,èzsOà܆²¯¹ ÚÃënÓ÷Ï ú IÜ祧cè(ÂL¾1M»vÊÔǪwo¯vÊåvv|ô¢t|†tô)×XÌLá;æ |Π{šÈÇøH1ÛÃ"Z4*R(™ erˆKvT™éû.eDÄ€ªm.Ð÷–`#—vxרÁ9ìn¡³}€ãÜ!æöÖ2+–=ABŽFŠþ»O£@¿2¡Æ¾}f¬ˆç‡Q¿Dosá­bàæd]AÞª7¶ËÔOÈÄÜ—G2·4"gðžÉn]¼{±Ëb*|ôՈە²xû¥ç”“Cüëe Sbá [Ìàó¦ÕDζLF’l²ø® ­Þ¸’½qL7&PÉ5.Wêçø¦½¤˜4µ}ûÉÓÒ.žˆWÕ 'à ÕG;‰‚|M'ò~纅“yù dàís£UðËÁ7Gw&ô×sƒ+bíÑM8C¯¥Xô×iêB3%U«Gô|Ì6Ì('RrB¸?d ‹„KÆ\RÞçvV©ªëv)û§+q’¤¡‡ÞëˆÛ—8ÙÂY&¥‘¹¦T–ÒiËwˆ 8.ú0s¢Š×m .e]O²Îgø#bºD?q0hÅ( °@%e ÆQ˨Bå…™Ó¸Á˜$M¶OáFGWRbs—”ìí#kÀÑ™ÐfÜS€i{ƒ03‚¢‹FÿÜTv4¯>Ó@ëÇ óÑ/Ωw`îÉGôĴ艅ïTpƒ1÷ħ¿cá;ѧí£×£sÂݵ©\ çcÑßÁwúô3±* ¦ üî|„^àzÍ•Fè~§ÂOà)DvÏÍTþIéLñ¬€w”¸Ïø;ŽFσv"´#+s"g çæÄ\÷Ë<º«–oF„*ˆ³ÜMÌñ;p˜büVúÎ0ü©d »iúbîf„ú°öŽo->GÌ/á­}ï”´ íZÿ–Œfü”'(¢Þgáf™Æß0 Q/µlÅS$­L4w7KV}’ƒ™ê}–P|%:YÙ¢&ÚŸ¤ÐšØ 4‚òè"(D˜\¶í+“Œ²²¶}Åe$ŠÃÔ!Õ<àÀ²yTF“êB 3ýe#šîòÞ¶ooôœ‚ A¬¨V{¨ºz¨ò{<7¬VCS4âf…ïlo `#*b@0ÆZùa†¹wvéˆ÷à;ðÎa§UdðþDf@8_ðhÜ·È Šp—ô¾y7cs—)¦ŠË¼Ø™D¸™"¼»Lñ¾a9…Oži9><Y€©ªûÜÔïî>—ìfÝ–^âNNWÙàxç­g} «iû°ºu¤jßÛ@ R(‰*ÄÈuÀü˜if¾O“'Ö­Ο,V°L÷%-˜_Y@%år§N ]XÁ“çñÕÅ;‡÷G”æ `Næg9 :]»xf ¶)Î\ÄWsó¾xw§+#uÕš:nŽˆ1W˜4K¦Õ2Ót¬@°†˜ÝÀNeµ,ZDäºBÅpj’9¨¬x"6¦©ŒÂ²©»PX*Q«–$AoÚªvÄlbL „Šqµí ûN"¶(ŒySÚP¨)± ÌBª°"/F–lÛGYvD]]òä4MíC‘Èàc1íÆ‡Šls”ÍŽ´ ?Øþ¸¡ Þ³ºGKÜ·Ôõ)ïÔ×+Ò!²à8{žœ) %WÅ ÉÈ\Õ A !|—5þ%ê«{ÂFÔÎÕMé •à—˜˜ÓºÊö–^ð=UÞÊIDìÀ„N5º'˜»§¤ÇöuµÈNF™Ù*ÑÙåtgºPNïS7Í ¶|oJÅö(ór ¦­ L­ ùÈl£“~A ¾¢“ ë{?<0–9€ÉŸ9ž1ëÈ àzFó:Ô•0IEâ|軙翫ô?&ƒñš)”~D$³1]¸I@Ø;Y—¬9U6ä™r­ú–¼‡ýXr=6Ê›ÉbIÈQe”e¢Ã å5f4&%ì@ÊÞ*:Y²fF©«zK˜° `xRòÇŠb£ºHdê*8äNgHK†8½VÛ;²«8É‹@FMºA~ó¨0u…dS¦0¾¼y¥þfÙEKÁ«ÖtãþµM²½ÉS*ŒEx/q§©<,†«ä¸ö9åpÒ9Ø\6ȶñΜ–‚q@ø›Üg¨Ml÷´¹X,ZÃ!B< }Ëb 2Ž©¡º-Í*Æz‘ÂÀ8±˜–.˜z#÷TI&É&ÆNyc2¾GN@XkIG…0?&¼Ô/˜6| y„h# ”¾jL¨râ5¿ü`&r™cBL[ + £Õ~‘Ôbdû[É–/R—>!W·Àz™É_•E›–h½•¹Õ L?F¡c²U’YXV”Ó‡b“q(KРpÉžð‰…ëU€ %û©€¤Ï}›Gça×Þ¢_$€àcRÏœr|o‰B[5Ÿ¿[ÁœCåÎxsmë‚«»™.Y$È]¢ ZÆ]ŠÚÈô‘ÍnÝ>㟱Ÿ‰ú*½š©Ôݼaƒll‘HˆHJ„0”Ï{sgŠ­ŸEl©­ÏlÆß— N-aµO¾ÌäÖEÒ&ÜwçÜ÷ØÉÄËÓ<œ;à¸T…ûåv΃6(:1Ö6¡ d8NBó Ùü ÑP‘Œ‡h+Ãú†b‰ü>C[5ã.0´ådextXJÉö²Ðª¸¤t9¦9‘ä™R^’•Ê?ªBÅIT)®A©Ú{ï?íº>à›2­ÂÆZ@i›÷¢a<"ƸH˜¦¼ÐåÖhÊ„™ÉÊ€X/¶÷Hùø*2§ÁàŒH@ßLM.D\ºͬa)G9»6t«v DW&–«U aµÝEõG7¼´âÉ®Jñ2wXdj)rãª2n¡‚‘{fÖf_‚D£¬ž «–&¨˜[ᜠÕ> ~2[£s—ÉóÆšV¤ ›óLÙßöêÁzß­,~ £Fn…RǦwØp„U ²62B(x&E KB¼žòR½Žx´óóEh´cq…ƒ½+ÜÁöO¬DG˜kRi¼žÁÂÒÙß¾}{—qÃë´Õ}€£}‚;OËÂÑàwð 3§e!U ×]h=‹mÇçF«õèÅ™k°ÒKdGàÙ3ëÆU«éOpWYüŽì8ØUVv¥Ì^8šƒ£E¸ƒ"‡s®^œ~¡XÈE"Ü Ÿþ–:xqâío-q ê냼‚’ê±E†ƒˆ_ñÕÞ*K较Ÿ<¤zl=¥KuoL9’F”C1R]vŠæÅðΔ.Õ½[!5îLªxŽ˜_F,`LcŸÓmcÌI Ü-îë°Æ-zÓñ=JÒt~ânjjCþ¥{¢6ä¯ÉÜH*,ï!•Fh^‰JwjeBŽáòŒ_ÐáðwJ—¢õKêúû‘¢ð;غ‰œ°"Ç­¯TMŽ[û«Õ‹=ÖZ-Óê~¹ešH- Õz’hþD“‰Ð“ S‘µbÈ 7U«”äF£fNì É:²Kć#uQÐüLCx´éžKt>Ai®UIÈR­ýÚŒ*ŸÉ‘òš³wšõäKH ˜VÉÖêÔ›<7¤7D•š¢q/°\ÀìËF‰Ö™Ý´z¥SKÇ<c>Ü;—­Þ_¡ïC“ŒBmÃ"ø¢Š¶XgÒú)&’¹ÎlOx¥Âa 4_fì©òÚ,Ê*¾Æ-ãêX,½ÌïSkLwÃEÚ)‡G5Aæ| 5d&ð‰Ì‘¯ƒS¼»š3Q·ª»•¨qJ1<²eËEDø¯h?sJq“­î$ÎI­õ_;#ÀǺƒéga¼/`mMݽý¤©ŽΫjГŒê£ ½>/}ŠÖ¿3ÈÜ;=z§¶ÝNÃR—'ÍÑÑ…ÀÚ£›ï‹ÎÖ»v†(g憿ƒG‹Ì|.é'ýlaOåöL1(ÓÐIÅ Z 2øêxéx‹ú+3*§–»t+ð"-Bd¤!A”A cŒ†Íá¼d§e|ÉRb÷9EIãYBCHÈ™{Ú¨ÁŸ'Ä’ËÛ%YÕš:‰›ü ˆÜÑ ß1Æ |‡2ú˜ÓO`úÓ¤ªøûm‡¿«¤m¶>ÈIJÆÅ)·8M7’ÚN$UX„‚“‹™DRÛ‰R+Íäíö¥ï(SR‹ ñ ãô|œð-[°‰wž(ÀeSÔhðÍ$ñö¥@Þ ¹ù,¸nºf¬+•á•HuÜ®a,¡„2ȬTgŸpš?½+ vÊô‰*ˈD¨"˜lɧ©^+¢*²wn‘**,z™†û[ÃÑð.Zü8k_ú™Ô¶˜3ñ¸† î¢Ç7Wöãjè2Τ5ƒ{SDey>E± @‰‹BcýÎ|ŽwFc WÔ ±¸yã+-È…î.aÇè¸ï4ΠÖ9ýîƒW¢ à7ë[¹5 Ù ²)~J¡<¡wܯ”*ذ1M]¹@"íª×)Õ_K‹Ÿ‰¦¤GŽh >þ[YÊ”H2 e„$º¯Õ)B- ýr,ÆŽÖ"Ѭ‰"ø»×rÒ4ÔÞ­úB,¦ä,6m»@¾‰Ö3²ÖOq22#KÖ÷LWñ0Uœ67oiÍ5 \rö_ÿÄqø¥j•œõ¢¶¶[­ ¨R:{rb£m¿À2Žb A\b Ö̪‡Ä#ˆ„É#ÓL›÷@¥mµD 7j² úmîû(’®5 úº2ÌwÖ/R%ŠôûÞ‚éÞª)ëœ)– ìÉ¢ìïc—%KÂéW£CÛ)ÆwªEØ“=0YqÄ–œä¦ $ÞÝÚÌÁ‹ZÓÉ2LX ãÕEìD±°1RÖÂÓ ,eâ»ÊŠÂ:£†¥¦S`C-‰øÐ—õÇüþ>ó©XŠú™qÑ ýî|ÌaÊöÕØ'N»¶L›ï—ì­%˜„Âzû”êî£Å`'Á#"É|X¦ùMflŸ*X`Î<Ý>”•Z9ðÛK(ܶ0qu—(z”–\j4>ͨ†6åÑ”•%L–“Ìø‰|G“œêœßa  ß‡Ê™3…¨jºÐâ+Ž›l_u¶óê †Ô™ÄF¢ŒG¶ä”"UQET.-R?º¦ê $Ù‚›zãRñ%”¹œ¨.XÚN‘%UrK…îú½Æ® Z…€8ðÅT­]2Šþ؇ Å B)ÆwÅ9rF:Z2]‰v/»*â§ü²õBë3Edëk¶ßÈ»g“28˜¢YÊnøÌ(Q]p0aˆ*¬+C°DüCKEÀ1º,G•U'¯ç•ò¬ß O4ÂôðÅ`´9‰¢ì/À’=M€ßQĹõ¶¡™÷ É>´ÆLCrÅ®„@Ô½µÍâ|ð“>ÞÒÕ…p@içðÞÄá¶x•Þ¾T@3´Ï$â´#¸@‚Ï€iPPð“ rB ï}ä;¸Ù¦eüœ…„røÂÛÄà–bîÙÜ࣭âÑðî0øî˜ÿ׊¥s7PyD{0étÉ ëGn¦K<‚Æ4ù¿«ì §‘ÖÉ»´óÖܰó¥kÎ_÷tó–0ÞõW¯Ë'M}¬‚vÄ”ËH¡š:²Õ]¬®æ™3Ä×á™ÞUøäxo×’S<±#“êR]¨·ÊïBF³>¹J8œ­¼ä´[²ð"5Ï “¿³¸d ò2Á1Å%ëÁ Ä®’ít—’‹@0a8j• mfý×ûCcO0Vs± ‹Ÿ,E?r‚Jœ,öY8ë7CSã†ð]^¢èmhÜÐÂ0ç–ÖâÅQTUAq˜©öa§´Ò@DÛB`…œRS7¯î޳ãÅßa ä1Ò:ôà íÁæFƒ 2—èSư(Ñ2E%—DG2ãBõkI8¿ãÑ›eyaÇJM| ©”ÉšÖu±–Tžÿ^±’ª™Y¹D“ÀbüfIŠ‚0hÌzÑL9 rø”rÂOÊB&‹žÈ³Ü¬ß¡ZKNæšã[G‹6žÛú:öÈ-­Þ˜pÑrY§¥zA ˆ  h*7R³Tµ â*0Ðô í®d] S>Î! iÅh ‹*^V cY»Ù®j)=24ÎHÑx`J¤F6ôºìU¤Ú†q]+9ϧ§‘ TÀ+Á0wJaÜvdÑ×tf§_‡Ÿ'>e“ß–þ >ÚͱQw¢ÉÊ<׫ìµa™§za@í Óº¨cöhÏ.ì×O. ¨™>ü›ö8Ô˽btžêgô·¤ÐÌÍíë°RT²‡5k²3ìBj¦ È ër˜GÍ,ÃàÑà;Ã5IK•ñÈÜóŸO3gþʺ:,< LCb.Vßæöï*Ü;L%™¹‘Àï ÖÏÜ;x0cÊê‚k!¨ðÆDÖ5†<&ƒ8Ì`ð;‡Ùµ5OðÜýoŽYÀÄûg îŒŸD¶rוèìm+wøýÊË jàìƒä[’z‡oOÿœOáÒ endstream endobj 4606 0 obj 6861 endobj 4610 0 obj [234 /XYZ 38.2500000 344 0] endobj 4611 0 obj [234 /XYZ 38.2500000 344 0] endobj 4612 0 obj << /Type /Annot /Subtype /Link /Rect [444.750000 599 539.250000 605.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_c_arrays >> endobj 4613 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 592.250000 99 599 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_unbounded_c_arrays >> endobj 4609 0 obj << /Type /Page /Parent 2 0 R /Contents 4614 0 R /Resources 4616 0 R /Annots 4617 0 R /MediaBox [0 0 595 842] >> endobj 4616 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4617 0 obj [ 4612 0 R 4613 0 R ] endobj 4614 0 obj << /Length 4615 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€{Ň^@À;» ‡‹ #‡`'0l#ò÷£nI=3’>JüºH±{ä=ãf‹¤ªŠõ®â‡?ýGö¯ß³_ÿ“}ë?|=äǪȻ²ÓÏw¯?Ðõ±ÿ;«ê"ûöëá9{>|9|iÿû|èøúð×ö¯ÿe:ûKûïÏÙo?ü±ÿÒé ¿*Uµ¿9ÿn*Õþ•_~Ÿ>ÿ÷áoÈ~;Í8,×oæíÿ§u¥•=mcaéçÃðšêüóû·ß:ø­b ku)kl¦«³ÿþóðS»À0}~l¬RUi«üš…*}^©4™ÒM ›b²ÎùGfv`ò¢¨ÂM~Þ¹4P”)•srIÌ–yÓ§*Àç2{à—µ 8ùiçÒ@0 '—ÄleÂo?•ÐËô&¯‹<Üäç‹CeÀ-ž]¹MË:U!@ô2½üä…*ÃMÞí\*rñì‚È-´ªÃñä—ÙCàV7áDy·ó@<O.‰YcË€˜½ÌøV«p“Ÿw ³prI̶|? ´}5}€É‹:$ÝœvJÚ:f—DnY÷´¯[‹KD—éCÀ¿É²ûóÎÅ¡2 Ï.‰Ü¦tÍbjD À¿ §Ê–J…¤œò ]a¨ Èų "·TÍ@ýÆ„€îp•Æ„¤œÓÎÅ¡Ò#w:ûŸYðVºO€síÙñàǧÇÇÖè.³§ŸÚì~=ýz°íÿœü-ÖdO?fl÷óýŸ²§ŸöhMçq<}ï<¢k4’? ¥Ï#õ±nòR«žÉ»uê—,üêçóHq4ºVo¦W9\جžÞ1 \8gÞx²¥NRÁüxKÅyÄO¥jå:ô0ØÇðÃ(…³5ÞÒxÖˆÒî_“ð³𭇧ã `‚!fÓ œ ¯3y â ¤C0°á3ãq2º (3ìz à‘ÄÏ(Œ/üŒ]@Üç§V¦…GE®Çòˆ¡RL,˜×c:v€1oˆ³Å°iÌ+˜C6&mõÉŸ¡Ún³Í±*‹Õ¯Ž·„O(&íïǯ¿ŠO(Ä ª!žà:Œd’Ñ&Ü R™ƒ#0´$+‘Ö³cûYŠ})«rÀÁª¢c`MùvÍñ¼ï:y@#ú#iü×é;7RÀÙ>ûï¯c>ÆÃI¡Šå÷†#9„¯"0Ìì@Ñ g>ñhñ|SÓDÄ–±ÃªŸÂïgÁ>.êf@i,û8¬Ák~*1?p6ó¸^H\ýUFÎNÍB}ÄÓënD©nkD1T1ʇ‡«ÓaÎ 8–ôdà HQMÓs¸=&oÊct?šRiul£$d/#É¡^ àrbo²p3Ž`ˆFÔ ÊR½å¹sQpã¾·Åz×#Á{Ãz$ÄI÷æx&’¾ŠµRÙÓ„Omµß^Yó;po„Û¶gfAw­Ô`Šè€‘wçôZï€a¼¶²z|Ç®#[”ãŸQƱ±{Dã1Ø~dÞÇ#ÌIiËñAF‹uP ~AW1æaF<³GžÊB —ªI*&îáÔÀ6ñÄü“ =.qð°joQc@ÇÒìªÐDTævün8zdyY )3N$“ÍÿÎ#:ã9꽺sÑp&b×ÁOåDzRo=T¢ž°Àú”Ãs„18!&ÅÂÿ&*ú<Ã×»YþIQ¥ccÑ Ÿ5ùX(Æ"äÐù1D&‹C·‚ÏP–ã¸õ „êH»‘U@ð:²¬ñMÚü{^‹T^KÄBU]vº‡öÂ2½\¢ù{a!¼/ï6„°|f꼎ÌcqBÛÎco€^tµˆGÇ©cp"zê0OZ„¯Pºß>r#9æpÄ!Ï lÊaš0Ö4–tÆ; tÌo™ôjÌ]0æðûàQM„Ñ’0 vÍpò~×áÓêzÈ#‹e§è»&¢lD˜ñ RN"`$ã–[`åp‰º´DÔn.÷¢ ¬zâ‰{u,PǼ1o]a°0 gµJCkv°¾ÄËáhÅîT>±yøI˜a` ðEý!Kb•É·Àí„ÁíAO|LoËàhzZ€Grµ{æl‰ÆÊ˜Êж§.˜–È$Â1íXRŽãmŸ´‰Ö輆õ¾5jl ]aj†Ì”0ÍXªa $b²mŒÈ»\nu/!_¦ÉΔù§X|‡1$l?‡àc:›àd-‚±ÊV-lf9$.Á‡¦âÍRDS1ˆÃû›üR[J4\òÁC`÷Mp+óÔFv±+\‰–CÈ¢+Wfæ‚LÊ4á·ÞS1åqÆlž2Ÿ&“LN®¨aÚ7$™å̈CnÀ=+Š6ÅÀ¡#3E‹ [ÆXÛL° #œš×°ZÉTc)" ÜF—0gbEñ¨ªNYáÏÔåbˆ6U+ ½QÇ[‘Î>3ws²clJªƒ¨ïÙѾ)áÃâpžñ‡&Äø#øøHP«0/Ó5¤‰Pƒ8˜Ž˜l6L„.=•<‘ô¨Í*Å)D‡>Þƒ—L«Eh3ñ€íSÀöŒ‚ðy…²u$ªî·†_À«ëñ‘MOgw-¦—f"‘;ÈRšˆ‡:³žôÆŠ•ßX½–˜n)Ž7e´¿HA¿ÍúìÝT_:×?%~B\}âGTì•høì“Èh.q¯J (4ë¼ Mÿ¬­9~–^‘í5TÊ+¨Á@&½S4VËH¾E»P*ˆ%ëm!#{¯@Ãqf[¯ù’š\Ú¨Ö14åã–S˧áܲoÓ+±)E‹P$µ/RN{l³ik¬\TŽî„ªé =´ó9Ó§ [³ó-¯æõ'¿¾F¿³õ¼‡Ññá¹Ù„· >I{Á^Ï|R dm ‚çõÍ(æR69]¶;[V g«n^°ÉѪ›ùÉDX’iÆÝ»3"ªá²5¬šPz—lÛÌ;ëk)ðØoï¾ÒJ ÌöÈð‚VÞN×ÑUM!š¹ B¾WìNgâÈŒ[Ã;Ã$è­ÖÍH&Þ[!îÞP7ÉêJŸÂÆåƒ±á¡o•u.sÓ$# ±×†(ï|"×'x¿ óÚNžE«"¾Ý†_Ÿ¹4ë*sƒ{.â.‰LO¿xW™­ˆ\ÜÏöW™ã¾¶;Ñyy¹ÿ0ÂEâËûQ¹½éó­Ç~Äó¤´¹â<Åâ0¸ÓhTú½\Øã<¹ÝŒ…jFhÝ ë[ïOÛÞþ2ÆÐU¦ÉeʆËHÆt]Î ÞÌC7ã5w·}$t›ZÑÍKÿÒ@©y ºf1†Ínm^­]èB]OiB½Ø÷{F’¿g¤Ð—»¿biáïç¶" Ñm©bÁ&0ºx Ž9ŽyS] =Ê:Ö›‹&NØó«Ì[Ỏª)…„ «¾Ÿ8_ʆe•0 ©Ð환ÆV£Cz…dÈLLUÎ3“kÖ¶ùé ÿäѯWщºQˆÝVfLìep5©¯y[E®"“ĺ»dâ–m—±¾s–ca\&Zð럓57 Ó*†¨¥cRác]a R¾Çš ZÖkDz(“ðé3N‘˜®3S]®µÞÜuÓdš!A%š Hô’FÆ9TàÐ+ĉƩø²ó¥³ÐŨÛà X1¶ñløòv%ЦåP—œ2;À#x6 QÂáM9ð± µ®w6œ-†œÝ1å¹R½õ1k¦¿æf‰”ú¸½GÔ/–Àû܃}ž’qw' Ö ¶ˆÜÙÊa{3æq£ChË-‚› ß`ZŽÞ½Þ`­M¦H ä SZ”õĺ ”(›¦ã¬ÇþfÝ…7Ë; ]¡E 6Ömw>µƒXÑ“è±WXz!; _]‘E)Ûûêö4·­šVÐË8>x7iaŽ]3”wm Ükìß^¢Š ý•xÄÁ0°?ƒa€‹Ô0ЦHâ8(1¦d°vñœí ­)p®{‹€ì#+Fâð€Ò,žÍ]n¾§‘]Ú“gÚŽuëʇ…±u 7ÙØ-5ñ>LìÖ=ÆVÌ} v€×!àv{i©f¶ê¶sÚ—/úìªüعŒ&ì~f¤â¨Ç~&õèÿŒnà3 \§C¢2Ç.´þj¶n¥¦}Iá^§w-Ìì­'ʹ½iø |S<’CˆªX•We©ÞžÑ×­¨ÝôÞÂ#>qAæ>ƒå~‘ÔU&}€ðÊ'pÏizé®Ñï»Â¹¿€É<Ç#{¸C(Ü!Ú¹–é#,> ™¿`ÕHº¥Ø:2v rvÖÓd'K¥ì[ØÍ©Ù’fcPX"½–é+—F¶ÊŒR„æÌsœ’Ž/ŒGEUDtV…^ÄÐöÔ“zø´ªÔP, ‹m‡oßfŠÛ÷#eÜP—9‘fàà)Эæp³³É&•8Ê(˜ž£Ö¸Ü) ú?]1ÊSŸÁTÎ åJ²…?LÄ•X÷Vž&#lÖ ŽÍxÚ°”m/ÛÅEFÅXÞEÒ-ï´22b ·ÔfTæç>‰TJäpââ´,¦ C ¥D§µßî]••º¼&I ž;¨?C@1åÔbGwb$õt]_“~›4+ÔààILÇÓˆTaò!=zûdÈÒ”CÆ u…aØ{"våþ:å>t7øôò%?¬Ïel²ö áæn¹ìçø*L¾6ÉÚŸì¹ååNVÿeé +dA={rû®¹:1ýL] zÿòvô\Í ¦‹!ë£îš‹MT¸r:Ò‹@},'}ÔÄê'´ŽYÊLŸÛÛcÿ¦¨¶ÚíË–ò,§/ØÍÜô±è5ž >ÓŸ1åõêÕ Ù²wú»Ýñ°óÏuþ$ !&0 ˜;& U;L%=›˜9ŽÀuz×ÝÜ3˜‚1eÕ£cà ¨ñ‰q¼×'t f0ø™ýîËqËC<‚÷ÖkTsÌbÃOÁ¦SxÄbÈ5Ô«[ÔÙ3[忨óû•‡TŸoÕK¾%©—}9üµû@ý endstream endobj 4615 0 obj 4092 endobj 4619 0 obj [235 /XYZ 38.2500000 749.750000 0] endobj 4620 0 obj [235 /XYZ 37.5000000 250.250000 0] endobj 4621 0 obj [235 /XYZ 38.2500000 144.500000 0] endobj 4622 0 obj [235 /XYZ 38.2500000 481.250000 0] endobj 4623 0 obj [235 /XYZ 38.2500000 481.250000 0] endobj 4624 0 obj [235 /XYZ 37.5000000 250.250000 0] endobj 4625 0 obj [235 /XYZ 38.2500000 749.750000 0] endobj 4626 0 obj [235 /XYZ 38.2500000 144.500000 0] endobj 4618 0 obj << /Type /Page /Parent 2 0 R /Contents 4627 0 R /Resources 4629 0 R /Annots 4630 0 R /MediaBox [0 0 595 842] >> endobj 4629 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 4630 0 obj [ ] endobj 4627 0 obj << /Length 4628 0 R /Filter /FlateDecode >> stream xœí]KoÜȾëWÌ9ÀŽÙ¾€ €eIr`Ø@A7›`‘]ÄÙCþ~fÄæŒDòkNªjrFŒ‘ÈQ›ý¨ª®îz}ýá_þ¾ûço»Ÿ¾üg÷-üüô宨×eÑýgwüóÃË_Øfþ¾«›r÷í—»ï»ïwŸï>þ÷û]÷Á—O>üí;»ûÓá¿?ïþú·Ã/ ÿèø~¹«M}øùïçŸmm+N?¿ÿ×Ý_~·ûõØc?\˜Ìëÿÿƒµé¦13ô÷»~™æùÏoß~½ûÐ m_V®.vÆ;¿3­·»ÿþãî§Ã}÷žõÆÔ•?þ#~ ÚžF²íÖÕhœç?2½…ν/õ:ž¹4QŒ«L´sIΖ¾§}­A s÷ ×F±ó癋S¥ç-î]’¹ue;µ¥ùûÞ5Èß”•¢àg.M”žµ°sIζEÓ‘§¬èsê]ƒømå;?Î\š(=ga炜­ SéqöÜ»ñë¢ÖSÝÌ•8‹;—ä¬=ôß‘Çx»Wè\óŠÖÍ\œ*=oqï’ÌõÞ9§@¢s÷ Ø«×ùóÌÅ©Ò3÷.ÉÜÊ–z÷¨sïä¯M«×ùóÌ•îQ¸sIÎ6­ÑÔÉçîå;oŠBï"ÕÍ\M'ãÞ™Û˜Ò+2÷E÷ ÛJï4ïf®ÅÜqïŸSzÁSé~Ž%æ¶¼ôáÜ0ÝðJKIZ/+ËÍîpŸšd[u‚Üô‚l:²›ƒžë¦s‰ µ†”{[uMg>¥c?ÂoZ8N·ÉŒÛצ©_õÖc̾hÝ…-‘ql)úÞÊAoΠ–RÇtbTï][\<ƒnœjïL'Gç dz‚<Å…')¡lvõųP–ö4¤é'Suü²Ê”c&vbä÷ÞÕ¯ÉÎcû¦á¢§¾étÛ—¾z-`E'zÍØµ>4ûfÄï Œ[‚Ä]2¥ ÛO'Ñèú¿à› ˽;\‹^·ào0Í+87HHÙY×årÁ-"xJÎã Æáq K#½= AtýÅÑ 72n¡¤†‚Ø‚¹g)á6œu¸Ž5—°ÿ!}§¹þ~VŽvYraÝ…õ@bïf¨£xH–ÛcpJBñaôåø¤‹¨G|BQÀŒËKä6²Í‡ÂOiÒÙ#Cä`ÀS‹ðúI‚HPßD¶ðÜ›Å$?Æ^ÍtÊH{" ;lÆÃ–ˆMKÂMç>#åÛ“3ès-YfZÓÓ:rº‘*ß^ÌʺCð8žþ:W,v.b—¦5äæÜûÒUÕ\‹hêŒZ`Æ×Q{ûZüÓŽ^|«M¸—ÜÆ•)“s»Gð8‘›­Ko¶Ù ëWÖÎpް""ë!$„’ªá®Á“MpØÉ:ÅÜÐXH0¾~]“&a1å{SwøÖ Q§JÄLÅôù æ$e¦2b;rãmB®'íÛÞ|’oâSD¨°®ÇÞ¬Ëe6Ò ãg|Ìw-®Û2³Á‡ 1áülôbS˜Û-å ÌËKc|?*̾XÞyÁ˜çŒŒEœ ™²V–çÂê%ÖÍçËYLE&Ÿ ó‘Ér‚. ììÂs‹Œƒ³¶ ¶’̓Ë{ÃÒq®æÊ(Ãò†9×™äÏòfF;äâÅŒDž"ž¥!3èÎ'eÓô¾Ýˆ÷ Ú L&S¶ä ÑÍž v㛽„6âÕ»<µ)âh$<1#¿UNC¥õ§(GÑß4m[õÄy1”LÉú>°9Œysi’Ü#[ÆË%´ˆ,#ÁQƒ},X/aÑÁoy3zÚ´.N9_ê°6Å×~\*„¯{x¢…$‘kX¦È¼% ©–¿Ö¦ðoxÆ=¼x w¨ìV´¶Xt+¢Ãla†r¹¼ ñڛіípÕLp}$ Ùá89‹WB–ÉI¸<¤¦JX(oÌên,o†k¥¶Öø`Òª{?“1ˆ6é—uå0ëÉ¿ÉeG–ŽÕ1î Û¸DI¡ÒåùDüj¢ù ¶<“ÀÙ+ ó±×'ǹӘæ*ÎÆ×ƒy†‚¹ 6˜?íKìŒ'”U.·ÇRåV`Ev(¦¹Èa‰g†Ù )o¸DI^f®JÄ2°cJ‰¸l©‚R·Ð„TAÙ”u‰»æ ¯jQ´ŽÛ¶Ð/YÜ7› ""!M€±*tágr] î ·r'4I$ †¸ßŒ"øFDš€J"–AÕ=a1ËÅd‰ÝXÂÄÏ1A§¤9,apLbÈÇ»ÑËÎvSW¼’(;ùIBœUÔýǰ‡ª&bÀ"Hu¹î’?*Ä„ÌOõ°pï,O =X&x¤V\í+¨:4O]W I东üx˹¢ãè±µiÛ×C.ˆk0zl[0Þë *tt›¾?]˜À£ F,Æn¥0b[ô‡t‹ÐŽ™[-¹žÈ7<~íTo<Ý47YÓ wÆóÅ2[`o¡()‰R9"PˆÍ#ä/'”mNõ†g×C­´D3ÀŽ9¨Ñ"ë© ¼>@ŠfÂu®­ë—"ÍŒ·QÔ HÕ#äJa"–¹ÆÁv¼r´„¨Â—ýˆ KH]IÔ“7&±ÚÖ;IlNÚßÎÚƒ ë3"šàÅqæurh†#M58ñdµ#åËdžõ‘Î%ìÃðîj/Ý(†ÊàÊOá”aì%&s2V²òŒµÂõñA² H了ÍÂŒÉ5×½Y! ¤iñ–Ó¶àÞ<]!‹iá.0˜ƒèLíSYО)ÐAs¹âÖåbp«Å5W‰õí¦¹6ÍuÖIW{3 O‘q u"yUFmg{„¡÷£í,•ëžöntÚ¦í8mÙ§x=jÃàeÕB¾ž_Ýi!o®Q yHQ¹pšKX aO¦ÊuÂBÈNäqq|î½€oV`M o*†ï4qõÅ ø_4âªSuyk‘×åŠ72¥ÃF¨p^¬j&S¼ªåMæ½€¬x@·$`¦¦D˜¨J¼ÐQf-Þ4ˆ/ùЭ¯ªá!¶be¿üãèÚyø,‘Âôâˆ8×ù´÷ vžìMŒÈ}«¡›òÅu.÷Añ¸iCmä‹ãFöú\éƒoPŠŒj°!U{¢ðøò[Rä#Q+“MÙëÞj)Ù@ö„ ÷r_ 3±³àTs9x•Ý){k‹½i¯Z"•«á”F·QÊ“xé3‚ïÁÀ|iØ-¼‡ÖÌo­£Ã¬ù©f*ËS…fÕ ®Wm|Þü')(㘠D¹ºˆ“Køé\!“FŒa®cII.íÐëúÅ¡u+õF"Vü¢Ì"zjRvw‚n’Ð&Tè ï>B)æÂG£Pr—²ªW­/О±Ç×HÞi¹4L¦®ÀãdzV\–nox¤y•M‘g¯‰<éHQ/¡GEòìôÖÍRgô1¹‹‘LHü€4óPûŠ+÷Þð^Ü•å.ÈS‡s«‰ÌÛH¦ö»ª@+϶ŸcëaêÙ¶ý,½Ÿ >k·º¬9àÌì6[Såµéq€åM£Z Ï:Ï®-çç³íÚØz˜ª¨m׊ßÄW\­„å[qŠâ½Àì(×ÌMÛ)úO‡L„ª(ûÉàt&\rÂà²1YºD`;wÃ9†LTr«c‚TLä÷6ûu$N'‘¡qïË’€Éï$ÂäÔÓ,8†syç*aVÊ$ïñ=Á¤Ä%Œ«‘‡ë46™dæë¬ Í”‚™ðÎyÄ?–!¡;rû`õú²9PðøqåðüÑÏwwípÌõè3žÆÃ«ýi¦ò a‹¹%*·r–c¡‡*ûr` ÆÇ¢OS»³$N‘5Ÿÿº -汦üª˜J8ðƒ_yJ®OQ<ššÆ Ž&acèò’ì6q¹Š|C/d0ž¶®îë¶¹.Б#ߤ±4¯¸*”:2Fg"ñ¼S{˜ë½óÍ"R«¾ÌéŸ >˺?$ñT§ ðÖ¼XTyíRP7Ê•«WuëÀâ–ËY¿ê“v-º0m¥ësFù*t_蔄9Uó"êËUV–Û€f挭ÇgÄÝÅ8¨ˆŒÍC+à Ñé Bƒ—&Å\HD^Ž%NKìé .t­Ô€­dýóNjŒy=ä”jÎã:%‚OÄ7Ð%Ú«¡ÞZxXXxî³&F™¥AÔñ6œ8ƒ$Å8ƒõÎ:"M¿1ð(€œ3Ý­öö9Bó²%W®GsŽ{aSb'ŽS ™sñ7FuŒ.iêípÂì»RJ‚3DÄ£"aÎŽ±VXø°õ&bµ™!²ä#¸s?ëžHý6ÎG€]¡EQyººjÏ„— Dmn¦òié ƒæ±Vûg²¹EŠÆD JÊÅÎä*1§$­+R%$òè>ß”Cðxö bÞ8)v¦wW˜ÂGÑä@Ðô›‡ÊÖá>õ^Æ=$5FþÇìÑUÞK¾ÿeŠð"Ë‹ËÊú`l©gn˜¸7cÍ«/H‚ˆ¯qŸåž%2óÞ¤ä7™…³Æ¢qøMüMo¹ðÑ-·Ÿ*ñ> Sè\äJihêù2,‹ÄÄ–œÈt‡—‰Þú£tTÍ<œVRÙÿÙ4Ú‹ç†É¾Àõÿ‡*0ˆªXœû/zÓ´ÝNré¯8c` bäCJQEØæÊtY”‹þÏ´Ö¿Þajd*Ö+ƒß®Az”W€Òž¨C|yå£È¨7üöîÃÛÖCáÄozƒÃ®½M4xu]c¡¾••·+ÕëpXó1<è¸L8U“ñü¨¶wFÞxïdÞØÎîüXü%M¯ozý*ôz³½ó¶õP¯Plzó'0/JàÑ·&ÖêˆÇ›ÂõÈ©*hìºJ¬jkÈìDԌߚj¸¶¼pºœ3¥YˆuA_k²®mXI½Ç±Â„tÂÅË^¯¹ÆÄ”_]Ié§eTuÌ¡ºŽK$m1 F ydTŠs&4á1“ʨs8´SÑøÒ ¶Ü\A$Ÿ!šj¥”œ©X8§7¸Í–;œ)d‘rŒ¦´ƒ#ÖA«NX°.ýˆN¤–QŒý¹ÍÊfÍó…“«‘¯U&Ä,p»dHíEæîÇd9oWÿ_ý•}KÎ Ûk3Ï{çly:Æ3£‹®Pä…Ÿl`•ïD2b-2h¸VKÔk°ÙAW”ßìL; ŠB$§Çÿ¦Øw¶Î šV¨%, ÜÛèÚñÍGô n 9S½5ýnè &^¬§îeqˆ§†[ð8Åî`ðó†Ô ÀsõÞ?KÒ Âîžç}™þs¡£hµwÆB0œuÇùçfÐ8áòŸF78ƒ\ðq~L(UÕ)ÃvñÜ õ¨u¦úªÎC~ÕÐT" Ìôô†ˆ¿o|¥gŒs,ĺxÀ+tnPÏ\΄U½`UvxÊ$¼wà_12’É#[€_uÄð½Ø\ W»žß z€JvZ[F(€âHDîÄ&ÊWŸ&X >ÐN‚ÂØ  ôÞÍ"Góh†Üò;?þQêÀ›ÍÚoʹߨI3ðqå̦gÜäLuÌT!dá°µeÏaœËÔä@Gx2÷jwZf;¦¼h%ÑlíC>zÿîøˆk« X+ÙÃL½Öcpn9äeÆ_fÛ¶?L x—…¹Ò…|Ï•4Ç„ž¨¸ù2ñê³§f âÂc´3 ãŒE‹›hÆläqÆg-ú6¥ˆHtíúÅ=ûðg÷ý v£ZùóÜ?¸@m7ÓU n_˜£7bwBå*ðCM\Õ›­s,ØñCMáôxÂÉ=„oªQ¤Ó@®> qÜ\ÆÝÔÜžÂJ‘C7~x@`¬Æ B3Õ=|],l݉eÜü&¨“´ôú,¶¬Àÿ~˜q?óG¨ŽÊt°X\ …‹ ¦*~™ ÏímƒÈ à8AO}ƒi€%KV3Øî˜ÈºІtXÁàoîÃì«aênÁs GÚ”²€Äô‹¼ ‡¢˜ÄøMÂ?»gëÂ탾¿póBzYt<{¨}Þ}¾û?$F„í endstream endobj 4628 0 obj 4850 endobj 4632 0 obj [236 /XYZ 38.2500000 352.250000 0] endobj 4633 0 obj [236 /XYZ 38.2500000 179 0] endobj 4634 0 obj [236 /XYZ 38.2500000 179 0] endobj 4635 0 obj [236 /XYZ 38.2500000 352.250000 0] endobj 4636 0 obj << /Type /Annot /Subtype /Link /Rect [138.750000 470 184.500000 476.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore >> endobj 4637 0 obj << /Type /Annot /Subtype /Link /Rect [270 186.500000 318.750000 193.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 4631 0 obj << /Type /Page /Parent 2 0 R /Contents 4638 0 R /Resources 4640 0 R /Annots 4641 0 R /MediaBox [0 0 595 842] >> endobj 4640 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4641 0 obj [ 4636 0 R 4637 0 R ] endobj 4638 0 obj << /Length 4639 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯à9€Fìn> €´ZÈ!€ r0rä8aÙø¿Μ™%ùÉoª›äˆlÉK±Ù]U]ïÇû?ýGô¯ß£÷O_ÿ}k~úzˆy×ÿD§_ïn`‹cóç(/ÒèÛ¯‡×èõðåð¥úïë¡~áëÓ_«?ý/²Ñ_ªŽ~ø{õÛ¿tú ¿r“W¿ÿrþ½ÌMõ§øòûéçÿ>üíÑo§ÛÏ5›yûÿï¬-Mš¶1òé×C{Lsþõû·ßïkÌûJ’ÎØÈ$.‰L™Øè¿ÿ<üT} ]>>–‰1y–äñ=ÊíåK¶¬`õ¾sþ¥³ºñ±x‘{\ü´sm —qqMÌ&®lÀ“öIè~]—÷°xzZ××âç«C¥Å-^]¹YâóÚ^V÷þCö¶øyç¾®-\\³yQxÄìeuÀ/2ç‘lN;÷…Y¸¸&f«ÿóˆÙËê>€_úäÇçûÂ,\\³eì“_W÷üÒxäÆõÎ=a/®‰Y“µZŽI|@?ó§D•¶ðI7ÙYÍQ†J‹[¼º&rÝÉÀò‡ÜëòO÷ö¼soÈÅ«k"7m¹f™z€Pê“'g.ó·øyçÚ@iQ ×ÄlvÑaó}*rYXŠT½su¨´¸Å«ë!7‹cÛÚÕ¿Ú º]ÞÃâÖŸ·«Ù¹:Tjä¬þeÎ*x+õO€ÏôUxñãËáýg“˜ ˜YôòSµ¹ó7ëß^* ¤Ñ»“'-I£—£?ƱÉþ½ü|(™MÛ-ÖOl‚žÄÏðÉ'øÄÁ'ŸÑ¼·8‡ï|„ïOܵ…{sn®„»†ïìOª?¥óŸß D!1Ævß±#TõüR±ïÜ!Kvîpî“èIç0žÀ]ã½m“sm“;XÑØ7ëiþI-¼%xoz\¨,(‰Ï,(1å[p˜ø˜å¦ÈÓzÝ1M²Óƒ›C7︣³…±ÓÞ)à“š)Ç¢ŒÏé"$m?3e5Wï­¸ÞÇšF’câêh~«COà1l1µÞ–â ØÄpù†œ†Vƒm®áÍ–0à‡ÄaȺ·)º(º»ïýo~O@úghÅÉ|â-õNÜy&©l¿Q6‹E'f³XqƒO0vXp¢FøÎÇ€/ͨJg±¸dT ˆa÷•éÔÜ£ÜèÒVGFU¿0°²å`%оçÀÆàò<%…¦ÜJ())î1) j<ú$Ìé²¼…)ƃ´GTõ̶ÂÖ³ÙWͰ–“jjýĘV™é*j¾ ÿ@mŠÑÍ\WÁ›¡9«hÁ&¸<£²?ªöûŽ;dyëÜ% °ÓDp?Ò KQÁyŸ,¯IlÓá¶f÷ƒÎMÁE†i[‚˜z zÃßñB£a¸P™x¹M!îw.$q!̽¿þŒ aÌa{“ k£vÓG´ÿoÁ\ÃÇ 6k!Ö{4‰7'š€£?ÂõÁ—äC÷Ã/ñaÏPb®¸°Zí‚ð¸–Ù».GÄOÌ'ââ)f8DŠAŒ ž ÅÎF¥Gi–ÆyGœQB®)ßÝ降7Æ»4ã¾[@ÌHI|Cë˜ô—î-/úWûˆ4-ßÎÓ@ršÒÎzú–k¬±8á䦨k1q¹bNè9& Ѓ.;e´õ±x—&¶òRYñj Í©*|̽ëÚ;P•NžÊب¡Lm†00&v@ÅàzZ\ºv™B€2€¯*+Â\-ƈKÚÌ‚j®æ¹×ø'a()-wJÚyþy¾÷{¦Û¼Ð Uܘ¦§+Ö)JÄA%¦™é®‰÷:ÞÎ$o [ÐA„™»fÊsOV#^œ¬wÑüš®ÖrE¶s(‰/ûw%v7‡î¡$›ì”´óü5òü™C«õËëYj²©ˆNWbÝuT2).¡›æwñ±Ž=Ý\² =iDhz´Ý€U“Þ<ïè¼·æÊ­V£Ê¸cݘõæ<õŒéufÅO„ï<·ï¤Ýw ôfGgjÌw‰r褟Ðw2Ú›AßÎwÐX”ùÑõ¢Æ1„Üu#LÖZdS࿃OjB•¼¦×qie{€^S`Æï'^1½à™f1½‰`¡ªVU«u»1U|Li²€Jxg:òëV2âZh¦e2“Ö¡ÚËIeÔ3e0X1‘rˆ[yÍ`UTe&“êª:_·N–ï’ìubBÑ‘gÌ´ªÓ{ É#œ‡¨,|qŒsC¥¥Mïí¡,íMÒ-?0CCÖnTÕbØèžFª”F:V ãQ¢–eÚ‘¨B¿"[P=™n$'˜3pñ¥é m·gƒEïŒ*C²¥ËXïþwð;|‚ß{k\ICX-áj1„(„5ÞAã²*¢Qkt/Z‘vèH`I—>=Ÿ€Š¥¼ØŒnÝé ‹{N(š>£ñéÖ ëÆM9ÄÙž 7„¶¦ÅÙð¦ëÍŽ…òé\Ím‡{§óIÀBL`p%$vL6ª¸I2ÞÛ3ºÂàw>8ô†¦`LYEçÕ½1¹ږ¯½Ef0øÍî³n‘'~‚÷Öð÷!f1ˆá'4ÍÆ! bÈ5n}eìÍcwløýÄË ªQØÉ7&õ¢/‡ÿ“<ÐT endstream endobj 4639 0 obj 4181 endobj 4643 0 obj [237 /XYZ 38.2500000 499.250000 0] endobj 4644 0 obj [237 /XYZ 38.2500000 499.250000 0] endobj 4645 0 obj [237 /XYZ 38.2500000 253.250000 0] endobj 4646 0 obj [237 /XYZ 38.2500000 253.250000 0] endobj 4647 0 obj [237 /XYZ 37.5000000 236.750000 0] endobj 4648 0 obj [237 /XYZ 37.5000000 199.250000 0] endobj 4649 0 obj [237 /XYZ 37.5000000 236.750000 0] endobj 4650 0 obj [237 /XYZ 37.5000000 199.250000 0] endobj 4651 0 obj << /Type /Annot /Subtype /Link /Rect [213.750000 611.750000 253.500000 618.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4652 0 obj << /Type /Annot /Subtype /Link /Rect [419.250000 506.750000 474 513.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_code_typemaps >> endobj 4653 0 obj << /Type /Annot /Subtype /Link /Rect [329.250000 260.750000 369.750000 267.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 4654 0 obj << /Type /Annot /Subtype /Link /Rect [106.500000 207.500000 171.750000 214.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 4642 0 obj << /Type /Page /Parent 2 0 R /Contents 4655 0 R /Resources 4657 0 R /Annots 4658 0 R /MediaBox [0 0 595 842] >> endobj 4657 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4658 0 obj [ 4651 0 R 4652 0 R 4653 0 R 4654 0 R ] endobj 4655 0 obj << /Length 4656 0 R /Filter /FlateDecode >> stream xœí]KäH¾×¯¨3ÒÖ8~IižHF3Äí² ÕΊŸª¶]Ý•®/ìü*2mW#˜¡ÝNGFÆ+ãùæ_þ¾ÿç÷oÞù÷þÇþï÷_vÅ¡.‹î?ûÓŸ^þÀ6‡þßûº)÷?~Û}ßß}Þ}>þï÷]÷—÷>þë{»ÿÓñ¿¿ìÿú·ãêéô ßvµ©ÿúôw[›ã¿Šóß§Ÿÿk÷—ßí;­8|®æòÿÿ`]al}câÓßwÃ6ÍÓŸÿþøÛîM‡€¸¯øª°¥ßïŽÿÓz»ÿÏ?v??0,_ZoL]ùº¸åCµ=ɶǕŒ}èéÒò wUnñ'ÈÕ±b\eäÕ5×Û¢C-Ú(:/Ÿÿ•mÒ-þ¹:V†ÃÅ«šÊÖ¾,Úþû¦}5ÆvH««X;¯žâHš&!3?A®”á¸á⊬lÌ€ûÓGÕô¼|ŠÅ}pñ'ÈÕ±ÒŸ­°ºæá–¶×’m™CçÕS ¿2éÄt¹6R†£…‹kžl{æ+ç ¨Mȶ¶ð éæ ru¬ g‹WW<Ü£‚¯†ÃmRàÿ¼|‚Åí7é(ç¹:Vúïþ9f J÷p¿û.¼øîëîÍ'ãÍ™ÕþëÏGàž¾Ùýõõˆ”rÿÃÉæ?Z8_ÚÿþRû‡ý×_ví¡²åb÷Ä4èIaá;>yÿŽe¾SÁÕà;ÅGøä|âà“Oñ°u<Þ0Ôž)>9÷c!ÔbÔu|üzdˆÔ´ìŠjÀ<-*\øLÞÇS¬ƒ|¦Ìø;˜.áá;+>Lå+¡e[NR–s¿%\‘joV~&GÛ³Ç"Æ<¤E Ÿ8Œ+Bƒ²âmùBQ,† Xñ¶,ß·€À|ÑXÛ^¢Ã¼ë‚ÏÒ '½°»òÄuŒÕ„Ò¼94mñ´ÝglèIoe”gsù~Ø8b5 |‚W3®Ö!Ÿá¥ûéµÓµÕàwzYÜÌA‰ØzA‚^uë5Þ)^Ù)\"™ùÇyB@¤ iþªwñò!.0£ d€EcoñºC髦¾X­„OF AÞˆ`qï!»BH‘Ï0åHMørBä'T‰¥·¡N DWð8¬ù‚fÄòˆŒ°*„Ý» 戊ނ‹Ú—`Œ Ç¬…å f{5Š“ ý"$:-Iá†mslž§þ; ™°®Ú ±dlûº*ƒ£cŒÌY˜žßÎX{ ê+¬?æ ÚîzêK·¢ºš™’€ï>ÁnÁÉKà_5gš* ìÇOra'£KÇ·&3•ëb»K‘Ã4†]¬D8ǽËwÂ¥™Á[˜æ3ŲñÖÊÝÞ¥=^2~µªR •¶]‡hª‡ØŒ8ž—º˜p½WÕm+t½«:¤#<WµÁÃU}“«Z×{Éx³Rsg÷ĘÁep!bÿ3Á$ñâý|š¶˜2qLP•×ذcrÊ•Òá]´¡& ùqD®˜Ëo6áTŽpŒ• =ˆH¯Àºa4 V„]xþ1FÅÝñ©cÉ"”\Î0*ywƒÂ{̇ª6—Ù“)Eë.)Úõ½ ËØáQ"ûó+6.˜ ÃØŽû/ÌL‹Paû \“\Ÿš¢r¡B}NvÆš#ïLOå:Ã\@ŦkÓ [¿+ý’Á…T··lz$;ÃË–`RásÇïäò¬ÕfÈšv0C€ºÅa’&ìb!w £¿Ä%ž‘:ŽA,r%3Wœ‘tÉp Ü1sT‚\ºÒkøz7¥þ…ë2‘óC¥©'ÎÀ›Ï¥”n×uµ½0ó_ª3*r5óô‰Ð?m( ¯Ëb®o!ȄɈ0‹(9˜RÝ™™ñ™Pÿ„ùòTñ¼ÿ¶« óò¿î¾$«yFäpá’˜k±Ã¾0l„éú>tã^LP›Ìj„“ÛWãˆãÖ$B˜ãØÈ|À󺩳#EÎ܈Gûšý*åf}S¾IbñwCݳ¬®Ã<&äÜ9×V>Æ™B¾qâïà‹öçE”ý1—V&2œ ’–P%‚ÊxÓt=c™R5(Êÿ€NÁ 9¼.ôdã'Ëã ·ÍΘ‹8®@ݦêÔryðÙ9w ª2ÎBW³”‘)ë,oàÒ§ÖˆP‹¥†„ ¤LÏ\ÜðÕ·ñp•©ZG‰“ƒbܹz±Íئ‹¡…˜e¬¿-ÄýbÒˆàò“™ð µgUú¥l”‘ËÕ#×­‚°pmG¿×rj˜ØIXÂáÏ[ŸwkZ‡qGØ]ŸÆýû46¡Õò–’¤¼š²ÕÐo*70ݸø ²]ˆÝ㘈j•£H×KÌÈ1&÷&bƒó³=ù«ÚLrÑzÄáj2hÒ6¥3® §÷¸$ïÞØ_ÁâºþM ÒIHÅÖ¸S*ù0‚óŸ 0aj~„n8Œ¬oñMC·~ൖï¦T® Y‰ÉÅÎw†¢ÛÓc€3<Åô¨"[1!ƒÄÝGû虉ºÝYÒ&õæê„˜ºb\·çÛòé LR“j#Ì-ØÓT niÅ\óùT)‹uáâ¼Tòk¨òTÆ [xhÓÜ‹:¤ÃM_ãæÀâ¹Ìx4ž™ŽçÀÂwðôÚIØÒÖr5óï¼+¾ÄQ¥ëLœÅ”«™ì ü|ç±C™²‡&O7­èlÊ`Û aH5Î €FkcáDLÍÂ;D·ÝÂN±xÄà r à™ '‡!˜:픹d¦ (Y¥Q¸ò\ ]Ûjñ–n‹WuÜÑÑÏ´2¹,|@Ê›¶ñ¢ بú!ö³Q%ƒwz7ª¤ég ?óåÿÙÒ´**ÝßXªÞR.TÚÐÍoQ‘hÂ8ÔbÒkï´œ/ÇuÏ pá%m±1QB€)½ÒÅ©Ž£Ò­$`*RŘò`U+5| Çi˜^„Ä~rLo|y Ï5{_w‰Á›‚WÛƒØÃV¶Æ°‡Ž}õx ,3ÈÛÑÌxY<2•ÚŠ­Œ7Äô†Ÿ0V#³|KÁv„ZùL y+H l³1ÞÝ› á`¤ Å?„÷J;›´™óÁP3žÁײ¸/ì!wDz»7¹£êoV{H±4÷Øô‰®­i/ÁTJTPA—x\Óh6"[ COdTãÔ=å™òªõx:ãŽ3UÐ%.ºYþœ„ÔŒHê˜I»LVÄ=dÊ,˜…ñšf:•ýtÙg…wo3˜^©lwRfžm,“¶–Œ­Ä~sçBVÜr*i;È‘•þè×£¤ûV\ꙡb¿²aõQШ«ˆòàß\V£u#ÚÔýŒ)§Ü~„ôk†í˜fÁ„qÒ'ÆM†çÄõéVM[¿a@Ý’b5½Tê gõP=°£Mí I7h¤¥›¢¤´ë\°×åûåäx'8˜Æ ÓÁ×ÜêwÓ.®G_£-øÖâ;Ûô€mù¦’Ò÷ém opi®·„È›?¬*M÷œ-HI¡Zµ‹%5åöY,Z»¥>¤ªõ± n=2ÓSy‹³)“–òMxzŒ½ÜÔØË¾'JÇ@í')vÕ^¥×ëvVÑåwçe|\çÈ&/ˆÊmü4ŽröYþÙþ±¡vY¡œŽˆ¬ØcIM^ãë³€r•Ip¯’‚iaÇD8°õ>$ˆ²[õBºBýCèÌ:)S„hFÁdŒ¯Ùªö3¯š²ßîÛ€¨eØï¾#¥q×ì¦f²!U;’3sß“\â3x²ZGóÕ±©O°“¡/7íyOé÷mH,L†×âÞt•„õ_™=3Ìk##vË …§*mY‡3u@±Tå3ìP€;Æy\Ö{¯%ç`×øDíÓß™ªJbÜœ‹_r9ë¯ÆŽ` ëú Óg u$gÇi.ºwtJKEHs&¯ŸÈðÑ5ãäc’£: ÌOcЕ­zssv¤ToYLI¨0qC]ƒÛœáA¸ù*üŽÇMx`ËáØÈÛÀA¶Àñ¸!„'7îß)a«¶”Á2öºÅècñÌXS3z’¦3™ð†/vŽ¢—[x £¹€±ûɬ͙˜Íyln”eÑË…J,(qVÞ¸"Œaá;Í%w¤`Ƥðt¢Oê§ŽglšöåO~Ý}x!`Ô•ZŽY³?Ÿº¼u{ç¶Päð4VÆ9bªó»o˜Š˜RÉ7>À!ÅÿÄè ü™ˆÂ)¬X ÉêÉÊ êQkÆL–ƒPÃñ1Ówã0ñå4Óc&Æ€ #UÇG c¨˜‘“ªBLO Í8áóÀS|Â}@*<»d=¥‘[Ìp1a|?Æö~a¾3 šÀÊ ¼ÆCæ¬ÉG/¶°Óô«–r0ÆP•êî#F.2Á-Ì&tÄðÏmâÀaîÎÉÃe;½ï©â(é)œæ Õ±„‚ÄÅù¯ø3jh[7ÓÖÕâCK) õ½ª|ð†õ=A/ 7áÜç\'çÔ²´fÐr[?hù&=ÁŒy§F3£l1Þ^•»ÓSšÊïMÂeż+“`þÞø1ë™”þ†3Éeë9ø‡©"'k·i,êR6ei©JÜz”o³+Æ–ŠvÖÁM­½›JHËóÙ:ðëÍ9x‰)!'<~ðxÜi05ŠFrQ©ðž2»fíFìTÒØb&4ˆ.V˜ëqíDŠHYL·¬gz¥¥©»Í$.ËzŒÌ°«` †‹p1Â'®ùƒ+Büx,0Va”u5M±ªfóòŽ]n¨º”{˜a³;—+kåfwÙ–™©|ÍN®{£¡ñÐâ¸^–3&Lɪ ”Þ•ê%¡Ü8¢Ï,S7sG™ÜTÁk®ÆÝºeý p©·êŒúUWn²ªfÅr+¤LaB†búž Æ€¤;ñ%m%N†… ´×¦Òæ™úƒÞ¾XPtS-˜:>¦™|Äð¤Qq¨ªðšä3bŸ(!ì)ÝiåËˤU64l  §ÅÛ ¤mû;žPñ„ Ó7lóò§>€‰¡›2ôòøög36z¹¯o»ÖŒ6š»áá „ó…"ÕbÛŽºƒ”sµm¬Úà“«lÛØ‰­²mã ùìXòÁæŒB£ÅŽ~냖۵Œï lϽÂö®VÀw˜öx§jž¡Ⱦ¿VíÌ%ñ_»äLµ5¸¦Š>ï¼…`%E¬Ö 6~¯”ÿ:ƒžx§ø;Pîâïù}Oz¶ãò9°»‡¾SBÃòì4Ãf ǰ¥'qS4.˜h½ ò 7áãC ‰w¶wïÐýyv•Gœ•@-Éïú½£º®ÏiS°_yºj¿ÜQ…·¹¨tæ`ÓŸéŠÄ\.•¯ÎSP^Žt0!°iË*à *Ž#t8ÞGÄ< ˜!d‚àòC¦@ Ç»qürÁ9_¾% <ºóoƒ H1ó‰Óc¹q–—›ôM̆z Q;¾òÚGø~‚ŸDL~$|£Ùb Ìä?¢ƒÞò}ò&#ý©§`…jØáœø†Ÿ0}ª{QÕݺPuS æ¹Æ¥K‰zdªâÀ9Ö[¹4FwEª}¬êwbFc1ãíájºã)–B‘}Ùú««ì¥ÎLÂõD^~'brý › n8¦;­À/ªSvV•£d `ŒJÙÀ†73+ËÕ»ç$Ø"©!¶hBš˜Ÿk¨kQ㦱³Ÿ ð3=pG„™úÊŒ˜›Ør:ȧs´}¾‡sîåÒ%¶œ>b|*Xº2 Ê'qL#4ÀßqŸ š;æBÀ­÷n{Ä\}4švß0!}Ds¿p?8 Ýï5‹+ kžŒ(_‹O9úâö³–ˆJB.ڒןKp ‡¹Êášg•jg…±°Tµ[ϵL#„•£ÿÌ|H&°¢1’F80Õ8Ô-L˜*=T½,RàÕ¢0…†#H"@‹ ݺ<‚˜{IÕôðUE) çœ ôÜ KU]Oø¬nºáYÜ Bš_hFM5UE›¶Q…K;cẫµx<æLÅ1aá40Í∠#Š˜> endobj 4665 0 obj << /Type /Annot /Subtype /Link /Rect [111.750000 466.250000 156.750000 473 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 4659 0 obj << /Type /Page /Parent 2 0 R /Contents 4666 0 R /Resources 4668 0 R /Annots 4669 0 R /MediaBox [0 0 595 842] >> endobj 4668 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4669 0 obj [ 4664 0 R 4665 0 R ] endobj 4666 0 obj << /Length 4667 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ!€µ+È!€ 99vœÀ°(>äï‡ÃiÎîüšìšêf·l$’·—ý¨ª®ª®ç»?}ùÇñ_¿ß=}ùÏñ÷çÓ—CqªËâòÏñüïw¯ ›“ûû±nÊ㿾¿>>wÿÿípùàËÓ_º¿ýï¨îþ÷óñoï~ø£û¥ó/üz¨UÝýùKÿg[«îoÅõÏóÏÿ}øëŽ¿g–s›¹ýïï´QEÛœ·±°ô·ÃpLÕÿûû¿Þ]¶Š­´j«£²ÆUkõñ¿ÿ<üÔ-0L_œZ«T]Ùº¸g¡ZŸW*Î+é¶›É4“…ú™¦0¹6&ÞäýÎÙ¡¢L¥ü³s"Ww÷ç ecÀÿ:}„ÉM÷ñ(ç¼sv¨ Èųs"×–*&r_¦0yYÙx“÷;†\<;'r+åøf[F€Ðuöà¯Uoò~çÜ@P 'çÄl]9¡UÖ1€_E‰j#’ÍyçÜ@0 '?5•ûþ¸tÓC¬îÖµª9FUâLÑ X/§ ÝšWÓG˜\›x¢à²sv¨8ªòÌΉ\Ý8fÝ*ü›x²ÀTE<%î²sv¨ Èųs"·ªKÕ§‰ÿ:Ç6­xsû³Ce@.ž¹íðøÕ*ÂÛúeúð·ZEäùýÎÙ¡2 w2ûçYðV.?öŸož?|=¼ûÔ©0«ãןºÍõk^þøÚ¥<~w~6v¿ðõÇãû¢0Ï<~ýùОº—Ò°E7Òö#¿v‡ºo?-ØŒ-.›©ÊÛ%UqªjÕÔåËfЧ~Äž¬¹˜ï^Fš~¤¹þ@©Ë$æÔ1V¥_M¢ôåWOM[ôÇ}™äc?RŸ¼±pa¸%eà:)ûs*mu>ù«‘~ƒ÷F9)<¾Œ(5lnÅyTGtReá®áÞ \ÇŒ9<Û˜Ìðô”cÐg{F3Üu7î£#paOÀ…©«ÇÀÔ…iŽàÙ<ô=>†ýÈÅ—™´éÄÊ YÎ0é²owÑçFžàˆF#ï~ƒ×1x¤„³}Ñ ¸;:7› ÿFCàoÌ÷ápSÛxop6^,Qƒ¡Ó†C”2Rà“‘ÇÄ©ª Ðit9’ç¤ðžzÖÁ'ÅøÁw›rR­÷@”pwçÒH0Sßj1sgXI³Ó²ZäÿÞa,g4'Q¤‰Æ¼<'•I*kYu”ïß¹”œ´l$¾ÏX¶P8 Ôex9/¿5m ¿F2Ö\eDø“䎻ßèkÍu›ƒXWe¿Ÿ—Í`k)ÅV -ŸØŒå±äbã´ÊêΆÍë i¼6Dói´°JVÿª5p÷ë-üø Û?Ä$¶µöS<Ɉ‰wàŽ>ã;q^•òT´æv¶ïál”*}â°{ŒôÅ%Cº”K„¸šŸiìˆS>´8¦H©ÔR)Ö,Çkš1Ä÷;Ào²žÿ{f…üŸä«Šq—æÎÃêÊqŽî9ñ×Y/ò(l> ©ÌDá¢k¦/TU¶ó—8È1ˆ%ÕáXž\iLúê9\(9“|P¤‚«e”›5™ÀÂÇ žjTùÏ«O,Æ1Áz”¬Åâu()¸LÓŽo¯(+ójëj5Ÿ G!¾Zz_Ç¥Uh=MŸÂQæq+bBƒ†½ï€îŽHNJr‰'φ™^€D½C¦ÄóM$Ep[ŠÉŠxçQ*¿_ ^›ÞRÊÐ(Û½9¾ýPÍÅA«Æpž` lž†ß`W²‡3±r@>n¶Œá²0·l&Ûв“b»–^Aޱ‡Vû¢»q°ÛÐÃöÑ̓?ù2Vp«²àc ­nÑì­n$Ï^ýXÖÄÍ–ÙIF®±@y¶´yŽ 6†<Ð ^+;جKoÍ£¼@&FE¼pJ-¿²í^e «¤Û>™á^-Ar7ç@þÇLÎxC‰Š'% $â|8 Ós1%ò†¯bœb:xät—4r·j–1Œß,Šˆ@ —8‘cÞ)a»2ò¦FöÔœ2é¢{XÅ‘Z']xtbI­‘‡ÙÌ:¹£¶ƒK G˜S"b‡Å5Ð2GRðÖŸÁÖI‚uט1‰ÿà É f“%›@e!é,‰Œý{«‡EЉÅQ¥”Ø[Ãà­®…r£â*æÖiæ¯ –ªØöM°Ql„ž½áÔfJÒó’.Qâ—­c„âØÅ77 îä|Xרk>"K!»]¥ÓÕvL¨ ›ˆñ®¢D1Ec'vöv½%ƒhl½šAàëB¬¤($ã„cæ (;‚¡D o\¿L%òå{XÂæ¶Aa¥b·|Ü^Û Â^~‚ÿÓ“w€©û$°oó|ðl¬wÇö` ÉcCð¾¤âþš-¸9j;ŸIÖ ¶¦RkœÆsÛö¶nˆs°ÏŒ8QœZ2ÑKæ¾iÑ7..QÙÓDËyF#WÖ=µŒ]ÔúÔ6£¸‡ÕÜ:ŸÐ®ñ:ø<Ž5„­wí®¹o ÜAGÚpü Ubf°PÀ“bè°âÇCUxo ”o0%bÌAxÖÁTŖ耘†5͈kHGøÔ.œ/èU>ÁÙ0õcŒàóàƒq•ª©F[ ±Óž"O”Ö©)Øg@°¾OýwØIq)8¢Ìoë«PŽƒ±O1Šz\~¸V! ûŸðlù–þ™d©â*18=„PT‡äª’vµ}ÝG_JäMÅ' oÇSµcAÄËÒC)«ÇøñÜ=!´¼ ¨RÂr"n°$$t)‚ˆ¥‰Xßf`ßä©—KÀ©4W€2ˆ'ÁÄji@ù:Þp­ŒéŠ«êñû*QÝÏÈÐf­ó—'Ú8*•˜¤oa™?ö÷Þ£Z<æITEwZ¢l‰Ê˜“ô˜óÕ&E8ìƒ6éì;fq¦QÏ^¬”ß$è\$-“ÕÈòê Y„YõÏyãØ9*Åз5ó˜[C–òœ§¤@°ÖOf¶÷ÀÀ½ÈÆfâ]o¥&¥·°u€¥ÞVtyZµcyêÑI¥¢xt;¨H‘¢îõåûd½§8?¶RŠå'~/nŸr…á’QÈšÏ@ÑRùȇ ¨™f'Øç¿¢Ò\ÌšoE@lþ~÷Üu–4§D/Ïsžp }ÇlªªKÇDñÁ-{„ŒR²Îî¡»˜¾l½vÊÛÊBÌŽq1„Þ/.œ©ßÛà* èK:ìø{­Ð1nIXÀ]ãu†!3ç©0€»NUïÃv(Àòõ>zp¼>¯º9ïå'«¥B ‘Ž…›\º]sIÙÓå©ó vwô0´F· ä$%Ldçø[;’5|¨)>:°öP-OçÎ9õëürøâ¡ì8Wâ¼…ÑØ ÿ45}k­ˆÀ“rYãWߊ32n®…±zëkqÞÂÚk1a””xy“·SÄyQâ~0ˆC‚zÖÙÑHf’½ÖfØž%'5lDMÇëÞ8ŽRõôI•MȳÞ`‹áG ËLÚEÊR™øä±ªž @à»òÇt-Áei¤òæô,ŽóëHÂF€¶5‘¦Ë5OvAC¤7(*œ'Ц/Ç Õ]jlaïÌN@•ĶØÊÜ#q–Ün)úÛ¥ªÛõeðtËcíM‘ªû‚³¥¼)o¯]POO_`Œ-ˆaîÙ‡­€Hi1äéî’ªwûRÿŸ4°ªÍÀÊÃp÷)ÌSž!äñl‰NŠgótöÁçÁ½…ñH;û:—Qv°Øg+Í=k‡V|c+á~´Rê˜~1´ñm àË Ü¯ Žx:®mNÙù»õbX{xÄiŠÛ° îê—¬í³&6wl’ÜŒ_Oó ¥ÀŽÑÌ0Qdë÷)sL-¯=ž%cwóªúoØÉ›ýP0Ëã¾HT).¾µ³,ìHŠeàÄã0Î'+ÀQ7Oý}DâßO‚b€@“8FƬi9,„¼XI¦7n¯&⊠”»Ž c}7жqG^ÃBOžƒûh«´“’™ö# ,[£Œºã$îÖ¥Û©àȵ©odk”ÇêE°ë§ô_Ó,îÇã€ðõ` Úå=6v¼ÁÉLc‰lùKiÓ6åPǰe>®XµäW–tü ÁÏK¹Aø› 8áö²…à¥Ê„K·å2õ=&]ü)¹šUC4CJ®fÍ5&)‘ç›ùvBnƒã.ð7ØÛH¡EáPQ(¶ÔË7zoz$öNcú‡žæ<"’l}LHÉïÚëY7×â²æ„”—ËÞ8!!ª*™ųáx8¨ia>†±»œ(¯˜Išl"Žë¡ØÇ¤Š„¤¼6tI)Aʗʼ;Ó˜·¾i@£‰&NMœ‰t»zÓäD“ÉÛs»íoí#ðËf°`òi ‘Ε½T¥Æd—g ÔÞS€IÎ õwC’uqpáè¶r€,º0Q¤9 òdXT>¤Í|ÜòÜž´|)qç¼ád”:ç Ê!›‘DÚ §#±B£¶pËD³¤Š9‘sT"—ÇÞ<$ÔSúŠI)†Oɹ¡”ÉߪŽýNSŽùIPQе¶Ü§ i¥¶U‰)ÞüCJE'æí_ÈÛ|$À)9IwÅš5%–ÒaŒ÷š¨ˆ%K ‘ËÈšÄlH˜°, @éj[ë]98Š÷"e$õŒA—£½)U)Ú‡¶¥Lÿ©•¾=îœK:lvŒb tÀ–ÐùbñÞp¨2t¾XŠ#;­p±6ìÇŽ.î ÷Vâ  7w`¡KÏbÌœŠø<ØÙG ³ÁaØåŠÃ†(ŽH[“‚ÏKè$JÓÓ0€!UÚ 3D ¡'˜®)¡4˜‹y’4{#…«`Xç\Ö”w×›[¡-˜!@\´bÐg¢@vÑ D'Hªäœf(†h¢a,i)­åò¹eDFdDFdä>)±½}Ò³7,C <Ú\¯çêšþ(¯gy=¿—×sQy=§+;ס$À³¥*U ¯gy='Ýu¯çæž²2"#2"#2²FJÈë™[[ðxIp ‚^ä‘/›cÁózàÅOª:‰ jð»" «PS Å‹Ä*”7ÅŠUH¬Bütð†¬B‰JùŠUH¬BIw…U¨Ñ÷”“‘‘‘U/± ‰U( ,x^yX7ìµyX7ĺñ^¬=Dź‘ucûrÃb©KEÒ]ça©¨ìâ¹eDFdDFÞÞˆXÄê;$…QO,JJý«1‹‘‘y{#¢u"k?¢e€…ܽ>m!UEWQ’d:‹×ÇÏ7væõñDzBÚñ¼§Ä³"žïÈÛò¬´Z-ž[FdDFd$Έ¼žÅ{‘;¶}=/´¾ië!ÃÂtž4”†P,ÍËàÂí;#·7to© ¶cûê?¿}'kJý6«ø„†Z¸g2s£€¾`ð€¤V¦ë»ÜñvŸ£l‰¥ïâ„ôy\D`LQR5#Y²6–A#×Éc½Ü´©æíJ½yÛhÒ®19SÚFzê9õ9¨É=Û)g“N©”~¨“Û9þAÂÞz¶£äåÔævPñWx_«Ò‹½§®#†¯&Ø ºç1»²¥âÛËœí}!™H‰æžÚU"%¼ô"RB¤„©*1`Ìaž–¨“ˆÈbt/íd ÞœÇ7”Ù˜…†¡ŠrV¢aˆ†±G #¯ÉYHT{ZôÑ#ÈzD’RßSI$¥—’DRФL()·¯p(òPä!YÊ»zeÅ îßã·Nø{uƒÏK¿°"Þ´™SŒ2§Bƒ+WÝ¡¸Àg.Àð‚¡z& ï}Òª˜Pv51ÏîÜùŠâ.;˜ ¿|Fëø÷÷öÉ¥ià`7û²¥nV¹£OèÈYã¨Ë™c(<üÆÅ"ª £×/dK%¸óß»;ÿˆÖrL'ˆ0Ù`°¼/?½Ä«c3„‹áí1—¶> endobj 4678 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 737 99.7500000 743.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_type_wrapper_classes >> endobj 4679 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 737 147 743.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class >> endobj 4680 0 obj << /Type /Annot /Subtype /Link /Rect [330 702.500000 493.500000 709.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 4670 0 obj << /Type /Page /Parent 2 0 R /Contents 4681 0 R /Resources 4683 0 R /Annots 4684 0 R /MediaBox [0 0 595 842] >> endobj 4683 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4684 0 obj [ 4677 0 R 4678 0 R 4679 0 R 4680 0 R ] endobj 4681 0 obj << /Length 4682 0 R /Filter /FlateDecode >> stream xœí]IÏä8r½¿"Ïúk‘Ô º6>ht>>=U—çà¿ïL-™ÅG‰OAJ™%7<•E•ÈP06ÆÆŸÿù·ÿ¼ü÷ß/?üí.ô~üí-{¯Š¬û¿Ëí¿ŸÆº~ï_ªº¸üñííûåûÛ¯o¿^ÿ÷û[÷Âoÿõúëÿ.úò/×ÿÿëåßÿã:ø§þÝþÁ··JU×?¿¶6•ºþÊîÞÆÿòöoÿpùÛmÆa¹˜éßÒFgescaéïoÃgªö¿¿ÿñ··Ÿ;„­’—¹2õEå&¿¨&×—ÿý¯·?_¦ÏÞ›\©ªÌ«lËB•¾®dš¦¼(Ý\Ñ®êÙBí2Ó+ùÉs­L´É;Èű¢L©ü³ nnž—U‡ ¢Š€þûì1ö¶Ðñö¶ƒ\)ýÖâɯ/ª¦Ìª:‡¿ÇKë+OÍU’u?úe¯’+¿ŽÚÃ_no|^½ ¹?ÖW•.òæºü=]ÿ.‡MQ ´à˜¢ž.ë¨ð¹g²¡ã±Ó­ŽV bÇÚ„oíÀ2^º…g;¸iŸÔãûÊl´Oãñ›ÞSã_w€¯|SmÜ(}Ñ•rƒuåÆ)0ó5‚NOÿi-0ö¢·¿ÇFÙ°Qߺ_ËX/üØå-øQ™rÌþm:®ZR®ìÚÈ5ÕV YT5^¤EO Æè—$HHkÕï—v€QÖö|› ¸5^x¶·RW›ÕŒEÀÖÀdcñ\;°U>]‡¦ðÔ¹{y<Þ‹†öG44—¿¯ÖJ(q´X»Ð‹¢P¼´`Ì6TŠßZüLÜÄ;¯ïp©) ›%RKGãiÇxiv ¢`3éxQ3Ý!=^XnÜO…Ï2jZ0Ð6JñX]¸•]”;üz@^<ÀpOµ]"5¥¬¦²€™”#èôôﱑÖc/Ú ªÈ(6ªSËX/üØe)îãg2^ZÝÔ6@®©äÓ˜ªÆ‹´èiÁý*Ç ÒDõû¥`ÄF”µ=S¡åBÔxáÙÞJq\SÛ¬V[l <@®-žk6Ê'“5Sx®Îå=ãhè~ÄBÓdùûj­„G‹µ ( ÅKÆlC¥ø­ÅÏtÀM¼Óñú—šºU"ut4šv‚—Û®^l'j¬Ò£…# Ãû‰ðYFMÚF!3Êí.1jð1ÝÝ!¼òLµ]"ÝçµÀÒ–³Ä10uïLþiZ;½ý=6ʆêÅÔ2–Æ ?vYˆû&ø™Œ[>¦a ¶rM% ŸÆT5^D“ñ/˹#FHk¥µkÕv 6¢¬í™ -¢Æ ÏöVŠã´±YÍò1Ù-gJ7°U>å£sðxò<·–ŸŒàœÎ[yîX­TâØ±6£—HËxÑÆµ“RŒ¦Íanç’5^ßáRS@7‹¢|‚!5ÅK»ðèׄ´iÆ‹¡üNÉuÆË;\j èV¿@cû&xiv ôÇóí¤ãEí-, 7î¿MÆ—QÓùÀ6Jñؤ¤c<>$ Ü= WU8§Ú.‘ÊÚ VÙXÀÌF±îéLñ‘V6ŽE[AeÃFõbjKã…»,Å}cüLÆk‹¢ûÒÈ5•€|*k7\-zZ0F¿&‰T‚„´QeãZµ“[‘emÏTh¹5^x¶·i­îÃ[ÿݨ»ýîyñÃïo?Q¹ºzåå÷?_ÏíšÝ¿_!Åå§[±m¡/¿ÿéòY¦òºüþ×·æ½ÔÅâùä|r>9Ÿ¬}’}O>ÀÙjøÎ/ágû Ÿ| ‡@—¸Žê"oŒ; Îf0ÔMûäóïW¥]Vj ýˆ¸[âÊÃM \>ñ|¦1<æZLIð{<ÅëhüŽ,Fì°¸ŽÂˆù CÍPHEà ó”5ø‰Üøé)¨YN=åÃÎáõTs_õ“Ôª X2ÏÚ%u^ K¬]•E‹[XÖïu“MŸdªÍ{‘—u5yÒ1Vmïdþž›®3–­_ÿ´gJǬJCHfëm +á2|’£é=@côáu¾ ‚äÙQ ¬þT'”y7ºV×G'¾ÉÁ,ütæÍ›Bá$½ÙµæŸzÖ븿´jºw”Ðô˜íâA¾›þ¥O<°1tÎìàg„7]Ü9#k†7fìŠe œÄCnXTb®ù]·ÔÚR.üg„¬í &LzŒPb²{¶^ê+ü] éÙò #”‘t”Šz"£C}‚`éß}¹ÊÞËJM¤rlÝÿDˆe„eˆØYOdQFÇ–…Ár˜°²ôGdYxfÃO–rD]ÖöA ë2€…–Ib­¿Æº5xó°)ùšÑÃî„f<´Áp"Ë ~„ {xsqZÜÿÐõLØÊ³±ÀR³üµNÒ©õ’Né²²D>”SÛù‹-hÔáÌŠ¥wÿšã¿Ec‹Å6 îÒfpç㑯o¿EK›{ƒaº¹¹ÙÖïã¨%¶‰‡(‰…•$q«c/õ’Õ°LyÛ}_—Å«ñÀ#ISÙ[ü<,-®Gä†Ã¨TX”1ŠwWìæçƒ5S¡Œ¥švÜy¢VPzåš8¥„ H¸<&Þ^á *(jxØÃF £È©`³ƒ"‘jÂݾ‰Ÿ:ŠâÉŸ;pÐÎÃqÌÙ€ðô‰œS^"j5•©ÂRk»¥5  ˜xÛzùâÁc?ãO&èqÖ0ö&vÖÊñ=’%0Ǩõ>-V²à&2ªÞ@sç°ÄA>U²“lúY”³]L½UÎ(@4\,»‹”1ÌÍœ/$hýUå#£­æŽ! ,>Hx—"çÊ2¾>Æ-€Ãn˜ŠG0HXz1»/j-QR[KØz&‚ù”£_´¦„)HPˆ¨ùʼ¶4Sª"­°¡±ÞßD%å3\À„˜e)ZTF¤ñì§rñ:q#.¯jÃÄ1ð^–ü¢TrÉ–u{4| ÿ{ÌÓ›š)1ဤhüfžç!Z,DÁg½Æ2C<Ô׺¿Iàç2U8­œ…°üIqz¦³—‡ÅDýHûŸ–Bx Uˆ^4(LiŽ$æ`ÌTg¥xÉ@í S—F#E©<ÌÈCLT²™õ³Ï` ƒT7¯ VgTÌù™Ê ~¼êYÑP:E9„ÏžrÙ-­QYÖFoP–¢Yo!©”¢V.e§’¹Ì:øp!jÀ‡ø2ÑÀ4ža”A€‘M–i©èI5$ ðý‹§öWVÇ­¼Šé`j…*Ï“üˤÑJ²(uf ¼qEG=ɪθiÙÒgØ#jy“%"ˆ&›z”¨ãQÖ| È9 ›{ˆí>@3Å£L`EÅQ9DU'®%xÎ(Øô°‹}4b*•ÒØZ³îR¤#nÓý¼.,PsCAÌÂÏÜÞ d¾ð€ƒ‘løWVȪý¨ÜpY¹ŸªÒ‡ñÔŠÕ3Ù #‘ºWÙ2SuL1N`r=‘ÀÎpE%Ž¥0ª4r ÏnþäDý…{t0çÌ©OU‡ðÃEÝ–Þ]îxë­T¯††—:×ã‘]:^Þ`pšª œbÍpƒ²°¥KZ>× )1Ycõì!xöÜAøÀX²ážTÝ~ ¼€8ÓM¸gy@ÞhK§PáÊ€»jR¥É»2€Ø˜%7'2áÛ¢âòZ"׌¬^§n =2.ÆÔõ'2ÈgNY‰ÒG“e~¿I}Ì+³jûµ»1–ìÎ.ÂQÆô½¤bõ­8SåˆP‘r‰0R2±Q3sZ-/ýáÜ{É|^¹’ëRù¼¨\$&ß'ÕæôA>¨ô"¶*‘×( ”*õgäLeÀþW` zR¢úÅjKï0î)ª]s ‚¨£®­ÚÿN’õftª|Ñ“ö! Ÿý3‘#ëÞdwtЦ@Ëö£ñ¨¢T—ŸÄt€|Ôø.²¢´ußS 2ªž…ɽ“Èg)We´°hë W‰&àO¾R¦±½0 ¿§]W®}ƒžhø$ûŸàl |â¯ó ÎVÆ–MW:,¬-‰“¸N6¾Ee‘‹tÉÁ N8Oà3Ì«ETŠtGÊ?'FUG÷7@&6jƒf ëV艆ï`!Õ ד=1>9…î²Ðu}©FOrXþ• 6 ‚içÐÿd*¶—žÅUÑ.pãqEba,HŸ Õ}òÝÕqm™d1 Yœ0‘ç(¼¿M\ ÕÙl‡OI%Æ>ºwÒ¯âYÒ?pÀ8kbj/=ã¸Ý»;Ô…»nˆñžaÓaÓ¸:éz0>uR4ùSÍÍçžÈ¾†Rýè$â:˜ÂïIŒƒ˜'’þŽâÑ™J,ůFf\/«’Ö4\ªú ã%øÎz)ôNß<³ÐàÝç5{Ò“GØ:0K¢·ïëôjÊ¥Ú }‹ ò]·å>sVTùðhÍlŸ!lø{°â‡°õ¬„Q ™¼ƒÀ•*€sUà:½¼ÇÆO°ù…Ï bW CÐKÜ=—ó‡»èI5€4Ž©r‡ñ=p¥¹÷þJ•ó|æîž¹»¯—»‹³yˆòFê¶^¦ÛÔY™Îe&ãRÈSËT¥¥f˜ò%¦Èœj%‘ø+œ9X“¨½†L;ÂéìñëI\’ÇÜ’DÕ®%%T¨ q7ŽÞ¿B:ržÐ :Ùµr QèȘwnª²ºë®þžøy«‘Ä'ƘçäÌþêþðà:V`¯Ê’!ä;ÁžÏz–ðlwë|¶,º¥Ô¡½ÊÔ@ßòYËÁvº*ü™w3Öý”T sïC7V…3ÕAõäH`Ø túN ç´pÂ-œê©ý!Ý¥v@)ôýÛ3ªôœÞíî̲’ˆ’’cb‡TW]¦³Ó* Íè%tTOÙþ†ŒjÚýR‚yHÚâÿS½Ÿê=z¯Õ°äsªwBnQ7„ãƒÀR‰h«¡¾‡‰_Ìj`òòX=)¼m˜Ž%ödÓò¨u˜[5˜ÌGÑ~-â›ý….A0—”LaOPEûŒE#‘ ½[è960!ÂN¯£„OwØi/'¶—ï¶–ÞbÐP1 ÆüŽq›p‚ÓH>TÜ¿Øi$• b.[¿u2›åV× —ø­Ñ¡Ž?Ýo™„6¢>…²Ù˜åËÓúîÑÙÃV E=ÉÔ6ÿŸäi@¾€Ù7´¨ë°ÏúÇ mNLu/ UmMÂNÖ„€IDg£§eu*¢#+¢”÷ü*·TUs!Z=íÙÕ-Z¨{טV0˜$É€¹Ï¾&™ÊÊ\‡SÊÛ>S«ÂF’ž5^ìÞ ›§=)¼U7íì©ÐõD‡Cí¹µÆ!À…7jx°gÃPçbýïVÐQô dÛc\+Ì›øظ×ÃM?×þÐü“ªQ4ƨç®&LoPç0-±=ÜHðÂ)•¯ßƒå±CUO-‘ÒØ>QÄíbç“óÉùä|²¬¨s(qåe•`Ý&zª=mlÌ.0'Ï ~)Æ›‚óå£ë mœ¦89p „§â´Ê#Plqc€ŸJ‰'žÁ'˜þ±\†;ì¡ |ó2sšg|^˜ÆO³ ŒÛ(Óì)›°¹ý9\ˆFC',¦Þ„»B•jqï=n\&¬/êf÷„-T½ p‚Æ"”}†ŽÅ¦IŒEê ðaü2ĤæxÂ*XâiXF愞ð¤·2zœ ¬­s"˜êI´&’ÀeÓºð÷`{Á$ ØkUoáMÆæÁAWøŽÇ® ôžg6láïô¢™²…DtOxY´PGVra¼œ‚q€¥~B”2Å#Ôi"¡í Mµüuû?yJÛJÂO°ÂœçEÓ`=s:a;hHGNO:@Â#¶bl]zäa{{t(a2ÉuJÄtÀì©èÉ„Iæ,°„…œå91àu]Bèꤖ|ñq/¦‘=gO,7°÷Ÿ%ŠƒS_U$¦$¹Ò_×äO©Q÷[ì O•|kÊÁ¹€¯•€n F\±Ádìàœg20)<ø"sS¸ñVŠdlÝõ5¶<ú'1;KcAåv”È(- ë#Ãwa‚wGh2›\¨Ä›ôý󌱅7•UC¤DQéaLBÌúޤêœîf M„¯æ èŸGd?1·Éß}E¬ãiòWö³e’7sR‰¬LïyYÍÙâõ©Z¼n¼É ø]›ÎÖ¦²µ=&p"Q_ RÏ„AÚ]†06seUŸEຠe±†9cüõF°Kžù¹©p7§l­ßNòF%tøäúLܽs&îž}h½¸Þ¿-N^ö°wߟø.­ÞiœWCfI¿p8SùT…mæ2Y6æn™W¿‹å<¤ú`;©²;pŒ‡b †)ñ;øœAœ’˜K tc¨”¥‰æDI8¾B¦Z,0Ò‘¹uoøŒÛ0çç~æ3<"vWMÏà+ ^&˜ÔÌ:©û¼ã^üÇÄWfþ&êb.F5ñJ8f›„¼YRgûG±¶ð+&="uˆ’Ü|(•.ÒeßèKÔgb$/BØ×{fÈ3Í5%Z ŠLòT=Õw]3¤šK^_îʆò…'X¥d°1 D‘"ˆ2NÇ=ñ?iƒ¿€Mí¡Hõ˜"$„/ÛÎÕCø˜ÁÖ_pë!7‰grñîú¢g¦pÙ ð”Ó%UöÞÙ#$—èIÿEÅ»‰™Aï`ú@¢ëüNÇ™ìC¯HOú_Ð:È™ýN/ÆOú~‘Aï`z!¬Ê|O> /UŸ!>ÁwJ·žu]8€ë`ì(¼ b•Y –ZQå3’ˆLõÔæ‚ßsX>%ó&k”fŸ®u’¿˜Ü²ÝC'”7ÓCÜzOSàÛn/è©öØE‡ÏLx6¾:í93)¢†Y¥£dã”Û… :¦ÉX8t)ãõ9Kž¢ó0áû‰ìjݯ1§,½ˆ%™²÷t©­À¤+¦ízú Ý‹˜Î·û'ç2]kŽÜ5ó=îÊ|KGç¤å'í=¡fÒý™ 0ñÎár¢?®}€<_J´N`z¤z:aé€ûü¼fY¦îxôœ²¼€ô‚»2â z©®™æ@OwN¢¶§³îUƒ{c=ï=Ì,Q q­ö¡¿'aç·²~–ÞhU–üú᪈zýpô\áó¡EvnPžÑÔ½¸¥_GLõ?ž‹‹*žZu¦Ç´>­[x{e3‰Ðs+öµ#ê²BK™É®f¥¥Ôç3b¥ÅCƒâu)6ëSìŽÌ"AT»0Õ"T¨C¶Ô=UÚ©ˆî=n,Vö cµñäµ^-·Ô •bÃØâ‰nä¥ò¨Dlïõ‘Tê‹%ÊÔ^$€zÀT<»gOÄ àoèq âºg á'ÌŽ´GW(\Y h5Æá6"ÂTßxü±4W8²ëï"‘B–¬5ÕþÆÓ–HfKìU¦˜2 ¬6–ô|²8÷þ‘iÜzÔ“ƒ%÷DÚ1 "Ÿ I]éÉ"{²M™™›’$‚HTAz€+*_=-fDèeÚ=gQù«Ù“{‡²=ÅòÌ]kLýÔ‹bìfIzïÆ eéij«¯W]}Ÿ3¿G6HÆØf¢j”C¶ Ò8ðô3þbJŠ˜†’‹beµ5õH”=ûf6•„V‹ÖŽÛ£‰9Da$«Ûo+J)¥íÓ=ïìˆéä¿~„Mœ"ÔäoÉæ˜f؉ÃnH–Ù™OtSZä·ÁÉ“OŒ.Ü|wÑÆZôE}KƒøÞÕ&»cžCR¥‹ÇÎ:†ØFz32o›ÂÚOí1®,Źñ™¾Êí/8uã©ñÏ üÔwLÕhŠÚÍ%1×,µ-Þ_C1¾\rÇéW=ýª‘ü:%ƒîUvn5øu€«—ø“qh¸„ÀóÎ/ð¾3$3Ìòî·ÌÎÛ·} _Ç1f¿ÇCN‚¡)pþ®•%U> /UŸ!>ÁwJ·žû°4¬: ï–àbI-ýÊÂâ¿û-µsìvø(‡M\óÕ÷Vó]„4±ˆÃÇÐú~ÑÅY¾¿¿z‘cã"î¥R”=\ÃÜÝ…éß)‘ª8ž‘"÷ áæšL&/‘¹œ’ÊX´ÑE5e=þ.jõe逶#²…à-­}®®)çÁÿ<ø¯±¸ö/t½³÷‰K¹1 f(óáÉ$Q+*¶U`¢¢Aá¢`Ù›]RµM‘0†©ÓËñí¾Uå܉¬3æNÍyeZ…Ý…TfðÚ,8ŨÑ`ÊrÃŒÊ\w)Ñ‚©Ò¢ 5˜ *g'P±šZäÌÍ‹Žòò{º¿rÏq÷[Z_nLvfuoV»öF<>xÀ8„Îw]A›».pô$‹.æz´W+”Êîl¦Å22"âôNËw¤êσ#g‚ïíÙOU{µîF-']ÿ»|¿²Œ—£~]ú+X®v&&]÷#S7áyÑC;ó Jâ>[9pÛé=×½Œvh‰¾¹~/gW+HEŸÐ:fÉ~rÁö¥ÿRtM¦ˆÜ&ELòåü{RÄ…?˜QŸ¡ðlðÞ2UAŸ^=È–%¸Ûï+Ä䟡ð)ÂI“ &|Àw7>18ÃA¸ß§YàÝÃëÀïQK')Ê‚ôÓKHeÕëx8s‰Ãø\v[0ò1Ô Ã„A‰øŽ‡˜ zÿ¾¤þx¶æŸzöv&!ýy¦ŸQæl`éÝMR±ÊÌ{¯QWŠG(êz=ØÛKvÅå×·ÿz²Ô endstream endobj 4682 0 obj 7694 endobj 4686 0 obj [240 /XYZ 37.5000000 209.750000 0] endobj 4687 0 obj [240 /XYZ 37.5000000 209.750000 0] endobj 4688 0 obj [240 /XYZ 38.2500000 644 0] endobj 4689 0 obj [240 /XYZ 38.2500000 644 0] endobj 4690 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 651.500000 151.500000 658.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass_pragmas >> endobj 4691 0 obj << /Type /Annot /Subtype /Link /Rect [373.500000 622.250000 407.250000 629 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://java.sun.com/docs/books/jni/html/stubs.html) >> >> endobj 4685 0 obj << /Type /Page /Parent 2 0 R /Contents 4692 0 R /Resources 4694 0 R /Annots 4695 0 R /MediaBox [0 0 595 842] >> endobj 4694 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4695 0 obj [ 4690 0 R 4691 0 R ] endobj 4692 0 obj << /Length 4693 0 R /Filter /FlateDecode >> stream xœí]I¯ã¸¾¿_ás€y-.Ú€ @¯rÐèräÌd ú Ò™Cþ~l-¶D飤OEJöS™gKYª½ŠÅâ›?ùÇé_¿ŸÞ¼ÿòŸÓOÍß÷_ž’çŸÿûý©~àËû¿ž?ýï¤O9ÿÿ×Ó?_ü¹ùÑå/O¹ÊÏ¿UË\?%׿—ëÿ~úÛN¿]Fl§k€éÿA“ØäÆÄÔߟÚ×TÕ¿ßúíéM€e³Ø,KŠä¤¬±'UZ}úï?Ÿ~9OÐyT•Y’~îN®/ãçW¤¾4Î8°çÿ^?5?èýö›ûðo¿t Q¹Nmyž~îCr(-ûeI ÷{ç÷ßÀ8.lë±”ù&ë\ˆ²–D/Õ§),õ网wÑÔuÈ -¯þö¤Æ®´€Uxé´’Xú¤T¥:oÞ™_¿€¤ë¿aðÓ›ºêüW.â_ª+Kñ1NÂ5ˆQ‰º þÒûÚ›ÃêÝȰTÊu¸j8§3f#—9G.TP0 ƉC}›TÝ/ÝÓ(ñNHœ”îªãÎuÓðjûá ¶î@9>Ðj½£Í8PÚöa|7]Øtÿ{`„U°¸s^Rh|5Dª5Ò†z³^É+$m=Ôt¯›>#7ß3š±Ö«¢3u&©PsâöÁôÀäŸHj(¥‡PÇRŸ4=%5DRoV—¨B2¦SG¶R‡kÝ WpÓ¾UßW*#›vÖÛfý¹ß»0öÇ †¨ w®‹R’Æ‹C„ZùLa¤šu@>!¹ªPÑû>ΧÎõ¬…Jõ \«tl7ª‡’ˬ·}VärÊèáìâØG}OÉ ‘RÍŠˆ&$;6wd'ï¡bxá nÞ&;Œþ+™´è“ãsãëµ W!¨7w;×EÙHãÃA~­\–b¤‚b@F!yªPÓû>®lœëY •êA¹VÙTÌÓ´‡’ˬ#q_Í/¤8”Ñ·Yű0Žòž’™FŠÍ=ÄëCWZ¥òÌæÉš,d®/iHž‡Ðåy¤t˜…¬þ `p[y§¯ ÇŠ2™ò.IÜ´Å~a²(J77EޏäâXi‰‹G$nnË¢FP™@ÿuô´MËp‚[C.”†´xpIÊæ™iГ‡@Ðmøƒ—&ààäâXii;ýó’Q0(õ°¨øÝó໯Oo>•'•¾þr†¬š°þóõì[¤§.ˈe~úúóéI¢ÔŸN_=¿Í³Ñ…Òiõ»êN’UwŠç¢LΖ'¹ÝQÞIࢺcžS›y÷N¢Ñ3‰©ïÌDáA gÁY$)‚Q×ÛgkêEíÏx󱺓¶@Þøã×3+†á"¸l”|¨q¨ÚWL³ä=ÂåƒRsÖ«ãásâÕá<‘äÒ€EwŒrA3 œØCtÈ\Ò¾-¨Ö® BÔéRS»¶+ÛpvH:×úXi}èw‘L)fËÈÝj>¹ÜßQ½›ýÓܸQË&Æl’^=VÒ„-eLÚ€^Œ©6XLðhPãW÷7CRèx`ÃÖŽ0Ú¯ÎòÔZ©.­uï6-Íî°„°z´ãLba*Ûº™f*­c=l˜ ‡GŠáAtäA(fAl/Âñq“î÷Ì#ê:í@„7‹ÄQCÃÁ£œ$,˜ˆ4ɤv½½ ¥+ PÆz  E}eìæây„'Œ`îç&>®žG–Ms4ÃLØ„Ÿ!‚½ICÁ/Õ=0·l„KÄÿ˜DtuDiº¯ëxŽ|‡ÑYuƒÍ¶¯…fæáy}óŧÏ>ÎrQQ¸òxMè5Ù:JÓ¦%³©µFùœg©ãÉ’Gº„¶UŒ Ú_r‰YÐ÷4bÁ›1‚KV‚kµ} ‡U4“@¸K?ãPË\ ~\OäfÌ£%9æ/öÚR–IY•ã”×1ˆ.l;kkœ*¸“!«Üiâ–±;ïàhp ŸI>ÁÑ2øLI@m–¿OÃ&cw4¼S¸Æ°a>Â;o ìÀÑ0Ô¶ŒÇË&1ÊË¢°aÉPjü †óåkãÿ‡áD)çÁ5|Ï<;ø1 51ó¦É"øúÑt•ÁúsÆÁ!w­)âXÊ[+–³ãÎqç¸sÇw„# Q¿•ò0Dã©G³»À(ãÕ{¢h5Wуçó.¢aÕƒJæK¶Ã‹ Â}ÙR‘w<¶6w¼ƒu,¤°‡+ ©H–ÉÝ`c¢lFoÈBå Ó‡±Ž˜« FÁ: ÓÔ£¹°ÿÄh;ìU0ö™—à8º&/[ûúAjÖ‰ºKÿùæE›õÁä9ËU¿< ¯^ÍÚÕ…P c¨y¯¦æ¿ZnœW‹U±})S)ÏtL`ª ìXl92õOÇjßBüídQù*Ä5§«!§Ÿ¶âתóÛ¥ça–w/|{úHR.õEe×U=ÅL|:ø{y2ºt»[i6sv®D5ì°ž)D]ú"-¤RrÑ<žízÄV+ÊF0Þ˜z3fÖê¸ÖeA…˜(3-ØyÉX_OaØ}>¶£Š9’ÅI•ã6¤Ök¹íOyv$kg«#IºÓP(}Ö®‡–ϨOð™=cJôLƒí‘;æíòg0Z_}œÒô岿ÅüÙ èý=c M¼·¶FÆÞ4ƒT€(Œkx'4UbÙ ‰X)UzÀ,ƒXi¾Ox=£¦<• o]|Áþó­k8Ezà5Äñ\;ª¼Ýå2ß¶ÀóƘÅtÂ>Ë|oòac5½`öËŠº…ÂìwFš63iš‡f܉Ð(q Òö*–Ÿ(}VÉkœgb|{Ù=x3ƇåèÒº0êˆì%˜yI?:fûØ‚ ˆv™!”C´€?D)­ð6YÝ(µ«ü©¾¸¢©«½ˆðtjø‚½ y¦I «³ŸÓ½²En¸‚Á¡)¡Ò£íümËâ‘ff!á9‘ò 2 {Ü}LÜ#KÚ–œw–d´™Ùe?|]ì&íh„4ܵÕÌ­ðÎp×îÔ‚®ü+zþ+Ûg–Õ¤×íÇ¸Ø Ay¶Á’O\êä)E†eKžb+ ± Š)©2) —Êâr¯]g×-¾Ô†¦¤RØ0[!™Ib[#SÉô1Û‚©íXΘÒE\^‹!À£1Í Þ±°,™á±„;[µ‘’g¬ûÙdŠm…‹¡àóKGm¾"0ºgbˆ­,žÍ~XGU?eÓÔ:ôSÖ*'¦Ã­ä`S…½û¾ùmËM,kíÁ—žf*xfŠh¸Ëð cû¯ÀÓ–ˆ¦ñ†ÿSb…I3-J§eăù´Q½ÃrÍÚkLï°¸ÕhÞ!—µÅr´ˆfZ-1ó0+òL¥Îebm…=°û2EÆcñÜa2HLNš&†Ž1µt‘­ÉºÆÔÒe²&ÛpŸõbØÿðä,™V_Ø7"l˜G¯ŠêÈ;µT¦­öauJMc>R»dì‹xâ׋4²çØì#ï;®Ì“†Êï¤:5×*Luêácxåë Â2lŸ±¡và÷a¢›H;‡<ë·ÌºÒÎ}@mÂxz‡ÈIúár™®húöðôv{4;åÙ[ö`;ƒcÙ]Š«bÁ1‚ÑöNvnäºx};7bU7íÝ?5IôºüXÖ kÂÃ×ôU+2«;®/”µTŒM¾ß•>£×¬ŸÅ´a&3â³úOGÈ­jKH¨ã`$QÛü|°uìqÜÔ‚3_<ÄÀgˆ`„Úù%£NZÁgq'v3GR'ÔàyˆSÔ„O—=³ÓÃ2Ì!µ d"ÒíAŽ÷\Äø=«!æŸtËzem3hÏ1\ß(=h-{ÈÃ^sëàЦPøˆSãL-Sû;§r(ÌÃð=&‘1b¶˜:ìr{ Åøf lØy’p‘(ªoŽüh–pëÀCB©-ŠÚƒ2s½èçWFòÛ˜SENWôËY.±ˆ„qL0€ÅcÁ9½ûÃR¬#O=Ü yÇ Ì¹CIÔJãg¨3ÄňœJ˜™«uwõfˆ~<EæùvsgI/ÐÁ ¨Ê´CxÏáÔD>eIxNœ,U ´ 3<Ž1NX¨GB1ÑÅD›'¡)c‹ F Û‚… ã;m꟎D›žœÓÖ1åŒep ˜ ]‚Ñ–¸K¢7*<#²öžÈ€XÍó¼ÏÀ†ÄZaT¬È 1Æ…›}ð¨Z¬PLh“¡r”]‚Au,3 ç`É“¯b&hp8ˆG  ?kidˆ@ù©›³Aô\døpQiãXËÍÓÛ¯0`%¬4%îØ¨ìym;i"Ýà§Ì:)ÃT&´t·žpšO‚ÚŽ¹RH)æÁ nPË·Ô0ø£|ËÈ!\ÓU¶çÔŽ»¾ÅìÞ”¦Ótôô¿Üü´4½óîXiÖvxŒÕ%\㞤²ò(Ê/±RùË£h§Û‡ÓI¤©€0•(eúÚ,õtõ§RíLz~ÌoúD<ó>SB_Ë p'ÁÔŒ¬ì³VŽÚ²Ä wÑ´`ÌÚG:}·j ÇUL l8°ƒÏPØÏx`S¡½Ö&©˜]툪Ѯ’ç,W½ Á㣊ìmSL¾Ë˜©! Û*‚Ê0áøÏ#±"ÃzØY*'8f²ð6¬Gyi´ÚWÛ7i3ÐÕó8@ÐmS¸±7všŠàØ(W¿‚]©6×î[ÏOæP6ß-ºÙÌÈjjl¦ëh¬m÷ÌJŒ„¦êN˜¿";K™¼ð VŸY([°¡ ¾¨pÏíÛKòD½)S¬·ý®õ íZ©víèÒöϵmiª²Òç¤4ý¬I$C«hh‡Ñs˜sr©3hEWË™½À˜< Ì$³-HæÈ¿ýxt²ÍÈdGcÖú±¶$ô1•ÛqóV…K“_H U–މ ºooY8qIÈ#³%xEûÛP§ôˆ¤ê£o‚~½µÅ÷ŠË”‰1ÕZ¢õÍ>¥Û[ëœÝXÈÇ^€,Ìê+“˜ ꣶ´‰e‘:6qûu·ô& Ûck{×WöäŠüƒ¸#ð6!Ñ&¯'Ü]i ãpï`I–»¦’7ÒxÖ¬qêÍÊx)¢xlù–œ°¡D.uI$»<‹,{bX?²")ª.V-ÏÉöeö…ˆvõÛÁÎAYŠqîölÚŽLG¨å•£FhŽÓ:¥‚žC›9¦ö8ªeLIEìæ–—Y_ÖÇöÁàMó¸sn€;EêNä™G¬Eð4æ •ö}’EûŒ n~€©)졽ØÁ30bì$…vÝÁ*b×·"5»Á•gÌ¥Xsà]wêÝS+×w@­w»¥£;.wOÇRÝ5l™sб¦c©®³bžƒg"7XfWGLdó%‡;Îéùßéûùý½èù<õƒø+F»UñD]†ӭHRÁØ &g>âˆ×X×Ã΄ðô,lØF?7aKGø ì> yÌT8:Û§æMQä„“_öRUÍ«^°‰[0“âØyä5 >Ód Ô¢WÏolË2Üåóâò0¶O—³f̶Åw}½;¤k£çGã[ã6œ˜zxø>jj™Cг ÿ4ÑúgŽèx$sŠ —ɹ,Y0ò1ÔŒÀŒA©øŒ‡™ ‹ig€ÔXÌ9?õÐv !ÿy†pæàÂÔ³«´bž˜çÆ¢ÎTØBv2“nÃçÓç§ÿ®ípe endstream endobj 4693 0 obj 5324 endobj 4697 0 obj [241 /XYZ 37.5000000 223.250000 0] endobj 4698 0 obj [241 /XYZ 37.5000000 223.250000 0] endobj 4699 0 obj << /Type /Annot /Subtype /Link /Rect [420 521.750000 459.750000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 4700 0 obj << /Type /Annot /Subtype /Link /Rect [304.500000 239 457.500000 245.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 4701 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 231.500000 544.500000 245.750000 ] /Border [0 0 0] /Dest /#9c#cf#9d#92#2b#92#c0#24#15#08#bc#83#ff#8c#e9v#60#a1#01#b0 >> endobj 4696 0 obj << /Type /Page /Parent 2 0 R /Contents 4702 0 R /Resources 4704 0 R /Annots 4705 0 R /MediaBox [0 0 595 842] >> endobj 4704 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4705 0 obj [ 4699 0 R 4700 0 R 4701 0 R ] endobj 4702 0 obj << /Length 4703 0 R /Filter /FlateDecode >> stream xœí]K¯ã¶ÞûWx] ñ¡PHîÌè¢À`è"è¢HšAtšEÿ~eKÖ½¦üQâçCж•Ar'Ö5Ež÷9¥>é&í|ÐÙ¤ï<©¤‡0/àóÌù`Iä R:9¨ ó>å >é&}ÐÙä ï<›Dr°Bн¬j‰uUžöó ¨žXšCÓ—Oâ7‡òxm\NÖ¸Á¬é³Ü^©§€ËkôoIÁï ¸k–쾂[êÑ\ŒnÔåx@Ý '²ïQ®†ßƒaPÃïXx|Ïy–S Æ-ÞìÀË×¾ßãÙ,¦HŒd(ÄI ã/²æ",°ãE&'‡›öˆ‡~>1JŽª_D™3ÜÆÐ˜¦ Û2|å/ÑuWÛ8Ê+•ˆPš‡j¸oòçB 1Úsßat5áXÙå 4Ù &‚<{d4¯„~UïÃAm¡q(Ì_X<ëÿ*!P1ã-YHŒuc8BÇC]„(Á„‘Ê$óp%v9ð{0WŠX°ÑµfÛ¸ZóNBãyÎ#êmxöw€ý_«Ã…’ˆf]ßtq;C·Sò’ÙÁ²ØgÁ[bTÃi•Œ²š“C "qM•¯¨`L©sŒ-¬£«E¥µ†¸=ÖÉø;„*‰_x€BU[ [*ˆ¬ý¥Î'¼M²;0—{'nš1â“Y:³¡ ̺”£AØOû‘iæ^Äcr¯ö¦”ú„@0ebÈb…'`Å[*m"宵:K¾T‘Y+ˆ 'àó qÛåá"8Θ>Œè£ Ï¢Ùq¸Œ<ø€ø PiöGt¹n” ð11 ÙŒ‹5FkBÍDé,L¼Dh|Hê½f~0&K@ú!æf…YDUØ©;GFñÔÃBÄŒÑ%úž€  Ϧ¢rL^ŒDt³Åúô ͳ°TÄòƒ‹q¯E’­Ö÷reí‚åb§˜¸ñ<*XOLØo‰ý“˜aÂÂW}=oHÂstÙkìǸiË:åBä¦H6·ly&#•ƒ!r-ù²,Õµ“¶X„¯ÿpî ΖqîÉtÐòx€Ãá|1“‹:5.íÀ…¸x—%¸´ PÐ{ .4„e'C)Ql™±ô,gl鮆‹ßˆR Y<¦Á‰Qóô»:ek\¦‡qO”&Í–ª¯ÍA¥£¶‚Îà)iÄ\9ÕÃÃb÷K Rµ7Я‡zpÉ.¾ÄR—X2™p .Ä_ŸO Åæ,Ep.£‡)JL„Ù’QD‰âåÁ~I#Qš&¡Õ4ã§X;v-ÁÁ" óàd–9Lµ;¥tD8ÄÍ'c,®wŸÒ×µí9Ss}%YãDm+SA4çf©Ú€à†¸}ŠÛØ:ÂôFP~C½7PUYSª±nÂXDiì-ô›È‹`Z å,ûdá¶I¸”p„¶÷4uf¸~Ç…Ò %Win¡K¬'ˆöWÏ7òÐXƲ&gÉ¥ LQU.Ñ®42 +â&o«ÓËöäñžÈÊÆ¾Åí=«a‰"jo`éÀH.Ïy¸Á“zì||Ã’ª±b¥ëK’¸“c²Ûâæ¬„´¾ ¨a‘ÍßJ¦f.nÈŒŠ«›UÛ:t9ÛYá8ÔÊá…¸ ?¨nDøbã2Ñ%èøæ•1êâ2Ÿij—Ä¢‰ˆùL;ygüÆŒ…rß¹~»(¦TU¢Pc+&¼öd(Â)U­.7ÛËnUŠÖ\R 6 péó£›t„L?I¦c‘hg“Š!Ñ«iN6 5çÜ®l-«<65c2˜(ì‰À4YdJÚqqøœލ ›‰½M5ØgÜ–Ä™%žú1¢ãˤÏë-‘º3sEÖT¦S*É%úTøßS§jªáZ~By«;*ë}áÝVÉ]‚HIQN Ä-:¾0f\v‘Οž²mk±ZnðM,‹ Öž³¾r;‘F»¬GÕdƾ0¡"J$£žˆIªó‰1'ˆ/¾ë± ˆPßlÍø‡®‹±´…iÏÉ/ÂÅžz†²mι-; =rãÆŒ“ÒŸøò×#gˆ<ƉÊöúÙXåȧ ÆåäLV$¦@&œuC=K²né1<þ˜ª¯6.žsuZmë’$®EcêkgkÍcŽO1­{6Â5N•„¸©©5Õ”Dfq²TP ü€ìT&\‡!:¾ŠK¡Äp1ØÀÑZÆ—“•) ¬/$—[庆ÉF/n‰×øW±¹ZiµÈ"¢£Ò)ª ø¹¼ùi*éBµe(&UÞâr–žÔPÉÂì©%L Ù9y¼ÞK÷Ô›r‹¬Ü’ys©›/œ »<ã”›D•µlsÈ_€pÎ9UŠ¥i]>‘FÏÌŽ¤ê›D ²ïA‡gÇŒ± …:›º[Ñ—KfˆÈ jÚï †{½Ù±Ô–˜L "‘H8)›áÅT©Œ|Íš÷éú' 0bu×pYnö[=©.ôdÿÉ"«B<­u4lrQwW–¢ãà÷QSŒœ{‚kGsݨU©Þ~òËî³Ç,ŠcOöp‰ît©Zå˜<‰{NɆĘfÌ{â^âyî/‰ô® …fe8 0}îò6”Ég gĨZ *¬¤LNÆ­ (_øNÿÙ*nˆÆŒV(åj:"ƒÆÓbP¤€@´Éf@?:YñHɸY¹µ:Ü‘ P±T5ÕÖ²SƺiÙ)ÚŽ&vËÎD7ëenHäÈÜã1°õ wÓuqµäÓOÓ÷P'S`˜aVö¡:“˶zJdÍÙ[z›/AÄ­ç2?zûȵì’é51uk­ÄS®UÎn6å~ È©ˆÊ¦I%ëÉ¿]«K€+ÇÜþMÕ2‘7]Üͪp­ë-e'?Ò$f¤’«¡ ù•Ì8e86ÂXòW€!¹´Löû¤î—§ÎR¹KØ–ý€ƒ‡1¿Y@𸔗_ã‘ÈÄ8Tw@1=äŒ Íñèrâ ©<ôÚOƒ{ÛÞî  w0+¼ÃѾÀ÷ÀAÁ³4–ÃUs)¾ƒ cÞòP„¼'6!DšzCÌ€c]a>Áß! ¸¾ôÔPÞypyËcÅ«ÉBÇ@>3½a}ä¡Q¢nžqãø=Œ†uRñƒmCp°‹þÎKÈÎNMh¥ÌD£ÛJ‘-Ú–‰S‹Dzï3NÊÜ1Gž@_y\Ø ÊæéŠ6t(8H<•<~xœ™6$1[6‘…ê"š$k v.wôUKfx³0šÕÓ„Òú<Âáhì[aÏæÁ"'8j¶y‘Ò~ÁTŸ¤âO,Gn0…`zƒÔkð¸7B Ó›Ç+&ürFîÜ_»ÖšÅ˜y›{’f§¥NÌ[Š¡l|]LD©ðwn¤Ñ£­*ƱWØKbrí˜Bh±'ƹb˜Ãö¢FÙƒV‹wMÔde˜_ú| )ýU~¶4™gðX°u‹íªÍ—I¢ðfÛÌãdõ,ˆ-&ï÷÷)³È€iµS(· ˜"e9/m¶ ˜-&¡¾ß2`¶ ˜:H—ÓêÚ^¾uÍ‘Ñíå+¯µð¸§Ì”ÕGb+®w¾ŒZÚ8Êqø Ñe•šÃÌ2­˜ñi“ÈÙ- ˆãÈ´v“¨U®Óĵ‰ ”˜4¾¾5¦j*'’! õ4£gÖÊ2̹ÿ$“D6m•KšTP9ßè·ÿ~"Üy<`Ô¤.OúéZd½šÁHM‹ ØlÀÐŒuK«­]áºå®œI*æH Ìݘï4\¯eH3ÙÂ2o®<‰óo3K¦[ i‘õÕÖBº¥²pÛRH}çI•Bê‘Xà«L /›íëléUSHgÎ6ýÈÇh”•sÏ3 -L—‘ñ$&Éø†"óUDçÁiœb‹HLË®oÄ0À{›ŒduãN"íѨÎî¸ZÇíÜÆŽë.a„HƒzÏ1‚ G£ÕŽ6“G,Ü’z9'1£„<7LÈ ~×%š“áˆdPDcºÔÀ T·§ŒØÄÆ4Ôýy®Í?aîoÚ™.¿1`fæ&7Òâ&Pí š™ReqÔ¦u4ê]_/¹ûÊñ{õ™´L»¥:ßßÇx†¢Z}J$ãox°ÎtÊÇz_ß>b8AðlìØœõ Ë庛™Eq;S™ºÜ¤¿· +Õ”=­Ï€©ÒqBÔ0Ófа÷Ç‹—º*m¸Í±µÚ]xÇÇÀ«¹QEÏ‹ñfá–(C4 Ç$€K%\Ö>1 o*ÿætÖ<ï;¬ÞùnÊZ—ù±êŽä?÷à(ý´wÖ«è\¥j×ÖÙ”î}*Ý sþ†fæó ~"ªK7uF½ŸÃŠm9Kf aNtoÎÀÀcÉfÌ ˆ[ +Û—ž‘ TÆ “ßÂýBžh²¼§Ä ¤N(œdB5ˆ#côÛbÚ Sº·6J3öz9q.JÈD¯QÅGâ;p×C"?„aéz%j<–Lžpת§ÿêÜ›tâË`~¾V†5W)ymo/:/I7ÚýZYŸ Là:0L4>ݨp õ”s•<Õ¾–À5\Iu×F˜l”±ÍD€e/˜̯å¬ÇÌ#¢zcOîˆ[L o1…‰÷ž®¼–]ÄQjåPêÿªÕ<îDÏ뜛¯3ùá½VÔ§)šGTµr)ЍàN1r^›)×Ò[¿Ø†* ¸‹/"(((=5•ËG–¨.Ƶʸ.Üm@UôÚàss”%\™r°B¥ïa„}Ì´ÑMƒ» w RÝ2tKOw ,y`gO£cbl—礸ÇÜ,½0äjF<É}(FÕ¤>¿ŸZÛyŽ^]ÎßÖ……é퓱Ìß4ôÀMÖܶRjèºÒó4²ièMCg£¡ëæ<ó;ƒ!Í8e'U¥Ì“D £UÆ3UoLkÜtõ’VÏ CÜ. žk ˆ[‘ÆÝL¼T¦iì“#ôt×÷"E†²7I“'ïÞ†Ö˯ª §2ùd)£ MãÌaÈÒž÷tÍØ§.ϰ-šyˆ¾¿l”C¸ï²hZ¼7Ü;×C±˜›ˆ½ÌHfâhÞ1.tý¾Ë¶¤”^b«o¹y øûÚoRãÅec › ðYLÌ…™G@4g‰’s'÷·ò©û³ÿÚ "¯œú4÷ Œôæš3oÞ`Ý÷ãýOSÚ ÕWÜêzš:?P镤ú!ª¦CëLRÐOxÞcæÊÝ®ííãpR”®é)FxÝR7«†£O8ˆÜõg ^9†Â«Áï qtô7I0,ÁÿÞíø¼óè]º 'L6˜ìÞýçoßñ:ˆÊ+„‹á­qu Æ~<š íIQ¤ŸAì]£¬ÆagÎaŸË¢ïšax‚0(Q¿ã!&ƒ¡jÈ.ØÒp´äW=¸ÈcHžå'”9ù`î»7Iź0‡A£.XC¾‰ŠÍš ŸöŸvÿVÌê+ endstream endobj 4703 0 obj 5163 endobj 4707 0 obj [242 /XYZ 37.5000000 224.750000 0] endobj 4708 0 obj [242 /XYZ 37.5000000 224.750000 0] endobj 4709 0 obj << /Type /Annot /Subtype /Link /Rect [95.2500000 233 117.750000 239.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 4710 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 180.500000 520.500000 194.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.hpl.hp.com/techreports/2002/HPL-2002-335.html) >> >> endobj 4711 0 obj << /Type /Annot /Subtype /Link /Rect [318.750000 69.5000000 354.750000 76.2500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.oracle.com/technetwork/java/index.html) >> >> endobj 4706 0 obj << /Type /Page /Parent 2 0 R /Contents 4712 0 R /Resources 4714 0 R /Annots 4715 0 R /MediaBox [0 0 595 842] >> endobj 4714 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 4715 0 obj [ 4709 0 R 4710 0 R 4711 0 R ] endobj 4712 0 obj << /Length 4713 0 R /Filter /FlateDecode >> stream xœí]K¯ã¶ÞûWx] ñ¡P˜g. f€.‚.Фi$A§Yôï×¾–ïõ¥üQâ§Cв™A2“«EžÏãã›?ùÇþ_¿ïß¼ÿòŸýÃïï¿ìªC[Wçö§_ß]ÿ@w‡áÏû¶«÷?üºû¶ÿ¶û¼û|üï·Ýù…/ïÿzüÓÿözÿ—ã¿?ï¿ÿûñ‡?éô~ݵª=þþËÓï}«Žªž?ýüß»¿ýaÿÛiÄËç†É¼þÿï´±}§OÓ˜øô·Ýe™êé×ï?ü¶{s&@ØWlÓ÷Ý+kŽÿé­Þÿ÷Ÿ»ŸŽ¸ _z«TÛØ¶Zò¡VŸ¾ÔÕÍ^é¾Ú7};úÐÓ/™á•øàmU×:ÖàÃÌÅ©¢L£ü£Ëmn[5U=lng#Ðÿyø›«t×Å㜧™‹Så¼¹¾Ñe6WY{¢PÛ?£ºfo…—á /»Ãèé"Žþ4wqºÝßüsÈ x&^óòÍó⻯»7Ÿ”UGžjö_:Îíé›çß¾Y¾Þw²)m·ÿúãþU¥ìŸö_Þõ‡F×—)N=© |ò>yŸh8ƒ=ѽähª §ªá >Â']øÜ ¦õ§pZ+8ƒêm8 ð.Ø*|0ïHQ<7)êáDüÒïæ¼ ­ æ^<· àþhÌ;˜G±4BêBW™óz>~=ªæèZõèÂñZ•ÒÄXžñÞcÝ ÷Ñà'¢Ü'Ë/iÂV¢H OûTÒÔžˆ÷pÒ$k7Sñ¿°µOÉc¦^À/æC™¶¦xì/OÝ#ݘK±/ß+Å4ðÌzu/ßóÖŠ:©t>7¥:¹y( wŸZŒÚ¦W|Ô\½NmDZE$8Vþã“zNú¢üÂxŒ¿€ià¡(Övð Ãÿ5!µk̉ ÷Šîv-å½y»)ýF¥ÔFüFeûâ7.ò –¼Rìé1±fæ;xÖØËÁÚû´8ÊIÄ´s÷eT³$oB=abKL´š&f“jénI<6¥–ÖzIkiìiyò#Œ`N¶Ø?Ä'Nü¶Ø7"l˜G¯ŠêÈZª;ÓVyXmmb«ãá ¬Q°¯xg' Ϲkb&âNœ8k˜WÂOrΈäœ_Ì^o4Kr“uË™Çdsxž“$s*dê™úÿºKy¦žàØ–¼[¸®€¨$Ãs«¡W­¡­UØÖb ÌØ£TØCX¿:pu­*ÝÍ"¢`ª%qßÜ£F?žíϺâŸXSò¼Y’AHÊ¿í’xß6£hØ>â˜ìz˜ J<ÙndÇôÉk7YQ|äÊç#§ªhÂ{šHžïÍ_`:[<ßÁ™L"º•Òû°j+º¶ŽS¡›µ÷±ú97w oÛäÕ©ôÎNkí³Öÿ{"ÇÇ <DÖîá¾(œÇÇëÉÃîõ[©0¬u/þÕ|ÒVçOv—„øsê¦mê'*¸æ¬;t}õúÉÀH·ž¼OA6í¬ÁLê)]ÁmŠŒË߯ÞRez‡ÃÚìÁš3«ð;W—šCm›®­ÇšùÖ&wÎ ãà ÀQÕ[w>È`4n oç/'kkœ]‹bn"òÝ)98—ïÔÙ5Pæ`t§Žs}YApXu}yeÖ“î2~Ïsþf}ÈÏ 4í­ïœˆR—½è¯‹ž4ÃK3žÈ 4Iªvùhu-E°µ‰ SB6òÐÎzDj†ãSž×C4Å­Ë# ÕÔq’¬²Ë4îS­ÜDP‚†òh¬íÉðP'gˆ‚{K % 45}œÖ£Çiݦ}.À‚XÐOë‚5Ë<‰Øªä ` x‘¤|JzÑ—^Ä£aHl)! ¶iõ4¶S8n= &€¡±ˆ$+²',e±,¹$“[“ºðÞNdJs’Çê%…N) Ú~g—oÒôê¤ÇÒܦX€9Ïz°«–4v=NóIæ¬ 0§øn`Î(:M/èKé…vÍ’Ö¿â…fwV€9sñeº%YÌÌ™VK÷Õ’|FJ-}ºr5†–ι®sÞ¡¥º3m•‡Õé›Ôp@˜Ó§ 0gºË41{½ÑEòIï,‡—3`Îüß§Ž<`ÎÌùäol2cõ8\ñ uTû‰uM˜†:šÕ‡ó$²®ÊæSUu>×-§ª1Þ¦uË<º«ªv#mJ©„l+€±Û8¶\¦;k=åìæ±nÛ<øÙú ~V©z#0|Juq.úÍٗ٦Û®÷¡«Ôq‘f듦õ=‰T`¶#éwR é\ë¬tS‹Õ«^îp2ç­¿¤è™<“- ´tuÈH<'ÆkÅï œ#ì=Qàðo@d0]$Iqã §n9‚|Äû…Ɇùœgõà{Â'δá”5z'„3‰+žl*£Ò³¸›·&€1Hß…+k¾ÀÌõn>±$DÕ­u¬™gIxóÁSWgY4ßõ…¼` brÅ!bÄð¶ýÃËzqصÅnv{…Á8þSâÖz\ûƒ7Û£g¡A‰Ü0J(ƒmNÌ»5*Ó¸vT㼇};Jé2œ,êXãw/w4ø¿»ƒÿ®1/ÃÑÆá£cÂq`$ºUÔuã.VB_Ê­EœÓTq×;sNí ÄfLÑu¯¦³µr$c›jÞSký>»ÚtóU)flÂë[™yêóņ׾Èê£ÄßîÆ¸"3é_ÆœÍȤQ>áIÃ`¾À+NTE…©36Q¢˜tx²"F™io ˆ²PE&Sr• Ìf¦O`!!DUsä r†ÕSQ’ñO¼rÍ ê3œ2‹‹T@„¸í\6"ʧ)×$Àw`’ÑÝk<“NIw¢ÀêÃéý_wÚô×?øe÷Å#¢qdû4…×»Bå\DÃIJ ¹4D‡h8D¨Z'óqËÃ1€L¬¨ØHŒR¹–04•.¯y¨wUÍ6…a=0ÊU*Ú¾.îżÜnëª|q¾¥ ´ §lª&=½=²‚‹ãîÆÙf¤’èáÚÔ]TQÎÂJI OQãCYXûRhµœºPÊš}‡J÷#µ¿Ž°ÍÎàJ“.A¶¶.Yås­Ë"¢œ%ƒª )<€µzŽrmÝö‚þÔŽ¬–SbÖÚÕj1©b® µÎ &k¥²:†Ë¶Å2AÙBµ¸ÐLò%¤€–Ñ‚ ÒÁ|ÅÌlœ,ë,@ã\¿Ö-̽ÄxŽ©Z"‰ëǬW.~š,—¬ëÃhÜ€ ‚¤2‹*¬[׈3ÈÆ5¸næÊ&»Úœ°â®¢[uïŠÂßÂå:¢íÀ ·¬dz‰g5®÷E]yã ³¢Ûâé"¶Ÿ¹©~AÇQÔéñë‰Ì1=LîZäðW*–NbT9Oß­Ÿ+PW¿3/•j‘=Ü2Ìâ¹0¡o?°¹eÎ0g«úPõæõ”ÅRdQ)¦eš3™d0Sñ<­gœ7Ü"Û(½nqúöŽªÛ´o1«qüÞÏ¡l@R8ÑA_¶yž:™É^:ưõ}xy©¾s÷nL:|ðsÆVŒÏBeCæw×c-à1µSÚ&fhÖ*ÇÔ _j˜qÀ‚êÖ0I $SªKoˆ4Uª»::ª àÔÊà)aT"RtÔ}“Œ¢Ø<ÈvrX]¹‡! ìE±e@¥lyf|xO©Ü \0>åäDÐ'z^`NÔ鳫ŸœpNâlæ%„ךˬ?¡­|˜ I& aa…ä½:Î •’–+¤Æõ óï(ö˜tdp¹F;™²sZ—õÉ“:±ƒ&3µ¹þÁ€M§)8:Ž…&:P¢ÄÝ£æsZk@уÿT€r<­P½©ð} %EÉ$ ÇšW7£6ÉzK²jXÖ°Ê*$—ïÆNM€C.š{Œ\Ë7 ×5鏯¼$ÑŒ|‘µ"HLóuè”l®.òdeädÃjë;xÒÖLE$ÞäT£5Uw™&'ö†ê<%ÖK‘Ra â¡C/Áïä—@^?‡6ºíÈàö)ÜT$R¿"z3šˆ1Æ I!.sÛY"Ð|‘Pb•áJìÍ@ñ‰3s&f)Ôþåwåh²ú®‡ñÿrnߦ2ZÌwDÔn•08%€sƒÉ8Áɼ˜1åúÏ©œ’€Jy¦Dß“Lb꤉¶ á2(æ’¶¸`ƒLTÛÔp²DJvÌ)Lã ÌW‹„·V»c÷nÏ|·ì1…›Lq¼Dä7ñY,A(!™ŒB2ë÷UgsäNiYUÕ[×´T¶úyý¤Ù8xÔ ]‰ZÉs›Hꔱײ×b'êͦA=Aζˆò©\ŽÆõx¨óz@†ýîƒÀýòôêÆ°$%KÛÖ­mv$»Œ$5®^” ²$ˆ"Àï-d•PŠÔ•˜¥ fSe0eÏD‡Ýì7 rÁ ÇŽ5çÄñ¤ƒ£+í^k{×¥íÓ`rMžH æÉˆo¸UŽ{IqÆJ㬙ñ`JHr·d¬°ŽiåT6zý†øÛ‚bÆ6UW»'°Ç»[rKÅ=‡AÇ¡¸¦™ž c[Eà)EŠ åƒ# X-é3OÞ‚˜Âv ûªp4™€ÞH€Ž&wnª€?ƒ"«•{åÜiz¥à˜@V+K=ƒä­ì¥VÌý²eÂ`[2éžÞe&'€·’‰ªoR8Ö¿ŽÖÃLDv•:®Ê6ã¦EEÙÿa\ÿ£5†±®rÉ PoÛ½_´¾ “( DÆy|ƒ´¬ ßæ¡ kBFN;$Š@3'¢tý¥]½Ä¿ XÃZ‘=÷ÏÇE.Œ$Š’0|–ˆ¹™¼ãaÖUwŸ…ñ¥°ÕÏs€@ É {RÕw‰”sbÿ†HfQ<)Rš…Ís9=?B´Ô¡ÀíÇéK}倈ÙÖÏÖ1ú ÷x°u>¹b™ÒÐRú2œGJš)b…V™ÞÝÓ³8߀yÕoÑ“A…€f‡¼õÂãĺ5ëwppÖC¯Ü­ïôᣠš%ºGÃÑ<…ÔÁ;§0¬0~ÏÚ†¯ó†"ÆïP‚Á£C[ë*ø( qÕ‹mFê²/#¨žíÆlÕ‹G€°âJ‘BßÞ$u&‘Á‹*/ªüUy¯ô|U.Û³ÊÄžF1¦Ú.訽÷Ê:ûúx¨TGíÊ#å÷å"™·Xf› óMƒòP­¾Ña .ÑöÙbôÀb‚E.r[9‘Á•9•£ª¾wyDäÎ6Fo1‘|F×ÍÏ´É"S7[B³Eåq*Wd“ «9 ‹fX»Å\Ë:¢,®¡a2‹Ll“¿,#Žü€ðÏÑ5W9­eŠ[µL; ÁÍãŽ]¦Œc8‚ƒco8v àÁQ‰À³fb.žYËÒ§x`üij?8“LZ311«ÂI&HOTSï™ôPï\Æ»€)ÊÈ^)³ ïà]ðì)æ†:„dUb%vUܘÎQÅöc7+5.&” £"VPø C7œ ÁsÃev?Á´&L˜'Ý2%R\…ï)±Ì;¯ÓšPP Çk¬< ׌á*Šw׌rXðÎ1Î!ãáÑpŠ“qùY':M5)Œ²ñŒ†ßÁFg“¾/åÝáYcõÀäij‡é–ÈX Ÿ±@?Œ ÓØ9Üæi"'òg)G{øMÔá÷¸X¶™õ`9rXâšäK3ô•Iæ§vÎõ“°ØzÖƒßÂ9„oâgT»Ö᪰þæ'n¢šl.nÁŒƒ†%÷™qç´,‚ ÕH4‰­À0©.Ü®½ÿâîÀ„¢ 0Sà¿8SÉôÉ%¢l¾°û1o%´µkeqxeõ&ó4ývµ¦fm(ókõ @ù-b›PŠ™ÉÎ’ºk±R£ŽV5OUðü€/ø"#$ë€íe¶Š™÷Hy@ß5£Í"Ìó†¨ñ†œèúDÖ㲎ï­ºþÁ/»/É»—OSptïê[²SÛ.Q|õ5n`ß­¾Á+^ÛîðŠ ߸öáýäøkÿí8º÷㟧þÂŒÙu7±q•9TêT@¿×öBåîLÆö†º?eôA?A«\?9‹F3~b> ï üW© Ný€¾c¦|ƒ[sû4¬t îÝÀцÃÕË”*8Y5,}´ÀëðaŸŠo,CáÑà;ƒåVAK¿‚¢gîôçãŒ/3ÿ FΘm0 Ø ½Ï?Ÿ{1 Ý ÆÅôŒ&ö‡Â¾×£¦ü.)΂ü3hî[œÕ9¢ã‘Ì)& “sÙmÁÄdzfž` JÀw<Ìi0œ}ìŒ) gŸ9Õ³·#} ùÏ3üˆ3G?˜zw‘Vl+s,êLõUÝP;øS~ÅþóîÿKl€# endstream endobj 4713 0 obj 5830 endobj 4717 0 obj [243 /XYZ 37.5000000 541.250000 0] endobj 4718 0 obj [243 /XYZ 37.5000000 541.250000 0] endobj 4719 0 obj << /Type /Annot /Subtype /Link /Rect [179.250000 562.250000 219 569 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 4720 0 obj << /Type /Annot /Subtype /Link /Rect [66 549.500000 225.750000 556.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.devx.com/Java/Article/30192) >> >> endobj 4716 0 obj << /Type /Page /Parent 2 0 R /Contents 4721 0 R /Resources 4723 0 R /Annots 4724 0 R /MediaBox [0 0 595 842] >> endobj 4723 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4724 0 obj [ 4719 0 R 4720 0 R ] endobj 4721 0 obj << /Length 4722 0 R /Filter /FlateDecode >> stream xœí]I¯ä:Þß_Qk¤W/2I©G$H­n‰bÞcâ!ü}ª*©;8õ9ñWç8NUÑ‚nnnûøL>ÃçûõÏ»¿ýw÷㇯ÿÞý4þýáëSµoëjøÏîøç‡×?°Ý~ü÷®íêÝO¿<}ß}úòôåð¿ßŸ†¾~øýá_ÿÛÙÝïÿýÇî:üðçñ—Ž¿ðËSkÚÃßÿ<ýÝ·æð¯êùïãÏÿþô‡_íþuñü¹q2oÿÿÖÕ}íŽÓ˜ùô÷§ó2ÍéÏú×ÓÒ¾â[ÓWÍÎxçw¦÷v÷Ÿ¿<ýõðóðÕ¾÷Æ´o«k>d¼?}ª±;cºÃ÷Ä ¿tú#5¾ÂèÖ8Åч¹ËÆÙ>>ºä[[÷#‰ê)+ lÁËø£{S)Ž~š»ÙïÛ¦nlýz2eê½³yû¤9=éö]_½}ǘÓãÎ/…K»°hoOOܾöM׾ͣïØÏÓ—_ý§©m+ôž,^zÕÂÉ£s^áËÜ, ¥ê¢àeD>Œ—XÁÑðÒñwlg7 ÏÍ…Dñp5bDf×½Ó—rs  ]ôƒ3HúÈRýþ4Ï7tm‰'zRôľ‡ïØôTx´ŽÖ¡'5^þ|âàhÎÁ'^[ù×f¢ýç˜ô’|2ê ¨&ÍÅÜÍ@°|cõµc¡îލ¶‰ƒTŽ˜b7mGÄ '<|‚…ÛIM™cüÃTx4Ñ]Ì›:8šÃÌËø!aêü’ëŸ > Ë`â›P&Î(3,aŽ Ï ó!{Ì9$ÂïBc …+Ô]kMå»Ð˜ÃTû¦5o]u†¡$Ä›J¸&&VT„"lŠ™žQœ÷(]ĘV€bã‘n Û/jpRΦ„zÌeþ% v†Ð—7™å4˜ C\üÛ.>]D-4mÔ±S‰ç}Ev²• ùi¹Áx.Øßbt³E‘Yロèé„:“.?4NÎ$bê˜ãć­` šØÃÈz6+’IO­¶I ñ¬&#JqVµÌwt8»“ºÑòºëCe>œÎ.E}a½êÑw^3Üø6\µºÙ<ÖV¾ýæ­ä{ÄÉ>5çëë·öõÏÁ'äFœ‡‰p=~ʃŒgíÞç#°=Ìã SO qÚ «fS°Ê30¡VáôÜ;b4œÜ$uf•{E Ü¢¸FÌ`/QPÎåVP̸]%€7~Çcq‚Ì<ú:is#DQ¥XÁÚ–ÃJ¢O*¸)XÇ9ÌŸ3¹@Ø¢a‡¿ƒm¦Æ«ˆF‡@=o¡ÿ¸Ï•‚š„o…¹Š¡µ#xt£•åëšFL|ôbôMôˆ‡5’¬>`xÔ}ÌiD[3/4«?ÉK’>ûòæø'ÏÂMÕ±Gñ©5K U!‘lÿeÊõà;TÕáZI§H”sR2ÄÔJ% Óš2¢ŽIÛN³O©ål…18×¹<Ùc\Ô&Z„*œÚ$béÂ$NHjáð~3.°J(ù{T'—“ÕN šÀr>NÑï”r¢Pt¦Ž8y"ÍŒBÍJ#2-ËSª:(Úí«{÷W^8[9©l dn ²—ùª pµc‹&XþYD÷"sÆŒÌ-¡îѶ–ÂýLa¨L¯“H#Q…ɬ˜RÇv#Ê1#uȸÛ",Ì!ÚjkÅs«{r…óvX#½K7=z 2mL¥h³WD qs¢~g€écVââb×)!ô!Û6º¼k}S¥ÓŒ­e´ ÕR͸û¢•ú”¿1ß ëC@ʦH\®f…È9lˆð;çŠ_ZðDÆ[Âû„÷öU²k”0{Täã®VÚFc@ {õÉõQÂ^MóÔú¾L±M%ÆuážâŠ+¢¶Œª£æk•U=¦:d¸[‡“=yE |yÙ!‡Ö¿G¾ƒùHGL1žãBÜ…xHíµæa¼è÷‹]!‘I+Éø‡ ½Ú‘cIìš(6Çj) ù3¡‰xÙãLÖ™‚~µõ –V˜aÈ®O(0 lÖ˜S©¨¶¦Â°™Xµ&§­ -k.«©ŠåƒPËÀ7åbæ ëÇJ$ŸÖó&¤É×O>‹±}âgîªCƒ¶49ˆ0ù &ÏÏÔKªç¯È#¨Æ¾|À, îaDû1¨×¢>à$½Y`È¿²ä2‚‘ì3¶†²èäŒÜ‹@ã&À•c*•|ÌS.$°“™º¢ûh˜¢'YQ ¬2ô)öZ´KÅ5ÕLv]èRM S|àæ¯.S;:üàRsæÀ¿Iøç"…)îX¦r•mº8ô~kn ÜZ& ”½%H_* +bš2$F,§K 15Rï«Þ½%®“hìùQFsfLkÂS“!®d£Ì$“æeYkcóâ[NxOkû3î–Ç e£ âß`æ;W­×sÆLžÍw&¸°ìIà“Èvaˆ0bSÖg¿˜ÓÜ“LétH‚—·éúÂÕåÎ÷*rÁŒ„r‡Ù¢ùÆmø_6mq@#lN „Ff€¿éÙS,¶¬#† Ä4ˆ€;`à ¼ ˜n*‚ØSüyÔÍÑ:“êj:qŠxxXu,‹Ÿäµ]û° ð° ¹7¿aù!´9-¯LÌ —Šd@®)¸hY^B‚ñh–àëÈÜ0Ý2ÁVQÞ¡{1¤9%§„§ñ/ùë!ôK»¼?GèLEßå ~§eî7B-ÛôÌd¢"$^Þ·!!QrAo®Ú¦'¿Cd3S` Dªœ0ÿáÙ3½2L»“FÕP%š-Œu˜¤¯}® }TQ™h}j¶Røå%¬²EÓë/ýþð&…]"fo•!Äd}¤LçÔ¥ÓLûf®šcÙV°Õžõá*òÀ¼¯â{k€7‡U-{2áñy5W¾”oÏik´I?âK½|²|©—ÉDBØL3ªœ)»eŠO3!&oª­SØÜ­v­U¢Î’N«U¡=°Î¥påÍc63?B͉4eÃï»™ÚíºMi®²e‰HläôNtF"—ºD²ÍC²ÝØj¦ì>C¥µËç Dö+Ð>dÇOÞÔ~èŒ&‘ÍJ7㪰MëF­i}̦„—þˆy/RRo8Ì‘¹¼+=„ó["õL¦=²Õöô­ µgYZ7ˆ3Î?ƒ{ÊSGƒ©jïrå°(ôÚ\ur '©òÀ߯m’É0“L†Y&9f¹äøÊ’“í îÙ$pQ xlذaCÌtCŽt=‘µÛ߀Ê_ýàŸO_óg­ÌÄ>êÛFt¼—oRÑUŒAH RnÞ#NŠTÚ'WQÁ¤¢”©©ÚÅgxîJÁ$bÂâ™E¶†¶ÔÄ[Z¾Î÷ëè*?¨ÇÚ=×6àœ^ˆ¨ ¼ön¤Üî„©B޽RIàv™õä¼5?.ë´*7ZsSû×?8Zs%‚Ö~1A©:®Á“Í©dÖ†€±ò~ë}3ŽV]s÷5-\«uÂ}„¿ê Ží, jÄsVq~~Þ3W“,==êõpŒ°M¨o³ŸžlºŒÇÊ ¶/ÏØÉ*íHÖ„GiÔ¬‘¬L°E$b©b"|ž’I'äÉßX¢å‘9xPö˜ ®wK ”2˜É ¥ +Ó #º¥w›=W-Ôhk]c%{“ŸlˆbLZ€ðÊŽêÖ¾ýä¥8Äœ·Í$€.)Ï¢ßéáwÎÈ“C±3èI…ç¿ó ;6Í rÕìí)ž¶ì;³~i‰&1PÔ?ŠÎ Ó ‚ßÁ³†30uúhxÌzFxé÷pn äDø$278¼ÛW'áYcº‰Ù!åäF$»í$+Kî¤.|Ó#3ÝÓ4 #es낊Рë üÞS¬Õ[øLkâ;'Â8¬·ÞKj§ˆÂ‚+f±³ƒçÆØ/Ì£p؆Ï“44–m,Á£-ÒOÞ5æ×Kâ¶í”î‘«e+²ñhŒkNœÎPQŒ¿oõq8–Žß9kGvÁá')…sLŸ ë//¶‹Ðbí§m^±¤–À9Là¿`t½Ò 3W)Ž;'¯ÅJA£[]¸%âþ[¸!7bŠ™jpÙKùˆZáGÙV!•Ñx¹´¤„±ÔiƒÏf6 ÔUn&Y5MR…;&ÁHíƒ œK‘‰–*SHLÊ.éòM™¶Å»Q#Ôx0£au%[®·ZŸR®–¼9éÌ£s¦^©7Ò7ƒÆ„¤“%ÃÄæ3å("Ç/‰0j¡×¶([ª"ly …úÁ@dªAŠ´7á¥RóúxCxé"ýÕúMø|9”|D?g’Èî‹V< }2:Z´“9Ò8«Ñ©øì»Ð2F› ¸š)¤Ñ<¢ñ«Á(0>/ΦQ½1Ëq …QAW?2Íß1mž™œŠl©YÝ[§ü')íÉË•›Î¿eÇ´[™;‡‰[ö ¾¯Îߥ‡Ÿ0 ÿ‘ÛüÞçÛǶrç¯âÛ‘s\Þ{ž}.ÜÁœÀÜzIÜ¥ÊÜóš‹{ðõÛäùrÞ‡%HŒcgbXmûŒ—” ‹é‘Št÷ç:P­]`z™H?ƒ?”⎮î&æ.mˆ8… (!FuçUz¨×L1 ì&t±×Eùº ,@1î‚*Ž[®Z?äcC[[rê?ç!¬{‚á«Îñ%õ ‡a2rA;q©{GGâ’úÈܰ{‹/©ß졲«ÐSÕfŸäY]Ó_³ºMJjD¶,! øÑY?B÷B`…èË®›ð“MZ·òås“ût4¬k°5yH­ð¬#´~GŒ÷ÔÁÑ<äˆ5ú¾ T¸J–¬¶ËÈï«vv í+†ÿ²`¦¶ÿêLظïηbêÁuIÝuÁº7`€4ë8ë: ‡v}ÁÍ)T4‡¿x¨È†ò’³:TI:D]¾G«Øf¨´M^=l¹ôïÚËF!iI²ËÍciúˆ¹R3—_ç€Â%à1©Ñ 5Âx/,Óp#~ÎÃî¤Íš)´‘8 ÝÞhRYJèY®2æG]åê·ÜXÖå‘íÜúä"²®ªýünm5ÛêªÖ]³ºMʽa²“Xº±Ôa º±L0Ebn8ãLÕl<ò×T&,"§pÖÁ*¼s8‡ù f›ð l g@ä”JÎ –Lkƒó„%äâ\Õ?7ÕdÊp9ãs7F\ua8ӵʜi$5¦Þ]ôį‚Þ«ËøÖLذ-¡({¶é‚US Ê[J8Þ¶BZ/Fù𦍠•Àýa+d“œ„@uÁW¡Þ^ÓW›–ÉgßÝ$0ä#µ%›ÚR4p½s{诨}NÐ8f\6r+,kW¥\çôõŒT{øÚ%)2FÿF03E½ÙýÊôkÚùɬ1¡i…m¸øL×rP¸yXé2—bÊi}= ÃkyæP$¡¦(4šÕoe™ÔOR!J4Ÿû}¾bœ¡Á–N™Å4iåbM4—1'ùb.õæ±¹m©Þ|ѵ#ÉMU+§²×Q{+ 𿾩eÔÌM²`Ý< Û]ç[rÖ½[¨˜Õ¿>êÞc;÷¨{¹Ü]…ÃUxÝ»­¯ÁÚ¦Ü?êÞÅ)ú¨{Ô½Gg}suïET\Û\ø\×Î=ߌ›«€'ÓêqEM•¬ÆÙQ|ÚRFû—Í›jä|”ëÑi1FQ39Ó«Îy vÝ3®[ÆS‰¯Î=ç.ç&;°0/GÎøÄéû*¬Hbn%ïöþÊð|¼½¦}›Ñ•[C’-[Ôy\Z¦ï]ûþŽÉÕÏȤH"þÏÌ·0ËÜyH8®7˜qi™š 8>·DN4º-D å˜~))鄦\Ì"†Û„“Õ™NˆLÙ» K.‹¸\ÔÕõÈ*§ç^· ü“MúŒϽ„](Ýs¯»«òi«Çž#ü‚#ÌØ&n–™‚yùqŸC)RÛTWå‰a?‘µ&˜—©ê "sX€NÃ’AèšÈ;ø;0†©Å!r}ëÆ©H“½æÖ’mF¯·*qú?—WQˆñ¹oÉqmõ| Ôˆ¹)“Ík(ÆÓ„¢váÎ1½ƒÈ{ª½£Œ‰…ÛYdã=¢]¦ÂÑR¦]aùÞ2­ÛÀ+Ѫ<ƒH88fFpm˜eûÃôaÇ|*ÁåT t%mgvF–%ô2VT»M®«ÉkDsÕ–]h/jÄMkîÒOk~š´Ÿ¶¢Áé¬w“𲨜4ÓÊŽ©;á€L9€ª¨í»9ßP¤§zug‘ºú’‰Uè¢bQG«ÜQÖ¡ð?ƒ°–y¡Pô–WÔS=ò µO+Û›ÀL2%nbùÝ¢¹Ö f¾yn ©mTçÓ+”eÁ3"$Îm9š™vÂ8¥d4ïp°]¸j&p!Ÿ, M”ȾÈ2NÍÞ«&”ž’Ñ™„ï)Y˵³Ø[’1ÊŠªD}°L¹øúç…õ{šEÀ2á]oï:ã çòº·îÛËJû¶£Ñu}ÙåQýf~“‰ébò&Deûd»òeÝTmp¯oKaÂ\I[êö3bëó÷zpŒë˜¨\ó<Å©ÌÄ¢q7‰fØÓô>ô)˜=*çªQ'‘‚öƬ¶¼튓h†X­7³ÔŽ„¡'MÆD05Â+“Vv‰£'…¹;™‰®üˆP+—,CJå*P,8H–åꌿ¬n:êîÎe`>ßÔµMøMÿ~Ëñ4/t9&ž°¸VELµxÌÙ× TºÚ”¹F˜p­f+p•¶½C­Ûtõe­»©ÊÎm¦R5c«Ýäqk6©`/ñFR©TñçüÝEpj¹ºÀÙ/\ðSy(Ž{H™ªï%Ì঳T²·u^‘qR­@­B/ïFÊdScö:¤Ä󘛥®°œ0Å*y#:ú nîIC÷]°è;ÔϲMØyE"í;ÅÞL«Yuܹ~qJ-:ÈÊ-Þ¹yGq!“taá¯ùŒ|²ñz­KŠ‚iˆ"š›˜ A…¯–ÙÛL-k–oD¢sTœšÐÄÜ™RL_^²H¹øŒrÃD¯™ºWtc1qY<²l5¯“ò"Ñ\ëÝ\OQ ”Ñ’ÚaY§l œKÆ«†U½ ,+uh‘¸¨fÖÌ‚ÕÚ™ót9ïÏèÜU7•GTG<ÜŸÁíµ÷gþì¾=*_æ~ašê.×Uº}eŽ­>»çòFˆ‡KNÁ0ïö‚W: ÈÛ½=Yó×OYo¦OFÄf»[^ñ¢~ÃGô7wæ¼4·ÏãJ'ÝN#—bÓèCï ûžÍt£BÆÎ56–aðhðÑÛ1IKo_Ø–e¸ã¿«TÃOÐÜ×é,€Ù³€?Ó{øùÔkÆÞùÆÅôÝ켦}®ÇÌʼn¤8 òÏh.qVˆND2ç˜0MÎe·Ïšx‚1(U߉0¤Á£õ ¦4ž«–üjdo'úò_dø gN~0÷îUZ±­Ü~´¨ Õ#Tuã“Ñ·˜ó+v_žþwcÑ endstream endobj 4722 0 obj 6082 endobj 4726 0 obj [244 /XYZ 38.2500000 119 0] endobj 4727 0 obj [244 /XYZ 37.5000000 632.750000 0] endobj 4728 0 obj [244 /XYZ 37.5000000 632.750000 0] endobj 4729 0 obj [244 /XYZ 38.2500000 119 0] endobj 4730 0 obj << /Type /Annot /Subtype /Link /Rect [214.500000 688.250000 252 695 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 4725 0 obj << /Type /Page /Parent 2 0 R /Contents 4731 0 R /Resources 4733 0 R /Annots 4734 0 R /MediaBox [0 0 595 842] >> endobj 4733 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4734 0 obj [ 4730 0 R ] endobj 4731 0 obj << /Length 4732 0 R /Filter /FlateDecode >> stream xœí]IäH¾ç¯È3Òd;oBš^ ‰R«[â€8 4šÑpàï“Yé¬%ìïÙñùEØÎ2-¨¦¢¿xûúî_þ~üçï>|ù÷ñ‡îç‡/‡âT—Åõ?ÇËŸï^þÂ6§îïǺ)?üzøvüvø|ø|þßo‡ë_>üùü·ÿíñOçÿþ|üëßοü±ûG—ðë¡6õùç/?ÛÚœÿV<ý¼üþ_‡¿üîøÛeÇÛëºÃ¼þÿßYWµÖ_Ž1òêo‡ÛgšÇ?ÿýá·Ã»+âÞâk×øæh¼óGÓz{üÏ??_pÛ¾8µÞ˜ºòu1çEµ½¼©nìÑØö¼Sez/zü£´}‚Í/°I¶ùãÉÕ¡bÜyCqwÅËõæ ²Ö‡Ðóî ÀïMÛ$Üürrm tW‹7×¼YçŠ<Î%Ðóö 6÷UB¼y<¹:Tnw‹w×¼ÜÒø+€*_%ÑÓö à_š²Mw¹'W‡Êírñ[zWuªSÀÿyû›WEÂÍO®•îr…Ý5/·.:Öæ\™DOÛ'€U¤ÄœÇ“«Cåv¹½Ý?Çì‚rý Ðø¿ ¾ÿzx÷`¼¹¨Õǯ?÷øÎë¯g ”Çï.jþY~ýñøû¢0þǯ?ÚSeËÛÇVЏòîÖÀg¾'NPÁg>Àg\±pî†Ïfán¬ }=“~rªmÌ ªÅwb1}‚+ :#°¯„”a!VŒ—1ÆBž–‹ŒÍÅĆ{¯ƒÎÚb5á¯+ãW(I‡Ÿ2£€RXøR,¹±´_^wÀHÈtáüHßÖàn3xMj2íí¤µÞÚ‚WúâúÊÚ¿Í©i‹G(„¢``¥Cƒ¡g®hàOÞ]ÃÏ+­t—=´>Ûõ²Ë“³™øŒmàÙ*Í÷¬ÂÙ®¬×J_5õ«g®pk¦lQF1ÜÍ8b·Þa{¿€ê ¸+|¦ã¼C`Ã…hàÌtPCx΀šÀ²ÎX3îöP¨x½ÅàkQ¥!*œž#Þ Ÿ`ô{RŠŒÒ2£S› ȈéC ü±½C¬ÈCK¼ñ4Õ©^qlR•B¼Udoø>ïø1ÒRCŠíÌpãÌp™Þ˰°×cn/šr·J Ã_!d‘J”P൦ÆÒ÷“y @ ,eµwUÄ‘"¾‹²1ªÝ9Lqªjó¡1”à{|Õ­˜c e¾¹ÜC°½y€p¬‘Ø ¶Cða1W†bŸÀ[ÈÉ!ÎÚ(Ofèz>Ä«‹#¤*C¥xåÝ(Þâ7i+ãw„æÎˆµÅB1R‚pÃÐQµ’”ƺˆéõûP’ç÷£”E« 1ÆakGXð*®d†_cBU%:†€{ ˹ˆp§ðb"à/p",”±œ#̬¢Rj2‰K ±³)ZΊ™#Vuµù4 ÈÃ7Ê2sÖQaÖ# «`ŒÃ¦‹n0U7aJM1÷ša¦<Œ:7“ð#0{†Gè¦R11U¥œÉºÈåR°os]ˆ¦Œ&âæ( ’7P38Ï|=ÎáT™Æb©,ö„•p™Œq‘^";Üæî­Ø¬Á™ÉŸEiAPut7ü=Œ~Aïºæ8¸t‹ u±²+0ì‘ö,¨+X+†GbÀ¥r$&Ê!¼‡ø &í>"* ¬NðIAiëtʪDM’"­„ÂòÒ"ø‚äº2¡ºµÑZ#].Øcæ;[ÜÙb"¶¸ m­«XçªÊ•3±ex¾ü—æ–t–-ÿ…ðm ²‹ð*W4Îê=Q@„¾mÆ(׈T3®È˜ÚZU:ŠH¦gK±gD`Dd—ш0ºéz(©´»¥¢3*jF0¬>C6kÑwoæÔ.Dvÿm¬Ë…È8 8[OjáÜ"Œùªi©¹S8„„i,Á‰’G*ó"ºät•ÙI˜sZwês.Í“(³¸}Ñ\KhàÛa -§ðn.µÐ7EJ}t~¬ªªˆ‚mÌÔ†1‚ŽÑ<1Ó]q¿¡L-W«i²TÕ²*Òû¬Láœ6¡äÒñ·pÉÜ:ŒBô䯤5!NÞ©&3µÃEÔDû:@1¦õ̂ʅÏ`œo˜•ya¡`㋱½sµYs¨yáÈò#ÿzÉ L¯…¿™ÆÙL„°m뀳õ+ý§×ÄPÞêÕFÏŸÊì¦ö ôç/#Ž¿Ê׿øåð%ÙPèøìÝèšóÂw«¥Â/*þˆx· À—orÓ$“Òn"V€ÕW·,±©ÊuS°¤Å]Xtó¾FO²_mCû™!2øLÛmÉ̫ݻ@UHêVü0 >w÷bÚX1àÊÔ¿@1îCð8È$‚'ƒwÖÚq™®×æ7£¦PÒàT:,e"š^ÖȤèÖéúOZ1:JÆ›óÏÍp…ŠE+FGq Tá¡ið=xÄ—Ã#2})3âkqí¨ÑŸõÂÏà1gÛ‰O]B*ÁÏ`¸åæÕ*ÖY,[s(@uû´¾Ô¹¦ñ'è"OˆÜ{fT` åÌA{Ôð=ø™ ®àgàÙì{(y[¸[! aOÐ!åhôÉu”¦ ðh.â=Ç3[ÙÖrCdöz¡ &ˆ·&{9…G”g„÷Ç85¦gRô=eLoèLÉ:-'j%ž›ÅVµ8ƒS:Ê”§¢u¯¿ƒ»¢±·¥g$ÓìæìÔ«FÆõW®_¯RÆp>%à3*¹øÜZ«æÂ@l@uÞÂl„`u^0( qðä½éŸàŠâÕÍv›rA^BïvÃϨ [‡(ÞÕH¼ÀqÜ¢ ³‚™K™f:ªF³`db|Åê<ÆJ|jüž1œØöãSCˆ ï©¡hƧs]¤þ83A²ªUÿ–+µ€kÁVUƒ±¹“9™ŽDTøhú”Ý8o"l‚ˆ1•ªB—>`1ŠñÅé&,¬°ïÕôËf8I¶ž¼¹xfún¶%ßôª1|DVüŠÓ»# ¤ÛÍl‚H£WѪ;n3øðÉŽ.) î’1Ê`M’èO¬«}*ϲÑ-IÎÕ»ò,¬]tÖ€­¹ÕŠ‚ o0™Á*ÞkUrÁÒZS”¡hµ]´ `b·5ÀÓPÕ‘HÅüÞ²Ž¨+En®0׋ À•ÅÛ€æÌxt•{}%qYQ8gEÁ!c g­á<3|˜…‡OàÔ|i£çÁ+Ìw°ÎýcòÞrÚ©ÅÆoËæ5{Êá„ÙƒLž$¾†ÕRÅ&@ÄŽß÷ò´.dD3T·8¥âïò]êÆ8†OŸÁâ¿n޳ô©ˆŸ@3®}ýÖ¤\m$žã[?®Æl²GjöøÇ[kawi»ºá7Yι²§rš!åó`+QXˆìÆÓZŒ§²ªæO¸¨‹0‘†"¾{ _¢<Š2ùp9—‚Љ¿GûruQŠ>¦@ÌQ°ú‹ Î M Éi^—M9 _ezƤm ’¡ôš€ÁÎ$ ß6^!JXˆ®™£8Œ‰DI»Á<šÀœü©²nô¶vþ´ý;È–×ð-(Kn¢Õ½ñN k]ž&ÀÞn¬¡Ì!yGi®êç„À”Ãf»D•¨‰ÐÆv ̬£TæÍQ“®ÜÌ…ÿÛµÓ«f¾ä µÕ¦Ù5öçÆ£À® §®~y-_xsElÏäòöáÄ‚Å# øæ„Öd°ÑÙÚµâÚÕ£çQ–ãX"‹#xÂ{T°ôUñ…Ñ }Ã@€(ævp…Áÿ’ˆJYÜ$R7ÁJõ¶ ()ïMÛÍ©7ÖåœxmV½ñ9+j×)½Qˆ‡ã/Åšqü‡‰â3y'ØË‰¹•jkN]¦1sâ&Ô ã[b¼Õ51÷˜“K7nŽ?6'—nê98RÀfËxEønœxÍpŒ‹Ä J¬Ñå¢-Õôw¬ 3roÔsœ—›v.o2“c…à™ÇÏà»Çz>¡1匼ߨÖug’wT[ÌñcScæ(Øî¹3«Yð‘!t½'xL3@aù›[s¬|õ|Ãæö"o3‚¼fÓG ^ÆNÁ§ÆR8£-Ûú9Çl+؇ißΑ!²"ñÙJ¨U[(k –µ˜W¬Q¨!¬ Óuq®ª©X…w¬­æÔ¨¬Ý£Ö6sâÛ”ý«ÎÃk>œ?¿yŽÿ>#þ–…Ÿ“ý¸{„9°àyc¼h»¯x Ë«Yw“¾âåõ©•ÛúeQω P˜„é„0Šo ßÉn9’åDX炇bŶŽ`UpºrFð„¬Á¢)‹vNl!§vg\¥þV¹=ViÚ§Ž¸­Ž‡+¸111&¢“Ðc ÷>&&èŽvú=½uÀÅÜ£K„f^cãEóøØ‚ø±q^qͧUÇà»íµýŒ´ÌÚµuÀ:w-­Øµ´g}'嬖¶ Åö>_#ugtöXhâ&xÌAïŒx{ÕËNÒD5-¿nŠPÕÝùµÈ¯÷xäJ¹¿9ëB;ûOÌþna¹n‰ÛSó^ ­$àÝâ8$ a%z0ãÈ‚iÄtŽN?¨È.d,Óµ Ê`Ç_«ˆìéýg—ÙÜXD‹s¦‘9&pb kS¥Û#”ð¼­\lC6Â?˜iãb†Pæ0+lë°fÅyIµÕÕ=^É\7@ç”o{ÇìË"Æ]ŽˆpnFâãÂ?Åìxº/w¹ˆ1 ƒâ_ºª-#{wmã5éOÌÔ¯a 08Ä?—>ÊèÊÉeTcL¨†`ú€_µUjÀ;3·ÑŸ Ï#N-Ȥ1§w\¢‘»Í©£½]¨Òßšo›q®á™ß©í@M(‰¡ì)ÎþN?Á^Wš0´9¾'oãµæhÖŸq…E+Ãê £‰ÉNH“  ~Sc·é“Ÿ—>°œÓ‘ëÀ˜Å “‹q¬ëM— ŒUGé@ ï 47Æs#Ø*õt1•<•Hcçï´KÂ’Ù2I)KÊ6&ŒÆ·%\§²²U¹½HŒ¦„IÀ<“9omIgë¦Ü ÌÿQìŒB« ¦ë9áxH([[BQ™>0’Œ0ÒäÛʆÚÀ[ë4÷´lB¼ºª¨7š$»1³Ãù„¡D‰©]vg’ÝI½«ÎiÈ©¼aœ ŽÑò* ¤ê«P.!€ïÑÍ \s:ΑѦÂ3ÄÍE8^•“´ða§ såâèD`s%®˜×F¨)x{&oeù})PU(›c…ØM@,¨ ®9Ž Bj4â ˜ a ×Bhú*ÜCøtFgft/ÂÁK•m3õŒÏÆðÖUçâ$îÐÓo°Ç Óly˜)rÂS:O½ d ae²7TÝÙÂ]7díâ1øˆº›˜dFL»ª¢O·;OŸ’J“JÜþxm£2GÅZ'Áu(»F%Úµ¸3¼OŒ»—Èà뀒ÁaXÏ¡›l6½ª&AíºiŸºª#%SÔ 1»Ÿ‚|gÅ)ºWÁºÅ×B0ù®ýëU®™ÆsR±ÉD¤U‰P(‹a¢£øN™† ’4œJÙK±0¡¨º'B/T¥¾ª(J\;•‹©;h³t-8†Èü!^é%Œ33Wv]¦ÆoÝ@SœªÚL­Rè©gL½á^ÏÖL >ô¾Q:ÃJ™Î*C>Öç§ ÄߌLˆ¾E4¸\,ªë‡Ä¢Ü“%ž{ƒ ]b&cì/ìú.^´ûj%˜2‡µ1¡Ø\Ü ³Ñäu]§!¸uÓƒ)qI¸•–±ß]06bî%Uö =ƒWT†dé‘A“4#+WPb¦ÂÐåû›0<ŒçÉIó^k]å¿Ý¥û–]º«ÖhUÊ„"rp°N„ÝCfÓdaÌï‘ÁÛWYøE»wêÿV°¦µ‚1mÖO$^ÅJŸ2P~[ßPL·;¬j5¡nV75 I×Ö`$2“rd”‘ˆŽ)XœÊ›¶¡G.ç&W¡Õis{•GRn©Ì~ÍU™­ú”~lSò­ŸÁd‚…(Τ窄ã"b¢ÔtœéêS/yU'«ê¸¥DÈâÝŒÝBbÝÎÌÜ2£¬™æ»„h\sx §š õ~¸·£J1!‚Á¤šËRm‘ÔÿìL(,U”¼-ÕH0V€ÀœŽ£¢/SÜý„ÚuD§Á Ô~¤÷iùË*Í6U:¢ç'æ Öå¬ÕS <¯|@+mD'¤Æ-ÚøãánUħ&Nà D»’í¨³åZÑ…A ŸÁ+®˜ø>#5Íèy„•ÞÉ÷¾ ÍÀ¡¢ÜZ©á äsx6á=˜£@jÒå5x´+Þ óAïÔà0wŠ¡ƒ‡Øâ@ˆb<ÀÐÁ´ @‡àÆ¥ÍÇQÊ¢ýaåÍH{‡yg&iO +íuÏvR¸´Õš!V<~óe]m—‘ ª'Àt&@K|j¸²üýŒe_Zšør–»ŒkYù9”ºMMžÍb-eí×8uìiަz¥½Æ«çú§Î Wœ®y/Z¡•îzÊ“í%gè>Ó¢g:´¾8ƒFßA5ô==S<ÄŸÀvŽ@ËPy>ÛU•©O8P£ÎÆœŸO§ÒíVÁ[€ßcÚøá{ÔˆqĵZ5‰†É㸠“ƒ¥:RUw ©nÿ®^B…(er5q$˜irÀäÞ«ÂgªñZͰ›IµðC#²ufäó¥Õ \UŒ+—3ÁÖÉy²ñÁ·Q#|˜¾Ø8•µ¥ùIç·wÎÄ#ò ”#ÏÓs/ºÒÛ,Jxínfv¢cg½ÃFtˆ Á7Â}…ŸN€Û˜WŽjljváô(¿ÁáìÜ€0ðøløp¸žMx&—û7£{±.ç¸&tÃXC‘î`wãxdOVàŒcø{t¯˜ A1ìN€wÃÜsUxW0¯a0䥋êüçøíL¸"]ûT’fP 5îT˜‹||ê³ÚõƒRޯ简+äìÉ>vêãHÕ_é\föTõ|*ê„Ñ{ÜXNâÐÙº/í—*U#–šE$N¯úØ!ÍÐöõˆÆ6ðïŸét9õé/ á.?ŸøvrØ¡¥‹F¡FŒþïëïûªÎe@\ ïNÉÙ¸÷Àï1cž-Ì‚øÓ±þ!ÌjÒ(s ãè\÷Z0ðñ©‚'ƒbð™ º¢ ?áH]þÆ”*ÜmCü¶ïafïcÏÎâŠuáNDÈ!«³/’™GÕ†ÏÇχÿ>¨ïq endstream endobj 4732 0 obj 6001 endobj 4736 0 obj [245 /XYZ 38.2500000 431.750000 0] endobj 4737 0 obj [245 /XYZ 37.5000000 394.250000 0] endobj 4738 0 obj [245 /XYZ 37.5000000 394.250000 0] endobj 4739 0 obj [245 /XYZ 38.2500000 431.750000 0] endobj 4740 0 obj << /Type /Annot /Subtype /Link /Rect [459 672.500000 498.750000 679.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 4741 0 obj << /Type /Annot /Subtype /Link /Rect [187.500000 410 224.250000 416.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enumerations >> endobj 4735 0 obj << /Type /Page /Parent 2 0 R /Contents 4742 0 R /Resources 4744 0 R /Annots 4745 0 R /MediaBox [0 0 595 842] >> endobj 4744 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4745 0 obj [ 4740 0 R 4741 0 R ] endobj 4742 0 obj << /Length 4743 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€{E‘zA€}È!ÀbÈÁÈ!°ã†mdãCþ~Ô-uÏ´¤KÅ"¥fÉl†+²X¬w‹oþüåÙ¿~ÏÞ¼ÿòŸì‡áçû/§ü\—yÿŸìòç»×¿(šóð÷¬nÊì‡_Oß²o§Ï§ÏÝÿ~;õ|yÿ×îoÿËŠì/Ýξÿ{÷ˇtù¿žjUw?¹þlkÕý-¿ÿ¼üþß§¿ý!ûí2ãm¹˜Çÿÿ]¡ë¦½‚±°ô·Óm›êúç÷~;½éà¶Š©ËºÍ3e´ÉTkŠì¿ÿ<ýÔ-p›>?·F©º2u¾e¡º¸®”™*ºå´.' ]ÿðL¯ø'¯r]y›¼‡œ+JWÊ>;ãáVEYö*kè¿ÏîãlµRþ&¿BΔáhñäœ'«+Ó£§õÀµ/³û@¾)dsœ)·“…“sžl©ó=uå?÷Ù} ¿Ê= „+äÜH¹,œœód«N&ø“Æ÷Ù} ¿VÚ#Ù\ ÷%áäœ'ÛæµGi|ŸÝòë<÷¨g¯û’ÆprÆ“­ór ü¶“ý°_úã«&WþÌãrv¬ g;ý³Ë,”þ7À…ûfùðÝ×Ó›Oʨ™Uöõ§¸ëšý¯RÊì»Î¬or“}ý1ûcÇUæOÙןOí¹³o .ä޼‡#ïàH!¨ÐHÑrΦjw¨Ž(8‚aƒ5ó Ž`Ø Þ>9›å¼Nã~rÓĦ7 oÝéS">¼SÌ?ú£;lR¼…ñÄ5æ¬C O²]Âó!ÈË7ð|,² ÓÆÞ)A^ë~?¿vêÉ»f)ôÍBÒF¿˜.±þ€2@Ã^N·È¬?Â˧VÆL±^ôAH›M”ì¬dgEagE¯uÚ6i˜´¦$A=Ѫf'z¢-«¤'6é ?bn€Þ‰å¸SŒ ÔÁýWË7XŽa "$­°¦Jö‚œ½`¡*H½žOìÖGÛý¶>qæx!~ÃK9ÔG³ÍDm¦vKf@Ðfª:á̾j –4y¿du3(õøêª¼bal4ç¦ÍG†£ŸéÞœîë ÇJKé³.Õ}´f6ƒf³ÀV¡‘á°ç¾éÙ¬Y³ < \Ï6p¾Ûl)xŒ.‘¯Þ‘B9u §Ïш†#ƒ¨ÖçÒTMýA Gôú³ÅœL2ùþvB\ã_í~¢ÓY ä‡1=(«q2dœÎŒ…,¼b!%ÞÙ€Ðñ)üK3’þ<,¯1O[hp‘ 0$$y@U–ã%懲ˆ&¨B¦þü\Õêÿ= «òœ·úuoáúð–*nC›”^‡Â¬SÏ¢÷)QGÌoØöÁÚPÊÕ¦XÒ:HÈr‹ÙÃ&Ž(úSåäÖ†g¾¥œ Å>ÃÁ³øòÌ#rØKÀzT•Òc¸>êOŠüOhÞÂåÿÙBWxÛgüO)ÐO#z-ÖG‹—M¤|=6…„‰ESì‚ÏOÊK…ë©™ò ¥XâÓ1‡¿\4”C¦#×RœÊ§w¨Šj¬7ú5¹Ã¬ÖmA¹lÁ4£-H Â=jõ;Qõ'¢¦'rEì¯×¾fÙ5–P¾þÍ/§/Þ®¬[â“€kM>L iüëŠ\·89tÕè?L¨òj‘êI‚)éP¼ãÅÄó*÷›1º±Ø§¤>  {¤pÚDÑS( ƒ$U•ªŒº‘0%ÖN ûH%ÛYKÇ"Œ)s†TÜTØÑ”ÒÊl„t©…îxÓ²×u·á=i iR2oGHq1B'ôyë çkÊ‘³”9’>¡Ýyÿæ#Ê ŠP1)µC°;-Å+¨)Ú%b±âèM¾…¥øÙ!ðH¹ÕÁb7J¥0)tŸ%³U3Òfáyz=YQT ‰Òý:D†uÁ}p¾9¼…Ä[Gj‘£¬UÑ$U¼lŽ9Ü̒„è.} Õ*¬Eö\Vè5ʈà¹ú–’j‡W°”(©žM¨-^ò¢ðJÝŽôæ\±ºÖ.p$Ýè`øJñ oS ¿y0±Ô/kÿCR°†B«RB¬]Lve~„7•I†*G7:ÏÉoJªÑÀûy|ZŸ9¨Ž>GZÑ‚ª±AI“r'p–¦¶x.vRp‡1©ÿ¤þ“úŸÅßûC­PæñìݰÁëPĤ<‡×°”‘·ÞµZYND@“Vc*ØyMkàåá/q0 uË Rî_"zE ÕUDÊIñ}1‘ЄÀÁ¸ Ö‹7Ggñ)&$% Ázý(tW0)ƒÔ¯ùTMì'­$ƒlk ?ñeylÑ{ˆZÕóv›Ç€Õ(¥Ô’£ž§]Á§ •“COŸÔæ›ÐØ‹ä©OsìE¤X;ñ9¢ñ´Üž"®½{J¹6«ÅɉòQÍî!M1O;¾BÛQûXé²O‘NøËZ¤èB>{åOÌ/ÿ¡½¶ËçÅüø®ô­9Òçi¥Æ\Ø;Ö"’±mÝÖtãtGWP®á‹B¤x8tb,Jà uÊ#$ÇÔþM4Ž©[¤\*—’(d¯"•OJ²W !dÛ,šöœ-eTµOuõâˆÌô½ µTãkÓÞ '·ž§ñµßû+̬<ß¹`=A’w8v¦^Ù V}>¥.ÖBZ¨ýÛ¾˜’PéÀe÷\F+’Ýñ™‘3j¤ùx{Ü8<²f ³9¤õ°dÅGå¦<:ÿôRi”uüB"0šæÅníƒtö#ÿð%(¡F‚±¦}-f&ŠÎá±MŽ+_Ì×變_ï]©¡5Ù ¦£‰þx}Â÷¶hWp‹íŸõ æ=H½â¹”aöÌJzhÉÿЦ]Üû$~­‹ÕÄO’ƒëŸL.¤®;”êƒl”ÃãÖšz´5 GS*)<_Påh(YòPVú§Ä…%‹!{–Îà¨8¹@—S\i·à‰%¾‹W+(©)n«¦‚ލ©"] MC=ÐNÌC+]?‚9g)íá!ŒcÄxƒ%^ƒ½]@ºÒ#õrÀrÁR„ŸÊÝS¹û6âõújp5Òf‘ÒWã÷œ½ éS!½¤ß•Š`Åb"©ôý€gÊêãŠAí£€Úm§ô"g7ØØJ”›Lµ³ÍË{ëãâ3ÀôKv¾t_¢ñ í¶Vž P×áôÍ hæ¾iÑ7¹ªbÚ¯¹gæK^hœ+ùG†Ùª›A¸‚ÁRœz°–g¾ÚÜ7­ûÈ`Háoü‡dê{#Áð%º.…ÉâvÓ)u$ñÅ´\êî–žˆv+E Ô—ã†v”ÎêB…Œë¿¦£ÂU޾”êAPö¿Y%a•ƒ„-Ê‘ˆ}ÑËK#R²‰7z5z˜½?5=‘ b¯xmÏ—ï=•…yý‹_N_,ZÑ:½€0Ò§˜QX*ÂP"åÑÉŽ'²Ê!cãù¹;Þ7G¾ §-64†tÒˆYCyœM¨Á‰TK2©´©¨Âf‘ø”7à•¿ÏòµN ?Jc©FM”n{$b¤´ãê};%|…|€þÈÔ§CcÌL^ä9¤w±K8[ƒ$9»k$É!]ÿº&¯©I¬„ßsÇ݃Åû°¢PœI‡ùS{ï¶1õã’sòdI]ºÝÖßXoÂon—Ig¾iôóœåøâ @ß !ÿ¹C¤ÅÕˆôð:x§Ør¸ŸpdHɘs¡FJCð~Áusò0F±²t>¿¹1YrZ–=Ý@çõ&,öW°&¼™2‹}W¥ÝSœRÑMÙWò \ áE®À.äÅü(³Ò˜‘6 _`p4 huqkî‹PŒëËpÍ-®;ÆṲ{®¸ßȳáâz`Xs+u?ØRCŒë ñ)àupõ†Ïq`Ø¬àŒ²]ä kf1~-•åø!æ&|ZxBU(®/JøÀ]ÅçX7ÂÜm©¾†¸Â°az±ð#®pÆ7(R‘µº×@¨ Æä J%5^Ækà-Uë˜Ó±f€´S@xoàš~…u:Æ(ë½Ë݈Q UÁ٠ʬ ‚ï´Ä'‡gÛ%®«ý½ê){´°îôëmÉ-”‹r4n‹5­ï=I*Fˆ¹u}Š9(æPçMõHÓNvwøÍØC&ÝÄÃ9ÜåŽ!îb€àC&ïGôq˜Zåå2æñÊÄ̸Ï~ÏÛ¼Q‹$¦ô?¤`”€ƒ£6ŽNâX?/àu¢ˆ‚Öª0IK$-‘´Äʆ'Í…4KpÚ±h# ½Q2qh=£—)6i½¤õžJ¦ÅœûKZ/ ¡h½ð´½VË””´QÒFO%kŽVÓ‘4X TEòÛvIoÑk½F%­—´^Òz+w*Uß—ôT t^Oa á"îS»Æ¡C Õ.sFÒ¡r:T¨ã:éö®Ãò ßT#àÍr 7ô–—áMÝlàM?ã,¦ |¯ó^‡Pý÷D´,©Êz%ñ½s°Òö ë¡-bñ›x_'!¼>i sCÄ;ݯnÑjKÕVÒ-9³nÁ¾åå­84ˆÖ[j$$5ˆ®Ÿ/’˜¢u1DiÂKœõ¶èdJßB¿¬_“Ÿœsû±[,í2<Ì ¦1B -? Y°ƒ­¶Ä›¶âþH8úHèVƒ±cÑüøÝOx¦%Ä5Ib͹ÁS dãp]ö†3Ñ&ß’éˆyäy¨ïÔðö‰Û%v †:a‡T•@‘σÑÁc‘Þ…t.,Å8G±IÐô‡dÔØ˜-yGÒæ3 R"RÑ,¡n–Û›”H5á›Ox¦x/U•Ø“Åô&i UÕâî¤è©×Z¬ÜW&y‹É[Ĩ¨„l¶T„Å<’≮©\JFKzde.^+F°-˜Ê)÷„¤î#aà !‚n±Ä <ƒûYÎWÅQÞÈ x#Xsãê%l!`ËŸ¶o •U”·[(÷Å,U‹?ü+*–$ŸðyªØ°Çs×hÊÉQ(„dã°VUP^†’ò§6ðœŒõSl©bN#i$¤‘4’FÒÈÚ‘ç‰ÅÑ¢4[úJÞÔ*›Mt…½lÂQ’U# ©g%ó-àðrLìö(E:Þ*[éoR¤Ÿ0¥.ã`4Æ[‰t4ìHZ•ï?ó4ÜÞò<ŸáâL ¦7R ˜$oê½tç©j?Ýy’Åž,öd±/ž¡Ÿfê­?Yo…ªÝE…Ï.-½ä7Å€IÛ¬VÒãçá¦ð²|Ÿ|o¯9°û“}ëXÍʉŸ—þÁ"«¶Y3ǦZésgˆwf÷·k>)ϺhÔô1¶ësiª¦.§Ø.Î…º¼éñSMGÏ«8We¡œö˜³Ñ×O&g7³Î`WÌ|3XÒs°}vZ Œ)nn¶ÞÊ7/ åX5l}²ÁAHÍM_ö¡ðlð›¼w¾”ÓÖë²¥ÜåïÄ7È?¢µ†ç0H“ &sÃwÿû©Ó67ÛGD¸ßCñßÜløôð:p? ³J,”égpŒæ(«±Ž…3—ˆÐÏy#CMaxaDüÆBLúÓX>âéß­þ§–³ÈcH–é'”9ùÅÒ·›¤bëó QWŠG(êÁ9ØKvEöùôF$ endstream endobj 4743 0 obj 4928 endobj 4747 0 obj [246 /XYZ 37.5000000 628.250000 0] endobj 4748 0 obj [246 /XYZ 37.5000000 173.750000 0] endobj 4749 0 obj [246 /XYZ 37.5000000 173.750000 0] endobj 4750 0 obj [246 /XYZ 37.5000000 628.250000 0] endobj 4751 0 obj << /Type /Annot /Subtype /Link /Rect [273.750000 189.500000 405 196.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes >> endobj 4746 0 obj << /Type /Page /Parent 2 0 R /Contents 4752 0 R /Resources 4754 0 R /Annots 4755 0 R /MediaBox [0 0 595 842] >> endobj 4754 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4755 0 obj [ 4751 0 R ] endobj 4752 0 obj << /Length 4753 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤$J@Àu€6Ã"‡À›M°Ø]ÄÙCþ~º§¥™i©¿RóY’º#±3‘ÅzW±ÈzóçÏÿØÿë÷ý›÷Ÿÿ³ÿÚýýþó®8øª8ÿgúóÝëØæÐý{ï›jÿõ×Ý·ý·Ý§Ý§ãÿ~Û?øüþ¯Çýoo÷9þ÷çý?þðÇî—N¿ðëÎüû—§¿[oŽÿ*žÿ>ýüß»¿ýaÿÛiÆ~¹˜ËÿÿuMS×'0&–þ¶ë·ižþüþõ·Ý›3ÂV)½÷ÎîMéʽiK»ÿï?w?è§/miŒ¯K_ÌYÈÛÓJEåöƶGÜÔåh¡§?q¦7ñ'o S'›ü yt¬WyöˆÄm¬íÔV Ðÿ<{ Ú:[¤›ü òØHéH‹'IYwüë =M•‚´ÏÓ'À~›–oNGÇJO[<{Dâ¶¥óéÄöeö´­œI7ùä‰ÄO“²UӛæNý&µm}Ý$ä›äѱÒÓv4û§Y0(çŸð›ðá»/»7MiŽÈ¬÷_~:÷´æù¯/G¤TûïNn`yýqÿÇ¢0åŸö_~Þµ‡ÚV=ˆ)FŠŽÔp¤…#oш- lp‹¡¶á;µÄ7ZØ1à7ßÑp§ïÂq]a¼UhÄwúý—£x%—ŒºšÁåMáæÈ£ƒ#ïÃ9ÎaþÅ|…år°SÈ=x6 5þFÀÞ)–G ¤c”¡©Á4ÅûY\Ãaý/ÐjE>p¶ÇáÑå©mîÅV óclÁ;E[`­¶?‡u!(ŒùÅ/ÍcZe›¥š¾Uô›ÒdiJ¥±@¶)gZ–.sˆ²®©Óh”å9v£™˜¬‰s.¨—MßÎ3Í\Pküpg¹ A‚°t°aXl­&;PB WØy­ˆw×Ò9 ü¦„¼Sb¨±¦ rhx ›Á¹T̉6*ó}¡ƒ¹ ãS›Á5öà ¿ |gše>«¾˜ªo•Yûeƒ5á `ÏÆl½;¬‹•4=cLÜ,™$ œÐÂÖÇøóÒÂv‡¶WðáÞ½áoú×}tÃÈ <逬?fl2Äh¥,³SAõ`͆ÕœÍúÛ="ÙÀ ŸJÅ067êÁî ±0•ËK2Nñbÿ†9VåõBÒ̧o‡'«œ+¾.E0®ŒR¼‰åŠ…—Oê)9”âò($ ›zÌÇU8#˜¬§K[£iL; ›ò¿¤yM?dÉô†×›ÁšI|×´La ;dŠ÷ó’Á–C2Pu«Ì‰û0GÆ›ÇB ë¸Å {óÅöT “÷Ä4e|Âlï—È-VÎ ­\>Jˆr\TàL,“ò#¶!¨•¸ÅÂÚm–P¦½öqoi†8[‘p_>`gîf¯€y½àÞº© æq"Æôǽԧt‡o4Ĺú³b4GÍ©£fµ›ÚGŠ÷lœ"ÆNüL¤ìáNŸÈMiªvˆÃ‡÷“RV:?@÷b˜ÖM"á8,F4so:¯Rzõˆ²[Ëçňû+‘_pZaI¥E ÓðÂÄqÍj2êi­}ÕÈ¿2U°‚\(êXË+â —ÆGF=åšÕÐ{w!H†¼ˆu C\P¥¢Œ-á1sqù0¯ƒ]+Fèç8ïý%–xÉ‚^Š:ëöº¾\òZµÇ”ÃÔe_6¬µà7êÎŽãóÖ+m Ì™ãêƒ}úù5ïcì\Y4Ò¥®‘¯¡v„2ìÃ(„@ØOqðŽœ-ž){$ !HÉü¶p§kpĦ…0­°AÁØÕº®mŸ´ªs˜ŒêãR6æf}Üôf£á[ÃŒ‘Nz¢>Æøœ‚k±Ø-µ¸GLë«wºÛ³­(î£Ö±hŒ+ãe´G&ûv5¶j/ù'Ræ÷T¥W`—s¦s^IôYŸq(¬ÓÜ)u`†/YEËlÝÀc¾™ä±®v6蘎éÁ(ð%æ>¼Ñ5ÔÁgTl¿Á­õzü5¶õÊr"t˜„¸ú!â®éX‚p>3úSó%Öpj¡s<îuÊôz×}`è¿A Är&ô“&p€Ï/ðWƒ­#Æ(æ†rQ_Â8:ŽÔ^~§¦žm“¸tÔäñìÔD®ÃU¶WÃ]Hq¥+l×/¶:­» q—\´ýÐÐD„Uã39jâ©'ªðœ¹l¨w/fçÌÖý¦4ï²x>ðÇtývX‰0E‚s“Cí@‡/m9yÝÀCgߥ›³ïÅÃ&­ „;S!…Mj;ƒ&« ¿tpÕ˜9ü»É@D¿'b-øÅ¡&Ö¥ð*Ÿ•kfÐ~£þöÕ˜BZ⮀QÈåÂ:÷yG)Ho` \‡¿ZU~†lRòŒ=:Ì8å ¯ƒõræe]Ëàëœä¢UƒNCZ›9qÝ6ms<+p)þ&®å}˜¼ÆÃ½(dy³—SĶ +÷ej7'EÜ™®)aùT×~Ü™dàbìàcíÇá7\®Ç@ °1%h¸”Ù)¦¶–¥„Pk•îaú0CÀDãšQO]ÍÊË3ñæ1¢›ÄS2òq0ÚÅ:Ú»]¾Í§t[åØl?8û¡çû¢M"›TÕ #DàÞ2”+Ð5JùAa§Ù“§4±¦Wá휻œ‡\·læ¨'G=ÛŽz|©]g˜#¥Up¹Ö馦__Ï©Z¤xŒ8™ʯgÎȈj‹í3Ö˜ Ø·#êH™ á.¦~rðo—¿#,<õ…ÏÈrݪëš&)§cC›jš+òHÉ#w9ÂX*2‰ZÓÃ<™¨•ѲÕ—¹6¢m6Åœ›gšwäšrN]«àñM‰(IÅQ¯Þ™O»Ý;ÎM­]/Gåk°ŽÔzîx“Z:ò ÁGÅ›ðÎ\gX~ÃOº†ûxDÕ¾6s$]Ó¾¶&Í;*Ù¾®Û¾æ›ÌŃÝdnú«,ÙcÙ¨Çò8xÓô ÚJûŒ7{ž±!ÈrÆÉöË…+š²éçœ)zìmaæ¼H’=ö­zì÷¶ÓhE­:²uGmáÔߎȑAŽ V!›™CTý¬¶¨ÔßÈ1кc l rÖk?GÒ5£0Säs“W#ùeúÒ"šÁ”sr¦÷&gÛ|={Íõé÷æ®#£`jíJü,ékt-[»ÍHGèí¦iQ›Ôþ¶¶pÑW•[·¶êÝzׇ‹¾®ž°0ŒHÍkµ© àµe8Ôg¡mnIh^ëÂG`‰îÉTbŒb¼Î]]HpmaŒâ nk‡M†×ܯãÌ` ëŒÈƒyIà‹M* A™Îâ„’¤â táB’„WZ±êh1/ÍXç¿YÜ\7™¿] ]ç!ŽaÄÓcè)aw„é ^ªå†îŒE'¬‹š÷”Ù{…ìÍÌÖ…gAÆ‹r«0ŸC!;P6Êa£1Ú@¼1Ô>ëcúé^´À[â›>!íºnIoXÍ›C˪å‡Ý.ßö=Â*ã šš‰%±úeâOl ±|c®Ç¿=â¹]C¯Æ¢¦Mãk†Y•$‰»”roËv(÷ؼøaŒ›gsX­ÄÕôXRoWR”ŠH¡¥eþ>¡èŸYË'M)EÌø¦"ó‰šý¹ùXö½0’£Á± RV…Aã o@!m, ¸8Ç̊wfgÒ*˜¹FiäQLéë¡QŠ›ˆÂ\×Ç:ZTîN¼µV ,£GñÎx`ãxg}bc΄P ù /2G€Q3R˜‹1» –…ˆk·×gOs.{:S’ÐZ¶~ÂyDUÊv 7Ë8¼‚ÏE¤»V'ÒÙ” ÇŠ«<[Ô@Á ˲8Ë«¤(.7q±‚(j-gZäW(¡kŸó8Œf¨±nŠšªjA-GõkÃ3²)3y•pÀš4µ4<‰øo{åFBšÛÖÕPê•îA•8gï4¥¸UžP¢\m†ØÕ5Íi™ÇµõBÌ£|‰.¥ÕmÜí,‚]À¸'LN%Ê!ù$Sjo.\3*NJ_¯ÙŒ|&-Ç7'VölJ@ïíDínÃû\ªVZZ"î Т) Q“–MVí†Bœ'Ê…¨¹uÊLÆ-D1Uò‚³.Oéž;PbŒÙÀwÓêŽîEçi3ÙÕ¨5w‘¯31ÇÌÿæÒ|H`¬+‡³¸ëJñ¸Ò¹§`ý|ã‰Jñ7Œnˆ#•j¨ƒ÷(5h„n¯g'hëiŸtáµÆ7ÿü“›L…¹ÝTÔU54r§d™:RA2ñq|·Y¢€èûLÚ([h!ž=곚4c5yÒvOÊ®=œ¾?廊‹Ÿü²û,8Ýi¼õ':8àöÆWÀi æ攉qLÜÏѾˆj*Y BÇ8?à F Zp©ç˜—ˆ¬Ô/Uhår!tßÉPÈ÷½ô?¼]ÇQ·ÒÆŒ‘¯J€”pz4(Ôe“¼¿\òš¢™2a>(ü6âoÌGøM;a°®åÎßAXôMA@ðÜ e4Ûóýôñ“ñЈ2PÃo0Ôx§7åÁš4D{‡2¿3îï$热°vÀ؆ å\šZ/‡1A,UDÆxQJ‰jÁR½½Ù«QKÖD ˜ ¡© á¢s…¸°‰_JeÜÑÛQ}wï®7X~K O?¹]>7àq¸5SDO´€ªªq ,â©ý’i^· …³AØpÃᙌQ¢©®”Ç퀄¶£qÛsák#o¥©i'¥Éá&g¿L{ AãräeÜÚVh>†(¶L¨^š})i„Çix<Ù°&L—C¨KŒÜk8 \Ãf°.ǶK:¶&w„Ö$ðSwøÒžÁ~Æ(æ†røá<ˆQ«àlÂ}µ—ßi…)‡gÛ$®'Ûâ$µS)”ªî»å%Ýý¸êP´î2îÆeìg5ll?44‘ŽÉgÜÐ{€ªÕå¯Gå„Yq%©²| ÓÒï3j¦'jS_n.ÈÝvØÙ%’L¼5÷É]u—ÎG zt¤ÉÍéÒ™%0¶枟z¡ý=vö¬«9=³†ü'L?âÌѦ¾¥}áE½Q=BUg_:Lº ŸöŸvÿ·aØò endstream endobj 4753 0 obj 4991 endobj 4757 0 obj [247 /XYZ 38.2500000 743 0] endobj 4758 0 obj [247 /XYZ 38.2500000 743 0] endobj 4759 0 obj << /Type /Annot /Subtype /Link /Rect [247.500000 634.250000 315.750000 641 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_advanced_renaming >> endobj 4756 0 obj << /Type /Page /Parent 2 0 R /Contents 4760 0 R /Resources 4762 0 R /Annots 4763 0 R /MediaBox [0 0 595 842] >> endobj 4762 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 4763 0 obj [ 4759 0 R ] endobj 4760 0 obj << /Length 4761 0 R /Filter /FlateDecode >> stream xœí]A¯ä8n¾¿_QçScI¶%ÁÓ=ÝrИrXäÌf6X¼·Hgùû©gËeIö'—iJvù9ƒlWËm‰þH‘EQ?ÿËoÿyùë?.?þí.¿Û??ÿöR\uUtÿwyÿï'·Aš«ý}ѦºüþöòãòãåÛË·Ûÿþxé^øíó¿Ý~ýßE^þõöÿ»üù?n±ÿèý¼½h¡o¾¶6ZÜ~÷?ßÛÿûåßÿéò÷÷ûá,1þß’ª1J¿“13ô—þ3Eûß?~ÿûËÏËF)uSëò"JuûŸ¦”—ÿý¯—?nôÝצB×¥.Ö ¤åûH•Q!›[O¦ ÔþÇÔ}‚ÎumÒuÞRÎŽŠPµˆ÷~{S4u¡M »cËÛ×—â&ïÝ;îM¾ë¦îÿ´ëö×þÕ÷©ð‡3¾Ð²*›Û`ð·?þ}¶Ê¢ìè¸ýðÇ›jh ðÞ ¡á7Åi`bï7·}—Ž ÄºU|ÎGË<¯]ݺïj÷•WÐÕJîÉ‹¨Ô4YUÙSáüR=Òÿ{j˜Z*ÂAßÿž¤€5o^ÃJîÀ#¾®IhíãÓ5¨Vx«á×0¢G‰æÄD¨€  —ŒqƒòèšlçÊrhz8·=l=—Þº_ó@¹,æšjUαjZrýöº}ó5ìj½*ªëcnçµîÇu~ÕIþ» ñi‡Gku;ÓðûÊg —v`Ä»ÕsªEÄþ $3hpÆïg&Ãue¥í½…ÀxÜP»R<Õ+B–'Óãxjˆ¡€VÏÌCÓ‡ ?^={¬á[ ”ñ·ùDÉSß^^{hEÛÐMvÅ`øZÁr{÷àiB»†Þð¬¥GòƿڙÀÔù|ñ ßUÒ·_ƒO5t¦§û‘oøû ­LŒNÀÏðÍ£ä‘1bïjµî¢Õ5è^ö¿†ýÍ-N„Œˆ¥ÄCÂ!#Òîžõb5‰PÀ!ÇO‡WÏžÎð-Ê#cà4—ZwñòÚu mC4ÙÕzÃ× –Ó»OâØ5Xó^”@Èÿ>jgS#äóÅ3|ó@ùä…,fRìj`_±‹@3ö Ú}åtµÞðÉ e_Ý÷TL4X$WÄwøû ­LŒNÀßðÍ£Tx[J{תu­¶Aôêðþk˜þæ'BƤ§ÄEÂ%·–hµXM#äsÈàñ“áճǾ¥@¹d œfRë^n»´bßÐMvÅ`øZÁr{÷àiB»†Þ­¥GòƿڙÀÔù|ñ ßþ¥©ÓuÞRžÊGzçdnUYé/oÏù!ºwŸÿ¦Jgn;ÊÙQé™;êýÛ’^0)] (Oú#òâ§ï/?·UÇEÔ—ï܈kÇìþø~¥ºüô^“Ô˜Ë÷¿\þ¹(Dù§Ë÷¿½4×ZV=‰sO …žÈO艪ao_ᓎŸD¾Ò†Ç¾óeù÷DÅãHøVDI¸AÚ"œ+Г¿¹ !m‘ÞàIøžSðöçœÀ\€‚i«(TpÖw´}ù~SŒ©uš.ô©ÓNö$:­„:MÀÞ°ÞÀRâqXõEîY¯?±”õ©O=ø!õ`EàɃ{JíU •U?ê¯\£ÞÖÚÍÔ7…÷>¤)ú!E7äûÞ[Âhžº}R]eÝ=žÞ‰ŒÓÀqzbDˆkÕ(í=í“úªDÇíPUMP ºE†¾ª¦ÆÑ¨7+ÖSßó>Á° b¤°,:‘(UÏ/=1µæ†á0+:MøEåµT:@¡SæjBä¬ê›xbÝ’©Þà;–ßSOºÞÔµ*kãIBQ¢qð÷b¥TT×"¸âØ[g„…ì=@ü|—ìîƒBX]•4ÂÇ㦠ÌãLÆÝCð#lÁàÿŠ>]õÞŒ ÄO"ã¨àÓ#Ÿ?}Œß¨aÁ»ìt¢¾†Œ9úéáúL[û·HXç`Jìú¾£—Ïbd Ú©J5¡3¨î"Š#nÄ´,˜ÚÛ!©‚Sl\áï‚ÝS$.bþ sùtHu…ê_Z§qñ¬qÃ…§!þ lL Ä*<}(ãýš…R=¥ß×pp žÙxþâÞ°²¡hŠ&È_?6¡)…T-L=wó—°“pÞGÞÅfš²šƒïàÙF¬ˆÑÂv‹öˆ „OÇËHÒ§,9ÉŽlHP jãþâ¬s›!JUËýøƒøLv‹¢Æ"bK˜Ë$îKSZNSrtt§—à°û—S¡FÈïHxòñÀE_‘¼z^ûÏ;©±þe‰œ•ˆŒu ^ ,Ž*-R<ðãU2ÂÊ‘ûL°|,KE’¹¡øíáóÚ¹È5“uÞÒ6Ö lãÑ6ñrm¡E«¬á?’þÇã`n犜P¼‹´Fñã,НË_y†UÄàP‚˜£p ^ƒSR x£ ЦãÞ–ÄèîLÂy#kLœçÊaYç@ µ³$Xäúb^ë…•ïÚk,]¬I&ϹÁEÚ5áðõçx$ÜMJ!Á˜cÇÓ‡çÍ\ ¥ëPÂR Kî˜O§›ôQÜ$!Uå:ë1/5*B-±êGrÈ„ªBWôÙ<²>ʫŬV:¸Û•êž‘Ó9:£TÎQâË Š&Pç¦çRýªš:T°xç*h\ýÖÙöôν¶Uøm´×–V¿HQ⸛D«„sPêrú«s’Ýçf‹«µàj–ËPÒî&F<ºÝÏ<7õ3ä8þ@Sï#³A]n{‰De°à…¦qŠWŒ)+Ò'xÖ´”½ß,›Œ&œ§g–ÝR} kb˜mPÞïå5¼Yò"ŠÏBÉøíc0”8©XøžoºØª |b‚˜•_2hPÝei”Mí³|Y€eîV¦eË)|Ò„÷<Þ3ÁÎÞæ´YAÍ"•¨æ±"œ–¡,˜ñI8Œoİo~þYÂqvÂ{U®à=å‰Âò‚9Œ_x•à áj§¤ïÁ`]ÏÒE(Àï`½Œç¦Xþ=˜j,ÿø$>™§Øö˜˜Ã…á)Ç'ms~ƒ–+¾áÔìÑã€Ú²jöF¬àý©ÙOͧËÿÞ5{-VIù.4{-›§ÙK,¥„ž©xÞGVr„Ù+*loÝ"~Ûž«MíÜ&×¥™Çjïš§Ök¾as›*1”yŸI²ñ;ØÚF´/Ö¤töì¥Sâ/žg™ôåÉ9š.§p.âÇîÃ[5÷{rmØéò~B_&ºà–j®åVfæÛÄ)ô”-¶Ío"f)AÙF¥l|âmG\ó gUâ”(Öê¹ÒZrñ'‚õ§Pšq÷xŸ0E-d:29è÷õa¸ K9ÉÁp¬o㣕=˜<˜¸'ˆ*¤LÔ"À#¢{)W8L¯YÈ3Kï‚„;¬ç(éP”ï¼¥š?1Nª!iÒ9í3´°À|z<œrªÜî L¸ùVŸ‰êZ4Ê'öØ›½Õ^^O²Š<%¹–àíß%vÓ×é0£t°I.$fÑSÖ6Û^¯PüÜHÂbè:’ßã$Hê¦òem*8‡7t©“”«—#Ž) ˆG¶àq†ú$¡Lx$¤ˆ7¦1¢83Ÿ†y¼À¸AnGÅ<=¶ÀOð÷l‹™²Å€âÌõ°Ÿr#t:ekË(A°öÏRšßÚP#î—Ûá´PŒ®^ƒSS(×Y¬+E^"Ru4¯®‰à†õ¤š÷˜C„j<Ó±F¡Ì@ŠvÀèàq°$â'½A9åHJ^"H|dã–à¯DRI°ýHPµ[¨¦îóópœ$²4¥ìQ“”c‘£Õï©ËL%·rm$n1ˆŒƒ1 š:®~ô}rŽ}ƒH¼Ä„3’ž± äÏh¦ tRU†§+£‚o5PÁ;ϦGc±„”'Þ½]oQ*}.Ø5cѾ8Ò"wÇÙ°hd“÷îÝH2/~# LJmJñ>R!„ú>ÎmÆ” %)2Êÿ}ãú¼{ºˆÜ=‘rÖ­I|eûj+x#-²Å¶ù9•}œBhêâœgç<{úy¶íiŸxÐX÷BLÛW¡Ì5<~,‹5E”´Úß1ž£¥{âeâïú ŸÀÜáRB‰d9ñ³y|75æð®ñb¾â$SÒH³¬$sL5Ö¼éfÚûÜÑ >™¶îögƒŸÊ.àÊVKÄøÃÍÞ ñun;—ô†×:ÐÆ›YÐS:™¤s×’>¾güp¤ôÆqé%=ì\M§·äû3Ï;4g+’ßùcCmCÝë¼þ”—Þ›àÓR_8šø®8JÕ BÞ o†QÆÍQ˜¾œ íãMùÈ ÂOd£€÷ÔÄsnm¾ñ±ó‹„(Ö”•ŒH,¥`å„âö|ÄRŽ7 e¤z÷Ö”üC9ˆÜˆO[ÁïÙyÁl!d½bnn_òuÏeÔŸö‚ !Ê>ò“«0¥Åˆ¥©ï“>C嬞úË~öháö5w¶“¡´ ëÔ‡ÄeÓ(I?”z¼¤­{B]ÂåÇ!Rîl«‘y#Ä1˜ó¿ øÌÆ¥Wð42ë£e¤&ÅZ›]ŠNàQ`”J—”rÞx®-°¬ `g!ÍGÄ€rÄŒ´¯“¶î툃¤ñ(ÇWéÅ_j Qt%š]DÏ~Jk‹D!Cc´ƒ8 ŽM±‚ÃqÀGR –(õö-WÚ)¯—Y§f:tKÒ¼‰3,6?¯Mºf‚^¢ô†E†ž!Ÿ!(ç—J,A€œû¹R÷W?ç~.åÐ8Å*’jÃv™» 1¥ª_®:ÈpœÈ=åRÔç”Ä]ìøË¦/])20÷$ ¥J¬¹Jû9uù™QqfTı>ZFÅ>´¢RÌ Ö'”Ô˜'‘ ¸„úò‘ïyÊûp[ å?âÏá¼–íuçѼ],½Ûc}Ú©ÃÙ©\¥Ì²}é.rÖTÙW)%e2²å¹=@©Y•ý”kŽ3S4_¦è>¼Ý²X“YLzrú§ß¸ ¿ñhºæp áV-wàìÛ*e5‹È>¼©²¼Ÿ‰Ýy¬¹¬;>3{©•0þ¤[–ŒGH_R €’ÑGH5x¦“¤{u(£$éí/í¥¤Eàœ”Ib²ªƒi–ÄËJ¨'dS…Š‚rP€P†#’‚Äš7¡úL¶:Ðm5e=’ä[1‡ôé#+E©–JO¨¡ª“NšØ¬Ûðíòíåÿ.]• endstream endobj 4761 0 obj 7484 endobj 4765 0 obj [248 /XYZ 31.5000000 475.250000 0] endobj 4766 0 obj [248 /XYZ 38.2500000 365 0] endobj 4767 0 obj [248 /XYZ 38.2500000 365 0] endobj 4768 0 obj [248 /XYZ 32.2500000 474.500000 0] endobj 4769 0 obj << /Type /Annot /Subtype /Link /Rect [111 483.500000 165.750000 490.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_code_typemaps >> endobj 4764 0 obj << /Type /Page /Parent 2 0 R /Contents 4770 0 R /Resources 4772 0 R /Annots 4773 0 R /MediaBox [0 0 595 842] >> endobj 4772 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4773 0 obj [ 4769 0 R ] endobj 4770 0 obj << /Length 4771 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sÙ¾€ €´» CArrì8aQrÈßgIÎî6çëaSÝlrhÁ–¼›ÕÕõêz~ÿÇ/?üó¿‡ï¿üûðÃðûã—‡âX—EÿÏáôë»·?ÐÍqøó¡nÊÿ>|;|{øüð¹ûï·‡þ…/îþô¿ƒ>ü©û÷çÃ_ÿÖýðÇá/þ¯µª»ßyù½­U÷§âüûéçÿzøËï¿V?7óþÿ¿Ó¶hŠæÆ•O{·©^~ý÷‡ß¾ïöÛ¨JUe=¨ÖêÃþñðS÷qùâØZ¥êÊÖÅ-ªõéKeÙ”n»¯vÏݽü’Y^EX¼-ëx‹¿@.Že*å_]ðpu¡ŠAm)¡×Õ# _«ÂÆ[üri¤ G‹—£yX,¾EÚ¥´XšòŸén±lÏbÁ7Ö[,u½[,»År— ÃÏ»ÅBžÏz-–ö–ˆdJ‹¥Uc<Ë—«OÒ@j¬8~ZðI[ôŸlÚ÷¤¨ÊcÑšS5¦k25Ǧ-^ðã’ü¥'=•G£5óÁíÛܶ|ÏÓöhM_RêêK«Áwmù Òà7ÇÒVÍ;,y–oÜ}M~€îE‡2ãNç|"Gšáwƒ°‚f‘š8À—g5 WcpÞ;uÉÎóafë§QÌ?R‚–¬Ðã}¹öÀèâÑ#ÊâR5¦)Jº>&PJvpT„ÆVc7'ЍïDÔ¥§bnG™ÝsÜ ñT’’£i™!H\«® Ák`ßV‰…©yÇZn!™­êñ;ÕžH!´µqÜQ®(‚b%ë..pŒ{Qñ0›{kdîy̵nrpŒ\³Ï ,¹Þ½ ;óž‘ï tãqLbw6?ñ; 8­ÚÔr]gP°…é€Xq]gÜJàÀ¨È;¼¨;õpƒ$ÞËÒáÅû‘vŒDÁxË@vîIñ›KŠ÷8 Ý–J‡2zjyÎÚËMvÎJIñY$/袹%!=Up^+3æX˜þ°•¯dýü”VÔóãñÄ`Øoþ|0L팺co;EK"¹ ØyH®æùŽhHÀC«X˜áÕà;Ç<  Éß‘S#µ¥£’¦üŽgkibÓ3Êä )T3ZƒfxiÆâ`F×âòß# ¡f ŽŸÀÛMyvf#“d%\ª(?êöìâ:$Ï“ DO¨³O€LÁ4„Ï–ÐÃ-sMÜ›RÓg½ø»³owIøwß QEk\;$­®ŠËuJi÷ꟘíbžªwsOá¦Û¹vª®Ê÷‡çQ‡"9T«¼ Šl=À’ò` ¿ÃTU$àTHɦ£`G åbòEN ÄSyÞ7î«HhÞõé£ÚÅÇýˆ\Üa×n,60ÞÜlñiêßâdóßetîÀåA—Fêî&áõa2éeҔݿÊ0©Æ¡žk¨Žéÿ³ÆtžÄX|Ç,&áX¬Š«KS:§´‚Æ ©¶*ôlõœHPç\æ³kMJêW!ÙÒ1ʲdB ²|1()šÆ5ä=~©Ä=–òºËFjD-–‰€˜›Ä>,à°DH΢’XÖLZçÕÜÚ&åèð©WdQ†…Žö°ÖÖòî4¾õatërY nìVžÊ“HŒ­—j+äÙ¶ìeoWÌjX‹ŠššË§]ÐÝ”†®Ýbv’i+Gx…8¼³'a•io8§È³ÓÅOÁ¨p³? “‚¿%ÑìÊFgîd© J´뎩$н–AæRòaÂ4±Š˜ÌìÝG*Ý=) mÓâ¹ÍÙ†ÅÌàÜ}žf)k¾ ÇÔ µuq?è\7Î7=6/SˆmÌw¢r‘±udK®DÚ1ªÎó‰Œ ÙB•uõ˜LØmLWçâeÜù…ƒàœ„P÷|×½ËV­VÂz `ß+Ĩ…ÅþZ…G'ðmþqÇ‚4<Ó”×y†‰¿í¨1ʽXH/÷ÃMT77Œ¢£—'¢qíÙ–XFã˜èp™û‰y·釲¸ÄOÙ;Æö*½àît#xw ž½1e‹»aúÇÀÕ’0 †aÃßOr¶kRZ"F½‚=–¶±,Ç?ˆï87uãbdÇùy:&>ïùÞw{hR{™Š~Yäàmà'D8§;zD65 rªï—ìœÖ¥#b¢Øï1³—*ëì€)rÈ1{I¤t:Óx Ôx•rN3ƒ(«L‚Ùûrê?U7ƒÙæ?²ÅŒ]ˆ‹O˜ªæ;©:€,‚nTãjùÝ{°nïAÌùQíDg˜f´gû,nn.ÔŸAªD@ê8ÓÖ_§»gRýF(gOljE/͸ûRÕºâñšé›ÀEØ6W90[ó¤ªÝ=`„hÌí~b¼žÜ±è"Q­”{¾Œã™èß–uR\@kÂ6Xu+ñÛr‘=å2„Sw!KL•1ô陣3Ömµ%ë¾În©röçK:fÕÆÇpjVçu÷EÞ'JÚÀñ‡Ø4ñŒŽÅÁ£»1Âð;x°îÕÄ„˜m‰ê‰¢ˆß ©nW­œî/ÂH˜­Xü´7 ‘Ô¢¡ê$5€X¾©]\j£üÍ8bèZð©…©L§8<óNÞV¥ü6­€˜ŽH]»8ÜX>Õ+zűªÕLwò<Óûí1©wÇÔÿdÖùª·™VÎù&OéHrq;³HB5Eá /ˆh§÷;ÔtÆá›üòð%Ö´Ëc«²F›¹~ÐSV]íb‹©8òÍT"òMÖÑù¨6 ™\c—æ íå™:ý u'õî“'òíwûzBz2ÀÕqH§yóŽ…ï´è?ªž2Шù§çÝ KenFÏÔqüÄ[ŸhøÁ¦á“±ÏÙ…ýÀïxVû¾Ó¡8ïÒj×;C1è%zÖjši¿éC=ÈöK«x¦˜B0Ô£ž3Å4Šac¨J,PˆÄ‰m­+Ož ¼c>Ç”üqØŸ|}l÷‚ÂTô`ëp±*_›–hïmõS #˜Ÿ(#a¬~ÑÞÙÌ ÓR“-ˆáÝVCû+ á_"ðÜUÆe’¥o;†Ýfž©?bHtVžÇÇÇÐ7ÓÏ3FWÛ˜]f‹ÊQQù)Æó$2Ä‹ÿ“嬉šÌ½p„T7ÌN%â|MVbrÏæ·È^¬y/Õ«7¿öñ3d(V‘<&ê÷¾d2xÛÖ®.KÕc~Õœ$<$S41wãxò™uáñÅ3ÚŸF>¥Ï¹LßÎÐ*Hàê2êƒQ8¯4ÊõD¶çn6437¢jÚØõòã)ˆ†?°“«8Ãl »3E6"yŒÎaæà á/ïÔb2$˜°½§3örðSªŽñ"ü×tìk;m¦û…Hæ'C¢¢‰©òÉ`8rd介LÓ pJ“èM‹ ƒLXYV±/nä‡8ÁìQ‚rž1œ€7·ªP!Á fÜã2‰Q/3Фµ£¼(#2— “Þ|ñ̸B„„(Џ-ivŒt'ß½„±&âbèq»E|-ÉYïs0o"ÑTs0³ñhÇô‹Cï‡W˜Ì1&*îã¸ø©‚£„½)«Æ02މ‰ŠÀíT˜4Ù” ¸ ¦5¯¬{-öLñÄ廑S¨Ît×tTÇØyfVˆ¥Í´=f.l²%QºÖæIª*ƒÚÈ^h˜¦CÂLF a †4sm´|¾À¶"î•bØRTÙË“ˆS3»ÌeÙn”@ÖK8z—ër;,ºgä ßÎ2¢Þ«Œ«÷2ÛKÙÞ²}¨bƒ¡”ñBU¦N➘ª—æîN]{Òe*fL•äGÅ+EšG&Ò’žbººIÖ%󆧯µ³ª‹3>ð¦fj©®,øÀ™0M.DS]¶6ùC¸Ý/“‹–¢L|ï_užÆ¼ùÖäK–1Y™vw¤:·”Ç¢5ï7€ƒJC×}œo2E*ã1z¡Mí±¶%R¢bkR‘œJQo ¬ÍÆ\–¯ÏÃ4z]Þæ¢Ze2~Ç¥ÒÖÆb:cP~@|ÈŒY+*hW×飬]]¸"y2yvoQ!™ÓÁŠÉÖH­_wåƒì(\*…W¤ ÑæeáIeˆØ‘ÕXJ†²%†yôl‚üȲ\±ÊŠÍ'¢ M P®É¨ŽÈ%Œ‰2Î)íBÓŸe"xéºâ3OEK4§ºÐÓ:WpAŽïÁªUy9Q…2¢“äZ¼5Õ^ÌÝéûƒÖeùþ“ª8ö¹GoNºBO†­•G=IX²áï לKï´èÓ¯Ò“ÆtÃ!žì=§1ÝÀo¾£JøN¡6ð „@Ã'x§ê†!èeA}4Bþqý±ÓËêh^éí;!lÕ¦’­‰%Qýèæo«Ãë2BÇxqªf"Ó æ£Bè…›#·îÅFy®ºxƒ º0!.ßX* -û‹¬€amšeìÁøŽýV9ZÌÒ  ¦Ù~†MK±SObºì˜lê6·XƒŒëY¨˜/~dÃTóîÅyŽΪáN»}5wœ ÐhGÃz,ÜY>‚½Jùo{RPö¨]Z'ºã2=ûdçåÈ¡™Ø”\^,“=n[+V¬¬¬*P%I_[ÙØ1H9äÓ¶ÇÞ-÷À'øä#z¢jôDÃw Á`Ú^xbL8ƒôÒ“Çp4^M‡ã C0É%àwìøNþޱ;ðIδ£ F‰´Ÿá;ñÎm¡Þò¥á8²Å²¡¬¥ä*CÏÚ"cŠ8VeYÄÍKUÀ±üTiáiÏŒ£‰)ba’£DS»׆g–YO‚“¡N×+ñ_—ªq”ârþë¸!”åoÌë ËZ‹ÞÙ¼ oЖáú3G¤D.Oäò¢fÖ1I—‹Ù¤*%çW zYQiD‚rꎙ]µ™¨¶"›,Ñ£¡]Ũ¢VçŒÁÎX@j‰ðQ6Íö¶f®%p–霉3²ù²¦.u²µpLhè†lƘM0•v 뢖'ïSÔ*•™® kÏ/— aw{$r¦Ë¯ÈͺÆw'¥é{êÀ2©mmÞx)\ ŸxBÆ0Í„rñ;žP;ÿÂP»66¿›ðwÅ8ð¤·ÔË$åxh‡¡"ÅG® á Öêñ„1ñ0®ú÷œ=!ñqZNïÚš6bÙ „Í£ÁÖü$Ÿ™Â\·wKq·3± M·[Ŭаý`]@¬–Á½S"–Ê×x.þ°ín§mVÈÜ@Ëë´£ÇP*ìxTCc¡ D|vhúÈåž©¹|è_(S“©È1`ÏîÜlv'Å$‰ZŒ_mS»”µ£^r¤Á¸]‚<ø—­}ÚV|:¿T†-77…D"oÒ“£ÎŒJÅ_جš? 0Õ0•!a"ÉÕ]•μ®ýê¾_ÝÑ;1®îi¨¼¾ÞE㎨;'×íΜQ`—7†€¡Qˆ9Þ¼âºÒf¬oZ¾keóëò%lä—ȵ8u°0G¸D˜¢ƒÜ–RxIuyfšóÚE.e W©Ž@ñû`¥£ð˜Â³û桳YnÊÈ5-_'m} ×òëÖ<±CeŒ<ž@O0ïÞ²È+„˜Š§TS|<¼D›ºÈsã."¯ê˜ÓJ÷Š·yŸsï`®ç9÷``/Éâ¯æq¬ÈvÃfÚ;§êºÍh/QêõU@~Ä|ï ÚãÓ‚'ì9û„µÄæœjÃÔÌl­æÒ³ ®i‚òÛS%‰9ˆ¨´ÆZçjÍ~êkËúr¢>¬ï±ìÃò2sê³j¬”0°Ö:)<åØ?%g»@a»€H]Ã)r*ÍXwß—=ekµ‚3IiOÙví-†;bwèõÚ`eqö¹Ì҂ݯ÷îÃ^¸>_û 3<ØÍ% 2ÇNu´}’—¼g=Üõïï‹Ðc­÷„2«é“?ú8äٽᧂK¾ß'ôsÍ·x ¶OÃNQª6ÙW ¬¶>ÙàÀFØ­Š¡¶¡ðjð!ô§‚¶^¿’-Kp§?¯c=žÑ·†  A$ 10 > endobj 4789 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 4790 0 obj [ ] endobj 4787 0 obj << /Length 4788 0 R /Filter /FlateDecode >> stream xœí]ËŽÜJrÝ÷WÔÚÀ­ËL&_€a@jI¼0 \^^w<6¾˳ðﻺŠUݬdžŠ|ÍfZÓ“ùˆŒwœøõû÷Ãþíðëóoÿsø}üùüÛSuìšêòŸÃËŸ_ÞþÂöÇño¿ÿñôóðóéûÓ÷Óÿþ|º¼ðÛó?Ÿþö{ø§Óÿrø×;ýòOã?zùp¾:Θ®u]õȇ:{ú’3U{0vxÙöfò¡óáM„Áë—qc ~ž¹ú®˜º5ò蚇ëz;nP3¥¢Ç·èuøƒ·uoðóÌÕwåz¸xtÍÃmOÄsÞ ®±ý×Ñcl×F¼¸ç™koÊõháàš'Û›ñ^5]„ý¹cóû¶8øË̵7åz²ppÅ“mªÓøçí"Û×Ñ#l~coðó̵7e?éŽ'ÝíœÁ3zbÌùI{¬ÍùÁ›w>_Þ1Çf¨»…3À+Å3háJ-|g‚wg|çëÍ?F®ÃÁ´÷ÈÕUgrm?é.d4»ÉF]¶£?ö“Íý:nTm{sosÝÑÕwˆfà“êBzýëmà?Åö1ýùõ±9é}Ý™ôÞ Ó_à 8ô/G˜  Ï€úÎòiÐV $´œ„½`h7àHñ»ð­®+ø$Uá:ÁÓpu8éTæÊ«Ú‹`ð9¬iŽ•Ç•GYro´‘“Ûë£%Ô…’8áHÔeT¹Xx|`ÄÒíóMÀ^èÌÿNDÔãI¤aK• _Ì…ÍgS4ÈÖöpÅxŽð–záI3_Z0ÌQÁ@œº. ›_°vƒE<æD˜t á|¤ëÂw/S ±@á°æ€¹®èð·k4ýÂö|¢¤aîƒu¬÷¨ $ãLdÒÐ žL©o8^ ¶)yÜ{2À'ŸàþÄ}&fðŒž¸‹G³ð ž[tÍÂTƒóU‹Ü|ttÍ)5´Ð)Q2™c)JfFé¶ü]ʆ"l]A‡b4@bŒÔ¡ rF†õ±™ÇÕOV»ùíX•“#:Ûzoç6r‰'«`¼ŒÅBðgAÂ4ƒŸ,ßjüáÚ,7)Û ÛØ»ß¾CXóxn—ç¹b´-f…/Hè×WͰö]ø ã¥,Êåʆa8GvºKE2õ·å[¼ü482ûÆW°ùÌøÁ>y‹ á¨Å‰à ¡ÍdzVDN)åMbèƒyóããiÐƱan“ºîÝ8Éhœd/=Ö¡üDYU‚àÉïðO\MI킊YAb'6ÚÐÍì#r½¦çŒÁ)^Œê UÕX"×a€å…Å á*Çï¤J_h©À`Úî献JhÔ§QÞm:l‹Q„¨KÖ_c‹µÑØU}”„ðÞUf]P¤Ta€TÙºñCÕ=Hž¸½\ÜìyáP«˜Dá‹®ÞYùUFÂKÇÔ¿RrÄÌ}# U‘®C$Y*dªúLôŒâË\Hæ|…2V°g:E%W%;~„ÐÇÆP¶u¢V\V'}‹vx¨$viøÊ¨2 ÆRÀwV×Ö½™)6Eb1ž·Ô%ð¢Ùn~·±v¬kÛ«oR9ÀÛ! UC>¹•¥æZc=ÒÞ3scÄ©RkÓTݳ ¾Œ×Nºöì\q]\%OK¥}é‚`&3שgæÏ ÃôÆÀoâ •±ê¿«O gˈ£0au/ddÓ†ÉÈ'´Ç’W©"Ç·n&UËØ…O©Ãëåõ ÒñÎäž'ðñZÓûBŒQuA²Pĉ%f6š‹ö'ðt¹vöéâ ]‰zäx«›C°FÚWöÓ•Lˆù“ ¢`n„8&°;O#á‰Éü}à ÆäʦõÙòâ&BÜkRÕâg‡¤²j9•®‰á½åSØ««©2™k*ÉŸþŠ­oÙ §Ï8ïSa7_wdàëâ8ížže{ëS{²râĨ±]Š»ˆã#j©Æ²ËeH”Σkäîj†å*§WÞ|"d"Ð7£1¾LÉ^†ÂÅ(¡Ô”bTbÐŽþ£ÞÌsTƘezŠ2…ºMt5`åÄî=‰ã#'qè8…?#èt‹ˆYÇî0ÊË먬¼öx9ÕOlÞ5i‘Qîty:…b3)\ýJPé*k»ã„‹©LÇ˺Œ=Nö"r>h.Ä9ʲ hþïS^üBc1ÿDNOe{‘ñWN¶˜ DŸ`Ì~­/Õ˜ÞLð#6‚ÕòCœ|á°Ø°+:óm¹«L¸/‘\{¹þˆ¨ T€+9‘_:XöÆ÷ÞõÕÎpŠb8ëDGXgÁKùå 9Ý{qèCÚf}WT”—bKt¢"ˆ_:dE–×´;ÀÝíÃÝ>ÜÕµÛ‡qó؉ÅT®Õ—ÙßV°5zÂd›åLúÚ‰!Øñº%wº0D‘œì×c¥ÆÙ: a¢Á‡n!lHè!QâvjþÌàU è—Áz\¯¹v®ÁMñÎ ˆI“bíåZ&’0ÈfмL㑘 "UëI¼T\Q§Í!üp€É¼;÷öÜÅ2ųkÇQ«€hìžîøÐI–Ü ƒj¡§R‹Èpª¥ö1CºÚ…^]ªýê®à*—¬Pù‡ºù¹`­(מ›*àU2C›Âør0×ïàu¯4ÞÑ€¼ p‰dNƒ¹âé™®xå8jΣ¿ª÷A°p…†"G#•AÎ ÷ˆÅ@ï š n™—*$éײèTO`e^¸52\I®þ¨©úÊjƒè†YW1i4À~V€ƒB#ù|ÖTŠ™>1í¾JB•ä2¦w›2* c¬.ïa‡œ )P؃hÕA_•r!x™.®k@ªrºht,­´^USÕ(aÜ89mASõ/³›D[a÷*ͳu“cºcl¨Jgø€tÉ’ºtëHcÀ'ðÎÕ͕ͤÊ9XÞCG€”JÆŸ Ÿ; ¹-ÁÚ›Yã“o*^Î$‰N{&Eæ­ª®#ª³7“r4ñ2ñÏ´:â* ÓõæÃ{(?3]L®»MæÖ3^3Ê‚U7¦.l7o^WL^ˆªdŽÂ`2A™x¾.T ØÁŽlëDæT7_Åü,Í23&ÈcÁw¦ª„bùÑ­7 ¾8û`è0Qƒ÷¢ÓYdUwÕ§Ë¥)¾T­»&m‡u5Kì£!L ]YÐÍ ãNæÈ^%ŽsMCê‘̹xM@ìæÏ,¤¿ £Ñçu•ùφ.™+9m×Ú”Jæ¥Ø¥²³ò׿ϊö¾º~˜=*AШÀNBv©ZÙÌ)å1s4jçí¿²ØbÜÍ»ãæ±Êò\`¡jÁ•„¾§EPž²Œ¼o‰ú¯Ë,Õz`•èðö“__Á}5òuF`Œ"]ÐaUŒ¸u‚µlåÊ­Ó£¤2Âh’*¹Ø ÒñÛÞ—tµœé¯ËÈðÉkT¾2÷¢–5aî„”«‚nx'¿gÍNwþjáät&Ë…HÖ±ÝâË­¼ I8Þ \tr”u \bh¤1“ú»Î»—»Ö¸­QH$ °äSP‰LwY qGk—$1U˪¹®[1î4äÎʳ¥Þ0Z'‰r¦ Pý ý&Àè  bm˜@N…EÈ/Fý¦ÜôLž[*×\ïɤ_ÖxS›cå·ûGû|å±yVŒeÔ ÍPÉm×%@"gU°M¿j1)ãL…,‰æÌ§L} ‹úÎp¼0à·3ýŸ|FOL‡žXøNg0^•;Oê:|ãU¹÷ä9|fÃ÷ Ï`äü÷f¿ã>Áwšðwjw?Áû߯~%B: ¨jHx»nö|Ïà„]„ô"ÜMâf້ilk·V÷69<ƒUîŽ\H ^È˸ÏÖ4ó»ˆe-±naGvJR¦$¼£cÑB«Ý¬Üü¼Æ2Ó%ö6sÚ¼~3À»“Ê0\íM&$K[@ÝÓ̈́ήRí¯'%7ŒÚÉ´“ÅßaL·Æ,ÕQúëô4&•LaÁ™ªJ@§&gy·dÝÛ#ضغ.&´•ꌿãˆÌË¢—25Îybªd¯:àå3¨EL¿) ¾‚&Q•¡ ®Z|ëðž~Q¦‘ö:Ké§œû¦5ûh£¡$Œ™b`êšàhéÊQ|;}”kt°ó“‹Ñm¡ËÇó'GÝøÖ_@*ý`G8a0yCªªáôf21ÂÓ¯¬Ikõé"Áé QèÆjò³+̘ð;ÂUÐaŸÓþ8±nÀ[¹ËªÁ{‹+×ñJuñF—ó&gá±ÀeL°µèÝg¸3Œå²ˆjkœGâɼG è*œR~ïJˆQ_œ{Ýø¼Ñá0-¹â'0„,„a·†Å'Bà›(Èf  ð8Æ¡jbnx¯qhW8m¸R! Ï€)óÄáúè0[­™è ºÉg*Q]`JÞ\ŠÜ^ªïvõQxTÄ;ÝwËït2(«åñ¥dºQâc"D}eÌ΂ë #»±Uúw®Ó¸œf‹ïì Þü˜Î][Ÿ.¿ÞTž “éMÄ+Û¾ƒçƸ¤)¬F ô¿Ü Êê†Z'pö7RÁÎcš#¿€DXþî$ˉ7m@SÂ2 ¿#|¾ƒ™²ðކÑ`ígôÏZÀ–màÒ À7àÝ*-Þá°„»CÍŸÌDeh_(áLá „»€Ÿ@}îšò~§y‘£EÁ¦Oâ¾D»ì¬-Œ ¼82GmÿÅhl1еcöЮ­'t…ŒH¦ßNƒPM¿ÎÖ"†±«+_ÑÍ}Çž ¦M17@@üVCÁݬJÔ€±¸„š£ÅZÙ®OoUŸŽn†ŸÖv…è[UäL·µ£&£ÃcU´”ôîÈìûÞ#C `'~ðpbÝŸ•9ÛLú¢.ÐF%JŠ)ûÖ§§ ÁDS2}ñ;„½ªaâJØóM‘d+•ìBÀ&0U¦¯«H1!Œ{WPè]ÂÈNРoÊ7ñ¦¥’£Œ÷$ ‚¡æÉ^d žýÄîLÒ;ºLE,B±…üµ•%D4õàI¯Èz4qQµñ7­ru+‘ÍÌÔŸ”›à¥‡ø¿oj?öüÀ+ȯ ó¸¯2 *•uA9»´ô‰)©‹ù—H³×íb%¿©†Ûº‰ÕB”U· 9ŒÙ2Ýañwptšêv‹#çv<ÓÃRè‰ûǧëݘj¸Î®n¶›ü½'L·s¦ÛщÚÀ\ƒ»á~F–ø\ˆn ] ïàÛ„÷€è· ä»À3Åx=8w¥Áë!F³˜Þp~~÷ŸÞáà;Âî³ÆçãRò'{í‰)ðK5ÿ«Üg¢yI{wMsö™ÀßÙûL\ÛV†uE€ß Ö¬ÇíU#õÅϽ¹á>p¯…óQëÿ/LoýƒOv°À«~ WGü0=±‹w}§¤ •ƒ–Âë œÔ ê{ä”"*Üœ€ ‹ˆ¤•Ò¶¸Zàà;ºõ^ËÓ"¯Å$Ê€N‚qßëSv ,i~TÒ ã¾UM²‰Ód6´3Žc_¼mÌEÐKC9¿Kr<ѱl^Ê膘¶½Bhg ”ð2´Š§„% ·†ï‘° ½¨K2dyf}ª€Õ¶®kÔÄ_ë :Šâ.ÌäA¤ª"UÍó§“”ÁàwRÉiJM&XÕ¨†é_0±ˆº3j²ªõ`\ö9K.ßëÖï]Xš <-~B(ìccr%W`_FI‹ G:8ŸôtY4ѳ,r® Å ¹Cð$¦ 2C”s@e÷ŽAUņIÛ¦Šh©K˜•Ê]¥UË, ´Ð’v)ŽÒq!«ƒ«eÚ¨'Ìé‡ïOÿÓÂ~ endstream endobj 4788 0 obj 7617 endobj 4792 0 obj [250 /XYZ 37.5000000 464 0] endobj 4793 0 obj [250 /XYZ 37.5000000 464 0] endobj 4794 0 obj << /Type /Annot /Subtype /Link /Rect [244.500000 570.500000 286.500000 577.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_throws_typemap >> endobj 4795 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 563 537 577.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches >> endobj 4796 0 obj << /Type /Annot /Subtype /Link /Rect [381 421.250000 399.750000 428 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4791 0 obj << /Type /Page /Parent 2 0 R /Contents 4797 0 R /Resources 4799 0 R /Annots 4800 0 R /MediaBox [0 0 595 842] >> endobj 4799 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4800 0 obj [ 4794 0 R 4795 0 R 4796 0 R ] endobj 4797 0 obj << /Length 4798 0 R /Filter /FlateDecode >> stream xœí]K¯#¹uÞß_¡µkŠd= ÀLOw€,4z€,Œ,‚qØ1Òñ"?ÒUIWbé;UütÈbItÃs»UW,òð¼Ÿ?üË·ÿÜý÷?v?|úö?»_ÇŸŸ¾½Uû®©NÿÛÿüñúÛïǿﺾÙýúûÛ÷Ý÷·¯o_ÿýþvú·OÿvøÛÿíìî_ÿÿÛîOÿqøðÏã/á÷·Ît‡Ÿ¿½ÿ:sø[uùyüü¯oÿþ‡Ýß+ž_7næöß´µ=ìí¸™W;Ó¼ÿùǯûူ·Ô}sx¶3µ«wf¨íîÿëí/‡œ—¯öCmL×Ö]õÈ‹:{|Së‹ØáðŸlü½ÿQZ>Ââ}qñ÷«CŸÖÈ«k^nß¹€š.øÏ«Çÿ`‡ˆˆsܹ6PÎW ×¼Ù¡7oö²zà·•ë"¢Íqç±n.¾ï[ÛÕM5ôðïÌ\ˆ!“¾Z>Ââvˆ¸øûÎc1iauERn›v¤‡ã[õAtY>Æâƒ¸øûÎÕ¡r¾\¼ºâåvæ¬ÿô¶ÑÑÇòàß Moñ÷«Ce¼Üéê_CVÁ[9}L€ïÂúåí‡/nÒî~ùËagï/<ýøå÷·úð£ÒošÝ/ÞýÓa?Ã?ï~ùÛ›iöÕàŽ–Ññ÷NOš÷'nßÔmû¤~Rïkw²¥.Oìiµ~ßUko¾ó }ÇÔð;xŸßŸ4{g{sû Ws§' ŽQµpüâÞ_žXX¾ØTpKø~|>:¾AsÂ!w>Ð’Û`pCã¾ ܬé ñ“|`®æ¾,?×O‹µvp/ðícü#nÒ8‚\1.ýè_&#|ÀáŸ9È»H¢j˜È*†g`äÇ\+¥V?Ÿv`ÎWòAÃ'ÂönüÒ‚' …êB¿¯¦Ë#vœHb<°=q?{'\j¢Þàïb~Ép %Ùöˆ_¼|˘-až"ÀœQ6á=Q'Å·¾\{¢Ð`9Î °Àôûsø¹\7ò×î`¶ßÒ/Ï#JÉ¡¯=))hPpŸ˜7 Ê#ÔA.L`šÃº>!o&Ê0Åò0šbሃê{âExiëW„=`?!MRW¾1«1¨³EŸPLSh´„\=o»äâq‰*ó¯OÅÉ…‡†Ú¯l®O^¬ë@f ”È~ߦ+ ’£ËcT‰’º§QzVû¶3·X†£a?ÂÕN¨cìùQBIØô¾(Ôµþ¨ûŘœ@g0µ©°Úºñu2-‡ýûnî â½'|ò#|R‡?©"vð =1ð<¯fá¼7¼ø a€÷†Ï3rÖ°ó`À“ŽNŽˆÄÝ·­¯ç& %„Mqh4 8 ÒûØj14ƈD`oô© ®3¨íÌbœc\x©"êÊX’ Ou-ݽ©Ø³©¸ü“2Ù1 ”ÀS×]0¢EÖ^uRDrØTó&ËSŽG"씌ªù“Ÿn„/kÉaÀPÍT¥Ð¥ùõ¥MSc|çDÞªÈ'°Fê©°¼¿ÈlòuLGTm=ÁǤ¯¯øf¨¦,I•p¡›ÃÀÀ€Y §Q1œ‹¾Dɇøæì°?j²íÄõl’ÀÂÒ6™ª%à,ã \'” ]5`_¶óEª¢¢¤°ó~Öe÷±ó¢ÌgDj×ûôÉxlLžxUøFÍ1æõ7"£a¬gèIofôcU¹²Q.Ujoå%ð£õëÂj=rf£ç²Sµ¾€H[Œs¾ X’ËKr¹ Ñ“ËkjaSeǵՅ@B§0›(ÏÔMØM¦ù-×OMiu¯’J† r1<Ÿd©b¤T W,'puë± ¡”ž‰®BREv*þ©Tu*ºÅÖ™Ö©:`ÝûâÍbU*”­üÄ@ejÊaŠV ="¨?]l>ÐV¯ŠdãkØ@s<É?Qùs§Qq(f ªé}:yROX­ÖÅGÝÈuZ7Ïí1OÇr b^ÆI€Ï#È5,%ᮆ5|éÂïG€(v Aˆ {Ãç».øvØA£IÁÂý@ˆêåi-ài½ÇXø¤Á´ ù Cg=”.Pm›ò]e€¼`‰À;q¾Xja-†/Æl,é.ÂpßbÛUØv÷îÂÍx’÷uv´Ö}ƒKŠ0ÍZƤ k+jÂØ‡ßƒÃ4 —'à&Ð&\ ã ïôÙt¦mêè‹”¨²– Õ3º‡ƒüZß0§ÀÐqCBIé†Ù;Ñ}Bá%¦ LÏ„}&X֘Θ÷@¾ù%õ0ç"8Ê“&uhI~ŒñL¡4‡ßÃx>ð{àjŒ½ËP=c 3:uC`H&¿éàÞN-'iÁN»Ný­3™P½;;ÍQHƒƒWºU…! ¿›ìhóè´iäðôÁîÕ£Â4ÑŽIÒ-!êqö¸êÌ,:Qú`Æesnì(ðÁt¨–àØ#„e.#%±µÈrf¬z¬ã vÞ&}8£Þ³ÛXëšW@ß±ìF5®é|4†Ÿý—oõéL½·&ƨ¡?ÉÇž‡ìátÇà ¸VÃõkhöÇ-ÜBœª}ÊÏ+¼¶¡· oŒÊ%0af†ƒQ>à´sÁ¢‚s¥®–XR™—7»ô‡Á¥ÊCç âÿ(þ¢+ú?ºÓŒ¯kVÀ€pP8JýôÖ\tCí—+D´Š)mÑëˆ<¦Žç1â %~ÏêÃP“7Z?:õdí t[b 'eàFpF¸ú¤¯²ŽA0æf‚ò¦ÞWd(€øK"÷Äc ãµ.oMõP#CéLrƒÝŒÆ#â3‘]Nß]ŽûÂòW„/=(‹Éˆ\.T23p$Ä~Q±6¡bÅääÆù¬¼(oëõßY^V-8]°Øa:]l’0stë¯c¤âé/ǰKd½¶þi»Çì&5:c?^ªüy=³l¾VÔ´çîÏÛ)ÓaÓ5@(Óa% ÙÀtØ4¼¦?w¢xÒ¸kt|I5¹V€(ž¢ q ïÏ£æƒaÎE@ï@˜3‰! ÷&P:>¦ZÌ£ñýàà[ÀwZ¦gÍwp@˜»”)ÁÏ:%8‰ä·Õ<•'¹]lÊ(¶Q±Šm4ƒ”äg`€wJ3Üî@oÒé~k.ÙÄ›ä·Ûœ5ÜÀ»·ØfÇôŒuïDâÏ&õ0'~º“6ªÚ2–Õ„,(YºSF"nYe­8Ü7sÎF[p}Ñžÿ³n‚eÖqÜQ¶P1¥cm}ù‘’£4]á(É9ʳñ€g»…õ5 í¬£$å];O›óœ}c©"ªÅsÈѦ`%`ªU£Í™ç.©'Þ«.N5ÞmõüصǠ¹É¥”ž¥g„ Ñ{F¸Æxøšqψä~‚Ý05•§³ú¨ ÊLñJüÎáÆçÉʈŠÔiáSÐ{s­™ŒLÕßN£ÕNµPSe† 3„K(ÕHÔÞdÊŸFK;ºéÀë±ÝrŠ[½lêušº håht‰4´mž©¾ŒßÌQSÔâ[&T:&š4¡æÉqˆ6–Llš1–°°v€••KPé—Æwº^±™xÓY˜¹RÝ´†€ÉX9Ô¶åáajŠ(Ñ­7Šö™Àyç.|ûŔר­é\ª™9òãůæ©=Œ$3©5Úo‡ÈžÛ¤­´ƒŽäòRN±ÓÍÆ‰1q¯\ö¶ScЇqêö‡|Ød¤E9ØÄgÖ†y p²ãH#,{J»gDp*ežhØ=0«%€6¶ÜØ?rqâà<&$ô(ÛdM‹Ð-’¨ÁRíÓ é:_È\¡Õõ¢f2Þ,Û ØMm¼Ý0¼Ž ¨Qó.½Û9ÁÃLáq<Öû©úýñûGßïÍ¿½}î/ÒÅ>¨gÃË÷žüŸäR¨å °aW¡¨ *<3“!`ø¼'âñCÕbú›LëË·Ü&|AX!*ƒzB&ÆEž•‡éCe4Á+(SD×›Àˆ3pô>˾›‡Üs¤—Qi@Œ cØL"äÌ N*ãü!iDWª¿t­˜s­ÇzŠ×½xÝ‹×ýÑËf̾ •E—$Þãý%¼Ì”5 ª®×R'Š]öSÝHÔ¸©ªŒTɽËCƒBÚ×Üpé ¡Àä—”ê|Í .,‘/†iž†éúd*DWIÛÅ•PD˜Ô¤pLÇ­«:_>'=ÄwækûF>Å¢V,af 3¡¦jˆ ìiÒ¡50îžµÀ?r.JjD±©òpÆ:.Ž7M¼ÉáÝà±xÊ•¿œÖ¨TJÕdNJ¤6–!HìZ7Ž’LùeJÊ·KÒ­oÓÍbUµ¨³ö/‚HJ[ã­Ä$sêXšOmŠ¢¿r ~71±R [Àiºx¸ Žw€æãP0¿§3iº†ãƒwGåàÖóxL%ü3*DHׯß)mþõì‹;êƒÐsvRF¯eÄå±g/–mg[ aL&Ä܆„…½áÚŒòø ^ ?Q #CˆH޶ª}œxUçš¶æ‹©’¡çªÛcªÜ£Q½y‘Yg=:ÇSH-äGx­®J^ÔªP>Þšv95­ gCÄ%ºvèˆÎa»£/—ZH+´zç³Î×S‘tÓ«R±>M¦Êr)±Àèê:V½™´Þ‰b·$h—L…+“$ߣ1ÌL€î¡èŠÉ¬Um]¥|žåVM”Rá°ÕLa¡d 8 $ìÎÈa]OÔxlF#FjcWš A2î·¹¶&1]iÆùزzj÷ëé‘óàÖÏŒÑë¶)53jÞQ¹­<å5ÌŽI›é”ÎLá†;pÐ<­±7¾ôsÊÀI€ïÇáóÀ'Ê"a@P)ðBqÐÅ^F °û•1wçÁ´OʨH«0•P8š"6|æøf˜Ý°S|ÌÝ3j!sþ–zXÕÅXA¬E Û5ÿ¸A Ä$‹!¼ƒçt€ß{B̰ž0¡ý0|sU§Öçiïtý¼SMøîñ¹!¬ræBÙKǦ{à†sÆŠËŒß‰Š¹ÖÍõe86¶F²™-Æ—ég’lRcÎ#ØÅ©éq¢vªDz¸ƒ’H_éóàñŒÿj|’FÇéÎá‹T:¥­îOö¶~°dÕÏgÕ?~\²rEX«êáŒ~,<Áº”*ö=\ÂÆ!2‘‘œq‡ˆe$õº MjÝ£ødŠ,)°ødžO¨údðIŒ‡;ÀXå0Q•Ì®)ú0J=›x Å»ñ®-t¦N¬-<›w£”°¥£¦mꆅ«ªãAñGT”¡Å‘‹?¢s®h Kð¥Lm¡`*ˆ6{G~ñ"Ê.hªõLþ¢@Û×[(ç¤æÌŘ]¥EäñOVByDRê+}@÷p «»Î¬ðÖ¾:WÄr"¥=çÈ#«»·ç¼},±®ÈTa'àXB/i_?’çŽ}ôc)¡5Õx©jÊÌ$S÷ËD ‰*0Á —³íWòà(ï‹p§ªµ…%– á[2ËKuµõý‚os—&¡tmɰ"%ŒåÄôÛÀ: ö3çÁ;ÀÈx_^ÆÝfg„”Öpß?’Møl´Ù¨fÛ¬ooæ^A>Tç칈Þ~f†ÍpûJSíÛÎ,œŽ$tXijؙ)L~W/¡9YÀdj<Á”™;…Û44zeÆ­ÂÕ„ŒÌ/•ÙÌHq•hx˜™îü~>ô=ÃÄ¢Û’Uw³ƒuG'¸Þxü°4‚KnGwm¼ûß+´±ƒ÷NF^2í …9+ÿ½nF‰AñC3…aÛè‡ýqáßÏÿª}ßW»¶=þèŒ?µ»¶ÙŸP¤:òë[[ïl Ôóo¹›UÜõ;¿?þ»?~mç}»ïüw>9|çv'ÇßêoVéoßñ×·Ÿþk"Á¨ ]*Ÿ’M-ÊVÊV ¡gÇ1 8–M^dÌÎ}ã:v£ág×R·9kH’x×ð¤ÂMxOò‡ö×zTð\œóbaB!¦c3;ƒÙ÷àæ³Æò3Ì|•D¯sa6_W[2ãøX¡‚GÇd.ŒÏ 6ËLK<‘‘òl`SˆÀ®Ä¾ˆ0\ròCј–ÅÈémŽä‰?|¬÷%km¡cΦ:ƒ"±üzãKˆ[§¦‚:±ÿå\bÜNX£VrHuUuãêg›:¤Ÿz©÷O<‡Ôé·ÜÍ*îú£Cêðï;©Ã§ÿŽjâ:ýV³JûŽè©ÃéŠCª8¤À¯y‡ÔŽ•*—KÁ‰C•W;ïFb;ËI½fØô આ&˱`>Úì2†õæ® ðƒ?c†é²õÅ)/,˜]¹h0ã·ÁKGÂr˜ˆ/A¥JŠHå: é;Qc®T³¯wËéà<ì1äaìùÑ’«d$ùQfG"3jSœtÌõ»âMss¬nëÙ‰Ö³Ý];ÑMìDwÇNt;ÑÝØ‰Ö³í];ÑNìD{ÇN´;ÑÞØ‰6¡èŠXìÄðk‰è$.<[ßê-4„¤|¢)5bD7M¥mbÔuïákl+«SXŽ2~dÈ)3 ;YX·Þ1,4İ‚Ë×.üf®ÎXîÅéó±ÈZNAßÀ°  $\é$´zô°>ÛU£¾èžð™ò” ê0©møÅ«‡ˆ'„ŒaÎØÙ `ÔvœôÀPpŒÉe3. ÆCʬ8pD©iªÆxbSHz[Ìi©kØ1#fbøÆµ2ru}d*zÁò´.¬êd‰zî§Ús?5wÝOÍÄýÔÜq?5÷Ssã~ª=÷S}×ýTOÜOõ÷S}q?Õ7î§:¡û©)î§â~z¿–¸Ÿšî'èÞú;इ/±¸=u)¸:[qU,R’ ¹Z *HÓq×ö>5WÅC˜"?1^ÍÖwU0ù8×AÿÌyJU±…'Dw‚³0¦˜º5‘Ý„:»gýŒƽ¦Ûå€(í ˆRUÖLz.ö‰_èR[_8¦*¶z×.> SÃÅ#ÁóOŸ.Q5t»"1,A¨*Ï¥^®áVˆ*!Sií¶Ü·$ÜÓ\vqDyvövØz©Ô•enç8€:õŽìŒ¹¨´§ÍÜs‹^x*2½<¼È¨fT¯µ"jv8)}ÐgóîœG7¦õ$Òk$öEþN\®ÛqGµÅçÓW³$k„Äœôiš2Ô§þžW2ëÛhøët1–w@ÑŠ ÌxË¹Šµ•\­ÏZ¤5ÛÙ¼3­»=TX™³î cÕòpfŠNªéíYÌWëleæ!BLÃO„‰ò&”§oe)ž·…w ¡3£¯“>¼l¼ÙQŽà¦÷ˆËÇa³~ð§è†wB Ž°%Ì}ñ0a¤ò¹¯ÀáˆË¾neÁr¸®rûQ:.du˜ì®"»³*À×Ý×·ÿÓ‚sÛ endstream endobj 4798 0 obj 7633 endobj 4802 0 obj << /Type /Annot /Subtype /Link /Rect [366.750000 557.750000 406.500000 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces >> endobj 4803 0 obj << /Type /Annot /Subtype /Link /Rect [255 521.750000 301.500000 528.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (file:///home/william/swig/github/swig/Tools/swig-4.0.2/Doc/Manual/Typemaps.html#throws_typemap) >> >> endobj 4804 0 obj << /Type /Annot /Subtype /Link /Rect [315.750000 311.750000 362.250000 318.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (file:///home/william/swig/github/swig/Tools/swig-4.0.2/Doc/Manual/Typemaps.html#throws_typemap) >> >> endobj 4801 0 obj << /Type /Page /Parent 2 0 R /Contents 4805 0 R /Resources 4807 0 R /Annots 4808 0 R /MediaBox [0 0 595 842] >> endobj 4807 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 4808 0 obj [ 4802 0 R 4803 0 R 4804 0 R ] endobj 4805 0 obj << /Length 4806 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯È³©õ°00Ó>ht>>³^‹™…Û{ðßwf¥TUMæ¿ >¤äv»·4%‘Áx󋈟ÿéëœþëï§Ÿ?|ýŸÓoóŸ¾>UÏCW]ÿsºüóÓûÔãóü÷Ó0v§ßþxú~úþôåéËù¿?]áë‡9ÿíÿNõéŸÏÿýëéßþýüÃ?ÏÿÒå_øãi0ÃùÏß_þœsþ[õúçåçÿýô¯ÿpúÛåËçæÅüøÿªÛf¨Íe+Ÿþþ´lÓ¼üó÷ßþöôó•~_iÇ¡më“i›öd¦óßþ÷?ŸþrþÀòúêyjúv¨îùÐP_¾dšóKê©:uç|èå×›/Ÿº6ÜË_V®NÓôF~»âáž_ßÏj}½{}€—7ãîå/+W§Ê|¸ÂÛ5·íÑBèíõ^ÞT ו«Se9\üvÍú™ûë¾@¢×× ÿTÕM¸Ã}Y¹:U–ÃÅoW<Ü©ú€’ûîõ^^·_þ²òP’ë¾ý‹Ï[ðR®?~áwáýöôógÓš31ûÓ·¿œ÷òÍëßÎDéN?]œÁ³9ùöçÓŸªÊ´ÿxúöק鹯»e‰kOšðÉôòäÓ·3!‚ïajïØCÕù?(ò zÒÁßÁO„ýLèI §†¿czHƒ>©áøêW¸‚ÑŸx?Õgøä|W€ŸçwŠiP} ¸×øïT õ@Ps¦(”¼ÓŽØiƒW€©ƒÏJÉÑdŽáxamøä Ç RéÆèÌñ5!§±dâ^,Û˜w°F²€ß†9DW'B¯D9†{±dAZç¬ßއI8mli±-ùÏkìLs‡×˜³ïÑâsܧ¤_÷|¨Äï`©…kk0uP8¼j, ðÛÆPôaüóX*|@Õ'±2'ºŒ [ÐaNbl`‰0ÉÌ -âX@5ºJï½§¿…úvæÞ8ºsœ"ëÎâ£ïUs5pXÔü¶D. k!’…¾s÷ƒÏ‡Y[Ch;¼¶ƒêÁb n¿ sHÄȾöí{ãø™± Çâ,8“ïÇ<†¹œÈWRùÁƒE3º¹ûroﮈºåÓµÕª±QÅœqÚøð ü–FaŒ¯KÜŠÔ«ã´÷ «JLyXí˜ûÕH~å㟱â8vÅÚN Ôë™Dã=8ÇôQ¶ .ƒÁçPùè’“ç5ŒÂÚ‰UÏ”‰´ð~¨{#¼So”Á= ‘¥bN»Ü͈;Íünf¨îÁi)c»ŠÏ%ù\˜“˜µAê`oûiû<íôzƒ¡uLŸxhÍÃùÄé96=RF7K+|‡¹/À;en,0¿%×Å·{¤,•²",?eʼnÌ;#§”v‰$%%3¼ ™‹ã1õaü¢XÆR œÄäT2ÖvŒ÷SwÇŽ‚ñ0˜|âþ<½&VÆ–¬uÁx¶û8‚_„wŠO›99]ÙÞ%ž¿ F2Ò;q<³!v‚À±DÄ+RÎa“cov©\Ю\Øå}CÌüühvŽŒÇXOÆçb¢@&B•O¯½“Gt%·¶ {GÛ5±1¿Ôí¡…t{|dàw&¿×+Þ˜º7VêHK)IÆ“Ù#gìºÈ–…²FÉù¥øi;÷Ó¼,eΖ%½,¤×Q3 Cì꘹ûyœÝM÷  óèÓ>5Frød[]?9.Ùk‹ƒ¡ï^¨`+ÅñyœªŸÌ"|ëÉUPÛç¶¹—z;„ þN‹~gNL5Ï]ÛCç*«OðïàïÌêrܰz$68À'ýa‚³¢óûð‡ìm†Æb6ƒ1*Xób›‰sØú¼¢ÔÕ„È€0•«·ï5`3vW J +:(Z³µñRŽŽÀúMXÒh+ç1¤þ2«i?R ÏP´K>5±µË`lî§´ËuoÝsSæ~׫!¾й>öVÁ^V…p”úÄ^öðÛµ‰7xÕ¦Y¸æŒëнN×õúĘåý[Ø€ð¦…ßÁF“9'ÇyÆÁnÉYlÇÆâå‡C$ÔÝ0mÖóy%!&]3ö^¹5œj4‘ÒpÕEªù#JX:®Ìl’o­f€Çº\¤;>îLî[oƒOæB¾[D…kk>£k[cœLõ¢þY ÜZÁ§ÐJ`¬†ÍJ`¦î37XZ! ÔvYq /Χ&ÌíƒCܨw|·ˆŒ³¯X ›ˆ‰ÛbnßÎBÌéák2W/I.MMU÷¿´¸ër¬¹¸b,ÖÜ\™†qýد"rŠº];æ3 šƒ«l׎ÉYa%žMü‘¥«ŠõJZžÌ4“MHnÁ°<¹²äKë>6S;¦QÕZ'K~Pn‚ê-(u+L\•»ˆ ˜ ˆTfäj]¨ÐœH/¤–°ÞhÓO–²+×U¹Þ©Üw£±M0p!j  k§{‹­ª×`^›ê=úœÇóòº•”øÒÌíC¤qð ëØaBÖv0–=]Ep†Lâu½m÷¥Mï¹y@4ú12ì?Q­õbŒˆ†²°$¬…U¡ÈBt®‹öÞS›º9t˜—½%&¹ ¿íûX¶Ÿ“°úX¸¸p÷8…Ø)&Í"äöÞ&Ób3nážR(,UAPvuláñ0zÉóÎé£I¦jÁ'¦ZK¡r°cƒyW·8‰Pª”kEHœp Îm¸¨1H¨”Om=XÚx§N¯£µ•®Ê®ŒGKÕp2XX¦ >V¥!_‡0ønû™:•p~„nÇTÞ—n©µÅj‡¹Å<Ä#Fµ$,Y}ãNðïœùÁÈ]²É:šáª¶¬£Gȧ"ÝÊɈ\Šý^=šë™÷Ì.¤¡üð|ùý—*°ñýO~ú*8=a¼¥—5XÁkÜE-­±§.`Gê×cLípPÆ·ý¥aHëÒ°ÇS.¹¿þÕž® ·(Aê‰VÃzGܶ«æB‘ÂB§É˺ «Û)¾ šV©$ïõÐ8Ìôðz&Ýâ”®ydÌWÕxH¸ÛRÈñf™z5™MÀÖÑîÍh(1H2²çuË_ÄmçÛÐB1TMC]³Â¨8¦íÜ>q£vè8¨NŒÐ}°6–(íÛó/éeâ¶àeÀ¶~K?“ÙIdi„Æ~kõB‚˜L[[GÂ\£bŸVЇÛï–™x•Dåïi a=|u&ML]‰8ªõ®îåvÖ¼·V¡º° U,†rÝmþWŸ;Ë^Ræu?¦zî³1 qÏ RæÕwÞÛç¬T²ô»vx)À1N–ö°ùÈ$qi£Rf—žAÑûÇ{DÝLM5<‘ ¦8G•Å™{BŠR,Ôí'ÈÑð‰O)kz·V·UH$ý,tÒš|ê1U[2E㥛º•_°¾¼Y2-ÍüKž<^ÊÒD^yæ¤×y™:²}9³º×Îx§£UT¡ÇTY's{îRWí)4hðÀº¨ÞÉ3îH´Qª ]È;åbjÌ,Šå¼3¾ …o%*+tã`¦Nƒjµ²v !ƒÀUðfuó‡Yߢ梅—¹Øg*)óψ3>‰) dÜW&‰¯R.Í”ªªŽŠÌ°ìt×Wa/ü—6ñoÚ»ŒÄ‹^a=PÍ(›wæyÏUrÁò÷ªw\¤Á¢LíCà6jº1JÆ^§.\9eCÓÔ­m~0áu½-&‡³–OˆzlÍ=ܶýÒšjÕ¡r™ä¡ ˜$1ƒ«:z^QÌa!žnC2%©fRUZº37…ï¨ ÍPíàEõQݳ¡´j–ÀûvîcþfK¨6wÅâŽ)EtÁ9VÅj’>/}ÕZLÒ.M›f<â»Ö­ËtܼXK¾`»• ^PÏíVú~xÿƒK·•@´ï‡ÍÎ^jÛ°Ž?’í§¡m:ÆîZ3Ì-GÞ©À\j@o!¢%y»w}Žá‡n&‚dÄà$ÓEAÆbÂg¢®úb¿†@¬…­¥³½š£‚á|Ä›¹åóÀké‚$“G“9§†…Ö¤±Tšþ«D¡ œs™Ì@©Š¶…~ æ}"oO™)fxHòÞIT¦7»h‚¡2hnc5X:`®ÃüYcìÏ~Ø,ªKæÉ¦û­ù>™V¬…`B¡ÄÜzbÖøhËb1qlZ«‡U:øw\Rc-‚ !ßPßfÁôhÚ°¢Îù¹ß™äç!Ƈ¶›YdŸHœ¶ógßÈ%Ï·ÆÛ’¦óß#;¨ûLÖ4UrÎ[¤¦äœÝË*§0™²L¤¾GaVÂ^¯Æô½Qe`MÓ7ËV‹ùG˜?LË¢ÀõøÄ8ïÕS¨ *ă¸]Mhݦ;7j»¬QUiûâ"MÞ‚„îh÷Ú½i[w5æÊ%bOŸ3/ÍUþÄ…Üõõ;¦~vè¸7kàÙ€©ú$f¥¦b[âðƒV-Ü÷‰B8‡-à¸Ô“Ž”¼g‹[Œî¡úSÓsòqÛ=zV…ÅèÖå—<|üLî$‡/ÚaI­-;6“eÄtsš:½2U3àF ˆ³–V›¦ òLåD4:¥3×vØJQ#˜K@Ý¡îc^wu;¬‹‰´‘ d#ƒ¦ˆ‘R–ÐÑIs„ú -ÅR߸ÁTdÛ9«Zk9O-oqç¬]võ:ètô“+Mg GÚ„i¿zÏé]]¢ck©ÀA%Gmr6s…Ü&Mµ-:ye¦«[ª¹:Ñè×MÙï>ÈÀ¦94ÓŽEP({Ècc=¶è=wXƒàÎÖÓd‹&1BµaF€ã†³°’¿M=‹j¸<üÜ@—i8kp5 v›ñªáÛ vM;w¯¡\Â_ Ü7½%çxµ±çn`{‡…¬¶(ˆ™‰›Î–†°´dÚª2lDáD÷MëàLîQ3³è±‘"²rŒÖ³e‚ÁÁOðÛðU·l6ÇA»ã;^o„²ºó\ϰR>ÌB>¾fqp +Ëq¤ý@ÁwüHÄDð; ^ÁÑwà·áÈ”PÂå TZ Ž×°²/æfæÆëL±vQì·³ªíšj\]©À—8Ƨ…)‚õSÆ×£Í#Ü:¬QréÁâÅU8K)È3þ~‚u æœmÃ4`ô a]™ý´Pæ¢åŠq.2V®® äŠK®8/È)¶Û„çÕÇ©‡;|Ê/J”XBäÿ]Æûô»Höýqt4öÃÿXx‚})Uî-~¸Ä‚Ž¥ëk˜QÜ)ï^I3Eô=Úþ?¢QCÕmXiÿŠÞÁ™©X(¿¶v”]é½èXu%d[é½øî°“÷±H×è‚¡QF”~–‡ þ´­Ñ’*áÅzhƒH'ªT€aѸ¨¨ÐMÎ{Ë¢î²;6D"2HHÙÙËÑZ³ÇjÆ´CáZ[¸…xñhbŸ<Ç)DŸDΉº1ÐÍGpOsõ´£¬B~s0ö7â1ÂQwý#b¢:3 ѧú†hb¦Û8V¹­¹b÷ A,~ª6ÒSá¨ÂiMáTµ V0zV§9•j—粩¸vƒS‡¹•NËä–T[¹¬–Z§`lºgØ>†1©Žà1­tˆ²j´“&ÓÈÜ1DaJ»ÓÛ¼}ö³ŠYŠÐNÍr   ‡ \“é´C\èaÒáèüóf^çCÁÀ²Áw¦^]©°œlHŸ"Áü;DRcŸ aÕnFð.Œ¥†û©ñ %™1 ðF¯6Û6 úàÒ5æÝ«€(g-”;|ºëÖ×£û¤\¢Tå…•MµK” ’ÑO‘%#g wé»WŸ‰*â Ê!„Uc½Qåx"Q=Êñž’ô˜é¾Z Ë2€L÷ý’Ä î t'HÄßœÙäÇ}ãXŒãCÇSk‡Á’²}aÚ‰‹D¦2u‘H ²¦üjü’k²˜1}ÓMÝÕžÒAÚÎ…5ê½ãÍ«^¬úV=dØÞVIT›V Ò‚À” `{ŸýœÇ©Å\í@Z·¶®ÄFÁ3® Õ«™"¤ÚG9©Î¢/MžÂg°¯É“³c"ÈÔVR¥¦L¶bP(Ðdê¿·k&¿åNöeV²ëa<12›£ë Ræ9V–RWÞcsf|1õ-Ä]®ð9±¡ª×w´o%ꈱ÷E]¤âñ£éiºQ8 ™/›®oò˜>+‘ æñ\¾ ²¤”®ðP é Ê»™:¶ƒÞ…;˜\&……l jÛ‹a´Yü‘Ö}ÛX §ò­ÎÂñ&n7åá³Þxøæ‡Ã¿þdטí\3ô6» )¿æ'_îJ:ã’îBœùöüû—ÙðÕûüþô5í/²TM¶©Óu:Zd;oo26±j £/K°tb¬Š®¡y-„ë•€[Xõ³’­‚Ôi¨$Oc¥‹…+alpˆ›'ævŸ¹÷§lغ!eÇÀUã×^ ŸË‰éZ™ªvÛLŸ½~œÎ¦áƒˆvC¼³^¹[ßååGÌ~•ôô‚b†Œb` îÂÅ€=qï€C ³èÄ4šõõ+ÅgBp©N¡8ùƒ¤Ì~ˆ²S†5“+Q—ѱ `äõQÝ—°Öbœ:;€(¾Q2ßH`B÷04O¯GŠ·’Ð[Ñ=~:pm‚Á ,aj`´dñµÝeÔš0lH«MÃ:™´Ú®3º2•åJo¥N'ì3wîˆ}Unòb ¡ºCÑ¢ö4œq浺F`”()ÀÞØæ‹Hw`ï {°”2×MÒàãrN»õÌÕþ0T”Œƒ,Ôéy0|”uç/ú8‘.s”±rZp|t½®œ!Ñø‰mÅœ¯›<`‰qÂ!VlÍ|G5}ÁD÷ÂùW›Q2e"ÎvXÓ9y˜NåKÈ«ˆ˜ö¹¶›º©xµöK˜Õû8pXâ1q˜}EB0¼ì£Ö¢¨¦ñV}V-eÇdtï%#I4•+cŒ8fÖ25Q²héW׳﬉^ÄLj?¬¢Cd0ÃòÏÙZ äºX’°"L÷1W&*É,ªP¥ÁÃGI@Y„CVÍ7Ì.tøfûM·Ì5¨gOñF”½½}!ÓÝ;Í4NMß2ÿ.ò[º–®«"!qFfà:Ñž“jÂìHÑaoÃcN½ àë±ëv`Kµ×nÐ.–!-ÆÔ[&C ‹“wô ÃDZär»¼ÜÑà4láP7CðÞN«T]–ªËŠ®U]Ô.£±µ Ó§?´ù:T[ðÛMckŸœŽkè{ÊM!üxÄQ@x<„ÇÑn'¹0‚ØhÛÏ«¯4rÌp‹ #Œæ“.!mJ?ÚF¥¸k¡Ý5f<‘óz<ô£¿iglÞk+ì>­2îs%u »»á3ÆS‰bÍÕ—bæUà~Mý`i¥’v-i׊&L»N£cEÃ'§Úú&öï ö•/ µ«îÝ Î||ëõʸ± ƒßgÖMÆkëÃÛ² wùûyÅËÊ!°Wa¨10 |„,ð ±§@¡Ñb÷p%K³Uw%ÂùBn1p¿Âïà· œŒwНøñª!ufeúN ±ØámÀÃÆ‹­1 —ÍÂb1ýà ºì†WB°Ž°¤µ¬Õ­`ÃLek_AÇ]½‹¼X 7TÍól7ª:,vïf:¯º_N_žþpùº§ endstream endobj 4806 0 obj 7129 endobj 4810 0 obj << /Type /Annot /Subtype /Link /Rect [267 619.250000 417.750000 626 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 4809 0 obj << /Type /Page /Parent 2 0 R /Contents 4811 0 R /Resources 4813 0 R /Annots 4814 0 R /MediaBox [0 0 595 842] >> endobj 4813 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 4814 0 obj [ 4810 0 R ] endobj 4811 0 obj << /Length 4812 0 R /Filter /FlateDecode >> stream xœí]ɮܯÝ÷Wô:€Û¬°5È"€ YYvœÀ°Œ(^ä÷Ó½ÇîsI^VÙeÁ–ü(«nÝyüöÿ~üçoÇoß|ü÷ñ‡î÷7Å©.‹Û?Ç˯o^þÀ6§îÏǺ)?|>|9~9|8|8ÿ÷ËáöÂÇ7>ÿé¿G{üÓùߟýÛù‡?véò>jSŸÿåú{[›óŸŠÿÿ~ùù¿ùÝñ×ËŠýçºÍ¼þÿo¬÷Uk/Ûùô—CLsýõÛ¿¾½`ÞW|ÓºÆwçÿ´ÞÿóÃOçô˧ÖSW¾.–|¨¶—/y{^Ķçÿœÿ~èúKiù¯Šv½Å¯;W‡Šq•‘W׼ܪ17•õàïW_üµ«WDœËεÒ_-\\ófÛÂuà©íwûu}õÅ[SÙéöºs}°ô·{¿ü‡9Ë཈Òå‹ðâ÷Ÿß¾?´:~úé¼µëo¿}ú|ðçÿ¹È“¶=~úñøû¢0öÇO?šSÓ•-¯ûëžøùOŠòúÄJ_5õ«'5\­‚«½¹>ñ'ïnêÀ×wà®»wÞ}:ßÃ2o ESTC0ގמ®»y¹Õ¢…OÞ 'H<±x5 Ÿ|?…'ößÁ»Æ«nä¤ WŒ¨äüÅÁýbT´ zR`ÒÂèë!Êðw×'åÉÙÆ¼~2F&Îs{bLOÃSˆùG;€d/œ~‡b%9s{2eùÛ_5®‡þàë‚ sc¸kc¤%NjÞο0ß³Òº*§Â@  ¼ëï×ÏÅ8øNé~Ç»ù€¼Çb†äÔä)b¶íoÀlÝdøcDÌ"ø `h†°$Xf ‚„ÈP!(nEŒ@s«Ë+®ùÒõDòª&Pm”–wóÕ3K¨gxªMþ;¸ZV^C+¯³îÇáóÀ'¯Ý÷éìlƒíT8ƒ!ð¿ƒñãA鿃y |CÇ« 0` ƒyÞ5¼9¸5p5øÄÂóX¼Èâs{cÙ¡c ¾áóO¾NÈ,Û°¤ÄüÖµygkðN|÷‚^ƒÏ a•2¢äf@éXšñýè>nko:`| rRaP«ø2¾9]ÚlR†mSFÖ1Št m —±5ŽeFâZAé›À”Ápyeoæ}Œ¤Ã´‰÷WÃO¦@ ërþáNöv(Û&„Œå3µö®a=@Õó×éa¸PU/‘µoî´©ú¯bJUÛÏHÚEåÍkæ`ŠSU›WQV!:„CØ­CDPØmܼ™°Y|ô9YÕXÑŒ á]ÔJxÆ æÄwÇÀQC&ø©Š\ì˜ kI¢p:>#Z*cŒÉYcâ¨wäƒÎ§3¬)ª?UMqy>Î=¤:a³3ðî^È|Ã'ž‘Ú  wÌjºlÔU6°4 –·„¬ 1'ò°Ê|ƒw”€õÌÜI&æž(ª!Tf¬E úÕê"ª-Í–DÔtþ¢| ÉN—.Bª2„E—ãõ()>Á#ehã/Õ‹1#t³è‰¸·`YŒ÷«Åß!ÜmTý4Ç.¦èö„À¤0DOaÜ[kÓ>NáI*Êú,4£’i"¦,ûÊ ÄצÚê–[Rüë׉8ÏÚ&|.Õ¹ö&UBZ…ršøºÊѦº:Ä^C$L˜yFÁ¾'Ý0_ÂE!| ЗÖ4á8§3CJ˜åaÅV7 B¥Ÿ´ê1R¬0ßIaî]Ù¨JŸqF›z² I±0—Y^CÉÐ-Va{]†MWœõ£ª„u†Ú9𴦤³Èù·‚Ñiò“ô¤M5¬ˆ_µw‡æñÍ\aoû$>Æ]Ì›ÉQ`’r„ïhd/úÛ"ÆŸìJO§ ## s•$YA÷99„+¨«ïšå ŠiêUFCw˜v‚—[|=^óö“Ig33ÎæêÁÙ îò·SW®Å!=ÕbdÆÉ¸%Üÿiò†·æo/èwžò2lôøùÐíËürø¸â_>4Pk³ÌKHæ Ï0D‡‰€Â1öp¥ãô5 §KÞ–»#°Ðó|¯{T•xñ «0”h!r˜8 Ô´Åjè*0¤Í2_@°ÈÈ[$´]ŸÕ躗&< ЅŶͼ÷Àmz{Çq,žI™žˆ£l&®›?¢rfô "!‚ª¯""aT¦ÖÆd¬¯ÊKß-‹×ÄY”3t•ÎÊT‚'áëÖþœ?9Ô'`é…ýJ,ìº$ôc":(1{Ûi7¤RÝ´C†ݹDy.“)¶|µD‚Ÿ 1Ë ¦#¸j€iÑÔ¯lFéÈø”­¦½¤´¤«FQM6âÌÒgÂŒd Ò¥»©–(ŽÌ¼U¡¡ÞX{¾5=¥E=€Gï¬1ƒo&­ŽeŽ=+Ø“rÓÍúIMnç«íqN%^·¯ÕÂã¸=36ÆÕfÞ"_švÈãugW1yˆiV”fq aUØ¡<ç«Ööá U±ø=ï…Æ>˜„á'«·È©‘úApÍð+a,•±#5ë–*â*ýßë„éøˆñ[§Lh’±*~?cø[(hݾ ¬Ç¢Š8¡ß‰jûF…ñTa˜v7±J,ç  $Õ9m|CUU!%Q”@3f@¤n×£ÕM—ÞCظuÀAÈÁÍð ©v’Ün³Q’î¸T¦ò¬3vËSѺ×pÃÃGnZ±±ý£€‚ØöQÐfÜÔ¤ Å4ŒGë¦8†šÌSN 2¤NhðH‚*¹^ÙñyŒ—̈N¿Áî\èþuXÎ󾓿„ }{k-‡ùÂïxœIWÎÏ÷fym¯…ðÆDœ7†Uaè¬ö£tÖ%‡ÙOëÆï?ÁA!œÑˆñS„•0Ñ”˜ÕˆOêzd|ßÉ´‡ô /Û‹tÏx¹ /‰ˆƒËŒ¬d8{PìsfœKÓÎÎûù:GÊküD ¬5ó_©¹¬8[S*ćù^ ÏÍÅÚ 1Y€5ÖjUçæ ¸ƒ¹¡Õ pÃ7‡- ü{ñÞ°|ehË |žT’U°œ Ã;›f”—§¬uéN04‰ì‘¶¸¤µòz£¥•\V!!b«ažàÉë˜ßQÞ¨Õh ïËPt˜ÿnRÁ6&÷ s(ÊžÆ!zfZ–-gÓ„ÐE/cP¾\ùÑýè>‰Ë«dYλa(Çñ¼öqïÍ2Ž;™¦-ß·éŸ(8I™²tï§+ê#]›Eq)Fw€øÏøÿuKŸ(ŽÂXqÄaoŒ|Çœ‹Àr‡c:Øwà°ïˆ*a Œ_j‡m=!+€ø~„óà[  #Ø¡øp¤Óc 3ú aií´cÑ<ìÅ) Ô³Å¢¨·ªÔ‹Ïo=£«b{ Û¡Ø2Á}Æ0–9jñ¥¸#们]âwùù†µ@éc<C' w°füNt=NLn¶W™¸0£c ó'"5 KÉúEü?`‹-û,–4²jlÛÇ•³j}JЈl-*“ êF%öëÊÞ¦¶Iå´¨®&DdYkºT²7·W‡„÷SÀ$¢æÑ*²Î•%åsq¢¡âPB·ì×ÅmHY&>κGá¶TW£<ÝIT:¹ÖŽÃJUfÜÓ0QñCÝI î›Fí€7K"¹){䲤"#!±Ïïgo•+º-‚ù\±§ŒøNHíÁûv ¾àL)ìUÇtOh èµõU˜R3ÿó7Y«fzxXÌËu9Ãk˜wtwñ::tæ·3µ|³¤+„²ŽéY gª¿NÊ"x›X…)}oùÁº\G¢Gµ›$†•OT—‡”e±¤îÊÒ:*mr~BïÙûiìè~ö–“²»nÔLÇ8Õ-¡Š5GŸÈ6O=ÞSK|þ‚Ç‘ÐÛþ„1ß=¾GÌ£{üipSz°>1 ¿%21u«Œ™*V¡ZéÚÄÈ6¬¿çf=`-K5þë0QÍòavMé+°0Kd2Ó¨ÁN#vz™}ÌKñmÆNŸ§ëæxNŽàË d»æZ[ÒÛ]—bjѲoA‚u(ßS›š´ÇŠà–¹Ã¢È‘ï°X¹%:ÊÝùÑ3c¦,ù·éÇ VUÿ4–ÖF«t²¿HÛ_„©‘ÈÀÚ(î¾… r·\’Ó2>[Õ}ÖUñâÚL¨ÙܦöÍHè6Pޝ>“Ž‘z|µvKæ±Ä·1³—5m[Kwª‡psxטã3·½I™“ýnÙï6"§÷»Õå’É&ÛœR?•§”yJIÖñGn;õùu½d>F°ÊèÜ.õ,šº >É º.“í»Úwñ5+Œ!VévMÎ&‡‰Ù”`-Ì1éÚ˜udè6í¡ç™"–€Þ©OÇÚBüùbñ» ¤a‘5vIYÈèqã—ÄÝ·Ùéà¹&¡5UZù mÑç+èÎc$“ËÃØJTŸæ;&Å—©Áº(«ZDºÒ6<ØYmS/ÃH:0Ž2¾¯?‚AY¬ª˜¸ÍÛ¦rØ íEØj{¨¬åº6Uèèú[¨\ì@þWau@íÔöùrºÚ)övÁ’?n_+8£™é®†¡ƒ¹*–zL§Afv&1g‘©F,fn{Ǫ́ ÚYÛNûNCÍ] dÝåÙç"e…ò&}ú©¢j?F×Þ'ŒÖèûìU]­1~FÕ[ß°ª®KõèÖ­0&lWª³Ç&'È Rœ±¼&vº}–‡EX›¿︜€_I·÷d®8Ý(Í0Ù$)÷=ñ˜{oÓª}L Též#REÒ‘€Ù,æòÝ5,­œ=ÂáKÎÙ_ö¥ë2qdŒ½OÃ;ã{_ C”¨¸ j>˜ØA΂HÁZÍYÛÍ‚0g#f-+gA;H8 BÐ~Tëts®C‘´&Ãø¥(»×h6Â6ñ:g‚¤€ñA%²ëë´rŒ"Ç(F`Ýï‘cEÚüöy0‘ðˆdÿ—x?ÛÔýŒl,C…žWVŒte¨–è~ t3Ù™ÉtiÛ[œ2$53>7=SÓV©‰é _wÈ<@º¹œ« v_crl™è*Ñ»&‰þ”Ƹuz4ÇÏrârø"¾´ÍùIÏÓ%úyìbCx…'Œ†Áä.|=‰Ž`Æ”[èÑœ2J^:Ö¹{ó”Þh÷f kLM¡üˆL £í2õ¦ªó¿©³j½iÊÖo°ÙñŒï&T&lüêWfžHôjÄÜõš³?ïzmL»ŽîAY²{ó‘FçOŒÜÝ@–mʰŒÍY_wõõ¬¯“ú:“w™õu2Ÿ%~Ï{e¤% ßõ}Éùm[¥úl·íÓn³vÉ\êIοÍüI?1·MÕ35mDX¨èµį̂”£wA¹ª¯G¡˜Ä\&c«*ÂW]1žÓI餪«Q½l±T#>ÿ:~9R„󇱿0zí±yt θSaÊó_»ÐßøMyr¶1—­!WŸJ_5õ«'7ÙkOÖ\ÜQnuÿ¤Ã2{ªÊ„¾r•ÛüÉ»ë+/ ý}§£öïtâÑÞÞw'­»- õG«Ýø´*16kº£ß°…–¯áŽaðjð®”ÞÌ:ú‹âCá.>ï¸ßù;ô­näà,°ÞBx‡ÐS€P3@ŽûÀtÌçÁ÷ ±ÅÀ= ø ¿ƒW0ŸÔÁwð®!t:õèAb²ÃÇ€—7ÛiÇVÃÄ5Äa³~ðïÑ ï„@aK˜ûâ`ÃH5侇#.ûe0ˆåpuáNtœÈêài»ÊâNOÓŽÿ_Å7Æ endstream endobj 4812 0 obj 5007 endobj 4815 0 obj << /Type /Page /Parent 2 0 R /Contents 4816 0 R /Resources 4818 0 R /Annots 4819 0 R /MediaBox [0 0 595 842] >> endobj 4818 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 4819 0 obj [ ] endobj 4816 0 obj << /Length 4817 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWèÀróÑ/ `{ì90l ‡ ‡À›M°È.âì!?ÒtK;ÓÒWRÍ.’w°žñÐê.Ö›Åz¼ýã—¿oÿùëöí‡/ÿÙ~¿ø²©vm] ÿm_o^þÂv»ñçmÛÕÛo?o¾o¿o>o>ïÿü¾>ðåß÷?ýok·ÚÿÿÓö¯Ûÿò‡ñþÁϛִûïÿ~þÞ·fÿSuú~øý¿6ùÝö—ïyý÷7Ö×Mã`\yõ÷Íq›æùë×o¿lÞ˜÷ßg›­ñÎoMïíö¿ÿØü¸ÁññÕ®÷Æ´o«%/jíÖw}_¹­±ýþI­mÏÞôüèùÁÞ›Æök=|„<‚8¬TŸàÊG¸ÒÍ_1­¸­Øwð3p%ý¼^ùøuÏ&«S¸î:ˆÅ÷Ò†À"ä$Ǽ"FÚî*…ðJUÃÝa.…+ø=C`àʸ)\a œmðÓ0ííü ï8h å^ø Öp?òA…߃W M±< °¼cð ~^ÁTÀ¸†Zsˆ@SŒ7‚««e°î„ïÁZUh iÄŒù€Ð!aŸÆh J‚íÂhetìaß.°‡Ë&æŒ_È}‚NÃ^ôQ¨ý`°–_° FŸÉ ,² µp?k!ŒQÆîb Ä|ÀÈ‚¢_ï«´ÔRž/¦ ¦=Æ>0˜‡üo®€°9ÅsŠwµ2…)®`tEÐsJñÑ¥÷äé£cíàqÄ'Ë(ÃUã!PÖŸð{àNk$P!èyˆÒ!̹‹°ïñuˆ )°Ñ+Ú÷Úk[q&š‹9–±È ûØS¤|H'Võ![—Œ§˜§Éx¶‚ï+ŒP"Œ’Í(>¤´R|H£X‡; ÀRBè7æ¶V ÜiÍHV>WoØ)÷¤imÌHï,*_co*KmÓ‚¸slŽu‹|@"V'Єð1/'áÛ"!§†@A6ñýæÃx‚Ôf©…jŒk‚ß“ESîù®iUß_…'ðiK:!‚‡€ßCDI=ˆµjÑ\”dhzìu³$[SÕÿéÚ×oŒ¹¦:f8hOÂá§Àøj¦9gN¦²mêgx¦"Üíº¾z½2ŠÉ¥•Aýλ¡®w*tóžÖŸÌ^½s¶3¯V þŒGPã÷ŒL> cx¡ûí)Âã äÛ‚„É)l"r3­+Öµ‰(.üJ†pEµæZ;¡¢ Ê1»Ú7Ý~q‘î0nþ £½‚hA¡BÉÔærG<Þôžn l0!G¼QWnÊk¨©K¨{?Ù¬€KLxŒel=ª¹øŸgûÞMrÆ‚„¼V˜@À‚X3@ê „ƒïÁ&|0kcÆ:S‚„B;ó‘(G+¨¶RÌy§ò°ÜîTPÈg˜ê>õ²BH¯;jÿ4¢£iÍDÊ™ ÈŽØS¾€]ýdhŽ'ÃîúÉЙ©—Mï1Ó1äø«„³[wJ—Æé•¸a¾4„6§JÖð‚Êcذw£|¸ DÊ) 5¤‚ 郯É=Œ@zLâjïÇg*àkrââû¯BìÆgÿ•ð­ÃòÆNžÉx?¸t þM†íNïf]¦æx"9ë¦ …#ð0°1©C¶¤[™……Z £Da†PÌÇÀ†)‡µ .ÝÁ‰Æa1J$ñ3Ò(p‘FŸ ‚–>J‰‰ZuØ¿N<²­—”0âä¿«+:»k—¤öàí«Iï~IáKÁâ€Åάƒ«°+yžÜ˜rËø'·r>îE÷"ãÛ{ÍääÎj—5à¤ìÀÅU¸? òØ’£Ò˜ J 1iÆ R˜+gr Óºˆ‰Âà_Œ|8 N˜†AŒmXOÊût;Šg̼ïñž1g)Ý÷T¿5KÛO¬Kó•4PŠ£ºÓŸr5k§xòÓ½8 "#OÛšÅ9ÌÄR¸î©äÐŽéµFÛF8~ZxÌ«¤¦¨¾ 0e)°àga03¡sgÔYÛ4Uô)lZµ%wW'rgsƨ €Ò+^m 6&©g,Ú>‡úš`f½Çcí 5ûóQiÎtk$çòjM×d°ƒßÃh&· Û°¼ƒ½Lm¦“…Š»öõ¥°}o§¼â”39ÔY ùAÑkÍ…?Cä±RY¤A½*Á5‘I{où‚“W…g¥ãý+LXˆ8¡2§Œ4òĜˡëºVGßÇÑ©Ÿ0]C§éR{'B½öÎb\3”Jgv¡ÿ,söÄûÁŸa|!l‰“9U)–þ…ÎúþÆ(qf ÛÑW­? 5Sw=²Uj¹ÓYê5‹®½‹¹ :¸êïµ3³Ú“„{>NäÇ Õ*ú‰Îþ t(c¼ËÇ9çØ)Ó»8 ¦jBÃx“Cï86ÏØM™ú”«,qQ‡0“ˆ”ü¼°©î.a'»uêvŠ9%0±“,}!ܹ™é霈—äsÈ€.^R© o¹ F¹,G‰>ž%’#í'y¥Y’;¨YÕvm„·vUsU¢SŽÚ¦|;ˆ%š93Z ˆeg—tdÍ“/™LpµÉP ßPpˆ;ª›¦sÓ´jEÀ† Ûn\cqmÖÖ,O ýäÕ» CúJ1÷_LÇ)¢DЄ_í‰:8Aã3™íØrc™ab³L¶ †ÓŸÖˆùi©ûü]£ÝwUkZ*U½JÄò¿†ª½Æ|ÉtÑÃö™ñÞ‰ºp­‰XÛQò ñƲ £º%ùšgó¾2Áßz¥ž¤?É¥šœð kÎ3ïÃ&¦™ÖZ)ëB¦5®°òiajw”jP´½Ö…Éͧ8“ \|òPåX˜›Í1•¡¦ «9\í…Ñ…Õ„`,ž=«yZÓ–ÔýĘ0e;˜Î0K¡QÏõæ™Ü ‡( Lûí¥s V¤A«"Ã*]s—úS縵§ù¼âpÁ'á|ÞãN¸ûr:ìźã¡Çºa%åzUL/å‚mÌSÞZ“ð*flƒ ›«ÅÀbWÿœÛÅ*¨\¥ªhÆY^Õ9_Ó`4vj1î]÷¦\ʼ¶"…[Ø•8ÛQ¾Å€HSíšÖ¼ö-‚IÛjêv"ñ›¦nøJ$v ÉÃLy)1üjë¡•cgÍ”'°|baxǰ[‹µ%sŒb+³5ÒŠ¤êŸ’ŠQÙØœ0Mp R÷¿GØ&Ñ”…‡¬l“ÂÆÕq`ëöŽ6Œ}‚?S >І14ûW&g ï´MôŠJÑØfb4p>Áñ?F„˜x<6\3˜3â'Xià3R_=TèªS¹7Ž¢X}̆[Ø•ax%l´úŒóŠ×x„U3B)ìu}ú—•ëú ÎôE¢6£÷ظÏ:§UïFý„Š÷±Ý”sðY Ц`‘qN V„r ¢]Gm›úfŸ µ¸tRI#g'N¬~ñ1,Ç0ùMJ¾6±?Ë/Á./¶¾Œ6_+ËÄ·±ÿQÁì¹ ®jŽ5tyv”Ĺ¿Å‹©ÖñbfÕ¨¤Ü%">÷R3K‰iW{®Ä­¬qÆžrç‰ú ŠÇˆÊJ­zÝv­ô¦óµÑÂÓðDL9b’zØ™[W¥DGøSËÃôš¡ú1O ÚGJÀhÐn7¸T«šŸšüGȳÐ§šÀ!TšÂ÷PJidºš<ŒÞ¡z\eéaSÓÜÛÛŸ,»»jMe§’ôˆP©&éÝà6×÷ç sÊ<Ë&zwj. »ÖàÓØ÷ÈÓNá(b‰cJR¢ÇÄ<¿Ÿ7ã³%€k½nÏδ9t{ŽoYòÔå( yÆw wÆUjÃ=á µUõm¿¤;rÊ+aõmüN¾B1zÇÔ”±_X89ÉCØÂé€+Yé¶>µJ¶VX¤UDý0 ,„|IœG†! š-Ž+6çž1Yé!j™dAª¼ÿ®ò»v¢CZªáPqYR†ÉT •€um&<‘°Ê]YuÄ/ÿN ý;r]ã^f-ï¿¶ß÷Ü. Ãçkÿàié.W4¹]ee[{ìÀ?Æ:.±Æ°×ö· Ìîìs?“sUМ¯Œ.¥Ýe!/pj Ó<¡÷¸kÆþlŸÆžU¦ŒB€ÙÉO™· iÎ78êTÜÙ Kù…mü4ø™Qñ˜Y[QšÅ2ÜáçêÔTy<ñ\Ò\õ|°˜ž |Dì)`¨›0Çù/ $£é¹@¾[ „QàWøü4“ñNqa>†bg /¼H,vxØØQóc«~I¸¦ü ‹ñ)xÎn‚u®^.A€ 3ÕTû Ž võÂ;e5\[¹ÝhoTup·£ý„k>Âöóæÿ¬Ê¿0 endstream endobj 4817 0 obj 4675 endobj 4821 0 obj [254 /XYZ 32.2500000 444.500000 0] endobj 4822 0 obj [254 /XYZ 31.5000000 446 0] endobj 4820 0 obj << /Type /Page /Parent 2 0 R /Contents 4823 0 R /Resources 4825 0 R /Annots 4826 0 R /MediaBox [0 0 595 842] >> endobj 4825 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4826 0 obj [ ] endobj 4823 0 obj << /Length 4824 0 R /Filter /FlateDecode >> stream xœí][¯Ü¶~?¿bŸ d-’ºAر ô¡€}(úP$M‹  êö¡¿{‘öØÔ~#éÛ!EiiÃ9'Gg)r8óͅÙ7øáo‡ü÷ðæÝÿ>üØ}÷ÃKqlªâúçpþûÍ—?°í±ÿþдÕáÇ__>>¿||ùxúïç—ë~x÷§Ówÿ;ØÃOÿ~9ü寧þÔÿÒù~}iLsúú¯Ë×®1§ïŠÛ×óÏÿùòçß~;8¼®ŸÌ×ÿÿ-ëÚ•çiL¼úó˰Lsùûß{ys%À²·”³u{0åé¦+íá?ùùô‚aøâØ•Æ4uÙ¼¨±·7Ù®8TÍè=—¿:£›ƒ;[†ü2sm¢Wqðc[Û¦¬Š®…ß?H²ª'Y5f+©ÂíHÙÔ!y©:Ë’2U†ýÆ£kŠrUvEù6zò×E@ƹÌ<”(ÃÁC‹r] âpúbGJ[ÓÜîËÌÕ©2ì7]S”»¢ (Ê·ÑC¿«]ÀÁÏ3%ÊpðТÜÕeHQ~^ðÒT!·û<ó`¢ŒG?mlÿ~O¾»=ÓÌž­4í!¨=P:D^GÁU® ÇU×™<¸æÎV®—èª A Ûð¯Š6 ]f®N•aoñ芛[™Ó— ÎoÕ§ÿmøƒW.àà—™«S¥ßÜñè—Œ‚§rý ˆ}>øöÓË›'5q"f}øôóir—w^¿|:¥:|sö- søôÓáÛ¢pÍïŸ~y鎵­†)^ŸØïПà“÷ðIK<Á³îˆàYÃ'æ|çVà¹ÁÑŠïá{jø Ÿøäíòõ8?wN˜5|bJ8ƒMr/¦›Ã+…3ÀÔ±ñž+¾ÿt‚²à(Tµì£- Eà“®?aæf ¤[¼[ð3‚Ì@N0£Æ,ÏÄz°4Y8ƒK-Æ4HQŠâ`\Ç+Å»Mìž5æ^ÌU'B=%`çÆA¡¦É(ôŒ(IÛ㹌ð FH:w2f¼á`Wgܘñj4U™(нJ, —Å3Ðõ Ÿ‡ã±…±7/›±²ž'v#`¦(ÖÕÄJ…`)!ì‡i£{„~¯\<]]šjÚºÜäoï#ÆuaXëaŽ%x¬‚’.x›7püv“¸Ž#ï9ö/II¬Ø?æQF¶1ÝqÆÀØ8 Ð:¢xÎOE¤¬Y¶‰ùÜ4 yÆñžq•Ãtƒ3À¸.ÌÇ0 ­K¸ÛQñ¶rÉ dÊx‹%‰ˆSè€ñ)R4LˆÉ'Lõ1çA`tÐÀ@Y\ *†$ˆÞpnmW\æóJö놔ÇÒ]¯<úçÉM•4uõõh½ª¿óž^0ï=y;Ÿ"%f^̈Ø$Ðu%0ÃÇUÈYÔµ·#˜ßzè¾Ç;WñsǪ¬Û¦¯º::Ûš¹œxÙÖ—û{ÂQÃAð‹áG/îôκ ž}ëÏ~ô<LÇùƒ2ãAà*„½Æ³ w÷úP[D%ãf3&æsà†(“$©Þ;܇ùz;ûWºàÕ0d´wXL0tøÞ[ËÔ6æ<<%Ì ˜0£1r‰ 7Î^g`Ì0m  ^ Ê»Mc}AÌ'äÐÀÖ´¾9KàæxA²°lû8' ‚åã*æt *@pîÌùήgÖŽ^c3[ðr`ìÄÒ5Ç0À>`h(Áp™¸# nt×hÆ“(ðkŠÚwksžñ³ëcm© ”Ý!,ø œbŒRزÅö^a¥ ˆƒA=ZÐ>¯2œžùq ë›è{S~öA¬«<&Ïz&†žq¥ñè^¾árö»ÝÚv;åsíœ-!ÊÂÎn™çc(N~¢ÝsgÞñž{íºa¦˜Š8Ÿ2Ö0÷‰,Ÿðg ¢P’Að˜p³Š¹ùIä¥oÀ’YFQâ›îÍÏX÷U׿ˆo<ƒ;sc@ÆÁ‚ËÄ·Ùñ¬Uu(S9@×gx†wã:Ö«k–\ !ˆÎÉavŒ·¹.U‘Qh (t«Ç’Qè©P(×¥Ê8˜qð†ƒÍk­‹Œ¹.Õ·¹.Õ9>V]ªLQ‘¢‘$x§§×qôa®Ð1ï=¹öS®ý$Ï gääÚO¢,$@똞V®EÌî\;s6còœk?åÚOÞ6C~ôú™2Þ¦\Ý(×~J„ÚOSݱÂßùjíh`¯„J¹öS®ùó*8¹æÏ<þÀ£ÁmèHÜÚKº s{Wƒ„ÉÂáÍ ŒÄç!àˆVÇiWR!Õµ§‘¨ g¶#SÖ""z}’Ø%àÚ6>ag€I!þºÉBÊž5}`S𡱒m„pû>KC}ª[Ǭ’û!#ý‚?‹ jŸ)=‘n1«5¥:ão¼Š©ötµ@¶Y›c‹…©LíG!„Ô`ŒÝ‡qpšH4Æ—ð·yy(ëÖ¥k\ëcl©Ösm*RW6_sèš¡y(}µŠ:5}}´/è¾Jc±_ÑÂÆ9 ¥T“c¦a¢^ùJŠìM©‰Þ²áCÞ]P¿/–ƒÑ×àY´ !H‰a(¸’¬Šq²rTÐ5Þ"²’½t½¶j}¡‹ku/.ݳšH~ e¼â÷`­K¨]RàdO”Cº}Eí|m@Øf‚ÕÆ¨ø5ˆ‰v ãºÅø}Œªá†);A£)ÁªÿØ’ehB8l‚%K¸™Ø’¥@*–„OpS`ˆ ÖAÍï§Ž"ìÕ«ŸÌK ÚÕqÄ·*½ùT;ŠQ&S‚ªn>ÿê„J°/‚¥o~Ÿ¼Mk‚ð}·˜cõT‚Õa£“HØ:9”«û#ûЦM@ªÍ}‹u$è0TÜ#‡³fu¥˜ß<_;EÎ-ØÂ¢´ƒzºÕ4ô )åiïF$‡!Ú±¼®R'V´±jH=ÑY_Q¬ÅÓŽ&øt×>bÑ ’ÌæÔŒQ±|†|r< '?!BõÑ»(µÆºò¦_vVg.W/¼qù½'¹sîÅ,îœr/f\nªÞÚ½'»4wÝ­[îÒœ»4‹³Þôø2Šæ.͹Kóv–…zÕeìe3aìÖƒ%c'×ãxc‘ Ép/3kF‹¯® (©'z‚å뤛ú8:Ôå>‡¡,«Üç£(Õç0VÍwu#b* ®ãääö"'·'°Lȸ—Ð T§kƦÆx·ÇY«¤ÊÝ&³ä󹄸ãF>U˽}D †û{EìâUMîš8ë=¹¯„v‘Šží.âŸl3Ï%g™ˆY&C’ÖÈÎÚBêDÕÕ]uõÃr¶3Í’3(%)‰¥Û0FŽ+-B , Ð:¢f1Æ$£ RÖ,ÛÄΜ}ž„<ãxÏθj}KÇÖJ¸ÛQñÖ¥ƒ)ãmÊäXY 9¾Îa¾±Úƒ-ï÷­»@×Äí %¸¡êÁëjô¤'{}ìk`ÍúL?Ó_ónP¡Ž{£á'Г>maÙ‡f݇œMyƒOXô™›é2¾Žú~æÊüͱkgSS”ͼ_Nƒ^Ȭóž5üLŸ@soxÖÖFí*•\ܧ´¥ûšP¦:'˜‘ê_àún«ÝÚßKKzŸ~L¹…h T+˜Q]CÖêv5®ÅpîÏ@˜aJP¥îŸ0ñÃV¯T.󇉿¸|H]ÒO™¥tˆžTµCB0£h]Pé–á§,~KȵM^¥ÖC4}`š$1…­žXëÇ®!¦\"֯곤|rÂHµfÓS˜‘{¦ÒõeýjWØ=Ó¨ÇÍT—_0üúM£×œ_òW€>ë–Z_Ò¿gAǸ‘®ÖäHÜì!>U9`ëWkŽfXÁ­ Õ˜©7çqÍF šYÒdà"SrAçÆ©X]ú¢…wò] Yƒˆ„^½Ì)q+×'£,r'0+ }"É]З€éf‡yS£íq´PèóF¢Õ¹Ç6áµ¹ïѶìä,c5?D3ö¿¨Ù€îF`wŠÁ€Š©²ÎÓLÊ J÷q¸Ë¢+ë~=Å|ûF°‰ð“½+/LH*Ä«IJàìN䟘ÍÖg&³s×âg ʺ¾&p>‚a¾Ü‹g­r„­kÓ«t|%lmJD&jéªÍe°U¼ä”hAìs&~’¾y¸=ý5îãne¬u/o ל™²µøˆj9ŽÉ‚R!±¾ªý!äuý?áµ¢-ZŸR‘{„¬7F-ÇÝ‘eø˜Š+óaP÷néúÕ‚"2›fOÀ¥d,$±¹î¼)Öxίª(‘qôu'gŠ'ÉkæÈÕ•õñï\ì¸].ÐMò]Ö‰ØÆ57‡Èø&0Q'@¨pMTª‘íS;Þ›|®/ÜÆ5T{~eWM”’X{ÊÔ@H„ûÿD4½ZÞ9-¥Ú‹Ø+‹›âX7fæí”ýGû×O癇“ÊÁÖÎc×5fÓ‹r§|[d¹ÊíºÀ¢„D3y^ãeàC&¨=?Km}v‹•(•ÍËjîBæÌ¸Ò×|Dº=sž-Ü¡z•oº&qÓõ‰s1Ò»AµÉXçóÞþÝÜE„vÂi«oŠÔB`¼ÛQÊYoÝÞ£þ´øR­~RË­ñ–&02Fc¼{º8­êÈå G¡Ò¢6z”Æø)ó]ÎJ —‘•2úX·>Ü´)Ž21þ#9DÙü™‘½Â8/ï —o“7û`{Až1ß-(×Á8é±.Y¨ä33²±À%Á@È`{Øpû¯Œ ¯bZ`ݨa/NÚW•e×ún_`-£¬:×°Pqî 7GùþD‘£¬øfE5râ”=I8š ®«³[ŸqÇÒsCP«/p>z!a¢éT'ò&•zºÇº®*0!¶&™ƒ7,ŒS¡{ùiþ¥xlâ±jz±€­~x^ú¬¿ «_¥Èaì"aë;Ñʶ=cÑalYPºâé¥)Eéi¤¤3ôTz^$CHÿúïcàKÙÚós¨„TÌkÕê‹–Z©²ÚÍc^ª©ê¡F¾TsãÂ|©&_ªQÜí½]ª¨ÃðF¼ÛSH;ëbÈÆØi0BâVžDãVU LèŠ9iox«+3eñ,Èe 1M¯UëC9CÒ_{àÕÁ'’bŽÅr†¯ ªbžµ€5Ä> ¶ÆNü„˜µ@Qlsa`­…Ÿ0ö ®Ôâ]À:7¾ÇV9Öz˜wàÜ„†ÜX²p;ìH|-ì Ïhd®Ì!Ì ~Ã;G¡ËÓø ¡ì/ü•õZÃÏÐü·v-B|¯.a-ž-ÒBÙ"-°œ­®]•u–͈VySȦ ª£1²‰×£—µ2ƒ¾®–TL+B¶0ãGkŠ/cr_5œL<¥VD´lš¦žÜï,uãYË™x£ƒ´vjÙ3x¬«à1‡õQ¦bçÄé^O…Ïg²4eiš”¦ö5¹)K“´&VFDO¶IQGx‚ºÑTLk]©0Mõ,@@ÈÔŹə¦,LMðÔ±ÆüOœÕc`ŽÝ¦Ô ž|F;‡WÊ”_%Îg2 A¡ÊNï q†±¾Ô¦Œ)Óm›hGÅš ©ÅïÙ°oÓ˜G0`uÊë"6–3ü…°—ÌÈÌ×ÄúY Ÿiâ¼PŒBØ»ÂZަkoÄ<k»VÎ&5C0u²<ïSž;ÛNò¥À±ª9«9rÆ Þ²ýI8Ãrw¹Š˜:L^ÎHÌy‡Ô­0<7ƾÕÍ4a¬rÝŒkå Ø©fBJsc¼laç Îb*›´0(Å£áý!dŽA¾h÷FT姈éÊfruëÛº6Áú¾…E½sÎ'ü©Ë™ênGõsêGrÒò>jãeʸ!ä ã¹eá8„ðtÏ"„¹·b”ïÑ3vCQæœ1¦õÒV_¿u]mrzs9Im]K"çq)Ü©Êú¡åW×>9Þâ¬Å˜hWNßTÕÓreàʘÁZoé–°T­Hu3[¯0,SW{™mçÛ Ê=Iñ×tJó2ì›ËÒÎØÈÍkÖ¯²™*DA=S9Ÿ¶Tð—©·Mõ$òù–êbµ Èu$ý¬Ó… ¾X§óÑ•o © CD·g·Ðw€©“ÌT'VE}­© ¤µ,&Tµ=«3â6›ÇÇjÓR™ÛýŠXmZÒiäM5‚`D˜i§ªÒ:„i·ü¼6?Õia´O)÷, T/î±@Ò0cæ]¢Þ"Ño÷Á7ëOïìÄ7Ó1±"EÂÜF 6úÁ#­¤t#1Ž^´Vª½:7Ù.lý`;Õ/£öqß> 4LƒCÆrƸ»›H`Wµ¾¶Á€”1£×j½IÊUlå]”¨Ødz1›Ü½4j «ÊÞÚ°¤\¦'~àƒÈœNÄíUô…ijÄЀ¸*”ËâFç rþ>Ÿ JD°S¿0òiïÁ›;™m§Åfx°·DF­…+µ›;ø}Å{´æò`´ßõøIŸ(d}œø‹]5PÞã¦Ìø{sûЯtªîµ¶‹JßøÀqáz¼Àž9q#bl@ÜY†Á£ÁÏôªØ,Zzóʶ,ÿ?Íx˜ù{hÆTËY³@Ÿ=wÙýÿÓ½õuôLÈï \ŸÁöõ{$~`~´‘ÄÒ͈þŒƒb.,“¸}\”šÂ{ž)Sp¢ý“^!M)£ÃÇ—ÿÁ5½Z endstream endobj 4824 0 obj 5198 endobj 4828 0 obj [255 /XYZ 31.5000000 656.750000 0] endobj 4829 0 obj [255 /XYZ 38.2500000 608 0] endobj 4830 0 obj [255 /XYZ 38.2500000 286.250000 0] endobj 4831 0 obj [255 /XYZ 38.2500000 286.250000 0] endobj 4832 0 obj [255 /XYZ 38.2500000 608 0] endobj 4833 0 obj [255 /XYZ 32.2500000 656 0] endobj 4827 0 obj << /Type /Page /Parent 2 0 R /Contents 4834 0 R /Resources 4836 0 R /Annots 4837 0 R /MediaBox [0 0 595 842] >> endobj 4836 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 4837 0 obj [ ] endobj 4834 0 obj << /Length 4835 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯Ð9ÀÊ")‰ðÌØr`Ø@A7›`‘]ÄÙCþ~Ô-ªgFê¿.Rìv¯±k¯5"Kõf±ïþøùïÅ?+Þ=}þOñÕýþôù¡*mSÿ‡_?¼þ Ý•îÏ…íšâë/ߊoŸ> ÿýö0¾ðùéÏßþWèâOÿ?ýÛð—?º:üÀ/VÙá÷ï­þT~?üý¿þò»â×ÊÓv˜·ÿÿƒ®m[ÁXÙúÛÃô™êøë·¯¿>¼¶KÝ7ZU…ªM]¨¾ÖÅÿñðÓ°Á´|UöµR¶­muÉFVvRÃoJ÷UaZµØèøKfù‹7&ââGÈű¢ zW/»ÖýÿLîÝqÖµg©®ˆËV¶éFÒØ6mN«Ç |gL¼ÅK#eb*¸¸$eûáF…¡M–€ýVk´GÈű2ѯ.HÜVÛÞ!hø7þOËGX¼nã)…rq¬8âzV—$n«÷×¶‰€¢Óòðo«^Å#îrq¬LÄÅ« ×Þ∠6‚Á}Y=muOpGÈ¥‘âH»XüSÈ"’ñoÀAã›çÅÇ/ï>Þ݀ʶøòÓÛqÏñ·/Jšâ‡ÃéB×Å—‹ßW•yüCñåç‡_Уï: kÜUÕÇ]û²ÕÍ„˜µ'•AOô#zbZ¸ÚGø¤‡ûÀ'jcájïÑ“º‚°=Á'•†PCìà/eVSªû|€Oºp äCpbR™iõ2cžÓAjªuxnNº!/zäïƒåã Ê þÏ—bŒâ/…O¾=v½úŨþ©¥tæ$L-Ì/ŽXoxl ÔØŽ{dÂV©pþ—å>Ó'ä1Ó%æ1EèeüŽÂz Só~‡ÐØ×É—û}x5u&\ÞØÄ\î±Éw¾¤ø²†°á'™p_ßdÃ} …~Bxž ÿã}™âÿçð“Žg5è3)¸G;` {mp5æäÆœîëÌ=£ZÕQdÓ#µ˜— i¢öïhfE»k¡»ÊC e¢kšK"‰x·v »Ë™°œáS¥Î]6­ÊÇÈÙ>ßuÀ]\ƒ­í/‘Í”·vMÕ‹ïÚ‡ô‚å–J[Zû–-•)Mmùß/bÖ¢'.@Ø–m3"îå¾Ó£wœ»­lit§†g/ïŒ%UO/Í™\«å;ø \Í©´sû@¨hžûÒg¸OÞQcpÍ–}7_À2>ã;J¿ü¬‡ ¯Ž#2ýðes®·ß!>LyxaRíŽx› ÃT4R]Õêéœâ4¶ªÊ֪ξ§…]ÙõÕŒ ã§ÕåþÒÚŸyGÁ'ŽÍ›%¢œâ0eS·Ý[´7ð ±ç{Fº-Ë›ùÖpU } —'¨áÄ8 øpÅHÁ¬SŒ÷qÎå¹Õð÷`ÃwLµ‘êX^ž@1þ@ü‰^| fø…Ô,ÞÅ4†hs^ʹwðjN“« ȼ'Þ™®ÌœŠßòæŸÐ>å‰å ªÂÀ„²®0[?¯Ð'¢l´™À Ò—á#£¶K7–a¬p°2Ķ3=VÔx5FµŠ²¥­}‰3ÖŠ²NA¿ÍytMYõ3g+2çÖër»RòèŒ7ÂøzÆ›¨è¡6äkï as7©9©å!>݃ÌfX `""íaç5×;¢µê[5·V„*¥\B((X<8\øy„ö`,$†IœÖ5Ëàâ‹ÜâDGÏ®ÆÐI=n?M`]A¨}ʼ,è´ $†~ƒj ýª÷}Žu¡À§0l;ˆM((gG„ÑjéŽÍ0ÖŒ®bôNûʪ,¹`ãˆ4Tš1¢¿§Ñ Óó=£ø † sÖ\K ÆÒ„µÆ¦ÖO¬!EGÀ0xÃ8¨á÷Ô°iy q-»ZŠfh+Юú’ËÆ^<\L‰ . &\káÄÞ€ëÇ€hÌ!$O'âDGå‹0÷á8І)9÷íJAñRµô‰ºG_øË&ànuª¢‹-Õ¾D¶yÙ\¢pÁd“,AÎC̰§jæ6k®P™"ÓY‚1–É2sÑMm’5@ŒaØ_ÊäG眰¸[aνÎd[H.ÔVb—x’‘oP™.<Ø:3Õ¢WøÌ‘Ãã*ówEQ«`ª…­M•jŠ÷!ΔTõ†lBN@×þ—©²™ë„Dx©-ª$„Ó½dMÄöÒœëÝö'ô$Tm¯Zn³ö>ˆþWwïãî}ܽ+±¼m» ϭ݈\§¿ÔŽwÓ=YJ;®«õl_9xü½ÃÆýœŒËÒï¯ZꉻwNŸ¿µj¡¸³·¾—VᯊáÒåf·Fâê÷Ìe:ãÊž­…3ˆ2îNe%ôKŒ9 í†ùé Ÿr1íáwרW„>JaÃç|Çgf¦§7|‡‰xž\åyžÉ¦¦4 „ ŸM<’޵Îô&ð†;þßs,³ÑÍ­òØþ´ßÿŽ)Ó˜—÷_ fbñ@‡l¶ý]6ï²y!ÿç¼ÚËf×Ýeó.››øß`v_íe³®ì:—¯=I©nWù÷JµÈ}‚Y² f©fy´br_77*M÷ÚÒZ'àË•{áaß·[ªªl­zÛx^uQãæñèx|¥¶¸õ¥Æ@ǽ8ۻŸÐ@–Tc<Œˆ¿G¢ÛÓÑó¾nfîà™î}jŒHødyE™wûfÆeÈÎÉac¶7šóLG"zĹk§ ¹#žœŒí©9L ÏUͳñ°V3¸ÿPQŒ©¥(Ì4JÔc?þBÆGÁ¬[l%,5W‚PlÔ$5ÜEX4ƒŒæBL/’m)<% b‡Ñå.é%Œ ‘ç£a+àiå78g¶¦üóœb@›ÛZ¦v~§±n׉|ß8éÕ»%ÍÊÎEfz2³„<ûHLHæâá Æ²%€©ñ±L£|¦tç|Ûí‹A’RÀŒe†ÊaÏ Ó‰é/r®‹Däg­Û5†–ñœ & ^L6bMd*fÜ!"£H¨r+ìËcf:‘‡þ8§öÙ®‰îczr’ á¹Ä‰æ9j|•Æ v\D¹Ìè&Ѫ¹ILæ&'žš¢ñ˜9„»û’²áf¦VV̼€Æ'ÎÅØÆ€Y€~ ˜T& Ü]qÞ3þ®“íSa»ÛRUåX×þŠ@-zâX±)õ¼Þ5è Ë:÷N79cÖÅ«'-|G£}TþÃæ²„μc0£ÒjKs´b›Vs¼¸ééÍ[àï1êG¸Üã@;Ç­žú%l€ãÀ©ô êñ@µ“ØåDŸdaš~Jš„YOºm‹]ašø¶ëûëL„u=©s»ìI;À¢1Žh´þæƒdÂr¤&%5ÏRt T5e5W­øõê’Èùw„: U‰r5"O˜–¦ãì3?iº3=™¾õ…s>°"Ø@É1ä.{€_04@^Ï{ þáD3BÈ=þ“N ?Ð5ãÝÊÑó¥Ì ¶„I¤®¶_ó„Ä0÷R-r$¥{gEme2RvÌóé»vÕdížðw{\ºÖžÚ°xÆ^ã,<¦ ñâ’2ÑIWPŠ—†Â§fY oÛ—°ñÓ‡ÃtÀ¼èÎBðb¿”)ƒÛ âOÜô¿ƒKu ìxJq17.×|ŸŽcí©¬?E»ß ðœÊ=ÜC”§ciðÈÓTŽà_¦ >fç¶­×±xcCa<Ãǘö"PãR«áBï„mlw ‰Û+$„§Ó§ql'x¼0¬S0_á6ÌÈË»†Z£}½‹Xž0® Å÷øæ®<#~ já&¿T›fÖwDÓ¤Lx¬¹dØ5&„ñ§ˆ6$žaÑ̮ݥÉó¥Ä¹#ÁMÃ<­Á˜f0Y 7él—ÿã(‡¬öŸ|.Ë—ŒçˆOþ9û›£„¢wÖûÔ¦N6¦ÉöÑñ©Ç  î>Ç]'î|à;3gÑ´¯;Ýd%³®W9„N؆&¤p¯.˜2¢Û›æŽ»JO⥼ZˆZ·+ÅaÝòˆªôÍEw 7¦Ÿ˜!a.<*ëÎ[Ã(ãM1±'Ÿ·¢žˆŽ|à˜ ÖªXÛáX5GÉ™ß<§‰,ν5«¼,ûë'Ù󼬶óxV)©Õë릎7ÊR û€é¨e+¥®›Z‰Æ8f‘¿`+É¿¼±ˆ 汤Ԫ/¹}M=±UÛ½Ý5*æüåÌVéS’Ñ%—ÎPÍEm tŸ<¢øU|ðì%çµØ@§î™Œ2e¥uð…žÂîšü\­ÇÈ6ö G¨K=6wX8±íò‰cO]¶‹> a]=£}ÌZ5ç9Ø>º/µ‹Þ -\ÍqÞ HvjA°ø@§Uq….¥=ó ¯ßq ‚>ýÕH.–á ž ÿ€ör¹ A, qý3fçpÀtõP| «aPogBwÄ®·ðñŘ\|£Þ‹MƒêJôÏA¡f¾ÇC§Hz”Ew¹@~hé”ùFÉ„à8™ufmͤŸþФÅT endstream endobj 4835 0 obj 4684 endobj 4839 0 obj [256 /XYZ 38.2500000 703.250000 0] endobj 4840 0 obj [256 /XYZ 38.2500000 703.250000 0] endobj 4841 0 obj << /Type /Annot /Subtype /Link /Rect [273.750000 674 327.750000 680.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 >> endobj 4842 0 obj << /Type /Annot /Subtype /Link /Rect [439.500000 212.750000 465.750000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_typemap >> endobj 4838 0 obj << /Type /Page /Parent 2 0 R /Contents 4843 0 R /Resources 4845 0 R /Annots 4846 0 R /MediaBox [0 0 595 842] >> endobj 4845 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4846 0 obj [ 4841 0 R 4842 0 R ] endobj 4843 0 obj << /Length 4844 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9ÀöŠ/‘‚»³3r0˜r0rÖqÃ62ñ!?Ý-©R%©š¤¨nz`ϸÕ"‹Åz³ªøùÏoÿ(þõ{ñùéí?Å÷ö÷ÓÛ¦ÜZS6ÿûŸOçH·mÿ.¬3Å÷_7ÅÇæuóºûïǦyáí鯻¿þWÈâ/».~øûîÃÛ/í¿ðëÆ »ûýËáwmÅî¯òø{ÿù¿7ûCñÛ~Änº˜Ëÿÿ$µ3¶Úƒ12õǦ[¦8üüþý·ÍçófÑ;0,„Vºµ–Åÿ¹ùi7A7|¹­µ¶Ò¶¼e"+3iUY—EU æ9üø]\–.ÜàÈ}#E¨JƒûÜYY• zŒ ünôÈW¢ H6{È}#¥ÛY8¸Ï5î•TdBn­s2ÜàȽc¥Û[<ºÏÍ­÷Rÿ€ ¡ è4¼ÿÁ]©m¸Í=@î+ÝæâÑ=n®eÇZ6þOÃ\Ú€ƒ ÷Ž•vs‰Ñ}n®’2 X> ÿ•(‡ËÄè>7×v&‰reÙ€O]Ö&Üæ ÷Ž•ns£¿ÎƒÒ||¹âůï›Ï/B‹2«âý§p‡9›_ï;¤˜âÓÞÂß÷ï?,KñíOÅûÏ›z[IÓØ>©ÐY£'¥„O¾Â'Ož(7ÿ aÃï<ÄN Ÿó$¼ JÁ'põÌØ¸RÎhZÀÑ0U5}~ß±qpt¦[C 1òî¤K¼÷ÅBê+í|J’˜Æ0]ây õaŠ-!g`~&`{™?Á3øtY¢Ôå(¥>nbƒ\!¶FWΚ3t˜ÃÕ= cÖ“võV«&ÄÚgm·uuyÀÈZ¶p§A„V¢w”ˆ'd­²nXJ7„Ýá–Ù”vݬXÂà†«ãhÂα¡e(mX(b©‚⢡³UÒ‰‹'ò¥'.òƒ OŽVCè!ª„ï`\x… µ®á‹u(][àš¬Æª€›êäœj_šð„˜GõI"ŸXDJ+ü¯MŒAúŸÀígéaLfx“§s¦} l´P€¸m+!÷K9Y\GJHƒÏɾÐ刼ÏÝXlq†Š}lú 7Ër ,¦NLëð,嵄°a¤ ¤ƒa8Hñ«ÃÌÒÓ£vþixõ ÑçI,N#´Ê—édÀØž¡Çƒ™eÆð ¾"øw†xÀ÷a$¶ÂHؘ ñŠ}áX¬„ð*ÉÚêëžÚY€óØ×É_õŒ/c Z-ÄzZf̾õ°‰®õµM”U³‡®¾œR”[Óx»§µVèI‹m³••©®ágÖ;â¾SÃw\g¥ZÑ‹WUð‰æõü'¶®GaYZm•=*…£µ²m/ku‰¼¡þ Gƒó`ÈÖ‹Ð[Û<šÆA«ifA ¥.ªŽËN°I¸ÒFòØ­ð0ÄÞÓ6òvžà¼ Ï/ÁÝ£&D§¥íÝPØÁÆûõް’†"š®}Ä1ćm†!6øªů]ɉ̈t Ö…w®‹úa*`„Ïb™«ÄÞrÜè¥<Š9ö bîÀHÁ§cX y%³OpŽå†œ¶¦0þh= š3ªîé9Î1JÂ_‹ér †éÛYÓ¦¨i瞬`³‚Í Ö·‚ š§`Lß+Œ «ç<Ç!DÂB9Ü€E+ s²¬|Ÿ-"F%J>–Ö]N<ÎÇbe£âLYœï3‰Ì>8€Ùµmì8¤ÔTU»žS>a1/vï0¶æW®p«¤ì3œПWA-K̇Dž1æà“¹Ä 0Ãl§9çy˜éN¡{ùшÀ*CŠé:ƒSÀ©;ÂçbC}¦qíÉ}êÀY8ð—'Ž„q%t_ǵ¹F|¬óe‰Aí¢˜†1¦"pº*¯ˆ‘”±|œGLjZ A_ÁÈÞ oCObHO{²8P…ÝÙîû*Õõù¿lÞ‚•Ù"R݃0ÕäÍÑÚUDkSÍ\#L”Úô¯˜(AÃwR]g˰“Ú¾¿S'7óäç¨åR1ä n^¶Ê&ÎãB‹º.Šzì,¢»ˆj±ÊIrÃTÚ?y¦é‡%y¼P­üÉ05ˆÐßúž>›Œ.0¤nuUâbÖÄ>ö‹Î/K'¯*áæ^ :V 9lÀ›ÅÆXN/SI°ÂŒåñrªrÞôDËyèJ¶ª–}]9†Á„‘¼˽ñ’VF«±¬A¿­<8€áNqÌаFíœ8£KUÁû©VÆËàø§wž¡Tˆ8qÌ8Žèò:!98í•Â;zB™¾ö𡬰±ÊhüÂ1¼´ ðrXÁÉÎ $€ß¨C¬®! ŸñµcßÐpò#¬#꯼-F’ðœp6Çí÷áû±qüJ~e”óÒ}Kì%å4`¹¥•ìa7ô6i½žj%ìo&}ÆÐÚ^ewhrzÒ¶ò0Û²ßöWU´M$d÷(€è€ H›eU_ †œôqˆvL;½”8^ÁÆ=£ósþ«µªRõå*£Á3nAOŒ†5'›§ÚâÓá“pÛL¾)Z‹ð&’“Sì§>”ŠuHÁ qªÛ8ˆôk6s¬Š¥…!»ëI×g®¥í¢9ÞJ¤Î°„ÃÀz ÞY‘3+j|l/7°Vï}‰j°ªª9¶«×è‰_Ã-°æ#̼ÀAÅ©ë†BÌA¿ãu5w&£bœ©Ø Wu‰vX°T»†è–—žFŒÐëÒ(N‡¤AläÙ_ædŽ—9µ r͆Oˆkñ•M8v /LÂ>8q=¼J CM¼ƒ+‡ð5OŒÂ^»`áÇâÇ.vŠB}•—ÂѽpjÃð%w˜3¼Ò2Á׈{¢Ä8ÅaH1ec*eÈŠå%OÌ+9+ÓSdz.·$ö„QwIpjŒ+ê:ŒTõ-T‰£‰ñãð cJÆ;ÑÖ÷4eŒ*,¼%ÂLàZçÆ÷1aÝ‚åaÑÁs*B’âk@——\^©ØæàšsÉ;ÃVŒl}ÌÛ…ˆœnË®©À¾^ƒ^8ÞÇs"¨Ïa#´ <ùØK…ô/"œUO  ù°,çq*ÄNLOÐj3ÎuX~'ì©ëI8ß„Àõ£eÖp¬8ΓŸ])oà͘>¯“ÝÉ a¿Ç„ç˜A}pÂ;Á2óà˜Ggݦ¾ÄvP ɪÅÑ ŒÔ9þÞ. Z,õ5fF]ÙqÙ‘‡jWÊ޾ãœóc‹ÈoÔ7UO9›¥…:U¸ƒ¥¤áv¦…'Sé}Q)­o]iÊ -|9=Ú–ºMæaëï›eç¤õh§!ëïëawÕ-ùÂ’¢Rv2)bå‚É ‡=npƒ }=™xæ'’‡\õÕá4ÍèŒ =¼aÛ¦H|Á)-\Ÿ§Wpoª,.JäÕtÙçÒ ÛÎ±Ô %âB¢D&™ÆÏ^ZJ®S¸¬­¯¯Óî»Ó¾¾Ñ*þÒíœ;ó,>vBå2¾Iïä2¾Ôgrß$âà8asߔ݊˜ÊàDÝÓ峎î°ŒÏÉ2—ñ­„Or_M¢ŒÏI™Ëø&IÒU&ëæ2¾èÖǼ]ˆÉéÚ^ÎÔ‚9ÚW§LМJ—SéÍ*3!I)¢'¦ì14§Ò%QŠ™J§Ž·ÒH¥ÓÇVL9•.Sé‘*އVp–œdì h >µKÊír;†Ž*Žíx.¡q§&aGšSK•ÜŽ!ÍÜŽ!ùv ÎÎäv iGÂr;ÞoÇàÌMM„r;†´åFnÇÂyaT~¾©ÁQ̈–qiEتÓñÅ#µcpÕ©-F¤;—]e}ýú½íÞKªÿૌûæYWÞ…©JÂóá\\ZÀ¸êˆ(að{-_ãðáëà“x—¾x.ý€RXg¦8õ›qj;çþ™UÖœ,\ЦUÝ—æ¦ ¨*2=ì¦Së&D/=°œ#$:F§ý–èX,^£èµ›~‡¸èB@¾ô‹úR¸(5¬_¾-†f„••u_-%ö>ªnY”¯'üÂxÇKQg‚—8‡++>§nqAÝÍ'“ØBLg QÖU/ Cô/ígGƒ!1ÄÐa¡‡uÚí~€ý•©ÕÅ'¿lÞáF*`˜jO}_Ÿ ÊDZ°ctà\ L¨…°XëàÇ,ŽÔ-éVùÂ4B¬²>òËâú%ÑEóŸ0`#8Çå+å4ë*v†ç]ñ»]I-û´î7¸µàÊÎê m9g‘^G[oÞ›­Ü%MÏ;Õ†uKDÈsnË€MáÐ$ÎGÀù»ø„šqªH¬b”•ƒC­œÎx=Œ œûA{ÙJÓ(ÞNõGÄätwK†+¦$buú÷Šù˜¹®¼)rq*Å98¬ÃFwwcº4X’F¢ØX]à3œ'¹8FÓèêहœuii¥Ç›ûGů\g-Üò’= û£.Ç/pºÓDƒú…µœ@Ù¹*×Cy_ézë¡juK¿5ŸyíG*1Uà,|Ž~õª­SŽAqVê9…©ŠcMaŒrê[ð¯'± xÎh¸OæŒQü„Q5Å¢^\Éw›=dt@àÄ£üîöòüò; ËÂÀqáÛø•!ØÊòÚï‚C‰ÄJá.`Œú…€E!ðœ!ndœÂplŠ˜ÝÂksK÷ÐåmPÏrۺ،d™4†éûFø æ@†¬ñ‹Ž‘µOK°N#"i‰X}Ð9Ù$ìÂ/çp=ä`ãí~´ ÙÞrîÎy’uÅÏ)ë6ìÕ²bŸ^Ï^ýö"´+£Ìògl©w ªë›²S¦SîZ‹¥*!… õqx3ûŸÏh\>×…“¡CôBÆVRŸ ‘8kùsUe;¯ÌvÉ%øD—èžœya¥¼@hgh9Ä¢^,ý#ZÁu)né—1²Þ¡²›5…ü̺4j‰Yí„{3î,g„è…¹¸—+9žAʱw¼?‘"ìËï)®“Ë'-<:Àµuçºn÷S|ì„$)C_Ǿ0¡jØ]°J¨íNî ,d§iÚ³úk]¸í•âàfïäVÚ‚?i¨§>i5ˆÜ¶M˜»Vlþ Í£p•ö„í¥]é oC[†~m´F.ëH%V´K,°%škÃ[øD£e<|§=”³–~v\Â%¸ýßå±@<£¹¤™Ow=Â$ðm> à}%v| «ó žN„­$ÖSh‚±bLGÒöaŒK¦³ÚZ4× €PsÖCìÓ3’†„°p·3¤-Õ¶æ9‚#Ï.MÕX¯Åëæÿüáh endstream endobj 4844 0 obj 4113 endobj 4848 0 obj [257 /XYZ 38.2500000 687.500000 0] endobj 4849 0 obj [257 /XYZ 38.2500000 687.500000 0] endobj 4850 0 obj << /Type /Annot /Subtype /Link /Rect [292.500000 657.500000 387.750000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 4851 0 obj << /Type /Annot /Subtype /Link /Rect [129.750000 332 188.250000 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_special_variables >> endobj 4852 0 obj << /Type /Annot /Subtype /Link /Rect [106.500000 156.500000 152.250000 163.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features >> endobj 4847 0 obj << /Type /Page /Parent 2 0 R /Contents 4853 0 R /Resources 4855 0 R /Annots 4856 0 R /MediaBox [0 0 595 842] >> endobj 4855 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4856 0 obj [ 4850 0 R 4851 0 R 4852 0 R ] endobj 4853 0 obj << /Length 4854 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷Фž@Àû C€Å.ƒ‘C`Ç ¯‘ùûQwK3=Ò|%ñS‘¢ºµ{v‡ÓY¬«Š_½ùóçÿõûñÍ»Ïÿ9þØ}÷ùª"»þ9ž¿¾»ý­OÝßU]üzøvüvøtøÔþÿÛáúÏïþÚþíG{üKûß/ÇþÞþð§î—οðõP™ªýþëå{S™öoÙÓ÷óÏÿ}øÛŽ¿ŸØ¿®›ÌËgó¦È«ó4&^ýíÐ/Ó\¾~ÿñ·Ã›+üÞ’7MÖäG“»öMnÿýçáçöýã³S“S•y•-yQeÛ7Õ•)Æ6ÙÑÕÙèE—/Çý‡·T*‚=ü:suªWù銛ۘöW56÷æñî\@ιÌ\*Ýæ O×Üܼîd³&‰ž‚þåY¿…zøeæêTé7?]ss«¼£~Q ÐÓÓC¿Îl¸‡_f®M”~káÃ5w¶.zÖ7yê%«)*üËÌÕ©Òï-~ºÚæžGLL'ß>^þ툵¡6·Ÿy,>]ss]/Zκ$rÁ$·)«P¿Ÿ¹:UúÍÅO×Üܪ®ûÍUWË·@Óþ ·¹—™«S¥ßÜÑÓ?ù<OåúpVÿ&|ðí—Û­6)_~ngvyáõÛ—¯‡¼ýÇÙ¿o5å—ŸŽly³úÓñË/‡æT•Ei‹Ëü®#¶¹ŒÔ§ºÉ^Žd޼»Œä§Ü]Ã!O#¦$žVŸùp)NÎÖæÅˆÁŸÉѬñ{LîO÷ñú™S2ogÿ*~_æÉð&`RCâS*.#îTäe]Í|O=œ,^œ’.Ï »ÿýp{üU‚½æReÈÍñ2ú¸ î¾Àï5ä¬R#Ìà©ýGðÜÌ{bpÖx Ü‹gM¬ï\ö½ÿ{ð¬MG,±ü¸sîmD lšiN‚#¤ÕäH”ÕYS/YÝ&uRçxñbgl¼æ&ð<–GLk<7¬y^©ƒ¼ãNŒ©¬«È %gX2ðÞ«rŸÃO#l¥à/Ö@XÖ5ø=«{Œd¸&"ÿelþ‡:‰Ùa¼'Â{ÿ2Ç|¹:íž§¨"éAfç2B~N„Ÿ)+ÉJ0s£h`ü×ÃЀñú,\öÊu¹j}¯ï…ž¯ )6¹ óh¤ýÁ’Õ+i¿ó†{o¦Î8õ·ÖGÓ¼öJ[^_Yõ¯ì\“®éäV.ÑH(Nv”ƒ®ý?“á÷4è3îª:=••9‡ÆŸG,|Ú;8òÒ {š9{™mºŠYyræÊ;Ï#®ô-|Z†Fø4HüóŽ”hx¥ø=–X©íVš÷Esf÷Ó-SSOHü\Vä¯S–¦ìó 3¸òqx\—“ñ{ð.ä˜ûáÜÜ÷pÖxçîs·¦Š»Ò¨Ü˜—Éke&5¡’ù8Ñøþ‰׌íœÏàÄ0N“3p½çºÍÁïÁÅ©v!i=JÐ2¹w¦XJ·f‰ÈkÛweæX1…'L•°@¦š~&wþò:®ÀI~Ì¢ª57% ˜ ¨½ÅâC0üd=P¨RÆQ Å™ª´ÀÂO•«†¯§²vh%W—nå‚'U¾e¬~ô2áùe®c1ÄŸÅåZ‘ŒqŠðÓú°žÚ}\ýÅè@Æ…Àº É»é:&”F¾#W!ÊÔÃFSÔ»Ãéœü#Êõ„ 5 t E&8a8šhãâëRðþ„Çé—º†ƒ :?pâïEh:³€ñ„xq§Š¹iÞD6v@(ê6ŸnÄøˆØs¬ “û%_N`„>æDæª&C {Ù)Z‘ ŽŸÐ®U‰ro‘y¾£TÕè!£ØqfÀ‰AJÕÏÑDˆïÍÐ2ü«ŠÀxsÔmxÕë±LFSÐ/ÄýxÝõ„‹fݲªa ˜y¾à*'(A á ò®¾2?Y3[µnG$f0þK>oÏ‚åˆñcc4§08¸{Dc†äá"D:Êþâ˜à¡1¦A193&E{ÿåQL¼ƒ &1scÌöÈv2KÜú/!` Ådž èã#–hü¼-‘|ªðdđ̹‘!¤Ö\”ðWÈ}wEàÙ8æ9b#j‰ø-f0JåNxa9Áy˜ù G9l«ª&©26xºq1¤(¡Ã0utKU÷T7äÏœ³…ŒÊÉ ¨eˆ«}‹X†"1£¼Ã´Á¬d¤„{hÈTü«q—´øÊUã©jfWú0WDÒ» !0;^ & ‘ŸI ©ø”q¾b‚U¦‡Ê{¸z7?8 UøæÍ‹ ±V¸%°„–€€J­œAÅb P÷‡W‡¹Êc%•ý‚ò(À~a~{Ÿ:HaQÅiÃ@4)ƒëÎÍ#º`ˆXÎ,OÃ;'@±AZc,,3Jº…së¢~š s¦†xŠÄ½ d¬#¸W€…Š«–a!vŽÆÂ30( Xˆým ÄŒÁ±uÅž+ª‰ÁÓ ÖÊžs¸7 Ö¢YwFÙ÷‡±,9ö‰±æb¸Ÿ…1|!–MP8aû±¾g¦kõðž Bx€ÌÎ ‘<7lõ0W1‘õ­Qê¶ 4yd[°M@nÂO£¢p$*W8·`‡c¢–…]ã­ÕÓílB/ gLìWcÎÄÍ`Žc¿‚Š"$Ø¢a¯‹±œØÁž¶‚xDô2†¥™(ß­l˜òÝ0xJ]éoURUO=¢°ãŽ"Ì(PÀð%‡"žã¹ae† ã›ÃϬ¯h ~& ˤ9…ŽVÁD VèI¶I3ä°Ë‰ƒw6’€á¨]>anTé^ºTîRŠ«Ep•ÍüëXÑ.©¥^Ô}`¢™3Uˆ‰g€ Kq¹ÒÐ?‰U³¿Mê\kŠYU×O5ø¤ó8•NL&–hÃÃÄåŠb'‘p9qôrªŠ2­¯¢åh±Ë+G‹÷tÏÑ&£eÚeíY˜Mda¢ØêÖO˜ÞÇMŽúöa‚ºÍï-4"èA‚w°W‚}ACb¯„±‡Œ×ˆ½`\ë’GÔ\6võÏ®¹DIßð‚®¹·]ˆv6Â^,¬+ÍáHTý”Ç®HÙ¦~ü`¦E/ã½ëê":!T$L”uÁ 1=í0‘ jÿôK[½#“©BÔkø8}ݜ֔gmDlŸÑ¯âIã<“)SÉø0·ªà)ýS€¹ •%€B s"Äà UÄžŽ„}42$˜iVrã-Ü0_íoªw…‘G`1åLDÂlKXBÑjÎ4z®gßqPv”%œT™Éùì8(“Tl¦iµ>Š ÃD>](Ü&¤AaòöDMŽwaJ_SFo)ÎÞK³€cwônn;zˎޢϽۼ}¿£·H3Ø+Ó® LúÆþÙ¾Û%ø†;zËŽÞ’ºýXß3ÛÑ[°nx‹¶ _‚Òº£·HOÛ(zË™+Ê%µéÑpTÎ3­‹Þj³¾Âl}P½eGo‘é¶ö%ü³Àaꮄ¬0“¶e*Š<ÚÀ«Ö°$ЖWv¨V\„n»C´{òé¦ÚN{’­ÃÚ?[5y~¸$s@eéz÷≺L Y¦=´¦ˆ…´&ÆÄt#£j;0ð ˜L^ò•  ˜ÚH¡&Ž©Ê#vN·—Þ½tTJ(SÐå`A—ÐI+BW5ÁJ••¨‰Ç(FAj³{á v2ì<ÃìTV楹է¬q/§„¡ »–¶Šh¥jk†ä "£ÈFj„´¢PË<à°²%&‹o»è¶ÃÓ-’,[LãRÆãˆâ¿EPI§ë:Q"M@ß#ÏÇaÝ„?Ó 7ÔZxäþ½ëºþ.Õ§;Ä ™Ýim=ôRvó…KKqÞ°®mïÉUOnO§­–NƒT–¯ïUšø4îÌÆÒ¿Lä™1W>a^¦}51Y¦§7å«n¦p“Œ¸·>éM[Ù¡ìµ¼Rêp72*ò)!ƒE6´‡Žý¡-ݫԵ:JŠùÌèÅL&í>uÓšQ†]°¼RûD^…*;P½fMPRJ嵓ZX•ȳÆÍ{&pB¥ÍpÅ‹î]ù°¾‹p‹žÁå÷…®®VÖo)B…¢ÂŠrh¼,Ñ‚pG„’Ëg¨»”·j-£¥R!ä¬ñ‹#ùÏÔ{<œýÓAüÓ.âx+oæ…¼]2KPÍ|AµÕPRƒö\zR9ו˜ñJÎ*Î.Ev:þëÁeõí~=|DŠó‹Jk/™H d¢žÉ9Fi-‡œƒÍY ;hË!O­~£Ròø=ºf!0 ›n J$Ÿ±)Fí&Ú„‹çžZ[Æ*)¹×&}:µŒŸx¥°Oó½i•D3û”3éÔ¿2~XÀUŸÇã]>D0f럘B(Þ–£±CÓq¯*}ýDœjÜEà[e\\GºXæaLtÓÖ{cãàF\£w=ˆ'›ŸvŒ ãìžZ9?Ü [?8 Ç4å#î|1 Ci½æ‹Z Td`ûÒ HôÖ†q3qå5ms„¤ T$Ú¬ O# Í(x¬¡0D–n<¾á¹à‡ô9ñ© ÛÊ4–-»ÔAÄóÒEÖ¤;ˆx–ˆx$XÐö[Áöc‡Ö–f€Á£ïíD•:0i^÷mŒÖ·ëk®Ç•^ßêB7¬W÷;u›þÜ#T~‘-iµÃ#KOKõ>÷ ®°‹ìLD âÂ5k¼µêc×)Ÿ¼„ÓæLÜeuŸ?sÑ,Š)c¿SëELy¢Ù\‹BÅÒÄŽC?Ž4€é›Ì% ±b"ªÁ€ŸëFO˜¬æ¤·\~”½@,8vi€9ó(Ñ¢…â,?‘N¶ÂÜö\ËÝåZî´f"ŽWâ–äh)=ˆ¥ij$EŠ>Ë…3ÐÑšlTYýRdü+Ö¯¥õ¸L€0°ïª…ûÂ]}|7{þóIȨÀ½!:̬g6Œ–Qº VF {³÷™Q Ù£.†ê,A´rK ó¯§zÁN¤‡´7µîÐÃÕ8ëô}1© ×êÞbP¹S†í¾°Œ//`Y#."èÞ?SÆãÁ6_«èv$K÷'–§ºþ-”, ~P†bôÃdWÀ°NmSŽL]úAâ Ö­‚„ºÕ ¯M2£—Í_žÕµ±ñS9Ô:-†‡ $ñmq¼žHXeº^ÎÃÚÑ;[#©[Û`‡„5ƒÅûÌ;ÑŽ*‚;a\>X/¾Ý+zv§¯LyuJ|cﱸ¢*'Ý£ÜH¦±™"`i¨iªG‘ÜÙÙºãNe: §¶P7F:ÎÆUƒÙ`Eë-‚3 0yQÎTs@F(‹¡Ð§˜ ñÐâÚ¥òAht¦eòÓ±±ˆÂÐ@5ÎGÄ1r:ó4 èÀ… Dÿ„'³bxTñi€k-›D¡È©:…Ñ1£"eão°u¼1å|/›qMg;-°žrd‰ž'ú¨^þäÇâÓ#¸ªÛŸQQ*ÍÌCÄ‘C¦¿úsY>]ùbq6oÑüV3>0“°Š[R¸F±¡ä[Ðî»Öõ•OW•Cù\¿€j¾/GY¬Õ=Ný89Ìj–‰¢=ŸÇê}WÍŠì½ïP¾ªPqï}'j¨5i<Ö{ì}W7Õä|öÞwÚsÛ{ße{ï»ÔOa{ﻞÂböjÌ’*{ï»lï}GÚý÷È;Õû®q±{í½ïDIO¢÷ÝùZø;1ÒT.þ[MfúÌKÊ'¯ÇéöñÜÁFòqÓêc×~¿µK)óiêf”˜Ô¯V˜wÊÌùÉÑöZ¥óé^Kµ^WT½’n¾òŸ=ÙKQÙ˜gËñH§ì©»Å2òD_K¿GïqS%دÍíc·ÒÑEšÎwĹþüyJœ¬é–>Z`g2qw\’óÊ2 ~üLw5^K¿iëÃ2ÜùïÙsKßè]¶ðg‹{î`xïÏx_…Ÿ¢ªß¬ç3a§±ó9}@ÚPP72V «Ì:e>S2átì“7i±>?þøèE endstream endobj 4854 0 obj 5119 endobj 4858 0 obj [258 /XYZ 38.2500000 639.500000 0] endobj 4859 0 obj [258 /XYZ 31.5000000 513.500000 0] endobj 4860 0 obj [258 /XYZ 38.2500000 639.500000 0] endobj 4861 0 obj [258 /XYZ 38.2500000 471.500000 0] endobj 4862 0 obj [258 /XYZ 32.2500000 512 0] endobj 4863 0 obj [258 /XYZ 38.2500000 471.500000 0] endobj 4864 0 obj << /Type /Annot /Subtype /Link /Rect [210.750000 667.250000 323.250000 674 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_for_c_and_cpp >> endobj 4865 0 obj << /Type /Annot /Subtype /Link /Rect [308.250000 654.500000 344.250000 661.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 4866 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 647 540 661.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_typemap >> endobj 4857 0 obj << /Type /Page /Parent 2 0 R /Contents 4867 0 R /Resources 4869 0 R /Annots 4870 0 R /MediaBox [0 0 595 842] >> endobj 4869 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4870 0 obj [ 4864 0 R 4865 0 R 4866 0 R ] endobj 4867 0 obj << /Length 4868 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹½€ Àzf ‡† ääìf,vqrÈߺõ˜iª?Jü¦HIÝòÀžqkDëÅâÇbñÿüýøÏÿ?<}ù÷ñ‡îûÓ—Cv*ó¬ýs<}÷ö]ºŸe•øõðíøíðùð¹ù÷Û¡}áËÓŸ›ŸþwÔÇ?5>þõo͇?v¿tþ…_¥*›ï¿\¾×¥j~ʆïçÏÿuøË[ì»ëˆ¹þÿw:ÏrUɘèúÛ¡¦º|ý÷‡ßZ„õ’g*3ÅQYcª¶úøŸ~j:è›ÏNµUª,l™½§£R7=eeU•®³£ÑvÔÑåK¦y%߸jþDk¼¥\œ+ÊÊߺ p•*lÇ cbðh>Bãº."jΙrq®tÂõ´.)Ü\g-ƒÊ"‡†Öc°?¯óˆŸ)—fJ/Zظ¤d›VZö4l’çÏÐz æ—6žKn)—fJ/YØø©*º?ðg²ëê±³-Øæƒ¨ó|GTujh=‚ØuÖ„@ÑtêBy,‚ JVgµ'Ù×ÖcHVEŒ[Ê#I7.)Y=8ÓáÛ›æ#4nJ¯ñ å±Â7Oë’µ:)Ü׿#4žçñBˆ–òhÂÅ­K ·Èêx±ùkë1Ø_Tþ…òH±9n\R²åàך¿ò *cºÍºˆHµ”‹s¥—í¨õÏ!­`RÚO¦÷Íóâǯ‡Ÿš¸½afqüúSCÜ¥ÏöÛ׆)ùñ»3—7ÿûñøû,Söǯ?êS¡óžÄ©'&GO²áOÌ÷ðOðÉ |R…?Á#Õ%l R­ øŽ†Oêðw<ý [ÆÔ“4£«ªÞ_â¹¶–¢§ÄØìBŒ²ÆuÞe‘_èqÕ²:Uuvý¤S±[OZÓ´'kÚmpW•ÃZ+‰wZŸŒ®ÔÕ…ß±ˆjÜO§ˆa<0áTgoªu\Õ«ö(ç%í¯*Ów8‡³KMÁÔüóèìG·­)uÊmQ•ù#êjhÌR ´)Å Þ#Êùì&Î×_íf8Ó7:‡*›Ïj†¡.˜'µƒRñÈ8G¼ðôC¼ã1°§3ržkwÄ‹RRb¨‡"pÁµ˜ÃÃG]Q0UšÜÑ#û’. Tu9ÉQ¼Œ3X>X±†0~gyïqàJó1ÆêóÓ»]à鯼ct›´áDZ“¼÷Ò¶Ið~Ͱ1åË÷(ö^£XfNO5»†ÑöœpFÎí=Ç¥çéllô€a'‚=¬ zàˆvbDÃB‘q6ƒ±% ¦~t;&X­+( ñ`oÄ \b.EÆÙà’é§µÏ Ú|rh0úù}8gÇ0(¶ b‰ Þ†«ã=Q€tät’)ÆŠÕ{DL÷ÒŒ'r0šÌr­ÝÙl7¶-›zç}²@%†캴€ãöl3BæP¬Ýçf«€}F&„fØE¥–HäLŒæéËTÞCĉO5ZâÌ|Œ÷s•pã% ö<#5e”$`‰4Qãa1Wyb ƺ1C盓Úãq ˜]"âa2¯°îޏ4úr/âe]ŸG/›ôók“©t¯ëáè¹=BgËIazlz¾ö4²–È*æLª´Ãî{‰¥0âÆ„4¢NœAF) dýAâ‚ Ðdã‘_B¬R$ͧÒ1ÓÂûÖ‰ªÑ¡T5Ïûª€¹®*ï‹Qž®àñ±Ì~÷~ã=ìòv׺Q׺‚:ˆ€ÝÖTû²µNCÆÙö/¦©­y®ŽyýÁ/‡/ÑÉÃ<à‘? >=.v¤1Xޱ‹«•JO:páchŒ¦È7Ž£=3qì¨Ký[˜‹FòÌ|*¼– v ’œ3ѦpÔüN‡åHE?äj¬vøÎ8Ý£NôÁwt2É;ÂPä|Y½¤Ù¨ˆ9åUÆó°É"7óC*:Å ) € âæ lUyæÍDaÞx7‹Ù³ê"Ù©(ÕÌÍžÕäê-‚^”Ö <¬#kÎò‚#]#Îx'Yõ új••ʱ¥î8æ 0PŽLœ£7í^/¼¸ò¯J™Úu°‘äpîÉñi©@Ù{þæC”Ä3⤞:x°Ú\*œ~GÆâ ktlïR`Ö¦±Æ½µÙ°’u“s<³†»ÍJUºW›œ+}{¹[ËfƒìóüíKDºg®µ"Y!´ù©¤¼,±]ëAgðˆe—¼SÛÂW$º鯽Z0‘I»é¸ñ¹”x¥Àe n&¿3ß‹Èm²VGUß´º°V_w©²S»H~£œzÒ©F~Ò£•uE¼cá;5z§«a¢òSë·Þ¼ó µÖ­M‹“i_yÓš– .¢ö=Q/ðHu§¿·FúD<Á#­ÃŸ`ªuÇÛ)®¥Þ)Ãk±=@¬üµ£ý¶XTÑç@-Â¥ØÕ*ºÅw,ùDÁ 4ÓF´æÑ–¿ãáNk1åÉŒæT¥”m5d0¸Œ?ÿXCä•“g­;&–ÖT¼w×™:IÀï”ÆM-Qµuµ–^JV –!£J¤aªq: N:´Q­á”\ê‹IãÁ%Å¢(2UéhØb¹{¢DÌj™rå,±[H-)×’pKk6Y1ßC5Ó,„/q›ŠtŒ3ryÕ$@MRIT½÷PËfàVz4‰­¥ÎnÌ*wF¸Aıՙ+Q ]d2$P¿Ti”Ëè’z(ß#²ždŒLWŽØfœ!²Ã-z4o=W*횢9Ì„da’ßäaØø0à¹ÓÉEãú’ëR^X’çCÁâ«z<¬Jè: ªÌ>q©‚çzܦÐ7|ys¥ÅÅô·Ék|;+´Ì¹›7gøÁrțÞ‹±M¢ÿFe¿¸%»©µÐåµàoJT—T8Ø&{"¥ wÈØËõÚÑ©5#S‘O&õ)ÔI´€2+¢û‘ŽH ð{“ê —y8ë3€÷UGD”鉶ˆ«Õçü$ëst‹Ñ9¾S£w:ÓVö4Ê6° ßa(Ðè.пÕÏ zâé§5úòTW.mŸ ÕOè‰Q6L5äh¹ßÏ3|©N–]]um±7²«™ìj5W…ø.¦êâå`Dj/SkY\„ÈÄìë2ùPL.Sûƒ:¢æ.%­¤‚uD0Ú%ÞP$î²J…Љ”´ É€Â^çr&¨Û§™ˆ¹&E6I-ÕI^YpNöRâ+‘tGå¼3·4>I3;'̾¢Þ×·çÉja3uGãž=a üS{&"òa2¾Žù×—Jâv˜<`¯;Z¦þIüœîªv¦Xª9c©‰&Òå÷Ù˜e­Ç˜E]€PkH&˜`f{‰“MÔ²lä‚0Ì~ŒM¬0gœ¡TcA" š*u:…ç$òr8‘­¹mŠÉÏá ¬l-Dž¡hÜ¥– ,Ã@nD:‘,ø¯âá& åe—q‹çÉÞup+„'ĸ¾Z¶¸š¬IÜp'(Q²‚l ‘×]Jdÿà; –±ÂEÂ2\Ü)–9ÎþT¿¡{£ðÔ3z‚K_1e×0mLy7\‹OîÄTä®÷«&ãx$‚‹w%*¡öŽÂbaƒ¥ˆË÷1VŸxJþaÉaàRmP>LAü.¿‡eÊðÀSüŽÏòš˜Ê?bª=#…¥îxÞÁVÂàŒ¿‚®õFFÜÔ²h£eª35 ×Ä3w4Ëž#V‚ê+²—°ö}˜âàŒè 3å°0j³ha—Zý:'މÀ‡bÓ^\æ±I1sÈR -ŒØ192D¡c*fþ†}øå©Êã„Ic¯oãx£ÞUC®úò'æà (Okð >a㡚8ëˆÇƒÏzmòÔÒÚQÜ!¾¼õÔ1aíÛ¦=/ϷůJÐ6ëaIO5<æúá(w´'+»&RËÁTðêú¸Ò|bÇHSû"ÑE‘R?%@äIÎ7'¦Ξ—^Ø)ñ›ÙÁ©öÛ&gR"(ƶ¢+I Ë̯ceË>ãEáhcKŒm2¨Ö ({m¦*ã/êÓ<Ö[óh9”)ÖÂ^•° Y?ˆG*›”¸æ™e%¾¦.¢X†…Vk‰Ët(™àK1DuÙ`o‡¯Ø€´¥”}®òIkØh\’—×8–‘K|MÔfÖá­rÓï-ï‘‘·Ÿ‡‰Œ°ÊFw‰z<Ûã9Ç+@Åóª¾6‹·ÇPèq@ÂçŠTÛd ²€º±)1³Âö—“ßÛJM'Ì+* uÝëýxuÈo•ª_Îì$˜‹€ç{4*3š¸XÌãÓ–Ók*w%›xÛ:æ)„¶Œó›±í%pnL”«Þa–Íô'ÉÜqGÇ]Ͷjª]vÏ!žï=±¥qâ AQÖp1sÁ 3 þ¶¹G¬è”êrŽ=~ò¬- ×]¬%7¢“¬”Ý#«€É=1¤óf­]É3Úˆ£‰ž~–?Ú)Z&o e1År‰›½V}zVôäuÈôË0’ˆÝ©êÆL Df<¢qY2Û»·%"ÓšÄir·°Lá‹ytãÓŒÆEÎ>÷ÄÔÄ x[tj›Iøtz0«ÊyÈææ‹ÜÖ»¼ob.7fæxu =«"]•Ž=ߪlLîúª%—ã Èä#=À²Õªù¢cŽ‚mÑ7ÅÕ3[‡ãžšL"ãO‹U€•ð­š­gT®³¨m¤»±ãñdµÎÚÞá¬*+¦Ít/®³áâ:•Χ%¼×Ù‹ëÄѾbFi§´a@XZëòE%Ö¦bY3¯×|¼ËÃëUþ©ªÕüÓ¾åËÇ0e‘¶iéT¨~Þ¡~­¾ÙÛoeòkìš©Þd찎Öµ©Kk/æ·Yï z%Ë[-o¾Žßuöjûç©_˜W7·a”9eêŒuõpÍS‹+Þ4[ºËèaË}Ò—«Çdzh1~ÒEúT¸·§ë–‚[`õ3êÇLm ߢíS7R÷â+Óí+I$VuC °SA¼-‹7_n CáÖà;Ä®‚†^¾ª-«p矊{Ê_P_:W=…øßR›žßíç³8¤ðÎ\å(îØ#4¨ŠÑq¬˜WÇ;p5L_!ÿôTò%Þ1Á<—V–™9um¦zBrÌ›£“nûóñóáÿs u+ endstream endobj 4868 0 obj 4537 endobj 4872 0 obj [259 /XYZ 38.2500000 423.500000 0] endobj 4873 0 obj [259 /XYZ 38.2500000 102.500000 0] endobj 4874 0 obj [259 /XYZ 38.2500000 423.500000 0] endobj 4875 0 obj [259 /XYZ 38.2500000 102.500000 0] endobj 4876 0 obj << /Type /Annot /Subtype /Link /Rect [66 110 102 116.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 4871 0 obj << /Type /Page /Parent 2 0 R /Contents 4877 0 R /Resources 4879 0 R /Annots 4880 0 R /MediaBox [0 0 595 842] >> endobj 4879 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4880 0 obj [ 4876 0 R ] endobj 4877 0 obj << /Length 4878 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€ÛâC/ `í9Ø@‹o6Ábw‘Éò÷£nI=ÓT”øM‘’zä=ãÖˆ,VëÍâû?ýGö¯ß³÷_ÿ“}ï¿?|=äǪȻ?ÙéëÝËt}ìΪºÈ¾ÿzxÊž‡Çöß§C÷Âׇ¿¶?ý/ÓÙ_Ú¿?g?ü½ýðÇþ—N¿ðë¡RUûý—ó÷¦RíOùåûéóþö‡ì·ÓˆÃt=0×ÿ§ eëæÆÄÔO‡a™êüõû÷ßï;„ÍR亩êLYc3ÕXý÷Ÿ‡ŸÚ †áócc•ªJ[寙¨ÒíL&W&SºiqSŒæ9ÉŒ®" ®ò*ÞàgÈ¥‘¢L©¼ƒKRV•yDÊ^F|]؈ls‚<eáà’”5y‘²—Ñc ßæÙæ y,ÊÂÁ%)k Ý¡§¨b =ò‹¼ŽÈ6'È¥‘2P.IÙ¢Î#Rö2z ä—&¢@8C‹²ppIÊ–u‘²—Ñc ¿²õìòX”…ƒKR¶61¥ñeôȯc²ÍòX”…ƒ RÖæz—í_q½>Âà:oâ ~†\+=m=£KWתG11ð>Âà6¢ÃÜA.Ž•¸xtIâÚ²è¤l ü_†0xQÅÊäâXˆ‹G—$niTLâ>að˜¶Ty4ââÑ%‰[WÃÖj·<Šž‡—¼ýŠg«u‹ce îhôÇQ0(Ý' þäyñã·Ãû/­ Sfß~j!;OØ}ûöëÁ¶ÿ9Å¿“}û1ûc χ?eß~>Ø£5]Šàô{ç'ºFOòôDéó“úX7y©‹YïàyTG«àÓ=yþÀÂeç'æXز®®)‰‰1RÔù‰2GÓêðö¥9 „P{PŒWŠß©]tÁePH!øÏÃp¤‡È]ó‘¢ ÖC§Ïç'ÅÀsÞÁ<äA1ö¤Ôçú‹;<Ã:pź£aqWl;bþÖÊø×‰geU$t«NÞRX¶ìg5Íñ ÷Õr?Â' z¢*øÄÂ'UB>À'Ÿá>10F1;bTÃw Æ5~çcBîkÝ‘I®ňg4†&áü"KGÓ$¤Vm‡Y?IÍê7 2Í0¥r7Ôßs‹tמóèUÆ6à ôÝ”BŠKkÕ:‘טWpcèn™/ð(­ÍTªjœµ½Aãâs:¡.îŸüÀ¨O ßÉ1ßA#Æcª@s«‹ ¼ð;PxL¢O„I„ÍlÄ@¼ašöØIÂ}ZéiH§ž¤´•¹»¾m#<±–\ÈHœ0×t]^³Ä-ýF˜OÆU¬žÆÇÙ¿ÚûÙaqF;3VÖèž ܃Q$}B‰˜ÉÐÄˈÐ<„—á1¼e9Ë!f=Ä~•Ío¨BÊl™ 1ÕY­}ÆH6FæÃ “`aEUQ€¨ÃXÂü„õ äNRF;<1%UlI“YLì § Ù»ŕï¦òÎêS8Šíà-Ueá̃!`Œ1¼“?ÌwpúœC¤”8óèu-tƒ-ž'QÈA6Ãc`ØEã0 À¥ÌÖ˜¢žÄ"Î8y78¼ˆÃ30Ðá¡0µl2D% õ:2‚¦ª®uYXp› Í1aoäÅ»‡[!lžyð΀dY‰íÙp4ÌË8Éá v&Ú›o8¸Î$z0ï(üë&FŸaÊáw ¢šBVÚa{CcÅ|°| Ü}=¥Êe¥N6¤+N¤¼xìR`[œ{ìwœ7¯\§F¢ÔãŠzŠq¦8ú€I 4Þƒi5[Åp»]·Åe=ñHa/Aj›—£IŽQ,Ô£H˜H K bG.d²1#è Ic× õ"P!6¬E#ûž+£U;7U©ìg* Ïô/Íx"›pñXLLú‹Ùó“4#Îg"Ô“Øž½‡í"·Æ%EÍ0RH…ÖŽFÚT8>Ä¡x@[—1a=9LBH1°á­;.d^ÞKmwÙ:"ý½|Ö1 µŒ‡÷ R4îA¾¬…¡f4SØ#ŠÑ³#©Boθˆ¯GUn+W‘2¼P‡ÙTÖ€­Ûðxr˜“DÆ=Ö¼×SHÕS¬¸Š;NÝz@€Âc˜NiÉ1¬¢™ÞkLrBð°e*æ‰|¨SÆWSCõ¸§qù,¾¯*gÎ;©ÿÛ¦[,ÙÜ}Ýø=q6“õÞŒcéÁA9j 0év‘&S¢¬)rBb±qÊw©.ö“ÎûIçg¹µ“ÎeYOîAJº­/ØG9¢÷ L)4+½·‡Ø†Ð,` ú.4OŒ\]š 2éJ" ÛoÓ0k®w©nTä2&{@ÒhíêA—Ä1ýÔLÙºbÚûÏ\‘¾hNÄ‘õ§Â¥jrŒ}.ªÈdñCü©hJõ†™.yçã1+ŸúV‰/ÔšD€Aê –O*“¶¾@ uÒE´ RˆRžïÕ¥IÂÉ8FWáÂ4Ñ3=û@´ÑO üKµ8‘µ5=R˜É(`à/ž.{Y¡I™ &J¹*vuF¬…¬ûtoùTªäµ‚oºæV\@ÔðljÎdŽ‘ä£$ñâ™öTñ†r!.sèï-ÃVô$ðò¥öIê´Œ±ŽÐysMÃcJtãŠtÙ–©ÂnX°/u}*êêdOEŽ*ž°³K"¥r´²!{_c;™± ˜wâ„É™:ý^”©â˜7¦z-Pžìâw_öz_Ä$)d¨/×}­ ÏC<ñ´ý+à ö¡êµDË,nô·Í¢„F_€‹›Ï#O]P‡ã&¹—¿>ƒ P1IÚDEÜXS•vx¾™Ÿ¦¢&²Ó®\A²;í’Rºt±ËÐÀâSä8A ¹Õw‘ºæ³-²Õ3­ØÑJéáѳ1R ËÀÓ@¨Ûh7ÒÌhL©5sÈNøz!¾6>®ÌnIânÞN¸Q«ÜÕ-r‰¯:SÍ­9u/Ju=eËÉSŽwÌøI¿ÿŠ£µ‚ÞÁô èÆ;C¯í¿>.të>ÅW û µ¾ìY'¤Ó«ç[£} ‡ÏÓ;Ÿ· €ëé%À­w:ì”G£´³g!Ôý SÕÑŒäI2g­¹å† 2¹¢È·KSU«õÛ‹µc|iÊ9”ð5’õš»÷¦6" ž‘ÇP?¼'²“X®K{3¦lVÖ]‘â_Ø"´¦t£Ê̵!{ñÄå8K’»Pf6¹)p™—o>@¥¥1Øü˜¡£´æb˜bä2#gµò‘Lßbb¦ÎÕ|­÷6楛ÅÄrÙ¸XÞ^Ù\ݸº[Cãʳ ˜Ì³ìf0ï»äFl=_ßoÓ-òð´ë!JíEêƒSU3îMM…" ۋؼ¸ôd‚žˆÇàÀ÷ôàKÛ°¤õ…6pñi WzšÂ„ŽóhY\sDð C{Ï•oÍ6ÀØIÂ}JåQ¸ó3Ãcx=ý=ið«›É5xä(/zð‹±¸x-(–ùžÑà“åÛPaj¼RŒTPãË®× 5–¾x—à…u-a3áõ¬âúp«ìÐDÑ#IÅêfÀS—“ðlÓFPø ‘Ë ,B¸ŒoñF\g.KŸå¥æÑåëí­¶—n–1.ß‹,(´»†]P¼%A‘(¿ÃˆÏJ‰†6˜R9»Œª¬ 8Ê@äa= 1µæLY4Mfâæ7d2qæU]fª‡õUä9&Ú íþOßJdo“õ¬‰{;¸ð%Ýééܦ Êñ2DÅ%ÓE“9}RLè·Qv‘êp”Œ"¼ª9Ö]„L†žïµoŸv=ŠÅïý‰TÝÿÖ\|A5X‡?¨F1j̲Y,†ùZyÍ¢¾=»ô=ÄâžÏøEvÿ°Þghà>øØ‘»Œ”%6FÙŒDi)ªQ s·N›ã‚…TÁîEÃà3¸Â˜ p…'R‹ãØó8Nºf~Y>™ìI鯃—‹K‰Ùâåž'D‰S’Èädvþß4ÿW+º£oñ4³‡—q.ŠÈÔy2‚XÏ,^ Ìÿ‹—P¥}˜˜Òá©låÒÒ¡IùmJ‡ðË6eÀòe=Ö½]eƒsqn dbd‘{Ä0­Z˜_Ô…6‚‡Y÷èãÕ ‘£wÕ¤z™àmêk.¹%Î|‚UT5žîËPÙá¾Ì +.l¦3¦}");ƛǴaús3FÜúÏ/Þzg0¯Äí(Tu§œ”êÄ–-ѵPK,ïÄËÊÁ•ð¿)£àÊC“ŸùÚuSN•ÞƒÒØ¹KYS ñì%x‰ÈïÁ»I´§¡‡ZxÌc©ì9,7ˆÔ€§ÏÑQ  ¶ت•øx¥²ëY³]A µ¼´ÓØT lª0Ÿè©rìkÙ³¤jDÐý0é›:LúÖNGmAݸ‘8H…:êEîÝhßóKÐ;ЏO¾§ªŽ¾ÖžÛÜ5\iÿd|Ÿ<~ÂÜN¯á¼Òž{”9vêqÖ;p¥ì0xûçÁ|¡Ö½%`‡ÆéspݽSÒ×;µ×œA¸6jŒó!ü P.¾]—üËâ&`ä·ž3°„µè±rdÛµ°KMÚ2éiÙN“Ë'xqßSÆZõR„5Î0&›£ÇlÐo•£ÃËùVxQ}ÒXÖë(ãI0”½SùÂbÁ9C'šG1ù ÏI,§ÆPy§oõ®ŠÊ¥Õ~ ör·`{b«„=cËê\²;µL¯ŒjÙñ¢Íôã+¶¦´î~Ä ö¶/,oòék#ßÎuÖ»Š}•Š ÂõËÔiû•=µììåöÇ©_˜!/ê›ñûvG·J£…0ÓNxè–0ìà®nìèn­úØE‡_>é8»?髞õ±E˺ŸÐ> endobj 4886 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4887 0 obj [ ] endobj 4884 0 obj << /Length 4885 0 R /Filter /FlateDecode >> stream xœí]KäH¾×¯¨3ÒÖ83ý”Òôt7¤ÑŒÄq@³,hÅ®öÀß§ªmWwÛõ…í¯"®2#˜¡³xGdDä‡?~ùûþŸ¿í?|úòŸý·îïO_vÙ¡*²ö?ûÓŸÞþÀÖ‡îßûª.öß~Ù}ßß}Þ}>þï÷]ûÁ—O>þë{»ÿÓñ¿?ïÿú·ãì~éô ¿ì*Sÿþ÷ËßMeŽÿÊΟ~þ¯Ý_~·ÿõ4c¿\·™÷ÿÿ[ؼÌNÛ˜Xúû®?¦yùóÛ·_wZ,[¥ÈòÆf{“»|ošÜîÿûÝOÇúé³C“S•y•]³PeO+ÕU±7¶9ÎTÕ£…^þ(M¯?ùñõ6y»su¨WyvEä&Ë[¹ã?ôážÞró¬ò7ùËÎÕ¡Ò!W˜]¹yÑ´ªJàïg÷þÂù$œÓεңN®‰ÙªèI¿ò ×é=LÞX“¿ì\*=nñìšÈmêÌ#Ûžg÷þòȸ ç´s_l 'WÄliΤ_Œm¶ë¡oj­Ú€%ó¬]²î \דNU/PxEB ‚úP7Ùû‘Ne\iÕL=çW[ “r×^翎”ð›ŠØ\§£‹Kß´4ëE^ÖÕÛÓJ?ãÎÖæøÑœà]Àf€bà–:sàÒ:\ø€­ÉYô0™3‚gsf””0é¸Á¯ ›ÆXÁÓçh„bb.Så<Û|F؈¡¥ȆÌbkøM ÜŽ‰.lÛcúsÌA)æ8‚ Üól®é¬æY öÉ·2+œh³tdTþ΀0®òâ2vÊ!.]ÃC‡S28Ê©_m˜¯0E9 _ì" Ô÷G°ëÃov?AÃè2ƒÒrsÖXÙò3dL0Ó%¦L±Æêƒ{£8S…ª¼Ä´œcüD§òŒ†àó¤Á3Öô×<)‡nCÚS'@ÿX¢š[À)Þ–v[½ågwÍUצ7ÅuÖ›ñ¥C¨ëæJkákîjš›Vê¹11ì›3ô¯ë%̵iвËj/òR9Ö†u Ž@ ä0-cªÀ|–°Ý¨!¼5i‡ávcÒ.Y“Ÿ#ž›µ»RkÛfÆãonrýÎâa®,ú3lñ°-&ÓÿK>æ^³¶xØY›N—fÛ¢xa쉄áÜs”}&‹­4í”Ú£*,pB/N/ô ÷¸ éÓoú)΢]·É VHLÕ%!œZ<ÌÆ“äne„8œ·Î°<×Ä A€|™|b¬ç˜ ·ycÚ´[¾€8aR¶n¥„nXða‡*Rñ,S.eHP}3 ÷¸îêW¦”F·ŠcIÑU b”%Ò8!.( ¢å£)0ñÞ†À5Ëm‹.$ªPÆ£mªz GèjheV‚hîMpˆÙM$Xåx†ä_‚âj<HJQ”¨Â#†i;ŽØ% XÕ•7ö=u¬ìþ,Tá?µüFwªaBŽ. Ó·]Ù"×7mÜtET½(û‡}R¬~ãDUe Î=a  f†al]‡Æ&ìÈK0³änïcïÔ‚sï7~§qcŽÁs§ŒßÌCXçŠí›§|ÿí=²f %U\DÏMo¢Ýš À!”±¨ahG8à:Ø …{¿ŠQ!È+. CwZ‡ßVaA᪉0e©»m&ª üø­Þü_)ÔC—’±M<‡OS¾“]rt¬ÖâæÊ­…±ýÐ žÂÀOñVÛ0%„º×gÄ£®³Ä´ ÅßèvHÅzS£Qd`Í ¢X÷EA”kšžX1xın€¢U5sUÎØÀŒh‡:òAqK9î · Ý¼;ß¾• =˜K"¢Ë@–òáãŽ`taÁD›ã7òÑ*“T¶"Å£r,ÍP92©– ¯={)TaLÕD8•c!zÈ5 Âpê „ü] Q&¬ÍC]³B-ó‹’f\Ì¿ycN)ã@dǘ°¹…çYàP¨Z5*>Œêõé/fU>Љ‚oĘT˜’‰šJå Œ^0~hWnŠCÖ¸÷ÈÜÛª˜9¹¢Zö;I¢þãseÖ7ù¸‘Bž%ôDàûÍ>=µò«~¼Á#Á[“ 5iøÜM|}ƒ·P7LóÓWl¥`ÝÜQ"]zaÅ54¿Xgù­¨KÏ wLR†j£ãa„Û¾¬,1¨lFšoÓHsˆå^.ÉL¨G‡ËüŒ©VüšìPVæ½wÏdœ,P­ !èÞÒã*tÜ å˜'òÊÜ„ëŒÙƒHöcš ë¬*ÓIÅŒ!"›R³ÄÅ·ò˜¾v‚ŠÇ”2²Îñ¯êæ¨ir]¨ò¶r/£øòùÖSRƒ‰•¬v‚ýÿL(L¶Atú¾ç"XîÌÄ}V#7 z$Êצ~{ã³{lªñn¼»p7Õx•ªp¤¢„5 _Âo¥!“%âúª²¸7Œ4Ðµã¦Ø5@ø®h®`‚n;{›TÚ$ƒi,Ts—¨IƇÄbû Œ˜šŸ1Ê$ý/É;J¹O&#>:0¸ãÔ8Aªwe]ª‚×dÝ~”QÕ$‰×Ó5tcX§ƒ7b}†‹| $¸1Ðxc¸¢• /¸QŒÜ[]Œê½i.fÓ•-5Íû%ú¥µœßà½D#ÝŠƒæö¢o2¼Nƒ¾qEïµJqd*œ|V4ÉàÈ#œ ¯óg{F'¾0è”ààoú¸Ð¸µ#ÕÁˆXH;ð¤¡Þ=«\5mBé¼1ö?³Žâ“CJÁÕÛÏñ›¯œ¨C N¬‚ýUŠ*§ ­ Âêù›Ž€8ÆÞÕÍ Mú´ÿm1Pk9 zêV/}L^æ"a «T òœBÕ .ÿ¨ÃÙ„ê#ü¸3ܵò#Òp×ñŸ¥·ð)bƒ!Šáöi9 „‡§auóˆº.Ü„ÙâSñH‡{'7꬙†ot ãu(ºT•\?32?[¢æ¬Î  [_A‚´Â#PZ |ÂHì°ØÒâ& nIËKU¸ð<’¼ÄΫkx“‘òä%Æ Ã›ñm¦Úsx9Öt!åÿ¹ý7C/Níæ`ÆN_;½1”¥'–jß7àu ]…âÇtÕœ«Gõhd"ôÞœï(™.ä÷S¨ÊÔ ^Ó&H7\*´´"¢¾BDðVó¥·29`«z `+ɸªX¯Å{v ™¨˜^×Äܧ\j·Xi‡vJ/ c£®Óñö¢8ìTaL9U9·Ê‹!®n=-”)¼¦îÊž‚y!åQ¼×ÖJ‘m‹ã pì±|}Sì3æ˜Ù7qs¸Á°CËÎNÓ2>Ž ãLËánpÄ ÇÕ&£ºï½ð° Ï‘#+eV÷hå’·fWegÈ¡¨±$ªgß 6™ì3¡ <¶Èä¡$$…Fo‹uûM©¥ 2¶¡¤ Sw3=[­+ä)Œ)rAaFåˆÜæWô©ØW¡Rßæw?Q¶OñÏÈânnºÂF9î¹ØÓkË¢zÔø®È­vÿeîˆ2Òí‰qcÅjçLS×}4c$eÌQeØç'•G-^TñÌLUŒHU mÏDÄîøj&Zye]8Jc*öƋܩªn݈¡n}óà—âÃÑ.Ž6õæ[½u•I—l‹Îê(YãÞƒë#œ­»ëºðØxÛZ¶ûÔsBz“É*3t'qJzô„p!-9â»ÆCŸœ²þ·¤$_–¯ß¾PÊéšLÎÎTK§A¾¢š<4u?¿ÉÓ&˜Š°G·‰·kÍëlïå—È:7ä ; “{Ë]ÐftAnÉt 4Ýnä˜-uÔ\ç5'ƒ}ÝÙ¯»ܨ6âÐÊTÛà]œm ydÌ3I4¬+Î[ÛóX7ëmb„¡1ÛLÓXtøâçÇp(bÎÀE¹ª­Á¨ò{Õ"c¦”^¹ùbôfx ”ëõù…öÕ>êõæ ›pY«pÁæ°:„³a“€;ÂI‰¾0ÂÞrßLïò!Ç0a¿%Þ,{¶ÄÄ…×”¹Êanòü^nS±Þ£KEæ4Èè!à¨Z†Ä`D€û‚’"æ•&@£q·íÙú¤ïM4’ÈÄ\ Óñ1tå¦jFõbñÁ’:v¦p~L{å7"<&}”Uõд" ¢°ItÃÿ·ä×x8SÈbR-%òœ¥±DÏWxT€@ד÷gòQšBWo«5`žˆ„•Y>‰fA¤3¯þ2]8†¸ yST¾&j$lñ­îƒ?8Ôwk1çèÏLP˜cZ&3­è™v©8Ü™DãݲêÛ íôq«@L˜71î‰[\ ÷˜.7€ Àr7aO„›š"0¬nú>cž‹b.µé 4]^'7E¿×]‡Ñ,©ËšÊœ/¶£kî;’BŒ}ºI¡M éK¡„¡ÿi®²§ª²OkÔéú)ïgB«ã+&Ý@µ-J¨G<ŸoAkoAk¢®Û9.Jç_Å„ õÖÖ¾§’K¢¾î`°BÁïád}¨6r¼7¬±á‡ó …†R~Ýq{…/Ê,¶ëŽª°ÛÿݼÀ¯ð-ãŸ@o ǧá¤Øi ^‰¦è Ÿ”yaW/…yLæ~0·ËD&<Ê c1åf’ú„`®Ár#zȯƒmABª¾Hï DãkÝ“âw'ñÖF½RuÙFRѵ˜™IWÀ»f®„˜”˜„CÀoõûñÏþûQ‘‹zþóÔ/̈×+ëŒ;dæT8»·çð6>r)E²•åÕ… Okÿ؃}é‰8Æj9qÝ7]á;¸#{D븩ºœK{{îNŠzxàôá|È8¸±°cvÇQº Ç0x6øM'"Ì¢£W¯dËÜéßÇ÷;BkuÆÎ"°SIí—Ȧ‡wûóY2øB¢^X@$ÃÐ8&¼ƒ!wqàeô ág§¨ÄuæWQe•¹C'Ñ®&Ï7%;“bûóþóîÿ§‚¢‚ endstream endobj 4885 0 obj 4936 endobj 4889 0 obj [261 /XYZ 38.2500000 345.500000 0] endobj 4890 0 obj [261 /XYZ 38.2500000 569 0] endobj 4891 0 obj [261 /XYZ 38.2500000 345.500000 0] endobj 4892 0 obj [261 /XYZ 38.2500000 569 0] endobj 4893 0 obj << /Type /Annot /Subtype /Link /Rect [354.750000 547.250000 407.250000 554 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn10 >> endobj 4888 0 obj << /Type /Page /Parent 2 0 R /Contents 4894 0 R /Resources 4896 0 R /Annots 4897 0 R /MediaBox [0 0 595 842] >> endobj 4896 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4897 0 obj [ 4893 0 R ] endobj 4894 0 obj << /Length 4895 0 R /Filter /FlateDecode >> stream xœí]I¯Üƾ¿_1ç±n@ÀÚä@€‚;N`ØF”ò÷3 9zäWdS]äÌ ¶ä×b/Õµw-oþøùï»þw÷æÝçï~è~÷ù©Ø×eqþgwüõÝóøfßýyW7åî‡_Ÿ¾î¾>}zútøï×§óŸßýùð§ÿíüîO‡Þýõo‡þØý¥ã_øõ©võá÷_N¿·µ;ü©¸ü~üù¿žþò»ÝoÇûåºÍ¼üÿï|bpÇmÌ,ýõ©?¦;ýúï¿=½9 m•²¨šÊï\ qçÚèwÿùÇÓO‡úé‹}««X×,TûãJuÓîœo3UÍh¡Ó/¥é3LÞ–U¾ÉO;W‡Š •“gW¼ÜºðÍ@u¥¡o³gíŠoòÓεÒ]-ž\óf]]và)ÇüAú—é3L|>²=ï\*ýÝâÙ5/·<2þ#€|ÑfÑeúð¯ò*Ûä§«C¥¿\<»æå6.däÉ—Ùs€¿i22üÓÎsñd8¹æÍ¶±Èx³—Ù3¿)\F~Úy®›…“+ÞlãšžªbYgÿ·ùõ'o«O?ï\,ÝíNLÿ)e¼—óO€-÷Uøðí—§7]tGƒi÷å§ÃîNkžûrK¹ûîhÀ0ò˻߅‹Ø}ùù©ÝW¾ì·8;R¡¿)>À‘÷p$À‘é{+j8ÒÂÙøG#ñü†póßÃ]ãÙày¸Á“b¸áo„u Œ«Œ`à7˜~0Ü”gƒß„ó7¾Vv^Ó–ýªïíVm]ÌBÝÂ=ÀÙüÛtœÇëxbowDZUamÅÇð®ïÃùŽÀ“êŽlƒ÷µ!ô°*Ò!ñE/1Ajè ë xŒÿ—UùºÀŸªX7Ãx°º”v ¿) ûA—{[Pz Èü`ݟȼiúmžA÷1œŸ ¿­A#ŠOŒwi¾ýÕ3u7û¦-NÇâÕÄž¾“å>øÆ½üÆÃu90ìËx°/_ŒÀÙ:ºo,Ü#/Ûv£ /¬/™±ç¾ùœ'ô#A§"v@iNªòA×2£$Ôœ®“•ÏfZÙ™MG_ÞM TÈœçAk¥µ*V|!]u("TDZ(bç„ïÔ:%’ú¶?5Ü›°¨«`ÅJSïH;z3Íè¦öxæ‰.ô[ ë1z›pŒ!,(Entâá:çßĦñzÂþ£Â ǸÛq ­uÔ â&­k‡’{„û„QÁ˜Ô­N »(Âa}®1SĆ"fØ#”Á3E|axáFÊÀO•itFW³dKJ óÅ·.1 . †$R‚Üa0s{|.Âþ`޵µó:ÎõÛ^2!ײh’Ù=oõ®¡8"0bWÔ/Ìt}¸Î(”œÃŒqƒ‚îb$Tng÷Þ^•ëq{#ñz>Nø…ß͘÷a׫{˜Ï!ÕÁÀÇšbÇV‡ï÷ÞúQxë¿KÖ.\B¯zÒ®«ò¥¹BEÈLô~x†Ñk=$A|ÀÙ°eØ@ôD`š°·ìýP„&3þ®g6VI {6ez¬s¦¯À–»…nÔtH8 ‘S†1fó»·Kßh‹ño .&à†1î1Êé>8¬å Á€ÄÀç…Ó¼— ®jU‡ ÅáT\ „OòQbtÃ\ñ ïÅHŠø™]«¼Œ`üM_,°ÊbõHˆe/«Ç-äŽî Ü¥£É[{æ ÍâC…Ú(ÇÇ×ÙïìðÏbká /ó¹0´y°ë•I28ÍH4ZõÂýèÂ;¿}’¡ƒGùm–á›Ëi)5gy0I—9_0P™ ÌßyeÐÀQY–³`å HyÂ{"h}Œ/†yéÕS¤ÈcÜP£P ª‰ $[÷å/q÷öl!<Ьïe×MŠfŠ!:Ľa~OX?í×8‰8 ß0†@¸á!,au NŠC3ðˆnš9>)S ¿áa0Ljœßx"ÆüÍ\‰)îëYìÃw‚Ï€ïÄ*ƒÁ ,CIðA¡` ~E_]²èž§Íã,|#¸êcd RŠ`Ju1ÅÎGÄY8ÊDz0ÁŸn–2'^Szo}Œ)Êt£Åå^S™¶ÚW+”i«}ó(Ó¶eÚì8Âm–i÷@%#0AߌåQ\ŽæÇ¸Ò9]ñQ\®x—Û„l{—C”>ó6ÊKÝ¢I·>ûê!Uí––X-°TØì-EÙ3‹[+þuØÂˆYDÊYD4M9¸Eå€ 0[!/<žS¼”# j_1É3ãÌu"ÖG9ÅèÞ¢3Çú$Ä‹I0™ƒÛ©ä­‘ÀÆ'& EÝ”v¶AŒ‰¡ÅÅ›™ 7º„XÉ\¿(¤nÂä0ÅœUó¼ÊFFº3!·V9G ò`ˆ”²Œ&e•ÕçRއÉ!S—P]TØ3S”ž ÑOج^¦kŒèö±¨h2¡0õZ•Quý;÷ÚDŠC,¡^BÈo¦_Wôކ/ ÊZÂe[%N„ú" x"Ï™Ÿß ·™7ƒaZÑ÷+dýkqCn)Ù†aû‚FI þF§ü¥®å€QçûåB˜Ás\œš°øS ‹K˜gHUf_ž°ÅÀÂÀûÙú¡dÒÕ3‰ê¼x6*#¸€Ún)R%±ê€_Œ€ÏTOÁW©êTµr9 ¶œÚ(ëVU5ø¥î«JæšãLÆkæNnì˜rrb–Å”ÒP;”ÕyÌJV¬ìÒ–n ½¨xƯƔÆzøâÍÝh yóŒ¹A³bÔeÕþ/*Æ‹ ¥a 0Ï|…´;)—@‚ }»Œ Ì Yµì¢9g`[CD7ªYCáÙŠA0®h ÃÏ 0&a¸3¶æÇ jžª×_ <ÛTL9xoà\ºÌ6þo´ £Ô2çQ}:½û—Š:F8Òo ‰¡ûÄpµ6]‡cÎ-Us6¯-ê<Õ-§–n¡ƒœ«½a´B#Sã8!–ÃB1ÞË*æzê6ðlª1¿TüWsø*•^z_Ó*ú Ý*#½øP &³Zªú°~K®‡*k_Ô“¥µhȼÜQ'ăˆò£›®í»½àgæY_%%j5’© ¦«Øl–™À3™òÙEaíê(ÞƒSæpìá&èDèý°òÃ4;×N*C.TV/—tÅþ\èWh¤C€rïAé ´o"ü¦…ß”½å1,ŠÓúÄ7';ŠÔ6ÔØ3±ƒ®†J½#î÷6}×3yTûp"›Eßà„ïá:øæàlEgÿùQP¸°kQææ<¾S«ŠZ±í‹ŽâŒAǽLþ¡ º3Ñó¥Ã+Wî‹ÁÝ ášo{Œy…WwNê¼²šÔ±òaˆº¸"”ƒ#D…«5{ãùÆNMyY¬[¥2;£ÇBÆj°ê ¼ÝJ# ¦äc•›fÙfŠTÄmuåN‰Åï/L®á:a¼íº¾ç„ú!L,á’ ß$åé\žç@õÓÄáEFí(uäš"êºrôg½½'^þœY»Ìúü“E\Þ-çòM=âò)æ)H²¼RŸ•êñZüV•àŒ,nŒ,Ç;?]y¹?Î|Œ*q/~òËÓgAkÈ£nœöð©ÐY£êÕÌëõ J„„˜Å&”ãÄ"œy*Ì[¿CÐV?ã¢Ò5ú¬›Õ4HÐQÊkå £œ±Ç<íµªVº~É”¢Hº“W+|¥« &ñ<¼~zõâºýÒ,¹êÞÜý·ä¿ÌìÏX?ˆoËu<²Äáä,>Y„´â‚@È5*Û(¢‘©JPYEס¤¬1ß­¬.Ř-¸gÑ»Qè8ƒû[á¾x[yyLê€q/1܃ÐÃàî̸OÓ5wêÁ}Üñ:¸;3¼¦ÇjÄ€ñ® ˆâ;-álV]Ô)úÁ뛘›[Ÿ¶îãˆ×'ÅßD¸NÔíû|“ÌôzY24g)«›Kp-–ÕLGPÕÙÈc(Ât<;Uqé-Ža…»sbXa=C÷°en˜à}X ¸[¯*÷Å”RK‚ÛCjITòZÆ\ÕÇy¼Ä°Z½+¶ƒ|ƒé}­{÷s÷x„œ²â(ÌIñ-P¼Æˆjõ:v/ Í® ML‚–DH-Lg7ÊÿñÞ°'ûk0·#vðIuñŸØuIŒ'†tVùkèì!7©åW— ëkÕøæ}{¨q,ÿÆÇð:po.oâ†ëⲪ¡¯¬>f)Ïp½ýÌ7Õõåeö˜T.,hè Äï0µµˆÎ;!¡tBBŽ! ’¼¨ö3LGÇÕÚÈZE=< —À\¹_8®™ç¬ ª¬G>鋯‡]«š [‚¤†“ŒùšJ=UíHÔ(ï ܉fUºÞV¦ÛïëÕ˜‚êWt¶ÖŠmÁGg„Éú]Ù%fš˜«áoŸàgÈBª“5›iõ¶Åd|éæ©é¶Wf`Ùž $1ua™d ÝÝ ]×U[½üV˜J¦MËõv[~“+ÚÙÃ3>¦Û{t˸Ã$mhv1ÍÏ‹—§ Ⱦ6.F§ÍéiZ*ã cÖɱœæ ²Tª¡ª¥MÓ3:Þuob²GU2¦±^@t1 ‚÷GD9ü Õè’‘*¹®ö´Á³ÊÕ[¿'pm¦{˦$`U·C ¸ºŸá¶e0U‹Bµæ…n3Ü·z;Söv[ÅÑ EÌ£Õa :ÖnáO‡£bÔ覬¢)k× Y ¡Ð%°eÔḆjA~3Ñ+¶<“’”–Â4ûTif¬¨‹Lá„n®‘©2B’9÷ÿÉ7ó×=l^›â‚eäåö räi)<6µ’güõcZX®2\'0æ–8!#Z)u:ïÛöÍ3òÆÐ4æÈ<Ý”oQ™­à‡oæñg(R|q7`‚3NŸK…z ÏxÜF»·*ovËa}W¾+ß}ð^'AÁ9màPU¢4žV™x¶üâ­)ƒ‚xcº‡§´TgªÚê¾,«l 8Ly8Fb0¯ì8z›¨ª2œ²™èPbM·`} Z§ÉáÌ™ÂãÝ@J2ŒZ÷­”òåèÞb‚%¥ÊWºVìœM9?FCñ¶ÄÜ­®•·<„›Ñ’)~¹åþ N˜¡`ÀÈH-˜%&ÄÀSo‚ªŽv¡Nq©%gfËP5ÞU/Ï0U²ˆéHŽKá¾ÖL I¦§­UA3X¶ ŠNŠKdᢜD@¡tžÍcC_ô÷j ˜â‚qðt¸ÈUº —¹S-^[¨å­,¸“2ÎÞ‰añÆ_ :\¬•($ë Þ%”(Ä|•À¡/Ó©’Ø.5Œá&`6æjp×^-VfŽ] 8¾º‡b‰FtÝä\§Û›É݇0|IÒ²±Ùilgo•Ñï|H|‡ô!<ÆR¦L:>)¡Å °Æ³A=PèãÃE¬bø%7x ÷ÕŬ»âÈå…]3ÅxñlD¹eFßÖÁ³a«ŽÑß›wýBÙÄ„›ÃR˜±ÔÕ:õ,zU3 «mX³¡©¯‘DatW`kB±dZ^ñ>R mÑXT³ûaxŠY 'lW2#XòâæAªÐx±]ëž&ú2 V`:Ál7Œcª\„Ѥ>©å=Æ‹ç ëâ–ûi.m%tm*B[d83#O( ß¡ù ¶>¡™S6c‡Aªø*ÓVEµžÐæÎÎJ?±6×søÜ¸ñ„|Äë`=b_Ô•GL»6U=”¹Üâ kCßa+c–¯Cˆó–6æÄ¸ ¤ô{“ºü6ža|§˜¶U¡CùY1Íáo°<$fðšá°†kæß „{|h<Ê2w°Ô’Êy?œ®U(¼ c>†×Ù²äÆØ‡ù2– ÌÞð{4ž {,áKª@µXƒ³Äòº÷áµ4ªùU+×{îÍÒ×µ›0 R]õ­œ9©Ç{÷–dÚ¯«B”i¥¾ m¨ qv?¯ˉ–´Vréª WÜãúá­‰åe)±ëŽ2lð¿uWà?E3ØÆú Ž}ÁÒ‘ÉRÍêÀytÂ}ÆèÄB<*#¹¯"éDø1WÅ™˜«2O*G×ÎQ¥9*ŸÉ‡`tb:ŒßŽðZÙmBFÑ&t®Ú]%?:×t®Û´m,5«Ú_óâûЬšÕ=jVº9­Lì 7&ßV5¯ËLÂ9Ôx,Cñ£G™7¬%Å×çq»/au5¯pøµûz˜^\ýÓÜ_XPú®™¬³ï¾pÇúå;ß¿·všÀTÁ´3´ê‰ªJgJñ{*5¦âj<ÒAÁï»úéÏp鼃©RSïÑ:a®ÚëÔÞ>v'E%ÜqU¼8TLq;‹j|ÀŽŒpMM\TqâÏ¿é’-]ÒÑŸP`îøçÃŽ_ªûSE¿ÊtðsUü§Ð¦‡÷ùç‹ äp”f€xaáÒ 8Ç1 à q¼3gÓðÂÏÃc`Z6Û\•uöG»=?<çís|}÷ééÿè}ü endstream endobj 4895 0 obj 5804 endobj 4899 0 obj [262 /XYZ 32.2500000 416 0] endobj 4900 0 obj [262 /XYZ 38.2500000 320 0] endobj 4901 0 obj [262 /XYZ 31.5000000 416.750000 0] endobj 4902 0 obj [262 /XYZ 38.2500000 320 0] endobj 4903 0 obj << /Type /Annot /Subtype /Link /Rect [45.7500000 382.250000 75 389 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 4904 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 374.750000 90 381.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.oracle.com/technetwork/java/index.html) >> >> endobj 4905 0 obj << /Type /Annot /Subtype /Link /Rect [484.500000 354.500000 500.250000 361.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://java.sun.com/docs/books/jni) >> >> endobj 4898 0 obj << /Type /Page /Parent 2 0 R /Contents 4906 0 R /Resources 4908 0 R /Annots 4909 0 R /MediaBox [0 0 595 842] >> endobj 4908 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4909 0 obj [ 4903 0 R 4904 0 R 4905 0 R ] endobj 4906 0 obj << /Length 4907 0 R /Filter /FlateDecode >> stream xœí]A¯ä6r¾¿_Ñçü,R%A{Æ ‡† ä°È!ðÆY,<‹Lö¿ŸV‹R‹%~T«T¢Ôý#;jêIUúªXU,Éïÿå—ÿ¼ü÷?.ßúå.¿ù?ýòV¼×UÑýߥýï»qƒnÞýõ¥nªËo_ß¾]¾½ýüöóõ¿½uüòéß®WÿwÑ—½þÿß.þkã_üµðõ­Võõß?nÿºZ]¯Šáß¶ý¯oÿþ§ËßÛ7öä<3áïïteL¡[6fH{ë?SÝþûÇoû¾`•ªhšÂ\”)¯ÿ㌾üï½ý~%п¾xwF©ÚšºXC¨Ö-%Õ”¥ÝõM¦ª'”nÿ ½_þåΖn³—wœËâJ«f^ÿÞXÿðšI¼iQkt+mÕ\"šUÊÙ¢n ¼S¾¾ÈV͵³užêµsérÚÐÿhŸø£´í‡¿è«úʬ»ƒ×!ýÁT¨B—#íU×ÒMµß ßE9ã#žµHBJàë­a)4ž*ÌU|©Ñ׺{£vÛQW®î ¹‘NE_µRnúbë"ÎÖÍyŒ™™6#îtø{kÐnÌP¢íï­!ëõµ»šGiLø.å5ø(å"oÿ´wªä m¨(C±W­DH¡V‰tð´lŒ®F"$oTÇ¥zkبP<_ƒ†PCT¶«€r– Ô6Ø®O5!­åÄJbb#öÅ3ä;½ ®Š€“¨q’‡ÆË$NnܾPD._ƒ†Pa¤B•2××X’ØiM¬i¸³¬‰Á¾5¬unNß7~¹+ ùiƒÃþÞ ­”ÚÍˉ£C„áÝÙ<.7ÂIJYé"aCÜä…íÕÀ— ]íÇ\€#¸´„GWcžt!§3I„:ú”\çÑä1‰Š ô\1h:N€üV›ç“î*näÂv70dE0¹›û@]Ú·ûí‚«@wc‹b⥧ø09LâØ‡N*Mgç€à¤Ì®3Ôìš 736ÜY6Ä ßV:©Z™@÷—ת ÉGF|†oÚ­Ž Jíæ´ÄÑ!ÂèœÔ<.á‰$¥Lð ‘°!î¤ÂöjàË…Œ®uRÞîq¹_yÒ…œÎ¤òô)¹ÎkÉcAà¤bÐxN€üVä“î*î¤Âv70dE0±÷o0±CvÁU »±‡%1饧8/9LâØN*·s@pBf·V–š];äfÆ;Ë64Ã]ÃZ'UÚ@£——5!?mñ¾iC´n\Pj7§%ކwRó¸ÜO$)d‚;D†¨“"íÕÀ— ]í¤Ê!Gpi ®Æ<éBNg’uô)¹ÎkÉcAè¤bÐtœù­5È“î*ê¤H»²"˜Üí .íÛ}vÁU »±‡E1ñRˆÓ œ—&qìC'ƒ¦³s@pRf·l¨ÙÍ›uf0l¸³Ü3\N§—;©`pôòÊòÓ†ñì­o†Ö Jíæ´ÄÑ!ÂðNj—á‰$¥Lð ‘°!î¤ÂöjàË…Œ®vRU€#¸´„GWcžt!§3I„:ú”\çµä1‰Š tR1h:N€üVä“î*î¤Âv70dE0¹Ûù@]Ú·ûí‚«@wc‹b⥧8/9LâØ‡N*Mgç€à¤Ì®¥ÞÀŽçêZÓFn,)"¨#seËT/¸¨R9ik‚ß›¡Õ¨µö·<:DÞIÍãb£’”2Á–:ƒ@]FF.l¯¾\Èèj'Õ9‚KKxtEŠÄt&‰P£bän `Aè¤bÐÐ9åimª|‚ úM%w³†¶/ÀänçuißÞô5ã«xý‚œº„˜4*AgÜ.ˆIûÐIÅ ¡e0bzXYMÍ.)œ  w–Ii@×°ÒI5E¼p¢)H=@¤!,]~o…VÇ¥vsZâèatNj—ŽðD’R&¸ÑÔÇ 'H{5ðåBF×:©@Fo÷¸\ ¯H႘Τòô)¹ÎkÉcAà¤bÐxN€üVäF9^8AÚÝÀÁÄÞ¿Nô=ÚWñÂ9u 0饧8/9LâØN*·s@pBf·]¦CÌ.)œ  w–Ii@×°ÖIéxáD£I=@¤!,]~o†–®"ÔnNK" ï¤æq)LL’B&¸C$lˆ:)Ò^ |¹ÑÕNJ9‚KKxtE Ät&‰®bä:¯%IT¡“ŠAS˜„üÖdIwuR¤Ý YLîö?P—öíº¯ _Å äÔ%ÄDW :ó’Ã$Ž}è¤bÐ&!8)³«-5»¤p‚6ÜY&¥]ÃZ'eâ…!õ‘†°t!ø½Z¦ŽP»9-qtˆ0¼“šÇEÛ˜$¥L°¶ÔÇ 'H{5ðåBFW;) ä.-áÑ)\Ó™$B¦Ž‘ë¼–<&Q„N*¶ ù­6ÈÚ9^8AÚÝÀÁänçuißnúš€ñU¼pAN]BLL 8/9LâØ‡N*¶ ÁI™]ÓP³K 'hÃeRÐ5¬uR6^8ÑXRiK‚ß›¡e]„ÚÍi‰£C„áÔ<.¦‰IRÊ›†šàxái¯¾\Èèj'e„Á¥%<º"… b:“DȺ¹ÎkÉcAè¤bИ&!¿ÕÙ4ƒAŽNv70dE0¹Ûù@]Ú·Û¾&`|/\S—ëtç%‡IûÐIÅ 1MBpRf·¦Þ XäÜš6Ò0pS“Ò€®a­“rñ‰Ƒz€HCXºüÞ -§"ÔÚßòèax'5K•¤” ®©3ÉÐ^ |¹ÑÕNÊ9‚KKxtE Ät&‰S1r·† 0‰Š tR1hê”üVäzð áÖ.M”ÜÍÖ}‘€&w;¨Kûv×׌¯â… rêbâT‚θ]“8ö¡“ŠAS§'ev-p¤p‚6ÜY&¥]ÃJ'åT¼pÂ)RiK‚ß[¡ÕqA©Ýœ–8:D“šÇ¥#<‘¤” v´,ÀÅ 'H{5ðåBF×:©@Fo÷¸\ ¯H႘Τòô)¹ÎkÉcAà¤bÐxN€üVd7 ¸xáiwCV{ÿvR8Ñ÷h\Å äÔ%À¤—BœNà¼ä0‰c8©4ÞÎÁ ™]§ 5»¤p‚6ÜY&¥]ÃZ'e(?ÇíÞm˜);‚0™`bwDV"ï–â¢LL B–¸Ã'lˆú*Ò^ |¹ÑÕ¾ÊP† %ièÇjÕIBÈu^KŒ(ö¡“š‡F™„ךgPwuY¤Ý Y„쉞C)Fˆ+Y¯5!¡À‡É=ôUóÐ(“Ÿ”I6Õˆ½q{??\Ý9¯FŒF_µÞYR¶pmˆdÜî=‰Î3Ê£eƒ¹ßõ­±ê%äÝÙR”ÆlÜ…-e³Çhíd¦¾o¨(C±W x5KêBxZ6" ½sY­O Шvnnk„B¹„>n¨€=*âÕf=ÀëÖ@&óûG9±’Ù ='¡ pÑâqÖ«R“P&„\à·Bˆ$t|ó@F“ʶåëç%‡ 19æ yƷă?þúöýeTqQöòëïÕûÑýóë×·ºº|×{qµ¨¿þåòOEQ6ÿ|ùõooîÝêªg±»Süï8tGÕðŽAw4ã™o%|›…Ï|‚w~‚w4ƒ7H©‚òI|¼SBt ¬PÚ¢ƒySkˆhBà3%FÞ);ÉýôëµoÞËz^öø»q„Ú—øn¨ÒÁ=#ñŒbè ¶P“JH'aí>/ǭ¸1tY÷^—+»B—9w*(a]À·a™àÞõkËÓaý—倡—¬5æ û@ŽçÎ$Sl!qß,]Æxý7oLØX(-ýCŽðmGœ;ØŸA®eÑÁÈögY[£!¢šc£1­ª>о%¬ŽëvP6ªæÄõ‡N¦ ßáØË{×ÄØó ãä Çë ßv ¯çLf¯—kܵ¿Æñ“ÆÞ£ƒ{¶\8ÂG˜X 8"…}Oâ#û“È 1ÆÅ¬XÕäëµmLÞ^ËêéXû°ÅÆÆZ%Œ¥Å‰!y”x ƒ»\©s»œ¯g ÑTâ#Ç/;ºJD¡Ø¢pf¾ ÷tNž—ó¥%ÎÙX¯q”tèN6ŸöaFÙ8òž-(žW`hHÂpr—¢Yª’“¿âǪ{{þJåŽHϱç9öLß9Çžs½¶Þ¦ožcÏâ{æö@ˬ—GÎUsâzlÿŸôKÏñj¶ñê“jˆè÷9ó=‡°Þ¹£Š§´vœñÑ«/„ÇÜ95V¯©Xei,Î91ò{‰Ìö Œš‚g–{½Äpú&G/™2Ì5g$*;ÀÈ|pò¬hŒ“ãÉT‰ÇÑÞýkôðè7Ñ·^ã‘YkU8¶Š'ü!#ÆÊ´1°Nä 0Öœ|?£ÿTœºpÑ.ïióÄ&÷jù ûгî8•#ųûGYœ•yŒêUáÑÌ1Fæ6÷ZŠsfïœÙ›¹sÎìÍõÚ&w-ø9³wÎìm£ËªÈ]!ͱX—9ÖŠ•;ç®ÎZËSØzÀÙ©“Ñ;ç#SèpÖTžë#“šx®ìâ½fuJù9#§fU5-#ƒ‹{gž£dŒÓeg7…wDÁ¶çœ ¢†opÆXC8pf@8>3§ÄÁs*0:¢ý¯’Øßʳææ1:œÝî8èàxÛÎ<®ì¸‘»Lô9ÑÞxôy5e°ƒg=ðYÌí›çXú¬NŽÕŽìÅϽ“ÎÜ@V}ã䎑5¨s¯+Ê5ÿ÷k}NÏŸs~U¹ÜëÎùÕs~u]Ö*ûJ†§´/¯V˜Øm"§ö•Ùë_ÏÙý4}êÙý<=°Ê]áÉêµ§þŸU §|L;ø21$'Ûqæ¶^O¦Y#ìzM-xκíʨ–e_m³¿ü@'¹xj"c³»†$öÆ«–8ý>߉Y®¬V 2åË9'Lg¢y Ûܳ(‡î©®¿>ë'ÎÑšühíÔi yµ¼Žlô‚çjΑqqŽŒû¨¤É=‹di5¢gŒ“Óƒ=©†Èz½Ža£M‘½:%S>á9mçþU0GÏu»¢E69ÏŒ—ŽÎ3ã_iÌ3TÁì¿g™áÄ™æmÎ=‹3ª*²Z!û û¶ío…8½‰e…8+½1:ç©‘/wjäDZ·ûŸyfÚR\'f9;e:á̧1÷¢9úxªÉ½kgΚÁªÈ}Òýavõʃ¯Î}ž0ë§"#Ï©G|N{—ÑU&·VdµCÕšºº¬œÖÍT]?{TB+™“«ú¹Ï©ÏÝàÔ6¯åÆf=”Ä÷ÌÔ¶ºñs70]'nÞW„wü6_å{elSw:‡ÔPëaÞMYWá·–ôO-¢ç<Ɖ†w'¬ðKèŸ&0Á/Y€‰AwX„!ßWÀ»Œ‡ÐÂß…Ÿ©&œÐº.¼®ÞKݨðõP§„»a‰*û×­ú ,R ÖwU@:ŒÆã†…Ì “xãŸIhqéÀ·ùëCšÏ`–£š¦d(§ïaƒûisåâ¢|.K©ÄuV+#Vmü ¤ƒ¹fu¡Ž•Ó-¿ j°ÞƯùê`U¼_µ5±ÏÈä…M$ì‡Q‘×'¬=¼ƒ?pÊì¶*¬Ø.ˆô♵’‹"¼Äg` KF8€ÃìÇ#.áˆa¡Í¨Ê<Û¼e~ÙVD௺Ô;a $¼ÜrÛÊQÙXV’*“ÍÞ8É,l"$Xú€!–è6œÔøÖûŒðæ?U~xËÅŽÖÐ`虣F¡ "NÿÒsòtœd gضËEäfÑ›‹6ñ¥J7Uo” I¶=¾ûÚ;rÝñÈÙw_[6zæøŒCÏôäMŸñÝ0r§„tð3˜oõêw×P ~„èx:æØùþctš­²®‹è(±ýÙg‰MÕo‡½_Uá‚èçxKGYeô“/ž|£@U¶!±sË@oìgöªa{1VU,Ù+4Óv‹2›Å0:ZbLÄ(OJ„¼²ó«¹¦·H„lYƒ¡ê³8«Y8Uæ v˜£Î5¾$ È©]ç˜ðœÉ/±µÂÏôgð”ÔŽá;¬åŒiÎ3ÓEüœ• õ‹¤b3dôÇÕ4¶¦ÆŸ2¦ÑÄ‚œ“Êá) ‰sË­Ý‚3† •¡âÁPWÄÚ–Š“’-¨8áΘÆ•OYÂÚ¦lAÈðøxÿíe®³tƬ­G8Ú%Z8*¼z®Ò8û˜r C¨ì}‡Ù>Cž°îå±ÇïTÁ;»–‡˜Q ˜±„Î"i‘x˜5™†é4¡;äÔ¹+·ï¯ßÛÇÛ¥…Õ¸á·_rÞFAZ¢RõÞÿ!å|#cÀ¢ö…áŒ'½ÎÚwq÷%‰ŽŒs­(‘X~™À|ÍŠuÑÕu¹¼å´˜¡v‰M¥DwÐáìµzÜ•Z›&ekꓟ{>oE¿LLpVÊn³ìŽÃÉÇ¿1ÆbKj›?Ì 0w2Þ¨Kvñø’µZXxV‚ã¿zÎé·"%Æ –dö^«Ø1û¦‡jCœ¤Èײ&ˬã‘ugϹñÃ^…$²yÖµ J³…K%d³Þ%YW+š%f:ÂÙ®™±Á*+f6wÛš=Yè3—®zñ؇³æŒãk»ãmìD/b|à$A–msXÙ­dÏâï_VÄÙŽšbPX1«¨—™ûÁû)Ên@Á*ÏÂ..’Ô?¡;Ø;²ì´åg¤êþáߦá!D~IìmxÞgÆ38“ ¹Æ¸)Pú|¼cÊp¼cLl¼c,‹\[&ãö¯Êà-å˜Æ0Þ1:6Þ1jBCMÇ;í_5Á[šF†ñŽéOÁxµñN®ÜÛìä`?[l“\œp–SJÏI™á˜Lbã'ÆFXáEÏà|¶3Œ³Ä!àX‹µfyÒ§8‡”n|ä±hµÊ™Hö]ÉsܳèTRâ˜ON+ƒ7Öùç8~Q·ÁÎêñÇ‹¾±>àÑSb  ÇKÖ91ùt}Þ3ç7=vÁÑ'Sð|«+Ì.$r¸ßCð¨ç ¬ lpwXЙ9û,rÎ1bÔ™­X¸K9¡Òj®¥Zs¾šîÆ}Ë|UÜ—»qËNk‡© [QeºýÂ;N:iæ¶åÞÐuô©8Ûô$¿ 'rn§¾‹5äcÔV&¦è·ñ±i™ÎâUíðv6,âl¼Èª‹å$C°ö02^Kæ¿8ËD Yë9¥ÜWŠsÿœÕ%¬aÙ•6'êm³9€ìæQ¹Ž±ÚxcÃM6rYy®lÁëî›{d¨0¹:«Ðiq0Ôx¼ËÈís8`tƒwþåh§‡ÊSrÀíC3í“(e`ÜɶßÛ¹1÷3lÌ-ù<ÕöÙ2çSpjì8Q-6£s}lºwAQQß*{îç ÉA¶Èþ«$Nž~ÆÍ óŠ&flð#rì kœÆ)mÀú·í,‰MÜd뙃Jÿ¥lZ#CÄZs"‘üF¦­ÆXg™b¡9µÚÒé:MuDtŒ•mhÀQ=ÎÖ$ŒÀ<ÛF4Ïs¬ r1eÔ¶ÓE«C’×áðäˆ@‹îx©VïzRýÃòg~Æ¡gŠáXÁÉ®Ä_ÐÛTbyÓª©^Å8¸,CR¾7ľG!:…ØA€H¼ª2D¾ý±„‘/è´¼~/AxÃÝOÙ^wxãŸ)±N@ùbmÁô«˜"ÚqãpÀ êæ !S,…¾ ÞÉtp¥º27?X:w ßñaîú±Ú«¡ Õ(âðÞ†àj£º%#[TÂ"éDç{ KgÆÐh¤‡.³z:¤ ó]ÙöÛ´ÉnE7»ÅR†OkL(Oá=’9qPfcË7‡°cµÉýÕ8™KJnˆÇ`“<¼å‰MH}h¤|ÇÕ…C—52W^á‹ts8S”Û]-Vö›ÁTÜǦâI>©ïU •/Kãôm§xžÕÕpJz?t*±¬å0M„£iùÈÃÇlh-Æ9Õ¡>©ï®®î•in)áC½óÃw¬íEV*‹¾h7 {*Ïó[å²€§oÊî»3>Ðg[{}ÿ¤DtûìÛ›…«s~Ñ.Emý·ZØ/dfF}_ÛQ½LwlÇðIÀv4Ã*/ïÈ_Þ8šâx³§Z½´õwfVD³k/r˜t7?/rÌ/è»¶vëÙÜÕ6™NOlå®ýє͡µ¹ïw>Ÿµ?Öý\Ãë;¸'58îxÓ§®<ŸEm†…KŒšûÙÂܶ¶™Ÿºx¶oó}¼Rõ–€U?ç•Ìõçy×~_i»Þ¦eèÝw>Ÿ4’ªlŸ½~yïøzFªHÇHZôBV¸~Öe°Ïü\ôe‹ê0*ùr¦Õêæò?š˜wµ}V™'µ½í»ÁëÙ¾áÈ3Þxµ^ŸA{ìñ&CN=~N=Π­MŸeËèüìü‘ȦxƒMζ¬ ï!‰³38ý,ÓѶ¬mÛ²-{zD±poÄ%þ‰·-Þ5pû.]«a».¼£ çÔþá >ºTø½¼îaàßu¨Skµ ÎýÛ°‰Øã«¯ÿ]¾]?/ùõ?ÏýÁð4Qt®nµP펗{¢noá·Ä¨#(tNM¿ën[ÆÑ.°Ó;~Ûýn';à)(‡ÏˆN9׳b¼}ñ_:ݔ÷ù Cî,3‘‹~ ÷E8À›#E>Cá·Ág|ä¢}úhW®Âµ×WŽ{ÎáÁ«ºb¨Æª€ßâÊ<¦fùÓ„ÊA‰øÅ‰£×ã­i0Påß…é4ë^å»7k%ï7¬ôfsÎd^~~ûxA# endstream endobj 4907 0 obj 7926 endobj 4911 0 obj [263 /XYZ 38.2500000 521.750000 0] endobj 4912 0 obj [263 /XYZ 38.2500000 457.250000 0] endobj 4913 0 obj [263 /XYZ 38.2500000 406.250000 0] endobj 4914 0 obj [263 /XYZ 38.2500000 457.250000 0] endobj 4915 0 obj [263 /XYZ 38.2500000 406.250000 0] endobj 4916 0 obj [263 /XYZ 38.2500000 521.750000 0] endobj 4910 0 obj << /Type /Page /Parent 2 0 R /Contents 4917 0 R /Resources 4919 0 R /Annots 4920 0 R /MediaBox [0 0 595 842] >> endobj 4919 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4920 0 obj [ ] endobj 4917 0 obj << /Length 4918 0 R /Filter /FlateDecode >> stream xœí]K#¹‘¾×¯ÐyÑ$ùúi` 4¦=>3;^ ¦ÛöÁß’’©’˜ù1“Ÿ‚LJ%7<¥RVòŒwüóOÛýýŸ»?üôÿ»ŸÝÏ?½Tû¶®†ÿíŽÿ~¸üBw{÷y×võîço/ßwß_¾¼|9ü÷ûËðÂOþûðé_;½û¯ÃÿÛý寇/qtüƒo/­j??ýì[uøT¿ÿ¿—ÿùÝÇÇéÜb®ÿA×µiÍq S·©Nÿþùó/?ˆ›¥VUk›²ÆîToõîÿûòëa‚qøã«ªoª¶³ðóåäú0¾Qæ“á“vS€ ÍÌ7ã/§—~?¿~Ù¯‹P­®m˜~¾^Ä«µ–RëóWWóâïO«¹Ç_Ó €¹žÕ›åâwY¨xðÿvú&0ã’&ȼiiê<Ùi]¿^îï/JuÓoÆ%œz9ÐÓ» L\-J«ë™'¿W—°Ó׿§Ói þT‡ß…â#àÛé›%xÌ£î@(Õ¿þíê×kòè-zP»eõ—«¼ 6ºº¦˜‹±ˆæ|ýp‰(ïÕT°&÷ç:~! Šy°»|0Ia7A¤oP^ªu7?Ö½[O#f†3 Ëqç¶¿øp…›ÙWå á`??ÉÅ÷R ðþvù` ’ ¦„ø©ÖC½”'&ç}q^®¾f±úfMAïj xj±N~÷¸-E3@Õjf®£$’†‹‡„Aô,Aä4ë}BìõЫߝNß×ãªú«UÞ*{®ˆæbðz䯯|ö/F'àÔjn²“4‡Æ,诤Ï(Ã*Ònå·0N®NI7;Û‰ùiÇr qfãµ/~ꑞ~@ŽD.ÁQ«À,—rI ó0¿@S  ¼ `ëz5½Uªml[Ýb—·úh˜÷u»Sº?,¨˜å§2£+ùÁUu0S >¬\(Ê4*8¸ fUÕÔé0û:z ̪ƒV–ŽlŽ+O„Y<¸$fUë¿mR¿Mw¬”¶]B²9®\(#fáà’˜5‡¯Óaö€ÎÃ'€¾®lBº9­\*#nñè‚ÈÕªéÒ‰Ú×ÑSàVk›nðÓʉZ<¸$fõ-$cȯ£§¾©Ó)QÃÊ1d<¸$fmåÿ`r%ÐyøÐoLBÔžV.•·“ѿČ‚—2|bÙß/¾ÿúòãç~§šÝ×_+;M8üøúíÅÖ»ŽÑëÆì¾þ²ûϪRöO»¯¿½tû®¯]ŸÖ7<©ôDUè‰OTwzböµmºöj WðáôäÓ×LÓ‚£Óã”fXÌ (T-|Òùƒ @¶{k†, ‹3Oî13«¶ÉQ¦­pÖêÒ •pצ·Þ®­F«y ðp·«Ztpu×éúÓéI½7ºSk)^ž4{­N@Ø€}uºÙ õ{ø$Gè´×9àDUû¦=ae 'Æ»®!C š\áuט#Ĥ;ÃÁ’?Aá,ÁÍ@oJë\#Ê18ˆG£N#¡;èXª÷Uo®‘øŽ6œm¥ÇG+V 1 a(³^ÕE …þpëb¬PYUAnØx'Âm¯ßŸv0C'sO>Á'éùyW{;`j”G""°8°ëI20ÞqZxgb1\OüqÏ¥"ÆúgÆ@Š¥! ea(CzXšc™oƒ ÎÉq‘ ¥º#„/#g0éH¸íx!Æ11O.¥‚ŽðÙˆÀúƺýšÕ/òö9šmÒ6µw(yu-­êÕ5ÊW\:¨Fa¥ìz¢àhsOZøÄfI¯»;×Fû¦-_èfŒxœEè¤ÄmÂËDù-ærŒœŸj„w•vn/~³~f4BI¸Á_’–á©cæë}s<¥Ÿiom§Ü­©& ~²rÈ8J>‹KL-½»´¯ôâ21ÓRνhÆ{›   ”ÿBÖÿǬZÖ1Lò§ÃébbÆ(qîó©[( pFzbd¿™¨FÀ”‡À e=ÁçÉIê߬}¶Oè\%YÖ„:ÁŒˆETÏ v„û‹Ú€ËïÏó~=d73EJQdFMIQ3[Vm›í›ÓPÀ´ž¬×#€&”fË|y•fîE© „íâtÈ ›9'ºál îNX¹2+ì»ÞÕÇqJ6‚Âg—DÁ-@óJ¡o0*µý$uØþ»ÖiÊý™ÁáÎ{øzüÃ1sOà<>Á¡"ì4Frž;}Å­ûj1|€O4±6è6ð -‰W:n?âTx§²tÍàô³èÚðù+¨?œ‚ÁÂÛá!›ãtû`¸øŽs®&W¦UeëqÊI&szvã`ÍÚiÈŒh1×4«+Ó·˜ª ØdÃ<¨45"C sQCC4£Þ}P¼»kâ‹’$XopD(I°ü£ôG¨´*üŽèªŸ6Np?²Ÿ¨ïøFí`«„¡Èê÷¹0'«ÂÊ œSÌCài¬ æOq$¼ÌjQý㔡,Kð ð;„}ÌèÐzÜSñÄdr‰+U=,riñÛø0 q@MÄbm¡5óÙûÓ@Ñ..K-×n)ÙɾÞ>4­1Á€±"‹IrÈi}éÊk$qgÖ¶"(kAp?fRÐ!Ö†5Û€oöiÏ`Ï2vLÀ…ºµ†¶Â²›3ÁÚ@”lŸg£Ä%ïEY­ëe*>y>y>)þÉÓøô–!Û,œ§€¸½î<ôF¥R㙼‰b’z§7"Ï8ìS 51®Ð˜ ŸË¸¾RN˜1æš\æ¸6ä™)ív¥] %—ÅkÞ*(7,£Álîq©!4†¶s±„„RÕbü`ï±YPamj0šÈnh˜Ø‡…©®M–ÐÙÜÃ'¼SÂKðÚ2Yߘb0±6Ùl@v9ŽzàSBäBg[õDóHäZ/îûù¤„'›õÑ<¢±‰Àª™â3j!…G£^ÑlÌÀª‰ÌF'ȶ‚±ÀxÞÞP¶Ÿ=ßô²}ÍŽpOá´½weËé©¶gÛ^ˆ †ë.(èžòÚeýunÞ½}ë»,š êRT6¦¼¥§AªlÃYö…׆]ï²=²DÛ&eèÆ¦•G¹8±Æ!Oñt¨%dz“e¢W&*Ó^;W,L" ǬoZ«+¯ÕxÑ –î’?L‚ç.è5×¥µE:}‰wVȶ*¹b†iC›þІª÷*UyÁM5>H’x4Tö ÌûpÒMö^Œ çÁhYߢð̾T­C³“wÄFq/»Æ¸JBN…ä {`ŒYE_¶Á7¯Neptêv‰1fAÞ«+ҳ܉!Ô}™ @EÔ¥ DåC2â4¦±,dÖ/“Et§˜D§ôls7G2“-,‘˜ëQÂ`ø;jBiY›Æ—[5/1äÆÜ1 áØcDúf·&°Á5p›‰ÌöŽ\Wún§úùÀÜpøšözJUíÇ×ôÄ1°z¯'Þ²wñïà¸pïÌ;.þw@Ùà'¼xòæ\ˆÍÞœcz´æVðz*z3§„ÏíG¡y*±z+„^U[¿p5£ª9ƒyv¡ëžjFª^]<êãiã·zçx»7æƒç© tð<øâC®Ú±Ù¹ƒñßÁ´ƒß1˜`ÚÁ°ÎD½*W%d]eï`Ì„ì#ìF"8Ü[ï:“qégª{Œ¸ªNÄTöÿä2âŸW²e×­Äq²è|KÉëëÖgöD™3ƒËÝs:<L.ï®HP'uNNÄ¢3µÞ”Xk¶hjÄU°Ø¸ùáË»A3›œÕ\bTϹ)“iŒò¤Þ¼Ur Ó’ÕÉsuÀ…®Vƒ[ÄàwÆôyã^Zñ$†åa©_É2<ñìçºMr{ ¬d’«3`w¸2¤mY»|à2§½¹‰j쀅áƒO#ô"r–°VÄPxŠ>1E§è)ÛìúII+ eÃ(kâÞL·åº §hGcÚ‚ÊR òq„5cÕb¢•uMˆ$ã‹RJ@I'TdÛ¸µUk»ÁÀNéÿÕ®Õ… !N‰*Ñï4›ŽøT ‰^<|…ÆÔÊøðs•ó·­½žrÃrþ σËù]i~»ïµW.®Îäâ—²åü’y\‹Ü£ÁµÞ!šh SᦠÃ)VÍH¯+Vç±¹ÚÀ8ÎHg„LÜÃ[õQ‘ÍLOÝÊH4[ŠÊ&ÂfÜöí¯¤¬=·™å@2ÂËJÙ2¹bi„([!U@¨¤[ól§< Dmãx´ˆTLÙ$€ÍMÓêf¦žsÂá ]졈dpÙNq ý1ïÈèF„ïÌÂt¥7\Ò*{}Õ¸f½ÆPñD2]¶oéQo"<^é ðëÚxîÈô÷\j.PBXLöà@öO•umÕÄ+4€ýÓXeÙ¼õ Åd›Ì?ºÇ‚¹;qzg_®dëÍ+Öƒ6Ð,½u|¸£+wDÿŸà^é-z¢á;¸'»csOlü;¾ã$N ½Ÿ,î+³Œa aõ.~ßò(bÈÃy †|×{øLI˜^ˆy0¬ñ<îf±<ô¢õòÙ‚O4¤1—â7+¼ [Æ| ®Úˆµ!^G«nÀc€«}Èt |ñ¹·[)È_rïs8øŽ0H7(E˜Ã;Å+ÈÅá0Ü0æð;û!Ζ›?5†„¦^ƒqš‰Gc阕§5çYÅÒVÌúzŸ¬lÑ‘ñ~²j}w‹ÎÎpÌ9¶ç‘øDcò,ÃZЍ^MíFÜÎÅœ,– Ü©¬VP/Öá·ÌE2]ä­«öœÁÃ;%ú¶DzXÈ|iÕ8»9¦_Ë·kaûúˆîö¥ôL$Êm¹>ŠNežáûb–ÙhÞÍ’Ã’^•m<©óL;ã’1­˜ô¶´q™ŠŽ‘P™’2d»ØŽ]žô*€â‚&<J&ŽU·“©7y€Ç &}¤OTÈusS9™DwØ3'eîOß{b“JãgÊè™tFÉ2c’Ê6;÷0AÉ`éß@ƽ´âIÉW¥?H&®÷xž”î&„÷H¦,^6ªóš¸ðŠ®¼s½~Hj—eI‹é­‡ˆûzgÓ#ûñáÚ Ð¡Š 0Ú’U‹©ÿ+¡ƒX¶òi³ÊT™–Çw”Rµ—ÒÛמ\+ÈøglÎõå%Vΰe‰ _Õ™›­vá*˜ˆ %Ñ™ÚHÙxRæ€ s(EÎ<ÓÐWö6óÂô”•õŽG¿Ë K YÔ€.éE½oü-2šÄnUµ¾9ú99”ò'- Ù&­:WŒq’Ú-8Æã}zÂ)Îi-z=¥=÷OlöäòTª×>,„Ý+"p²uÕè¶ožA’6Ö'¦Ÿýú\‘·¬Næ² ,f”O—eFÅŒ5þùy ŠéüS¤šR¤Zå“åáZ)=žUãUÂãIÅX™'Y"ÚqÆzæî?¹Bà%gÆwîNš°*v2¾aàôÙ긔Ñ4ýj6,{Ac9|‘tl¹ŽëKF¨í®)jæNÂ\÷Øl‡Ã{jŸ˜:¹+""E옺¯M6º,Û>1SÙ욃èõвŸ)mCôЦO0Bád§­ò8b$azcÆOà1nD*© ;‘°&ºaŸ>­+uM:q½Úd{õà.n°îÛÀôÑ Ì³yߪ@×?Ü{Žè¥WLÃ(ülßÃÄ2=Ž2tÜX0 tÝÜ ×dSþ„ÓT™ÃØ!’©<ì>Ó¯sŠ,Sm³žÍ÷BÌÿÙ|/ôŽË×XA±zÔC-,¸U®É$ Žá¤+ÄÝ}Æí=ùzJö«?Hi“dÎPÔ’Š.vÉäï’URbÚmM8Ì%¾L~&æ•ëÓ¶bØ]¦ –bó!¬+Û¹dE†ÎjW6{±ÎÍú%Þ¨5œÓ¹KSE/IìánÍ“éþ—Í”¶ø"‡’JT§kÌu£¬,Í↮~p|^kÊ&DJy<=@>¢}ød– ä1X$öó¼°QÊ ÍèÈ;@jäšÏ;¢ñŽ(mÛ·€aÇ×óލnxöÌçîÀÈwÓ…¶½]Æãón­ÒïÖÒµ27àqû…çÝZÏðÞÂ;™Â{Ï»µJ¹Ï¥6ç ‡|wkéº]¦„çÝZ7À·ë÷ð¼[«„¼´§‚õÛº[«©ÆD”îÖjšGK7ys·u> endobj 4925 0 obj << /Type /Annot /Subtype /Link /Rect [328.500000 344 377.250000 350.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 4926 0 obj << /Type /Annot /Subtype /Link /Rect [380.250000 327.500000 429 334.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 4927 0 obj << /Type /Annot /Subtype /Link /Rect [356.250000 311 405 317.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 4928 0 obj << /Type /Annot /Subtype /Link /Rect [121.500000 233.750000 171.750000 240.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps >> endobj 4929 0 obj << /Type /Annot /Subtype /Link /Rect [90.7500000 143 181.500000 149.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://mail-index.netbsd.org/tech-kern/2003/08/11/0001.html) >> >> endobj 4921 0 obj << /Type /Page /Parent 2 0 R /Contents 4930 0 R /Resources 4932 0 R /Annots 4933 0 R /MediaBox [0 0 595 842] >> endobj 4932 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 4933 0 obj [ 4924 0 R 4925 0 R 4926 0 R 4927 0 R 4928 0 R 4929 0 R ] endobj 4930 0 obj << /Length 4931 0 R /Filter /FlateDecode >> stream xœí]I¯ì6vÞß_Që]I@ÀÏï9@ È¢‘EàŽ4®qz‘¿Ÿ*‰ª’(}TñèpŠ1:®+Y"uæ™ßýóÏÿqù¯¿_¾ûáçÿ¹üªÿýÃÏŵ©Šáÿ.÷þ4½ Û«þ}iÚêòëï\þøøéã§Ûÿÿãcxàçþõöëÿ.òò/·ÿýõòç¿]ü‹þîÿÁïhnÿþìÿÝ5âö«xüû~ý¿?þí.»¿q\Nofþ÷ŸdU«²¼occé?>ÆÏý?ÿõoß p[¥²nÛ‹(Uy])/ÿûŸ¿Ý__\»Rˆ¦.›bÏB¼¯Ô”ê"dw{ÓíæBý?L¯÷ðòNI/ïwΡja;#rU! ¥øA4y½‡—‹Êr‡³CE#×òvNäJ©Y«j<@èñvà—Mçñå÷seD-|ùíAÑÕEÓ–ð÷té…¨FèÕnÚªÿ[ÞÔRÝÕãÕñB3ýO?GïŠì·É6D#«²»­ Ï·ñе·/m§V•^}ú«œîcíYs?»Á2¬Ž›\÷$%¿O/¬Ai¶ðŸ»Ð%&_«îð™]x®ÚTàzÝ?øi¾i'ÖäEÝ.Í·Ó–óe—ß·!õoP™.ûXíþƒ ë@ÿ}v} *ý&öö©i4p†S­žÛo§áN3‚ÞÇôë§ËâëývfobË æ*Ó |`1 ÿûpÁ.ý6ˆäâ©¶znov½6hu¸POŸøoÚ/pžru¾«›6ñüQOv#çû†Q¿ sÑ^y‘—¹ZÂhºì¥{l œþïz$×ñד§ûhÁ1áÞ)åÜ×è0ÝÄòB=ÝÕÚ›ø4 ,6“Nž@6"Hˤm(M~b—‹ÃºÖd­vdg×ëþÁOóM»ÅO)Ú'º&//o_Ð/;ù1ÙÏüIÀV7Wëå;4Öa?8K¨ Ë"´íå¥Ãƒ$ Obn5÷ìG3ùì)8ýõ“eW.L‰wõM|ÐÑÈ«ÌDt $ ²e.à2±O)M.~¸•s"_¯û?Í7í—-JÛQb¾ìòoÍíýoP™.ûXíþƒ ë@Ÿ •-¨Höv2ÑœáÇ\Ę4-µ‚fN3‚ÞÇôë§Ëâëóï¦XfÈ0W™^à‹}-[\á"WÉÅSJ®› Êðûõ…zúÄ'xÓ~Sƒ]Õã&ž?¦»‘ó¿}è߄¹h/‡<ƒÈÀË\ -a4]vÒ½ 6Nÿ÷èú?~=)|º†î­íÔæ&–f»Z{?Ô€ÅfÒÉÈFi™´ ¥éÂOìrqX]š¬U®“l=OÞü4ß´_ütæv:cÙåßšó;ÆØñ*ÝVë;Ö>—4[Pé7°·—¥zà ? Ê4.f@˜lÂr}.öÔ tæ¨1› #_°13È$W(ͶñD2ÛÕb=ÇS #¦/ÔÓ'>Á›öË$eTß.Ìùmù·œáyœéêE{áä6Bæ2i Fb=6`v'×Í@Õÿ=¦Ã¿ž„>Ïíð§™ÂBïC­T[®b‚#Y¸€Î 5æb3!å V#f´Lr…’0²bk4Ä×aUJQê6¥jÙ„¹»Qiòz/WuåïåýÎÙ¡¢{¬,oçDn)š@²è<€èñzð¯¥Gäö;g‡ÊˆÜÅÛry ÞÊp4gÿayðË/ßýØ]D}ùå·ÛÎú‡ýòûGyûãÞ­[¨Ë/¹ücQ¨æŸ.¿üõ£»6uuÃB¿¿áŽìú;íµíŠùBÂ;?ôwÊk©†þ÷ÇŸŠp§íïܤjY·Íl¼£ßö–Š}†åõ5|[ã.ü6ÙÂgÀ·ìÂ@ O˜RÄð¡®J¶âvk¥P>Â0ü¶–áÓ„ˆ‰Ê‚ì×éÜB%57(ϰÐÒ+$N€\Š¡DZç[§é~ò $HQ¸³‘\Xaf¾ôÛ/7õæG3U…4T“#±ÂB>®Ã›ýb¾ãªµåKX¸C GH¿³S6?(<ì Ò1Ž-:‹b©°‚Ë¢i¿7?Kã¯P6Ôµe³¦Š²ØšŽƒÄ‹?ß9–!Ä¢ YYÛ0µ†!¼³À†Õµ•©³äJbj‚|&q*ÞÁ*b†Å€'è’ Ö\]\ëFÜ?õygXGT×¢Ss|ß6h!Ç[¯ì`h÷lÈì'£ oë®Ê|¾ÍO´ÈeSÔ-ÀBRèËç¯ÖòÚˆ}ýì%”¶Üt GI¹-U HN2†kpëôñ ð).›Ê¥(Ñ݇ΩNsewí÷9Ãl‹îhÐ{d):cŸ¥"H^k+Bp^JO ‚Í ÛS~ÙRuÕ!ز”¥¹ÏèáF‰¹ØÇÂôL M’¦;>‘ ü.‚o$ׇ•âç¡ÄÇ" Ì%ÊCá °i¿Rª®jƒ:$”RÅtÇ"¿¶$ÛÚÛJøL’ô>+Úà0Š+…Ýe‚[d‘†X¶b)…Ù3K‡2y£Ø‡2£ B8¥)íþ%šk)€¾z%°G#ˆB- W(ªå÷Pì*(ªkx§!<óÅ7ÑQ˜TC)Ap( °%Ÿž=FÑ%¬ìÚ™Ù—y¤äíyS«å·¡Ñò ©GÅð£»QÇ+)t6`íÎ7÷u¼C184_½¶NëXÞF0î-w0æ0`ÌÁ/ÅpS„½a¸)6-óŸuÕ6á ySV„·h ï€Då7%¤XL/ª ‡ÇV”;ðˆ¿[«.ÿRÂËËr·€Üù‡",ò…W"`‹c)ÞA(Í@Ë–g %Z¾‡À ØÞÀø©0 Ü0õ*ŒÓ@2[Aešz4Z| ¸j%7)Ä'¬o#Ùp!-޶í÷ž~šv5AÚÄ—ÒA%G÷‚¾Çx¤À k§øzS¶j¡²¤l°%Œ¹ö´œ}^š…»iW0Ù<$ZCø~[‰å ÆöXí€cÆÍ(Ò'„)•ÅKÆw(Vß–%D‡vE·m7²ÙåE®]=†7t f-ƒEÉzá ºCÓ ü§œH>IW’—6p¿ &emõ”ÁF*!¥P•õ˜²B`™Ì•Õ8‚-~¢‚whi(ÒãD3¡-ԒІý”<¡å ?CI:àA;UAÀ.lÀwÃDNá¡ xXa¨‘e@Q€„H{Ýj³`ß;©”…“öbEqÒ ‰×èŽf¥ê*^ì÷„gJøL‡žÑˆ¿Û^fç ü‰žÑè]ÛÁÀ0¢µŒi]8­#:—p«¯JHC5~ë „Ü\ÕÂ"ëð~© ~ißïþ¦kMŽiGÓg8^m¾_á·Ágt¾ùöm‹„$¼c¡¨…—/H” ÷†)¿MÁ`zUP:ág’µ»_Ucƒ¦<}“&K´Õ!ÆŽ‹« 3Çqð.Ø1Á Ÿ™þ ʤþèDåÐÒa‘T”sÒ·R>óÎ…©LN+ä)í¾,§²P:ƒy‡œ¤á¶§øÎ>eLÛ(¯ÝùŠ´–ÂÚ?3A(Soâ;ñæ›qTŽ“ ž}f|Nœ,JÓê Œ!¾B;8̱ÿÂR6ìPm‘);˜e5DxT-§/õ%zF'€± Ê«¯¦û$Ûœ=QÕ<´™¾fXÃo[æóÚ3ÃzÇB诩*w­vÖ ˆq·èø¶Â»G¥ÉðqÂo)Ýõ™Ö>-õ‘<Ì“ˆ'gÖcG «4‚‚LGq%à¢qXÅXPÆô-FÅa£ûy`Þ^y‹ Â; "êQ³•0h:f¶.€]Ü“¹C,N¯ÚL1’ª4)ºfðŒ[KsftöÁMZ<U`Lø`»Wâl»3 ûf~UDÓžK)IœÏ;‚¢¥d÷=ç4³3”¡ì Å3÷;Cf7+%i•¡$!ÏÆEöŽböOê£Uq–YRAÎMõ:•I4†" F¯ÙáñD|gŠZÒö” Æ÷o¢YO”܃ $$-x‡×í)!‚1òŸŠÐMê BI Ú‚G¨Žrü#¢+U˜tÊ.>I >ÅÚ„×[I¯_°x&e,|nŽ-ÊqÚLmΔÙQ´ò ^ç$-]áò>·obèuc'ÍDÐãϦf´ïsþ"¸Ô=tþ"sEËî†tÌù‹WÌ㜿Èù‹Ãèy¨ØKØ¥ýÅl™‡[£ˆ¸ÏÑ$Mcê¡0àgÑT¼çT%z±Œ& s@1Óxçó$G\á|ýv<§ûúžÇ„ò½éô7ÛfiÎCf“§Ã¤ÖÓ—âÖ‘ÂLL–b`‡)¨ÆAÄÃGƒ ˆ:jk}Ùu¦ÄóÛ”p’û±Ç¦YdÁ.s¨¾âõßI±™PÅSÑ*R‚œC˜ƒ¯îÔ`jø-´, U)^rÇ3G5rT#qáàÍ­…ˆ<‚$¹èèêŸTt8Ö°Y°ä³TRšá¿C¹i¤®üCžø“ýcœE[Êe§¯ œ‹ÈeéD{”N$^. |e\øŠ.Ée9MG36ršÎ—[sÄ4×r@}èÜSæ à¾vÎÓBôå<]x»ñÐuJ!"/ÔÙ¦0E6Ø<âNÖ­»cÊÃÜ!’õr ±¯´Ïm¹Ãq¥Ø°6ÍìÄCiŸ¢¯ã¼^M®>$j¦\}˜}çêCzõa£LÍŠÂNY="ÓŒůøÈ‹¹bñÅX^˜RéÁe ×áuX hÎúÿ%…Ø>;ÀrÆÑëᙃ7Pwõ¸½ÀqGhóúž¹˜í¹†b¶}–Z.9 i½WEgÈ*Þ\ä±¼§èFjVÞ#u„¬Ó2RŒÁÆQ¼é81fM”¢â£- C|è½w×~㳯jÑ?SÃg¾'<ã]œ¶ucŠSJ³ïA…Éžðç—6»²4qÑ‘iÓëÁÊä!Š1;|›(ÆĦUá$x6{¶œÈ˜Gí„:¶ ¯ãt§D&a$Ä¥Nà7PÊI\ÌÖ#s“©KÚÐ#ÙáØ¸ÆáIÌ,±b©¡[yµI ÀÔˆm§íô¡Œh’õP®-Å;ÛIÚ)Â~Óö¤Ì!)Å›q?ö¹†ï¢i=ê·ZÊ—õÛÁPfñ-ãöëg9´ZXÊéYÓÖ.ÎZ4[&VK1ޏ€-Ô»š–1Ìû¢"pG]“¥¾ËAJp¨zÉ”+ù#”݉R18Ìb Ÿ/e*‰&ƒºX(QBÒÙš¡"£ªM† í*òôø‡Š„¾] šäa;hÁmAÂ;ö;—ª0™›b9`ƒ—²!KY‚}ÑE„…ž ð£‰{›Þ%2”’D%f£˜/˜x)…h,ý¿»‰5sNªHËV,&ÿš¯UX³6\—B3Ç÷<ø˜2Iä/¨ƒ’7¡ ‰ÎUýX3Oi~ÅTËSšy’†éLœž÷)‡ e0õY$å1Û8£å<ÏQw”[¨’L/ç©Ý¯Øyjwò ÐCS©Fó<ð¤wžží =Ioíûò¼»Xò)D¨äÞ:àÐoŸ³‹ @‡2h=N‹ÎÐyxšEÄÇ#Ûìļ‘ã–@ËC»SöÒíoó:©XGvOÒŠ¦=DÈ¥k¡BÉE)¯¬“ð°‹ÕG‰ÀD¥D€³yí4¶È¹ÊL|Vè4¥!ØUÀ’r¸ïÑè¡*ºq4‹`¶Ä/d Ö9~€‘&¤ƒ|`G¼…}^*ž˜Š01aÕ—dŸp˜Ü9†ÉžF݈6ލ6ŽîËjiÿÐ~ˆ%ÜÙã±»ÞŸ¿Ï]øüøÙ¢ý(Öû Ūí¡-ÇSyrÛÃNý²55€ËÙÊñûÜ‘’‘NP3‰ÜáÖñdê³ÈÐÜ‘"rCDJvsnˆ°Û¹!âð 5š ìRܹÀ.Ø%P©”Ëàâ—Á…™<`ɧÏîQšaÀ\ —•~.Ð#n)7÷¤ìeäf›¤}ŸGF´…©ísÛun»Î Ù òieûÇ“ýóž Bu¦;:sƒ‚7óù” !¢?µØÖ‹‡lP %oñ™@ØMÂë°jsßÕ/‡4JÎUâ‘ßUÛü~¨R“¤[R4úâWÆ?$÷ý:"˜û`ü¶½yûF! ùŸÛ7’r _n߸!²Ç£Û7ÔìB”ö eW¸ön<‡ã,¦`ÇJ´íãÈÌÜE‘’Ýö8K Å`N\‡kèÐGò>åËY„vnèxÃ†Ž“ˆãÜOa“ÑÌÂ)µyönŒ³|¶k4…©$s‰VŠb9Û.1m—“Õ2÷PRÞÓ—y4cñ]€øIWì:ýí‹,}ö{”­‰¢ ç÷Æô©Ž`íÆ ê¹×·¹Y”ÍF¯Þ]Ñj0¯Š •­"™-秘»:¶Î®( m†CÂ/‹×ã}²0±ˆòPRø½Ë-:µ03s¹Å>;:N¹Å‘=k]n!Šzv%F½E¿‡9y+¸èT·-EÑI´ìÔcÍ\Š‘púÚfä©Òó•b<åËYÄù1Ó¹cŸ´:‡|É¥69‘K1 Rîmò_ŠQu¦žÇô¼Ž™\’&¯FS®É5 û˜=D§ì¶aøÊTÒ„G®¼HÀ¸Í•û0™+/v©6KàŒ·’;×J¼w­D]šú8×JäZ‰$äæ{×J´úTå‰a˜k%öY¾‘FSÜyÇcU"—âkµÚ¦cúd37ËÀ»lZã£Oˆo(©ÃÒäÑe8©3ˆµ×€dèd÷·ä`éžV4I)§ÄX'¤Yb6žVÃé¸/©lRÇ&¡ßtNÝÇÌñ +6.ç„°‹µdñV8êÆHÕ¼£¼Õ$Ý ÈªŠHâÍ¡Âãuº#Íéò®úD!MwÕwFÀÁú‰ÕùBª«gîÉÚ$JÌU,Óä(c"ЧܗÕáiä¥o£ÐŽKZÇÁM!"¥PŒ§Á¡x•rt.~†`…yŽkX€7ûú´DНS[6C3ãD[²äçBU1æÜŠ÷ÔZ|sà>ÖyI&+}šÊÅ»wPƯ×X%fíú°ŸAX©*C¯~ò-ïd2 ©ñ23Åãn}Ól‰BŒÔ“`D(TŸ…®Äï‰=Ç+Ài]KÍÈÚr¶½Â¡®L$ó6v„:BÏ!Oqæyå8áàgK;w(+Ú <­æ¼±ñý_€XrSmïîm,æ½Qxùœv‚XcÝF9p$½“挧C|¯ˆ„CÔ̇M`"ÁA¹× h(7Ýí0â›ÔqÁÒÿ¢ƒ€+§jèó6ªkÑ©¹Áþõà9Þ eö‘Ƽ â9ýêdÆ$¥>̲BP¤jY‹g–,îતÀò:о~YóQNQp1üCÆ‹Ûky}¹E¦‚u†:)ôëp!N>±V.äsU­GsD£2—I u¶NÊìû[×áõãÓö:b,4z¨¾ |ýýÄ‚C—eu(Yí¶¥øçSí,GBŒ—Ì”Oá+Lé;õ»¶p Á{”¢/Þùš¤C yun£èiG‰Ð¦@Š«óº6„ tŒ' }óº]”ùÜšt(Cé˜MHž÷pÕ0ôÊñÙ^-„¡sy«]y­âò<,•wÍP’%ËfŽ–µJ9\‘ëî4N×îHtGsåÚ3ßÐÕ„U]'+Ù ¨Üá‹ß& x”pAñØ>"aüŒa ýâuÁWâg*ˆL}5ºSBú‰a%U`ÊV˜·¢Ë E KE XÞ;¤K’ìƒÕ–€“T”ߨ îZiÎ(e`ÎÀß2ÏXv ¿´ú†Ïx9CAYŽá&ð3ØRÃ|±M±-]"Ö–·aJ¤Ø¹± 1ÅCX0GÀB™¶‘ÄR]3g¥µBJ k¿²%@{Ä3Ÿ.PÇéf¡K”ñB\{…|ß¡Ô.yè§›e²oLòõcÖpR‡û`*I?³=úäÎx=ßµzôÉÝd\ˆ1údLÉ=…I/༡šR‹Í\Îæp´7å|BIy°¤9ëá8G›yVuÊd‡× j1E[Æ£q M ì8PK¥ÃybSžØabS¨áä5ˆ#¾òYÅ\(iê$ý˜4ÞõƒÄ|Ëê±*ŽáH(ŒYá|¢%Ê„c¤8‡³†8‚LˆÎáÈ®%:GÈR"zÇ.)Ù*A¶DÑñŒB|в7H£º0 ÏÔÝæN-ß ¿g[“κdZ¶@”7W„i‡”qÀ:8“=[e¡J‡Boa瓹Ášµž…Â%вk,‘r'õ |Ù¶ÛšŽí¸ÑíýTE³¹ŸÓY‡X7Q¤âÛØëZŒVNMÝn¬d½ Ålµ%@IÁ¬6J Ä)¥æƒ‚’ÏAðz²E™¶Í”€E™°½†EY•±ºiX”u¹ƒOÞG7),Ë1]î(¨µBÖäW­:4U„Š3½UÔ…<4UÄ·cƒQ,뗞͟‰…¸ÃïzÂé·.ÜXÚÊñ?mý/dxÛÕÓÇ„ºÞHì¶Ã‹|Xƒå·–Šöݬ¤m+N^åP,±€v½¼£%¡¼êYh;ÀÕF+먭1k{ûQ):Ö¹–Ï-p³Búâ5©ã(\\²ò¿ >£ eáôéÍ“l©wÿ}Ûñ¸óoh-íºº‘†$mº—/Ssú+ÿ©…ä F´Ã5y=®7Ã{„$gù.¼N»áM¡®ZXìżœLhÛ”ˆ?]~úø ŠÒ endstream endobj 4931 0 obj 9049 endobj 4935 0 obj [265 /XYZ 38.2500000 215 0] endobj 4936 0 obj [265 /XYZ 38.2500000 421.250000 0] endobj 4937 0 obj [265 /XYZ 38.2500000 421.250000 0] endobj 4938 0 obj [265 /XYZ 38.2500000 215 0] endobj 4939 0 obj << /Type /Annot /Subtype /Link /Rect [451.500000 645.500000 528 652.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compiling_dynamic >> endobj 4940 0 obj << /Type /Annot /Subtype /Link /Rect [406.500000 625.250000 489.750000 632 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_primitive_type_mappings >> endobj 4941 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 617.750000 549.750000 632 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps >> endobj 4942 0 obj << /Type /Annot /Subtype /Link /Rect [225 379.250000 267 386 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 4943 0 obj << /Type /Annot /Subtype /Link /Rect [516 338.750000 545.250000 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 4944 0 obj << /Type /Annot /Subtype /Link /Rect [172.500000 331.250000 225.750000 338 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types >> endobj 4945 0 obj << /Type /Annot /Subtype /Link /Rect [447.750000 311 511.500000 317.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap >> endobj 4946 0 obj << /Type /Annot /Subtype /Link /Rect [333 290.750000 468.750000 297.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 4947 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 263 532.500000 277.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 4948 0 obj << /Type /Annot /Subtype /Link /Rect [390 229.250000 435 236 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 4949 0 obj << /Type /Annot /Subtype /Link /Rect [296.250000 192.500000 365.250000 199.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 4950 0 obj << /Type /Annot /Subtype /Link /Rect [152.250000 158.750000 196.500000 165.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 4951 0 obj << /Type /Annot /Subtype /Link /Rect [222.750000 128.750000 262.500000 135.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4952 0 obj << /Type /Annot /Subtype /Link /Rect [391.500000 107.750000 431.250000 114.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4934 0 obj << /Type /Page /Parent 2 0 R /Contents 4953 0 R /Resources 4955 0 R /Annots 4956 0 R /MediaBox [0 0 595 842] >> endobj 4955 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1701 1701 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 4956 0 obj [ 4939 0 R 4940 0 R 4941 0 R 4942 0 R 4943 0 R 4944 0 R 4945 0 R 4946 0 R 4947 0 R 4948 0 R 4949 0 R 4950 0 R 4951 0 R 4952 0 R ] endobj 4953 0 obj << /Length 4954 0 R /Filter /FlateDecode >> stream xœí}]Ïä8nîýû+ê:À¾[úð‡€àÓÝÓÈE€Á ‹E.‚Ýì ÛA&¹Èß?U–lK´(Û4%ÛUNc3Õª.‹~HI|(ŠúãÿýõßnÿïnüúëÝþìþûõ×ûgSÝíÿÝžþà7ÈöÓ}¾5muûóßo¿üòñËãÿÿþaðë×~|úß›¼ýÓã»ýé_qÿèù~|4¢yü÷ïÝM#Ÿîßíÿññ/ÿpûÏçûîœ0áßÿ «F‰NŒ™®ÿè_StþçÏÿùñG Àº^*¡ku¿ ­ôM-oÿýï}tÐ?þþi´M­›û–ŽÙõTW7!Íý¦îzÒQ÷‡çñ"ÃÃMÝæ{x'9;*BÕ"ýôÇ/…©ïM«ÑÏ~ßò1`*ñ°wûÁõû°ïÚÔý_@{ÓýâïýOŸCá¯^ÿ¢‘•6ÎÐÏaÿÃhÕMÕwÓ‰£›ÚõçªFQâ¿…òÐñ°Ýb½xíŒxÄaÿá·Çp±c:Û¤ ὦôä·«G'BŠñÓ(†ô‹>j£¾äMÖ*.V­0ÓåI'ÿç­vúü{nÈzEý°ŸæQò;µ¼!eäé?Âög'R)Ø ¡@±GmEH…VåwbõöÃû¤|Ÿ!-ÊéKEÄÈ PÏ !T`ÛP·›FœªÀPë:“iåø)>1…?ÞŠI5B €@‰Z“ß ¹¢íü@9 Å»óÛóÁæ´ôÃ~š*dPñ&hZyú°ýÙ‰º7ã'D Ø£¶"¤Eµ`°ùÒL|¶šÑ¢Àæ´§#b䆭WÖûi(¿ãQÓ[R÷6ŠPÐÞ™“Ñã'D Ø£¶"dBÃò;±ðxÒL”/žá3¬%°9홈ÙasÊúa?Í4hzB&63ÿÛUÇ ªñ"P¼}B50,¯“ž:Ùàk4|T~Øœöꈹaë•õÃ~šÊïxÔ4©+È\<l)DØ0 Z Ó5l¥{­&ðÞÖ ûiƒOßeø÷lhuRÀÞ:ÞÇŽP†#xó¸tO4ÉÅ[:DÂ߇TH»ä’¡ ›™] $C\ºŽ½Oi+>›I"ä4¤"ýócWAÈåbÐXûEô·™¢Øqd?ù¢œ4€éÆý˜ÄóÍó邎ßXrìQ¬9Äû X#B¡&m›‡ÆŠÕÈÅ?,&mÜ&­ÿ6@¹Ô'߸j50ž (¿ÿiC`åšÑxRx9}éHÿü…8†6M×ñD›\T£Ã$lðý==i€rµœ™Ð†ü§[\¼þ§ ±>Jâåôe"ýg@(Tˆ#cóÐXI 6¹X…Å$h;±^}Øåª8ª yOokÐÿ´!0öšÑ†Rx9}Õ‘þù q¼kš®ã‰6¹˜DÛ@&ÑŒXÏ>lm³è6ò.oÄzŒæ°ûHƒ'gø¤|hY)`ocG(Ãò®y\lÇMr±Š‘°Á÷ Ò®¹d(èVÞ÷t§©GÇþ§À´ŸÍ¤ê5¤¦ýgÀ$®‚€wÅ qö‹èo3«°ãÈ~ò@9iÓû1ï ç›ÇÓ-4¿!°äØ£8êuï'àcŒ…š°¼k'T#°˜´q›´^}ØåRŸ|ãªÕÀxZ0 ¼o# •kFãIàÕëKOûÏ€Pˆå]óÐØŽ'Úäâ&aƒïùéI”«åDÈ„6ä=Ýá2öiŒÝðÙP ¯^_fÚ„B…XÞ5“j“‹GXL‚†±ëÕ‡ P®Š¡Ø©B\êdC`ì5£ %ðêõUOûÏ€Pˆå]óÐØŽ'ÚdbÏñ˜„ñ}A1i5!³° [y—4#@þÃì~Ò =9Ã'eDKÅzëx;:@ŽwÍãÒu<Ñ$«°ˆ„ ¾W¨v=È%CA7ó. $C\ºŽÇO20mÅg3I„T´;KÄØ1‰« ä]1h¬ý"úÛÊ*Ü8²Ÿ|PNÀtã~ÌÇ»‚ùæùt;ž4C=ú(V„TªŸ€1"jÂñ®yh¬PL<ÂaÒÆmÒzõa”K}ò«VãiÁ€òûŸ4:l5£ñ¤ðRÑî,cG(Äñ®yhºŽ'Údâ“°Á÷üô¤ÊÕr"dBòŸ®`ÿ“»á³¡$^*Ú%bü… q¼k+ Ô&p˜ c'Ö« \'B5°!ïé ö?it>*#^*Ú%bì…8Þ5M×ñD›\LB È$¼#lÖ³FA`jz o=ïòßù¯$è~ÚàÉ>)#Z°·çßùÑÊp¼k—®ã‰&¹XE‡HØà{… i׃\2t3彩dˆK×±÷)0mÅg3I„œ†T¤~Lâ*yW k¿ˆþ6³ ;Žì'ß”“0ݸóñ®`¾y>ÝBÐBÃñKŽ=Š!§“x?~;'B¡&ƊÕÈÅ#,&mÜ&­W6@¹Ô'߸j50ž (¿ÿiC`åšÑxRx9}éHÿü…8Þ5M×ñD›\<¢Ã$lð=?=i€rµœ™Ð†ü§[\¼þ§ ±>Jâåôe"ýg@(Tˆã]óÐXI 6¹x„Å$h;±^}Øåª8ª yOïp©“ ±×Œ6”ÂË髎ôÏPˆã]óÐ(Ó&“°‡®ƒß“†QP˜EäÜÙzÞÕÄËy¨Ô¥ˆ4„•4‚¿gC«Ñ‘Þ:ÆŽP†ã]ó¸ õYMr± WJÄoð½B…´ëA. º™w5B2Ä¥ëØûJf°ÙL¡FǺ³DŒ“¸ BÞƒ`a3Ë%ÔÀ*‚ŠrÒ¦÷c>ÞÌ7ϧ7 ÔD¤!^ƒo jt¢Ÿ€1"jÂñ®yh†’+|æâÓyDpê¿™4@¹Ô'߸j50ž (¿ÿi(„Ág<)¼ëÎ1v„€Bf(²ÂfCmPGüõ¤ÊÕr"dBòŸÞ€‘Pó‚͆’x5:Ö%bü… q¼kš¡ž Ÿ ™ `4ŒX¯>l€rUœÕÀ†¼§7 VD¤”·à³¡^Žug‰;B@!ŽwÍC3”Ná[Ë|âPA&êjÀ†QPP9Â6lå]㋇bP."ÒV¶þž -SGzëx;:@ŽwÍãÒT1Mr±Š¦‚¬"^W´ëA. º™w™!âÒuì}u-Øl&‰©cÝY"ÆŽI\!ïŠAÓT ýmfM5° PW6€éÆý˜wóÍóéÔŠˆ4ÄëZðM8!B¦Nôð1F„BM8Þ5MSÅÔÈÅ#š òPW6@¹Ô'߸j50ž (¿ÿi¨kÁg<)¼LëÎ1v„€B¦©bÚäâMy¨« \-'B&´!ÿéÔŠˆ4€ºl6”ÄËÔ±î,ãG(Tˆã]óÐ4UL›\<¢© u5`”«âD¨6ä=Ý€Z‘PׂφRx™:Ö%bì…8Þ5MSÅ´ÉÅ$ ¬a@] Ø0 *G؆¼K‹x] -@¹ˆHCXÙ"ø{.´¬°·Ž‡±£”ay×<.¶ã‰&¹X…U#üNçÔÕèå’¡ [yW`@ÞÓ¦ûŸ@] 6›I!ÔkHMûÏ€I\ïŠAãìÑßfVa†ªYtÎ}¼®F/PÅ‚I5¾;¨«á h¡áø ñº|N€P¯“x?cD(Ô„å]óÐ8 ¹x„u"üN¬W¯«ÑË¥>ùÆU«ñ´`@yýG@] >ãIàÕëKOûÏ€Pˆå]óÐØŽ'ÚäâÖ‰L¦óêãu5z¹ZN„LhCÞÓ.cÿ‘Pׂ͆Rxõú2Óþs *Äò®yhœ$P›\<ÂÀ:~'Ö«×Õèåª8ª ™*Ä¥N6€º|6”À«×W=í?B@!–wÍCc;žh“‰Iha “u5`Ã((¨a¶ò. —ºÇ»ÇÛRYaò»zë;,@ Žp­ÅE˜˜B™È…Å'lðC…´ëA. º™~)È»…=;Ž4ô|h³é$¡ 5¤üŽùÁˆcò®yh„I¨q+ÇpƒË~òÝA9i“û1 Sý h3 Ú;Ú>ý„Є:©ðŽ9¡ Uàè×Zh„‰i“‰\8„Ú¸iZW?^l£—K}ò ¶V÷6ÔÆ‡—ß?ÞÞ³£í6”*Ô—ö;æ‡h±°µÐS*ǰ… ¾W¨' P®–/ãLÉl€‹×?ÞÞ“¤Í¦”*Ô—ñ;ÎM¨ GÆÖB#LL©LTÃ!4ŒXÇ?^z£—«âÄ«îMÉTQ\êEí=WÚnJ) B}Õ~ÇüÐM8N¶abJå¢Á1k¿]ö½%tpF>ú¨íD­’@p!ñ ÞîS÷!7ZÁ…–Òë=7V½†m[‹,·b•ÍÅMÂr!^»þ¾ê ?bb`o•…7ÜêhCO¢6ÛÓ„B})¿ÿܽ„\n(¤Ëvò4ÔËp–ÓñP HRq"Ty€ô’€»‰ãí€YmŸ¨¢Û›ñþóáåÔãÞZ `SòiJ¼ˆ†íIJP"{ϳ†ÕƇž/ ÞÞӭ통¯P{Úï?7^½–ë[ ,ã²Ý¾î/°á¬ª£ |(ö(òWI ¸©xA{ÏÁ6Û×¼Bí¿ÿìx9-9*¸(Xâ…Á¾LlÖDGö¬AÒ@ xûfFhíËTQxêEí=1Ûn_ ð µWûýçÆ«×’ã‡k‚å_ÖGŸÙÄ+sèJ÷”¡¥'tp–?ú¨íü°Ñ@žF÷…ÁÛCë>äFË—bè´#Š™±ê5äøáZ”`Y«l.ö–5ñÚ5 U_ {?l4(PßSŒHCÏÏ6ÛÓ„B})¿ÿܽ„üp(¤PÌvòdÔõp–ÓÑPµHRq"Ty€ô’H´ˆm퀟mŸ¨¢…ªðþóáåÔãøáZ `-SòyM¼Ø‡íÄò PÊ{?´†ÕƇž/ ÞÞó³í†µ¯P{Úï?7^½–?\ ,7³Ý¾^/⬪ã Ì(ö(~Øh P' ÞÞó³Íöµ¯P{Æï?;^NKŽ® –¢a°/›µßÑ=]¨@ P¼}3?´öeª(<õ¢öžŸm·¯x…Ú«ýþsãÕkÉñõ@Á251û2Zˆ¦ÖÍý&üÎÿè·%ŸOèþÿƒ¬%ªÛŸ|4òV‰Çß‘æ~«šÛÿû£—_Æ~º?•l…¬:ùÜ7²û¦ýlͽ¿ií7Cƒ¸cÿTØúºn›à!ºûFjÕT÷M…þ¦Aû©Qa¿rö“xú>Ò OÃ!Fû‘-*Š®…„~ЧI+›ýÊkNL¼ºf}õ„’qPàk$‚Š¤Ð±GÚýF~‡˜ÃY`ÿ±KŸ°sT=øÓ¦¯^ÊðQ•’¦àå/¨mÇ?ÿöXÞ¶­LB‹;²85•]œL¾”ùì¤ 4-Ðo$úB¿1Ø7U‹}£qÙ¾£ßüŒ>M£¿A¿Q(wT‚û´ôMï?­—­Be“8n¨æ*þŠ~ƒký†ò>wT§ Gý@ßÇM1DQ©ñ~îßÐoÐQ‚[.¯àè¨j½Å'Æþ4Q\6QftÐY Û¸âcA6ëg$ÜB(²)|üfK‰â–˜Gq;ÀG=kf©ç-²¾7¢™}ïë›ë›ë›ë›ssd=!ÁÇÁ%¨/Å»Šã¸)Ô÷ ø+‰u÷̬…„OM±ø/ýU¿ßØ$ðCÜë“87Â1 X¹¤üÖน‚ÖWU¬/ÁP¬pÝãzdž­xY6a›Ym\v@Œ4ÆÜág”F¿ÝŒÂi#Í(׊zû7j©ý‘§r‹‰¢ØÀ­íæÈbqÚ‚ÖÓ*ñvÚbŽ—ÔVµ`mx1m€Ñ—Ôpm¶x3§ôóþêŘ…Tè®÷þ£Vá³PIŸ§mgu’µoãK¿ÚxÞŸ‡%VÔSæv›7ÁÝÌ}Ëžþû¬›û³bëæÛ¬G~ÓcxFnÙ©#á‹"’Àï‡5sëöRÆ*†CHêW¯ésOÏ— —ÚulðCVÙ‹¤àç5çHÇ·ð~pÙö:ñøÍäФèòS-åà2>ª)I8!KY"‹ÇÄâcbâTàÚÀe\~Ž81ñásÍuv]Žò/ŽÏ¸\¸8â”Ä2ð §AÀ— |" 8€·ˆtîÇmRvãÛz‘\¸÷Ö¸ÉÖ× s]óE¨?ŠÄ¤ÜŠX6üÄòá'„„Îi‚¼íÏÈv³‰ß ÎÕ”ßáÂâ–L`qkøã ¥K6,XÃZc]L½³ÙÎd»Z´Ïê§Ji¿åï¿/\ÔÉFaÞM8Õ”ª"_ |v¾@ü\ðSô9WˆD-ð—ÆÇenÀgAÜsAU…û ¤%Óå¡FRÉ%ŠóQª„Ïjï ãðZÃñq¾vÕ:*Ï×D±Ý¨ª?ð¡úMù¦®ǃY(J,3a‚¼WŽX'„ƒ€Àg ]âëäÔ#Ç5(0>êÒ²Eõy7*´tïÖ¥} Ùµdm%T$íÚñ® ¸Z`\r…ÿJ"fG¡6ëVŽýÐ5ÅþÎkBØìŽT¥X×JÙ|æM§Düÿ Þϊ™§,Q«Ù¨DQm ±Qrø)5úîøYRüixf×O¹‡eS·©Ù‰Ø4O`”­8Ê.Ä #1Ûò¦°œ©†0%N“Ønç’PüiÜFæÞœ[p­,±*ñðÒáË}ÇÌûœ“[¤Ä= ¼D?“Èôâ¾1ðTv§ëªß²õ[ž™ íÙÓÒQÄâóQŤìà‘míR5¥>o¿Sª¹øþÏS`”ýE¹¹È>¬¬›Ÿ`ÏÈÝŒ¢§âÂQ¤Œ(3Yöá塞P±î‘áý ¿¡¤z¾Öš\~´,¶ï‡u&6X·iü†]–Ó»ç ÿ­P%Á”y'%dጛ’D釮Ƽ1Æ{Z*G?‰¨2p]HÌʼ•u»ärï´b\±ñcïÎ)l{€‚#m¹Øq]ʽ"µ‰î³d\ÅÚ zy s¥äHî=ä» }ënœ[ŒDV¶ËJ†ÅâµPÎ/(Ìû‹|d|i©øÖ9ÞŸ„þ”ðÌ*Õ‘Ù ‘ù{7Ív^KlŠÉ®Ñª6à *Ùqâ îè[³ }ì jß@¡ [â0ÔOÊø2ãúYZx©WãMuZ›Žq÷báYl¸9SSÝ´ß4¡˜ïk;éÙìåjÃ>I4õü»žªÃâ¨kŽ3αiPÑ$Z…'¨ ‡G]ÆÈo?Ëi/½“2¾Û©C \åÆrp—F,)a*J)ŽìóÊàH ïV:“8YÆrþfùyÔÂÛH’{nT¦Á&'R}B`ÍʻܜÒ;$ÀµF/žŸ)çs)ñžx¬›zÅ6é Õãù#”Ã+Î?â“!£`Íî*ÒšŠ@¥ê)¼:Q)56ç’Çí(.Baw+&uþ㯖àI)æí÷Š1œ|è:Æ õ‚w½b ëb R YŽÇÄBˇŽ>Œo}E¶F<,Y+µ;.1¾õ—(ŸõE™± Ù0Ó£ŠÅB%£¿uÜPIÎ0„+óã¹G Â0eŸ%„¥Ä%JÕžbÍ磸Gœ Õ¸»bhW maÇW mÛ”U„ˆg\G…RП8ux®„ç¥çñ(Ìgv üÕÕü »gšoNøkõü»^¿•¿ñ`%¹ˆ,,Þk Õx‡ðÞ0ÿï¿ÛU *^ÿÖíü±Ë jŽÇt® æÔäw­‡¹ä¸AÍ3äízÌY‚MÂ…ç j^AÍ+¨ žv57™èÔ¼ºìå"#é8 Õâ ­‡!^{F_Õ½Ô57ô©¬ C)…5þ|Y| „ì”èa¨¾°®ä¼Wðü©*¿%¹Ðàˆá ƒÁ×xˆã×#„½ í(k\‰·kÁeU+NôÆ~qÐËÌÒ½7¾5¾ÂR¹ªÕd™(Æ~ƒsÀ)ôªD˜´®}*éåÌŸ¹»DÔÎeø _À#¯å¼vŠl[, áûøúö—L¼b%‚J ö{Q©ÕS@O¥8à|LKtdp,E‡àV•zGnÕôføVÜjÐõqßµg_€üèÆ9ɳ; «»3²ú¬'õ ô^ ¶ÚO1)Ÿ‡áár¤Û4‡{ù k~~À´Š˜Ád•DîÛŠt¼>ü§ ͺg {&|Ôy;Ë…&‘åiA%‚Ã8œLz‰¼ÖïØ7øop6‹ÿF)lµJ|ƒKpǾÁàøÙ–‹Á×XQ­Ç ¢E¿sO+`Xã|Eñ¡¦_ ²ï†õA"}¯ç¿‚DƒDÃäõNA"Ïx£ Ñß¡ƒD¸müúyòñ= DIFƒ;c”ävõçb9ö(qÆY銒° \,J¢«ã½|©ER qu<¾3RŒkÚ|5Ê‹N¼ì¾ªŠÕUvú:p½޼·æzZ‹°Ï÷àzõþõ¸^uß kü­ñü¨ü™F­ìø¢ç¤‡vM_ÂùÏš­j0Ï <­QI2W…¢ì…MøoA³ýó.¯Ö“˜ñ9/CÉs.Å£(…œ èðÚQÂ%¨3½5%8¼|KŽR¦‡%šÐ:r&“¡®PÓ+Ýi«õØ’V+|])·<¼¬t7ί Wà—³¸ÐC‰Àðk<Êi) Õ;b½EÏÀ_î2×ñÝðjOSP®æ¤u|ÙÃSd÷ˆ”ŽrEߊeu’YCYgWäÿãhôEòÖY‰ïnKuaƒÌïþTÂì©sêOÙ¹»8F èž îþà»B”RØw;®c{?GIß,àè¹½eŽ^%61í“nÎTÒlQäI7g–ÌWûW8‚×<"umõr«‡”œ€æðãß|SÂJC:þK¨òÅsÏ[ùæWölú0çSö5Xµê%w% œÈŸ¿Áû1ØoÆ„ø73E¾Q¨løop DŸä¢:Óößç Š¨V*£BëùŽJàØ_ÝÖ©ýàïƒ> ÓÄ7v<7Ÿ ¡01 *TêoØ7¸8¢r›-x¼`ozh¤‘”îOqx÷xû¡°tÜíÄÝA‚l‰›")N_¡ P)œs·;xC$$ÄÕº)Háä\nKÚ•"ÜJ¢bûFçò²ñ 0>ÛP(óŽ'‚«‡ƒ®Ó-#ü•(P á]^×¶Àñ5ç4˜¡’¯Ó@Yd)Ñ‹É-¥rtxgŽížC'…fN];aï,a4ÂùÙ—ú&„½<R0¸Ô._î„@Ê6èrN:¿5DÙ7[Qª»Tû\©Ê¥Ê:–®ÔÆr3Êä!ð-˜·`_!´"d™õëÑnù3”Ž)U1xOÒ7ïh`^'â¸+Bí”M-¼^"Þ1k-®2[®ï¸ÝUÌÇ%”8ÕQšÚË–i+°h‘r"Wä”àž)a’'-3”*Vûç*¡u›å˜ðßê2%:ôZÒ‰N)¯ŠßÑ÷â㞉<ío¼Ú‹•ÞyêãD”Õõ¸f3¿ÞAÐ!`Ü^¸Pñ[öØ ïd£‹Å Uƒ-]”Ä,ße=[SŒj¾hñƒSœ›<þ햿ܬ„7š@_«wY)U«áäXh´“.¯^>!d.%Ïr¶gMѽœisO#èl u®B%k¿aO¡rEGÃÔ ‡RÜ—²ï~ÇJaç½ê«¹{ß NJ©ùD?m“¤Î»jâ"íïבàZ¾°–Á/kÜ qxUk¯*m8kâÿ+ø*”‘Ü@Ê5M,7k¿È{e³—pÊ…7Ýuýy¿lƒbÅöÚFösâUäjI"ÄñÎ6óœ0Ä”2`OY=¢XrÝ‘ƒ ø‚'ÔNÔ¡O—çu\ÓP¡ åúß%rç \ß8vŽ_ÍÄϹû›Y•$PX·åH÷ÓjödÎV/Tމ·È%)Œ¹:ú' _v…_º…7ÞŠ+‹6êò¬‰â¡q°(+(xªØæîÁsRA†§EvÏ•¥LW™ë'ÑWÐ J’.uë\Ÿ¨bã)RzŽ’pòRÞ ´Ö+vIc”íöbA2üYo·' ˜ýWcÊû¢{2»ó\žE,o=ÂW;ry¶5«n&Öµf‘†a~[qzœT$ïœy€§¼«5¡J¢¤[ ñS¾”œõ'úy˺nm$…‹¯¿÷©‚K:.•±h¹)~JNÈžð]šD}BŠÑ: ËߘrÕi*±$ü,áÓP:;‘ýYBÙ-»œ%|Ê©ÝGð~HîDŽe>ìЈ/½¼,%ñ©XvžÑU?ÊÎ{‘Sç ó³Fõ÷NêY5 òÞC™¨VN ‰uÓ‰¿M¨Ïw]!L3t<’PË9iG—±”[Ö|= W<Þ"q1¡„#3×å¤ÄPæ¹ùî ÐI³Û¯m¦]C­«¿9ÎIÌe(×~ºv…2–HÙ¤„3ô¤ÑÌræ’—¿s†uºÍ\6ƒ2ÙÞKry‚—GjÐÈÜsþ릿º̉¦ö[v Ì=e³r±pL;L[Çð¶"ì5^š+P“o‚.¨á]ñ~H5h(R¯H¨FUÉâ­4C%süŒdÅ„åV-Y#6 Xß(È‘SÀìCp¤6•Ê®Ù-WìøW 8ñ&˜íUf‡Sf6ÞQɺâý$0(TŽøŒG˳唬¾+6z˜/,8þ!!®PW–â(¥2$ ¬´ôNl“òc)!×½•p?ñ(”¸@¸Î˜÷c&N×J4–¿¸HÔ5°šVƒ$Å)wf]5åx|ês2Ž3zÛÛrŸŠ•\;åå)¯w~ÍÅ>çqR©è‹âq݈#Ť®UòŠ<-|5bû.„×ú™—T QÁ”…Z½H:;Ç]‰¤½©£¢}ÎfËFÀÙkf6/8~üÄ¢õã'ÃU¦Zû-Ï,Ç\WzêÜêy¬õ½Ãu¼4ö®ü†|@?; ‘¾²¾¹)WÖ7ÏPTw_c0JK'}+{_£?~ •{˜•Àk:*ÜÀ{ ŽLª¯Ï-{Íô³\Z»@7è"€Î2l¯‡æó) ßíLG Y >XÚ ÜàÞæµøZW/kñu£ãŸµÏvÎ_.Vº÷ÝVLï„¥•÷¾ŸRÌ´S…¯­@®xsdˆ’˜L9ôb¥/§’6- tLwúŽR· kˆò>qâ.“ÛÍä˜ÈV¬Ê»…<ŽÑ=ÌŽ[þ ¬.L~ù »WËÚ9Œ•¾ñ¾pÆ*ëŒPž"gß7{î0Ç=U°-îÌ»@S’€Hœnù.%C—ù–Šë@çŽ%Yr(2»µ¬sæ *g\ ›‰³zÍÜ‹l0sòåÄ5åÈÿþaÞ,à²xœ©5©ß±Ã|~i±§ˆ„b(4v—~KÎJc.Ö6ÂC*†·|‹€r¶4ÓÐÝ®%E§B=l5TYñ»†Ÿ2['øÃ“ü;J!ªDV ïE8Ëí ÷1 m…œ÷ýêë~WÜ7(ô”f¦ïRý9禓Ò@× Þ=ÏÀ¿D{&Eµ†V›°Kqÿ´¼À[—jì÷Õ§œ‰Ÿ¿iÑßì7Ê`¿qZ|£PÙðßàT)‡õܨÐ$¾£ý|EeS¨¨ÔnFŽü&(a¥n>2¯“ºÂpK¼ЍÓOþÅSÞûr4¥®hàÉY"ìñ‘ŠùRv E¯Õº¡GìF]õy‡c 7ÙìR!û¯(g®á@aŸ‰•íEJ©¯¶O3Ž,áÕbåëJÝÏQat| wå(Ñuº¯šó„‚ ¸‹Ö¹ª²Ì+BÙ¦›<~ET;r™‘×¹¦z±·wòƒ[ÍŠ@ÏÜi•ìyï¤ ÌÏGíŸÔPë‚ö­iý†=böOÀr€‡[ !ÚR>÷8iqÇ6M4ëRÆÌ§%ʾ–ªÜn‡xPx ά9åÅGÜ%œÐq€ëŒ|ãôûBáþ‚þ&ûy=qo¡¸»" Œ£$ñUDþUQB¸ùU$*8tIy…ø*7Y¬KÕ–ZÍ:O'¯Eƒ{7„\À„ÅJíy(wÞB# WÏøÃ¹>%ƒë w™ 1æ-%ÖÈâ=b\T³ŽÏ~Òsx3\Ø.’õ—ð\Šõ¿Á—vÜcK< —ýF4„~¾¡ßd¿BA¸kWF-æ9ö†cö¿äìš½0{QBó„hÁôˆÔ …عæHÖîÇh(·|0'ŠïÌUJ€)階03´áR„†RŸúëÔ×ߺ«µñö¥>E6UöäuÞ0vÉÝãëáQ…;R?£¿Á]9ô7wòðø ú´„3‰~“ÿáý î<¡t–Xn¤™n„¥ÜÔÊš/AÚ_ Í;,›{½xXº0Ìðp®"ѧý„þ|ç7ð¦QæBˆ”:[+6§(R– ŽšG¾·pã¦Ìó—ýà:µ°ÿÞkæ|-Þ„”âû8Ôø¢;f¾,u×âjt#Igµ(6A9š‚g5SV•ݳšK•Î_i¡9â­\4‰¦«ÜÃÀED•@ÃûdÙÅã­Vh-gÙÙ<`U÷SN°G´ÃCft+WsÞ›Lx³Õ³TÊí^4mÉ(ߦ½æUQ´±ò¢•â)ktƒøÓ†wÎÓlŒë̵p¾ ãÎÿ{ÞBæ ÂñKʸYSÌ¡P%Â̵ÌI‰žo·þ• ÃfN•-œƒº§sǓۿäže„“!(E²ý©ØÃV¸FЏ%vÙËãvjTÛ06bk³F½&·aõ¯¦Úy°š@Òð¸ûX¡ÒåXÕ±”¢ú½"-K¦Í|'äóèYIç¢Ë§ÌêSîï2í¸“¸¿_S,c冨Â÷€ñßô~Œ‚»Ãø7 XJ]ñ?ê¦×1¹SŸÑ·d!=£¨—û=\uùÉ~vôÛöòã^À¤\ÞÚ¹½µÌ%©`Ø¥pD d b¶-dx¬)ô‰¼äÝgGNG·@<°jCSZ—ãő'L3åÞ–yÔ¬.6OQÊIÃòê{”£œ¤{0)·]¾›Bº.’žÙ–3ö玸ŽóÎåÁŸ{:›É{¨ó]Rð®Ê/’‚§è÷ÝQr—,Bô ôà®F©ŠÆ‹@á²áå4ñƒÈø¡b¼¤N½‘¸DI)ô(4Þ^¯/)•@—”â”uî8xÎŦ…>FÞÅD”âúSÎîî“_ª¤16B%ú`û0X^nÊc»1ék$œtÊN¨Ë7JA¦WøÎéÁ³±â»ð€Ì+)N(uŒñoV„x$¥´2¥4^çQ8æ…wæ vŒBLpðOÊ8&ìâ:eÈ:Ã6`ŠÝßÁ<àÁü×¹©reå¼5uy¹ –QË\ p®–0½¹Ãqó¥0ŸÐwÈ÷¥0=ø {”Â|Ššß óʵè/™xµåM?À¿9kòQ‹Å ”kµév’«@ù«”!¦¸Ò/Y ýîNòU•iÙ9\¶ŒM‰æho6® „¢yÝ” -.~ùÕM´Ã¿yÜš HÁMã;‹9Âë—¹ª`,å.¤{Àø2o ²lh.sµ!—™}MµÁoð䊷AŸPqt O›¸l9#€1ÅRί̗ÏÜà9*¶œgón²ìs–ÙhÈÍšð—RBdjšnS*¯xù5L“Û­À‚(»jæíëUBH¬·«+±ûõt¤0>wRêõ ²­X&÷o)<ïB»÷F óîÙ^YS;l»«º3Éñ£ìö½Ú^Ï9OÙ±¸Å”[Üm"$ÃM#`Ï›T÷á” JÆÜñ¸4žŠlrÏ ®äøjÅaTÛŒ¨¼‰QÌ>ÅëǸôlèò¥Ä(s<Ë¥âÌ›”…7߉bw”,-ÜßeɴƧvJ†î‚ïåï¾ ]Ìë“êᘩ ›s'Q´`åKHÃëK²–Sœ‚J¸^ž´^ó†úX³Õ)ÃO}CgáÝ >ç˜Ù½!ìO¹Ò‡âþY7"XoŽ˜®ôó8÷=þÜ~LrÉ9ð—¹°`’l£qŠÇ»>¨ÒC¼›Ô½Üµ ryW ²ü”øþ7vhÕÓoÜp”ŸnGÑ›YªæoX?jn‰‹Éöݽ)–K‡‡Þ4tx(¦ž¾ 3 |ÆÃ]ä5þ4ô7n«^Ý«F5¸çç‡Ä½ä?£‹kE0Ԝ㪀é‰%ÿ4ar¨FÜÔé=¾â2¢&—x/¼Ÿv»Â›»út“ÅVÍ»oÜ´97eÞ~ùøÿör endstream endobj 4954 0 obj 12605 endobj 4958 0 obj << /Type /Annot /Subtype /Link /Rect [215.250000 215.750000 285 222.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 4959 0 obj << /Type /Annot /Subtype /Link /Rect [455.250000 174.500000 504 181.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_directive >> endobj 4960 0 obj << /Type /Annot /Subtype /Link /Rect [507.750000 91.2500000 547.500000 98 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4961 0 obj << /Type /Annot /Subtype /Link /Rect [185.250000 62.7500000 225 69.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4957 0 obj << /Type /Page /Parent 2 0 R /Contents 4962 0 R /Resources 4964 0 R /Annots 4965 0 R /MediaBox [0 0 595 842] >> endobj 4964 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 4965 0 obj [ 4958 0 R 4959 0 R 4960 0 R 4961 0 R ] endobj 4962 0 obj << /Length 4963 0 R /Filter /FlateDecode >> stream xœí]ËŽä¶Ý÷WÔ:€{ćD Ø3ãYÌYYvœÀ°L²È離êjª%º¤¨.zœô¸ÔE‘——÷}ßýñóßwÿüïîÝûÏÿÞý0ü|ÿù©yvmsúgwøóÍõÚ?ß9ßî~øõéëîëÓ§§OûÿÿútúÂç÷Þÿí;½ûÓþ?ïþú·ý‡?¿tø…_ŸœrûŸ¿öNíÿÖ\~>ÿ×Ó_~·ûí0âùuÃd^ÿ÷7ºõÚw‡iL¼úëÓy™êøç¿?üöôîD€eoiU×:½SÖØê­ÞýçO?í_p¾yî­R®³®¹çEûWœß¤ûýHíøEÇ?BÃ'Üi“nðãÌÅ©¢L§â£Kn®sí@ —„þ—á ÞÛ„ƒg.N•óæâÑ%7·ï]ÊÍ}^~p·§QBÎ9Ì<ÙæâÑ7×5ˆ6­}ú_†O±¹­mÒ ~œ¹8U†ÍŒ.¹¹m?(žMAþ>ÊuÝþ?Ò1ÎaæÒD9o-\rg]ëOäi]ú\FOA|¯lºÁ3—&Êygáà’;ëÏ+É™õ õ¡ë÷dJÇ6‡™§:³ppÁõº·évöeôÄ÷Ƨ§™'ÚÙÑàŸ– ‚grú¸è_#_üîËÓ»ï•U{Rv»/?íçv|çéÇ—=IÚÝ7{ã¯kÚÝ—w¿oóýv_~~êŸ;Ýž§xzÒhôD ¿cÐÕÁï|€O>.OtGSËgG3 |bá{à“¾Gùå;‡ß£Ýòï`Þ1ßMŒöñËþ¨$çrm'×@Q~ju‹ø2r2ÞOàÜðw¾v8Ï>ZsÇ>ROàVXVàS‡÷îI ߃¥¢Á~ÇbþÇ3`¸r¹‚çLci…Ï&>Mp°¼Ä2¯Ëe, ¡"ïÁO Ô³5Ma½‰mLk¨Q5>YxÖp´ˆk—s<žC·çq$qN-´Ê-cGà'pnØ/ˆH¼ ˜{ _‚‘£Œ½¾5‡ùÛy¦ÏhÍu:³5‡iÙ-ìý{‘ƒXraþ‡£Eæ†ý|ìÅåä ¯îØaó!ßL]sy+¦œØ|z0Ûœ&Óž9ÍéØÛgkN5(/LáÑ“ao=±p´Søgß7Çu‡GæÖâ=ƒIìCËqÑ‹ U™g£½Ú? m½[ßÁïËäÈ2¢À¥Ÿób8ÙÁl_öb¼O'³Ð<·¶óîÕhŽx&^)Á]˜ó#ÔÁë1á¶àbrá¥ããžž(u~Ñœ0GoËw!Qðá”Á.ÅóÏ`˶gñpß¹0~Üuk–Ó–`k<ëÁθµaðÉ0·”šÏû@õ1§à޵ÝÚ¬M¾­Æ"789²r9"¶ðhŒ"4VËöc>ƒÑ7þõQKJƒÁˆºÏ ;"DX9bÄcG»58¼C$´p QcêÀý1D@Æâý!\ÈlSœZÂ|ßÃ$Þˆ {ƒCēғh^»ÉùÔdèöÑvwìcM†Æ¾S“¡MM†Ö³05ëš ­ÉМ’¢&Ck2”´æJO†ú®¦bM†æÝOÙhÎTdßÜSy‡ÿ›guZ‹Ót"Ú»³“,¼Ä¡]˜ r;£Ô‘5+&‰°‘@û‚tÓTä]â\¹F&׺¹\¡ ›sƒû†ÃxëI‹h4<É!6\c²;kÛ ·cG*uMÆitäÆf Þ×à=û¤ð ¯kl¡Wƒ÷¥ìcçïØÇ¼}§ï›¼¯gajÖ5x_ƒ÷9%E Þ×à=iͼw¿§¤æq‚÷ØÿÖ„ÇŒŸäÜ{ÕÜS†“1Ià”¾'ÅTx’À)kåiº_O4OàTñÇ¡l·XÂÓ¥OÛ¡x‡°VÆVŽžÀóÝÀѺEÖƒí¬1EñÎá'˜nX–b‹Ïš (£"´Æ¶‘–:(MgFç/C¿Éé•Z_iΤq]{¤ÁËñíÄy8{íVN çÇÂF­HŒiµÈÕˆfÛ˜¶Ðq'îÂ%Ò—K6·Œ“5D~–êç]šÆTÂ3?¿MuF1]®p4ûaØÁΩףx~ñdßJóöþKш—RCõ>PQŒêˆ°8æ§P2â’¤™z%#µ0°@(R¸ƒIÌè†:LÃsÔ©5ä!Æhz<®>,7 ß¼h\n‚%TM½ U%¹#Ÿ-\ÚÉœGÁò?!Õ!qy&¢|([´Ï:”ó+GÇTb„U&Ê22cE c¥Eb‰Ä°D]p6DMì4m°\«)¯ ÒS>ãSR;á:.€Ð¨ŒÜƒ@1δ,¦Èa%¿º'’í|˹î&³Û‘ý!B¢xn òùò«;ÿXé.ÃŒbiá´~TÉ‘‘j«¤±UjµÖªP­1‘ïL]{rôˆÔ>´¾½M’eŸœ/¹­u¸š%XqfdÛˆ‡HÈ ˆDƒRŸ®HJÄ¥Ç8¢ð ˆÀlâGÖEĉV‹T3XÒaœVö*…¸"3á9ÝŸ¥†àÀ-ß SqÑj†˜ úSCˆA<¥Œ÷Î\@‰ç>é~Žh/7s4…ƒwï)ž5^)ÑAé]}Ö‘>8Ü)CtäD‰pÿŽÜ Žï;+ø,à³Í à“5ðhy{ ­ò¶cä-ƒ5‘B¸3K¡©Øæ²žEÜCŒgM`ÐEú6 ”¬Yª´Ë,Ó.°»U¦‰sxÃèÀmZ—ši9Qãì]0σ3Â賚[Á¼,k£3hžìV&ËŠgMàGaP¨~ W•9Ñk¬¾çöœè5¶»¼ï*c'‰Ž±—11ÏçÔ-îdÙˆX]«¯/¥'­‡[£ÉâC;6«´éïA½-y)Ëk ¯’^ma‚yn <¶ Îß–ÀŒŠNª(\0ÏÉþÞ”³Q]0›7_\5Àãi€5‘+Dæ"ˆ"3­(™Ä^JìÌô*T5U@,J¸Î¦Võ½ íÔzûITYV ¢Z™d¼Òz$äß ÊœÒ]_Ë£ôÈSÄhIôÖYÜ&„”{Ap\ëZ)Ï%bÝÂ)1ÈæU_0Ð^äÄb§ƒ 00J&ZSžåê;ÇØ=ê070q,ÙS‚¹ŠÐDgäq %uĹÍCT`86Ø­ÛÁ-ØãŽ´ãΞÕiS™²Íj‰Ú ;YÛl†’«ñ˜°èý *`mÉÖ ²^ ÆüGh>òð0Ùð&`ói³¼Z߈hàÏ22E/5¹cXæÒDZKÓ7_¼HÙ­]d[® ½ÓúðÌÖ3ñšùiPêîØM†ƒ î\LsÕ^ÑÐ W¦]`yýŸ”7‡ùþ¶Ð(é¶¿%sˆIp¡²w]ÈÆu™ä.e²JØ”‘tÎHÈjL #å{©\í)Ñx#Áå0×f<‘-œŠ|‡àh™’h"DÆ õ]sIæžÐ$w@'®[PcC€¸¦Lú+†ŒrFëû&8‹¥Š‘P1âNvÍKTŒ„ ~ˈ‘Ы{ ?+FBÙ2­b$”]—¾>‡TŒ„(­+FB IR+eÉghäKA• ´úÁÛŒ¦çûËe s®ŠÀRWEàï`‘<¢¬†–ßzdHC·À7êÁTHˆ„·„ªëÒ/â!S\}I…%s#/“â”(Œ .ƒg Md#ÙrA)×(ˆX¡á0HáH¬øe†ýÄ^ÜZüοu2’W˜Ö„d *©e¯u޼‡á³å‰¬ w„ÉÆQúE¶#SOS,…»S(y•Bú-;K¹2‰YË76r]¹l(_ m³úCØxóGÁ*j²ß÷ÖØ”›¤ÿ4E„bhBïlµŽÔ;RË+ cûaàèÎ-Ö©¡ óœr¦4„1T"å˜/1.oàjeÞ‘.AÆÔœ¡óab)ûš9Ìpã&ñU‹ô”¨ÎW°Âmž£Lû&ÿÕäÄ¿ªòÕù¦;_©ÂU¸Ö?ÁUµ¸’× ¶p4¸‹«Ê™ú$\o‹GÃqp=‘ÊÕLÔ‰TÞá*1\ †k ñwðÜðLQ\aŽ‘…ð¬ Z3•Řn– W`â:eæ=˜¢éшNU–W²._}Ÿ¿ÜÍ-‹€´@½ÔÊ¿¢+ÿDN¢“Õdç2r1H̆-€®bj $ª:KÌôóz™»7L©9'Dçì׬P×µ~Q¯ôËé“YŠI-PL}h¦¡ÝdYШ@þ-FÏQYûnýOßÅÒ:1´3ô/léŸß?àüt×üòô9b‹¥1âSÎÊêÈþ ›Â–¶rÖŒd(}ŽêGü-س‰JàÎaìYN!à¦ïfº¢G6oGÙKõAífzdŸ¦v3Ý5š°"Z¬ILËr q/#ƒòÅ$DŠ|6a•Šº÷¥ÝêÕžt¯Õa9`txEŽtÞO!d¤¬ð: G¶n†¢01Ī mƒßÀ<]ïç3Ï„zì~*cDÔ®dT!¦VLiÑȘÕÃs— â°œÆyZ|™›LðaǹP|Ûƒ¥×“ÞÇl»`Gòù˜ý*¥ú˜ÕǬ>f>&¥ ‰’ôHY.ƒðLdî˜ÓR`5Úê~÷šW [¯B]rÚï[9°‘°m…ÃO–0,öHf̃l2j´“¢ 8\d»ÔMHê–iY=ò7*à7¸wvÖ`¢Pa=\÷‚…¢HÉOy‡%r9s o&­–Iwe@ °} ¡¨.æšæ&|p/±ºy¸¸ûÊêV)…RÊøà”ÙÓf)û¬Ü‹’ui(`‘ÍqÅÇ÷C•ÒMýÉ¡Ì&µo dZ•“ó;ó†÷Í z@ã-ºÕs7çìGÆ`®6ÓàÃÙZQ˜D7Eá¦Ï`cf­LÀ-Ùͺ­ÐÌs´ÒšEö˜Iº‰ “gC  Õ¢Lå;µ3.k0ÞÒOø&|îÆÄ°1rYúk­]¨A2(-gƒwFüN|̘ræùµ¤­,x U"ëÚ‹f ÆÕ]¡6‚­CÔÂé0ü½„‰qå>‹á61à> ¿º®‚ó%ô? ö%¡â1X)Ê*Û%Ĭ'›i’ÆÇGf Ne© áX·lhVÛOV A ±B6å™äºKb“Õ?æTpsŠðÕæžÅäÂ#€ÎLS®”c™Þä)Œ(Ò\ˆ›Û¡ˆ]«\È´[³éÎùÁ«cÇxªµâQXÞ(2LU.Vu¡p§ . Ž(®ZhÜ…ja.Q¸£rÝÆ@Á01QlæÊݪ9uÕ²7ú‚ȇ»%‰‹¤#: ˜H''0ø*kXÅ`1”ãÛ˜‹hÀ\OžÄ¶ºµRHëÈzpç0S™ò8|€w_OÐÚàÓ˜)Ú›ñj{ol7)o#Ó ×laîÕL˜¾ð=XÞFòÄi’¥ÁãpyDzÃ'X:à,Q ¹*Wþèq´x.½kÅ*gHÈ®­²JÈ¢$¤Æpí¢²³JÈØ¬CBNda¬¾Wà`¥Ôõ¤LEÛ‚r<¥\µo)>¬ZpP1j'iË„VýV ¤7•¤.¿`$qrÆuáá«q© ?ÿøçÂ,\ŠßÃ_K™5ÔŽ´JùÆJàG¥f3\’+“ã|Z 9¶_/!‹8c2åüÂ7h%Oþ: ŠõQÒ°ÄÍQiÁpÞ‰û‡"ô#¼:‘>NæþaªÑ·`„“ǹ÷šò_F½? .ÏÆÚ&¥ÀúMÁKn×[݉ܤv>TºóiDÅ•åWÖ͹qGp!«ÕæÆx{ýÉ*07ƇfXN˜ÛžËÌò ?Ó¬‹s>¤h_v1üŒu—º™ ?Ság*üL†˜}…ŸY;ew†Ÿy‘~o4sŸ~抆Ùàg^Þ¹“6¿´­ð3uVoø^~¦D}¹Ö­&œ|Ip…Ù„‡¹NåQ)1jLèÄ$éÏdžÁëKŽVDQ fWÆ¡,æ`n¯¬G©F…–^­îÝvuoÊš9%¬R°¹xD„:&äT%V†g?í<Ö4{M³×4{Y6t‘ÁÏšfO˜f·Ê»fÙg±ÞýYöé”wC’½Õöúƒ5rì‡)¼f‡ëûþÏîë~ðè»?MýÂŒÉùÛ Qæ¹Q‡Äén?ËØ nÃé º¢àeÓç‹¡®žœlÿnüÄ|¾3$n¯XQAæù€Þc¦ŒÆ[sû~X)‚Â!Uòó­Éªaé£üŒ•–7–¡ðhð;ƒTW‹–~U Í2ÜáïûŸgþJ£–`LÈCS¹AÌÁ‹ó«–ƒ;2XÛWÃcxS> endobj 4972 0 obj << /Type /Annot /Subtype /Link /Rect [194.250000 58.2500000 234 65 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_interfaces >> endobj 4966 0 obj << /Type /Page /Parent 2 0 R /Contents 4973 0 R /Resources 4975 0 R /Annots 4976 0 R /MediaBox [0 0 595 842] >> endobj 4975 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 4976 0 obj [ 4971 0 R 4972 0 R ] endobj 4973 0 obj << /Length 4974 0 R /Filter /FlateDecode >> stream xœí]É®ä8vÝ¿¯ˆµŠII”Ã@åd  $2/^Õnª†³{ѿáQqây—ƒ¬DUf=¥ÄéòÎ÷ÜŸÿýÛíþ统?~û¿Ý¯Ó�4{Û5§vÇ_?Ýþ@ûéÏ;;t»_ù±ûñòõåëá¿?^N/|ûøÇßþ¹Ó»?þýëîOÿyøáŸ§¿tü ¿¿Xe¿ÿöúûhÕáOÍå÷ãÏÿ÷å?þe÷·ãÏÃM“yûÿ?énÔ=NãÁÐ?^ÎËT¯¿þñëß^~>m@Ø(:ÕîTkÿ[½ûû¿üå0ÀùóÍ~l•²}k›÷ dõq¤¾wJ‡Qílœ×_2_W1>Þw?~œ¹ô¦(Ó+ïÇ%OöHøñNöòõ›o­‰øñãÌc,ü¸äÉmñd/_±ùãáÇÑ>þ:óX' ?.s²‡avn´:|Cõz§Œ‘^ÆÛïÇøºiMį¿Î]~côhï~ýkÈWðT¼ZÃÏ‹¾¿üüe8h»ï9ÌìuÀÓoßÑýî§£ž`ôîûŸwÿÚ4êÓ¿í¾ÿõEfØëî4¿ÓÝ£'}}Òíuzt}çâ¾3¢wT{zGí»ÑØ7_û×£Ñ;Í8ƒÏ§'ýþÀŽÏ®3Ðáã(f¥§}ë÷F½¾róÎ8ÎÇ×'voN“^4Nw£ÐÜŒ‚_Ã3N=ÈÃ…ïÀSP œõçsûüýp‡ã\?£÷þÁUk{žgãÒ8|‚wªùiž/¦~xV=qŠÂð8zm¤Î÷ †÷÷ηmNÇk/áÄZ†ëÍøx™]Ûü:ïïl÷­±ÎMÿŸçóÓVç›]/swÉ“fp>g2ÔŽÔNÙ )Í?߆oÁŸ‡{¿¦ññ|žnZßÍ“î^~‚gmÃ×3 Ê{ïÀYëî|â™5Þ7f¥pß0OÂhãíÂËȘçk}8É4ø‚ñ…šô¾°}ƒÇO} “&ÞÙ,çìøX¢Ž( ¦‘# =¼\ÎPì>ÕÍ 83,.1;ËðHp̶0Õ`öˆ·xù 6Ÿ ˆexs‡á ÌIw÷fziÁ“É‚RZZ;}ÍδWÙ•âãÿe¹æHÐ*C‘Â$SÞeô\¬bÞ%*§5MCâÑùñzE1€íÄÜå§jξ:»€1-²2NDu)ÏzᄵShÐx(ïÛŒåd¿Ö›#™—ü¼çlNp…xÄ1|‡Rx%vvn63Vù#$3n+%Øâ:ð¦]˜·jU¦n»×©÷íÙM<ɨqrÞNýz2-÷Þ;ø‰†_kÑ“‰Pî<ñÌú |ò™˜5|‚g-;7M<ñÌ9¿fÃOn2ƒ¨Êà'x¥á87ÓÁógŠg­ðîü’›zñ™&;9‚z[¸oxÖxßðÜ<{)„89Åg0)A¼··„¡xeÂîŒìcÜP¹]ÉÕó^[ Íw˨p žq$R¡Ú­Ûûx`‰@ ãŽYå3bfŒ+è*‰G"ñ¤”DÑCæÂÌ÷‘|³ÜòùWç":ªoÄzuUQð)È: ªSÇ÷;uªãÄ7ƒê8 U('ÇÉÐtç!™´"¹Ä£Áw°¶.œK5‰YÀ‹Éìô82˜ R‰üæle³ªC´mÑ„5ã$Qž“ž,—uc™xÕÄ‹[Ç‘5R—ßñ‡éQÝ/­#.e²³R ñ_ ûSUØuÿ;H·ø‰›êIUñà3›Ý-Ì0•.t˜;z$ì‡å$(+SUóà$MLªŒFTdâ¤åUÃ'K­9ñÂ{v›{íßÁcÊßapè)¿{Q¦Ü†©E 䱬€¡ä1ã³)ØFÄÄDÕÍÌtZ"‡‡ª©`Ø& &Œ’ÊqšHÁ•9JÆÓ– ­àª\µ—ɧÊýb¨¥°mFG 3ù£”Ò#êBKfê¦2AeÕHB·ÎÇóV•È`=.÷*Ķ…R¥GÖxc²xc•¥›JkíZ¯ÕÛ–^3æl.4»`¢f×F„C…¢¢˜\ ÛBŸ*µÆy½2gWvüì1}¥•Ygž8~G¶Ëµ§8î ;’ÃŽÕ+èLeM;œ‡´è~‡ Ä0®3ÙàDÎö¶ŸTŽæ=·š„Œ¿ªâØå´Ng!£¤bwevøµd ëv˜ˆËÇ´f¼Š 'g‰—,ur£\¾X‘ì—K±¼Ž ›µ%DTÛuøÊݬê@UÕ™ïG;0Ežq«š[{¸GÉØ]Æ0‹±ÕdAêd#N®w1€¥¦ê¤ðnþ°€ "™ÀµÔ?îÉ*^* ¹"ÚIý”mH±<·´ÚRL€¸Þº‡Ð+©05"øêfO<_·õܶð¤Òò×YænqÛA"(ô€•MÒN5ä ¿Áo4ÙàQiò†Á a*¢é¹,Ô‘Á+%@ªð¾™è‰öd2)sñAâ»éÃÃ~–ƒª$Ë`_~çó;i¢ôù´Ñö3œ€ha!Sb`W®TèÅO˜Ÿ8SwÖ=+7™˜Äª”^Æ123K—£ŒQEx‚Òãê“æT¹rs12¢G„J…ïŠûØŒÉØþþ~„S”N¤Å{ô9@åš!2^Ô£_FµÃŒJ®Ô%bŽŒöʨ{žÆ2L}1̬KUÔ%ÙÒ0ŒG­ö q0…¤n6ÿ#ú~‡i¯Ew`Ò$|„”—¯G$•²Ÿ–«/ž,/‘F&x/˜2/ÑêkF¬„Ä Sá7&qÚD¤cïZ{« ie· X$,r=B’áÆOÜŽ•Áxh©Fäµå‡kÉæÃH¥±ÆGãK¸ë.-ræUrL2ÄL‹Á½‰˜6Æ¢‰¡Q²nb&ÌYåž™l W6ß7Ñ8ÛÒÙV‘,DYŒÙq[˜Ð˜ÇÏ-žÁZae¦jÜ ÌdŸåf hGB¸,(¾‡'›*Iª¤Fã}k\A0½™C˜Ũk8òAìå/ Û|‘^d“‡pbPfã¶5µk ¨ iMÈ·ò bŽªš9GA©Áõ?xZ1½žv»°•©'å¦Ià’8ÕÓbÔF?pmWƒª9ïÉyHà‰ÜMÑbÓšáP3Ä¢F«Îpˆ™}Ö ÎõÞ\îD*¨FÑ‚NØáÎ¥Å9z‹¡§Šc0¾ &Qfy]p,Q5-Uš²àÎ 4†˜ î0Óp³Áî1ÕȲ=6Ö’;ÀÚÍ@ô£­dsåOqÉŠ\9…Å„C³WZz¼Ñr:QˆN¤´S¶o›,,V¶ ‹(äÕ½7v‹}F²Æ^|§øÞ6}|Z¨Õ•*½F¸Ôu¹”b(LxË™¸GÍ,˜ño>[­ä›ÐbWÁO4_‚ÊÂÇ{Ž ®9ý1kGÇÆ‘Û’¹S±ìt¬Ô¨0O"Aâæ9ØS/ï[¦Ñ0H†ÉÂIq!>~çÐö®’ÝÔ¥ò\,tˆIÓ~•—jÇÖ5’*$oœ¢!éà×&awïɳ¥bÝ£^¸žÒµîÂß1øð“>Á’Ÿ¼ -œA ùA‹ç&Ö’Ì'p'ÎeúÇ;ù¦rÌ…ðø5|Ϥ$Yî0íNL_åYºœHJPUm+¨j †)óÛG2¾Oø˜ª•Ö¦ 1tL+ÑȲ9šÕYL?c3.>“Œ(’*°QPõ9yþ*N[…˜È™ö3¦?Ôô×ܼÇH$q’I“_ž«Šq­e£Š"©5µ­Ë¸Ç™q0#aº¸w*T:èxW˜t-|‹V;>ªÑUÞ—ç<1š²‡F˜8l€äXîÁfÊó"§—…l3{¬´\eTh‘ä¢q••—¢3½žD{{Îöœ¢£Àâ²ÊHUŸj´B­T¾ cÑÅ™òø5YÄ 8¥‡ÐMëP@+æ’ó¸põÔÇà:,öp7؉ãàDdÀ0±,è÷Źx=ñï»Q{Ü êg} -´)Žp˜ ‡ødšÆ=ºDþ€¼ 1} ÖÝ|Üž; um$Ò5ÖÝQµ”"X,þNõ3ùä ϼ ߦ7g2­áÏ•†?L…YgbMºpî8Æ[5œ{o5œ[ù~Š)Οh°GòŠ·7Rì1—’¥â@×I[ÏÖÐÖ¥ ѵܷ™ÕãumÛ•qã;æºÈ‘Á5„QŠD.FåHÂr4“*y#IÞ”ִ瓯a‡§¤h íñáã'L‘ôD`‡Â Y‡ù\àJ“yIZ›šq0îfÆAœ¨óXHÿ¿ì~€­«'¢Ý‡u¹BjE1‰{"htQ=+­ÃÅ<ÈÑØ ·ŽÊÝÀ4KÊNÐ U³®éªj–^5##O5y*µ¤kU)¢¤€¶W¾Ì€ÙcË;UV‰¦ôTÕ8cJdñá«òUy‹™˜¥”ÃÖ(-Ѱ%²¬dMÕ`0é¸p‚©Z,Ï/œW’;J ]3N¶Vdeó!-*mb…£9û 3 ˜­d¤ª5AX¶Â% ™ª­t´„ñ[2ToÈðô“Eô«pŒ;:ÜžvUµ{½ØÕ)¨)(.<à´‡j¾‡¯[ñºzüÀkƒQ{û“ß^¾yøDó:Gǎį쌭1xáŒZP×*‹fšê0u™³uQ]vâjÆÔ²žaû²î¬…ÉZxD /UZÉøq‘~ǶTÓ€JpY;ôqx¶qãÅŒåÊÔ;‡›óQ«;‡õ ëÜ¢…"H¸Ù1–xÊD²ÐD;¹Û!eäs¬‘Ï%ã0‘Oªó¨2÷ÞùÀëC þ{{@àu{ˆŠæŸK&ΔYƒ×MѼÁÌ^?Dff($2Oë[‡©•L~Ï“1Ê\ÌØ1SóÔ=cá÷³H»Ã{€¯:~3iL‰ø|°wÏîà«NT^¿ƒ¥Ñއ±ã} ÃMuç¶‚ˆ„±3ÞÝj›üU½Yà p ¬ #p®×| g… BzjpuCÔ«’#-:Ç9cw]wªÂ ¡TöÎÙ©âÐäWQmX`? »©’â°ü@LB„£´ÞꮀMÏ”'&‹©Dåý"(r‡Âc–î÷#Ÿ˜~Ú" µmÔJ-Z” Æ…¤%â™|Bœ]GfziÁa4‹ZÙX‘¶æ±êÄ$x‰ÈqHn«êF0éÖ ÜTÝãôdἆ4¾cñʵ=®Õ)g£+˜7p2éÁÝ©´IR‘}h½)ŽžÞ‚µ^BV•ŽPb=é‘#Îü~¼œ=vÅãycæ*šeÊXZÉ,ê¼®xÕÎAVW< ZtÎN­Ú”› 55†^1r…´Ç¨#┑ò§Ž—‰Ô5½{Íg€ŒL4xF”‰ðÕ˜Áâ®_Ÿ0쵫Քœ›%54¦Ê¨\Uƒb=X/cÂ% ºŒï'b~±³lß9bKÉfj̳à`ÆLtkgVA"L–u£T­ñ^ˆ’h¦³)µB©nMzÅFsþã;ìªêË¢+ü ¼Â˜òÙ ±hsø¸H1UQ_å.[â.¦ ‹ì@“å^ÀkŒ§N«ÄM…rÖO_m’DŸ.[†jÿLÞSµ/XáæSƒ#2¸¾sõ'YËl¹à Lœp&6‘n( ¿š! -T +«]ïjUûÛö§ŽÃ-Vÿ6‚û4æs ˆEãJ×­uKJ¤©‰ìÐÐÝ躳JI JàÃ3™]þà—ÇF“€@¤ îdS„^* HY²"ü‡ØÙT(si€bcºÐÌèÜna S¶H6 ‚Fk~K6™bÀ4o*¹1…üïŒrîÊÓAÅôuiëînµæ¶bÍ¥Eµ}^]E­ ¨~VÇ¡VŠÙ'œ>‰¯‚¼rë© ¯M×c;“·LºdòÛ¨S^èT× òJ g³œ„î\N×É<4úíñ>QrK\õ½³Â$3àê Q¬Ö•¸zÝ©U—G%\½îT\¥$Ã6WçáòD˜!Ç„!Îr5Ÿ^·rÁô¶vÆæº=¦›&ƒ–mÈ,Ñ]5§ †™ÅPÅÃ+ÐjZ]™¬@«RºnZ sOé‹°)»'´gO áz³Ù‘;ˆp½Ù©-B¸–DÏẄ¬¶á:ôg Û áÊÍ wÁÆáz=ÈêÜ÷C¸^wjÕÎý{ä[!\°î'ãzf×›k^!\¯OžÂõæì μ[+„ë"úliÿù ƒ7£ÆTW1׫ B¸V­qÙ VWç6] \סWl4£?3lXÀ-«ú²M×ëáW×Ê]b@¸^)¬B¸¾ÏBXî_¾t¬ áºdà á*áz#B+„«NP…pÍÎÊÓ@¸ÞhUûÛöwp]¤þUПu™Ï !\¯ôS!\)Ÿ˜HM"×wV))Añ}xcsYtÁÁ¯ á*A“²d+„ë’Éáz½ÝÂ5£%[!\É@wJ×ë]y: ¢®7»[­¹­Xs)!\GcÏ««®ÒñS\…WŠ™$öEaF„ýqp=ÉÐÍFk+&˜¹`Âx˜2å‘'ŠwÉZBX¿ .MÍû11©EØËp²û„Ø J"újêLùH „ª>pªÉ…ª§AT»÷…à¬=ð¹š{"­h ­VF²þ+†Q„Ć@‚0DЍ"Ã$TgÓ 0’_ÕªÖФðÎŽÖaZU™ô;V}$’>B¥ˆ0zÚOÀÒ'Ó-”êr‘b£Ûãè¬asd"CK!«-­(ÕKŽ)}Áªé[—ò²á_W$Ò’H×'¢º×.odT)ùW…É›¾iÖ'o(h]e‹Ìž€‡Gî]@¡gÈfÓ`d»\×Ù|ö' ¬JB‡ 2™Èî*sÝ<¬„`9Ë;Õ;bìy¼óEçú¯1° ùïÅFäL1Š-Nˆ +™9Í@5ç¾@ Žå]Þ1†7Ïrº(š-ä¯À- ?t´Ê•^U|Ÿ"ð‘Èë¨øÍeVA^¤ —…!y8ë>2›Z ±gñ-gîNürôn¶ÿ3öN@e2Ýc…À›Â¿Ù·ù€XŸÆc\@¿…Ušô6À8cR•d‹äâæ¹TI0ƒL¬”iù»Nµˆ±Ê2¤^öÖ8âX¸0žˆÿPÈd:Žè= o•7yÀÚÁ=ÐTù”L’Qùë;4LåÃUÓ81;<­«ñ2y©}G=V‚ '¸{³Æ…KÌJqm1œ><Î4·¨fzf3&€MÓýbGA‰~\ ô²)ÿø^(†Q%±±­Ýå^aF³ó ,—ýnœ½YゃqSŠ#S6ª^rŸ¹úÆx™KÁ Ý°?]¢û]ø8φˆ¯€¨b—À5o+& :"Co»ÁåèóŒP^ÜåÒ˜ò_ð …÷îš(Jº¬+8q·ŒÈí:ÏΫѡ“{wßvlªÁúYaSme<ÊÚÑåÌ)€Ï”9 «/eâµ(Ú7N-Š¾Ô Ý{?iàx _Gx¦-œA w§ÅsÃçÇñt*ûòB÷æñ¡À'à=ìÃdN”ÀQξGµ°ƒÄW¹ÐÄ 6Ç8•5†OÒë4èw\'ê VµK˜” ÁÍ=çÓ…?ñ| Ÿfj‰ºX2¬ËùÁ=‰DÅ‘‡v˜ˆ §×ãnxw𬱘`;#xñÉ1¼ ÓÖñ Æ*ž5žëd„5æ×x¥ók…”ÒY-"a®½p'¥OÀè‹…„£Û_Lhn3¶{;jeT…wnO$KÉ^‚³l ‰rpÏzð-‘m1BH>FÏÑpœßmÜç’x‚ÇaNÛsrXß%2ªŠ‘°k;ÓTØB­º` Åhmø¾º)ª,³äžWÁ…ÍÛš٠ϔ0†Aªkùëè‰Kâ ·×4ÇA´t‰)HN Nþ|£ñ¡†:ëJ5ÙVaùŠÀ“2õÚc $aÁÀü±Å!+=}5\þ#+¢öç—aqÝ?C;8 e£ÞŠ˜:¦s÷IbÆ—¡|D€˜»;ºšÌ«†ÈzZ޳þ<œŸUõ-P‡Hàb2gδQDêZ®ªK[üŠÍ©‹Ô ù¬R9)NbÔz¢„‹Ï“X†pC‰*yfÀé0Žx¢±û̯&lcÂ>®×É.rkaÂòbaælêšé¥O²ß¸‡uª1U®¦s„¦w–%ÛFÖÙ‘S…ÅO…:¢È§i!°ê’òÂl›7Å(<Ò>¨ð=Smð`ÛX¦¸SËõ„&ðtuQ™i’Nº×5x2k ,”Mto(„°R)종B¾´ÆlIJ–ÏÑâV7I Q2dž-žõJ·‡®Þúé'‹¨Eàµæ>{®z´”=ñ€Ë•?¢šâñ,^BíïÓΚÛüöòÍÃâp“ãî ˜¨Ùv­;f€÷9áY”_10rÂIv¼ë*2Sïê±V(DA;‰©¢+pAb¥„$ 5oË{^¢r(êžÆ¾9 pRT3dxcäBŽ-ÿfƚǖÁ§É$ÛÏ× :üÚý8ì„w£¾>ú vr¸kâ¶QGãNŸ1Þ¦¾{ðÄím9I!½×§.#7ONŒ¬Ÿ?™ÊÕõ~rpÞl¥‚Tø c9ôîÍíË´Ò™u:fÌd[—'`vØÏ8ñ„{Ÿ·¤Õe(ü5øÎÄTÐÒo¼t,ÁÿÜ\Q>C Ü$€÷’Àd£µ 6s²Ñ–üUÉÁ™\:7ŸÇ¬Ï’œg]xœáýn³Ÿ˜Å{O^ßà[<äˆ_w__þ¢ö¯% endstream endobj 4974 0 obj 7231 endobj 4978 0 obj << /Type /Annot /Subtype /Link /Rect [196.500000 300.500000 239.250000 307.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_interfaces >> endobj 4977 0 obj << /Type /Page /Parent 2 0 R /Contents 4979 0 R /Resources 4981 0 R /Annots 4982 0 R /MediaBox [0 0 595 842] >> endobj 4981 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 4982 0 obj [ 4978 0 R ] endobj 4979 0 obj << /Length 4980 0 R /Filter /FlateDecode >> stream xœí]ËŽ·ÝÏWô:€[E²ž@@–åY$ ‹ ‹À޶%‹ü~º§«zfX}nO_²Í‰”á‹Åûä}¾ûãç¿þùßûŸÿ}ø¡ÿûÃç§âØTÅå?‡óŸo^ÿÀ¶Çþ߇¦­?üúôõðõéÓÓ§Óÿ~}º<ðùßOÿúßÁþtúïχ¿þíôÃû_:ÿ¯OiNÿòüwטӿŠëßçŸÿëé/¿;üvžqx]¿˜·ÿÿ[Ö¶çeL¼úëÓð™æùÏøíéÝeÂÞRÙ¢¬êƒ)]y0]iÿùÇÓO§ ÓÇ®4¦©Ë¦¸çEÆÕ×W™ÚÌisü7=ÿÑš?Æìµ9ûóÚõ7Æv<»{~KSw‡ÓOruú©ægxÓëîÑeò®«ãMþ¼rõ]9qŽ‘gW$®1¶è7¨«‰»·èÕô&·'Æ6ùóÊÕw¥'®0»&quý)+ ú“—]ÄÉŸWÃ^yvMâVíÀýÎEØ¢—é#LÞ˜ˆÄ}^¹ú® Äųk·­›{r`õ·è:}„ý?‰nDâ>¯\}WââÙ‰kíàñ8Á¡z™>që"žCuY¹ú®ôÄÏþ)d¼”ËOÀ©î«ðà·_žÞ}oJsÚÌúðå§ÓâžßyùëËyáÝᛳ›ßv‡/?~_îû?¾üüÔk[ k¼ŒØ÷ð‡FL ŸùŽ| Ã#&ü=®%ÖÖÁ=À³Á½öí|æÛðU[¼j¸üLW`šð÷¸Ëª?~9ÉWtѨŠvXP —º·‚(ñ±JÁB™Yx A1¡pZøž*B† ¾«.ˆµY¼‚‡QjÂ÷`N„&LxþRÆˆâ½Æ#;£œƒ_„ß#¸P²üžŠ Ö;iM¥mÖcÂf²ÃdŒJÞƒ}_ÂSc b6-Ù´l—r©L‹ Ø ]%¬>SB9Å_jðŽâµÁ÷¸oSš°²¾Çc‡âd!c:Ìæ„Š˜9Ÿ3V­R²1Ø*åÖ|ÎnRµZW‰ýr-fÆê[xds]Eˆ•€rH‹-þÒDJ­ÀgìW$ŠÿëRÁ#©¨Íx6ãÛ¥Üòf\аxß°vÁgÇT_:þLä|´åŽ„û.áRë ¯ÅvKmAXMY\S ™O7˜×¦®ž×ã Z{l»âíHÏ0·F. SKw©¨÷ õuYØôΛ¤¨žàާÃ}Û¼þU'é•Ûgðê{EÕΘ¾×\ÕÑÙÖ¼!ë â3¦È™áÛÆã±ìS†+"áf—àÚŠÎV+€³Ý¡ëc«¦ôySÓêr4nÐÈ›²c¶%øiy¾Ý ­v¾Ó´S³Q”Ïms͉Àò˜±1‹@†3з|8¼5ß½ðÝ»ò-³3ˆæË2öyõý§™òh§i,zfR·Þب^-ÞÚö ¾?SÃü \[ò½EøÍVÚð½Æ+èÃ7VЧk#ŠâÕ?¿ò‘ ­ßÃF÷÷–¸8Öy»‡—}7Õ±èÜ[ƒWpÙwc‡¡ëHŒ¾Å•&Ä÷–:ÂG0øŒùŸ+NŸº^-ã‚Ç]á€Jx.‚JÆßèqâX-ìÎèü3ÿWK¨ÙxÞUåëhFûdË}1vÒãƒßpìô]q&pD1 ! å Øzý92Oa°ùA-ƒO›„ã5ÞsLI< n¼KË«Øå(¨ºÅã,fì(Œ¤”X‰àÄÖÈSð‹qXÎ&pL¢€@Ò‘ý!ÄÈ~€^2³¤cO]é{É*b(ä°uI”Àî,&¸rú(À]bT9Ïi·ÞÃıfÖ6ßwtŸª‡’ì¨#Œ¸&{E›1/#Qîë=ÄO˜Ÿ1GÂ…Žˆ‘tgtžm¾ª”ϘÁ*gýýgÒž&qÊÇ´“š"CbméQ)#0H«^ CÌ‚¶õ%wƒ–eÎn%á/ãC©°£ó8aж™Œo'ë¢ó¤ ÅCÂÕ©xo*áí†Ä„Ö\*±xºŒI}9Âr ²êS~ÙMo!CÄQ½ÞSl¦†EjdS—?fëÄ“ÇÌ %ág†lyjlÊ›O æÅ}íò!I,óºn&~† HÂÔÎ矩0DTxPë­†i¨a`áÎdµ‡ OÕ¾j*0«Þ~Z”ÎÒÕTØW*ýš e0%Ó±Ÿ YmÊuV—)¦Ó–€­Ø´õ EflÑý‘b±SßÅ\ÿäo5ƒJ1É™ QÛ|ƽ¶ëö>Ù)¶B="k¬ÿ 9\»…pmD¶¶®öxb/À‘ïc#y¸ßÓXU•GJ§âOÂg«?TÚ‰„3su_Â~•Ú uƒkÎRå~é{+çU;7¹R\ç äÔqU=ä>ÁÕp›6õaü²I]³;ú,Þß±öгºÚBÐãplªj•ÒTXö7°ï€ý B΄÷`Ndöíaüa6¼× µ!WaE¨3e:àÖáÛ5CÍ\ª ßÇÑB•3¡!•»S±d0ÈX ¦?v³õÏuwÕ/©’M9¤ƒ”Î‹Þ *]†×zßÝAu•ãó^èÊz<»¨q‹¹_n¶Fe×—‡Í¡2UD 2anîÆÙ & +¦Ù²Æ§b4az½Dóf‰—ŸÌú6ðm¥/cœˆß@rðÊæV0cV8Sô™ õñüü¯OUí^ÿà—§Ï‚ Ä‘ ó¾œi[|…×á¶—ýÀZ w¿†T`ì™&–“©÷D¤HWŽ8tgÀåªÞªšÀ³acº¡SùËÛ<>ãïÁ~îy`Ö6ßg ´Èh’€ˆÛ==ðªGU¡ï“#*ì ATÏ`K‘6Y¤¯-<_'LnÎýƒ¾Îh;VwúNv ãA06 ëøùRg:.UÏ7º½Õ5ŒÆâb÷m~‡n·2М‡u*öD°raÒ¦UÊ$TJÌfÓøfN—fªijR·Í`F€®`̵n #‘ñÒÍ~îåðɇ°Â"&D!$Á¼<¶Ð.NñkÔ³DÖZHÃÄÇæ1…õì'“ö ¨¡ ÒD‹7àSö“¨“£rôªWc*C{¥ª QüfjCˆ‘žN "mö.M¬j™BÝøàa/;wËGg²ŒÔ?6vþQ4Yè¥×àŇý2raQS‹Î½]d¾mÌØa(¡Í¶uå‰ã•*s.òiª¯FµxªãÊF wY]2íÎK2“aC2'j¼Ã¸>ÓgB©mfw¢›±Æ•¾Û@¬{¹&Óz¤Q%Ù! é"ItNý®›uˆ|þÐéöI•úÅz:•o9–0’È|±‚"ò´¢3kmãÙDæøÒÑöh®N‚¨˜ë¶ìÏèÕéMƒÎ´Ý¦ç0DÐ&ÄÙÙU¡Ž¹6‡¸;ãÑÀ½.1„ä7ܸ"\ý‹á{R‚VvÆLÓCWaC¾ŽÁnQ…¯£àøàÚ˜0Iõòya°¾eј‹„ñlXsa7¬Ÿb´¨ÝzOBPÄÎÍбºò¬ -)@2’® Kú8:€ñ„¨QŸ‹ØÑ5k‡9‘ð; Öч$ÕOu›õÓ]úÉb¿qùkà8WL5=>«-ï%a*({/X?ŒýÀ{­«×™Ëfðù[ÙJú:éI¶mî°,”5Ê^'M„Gš%0©ŸfO |8iÒµ›©ø³± [\/ýeøEŒ~ÆJkwgçS‹$ݘKU¯s ®_[ÜËß(Wй)Ÿ^Ó^®"®<ÄôYùÉÀ­\²/ƒ½Bj…Ë›ð{¿\ˆv¨ò ã1>ÞaG±Àš‹àŠZË\JÆp¯*µ…KŒvæñ§ôMqOÞ>¥ïl®kBÅC"0kšëK‰°þq â¨ú’jìÀ]ÎDkI@/ç¡Ût¸ðÕF·Þ3*™ÓmOÕdGÔUëÐIµ/¢L¡åœs¾fIuu›®a}]_÷ª†¾ÛW¤#ú,T¦˜¸¶ãŽ¾Å˜ûÞtÞ¾'êUid”þ@Ü“À4ý­;‹Y5ó¢æ_!FT5®îp c0è¾k±á‘ÿºò”Φ+»c‚ñ–ÖWÏ›ì¨bŒ,Õ–²`crgZŸ« 4+fßuaÉG×ãŒ;7  ì,27™. ™ì„7œ±Mt êr¹Õ‰å5õIcè¤@¶<}Ö kð…’ ŸÝôáo[I•x;Àˆ†Ð«‚úg2ÕÛˆ²¿BñãâaÜTX‚è·€#|–RÅ®¥–PÄë‰Iß#æ=eé™HœLvùqÚ#sVàY‡*p&ËË\…€®ë%º5‘A…^óaxÍP“qá´ª¨F —¼TÇœÞ>û@©{²Å–pØ|½¢|Ò‡R0²|}ZB«’f)‹É³ÿâ(_GP™\âRÝ[>#‡ì&ï-г¦œ¦CDžjõ&&¥p+U±¥-¸»’9P1Aõ}dA’é-Ulå{ɖЦºt2U^>çå6ž—cÒÛ˳Ý:o¾.[癦‚Ù*è(-Åϲ"Ý­"ÕénItLÛ‰7•*ß¼©#ø´YÜØ”žm\uæŠ Q}ÔÚÃé¶GWdó9ïÉæWiZ¾Ì=¬î(ø8ûVAiÌû&}i ù­ÄàpyG)À2ê냑àUcÒBÐH HÂ.h°Îæ æÌö8àì+%ËÀ-¼Ó§ÊMЧ7/lË2ÜùßÅ âGô.[,€÷²@2(glf_f8çW–ƒé]áWÓã*¼FÈrÂwá÷´÷¼)ܱW÷RÞ½*:ÔˆŸŸžþ~¾5Q endstream endobj 4980 0 obj 5201 endobj 4984 0 obj [269 /XYZ 38.2500000 601.250000 0] endobj 4985 0 obj [269 /XYZ 38.2500000 601.250000 0] endobj 4986 0 obj << /Type /Annot /Subtype /Link /Rect [76.5000000 680.750000 120.750000 687.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 4987 0 obj << /Type /Annot /Subtype /Link /Rect [139.500000 680.750000 179.250000 687.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces >> endobj 4988 0 obj << /Type /Annot /Subtype /Link /Rect [316.500000 490.250000 414 497 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 4983 0 obj << /Type /Page /Parent 2 0 R /Contents 4989 0 R /Resources 4991 0 R /Annots 4992 0 R /MediaBox [0 0 595 842] >> endobj 4991 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4992 0 obj [ 4986 0 R 4987 0 R 4988 0 R ] endobj 4989 0 obj << /Length 4990 0 R /Filter /FlateDecode >> stream xœí]IÜHv¾×¯È³®f,܀ƒZ2àƒA|0|ô,Æ g`yþûÎ…™UÌ/Èøò½`Åf¤©¬ #Þ¾|ïçýöÇÃ_ÿyøùÓ·ÿ9ü6üýéÛSõÜÖÕå?‡ÓŸŸ^ÿÀvÏÿmW~ûûÓç¯O_ÿûãéò…oŸþýø¯ÿ;ØÃ¿ÿû·Ãþ×ñ‡~éô jM{üû÷óß}kŽÿªnŸ~þßOÿñ/‡œV¼>nØÌÛÿÿ“mŒéûÓ6&ýãéúšæü矿ýãéçˤ=¥¶ÖõÝÁxç¦÷öð¿~úËñ×å«çÞÓ6¾­yPkOO²M0¶¯Îu£ÿÈ,ooªFoñóÎÅOŸÆÄW—¼Ü¶÷—j…º­®qü&áœw.}(׫…‹ËÜìñ1ǧ¸ªucšãë´ÒoñfyÙãV?^¬âê罋Ÿ‹íÛè⢷k+3БŽèe}Õ݉mÕV?ï]þ`†ûÅ«‹^pÓtšì{[^åZëW?ï]‹}á⢷۶íp@­ÎÜÖ×X½÷š«Ÿ÷.0ÃýâÕ%/Ø›J“}_–׸oEö½ì]‰}G‹MYïäòàÙýˆ|ñã÷§Ÿ¿˜ã¶¦9|ÿËqoçg^þú~47ëÃOG“Ð{øþ§Ã/UeüßÿöÔ?7¶¾nqê÷ëù“Ï߯«¾Ózz?ø“ÊÁO>ÁO>ÂO,ÜAƒ>±½äj¦M?ûÞ£{û ¿Ó¥'rpoxµ ï~bˆ]W¿¦ßƒôæ>û˜‘ÏŽî-Ïgoâ;ç[aJúO~â«tÞÄr#˜Óñw0%õ©¢ëV¢'jÛìzâ!=áGÌ XzâïÀ7ÅgÙ5Ö ð~"ÚÊŠÈðw°ƒ§“KZaMµÛ ùì…UAêuØú€÷SºõQû:·õõ8ÁµëüL}øN°ž¥Æ–a¬|‘Å2K.‚Bj‚k±Õ¡D†zEo»‚ÖÂÖlôœ¶sÝøµØÎ»>sØ~z°_7Ó¸îíe™ê¹iM×Ö#Ý=w}uÞéË'}RÕçOÜsí›Ób#ò¿÷ !ùgï.å !ÓÞùd0^Òvpa³n΃EavO?'ܾs‘NÆ=;Û[?ø`â#¤WÓ¾'Qšõ9DŠmGlœÉkÖb´åómpRÃÕWy÷êê\:ºŠ ôÏÃ&œõ A¤X€gZšúÌÛà~)Ǽ5V>ýÜ#»fž©Åv„d(¾id˜^§ž£+nëÎD¶‚p”"Ó5µ ™.›áÚ^íýÁ2õsÕ»·4ÎH*BÕ(ûÇÖ‡†ø>Ÿöëã4£ô¶™wfþ=œŠøÞ^]ø€†Ä½óÀf ;_¦¾°ÈfGѾ›©‚²&é/sE3"Š™¡jý¶IÖ„´Ò®twæ– Z‰j\ÊP$œÈ5Ƨs×:«¶©ŸDÖùt Ñ{ø«Øa£ "" ›bjb'™°J- ŠDQ»¦TÐ Ê[’ú6†ÎE5Þ×6ÁZ3(ÙaL´kD TüœŸƒ +?PBõ˜0Å–¢¥›EûkÎì¾L-–®²q}ŠÐm‚‚hj¡Î†g¨¥ìšà™‘Æ'Ì ²Õ„Ìj*6ÑâÁˆtZÖÌlŒ›Íù– b1bÀ‚)(ÍN™ÖÜçÕënR*ºJ¼§£áûm{-''O7~× :êÍÑË&¤û$ Öé7Eî›á9Õü¶0F¬PQ΄h aeàWÏen0‡ >bS2TxøÔq-h"ŠÌQb\JÂR¡aD*]•aæ;ðÙz°[wSf82…ë‹gµ5ë¼ÀÅôòT—ÂH¨3Úd>ÙP@"Œ=;Ÿ(¦Ä†R¢å““R^èÇûåv Ÿû‘Ek‚“Êe12D¦ s1x4¦s'C¶B,WµE h :¼U».ä-QC–Ê´¯ ¢òD‰œÅ9Ä(þ \Y^¹­0ò`‰Æ¹ȈFô°`S+%™Ðgw2~ÞšQñVï·‹¸0¼Öì‰&ò& )º›“šáȺ ¤û;4T É,kŠ1ý–Œíœ)—™·ÀØè#Z•-HdF3ã)d±b¢gÙ÷Z¸™7Âíò“YRÑ$˜¼MHEeU‘ø"FFãâ]ù”•/ _*쪉:öÔûȦñðj >3Cyê97[çÂÕfÌÕ'æ<ó¦}>}ÿÔUéª×?ùýé[ÄÒ±£Î{ )&Yv:6*-Ùz#g¶Æ-è<&øçT ƒ©ÍHÀ¶à-Õ݈/DæÛ ãæˆ É,Zo_:Ê÷ø½þÅ@ØkàŪ<¾\/ç<ãz^Ì%°Â92-SÞ–xz8œÈ¹9Q^À»ž¬ÿ–â,¼7Ù ÐpµÈhx?˜"õLå>æz‚"’ïK>Ü%ñ1§A„Z#¶Öºb±¹ 6xÎuµöëŠ\ <`¦›‡ê˜!Þ'/§ôæ£ß¹+öŠc‡#(Ž±Ù„?‰&>7¨à"f-ü¤dsÆâÅ̉O”0t°Á‹Ï:âĈº7 Á¸ø~DRK6ް2U-Yu·3:jby}_–Àò*Œê'¢9‘(GÀ§ÃxµÈÞðÂOò2ší`—ctÈm«¾{„ó±É€©‹}ƒÁü€ñˆÈDD%aŃi«rl2`¹ÈÈF]F)l:2Ÿ[ĨÌtn êÄòFå:5g^9ß´â2{¢(ÝÛküe…m¦¦òÁKì ¤ÚªÑÄDíÚ€ŽJžYþ*ÕôB€>0õR²]ûdŢ溉o\»P±­«¼k¾ ÈVïEÔVâþ2,_RÀrd»»*„EGÕP¢nËZoá«‹0¬4­Ê}‹¶'¯a¾ŸpW1UbH êFnC—'·¤‰u1@Z½ÒYË÷¼è6‰k„A•'"2‡3’’x÷¹ªvÇ3YUÓšÐò) R)‹ëŸ OÁû[Ô‡‘‰}%qR®‘uÊž~ÛD×D²®!¬T>}®¤ùòƒHE’¨D ò$Üv†ÐN³Í T"Z’—\»k,<ÆÝ¸V2®5{š6¸EåÒ´ÅF•iOÂaFk}¶ôPÒ_¥EÌ7êÕüb­\léL1±•ë*¬:îi/ßATšMeî MÕgÖá3‹µÝÒò™L¬Èé0ûLSdt.~0Þ,‘žÙJÇÒ¨U‚ICޏ“™¢õ÷Ì‹iÂŒù‘=¿[ÍÑu T¶Õj¢|¾œ‹¦öH\´ƒ¶!conú¥l£ÖÓóK/Þ]ÜQ?\V›îûNh?¤JFr5&ŠNÆŒˆ¯}ÎfYs6­ï.xGrE—8eg](kzø _«¿ÇÃ}áj7ä®ñwàjƒˆ¿wWø9-ü~Î…º›g{©ixÅyx×_&SÚ®áwn‘ý„0ω¼<’¿~rLLF(ïq ñœÈÂsóý Ú>´ï!½áïä¢^üÍKæ×c§x|sJlàs>OÜ©¢LmšÐ~‹ì¿6@?¥s&>ÝÛ´ƒiKÐ^ä}0µàrq,°ÔÀ{[\ž íŒwJ ";`t!Ñn“cF«E$š:†ãñy¡å²æLSR¤£†rÊŠ ÝûXG&O‘‰hfÇ{ÈÖR ŽbT! “¿b†ÌŠöG0WéËaʉ†ÙÉ'eJ˜1š >¦`žêÄ>IU¡®&dÌ!"Ê“™4퀥5C♚ )!¸¥"kL@~{ÇíRéâp¶ BBe˜‘]BO?¶¥qR‚I=dª†aà‹"XÐpµqÝEfØÞ jsåÚS·d dMoQ°1ìHç*MX[L[U³í´Qµ5E>L£F&XÀ×é ½½$úœÛK®-®³Œ£¥ø3ÉQ¸¸7a¾±¼p•—U\&ÁlÊTì“S«“4­Y‰°îK¬4Çv3Û†ˆ(§”Y¯ÐˆÈ «ÛrÙxù6Ù¨ÙÖÝ ÆÂfþ%…3# +ø7 Ý5•ÍÓ5­ÝÐJöµ»i½>ÓÚû*¸EmݾBÕ—fï½_ݵ÷ÞAp¯Ì‰™­÷¡[ÓÄÌÈEÌ­;®éœ³ØqMÉ3H@DfLbÙyN"91Qdúl$#V5²™9H¢R&BÅ#›)i£Ò³•[³ê“ë‹!)^Nï®ýAXba ®6‰T¨@¯/â)Âçà¡5¦…«aoBöà÷‰øÞ¸®NXÁ;ˆ «ÁdÂs n6¶¿>R#ú.lq/à04š#‹9(жnJ;_M—f˜8ùòÖ™-TÀܶÅ' FŒª‚AÌ´³ŒõN8˜TWá$4F¥@ˆ‰#•w„®è9 M ¤bɹ¬Aìg ·ÇsKŒçN†-•ÍÁ‘e´¯G3¾Ô·°5áe‡&‰•Æ>„#©õ‰YAgé¡;±õúµl`0oœ ` {<¡˜CÖ H@–#lxJ ˆ4},ÌïL`|îÁü=˜Þdñ›-ú‘³Æ;€w »~ÌÉh·Ê ¼!&ï`kb5&S€MlJÈœcôÝÇ _É ,aŠ   ñw^NiÚ®X–»ŠñoÌê•,Ü11cl|s˜1j Coñãß)ƾÆf6&Í@ ¿ãñÍAæ°¹)J‰˜ƒW*òáPúß\VK k&_Bö“\ÖCM6©âFía/‘ði0k0j¯F©d\®‘“úª~€˜³T–ܶj}ÎÇmù}{ë~7±\x›‹¡J:W“¿¯Lý–ŒÒã(…/P½|¾~˜÷š”‡RnÑ’mˉ¼àüh¼òçÊÒl¾[¶èix£äðòƒ&æ,ÞC¤ZY¤ÙÒߌ4àün( žp#Im T½W`‰7?/M)1&c=¶†¬.aLŠlUâ‹õ/…ç³N,Ü%¡¹ºv)®aèA…H.9Wm½oÚ@j÷ ,š2¤Ò„|B)ÎÈ–dÜÈ „Q*˜ÙvÑAÎ[ÌïöbÑË©ˆóyÞHo¼†NËÆ0’²ëåmÛkš#«*d©UŠÃìÍAØ#Ù:ý—¤§¡ÚÖ…*l÷aV¡´)&sjmóåØ+É–EÒm -ð̳™A£ð™Vµ™®]cµJ9Hƒ•Le€2D…j§IliýÇ¢]¥²µÊÀŸë4Eöú•$R®_ÎÇ3ÉïNÞ$…좰Ô4,_¾Žqyàúâ0Ã3(óîÚÉš r\xª&4ÌàLé¢Ý±”=‹„tWD¿ˆêË”Àþ» &Äisâªøã¯¼US{ïÑÞ{”¼ëÉÞ#©þUQÈuÛÁqç$n–Ç{Ã÷³xËõpúf¤é¯mÐ*`•¥e僗Ø(…hÆq{œa9öc½g5 –)˜`î ‡ °×Ê€cf·¨Ün+9'kEmGÖ¦Ù%àš$ “vt2`®WÆi&²#Ì\¾0VQçßzJL"WG“V…W΀´mC£ÿ%hñÍgš7#—˜Ä®ñÖÙ+«íñ£=~Ý þ¯~äÂ6Ý[ÛQm~)!\Nej07;ªÍ^4ÏdÝQm2=‹k‰Ë€jóJî¨6sž³£Ú̱-vT›vIo¦yïežu…ô2«¢Û´m  ÷6iFßímÒ{›4E\â<ÝužËì´kÿ_6Ò­È7v@|{aœUyiïjw7Ö!pvÍPÍ9·#].‚?c›P!í¦Ö*$_¹š;ÜÌ<µÃÍÌ9ónFÍÆ}g˜0ºˆ;¡Í•æÏF-L~î-âæàç´úÖÐù]ÕL¾€vÌ*m’½ä$‰ Þ3M)Ò$VEQl–¯̦;4Ph4‘|ºùŠ |a¼$]¨¨×÷Ç?‡ÇÛŠ^æ×©_˜qÛÝ]ù#ËTæän³l‡¡ã÷ðÂíáp SÙg{q~_}r¹ÃfüÉ03×>à+4ð2EÏqSý+÷ööexS„P„ÒV˜Íø9‚›>°¼ºó¯¿3Èy“ôê¯lP–àNÿ>îøºóÏP× às€$0H#?ã0i4çW#$od0ª_- Xð!ÉEÞ ?§{üÂÛÊ=ÂbæÍÈ÷ëŽI‰øõðõéÿÑA£1 endstream endobj 4990 0 obj 7291 endobj 4994 0 obj [270 /XYZ 38.2500000 94.2500000 0] endobj 4995 0 obj [270 /XYZ 31.5000000 129.500000 0] endobj 4996 0 obj [270 /XYZ 32.2500000 128 0] endobj 4997 0 obj [270 /XYZ 38.2500000 94.2500000 0] endobj 4998 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 599 531.750000 613.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exceptions_from_directors >> endobj 4999 0 obj << /Type /Annot /Subtype /Link /Rect [75 72.5000000 126.750000 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes >> endobj 4993 0 obj << /Type /Page /Parent 2 0 R /Contents 5000 0 R /Resources 5002 0 R /Annots 5003 0 R /MediaBox [0 0 595 842] >> endobj 5002 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 5003 0 obj [ 4998 0 R 4999 0 R ] endobj 5000 0 obj << /Length 5001 0 R /Filter /FlateDecode >> stream xœí]M䶽ϯès÷Ф> À~È!ÀbÈÁÈ!°ã†mdãCþ~º[RÏ4¥G‰¯‹ÕC/ì]V"YU,V«^½ùó—þõûáÍû/ÿ9ü0üþþËSqlª¢ÿçpþõÝËèö8üùдÕá‡_Ÿ¾¾=}~ú|úï·§þ…/ïÿzúÓÿúð—Ó¿?¾ÿûé‡?éü~}jTsúý—Ëï]£N*®¿Ÿþï§¿ýáðÛù‹ãpÃdnÿÿ;]kÕçi, ýíi\¦ºüúý‡ßžÞôð¥Ò¥)‹ƒ:ý÷ ºRþûϧŸNŒŸ/Ž]©TS—§îH™ú2TS”ªõ¡j&]~ }^…øziTÀ¯_æ.NÝ5΋r·®Š@Æ„ Ñó÷C|½iuÀ¯_æ.O˜¿øë¢ îʲ'‘)ÊDº~? Î,ÈàËÜå 30]’Á•QmH??ƒOÿðë—¹‡b°ãë¢ nÆ3,ƒ›gd]˜úá2÷` Æ_?¶õðü39v{&šÒædÞÄëjÛ}öù&Bÿ`¢~s¼øîëÓ›OÝAÕ‡¯?hr°ÿíëɔևïÎKU¾þxøcQ”ÍŸ_~êŽM}ÚáÕe~ý“¢¾^žTG£[uûäýåIy<ÛDÃjû'Ê_«.O̱*ë¶yùD©ËeÆ—V¼S”hnŽqÞõ³~þ«..l”õy•ðÀ­õ‘ÒÀ™sÔ“ÚžÒfÄÁ‚¢ð;x¼ Z¨b5ñ_u¬«…bŸL˜à ÁdŽŒ0{uXP7îMkVÚd­¹'­©>@ö`ƽ%4EXíì 1&q<QÔUÇ\÷‰p„P½sãØ´é¼ö“ )ß¶¶}¼F[9 ü5B# AŸUâã¡…±*ÇÁxb]ÙÀfÔŒ~â±z픥+en‡>%#éÿ‡#1ôð¶§µ€²ŒMkljºFÅl~k­C!Eª¶Ö85{r²­×ïsÝ?Qjpìaé·—ãøÞ˜‡WÔXD ë®l®¦ôÜÄTÂG¹èE­ƒ\ÌšñÇ /­x’ϦD3O!,âèÑôƒ8ÈY\ޱJ½¾»÷‡»Ç_÷}Ä {9cÝà {x›³ªÊE5äˆ áK{e²ç±‚'æÈØaŽt¤d"5Ž˜ªí øÄc±OB¤\RüÚì2.Ò 'lÂ9ŒHÆü÷¸Ö`äÉ·NØN/ëÄÅÚ`\È+×FÙçÝ£n6ð€ì¥Ò6p4;¶ÄîÆïhQÿœ/L‹õ[O&Ûo=ÑëçX«>‘7&× Ñ]‡[Þ5¥¥Þqî‘ÓÆÞã÷…ªfâÅÅ´¶Í9JÛç(9Î}ì³Ê£¢— Ž¯aæq #jŠdç_Ô¬÷jÊe"¶/c911%RÁ)›×ó}9êŽ'ï¸[ÒÒA+*K¦äØ,ÞÉ$êÄ_Æ($’ð­<å”ȦÚb§[Ôò§ô~ŽQÞµÜÀ_A ¦´¯<ç=E>üƒ–¬x)îðø¬»Æ:>wXùÙèÎZÄkˆ4­Íº\u´S^& +zÉþ&NÑvußÛgàÊsüÎ’ž 8¬ÛytÐ~ŸMºÞÏÇÊÇçV€p¥¡‡H/§‘X“¹MÅ>1ݰO€£Hø>#‘I½ƒÃ5B<±+yç0r˜4ŽKƒ¦*Ûðz˜Ú:æÆAöy}(’©ËË^Ø õÉÁ èÞ™RÀ„ˆ*xªNPÕ J eÝCœ\ªf›Ë¼°¾1ÊÞš‘0­ \7€k'02ž®ª€3PaŽƒë 5 1Ò€AæÃ_Sðkª‚㨠Ýp„˜?¢¸~Ä˃U/?ש,Q'd€vp²Ÿ÷y¾ËY5ƒT O^ß JP°—ÆÞ ai •›òUCU±•±ÙÆ€ÄâÃÔâ'¢ºŠ;Žpæ*JÔÄŠ>VÊÞËQá¶ë+rE.ù-rɯ{|ÉïݰNÊZqZÑ‹§X» éZqÔ]SèÅ©Rhï˜]˜$XAÄÄÊ+ibk<¨ï:ǬRðq„J<7ŒÌ(\¢Ë„cCãqð¬l°„¤’©$´ܯ!Z|Ç¿bÅ'á r|2Ç'ÓÐñŽ}ŠÏmÂrˆkähu‡‘CF›{ Ù›pn€]zû4«Xͼ^’Ɔ8c ;ž`cJTz³!î’‡!Žw#Ö×0¦¸SÙ!ÌÓÅ4>Ê{ íò:Õêš4‚£S±’ËZ´ôH*Ág¸2ðHëo-*Ùe'Äí~XÉ×Ee [Ê–T¶pœçJÜPc@ XW ÏR™0@TÿÀèÎ}Ĥ¼ë³ÿO»$c‡´¯J[ú)íÂ৘•LBB†â¢[1fߦ¶^d?Zw´<*ì¾Ãwp˜ÀàÀ‹ìR¬NK]QCFº¶(? êo8º_<Ñþþ¢‡9ᨖ_¯~´‡¥C@G`âr^H›N)Û¨[¿™)Òm¿Û&WÌ&#ºR7JxO%ÍþGW¶‘ÂOÌõ@ ­waì •?*šd×4·Ò>—΂aˆº̈©mq”,@>Ž*|Ž™µ—…@÷pà¥x¨'š¡œÀ Š:pYð‡Á•p ЈrÁ1³R¼çˆt=éÒ1B‹9h ‘]£Ø»zTwXáâåáœPœ]) „K!õ‰*vD ¤Û0·(,® S.²˜ÒJL;Á|M3ÿÑ0¢ ;‡Ž#j§rÀ¨BcÆÄÁ©Î:yé8.E¿FA9GÄ2¬Šî,Ôý(žÖ0Kìò{îȨ{H]{"<ów©@Ñ ªlï Llu0­§±:vfD›¾Rus)t7¼‡£Š2ñÂûCÕàPÖ.÷7;õ@hë,²w‰¬c=DÜ‚ŠÔa‘eÌaì×`aŽ±Õ ª–¸R ×à ÀƲKcQÇÀ=—ˆRÓ×Ôî;S7_Äs]$ÄÔJ7ÝíJç2E—/ñ…ºlûúÍSác%ŠQ×°LÁeTˆÆ`‰iL­ÓCüÁrä_}M¥„^o …EªÚR²ÃqàaëÂv¤ÃdoÁÊ”…=XHsBÙ+«¹R1bœÁv {îIçg=(G¥ Ôt!‹´›Æ–¢º“ª/Ú\1ˆ”ŽÜ7¼ƒ\½²]õJ¶ ’ÜŒAmƒ¸§EiŸ~¯Ëêèj›ƒÕ1·9²a÷ÞšÔT<0^ÆÃB‡s̃öPד}C¤;ªJeQdK«7×¶m-B4¬kùž`qéb‘OH½QNH·yÉ9]âˆ{1•?÷Tmä`j¦rÁT •‹7STŽßÄ ?kÕ¼JËt6 áAX—©‰0fe™nea4\x7YàrÒíárR&HIŸ8"h{R>‘N¢{èt¼$Š`+S©Û¹Ï¥«ä"Ø\ûlƒI¥Öå"Ø\ë¤[.‚½G±7Wu—‹`³Ö´¯¯“Žƒù¹ÇŽƒ?²%µ²IüÞ>->åYWp72jÕaËãYc}€Õ*Ö.Ä8Ž28¢ÈÏÚa=Oû4f†|YŒ®Œ¯À9 _!ñòÁ¨Û©¼‘&ã+Œd¬ï)>J9$•ñ™_æQ™¿KšˆN¨´¾C,2¾ÂHÆòèš\¬žñâuÁ|="›ñR$e|…Œ¯ð¬Ôš{PÄR1Õ¯iRÑðêjô¶O‹N(S§83”b•§î T‚*öHŒÔ‘jëÊ‹€h0uc+˜Q»X6‰kæG¥;É·\¹€z±Tz¤×-«,Q™¾¶ò­V‚ö‰/,ÉP0=‰b•p8ämóô[ª ×pª¯=)ÚY1!öà^3uoºŸã\àRÖ§j kGÌÒI• ¨ê2b(wKѵki…"ƒÊ€MÈI°‹°ù±À1¦Ý´I7‰¢©–X%‹òâX&D5ÙnŒ6 aÚ0ñ£U‚,T £âD‰²}Ü}ûøÀ×ç2 ˆ…´þH¥,F ߸ìÿª*Z­-ÞÞk6à;)×Ê/yÚ!Á¦'+s‰ÈmÖ±YÇŠéX&~ÅL‚Ê&vhlÂ4fœHÙë¤þ®ð ȃ#dxJIÆb• »^œ…‘‚oÌ×.*e® üIWX.˜>£†/lrÚÊzîÑ 3fKœä ˵q’·Ây—¸BŽSÂw Ìz,aZ þšÂ x¥økx=EÊRtz|{––ÈWÿa÷‚n kyX4fPÞ@y¡ô³ÆØö ¡#Ñ[:‡+$á²nßPÆ¥Ìø‡²‰²ýB0 «—tQw"I¢7pŒÿ$Kï2›Ú¶1T ~‚DBM; R–žTím5Qí°©BèžCXS¬¿ns™OÂ1:*Ⲝ•&ª ¨<<¦ÿƒl‚y,âdÒ¾d³"£*[Åc6m¢K[c‹lbd¢†ÏGj”Zfh¬ð<““ÁäÛ0MIb%BïRïAÍR ¥DSò˜°÷>‡íoלcÂÌ×­ÙbsŒWËM<™fÀ+Ÿ·ÿ#‘¤kÔ‰ÉU6ÙñÉŽÏê¡S+šéeÇ';>ÙñÉŽOv|îÚ? 8>Xv˜îU›;K”gˆÓ™±1kvbF’4×äˆlÀ¿&žÐÌÛëyLQÜ1 ¿“@@kfÜ»ÐÌqŸN/n§GÈjèÕfÞIY aC›¸%uD5T×–vž #ð1‹©^£•Ýõ«uQ_CX°Ÿ“lm›LWÂõÐ:>@è²h(L‘*¬÷™¢šŠRÝbw|-Ý”-AœºâŠ7 ® 🙃m,\C¸o¸Ö­*º™ÂG¦¯˜Š¯¨ Z [Z^ÊH¥††¡.ÑþÊã¼F/‹Uc?éˆÄ€=,×—¯—j÷H4T^lã´ "Áó4üÃÛVÁ|…À¶«#Ñ£!áÎÎHUô€z’>˜•ëá?\$°+¨æõá@Úƒ.ç¡ñ/Á€ ?æÞiá“~­çƒ*“¨Ã;8kÞ¢is3è·•VHø×3$œö×õ'ðûxd<[<§AYÏÌ SE‰]ÍBô墯çÜR&Ì$Nð°ÌD:n2ÚB¶Û‘‡…‹]w&|!*F«8ž;ŸHœI ì´0’ÇNˆä¯íÁx£P ¡ #˅㸻Þ["Øk/¾°mÉ‚]i¬ðYÌl‰=%5éÌÌœ.¢¨£Â ¦"µ÷óé0ø¾{ÆëvœJ)'’$·ãÁ{š´ªµ(Å„]‚´ ÚJxÚº²H²ÏÊ ‡Àa! îÆuµ½5™ð¨°{³¹¢N¦«}HQG—=&˾35ÿC_ª›í&véœRëÂòÄ!;(2†¾¦O‰«Žzby ßiE¿Ö¡wF‰Ó‰lé¹wÆÔȼg Á¤“SlIé íæ¾ö ÍzH1kŽf"#p=CmÀÜ×4zb Ýð;Šâõˆ:ƒÆŸ{i­àJñÜÔ„5JÏëŠÎ-q!àö3ª´ö_ÊÔÕÃ^*G?~Å^¼¬Ž ÚnnÖWx¥x‡´àYCZ3+u¼÷Ö'økz´žzkçN-Ô­M;ŠD¤ŒÊ]çw]ò’âê†âýOV±Jyõ¡±x¥ 4å˜t†HMc7Jgä) úöv³ö ¦pfä…-q8[€úå~yúâØÎaôÀy ·Â>ܨëÚS¸] ³ '¾Ð8fiÏÍíÓ°R”k-³Ò>¿pÖô\Ñ”^Pmø ŸY†Â_ƒï "¯¼–Þ<‹-+pç?Ÿf<Îü#<++PØ* „ÃŒœè>Õ‡/DÇ| k°p`v:ÆËPcJÇÔ´xk/ƒ™,œÒ nç$ Ëk{¿„5…9Úi¥¨Á`¥za,ªàχÏOÿÄ5k– endstream endobj 5001 0 obj 5879 endobj 5005 0 obj [271 /XYZ 38.2500000 435.500000 0] endobj 5006 0 obj [271 /XYZ 38.2500000 435.500000 0] endobj 5007 0 obj << /Type /Annot /Subtype /Link /Rect [150.750000 62 197.250000 68.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes >> endobj 5008 0 obj << /Type /Annot /Subtype /Link /Rect [396 230 442.500000 236.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (file:///home/william/swig/github/swig/Tools/swig-4.0.2/Doc/Manual/Typemaps.html#throws_typemap) >> >> endobj 5004 0 obj << /Type /Page /Parent 2 0 R /Contents 5009 0 R /Resources 5011 0 R /Annots 5012 0 R /MediaBox [0 0 595 842] >> endobj 5011 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5012 0 obj [ 5007 0 R 5008 0 R ] endobj 5009 0 obj << /Length 5010 0 R /Filter /FlateDecode >> stream xœí]I¯Üƾϯ˜sØ 7 `mr H@A'0l#Jùû™rFóšó5ÉÕ ù!–ôZ쥪º¶®åÍ?ÿýøÏÿß¼ûüïãýïï>ŠS]ÝÿŽ—_ß=þ@7§þÏǺ)?üzøzüzøtøtþï×C÷Áçw>ÿéG}üÓùÿ?ÿú·óìÿÑåüz¨U}þý—ëïm­Î*î¿_~þ¯Ã_~wüí2ãm¹~3/ÿþ®Œ²ê²‘¥¿nÇT×_ÿýá·Ã›óV)u¥}TÖØ£j­>þ營Πܦ/N­Uª®l],Y¨Ö—•LY•n/`/ ]ÉL¯L^ÿlòëÎÅ¡¢L¥ü³K"·jM cBÀÿ>}€É]¤œËÎÅ¡rC.ž]¹M}»Zuø×ánn]Ø€láºsq¨Ü‹gDnmTÏÚ¬jÀÿ>}äÖº 7ùuçâPé‘ë™]¹ÍùÇáØòÃô&o7ùuç¡Ø²gvAä6…¶=€Ê¡æ¶DÓ˜\Õádn·sq¨ôÈÎþiÎ,x+ÝO€ÒÿÕóáÛ/‡7Û£ªŽ_~:ïìº`÷Û—_öü—‹šßÖÇ/?_¦þÃñËχöTWe¥ËëþºÝ^GšSÓ/G GÞ]Gìɚήú6[ƒFŠ Í¦ºoÌ©´gé7mϦ»½)uûèÛ7%œ­†{ƒë`Ý®›) fŽáNïÁ†ìÂøÄv>Ö=³}¸Ž”'sæ)R©n׿öѺ{ë’ x|tÙ‹5Àº*à¹Ìüž060Öá1|9‹µ0©,jG$yX+Þ'dÔžo <(Œ`„ bÑÀKlÔdbô, 7‹å4Їã`9-KÚXNÀgô!`(E”†0Z†›ÍXÀmE20D•øæ£«]`uµ&ÏuÅçb®8f?˜tÎë9ÏìûP ªÂhG¢ÆE ¶¬f¿ÀÙÎÖqW׆íÐÜž®~ANЈiæSÔpäãüÙÞÁ÷ów Úùëè·p÷Á©TK¥q`2Õv'Ó'çÁß{+ðÞšÐÜ{ÒŒº¡—ñpyL²àr¢2ΰ´¤lÊéÎ.NÁxcyób©*ÓuL¬»Pª2vøáÙ ƒø=ÚAÏGæ}sw¦ÿhÂHzc4Œ®ÞCøáDz*À9ð}xü–Œ¥)a038":bY!}ƒ¶rdT`Ú`D g°œ[øŒñ\$±«F»šKÀøy6›…#ZORÏF ±pêÏï­ }ƒ›ÞÊ{¸Á˜ BÚôp'L›®ÏÃ3‰ é§t”nÌÝ¿q= ¨ P×1¬ÓydÃØrùY_9kÎö}°ªV 3×ÀAù?6Ï='f´mÈî=$*³A½JlXö)º?z'›©G¡­¾w)‰ béDMAágB‚·3j„¬1JņÍx‚KhÑj= èXqbŒ˜ÇüÏÆ¸_—8éœÀ> \ðNQ·à2G\2ŒlL 3bh{¤{r mÝÞ+%ö(ìqîÔeÇÛ;dð» óä ¿ÁïØS¤ðs<öHa|åßò¼§â7eü Ü5~9îa…ƬnÆi úè4~ɆÞ;ŒGNðë7\Çà‘X1ÄÝ4Ø»ŠGvÏïϯÒp9Ó¾? ˜ópH<Û»ù’…:)†Ææ!c‡{Û{\Õν¥o¤Xæfì|=o¾ÞG¿Ä¹µU5yÑÅ÷ó †—CŠÅ»N/QKiA¤¦”<Ã7cÊÚô0ðh„µˆé:Høø3JÄr[٠ܰžÆD:ãÙ°5ÃèO˜ ~à9͇â X¸Ž‹I™ šrd1ýaeawm7¤3ø¤„çÃz׃óÖƒ±#¦][Z=~Ó€èlŒŸ'¦RVj‰‘ü>–æï¶Zð}”•&£vé¼o0/ÇôOhžÌËÁš'¶^1¬ÀØ B˜óxð×ñ¼¿üÉ£Ëc©ÅP/¶"j¸e3§á3`JÂ< Ó%¾3˜þE1‹wböõpïj‡XŽz3ÚvÁÍxExõ3¥¿yP_¥Æcäü #áµUm^^ZUÜâ©]$¨òT´æe¤NÅí„„Ò·!q󒎉àl&|pkåÇÒ‡½íµ?·[Hɸƒ×—è7ø§˜¼‰¢f ØÔ– Zóq x¦G{¢\q}S&}'R‚=SH"=O_g²©ýOÅ«õ-Ô 4£YijÞîêÌÁÈŠé¯í¢GÏü¬q XÙP\[7†WéLŽé€hŠû3c,7CSÞëµÄ*äœ<¯Ëcx®Àˆô$‡aåÛ®pqâ½ÃMÎÏ vÔ.Ršq?›dÀg"smdâ᳦­®·÷PH!PYÁãÏÈY3ëwŰѪɺ óT7ü—©<+SW´ÇÅÞÇw’4‘-¤.J™Â½²çÁègÒ_]|F³:¬#3 ã¶a (ÎZS¹â GÀ/éë«£¦¬`HÅZ òÁZ>¾'D«îa`qu)½\° CB”â®2VÏÇÆJÜ4¦Ϊ Ñ3—x”"8¾ÚqócwHm>_9ˆØ=3Ϙw$I½Yã$[W×iMfh­È¤,»Þ“9v‚¨¿c·°½dÐ̬lëJKÙ&u;‡[—B>ƒ¿ô?ÏèS ¾ Ç‘èµéÉÛÁvY‰Ž­…¬ˆ„X3W|M’\–‹2-Wø ÒÈT¶›L¡A¦eÎÏ$Ñ*–ˆöúœã|ÕÅ2„•Þ¦î¥ðDžrg˜)”ù€i?,¯^PÉ)§Ç‘ÐëÄk ã£ôÜY 'Vnþ ‚èeì9è%›¤ú˜éåòãÁe/ó¿ ¶f‹°ö,…|²Bé«´‹ùu–çÕ}“‹ÔtÓ„4ô”â{%ÏÖèòžºÁ8‰f8üEE^†( ôpÂ0Æ2dŠC{cJeè5šóÒ•œé¯³ÜjäPËgë`Ç=áÚñ0{ÌSbO&Ž ©‰šÖt2wWTý£B¹à:sœˆKžð3äø–3!ÝLýEü¤WõSHð@a9˜Ê’‡àP׃†=_ÄK!žM×Ó/ãôOæmÙ–N0BFízþ‰ûDù‹1 FFÕÐÏEÔúMJΉ؊ԌÃ{/ û^.‰†Y–Ms#'|FSv烬¬XÁ¹…[Ä0( ,Ÿ±‰:½‘lžÅ )ÛoÕY'¼0¬­K=ù%QPMÉ&»«Ô‹Tj‰É d»…•=i5Ô„[k“ZU¸+ã0`œ¦Œ8và0aWLp<ÏœÎùÝÁ\Ã<`‚G­]iÉ8á1“dz1aDÆôpp‘Ï%Ò+¢t7é‰ÏdžàŠTz°G dè`Ç$o&œÄ#:DÃñ©4æÉžHœ~¢‰‘UQºÂjU,sFâ1qwÉå“Y"±À8:iç[{k˜¯Y)…æ¨ÚgPèT´Ñ/—TÅ©3J®N…Fz4–'íZ²}–Ö³ob6¸·¾2è“oôûûp…fÕ'³õ´}έyùÍ8RÁ]8×ÑpŸ´§«''í}FçÙ w8‚×éë¦>›íùȳ8›ÖÖÝ=©NæÊŽ'Áº6Û¬^?£÷¯ C wUÖtñ:ø–EÂ"†¨ç.á]³ø ^Ç@Ή¿Ùïì?á]ßA˜¬nÁôìhF¿fT˜X¿« lBm¬(’9O43ò[×&•#ñ&DDÖ …wOÝ}÷mzñL^±lX›a’À¸ˆ·×ЮhÁ ™Áå¶rE–lq¦üÑ œrÑÄJ¨‘JZCÅÙ7É‹´äS¢scü“ ŽP%Á p".NjXÀìe„‹l Ùg˜éç<Ljk_ ?/•#G™JYãi¨‚0åaÆû#Ä(Ä¡”ª+ÜÕ÷.ŒÔ'Ò”ÄÞÆÖ Z\¼é5áœò­ÊÔ4÷?tÝŽÛ jVAÜ–ÖÓÀ—Âì½Á'+â’uT¥ƒ«â¶j5st¶0¡â¢ Ös’ʘ¢Òš'À˜ˆê“•L!LÆï`Å:­Œ766ö^7xgŠ\.Ã}==œ·”ÆÅΈRcž½½“\§À³1½M1 ˆª¢ –ØpϦpÑ;¦,Þµ(…xÑÄ¢ÜàÞ4¦D¨yô&lÀán¾X׊¡ËÞ8qu‹ØT"ãÄf•R‹Õ~§ [¨xôÐky¸ûaX¬´. ‚Èš ‰j­{"e"ç¶ÌTë ‘æ){Ùo#±Rô¶ÕÕ%@­ë`P+Èò{aP+âÖp}ý1}äRš5•Ù^*L[Á û"åcuä’¨½+?Z»UI˜ÚØTBYŠiÄU½6£B„îΞq®è^3`·‰Õ“h’µó(Õ 1Øýd’üTÓågÛ¸V§}BzZwÓë!ß&w=©Ã³âù‚®+¶Î°9©SØÇŸürøìQ¥Âè`×=L5Dwl¥îÓã]¢ƒ*¥è0ÅdA\ãa^Ù|žéeɘf0TíZ‘ƃc°ˆàJl¶®#Ähfc\XîîU«sB¼1Z<êÑ…’ªÃƒñÃphÙrÜÊgZ¤íïþ©-UñÃ|à1š!t™ŽÄƒõòóãŬÆÔ˜[ O5¦UVRñäæ% Á±ˆLŽŠUð< G]B¸Y\ß ÒŽÅ{ƒÑbûõÀŸÇŠîpóTÃ8™n¾“Z7 y¢†;ðìšØ–Y1#»šRÓKrJµK"'Ø“ ¿Á´Kî¾¢hH¬aªb"vñHÆ\5ý]PpÄS É`!ò¢öhâ;õÆ‘õ’¼Ö}d‰9‚+ïœß†­bWÅu|±É»á5üfk\5ç\¼kÅcË$b–yÓN ±Õ¥Á<ÀS—ï û>±…ÃmqËš÷X¼b94#Ímu+#£ûóÄ9‰ïšLèðœ^Ƀ-2ˆ§NþÌ(ܳx )ø¤ns]$”@¢W núJ=@¶4xL<+‚ÜÓN—ˆùžC\øG½„ï7¬G¬ÅBÄñ°Žˆ‡@½T™P,ø'Z’‘‰SŽwÉ´°#q´X:Üé‘23z€oŠéí¬JW¾…µ«B§~'·Å†1Á˜#à$T¦Ÿ4 ¢Ù ëÌ1̱áf~zÜèeŒÒF·mîa‡‘\=erˆòm÷ÇàŒž-ÊbݺÔM·É÷Ûv^Qì~å“@¸ú^{aeóò°÷šQBÂ{‹Œu®ðë»+uˆb½ŠHûbºlSÖ,Q@…J"“pÉPh÷Ì‹Ú6[½®Œ&ÍbLøL¡+Æô˜4 3üGð–R$6ËÌFÕ’!ü¿£+¨Ãª¬\‹€oJÎFùΆ·Ê†©:€"öªÇhÞùhšój/WMé£!ìy¿§ à°²ÝÛ1“‘km:¢.Gò"C „{P_’v +R[Çãà`$ê3¥{fÌ@êåŒÑ%°øÂ¶‚¨Ö”á³jÄ MQÞêúïŠhÑúž DÞaÎçÑpož¼„]aÛªÂ&”ŸâÉ©ß;ÓDËzŠX¥ )êEZ GɺwoòÌ:Oæids÷5®ìwÀð ÏÁÕZ°Æ‰Þ°^”Df¸7–È8Ÿv—ÈëÍmŠvIÏzÏ}ưÂç&ìœXôÒc+ N”² p"+ÓÓK“ôµ‚p +%1]ZÓS9a135<Ö"Þ5!71—gú‹â]{°€)Q´ 5sž<$º×Ýkøf[mÍ‚FÝ«âŪLÐèâîŠÅþr&l*ÒÛD©ÂöÉð© ôãU~™”¶êq\LO/M—vŒ7›°_“ѵÃp¶Bó "JR`>ãÉ®åSœÇ[:]0zEhÓ·t²¥züAŠŽN—-8TÆÔa{™ŠéY‘²!ÒTÌ\~œ.pJèP ‘D••Â!3ÙäôTÊëÚe_¯¿L[b†¿ ‚eg”ãYg–wúxÀU´[“A²°O!¥äiX3GL'd–ˆ6•«‹”i–0é!˜ Â6¯P=ÿ:~=ƒÏ ÝOcÿ`ø›§öïYhꢅõ½ªŒ‚â«»Îõ“³vWEŸtWSìa¤ó{VÑޛ¨O½ôÀ•ÄÝ{´Žs¬=ÛÛÇþ¤E¬§8Ìãì·-#r¹°ç8M3ñ'ÇPx6øMO¶jÖÑ: ²wùóyÇ·€‚©œO s<‚8Ì Ýχ\òp:D &ŒNÏ:ð}¬Æ3ú{÷Ìfá–zÛö…azm–SX]˜SÏ&’LžUÑç£,øÓñÓáÿжY endstream endobj 5010 0 obj 5386 endobj 5014 0 obj [272 /XYZ 38.2500000 498.500000 0] endobj 5015 0 obj [272 /XYZ 38.2500000 498.500000 0] endobj 5013 0 obj << /Type /Page /Parent 2 0 R /Contents 5016 0 R /Resources 5018 0 R /Annots 5019 0 R /MediaBox [0 0 595 842] >> endobj 5018 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5019 0 obj [ ] endobj 5016 0 obj << /Length 5017 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤^‚~È!€a99Þl‚EvgùûÑ´¤ž©¿’ô©È–º#¶×ñQï*²ªÞüñËßÿüíøæý—ÿ¿u¾ÿrÈNU‘µÿ;>ýúáå?ØúÔýýXÕÅñÛ/‡ïÇï‡Ï‡ÏÍïßí_Þÿ¹ùÛÿŽöø§æÿ?ÿú·æì~èé~9T¦jþü÷ùO_™æoÙåϧÿ×á/¿;þú4c¿\·™×ÿýƒ-scìÓ6&–þ~èiο~ûöëáM €e«¶¶6?šÜ5¿ùÜÿûÃOÍýôÙÉ7?\•y•­Y¨²ç•Êfë›ßL>ZèüKiú“»Ê…›ü¼su¨WyvMäæeѨSÑz=O`òÒ”á&?ï\*=rñìšÈ-˺-Ëðï§ïrîyçêPé‘‹gWD®7Æ·**}=ÏüÞTá¤B»sm t¨Å“kbÖÚžmó¨½Lúy•‡›ü¼su¨ô¸Å³k"·°U g]]¦ÿ:(Î;W‡J\<»&r}Q”É—ÙõÁï²Ì„Ó·íÎCÉd8¹fð”­i>Û¾˜>jÆ H7O;W‡J‹Û+³^2 ÞJû/ÀQÿ.|øîëáÍ'“›˜åñëOÍæÎk¶|ýå7ÿñä¼9üúãñ÷YæÌŽ_>øSi‹~‹íHö¸zù7YG<y·|6cáÈ'8w`s8¿1%ܵƒ#p× tL‹Ÿ_r\GI‘mÕk:ÊÞŸ×ÌO¹kaÏû,Î#îTäeý46Äb}ª}v>Äóž-G#F®Íf#­ÓRqr¶6¯GJômw`LžçoZ,Ös6ë?ÚQÀ˜ “Ásv'É?j‘ž Ä÷ìL|ÞM2–…Lâ0›BA™Q„v€,Êpï­#†eé!ø°P†øq±7b ÷.•»ÆV˜ÄÔîÔHœÓ9³æt»ä{Á|Â^›BnxQOàyœÍ1ØÆF6bß0ÀBHÒd`ß­ÍèŒXÒ{ÙÞ>D”ø…þªÈMé¼Ý<+zÐúÅ>ÂÈú…®6»;)ðÛhKØI\8}Gm×¾ë`‡0/»£g#'bï ;]`g•Øð ††u‹JãzÏsÆyŒ[¾ŽÉ`/ƒëBØE¬ºî£#Â:\o‡GúÜ·Ô˜ pÔ„`åèŒ*ñRça":8CHÏ q¨€ª°hÜÈ׺p‰^#¤"–ÿÂlP4ÚK«Oƒ ÂðÝì}@á1$Êv‰·¥)4B®c\óeLÌR'TÂÔJ,‘†I[Å0Ð Ê2vÞ|?FÀ†,qí`žÊʼÆ`K]¦8eÞ½>T‹Ýݱý†*ؤK¥' ¤g‰e9ÑyÜçÕdÈH¢7CÁ}{?™‰}Œ gƺaH·¬Gö¡A1R«]uEÄñÞF­0ý|Í&oÄCÑIŸ>¬„®ÍHBßþa ñL?Ýè”ý²'I{,ZÞû1ñ ç‘1'\;aaÂ-Õ ‘`˜áQØÇ&+<ž^£é2^ÐŒXàã»`ìj¦‡&’zZ B±öct7c#„ìö:[/Oê÷îÕï2,@¸ ç»vÖÄ«haÓqžÉwæ5’Ëëg†×‚®°ƒ5%Høw‚¬Ã ^Œ×ÓaU³´ª¼QÔÛ݇™ ^‡è¾/ÕH Œv›B\Í2OÒ¨Àà¸æNÂPIZ™šûºg^lš@Õg±B$E ÉXõa5†G"™BÚ‘’*¨r"1,݈'UMcÊ!—$‡ä‘(D Oâ¦J?Ÿ å 0½îc’ø[àgÖn1Ë ®œÜé½ Šp`ªÀ ïx„`RÊ…¢òYQ¬à3Š7!Å2ô‚ùYX‡ŠB‘B? ôOPRT ¬ÊWà>fáâR.JÐh±J”ù%TÁD:oöð’ÉÈ%ž# áËù´˜¡§*ëëíÓÔØr-²dì‹'U5öñ®1 𮙚QØ…Üiõ¥”Ú]Ç4¡+»ÊÞxžêRò59â"e'G<9âkø¬¨WðYrijsÄ«ªZû˜ŽxmÖ„˜ö©A’#ž”°õ0?îT[ãëCbÚ-–µº]ùT¸ÉýÜ›|Ú)ÏlX÷oÊlœÑdEÎ9÷”©B©ÜB~Æõ»±\NÖ‹xR&R…eçÍeš`oà½aè`ŽäªÚÈá8«n¯ lÅnÂw¬ýš.1m3oôW¸ªõeñÁ× Åhdªs ïúUËZ YÌU-Q¢’º,Ö¨ø° ÏZÈÙ êo,I© ›º3IKayßV~À‰Âk_ÂüœÂÄ3Áëú¹¼J¦XùßL6Sõ€IgŒR¨ÊCÐßÜ^ Ÿãš×n>Áí®ø¯€î§ü‚ÁÁÓ¥ÚMI±tCR4j†`}4þªþ9‹[ßãë%MvjŸì½Ðó%騿8Ùá;¿®&êµojb¶Oð¾Ém/nÛj:#}e6ü ^§óÄŒ•íqpŽÏ¯À“Ún6s*†z§XÊ“3v`(9´ë¾Öã•Ù24‚aÐÉÇ+;ÈÔ<>HÈy1 d ÃÇÁHgÆ_› ¯c>‘ò,<)^Ç'íÞÖ]£= ÑÛÕÉ40^ÓüF Œ¸7Šª0] pJìZ€(®®ä% Ùm ´b Ø0ëL–½ Y%»7µŸKtiÔþøƒN£sÀÝʚϠLüJ@:'c  Åm•ARTLMà.æsí>-pßx ÁÄdš©îm¹y´•]Ûö…FÚ—LßÓEú\Uz}<Ÿy–õ> @ò ¹"„£J·œloß¡N·A åBÌï¢#0è­ A„W®6+yÛ•\Ô}âDµÇ© .Ü(G&¬åÆDtD 7¸û%Áâ;:põ¥eÌŒéæ¶±zlꆱ[vçÉF:±Yƒw ë2†ïWú¡ªÂXÄüêÎbãJÀoŽfÃø ð›¼XN{ØpV.u¯òª˜`.F› Ö²jU1Ý&ºp|-¢{ öí¥÷Å@Pœ ˆßƒão¦á Æån(…öYŽÕ.˜ NµŽ‰ð}U£o}æÛ ÜcÝFfŒ¤Ñ½öy´(Õ2? ӥ؂ë>š1r»»¢x•4½)úŒu¡*ꄊ ªbbå×Á³ YîLõM¢£PM%®Ò]–µ×Á˜Ã™×8}'p¹Å[†(Ó²‡jAÔÿŒ‘+=a&ØìÒoÞõP Öæ¿n`Ÿ‚¥ëø0ׄþhÀûtAc™²PÅýx(Ö䃳)?ódQ±…‘Ñ®˜*>GWÕæŒÜ:|ƒÏ;Bj•ÜvŸ™Ôë7‹Œ÷ys3°ß³O‘·ÏPÏÍîSÔC›ïä]!uWƒA¼à²vËï ä*Üð–ÓWC‡M}X–3+°Æ5y ‡—|wDGvmfîÖ66÷³`•[ºrŸT•ª„ÆÃÄÞЇ2?íèÊ1’ãÜš6‹Ñš0EÉÈ –¦ ¬U[>3íµuã\;mMIÚQ-v°o„ééû@XØÒììÖ8ò©(§i™xþ+`‹ˆsé6/¤|iF£2þ1›àùí2v™"z\DoË8U¶·ÝFó©|vl ËA¢M¯Ñ܉ƄFÁ„½7#Ñ¿^G•TîóÈTNqÆííFB* ?³¦e&*ÃxSýÏ®>žä2™^Le>æY²jé.£˜üAÝ’¨E$ ¨Vÿ®pɦfqܬêºÏû!ïFÊLdê> X$R­U2|…dÉ5 ýl :[Ü<¿r³¦BéÝìí¹^@¡RÕ#¡BÄ ²Ã‰NuÂl©éÂv»CfçÅ^‡²”1ÑT²–£©c ÕœÕX](íVå;”«í2­Ütë /0}àÂ1"‹r@‹tºP_Zª>9,¦b£êפd. F¼è/*? _ E|•=5åt¥Yóx5¥_ìõÒ%¥_HçIé"¦ô‹t/ʘé¥[ó¼9¥_d)ýB†õÍŸ¥ô‹lÇée±æ¡pJ¿vÒ/Äó¤ô‹”~ÁÚƒO¿(«ØÓSú…ƒ”~„Ê}ì‡Â)ý‚\'¥_lÚ‡Jé…Ìw]çiÙ,w¦üÞ5V<óí\ªäá/èE Õbvº=è±E·ÀݹuͬÐe/»ž÷{¶þ%ç¦ÀùlÆéB\^Ô(u=8cŠKjBñÌäzoœœž*\3¿ Œ huíÕЂé\ Ö¦ôxX¶.ŸÏÕP°úmm‡g‹u)á/ÍÿbUXèíäæG雕±ä°:fBÃcPMò)†Ý±O[¾¸*¡®ù‰AÌÀ• âøè ìÞ›Å06P ûNŒ÷¶@–1ƒnÁ¾;*á /œhÀ¼ì`˜ÐJT˜‚¥påø Á»†t„’ ž§G Ò:éÑÂ>¢žûjE1Úì†kSß„¼Q(ý@Ý o !(¬o°'¢r¯¶=χ2“ñ kfWf2UpžQú77!§¸Ì"ßÞ_Çq~’O¤Û)8–‰Ëöà\®C•™%Êæ2‰Lq7áé?Ä6.#+ÑbÝp«š”Ò"q “Ò‚é`˼­[{2Af3éÎ[N-Š%Úé¡ú6Î5+õµV±ñ$˜‰ó_&1–«`ÏÝÜ Ò툉­ê%©”K·ïfD ÷™ ò–ßW2Þ›l_írû;qÝ»§ûxõ³"˜R7õ€nS£·E)1ñ ’|_mŸµÕR2 s{íBæmMý¥mw!kNçVu!Û%§¦*ˆ?¦*ˆ¶SÄ,UA$åΖëólD Ñ{íÒfJWî®ZÜ‹ Yͯã÷†ÕDNü<õ3|íú›:ãNOLj‹£Í_ÓÕµ7í¾«+Q–Jíɶï‘F4RŽGº:XöÔ=ìzïv¸•uÜÔëÊk{ûÔtô¶¬‹ á'9ùó–2¸YÓ}tÀŽh®M_Á‘ÃàÙà7]Ë,:ú ‡%¸§¿gÏYGÑZ¶XNǹâp=&Ú9b†$€3!j0q`t ëÀctK®…´ÞÁln©3g®Q¦×z=…U™;uÒi&©½…#ÙK9=%£Ÿÿe‡ endstream endobj 5017 0 obj 4844 endobj 5021 0 obj [273 /XYZ 38.2500000 428 0] endobj 5022 0 obj [273 /XYZ 38.2500000 428 0] endobj 5023 0 obj << /Type /Annot /Subtype /Link /Rect [66 722.750000 135 729.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 5024 0 obj << /Type /Annot /Subtype /Link /Rect [293.250000 701.750000 339.750000 708.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes >> endobj 5020 0 obj << /Type /Page /Parent 2 0 R /Contents 5025 0 R /Resources 5027 0 R /Annots 5028 0 R /MediaBox [0 0 595 842] >> endobj 5027 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5028 0 obj [ 5023 0 R 5024 0 R ] endobj 5025 0 obj << /Length 5026 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ€ €¤µä@€Œ;N`XFò÷3rµKÎW~¬n6g:B¼ò¶ÙzWuWÕ›?úÇþ_¿ïß¼ÿôŸýÝÏ÷ŸvÅ¡.‹Ëÿö§?ß½ü…mÝß÷uSîü²ûºÿºû¸ûxüç×ÝåƒOïÿzüÛÿövÿ—ãÿÙÿð÷ã/êþ£ÓðeW›úøó×ó϶6Ç¿Ï?O¿ÿ÷îoØÿvš±_®ÛÌëÿÎVeѸÓ6&–þºëiÎ~ÿñ·Ý› æ­RºÂTÕÞxç÷¦õvÿßî~>.ÐO_ZoL]ùºX²PmO+§•l{»s£…Ît¦7&·mnòóÎÕ¡b\eäÙ5‘ë­ïk› zž>ü«Ò„›ü¼su¨ôÈųk"·î¡ïlέ"×> X8ï\*=rñìŠÈ5Ö”€|3VËðm~ýÉmÕ†Ãîeçú`éÐ{eús¦Á{­‡¯Â‡ï>ïÞ|0ÞÁYí?ÿ|ÜÝyÍËÏG°”ûïN&Csü·Ÿö, ãÿ´ÿüË®=T¶ì·d¤B#~S|Gžàˆƒ#æï­¨Ñˆ{ ¿1 Z¸NGJ¸ƒwpä=Ü\cã0Mèà“¼Æ)¤DwÙÁ÷Ÿ œ7Û62oºwñNgM[ò#˜OYa!ýü(ÐïÉØÊK,_ „5–Ø‚Á0€çÁ³ ؆³ ;€'ÅÅÒ×à½aè@ŲïÚÁ“ ܘuÆ”Tuulññteµ•j¯Ú‚%}q^Ò¹áiŠCU›¦.GìØš¶8Ãç–‘ Ûûƒw—pë·F:¦cÖ9ê%$ÌÈ!2·ÐÜBSŒ`xÑÆJ_½‚¡Á'€ð` k:,ºƒ³±·íà"TËþ“‘èln@ž¾“‹®‡É-#E Gj¸NE#ÞõÛÁÑ…b˜»ù@é¶ôÌúº5cº=‘ß™úÌ)B°ÿ²³ù‹_wŸ‚ÅKœ¶0`‰÷¯bÍf°¦m ¾1`&À̆Y Réiqž*à7Ci‹Ë1=›Åô «ÀºóOÝ7¦~1b¡¬Å$óîfêb†7ËØÎ 7 ÉZà'BI ë0ò+}<‚)¢ÅAú(Ÿ1H†¬m¢°Uo3oçó¿ 3Þ#SŽŠž îfqIM¯j¡S¤NýPèŸd¸Y̱º¶÷HÄ2P¢L#O‚FY zðÂCÄQÊ4ɇá¦1j1Ïk˜˜cÂdT#Æ(Æ6ð¦ŒêÚ¦©‡ê†°…Æ4IèZÛ’€àf´&ÅIЮlFˆ`õ íAJ}Þ)“y·¶KÙ¿]¤3 žk¬0ª†²dÓ Ï_Å.Šé¢G0¼°ðĤó4Ÿ\TWå­ëÜ3£-Ûvèœ â »µ#CA:ƒ6(aÏ0Þ=£¦W÷ÉæÄõf5Z®×Œ©Ì™kvüÍÔ|@^3¶h‡¦)cŸ©¸KŒÖe‚À8–M„µÃF!ÎàÆáÕ>×Á§N4å$õ`¹Kb®ª3› îÕ˜cßãðÕ A6öŠ`.—CP Ö:„Õ%8s3@¬c[„1Ä…G2P›òP´î5À{‰Î 0¶¢à§ª•]^,ÑUïœWs†Uì)a'SB@}T–ÕP!.ù°cŒ 4¬˜·@R_WNûªÃsq;žW“àÂfW|rW#¢ÜàSé·]§sžYuo»êK¾aÿ‹ÓÛ®@>.t«Á¾éW 7 á5Ì¿ìW ‘ûÝi  ž=é>ƒë‚Ñf¼vÀç‡c½#ä¹h˜ÑÈ"»?÷æþ0÷s6»Á{Ä ‘]?ÒÅøò‚¹nP±« ænI`. È)[0|Õ~É&F½ß'¿Y¹fåzñßk „é¬A_öÙ›_]âìr\‰çã,vœõ¯Há:8ÙÁ¬o¼ŽÃùÆxo0gûR9Ê8#ŸgVã‹jŒ9x ÷æ!íDÃ̬f²å1N Ì%pçøC:ÀyçÏáz ˜ªTóÛ:`²Æã>͘µ7|R‹÷†e"†5®CA@'W(ŠW¡ÓAÊ: ËÞp•Ž)þ‰cÕ}ÝÁ.²kW yÌ3„]´¾õÃHUÕëw¼æ ,"VÑòm9‰GÃP.[ŒG E¼,±1U«Naßh›µ¿„JHªž >©°ÎêZK¨ÄhaLUXÖpfûf,E]ªÂLàG˜©ƒ‡OªJU‚JìM x(¦7LP1¯ÒøiX­>"D[ÙÉh*°>d*Ü1T©Få6c*±¤Ýú‘GAÞV#¶4;»5Ž|rn‰Ü *c2q.LIÏà]3¾4£QÿŽ˜Mðü6»Ì=.¢—2N•íAFV­®?­—ï§é~*Úõeicû[ŠV8åz$ )ða-GÓ,‘¤w7‡Êk™Ê)ÎX]k1:]±Ì:˜–™˜"#Ë!- VùÃh-,7„WXr娥ÀÁÌ –˜Ê6º„Lø+EÄpU,éÛ³KEeûLÂmv¬ò¿UÓÚR­‘%ÔÎp§M†BæÈ”í†wWù‹¨X'¼¦×­ü¸ÆnN>v¢[‡Z7ièöfT©Æðå~k3+º‚@µ¤dÊiB›ÊÞÒ© £’«›ª‡>ñí5ÅÖO‡Ã"„uÞˆbŽ„OÒWPq›BúM]ßnK†Ð¤aɪ5Cw#e²J¦kgHçå((aj‘®¯ä³9®S‡‚*§‰ƨöñ íë…m§\o0l憎†¹6Ù $¬†êbzuñÓËÏ4îõÂ+dCPët³Cý\ŽIOÁ×Z%ª>ãŒ(&6¬š6Â<ÿö¦š,Æ$ïÄ|~T?§ÃR×XBND9]³(!$§4nõ*8§4JçÉ)"æ”Æü,H”;1S›E)C9¥±È))ùw+J»÷ÞaJc³(}!§4J»Î)âyrJcNidíÁM&‡ä”Æ"ÇÊI[*fL±‰žì•SEJÊ)!¨çù )G£âf7\ƒc—$ ÑdöϲŒRö»r´°ÈÑBRÿÄŒ¶Í’¶dñoò•k % öà ýÌÓV)$7›’° |Ë:Åš…±[3]gºÞ¬D\ÕÅ’LˆˆQ7SX§¾ª\.Ìu’ì†y5+"õ§§fÉֺ…‚ˆòZÂlx×·W”ÑíŸ-ä`¯žßÜûvt‡)Ò÷œœùÀ]²‰bºœ6#_(Ù„+ 0U|FÆµŽ˜ª:©ä±ŠR ÉM ÌѹF¿`òúG“`ѼnYiš¡ž›Aá˜Zu•†2C4 ÎV'[ÿÔqyU›×»öv>ÇŽªêé–þÀ›½ûŠpѨXÕLX8S3TÐ; ؾҨ3:YÂd–µÛàÒÎæ‰ØR*~Qк[Gùµšdªßb”¬oØ ³­náR°žQ7–WØhœ²ææ•‡Òm“N¶@”8™²‰‡OÒ ±A¹¶¯˜$Tiƒ'²C­ïDÞìZöDªUI¡"öÍ€FÒqzîDH Í`ÆÎ`H}l3AÒÛ#5‚¢ÆÀa Jcu<Ã㈥Q«=…ŠÃ¶0«°YFza<á|@¨KpqÊ@œrÌ$k³7íÕˆÕY°W¿^Ò‡KwœX­ÐH§4ʃ¶Ô1oá7ÍüÙ ¼ƒî é%ëÈ"|÷L¥­«¯ ñʈÃçù€FÌ…ëƒR¿:8c¯z ×Î÷fá†Nwá|m×`ào µ‹mHȉ𒻧ÆöÎÀ-pÇ¸Š„ CaoxÎÖ=[»¶¤ a×¢˜Ëðlè¿F{ò,7¼_¢o¼Z) oÇÔåˆI‡„¬1Ķ'n„Å 'â-Œõ!(g¢¸·ƒH‘ê½\gü*ã šq‘P)ÜÀÙ¿£r†¯Ñú'–+ ‹9÷ý#X„-Ûëž'°XÝZ\¦ì®g]ÅD桨û$ Ë æ®ƒéItçP æ¬ÖÅE·¿@­÷¡ƒ™›ó„¯n?9]s‡oô¨Ee„m1ǬÒ}y9»{ÒeÄ”ýp„z"ˈb,V‹ òÌô-B5Ôµ3:1ANʉTâiIÝJM'©k>&PË<îØíJl¡‹:”‡b¸Á7Ž]°ÇöC¡´‡ªÈÁtøí³@€(“1Œ‘©ÖOÂ'Ÿ„í6ýš³ãú²=Y#+h°z@óºABCâ°¾Ž® 0Çá4l¶¡óf€j!U”(‹" JúÛà]g}ÑIŸði0ãôoO¢Ñ»;ŸÎP=]>¾Ró²ÌqÞ1F¿j­²MgÚÇÁpÓWþczÀaøz E,b"uA*`*Ç#L…\×EÀçÁõ1˜ª]Dqa6¦‘j½µ (»y°&zêVýê¤0{0~T+)× $*tÄê*FÕáÄz—9é6éëjB0ÖS•m²6v;ÂajÛ1=D•kœCÎ`jê3ý¬bÕBÔ­,GIâ:½g{ÇPðzp•D\óŠÐŽ‚gq‚»º` GðS-öÞ¬1¡ƒáç0½8(; W}Ä×idêlÅ«»jœ_ÒY6¶ˆjð–ñ‡0ÅF¬Òæª@Ý4U)[òXV`Ƀ¥cÿã Ö˜‡-®†ˆ÷Æh:QmlfWj„šÛ3>S«›¨¥Îh eÚ!¬jKtù Jt ¡jºÆ”Í’Þ‚¾Æy£I»MÚ€ToÆzgbÐØGÅ5s/!’Þ-1æ õ  {•‘Î#øé¸CÒ&ù'õêÀ¾˜>ÀϪwdŒtÀ•®©¸3£¹‰h” Ÿ¡-$ìšà&æ&X° TîD†í[Æ~"°F¬Î›E]™ži„¼¤ânq½þy‹­ ¦»‚n4Jõ<ØÁ#©Çü[Ò—’ªªí’MÊ>Á³fè?á“êz~Û¤ÁrÍ=îÎz²¸¿)7æ¶uýh#îËGuça:²3rR;ɼaÁ–YþwYOžAwD·/£§¶yÎì:[?Ù& mÜ[mu ±ðüÎwžcºâQ/1lRWß›×EÙ+siè÷ºš<ƒ²~'n:=Ž]B ûH‘ºº3d8É#äà½Ù8X:ä»ÖîZ“¿7m£÷®Wå&Äݤ@/«k#ʪxi“gJ³¤1uÏò8¾'£˜è©n`öq³+spöq³6 £Ü’,˜¬$mä±Ï¡«ˆ,`œ»ÀD¨Ì{&ó†ðÕ²\/M¦•K²È\ÄJJe;›#åg9ˆe»%Tö¹5ýU\´†ªçÅÜÎS•Otë*1Ú‰¸% j ¯©—ûø¤ª0Xÿ¦¤ÄÌT`à¦û¶ÁO$^ÈZ´)>õ¬ÊúåÎÂÖ6+´üÌp-ñľá'lóUU#&bnGU-y±~­“˜öÕ,ºÓL8w ûd“&¼ìV•p‚%éê !úˆïZRÉx‹ÂµuûV5–æMúUAñ¾Ú.ºÃØ$¼ï#­1ceu3ð.”,²õce±"BeáHõSñK€ìÑ‹;`ê°3ÕÖ±­ÈÈËHTuo>âúÕ¯KnøŽ”ª´œðë( s±ò…ÖÕm_£åq¢uÂjEÂÇ‘1£hYR!å±¢h[’Ñ VªyC âkqpR.‰o³J ccSzkm¾äŠI—õ’ˆ{Ê•0Ï0¯bo Ö‹ÁB%FríîÅ1μ :æ`è`ë;õnó½¯Çò6’Ÿ#¦ æ¨jö¸Òxž¾€¹$"ñ­YÔÍ„è4'ÄBU{²F»ÿRõ˜;³X~ u—“–Ý¢÷û˜b™88sOij²ÅÃY<–¨|.¼7Î(©ú)Û\ʵato¥"ùSÔ®!g 9áÄH"öS¹$K÷Ó…^ÈŽÆrßS¬~NõR ä-îœ-I¼°€1GÄ;™¬”4nÛæ^;@$ýŠWWצò‚uNãÝHÚ£{²„ÊM—oMrÍàÔ½¸„ãˆÊõ”6é‘ BÂ]ýÑ·±G€GÖ#¹°¬ÉPÄ‘Ü%i½Í(ºrof¶l§^Ê>v5úÇч¹æxž\ó.KÈ-HÈjɋ̈¹ ¶hü•Uö_Ó‹«œú&·×î›k[sÆ Sá²·ýîº[‹òàlcNÒO}(}ÕÔå˜JìÁšóÀH^Uã‘ öP•¼ e¶?xwþä&ŸÐ:5^ù¦ã‡k{ûдî¶ðm¤‚³]¸ØÛR7kº£Ø1ïµék8âÑ1 ž ~Ó]p˜YG¯¿‘-Kp§¿wüZÉ\Y«{5‹:1zå†8\‰ËïÇ*ë 88=D &ŒNaxŒÎ½ÂÍæíðÌfá–:•rÂ0½6Ë)¬.Ü¡“N7’Ú[8b^Êé)½ÿ¸û?‡®„» endstream endobj 5026 0 obj 4989 endobj 5030 0 obj [274 /XYZ 38.2500000 235.250000 0] endobj 5031 0 obj [274 /XYZ 38.2500000 235.250000 0] endobj 5029 0 obj << /Type /Page /Parent 2 0 R /Contents 5032 0 R /Resources 5034 0 R /Annots 5035 0 R /MediaBox [0 0 595 842] >> endobj 5034 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5035 0 obj [ ] endobj 5032 0 obj << /Length 5033 0 R /Filter /FlateDecode >> stream xœíKÛÈÇïú:X™ÝÍ'ð3@ È!È!ðf,²‹8{È×4¤$©_Iü«Ù$ÇŠ‘Œ34›ÕÕõ®êªWüô÷í?Û¾zûé?Û/ÝÏ·Ÿ6Ù®*²ö?Ûß¾ý…¯wÝß·U]l¿ü²ùºýºù¸ù¸ÿ߯›ö…Ooÿ¼ÿÛÿ¶~û§ýÞþõoû_þØý£Ã?øeS¹jÿóßO?›Êíÿ–~~ÿ¯Í_~·ýõ°âñs0Ïÿÿ¾,³"?€qåÓ_7Çmº§?¿}ùuóªEÀ¸¯Á»¬Þº<ä[×ä~ûßl~Úà¸|¶krçª2¯²{>Tùý—œwÅÖùf¿R^¿ôô'Òúñ÷eSN¶x y|´¸Pº+ËG<__•U‹¢ñ=q9=ÉñIæpµߩǿðyáÌãj¯ñ ìô>y?þ;Þ„Pÿ„!p>aÚa¨ù¼S„À8† !(ð;ž±#|‡¡vL;‚<àý0!0 žŸƒ£ò\öFoøNd9ŠtÐé’÷Ÿ÷jpr –»#½°Z¥ôü„å óLƒ«±$æ³ÇÕ$ ù6&õIö Òãšy3 …'‡ï¸FºÎ£Œkã žóO‡Ñ42 <á÷!’íô!7,¹ÁV¬¡í™o†ÄgÞÄæø¤ü\5~¾Áj{púƒÓ×Íé{Vî3Ä:­ÇŸ‚⧯RÚI¾° ”X…™ŠTèM’ª)@ìp„Å –\‚ï©@mœ¯&ÄQRéü–|ªÈÔ’mœ—&{ï'µÊ«»Sž¤Š‚m”,ñ%Y“Jâ úeÄ“¥5®¾gäìŒâÛ<|OË÷ôH£K>S¦Q#wűî”þj•?¤ÃT”„g¯PÅCnìqð&!g4aṴ̂Ú¿Ì3Ì›LcüÁGU$¶’Õ5h™)V¨ã M: ÎßA/á]BH‹ží‰£¹ú‡¥'W3Icž#ÌQýq%‚«TgñNYŠ0+ùý¸5%N» o-”7d  5êj’§Î7¡Vϳê,*™Î&ÄÍ™1lBŒÛüìó²´J 5.ÞØ·Plþ¤Üäï‰_&ã@þS…ðÏgB›2Ï‹{ÎD©gŽš“d)’йú€qÀu ‹çî2¿ƒ’$ê›_Wr ,ÂÆÑÌùé’­.Î÷0ÅÆ•—†…‹;-ø;Œƨrï‚ùYYmv ‰+¹’jº:y„1RðM¡EàªÈÖi*¼»ç„VC5dJJÉg9ïª^·/Èu´Å-ÙW_º½Z4Õ=’C°•;²ReÌ*3|RÎmB#-DÉ•:òÈÖ¯PoÈ–lΚJÈi3FãÚÒÆj‚½ø&ùìûá;Êíf¥¾/ÕN›ñ¼S!S¼dJT¤rän‰(Þˆyb5OJ›¶twE¨WéMŒùUjd¦1#B‘’ÆBñœæÓ|µ:F?ŒÌj4xfï2€©üщ -);·+ò²®Šo޾%ŠzW7Ù¤ç'-)ç»<´MkûÌté·ø®Ö‰å «9þÃe§y‹Ñ°ËZTóÎ;:ãüNG`õù|ȯt…Þò|8 ÇïÞò¤+߸ô¤Âï0­Þ¾ ƒàùÃoú‹0]à"Í2.` \ðwêþq‘Îf¾ôáÁ"L19>y'*ò•ÄÙ}Šñ}FKE»¾Æój­ÉP삯Ýß1ä,î§+#PÌ„Zí-®Ö$‘ÎB¤z–¬ 2[¼î#u ½øÝ0»à!DpÍ+öˆÀ ëUÞ !Yç™_ËLl8ÜNe’eyûòÏ‹—W F5\×ÃÒ…#åßBL:ëEVñíQºb—5áÔ’ŠWp­èšÑׄêÓí·ÐÓŸ•0eñ¹"?ܬ¸’1ÌØ~cÉй£‚ Æy^â²D©a5áj†®@\§ `Tq3^¾¶¿ƒ±ï⥛ ¬–W×Ï0†/¬`ü²T±)˜¯zøWdÉæT<ÃDA‚»bˆÐ~Ë`MvÝXÚ žµ±cEG ¦ÎßÇ¢Îë9€:ëÑÀ¥Œ >1jxµDµþœSn$rg#SÅu-SôHC/áÏ:Vphåvaäj'†€3›QïÎO±Ë¨Â««»2ÂKŠßæžû]Ò™]_¹3Ì2°Ø¸Ôw›¤'\5&TöJ}¸'ЉԨãÚ#®ÔTfC(]á„zY>å™1KA¹YÄgÊ÷ïâVš-âNLRßâš8ÉæôžT™(ÜÈõlA VW\ oXw,Ÿ”®•Q%—ÑQëžÊÔ¥~‘¹$jwþ¤¶CqÏ]º‡í¶ƒÔµ•Ÿ°2ûMsC£ w³ŒŽšÜa+ªTUn“Dî /P•áõ1ù­K¥Ç—Ò UŠö ýáâökOå™òM¹;$Ü-«w“ZåÕ=÷¿ÚÕ¤>źù~fB}MjJJxg$ìs-æwÝå^evc¥±o†Zñ¦A鮸ÙÜÓ|ÁÓ–Ü{hµ½ÑBVN3¹E±8ÖIcJp‰Ó….cKîaDÕ•>tצP\úNÔûõFç ~rmJóäP¸ú–'ëBÁQ/%: ÐꄬNC_goÉñÓ%wÊZ§Ö[„\–¼2ã…YVq©|~[èÅÉÎGÇÀ´ŧ®ó0r-Qs膚½·>súÕ>ù‘ ³s†R#gäÏý¡Ì|Ž{ Rgä<¡tÈÕ7i ¥4êÄ%{#q«9”‰%J.ؘ\0{žz~ûvµñƒ+ïÉ¡§Ìó¹:þWíKµ‡Y†ÏxÎV/£7@܆OÒy¾Ã©Ü~W: (7\ùNªÐ0áÍÓ=–O]ûYó±„I4y1·õ’œI8Ï6œ=³«ôlœAÓ³aiNë4;o§…UY©NëŽ,`šÓ:MÕ›ÿ´çÝæç­kÙÏ4§uš\7ÿiyÎú¦ŠŸO‘õMsާ _¬O OuŠ™IöŸ¦u±dæ}O2;#;O³¿XÆñ¾ÏØHƒ‘üºaŒL2‹#;‹c¥rÎ{ˆÊ‹™Ù1}¤85?0Úʦj\©´e¼½­±ÒÁÉèÿ'DM”¾‰J·,£C·@æhÃÆÑŒ61l ÔF÷¯¸ÍòB4Å“ZF2i*M¹c4Ë–p¾¦Îþ'•Q•EIâÎìx×!²¬Üýs*ŒÕ^ñNßëß7}¥¸‚áÊñíX…¸úˆ±Æ?åňA(Q³R7hÎe°-Á"h$ErsöÁè¯Í}¼éÞd¥Ôã|˜Ó E齟H¦(Ö­Ò[²f„^°Cµ©Œè+;ªò»ÄΜ`€¯{*–rØUš™K°A dPÆ„%AeãˆÞÛ‘g¢0°#º±³8yÌ'[8^"$j½ŠssÀ5q{ªAn©B}³épiÜÉH™Ô½Ï{´Îñƒ°‘9'ª#ó½ÄG*ÎÞ+2]Å’¤ûHÕ›#Ñ%šº‡Dפž— ‹—Ì †\†„lŠ{lt¤>ÆH\NXžmègÁ–|TÖ›LËh×P Üdœ6s-[}ûü»T%÷Š è¸$?çYlW®‚òRŠz¥õÆÇQ,[ìù v@\ØØªà' 9åÙy«BÿÊîØÆX¥3<^†m•;ë‘­“ +ôi“"mŽ£¸š‚7ÃæZpÐ1ÔÊ¥Vô¤˜"G³ñÁØñAa?†•u“/½ÿ³ýº72LäãµpC1I ó^v™;Ô©nýÑFï¼£K5#-ÜÕ…²ˆ–·ü糆6z9|ÒUú]9€ÐBÀ.|'\+½Û‡n§t‚«®ó3H{ì¡>Ø`G‚Ü9KC.lÃñjøNçþ¹Q[¯Îd«Üáï{ˆ¿§ouîÆ(p\“-G8žDûû¡xý†øú §ñ܆;&^ÞxÝ߆,‚Ô íKÆôZßOaUvtº‘Ô°gg‹wrúšŒÞ~ÜüuÙ0 endstream endobj 5033 0 obj 4500 endobj 5037 0 obj [275 /XYZ 38.2500000 560.750000 0] endobj 5038 0 obj [275 /XYZ 38.2500000 560.750000 0] endobj 5036 0 obj << /Type /Page /Parent 2 0 R /Contents 5039 0 R /Resources 5041 0 R /Annots 5042 0 R /MediaBox [0 0 595 842] >> endobj 5041 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5042 0 obj [ ] endobj 5039 0 obj << /Length 5040 0 R /Filter /FlateDecode >> stream xœí]ÉŽÜȽ÷WÔÙ€JÌ…00 ÖbÀ‚ø0ðÁÐxl <ËsðﻪIVw'ëÉW‘É¥hÁn¹)23#"_¬ùöO_þ~øçï¿üçð­ýùþËCv,ó¬ùÏáüçÍË_ØêØþýPVùáÛ¯ßß>?|>ýï÷‡æ…/ïÿrúÛÿöðçÓ9üø·Ó/jÿÑùüúPšòôóßO?ëÒœþ–]~žÿ¯‡¿þáðÛù‹Ýpíd^ÿÿ7¶(3û4¡¿?tË4O~ÿöÛÃÛ†ÓFÉÏòì`¼óS{{øï?~> Ð}>;ÖÞ˜²ðevË@¥=䪪8[ŸF­ú=ýÑù¼Ñÿ¸÷EíãÍÌÕ©b\aä¯+2×ç¥o™[F ÿåë1x[¸,ÞÇŸf®M”–µøãšœ­ò¼!OYD Ïåë1ˆ_ÇäìÓ̵‰Òq~\“³uåòœG‹@ýîó¨ŸW. 73W§JÇ[üuEææêû¬Š@ÿ˜Ì-\oß63W§JËÜþ×?Où žJó`~^|üúðö“ñæDÌâðõçÓäžÆl~|=%?¼9›…?|ýéðC–ÿÇÃ×_êcaónŠ1žØ=Éá×*ø~bUçfà“ðÉ{b¥æ¬ œC7¼ž ÏóŽX)ÁSç¦ÓÚAn›búJ~‚W imñÜàJñ¬…]’-WB,|Çc9Èá8Žî®Ç{Ëh2I„ëvžÛ*q‡¡ÅœÃtkfýñëÉHˆ®ßOvIbýþ ®rØC$Æö˜÷ªú#û@`¤ðZ?X¿ ¸Ÿ(ï@¸ Ÿ°®Þ˜ƒÑ!ÇÒ‹5aO Ô+µ!±…­zø„‘]]- ÷"pÝd61®ëî&˜÷x7áwf×F”Uq7h—tÏX“xÏÜ‘ïÉhÂv°®T Ûîãî>®¼ƒww×Fq´‘£svmtBHìsèj#O€ïx,±D€‰A0ºšñÕv\Ïî Óòú|úp¦euÃLç÷*ucœB;¥ôÔå ’`]ÞŠc³¦8&ã‚>abÍD £¹³Æ˜Íxk Œcl ™ü* „\€ªe?½ƒ¹Ö•*Â&äí1!rå·Ôî$“,± u‹-oʃb¼dT­°¾ÔêZ|ÄÔ¨8—%ø{8º¥ºœÃOZ¬H#ËuêÜO*{aÑyœExXÎÜ”ÃX%By7‡ŸêŠÎO½ïDˆÍ5 »×°{ K÷<SGd1.YÛXóbŠ2O ç0¾µMƒÑÕ%nµct²•ãúzq}É•'ØoÂÞQJ¼õY±ãíó×|Ú‘X7v$Ö¦èŽÄ+@bße v$–ÆÁ²,̤‰w$^/ ±áï9á¼ Ž¶ãȉz׺}Ö@w]¿^´ÉYíÎMÒBᯎU=Í4\Àµ'%|Òˆž?z×´b{§ybÌ1÷Euz²*?:[™×_k’®{åÅÆÞ³nΤõLüN#âÆuK ”ks«4iж˜6\i›$¹Â9:Û˜ u E)éÅ…<Åï´€V >ž¬ 2ø8ŽwÄñ8˜Ä.Xº€2x`(í±%>Q8—<´‘€jÌL0‚ÄÔHuª$ ûpõã À¡ "”la{øéÒã Òõ¤GY5=†ÂÉë¬CÍÇìËPæ±RQA/~ñvŸäÍ;lÀÁ­ˆpp¶ÿ8 ô€ ‰IHZÚÑ$m+_b’´l>LW“®ó7Ë"°—W“W]¹«2È©ï)lcE£”ªcZ~Æ 'Øx²p`AѨX[„·œÊZedVfŒÇXx™¯v†àÛÅ5—¹Ãˆ†ý/l†OØÓž]Š'ØvŒX ø€7=ïDÔ–ÆÙÐHh“:£$}ü@fnêa.1!'BÍ Ê@ ž›Zòq/GŒp”˜‰ÄR1ŸÙõöGl 7ÆGÉìVU;ˆå aIL.&RÚ7`‰ˆ6•AÑ5zUÍn!ëBÄǨŒþ–H&#„)Š¿Æä¤˜È\üonBm‚©«±Cû–pÏ $5Á $ŽžÙlX•§ÒΛËNˆò`•AL)YlprJ%“5-Ô)KlqÆÐ¢ÊBÑ¡B*°Ðc³PÅœXD5W»:TsÛH,o$®Íàš‡¸vCêiZ%Å»ñ{Y5æ.8@µ¶Òp‰q‘u‡ë„#ŠLi).ƱL‹@|¡ÓT„hÇK…YãCÿ¸äsc…ôÒ—°RmðÜTÛ¸ ³Ö]ÑÜ1ÕJñÑh¼·q¯Ðä3çðzpÉ4q ›Z)DØ =ªÃ9/ÐW+¶hÔJqQ+Í4Mvlü ÆèI êùцVA«­¯½SMÿš0ƒ½Óö?¥ ú}­5®­§õs`1,‡O²èL4¹ ¹Øˆ{qtÆ–ö#䯅+øéÞl_StVQh–Msó¯´50G®}­øòèzV,¤0ƒp¥p,a¬!­ñ8‚¼ÂYcn Ôã`ºµ3Ï+³K³Ó‹è N„:ÿFÿ »"8°F„™ôSâ [ŠJLèõâ2LuªxÞla¦*+…ì‰n1@â &l¢ÂŽ«®|bbYâB‰³Y˜ó 8®ç†Ç!usV1åy¨ètq§¹©LO¡2ÁþDjskETS •X r쟉)ë*ÆÊXeáó¢QwÊ7Ñ)MæèÚFàz0s³.8³.ôzHÈ&™,ÏCÃ`•i„v_Cí®c ‰iK¼^7Ñ ªˆˆÈë8êœâ~ÝXÚ^ p%îÓŽûïàýΔÂvAmÛ=ºiºë¡´ÏPk‚°žÍo U†l¥J%}ST7qY7UU§Òyc|icÅêÆO#o|]U‹·þWnbÓ^å ÊlacFÇö&‹´¸í>¦èôù;Û¨TÔ®2û²ªÊgæè©¯LˆkòQ‰ˆÚ³(‹P{Îïghè•:v*¢ÄD# 1Òi_¤B%"mDõ@› ³RE׈´|ߤHÕ`šdL<ž‘]ïçR)šªíƒBKi+f<(E£†ØŠ|´{He䘮. î¨ÊTšl$_°ä"‡mˆƒÖR‚˜›q˜Y—wãËïTœbÊ»ÃSb<øÙþº‡»¶- ÷šíB¢Ï›më­auHÍæ ~’µQ*ËKK-l²aw¿Ã4„IÔt㕪^aLPå>ÓË[NL:&7={䉺ò€‘^,;ªT²2 èÔ9¾knë7*Ú2!*;¿9Ôš>Íwõd¥(Øgºv¸îÙ“5¹:‹é÷­Uƴ׬¬4•¢Ú³j/4x†Üd·ÔÀÿ™6Âú¡æ1{eU@©%*)&¡1ëÍÜ]’º¼åª›)Ñ„ –çü¶Žn?Ð%ã˜Ýi]n¥¾)àɒÁ»½„3fâϺrß ´õ@ÂJâØTJuCÚl]¶,¦.¥_FÏô¬lsDc»¶ïé3Žà#oøh'šFQò1×!¥æªxgÊ)+œ¯RŒ+µ¾v¡ö[°™9gŒ /C;a‰1‚ —_éÖªªúd=î'žLÊ®6s`ßgí®Þ¼QÑithÊ‚p96Pñd‰uì©JS*—¿–¾i¾‘.ø©HSY±õŽí›¯xNÙ’¾ªª×kÀ;­:n á71ÁþÔ{8n.‚›ÈÍ÷…wð àJ…6* uˆ•:pš‡5pðB5x*Ô‰I8m”ÀÁáÜ¿Þ÷“ÍÂíÝL:óžI$ë– `I"f€‹”‹D`Ñ Þg–¸)*»ah€WJUPå0̬™ä5“ÖÆò†åZµ<ïàûI¾-¼¨"ÏJ7¬Ó‰Uý•€‡3p é[ÛÁª{ך°‡ ]»N $HEBÞc†ñncH8i¢^±Á»Ë¨ÐæhµætîÜ”÷—v¢çÕ Ï眬_’Þ±6¸ü[ÉjÙ ô¥qö}uO{/Ðß ôØ ô×àKÚçõ{þì±½@_Äè½@/Ðß ­™ýeÄKlá†y¯W×Õ9 ¶þ-cUà]›ÐÓ·•½A*æG8]ž`IÂ+Ås³ØJÂ_ƒï¤” —Ý[‹u¥ë0]©X±¼ØvÞuDÞ:UÔkš*)ïÝ%Vœ0"ìò®EÊ2"Ô®î"Ô7D„“ÌÔ›.ví±l›év K”µjÆðŽÄãàõà`ºá\>ö𠈕¶uïJžÄܾ?UX)±ÖDÆ_^b‚ì0qE¨Õ™X$cqïà¹1ÔaÐób½ gà`®:mÑÁa]HÞ0â{8·­EO…•&hŽ=íl=¸›¨}Æôja(µ#Ä ¡÷ ãMàõ0= 6†v†±;qõ$ƒ³KÆÁùõ.sÚcš %˜8<ÆN¬ `N–éA! ·*Ýr¸¯?|5¸n¹˜,…nüïM]Ûu§ °ï©+!óëAèf«ð8ÌI柪•µ„,ÊáuïÕ$RüÇï‡:̹!¨§„ø ñ$énªŠv–1Œ±w$cx¥ÆæDÏÛ;¢µjO]zÓIo*¿ %ªÙp…´@yœ‡JtzÇ21{}MR)·]m{ÊS–Åóe}w“Ñâ:‰Vº×ÜS}ÀÝåÓ WuµHr'WvLÛ1mÇ´%aZ™]Ö°cU¥½£ÐŽBš’à“·d*Õ“bî÷s?X#œ£g¢{ÍøŽ\$ráxå’¥W7;ŸK…>c×ÞÁñvÝ“ÌøÕsƒB'!â–H¦?UªkëÔzÉN2§:7˜ª3Rª“¿ø\'Ñ#@WWS§rq"±¬»Ü `Å.Óv n­œÛ»îì·.¬–ÖL§o|g`ÊÊÞšÑ4j#'y'1‚ÜéRG¬ñU>éM¦oÌ0MA¹,‡A-QIš¬4¡–le";¥yí]4aòcV»×R‰ýŽf{ 7q›ë˜&6‘]!,-! á'˜¯øñÈF!vï#!AS¹k›wQÅ#£½Ñ»a(0Uu5—m.rüil!fÁìv‚CmÛ‹)©w m/WS@èÞ\Tn°û‚·a ãŒG4Áæ`¼XFöu Løµ¾NJ†¦ÆÁZ‘¡Lθ¹h—ç¢,9]dÕZÖC€µ6DXlê@Õ'8YØâèy¸iÃÍ1‰ÚÞøBÈǘîޤÒf\'hà7e¸âKˆdXìî¥@Á¢ð€®úðgÄ­\z31S™­Œ!ƒ0÷(Áž à Ä{m¼ 6,¦,°éöGYäÁVV5Ã|pncV£”  ákÑ•`íêpç¬Ê£!,rW@#—;‰»Qdðn:2ACÆäŠÌý— {“˜É/éÚ»1%Ó| 8#ÎiÐ-AÈЫöIdû¼ Ö°ä ÅbîÙŒ™^¬\(UD¨±]¨V½ŠAݬþ^ Sa3iJêþ‹IË¥Òok¶fâj_å!øÄ8س„ÑúëðuÌ*s#ñk&|!‘%½êÁÁ¯Vk‡Ü(Ô`Ê#áÖF„W $“¯Õ àY‡:VWV)s&rò$•:NT¤7¥Ò– )«f×fΑ›¬§:…›Îˆ;¶pwˆdýáq§¹è%eÆ kè.a_Õ‹PÆÎL+Eìš_S‰%UDà#qf/A³v^aŽ¹Â¯ öK¢Zë8~G‚à >¸)ä:ˆ2|–º5DLQ'3£aTR’ºER‹ÉäúÏ"~úsø~’eQÔ?ýƒ{¡ºZybwfÎ@{¸\›Óú×D¾Y|ye‰Aj¶)lèùEÿI{˜Ï[ AdûÇ )ÆksûÔ®´§kZ‘Çþ‰#Î<ý¶BŠã?X&¯,Ãà¯ÁwZi5“–þ¢ü•¸óßO3îfþî³|º¬©áp'šß¿|bBÀáÈ,˜Â8pmK¾kèú.\3Y8¥Ö¦¹&aX^«Û%¬ÌܱE§‘¢ãöEÎAþ|øüð5MŒ6 endstream endobj 5040 0 obj 5482 endobj 5044 0 obj [276 /XYZ 38.2500000 581 0] endobj 5045 0 obj [276 /XYZ 38.2500000 581 0] endobj 5043 0 obj << /Type /Page /Parent 2 0 R /Contents 5046 0 R /Resources 5048 0 R /Annots 5049 0 R /MediaBox [0 0 595 842] >> endobj 5048 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5049 0 obj [ ] endobj 5046 0 obj << /Length 5047 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€ÛâC¤f&v€ l ‡E7›`‘]d²‡üýô´¨ž±Ô_uëIIÝŠ‘Œ3´ÈbU±ždÕÇ?}ù{ñÏߊO_þS| ?Ÿ¾ìʽ¯Êö?ÅëŸï¡ë}ø{áëªøöËî¥xÙ=ïžÿû²k?øòô—ÃßþWèâχÿþ\üð·Ã/ ÿèõü²óÊ~þûø³ñêð·òôóõ÷ÿÚýõwů¯3vË`¾ÿÿ´óMã^Á¸°ôˮۦ:þùíÛ¯»-Æ­R™ªit¡¬±…j¬.þûÝO‡ºéË}c•òÎúrÊB^WªM¡tS¶¬ ÿÄ™^ÅŸÜ™×yMÞB+Ê8%Ï‘¸Î˜çˆ ï ÿ4{ ÚV‡c›lò#䱑H‹'IYgT‹žÊ åÃt¦O€}¯\B¾9B+mñì‰ëµ²AÆ$ÀÿÛô &7Ö¥›üyt¬â ³Ç$®iêAM•ýÝì)Ðo›t·…<6R:ÒÂÉcRÖé`Ž˜Ò&@ÐiúØot:;­…<:V:Úf3 ¥ý 0÷_„¿î>~VVÀrÅןÀ×l|= ¥*>tIYF,~©úCñõç]³wºê@¼4¢,1x¶Ž|†ë8ø „ÃV>¡ýg«ál$ öo ~ó ~ƒak¿ùôõÀŽÉ9ÉÚnU3¿ã ræ$ G0Wào MJL8²dŽNúcF«õEx,bŒh‚Âø›¨|™¿ªTðKÑcóüñ¨Óà*òH9¿Ì ´ ”CX? ²JB|†\ÇâÂ3,è0ÈË‚|!øß@Íkñ™Pk|j1Ô˜¦6ÆîÃû1X4e€i2Ÿgƒµ:cózO˜ ZµÂ~°‰-(ÂꊫáëË'l`{,ªäÂx3PK(Œ,íðÆüF8%oX:,Äv¨êåX7f;³1‹m¬éðlÄÙäÖ¨ø¤¶ƒ†|Wªâã± z {ÓW ^Әߺäa{Ç ôa|OÌ M£z&‚|ƒ° Ö?ü¦bô¡w³ZåÞ/G‡ÞvüH, Ô‚_s á¾Æeæ¤àfÙVÕZ ­ÌH×™ÝXiìCÍxÓŒ€%!aÙ0Ö7ÖLìœò3ë±<ñ:˜,Žƒ`Kzá1í§d¹(é ±ˆ-‹O ‰+!)Ï‹€Mˆx7#4¶Ç0åÿ·dr¹7ÆXª.Ã"ÔMî|ë­Q8×I7Ä©ÝNúvÒ»“nTšó,ðÔˆ2s7IàØ\§i•¹m!³€)‡! öÃÄX„;Xªâø'æoæŸrÙóÃ&PnRUç¾e±ÎØl\®¸ŸÌg.ÝÆäZ˜œÎü¢\²SàQâ&œ@S&>yT¸ÍÕòÝ816'bM¹q¢h-,ÃŽ°Sn]åÌ]磯ڀ%my\Òê.Tµªöec^ke¼±K;Rïë¦<â§Ï°çF<iÕ®Ý[ÓVäèõÛ/šDµ6¿2{£kuz1páVŸ˜}e]ý݃õpfo0p̨ *]Ì:A&Trn$‚évD©q×0Ƥ¶0›E³ÙŒ¯ã¬ï²ã[¨X¤x)Ê“äZš4Ý‹E*ƒývÂÐ8ÿKh$#Á‘ ÁE¨#P«.TsŽTÚIUU©‚™£Ê}Õ‚Óßô™‘°j¯]Õð›zülÓÀož:5åUOå|:‰Îž¶F Üi‰¾ÑpCŒ³3; ì̈¸Æß`0‚an§Á$°{ßNwv‚àµÂØi!p{£tOµÁoÀÙ0Êhf5:²Æ4½3B÷£hÁ¹ó1xÂuVÀ5ë´ôõ{Ó70ÔA:˜úBØ‚ã6ŠÃ‚Ò…á\\‰)'pÞi4N¾àUÍÉR0®•Ö}tœq‚—ÎèÐÝPŸYÎ}S÷ l®c7Gp€° l` nA ¿a À±Sìê…sÿùÐÇd¶Ükè±9˸oăëScÆÇeâg1ªל8 ”ˌÌ|ÀgŸ'f6ˆa¨Ààí±Ïš˜ Ñ(ˆmL0ƒzJ­ +]õt!áTiØÃÔÄ„À2‰‘׋ÖK†¼qƒÁƒ§¯ßìç«õúž:|tᩳfÁâÇjálÂIÈÄò3¡Æ¨ˆ,>Œµã**–>")AŸb&†,#¤¦ ^˜á®¸Â’UÉ5«*G¨ÖÈÞÁ?ª®Wî™0!càT>™„VTqÊp:Ê…ý”Sì |b®·D°§Èxa„d£Ôq {M`o<=l K$}(Ì©îÁ #£² í¨’a6ÅŸ3?í\¬7Ä‹dœéeªª å¨UXðM3êÆ.† ß}en¸fzÛ+Ü[ƒëŒfáX_ž^Éâ=ÜÇ‚öÂKù¨Ü'ÜY$^ „TmNÒê"\ezQ/ÌFàW VÔ7FBÕæMgT¹œó†©·SäK®:ãø±À/ønQ $îàœU|Õ\<'óWˆ ÞEŒøI·ª ‰+ØFø S»Ž¹Ã9-›¸5€\Ç}«Â¼Æ·³jƒ¦»Å/XÙ—F²@Z«®f®/sõÛ¥²ëQ‹ÏÆ"~«Žå±SÆó¡lµ»©­¶YMγŸT‹oÁñ“È–¤pVéûvrÁ'5§Û¨)œîGOoì·3,QŽÐ-Œ-ÍhëÈr [æ7†kƒ%dƗĹ²ټóÍ;ŸÆåyxÙæ®Äô`êJ0¹ <ÂäBïÇFYòÙ¤:A1vMT® ÆQ¢÷_N¨qk©ÒÔSº],Z#2–á8êæaÿ0çdµÚÚ¿õß´5'WãzDóÛ” ÈtÎ-Ÿ« bzÄnö/íôJúâøÒv¹µ…g%}éÌ÷ø™™Æïú¦ßX.HãÛSL¥úùwŠ¥i`#z Æíø½t+Pé)]Üʼ‚­‡×aî×eêîp?1ªã=#££öKez…2wÌ1QwÕ+ÓÅmsU3õêTôæÞ6e*t9âŸ0ýàÙ%.̵vF®ÇôÛ´Ós­«žuö‹+ÏpïàÍ›×ö½1«}¥¶yÔ›¾·Öûg¥4Ýü­¬•vnÕüBõ¾Zðýˆœ´7egÚÞÿ'øXL߳ã7ún¸J8Ï«”ªY¥6ww)­µÝa˜Y£^ˆ™ÓóU¡¸ó=51ñÖti®ûQ«¾˜‡+ª…3µ©ÄmT~aŠãüM¦g©Ì:˜û°ñB\Ä”+°àsF\ø |ç̸ìk3<µ¹x’¶Sãd Óp‘xžÆ´§;Ùt–5°A—Å­»¢=½`\VúÔÐêÔø§ßSdL1ìL=„d.8³gDy̸yÖaG ¢²ñÅêÁãR—L‹¢µÇ+ÅR¥¼suÀä'n äÊ¿ëùÔcÍÓ#TÓo>„GX=s#—´Æ¡õ¾§Ön\uÒ/¡îwZõèË4èe¢DÂͼ–’××Ófú3BØÀ Z Äõ7§¨O™4ư+n¸tIÂ&v~›¦Çÿ7GL(CêÚõqH´»™`E'Ü[£Îц2#foh‚Óý‰‘#ÂNñ~°^èˆUµHëFnèÅ$”r1£‹pɨq(¯9“ã¶òÖ<|Ï ¡7ÛkuùîôÅNB)­Óßb õƒ6Úi%¨p Æõˆw Xë_VµcÞR­÷æÓ‰Ì:Xn2ý=‰ž Ÿ£â-¦©OY.E·èˆk1”ɰÅÔÀ™€xÓ5¢÷y†žÃ®¯°0[®—ÂL7Ðdvrý£z ¹²ak™Ò£Œ€[rˆ7W ½\ÖÌ\Ú?³8HÀm*Õ÷/¶Õ^¥¥ì_¬TÕWÓD/]S!q<Ð×ÂU“¨ý¢‘ɳ¤@媌dFM Ò˜Ÿq£ìŒq6ÆPÅ“ n†a6ÀX"L‰‹,CøîÔ©«V*B1"ç×Aw"*L%‰ Ã0eBàFˆ\æ‘À1D8Oø¹‘¬¡LÌ\±Œ"¢¨Nñó» SÒ!Ìzü‘ÄWÑJד¶ó?wšÓʵÞôð1gšÇÖº •çÉt¹"×%* „Ö"Ä}ï¡´`*T1õ»æ²U"ß#ˆúh–BWÔ¸×Êóûs±Ab“UåªBèÊ“êŠ+¸AÇøŽ‰ï‚,/v±ª{sŒ&œ½`â›GBè‡Q«Qq?æv S¿2W¯3ñÈÜŽ;–r“'©×á{Ê+Í¦Òø-¾7Kd÷ç ôÇM¶âlÄÃ^Á<˜ë¡`Îj8®:5¡ R«®‘1ª†Ã¾ñU‹@h¯ +(…å™: ¸Z‘tÇ t!µú ÞZ1ç[kÁ²ôÆ$Îë‹ðÔ"¤udáŽ\£&`‘ª<„¥ÆQ7P£šÒ` Äh:,/~ê¼JÃqGpU#FFÆ­û·~\+4r‰bHª)>ØÊX[Š©ý…­ÃÔ$Z/e« †©«B$®16?å¶ ‘‘½ß¥7Úòz õ&sYpóëÃÅ[cvJ“û%,Ùv°ød`½‰£kØÀü_\N4g\À ÄÚG2qDn‹âq‚}–ÍvºÀùËÔš}$g£t_»Þ]]Vs¬ª{UY"ɪ{ÓfeË-Äv­­™pÒ"_s'tˆ€ùǨ<Ùfq|½åX·k"í¦äX)¹ÎäæàÉ$$^‡ÉÜl’‹“\‚MSJÒNÈkáHÊIÈœ¾u]O¹%‘Ó?kÊÞª0wøS¼áz¾ô®¸«\ŸÚ(³/Õ냚â­Ö~Ës箫¶pû3t[)«÷úx©øýH{òÝp$àGïÞÁéÂWžÏ¬c.=A8Ûç°ÓÁ›¢«ÅsíH%V…­62~¦ƒ/6ŸÙ†Â³ÁoBÚUÚú»Ê³,ýþýqù'´VhJ5оÆM0‡é(Ñþþýˆê³.VIƒ™“SXn#ä–ÏU»|èoƒ‚”ô9ÃüZOç0_š}NW²ÚÃ…‘ §/Éèây÷ÛÀ¹- endstream endobj 5047 0 obj 3897 endobj 5050 0 obj << /Type /Page /Parent 2 0 R /Contents 5051 0 R /Resources 5053 0 R /Annots 5054 0 R /MediaBox [0 0 595 842] >> endobj 5053 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 5054 0 obj [ ] endobj 5051 0 obj << /Length 5052 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`="©'èyÈ!À`È!È!˜Í&Xd™ì!?²%yÚ’¿²ô©HÑ6·±Ó3Í6Y,Ö»ŠÅ7üü÷ý?Û¿y÷ù?û¯ý÷wŸwÙ¡*²î¿ýñë‡×?°õ¡ÿû¾ª‹ý×_vßößvŸvŸÚ?¿íº|~÷çöoÿÛÛýŸÚÿÞÿõoíìéø ¿ì*Sµßÿ}úÞT¦ý[vþ~üù¿vùÝþ×ãŒÃr=0—ÿþÁ–uSVG0n,ým7lÓœ¾~ûúëîM‡€e«®j\¾7ùñ&·ûÿþc÷S»À0}vhrcª2¯²5 Uö´RÙìmZ\—“uN_:³ýÉë,ϽMÞA®ãJ#N®x²u;Qžö}ìŸÞÃä.+ýM~‚\+ýÙ ³k®kêAÇU=à˜ÞÇäUáqòäêXÏ®y¸µÉz™ÜоOïaòÆ:“Ÿ WÇÊp¸xvÍÃmš¢W¸--yÀÿ0½ü7Uc=RÎru¬ ‡;™ýÓ’Y0(ÝO€QøMøàÛ/»7[3 Üù©…ì´`÷íË/»¼ýÇÑNÈ›ý—÷¿oáyùÃþËÏ»ü»ÎR>þ^7’ÑwhÄv#Æмlåñ«Ï”§‘úP7Yi‹WŸ1©O#n˜ìÕHŽ>ƒaÃû± œÍ‘j9îTXΆñ–ux«gLÏ ÒÖÅN#ÅÁÙÚ\Άßt$ã†ÍAäÇÑ ÞàÛÙ¿* bV ;†‘9cŠf!H=]|øÒʨuâÅäG•vUÂTÅQÂÔ-„ýªy·»æpóbwïш+ш} gûG> ‘þ`¯­ÓÀÏ@ØzfZÁóàÀÚåŸyÚéõɵÏÀû²6†3¸a§ðäðgØð~ U9GàlÂùMì`zÃ8È%® (×­y:™†yS K¸¼S 5–˜ÏØ0]ÂÙ‰×80-Ë.PUå%k›ìPVæÂiŒ¬°îŒ_ÖnòFî@@z$Ó:ö# Á:v!…0޵®ëˆa|;ÂIqfì|9z~YÀ–cxPõæ‘o\±€o6ÆÜŒxUA‰ë3¢á—uòÜŽ7ý†Ø;[UÃ`Õ†ý`Æ…–†M°ònY I¿4Å|!q+’õ*¸¦+iˆ8¦ú†Òɼ',Á¨Êb#9Ë‹¦—ñ±¦Îôl±­-jl/a0¹a[ŽÐ<*d½¥úªózÄÃØ®3ÞþL¢§+ë0³òR FÆ× ÝÁÞ·ª´ï•ø,`'4‹ñ¸@.`ûô&ã*Bñ øµ˜álBÎR5Óª,'t}®Íâc‚¿iEùŒ¹|ìôöÌ+áDLýH€¨gS¦†ó=Œ3ñŒ¬&4§Á<©*u%V°â]ýË`‡±†ðg¶·îøX­çi+J.Eʤ eÐ ÚÂ(’ŽÔàupýŻƘ¨ŒüC²êó̦¹‹0Š+#p$M Q\£‰8÷‰cyDÎX¨€H\ocàN£æ`kÅysœ~ÊËæö™¤ê(î„qÕÞ)Q媞I·².U•q§à ‰%n´PK`}háNm±\ë…¬’3u½B®c,b\%ê©cÎV@¼aºdêç°¢NasýqŸÚ5¤t°Y5¬ú>àªyñt•þ \G1Ø’çödžÛ±`×ðÌ¥[0?1'¡> ôò<öc/c9(øtŒ Àã C1Šå^GÕ.¨Rb¾‰­Ý )¤g±ÜÈT:W_2ãµüS(Ää0q‘Éw‚zÉñ@‰PæÚ Só5½|MÜÓÀ§.d¡‰ú‘²¶+ê·üŠ,gò‘0H9ƇÊ1õè|±‰ÙQ`a8Û¤H UØyÄKaÊ1^Õ™—’¶X„jTãßÏ]±2+F‡ó Î‡Ïk Íø ¸£Q‹–S/ŸÆ|Ê´_!™ŠcÏ÷…ÆEÒŒä¥(GµtxImy”—Lšr¢@w˜¶¤<Ö]gõØldnÒáÖwWV“5Éíy`·§U#n¾ùã÷־ˬƒ ÌSÂ:]¬ëÑXïþmË,ê8]bQ‘÷T¥n¬Aü™RŸ¢§“$eþaÀ4U ¯31ApªzzŒçª|­ǽˆÆUºj;w~y7ÚäO¥Ø_ú.‚B‡,6¿‰­|¹OU‚/17õ£dó›`Çs•9w›£ÍG+­er·Ô†D%›n²]ÕN¤î§¢mïz Ää9 K4"¢b©Lê~ÃÖMS-ù÷Юa®$Ï·3¤R­|æwž8H׫y°Ê™%(Æ¿ŠcJøXT ªç£HU•"#ê„bØ:{ûJ‹aæÁ‰‰}ëÄ⪰ù¤ ã*”]†[ùh;âµóøÀ…4SÐ7ivù ThÅsŒ¡€Þ¤=Vqó6¡Z¹„ì’‘»á5&Ú¬ÛsW¨‡·u•_"À9i¼|¯˜zˆ¹ „ï€À„'®(„¹£ÿ4wÔBÞ7Ë‹{8ûL­Ý Œ¬ê’d÷>ËMnðzghU¬ê¼ Üý%¨‚º}IÜ £öƒ!À4FÜÉeîâ 8 pí…ʃÐrqîꎱ ÙUo¸ øÅ·'±ôÅ·‚¡$Mò?n® †RŸv(zc^I:©à›Ñï ¶¼½ï÷…g@zîp¢¬ûCéJÌ'LU7¶ˆu()×Á^^' 7 -ï/ò<º¿ÈÂP_œNhQjU:HÚڋ܈¤»ÇmHËó ñT7$|·FÂìîüN²Ã·¸ÒE™Ÿqú`QX¡·cº4úÒÔ"Œñf)»âÑè€éJÜ%Õíq‡]]k²Åâ75ñ¾±w’(6Å2}q™Ž¹ö–/†þ«5ù‘Ô·R„:õ­¤b1‚'ÈØª„"P/ÑOŸ»Ž£kdÙ¬ÊE1õ·80Ⱦ+³&ú䥶¼Ly;.ªRVTîÜi>T·Øª9o¾ž._géòõ¬}m{„šMå¶Ý‚f{¸ìŸiš z—xóåÂ}-â²\Èšò:2I׊Q@a‡ÈRm&B"Ø5‰¥È*Ž`/ƒy±Gò‰h!ÎÓ=\ôóÁò6±¿¾W—ö6æŸFF ùðToA½YPΨ‡ª„ç‰; ‘6B>tí´ç¡ªd%k,k,rÓdÏ'o›‹¸e ä‰:UÁJR½ýÈØÄÛÚO7r M1¤5B=åÁ´‰Äù!“ÀDëC5¾òÛ¥‡i.¬£ñó> õ†ÜöO‘ÄòŒŽïW슑I6Up›Êë+vÍXAøo¢\ºÑšÒ>I7+KiCF’-h—ŠÑ5?GêeÐ9eæ ‡“¡¶¢~Ž0¤b,XS£ßÛ7ÄŽ·Æ@n p¿àˆÓ‰ÏöÇv¬Ô`,ézŒY[ãXá.P«ºFx|OøGÐð©¶ÍJr„…1]Šƒ’YLãg]EÈ<#À´ì¾-ÎQ³òÓ©Æ\`L&ÝçF¼ªŠ·;@è¯ úÓŽ>µp1ÂP0Ít°'úa3á3G†=üg"n¬+[C=—ôhd ÀŒ.KlîVéÚ‰&\K•¦e”K$. ®âä3.5ÂÕ¸p§qúÀ°¸PzCÏLû‚ÔP%òÞsÚbÑÉ —ˆ‰H\z!ð.× ð–«¥nfÈÎ|¸àœdg¸&y›äí#ÊÛû¤Ñ ò¶+$y›Q ·“$æ¨o“$ÖÄcØT/¸%dôýÊè€m>“…nŸŸm»,nZ®Wè’xð*ŠVë±wÒj½1å¹ùÓhø¤y%>Iš7i^O²¦^£EŸç9ÃgÏsV·a¾ +pãíaÝÆ<¤ŒecMFü¨NâS‰O-ÔmÂ5~¸ÓÈÛ-5¦I1Ï™M—ÆRk«¤%b׉·“þ¸­?¬Yó$I¨'yžÇöŽü §ÆºÐÏ¢gXŽÁê¡UÕX¨°‘ *û’7/Ê âFk1ô–ã‡p1…`mqåŽâÓ&è@ˆCÂàÚaKž‰•ëF12M¼ Ë<>-p aÅ xÙ1ß0:´ý¬Î'2Q}ʃQåg6KŒ(·neô;æt¬C17a߆ð™ˆ{~èy ïyl©ÈŸÂkìù²s0ÿ#»½´‹Þ÷lB×éêZ,+˜*%¦­¾Ð˜ß#¨œ‰² °=6LMŽ 3^OÄôµì$lHA×b{ƒ‰¶ž¦Qj]ÀÓ. l®M$*Åb·…œYSùhö“®Î‰ÝrÎFsÂÁ질£¹Âƒ DÔK×â©)­  鎵¹é±.OÈåâí>¹ö‰rÞ!¥PÜP–Bø™ÛQø„Jb´Öƒùöæ{…SÀPcOgóÎAæ§+{L¶)c`cîë§­ú8sPÍR¯©Äæ]¼ù˜gkj £ß]S çp.φõ„*?mËIõõñG òަwØA|!dR|ÖqIëZô¤S ¦8d»ã€KŸ±·M% ‰ÏkÁŽ1$ºQ*Õ˜M¹› ã Ç2¨‘Ú‹8Ϧ¢’‰À0æV‘K]êô,_úÓ•U5ÓLeFˆì'µªiFù)›‡÷Y`øVÈ÷bØæ‡wt,J vC…gLY5–—8|#ŠT֞х&°°]’ù#üÔPî†`JáÙ0º&Î >uì°n–rœx®|`/@ø®´7ÁôlþE‘!lc&eJEíT«!tÜæ­2²wZóÆX¤ÞÕ¯Ëê‘ àœ°ÒDÖa6$4jŒ5Ò4¸©ëg,0‰”?ÆUa¢‘¸¼ï¥yUFÞ~í¿µ,*rð§[¿0ƒÅë«ÞBfŽ…ƒû±ÝÕ•ãîœ:{°§,ëë‘î<ÊéH_Lo}áâ+n ׿Gë¸[ròlûNj'û󯤑.d(§ìI«¬Q¯lÃàÙàgzž6‹¶^}'[–àŽo! ÿÕx±œ –q¸á$ºŸO¥ù+Àv<Lø8…uà6ú†g×Ìâ—ñ6`!H½n¸Fa˜^ëõVeîÐK§™¤RöBNß’ÑûO»ÿw]r# endstream endobj 5052 0 obj 4687 endobj 5056 0 obj [278 /XYZ 38.2500000 558.500000 0] endobj 5057 0 obj [278 /XYZ 38.2500000 242 0] endobj 5058 0 obj [278 /XYZ 38.2500000 785 0] endobj 5059 0 obj [278 /XYZ 38.2500000 558.500000 0] endobj 5060 0 obj [278 /XYZ 38.2500000 242 0] endobj 5061 0 obj [278 /XYZ 38.2500000 785 0] endobj 5055 0 obj << /Type /Page /Parent 2 0 R /Contents 5062 0 R /Resources 5064 0 R /Annots 5065 0 R /MediaBox [0 0 595 842] >> endobj 5064 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 5065 0 obj [ ] endobj 5062 0 obj << /Length 5063 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯èóÛII”€ €=¶äÀ°‚o6‹E¼ˆ³‡üýt·Ô=3T%ñë"%õhÄöÐâ£Xï*V½ùÓçìþõûîÍãçÿì¾ö¿?~~(ö¾*ºÿvÇ_?>ÿmöýŸw¾©v_¿=|ß}øôðéðÿߺ>?þåð§ÿíìîχÿýºûÛß?ü©ÿGÇðíÁøýß§ß[o*.¿þËÃ_Øývœñ¼\¿™—ÿÑÖmëšã6F–þþp>¦9ýúýëoo:Ä­R¹¶ñõΔ®Ü™¶´»ÿþóáçÃçé‹}[ãëÒ·,äí®*‹Â¦°m±sE9XèôKgz“`rgÊt“Ÿv®ãj#Ï®y¹®ö€Ú*øÏ³§Y§Dœãεr¾Z8¹æÍÖ®G}[´ t™>ô›KK6ùiçêP9ß-ž]ór›¶LÉ“/Ó'€¿1mB¦pÚy2žŒgW¼\SZ“rŸ¦Oq¹µmÓM~Úy*Êf׼ܺ9_îa¶ðo^n[ 1§9_*çËÌþ)f¼•î'@ãÿ.|øîËÛÍA{ß}ùù°³Ó‚Ýo_¾=Øz÷ãQÇ?°›/?íþpÐßÿq÷å×sØam«n݈­ÑHáO#ÕÞÖÝÐeļ…ß4ñ³Ù~ÓÂo»oÜޛƿØÛ‡nÄì«ÖMqð¤úÆÂ¼kcÑIñ:x¶â#šÍ}„³½‡0À{«áyˆ›+ú[¨÷M[‡&œÇ˜ÓH½wæ4ð줞ô]<ô»þðå@ÝiÓ9R&<>€a ¤ Üñ:Þ<Æ#¹þFÀ£G_1Žãó`Çøª†Ge¨¾†GeqB£ö€N/eª}2ªn¤9ÓÛ³X8âáHör_:ÿÁ ž ãà75©N#n_•õKÖ/ìºD;`ð¡G#g3ñ<ÂÞ:ÁØL™/Œ7 ØK–¸b@˜2þúmCÀ"FÏû:AÿQ"¤í¥ëÓUºÇ kí®ýi’·ð€P„«ÄæB¼Ã¤€‘#\¸tñGv€w–-¾[ˆ¢©0¿8¡*É 84 Áh Æ”ÇÔ2±2.Š u3¼O@’é\DÀšw“ÿ)%j^û6äfº| Y’i¢ `k„€ÅHÊÈ|Èš0aˆ|¬‰d¼è]!Q¢äɨ;¦M]¥ßq.µ£7µƒ{3×I(æLaªérޱ%fÇ…!Íb¶…•~øÍüª©Àºá:7„#”šƒÉ8©Ãúf.&1®)@˜ãÝ 0W%,á\»BÕ’¹lF§eøƒÀ»›çP¼u•ß&; ¹Œ\ª}Ä·éåq]…·;ð¹þÁ£‡OÏèC)¬|-ÊŒ`ê¯^åŒÃU½PXgºû{¦¦EèD1žŠûÐwOÖ|JKh>h@˜ç‚›}.¿q„ ÀW*\6#Q˜Í–P°ÖµkvuFU-q½/Å8W¸^SšܰoBŸ×,Ú}Q¶¡ªE#öé¥Üµ‘p¤A#ÎÁ‘25-4UH ž1"BU;cSº´6`¿ &Ö¹·º´­åеX¨‘ÌaSÛ†œ1—G9!U ’ »3§ hÊׯÖ„êé|/ÆE¡bºáp:óðªfa‹@ølÓ†Ô7/ãt… 6T‚BN‡gëS§¯}¹°ñprû9y­k›º÷fâðn¥,&a×™¬*žIdÄb¡!$犽çr+†®’Ï쀢m&ö²”0vBžê­ yj&Ü£ ê‘–Tï 7L6P%Lʤf^kè&Ô.kpO1n Û­w-Á•y?¤ñª&wªJ.>±hÝ5€©2¡ÿ<ƒA}¬6µpT‰ê 2ªT³»uÓ3¥.J„Þ{'2xÛq_&/†‘àoÊZ‡–B´Çä¶ò°Øù½ºÃ.\‹F,v_@‡vRô5 âœ.رGçŽÃÎø….veçN ¿Á#Ð1 „u wPB|+ñÞ DñI1^»wé¬vãwG0–ã`Ãt†)…Èãà»8 ¤MéY¸ŸUÓ ÆÌQ0€ßÜó Œñ^ã]32+whì8ö©Žl´©M›xo–À“‰oZ…Z­›qü7…ÉŒÿXÒaÈ Ô¹¯.£Îƒ5W<1–¡ZAw ¸s?ËÀùmLµL¨S:±kl‘Z#yø†MÔGîL6 –51²ÑfvÚœQß. C€–øæ g §Ü`¿ƒ 5iŽ¡Fao˜~0Üð-¼š›ÃØ›U'vmnã2¾GŒËX‚áuViùeÅŠª¹á†ÝûŒ;õþ\\¥Ç“²ÂžÿÚÒSã°<£çδõÆ¥§Ü ö¨ÒŒ yB\fà&h¢ºÜïk6å”nÖT+‘nÖÇͳîÇŸ# °fñ UÕ0þXæhOg¥€KŠ.¬,–Ê«”4ºÐøb&ŒÇá“òúÔÝàuc`ÍäL¨É 1á­< ÂYqMòÒY)ÍœzŸÃ”>ÌT,©©À¼…¢*Èão¦¿€žÇ>ND±um@"™£ñIßÞúàlºÅl•ÚqsÞ¢³½Lö6äÖóÅx×OJ±V†D›þ¥AY¹pMˆb*=„²Dý¦¨‚ð®SñôRúT‘@Ø!K™MÍÿî÷N°‹x-Á<î^imܹK÷… Âü¶^aJY†¯¬&«E‹~ç·:TD7Òº2¼æYjD#lPf©5›–¬ÛvN"3“uzÏ.Ô¶LF{Y\dm&— ®3ÊÂ]+'®©æ8M(W(aé±Ò´«Æ>G`…}øyvU)–8=…z ƒSëìFÏE¹øàB(Ý]¼`ŠðìZ7‘ã?ÆX y|[XÁë` „¸¬›€!P:ñL³Äé)™ð¿"¤°°køMŤCe‚Æ·ÅXÁ3òN,ÅÞ™«6»£zt%ØQw,µ½°ÔŽ¡™bßE:Ÿ]UFz”¨ö6 ö½r¯}ÓÄÏfñl-ú¦÷Æ;¨îÔ_â1v8E{ݵó|@ßàôJÚµo˜ð›ÎéRï±¥ýÁÍt‚ÀïÝÀÖoãaÝû@¯­ƒwM@¯ƒ¿éEÞµoà-ô,ÈÔgWÈ”|§öÂ[À0pJFá–Ñ”Erš B ãÆJˆã Nô¢,Çñ]©Aw$c¥rg¿Ï™YÛ³ß-d¯é+ºáZV8ûûY #Õ72Õfº§,±¯Ûªš€ÍV85o¹Ýk#æÌµúãžsï Ûa*çÌ%¾—Íœå^3£‚Æ»Æ$ð6ä ªª $SR7J¨’a@‰3\ôžÈJ vÍ ÿR&'+p©ï¼pµÓûØ0 ([c ¦7%S±™¨¹¨&n¢YL;0¥Ö1°ÈÕ^v†ÖzEÝRs~”*RŸ)…š²T³ô±3uÞäšKŒ$­u^ºT*†`¦7'ºeÊ)Ý@7¹+¯XÏàt«j{f÷yÜ» “³4u€¹üº­$ç¿* mæq®”ù÷ð¤ø› 1³ÅàÂ"bzÏå¦:á¹J§*¬2…r)¹\Tè^Lïù\ž[Hƒ—R.tã‘ô²ªî3ÃeeÁ¼â¬ƒ'uÌúˆwy¹œ_Œ#K×sg£=˜ú¶LÁ` ¼4´ZÊÂà9áª{JU´¼›Þ–O¥CeRÝ_éa%ƒ¡‰‡ 昀69y¯yJÃëð_ Íæ³f™t"pœ9ÆtX¦AB”3yÞ÷¿Æú&T¦6ç«è"óãtÑV0Û§8)bO¡õ'Kž"‚“ˆþô0œîãrÌ:ù½¶¶üDc‰‰€/Lá,¬ãÚƒ¥ŒÉ š–!¸&tÃ(ªù;­¨-_5ºÅäÎRׯҳ8Â%›É³¬LÚk²¨f·Lï>©iÔQ‘PHz߆Š(v@ì¡Ê?2DÍ¢•=#²(»dsmǸ¶·À©xÒLÓ²½’æÐÕUhd2þæé~Z›]]í;Ū8ÿäëC]îimӘ˿r/fqÏ×8üûþïþøÙ.øºªÃ5?9|ór'ÇÕ¼˜¥y¹Æ/ï~H„­M¯qÕ——:øÁÂQåouGñ5 èΦ¬¸ÎïÀgÒõRZëB $d ÊA¬„,ÁؘV?®BBOP†•džmYuÛNëöû¢š[D´$TÓ¥ÿ>,ÊÑÆ‰)mr„\¨·`þ²®žs²€üLh²Jè‹`(gº-'è(ø€ºïVUí\MŽ–×£EÏBñ…â¯Z(ÍÀBi®X(ÍÅBñ/,X(þª…⊿b¡ø‹…â_X(>£…Ò¤±P(çÒtïãM£{÷®ÊmÇx‰…ÊøÖ5n#¢ÿ1¦ž˜örx'™aJ%dü’™UÆðÆïƒ1”éPˆ/!¯¹šÒm\6¡œ›¨Ðí#¸Î>á¹›b:B Ù@ÞqÈ^ž³¾LÒ‡/Œ…%a4 wL쀉.Q^ØÙrL¢'I(ÚÆ†ò‡©¥6Ð2o K^ Ä„œsu…Æ|ô¦EКÉÅ´^]jB—Òm0¾µ£f´‘„ü´w[¹KíŽùQ1¯2“¶¦²pïÞsÅXQTäØ^'&ðœÖ²éÑŒ­@ÃÍîX‘øJÞG— ãž:ôtKšbßiáϰ¨F#=8ª½ U÷^i¸öM“i¶Ív®#kud{GW½w§ëx¾ƒÁüÞ .ñýĔµgÑÞð:x×}u€kë¼C#=ò_ƒh¿Á{ûσ¡Ï#¬ÏS¨½dQ5]¬îé_„¸K‘ëΛa^0?OM[¥øÑQˆ\e§8&%CãQ ¥Üh¨sTÞVF±H̦ìÕaì^Õœ´Ô¼K5Óè™fs½•BJ¹ã}(x°‰©t'E1Ž°Ù¼@wb™ƒd°ô‘†´@r‰OÆfÇmQ˜×}TÚ/ã½UõÑ ëDä%…nÆ‘-é Ç3ðk &Õ‡ hADi0ÊŇàS†}ÈÓ\y!L˜ÊdÆ„d âÅD±fÍt©šÝqN¥|.E(&~¤hZ¥©z ¥sô<‡#Ñ‚†*üž>zd+ò"•ÄIæ17VqVÇä«0/ft]cò=½{±,Æ­¼\ ÌØýÍ”U9JÄVǪ}1Ý¢ð7DMwÝnQ˜ùéö5ÉY%°ô·tQ®X†×ÁU¤ñõ1¾à¾éBå:ü<_µ‹ÓÅi==Êö–žÕa|Áw‚«JâõÈ™*™LBŠ6q?çŒXQ™³v°6­€/KQ^ç†bTº¶S8"à–’»Žú”÷V=jþœœQko.QëMÝäĦÇ&-ËÈQðî–…%Cþõè/L'rûî ¸_!áž?Ê&tYÄ7ÀÀñ-àl18²N¬Zzow_Ý’ã³NngñÎLÚrܲå¸)K#øM ï4+z³Qà ¼³œ½\:×’ó0ïM²8oÞéBô€v‚­–+“c,†<ν3ÀÆ;¹®æ%œ kVŒRx‹£ª)2ÔHY0ŒMˆo›ÐúŒªgãÁ28qS´ãQõL­“êêOë„Ás¼<üÚ}?  ˆŸŸÆþÁ„0ds yqû¨;ÜÙKä§“G×Þ\vûöWâZuÚ½=ŽrÏz8Ò¿C±ûzP•²ÛÁµhÜ{´Ž«Nrmoû“ŠÆôq:r-C6‡‹ŸÔÃöˆvmzGJt ƒgƒßô!Jutÿ„¶,Âÿ\\ž›h-[Å£€ÁoÁ äpç›è~þ|Ä„(€[z«ÁȯSXÜ«t £½ Áln©W¯aÆ×æv ó…Û÷Üi"ªÁn3½õ×óé1½ûôð„¥Ô$ endstream endobj 5063 0 obj 5900 endobj 5066 0 obj << /Type /Page /Parent 2 0 R /Contents 5067 0 R /Resources 5069 0 R /Annots 5070 0 R /MediaBox [0 0 595 842] >> endobj 5069 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 5070 0 obj [ ] endobj 5067 0 obj << /Length 5068 0 R /Filter /FlateDecode >> stream xœí]ˎܸÝ÷WÔ:À”ERÔø ‹† ddx2 ™AœYä÷£îR•ÝT+ñÔ%EU+FâNËÉËû~¾úã§¿þùÛáÕÛOÿ9|ÿ~ûé¡:¶¾:ýçðøç‡ïa»ãøó¡íüáË/__>>|þ÷ëÃé…Ooÿ<üô¿ƒ=üiøïχ¿þmøåã?zü¿<´¦þþ÷Óß}k†ŸªËß¿ÿ×Ã_~wøõñ‹çåÆÍ<ÿÿ?ضê«þq3K}8Ó<ýùí˯¯Nˆ[Åצ3ÝÁÔ®>˜¾¶‡ÿþãá§aóç«c_Ó6u[ݲPkWjºá¶À>|-\èéÎçM‚÷¾J÷ñ§«CŸÆÈ_W¼\[Ù3ôÓÑwŸOðqã]º?í\*ãå _?vmk_õüù¦sÙÊŸ€Ö6  vùzŠ+±]:b>í\(çë†×$e׎´ÖÔ)®öòùÐw•iÒ]íÓÎÕ¡r¾[üuÅËuÃ2'õ>ø/_Oq·Î%Dœ§ke¼ZüqÍ›­«QŠ Ë%Ðåó) ßÚtìþ´su¨œïvòõ1_Á[9ý˜_…ß|~xõÁÔffsøüÓ°¹§5O}€â?<êýÎ>ÿxø}U™ú‡Ï??ôÇÆúóçžToá; |Ç¢'ö ±N¿këÑ×?=yÿy¸¾ä÷æ¼ê»Œ«¶—³BÈUøzí6þ¼¼ƒq®#`ÄÒêóp×Îmq×mA<¨6yRGpE÷&#=wý üÛ0Ó|‚±|›Xañ¿ö:¬`îeÜ5¦ŒœR´¯ºÿ âŠYïÞ¶êT–¬«Ó’}~=ݱë«'(„—píÉ lõq0uü3°Õ§KpÇá§®}öΉ4»ðV®|ÞÀ-ÙáçñGFiÌÑŸöí&~| ãâŸTø£³yþî ï`$äo€´= —Í@V¸'%åÛð#ø ´ðkÄI\ņ÷qa!‚XVÇ£Žy†[rge½m|ÀäÅØÕÁ½aÈbêœÀ“¾ •+åi0¥¨êšPVéòÀ7!€ ,DfØ?ƒz¦‚_ƒ gJÃ0‚aÜÀœÓ}×aŸ_ Ä.áZ–KX¼píâ9‚9YnÆw»S"„>^ß ¼§Ôj›*û³ÌSð×B—°ÞA5êåc1šIB™Û·6¹‚΃%+D9á×>“®íB.%P[¨T0Â>±Š-,ꌖ2÷µ\%U^˜1øåâ½1>¬/?WCkUƒÃj”Mn=¹ïì ynBl˜iAh×ïµN4뵕¯Ïû)Øe,„Ë`È„rµã„¼k&‰ÂM70{Ã0ÀëŒ8RDPÁV­›=Å 1ïá“wð 1‡x_Áwöt‹¢¹P!”Ñ_ü‰“,rã3æ¤V˜šp Ä> /‰DŒ—Thž¡Œcp×5¼SCœ´ä”†ŠI!ÈôD¸øŽg’— æƒÍaèXuoxMé\EÈcƒm—9/\æÔX·Ã»ÆZ9Ö|áyðׯfüN¡W•m»ÌiNUæÖÃC0ÕÓn”²û‘‡ºÏPV…S‹3aˆ°7œÆªê+Äe&w0OÄ·Pˆöãæ¡¸M_Ô^ú³û¢è(ŽéüsÆE!Ãø Qw&ïK7• ™®Êܳ"Ä“â $NíǹÖÄט€?…! ŽâLt"•3g„ÖºîùmÝg©h)Öp‰Ø­`Y«jß‚ŽÍÈqƦƒb1î0Qj>™‡j};‹IE[Æ›ô99¸NµâÝfNc3§×å9•S*Èä®®Gäž ³(º ˜ËsO§…AD2úhû.ZïåUlàkRUéE0ÓˆÜÚÙdÑTÇd{2&X™’®©¯á‚Ý…A™}2 e£·6ŽTaQÚ´q¦ÆŽ‘°B!HÚº_ꀘ{¼E;vÜâezÙª¢‹ZáÄø¢ PG/`*CTU0T LâÊw¼%| F²ïPõ†ª}Jn½) ‹Ç¡„ÒÒTuˆK¦ª— &L¸.%¬2iœ%Ç…"táA˜XÂZ͘Pc^$¹ì´®Zc{Ò~)!ÿ”,ÏÕ}h!`É¢Ûý%ÔcG±‘ÁUxiU áH*¶R¤j¼¬d¯k®.B‚®Œéˆ µ”âÂOê9í{ »P%yä>z{ÓìpO¾™Ý6u»pÏòÇ n¿Ëœ¬m·wÜhæ!:uºÆ®è.µU T†Ý*ë‹£¦rÅàMA¬z÷œ®_ïÂ'Æž݆>ŒÎ¼ =Wà:îMFšñÍ<|1÷ÅÇÞXBr×L¯Œ±Ìä¡—SX.ì€Ð…t=™Tÿ L>Î’õ<‹¡FC˜ÞSL§=†Jð;G±VŸ0÷#X̘W©RI®ØJÉÜE:º>h&òDÄ0ñ×¼v ¯‚z8¥»÷CYŽ˜‚}Fݰõó¸¬êa&P37iKèNPÈjeôõ ˜Da¡§1¾‹o‹ð´1~xfˆü‚2¦34ÆÝ€.cžSsIï,ýœûi‚¥KL±m®ëQch½dŸ¥WP”æÈœ”èÓ+ðbU+J·ÿú6µFÛŸäáO]?Ë/·IéÔÌÂ[ñr|çÊÞe<‘ŠèdŽmfÂãÁ­ÕúˆÏSm[svªÍwÒÒµ)½dèd¥g»ÇÐi®;¥ï”¾mJoÎÞÝmú^Ž5^2Ææ¢gáNu#VLDžñ‰uÌä9Ý;¥æ7aLd2h™úª²:îÔÊÞ™6Æøêv-‰ãªøî :÷¾70y4º‘å"2[»ê–H¡ÅY„NÌ܉gêÿ7‰Ë9ãÇ-+*ÛÕó5¨w'á}Yw0„è®IšDNÎÞ,¸¢fñv³ÅqœŽÈ¾)¹ °è\õLùúTn*†æL&C&ï€ÀñqÞ¹jçáæÄ¡\ÉåT¢Œî\JÄ‘BDø$ƺÁ;d$Ø=dDÈÆô¶ª7>…”Fòº‡ÛŒ"¶’­–.̨™”[Ë*FÑÍå›\.è h|„òð,G,n(4`¼]LÓz?b,R ®õ‰?ä•‹HGÿé¬ó)¡l4Ã!WŽS ¶€0ɪ\CJxK¨°>ŠcÁzذOЉ1ûšè!øŸ g·À¯x}UoŽƒdðˆ]º×í8"îzcVžñ6¸ß»õ3id-Ri@ËA@ç5œp÷o22¸;Ùl.ÏDÊ" Ò©((ñN¾X¿ÌÉO‰Pu5<”_VhucÕ*lSÕ¶¦œøèÎÆé¯‹Õ®–SÈl–Ie6ˤñêFtSŒ Ìgøé%¯žßD5JÑiC‰–9 l?"÷?±ûÇo¯ü˜8kü±êÝRÖM’ÒE0 g?æÏ1 cDšª ’aVBæçêfNvŠ+&pêYÆÉCFü$,]™·'Äù)#BÂc³8CôÆú@–*Ê…ºS]w—Sx\q©Ú¼äöB“Šä¾rcš.D,ÕâR Mß{. º¼â¹æm›öÒW‘HÔ 2®°ÌЍ«Ì¥Þ,ƒkiÜ[r_Ì8)™[ט6ör2Õ±iÍóÊZìÖe¢KD`ˆò“ªê1ª±P_¨üL9NÁÉ„™0™ÜG1ö±ª_–*tÒp}3þ /î,£®ÀR¬û*ðL(6›Îb3ÖÍh]L‘1ŽV·Ëùá¢øf'¼¯b5'Ɇ‚R oB͒蘻;2ûT4mÈ´˜¾M!²)ÿ¥t›)GNê)»Þ|‡ayâE F뉩î¦ÈnŠLÁ•Á9Ù_œ“[²dr•ôDp>Ê Îô(Q-+²c ÂÁœ’º t˜Ž4Éeªm}Hm ‰ñ+2ñåò³’WÌ0Z_KÑi7¦ÛO• FTGdj½ªl5¤M¶£OŒ¹‚Å?‘¿&œ4S(rÓ]ŽНֶøÚv•mšî»»ëö|¨µÝˆ.$鼯VZ„ëû.8Þî·^;ÏÔ×1.í¢!܉O|ZæÊ8É=4X"J~Û³d5sÀúVãÔæ r1jÞ¨m¥÷rÚËhkÆüÀæQèl»AÂŒD&|‚Ð »Æï¨Ž4Æã섽alràá¬B±î˜ÑGõÏ…{ÜXO<ìã 3ðŽôÀÃŽ©»ÇëÀ{ÄwO zdð…»Æ2 qR†s 'eà†q”¡šé‰p ðO¬S²ÌhC‡Àª{ÃkJ²!s\uÓ°Ëœ]æ<>Áú“ê€e|aÄ33¶ ¯ƒß· ÐÂ.sŠ–9‚Ÿá!˜êáI7JY„ ÆÈC]Œg(«ÂCç3aˆ°7Q]ˆÁÔqóD| 9´Ÿ7›krÏf*¦LiÅd{B£kµ¾ØÙIÄÆ•SÉÖÎ)O=zay"5 V³Çl‰IeJÊ4òÑ™(tL:Á—(:&h%wH*/m¦”Kcc„o‚)[â8Ÿ‡%'éVT'+ ¡šÙdJìSišw÷ɡٲ»×j÷Nåž2{¦-->)£«¿Ué¥\9ÃLñP­u)5 gü…FÚÞŽJ©Õ½”Îiðå½Q†V©Æêyaºâ2u¾¼ªy½¶Â˜ÁW×]¦ 1s0'ÂB6E iÒ^´.€TŒÍ£ŠÂ«5¦ z—ïPÓATˆ ŽPÌý0 ‰¬Ïç÷J¦åI®™Â^X²naIíûM¿ø†H)'•Ø.$Øj‰òdª= ,³’ËЗ‡³fÇ3ÇI©Õ\œ«[§L½¸ 2ªÌ„|¹¤_rõ¾JL„XX0ºˆá€L3ÂÑUîxÔÔƒC\JWœB…Sψä7‹•U¨^âÔ¦Q‰L[Úkë}&î!@ 83«sý®g®™é«ËiA2è:p˜–‰ªqœ¥ªµkžŸáï€O„DSlÎbN9žÇé—LÑ'4Ž-‘hŠÏ#$´%¤‚€IcÇëÀrªD…HƉ³Â®qB8NûÆOpb3–°xD¹C%ÎÉøk'ʼnÚ;¬%îB$Åãuäª.£4òþ¬Ò1åI˜oàÓü‰áª»ƒYr0—¼k¡áQYòIË(½­ÛúNyÀÞ.ï%ñ†;ì|ƒçÞ\\Hº–,Æ ¬Uã'Ø‚!Êâ{HÀe¸ǘ’}ü5l{2–9¶`°ŽŽ¡CX¥”?vNƒ5¶²»‹¹S‚« Ø‹i 9Æ.Þô-äáÄÎÌjp”Žhž¢Œ/KaÁö|“ñîý(n¾ºÍ²ÞIÓßr'wv/Çž×m•i1þçÔò».3.ïV»Äû<Žül’fʰe›ªÍŒå Æ íÀk@·ýOÉ8–“lsV¸wwZûvê±g§dLجNÙ4õ ·EáâAðÅâX Ó–ï ÉÙ¹[p,#¿k+{eÕáÏáëðyqõsÿ`ABfwµ0ʸã@\öLßcvѵtáÓ½¶W²ÞN¾R{´O½Ì¾rŸfúd„‚=Ž(ßáöi×rß¡uÜ\bôµ½}OŠj`p¶xýmKܬ>9àÈ>p7œvyå ¾3FLÔÑÛohË"ÜãÏÃŽÏ;Ö²> δ'Ãoâôûpi¼Œø:…uà1L¨ylBU/YoniTï¯aÆ×îv k+w¹ÓBTƒuyß—Aβà‡ÿiù û endstream endobj 5068 0 obj 5472 endobj 5072 0 obj [280 /XYZ 38.2500000 764 0] endobj 5073 0 obj [280 /XYZ 38.2500000 110.750000 0] endobj 5074 0 obj [280 /XYZ 38.2500000 110.750000 0] endobj 5075 0 obj [280 /XYZ 38.2500000 764 0] endobj 5076 0 obj << /Type /Annot /Subtype /Link /Rect [400.500000 778.250000 508.500000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions >> endobj 5071 0 obj << /Type /Page /Parent 2 0 R /Contents 5077 0 R /Resources 5079 0 R /Annots 5080 0 R /MediaBox [0 0 595 842] >> endobj 5079 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5080 0 obj [ 5076 0 R ] endobj 5077 0 obj << /Length 5078 0 R /Filter /FlateDecode >> stream xœí][¯ã¶~÷¯ðs8")êöì¥@ ,v>}(’¦EÝö¡¿¶%cKþFâç!%ÙÊ"ÙÍÑŠ"ç>ÃáÇïÿøåïûþwÿýû/ÿÞÿÐþþþË.;”>kþÙŸ~}wù[Ú?ïËÊïøu÷mÿm÷y÷ùøßo»æ…/ïÿ|üÓÿövÿ§ã¿?ïÿú·ãlÿÒé/üº+Myüý—óïuiŽÊ^?ýü_»¿ünÿÛiÄîsíd®ÿÿ;[šªÊNÓùô·]·Lsþõß~Û}ß ì+>we‘íMîò½©s»ÿÏ?v??Ð Ÿêܘ²ÈËìž•öô¥ÚV{cë#Ùórð¡ó/áþà¹)óhƒ73W§Šq…‘GWdnnmÑÈ¥è~ú¿ apW–ñ?Ï\*-s…ÑUaËÜguÿ|׺r[7D+‹T{=K|O™›™k¥c7\S•}ݪCnªÔ¯ãi›ÏLDÖžg®N•Ž·xtEæú¬è˜ë"8á·ác0×g.¢ägò+S¥e®0º&s ßÈúšû6| ú×&‹7øyæêTé˜;ýsÈ(x*ÍO@ðMxñåëîûOGOQì¿þtœÙùƒÍo_ÝåÇÿ9Åý¥ßýqÿû,sïÿ°ÿúóΘƒÏ‹ê˜þÞùIVœŸT‡ªÎ 볋'ùùI~8äÛ5µO,|ç=|Žfk4šÁßÁsSµR×¼3Ä&Wý°??q/ž”#£}üzèûdÑä'í¾)ަ¶}yütþl}8Ïær¦@OlŽž´Ä ÍTðI©E¤žÖ×=zPL­úr1äÿ`Bˆ ¶!xJŒ€@V̽´ÜtíKž0–™¹Œ£58¢€å™ï Øt£$‹°`3üñüÄœ­Ìµ°`YÌg?LÉ"–ylºñws¿jšç.ÜOtL ΂ÃÁ(â&¼ƒ¹ÎÐ ¾Ãül¡Åñ.ôomDôDXz€Þ¦šR74®“ª)XÆœN²ªLÏI 3=ÖÂAÊlzÂXááŠ1q&1ñ’Kf›iì5ÓÙ[“ŽÆ¾›ìP3óKÎ`¢ äN(CUl5|ÇáH€ð0}%m¸h†\<1ãÌ‹âT"ÙSB“Õ—?ùe÷%’œ¿t-¶"%ìšB(,3*á8ôÖ5q‹‰c…A° y†qèKüQ2_éë@êJáy=/øˆÙ!­eá¯é£\[û;*èJ§õƒ ÛP¡$SjdêÉP#¶àÑÄgR ¦\=ÝRSšI(£Ç×6¯{ª9¡Ò &†ß–.˜°Ž¨³`¢0ö—Jõu-‚nEyL ‚f€54·„Nwî O˜r(fCÈT¥çu<©ªÔ© ¤¶!ñ­tû@Õ3Ærb«ïK×4B"Tÿ"顇P4Å~²J˜=!”LXÄDjæECSqð2=” +´›öÓL¶)$XÂ1Ÿn2å¯O¥¢¶ºç6©¼ v§L¾Ã䲺‘8UÕ ²vÝúÖÕˆ>ÒœN4ôœ¤jÊZ«Cúp˜¨¥?ˆQ+—U{SßLò‹3ƒ*׫£º¦x¡ézÒÊ¿?Ø~õмƒïTš£ ß©Ñh®1ÑÆ6\¼ó ŽÖƼEÇÖ·'/¯ÁWí®í{#NåÁ œ—‘YGd¼©\óxm­ªÜ¢{W ß±ðŠîðanÇ(®aüi±­—É»y? Zžž–#á;x¥ÂåU ¨ƒ³†ïr KƒÒ¿Ã|¯ç=”k:ã¨ÑÁ 6% èT=s=VǬêgÎ÷\,%õËï‹¿5ë€m¢u&ľD8©·±0RU¨³jÔ“éôÎcšªÆóÇI‚qÓMF˜Á£‡EÊ»>j©¡€ÞP6Öº.̵î1´$ºëðŸÔáß1$¢µý·FƒOøø$ÃÐpn­h¥ác5Vjòj0Üd Πm( â–S+O |]ßAùùå·Ýð^¤T¼‡£YbÒÀ1Úļ“J30· .0ÔqÐ38µðsTkó£_u^+’g¾÷P‡3È!A®0T檗Ò6E ³cKð©yövxr•–]°6x´T^'¥nÕùuà¯:bu‚ÍÆÚ§£ˆ1îÉNdæL [\,ó©b‰ùµÇS³Stñ‡qvÕ¾ÅèIËwÄ °ÖÎNAÊUåR (¬¿0Å>PøE.À>aÿù“Ò:xsýÕ¨”\¬ÏmÖ¥&wVu«™‡^IÕN%°oÀ˜ :AÄìY§Ú·gp›ð~’j“èáÙ2Š…÷ž±½;þ³0+zþ¬ 7n`´ ¦ñ‡¬.á¤{{šÂú;‰ 7ôò ùRä%‡€ºBŒçF”?ç/½X8f%+á“-YLZ$µe·!b ¼XȦy@ "LzyÁ 8­Å ø;¸( “dÝr¥`ÓàhXúrÌÓÛèTÛ¥LùS¿ãWYæMf½¡EJµ9.ØèeXﺼN£nÑ >â ‚òØz –˜ÙÚfîÂÚD´š`)f ½„°ÑˆG#ôLˆ|1OÎ1·AÍ‚$â’z•N7)FµiÑ‘œæÖÒ£]÷†l³Nž·BtHd•BäJlä2~œñ wØŠ5J¹Ï×-å[N·åt[N·åt˜ÓlºçY}Í*¥ryóŽ;dƒ]6Ì„:_9!‡Â¼dðU`Štqω­:åë“1‚ð\Çœ{«ü•>S¤Kèä`ðUt·¯‰ýX`fPÈ‚ˆ¦D •«˜F(¾G&¦»ñeßß,P·î`ollöšÀ¸FŸ$Éó¢kIž? ]g–0º7ž†•Ùø‹ð;9î˜ z)rüü~be-Þ×L¼Ñ@•*²|£u ޶pÖÂÀ ©&)Tè®{“‚ Œl*Àº Ü2=¸¥*¶Xd˱ ‚Î^æH‘ ±”7UÏ£Ei½ŒÙîÜfv>Y÷þ½é‰4u‡cäËõô‡©„`ýaÌö`‰*¿”JR6¼Ç,Ÿtb"D£L¯ª¹Ž}í[¢›¹–|ã9µKÄþ=ˆÝM]RÀU;•6ŸŠV.Ä&óý$q5'&V¬ib½-n”Ü÷Ò ü± `*’­Š½á!k]3¢ @Ìx´Weÿ8A™ð ì žÝ£^ëÜ›7Š1){¢ ýAì£ëº/+«XWõVð|5MôDÕ>&»ÎΫÞ4$4nÌŽú>ç y50Xq©Ú¶·C†Îk0Nº{;³c ­‚ækÆâ‰ôUÍ57+úª2¿ôEýæ Ð|Ðpr+ÞÌX¼Y¡=1YiWnPÌñŸÉi¤pcít$ÂùϪN™íßm:e‹²/³yâL?yÔ¢Mªûèr_¾îC5Vâ$ sð&àfUÕj*Õe’ªÙczñ Ûì~]S½æÔh‹=¯¹mz„ûVW=“ùtH1ýQmûÔUÝ©¦ŽÁ-ŽÜW7Ý{êÖШvº€¼æÁœË°/ÑzÃ0§€„|š8‡„­&9¸X¸WÊ`x|{ ½‚+°SØqà'ØÝá[ è-ÚÏ@(ne•· ·¾à0!áM„E~ϳʠ ð¾[”¹sˆ÷ÄÐ[„R·Ü3`Vj°­!@¬° ìÖ@ “Ÿx<‚ ë„8¥`k±Î1r0ûͯàÅÇPÏY)s™sia{-!nô1¢Ÿ4¹¨Æé‹9¬ 8IÝ©© ž=¿uÀ³ug@@`=ô™‰~TíSJ ÚcžZ›YeŸŽùˆó.,ÿØà•b© f øM<~òºO6–.Þf.|K¦ ½piý=›°R\æ°½PŸK9Ÿê:QµÖ–c­a|ªêå7Qr·°Y36åÁl—PÇ`î“'"iÁvu æò„Të¡ö„ð~UªÊ÷vIÕ*¸ºÏèÖƒ)Áè³ DìS•b¢&.ÌzÌò%‰JªìX5*$–ð9Â!Ë‚µ#.ŸÒ•¼ÿ†¯Š¡.‘Á^©é^…+r„2xª³¦l§j}OØ«aâ,;x‡Ø{öÖ‰®Áª.yߟñ”ºQ#C·uÚf¥cMã«í¸G¦|õÓäÈÊÖÉž™coá;8;£8Çì69¥áJÓå‡ß)jºëzù¶.W‘ÃŒŒ©^ºÎ^VOôá<ÚžeìVþ®!lˆŠU߀v9Ç—wbJøfgÎâ!,}ÌeD„×bê)w«òž>†òÉN9`Êcn}¥ÔµèD ˜*ßÔÕM!âW­Ý'Õ™úžÞ!g&2ÍoË=ž#}ĵÎˈ jsO—%c«´Âܘ]ÃÍ7%óMó[!GTb°„BfÇ€¨Ä¤¸~‚årù(—l¹ðÓÖ»¬Ý»Lí»` g½Íðî)OÙ©X—v1ú˜l/KuÖIåª6‹+>Így—¥º?+D™@]TÔ[2 ^ìÒ€ã\, O]ê¢qIÔ@:AI"ƒ¤•uÏ0&Þ‰iómÙ[Û3]s˜7žùrõ,2 `p¡ bZäm–›7û΀Ùw6WêšðU¹g+"ââbGåjªDò.ÜsƒŸ@#r#4†ÄñìäJcMc^\Ù¾\¥¦b{æÆo|]YÚ‹!#£ò›l Öw4't°1u590ÇöOðFhÜŒƒ$9Ná†ú¹}~žŽžtÝ Þ”wuNo¨ŸêçzõlCý\z§¾7uêNýÍŸiëÙ†ú9&åÖÜÓÕ°wÕ[çæøjùŠ¢µÕ}µë¾óûº„þÄÖ÷ø†¥Ww]vWíz•ºµä}‹§Û[]¬Þ;{Ͼdž‘%ÃŽr}"Ðup킨ÅãJ«Å¾’8%—Ì[ãúÍÓØ4!Î"rL7¼›6ÿ‰Ü§:Cè]~ÏÞõdvù4̂բ˜xW¤¾áfC>y2äïªÔõÔùÏ8¯-e~Ï0¿>3‹ÐuÁ`ÂÜ^F,“g©‘Bæ×ô ]$Ýése¹½]dé»:y~"Éüz¿¡˜Œr¸XŠÉ„™Vú_ÁNñ® Š]Ã`cº³1olÄGc˜¢„´`2ß#ãæm'xÛˆrm­ésdúQWáô7FUÀOÔ”¸ÚŸNæÜXlѬõ­“±ù¤É âÂO ô¤ýÁöaZÄ‹[ïTš£áY·QÓÑÚèÌøCshõâOp´F›LÑñ÷íÉË«ñ«Ý5é)npˆû%|Öx­èÝ¢Nçß±ðŠ:ðanM$\\Þu"ª…ËzQÂÙœø‹GóèI^ÀÑ0¯ÞCŽ@º·g΂䵭ÉþŽ0,a¡$ÃY ²ùÃŒÖb‘„iþNkSÝ¡4=̉²ûNÖû~"|Ê›`O°­Ãœ‹†ÔİÅ[ aÙ‘p:®‹\ƒ£PÂh"Ø0¨7B„Á!úÕ}qÈ^t³4 s½¿ô~L-LѨ‰ µÏ0þI¤ m›Ë ¢¸.ríKž0ˆ‡ºÐW®/ ‚z™®WKÉ›d&¢@Ù€W¢ÞEtn¾(zÞ-ž%Ó…”Á` ±;X¾ðûR+膎ƒdÃr¬‚ß'p#áj_A4; â0ð·˜8*ñJ€u™ÝµPV¬­O§yÂhX° 5à—GÁ°cb€eå #[SžÂÀ‚*§ Q˜LJÂPÜ ¶P²={èHÄLqBÕùqÑÛu%(>»L–ê1ºÆøVYU·:P¸`©¿OÀ8‡?ÎŒKsdzÈûzå —ÊrKDJôOu[“¡2n_RXw´¬@:3jH¸r!˜`zJˆ0cþËoV…u+,’+$ôQÕh í‡(f·à7iàÀGçB()ÂûR”1¢Ï- ×ó¹LvÄ4Q%½T[1˜‹Lsáì[>ËÛH‰8^TÅõ4”N¶àŽe]TWŒ±Ìœrgn"0 ô§‹³rÇ_ûoG&‹2ðyì/L0ÕÍþªc¨œ™ÓÔÞv…¾öäÃ-«ßð¡¼a}š$ÐlÓðrñ¤Yk1|ÒvFÛC1èQ1Ðé@ßqc Ë­¹}jW:؆km¶$y?ÁŇb¸ÀVhn _Ž˜äË0x4øNëHLÐÒ/@€X;ýù8ãnæ¡›ñá"`ðN> endobj 5081 0 obj << /Type /Page /Parent 2 0 R /Contents 5085 0 R /Resources 5087 0 R /Annots 5088 0 R /MediaBox [0 0 595 842] >> endobj 5087 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5088 0 obj [ 5084 0 R ] endobj 5085 0 obj << /Length 5086 0 R /Filter /FlateDecode >> stream xœí]Mܸ½Ï¯ès€m‹% àÛr`Ø@AÁn6Ábw'‡üýt·¤ž©_Iz]¤ÔÝŒ‘Œ3´Èb±XU,¾*¾ûã—¿ïþùßÝ»ç/ÿÞýÐý|þòTìCY´ÿÙÿ|÷ú¶Þwß…ºÜýðëÓ·Ý·§ÏOŸÿûí©ýàËóŸûßÎîþtøïÏ»¿þíðË»tü¿>?9ýl‚9ü­8ÿ<þþ_OùÝî·cýp1oÿÿw6غ4G2&†þöÔOÓœþü÷‡ßžÞµ X6JéËPØñÎïLãíî?ÿxúé0@ß}±o¼1¡ò¡¸f `#U¥ÛÛØ^Ö£Ntº7:oL¯óåê\1®2rïš‹ÛT¶cñ1øî^¿óªeDÉ9R®Î•~qq[Z5eöŸ{±¶ÖšxŸ(×fJ·´¸sÍ•µ¡WšåXù+p?ÄÓÉ•·>¢Ü)WçJ¿¶¸wÍÅõMÕÜ:ƾ=wƒÿ¡Žgp[ÊÕ¹Ò/.î]sqk×YD[4Xtî>ÿCá#.î‰ru®ô‹‹{W\Ü`ÎÜ1øob.®+"v~¢\+Ýâ ½k.®wu¯–#ØÜ—îcð?˜&^ç'ÊÕ¹Ò/î¨÷ÏKzÁ¤´¿gõo‡ß}z÷ÉøãɲÚ}ýé@ÜiÌöÇ×SÊÝwÇú±õÇÝï‹Âø?ì¾þüÔì+[ö$Nµ ü¦†ßØåã8ÜÛGØò µØï!¤ éǯ‡…¾&®¼bM \Ì<ïâÃòo˜µwî¾dÌ1»‰øf;®Üúup>îCÂý\ú·£®­_çÃn½ ]!¬^oØ"¬Ý{Ø–RB#ó!4 IŸiùM#}8«c1SLõ†gšR¿ÔÆôô@Û€-#ø‹wª á|Bޏr•5¡äK$ò§ntwã}¦ÊÑmøSµo®ÙM˜¿pv‚üDð†°$áÍMZ^,±·9]OBwoÞ›¶Ãó±Ä7“1Ÿe«RVuöØçè[è?e}›N×ç_bðùA‡ˆBܦ†Ü¼æªÃÛQ£žX@Œ/NÄ‘‰sZ†Öûº)Nô¼°: –Ž¡—¾iÑï½kA¡/ßð›v±ë— Iê$æR'x$[£–îTXî­ÍÛÞ ÆœZŒë?šAA·7ŒÙ/ÂëoÎÚÆu [’ÈlÓô·2s<-lïŒ #gÕá7íeÜÅ^öLO+©Œ¹·?w¶‡ xjȱIÊK‚‚MÏt;°´Wì@áäà°Ý#¼Ïœ´7,/Xo¬»`n7„õI$!Ùæ9%{VXv ¯­Ùî>Mµ³˜õÁ·W+Q\¦2E$J—Áa lÁá" CƒçÓ.¼ë#*³hF Æ¿ÀÔÃ^-\ !V"êÍ÷’„(Ã(Tͽ4õì[ìsŸæO,vWÝTgŠsÐïœ7å+f†6Æ¡xeÜÇ”G|š‡Û39È&Q-ži‡{ã›r~z£9Cz 8;¬å™+b……®¶ÆÁébX?©&’ {ö†eùÞ§[NXK8-‰q²·Päð(éß&ã(¶ ë§œ®jß'š¶ìoÞ]¿T¡*Oô €R ç LÕ…aœvA^Åq´Çe™HÖ3š =„!A!XˆÃ{DèS{sfÈâùqYã gq¼òO7<*H œ2aسP"½[>ŽƒTëΣ«BTbíÂÔ’ÖgÌâÚ)Ù€ú%jç9¶µ,m90—Âá{‚AxïRÆ—Ù¡XL\Ã1²¾º¢Q¸Z6¯|Y™Ü‘ëŽËHz[i&.Ø)—•¸® SÍÜ;3  f¦#•'˜ á=o¬ÌF&pÒ-ŒhÍAÓ ­ãü=+ì˜ÑZa…–h;0Jã$„Þ m‚/Ÿ©±D3ÇZLÒh`¬œ°»Á"£ºGÄ!(C,™ª‡ A2¡QœlIr'劾Däãà r„>c`¶¾>[ÇÀ8[>ܞɉêŒÉ˜zÃ÷IПu‰W°EX{ˆ¨ÁÚ¯°€gaJ§ø¡Ô ‡)’#PmÞ3¸7â–Z×OVŽÐØ‚ñ–2ÍÞ¬ÜänÚ4> Ò†Wkó~Vmo{MpZá:l3ühŠÑâÞËp…®¸A)÷…¹m)ÏÈØŒŒ=–ŒŒÍq7Ö{É1„ŒŒ¥­øúÈX_ž¯R!clÆOaDƒ7`®*NkÙ‰‹B!û{5Ì Q’Aày" e¦°YjÁiwÅpcç/iÕøoL½íËÁúê`0ࣦöZL64v(æ üƒÁòf Kz K"}OÁƒ‡Ó˜4‹ ƒg \D§–R½À]bθà’×!¨}5Дwz hmç.ݨc†¡…[¾'tB* £S¤‘ƒ!lDưaû¢ ETãâ< îMð-w˜ó¢Œ4¼ ™ôFeÓCœÔ±XbÔ×O!L$šÉ’ ‰-Ý-X‚øb¨¦Ù±ÉfU 'À„ ™ÕzÌ"¦¶óüŒ&æp ›<,Tù\=ÙSàÎû¡¤`U½½Cýå\U@˜2 LÖ§m©6¶oš³;îŒv4c Kš*kJ%£œÏLY( ´ãȨVJéÞd†½À¨c)Go!U·[7X(¬qJt«êiH·‘ \PóýÎ$?um ÁT,¨´BÊÖsIKÛ¼ÏE¸!«€A㤠Ak&뇳‰§j'óqòaâ4²\…Iz„|ŒI›jI2»ª(¯™næƒO†-ÔÓÑLÞAð¹"*CL•f¦#Qt°ð(ƒiÆš¶”˜bn3Ê.Ä{Ž‘ƒ›Dr |ÓÍÇ|#ô› ‰˜oßOè·Éì‡4VÏúiþ&²zŒß¸¾-`rö°Æ§ò'0¢{ÈŒ‡Á<¦ ¿Á91ÊÙ2«ŸS˜\E5“SgÊx€„O ð-UN=>ç¿O¨×½›œ°Žª9•TžŸj}ˆ{ó¬n4k<sbNµØ“Ç–g¥%̯j3-/ÄNßrTRÐ(X/ãq°7–êls“úI¨nu“óaô-Î%ÝFÌ63f§Û‚£2ÌÉgc…1|‚·°ú†!ªU<Ðö³ît§p†ÂTc@yÃ’èqÝ8,o¸2sŽdn0p‚¶Û”·T!’Iö=[MÉ3NÂsA0ÍôYþ-ïŒÇ9•*×·ÞÄé7¸ú ‰u ‘@¡ ê£NdÔ¦/”˜ªÊŒ€ÔMoÇo¦ªˆnÄøo ÔŸÉ%ÆY€„½1Á€4½E& ÔG3ÖMOÑ}Óˆ©9Áä 0IVº˜c«õû˜Ox™_W=„Íá@,.¯ƒC„³-nphêpK èÅ"‡KÜ×üT@ñq‚J˜PâS†[ëz;pš "•z[8”A¤êЋ "½Õ L‘Þ0ˆ´)®ei‘’þm‘Š2šA¤Dz^·vrvD*IÒ–=«õæº.å5Zã{©GIxYÖ„f’žÉ$µ"áµM$ÒHEsÍeïm¶V{„^ÅæÁ£ ´dë¶ië¦ F±ØjmX«2ÉôRàÓBa®)r›-Ìݽ&,½ 6ç&ùö8ðÛ¬‰%} §‰eè_(BjèŸoÅÕí‹!ÇÛ®eAq¸%Ué"xà¼î¸ V,ó .µ©òZnÔ{/ 9š NµiÈ Œù§ ÈŒ«”D=ºÕg“`}㢯ÔuLu«ÿK»/y´t„¶&J¬ŽÕÙhû¥Êïߣ vî» ʯÛ-xØO¥Às*ËˤŸ`ßI÷-<ŽjÊõv2“f€•õZ›1¾õ4gk`>•_ÈÁ¼Ã½éÊ‚jâ™®”lö%JcJ7‹‡«ÀsÛYß Ù«ú¶*%rÌGõ©3ÝܹÉÍ• ¢ÖôË‹]=êYÄùOl=Šs·ú0XMÊGÅ-ij.Â;¯Œ—§ûPNªäìù»rÄ/UVøZa(Ì.ÁgZÝçŽüŽÃ‚ø~ùñiAf<³Ÿn3F³E[¸ÁP0Ð{1_X-ìÐÞY•Ê÷\=ZÏÄ«©ëæ°N¨­Ánê¥{ÌâQq¨þ³µ¼_k©òôéú‹@½8ºÝaö–æ»r•£Fbk30±K<掉ú[|ZÂÇNXÖsRbò7‰Š]›÷ý54®ïnY_æš\ÍŒMTž ¶J-å ëX®y„IÒzw| jL¦m£´ÎÉl‡4ž… ½± µtK¹·C¬Q—wé›Z³7ó öÖ Þ:gʸ}0sÈ.Óº´ÕÞ™v­† r­â2UTžCA«„ÂÞâÐ ú¦‹6¯ï7w¦\Üâ`K(°°EàÛ8ȃT´a Á«0);€ërC^4€Çë ¥Åá‰%ŒX†ïݵÄ%f‰!ö¬0žæäNçiƒ÷léc—(x&ä@U+sR ´`ÝyPBª±d¸£¦i&Òh\8?ƒ¢|šÀk Í ÛßÌšš™?µ`‡Sƒ€9|,€ìð¥÷y'V­3ô•^]znÁ™üœTÏ2œ1“zÊ«‚)Zù2cù:ˆÉIJêýñóƒóíßüâ—§/ÂÞŠ³)$¼Ýøè8ë«á˜‘ Û+pD!B7+ú˦³Ã0Âzu8®ÿÐYèjxZÜb-Hì}剮™ªÌaç+3*­Š@Œ3YT“0;™xÑJ£â/«¼z†‡É äŒ[;?½1Ùƒ¼óÅ€©6!$|ë:rÐ8®¿éqÝG3ZJöNršºp™/6J?‡]»Ná†Jƒ ðu7ÿàPLĽ)Í`rÔ"*¾òu¶ÍÈ>ê> ¯ê°R.3ã–2Vi+5G›sÈa¾)Ö=RPiW„$$¯œš-cfû+û³('««q‰L|Šñ_8ï†xkP@úÈoæMCæMh•N êä’ðÒ8¦ ºCàëá¾`ÊM,)<ÝùQeåÄùTÁÐÕ£SŒg{S¥Š¢Ä1cjÌ`û1ì„~dÜ_;Q™ÚUõÊ‚Èc¾+ÊwE×½7\=O¸nf‚ÕI*Ó)m,JßÝWYÌ|Š‘z{„SŒqÎÎ>ÆèÀfc¦B•ñxþüº(¾Y¢vy'- —6Ø´àK(ì¶ãdÙ´fo³¥|3П‹.ìR•ê+ÔN Ó)‹«’°W—+¡Sxƒ( ”×Àò2uŒ¾4S¦Q"åÍtËÁëü-s‡ §`©ÚFYžÒÖWèdr©ZÊ3…^˜uÚFÖÞ‡‡[{‡÷p* ·u©¨ª‡“ ÆË4ûÖW¸¾ª86ÞAS-IfW}q_\.%·+Û—É΂Ly`(³Â‰„ØiS@Œ#\±úwÞiôðg÷í°”âJžú3"¼õůqû¯Øw¶—ÌÎ:\º+iù.„TZ}c÷¶Å0Œ8W[º`÷Õ¨^KK2_ÇM]Z_¢íS7ÓÊ  ᘨ!©€Äöe@FìDðR÷¶x4 ƒ{ƒßtQ?³hê¯%+pÇ¿(î)ÿˆÆ²år08žL‡ëW¢ýýë3 †„Kƒ…/§0œ†ék댃Òï‡Ó`ˆ…$uŠñ’„ay­¯—°P¸}§fм¸2¯b¼“*øóîóÓÿ &ÛA endstream endobj 5086 0 obj 4620 endobj 5089 0 obj << /Type /Page /Parent 2 0 R /Contents 5090 0 R /Resources 5092 0 R /Annots 5093 0 R /MediaBox [0 0 595 842] >> endobj 5092 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 5093 0 obj [ ] endobj 5090 0 obj << /Length 5091 0 R /Filter /FlateDecode >> stream xœí]K¹ ¾÷¯ès€m—^õ‚öØCÃääx³ ÙE&{ÈßO?ªzÆUý±ºØKUÅØãNK”Dñ£(’z÷ǯßÿó·ý»§¯ÿÙk¿?}݇*—ÿö§¯ÞþÀÖ‡ößûªûo¿ì^ö/»/»/Ç¿_v—|}úóñ_ÿÛÛýŸŽ~ÞÿõoÇþØþÒé~ÙU¦:~ÿ÷ù{S™ã¿Šë÷ÓÏÿµûËïö¿žZìºk™ùþÿ°•«­=±1ÒõË®¦9ýöí×Ý»ËLë%øªô~o¼;þÕx»ÿï?v?;èš/7æø;UñHG•=õä]½7¶9Mû°£óWœæM‚Æ+Ó¤küÌyôY1®4të1·.ºÅ-ËStm>Áü×EåÒ-î™óè³Ò-.n=ââÖÆ–— ª¬íkë)ÖÖ&]ãgÎcOJ»´¸ñ˜+k¯¢ü“`öî¬Ú—6¡Üœ8>+ÝÚâÖc.npá2AκStm>ÅüסJ×ø™óè³Ò-.n=æâ6¦hur•bŠ®Í'h¼)ët_8>+ÝâZÿ2¥ÌÊå'Àâ!>øáy÷î³ñ'¶ÊýóOGæÎ}^¾='%ì8™ù¡Þ?ÿ¸ÿ}Qÿ‡ýóÏ»æPÚб8F)jH±ò‰ñ™Q,¤\ãÏ0ÆCÌ[[û?SLÿLñ¶V2æÚD·÷ˆâÜô5%æ suMÇëÃx¼r˜·€åKb\Þðgà*8È®“·ÏpgáÙý8¼ —}úéùvÉqªªÀ)ÿÄÐ5 4âè'ÕƒëÛªÓ¢ó¶FÖ”]¯p~ãñÓf|qf¦ ¦ëò¢,9_ÖUx3¡—å©uSœ9}¥\&Ô¼»\£ôáÖgžàg`k­J¼ÑšÁý`ÞžÛMo‚³±ÆJ•)«Þ¨‰ågŠëäm€Yõ=2ãú¿Š…µ‚”Ac²sƒBH"ì¸U½Éw ±/¢ÎÖæÎÏØò†'ŸÑ1ŒÖðú°V!fíö»!ðÎÜ-ðIÄ,­*ô¶žKò͇”ÐÛY%IÈ îkK†è·–έ ›Ç·Þ¹IF†q1[ãÀÁ@©`–­ùQÊ­»“¾ï”CU†›x3`@ˆ‚íPsèûñeÛZñÈžÆ,á )ös eU|YÖL ;‘@Ëü5É  Ã áØ£¬I‰jó9¨¸§Øo éÂ7aÔBf ÍU–›.w:¤*Âj'!H†ÂöPÒõ56! îþUBn±ñ€WëØ÷=–&ì *ÇM t ú€.L{4:2Õ_WYpB™-+׌†õ ‘¸ÎÌ=†ÀÙM¢Œv4gþ8®g8.ÂMJø«þ“€.i¯jo¾gp’÷ÃáÐèK‰¦C\b°d\Œ.óB™¸bü (}å8?Dˆö ŽQdFW5Œn‘ûQƒý4ØodÞÁ~9‡=dsQ»“ÜM $É…›G»YØ-#Ž~"Ö÷ðŒ0oË%ÔÑù1ŠcÞÔÞ" Ö5زÊÚÚÅr ˆ¼PD&l|Èg®‰‘b9À+%ÏuÖF0†í‘õHÇÆ#‚Õy$Ä])JQÊÖ(ŠÕ+Äj©T‡œQ|…é+Ççs-þîN+ÿ§Ëônç|ÆÍù¬6¿®PO(“ƒMyB›Æ Ûfq}<øö°XÔ«Iا„O£ÞM?Y¨ñèÉB)yÈÂ;WUŒ0~(E)Ë¥(~¬?Ô3•÷p¤ sͲ#äüiuá̸TäàO«‹¿W:‹¶6E躄Y´óf8QÓfûc˜LFk#¥¬¥2XÓUU…0í.yž>ËU]aîEéÄÄù2»'笥\¡¦é­fl“•Š8)n¥q݇î8Ò¸É|œšLDÞ,£¸N÷æ¤÷ÒË™kNm»•¥ðÏWBnb踟¾nÌ­¬Mèò¿¾ŸÆQíІÀ7)„gßË`»ûý1ßZ1,¬¸sÀ¹}ıÞŽ”ˆ.…\{se{Ž #¶(ߊyƒëc!ׄ„@ItXvàg2È fpÍÉhWAF§U]®ê´ØËÉÝP¦:m:m;÷2óK+gŒ¿É¹áˆ‡m#¾pëºÐ¯œ+‘ábÿ¼EÇ¿8¾6¡[øðÏ8KÅwp¹ÍĵÉñYœã3»¿ú-k½„\r‘k=Åu­µ¾–hżIŤ#oõ±2•‰ 7¾‡<ë©æ¼ímþ§rÄNޝ;j©p…;…»9àNJÇs ø·c«)\7UOAz%êm.kûóÆ)OMìó±]–úå¨6ÚâÍJæRE#e¸Sšþ°?N_Vâõ¡+ÿ40,—RýRõ{9­aÞ8ÍÌeB±,jñi–í18xâ­À FIªÆ =³[tí$ xPÃUc=ȉ¶ƒSHjxÚ£ìm(»)ee¾÷;Di/0"½ŽAŒ”£ðæè% 2,<‚Y¡H1B¥`Ñ<‘”C¹÷Ú××d¥.— 1ʹ("›ñ(NîÆ)霥8¸Q ”)NúÁa˜7¼rŒ´|"]žs(Á«/ ‰+òeŽ”Qª˜±d-dÃ(§%nIœÄ¡R5äbõΆÃópPG˜Na•\Ò=·:Iä” '±TÁõñQH öBÔòcx7fÝZißÎwÅ U£(Š/Wwn蜵dÆ' =q¨®R]÷Ä‘‡MPwÅÙ hÁa ¡Q8ÏÁD-éÀ à—B‚ÂyœÏ§84^Ÿ¸–üÚ°:ªO’¥×9©œ4Îþa”Ÿ!$„apžz"¤ c5£@0GF7´³RXÁ"èê‹ëCÒQÑ•SìšhcÉ3N „µŒµg7Ífáœ?Rα‹°µ€Ñã–jgq y 8Ñ™q–ÄΓÑ5¶ë5ç²éÄWd=:¹:´Oñ áæm}?ÕÞuÅ¢rÖi%g®söç,ª£UG¯MG„·ŸÒµÛ.qÒ?>ÿžÊ¬PèûÓ‰XɃí÷%3ÿ~†8EL8Ÿaãt3•‹fÖh¦¨Ë¾Ÿ`5åÜŒq}ͨ¶’䕱{ßá#4#_¬€ ¶åöœ œÊOÌãÙ,¦¸…r-FRš>¶ ŒqòmzWl0~tX‚&”fxm¦•xÅx7»®«þ#å,ÃU29åF9Ú{‚k!E‰“´†-}o“®ÇrÆöÐÜe”³±Ã’>WØ©e?B6ÿ݈^-ò¦-êc–ˆqqRd8âGÎ=ƒk#øäv(õ1«8Î8œÇ¬ôhjFã>€¥ùÉzO1²r¹ÜS`¹–A–ºRdI¥8Ï$ŽEdŠHEy­¾Éª{·H –$޾ÄñÚµ¤F:?Úsr×XzC3\_í™Ù¥WŸÈ¤æMìAÔùñ=cëm61Q›s gg,áªDf#‹FÒÆ/«b¬”…>­X X°-,p؆³ü`½«XÀÏÄE Õ!Ôj«!çMuÏž„sMTÇ–\BSŒåO²C2ñ(^ë\Ïo³eàQÄV#Þµ¸5ìkçh!F-Ž·S=}rJh½ÉómÁˆ‘²t£ü¬’óYœØ3ØÃrÉ©+„bö:Þ鸶–ÕÂÁä 㔤'µºÖŽÕh‰b¡qxó[ëV¨w‚ÄQv­Q«:-úžYlXu­ò9¿]Ÿ¿F#À4, í `9H¯F€Qó¦7vjÇ·‰5ìk.Ô£ü(e}^gÅÅ‚maF€E—kÕ!ªC6¥C4,‰ ZUß÷š¥5'æQÄû™s«–±¯‘CQÔ+(Ô‹ú6¨Æ7d¾ÚQmÂW‚[c +aKEµUF×'£ø ÇŠ/e¼*%½¢>Àf{5=æ§hü{±!ÍŹÄ4RZÈâ~rnm…gäÚl/S_³¤%ò@‰¸YRóG©ä‘‰T»íe~æ|'¬™H…f")J°QB"iäY™ºî‚³¥ªbÕ“¼÷UÞ/ŽÜ*²¿Ìq£>šG<?…ü¾'Sªyq9Ö[j²o¥5çœkzÊ߆6'ZaÌë›ôE—ª7êÙÒxÜÛÞ ñ#ìÄþã¼6Çy>¤?Aþ“Üé¦ñîûÕŸde8la[î¼ëXµ<¤NØžÊE¿L;÷”¾Ò>pJ%ÎGc™ÑÕæ‘Ñ-r?r¢8^£È\sNeœ 3ÎÍ0>ƒãÓÇÛÀ¸gfÍç¾HãWõ=zå2ŽÔe郸žtü™¼óø›S¿| UŠR”¢ªÈ’ YpVZÔ»‰,ΫMa¤«Êä| /uk—³•¤HxsÏz9¯¶fr*ŠÇGñEW‘Á]§õ?”¢”¤Å]Å]ÅÝËH—\…E‘Ãöª!(E)ŠÈŠÈŠÈòˆ¼€šF2¸[IgÁÏï+Ü:êmŠú¦y«o:ª(V+V‹bµz­/XÝl¯‚R”’ E±Z±Z±zl¤êéAqc¶WÿC)JÉ„¢(®(®(>2RõŽ·Xíºlv)ýÄ©ƒ„+f^QÁ(wÉÊ›yNÖ#~€‘õȉ 'ª+â‘2ªŠu$.@4Ág|«L豜+&`9Ьn^V÷ì7=ZaOÎ7¥œŒf¾§Ag”7o2öJõH¥(E)J¹ã ¦öŠÚ+\tÊ“WKFp®%=[¸¶Ã§MÜž_Ι’á¥Å”ܽn¶®-¡÷1ÅêÞ¢\Ýúè둊ܙKÕvÞ{TyËAÞô•>ÁÖ²°þ­•®âä^Øj¬$—\”Óú‘ˆþ…ÖÆfÔÆ°bŒâæ â³#­§Jâî£¾ËÆšQã™)Gzñ}>ä€sÓŸsÜ€ÆèQhUsrå2ŽFœßG”Çí³+4?@)JQJ”s—ÚŠ”ñOC›ªÒî¬tÀü‘!òÙb/žVµÉºªfÅ)ºÆGW­C3Ї~ ù\JQJ&ÅCÅÃâ¡ÖzEÊR3‰”¢”»)ДД+DJ­§Òâa-­Qæ÷“mÈ“ªÕÆ3·ùý²ËŒ‚V¬¦8ØV«—÷‚ÕÍ"ò•¢”5R«««ÇFªè÷F_ºVŠRf¢(Š+Š+ŠŒT½ã-V;é7°×XmÜéMY3¯ÕÆWWm<òÖ}ËÌNžýfD«].õfQ«‘³“‡§¡Ò×I•¢”Ü(лл\Þ´Êô çZÒ£ÑH×2Ñ*Ó²Þ–`¤sãÕ_h•éÜ×G«L+rg.UZeZåMT‹i•éU™NºN„díæÉí}Ëéñkÿrd‰äøËØ/Œ©Ù×·†ãŒ;&9ÜÛî´Öêìpp¶6'Ö_÷êE~ªCðe]…¡¶°k΄ž”CJ; öP†Ë ½Êö…ðîü‘7súõÓJýÏ´6Ï-Þ>·#­Z^)%lí²ïü+KdÖ´C °U”·š¯ Å£aÜüLÎ3ièÕ«Ørîôï#ÇçŸP_6LöÒôÆg8Âẕ¸üü-ÅôEÀÁæáÒ`áÀËIô‡ÑFÄÜØÍæ}f!K­¹xK°¼ÖKXU¸C«îµR¼ÕÓc:zÿe÷Q d˜ endstream endobj 5091 0 obj 4373 endobj 5095 0 obj [283 /XYZ 32.2500000 649.250000 0] endobj 5096 0 obj [283 /XYZ 31.5000000 650 0] endobj 5097 0 obj << /Type /Annot /Subtype /Link /Rect [258.750000 657.500000 395.250000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 5094 0 obj << /Type /Page /Parent 2 0 R /Contents 5098 0 R /Resources 5100 0 R /Annots 5101 0 R /MediaBox [0 0 595 842] >> endobj 5100 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 5101 0 obj [ 5097 0 R ] endobj 5098 0 obj << /Length 5099 0 R /Filter /FlateDecode >> stream xœí]]¯ã8r}¿¿ÂÏ ŒGõAA€î¾·ä!@£ÈÃ"Ál6‹ÅÎ"}Èß?$_›Ô)‰ÇEJöÕ v»Ç²IªX¬bUªúõ_¾ÿçî¿ÿ±ûõË÷ÿÙýÖÿùåûK±oëâüÏîøï/×”nßÿ}׺z÷Ûï/?w?_¾½|;üÿÏ—ó¾ù·ÃßþoWîþõð¿¿îþø‡ÿÔéø…ß_ZÓþüÛéÏ®5‡¿—?Ÿÿååßÿ°ûûqÄaº~1·ÿýKÙVmg˘˜úçËðšæôï?~ûû˯gÄÍRW]íš©lµ3]Uîþ÷¿^þ|˜`¾Øw•1mSµÅ=µåa&יà ew õ6þD§u†O0x׸tƒŸW®Nc#¾wMÿü;9·;Ò¬;Ò¬2n—Š­LUíêº0݃ÍÛF—€ÞðÊÛs½<ìKºÑOkW§‹-;qpÕݵµë T‡|¤@¢÷ñSŒ^]ÂÑOk×'L¿¿xtÕ ®»DÚÐ?Åèm“rôÓÚõ Óo0]uƒ»º8“¨nSÐè2|Š0E‘RúŸÖ®N—~{áàš»kŠ‹ü<ÜŽRl@JùlʪMÉÀkÃ;)Ši€W`à.+À»€¥ 3ä7ü¦ï\Ûvæ6NÔçD©Ãì¶%ô¶=ÏóöãpMI~Ã0Ý7 êV‚O>ÏøÌºzÍ7 A»ð7X‡âµA¹!Hæ}ðLQ¼?pÌέ™0÷®Y#?›Œfh Ë×ÂþàUwõ‡uwèûšq¥u«>k¦¬ŠÓ”­)o·Äû¦5®­¦¨ö•=‡Óߙ¡'=‹¹½ëŠMßs͘}]53ç)*¸‚ÍSÔ§'v˜&P`#¿éYyl´ó›º»[àáñhp±Âhxp[ª·wŽ›ãM2!/6§Hp[™£—j÷ûå¿Ë½sÅ®iŽ´ÆôŸV»¦¾ 2úO~{iª½1]霹|ËÞŒb¯ç8|¿ÿïâø³÷kÛùs>9üæv%Ço¹›QÜíyùü‡D§Ðõ§°ºüA=µMíÌépS1[UgS‡ýêI‰Îó˜ÏÞéÀ_żÙÛÊWƒØø7ÆïÅX•%™ó ÆîméLYÏ"(ž cÈ ÂnDˆ5ë}•š½˜J!OUB0¼ƒuÞzæíe§@îVMè¼¶ÅVœö¢Wµ/ð7áæ•—wn-¾Ð„ÖÈá¶ã ápã#<%£[q®Ý÷Æò3Y¾kü»¿Àò„-^í­/Ü;¦î^ IgŠ2  ‚bùK"&"öŸÀ÷6«€Oä,Ì.ø}ˆK¼ÀÁªeŠý30¹ PŒé¬¯Q 4­°¤çÛ)qY™ÙP0°Î‡Ìh>y¢14G®ü¯÷yÃÏÖŒzÚÀÖŒxÚ‹7¬¹ñ†5ž7¬õ†Õ7¬ñ†ÕÿWsã k2zÚÜÞ°À·!ð!²•ûâj«júU‹9§Ø™ç$£ð¼j¸s+[ø„òÈ4¼RŒg“ñÍ÷8bB2·#ÊlTõ=éBûÕWb8°ö‰¸û"Q`*x‡n—X¸TnVUgö]Wyg©ªÑDÏ0užaêF S¦nÄ0uÃÔݦÎ3LݨaÚ†i;b˜¶SÔݦ.£aê6Ãôù ÓÌ|ÍRå6ìI,U<¼`.ÂØìÑzÕÅ^u…Ñ«îpÓ¿ÕyÇO|½zú–½Å^ÏqÑ«]7¦W;çëÕÃ'^=~ËÝŒânçH¯W]Ñ gîø ðbÇoÙ›Qìõ^ÌÙv/æÌèÍqøÄÇ‹¾ånFq·sdÀ‹UÕÀ¹pØ[Ìà®ùV3XìÊ“Ëm·˜æ ÈõôúA<®ì[Jl‡¬µŠÊPsï]k0õ¼™„Ä&$f+ 6•ð–ðvÛ Œ Ý+ y“€¥RâSõDa)VCÝõ,ÂXÅ·@ì†p%ÇB “+°ž7L5çîØÊÝrpHâ}&1‡I]EéKõM Þ—|«S•Nº ˜û3öÖ ¼d“ObE/.üb¢ÃL»Q¯ 8§¦š¦éŠ1 ŒˆÈeJ\êÓ9o#3WúŒjŠT'oOTÖµGÅC*†)ˆÙú®*ÝG ÿf“ˆ7TØÍì‚*u„[üdR TJ×UEyæŸqJ³ã%eh¸=CÎî»QÍYþ®¥’ÔHå >½¥|ù0^¾€(Ùl»Å­KFÂ1mraÝ·ìMOëxÚQ @¸™àrdæÈÄT ¨|aʸj˜ôDÝŠ§ª‘(ªêV®˜nL,LÅVu›¯0è¯Ìß*Õ@óå"o ´µRá$ªÞØêŠúúƒ¿½|O$º¾jÌyôÐéDÓ›àÑü“tþ&̱¥uâÎÛžItM”JyúFXƒº©vªó”&ž™¼†'=r÷5›~Ìòte \›òdÔr£Ý®¬Æ[ƒœE_kn§<²ï™0ï{Ø '=¯4ûÞwõŸÐoð“©62ZyÞSí}O_¸G~cñ àoúùÈ<%|"¬º.bÕ½i÷óVÝ;1¢V0t¡A‰žtƒ¿Á+è¡iQ(mŒþ1p_á ¾ÀUCŠöøÇ1®‚+0ÖÁ„=bnîúh3 ²T.&z·>Ëh¹ÂõŒNgnVköù20R¼jÆ2íãÃ7S¦½.ÂHÕîViŠáj »N«²ª2A#òtE—JrÔ*ûÎÕ¦ñ”Øv¤”ôAŒó“ÉkÒ5Huk1¾N"ÎF!ª±ñ¯Q‚2£wòúº3çÎT`BÏÔ%qbhPe#´¤Ûƒí¬ꋳ!}ٞƟ2CÁ[ÓFB/]¯ÇöÖg½/:Ï߂ᗠÞ{b&û˜Ìúäó&¤7¢ÇN£âÍ‘Åbe†G›º Œ½ &Jé¿z7a2Å-ŽNŒ×ˆEÜ^ŒŽ½žÇ@‡‰‚Gk€Eµqð{yŠË$a­;¼ Aƒ9gRI8âxo“»žl×yBêA+ò}…†ƒ×n2¨‡Êù*²g«ÄÓvÆW“Á)ºÅ=Á¢Ÿ)x¬)ñq}ƒO°¤b¨óJèjBR oŠW ÓÇæ0F#!ætÞ[FàbŽdö)âø`……ŸàWO^M¹=¡%æi‡Ð%H”7ÄÖ"ðº`c¦öž¦‡«¦Â Se!ÓjŽ3´éšÊ:^€÷í¨„* #:¼…¿Áe|üs(வ>ñ¡"4Ö&ÂÆ#Ī0±®ŠÔ¢k0¾ÝÅÝCÊá•ÞWǺRõ´Q…Ýr¥-¼¢³g‡bBÖ§(~B%3È,&ÃJ51:¢­… Ÿßl…™Å‚Q–)©:䑪´K aV†Ä|ÑÁ´•æªSÍ¢k¡]á p°¯¦Ð‹WLÃ}5qÅ´>ÕÜ nÁB<é©“2ªÛùj”‚K3wݘ‰á—X¯fª+¥ŒúÆ«&TH®F^T€žè‰ë Út¨n²ØF·zV°™Ï  UÀF ŸLžLY˜ÏúJNpi¦½"Piû‹‹ÇÄÌÕ”*¯Ì\&}Ø!Á¥Ÿi§‚%B¦b×Ù.ðDp2¦iJ¦äá$½,ãD >OóÁ5TCœˆ[g49½·ËÍ2{˜²¦ž1þ»Í/´î's†ž=ÇnS+wõUЌ铩”㨛¿Èÿ©n±ŠÅ›ŽéŠ! ÈÏdG07ÝæIDß½ SèžsÎ×ÐâYs3©í¼';ï‰ï. f/ ÀL9AƈÅ~ö¥:¯=Â)ýÈÞT•~è¹Ö _§·‹_{¥û(îx_N_5!ÌÌ\ˆ}6G(YAr9nŽ{¢EÛ‡üWôdª ´ú-5›÷IOWS®"éé}=ÜV x±°È2“Å“6×D@cCè.…àÆJ/mVWýh%ƒÁÏ„§Ïƈ8îà s1ˆh7,WBµ6Ÿ ™Bݪ¦>†woÌÌ‘#ÉdÚFZíQýÏR1É(˜—ñð¾¤,#2@¦ÒáµÎu øñ‹2" W:*ÎÉd NJ(‘e älcÛé ´ tÓæ H¬O°òcIñ7‘ÒÇä†3šF9Ó—˜¿© -°W¯96~‚ É=¹r\ãËÉ”¢LœÔYOé1Ú>¼\úZ‰â$¬60¿à \AË‘h/EkÄ«1UP½Ò¤'…„!Ö&ôJÛ4W‡*Õ¸xˆé¡ÐT•o¿M‘X7þ­ZÃ3[gÁ-„uG+i¾ó´äCÇ*5w»¥fª³¢,»g†ˆÊ8+qf›EO„Ì6˜ × ¼¨y,~‚óäà<}¿ÒÚðoz5¶‚‚Xܼ ¶‚¿!ž˜n«pNbçOðÎaà]²/qî#̤´ðIW`Š–ã™=Åù¬‚<€Ô) º˜CòÌ ïƒw†3wáoô²pç(ÊÝ¡t(‚Ù¯o1±6¬Ž ‘žK@Hœn0uÑŨ£MéH{º¼Ò±W!B·ØbhV&¯âÓ£[Þ§\ºå}=Ë—ôÕ c QÏÀ¿Q½62•[ïX€ðÂØYÍ€30vËG¼ ásgbNïâRšL8#!—EÄGu+¡1`3 ÈÕB Ö+‡XPé ?Ñ­rºüf^ÜZbxMí|Îh\Ðó½FéÁÉÂù!2*eac ÐgÂ#`èãÉ^HøÃÕÇR™ŠþËë•4Da>Ã9ôÑ QdAåÕˆ» Á6ËPȇT™_Æ0â1}iõ¦)úÊ„ïŠS· ¥† Ä`.À¹ Ž˜1ÄÚ²U¶öâ‘Åu¨ˆ¬X*2J´¨¸T¾¬jÚ4S<À¾BB>Iw/L|&›ŸÁΨ"À€Tö–qª ƒëALGÉ”%«¨PÍ!U9­>iÿS㩃\ÀLJ¹‡<‚'sŸF¦å'Fšéˆx•V¿* ¬±Ø!® ‚3_‚¼9qZ¶3·Û…¤°8dŽÃß0ˆ•º!Y&¯»jõ…¯x\k¯þcm,Fá0`LäÆ!懬x/`”ðiÄá|Lk¼?ð‰€s|LÞ!dˆÀ;€ÅÂ÷Ö†©ƒ9ScȰ¤ P­Âcüj¸½þ]Ó ñø~ÚÏ9§½à¥䤅´c:g+À`¦L¼€×Vb~æäÃ'¹öG®|V 'ô}a4±§ x )K/šö!K  âí–í¶¼(^Ë¡¹´ ±É[¾öQú’‹.¤IC²rï1\{‡‰„YÊa—6®B%djƒ¥ÚÖE¤Í¯/g8»Ï2mb¥n JÝÍ„6…É߇)B¾æ¶(*'›I&ds’ší)8¶ö4_¶jŒcZvà9_‹1ÒCPãÃå¯mjï7DS4ª÷É“ >Z¤Z¥€ÌÁäX ³î╯co6–Õs¥”I ¦—v! ¸Ü]xþ·û»x¹ª–;Ql}2érlã þVfÅkúg‡žá¢SXmÍ™™âû“º7ƒçªù0W»ˆî;ºÐ)³6N’u‡œNÈáeã³ø#ô_ZÞµ§ká 9Õ®²xï/Và'ø©*JŸŸpFÑ$ íñWô¤·1êâ|žÏp´>i 1¹S-\5^Û™÷š}y.Ù7kž78Œó|8˜÷´Þ´†£Áµ {ŠO äDÌ à.Pµà „÷ÁÞc,ñû¨&aMWyRc2²•r5}ñì+¦aˆ«´¼ZAÿæ'½èfÏqa¨…ÃÖ„u.°ªJ¦‘]ÆÄˆ…Ëc×Ý0!úĸ™Ü»´R‡* M´DÞüì1¢rÉÒÆ´¾údw^q£ 'zv=ŠS¡u›(Âjø)aÛ¡}Ht­˜úmBßXë¿46H§¢^c&c>m&þfâËü–×ÄOxþlœ¿í<¨JãÑ#,VÕöù8•5ÖƒÊn+,^cÀ×Té“-Æï|“€é…¤ oW ›W’GÊs–@hlyËÓ[ „ «ÞJ ˆ;·•@Xuö݃òÎâ¹£[ i“iÕ™bm&I²=ÙžlO¶'•©Éò¢X¸€F~݆NYkè4íeÚœ5t·ÕЙÅÁª5tÖ\æ1Ï*¦uM"ÕêG‚QF˜QÂû0µ”6®Ræ*Ünp«œ•«ž®rÖ:ʵåVSëêÉæÕÛjjÍ84UöšZ®¸äUÃÔT*~M³ î8°7Õ>, 5š«Â=U×à!󗯬@å¡k@`(‘æ®R@€ª9•+S Sè|ñt ŽÁðEê\…Ì¢‘×)‹kÕµ¯s•Y ÆwÀ)­RÆ :„7gTH¦ÔŒ?ÿÀIt þÛ0|“Œ(ÒDp±.ß1Å#Ã&¹kÉNMk¼u¯F°¿AðÈ0ÁÚ‡Ö±àR‚öy…±ØrÇ^bmŒãUpTÂà7Õ ä ioοàsòdr3W6ÝrEÝ|!·U‡*ŠY¥™Þäý ƒçªމÐä`ž/­Ò\t%å”Ò¨n=* šWoÆO$»Név• áÝÄ\šË¿úlæ­îe8“JVDÂsôt5wŒÔ‚„J4fr™o–öšoŒ)k5ÙÆSt+_‚AÕó…ß+"›l±þ‚¸Ô½I3xÒ6™ÑííA5ߨ„ï“ ß‡`˜l€‰ú‚ÑÈUM< 6ÖºõtUã,Õp:zLœÑ6§ÌHË6LGÕØsDÉJÁR5”©>D¡¾Ä¥¸A#ö–ÀF)ÃY^ÑnØÁÅo}d~’W`Œ§)¨îvŒÁ¬@@?¨ü|Sc'—e´¼bj¨’—‰éê¶x™å5sCB®¹¢ ÃçªÆgLE%]]ˆIÑ*EÅ­„ʱk+_9¦å>]þeŽ”J/†9U‹çª2K¹ÙKrP¤¸3*ÁpŸþfÇàʨ¨/S¡2B¸h„¨óy¬ÚzàpÆc¥ÒZ]7*ÎÜ3R¸²Sâ/:ó–O©‰ñe*JeþUÂÁ2v PmkKÝݲ…™NkÝø×òFn¬Q×ëK5£nùF'ñ!6ßÿü€ðû¦3ž¢¬‰šBYT Ì'*{äZ.ðl}æM©U3ÅBq‘ÕBÀ“9S:t\ç_T=§[Ž›©‰žâŽ™¸lDÑ4í/-"x„I#JOã'\~Ë$¢< SEKX5–¾ø}ri L\4W¡KŸâTºÖgØ\^Î\ð°Ò…Õ!lÝ€ u VñÐä ¶iteK]B&"0CØ@19ÂkI® &à† Øü›ï’Ž í`ÌÙy#Åsr=©Îk1í+ÜëêÙ.]ªv4?e\˜L!©)FJ¨Rk|å¨Jw6f¬ˆŒ=Õdá­Uö[e Yd[óߘÍg<þªÑݸ“À]ÁPi®‚º2&7[Sô›Ò0)MÓ¢öUázš æ’Ÿ+îz™„Ÿ6]¼n]ŒõÜ“+å î0ûØ:}1Í…ÖRª/×øÛÁtо;r6uÝ‚za´3Ÿ`—>Φ.ÓJβ÷]…%¡3Zt/Ç—­ºãÙZ¯šwâ/y U`[O&Î`fxƒJÝg.°ó«2emúÝ9{ËUqma¶Fá>ˆj¾âÎ’"7¦Y¼GX¶n[™öT·[Žæ<²µl7}Íd̬ÜC4 k*â«Z@9³9"3`Å·2ZªpÈ0P‹­êˆZÌuZ#û—Éþ§Ð` \fÉû):¯ŠâƒÝÕ”ñßøž‚bm‡Ñž¸l=|’ë}*¦ÆÍÃýÁwBäâæDT=g† *=2 &eõ„ÎWŽÊåh± L«2¨vQD…òˆú kîR—«ªªnÂ>±“ºW •½+¨Ññ:Ÿ¹f³fëJ>¿Ïˆî©YKö~Òê ç* ×ª‹r˜q†¯Vø7ýkç±¼­-o75ÊC´<¶jÕðÆ- $¹ž°ƒûö°‡•ô¥Åw{%@"[›éÌå¬ÇÛEY®Äš¯@Än "ï6Qƒ¡(SGƒÊT ¨ÃÄ‚Öq×ͦ¹C†dRae9ùË?yP]®L¾+»îðïîç3DÆù6õ…˜'7ÆUÖØ}aŽ5 w—tœ^DaÀÎënG€Áç;{¹/OÙ4ááhÂ'½ùWîû”WÔ>¯` [õŠæ±S°Á±µ}íßU[ÇpÜê}I\¬é_=xÁžÕdžoá“ ½†Á£Áßô7Iõêí;Û² wüûaÅÃÊßÐ\eϽûÇŽüã)!s¸L»^ãTsÈ 7Úà €‹íAºcœŒW™£W÷Q+è[sU3¸2 ’ÀÀÌÙÅoü†$Žp ýó.œ)¼qxbwÿ™j »ïåñÌÃq¨½äí5Ó”VÚ}{ù«Á3Ñ endstream endobj 5099 0 obj 7957 endobj 5103 0 obj [284 /XYZ 38.2500000 443 0] endobj 5104 0 obj [284 /XYZ 38.2500000 152 0] endobj 5105 0 obj [284 /XYZ 32.2500000 462.500000 0] endobj 5106 0 obj [284 /XYZ 38.2500000 152 0] endobj 5107 0 obj [284 /XYZ 38.2500000 443 0] endobj 5108 0 obj [284 /XYZ 31.5000000 464 0] endobj 5102 0 obj << /Type /Page /Parent 2 0 R /Contents 5109 0 R /Resources 5111 0 R /Annots 5112 0 R /MediaBox [0 0 595 842] >> endobj 5111 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 5112 0 obj [ ] endobj 5109 0 obj << /Length 5110 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯à9€Gìn> €v%È!€ 99rœÀˆ(>äïgfHÎî6ù§¿©n’³´`KÞûQ]]ïÇ»?~ù{öÏß²wO_þ“}ëúòê2ïþÉN¿~xùÛú?guSfß~yøž}øüðùøßïÝ_žþ|üÓÿ2›ýéøïÏÙ_ÿvüáý_:ý…_jSÿ÷ù÷¶6Ç?å—ßO?ÿ×Ã_~—ýzšqX®ßÌëÿÿÁÖe]§mÌ,ýýa8¦9ÿúíÛ¯ï:„­R–¦´Mf Wd¦-löß<üt\`˜>?´…1Ç¿^ç·,dŠâ´”mÛ̘¦Ê\^ŽV:ÿRšßƽÊ]ÄÙÏ{׌³­<»êWeÙƒ¨Í£\Áeþ³7Çß"¢Ïiïú€é/Ï®zÁm™÷/¸Š¤Ëü1f·ÎDœ½Û»>`ú Ƴšªÿþ™\»9­0GÒQ˜&‹Åj{ZæøÙ‘LåG"U¨Л^÷vºÉ›º7ùyçêP1'Lg×¼ÜÖÙ@öˆŒú ºLþδu¼Ë=ï\*ÃåâÙ/×¹bxZÎE€ÿóô&/ê&Þäç«C¥¿ÜñìŸCfÁ[é~Tï‡_Þ}:rŠ#0«ìëOÇÍ×ì~ûzb“uöÃIá8ª_Ì~Ÿç¦øCöõç‡öPÙrØcŒ÷á<òñëFñw¼ž­lµÑ_¶k—:-Y¹rX²îaPWå Øö<Òš6=’[8RѧóHq(\§ø?¸î›+6Ħ"Ž7[  \×%‡Çè±Xkáò<âeQ5õ­wkºoŒ;8Û˜ãGÏ/ÌøìpߘaåçI´%úÑ>¡õ°}<”Ãi®›yô†Ó 7‰!8‰m :`´Ã·Gðlö Þ†ŒâcBÚ\5Íë9Á,ì#d#é±oj¤…ëÀÌÈð7Â>‘&|D`²5Üõ{ø IužÞ¶Á·ý~ÛC®c D!Îfá7= Û>ÜõÛÁ*á< É]×7HÍ=œ=˜9F bD ‘x¶2%èmu è7É0Ëá®ñê×KaÔR¿Ü„ŸGØ5äøN<À’¦dàˆƒ;p<·á†_ 1›°æÝÄËrC>Œob¢+R’®¢œ¿”•0¸ª¸a«ÔñT±þî¤OݼƒMBÇb9{Ç7IoÀ°Æß`è: Åm±4„éü~ۂıKI`j¤MÉx—˜(k£ðò…§A)Nd²l˜Ü¼Ž.Q#2š˜A…)ŠT*1A¨b3Øf _£pB,)U ;N^>㌹9eê’¶DI"¶go)7Ê$2iá¥àF‚¤Õ:åu·\ÊÚó9m^¶·a»¦¼jMy¯š%îz¯šµWÍ"ßÜ:jeؼS…‘Áëàb1Û,¥C= Í⹸©H ÒL‘ÝlÇlš† óö*’R!&CøÝ*ßûC[ƒâÎjËíX•«vùEò"öê¶R5ך2uÕ\Æþ‚KÚ­Œuêˆè™J‡˜‰0ÞLÂ粓/ :%Æ}˜ñ]F1á<„G*‹ÝhÝÅK›ïE›9¸íåEX3ᧉhbRC´iêô õl±À‚gÃ(Ë0Å{N ;Ð5¬c[q§Å1 „N „ŒxJÄ®bPÌ:¥¦cMœp˜Tâ˜aÂn0*Á!V©*ODØíò²Ñ5KCL<%nBˆ0Õf¤b˜ ¹ãÁš“`tûO¬Þûiýdéu²°mëîQY²Å-A—ko¼amÕlf«M­¾¬\ÇĺbДL:’¶q†tÜšgB¶øha˜Ú.Tl#ê—ÄNFOTÅ0Yî~@¢æÊ5A³FÜÁh½0òF-]{Ô‘_³ËÅÄs嶤Ž9#Ã1„ss¨&Y;¬ñm{^fž./S-VxδT]ˆÉŠ[¾5K[“ÙbßͧñjÉ8 ¯qd…FzŽUzqòÅÞ£oð:½³qb¶¡©esðåVÓá§)BFÚðôÅÔyòðàu†æ]:ë5‹}“™v²nÕ¡QÙx×›ü£ h4éѨ<ØÑÞ£oð:Ìlý…L|Ó;=¦v`шû†ßä—Ó©‘#öpR`ý† Oáç¾ÁëôV „êš‘O9Z§§ÈÕÁë)”jˆŒØCѱ‡¢½4àf<Œ¬”¨Œ²«cd]¼’²í™è¿ Ðm•êÎŒÝ_Ã[€”Þ¢‹(Ðr`þ`&]g\@·$ —æ„Ó0 ¤e5ež ÓGAñÕÄô+ØÖc^>]ïS~Ãm T=K‘:!áþ»×³Ó?-áëJÖ—0  v*a«•j8ÁëKÈuLO9æùè>̵¥q>®á2YD‡…åËW õ±é×d?aSrtciUÖ¾„BøýRÇ$­êöΑtùì~ˆÐ§Õ´æê§ÅHIg©J퀸Úpblð힉w¿Ç½é=Q­W•/3Q*®$ BNf®„ 4 ÐáFŠŽÃá?8l1™©„f¦MéV+pÔ`~Q?ÀhÅä„Tÿ¸§¢ÖU>r«Š¢LýXAà|ÓÚ¤BoÊRE𚥿æZõT×Bå]ç¿Y¥ÎYÖõô¼_óÞÒWöÁ¹ÂXÝísÍ«+y*Ge®)‘º)}~©k¤ôIßy'P"æA¡7`Èï»eàöFý½ëŒ*ÜÃãtLÅÇêAÝæ*º‚ì™1¢<ŸÚAX§Ü ß)Þ„(n”Ž;Ÿ #Xİfz±'eà†»sQ&$Ü~s®´hîïÒ4{K+ Ü[Ñb[HðtE}Ãé˜|n¡¡Ó¼•(€+PEÌàÞ¬`ø ¶i1ýíVÌ…]3Æk¸ ÒKNÐü~ð[€°ÆÖUÝ“ 2JJšVU³§[ž¦Y¦_%ÓO”y3ÄK¨7!}X¸Žà)À»&äm¦ù7>)–趇§ ªÚJ<Ÿ{?ièFSÎÂ7Ýèñ%ɹ뼸EÂÅm ˆžÀŒl†q¾€¼2I³Ô¾Ïí2ñéàKø=„¼ Ã1Ú#ÖÝðH*+Ïúƒ”tÞåí%ëÐÇëÊÌòÔYÝ:ìt˜ö}×)ÞïsuÌäå'êg¸ì_óÀ˜´l†$hódFzì^#n=u Ö((è&ÅMà¤úua¿ûQåÛ„‰ måÕÙ´»“ízwÒîNZwV@×6CÝš{k¦»yÇÜqµÙw2;’f§ÖÎßêV¦\^˜N·'Lå{”¼ë=ajO˜JM±«8”kO˜’^úž0µ'LÍPüu'L¹¼ngá{‡ S.oo* °Iq¸Ì÷€ËÄ:¯1©‹S¬]·6î–Ôö„!±Î<—ñ\;LëB>MfÚéòç%­»dÜvKšüÐE ¼ ÒéS¬bл°'¾Áë³áoZô}vª¶îµëéƒ6¦¾y‚çéD½êàL‡;Ï#í- ßAï&œÚA×ÐÁ{vO:8°'öÖÁ­>¸‘÷±†pƒ'Å·€w«E»Ã§ÔäÞ[êÅS ±7×ÀB·þ˜ÂJˆGŽã[ÄoÉÂÙàýâ½9x¿C•Ùw.¼Lø.„·Ô†ØŸ(ÓÂÙz°t ;˜x ªÃî|Ü•4¡šR´GÂÛp(!SZØ ØÚ'}øoÌ”‡Ü§&©úk‡¡Û*U}]Õòà©Ò‘t³[„ó0Wø’™\°T1™8¹ ?ÏQàÝvjAÇLXÈ­Ï´­j /æ.Qº!ÝëRU=O”1á>@¬%ʯu£luë SÙ£LÌ>‘Œ(\)æx×ø)`¸­8Ûbù.ˆLú’ '\U¶q>SÍO¡°†i3ÊPܹ ÖDò‡°ŽŸ\ÁàŽXOú/ÄÌ3Ý£p|É©¤‹Ñ Å·Î(Â#ú’(1/DïÑM ÜÈ|ƒì’ÀtÖšù· rÖŽ0Å.j6Ÿ1f ]—›þÈ ÇcDylÄ)LsɆA‰W”Ùîz:¦+òª´£§Ê4Rõ({kª {+BüJÓº8b|6…‹#ȽP•Ä]†@­´4¶Æã‰;‰Ðn ¨ÚytZšj±  öÛ£Z‰ [„ÙCç$c/¼¾¶ #&2NC¦ÿml­6rù‰€¨‰Tæøš¤¼†·©’›4¹3˜ÌôQf8jÏUÏÊÂ∓¥£›;c™rv±~Íw} ž§ËWR•ƒS-µº©¾ê‚(ÂX(ˆj?B ÿ‘¯¹Äïò. ÈIñ®D>¡Çn,îLIX"˹z ý;.¿‚“îˆäù”ie®Ý{q¼†HqS¢U„(^e1ö¤ëæçŠ›RðRÁJ ¸ûQ.'—¦:)žMHÓÇç!ʺéÒH¦4†PÊÁiÁIßÙ%ôºž*Ç_Ù÷ãÂâ¾>Ïý…+´Çf²ÉÁQ ÌÍ)1³—bpÊSݾë Y¯“§ìÁv­AF÷UGzøØC5Êì2P ü€ÖqsýÔÞ>õ'…aö’#–þŠç-åp³CòÜè€=ÁÀ¦K¬õNÃàÙà7½Øn‚Žþ"»™E¸ÓŸ;vþêZe8 ¬<Àu0rô‰Ìˆkp¸Ø\¥â⊅…ë„È!,Œ±_wævä¨swè Ë•X#ú$ÔžÄΑ×ìóÃÿ¹šU endstream endobj 5110 0 obj 5088 endobj 5114 0 obj [285 /XYZ 38.2500000 244.250000 0] endobj 5115 0 obj [285 /XYZ 38.2500000 244.250000 0] endobj 5116 0 obj [285 /XYZ 38.2500000 602 0] endobj 5117 0 obj [285 /XYZ 38.2500000 602 0] endobj 5118 0 obj [285 /XYZ 31.5000000 159.500000 0] endobj 5119 0 obj [285 /XYZ 38.2500000 350 0] endobj 5120 0 obj [285 /XYZ 38.2500000 350 0] endobj 5121 0 obj [285 /XYZ 31.5000000 95 0] endobj 5122 0 obj [285 /XYZ 32.2500000 158 0] endobj 5123 0 obj [285 /XYZ 31.5000000 95 0] endobj 5124 0 obj << /Type /Annot /Subtype /Link /Rect [385.500000 194.750000 471 201.500000 ] /Border [0 0 0] /Dest /#1c#17#e6_#0c#8f#86#cb#db#8b#17p#18#0e#b5#f1#f5.Q#f7 >> endobj 5125 0 obj << /Type /Annot /Subtype /Link /Rect [374.250000 117.500000 426 124.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 5126 0 obj << /Type /Annot /Subtype /Link /Rect [60 59 84.7500000 65.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_overview >> endobj 5113 0 obj << /Type /Page /Parent 2 0 R /Contents 5127 0 R /Resources 5129 0 R /Annots 5130 0 R /MediaBox [0 0 595 842] >> endobj 5129 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5130 0 obj [ 5124 0 R 5125 0 R 5126 0 R ] endobj 5127 0 obj << /Length 5128 0 R /Filter /FlateDecode >> stream xœí]K¯ãº‘ÞûWx ¾âC/` ·˜Ån`Á,I‚ 7˜ž,æïlKçØ”>Zü\$%Y·‘œn똤ŠÅªb=¾úå_¿ý×ñ/ÿ<þòéÛÿô??};§º,®ÿÏ~ûnNýßuSüvøyüyøzøÚýÿÏÃõ ß>ý{÷·ÿ;êã¿uÿûÛñÿÙ}ø§þ—οðÛ¡Vu÷óï—Ÿm­º¿o?ÏŸÿõð¿;þã<â0]¿˜ûÿ^×Um.Ëx0õÏÃðšêòçŸ?þqøåJ€°YÊÒØº8*kìQµVÿ÷¿î&†/N­Uª®.¿ÄOTëóLÆVG¥Ûn$cF]þ ap[7ñ¿¬\œ*ÊTÊ?ºäæ–eѨŽA¢÷á# ^눃_V.N•asñè’›[w?"žÜ÷á# Þ6"çœWíäâÑ7×­¸¹7ÃG\ëx2ÿºòX›ë]rsuÛë­²ŽAþ6žV´¦ŒÉ8ç•KeØZ8¸äÎÚ¢gý¶Œ@Ÿ·Ñc¿{oðËÊ¥‰2ì,\rgëFE<³o£Ç ~cêxƒ_VëÌÂÁOMÕÿÿNNÝtó–ª6ÝõK5lj»WY¨¶*êÆÂ¿?3³nšÜ3OX­±gn³Í|ž4%©•ÕåÄÌ_CÆ`—yöì¿Ð·þ }´Ç±ã©ó{!®©Ún‚1qŸ VÛ‰±3¯x'ŸîɧŠËÒê³÷ém¡õÙ×ôm-{ÖtïkÏœ±—´gRÇÛ…ª5íYŒs6Å ËØ°özªÎûÕ‹\ÇfÙõg¬×y×]þ}ã0aß¿:áÈ÷íöÇï‡_¾tÆJuüþçN}_xýñý·ƒíþqvþuïõýOÇéèÛþáøýoUžŠÖœãÇቾ>iNM[TúöI¡á“>ùtybOÖ\£(oOT¿Ó\Ÿ¼P^>0§ÒVM=obU=XÒ¯ß;|ŽÚaX‚ww‡âú:m{º¬æŽ zR|„O |çÁ£i Ÿ|"bMÝÝï)e âÌM…EOŒr¸I‚ÁáÄý¶*50çûw~½<)OF7êž7ár6ˆ¬D¹aÅ./žx]^ÅHcî÷w*Ì CÓ¦BOŠ/ðI çOÃïxVð+|‚ƒýð ^›‚ÔÁ!}ÏÚ>Ã'8ÝÒ¯ ¿ù˜Ž/«B?¦/¦â*yÙÃ}šàüÑU&AÏS+(‰À' ¦èàS‹¿S|?xç äëÞ ˜z¢à8‚óXH O‰ÅkÃ|€)Ši¿#Ì!Ä öì6–ÑXVÁSïY¦5!w<ŸSB’¼?PR0OÌ焺M«]·­B·¥:3»Û5Ø‹i°]\u}üÞ».(v] ® <»€ý „wb—ø>оÄ_ð†å¨‡ã‰7ÝÏÂÎæ^fžÝÆémœ²ÝmœUØ8»Z„b42Žç$zlçír°—ƒu³ËÁUÈÁü1-Ïw«œðÔy"ÄÙ%Ê®§– §v_abýÑÖâ³>(o¨Ë! à $¨«òBWÀ†åÌK$1Sù¦LmNgss☒<*yr¤qr“#I 'P%D0Å. :>$‘xc&ûÔS×Çd\Eâ"DÉ´ƒ2øœL‰ˆZ‰Ó1sèµu´ÛëâR8²Åˆ¢UkÀ€JÑo¢DÉW7Ïœáù–KÊœö¦(ï·q¿'n(ªâÉ;7Ü–Œð ^ÛÙ:ñ>áhŸÑ“^úÔ'3âE¸<îÕ•2½gÐÀ³ ÖV£ý)à.b^-x,êÚ=W®¬NFiG,áÁ”úyO¡y0Wâ]Ä+P‰<ƒ¶PCVŸê4Õß‹hˆ#k÷†XÙ.F£Ë&Ó`Côeb1åwލsÑ7®ïÉàü—´7š±¤T°ác "*Ôð  :&Ⱥc'¨Djµp—ŠøÖ8:‘éoꠌȓ=²[ëN£ Í»³{$vo¨éáÑœƒòjwu)¥.…£:²I4¤&,D4lCĺ`|ßi`T_c­\í»ËV®aáÃXºÇ®ah¹AÓðqª \šp—å5•g?!¨ãFšo•J| 1¥d.qè)WX:ôð°£þ™Ô. Ã*<úvI†ªïaÁ˜»Ù—»ãz+<,A¶¶êw³¸Ö.Ù“’ýR)kœ¦ê¹@óx¿™Îš8ÕÅYhß×1‰eQâfYö¤iäôÅVméZ8óbÙd®,«Ènó¦ˆz¶åŽmmO)Š £[îMÕî–;a¹{ú'c •½H*$5U›ƒK©E·ýpçšô˜wIU¹®’­¹Qñ–ôÙjSÒ)@1‹ßeã£ûL@N“gDìe¦Z'{í€s^>ʳ+-ÚÃýNº²;énårµšæòõÏë¦qè_óëV;sî÷‡n`Ñ™Ãûžnî sâÀ+±÷U#8YÉ^"{‰Šž3Nq&¡›1}%J‡Se…S¢D“]Ö¼9ŒL]DÜËË5ØÕY]¶® %Ð1ôé*Æï‚Õ§,ø6Ÿ&& 0›!m)ÝÉu —½Á-ÇH¦)mÜöïÆDÙb´5j±ÝÁ¡ÛW—îíO¶%ŽÈÅMt‰Ú£GþËžÀú™¢Ð©ˆû²…÷åoIØÃ*ýÖGnù®´0DZˆRÂnø}<½0 ¦NÀi ~ ^ÕG1{'Ô}ç||-‹ºOõ.À©5°ÇŽ0R?Áñ ±ž­²o¹+ú~¥iÖS eP%Ü!»a|,È %äEO$|‚ ÷à>L‹–p¢»``B›…gËâýÁ’”x|î™®L7,<–c†Ð@Lw ¼Û Þ;ƒVçAÇ= Çã¾ôŒvÌOÝñZ؉t ¦¨ç.ÁØLG Ll%áÃ|€¥%¦NÊfcÒj²?ÙŸìOö'û“yO°võèPl·b mwY›À£Å±'ÛîŒ'¿é"<'ººKz<'bPÉ¢+ºl†)qPžAÆ òúöLïY3…ë8) -.ܯ~c…8žÑšSJâŠSSG„í>:Ÿö[²j÷Ñí>º›µÅÌ“U­#5v‹a;C@úm@>îÒÀñ"Viçxl v/lžìEó» œ¡ˆ{O%AÃHœ«÷•l…H^øÏGžºyæ¥E«í¨,\¢—©RDpU1³Ïv¶(v‰L¢vÜ„¡é9)˜mG€ÍxÛ¾žï`µ+ÀF  ™‰ã6¨§æ|Lì”ùæÆ¨{A?Á~"ì»0DGP?Á^'Ïû0¹ƒLÎ=ö`Š2q'ѬŠ¢ë¬HÈŸ]új±©]H”?OE‰\xì¹Ö°ß0»V˜w²G¨óÓÚàìÑówÓ¼5ÎN 1‡%°dûÒg³Ä^ا.C¥Dô åÃ{‚͸<ñÞÊ:‘‰ZÞ%^ŠÓâH ¥ƒ0iO`†´1›mªÒQLŠÕ楯GpˆÎ¨-!, E¥Ôb\æRq"’ÁpåKã§Mé'³¦}|#Û˜Ÿl¾¨Ý«ã}Ó—ñêûnàû¼Žï&™7Œ©?IˆÑ`ß“ŠRÕÝà¬Nf·p–*>µ„t­:. ¬Ùå­WÞ.Xæ—()+¦l]?¤ˆGÂ¥ª¥*¦Œž™ÔÚy‡½”¡HÑ™¸n\º§­ŠÜèB÷õ^­Ò#"ó˜¢Ï<¹€f_°#é"â;ë{ZÂÏ¡¥‡b‘ 0H¨Ø'·‚†³ ÈKdŠˆdÒ±¦ IPÞ¥ÎsÒ"§ÛÊö¡Näç‡\?˜¨Ùé­ˆ©fQh>¥€,:õü8¯líDH<ž»z‹-UÀø1Ëà¬r•e.†ÞA0¦˜…h/dUàKòCÀ©ÃìP'›¼ÏÄ0‚ O ±(¬#Ú'Ä~îÍ‚žwožÀ&¾‘ãx–Dôó¦^pþý4Í'ð1–ú ‚ÉTÎ' /6?ôM>B2jr8CâÈç…Ñ„žyÖtÿY@o*0†\*qcmå“¶wO½1ã®xÆ_eU;zÔ£2à:=·(|†™BÆ/úr2q¦TKGɉ7·—?‘<Œ«1î:·ýlTã¼Þbú EÜÔ¦‰ØdÍæ Öø×~0Çò‘œá°%+ÒÑž“£ÊÒÙÐtõ‹ÈßZk—Á‰˜…çJ9ŠK¤ä’‚3c⮩îeÙÁëžpÇTªvŽÒÖ@ö–• ÙD\÷òÇD"×.a„}9D©ldžbb$žšeÂaÌ `2åô;wÅLT(Ü›ÏF"ü”µ‡×6?ñ[nʾ[ªF@ÂÐÝïÜý€IS‘H³bhŸ/', ™œq¯3Nt‚/˜ÔôlyÁ.ލºÎyŸSÆ´î…ŽH«Tb/´÷QVE#Ê0L.3.ÉÀ†'RÕ„Ûtq÷ƒ\ø‘á¡S]ŸWÝÝj‘>·­ù²d}*o,Ð>ãôenZ9Ó1Jí*ÅÜ®ÃÔÐøÂÀz8SlþEm”áÙBÞÈ…ƒ›£j'ÃeÕ•«ls?e'˜¯wíP¡'ý‰)OÚ½ ÷¶âÄwð-3ãwä™jXbFi­u6„²W"§Ï‹Zˆ@3Sö ®Gcb¿²àŒ²åÇî-sƒ¤ú:Šb¤2™6ßÔ\Ö¥”¨Âllê28^Œ2Ç"‘z¥ ‡áÇ‹ •ÄLVÆUyÌA™ïFq?‹²×éáž.—¡ò„¢`@Åv¤;ï !._ ±`oy[š`¯<ÍÀö$ôäãÖ6žÆ2Ñ+0ûɺ'¶Ýâr•$ífÙŠéJdpè{ô£0ÐÔˆä]D™ªžÍØQsrcÊ}å þåôª^@1Ñœ2YAM@±B¢:|ÆM(Ú¦'Ù¥7ûmd вIù{ß×XG SšB’˜ðتrµ¥D1ã4–é 'zþ“µ–`8û3:"žtª~¾Nì{ÆNÅÔuøzv=»Ó}«ûäÑš#¡˜ßŽË=Ëm@Æw°)U=¤ÏrïQ.9ôIfŸ3í-Ù*Û6%WiQªÚß%ÚDL‘ Ž7¶úÐv:±ëz¤*{?å™Õ¯ô~§\…žôìTªQÓŒè;ê ­E£ µ“£iôÄàÀïxVÐÃÚVïŸÀQ<ã_GÑj$Ntÿ{5ÿ¨Ðš HI•Y±ÔÅЗ'Y[¦áGîtŒ ‡]Ÿ«G’a·Õ È,Æ‘x|;‰ YAµÓq¨V³4m?Íèé©TM¼êìÀ˱’ž[YMdßkÖf ¶vT!“2å9J#1d` °dOP@m‘ÄœÈíÎ1, •(-ºƒ2x]²yó}DTUúÆŠ,^¯‰lu<üÈà'ü+ŒåE×òiÇQ|åêÂmT€%»Ýnô®Gy$™¹#*ÁÍölN:”•M2Á6²)L«ÄRñp±l ì‘1–À¿¦›Ç§a£~¯€èˆIÀœŠôA1U»<’ÌöÄ ½þ*O…Û+놫OOéáÑæõ¤‡²½K"¥j~Žã2†×Ì^“?YEI|뉶2Èv„84cö¶”Ì}Kë|޶G.ø˜•MíªÚì*PÆJ!N›§Ø“ÁLÍ®<ðá‰ü´Ì ˜]ðœÐ®€pŽkâ*+‘†i£_¥àë å(ÜL4|¶ÒÎ"qw’T–ªŽ‘]sUäa¥˜°ä³7f¢öG©¬û ñoÅ}ÐÛISatˆ^6’Oðr \La‡M-u¸> endobj 5141 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 126.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_swig >> endobj 5142 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 165 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_tests_examples >> endobj 5143 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 123.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_known_issues >> endobj 5144 0 obj << /Type /Annot /Subtype /Link /Rect [60 749.750000 88.5000000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_integration >> endobj 5145 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 161.250000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_node_extensions >> endobj 5146 0 obj << /Type /Annot /Subtype /Link /Rect [114 735.500000 156.750000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_troubleshooting >> endobj 5147 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 135.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_embedded_webkit >> endobj 5148 0 obj << /Type /Annot /Subtype /Link /Rect [114 721.250000 141 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_osx >> endobj 5149 0 obj << /Type /Annot /Subtype /Link /Rect [114 714.500000 126 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_gtk >> endobj 5150 0 obj << /Type /Annot /Subtype /Link /Rect [87 707 189.750000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_applications_webkit >> endobj 5151 0 obj << /Type /Annot /Subtype /Link /Rect [60 700.250000 86.2500000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_examples >> endobj 5152 0 obj << /Type /Annot /Subtype /Link /Rect [87 692.750000 105 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_simple_example >> endobj 5153 0 obj << /Type /Annot /Subtype /Link /Rect [87 686 102 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_class_example >> endobj 5154 0 obj << /Type /Annot /Subtype /Link /Rect [60 678.500000 100.500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_implementation >> endobj 5155 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 121.500000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_source_code >> endobj 5156 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 130.500000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_code_templates >> endobj 5157 0 obj << /Type /Annot /Subtype /Link /Rect [87 657.500000 105.750000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter >> endobj 5158 0 obj << /Type /Annot /Subtype /Link /Rect [87 650 123.750000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter_states >> endobj 5159 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 189.750000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_jsc_exceptions >> endobj 5160 0 obj << /Type /Annot /Subtype /Link /Rect [216.750000 580.250000 236.250000 587 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://nodejs.org) >> >> endobj 5161 0 obj << /Type /Annot /Subtype /Link /Rect [327.750000 547.250000 334.500000 554 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://v8.dev/) >> >> endobj 5162 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 533.750000 63 540.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://webkit.org/) >> >> endobj 5163 0 obj << /Type /Annot /Subtype /Link /Rect [363 533.750000 395.250000 540.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rogerwang/node-webkit) >> >> endobj 5131 0 obj << /Type /Page /Parent 2 0 R /Contents 5164 0 R /Resources 5166 0 R /Annots 5167 0 R /MediaBox [0 0 595 842] >> endobj 5166 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1701 1701 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 5167 0 obj [ 5140 0 R 5141 0 R 5142 0 R 5143 0 R 5144 0 R 5145 0 R 5146 0 R 5147 0 R 5148 0 R 5149 0 R 5150 0 R 5151 0 R 5152 0 R 5153 0 R 5154 0 R 5155 0 R 5156 0 R 5157 0 R 5158 0 R 5159 0 R 5160 0 R 5161 0 R 5162 0 R 5163 0 R ] endobj 5164 0 obj << /Length 5165 0 R /Filter /FlateDecode >> stream xœí]Iïä¸u¿×§¨³©w ô ‡ƒn #‡ mg`¸´}È×6Ö_"õ£ÄW$UU]Ó°»‹’¸>¾}ùõß¾ü÷ùþyþõ×ÿ=›þþðåÔ\ŒjÆÿÎýŸ_æ Ü^¦ŸUçoßO?Î?N¿~ëþÿÇiüàˇÿèþõg~þ÷î=ÿñ¿ºÆ?M/õ/|?fº¿ÿ6üÝÖý«¹þÝ·ÿ~úÏ?œÿÞ÷膛&³üý 7Æ4ºŸÆÆÐ?Nn™løóÏo?ý:n@Ú(J)Éø™I!Ϭ•üü?ŸþÒ¯6Y>Ÿ,?Ës8áñeâ„m?a¡Ûn€ëT³tÌ$—+}ß° ÍÛ6ðiذßÂô sÐôò¥öÚn.¥öÐë»ÄZÆÎóÙ{X×'ï¶#Ôõû׺Áên¸kƒ’«·]t¿hy±zúþûPj»V&™]Ùæ²#k¦,¹•Œ-;Ôwñ2¼†+uf¼ízRy!Éï¾@ç²ûQ¬óaæÙw… Íâ½wàÃTMká¿oÛ4cÇMS¦Ä‘¸ÞK‰ê™¬bÀÔÏ<÷¦¸ã†—>meuÁÓ¾ö^â@tÇM—¥~æ¥Nv^ú´6OûÚ{‰±\”ë|˜y©Ó†—>mkTÁÓ¾ö^â@ZÁ ‚R?óR§ ;ÏÈ”™¦$~ë½ÀæVF3/t²¸óœ'ËJÒã·ÞKl>/HÇ™—:Y¿ó$iÏdléUê‡e)ÉYßïùûõ7¿XÛœMÓÿe³c«<ëöªIZ¾´½0ÖrkÙõ-3ïÅýÇèÞŸ~7ýggïë¾e9F×òíäͤks3{Y®ãÛé÷Óû?,ö„{ÂÞõGäÃ÷_O¿~nÏLŸ¿þ¥{4Âø××N –ç_†Y˜ó×?ÿ¥i¸ø×ó׿žXsÑÝé5¼7 OÔEp˸jfOøðÄ^lÛèÅf‡'â¢dßçß(ô„±q ´ã›ÆÀÀ¹EÖƒÇÁ½+ýôµ»oGµ¾VŽÇn'ðíðß¼a©§YùžÉ±Ù¸\@—I>ÁÝØ*z]Ç®å[÷Q3Áðõ-Ñ.ºq?› <]ƒhèõ:Ö¦ké‡YLfxK.»‘Ëa~ïÖ_û0¥Ç[ õtšbºÌÀ<5 FžP ZÃÞ> OäEŠÑôö„Á[ÝŽOÔ¥iÅrï`oïwÂz¿±Ã¾š V¹ó†ÝÀ®ZØu³ìšûPصÀÞ¿5³ëfú9 óìÊ®{Gï¼aº–؇·ä²¹æP`×êI]Œ½µ£•ÞI¨&ômß$„þàU8“ñÁ+–+Þí´v×®UówíòW?иX‹0{çí#Þ-Ì0A`=n'âÞ†~? ½ºÃ›ˆÍX±™v ±uœ¦‡qº–±õoMˆËuã~Z±³†Ø:VĦk Ûð–\v#—ÊØ:k1•ÃÈ“d(QE!žfð L’¦éЯnæ {ñ·bz‰¿3+ø[ 8rŽXÕ "X¢ßá­?_»q?õ«Ž_ñ·b2Fø{|K.»‘ËaŽÄߊswš!Æ¥è"òÂ`^ùŒ@"Œ"Þƒh’Õ&ð»û™= æ‰ìR0G:òÈ@<Ž/TrÞpñäÓíÝýùÇŸOï«_QÎíxE%Û–µðÅ ŸÜÀç¿ oÓï_äI |²C(á#è°ý|RÌv5%=¢¦ÔQ Ô jRƒ,hRÿÖD´\7î§ôˆškDMùJ¾% jÃ[rÙ\s(QÓ;p$”r1ôGP=$$±¥•Xv¬Z„ãà•òÏûQ¼LD×ÚÙ’¸]4d@׆ݺ6­;F)YŠÝôŸ¨Šq÷èí,Šc=^*â³Î$"&D15d8ÆÞ®|ø1¶v©€_ÙgL'eÈþÝlÎk6oØKF4cK2¢_!#:Zô$´Ì©ÀðÖH&®Ý¸ŸlIF4kVȈn|¬oñÉÈø–\v#—ÃIF4svÚŸG6˜`bå/E-Œ×ãcÀÊêŒ]FÊXo¹EA×zÜr¢yB3{åS弡œy¢È»F•oñ]ÊÈñÜ —äÏ÷“^7i„µp„Ûýf+aÝI¾Kmmßâk„‡·Ì¼÷ËyL¿y»¢ÖíóÆà6Ð÷mÓL§^–ë8V#¬…óbxNÛÛ¨ºÕÂY˜Z4ìfO¤çS ÕšOÄO­BŸ‚á­‰ýP Ÿ7Ì{"×| ´ô…é¾%`OäÕ§à­¹æPöD9³o„ß'8~ÝiûÉ‘ºZË5oØ PÚ³åj½fËíöÃ?iÚr‡·&€Ñ [®æ  ôš-·’ó†Ñ¡-w|K.»‘Ëa(ãl¹˜ßÅ aÓ€u?´geí¢ávbh—æQm×Ì£ºõÍ£}K@ Û+ù³só¨ãJ íšyT[ß<Ú·ÄÐ:ó¨ëe¹Žƒ‰a»m­Eá"Ž­“dÑïÔØªÛ«Z¹ó†½Ö4ž±Õ4kÆVHú¦ ­Ã[#½vã~zÆVÓ¬[Mãë-úÁŽoÉe7r9Ì‘Ö0¾M± öšˆ"P'bpŪe¬ý ‹m»‘¿aμÇe;oØ É\yÌõ$sß«ÚpBrÿÖ©®÷SyÌå$sßG¼o yxK.»‘Ëa…dÁJGqÔ¼TˆD²9áL܈yÃî "=¤‘k&HHMF†&Èá­éÈ… Ò óvAäš ÒH_ì[‚ "¯&È·när˜C/ˆºÅIÑ’@íS"¨©«í®1ó†Ý ¦…jZ®Z O™IžZ@JÿÖJ®÷Sx ¦ù¨i_:ì[PÞ’Ënär˜CAM·jk< f<öÇ Œ‚Ó©òQ?ævß Ë½{aÅÚ½èÄ?`!Ñëþ­ î]7î'÷î…ek÷bx9LÞ‹á-¹ìF.‡9ô^XgÁåï¡:#kÌÉÜ•Õ|—â¸_4À<ÑZà([jM3Ö©³ó†‚Ö´n %T ßú1+¼ßoS v:€B(/ ‚’Ŧ9~‡ny¢WÜüˆ÷è7¿Ùø²ÎÞJ§_Ã2OÄdŒ/FÂíò¡G 4då,Hh‘›Añ6L9¯±È+®PRO ln®ý±WoÚÀ‰—£ÚlzoÏŽæq”)žp^d€!&Ëå$øÃl.ðJá ¡¶õèP5XéçgfY±¢‹\TŒ¬€e¿_\ð­ì‚' SVœ€ 8%XQq ‚¦)á˜X×|¼g#Þ7‚S"i=”“»…¥À$*Á)N-: 7›p*‘ÓÏzÆé§R µ`QtÌQþ“â’ð1×~Ø3—«ª/6nGË–CöÛ!Å ®<™°…¾L¢ålïà7-úFL”Ô^|IUàÞ>£'l©6IJ¸·éÆ¯Ì ÃYiÐ ·½ú>;Ÿ_ÑG¶ƒ—Aˆ§%áføMÀâPv„Ïìæ`¼P­¥­§xf!c”Ä#¢çà&1X‡ !I&ÉJë_’M)° QSLyTpƒ7(¸É#"–EÂ\X$—]®Û— G‘†0’ßï€ _^˜Ñ£ý¶=!%€ häQÙjzÜ,geµ£Yœ’Êz×dME0)B½ÒÝ”e3Cë*Õ´|þûòØr7ï0ZÖ¼‰$mw^oÜ»µ-Ä"\jÒêÖÿMòA{è:œ™ŒM)Ê|”„ø–"–ÖR^”°# tE²Fí³;¬Lç=ÊOŒq¼-)®ÔOÑbfÍ<}”T`Y¢fôó¿‚äijx,@*«×>‘䚊ön5k™ROEä3J$ Åíþñ,:|,O;ƒÔŸÛ ÃÛàæžŒç{No°‚Ç+ÂãýYR¯Ôªb¥™l—Cæªb{ÃU¬¦kÐõÅq`!,ãêUökTw†3d§Yëm$øL5·¦Û›TY‹R?‹µù€„µ«v4u±ÖxÇÚ\üi: ŸL@¢.<Ø(Ø[ä›wð›}ãk‰ËÈf vϺxœž;Þ¤'Î~Ãá¼ÍÂC¾q=si¹÷ÎÍW"c°¹PÞV‚»kEJäˆî=>-IBÚìˆÂ"kDR9‚_w­L)LJŽÝs¹Í,APuò’ÜS­Š4Qêr‰’òE‚9ä§\Ô%"›QÄ­uxñ3”J±‚Ž 1GTwpXÊž.mÒ7~‰ºÀ{ Èë©r¢1›'<í3~-u„ÌPñ‹µ7G˜ÀucX¤h|0,J¸Ò€Ò$Ý6 L{PƤچùlú‚óÑòÈnx:Ä5âð=Á0/0ôTZ¾ G×áÝ©5kx ¯'›Šb\Z±y×#xïÆÐ@ˆw>Bã1‚˜ã|ט—303b$ųÎ/º)®¬¢Ûö ¦žâsqùÅâÅéø•'´pLû=KݤZ,Ø#‡R÷žõ% ®9•R:Ñ+”¥ªbr´|Ô’»ˆ243'X$ L”˜E,à/ÛÖÛ÷ ¹Ùÿ¬IÑ w”¹6Å[“È—€¯>­¤°Jp¡x^gŸHPSZFòù^6ß¿%ãF¬kd™Šmiköo)Þ¸â.žv²â×Ý88›± È.RS#Ì7rÀv¬¸ë€‹8â<†6 ø¤bàPvÎk.»çìæ¤˜=Š—m ÆÒH„õ¡ìÁî kŒåsFy@ŸRÍÿJ8+VâÊdIÚJŠ ¦äjÀ’UÞ ÓJ Š–ôÕ!Œrù‘LÌG­?ù¬`%Pv{•4 ¤Œ žO É7(ÙfÊÓ;Ç­_ÏŒ IB¶“ãnJ Åš8Š2ˆÒ¾¢9÷1s¹ÔãZ Ù&àdÛP¯sÛŠMÑØP%lòÆš~ìÌ„!^všI ã³¹Q¦9¨Õr—PZ//Lš‚âžÝ%ß,:ÉóÑNY"|³8~BJÊõÐa•y3£“ðÃ# "éö|-3Pݱ¹fP‚f.ÂöÙ¸Lì ?yñ[Í‹ßzñ[#¿¥Í5{-Ûfºíñ­¢Õ{r’fNp}Ç!¹wàÿø˜êÞ,ñ›þ«‘Krx±UJ!X¼çaÚȬ ›nȚɹ:ŠWw–𱕳ÁœJÛÍÔŒ%]Pó(Ç׺ªL VÖ¾ÁO½ Ši‡Ú¢–A–´×Ÿàîl•þMÚkÎ{]Ë\—5Ñ*‰ÔÖ*¦l®å×k±¤S0ØK* …9) ü„YSÔDyHÍáîòJ Ò‰•jI½CO"{qÆ<ÜGÂÿÇÛ)Õ~I.…£¡DPüÌ®Ïýå˜>^”,\[$Oíò¼©´ Ì\¨ƒB2òr˜ó¯…g*ÙCòR¯‡')þÊÅWŽ:)ŠCBq5Ší¸–…8s™B8‡¤¤B ppköìr¶™‡bT cÍ“6*Ëf²$«J³$úÀR¤/@¶ð aä”à°ú¢ñõiÁÒ(øS+ÅzâÀ¹þq÷”Ô89ÊcSüÞI¿ý”)¢¡Ä2S–çFI«³_Á¤X«§á³—Êöd†½¼.œàR€g×}#O-‘'%kx«® ¿%ÄPàⱤ©Íôª$.›ö]ʲ);ðªÑ»ŽyÙ RŒ7ä^´ý6èÊãtGÑ–Ròß$ðÙwZ –ïµÌÇIøœqÈÔ9ár¤Z‹û=Hn|XuF@R ?%Ž9KÐÛñŽEO–·{YÆŠÕ²%Õòê”Ç•‚ÿÔÖ™ó†WJß]-Ö;K ílEûVPÚ«0‹9ŽâÒvÇ*±¼t”tÿ"Øj•u¬•}êµÃYiH7χª•Ù?B­†H­4J Í–CpqllºÙ9dUIŸapj…èfMyQ‹gxP¡ìžu/9 Š™Óâã¥'ˆüÞû!ƒ}^ø§â¾QÜ1–¡Ç^—´L0îQÅZXꔉs¢ø…’R!¾.ä“÷ÒÞ‘ÖC-iî>ÒÌJåí!é¶?¦ij¶ê C›õK„zv,Ë#žÍ>€WQÙt[µÌê"”E9L²SBÄ$>Œ·Æ§>%]%$:­Ø•žÓ¯‚âVØíeIàY‰8cÒeÅ€‰s%kÖ={;Þ3‹Dr€¸c#O^OˆH¼(Á,EçCI탹ݬ^ 7Ôò+‰ÂyëápJ‚¾ÈÚ3öávú;¬BÑH– ‰.ì+GI…_Ëï-³»Å;ƒ’¦?áÔ³ øÕ ‹ý4TòüKª5óð]:#ØÃ·@§”DIp¬Â…sÏj>É\œ8oŽõ¼s{Ù#ŸÅy˜›ícR•Áë™àwí›ÏhwX ŸŒ÷Q_ãÌÃo"sãp¼oŸ6ö (ˆ7ŒO¶ÆLàµÁ' eÚ!Ž·“çp?4ÚÝÍóvªûsþÑmItÇ~Ûza_dWÙ¢îž5¬Ÿß™_#,ó6+ø{äwù…—vöäý±Á“)æ¯;º?1ˆÙ?¢qÄY]›Ûçi¥ÈgOé_Ì.èp¹Ã¾ƒ˜9_YýÁo&"Í’–> o¥\ÿïnÆKd²ÆƒC ƒÃ´‚ÀT÷v<';‡ÜshŸ$‡à}‡Ýó·ï»iÄeº³;—ò|7Ç^[˜ëüÛéÿ‹jÁ° endstream endobj 5165 0 obj 7095 endobj 5169 0 obj [287 /XYZ 38.2500000 540.500000 0] endobj 5170 0 obj [287 /XYZ 38.2500000 540.500000 0] endobj 5171 0 obj [287 /XYZ 32.2500000 410 0] endobj 5172 0 obj [287 /XYZ 31.5000000 411.500000 0] endobj 5173 0 obj [287 /XYZ 38.2500000 376.250000 0] endobj 5174 0 obj [287 /XYZ 38.2500000 376.250000 0] endobj 5175 0 obj << /Type /Annot /Subtype /Link /Rect [203.250000 354.500000 225.750000 361.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://launchpad.net/~chris-lea/+archive/node.js) >> >> endobj 5176 0 obj << /Type /Annot /Subtype /Link /Rect [218.250000 347 230.250000 353.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://launchpad.net/~chris-lea/+archive/ubuntu/node.js/) >> >> endobj 5168 0 obj << /Type /Page /Parent 2 0 R /Contents 5177 0 R /Resources 5179 0 R /Annots 5180 0 R /MediaBox [0 0 595 842] >> endobj 5179 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5180 0 obj [ 5175 0 R 5176 0 R ] endobj 5177 0 obj << /Length 5178 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤D‘@ÀcÏÈ!€a99Þl‹õ"Îò÷#µ¨ž¥Ý¬©¢Ô3mcwÆ­_õ.ÖãÝŸ?ÿsÿïß÷ï>|þÏþkøùáó®:´M5üÙ÷8ÿ@»Cø}ߺfÿõÛîûþûîÓîS÷ÿï»á…ÏþÚýö¿½Þÿ¥ûï—ýßÿÑ}øcøRÿ…o»VµÝÏ_?}«ºßªÓÏþóŸwûÃþ·~Äqº°˜é¿Э³mÛ/ãÂÔßwã6Õñïï_Û½ o–¦iMSïUmºÿùZïÿû¯ÝOÝãðÕÁYÝÖMåü8y«ûÙkÛ­_ûn%ílîã_žÑ•ÀàMm±Á+ç>eºQSƒKC»i+AhŸF—ˆÕV•ú•KA. mÛ:AhŸF—HÛóC1TêW.m8¸4´Ö‚Ð>.'‰JÇ•KA. mo$åöit €x'(·+—‚6¼ƒjø'NíºyétcU+·/®º¦2Ý7üÐz]œ”!Ãʹ%à\Úmmä¸Êóèi½¼_¹WÁƒ|­Tkë£þH62‡tÂñtÿñÐóðüƒûª•ÃÊÙOe„-]˜”}w`r¤ü<º¼U/îÄïW.DÊxpihk#hê=.íåÄô°r)hǃʯdøø¿'^|ø²{÷Ô! Ýù©[ØqÂáÇ—o»N¥ø¡÷6Z¿ÿòãþUeÚ?í¿ü²ó‡Ö6V7Çõ O´?>qç«é“JÃ'ŽOêCm÷îó3¼óü…ƒ´è‰vpøæøÄšÚºöüçQ\ÁãñIs0Ú©é;xëuþÚ(g€8q:x¸Ó(ñNñé¸üxÙWáJЀç§jòÂyÔûh±xIJŸ(3žõóßqu2Žúz¢¤Dâ </ðYuýŽãÃÁ;N@>! %4pbÌ}0àC‰ñ½0q>~é䫌hlŒd£j!Åâ½ÍäÆE÷g!‚blS9Þ:¦¼' òWÃhzœèùÉ ©æPyÓ^wu éF!Y xÖzXµRãD˜óÔM¾ž0ÇH‚ò¤>JÓ}P‰ëª.¬'@GÃ:^BñÀÜ«2$E—ÄÚ9Ì%…um¤s 5¨ZU€ ´j#ŠxâÇÍNÖþ€ž¨>±p4øNà%Kï8i¡]I´f¨å!xÉ’ÃÒRW[@ #2"<š¡°5Šç‚n¤KJ-íb"Ч‹O £ÁZ¥¸MxÝØúÞ¢¿ÃY6#L’9Ž™«qOò6áCÁÄŽ`z*¦“Ö'fgªžØ†ÞÑpH=¯Ûù•zî¦AyHœ9¶îž®?¿ av3Vˆ5l¬^`»s—ð„)N> îFÓPÚ$øÆÊ~V±Yêª8fõ-­ h™$ìGø¶šà;|GÃU‡ÎÚi «¥'š°hâµ%¬À÷ùk ÆÀÒªá tçv¨6Ò¢ßcr!ÝT$îEñ]KÈlíàÑ C­ A™½¤S.í_`Ãw(k£(’&ÅEf$Œ^ŠbŒñ VVI“•£m30?z4£öyBŒà.L¸ñ °€¥>,`¡¨Jˆ78Ob?Pô&\³ø \Aâܰ:EÁ»rvWΤ”³¬y(×FüÊ!øšú¦÷Êü?…ý²BS+hfK˜(î;TM­æîb`¹Õ*>W^)†¥‹8Îh룽Õå´M[™»¶y…¬ºk›©'Å´ÍKtúzôÛ¸q1!X­:ØVMõ›¾G™G@S®5K¹Ôðí6E d¹$¥ë‹EDK«ÔKD $è„a LÐx ³½x<ÅD»›ÝIÆŽ¡@Q$0&âUcŒÇê7üïç¦05b[ž¶Ä°½•îÅTßÁÁ5p5a4¼‚WgpÙ»½òËዽr&L‘¿³zïùL›]xdsбË–xç ¾ãÑ;M=ªJƒ©>#¿>\:®ö€žè xÕãÂ5£Áµö¸´SvŠŸœ%WÇ+€ç& =8O\§‘8 £Þx+Y0×Ã¥N°Ë¿ÃZçƒtoYèÜ^}EŒ1ؼ¥@ŸR¹R…â~Ȱ±yšl–[¬õ›V*ß,É·M1îÙ"æ^[Jp†Ã•R üz:#fG@âŘ#ÁdtJÒû–åÄrKB‰ƒŒk ÒmfÓ3z’m9@ªcÀ21Á;J)£˜ÁÚ„Œïž­«‹%%R@¯×»(Ô³ÞB¯%ƒ;@?£ >Ã[é*C½ Ô¥hI„ &ˆ™Pu7X¼7r˜RÌR–J¸á‰Ù¬õHÃ×tþQsê¶ÇV•W}G¡ý·Ó¿õÁ¹jomÿ£U*|Zïmsê­>ùº³õA)¯S§o™É(æ|ŽîûáßUÿÚ>zÛùxŽî“îéJúo¹É(n:ÇÏ»‡?ñ5Ü:¾áò”/y6]x«7k\ņ!ÝÜb^EÐLK¹ÃrÜ„ë·æH(yïŽ=tëG­¬ïµá¥ Þv$ÓòÞFâ²óå*„Òv¢B(Ý.¨}+Ë©xï?‰Uˆã·Ìds>ǨBt[YP!”ŽÕ”þ“X…8~ËMFqÓ9äUeN–n Å+ô 7¥Ú$Tb̬𪠣Ý…»¢p+ŠÂìv1ž-].s™‰ÊNÍDe—ÌDegü×ÎÍÄã·Ìds>ljÇÛ%3Q539ÒÌÍÄã·Üd7£·í ("Z0Ôª”,ëbæms›È|¤¸² é ó»¯G‚™½VÂEN±Ä5_Ûõ¯Õ†Å6¡‘tüoÎöœá7Š2^,ÁóE›ÖÆRk~EFðçñvò*v_ÁxáË |ùÈÀö‹¶Ÿ)F~ÁÀö'ÛO lØ~ÑÀžÝ(¿``û“í'¶g4°™&AÿÒ§‰²¸¼ ΋ÀÅ3)…#é+,°c]|†²m!KY‡·Õ¶ý’;ôå¼E=á-Ú˜Þ¢MÑ}ÿIÌ[Žß2“QÌù#oÑF-ð–¾4Qtrî»aÉìä X¹ó½uøžm§|Ϻ%¾×ÎxR[Íù^{âtã(æ|Žßë_à{vÆ[m3ç{ý·Üd7£ŒNÕŽÖ×/íçÁY¨‰Œ_œ›ù ®mµ6>]^§õçì´¤èhsÉM²´¶§°ST™3Ú:f ˜ýØù[À˜i.lCáÑà;Á# ²¶~†¶T„ëïV<®ü èÀ( !$(€— W…Oõ‘Á-Áµ­Ì!ð„+ +)Wð½Èø>í?íþˆR|ì endstream endobj 5178 0 obj 5247 endobj 5182 0 obj [288 /XYZ 38.2500000 659.750000 0] endobj 5183 0 obj [288 /XYZ 37.5000000 729.500000 0] endobj 5184 0 obj [288 /XYZ 38.2500000 659.750000 0] endobj 5185 0 obj [288 /XYZ 37.5000000 287.750000 0] endobj 5186 0 obj [288 /XYZ 37.5000000 629 0] endobj 5187 0 obj [288 /XYZ 37.5000000 287.750000 0] endobj 5188 0 obj [288 /XYZ 37.5000000 629 0] endobj 5189 0 obj [288 /XYZ 37.5000000 729.500000 0] endobj 5190 0 obj << /Type /Annot /Subtype /Link /Rect [156 737.750000 182.250000 744.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_examples >> endobj 5191 0 obj << /Type /Annot /Subtype /Link /Rect [213.750000 607.250000 300 614 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.apple.com/library/mac/documentation/cocoa/conceptual/DisplayWebContent/DisplayWebContent.html) >> >> endobj 5192 0 obj << /Type /Annot /Subtype /Link /Rect [192.750000 266 246 272.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.gnome.org/gtk2/) >> >> endobj 5193 0 obj << /Type /Annot /Subtype /Link /Rect [274.500000 266 306 272.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.gnome.org/gtk-tutorial/) >> >> endobj 5194 0 obj << /Type /Annot /Subtype /Link /Rect [375.750000 266 452.250000 272.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://webkitgtk.org/reference/webkitgtk/stable/index.html) >> >> endobj 5181 0 obj << /Type /Page /Parent 2 0 R /Contents 5195 0 R /Resources 5197 0 R /Annots 5198 0 R /MediaBox [0 0 595 842] >> endobj 5197 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 5198 0 obj [ 5190 0 R 5191 0 R 5192 0 R 5193 0 R 5194 0 R ] endobj 5195 0 obj << /Length 5196 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ðy•ER¢(`À3öÈ!€a99Þl {gùûiµØíÑã+µ¾fSìní`=3Í!Y¬7‹Åâ›?ügöï?²7Ïÿ“}öߟ?®Šî¿¬ýúñõÚåþç¬vUöùëî[öm÷a÷aÿï·]×áãó_÷?ý/ÓÙ_öÿÿ–ýýûöÔþÁ×]­êý÷/‡ïM­ö?§ïíç¿îþöCö{;âq:Lÿ÷uÝØÒµ`ÌLýmw\¦:|ýñù÷Ý›Ëf©ªF76S¥)3Õ”:ûï¿v¿ì'8_äM©Tm˺¸d¢Z·3£3¥›ý¬õhžÃW˜ÑÕ5w·‡FŠ2V‰ƒçÎêº¬ŠÆÁŸ/ZUUÙ+Rû4ú5bÕYéùµ¨ )ÇN›=uÝ\A§áÃcß¶P×#íòàX9Òޏ¶¨Í‘¸ûÂãÿ4üˆ«J[]sÇJG܉Ñ?,ƒ":ß„ŽOŸvo^šLÙìÓ/{Èvß>}Ý•û_ZÛ¢Töéçì§¢0õŸ²O¿íš¼¶•ÕÕ¾®E7‡—»¦è·Õ¡ÅäUi]Ýkq]Ÿï<>(óÒtÎÛ÷á»¥Ž£œ1¼rË[0…ûþðA•íTÅáBÁ–¢„ã>Xaž®ÏûO{λŒiT© À7jÏìƱžqÐô(û„Zж¼ U‡Z’ ]4ƒµ \ë Q-d̵%$*&7fÒœ-êåü,ð&Öx¢ÂëÁHë4!¹ÔŒîÀÊñiHä*Û™¡L)Õé{sdÜs$ʇ*–K› ÄßAtC²bÃ)Vïp=c“Êð`,^Ç(~;\c±Òa kF÷a6Pg«VÆ„ò°„‰€í Á: Ÿ—Ö“¥‘…p¾4¡Æ Öƒ1Š!À¸fF[ç\”+gìÐQ}, ›Ý‘ ,ôHá,ØM`n³ÆưÄ­˜°‚CMlA}a—TWïÙª¿î©m Ü>Up“Dm¬ŒA-å[8O [*8OÜ-ä"ØÔûåx À}à<^z—†×ƒq]°½ƒ-wì`~3åõ·0a.õiÊŽõT‘ÛZõ#Vد'v=Œ"@ÀÄ‚nõ©㩞¿ùÀvVÖÛ’°;ü°;— Q\!ð$Pv]Ìhר9´Ökµ¤F¡už>Sçë3SªBSP¡ËÔpŒ ¨s}…ß!HÔ®ó°LÕºd{E®z|Ù}Œ좆¸_âµcœŒ<ðHZÅÌX_‡‚òe‡0;˜r* àf0¥·^ˆ>oƒöif,öDdQuLcs}××£=¡>'WmHöåz£¸þ¿îž~¸t«\·IÓqšÎ»n§ò®¾ò jIóÔ›ò¡±äCm!x–ªÈgV€PjNÁOÀVÁ–—å°}³3TVãÀ¾êáÄpÅmñh˜¶xéX¨i¢†@A6H[ŒAކd1³b¯©­ËÌÅ!§d³† RÃcéúáƒÊc«eÚP¹¸…‰[àð/\º°ãÀû >r¦H$3Q»Ä¹}êu£ØZ5Ö-`N〰¹¶„éÒ á¼n°ƒŠ,Œ†'bkTÞ[ÐØÚ’ƒ°UsØ`ôÃÚ³hXÀ,xÃMÿœÕ2熭Hôñù‘ ½à”C4ÃÇk½e9AÂ:D°m‰ šÑy–J bN¨±FÝ¢,’'B£R™e9c`ŒŽâð±2/Ã&À0Çe 2#°í]pŽB:/=p¸ŽauµVì…» Á&2¾>­ÒžO©\Ó7{S‡âøX&à´ !÷aðñ¿†PüïR à<Âzˆ$!bÔ)Ô«îÊ\¶ß&NíÊ:?Û–M_°T‘waW`:ÔâíM•ëQøÿ…è!ð!ª‰>¦cq¥ÇɾŵË÷yª“ánL_!A¨}žÑDÜÂŒ†WêFÕy£+ÅóÀ•ú¼œ©>Ò'V0no&úèPU^ m¶D£ÍK´ß›oÆ*c\¼ƒ}7Hx[]CWeABYÚ£‚óMßû¨£ŸŸçæ#úËr㘄ª ±«%ùÞÌ¥TB•P©1+‡í¦úàeÑ/¬¡Ø`Ÿñ‡ ×=×¼ýPÕÐÐ=!1ÇçQTÑò~j]÷§\3ïB6ïç÷Y¤ðñ 1ž²„ ùáheqm¦öÎ[mëYÎ¥B$AÓ­¯UËKgܬ°gaU¯÷I8E›q ÂFÐï'0l M™(Ž“G ~3uO¨˜0–Æ {_ì,Þó’µJº}Ù”C³…Ó퉌–°…c¨gÑ™Óùç°X%0ÉG7ß;Æw•ƒÝ9LJ¯õ`m|ÊÐæ R® ¼ [JPóŒ‹v~™±%¹LU>"L+v.†60q…™õ<£]°e²ª‚*‚õwóx4!Ö4*Ÿn)º­–ØOb1©¥ V¿©ÍÔÄ¢"„ÇIUÜdβ0ù±¬r‚¢‡U.ðüÀwÌZL®²}IYVSˆ©sƒ÷8ÑHZj11éy¸æN [ ‰YÆž§Bª\ÇáØ¦œ]ƒP³‰ÁNÄ ‹\ÕK ÜB$ÈÞf­+…µÔO˜>‚Nƒ"ôÁØ+Å£i¢¶®IWA©=•}·”Òz™ênp&:%ð¡(íBÐT©çLn}ìŒ8Åט«°dáy0í–C4´âíB$?_ê0ØÒ6ñ¼’¦:ÖÓ­˜Úœ‘l(žGà1B;0©€Bs \ŽínÂÞO‰eæÑö,qäùtMg|Ñ _Ìb¤‰°@¶°~§pý ÷Á¶÷Ár†½Œ A4›a[#}Ä<Þabë¥_£l2Æ"ô$°åÅÒGZÞ¤ìQï0^õ¶#“dáÞöj Wi¼##ZØÂƈ°Ç4e´%¡«béL9Æ',r$]•²¾^_#…õA“Æ5æ·§ˆ`igáÙ"`¡c¤Â®t}[‚—È›ƒV‚*…²í8( <À›ôuSˆ-ï­„Ôd¼¾•HÙ÷Že%öÊšÆòä×·`)s¯`]™"[A3Ä5•-GÃ80ø}¶”iŠ}&z{gØI`W›°&__+‡{)ð OÆ•³ðtÄ|IØwFjSæ¤Ûô *¼c ¼¼ 5WI´ÌJÓ²>#Nêt鉑À-J%BMDJ,Ø>ãS\& Bdcáü†»‹™‰)Ç©õlV²z®æ†ÁŽ”cøàÞt¯#ˆ¹*èþz±ž‰T0¯Ï39I8 -ì#XMBbùºiÄÀ•Ö·à·ÞY†ÊùÅ6”(ï¿íÒSØ¥'¢J5 ©°†h˜ì!µ«ÌÚ¸#Ç1sûº“ÉÜýŒt×ßæ ¨Oß³Å}ð=sÜRAxôßßÀPgdŒµŽ•e+ØÂcg"ô·)s3€1÷nô LŸ˜Ñvm.Éï,°&Æ'Áxfo‚é´V‹°7t¿Lðq‚Þ/cÖ6û"Z쑨€ÂØjáé>¦Êqož±üÂ<ÌùQ³G 6¾kÉT›aîÃÏQ.Žö®.É»Üî<ÒŒñÆd”p=¸…¢6´â èA¬k°vÀ4e4dÂØ)ñznÒê 'aAåã-fQ×—d¡mz]<ÍÃPGºóÄèõÇ¡©u[êXùçx_Íð5c‰ÛõÂI%„×@½ŠW¾h=LtÃ@„*=x´Õo:RÕ€p¸R!3FœÖ†…zÛWKLe—EÚ¥áçuQÎó⋘˱lƺ—‡¹ êãÅ^écÓ˜Ék[õG«‚9‡ Èž9q”©0>¢?µh [:QåF;unŸgˆÂnÿcòª´®îõñÌrÆ ^0–-£¹tûxÑœZ ƒµ—­©Ñ0vðz:3¬Ì±éŒ•ziX¶ ¦æ›/A=5„@á>x¥6C†¡)æQLmØÂð¨5–…'¤c±ZóvUä¶V-pñÎ,µºüµ²V=eÝ}r––W ´üÞÞöÕ|4L•ËeÉ8|WæX¸–c”9$^dEv2ø+¨1+´=´ÉÛþ_w•+^ðe÷Qp ®ãK´ ¸Œ‘ ¬0/µŽÂhØ”s´¢F°U½’F„Œ±¡„mÃ<1ë™Í f‹Øž`Ö¥^[0[úÄ. á”DٰΩÀˆÈª*/SŸ'²Ø5Ô/ÃÖ<„GXó$¸-KRM6ÚÕäMqMPnŽÁ&3 Càƒq£imÇÛå+õ‰ˆJwYEVr°§1ôtý óf¦eÌž™Qʬî`è‹‹ ‰`ÕÊ̲åò1$Uì`ݤ¯^Á£ bÇ[‡©Ñ°Wo>Wt$ÄˀŌñv8<Á]G&:ƒ”ÖÏSŒæ9T˜ ׄð+œGXöpŸ¡±"ŒjÆûp€Ée}äß0CŽψãZŸïò–ïCYÀùƒÁÚÚ¾¤:Ì.sà§ððÑ$QÀM(º‹Æ1ðœ8€“ïÂÎC¤Ó*"¹jã±¡ê ”Ê*p“ƒ96e¨ç§Í,®¨rIÄe êq<N?Â-Ìs7yyg+ "jˆë­TÈ[©º°“ÆgÕ¬lR¸Zÿâ –çX+ež9ÃWcqò)syŠ’X. oø 6áAŒëˆWgœ;ÍñqA×\R0ðã‚XêÆË°5\‰SØ¡ö —÷;Ïcº¤È_ØØÇú>¶àÇ2¶ruÛ j¬ÙÓð­šê¢gZqLb®%ÎêšKž» k'„ýqA‘)n@•V&dKØW2e6˜¢LÌã€Ñ±Ì•gŒk":ñ¹PU¨KŠ(„}n{ŒÝ Ûú%¢=x²þJ™ô0µ1Ôøé)\HÂðaÍjab=ø‘:Iø|FðÑÃJœ'ÚCî̹ 1æÁwNÁ«V…ÙžßJÊ%üx c§6=˜¶ŠnÅq…yb=HŽ5þê’Ë[ˆåÑ&bÁªí¶W£mgÛww¶½YäÐP§l%°Õ —CÇPߦlG‹ ¬¾·JÄ[¨ç5ä=«°~Ê%¨ue8äF}6¦¨<1Z’°ßÝó-IX U\’Q³Y ÎJÜæ­ƒ#ÃÄÝ&¡€lÚOÍ*¥/yþñ6i¿~¶[ʹ–wg›¶§fÓÖviøå%yŠÛÓmœï€}!œßëy´õw˜)sHÒÙ¦«?m³¬pDOCŸNšCðÍŒ‡y9Ûf·‡…Ï‚šˆ€ÝÛ“›÷_$÷fÖ“²—õ@Ц¼c¸ rÈötî#=Ëì©g&1_c+ƒ+Xa ¸=i;çOºKn=ÞÛN˜âBG Œ¸!Ü}HÙ[H‚ÿµ¾äöÅ¥wš÷_Ù·ý2ÄU~˜ûƒ3Ê>»)eòBµ¥Ë3}Ô>B2U›»£J=Q®³“'ëC©è±U·ãÿÔŸÎ}éôWü×A€_Œ›˜ÇÌÕuŸ‚íůtT½Ýç}MæŸ|*³)`•_úh^Íáj˸¾êÄ2 öñWÒÕ¢¥¿b[–áÚŸ÷÷•íTÍXX¼³€†”X3.A LW…±ú‰Á-ѵ.Lîu™~‡ZÌ«âý³ŠïCöa÷r•ÃJ endstream endobj 5196 0 obj 4873 endobj 5200 0 obj [289 /XYZ 38.2500000 161.750000 0] endobj 5201 0 obj [289 /XYZ 38.2500000 692.750000 0] endobj 5202 0 obj [289 /XYZ 32.2500000 194.750000 0] endobj 5203 0 obj [289 /XYZ 38.2500000 692.750000 0] endobj 5204 0 obj [289 /XYZ 31.5000000 196.250000 0] endobj 5205 0 obj [289 /XYZ 38.2500000 161.750000 0] endobj 5206 0 obj << /Type /Annot /Subtype /Link /Rect [221.250000 671 249 677.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rogerwang/node-webkit/wiki) >> >> endobj 5207 0 obj << /Type /Annot /Subtype /Link /Rect [152.250000 650 171.750000 656.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rogerwang/nw-gyp) >> >> endobj 5208 0 obj << /Type /Annot /Subtype /Link /Rect [360 560 382.500000 566.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rogerwang/node-webkit/wiki/Manifest-format) >> >> endobj 5199 0 obj << /Type /Page /Parent 2 0 R /Contents 5209 0 R /Resources 5211 0 R /Annots 5212 0 R /MediaBox [0 0 595 842] >> endobj 5211 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 5212 0 obj [ 5206 0 R 5207 0 R 5208 0 R ] endobj 5209 0 obj << /Length 5210 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àôˆ‰˜ñØr`Œ9³Ù‹ÝEœ=äïGÝ¢ÚÝ’¾’X*²Õã¶±coË"‹õf±ªøñÏ_ÿQüë÷âãÃ×ÿßÂχ¯»r者û*ßÎ?Ð~~/œ¯Šo¿î^‹×Ýóî¹ý÷u×½ðõá¯íoÿ+tñ—ö¿Ÿ‹þÞ~øcø£Ãüºsʵ?9þlœj+O?Ÿÿ{÷·?¿Fì§ À\þÿíËZ50f¦~ÝõËTÇïß¿ý¶ûØ! n–ªVÚøBYc ÕX]ü÷Ÿ»ŸÚ úáË}c•rµu嚉œng*1…ÒM‹ëö—áDÇo™á•üàÊÖU²Á;Èű¢L­èщ«êJUc.Zÿ·á îË„œs„\+¸Äè’ÄõMÀ¾.›øoÒW«öãtœs€\+=qñè‚ÄÕí4¸­ L€ÿ~øĵ.äv‹c%—]’¸•W %÷møøw)9çy*É%Fßû:|Áß™sûÃÄÞ¶a•/’Ý8HãRçmxùÁ²éï ÇJÏV£ÑŸcFÁ tŸ€íÆ+ñâç—Ýǧ–ßZdÖÅËO-pÇ9»/-RªâÃaÑBüòcñDzTöOÅËÏ»fßÊHâÜ“²Š‚G³Žö>y„ó8Æzðhø¾ŸüžÇÄC]~Ї€ ï`ÊéxšàÑ”äJ1}ÊâÑ Þ0ÔaÊqhŠåަ1l_Zeš\6óXÌ¥LOGL…9VVsÁy æ¤9ÚÇAWú”ɲ@4žC ±c°-¥é—<”3 »k¡mö€Ð\ø Ƶ¨_DX ÎÈ£[ÖUØ_Áï`p¤ÃiŠyÔ`ߣÉgõŒök¬ÆïÜ“<«kwì[ÙÛ(¨á°eÀ>Óõ=ä[¼ax¡F¡^¶Øf@¨+‡ú’á×söP}8~b2J­¯ÖH­¨!<ÊLü=½mX«Íjá½,öl 9>6GóhL“œ˜·ºŸõ‹Ô¬¾PÍÔ”º>NY•ý”ac Ê}Õ!á 9= ¦¿Úëº{ô†ê'ÑwøN€Íìò® ºÛ›¦¼|§„ó( Ÿt¦¶ÞÕqÈÐhMÁÖ)!¥öUc.`ÓðI)ÆnˆðªR^? j WŸ1ŸÂÄTæä æp jHÕÄs¥î`SvïºGK¸®Ç¨n‰â=ð,™‚〿 ALãÔ;s¥èm[v¢dO`ö»$7b½N,üÞÔQÇüvo02~GÃ'†ç qa¿`…'~ thw j)Hp´`ª£ÐÕë±–{l}PdC.5ýƒ%°… 6† ­K œð±›ÀûMׄޘÎ]^gJ(ÒÚešóp¿ƒaÃ,?’v¬€«ÏÃá+&ocBÂß QèÐ’‚¯¬Y¢UÓÈWW"Ð;÷5ÔIi}Ì[Ü|¦tCë!ßî ^5Ô®„µÀ$2C1†gù²ÐÏæÄ°Ñãxú9[„‚³þ.0­%¨j{7Õgø¨Ír =Žî°²f‘‘î`ìýiǜΠ§DËØÎ¢a‡‘ÔÇBlä*?`#µÓ£ ØzZND†åû+˜1D ÏÑ˲¡Ä‘T0†g±èñ€¬QŽý^'œºÄ'BDØ•õ0ë"øo¹ÄÉFw3:œ¹»OçÑã¨$øld¥eiVü.öä8Át†öbið9yÌ\mj„í$±H'0AN`V»å‘!JA)] ñ 55NáKC…ò^Ù!œœ}Ç×ZîËzG„ãHwD,îŸxÇ`ñä8RÂÎ9û¸d+—ûÒô±‚7æÇG×Ð Ù¨SÔ¬ã½î@Òááàæ#È.oÎ?¸Æáà„K–íì»&'Å¢}BVlØã‚ b›üy:ºÒ®¡#Æ/¦0~‚kh9õí¸^í)#~OÕb[ÆoŽ€Ó\Y½W¹Âv¬ IDm¬t%tWN:Öi:lqê’5G¶0±lÍÑ$æý\¥èn5ÑËÓ„QµJT9sú®1êØ *púqàw Ç^__ÊzM¡Ð-}\Á›ÞÁÅEk²[³ˆ42VŽl0¶ÝÄÆH4‚•#ÀÙý2rÁec8ã]iDÁÆ'‡:‘€˜ÃõÄ Zb”'îŸÖm0õPÙÝ€UH©ûµà#}¢™ ggs9k,B y'¤z=žË»›zò‰ÁýW;ˆý)ç”újiyÛ{­SÊïÄ«™%vâý]Ù\IQ¿ïrªTÏðÎѸl³U†ƒ«®Ff0ÅñÔUŽü½·CŠ:¤á9•7DîVbj{°ÿ…i‡u—Y‡4Æ^|p4“îÕ¢D[œáQ°À¡ÞœŽ2ænsïËOÎò3±ÃÄ™‡“ÊÄISãTUrb#¶K”!܇>¦uºúâ~KúI鳬«z@‘œ‡÷>Å6?gœÕÚK WãÆÒ„'Ì8âÁÜG´_—]Ïö³¢Öcrrv½¦9+AáLÍosñØM'nl—û¼NÃ}Ø"rŒs. Ȥ3Ú#ݱ‚ZÂÆ6 KÐÕ©EÈ0ãZ"j”O†u©ÓÐ>›Ücéf\” Ë/jvÜ`œh=ž“+L³®`\kAÄPE/ö_`*Ø,¿äáŠjÍe2rMì@êœø¬tVo…9)h£MÖPaµšikP‰Ý#ƒfH¹\sX±]FO³˜\”•ýT“±¦VvH¥{0ïªÁ<ƒä&éœ#.¸…‰üN×m¢è wOiDÁo®VÂ7YcÎ:æáô8íüôŽš)qzPŠ®T¸8SŽQžšñ¤N«Ú_rìmFjS:«Ê 0•ñM·_½†ÄùQ™bßZìŸë¶kb¦\$ãºê¬¸ªç1"û„À/ã2zÎ5Ý„æá\é‰Ý}_†°iNÔj+¸QPk8Á!øòß óNVyvkbÀ,ÌZ±Y3…XęŬâë9ÙÊ‚+£Ü \Éâ—8W¡$¬9rbѬ¹=Ûy¶‚²×˜c[ǹšÛGlïçšy„ubR³š;p ÃE匰¶œxN ŒŒ¹¦ZsÅúõµ/A-FðŸÃ—œŒŽÇs¯ïïÊâCÍi4›ï•GÎÜšß»œe”3øä.g26RÒ¦Y“Í|—¦ŒÒ¡~?ÒTf´3V­É´Î¿¹Ý=ó¡)E^\}ñ[­’è›;?šÉ¬ÊSÙnÕqÛÌèîg|àÌéF,[c›â.ÊÄ7XTC²½ïæ@:œ8¿áƒ“=({cfL:çjK‰K!òt²Rzš8QŒWáÃCc‚Éõ…ù®™ÆGÊ9»[ ÎçMFãt›'Òîi]ø†Ïˆëbš4E\-ˆ›ˆ^Åiï€Q͹×!"‰”Ó¬û&Ä20/1..–í’¸›ãìpiõ~]ò½1ÖIDR^ëFº>ý•¼nDkÙ*”ÑE.X§rrERÜ^Öh¡Xnj†Û9nÿÖÄkÞas­>‹¬ÜmF3¢ÂsGS¦‹ý²]¯´áüu[ÊÙ¦T,÷SÂY†u³¬l}!§Pƒ±¹'X&¹EUºšñ-sðˆO9\ÂQ‡*Ó­º:uæ’Õç17_½KYËÞwÅ.}ºªh;ÓÛèõO°'¨,:gO­ì%oÇ!gj±Dm1RñA#©œHÌd$sâûrˆ†BœÂ|´ÆH'Åà;ÌÆÛfÕfMR ‘ªŠ•ç6¸›l¢(+37p%ï¨e&–Ÿ&£¤Wk’lrI:¦°¬4iÜŒ òKVj¹U);¹¨…eX”Z'ñá´»œÔjذëS û}²ÞÝMêoÂ/ÇégŒ„Tl1v ‡r·G‡Kpø2ÃÙ“Å䜻87ˆû¸ŽGp9.µÇºß¼ŠçaH kÇ(oÈû*F‰ K ¡…8‘ ü„Á!ä\îjàz,£€åémCÛé5…òwmw×vÑvðÉ]ÛmBÛa¯/§¶³«Z]ܵÝ]ÛmCÛÁ}×]ÛmBÛAúdÕvuß’ÆdˆúBÛéŠG`¼9ÕìwÀŽþ»£÷7´yô$°h½½ÝÏžÔð½Â-òNŸh4Š‚OBhH«Q C`e÷ÃVôA¦Öñ!#ÑLZˆ?µ#®’Ít…5n SذüNM‘Ë´‰ÄPœgƒ3%jXJ²y6Cˆôš\”œlLY¤ˆö3¾~2Õ–/C•˪ò…j&k6×lêF5—S¶ús¨æ{7~_íõÐhô&.æ ›¦Þià<ô¸&ÉÀwzSÚÓjd[‘m­†£%oèL]SnªIqmÌ’ZŽ%e :'Ãø¦l^–ûPJ5`¢ ÞS¦83LYŒ^5ÃU‹ÖÍÔv!³Áà{FFó]?¥x”‡ž/gÕ´Ò{ àÔ.—‘•ip#,5¢9nœ+â¾»Ì×Á1 > >> endobj 5217 0 obj << /Type /Annot /Subtype /Link /Rect [129.750000 514.250000 157.500000 521 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://browserify.org) >> >> endobj 5213 0 obj << /Type /Page /Parent 2 0 R /Contents 5218 0 R /Resources 5220 0 R /Annots 5221 0 R /MediaBox [0 0 595 842] >> endobj 5220 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5221 0 obj [ 5216 0 R 5217 0 R ] endobj 5218 0 obj << /Length 5219 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9À¶Å—(A{<C€Èa‘CàÍ&X¬™ì!?ê–Ô=#õGIŸHŠê‘öŒ›#Ь7«ŠUþüõÙ¿~Ï><|ýOö­ýþðõ­É›?Ùéë‡×ÈòØþœÙÒdß¾^²—ÃÓá©þ÷åÐ<ðõá¯õOÿËdö—úï/Ù¯?ü©ý¥Ó/|?Xaë￞¿WVÔ?å—ï§Ïÿ}øÛ²ßN3v¯kóöÿ?ÈR˜*?-cäÕ/‡n›âüõû·ßÌ{‹)”(óLh¥3Qi™ý÷Ÿ‡ŸëtÓçÇJ a mó%/²òô&)ŠLÈúQÿí¿èüåiú“ëÜ„›ü¼rïPªîÙe!­6yUŸ—Í” ÐŒ ’nö(1B$¦ÓÊ}¥C7œÜ'+›¢å5©C ö2}è—B¤›ÓʽC¥Ã-žÝ'r«ªjTè"ˆ.Ó€¿.t@¾=¯Ü;T:äâÙ="WÛÒ¶2¹jûåð¿LþFá$~³rïPi‘;œýiÎ,x)Í'ÀP|q<øéùðáKMpEöüs½²ó ›oÏߺþÏÉ4¬LöüSöÇõ&Á¿ŠW"J8gS9\œ¹c?>àç@¶…Ï@š>ìcýcë2/Æ@1æ_<=§ÇçZò-ZB‹È­“°í ®¢\çÕ¼k…FZú¿5b}Ζ„#ø=ð‰gS¾@õEa{p÷‡nøNÛÇ5–á^dƒE ˆÅ/%iTçL§a' %übB:aQª#ˆkÎÔ!uÕüSÄ·Ö†ê(Ü’ pDcN–päŽ<Ì—%KM¼(çûa c#â±¶Úy<2#1©TåEäݽnð={¯úóüµyæ::ÎÆì´Uq·F¾ø„ŽŠ¨”4ÉðŘ–?Aª€#˜7%¶®1oÆÕGïš›ðycïŒrí»ÆÖ99Æ~ï¯zu:p`»Š(×µŽm7~ޏ»B-Ñ&1ñPJïðñ™×'äî•Ðgîp63ξžµ²¿;‡ ÎÓmXÖà`ÚÃ¥*ž ïg“ÜèHbÍ1RþƒØOïÆ „¯cÄkZíú–•#åÃÊGr3Ǫ‰ô#¢£>Ö8ºê°R­KO½RÃÄZ@æR÷à:]S¦@&/Ák.ƒ,!P"¥“E“0ÛŠºR߯îÂä÷ÌÈ`ÁÔ¥Äm ©xTÑã­XIÞ” ºÓ0ñ™€EC¶BvC‹Ä—ëæø=Œr'rb…É8õRë#™ÉO›Qy ‹>̱*Oy,!Û÷j_ól¤Tòj¼*—}kr@ƒJ=Xš`S„Á |ø[ßKøÀ&¼Ý)-GŽîe÷Êöz­´íÎ338Ô· ¼%Û¾„f[ô7ð8ŸÖDCQ"?V¼ÝôgŽ6°uƒnžMÀ‘åµ°ØÆìL˜«_aQé²óðö ¶û1ˆeµÜúüÃÔ,…訂ÊÜøÁbŠ1‹ pùõ8¨þM?FÕ¸:ŽËÙ!ߦê ß®Z¿‡ÆðvÔ$œƒñ™ÚKÕHââ"¥ˆâ—CïÔYhCÿؘ3$pL1×=–ŒuáÜÄé˜epó°­áúJD­îaØ’2’°¢ ®Jmûp7fJ÷gx¬˜h»Ó£ž ¡‡½‘êÙ%Ü7 ©ºÒûÓ÷E•] çp1î<¿çhÌ9„ó#¾Ào;³4ŸL’ÜbFy)©M_tC'eÌ9L ƒS\ëc¹è¶Bb¡óFÏû§®(Ù©•Ь^òëákôÆ(ç5L¶X0Àá-c¬‡cU½«òËáŒé3f Í+A×Qcz‘ˆ99Ré©J?úvKöJu´Šš¶Ï—²ÿ-çv‚ü‚ ¤@SEMÕ,'ØœAÓ)Õhšîƒ5ôŠjµú+9J8¹vœWÙKY…a}C?nœ°]u“ûš¨W¥{¯¬™¯Ñ‰”Ýi÷jŽ(ÒYÏà´Cn=Sv¦`#1–Í­g$zÏ5ŠF"X)öRcÄomÞ}yV7ɽdÀ9|Ê‘ÜEQüµ2=Âq>ÀWɈá}¯§ÎHo÷¶M§BhÛš 6{‰ŒY^CX̰ÆuÞÆ,°¼§EŸ÷Úð¬ë¢Lƒð·ºÐìuok»mà÷JCâ;³D-'Fl†Gƒ‘f.b¦Â¢Ûz2oQ徘K·ÁÑ]HÙGw¼R–:Wr3,°!æ]<Ž+cç]ˆ×Oçײ¸S"€(uå "võ$LW¸  .4’-^¯ ÇêÇ ‰„G¼÷ƒG"–¨Ç—t…ØáI ¹¤ï)U:—(”LÙD!ƒËûìR§±K¯Š]ª¹V€[Åà‘¨R­XÒÃ4ªT+uåÅ׈^§ J+yâ†heÜ"Ң̗t&tè-¢Ü³#K7’¼sÔâÀtIuÆ:h£<ƒK yå™»ƒNÚ¥µ”r7Ý›U»Mê[àYœ5›Ã®Ž¤%û*µ–B™a-µØysë¼Éœ{˜‚¥^ËÑ3kÛ¥CdéP,²ƒ1NpbÌÏø¦p3³¦<3S„v“þ’¨ti;ϼ‚2)æz”°£·~Œ1™Ô‚y\Çpj±Ôcuix¨•*F÷ÀØ/T±rÆ~‰Vf‰x£ö.Æ=öá2y6IhAeõ(Ÿ¬/ï¢rCµÈ°~¼7_¯ãŒÇè{æ™”¥¡÷Äç=1r¨Åî9Þ<§ïžã¨VA}Ýyfë<³{tßךž~]{=åJ7ïæqw*·'Â[« ŸðvÖ7™ÜŽîa÷hµ°’‹òS·©ïñ{Æ´÷Œ©[Œ6£Ü°¾T‹JóÅ¢ Ù„µàÝù­ðNcù­Ö—X‡y…NêÞ)SÊzÞOÚ»wêNϹE¾{t7Ï3»wê½q­ì|Ê+{§š‚bº°Ý1™˜mÈîfeoÓwUE(ÕÛ^2癀8•˜ŒT¦n—çÎx°´W2M—ª³ÕdòÝZ¹,%ítɳn‡¥î åt4P=¼trÅâËKZ,g°l½ûž¼QŠ˜)Ógµô/,„,oÖ4Ÿ}ÏÕì‚·%*¤îí«hGãÈE¢nækî†å‡¢ìC/H€íÀdß÷[Ë•ë3*¶‡]´t–û°hM1¼vŒžÓ8iãJ´y VE²µ†«f:=âÎ9ŸÑ{ftÅp€Û>ØÀE¿¡  ZÁ=•Z…§ë| Ñr ÷ÔÀôC€Ê!$¦[ÈŽ¾­Ó«ù=´oË"gÀ>.Q4lˆÀSH–’²oænO^¸P$Íà”}ŸqŽD¢ô@îÆxißAŽG3 ¦±™ ½¹.àQ]ÎÚ÷a…¤|Àp´Rñ¢Â÷cÄzLjtÛšNñœbúsì hÒk}«o¦¶—KRêÒkП/Š3ÕôÖ«1ýšíç…P½]{iŽå¹Œ Ðq×d¨† Ž¸V2XnãXãÀ[M|ÝÓ˜c‚Ã;0]ýx‰äEëYÙ¡“Œª¾xbòqçO¯˜eÔ¶¢ò-”×ïXϨ(.·¼>BÈ16k¿™»¦3âØY1ðÉ1>nDÍh ¯yG^G±NosŽš^;m¯¦]§Ìõ>:eÇìFVÊ ¹0w7±kç˜Ã#®ªîXA­6k?L5UÆ¥Nåš9ÇÌÝ9³žñØMß vбM¬MàZL^o;0 ³áýl’1½¥q?¡4å(ä8ÁÇ7ŠñýÌ^ï1³9¸Ö/ý3µ<°¬Á#„>tà;Øp¥6:¾!DÌæ¨Øáí497­…•g‹'áª#Œõ²M-‘õñU7]B·±è?™;q;gÌ䌔1“g*a"óL2wwžñ¦MÖÇ\Tž1]5¿g ‡ñZ!ƒéïâ°¤¡$eú®8öÃÔO`ö㵗΂3ƒ§ÓS;05‘ém°LóJ‰Ž÷``üøÍŠeäÁ˜? ޼µ]%›X6 S“²"ÉÁ¤­]\™êPG϶$¼¤U%"S,¥¦Ø¤mÍû£XS3u›CK¿–QVÑ9{›©û5¸Î–nÞLàÝÅÂÖ÷³:Níé—ŒX[ö•—+T»ìó-ûR‘óìe¯V ö[aÒßEƒqn¹¥e,­°gÔ¯«pEÒIý ë¯ì¥—šOc¿0!¶¼Y§J¨c.L½ÂL^:62ûVi³n{#©¯áhy”ç 9Ó1io9Éca]!׬—,»ñ5–]zkm_ÚÚv בÎÖÖb¸.)‡‹íÖlÍ(œlŒ³òolCàÙà3­³¶n¯dËÜéçzÅÝÊÑ»$LÇÆ$€É“€¨±·iñz˜1¢¬ÜÑjÇ[Àè,—#ÀæêØ2ï4L(¼íW&ò¨„zÊžÿÌ;ÙG endstream endobj 5219 0 obj 3927 endobj 5223 0 obj [291 /XYZ 38.2500000 233.750000 0] endobj 5224 0 obj [291 /XYZ 31.5000000 268.250000 0] endobj 5225 0 obj [291 /XYZ 38.2500000 233.750000 0] endobj 5226 0 obj [291 /XYZ 32.2500000 266.750000 0] endobj 5227 0 obj << /Type /Annot /Subtype /Link /Rect [57.7500000 275.750000 151.500000 282.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain) >> >> endobj 5222 0 obj << /Type /Page /Parent 2 0 R /Contents 5228 0 R /Resources 5230 0 R /Annots 5231 0 R /MediaBox [0 0 595 842] >> endobj 5230 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5231 0 obj [ 5227 0 R ] endobj 5228 0 obj << /Length 5229 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsËâK”€ €íñÈ!ÀÀrXäx³ ëE&{Èßz$õÎHú(éS‘RÏ(F2Ó"‹ÅzW±øþÏ_þqþ×oç÷Ÿ¾üçü­ýùéË)ϼ˛ÿœ/Þ=ÿ ]fíïg_ºó·ï§ÇóãéáôPÿïã©ùà˧¿Ö¿ýï¬Ï©ÿûóù‡¿×ùcû.ÿàûÉ+_ÿüåégåUý[~ýyùûŸþö‡ó¯—»åZ`^þÿwºÔ®P0&–~UY¡]b3’{4¢? eá7𸦀#˜f?Ÿ¿ÖG‹Îu¸* ,Â} cñq;ǯ·kð›ˆJí.p¥•î0O0‚åÃg8rOŒÀu>{â„”ôŽÜÁu „ @@Ì–CºÌÕòý(È3-vÒP¬Q+tP€ú ¼ àÎf0wÃNÊ÷n§b,ÂÝpñ‹yX–æØv޵wÂ뺃Z,ÖNê ,ܰ“s4ºóOd­ÊÊÀ#X+C ¬ƒgcl0f6l1@¨¸Æ³áìå„„±Cp:CU˜v;e,TÂo–vP¦°ƒi”v­U›F>Y7Í‹mOÿÛêŒ ˆÍŸÄæ=0•Êœ-Jï(,³²ÊŸ í›ËFõcºeæ|Ó"wl¶†±lfM“û}Ä¢‘Öà›Mц\Ë9ÿƒdú“À}©†8•ÉŒ.•v³F0H³vþŽñ¾ˆ#ų1Û† ’NàÔ™áºS™µŸ=à…á6Z£`%eb\`ŤÃ@Ð'7†K[¥2†%8 é9…g$L[1¥°4ý[½9Uõô›.áÞ0‰3ôgk #6™NÄ;Å:ž¼2’³ÙÏéÌPëLw&0°.ëhàÐ1ã8áÔTž0Ø`}—:q80ƒM\ŒE&(‡O 'C±‹‡!Àî4óqò†:{Æe%‚™ºŸ»ÓØe% ÀŽ“… ¬@†½ ¦f§ø´ ؈a7™ ·Å3Ž:ÞÏMr#¦·}„}m¥&)6patÁLÈ'epÊ©«ìÛ³>Û< %«›nS"`=³ýù¤”¿R)!+¶ìo¦¤;Ô‚”äUõ4:áªfM”º°œèª­ßìãB­w~.¤iàñk"0ÇÕõ˜¯Ü\H“ÀSª5Þíqý>Ê™³~i ukü£¹À$~½z OšU«5–éq©œÇ|•_³áX;@η؆Æü„gÃÕsØÛ…œf‰u0ß@ŠÅP[ 5>…"!UèÔvûq!{7ÁúIÂ\à{ˆyFò¸Žànl…aN È1‚»)ùâRE±Æ;]¬À|馹SO:+®¨)25ZcTZÔ„6i&¥E»ÆO¤,\…s 8ÿFÝ1™ÂüØlø¶öT™ul³/Žl‘ËÔ>¹NI#Uç÷b+7¥¼R*y¦äCÂÝ™«O±‡lD¡Ükvû*ƒÝ4‚IsZþÚ‚‡¨Ä Œ`©¿!r Ê2Ü$•¸ÝHµ ÚœÆdÒ2íËRµá·ve[‘½wû°”Te×ìAôˆ¨®ò`âzZo äÚC ¥ΩáÒCT 95ɇ"«ÈálŒeEáÈ@¥jºÌXŠÙD÷ÃHHƆ”=m&ã)+U™zFvâ¨oRÙégø‡ìäd'eÅØÁ³p>-•e…­Xìe‹> EYå©,8œeÀ²“ñWw‘ÍÐe5I‡—B‰¸é(¡ó¶^˜JO"¢+0SÊ “—“gÈ q¹AøPC˜þ™ªD&/vȧtò‰¸›ÂDΙû9I%—ö“T!œ¥¥Ë@–¢<ˆ–`n"ü.Cä#‘sY‰"Z÷rH»„±$Ñ8ü>¼8c‹É³?dZ;„L;"ôG„>åiï9B½ÒÛЛ¢«ô–ª‰¨Ü÷Ęþ‡õ’°Ê‰èJ ›=KQyP]-¬î б'á:‡Ã_ZغçÇÛÕØ³„÷R@Ïêù¢¿†ÚÇޚïÐ}€#Ìs¡ ‡¨<+¼z‰Â;„Ü–GÞP5x6GÏxâ‡#ñ3žð1½Àk)šySö‰GæñLæ1Ë/bœŠ<æXx0 ~ÛT–@ˆ×0G:K'5<¾¼à5æÁƒ¬wØŠùè¶Ñ=ùIÉÂÁî1`rÂ#–`biÄ AÇÔ«å2Sr`‰>m0–1Àù|Žeèo‰ì`&‰¬04~fã~U‹ ÿWÏœøEç€,ðIÄå–RD}Wé¾Ã`ûóuú@&ïMË ,G[Ïz–*kÃuZWÛdù‚§áá:˜ ë0O”c˜ðBÂ^T:Nš›cçÓ…i†¾?&t,Ÿùum\bÄ©¦´ „  -Â(fi £XÆBþQ›¹˜û1.x­Ó'kU”©âðKt%[øÞôýlMº@9Ä/f”DÂÚ`ÜŒrUŸ¨ˆÓ/ƒù†©9QbýsYk[ôqH 8׿fØkï‡ï˜<¤&àSûVv¶úe¢ô”™G"3™”¬Z¦?_ùRZŸá qIZççsýCå©6Óf„oG±«l&¢‡xÚ,þ!ÎB$B<ö!Jö5-:1Nj‹1Â: $qÊŽ,qLEb;äŠlñl Cx<©Ü*JD®"I¤O(ÆÛÀrz¾Ýcîà$‰Š9ˆ0.CÄopÜJÔ@IÑPb]$§¢¨®Ú ­lU‹@%…†¡þ8ß`jºIÀÞö¿kM%‹M¼‘(|*Á÷mÃ@/Œ­{¬EXŽÌxï3çæ´ëé;™»„OhÇê'æ7—@¯%JpÛG¿¨ÿO)¯Ž‰ŠÖ‹RU,¢U²”WKÍ (S6;ÌdE³"RnËk*·ª§>Û{cñê[Ò* ïÊr¨ð]-"Àxãjl~r€ ˜X#ŽeS_ X%*•Rd=å5%ˆ»ùr¹²E*S³=múù®Ô‹]53 jÁýäªâ~ݡ̔¨IB|ÃÎêüФJé*Ú^VC^®Yò‰#«ìòù÷“1ùó¿øåô% ûâÍ /Ås§ Ùê›öÓZ?C¤©†¶£ÞDãK8]¼\òby4»íÙÈH»×"kãϾ±ð› }Óâgl¤!­VQÛ²AÙlpé§€³ÝCØà:ø›6c6A#ª|V•ýo4œ ƒ±óB'²¤œïž„‰“Óýë'²d^’:Ý_—܆%²"nr1%Œ<Æ.ã*d*Ð'н¨b‡TW¯kF"Ó‹§_pïŠr¨û7qV*à @ºÀvTÀÂ’í;ÄBÆÏ1溧‘ŠËÙ‚¸ ܈¢díæy'áÒ~Âën`IÀ„@‰ÞZ±Â”Rc±ÂX@²eÞóËò%Ãeª½Wß\«/”z¹¤Ê³Aè«D#íÙ¹Lb#vù7mfuì› }ÓµcÕÂ6ˆ¤2Wõ‚bwh¤}²Ègþ1Øî—C­®Èè9P·Œí'z¿ß6(VØ®NãŠEŠíÙœŒ\{ñf"k»)܈ÛÇ´ýn——R`ç{ÚÀÞ9Ô‹v¸g<ó.ü&°øõ’Þîö_/À¯„^—€ßàó ôCÂßàîJ¸S>¸ŽÆï ˆ½Û|µyÎg¼D\´ÔÃ0ºŠpí†&/¯ÃÀ.ˆCÆMlÖ,ŠŠ£à3f‚eL%´l«Îi¨ˆÜ]}K;ñ]ø†@Yõ…—ƒ*›7ð\XÔÈZÙ'‘WZ34Y¹{cîų́ }á‡ÃÞ6µ*eü|rå æ"“B×Ésà2øU²·M$Ú9£7» FÓ5‘¹±Y+¥ÄO@%\Õ$N…_ªhQ¢„êDœP€œd;Cô‘2ùl\d±îu<¬ìk—8_zdÞèLÐ…¹êa*ðlÁž‹è™P¬hÐy­-Âv!êÕŠ·±âJV§ú’õ•:ú‹ö€`—R¿°¾¯ÙÎ4B|+æ;¸¹ê«ÅÛiç½$. 8‰–¨ŽS&þ%Û’i!jQQG¹ùåÛ|î‰y{×ãPÌNP2Í&t3ÃvªÆs"µ.Ìí \̃[m¨%•ªL? CÈ“@,"n72Ù~[ÌÖ—\)“íÎ4ÈYOÇ ¥-õO‚,¯=®˜ŽÞ¢m7˜+„؊dzÅ9ïEvJíGB¡±õØ¡oÆ “hpÃð SHÚ¸ã[|“<óV¿ÜâZ@#ßXËæU¨qäׄB¨¨Ù0v0Ô°ºr²Z4 ]–Wxpþ{ǸÂ'¬a¤ÏÂè ®!ÆÑN Åeêtq ÄN AJª®a6\‰=5’ÒÒø(²8ÀAÇÈ1òGÒð³ëºŠ%ãgü q8“†-\‰0õêó²¬Ö¢8cÇTI`½‡u¿¨ '¼|†È²£Ø–ŸÂh¬ì ÐË‘åBÀg¹‚Á´ŒýEÞ¢\<Ó6ï“„›*£o€›nºï XYŠõÓvÖáQ#ÇÈmxTUÙ+™ÚУzCVÛáéL{:)èßçÚÇÁâáÏsÆíÛfõŸócM´Aš~˜ú3* ÊÑî/Êd¹º”U=uîoöÚÐÕXz·ÛdYÉ®3ÝôÌpt1iñ£Gúù7ŒUGÜ¡uÌTÌl÷íN‡•yœ­­²î3®&k¢¯áôŽX´ …gƒß´ê[-Úú³$ Kp—ßkˆ;Èá3 › `И áâÓS°Ð¾ë7‚UÛA%cµû&k%Ì> endobj 5237 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 5238 0 obj [ ] endobj 5235 0 obj << /Length 5236 0 R /Filter /FlateDecode >> stream xœí]ÝoÛ6÷_¡çUĉ0 hÓdÀ °‡aCºn(ÖbYöïO¶(§‘ô£¬3ÉÈÒÕhíúLòxß<©«ïÏþüš]]ßÿ“=º÷ëû]‘›²hÿdû×›o¿6wŸ3cËìñóî){ÚÝívmƒû럛Oÿe2û©ùû)ûõ·æËîGû|Þaš÷¿ïµÍ§âø¾ÿþ¯Ý/ße_ö=vÃ9d^þÿ´ªTrÆÄÐO»nšâðúúøewÕ`Þ(eeŠJgB«æŸZËìß?v›ºî‹¼ÖB˜J›âœŒlFj†ª3!ë¦'+ì`¤Ã+Pÿá;·¥¬¢uÞbž,BUb¢ûÜVÒ貨-ü|Ù*cZ²•&S޽Çà¸Q*^çÌCÅñwP›íÞ`¶äièúÇî#t^‹˜r³Ç<8U:Þz¿›Ó FÅëqž< ß=ì®n… 1«ìácƒÜaÌöí¡!J™½Ù»c³‡Ù÷ JåÙç]W²ìPœ‚ !5ìí=„à6r>DT°Í5a>ï`o7")óÁã@¬å[Â|Ì|ºyæs;Ÿ:x>ž6˜n7HQaa›róШql {èaÔR@L‹­è™„rY`na ðL±Î@¬ä–X…±ÆRÛx4kn£ÜÆVˆ€›Gv6÷†±¦èœÂ²s‘Ú¨ (¨§ªNh!UÉ’-$[ÈS©ÔB ¨%B.SçoгVÚΆl’FŸk™ZŸaYmÈsCêx¼Î.À8MâÌ£8–D.¥š–>Š\²Œ]„ŒÍ³5œGìòˆit³²q¨8• ¤éš°Îð´¡äh ” ÇÑXŸ1Ú ¬µ ¯g0·¡„`ÙÁ<ÕKìɰCþx,–^Ìm‚MSXÓ1OqV†ñàµ$åJTÝžG>=ãÁK<L7nxÏ|°TáØa…ñ†ÒzS ­8v Æ„ ¬é˜s¤Ú… {ðûJÄ- „„Í!K(ëM±Äxçsg¾/:~Jc;+uþì’`ª %žSxv ŽXÖVëŘ·ÍÂ#0­êÉUK*ŠpÞ ´õè a¯ž+@–°‚§Ôp45i™Ô‰)¶:‹×P›ðz·a{Ë•plñL±TáØÊÛ[º½-EWuËÕf aHDH}VÇLþ‚«Í¶SÇïÙÑ'x{Þ™óòt…y¡ÒÈÍie_l;Ôá¼C =«D7*Þ¯¥X8Š% |æ‡u†dQ(Y ŒõڤʳãŒþ<¬1­ñî<–DB…’i »ãàá6!cÏr†g‘õù³KƒiÕåÞ9ĆD„¤Ñg§~;U.è¢oàHÂa#ãdû6Ç­yò줇վÀš*†ÛŽÎxêÖWvNn;¹“‹^áAž ³Å´fÿZ.yÇËÛfáÞÞ*ËR~‚G »¶6ºñ.YÝ4]F!UmûÀÐÖÁ3ÊzË¡6Öãk1Ý0„•…gÓC ¼aº­îl)®GÇÕíx¦ÅçÆ±ì`ݺ#é©nÇiPx$‘À¹Ë<ÏMâÅ^¿úL)<õœï]°Ç d‚(ûöaO?“*<ƒÞã© È–Qìƒ)'À)Ùœå%ØQJ6S'™n¯?¯žEÁÙd^yfíÏ(+Ϻ<vI0­Uœû»y½ë;—›Gé3â yY›TðÙaßL_ÿìðÚž¢Á6š3ïQìº-d¤'8.¥"’! Y$>ëäµö¸Í:Ÿý”†6ÒýëäÉ<pmÊÊ+¤ŠCÅ u¶ÛÑ ®¦ÝR®âV:ctÕ´VTqî/ÞŽEášÙbž»®7'ˤ§'l†:œ…‹¡gR™I‡}NÊv$–TËJáBØgžP*“pìŒ+8(7±\f½(Û'º}2œŠ!s…A+cJtY"^µs…¦\a@“DŒõv,1¯`¢Xo3pCr6$>Ûã킯^GP⨲Ôè„g¾½mÂ>íû@HÑ ­2(·Ó†½Õ—rVwm7ëtÖ[KÃRž\ÊùùËæ¯ü¢Ø]?»4˜ÚîVÓµùŠåY øÉÅž@¢5eoç÷Ø–“-dY¨ógS›‰z MYµhVš.m-мlÑyD‹ Í2—U zn£ç·Á8ekãpS¹Ö”C%"/kõ"nÄØyhBoƒ*·u±‡=ÓMB¬+ˆD㸫~ª\‰VÂNÀM+­†èâ zUÑÕŠº Õ™ªåbŸ½*/uõ’½âlºÎõ€CÚŽê11„67ŽUJZ1ƪ±6aÇq¢7Ö¤‹.ìó(žîñ4ðÀ%d˜í£4{HjÙ^Ÿ X±¸áÞ Ö.„ÄAU(:àm1€ôs¾j¬ÍU‚"n¢sxNâŸ! ¶ÁV4¨* 8è<ú,n/ë2ƒ˜‚.ͽYYÔ=w¶z¶bæyÔ›¼›`Q¹ix0Î¥=wz\Pëþ|¡Ö»Š³“~*ûÊQõ¿P0lÐh¾ƒd­aôþc¶Ý 8=‚=Ä-¾†!û¼;Ý–{Tàj± ¤ØжŒœ)DÁ~zŠnq××VÚž4P®ˆõ¨„[ñ\¬G¤e>ÌR¥= *Jél°¢ä)„°ºoÔüt±QŒâô0f›hþRÍpÕS&®é²P’ÝÈ¢ÜÆï˜1­ÙYÌ6VÊšžÁö‡¦RßeWT„³WCI(QRÒýµ”¼í¯v_='9éÇV¬Ðñx6Ë!R†2ER8ç(9#ŠÄiÞÕZ–8»ã¤qææµÒY–N¥™’QÑs=óÊJRïÄÅ=|ð“TÊE¢a¦ HeÁ—!â£äPÞ0nÉB}Jaå‚ ‹`AMþM”ÿ’‰#›0ž‡ƒPw‚ˆÅõãÐlÆ~"Ç6#¼MÛxä "e݇ÙOÀšDƒDΨ3«I¬„õßp«™²úš!KxÑ!$¥Lx˜ËŠé+ú="Ñåñ9øÁ£„ÒsÒ¥8”«“1Ö‰ŽÈâà ã¶²xÅsùe@à¦5åЀ犞2¡u(¿š·r$héâ¾°ÒG°É³Ä8d’FújýRæù&’ŒQÆa?Ã~†ýÌT ÖÝm0Q gT¯mÇe˜-§ 4X Î8—âpƒ'õ>è$h¢Ás¤ Îk¸%tO” ëSISšÕ¼²§F‰½:~7õƒŒ€-9hª{-ÌäÑÛ·ª6–Yh'oF¦ØZE™ËöÐã šª†wøUæÕà|'.!{ÆQXq¯!n·n¦¨Ö«´îkDzÝaÇÁLŽuo&drd÷Û8i³¦þMðI¸ýçâX‹ç¾ŽéÙÛù" 1°@ÁÅܰ‚³;ü =KÉIRb •; sš¸(89w¡¹³µSv6»Ûýð<ŒK endstream endobj 5236 0 obj 2635 endobj 5240 0 obj [293 /XYZ 38.2500000 631.250000 0] endobj 5241 0 obj [293 /XYZ 38.2500000 631.250000 0] endobj 5239 0 obj << /Type /Page /Parent 2 0 R /Contents 5242 0 R /Resources 5244 0 R /Annots 5245 0 R /MediaBox [0 0 595 842] >> endobj 5244 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 5245 0 obj [ ] endobj 5242 0 obj << /Length 5243 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯Ð9€Ûâ—(ÁöØC€È!È!ðî&Xd™ì!?ênöÌXݯÔz¢Øl5ר¯i‘Åb±êÕÉ÷úúꟿWï¾þ§ú~>|ÝÔ[ïêÃ?Õî×»· Ûmø}å[W}ûuó\=o7ýŸ7‡¾>ü¥ÿÝÿ*]ý¹ÿ÷—êoïÿðÇð—vá×W¾ÿùïýÏΫþwõËÏÝŸÿkó×?T¿íz<ˆùþÿßéÖºÚìÈúysœ¦ÚÿúýÛo›÷LÅ5]]7•²ÆVª³ºúïO›ŸûŽÝ×ÛÎ*åëë9yý2’îúžzÞ ÚÿŠÔý÷ØJÀ™*ÆæÀÞ0˜j…÷”LµýHØ›Ð~x?º3â¶[G ºë'Œ½,´2}»6{}퉶뚢ín\ÛÅêÄõ?І)¸I ‰ñ €úàš QD¼1²ÐªJ¹¢Uo]«btY´jѪñµ*ö¿‹V=hUcóѪxg0Ò}O,/xMÕiÖÄ™Ôk‚mÁy&Ê*ìaÛ2 mX’˜œÇMæÕj&‚©ÆR…W›¡g…dÏ:°™m½ß̺n¿RÕÛÆ«Ö»“©Ù­5‡ºÏ!£Úá µÛ¶«÷“îî3-Azεà-l½©"Tfkt«ô› ïæÜ7‡µ3[g›OÞ´`ª Ú„™:DA«ö’N›Àg~»àRN!‰áC,–.È}hQê8K&çôY$)zÓÑ,½¯P¦¶íP+DjЯkn4R$æj HøÜÞTp-:ÈWÜò%È,­q÷C¦BɨâÍF‚")(¢‡ ÐÖn0+Œˆ(++-ˆìMdì—(çÄxø8^@yë×ðV'-¸§7”~kFtÏ4Ìò jŒ´à76šŽ÷u£«€c&+Óx7¦ª3-ÕŠÒLÎÙÂÞâVQrMx×5ŽJÀÕŽa¾ûƒwc Ët&nÕ¨&6ÓÑcêqé4)”ìRi$ž¹›úƒ ¸“q‘áŽy*¹ƒs[¶Ö#Ÿ±ZÈk %׈1kÊ +ŒŸ4æ!U¸NŽÁ‚¿‹scŸÚ)u<)ØÍO è ¡zã¹Ð›>…· 7®”pjJê‚ ;ÇM\Ð úÍLÖÀ„H0‡%`÷º…ßD•S˃)˜ÜÀ²„S NgbÁãŒ%Q–UsÆ­JÏûW8à–ükùÔèNÙ‹5z@œ)Ö:8¤ÄÎd³˜Ì"Þä¶ ßÔ—f€—ݧMÝ ÖW‘e#£Óö6¦àËÒïk}9†Áˆ0Š[9q‚Pä6áB´j(æÃ¤¬0àÞ Ôl˜ËqTV)w¸ëâ œÐK¢ï»Æ\¶p§ŽG€¾qݵ¼s̸¸{¬Ï˜í÷1d3Ìï’ ­Õ ‚ÀÓÆöÛ)¨*)ç6Q%c)1m‚¸äïà/_Ul:;¾ˆ" SÃBIrÜÁNŸ€nˆBÓ ÀN€.Q0øÉx×*ªmÒW€ŠHõ‡g–, 5z¨]·¦Æ4Ã1cäß"f™VBÏDÀãœHäm ÉŒ¨pH°pwã ¯$9wR¹ÀD±ë4éÖí>.G€–ÚÕKÛ¯NlÉòQL=Dä!Ì8!˜×\aÉ‹;,\#Ò ×’*kŠ{H¹]ZšZg‡³vЋsðY²sİ…!좠앀'˜ã°1ª@(váz l.!ReLþ!ªWѳmµ«';ÝSú H¬qßÙowØâ¯,lQK˜šÛêÆ ÖÎNÿ&Ésßtè›P™§ôéññÐÒ¹û:Ž6h³5JŸÝºgZjHµZÜ̆¸—õÇ«1^®ô' Õû¥‰—Dꧤ/OtЄj9 ¡ÿÀ”c :œÐºØ!§R¬˜jâ*typ­šÅ«]!¸'LZ‹HúS<ÇvŒÅ×wF.•>ZÓEÌœPÀ÷e Áaâ~ž';­¹3¦ÓÇd ßåA *¡}yj„r~A!`‰r*"U¯Ü‡‹eˆÒ÷'2£ñ@…E˜`ÓS•tM Š}ñV'ÌräÐ=£ÿ¢Þ¶„õD”ì±Mx”Ëiÿ½XÆÊá2G@a¦v¥PeÚQÓ„Ñû5JuQèXKšÙµs®N êç\©=~ 'áìšz™KHñì„Þ°æ ' ‘B§àƒ¹ÌÑ`<ê 1æ(îÐßÌÕGñaÜ!UÉ®I‰{ ~l _±2é‘}ž†1Rê[­GçWß ”fvV͘ƒpÖVÌXJ‰£l®‹š•Ž<ƒ]‰+Éo_iMƒd¥.Û .8£°ÐU¯´¾`?ûntv7Œ}»vÆì"c_|=s *êõk †=ú;£Ä}Ìõ…¯Ëð ®‹kϪ™Ã‚8æÃÌô&ñr*oÛZ扆”èÛ«e¨Í}{3'WÐ7¹ë0–Á3%â ÷ƒp…qˆõј£ ‘´÷kŽ"û.Ÿ(²Á&3‘M"JÉ iAWàØ÷ÕqyÜëD…¸ïÊÚ#›­Zsd³5%²™[QU˜ÌºÄ#’kÄ/m3+˜yŽ¿«çø…¹£³NÏñ #Ç9ñÀžÖ)p¯ã«ÖãFå¨{)®ß HãjÂ0™)ᛨ9qá)Ú«¯Üõëîµ¢ƒòÖ0fJ©o­]ÇÛEÂ]3'’Q°DµÀѸ¬1žq•¸šç6# 9dòýNV‹pûÙé9ÞyA¸ëC¸T”‘áNA‘E.£ÓìÍ•7ŠìgçæÄ“ Š”¨f´¢&hnP*X12VÌá¤W¿ký2“ÂÎ`žíaö3‡ÈJ ç ±ÇûçR1ÕpŸYü(`J¤›qOò\` T™9ÑœÜ='åæDsŠç´>Ï©ä$ÙÉÙ«öqÎ9íƒe‡ñÊ8ª½}꺻”>¢êæÄ,‹(Qs¦Aáêè›ÔckóESú ÚÌò3GßÚΉ‚ô½>ô]òá„ûFC6©Ïh§D¸º+7ë,HÁ±uÖ86œŠ©—©Î.9•{Ë©='S‘2§bš9q«Ü½:Ó¦> W¼:ICeà·”œÊzœ˜6l÷0ߘ[„ÜGPP<Î1ímëÔµÄ)=N«çÌ¡xœÕ9çT ÆL7©ÇÖæ‹¦ô¬›SË}[Ÿúޝ‚¾Emu} Wr*á„ûª!»Ô÷A¤D¸NÍŠ‚„›uN¥àXqœ«ãØWa…^¥×©ïdÊÃßôvV®¥ø›Yû›Â7©ÇŠç¶ˆhלÅlë9ú;²ç†wCÔ3IÌN¥,tÔ÷Ë…o`Û÷5Ä Þz-2º‹û¦6S£s7’ÈÄk¨jæF•Á²“ÒJ¨E³Jiæ`RßÛ"Dð¾(aÏ„ÊHQÿOiy¦>7®mŠ›Ê¸6êúg:¨ ¶3„\3¾~/™ñí 5HÙZFWår®%eqùœï»Í_öf‰;Y…o ı Á+ÅÚŽƒ-¿° Ä %9çTÂàa>ŒFI‰U}êópyÄÛÛnÖˉâÓÔÉšŒãT‚Nb"ñ8B¼´DÌTˆƒ_=sÉœ|¬0q7cÜ;”˜¸~Ü8ˆ!âTEÒÉAªpÙ¢Î\óÁþWõÜOCœåãØ_eCWµçX`”ÙÖÊõV/õÁOp[£[µ#}(™~ëlÓzw*z«Õ¾áDbšÓ–p®QowàÐ+Ø­5ûON<ˆ3ãY:óMØiçhûfê ¯- ìí`©ìpóŸ#V…©ŸL0¨…sÝ{ØbÑ4î ~ÄVMšú±en÷ûúõr´Ïh¬›$ó‹\¼záˆò9ÚZÈUH[‘’3š¹6Û a.'tIеcz¶zÜü®Ø¯ endstream endobj 5243 0 obj 3489 endobj 5247 0 obj [294 /XYZ 38.2500000 497.750000 0] endobj 5248 0 obj [294 /XYZ 38.2500000 187.250000 0] endobj 5249 0 obj [294 /XYZ 38.2500000 497.750000 0] endobj 5250 0 obj [294 /XYZ 38.2500000 187.250000 0] endobj 5246 0 obj << /Type /Page /Parent 2 0 R /Contents 5251 0 R /Resources 5253 0 R /Annots 5254 0 R /MediaBox [0 0 595 842] >> endobj 5253 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5254 0 obj [ ] endobj 5251 0 obj << /Length 5252 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯Ð9€Ûâ‡( ìx<r`x€‚o6Á"»ÈdùûQ¤¤W’žH¶º›kìŽ×´øQ|¬*V«>þñëß³þ–}üôõ?Ù·î积‡üXyûOvúõáû?ÐÕ±û}VVEöí—ÃKörørøÒü÷åÐ~ðõÓŸ›ßý/ÓÙŸšÎþú·æìþÒé/ür(UÙüü÷ëϺTÍïòóÏÓŸÿëð—ße¿žzì‡ë&óþÿ?誰¥=Mcfè—C¿Lõúë·o¿>¶X7JQæµ­2eÍTmuöß~jè»ÏµUªt¶Ì· Tê¬pµ­›AtÝôä¬ôúËSÿÞ;/•2e¨Î»™û'‹2NÍtïo¨s"‘ÖUˆè»±½VÛÞnæÞ©Òî®Ô»ÏÍ}íä•@Í¿è_Ü\WÔ‘ÓR×3UúÍŽûÜܲV-y€DçîÐ_9¯3÷N•~sqï7W[eZ•.ùϽ‡Ø[[U;?ÍÜ7Qº­ÅûÜYgzòè|¬ºm§Ð[ÿþ;7• ǔۙû'K¿»ãéÏ¥ý ÷¿><>>5ZÌI¹Îžjf÷:fûã¹!K‘}8)ûNgÏ?f¿Ïseÿ=ÿ|¨Nýù]½}†-µä¶|‚-õúqLµþ¼RaÖÊç8®4€½áóºRaOa‹-O°¢Š™›°Rˆ7a¥?¬Çh‘HÑš˜µ€|¶!Þ0…¹á]À<CìÅð7˜nx·1®áùpÐîéççFp—9•Š,sò"ÚêÔi\~ sküž:FÚßÝ œ%Ó1a¤ ¦uIOóƨbtÕHÜ×À¹™:"çj.1ø2³÷‘xMOºW.ty`¾±Œ•nÆr,áçZ¢¬N)ÛÓôÑר5Òæí®î‡ìIPºâ• C‘Q«:ßÒAlª¥eËöhMë}ÛžöŠªÌÑèJ5½}ãPoÝ–Nµä°¥e¾æXXW•[g݉ôê­{Ø X˜R5è¾›IXØ)g  d&Ö(0×Âß`~†u'Ø›ž³ M@°SÎÖ±1||Òžá* OmÅkkì]Þ²¯.*üÔ)Y9:3\fªe¯ ë)‡éRõª¯äYUVÓziÈ1+=3’Æ+D]`åŸbÈ}¾ìWãql&<‘!¤WýïòW!J”cZÎ'YÂyQÙΨDÄ1ò{ŸòÌx³)U™ª§£3_ùgiôû!U~lƒ¬Gu¢¥#nqÔ£Èl»þ›î0L}S£oL»UJ]©¦¸±r=u‡œu¢·N§rG£ô¤†6ÑÒIë‰YwÆÍòhF`ëQ5ì ÏM¯ÿF˜µ7#êŒ9³,û!- ð÷, wb]W’±…»éi½v°Û‘Ôsæ<#NªP ~™Ã¬‡ÒŸ†GÚË—ˆ;¿üÞš-Þ¯ejŒ¸têžîLÔëpåLu oÂ-FSg’¸F2 2SÃ2K¸ÖâÓ3‚P¤{ûnRëN3¼;Po­ñ}ö&Ÿyæìͪ<Yé>cÈå£ÿ™Šé~"î‚ׂ1߬Uç‚8޲6˜òLÞDŒ "u>¿Céíáí=wX½©$OQ$Œ%ŒÍblSI‹_{CþßRÅý˜°/F~w¾÷:?,J{oï÷\ÂO˜_pEd Æ1…1D©Ø þ*3 +e0ºw®ZlÉÚyŒùµ/à\ö¸E›˜G3%¦ ÄRÆ÷fж2y.0˜ Îû8µõZ¥SKÚ¤ñ$'i<·«ñ(½ÅNuyŒaˆ-×}GaÐGÌ éO­“þ„¸ë¶#ÞHÚXÒÆ’6v»Ú˜Î¯Ûªoˆ Ÿø¤3Hb¢(`ÒÆ’6†lª›x@<´±¤%m솵±MÕ™óÌÄ/11•¬#ÕCÁrÉMð !éDßå¹%Cq<Ë.NÓ¶ Ï9æ¤s-qVw®:l"äd–Ó‰hSë÷ÇYǼ6ï~FÊ©èùÙš×Ç&~ŸºÍ¾`ÜÁ³5ê½×èI-~K5œ=õŒÙKb`¾P_àR m©ÇïÎhÊ î³¦P—B|ˆG«!Ù¾ª‡|9§gË—"^F2)nÄÖ I›„k™â ¹[¬áJ³P鉰VQ–AÜâ·ÎcÇW™ƒ¿ÁïXñþ0668ÞS¼R EàO36¤BŸ s^îZõMù_Wåðñjô£Ênø½š©UâûHºJeÛÁ„ŒR!&¬d´òš¤í[ò–ŒŠŸªb"¼ý¬ÖÃ1½&[œ4pf[;<´W é†Ì«Ô4`×)—õJ8S&Nì…‡ç¥q+¿…x0OZíÞ YöJ É è°Ë39b‹É¯‰[VFô«ÿR0wZ‘õ²ÙO¹ÞãÇìPÎMñu9bÒ~ýß^\[+Ò©FÈÎ)×|Ò…S`Í'áX#I?öÖ‡Ö43Ú¡©ªFùY& b‚:ÃüT‹C3*HÁq4laª[¸ÒîxLµÀšO] ë pÕ)Hƒ.|ª7¼ °î•P+‹Ø…Ü›)²ºœ2׆ñÚE§¬úF !Ä®Q†©K¡¥BgV@ ®ŸöüvÜ„›Ínâð(2%<…ìÍËÑØZ—+B;¨)ÄÓoaf!~›V½šcÍÓbÜ­É“>ÊdRÇWøHŠYaþLédŒé|„˜‘vȘ¼B<-¸dMÓ[W]ÂW sn ‡A!TWs&´uå“:ËD¤aûÆ'– žöºíÞ3”jÂaÃñCÌ•™Ñ;5„9ÕaCe„°.¦D.–ß˃ª„îšßFu`¿-ÜëÒ™¿Üùù²À%½> endobj 5259 0 obj << /Type /Annot /Subtype /Link /Rect [60 298.250000 99.7500000 305 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn3 >> endobj 5260 0 obj << /Type /Annot /Subtype /Link /Rect [87 290.750000 172.500000 297.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_commandline >> endobj 5261 0 obj << /Type /Annot /Subtype /Link /Rect [87 284 186.750000 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn4 >> endobj 5262 0 obj << /Type /Annot /Subtype /Link /Rect [87 276.500000 163.500000 283.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn5 >> endobj 5263 0 obj << /Type /Annot /Subtype /Link /Rect [87 269.750000 136.500000 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn6 >> endobj 5264 0 obj << /Type /Annot /Subtype /Link /Rect [60 262.250000 142.500000 269 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn7 >> endobj 5265 0 obj << /Type /Annot /Subtype /Link /Rect [87 255.500000 109.500000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn8 >> endobj 5266 0 obj << /Type /Annot /Subtype /Link /Rect [87 248 112.500000 254.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn9 >> endobj 5267 0 obj << /Type /Annot /Subtype /Link /Rect [87 241.250000 129.750000 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn10 >> endobj 5268 0 obj << /Type /Annot /Subtype /Link /Rect [87 233.750000 144.750000 240.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn11 >> endobj 5269 0 obj << /Type /Annot /Subtype /Link /Rect [114 227 221.250000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn13 >> endobj 5270 0 obj << /Type /Annot /Subtype /Link /Rect [87 219.500000 108.750000 226.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn12 >> endobj 5271 0 obj << /Type /Annot /Subtype /Link /Rect [87 212.750000 114 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_structures >> endobj 5272 0 obj << /Type /Annot /Subtype /Link /Rect [87 205.250000 119.250000 212 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn14 >> endobj 5273 0 obj << /Type /Annot /Subtype /Link /Rect [87 198.500000 129 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn15 >> endobj 5274 0 obj << /Type /Annot /Subtype /Link /Rect [87 191 192 197.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn16 >> endobj 5275 0 obj << /Type /Annot /Subtype /Link /Rect [87 184.250000 154.500000 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn17 >> endobj 5276 0 obj << /Type /Annot /Subtype /Link /Rect [87 176.750000 125.250000 183.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn18 >> endobj 5277 0 obj << /Type /Annot /Subtype /Link /Rect [87 170 165.750000 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn19 >> endobj 5278 0 obj << /Type /Annot /Subtype /Link /Rect [87 162.500000 186.750000 169.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn20 >> endobj 5279 0 obj << /Type /Annot /Subtype /Link /Rect [87 155.750000 125.250000 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn21 >> endobj 5280 0 obj << /Type /Annot /Subtype /Link /Rect [87 148.250000 139.500000 155 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn22 >> endobj 5281 0 obj << /Type /Annot /Subtype /Link /Rect [87 141.500000 129 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn23 >> endobj 5282 0 obj << /Type /Annot /Subtype /Link /Rect [87 134 121.500000 140.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_namespaces >> endobj 5283 0 obj << /Type /Annot /Subtype /Link /Rect [114 127.250000 162.750000 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn27 >> endobj 5284 0 obj << /Type /Annot /Subtype /Link /Rect [114 119.750000 132.750000 126.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn29 >> endobj 5285 0 obj << /Type /Annot /Subtype /Link /Rect [114 113 143.250000 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn30 >> endobj 5286 0 obj << /Type /Annot /Subtype /Link /Rect [60 105.500000 87.7500000 112.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn24 >> endobj 5287 0 obj << /Type /Annot /Subtype /Link /Rect [87 98.7500000 139.500000 105.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn25 >> endobj 5288 0 obj << /Type /Annot /Subtype /Link /Rect [87 91.2500000 129.750000 98 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn26 >> endobj 5289 0 obj << /Type /Annot /Subtype /Link /Rect [87 84.5000000 144.750000 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemap_arrays >> endobj 5290 0 obj << /Type /Annot /Subtype /Link /Rect [87 77 192.750000 83.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_ptr_ptr_functions >> endobj 5291 0 obj << /Type /Annot /Subtype /Link /Rect [60 70.2500000 105.750000 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_writing_typemaps >> endobj 5292 0 obj << /Type /Annot /Subtype /Link /Rect [87 62.7500000 151.500000 69.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_write >> endobj 5255 0 obj << /Type /Page /Parent 2 0 R /Contents 5293 0 R /Resources 5295 0 R /Annots 5296 0 R /MediaBox [0 0 595 842] >> endobj 5295 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5296 0 obj [ 5258 0 R 5259 0 R 5260 0 R 5261 0 R 5262 0 R 5263 0 R 5264 0 R 5265 0 R 5266 0 R 5267 0 R 5268 0 R 5269 0 R 5270 0 R 5271 0 R 5272 0 R 5273 0 R 5274 0 R 5275 0 R 5276 0 R 5277 0 R 5278 0 R 5279 0 R 5280 0 R 5281 0 R 5282 0 R 5283 0 R 5284 0 R 5285 0 R 5286 0 R 5287 0 R 5288 0 R 5289 0 R 5290 0 R 5291 0 R 5292 0 R ] endobj 5293 0 obj << /Length 5294 0 R /Filter /FlateDecode >> stream xœí=ɮ丑÷ü t6—à"`0€ki> P¨æ`ÌaPm»at7\öa~´’¸SÒK)+YÝ"(26FC?þéóÿ6ÿwóãûÏÿl¾ºßï?_ØÕ(6þkúŸ– Â^Ýß±ªùúÛå[óíòéò©ûÿ·ËøÀç÷ÿÕýõhþÜý÷æ/ÿÓ5þì:õ~»nºß¿¿[û¿Øô»oÿåòßh~ï!ztn0áõÂj€a7P»ø×äÃÏ¿¿þ~ùqœ€û°(#lËÞ‚hþõ×Ëß:<»¶À¹Ñ`ØDFô˜´´ =:ÁRLÃÏNð÷.­lß ø8òý§…KÍo€ßq}¥m¹›"õË»¿?p`í¿í´›î<+nu л'y«™±€þMÄm‡9SZà¶9sºZoŽY†¹_æGN5¡2˜?݃:ÌYŠ¥ 4©ÜÄFÃär)‘™ÜMü 2°˜>6OŸpÓÇÙ84Ù,*;cåó“¬YwëÍÖ,†}¢5ë.Öl¸zž5{>ËÃ9¬_ºõjý Ÿc±Ùõ<ætÞ¸jîêíŸØùÑÌN°´Úï¾\~ü©3U:“V7_þÖiðaÇ__:ÓT5?t{ƒ–Aóåçæ?ãðŸÍ—\Ú«ÊOù­;Ì¢wzç=vG´è3}æØ‰>ƒ€ëûßG¼#àAçSƆ>S¸C5mW:`(àóÆp:øx?] ÌýÏHßôã—Nü½9§ ¹Ó%'¬ý‰©¢@˹Qà&‰Ÿq)DxÓ¼¡<Ã>Üÿ>8U ô}ðgJ‰œÝçxJ”è’žÂWŸk|åp®Çu5>£(4ÎàI¡ÐPÅçúÔ‚Ê\çd/*«(– n³áT…¯6G©p 9»Þ±EïRdôO÷¯pA¬Ë4|Çk tÞ$ú>¸]T ‚ìä;…¸´{J—»§øÂÊátM°‚ ´ƒïÅQh”e]P°¶q½»ë*ä íxy@YÓº‡+ŽíÄòíø=…ÞЇ"ùðQV›`Ñæ × ”•{ {;\ó vø÷æuÀwZJBíc’?×ȸÚÕΫº­í…tÛ9ä“]a•ïjÛí»³?>Bvj~>Þ»ÛOò$á¾Ü‚UqbZðÜämõn<λñ:^UÊì”ç q“èݶݢwqZÆ¥e÷KÉ!XØ…;hæé™ãõá‰5˾Þ~‰®.í ’×¨…Q°ñgjL¸D!øØP<‚°ç”íQw{SÈ)´«ì†¾A»üûR:¿JBíÁ‚~JJÚWW㥰ÿÀe Å[êCœg c#ì wðìt]­SÒ3”]SƒwÕÈ…½8¾ <œç ÚèzJš zªî?J£®–|i®«…ý¬vÉ·V-Ú']¹jKm©sèw¥«~ŸŸ©ÙUS>RÞžCt¿é2`ßùÅg‘äiÀ}ÿõt=]mÕ[¹ÊÛì…x»0jBÎù-à!؆”7%-Æã¨é$öJ»¥6 î &e¬òª?Î ÎAË}%©j{WýüŠúyß DŒðLµ!+VòmHnVXЏ À£°„ÌÞ‚ÍE eJ½©‚æ'd¨â!Š*øaðü]õ8JlK&_=ŸY[=ŸYëÇQ­ËZ?®f•)„R?îAºúäÕÛ¤[ò_çœá dt­Þö¤F=ß\‚V«·óajõ¶ºƒ:…|;~U«·•ž©ÕÛJ”x;jþî♚¿[u[Õmg’OzKnqÍ_?9?ïݨÕÛjõ¶"ÿ¼Žwãu¼ªµzÛM½k·äÈÖ3ÄgŽ×‡'Ö,µz[ÈÞ Z½­î8ÊÖé)´«d[¾ZÏœ’jõ6⹎Z½íI­ÓZ½mož;{õ6)¶œ.«ûÒ¨«%_šëja?«]T+b¼ÒÊU[ŠhKC¿Cývß♚ýQ5å#åí9d€¾Í鵂Ĺ©¼žÎ¯¶jµUoʪÊÛ/ÄÛµò+x+Ÿ·ò†4[¾+X«·UýqZ¾åtµ½Kxª~>9îZ½ бÕêm•F« YmÈ@ïªM_,صzÛ xS¹1ÒÉBÜŽÀy“R×êß Ý’ýWÏt鿞é¬ç Êi­øV³’ÊB©øö”:ôìõãß’™ø:'O ñký¸'µWê ë´Z?Ž˜‘SëÇÕýØ)äÛñû±Z?®ôL­W¢Ä“Øá²f/ž©ÄU·UÝv&ù¤VX優¤S¥ª DÙó“ά¿ŒÅÑòc(VoÉo“ï8R»åËE5ã‰F¥5›äY³IöÍxÂuFaÏ€[ÕøûàëCÈ@)p=Îs¢ªš)Vyû v5Sì‰3Å4Ûôª©ØRɟ⟸ékxÌ{æ á´—µÞRSµÖ?'ƛά5ŽÎ×úçµþy‘^':ÿBþ¬Zÿü–®¶[r´kÍôâZ3ýIkÖšéß_Ns­™^Z…ºK9‹F6lKÆw­³þ¬ÔWë¬㑵Îú“Z´µÎúÞ‡ÜP›ê£Ö¬ì'匚¹Ymâjß”U•·_ˆ·kV6+xRŸ7+Û˜GŸ<«uã«Î9ý·Ïr*Ár½;ÖA lDix¸Œp…nW.0 wÞcwœ¸äüª@ÛîæüÌÈLöj[6Ìö¼ ½3ŸôÀ’…Ë<ƒM¢xËÜ µcM»<å5\Þ̤0C€†.²“¥;M—‹åF€¾üèZ4 3ÊQ<æàèŒ:ÖLLðñq‚©þ0ξEöuÒ½\9£Ç¬=øäîGÿjõ–¶G¥JÔ­sñÎËláPñòÈè†ÿpË# êÖnIÀ)l™(E ðgRºê–"â#Àñ<%?×ã‚%h*üZ¹±ºí«íqSVQ¸qW«än>èñn°J(%-)ëˆËhÂþ¹P„‰r°žRÞ—v”`Îs~ø ŸBi/I(!S‹q‚BžSœCzsŸˆµ_èÃ6RäPÚ#gSÑ‚#7WÓ†îXg3fî0Ü)>Zº‚_åèø×Z²«èìa±„&Qhãêð·VŒÀ9‘3£v± Þ¦ŽçØè3P`ڛļ8yâfí®ìFÑø,jOÛFüKÛïlº F.p)HØïÈ™°çÛ0¶õÒV(',»?— «¥­4‘´•6'mÅbX*ma¯Œ¿4‘´•:'m¥ŠÑt-‰´zAB4‡JÛ)S¬JÛ¢øÀŸAÅG’þI2v)ž•ÄØÅGƒÇWßO²Á™¸SŒx£M³eÃj1¢t$F”ɉÕÆü=¸#)Ð÷rbƒñ—:#JåĈ‚ ¤bdè!Ñ*F¦ÔOW%('F’Ôúquʇ„ã ­ú=1—–Ž7m)|(YµlXM•RDT)eŽ*÷‡tú^Žê<)"ª”µy¼¨§(Qð8ìœBRå5vdÈ5Š‘2Kwxü Ê›R´u—Ñ?*kž²ú„d‹4ƒí^Æø ^÷ˆÕâØFi`si¸À¦iC/'nmáÑÌâØæÒ"ÀÆN‘¾%ÇvJ‹˜Á@ˆæPqÜNËù(O²ˆùt&Â,Èœ!w­ÉŒ ÷ï:QZ›”N$´÷¥¯(¥¯(–K_Q‰SG±4}eè5²üÆ_Fé+ŠåÒW‹]T}K,Æ^‚Í‘"A±ö<"Ïã£ÈÊÙ#œ vs¡*>åË(»lXÍ"Ê—Q"—/£_‘i¾ÌÐË‘¹òe<š™ D._F‰ØóÕ·$l ¦|™ „heao²ÁùŒ1qþÇõ"Ÿbúß‘©LÑ”„a‚¢àAGã«s¸ ¾6ÉçWƒÃòEø0ŸÔAÃjùQ‘‚\‘J|z Ò¢¡—“äy4³|\‘’±‡²oI䋜 9D3šCå ø¢W*=¡’å£.xÖtp^ºÃ"ÞõÈʾ> JÂá=šˆrôOr¡œ'%X[Î1±^‚7»3à¾aµ4Ô,’†šç¤aâ¯UÎ_³¾—“vŒ¿d‘4TmNªØûÜ·$Òpè!Ñ* õí¬³7•L9kN²)æÂ½›m¦MG»lXÍ&JR6—<¤?™²iòÐÐË‘¹ ’‡<š™ L.yH™Øë×·$l`¦ä¡ „he«Íh~©Ò®Ô(ƒ{æÑzF´SU4¬fÄ6J Rm.J'Þ)ÍÒª¡—c´6H òhfFls TªM|mmš@5ö‚ „hŽdDÍnW€Ú—9^;/ÙM®Ä=_A4ͦü,m— kÙAó(?Kó\~–N¼TZ¤ùYC¯‘Ü'0þ2ÊÏÒ<—Ÿ¥yìsë[bv{AB4‡²ƒ˜>æFø!elN ÖÛ¾ÝÌ'-æt¬vÙ°ýˆ–pü1 ·3›ö-ÊD2‡QQUøXë¾ÅŸÐ±¥s¼xÁArÓhY}Œ@ƒ¢I4ì@ÊJž€”5?Fx­_íã7´ˆV /sø ØifE _-}Ñ…‚ãÌ,6×AÒ­gx ™:Hº3ÑÃEz0äÃJFC/³„â¯|,Û_‹L$ÝòOê õm~¤bQiÆqd$ÝNŸ AË=$º€ئlÈ xîûð€a“Óstù†µf¹áQŒÚð\ŒÚ$ö²áiŒzè5šÝŨ;¸³ÜðØúï[b³|ì!Ñi–wE¿šhí}\z’ .Jbú.§] ŽÜr¼s›aøTþ¡ V³ŒB·FæB·Fơ۾%a;9…n'0þ2 Ý™ ݇nû–„íÄÌg2ÝÎhe;yâÐíS±Ã½»n#íd(³eÃjvPQìΨ\ìΨ8v×·$ì ¦ØÝÆ_F±;¹Ø8v×·$ìSìn!šCÙAMߺyBèLEž&—ß(ïc•œ-Vó¡Ž‚‡Æä‚‡ÆÄÁþ%áC3'0îRGÁC£sÁC£ãàaߒ𡞂‡3ÑʇFU>¼Ÿ×½™u:hðDÿ/maOuç¼ï'~Ÿz’crVéˆ7@Ú˜769«Œõ&Ÿ¿n3Î*“8’ÌàH ÝMC/³„â¯|ÌÙ_›Œ³ÊØØ!Ö·ÄΪ¾ÍÔ,œU3Ž#U¦âÚø×úvõÖ}ÏηvЉ®`ß°ÖÜêÈ34·,ËÅÄmâ³<‰½Fsjã/£˜¸e¹˜¸e±¯o‰Í­±„` Ds¤¹eùÿNÍ­}>ZqG J˜e×Zó$wgY ˧njˆ|CÏÌŸ.ŸšomÎL!ÝO·:ÜüÄyÛØi÷õ³ïi¸Q©ÜdÄd&kŒò z`qgÌŒÒég"Š«ã¡ÅBrÔ¤ú€á‘·<ع±ýäÞ4acG÷8 CÌx¦¼N_ÐQÅÕ]æ58 }ÆÑ=¿ëÕÍL÷T‚ëÿîFìGþåe4lŒ“€Àç'”pñÕãhq—O’›Utl•JR*1L^„YG.}9¡æáÜ£ŸšO—ÿç¸I endstream endobj 5294 0 obj 5615 endobj 5298 0 obj [296 /XYZ 38.2500000 257.750000 0] endobj 5299 0 obj [296 /XYZ 38.2500000 134 0] endobj 5300 0 obj [296 /XYZ 38.2500000 257.750000 0] endobj 5301 0 obj [296 /XYZ 32.2500000 650.750000 0] endobj 5302 0 obj [296 /XYZ 32.2500000 601.250000 0] endobj 5303 0 obj [296 /XYZ 38.2500000 134 0] endobj 5304 0 obj [296 /XYZ 31.5000000 651.500000 0] endobj 5305 0 obj [296 /XYZ 31.5000000 602.750000 0] endobj 5306 0 obj << /Type /Annot /Subtype /Link /Rect [87 778.250000 136.500000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn31 >> endobj 5307 0 obj << /Type /Annot /Subtype /Link /Rect [60 771.500000 141.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn32 >> endobj 5308 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 178.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn33 >> endobj 5309 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 159 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn34 >> endobj 5310 0 obj << /Type /Annot /Subtype /Link /Rect [60 749.750000 129 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn35 >> endobj 5311 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 181.500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn36 >> endobj 5312 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 153.750000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn37 >> endobj 5313 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 144.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn38 >> endobj 5314 0 obj << /Type /Annot /Subtype /Link /Rect [75 686.750000 123 693.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.lua.org) >> >> endobj 5315 0 obj << /Type /Annot /Subtype /Link /Rect [150 659 219 665.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.eluaproject.net) >> >> endobj 5297 0 obj << /Type /Page /Parent 2 0 R /Contents 5316 0 R /Resources 5318 0 R /Annots 5319 0 R /MediaBox [0 0 595 842] >> endobj 5318 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1701 1701 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 5319 0 obj [ 5306 0 R 5307 0 R 5308 0 R 5309 0 R 5310 0 R 5311 0 R 5312 0 R 5313 0 R 5314 0 R 5315 0 R ] endobj 5316 0 obj << /Length 5317 0 R /Filter /FlateDecode >> stream xœí]KäºuÞ÷¯¨µ[W|èA 00ÏY¸˜²0²Ʊ Ã62ñ"?ª’T]Eé£Ä¯IUuMãÞî’J‡çÍïüú¯ßþëðç~ýôí?ÆßŸ¾½TǶ®†‡ÓÏ/×twÿ>´]}øñ÷—Ÿ‡Ÿ/¿½üÖÿÿçËðÀ·OÿÞÿõ}ø·þ¿¿þðŸýÅ?Ž_:}áï/­jûß;ÿv­êÿª.¿O×ÿòò¿;üãÔâôº±3·ŸÑ]kUsêÆÊ«¾LÃTçŸþøÇ˯ÃĽ¥nmgôAYcÊY}øßÿ~ùÓil\gõugõÁæ¾Lv¸;uXõ>ýŒ]iXYmÚ~Ã4T¯Ó ÇiPÕð s¸~¡é ä[æ9ìo%›C¿ísØ?|5‡çOùç0 .-Žìº¡ë¶Ÿ?7½,ïä½vG4huý:‹ã'r"]3þƒ¿…”´>1wÕ-Lsâ7›ÚÀ7;«TÛØ¶z‹ðjõé5¶r¥]ßR-KI~ó ¯›*]ã瞋ϊ2 ·Þ“nm]¹þý¦q5Ê “V· fíÒzŠ%iš„Ätî¹ô¤LË O½Úí‰%[íKë)¤m»„Ÿzžjµaã©WÛõïO·Ú—Ö,HSõ¦_²Õ>÷<ÕjÃÆ¯vSMì0Åj¿¶žbµU¯ò¥#¥SÏ­6n<õjU'\íKë)Ä´ ǹç©V6.¨‚7VVw &èÒ|‚ÙoU›Nz.>+ÓÚÎZ'\5w0*{6Ð;«NŸmÜñ‚>v]?YÃïV©áª=Yz㛦+?ú‡ª£RNwÝå[ÆÝ43}^Ó?1]8?xð0ÎMåôš›Îœ¿eo›±·¯ùKo¥_/Å-ýW€ëõgàÁß_~ýÚ¿®9|ÿSë<áïïý ÖÍá—s/ÚÃ÷?þ¥‚úýáû__TulZÕµõù‹Ã7Ü©•3'ÇÂëç;öhÍàÄ~½óqxFO·.wls¾cŽý_ÝmkÝùN÷záj^ÕÃW«}݈ªàî˜Ïç;õÑèNÝÜ©†;ª_ª¡·úfšHmàùå{¿k^|i+ôëv^¶nÜ r.üÍ£¥jFKp—™„íšjlyú¬Î›£­Fª^טCã.ÁŠñÊ—¦wˆº|«½neúT¤?~®ÝygxO×ÿŽþʯ'ýµ±§c+·ã8m¯¿Ë¾¿:;l¯¦Y¥$L±ó aá~k ÙûÚLÔýúL=îÄÚ߉ºõ^Œ÷N K°yÜÙª…wà~íé>ƒw¯òçÏ,^¸/¡Àë/9à‰„Ó¥,ìÓ^°n#ãê¡×´#w1•¾¾pë©è­ót€®ZÒ:í çþÊL8}k”ñS3ãÇñ5¯:@Û-ém뿦¿2ÓÎß²·ÍØÛ×Õºz]ÒcŠÆô݆÷·™<éÔ(Þg|F]L˜`ƆG gËeâïTXzáµÝÊØ&¬kFÆd'†ÓÄq6×yœÍ¹Îæ*屜ÓŸ³¿5r®©™écçq6×.q6×øœ­¿2ãlçoÙÛfìíkJr6WÙU¥KÊl2›9xÈö:“OߓɌ`²þˆ'_ÇñWÕ“¦d»ë o¶ðœjo,<§º Ïéʳ¾NW| ïü­öº•éS{cá9Õ,XxNÕþ;ú+¾…wº6õ´¹²ð^ßQÒÂsÚL+üÊ9Âz *Ü’M´Ýµ"lœÁjGˆëâ¼À`ýj/VÚV[Ìi;ùšîúÂVÅ™æVcém†%eæ(u££ôFc9}kÐH.ÍL›[Å™zAcqÆwûž®øËð-{ÛŒ½}MQÅêûöàŠ…&f[ð¼…u ¬gÉ2uÌA‰õaL»ðpl\ W€ïc:À´ó9R}³æbv×63׺ö˜kÝ,1׺ó¹ÞÙIîñÆÓ·Fæ953}¬=æZÛ%æ:dOÞ¼ÆÌ™ëù[ö¶{ûš¢ÌµQû¨¡®6Ó”çAy®x†‘ø=-ܳ²#%ž È‚Ä:„\£'ÎØë ›9@k=ÐÖK`æƒv£úfŸ¾5îð©™é£õ8@k–8@ë{ÔOWfàü-{ÛŒ½}MQн…p…™ÄÜ9MHFjŸãâa0“BômÜçÛwY7儘‘Ç [Ý$«TVm§2[ˆ¬î¥KnÖ#r*˜åÂ]ÂóÁïÖV™.ÍFœ)ˆ?à(Vl ŽØØ˜é†!Æs#"|² ‘1&WÕŽ-äè,&g"ÂÀXŠ”Ýé=°‚LTØaŽн1æï¹byiY×Ö—¢t¶a¢iDZ€°ê)V(±H; â O׎}‡2g¶ˆ\ O Äi‚9ŸM •“ Èo_ÒÑ›%ƹތPdxäŒ2¥‚È ä‘ò™E3“,¡¨UÕÜ4ÅsGÜ¡”ÅÇPïÄÁô€ \ìç´š`3Î'%pn‚:ÃÙ˜˜¨ÉóTÏB½¶&5k›[mW÷c@—Çd´}7ì:UîI¥ëTŠÙ~BúÕªñ8[è.“y‚¥D ×Œ‰ñÑߪ¢íç :W ‹â®¢#Âi8²{|ÇNÜ@Â$ãЈ8Þ"«æEøK˜F¶Ãœ1"ìUF¡Â:JIYÛåËZÂ7ƒ™`ÀIHØPÔ*fêµÈa Ìê651@Y~yåû ˜æò­0ó“¾s—ª£lB0µ¡p˜ø(£$>7³–o\^ŸNé•ÖÖ·}«ê; {˜™lñ9qé]™‚:n_kÖWRBÀ,at‚íIž«ú¯Ð z*¶(›ˆ'kKG` 0;Vv€l”µp)Ë‹Ûíl™¡oazÈt\)æX8ãŸãm†„Ì×tÇ}#¸¦qꆡ_Qˆ¨@&ÄÐÓCððd¹H®àî›Üðîhü‘â;¶†27S¦Š *a©¤9¥Kµ'ä˜Å­ßØÙÖW°C ³O+a—fßù 5%ˆ6]çÏãS'd_ŒëáÁ|EEÝÇÎßo8GØ.är¼0¹’ÐÇ`àöeî0M©‘6¯°z!7Äì (4 RãÕðÈ$WËhߨ1ˤóŠÐ’hôµÖHåRPËnWýÕ:3³Dîã\H2Þ,L ©µvžÐ†0’pŠc†åáçÞ«5yÁµêô:­d ç1I›ÂÎïµU=/HvDm½µ¢âø8ŸŠFû=càÎÀwªqïç€!Ę.˜o0ÑÙ­Àmj¬&é&p!]ëë A”nW9C¶„¿íPÇÂþ²íêB¶Ô | Õb†ëS€´²áËLÔÔDËò¨Ë c*LÂør%ž‰áÅò=Ù–„+ožŸéL5ç¢Ç2@ã Ålq™Ýo-©•Í`fÎ_½Ÿ”¤='Î ûi Úú>³TË3(‰ýþ¿\ß-ÐWÔþh,,µoБTµB©rK­ ›EÙé–¿Y–úÇè©Ë¤.꺛øZ; õ‡2àÓž.ݨ-ã.Põ±rÞþÀ‡Çý…ôòL݃µ REõYã1ÊHÍ+›{NvœÑ”ËhÔÄ)F|Ò?pÂÒO©+‰ÕR.ÍW¡ÈLIˆ˜†òjè_†¾ƒãõ3çªìá6"‘õÉ ¥’è™”]&xpnñbÁ.áC{D’w õ›#Ó$]c=Ñ“÷!šµH%£Ãë‚ ÿ]æ­gÓò”¤–ÇØ7Ý–÷¬Ñ¦Ì6ZQX Æ–­h V„6èN@]Ûî7’E/¤½e)‘œÁ ض«DS qÝx½£2öב3 ¼áü|Y¶ÅHnÙì#æ(ŸdÜ3=J4)6k±ÝÔF÷ÁX3eŒ)5+’Á»¿E R»r¥¥L˜ïÉ–Çdxåe]ÖZm—ز%Fq–“&PÜ?äbÌLÑ8&;Þý®õî[¤‹Ô ÆSö@O®zWÔif‰B2€m÷£N¥tPÚηÖo­ò˜›;“ë2Ôqð2—lF´l¹\Ù£ªÄ97ÙàV®Äþ9[–­ÒT<ëªX¹&ÊÝÁ¡¶;»4›R#ƒÿÓm@Æá]0)O›o;8n"¢õË\ A€F˜£ÉL)íâ‹Ì¤zéÏñÏæ`Ì^88ñ )nYÛ‡ï!Ô'| ŽWbŠÖSÎyu®”ÞÓ›åU\Š$,–ÏÕ,¯k,^d3Irá0gJïÉø¦*ª.ʘü®L€1\¾¸¶ùhaDÞ»2j ›üi7ªª;ß,Ƨ”ÓzÐ,ëEÌþcàå3A>ÊZ šå¸×³# Œ2þ)À3Y<‘£Æ#°EWNxko_)u¶†Ox›q?¶ó¥[[8MÏYã;Ä©m ïàñL*u㓜ÖÇÆž©äõ>áË…i:·j dóèÎ8¿¨ß…r±´¹æÊ Јžù¥°Ã3ñ¥Ôªâvë&Îmw#ŠÔM—‰0‡¾FZetSQ«q„/.ʪ ˜v8mí¥¼óàywÇAÖ]á3¼óÝQ-º£á3ìÁ8WKwlü3>3*³qs`èñäYáF­®°ù˜±?g,Íœƒ3×ÁU…ÏàuÀ´ˆé—¡E GzTºô œQôã9ÈCcέӼ˜9·ÞŸZuo ìQZFQ\)ïLóSO¦ñàÝ`ànÌN®^ÃU0xÎK¹g(WÖ ããŒs¯«™¶…ñE/¾Ce£¤­ Nö%U*ó‘´ŽSöÌ-3À»ZjÈiëä¡e3¡^±³»Ô:r†IzíAµŽ7ÐèSïyzO§.r•)& rÐ:¢¨hB™ª«²jöEäR•¶|¥ª@D@ 2éLŠ|a¥£5ÞN¼Of¦° "ñà^㼄 ì´óV1 4\ZR´Æ ORLDŠQ3ª“Û ugý•'øæªGDeJŠ1I„ºA™×PxÊö·QWâªò²(í¥“9ò¤®«}ž$šØ9& -ín¦°ÖöâTivœŸÊœƒbˆÃØñáJBìøØ˜l•ß®ÈÔ²“eîÂé ²ÇÔcì‰NJùº¹Ž PÀ·gÏù#ôœ€æÂ3DP1Xò;v‰ÉÊQjÿGÔƒ/_^S~i‡ÞaQòþ¢Ö÷™ö(—µÆ›)™­¾³,Ʊ(¬,ŽŒð±Åû4Êöì{)Vš™ºˆ0ùÝ»3’³Jbމn³€%ÄdeËömÇN‡$á¬ô.8W]L›Éw5¢5nˆ ñ3^-Âal¿Æ·¶Ç„ ¸,²Iw²“èAþŠlÚv­3¥|r%æß[Êe/)ðw¬eË~wv]о#$jÙc#Oôê'zuxå £W'F•¶Úã1w‡*Ý)o;8М P”ÎÝ…á™Üvò d‹î’°k»°w‹ŸU7¦ìÉ k´¿t91ã› ê>zk.ìÔò4úÄu•6£šÊº[BÆÜ2Ç6mT¥ŸÛôηi ºÜsKo`UOåÛ’DozíáqU5h;Wc»ÏdÚ€='{ QJ[8G3—œ€è|¬TÉ;K”2LâvI)oŒñÚ ×"0$6¶ðÑ‹æPçzàÎ ”Eœ#aNt?úV¢2S˜œ4LŒ¯0ûÓÅ$¤‚Ý1r:zúýà~'.3BÅÔÜêò›$ý ùÊ-›4{Ê›ÞÁñ§´ØéðÕŽ-„ÀžšMd¸þŒ­HÀpSià²ó(q,÷Q”ÛíKº¹L)¥eð1¶íêzcê ÐU1 /óöô•€–‰EW&÷ÌHQ†|™”.Æc•A=nvœ¼&Bßã1Ç7¢[$.!‚ÆŸÆš‘6zxÏRNÞžº ÿÈ^ó«`’QžLÆ‚,b7€yic‚M¥ý ÞKD;erT3SµžáÂg¸ðéγ;?±À$±ïÔui}ÉvŸ‘ʺÇç&ö|Z\¤¬úŽ¥ ¥ò`Á„’°Q„xR NÄ‘ Q“yOÀž-–ù<ªF±µÌ¥ ~Mw‘t"ñ¨Y/³ì1fY–'{N‹!4Yÿ ãkgÁv?-¥XÝSÈ”Òp™ú&ð$ìT·TôÑ¡gT ×öÀZØëí«Ð%Þ£}ú^m §¼<^3éý›ñe£H­µ´¸x¾&‘0Ci™D¼ ëÆø=öK}“C&Â…Gä‡?¨ê,duSó¶?ÝD©;(·<;¨±ºö´jU-v6Û wÆ­Uµ¯úâÖÏ|€Ï8ôÌD¥æ8C†þr¡_/¤¸c`ß1ÛÒÀg&`Å…÷TðŽFs0ZtKï³3RöҌ¾’F5Un¸è5)\<<•ƒ=-á(zÃó¦5i.ÚÉ…9£ÝV­l¶Èd£SLzD €Ó(q¸¤ÜšHM–òùÏ xòH#“jEäÑS´*êÙØsÊ]¶n=± Îˆc¹LêQqNÊH:*sâÁªí9A¯|®A/¡¬g%1(Œp;ŒÑùÃȉ¹”‚ï·¡dínõ„…]nMÁÖˆ r |®XÝàæ. ï.ƒž:3Í~FwìÎÁýYòèXê®öiE=Ä=¸h>Q#½ÔMž‹%8ÒQ4Çõ ¾çRÿw~'½ÿcȳÊL<÷3Z@àKÖ¥,D6”¾[ .Ì]æŤ<@¥«e8á¸X†.5PÞg³€î3 +´$kâÍΣ–Ì9þ)3›G´ñWGÕ¢ô1Ç>$x“p‘1ªHØ­BP& ©®i¦)£àŒƒzÃeÔOáùžé„§,8D ‚ñóô1ª"´¨ç¶äÙ©¦ò%@6Uïá„h=Õ¥ Qâ ͮà ` |& qÖˆ%‡ºpYß) gAb1Úd¦ÃU û hÇ"I²'«ŸÀ™å*]£tð§rS2zç> >> endobj 5320 0 obj << /Type /Page /Parent 2 0 R /Contents 5324 0 R /Resources 5326 0 R /Annots 5327 0 R /MediaBox [0 0 595 842] >> endobj 5326 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5327 0 obj [ 5323 0 R ] endobj 5324 0 obj << /Length 5325 0 R /Filter /FlateDecode >> stream xœí]K¯ÛÆÞëWh] 2g†O (àg. 6ÐEÐE‘4-‚$¨›Eÿ~¥+R÷^Rß!çÓ™CŠbŒÄÎ¥93<ï÷¼ùó—ìÿõûþÍû/ÿÙÿÐþþþË.;TEvþgúõÝËøúÐþy_ÕÅþ‡_wßößvŸwŸÿý¶;¿ðåý_úßÞïÿrü÷çý÷?þðÇö/þ¯»ÊUÇßyú½©ÜñOÙå÷ÓÏÿ½ûÛö¿Vì¶kóúÿ¿óuêêtŒ‘­¿íºÏtO¿~ÿá·Ý›3âv)ª²ªò½ËÃñ?Mî÷ÿýçî§ãÝò١ɫʼÊnÙ¨ò§Ê¼Ø;ßwõõ`£§_:Ë;ýŘõÉ?Ÿ\*.”N^ýP—¾Ê‹¬©áŸoš¯³h!$ÀÉóò Ï]:„ŸO®•áÂêŠÜ\åuÇnÅPl(À¿NÈÍe(RÎéäêPé‹W×Dnª@UøWéà_g :¹:T:äâÕS‹ê¦è€æò`{^^ñ#¾ê§“«C¥C8^ýPçÁ…Êù‰³O\]Ôµ?þ¹ í?·ÍùV¿O ’Ëê)ðíª:áâ§“k¥E7^<5¶}Þ$dïË'X<” iéé䩨[X=5ÂóãžéØû²z ”ä Åùù䩨.žÛEîÎ kŠ0»¬ž!eHgçŸO® ”ÛýÅ?Ç,‚Orþ ý|^|÷u÷æ“ËÝ”åþëOdz=íyþíë$Åþ»S¼§®÷_Üÿ1Ë\ù§ýןwÍ¡ôEwÄóŸ£'™GOðjÙ{øN Ÿà4ñ« §Æû|‚ÐyßùŸàwBž§ªGσí.­E#KÖ*‹õÞB8º©Œ½‹ù£ßK|j¼¯¶ŠÈ.ù‰n´Xˆï2rƒˆ’èR¶/±·EA[ø{-ŠyAÐýÐêÂvì’½#C϶Ê\yUܧ\_[Vó>µÄÚäú–·Ûòväm(Æ!bÝU•ëX Þ•×Åç(}Ÿ±)(£™Øöó…'„Çü@Ú¯†ù”Ùg±¬b*øŒ´kIa£YŠñüïü™alU• XÚa>ƒO¬d´ Ÿ–¼Ú¢UVçÀ…x‘4åÔf<›¼äø„nö–ÑX"Ñ(&ßÊè#ÂFŸß^`rè[ŽVÛ¶”±Î×XYT=6>ÁRr06x ·Xé[F}¾y—Q×Ë›7`Ë<{ÚÒgùëuÙ¡¬\]Pç‡<œg=ôì¹p¾vþÅ;mYf}¨›ì ¦}£¢îs䵿 7n=åp(òòtÖIG pŸ³)ºW^<)Ñ;­eòü-_û«9ñõäåÛú²k‹àåáwùšX­Rlø§oìð"Uüò1qX²\øð{(rƒüÄÀ S¤ÀëD]7Bð>¢nÆlŠÅ\“¦@2øø3 iŽFZ•YdEO • Œ5ˆ£´º9j«}°_¡fá [£ }cÃ} ´Ì[ø“â@AÔÐpÀ¥ª³‚›®,1+c‘AkŒºÀAŒÁ•‡xzÈ}<*c¤2$aéQJÙH –ëÛéàÂcZÅ6 >¦.5µƒäX3pš(Ñ!“  ïØêÿk,{~çcqÛ¨a˜ÖžqYíûÄÃ‡Ì &Ý(„Rˆ@¶P|á8̃ŸÀï)ð>8=‚ËPà „ÈÆÉÿÌ€þ:Ñæ/ñ H/8°~ŸåŽ7$ Ë„¢ì!e«]Á¤Î×gGÆB¦LùÍQl/2V!~§Á¥‚‡ŒÿÑ”%8¾â/6Ë*”Vé,•ª,zæ¹|˜P2l ǹ ü„ RÁøÃªák&L¡?œëÁ™#,Cˆè¸Ã@aäµj´_÷Ký§>¬À!À!!Ãq 0 D޳ÒX¡«ò:ó¥‚䣔„ê­8šc¯õÛÚ0Âæ[×ùîS§hrÂÈ£Ò—Ó•Äz£ep¤Á˜´a?`ùÁ=Y\ºPŽ„IÕH“S®åtžÏ?j)†ñ®àºzr# 8¶sظzç°q WÂtT…&Qm¿ä˜0ÇŠè°@Ô|ß'D…Ϋ¾dƒš‰ %t=”D!f$2ó<0Åâ”®}$ Qå#ÔØ©/¦‚\è~m;VR7Úû¾#)Ü 1$D*To™b3ÒˆsYߪ ˆDU Š›¸x†„­øÐ eÕ«ÎS‹W²É ö5E„å.wÂ3Ž˜@êw9ÏŠj£ È£¢NAГo "©ëé䃣„Dn›B0ŠÒš!Þ÷?!ѵ(Ú}"ÕWe©i[÷ÌŽ.XäÐaƬá/5/1^~R¸ú5]3Ñ‰Ë Zœ,2I]Ô±9àið¸d/^­0ä™p¹X{›,GM–Ë¡tÀ'¦ÄáKð,8,7ðE5§¶ì¢N€¿Ãi{Œ Ÿã OŒ "\ù Ëe|uæ ]#¸VØC”)‰[ÙØ>ÁÞ ô3QÕ_Šm;¢ŒN¸ >1•\Õø•Á›ä2”\˜^°NÇvÀ&¹ßFàt¸QÕl’«•\Í-WÒn’K[r ò Â-×µÖ&¹TƒÀDUO°I®³ä*Ý„ ˆ1Npd‰bóÝ—Þ-‚+í®KP¢`°Œ(iyil]]”ô.- Ýè eÎþDH «ÆAôRÃã|Veõ(%1Ñ{3ºÔ¥X,Ë™¦YbÆ7Y­U$,OŒ« Òû G.˜\2¡Á°… p=ƒÃñŽU~ÉmöÆì ÝÈÅü¶ƒ²½±ÐR´ |V£”´ÙœtØì%Äô6{C¤ÄÍÞ8ËÁºWi} гÆG: êмf…¨r\³‹Gð}IVW¹,ø"`ÝÕ¬&fM\+»!,âJŠÐ1ðu»¹­î/™¿-~p©8ÓRg4ᆑ€úU)Ÿj!tÊ´ö£—šÒ½Ò”çŸLR±.fXHÝÓ±<°Op#.†G€SCðÜOÈ<ºùˆyH ã “xˆ«sÅ¢ÆÝ¨¸˜=pŒ~ꮫþ Ë÷/ž ¸Ç ÂÂ@ïà™>éüÜgef“kBˆ †uýÚÓ9‹a7Ã'iz¦yv8íùë®É^ýà—ÝÁºÍ‰ª÷®¹Ú›ynͬ«æ5ÔÜñHgŸ®µ+OZìߟ¼ˆWÞùßià;u‡s¯ô‹wžo£ìŸ:‹JWvdðü¥½Ó Þk'(áüN†öñð‰OÀí#<Á;´>µpk Öð‰ú¼¦ ƒ6wíˆí6N–>îѸKû÷˜>è’™CJéb¥òtÕA—B×6Þge÷Ç4íO–G¨dB€ EZÍ€VÔpPŒnÃ?6Ò>>=1V8ìì8å»y—ÃJ\„ׇ˜ßÉ(C³R¦§‹)ñÄLÍž?#×®œn$âb3Oq새^(ÇQ6¿hk¦6êó܇ Fu"âê®pYGýIÌuP„d¡ÜÖK®màÿŽa©óŒzÔ1¿‰jYúÙ{JôEX<ŒO7@)WNuê½²C­j / ²Šõ0¾wr}Z–;fÉ·åh(/*û7ë½`RG@Þ·‡Öv3«Wk¬@ôÝ`¼MjëÃÇ‘›|²ƒ¨©tÈ»2°û”‚ G ¸ÇRëb€ÒfaK<ó86û´lã«!N±pŸZâ¬ØÀ‚. 6ëG„(–bjv‘\HY»Ìw V<ë&Rï´~ozFUwâ S«:ÌU«Öá„mD±rk³^+ÛÃ}‰x¼K;²Àw¦œàž /—Ø' JTVóùR—µ©…)Π2æ¶-Œ) Ï…Y/ôšÇÕÆ­)÷ND¯ïì´NM8ez"™‚n#Cduƒ¦—½Pó8ô)…˜êÈc©tM ƒu!¡Y)ýùAKLŽGE]Q¼Q”oSàØ'q‰s<†_ÅpŸ~$þž`ÔvW{w9ŒU,cÍDŒòJÜeUùi4h‚±¥˜ Ÿ]C VKÜ@5{á45Žczyô’[t]uªGH×NfbFF6übÜÓ”ú­ñ=g6#ÈÈ aâB‹èIcæÐGÌζº€C¨6½½xð]Tl&zòÜ"‡02ÓÅ`&80Ã+7±š7÷³M9?«è+E]?Cw|¡Ò½f 3$3®`öaˆÛH¥XgÊS²îr&Rb]Ð&ÆRH<#!…igJô1%ñ€Rª_×Ôê]«ùÓÝÂjølŒÒÅù"ÆÐ½¦ë €–ûEù0¨£kH1õDªSøÍ†°ô‰‰™bFe§*}Cp?~g`k1 –$e,)kƒª²§Qç—++ÑÜe#fC¥·æ• Ÿ<_àÕ¿ÃS×]™Òò½ŠÛTã7SwPâê ©Û!voC™³°R‘±F„뉙Ia ºÔgué•á˜å…¶ÌfÄ Á‰dJy"ê}—2¢~ÉÁj“r[_w} ¸lÔãÂUÜNI4¬ …¸°5ßã¦}ÜDÍ47ã¦IÕfíÇ)¾¡ 5®™hXÇ«é¶Ì ”a-4¬C¸a>½OÚ-=Wj †…à}0Nñb±MHXÛp|„0BƒW¡ãÕÚ ÆõaÈÜ T±éPI:l:43Ó¡¬á“M»nÚõ±´«Ã#Ì©,p#>5æúÚPú t‰µ†3B –Äô—y~>d ¤ƒ€‡‚b©J\0 èfˆ >¹‚ðj)DxÂølÔ>cCm¤PhFérÑü åÃéK~¢+…„–Xö­ °o-]Y£K‰Œe%Ø5ø{ðjÄ =3,ð~hú åÐä[œ·¼6]lõ¾âì?S@Ä䡸 •Ú)uÐí¢Ð­¼™¿´Ôj´…æµ´&6Z~g~§žâë\tTjËŠ”¸E4•#šÂ“1o.½-X\ÆIâzÜE7NÌué:3QxW –íj™ÆpªÙ ºƒ!±T³…ª!® .ª›©¬xN /Jùa*ýÆŒL±šQj4º@¹ TcœÎè‘Rj±²é«±…¹;¦õåѪIµ¢ª¡u Ò™˜×6-i pcdìêfÌàn†d"ši#3f¨‘´1îOI: «êëψ9éÓIBºŒÀ™]obŸûós¨Š QÖDx€."{°úacg¥D}Wà. ŽÅ­Ïx6êô›‡tRÑ„¸s¥lŽö}øÏß›JÅ_"bsyÓœ>f¼±Š“˜žžÓünòG‡©š$¥‹ª«™ÊV‰„Ÿen)ÆmY¸ð 'Èà ð>¸tWHÞ f!‰»¥ßBÝÒï"%né÷­¡H>õÖ®›B¿7áªØl‚Í&Øl‚6ÁÖ~,Òèf-lÖ‚¼ÏÖ~ü¤ßKçÇiL·½)¿K;¬Xµ,»Î€ÀÔ19.f¦»P.«zƒì}Þ: Q2ªËî˜+»‘]wf/Îëà˜ì# WI¨6š¥=™’&ø¦Hjš(†ŽÕeƒë3™²òÁóÙÉ(XP u)M¯)•IÞô´‰ Zéo1f•MM÷×­F‡ô$tuL­¹G'¾'íq´ÿËŒìñ×þÛ‘½Dîû<ö&°g};ÃQB-äã'í}þšŽ¯Y-gmX]Ü9†àþ‰ò‡o9|>´ï´Få ­ë |@û„1Š»v¶Oí—ìÚ–âp™BÞç \åT?°> endobj 5341 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5342 0 obj [ ] endobj 5339 0 obj << /Length 5340 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯ès€m‹’( 0öØr`Ø@A7›`‘]ÄÙCþ~Ô-ª§GÒc‹¯‹”ºG6ÏšU*ë‹Uïþøåïûþ¶÷áËößüŸ¾ìŠC]ݯýñ÷—¡ÝÁÿ¼¯]¹ÿöËîûþûîóîsûÿßwÝ_>ü¹ýé{½ÿSû¿Ÿ÷ý[û—?útü¿ìjU·þûôgS«ö§âüçñïÿµûËïö¿gì_ç‰yýß?hטÒɸòêï»þ3Õé÷oß~ݽë÷–²vµªöÊ»WÕûÿþc÷Sû‚~úâà¬Q¦Ö¥mn*[¥sºý¹6þûòZŸÞ^¶ôëæHÉèݧß2³«“»¢N7ù‰ri¦(S©àä‰W»)\Ó±L<Ó^¦O°"nÒ-wG¹8Wüzf?¸Êÿ‚?“ïvÇ›£ YåöŠ¥±JÕG»EƒuÜ+[=-M]%X›óì)¾*JÕ‰ri¦ôB'O­DjUt,kÊ<;ÏžbA\aÓM~¢\š)ýjÃÉS¯¶kz–)›bEšd+âÚ¿M¸¹O”‹s¥_o<{Úo™VöF¼)Áš”É|W¨&™¿é)çJ·à¡Ùå,µ+´«’Yê‹ÙS°ÿȧd“Ÿ(Oc©“§ÞʶÔéÜý‹éS¬HU%ó<å‰Üý‰Ù?ÇÌ‚Iéþ$%¾|ÿu÷îS«^ªýןZÊN/ìþøúËζÿqŒIÚýqÿû–žòû¯?ïÌ¡´•;æjŽÿî4¢ÝiĬér8ç‘ⱕŸ­ΦôiÄ\STºœõ ~¦ºè¨v3&Á$ág0STg«áˆk‰/®â_lMüÚbÚt)X§Ä‹­š¤QªhÎ:}<”£z5¢? ?ó.¶Â/&䜡 À›ŸÄ\KiÔù‘ÍÅš`Q– kBd\›íã×Öj&2xe=ÛâÅ褡æÎ%”ê­/•=æ&ÙY—7}½êÍáôÑò01âõÝĈ1pDì뮸FÎ4i¶^l¬VD·»Œ>ƒ¶Šút(͆  àÐÁgÆL!L;å 5H`ÆÛ€/–ÕGŒˆ2ÂË8ëxãٰܸCЈz0GŸæN¬•é%þeÄH~ ¼1BK‹{Õׄ)¥ tz`$Þ• …ÆÌöœËÕ©{/®x"AÞG ÷˜¸o¢‘$à$ ÖmÄg$N P4á’â‘q®‚1æg“hÙ©÷îe`„XõG¡½Ù ÿèB‰­Ge!™ôfv†˜Åf¬Ù(‘@8 ±é½ Û ÌÌ]H)á²ã áªœ6]ÓúÆôôऌB#ž‹q)G`Š¿Çëñ©ÙàˆzO<ƒ¿´&xð G mø=Ï'É• ðR@ÑFpTa©Âèø÷Ì7‚£I$8Šy€9êMcJ]¯Ë¦É`_:åÖ(óšQæ%`:%¢IÆ7öŽ3w؆G°f"-ѳKÙƒ5Ùˆ$àOáÔ>Î;ˆ¦>)ç>"'ŽÙ5šd~`ºØI6‰aBþˆÍŸ+ŸÇ¤ø-žÐˆ•E3°bãø©³Æä±3Õ–RHL²qÓµ}Æó-K”ÙÝëþ-ÊÌeÂ/õkwˆRˆ !m[ÌZl1ë‹ÍIZfz+_ÌZê× ØbÖW#²ˆ¹*¯2g¾¿†‰!<8bcdtK‰¬QœTÅR7lé”F¤ªVäAÊt®Æ1Sû½UªZ½ª«À±i`«Š//žÏʶë#g!Û"¬@Eõëƒ÷íÕ“x¦œ[¶¬vÅ;ŽjÀe¼ú1±"šIw/XÊÚTz`#sé±Åc ´‘)L-Í×Ì3š)ù’GbÀËð|¾üaM>:V[Iºî{Kœ†‚ÉÀ@úö·Ò]ø=0¹‰S~ø{–OTã˜<)À«à5SJ…×´Œÿž@Z'úñ‘€¬é5$´çG¼Œ×{6_²¶9¿¶IÄXK"yF%D; ­JÀ?;  ª)æsÖ;NÙ·ŽF¥û‡æØQ&Ř$¦ÈbF8óýF*%¼â6UÆ 1Ó½Jõ=Et0µøxÕñ‚E<‰VV àH&EÄŸ²®Èä^/F‹,Þ'ëðN£€9‰m[ìè/gNe‰µ¡-á3b}ºn¯š©M¬Oç´U‚Oy"©öóz\|j7£ßñi2Õ¶æB–Ð&Ò/šëe>*ýH ض<ØNÀá`\«Å;Ùòĕö£”–¼Š¯Ö(}®ìÀIœae2’°YU?A pRÈoæä¯í=* ÒeK®™¬7ÌÄbœ¼@y;ÇhaÆ< r艅Ò(U‡³a¾Y(Ÿæ@ŽZ¸Ï .àÎ‡ßØ¨êüVñ­u³íº»ØuÛ ¢1 «d7®ç|•ï­ZÕ7Hö&=¡ ÷£×ÙyVØT›îzƒÒ—Swé²\B²ÏðLZì­n¯íÔ+•:½ÒØsû“OW™ƒ±ƒd^ƒFüÒW‡j”4üŸiÐ3}T_sFðŸgª¾Ç§ììa”d{F#ç0jœe‡à÷xçwŠ6ü=%œM#Ž*¸>>u;Eõ‡øõñÊnb}Ìsü3ºî¿´ýèjÞH@v|¾ÑE¬)æ¨7t«€G0¯û4ùÄl…Ô6¿’î5îìù|õ8Ý¿ÍtÞŠqqºR´`ÂAQˆ]^Uy(†‰\›„‹_˜Ì>Ĺ4‰Ì³l²jdÒ¼™°ÎÇUXiÁð™š@é°(Ú?u ’©ª‡j0cjü0t0¡Ç•a‹gûó8¤Gþ¹°’g·ƒ&ƒ•;~¦iÌPíã‘Ú@ªCžéüìCÀzäá$¾lôO%Ú'r!d17«0¦= gæ7ŠÈ¤„mL  ! H~½US¶È{F²Vzþ3È1»U¢¬5ÞY´ÖKÙ™Ùèatˆ +ï b‘-ÊVhuýú•R…Ÿˆgžà3¸0°[6šíV÷♼¥oSˆMêà³$¶ê³¾”CÃØÅÓ k¢PX¤í¹ Þ§'-®Çøs(‹¥’K÷ O´jodÍMW+VLLŒ|ÃÅ^I›“ÜÐô%¾ky5z,"Â-t~W,¥2 +¾Ø’:БU“ æhš“Ù0U€\" ¸‚ UaFö`B´w&³_Ðò©BÕÓ·ÝR¼Ê[ŠeÀˆµ¥6⃵·mXmq/–¸Þø*–H†T˜;ß9tJ¨+.‰S aÍ:Š;˜&å’8)­_Ù Ö9¯“iyPšKQÞgîaùŒ…ÍûØð©ù[ )L¢L¬Ç@ˆ‰V/¥†ÒΕ^<5qºƒæMhߪÚì[®2S,¾J>®¨‡¹x/WeDÝVÿ„aÆÚE{ï&ð$>qË©’èÍ7º~2”¾à¤Ôöõ+—,8ÁèUíÉ¿'ªx£J}@øE¬¦«k¹¸V’HA¶"•–Ö™ãrªReJ[¢'UÄñhç "Nh`qàI`ærºÞŽû¨Š‚IûŽ;pý}: wð4/·ð¬¢ƒ§9£gfêàqGt†~.°*(I1nõw³fcBòåÛ¨r•Ü%pçò™TÙC¿›jØpªcÅ5 ù¾Öz4} ,öá·Y¯?¬ÈÂy¥Ô œ_µÛú˜-鋺º­¼˜ó[Wàê¶ôØæÍÉïj4Ô¶·de¹r÷V¨Üµ¦³'f@åøTîeûcë¡ðƈ—pD#ÚïT›'8~O§ªêƒ§ Sųá/Åß×'¼z+®U5XÄû‚WÔÎ ¦)g…๰à)X•<1ÙÃ^Ù,Ð3ZõŪž™¶¡\’qAu%ƒOÎ×¾L1Ÿ¹®.EYKJäbh½²]ì Z¾ « d+k¬†F1mM,•€¼Ö *•n&ùQ\”LÅK²0WLá®~ gfãäòöXz™”‹ðA‹Žn®x9˜ï SºkþQm€úä6WÚ CF‘CfâœNØ%¹ØQôF–1X5ÙƒQ±5‰ÐI²ÇÖÏý V?µ+ŒêÏ$¶«Š‡<55ÆÝÂâT:P¦ÌS¥¦XÆ ¦ZTúLO5ÉtP+,MH¿<¸pæ~œ¨Tîê°ˆn]óÃ/NkíLY4Ø8QE ²&÷\àΗÕD‰Cú«¢ÊÖ¹Xµôir±_ÈáJýÍT–vÛL2›ééQ6SëebyHcÙt«hr%P׎7wÚ 3©D,»âÛ,î_q5MŠZP Œ­<Å-Y\¢ÇFøªoüK¡†'¹¶$ýþˆ@\~«Q–¢^Ê‹€ÂÉ| Y.28¢=Â5‹×¼¦ô¹I«z»ø Uj¿0õd„ý¹*‹)O£µ,„°•ŠPï¢àåT…“þd¨¾'Og\<CÄ3~GÌå™pW¿fC­¥e`¢… 4ð-ØÔbÍT‚ ³KTÞµZ’;™ûÛÓÛÜʨÙ6w»Ò!£¤meÑ HíËY LÅ ¹R*ñLh ‘œ•LªÄEzÙ@fÖjš´`º& „/abêTdžEicTé {^e€Ì›.«ó˜[8d=„7ÜÔËëº ÉOÓ£N­°÷8'ü–uç«´67Tb“ܦ,Θ¤ õ•c¼dcø¡»–[²¨‹ÁÅÆëõ aV›ÁaT|rhŠÀÅpP,FóÆ²ƒ©Æ«ÍÈÁ¶B›€EÅ`ýF´5X÷m@xg1r@Q@|)åñÊé»Ûßûïí¿ÿóµ0ã°ÁMöP+s(Ô±äq¯û ¨·AS‡HÝJÖBmÐ}BŽËR51Ïþ™j„ÜÝQ0uXõŒÞc®6LÑöÉ)ªHÅ+ö…¤«ü§>Ð+&|"‰«&>CáÙà3þlOE}úEÝ?+pÇŸ[Š{Ê?¢wiXÄ‹E@ÕÀ"`(ìXl0W!ï°”xã1± À÷øRÝ©g0°cÉrƒm¨áŽ |×3Ú+üÌ{O½Ç³™3‚ió¡à”²€+ˆù§` °jKÜ)vÏÖ…9x}?oóøÙæâôüªQû¼ÿ¼û?ùºÜÅ endstream endobj 5340 0 obj 4894 endobj 5344 0 obj [299 /XYZ 38.2500000 332.750000 0] endobj 5345 0 obj [299 /XYZ 38.2500000 332.750000 0] endobj 5346 0 obj [299 /XYZ 37.5000000 74 0] endobj 5347 0 obj [299 /XYZ 37.5000000 74 0] endobj 5343 0 obj << /Type /Page /Parent 2 0 R /Contents 5348 0 R /Resources 5350 0 R /Annots 5351 0 R /MediaBox [0 0 595 842] >> endobj 5350 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5351 0 obj [ ] endobj 5348 0 obj << /Length 5349 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·X 7  e ‡‚ääÈq#62ñ!?ì&Ù3Cò+²¾~UEvÓ‚-yJ¬åÕÛê­ïþøõïÇþv|÷ñëŽß»ß?~=d§2ÏÚŽç_?¼þ®NÝŸe•¿ÿrx>>¾¾4ÿ}>´|ýøçæOÿ;ê㟚>þõoÍìþÒù/ür(UÙüþïËïu©š?e×ßÏ?ÿ×á/¿;þzž±_®ÛÌÛÿÿA×™Ñõy3K?úcªË¯ß¾ÿzx×Ào•¼Êм:*kìQÕVÿûÃOÍýôÙ©²F™Rç¶ùs]Ø2Ë«J7.M÷»x©Ï«Û\UóãÎêÑâ—_2Ó«“EnòËÎÅ¡¢L¡Ü³‡¾ðÒ¨hùÛnÛËô&?"Øä—‹C¥¿p<û©¶J•狾…•´g¨Ïlä e€èezùÉUfËp—{Ù¹8TúËų¦f¥², û~™>Ä…›¬ 7ùeç¡Ø·cöÐn¯$‚}¿š>Àäy£â›Ü¶4†};f}áõ0Ü…¿L`ò†3†›ü²ó`Žg”תÎë€òúÕôò“ë¬ §Œµ;%¯³¦f­tHíÕô&×&œ‚Öî<Ô…;f}áæúd Á¾_M`ò¼9|°É/;ždzñ™o¥ý ° =;>üðíðîsÃuŠã·Ÿš]lûöËÁ6ÿs¶gÔúøíÇãï›ý¼ÿÃñÛÏ{²¦5–ÿ^;báÈG8’_FÌ)·Eu{©.#Õ’Iàºn'9UuVè7Ók8òtÉOFWjá7º‚{+$×qÀ „ßঠ±Îè*G?€h`24«ª ê0ððÀ炳٢Û[6Ü›R—eúk_°Žú0< ^8ù`ÔÁÄW ¿q Ü›c¼ë!ðñôІøg‹†ù˜cž"J-Aðé[#XÉĪÅm¢6¾_Ç:˜á²{,DÄe3A1/ß#E0©4 ÝŽ(ÕÏrÓfT‡w5 ±ÙÁ_F—!‹ˆY^x„ªŸˆ+]ŸŠì¸R%Raö°\UÁÒÒš]/´%`çÃg!óš‰%Ò«¾ŒÖoáH$ÜK/Uò³p鿜`ÝÏß Ú8ÃIeu{|R|ú³€ª'«¥1<ËC>QZ³]©Ô¨´õî[ñňâ~§¹ YY•8—­, Ûãn‹(õé²Í7û±p¤@#ZßÀu:„œùG ù<³·8¯Ì ï$œ×sø|',Ÿ)Eql-ø"· ß³¤À ã³¼mæ„O w`à:ëàUÖ¿OÒsÇ ¤ç r“ûï€ÙÛÎÓ¶z?;ïŒwÒ¬ö§’β‡wêþí ¬Óî´éÐë­ŠxÃ6»á†‡\„Ây+wþ†xy-Ž=3†…ZÙ·,ÉË%D™èvýM ƇÁåa¢Ãvì5[žcyl{ƒÊž´œc$¾J<‚½°Ø‚–ó¸ƒñ€ñDIø›}¬£±ðNÖKg3jš ÂÑIäØ8¾M:{Ú;T–ßÊØùn±Ñ;lpx6ëÁ` CŽXL€Gˆ½i ìÆÃ¡OØD‡wwgÃ.m:—pz'¾9lÄÂ{ƒ¦ZŒ;*V²‘)®Ä½¼ð4m.ûÞ$ *þ>#Šâ•*í±=á>5>ÝK›s‘|Û¬c”®ê_,çŠ;ž1"Ðjˆ2fyÙTo‰–¥²þ(ÙÙí þ¢Î^*ÁÒQäÔ7éÚõH÷tà­lIc†“n³·^¤7³0DS@ÔËàØ[ré¸Íºù²Tr‹ 9«ãE0ã™kTzØúîŒ-†ª˜ÀûëBÊ]] À½FuGä) ï̇Rˆw¦0[ŸæAU‚€ü^¸CÞõ°-ÓÖ*®À(6D˃1ñ¢öé¡Àt)¹WƒÇÈž*–Í>î]×½cØàTlêÓIpAWìœMÅÞ@ºCŒÖ ­ÍÞ°#ašIh'ÒV©DÄlL*µì:ŽÒË8 ß.ñ G,N„ƒ{c Í17þ\6Y-•`+½H[¤F V¤Ç¾h0 Fp4wŽa@¨9F0¿ÅçTëhüƒ£¹±ÔÂ%èÅâ¯ð[ÏÓY¤Â– 4„8†å¦ÁXñRc`ª…ëà²?â‹Á2§:bîMð§ôçqHa,?°ÌYñI1ÂçÁ»vÈœMBã–, Á;X1 låá8ÖU“ŸÇk¼†À½ ÃJ@9ßmã×*»©mòjÊ¿:"Y wUÅ\"UÛÃ`èXáNXŸý[–#å_=Ž~ÕÍ bÕH§à DôþŽhºÖ*Ÿ/&»SïÔ7ø©sŸÆÃ8XQ÷Š+6ê9°b7©­Þ¤¦êüáh&½yÌÑ=8^mM­•…â #៌çbCoÐmJ‹Ût<@ú@þhÝLˆîs „/ Ï&û"”}Ý1)ML%Ѭ‡úì¹MÒiÅøN`1µ>)%dî©©‡ÒqS‰Þ+¤PË ÓÀO´DSèl½Ñ° ™°"1—.ÛV45xŒø£`P3„vgŠpÃ×X'M9½–ì…°u·ÌPÝEqŒˆŽR²ZV0õà…/œÔF¤m3*åtóðH2Lbˆl6jà¦LÚÍraèSP ºôýI=¦çÉ(‚I¬êû夯¿)+(ï­0k2Gmx±«ÛŠÉ¯‘‘à˜¸1úˆæÈˤÓIØ)Y´\FPéœä<Ä»Y¶0.<²¾j0+¬ÈðôÀÙü²>¦ŸŠÝÄêÿÎh¦yÍIw¦†ÎXc"ˆÛ([ŽÊƒ#…}9„K¬b¯LI Â4”ŒY‰åMÜwD×f@Æ‘ ¦äPÆê!‹bÌU LŽ 2…M{ASß„Ú×àê‚®Y ×Ü_˜c‘ÝŒíÜ¡²3ýòpÁüÚ#®…±Rñ£‡?1£qlÛ=¶îåóbÖÁ*vïx˜†ÕaØØKÖ›÷Ê®²–[]ä‹…¥GäÀ/3וÈ﾿2áu¸ lò ,_k})eÊzãlƒô%ŽÂ7)T:>CÓ­l¯åX&Ž]?[~Á iÍ H)“K58À Èh öxÿUGÓíñþ"ìz³QpôxÒ¬¯èxú¶$²ŽaÜeP•AU>`ó²HËhperæ™Jű^»¡ŽbEdÅ™¬±K6 '¯Þ«p ¾ºAK _Pc•Ãäï÷X‰ôŸÀÈœ2?Pe¥¾C ùI9ù’«y#U{#Êd94B¥é[â ÿŒ¤ 1Éd¼.}pö ïÎöÆ¢ï“AÅ-ekŠt4b"DSw? )Cû ¯+n8x¶¤á|jÑg(Ï( >8(ò òbrØ·U¬x0ÙR¤G`^‘Ìl: ܈Ž_Âof6BàÁ˜ècUTeÔÿÝs (j‹‘¨e\S”@KÑ™¯ÅgU_‡Qãf ¸#®©cÑeÛa¸ƒ»«+‰a¼«±1ÖôÕ#5l¥ÍÍNA›  ôñxÛ¬•ºK‚†kµÓðNÃÁhø±$t®úU÷zëY_o]òJÕm*y9x@L™S±Y»„¯¿ÏþßÌ>H§Öy¿©á7|=÷—8ª{%Ÿñv;´Èâ—%ˆ×Á³ÁäïïàÊÈÇ#-óWö¤ÕÀ2‹qß'¸7¸NG˜ØŽã·7Œøˆ;¥0±…AÑ_Ü¢ÛÆpƒëàÙ;˜ƒÎ…=6¿ŽÏ t²É/saŧšL¨W攩ó‘ŽúÚ C¡Ýw9a«jù˜ž€ÂŸô©é+Ž­ Ž|Bë˜9ÛÛÔÞ>w'㤠Né³C¢ÆVáb|ÀNÓ©?Øš>q …gƒßtfGåuôWRE¸óŸ›¿e{S¾hÌ& hxº˜Hí1; UÌxñÞž8v×é^ÎSß`` ƘU ÈÀPCŠqœë"Hƒ þæC·û.ÜuÉÞ[i5Å,à bø)´‚G Æ fq;Í–™9uüþ5ñbrüøõ“lV¨}9~9ühë¦ endstream endobj 5349 0 obj 5143 endobj 5353 0 obj [300 /XYZ 38.2500000 446 0] endobj 5354 0 obj [300 /XYZ 38.2500000 446 0] endobj 5355 0 obj [300 /XYZ 38.2500000 160.250000 0] endobj 5356 0 obj [300 /XYZ 38.2500000 160.250000 0] endobj 5352 0 obj << /Type /Page /Parent 2 0 R /Contents 5357 0 R /Resources 5359 0 R /Annots 5360 0 R /MediaBox [0 0 595 842] >> endobj 5359 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5360 0 obj [ ] endobj 5357 0 obj << /Length 5358 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ#Àj%È!€ 99rœÀˆŒl|ÈßgØœÝ%ù5ÙßT7ÉYZ°µÅfuuUu½ëÝŸ¾üýøÏßï¿üçøÍýþøåÊ>>7ÿ}:´/|yüKóÓÿŽúøçæß_?ý­ùßÝ_:ÿ…ï‡R•Íïÿ¾ü^—ªù)»þ~þóþú‡ãoç»Ï9`^ÿÿºV¦ù©câÓO‡n›êòë÷o¿ÞµûJ^é¢ùYYcª¶úøß~i>Ð-Ÿj«TYØ2»åC¥¾|ÉäG¥ëf¥æßþ‡.¿„–°x¥m¼Å/‹cE™BùW?UÖ(SêÜžú|ÈyUéæçÒ¸nDZY8¤åCÊ8“ëòò‹›L—©é ¹8VºÇ«G>p“•µCZ³R„3¹.aq­TDj:C.ŽwàžÕcx#Ò”q&×å#,nêx÷E ¹8VºÇ« Þ×&¯TLn~^>Ââ¥2ñ¿@›ñê±¹¹,G4œáHŠˆüV密 äÒHéŽ.û´ë<‹)»Ÿ——_ÜfEDö¾@MvãÕ#¸U¹‰ÇÞÏ«Ç8omãiã-䑨/.xS7Ö»Žx²×Õc ßšxF\ y¬“…‹Çæc[UeEãD®ËGX¼Èã)-äâXéÎ{°úçU0(íŸ_ß“çÅ÷_ï>5jOqüúKÙåƒío_¿ló?gçÊ_>þ˜eªþãñ믕ŠRUe~ù{—'YyyRª:+tž=?Q|¢ÚÕÌ©1F”~¹ZÕ¾óü—?°'kZÏëó"-Ÿ}¼<É»Õ_<ÁïÀïàwÔCXeàò¬%@²ÄóËsÊmq>Ú9gë ï”9J µé#¿BÛð,? ·ùô‡Q€¿g0K@è=‡ý¡¶í‘Ö§Ær Q®ÁÊ Ìi "­ G¤Âè‚ü¤Þ÷© S&f=ŒóñB=xŠ?~mî®8×Îùk¯ïA"÷Žý(µYeUö[æív­ÀɇOŽ;/p¿:ÛðÉ{ôD•艆ïdGðcOlø;¾ã¤M ½Ÿ4'\•ÓX¬ˆÓ‚Ágbñjóú¾¡ÆL±˜’2Æ|ãÀ>Â'˜’ ÔZï@Z6ð|<¸†2@Áý¤Â³‹ñ†)±§ªåwê.« ý`¨ñ™n;˜rBR( ÁŠq`rb?P"-¿®1Œ<€°¥º ¼·MN+)³bòÏ ½d#X_ÑPÖàï02kYÌN'5™4§¥ói"0’Jïd´>Ï 3·–X’Êêvð;²Z_*¼ ŸÁw0ÞV/}­í ÅÖ>-Âê÷ÈÆ"ƒò?ñÈ‚÷È',å}ã-ƒ2?a8=Ãö¾ñ™Þ'Gô;øóøÆ0ÔŒ.„wŠß¼€¹Ä5¾‘ñic9ˆO ŠK0ÓCB¹^˜ô´mRŸG®cÄ;ÕÑJb¾ƒ-kïwÆÇèi©´X¬§%Õ¬*=©Y1öÖ¬&õ´$û®2•PÃÈ©òι``ÈÙ‰±è^ªäœû ’‰2?Vë‰[ãx2Œïz0‹37ðqV „͹ßFVÃO„O‡Ðû¹#¤CÄîqf† ²'¥b‚€·³0°DªˆnŸ(Õ0c5ÏqfÎÎ"ŽÒ“ÿIæÜ)#\0lL„íê¸3î¥Oò¶cHò%Ö|0ìr™JÖß׬ÈæUï7ê¼Ueºè]©2v¾}‹ˆž|HÂ9f,Èðùâx,±(Å )² |-3yËø4òpõL¤"A–Sf$×YÝŽ"a+ޱᨗÖà¨ðú3’ÇÞÁ1ÝçÅ›bu—Cï2Ò|Õ–;Ÿl‚ORåŠQ$ÊeJÊE1 ORN­òSwNw§®8’›‡MÇ´Lѱ­Ã6žh²¼SIWX‹î±”°!Ëø_EcN”‘C¸Ê†ˆÄ.TÂÕ8´»˜çòg¦â7•Ÿð8`ë×SÝ0ø;;X%ç~kï/"“Nå”NÅ-òàÅŒ8š²wî¾Áå}ƒIT0¥ºT¶ÝlÉVm¶ìŽ8G±¦KBLhÞ•g7ð‰Æ+¸P(cõ$2娴%J?<ûáÓ^ÞȖ¥`®ÃP3§£Ì& Ï{gwË›rUU“ðÈÝ-•ßí¤­yM¢co'Ò†=ÕZ¢Rö¤U/ÃM£w&mÓ1çl`¦røüNŸàw l®zrÌ”ªÑjV‡ãCà˜q,¦.FÖ0·¥*{tä1FZ8Ç›Œ½=°ÃˆLoSj±d=±äÃù)«Íë >ÀÕZzRº{4O> ùLßEÙáD¸võJcÒ›á0•Ñà|lâÙÌæIgTÌHJ­ú²³7¦Æ»ŽWc2° ièqèmv—÷Èïío}äF8ññ;LiVȵL8¡= a÷èüæ³+È__•'%+çó/SÌG•y¼™ åd¨:jJ»*zwíšËÄÓ+Û#÷± cʬQÖªÃo©ŠÂ’TåÚˆ”]$“N„Í)ŨÙdð°ü¤?ULzš"äEm¦Èk~D‚;ÏT=ôȈGayPå¼ýìÙXjLÃæ¡zÞ žÅû:ÈVz®Ú®•ж Öá£öª…ñm-D+Û‹šè„~Abc¦kR& ™Ü윺sê,NÝë‹Ï”zZ¦¤ª/²º+åMÕï„òAW ¡¨N;_6.ãÑ8M¿Rzÿ g’TTáP4ã‘|3!Þd“T bò4œcx‚ Ê„»³Æv õz|"ñÓ?\*ÚóMGb@FÆÙCT®X Rˆ«å¥ê’§|€WÃïxpG,/!×¾uJšˆI—6MF#17Ô_:QÆVä$Æ1/Û‚DÚ 1£Y¬#Y¡0T•ðH¦Ù!¬‚nÊZV³ÉœGÆ®¡údˆ´«õŸ1w‘ˆ¯—r܇©µ¼7 ó²,ûwb"µãK%¹ÿa{¢=‚†ÖÓBs)™4Œ%1}^×4FlJ𤕋É3O¦K­L_¤áš/bD1Œ‡$á„.‰”JOÍWôÔ•©º‡øIÕ>*8ºê³B 3ÅÉ#™vÇëët'úã¶ÌÊ[‘”¥&Zà³æY4’½íx'Í40¢oS,µæLE=´…îI¢É©­åÝ®žº…7gþr÷pè'U‹BÑi!Lýflú[<–»ÍF›ºol)6­cºÂ¤¾b*L<•ظmö²lÝÅ$~mz‡_ÑzOƒ#Üú ×öà 6ü®;Âdpu~‚Ý'°1Ž…¸¶oÖ79ØÒЋVwÊ»[o†LZZZÙiÞZ¾é”çÌÝDC8õAäXúbìÕ˜Ë7žsçÝa³ºëX’*ÔÈøT…Kæ7µ©Èöq¥r~0˜%ŒG‘aÊMÆXº3.7å¹§&#ÍÏuMåˆ[:?ìÏ”MRõ»‚ábÞ6V÷®¦ZIf²ñü$øm¶ ÍŽ© fv/ñ‰îÓ5§ÐéöF|•žÛ… ÂlIŠ|±&S?R¡kÅ6| +l›¥È4f!¢ܹiÞ=ÔŒ-~§ª?§Z„âýà'+ŽRÖ…lóÐAI7SâPX)ÛZ(rM®H]#…;on‰æ{ÈB"Gú†Ä•øîCuĶêi¯S*qDDUyQ8¥ÇÄCTÞ¥Ôÿå†0 ѰۄI€X¾ï;l™”¬$†™ÇKtãžÌìˆ_£&âJÄd&Ñ‘™À4à Ê’‰„¥pgf4·täôÅù9N28Yg¹¢îÝšjúMºœ‹¹4˜± ødå¹W£ÕcU&±²åªL­!öëA¥CöriXcY¤X\˺6ƒU´®SøbšÀ!=¤JÓDOn‹U¯[+lÌHZæiËÞµi ÃMé<‰@ðÉ~ðAÙ–Y$‘]°ÅF\k*Ÿº¯´¢JÓÕ`P”—ò¦Q¤‘*ƒ3*S® Ǫꦑ/û@´Dó[ƒ§<)å¸ÔÓS†Ä D“Éa›ɶdÑq>žB¦è€)Ç!ÆŒy ¨ÊSÜC ÃÜ([¬¡áH7 !ÀÅž2¢È…Á›˜‘ä¦ÔÙu’í•Ê­£tUk;½»)‰ iuTõ˜ºhÁ¬®`ºcvje/˜©FOœ‘Ÿt?º¦>…¿Ó9IGÞ©Ñ;]±¿&жOŠ“Qº§F·$ZžÌ@½}޲ö<"Øðwðj Þ\-Y|ƒÊè®èwE`¼¢Ëåˆ6]X>®¿žPå…•­DZa5‘ˆ\3“=VÐ\$U×£ÅÝ*wâÙ“­sY V-Ïlï¢cF9&ë,KëÌè¦$ñÎF«ñî£*jÕåÆKÞö¦â>è * I\#ÒRd5ÕÒ_bV}åyßL[<šîI^ hö&ªqX˜ø+\^„¡~èmɆf2f'-¬$°Q¯S˜»‡pŽè8ä @ç²'¤$ëâ|Ÿð´j;‰Y78s&8¤Ê¿pß2#æk›Æ¼U×üü•ƒgÂ÷׈QýIBg],{‡©¦šÁéɃm¸¬×$$›Gj³ø†²,˜¦¥8—Çê—¿ÄfMii~ŸÒôRîç©¿0CúUcdmÅ+Sg5ñxÚ¹ÀÒ˜.Øâ§aäöBÑ'}ñq ±] Ÿ8¡¯OŠ즠tû€¾c¦œÞc°}r;Eš2.ª·}I=NÅpƒŽh°í‡]#ÛPx5øŽ»äTÐÖ_tnd îüsq9,XÐÐðÁ$ áI`05$vL6«w˜Jœ°að;îæ{ãS0¦¬ªÇ‚êsŒg_Ý´ÀÁ" üÎ{½ó¼Ïy‚asɘ°€'ˆñ§ 3?ñ J w©ÞijefNNÞ¿d^ÌnX«N¢ÉKíóñóáÿ6< endstream endobj 5358 0 obj 5117 endobj 5362 0 obj [301 /XYZ 38.2500000 148.250000 0] endobj 5363 0 obj [301 /XYZ 38.2500000 148.250000 0] endobj 5361 0 obj << /Type /Page /Parent 2 0 R /Contents 5364 0 R /Resources 5366 0 R /Annots 5367 0 R /MediaBox [0 0 595 842] >> endobj 5366 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5367 0 obj [ ] endobj 5364 0 obj << /Length 5365 0 R /Filter /FlateDecode >> stream xœí]MoÜȽëWÌ9€ÇìO’@À²Ör`Ø@A7›`‘]ÄÙCþ~8Cr$‘óšìÇê&gD ¶ä¡ØlV×WW½ª~ÿÇ/?üó·Ãû_þsøÖ}ÿøå¡8–®hÿN_ï^~ «c÷ó¡¬ÜáÛ/ßß>?|nþýþÐÞðå㟛ŸþwЇ?5>üõo͇?v¿tú…_JU6ßÿ}þ^—ªù©¸|?}þ¯‡¿üîðëiÄþqÝd^ÿÿ®µnnk¦1ñèïýkªó×oß~}xß î)®²ÎꃲÆTÝüôß<üÔ< ¾8VÖ(Sjg›ŸkoËÂU•n~.M÷‡}x©OO·UuPº.ÊW£‡Ÿ¿„†O0¸w.Ýà癋SE¯Â£§^ðÒë–h¥O@µËè)–¤2eºÁÏ3—&J¿Üpðcm•*O«¼D´oPW=훿òz^~p§šÿ$[ÚóÌũү-]pq.{Þ/SÐÿyøƒ[›pðóÌÅ©Ò-n`ôÄzÚÙºN§§ŸGO±$®´ ™é4óDz.)Ê^û„+{=ñË"šngžjeáà©å¸t¦#™²)Vä2|‚Á+Ÿ’—N3§J¿ÞxtIQ®U§FucâäIt>ý½òévOíÌÅ©Ò/.]pq½Q¾_Ü’û<|ŠÅu.!çœg.N•nqÇ£ŽO¥ý„t¾n|üúðþ“²ê#9|ý©™Üù™í·¯ QÜáÝ)Žãš«?~_Zýáðõç‡úèµë§Ø^Q]) ¼R¢+ަ5¼âÏW~øÚ59Ešï™)ò!ž"Öd¤HmÓPä#¼RÃçTðH+ƒg ʿ懵ùÅØ|\á•y-Qï½å+9eËýZ¶žZƒGÚ¢}dUö,Ö>RG_ªªt/˜Ï¯˜£;ýº{I¶îs4ºRzÞ=¼Ò mu¬êâ¼Ï£µÂäúnjԆ=ZÓædæŒÖ.iøß[ uôœ¦IÄ ÊDòèõ8|0^7  ©¸¾ ® ýàkPüQÀÑJx¯ ž-bÕ1CÂáâ.K¿ü÷s ¼)œ[à<¬º0;Ã{ f&F©EèÈw9£=µ/¨z~ÁÇÎ@šî¦Wºç$4bN«¡ªrÊÜL+ùù÷ª§‰uHoäËÂO.p€)F/³t@ÛŽŒ/–s<–¥ˆUÆ$q¡ñð”ö˜?Y†8Œ–õ‹=Z8l–±uÄ›±Â„;C9 ó…EØWÓUmqå@_ᾂûÌï@aŒÁp´Gx%S\BnÍ„7ºw»ÞuŒV©‡\Éû èa,2ŒÇL8`»}ÞÂö(…<ËßXÛ‹Ý}£Ý7 NÉjÈ¡“Åô˲HhÞj?4o… B9Þ-àéÆV‰7í\©¢zW]H ÃÆßö …âCü% ”ÕPpq„K¿lŒ›Ðs”ºaÞt+jí­‡€€ÎÁNˆ¬‘i˜‰ÉÔ.L¶¥„÷0›qjˆYJÌLæó´uxm1¯â)MnzókBým8¨+&JÄî³ÁŠ^•­íÐâ&ŽW†q¦¡Î§Äë g ?Iˆ»,Q†+hÈàÀvXŒ²N„üÚ0Î)'b¨RÞ0Ñ_H_1TÄjaúî!PF®Ià ¤qèŠ…Ô Œ†‘˜bب‰}Låëž„.^¬§Ú'»«ØÈî}DaX7êJ3;PìÀÎGYQîcD°6›[+Õȸá‰Ę>†w^>PNœ…Iïÿ?´òBh¼\¶IøÐ5~z„»FZÁ;ͽF’÷¹ð²`±À2œIå117 A+šÓZ-Ý‹õe€á,*)šæ|Ѭd@Z˜ ŽúÁYßB#C†Ñ˜¡-Ä.SÏ8Ôó­1Æf½Œe É´¼¡Ü±¨ÍëÀÔ[—þTº¿4g˜ù¡Úg ‚ˆû¡tñ ŽCì·ïX´9“Xo¯TŠP>JSÀ`™YŠ ¦Þ'C¤¬ª&…þ¶€Çùí§*ª-…=|Ãtë£"#öÓ[FBlxGoúÜEéÝÀê34ˆX°»/lˆØv®žŒ—þ½ä­aDq t'ÑLë;¦/–”À‹Â5d_pý-*e*Þ\g‚˜mY&ÿƒ ËgeÃÐlÀ±}£"¤î²u*Ȱ룙϶p>d™Á‹çRî‰UÀ`|_†øŒz’+ eL–S4³àÚZHsA o\T6Ø Ûð„×áécyuQN ®Q]&Ö^ŒC-ZU“«é´X°…Oi»šýYL"»-"‚c(·ƒN¨Xq\„ÜKØ¥Z@Cð5®Q À²§Û £ª¯v£žåZ=°˜&/wÛ‚¡’¬×'šÀÅ*Ò<Áç0x®ùÉl …ð y±{÷<¬9’¶¬±C¥›¶+©‰H¿gÊ@»}ó£Hë§$„ûšÜ»š¼©^(Ù"ÆDcæ\(áX‘µ¬6ã¢äÆÃ1©Ÿƒx¸ ÕÕÃ=‘?n¯&ÛÆ-S¡ÜÝ ó(ÀT|‰€ŽI®–¢Ì¬E{hžóvA3޽ fƒ‡÷eˆP{=ýX°€@ø„0˜b%„S}•šM÷-6ØÉ׿Ãʽ¶¸î¸O BÈð9¸#îáhš‡CÕø9×ÄØÉùzªàþSWò¼3 ÞÎ|‚ï€ùê)þJ Û ÑëÄà>,ð}pï–nÿ’gµJ½„E{õúÂ`~Á3XýÌ,Ù+Ö„ðJà9ø\6ÌËø|.îóÄ$¡4áóß…Ú!@xÖL—¦ÎZçѵZÀ—{;†ºFá¾Uxûœ„g@pEN­Ô-°¯»­œ¢¼®P~ë~›²=°Ô`'FíðŽÚé¢w"…K¾d«)†A †Ê³7j€g¿:ØŒé`Aõˆm G%¼Dø·j éúœÕHÆÖk#â‚|"1XG \ "B "ÆÈvD$ŸïƒË6վƕj` #ù[>‘X¸ühùLŠ¢„E €¶k9_IQ¨=ÜˆéŠ Ò½2mÇlwr•-‰A¤VËëwùIÛ„)Ô¢Ê1¦&›´LÑÖ«%[€`ˆÂ6"œÙÄ:5š(F‚*(ÝøÚ00ÝDÀŒñЉJ¤À¦œé žkã;Uz’!b¤õ$Ï«°nbPøüœù^ ®i•éüÑ4²£½¨FÝŒg-ª sTîM±¼ëkq×Mj«#Z‰q£Qƒ½ÌnÆð¹ÊìRŸQð$"…;_,ã Í,vZþ»79>˜2ZZÔ›HY¤›ÂpçÄpˆSÔdOëÉÐÁÕ ì[`‹pK§2É ’«¡åü³ …±ñó” ð2Îcã™b,åLŽ^–¸¤y=ÿ´U6×Bó}Ú@°‹ÐÆ97ËÞ]’Q¹R›h¹àËKb)S7ɵñuD‹Üf'°ÅŸJul² Òú­“lAp¢h:'5…Òø  gˆ]Çñé:¥éëÕp 9¢ÈjÝP³Æ¸þ~]6¢¿þûÜÃÖtK›¦;â11ÔÄiÞÔ§ºà=-ãÀãŒÌ0¦Þ­áqÍǯ ^Ä6IXO§Õ’Ù ýE ÌP3ŒyQv.ZL¡«á«SæÕ²š·ŒÉd¬… Hå'–6IûŠ…U&DÉwŒíßkqb{ѵòÞ¡(y¡(Õ,KùIˆH\VÜøZt…5ÁIû•|WQV&ÂŽù Ç­ñ=8"‡‹˜¦éX×àx%Qjß''U3QÉÀú‡-—¨(Š9ž¡èVZñç±z—òŽ€¹€ŠÖ$¡âîìWvßaÒ[Æ÷`½Áä-± ÄRÏX LG…¼9? }{È")^!:—RѸ\‡o4ñp”¯ нÄ15):D'/ãÕÚÞš)Ç£ÎÇŬH¤˜dŽG¾¤p®ÓV íe‚þ GÆ8v\œƒiÎxQÄAÓ"îG.›%Û›)á‡ô´õÐ8î~à&Š™o¯!I£Š¬”¹!IB1) 7ô!o³íˆ“¢TuPõõ¤VK(w)R}êžÖT8ùÊ•îÜQí»úOgZ®ÝSÃçT½™h=µ£•½nnâðüœŽ®Ì­‘ksÓðHQ|¥€UÙvfõåj艛^úÍpŒ¯ÄúÁts™ë¿[äèÙö Øè1ø ‘Ü`0‡:P;SÛ4™Ó·ðÚb¯—pШ”Ÿ[‹†Z÷ÄvATk4¦KO†Í•Ø·½‘Å,Ï6Æ–Ç[1(ç4PÕØú5í¢vI(2q4fààPâ8M&»‰fÞøê5ÃEíO™"sLÅWd„S›ªœ\¡õ¹‡É¬ç,€·…_@Eì;};új·€¾¹š|0m´4⥀N¥nxí™Ñd|ÇŸøŸ8V%¤Ûÿ[»€û ær¦•>.¬’•@Ff0nŒÐ};ÿo†ÿ½¹mþg2(¸P{¨„Ììü¿œÿ›¯Ã÷†Ñƒrðyêf(ªkBb”9êy:\qêVèZx©wye¿Þ‘ôQ·¹’Çùñ•®•>úQZH¡Í¾zBÏ1S ˆksûÔ½) ¾ápƒ}žR'«ºW½`Çhsƒ,W^CáÑà=]èEE½zù̶,Ã~nfÜÏ"4Œ¥bÐp%0 ˜2;fLUH;Ì%Ú»"ÀçtÁÎk÷``ÆœU Ä ÀPC‰ ¼×Hƒ ¾ç±›½fpñ<·.‹pMYÀÄôS0įH µÆËS‹X™- sìôýKáÅâ†u±zÓ˜4jŸŸþ\íçˆ endstream endobj 5365 0 obj 4573 endobj 5369 0 obj [302 /XYZ 38.2500000 377.750000 0] endobj 5370 0 obj [302 /XYZ 38.2500000 211.250000 0] endobj 5371 0 obj [302 /XYZ 38.2500000 211.250000 0] endobj 5372 0 obj [302 /XYZ 38.2500000 377.750000 0] endobj 5368 0 obj << /Type /Page /Parent 2 0 R /Contents 5373 0 R /Resources 5375 0 R /Annots 5376 0 R /MediaBox [0 0 595 842] >> endobj 5375 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5376 0 obj [ ] endobj 5373 0 obj << /Length 5374 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·X 7  ‘4r h€‚9N`ÄF&>äï§»¹Ì Éï±ëëWEv-Ø’§ÄÚÞ«·/þøíïûþ¶ÿðéÛößÛß?}Ûe‡2Ïšö§_?¼þ­íŸ÷e•ï¿ÿ²{Þ?ï¾î¾ÿû¼k>øöéÏÇ?ýoo÷:þûóþ¯;þðÇö/þÂ/»Ò”Çßÿ}þ½.ÍñOYÿûéçÿÚýåwû_O3v˵›yûÿ?ØÚYoOÛ˜Yúy×Óœýöý×݇æÂVÉ«ÂW~o¼;þ§>þô¿ÿØýt\ ›>;ÔÞ˜²ðevÍB¥=­äL±7¶>^»÷£…οt¦7&Ïó:Þäç«ßŠq…‘g?TÞWÚÜŸ}r^UöøçÒµÿ\w®Â˜àYáÚúécÀ¤2~Þ¹ú­tdzk¾æÚvÏíˆ&úWô2½þä'<ÜóÎÕo¥.ž=òk.ÉšK«ó égo›ùx“Ÿw®})-¸ñ䱡mó""´ûÙcÄå1Qé´óXІ“dž¶ÏlDh÷³Çˆ¯#¢Òyç±  'WdÓÇYºë)c\ÐËô&¯"JôÍÎÕo¥ƒ-ž]¸G1µ¹ ¼ŒqýE<)©¬mD–|Þ¹ö¥t …“+B¶Êꎇ™ºò«é#Ln3oòóÎÕo¥…­0{d\ÙÒGT§^MarŸÅ£ÓÍÎc©SãÙ¿†Ì‚·Òüðž…žv?‰ýÅþé§ãæÎk6¿=/%ßÿp²ÚÕÕþéÇýï³Ìø?ìŸ~ÞÕ‡ÂæÝçFlF2G¾À‘OÄJ8ÛG8[¿±hÄ9ø ¼S…¯#@Îæà7®ÙÛ—§#:ÆÆ¤Ü”W`R²[Ä;x Çaoûð®ñ›I GWt«~Ž¿ŸlÆgÍfjÓ-Ù\Nõr[ TªCUgç ¾@%C#-…ñïçÍˈLo,œ¤ Ÿ^ØR5<^ï>?¸C|ó‡ß0³1GÏÃá$\>^§‚»†ç±—¯¸eS³á+âƒÿ’îíÞw[‡´ˆ¢ ˜34Òc‹÷†¥Hå2Ìó ^‘AIÅc.‚å+‚+b¦• ÒàXá¢àX¦+[ÀÂP~e`â¡áñ:^âu’bÅQÞ°â¬h¹i˜Äù))Á³­“ÊÌl˜t}Á»Æ\”ѶáyV‚I6»“°ô€á¨ª 6 ËÙSl>û¥±ÂÕËPÜ4§Ë« 篒§’Ù„Râ|ÙÙöl‘pÕºx‹‹ñíMUÞ ¾¹ÞüàleÞèî®Aec:åýXÐ$%˜a Å¡UüƒL7¶‚ßà½}A'U1—a» c±Á(ƒˆmF ^×ý°Pæl«ôð›‘aCN/à¾Æ6 u<ýèÄ#[˜ ?Ndñ¦e7.Uu…Ð8Á}‡™%VeG`½Ð,Lj›‚;Š]ì!ƒpn bÁœË/"C<¹‘x|‚Àá•)žI^E<ìåޞɢϤôC¢J=Âç‹ö›lÖ…DñzÂÕ‡\ÓókµW€Xh ^î¹Ã°Ã×Ù#)P]BHV9†ùL¨9á*˜ÅjÞÛÃåÐ ´¨TÚV2„wI /Eg0®â|ðu:l€%xBkQÛREm€-Å•£Œ©†TuÕ‚^‹Kx„0w:Ö@8㌚¡qMãÜPRÆØéóØÛé,xUgªlEã ‚Ç8±júKºð7˜–RüQE\ÅÓ벫¡¡küƒkPÛ ÅñQvOFx^Š`ZfÌ·ªr®p‘xDU† ¡XøÎ!© €#¯ ²×è]a‚ˆ'a¨Âÿ攘V¸Ü ¹Z‹¥Ù¡(Í[P1à d–v Ü?ßsQ1\ø«˜Š* åY=G|\b7ãÈTÔýïážË[,T““¬ _M–û€¥C –€B* ¡xq fšC¶‰eTáÁXÿè†<$ažAº“–\~]#¢.è!̹gÆjeÔ©ÀˆÎVùÀTÎ(tÄ1”‘jŽþÇ7>žÓ›Ë5ù!«Ý[’ù^Gëï°ÝÐ%<¡üªJ+¥vh°]ÁÕCl–"ËqõÆCA#:«¶…¾ÂŒ€|ÆÑ}£¦lì5Õµ„2o8Þ’±HŽPoIÕ¶§!©l œ>k> ¿”¼EA§'BCâ:ç*o¤bŽSL4ð]3ª7jx˜°·ÅчuoEb¦ÑÔyývë Æ_Ep2FŠÃbqáCB˜”ÕìépÔŽàa/`E³º¾ª|‘*HEü·(`Þ5ŽøÁëÀØ&áFñ:ÄÈl‘©‘t¥­ÊÌïÇRVhìŸ+\Þ­ºxÁ³òT8´½l \¼ ¥oÀ×7´n╸”Åâ"î$,!rÑ<ê\wÓ§â–fü.T7“Œ± ªTMm²{«K—J%v°¸xÊŠÛHÿÀƒF¨:Óß°*L(ÉLU—åBzýZTÂ4t½¸ªº ¼y¡zéÆ ”y®‚¹<…¼Í]º.À‡€66€mt=ÒûIC½«k*zn”˜KY¾7͘ÛG“ª6蜃'&ã(Fœƒ)} ‚”xúËŸVJ—‡­úè0Æ4°Í4&î€8Ïæ¾X÷ˆ²rEÄP2í¢³÷òJr¼“jd^GˆßJWV¿tÙU-ˆÚj›w¹Ç]Š¿fƒÑš_°EM„ PüP•Wo|ªåSöšŒ€mdÙF¢ð)ìfÇn¬W´ÓBNi fï‰{\˜ëᜆL‹vV²Åõ½T[?fÛ`œzÝ0 ãÖ +-úf¶DçT4Ì!09\SÀü Ü[›z7eÅ«ÑlÞ†ß5ÞAk¢š2ªE^ÀòYU9À#Á¼¬›¥¢RoÿrŽàM 0ëVÿc6ËÚRu1¥*wÔfhM=Y욃•)ZmCéÆ#”W¹Üsš¸fsLGNY (ϪSUu)fÓ-­Ra‹¨Ã!Œxm‘k2¥tÎù>5u‹|Lè\ÀJÑŠÍ`ÛH:xËGâ^Ö ˜žÓÐõÜ_A×·|¤5ð‚-i #[>Ò­ÒõÛÍGòåV%à~)ñ–t³Ô{ËGz¼ ~>Rnûx¹Ö56aå&’˜v1ê#3±rŠÊúŒ’ɺCÞYgÆÈŠóYÜÂÂDÏ-|‘ªÉØZ}÷Ñ©*‚¸ìóò…üÕ8’ ƒøÚ¹•ˆú²x6Á܆ ¨6ë`‹ ºXá7LåeAácTBøLeˆhyuÔzúCìg¼îB\¦úºA$q³ÔCšWbE¸uIíŠX Iâ—'bÜ΂œÀs"_Ä7\×fø†G©±D[ ¡I‰j y²ïWÁJUdcSäD~Ãp{v÷¶<Ÿž‹ŸL`˜òÕüÑÀĵÈÈÈÀ.¸y™Nh~=Ýç°YU½]Òd‡&&|$LŒ´gÍvHþþ°N ש:S“ÊN>ÆùâaG²^ÌÖ¢ÓÄHo§u*•t„©4ëgì$õ›ZîºÅù)(<&¢#…]O×ZõG°21¨‘ؘ>ê ö+h޹t'JakĵQïRÉnº9©´â…rGrB®Œ\òikà.­3kpŠÈ$sk‡\RÕ¡ÙÉ4ȶ¹ßhªÞ¡*†»j3š$®(o¡«¨ËálDð¸°NºÞ¡eQ÷j?öëÌ$Ùiiº ):ë]°Ÿ<¿œ5gUË…” üÍŠ»Õ¾/*P–þV¨@íR[GÕÛL]oþÙ:°•SÕÀ¾I‹—Ü…pŒÅ+•¿`“9#R’:ëÁ,ß9[àù©ªþ&âj–¨ë™¢ß÷ ¥¯óâ„¿ÉГ{¡¢))Má†x²ü“Ž^ÛÉZ3Ý2 ©ÖÁ‚f\-™ÉàÀ ¥*$j#ÌsøòÇW×¼x_Vù  (G8èSFãfP4@ÍÐ0íèÚÙ–ÌíÍM1àxºÔ‘R¶™œÕØ~Æ‚ŽÓŒÛF#aƃ¢’ã‚^eöc<Ø\úqx "kZׂ“°rüñ}ÐÕ» •°0 bÍA¸êçlEXXéâ#¾k8‚gó¸žaªàr\؇©öˆßóN‰V‘By¥åò-ñýP.‡kÎ.N¹rLo7ʵQ®êDQpèà, [gÝMn+S¼¿V ¡µ<µ{?4m£vµÞ)Ñû§M%¥BÕ§»3*äaï†5S!oÔC(Ü&åR¦B¸Ü,3‚;01òÆw„ÞW˜ïâ>&˜v2¢ˆm=®¶oœ¨ìqM¹so¾X¸G¦,¤nˆ/͆]„ ™‰¦*ý]Þh‚Ч_¡ó®ò1_¶„[f㑱çYøœ˜Lh|ÐQŽSÃëòÚnKÖ ò¥²µûåëÖEn«î»‡S «`Þ‚?ïþ6‹­u“ÛÌi¡#ÂêÖ K·.¤qKZ%Èçãä–䉵/<1J°ÔEÙÈÄ+W.HˆT)Üïr^Å4êRI S.tWn§èçâõ›©ˆV]½ n§ F—X5F\—ªr;îOÉè˜É йŸ=‘·Ì4I¥áEçÔ&sÃ;Tm:’¬ºN%¤+!¶”yLðl@Û%ÂXºê¸a/7‰FÎm^¾qfä2„!•‡0ˆ>l‘»@PåUèRDAwÄPǘœ13“%/Lë^Ò¸T ¦3W\ï .פ¬J´I¥§ ã?į ŠÉJÅ`È4:‰¬¸'LóqYWaÝâ|Ä&áôDõ·gË'®2œiÍ#¸µÐ[C÷‡&¸™þÝB88›‚ëDÁë4Ô¡oYÃP‡5§í1•‡—g·9¢K …v8Pœ#ÂÎßU:ó}Ï“Ó&n£ ˜Yóô-1mŽn½ÝcÅtƒI%ÛèÆF7fÖø%Å ï:ÍK¯ºR!k~éLºÖöÒ·—>£%¬8- ã5Ö˜…%ºð ßÀwÊH> endobj 5384 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5385 0 obj [ ] endobj 5382 0 obj << /Length 5383 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sØ/’ V«U€CC Ç ŒØÈƇüýp†äì.ɯ9ýMu“³C ¶äm±Y¬ª®wUøã׿ïÿùÛþÃã×ÿì¿w¿?~݇Êí?ûã¯^ÿ@ׇîÏûªvûï¿ìž÷Ï»/»/ÍŸwí_ÿÜüé{½ÿSóïÏû¿þ­ùáÝ_:þ…_v•ªšßÿ}úÝWªùSqþýøóíþò»ý¯Çû×uÀ¼ýÿ´·Z™#3¯~ÞõŸ©N¿~ûþëîC‹€¸·¸º¶ºÜ+kì^5?ßÿ÷»ŸšôÛo•ªJ[×¼¨Ò§7•ÍÚ7¸q£÷œ~Éì®lîœK·ù ri¤(ÓìÚ\’²Ua[ôTeüœwOüªò 7?B.”ž²póCm2•vöHå#…›¿­›?W¦û纯ªJHíóî)â‹2Ýæ'ÈSQnžšÚÞÕ-Ê\•‚ ýî â •Ppœ —FJOm¸¹ ÔöªèOš+þë±ÿ²}‚Íur²ÍO‹c¥£m`÷ÄGÙ›”júe÷$1 Õt y"Á7—<Ê6¥J~Ù=ò]B•ÜBžŠ²psIʺ^A&¡¬K©~ËF^¥c›“†LDY¸ù¡.ue]ákøçëPV»„Ô>ïž‚ UY$d¥#䩨 7—<Çµê –Æ(•GÐËö 6o¬­t›Ÿ ÇJO[¼»$q}U¥$îËöâ›û¢ð Ïí òdÄÅ»ËצèLO£åã–¯¶OAÜ„*¸ƒ\+-q'vÿ³ ¥ý ­?üøm÷ásS¹ÿöSÙé…íoß~ÙÙæŽÑV«öß~Üÿ¾Gýaÿíç*e¥êÊþ^»âN+æàly\xYQÝ3æ`t#¸.{¦†+ú´RŽQ/ýz¥x:­¸þ5¯VO+ö`M›%9¯˜îߣ=ZÁ°©íÊŸ^”p ,ñéø=…;üI=Ü‚¦khøÌeíF!¥‚Ï@¨G¼`;|ŒÆQP}‚˜…ÐÛö‹ý¡*Ý`{YÚb¤<\Ž?(º”‰Ç9ÉšxDb 8>XªáédÄ>ь̴3ïyúÖhÏ4ŠÏ)7Ð|©|àÓ=±P¬0š"ðâË¥p€‘1ë}n¥ ælˆ ÌF, ¿¸;lÜ£¬*UÿxÛ0×ɽÜo>÷cüJw6&Vtw«áŠ+OpåZ±p7ƒWà÷ŸZ®±²óRËA,f£üÒÕSËèÌÔÂ+Ù¨¥×I­ÒÕÕ5²ëÆ|f¬e¬ eµãöþŒÝ®(Õ¿ù„ùá6M‚»°o 2f 5f3Ñ Qà=ø{ðn#¦ÅžŽœd¡Dø8°Âm:¾â¬§,ßñõP9b®‘•c¢ù…€¹Bø{Téìý8 ÉDÊDJ‚À&ËÓ6Âø‹p Ókñø S<ΘŸT@@T2¸ÆØ‰ ×å22?AA+b:`ü-¨%•RC2Wì)" ¾g>.ÅAØÙ$ÍfÃß„ ßYê Þ+?%tÙž[¾}¥*­?’·+Ý!p=tÔgâ™øL W<Ü­î•j[iñê{ª^xÞ\¸‚ßÓU“EÑàƒ¿bGµ¬^ 88QtÇpê=Oè™løL…£åÁœDÇ´ÞB]À÷»±QùwëL}êï­ñZ(—½5^_ié-žÔx¯¶Ùöe?I)¼ùÞÑÊôÕ«wnâÞQVì¾t•=ªx÷ Æ8Àý¦«è®\ywtÔêÎüˆë5~ŒÿRHb7ç9gµ¹sfЊ+ lðlv™Ë¸5†mÍ2à6ÏÙMû5é½oꘗ”õÅ´@ÐM$HŠ…/²}¢EŸ²N„-;Kº¸¦ÿ0"“ÈPp´}¦yTªùòbjÊæ¾<œ)ìï^Á²A‡Ô󋈀;õžˆ€;võDæ?Éúæ¸H/ºL™„võ@½ §|€A×YŒvïÏ#‡oÒhÇnómÓk^‘5ôei€úМǮ6~Pc÷‘‚’Ån*¦7`¨‰t•lXƒ§+Kmá0 †Ì`ó„ZöÌQ¡‚r7È› [‰ ˜‡|qîÛ0çîŒQB3ÂqXjòÆæÀ€½?VØ_ÍÔYp'7ŽéFd†vR…·D÷S)jcJ=s͆Xjœ ÕÀš¡0Ý ô›È4*‘ñJø}"míTHšÑ–²ƒ 1g3õT²}6‹Y5·9rFÖÜëÅŒ» nŸ¤b†™”âýÕ»GŒ-¿â–””#“+5t׈'Ó:‹ÕØì|° Þk}Û·ÊFôòmmF©ÚŒ¨êØQ‚”á‹ÙqWwØÁ“ïfE¯Œ} z\˜=q(IAdº™®õóμ=HSáfže*÷ …´ÏWgéU¥g)”‹GV~k£WçôöšqE%ûÉÁ¤r–¿›tœ¤Õü7ÒkøžÜ¹•<_§}SL‡Ls^Ÿ'D$¶#×®ª`q8Û?ÌüÙå»Ó²Œ­¼'«7_ç”7ç¾uÙâ°@áÀâбh–/ÍZ~E¶8ÌÀB¯@§¶õ±ÿ…ù(Ú ”¥àÞ<2à<ó€‘S°·b€eÚ&2ÊLSìcœ¨ÄÎÙŒÅkϳ"ºÚש)\753W¶ë¦FÈ­°º‚V3t¹Ü‰œ@Ò“¹Àl8‡ã"0Üœ™žK²sGd'3 iÁwÕr–´’ª¨³5—´­`Èëúfg+âa´d¦y§‰†.l¦LޱÁFVQШ*!6QQG¦nz›e+c]äŒCÚó§åç.²k¸ÇŸp¶eñÆ¢œÙ5{ž´Q8žMƒ±c/ËrÅLLĽ´èÏIÙ,,êÎ¥˳h®F…ê™F!ážu®ò\°q…4WJBåŠÁU–nÖù Ô˜ü¸Hñ)3f}•ý±âÔ—ä&î’Žx±hÜ„ ±3½vx®,QúžºXWeº7t{¢­ßšéDMHÉDj#â3ë³eô@nåX×Ûš•ªßR}Ê’&ŠS°‹pxaù|  —ºÎÖO})´B žÄ”;ÈŽƒÅ^Ö!Š,.‘Àó×0MŒBÞÁ>3ÛŠÁ(á™ì¤,x8ÀOŒ¶ Y«ˆ Yà,`ÞÁô!&ÀZL0ïà1ÔÌ9…§‘)Í h ¼¡!ÊMñù19­…sñöf-„¬¼²Y k°˜æÙ\s»1°1Œ°WÒŽ™aJX 8~Ké‚åmL)Y¹–À™våûcÃ?¥•`ب€rá‰kŠ.B"DÉm¶PÌeb¢pËÎDc*ž¨rmÙ™~²ÕKËØ’Åã™Ær Ÿà÷Qº:[Ú—2à­õ@onEƒ  Ö¶Ï=d¼{lÑ6%~éµwŽÝd¬m~Šñ–³jêåJÖµF©·ÂÔüÜœ¼è ½Qø–$T\<–Ñ8" WTâîæVj” læR6R{oVNú¨žw}Jh %õþñš7Ñלè[œyoZçá±ód»u›š ¤¶/ïÚ ‘à÷ܨ©ÙP¸¬6 ß’„º1SSáRžåuežÔ¥o ß²Ñ’ó˜œHÄ׸M bX”Ä3·5œJ4“xW¤Pט½©ìSà30Œ6ÉÕ¥²`oˆuå@No#LÒŸîË»"czs%é—=Ä´ÀBjŒ›Ö'|#ÌjbÄo}Ï©ÔõÈØˆ¸#gù© ¢Å]K*K_ú¡SÑÂͺLuJ£²H¦C¼»«bŠñnŒK6:¢^GŒ7ÀhO|ReçFdMñ,›’­ll²Õ±¢“Uq‡=U ¬Ã q«®¡Ãf\ìò<’œŠ„Ì© =àÎ\µ¹”1…é‹]aÙ¡¤Ì¼ŠõÍ@Ì2’€™ž¶V8ÆäÁ¢Av¾HtƒèŠYu`'b¬=c,>‹{ùèÃ2㮯䚨´nh'1Ä‹¸‰âr5¼",ÒvÊŒ ¿ÃÔß™ ¦Ç3À#¤ÈÚ#wì1œ‚¡ŽÖáªÜ]§ šdð§«óÅn-tuÔ}7i§O2tH$YûZ¶©8“¼¶½ î¨ÿê™Å h²e»D¯ `ôr;ImR®˜è5Ѷ×@‚9W÷#AÏX4ÌT[ÙT73]š2,7SVxc=¥:GÛgrꨒ, £„Ê=Ê%Cè× ¡ÜW†˜Ý¢ƒ—qFCDˆ CÏ[â ̼PŽ/ȵ¾(-k òâSÇ\›'+%«Q·ôÆPD #%Š"â›Ì)g¬ ‰ïŠ©zg ^h¢2”ÄÏX! ª›tû=S‘6Yoƒ¹n;­¸`kΘËFônsD^ c)eͬ3ýy-Z²y§lcAeû<˜ÌqBãǸìCdJú½»ÊÛ•±ê½ò“5†mÜvêí+3¢­‘‘jb¥û4wÐÃÂêî:–¸gÐ3x¥ËMíV÷új˜/é.Uj”gÂ+ø=}JÜp7V ˆnpPu0@&M=ÓJ„ò`N,yl÷䪽Öõyˆ L”Q'‘°È…ë‚Dï?þ/;„ÃF”› ×Ú0Á¶4ea[SÞv[E­¯€ëΔ›0ƒðnŒ޹8W‚örfbn0c1ß-HuʵW¦‚&6´ Ÿ ¿1Õˆ^„¯kÊ3µŠ$3©"ÖÙûi@o÷¾^=6ÎXýô©‘\x€&1••™×jàˆ±À ±LwÉá{îßó1#…K5ÿÝxÀqOc€+à¹Àìaû‚«æ×þ¹AJg_æþÂJ¿žB¨iTR¡Ž t¯Ï3æ¶-檉ßr³>è6"1âær¼Òõ²èC9 Ë((?¡÷˜¹LÍlŸ»/E6Vö¤ÛG/FØ1 îÈÄzâ3Þ >ÓÉnõé¯f² wüsqùÔ:Ð$Ä, !%0 ™³ Æ*Äæ’N´Lƒð=]îfêŒÌÁ˜³êÁ10Ôðľ«¯mb°€ÁÏ|ì Õ•ã [W:8%, 1þ´ÔñJÅPjtJèª3[æÐÉûׇ7,‹;ÉÞi¾9­·ÿ²û?zì endstream endobj 5383 0 obj 4435 endobj 5386 0 obj << /Type /Page /Parent 2 0 R /Contents 5387 0 R /Resources 5389 0 R /Annots 5390 0 R /MediaBox [0 0 595 842] >> endobj 5389 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 5390 0 obj [ ] endobj 5387 0 obj << /Length 5388 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯè³÷ФД€ À>ì9Xì99vÈl|ÈßzZ­‘ü(©ºH©5òžõ¨›¤ÈzUÅ7úôÓ¿~?½yÿé?§úŸï?=UgGÕõŸÓåÏ·/¡›sÿ÷“kèôïO_N_ž>>}ìþûåéú…OïÿÒýí'}ús÷ï/§¿ý½ûåý‡.øõÉ)×ýü÷óÏÖ©îoÕðóòûŸŸþúÍé·Ëˆ·éúÅŒÿÿ[Ý’jêË2&¦þòt{Mõüç÷~{zsÝ€e³P[ÛœTmê“jk}úï?Ÿ~ê&¸ _ÛZ)gkWÝ3‘ÓÏ3UíIé¶:MÁDÏd†W·Æäüyå⻢ŒUéÑÏMm”qšêËA_™šFww¦ÿçÎMëxêºi.Ë™ Ãg¼¡Œƒ?¯\|WnŽG—äæ¶rýud"¿E_‡—\U&£¨x^¹ø®Ü.x¸J©êºAmIýuôg««:ßàÏ+—Þ”þhñà’'Û¸:#Û¾^~p]U6ßÑ>¯<Û&FϬ„u7\¿iÝ¿Îd>ÃàºÎ§®+ß•þÀÃÑ?./åúà|I|ñÝç§7ß«ú"cìéóOÝâžç¼þøÜm ¾½X‹í}þñô‡ªRõOŸyjÏVÓm‰“OzR½CO4|b,í{¸ø¼êê=|bà“ï£iø¦p´ÄªÛÕW}]ÁwŸ;âÎM—u¥&ßN–’ðþj¼óuÁÑ3ø>1o—sjõAq NÕxÕpž½Iü ù1ñ¸oÉó { ¹¶Ø^3ø´â|g}}†ç£áÝyPíˆçkãPˆœ•øÎ‡‚zÊ´‡žšc;àslàwð†äz̽ÆïCpmø¤Q¬ùןW£?Xç³þûìQ·QóêtGÞ&Þ{tØ/ÀÔ‡)ÒebmpìšÛ”ÈÑüEã\Îe·rƒaÓôVÊcXÿL‹Ê´Ö2m·2MãˆÞ!Ó6@o‡LË!ÓHÑ!Óö+Ó`åi[ ·C¦e‘i¦>dÚ~eÃN;xf’gÜ‘/7g´½Ñ˜,fÁÙQ¼6L!‰yàlÃdäô”ć¨U“ëÙtÀ¼ µý!v(ÖGœ7.¬òfÍjË´`1uu]Œ¥ñÁ):W­¹KûŒÕœ›îóšÂCˆ=qðÉõHësm®%Ù¾©ªÔ™jÛt}¡³Ñ¦à ”Yþ¿OO:‘'µAïƒß´¢ç'æö¢/žÔËGKì›…o wT_ÕBãKÂfÆJz{/øÆá|˜¨àÄFùƒÀ7WÕòátñÖ›˜C\½dlfPAý]9AåÔ-ÍE+Iu,›xý˜ˆD@;SŒ„¶žœ)X´âŒ»ƒ’°A|PRŠ’jÑÂ3•’”DöJb86¬b†ìÃI"“œQfçeÙyœF%àTf¯Ú[H]¤, ¼ë¿SäeJŸwŽB™½2zò¼ ë8ï 7°i}=8¥o¶§¿Ìe–-6©¡’-ðD°·„‡Ç¾×|3<1v¹d]b† ™päñ9aGŠãé0ùÄ)0Ü[Ö›¾›ï¢âľ1ž˜H$@…7o—όرf…b8gËž$¶k~܃Ãr,‚Ç+¸êhUmç¶ŒëUoáhï ÜÈŒjí2ýX¯%¤/¦4ÆAàc5˜?°hàhV޼ĨoÊxü$Œàá%qx Ë>(I…eoŠô‘Äcb4Ž ‰©¶=ÉTý„’‡kÃüÊ1 8€ë` ؘà2G×BnIl¾(sLÊŸŒªµµÖW­¾ß”ÿ ( °/?,ßÜúæZ;Kö¥@„?ÚÛpæ6óšgè(YÄ’Có™á:ŽVáȳ0`€_ƒ!Ê7ˆ³²„Õ”cP$D×ÖÞJ3‰ FÑÞ ¨É¼§2'L·ŽC‰~SOÊ¬Ô ý#YY‰ŽfÞ´ÈW÷F¥{ËùçÔ›o9ë”Wo9tgüó¸}7ÚÖ‹nUg¨JÝÖÏU•ÚòÊz¯ ˆlýÈw¶ÇNæG¸P´)t!ó`É9‹¡'¢!s=lΡZ5°Ð|Q,@ IpÖZ9½V‰l1~Š(s6R$sz*ꕎÔÞ­u^6ȸµK,‰“2à ßJÀ²' XÊ€óóó:D64± È€0•‰æÒ°Œ Z·².†#k¤/ÈÜÃr‚‘V°~µÙž?çk±å4p±DZæC†ªÈŒ™%ìœÑ”7ggIÚe!׎º˜/Z\³ Û’ƒ¾ã]â칬q+êepÌpóEŠ<±¢Ã"†˜NEøÚs÷áßn&{$ãÙ].šÞc奔«mVª¾U7 ú3êÏÿ`@ŸUçö˜à4M@×ø >S\…%{mÌ6`sZR`3 lÞ¤¬”½Õ‚nRVÚ)2ö±‡ŒÍ!c×Mè™pZµrd çÆ ­r ¥RµH¢ IÑ“¨òb%Q0â‘ÛMqŸµ; ¦s8@¸i‡ÓŽêµÕ«×fá“YjÌJT¦kOW%¨óÓ:„{;l™Lø4ä”oˆK ³_u‘‘άi¼ý`%,b‚ãØ*Áÿ¨ 'æO8¿—lZcg×o£Ä:(OùÃÕ ½_9ªúˆTøF²É²ž‚pT!3Y8i;&¢Tb±¢€ôîÌþÆ0'Q¾Tï †ÿÉ’öó [–£ƒE¹HR¯¬ÏOp±8ÛE´ÍA–|ܜބj<¥¸@Áag)+ÑÃ;äå!/y95Úd÷Í¿Œ?yÅ,·™ä0©ôÇùéö¬<ÿù–÷šUWªR­¯wÒãuµ¶l Í8Iš‹“©ht|'¢î°.Êéç;Lâq´á’ÂF8©À² º I»H©¡lI8£d_¶¸íŽ8dN…ÜZŸô6\,{å[±JßB>ÁNšžì¤‹½pä oñ‚t–ùÍ1EjçX%l˜õ8óºdw6*ö±KÜácÉøZ©@z6ÄíöWƒ·‡àÑ•Bc¨ážZ¢4ž WN]NDFö‚…I‹¢¾˧ò«Yf°JÂþ¿HfN!£¨"HØå Ï€Sg½¤f¿Tç1Y<½PF"'±gX&r/ ]]1ivæT&äeF£˜—stŸ¿þÕ^¾vò¾]5þÝoºïŒWrùT3¥ÏñóÓ»oòåD5Wó¸.LôÍ]¿so~¾vÞ~¼“òåÎ÷ñ ñxÐDyÐÝꇿ-Pé^œ˜¢qb âĉÓ'¦Qœ˜¼81EãÄĉ)'¦!NL£81•Ó}qb|çŽQm:NLsâÄ¥ê‹æT³z‰`ÉW¨++g!ý9º$¡È9„V#ÏTC½Ðšó³3X‡,J€¬ÆK…Š?³ÖFæ5ÒëVy"“Ä||Ž?§œá\¹(¹(rÑrÑä"ä¢(ÈEÈE‹‹F •¹è.KözFV„AoÒqÖÛÝ ˜#Gk®û^}Ÿ‘ Nk®ØÚVîE—YWÞZ_ùyÅnauíËn9-êÑ£)£)FÓFÓŒ&Œ¦(MM0š0šF`4•£é>0ºÔ5âªÚ­¿eŽö9gŽ’÷—B~ÝF ­¥ÜCº)ŠtS€tSé¦é¦ÒMÒMQ¤›¤›"H7 H7n*‹tÓ]HwÛ¦ùzcðxöÁàÓ >l£y/ÄÆÖCÀm·n#¸p;BÀ­‡€Û(nÜFp; àv„€Û²¸½¯´q·ìØØh¶ÝFƒ"¥.r°¤Ç‹YÖ™€á›÷eYË*­Eñáõo du¤Ê{…X)ÌŠ3°°ƒbæ„ÿ9ÐÄÜ{â…Ž‡S½å;(öºçÅ,J×y è¡M‡;oÏ’mÓŒçatrHàé­ÌÈcõb,Õ‘‡a±VÀé\õz  —Do{’ Ò)8ê²nËŒ–XõêXó,è„å–2ó»†pŒÜ%é9»õ:ã©Ø%i&9º&.£މˆE^Ûü¾T²™j¬ 2N»5ÆÍ/‰'œæm²Ùâ²KK¹Äºà‚9N{§^R¡Îy‡Õ”Ýj*Ö³£ÃÂÖx‚ñ©rîNÅÜ€£¨…êîé7w ÈBZùh()`¥™q®¢æ0°DОE) LW‘ÜóBöÕ néÚSg¥¼äR¢è±î1Þpåi–ç÷gy8eGYN¹H–‡»dSŒ20.¿ñ³<ž?eF£˜—sܲ<œ¢H–‡Su0Gdy<ªÒŒçÈò@ìÞ§x8=ã²WŸ‚Ñú®o9ûÁ9Cc²26FVÆOì¹ü& «Ë§ÌhórެL#« ž×]ëy½•˜!ÝFiÆs «ZMl ‚pÀûª™íY?ß}5k&šÐ Fа©6QŒ°ÉùD×ý& ì˧ÌhórްÉÄ›t0‡ ûò©f4J3ž£aÛ®Ö„ªo”0ç¸÷æ´2|’дeÜó–ˆ0²Dz¬Ë†k3{+,Ç“A1íD-LÐ@³!ËDWÇd¢³¾¼ê~ÈÄ˧ÌhórŽA&:“‰Ns¨P&^>ÕŒFiÆs‰®&žéÔ%\dÏI#ä4÷½ýç¡e½#µzÌH­‰1RK>‘w¿ éò)3żœc`¤VÅ©­‚9ª‘.ŸjF£4ã9 0RÛLë*NŸsã\—ÆAæ«3¯\ß R¾e‘ñ˜€63ÜOÙk„ðÚ⾇±¢sÕšñ«AŠë6(}–ˆ‰,IY•M> º¿`dUÈ@ñ½¤*Yúâ<¢“½Ž—?Vœ:jødÕö“ýÝë/—Ó‰—që b¸Æ»¿Œkí[sjës¸HŸðZDê —|À½ÀÌVkH ÔÇa“ àpBH .Åd š€S¬(aƒðz%k°‰ eDU¾%sæ$ À-f]ÍÁ¶Wë¶øæçœ9õºÒs¬²AxTVcqbׄA”‰tKQçëÄÌEѬ|òùä*n˜­ÀºrÇ?žÇÒ§Œx^±øäZíg9ª“°ÍJêçÇL2wì£qä©“E¡ |×Xâ$2Y3È¡n"šäÈ‘I•÷´U­ý×Ñ+Ü:_4Æ"ž·[$Ý÷)šC<{ñˆ„7œéÊRþ=8-&!õÄeï0ÛJ=bÖÈÅUجD&œnÃ)@SÆ’"¢<—ãˆ&jÉ2w%-ójò¾{M[¹ñ© µ°ç¨øÞ¶YÖ_Á'¸U>îZ›Yãµí\´}*xŠÕvúLàÖÎ3.]ÀF)¦åõé?q°±gâöZÎ8^u ¹ÖÀó©!ý'žà±Û‚ô_Sú_ÝoÇT‘V¦K9ŸOSø$áhÃ[¢§ÍhÜÀ'‡{ã=`ì(kÎù0Ö–ÐX®c]€/žk H«bwû†çÜÈÚ7ü¤¤6²õ=ÚˆAcøì±ÄOÌÏþ1m¡¢gßÜ&¦PG]™[½pGNÊ'εðî±ú-¬Þ9íèêT-Š©2ºë<lPB&몽•çc …gH|‡ÏÛ›/£±EÌñáÉÉAÓ”¤Ô´­›°ù‘Ôƒ’†i!JÒØã(IIº½‡’ð•B¢”Ä‘}ÄðyT9tG«º¹cç×b>IÄ JR¶„îLi‚Op¬‚#¡à<8v_ô„{áÈŽ`½š„ªI^FI8VÇÀ»ðŽ&¾Ãˆ0ÊÆ89º2q =CráØ'šÅÙkNDoËü“89|>ŒHh%Û–ªººa˜{³K0%•ÔZZߢò‡]òˆvÉD\m™m,8ñP‰èôz½08ñä;šWqŠºÖo?·—>ë«õ7ÝÒgÝ‹‚±žœÂ)Zµ`‰„¦!òWÃéB‹¹g¯XçkZåëŠ /œSxÍ)ýftß[ï²` øŠïñ`]ÓÀd²}N37†¡fYµ"[¸ÊªÇ†Ê]¶”ú°’vP¤ÕoRö´¿Zµ%û«5¾ý•àâ¼-Ä9×:oùêGV7”¢ §“ɦèpúÎ2¶ë«ç-&ý™ÌMTc<gÅá8#8Æàä< ‰>ZNeªf¶8¾£CE‰®#Z·wFŠ^%ÁuN_ºcIžÚǩ̠Ì&°èœ‡J]l÷Ó€^ôHgL‹]wÛE$êUŒè°ßXxD:‘õùëúÜû/T†‚¼ñÍc¦œðØÚ¾ïß¹/8ÊPûZ ÷˲á öĉ%¬¯#¯¡ðhð;½rT‹^ýE—à.ïV|[ùwÐjÀ7@Ðð$0 ô¥¸-Tlïð®Â½ÃTÒ6H¬ÎÓ[[±ïà=ÀŒ)«ñØ AP>Ç$ÞëvëX0ˆÁç]¿ú¾ÕËœ'xm½Uðñþ)h=â'‰-†R£Wvwñ¬«Ì¹—÷/™³–ÅúEVþ¤Rûxúøô1,dm endstream endobj 5388 0 obj 5656 endobj 5392 0 obj [305 /XYZ 38.2500000 170 0] endobj 5393 0 obj [305 /XYZ 38.2500000 569 0] endobj 5394 0 obj [305 /XYZ 38.2500000 569 0] endobj 5395 0 obj [305 /XYZ 38.2500000 170 0] endobj 5396 0 obj << /Type /Annot /Subtype /Link /Rect [128.250000 65.7500000 184.500000 72.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 5391 0 obj << /Type /Page /Parent 2 0 R /Contents 5397 0 R /Resources 5399 0 R /Annots 5400 0 R /MediaBox [0 0 595 842] >> endobj 5399 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5400 0 obj [ 5396 0 R ] endobj 5397 0 obj << /Length 5398 0 R /Filter /FlateDecode >> stream xœí][¯Ü¶~ß_±Ï²/R@QÀDZ ô¡€a}(úP8Mƒ êæ¡¿»«‹H~Ôj4¢öÖ ±sxD ‡g>g¨7þôÏý¿ß¿y÷é?û/ÝŸï>íªƒ««öûÓ?ß½þö‡îï{çëý—_w_÷_wwÿþºkøôî¯Ç¿ýo¯÷9þÿçýßÿqüáÝ/~á×Sîøç/ç?§Ž«†?O?ÿi÷·?ì;õØ¿®füßßé†T}câÕ_wý0ÕùŸß¿ü¶{Ó*`Þ[êFUí•5v¯«÷ÿý×îÇã úî«Cc•rd]µäENoÒÍñ_ÆD/:ÿ#Ôý Û£nVëü,¹¸V”!•ï]prMuÄþYAF¯0¹ßº_AÿƘf½ÎÏ’‹k¥›ÜLï’“kÕ*Hk¿†þûî×Ð?)¿"rN’‹k¥Ÿ\ÜûÁ[£ŒÓµ=Môi’kïõñïÎtÿ[¨4×ÙR]5k̉[ÏTïVœð³äâZé'÷.¸šm¥ÝŠ~øU÷+t®êõLu+ùZ~8Ó»ääjK­‚|Læ–khè} õ›5s–\Z)ýÔ†œÓ –¤ý Ø|Í<øòy÷惲'âGûÏ?e;¿³ýãóQ%õþ»3´fÿù‡ý«J7Úþy×H×½ˆmKõ¶¼‡-~~‹²¨Å¼…½½À–ïa‹™?RE¨EC©3ãi¥~ÿù“Õg˜ô¤<¸¥ª-n…–2ºòj®D©†-"ŽƒÒŒÔïæ·Tp=b * [°åÏdÞ×=g¤Û (µÂ¶¯@øŸÉØrˆ·ŒÔŒñ¬Q[ÃÑçŽ×Ê ^I®`±­âx:y@Fj¼6ÛÑÌ{D9J©ÙÎxÌÆ°lïËyW[]0:Œ1<[xîñÊÀø—õ”IOOYÎS2ìÓ²9(5f O_]sO_Ͳ–·9?7ì]UÓÏ0´ëÝJ§ÂتÆÙ±“QêP[ò®~%Lo,5çóø Z:2g]ë–v²ýÁ7ÕyÜߦԠ–nâR-íÄÕ£½÷†Ÿ±óeÃï鉿`è‘p÷øüžv¥)ÓwwXùœiéÖí,©YÓ‚uPCÙ*ØÂÑ5ÖcN3zƒÏhõÖêÀô+úU‹+3§‰\CàùÁ:À³Ñ —4†&V1-~qhKÔ÷ðÅxACÞ1—„°äGæ Ø»}U­|è¬ÈîbmBî%#Ëå®"³¨±Hسâeˆa´î Ç GÝÏøU†ßa!†3¥xâðŠ…-¸7ýYÎzR¯Œ¥ÆDS‰ñÇ`™iyºµ•ÜÖ¬µÐº‰.àŒþÊû·†Ô}ø·BVäq,vF;¥týÜ®Ï1u¬MVäå„'³«Å"Aýu‘©y$ó>ð`kô«öUð’D0»ò§,ÿº2§³ý¯ÃÛƒ÷Õžèô‡Sªû)í©Š^ºŸ|Ù‘=(ÕhïÕð[fÔ‹yýŽãïwÿ­OíçUôuz&äø[~Ô‹¿ã§ÝËÖ œú6VYW}à”uÀ‡Ãé8hŽ[¦$@‰P¢“(ÑJt%z@‰¡D(ÑI”è%:= DP¢Ë¢D/B <òà–@‰ Pb“(±Jl%v@‰¡Ä(±I”Ø%6; ÄŽPbË¢Ä.B <¸É¤·àãã(¡%”D E(¡Jh@ PBJ(‰ŠPB ”Ѐ¡„Ê¢„– $sD‰ ð‘k”ø%>‰¡Ä'Pâ”øJ|€ŸD‰Pâ(ñJü%¾,Jü”`‹‘Iºá'-G ì•’ì•"öJ öJ{¥{¥€½R’½RÄ^)Á^i`¯4b¯T–½Ò2öŠ‹$0~¶d¯°WJ²WŠØ+%Ø+ ì•Fì•öJIöJ{¥{¥½Òˆ½RYöJ‹Øk&'Åࢡ- ¼–’¼–"^K ^K¯¥¯¥€×R’×RÄk)Ákiàµ4âµT–×Ò2^‹SC1¯Ýr÷C¯¥$¯¥ˆ×R‚×ÒÀkiÄk)ൔäµñZJðZx-x-•åµ´ˆ×Ê­°lN:.€¹€%S’%SÄ’)Á’i`É4bɰdJ²dŠX2%X2 ,™F,™Ê²dZÄ’qŠhu×Ç‚ ¸°Kraqa—àÂnàÂnÄ…]À…]’ »ˆ »vv#.ìÊra·Œ cƲ¥]pãuIÆë"ÆëŒ× Œ×¯ ¯K2^1^—`¼n`¼nÄx]YÆë–Åk9E°°W—d¯.b¯.Á^ÝÀ^݈½º€½º${u{u öêöêFìÕ•e¯n{å`aËx› Ø«K²W±W—`¯n`¯nÄ^]À^]’½ºˆ½º{u{u#öêʲW·ˆ½ÞiI¼^ë’¼ÖE¼Ö%x­x­ñZðZ—äµ.âµ.ÁkÝÀk݈׺²¼Ö-âµwZvº>`Ö>ɬ}Ĭ}‚YûYû³ö³öIfí#fíÌÚÌÚ˜µ/ˬý2f‘…ã?ŒÒ`\êÏ*A~û sËô‹4•£@»™l®™¥²õSœjœKÅÉÅiqx¤Œ|I£BE2Ê ftRª–Œ“oš™ ÙJ»Yøœ¤bFÒ*ÎÇ9|åßT®ýdÅØš5ÅMh&í8y°Ei¬sLëŒtâgU./s_Bù·¸º×¯þ÷¶î½!. -.Ý`8¿ á- ÖˆÍzñºÆ÷F ª¦œS2nûL!Gu0Yâ‰Çó6˜ÊŒOÄ~{K\{ßc C‘ Ú‘©ÊŠãÊ‹¯N†A/Á7MàÆg™_AÙ^‡3B ŒZn¼§çy>¯iaJÀ±ò/áô3VØŒÀMd@×¹¥Äž;úÕ>0ƒÏد`q¾¶¡“ôÂk n#Á#àâè(l±z>•š³«(u?ÇUDúã”iâ×<1®ê@c²{†ŒkÀ3ƒ ³èZœ]KÆm1.-c]ÂSh¿Éº0;ÁhG…• Çbйw—E«ê@Ng½¥1ª>TÏ tîÝFé¾)$–ÀïO÷:Ç–@·g¢MU_yZkZ¢¥[RõA‡ZõñÌ[ô –­S{ª·vI)shg*ân©g4”ê·`Ù*¨ƒ%h¡G£t#Ø[gtOF*ef<Jý{ƒïÁ:ÐÝR²}tÿ °º5‹É –û‰o}\A™›h„ÿF?ÆÁ©DN1ëÛ<¶rÅpW5e%@^n ‹¥|¹bE·IÎn³T2n&ÍT”‹°Þ#û‰4N±¿l‚ðT’Þ½×ß:ä‚çkûÄ‚9׺Ȟ̋ž-ÈÖžMV ØÁ7®Ÿ!Xlœ)rÿp9ÉÛ~}r˜/NÛ”ý¤¨Çxư§ 꺵îœfnª:€ò¼k“ñEë¸ð_\hQ‹WofJ ñ‡OðÇ Áj(uf¤‡Ê²xmBoÿ´wh¶?q¾rë`ߺ*—É™ãú€ç{¶œûü8ׇÜâ-¡«ß¿zW@nv…J¡»'ãŠlÎE?ºœm±ºÏL1¢ûeNýRÆ{@†ó8q†’•pÖ.É.¸f^•‘MI²Œ˸7ÌjD?É‘@–“E9-9oæ´°f‹÷cÔ¤]óšÉŒ”a±-\º†-åP6 µcñéCÁ˜¤õKÎ&…ñ/Zqñ&Øgàˆ–M—œüs YÎmòŸŒ7Á¸X ²ÞÙ†lˆ¹3'ž‡ã†øÜû‚Bç¤ÑB±ÓëÈu>í û©ÛŒ¤Êz£’3¬š³U2[›%縙³ŒÜ‚­Íãd+àU÷¬½¹>‡3°8ûÍk(Ôõ¢s܇ñT™x›|¬ÃåX;Ù*íR™;Øn°,Êm¢ªË/†ªÇÚµ¸E÷n•ä´M=~몚›È/ ášMÙüÖ'Ð8_)Æw!×è™Ì·² »ÊLš$i“½6ë6ip†ð`‡Ê ÙëŒb$i½IœÃþ'’Žs/zm¨Æ® $’¬Z‚$FZ*ë*?†íÃ%þ“+£Œæiš f¶¥›çe®Å·Ð¦]¶%³µàµo>s™‘b»ÌÙÆ1·™¢Ã:2à$ CÊ F±¤Æ¶ŠS¢ :s¬U‚5Š1Ê9JÀR3Â-¨*k‘ÊxW×xÝ e¥Pqø)|NÈ*Ê\›þ ðqøë0î‰ÿÒø_ù 3RΧP8ž».Å^8«ñNŠX|¯Ü´¤xe`fDÇ`úC‹ÇñZ5¶åO¯•ó&O¯uVžƒÞkް<½cuŸÞ±®§%ÝÔ;NL7jxeë²Tu §F‡ÌWXBž©bf|C5þHìåŸ4Þ¾ü<óÉy¬ Ùxü5WÎ7”e/€² —‘˜î¡ ZÊÔÈ'ZX‰œo oþñðÏn®H$l¡õÁy21¦p÷¡$Ý÷¹çæ-lÁ/ó¶ÈSÕª]ž* y \eÖ ÃÔfð‹¯ áX舴‡NE]®Ž/aÜv’Y'œE%À+Z¼X]œO¬c 1l<¦]Jͬ¢Ï1E¥2F~¬1±Ã/ŽºïROXâ´”Zi›Ý&›bŒ¹™aéÝÏ1«{MU)¸ÍhøÔˆÞu–É6 tŠZ‘bÞ‹Ÿ'½¾v8‹ï¦!©ÈŒ'r/Ø1ˆ­é“oÕœe g«!u¥V1¦ŸŒu”Q £7Œ¡8Š#–ú2DÓÍôãlD!ˆ×% W3|i)Ú²n¦€Ïî¢Êßð„4'ÆRhÑf6h3¢<›ÃÈR‡ù*Ä|-1@lïñÅ" ñ,<@Ü ±‰Ú³Œ"9èºÜ:âs"»Åâ› ¥ddc„ b„m:^3‚Úœ]k©¨à ú|9Ÿ¾ $¿ºã#ãÇ—Ù‡0ÅšñbX<cí¬¡CKÔåÍ_„pQ"ʹê?“9ädlQEA,>}WT8å`-Ò¹a]ÙddÄX’½¸]ÔcpÀ›5¦;ܰ=bc‘ 6«¬Yßð@T)Õ„q‡û°Rë¤ØÚ$±ûHüþtÙ_.4f¼9†-X¶îšZE=j.xOuÐåŽ+ÛG‘¿=ó‚zë¢þ‰–nC˜KЭ¤”F[Ùè`οH;™gàx2½µ²¹ƒ‰(bè 3©¼~¸îL;™Þð3!PoZ슿|øÚmE/&Ü”pÜÈÊd‚ˆvC¬ ã™Ì¡#­eÎÞTöýŠCE²Ì2£1#ÎŽzFš£è›“9=‡cUãü4p¤·þ¹ÁŒÈ®‘2Ó“å¶¢@ôY%žøÃ¹ªñŠ+¿7×VnÉýß×<ìûyaÙT¦< ßpÊ)ã\§Æ¹U{óùᬌL!'–ÏnÁ·Éâ²q))Æ(£å*îXµU³ä6þ)2:¥–Ü&~›7ƒ_³½,‰l5âËÝ<±¹UM×¢pTóŠsM;”(åìâª>Tad×þt± Ý7] A¦”£QN­†è¦L¸F•!uæøŸ¯{4Ê)}emÅï#t/»uFâW´¿šê—5ë+z Î!2΄ÆCü†åØ>ü Ç.³®›'VÊŠHFv8¬%›´)[„ÂÉEæ¨X¢šûYøycùª²EÂÏå‹^¸º‹Ó[ù¼ÑÆSèb±q税A²8–T.eb7¬õ°‡%qsËI‹k‰7_×OŠkͳó7Xt^t¯W•­ªö'-GuùrÔä‚õh[){ÐêbÊ„g“q?Ö5òÆ&¬M–D> , V½…‘ŠatBà îpêðh­Õè¿ì>eìþJC…}í¤Žÿì¿;ϾûãÔ/\ œOÉfŽÆ¶R'·µ×¶W¶‚ÓÞÚ—€Jët¿ä^µ´sIqKŸÐù)Þc¦EJ¶ÝH‘çÆDÒ†–û@ŠØáç³c“†Â½ÁgºÅ§f ýÕÙp§¿%î%ݼ›C@ÙÀ0 ;† Ö*ÔFIgeË #|OGSÏ``cdù`d®˜Ì¸úeÔ‰Á?óÒIOaB5nÁ²uD e,à bý)È qKFÅÐj¼¾þ”»f]e½½xñrö¸»ß¹ó|S^oÿq÷@l endstream endobj 5398 0 obj 5394 endobj 5402 0 obj [306 /XYZ 38.2500000 491 0] endobj 5403 0 obj [306 /XYZ 38.2500000 110.750000 0] endobj 5404 0 obj [306 /XYZ 38.2500000 737 0] endobj 5405 0 obj [306 /XYZ 38.2500000 491 0] endobj 5406 0 obj [306 /XYZ 38.2500000 110.750000 0] endobj 5407 0 obj [306 /XYZ 38.2500000 737 0] endobj 5401 0 obj << /Type /Page /Parent 2 0 R /Contents 5408 0 R /Resources 5410 0 R /Annots 5411 0 R /MediaBox [0 0 595 842] >> endobj 5410 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5411 0 obj [ ] endobj 5408 0 obj << /Length 5409 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9À¶Å§$ à{äÀ°‚o6Á"»ÈdùûQ·¨žiIÕú¦H©{zÝñšY¬*VëÅüú÷⟿¿þ§ø~>~Ý•ûÊ•Ý?Åáׯÿ@×ûðû¢ª]ñý—Ýsñ¼û²ûÒþ÷y×}ðõñÏíïþWèâOí¿?ý[û‡?†¿tø ¿ì*Uµ?ÿ}üÙTªý]yúyøóíþò»â×ÃŒýr˜óÿÿA·icféç]¿MuüõÛ÷_w:,[Å5V;](kl¡ÚßÿýÇî§v~úrßX¥*o«ò- Uú¸’õ…ÒMYÔãuŽ¿dfW &7ºJ7ùri¤(ãUtrIÊÚ*àþ°¨<‚NÓ§˜¼6 '?B.Ž•ž¶xö}m2•vö@è‘]Ýò@+ûLøçH«ëiKA’~ö$iZ<¤c¦äÒHéÉ '<ÊNÐÓòˆ8‚^MŸ`ríMºÉ‹c%Ð62»$qr)‰û2}‚É[i—nò#äɈ‹g—$®mš€ eSàÿ4}‚ɽJ'”;ÈűÒÏ.I\ïmJâ¾LŸ`òªJxr'#.ž=±…åjݤ³°^fOA’F'TÃGÈYXxòÔÔnúŽ«R$áýÉ—&¡è>B.”žÚprAÁíÕÉ-¡îWÓ'˜\ûtR¢ƒ\+¶ãÙ¿,™ƒÒý pÌ=G>|ø¶ûð¤¬j‘é‹o?µÀ×ì~|k‘âŠîߎþXü¾,ÍÓŠo?ïš½×®±Q5ñh¤Ä#hÄÀoŒZn Îfá„ï'²Ó¶ÏßZ6INáÚõðTÒ¹‘,šÒÎÓrBùŽ<.§·†æG lrÜӂز#ˆkú%{tTÞá³z_7åùHéŽ#fאָ«³‘N ÔC Ù½5]°äeúnD©~– ¦òjц ð•Û]«ó j´õÈ:ø82Fþ«x¢SXoƒ"‹‡˜R"øƒ[PÃ[ïd“2=«\²þordГ¯òIJTÔ…j¦DEkÀEEÓœ/©Zc§“\CF› ZÆíõP¼¨'â›ðG8[ÝS¨RçÌtD+›ÊÆ\8Y§£ß¥\ŠqÐq‚ò=“¼@ OrsA°˜¦ Ðh6•KKµç°æR¦WÀ&œÚ FYÊte‰)*ìèãˆ\ÄòªB#Ö‡ –#Á·aƒˆdtø­ 7HmƒÐºX‡«Ž`‚1zŸA>„À`¨Ó +YŒÑRŽPÌY¢zê;ý2TÊ•ÈG8['͔ޥYPË‹8Q?@ãâ b°cú<\~Ô Š­Y¾ÁÈéÇÔzÍi;TlËE$5]Jb¨ñlC³žº~ÉjGærŠÉ‚¡Æv–­ )‡Š99£›&6Ö@”>‘"¹¸™1e½™ÔË]>Ü®|Èl$%Ô¬ª îŠÕÊXÛJ0øÆ<‡Í“‘÷‹0˜)`ßÏ¥XÖj*RdÌ=»Étá­×æN‚#Œ:¡Ü²>öË£$yì´ ;çÏ—¼ö˜Çо”ŠØ›!+à“ˆOãÖŒè¼üªÁÈ8ËÈ8Fec¨?í‹LŒŒA²Ÿ¥˜r>Á•§À7ÌŠ Á†EÑ~³ 4ÎÀy90÷%’Ç‚óeà7‘Ì Œ˜×0»Ÿ<Öõ,…Ch(<¶:?zS˜ƒY18C+’I÷yó/ËïsæE¼S˜ÿÉ{‚yFê<\qAvž ñÏÃãOZ‘:œù'*-"œ@Àf 0'(<©x$r‚pþšƒ;…°E²á®òVÏŒ6óû†bÙ…¥´læk.YŒ!È©‡½Õó6Ææ8B×Et*£‡±V•/T5£»‰Ó¤ðl™(—3óÛ{uçå7é‰vˆšˆˆ\ÆûÁë`¼½/.¯/<ïFÂeÅüKί(æoí<æ¤I¥ê7Ð$—­·nÕËX| _%e9›²´D%®ƒžáÛ솱ƒ¥b;Û8Mà Ï"Œ8È럳à·ê+< 愌ðÔª÷xD¢'·æ?Ääòeãoàæß h7b§)-fBƒÈB a¬![¥oí{³1’ü9—?•_ãÐ7‘„µM„€­fÉÃ’ˆY´%Ø~8wêvÛ²°Äæ6V „p±XØŒüoçÅ¥$r‰uF!3Mr9v5EìtÓŽ”œüê}O7s¡\ebáʸàZÎ7=Qé)ÍeÅÙ RBqÙ(ë•*”Íer™ôµÜ¢½'®´Újûi¸Û,,"j "碇* À Täô3UÑ H|Ùrþª… õÒ¥h¯«Jlf2ă´¢è¦ÊË™š'¢Í׸¤q¶°±D‰}¢Ü2bOaAM4¿Ú€Lb ÕË£~£è“«7Òð@Q¥üØî`ì(l¢7Â2øá²TC»âÜÀ•`TŸE`•RÐ Š­Wo5xUÎUµûÌÕA¶ø>Û•tN”&ï4éJgÏ—Üd§É~Ùd§É^ƒé±ƒý$#½!;¦¬öÈ—©®‘¶—fdÃŽ–ÎVÂo˜Ž–x§™â´®lúòÙ8íXëŠ62a®wÔ62¹²Í#~1Æ›‡M8‰†‚½.EüØ2&#cùŠÞl©þ%‰hŒ,_ÆÎA²´\ ë)&˜yµ¦u”—‰÷s¥tå5ÐsuˆÞÜ0­Æ­z.ID:é~‚ éòk-uÅE›í·á‡¶ñ8,Œe¼lw6Æ<À2ž1„DopcDBïX„˜g±s”EÌU”¿×Ë1±™˜øíHWa; #tÂK«ü©¨— ½•Ô³kìð¾ˆcÓ8ª$Ú£þý¤gä2›7l Gܵ¹ÂêLÌ…Qµ È‚å¥h_Š”ÌsCж´}FèÈ© ܦ¾q©Åbp¢)¥æù ò¯~Z*èW蚯PÂ)ï õFØrõ„"ù·¼Ó`Œ-ã*â•HÌ;C@ttÚD$§j3y\r°í7F.ßÒß Ÿ-æ%ÑÈ{¡DÏ•ÿR1–Šx—4m»¶Úiý¦J[? §"/¹.’3Æ—nNÅêÌ›²„é.åbnË·úXåXûn|³6¿É'7Œ­ÏAߤ}hpçâ¥îmXgÆWçiJÛâׯ±õ€©)¡}¾BMgê·t—‘-:ŽX›°flé®W.%no[·0­îý'9º÷ÌXg¶jΗœJs¿<,}Å–”—J&lʈí%šÚ°Z¨m•L¹REÒï™3&7„)”]ÓÉíŒ>gË›q:b'·¬ù¼å.J7?ÆÎZÆHa‚¢Txƒ1”¼ËI‰wJ´bÞ2M#­»‰Ç>€)²SxN#ër0'F.Ñ–ÑÂ8€ëdìgäœëÙ[wJ»j^þ3¡|—Õ&‘np™$é}ä>’U׊Ú(%†zν–G>Õ½$›óÚ2²’KVÞnÆ·ÉxyOòé g!½Ó×Û“Zôqõ\¥[k‡\—eŒ¼q™2¥—”—1™ú¢]8¶Ü—)âæfÒ:˜äúÕ»cå ìhùãy }õ¬”\mÀR°NJՏޒ*àªæäò¬*F*ZF=3MWq51”cV/G׸qî "Ú$Ÿ6™L¯Q‹Ñæi‰ ©ÈèH2]b˜¸;¶«r•¾õ¹$V¿zãè«®6MZ4\Ö]+›MUó/hL5k~1‡k$RMD)nÆŒ½¦¶9ó7|Ó§ÍFž¤Ãù8)FÌp.óbÒU¿•…•êÓ€·߬Œ›çÅ[+¥ÅÑþ[˧’Í×a¼ê·†ÑÕ3Ôr¦ƒW§ö¶ëʱ™˜A]6çäY”‘Œý1Â-)ײ’ÙHÕÞå­p”Dö'ñúN®xì[rA&¸S/€Ygäà ç´îkê¹á,ã+°Ôéš-gØ®Ÿ5½~Åú#‘¬!¦ ʆù-"]˜w[qöX& Ó'"]ˆ7r©<9¢ÊUçÕçÑ¡uš÷αþX?{} y¹dÕ¡«gBæÌÔnÊÓªïç û9¨B6ñÝZ¾Ü¢LÛtvwãúpNÝ`S³ÄNPá,ÙØÈ<´ ·B2Ùbýôeá§™FÜ ²ñ39Ôo­!•@‰S™DMB`0baùËAilÛ[Ù/ æÞÐvÞ.NùzV£†a‚¦øä.h¼%¶5nµœ*õ#}-éˆÝÏíQ6üñn£Â¸ˆ±›§ÿP¯) j[], ¨÷SVÄר$gspâ°Qv€Ã{vïºÙ½¾<%#1~¾ÈñC0>»»Xܶ×PÖ“¥p¬SÇp ‹7â¥&pcð:²Ü‹3^pOʇOthÉÕž\‹å„Ö…j¦Ä°öö½úY•ûN!Žì€‰‘pv{=Ô¢ê‰øæ#„ÀÃÙ8[Ý+ÍQ~]¨1U£vx¯c: ô¨^Ïhõ#x êë8€-˜~o”؃AÝ·W˜˜­„#™:Z{Uö•?²‰½Ãûv°9(ò*vDá…™öØ!É”<â »D5ý[^ÕŽðóŽ8s`Èsù5aÃ?²/‚´\\^IÎø‹°U¸E ã^}ág‰à`<òx„áó=ÊaF;U­0<‘I24;i†:‹¡ŒDÇ Æù†)’ÇQ5¢·’}lLö±¬\& öÉ31Ôm]„5„h7ˆG@Øhyí×ÚkVpJu|Ù²Ëdl:è 0¥K¾Ò½IIF@¯(Ç;Ö¢ïæD,ÜË3Æm°2e+ekm8jø'ÛÙ2—Y³á>™Ô… ™–YŒÝ‘–1–¤ ;ŽÜÒÓö¢ ûÊàÏÓ}ŸJÐ-hG6²b ¡5î… ´fë/åÈ]û–½ìÌ&Î=%lĈmÍX¶² ˜²YÄ«ß^×·ûÕ-üü9q#`^û“u; C ʽ7âÉ™‡£ªÜ/£P•ØDŽC$ãGþ‰nhL®K$çל㌠â…3¼ŸÈáDnH„>L]8† 㨔œÍÌâƒ×Ïз¿ŠçöHGOü—¹¿p=YO‰ÓÞYZíßBXœ·8Ûª y×-½×]Öň{üx$4t×{?JzPP Bë˜9çÜlOa§(»#ìPÇàk¡o0±ÇöðÄ6ž ~T—Z´õWéI,Ã~ßBÜCþêth§aИL™³ Æ*Äæ’ ¨&ŽA¸N°…¦¾Á8ÀŒ9«ƒC OLd_}“²Ñ$ üÍC€~Ôò `ØÂ=qJX@ bü)˜G"(†Rãuc_öÌV¥Ùyÿúðâã†eqÈå šoNë_vÿQ¼7§ endstream endobj 5409 0 obj 4102 endobj 5412 0 obj << /Type /Page /Parent 2 0 R /Contents 5413 0 R /Resources 5415 0 R /Annots 5416 0 R /MediaBox [0 0 595 842] >> endobj 5415 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 5416 0 obj [ ] endobj 5413 0 obj << /Length 5414 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·X 7 `mr H@A'0b#Šùûé…ì‘ó=²¾~µt-Ø#«ÄbñÕÛ×7üü÷ý?Û¿y÷ù?û†Ÿï>ïªC[W—ö§_ß=ÿÛ†ßïÛ®ÞÿðËîëþëîÓîÓñ¿_w—>¿ûóñwÿÛÛýŸŽÿþ¼ÿëߎøãð—Ná—]kÚãÏŸö­9þ®ºþ<ýù¿vùÝþ×ÓŽãë†Ã|ûÿßÙ¾«úötŒ…WÝŸiο~ûá×Ý› ÂÞR÷éýÞxwüOïíþ¿ÿØýt|Á¸}uè½1mãÛê–µöü&ßìí;Y?{Ñù—Òö6·MoóóÉÕ¡b\cäÝwƵ¶ö§‹>]rÝuöøûÖ ÿÜö]Κhm °=masßGÜü|ru¨ŒŽw}áuc/@sÖEÛuûwÒu>Þæç“«Ce¼p¼»"ûn«Æ]Ô×úzÚ=ø[S·ñ6?Ÿ\(ÃÕâÍ#“rk«>"ï~¶}„Í]qóóÉcñnawMRöͨ*¹|úÙö6¯û.Þæç“«Ce¼\¼»æå6§M¢ á§ícÀ¿ïãIøËÉc aa÷Ȭº«ü ¹ØªÑÛÓö>«¾œ\*Ã…Ïwÿ² >ÊåO€íÿUxðí—ݛƛ#0›ý—ŸŽ‡;¿óòãË(õþ»“)[uû/?î_UÆÿaÿåç]hl=qi¥²pÅÀ•wpå-\iЊshÅ¿žZ€A ÏÖÃgà©…Ýà þOí.gûð刎Ñ1ɶ·`Ä EŒ}c~O~j[yߌo}¯õÖ¼ÒWçWºÊ|Kè¦:4­éÚzF¦>T½;¹YŸV.¨ìÞ]ܯS`ì¸4½¸ž±—cµo¾=Áåzܸ0»ì |‚¡t‡®¯Î˜ð´R¡•ÊC4p·Öîàlgl½æÂ{ tª SíÖ| Hg&ÛcÈÎN‚3pÎ—Îøvº †Ö‡óJ=xñéá3¶‡'À·Ò­\ z ÏÔá$Á¼‡ºJ¼‚¡Ÿ1j=UK{d3ãlérÂ%¨¤L>*þt!±—Á8†‰dWpï"¬·…p¥%—ê0öÔƒh‰êLKŒ¡RˆY¯R™‰8ÛÂua©ª®¯Ü_ &悟Ñè[‘*çHÐ0á³0CU·ÄÐL&EÃ×¶êÇ9·5Æí†qC]<·ô%FUÈvjƒO øð°1Œ}ª#…iÇ„ñ`éôµ¶›°Ÿ0(Âiøù¤ÅE0¯ Άq Ó™. ôÒÄWÜ}ß/Óð]®äÙ¶Tå¾T©Ê@ ã匎wK8lµu¦+†•‡­² ÇÚÄ<ÀÂñØùùÆ6ê4 ¹¶Êx4¹©7êtÅ=ÖcƒÞ û…(ž7£I‡½‚Êi8©<ÓºEyª‰Èzöÿp6ÂE» S"“ªJ·ãSöxüܩɒ àØÁö‚;µ sÛ˜Dü*€€ohê3ÍØÙ‰P¤R7U¢[K±d|† :ÌK%˜»ÕFÑ禎äžä³ÓÐÑR˜ˆB–ÿªVFäÊhᮈnøÉj~½¿N †J=cVDVêuLF¦*8›‘ªä2ÑÜÜbed&lJmJ了ª:BTM>¯Yy£Víú‰@Ê_§ÁL¸)yö ±&¤¸«æ­«ÌÄdÚq ï ` ºM1u;OêPÃçi¤åMGIY–ì¯IMî™ ¤ Ü8ÉPHLdÂï8õ”IsL”d‹4¨Rf7|?8Í·˜4Ô$ø__“€0þ;œ`‘0ý°¾)¢‚_‡ÓG0ÕaìÁ·*¼§azdÒoñ©™'H[Ba?¦{ kLuøNq’Nó”Šoóex T±úR{-`èÀa7 Œ;8ÙS –ŽªØûêäLP*–°R0ýwJÜ bìÅï!¨„¡F*é’)na’oUB¬"Ë0ü@Ànø{0ßI˜Y_#©ôRœtKÒ0&a» S ¡ XÎ/«UuCŒ}‹xÆ!UËEñ ˜ÒDnŒÅÌÀ€àƒBj>Ö!^/B' jÇ[‚%›*ÊÛ¸ )ÜI”—ˆÌÜwù~[ªØš/Vp('†”Üϵà8S²aºY…D*•ÍÔ´Ä>§Û%¦kÍDŒeKê¤$F…õGR™U`Þ\¶‰"ɦÇêf>>h±L¶„>ÝÄTå †«êmLc«$VV×OE‚0'ÂÕ ó|[ö¾ŸÚsÑ…o_»é;¤–ª®CeÌš ¥9%Ò èèæ¾e¯ U†hɶœn&]µ,Y=rÜd®û*/ÊÎmÕÚ¾ËzÅ5oæ>×ö—iã×­)hœØ6ÁÌèî„ùžmu¹XŠúZd´Ôã¦?ð{<>ùÄÏÔ8‹ Cî†Oa @ß6†ŽúÁ/¾a7˜¯€ÛŽâŒ½Å±:A·Àä<9ø=%GÚ…h)æHø¶³s *:¿”QÏž©Åp1*ËÓÎ&$¤Œ0¢ ËF"ÚÉÅPÆ*&w”¡m"c\ãËÈÒh½YÄrªæ@µ еÍ2ÆaJZãÛÂP\j™"íM ­uuÌt9s¶-§˜Ê)^lÙÿÒnX§%p4)éS·“¦p çyºˆÕ¥³„#);“º)±nÅÕ®Ë=¢–M¨Gbjæ+ð b7oÁc/´ŒË¼Ú¹[*ô²…Wœ´¾iéÝ÷î[ZÏ|žÞ]û½3G0`ªÛ²w‰HU;«\Qšnø{”mÖÂ-’¾^>Ïvb¿ø¥X0º§‡ò¨Æ£Ïˆ~‚9$>Û ýÒàsím„+•ÕümrVIwÄÌñ0ÙsºS•ËéX8CŒI*dZ•&jR’‡ó²5²òJ2r†©CÃsÈ•'y/eÿ„/`´Î|jŒÇzUÎ5ÖÍf  4üb¾ÁQ{Ô‘&SáHÍæ æPI…ë[m¦"ÝÈL^wO@ù-ý¼“?héüà´Â¿)”÷®jÇÅéZØxÅ|hPQ!&E‡n°ÉC7ØK¤* Í{ n§šÌQ–.9£«úæü'’ªtƒ(¾0´™òÆ\CQLc,L[Kn™ó×í¿?CüÊOKa…FÖ½gÜ¡2'·ÄþI%3PÔ_0¦}Aî\$ =Øs)ßüö›ùÊऱ‡Á-òŒ" TPÞ£÷¸¥"§—ÎöqøRT‚50ÿt¤ Ö Ÿ>ûÀŒðD¬æ¼ðïŸTôéφµ³wúýñÄãÉ¡-la±F o£ÀàŸÄvÁK°ÃP…°ÃX2°–È@8|Ïà‚{é ŒÁ³º 5¥á»Þ#‚t˜ÁàgÞ§ Œ×¬à³ †ÜKÌÞ †ŸàxE1äÏE K³må¿N¼˜Ü0/¶Ï,ŠE¡öiÿi÷I ý endstream endobj 5414 0 obj 4662 endobj 5418 0 obj [308 /XYZ 37.5000000 341.750000 0] endobj 5419 0 obj [308 /XYZ 38.2500000 695 0] endobj 5420 0 obj [308 /XYZ 37.5000000 248 0] endobj 5421 0 obj [308 /XYZ 38.2500000 695 0] endobj 5422 0 obj [308 /XYZ 37.5000000 341.750000 0] endobj 5423 0 obj [308 /XYZ 37.5000000 248 0] endobj 5424 0 obj << /Type /Annot /Subtype /Link /Rect [358.500000 709.250000 449.250000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches >> endobj 5425 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 701.750000 549.750000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 5417 0 obj << /Type /Page /Parent 2 0 R /Contents 5426 0 R /Resources 5428 0 R /Annots 5429 0 R /MediaBox [0 0 595 842] >> endobj 5428 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5429 0 obj [ 5424 0 R 5425 0 R ] endobj 5426 0 obj << /Length 5427 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯à9€Z¬…f4r0€Œ9N`ØF&>äï‡Ý\¦‡äW$¿~Ud÷”[ò”XË«·Õ[?þùë?’ýž||øúŸä{ûûÃ×Cz,²´ù'9ýúpù]Û?'E™%ß=¼$/‡çÃsýß—CóÁׇ¿Öú_¢“¿Ôÿþœüð÷ú‡?¶éô~=ª¨ÿåü{U¨úOiÿûéçÿ>üíÉo§»åÚͼýÿºªÒ¼>)«j`æÉ·ŸêÍ×l~ûV%K>œɬþ¿“?Ö WJ¾ý|¨Ž¹Îº-6#Ê¢‘ÔÀ‘8RÁuJøF#†ØÊá7p¦Á—oõÅz¿“¼êîäóú:N‡!RÀo¾¬¿Ç7“0ŽixÃÔ„Ž…°ÖĈ ˆ/eixe¤Ë5±˜À;<½c³%œ ü€#fx Y  wë …/‡0aa¡óà[f©ˆÀ1WA=J†`D&˜Fd<œÔñ ÆNB´ë§År /ìärýÀó²x6Œ)Ÿ†[qü-V%Bq !@Õãzà˜îáVäÙbˆÑ¯·â6(i²üZB v0p8=fn Ûc˜Ž†îß\ Ûãõ"±*†"ÑA CÌf¤±†àþ˜³b%™AFFŸa”~Ìò šµ˜vÍw…ŠD=Íe¥&¡÷¬9:< ²Ì«°¹Re:ãK­Z!o†Äï3x£ID´7BæSâ“¡¸ÎˆlŒ—YxŽ®ü[MêÚÃ0/ FyÄ/ÇÇP·f²C›»Qé1/ÔÑ&¬ÏÉŠ€­ã±âU¬Èê³ ‡m”‘A~ß/”ÅÕHob쪘ÈñÑ‘Êh:G–i?Z0²G„\n†–Á¥{µ•xtõ.LÌ!µdeF/ǰ\þÝÞ°Ž½\øéHIª ºè‘y53üÚÁ£ð:+Ø ¼[›·L—û¢±{±w¶¡%ë |ë7u-"Ârq›q¥3»ôœµ¯K‘£Fqºj™¬RËeUY(¤ÄO—{Ф´fÂ!æÀÛ@¦ÆAѦ‚ʵò¡™ˆ˜ÚVž†Õ˜Odu¦ªüŸüZV›ËŸürøê-&Ñúyo‰½e=YGÑ‹ØâŠçÆþB2d ÷} ZSQzܧô˜çqçÛËäL¥†LÎæufÕÌÞ‚üºKÊ<>ØFäeY‡ Y~ùƒM$^½…·xr¯/”ŸŸ1Í:ŒÞÌ:Œ5…±Ä2ni"XG$NV<í3ÐÔTCb– vÞ`ÑËh†÷ ®‹v‰æï+*›3p'aø"Œ”‘oDTÞ#QH42pE„›#§ˆÓ~¸e+²VÀqÖK! #ËDUS2R·"²²o—¬_ÝML÷HüOŒ´$–õ0\=ß|‚;(álšÍêN—êï-uLÍÖ ©Ê»k}çQ:Z÷*Pe–îàŽÌíÀl’5ºÛŒê634Ñ0†„51û˜Sã-µ7”ÓÁ=`Ç^›Ó¬t7ôJňh5æÇÐéh°ÂH|³ƒ l-’ ·].êÙ5¹"ŒÝXô©ºÆÛ‰Ã$7ãcȦàbÄ1–Ü¢QÃÂyl\áãöŒøþÓBu1.L*$ó£â ñB…Û¼«1‚KHDn+m„`s€ša»¢Œ’ÒÆdme<ñ|ex6žM¸Ò†Dj­Ã÷¹"­‡©ž±}ÀŠj*÷ ¾ÃáDýëÍi>u†ÌDáf=çX0Ù±ÛûÓ(£<ÆNQ,z€9)ã°bT"³ŽšyÔ/Ð÷gÍ Š~¼³·†Gé¥ÒÌ Å×ò\wG’*~Ï.w‚È>ŠW‘Ÿ ÞŽ2Ùñ_¥^„xYs¥²¾;åZ2EôærØoÊ|`"îRªDÚ O'á»`<2.~¬L0!_LÞñUaÐ* ë®Ëý„ª\rÙãmQà U–3Óõ0O- Λ™«PÕsG¯¸GEj\-~£q uÜ‘ÃW¥Ÿ;O˜ÎÊÙvTãÇ#øÜЏ~>sÃã¬7¯`åwG¥ôâ†qý|Œ}¸·¬ïNÕö×Ä-ˆž÷ÐHñðI1ç"8 ¾m#˳€j‹Þ©öF©vû]‡ÄØ\õÙƒ¢]_Oö¬—À{T¸Þ5„›£# „(¾ÜpÇ+ÈQ ÑÉÄàÈv¾Ðqà^÷RÁ2îÀ`úÁp pY@éÆÎbR¤ôúN0 ð;óLµp6CèLŒL×ÄZÜý*¤Ô*ô<ƯBJ/º¥åÌJ“0˜T©Ùý8(S7~Ý`¼$^Ž]Ç>ßp¡ÀŠèŸˆåÿ±œpàXÀ.|…®®€"5²9þÊêÈLwTlW FÃx6¬Ýa¹‡a×aºw2o2¦ƒ©C}E…|'¶œ§MÑ‘Pï&1oQ¢w2óÙžD[g+Ðä7kE(úøªPÜêÞÌØØ G(KÊæ< êm¦à/›0Üá5‹‘ “BÚ–Ê4»â ѵo¿÷>l¥¶×àØYªn3®`'˜dM`LŠV´+n+×»¹áL©Ø ŽéKD¼ˆcÌÞįX÷ Ü›…;°ø¤„VËè¡[ œqÀkÏð<7 7â°Mº¼Æ·¶çF[eì…Œ<ÛÞZ±ƒ—z´XJ[,çâ>þ„ Uihî°î[©k<¶AoÈ”â«Î$ VU÷lÂIØLΔp)x¦,N;ݼ¢ÐŠ6šŽ¼Z¦ Ÿ¼zeŬå“ì:p”'.Ù­ªeO·A˜˜ MYeä’ݦ¾Áé7ðCûû‘0ôœ÷ÐtÀU˾]Qä"‘‹ˆs‘{KÉTÚiãÕ•Ò}uÜÈvÍn3ÁŸgû½1:‚#Ñ=V»… |ÙvüÙPÆ0ûÉ{Œ‹;rìwűúòæ|,‡æËEgÚª/W™>r_þFîËq|ž=”â]ßfX#ƒU²á3!9©V]:KžfU=‘“.¼¹ÈIî@[ݹåAgh6$)Ì~Š÷H¦ìt•às#–ʘAÙ)=.sÜ ßT°ÂñÍ'¸ƒRr¶VLM}Ó6ö›ˆMè£ö«ízÏŽ›öq¸£ofë¹Oø†A?*ƒëàor8‚¿{kÙÆ*Xw}~×Àï eªÞcº*ÓÓ(nBKuÞ Ô×sÕäWƒÇ#¡Ê†êçãèßÂÇ:Ë Ûlà(,¦1££’¹—ÞiަŽL+ »þö…;Ì}«ÝïFýê‰xQGßÜ$B´qQ°–]Í0ËÂ(ss}$zi¦ô@èi"ÀñÜÀÏ& ?…דAAeß µÁ0p¬CtOoÆ< þÛþùû™6¬Ž^A„ÜazêPì_–YÉö>„Ú†C!D†ì-8΃5ßp´>„N›3õ®ZÞ m¤vÈjB[7ŠõÚWÐÚ§ ÖÉsašêá·ƒhOP¦ïîhè8)†ÃOV4Ó «_®Ë¯Â$Н…Aô‰®h»MîW2CÉê.2"¤MÚÚÞw½ˆÑ‹è¾¹èE¼Q/¢#ãäã1lÞGFŒÇ°eïmŒœ4rÒÈIß'ñs2K{33ŒÇhGÂìGwƒÁâ1²²¯´xoñðM¿Y%c¶¿çÜ =vZŠwÐ0PÇL‡ûŸ—ùÆiÜýƒ)Ô†mü>àæ3gÇè¡°¹Ð Ë/ûèu|ÊB…º_hîð˜HìÄñÃHÅtz‘ö•¶¿Ó\[l ÌÔ6OGÊ .»ÒF Oì,“Qþ‘¬‘ªŒ$Âùÿ¢>LÌ7ê‘õIWlK¹¹5Džr7Nk„õfä…•ê|•¥Ï¯®2+8<Ò‚ÎGÄ N)Ë¥B™1V “غ?£’gND 8QwQÔ¸ÇÄòFQYr_4®ÃaˆT¾¸C¡ó¡¬òã•ÂK²É÷¢v!ÆŒ¾½êNå Ô¹Êû&­­xUcä=Åæ¦Ê]7ö eõƒÈd:ׇf4á™J•sh$‘±Èº[{¡öÜ7ëÙêy˜.ÒÙvøòð>7n­„soˆ¾Ñd|¢Á¡%°œIÓ7bÙ® ð²¬æ±OÔqY—çù“Ê´œ½“`Ñ$›ÓðNîD³ûaJÚ`íÉSŹ L Xö¢´ùPtð!W„9æ¸s'E'˜ãÂ26x6\HïMTç(X‚‹®@ž´=Ü ÃyÄÌ h&Ï® †ãRùöçqàQ@ˆÒù‰»—-5æ¸S¬Õb Ç¥âÂXÍ„â(˜6CjöeißÒýÆû©R3O'ïF?¤øw@ͱÒ:jŽ×CѪ+ 5G§æH¼ï>)õ65GK7 ©9VùʈšcÔjŽŒ´æ5ÛÕáŠÎZ,Ç\®è<=8}‹ˆëÊÄ„*EÌvÛõ—bŸÀ µ‚à‰}¡î.gΑ0¶<‡íNêÍÌR‹Gù–ér(àb(R¸P$†ˆ2"ŽNŸÐ;bƒ2N㉠ʤ$лnPVÿJ^jâ”7Ïsa@*§ä‘©EiªNupÝK$ÏÚ`D1ŠÍk]w1#-#´¯I}lëð\`ž‚XôˆÖ1se#§ööÔžtT ¨ÅüбCÄÆê>>`‹4X+„:q …gƒß´\E­:zñж,Âþ\ï¸ÛùÈ|`"#F o£@kHÁÑãS°ÃP…°ÃXÒ²– 2pì®ÓªySß`` ƘUÈÀPCŠqœ««ï<šÄ`ƒ¿ùÜî¾m¿±dï­Õᦘ¼A ?!xÄbÜàå"Ü™¥Ù"5Ç–ß_/&7Ì‹ÍE|ý¬P{Nžÿhß+ endstream endobj 5427 0 obj 4442 endobj 5431 0 obj [309 /XYZ 37.5000000 629.750000 0] endobj 5432 0 obj [309 /XYZ 32.2500000 320.750000 0] endobj 5433 0 obj [309 /XYZ 31.5000000 321.500000 0] endobj 5434 0 obj [309 /XYZ 38.2500000 280.250000 0] endobj 5435 0 obj [309 /XYZ 38.2500000 280.250000 0] endobj 5436 0 obj [309 /XYZ 37.5000000 629.750000 0] endobj 5430 0 obj << /Type /Page /Parent 2 0 R /Contents 5437 0 R /Resources 5439 0 R /Annots 5440 0 R /MediaBox [0 0 595 842] >> endobj 5439 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 5440 0 obj [ ] endobj 5437 0 obj << /Length 5438 0 R /Filter /FlateDecode >> stream xœí][ÜH~ï_ÑÏHÛq]|“R’™ ñ€%ˆ”eA+vEØþ>îîrÏŒí¯ìúæT¹Üã a¼.W:÷ë»?~ùûñŸ¿ß}üòŸã7÷÷Ç/‡âT—ÅõŸãùÏÏ¡›“ûùX7åñÛ/‡ïÇï‡Ï‡ÏÝÿ~?\_øòñÏÝOÿ;ê㟺ÿþ|üëߺ_þèþ¥ó¿ðË¡Vu÷÷¿/·µê~*nŸÿ¯Ã_~wüõ¼bÿ9·™—ÿÿÓýmÚó6f>ýýÐS]þüöí×û+¾Ru?×ÍQYcªµúøß~ê>Ð/_œk”©ui»ŸÛÊÖEÙ4ºû¹6îöãµ¾}]·ÝUèfôñË™åU„ÅMQÆ[ü²sq¨(S)ÿê±/ÜÔÕhmãJúÕc\I‹ˆÈtÞ¹4Pú놋ŸZ«T]]NÆó‘ë ʪv¤\´t[>ôë:")_v.•þnñê±I¹-tLÞ}[>¨náx~Ùy4ÞW|áJE<Þý´zŒûÖ­¸øyç‘x7^üÔTîø3ùéæü]cÏz¡jŽJ¡œÔPe¡"J§åcÜ{]Äc"×Ç’žÕc3‘¦ê¦l°=-añ¶‰(’.;‡Já£Õ?‡¬‚·rý °T¿{^üðõðîSÇ`:`Vǯ?u›»|óú××(åñ‡NÚ)¥Ž_<þ¾S¿«?¿þ|xüÚm=úWMᾪÕå«í©Òe˜ëeÑ“ÂÀ'á“~§ïhôÄÀ¨ =Ñø<ðɃOá{+jxRøD¿‡ßwZ| nŸî ŸÇÂ[ð@‡ÀÏãÙÆÑ"|5]Â;Å;À«Áóà'xµd·€iã(¦F¸üƒ±Ÿ?ÁTw­1VAXãóxÞÁ»†{3ø¶ .æøA fÛY:Ó&á~ªf—¨»D}“Ua¬Â…0ÐPÖ2Rx—µÅ.kwYû:ÙÖÔó:­N·]T»¬Ý„¬MÅûLÎv <éÛ‘MžûÁ;ÀºÔ¹˜]c .ñIaƒwMȳ]>{a½Yù¬u9Kg)mamí.ŸwùüJùœµU‰÷¶Ëô]¦ï2}—鯕¡•™—é #ƺÑ/eºÀW[ðI[\>iLïv¸¹l몼@aˆ|Í©i‹—O9O=¹¢Ky2ºQKß¹2b{²æš^ÿôäê1§ÒVM]ŽÉ¬Y°ˆb><\ÞÈÔNà²O|ØY ·„hájpoºA«á'·^Ã'fx·Ä :é®Tö%Hï¹0ŒCÄѾ4õäÊ”éaÌ EëøŠfV{€—Œ©Ò«‡Â tÔC8%›ë-¨âTÕêåyøeÛ<ð#J±²hbl HÌ€ b€g5T¼š5áX“#£ÁBc&?¼%QÖ€Cž»…Ë5Œ¢xFÔŠ(K²šæ›ï‡ªægc<›ÅWŠ·„Ù?> þÞu€>Ê Czø;¯d¤?Ö¢CyDzøÄŒøŒ.ðT¡ÄK¦á2ÈÁ˜1„3JB-"8›GÀa{pÈÙdÉQ8]äbJádØ=Á[³f#µx°˜  ìœ ‘öXÍx$€’Of5íÌŠÅûæ¼te5‹Øu‚@¸°ãËs‡£›þbÖ̉)J•wu:÷ÈrBúzîŒÐd &û(u‹óÞs[ܲÕ÷ˆøV#âo&+Ì+‡°öÀ-çHu.Ùi¸nf!’2OÈÚ›(SlÀ'µ½|²,úO:S$,òUCeññÎûËMjíŒ&…{J½QèIwàȬ:é‹7¶xq dJ?ÆN0¸k'(§ ó)‘¢\ÚHálÙ@cc;ÛºøqŸ”ð²z¼L8‡±ë¡¹Â¨åø*ñÑ™h%ÎÀÞ$QÎè ÜŒÔõ‹ä0–Ür‡ÆhÔ÷ïµ`<…žxC$#Èb¯){§ÂÙŒk|ň@Ùýú¥èópÌŽ±«‹ Ìǘ„¬Ë¢©é“`{iÁ“z—MIé?éþÓZ ßÎ-Ƶฮ›É%,Ýlü'inXÝã %\EŒSÉó¢ tè0qšŒs¥nQ‡Ôð&íˆAQL Lî{@¡pØ)À„M†ëÈÖkð…‰qei©Ëdà VX½p¼ f<¢´Ã}Ìã&æžH…hu¦l²¼»«EÕLÆò öQS„˜Aiq"ù'.öÊöYr‘MãÉš`RÀ¶”fEɨDVoˆÐ'Ø}HÑ£lò F·åç¢xùê¦-ANT®e€¶“/4KZ—ÀQ§ofÂêÆB„¸†]SA5KÄ©'8ÌÀ8Õ‰œ…­$_aÁ}GÎÙ°Yk=D眕þ!¢kFUZNGŒéÇÈÙŽ>”À€dzG­nïä7R G–ãe}fÜT`‹*YDzÎ>0ФÊ^\_Y*äcºÂÚå‡õiMê"Y7Lb~"bNÜç,rÔ¾±CRÌ2ÒÐ(³XçÊÀ¸HU¶¶¬!_øžh«×ðÒ®ÎM,騮d˜Õå¢_Æe[ª(›Mð-UŒLþqeÀ¸\§”]¾–“4•<†,c_2¶ÓQ™i ÑáìB)óõV3:£Œ™1b›¡ü#îÁÄIÊ‘lÙ^”˜b–×Ç ‡—qý*ÓÆZ„¯Èö—Q¿=æêç¡’ˆõT±ù7Ü7ƒi²éùNZm3ê;¥tìæ¨ŽKšóo(&ÜêD6Ö#•¬$ê6]Œ1†dkT¨FôðƒÕ w"7¾Ï°5UHæ¦`¦JFV’¬¿7=^Þ£ÇÉvL”­9L›fSP4Í@Rì Ìñ örnÓ®+·ZpÉ¢,šOP•™/çÞTœ"e»Öôýu’uZÂ=Ç™.ù÷© KâMÔ&.myëG#Ú­dÇ1Žm³[U&[÷½îmbJ*þñò õúK‰±­N|:Œ}žÂbL—:{˜áw LÆÓr,|ÇBèX¼ä5 碨ÎÔ F^1 JQj5Ì_ˆw˜žw”¦–ˆ_âÉOë«°Y¦ˆ‘gËa=øÎ䇧''!%˜ùh †àbžÞðø;t0 RM‚³øLÛð ¥aci†¡#Ë]v:õíãhƦ3èSŒm×;»WchÀéê+ k 7Š>Jø0˜]{t$H e'U˜Ûv“°ÇéÞôýõgôl÷aìÅþu|RX žJ›óð'xR^Äè[ÖóÒðNÛî°Z «ªŸªtorFxÂ.M’I…9)÷•¸Óû½cáÕñHG¦Ù&ãÅÌd'Æ'Å»N„;i”HçÊÙoAY‹Œ>HÌù¤ü¿uB ©gaåÑkÄFØÏï´S_^j/Ñ‹C”ªúpèj•òÌ ¦„!vÃ}föHäR·ü*?d‡’"SÚ“]ó”‰I02hÈèâ_6xžÖ5"U)DÃô`Z½f œGMoÂE¶áE'—í¾JµµØRÖ~†Ãœ„‡ËÅC!GOÕ3‹¨µò”îH(k©ùt²vW¸¨Œ¹¸åMnd'>Ž><ª ¦Fñ1M[…ØÔ"Xzb¾4GÐ1ÛB¶CaÉŒ)¡4Ô´còrbc”yÀ0€õÅœç!Tð¾ö@Žø-­!ñ½IÜ9½.#«!Oh¹SEVO6½ŠiO6缉ÙV·b€«hQºßÎÓ>36áwŽ ›òHpl<ãR~FͰ­ˆßÂ"¤ãÀŒ‡ñÇ3Bž0t&÷Á¹¶góñ4mîµÎyÏÚj6ÆY-8ÂÎd Ù}dö$ÌÔå]Ô”§U=¨šøjsÔvRŸ¿ŒÌRÆÜÒ^¯"ã옼ÊË!¨'ž8–V\2Õ§ÞiÑ;Ž0”=r#>À½iôNšØÁUlj5rÁ:Iô7¨+¾ímš¾ÎjI$!¦„„Ö,½ÅzÚûÁf±Kµ#cܹ¦XªÞªøqüûðõÀ˜‰GõÆßIâ‹“Š±ŠÆ˜¹L&pÇklItL•õm{p5Õ`5‡Í\5?“ULjöÒxè ¬ÎCØ'¸5ŠNtêæÝ;I’¥‘8–0îítaUžŠv £¾‡«9]xìvògâyL+] |Ìó…Ò™Ö2‰M£¶¸QüýŒŒê3¡ôà>Á7':Ò¨ ŒŽÄÄ#˜ïðŠÕYc3„ÄW˜á¢êdy™»p¼ˆoÀ¦ôá-†¨h}jÂæ\è/¾/ÉfæË$$’ysœ¹ÆÌ¨ÿ4Ü¡1¶65pyjÛ¬ÎYµ.غ-GS*ÿˆ¨y)“~ {À-Õµ¬?”1ÜEŒ”{óljö¶c3ë§“QT]Vm;›Šb%òUî7•“½„Õ¤åÚù«"É%ªTÜ«+Ó²7+Ó%—§aÒGŸ\2~â8DyÒ£ÔŽ*üǧÞiáw\ÒG}jõK/–# 3ïx±ú’ñw½T'sÑ€íÀÑËÔ 7¼Ü›ç¸ëÞï;q§A§OʙؘYõ¼`×ø;6UgÛÜ:»Ü.däò¼½¥ŠRJÙUI¨P‘hV‰ðÌe&\Æìz$®ˆÙ°”›™±Ì„[x}ͳësxã£3£±åÔþå,y^J ê°Œ_~­ÚÌTnÓ' #–ÇŽi~PŽópS –wéÂ17¦²ŒxGF7"|{úö„kƒ\<ŒòG¸…ð–¨nM¢„ 1xT<‘ìY¡‚Å4þÆF½Á'M/ðÚ²<wdâBXaÇ̰„«1•Ú©²}†˜ÇaA&K“±£pd€I!$hW6¹™â‰:ºÝ‰§‚I€gv¤Šý.77ì£÷¯R,Í­ OÙ":\ãjkªO?3 /ÿéíin¸Öó7 «lqGt|nO;†"†<ž#…!Oô æxŠö.ðLWú_Z5O[¸V➦-;­V+<&|ÁÐÁ\Ï1ÀÝ)pÕ;'ƒ‰¡øN1ÜðÍ\Ès‚°6†ï§Ä0€pÃØ+Ë!±|Ï„sé¾9ŠIØO«²Íì}SÔ º5î ¥¶ZUõì<öÃS0XŸ3C1ggº2¥Ò¾™‰Ü™ð¡¦š§ 9UÊŸôT[õrSD碚pk]!‡­ïì—VðÉ0V†·äñãÂå{ÇäîÏfó}øzâ)çß|F#\>ÜT;w|øè³!àWê¹8¸% b¥¸Æ["><Æ¥ð\ðÄ.ú1ÉÀh¿ãXAI\\ÄÜò1‡‰ŽNŠOÔvk=rYøµÝÄ10ÕÜ2iQ‡„¦ž`a <†‡aHÜ“g÷bÙ±>YQ·a±)òòÀõ>Á|cߦØàr¼tÝáŸý¢ çW¦o(<.¦‹ 8BäòP†MaUa93J†Õ˜~G›ë¿?E꘠1”à–ÎÆ/#¨ë›†sÌr ´o©•"Žý3bÇY/"°˜ï¹ó}–§•R™Â¢©¼L½/•CP/½ÖŒ¸mç ³ÌA× ™¤B%j—N3:{íKAe„{z–156q“ÄRw”Í —í‘bûK·± ðJ=«1y­)0 ¨BY£ŠÖƒ3ÏãgM'B͌ʾÉòò:ê Ùv 6©Zb\}3ç ËMg„0Ó®—ácLeËjt«% –þø>ªj†þnü$›Îñ÷[˜¬>+r^F%prµå›AÙÞ¢+·øL¥ ÅìÊÝV¼“ЦM7Î óߊ63õÐÓn:c =vÃa].cËv1X­ËŒˆ˜i¸~ŽŒ,]ÆÀ~˜ =yn2À¯¾â\øº¨‡‚õN}¢ÉúP1\“a¸S}ý1K‰ãj ¹‹p¨‰ÍâËžâÁ4q'|Ê}«de#d@ã|†øK¦«FªtŒ¸šJ6zwLÓU«r bñ+œ%övYŒÎ-ÛL}9/¢B{xKŒ®"Ö]dÆCب¾µˆGmµ&]Ç‘>rå~Õø‰k §OÕh|&nò€¾cæÌ„©½}r'Ec“°ÝmŸ¶TÌØhÕø€Žôp¾öºLCáÕà;ÎÞRAG¯ŸÐ–E¸óÏÝŽ_²û)OŒ aÀhƒQÀôð¾þþù5¼hlÖ À(€/ÍóæõPæäˆ÷ùMhŒÅØSûLE˜åPŸŸÿ×r®S endstream endobj 5438 0 obj 5297 endobj 5442 0 obj [310 /XYZ 38.2500000 785 0] endobj 5443 0 obj [310 /XYZ 38.2500000 785 0] endobj 5444 0 obj [310 /XYZ 38.2500000 366.500000 0] endobj 5445 0 obj [310 /XYZ 38.2500000 366.500000 0] endobj 5446 0 obj << /Type /Annot /Subtype /Link /Rect [233.250000 269 255.750000 275.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_carrays >> endobj 5441 0 obj << /Type /Page /Parent 2 0 R /Contents 5447 0 R /Resources 5449 0 R /Annots 5450 0 R /MediaBox [0 0 595 842] >> endobj 5449 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 5450 0 obj [ 5446 0 R ] endobj 5447 0 obj << /Length 5448 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·X 7À ä@€‚9N`XF&>äï§»I¶fÈþЬ¯_-졎”)³–W¯Þ¾¼ûÓçìÿõûþÝãçÿì¿ö>~Þ‡º,ºö§Ÿ^þB7‡þïûº)÷_¿íž÷Ï»O»OÇÿ}Þu|~üËñoÿÛëýŸÿþ²ÿÛß¿ü©ÿNÿÁ·]­ê㟿žÿlkuü[qùóôûïþú‡ýo§‡åúͼþÿ?˜BNÛ˜Yúy7S~ÿúÛî]¿UªBöÊ»W­Õûÿþs÷óqaúâÐZ¥êÊÖÅ- Õú´’ªÚ½Òí ìåd¡óÌô*Àä¶4á&?ï\*ÊTÊ=»äå–õýã¿ò ú>}€Éëª 7ùyçâP.Ï~h¬Q¦Ö¥=]ôé’˦Ñǿצÿç¶s5'ºq~ÍEl—é܉9NîÂÏ;‡ÊpáxvÁ×ltUwª«à¿ÌânÍ‘‹›ü¼si ôW‹'—¼Ù²°ý³­B\íeúЯrønçâPîϘN›F«h¦i€í2}€;±ºG§»‹Ce¸ðÉìŸ|fÁ[é~4ƒgLJ_vï>ÁÙî¿ü|ÜÙyÁî/ßvºÚÿpÒL³ÿòÓþÇ¢Pþ¸ÿòËNwXé²Û_7¢[4RÔç‘ò «nèûHåÿ ÞAÑ¢oLÙ}cµjêW³Á]+wPtߨCÙšW³i8‚÷¦Ôy¤:uÞÀ‹Ù ¬5\ç#„ÎS7Rš¶8}ßö_§‡ÛÓ—#þÞ†zGÒ]]C=[t¨wä{ý%v(Ñê1{Ôk†“½8´†#Oý…ݨ¥ß<žGìÁšúõU©X먑ûé–ì F#¦›­Y°0s ¼%e¶¤/Èi«Ó«^²ÙŽ˜á“#0w€®3JO›¼žAÇ:Íâ{2œŽà{R qƒæð âu*âÖÕ@|«Ž7Y†*Řȿ‡³õ,CCKÞQCœ¿0‚Fâ;uÜ6†¨£&<†ãMÀPæ}@nYÚzÄ.“`-Aމçg?ÀÈï@=ŒO\¢»žß!1oXt³ ñõ+ø È1­À€dD<;ÈöºS;nÜ,!n`ë pŒ˜‹we=FÌ¥ÐîÚ–ðæZRÇóÄp9jæ,]8d¼ ñf6ª*l5⨒)%¯³Ãd%´‰˜!û¦UŽzBXaÄ}b,‰ 茚DÐV é>£öQö‚óÜ Ý/‘´å)4­Lmm9«P†.ˆq½-7üÑ”¹ å$(ðnD#ßÃrîF(ÓÑ”öH’Xhu#4ÖNðݾ¿.Žøé—øÁcJ3Ãö·\ÛÏP –‘AEˆ„$dIƒEv†á`z-ºkÇ…‰ò‡X‹©#i3>¾fS–fÄcÙy³—7®Æ°d‘MTŸ6c"/NVÆu 0Ú²þ(@öCs,ŽbÙÎVv;hfbºYµÛ±× ¼¸²m,îÅê·\dfü,Ïøs’ØöÊ1 \õ+H¯'R67{/C@'“C‡ÿDÖ+¡”9ˆ!vΨ*aY®M3òº¬‚ßóv)ÛŠÒìå(ïÜD U†{µÉX1C±²ªˆ[wœSzàMO@λ{uÜ8Ò¢Uà g{"fƒ#Æ»Æ0ÐþçÑpÄà“bèÄÚõûUîâAO?®ÍVÁoàÞ4~ ýÏcàyðIÍCDê Õì~îíNç¥ø›’5~µbþ ðÅ^Vó.Xµ²ZbQ Äì 8|©uy_|¿ ÇIs§ßm}ý¦¨4¼•ÆëÀ»…ËîM“"Ri£.©X©´)m>šÞÆlHÕ H¿s¦ì¶N½…9)–š2§ì¦6·PöXræxDccÒÕVßp'²ç†oÚ…U´Qâܾm?&¬.19?c·ÍvêÈ<Íí\î?›ÆÈ3ñ‚‘,êT@º¬}žérÀ‡Þ¾)ʭĈát0&鋸Ê5‰=„Uñ…DPþÔi‰=¬Dª·c³a “Çÿla›9„mξäl³mF|#ýÔ·þˆ˼œXù xoÓèœX”MrHB¾½êàä^ó§ŒtüÖ×ù¢'çšæ‘nù^sA²Í¶ªGló 6&RðN2'eÌLR8Ã{‰è`áä]F¯a¬5«¬ª%R¼'›†·õÊÝÎEŸ¼šôˆFð{Ù˜|†»ÌJl!“/*;Fœâ‡QAT–YUvÏ4y‘9EóöS±G¥OY¾•Žf3ÅG=<¢H¦ºª¬´"+ö9 3 à÷HÅÀ°ÀŒy®˜Ü-¯¿­ÚJi†¬]!ɉJCfÊ”0^¹°u0ÞåÈ'(¹ƒ¯26Y‰JTÖÊÓ»Q˃o tdÂŒï”Ák¯³Íu*Ås°SšrÄÓ2CÝÞ2R¼·„7“ž4Ü…ëØBr¶>¬6 èÚÔzôΩb DîuÙÈ“â1r¼GˆŒCô$ ­ªRÕ¿ RqX~¯Š¶3|œ Jäv8F0~üòT9–s¢¡÷rË es!¢É¿© 7–”a'Ó…bn³Ìbe‹à#,70¥ª “ÓÙïZÎ<9ŸæP©KùLÜ ‰\ÃoÄjm¦:ÒÌ`Jª#Ý ê8˜9’|?ˆ2R¬á”x?ZEÄ>£æ±/®h‘PWuh¤8]+c]u6Ñ3Kí?çÒ*Ò ƒá†±&Ó㑜í69ß7¼7Çlp׎óàTLHGgg‹Ã?Ê þoüƒãx6È 6.Á•BY§5œ*Ʋñ)aÜ¡|`˜0¾¶ôp#0‘#GÃ-w¾[eg~|WV×['ßÝŠ.9ýí߯ïr˜øæønž¸ó¦¬u1ëÜ"Ó¶È´N™ó®WiáÄc–m«uù¶¶RÖ›Í+#ü·CQ‡ xàV$xÓWÝ\8›™‰EjНä~Plw–jгë¨,ѸjGf nûåóèœ)’©œ@uÏe‚îDÓzW™´YSÍû.?B¨%"#D YóŦ)8fɱ‡òÎ ¼7+ù¾“j} &ásãÀKQñ „ë¼{Gg$3“¬‚g#‚XâÛüo‡°Ô¾lC”U[UÜë«#·o óF95Ò¼­wÒêKyÜ婌¸ÛÜò‚à Qw‡9 vý‡Àž8¯ê “E˜scjãè?™1…Šf,‹„ÿQ)TSÝ€—9óÔh·EÌë=GÄ$sÔvg©4ÓU)ý–2Òïm;¤å6…›¢º€(Ùæ°Š-/*\¬’°Æn-ƒâ· ŠUDœ¹†~G5 bT…ZŸޫqw5ý$GTéÈå%q)¯P\L ÉùêzÄú°gÍñÞ1nLÃ%1À…ƒTY„ȲžÝ­™Ü[êÎBܜçì]ÚO´ÔÒº* -ÄÑ·ÆW2¯ÒíÒà#dÃ(ÛŽõCѲÙ›hyÀôuŸ•çEž“E!%ëO‘ss9[¢ó0’~O²¢D´} Ä¡zDxU4Px&a„”¦%Û… ±I&‚¡²üΙËú˜üCÈ9â-™z›Œ¸„YFéO<„£:Þ5F vÉ<È…EJ§R·Fh"X”‡|@`ñÓ“•6<Œ8²ÛLAol•À¼„iÅFe6Pe¶#ß'WÈXËR8k†þ)™®ä²Šˆ¬@ÍØ4™óÈR¢#…VŸ÷:¯%CmF¢/wŸ3x¥­“°“ ¶‚ÂqÚ ½™}ƒÙ%nmû 2ëÄÚ5QÑ“Æè ÒŒyìöw3郲¯˜±a'ÓeÍÏŒ¾éÑBÈnÌÝŠ:Îæ)0½[ñÓŽÔ–Ö(5tôÃzä“?;ïã믑ñ!¾ÞLH?yËF ½)НRˆËZòﶃïÈzñlc—¿O{o¬o,ÈÀÙ”ª!”£ƒÏrg*£èô9‹^T;usÅÆ«>>á;[‹Õà7gùÖñ Ÿ2V;‰J"W@6¦Õƒ°Å*Ósƒ8%ª6£çh÷…›zá|8Ù}¢yep!½©ÇRz`›¨pmòØœqe=º¢-H×¢àÓ8¬6}J˜pKiÈ—1e±ŽH=ðÐe´‰ädeÖ.@pš½j¯]uô¦,_/y”p;Cö¯Œô€*D¬{}Ów£¸öM ¿±Éi\bñžG£o ¼ƒŽz©j¸ßñ[öZGaˆâ“ÂuzÔ»¶Î<)³N÷”ꃙ ?ÁÐ÷£"Uê4ªêÛaGŸƒmÌvJž<„*,ÖKDV;nd]Ë»• ç%2Æ=&vQ´.'•ÉÀ!Ì‡rïaˆfbÇ0vá8° c‚!ÿ.¬ x„Þ$7Êʼn`¦7f…Ñb£'(N,ì0œÆ6Ê‹ ë“`(·ìDHÞ›ÉÚÎXº·Dól¢ÿ¨b? %d"H’¥Á$çŸqŸ‚ÆàUåˆ2ÆïÐf+"ÁC€ŽU‚„!ý‰ÀJYID6DMVï”uáPˆ}eysëL:ŠŠ•ÔªÕPtŸQ ßJ‰P¨%…'t¢lŠø5]€R†ùhkG…‰…w„ßà0¿TI£éE>¹‚‘˜ÜWHô5…ûyYqwôXvôÉ+e yð7üFˆŒaaW‡G£7!ÖFË{ÐvèRà …"ã2.²z'.S¶Z3¦á»_C)Ĉ[=<ÂopÇx\"=çÞ°xˆâob5j]÷_eÛ8 GrîNË4WÃ;È¢£³1ª=ÃFkò¦5x×xLc2ÿ™¶méw½ÑÁû¢ƒ3’»©/˲5¤DܱéŽÐn «I>™V±ªõˆdr.Ð+œ…pï–E‡•°92 ˜+õK,¯›s @ª4ŸG”cÂä³RëO!_TÇ‘XÜT…Í£äÊVÚŽ%(R:²hEEW<›~O(QXM€çé»q|%µK޲1ß'=á+Á߈HK"=¤¨Þe²I©o8þE¶¡.­„e¼å˜Bæh7¾XkX,™°-\½‰ÝdÓŘMÑÄ}ÙR€±šˆÖÝbB¤VÞKH–·ó”0‚­¯½è5÷áªfôd‡­%¡ê©T3¾"ÆE¥i–™DfH´îJ÷è‚'›¤í`Ù²J9ŸJ€©TB¼ÔÞKæÕlBØí@˜:ÙføBúzƒ2*ƒˆ¢2Ð šŸyÔK&¤^1¡î7‹¸—ò©Y¸—ÊEŽu¢ò5›ï¥¦€:÷|ÜòpZûÛ®*^ýâ×Ýg‡ F‚8mat²™–“M^?}&^´[«‡X¥X~?ƒH¬·lãÙuˆ¶Wé3ü©®7Œˆ*Ø6„€Ñn ì†DÈ„2—¬ $vEÊjÉ:Ç0/‡VÍè ï6/ìˆGQj&C/cÞ_³}QH [• ½ˆ$T¤ky”oû½t[¬L-FÚÅ\‹¬6Z㤄·‹ñÈÆ¢i £òtê¥ Q8b™hHü² í¤b~E½ÅøN ~?¢U^JËÇŸýó‘;iõ§¹ÿ`I³¹FÈ2‡BÊÔíõÅ¢ÖÝÝ5{m¹úŠÍº;«JDNÞp5é#‘ô¡/“÷Gº\3T~@ë˜9»ðµ½}ìOŠÊábwŠ]\±š°GèkÓ×pÄ¢c(<ü¦7þ+¯£×ßÑ–E¸Óß‹‹ù¼gŒ× °º1FŒ6Ìïî÷Söâ¢±× ^F|iŽušÛ/ .졼/oBc,î`gàHOÆæHØþÓîÿT,ÑL endstream endobj 5448 0 obj 5470 endobj 5452 0 obj [311 /XYZ 32.2500000 359.750000 0] endobj 5453 0 obj [311 /XYZ 38.2500000 271.250000 0] endobj 5454 0 obj [311 /XYZ 38.2500000 632 0] endobj 5455 0 obj [311 /XYZ 38.2500000 206 0] endobj 5456 0 obj [311 /XYZ 38.2500000 632 0] endobj 5457 0 obj [311 /XYZ 31.5000000 360.500000 0] endobj 5458 0 obj [311 /XYZ 38.2500000 206 0] endobj 5459 0 obj [311 /XYZ 38.2500000 271.250000 0] endobj 5460 0 obj << /Type /Annot /Subtype /Link /Rect [174 326 201.750000 332.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 5461 0 obj << /Type /Annot /Subtype /Link /Rect [293.250000 248.750000 321 255.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 5451 0 obj << /Type /Page /Parent 2 0 R /Contents 5462 0 R /Resources 5464 0 R /Annots 5465 0 R /MediaBox [0 0 595 842] >> endobj 5464 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5465 0 obj [ 5460 0 R 5461 0 R ] endobj 5462 0 obj << /Length 5463 0 R /Filter /FlateDecode >> stream xœí]IÜÈ•¾×¯È³Îf,Ü€u•4À$`†F{lÃ°Ñøà¿ï\‚Y•$¿GÆW/"˜YÙ‚-©(#^¼}ýù?¿ýa÷çî~~þö»_ÃïÏßžª}[WçÿvÇ_?½ýíöáÏ»¶«w¿þýéÇîÇÓ×§¯‡ÿÿñt~áÛóþô¯Ýý×áÝýî÷‡þ1ü£ã?øûSkÚÃï;ýÞ·æð§êòûñçyúŸßìþq\qø\ØÌõßr•é;sÜÆÂ§< Ç4§_ÿüõO?Ÿ÷•¦r}cwÆ;¿3½·»ÿÿß§?>0,_í;ïŒkmíîßVu×Ùß[þc?ÞÚã×;{Ø¿í«ëºÉÇO¿t–7ú‹{[uÉ?ï\*Æ5F^}ß{cÚãE¿³ÎòMsPÛ$ÿeõw[û„ˆsÚ¹6PÂÕâÅ5o¶î]O=å п,Ÿ`ñÖû„xsܹ:T†»Å«k^ngê w×Ñëò ï}›nñÓÎÕ¡2\.^=±ö}ß'äÓ—Õ\I]µ ‰ù´óT|.¾ïšðü3ùéî1cZ‹7ÝîÂD¾Æ¬apþ ÐY/þòýéç/‡-.±Ù}ÿÓ*§ožû~¸Œz÷ÓQQ=ÀêûwÿQUÆÿv÷ý¯Oý¾±õ°Å$OôÄÂwªÏðÉ |âà“/ñ{«Zø¤‡«uð ßy†ïÀÕ„]Ãïà] {Ãß·àð-à;Å0€O\ c"†µÆD|R|?†ÀD 7|ŒUø;¿hâ­áüñÄÁ› O>?0íäü¶¯©iñNrìÔPý^96æË³1m1¼\Ufl™Çz¸šÁ«Á'x51ï ‚O ¬kü,MTõ' σŸ«a=ã„@§˜S2Pࢶ-|‚©Q€£s-í Ç?˜¼÷Éñ±.#¬Æì€ÐïNJçiß0¥ :¾S|Ò-ã[qN¬+Y0ï¤dQ|ÛŽ2V6£·ÚO%KkÒh/=ëb,CMòQò Œåø; wÀÚË–õN QF·ÃR«<ÖH1-Àï`šN Ws¼lËÃ…úDúa?P\(“Ï–:)Á-ã2sRB#ͦ Ý™”ø:¦,¼kU=MÐ Ty´Œ×Ø£ ñ€ŠR1]Zð@•©˜µâ$¿$2á V#Š#‘íògÆ·•×W’››Ž§äòÙ2·Íh”¬÷îëöÕ‰u[ÙæùhÆî½;Õú¾’ßÙ8ëö]_vú ŽóѺ±LuûÚ7][O±gn¸|€éëòAÜÍ,ïÌx'ç;ôÃiÞ¬êÑ“@cs;±ð üŽíà0”Îô_ïíŒ | ¼¥é}ásE세ô >£j÷.œÂ(øAÔ–0i0cÎHlÜô×'p5a×Ì t„Õ&ø0ùA‹ø{‰Ór "øRÐKŒ¶¿†ñ‰1dñ;( &dŒKKø—PºÕƌě© ^¡ÊõLÃÌpÂò˜kÕåÂx ’8‚}ArD.Þ\ ³ãòÊE„,¨ú¦Õá²ñf± .›áAðj‚ÎÈë\¤ÍìàÉÀ£#Si1Ñã[‹ró¯»Á5Ó6õõòïài|æ°‘0uD¢&•¾ÈÔ,¾ª¦jû¨ú`ôXŒÑI4tˆQ©Ÿk½®-¨¢ÄÆèÓÕ2”u‰õ fØWð³™jß´æÚFÁøÍ—Õ¬Øær¦ÞW½»†Ï'xè3îÏxÆêbiv`>ï[ºØÕf ^8vŸf”ðRBq¢„èk]3Âß\F€2cbDÞ Îãc@ ×R˜‰+`g·À\ûQŒw†… ·z†O³·'f8e3 q¸oìI™S¢á¯–ƒ•¿~ )FbZMº;`|ÍÒq$ãݯ†P’„‰­àï«Õ’Ô,Bh} plÏC"Ë…¼¹³„ß§´Z7âÂB`F\õ]×jR5GtT3Æ#ábˆÀù[rê= 7«nšIZlBB1ß²GÆÁ½a¶€Ÿ`ö#à÷3!a +¹…l’¼|å‰=¡Ìí»v$s1šê £¾K0J RÞSE3¥~0ü˜’"ØUƒ“i4hW°Ù”)maÓ! Õ<6J2y†˜*1Dá;¾†·ÍØ#ضP«YˆÕ¸KóÙlD¿3 ì&•»‰¿“\fgGY&uŒ“Éf¼…)k¸8| %ÆYÌó‰ž,6~±U‚w@xuÊ?Æl“®®Øœ|˜(EähcÚ‘°f"‘"DfL£ë®§>ÝÌH Pûe½tÖµ¾ˆº•;É8ÐuN1Ì7uÕ!c×Â078•fÌ1° W9c•«f„àÊTÃ{[¯e°K5c“ôŒ•H†ðñE¨n7€ —N¶äÿñC+?ìÜ׿þ3!J‹îŽŒ-ë NÆñ„)(çŠN0»pÞ'öŸ1^kÝ˜í¤¨j—Ì™„1FÃŽ(RÌ•ÝÆ¨<ë+*…X“®Á@Vµ›bü„صjÚt?›ÔÎéw]ýɃ,9›·mæI8t½·c›8›Ö;=z'( Gé<’s¡žoî<½ªçvp¾*Ó ·8F–¨ï Q|Rø šæ¾óž´OŽ`ÖŽ0L€û/ðŸúLØÍÞˆjÕý†„vï€p˜YíFσ1¬…ßy{ƒ»Œwnoð<:D1ÜÔp|ÁXðvè+ÊÔª„ð(=œÉlêšÝ$Y>¡Úù@õ@ðâСZ×hJbúúdreݦê,ä¢ÞäyîßmX*9uzbÂqGU•è8£³5R6²ª&"Þ æÜÞ¼ö5茢Áä? C (V9/„qö?Äô’¦> DK‡ßâ8F±ä¢%wiÊŠ”ЇéUlÞhaŽú …X¹2öïŒG(«Öå+Q°üÇ8JĤŠ)±ŒÎUÏófb&n˜â/˜fû²ÂÔÄX¸ð¤IäDìk+ûì«0Ž-=És:k†âýQOÀ‡ñ œ‡°¿¸á;ż‚ñ‚`~ÉpÒ¼únz¿EÛ6ן,Øö…êIæe2AT‹¹°]‘¬$X¿L¢Î¥`r†™‡lQ¾à„i¥Z­½‡ÖúnI*^R†?<¶¶”°•¡2Õ›±ØTíœTÁ´ßÁM±ÉˆÚX?ß#X(`Z á£… ½]Á°ÅNÛ=  èª`  X–)Ðñ(Oþ)Óµ…›ìo_ËÂâ!H¦ÍÔ-t$®^wx3>«üäCÊaÀ ÕÉ%·W š«e(ÕO#‚«§°@2xç.³%''0ïÞrzðy˜Î^™†×eÀm;F’ˆÕ.1 …ðŽn ³Ó"Hw¼d®:Æ´Öe¿&n£Ñyš)¥›8nræpu~¨Ñp8—ȲtáwpF4ŽF2±@#²B­ Îi€±M!ˆÉ¢Æ1Tw%¢¸V-æ¸ûšvûˆà'ûà Qr˜Qfpž Îô‚»öpžÇã½á»W­Â1Öc…“âì=b5‡óŠç² µ6Äý䪅ø-ävåó\˜¼K¦ž¥<Ñ­ª1¾19~~°†Áäú5Wã!DWË"Cûª^„|ùZåÍäR)q¡GÕ<¹ƒâ˜¸õªùÞúEÊxTÍo¡Æ¡<çzTÍWªy«UóªyÖÙªæ«GŒSÇ]¯Q ž$”ʉ­“¨³åÒîñ12:ËëÊÙEBÊa±‘›©DùQæ*ÂP±*#ˆ~|?„àÍåÄcʾ²9|6¬ˆS…­D9® à™’WÝÛfxˆ®ÏêÞi®bef5UYÙ9A”Ž 2XM¥]¡-ÔCár.).@žÇg“`Å1öF¥q§Ìm;¢„^p‚c] ê 8ؤ̽ W…pRÆ SSx‚Ê î£Wz&ùðTW3žôî†r­±‚2ó¤fC7“)ç¾Ó£waZ»oüɬ|½¸hšëÌj!Ûîûn´á05Úï'N øŸï`˜B?k ¿óBôŒFÖ Ò¿¨ïäš]›Kã'Êw”&sP%C6EM¬Rùôă˜y%içˆPŽ(œrBo/ Z—!§œâÑ7£ËÁ63Ò"×)JnáNK˜ù覇b5ŒIžÍ•Á¯ÑÊ$%\1cJrUk¿a/ïn$ܬðàgD€¿ˆw%ÜH¸Yà&"À͈wîJ¸¼"À_¸.œçlñ¤çäýsL(E³Ï‡txŸt`l œ·Èä]l/w[瞈8‚œz°þµ¬¿±þz–õ7Öß̰þæÂúë+Ö_X=Ëúë ë¯gX}aýõë¯ó²þ×I}xnà3|‚gnS¸n|ê‡ y— aï…u}û†ˆƒo±k¨ÊàÉõèÆ´ü`ÜÚȉ˜2¿¬mçÅÇ65Ê\ý{·2וHKGWÐÉÚ‘NÖÎêdÝD'ëft²î¢“µW:Y;ÒÉÚY¬èdíŒNÖ^t²öJ'kóêd¯#³,Ô¢T§I[èù­Œæj!a$¥†fuûcÇn[Ã+ÒmÏ[êø‰ºTä릴(,¹4r˜=U9½Éjëƒ<1©»7‰nªMŠòl¹õI˜TR‹*sÏU$)Só†0a˜OZ†wªdubz„ ŠXd}w[=ë£ï¤ÌòðõjÁ—+r'Ħ›þLUŠDT{ß;ü¶è©W5´tGM›µ—/C¯m}ýÉ’eèpBÑt@h‹&˘vßÛÑXÌ0a¦4Ú÷Gj3Þ5SR~ÞATá8.¸8S‚pñ@î“‚¼·gôN°‰ç`íRËÔPê]7CjªÔ[Å­uÛƒAÖ[Bž$1ò2id*ë7f Â >Pï«1M‚«](*‰üZ §Ì®Æ–I.±©£Û«[-6cq‹:£ŠIY|¶ïVèÊë.L_ݨ·2;f `œdÁTLˆ^u¬]@fp«Õnù†"2 #´åIŠ#Á"š§®[/²ÕŽM ˜Â ñJ%“fªi§z¡”(”ËìÁˆODºIJʃ#t4•.ì8ÏžÁx.a¶)3’YU?yGRTÊäÛf" òî½BéV«Öã  Ìñ‡“ByÒ%HJ”cᛥWÜ;˹˜v™Œ]‚ž™-E­@X™¼UHºŸE.“´µy寒úD˜ù¤BÄŸ¨U0wJˆ wÊE™j#ý´7\–g´ÞƒŠ,–¾– :‡VÃçƢϨÒnðÀûÁ0È6fu‰Ž2x¿+õ¸“$¦ñ–ª=®9œ<¥$ëü%˜q{ŒC5¢ëF0bœv6©[L>êö^Èå<€»Æ. oã@L“ð‚ÊçÀÄ{³(½Sg o¹{¸JÛø[J?Úb?Ú[šdž+x¥›Àœ×9]ÒKÁôo˜pt"šž!+¹kG,½¼é)¬6QÏ VÃcàŽµ¡‰\–êÖ6+ÉT±¸åêj‹w€ á¡ê™(SfFTqXfæpA¼ŸG­öjµËW#o¦æ8ªòQœ¨,8­l;#áö¨9¿ƒ/£Ò–ë‡Ûfðå=ê‡×XB’Nebb¦“£3)ñªdb“°Mpƒ»í•H­5™¬„bõøò¤m”݈å $»¾`ƒâ/iŽLˆEpÝ{YËM¹I…{€$vR©•ëÃtå%ùmf21YpÈuÓU*J%ßbþlBÚõµ† ¡J»T›ÌUgøæ¢wݬ ŠÞo¡OZMW—±Ý}’Dj÷@¦D¥ò³(³õ(ÊÕÙ`‰Â2øÈ:³Œ‹ Û–·j›†ç3qYå‹ã3¡ÿòXñüb¦ÃCôh™ÿºõ¹Œá{÷ä£ GDT5Æ<Ï9¾ 3¹So˜ð|ù¤‡Ïƒ¡ÃÄG‰¨îcäxž;K£yŒlÖ÷‰Xæ7T#1¢}LDWØÄ•«’T“͘¾!]ÌôËàæjÍ2|3iïÑñ‡fªÙ†[ÎÞ¡˜°no­%ivÂìïÝ ‹þué¬ nŽܬ+s;;Œ& ΰ¹o¨Á„³’d§M¥ƒ3l¦Ý´{ ïñüæî ¼‡ô·¤•ÍííK8éDCòrnµÀªÇ¨9g3=`@ \¦ˆ gæ¯ß Dm¢ŽÞ¾¢-‹pÇ?v<ìü3$_¨ða°0JFè)ÀŽ7¼qƒoŸî Èä7ˆ‹•HŒÒ …ïtïG¨¶rûpso1ËbªÄšÎç·ly‰%ï¾>ýwË%0 endstream endobj 5463 0 obj 7478 endobj 5467 0 obj [312 /XYZ 38.2500000 608 0] endobj 5468 0 obj [312 /XYZ 38.2500000 473 0] endobj 5469 0 obj [312 /XYZ 32.2500000 269 0] endobj 5470 0 obj [312 /XYZ 38.2500000 208.250000 0] endobj 5471 0 obj [312 /XYZ 31.5000000 270.500000 0] endobj 5472 0 obj [312 /XYZ 38.2500000 208.250000 0] endobj 5473 0 obj [312 /XYZ 31.5000000 642.500000 0] endobj 5474 0 obj [312 /XYZ 38.2500000 608 0] endobj 5475 0 obj [312 /XYZ 38.2500000 473 0] endobj 5476 0 obj [312 /XYZ 32.2500000 641 0] endobj 5466 0 obj << /Type /Page /Parent 2 0 R /Contents 5477 0 R /Resources 5479 0 R /Annots 5480 0 R /MediaBox [0 0 595 842] >> endobj 5479 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1700 1700 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 5480 0 obj [ ] endobj 5477 0 obj << /Length 5478 0 R /Filter /FlateDecode >> stream xœí]M䶽ϯès·ÅQðîÌÈ!À ääØq#6²ñ!?=ÝTo¥G‰oФº§½°g½\Id±XU¬Wßþñû¿ïþùÛîÛßÿg÷ƒÿùñû‡fßµÍéŸÝ˯o.ÿ@÷{ÿû]×·»~yø²ûòðéáÓá¿_N|ÿñχßýo§w:üûóî¯;üáþ/½ü…_:Õ~þûøsèÔáwÍùçËŸÿëá/¿ÛýúòÆñs~2¯ÿÿÓè¡Õ/ÓXøô—‡q™êøë·~}øöD€´¯¸¦»SÖþ3X½ûï?~:|`|}³ïÿþžüxø¸3j8|\õ»™/V©ÎÙ®yË;ýòÛ™ÒÃáM‡Ã ½>ÃËÓù^~œ¹8U”q*þvÉÍí{w"¶]_Ÿþ27÷8sqªŒ›‹ßžWftF©2£k_8nMç2lüùí9¸ªòÉ£ÓÌ¥‰â™ ¿\rgm3îìùí9ˆßé&ßË3ϵ³áË?¥¼Ϥ‰J_"~øüðíóAŒHévŸ:ÌíøÍÓÏ¿<ØÃÿ¼XGåó»ß7jþ°ûüóðwº§èGÑpÄÀ‘päižàÈGž#OŸ[ñ6*€„®:’°mý'Mç'Ó¹ö8Ÿódôišý¾š×#M{1ûÖº¾{5ÒŸžùú'ÊÙ½5'?Ü!eöF÷êðþp‡æ>lÂןˆÜŽï¸ø«½Ä4%DpöY”¨¢&ô¢åW€Ë3J(ï>˜q,ˆ¨d,ÇáåtÂ\Žoó“£BX [@ôv%ì„\/%ªÙ_ ³·OùOT$ús:T®ÑÝøUGÁQO¼™£?-Ž Õ?Á·ùí›{æØÇtêÔ§ùÒó¤ŽÁtsð;pn \©…tÃÏàïDör|ÓÕ1ø4â‘euËT„§I±aÌå ÜáÈw /7ðlFž!ø2"£ñwàyÆ\nñyÆ´†{j±DÁ³Æ»¥jD¢`Zã¥uDSâYcZC9Yx¥8·rÁ»€éy®sUDÚ ¥k÷¤¾¶Ï’qS›òýx?7¾zÊ£rJ¿¿]èWüü ¡©4ž5#ïàÜ4!qñ.`ËH¼Ò`M…i@èWÆ* ô+>%ø;¢œÙÂbaè¶eŽÇû£± HX^Ãg÷9:ÕŽW–{fç„iî™íôTÜ3;ï™ “½ÒÌÎ axÏì—÷ÌÎz™‘ [¯Á#<„'‹“0$RUÞOg$0»>3eº¥øˆ3ùÕÓ[îÌ+ö'£"T*Ò Ÿ©{nô6s£ï¢{C¢[&]EôªPÊÍ"òlP$@ð‚×á5"vôa7vâìÄÎ[Qשs™©®AôU®™*Ž{âh öŠbbáï´pF<šùºm22‰VÂŽïüc” ùî޲Erg0ga.Cˆì¸éT°ðH›àåEá˜'pè†þã•¶bI÷>µƒ ù)ý‰ÐR¦5¡”i™‘.È„ñŠì«kBAã©bíG!cÇÏ`Ùˆc„ØÁëÁ[L|ç '%ixO#ÚF8‘}cWŸHo¹ImÑÚ-2Ö;JmÁ—hªqD—é#L"êu&!DÊðíèžBóŽRh"g_0Çã•… ²‰2‘0>¼?8ÕméçÕ`κ@…ÎQšË…]È^ÒN¿–Ês{cÅŽY&.+ëË—#JgÀ¾‘ð?´€wÏ€ÙìJgòRòq&¡"µƒJê!|ëÊ23 Ã6“{‘Qä™®dÞ=«c?…+¦X Œi8¡“„ù0‘ Iź˜3,;ƒ¥h[ZRq¡2YºMðLB(‘ë§Äjú¶³Ñ¶SÌÀ¨à“/»j_[+^fÌŒxʹ½Ï@¸xÆÁgôŒŠª›ÚŒ~nv¦:(87Ï¥Ý~èÃ|@oó<¯ÊWš[é“·ØÂ Oš~?ž­÷§Í­Ò8ò¶Ò ¾Íß¹çvÓïåxßœÚòx-âLQL7õGˆ·iüì—8ï|5õÁÅS@gjeËä}…˜kÕЬ"z…1kE¡÷„Ó•&ä"€™D,_Æ(’MD—)I! ")Џü€¹‰&QÏôæ…¹ ¯X6½‘H?äi3Y´Ùoå­r“ÝVaZý6NùOn8L2'séZouÈ-RêŒàȈŒ­ ŠA&ªIð2ùÒïg&çÐÔ¡}ýIÕì'û€FüÆ´{=±P]ú3^çÍ=3 gs£“…èbÛ}*à*kõò>¼›¬€ÛrDäÔÐ}È>[l~ÄÀsnìÊ‚úWÕ£W!YôæY*ÑúJ‘„¯Œ/†€¡Û@v\ÎÔãzpX}¹Ø0+§+tС.Éï~õP*æOeS/óm=Í”Ðîœ[ÅìzÐü03ÚÛét·»žÓ„«âq)3ƒ¬!Û®F×G:Ø2Ôß9f¥TÓHÌñ…ÚF”0 ‰ ©aäL·%È´³€O#}yތơ0'2’‚iRº„Áy—;W'w(Å`É* ·,c³és½ß"·ÌLí¹Ù n~X¤É®Ÿ3‹\v·™Þ“ìºÛLœÍTÌþanq×y“DbÞ–“¸ ãæÔ|ÝDLÊfFLfÎOm®t]Ù‡% §Bkêîú¸»>Žo»»>Þ.ÊÙ S÷«­å Öã¥ë…œ´ìj•Ja'‰~ g7‹fÑÝ3Xc³. K%dûP9΢ôõëÐdól ÷ª2:ìBªm?Ý)«©7ApY“^Ô‚³SçÝ){Iθ´¾ –V%_ªø©Õ-„3Â='€¯ÜZÍ»lM‚°“p‘܈»ƒñw2ÖuBuœ,ˆÀ•–&ŠÂlÝè%!g‡ …9ïÌ11¥Ru€ú+6b¨7E«¹eª{EÕ?%#X‹j…Í, NÁ#%ˆð> &kÄ…‚ÌBèƒ"<[ ¸kíëOÖ„0†3ˆ@Êzéeö§{ôÅÛžÎr-ÂÅ#…€Š1¨­ð¬ Hf ù‹iYƒßÁ{j E1¸1œ¢ŒiwÁ‡Ï x‘†s%D}J¹Mbý_¨‘‡HEïu^¶ŠÍº/ŒùˆXÓ`_(~fôT›ÐKŠGªYˆ¥²#`_y±°:Q`&ømË𭎲—ΫÆÃÎéiÚPÑÝÀÕ܉¬w¯Ý¾Oïvÿ")…ÌÂëBàºQ·Ð´aÞú*‰ˆÀe’Ó™D$ÆÐ£h€b­ÍÊDÄ…3ÍecG¢W ʰ]Të·¾f¬?n‘‚µdõëz)»Ã§!+»×j5wÉž‰íé@ªxg½v¤w—-ù½½RðŒÉª'æY*³®·gغµÁï¯*5w¾ª · ŸÈ–¥l;ñ·V& T1?Ïu_‹®9»èf<÷b¤¥ú^žî½£S¢If H/#Qeï"”{ »îª7Iÿ©—Ǥò`Zˆž£zýÁD|“Ûxm*?ñʯ NŠîV’šk±øÝð,;bÄ>>¡LKÛ¼/åWHÑEv=ÁÛGT¦¤!o¿—N×›sËÓ¬K"JL&줟CÖý*‹€3jœW3à £§ä à‰b0 ,œH뱪ö{ßvË{¿}ÇiW”„Œ:·Ì¥xäÆ0£ní¤F }q« ŒyÏîÜÚ*”9Cû–“Áˆã½‡{R ÓÎb~ÁM#0W²ûgf$;¾=Õ ]® 5ƒšP-ÁÄ„€t¼Îdÿ»WçsGekK‰K~„¯Šw8ÆÆ’¹÷¹ÞÅõ™ƒ[¿·æ‹=°~`¬™ÂÑüõM¨ZßÏMƒr,‚üE¤ž}}à³õ•p+/fãÝ€{9>ë¯{Â옄Îel¢ˆz‘m’Gú^QAó{"µêËS Ì%©bo–¡ ©PË©òŽMj¼t‘ ¿xLÝõs+œ¤Ë¤âTF"m”*+‚i‰ 'kãôT˜ ‹ÛhZœ„ŠJq2%^)N…ëј:ÄJM g )àÜ"m¹ñÜDéfÄÒÒa®GçBå’ãR‘sÃD‚ˆ:²¨K»lO¯t;w7_’›oR*ü~ÂñÛKf|áT,²Tˆ>wéŠøl±ägÈžH¢ÛíÍ·ó¥00°C‘xµö¯³“p´‡°j˜£[LV=ÚÅZœb3FMG´X޾ì’â¿*Å;–ت'D•°1„óÀqéÑ+oi‚“/¡Ç˜lnòu¦ëdÖTt '<0 üØÜ€4'°»L~;u6Öϸ"Õf×®á”#3˜þí]$Þ™‘µ÷Ͻ¸K®ÇšÞÓoYØ^Ao1ÉŽâÚÎrØ˼3~ýÉÖ°¯sÒÆŽâÓDÜÞMº÷ð™=ã“T7ÕêÏèmž¡»ýЇ#>cÐ ¼y?7‚i€×ã½?vú“OGðÛðJ½˜{¤þÎØÏ{æmp=Ö‘õ´ðmx ÝÆNß2oóѵü®Bc»×ÌŸæX¨n„RÙœÕB â=Á9ZëÊxj˜`£I½ˆ‹mU,JyûàJÓûÞåÔ?½ ¬(O LX›/O:úÄ3¼Hia-&ŽÎ(¢lo I Iùp¨dYÔ F2g°V–+%°·œ_1!dÌ“1U­Â‹hA5Åꯙ7Þ»ðrV-Û`Ã’¡XM®ˆ¿î .t…A’î;)Þg“ÌdzQ~‘{Œ1·…‡yµ<­97¹Ù¢ç€Iždúá’!E ò.gܬ 9€Ií¥ü2Õ"QyøRÚø.°”ÃVÚ-‚2äe‹mÔk.™Û’'8‚‰& ƒ!QD‚À×ûŠ¥¤œô‘)¾¾~H_—îàYZJ!fyC>aB&ëcúë¤MS[|C¥Ì̈#:ûLþ9&³-é+<ƒ·ÎÀ*ÏßÍDö,3:~WÅ[»8ç$‰(zÑí7£­ð à É5Õ²g 1H7r°|!)¡9ÞA|Ä:9ÆtQoe”"«ññú@ÈC†ÿ±ˆB!±x/°Êœ@¸†ºMça3>O½'8é6eB\$¼dΣޮSßµ+„å± ³Î-eû1Qs¹¹¦–^6h˜}*d†]Å‘W—.Ô¥¥ÍFD.ŸœØFNQ>inÆ-ŠmdFºøÌ䦌–,ÄNF¾ƒ '|ô3 …¹l@>g„…¹ŒgG˜»¦¨ªžœhTš‘¡Ô†Z]DP6÷Ê8ÿô ¾Yº&m,£6™Ë@å ­júÀ·aàyÝ.RÈ¡†Y$°S²‚uçù4ýf?IíЈٴ{=¹YöéÏøðÜ3üN;Ú'¿çŒBž~§9›À%:–ÌŒoÓp$²<7‡ž FfžiáˆF´Ž|Î:B7üÓÙr{s4—V=™³Ûp˜¢‘À·…63o{N_©7N•¥Æ>€û3ç$ñžµXgÛ…P½Fô1‹zWÀC/i¼¹ëJ)”‘êMg§iÀLÚ±lŽ“¨Y+wï:“I/”gBÁ‰" ß ç3µ…ªª¡‘P{ËCZe…®1¡ŽbÚÏáS€ÓŒ¸ &òÎ@0B®-M£Š>@ꈦŽE¨Ãàª'¤ŽUoPC-I…ƒ‡ÐÈu¨ÃhÝ]{$m;† öGrnÃQC€oa¼1„5Ö ŸÑð™Â7Gh¤™õ±Æ~+ö¾{­0°9|[ƒ¡»1P;ÞaÈc˜/1÷8i''ã`œ¶¼TË”S§BQ”ÃQ“w[GWåð–Ml΄Å#·Ä"u#‡XÖý—Ðã‰(—/_•z©onlM3˜Æ†\ŽëøœùŒçÔX³úœfq¹gÞ ®_¿A|N΀šê‚0â’êþ&ꚢBì¢M°²ÀNåôyê64P õŒžZþ t9Ã>õSèÖƒêl ‹Uf?3Ó~^4¨Oul$êÏ)÷[¿a—µ¿v_‚$*g>-ý…‚¨ŸÕ¡Êì¢ç0ß¶ãt\â‰i:ˆ®÷ú3z1rÊ»qÓ߸PïÝQãÊ>¢ï˜%õÜÜžýJQüËOò vôºé=¯àà"3ËPømðÊUÒÒ/à+Y†{ù}óµ¿ÌçÓ0œ‚Y ‚øYà±ÞWží2CbF˜n´¶µv>²ðm^ŠÏ=ßæ#~v eñÆ=!‰ƒ?¬±ÀÇ„„äRKnÖ´·á »€u`jט½ó—gVcy‡õvs©ð–”ÝîÓÃÿ@›– endstream endobj 5478 0 obj 6446 endobj 5482 0 obj [313 /XYZ 38.2500000 482.750000 0] endobj 5483 0 obj [313 /XYZ 38.2500000 482.750000 0] endobj 5481 0 obj << /Type /Page /Parent 2 0 R /Contents 5484 0 R /Resources 5486 0 R /Annots 5487 0 R /MediaBox [0 0 595 842] >> endobj 5486 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5487 0 obj [ ] endobj 5484 0 obj << /Length 5485 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹"õ‚~È!€a99Þl‚Evgùûé™–Úc©¿’øu±Dõh¬'ÕD‹UÅz|õêŸþ~øço‡Wo?ýçð¥ÿûí§‡âØTÅùŸÃ㟞ÿ¢lýχ¦­_~yøzøúðñáãéß_Î|zûçÓOÿ;”‡?þ÷óá¯;ýòÇþ?zü~yh\súûßOw;ýT\þ~üý¿þò»Ã¯o>×Oæûÿÿƒ/|WúÇiÌ|úëðL÷ôç·/¿>¼: î+uÑ´¡>¸àÃÁu¡<ü÷?>0¼¾8¶Á;ß”U8ýÜÕ¡)ª¶-O?7¾ÿ‡ýxS^¾^v§­¨ëÉÇŸþè¼Þ鿼uÎ%{ùyæêTq¾vòÛoxëºîL´Ç™$Ø“áõ)^^U _þ4suªô.¼ýØçšÇ¾E”œ×ÐVÃi.Û$º¼>ý»¢õé6÷iæêT6¿=ñiîʲI(¾¿½>ņ‡®L÷ò§™§ßÂÛSoxÕµ Å÷·×§xyW%|ùÓÌS‰ïéÛ?ƼOåü`g~|óùáÕ܉˜õáóO§É=}óü×çQªÃvFÓ>ÿxø}Q”î‡Ï??tǺ¬†)žG\@#…‡#oáH¿ÓÂgJ4âá \FJ¼ž÷päAƒñsóç¹½ÿ|b ä{âÙ9úbŠx¸fÝÜÌ}%¤¼0‚)_ÁgàÞãgæ>o·ÃÝé¾{Ãé†ë.1¿¼&ö¿ ΀z>Ý«óÿ.Çnàr_ßÂå«ï}ÑÀgÞÀgðԼ àJK¨­ HkÌ˘û<œAÖÖ‡%—WÕ,¿p Œ¼Ä”×Éàfl}ÌZQK?bñM˜çXU{açØÍr,~Æ’c;?PkQUÝâ°î'ì>—¡½PÂЧOº0\ký ¢›ºz¢Â˜ÝÚcÛßôìvmä¼ áü9e󃼃#5ñ€Þ&Ì¿­A#=[+­´wƶ‰ˆŸÁK÷\úy²þX…ºmnËdÌnœfuôeënç;¼ Ìwp¤ü0Z Ãôó Tê vɤ! #˜ “c†¬ …ñ¹ÂË Ø[YR½ï1ê(fgo |›;k&燥.ŸABmV¹r¤ÎzO³?cJ¨èA€¿Ã0°0ƒõC„Œ˜ü"BSL~iO WùKpFŸR{Œ¥Ü•²…sÃëÁz@EÚ3ªi¹* QIùdX>Y‚ ‚7쬨k‰‡Êê2Ó ÷'³ËLIˆu8£©á3%¼˜çÛ$ËMÊÁ矹æ`ë ÅõÕh„%/\:‰ DQÕHI™Öÿâ] ùÊSߺ=Œ½)i·;œ~}ûvo:¦mq[º@Y³à“Á$a«'7…-Âi²âæ2É}pÖØÆ¾ÃØÞxO±…AØ­CÐvÆgs·.Å;.a]bëÅê>”%Bì6éEJ6ŠrÊôê¶Ð¦=4&RÕí<79¢{juå­0ÂØ5_â·UXªnÒ²Êù®æ­yGi†w5_6³ëÞæˆî]Màh?ᢠä[XâYÑ€o‹[ÖÏq+ÝïÅÚ÷b̽ã1_o÷^ìC=¿†MŽl”/y ¿ÔÕF8;~ö¬oSOèFÚ7.%¿_PÜž˜›ñmëWéP–ó»µÉ‘œýÁø6½gìÙO30ŠÜ³ rð`Ýc¶Aw›Ç¶ÍlƒõùÿåxUr¿Öùœ¦—cõQYØKºgìY†6ʦ½G6Rµ¹×ܪ= @âKêl2±N£{ÜþÐÝk&зßãöò ¶·§"à/*FP¹{ÍEô&cU0ž?\ù‹9 ÏZÕBØ#ˆ *…<|VÕ¥Uܺ3Á¸ªºÁíÍ`\QxuQè<âÜ€õ°à;þ¬v—@rà×S@B{ |L&‹±š0Èr((mKÁ8r7–²UúƱ?¾Fn²Ç%¯Þ€lŸðÉw£½ðS àB3p5‚X|Þ¯€öÌÀY«Î-=o¨ªmá‰Ð}f ¿³>~´€}ŒÙëå:CõÂCÆ,‚pŽ€€Õ@ÉgØ-k†WÅöŸÅ[Db¬!TnmO–1ÿ‚æ¹]=W8I¤ñºÂ­ÜÄV}R6x°­™&˜þzwKÁ÷3æYCVà«©€­¬z…£,]ÆÊÀ÷Z,™ŒO ¥U&/™Ø‹FŢϪÿ‘ncŠõM«®M”âVÁ –VzÿcíÜì&Nd{ŒÌen¼ý,ëRgþÅ_éQuƘ)I#§ƒJ(«B3ïÍ;h'Þ}GŸ•Ã)Ua×t¡™P·jÙØê›ù\!L^Izç_q¬·ô†…{Ó1·2Æûß÷Ür£–œ:Þ˜„9›‰a¼‡,¥!Ç~§oP¤·}È"‘žK4¥[³Þ?»îí¡U®Aãú®ÂÕ]k/&VšhÈÖ _‘1¨@Ñ,›9ë‰Ã*ÊéuxBÆVVøD½KÃЛŒ£Xi溩Ҹw¬pNß{×2»³oÍpGânÝÐ!Ö#þ];ÀðÜàDSÐfíÁuW¶Ï]QëÆ}ÿIWÏ498WFz©Žå$%£Ï /-¼òLï®pþxv>{žõ4Òoosô!õþrÜ;Ísxímg/`}ô®¼*…£V*|§€sƒ³(z+®:ž¹u݈•RÏTp¥5Z0ëÎÈdlŠËÁ_˜râèŽÈmÆžoƺ´ÒØ`ì ü6UO>“¿‰¿Cy &–ĘpW„žTɺ׵.#Ið¦c›k¹eE%,'5Ã0ÌнJèZôŒÝ®›Bs®ÒÇ£ëf¤TW9–Ó«;ø)ÖÆ§m²ŒŽHý7Ëҩ଱ë@×ÓA|FÃɔ¶àgt €îCßl* ÿ^7!q¥“pz4V¬k Ä™”ÁïPõ)#ž7©ƒµÆÔÇ1e¬/ODÚlL *ÞÆ$'I‚ºÆß¹w{„±3ŒóFd2rOØ F¾Z…‘›²]ZžÙbÃýó²€]÷qoS¾ ZÉ+]—ÔnQeÍU«Yx“;‚À)„YÁð•Äm:~ÖÍZÿ´`Wq­¤êKú€\u,ÆÒ×ðmçtwWC†Ê·ªÆÚ7Ÿ;NtX?bÄh !]‡Á1Îå ­y§‰·@|á…f]$ Ù§†n©†s/5Ô’ªáƒ©¤k4G,²T—»(¨¹jµ16kBõéŠÁÛ›öú¥µµÍ’*]¤6 ¡’ [Ñ€@"Іöœ VáFÝÄx“0™Ç14ÄZ#0uæs̬r2¶ ’­e˜7Ë¢1§NЋ8ÕÔÕTÁ=¦Zýª,™\c&V³Íš)|rhTóé"t™¹¦Uý}„õjæ ‚¶´6²vi’<©kõ Ò’H7ÄÕsrS²~* ûdèNÌÅ1ˆØF~õL/ãpÓ’œ*rÈx^V¼KT¥é5!XÕs¸×a—PßÁtô†ûƒ9„YÞí>‹+NÂÂYS6 •E‰¿“‡%R¾šÔ*–ýYsÕ÷ ²bš_†íæt£ TD]73ˆpà ÑO«$sLëIϰ‰;¦Çà]¨:&„GaY¨b—fÔ_ÞÉI‰>"rôâ’× áÛn¬šxèÃE‹8¾I,ñŠŸÃbÏ-"Ê´:ô›²Ôb¹º¤ÓÓä “L¢ÌLœ¹ugµów’ÎFå9¯~ ±)ãJ™çÜ´cý™áµF£š*aÒ€ ¥p„2ÎÎÙhU²J²¹F»QÍø¡,‡õõÁ Âu Ø!Î3ȯѭîÛp¢5c· "ƒÏâM™Õ\‡o$öc¬&mS·<{9æþËÕØYû4œ}Tm$ãdVEЭ)½t] Ù5[K‘²Õ‰«Æf˽;ž"z³éVªRPc“ûŒŠ‹—«ay¦,é0bã;²r×.oÅ„¶žŽíVX•/ÇœÂ4ÐUàëT™£ßÛ¬J%#Ê«rv­Ê׊çZa^© AQbŸi3¦ÑŒ'±¡uCÏa5œ7Ð |Š™ ´o©„>/…Am]8MG¸2öÓøƒ'ÌT¬r¾hì–,sÚ”n­Lšeþm2„·m$|”=•ˆ0Q’ö›l7]X1«OLÕU`ÎIí»ªÕVµæñ;Äœ<ã«`âËÿT,›q30þˆp£‰Œ\x*Aa¢]ë&+E­UÊ+žóÕøŽÀ$Ãá_Æ‚W­m‹Y \FLƒM&Ž0¹Q:y662£w–øéšrvëÖ¿ oôn¢ê«.ÌJuÓ(ué†-l&PÇ$@­ØÚ¸¬ÛÑÉTæ ÕŒªÛ.Ÿ¾åáÚv¹©°g÷غ³Ÿ.A"¬¬—“ƺ~KpåÃUiPe”ǸZ± ^FŒƒ–ÈñÎÓärh„,¯Œ¿{ÉìRºÕz+:*ƪÏè^÷^kióhKåm©„XžF¦-áÛVGm. vÙú¨s³¨€6\ÑtI¸b}lEËÛ’¾];ÐóF߯ØÎ¾¯O@ö„ôžÁhíøtc)‚G Œà6Ýf8÷qhúdéÜ 5YV2X:jdBx"Ø(óX@ùÞ£$V½U¬Zx1Û¯|55‚8¸ùsCLŒM¡qW¥fÏ€%°œ³ç6%BÑŽ´$C°IJÖÎØ&I[õ%1öÞ©…D¯M¦À e™:8 ÍãòO¢”SHgÇ…ÑD¶eÁf]-X÷&Gp"æ$á<ãƉŽ;0@I¥f…I^…’\¥Ë!„ÎÞ†Aˆî;å^‰I`__F+K|l½`ËŠÑö¸àŸ(;xÙêœ1'ðÀéð Pcã=ÅšŸÐï­Õšÿ-mk|6w«¯3;-À{W…KéŒÊBñ  ²[I¤•ÄØ5x„ð`[Hø€e6Em&Ò»¹à¢®/ow ®$ÊnÁí\PÖÆgs·àÄèá·Ãœ•§9kŒØmÁo‡AúY£ l¹¾=¨ ý‚íÁÝîÜvœÑFƒ…jžŠ›Ñ•ººMalH‚/ñÛ*Æš±›³oÀ3äA¦YÞ‹ë0»îmŽèÞ‹­˜qäÏGQ±…G¶x¶¬ŸãVºû ´}˜{çZ Ä}'wDëç×°Éå;.q_¥Z þN+ÛÎÌ‹éÆÈ§s“¥ø ÚëB«¨§ðJ)_Á½BÜT•wîÙkpúsøzR.¢îù8÷,È–o¯)&ïü±pµc‡KõtoË\+†9¯µ¹’›~æÒòX>5ÚR¡žŽøwý3}íÚ³}8ÏàZÉÁ;ô Þ¹}èW:)Ÿë‹9p]Sø6¥NÖõKŸ,°g' ’‹ ®,Ãá·Ágú2µôg¦Ëp?Ÿf<Ìü=úV‰qä ”Áï à}í…[XBfHL9à֔͘÷lw>޲ðm}=ÙµgàÛú4â°„²xãÞ#‰ƒ?\Α^#$$—ÃRŠyÞ°g†=ªM὘~fK,ïp¡{®ðæ”ÝáãÃÿµá endstream endobj 5485 0 obj 5547 endobj 5489 0 obj [314 /XYZ 31.5000000 217.250000 0] endobj 5490 0 obj [314 /XYZ 38.2500000 633.500000 0] endobj 5491 0 obj [314 /XYZ 31.5000000 541.250000 0] endobj 5492 0 obj [314 /XYZ 38.2500000 633.500000 0] endobj 5493 0 obj [314 /XYZ 32.2500000 284.750000 0] endobj 5494 0 obj [314 /XYZ 32.2500000 215.750000 0] endobj 5495 0 obj [314 /XYZ 31.5000000 541.250000 0] endobj 5496 0 obj [314 /XYZ 31.5000000 285.500000 0] endobj 5497 0 obj << /Type /Annot /Subtype /Link /Rect [60 505.250000 94.5000000 512 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn2 >> endobj 5498 0 obj << /Type /Annot /Subtype /Link /Rect [60 497.750000 99.7500000 504.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn3 >> endobj 5499 0 obj << /Type /Annot /Subtype /Link /Rect [87 491 147 497.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn4 >> endobj 5500 0 obj << /Type /Annot /Subtype /Link /Rect [87 483.500000 163.500000 490.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn5 >> endobj 5501 0 obj << /Type /Annot /Subtype /Link /Rect [87 476.750000 136.500000 483.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn6 >> endobj 5502 0 obj << /Type /Annot /Subtype /Link /Rect [60 469.250000 142.500000 476 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn7 >> endobj 5503 0 obj << /Type /Annot /Subtype /Link /Rect [87 462.500000 109.500000 469.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn8 >> endobj 5504 0 obj << /Type /Annot /Subtype /Link /Rect [87 455 112.500000 461.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn9 >> endobj 5505 0 obj << /Type /Annot /Subtype /Link /Rect [87 448.250000 129.750000 455 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn10 >> endobj 5506 0 obj << /Type /Annot /Subtype /Link /Rect [87 440.750000 144.750000 447.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn11 >> endobj 5507 0 obj << /Type /Annot /Subtype /Link /Rect [87 434 108.750000 440.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn12 >> endobj 5508 0 obj << /Type /Annot /Subtype /Link /Rect [87 426.500000 159.750000 433.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn13 >> endobj 5509 0 obj << /Type /Annot /Subtype /Link /Rect [87 419.750000 129 426.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn15 >> endobj 5510 0 obj << /Type /Annot /Subtype /Link /Rect [87 412.250000 154.500000 419 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn17 >> endobj 5511 0 obj << /Type /Annot /Subtype /Link /Rect [87 405.500000 125.250000 412.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn18 >> endobj 5512 0 obj << /Type /Annot /Subtype /Link /Rect [87 398 165.750000 404.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn19 >> endobj 5513 0 obj << /Type /Annot /Subtype /Link /Rect [87 391.250000 125.250000 398 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn20 >> endobj 5514 0 obj << /Type /Annot /Subtype /Link /Rect [87 383.750000 139.500000 390.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn21 >> endobj 5515 0 obj << /Type /Annot /Subtype /Link /Rect [114 377 192.750000 383.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_shared_ptr >> endobj 5516 0 obj << /Type /Annot /Subtype /Link /Rect [114 369.500000 176.250000 376.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_generic >> endobj 5517 0 obj << /Type /Annot /Subtype /Link /Rect [87 362.750000 195 369.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn22 >> endobj 5518 0 obj << /Type /Annot /Subtype /Link /Rect [87 355.250000 108.750000 362 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn23 >> endobj 5519 0 obj << /Type /Annot /Subtype /Link /Rect [87 348.500000 144.750000 355.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn24 >> endobj 5520 0 obj << /Type /Annot /Subtype /Link /Rect [87 341 119.250000 347.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn25 >> endobj 5521 0 obj << /Type /Annot /Subtype /Link /Rect [87 334.250000 130.500000 341 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn26 >> endobj 5522 0 obj << /Type /Annot /Subtype /Link /Rect [423 313.250000 465 320 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/octave/) >> >> endobj 5488 0 obj << /Type /Page /Parent 2 0 R /Contents 5523 0 R /Resources 5525 0 R /Annots 5526 0 R /MediaBox [0 0 595 842] >> endobj 5525 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5526 0 obj [ 5497 0 R 5498 0 R 5499 0 R 5500 0 R 5501 0 R 5502 0 R 5503 0 R 5504 0 R 5505 0 R 5506 0 R 5507 0 R 5508 0 R 5509 0 R 5510 0 R 5511 0 R 5512 0 R 5513 0 R 5514 0 R 5515 0 R 5516 0 R 5517 0 R 5518 0 R 5519 0 R 5520 0 R 5521 0 R 5522 0 R ] endobj 5523 0 obj << /Length 5524 0 R /Filter /FlateDecode >> stream xœí][¯Üºu~ß¿bžœ9âE" ¼mï}(`Ø@‚>NÒƒ '¨“‡þýêBiF¤>Ž´ö"¥Ï1{t!)rݯ¿þÛ×ÿ>ýÏ?O¿~üú¿§ïþï__ª³©«á¿S÷ç—ë Òžý¿OÆÖ§ï¿¿ü8ýxùòò¥ýÿ/à _?þGû¯ÿ;ÉÓ¿·ÿûëéÿÕ^ü“¨{à÷#Lû÷ßú¿í¿ªéïîúo/ÿù‡Óß»Çéübæ¿Q•¶Nw˸1õ—ñ3EÿçŸßÿþòë°Ûfi*g¬= ­ôI8-OÿøóË_Ú Æá«³ÕJ(#kÝþÛ5ÚTµµ²ý·Qþ?êäFv³×®]ºê¤MÞÿá>Çà®Î8x¿rö]Ý€ÉÑÛ7…k*c5ü7qn{jD¥EÓB›°§P+4óßlv›¹ýæ¢[-´¬fþ²e ê2/DS^MyÒ§˜p¾ †Íu¦ ÞÜwá§–za춯ºlŸôÛ'ªaiöt½PÛ2¸¯wrf¢j¿!Ó™…cèÌÚ¥‰ÓõBÅY<[†c˜>ÙµçåÆEÞÇaÚõàØÈóúSó¿ ÜÙ6þ?øï÷ Šhå$¶åY)gvZÓé$ïQ‚:q»Æ)/Ë×¼ŸaðZë|ƒ÷+gß•AIÞ‚4º®Zùýû}›ÖR©~Ój“ãHÆÑsISç¦nåÜ›2w88~G+¹ÊkIŠ»½~{ùõ­¥.íV6§oi×ÖÏ9üõ­Ý’úôK«-ÛJž¾ýéô/U%ô¿ž¾ýõÅYK¼ç;Õ¼óŠîHßù¼}žÄªá „…k“pŸÐmÐÞ©àʪñ<î5Þ7ùqû„|€ï4ð| p+À£‰ík£À›¤@"Æü=ø H; 1XáÓÆ¸=¼óù[Kè³Óh)CU™i4¦*ð<^0Œaxá¥ÞÅhe˜vè ¦(‰y«Nœ6¦5^MÙkS:èãàóS‚KÉiº%¸üã/…’"†òÈi8ÀwTÅ)Áá3M¬²OIñ¶¤X†ÞÖî0’÷3ÖòÊv<£@¬ÀôöÀ¸ù”;ËÉûŸö“{Jlìahç¡)1A/Þþü–½1E;Z©2”‹²¶ì4 äÕ´(:X‚>É‚TÈ™ÃÐ#[çœÚá1bœQø¬b(Ç«†w4ö+Ü3Oßö¥O¹“ÛÞIÑšn»tÝ݃P;fÚyŸ0F·©—U²X¦®†eº€¤‰êÜaM}µmÃسuU¿ÒðHõY«!çÃ!εnf£yV°4š„wÌöèaÕê\ ¸Ú\…FÓŸá÷(¸;Ã;õYI+æk«ý êp‰ïÑð{4šG×ðܼo‰Uàj× ¢‚G<[ óá;R<ÁX:[‹?ž Š1¬¾ÁUÃ;軓ØÑ«O=q`˜„À;ò-œxüáù¤¤àU{OЀÈíHa'þ@¿ØœŒ¨iN$<'R#A[óIð 0塼ƒ‚B­üÓ@s"Œ²j¹Ê¸$ãQ $q‡ð¥ ¨‚w+€ßsH ¿Ça+O¬,‡•x¯8×¶åáO'HâÓ~¬ÕU.Tò”õ¹rj$…9±»·„mÉ+o= ‹‚$–Ä C "Hñæãyð±<áî@p—`Ëšr‘+#JʱJ‰Ï†è†í¼¤àæÚr›wEÇð¢Q€y?ƒ¯Ø‹é¯Ø wÉ¡99a¿eh.ÐZŸöÂâþ&>‚6¨D€A ‚W’àÖXNRô!ä%h6ÕE{AðVQDÍÄð‡§&Ñ ^{d«þ‰0AÄ‚IÄèW€bŠ¿´”Z„ç A“D+y®ÙeéZˆ¶Žâ\Áïà=$ VòH2ë—²9°nŠ‹1ž´¸cÕƒ÷g$ÈÇPŒI7Wö*¤¯‘´˜'(ÞÞ 6¨õŒ‡âÌOð\Þ€ }ˆ$|‚äïÒf~Ó&ÕÂ`ÀHKöJ«g”áNøb ü>%bƒ&G’Z#p…4 oΖ5®?¦§ÅæM|´ØðI‘až‡Mo`™ƒ³°ç5ª08=˜âã œ”SXV1^P¢•`4v‚X ïl3úïoÉc M˜Q±í[¯(ŠÎzý“H—XÒzêžÙ"•0;bÏ Ö§ ÑŠÃÙ(§R*Î},Yaš:xzsD !Ó!\׃0ÖœeýzÐ…u·?fí(Éw‚׆W€i^éF§œæZå¾YH·Þ@¤ö¡†N÷eíN%cÕšO‰¥ˆÍÆ©€T J$P«¹X¢Äóäuƒ&œƒ¬é)¤„¿Ã :¯Hv3òzÉ@”ŠSŒlØ8|•#«VG¼ñ©Íu¶¤ÄPü‡X:–àYé$ ›’–@Ø”-–rV—ðƒ¦[æ·ˆ aÞñѤ- …¾3§È—J|ƒ¨‹Y 9ÅQ¡$ J-½Çt&,½³ga/²B’ãšô(ŽGŠÜN1IЄÊM¨NÀ›‡KÙƒCÿ÷Ê‚M$o–*-¶{ЋÄ\ÍTÆšZª¼Ã;üœL~fjâ}übYÔT°¢º±fµ't`Š™‡âÉàÕÏww"ðª]ÌM (rØu©ŸGaaÖ‚q07oeÍ›jjB`Âg[ˆ–ä#ÙwÇ¢Ÿµi¾I‰î}ºçvtÏñ¹—íI¸% ‘ŒH!æSŠê<0"‚¿pÇCy}–‘ÕÃnG¼ÁwzÇ·põy8©«wðh>G¹÷ýrçu=‚òìb€8sV‘î÷º}ÕxXFódvimð ß!í|'±¶RJ“Ôc¥ÝDÂ*ÅÜÙzR¸> ) «ø{P45æì×»Œ8â”ïpTÈ¥,–”ÌMÑ}÷·ü–ÊÛ1“LKPßgë*%êÑrX9x!/Ïà Õ:2£ÀÛPôŒßª›îÏcô ˆƒ .Å 7Ó¡ŒÌÑ:ª&Ž"”äm[Ä\Ù™ÚÊ+Üó¢_)òø ŠOëÃGf+Ì^(‹e­­´ÿæ32ìv`™[„YRE-‚`ÅËY)¬§Ól/bYÀôÖØµžµÞW¸,¼ác\Ÿú¿®îƒè›»%z’x%Ö ×É!taÞÌS{Ÿ7@uÐÖ”Ã$Rª`΋2ãÑ6[vròÀ¦øÎ‘<¹E ¼Õi²ôx:dä*)¸’Eì¿':rÙR*IO£x³XÂÈYx‹T};ÃuNQ×pEqí#¶”Ãß»1hÖ¼)0KÞ\’séŽÎÍ—Äè©›N>Áìa‹½-½Ç¤fn¤ÌœD›Ð+)$kŸ9Š1WONˆ3)%&ª%åtC<ÓRE)w·@±§Ž‰ú[e׫BnüdVL5^u›µ(Ä3”UJ±¶îQ/ÝôÌ•ÍðÚÂOÇSTÜ2°Xáq³5à>„ƒl˜oszqNõVÔ,•e»YÉlQ¤gìnóàvœ…¨pf 4¡¢*óuSüϧªÛH»¡(yù=pI±q…Â~Ÿ-UiÒÞñŸ& Óï=,“ša¥3!ƦÁ\\”ÐIy?®¿¡×¥2†g º–“(|ºÊO¬9þlFÆRvðŒ<Åð”g†ü½ÛWPé|o4,e@,eùO)¥s!¤í¼l¢¬ñÊJ¥ ÖøKïËØÈ2¯²#s¢iBî-¤ñõí HµŸXÊžì.ԋɸO«&+¸iÙ)`”Mi‰b«x°ÒöÌ’ ¥ÝCf¯ÉîB)³æ8>:uÌiµM@4˜{”‚ JîýcáJµ™UÍT+ºõ÷Ë‚¾§¦G,uçŠå}S6…ÅËËZ„“BøIZ(¯‡²6Þ{éÁG6iÓRX;Å›OÀÊÆÌ(TÙæ-ºÅþŸÙ|L2ðñÝ*$!R¬ ”}‹K¾¼‡ ¨˜Ÿy÷Þz‡öNàl —¼u4JuéÚRŠ´}–ÖîÌÕH÷4âW1Ík/¼wÙÒU(a•½¸åŒn²ψ@ ]/T?­«&fµ^lz·ÃX!´ºàSØçQòyz ¼Ý aÆJ”$!,œTI‡îAÈÉÄ\ÄÅv÷[•Ê ÆQ”ÈYJ­¦8öŒ7…xC H(¾V¬Aô‘y J¡<”0iÖJ]¤ô (Á±$vå~PZüî_Þ’ãÓ-uR<¼”É·Vµ„cpÉD„†³Üçþ&¢G“HÕ”(n&^«"¯óÀ1,ˆG9pm¦›…ùXºi+¹Øê«§‰úÒ{Ä÷f2gãÛåt§Â°2`’g5ìT¸Oª:ËJÍqì–|&õxkÅ ÆÓñªÇÖÏ.ÂXñÝÁó¨W¸¶pžÎT稡8\µÂ§ðv (1yj¡–͹[ÌïÓos¶¶:™ªûËa‡«îÔ¸sýíÃþÊ÷—Æž…pÒZ1=e®G s´Ïûßu÷Ú)|[Gsèöp%ú4®teþß_~{yýÃlOD´'bf‰ Mô†ô¹ºÃ»ÔtÜa‚8QTU’ÈFh JQËn T|Ûï7\yð­Äwuáo/_߉ºž#†n–CÛhÛ+btO™ëQÆ_õ1´^B ­¢9TŒíµq¥ú1¦9vEŒztºùº ²)ûß)Uo[@Dø‡¨Ï• ø!ö;½nÿZŽàïÄõ…ü“@.ô0@£ÇÆ u BK]ÃUÓ^Ç+ßÛ—*©ÓSÊ͆j„ÓÕÃh8€Œ¦‘ý4óÅtOéù0z>Íoú—uQ:gm¦ÓĽ/YƒQyÓÕ'(¡²V·çuˆ0[ú(¶ÿµ¬«”N„Ç=%fV#¯UòZ½„¼¶ ±ª½!o÷”GÎq˜ñ§ ×Ê%äm¹U8ˆ‘·JχÑóivE^ëò /¡ÍãþÍ$x-«±ožÒƒž"ÖF=VßLÂ$Fwů'#®ÉHS]_XKFšJÎÉHS©2ÒTu€ßÝ•ŒôO dbfü)çd¤©Äiª*š¦ŠÈÈ𔞣çÓìIFšj´±¨’‘õ!¼Xã!kï#!WS9x:ý²‘b¦_6R.è—Mdiz£È\CìŸ2×£Œ¿ÄL¿ldµ _6"4îtWBý²™4Êq”ùwì«_6r¬Ì ÔÇX=1¼˜ÁÛr9¶Á“ÅÁN±¥°ŒßÛyóš;‡®ŸI'øk-´£tPÍ.¬–tH-s^´ Ùvo¤ ˜{÷”çþã0ãÏ*”[’” §Q6–ú§ô|=ŸfWé@O^isŽÈ Ï6ÚŒ¼RÌ.¬µÚ ÖTK Y‰o%šAJ÷”¥qÿÓOsµÚ.ZÚ¼º+¨õOéù0z>Í® ÖÔþ8qïû*;¹*›ÑÁ%e}}a5T@¥qKP™?oþ˜U÷”‡ºq˜ñ§  Ò˜%¨4¡1§»Aeÿ”ž£çÓì •-sš¼:ËQÒM(‚¥TL”Éë+Öáe+.ÙÑ'&Mu}a5.9à’³ ¸d"€ñ6€kTèŸò¸23þ4.¹f —\dÑpuŒKýSz>ŒžO³'.™J½Ãby“Ю* ÍšÜÃ’-Å\ב2FÕ[ÍÐW#¤©F÷1GoBH#š9Ba–²úBö&‚!»§„›†6s„4¢^@È® q8ŽrxJχÑóivEH¹"äÀÕœ6¡T“Ü___X „ª€P5K@é~Æë~3êžò@63þ¬ Tz U¨ÉvW" ìŸÒóaô|š]POYÎ8@a¯r$ÛGð}1~QÈ„u”–)ëi…}Mª×VÓŠ:X1õRÀЉ”wSÇ+ýSžÔ³€•qš ­¨—VLš"º+­¨§€•Ë0z>Í®´¢)·&ÇœˆFÔ'‰¹ —d=Æ4£ŸH6öúÂjŒ1A”ˆ1KQ"&2,G‰ôOyŒ0³(‘qš Æ˜¥(cB3Iw%Â3E‰\†ÑóivÅs;J„c°98*ÔDɘ [(5ãx >J'­LÔNÊ\_XM\ñaÜRć‰ì#ÆÅýSåÝ,âcœæBÜRćq‘µÇÅÃSz>ŒžO³+Ipö8$7÷“’E)`¶ Ü›QÛë kÑÀ 1GƒvA h`#«„õV‰k(îŸÀ|fü)æh`Eµ€¶ m,Ý• †§ô|=ŸfO4°ÂÜDƒLJ ¥‚mÔ)bIÙ`B=p6Rz(.Õ1|ºÐg)VÈÍ{açŠ[ôÅŠ)t¢™]XM_T:aÕRè„ NVÅ¡ýSž~¨YèÄ8Í…¾È¥Ð +CóYw%¢/r ¸ £çÓìJ_Ts“¾0³Yòö&1`6“USXGí®/¬F„uØz)¬ÃF¶[ÇaýSÌëYXÇ8Í ôRX‡Õ¡e¨»¡žÂ:.Ãèù4»¢A]—FhF&å%a)Ò6ç§ð³ØzŠdq³ ïˆE–Ü[W·þñç—×â0-åP—Àš1(¤TÛà ÅíH L0v$º’RÜ(¡ÈGAôÛˆÑAN8£ÿPÙÙ…‘CñÃl7Ñfï€ÝÞÐ`ÿ~Ñž•^mè;)­@iÜ2ÃÏHú¯#bC˜ýQpöçcÎ# rS$ŽÓ×ÖJÉíÒæR²«–"q\d%rU‰Ó?5 î4Ìø3ˆÄqÕR$Ž«B›Ww%”’‡§ô|=ŸfO)Ù‰1Ç×ËÙfaé:•ÃDº†$àZ©¹,Êb” $Ý"Q6ô?¹ËRu»E¢07#ª·éJNŒNoí ’Ø“æd“æäRLš‹ŒjNÆ1iýSžÜÊYLÚ8Í…Ë¥˜4'Caw%"ÇrŠI» £çÓìJŽÕTˆ¢àQô,Š»y£ZîÔèLõáã…Õ ¦ƒ&§—Bš\d¸r:iêŸò ¤g!Mã4PÓK!MN‡f¸îJjz iº £çÓì jõtÐ8ÃŽRc‚À´7´¤`.ñÃZÞ™·fµÑãêK±q}a5–5A”k– \†AuW",k¦0¨i˜ñg嚥0(ׄaPݕ˚) ê2ŒžO³+–5ST@1©Ç¥¾7XìY”„lŠL¾’Íè”Z^_X É6ˆÞqv)zÇÙ0z§»A²¢w¦aÆŸAô޳KÑ;ΆÑ;Ý•’í½sFϧÙ’­½É/Hn8Jö_ä'ø&#¦C‰ ¢°£Ä<[+;Å÷u}a­’¿w˜¨ôh9¼õ3sG2RÛ@ ö„Þš¤R…{NJ~´~ûW€ß½Õz±®¼i¦yý̹ö”bþ9ÇB)FÈ\}û–}4gãqéÖG‰$ O™[Þ6\<=*7˜U)1g”SÙ½ñäþÑ­XIÀåç(Š0M~Fw(ýÓ)e¨˜[S2Y™/ÉöV*ChC0ÅG¨$Èì£ÔYdMÙ~ƒŠº°±\TµºC•4A» E¶´“¤ô©[«ÛF“+Gô9Ó•=lýæ RªÉz—“x“mHûáè(MŠºämŒÊ²?FÎÛU1¡xaCäeãÌÇOÑ» EK÷KÈ.]øÓ÷ª Ÿ¥IdNvÓȀߦÈüÒ;ÝLWHÓ# ÍÉ”‰ÖoVi=q,NQð£TÒþm\s46[ÒMx{tGú0¯}œÀ.m>x Sn–¦ê9Û“«:àZq` ¥†G$0ÁÍM˜bXRXå¤ã6( qYx•V¤ãå!¬–`ÞLËR½Í \Ìjè"Qp^?3‹Œ´¾ÂɵJ(¡ÀR=”¤EçÀÁæ;7–ñ˜zÝÁa&º ­!w3–'ÈÍ=e­Eþn Ë*Uº7!÷òz¢XËÜ#ã2¼m íýd}Äù;\LûØÎj{œ4ú°l /\áÕ½ájGû„¥G¥{¯|êðMcs†Û“ÔËøžÀ ]ϧì VÏM§òºã‘¯9{ÿy„.Kï8øŽ7Ä6—+¢º¸zCã{×ÒÒø Ýñc—FóÎ}Ž‚æ$\üžÄÚð—ºìlxP¹„›³»åÇ(K‘py=K¬•з„íf–VYJ”¬ÄÎRÔ A½&B b¤ÔQÁEJü3k”KÏÜÕ‘7P*ÖîÛÇñVèÏ7VŸ3m¤2[“˜‚C¯Šü¿`C’bû .ÕXhâówòË&]ëÜ›ºMØÂcáði™ÓõŽ—¹ÄÛ“¥X%õ‚5¤‘yB>EbQó[x $ ˜”ôyj‰ ^J½»õÕŽœìFk)Ôæ–¿º€´rÅèž"î=ˆ¸¤€œÃd¤¢üsĺmbU$ßk¹ R³*ÞDÞ2„PkJ& QcöÞïæ¹f ”à·ü§Î|Ž"@‘"§Y¢y±Î‡±á¸³’™²áà8Θ”‹¹×†JJòk„I'£ ¼é€r$ñ£·à¼€ùKë›çP^1ôPÔZ Ëj¾)导)xd„aD ˜ã´ˆõÉê¼v´ ¦ˆ„FÀšÙ·žö´§=-¹¶-ö´RûŽb5»SÁ÷žíoùP£U(’㽎ïU.6ÀŒMеíÜ/18’„Š™àX26s4OX“wsäÈ?Ò©ï\݈2-*Ô UŠ€:øuç~5UüKw¼óݙ¿ãw^щç‘ðÎgtGÁ/ðK«Vð|ÏCy§†»£àÚ”æ2è²:„°üaÂsS'7´ï°|Üu™±{Õ"Ö ü‰WíQΧäJ¼‚£áÄ+å\Kl~´…$'œþ„ï’©$¼ƒ¿g”›ðÀ¥<7º?ñÀ–FÉÎ'¼š¢ÌT÷#˜EuãiAõ}C[ cµÇ+²¿½ß¢ø¯g Å–¬7ïÞ×=¡Ã±DýPü' Îù¡”»§‚M‰ˆO¸‘>*¯Êk†š~Z6#yƒZØ'xê¨Â ;¾SÁ$4Q G+¥ÁÃÑ$^ÔÆ{5ë[ûV’¦²’|¯ö2ëiôœ,l:o¡'a}ßaã æõ=CéÒ;pw¼t€÷  ŒYuæÙÔÇÛë©+ùÈÆÖÕ…‡ñÃ<¶Ð•úŒ bCbwJ­ž‚ÂßÃV*d\Jñ:„w„b9Æön¸ ± +=¼£ðªY% Uo_5¾£0,—²ŠÔfV¡ó–šˆËc cîôE°ÑǪJ‰ Ý¿%sDïÙb¥Y,Vƒ±O½”?æüR–UB`#ÉÁ—q`KÚ³u‡0Uû ¨6(=3ºÔû·/ûA p¦ôÌcu©–´÷5j‚,kîoSÚÎñ!>û÷$ô”»´ò$¢‰ú]â{𪱵à Þy´“KØçö×;¤s„úf&×2øL(0ˆÖtêì‡ |PËå î“9ç.ŽFɋ߫5à}f–?5óä)ÒÌÕ(ΨPmÄwöÓæ¯$òöÏéGK“dòË­VÐQ»™.Ô¹×êc‡u ˆ8@›…cdmy–½ –3›øŽ÷\É8Î]¢gŸÐ<êVX×ÒÚÞü—"3/ Ò&li\ ô“pxïhôßñ+6}º¹€-ື+Wkò*øMÆgRA`ÿŒÀŸžgªK» ÷;%øŒ ”$`žfß ¦RgOG®Bb„Â,P^SÔ[ÔôôååÿõfŒè endstream endobj 5524 0 obj 7815 endobj 5528 0 obj [315 /XYZ 32.2500000 371 0] endobj 5529 0 obj [315 /XYZ 38.2500000 617 0] endobj 5530 0 obj [315 /XYZ 38.2500000 351.500000 0] endobj 5531 0 obj [315 /XYZ 38.2500000 92.7500000 0] endobj 5532 0 obj [315 /XYZ 38.2500000 729.500000 0] endobj 5533 0 obj [315 /XYZ 38.2500000 486.500000 0] endobj 5534 0 obj [315 /XYZ 31.5000000 372.500000 0] endobj 5535 0 obj [315 /XYZ 38.2500000 351.500000 0] endobj 5536 0 obj [315 /XYZ 38.2500000 92.7500000 0] endobj 5537 0 obj [315 /XYZ 38.2500000 729.500000 0] endobj 5538 0 obj [315 /XYZ 38.2500000 617 0] endobj 5539 0 obj [315 /XYZ 38.2500000 486.500000 0] endobj 5540 0 obj << /Type /Annot /Subtype /Link /Rect [415.500000 623.750000 438 630.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn18 >> endobj 5527 0 obj << /Type /Page /Parent 2 0 R /Contents 5541 0 R /Resources 5543 0 R /Annots 5544 0 R /MediaBox [0 0 595 842] >> endobj 5543 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 5544 0 obj [ 5540 0 R ] endobj 5541 0 obj << /Length 5542 0 R /Filter /FlateDecode >> stream xœí]M䶽ϯès÷Šú‚»;;r°Ør0rì8aÙø¿M‹ê™õ(ñM‘’zä…³“‘E‘UŪb±êÕ»?ùÇé_¿ŸÞ}üòŸÓîï_îŠs]ý?§Ç?ß=ÿ…nÎîçSÝ”§~½ûvúv÷ùîs÷¿ßîú¾|ük÷ÓÿNúô—îߟOßÿ½ûåî?zü~½«UÝýýËåï¶VÝOÅõïÇßÿûîo8ýö8âð97™—ÿÿ;S”Mu™ÆÌ§¿Ý ËT—?¿ÿðÛÝ»žq_©”ªMqRÖØ“j­>ý÷Ÿw?u†/ÎM¥k[m&?^ëë×u[œÊÚûöåÌè*ÅàM•pðÇ™KE™JOÍí¶,ÉJ_Ô^O´§áåתHÈîËÌÅ©2ðž˜áZ©«,Ñ)ùmêŽ~æÒDqìÆƒŸk”©ui»ŸÛÊÖÝ«î~®ûçu«²„%SæO£§`HY4é¿Ì<‘2ǃ§ævU˜ždºhí:| Ž4J¥ü2sqª üÆ£wJÛý&¿Ý\hÖý¬¬jNSf$©¨™¢ØÕý+ΰgÃ'¼cXºÁ/3§ŠµÀè©n”ÓõÚ&0%OçàIY¦3%ýÌÅ©20~nmwnxdôkœýªÒ¤s ŸFOAþZ'äíe扜BoðÏ1ƒà™ô¿Šo?|½{÷Й“Ž”ÕéëOÝÜ.ßìÿúÚ‘¤<}÷xT­Ìéë§?…~øÓéëÏwí¹Òå0Åþ‰²èIÑÀ'|ÒÂ'ïãg ?ÂÑ>Àwð 4|ò =1 Ò€Yžu GÃOd)ŠGÃ4ÐXª ­‹{øÄÀ'X®10 °\ãwðzð¬kBzñhðÉ­qÓ ëGƒO_;¥ý:}Ûek‹‹²m:çÞ)ašuU^æ3fosnÚâå“¢¼<1çÒVMýâI¯‚š±,Ú³5}0~Líf̲òlºCÛËïi4Ÿ~¿³|öã÷’§Ô@·'Í=è3ã^Zð$ðo¤_—¹á1Ž …nàì¡p©Š1{ïXÕjéhêýhéX ”ê™m>=1ðbö=qæsBÜ0oëÁ³¾_¼ÅƒÀ'˜OC®›^©©bnCûvý=¯Øšª²Ð#[¥  ,¶&Þ!öcoœ¹cíÃr½Œ‰‚¥ª“€£i > 츞€Ð'ÆŸÂVË¡4{b¹?¥ûÉ*}öô¥·.¸ÓÌŽØ‚Ú1n¬A¼áñB¡=XÑG-qÖ ÂìßÌ~ABƒª U-*A^Êjg; ¿8µ`3ˆÑ_ëÛ&ÂÙ 5 ¨Â,)²€Qp¥”Cµ<ÀZ݇3D¦L=kÊ(­EÄ@„"N"Ôq•‰Î1>Üq²Ú9×e3Ú1GàOØ´Dœ8„Pæ#âd‘Éž¸ ‰Ý#sÄázÄ9/0ü­yyieˆÒÜxŒU‘µ[ö@#ÜrâBVÏ?¡q¬­»“™ŽºJúßåÂ,RhÄd ãìÌêVKæüÏ(4l‰ˆœQi]<Æ;~ŸÕ£Ž‹û&–ÚÀÞM'cñðŒ‡Šo¾-dÿúŽ$©%1Wø¦Ý›?…vK"ÖÝïGvËžGfÆÛÂ.G¦ ŠÙ Wúƒa&•`KBïÏyÃB‚eÝßõsƘ{QF™.OJ¾Mó4d&3Ø—Ä]D ÊËèŒ{)ÙoNªŒî9=ÜV/?©Šs ~fJÞ£'ŽìåYÃÇx´À;ø;-|§˜èeÙ}¸:‡­™ºªSÕ@÷OÜf›˜›cüÄwÔ'8ƒ^Ä«³¹(•çïTp¥>3pyÅQÅtÓ®TÁõÀYãï(Úf2 ­±Ãy!Ó ‰§™£3• $òÁOv¡n˜fâŒpLbl® +©P# hÄÇ)s¡—³_&0#r¤e|-<¥´dF-DÄD“DùSæ<›±}£N8X?ËæG-OÍLɨ,óø #ÌhLFH ÝŽå;UNu½UkDz¼å"]GÃsƒeng¤¼àjõ˜º™n4©ó2ã€0v ~'à‰jˆl±àˆœð95“PL[[ÄgúïÊßó³*™œ Ï€b§‡È›ò‡Ï¤"r]êî¡jdËaLê4K8ŠöSÃሴÍPÜpàˆ\y²I‘­º\³2¦;òÒ–Äá?Ôgª¯÷r[–<ëZž5^)F”Á¯®ÇàY  œà•bŠâû‘á6¥c1·±~¹1íkÄpch[ÎïÚLOÜ‚–7 ÿÃùÇ;gNoHð±.µ*FŒ l»’&cZaÔ¶],XJ2W¾ ÜíYøjúÔ­}óՔ˵Œ†û5°Ã°U‚þZÀ^aýN Ôa]‚- ~SY†8ãlY;VÊøaØBa¯!“ÆpÛâ]‚Ÿà=‡w0Þ ø,;xŸ^GI "ÊÊžËÀYà Vv–VÇ“ãÉeg06‡8Aâã1øl–Ÿ°zXo0žÌaŃ߹1+@ ÅÔ‘•xŒÂ‹GÃv—ð ¨h$#;p¥”‡NÄgÏy¼…ÆÌÓwý¸–$Óë Ê'ƧÀ9¤Ž(µcceIRdFm›ÅÒÈÄ,Œ½Y0ÖîELm–k&Ì ü„Ÿ}úTŒÖ X?¦á0üÁr€}ì5P7G«ßa1 à9“Ù «FzµVZ™WõŠ쌎B©ÆÍh¦îêw*5­©ô¥¹B÷(ÁD:V GÃÙùð;*9ü¢Ò ÷Y²Ñƒ)ß[ ˆLó WAX.»qv'•óˆk=‰TtÙN ±y21…ö´¥¶Tc•wk[vy’z@øÃ~b%/ SÅ€ß2P—Ý-ŠEy+ê+ .‡@ ø!Œ¸eB Æ”õ«‹×7Ÿ®kØ ÔvÊÊ*]­Wæ’$Y}¶¾Ët t‘PÐ+šÕz˜ÍÛ5› ¾Ê.Ë7c’2åÊz–‰û>KÌ¢‰¤ †=¦2ÞñØ×õO(5HÐUË‘…{Ö 8UýXF ¬U‘ž­—W*6™Aêãì¸À½8ÎŽ[>;&¾+ÔØ©,Ÿ-ÇŸÅ×nð ÍݤF=¹âY¢˜!Þ¼XN§ ÜûÔ>HUÕcîóBî˜*7rC`Ó“é åaDߨeÞj§ \„Ür´w ¬”i œÂý¨ðç:Z½ÐÑýo)wqÀ,ü&£Ã‰Ø?çø^í`O*å“ê²âË‚›óã4h_üæ—»/[™ÆÈ^æ°ÔÊÞê‘2˜½Vmýò“k‚Ùãw2ÙàÚ1”¼(ü¼ÆÀô˜h?ðÚw‰œq°ýx¸=†¹ÿ¿ž@ƒ š› ÜÃw ·Ýq*}œY›‡áÀÚ[är%†’gPš±‡úp•¼Q\g¯òZÇ 4†óš)0Øü²ÈØ„½h« Iød(ëïEâ ‘êu‘é´ÈÜôϦ‡/a“.àûkPì°‡*4XH¸,ìØ },·#æ1 n)4}Ñm!ÜILB©LÏ\ Þ%zHFtÄø D0%fY~‘YæÄ(š|~k…±Óé7*‘ØzØ`·Ñ’*ÐÏ@Vxù¾L)³_'?²µ¹v³hâ=YeÚßv«ªÑ±hum@è õGÄI˜a2~‚{3 &@—÷D¤ñ÷~²¥mFDz}t=ðy‡Ê•©ëžu‰Ñ2ap/ 0Þ ƒ‰ÀRb¼0 dÑG𬠬PiêÖ8èž‘áÔ\û|PZÒÊ`”(QmÇàG #æíRú½±WÎÍÒ-ý•©©ôKÀéî/p±';pXñ©»‰Pr¶nx{ 2µ‡À 7º±KÍÀܼæá0ZŠc¢8`ÀlŸlúÉñ•ÍLi}rY|söí)‹ï¸ù½š¥j<=CDè¨@wdF-¿;NÕ‘-[_îQ%"™@«›@)A®4 ¢ð†I+®$! CG€w”©9"’$æ-Eæ^ÊÜ#×YíÉò +Æõ.q¹‘gŒË—ëBL$·WÌÈ: ÄV®ì†Àzq‹‘!‚(~jæ:V8ÚQôœ¹1uuØÙ‹Ênxßî!×B8å(bU²ªÇ4ÖRª~óEYQ“õp¢¹8kúè‚5úÍ “eÇäþ#ˆ–V‰  Bý^¾Csfíêî$m­ “`¸E0ó]Ýv¬|_•ÒrÔjd:vuˆ¤"¡IÆYŽ(Û½cË¥½œ#®£•ÎuËÉä±o³vçÙ-f'ˆÞz Ÿ¯°€ÈÆâS@B¥D’¯Ê±ýÌæ•T–<·%¢ÖV‡iÒṩ,+“­M$âC27ˆÍ §håêS’)W‹¼=-?ŒY8-çìÏ;µ•©^úãqNà†a¦(²ÌXVV•Çqâ8NLÌ-ôÕv×Ògà é{•ôÅ•á•bÙQp4gm!O ¤æ¶…šËØŒ;°5³VX.ñn—ÐF®uÉ,­ju JîR[i¼ïm•»ø7ŠÛõàRo¬á æÁrížäÙgFíZ'éŒÔãñÏ: ÛÔC':i‘NŠÚÏ.ã©»®Ú}ïZ(—Ç®=ví†<‰+Ý>= ¬­”ر9i;Y;Ñg26åš®iÍÙØÑ…ç{ôĉNu®¼‹ÕøN‹Þn>jÿ^ ¾ãîâêsÛŒ¿ã®5íÙ»ˆ¼GO®hL~¦ œþŽ BLÍ ¯§„£iDÑáz{≳þÏŸ¡)‘ÏsÿŽ®‡•v‹®–= ÈŽ»“m"xŠ):4Lò¹€Ÿ`Z©£rÛ<˜ÛÑC$V8·çiàwðwpnGO\Už{úÛ/SöÂTI.¸¯ÖªWt޻ĥ£íÀbL\܋DZj"Ñu—ÉØÔ±(THg?™a/}†i%é-Nš)¡“éµzkmf3u•=ªÃ÷¡ÔVí¼dš‘¡ÃÆ„‘ÁÄ™[ÛÑý{ Ê6,¥1mÞnÙ­l]ìúå;o°g‹ÈðгôõD¦N:ÂuŒ,í¬ôX¦Ç}*è·“ßì«‘ĉÙúL­\yÕL/úÀÉX´þñÀåq2µ*5¿‘"ŽçÛ7B5ŸØóØž¯yhÕZÇF³9Ê 3L‰W4G®öÄ» ¶¬þc‚ "‚ 2ìòMÙ&‰G²=”må±ÀGAX_ßÂú¢“+оz_įšÕ¼ -lݘ‘…Í…¥Ó ž³¯_Þ^ê6št ÷õö¿G,ê7À ~~Õü‰$Ãù¹øÖ?vìBYI ™E˜ÔÇw}h¶Ö"m±®Íx¹ê‚âHu™ºѺÅ\ÿZ‚éìqÑÿ M‘ÒŠUõH¨Ì.YG0Ó™4zã™Ø¡šŽŠº¼ÌzãöûêüŒ˜Q£LÜ òD·ç®R2myˆ›P‘Ü]YäëãÒtÉ”(5—ZW{>•+;™HÞ—M{”Ý~LÏ@¬“'V`zl­|{W<ë[ãCû.šÒö\Ipü9ï)y(ÑêzÛL /p™ h›4³*¦Ý#cò$šQ­‰ mx«½–dÛèÉ&Ÿn§ä„)»cüÆôQêêÇMænÆ×¬L½)q¨¤R˜;XÍ—N)\ì>å…±NYeW­vzŽÀ=Ú‡¸8Ãñ?áxOà;öžD zÏ PRÿ­t6Ág+Õì¨ ]Ù¦aÌë^Mo9£‚º [ž&,{z¹ó¡\+ÙÛˈãd®üáORŠnî˨bßpâ˜}‘ V/#Ü£QÚìZ.…aî¸v^’ž€/v h˜®Ý¨§z«]î:Y¸ö,tV^šùuoyoe„7ªÝ9€±(ìø®÷V”\n>ÛhÕì[úDá³w-}yäÅÔ»Öìn×¥êö Sãþꡦ˜(GÚ»:¦Íª?{"ú*ŒP“+–+{ч¯‰›«@lký«FÙŠÑÉRõZ™2h‘€}¦[þõ³)µ“ú#)ƨÛÂ]ªÇ}îÊ#ü´5êTZÂòÊÀõâ\úøÔQ€ÜlxW¾é\­t8±O)ärh*YM•² ¤-G†n:J"%À;½ˆÏý²õ+¹*‚)±f’G±ƒ+1¥ã œ1kFÛçL"1¶æ³Ëà²l‰Â4€Op(•¢~‡˜A -'‘ˆ†yq‚‹Æ)68(g 5œN¦H/‘LapZNÆd SÙWìŒ#½ªD‚YÀ­Æ¼†[¹v7Þ'X* $1ûQãkº¹]7õ|µwÈ?Õµ7Wú[f½rJ€-†C,ååÀÕ< È“]ûLy¸¥÷š'œ»KðÓk­—¤-'Šà³_ÎÄ[[î;9P6ñöð“¶í'ݤ«›yÊc ‚Ÿàt>ü£Ç°üz¹Ä2Æœð $1´Æ¾"Ek¸këÁ»‰ñ}-DÌ  ñw0EEyЪ™¢œŒ'"+‰“$|‡9¹û™8êàõ0ç@,oø”¥—‘DÊ+I1·<¶­­gùxx—!Y~;ÞeÎTù„ùµK¹”-‰:äò8õä>õ”¦œåð–£7r1šæ¤ÚÉ~=°SÙ„r¥ª8÷@ž0ñÄ oyÖc¡'¦ˆwà œ:˜xÇÉ>æfÙ<=q©KSï|D3p‰PÕÙ¨žWOO š[ñ!~JÌLÍÔwUfD1wÄä(1¹LŒ[-]¡@®D+;鎸)æ-Æd"0’„ÁÁ$0’E:˜»Æ{CoTÉ0Õ#–Á œë “²xK•cC·'ìr—û}!P÷çô­£DPŸçþƒ”l&;puk-Ô#ÏOú ª¦ c{¦žXkOd}Ö=¦ç(Uþ·Ñõ¹òœR·æ=úŽ™ËúžšÛƒ[){\@fÇÚ'ØWþh`[„ ^&–¡ðhð§„TÔÒŸг÷øs7ãa柠€kÂ" !'°˜ ;LUH;,%NNlƒÀ àwœU›zÓK0–¬f´ 5Þ1u ¶ß‡ Æ ¿óÁÍÞƒåÅOðÜœÇ7¥, 1ý,ÿÁO$†ZãyȞݳuaÎNß?ß¼x»)ìt•Ï-ßœÕ;}¾û?v0˜ endstream endobj 5542 0 obj 5574 endobj 5546 0 obj [316 /XYZ 38.2500000 709.250000 0] endobj 5547 0 obj [316 /XYZ 38.2500000 347.750000 0] endobj 5548 0 obj [316 /XYZ 38.2500000 200.750000 0] endobj 5549 0 obj [316 /XYZ 38.2500000 709.250000 0] endobj 5550 0 obj [316 /XYZ 38.2500000 347.750000 0] endobj 5551 0 obj [316 /XYZ 38.2500000 200.750000 0] endobj 5545 0 obj << /Type /Page /Parent 2 0 R /Contents 5552 0 R /Resources 5554 0 R /Annots 5555 0 R /MediaBox [0 0 595 842] >> endobj 5554 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5555 0 obj [ ] endobj 5552 0 obj << /Length 5553 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜súÅÐJÚ9$ ‡ ‡@ޱŇüýp†äì.9_‘ü¦ºÉáÒ‚-y[ì®®®W׫ßýñËßÿüíðî×ÿ¾µ¿øò`ŽEfš§_?¼ü+íŸE™¾ýòðýðýáóÃçú¿ßš¾|øsý§ÿÜáOõ¿?þú·ú‡?¶éô~y(lQÿþïóïUaë?™Ëï§Ÿÿëá/¿;üzš±[®æõÿÿàM^úüÆÈÒߺmÚó¯ß¾ýúð®AÀ¼UrëóÂlðá`«àÿýÇÃOõÝôæXk‹<æ–…ê%N+eþ`]Uã:¬sþ¥3»0yáÊx“Ÿ!×FJ=­'?–ÁŸ6–…Ó)ŸN8+KWÿ¹ðí?7¢¬´Oû2{Œ)³<") uÚprM>®²˜'{™=òƒqOö y¬“…“Gæã`ª¢EYýo„¹LarWÆ;îru¬´ç-Ì®ÈÊÁûN¯ÙEÏÓG˜<ÄgÈÕ±Ò.ž=67g&´H«gÒGÛóô&Ï}Dn>C®Ž•îÀñì±¼0ELž>Âä¥3ñ&?CÃñìšâ»ò!æá>O¯?yÍ)ç y´ÃųGææÌTUÄ1}„Éu©éy¬fWäæÌ_.'Q×G¼ûdÁG¤œ3äÑÏ››Cecøóô&Ï#Zz äÑ|0ûç9³`PšŸ§íwáÃǯïžl°52óÃןjàÎk6¿}­‘’~8¹òêÛì׿7Æ?ýáðõç‡ê˜»¬±1áÈ#±qð!°9 p¶ŽÀÙLGÞχÍaØ>¸ö4Þ>}­É16%Õ‚l‹Ÿ‰›ÂSįÃ' !ðó©v góða ZTQ’¦!‰¼G¼eÿ„²£w¥=ØÇOy,+“¿±pÄ4; Çà›@Ü„ÙZùð¤haaø7ppÄdçÌB^Ù®Œà­ûÅpSÌß©+!ÞðNñ:JÁg‹·‘ H +s}ÎØÕ”›fÄòÂT(G°YŸŽ bjñ¡%j±„hF¬í8u £BážúHò˜ø/‹>þ±ÚzßO@îtá‡5‚·ÓV+P¶ÑÏhÇŒ%¢JòŒR⃄§'8ª5á®msÔtS(|Jwo(ë;óØm’ÜX x(¸E•¤ËàˆÝo­oÇð´õÌ Üä}·*܆TïfXluÕÎ0«LÛŽ5ǬçùxÞ£‘– ²£Ë³ž²xRý¦Bß´âÀ†cÑ õ‰÷Ú7+¨ò¯owq6aµ‡ÖitPqôÅì!Fñlx§x?ð|lßÎ>“kåmï]§“§ØRP% NlNâu°¹ð8ÝÅŽ쀳 ÄÛˆì²!Ào°G!Å ^8â1ÔªTî¡ïCG|¢ëD0YÙ-Ù¡½Üz°+ö>hl¼á…æ7£µ·¡¥†.SOb#¦¾Ùæ…}iHÑfGÓ»'·¢xžYÇØ]3 YUÓI'°ÁxÁ±ÝJèbÉ Bìƒ Ãm>ì¯ÂÈX³ñŽ‘"jµÌõÕš@üð „ÖtŸÄ Ò #ÆÕ‰‚ÜÄ\§ë=À ˆ¸ø+GjgˆÉ¾Àhv:•1Â#06  Oæ’NÄóA£ŒC ‹ÅØT•nÕL•‡¾šÙ˜•‡ÏŠÔ‹ß.”õ§ª_YP—„1g[\ûŽDn£¬à¦k­È7¬Èè\x*Óprlën”À!V£j1•Ȉœšxo—;;8¢ýr÷ž¸šD¨3IŽOu”X¬3yìØf`,ÑÔ7Ýë%«õ"ˆJÇ©r~0&ÖœsŠF‹æXŒëçùˆz4w¶§G)|0±,pI’S…M8yH¦‚|^\w´© ×ü=[7TB,ɬÎõK©Yê…R¤©8yqËDEã-ov$(j†÷C“ç»bSa‡­Š{F•S”¤Líê?6=´±‹$i˜Ö_àÙ‹I÷$`6½tÏ tª»¦K\LÊÐ%Þ©Ã;Ýi™*ŒÆ¸Æ"ì&cnHÒNÛy9Š+–™v^x¶„% ¶,FÏaÍ2ÉaNÝuå._¦È—Yü,4xHhI8“ïaÅ\‹±xƒ%‘ó.Åïõ„ ÷Ý '@I¸ë ³ë‰ÕØ¡.÷£ûÚÊEŸº2©•ìñ³Å¼-_³Ï¼T ݸþ6|tT|£Ãrs–î)`ÝÆdî0÷CBÚ ÔKäš1P 7 HUŒý%h"oRH˜³˜²QèÙÂØig‹Ÿ«“çãÅ¡TI‰J4TåÕÍÁ hÉŠDuß¿c¢SL«Wâ) &)i+ÑW•¾Ž{_Ìäü”¬ 1~И`ŽŽÑ„r–ÈÇ3kVÆ|˜ÓÚžN¤*p€ëÊôTI£‹½(…‘¢RŸÈ4ÞÖ•/LÑ;N_%Rê„gk°Ȥð2.náåàe÷9hñ§TÞži”ìƒé½îç싨<¦Zy§W–Ö¸¾¶ ‰ˆT)Üîðq2YÑXÕ’ rƒž­Þ¨æ5Ýѽ9¾6F!CØÑËÛó¼]ú S'†‡±›Fõ¥¾5Úö*¿ã˜Š¸Ìzô¤ÓU‹y¼™y¢‘1ãTõ£îín±Â]¾§ÜIk.­Ã„9U5étQʪ’"\à¹Ë¼þ½ªÄlòq˜"Û‡Ùérâ)ÀœÄ`àlø|ðÓâÊ'áéœO‘’‹ò®9p å.80 -WÅ(®ÖÜF~yÉãp.²ZSy°ÕÕ>"M‘2ë±5­96®”`¾G#-¢²£ëû_ìÓüoZ¦¿öM×i;‹ûcÑï,þx¹9õú$µ7´k#‚ ½ çGo]ï~äà7x<„@ÀÁ'4‚×1ðLñ:/ž#í´äÝ]­ƒøŽÄ²º<´ó©ÛÚ ÝÖtÇÏbýï¡£/åF˜‘âý ¡™ÞÍô·’õã"RRPúYI$±Û7§êަ{L‚‘ÃwTÒí…¶ý8<£Äo_ Ù9ø›î†æûR$Hµó®§»6vð‰ãK æBÜ•.¹s*cÊ-îúm…dyÈ8ï`:q¥âlaÇ£úì€ s§ŸqóÐmr™ ÎÞ  ±)7G(êZp©²Á§§µ t«­g¤ð]Ö®¬GC$; B¸ -F!è–*Ï­²]‹Ÿ=ÏM›Ao±|uÛùÞö³Í¸±= ñ.Qé?ª9kk4•âu¨Ø3Êê1nq®®ÕÂܤØÊyçÓ˵˜r7¬†•_À%2 #?œ7'µIÞݪ£eàÇMøê\•_ öWç¶š)“†’Ê|”’˜ž:L> “õ¥Û­ŠêÆäêà=L±ø|p– DîÑÊsë•/½´1qJ,­°ìKÔ#KyRÅòÔ— ÄH€ØÉ0ˆîÊÂÑõÕ}Z…þ‘Xká,Î÷ e€ïy“ê÷†é…èg)ôs…P{L.ÆæZ¸N€ô ½0Ýý<–Þ„|Z~?‚ÆúëœïK!¼ µ sî;˜°f(C°bà×]„ý`[uñý¸Æ0ò¦ŒüVF¢4æÌ]Y_šFró"†Ó'2u‰¸”±ÒÈQqLÎHþו8ÇÏŠ=ØD–êHðvòˆ€l²ˆ©šºÝC.ÅŒ”$¢mGB÷zf½{-Ô¯]ÇÞš;úÚ7ø:¶MgêËìN}·QߊœõíîÅÕ»mavތě˻$…æ>!•Õ(uGRág.t[[¾¿eŸyè>¨žÆEøÎF”Í ¥é ÁG?0·SùgÜsÁµ(^»1OÆ,ž(¾ÂòAÝÖ€:Å{}, à”?†@÷áôê9ø³x¸¶_Gv4ýþ˜£/â²Ïº©¦B²+q,ºy¾Ì ›Reä‰N[·qÃo=S࿲=+zê’ª‚;Ðíƒ-0ÑÌ•!úaóûTnWÆñËÈ]7¿JŸfÝ„xÆ""M'0V¢rAÝz2áÀä«>ÙÂètAg,U1Zé=OPà£$šï䜪5_µB>÷ýh¢ðdÖùŒ7P!˜¶UâÃ; ‚zÍÅÒÂ…sF¦ÃXˆñ>;1펎[oP«qtÄwÔy“#lï“ût˜D}>¦ìQÍîŠõÈîŠQuÅÌSm»Ãdw˜ì“×ß$q˜DÔ@y–õí–ݳ»bvWÌlB_<{÷—ˆ¼p‡þ’$IQþò¢×ÞñÄl5‘0 %]^¦*q’.S—‹“qJ¦><‚_Ù!já=œmù~0F1l8QS9L"U>S 5#k0F ~^t$ªbwÚáhGW· gŠë³vòñÏ/®¥êÈDHUÁBÀ¬vy›Œg”»,n¬ƒ7ƒÍWÛõENÂKX^B®}ë”4‚ …}MFW©^~_ψˆl2a¦ad»ºq$OÕÿOÕêÇh2>ËM¢2bÜrTØ,îóŒË·„68#ü“ÈK¯Óv&‘_]ð]á&M€iƒÎˆ*éA^HÔWðúêRp“¡o*X½šn${Çz%”Ò•Ÿ]ZtbS\0ì‰&Ñž0ì 6«¡aïp“ÃÝýO¹2S^l³àïš.qn†.…K7áÜÚiÙHýVìÁ]ið™âo¨æ¨x6Hר5+àwÁ¬Â%WÛ1w-¹æç]£®A -¹ÏÞX½¥í¥$‰1…¬D–v¿k–ƒ¸ÿà.Í äàšÃM·òfýëð½fB‘G?ý… ~®ò{ëÆžü1‡gï@Cóל. ÜÅGC¥îèÎE4Ãsȇ#mcswÌ­È®y¯>¢uüØ‹™×`{jwŠ\R¸ÝnxÉ@`»nbƒ ¶"»{±“ÿÊ6,ž ~Ó:¶í¬­ÏdËÜéÏ5Ää°ò×Ã=apð$0 ø ;&ŒUˆ;L%­H¾ÂpÖK}íŒLÁ˜²ÊÕça_Cz,`ð7-ômiß” [¸¸&,à büYDÆ#Š¡Ôx™áËòlaü±•÷/™³›Å!Œ=cG•ÚçÃç‡ÿøå„p endstream endobj 5553 0 obj 4509 endobj 5557 0 obj [317 /XYZ 38.2500000 625.250000 0] endobj 5558 0 obj [317 /XYZ 38.2500000 625.250000 0] endobj 5556 0 obj << /Type /Page /Parent 2 0 R /Contents 5559 0 R /Resources 5561 0 R /Annots 5562 0 R /MediaBox [0 0 595 842] >> endobj 5561 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5562 0 obj [ ] endobj 5559 0 obj << /Length 5560 0 R /Filter /FlateDecode >> stream xœí]]¯Ü¶}ß_±Ï²?$R@P v® ô¡€a}úP$M‹  êæ¡¿Ú•´w-éPâÙ!%­7FbçʢșáÌp>ßüéãßÿüýøæÝÇÿì~÷ñPœ\Y´ÿÏ¿¾¹ýö§îÏGçËã¿>?>>4ÿý|h_øøî/ÍŸþwÔÇ?7ÿþrüáoÍêþÒù/üzpÊ5¿ÿûò{íTó§âúûùçÿ:üõÇßÎ#öŸë&óåÿc ç wžÆÌ§?úeªË¯ßüíð¦%@ÜW*UVÊ•5Íj«ÿýÇáçæýðÅÉ[£ŒÓ¥mþ\WÖ¥÷ºù³3Ý?ìǾ|ÝÖG¥ë¢ùz1úøå—Ðð ÷Ƨü2sqª(S©ðè©^=G¹“'ÛëðòƒW…Öé~™¹8Uz†ãÑOµUÊ}*i Ô쉖@u™€ü×ÑSðV—éxÛÎ\š(kñà‰·re Û‘Ì¥ Úëð ·.áà—™‹S¥ç7]r+WÍ/ÒÖ% Ñuøô÷¶J7øeæâT陋GO½›}Ýk×f¤<©Ó)oW˜”Òtž¹8Uz†ãÑ3ÜÞ$ôÄn†O0¸ªÓíðvæ©<±Àè©®}çÛîÙëð)xâRJÓeæâTé>ýCÌ(x*íO@ŒàsàÅ·ŸoÞ7sªŽŸ~nfvù`ûÛ§_¶ùŸóQ×ÇO?¿mæ£þxüôËA§Ê)ïÊËßkŸ”—'æTÚêüàõ‰êÞ1'£½Ò7ï(syâO¾.ŸûöF3íhþõÃï.?°'kÚX΂዗˓²ŸÑ’eŽfÑ ˜ÑT¿WŠg k8šŽÿŽz; ¾‚ƒ`ªBrJ$—öð¼@bº}¢T¿Ôb ÞXœñh– è÷h=¦e}2ÝK ž0B;ÚãÌÒ)†a%†Å>Ù´fÂlÁßÁ£ùi¥üò©±o‰LS冶)±Qð;p´έÀsÃÔù.~¥Ï R´3%SO |ò>~n¦Î'—®P»–KgÀÈ¥Â4À+}Êrˆs.žÖXñÜð ä£YÈ¥JÃYfP3€<ÅrGÃ2˜Þ95—ž——-k.÷3¯¹òPÞÔ³{Ï´Ó¤yfêÜ—Gº<_­«y~á'ïíß1ÐoSpX,çp?1Z)`iðî„+•¸¸wàܰµµØ£Ã{ÒZA›-ãYÇ«²_7ô2:ʧ^†&xö q–»ÃwùL‰6ìd3fGB`¶x¹Àt3Éô}»Q1L3µ WäªÁŠp„"àP‡BìIÍZÀ,±èsão·†}f Ÿu7YwSWϺ››'Ϻ›gÝÍ·¡šä:•âSnrŠ9‚,ÌÜ#:ÕðµV[W®N~É£JúŸRW“Hh$Ùöî21Ów‰×ÃØ¬Õ[Ü)•¾'eÅ,ì+“%~àœ¾|éL·íá?j<|ýðwž°4ãA¬—*ÕÈÖ=Ó”ònH© Ãv3-b”Šÿn¹ß>"«W ï–òª°<0ßÙnY.\ñG0Kœ¡aœC\ª@-}ÎËN *Qô2“håø°¤½Oª­D4u9ÜAw0"b–é4J…qDq{ÆK'œfY8¥Ä¢Ãij>ÒžNæÙl•à]'ùMT’#`† ¹')&|¾ŽÎ4&ErÐgåc¬*ÜaÏcì4¥üu[>8múWB‡RÙãÕ‰¿ï<ì¾ ØdqðF‡uÂ'”µœÉ˜rKHT›´2S 5+/‘udël×UœQ#œyQ±4Û(KDãÜC<¥Œ·ïUª¾¢-Ý´ØKÃýˆ vSÅÞè¢dú­qïg¾ûs*­æ)Âà,ÈvRã~iªOcîäCÖ©ôõúQ|s‹Ü|fNÖº9†HúO7ª¬­eÊd¨t!ô8Nr¿äYóêJíHï ðX<"ÀceÊj×r) ðˆùøxäd9àˆa®0Ç Q0þª Hø¯f-æKŒ“²íÅ6—¨—ŽU Þ ´ñÀÙ† ¶ˆÄÝr!&oH˜B4Â×2=<Œ"±…ß¡"öx="͹P'G¼½÷[°ó(e°¢pz`Ge@éÖ/Ø•À¶ˆhÄO ¾¸•Æß8A"畺ò%×y1âª3æ²e´¥ÒßuÒaÈÁ€S2šk¬ùÓöR)n‹HiÚê‘`-O{PamÂzˆD؇Y¹‡þÕ*[˜“hÙdT朶ç\ÒY¤HŠp‹Ÿ@-+úk¤¼³ãvYœsÇ)匪XÍ\‡¯Mã`d:ÜÑ ¥¬2æKÞGµ¼ZëEÛÇ6Ð&ŸS©*¯­Œ¸‰®Ûà sÌGH«€Tˆ#PÄ©Yy¢L%¡|=?ÓMï[ܶœI*p†pƒöúëÁËìZ¦‰S· 3üɵәY‹rÁ`;#Vç6¯…\QÏË%~ Тö5ÐsÅÌÛd1“€À^AÐ û2x= <Á>Ñ ]À>/ (ò²€ºœ?lY.³]€åÿyÀWt@Jž8óÀÉ75©«z–ò[Ö¹®+h¡§vøš´´Ù¢­9µƒ÷³”ß²vÈu¡– ,å_O¾œÑª&_µžk˜t­Ö¿^ÛÀ€ŽÅÞ.äöeºÑ’G»\sòï§Ù²j¢ß>¢k3& µgØÿ´ÛHµ0¦7ÌÙž4Ö‡8ûJèÝÙëÈî müî):o×+íÌŽÄ 'Q°ùcŒiz±2®ž«”ßôC^? rðèþZYìUüa&øž듈»M"ºÿ"2!L£e.L]/‹ÜÕÂôE'±t+`oFÐO¹8›Xjœê玹øy)¼ÿ„öÔìéú¨j»º:Ey>þ Ô¾¯ó¾:tÃN~®³#iÌ1S¦œ•±õ#f˜V8ú…#’)Çq1†Y<šÎ©“Ê_e½Ïj– 6¯“œ™•±õuRæÜfúˆ¼¾6³Š9snh=qT½¨Þ€Úä-ÊWCJ1˜G"HÁ_ï¥R]-üÔ‡#BvLlWÚíáâpë‡Ý’G;l—»QÏhGL´#@”´QN&’+À+ƒs™ù®Êщ°|´ðdzl:"°¹öçÑM¯ž7s!eİI­Xg8 îjÒKGÆlOˆ®ŒëM¥©2åÄS+TÑK"dÑHcÊrùà":P4™'¼I¶ç2-Á/‡øNâ=Í…´Ò†€ú›}F€f"@Ê )…ýªÛ-Å= õc«×#3Qæzeꌈûò°xÂsÉSB²býή,E[D\¤Å\)‹ÉEì0J0˜ˆã† Õ($®ŸrÑ“:˪ÐåÑ(* 'z™p6·§£ÄW|LÜ mbBW†®îÃYäÞŠºB±T‘‹é2a=m ˜zy‚ºÊ,ý-z ¶i—Yˆˆ»ÿúY„ÍZ¸ "Rö1)"š‹Gc.êbüæ@^³$¼ãÇÊÕl¦Lk;|ªñ*ˆˆF¨„¿³ò}´)-œ©Ì£ëÄ‘3PÝUu¦‹ÕÓtÑm&ƒwÚ^ž—êcÎ$:Ïk!C•¹3 ë!ÑOŸ †·i–¥Y2±<) ]úá73„Kë‘»…e‰tF8Óx#2]»Ú 9DÚn(^/©ÅË©á7;•–¥‘ÊèkÏø>[ÿdƒá¬)àOü¾žA” ¸Á¯$®€ÂïP`¹?9 U³¼Ÿm Ì3ÓêJŸ|W±¸3>Ô˜kUrÁ%Ú|ו;S_¡ŒÍÛÖìP"ÐOhp|j@ƒ‹ÙøÜ*ËÙ™nCßXgWÐ7¶6O}³V¥Ò+è›rçWLXQùÀ…ËÄ%ŽXoåªùuüܰ2ÈésaÁÅO¢76§ÂBc£G}… ig7m%ÁMÄ5Z*蓾 úÞ>iåª?éä\ŸºØìˆw¸câ;fîd<5·÷ÝJQxxj´.Dõ:¥bæà]ØmÀAÓ‰e(<|§;Æ«¨¥»W±eîüçfÆýÌ_`È® ‹€†œÀ"Ðaòãhÿí0U!í°”tªrbf¿Óa¦ÞÁ4ÀŒ%˶A@ †;&°®>w5Ä`ƒßyÛ;Ã_òÏ­ åO) ÈAL?#ÝøI€ÄPk¨›(.»g]aN¾¿Ý¼x»)œ‘¹ñmfÚ‡ã‡ÃÿH(d| endstream endobj 5560 0 obj 4730 endobj 5564 0 obj [318 /XYZ 38.2500000 452 0] endobj 5565 0 obj [318 /XYZ 38.2500000 408.500000 0] endobj 5566 0 obj [318 /XYZ 38.2500000 496.250000 0] endobj 5567 0 obj [318 /XYZ 38.2500000 496.250000 0] endobj 5568 0 obj [318 /XYZ 38.2500000 452 0] endobj 5569 0 obj [318 /XYZ 38.2500000 408.500000 0] endobj 5563 0 obj << /Type /Page /Parent 2 0 R /Contents 5570 0 R /Resources 5572 0 R /Annots 5573 0 R /MediaBox [0 0 595 842] >> endobj 5572 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5573 0 obj [ ] endobj 5570 0 obj << /Length 5571 0 R /Filter /FlateDecode >> stream xœí][oäH~ï_ÑÏHÛS7Ûe !Í$$¢‰ÄšeA+vEØþ>N\N'¶¿²ýùTÙÝÓŒ`ÂT\—Sç~«üò÷ã?;~¸ûòŸã·ð÷Ý—ƒ:U…jÿs|þóÃÛ0þ~>V¾8~ûåðt|:<›ÿ}:´|¹ûsóÓÿŽæø§æ¿?ÿú·æ ¿ôü ¿*]5ÿûåïºÒÍOêõïçÿ×á/¿;þúmŽ›|§êvú)ߪ¥ò“PˆÀ‡ùÆ,ÿ8V¦Z«ß¬\Ùaó}ÆU½ «ªO¦5QÚê3±Þä7 ßwG,ÑË1!œ'ËT>3Å}pàʘ 8påôÏ…U©Ä¹J –têeI¯‹l-Rh}*\é«â 9µ¤îO¾V/ð9ƒú~cÐ7º]ÇÏøÕ@QÅɯ߸–_¸ScZïiÿàÍž9¶¼· ŽÀ,[´ŽÆ#-o¶ÝqÞÌVÀ¸k /™hdΆoÙÄDíò‘ÈÍáÛ†çÁ¤fqÂc¯í!¼å{¿ÊÐ>W„Žðî1…áuðló9 ƒÖÄ1àÙð"¤0àÒ˜¢1Ì3êa¾ì,½ËÔ-ÜÁ x‘väœ BTAˆj k‹­QKhÝ®c]FŒõÕämíÃr¨M§$æ´jç&¡¹ãí±™¸U13¡îòØHßæ„:ð~°“ çɃËeç%Èè/ò ,/Z&b®ÏÈÄ&L4Ïm™éîBxUtºVFyàUµÆ?}“7y°yàU½AüÀk{Ùñ¹¾¬<>‰±æ<„½ƒ­A†‹à¸‹ÅЩ3âea//E£W ^bŽËà µƒñ¥2“7‘Ðøî3Å”lF]M×ú¢axWX=­îšáøº¨1¢v‘S_4måäCÆù‹†•ŠGä½='”<¼,¹,ºN*#AaÂÌb¦‡›G騌 & ƒÜƒÐeä€ð*#È„>ˆ™2W<²9Þ¿Áaé)JË‚­Õ}Ö‚9-Ö;°æƒs?¡/*â¥ÂÞO1o#æÁ¾)*ÛÈ~‰ O«»iÛQù ´²ºO…bxAWº>’õ“L˜\¦H–†ÿ=b²¶Óëmøhƈl>×?b”À)L8 dAbÏTÞÆ±²çt;Š ¤ü`(áT,<!Ï€k€ Œ~3˜âRUñ.‰±™É “ÈüŠ,Œ©¦š=/ðmÜÒ,Èu*+=Ó ¡*…ržPàÕ®תf]Þ>ÍdÞ1ìRt6¬µDŒWü !«$¤bEì |@‚1€”e­LÎiDmclcÌ/±@eÔYUÂ:‚UØÇí³-SöG]ñ>Xß9Eï¾Ek¶oè# XZœLYô°çaù7ƾ©á:¾£­V² äpƒ‹ª¶3G"ëX8¢^q¾7[`_## B'˜ÛÕÉ¿àØÚuÊ“ÕfKÇÖ»4v ©rç@õ¯ÑA¬¹ˆº‘"¤ÉÔ0È:j¡~䤄þ©·…(s۔Ή aŠ2x bÝEfLQBv3ˆG(‚CQŠw‹1: &,¢ôŒ1ml­2wSÃ,âñv¶èË‚›Ç{R…6}Hú€Ä¨8ä|Å¢îœÖC”lŒÜ5¨(ÃzsOUsMìà2k®½d‰Î¼Ùc©uzŸ¥îÛH”²BðFa5²±×}Ö`ÄJ.œôz×w“3œÇ}~!,ÆËYgÍrKS<ýUrA”¡l‚áR w8x³CE8S$ïÔ«ÝÓîNC—o®þ@¹Ò?"Ö‰?ö±uó=ÊŒbps⤾ù®¬„J!ï|v6™()i¦$F7¦ÓC$ƒ¦<—xL2!q¨NY¦ÍÏ?àðÄßçç·Q韖ÈR8×…DN¢p2„]‚}%Œ‡Ç<ô–mý&›G†Í+Yµ +§Ø—„X£L¥Í-#f(›xJ¸_67¯D”ªKª¨™šZ7ñûò7 e£Vºê Ç´iåØû¼äçÿên"Âc(Ç„[0õ8ÜO¬²  §díXY]i/B9qCpQý‘nI }.Ý1éWHeKu¥y¿ä–)°5üfóXun/ßOtÅÐa]Ëå;ˆ$º~FßDö†¿Á·ÐBt$ ÷M8¼¿k" 7’ì „#pƒ;ÐbÝ£&Ü÷Ï‹¤l/^›Ž÷ùϺš*F‰x?;!(™Ù’ìÒ\þo+E4yõê3EÏg®Ôu¦£=³& ]ØW–6 ƒò¼Ëš(L1Q'¹d¦ÚAоÎàÙ?KIÆr§|¯f2|Á„)bÇ2Ñè‹Ò?¶ É\èƒ=ó=o‘ÍæJJ ÜÍ <¸8Q6©Š[Ù„Ñ\ɬL%9“¬Æ¬Ã$W ø8ŒüOrø¤®ýP$t–ŽÙJ/_8Ó‹o Œ0<(m€õZLÔ´r“âƒé™$;†502Qã5È=‹¢MSž6]O_È tÇ‚2øÇpdÁãwƒ¿ ìòÕî)åc1¸øL Ä®CÒ71|¡bx¥ÆÐãŠU…›(b€Þü«¤0¥?mÕ5RD¸·ñü´°ÉÜð„r®4}9—8Köaè=§¡Rrn:]3Wì3)¢Ýi¶>~[ "IL¾¨ÆíüxÇ¢‡ðpÞQä©ü 1[`I[º> ·ê6¤èGÖÙ_`?¢î&fñ¼Þ‘4µNõéW¸'êüÐÃ’æÈû ^› N¹ªzŠ î8;ƒ§U)Ü›Q¶£– óžßårÝJ´Wüî:­¯sLQÊC®–B<)$äÖØ#¸VÍïÖã{\Ù Šª~¿ä–x8„‡¥:yãb˜ÜIáÇëäJá/uÕmsóÖ;h#ÊÒ®ÅYŸ«£H ç­2 ur:“?Å4YÓ9<"å‰Äªñh üÚKAJ)V»ž»®ò„\¹i£E]ô•[-õx8´2}Hmk¸›6Í“r`2Yû]ò[¦ÜëÈkfŒ–)””D£ûD}m6D‡ªa$Øã;·çÉ•.$›Ö!Üz/*îâ9m[#á²ÓIë ¼²°;Nå}(Åg*ÈÁëh«$x¶kãO´ÑZ¶¬[Æ‘"—½¶Îðצû%®½Û*# §pSu¹:ã0árÑu½ôâšv«¢'Çv@ÕŒ/ÒàFð…´~Èrxm7?ä8¤¼éAjE-gLHLa]&5‰9O„á“29\û{‰j³*/áx‘³t=‘¼ÚUóMCÆ$Rë(_%¡(_ùïþµÅ1àop.Éìäfï¦Râ_ÖÎeÃÛ!Þ#e®R¶%Õ%² ¾É¢@”°à™ˆôÒV÷Κ­»ÈV½…ÛIÙžÒ”i€ops黣øÙEj/WôØØ¿%µ,3B6ÌI-ÃzçŸþT0¥—·KÆ;KÉ\–ÎúÀëH04Jý†ß,Ø,v/f{Œº¬»ÇdL±†Üü´F ‹$_ñkÙƒÏÊE"]{½ó‡ûKÙÌ¡¬™7Q+1H»$ï×ãÙ25H꯹} “H9ÌdP°fW<8|X'rÒ¾ B[8¸b'mµD’¬®”EâeÝÃNüLÒïIDÌ·=sôþŽ=®gú  ˜8í,IÏ`\ág3*Z0¸vÆV_LB‰Ë}¬ž}¹ªB#8d ¦Ãu4^Gt¶J³0œo]j4.»àZÝ{/qûʳeIý›?S²Y\æ·i"£W¦/§f¦¦â”p…³E„ΞªGM~Ã=⊕©Œ~Ú¨êJñ’Rpñ&Xõ¥Œ ÀËeFqˆìZOì:͘rÅÝãxsÊÈ„±ÛDhFÖ͈u7𗮏R¼¼:^¾¼¼ñòÒ­¡Ñ ÀkãË/ÇTËp”L$‘uˆº,VQ™tød³lFJ÷v aXa½ãËÒU1%³`…UkšéDrjðéˆÐB„‹\&á0YV¬0: V@ šáÒß¾˜)i+Ü(R²‡­™ìOÌ“LÚÜWÌôU.ÄR›/E½_ }Diµç‰`,þ†ÀØíñ%+VTk"A”œÀ·u³E©”"£WÏÖk"4‘Ö8]å†/¾`-ňu¼˜Æ§WE'6C`ûÎ…/Œ4™~™ÇìªHaÑàHó Ç8ÃÜj'8V¬òÌC}7b5CÏÌ ÇHÃ’a8V­ò ÃÓa-'#ßpŒÃ±r¸_«Wµkg|67Y)­ñå0/8Öü9>5Èŵǩ_˜‘µïG_âÓö¤ôó£UGÓÉÔà]KÿnyW5’ÂÛFM×Cy€‹åp$䌙Sx4ëlhw€›ÚެcqýÜÛC8)zÎwxtç-)¸YŽ>8`pŸM_Á‡Ž¡ñlð›Àõ¢£¿q…±÷ü³zm6¥?£µ,<Fo£@¨‹ÁM>Ç`‡¡ a‡±$02ˆì®*ƾÁ0ÀŒ1Ë÷È ‚P}Љœë¤Å ó)ì>´‡œ3‚÷Œ¢1foÃOÂx$bÈ5ôQÃÒl¥ì)ðû·Ä‹ÉMÃâ û¦§Ý¤P{<>þ}>‚Ä endstream endobj 5571 0 obj 4602 endobj 5575 0 obj [319 /XYZ 38.2500000 425.750000 0] endobj 5576 0 obj [319 /XYZ 38.2500000 425.750000 0] endobj 5577 0 obj [319 /XYZ 38.2500000 173.750000 0] endobj 5578 0 obj [319 /XYZ 38.2500000 173.750000 0] endobj 5574 0 obj << /Type /Page /Parent 2 0 R /Contents 5579 0 R /Resources 5581 0 R /Annots 5582 0 R /MediaBox [0 0 595 842] >> endobj 5581 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5582 0 obj [ ] endobj 5579 0 obj << /Length 5580 0 R /Filter /FlateDecode >> stream xœí]Mܸ½Ï¯ès€m‹ú‚öŒ ‡† ääx³ ÙEœ=äïGÝ’zz¤~Tóu‘¢º¹Æ®gM‹,‹¯ŠÅbÕ»?~ùûíÞ=ùÏîÛðûó—§b_—EÿÏîðë‡ó?ÐÍ~øyW7åîÛ/Oßwߟ>?}îþûý©ÿàË󟻟þ·Ó»?uÿþ¼ûëߺ?üqøK‡¿ðËS­êî÷okÕýTœ~?üù¿žþò»Ý¯‡ÇábÞþÿ¦hkÛÈXúûÓ8MuüõÛ·_ŸÞõ ð¥R­m›²Æîºõî¿ÿxú©`ì¾Ø·V©º²uqË@µ>Œ¤Êr§tÛjëÙ@Ç_2Ý«7… ×ù‘rq®(S)wï’‹Û”¦gPYáÿؽ|纰E°ÎÊŹ2..î]nquQ6ÍÀ :ÿ_»Ðy]ìüH¹8WúÅuõ¾o¬Q¦Ö¥=,ôa‘»¿«»Ÿk3üsÛ¼U„\ð×îtÞau¸Î”[pÜ»ànVZp§u#Ï¢×îð_Ù2Üâö”‹seXÜyïŸ}zÁ¤ôlÅïŽ?|}z÷IÙƒÌU»¯?uÄÇìûÚ1¥ÜýЩ˜RéÝ×w¿/ õü‡ÝןŸÚ}¥Ë‘Ä¥–âü¦†ß´¨Å4þ8Zì[Šþß”ÚÿS[>~í5¸ŒDÆ (/…ò—>õ~ƒù»I¹ddÌÀù8ZbÊXyËš¸%ËX4Ó£¸%„«Ú0wgR‘²ôQØSƺóbK­Ê2–²ŒéÄ­»ª¨o‘(}%Ö¢Y.¥5/”±ä¥OW· âûŒŠ H¶ûR—>[‘¾l÷¥ }‰ÈXeoY{ìSËÏCg6‹p bÝ9Î#/_ ±_…'e)g¤¯€¾x [Ò¾º¸åvBVúò†´ôeâÒ§o¹·Æ>¨A Œ}w¦áe¥¯dnAbJŸ½iµd¥/ßóJK_âv_]Þr£!,}˜óX’°e“°Œ Ÿ: ½œˆŒÕ·ÜhËÖ¢ m K’°Œ3•“±X§:Ö˜ñðªû!•Þ[s|!0…èfß´Å‘ÒéÂÛñ“³‹Zt {ÓÄ8ýVj_Úªé_Y8Š«™Î·8Æéa´yýƒÞ27㸳Uõš 5pàÕYÌÌG7°7ø*`Kƒxyà˜OïÍTfot£tymÆ¿KÞPb_êm&€x‚x‘{ø*Ç™ß(ø›ë‰Å’R@^`ypH ìM?#™MÃ~Œ§ú›f¼¶38ø…PýØ ÄÊ »ñ8Ç©‹ ¬x±+jàšÕÙìØ,°ùƒ[°qˆå›§„à AÆp-±iÖÆÃ€¶/O3d È Àù` ‰Šz¼ϸ‘q#ãÆ–qñ ðúSíØÁ¸r'*¦ÙÑS•1͵Z8ÐÈ^vfLs¶Ü¦i,11 ƒ]28Cº mއw¢`Ú&¢d 1 õóP3†)eÜȸ‘qc˸‘ÏCLÓÇq3¦-S+ð}}ʘæ”QYLƒÜ‰Šj AÌàòÙÆ ´ÍðH€gDÅ3†ˆf pQà°ó]OÆ𞋊e½HÏaÀ¥Ã[Q281à9âNoLj0œ”!&ò(•#M®’ÒM>êÊÈ“6òàçk¸%*:˜³ "=Ç[2:è@´DE‡2GsœÉ2#—³Ó3:ˆ£'*Ô92ãŒ"ÊÂqƒÁH_ö\<$qƒ¡ÚÓ¨¢¥º_of ˆŽQöó¡ÄS|Ñ6ßœQ)mwF‘D‘KÜ!”GE‡*gÓ¸fÙ’2:¸1 thržk¨Î¶CFyt`RÿÇDS䇫¨~˜x¨Œ) CT Ð9’áŒæ5(~—o13¸1Î4…<}:ØÉpÖ‚c!2:°è€ß—§µ¦C‡*Ç8\#cªE¹so¸‘ÑÁ5NÚ¹i:thN£ftpä¨c$ [ãÉÌèàÇBîXœ3@ œÅYtaÍé±.Î2ÔŸ˜®_éÓN˜R,SJõ!ˆŠ2êqчY \_ ë’8ªàê0˜X\/d6 by…6pUL±¶FyQm­?mêÎËþ <–b,fðó‚fŠ Ö8æ¿1Xœ‰º1¶„ëƒù† »àb:müÁ¯Þ%Õnú–KµfðVƒÄ:ê<0*"ÕZÛLôšOY-\¶ gÂ`K ¨í{Sv¯Õ¤7¦®ÆIbW;J‹}$ÍCá0–#ÑÌ8˜‘ﯶUÖ—;¦ØúÌW}oªØWµzu)2*ðæ=¡!"›â Õ°ÁUÓ!Cð[Õä°Vñ~dôÀõRðΨéf{‘âe³;¤œóRW=+ëòí”ýaúrÞ£–Úʽ®Ê‰"¾Áã4°¥…½5#*ÕC`pu\úF£q^òúL[¹c0½ŒT{£ôDâ`oéø`ɶæ-ð| ¤úì Žƒy0£w†ZÝ7]AæÁ°ƒ¼(°ƒ¼UãVMi}ÄŠX.¸¯JuŠ™½lõl©Dm‡…~½)èÀßHNU>—IøçbBçéOS’®?¡G;›LI’=õ®Ú+|$Ák,»K¦Wµh‡‘ ÷/Uãúú“³í– ÝŽOÞ¼<„¢µÆ_x™ °¹B—½ã]÷ëuLˆoÔÔ‡óÎ[帉kû{ózX±Ì.¡¯›¯-ÞæÄ²0§PY+c-»pÂ3cØŽ™nÜòÀâÌè\Yw§šášCu¶$ý†óuÐK’vƒ ŽrŸL©gŒoJ~gÇL½‡¢›õŠÏ×Ï<°É10ÜÊ?"C¬¨/ Ÿù¬& wß-ž:V‰LL f¦ ¸°¼¦aáõ¢â‹à*«êÅÅLð`H™!|çaa(SMW F‘;Þ(â˜tœeW4Ë îÍIß›àš™ŽX~â5Áû˜×Ä».¦–«ãmñúçã3¸ÊæhÂóIYF)^ã÷вŹn‚ßê”u;EAÂê0*±e qÍ„Û{¢‘¹tÇê÷Æ\¥a ‹n¢€2Xë™ Ê^s=Ü%uðeL8â"<Šq×Ôz"RÔƒuQe»HAHÿ¹æA |¢kÝøSï Rö‰Ê:ÿ <óì âÁ ¸ÛÔ¡¾ÑÛí¶©øD¹`¢å$•^N‘âH„wœxI‚A ,Æû¥cqÎÛM*qâƒô5ºPR’Dä¥l—×d“Ž a©ÀŽ2&ý ÃQìÈ$µÆL‰SÕM“åÞÝ8!Qšœ*ŠgŠiÃ¥×wÜÅ”¾¶¾EúDÀéñ™ÒX’Vß3NF$о©'ýªÕ©ID+»>=n ïRn?ë×Ún²oÀ˜«yÑG+[}¡ãÌø„@È[”=ÒØñÑbÊÁøJUÃ’ŽX¿;ôN­gŠO¼•-¶=’Àë¦Ò›– ƒ- ^*âp¾Q‹¼r$?Äþì±Qñf×WØY Ë•Æ>9F®V¿jÇç&váÐâ´WbÚà7 ˜€,;I`q«Ú5vªi6½S±†•µ ð ïN=µq¤¯¬ÅeÞ}rSÝÙddèGpá‰7‘­IÊDààÞf)‘˜X×Mÿ¶ýf~{ÑĺT“½CÕOÁŽ5lPàoˆLÚk©ÓLñgËNáVÎà†púøÀ ñÐ-BjÙ^Qžï¼Ç}Ö“@à$–4œ‡ÙÌÌ3¥‹ñÔ§Û‚ Ðt¨IÜ[$ÿ¼*6õ”ScáÏÆô‹ÿ7†IÚ+9c%3!cÌËp5r}aàÀ&[»cy˜n& \¤è…hÊ ê AäG÷Hƒ›¸œ1g€þù—ß  ?ðvIд=ÍDFËéaºc¸dÞ y¼kaNLþÒUS:9ÎôU9µ”˜3}ÉW# (úU;ýMžµ)Tî©E `À€,Ý2s§ê-Ç,ă¨R‚íÇÛžÙÀ„†[·o¸¬šÂ‘‡3Ci¾ø›n oáæEh:*ƒÇú3Å—3p¦ Píqþ„Ky'ÓHz1yÕR^0ÑùY¹þÈêd‰Náߡԉ+‰Xëí“Bp*­7 â\ˆ/DRœÆZÑÆíüž?„Ç~V_æêÐΜ±³q›TÏ„wkç«C¸‰" Ë Ê%6½g¹a™å:Øè¼à’ÞÛ|6%¢ó,›Ðë½)bwuÏkO0ZÞoâ†;eÄA€z´)›‰uÜ«bï6÷˜r5±l`ìÇcòúWñÑð‹)׎y°ºWÐ'1;š!w'LÁŠÉ4·)¦Ì·§ƒõÌëY0Ÿ“+žxë±5µ©L1;zHxᯠ¬­´ËMMð”04˜¹õ]w>û™¹KZßÕå±ê„IêpcÇñ™Â„dÞÉ4ð.{ïêe]¶¦vÍGiì™ 0œ èù0Ç#ògKðâ8ʉÖtܔ꘻3·lªúyƒðÉ÷aüDŒ9µ¾7H–jìŒÇÏͶ¦GO^ß“ÅÃõïr„gúqíù0!íŒÿ/ù0åuˆ×/3SÇ£øX<ð(FAÄ9‚6E3%éKŒd£ºƒz“U;=×&Þÿ«Š qAããHÊÁÅ› ß@ »Ð|êö^ï^<ޝáNúî$änv‡¬ž2ªU=rÛ¹‡¤-ªØ÷YäÏDâ=jÀ£Üëiêyõ‰øŽƒ[†,µ—zkF˨ž”Óõ(âEk®lqŒÓ[`ÕÞ—ðü̃^$T5JË+ú´ý& vã% 4äA›Ë8»d44v$æaÎ©Žµ6ö->i™”?‹žùõSÝK¦ï/ÆûX9¡Ò+šÌÈ“£É#Pè!&I #ˆ²IЮÙ:-vɦùYÊ—RUµÕDW9²µùU˜­ä“üCöîQ¨£U;Ž”sÊQ‚öÞ”ñFÕ!UŒÖ’°HDg2wÃO$xŠ©”E¯Àd…Xæé†oü¹Ì«¬ð‰’êfz~©i.꼤°µRK:È*XÜ%ä´µ“5s„N0fÐ+õô\7¥N\ÿ _ ‚œ£1 xu0s*øŒkø¼À\2–[s”çÆeãaa9ªt8.S‡ åÁR†˜6iõ0¯qÊ%¾Å‘¤º\–$¦(¦hoŒ$ weq¸ØÚEz2+ga™•8ªª¤ÍÀ䎒– mXú°$áõ!ò°ãq3Åóax€y¯œ©2ÊÜ ÿTË­–àNgt2.@ú@ÅEr‰ÇÃ7ƒŸØÁ1õ³1zyE[üÅ:êZÇNÇã:Ë‹†'‡TÄ+ã­L©nX-#V ï JëUFmÆ2ç²v>cÑaiÆçOê@à¯ÃÞ%J‘;¸ƒwtˆ³¤ß9ÎKHLkÓͲ,ßÛ™ S k2ºN–‚H»¶Àó-ÛÜϘ£îÀùà5Å–5å/‰QQHà2 ‰c@Â(´=s”ÿî×î{'èÎ}ðyé/\qS×\L¤Ì¾P‡ëú>EÌôÔ]º“ïqµ¾p5Ó{ðõ_8ãv5oìj½¯fzz .ÝW½ qÌRÔÑ%Ú> 3E øÖ¾’T@bÇ.³ ›úR÷5l±h ÷¿.%•×ÔÏ®úY;üÜQ?ýb² endstream endobj 5580 0 obj 4518 endobj 5584 0 obj [320 /XYZ 38.2500000 410.750000 0] endobj 5585 0 obj [320 /XYZ 38.2500000 410.750000 0] endobj 5586 0 obj [320 /XYZ 38.2500000 327.500000 0] endobj 5587 0 obj [320 /XYZ 37.5000000 394.250000 0] endobj 5588 0 obj [320 /XYZ 37.5000000 394.250000 0] endobj 5589 0 obj [320 /XYZ 37.5000000 356.750000 0] endobj 5590 0 obj [320 /XYZ 37.5000000 356.750000 0] endobj 5591 0 obj [320 /XYZ 38.2500000 327.500000 0] endobj 5592 0 obj << /Type /Annot /Subtype /Link /Rect [106.500000 365 171.750000 371.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 5583 0 obj << /Type /Page /Parent 2 0 R /Contents 5593 0 R /Resources 5595 0 R /Annots 5596 0 R /MediaBox [0 0 595 842] >> endobj 5595 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5596 0 obj [ 5592 0 R ] endobj 5593 0 obj << /Length 5594 0 R /Filter /FlateDecode >> stream xœí]KãÆ¾ëWð`µýä Œfgä`°ä`ä¬c†×ÈćüýPbSÒüŠd©ºEjä…½ëéewu½º^]ýù/_ÿ™ýòGöùñë²oá÷ǯµ-¼jþÉö¿>ÿÀ”Ûðç¬(}öíûæ-{Û¼l^êÿ¾mš¾>þ­þÓÿ2“ýµþ÷×ìÇÔ?ü)ü¥ý_ø¾)tQÿþÛá÷ªÐõŸÔñ÷ýÏÿ½ùûŸ²ß÷3¶Ë`Þÿÿ'«UaÔŒ‘¥ß6í6õá×ß~ß|n0o•ÜhçT¦u™®œÉþû¯ÍÏõíôj[9­‹Üê’… ³_É›iSÕh7eo¡Ã/™éu„ÉWñ&?@.ŽmsMϾ-Õ¶0Þí ½'²/KSÿ¹°áŸËöå• Hó}κm§é#LžûˆÜt€\+-Áñì’Ò\3Kƒ çó(:Nÿ5u#Jórq¬´ÄųG–ækAÜŒª"Ðä8} ‚;à äâX 'fMðÒäiõLòh;MaòÊ—ñ&?@.Ž•–àxvAõm•ÖAš]!¢Óôðo/âM~€\+¸Äì‘¥ÙÚZƒ4HË#XßgÓG˜ÜñTE¹8VZ‚÷f™3 ¥ù ð߈w¯›ÏÏ5Lyöús ÙaÁæ·×ï›Úü´÷vjÆ{ý)û³RÚü½þº)·e¥rãð5#ª@#ÚÁo#nëlㄟF1œ†@+øMÙŒLX˜³uSB¤<FüÖšR¿Ÿ-‡èȶíGS hfÓ¦:}c»[‡tœ¢wÃø{z­…á2>ÖN+ÀÊ…?°²·¾]µ£Ú `±‘éÐȱ%Ñ9œÍAØ<Ñp8›úgƒØQÏp§8›…xÃPˆ7ërR}2Ñ^CÚ+Ìxßûð7Äl“lJy,ìªåÑBÖ)᨜µSYÆ8̱)å¾27*÷ò ¦É¨úƦ£V^;XkÖ/XN–¬_0ÔÂFè$H–æÁ܆s9uBm•ÛqŽ]²¶"NÆ:˜ŽøÌ—ø< ´ ðˆgž—Gw&8zj›º,νL»õ.ßœm;‡ø›Ž`ÿ:®x6«;^b8†übFèú«,è{þ~ïŒ84€TÑ~ÃÙ¶9[ïá^4>cq|¯ƒ…üNÀÖÃ#BLɃ…S”ØœèÕ1’¥FªX"'p‡ÃsXnážÍ4°iÝ~tF5\'à æñV¹îù†Ùôa²¢‘U­$—ÐÃ)lÙªDh©c»{Eû| _û>„·‚íRìIa_îa>líiר¿Ã[NòÅ8'Aüb/‚ð¯á:˜Ç0_rxÌ>2¸{6¸,g1xlÿÃb ‹4¼\äw^NÎËœužA¬åϱ•±˜/9³±ør—‹¥v£ð#˜{îºBXº‰h8öJ)©¥µð¡q1FDÏ{¿ Ø0'qøŸ€M4JÏ0ÎéFìŒkF6hÉô!pͰŠr6y3Η²#7Æå~±b¹˜ .ôÔºó¼ÅgÃî#(œ0gYV‘¤!‘¶Áyñ#¬ýŒUŒ ášCmQáP›˜“#ÇÚáK:©­Tµj©õ 먩ÀÞ®°»ëÔ2“F2L™X2d¥ W͵>:&´Ô*W,óM8Ñ|Šb­ˆ×áT€áH+Ž1ªÿÂIyž˜+’žêÇüõõ'Wm=bdÁYŒT¾>+¢ËÁ6çTçäR9Õ¯'.Áâ05s/æ »K:3_¹àl ‹¦øþ¶KpõwºÞ(sI¾gÒ$‹y¬Ë—móå’Çß?ŒÍŸŠûˆ*Q}ɱK’òr~I¦aá^‡Q¥¤×¦PU]sZO¨¾µ  lùÆj8Y¹ÙLY¢ŠEŽo°RšâSc‡qBsòÎÄ~8Õ+¸§HB-¯í„šù»¾Ö·Kæå%kÕ%ã-…<Ó·©÷™ºÌ{Ÿ³{Ÿ³÷93Æ­»Ï™p_%5Î`ß}ÒÎÄñˆQ¢Ž€qŸsq“»UË™p!lgbË#Q ÑI&]m«1¥ßwŒ~ã~o¬ès/Ô‹[4b`g·NŒk™Ÿw$ãúIy|„sA ·Tá´EÂAÙ±Ò´¨Š¯«ùˆT ì,IèDÜs²›^!&a€4¿iL,—¶ƒe–ÀJ kº™ü]²Æ®OÐ>Â-RñÈô£•Ó!7U‹S‚`¢ÍŽY-±æÁd°6 Ë»Ç0Qw3†x„S7}?º¯ztW¶{t‡8Å,%ÂÒkEÏTÅM²ñ¹•ꤙ^XÃj´Ž_Ñuzö’ès¸õ?ç “mèN iuHñH¸ºåFDÝšu´ï'àl;H',>˜#!F‰§-p „¡zO¬°´ÍX'AèÎOÁéÅŒ„¼`á–œôΨV®ƒ1Â#øÄJˆÁí„þõWW Á”?'íûGÝ›ŸLâ ='Œ*»<ÑeL¼%Y+“ÕáäbÿqH÷v´9H µBúÏ{BèXíŸϾoöoÄŸýà·Í×H,´_¨£ˆ1U°vå(FÛÆÚÁ_½ÏÒtšúEö=i½uÛcŽ»4Ý^–i±+¾#Uþv«&ð70sÈ;d‘ãæ§G³ÐCùö±àà¼ý,¥J &#«ªËÉ˯?Âaª[iù)¨%Z1°\[g^¾~)ÅÐN§¿y˜*ž‡ƒZØáã¼RxÉO@‚sXá°èÍ?—)ûç°5FN:â8®5’#÷¸XÒ&¤ÊÈó¢c.³Œφ˻ZzwËȉBiXڌˡÇ A‹«q÷Xqõ,„lïj\âžC¼áFQº#ÄNw­L·‹èƒq`±,0x4d•‡ Àœy_[H|Ù"¢ÚrÚtô¦/!eO‡Š¡´7¾Í^èüý’RÕÄ¢¶àüÜÄ Ê[±¯žn¾~R´ÐYï”s8F8ƒâ.ßVŠ­£²–Nu>¶Ùñ60f(¦5”Uô aø1ÓòŠqÎ;âÒ§%cºH]t±Ì©:êsÞ =Uà.ÑF§ËQ‰Éšo}˜"êdu œãóÁô[UKŒ°1Áæ)‹È²pŽŽxA«1É·­bÖpN³*`fœX¦g&Aî«™×wçMÈyƒ³aó'ôM™Í¡-gë˜EeDÙ<ŽìubÞˆŽk†M0uŠTøþ¥ëž7Œ{éÍ8x8š Zêe„ ®²ùpMçD âR£%$ñl¾àŹH&ö”âÚÜÛ.¦ŒÐËÁ³";·ÝCaRŒ‰sm™ ºþ¥5‰ŒÀªL:ÎÅI’›s.N×)â_t=mÒ É6çÔ‹aÃ÷…¹' Ë– Y¢;–IŽe½né~.Oº@¥}1ù`žÓZ_ÔÞ¾)£QSMæNÎcDc^΃*c-Xcr§U=;þB«{=FIqÌ$¹Ô‘ âY´øqzñk2©9¥šS0|c×Ç-üf ±q"&Å‘v†ps¼0ç!Ô©R ¥jsæ‰ G1'¢dþ*Æ«‰ÙØ£ RO¤äØãëäØ<•$ʱÄceŒ‡æ‰&~ÚDC>Qþ÷øbÌ©·tŸ£²~rÅvŽ‹ßªªqÍ~£ÞtÔEÞÅîŒ ²yqNaùôjNØ•¯¾Ö›á÷»E³vÎè¬)\Ì+ÚÉCøòsŒ;Y1“í!\KƒLá¸2¯ ¦Ð’…It[ï''ù…^B×KDrw²ÇÛõnÉ„qÉÈŸEWï–<š§OápXå\»*6T9-ÑÙˆ‚4춉•ªMÀbÞ¾9}G€p´]R,–æ½ÂrÎ8¼HÐ1Ý‹äV+=J!‚v˜{ðîpX§qXs6’âÐÖ=LÅJf¤”amÆá‘¹µT Ö<ï‡!éDjqÚ¸ÆAy¬7°œ%²ýÏÐi„¶c¼¥æ1'Bi±%¾­¶Õ(M 'VP8Ò㻞 I1W´EÄy%£®/5PÛ`K€¥‡°Å|cvö <Þ# ¹xû¥ÊGá¹'_¥¹ogÑmò5åyb¬_•.‹·¦l[áÞ©Œˆæõ¹^à ÈÑñÈIÙOö6êžÒ‰¢uÇÔ*+‰dï(h<Ü)§”UŸùaª7°aÆ:N5˜¦ÈtY„bs=º‡%ë'Ù)8ì†u°ð†¿a@p|/è¶ÀAžë_Ù[-¸¤\¿Œý… Öz9øemÅÖ‡p afÜ{lãg劄vÃ#¦ÿÀZ ÐÀÓkÁ1Û¼÷̆&ð´Žël8ÛsØ)º°‹ÍX×µ…quTÞß``uÜCWÍ lCãÙà7¡6AÏÚúY.Ãíÿ¬NÇ'èŒÀ=a0˜l™³ Æ*Äæ’p0ˆ\'¸ºCß``ÆœUvÄ€`¨®Äûú‚Òbƒ¿Ùèóî‹:xÃ2cCÊRãxù·ÙÄ(Æï±æ—Ël¡ì6èûsáÅâ†ÅZŸXŽj/ÙËæÿ&’6 endstream endobj 5594 0 obj 3937 endobj 5598 0 obj [321 /XYZ 31.5000000 75.5000000 0] endobj 5599 0 obj [321 /XYZ 38.2500000 465.500000 0] endobj 5600 0 obj [321 /XYZ 38.2500000 228.500000 0] endobj 5601 0 obj [321 /XYZ 38.2500000 199.250000 0] endobj 5602 0 obj [321 /XYZ 31.5000000 75.5000000 0] endobj 5603 0 obj [321 /XYZ 38.2500000 509 0] endobj 5604 0 obj [321 /XYZ 38.2500000 465.500000 0] endobj 5605 0 obj [321 /XYZ 38.2500000 228.500000 0] endobj 5606 0 obj [321 /XYZ 38.2500000 199.250000 0] endobj 5607 0 obj [321 /XYZ 38.2500000 509 0] endobj 5597 0 obj << /Type /Page /Parent 2 0 R /Contents 5608 0 R /Resources 5610 0 R /Annots 5611 0 R /MediaBox [0 0 595 842] >> endobj 5610 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5611 0 obj [ ] endobj 5608 0 obj << /Length 5609 0 R /Filter /FlateDecode >> stream xœí]Iå¶¾÷¯xç~#’¢ 0[È!ÀÀääØq#62ñ!?ﵨ^$}%ñë"%½–ö´G#Ь½Šµ¼ûã÷?ýó·Ó»ßÿçôCøýã÷wŹöE÷Ïéúë»ç`›søùT7þôÃ/wßNßî¾Ü}¹ü÷Û]÷Â÷ÿ|ùé'{úÓåߟOýÛå éú~¹«M}ùýß¿·µ¹üT<þ~ýóÝýåw§_¯+öŸ ›yùÿß9cªÖ\·1óéowý1Íïß~øõî]€¸¯TֹƞLéÊ“iK{úï?î~º| _¾87¥3®¶¾¼üÜVe]øæòˆ.üÃ~¼¶_/Ú“±mq2U3úøÃ/¥å,^ÖUºÅv®ã*#¯žáÞ6ÐZŸj«§@IemºÅv® ”ÝpñÔØ®Ë€ «èÃìqõi¬K·øÃεÒc.žÛ­)È.ÿêíiyýÅË¢M¨)v®•ßxõs[S_ý3¡«|PþOË'XÜ»„‹?ì\*¹Âꉹ¹ôM€æÇv¡N—O°xíÒi†nçêPéŽWWäf_¸ î|­¡§Õ€ßm:fîv® ”€Z¼xbVö¦¬Ó™aO«§@ˆMhtw;Od†áÅ//š¶*ꦄ?“Ÿn æ/Ò¡4ÍiB‚dúò„²Jýe»Ú—¯²8'¨MiýÄ—¿Ä¬ ½ûyú&¼øáëÝ»û ®¡œÓן.[{øf÷Û× ÇùÓw×ÈC{yúãé÷—-}øÃéëÏwíù*û'¶EO Ÿ|FO\ƒž˜ ®V½Áw¬ß«1O Ÿ|„O D „†µ˜spoå{ø ÓÅÅpð®ãw ÐÞ†(|"@” æ<¶!N‹ûø'ÂÞ ~<æLñÂÀu0øüõ"ÎSKâÒøp –Ä%”·”$ÆTw]gÄ–+÷-¨le“PÆZFŸaé ¿ƒwP|"ðƒébŸËKlÿŽ /·!I½Ûo¶ŒxžÛ´eè¿Ä_Äßf·™æÜ´ÅÃ~†‡öggóòI‡øò\º.-ãé@2®ééæ;¾w­fɇkød´H'ÝÙ—USû16 6¨ubg‹Å›EúÊì@ Î=TN”I‰Wƒ'õ„k•  p!ܰXuXµ`œb¡†!VGð‰x€ª…28à®1¬=T•Ø„Ãæå> B  ¢—`Ú ƒ/ÞÁÒÛ´ô?Ì`ŽvvmOÉ\!½M¸¨¾ÙobËÌÁá#InìÓZx[á#ß¶;àÍCoŠç¹M½™>|Tùþ^ÃuH4¦j<Ç]:No˜€\- d*ƒ¿ƒ÷w0ŠÞࣛ"þ€Ì1‚g°$*Å@VÀ-^ ïÆáð$޲10ì>õ 2ÍQÄ‘>þð(J‰O<"xPTÙ•A\ÙØ”gk^îÚ6ñ$Ê ×U#Þ[$QL2Ñ‚)¥6»Øp/ÕYY.ç ¼q†-mI1L¦KL”˜-(ɽ\° |¯zF!lùýRéі̧ îOo6íË Fëû¼”ŽgBd\5„.&glycé 9Là=,"TÅè°ªuš¶¹°GhuŽíyÌëØtÅbŠSlÔê t,ï‰Wû„ÑõÀ…—<Ü, Ñõ ¡I”õÅVTbÅQ™Cs$ÓÞ×è–UèÅrkJp%òÅ [ZÂÒ‹p?F6“›kiI¿*‡¤ÏÜx NÝûf|_FÜúo9:ŽïYðjL,‹3¼·ô"£ñn±±‰2A÷2чhÎU²ùf%_Z Ѻ¡„À¹5a…Êð~‡Øp§‰o!±¼™+ïPºQ ô˜Òå+?Dý'Â¤Ü áÁ8Œ#3CŹ`Ę2"tr¥y)ó‘˜%@”hP!hg¢­F.,Ìòv+«)ÒX ë·ä’ÿ0™¸± þñäíQÒ‡:ß·"/ äŠèvBˆ‰Žª¦x >Ý(–C\I¾*g  TÝgáâ;®S¢S¡¢LÕdû M¿½4“$Éü7ÿÒ€¬âeZ÷¬šdºJ§?tD¦9¾ÄtA=L÷ÌÿŒP$b—®·ÓêÊHO7Ïe­œ J[.OŠËq¡Îãb2ùŠÌÖ€ãÆL•iC56Ã?’Cû4§Fì£Ö(eÎEjߌÄÌ@FÝ©ÞÊeí‡Ì’¹øï‡€Äà"h(fT›Ë's ˜’éEG1¿Ê¨Ý<ìmCUïA@ËÑÓ7Îkúm§© R‹0c(I§Z–+R82»<шI,ú–1\îÎ3©H’b¿Þ,÷Am¹‡Ix·–usdœl<ã„ȸµPÛµÐVv×òIw ÊÍ5ÂÒîíðÙV²-òðóÞ³|±FeøYÕÐ¥ŠR,ÖÏøƒŸ7¢QËëw÷Ì%ÄV6<†?f£ƒcˆG;»b5å‘a^Ðþ˜S›=Œ‘$1”5”$ÆT1×ð3¶\³ol©FÊŽœÅN­ÐÈY¾ž¥ËÃ’Ïs›–Dê««h†ƒþúgè¿9]ÍÔ1ñw¡ÊëØªðÉÔQœ»,·‘ªžxFþl‡©qæžx§‚OZ¸Z‡Þëeu릃&žc¡>»Ñ1,3Y ’´˜¥«AwP†Õ06FÖtN­uJfºS¾‡ŠªÆÊNÂX¯š]·kÓ¾…)¶Í5ÖG%p '¦¶6èn.(Êóä˜Vwa0 ù°ETl‘) •k°oÚIP”þdú¢a‚ÇH¨6«¶¨Í ÝÕ[¯l:lI`:ÏbûŒ8 V8ÓÀR%@”‹oU¦½s Ç<Ñ•]ލ)Z&¥ ÃÛ õØžúš(O§S½Ù"µºí51±×‹¶¾®¥‚aC8boDñîÕú§ÌD­±³àÏeh¤¾o‹(¸“GÙØ_¾Yݹºa»$"7e質‡l‘‡/·K¯¶TZ|«ò´.×ëÊ:“®n½}ùÉM¦«‡ë–¨tõP½eü¹³BŸ½ƒ÷Ì«#OO:âŒJqQ»Æ;Òâ ¸7øŽ…ïPÐÁÉüxo&—UòÔx_]¯–^«š·³Ýæ‡i ÏL5DµPÃ…kQq•Ó“WÐâ*¥ÉmW!¥ÚÄW9'â¢L1ή•¢y#M×jEª›‚6+OSj¢ªpU÷°z²^.R9!¦ñè&Qo±Z`{ •·€1¨š5x¶Î¼%ææ‘‘i•£à¨TÓ}&‡sçò© ÊQk>á$¡ÆkM5ÐxL“è­sá|Ô©ÆŸÒM[žÎtÄ—˜\º±DÝÈxDÖC:"k˜FE‘FœՔR5z;TîªöØáMQÚêÁÌÃJåe«éQÕʇźi‹5W‡²·b'íkâ†ÞæatK«Fw*£[¸Î˜K}O¥þ™KÀ<Öw†øYé{vÂ]o®úV*y²4\wm?ŠÃá¦ÙÌÀ%ÕÕ˜ÆáN-!nŠ¥™šk,†6·(>ö?ÇcÁ˜½ - xÌ7â±,½ŸÅƒoÝqÊUy3ƒßÞhŒ+È  kÌgº£n…ó@Xg`Ç j6ÔéðÔD™àZ‡rcÛrƒsH‡7'Û88\-ç`1ÿXZª…?ÓWõK›ê^F'„SyÅÔ½¨v6Ñ û¬ÕŽ‹ Õ2­ÆOLÝ.¼Ð)³™¼°R­5í¼ô©ì¼m½þ`9šM)õø¤Í­ÕΚÄWEµ’µ²Aâß´äÖpÔ¨±ÄR®! oϲ>ܼòâ O¶fz‘mËc®o™ìQ]©³¼ßSL Ÿ Äd’FKG;32qk*È—¸Ñáöl¬=´í‚ÙŒð <®\“ure¬®ƒJ*XnUïÃ_Á ‘ÉÒ!ÖJœ€§Ë@BÑr‚R¶ªý 3è:_ )€ {e!DØPÔõñòH«ËQŒm];ĬWcºõ­ßAq¶ŸABJwΠ[VΊå.³Á7ÑzyáÍÉ´“4Ø»)_~rjúü{ô$ÚŸíðþÐà¹ôøøÞ©žX­E«AäÛÑøø`¸NL¹·=Áß1-ÜÛ'øÿ$bO< SÍ병žÉd'´ÖŽ?»®Ägî­"l<ƒŽïÌ7s˜`šPü†}&ø× ‚MF„T¬tŠÜ˜ŠTÝ^bË ÿ[¹úK·äÎ ²ìmŒ°72+ —}M°Ö¨ÖÌf7µ•}ùÉmÚMM¼ÝLqãϰGøžX-ØÕÙu¯,²MÜüŽ`…Á‡h :ØÖÂXèhÑT=™.€þŽQk#ÛgÛyiJ¯?u#*UÇ$aªÌ—ç† a˜ˆ+&¾¨+}€|ÄW˜L>ÎeOQö¡ê­¿®ÕD•#3ÁuÕN9TÑrÎŽ©G[qÒgÙT=„¯¨Nº™¶XñiÐe»³cTo®Lv©nZ!˜€˜’m2ÝŽ©?e$œðµ¦¶eS}VVºåg1ÝÕˆB$û‚‹© TqO ¼›M|N¨HÛz¤Huµ‰ÆÝ}6%´S`ƒ´­uŒ •Ì*"¢‡Myþ˜¼jU·‰êüá¶á°ºNÅ»JNœ®Ž'.9Lòd‚>ÞfÚÙC3âY¨CPÐXF¨Çåxº©DPàš¹P•IŠUÊÅ,3Šh¤­¾=ge6;'.B‰Çaé:L^SaGdTªÄ¥™>ã‚p¯ ƨ¸þò&ŒúФÒÝ3²nÅÂò›¢CË $¢ûšjÕ •¥eŸêuƒNÚÚ+ªõÃË[©^H¿kÕÎàB êˆ:D¦¢4Snr¿8ÕzGFéç&ª<à‚i›?qM$“æ2!¨ö(*³tC›éÝPSÖCպþø9_ù¢~ÌσC¬„ÑfD 3:NH[88;äÚi ò²°XgýÁÌ0³õéÀbü"”faœÂw„0ãÔÌá“ny×xµ#zgâÓÆ>ÎÍÛÞ=N•¨¤VŽ”Ú+r¨ÛÀ =¤/ÇWð\²˜¦Y P6<3UyÞù. ˜îc z¼k¼an,VÊúoÛWÀ {ÂgB-[ˆa‹©âQàLÿØ Äï(Ö59;…Äæ‡®èkàûB¤ú\·ƒˆKŸà_GÕÖô_†\ꊳ-ÜK%…#!vmÙ?Z°ƒ¾> endobj 5620 0 obj << /Type /Annot /Subtype /Link /Rect [60 764 94.5000000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn3 >> endobj 5621 0 obj << /Type /Annot /Subtype /Link /Rect [87 756.500000 161.250000 763.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn4 >> endobj 5622 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 163.500000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn5 >> endobj 5623 0 obj << /Type /Annot /Subtype /Link /Rect [87 742.250000 203.250000 749 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn6 >> endobj 5624 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 168 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn7 >> endobj 5625 0 obj << /Type /Annot /Subtype /Link /Rect [87 728 132.750000 734.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn8 >> endobj 5626 0 obj << /Type /Annot /Subtype /Link /Rect [87 721.250000 207.750000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn9 >> endobj 5627 0 obj << /Type /Annot /Subtype /Link /Rect [87 713.750000 165 720.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn10 >> endobj 5628 0 obj << /Type /Annot /Subtype /Link /Rect [60 707 166.500000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn11 >> endobj 5629 0 obj << /Type /Annot /Subtype /Link /Rect [87 699.500000 187.500000 706.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn12 >> endobj 5630 0 obj << /Type /Annot /Subtype /Link /Rect [87 692.750000 144 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn13 >> endobj 5631 0 obj << /Type /Annot /Subtype /Link /Rect [60 685.250000 119.250000 692 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn14 >> endobj 5632 0 obj << /Type /Annot /Subtype /Link /Rect [87 678.500000 112.500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn15 >> endobj 5633 0 obj << /Type /Annot /Subtype /Link /Rect [87 671 129.750000 677.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn16 >> endobj 5634 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 114 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn17 >> endobj 5635 0 obj << /Type /Annot /Subtype /Link /Rect [87 656.750000 108.750000 663.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn18 >> endobj 5636 0 obj << /Type /Annot /Subtype /Link /Rect [87 650 114 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn19 >> endobj 5637 0 obj << /Type /Annot /Subtype /Link /Rect [87 642.500000 119.250000 649.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn20 >> endobj 5638 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 169.500000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn21 >> endobj 5639 0 obj << /Type /Annot /Subtype /Link /Rect [87 628.250000 154.500000 635 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn22 >> endobj 5640 0 obj << /Type /Annot /Subtype /Link /Rect [87 621.500000 113.250000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn23 >> endobj 5641 0 obj << /Type /Annot /Subtype /Link /Rect [87 614 147.750000 620.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn24 >> endobj 5642 0 obj << /Type /Annot /Subtype /Link /Rect [60 607.250000 135 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn25 >> endobj 5643 0 obj << /Type /Annot /Subtype /Link /Rect [60 599.750000 110.250000 606.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn26 >> endobj 5644 0 obj << /Type /Annot /Subtype /Link /Rect [60 593 157.500000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn27 >> endobj 5645 0 obj << /Type /Annot /Subtype /Link /Rect [87 585.500000 158.250000 592.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn28 >> endobj 5646 0 obj << /Type /Annot /Subtype /Link /Rect [87 578.750000 128.250000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn29 >> endobj 5647 0 obj << /Type /Annot /Subtype /Link /Rect [87 571.250000 137.250000 578 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn30 >> endobj 5648 0 obj << /Type /Annot /Subtype /Link /Rect [87 564.500000 129 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn31 >> endobj 5649 0 obj << /Type /Annot /Subtype /Link /Rect [60 557 112.500000 563.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn32 >> endobj 5650 0 obj << /Type /Annot /Subtype /Link /Rect [87 550.250000 181.500000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn33 >> endobj 5651 0 obj << /Type /Annot /Subtype /Link /Rect [87 542.750000 123.750000 549.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn34 >> endobj 5652 0 obj << /Type /Annot /Subtype /Link /Rect [87 536 174.750000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn35 >> endobj 5653 0 obj << /Type /Annot /Subtype /Link /Rect [87 528.500000 180.750000 535.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn36 >> endobj 5654 0 obj << /Type /Annot /Subtype /Link /Rect [87 521.750000 189 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn37 >> endobj 5655 0 obj << /Type /Annot /Subtype /Link /Rect [87 514.250000 129.750000 521 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn38 >> endobj 5656 0 obj << /Type /Annot /Subtype /Link /Rect [60 507.500000 96.7500000 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn39 >> endobj 5657 0 obj << /Type /Annot /Subtype /Link /Rect [87 500 121.500000 506.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn40 >> endobj 5658 0 obj << /Type /Annot /Subtype /Link /Rect [87 493.250000 164.250000 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn41 >> endobj 5659 0 obj << /Type /Annot /Subtype /Link /Rect [87 485.750000 134.250000 492.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn42 >> endobj 5660 0 obj << /Type /Annot /Subtype /Link /Rect [87 479 127.500000 485.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn43 >> endobj 5661 0 obj << /Type /Annot /Subtype /Link /Rect [87 471.500000 129.750000 478.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn44 >> endobj 5662 0 obj << /Type /Annot /Subtype /Link /Rect [87 464.750000 116.250000 471.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn45 >> endobj 5663 0 obj << /Type /Annot /Subtype /Link /Rect [87 457.250000 162.750000 464 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn46 >> endobj 5664 0 obj << /Type /Annot /Subtype /Link /Rect [60 450.500000 132 457.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn47 >> endobj 5665 0 obj << /Type /Annot /Subtype /Link /Rect [60 443 141 449.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_directors >> endobj 5666 0 obj << /Type /Annot /Subtype /Link /Rect [87 436.250000 134.250000 443 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn48 >> endobj 5667 0 obj << /Type /Annot /Subtype /Link /Rect [87 428.750000 129 435.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn49 >> endobj 5668 0 obj << /Type /Annot /Subtype /Link /Rect [87 422 175.500000 428.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn50 >> endobj 5669 0 obj << /Type /Annot /Subtype /Link /Rect [87 414.500000 137.250000 421.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn51 >> endobj 5670 0 obj << /Type /Annot /Subtype /Link /Rect [87 407.750000 153.750000 414.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn52 >> endobj 5671 0 obj << /Type /Annot /Subtype /Link /Rect [87 400.250000 114.750000 407 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn53 >> endobj 5612 0 obj << /Type /Page /Parent 2 0 R /Contents 5672 0 R /Resources 5674 0 R /Annots 5675 0 R /MediaBox [0 0 595 842] >> endobj 5674 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 5675 0 obj [ 5619 0 R 5620 0 R 5621 0 R 5622 0 R 5623 0 R 5624 0 R 5625 0 R 5626 0 R 5627 0 R 5628 0 R 5629 0 R 5630 0 R 5631 0 R 5632 0 R 5633 0 R 5634 0 R 5635 0 R 5636 0 R 5637 0 R 5638 0 R 5639 0 R 5640 0 R 5641 0 R 5642 0 R 5643 0 R 5644 0 R 5645 0 R 5646 0 R 5647 0 R 5648 0 R 5649 0 R 5650 0 R 5651 0 R 5652 0 R 5653 0 R 5654 0 R 5655 0 R 5656 0 R 5657 0 R 5658 0 R 5659 0 R 5660 0 R 5661 0 R 5662 0 R 5663 0 R 5664 0 R 5665 0 R 5666 0 R 5667 0 R 5668 0 R 5669 0 R 5670 0 R 5671 0 R ] endobj 5672 0 obj << /Length 5673 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯ÈóSÃ÷0 LwuðÁÀ`ðÁðÁèõz±ð.ÜÞƒÿ¾)‰¤ÄG(¥HJTV× fºÉ$™T¼ñ1øó?ýö·ÿúûíçÏ¿ýÏí›ÿóóo/äUK2ýsþýiI`æÕÿý¦¼}ûëË÷Û÷—__~uÿÿþ2}á·Ïÿâþö7vûg÷ß_nÿöïŽøGßhhð×Mµûó¿Ç?­¦îo$þ9Ðÿüò¯¸ýmè1 ç'“>ÿÄ)SŠ Ó¸3ô÷—ð3éøïß¿ýíåçiö¢˜äLܨàîV°ÛÿþçËŸ†ß†›,[N–ÝÄ­œðÔ9a&ÌnqªM:¦ÂuZöýÀ2y˜_ê×[Þ–JÇ ¿¼†Š+{Ôæ}°†Škr[ ¨I‡5<„k/§íÚiêÊ­Ÿ ƒ»x€¬= '´qýr!_òÿ€„•Ür§¦²Ì<ØBhd+(ÕJ8±}Àxi6£ábÖÙoÕ”‘²Þéaë|œyëE¡\ÑÕξYM¸œ–ÇÊöë3÷~Àâk×ñq3o½(þÍ·|³ÔÐiy¤>bñCïG,>ãú@¶fÞzQ›Í;ßeá™ÌÖŽ–•ñgI.ùÐïí¯ñY¼ã46þДNÞ”T7eãvÌS¾½(óJ©eÆÐØJ/{ OÓ®½fÃ×nù·i1ußÉgât[ö’þŽon?÷éÉšÐbM(´yû¾òÅO¿¿üüÕ©uûýOî£ñ%Lü¸ý4ÎÂÞ~ÿãíaêo¿ÿå…²WÁÇ-íÐnü„~?1‘@ØDx5–¸>MÉ—ñùÊ™¡É'e'r$¸EÊ褰{öyüäËïŽßæe©°Š™\BE<«PI—„Á±zŒ 5K™Pój™3ˆ£L8´ÒË^ÂK™PÓ:šAJ&t´0SºdÂ8FW&Ô&¼`>1!yußÀ8 fj@™Òi< ´…a58„¤`ƒ˜}‚¡m çv-鎣ò}*¦, Y×m_<ßMÔ!D=wÊ7÷%ây8¶â6é&Œ£ Ã$“[‰´‘óçL1œ!Ô¡Q ¬oó¤ŠW8@ŒŸˆð•MŸ`8Z3ø¼Ì‚½Á¿!SðïY™¼¢àÜ0¿ÖT Ö ^xÖf?ï¬hÝÇõ× ,£¬¯¸”KÂV&(I˜ÛT˜ <Ó,%W`c«IAÅnÂ#I˜ ¶¢À1ù0Ž’+°©•H»é0=˜>ž^çÛ¤ÀhàùEƒâ^ÊA¶Á0áIJoÅôÃßÅšÓÜ}Fø(߆ç󇻇ß:ø‹)A¸ulŸT5¢È’°Y0›©NjjdŠ›.åÛQ 52´òj"tãý0³a¦¦F˜Î‡q”BŒ­DÚH‡éªF¸ Öç ´€™£V¬é‡²xïÊbךûDͰÁ‹‚ñ~áuÓ ™„Ã&_7pîÞû Û4W^¿ •6+ha2-lMAKškÎ1”—éס•WÀ¡›ðh2-tMA •#T© ÇV"íF¤ÃtUÐR|(è ßñ›š…\€š`¥{Ìî}‡nÛ-(<5xíÁ÷µ²ÂðæÞ¸ÂÊ>bÞ;·´BÊà‹N±Ù@جê”ÎT25U7äÜR4Œ3M¥gݺ :SuJÕT’ù0J–ªnl%ÒnD:LWU§yð©$hùwpÿS†Õ.ãªm—%-¼(0m—„ͲdT&KF×d©< xNDahåe%tU&KFÖdÉäaôRÈÒØJ¤Ýˆt˜®²dÙ„‡[â¦ænå—¶œoºgZQ…~ÄxY°æ„}CXsRw¾;ËhôßÁÂÒÏ'gÔ¾ò<ïå?Ùnl‰o»]ˆU@±qb—„Ç7›†¦›MÃj›ÍÁ×J7‚c~#Û.­ô²—ðDÓͦ!µÍæLÇжÜl긽ô½¤¿£ófÓ„\ûH©V2ó|Û¦þÆö½á°*ãÐÄæÃº¡Q›MPŒaWl%ÒUh°­©S¿ß1/Å_¶ÚsE2`½"5`½*"ÚŠ”Àú±Õd¯c7á1ÖK[ÖK[Äçm ¬ŸZ‰´‘ÓÓž+€õ”{Ô~§`–³Rœ; ”"ÚÂ&/36s%ÍpÚŠÕpÚŠå8mÅJœöØÊ³!KpÚa˜È•ŠÖpÚŠæ8í’såÔJ¤Ýˆt˜®\ÉNÞgbìÇJ^º©‚/ìGÛÚpomï»e‰h ÓdIØ,K<ƒÔ*^ƒÔª"Ô¤D ©[yYá ¤6 3˯AjÏg¥%!µs7"¦«,‰©Å¤F÷”1TŒ¿³—+…ŒÞ, ›¹RfèG%kèGUlð•*Ñc+Ïu¡›ð˜¡®q¥ÌÃ¥àJÑs7"¦+Wª€~\IùÀ\ÙÝÞÍ„*©\63¡Î`ƒJ×`ƒJç°A¥KØàØÊ3™N`ƒa˜™ u 6¨t(ꜻé0]™ÐDØ ":º’w„æínñJ'ˆz»ùÕð¨4í’°™_m†rR¶†rRÅ.JÙå4¶òüh”SfæW[C9)[ì m‰ršZ‰´‘Ó“_5¹rº t«|²#j‰‚ÈžBAhÆ·š„˜¿2ÂV¾ÕT¤|«©¬ð­.öYÚï³–l7¶šø2vEÊ·šò ßjšïJηS+‘v#Òaºò-#?(ß^ ™ ššâP/&) G`‹— $GCñY¦íê…ĔÖKÂfõÂ3̆æ5̆.¶žš—˜±•W<Ál„afõÂk˜ Íóô@)Ô ˜¹‘ÓU½p{¶zswM ÚapM ú`ôËJNá=µY Îõ’°Y%È ¦ e ¦ ‹}¿–%LalåE^&0…0̬d ¦0M>L S˜Z‰´‘ÓU%ÈXö®=Ùyƒ:Ü…AãïeOiãFN/ ›ÙSgõø´®ÕãÓED@ë²ßØÊ³_è&ìÊÙ<ÇÛ Kh»-«Žç¨]†ÈhLSx¦ˆŒ¶<ƒ¯è16’‚\ÆVzÙKx ilÿll"£éMÇ0¦€È 4?SßKú;úBd´5è`X,Ìí0çÂÞætÓY»IX=!~Ïi«ƒÑ›¿NÆø G&(&p޶‘VB†ØD J*JÈÍ>Sf t¥jdl¥—½ø'b%dˆ©(!7Z>Ñ…haæf¡„æ1z*!C2bÏA%¹µŽÞ½F6j«ô9À»U Š ª‘ 2“ "³5AäùÍf e¢4´ÒË^“I‘éš ²ü…R¢£…™ê¥ 2sAäV”´X±)°íBÀÂ×0ƒ… aï0ßiÃÞ±ã¹@±‹c×¢-‹îtG ËDBص0"ÃìQÃì˜"Úed‰Ù[MQ‰ØMxÌ0;FÔ0;Fä±»’G-¦V"íF¤ÃôŒZ+–¾Çž’…ˆ‹20µPåþŸJ¶àŸ÷–ûˆ˜½ÌocstÄH5ABج Tœ2ªœ2E`Ѩ85¶ò’®àTfÖªœ2*“”B¨œš»é0]5À©³ 6°w/Ä;£†FG€–J›åÂd-cj-cr€–1%@klåùÞ$­0Ì,¦Ð2&h ”B.LhÍ݈t˜®ra@ >EwEÞû8È —(2K—„­ÂeI†"³¤†"³$G‘YR¢ÈÆV“ðÄnÂc†"³¤†"³$G‘ ”\¸¦V"íF¤Ãô.K#sì8z—–GÀ0g~PX„¥4Ú'»$<Dz,½¥Ó²Ú-¶ˆ1YVÞÒ9¶ÒË^ÂSzK§eµ[:-Ëce%c ´0Óå-ó=ãX–Å‚7ïÄdm‹Ÿ¼çy<,byHèúê°Ù.‰ kdE kd‹x…%ÖhlåíŽH°Fa˜Ù.‰ÖÈŠ<ú2P »$"ÖhîF¤ÃtµK"`Ú°ksB÷1×[\yW‰ò€)äò¦%ÄFw…ïÚÞG²âZ?p`1­’ze#Ÿ”ŸlwXDÈS—!.›u«Ê€rVÕ€r¶ˆYUåÆV^wª(†™u«ªå¬ÌãY¥Ð­rV¦*ÊÍÃtÕ­*–¥AdٮÔÕß¾^9¡O¶ÙŽ×ªXœEŠ%a3÷›¬8‹5µâ,¶ˆóXSg[yî6Iq–0ÌÌýºVœÅê+÷R_8ĉN¼¦”$„úL9c˜é3Z©©¤£¹>cEM¥©•×gtYS)ô™#Tj*9ªÊ‡¡EM%ßJ¤Ýˆt˜®úŒEð¦jÞ…¬þ0`TÁŠÛ…QŒóˆ±:«P(¦¤2ÒÄÜ%÷~*:9ð‚Ù%a³bæ:S̼QT$’”B1‹Y‡n£Î3¯@UæÃð¢è[‰´‘ÓU1‹'/+ö£~B%æÛUé’ðhÖXü¨ð¬Ë¬±£f¥¼GJ–5žZée/á)€ó³,³ÆŽ*Š1Dž5ia¦rÎ/Æè˜5Vî5ß—3LÄ#OÑîÙç\¤æÏÆd®[ÃX ư%a³Ñ23 º‚àsT“kv] ø¦VÞ@h•-3¢+>GåÅ0‚Ï·i7"¦«1ôÆÆTFÀàQª¸)r¯YæÁ­ø\±Í, ›ÅÀŠL lkç¨:çO[`í¦VžÍ­LÄÀŠL lkç¨E\ÐX;ßJ¤Ýˆt˜žb@I|ï¾2fÿ£ô'.ÌY6ÌÙwÌ9Å6l”Ì÷í±%a«¢¡4­Ýæ•ÚmŽš‡¸(-j·M­&E» ií6G¨ÔnsÔ<`7PrE3µi7"¦«¢¡~j‚°‚!ìÓ-,1àdWd ÞCâ¹SQEØÃà;EˆEüáä²Âfâ,!^Á:jŒ ¼ÀN­¼ˆpžˆg™ñ þÐQóÐÊ@)Dˆ“(3œ&"Ä/€?t³ˆW²Á¼·Ãn ¨r”÷½…ÇÚjJ. ›ÅAÒLd2æ¨"çSY@ƦVžÝ%KÄAÒLd2¦¨°ù0¢€ŒùV"íF¤Ãt c× Mü˜w+¹WAeš, ›åC“L>tTæ¨yèêT6µòü¯i"šdò¡* 2GÍ)¥e¢@(›È‡¾¨ÌÍâ‘2f¯ËD”Ê@]&ƒ¾º.p²Žå±¸\6s²ÉPEÔÖPE´ˆP[¢ŠÆVžS-I8ÙØŒ“MUä¨y,d œltd]cN6W@Qka5­¢ s%œg.ÁYwÞ¶½Ù“Ô=Ù˜¶­­·²JÖÙk!mÈJqi–„‡ó]Œ$Õ¾Üs¥Ú—b4;Á8Rò|רJ/{ OIµ/÷\©öå¨*ƒÕ¾FZ˜é¢Ú×bŒžù.F#à>^çT1·¥ŸKl<ë“<Ѷ×5^ô´ãvð{åü·æ÷âi½$<®{˜Nu35ÝÃI®ÆèK¦=xÔ6¾—ð¤SÝÃTM÷ ÇdÓ1˜,u£…™ª¥îaú º‡LË  aƒÉ 2¶rþ mÍî¦`6xuÊ“ô°3ƒ¸ž,&:\ðÝz¤Ò+KwùÞUºK1‘–îr„Jé.GÍãVL¥»¦VÓ¦(vÓÒ]ŽP)Ýå¨yn ä›¦©•H»é0=7MLä\(cwQ{ºW']™&•¼#0wüÕ®ÛX"Ìð%a³ü© `ÄT `ÄŠ¸S%ÀhlååK%£0Ì,ª0b*ò ”BþTÍ݈t˜®ò§ãŽ_AkþT\Ù×Ð ŠÄt„")»$l“A‘˜©A‘X~c¦„"­¼@˜Š†™ÆÔ HCŽ6¦„"M­DÚH‡é*06ú0ï*é~M(¨.ÂÀ\lwÃD¶+4!O–- ['䉓䉓òÄI y[M +v3È'5È'9äi ä mj%ÒnD:LO…ÆI€<ýxWx Òݘüìit=ßÂiPY²$lH–¨8«¨8ËTœ•ª±•8–¨Â0³@²€Š³@5P d@5w#Òaº $ÛpYd‹bl˜Œê^×þ~DÃxö®QaÄ¥º^•n|òÿ|ÂfÁTŒ‹TŒA*.J¨ØØÊ ¶H ba˜YðE *Æyr(…àóYÒE›‡é*ø"V{ªÚ§;·µ\D§KÂÖDÏݵ'åÚ`í—^–Êeeï¶"}oÐëò+ ÇÆkÊêØ>tJìý Ìdµ€³¦°1gàõfm{Ï®ºÀö¿ôªñû4·J%Ç•m»:0W|@¿@Ÿ4þ¥ðwÀqVÞÏ=­³k"ÓGx¥)ì 4ø}}Ý$Ñup¡SÔ­i56¡“ÂÉC=QÕ•v¼/øø¢ß|ËWbyÊ0.ö´?Êÿ@òs W؛ŲÃD÷q9xœ•:=ÝÁ9p-hú¶Ö+01xÒ¤óü~š^CØ€ÚŸüÜ´s’ÑÌÐað!+¾¶·ê`êVíІ˜È#f²MÕÕY ¡0‹øewβÜ( yÙË—XÀÛ[Œ˜bÎDc*T=ày£ôCÛë0¾+*šÚ¶¤<·"ÈI°ìˆ”nP)a:·¨'…ÀÔ¾ st¡=0·'¡²|ÛY •,Áì—0f>ë¸Hüœ7•7Þ"`òk°"Ã\¸|Ï—La^ $5Ü8klµ%£Á½ùä@enð8Œ¶zUwTT±"4&¸ÝÖßAèLTø¦»´â5§91;Àúê¬Óœï Ó=¸Ú&ƒ¶Ã aB¶ˆ zé<6½¨³íÙH؃gØžbYI/4E+÷LJÝ™ÍÙiÅnqÅ•=α@IŒv܃œ»GiÔí¶ ƒ"j cn+Ý{J8 Œ$êª&L(è™/‹zж½^ “nhZΨmz åµÃ{|Šð@“d5ÏLü žñjÝå‹|{ìWä3\;2°Îòå~÷Q¬£µ;†]›dKOÊߟ¶9nŠ„Ý‘TD9Î iŒ¬œu:õò1gù`ðenð8¹ƒ€°¶°¼Ç[DEmnqµøÊ•½ÈWLoCÝñö+!+˜%NÂ0]„œìuïæþ8 »‘užòXÑÍ5æ°!¦@ŠÍGPëö~°[”µ»N¸ôm˜Ï„\8­d§&¡JIã’oàwÀ’Þvü)`ÙÍ•R ì.È9½F¡TT­·I5RQõ쳫Œ(¦X(µG+5Ô2ÔuýqŠ…bN+]æþé'K¡\~L ¦û©ê{>3ú´£‚@•qÅ2]Æ‚2žné*T>ñ‹UûÜÛ×ÃÕt0æñ·µ=6{Ê œ÷}A•O¼b:vØâÕ]`¿‹1¤Û÷Ȩ½+:‚©ÝZÄs¾œ .z:ºcˆN§QãoX&,øÉ/ „ è“þò Ï ‡ßñ ±öÉÛþ_º2kx ô7w¼ïoLÀ€¡¬vËý6uj÷äÁ[\òƒº §{Ý·&€ïÆÇ¢›.J`yÿ÷tw»u°'Nx¦YžS9SØ@aŒü{àYƒæo¸ÉÞâ gtËÇlõÇà’>òÕýÞBùo ylr0¡iÙ#T/ †£m­®¦¬>½kÎÃè½²C¸‹×Âêt=à#DfHß3\Îðì¾çJ`çðú”ø+u §ð¨cštÝÊ]0¢.ªb¼;í~|ÿ£rþ_[ÿïøÈ£%ô¾4`€MojRV “XÙ"6}ßì]ß;=³y¨·öãài> ‡s)µ¬ f8Ó€a Œa>Ë>žë¸b ŒÛrV¹³’S§`X¨Ìüsn/ìÔ†”¹™î§mµöu³kºÒ=&ʼn07(MÔ]¯µ9–ŽXâ¶)6îæöŶ{>Ìe!˜ó€ ÏmP[SNLMºIÜW8·A^‹“üDûÍŠ³ oˆïü~ÇBßñœMEØùäöªÒ›_võÊ)«:ýµO88kUQßfà'ðïgà%¨Öüæàq&ѯkT¾ÿxnðïç†ù¥á¬Lå“/ˆÞÀÕYYQàò5<·“{š8'ÔO¦iùíçÂ¥§Ú¡Ït?ÔÒ¤2ªjÏŽ33ß|áÀÇi{üþèýw–Ã@F0o•~Àëü#·û’qa7»¦O<9¢‰Š'¿Á³ðù ž6að™0Å>ã€q •èYð©pÖ+q:¶np” ^Ѱ½óKÏá¤x©Þ'‘ÓÎ:]+è|©ÔW þ‡¨Íþ޼&WÜÙ™RõÐY²&å<»—ajS« öZ·ßŠÝ¤¬g[PËž;½ŸòÖjÔ%È˜ÊæžÝqe/"Ô†uàZEN묬÷½3®§˜[FE:Ÿ]fpåð8ìšÀFvZ@ãÍaçç,W œÀ$°áÞ@ Ï€Ã[8ñ&ä—Aj÷ïí»cÍUÎýõ^ƒ >ƒ©ž¥üÕù9n†c³¥ SSjÓ¼uE§õa¯lŒº,?™¤A•Ÿø{XYŒ‹QPe½Aãð{IÜÚܾú_ áᨵÈ=K$W«6ÆÀîõ¥Yùî üŽguºë§ë™m± 7üDÈ1×~0 PØà€,ÀÄž¾NžØòÒ¾@œ\v¯;Ø=ûüøºkÂ_½Ìn{^{Õ¦C–ÚëžæºýúòÿfóN endstream endobj 5673 0 obj 8041 endobj 5677 0 obj [323 /XYZ 38.2500000 101 0] endobj 5678 0 obj [323 /XYZ 38.2500000 729.500000 0] endobj 5679 0 obj [323 /XYZ 38.2500000 729.500000 0] endobj 5680 0 obj [323 /XYZ 38.2500000 595.250000 0] endobj 5681 0 obj [323 /XYZ 38.2500000 413.750000 0] endobj 5682 0 obj [323 /XYZ 38.2500000 595.250000 0] endobj 5683 0 obj [323 /XYZ 38.2500000 101 0] endobj 5684 0 obj [323 /XYZ 38.2500000 413.750000 0] endobj 5685 0 obj << /Type /Annot /Subtype /Link /Rect [513 631.250000 541.500000 638 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 5676 0 obj << /Type /Page /Parent 2 0 R /Contents 5686 0 R /Resources 5688 0 R /Annots 5689 0 R /MediaBox [0 0 595 842] >> endobj 5688 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5689 0 obj [ 5685 0 R ] endobj 5686 0 obj << /Length 5687 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯès·Å‡^@`gr°Ørrì8aÙ俟~P=3”>¶øu‘”Ôí…½ëÑŠ"‹Åªb=¾úþ_þ¾ûçwß¿ÿòïÝî÷÷_žª}[WçvÇ_ß½þîöîÏ»¶«w?üúôm÷íéóÓçÿ=_øòþχ?ýo§w:üûóî¯;üðG÷—Žá×§Vµ‡ß9ýÞ·êð§êòûñçÿzúËïv¿G>ç&óöÿ¿3Ê4ƧqåÓßž†eªÓ¯ÿþðÛÓ÷gÄ}¥Ñ­nš²ÆîToõî?ÿxúéðaøjß[¥ÚƶÕ-jõñKFÑýÖÍè;§_2£«ƒ÷uÂÁ3—&Êá*8¸äÎÖj ½² ô2|‚ÁmÒ ~š¹8U†½Å£ï;{øë­®íq£›\w>ü¹5îŸÛÖÕÙÎíð¯<Ù^†—¼«L›nÃO3§Ê°áxtÁÓÜU]&ÐAè% ÿ0zнU]ºÃ|ž¹4QÜÖâÁ%wÖÔêLžºM@ŸËè)ˆo«t§öxþíë¯OæüîèªéÔîë»ßW‡+Ìv_~ê÷mS7º>ÍïüD÷§'ݾ뫷O* Ÿ¼?=±{kξ±—'êôDUû¦Uñ÷êÉù;ªÞWýé­—'ïàhÏçwôðhÎ ÌyÖ/?hà2ZôDwpøúôÄìkÛto–¡àwTgðñô¤Þ›ÃV½}ßÆÏ¡A€ÄOâÍáºô3ÄŠá1ý»¿ƒ÷Ö1¼–šj}ØAÃ'Fù;ˆwÏžØõ€q3%Ìø˜u •£ÍßžÀd G v¼€æ¿ô]"UÕYOW)KL³&êHj1l?s¤Fd'Ø–áŠKñ ðö0£E)F‰Í·2ë,¬ç°xaÎ?Vïæk bÔ2|>WâùB;£P _ž±ƒú=|åÙg¼.(¬‘Ÿ}õ§é9&¤ ªŒGB}S~OB±¤ ìåk´½„S 3ûQj#”=f.MîE[Ÿ·¢6où¡ßŸ0¡“'ž82õNßyŸ3Ðp4<Àß+u'0jn®Ÿ…Eïícü.h<‚ñz <%æ<§x·!­ñnc¾vò $nõ[•$$…ç ~Gvßɤ?ð ,–OXàÑ”¿t;ÕO1‹nNÌbÍÀ,êÓ`AÔ#–˜zÒ: JûQmçX”z§‡ï¸¹™ýÙì‰ÑãUÉwŸ…˜j+ëeC4zÇùa§fÐÀ'ø }GÃ'h‚ná žÑhxÖ@Zc긃µüÌ˜ÕøÜm'4Òß9kNRfJ* DYYÀ-Àø ‰0®„@ð‡hºa—Å|d`û3ù ô¯ƒ/} _âÌ7È}ø • 3™lßY_8+ï~¸Oîv8ƒû.µQîã¸ÏYé:yYamÂh ¼&ÇO–ß ï)\À#Z¯SÃ-˜Í4ÌZÔËrG!ùØ×W‡O 5®}í+ëXYSh„¹“¸Lø©0ª¨ÉÉ»äbv&ˆ!Ó”,0_P˜ãQw:ﯴõtUó$ŠÁ4èGN‰òÝVñw"Škë·RôL;5¦Ý‰' ÔÇN»»c{Þ¶zý“_ž¾”j¶Ûôöd+ie‚‰Œ·*“¸§¤”¨Ç;[:Pñî¾N“¦ÏKmuUVäÊ^H}µÈ…ÔPÜ]Q•j¬˜ëÚÃH8Lëû‰½>ÀAo û,Î-  # p ^ÄëÊzúLX½§Q¿Ͱd¹Ãë²Òj)éqß)¿•EÙ&´Ý1EU †-Ÿg8]ìÐ×”R d\õÎ+õJ/⦀ì§5áòR¦É!SÊ»æ2Ö¤ð¶õ¶§­,ྶdE'š—œ-Œ(&ÈŒ0Ä·²%›’Ù u[;œá,ZÃÖÞWW JWƒp »GÝ@tTTbgáÕøË»#æIÞåO×­G]a¥.Û%&—ã|û=f4|Qc †nPS/]²*_ÜG—㇛+[ø1Âó¤t&©«&y¥}Ëy¼Æß7S‡&þ½Ò๽ôX@ƒg<ØØ×á&N5xÆMz™fͰð£óåôÞOç8uÇÜÕþsxçüN³7JOŠÛ(Þ1çï¨z®söÔX¸RHƒ\ßQÉu‚»vwº&ƒã¥5Šel]<ÚuˆH“@·hYËL¶Z@"®ˆÿ˜átŒ‚oŒO’ÉàÛZKðU_“dp"PI¬C4«ÜÏ0„J ùR¹Ô§]}“Ýj¡ˆäÞZNi‹¿ˆ¾ÄÃSYúx³‰\o*…~GôcQV ¹ ËÖómgÆ€&` /eݵ˷Sâ­/e#q p$rL<²ãÖa6GxßñX_]NÑ@ŠÊæc€Úp«ÃÇM´ˆä üŸ‹Ës}ÃË™Œm{åÕŒÄáa®À@…Å)ŸKŽ10Àûh.þBƒ,ùItam€Ïnu÷¾fÚc‰> ´mÃP¡E×™­†÷ÇàÆ~ÅùúñDü Ó$ʆ¯)‹W‘íË' ®·3ÄÚ5@kÒ%>¬Ûåðe&}hñ[cîýÖô¡…ë Ø84–˜¢ŸÍ‡n{s˜wŸ1žu®˜TN Ö_úeãhˆXŒ œÞUÍ 0D«b–E]Ø\ÖíÆ¯¨ÝžŸp(ÛÕL¦wù$Ž\).)ý2E…8{i”—/'åÀz /Ö<„GW¶uÙ#¿d!ù%Ý$ã~Áv6¿[yÖÝTK[wÜ °g{”_¾“`¿Qrtg/j5¯ëBÂEíeêf†Ÿ/Ûν¨'ÅS"r¥©ûCñœø\À¥p Ó²gò‹BÌP÷»­ÝÕÒ³HV“'ân}˜«v`ÂegX?3j2ìý€°"úD‰B¨‹ô¿*ßr1½g¢d.ì¤*þè'Ä5Ý!Êê©kQ;·ñjä´});_ ÏGŒ `àD|)Ÿ2žh\Ùf v¸#4>‚Y r—ÑËŒDc ë0ÑKw®ŠgæŽàÐÈÒó(°õ>æQF8/V7œZ>º  8s•0æ#¢fØÓ ‹äÃp)8÷éµ]Ýzþ ÛÏ‹. ¾C„{Aûß{™ñQ,SŸùKp¼ƒ²3îjŠ=‹óo¿8œMI+ì~i}‹0ìl§/=’ËÃÎ:‘ö€•ƒíÑ;Ö'ðŽ(¸¬Ëëe€HÛ½ L-ß´<i¶¤Ù,pÖÅäîXã´Ìi”¢7Äç’FY{_¿É¦š¤¯¦ÈFâ;²]òrCÆô–½ ÉNùŽÒZFÅ¢묇`ì9&›>Fpc!®, T:2xæv]ÛÑm­xcoÙl"Ù¹-@nV0©“ º½ó‰ÂðCD0@VpŠô¤Áx¬ Esã„SLjóT¾=³}“ÁÁgÔUÖ©¸Îáî”J¶ö¶UqµÀ[KÀŒÄK°“™K&ãé]§<ÆÞ¹Ñ­_"òþl¢ˆtXtÁwÉ"gÓÙ·ìW:‰Ë q/. f€ÏpÉtñìÀÜdËG øw ç²5`¡¬O.0k0ý‰Ó˜öuÄí ÀÀý‡©OcôzqCùnFn]¬/0!‰­Œ *G 13Õ·T+´GxÎÊöb.+²E×yÙi 1Û4¾’X¾Ý2NlŒG& BuDË»!<61—9‘2læð‰›å2{¯Ygí·ßÑ$OKôòÁê^|?N´ùu2ý¯Ëj<Ýøb`› ¼YšäÞ£:Õ„ùÌTŒŽ-Ò«@l§QáŒä1 «¬¿­Ìe’QÄDuÓìyTs#bz” ºo4†T¾þM&4ɤ‰/°MpÞL')ŸÖÝä#1y ØÉÔ­l ã+¡†íºÆÓ°L­QLûhÅ<¨b`ÆTd,ÃL>Ä„ ÒfrSµgËÃöËåû/-K¹¬”¶´ù[² 2î‡GFÇ͵¾tþ ZÁ8z %ÓhÍùyv¸i¯ï0j.:³Ãx=æ9#}»æŽÃ툼£}ñ9!Yá3hP(zºq» óÂ Ý ærÑæ‰&¢t“kuÿ›ª^5ÿS²O¶‰Ñ´ÏG-dWš£mÙ îÓCFj@ˆÅ†ģñ*ü¦hŠÛqcîÁ÷.À=VX²c=ÁÈïÀÜ2Í pñ,y°|Áï`ù%©lû¤kÙ®q²‚ÈÈÆÍ˜nÈ»ÎsÒ»¡ÎHÖ®^ò©5ÅóçsÅþ¯æOíB.Ü×Ö W\<) ç©0Y°¢X7²è_ŽÑšÇ#pÕ7`² Füǰ7…Òz åyVˆ™¨Kù®_Åc+§pJÓ¦í.Éå2¿G™»lÄ=ŒÅu.¤7‹;{ñ¥0‹‹^í­áîIÊþ MçSWÊ‚ÉÎÎÅ‹@­L›3™­; YM˜uªSè})tu Vâd­±N!i•€ñ‰*›ž›+AŒI…ÆW"¦J. XX¬¨>Wÿ#ó-UæÛ£4hI5 pzÝ[Oõ”`ª÷Tì’»µSõ'kêc5A@ý¢ÐúT0G„„êk@hIè?TÇ'Bq×%:{ A‡¸{ÇäÊ/X†-·MèekûÚ5?'"N8ÍF{ÓÌf¢aairŠ©¢‘l`,…;†Ì&” c¨t$Ñ9hg}ê.д©V…)•loüݼc?Œ¨{1Æ÷Eð%~™4åÑ:¶ŠJ3J3ݺãck€v©û*.E,$uM6ž D±ægõ޼!¥"a<ð+ïḋ:œ˜V¾2ñ4âº.tƇA-&ú Çvæ@ïÊÆ¦L°5uc]†Owfw݉NyJ/¦òfW,Fã3€"aLÁÅ"iÝXªö9æáÆ’cxmŸº„.Ü¡a•‹*B¸…Á$&!¾3’DÌM)/Œ)ÌUI'ÛRqT&W¤uUûz¾š3S‰'k×1©|ËÜîŸÔ\y¨ ¼Š®SŠ”êp!»ŒbB& š ‹/ùx7"\­ÀãžþÚ×ëËN­¹xÜÜŠ)>ÂïP‰ Í׫TK*œµS<±nÑÐåïoóy(æNÁèâR¸;²žê1-ˆ˜% ¦AÖÚzŠ®j eƈ&­¢ÁêÆ²§³µQ…š™®\Ì( s”+Hƒ˜RÑË’XäÉ”ˆ2‚ÊÌQÉ}ÑÅ<)SYúÞS‰+:r¢dõ­yKó8”,ˆk…Q˜|¦Í¡ a¨ÓÑÃÕpÔð;x=xÖ¢»€‘Â,އB¨ì2 Sƒuà¾0ü\‘l8KðÆ£©øŒõ‡ÏäkEHËZgÔ½¾:Ÿu>Y2& ð¬±¬ÁÍS°Ü`ÀЉVÌJ9+D‹ á]€™ú¡Ûð p;š$Ÿ ¥,Üñ;ÃÍÊø™ìøÉÁg¨0©w&ƒcå+V™#K?Ÿ Ð G6¥’Ðeó’E¯Tåzäáù9²aù–Ýߦw#ÀÐ:kêKeŽ$±s28$›DZLÂ)Ûµf•52 ‹"E(‚›ñ«–éMbŒwT¶ì28 ¼à0X¶YãDŽô¾DÓz¼Gn2è$#7‡XmS·SýäA;•Ð÷ªê†Oºk@µ?‡ÈFü2õ¤ubRûq5·€¨w\ŠÓÔ;=zÇÔƒÅvv¹¼šAFs——©YW»Â+z×ð ž›³&›½QzÒŒ ïüŽSVªXΗvßqÉ(S3øßià r…t•½ÞOz‰`p¹R¹7Vá¿’íï'½ ÖÉì¼N uQÁqÁ$a:y—¹öÅZÌY ê9)€4¦VˆeFPM¸m½mÎAÀÂë¾´ØÙŒèÒè4,Ÿã%iÏU žÍK¹|èÂ"eA½®.SgÊ‚’e ~í¾\ÿçka†ôî&uòAÑUêx§Øé ¼œB†Ž»•µ[{VMz¯ÏÓWOžÝ½pôÄ|pï4þíO«+jsâ;æZîÒÔÜ>¹•¢kö^X_Šâ J3^ “8j‚ÏâÄ2 ¾ãN©ŠZzû¶,Ãÿ|˜ñ°Ñvx;1 (,Ç è±§Ktµs6í#âäñ ˜îpxýþvº·•Ù»3;oœÏdj:¯j]LŸwŸŸþªø]k endstream endobj 5687 0 obj 6149 endobj 5691 0 obj [324 /XYZ 38.2500000 206 0] endobj 5692 0 obj [324 /XYZ 38.2500000 206 0] endobj 5690 0 obj << /Type /Page /Parent 2 0 R /Contents 5693 0 R /Resources 5695 0 R /Annots 5696 0 R /MediaBox [0 0 595 842] >> endobj 5695 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1500 1500 0 R /F8 8 0 R >> /XObject << >> >> endobj 5696 0 obj [ ] endobj 5693 0 obj << /Length 5694 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯès÷н€ À>ä`árrì8Ùø¿Ÿži©gVê¯ZüºHQzaïxµ¢Èb±ªXõUÕ›?~ÿ÷Ã?;¼yÿý? ¿¿ÿþ¡:¶uuþçðøë»—`»ãðó¡íêÿ<|=|}øüðùô߯ç¾ÿçÓOÿ;ØÃŸNÿþ|øëßNøãð—ÿÂ/­iO¿ÿûé÷¾5§ŸªËïþ¯‡¿üîðëãˆãç†É|ûÿß9ã›Ê?NãÆ§¿>ŒË4O¿~ûáׇ7g„}¥±½­ºƒñÎLïíá¿ÿxøéôqøêØyg\kkú¹o|[Õ]gO?·nø‡ýxk¿nšö`l_̉vÓ?ýR>Âà¶sñš¹:UŒkŒ­¯#Pí2zŒ-ñ¶7øÓ̵‰2n7<ön׿r¼}¢=aðÆUñš¹:UÆýÆ£ÇÞðÖ5Ñê¹2¹ŸlÏÃG¼ë"rÓÓÌÕ©2n8ýØû“˜Üè{,…Ç5¸ªµiÛ¨SèÅèúäw•9Ù6Ñš¹6QÎ[+ ÷(ŸHÖº´²#}4Uí*×DüiæêT÷®y”}ÝF3Ã^Œƒüumâ þ4ó8f˜0¸æÎ6v¸•Ôúª£Ç ~ÓF3°‡™keÜY8¸æÎv—ûfcúåðïûh†Û0óHÆ´4ºâ暪éÙJŸD/†0¸‰g83W§Ê°¹óÑ?‡Œ‚§rþàÀû*¼øîËÛOÆ›1›Ã—ŸN“{úæù·/'¢Ô‡ï}OÖ¾üxø}UÙw8|ùù¡?6¶§x~Ruè‰iàþŽ…ïTá“ð‰ƒO>…ÏÍõOO>~9mlô=ñæöÞÃ'=\ÜÇʾ–}¬ðÜðJñÉ€ë±p0­\©7ð8kç†÷Ô¿EOjÌ!«ðhIOSsù*\Ã@_…ùô`2¾zšŒ3õ·$0Õ±iOz¯žmôîaš…îùÎ|Þ»¾zZÔó®œWdÜÑÙÎØzÉK][>LÂàcÛõ™b™‚a'2ä„0‡$í‘‹ë¾êûvª·ðM{N°wû{°?á–_)¢7Uã'¡”“z bk©är|ˆMæÑaÐ_PÈL~ÑLÛùE˜ ÌÅÒöªy?‚ ‘±7„û‚VŠï&‚îc(:ӊتÀ' ßb±˜‡“Å3H‚b$ÖØ‚.W½ß Îfo÷îú£Ì‹åN™T× Ì€’”4%¨núñ«§ !L&ÐB›ðz¨à~‚©C„rærLQ!à÷Ôbî…ë¡vލ&? )[DÒKÎ"¬ƒŠÞ%”]w{·Jz R'Ù“¦/—’S 9ì ,œɹSÚ­ Éiš±`ZäDƒä0‘Jìú ȵ~;ðÜÚ‘ÑABèè<“kÞgf7°OQ)•,¦M”¯ YÁ™%Ú½`Ö1•Jk¦ZLÌ$ø æ‰8"!&…à8^¤û1>å’xDÅ©õOèqwM–1ÆúXõîÛõ¼…£MlcÇGw<æíòMfL‡Ù!IÄ)9KÅ!˜Ž\ÍV(™IP)™e·DxDmÙwn±¶ ‰õêš-ËÙ6C#ÅœXam“©9 ìœA›Ì­ŒBñ¿’Ô†°ÎÜæE(ùÂ8cà;â?Õ!¸i7ÅDaºv²yLäšhfjéâU/GIâÝdpŒda.Ò”ü <«Â: çpù…F@êê lœ–*¦âµ úO8¶Q ›QÃu‡*±ûi¹ÊÈ4/&Ó¹n"þS9upMÿ䪪ϕJUb¢ÞL.&Þ´ÏT%¥Òª©æ:ÉzŒ¥z|( ¤ÒKäˆ^¿˜ƒfZgÜ<7£p?1Otˤ’_%–s—vŒˉï5jÍXÎMHLÜä½¼4eÓ"dilõÚ[µ—Œ©’Å–K[{ÉÄÈ9‹),ÌZ5‹­dI§ï“Å&dØ~ßr)Ýñ ¤Õ¤ªœ9êÌݤuÓ]2ÍðÉ rñ™ÑÍ‚ÖÍüÉ83—9›gñÒ;UÆTÖ-J ®É¦¤¨ÅZž9y‡¡!‘0 º S†›jâ³Ï©g4cÕ3|ª½kÆY—˜¯ý-{%áëÄZbÓyµiö¤ñã|JRE€<¥Šy—(Ò.‡*½¹”+U‚ò=g948Ê”ôÔ¨IÅ_˜Ê·‘sÃãFÝt+»F.þ ÕËdr'BÛRÙË3ÅGdU¨`ä"Ç[l$y\Õ…—¬EI€øÒU^§E1­B¹É±qz©r+J/¨Ø½ r>Új*ÌTŠ.µA9ñÐØJö î|Å$Ÿ~h´ñân™ºcƒ|Ä©)1:–…•<Ð…®/kW¯ä³·„§ÄýöV, °ZÂeœ­F(3í–‹)'Ñu·yžpÛ „bN*¾Ië^&tó‹WÔæÆw“ý-–r±”_‘¥œÞÉ+˜ΑÈÇ™R¸Ût ¬c‰´9Ý΂{“•šÈڲ1~ª-uc;qE2U2R¥ˆö­'ƒï©º±¦ë'óÀT:V) Á¤-t@eRÒ§sœé¼ŒSG8|*±¤™»lU½8o»ƒS”uwÞ%æ‚·œU)ák{ÄŒ2[?U!³ÃÆsëˆRÅ(Ÿ¶Ý—ë_Õ$° S=m&R5>ÑÀªäô ¨eÙd^ªÀ ª zƗعݘm ƒ˜ñá¶›(ÉÃlS[ÚE`W¯šF)tbnÂî3¨ÍM†`·ŒÕðOSKÀ¥Ó"U™WÞÄLà(ëímÞ/×ÕëA‚ÚüÏÛºþÅ+0ÏSÇY¥‘À+¼£žlªÞ­j¯ á¡ë|NUÛ0ÃÓɸʘ"§qÂrdðP‚i÷÷è]ÛMmžT¥Þl ãÃ:‹aŒsÐ5v5ÿP®ÍZî±ÊP3ìûbÀÔJgU]6[î¨czQ¥NÄ z_1•t%®n]næD«ši[ëdª~ªl×Ï¡”Vœªª;×£.Ê-?Ã}k‚AÏ Œ¡›®Ã[n±Ý”î‘5î1¡vå^Ñõ°mÛ#vËÇLU´PFÏÖýäx9¢¢VÅÔéd*¨G—6Î6zPÑ)Õ,•hEd-©[Hð0]}TÓ†’÷‹šÓq7ØðÖÁ¬‡©}¦¢h‰ÉR®×÷ ær*#ê™ÖÙ‰ž)~Frç—çžä ÎÕuíêË_ÅÐIví`®é8a•8Œx‚IK-æ 4gxOüØÇãàKŒ’%÷Qû%lÌädám^Ë…cí[ÝKéå»ÄÔVíåKY*hà-u³NѵGris3UÓLõÛOJçC§Od¼C²þ¿î$'” ë,}Ú¸û ~Ât½ú½ád¸#Ç-¯ºROÝõ½$zn“s"ÓÑ ¯‡èÇÇì>YB'8ÜÍŸ9¢ç‘À‰p¸G0Ü‹÷‡à¡w(ÑRà*Hk÷G˜5ŽhZB*'êµIé¼§Lkâ4Ö6¡æ¿­dôêO„Ýz5:çŽ~Óñ½f¦› bb6Eã¬nJ‘;ÄF\Ðétçv•˳©âûTøa­öRg9Ö‘X;u"¦þ1ÍTÜbW1¢Ô lfBʹd@„©t¦¬%>Sx‡³nv#‹õó\¿Nl4>*ƒn[ƒ¸˜êÕ‘9çRzÑ­‹`[lØ«vTÞæMÖõ ÷äîrØï)‚1ù5¾CÕ›sž5‹ÖƒŸ@/Þ6ùòKE…ó̸ p´ ÓSûÓàziÇÄVv&í*Âß©ìWõ[랆:B,‚äTÞ#ãñhß„S‚׃g°É(¹ÇÂF¢%ÉñwbH—4VVÓŒT¬ÍBp,Ö9Â>b®X})¹Ah~|…õ'Š+ÅÑt¢X¦1rZÁÌ-Pˆç'Š™3(A>qv<Oàa, k=LŒhÃgZšóC7Œ©cä(ÁñÆä½Ãs* ’tïË _c ‹¹£ŸTï‚ÕÈ`h0à'·nßIìWùÛôUÕøD}å”}UˆÜ¶û ®_¼jŽç`Š h¸9Ä5¿ädêdk”LTîÐH@ÞB–ñ**G 6Umê‰ÎÛih5f+ˆÊNi¸X4S"—ßN…¨,0y%~4TäÕ*›Œ Ñ­†‡ß¡ª¥ª/>Ýʹ½Ð!˜1À¢'GôÝLû©…œVk»ÆÔSùðÔ*£¸u6ÈÌ"Ž›ƒÅÐR0JQ£ÅéT•UÌæºŠ/²a¯[‘+À§³¼š\ÈYáóãÞ,gš7í·„бgƒ‰™hlÚ)¥âwÔ±fòM])’äîjj»%cyDa•­±¿í¦ì¿~#¸½¥¡®¢Ü‘ºÉ…ŒÁÓjgv'/ÑíÁ³ŸRŒnj;ìÕZÌàþ¯ëkIô€–J{v溞¬0&“­¿üÚ²ñ6]D÷Æþ j¡ã#±üö¿vé’È[Óù×Lï@:µ2.w”am„Rª}‘HZ½Tûú…Ëu8…‰á­Ä][“" ƒ"!ŠéÆ8v×崎ۆ‹ ^è& 8f ªJ82Lõæþ¤+ÍkU‹Kó™ŒÛƒy§d±¿Š¾¿L½ô (=Ĺ•UéAð,ÊÂÎ\éAPzÈ+-=’ö ¨«ìzh¬ûѲ‘}ç& Ç"ÛÌ(ê€"ÛcƒK7àc‡>(x4ÂLÂÊ '‘  1Ã`#‹yl"ål,¦óXÙ¥O„Y3EŸp¡"Ú³”6yˆÄ[æ »ÑA Ë8Ô—"¸Ùó0Õûj.yf Ǻ« Õ‚MulZóg^ð¨1¡ì¥$ò.p@(?rgèm»ØBòsAµÅ•ÍÖ÷“S…ïÔ¸†ö8àÑ•-\÷ {Åð;X4âõÀÊ@xߥªØBÓõn²¿Tí,çf’‰A}0.LfDÆ­ÓS¯õSÅ6#ªn# 'X*·?W¸R8Ó™¢ÁÙg˜( x}L4ž5svBÌ®k4kY±ʨä„g”NÕàÛfÆÄÝÕ^Ø*¶5ƒá›vŵ­ûbRlë…ëÙ˜mmŒ±Ó f®ÔL5,"kÁdÉ „N¥)‘i…TzpÀ]»º™Ä” ®™]¼ƒ}[ñ©Måî`]m¬ õžß1ts·ð dÊ¥0rcù×¿Ö Ù„˜È­½Ü}@©C,±ÊE<xXµ Ð’†Ãh€7™‘/.ë'. [$fҵ駺pu;5v˜ ‹I<Ú­d“ËVÄŽë^ ‘é*Tá;g±r%.Oe Ã¥g¿fŠ*ã   ‰¾£îÿ|Ä,~]“-åË$ðÈú™c®t*•-™‚  ŠN*gÜ["¡ˆi½êˆF2ÅYœÜY¬„ª,)&%Åä…0 [i¢“(-;ã;,[cÆÃÌžaúdh”%ÎÐTÍ· å³U©X£êGdPÙ•Óaå Fœr¤žE …pKDÝv€L3ð·Ñe¦™ M¡Ž×™¯]À×*ô0$…áV­5"U…*î?ï…ÀLúgôzµµõ Ü4ØÆ×œCXc¬‹äšU¹`8P×ÉA\¥)èîw‡©n$ݺ•U7ŽTQÓ©Jrþ×…y¯ÆØ*èZgÚRékË™w‡íl;UMËm}ª^áÍg€Ýd¿<+Zv¤›(¡²@¢–;Õ—2f’™‘@¥›‘ê½;²?†IRQË0m†U@n ŒÎÜ>kª‘¯íåCÐkå&4TFÝ©¿T¯“å7D½¬ÝÁôWs·Ï)8m{¡öÙ;pº[Ÿ=â³y_{Ò °S7ú°€ wlßéáwº‘GÎï¼»ˆÄIKÕálšfÜ¢çXôÎÀ#×fÐÀ'­gàìæèŒ½Ê‹WFÃëƵ•Bº +=Ÿ“öèfü‹gPÃ':æ7¸?¦'8ï¤Ûm¢è _®Ím}NÄï@X†«‰íǸڒÀ³0ØLxÅ£oÚ©|„’ƶã@Kpõ 9_H…¦U·2e¯=»àÆ`^ZðäöX~ƒ£PÕ*nH¦ïÑμÞ*Ðb*‡U÷ [†„‰ÝlÑŒS¹´n¢]}@8—tSË-ÆTNÀ¡FŠ19×xIÁW.Ê£ZœbtƼQÍ Sñƒ ¾DF°1™ðºuût;‰BË.G˜^þNY¥Ñ„ʳž³+:9{ßMïk*áS,­Ö ¸3ÎÛð­ºá¨[ $ÕO¥‡ª!§›»¯r© ¤¾êŒBÁÑWÒ"‘*„K¼zvtÖ$»Ø hô>—SQ¾)~ç½çlª•,udÐHxËâÖà ÙɺKv͘Ë:íq¦eu¢ ±òTMªt(£1‚ÝLÓÉâF_Â\{k§pgY^¡–¹Y Žo¦[«‘©ÙƒÑªË¯^”yЗsÄ ŸÚû‰ZK&·da ×J" ¥/õ} (ƒöÑ «m<–ŠþFB…å©ãzœ§Îô##:Bá ¾WšÐíI#‹ÿuw¸RÃ%-8®¾çd@^NÅ}8ëWgÁÕf\¢³ùzxYhpŽ)ª×æô6ÿ×¾ðáÿ;ù?çvçwœ@-%êWY\Í[c˜¢‰j1Õ£t­$<Ïð ×#zôZ|êá Æ½€™Öåxn¸â æQAVáziXöb‰„»§´!Û‹‹ü–Ûº¼÷“ùTXZáÆøœ}Ã…ÎËDíA’bîa*ÀáúxX.ãS‡µ0ÖtLglÆrÝ –˸Æ&æ*ÆFÑݦŠäÎöTÐZ·ªHFšê9„»Ä)·gØd5 õÁ*…/2„§2íØÞЯûhU»7ù [-,ç6¦k¤ ñ^/”UW)2 a'ÈiÕN%B :-°Dsµ¢¹ . Ô‰déØVF „ë+Ƹ%K2-¡ãc¦ûX;½jíKCÕPf6|Só»aQU-Råeîìz¶~µejT ÏÌ5£\‡kŒsÍôD„Êp  »Jq¨Ì$JV2•ïîà «Qdß\:D¥1•ù–2a¸™‚¨,ˆJq¥›ETc«;N®ºØ,Ïì ÆoH¯‚“86sܤ1®/\^¸|ÑÜ :² #o|§ # :R¤NöhÏe…_<9ïC3â> ï4ÓZÓCæk^•è;îVtïÚÜ> +E¡4œG꟧TÁÉŽE¡g nïØŸˆoïW–aðhðÕMÐÒ_‚fîñçêùòi‡·³€ÁžÈƒp»ÂžCj‹_²i'ÏÁt‡ÃÛ÷÷Ó½­Üq8³Ë6`^צc_J¯[’ëðùáÿ&2Q‹ endstream endobj 5694 0 obj 6436 endobj 5698 0 obj [325 /XYZ 38.2500000 338.750000 0] endobj 5699 0 obj [325 /XYZ 31.5000000 261.500000 0] endobj 5700 0 obj [325 /XYZ 38.2500000 338.750000 0] endobj 5701 0 obj [325 /XYZ 38.2500000 220.250000 0] endobj 5702 0 obj [325 /XYZ 32.2500000 260.750000 0] endobj 5703 0 obj [325 /XYZ 38.2500000 220.250000 0] endobj 5704 0 obj << /Type /Annot /Subtype /Link /Rect [93.7500000 346.250000 148.500000 353 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 5697 0 obj << /Type /Page /Parent 2 0 R /Contents 5705 0 R /Resources 5707 0 R /Annots 5708 0 R /MediaBox [0 0 595 842] >> endobj 5707 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F1500 1500 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5708 0 obj [ 5704 0 R ] endobj 5705 0 obj << /Length 5706 0 R /Filter /FlateDecode >> stream xœí]KäFr¾÷¯¨³•˜™| 3ên>$ÀÃcÖka±Zx¼ÿ}׃¬.&ù%™_E>XM »3j6™¯Èx~ñÓ?ÿúŸ‡ÿþÇá§ŸýŸÃ·þÏŸ})ŽMU\ÿ9œÿýñþº=ö?4muøöÇË÷Ã÷—_^~9ýÿ÷—ë ¿þü¯§¿ýßAþåô¿¿þý?N?üsÿKç_øã¥QÍéÏ¿]þìuú[qûóüóß_þí‡ÃßÏ_†ë'3þ着æ2…¡¿¿ ËT—ÿñíï/?]7Ào”Ú(UUšò ºRþ÷¿^þr`ø|qìJ¥šºlŠGjôy¤¢nJw§/éb2Ðå_¡Ïø¸j›p¿Ì\|W”©•ûë’‡«;sÝ ª °C·¯‡Ø~Svá>~™¹ô¦ G ?.y²e¡žìíë!6¿¬ÞÚËÌC,ü¸äÉVEOøM`n_±ùU[üøyæÒ›2œ,ü¸äÉ6zØûj*Óß ÏøxÛá>~™¹ø® g‹¿.x¸ZUe8†üñõÛ¯µ w¶×™bÈøãǶîÿ'‡nÏãVçÛPªö0CSmyR^}šÙ‰¾Î´Uµ­>ý½1ý?í§)n”pú’øqÝ}>ÀÇU[‡ûøeæâ»ÒSÚôë¿ø|Oåú`S~w¼øõ·—ŸÞO4xÚÌúðÛ_N“»Œyýã·Ó¦T‡Ï&R]~ûóáOE¡ßÿéðÛ__ºc­«aŠ×'ªDOÌÿ'økúgô¤h៼Á'pUÃ'ÿzð×4|Ç1ëWøÄÀ'øLáÜ ¸ÒâëgÙ…)ï~¯ÏZô7ëÓœ©cG1wYÚ·ßNŒþA}ú2àÑÕÉà3iùuðP0ëÒðIµÀÞU—ÅeÑZuî‹VúXš‹øciד+‡“Û8÷äJU­}¥ÛcÛ—å~¬µ@Ozr®ŽF·jü¤µ?¯ÑGJC̾DOt' gà§›¿¦®²X™aWÖÌ`²]xJðœ(2ˆµ‘x»¾ØK‡SÂä†OOI]·Ë«²n›Ñ;zbˆ«à˜¾>p"4DM‰9u&o2ð|‚x²˜º0‰ÂqŒšßór¡R–`ÀL o7~ǼBB†áÓ<Løú1¤€WJ=™#PáUêuW¥†®àxSÛ…™>~|ÈpG)züè†z {;ÁL£$ø%fNø†áÃ3 ¾6//¬:8HTTS ÄÔEpB¥`Õê5–S ƹ*žª8Ös:FÐÉ*¸˜X¾‰g=¹l“:*¥/¥Rî±Æ,#šX#fíà3aEÄÊpØ£ÄÎR{ÁX3“ýeéBüº~`¿‹¨8Hæ§Ð b—Õ߀ò®2%ðÊÍScÎð wêÕÿ5Ų"qadµeaßÕõbÎ8^ 4ÊL…žkÿ˜_b·/1& Çd¿l~-°ñìá–µPŒš>lsRx7.í‰hÂR_qÆèÌØ f<2Ë .’ºFÛ"é}½z‰rr©ª6ÜÇL&4Ï07™,Ï1R‹ràÛ@hÿŒh÷àMŽÃ•ÁŽqÒ3qøc d¯è‰ÂîLL˜áx(ì¢ÞŠ Cêrè„$ZtÚFpw5&¶¶L¥ |åôËë Ï[•uàŽ2aî9ö²2FÛ‰­¡;ô!b`G$Œ¹JÏáùŒe?;e4á€ÈFD#=¬xêMŠ'-ãž®ÇôB@Ý\Áwð·© 2±,à;î'‹ÖÖŠøl˜ÒœqÂøðŽâ'Bz+ ¼TCºv tñŽÂqðic ­ÁgŠÇ'ç@*ãõàYÔ íàûƒßÁãÀ¹9ø¾ð–(‚ï`ê-1öS<Ü ¹²†tíóx¸oŽqàŽ:Χ m?ôö¢iÕ0ˆ@믅Ÿ¿c÷«„ö«8TÙõ! ±Å¸FlÓÆa9ak‹ðð»4ðÓ›CqCÙ«ìWûØßæ |¶ëqNŒ+Û—ŽƒÃ¤3Ù‹¥ÈÌš¦çØC¸b lYåpÛ2Þ#Q(ÞCÈ0XÂŽŸðñÖ(~„s ®þÈ?B$뀲ްՋ}Ø: ì:fXcuärâàYC[û† aŸ8,LxlCãTP8·®ß…¬Ï~ÍáKÁ{熭xìÂûwÇ@+¾Â§ ¿†OÓu+Y¸lo9a› þHä"ˆxÒm{li-ÉÄ–¢h~U©ÑüöÒAúÓAZ Ñ=‚´GœsKAªbÊœzp0UØÈا`àÙçl¦÷žäìØmýÌm}HU= o×j[1Ö9•¬KT œLRxSdkNšbìèI®v€à]Â~#e 'EÊê”MŒFÊÎÍId_,7ÁT 󉣉æù1iÿŒãŸÊÔ%×S2Ê«ZKšeh`€ ?sÌš©""Z¤Žò6bg½G‰H¿ÂIý(vӉ͟<‹?Ÿ !ám¼89p}nEô RU$ W¶2 “gŒ¯T™ ¿á2!ð¤Ù±ˆZ“ë [Þ#ghe†¥©«ê¡¹Gª¿D``ô4V^˜É7-Zår‰¤¬ç647\c¦Z¾"žFKö0±q)O¢Þ-S¿7AEjUëc!,d똧¯Øû®û3:’«©>NRÂ#ÎäZ8ä Æw8<ðvI”—sdx%sá=›dwš-«Åf]jKlF®(—Ò Âˆç(z’œ‘xK œ"•š„9ÜD1FÿD#Â.WF4EÊ-s¤Ç ˆ‚žŸ¥“ÈM[_““ÚPÞb iu*ݬ6;‹Ã>èõ^ÙNB‹þ˜U„…ï#ΘPŽÄ2g%‹úˬK¬RØ’{îVx_­b‰ÃW~‰R±l Y­Ï£¤{pYt.œ=¾'O¯ÒP±Y`ݦJ†F*®¼{·;tô‹Â'É4|$h6®/Z¹ú#=~KÝK„»õÂ;]Öý "ìY¶m¢`_汚/ÛUYØÌ%`é]{Ïëé0]ÐwÜã*¡™æ’R¬µÆ’k¡%¶…±N‚Is&ŒÎ8¼ðÜÖ»r„»òˆ ô¹u 3FLËòÍH\K¶9¬c¥L± •'¸ ¯¬ÓŒ¡o¥ÌÑw‘(®8½$²+ö(5*ÚæHÆ›“i⚣~„:MÀ¶qe˜1®‚×sûHø˜hà#ÑK¹5ƒü6*D €{‹=˜/U÷›d0t'’‡!á9§à/jêjµ½D³ánMÑ¡]ÈÙYïÐÓ0'’¨ö i¾…”NU½t¼ÂuLÖË>î&ƒäÉØ+ÇTÈ—5k?±c"]íÙèÖ¦À¨¢WÒvHÓ¦D€üÆkOê´Þ&Ú‰QœK¨83IO2™çŒGO´Îåí‘°¬o¿“uõq¦-9¦®T®Ê…«ð€¨Šì¸G² 7CfH f¯à¦~¨Ò;ïgõWuÅu—*§ÆÙß[Û,Gu÷üŸHìՙđëA[›å8<܆TWð &FLrð .òí(ÿÍ0³pÖl‰€¯w‰w®Çñ.$ ßqüÆLégøQ Þ%Ý ÉÇ{@”´–¥ªXãì7Ø5ëý»îœ†ÅÈ5ž.âŽÃá&-ÄŽVð 3ŽãÉ{•Ï#%vÚ‘¦œ¥Qú'Q¥QÕ óó½,@v;5DùdsäŸ$aÃÇ|Ê]圂Ϡ¯$eÆ9ѲYŽ  b„T•mJà}„ñ¢Yx½ã­c ba;AQ v‚Ïe@ß‘ ‰ð…íð´¶åf¬Š "%Ÿ¬Û¦,.Ò5y/ OÁE1³¾=Òœ›!^Y¬ãz¨lR.“J¥øŠ¶  ªà1vBà¬Ù ZFj×Õ¶@•52ε~®üâÇÊfP]Ÿ<jrV‰2ìM+š„·©¦¸Œ Ã £ yF-/n欞©N%u¥¶Dq>)Bá“ý{_ô=¥/ÔÍØJ•Kˤn;”6¦[\,l…5Ñ®¾"ebCwóx¥Uø®3îÙTî4ʟ¨ÍLƒË°®£fŠH1%–´˜€±Ä¦°¯È£´Æø—Æ‘­ G9¸›„jï&ÑošRÆ=X Ñ4N¶¼UaJ´å)Õ!„qŧr¸Ëx™]’õbuQ4€ÀÔ£ ÇðÖ Rí^­JÅ0+%|¡÷$|E‹ðPˆƼe4\j/É¢Û,ù݃"¸«@”à¡Nnž% Zò)‰.ÚŒé=œaí(‡©°$2Bö¬ë’õØò9_+Ö„°V¤à$¼dÂ= i«eYÝsR|1—}„Kòm7!Îd¬9yÊ^#s¼IÕX¶<ðZF@Ú”­­µn)«†l£ç+YBx’“³®±uPù‰´B„I1 §n¶þ¼bS¸ox­6-×'ÞLÌ—Í+܇õÜŠaÇŽ£ÍsÀT­ZúÞ>]}«2Ë'Eñ‰va•Šé+šãKE_ð8Œ…&}ùÄ/ ²Ëy 9]š®´ø¥Lš—lÛúölÂAYÕ9ˆ¹÷Ûþd ÊÆ›/ ¡‘mxEÆD†÷+e©\„>íΘŒ ÅxXB² eÍ›¸ÅJ˶é,i‰µ"=1JÞÃü®9×`¡¾Æd$ˆ ž $ ‘i]ɰ Q›;†ì`}I J”åàdê•ñ~L! U8Ú£¥œ(¸wÑì‰à¥k‡z¶±"RL¼Ž²ÎÂ&8P®" L¢âúvôöLØ|>`C© –˜ÀO0›:jgL_ßd6Y¢£íYÊø±?Sa¸ù–@ 0 Y»¯o&ø!$ÑY“snÑT¸'ñÒ÷JpuIÚ,ŠžÀþuª/ê¢Åk(I# þä0Že›Ž N-‘-9"œDǹҗ€už £Ý?÷b¶€CÑ [±•“l­ EU4¶\‹T¡¤G¹„m“P{yŽÞ"¸{~¼ëBÕÔÖ ð äqoüÎDhPŽŒ·Ö±PŒÖËÛ)áo›†”lùFŸ‘ÔoC®&ößú´6Ù¢sT95ÌÐzVX1€5Õ’UžEˆv©×€Øl,±ÙÌŠÍf"6›±ÙÜÄf3›%6›Y±ÙLÄf3#6››ØlFb³‰(6››è©!=3nm¬Oç&„¶w‚ÂA\¤~-¨a“å6 îOvîIø²\¦µö}Ï Ås44€RÕp›0DM´¡˜:ÂÆ1˜Iß’hq‘ÜÝÐå£<²¬D#Èé=âe‰¾¦ Oµ~õÇà •¿‚¤Ép‰ ½C]á²ËÑggŒIôHNÏ/;[2mÓE.Rï)=§Ëº¯HÖ"¤*Û—Œ©;¸/Ù”­Ò@Õz™°/-–,eœX±L~¬Sr†“#sîÆð¡úVY"Ð!ï%XQääúœôÀ¹c¤:T‹_¶íœ΄8lÙt’ Þ#øqL90;ȸ|¼ÀÓ€?/ÚÀÑ1N¬˜%–ÜÆÇsèDRÀ­ JNÇ ˆ;Ìäã0ý-(;V¹F‡ É¦žˆšx÷(žÇ¨#ètmÿ¬O>–KsŠ>1'…#K0JÔï¯ß8¥ÿ¬qÔ CO‘2C̯®§Ä€ùÃëÁ€ ¿ÉGÃ+ºÔÿ†ª¤pSàmº%øwúÎC±ÕUŸ&I0Ö¨D¦®‹=ÝÁjn„W—1ý^I¦Âsà 0Ì@ƒ³*ª9´^ú¹ø(m7“—4‰òi›Ÿ‹ 2ÍñÚƒàN(¦SÎ)‰1/6PåDsv§§—ÓS¶Ñ¼£Jà»ÿ;”7ï[òlÀ]y 妠”ÙIRFŸac€P–¨+ÇÔE£ᥤ:鶘ŒdVÄòoT‡±7e2c5}P;RB"W&#!J³¸~´Z=—Žðlje,,PžfuŸ{G¦¢ÍGc;ŒD£r]Öm©xdÆ\6ü&ªš¾Bx˜è3ÇðMÆO¸F÷6”Ã+VõøŒUáÈÁB6sW¥-j'œß)&=®[”°°$ eªüõK"Â`*‡¶ +`NÍ€¶p0žY©£³LE8nSŽ«>0l_b¢äªl“›ª¥ú¹¢e±ºD)kûM.R©Žö"ÈúæJŒO:ƒà•ˆOŸ7Ÿƒö“¯K 3GáÔ¹äw)unVG\ûÈž†néµ¥²^ÊšÊùÅ5dg [ÖÒ ÍD™Æ"X\Â}…l,ßÙV̦G”‡¡§ŒËoêÀ¨˜äÒ’eý¥˜¡¥nñ1Ƕbõ˜Ë2–ªÝÒÆµŒõÌ3H VW\×-Lr~½ ÓH¶;éçÅçËú¥vo'IšOæí”E á2Äóm¹ FÐôÓÊ’›Ûlo‘ag±Èð2!¦LyfQÏžl]ØXÝз*ÏØCþiL.Y7$3ŽCygQñ Y%µë,‰gÞ¶Ÿ¾Ã˜²—X\; ñˆJ“X†ÐeflFÈ3Y9#ÊáµñÁon[XñVRxמQmr5i½0m\ÄÕ‰C¢f«Æ:ÞGѽ÷Q“þƒjÝ ”Ç úB w+˜ÔglA\€ð‘®Læf,vÆ~I Öíò(ÔúòLAêúÞ—'õôþ{ùuUWMÉ{yž‚Åvź˵ÕͦŒ××!«ÛïƒBtMIšlöÜ“¦'_mç1õ ðzGãq:8N;\†«w÷ÎGÆ–éì#Üõ@¥3Ðè^›š›A Ÿàw 4ކO{pÝÑúh.,dÕô•n›£™\T8Îé6s>øI…æ¦*b¯\)ž5>S|r­Ï@ø ö™{”À®¶~ê̄ՈnŒ›K6!Ï£XÖ¾çHVÖ04«•¿*ç>¨KÊH쵈JQWª¥¸§§#µƒIêdôõÀuÂq„ž)kwõ¡¦Ä΄þ ë7I]œlÐÞ—ÊŽ}K}ºã³ÃL„ˆ[ú0„üú¢0SÒ8ðˆÆ3KxÒwt§ê(0Ñw¼;±€%øäl¾Iwõ…‘*8”[,>‰{DaŸD@í¢Œp4Î;B2dÛ”–|‰P¥ø$ú SwãâÑŸ ›‘Ф ckD# ›•kæ+oÝ…}‚M±Â6 ¼„Ðí°Ïáà“½Ë È'B0·µˆÄG‘H^²`Sl0V³]ö$›qëØâT2\¶… e/ÉÂ:=Pt‹…;ʦ¦å—GGe3Ö “"X¶9d2LSÛ*TšÐÆzmH¶µh¬ ‡§f½·ßaúâMÈíœM_Y‹c›ŽM‹)G!Jù²…¢ÀÙf=¼‰b%Úæ#F~Ie ‘Ý 6³ 10á’¿¢ºñ6Xàœz¢E–™SÕÍzók›â#ÃærDîN¬~>!ÂõQª‡.êIÁMŸ|MÙV²…Gri2&’Ø”w.eJMÙÕ–èKVË6kñ²‡- m÷p&õpÊ:Ùd™ŽëI8 )Xk`Æ&kã$óÂÈÒwžé«]]Y²Ö¡xÔÖÁÁ=dôœK bâgÆI:–É÷f6r×UvÃð‰ à yœ˜õ­<_ˆŽ~P{9[„aQ9Ö—Í{MÞD¦Æ&5*jD–8Žº$‘´=åxO¨YÃSR%Ô¤õ¤ MÅ}ru•Jí\ßRîé«×îq“”É /rÖK?ŸšxxS«*ÊM*ò‘2Å2pÇʸa› FÍ£—j¬Š ëºãn`õ U4²áVñZ)e¤y¤4'«TšLc/$nÀæ»$Wei‹Âü…Oß½CÖpfpëÉ5}€"´Oð©ñBPŸ¤ÑXúÜS5e‹\föŽ&uñqª0Úù•ÉܦÎÄÔpê¥6{\¢ÐGÂaå2;ë¡6óå#ŠÀdÑ=Æá“C1‚ÏL›eâ|J¤:R[1$‹( ·Ìbú`3u>½]R‚7 ýÊT1— •ïåà3Òs·Yž[Wõ“=JÜÅÜÊO⢠ºlk[/{v燣 ?a‰âÃsÔ†gœØPßwØ"D9œôej+Å÷Pt¥²BèÞ°Ñ€d.]Îjì×nU£†!ßo’ìºZ[TÏ=:Õ“nEøkz§·¥U3•¥}O¯ò:]ÍÍ †OÞˆ¯è Ÿà•ö>œ_¿ý.ܯ¾SS7C$p…xdófl4ùªÛ4Ç®µÏÏîFß=jî¸ëCÿª™¯ãà]qÐRs–޹]ÏGëc]^×CÔê˜5ÜëÞ“¥Z´×á}Oµºuë0Ó=ùÉšA0•݈úkQ »½r=IÌô.ø|XÅHqìô†÷ˆQeÓ_0ËvDÆŠ9†Œx¸_· "@2˜C9ÜÞu]W<1·fJÊöZ ËÒÆ’x²ü%ZOÔíã_®Ì›.‚¢Q'‰M÷ ÎËÄõ¦.…À›"ê7\ÒzÇ=JáP"Á(ø¡(»KAdlŽwx”ŸD}U«El´p˜GyÑŠÂLÒŒ¼”ÅË2Ö½ÒÛÂ{ÍÌZt'<·\À‘w†é5eÉ+JùÀ®= „½9#©E†È]iÑJ¬„À ›Û¥÷ষEU¯Åú,IÊÍ|ïXñ;<õõ®BŸ‘Í~Eb¾öBÊØä†Ÿ%a1’»4½b˜Ì)G´²¬>lŽÇV@ÉÚh½¨…åïmÏRFe]$nKµ€ W¦=¨nîÂè+¤²nnšèM0Op-|Òô+Ò¼þ~ç |§Cï žss¼j³²ÛR"̈×g ßÑð ^Ï käÐPͱÓÖ8·þ‚ªr°¥WÌ@ H7s¡Ñû'×½nŽfBÙ_áJÖpÖìÁx¦ª ¦øN¯ÙÌÍ®Gk¸R<Þ7‚z>6s>Šó§ë~Â;NeÆï—Xòìª(§ñúÌYÊü˜Õ^žþyËÓ þe\ ŸÏ+³)&“%œ©ì:[œy$)a÷ ƒÎ…›J•!Nî§ÝTȘ“«„ïý$™/¿Ú³¶Â£Qçú{ŸB‰†È'¼4Fšq«=* ¼%GñjôfÈn_­±eÖ“@­ L3ž{¢á„HÀ[Øõ*Rnȃ-VÔ´¥ÂÛÇõÀôÿqqÔôâÔíáLý¥>žGúãößæØ¶Å¡®Ï4Jõ?­uu¼,äôËýO¾½ÔåQ©N·­ºý–}ÅÜñíeøou~í`¿]LƸ¼cÍäô¨}¥ñûË×±Œ¶wÚ”í@o5Rè( ž1׈zÂÊ QýÁa3æ4Ÿª’“0Óç&0:W4ÿIj©š™hTE"õL7ëM4ÑB¸Uä&è÷ûÔÈõªª,1#«§—:èá݇oSMj5VMj=§šÔ¥­6œ~2QMοeF_1÷cÜT“º˜SMªÎãô“‰jRÝ”‘á+íxŒªIÝ,³E¦Á:ã@’ÅN$4ø“ãí±ç=°RäpùËâT˜ªT±p}Ø•„ #ùŽâòG±zÊ?’¦žu½ÂX`uˆŽ  ©ÆlÑ8DËX¶\4ˆg©ƒ…laïh¹zØy«Õš,27¹8NŸÌ›>½^8xëâÀ¤)š\§ùHz]?d˜«O»û E+| µ©R0Í_+k}½ŠÓ/ÝØ=éI}îÉ+|bà“wôÏíV4pú5øNßÁëÁ³nà¾/¨TUÛdºT6Õ/¤ÎDŽÕæü”QèoŽÙ®¢©„ŽË£»&^ v‘û¼eƒ“°½±J`‡iÒA­²xq¾BPHVjkw=œ Ô¦®¯ËE)ò¢ÍrwC‹Û· ­õT,ÒÃØ…VÃ4S®¹+˜aL¯ÕÁ;¢U¦´OžéÃÏ œ´¬û»]¬O‰à¥mí’Eëà'>6=¡ÒìíùSÚ>âîúyÍ&êŸG!jb&Ó;H8í2q»ÌZŸ*së1Àq¬üªœ=å™C>;¼uYÔ­Œ0Ê<“Þ¬—@ƒ%‰^á|z&ë›éú&…çk‹1ž¯-æð|maãùÎ?±ñ|—ß2£¯˜û1<_[Ìâùº ž¯›Áóu‚ïö•vœ¾ã 8÷ Ò’»£àצxø5÷ÏŸCÂwôIÁFøf…ežUgË“m¦ƒqà#†_+ ã0Á±aMQ['òyT¼Òô^Ðí2ˆþ2Œ¯Ö‘£5q8Â<™œÍ’RÌ,©,³¤ž5Kê‰YRϘ%õÍ,©GfIe™%Õ¬YRMÌ’jÆ,©nfI52KªˆfI½›%¶YR?"Yw…8o½cWˆ‹¤ée_ÅãŽñØÕÉv}ªpÕÅú‚bð7ñµ¡áÊæÍÉj¿|}l†åÈ¥©µ³šZ;ÑÔÚM­½ijíHSk,M­™ÕÔš‰¦ÖÌhjÍMSkFšZQSkÒw$°{$ÀÛ¼ÃãáÛ­|žü`á¬rÙø8غ¥°;^3†rT6Ú’ rŠª¿Kœè+‘Ìy˜RRw'!xߢ†å TÞ7_f,·IÛ$¬ø29p²¨YQáÁŽ9MX*É:e:!Ó€Ix\"Þ%ç´m¼P·Û#Õ1…™öÉñd²©}±Ð—ŠI½”…"3vî.ú>è‹áMëÚ±7­ëf¼i]¡,O×ù'¶7íò[fôs?ÆÍ›Ö5sÞ´®¶½i§ŸL¼içßjG_iÇc„÷¦uE9œQ9‚rÒͱ2PÆmzž(RÁôqpM®€;U5æšooŒåøÀÍ»E ¢í[Æêåžø,ÎŽm¦˜MK2õÞøj¾!c©}‡ö˜càä-}”Kq^_b 3_ª$ŒlhA´Yl÷ DF†ìêaõðÀaÈc`ójY¾Cz€ØŒ’6v™2>Çt`÷øœ çG(¡¦Te›É›ÈȺ.eªE2§çáÆ «²=[Ý'×UÂw;è´‰¬ê0ņdJ˜`* Ü)ŠI¥Á§!Šådü(LÁÒ 4µ xÙL¡¬Û& :yb”)õ+0¢*þ¥k3jÙzb“ŒR$‹Oœ7£Gç[Ùй(ç–Í¡J,§â{Ô±,zÅ–©GË“9°4viÞóO&Ëóo™ÑWÌýCÀ²3ÕLÀ²3v‰áóOì€åå·ÚÑWÚñ–¥î¡„F=圵:'îŸ=™àAýzO&xLcÚ“ öd±˜z.É^;ì±fnÿ´}Fø€¥®,èH†Í/r¼£ý‚ ¹!éx†Ã:$Zq‰ô4K_ƒ_–¡%Cì3ôàÏ/7Fˆ"XX†ß9¬YEq}TÌa2^Åî`Ð&SÅÄîÄrL´Ó™Ãî„ô#{u¢Il èJ` ;kã˜ñj0M>cÎD)I·–Ì'Pp¨‚x áv„¨z­ö{¿þÞ‡Ú}cÈùÄi¯ŽÇ{€Mh"FÃÕ¥˜òO h}KаC#ÄGIÄ5p%/¹ XSŽƒbM5›Ô«ê®õªÆa­óo™ÑWÌý· Xcæ‚b]wëü“IPìü[íè+íxŒA±öÆo2.7œÎ“±%÷¾«ñ ëä\ˆÆjE!5,ßá;²i +ÂñX$aÑ)}G†äEUgÙw٦ϔâŒg †eœ„”+"yßÞô-ée!¹Ž+ÀØã „R¶lЦM²¡`[§,IDñå ^ ­I"Fš²û t^`yƒ/è®]nJ»rÜcõØ"—[‹RÛ$ðѨ`›Lâ¢PÉ¢m6(Ï;g ll²¶ägúØ@z-’‚J@ý)‹G¶=Cr#‚Rá#ã»A bHÁ§³QÛÏ8‚/ÎÜjЈj“L G$/ŽJ"J8ÄMxù[vöáy¤ŽãÓ \àÉ@ ްœ(¸+=¼ƒ²"¡¨1Eî2ô ahY‚ žµ–Š ¨ß[Qx€ÂâêµuÙZ¢6=ÍG˶ò¨ƒ’q‰´ÐËØR/c™@8#wˆ\ÊÃI`×÷Ü/ý­ï9¶pS]ÙnÛ £ÂV³ ¶ÁU°Õ¬‚Ía5lø‹ßÁ^q{Úžæž¼ìïéßÃ÷ÓF:÷ù—¥_X!ýÚÙBB'Z*Ô™òúV¦OAò¾ríf†–®D¬úšÍq÷äzªõô‰yíßéoÞä„pŒif³ä!›Û{¿Rtù±0(mÄñ›zºÀþêaþŠ…éÌ2þ|§W•×Ò›²e îü÷ÓŒ‡ƒ†{‡“þ&½¤­bcyfïzf;÷dÉ ;w>#¼R¯5¦Ÿ7tEñJñ úòªs{ýźTÂe®Nkž§þUŸÇ[€‰ ö’Uëupnˆ¹;C¢Kžoìo›ãÇí㬧)̱_Ø:¤pëÅê^€/ ïÃ//ÿÎäf endstream endobj 5706 0 obj 10300 endobj 5710 0 obj [326 /XYZ 38.2500000 671.750000 0] endobj 5711 0 obj [326 /XYZ 38.2500000 553.250000 0] endobj 5712 0 obj [326 /XYZ 38.2500000 212 0] endobj 5713 0 obj [326 /XYZ 38.2500000 743 0] endobj 5714 0 obj [326 /XYZ 38.2500000 743 0] endobj 5715 0 obj [326 /XYZ 32.2500000 712.250000 0] endobj 5716 0 obj [326 /XYZ 31.5000000 713 0] endobj 5717 0 obj [326 /XYZ 38.2500000 671.750000 0] endobj 5718 0 obj [326 /XYZ 38.2500000 553.250000 0] endobj 5719 0 obj [326 /XYZ 38.2500000 212 0] endobj 5720 0 obj << /Type /Annot /Subtype /Link /Rect [393 720.500000 417 727.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows >> endobj 5721 0 obj << /Type /Annot /Subtype /Link /Rect [324.750000 302.750000 399.750000 309.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 5709 0 obj << /Type /Page /Parent 2 0 R /Contents 5722 0 R /Resources 5724 0 R /Annots 5725 0 R /MediaBox [0 0 595 842] >> endobj 5724 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 5725 0 obj [ 5720 0 R 5721 0 R ] endobj 5722 0 obj << /Length 5723 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`<âC”¦ ‡ƒ ‡EÁl6Ábf‘Îò÷#[’Û¦üQâ×EÚíV7vº×lQÅz³XUüøç§ÿú½øxÿôŸâÛðóþiSnëªì¿ŠÝ÷‡ãt³~/ê¦*¾ýØ<Ï›/›/ݿϛþ§û¿v¿ý¯ÐÅ_ºÿ~-~ú{÷áÏÃíþàǦVu÷óûþg[«î·òðs÷ù¿7ûCñÛnÆñu0§ÿÿÁ(WY·cæÕÏ›q™jÿýû·ß6{ĽÅS¶ºPÖØBµVÿýçæ—îãôå¶±F™ZW¶û½u¶.«¦ÑÝﵾؗ×zÿönb¥Û²PÝLþË÷ßBÓ'˜\5.Ýä{Èű¢ŒSáÙ·¾àï仛݋;¤uÜÖý“ŸÕl'‘{rµUzfOÁ •«ÒM¾‡\)#£ÁÉSSÛuºx²Ú%ÀÙaöq;œlòäÒH© 'OMí¦U±² ö2}‚É[Õ¦›|¹8VFzãÙS¼=¨Û$~C›P›[Uš„Ü´W¸©ü<û¶µJÕ;B¿Æ#tP€ÕÔMÀBýÚ9ÒéˆÛC.Ž•¸Ù%‰Ûé…Au ½LŸ`rW&œ|¹8VFââÙ%‰ëZ—ÎÇ~™=úëݼÉgy"OžØÛÆê„Ô>Ìž‚ ­IÈJ{ÈSQÛŸüKÌ$’þqzì‚%«øõçâe©ïþT|ýuÓn®Fû‘²A#ÊÁÿŒ†Ï”päŽ8ò96ÓîG¿v„MN]bŒ`Ìký^¨UbØðJ1ÿÃõè>qmàJ­‚Ï@¨³ò¥µóÔº‡#W êŒE̱ö¤!M†B!£VS¨ö©´Û“Jk3‚Ù/Zu¶§ÇWëçFêýHµÕ®zY4ž ?óŸiÑ3¦êŸ1ÛZ5õÉl-šMAÙ?£¶UkNfÓpÃVÞ¡gT/Àn»Sá§„Wð=£ª¥zkÚÒƒÃvq ¡˜_¹mÓ¿È7çVŠqí lÄJ•˜À´@·Ù²˜Î‹ÀT#˜®ç=íªÚ–> {‰·[kêSÂh×ãOªsÏôÌo¶wxÊüƒÈ6 &”ÝÑŸöÚŒT>šÕ¡}`€”%³áuY8!,Æg{˜ÓèF®t‚.æÅ˜ppéƒ ‡ÈÁ g^–¡ÚâeTW>g¬{Ü{Ôh2â.€`‚®•Ý⤓y戮lÆG$6À ‚Q<¸çÏ,(ö„†¯ª&–Ó™ÑöØZú%  ç£{ðQÏ-.ÐÖƒ›_O<B#žP­ wb¬Ð°j` v*–;K¹lÔ”ïJ8=Öc ?Lpц‰Àè‡åDÈ\—nàl²fFÔu6›G¦âبI Y-3"j¹ikã‘ëWû£ÚãCMñ±[Ö~Uz±/~t»AÓò}ó”,hp½‡ÁCör¿sV@»c¿Ëc_¤œ¦Ðö,îÔs¦lÇW~>8ƒÖcÓŽôlê¶n\qð™=3°¶²ÛIðK¡‘Cßã Ôwè=z€ ™BÐ q½m‚À{ Ôæ\|&ðŒGJ„ƒa»pf¥ØÆè÷”Åkˆ7 qp?ƒôa1S!sˆ»NÂbX0!. .bWÈxÖ+NaóÏÍf ÍLø÷xŸØ›C;ð™8†¾gÊwn6³åX¾}„'ˆ`‡0Bñl„ëfÅŽÍÝb’2 ¼%äï‹|7Qš ‹Ên”` ;C|¬¬<@*V˜àtgÚ’3Ök"06Âk+¡—Uÿ¾¥,y„sÔg‚S^Źâe>ª1Ñ MPý ƒÎŠ S¡Ðc5Á·n‚À¶ñ÷€SqdT–lE/åÐSJKÖ±6$l­ñfÇéI;žŽ9=#¢›Ô +œ©Éä2VL¿$-N€„â% æʯcbRi“¸¨ƒ×Éô.µ¥ƒ…õ!éô êÞ”–´öð“{ ðaJEìOEcLD6u\‚„âÀÑ4±CfR=AU¨="2⧃ŒSñÉ{q$×·M¤¶Î“`Õ1ýDÀ ¾d|vJ±‹æ¤æ:ŒaÒ°&‚0«wSAkë›®©¸T„S2Ÿ XfcUš2›1Ÿ ªÌæ|–‹ iÈçŠBÐ.¦ÁÅ'¸0’Êl ÙÊEl¥¦ˆ:DqNÉÜÆA‚ŒÕõöDk‘(LÌfe#T„‘ ®8³!p…å–© €ôÁÛ aI¤¬‚¨È¡Î–ë!kãw&³QÇ”æ¦Ñ¾½YžBðÍ™ ž±7LÂä貂Ò}Åõ® þ—)¿Ç>J±ø|ª<$âJ}ÜAöoP5 ôÕýçÖ07’~gWµõˆ¢âûµÂ'R„O—ËÎi2\µ@•¯í«² ºsc‘ÍåÛWU¿o“Žo³±•ÁÏd0M31ÜZû5aŒá­’ÊCÙ°oñÙ(.¶ZÁ` ¼7x‚ÑêÀ{p› ÜŽφWÊ´0Êy®]íqÚZˆÉû ĶD3o5“üò±o¦ÂW6y@6²“¹Á”–3=§r¹Ðn)_“¿)¿“ÙÂÉÜ—Ñ1[4MòÞ‚¸‹t{Ï›êš6Zbõ-Î÷Âqÿ‡#3pÏ 4±â3vRÖ¦:ßÎRB¦Ô1mÛí˜ë¹Ö^‹263gªŠÖ£7ŒÕ¹Ëµ§Bwp‰N±Ú€I848ˆÅªSÅ+»l|xŃb ד3yA;3Ï¿b»¬ð4zž5¯æSªUs¬šc9¿èr^Rß¹ÔÍD•:/k|%sµíe7Dµö×ðÞvÊv®ñ°ûþöC݈ĥßÓÈPD¨Mö’ê…§WÜ%2‘!¦:’¹Õãjó5’Z å+„ˆ-yÚ{x´Ë¤0šoy—á¤æR"Ù Îòl9æÄ [Ý…ûY¦u«œõ-ÿ›v¯ªÄZW¦˜j "æô«:ò8FŸ:A_ÿÉ"¼«¼·S„;ŠˆžIÊ^Ä4®½ù3Ö÷r ~ÐK½|¨©|ìØ|Ïån»{þǦ=ýàûæ) ¹Ò¨¼v*z›¤´;;ªŸhm4ãQH‰Ë*)%O¬‡ª¢`šý1·‰ë+}˪ñ2n_|©”þË%yà„a<Û|£âŽsár$ÙkY é`\ ¦²l*QL§Öåûù€V^ÛÚ¿ŽÆkžßüeéO–Ò9ã¤Ï.Ó¶e—"7ô*ral3æ6¬'ÚAØÖí=¿Tå|îIÎ\˜J¿ÛTÓ¸FyyÖ‡+¬gl/Ô€a¤UûV ­›Yþ[-Å›°QP_óÈàäEÚäà˜ã1WÒ¸ ë|¢ý ›¬c؈6xÙ)¡ì+Ó¼Jý¬‘üªÚnvP÷—¿ªC/}Ю̶?²ŽKÐ=ÁËUï[1=#ŠÂ°FÅö™!?¡4D~@ZD1¢m-z>fŒÉø¸pï ©º±·m{“›ÚÖúÞh„ÉÀŒÆ\~à8ÑnÓÙ A͸}Ø— ê$Ìs„P2±˜;[Djâ°èŠta¼†+ê *Ó‚Ñ…¢a¦kU~ñNáîx¢¡3&Érj±F4© ÐŽlšÙ]gFÒPçú²€7›Ô}Ï"‚xú2÷ Ùœu[µKB+ôáDYAºöÖ¯>³ÖÉz«ûŒñ£‘Þ¸éÈ&©·ÎOòÖ Ê×z™óçÎÁöyX)ÊÃþ­õU26>nºÀ5°¹À{ì3ËPx6øÌ DUÔÒJæX†Ûý^Zkˆ;LN̘m0 ˜ßýçdzµ3&#ê=cME ¾_ö {bÑ ¼B=¸kvÉŸâé±”aV#˜=€üG¨OBt|9?׳Ü_—f;hÎeb !s|:¶!sö£ø²ù?ÄìØ¹ endstream endobj 5723 0 obj 4047 endobj 5727 0 obj [327 /XYZ 38.2500000 749.750000 0] endobj 5728 0 obj [327 /XYZ 38.2500000 248.750000 0] endobj 5729 0 obj [327 /XYZ 38.2500000 749.750000 0] endobj 5730 0 obj [327 /XYZ 38.2500000 248.750000 0] endobj 5726 0 obj << /Type /Page /Parent 2 0 R /Contents 5731 0 R /Resources 5733 0 R /Annots 5734 0 R /MediaBox [0 0 595 842] >> endobj 5733 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 5734 0 obj [ ] endobj 5731 0 obj << /Length 5732 0 R /Filter /FlateDecode >> stream xœí]Ë®ä¶Ý߯èu÷ˆ¤ž@Àó E€Á EE`Ç ŒØÈÄ‹ü~t[Rß¹TJ<],±»å=×ÃÅbU±XuêÍ?ÿýðÏßoÞ}þÏá‡ñ÷wŸŸŠcSÃ?‡ç_ß}û¶=Ž?š¶:üðËÓ×Ã×§OOŸúÿ~}>øüîÏýOÿ;ØÃŸú>üõoýþ8þ¥ç¿ðËScšþ÷Ÿ~ïÓÿTœþó=ýåw‡_Ÿ{œ†'óúÿ¿s¦©ú.úi, ýõiZ¦9ýúí‡_ŸÞ ˆ¥vUáʃ)ŸÿÓ•öðß<ýÔ0u_ÛÒרªìîê²)ª¶µýÏÿaoìytÛõô¯gcŸ~ÉôntnŠ.]ç§™KŸÚ;?v¥1Íó._ÃVà ¬uyª&}ν§ ¾mîìiæÒD™vvžú;gžãsï)6¤,êtŸfžêÃÎSïvÙMrµš« éŠíº¬òÒóÌÅ©2í7î=õ†7K¹á/Ý'è¼³ ¹é4ódŽ{ÔÔuaF¹^{ˆ“è¥ûô¯K'¼‡™‹SeÜÜ@ï’›[•£êìª:÷ž‚üýH×ùiæÒD™¶v.¹³uÛ ä±ýE$õ§îSP¿íníiæâT™övÖû§˜^ðT†?Wþ¯ß~yzóÑ”¦'f}øòS?¹Ó˜Ão_z¢T‡ïž/}usøòãá÷Eaßþáðåç§îXÛjšâÐR´¨ÅÔ°¥ŒÿÆÂoаå=lq°åcüÜ\wjùð¥ßØä{ÒÖËkx[:¸:¸…}”},ðÜ`‹«à8x°ÅA`Z—ߣ– ïÜmÜ›—·Ó]bq[ŸXÜ”õkB™^6ÓñÅÎ¥–æÔRm=4½´Ô¢ßtè3KcucÚ¦ú曱ūÎ5¯¾q°·~cN-õÑ™a¯|æ¿0k3ˆ†æèºÂGl{; ÁÊbØÞ¶œ¦i¦iÎ5LÆTÇÂ[t1ðgy,]ã-úLö±É—‡—¾ù0’ÝÙÖ¼Þøáì´ÇvF(‡Z˜ÞFFn×üÕ¶”p³î!-ëªaË ýܱ*ë¶¹z²x防 ŒØ؉+ _´¯g‡Q#\êU”ßm+º_ {»õgħŸyg÷¸ƒriç‹å‹w©µ[5WoX8®—7XZÚ.v‰ k––£ÝaÜ´‹W ,"•Ào¬ƒ§œàßÀ)øS5Yó½ßýúñ& 6:D^€™` BôFÍZâ bÐUÌÒñ7Ø‚…|XÏÒYO¨fºº\¯fàÚRS Ë>¨¨ã º‹”ÎÀsƒ-Þ|ùÅ(nʨÃËÀ„T’E ÓRÂÂ'¾0GâÉ$¶C˳«gH]áØ¾¸—Ý'Ì\QµVÄ1Mïà³…‹¿-ÞÓλöçí†=êŽïÍÀòó)W:Éî™ãæŒÏ¸ð4è&‘µ[Güug‰¹UŽoUdx`,0×[Ø( ,›t9nØüÆl=SlÌÞ2¾˜ˆƒüAJÐ-?#Ûjzc;˺˜Yø°È<=ã'aüèiá¬ñÓfàá‡*ÀõäL7‡ŸÅµ`oÌ·Ö¬q Ã´Öz7uÆ\ažPú;z±‚ǾÙQã?p¯Ç +µ´.í™ÕÃø°+f¦„U?sEÒ2eD1"îUÆeØd|äðMº'65e\=yB-Œ« ĉ*9`–ˆªÊÝ` õ¶,Å5Ku´Z`ôaà›"ž¯hÔr@ºà¸iYÁ’‚boð8pnØq<ÞÙYÃq³ÆZÆ*j½öì¬Ä«cb 1÷{¢¥‘eã¦ñÜnS».Ætç© §…Ñz0ï`ûSy”²qðùaæÆXs÷¦ß±ÜëÁ½e#ùÒ»àJ×N“Ù%Oý’º¬å«›ÉpMì£0E½Ž²Ž£Ýñ¤µ¨ã#qfúÌ{ðwü†LÜõ˜ü¤‰i¥©›Äi³ |¸Þòì”bÛ:omùú¶S’¡ñÕ—ì»…DŸ,4Œ€‘ÑLÓ2=s P‹lPâfG…Š'Ü<eÝ ~³6T„ZÇsÄ2C }óñ€oÕBj EDÁg}nä+-b=%}|k<]x›·º¬áw7Oò@.W žÎ„Þ‡¥# 3F£aj#à3ðc0|‡·e«•+„KZ·E7³¼è‚À›¸XlD¨.}ͤ€Š]_ŠF„èlckWoã˜ôŸ¤¦§Çå}Œ³eùÇ[¬)Ëîî/‰i¯²vX–­VÔô½_zx\LHœ\Z¸ýëƒçvc9-åÔ)8NÝY=fœ‚oú‹O€i´)¬GÆ-í,c7Ù”¸­!SÕ«‰­` /ƒkˆ0E R¢ñ³·,„'QwC˜I8mÿ=·ˆÀFȸ÷E‡¹WU×úOª }Éù8,¾ßy®¬ Ê”YŸ~%[Ì#qå‘ —ĵ!î,X ²Ã2@òÄ‚9=ºñŠ‹´öu[ûJpËËLÛú7Ô»ºÌtÆ¿>ly™é\¹šØ»\ÛåZúP25¿>Sk{ï³ À˜±»åÅÎØ²ó%ÛúÄs ÏI›, aĈ8¢žÏ:CÁÓ]APW9»*ˆR+¢7Cö¡D£;ïÅŤdxô‚‚÷´ôDì^ß*eno[LèZ1ønºè"ˆËF‡9ÚL-fÖ¸vJî˜.­­çsoø Tíü “À‰÷þ6ëF)Õˆôf`o E1 p- ŒÕÂÌ€X)µ§DÍ « s<œA˜m9!Ììh<‹´ªÝ2Evm²k“,´ ¦(e!ã¦êÞ9YŠÂYlZB×Z¢–W@ gŽ£Ô¶öµÎHï©ìªúõB/¥FD^`ŒT…á"M›Îœ¯‡ 1Á‘Ò*®~Ù˜M‘ DÊ£L‰'ycb æe„ˆ” ·¼7y¶EBaÒ‰c0 jOá\¾DEŸø%§³ Úù‰HY/ëqnÅú7@&d`´Í…0Újç”3xzL¾¢V£]t ‰nå÷V*-"Âg¾E´ B!«P ˆæå—zãæ“2’fóÏ´o’0Ú51ŸÛC¡Îo:˜¡Ò–Α¹ð2RÆö"‚ꨔó­â”©wëÑe‘xVãa¬& ·ÑhVpÁ5Þ[ú†67ÅáÚ1Q|JJ툆Cfu+îO®ÇƒÊ)"ýmw')2?ã°%ü¦€5b¥‰kÖcÿvŒ".xà€;âÈIäÿS~‡9·j©+"·~BóÅœ%øe*ï î J—H¨XëÎøÆñœ%’žº ¶¾—é"‰LZΆ ±˜º+XÏ1þè™E)ë"Áì&Ü€S1ÀgŒG$ÂoDa*‰ « OYÌeds€v7…O¹ñ£- —ASUþm0?ðC‘ÔbŒ†È$ ¦Ö° òaÆá.¹0{ő뎬lèo„–Ç›MX<ŒéX2õ†%áW!Þ²~Â/­˜‘^÷;0ÙÝ8ŽÉ,íʹÙâzÙxuQׯÏò¥¼&« æØXœ§Gd-YœséËìV 7 gûŠfaá]wN‡_Ú³‹òK€"8—X·Ã3ÀYˆ°¥$òßdi€Q2dWÊÐg.fŽ^Q›¢\œO ÷‘Ⱦ H+¼[x&_rR§–Ø…÷éelÖÆžkA‹el®µ6ʺ‚ßà–]«‡Ö“»V7mFšFTB1Z]–YËâ[ŤªM×=œVÇXX^nÀJ¾cIj ´¤¯Ã·èIÇçÌB4Œ€ÍOœMMkÈšvkȾ@Xl¯©°¾‡\ày%.½Ñ[&ƒ ¤…8ÇÉ]‹Z?å´(ßn;¬)q;eNeTw®ÉðX+!õ¿Úׄ¿T?i¬Ï”-ŽÅÄ¥ŽŠVzCf*TRÖJ‘y c¤[Ÿü¹}>4ñ‚y(&ÏA½>ÃôÇ´YãjUŒ´’Òn,N·²¥§ù"(æyvLšvl§DÌ︑ܨ¡bü•¤I@/`q‰u£¶)rX(¸?Ù½Õ’íXæFÔº¾3)§’Õ™²²cç_É(H&Yè'B$1¹Í”I›¿E¦i™üuÑŒ_JðKé$!L¾»à–qu,BÇ(øÔÚæŠƒ¤,ÀSªö(b‹ñÌÝÕÐõ\.µ$­JZù{ªä®TcYI1}DMEÙ4 ¹¦&‹(/›°ÃTû à ‰N‹9)¡ ùò»8ê•KZjÒösŸÉ@S­ñD…Eß,º;.^bϱRóqð7õƒáË×%6z ™¥C½ÙñQ´Æ3c/æ2¹b°ã¾á#&ßž’vŒ OÀ„¤wZLêuϬ)ã] ¡ãÛmu,:÷z²˜u²{ô¯"²ï8 (£,¤¼Xÿ˜Sà½÷,æ ‹¸cµìÕ™…Á"~ü=梨V ½öu…Ù§­ÒÇeêxÕPÍ`¤ —ØiQZOf[ȆS‰"2Éñ´»bv±Yz&N:›Î7±½‚"ç|s•G3¬GƉÌÕµ|¹(3/k÷[ÆF½ ª´¯yV’1&DÝ 5`S-9ÁDâàSÚ.Ùzé__ÊÒ-oá©чTicî1žfÌИi´EJ)o.PµÄ c¨«E5I /Ët€®ã½ÅîNæ* há3Áq)8@’ñ0XØ[?ût—´‹^²Ëö¬]>Nglxo˜QûRK3’ ڨoÆ[é¥o:8Ž™äÙ,Ëgh©ÎXç¾jŽn¶½/!0¾D}‡æ†ÇÁ½fwÁˆ%’-•ðDEàgªû].’xÁøÞn)$r£2½Eì†è •ªTqÕÂÏØb̰©¬qμ0fŽ+Q”_µK¬hñl-1YŒ2LJ¸"%‘Ik¿[OÏ1F0¾âÈW&z5Âåèžáš´*^4Éêñ€•eÂÓ@õY÷ëËÓbj1Ná’L¿—”“DÍðùõg;çý€fâëËEÍ#0qÖäLɉ€…¤[q0i©öÑOð¢,÷ÄÙ ßÈ•‡^Æ[©šòõYˆBÑÁX9ø?€IE !ˆ‡Q˜0©ŒDMÔ¥ªsËT$PÈtLp‡,Ò*¦<ì…ñ©Þà7šèNuoyuÃH:Ÿ'a]7¯7[è½-qq[ê5`{ ô&½žLZÍb¶£Ð=ÃèNjé·w­;ìöÞâÝq¡¾é³K™b ÆzÓØía{8€ÑJTA*°Åˆç–1ݺY`37nBGwøÌàucÜ\¢ÎÄÞ¤›èý+ Ÿææ²²f·ír5cÛáèMyëÊ›¦âݵä,°¼Å§v·íò–·š²¦:×Üm»Zr>²²f·ír5cÛáXb1y»»ÛÙó# Ìå BA%Ê ÞkDÜöÝÂq¿L%%‰J”ÊXÊ9…žî0+¸ °;xÖ²áí J÷g‡m¹”ü) |/˜…¬PõE½e ™î¾ö”êÓÒ_XAÉö!]Ï……y6öœjˆ‹N Ê£¹@–áo§š 3­ž·Œ©MöXûøGÖ@.|ÆqK —æöq\)ÊoÅi¥/qÖR=_àxh1äVl–apoð›Ñ2QKo^Ø–e¸çŸûO i‡·³fÌn¢÷ðçsK §+G3UÚ‰¡÷(Q.°'>:qà¬GÜ‘rÍ_ÅÝãS†Y`öñ?@yÒGÇ?çãÀWqS¸ã(9×ó2Ç7°‹êáÓáÓÓÿ-jè endstream endobj 5732 0 obj 4965 endobj 5736 0 obj [328 /XYZ 38.2500000 321.500000 0] endobj 5737 0 obj [328 /XYZ 38.2500000 321.500000 0] endobj 5735 0 obj << /Type /Page /Parent 2 0 R /Contents 5738 0 R /Resources 5740 0 R /Annots 5741 0 R /MediaBox [0 0 595 842] >> endobj 5740 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5741 0 obj [ ] endobj 5738 0 obj << /Length 5739 0 R /Filter /FlateDecode >> stream xœí][oܸ~Ÿ_¡ç™ð*R@Q`“8úPÀˆ>}(²Ý‹î¢î>ôïW3¢Æ¶¤’ÎRœ±b$v†æíÜy.äÇ?~û{õÏߪŸ¿ý§ú¾þvGgE÷§:}}xýòÇðså¼­¾ÿrx®ž‡ÇößçC×áÛç?·?ý¯RÕŸÚ¿?Wý[ûáá—N¿ðËÁI×~ÿ÷ù{ãdû“¸|?}þ¯Ã_~Wýz±Ÿ.,æíÿ?hé÷§eÌLý|è·)Ï_¿}ÿõð±ÀºYj]7®®¤Ñ¦’QÕÿqø© ^½ÑR;eMûsS'¬÷ªýÙéð‡:¹S—ÙUÓÂËŽæ>ñŒ.ùw‰dƒw+çŠÔµŒ~lŒ”î„åkȪ´>€§ýËý—á ®K7øyåìP ¸ŒÎ‰\Óʃdlû2z ð[“pÎ+OĶxpNÌÖB$ÄìeôÀ¯›„ds^y*ÌÂÁ91ë… àq)ô2|‚ÁOÖT²ÁÏ+g‡J[<:#r½P:!r_ Ÿ`pÙ$ü¼òTȌΉ\åƒÊR­]¢Ëð)àou:¡Ü­œ*=rñèœÈµ>œQ”ò)àïÓ¼— 9÷¼rv¨ôÈÅ£'>òz_Û€ðz|ÞfÀI?|œ4R¥¤¦ÓÊÙ¡Ò#|4úãšQðRºO€«æ9ÒñÓÓáãWid ̺zú©]ÜyÎîÛS [}8¹DS=ýXý^õõÕÓχæX+Û/±kѵHƒZ”ZßGÖp4ØG<À–/°Eü6׆wŠ!Šç-ò3l0ˆÀº+€8Ÿ` \›†XÐnº[ÛÃSË^É9£Þ³ôw' 1î1|wž)›–1b,à>âDá~0ŸQ$~„7!Uaê5p§ó\McnÄø¡´`Ìá>?lG42a?þÁ\B‘!p4Цœ•°yôG{²ÛeôÝÊhŠ—KFS$1†µƒkƒØžµàÒKâÛl!è û¹^ºDd'Á*ÙµQmÔUdÄYI¡Þ’„ÇÚIïì«ÅØs‹>ZSŸ^m ôÑG­¼TËúxØÒmÚ}#Î¥í§ us4ºË®Y2Z‡^ù÷õÃ_}W„a²b`®RúÈOÉ1Þ œB+ÒnPy?¸ }8šƒ-ƒxmx´XÇ ‡§?ØoShiÖ£?²¸¶ÈNáÚ"}ð °èÂä ûhLL¡¶B¦@º‹ð­S‰Röþ²Á^ñéÐiAK˜'¡³JµØP”“Ôͼ_Þ7|Ò,{m®Ý[ve2að‘&½¡âý`k;O¯âiŠp/Ê^¼ãˆ‚Ù[X´ãA0¨)ꀂR d £áµa5ª¿¬7#¦¢ZN‹»ujç+R;»5€%GÊá3C¡;Ò«‹”Â~˜ôÆpÁ” '&¡*×Ùeù±”×Ößw/&IçÒÁãã(^#·IN…‰#-¾H0 Ýå8 qÂ…ŽØ‘®‡ æ7Imr;m”'sˆÑˆÐÃŒA±æ–›«÷ÙÈÓ†ÅÁ„2}(ÆÕ¶^*È^³ÈªXl!`Ë {7#vœÇ<ä4ùVL¯8 Å %:‰Y8hØ•€çù”'Jί·àèælKžÝ©æŠÝ½;uˆ#Îy°eü5´˜)gÇ^ßOt^@I¨ ßGæÁñtL˸θÀù(‡/ä&EÈCÀÒ!œA‚ãéx4J¶æ,ÿmF‰R»+¨á]Ÿ¬—#-k~=ÍåA¶Ûä‰9€õu‡œÐ\÷Œ\&™I˜ÍI¿—GܶOsôíT=pî-ŠÄrâÚkRà€·&åŠ[þV¸+(צò”CßM‹¶¾o_ZÁ¬Uq ¡(&WK.Ë"Rf„k+»$Å wÕo7Y’b ÏcRÊKа»¼hÜe™UêËé ŸV0¾qá åÙ’e$¥<êÞd$~²wó³Sd?”‡Vaa[ézBZ9Ïgx¥™äj¼eż¸Ï¨ ¤»Ìʦ |%›©)Õù=¯ôÔ¤8vNô‘œjqáH¨€ç}U…û4¨O01¤>Ë5H9ŽvÃjó°êò¡«hÇó» ÔîR•þnì€äÓM†½wù$vù”[>5—µwù”O>ÝdZÂ.ŸÄ.Ÿ2Ë''M18Éå«+@>eJy?eOƒ üœýúí[ àç‚“wv)tËþWg ºQjçç²ù9Ó­Z7ÊÏ»UA—Bî’z¶K¡|RhOä¼A>“8é_^%ÄÙv”$Høðévn˜ëV@¾ßŠ;wö´¸—}eJ‹‹Ào9â(i³¼ôñÜ…É€r1>¾9' bÃLIH›ÅûÁ)°Š$=0…_¢ä¡³>ƒ3/Ó7—ëž°­F8CD¬+|*¶¹±OGh°¥D8ɽ¶Ú¯ê¹~7s¿°ÀhðSˆÓ-Í yº–²R—— $”Öݺ݄ìL uTÝ]ž#«½·„"u¬‡×b†;j§8í šGÏÝ~7µ¶¯a§èù1œ”m†ê‹…z¼ÁÀÈØ2Ã6ÎÄ6$ ö ¢^®Úú«g¢¨wú¹]qh;ŒNL˜l0 èÞÝçcņÓãWÍÓßv»ÞA±M'fÈ> endobj 5753 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5754 0 obj [ ] endobj 5751 0 obj << /Length 5752 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èón‹/‘‚Ï8@ È!È!ðf³Xdqö¿©õ˜–¨kŠ”ú±ƒdÆzTñcU±X÷úòã¿~?¾ÿøå?ÇoÝï_ÅÉš¢ýïØü¼»¼ Ý©ûûh9~ûõðýøýðùð¹þÿï‡ö…/ÿRÿõ¿£<þ¹þß/Ç¿ý½¾øc÷PóÀ¯+lýûßçß•õ_Åð»¹þóá¯?kZì»ë3þ÷;%*mªf ]?ôŸ)Î?¿ûíð¾%@\/¥r•pG¡•>Ö—åñ¿ÿ<üTwÐ7_œœVBYitýwUj[çdý·UÝÔέlzw¥9 YÕSQúŸxšüWB–ÉoGÎN¡JnýTi!l3ÑoAVK i{êÛôm>AãZ'lüÜÆ?A€:xÄRø ‚ÁÜN€wð÷°ƒûÙÉÚ´÷ÇÿkóZצ(â¿§x‚ßïàÖv¿ž]õXÏõ|%ë90s‰˜;趸žs¬ÚªÃcÕæ_µ˜¼+=×Ú̉Xi·YÃy¾N—Ûhy¾®4oßëä©Ó»Y«ËÙ.x6áK³ ùP`u ¨)ü.¯ÔH®ë<Ûp~ÚY¾=U% ÕÓ—÷U K]´]7þPQœJ+œ5Þ2Õ'­ZÇ«)Kœ»ß‘m?îäjùÐPûõs¾£NF—ͼ¥íVtÜÍñ\#%êX¶­ Ñ¿ô¶~$êG~ÖÛI?Ê`yIŒÙ˜÷é˜JxëÅ!ÑÍS$-‹½rc‚œh‰#õ #5¯~P5 òœ¤kеù”r¯rÁ·Ù©ÎC'Š3¥zL*“-K*¸È([$˜eñ‡ !ßdžÄFÈ$†ÙQµÞ”ºhaŠ2÷Rp[ ¬̯ »Ó«Z“Ìv™ü¥·8šé֌׿dLßJn¦cL2ºÎñÛi·¶4«5­Äv–ÍUÄdxIØÓS¸3åÐÏ=ÅÈø@lÎ\oGépÈÀ³ÜQTs/"ø PN^kë÷þ·aQÜÌÛ0‰wF–ø&5DŸKŇ#Ëp$#%÷ŽF3°5U ïúyÊHù!Šº°ð–îäé­`|jΘ<5Dï³cF‘â~¹îð;8Š®…£U1­áüà™»/. ‡øÒ½s-eF.°`ÈЯ‡/…žhÆê5¼ßˆ¤,Xj”ñ1˜çâ5y\)^ˆG€s.282ufâkSsý ™ÍÖºqfð¤2Á©`ûxƒýrޤ§ñž"J5ÅÉöKš-ZRŠéWg>¥XË£CÿÓ"DÖ†1­2³Ü„8hÒÖ¯ÅÉšG׈R~uYM¾úÖÂãx¹)ZòÝy[(¡(îT„MFÀðLq$Åq39¸nY0rÝ„¼¤ô8(åZ“ñ0ÿañï^\j”³Oa¢¤RhØ ÑcË)ÊÓ7!EÓË0!»,*¯B {Eå2µaí•âDFŠÇY–"1Ò[EËbÙ厱RRDˆ{Šža sÍ+Pêa7´}¬Åç=W¬ÀÓÀ('ï¨pÔØ»¿Eœ=),0ò à÷½ûñØ(-Eç<õŸá¨¡Ÿ| .F`üÝpTD®C¯Ò ~¬†…[uSdNhÈê)ÍN0∿d#œ›äÍsÆ$²áÍ€;¦‚3¯ëÌ8bÇ{žEItÇ›LÏú”(Ó*'ïOê©_MD …á²ïòZx™yÏ)Y¶Ö[7HÉÀ Ù–Â’Íæù',:Ñŵó±ýf5I{8ê:OÈW&§°5ö §Ô="8:ñÕý‚YU´œÐƒr«a(ÝT…”_m§¢. 4¦i¡(ì÷ &Í93ÕK†•Ò-«ìxµÇ9¸òÀYà JÐÅysfA*½‡‹¤áðL\”7`ã¿#ãéðóXòbÙí^XÒa]Ë@ŠWÞ?StÍlçÙõœTòªi…LROo¾û œíÚÿA×bQô#Ŷ?ŠwÁGˆ%pEìíØÃd²Š/æ&Ýåê1–ëD£oÏ|™Àí¤N€îÿëê±2nveNw¼2°mJB+§†^5›'•×…,†2ÐCª·ÍXÄ<. ,¥ºÛŽ3ç2Bé>f9Í´}éRù¡3l·ô¬Džég}.hRNJnyV43×D¤AYk/2òd¥N ^•ÆÏšŽ$SµZ"é^"í áN]S}uÎVB÷Áׯ­J|¡á¤f0 X Õî'›*â_ì!Ï'q8’âPò…±äSŠ‘Iô*3s£ÿ¸°¬ç?Î)ßéRãÍÑü!o®x3ÎÊAPÿ²1~¯>%‹5Gr’èÆÂ‰’×%=óöGÄIt0bÖk±$SFO©J–"‘aÊ _çŠ]—’/@]B‰J"DÒîu½Ä£øad+mIàÂiÙŠ‹PRY2gØß±ƒyrèQ¸!†3) <¥ãöÉN·G%M-+Þö»²›…â-%Y6, $Šs곕ÒðªÒÛb¨áá†@`Qq”JœL;@Y‚ú E?¾Ÿ„¨û+·I]Õ+ðÅgò\°|)ÑGí(˜¸1W]å8ަÈbºaÚû›ßÓmïîÛµ°˜Á³š¤Xìg^j¼À¹N)µØ0•'’‡SgÇÐ/Óf"W|Kzý\Wf"¬ö¼‘½ 6ÀüJ)áSªtÇæsuyjþuø·=9W˲ùe…è®VÇÒœÎs_?Ü]ùv(õIˆJ:'†§Ô¨uÙGý|÷oÓ¼vœ¾­½>tóÎd$õSnÔŠ÷ñóáé‡Dq>cnÕž¹¨0®ãWÀµó;\ss †úЏæ)5jE]ö1®}m ¸ææ¤å®yÊZqã>2Ί[¬r¬ž¹çôpÎÌÎÙ)ê+àš§Ô¨uÙÇ8§æç¤×‡ô×<åF­¸qWݪvÏÆÇj"`UÿÌÀJådÊ›+SXŸR£VÔe=¬t!g`¥ áõ! VÍSnÔŠ÷‘VÒÝ(¬:ßzXi1†•–s°òTpݪàc`4O©Q+ê²Vº˜ƒ•šn%š+¬Ô¤¾7î#¬´½QXu%k`UcX•bVž¢­[E{ Œæ)5jE]ö1ÀÊTs°2Ó CsŃUó”µâÆ}d€UYÞ(¬LŸ=ÕÛ=6ÀÙj 8WÌÎS´u«h!Ó<¥F­¨Ë>ÀY78;Ý04W<À5O¹Q+nÜGÀ9s«€ƒ­ñ®rcÀUÕ àŒ§‚›VAæü”µ¢.ûWÙ9ÀUÞV¢*}À5O¹Q+nÜGzÀ™!èîÖ§¬Œ°#Xáæ`å©à¦UÁǰ’=†VÔe=¬Œ(g`eÄt+Ñ\™Âêü”µâÆ}d€•T· «Š VjlÍ7jΚo<Ü(ßš~JZQ—} °RsÖ|£¦[‰æŠ+Õ[ó‡Vܸ °Ò·jÍ7’ Vfl³7fÎfo<Üßf~JZQ—} °2s6{c¦[‰æŠ+ÓÛì‡Vܸ °*oÕfŸÄ“¤vlç7vÎÎo<µÝXßÎ~JZQ—} µsv~c§ÛæŠRÛÛù‡Vܸ u·jç§ø+lüb€Ë!ßéö1ÀÇãàèàΤ^4bòŽÍ}Aw.\ئï”8Ö¸Šÿž@rAøØŽÆ#è >s§K¼27jØš„ß³HÑô¤¥qc΄ƒ›Qx‰½ÁýˆD‚߉ËòæªÝqØsDñu¹0¨ÒÈ“’@cZpÄ ø‹…☘Éc:ðe=EøcV씑&š7 cóXÊE®“2¦Yˆ©DŠXÔ¸2‡9æõ×½²ðP{P2…´dË‘)ãÌžSKlŽà!bsw^ýñ‹$Eî$Î"múÙʺ‰S8ï(Î%‹s¢â¢8ÃêRþÙ´Ùf*Ò)K šxåép„tH<¯ä#)uŒaüqö?ä ˜Î–v7ñ¿9«ÎXÑŸ”âLÕŠh¸Z!ÎG3ÏÃt(ÏC5ÔðxÔáY®Ã÷¥;;á;âß ÔÙÆ+çØ'Ô€Å5 ˜Iÿ~8E€n7´Y!YÌ úê²PjßƘ+Áï TùÅuÝá—’êlªƒhÈU FDnmòƒU²(øNñXQ4lÂlc\c‰g›‚xÌ«|PÂ)­^—É¥DÙÔ*HßË·gÁIÃÉÞí_µ[Ü5USŽ´¹»™3õ^¥Aˆ%/6»CD2ïÍj$¤¥#Éþ”ր̜¾œ÷ü0‚²”s0V&É+íá Ï ÇYàðç=ùKê ¢'‚/[i yÛUy½`þ‚Ïrùàb@±õÁÏ‹¿‹àGrFä•7™›£æ¥¼E$ªNf›EŒ=]FJ­ªËCÿ*µ5E ‘Ê7Yí®÷[Õƒb/)ùF©ÂâH1X¼( ,Ðüto6r­ìÙŠÃçð°dàÓjq0~Mc TN//åôã÷lØÌœ@Ùþì2¤hdÖìYÍȵÑõU^™ÎQ=%0ë˜ýB6½Åy7l7‚Þ*„³Nš'^’RA⚃nRZX­ž _ódŠ~º†ÝÄb6õ¨Ò~Ì`®š²7ÂÏ­j?ÆìÆ(Ç„’?W¶ü8?N% “†™éîxÏÆ–-EõH]D“RÕÛ½ñòjûÛט&°EŸïx^@Q€±g+J®³K;ö`ˆPg.+‹Ö?Çï5{ rßÏK¬`ÏnŽ;«š ¢ O=¾w ¸P[ÚÚ ¶fMy’gKÅåöP«ôït:·<•^®-×Ë3êG-arnlŸº/EºXãÐÓE‡UßÒÿÀŽKb« †üÌgÜ|§[ "êÓí+l©€kþ®GÜO4¤žN   ÕÓ»½î3,ã¢úét‘(zw¼fžxéú£îÎõšGqóx•a¨À þ ä'ްt¦ëüÒoŠ~[¨SÇ9×-ƒÅÒÉ%ùqü|ø?¦.aA endstream endobj 5752 0 obj 5150 endobj 5756 0 obj [330 /XYZ 31.5000000 633.500000 0] endobj 5757 0 obj [330 /XYZ 32.2500000 632.750000 0] endobj 5755 0 obj << /Type /Page /Parent 2 0 R /Contents 5758 0 R /Resources 5760 0 R /Annots 5761 0 R /MediaBox [0 0 595 842] >> endobj 5760 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 5761 0 obj [ ] endobj 5758 0 obj << /Length 5759 0 R /Filter /FlateDecode >> stream xœí]Kä¸ ¾×¯ð9ÀÖX/?€ À<ºä 1 ääÌf,²‹Lö¿WY®ê¶ýÉ‹”í*wc·{Jm™")¾DRþøõïÙ?Ë>|þúŸì›ÿùùë!?–.o¿²Ó÷o?ÐÕÑÿž••˾ýrøž}?¼^šÿ?´|ýüçæ·ÿe:ûSóßÏÙ_ÿÖ|ø£ÿ£Óür(UÙüü÷ùg]ªæ·üòóôù¿ù]öëiÆîu˜÷ÿþÁèÜšüÆÄ«¿ºeªó÷oß~=|h÷–ÂæU‘gÊ›©Úêì¿ÿ8üÔ¼ ›>?ÖV©²°e~Ë‹J}zSmëLé:Ï\9xÏù›gvÅ?¹Ês'6y 97R”)TprFÊ*e´e¯³KPVU•àä'È…(‹'?V…ÿ‚¿_]Þ«ëcVU™¨´PÆÙ–0µ Ìev ²[+ÈSgȹ‘Òñœœ“²Í  e/³K ßÕ‚ls†\вprNÊ6³xô#€ ëô“—¥ ýp†œ+mñìÇÊeJÝlë†Ð'"»ªÒÍï¥ñ_·­«2Ê#Í µÁíh»N/0y] šgÈÙ±ÒÏθ›u^vØoþcGÑ›é&×…œh!gÇŠ'n`vNâ¥å”ðuv ôÛ¼›ü ¹Æ“sRÖºZ²—Ù%ïœd›äR”…“ kàFÎ9Aj‚q]Ô‚¬t†\ŠÚýÉ_b&Á´Ÿ€¨ß÷ÀƒŸ^ždÙëO `ç¶?^9Øæ§8_é²×³ß7ð¨?d¯?T~,JÕ||þ»v¤nGÜ1¯Í)Lzùx±GkÚðéuäSûŒî†®#Ÿá3îP?ŒÏèEu*tÙg7ò ùXÒág ­9Ž,«U+IÖãþõŠ|AÍWT}«èn•É|k8°—áBÐsXìÌ.Éüc5’·x°’bEI*‹  ¦EB&e …Û4T…DÓÊÖç# 3/6 ¯%9Uô=¹Ÿb^ „K9ò0#lEok3 SY•|v~q¥;Žöæô˜w‹úG>¡U¢ ŸÉ!Þ8±hÄ~D#ÆÅ¯'0!À# CðG>/ †#×â™pªqúºW¶Ûg,o &™\˜eà1èÄÊç`Õý¥-od$+A òæÜðÚaPÁß‹É:£œ’¤ò}oäE¤lã…¬/¾TÛð‚ÊË‹>tHÀÜWB…¬™¡”îáÕ3Wœæ©¡.ÏãgË¡eà‰"zQ÷ñ±ÉüMgɲ¼.m_”¬ß´dycÕl–¿W—NÞ?n\¹–™‹,ñ¶Æåh™A«ÍŠž•dAI° !¼¥„dJ•L  r²xÓeV¥\Ï Èâ)$É|Öõ‡G™jyIâ›7'S\ZpôÔá\$¦ÈŒ×Sc=Œ ˆnæ´ÙMõƒ œlñ& pæ³ÇQ#"Å‘ÚÇ{›,ßy©ö”þ ”3äå£Ì"‹5$:™B$ÿ1Íç=ŶÃ%Atµž^t€:¬½f˜ßÃZô€w¥–¥µÑb4Åî#¥ºS$ ¶N(-kõàjÄŠ¼¡)ÌšQÅk¶’²{qHŠvÓ‰àÆzØJ1(«AÕ0ïN¥%y»oÄôº£JÍm„N©¨ Ôµò%°ÏFÑx„,˜}‹Ç âœCq'3–ÙF”À,K%Êò±â€8…J ~Ìñ߿ަaž™›¯×Vm".žjž¦*6J3Äœ`á$÷¬¿ýVÉXý„€p YE`ÁF©Â§XMgÓ‰·|*O©¦ÔÍàÙpw»åM”)i#âk¾D¬¢¥#F²9cµê!ϵkËx„é_>C©Ààj \£€38³UÒ<«ê²Ï´k‰L ç(šá Ãq•ØÀÔd ¡vâ,o*×£JÇÇS6m0 Þ›$Ù~Öö™>YVÚîl-uDÀ›ëEÛToÉnRÄË8+ÄV¨3Ø#”ƒÝé…²>H£_a‡«Ø àE<®¼ˆp¹/]Ÿ`B_L( <Š}È OØãÜ\Äoöõ×ê‰(\T»þrÛ14¹p¶]€çF  Ž`š«ìTQá~âH>ܯõ…¼þ> ‘Ã/¬ÆY;‘JTÓÆ8–¬Û#·E"îÔÌZž3Syß)üJS™ž\ÜâŠâØ3“÷b£ãZ2þ]»W’Ò[ð¼÷SZ?ÜQ_@¼4Øírþ c—Îöñ±÷–á/Æ×ºåŲq(†áúƒÝwS¿ð´7—™*9â½»S¶¦ãáÝŸ ­˜-¤°oº¨’ݽ§9>ÅòÞÓò<‚ÿfòþ¾ØV¿šõ…Ι@”B#Ê€Y°D©¶`Õëüú–Q<˜Ö‡•4¢éŠEo»GÔèÄìØÅ©Ýþ•²—/ÙMÕ´)@uVQŽÕLLñåƒdï-~̇{Ê 5k»–dDH[<-|¹@núŠr÷óUû‹à­5ìX»k,$i;~ÑFûÊêr;Úóe×Z3fŽ´{¤8zñ ZøLžñdÄó”²Ç'ªÑˆO¿ñò©<ÖÕlؼ´Y†M=AØ0>q®'vð{xëvé°¯|Æïy­†šro`=ø [-- |HÓÛ)"œ(' œ(Qz¿òÞhË[KÀoå÷üFR’L?/"¢’ y/'&D[HfiâVÚ$_›àrâ¼ñJx‘—¶”èÅU‹ð+)H¹¡X·b[0OÆ7}ÕÍU'.vQ;)……"ÞR©ºrÎghRûx„ôÈ=©ª™ª»%Ö`/—–áhŒŽà" ì±fƒ#6 5Æ, ÃëÑpÄà•b줂v­jÈ8ÚC‰xQÊ,ñz(¥rþ:ê$ÒÁæÅ$<÷F“ÀzXe~ÆQpw-[Db¿èKÙsª –m%c1®`„ï!õ`ƤHó$uÆ$å”n(•ì‹«¦x=¬5á)szžæ)ê b> Îð{ðÁ+_bÕD⊄ªÉ•]˜dª©ÐõDÊ”ÜÔ…©`¬½ #Re–¿U9F»|ÉKCÿAèW}©aâÓƒ½†E¸¦Ä' ]Å{@—C݇ël6î…“]°ý‹­B츋o;£ûØ¥äaS’ƱòÜ#ÛÛ‹l—ÀÀ6[°ÜæŒ[à‹Ž©õ¤¡p]OS˜àãI¼nLûÀÙö¸QÚÃ)!Œ$ÜWšýälÎn œ~,äZJxFa)„ó¤±DÔ”Ùp /e°§tEbjíáì‹}9ö Îùçå¾mîçåñ–`×NK«kÿnܳš«Û 3–MÉ0„NéÖJðƒ#DÄÜ‹”Ò'u>°Ã/¥Ÿ[ªp™Lî&Gôt‰Žý&d$>¤Ü¹²ç* ;eD§*ºô^ý}‚@ÉëÙ@ fìB½f*ßRc›—@S«Öí¡T•™¦0®SMd³âhe: 嚄Ԫó.=Äê„oÕjÛØSÜåQÞ%ò×-kTjíò®¶3(¼Iy‡i¿ay纓-Þr¹õÿuC•n¡„–¯¤\ކ«”®ã”ÛC6˜'¡\Ÿ²‰]¢}W½µí5®ùÆ"P¼õùD ¦Y{A­'ì²{y%5]iúq•ޤݑÌÚ9/° ,"pÙ½—l“êûYo_Ûí§€-^ôÅÅZþ%ïQv·¬è\Õ}núG¬íOIb`XHP:Ìjï¡4€¢@=8£tÅÂKOTb¥swf Pô»ð™s@S Llá)”GÜ{ÄZ…E2`ö–¨÷,uw}[G·÷нÙÏ÷+2ÆõeÁKIa„î!u=€1jÕ|ÒQÀ¶(›„‹ë*ÓÃx ¶ƒRo@8_ÔlUø‚5›ÏîõÚÉ=%k{)YZåvz›îEvÛ-²ÓJ›i ïEv{‘ ÷jšûÒšQœ´‚â’µ˜éQë1x§¯×Ûlkh ¬I˜r¤Õœrý}§¯ºŒŒR¹Íþ@ûV!ñнu/¶ßÛT‡9vÍPoÒvXE ¹Ö—†{Qÿ®é4ÝâEðZ×]ïq6%¿‡rï)K4™ùZ1Å Ä)K%ºB9LbM ¤4ù”¾Bi›™aH!\÷åëž8‡œß矼&1BŒ½Üp°¸#húMF¦ÆÁ¬€ïͤYw›zm.xïc¡ÜRBº :9¾¬tLé°˜Kª–óÚšKœD¸kNßž#%&IŒ®r4ª‡yJö†SÉ*Dzî­í‹„Ùöâþígí!¥¿ŸµKpŸ»vàÃN¤Ô\Ôùn„oÔO¬%×ïs•{ÏÐô’‹\s¨Žt{öã„§æw®d.Žˆ‹áÚ7\æÍx3úCW/.Öœb5ùæ¢'оžÙ3ÙÇmÊââãîÍEódÍö¶i=Z•®"ðX¸ršÂ›l¶w‡ÍEuQv—Uàðx²6|¥¹$Ü'º³4`£bÊqÝè0%Gȱ£@¿p@\þpŸ·îTä–QÒýîŽÁ…+–‚ÐÁ1e]öÆÏ\£€ Ki?Â’=³¾W7p³°d)´ïÿtUD÷’ˆÆÁO$Þ èÆmÆ(ʘ²ÒT”£tƒJ”¸Çm6ß'€rcÕ@ˆlfRì™p­Qš>r’ùÍž½Se¸Mͳ¾l#?ácŽÀñ oðžÖlÛ!¥â‘)%œ îå0N±ŠÃG¿³Î4šïì{zpe/S0céÕhK·FeæêdeúÒóUAµök9Â%­i£úœjðv¤µ‹áˆOˆÕGo½ î²/è=fJ~ÁöìWŠLB1´}a‹]‘b¸@Ï8Ó»#ËPx6øŒ*jéoÒ»¨ wú½¸#4Ä&'fñ€Y3.¤„‚F3æ…% lºbØ(ÛRœ²ždØÁïÁx{B"?CÚÅx=ؼ™pÓ¾+ssô2{ÞÄ#êÏ3©˜^²—ÃÿUI« endstream endobj 5759 0 obj 4357 endobj 5763 0 obj [331 /XYZ 31.5000000 344.750000 0] endobj 5764 0 obj [331 /XYZ 32.2500000 344 0] endobj 5762 0 obj << /Type /Page /Parent 2 0 R /Contents 5765 0 R /Resources 5767 0 R /Annots 5768 0 R /MediaBox [0 0 595 842] >> endobj 5767 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5768 0 obj [ ] endobj 5765 0 obj << /Length 5766 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àôˆ/Q‚³óCc ääÌf,²‹8{Èߺ›Ý¶%}”ô¹HI=#kÇtóQU,V}U,¾ÿã׿ÿü­xÿñëŠoáûǯ‡òè]yùWœ¾Þ½ü…®áçÂ×®øöËá©x:<Úÿ>.øúñÏíOÿ+tñ§ö?ý[ûËÃþà—ƒW¾ýþïó÷Æ«ö§òöýôûþò»â×S×áÂd^ÿÿwF+[ªÓ4F†~:\—©Î_¿}ûõðþB€y£TV×¥.”5¶PÕÅÿqø©àÚ}yl¬R¾²¾|Ë@^ßFÒMKëª7ÎùK¦w•¢sïv~š¹4Q”©T´sIÎ6¦ ä1&ž»—ïÜ”UB¹9Ï\œ*WÞâÞµ5Êxíì‰Ñ'&»ºÖíÏÞ„o#šRöB4ç°äÖ{ ~+ŸP˜Î3—&J`7î\p+­uBÎÞzOA|í넟fžŠ³°sIΚ¤JúE÷ :· •ôeæ©”t¤÷ÔJÚ%UÒ.¥’v)•´K©¤aç’[¹Ò&§Mž@ÏÝ'èÜ›*]ç癋SåÊ[Ü{ê­ìë:¥î~î>AçN¸—Ï3O¦»qïǺ ÿàÏäØu;pûcK.«ê"©GnË:ìEïˆÕs÷ 8ok“Nf/3§J«~ïszÁS¹ü FO‘þðxxÿ¥•·–˜UñøS;¹ó˜—o-Q\ñî„%W<þXü¾’ûCñøó¡9VÚ]§xiѵ(‹ZÊ~¦‚-ø3Ì >ÍŸžu¤å3lù0öYéGb¥rûbÌ98kü™È O –*L¼Lk87…[`oxÖÊæ#×¹v0ž5%ñxÏ}!8‡gw0žæB3Ÿ:¥’äÞYÎ ·ÈêQ¼<ƒOñ‰¥ÏöNÍÏíŸü¬n]‘1Ibvà Nq¨‰7zŠB–áNÌ8Á"²Lœ,ËŽ¬ÆÏ%ñðü`$~Í+ÈÁ&σ­¬FJG7@AÛò¬ ›²¹y%®¯Üy>]ó >ÖMÙi¹lf{´æ’ÎðLÂK‹RGg«ºmìªw4ºV¯zS£Ìü²×Ï”°ÓùÓ ³ÆÃ³P©†½áÉúÉË(-$ÎÅ0WîLb6Ø8Îtöà)©Ë1£ÌUd&ÈEP<½Õ³3¡7{‚û˜=ù'­Yg´ë¨ O õž…zÏ–to u¥©MgÕ¦bõ¥ +#VX,Ïp׌`Ф«O#j åqæU‡E–9Ï ó" ÇôøÐ=🊪8<%û9Ÿï×Tæ*wှã'GP8ÆFÆ8 ã[`Óúd£ëÉÃáZs˜ð "'>m2á*–@9#È(äpÄÓÀò‚e Kö[°·ù¨“CúLK£qéc(Bì:Ìá5{Í«±Ýf­ÇQ‹åi½M„"Â×Ã.&è=A[µä™©i2Ë⎄—;ÎZ«›DÂïMû.›²éð”;–yånRhF1ÓÂqAzæu-%–¡/úE•ÇÊ«×Ð8&F• @¡²) Éû¾©øƹ!+#PDFéa ‡ÙãcàSBd·ÈJ»ÀjĂق§Ô Œ}Êg+ëÇÍ,è–.Ÿ|Ƙ?x=÷f–Dh@˜s€Y‡>ƒç¶»jÙ\5 Ó:SEVŠw0“¼‰%»‘DŠsDz¡„`º­ÀÑ¥~=ä làÉZ½L±gÁâ€,¶`‹¬m›:-N{ »A•»5ü«1ƒ©Ô.†æ¹pˆtPä‚+‘Pu/n?ð É|qFwÇ=óeÙÌ£Ýõ†¢Á†06è°ÇÜ)$ÌêˆËŒcD¶ãtD"¸…¹Ã8ÆÐ1˜:Ø!Â7¬°ÉÁÆidzÆÑßmƇ0Eñ>Í-Oæ6“©ÑÛŒžÕS÷r»‚q™±Ö5¨˜ØUßÅ>4¶6 G2âúaWS ±wuQa–{a%4Ãl!ÂvØOÀìÏiš={š½µÕ©1±ñŽSjrRÑ5›–8*ÆšÉxÑ¢ObZXû…éÍaã]4 «,ûz\ƈ3Yó;T å1ñ¬#5|rr«¹æ¾X-5j7y§_9G¹ð=-`VC`Ùdؤ{¦V¥11‹Õ¢äJùÎòîÔGH(!º´“E„ ¾2AkªzlÅœAW¢ŒÈûbý„†l²±qÌÒÙ+Nù"Wk td~ús‘ð&2¢dËS3צ©ÈÞ ˜ÖøÖ<ÚÇÛ½—Ó±T¤p†â Öü…ŠfQàê"™T¶ –2ѽÁ” ò·D ç󉊙uH0ä*L×…¶Ã†äé<°åí.r¸S{R<Ö YC-—EWÇ`?¿£ ~¦AŸ n{{€Ý~£a/a \G²”=OÆ›ºó™ $³ ~ÑPo%j‰¬]ÁÞ ð8ÁVj©Ð ðJñ8Á¾OŽÍÛÒÞR RølCZ(0dµ‡ïzDâAXôµ)éõ›. hÞT!u IáÛüEˆ”þ¤rêR‰øha‰RŸ3ž²•¹d@D×"Oô2oL,öbŽl~û¹rïEŸ_ΑÂÝݺ2‰¹¸öï'hòa©a®0F4ñ¶ðU”é©”3î$D ýåŸ=‚F‹¬ÃGñ‰€<²A+ÓëÿGÈ5ã|c@«LŽìÝ´è½H™Â˜cRðXktÕµHá=)ƒü™«µmºî n¡€LCÌBÏ0yùÂÂ(jÿ­à¢ã÷¢“dïÊ c]Ê2ÖEsÙ·~Æø”ª*DÓ9±É™*Ê!¡x’Ë×NÈ)eu‡UÝϰz$Œàle(fĺ˜w¹DÓ$g\–‘CW¤ö;öè±43•7Ë2¸F¸B>uK`²£Û‚Þ@ÿ€Åëg(ÑÚï<|â~™Ë•„'aÕ; ÷÷¸3kïØSôî·f]ˆ\I­ŒóC#× ð ˆ²o85’äÎTÅEäˆÚߣ—çqh)a60n‰\ýa¤ 󔸋«0çDyÊȵì·ï#î>AC:?J‘å5¤%ä_¯4ÄãÛX*,£!q ¤(óÞDÐy$ÉWã;kÑkV‘ªD%ñÑ+ƒyèÛ¸7ЗâI¦kl¸·Œ—ȬV63}#…s×jT}xæ|Ä…§sòÞ˜·ì|mW”[‘w ðÙQCéç›u¹4”¨ýoÖEl\ÌGÑ“†²¥ YèÜ–·"ö7ñÚTÄsb^õê˜òèKU¾*iV{5NyÑ–ÝÓˆÖ‚Z¼ºVYZ)!;9½-Ý$²IeÏgQ‹Pø!Lgàš­|‹ç–iŸYìÃg´ÿMÙ¬fÏP+º3²éØœÖufn±‹¨Vw{üi›ž¶º"º˜°+˜˜å[ˆÆ72{Qy$¶z ZÌ´8(—»ÍÏÙük·‘M1—E#º)o(‹:mëµenœ?§%`õ[ìå-H­4B²#%v±—ÉœÐXæa©Mj×1‘"SˆZO&¤5­ïÐêjÕCní+†ÌÌmÅ»i»V—­rcöÞâçÌ:2%l›[9-(§r#EÂó.ƒÊb8ƒÉËÂÏK3\&Ó™˜ÁZ6饊‰‰3»ërѼiFv"¨a1´fòz#yK„ÄG€Õ´)û[zb·ª'œS&7æ¿æHfd§÷a¨|~Ñsj™Äëð@œË[öŒ T$â/2’„56Ô˲12æànÂ- Eº"«%âíáqlÆ}æ7_ùnÐÙ˜L$7¿aºŠl×d¿ÉÁ´07ÆrֲзR¹cLÙö=áSè“G¸ß§Pñœš§2¹ã+9‘ÑÊgß²È(DvdT:†·£œ;Ê9BÑåÜQÎñ3§Î™©@Üñ“½¯·#–$bÉÜ‘Ý$ÚMU¾€3X;ÒëËܱúéݑޑÞîéõ:{¬1×Þ\1fÙMÄ>^ *íWñÔŠYT Æþ`BÑÎzð}^eŽ¥:Uƒ?¿×øÒ®*i|™·¨ey±wõQŸëþ÷ÏûªßÐ=ðŠãeCER?¡qÂŽÆU‚‡æö%¬´W?`Œ¸N¬}žR '«ÂÒû8jؽ‡--CáÞàg¤f-ý…ë Üéçòöø§†´ÃìÄ" Ý|°ìÐó:ŒîqsQáÒØ)82kÅÁÆå™g£0Ÿj¸¼R> endobj 5775 0 obj << /Type /Annot /Subtype /Link /Rect [174.750000 149.750000 202.500000 156.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 5769 0 obj << /Type /Page /Parent 2 0 R /Contents 5776 0 R /Resources 5778 0 R /Annots 5779 0 R /MediaBox [0 0 595 842] >> endobj 5778 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 5779 0 obj [ 5774 0 R 5775 0 R ] endobj 5776 0 obj << /Length 5777 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·X 7À`mr H@A'0l#Šùûa7‹=3ÅþЬ¯Šìj ͨ9¬åÕ«·/oþôùÇý~|óîóŽ_Ý÷wŸÅ©.‹þÏñüõÝótsr?ë¦<~ýõðíøíðéð©û÷Û¡áó»¿t?ýï¨îþþ|üÛß»t¿tþ…_µª»ï¿\¾·µê~*®ßÏŸÿûð×?;8Lçóòÿß­M­Ï˘˜úÛaئº|ýþõ·Ã›q³TÖÖÖ•5Ý?­ÕÇÿþóðS7Á0|qj­RueëbÉDÝ¿ÝLES•n;X—f4ÑåKfx•`ðÆ4鿬\*ÊT*<ºäá6gØœ¤«*ü‡áÀ¿Te™s.ãJCe8\<ºàá–ºQ=€Î³ÊÃÿ:|ŠÁ+›pðËÊÅ¡â70ºäáÖºu7·cò ºŸþU¡LºÃ½¬\*ÃáâÑ·RÅ€ýÝ_yø? Ÿ`pæ÷+‡Š;ÜÀ触ràÏäÜÍybÓtಪ9&媲qâ.S Õuø'ߘ:Ýà—•‹Ce@«ÑèŸbFÁKé?êÆ·À‹o¿Þ|ìð­fuüòS·¸Ëœý·/PÊãwg£lŽ_~<~_ÊþñøåçC{ªt9,q3O*ô¤øŸ4£}øÒRrøÖõv (ú¤Ðð‰‚OÞÁ'oáxöU€£Á' âKñC<^ª–€øŽ1ð „›i3ÞŒ¶ÊŒ±æ}¾Ý5ª\¾Ò¤'Ô‚ Ø¢ß@í]gUœªZ5uù ùÊËs*;Þ}¶Ý==©/OšS§_öðô¤GËÆ§#·~µÇm{²¦7 ú´}Î êíüùzÚPžL§Þ½ß@ÀÕ+P3L4gm¦[øNWmá;#ÈâC`NÆl¯ b>Bâ#Åh0žoÉð4¹ oÆ)ݯ@©nsn‚ìNñ-ýÁ?ùTH™ø;@L?fǺ+Àóà³MqN 9UYÔ>«Â¯ˆ?EÇ…ãn<<šÁkcöOD„êPat§"Xý$ý´¢:\«Qþ¨ <>ï¿Â˜ƒ©1¦3˜2@jLÝebw0ma’xbÌ7(¨¬/o¢º6P{`ñ)q;!»iíˆÝD)™û8šLfUcZKЦ€l‚7ÈHa˜G2´)×U"¤½€2ƒ¯#ã炵(Ö?˜µ1tÞŒ!1b›,jbQ# \ý Eå§Mx­6mƒNlÖи§¡i8àæ€ÆÜ€› ¡9ÁÆÊ·ÏÄêÉõP. hFרø¿ ˆTjD˜'»Ü sã|üÍùf s:#Ú¶]rÞø°› žj`4è6 @ÒÅÝrôm‚v•ÀsÓ.æL0ä!&9=) c-Ä1Ëà ~‚©4Áë0•ȵ¤<X<9ÏS.C^¾µX $öÜÁ8º‰ ‚²0KÂm2òä²(«5fmí4%$ä;Œ10,xßNâî¡×m™çäÝJ ÚqéÈÔ“<+5úåM[1¬¦TÍ@ Ìœº*=+›¨ÕðzÅ!ü{öš X¹¬¡£cB~¤ZÍ¡5?ò+àL Œ®øaó2~o¯:„ 7ˆq6Â#lè&?pY“¾hH`ìJÉ™šÆcMŒƒ." YE€‰0·šðN0a4·M˜ãù´O½‡cn ±#­W•¥ ¯Â.l­µ¡ôßt‹p¾ãÑp¤ã÷K-‰L7@Ö˜âÑ›D(Ç=Ö7H"e´ö¹bñÁÐüw߈q/Íx²AE »ŠGË¥Eh¾ó/&I,{™E‚°²-Ý¥,ÉHVNXPå©hÍ ´¦ º~8Ó#ŽÒ[ôtQOs6»“¨Ú/Z%„¶RÖ7ÃȘ85Æn€×Æä1PÇJ¤pÞÙL:%pH,óý\9²T$0qDÞ-1q6!cÕ›Ïâs§!í=š½”º$¯ G¥*”Ç%7À;;€­K–lÙ ÙrzGdëÁ’b(úÅhŒ_S)¬wO–ÓÒZs%{Š&Å0iº»‰­o±ÝfÒ¿*ìH”pâmYð_Ÿ‡+±Å)kÊ5ÁÇ…dÝÊ"”QÿW™j9«ñ‹RóWg™wdØ‹#¦ë[æ="ŒáWTrr&Ë£"0]ßN’¸vZâÂëûŠ2:²ÆcŽÑD¹Ù6XŽpƒ%aÈH–AT.Ä—šâÊŒø,êÚÁWr.EØgD-ÌÕ³¼z¯¦°V„€%R¿‡’ÒVäUmëó*Ær&ì§}56Ï]›u¶ë‡VÈJðŒè%âV¾erSd!; ¹gT‡ù<~‘Á6÷Tjæ1*X3æ—z¡0¤4†ëLbU$cý­Ò¨!W}¯¿ÊúfjÓP«†ïæ×ÛÈb7ÆL®çUÕ+M¹¤ÂÚ^Oläë%•ÜrV1í¢óÞë‰íõÄ’à¥-–Ô¹Û뉑˜´×Ûë‰Oá~ë‰Y½¤BaNžlm½Æ¬ÍÐæl×Ñ‚”cª宣A+ »à>¢ŽVê%Z뮣-€ü¢úã9)s¹¨.ø®£»Ž–/UMßu4“vm×ÑTG+u7ÈÉ“«k½{¹Y'|¶U}-Ó‹‹Ýw»Þˆ¦’¸¯Ðž®1c_{´O‘©Ê}ù0ÇΓa®Ñúé“¢ØHÊ U{ ïAr$bH‘µÌ kŽsÕƒ5ímÙfËæÕ”õ`‹Ê‡ÇÝ]ëðl•¿½í[ÓwS4<²eg×W;Ö&˜š'‰µ3ò$U8‹É3%ÚðRy+¢Ej˜ÎTâ#‡ËV„y AQpßÊÄ…W{”ÖŒo“—%¢Éc„dJ¬ºÏèôƒLùUñ…“*Êã‰1u3AŒâH®ÅTGdÊX1)©°…p©ºùW—ѵ˜¤¨MtI/ëêZ°G¾ìE¡¼Oxì3€>3ì›ÓШ°×ïÎx{ºñ|r91©"rú£›b&¼ªè¢Fe¢Þ£‹zÈ›{‰6mÊ%}v÷è¢b.Jƒ—uµ/÷è"“öè¢=º(x ÷]Ô´å$Vlƒ'·Oùò9g½fP3 ÔæµÉ<¹æñî91AZº}§ín/àì+ÓìöšŸ¾ßÀà ܾ}¿¼á(ª°ƒÈ´ÅZ­xI°c tº¿Jž0®r,–Ä|î¡¿O«~´JíAÁ"­Úµ»ß£'ë7_ÌÕz|ƒ‘Tw†Vâ ÌÇ&¥ä?­òsÍ©~Ax×UÏÖ|gcwÎÆ„ õc䪾/Ñ+– +eV6IÑí3Sãsª­^Píþ“Yä^EB7>¹gH]ŒEP_†›èÚ›˜JÁÊEêˆà]f?sb„Ï­ßc§cçÉ.8VÎï_Ð5Ï?ùåð9 ¯¤t.kx‰úvÕ±]xt¢Ás;ÀÌ“6‡výð½qÑq1N3a¹i¼ußjÅ4€ãˆËþÈ”=iµFïLBû–î 52UÂyð;|‚ßksnÓ[§ÚNP¶[…°Æ+(>¢X›ZSMéáQàJÊÖ#ÈdÖsÞ(¿C•xTej¾Õ+Ð'.“ed}ó—¬]aíÔ…”y…ÏÛ²)ŒX)À/ ÄÊÑî)àt-«Úðx]"\Õ7å˜Å™Ðß\+k¸üçó!Z/¨¯OzJWœ8Ç­wZôŽqRѯ­?­Ð ºñŽ Uö4R^á‡`7VíŽ÷Öhð †úW÷ã®_}jÿ ñ޳LGÁ Ÿó©Eáv䤉9¸'÷ÅB&èÈb¯ÊUÀª¡$Üzvéˆ\ìÕÚ̈ZÇ;Ž( ÷ò$D,¦€/?j]}B~’mѻ쮪}È•ô+¦>£Éã»Aô0 <[÷«®Ÿg$ÊKžo •Í Ì–ƒèo*¢A%&µ‚©Ô€©U¦êë“æK¼ÓªDBPX;[&—!­±qy#ψ®ã¦p$<ŽÞ$ªÎ¢QMj¶ÐZëA*=+j­ÏŠÕÛ˜-¤`3!NÙmaÎÁ%ê檵D‰¢£mlÙ Á?#¢Ö_s„bÏ(IDݪژ¬:%#e°·™aô?bÂzwR®ë2‚aOâŠhaíšqÜB5"À[´êÀ~°"#BD« ÈÆ÷Šl#WÕP¶¶AL)ÌgÊ2¬~>kVd3®çý‚²ˆÒÎ c`ž¹EÁÎû¼l³vEÁlU=ÿ`š`ç%¼„ý$ŽD »«ò‡¹:¢Wö’ ?Äsjaãçêµ1Ú]MÔ˜F_’Mñ¹;Õœ‰Ø!ÔaÊù*’eÅ—w (£¹l¹óÄÖñ$Œv¡­j /$Ì×u¡([8g3&HÜx’>@ÆUë{¶ƒô%ÚjT×z‚$hlŒ$b‡™P…ÙˆXh*k“¨b^îÊu–)F7Ó`ždS÷÷ ”{JØî*tDÆ¡Æ8ža“Ñ)ÃvZƒ³õeQ«•m¡ˆDAF„ç‚ÒÜBÎãW+ªÇ1l&™ 2‘ˆhR‘n[”zIDÉ®Œ9,åäÕ…ÝN3د-HE즔d b–a›0bfÉe‚û"bŠÒ3ÝVû8"ªceS Ûq®¶kiëPbk¡Æ¶W>#Ú‰úeÍ0&ÌK²QJ{ëîêÞÉVšë”‡Sõóò†LÔOj=Š$Þqmn½ÓÂyÞ —mä„ï¨ÍãÁw†–0ÕpVO+Ð×äÙVG»5†5^uOVª“¹`âs¼E£áµVw:dGFÍ÷ƒW`à]ÎÙÿ°ÒCèF ~®k€kÃ.þ6D%ø@/¢z| N†®?µŸ<'\¶Ó'¼ý q½/‰ÎOLG2f ëmt>«ê%}Šp×F]£1°ÅŠ@çU¦û{aaÀÛ„a€Ï‡‚ž‡èb6¯OW÷uüÖ!zð|šú…*Ms3Iµ“j u6%\ª ÷;RPsé×]ß`ú=]Õ'Ý»PG<µ?qÑÖ‘½%#½Gó˜)ùÖÚ>º"k Võ­ °vp£L­CìƒÂRÚm(<|ÇÉo*jëõÚ²wþ¹[ñpÐvø81 詪 ·ÐÆ@€PÅçŠOBAå? œÄ…OÂ@MÙF“c£ÓÓì àáo¼còqëÔ1Ìáê–GzÒÂBEŸ×`/~]˜“có(ÀäÇ>§XçñÓáÿfuâ7 endstream endobj 5777 0 obj 4572 endobj 5781 0 obj [333 /XYZ 38.2500000 367.250000 0] endobj 5782 0 obj [333 /XYZ 38.2500000 367.250000 0] endobj 5780 0 obj << /Type /Page /Parent 2 0 R /Contents 5783 0 R /Resources 5785 0 R /Annots 5786 0 R /MediaBox [0 0 595 842] >> endobj 5785 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5786 0 obj [ ] endobj 5783 0 obj << /Length 5784 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·Å‡D Øžu€ <@A7›`‘]d²‡üý¨[RÏ Õ%}S¤ØêöÀžñ°E‘UŪb=?þñÛß÷ÿümÿñË·ÿì¿÷ß¿|ÛWÝŸýñëÃë_èúÐÿ¼wu¹ÿþËîyÿ¼{Ü=¶ÿ>ﺾ}ùsûÓÿözÿ§öïÏû¿þ­ýåý‡Žøeç”k¿ÿûô½qªý©8?þþ_»¿ünÿëqÆáuýbÞþÿƒÑÆXs\ÆÄ«ŸwÃ6Õéë·ï¿î>vXö–ÊVU]í•5v¯«÷ÿýÇî§öÃôÅ¡±J¹Êºâ=/rúø¦²®÷J7-ØËbô¢Ó—Ìô*Âäµqñ&?­\*ÊT*<û¡¶F§K{DôÉíguû³3ýŸ÷í«©ÊhM „¿L/?¹S-P¢!ü´rq¨ dzGF¸ÓºŠˆðWÓG˜ÜªˆÔtZy,„fð²0=ÐÚ™äÁö2}„É+á§•‹Ce@8ž=6«º—ƒM%u<)ë\­"ÓqåÒ@Ð 'íº)cï—éå'¯ ‘–N+v¼G³?.™/¥û ¸U<üü´ûøUYÕ³Ú?ýÔ.îôÎîÛS ”rÿ¡U<\»”§÷¿/ eÿ°úy×*]Kœ) ùGøž>£á3ŸÑˆk³Ÿàl?À‘ h¼ø †0À³)G`ï¯Ï&‹S 7Œ9ü ¤ÄÀ~ˆ³`¾.ÇO‰aᆩ×`œÂUk¸j]Â÷`ttðÃSËþ¢s.Õ o}HøVS4±:9’f¥¥›¤LêÜŠÎàjÄI3ŸÂ×UÓ²s†ûaN¶>ÏÆJh,ƒ°LÅ+Àò>ÙNál™pÌVG†iïtµsÿ€®*KüÌ`2ýC3FÍÛd¹"ŒFÇ<#b‘ãË“ÒõˆƒðÖ¸ˆœNUû ÅçCDå…kë\Ýl’ÚeYgLzÔÖC¶QW%_å¢ J©ôø´!l!µb. ˆH¬oÉž±Æ‡Gð~0ÚœU‹±ý+¡ƒ˜Ñ,×6>Æó+Î|»ê,åZÙ”ž\ËèòÏÜ9ý3Þ¸,p5ܹÉ9D@Å‹ÅDLX(‰ŽO@*Rb‡ s(EÎ|ÔÄb1²Û`ÈcCÔ€Û·¢²räÀþȦ•b0ξ\¿Æߪ}«/¿×€‰«besaˆmªS¾j6Õb| È säI5)¾I°)Î&Aâ‚)Âê)—/^£ ªS@AÂ7â=)ä<­•õ‰Óÿüx¾»Þ–ʉœÞêšD¨åÓežî§c w~nCë0µ¿q¬tP¨ƒYç%Ä÷²Yå“å s­Å& ¨¢ÚÇL*'WÆ‘5X°`"±š ‰ÐgkÑ)XpQ Øâ/¹{ƒ+j_D?Àœ‰*–‰Î¶³ÎÛ-!©¤Êƒjì”Õ‹7UŠÆ¼!ŠÑ\•Ÿ©Oó¯ØÏxDoÏaH À­·ƒ¹*†ñ9Åaš8“M6ŸHÅÊ9à#`a®l²¹,²·ù'Œ1ÈPhÁ×qLþ6ì)d{gùmš¡¸Aàr$šÊO¥ÎôñªB5¸l\[¤mW¨¡Œ¾3éÿšIp¿Jláb.2/«-°y—_q…©¦±•ª„.–Ü&ár=)±Užoy—­qíÝg€)ö>N™îd ˜s$ˆRz€È½”§r” Á˜Údy,8 ZL|–¨”Áês†—”ÃêõÝ,LÅ6ßàÆ·Œ¸,vA .sâ°Ïn\—"”_‘Æ@f³<ž f‘˜ºôeãId5ÁŸ×/) œë:õ§ú‚Æ:R;é¯ô0ô®Š°­¿ôYÐŒê© ýa¾É¤ƒ®2†q`®zT-7æ óV£ø1]”iÎM²Š1R/b§a5>.²ŒXWeí­3UñKJ‚oÝ—eYÄ´°jÑŠPžB—˜ý±4•ñ×¹ºPc«h”µ°YTé_-‹#™g…\ Sú´>?Œ_¤Úòpĸ\ª¯®ó " $öà_¢Á9yrЪÖ ׯ¬à†˜·b.Å9‹2‹œë¤oD!\ݱ‘øë$|»q£ 8AF8Ä ÎÂψuYƒ—˸ùj,SÇaÃT®È¸µ‡Hy8 âd+W\UúW„ §Ës“4œŸˆSÂõqˆ?|l·>ŸAÿC"`5aK§]=½Ñþ±²I)©ú>24†3¤ÔðbdSM#ÛDݸwÐÉ/²Ð¥’Ý»e§¥r£Î±îéºe;c¦;ÎÞ{P¿¾¥½žûbžÚÁSÖO JÊ9œ™\é½ÏyˆÊS¥ _'-Gé§¾ì=¢#ÔðH mó k¬ŠÊÀë´<0œ"Pô‚)|€ï Dმ’âiäG3¤/t¦DÕ¶œµÃe/à c¢ˆ|s+Uª˜‰­~Où˰ ‰S…Zg^&œY¼Ô”(¹À±K W>kÉÿ.3­«èûRÄ#QKsA ò±«³ÏÅ-¼cJ<7ƒh?Ê+Ép6&Ž…ÉÝZP{VÔU+^ÄTF¸á¬ á´ö­G]aB…k|>xv’ˆr¡®ü«Ðú…R³*_7Μ²Wœ«LâHÜ‚ôª‰,H‹¹7vñ©RfdÑÉ2œ\©²ñåO2kW=¸np³Õwt~•-‹Be!VOð:áFíSÀ“uTcfc$ŽÈQ•]¹4,Xbe!îåK*GÝ®2i‰ˆšÌçˬ{ôùÊÑçå¹Ä÷=úœ‹F`¢–1!Š€w¡q!pÂ>ˆbb"0e³V1¬™YÙØD«aMÉXž Ô§ŠÓY?sɰDϵ+ÍÏÆåÆóˆÏ.ÝÉk0®§:7H?ÉT* ¤Y™LÆ-˜s²þ~î:Æ érœkÂâYUž5xÅZ†Œ›8pdº1–’@õã­™?¶î¬—iGz•¶ãœ ÌlîåWm›ñÛàš0x¶5uâN­òDŸlÓ€@…)Â~)o%Bz]˜`gÙ®©.3(ìÎì„-ƒÁüHM&¶’j&"j ®•¦úÕŠÒ’iœbkù¦ ’HÒ‹>j!1å<éHÕý:{·Â'F‚¯X u+ÙÀÆÝØN@¤ÔXÝêœÿLN³¼jìÎ-”GÝ^ˆ´B*b@âT…ðÖ™¨kÑ\˾ìp¥ŒLpÚ#ûKV\&3;ã–ô9ûGõ¤ d+3áÙJì1ÅøÁ~Qsîè52YÀý¨ŽüÝÁ èÒ~,±¶‰ÕÁ(íiMŸÑl}ÈQÛô»šaütÌNUƒ¬õu£EïQ©mu™¼w:ö€¶ãq@0qÝ_r=^`dÌ/E™Q…›Õ€â­gÜûQ6=žڞ}ÎB?nÊ€gÛº§4UB‰HVÅ’\¼F†sˆtI쯈éS¥'3ô„¤iÂv陇³²âûUçL©f­Þ[Œ=J¤T “×ÅTSÁï ¬@ÖÓïY+ÆP$U°S†1!WÈÄxú–0—¾Ž¸þ¼Æ“µëÇ="qt¨@OLY÷¶?2€”(¤©k¸<ÈÆ_AÕ‘òÍ1J¦; ü)ˆ&°Î¹sߢÃî¸úç(ü!øeËÝÀ]T•¥GÞE^»F!ásÇ,  <1¬3cÍ5S'C˜4o׺ÕÀ¸”)<²7T2ƒ?‘m³—*E9eA„ƾ§-] ±'ëbJ‚P `˜ Ùò xÕ6(:DJnÁœM&ð'F㓎K%`EHPSUï8²Th ƒq±…“üñª™âó&øj‰…Ël$*&“ÉiªßSx‡) Ë`*Ç'£„kÃ# á[·úçðÖDe_ëâ¥kx¢Ø,&~"YN[ª5¹Þ½Š2VŽ%QLNJu %¹=Œ«9óÊÛ¹=ó'#J§O9YŽKü5C/Ô|>‘Êò¯»X~–ûd¾NFhc/SKúv3Ò7_ F®ôLSÕÙ{;2-†E8¾´Ó…Úº´Û:뢔{\=†éôÈ0ÜùW*wFÔ'·µ˜ F3[ a)%—¾Áòÿ $céÌùn§~ ÜÍI»­q¾Rµt™Â{ˆ©&ak%+¥2¦T¦B%T×ya3Ö¼û]„ÝùÞº|/gx×mé6IE˜»½¸QEDºÚRàýÈÆ¨¤nVÙ·¹”AÏhfŒm}ÄbºœÊ²¹­97çŸ!vˆ8JTôNšsrTßQÓ<‰àµö+w3‚WV ^éÝÑžã^u‡¥ržs(±Ö˜( áv„@íLøÒ$L¬<—C¾!&Æä0¬ÏvÊ—aëkõ‰”ø»S^È)PzñÖ™2ów¥w]FÙ ‘H7ÄÐá{˜µÆPÍ‘ß~íŸ[ÂÒÍãÔfÈžúQ™öˆ꘴×g›’‚ £Û«»pj:ºÒÝ•FݪñHŸô¤Õ¨ˆµ‚lá½ÇL©—Ööµß)ªf…¯±ÖçT8_¦o°? —¦wpÄ¢m(<|¦g€jÑÖÝ Ù²wü¹8Sj;ŒNL=s[D=Ó¹Dª¯ ÖµÁ#A*Q{ Ú ,æ™> ÎÎ ž¾ö&Á;îS/a….c=qa!K¢Å+«{ð]a½Ð˜Ç#¯šhLJÆÇýãîÿPEŽ] endstream endobj 5784 0 obj 4126 endobj 5788 0 obj [334 /XYZ 38.2500000 139.250000 0] endobj 5789 0 obj [334 /XYZ 38.2500000 718.250000 0] endobj 5790 0 obj [334 /XYZ 38.2500000 487.250000 0] endobj 5791 0 obj [334 /XYZ 38.2500000 718.250000 0] endobj 5792 0 obj [334 /XYZ 32.2500000 173 0] endobj 5793 0 obj [334 /XYZ 38.2500000 139.250000 0] endobj 5794 0 obj [334 /XYZ 38.2500000 487.250000 0] endobj 5795 0 obj [334 /XYZ 31.5000000 174.500000 0] endobj 5796 0 obj << /Type /Annot /Subtype /Link /Rect [373.500000 695.750000 402.750000 702.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 5787 0 obj << /Type /Page /Parent 2 0 R /Contents 5797 0 R /Resources 5799 0 R /Annots 5800 0 R /MediaBox [0 0 595 842] >> endobj 5799 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5800 0 obj [ 5796 0 R ] endobj 5797 0 obj << /Length 5798 0 R /Filter /FlateDecode >> stream xœí][ã¶~÷¯ðsxÅ‹n@Q`gf·@ ,v>}(’¦EÝæ¡¿²Ey<’>Jüö’lexbŽ(òðÜy.ïþüùÇý~|÷üù?ÇÜçóçCv*ó¬ýçxþùîö ]ÜïDzÊ?üzøzüzøtøÔü÷ë¡}àóó_›ßþwÔÇ¿4ÿþ|üþïÍ—?º?:ÿÁ¯‡R•Íç/—ϺTÍoÙõóüý¿ûÃñ·óŒÝëÜbÞþÿwF[£ìy¯þzè¶©.?¿ÿðÛá] €°·¶*tuTÖØ£ª­>þ÷Ÿ‡ŸštÓg§Ú*U¶Ì¾åE¥nÞTç͇Òu3SómÿE—¡é#L^4èmòËÊÅ¡¢L¡ü³Kniʘ‡û:}„É«<‹7ùeåÑÏ.y¸uÖ‘VD¯Ó‹OÞ Åd —•‹C¥;\<»Üáæ™Ò6åÞNar-¸•G¢\ß짪pÿÀßÉwW˜ÕÍk­ªŽ1¥}žYÛIL]ÅÀ«×ùå'WåY)Š…W—•˃¥C¬áôŸB¦Áki¿JéWσO_ï>ÖGU¿üÔ,íòÂöãË&ßÕPkŽ_~<þ±YúÓñËÏ•ŠRU²~þ»vD_FªSUg…γ›{±'kZí~ÎH~1§Üç×ÜŒ”è=ª€+x†ïÏè >ƒg{i¡£ºe_GÌÓe¤>÷ÐŒüåNÁœŒ®”žu ø“A¸á3ýpÉ»Éf­Úµ¸ãy®ÀZ´j<›ª&â ðlx?Æ+x¦žbúÁkk÷S½‚8‡ n‰ã׆å}·jd–ÍZ†UVrtäuYw6ÜÔȈ~Ÿ1hÄoì™8ò!ü=Žà÷0k3ðÏlÏpä ÂŽàó1V “&ä^ÙHÝ7`áìŒÜÃÔéá« ìÒm—n»t{ éVÚúᤛ®ál*|Õx6Ç.•:U>ÉqݰÙô°Yì}á¡ì§ÞŸR,…aÅ©„cpšpå1y1ðñ{æ99BðzöìMŒ‹VGUј..4VéŽÆTK*;å-É÷¹ÿØHé6 ‹|õ‚žñ¬ †ÏØ+g¨Ítu õÈlZ£g2¼‚ö¨TÑbÂÞ÷cÞ£Ùð{TK0åɃž-G«vbdd6 7UÇN¨ ó¸*?e}°cÞ©×#`Néá»pFõEdƒŒ]àaƒø=x}ÙŠ¥6ð6¬!¤#S±¬Ã*÷⦗°&ÐWú¼â¤F“QÔ< &‹Û³ù–£y6_Œ1ÆÈÁaã#ÅÄ7¨Ÿ‘ ÌØyV×ì͵éÉ:g¹D¯¹é¿“qXyÈ¥/Ýè{ FVò {ƒ5u§5 î1 `²$øŽ¬oËC….FX²ÒíñäÀ;3¾H6‹:5fõ„¤»W•Ë~H`ûunκ»òÔðÊSç±BwAW›îò€1eð¥Å—0ªÎ×{ÙÑ$Ác<$\P!H‚QyTÿTA·˜ã‹Î&,ìüDä—,uF¾V‘sûÁë-ç{嵩ýòÅ Ó‰¨ãwwdǯµ}»å€§ˆäR8Oà ¹‘Š„cäØ|¶èÑúj†‡Ä×B—’öÛ /Z,¶k`Q×ÜÂ! 1é¿*ú¦ uý¿›&sXÒò¦ óLº-ܪ³o¡“Þ†¡ÄÜgxšdµ3Q+ÆÃ¬°k scb?²×bÔe2ðÏĬâýlI|&ÖwøÕò|ç ÕgW¤îL‘ZÐ ÄÄÕ{¸ˆ÷„8}„¹ŽÙõ‘{ÓGdÃZ(lN•>»–Sˆ͘×= «]BsP!Ìû°8K˜Y×W¶ƒÝ„0óÏí!ÈM8™½]iª3]t$ËÄU&B&ò³ «á{D¼‘Ë[i‹ßÄ ßÝ{úèn<“š# 1/uŸ·Þ½Kqi/F ¡yµšV`Ï T< ÂÔMfÕ¡.wÕ!•êÊF^ò²%¯Í¦¼)»!ïÕ?xC>¦.¡ò³¾8º?C¾VFOÊií;&§±Ç&>ŽÝ™*«_N«âZÍÉÈ`´Á‡©8CÕBÝÏšUxsáyO@Š‘”æÙÆü|,FT¤d€:ëeº 1À(A’ñ 6ׂw©ং½™°­Tå*“¢o·0ê{@‰dfÖ–Š9%åçeWHX˜Ÿ§ ‡Ïéºb vIÉzÔêÊà ì¶eÒ¯Öçê¥ôæùP’ͦÝh¦ô.nïTÜFÍËzLqäAÛ`*¢/S¹J?@äJk®pÆH¢Õ¤g†åëàV,Y1M¼ ˆRHK¤³ã„¨xDµÖ𾂘IjUÝ“g+RËW CIÂOµc#`=ÙE#nËU©ZLY}@&&¢IVp3‘Ø¢¼VcNÖË›¨Eˆe/õH¥&òv¸¬ôõr‚µˆ¸ÌÚö–™Lwg¢b„eë‹ë×ÖôÐð±o6Ï:p,EKi ¿¾·€ôʸ…ëhÄôcvvß+®ßI8½H’3Áæ=ÅL–¨®Î¸Ò˜òþ¸Iž¢ä²[aBl™b_óC\¨¾ž©ô5Œ JØòYuÛöH Ö˜lßpÍÓäÊËžÀöî3uúÖ—úu¯M<¨ŽT©¼¿ðE:¥vÛ¯=×ׂ 8T gbÓg%l3ÇÁf]jfªßä/.Ÿa°É`ªÝúñ²ÄŬYñCYéЫûŒlxŒI$š•B(ú;o×ÖvðY¾ó¶Ãò ÎÛ&ïp¿S”ªál¸Ot»¶âd”îâk Æü~Ô¸_8óž 8jÛBïÁ=¹³§ð¤ê¯]Û²~ Ü‘þÚ”tKäõcZÄ.ï'Yc”©HMæ4"ǶU@Ããiƒq!Šä>QÙö˜‰~Î&œer¯¯iƒˆ+aùæÖ©ì@½` Hž}i¶ÂÚ9ΰ¾h@†é3FÓØCîLÂ9A™$ó¹%q7å8N”YF¹V¬.ø£"—a2ž z‰[ãå M-Û ^«ª'ÅpÛæT·&L”S€dúRS©˜;q S$ÈC÷Œ#XVJŠÆ¸Ê4\³;^Ö­É@4äêóV¢bÈ‹™@FâáûUŒ‘"š7Ó y ž‰•“zo/a]APÁ®v–D‹R¸È²¶õõÌ"7¹—+ÈÄ]‡„#}©'¢iÉ^0š‚hk*Yµgm²Ð  4|üŒ¡û>\¹Œ,íãX¶Ì’&p¡Ê)…ƒÊãý–€>Ù¬Ýåk(¨ÇÂ`¸ËmÝ 1Úͪ}–‹©,DF6uÿʘĄȠ„Iê뛺ò“uÍáý nq1Qb+ˆЍ{rÜï²Ó:—šï TY·Ù|&x'¾#ì0ödš?ʱ?`“DêhdǤ0ÓH«`Å÷°åjº}ÆòÆjª¬ÎmEÎ19ï@=Ú+SòŠ œIh[Þδ2"Ò¿®‹ ŠÈÞQᚃó>e†m3ž˜±­°n+™©à9y×…ÈYHc.p™-p‹“n/îÊù8ê bÅö÷HÀ›ãâc‡W­álÌNñ~®ÙÃ÷¼Àýàµ=OH2½€]6A+ËGðä”–m'±"ËßÂ7, Jr\Mj$C#®MáµÁ Uƒ‹8ÁàÙð~t WŸ1)±BÛIøf¸)Æ$¸o+p®³+pÑ/ü îÕ q ïmyìc j`&¸çL Úijypg©ã‚q¯1¬„j­‰‚/ÌÆ1,M Ÿdt9 Í@ò`dܺNÕ¯]Pµ‰)쪼‡iŒMÀDR¶Çü8MêÆ3;‚áS»%Œ+Y›#Äúå¶/E øŠ½»–¤ÍãÏÖ!Ì•™yF&†4Iô’cFewÃl`¸‘'.gŠãŒœU,Ú…ÉÉ`<ËmJr&¹ºC9\)ÁÁÅI> endobj 5808 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5809 0 obj [ ] endobj 5806 0 obj << /Length 5807 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·Å‡^@À¯ C€ ääx³ ÙE&{Èßz$Çêþª[K%vܰg<Qd±^d}U|ûÇÏßÿó·ýÛŸÿ³ÿ:|ýðyWê²èÿìŸ7/à›Ãðý¾nÊý×_vûÇÝÃî¡û÷q×?ðùß»ïþ·÷û?uÞÿõoÝ~éø ¿ìjWw_ÿýôµ­]÷]ñüõøóíþò»ý¯ÇÇ× ƒùþÿo‚/}?Œ ¯~ÜÓtOŸß¾þº{Û`Þ[ª²(ëbïbˆ{×F¿ÿï?v?u/»/mt®®âñ—øÕþø¦˽ómדoâÉ›ž>Jýëwîjß,Öy?r}²¸P¹ Ýš\¨}k}\ç²i|÷}†?‰dkŠl]O ¬Ês÷ tÞ:¿ ?5O¥L•aÅ…ÞÚUÔýU'Ñ‹îèÜ—a¹ÎŸF®N•aq…Þ57Ķ'PšHôÜýôo›j¹ÎŸF®N•qqOz˜Ó ŠèQ< ¾ÿ²{ûƒ‹®#fµÿòS7¸§wö_¾tD)÷oŽnDg\¾ü¸ÿ}Q¸ø‡ý—Ÿwí¡òå8Ä‹-µø µø ~Oñ|¾Ç5píS˧/Ý"-Mߪ ô-Úù³+úÂ÷˜ÒÊû^,`ËG¢7Øâëù-xMB\Ý2\ú~~o! –¶àµÇôuŸ` Ô6rµ‡½QÒßi-p^…hÈ}UŠŽ´Ü´Õ‹g ÿz,ÃD‹)/Ví÷|µòxÚbŒÉGp‹ {°Ï‚í‰j|Q°hÄžŠ‰"R£ÆûqŒ·!öx„}%Cëսܒs”—Šg3qs]¸:¿á™bùaÂ|ð3Ä(ÉâÏÛm,‹ã“ïû1þëAf©HD d°º„5bðCÌþêÞ4¾åcSâ V<Æ`3ð>#`[QÃ]ë貈°Ž$8ANÆ{PÅÖ1(Bal„Ç!œ ”°¹7Ÿ¯ã—q|a¦LÆ‹_[}xÌ!ª{Ácð|ªºŠáÄ{ót³ì…=ƒ.÷†¶Úgůg×"`­Tѱ¯Gš w®sMv ¢œ¡"æeAf˜(ºÝnÂeJ©n­ª"¦"q¦mJù:%×nýŠ2f˜7S’qfÀEtŸ ÷µIyLp§OY|¢€m*“MÉœ-a¨zÂ{°÷€ßÃ̇ðÔ„x±¼H&Úi”;Kí¦‰³LŠCT$;Åö¹´ÓiÎ%e“aNb¢ýŒb0oºxU»‰16†5 œ I‘ŠÕó)„º¡'áÊ”¬]ÿÝ iºþ¾çõä½éJÓ½å£Yqbæ¹eÎÕI9/[nY¹eëïç·Ü²‹rÖZç¯èz9cÅ™™2¹ ª@ð )ì¦ ODÈ™ÏÂ6y—’»a%3Bõ†“ð ãÕ"*–èzFŒÿ“³~¢2(WÏÀÉDjCŠf‘ã|LªkïÌ9œÙ3ãZ“ RU¹zMÓ±æ!ÝUR¥ÓÕñËw¹&MJLR¨¶Ç ‰™z¤ÚJW÷)#‰‰jˆTî5¦(rЭ­eæEZa‹²ôP$EêTw7¸ªÙmîyoSf—>%V¨œÑFÄ#r†¸FîRh–É]Âù ÊÈ&§ˆ©`ÅŒM5¯Šñ“î-z Ž‰dÄâŠLiªÚ…˜Á–Ó0Zýü»>Æï2±ÝÒ‘ãÇØTÁs¼ÉªbšÁÈÉ=^CR~CÎR› bÀfK뛉nj%÷VŸL´Hr2iƱëÛqÁ†oüYŸ—±‰ó­Íê bc‰ñ{0u0EW¯ö»>‡Ün|;¶)g°ë{S¹ŸuucZYž©•!é.†˜Ók\倉à2™^X Xòb™‚Ž6å«6+§{¾+Ä?Wç8³>7yúÁ əʽ–U]*—¢=os…ûb Ìù”1÷påÍÏј\l¢¦–ÝÅìä2–3!¢L „èùÃ;,³ý4QïK¸!œ¹£œˆ€éîÎ…Þˆ0ƒƒµšÆu ~!?Vç*¸·’©‚+¯>†­ÌT#aNùué&Dk²ÈH¨¢yç&Ï J¼Z7iÅ1_ 礖|Y¥Dx,OHªæòzãiÁ`bñ4˜ºš(_WŠ6Ôå©òmM[Ë|E'|„vÀù³Â.!ˆ?µº»¢tÎwƒQ( UÌF7f•,•㽺¸æK}o¡t)kÏäã5Ékž1šã¬p³F[Ë+k!¬¾ÝRкøJ"w\èM÷f:润Â1sïÇ-gðÛøõóìp̹·Cµ¾^^ɆÝ|‚­å>[ËÂÜXj¥·]ú2»t%ßC5~†¸scð˜lüˆfDñg°ÇØ7ìÞòY»nõf«·–­%{?B8[X][*Ÿ:ð·š*X°fïÚsæË÷€šö[9ûÞ¸âPöÙ:çZú°byðUßômjíüg†ò¿çžiÑ3ÃÕG.zDÏ‹gà|Ødu®§ûÔÙ8bF&ˆÛaãZ—žyFõ;86[*Ôµ@5°Æ8sû\|ØyŸä`ÄQ/UórAEÀúoöÔ €_b°3ÐÒz%b¤+ž:~Ï ôMÈÈ IW‡&3Ké0¢ß1ÀžAÅBêÌBbY¿ž‡†íÌUx` ÄàEÜfޣǼt“`vAý,.âÄÝ ä}p“fqç3þ«Žš’ú:ÅØ3fš1Zªºi=£o¥­6svoæLÐÏXÉ0ɘ8¼È ™Ž™±°’ eyÿwA;Ú¶íÄŽ&¤Í£¡†~¦òi`o8É+!“tÙ8…+ÚéNÜøV•™Ó¹ÐL&ǸGf™ÖX§­«L!c¦!lFÏFð °JÆ¢·Ûr/YÌÅOû|Ç4—É™`æ¬2Ð1 /ñÈ’Z®¨&Ô]È9"l%µë½>›J²%67‚‚d6ÌöJ¥nF~ZI7/žò=gð9&—Õ“Ñ›„ËተEb<\£„ñ¥ mÃD-tOh6?æšøÖE{½äaqsbaNÈ„Ó;BÕéÒ ­IÂ1èÂpÀŽs&t7»ìº,§s»þTæ ó#VöMŒT† æ±é&Î0)ß«&âðžZæ¬Y7¸’¿#°èfÕŸœdãc8£*޾ófF¶ ½nZ!o­ÀDµ7øÛ5”½%—CXBL)<Ò»)e¯â)Cô¬¦×¦~–Ü)»zbà¨}ê«;Ý J}bú1'W'Cº~ŒÁM•ñq5”ušw}$‚ tàŸ’ME_3ÌJ+î >¦ 3ÃŽ.ŸL(ؼè†×•Ó=Ÿn-h,¡ šmájÔŒ7€§a«‚Fb¹8õ¾‹ç>ãÂ:Á*5´Q2,eí‹ö9µ_ß„¯ýÁE'˜#°L„†Á ŽK9è–)âSƒ±X*¥:ë¦T Ëâ‹”ˆÓʙބ#v…zçR®•V˜(Vc%Ãó¸–æ¦Êµ1åÍ…‹˜åα¡LàXªå&)¡ô¶M̵ðªö­è]Þ-\9æªv¯ñ˜Rî¸lsÁ<.ƒF\5ª\ˆ –c.¾ÀÒçðÃú€)c# #Ö‡)6ËøƒdÙØÃ2&èë0½«CÂHq19êz \¨r1_ìµa­ˆ©C\úS0¾&S´‘Њx} óÚHFë$C—+˜ ˜RÝÂe_pµÀð ±wdhÀxÕ˜ë | 5£o¡ucÖ‡Ú%d!›Þ¹Ù\ý䢄cÃ-¦ô ú¾ˆ\˜ÐûöyáÖ/LˆGp“…  Ź™Âgü-—9œµrÃõÌ*`ZîÓ¹±õÊÅUc¬æš`êÀëƒé†Ç†)й r¯U±I|3NÀ8¹ê—¸NAè ‰Ì{T† 0E%-™H쟃, Ý-RÉe^~Ÿnž­êØnª žrNĽ!ø—­¯”Aq†1Œ€S™b¸‹rj.›±lâ¬qœ ¯ìFp•3ÐÖD= «z :N…F  î9c½¬ÒdUw±­ä—ªöcå³ä_èuÙ3§¶ª&Ö)ˆØ²iÓqj”‰U=É8aÊv3€ZA†/C3iH*ð&I˜*ß27ÔÚÝÎ꣟¨ÝYÐáÖ!L_Uà~ÌÆ Dó2nanîÃÀ äÀóÁá1êÃܬˆ{c¤ ‡‰˜82+‡a.ÄztuaÓ Ö zß;IÀÞ(Á«ÀÜÇ%sž^†n8üɤ ©¼»¾ü4`¤ÄÒŠ‡ç»QU­¸®îÔMÂÁÀm¦7|ÂÈ&!3‚=dÈjû¨+¸¯ÞÒÓÒ¬ãúéiwç×är’1OצÅ6%Ùm K£ÞÈÒú¤»Ïþ±QB.ýˆÍ9ñ . w $íý˜l0øüçbý¸ë3‡Ù½5ðßÃÖNV¨:m@þPMÑBCâå¹#øè=áJåÜØ~fŠª™ãò"ñÛ 8ØÚt2ÁqÑ1|z{f÷Ÿh7kêõ7¶eîø}7âq¡!íðrbð—©çØf¤wÿó—-nºÐ¸Ò8\ÌxÑ„÷Ài¸x73X8¤AÑŸã#Ì•M:ÕE8 :è:†Z^¤t]T´û‡Ýÿ’ŸÛ endstream endobj 5807 0 obj 4295 endobj 5811 0 obj [336 /XYZ 38.2500000 545.750000 0] endobj 5812 0 obj [336 /XYZ 38.2500000 245 0] endobj 5813 0 obj [336 /XYZ 38.2500000 545.750000 0] endobj 5814 0 obj [336 /XYZ 38.2500000 245 0] endobj 5810 0 obj << /Type /Page /Parent 2 0 R /Contents 5815 0 R /Resources 5817 0 R /Annots 5818 0 R /MediaBox [0 0 595 842] >> endobj 5817 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5818 0 obj [ ] endobj 5815 0 obj << /Length 5816 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9À¶Å‡D Øc;@ È!È!ðf,²‹Lö¿õ4Õ3#飚ŸŠ”ÔÓkìÚ;´ÈbU±Þ,¾ûã׿ÿü­x÷ðõ?ÅwÿûÃ×CytUyþ§8ýúáåtsô.\Sß9<‡/‡/Ýç¾>ü¹ûÓÿ ]ü©û÷çâ¯ë~ø£ÿK§¿ðËÁ)×ýþï§ß[§º?•—ßO?ÿ×á/¿+~=ÍØ/çyýÿ?]ëª>1³ôã¡ß¦zúõÛ÷_ïΈ[¥®t¥t¡¬±…j­.þûÃOÝýôå±µJ¹ÚºrÉBNŸV2¶-”n»UM3Zèé—Ìô*ÁämS§›ü rq¬(S«ðìÇÆeœ®ì‰Ð'"WM£»?;ãÿY´/Svk>!­­ä±ö<{’thÑé&‚\)žÜxrÁ£l´v=ÕXf,GÐóô &7.!ßÁäFW yé¹8VzzãÙ%²qþ°™& þ]³쪄“?A.Ž•ž¸£Ù¿ÄÌ‚A9ÿ8ô?|;¼ûÜ Ç™uñí§¸§5Ï¿}ëR?œ¼xÝþXü¾,•ýCñíçC{ì€êAœ)4bàˆzˆŸMÕð ¿!`3èϸŸÔý~ƒ!€80Ÿâiªƒ6ž %Æ5ÆÞ)Ü9Ãöé[w$“Ÿ&[-9MZ˜ÇÊ÷ñ\Ž©UAØðˆÁ´'ppyK#e/…ëº@Cî¥äúÇøoïc”®Äx¬Å±ÎÁT€`Ød1ªáNñH€>x§w°¦ÄØ h ˆ¬ŒVjÆöð’"¯m¯Û>æ[µ.õ¬TÄ#©¨™„gÃ"Îc…gcN*>[„eÅ`§Ä2R!#ÿñéåƒõ-~ [ÀòŸ†¾M@ψâ û„¥¨-„=†å;b‡ñJ œM–w„cÌ9ÅüFxŽ Œ}+l£òZc¾–•jBÿ`¾ÆÉÓ'Ub/ñ'LÌ/÷ajÁup¬ÑmŒL x¥øÌ`¬®‘QMÌ!˜>L¤°NñNœM!¯Ga«âÚÂul)9>?û¤‚ö1i0× _›%~ÕΟ3Ì˘c ßË üM%d6 gÌ8Ô®éWÍ«pªÏÊÆ*4ÄiÀŠd¼0F[‹F"± ¬_‰()öM?C6&>‡ëÛ¦Ï&õ% ƒi?7"i À´å LÓé××*XUDz5§^~ÏD84Ǧsõ˯²¦F9›áöh͹càóˆE#ÎŽ§9V¶n^Aíú抅=—MŒ¨’Ø . ÷€¾Ŭ–FûRúÞh›X`^òjbĬ,—a>Çë@ ˜ ¦ŒäljLSo´UG£õb§þÚ2ýtËd ÞéõüÍlaŒÀ±ÁD†# ºðb!sÔâí!µæ«T;T}¹DˆñyÇÓŰ¯)¾ŠÅ±¬¶N˜ú†9Õ)xF 3PɨX³^/ÕÇx•az+ÖÕÕk›m£¿Xr™ïR T ¥:0U°àfÁv”ZúÎæ¯\E8L}bƒ>‹¨ÊcíÔk 2Æ 6]‰³aáÙÈ=L–亱mGºë÷×ûÐÚ ˜<„§`?I!hÖÁ7¥ë‹(*&].[Vrcam+Û² ðã ì‚H¦lV_\Z3SRÅâkÌw¾ÌÆ—Â× ™V Æ0ïä3}¹Ñü¹·¤ÏÆê ä6pÄykUï/êoO}ÓÂuzãòlþDÕÔlxâ@ÁýF ‚Ú»Œ'¿s˜n#Þôž‚à¼Sw4#ÀÙüñ‹¢O;g· >¥N+„Í‹ )ì@šâuðlð)8ð>ª{ŸåšÙà7ª‚8ÀÜ‹©-&hfrºtc´ƒ.LÞk¨ñ&ò=믘d™Ë@ú‰IÎ1ñ3"ʃSI¤i ôÅÞ%âúÀC_ŸP¦bÙ›§èú²Ü© ×£àêâÞxà.SK«[p|…ëxDû‰ë|÷ŒvíkŽ‹rq˜Žh²üÂtE ¸8¸Sv~ˆ®(›¸htÛ,àÒ\,fdýnª˜û,æÿL2É‘œá£Üî[µ~ïŠÝ™þ~¾¿à_|§‹¸“"GÕ_â„d>õ.Ï0ý‘‘dü‚@Õ N„‰¦ï©ò7…Ð… @}Ÿ–©Ù|<@÷CËp­ÿë+$°sakâ2¢B»^£²ì 2Þ^X¶Ê!WÍN.ÎÆ”U|K"=½>v¼u»°†;™ÇôÍyÓ*M;PŽL™-þÆ0„g¢g8r„u!î"%À{ª¼¢ìB{ ˜ãop†©1Ãûa*Ɉz±€¥µ§ 5WE" wjîâÚ7ìZŒlKÅšËÈX¹â4¡†U§W©oBÅLÀV„f²IL­Cdú°M:⪒Ý@/I)¹2cLnŽÊFØòxaÑá˜jô]Þ&Qb}:æ"mº¥Ã–Ͱ› pà”?Æ5ÆN„³^»ÖÍ€åOQ»¹îªÜ¼ &{Œ9‡©ííõi»Kƒ3`‹àÙˆÓàU&÷"êŒ2±ÛÐõ°ºuÓ|@HM¼SæÌ%q…ž‘%³7>*ÐÓsG‰!ôÅ5k]OW‹lÓ·½~CC2S&pÜ>VôÂDÄa²ñL¿Jr]Ÿoh¦ï»hU>qXÖºM"—É™óýš‹»yéb3*$Žþû,&ad}„ K<‚“)$,ý-¶6ÝòS·aÓì+WÎÜ•%"NLUX€¿áY÷o ¥j@ŸËp`Xf…{ •ïý÷¬ß˜juáG<®¯§îl¥}÷î5QÆ®PÎ^ɽŒæ^F\G6îoq&˜°G·^,ãª%‰é·U,ãÜ’dé½XfÛÅ2LÁ„Âë%&Û™0z‹¥7®]Òì^zs/½IתðXÎÒ›ÆTâ«Î„_›v@Æ5_§½‘”ÀmgË÷V˲Z.› ó2,šéÝZÁó¯ĵp‹xÜ9m~Å—0cº¬ˆdÓg«:dßž'm˦†ÚL´ó€pb‘ ø=‡í]Qg„H }°½ìxâ–PÌ« ²ý:cª Eåg¶®I×ó,uøe ãë‹_v‚Ha;ÓD6™È¿1]IR˜|Iû¦){µd4•gÚW2¬„°~0+8`²¢¸ãz„ÝÌôHqÁ3)ùÄuÄ›q_ü9½ 3{΂¦ŒµjžÜû*¾Šö‰Sª+­X¦lw¬Ø±¤ŽîǶÓÐ@Ì•)&ÇTÚʉDóMJt¯ܕ–­é ô¬ºwÀº×à­W ž²É˜¯½Æ‘4÷Ó–ÞØºßCÉ%BKF¤ŸD«§);‡‰n`kš°ÁvÕž0[£ê=ÄkSØo‰cJUC½(Z¨UNÞ;D©Ú 7·«Ìžì "ÒXLRJR4•ç ™ A13oÛmºènÅÞ-[±<w£šÁy‰&BNÑ'Â%w{°ÕD9n‹Æƒì6Ì›¹j²pït"‹~oæõb6±’ù¦Píd{?•s—%Ï÷5Ty<ÇMGHžq~kzlÕ-ñ…ß´èÏ‚'¶>ËøøûWîh€ºŸúÆ@à7Žösy2rT,éØOÖ @g @p¦i}4JNuàŒÑÈ;x6Ì£;xw ;izsydÁÃoüý­©u Â;e¸7yœâìÚNÂõj·m’-ïÃ-ß°Ne|ÆâHk^btŸ-™¢Õ³årvùŠ1óÈh®kpµ9©{N•GOòøjq®Y£9SY´ØžÄgyX‘í&«h]ï­WÔŒ=Pæ­dƸ`úÉ2·k#ZŸK¤¨bz&¾ÉIöù òè~å½+S-Ö5a®@^Ë0¢DEæX'22.é¡;¸ÁÛ†ÂifƋ­c•)ëgºkR½‹äøw ½Þ'Û&€ÒÆ[gã‚·É3DÑ´[pèbn¹åë(jËæ¢Åp î@…+ºð R¸ì˜ ŽàŽ.tp§¸ ¾KWâw¯ðý;;ã ÷ÐÚ%ð:oB­q·mw#´e»¤ß*ƒÙ^€ÉEôޤø?_>«Ô%”©óUμÞhTKär%u}•yó:Æä2Xdo§PU5ë;g{ê­ð–è´/ÙÉ&%˜§;żØÃÌË\åÍudÎN¤Ôo­(¸1Ë Q1Çosú¡Z_úþÂW*ïàW‰™~&Ø^Ç ôž± ÊtTÁ}¢åâ WPËö½]° ›˜êÃ)ŒoˆÍuŽÏƒÅÚÎb1ЩG‹~³y,6f‹¹ü@ü"Æ¢ì+oh„Ð sÑe_¶gÀëÇ‘YüÒ±S¯+³œZSêy=!õe4Udd9³N9‰‘ƒ8B¸)$jâ“ù  ?˜H>´ûÖ*¶/±¬!Þˆ“}Õ*pJ˜÷‹pFΦ0æ¬ï8ŒbÍ¢‰/JSf6&ŸÂp<æ· CÀ`ÃF¼Mf Dò²7}ÝT—ç»™Ê5Ñjx”ÇOá@$$JܵÇa›1.6ÜF‘*ݺõZ^¦èQ²lpÙ=*M•¶Ë%Åe·ÑÇ#¢vDcá¿Õ°‰û…ªº¡b+{éõ†žoÎôDò­óPnÐ.qæä | qbÎÂ)«—N)œ6Ãî2…Øùbä–5X¢à‘Œ© k—<•¤˜³ )Raù‚]Xì¬ãÐ&~?\Á„wWŽ7\](_º_ÅcÇšAÎý2÷®°ÖšéÆcæXªS¡Ð}*Ó‡®¦\°3Ü„Qv¶lôQŸ;~ŒôV=ñ¥‡úXnh-Ýh3wñe ¶Ï~§(†‚2;> endobj 5830 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5831 0 obj [ ] endobj 5828 0 obj << /Length 5829 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹¤ž@`mäÀ°‚‚Ýl‚EvgùûQ·¨îJ%}]¤CY;C‹b±^üªøî_þ~úço§w¾üçôƒýó×§ì\Y÷ëtùýÝËèúlÿ~ªêâôÃ/OßNßž>?}nÿûí©ûàˇ?·ûßIŸþÔþïçÓ_ÿÖþðGû.ÿà—§JUíŸÿ¾þÙTªý[vûóòó=ýåw§_/=öÃÙɼþÿß]i]]¦11ô·§~™êúû·~}z×`Ù(e‘çE~R¹iÿÓäúôß<ýÔÐwŸ›\©ªÌ«ì‘*}ÉTÕIé&;™Z ºþ–é>DçU°óëÌÅ©¢L©ü½ŸëÜ(Sé–Ú¾lrQ׺ý{eì¯ÇÖUg%Z1ä¬ÇÉvï>@çM™…ëü:sqªôŽ{<ÍEË9–@U½è>@çy°óëÌÅ©b7×ӻ俦´je€<‰îÝè¼,ëp_g.N•~sqï’›[irsïÝè¼.žÜë̃m.îý\—öü;9v}¸ÉZ Wõ)¨B(³ÆêÖTß›{ï6¾¼èÊ`_g.MËT¸sÉ5·]7d Œ²h$v3§J¿·ƒÞ?/éO¥û p.¿y>|ÿõéݧV’´Ä,O_j'w³ûãkK”âôÝÅ£lð×O¿Ï2•ÿáôõç§æ\ꢟbˆÝ –ìly[žQ‹É`‹A-ù÷p=%\\iÇñô†©£—÷¦ªåûƒ)êùîœgnpOñ7Ô8õrZãÞ ¼ pÌURÔts{þÚ ’à2 ®8Ïæc¼™YùÀL™”}\~º3È ¶xä%ž5¦–}xøÜC`Iª?AêàSç†i­±f€tÛÆ©+tñ/c*b¹Š× é‹[ ¬ÝîÓð9)'ørË2ÀׇpÖ¸…áY>PxsˆyQÚåyò3fX„ÉÏðî6ï¶ >éPÖxh¼£CzGEiöâÕúI ÏÖTø ã„Ï#s¶byGûôíXO]™©Gt?æ¾"ylì Ÿ³¨;¬×‘eÑÇ» ŽPÀýÖPW16˜çDãý&„×ë‘"ûôˆh–òŒý¾^6}œSΪmÀyÖ Y7ý[+unD]/¶´cú\7Ù•>w‚ÂoòŽAòsnº, ×lké¶Çô½§^Þ›Qݬg,ÃÊù‘ܽ2°·-ÃÞOŒcÜÉâŠé—£Žë ÒÜäz©1ýà2<[ ÷Éú"ÅÙèZÍG˜\Ä8x×­t[Ô‚ÇÁõðw5Ÿ#!¹<<„·ÌHŽÀg}@ ÏAÆÅ ‚7Óo-)?ÇÓ‡uÞǤ=v0c;¾€ÆV´Dro‰hUÔ¥š¤"ŽcÈR1‡ßlžŠõ ûûd²¼ˆ­oloƒŠM3}nq¬ G¿ßÊ32…8[Ì8ø–”áËI¿gY¼$µøZ0nsŒ@yÐ& Ê€AtàÞ°®Ä³†QŒ‘Á±‹+‹"ÓÕß y¢"8fÄÄñÍ ¹‘ÂX 1 TŸT3¶Uºì¶ª¹]St‹VÙ¹è¦ã2ÕXKeÝO]Ž3Ûß”ð›}c=JŸËJ½ŽÑØu.ó:è``oü¦ó§Ê³QÚñ. ÝlX´:›w×cý¶±h8žõ3l)! êX¡<8Wd¦p˜E÷^ݸ?}³:ñˆzòžÀ‘Á–/bô„7°ãnÙ×ô©ã(LÅî917&&ç¡kˆÄ4ŒèþÀÃÄ0(8Œ A*3X9szÞÏ'Ž‹2\ #Ûžeàs…9ÏY)^KHJ.1Çi~ ÚyŽÄÔ®T]EV¸º‹XÁæ—¢‘Ý!0r†¸õ`î<,¾ÀNÀò,V,›Qoª·6vµµì‹sæXä6ÖÛÍJkÄJZÌ#Ÿ ~°7Í#Üu4=@#Læ.rpŽiÉE)Y‹ÿ#a¨öAÝÊõÀ&M¯€j¬©•£ÆvnÔ1×Èî _$cçÏÀ@=C¬[«Ñî¼Ká"i{zÂD,ÜT,Ëê `*ÒS‡V}ø®È§i:ß$À6\LF¿¨`0ÖÍ…';@Á<εÁ7PD> ƒÞe²s1Es|o†Q˜D¥áì " Ç@aîÞ=9vø^Ÿ"§ÇƒzÆt#0á>`*|aºaŽÇ7Òø8%²YyžÒçñ{äŽh^¦Å!4FX­w)ÉúZíy6…€yR%§’¬0•¾.ZݪLaC‹^ðü¸;ãoÀ‰ƒ4Ç!o‹¼gÁ ^„‹ÏaÔ&wù’· ]wž‘r†Ÿ=gû`¡¡Éðd@ž0™ŠŸÂ—‘jìÁz§ôÄLˆ°h÷GÛ‰ ‡…ô<o™¥Ž×JªcîK…åÙ†¯G÷)í=ë!B¶K`uÄ2¨ ûU ;­Ö…kÿð1ˆ€:¹.\{2†…à#\9p¼¦\óä±w ³ÌXñŸ ‹Î?– %‰*µâuÉžDVØ?À×4ó=aO' e]¤”½öy!"ãÆ¿Ê7¥êz\À´ÈxÙöŠ1Vƒ‚»b— XÀ& £„ó”Àœdb½S‘ßž(×bÐɧùnª(îA–‹˜8†°ÓƸ? Â>ŒÁ² j¼!/z+›•íSŽ<9ŽùkãÊʰîÑ0Á˜šL4˜#ÏO䣌FZ3Ũ˜0V¬(¬Æ hÇ^×|1*[KÖ¥•‘¼HÆrµå*æØT9¬ýë=73®mÁscW¬D —âS5d a‰„º%!É|äõåµ'qëÃêÛׯWýQ Ñªî ¬m º5 daf>¿%às‚7ûVšàÍuÞ ¼9/ö†àÍZõÕÀ<HæÎNúþœcxÒ7Œš>Šiƒ(ðµ£Íívö&ñáÆJÝ󌇜xéN|§ 4t¯ 9˜ÛVŠ7Iö}áBJŒfjýaˆQ4Ìó Iå—˜ ª^‚èzŸ*1YH#pc3P©›„òVÍ´•ZÕƒ‰'T?g¿¹ž+ˆ&/\Ö]­Þ”y@ °¦RJ÷E½á€\TúAÁó[vÙ¶ÃÚ”wELF›i«KDÆ1õð‚ ç‹ä.]ƒ÷TMæòÌöÒá<(4"ƒ:VÍæm–2×uán¸„SÀ(W&Ð"’wOM‰±™:?ø‰(®TŠâ±Û?ÂÓ£éZ±pXMWf‘5ÝÁ3BnU>¼³aÊ™H9³Ö%‡‘(„¬+Ó3}¢m$–%›0¹O­¾€5_Ù{ö N¡Æ§S /põà]•(ë¤Qض0é̲­ÄýCªB9z p´Í“³™°kª™3«“5sÆØŽ)Æ)âútG(¨W°¿dÁNÝË&'ã'‰ÖŒÑìž›)|$’­ÃkÀÆVDœ£…<†'ˆ’;LA%Êåfž›ÆOu­n×Fãìð0)èÄ7«Ý£®flÆr?E^8¦‚¤ Rê“Þ¤ô¦eøAºFO/z¾5äÉ#˜sÒ©»Mú$®ß¹µ¸í»WfŸd - ].¢c=ì&’ÿéê 6ÁkÓß›72‰[„åªláM" µày‹«a¶Þñ]æÌ‹ß²uN·uÀ« \"¢GÜöÏvÿ®ó|5¡=B¢€Máòæ†ß­NiéÒd^'²ñúÈåé=ù³¢žã h-•õ*æ8“a Æ\-î-2Àª-ÜeDysÝVÏ¾Ô YEõ.*Úešˆ)o5·qÑ-bݸØ_Á”ŒTX÷†«l)ˆIÎañBªb¬â’/ù× ÃtÃ%ýˆò|±JUjŒ@gŠÖáq°‚ë¡ RÂl¹T%n1°7ͱ«ó²GWCý¡ñc^ÆÚˆ)Óƒ‹Ò:ÔC|2p>ž”[¶W°´.Ù‹é†å nÁ;'ZR9Ç4` ã’½X‡â“…ÏäÏù!,Œ[ØÎƒÔñ𦶲ð &hWJY2„ìeΖ׌ìõЗ Çë‰U*[ ¢–'b¤"Ïzħ‰ñ$E?j~«çë‘Æ—ÆãL•E—š¶Q˜n´f4ªGŠ`éKXI9Aåv¬¶£=aœJó¦ˆDŠHD’(8×BÝ®p²¤(0qµ}á‰ÇIЈðo‚».ªp8Q=[öƃ¯‡=¨äÊ pÝ}F@í i° hA¨sH¤¤j\ K|î»Pž´¨œÒDâ•-åY]:GG>5´‡=Þ?ŽÊbGX™<þ†¹Ù™Š2„|ÙVÿ¸ïS !h|Ƀ،ÈÀhg-&­(›^^àK†HÁeO8 À°SŠ”§.Ðׇõmâr¿¨ëÉùPïo&(`‚úÏL‚&( Ÿ»„2f1òMæ÷#æ÷š÷ÝBˬšœpËêº-Á}Ö\‚&øà•: >˜àƒÞ•&ø`–àƒ^I± ðS©Ëi¾Ä39,óB|Ô (G•9¬¼,©˜¨1¹äöë+Sæægp×µe¼F‚MÌâÐXåp ¿£ [‚à bŠ)Eaà-õŒ«Öõ¡€±¤[àgÆ”vT¶ÑSÔl˜=ä[\¦rÍÙ²Ü ôs:‘ñvᰠİCCUôÙã Ä@ xìöÆC1$KƒbH ÿÎ%C<Cr­¼<ººæ÷ëŒbÊ^¹×"M0Š£ðû F‘`¤••`Y‚Q²7Á(8$EgãÔJMóå&`µ‘µ>é|´}—˜W7·¬›Np]B¾¹ó°x [:áPžmH{ÀÊcß4èk”´$(ïaüÛþÛüìFÓF#[‡~Ñœ¬RùƼ±uÀXS`QK÷E‰¢Úµiò[3ü’|¯[×Öž»Äè€_¬ë­ZÞ›z†½MÝ€Œó }cÃØzàÜrË,#Ïàq`‹g¥ø–ïÜÓ[¶á8qihÖT½„´jsÎ »F5Œ Ñ5ð«¹ÔKÒóMd*Lxn›™+ø·Aà óúpÙÕ_kÄȹ% |1Í(í¥yv.+õZ>Xí^œ³ÆÑî¸VµkÁá(ˆFFÌI<®º×»@΄,A¤µ£ð<:cj±>€½íJ0(Nkä-«¥#ÁO´ËvFšRŸœ^#1F %kác½oðaÄgƒâóXo)L \‚1HÀabÌŠ«ö(¹Þ Äs2js§É¼É‰Y1­©…µå’Ä“ƒ†‘ @Û#ƼBY®ï‰Ðа] áˆÁä9$¬ !¸Öôe<ì½é‹9àóʼá*›Æ bHSöl7!á=ô ¯bëÂa‰H§,/ ð»zæÈD d…áÀgƾHú®¨íQZÝŠG‚h¸ÅÓ>LÜgÒ09²Lª¬ãë.[ZŒ§%j¼ mˆXAó a†LÂÛzÒ'SÄ6g|Žàú´l*GŸn§ð•W¿€b•ÎÇJ2Rþ$G6VKÙ.!ŒT=Ѳ K<+"TO•±‰¥Œ·ã“ý@ bU3¦2º‡ÊVs÷CZìYvàâjØÒ´ô@í¿ü…¿ià7·›s7Reñ„ÕÙ ö®ÔZccãÔbyD•ý.ÎøÆšµçÂÁôx‘¹Áõxæ†Wé¶2«n/wà âACzó¿e (Ô³1ŒØÇœ±;Œ±HDoœE.0ã…Ñ3ÌÓj#‰peËô IL¼*ÇDz¨øƒÜˆ›¡.Ì +]Ö õø=áqR™r´cºãJî/(¸&Š0Ùnñ´î:ᥭ³a™: 8»—ÈÝôdšŸËR»ü,fÄ!¦þ™(ˆÆ£óDk'2Þ>U”T4Ô’ª› Eç"V7+•îŸhóT2Á9©Xâ,lœcKdÅbéŒsy œŸMdzâPÞpoÄþìZw…Ï'2Þ=4ÀûƒwfÉg±‚*ªÎ_9’mBYkLH~;QáÍ…u6¼‘p°ÙµÏÔ)G¹5– <¼+šÈ²é §7’‰RaÔ£1RŽëqÐ^0 &ÄHFñ8²â„y2oØüÛܪÙà ̕ Þ[ìÝ‹‚I˜X~FÊþð'ÑÞåÉÚÏ ›ú•»–J1Ö %â£yi˜Í¶1€SêpÍç=¼ Fë +B¨ïs[˜]9a±` ‘Nò\¹ða.™ð|àBH­§+—Ü{J8b”žÇßÃÒˆ9*Gºf×…vøÄó¸ÆÅy=Ï3L𞣇” ƒŽ1($’\–Ķb% Ê“}¸b]@f+æÃ*ª®È•{dE«&yÜZ&9P¶¸á†m¨}Þ#-ÉÃ[) n]­`&Œ¹ÀÚlòfpIšêïeõ:4¹Z·žV^¸J‹aæån7›(nç¥z‰„¢Õò,˜l[ÊÚr^bJ±´ …áÔ*b‘ÚLóñ¡TBxÏýèZwRd[­•÷²¡XYfÑ‚8¢å–qˆ„Áƒ†¯ß008°ú @½-±¢íÐåí¢ný¢á7°hG¹)Úѵ”g£´³ñ¸œÇ½J¶íû€æ†ÇÁ½1E<…Kp¡\ä®ÓÓ;Ásk–·à¹iËyoOΠ5ž›}§j„:¸ÅS Ï V–É”s`†q0c¬^¬>$¼ÑЦrî‚´ŽÕ!O\Y6 Ï ŽUürý[ŸÕ½‹Õ^ñ0 S0oÉԦ衾;@³-½6ÎW·N Ö°'«ã4iâIjÏ>OySbÏÍ{S~ßáö÷é[»•Þþ<õfØSõ8NËœ3u1ð®ï#¿T#øiÙjD^ujDŸõUñ )W[lÄA¼š¬ ÿˆÆ1S±¢±¹}²+EÕ:ð5îšcØ!{NYÃîñÛ¹9Z†Â½Áo¬RR‹–þâ­Y–á.ÏnÆ»†´ÃÛéaLÈÚ@fFì‰)dSôïÌaÍú|3«F[äÙðÚoðƒ©oÚÞ*3g+æí³§åEÈhRþ}>}~ú?e° endstream endobj 5829 0 obj 5584 endobj 5833 0 obj [338 /XYZ 38.2500000 66.5000000 0] endobj 5834 0 obj [338 /XYZ 38.2500000 66.5000000 0] endobj 5832 0 obj << /Type /Page /Parent 2 0 R /Contents 5835 0 R /Resources 5837 0 R /Annots 5838 0 R /MediaBox [0 0 595 842] >> endobj 5837 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5838 0 obj [ ] endobj 5835 0 obj << /Length 5836 0 R /Filter /FlateDecode >> stream xœí][ã¶~÷¯ÐsÕò&‘Š3³;úP`±ô¡èC±IZMÐiú÷+[”½–ô[GMÙÌ ™‰i‘‡ç~#õñO_ÿQüó÷âãË×ÿßüï—¯;QÚJtÿûŸß \éÿ.¬«Šo¿îÞ‹÷Ý—Ý—ö¿ï»î¯/iÿú_¡Š?·ÿþRüíïí‡?ú/í¿ðëÎJÛþþ÷áwceû—8þÞþ¯Ý_ÿPü¶Ÿ±_Îsþÿ´r²q{0.,ý¾ë·)?¿ûm÷±CÀ¼UêªÖM]H£M!£Šÿþ´û¹] Ÿ^”‘ÒÖÆŠ% YuXIµS¨¦É5£…?¦_aòJ4ëM~€<8V¤®%={HâVµÇ¾k÷8ýø·õŠÄ=@+=qñì¥3Zj«*³'ôžÈ•sªýÛjÿϲ}¹^Üšz ‚»¥ÙZ·"ÁÇJOp<ûÊ·¬:¤i'V ÉqúhâTcÖã¦äÁ±â >žýËœY0(¤‹ñN<øü¶ûø*l‘Yo?·ÀÖì~½µH©Š-£î¿ðöcñG!¤ù¡xûe×”µªz/Ž|‚#5Q  Ž<Ñ4¢5„ÍÎ_GÁ w*^çcãZÁý™A¹mâà)ã@ÁjÌ!Ì}~kÕÒêE5 4JUÝ—®I„&Æ-ÑòÛ”“ ú2¬æ!d8&WÔ¶_ÊV8xŒ`*#{6è–”U)½Ï ÅÙ•®H‡â<5báH'Φ4ºË5ÖéF¤,+S»vðôLG¸ªÜûng³IÔóGð~ú`†PŽ>À<…UÊËÚæ­Òj`ß0;IÁ°b#bÞÇ‚ŠQ‡¾^K1chøæ0Í k±¥1™f›ÐH ÅJà;‹;Ò! æ"ø}† ža’‘ÌFqó«Æœ¯šdMK0üôÖiÖ~%1l ã-§9ï0u‘Ӝɧ9k©ûU¡"äjL-Vê.hºÐª Úc=Hð˽éè„¡æXd, ‰HmmY+n³‹¥[{üŒ€Ö‘£k²l&#›•̲¹uÙäDdY6)Ù|Ÿð£!0x?¶Dô Ý6ïNb#û(棸&ËæÖe3û(ÙGÉ>Ê"=h…Û4ïNb Ì>ʃù(VÙ,›[—Íì£d%û(üvr'äù¦W9Í®!º*q燫_žÕZ†»ÂžˆÔrˆÙë»É‰&è%­¦AüÁéçÐÆ›Y­ÈaO3„íÆŸAõ{j†žuüà.Z–WmÿÚ£Xb¿ÍCL»¡G‡“°ÚË9b Ö!rê,ƒe8'7bYOΩH8õ@M³,fÈáŽÍçPzærøï*sNÎYî¼áŸV0RLD8†CRø  } ¼qÚ1l›LtÄLe9Û7ÙV8 Åm¤c 'é€×Á·`šàà'kîL2ˆF‰T×ôÍ¢ïHHÈ—·…sn`plê7Y4R^¦ ¼CÄà´*Æ<¦ƒŽ§qÛ=¶Éø| ‡ÇðN‹ûLßþôœ0¡ÙÃq Šyb¶çˆ4©—ÜmƒmÑZ‚yê$VAk8ì •G µ€Ö8Ú„½M\ºŠ)ÝÎ&ÃIØß%ü6F©Ÿà˰ž0æØ" Û*Í´¿7¹Ç%ÄÛÇŸÄ:œH;!'lÿíµP~ŸªZb0W0š9°I¬ÃÑòX×àÙG‡9:ãcp|ߊq¹g§Ä~ú Æwz{ FHz:À˜‹œDðXØ£óØ/çHúíiÏÈnFm!ålè½Õ 0}¢Jm­/rG2nŸ÷Õ¸ñöòŒù2hœ¢`–3*9µ€ÇÂæ pV<¬¶É4&µä©‡C-¬#± sò±Û¤c¶ãdÇ95ÉÛÛ¦˜ºF]ÆÈ½å RŽt*¬³¾ÝªŠ)Ϻ¯ÿêx¸ZiíEž[uÆ] œ> ƒuæ_Èók‘êÑV6K*IÛÔùœ\ñí­Ýc=s« z‘ÊŒÂU.F}ÀÎ"àÜ7ÜiÅé«„ÏàÙ0id„•\TÊ'ñâlFE{„œÌ[,B¼É) ™ÑKª(I_M̱3pÂgb䊱^&ÖÁP3úD·™­Ž*Õ’JE¬Š8+'ÇñX°þëéå:O2Òî ¶Ê.©É°F6™­ÜM—²}¾³Þ¼´Câ;ªYRéËþi¶Ž[ðµ\±1óØZÝ"{®ëØÙsÍ8{‡ã0 ³A8s–†¦Ý¢Lxؾ˜”íhÐ::«Ë˜³Fvö±Î±‰ü0ÃûÅÏúÏÆ¸Ts9§…½ù°KT±çÄUÂÑq‰+£€&ƸŽt-t}F-©:ÄÒÄa{ƒÛZŒƒlYX–%i4‰ü1¹"r•¥ [É·çD»=‡ÕI°W‘zUÈÔ±«BÓÏ—Ï~óvšòÙïÀÝê‰×‹Œ‹]/ÊgÿâR¸]:6…óyÁÀçW²çš=×<× œ¸a )›‹ûÎr>嘭D¶h%bjb½ä^Û˜6UµèÞÔMêÿ»´ý¶¾÷Ôòø¾’XwjsN*sNÃ0º bfCk½¨¾’û³¶ÚŸv?AoЕq|¬N´ºJ熲Ü/@ÉLîD£¨;Ѫ-èKÐÓèD«í¢ÛsOKÎù³åœx°ž–º¹ OØ‘Ü úP½ ŒhñînïI9ÆåÜø“D¿Kjœ;Æ9’Á‘³4,ƒUK*Ù2dËÞ2lTǦ¡/Í’:[ÌšŽ­ÃW’°¤‡%:ÖI¤(Û`ÛÙê;ätn‰+]#ø9‘¾37”È©¯v:Á”FÛjJîN“øÔÓÔW;&¬J­œ<›ÞV×Àˆ§'& Œ¼ãš±žm¸A¯tY™ÚÙ3,a`GD}€¨Ðz3&ñ7£HÝoý  ¥ž?‚éåuÀyªúÐû*!À"Ö‰ËókZ2;¤<±ëWÈË0ñ)$ÁÁ¯Ú/_ºB<Žœ_¶Í¹ 7ìwa”o“ûˆ Rðåíœcýø >c6“¢iÄoŽ/6'.aàèX—'Ì} @ ¾_Ÿaƒ9M–d`Ù +x?;)H“§—ór|3Æõ‘…ðKðl Ù$fchÂ;ä¼zsX$ïóÚΕǑ/%Š#Çír¼6Ž–'.a záëjdlaDe°ŸS“ž^`˜5éF5)û1òÉè±ÛÆ¥NŠã o±2ãu`½|1Ž‹C­è/¡‹5‚_˜À¡–IƒZ‹^T•òˆ‚Zš%[œH0‰M_ Åñ+ˆ~l5ð3Ћ•mÎ6Õsű„Ž-'¶Na-ç6ã–˜2¬N/ûâÄØÇå¼ÔGX˜&óœl&§žQ¶Ôñ…M±8› 0£g•x‘Öìp§ãÇÝ,§+öŽêT“ôˆZËó­IQv-F#!™é ]UªQKüÓügôŒWvÒô­Q§Ùºù¾E ÑgÞ%˜M`^Јï©K-;*.‚Ú3ÿÔ~Ú†Úß nK=jyhÐ3¾{ebß 3EíïÎÓ´?Å{Ë—$Û~¹ô…+zçÜds¼ÔeKú¼â˜²÷7‹Lµi5?ãf‘ŽU©º«@FÊ·x#ªÊzˆSOÕ© Ohûs_ l¯~§¨Owa™!£áóÀõxƒÞŠá.=Ü­4± ‰gƒÏø¾9këöĶ\†ÛÿÝBÜâ““`ŒÈJCfÿŒØcÈûa'æðÚÁ\ÃŒ#ÆrˆDÁÝp½Ñ—ž]D^+téUÃut&8àLI^RÅ—Ýÿì;> endstream endobj 5836 0 obj 3677 endobj 5840 0 obj [339 /XYZ 38.2500000 453.500000 0] endobj 5841 0 obj [339 /XYZ 38.2500000 173.750000 0] endobj 5842 0 obj [339 /XYZ 38.2500000 453.500000 0] endobj 5843 0 obj [339 /XYZ 38.2500000 173.750000 0] endobj 5839 0 obj << /Type /Page /Parent 2 0 R /Contents 5844 0 R /Resources 5846 0 R /Annots 5847 0 R /MediaBox [0 0 595 842] >> endobj 5846 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5847 0 obj [ ] endobj 5844 0 obj << /Length 5845 0 R /Filter /FlateDecode >> stream xœí]K¯ã¶ÞûWx] ñ¡P˜;]d€.Š.Фi4A§YôïW¶dûšòG‰Ÿ)J×$3¹Qä9‡çýx÷Çïÿ¾ÿçoûw¾ÿÏþ‡á÷ßïŠC]ý?ûã¯ï^ÿ@7‡áÏûº)÷?ü²û¶ÿ¶û²ûÒý÷Û®áûîþô¿½Þÿ©û÷çý_ÿÖýðÇá/ÿÂ/»ZÕÝïÿ>ýÞÖªûSqùýøóíþò»ý¯ÇÏŸ6sûÿßݪª=ncâÓßvçcªÓ¯ß~øu÷®@ØWª²1¦Ù+kì^µVïÿûÝOÝΡÖ*UW¶.ùP­O_ªÍ^鶃M9úÎé—Ìê*Âⶪã-~Ú¹4P”©”wqIÌ–G:ǘº.añê€X‹Ÿv.•3nñê‡Æej]Ú#¢H.›Fw®ÍðÏcçj‹6âU¾¬%mQDä§ÇºÊpñÈØn‹²@¦l Œ\–°øñâÑÒqçâPðíY]w·º=¨Ž¢ëò·1‘{Ú¹8TÎÈūǾͥUкåÁv]>Âⵉ'¬û‹CåŒp¼zl„w:`Lö}]>Ââmá§Gcßxu9ö]…-{•µ8„^­.þªPE4N1ì\(=j=‹Ç½ÊȺßz5òWùõò7eLZ:î\*g|Vÿ² ÞJÿàæùæyñåëîÝçN¨ö_êvvú`ÿÛ×_v¶ûŸ£å_šý×÷¿ïöóþû¯?ïìÁšÞ÷uü{ý“úô¤9tÆE¥Ë×O>Àw*øÎ§Ó“ò`t£nž( ßÑá«á½éFr×ø;Ê«Á¨?ÍåF9?ð`Ã8Uõ 0‡ÒVM}ó êÆýÞèïâ½Z;×ý¥Î'}×úóìc#¯F\ ŒýMY±1X¢å=¸eV *ÌÂ0üÜKBÞî<× ¢)à‚GaiŸ¾v",’ô©KGüèÚª8Tµº½¨¢žŠñ¨yÊœ77‡ •âwÞþ†Áˆ1K‚d>L­æ^P݆ÃÏÃæ3Ïî És™‰ÕLžX À–ŽŽÅ5ÃÁ1‡s1ˆI“Êêc8Pô <:s@øŽ­†óÈSˆu ~4"7Ìò!4ç(—2¢´l[ãk‰à/«ÅbVä‘×XòA¦k>B•Šx2æöø˜#`@b`_A Ž•H,Ñá¹<\‹¹;"qt|e='Åb&@òaÍ#›p²xn ÜÁØ„eØ2Ã~æ«Sö“GUV€©ˆ-ª[¡ÝNû¾s…ž ǽódë½'/ðɸ wPÃwr>|2¸!ƒv÷fÌ*¡C`Û4ðɧðïð¤ ~Ã@ö; S<ÆÜOð®ÍKBþ¤ËÉýxà‹iŒ¸Mš¡eŒG¸ëÞMLåR¦1 Ÿ˜6!†­½ÕAcúÝú¨mÛó'Ï`««Ò1x$$ùVÎð°.¢œÍ5£;«~'aîØ$¤ ´áï`2ÀÈÆç PRb¨bÜG²Æ÷Ã:2}oŒd^Ä7UéÈÊO ëc®j~|’q> Ãs«ç‡_ž~©`F`Ï5F »Á>\Ê¿ŒW›ïü¤Dß3ØKå$xØ\mì‚4É*Š„Ãt¼YL:à\1CCuãHXÙ¸²z™o‘DVÿçµpF…ÃÄÙKÚ;![[JJgC$±y"éÑVF¬a¬¼#äö-®xÃšŠ‡Êˆ$@F|Àˆïg+U#zµ.‘'±˜ÿfmÙ‹ÊÖz7ïbË0¿,e”¸¬Õ­üÞLÜПÁ"øÇus†›'JŒ£Jð;8Jf0D?‡Cǃm¹$bÁ+…Ì#xC0€'Í=ê]¶3p‚ŸdÌk„s;Æ©«¢}'ø ˆ%Âòl•4†å™¬då± ·28ˆá?ìé 'žÛ1W@,`Ùä‘ZÄJœDÀÍsçàÍòä¸Ùoøžb ! §H#%tó•¯2_-ùlëóWSå‘Õ…¾eÞ÷œ²ÑûÍûZbc9§ïl=)Œ÷Ô?aà§ŠwˆTç=ÚsØÂF®8Kõ$0ð #¦œk­#è<ù/Lx“ÈçôT*5ÒLœ8CvÌ„(©šo¢P5FqåVô¶§ X\¬U1—Ñ”)Í1jZšv DȆC’ÚðplâN1Uí4j“Ý#SÀd×â×s¹IPÙê¦ &É„°/¢5ªÇòY6dgIŠH¤ÄJÒùëi_ ¤&ñDC¥åõDÔø#fHcD®l[ÄDî˜cè‘QÅCŸ© Fƒ`‡I÷„0ÌÍ96õ¬5äT"Ù§¸rŠ ËRY~~&ôj°ƒ‡ý|¢ÙOL?nëª Ë3¶ggú ïx"³Xßaü# 0qðfFEš’ª¾8GÃkElJ OlâTœ<U8âd§ÊCÑš[ãò«aZ·>?J(-UѺv(…,&Ø#á;¢l½œëŸe™ì|CGXæbz˜?@ÝãobðD¼3’à”W…°…†'p¨µ—‘ nÉ"eÖp•+dÀ[ób,–=¡Ó"+Ï®.kçnQµW£bŸ™£–õA¤"õåãh²9®#!øˆ©˜:óÓ“¹Hä2¥r">_ŠBG‹Œn^Ü€hŠÊOêTU‡³½…Ô©ªR.?Ï/O)Ï¡­µÖ.è¢gÌ5ÇÅ›DžÍòr'CÇ ìˆÌÍ',ɶꡲÅFWB)g%OH4ص†ß9÷ó6®Ó ?yÚbql1¡,’ÔÓäÍŽé·ÕEéJVY¦!:Bá+²•Ê!}WD]¡!=)²­‡ïˆlT9y€­92ÔV–Ï7‘m‹Òˆoq ‡IìmÂÆRõ“‚*\|)k¬r™Ó6®¬ç’% â{R¿p‚<·*¡Ød'¶|áÈ|š*ëOtå<ò³‘!˜îð]—¨¤J*D4†ºíbW•+G‰LËÉDVJy÷KUBÿªDd‹â[ŒéN¸š ²1÷Ži 5÷‹µ¼d*ÂUТµaLL>¤§ £ùô!Ò„G»‰ÖÆ07ˆl[ ‹Á[ŠÉümåpG38¬4âK&švÂ4!È`ÒÞ›Äe¦B^²•ä˜/ósº0 fæš%ŠÛ…"3«`MÚýJ‹s¦|{kwšË*<ÙÌ܉i*6­#k=A·(ùÂjQ"_ÕƒR4 ã-—².s™w¨Â~‰±Uo8·,ç¾Âhaüo9¢jS_€¦*rLiæ(†f‚ëS“×D#àÏD• ‡#ËÔUˆã³gMC”rV„ §°Á8L¶j]¢–[6+ÉÃhã·ù)”#è<Ž"Bªh¢bR_â6–É WÆÆš­¥J{ËPäÔˆ.5]j'R& ¼Ù€›w°„¬QHiþóm‚U7™ˆÙؽm\{‘ñÉ]WB®{!3¶ß´³øGs*E;Q_|Ù½­Êu–:¬(Œ„ùyb”8s—,Ô…NšØ¼÷ìªkšé+Œƒ«LŠð|·;ã™4 ƒrž±³¸Ò´.f6Z=HõXYÞ6z»&ÈJu(Â.¤-5´1MåÜô·ÐÐÆZëò·¥Ú¬jÙûçÆtÁ6Æ!£rž5ËŠÈ]¶JíÀÕ¾@f¡áÌzxF³U”©ÃDAÙòÃsåj‘|3,ûæ­Õ篾‡8µè‰ÅR¡'Nî=ÁTw ¡,0Å×á»Æ;(àýñì€9¼Yƒvvï; |c›‚Q¥Ã7,ïPìZ(B5V‹°(ÁB\LìÂ6^và±N×BšÐqLyV[W 1É”L½ù)Y¸vÚ¢9'ä0®*l6{Œ*Æ ±ÛééððÁ@ØáicŸc»Jw7UqvQcãM3îCÆE‘±ë@aú'˜xoa\gá h•® 1ÊA¿Ž(ë:ˆo¸ëBÝ~ò^>›D–6ÎãÁ&°§Ù(éh”N-[x,›!“gˆZ‘RX¦oœìô›È£¨þ8]S¶§5“àŸvÀ¯TšˆD½ìàÙî}£yÔµûÙêŠo—ÊTÕ"öúɲ €î,q{ Pde°RRŸ”À §•$Ö%DùCPÉô´‹ÜÏ“HÉ£œÌ¢˜<¸Å¾­ùãŸE.?ãåd¸5*œéL "{u‚÷8¹±ØÄ¡&ìä^°ik[¹6˜‡|¶Ï¸éeU뀱PÙ’I™–h•¼ü”Jj’2¡0\(©<êŒ$Àhöª½;û¼ê/=_º!Q¤³¤ú„…Ñîî=©.«G þïÃßnŽwZô·îdoþ½zžGµðIÏn«ƒQÚ¡_¼Z/iŽ~×΄»&W*{N¹®V¢Õ†È{pØû~ÒøQ޳ϭ¾T²C#žii#SYÎhЋ7—”ĸØP–¬;!ç—,“3ERó˦Á® ÓMäfvV¬ q:ÖeŒ¾ÝFXdǺp|Œˆ€2 8.îÉ À'…»öœg*btÒAÃHC¥šÜÏJãâ8Ç`ÆžM=¾ƒ¼' %ä¯Y_oò8(%äí%§‡<æÌž">BÒàwpùŒ'; —¥„ü%ÓÅ$ã×–× ›è¨¢å 8ÓæÛ¤Ù¤Ë åiç8¼@´€#YcœlÚ± ‡jßlD—g¦Ñ”çÖ¼ æ54­MìÖˆÙ™EUŽœËÐéæ¡EÑqj8Ð\²åtñx”°{;`À<@KÜž=›qOËd9w®`¸OcÊdHg²ù®l{1¦ÆZ¸É*Îß‘Í`–U$ƒÃ`1›{v÷Ð5] èÎoʘm²!>‘:ÌM•d+5”¾^©ÎÓi²DO,®ªÁ(\oIt§ÄmD nÌ…«wð;“3ñI£ö VËV’4ÕLà-Ój’KPþ­ù É)ÆÅä_a-Dv¾‡H”:¾¬¬J‡¶îÆÆãä(Ó–™@ȨøZ…sÌÅ ÉNWb¯Êf{a pù–é~E¢> ×I™GRv:ÖÍqƒ22p$Ô0ù¢-:·–a’2¾X¶æöJÝ;ÃÔ“$;­Ô9êi$· ‚î#Ó©cèT†’ÌC¹S?a2L0¶p7 ¼Z‰9{Æù7%¼M&¡„®Ê|(Iö‰lKâ']&¦Ë꡼»œŸˆö¡zÒebº¼Î%Z¾›Q]]ÒôÓÎ?*÷XážÈDûFòÛ6:•ì åÄMF#÷2î‡!½b>OÛxKq3ÛV®p‰ŸWŒZ”$lŠÁŒ‘˜AOõ@ƒ©ñY§&3]³˜áÙ.‰2ܨþ&D K8ûNd¸»H_FC5 ›…3VDój².ÎgÂjLžðG·ÈÓQStIj]QˆõJÜ0–H¨&Ù>M ;‘ÕÇ™ q"²Ÿb Úoty®‹ëYB²"™®ë$ÚTzáb9¾£t&µ„ao¼§*/±¹L®ÍÙÑ• ݸð Úz`ȤùàL>Y #Á  2lÔ¥ö<¿¡òÉ <™ô;Â"¢L ÑÖ¼²eŠL–§G×°ƒ Æxbò ‰Ö£TÕ["sT–º¨î½K¹‘¶È´‚‰ê­.YåòÍÕ%ØXÊàæÚ¸Šš—Á`:"9?ñì7%OÏ$ŸPƒö˜&K8 ×0 2n\ˆWó$S&§×\šžáQg̈CjœC}Ï„þ…ǰMÓX;cd#¦1fœž!¸¢ q²;Ð'8%Oôži\ ¹/~')%]ÛÕáÁŒxì$ÆÉâtéi ©"½`þâùŽh‚«‡úˆá·¸]c{ÃZ¨ìÞ¦$C˜ä^ó“ø9:ÛèüÉÅ'r 3h"‡ºÌP sè™`}0#cýåb¥:iÊF£ ÊrÐÞÖ}oVÇGôdðmÜ{‡™®aÐÞ0 ðÍê¨:È•·ÀÍ2£œ1¸Ôô90ö‰ôr`šiRÓ”6"×÷ad¼|ó¤ 2<» ^ÅÎR]P©NÎÌ„mÁШIçÆ•?‘»•ÜŸúŽÈœçŠ{¤7#!B:LŠÆ7=Šb.P¢ÔÙ|:nDïb)-Ói”˜ Õy¥Æ\º? §Õ¨T±ßîêzç;f*uooŸ‡“¢4eì–´×-p³çªÆÑ‡«‹‹°oýÎ1^ ¾3øgTÐÑ_MŒd îøçâ2H\CØatzHÃ’€6Ø?!òÄTÆ+q þn;‡G„Õ yÞ¸ßý`ê݇Ð[æ0°†yxÆWݼ* Ÿä_ö_vÿBhÆ endstream endobj 5845 0 obj 5825 endobj 5849 0 obj [340 /XYZ 32.2500000 168.500000 0] endobj 5850 0 obj [340 /XYZ 38.2500000 737 0] endobj 5851 0 obj [340 /XYZ 38.2500000 341 0] endobj 5852 0 obj [340 /XYZ 31.5000000 170 0] endobj 5853 0 obj [340 /XYZ 38.2500000 737 0] endobj 5854 0 obj [340 /XYZ 38.2500000 341 0] endobj 5855 0 obj << /Type /Annot /Subtype /Link /Rect [378 319.250000 429 326 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 5848 0 obj << /Type /Page /Parent 2 0 R /Contents 5856 0 R /Resources 5858 0 R /Annots 5859 0 R /MediaBox [0 0 595 842] >> endobj 5858 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5859 0 obj [ 5855 0 R ] endobj 5856 0 obj << /Length 5857 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsËâCl ‡† ä°È!ðf,vqö¿u‹êKú(éS‘’ÚíAv&Ãi²X¬7«Š¯ÿüéçý~~ýîÓÎ_ü÷wŸNyVyûï|ùzõòÚeþçsåŠó—_O_Ï_OO›ÿ~=µøôî¯ÍOÿ;ëó_šÿý|þáïÍ/ôtùƒ_O•ªšï¿\¿×•j~Êoß/¿ÿ÷éo8ÿv™±[ÎóíÿeL®l~cb鯧n›êúõû—ßN¯[,[¥,síò³²ÆžUmõù¿ÿ<ýÔ,ÐMŸgÎe*]Øæçº´U^8§›Ÿ+ãÿ±‹Wú²ºj¾)]7 8;Xüú%4}„ÉMQÄ›ü ¹8V”)Uxö¬¶JU—ƒ^CYí¬+[Ílò(ºMÿ*y¸WÈűÒ.ž=27+•W-Òt^G8“Ûô1ܨxÞB.ŽàÙcxQæ-Ò̈îX¶Ûô1ΤÎU¼É¯‹c¥;p<{æJÿþL®í®8»HE«Üyde9Å¡sãÆªräyú'¯­­ãM~…\+ž¬†³\2 ¥ý °f¿>øöóéõ‡†Þd–çÏ?5À]×l¿}nRœ_]LØÚž?ÿxþcÞ€ò§óçŸOuVê¢qj$B#úÍòÙô¸Î;8[ ?ãà:oág0šØñ¡Æ;Õõr¨sŒˆëÀ:˜B0UUl£êÜ,ß)†C©Š9¡.0vÞ;…|ŠùÇ`êmwúþs#þbK®Æ8[#¹‰O+ Qð:˜ÓïLB&¥ £»UŸ¤V­Á’î¾.éªnÉN8TeqÅB_¸ÌÕù·#yq1YaKWÃãqý3¶™5mîyz‡FT®àˆé/lÑôèKba¸A/ÚŠÌh§¾ýŒF³)G‚ZÁÙ†HÁ:ÿà0fƒÆëàÓÀ˜…g«ðl˜à©cœãsº{V°®·nà[Çû!ˆ ³\€h!˜C-•ãÙÛ˜š-¦òr}íàwK+ÞÃB}>”J]G”éˆpÝáᆠÄìwVõ)èòJ Vw” Z#OåYkÆ ˜hl¤òÐÛç ñ™~¦FŸñ422âÅŸRYQ›oHÂ(4’CxW³Ê c´ë”™QzT:Œ­¡ö„<†‰Œ^[Ý’ª¦¬Ô…áæ˜ß£2ˆžnÈm§{&‰Î÷1þC3FdU eúfÄ”Ô[` 3èZà Aü1ûÂʡȀ*ÅÚ [o¤0ö76O7÷[´Â…Q¥S¦AÜE£/z²ÇòŽtæhÄÆ7uÝ—þŒÙ‹eá x> 1ÑPÙ>D=†€ø˜Ÿ0"^x`f3‘’Pš/ºêÁÎ?Ìw°ìßy‚èƒû²02HEfÊy3)‰¬3&Æ ~“ìÀ¡ ¬„E õVÂŒJ¥ž1Î1"±HÁ4gÓïŸÌbD?¿‚â ò gG×§uÕ7+„…JF½O`÷ù«©â}y¹‡±K48¸Ê„×xÞ5_vU /ž™‹Ä_ò'¼,Œ‹‚ylŠ+ˆù€a1Ϧàëå@>a|½L¤#à„ Aà08ñ^c CÀ$’ÓI Ä) Æ8p %Jq»óÇ{€Éq²éE²´¼KsŽU9yŽ>웞º³€NÌ"d>Øâ0•2g‰´íå]À²°ù&¡¤RÙiÊ»ZœO¡WÐâ } dÑ¥¢¸@jpB9TVjrX>ÌOø„!UL¦§ÁH=ƒzˆ´î€Š“v™DTL¥Ø~MÞ–¥ʶ!¤ºΆ“·qê´lÆ$ô»«¼~ðÌÑy†±šð)à“ƒÞ“ÏÀöàZϵÚMÓ2õDœ&ài°Q…"DAU¦„-#¦°K.\†gÞ .ÂrãrPcЇ¸¾7]€‹:÷QVÙ[Tj“¤ð”å4§nîó"ÒD‰ÊÚ%Œ,ß±/ûˆILr“+pŽ)c._S¼¿g¾¿7ë!àaëaêî|™/»órn§×”sðöþ˜T¾“3±zÅ™”Sw#Lzö¥úþÎþëÚ õ¹Ûª»ðä\ÝE²÷ìÉaO¡`,QIøðäž\ÇMµr8Ç”ž\mªiê9$ßß'GÜJjìãa¼íB×E¹‚.±WvLŠÝÉ™TÅŠ39(×=¼²öìWµë<èÙ?¼²}PŸÊo-S5×SùºæzLí$ÑjnPጫEUjL_$¢”‘)»M܇a \èI4 2‹¶0Ûq©=S9KÕîÎGÕåQ¶IÜ£¤z%ÕÂÀ['ZÓ%,úU—ï~Uü! % 1îõL=nÌJiú¨¢ GéÙ³óT_yÜ}ÇEVû0{Uu Wbjj$ ¤ug-ß›´Ùõ5~BZÔª È=äP:9´k-¸ ©Í-9oç2òò ×}ÊÈ]ÕSÒbÕ…©2ò!#SÉȉ@¦±Q™‘K÷öp´Æ¥J©ÞöÛ¸t $¦¿h9Ü’ê'ñJŽS 7Ðú}âã'¢xø^¿=ªl0’ †¨‹ ïÀñ3qÄï†`œÍIr(~‡ã¢îÉKª3/&‘7@ˆK6 Ø­/q˜ŽÃÞµa:R3Ì&ÑËÁÃ/ÃYE;ãו²A[Ú+¨Ø†cÙ·~÷È‹(=+g%¬MâIŠ$‡êÔ@9ì%òñP]UjÌ5ÝÀmI”6°Õ3jÛ¿}s÷O м+À9¶±±•ŸBl©¼î‡1G¦¢8q¦c(€pJi"Øî*=!çq3‹0lÔËVÌ™÷Xñ®MLb7ù@Ï6VÆôÍÄû‘G4*ov?vÖ%<ºÍ}ôíƒh²,xˆˆFøk–‘üáÈ)¥;6©'l%4÷÷c—ïÕJERÓ¸²'6“=OØ+8$ìËC–¥þK<‰%ûø3s]@U~lkˆòLu{É3ˆÈkEç ÞvM)6æ2_$0.1I ¦=ÿå°€[ðp­„eG©"ædÙ×>T;`£Œb[ºpÎ}™Cè*“ɘØ*G¥P0O‹>X-üØþy*=A4œ`ÆÄí¿» é><,álŸï‡Beå!<1v–1#µ÷ôbj£7ûžâŠ‹äqÀ[?Uã+aGR*kè¥*!¾÷RyÙràí#·ƒ¥¸u cÝ»EÀgÛ̺aÅ*ó$>ù¹ID¤jcu׋؇ Æz‘0âz±Z;C ’¿ø(²K¿ofà š­8PºšCØáá ÜŸƒ j¥jbÄdËÞˆÉD˜™ž;ýé—>jSýÔE_ÿÌoöˆ¯ï8+!Æ¥©-¶„œ¶×ɘl™›*Ö-+Á÷[!ƒ¯î¨=Œ&æ·Þ†ÒPƒCHdÔ,©“ÅÓcI,šÝ)œ•RYK/~À2×¶¯GÓVKîREln Â9 ·9øa®¹öUv/xëHÝ R…Y‡ 1Q&€Mu:¾gãk·G¾vl«ùbÁ±+ ¦©Dª!&„Ië*¦,(ªÞ©R9^©xuŠü—Uðàu”M|ÁúòÑvX¨/2 >'¢Æ^ØX$np.Ò@Ðà?•Ív½(Tõˆ©·ï€ñ÷?ÙRŸ¾þ…•rÈêªîTäjRÖËÆu„cÄ0ÞÀŸ¡Œ#L©Õ%Þqÿ—Ò^¢1&™Ä=Q%<`°AeôЬE$K: /PwO\ܤ²ÒdÜ4&Œ5ÿ†oEž@Ôh«3³Õ&£„¯«Eß}a*Š—D«pXð€‡½w5”+b¹Wî¬ê1:êâŠîö| ®Ê³öÊlÀ3c#•߀”Ƚ!>ƒ×©Ñg|CeUd-_|æ9®Ô‹ó«÷pÄ uüûzefÚe^@ýA˜-Gh8‚qàýlžöÇfç ×ñ ¯ÇðÖ2N•™{ÀS0A€1Šaól¨ÊŽCgì”ÂCU©QzÚ^Ø,ç(ÀÂuúú ‚&¿HV‡ï-$â×TÙýúæÀ¡ô¹ËŸ`_r0a{&(`TŠFB6kš½i Ñ”=Í·¤î%Æ›‡‘ûyTuo¿7ÃŹÄóÙø9ä@·×wË!À/¤XÜ^X´§ ó”v÷ƒ¡6Ñ+4«B÷¹Cö²…éè”ØÇ¦:/â€Ê`=&Î-ߨ©%Û$/0½²ÒK^QßðJû›YL¦æ3YmLɬcØL«Ùñ8¦"#Ue “u+DCå%T¯EUK5jH5—ÿž}#ΚÏ_³eýò7¿œ>¤w±…a½Ü$fm^['S¸¿„x Kó¯ ™ÔòdÛ˜ï íùsa¨ù°S‚p£AW8« ÁKÐ0V½ ,h¾º¢cŒ\®R:g€ãØ*a¢¡[µê¦2Äç£kI »­ú[0¡}/%;¦£-êî1Z¯\Æ‚#0˜€Uµ0œÜÀðLÃx[þG`@?ŸÌ<…ŒwŠƒ=Ì:÷§p` ¢ðÞ Ÿá[j¼ÀÃ烱ƒGö|Ú0À–tpÌÇ¿)I!0<¶ÍÈQÁŸÁû! Ð(–äE:­Wª[ùÑãêáØWw#…ðÉ1ÅPdÀÔ›”ËdçÔs÷i8ݨIN7oÂSÌ RŒSÈ©Ìy `´£ÝRb¾¬W`ž:-h=h(ÕšÛpPr`¯%g ÀíŠ è(‹±NÆúÕˆe.Π1çî•Æ‰ÀØV¢Ô‡aÓ£X«cor £S~†:•,Ç–Í!m«@3ìEa}–PÖTy5Mÿ²²S9ÄU@–Ñ$Ʋ·8F‰ÏCý<‚!ÀÞ öÖî,rð-ˆ¸sÀ/%¢VX:8b±·ÆD†0·×âXBZH!j×ÓÜO€³RÊh]&–Ѳ޽l xtIÈèíý.Æ Ð–ª„bô;#ñ)í’Ê[¬‘bź3 -m·*ŽÉ%„ÇåÝmÀã-—¾¿Jásº‹õbÉ,ÇÒoÒ‡Oƒ;ƒ®IqßÝmÉÆÚÅk¢ç9>“©‘4»«º¸-öBä°íÎÚŽ÷ú½SÛ›ÓàËþMf¬Ëéš<”ƒVoˆÙj4[—ï[ “­}› š<à¡ÎÑg4ÁPû$ß‘ CÝ^nTYíúëÀÏtõÙ#ëÀöSÂu0v<e_ÈÍß íaÞ$±²Wcˆ±ÏÅC?{¼®o,0dú1O$R=,èXE½çÈôöezˆl–Ê-Ûÿ R—H ÷y“í¿Æt€c’þqæû¼±Eõö_†òh´3k_ñ[íûZ¢gu–LÅ­Ù³NU5%ûöTì6í[-Õè“uän¼6Ê@;~$óEmq#ÎØ¾ëC(8a#ú»È®4}8™W;pÍ:¯—cîºÖý]$šh7ÙT\Œ ¤¾yIuŠ(ÑlT?;¬hôöÚ¼Ÿþö•ÝÛ¸DË$ÂSd|;Ù7“„UjÜPÌ;œL“ÂðeèÁ_@,c‰Nôª×/(VÐT7¬µÆ4d|IÜ{ ň¼{"Ët @"‚.d]b|Xâ-xŸ†‰ƒKtŸ`ì ]pÙW'Õy)ag ?g)á<&/ŽÉjí¦+˜lp&ã:°ŒQ¢NWìòG0ˆ¾!|OÙêyœo„q@dÃ3»W{ál} ëq»ìl»ÈüÑê–¹ó,­tϰ\ÄAšÇ|BTÐ1µRTõÌæýh˜ _,/°a)Bu\Áë0YýLeAo] )çµ S"Ógéa% [I;ïã£Õ-¿WàK†g0§S½Ö˜Zlì¡Ã‰V·LáTÝJ|¿ŠïÓPÅs†uJZ¬×ÔÈËöÖ *Øyuì91ý·˜T‡†„þ‘Vkj|“õoa¨‚éèÛ‹û xçpóó<¿½ù:m0HŸ§þ`ÆeŒ#^£L–«KdùZŒòÒà ·pW#±Ú–Ju÷LÈ@#•ÃÅ¥GŠJZÆ.žÐ:fêu ¶~§(¸ŽïXì3H9¶{”sXç áô±h Ï?ãÍsµhë/‚8,Á]~n îâ'&…oÊ â05b…a›ºZÃ7> endobj 5869 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5870 0 obj [ ] endobj 5867 0 obj << /Length 5868 0 R /Filter /FlateDecode >> stream xœí]IoÜȾëWô9À´Y 7 `IV€6CCàÉ$dqæ¿¶XlI$¿"ëëWÅE´1±£2‹¯Þ¾Õ‡?~ùû響><|ùÏé›ûóáË]v.ó¬ýuºüþáõtuv?•U~úöËÝ÷Ó÷»ÏwŸ›ÿý~×>ðåáÏÍßþwÒ§?5ÿý|úëßšþèþÑåürWª²ùóßÏÖ¥jþ–]ÿ¼üü_wùÝé×ËŽÝë0oÿÿƨæ×Œ‰W¿ë>S=ÿþíÛ¯wZ„½¥(tó뤬±'U[}úï?î~j^ÐmŸk«TYØ2»åE¥¾¼)3ͺÎNVÕƒ=ÿ–Ù^EØÜÚ:ÞæÏ‹cE™Bùw?WÖ(SêÜ^úrÈyUéæï¥q¿nû®<Óiù²nGÛËö6/roógÈűÒ8Þý\îü;ùîêòâ2+Q¢ªST9b2kÛ£ÉKù³yÙ=ÂÁÕü8ÚæÏK#ÅÞ\òdUÙ‰ðFôDÀ~OC“Å-äâXéÎï.y¸&Ï[•E ôw»Ç@¿5Ùöri¤tG 7—<Ù¼±{ŸÑ£‹G{Ý>öË*žÑB.Ž•îlñî‘ ;S™NG6ÿÉ£íe{ùÍm¦#ÊégÈűÒø`÷Ï!»`PÚŸoó»çÁû¯wž‹¯AfqúúSÜó;Û?¾6HÉO?\\LÓ¬þxú}–)û‡ÓןïêóÅJu N®Ü£• ¯<„¿Ç¸Û#ZÑÃߣŸà{jb7M<¿Ô0ˆ~!NÎ*¸Û§4ß“ÃÝðŠiW>}mØ8:6fÏæ>!¤¥½EVòÅC¿òÉ6å ó=k–/ø{V/_j“˜kSÊ$£tj™D¬`)’A*Í wcšÇ+ òVVÁgŠpذ$õènˆƒT6B*Y!ûŸ§­1í”áx³xƒwK)/¯,µ¼|Løuùf -ê[° eæ,Æò[Žo=r󠨔öhø ¶«1Þ„Úó=¢6?>9JSA åy¬úsmk«*Ž¿‡}Hÿž‚^RYjÂÔ*¨ÂfåÄê.¶i°­&O €±Y LÕ™Y8°gkÚr§¾ø¯ÎU=CÚ'ÿ±g,ZÑ5Ü-^1çÜUùf¥ËÕœk´½úØÛDáÚ²2g£+Õ,½¬øL¡‡ï±~ÆC‚TyÑ'‚CŸ'ÓçrÞâq“ ˜ò &l‡÷¼ã…W+d†û>ÃBÞvjwìÅoäfrü #¢ÄÞÍIùÌ2ÂdˆsüOñö)-¨ì\”êòМs‚¤3 ALÕ׃=¶Àšë>¨á|èŠ `3ûÀñ±š  \ñp>VŒ.¬Ë!OÉš$9†¥"5>düÂÅïiwSª{h£‹aâ=ž£$øÕ5ædÌP˜œ<Ž© 1†ú*V=†ï5ÜZyo{ ó}ý‹¹Sun]LÑec)̘ˆ—˜æ ‰êyÏËX‚(C|bBóyÆÁÔ.zôòö“-N‡brÓ¹$+Øb®:!Fò[Šipz ¯è­P!jìn¯x7OŠ1%7”·”dxNX‹›¤—•œp}KYJ²Þ$½¬ã„ uK™ÀFO8½xÊJðÙ'Lg¦gaü#-Þ“ [´M;©–\ëkNþéêä´ÞFÿàÇVZQUœ]dá¢>¢gðŠ;ª±Ýå0*БÑ0PÑ’ž²ç~ØCÕ6¸â­€+¾'C°i¸âÈuì{à{<»áÓ†_ê\ ±Ý0®!vô=„ e­†î6~¤ µ«6ÛÍÀ3Å"f`LT ”¶ó<Ù &]ØÒ9üÌ nôãHžp@B1 xŒÜT’U4§ê d1¡`ѸŸç{`äÌÌÇIO"mAE‹!Fq¶Ïj×ó“8ñD?mc`E3¹†"§˜0B¡h”7$퇞–³ÑS¹.{Ê, }Deýç'Ù„sxRšLzѹ*cFH€N©?°!»°p–•Ciƒ!°Bd3ŸøÓçK(O’4•­v‹…ËT' ([2Œà’(=§"s 6%1#jÕXŽ=õs“„ÅjapDØ; ì_Y‘ÔEF*–º0žszç¬ì••ùÉ€D)ìßÔåØL•H€ÄT–á" ¥j4(ÌŠ•LE‘Škr5:ÖÃ&¢AO)Y;›b žc*Î*ïQÏ D~(§„vž‡žˆPYHÉ*Ãl »¡%¬4B¤V@X”ð©ê@&.ŠOð(ç–(çN íëk“-¬ÜJq»¨hÂÝaTé¯l›QH"Èïo2|ž’|QwƒÊ4 XYV±Ç°íÃÞÍ °OD *„ÄpÑ3àuR90ÆP™o!1JÆãlà‘™ rDº§¼(3?MÙ»óųz‰¦ªE¹o©`I$Ÿü•E •y g¸Ö¬‚ ±IAÀØ?+ 4ˆÈ[QcÍÓòÍD8§ÄxÔÄ•É{:1Y`L¶1Ñ ¦¢Av“pü‹ U ”7ÁT @`©RøÔà†5Gš•ÿ,•úg*i&½Ûø¡²J“ÀD®Hcª¡(kRVËîf6‘*ú¤`-‚SyHqÑ )-F°`A+~=YîDrßæ¢jYö˜D’{-ÐàØ¡&¦ƒ1㡨˜,û¥Œ ‰”mÀa{¦¸Šâ«¹K«ò[5—ØQ^“ñ-;øˆq;»Üû S'á(z¼?ÑÉqG„õ¶ëûaÆTuT +ž€TI"-É4•Ü ›ÞUÇšR¦ìRù.¢ãGCÐ,Z¯’j¶cªšªº!UoáZª]ì^智Mdê’•=Vå´)#[ÂÔFÙô†&æ‡)A¬=˜ ¸l =øtß3âêüœÕæ-Ká̤›Œ£ÏóÍîT³ ð)xÎG¢°N¤˜)vY´h\ZÖÌg|Æå[1ƒ1Ç©œÈ%£|yQ÷u!Á[TŽb©¶ êêâ’ J)bòa<6Q»·Ê‡¥Pòì½å'eNgùfû꟡&1Œ$(•¬UOñÉ «!Æž‰¸`Ë™¨ø±", ª.«9lbE» ¡;…5åè%ˆëT½û¿ÃHŸQ=ÃŒæ‰ÜG›¨íRNDúÖ“”›•ÚF¥J6æJê¼ì±3«Îƒ)ær@&¯-z9à1åÈ¢Ì3£dQ„LuYZõ 2&b—{ãä÷g´ÈÜ*¿Ê‘X¥V=¥HÙ:˜ø™Úå£(/Ö„ÀŦFÌç倩V²Ã€½-l9¤JÞ.n‹ÅT^z‹ÜwÁ$˜°©’Šøš°˜qZÕ}zLv8<íÿd×1ÕY5ydkžp(Ÿ)ŸdÕàiUÌâ£uÕ ‡†Ù„†Ys,ÍÓ¯‡kFJ¢D;"z’š<*¡n Â0Â^¶Ã{5Ö2»%f0ÔÕܼhÀåÍØT|ï§_÷âƒ~K~ÇcÔÊKà>¤=8ò­ [xHÿ€è ¸]¤æ0†D‰L´uß[‰E9ŒŸ6“ Ô¦“=;&Fxbs³ÊâæÙQLôÛx`[j¤úP]DÅKãg„c[²J¢k'Séž{ÇÃwW£"ùz7)F’ÚOá†S²\r€ƒ(öÄÀ˜ öòY­D…›Gó$þ§“%^^U”}…·“Ò×=À‚1ÓãrKŸÀÛöå–ŒN–™Ý'§%Û]'«ÿdË¡wS¡LVõ#Gþ ,„iùlR8«m1}ÔŒ4'Z¡¾Iùo]ØÉžuŸÖ‰É¾ÌÀ@áë¯VÈ¡â”\^¬Â>î \+VÊP#UÞJ¥²Ë[™'§’Û°ÜkáÊ=ZQ%ZÑð™ BàLÛ‘cÂ!pAᕇp4ÞM‡ã CàÈd øû>“‡?c,Ä\Y3í(ˆQ'1ƒ¾Ç½'~ÀYý–Çîñ‘íÌM.%W™b‰U[dL Ǧ,‹¸…s©ú@–¿D]ørs&ÐÄôÂ0Y~Ñzp&´á¹v-€'Aá)k'ŒëįsUõ”ârñë¸)”å=æm¦e­EÏì>†?ÐæáúsH‰Üœž(äEÝŠÇT×.~#(Õ¸9¿µÐ³É†ú)”-7ÌÜW›‰2V]Zà1JÌ?£:aœ3;c­PCH¤Ö<¼oÓæZ‚`Y®VLœ‘Í—-ÍÓ“m cRC7T3ÆùªtŸ±>!tyê>E­R™›!d òù}!ìŽsDAÎpû ²«n >Hi'FúQ:°Lé€Îì[ÇÒ¥pÅ“2† h&•‹Ÿñ¤Úqú¦Ú=°á´ù»)Qð࿇€ÀCUøLqá .*€ïñà¿ÆKŠ'ÎÇC!J”0Ä{  ÞáSŒOy A½LQއv: J|¦Ñ`Út'Œ±ˆ¿㊠ÏÙ—Åáò®½i#¦Í@Ø<lË+iø¬èb‡¥xXŠ«· MwXÙ¬Š°ïÁº€Øm~¦D,•§x.þ¨®vÚîtlÃÁ ´¼M{0~Õ˜¼;*7Xh¤€ˆ¯MŸ¹<*5—Oý Uj2=k¬8ª;w[ÝI1I¢‰ç“³`cj—¼ì©—5Ò`Ü)AüËö>í+?½¾R†-wwu‰Dݤ§F¹¡(a³jþ …©n`qI\wSu×ä®ûế’©\÷$Tn³é)ïˆÊqp’ Ýœ!Ìyc…Ø‘ã͉Е-ºþ¦å›ð÷Ö6¿­XÂNü¸D¡Åa€…98"$Â4ìÄ[Ju—O*ç™þIÜ#/â” \¥&ÅŸƒ‘å=…Ç4öx‚Í86ƒÍr÷LiùúzùÒS¸–ß¶æ‰*cäñz‚y‘E^!Ät<¥ºú7 ÂKŒ© h1¶£D¯×ÂI ± Æœ _•Î%Ã{šš ?ãq'SÒ3ê- u_Ñ%rdžr›1;Ž;sIÕ¼´)­Ý­]Ãl uSÝŠG&›aòŽãë¥sFÜQæÙ»ZðÈIf\|\D.yÁn÷]¼ÝÇt¿ƒqÏ×<ƒ¹xIx7O`Ev63Þ9ÕÔmF{‰R¯g%á „<¿RÅ‘ø=’¸/rpWå yQOc~Ë]LaïIØù”_˧2Șï=I{|Zð„=gŸ°—¸¸–Ú0=3Â<Ï„édfcP=±ø{¦úâÓœ°.n9áuÕz¾C€©jhO,–‘D/=晕PŸÍê[õa‹k7Bb¯„úŠn¦šÝô)á)³kýÜŠ-?…µ:Qœˆ‹ =Tºbëì}YÌ¥V8“”sigpСÑÖ ÑðÌ"J²]¬Ì»xC -8Q\V)û–i¥r'¢ÕXÉ¿L AKna7¢áB*æâ›A^g­qƒøtÉ[Ô(þ#pAuþNe¼’Hªè"K]$:WOÌÒ0ò¼æ uSêˆ:Ëß2Aå€-3—Ý ³C˜9„XÓâÓÂùˆÍæjmsÕÊ& AŽód;“T«¡(-c\'¥òk[†çwÂ+Mµ]‡o_Wj&FãñWåqp¦9Õ9z2I;ø< ãj^j2/”V9>ˆQO%@:)b/ï}ã ¼µ:©zôÞ©¢}eqEÎSçŵM{å8¶R:/N÷;ý\ÞÈ3xųÛ#|¦FÏ8£M™óàö_ßÓ’[y6Gcç~iëg£tÏUrW«ªsÞ»ŽÕþR A¿TÃgêðŒ•(Œc³º«¤ ÚOegͯð^ó¶{«Öžÿ{)ø8R¦$>ã)¡%ÊßñiP==‹_’½·fÕÆbæxŸî©/ߪ¯TO#› »ͨ!“cEÆ¿0MøÅi—'š(«#Q6iyfaò˜tp'3aðÄteª5iñf"Ju$‹{Ãt£¸†:¯{:Iá<ŽÆàŠß""Ä–¨ÔXMŸIDËBeµí›KËQfƒ:¥JDîtˆadnb²5åC¾.sg…ç=Ë_#>y¤ñãdJUÓèØT#~zÕÃÜN˜8nq‘ð€/b²Œge>ª—G•jèSY(:°R$d›Ì=}DJßt–¡é‡ñ ¥<Êùʇa$Çât·Óúؘ¡Íj`D`‡š‰Œõç¶†ÈØÕ)å¸F»ÏpmˆBÊ×e‘ÄÐó –j&ØÊä¨D‡±Ë^ Gq6Ã¥øä°áÀÄpEµÚPˆŽ…Lµ+UOk® c"ûmVö_€ü_<Űê€óïr FƒÙ¢kv™lÛtìY$ƒ&夬 ~@x‚x¡™IL©Ã- jz±hÅ΀l=Föõñ´÷WõÆÍïÓ÷†n¼dõyêÌ »jŒìŒ2çL]|ŸÓµsÈ•l¡¥ÅB9B­+©»»³_­´ò²®¸ªk}.úe¬ZAéûˆÞc¦m ¶'÷¥¨v{:¶/Ç€í*’èhgưE;ò ïŸqd«‚>½|![–à.o îâ'&WÍmFžÁ²Ç#$ŽOˆp=¸«zd3ü„Äi¹‘³òœ<¤#aôP2|ÞÍCãøKqbC ±ã|™W¬Š=8`oâ¶23g'©ç±Gò¾š;©Ž>Ÿ>ßý•Ïͺ endstream endobj 5868 0 obj 5364 endobj 5872 0 obj [342 /XYZ 38.2500000 133.250000 0] endobj 5873 0 obj [342 /XYZ 31.5000000 82.2500000 0] endobj 5874 0 obj [342 /XYZ 31.5000000 82.2500000 0] endobj 5875 0 obj [342 /XYZ 38.2500000 617.750000 0] endobj 5876 0 obj [342 /XYZ 38.2500000 448.250000 0] endobj 5877 0 obj [342 /XYZ 38.2500000 231.500000 0] endobj 5878 0 obj [342 /XYZ 38.2500000 133.250000 0] endobj 5879 0 obj [342 /XYZ 38.2500000 617.750000 0] endobj 5880 0 obj [342 /XYZ 38.2500000 448.250000 0] endobj 5881 0 obj [342 /XYZ 38.2500000 231.500000 0] endobj 5871 0 obj << /Type /Page /Parent 2 0 R /Contents 5882 0 R /Resources 5884 0 R /Annots 5885 0 R /MediaBox [0 0 595 842] >> endobj 5884 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 5885 0 obj [ ] endobj 5882 0 obj << /Length 5883 0 R /Filter /FlateDecode >> stream xœí]ËŽìÈuÜ߯èµµÈä0 Ì}ðÂÀ`ðÂðÂ,‚%x¬…ßÕ]¬î¾ÉŠ,fTäÉ$‹H3ºœ"óyžqâüþù÷§ÿüÛÓï¿üò?O˜ÿþå—OÕóÐUçÿ<½üõ»àÆçùŸŸ†±{úÃ_>ýöôÛ§Ÿ?ý|úßß>ðË—>ýÓÿ=¹§:ý÷ÏOÿúo§?üãü/½ü ù4ÔÃéïÿýú÷i¨OÿT½ýýåÏÿëÓ¿üÝÓ__ÞxùÜ<˜ÿÿïšÆU£{ÆOÿöé2Íúõ¯¿ýᯟ~^€¸¯ô}[÷íSÝ6§ÿ™Z÷ô¿ÿñéO§\^_=mS7ƒëÚÓ?O};TÝxúñi›ù?ìÇ÷òõq8}ØMÕS}Z/ÿ㯉^¯yWµé^~¹|UꦯÃožÚº^6úž“u^ zæ:ýú¿¿>ÁË›jJ÷òבËWeÞÜÀÛ•›Ûv—Ó_· –èýõ ^Þõ OÎëÈå«rÙ\üöÓ/멯†±…ÿL~{<}¸¯êþ¤'êñ銒0úòi•úËC¶/ŸælºÔuëº+_þ9æì0ßÍ÷ÑÜqOíÓÒä¹ëwNX.î]÷³uí•wgX¾ê}ùܼ|uuÚøôq ãÉ4ýe+{ÖU²=óÞ]Òžucýôq õ–ö,Å=»vÊØ°é<åé´_ÓeÛØ, »àŽ]tÞë®]þ_òà ûþÓ+~h·?ÿúé÷ßOKÿôëŸNêûuÏûõ/ŸÚÓÿyñô‡éé×?>ý}UµÃ?<ýúçOÓóÐw½ë^×ûü¤ê_ŸŒÏãTyO¾½>éž7Ö?>ùòú¤}n›shåýÉx~Ûût¯ÐaN ž:5\7Á·Ýúη_O’è¾Kwò*pï\Û{¯®æ‹÷:šj¹Œ×žLðÉOðIÿ¤ýLŒà zRÃù8ü6Ÿà±É6IÏædtý¸‹CêK|ýk|6WyýݼÞàºMK jêq ©áF¸!x=}eP@ ÚJ´¸±á5`tÖ¤øìÁù'žé׳Q_~ô®±/¤™´âÉ6¯y„`tþòŸÆvX˜vÌu…–Ø^M–¯g„€Í‘­¿ÂÀ¡¹ó’×Õs?Ô?ÞZ`g'THãÔù6>¾„B <|4°(ÄžB¿ßûåÎ~qÀ'æ§õk¢µ š*°Ž„ê¯?ûCbŽ\¿Àå”Z08 „ zÞÉ®3¦àö\¤Cê¦Z¸ŒÄ‚P“#,úÀ©'¤ÆRP»Ôë}‰oN^ÊÀµg^¸€óÊÜ/¬+õöÚÞŸˆù•Þ¼v¥a4]c•amÈŠØ6aâ-;amâÑ3Ñtì%a1!µw›Áßv%îbA\Hi”.`‘16<-x#²M”ÁX¡1N2¡”cÌ|&ÆÓ¡'L`£þ~>:ËÀÆáœätNˆ!¬ ,msòíOü& xòüñGlÞD({BHÖ‚OA%T›“«=µ8ÒD>–V³h±Ïø%p°”é¡¥f,¾ 1æ@Dè0ÂóÂꆕãß0*·È¦€ÌÅg©ÀdÚçLnJD„'´Ñmÿ¸1Iì‹QQ{¬¿¥Vks(ÐÕc’ ÄÈÞM¢.¨ ’UÀ Ý¡ÍJ×À%Â5—’0ß'Ú¨|2c¤a!ï›91Ø(½þ·Œ:^%>©F–DbsøpdÜÔñéNîñu³Ç÷A7JE“6DbŽ´ªHÀ‡ž1…™ ÉìQrcxû”LZ9úÌ·.þ’!Vø€ã”n­O“ó´oÑ! ÔK=£ +OßY­K¬½™ ÐMѱ˜Xܪ‚ âjÍp{µ±u¬õí¥é«ã;ƶµiã;áÉvµóŽöÕ½O[mmj®ù_ç›ß±f‚‡T,R*â­d2lVÖu×ó;‹Û´3ó£Åðy#Ü™À…ÊÈ04§…³aä(+©ÍæÚ0}Âz,9pe•K~ÜJš$L$qÞ‹¢*[õm ¾ÉÅä*æÌ` ì7›2ªìj3Bx´ N}2tf·@’ì>sL‰+€bác*õ£nBf ]Ù!q«… lñÈ?Ð9Î!H¢îcâ8j§| äwh”œ~}㉱}e²7g4F V‰ •‰7‘½uS8Ъµ}€šÄ ôg쾯ß}&FoE^q¼ù‚Ã(?^KàTtú¦ØËÁT×ø:l·± ^;+Á„@˜á§xyÍÔiEF¸!­ˆ‹320W%¿xñ‰ÜLà˜1&S\ÌÔfàù(L>Æ ¦†”¢ ó…Db¦ú¶`cÜiÂê£j„ý´6¸A~ E-¢ K1V£è´UĨ5N` }T”7ž,\L<ÎÛÁxãN+Ó)E…ì7â”n²¬Ü*J,Ï3­ÝóbuCQsÑß1qØNT¹ükÍâàÔƒD2 ÄŠ=H&†ºXb&3½ƒ)CVÝèé9¦Q“IM§µ~ßc$,võŠÝ-$£'ݦ€ÈòÌKT€+¹†_†:Z÷¦ç5õ!pŠ8Û$fØf­Mù•¨9G]ê]ÖfM`$ÆK±ÕAäe´cR³¼âþèáþáa®mØ?´ Õà9f_ƒüP±¢®Óà<µCv¯­Ö²$%6‚²_˜:pÛt–‰Ž$TÆO’ž0œç—Ø Áf€®3­õ‡Gbɸ ^ʪ¹Bã.-ƒ¨^ë«ÀKvS‰VÏôcï‹¡¡ÍºµMg2êT t@[ÀP²›W°‡FUY1»€w›ÀâP»Ö>)ŽÖ¶/ÜTÙŠ´ÑP`l·ì¥”á±öô燳Ð7ûåX£}{ ¶ûfçj‘âg¾5¹j±ŽîqµÓiaÁÔë¥,"‰¹ÝÕCFÐ0ÞE ÒÏ() %ý£˜—vèšÚSpõ_»cü¬šiØ?#„+À q—\­69T¾Û”6› 1©{*k•’Ë0mû¬ÞS†VDz³~^Ìêžâ8æfbYG<±ŠIǨÔ&±Å%·`ˆ$î•@U™j³3¥aASr/÷­§s^‘.1–=!q+ ¥ãÌH\Œl3î -Q`”ã‘«tß×_’RzPÛ‡Ñ%ãTñ–tRˆ–<Ô—§¼pYìA»7Ø‚i7˜Úç@ìIZTYðbc+/_;ôY1úŒ²Ï¥ÌLZaAÙ¦LcA)µÜ] ŸE” (Ýä}eØoµ½T)ø€šY¶D¼IÛĵ¾eØÀW&oSŽ»Oð¥cÓ¶» ®±Æ"•q­°¥ÎØÖsãÈšaåU`Dê"퉧ÎPÂŽÈùHÓ¹ùKZnVyDÿºéö™Ä†'ãañ˜¹”ÊÏy˱l³&â;+…ÄDì¤ý#Ä ^³#Ó´¨ñ6áµÈ-ãk—P?bqù}û”Á×‹ïø®?µŠÀ(@uÛÊeSM~hÔÐ¨Š¼°8£¶¥,sà ^¿˜þSJ‹_²ñoœHÚ e|5 Z§ ±»J¶Ð'Á´uNVäÐËÓË¥Èaƒøå0îU™FÐR2žly|…[CÕÓâ î#ʱ;ðYD&«kN{è‹p‚”~®¦%[¤þ9̰ÕfØ®Âý)Û¬ nŸ*ÖÌxßÇG~q¼äM2£;qÄÈ;I\ ™Ý ÈÏX n Ì€ºÒ!DÜ *ü˜蜴ãËR×2Œ¤ÐFf³³´è^RÇÚ¢{Ó‡»úÒɇY»ç…HÆË®5S¤À¢3– FÏ”‰‚*Ü-m¡™ö01H`mD-0S-ûr~ Q¤ ·U4$‚Ãc¡ “ºx“™UÞ0HZ=yÚjÿ#úzÔÈŠYíñš ¬ÿ­¶Ì*UAõ~¸S -ù,†Ä‘š—}—ôiì<峜£–͆I¹d§˜¶B R9ÙŽ —ÄB,@uŽ]ó”#PÆÙLbÿ€Rk›„ÃŒÙJp)R¡Í[î£A€¬¹Ý Fœç°±*r’ø×Î_\ª¤GR¹/y >§…´%Œ XÕ™ïˆ!? ‡Á4i m¿Dqýà¦b+å0s_ÌimÏÄéQbýnZX)£“£¯ÍŽt缈£ÇX‘ë¡Ôœ[#@žU5¨–Z6pÖ÷¦¦ ë‚cùV‘L¥Ä¨™ˆ!i–o§󤥹mí;Å)¶`*õPÕ· ?̦†ÿõƲc‡äš9VÃEZPðõUrŒP]7¿BŒ&cÒ2%t$“Ì•DÄKÊ‹sc³lN%»·^È„wÏà8b1¸CMµØà%­ÍuÞñ)ðzi¤ô{œ4Òz¥À™UzQð^&ÌgÕQÝ(ï´— Un «hF»bÛ.%T£C5úVXÉQ7…ÎÜe¼(åÒ†}KC•‰¶T›5 Ù"ð£p{š¯è S8!.óÒâß’×"¯ïØ‘ ¬­–‰‰`จÂ¥àHZ^x^9¤­yí|7q=Ŭ«ô6y "Ã6ݶý Ü Ærž ¹E˜áÙÜáeŠ ‚Äf®U2oÑ%¼ýMÕû×ߊÐH‹ñSòÄ\:¹ ÏKdc܉å“-ô›1ÍÄïZ¿7h!H mü( ‘¤}¦d~ÊÐeçòØ¡’1Y­Ú2ïDÂZ¡k¨$×cQZ"Ò˜°3 ƒe€ÅÌ)–r¿ç//6«¾+ЙÖ"軇ûŸÖ®}uiåÇ> Â_[¾EömÚo·’ä-˜å§ØË¤’8¢‡·„?™ºZV…—ù9VX£\h±ƒLKwïÓÍ™2::OLZ¼è¸Oǧzº67wŽîöî­mü÷ËÔÎÑ›ÅIºöd˜§æüϬ¯ü? ¼ mB¿™ ߺ½Ä£ÞTžÌôE˜úðl8‚ú| ‡çfq¨'ô›Ùóºò·z™Å|œƒcƒk0K”k£†3­¿ÅçQ¿ò¶=i{ø6¼Û_à|Î+Ú?7¯WlÝêà™â݆{ŠG€OȇÎ1S|vûS™š}?\>y¾æQž¼–09"ðAEi˜l>žFþˆÄ^4K]g¡ %,æE´Ð ÌŸ´Ì8ù)ÊS7¥fZ¬7Ù­"ŒÆþ_JE1µ¾¦Ø N&²š!60 Õ=^ÑqZ­Fuå`@æ2À¸1ûþê$#xؘô,>ï AË@P~Ë甴˃¯‹Æƒ1gâ¶ÜÄóZÜ l`g·ÓŽ VU޾ (µN]1A-úGL·x`ÚEçî–¾1ˆ¡ýmS‡Uð¤?ÁÊЄ| `£·E›¶i®¼-À¹þ²ºï«wSké0VinKyºŽòÿ¾¡…Œ HJ+¯Ž´ÿI™Gh„þwÂÔTŒqdëd$Ôš½ó ›ý›‘å‰ô’<‚¥)‘ƒ%NnI+å©ÚR„_8irM$Ϭ¨ŒµÚ$Æœ²*§Á† CÌC8! ´ÂÀa¬æ–zœúˆ„7•è "(jÖÈ}pò—|­”Ž6К6Ð1š™»ÚìÔ®Kø Ö»RŒ]†Wé.'R‹sß[Y@—k„D'Rc7#VŠÞm]!¡Þ8Oª·WõuœW¬™kO*øä;|R£'¾­ià“6µú»´†_©VƒïŒXìáyíï¢Þ¶Ö(çñȪKBÁ»Ma“B<¤D ÍL]ïâÿQÔ‚ æ"ŒÛ`Uô‘¸|ÔÈËÚ mwDhˆ Ç¢j6i’9}œÓ7еoŠmÁ„S{jânÿJ^Ò†Â*7gE¤Âd˜rúÃŽ:ì¨ÙQ7##)ÃMí©(s¹§n;p¥¬<%[”6£è‹Ò–“Уm÷be'´Ý‡s¤AÇiÍŽÀ¥'.0ÕCcŸÇ,)ˆ§|ïoK'˜!Ð’Skq”7±^/3Y»e’NêiÛêåÃ8hý4F/ ×Z–„|˜µ[/1 ö+41 X[ùS†R»\Ó4K’Õʉª&ÿ<í$J*)ƒÕö,L‹na¦$ꊽU+ïk©ˆÂ]†Öª7@öK"i¥p#ú ö %-‰ÛgO€$9:)‹,‡…õpn#Q©º!#ÁÆøRã+Î~9»n«–râi,b$“ªØv€¥dT­´T8¿e@LÚA~n3øAMÀ툪tMc¶„z„­HÓå ™”ŸI–pΩè%o«„ã†)þhH̳Óð˜!Ǻ½Üˆ±ˆéÙc‚` j¤šQ›È£k]ÚMæù ªK{˜¾¢ùKù‹$.®:Oʆ'øú¶-üÍ7ø–·ðI΂âvrÞ¦7ÀÛ©÷¾¹ÑêA&´°{DbfSĉ „¥AP³.¼>ƒ‚å ª/"ø¥ á¡XE¥Ìblóž_G€íCçÓâŽÂx>øÖáÝ™%Œu%eWà;cgqtÕ[ËMÝMŸêéjΡ?r¬Ü„ºz>×,.ãµ'g¡Ø=;¿p`VW~ƒŸà·ÍâÿÚo&ô›Ù,¯Ý"*Ô8ø¶/ð \Ùô}ÉÚy½çæxCÿÜÔÎóÜ8ÓÏðmz‚×àlpõÛæK2<7‹H[Ï~×mn˜ž<ïÝÕõôãâ^i-hUi·L¦„MYËLh¨Û&õDbˆv®þGVéqÒÁ¶¾ùRy¯½¤5>Iø3ÖAÃa¥ÊÒ2‚âf0bO¦ZãÓ»REÙX^ñ­™7Ö⤤Ì|”ù©­çWàa¨cѯ¾¿D%‹û†ì)åKY²?øñÉO1[²jz@‡” Y pýÌ*ª°h$žàbÍ#“ .Ÿa1Æßá­Cƒð]3ÞvYŽÐ‹¡^®›ÖÛ™üW“aF¡ä0ó¶X#>ëÉû¨SÊãƒ3†å´ÍTµYf®½‚ë(ÂN ÖKŒÇˆeLZË;¢^s‹µD);éU •Èt ‹ܬ `4b w¯ÁÖF›(Ó‚èq¥Y|fëåUÆ’ŸmP›aL¥‚3'‡ÚÛ‘ÚK›6IÛæU§µ(îmöðL! "7Ý¥¬Q‡í³«½6¢q:£j¨°.§kÑoÚ IÑìø®:®[Š´Ï•„Ek ¼ mtS)l^F„‰¬”#Y‰†4Tô”é°5$Qåg–âĉhg¦ZŒ‚ž‰°> PQ‘#¨Çfä0C BµÁi“nP "i+åbÐÕ ²Ì;'Ô]5øÊq›åmF?±¿¥Õ&iÉCcjZmZ¦í.m“ˆIFäÓ&8] ¥‚ÍifúQ2o)#Òcë©Â’Ís&ÞŒýÞ’s» I[ç;öîSPG•‰x3W\ÂýËp¡Hµrª ô¡¿¶~ëIŒ÷Ù‹Å‘>¼½ÂjÅ”¤­ó7¨$¦°<Ùƒ‰¨ µžSª«õÿ‚´õªË±ÄI‡D¾£™8ɱÉx´¬/ùóyÃ7)õSíéÄM[òÓ<áùÜÞdðÕ•eLv«–iZK”¡p$ÒíŒÈÃ×o‚`j~<¿øm>ùßgx[…ÞÆ|g¾[×Öí3ñ|ÞðL;øŽ ¯[Ü™½ñé ( Ý1¦ðžä[ÕõXáÉÄø"4ŒÈd¨ŠéÜIâüî_à3TŒÛlê—Ô÷Q=«v"ð ¦x´`î=gF±¥àåÆŽÁ%­§l LÔ‰µéƒ\&~±\õÜöó[«ˆ¨)± ÔâWTV5"š¡ØIª´“±Ñ‹e¯ŠÚž€¤JAè”eÓxª01³ÖaàÃ,†hS‹† ÃÚRJkÆ,¤–ËÔÌÑf”0¾Ìõ$Z{¥ñŠF´‡g›.Œ~#Ž7Ôo¥ÍC> TÛè/‡ô><«¦”i³—bjg"<â0`ˆ!“Ѳ")È0ÅÍPèÅèƼ"d±<ÄÚ¬âŽ0 V —fÓý ‹.bÝÌ ¦o%c6¹'*Æa õé êG…Š×}ˆ¤ #w7­ÓJ©ŽõhaŸ½3yÉîÅ‘¦ÉiÀ'ꬶ0¶—¿µ‰¢ÍÀy#$¢(]+‡ì« ß8š?h/‰$`¬~©ÈDÔ¬:{j]Èev“°º$5Z†1É»„½‚:Z$˜K-.a³7êÚ½˜ rŒÀ6+Ηîba¬0þÈb¿àq q-^Ÿž¶Ùùgß ‚—«$C«‘¨¼ƒ6-ˆà¢ YbU! Ÿ‰›BFÄL™p~ãìq:×J£§{a°ƒEcoܨÍü£Oì2•ýtsâ´ŠT`kÝ(Š7éP×1êšéÃǀѥXÄ\<{õv(.³lHZÂ6³ 0±¦VZ¿u‡MZ_°ÐoFk/—y±&R(ဠÁ`ÆÌYŸ© ¶”eIà*Ìu¥ÖœH¦Í9âL|R´F4£*Z’ˆ3ƒeL±¥ÊÀ¿"äí!%…e޾r4j‚oÛ2ÌÅ4˜Çr,:æ{'Ä%z¿3†`¬v_d èÌs“ÍÏÁÓX¬Òz-#ɵÝA¢d‘ß(xJ6´3¸¤­¦{o#ò|­ÒTqè<¶˜öÈ”±˜¬a/¶ pIòíÚÀ»´ä1Š,ÆžYÇû´ÖD6§¤šßBŽ3|ø¤ŒžŽ“§ ¬µb`˜áªS` Ã6¬mÊ^2Ò<@7%Áð1@ì{"Œòßd’IôÛf£@OÞ5´¡m}'[[†E6ÖŠj8E±]àôããá¯IŒÇìH/FJìKX¿>Ðú(ÑæôÁ±nk F†0–€UáŸÔ~ÁG`%ÇŠ„ÜÔ3ÛËûy¥z$1g\z*© Së¾¾:]Ì›’j†ÅÚ¤¡Ÿ ™d§eŽ™$’/¦¤Ø{I‹±¦KIœÒ ¾nb<5-W”G™6£fÕ]7ålL¤›Ã1‘Ÿæ¾aì­‹@ŽÀ@mX~÷ \³ x:¥7V7­¯òÒ$!²±¬Ž­»\"ܼ–m”o|ØKuIDÒžƒjâ”Z*&άí7¨íú!¦ê$€Û1\«ÒÅO 73Ê/0È–Ö6I„(IÛ'ŒùÉ5u;Mž:+ ¼é³Ñ¶ñ2PS9¸)¼éÝo»øyE4Ü¢`%Š2t1›¡ýÉ 5p¦Ü])ÈQŠGu0*¢ÜZ÷¤ú´Îžú\ì«Ø¡“Æö´,[—ÚKV jâ†GVe þ;¢±#ÂP´ìz„V.8ǼÍÜojç˜Ü›™cs}}ÑZJJr£Æ±Úm{oŸó7î«RlnãïD44‹(Ü#évÃFEÉù Üsu/:€÷õµÈ ˆh§EøóÃ94eNÒøCÖ¦L®õMlâ8‚´¦$ÀI=ø§Sš…Ç[Sšp´Ð൨#BÉ݇׋öL%Y–ˆÐ…K©Q¸¨=O°nŸ]½ºÃ''…ä*¹ÑÓŸ%J…"`rVfíYrõŸÑJ6 ÷>t’¬Aèp\1˜£·ËšË`*Û}!L™—®é¼ cL'˜ÛøTOWçv/Oîí“ß/S;GsñÚ“ažšóC@ó¹¼òü¿Íõð7Áù¾„÷¦æGÉò½Í9ô› ¯Îy{ëþ²ó¾¨úN=)©»tà8ž¤Ã5/|G‘švŒ‡… Ý’ i=¦–x™ÕêhHLÂ}µI܇ë&a‡3–@ÈJÁƒ›RËŒ§fJŒ9hõÀ†ú”e# ü"iŽ+¸Ç›ÎT*i1«mZœ±2;½Q¾Ðv¹$â ¢LÑ÷š²L?yÐŒ”g}vˆAAXj>Rh>f>RZã8[t [Wd €ÃH”0ƳqE7Œ™Hð@%˜ðúä7ò ²Ñ½¿¨›’0Œxçw\…m~x¢¶¥œ¤–ØÈãhûy‰«ˆ¢µM>/ S9¹ÿ%–ZˆÚÅOb%§ì°2çnßõÌî#êP?£ÃXŒÑóˆHÙÄ-µ²û àÕ´ÜdÎÃ`ªVJ+õ´äOû†ž¾óÍÔ÷Ð5Ïuõ ¾÷󺻧¿ž~;mcp—¾õ/¬Ð ãµSМLôª~ m=¹öǽ»vÆÏ«0\Ñ·ç3â.µ²žœçÚ/Ÿ4óú<÷‹ª…Šß¯è;Í-»ñÚØ¾Ï3EmŒ±1ÝúÇ ã´ûåçK€å>–ÇW¦Qã·ÁßÌš´Žšúð~lÙ÷òϧ_6®ÞN|ê/³u°ü Ö$øp|…‡ã:¸µ½c³ü8’Ù]»²W‡ç¨†c œdøü¶ÀÇ3Åù"> endobj 5898 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 164.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_1 >> endobj 5899 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 147 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_3 >> endobj 5900 0 obj << /Type /Annot /Subtype /Link /Rect [60 757.250000 112.500000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2 >> endobj 5901 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 114 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_1 >> endobj 5902 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 130.500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_2 >> endobj 5903 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 112.500000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_3 >> endobj 5904 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 119.250000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_4 >> endobj 5905 0 obj << /Type /Annot /Subtype /Link /Rect [87 721.250000 153 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_5 >> endobj 5906 0 obj << /Type /Annot /Subtype /Link /Rect [87 714.500000 159.750000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6 >> endobj 5907 0 obj << /Type /Annot /Subtype /Link /Rect [114 707 153.750000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_1 >> endobj 5908 0 obj << /Type /Annot /Subtype /Link /Rect [114 700.250000 192 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_2 >> endobj 5909 0 obj << /Type /Annot /Subtype /Link /Rect [114 692.750000 179.250000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_3 >> endobj 5910 0 obj << /Type /Annot /Subtype /Link /Rect [114 686 180 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_4 >> endobj 5911 0 obj << /Type /Annot /Subtype /Link /Rect [114 678.500000 205.500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_5 >> endobj 5912 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 201.750000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_7 >> endobj 5913 0 obj << /Type /Annot /Subtype /Link /Rect [60 664.250000 141 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3 >> endobj 5914 0 obj << /Type /Annot /Subtype /Link /Rect [87 657.500000 134.250000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_1 >> endobj 5915 0 obj << /Type /Annot /Subtype /Link /Rect [87 650 129 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_2 >> endobj 5916 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 175.500000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_3 >> endobj 5917 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 137.250000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_4 >> endobj 5918 0 obj << /Type /Annot /Subtype /Link /Rect [87 629 153.750000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_5 >> endobj 5919 0 obj << /Type /Annot /Subtype /Link /Rect [87 621.500000 114.750000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_6 >> endobj 5920 0 obj << /Type /Annot /Subtype /Link /Rect [87 614.750000 124.500000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_7 >> endobj 5921 0 obj << /Type /Annot /Subtype /Link /Rect [423 442.250000 459.750000 449 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6 >> endobj 5922 0 obj << /Type /Annot /Subtype /Link /Rect [228.750000 246.500000 259.500000 253.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.php.net/manual/en/function.dl.php) >> >> endobj 5886 0 obj << /Type /Page /Parent 2 0 R /Contents 5923 0 R /Resources 5925 0 R /Annots 5926 0 R /MediaBox [0 0 595 842] >> endobj 5925 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5926 0 obj [ 5897 0 R 5898 0 R 5899 0 R 5900 0 R 5901 0 R 5902 0 R 5903 0 R 5904 0 R 5905 0 R 5906 0 R 5907 0 R 5908 0 R 5909 0 R 5910 0 R 5911 0 R 5912 0 R 5913 0 R 5914 0 R 5915 0 R 5916 0 R 5917 0 R 5918 0 R 5919 0 R 5920 0 R 5921 0 R 5922 0 R ] endobj 5923 0 obj << /Length 5924 0 R /Filter /FlateDecode >> stream xœí]K¯ä¸uÞß_QkS#¾ô‚Ý}oÈ"À ÈÂÈ"hÛ1Œ#m/ò÷#•HU‰ÔÇÏ=¤¤º5 »»ô )ò¼Ÿ?ÿÛ·ÿ>ýÏ?O?ùö¿§ïöï/ß^ªscªñ¿Óðç§Û ²=ÛŸšÖœ¾ÿþòãôãå——_úÿÿñ2¾ðíËôÿú¿“<ý{ÿ¿¿þø_ýÅ?Ù‡†~iDÓÿýÛåï®ý¿ªéïáú__þó§¿#ºéìbæ¿RJUF ˸3õ÷™âòçŸßÿþòó¸i³Ôu-ªú$´Ò'ÑiyúÇŸ_þ2|m±òv±ò¤Oá‚LJ‰ n‡W]ÓO0-•e`¡¥^ûÛP]·AÚmÕ8E{º°íä[é=4m•m½±sì¡iÅévB±Åæ€Ã¥ÃáÝÀn\z×ï_ç&+»y׃Zšë.º_´<·µýþû= ÔôäEhÑ.ló¹ÓB4µnª÷°FÓ´Æœ„쪓iXÓ]d¼"ßà—•soŠPµˆÎx²Ôv®£gØüFÉ*ßà—•soŠ=Y<8çÉjQçÃÙëè96_÷å|Xy&œÅƒsž¬iÚŒ';žcóëAÉ5øeå¹NÎy²TOv=Çæ7M—qðaå¹NžWvkÚº„ìÖVÚÓž_²ÍÍðu>ám\9û®X¨ GOÒQðRÆ+ƒú!BËÑ(• a†qO¿O¿ësÛk/M5üÕÑŽWû¿ºÉ>f¯|©Û³l[1=ÕÜŽâ~sôÏÛßzxíä¿­‚9úï{ñW¢Nn¥ã(óïøþòחϘí‰öD kÚÈ‹Ÿ}ùùkO·êÓ¯éo]aüë×Iõé§aRœ~ýÓé_úøü¯§_ÿö"äY«‹qxn¼#/wÚsÛUµ4·wx¿óv¹cÎJ¶bvGàwôåŽvK»¹c.wÔÙèºmÖ­MÔpž/h©ÆÝ©Îu#†‰®wì¾ ·„ïàyD‡ÞŸÆU¯ÙʵþðxgñþÝþíמR\zÉÛ‹DHi‘\¶òöÂÜF±ð¾ÐãJÛ¦ æ‚àBK‹ãÕfàR‡Ý•ïýK•Åôé)Õ͆q?µEâ邺à¸?€ ¦‘—i拞Òóaô|š¿öß_šTS´BOý¡´‚áI´ðŽNï#4 ¿¿cžï~GÁSˆ¬ð¥øQ«û4i@€ ü KST-o/¬&JFyDÉè%¢djŸZôW¢4Í–P)‡ÛwLR+¢a5σ…±¯–‰uDm.¥þ%"•CªFÝ^XT²óJUKHU¤5ªÌpbxÊ"Æþ´Ó\‘J¶KH%}Ñp%@ªËSz>ŒžO³)R)cStµ;7µñ€Ûn0-䊩¶€j U=@Ü…ÕP©[*u·•V-­V=ªá) un÷³õ R7KP©}Áp%€ÊËSz>ŒžO³)TídÒ’úÏË’gšk¡IõlœLjy{a5$×ɽ†¹ÉƒvbEÓÄæ ºn÷³ñ ¹®— ¹6þ4µ !ùò”ž£çÓl É=«»«b2·¹NŠì“8†qŒ1p¥ NW€U[Ò¦P” (s°°Æù´”’·V#~[{ˆß6Kˆ(·Ò*·3¼ž²ˆí†q?kñ[³„ø­¯ªWÄ¿<¥çÃèù4›"~'Ýq ˆøU1ÇÂÂØz‘+2è÷G#°ÝB}¶b®ò |'2¿çŸeÂþøhEç\MÊˆÛ ï°„Ë#U¥N¦ÿó?¿|.Žvƒf@;%\ÜÊÝ>ê"æXU$Æ£ù!%VB–5‘)!'.dn/0@–”;€,uŸ¸d6Šfæ ‘ÕI>¬¾¦Ë‡qëQU9Ÿ‰VõíTÕb¨ªïŸ"{1‡®÷4Š „r'¼p…@ï`c/Iåyšµ2çêÑ•¼½À€LuµdªÛ'2•B¦f„w8TwéÛ 8Ôt;À¡¶¹‹Cq>!ú#¶€YA¿¼:T}‚È ï…ÖãyH&>‚å•$àÂ};b¤ùh NÑlîÂZ¨®¼p ]-…kèÊ×®øÐËS£sÆýôÂ5T·®¡:?\c¸â@ǧô|=ŸfK¨®\¸F©ºÈ;„Ü"LÑ"Ôi½‚©DHŒø¼–O†ãûÚÞ"÷Mvp,oáÝÁkƒÀ$¿@k&æëíу^ìÚNkSÖ•óë1ÿÁ]xwtµN.´¿eµ]­¥ô"Ÿ‡+~tõ婿vûK¸8÷»]ˆ®Ö¢ñçM]=\s+oo¢«¯sl]=”ô±'Œ-˜Óñ ÿ!'ŠD0´S‚üðS²¿0Ä«†»íQ–`QÄ‹Å3¢6øð ÖúÆ q-Z9üN‹ÑÒÊ‹ÑÒj)FKk?Fk¸ÈwzŠÑš†q?½­ä»ÁèêM£Â­ñ)=FϧÙT¾Ó.F gE0•ךW*ë“àEñ¨ïÄ_༞"ËZu{a5þ/²L›¥È2]û‘eÕÿê+¹aÜO/²L›¥È2müȲáJ€fŠ,»£çÓlе‹,‹8¼•e¡k‘%ëîöÂj„i¼ˆ,Ý,EdéÆÈ®ÓLYÓ0î§‘¥›¥ˆ,ÝøYÕaš)"ë:ŒžO³)´." “´1ްJŠXµk•›n£%¤V,4‰ÂÖ1P Än§°±NÞ^XMÐ:ã´®^"héS[ÓçŒ OY‚å†q?GÐ:½DкÀÛ© ]žÒóaô|š- š©\¬[Jžÿz3|„¾”ò#b”¥¸C)aqXÒÈ¡¬FHSM…ºêöÂZ„4Â+„dÄR!$#ü,7#ÂBH—§F„›†q?½BHF,B2ÂÏÙ®ø9>¥çÃèù4›"¤œØyÞ´¥ˆ´€±™ÕYLŽ`4h§ÅêRÌ„œ1KJ×#¾œŠ a¶îÂjÄW^±!£–Š ™ÀHeTXlèò”El5+6䦹"¾Z*6d”or®ˆ¯¦bC×aô|šM_Mņ`Oh±%|P\‘yÕZ£›\*q{a5ìéÁžQK°hŒ5ÐÌ@gxÊ–Æý”ì±{Æ77 WØ»<¥çÃèù4›Âžqñy‘·õ¦ùù ‘êzàwþžd 7S…ÓÜ^Xëݼ{èÕúC×ÕåÌk1Ùþ(±@˜ÛB¹žÅí“Àæ#Žy^}… }QB7"†%Š/‘⇸‹éwq†äá­X­Õœ«NÍ׊¡–~ѵýòê=px* /O/%‡b}‹$Bª€&^ ßS†R\”ZÞŒr‡´>lÀ~ñÄ ùYÖ {<ëPH–ËB‰ù8•Ò1¤DgR#oý‹ieõ†ò’cù n$+¡Þ5Ž?Ú™DJŒž).u ÖG iK0¯’Ì‘”‚<ÙY¬¨¬-à†Çn.1I‘NX®iOxgÖëCI:F!f¡‚ñÛY}”¼¿¹„šîRI_ÒÉ—ÄðÎ]i®”Ö÷‹G?–òÌÄ`†/¥0Ës” Ýá“Ò¨&!’[Bé`DÑ  lX~õe“R¢©&>Æë½ $ºP‚(!Ì”PiJô Vlå"É(Xg`­ Cñú„$â°¤JS5BM{’ù’W†dE,’Û1!¢‹µŸ\JlÔ!¤^¯‰ÈP [9ªdõ—ŸKRÔ¤„”L&Y#ê"@B V,åhy‰G > Ü0ïÒæˆ¹}ý˜;Vþ¹V’ÜKðø)(³tF"Û²H"/PŒçŠJJéFŠ’F‚V‘0R§âæ'P´#vy¬Ï÷ ͬõæQ|”c=ÇÙÞ Ï¬æµHSX©šóƒ0§¦hjº‚Ò<¯’ع(š;«v\ª¥B%Å—@Bzг>;ÿ¬iuâŸ;$u;4“’jȲj¯)ú ¥Ú & øNޏyàZT¨hÕúð?’Ïî|YÍl¼ß±4déNGûŒîX ^ºß©ð<Ÿàhšð=ð^þžÈî|…ïà}kàΓ=†QôTÄ>Š\óë%ŽbCþ(úCòÎ(Rƒ`jŒð)ŠÈR¨®üž£Rž±'[*ñæë·‘«öÒ÷$çNÕÚÛ)–2o”U’®Oé§¼þ3´.€ˆFûGs¦*·>)!9Ñ" ²^ß~”BnÑéåá‹DeF R[- ‚a!/™¥d$Vmk|r›#Ÿ"/Ïèlç# oiVs’¾Lé ‰I6Š(¸yI©í«1ì¹`,%ž‹9Fࣲ„R‰py w?åfjwv=@(7|ý8mÐvë·ÛÝX^ß¶sèZÚ8_(™ £NZN ð‹PKw^ _ "I 0Ñ¡*åè´+¸Žý™k&nˆM’X#YœÞ¸ªò¡’õ\"Ö^(„CEwе‹Á©>PQœ2¼Qkx»uê‘Êæ˜V–5Påd­Ï;äðxa7;¹¦(¥,@B)Þ¬œè.Ì+Ø×ô瘲«ÀÚ–wñ;ø{ðª¡ô,³KÏmÕø$#ð”dɧäð%„…°ÚUHi’ôªÍ9½BûP*v%á ~f­™\,¾|Çüž±qÏØ¸£†)e#8øÚž+>óÙ#ò ³ÃÕj¾­LÆT,¦S쌘LEn–/jãŸÕ‡úŠ5½ ŒHK5I"l>¯/R[¹pPèãH‰pw•ÖŸàÄ¡X7ß!KçŒü4Ò§åMI¨´¾(E±N©gOˆ‡ˆ6¿Ìðö\åQ5Š=—=(u¶¥Ê+0ï(¥çÅ]Í›„Ž×¶gÝ–·+$¥%ç^tÚ­¼SÍ+ß}8=t—™.Bˆ–®¼òdî zýVÍIE¢8ŠJoW$0„âÎI yûµUlv÷"ôÚ‰RRx8%ÉŠÒÛqý9MURû±8ÄHB¡ÍHùÃc+‘Ø qÌŠRN›Ü,•òQ¬ç,Ciƺ½Ú¼YB àÕ'ø:)¶_ \…ìÒ[l¨Uí±Ñbtzs‹ †‰„*Ñ{îų}Uäbáö„öæÌ%{`ü—r-Ul±²5wvH±I®* -Ù^[N°C$¤Ö$Äðø’êvÊ-.–V¤HK^c_çóÚCIÔ1÷ÌÎ(‘1Àæ–ÝJÖôäÖ°yˆÌæsRO^J€ EÏ1($<ÔnZÖRÀ«ÜÁ3ûæ s+Õ]}‡U±UÈ.Ü¿àÕhÛžkÁtÌšŠ™Ù?°Ÿ€§”¨Ñ#D³Të-Šöˆ·!¢ SxkˆèÙÞ²y¡¨§Ì¥E·iË\Y¼Òµ£ØÆ#Yn¸ %ÓOæ¦þM#½ýˆ(£¯l§"ÅòÆ=¹&gÑCÑø;õ0HòW^–úT’‚ð ußÖ‹)*ã#ÜHuZO ¸êü5\…0>',®ÖÜoÃÌlß\ö7(%2ëÛ:Z0ç™Q´¬„°xLª±[Œ÷Ó -Üù†—·–n4øqŠº>`W-o,K^þˆ³Jz (%P‹j›û»(ÏlýrÙú¬žJT ¥-©ÓAÞ!E´®‡.RÙF–{¨»ýUí)ÕbŸHÖØ £ÖDUu>S¤„Ô–â¥òŒ}ä 7¡ï…É©P3)¦¸‹TìêâÊ¡ÍÛ‘%=quib ‰¾1KÈÇáåØÌ•P Ö†=«™¥Òóv›¶I"Ç‚ËQꃑ)–Ëì¢x}÷¯Sdµ 4>Ë¢<‹ª¿O ‹ªoŸVò,Îd#]ïsˆ>‚ñŠS Æ{N½0ºX² Í«>ðÚïŠ93Ô´ôøÜöj‘x  Aêú]È»™ÆJ9AIöH픋8™’-Š8KJ{|0ù½k7T¸y%:’Í£ÝkXÀ:(§´§"jlΰØÚû¢=ëÇ{fq¼Õ#+ $°ü~º®ígT,ŸAUå‰$Âjìz[¥ÐQJ¯BÎ'oýSR Gàuöш°GÝý:®HÕqqBÞ¢„x¨wà~N“eÀt?œ“×l–ÙçH‰è 8tHÜ RÝcÖ¬@æM jÂa‡·ÝBBŽ %_%K³ ^Ç eÚ>Ç•°ù|AíItK,CZ¥¦ž”šQFéµãÑ^@ëÂK¸ÍYúF^æw:ôŽ­ Ô³›Q¥¿yçšòëIô–VPÃ;o„Ñ*ôŽ„wð—ZÚž´;ø{ªÏð{à<‘=Àïø^„Dü¥ø…×6Š*õY]PyÕhøLEß9…*·ÌhEFYÕn£ ÇæÑ’BžLž‰ÜµgºÂöé ¥|å/·ŠdªÝWÊ6d.mçqã¡ã©]Éæ573Ûb˜-þ l€ Î&z ¦JF¶¤$¨C!uw À³ÛeãÊFK‹Å v`ù*|‡dÆ+•-ýÔ-k–­/tåŸÛ÷‚ã-_úqê îÚ#Ï‹ð¼Õê ø ?1WãMH‹¡xÈð.ùÞ ÞfK…eäö.iÞ_0}Æ£±»å $‰|)«ß$!çõÅsòêÖx€µCUã!®5d7²Ã¥‡×ìÌ›H*Ýže¼ýŠ9¢÷·wåZoVZ Æ w]“W‚£ ߯‘$°H~ã"˱ò¾–07^-󤲌{¾cë.PŠI&Ícà<‘‚š"ýRIÏÏð{Zx¾SáyàDJzâïwð ð÷Dvç+|ï[ïÀR¨\†ʾENC"+.P`4‚Û”â²oðÎ+aw „ൠ½Bð;ø{ðª!Œ~œS¸»e¸k×솓»Fx¤ªîŠáSUŒé˜<6홦Edœ;Þ=ˆ`ÖsGcÔå3ÿ¸}¬ÌÄ<¶>~…ïÀ¨S£)Ñ Ìñ“79È~…«†ïDöà ½sèÈ[—ÉÎÙÚVùs&Dörëö*ôzny·3µ¿Ñ¬^êˆEà»­ò7wì:“ †_h=•ÝÜ¥Ã|‡·3(vM`à¹Vi¦o`Wm©Ma£8ž#*^ ‡àѰÁžJÃ/HÎ+ Ä^ w¬¦¦šZÁ²Û”ô¹beØY wÍnŠM”ÕæI;LH{%–Š” ƺ*åÔ)†ºgh§ä«ñá£(¢ëkûïÐ0PcƒWq!Ù²ì£mÖwÃù6oBÊ(ÂmFJ5³3Êi)šb7¥”…Û*cÐŠÒ ¬NuèNÄ%€{ÿ­g‘v°¥Šô%Ôj¤”Á¥Ôwd­ñ]Ì D’g0 mÅ8‡åaù#Eg©"Íêg㬔TÔ¢ËÈÄŒ‘WVq@‘ E(í±ÀˆV ©&á ¢´_‰@gëù$¤ŒG$Â#vzØh]‡÷©Es{á·—o1&üSÛJ#×ÓÏ/·ÖRøs>˜“Ÿ™"cLFíI:;üÒ”š“¼A…êj=C.ž!œZ¦(ª&àŠ,-ƒY‹æóvq#UªXßÉ‼j/`Õ¾sî–P?ˆ± x[¥iïãϡÒñ)µsIeŸ±&”;Ø[c ŒÚиÈ3är% I»ƒ¡JA¸V„$ûÈ™Â;x4MøR| ”${ –D`ϳˆÏÏVëzªµû†$½÷çMw¢tŒ/¤ë½Ã6“—¡ e¼ƒä倖"åÔí}OàU¡šêÇj Çjð%)Q¼Fb^#'¥90«Õnûï‘“£äV³–V,ÑÂEùÔ”’éM(‹)Ìœ ýctúRlgôZĹ옖ó¦?Z’öÎZ*Å,"@ÉÇLAÉ™†WùÒ~–°ô̹™2øˆâÖ¶Íò¡æœ³ëùcÞL<^JÞX‰È º}ãÅ– .n*é¾óFa–ž™³´CgµÔS˜så×~Ãa³¸“>J,:QôTŠ`N1,qÐÜí{kQºÈ&$0ZQl*”žž¬•æZõf[ÈÎã`G3©Îòù°Ö3Wé*”å’;1µmé³hä*0àÍðØÊu@b€„ôZJ뛲S4°’A5©çëÙg€ ¥+À!û³PÂz®Þ9«‰ì+ù íÓF28ps?-ììŽEßc-Dœ Á‘*pL;Z¨yPZ¶û—%XºXJ~©3ÆÖ‚©ŠØÂjOgΧÔH¦TY Òç‰Gò¶“LžÈS¿=ð;±¦%EH%( î_‚‡‰)xs‹'‰£'0/,_Qüž”Ï`5NàM `ˆ)Á |.Ëö$õbêèÕnÍT âëDLôÜÿäº,…wì¶Ôç:èÈó ßéÐ;ÒvYjPßñ¥µuðŽBóXHZ›ë˜T_Wû W<®Òõ'Òç ãÓ-͹kýõã3¿¹[q4ÞõÈ~ÍÍç­êÛ­¨J"³yë\’üc¬ñÐÇäW”Øf«áh|CÙbÞøÈ,Y[Z ' SB SÜ<„zfÃeøà"ÀòǼÛÖ7LŸ!Ö!I6Ô/^ €•¦ï0<«T @¡‹-™`m¦ õ üx.ü]»=Xø)¥vö!ýò”ænïÐm2²ÏΦ¯Þ°OW"nI ÖBØ)¦ÖõT$"Qñ†H—ròl%_+quDŽÎÛƒÄù>j _ ™TG"J9<²xÞ·LÜN‰Î™’ß@ò¾SH¯—Ÿ£Ã(4ÉîÉ"Ë'p‘„:õ¬Ò~æj¤ø3Rê¯òÖ.`‰úÕÉQ0t³ú‚î®m–3æÄvܼîG©0§ˆ‰ÒC†mÚöÈf^ß2X £–ׯklû$PJÂ[ÂFÊ&¡¸¹RÊÂ+!Uè¥wð> endobj 5927 0 obj << /Type /Page /Parent 2 0 R /Contents 5937 0 R /Resources 5939 0 R /Annots 5940 0 R /MediaBox [0 0 595 842] >> endobj 5939 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5940 0 obj [ 5936 0 R ] endobj 5937 0 obj << /Length 5938 0 R /Filter /FlateDecode >> stream xœí][oãÆ}ׯàsÕΗ‚»Þu>0v>}(6M‹ êæ¡¿´HJ6©3ä}3¤´ŠÓÚ±<Ãáw¿Ïû?}ùGñ¯ß‹÷_þS|ë¿?|Ù©}]ªîŸâåëÝë_˜fßÿ\ÔMY|ûu÷\<ïžvOíÿ?ïº_þÒþô¿Ânÿ÷sñ·¿·¿ü±ÿ£—?øuWëºýþËữuû“:~ùý¿wýCñÛËŽÃãúüýïwÖ:eÜË1fý¼^S¾~ÿöÛî}€¸§TU£\Shg]¡½3Åÿ¹û©}À°½Ú{§u]¹Z]ò ÚtO2…6¾ÝɨɃ_BÛ'Ø\W:Ýæ‡“‹CEÛöÌÁÝ%‘k´íTN©èr¶O°¹­\ºÍ'‡Ê€\¼»$r]ã;ù2„Ž»§Ù$$œÃÉ¥2 n.‰ÙÊ–=x| ™|Ú>ÁæIȶ‡“‹CeÀ-Þ]¹¾¶)‘{Ú^~s¯«„ÚüpòdÈÅ» "×=Pûƒ<üOÛ'ØÜš:Ýæ‡“‹C¥Gn`wIä–/Fy:äž¶O°y•ÐTîNž ¹xwIäÖG[ÖÚ ªšÊ¾qézwrq¨ Èìþ³ >J÷à«?~üº{ÿ¨nY_jwxf÷ík ”²x÷⿵šðëÅJÙÇ?_Þù}eÊáˆÝ'êüä#úD×è×(x]ÁO\üרÏ ,ý>Ÿ¿¶d’ÃZŸú![Èc°ÛøÁÓ_àµÍøO'¿À/ìÐ'½09÷<|’å€Åx vò^ðôÞàn1í8ÌîKW5õ¥#CîP.÷Ö4záƒM‡/­öU­_Þcl(j=¼á‚5pM ;!|zjm c®m Já Ìãrö•eNLcP÷†MóŸêÕ0l°1D8AØÜµØÄæûö](³"ðhVã5nC>#Å6n˜.1D0]b— ÂJØÙ"ÖèS9æÀLn%uø¦%>”iúÏHåÖ˜+ rÆ Û2-3ïó}PìŒ#hý`FØuU¾µ€(Ç™pMý±{5kiL<Æ "LÉ€E¼Ü'Å.c"\4ÂäǶòÔ‡"°ašx¿!@ˆø9È»ºûÖ!àà7†´4uÑ29õ¹|k .Ê}SY`„cáëö›¤ÔP¾©¨@Dfr<ÈRXðPÒ˜ˆ5x ï†Ùï†O@(<ç IU‘$×ô]˜± 3¬`—‹¤lä­¡4îHH—{åíÛÃ~€»õRß ]ô>ŒÕ%ØRÏq%d=èþ¿†"¦Ä¡v†¡…c¹òôP'zW¥Ð‰T‚I×áÃÂÝzgüBG *pÊi‚k‡½Qo£ÏyÄùq«Ûë'S cbJé5žÈk‰zfrmÓc¸QÜ‚©Šð±þ¤LWÂÍ…uú¨Óeë5Â2dÒ¯Û÷úâN;=Bžù©ü¤±‡é™­Ü›±÷Ó—!I­ñhMONÚ Øi· ®9%GÃ.u ?1:ø9ðÔ=ë¶¾áÄÿÂÏ騴Þ[ÐÚp¢x7ü¦ø}0…ä¤ïOÙŸ‡ÃLüˆ…˜‹Ó|ÌÕcœLóöæýÊ6N æq’˜)Ú½KE—‡3(ky #púLuÄÙ LˆË«—„¯†[«Â*嘆¤qÇr¤b ΈM¢ƒì„3ÑH†ÓŸË4˜SmñË4Ô]‘¢ÝðLÍ„åîÜ)),ÛØ2±ˆÑ•(:vL8ÑŸ©WYön„AE[4j¶PzZ_OX2.+a7ú¤˜ØÞò+•ǨI§fz1·ÝáÌä–£¦iƒ9‰!´T¥†T³DOÃ%é¹ÖÐÙÒF¯Žeâ÷–Dµö…Œ-^ œ1î‰v—@s¦fEü>‹¢[>¿¤(sæ:Ì[–(Gg Ï”°[Ø4 Ñ‹™-\“•eæ ½XÌLó0qt@ÂöJ¾` ãçd¢KÜ8µñf¯•¾DZŸ¨m’ãS,¦Šõ)–hÁí‡ëK_¼&p6L;ŒLµ0~„¯¸Ç¼°º®ÝDC«×æY#׸µà¤ÖÏÒU®F2¯ý‚q°"‘ç+šù¸è,­cZ¦˜9—“lXxfžþ«/Е÷a ê>,!³n1U5ÿÞ¹,ÂÕõ}À^&è¿)ã+e¥Š¦Üä‰0¿Sç©"^ˆ:ÍÑœ…á×à!+XþS‘ZâlHÖ¨„ôÆ»e‹¦^¥7í°…oh‡·êèøÜuú¦¥ªœNŸñ…m98渿¡.÷jÔphíï{¦#n¥´*"@p/!¼ŠÂlÕN²7ˆô­gQ7{ÀSÇì™71³dn.[^þÂt£bq¹.¡f$âú &·)#L9Ò‰Ù®¥—Ú$;~2—ž‘›X”;Cˆòˆr4P@%Áwuaùɰ{¦ª:Yû`C²}y.3ExXÁU¹¢)&‘yC¼u7I±Ú€€n_t¤ër…ÁÚ1©u¿V;Äk‰>¦! +r¥Õ­?æV%)Gg„ªÄ$¸íʪᜩ—ätá'ZyKµNyoqeÇÅŒRÀ>a¤B XÍ2~_âq…¹†{\gGV.‹)Âß凕¤Ty¾q(SúDÝ$w}Ê¢tc`%Iê§Œ 5¥„@&8’1dÑ &  Û©«¼ªùHæžèPB|ØÀÅLðH¤OysÃ{„ç2mT8#¹æKæÉú1%ÊŒT&<ÊÏÀä4,s#.d˜°.C)ÄÔ0Ù @40S"o³C]T<^“øß¬5­­2WnN÷Cwº6uÃ6ó–/¢F[E$ ð‘˜Éz¢§RcG3iDfö6S^C‘ cÏ–‘l„ï#ç²ëneÆàC)uU=QV”™q'Bȳᢠ–@y‘9.Ë’‰o¼Â¦ìu|«ç`o~€ûu•òD”OEèIÑñŒôEí›M»9éFî…ïqñιþ=.ðøFÓ¯™ÞGòª4|S‰‚k :ê©öV›³~MÜ}1ð¹nDñ¥i¦€ZÜÃp+fðG\K܈6Í·1§Ï5ÙZ¶ÝæºUçV¹† ý«GYÆ)câL€Íb#«}ÙCÞÞƒ”Ѝ/ú=i"FÆú;1æs]t²=õ"sÿ hú)Û *>#•Ô”Çej¤ê~ S-@¤x(nÁ»áZÝGW_-v–s.[Ù ^ï³ÞUîékY0\©ãy2Í/ÁóQ3eˆ™·Ùæ±àî‰MÌ$«´Ÿåº-χ<‡h¼ Ì1Û0t˜Y¿[~Û²óû 1áÒl|ú`e›Ùw˜ý$}\³òÃ%T[¦ !ÙæõÛu,[ˆ”í>ì»#P´Ôî8îö> y;.Bœ€ÿ®4×Uù–Ë£°%kläry.›'›ÅI.0—[Ášc˜¡XxjSŠžm4Ö(;KcXÝiL|”´èiƒC7¢×26F@ÊCl3áNÙ U`FÄOàÔÐÊa.èÊ^„0`F±SŽaÌa«Á)aŸ2CkIJÖ3usÍénÄÕëæúdhTÝ\“ŸvÃdÓ'øÔøM;°×{ úãªã |Îg¸VááZ;£¤ˆe&&åW…¦ZÕ(T*®ŠÀ9uüœõ#3÷B÷1l³Ð=b8SD”Š0s=rõ~ßj© ÃO²Ã´"È-bìJïð\ÆÙTOóq%ÙmGúmý®ì+ýÆäƒ!5Q&Xe0¯1–3”åð݉>Ì5T’G ë3²`ÃxÚØ`Sš±™O„W ¾EW•à$NŠ÷¥áÝlrÊ»fÝ £¹&½ª©Ó«`Û@‘÷݉q@®k&åÝàÙ²Áãª~7!Ðæ0sJ®AÏ¢£\’\ ”ògFX¤¦ÐJ4¥PSh#X’©K,B#b¢#&™ÚÈÌõ†RMËú -w¿YÄz9X[˜ Ï¿Ÿÿr]†‹(ZoDgÊtˆŠ^‡wsRŽ:¨c?=e¿.:0Që!´ë»!ò¯~ñËîK@K¥QoÃûWê-ה߹z¶º/oÊVëã¬Ibg‘‰Œ0žòBå¾=ñ¦8÷O ³âüÿÃÀå@½i- Àb>O`·WåíWñÜrSÙžæþ`hΪöÚJ¿œ¯0Ç»à54|¹©¢é8ÕìM‡º 7TÓOúûZÃÇh¨ >¡çعð¹³=öo: ôš»×nLXmUÓìÕN9â°Ø™×Ðx7¸¦·tÔ«¿j˜b îåçöÄ¢1ì°1I¯ $O GxÍgDìÂØƒgÓ¯:fPXÓ ëà5ø9Ú£5½ à–…AX3Þžç ¼ýES+»ï¥í2ÖÁÒÓ¼šä>«RžŠ§Ýÿ~Fž³ endstream endobj 5938 0 obj 4351 endobj 5942 0 obj [345 /XYZ 38.2500000 104 0] endobj 5943 0 obj [345 /XYZ 38.2500000 104 0] endobj 5941 0 obj << /Type /Page /Parent 2 0 R /Contents 5944 0 R /Resources 5946 0 R /Annots 5947 0 R /MediaBox [0 0 595 842] >> endobj 5946 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 5947 0 obj [ ] endobj 5944 0 obj << /Length 5945 0 R /Filter /FlateDecode >> stream xœí]ˎܸÝ×WÔ:À”ERO àîvÈ"€aYYžL‚AfÎ,òû©*QÕmJ‡O]RÖ3ö˜-Šº¼¼ï{øá_þ~üçoÇ_þsüfürÈNU‘µÿ/¿~xûº>Ù?«º8~ûåðr|9|>|>ÿ÷åÐ>ðåñÏç?ýï¨:ÿûóñ¯;ÿåö‡.?ðË¡RÕù÷_o*uþSvûýò÷ÿ:üåwÇ_/3v¯³‹ùþÿ0&ošë2F^ýrè>S]ýöí×Ç–ao)˦i²£ÊM~TM®ÿýÇá§ó ºé³S“+U•y•Ýó¢JË*ËÊó$úüº¢ê½çúKfvar¥Êx“_W.MeJå\rgUÙXòƒú·é#Ln2‘o.+§J··xvÉÍ5…i ¤Ë2ý»écпTuDι¬\œ*ÝæâÙ%7·l²˜'÷uú“×ZGäœë¼±N.ž]rsë*·'W×1èßMþJÅËו‹S¥Û\<»àæ*­«ˆ'÷Íô&7E<…Þ®<ÖÉõÌ.¹¹ç™ìÉÍ#ØÊ¯ÓÇ YDäœëÊÅ©ÒmnoöÏ!³à¥´ܹσ_žÏg¥<~ýé¼²ë Ûß¾þrÈÏÿs±ð³âøõÇãï³L›?¿þ|PÙéü-õÙͽüÜu$+¯#õ©n²RÙ›‘â:bNE^^y3RÁgòëH~ÊMëK¿ŽhøÌ§ëHq2ºVßÔí3¯ñ§Ç/ƈg{jÉ¥ºo¿˜Ä3בædìCF¹j@„èëñ"Ö€Xðàm f±X$AÎöœø,Y=ü7]¨§Ø§³ ó“VÖ©ÊâûÕ Ëæh¥zBGkÏ~< НðixDjÓº/Ææ2Êñêmè1ö0§àgv/jŠ[€O>ƒ‰ÎþôÞ ð°A°°³úà¡ìƒ„BR LGå¨@]‡óR¹Ê+UEËIù~=Í麘¬¿ÒS£‘ìŽ4ð=Uø ¬â› ŽC¬¦Ž†«fV  HLÑÑÀÀ¬”p¶>ƒ9Ÿàçðï1X†4±µ¦õU^wŸVBK„ Le0n»gzÆ8ï- ØÄ1Z-µ™5ØLU”ÎnÚƒ‡mÑ!£¥cÔ^äসz# F:-¥†žQЯy†ÔmW]žô5ÎÖßVìÛEµld ZøZiþÇÖ ¤¼Æ‹#I©üe¼j|6—Á/µŠÂ/ØÚùÅ+—Çb23óËÅžå—{Ž˜ûð{Vãø æ±…p’¹å=gº¥Ò•L$(•\^Û‚e€§ˆu'£*Giåѕتž‘u̱7WÀä=)®€^󥞵19†Dòk OžûqŒÇJø¥É$1QâÎì6ÃU±¶{·Ç½]½`îõXØ;÷.š{·fçÍJ ÂÛôDSÚ M‡H£÷ZI­g$×Z †Jœ‰´‹'YÄd™Bfœ'c ÍEšg™|3AãIR¸?2J¶‡šêZ˜ž¾”]¬l&ú]öS:"÷á«×º`W'*ïÚ‚& ü…™dÆ£KæÕ¡;!—¨—e=“DïòÏ+— £‡ahóq s¦% ÖÅÇ4ê3º$2‚†"„y ¨#J‰FÑцfƒÐ’ŸTXÍb ô .¼cèp'0³Ùï¡°¥ô/á=¥¨‡®qKnaÛCJ1•‹q‘u’õ³3³1Rˆ·ˆ:WeyíÚ²pR˜BX¯óÒcPJõ{ßÁq1\ÙEÔ–i±2ÈXªì1Öì^p37f,"`f#¤µlƒþºŒD„;«"‹îU> #dADð° ÓN°2À8¥r—Üø€‹"cȬݡÕfôCeå%&ÙÅz–¢Ò·F±b“hU>od•ý#LÎÓS{‹ŸÁ9iœEÆüÂx 8/¿p4Šª¾ž{ÿüú¦æÿ ò ѸNת®²ß|§I7¬ Stþ>ýºèZ8÷>ý½O?›¶ë{ŸþÞ§¿­>ý&«:1¸Á>ý&ïª×égí}úwñXXí"z¼šº‹ ¥êx‘­Ø÷ôµ§£¢Ê²8h¸óB¸ï÷覤¢ž€°à:†ò©"{gñ‰´jÏÓ­ý]OÌŒÀ\õ¬¿G˜¨Aª[‰@>À³,]ëc<`®ÂûƒG°´Ä ÷™ÉöS3¼ƒåsJˆµ1;Ç 3( Ø`8Ñ3Bœ9OÎEì€ FÑÜAÅÑ £ æ÷,˜NöuZòë´œWÛŸª²jøüý©Jݰ€µmÍèOÅÁËéWƒEî$Lvés™¹H•hØl¸ýûé™»æ{“0…¥L~g0pE4µåyS\È\=6øL/ÓG@Ý+[cz·­Ü®ÍtàšLæâ_¦nÆÚ^{ôE$+ÏÈ¡·CèeÓv}‡ÐÛ!ô6¡§òü†$º==•×·J¾Uú?;„Þ]<Öè¿=UèÛnÍt±^½Â4Q¨ø¾ ôŠ¢§â‚@„9{{R9AòèщìO|m >3ËЂ¥*F)²Cky÷~‡ÖZ´†_§tX/´Vi:?wÐZeÝ™§žRFÙY@s0Ž=â:ÅDó—èP Òxmx¶D÷ºF©· Û9¢Hȳj¢5p+W­Ïܸ,.ª ü.›zªò+ Íáˆ0eùú˜ª©jÝ }F´Ÿ ¬¶­—›Q)H¢ÇÆ“·bϤâ=Lçdr̦T™:¦¿yv)¼RÜ*Ùääò±c¶á¥£½6ÒJÁ`™É"E綉.Eážpbûãˆn€&ú´(Õ·uÏdžhÃVÜXA[ û³7h WGa1: Ò~Füˆ^•ÕwìÃFœ‰˜ ïQÊD…ec˜óã¿$ÖÛT#"aìç…¨»±¼XÜüq2ÁDHOÔ&øŽŽ¨ŸÊU›Ø´ú8Y>3 *FÖÊÞ^Á@â0b2$"*{›Iª†wæ=ŒõŽ­Œ€î"³H…‰Y&¡Ëpʪ­& !ù™ÝIþ¯KGMn-Ò½äü%À$nB[€¤YAê7q’$n•šÒMÏ"æë»£æk7â• »Ò7Ú!fÞ=¸6…÷RǦë‡$ñ::øüÕ g¬[‘O! ³aµ;=.ðôw˜*3'+m§,=í-çVïŒéœãçÃÿ×EŠ endstream endobj 5945 0 obj 4522 endobj 5949 0 obj [346 /XYZ 37.5000000 488 0] endobj 5950 0 obj [346 /XYZ 37.5000000 338 0] endobj 5951 0 obj [346 /XYZ 37.5000000 488 0] endobj 5952 0 obj [346 /XYZ 37.5000000 185 0] endobj 5953 0 obj [346 /XYZ 37.5000000 338 0] endobj 5954 0 obj [346 /XYZ 37.5000000 185 0] endobj 5948 0 obj << /Type /Page /Parent 2 0 R /Contents 5955 0 R /Resources 5957 0 R /Annots 5958 0 R /MediaBox [0 0 595 842] >> endobj 5957 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5958 0 obj [ ] endobj 5955 0 obj << /Length 5956 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€{Å—@`wg7@;@AÁ:N`ÄF&>äï§»%uï¨õQâ×Eê1òÀîqkD«ŠõbUñÝ¿þ=ûçoÙ»_ÿ“}k??~=äÇÒåÍ?Ùùç‡ï¿ÐÕ±ý=++—}ûåð’½¾¾œþûrh^øúñϧßþ—éìO§Îþú·Ó—?¶tþƒ_¥*OŸÿ¾|Ö¥:ý–_?Ïßÿëð—ße¿žGì¦kyýÿ?ãê¢8ƒ12õË¡[¦ºüüöí×ûa³¥ªÎ”56SµÕÙÿqøé4A7|~¬­ReaËü‘‰J}I×g´»»‰.?2Ã+ùÁµVE´ÁÈű¢L¡ü£ Wë¢jdê:þ»ác·(â·\+-q=£K·RuÄ{>þÊM<â^ µs=£ ×hç¹2ú¯£Ç ­Q*ÞàÈ¥‘Ò’.IÙ³XˆGÙëè1o£²ÍòX”…ƒKR¶ÐÆr÷6Û㺠að²,ã ~\+mñè’Ä­t·±t ݆0xm#~\+qïFÿ2 ¥ùør/ž?<Þ}VVYdÏ?€»ÌÙ|<Ÿâ²Îö}á²ç³ßç¹ùü‡ìùçC},´ë@lžäOðÉôD•艆ïäUÀ'=1Uøhº†°épä/O>=Ÿ˜!2õi½ãkÀþŸ@,â'˜& rRbš„qÒ‡„tÔºƒÔ„ï ±è¡=įó6!F¬ç+üÊ!Ì#²øed—Ƽwªg´÷¢£ÁwL+Š ´_¥2pßÌ)1_Ö`Þ¹&hRWoNFz¬RlÍ@I¨°CðÆÆ5ÆÁÒ¹ïä»v³Bš$…Çu>ÇzÅòJLUFyìMÈ¥Ù…wäf?bËdö³*íVåö\°ä ì;¼[Æî®;O7…´©06¿£mõmÊóÚœ“nhkÈS«:¿@z#BŸ4‚Ë-ªW£µ„x§e{´¦IR¸¡ÎÓŠ§ Ñ0Ô­¸­& Ï,#w)yIŒfÑ“Vš ¡KW̘üð M7°)Õ½ôFœÇƒ‚5ªÏL ŠèŽFWJOÜ•ÍÄÊt/M Q²*?¥zµÀVq ,¿c?¥§&ïÂ+*‡U6.ÔÈ;iV§'¸?¢*×áp6Þ°Ê% Àë±8´”`ùÐl®ñ܆„æq¸òšœ ãÑç;Ò˜“r‚—÷pјNdIà½íáx¼fÇè~ÄÆñCSÌ;s"Äè2|Y[?’º3¿/«søcžxb ÿS6~BÈ'f7-ùØU65Ж890ÄVc™n§;ýHRÞé¿ëŒZ­óhéñ,Wĉga)ÑX>¥ÏáÁ»*N¤K˜ZDÄ©Uè 5¢‡¬6Øí—µÚ/ÿ SîgŒ7!Ê£ØgöÄÃîeânžSkB¦ÉÆ÷ðJ=|×å­× mìÂv‘oœÑê³ø‰oÅ-ã¼AÁPº Îþ‚)6TªNòÁIl ܲ‹p"’gx˜>åIk"rþ…!`rñp†Z]˜˜lJüŽé{÷E_ÄMÍ É M”s%¿3® ?AÚ®£žKLIïúÐÈ!ÎY¨þœx›IUáÙ‡‘0lžyž¤pXž¶3 Ks É}†(|?¢†¶úSø;# σa«Ñ;¦‘-CyÆpÏ·l„…Z}, ÷ú Ÿ`ØZ¹7Äx´ž¨f“G}I*ž4šÌ¯ÅjwF ÊòZVz̓¸_ôRw©{kÀrÛs Jx&ž¬YìÑŠG$¶²uSÎH~,«±Ù1&œ„Ê=­ïü¶dl$Zk $)~<KpcR`§I6öˆâž0C,ޏ<…+ò(a‰ ©ï9Ãæ[ÿœ‹R˜,ï§S5ÎdLL¼ Fkö¹™éÙáÑL›e)Ý/Äëkmož‘LßmÕã‹(æLYô(BÕYñ›Ùn"N÷E#홢͹ÛÅåtWV=¼îí*†1U8×î)Šl‰Ìwë*c¯˜¬DQŽpݼhƒø•—U^÷Å"S4Ýì§ÐЫ.U%þÛm\ÂÔ;¶±ƒ°ëv‰®Âu¸%gª*ÃÝ)_b›M¬ùpï3ÌçŒÀMÔºC6вL¨taú:pyR×Â΂Û*ÂŒZÕù80!•îXdž ÞØ©j‡‰êe*‰Û&0 ½·î1Úˆrm0£ãS¢ºíMöÆ1ÎöÅÖn&‹0LoV å=h#ö¥\è1Åiºlÿ¶c¨#DÆÎ­Ìó÷ÀYFÀù"áäxLYg*rp' %cú2–n¢ (“P˜N¬x#3]Qã¶\¢OüÀ-ŒGpb”¸EVÔ£»º§j‘‡1F˜QÔ5ŒœI×fLIÆ÷ÚÈ•I©6ÃLxÙà ÆJŸÞ /Ü Ãߌ¾N»Þ̓³ž™Jâþ;êVQâVu¹ìêwÅ\¯¸Kîz,ð„>HmÎÏw8a®Ñ#ú&&ÉJQeÙã(,"kUô¹8UÌc~72ÕJçÚ|²Ýú©s¯†èÈZjòT3V÷wèòŽ EL¢4‰„ª¯¶G­‹>ç šdm¾Eüð&fB2öŒ¨;²®öÛ‰ºm{6îl¥'[SØÍ^80geÚ—&<‘ [àݽ"Ÿ5êª1k?“Œ6ZL¦yÐPx»ÁÖ·~ðX0æv›i¦ÒÇ;9)aPy²WsR»]ät9É ‰îG]iNb¾ëf*¥0DEÎUâ—ò°Âš®Ó¢ÅÓÎW’UžÆØ¢G{¹xŸ yF¬[u½¼Û–&C¹ÎæðªDäël˜c:)T:cüÄÂŒ7;ÝæòhÙÔ³m´IˆªŒ£^üÚ×U±Ë™`ˤ3ÑéÍP¨D=¾‡~’f …ëúí\ŠÿŸà$ž=Á‰?9„ÀÓ`7DÀ- à;-…á_<=¶ž4®»è’§u¦=Æ“¦1oà ÄÚ.ã·TÅ8/bŽÃX„‰kšàw í1Wx Æïëñ̃×[—0mº)Œ&è\?û®w¸ƒ’µE9_>æe1õ®ƒŽHy>µ\Ü¡UDZõŒŠ6TdOVE׋‘“Œ–ö$SC; KCœmqÓ¬å[[Cï@ìxæÁš‡ÀÛ´fV§ŸìåÄš^Îý2öÄ{5x³èɯÉÕÙ Ë´}…!W«»% ô@6rÿùíVÓÇÖ üޝ Oh3§‚ís»Räˆâ„íë6|`XÜ/°•ð8¾Šc.ËPx4øN«TÐÒ¿»ž›e¸óï'ˆ;BcÜaÍY¿ãaÈžð;Ÿ³ Sg`ºBì´š{@´ji`ëàwð> endobj 5968 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5969 0 obj [ ] endobj 5966 0 obj << /Length 5967 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9ÀöŠ/Qæ ‡‹ #‡`Û0b#ò÷£nQÝ3”¾’TCRÒ ½°g½Z‹UÅz“üü—oÿ,~þ£ø|÷í?Åw÷óîÛ¡ðÊÑ€Ÿ1NÇ\zHæJÕS_è$º‚\iøóàT陋¡‡d®ªlƒüUDòkO+w˜‡&JÏZ<$g±yÚŸáésƒø•ˆ¨’Ϙ‡&JÏY<$g[Šim¯à#¯­‰üŒy4k‹¡‡dn#mD…|üí7·gÌc)d< gMi"šÚ+ôœ£«óHœÅÀCrVÔ1ßà#Wmm‡y,…L@É\UUŽ@í¿èxûODÉ9aœ*=s1ôÌ­ÊÚÈÆ Ñ|àÖF~Æ<8Uzæ ]£Òý Èœ>oŸŸ…-1«âé§¹óœÝ§–(¦øtJ–¶xú±øR–¢úsñôë¡9VÒô(v_dƒ¾”~¹E_„F_ô üÇ` ðzÊ»åc0Ö ÐU‡Ä@@h˜ %c…Çp¾`0$„àeÌsÏ (Æ‘ ©bH/–DÈ¥à,£aùу]ÒÚÀ1xÿ`ê¨N“?<µæém–¥fE—YiY7eÏ^[™3>¾ ªuSz_:²ë£V]qÓ'TíÓt ˆ†@0x8ÆÙÀ±y0 –'œšóu4ºªí«1ÊŸâ(º]!ÔQÉZ´3ÏX1£Jýºdz`s(+n½ôÃà!ý04¼@·QǸ¡iµ\x…‚` qð«o–,ŤùÃ(- èúôcìu3&$Ga8ã]}OÚšˆ&Ñ(ß&&33¾¶'öG!k(”x?b‘/ŽÄ’'æhcÂHÞC¢à]wJJ'Sº4*‡A¾´/ ƒ¤_¡S8§}ï1IÅœÊé 3Ö9”õ ©s:(4­·šªY‘úlV„½ ù]œ› ÇlÌaº_>FN9€Ë‡ŽqáPy¬¬8ù W¬ »¦2+cc¦œÓEX»Í<ÄAÎ9ú(…UôŽÐ0ù‡å ÃºêÍÁZ>ÂyîÑŒtcqáv9"QžVK1-®97(7ùN¢áñ?+ù"ŸNd©p–~!¨„—¹ET3–Žy‹9ˆET!- ;5&D?ÑŒ1„``Hc8‘’87h×ZyZœˆÍáì¡âHaÄ=FQç  °ÇÇ00˜Œˆ"öª´¾eŸ¯6•ð7#?O8±7¾š†©PŒ´æ”ÖšPÓƒe0œÂMÕ “de¥{¡Àšƒ‘0¾Ç{ë.V~ g6±îÂ:ÓjÉõ¤ápÝçù×·asoDÎò6}U)§eK¦"¶bœ\ä=– ‚¾œÜ3ž‡‘ Üg^“CMYRòÒÏ÷cü沺åºHèŠI°+@D†¸8ΈËXI…Î~ЀqÌÑk˜ö×:f“6}/?¡R9atˆð «n¨R±$ <Ûw湈y°ùbÐmfEŸ¾²Ý¼\bMÃlj➶=÷YÜ“Øn1Š{²gï‚’Qp‚e%§`GRN)/ƒKQ—É0up1 – 1ÝÜ&ƒÆ(I…G\Žƒe?ÚCHºÆ –X±T>.3c R8ÍŤr÷U‹Ú^»ú°®É©Q€à°“šÓ‚‘ÅÕ_N A„—óÏýÿóƒH•8a#$Å $jñ –âNbûj~„ßn÷¬ÁΩ“ø§A„ò qÚ,FõhÅ“;œrÑ—ÄQ" ¶0¥n³ s,õ¥Íy²ÿ4Gg`—’XÁ0ÁópŽÄ «ËŒ,m°ìpç<"Þ¦–;ŽÈj jšˆ2Ãb9ía“æIMmD[(JaJßÇZmfB”µÇ&…»8pª'>ñ©Æ©-Vê'™ãïYj†Ü~72MÒ"rë¦KO©*ïzwëQ*ÅŽþœï>a=.¬ QÜyœ7†Yƒmí¼~H°e]ÍÒ4—x7ÇÁ­„Í#®âÛWMñ6ǵDF9l½šÓ·V=âVtLQ¢QcÀ9®Éh#üpŽÚ²æÒCƒõï„Ó•6=š0)Á)’.L=˜–êáâsî%cœ$Œ׿ÒÑ^ªUKȧ …àÞb‰Ãj"” q7%ëª>N±6Q/®FsþÑ£7möf~K¡Hñ—ù{9Ü=^u!šÑ¦¼ª[|Ý/Þ5å‰òØu½Àû})û6 9h7º_>Æ)̱1 œçRtëÜ÷|°þmp g×$e ìÑ‘õ¸zÙ©Òà×a\CZÕ É h®Ij䋆´Æ+í«G#+í¾TG%ä¨Aà SBsÑêu\óßÝ0ç0n ®)oÑ<˜nN·Aƒ+%hq»…tsè¾/p ˆ•ÞÁ} 1 °~LWXÙŸc {×4Ç£œ‹KÖøÀ`bw!•w¿zË"qݧð±KÐà0½”Íšg{UârV8ÑûÇäbÜD„åaƒoN+nf ­ãHá…&º!Kç…ŽŒ¦¼æ©6ò5>ñ‹‚×wÍû-FNÿ-èÛÛE9»´zzsVuVß¶Ï|¦Jåå\.¯qÊkI´[SyÏ‘QŽŒrdôÑ<Ý4ºÆ6›‰Œrü3C*rü,ÊYÿ“)ÕåQ ~m?‰Áj-ZЉ•h' Ýo¬üä.›w®ûrÇa¬®Ÿô¶óIŒ3Í\»åV%ëÀw‚A¡]á²(K?Ãþ2§º1¼åÙ¿p)a¡)ëK­-·¾Ç6B#Ê¢¹wCSØÒNüMàM6%Ž1¸ÓõÔdñ“~¢º¼}¸å¤ßMœôã<DÍ{reŸ4HÕ¹µñsFZ±Æšs!~ÖÅ,]¼ÏýÈIîs¥©4ÑkË*BÞpŠ~áx«†Ó› Çà:¡C8~9§«Þ†ÒÄiju¹îxÓiê+š8Mß‚W. Žá$½ñ;èÎŽ™¦V§ÔÇIS¯ÖÀò†‡†7p]ÙVÚbâ:œJogè~- ü‚Çè‹âgtðC1Σ°-ÅV ã¡Iì9aÜ §O*bàõÈè=þºXœøWv–Ò›sƒÏ»‡iBœ¾€u²;hC!‘䯶‚a SÝÜ­+G·ò-uÞ°†qâ\€æ<šJ¼åƒ«Å ^—g<¤Äi8NY\QM5WÊ [M™`Ô¢žæ}NõñR}«¿¤I¼} ¿l£ˆÓª×éÝ ^P^8© "ˆåŸ³g¾• 9ÌyVã·8zìS/;Û@Î5 aC`Œ5&±Þàè[Æë¦„\ãõà”-Ö·¬!ñz°mƒ»óCÃtcAYW7à¾ø”~©¦é›ÈrV"‘Mß´bèÂÄ…=ŽÆçœÊ``Íу؊odZ“w`Þñv ¶pZpïM¼Ÿ1nAÂ4£Wʺ´Œq%çL«¹+#×Áj KmX–FOò$[r¥Ù²P¸1bÂgs7l nÚÚgf—MÛ)Në\ª }¶ýÚ6#Ô$³m#Wšm[ØúÇÖsF¥~¦Â˜ëÕ9Aß®ßb‡å;i¨Üþ¡è¸›E–ÊÝ}6aâ1D£cnÂ\¨ç”­|iÁBçwç“nr|„Ï3¬Bê¶©Ç¡ã*=#ö7@qÇ©ôgÌžew2ç»9qe5 „3;c]¥}֥쭴x ­s'èŽ;A«Ë£W‰á">ª`‡õfPäú4OîAÜ@"áçgÀ¨¬Óú=ˆ9L.ÊŠï·Ï¯j.çúIVlÎ'ݬµê-˜ÙŠf+š­h¶¢ÙŠFÕÑærÓL0+:Q'«Å@xs,×ɾì NvÝ èwXïbŠ»†‰ N`Ï a{Þ§‰©O…ñ¥2×ã6^3žåzœi|¿‡ÖØ}Ç*‡ñB6:8ÀÎ=ŒZ<ª|±Ú_ݯrÅËY‚€s,YDÆþJ{Ô}Y_lÏ-prî¯Sarõhg‰PÇRœb€Bê×ÜÆNÇÙ½ØÙv9|ÔÜñdä¹s÷È£‹A^H…€ÆæÍ£¦b1ÜÝJQ„­©öí~¶.Ð ÷x;á½,C`hpŒ3qbÑÒ_ÜÂʸÓï[Œ_»jc´Ãþ<†(ž,á1HØsâF<4©ã.OQNql<ÏãŌݳzãm7‚(†Õ>xþ¾Ààß´cl©ŽNÛÎÛ:X{ÊWvgÊæ_ÿè<) endstream endobj 5967 0 obj 3991 endobj 5971 0 obj [348 /XYZ 38.2500000 208.250000 0] endobj 5972 0 obj [348 /XYZ 38.2500000 604.250000 0] endobj 5973 0 obj [348 /XYZ 32.2500000 713.750000 0] endobj 5974 0 obj [348 /XYZ 38.2500000 208.250000 0] endobj 5975 0 obj [348 /XYZ 31.5000000 714.500000 0] endobj 5976 0 obj [348 /XYZ 38.2500000 604.250000 0] endobj 5970 0 obj << /Type /Page /Parent 2 0 R /Contents 5977 0 R /Resources 5979 0 R /Annots 5980 0 R /MediaBox [0 0 595 842] >> endobj 5979 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5980 0 obj [ ] endobj 5977 0 obj << /Length 5978 0 R /Filter /FlateDecode >> stream xœí]MÝ:rÝ÷¯¸ëï>‘Ô' `»Ý²`<YYof 2ƒ8³ÈßÏí¾ºÝmJ‡Ï-)µl̳§eIT±X§¾~ý§ßþãôŸ?ýúå·ÿ9ý>þùå·‡êÜ5Õõ×éù÷/ï`ûóø÷S×7§ßÿúðãôãáÛ÷Ë<\oøíË¿\þö'{úçËÿþrú·¿üðã?zþ}èLwùó¿_þ:sù[õúçóÏÿëá_ÿáô·ç'Þ^7.æçÿÿ‹sÝPõÏËXxõ‡Ûgš—ßÿýo¿^ ÷–¶kzÓžLíê“j{úß?=üùò‚Ûã«óPÓµuWÝó¢Î¾¾É—'™zò¢—ßBOððÁéþ²rqªךðÓÏ};þ‚'ßÝ_^ÜV®¿p–éOIÙªu]sÝš¦“ß›·§'Øø¶v&ÝÃ_V.M”‘©ðÃ%w¶©ìHçèíñ Þ>KÔTY¹8Un{‹Ÿ.¹¹m?Šë®MAþ>2¸üNxl_V.M”ÛÖ‡Kîl_÷WòØ6ÅÖ¾>>õ;c\º­}Y¹8Un{‹Ÿ~î/ŠÆu¶©Ÿ7úy“›¾·—¿wnüu'ÑÚ›Žì’ìI›N_(ðá/+§Ê¸áÓ§‹y ^Êõ'Àùø¸ñó÷‡_Ÿ.ß…˜íéûŸ/‹{yçõï¢4§_ž Òz8}ÿãé«Ê=ýáôý/ùµÍm‰×+Õ#¼ò]1ºbá=\iá•:þ 奄4p’ß㆗+_¿_(ùÞ·ý={ßÃ+†Ø{ÏI˜û*Ì/pÕ˜“ÜgÅ=é»eΆW,äßÀ ”7_ˆÓ€ïâ×àÈ®­þŸ†ßƒ×†) w!@¼¼§xç°ìÝ…€f€+¨+t¥Wð=˜G¦± ©Sã/ÅÔÁ:KU†Mü÷à÷8x~0 ' Ò¯ !Î)>õëEýƒ÷`Ù1*>ãÎÎöæri¼üXÁ䙃tµÀ›ÛZ#„ãÜ{>ûK"^ìÌüw¥Ô&f"”&Ľ îÜÔmß­Üo|O¯0[7ÄUKá•Çáÿ4ÀÙ3ŸÎ,Öù/n mBŠJøáª+€O»ÃJš{!V,¤u€WñÚÖ‹á Ã÷+ý‘BÚ+›êÜvæùE¾%`Ìm +Ð÷Œ(ÄÌÓªOPì|!î<^[ ïýÅ™ÖöïïÁßc¯ÇÓØÛ¥+¨›x_ª‘Œtíà&6ÜN„…ÿ,RåØ3¨,æu,¿¶)‹Lü 2Ÿ÷'ø=ð¼î¶iÎÕà~ÒIpÈ<% N¤êï‘t±b!à&Ã;-ë½;ìßL¼;#†ö'[Ïb2/ §½ÈãÛ+Ÿ^=¶úçi>¡+£ÀlÏãixw|Úxðçî¹ÒÇtŸñŸ²È(Èê³ Í¿^ ¬­…W,|O…Öfá•›è™ùøžÀÓˆ]°> ÓRç¦hfVp=öÖLüÈxÕãÙš{šƒ{Š9䫎|l«®^´ ’‹þOž¨AÈÒ C!6³2òˆ@÷°B`¨6‘òX!ˆ¢#:â{0ö†ÑQÈ3àd¨rÀ1€«ÆïÁ<[;¿Å(cmÑ Dl•1ÎÅßíÇÈ,p7lÉ/Ÿ³¹¡e#FŠâ31ÙõÉÉaÆvž2 l³¯˜^‰Ö1cã=$‚ò”æè\Dɹ1ebΉÐÉŒjœ<~rÙ……³¬ H¼‚+>žÒeøÓ×K¨@ÈDËV»Ç Ù11uüø‘õ!F]EŒmæ»’kSß—ºKÂbµ0Ù"ìÈfU")nÞÒ[ܨ„Wöz”ù™$èçßÜØ ~a.¾!­ŠÉP@‘WœŽUË»‚_œÆÎ¦ÏŠ)gßxÜ£–"s(§ûè‡ù‰€Ê"hA6æ¸ÐRDÜ-&‹“±ñÆg@. Å;ÈÄV‰¼Ì±h%Ž8ODt—‚‚Þ’^ÛûZ Ê~`*$NªMoYþìtF!‰ßÈ4ã’@ÖÝ " “£,«ØógG ¹"©ã¢_LaDìòÎÖ'E1J&C‰P2gƒ8™©#²žò¢Îzš²w׋çÀêä}‹PUR¡Î4>ù•%‚ÊòçW«©`BlR+`ìŸy+j¬a÷‘B8—ÄxÒÀ•k<¨Œ‰Š{Ù&o§å3,&Œr1€ÄD5àbVÑrZ*¡~Fଊ¦Bª¥$Ÿ\~&_fчUÄênq1‰óΘœ'Êf”Õ¥¢‚›©žÃ—¡‚Ìø)…ãŸÑ"/'b­$ÝqÑ¥|e·I\Ükòo„žÆÎ1Óûø²ø*ãR&ƒDø5b³`0e™ôËݸ¦ÕîkÂ\&¶lƒƹ¼¹ÎX<˜; w0àãÀà–¦BK•yFW+‡ GbÅöPÒ’Lˆ¬nÊ\}¦å`¤ôM;xJ1°ELÜ$WC¯@RFB îÔÊ¿¡2´êKÉ\Q€åÚöŽ>¢núQ7µF[½¶‚¦Œlj“/˜˜é« ÙÇYX{0зl:<|Âvj¸™Y þ8é3­Ñ0E¿,Ð9Äv$¼¿Ç>æÞ†w\%‘Ú—Ú¶É EÓeÆÓÝZ‡Ï¦î<LjGû$aEÜ¬ä*ì`Žlàʪr¼ÉŒŸ)jì-+#W ªxü£EUevG·¥ZÚÜÂÚ÷´öUDµ7Â}}Ó6ô¢¬¾´Žc>“ Â’ ²)°šÃÆV´Å E¤Çâo– àÉvôbò¯MQ¾Ì¨ Ìs’’v¯˜0˜ìˆÆNb&3¬GŒe[ÓQ1$%Ÿ’i›øâLQayô#áf,Gh ™$Ç«3$51HHȹÀyeV>_¯¶Uë3ò‘/§ƒqƒ†­)­ÃUJZyr¯ç€KêÆt–\E$yR‚x¦?TÄT„ZÙסEP”"(:c"M1¹¾¢Á‰Áµ.ÎóÂŒ±f O(8Dæ0Ò^¶—K‰½³ ŽÙh…$ïÈ@W€ùš['ÔÓdãèàZý–lü€õ?)èJ8ŽÝ*ÞŽTÄ®Æt I< ïn;+R>':Ü>àÉ‹$óØR+Ê#a|ñ’#+ûèÍ&ܦ‰M–+-¬BIXµ©d$ÔžÝÐøéD©LÉÔ á{„å‹lW1¢4u÷Ýõw—]"‚b}˜ #Ië¯ñöj¡Æ ‰ Pç#)å\fªðO κ8ûæ²çoŒùZ PX÷Úer'©©ò*™¬<­ÖÇ éÀÜö iF§Ë´‘J„’í-«?e¡“kǺ©=½ÏÌ# Œeñì¡$bÔQ/H5àgê,÷æj•md}$;Ã>bx´°Œe2ôÖGsäÚ÷'3Ì·^d¡3¯6ò댎kŽÑij™¹2R¡9[?1 ?-p~Ï€îq×½3•Í?l^æÈ s_ÚÀ{Z¸j¯ÀXx©ù ׆Wp= ÝÙM¸ïÏH+—¶g÷rJÞßó® ®À ÉõýÕ tMsc­<º½»›k«yBýTœ¬],Ò•Ùõ‰þ‚«î$L)ñ“&㨄½0ì«âdÈ…1«Äˆa=XdEtÓ˜ð,ci§wZljªoZ,Ó‰àfS}¸1*Çx-"E¹hW\·BeLB™Áh‘”€EŒ8•ØXcåÅèƒõâG6n@µ%Ê~&êŽ7ú´ûWÓø‹ÓkØ¡·ž† X8:“?8¾Iù__YÁÔgëó:ÑJži+<%²À*‘9MÉål™çi;³E2ÉÔ¦Bù“×ôɺºer¸§Q%_a¹÷ |„W>£+¦CW,¼§‚+MÛ™+Îů`Aç®|‰_ÅO³ñtÃ+Ùdnð=õ'xOÏØ°oŽ:ðJɼc EG‰õ=ã{ÒÎuë~fä¹^‘²Å²AÂ\r•I\(Ú"cŠ.6eY¤MbÓªé H„#¾˜â­S6è6;W3^¼h§õ˜3AŠ@Š:a\o¿nÆ–LoJ1~6„’ßcÞfX¶®Ñ=»ÇÁðÖM¼þ,‘(‰‹¶• /j +aäï:O•J®/ †zùuÛª±±ÐLŸª¹<25ó‡þ…25™ˆ3ŽìÎÝfwR‡D©{ùb_Ö¤ýR;O½”ȃi»è/[û´¯øty©̱Ü݉¼É@Ž:3a^ë|a³jýä>­i*r–]÷ÎÜÆø®ûế“Z®»—»å.ˆË18É@·ÇÉ>†¼ñ …Ô‘;› ÐU7Üê›òáï­l~[XÂNü8%hq °0G@"LÑÁN¼%­¹:ZÎ3Óü“˜Ü.â”E4\¥:¥ïƒQ5žÂc {`3Ææ!Ø,7edAË÷öuáS¼–ß¶æI*cäñdõÄá=Z…Sñ¤5Æ7á%ÚÔE” ÛQ¢C´0GRM,ˆ6çÂÃÉ™­dÎ^„¦fàgÜîdIz&Ò0øŠNÉ`ÊmÆÇpÜ™! T=rnSÚŽS»¦Ñj]Á- Õz˜|`¼£\>gÄeqá ;«·œdÚŧ%ä¢ÞH9=¡ñ]¼Ýc:ŒßÁ¸ç%÷``/ÉÒ?-¬ÈvÃfÚ;kuÝf´—(÷®(ö@èû£2áÝÓŽ î.Ó†jå·\Å÷Åʧá5}ª‚çŸû@ÐïÜáÀÞ+Ö¯©6LÍŒð„{ÂÔ2½1¨šXü=Kuñ:;Üt÷ìðΪj߃W€¹jè@,–‘D-=>3…p_×ÜW÷a‹k7BbÂ}í§šƒÕôŠëé.Û€åg°V'’qd€K ¶Î>”ÅÜUÝÀž(ZÌ]Õ™åth´4îyB $›µÁºjx}«‚ '—u¦n~>´R±Ñl,5à—É!¸²ÛLz<ôsã`à=E®Ø4ŽV(9+-CŠA ª¾w)®¥"[ÌÐÿL‘(ÉÙ`]Oh-\wæ²Ä=ù÷V8΀9¬[ Š–¡'­»a%{gs¦¯’gˆ1öÕuR´gÝ=:Û4ËûH äX&áÝ¢"øY-§-„_ºú~Ež°R„(`ˆò £ÂÔÁ÷à.£ÌþVAƒwÒ-`IhÚ ¯Åa$Vε¼Rg¬ø[ûÓs0}fÂV{}e÷:`ëéæ{^Ëßçº2š¤ÍÙú5øi{á=ºg¬\0î<™fìà{®°;»‰K†WýRçz˜Ú³3Ös ßü|o¼l`øKñ Zø¥Þ3Ä_ÁÔ1Z°Ôóe SN+Ûãh}ÆzÉz÷–}¾þ÷RÀ±¥LŠ3¼'L¤óãÝ j”²ýÞ[ñmÌÁbú’ŸÈ—OßzÀO#› 0ŵ1pEÚÙ0Eиb‡)ÿ'Š(«C):–ÿ°0Ì:¸²éè0ù ¢[4Uj•½8ŠRÊm~ïèÖ”FšÁÓI#÷Í!=8΄‘[ŒªÍõj¥Øa’º™„–…©†Ú7-rËQ¦©„ƒ:¥JDfT¤027Ñ©›ò¡_—™Áx±‚ücÑ·T's+ȱ)#}Í}ïQn'‡8m•pÃ2¢SNàÊzRçk¯¥ÕD‹É”mÀ)Ùª¹§Hé»›eè|(_aYÊ£\˜P> #9²óݦó}S˜}í› Ømfð/¿ÛlŒ$-Nõàí>޵!vˆIÇ—%ÃÌ=XàU3*‰m!/;öŽ:ÙÌ)Å;‡Í©eâŽÆ´h3K lnLÕzÓšju>ð³±V[–[/åµZÍRì©•hÀˆÌõ"¬ˆ§¨—!;O%¦° ÇZ™F­ºšG ¬‡{¸•Ø»À”Þ§Õ‚' %1M‰ÁÁù£žµ%/Ljøé‹$NÈêÖ×™–©ø èÉÙ;ÐÎO90 ¥I4]ÝßjÔ²²%lƒÇ|Dð…ÓÂ×íø´*‰IðÙ˜~¿¢ðH©ÍÁ‰>¶n½ƒw$úl/ÑÇõÆÛÅüÚE×N©ššÎ'nþt–m“L7&©[X–©©.ø˜—¥ßIàKÄö¢_ŠäT–›ŠçD!;;¡Bê‡Æ·ÙD[PS§‡=$?ÆK•(ëc&3È>cJh*álÇPp¡„F‰]—-Û*Õõ‡ágWM\Æ?5=¾ÙT5ZUY+Ëòñ&¸{X©Ë ÀÓ¾b¾¯xS*a•1?)²‹VkS©´—vLMÓ%l†œêf"ýeËİEÆØP[ðþ¦®m‘ÈPbâîŒRŽ1óŒnd€·îj“HùáœdtN²7`‘á|¥sÙvꀿrO Š|*e혈õ¦6©|J†‰Ì÷é>ã‡à„wÆôPŽ¢f¬L©ktáyauC@åióJÅ\^*0˜vàœÉM ‰*} Ý–è$€}1ŠeÙZlúùh]’ˆ‘½›Ìº® ‘…Pµ²;dㇲ촶׫áºÕŸN•·‰¸Dù¯¬½Øèîˆ?sw 1‘²ûDm=}ºÍ)juDÉ’ðdöG)„±¬€#Ã)™ ,¹7K Ÿ¨çß[•à¾N@Ò¾UëëË’å6Â匧€Ï¬¬ã+{2%RkŠfÄb· Ôþ( gµ]¦6¶Že}{Ñ ðÅøƒª Àâ6–’kõXûÈȽOk¥ÔêTÍù°MÊ!7&™¦BœF%ëK¶¸š³¸M;3Næ7¦ù8>P«ý;×xZ8[&Õ(Jö@&vm˜L|Âz,¸ÒŠÜz­Ö{‰ ž²ÕØÆd2±˜\%›Zy ”•Ƨ³¦ÄŽí}‰™ŒB©ÖdËaž¥¾~Õš{˜š8àô,¥¹¿¤ÑÊfl‘÷…¥kÉŒ˜?e ‰v0H'‘ÆÄäñn 9'¥ô¯'þ÷¸ÞDö¢ZÎgD‚*Q•";c€’½ÅPW•5‚™|4‘”Nÿ‹íÓúÝg y­ŽìÍWF¹í²]™ŠÅ^†ösƒñuØn¡ ì|\Yc;ÀžWƒ™†(¾ $)¥ ÉÚxœ‘¹Êó…‰O„blƘdLÅ0SŠ¿GÂäcÌ`jI)ªqkh—ãN3“Ú™Â_‰¡ js¾˜„ñ#9ä#'‡ÈÀRŒÕÄ(:Ù¢bÕ©ç¶óú:©(wž,§¦µ.ƒ3ãNV¦S]q&±_ .Ýd­¸lԔʜ¼~±ç ç—æê\GM-"•Ë‹–! 1éEJp«°ŸÈ ¥3ñ—èL9¡µž6cf0a—Ô°Öoâä}²“•‹Î¤›H~IZ3|dšpFä®#4„›ýçšxqȱ òݦ´)þa‚íTœ)e'Á¤³ªŒ¯ò´Ú(êÀÚ‘˜Õ=EkÌùø¢…/Ç(6YÜ߃ß#Ú‚0@ü‚ç nj“`®lÃ\¥¿‹QÔú>ÞÕ‚V™Â{µÆßŒ9™A˶ÎßçüeD³ Bfú©äjeÇ`wøÙ†1Gœ$(ˆ‚°¢}C5cK¤›Å=ãçägø’rÛÆ·ydƒÂ]– Äh¦( ¶L[©'Û”òܱtdˆÂèiÌ«xmÙµŠZ²•loCßPŒé“{XÖÇ1sç?¤ôèLí»t{3жY‚Zò.¨…P00Ë#àÞ M²uU·¸«ñ¨QTZm¨è> †Ä–cgf·d Ú¶ÈúÑ#9ÛJ¸qRƻÕcil»8›Z«r^x€ÚÞ…ñÇqhJFµéîD›oªæ>‚Ñ×çbSÅXŒfhG$‘ö_i•²¯¯õmdK˜j¿¥„íüjÑœ’{Ó|8s§hYÏ\K’PS‘-yd‡_33Ørƶ<‹ÛŽR'Ÿˆ{R³¨–`$Ï®˜>@$qÇ-ÊÖô2jW¢}¦L§ÖœÜü®ü¡YжJ(ä½À^/‚Økò`“lóìE‡*¥v³tßÔ‹VAÀ´ºP+25ÿd÷'.`}¨Mf—<æ "É ñ<ªbT6:SZÆgÊÎÇmíéÜ£Ž.1î˜8!0m¿ƒÄ³´,”Œ3%q0b°!̸ƒº­ý¢߈X¥}ZHJ™ó¤6ÖÍ2 îCc”lŒS%fXÒ‰v Œ{C‘¸<å…‹_q‹-¸…SáÀžDK' H¼ØXÅÊóÛ}VŒ>£ìsÑ.K²Â‚²M™á}¢ÍàîJúÙ¢¬V ºÉSÉt¥•JJ% ˆ&`$Sö¹ToàŒMôÍ…fž>ŽÁÀq »¯žÂéE×&;‡‚:K 0uãAaƒœ1¡ÇéŒÍ¹\·ò”12uÝÄŸÎôj/vŽíˆFmóW®,s¾ˆáËïÓ‹¼ ŠãoKÿ`…¼îAá¹2ÏI 'û:õÄ@£ûÊ+Ý å®>¨=Û«KýîÊ•åÛé÷8Þ3&¡¼ãI9á½Ç-)½¹µ=_: Û.ØËµÏœØ"l§8J œà#<ó? Þ3õéïJÚY†{þûeÅ·Æ´ÃÒ²~Z€! |Eì Pï1Çôp%£~œÙ‘ÀþBn1p~…ïÁO p2þRlñãUCêŒÂôÝÄÇÜl¼ØQsb 3w¸|~0æþ3ÕUî<Êãu‡ ËW÷.ü´¨t¾¾=ü?9¤°V endstream endobj 5978 0 obj 7561 endobj 5982 0 obj [349 /XYZ 38.2500000 119 0] endobj 5983 0 obj [349 /XYZ 31.5000000 81.5000000 0] endobj 5984 0 obj [349 /XYZ 31.5000000 81.5000000 0] endobj 5985 0 obj [349 /XYZ 38.2500000 722 0] endobj 5986 0 obj [349 /XYZ 38.2500000 722 0] endobj 5987 0 obj [349 /XYZ 38.2500000 497.750000 0] endobj 5988 0 obj [349 /XYZ 38.2500000 497.750000 0] endobj 5989 0 obj [349 /XYZ 38.2500000 260.750000 0] endobj 5990 0 obj [349 /XYZ 38.2500000 162.500000 0] endobj 5991 0 obj [349 /XYZ 38.2500000 260.750000 0] endobj 5992 0 obj [349 /XYZ 38.2500000 119 0] endobj 5993 0 obj [349 /XYZ 38.2500000 162.500000 0] endobj 5981 0 obj << /Type /Page /Parent 2 0 R /Contents 5994 0 R /Resources 5996 0 R /Annots 5997 0 R /MediaBox [0 0 595 842] >> endobj 5996 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 5997 0 obj [ ] endobj 5994 0 obj << /Length 5995 0 R /Filter /FlateDecode >> stream xœí]MäFr½÷¯¨³-1ùMÀ0 žž1àƒø`ø`h½6Þ…å=øï»º‹ìžNò%™¯^~U+؉*2?"#"#^¼øéù÷ÓþíôÓ—_þçôÛø÷/¿<ç®)®ÿ;½þõ‡ÿEÙŸÇ?Ÿº¾9ýö—§ßO¿?}ú~ùÿ¿?]ðË—¾üéÿNåéŸ.ÿ÷çÓ¿þÛå_þqü^ÿƒ¿tæò§âýï¯ÿþ¿žþåïN}}ãô¹q0ŸÿùUÕ÷Ýð:Œ•Oÿþ4MÓ¼ýõ·ßþúôÓuü¾Òv]×ô'SWõÉ uyúßÿxúÓåÓë‹óPÓµuWÜò¡®¼|©7Õå%åpYöb˜}èí/ÍëM€—_þ9ÜËßF._SµÆýös_W¦êʦ~Ýè×Mnú¾¼ü¹«ÆÿݸhÍ´h¦±'MÀ=©/ç7œ4½Ž\¾*Ó†ã·+Os;Ôã]ÄD¿D¯ðò¾lýümäòU™6¿]¹¹Ã»ô9¹CÀÃ5}@Éyy°“‹ß~ù¥Ú⢗àŸÉo÷¯kÖšËgkÓŸ<€H_žïVð/—ɾüºÍ1—ÚÔe³ðåï>ï`‡y}í«/[þèË–§ú4÷go:F×ÅÊS¹°¸7Ϻ¬Þ`ùŠå+Çå3ÅuhÕéÇV—{Ç/ûسÞ4ÃhÏfïÎgÏzÓÅéc ¯ÿ´›= sΖ„! ®S®/û5LƒÜÇfÝugl²yo»vý§‡öã§ A×n?ÿúôÓ·ádÚÓ¯º˜ï·¼þí׿<Õ—x ãtÕé×?žþ¾(Lù§_ÿüÔŸû¡hËæm½Ç'µÿ“¢y{R›ºí»OO:ø¶¾íËÛ“ú\W×(ÜÇ“þú›—Tð%p‚Ee½Þ±J=œñuô_½Hx˜Í4ugíæ|Jpq›ˆW oH Ÿ0Û ßVÒQ¿¼=1fÚ½ ¿)¿Àß|}{Òœ«²7åFñrKI4c>=zb øx˜çˆë ,2øÃRaÂæ˜s8½âÐ8¶VLÂ(S¥ØC—3 ‰8>Æ\ÕA5ýhË`™Ågy,uO%~qŽ3]u@+ÜÖ¥m…™ýÅÇaæë¼ø/]uÝ¢áܵÍç?,êâún²‡— Õ£cŸ˜ÝÀ¿ÉÏ(ÎÖ¹^8ÜâJçPºx‚øJ'5IÑ<’íÞ…c[á qkyï4¥Y»xR+4;ªg¯>Œï†Gw„ Ž–# y¶·…Ðût©ß«øyÅSxT§xßP†‘«ÙeDPkï“_S¢¹³‹TÓÕUò©GŠö¹è<Ôå`¬Sý¸B9¥%Ã+Ô#$xØ 8¸&¹óbW •‡——^¨2öQ9¨Ì*³ýÜŽ&DJébÅî0:ÁMm×—ahÂÁ¨®s8Wã6'Ž™†Á2ÀbFŠò®Œ‹ðƒä*ƒbçLe™ØïéZpþÚý0|\p(êu!Ó6AÓÞZ÷™³Ô–úxĨ þûdYfý(²?©JžO=,Û8u6bU`¦èÄjÁ¼³pp] ¶þßA˱–RyÂÀȺ–IGܟ̰˜*¸6 õ$æÛ4˜k°ffzžŒÇ«9—v„¿úÍ€~3z³¦ž‚L‹kГQ$^7ÄFFã5¸n|w®fb4 ßŒ×©…ï¼ÁÌæS–plp Æ3¼4j8SóÕÿ;Å3|[ƒžÔ-|Þí/p>×mÏÕÛñß¶:x¦x·ážâ` ùá–f€˜)–Çþ±nýÔ3Â\¹×õ\ËîÍ B/LŽO#}œC’áÜñ ]<¡½ÄÏæE4¡ްt7éÙùC7Vfšülw’c… #ßåBŠ¡¶-ÅA *ÉàÒcý)B­U£Ò0Èq"ݯ½¶ÄуBɬb©f2üR²›hívxž-à*$KùÐZf4™Ñ-Ú¯Øìa7:¹7ö(U-ø6\T—pêŠ j;b>ÃG»b‘Ü­Ù›à‘²þ²Ê뮞àI3·Xކ$°¥RöÖͧqP4BÑv1ÈJ­Žaܦà>ÛjfOï`æ§Òs¾¾àÌŒ°Õ{âä–´~*ë$õí¤]s˜žb†B©5ñq§bÕÈ`Ç„aÛ!®' ´" NQÙ×}„7Á”Ø "\ªƒ,®ENª‰P(]¤GtMtËLè]ªÁºv×%LLÛ¯RŒ_†Wé¦K¤Y¾gˆÿ&@Ó¨K‘4[­ Û9°®JK«3½þðo`OÁqs–ž<Ã'-z¾«ick £…©%:ÛHXñræ »»h EÛûËŸäñÖÆ‚‰x„;ñÒß¼“‘óJ/…Dþ¶Á̶+ðPÚ7¶1=ry*û›{ài!R‹Ééù¤ŒZü-³bPØ +¯G›8BAÏgàÒáGþ_šÿKÓÚ>èøÝRæ(~â½­ñϦ] «Ñr2„EÜGî@#Šî«gÄAHIúÝËóe‚ÜLù4qLsöäƒSHcÒϬɞĔ)ˆÕ²hjsK»pÑ¥Y'mÿŸty-qcb *Nmågº<¼$ò(Å»8†7V –p5]9˜* ï¾g!ãmgÙÑ£Äô¶°ÍpœáM _c]àæÎyyC8‰‹!8ù!‘*;nt ?nÕ«Ž_ë$“é‹‹=m^ò‚Ö_ÖFÜßíˆQÈT:)’^d®?ãÂ?Ÿ]m–Òûd@4¦M6ì;®’3¶GZõ”Þ ‹7 YUiŒm% ô´G}¦oŒL\ÒÒ{š³A3*)='qµ§b–±î޵Ò7#@´j(cÞ' óLÙ´º L¢Bvø‡9Ú–VõW•Ð8@™sñ&7mõÙô.Õ4|ƒO¾Â'¸v>´…'U߆+1àÇwž#®üe_…ÆSÂ9T°Îı[p‡{_Ç[‘Ò&†ðÚ»¢£ŸÄ™]ù¾w/pW‡ˆã©†»;ùÕÏ„¶ÀóÁÕfxuàZãï|Öa\:®lú‡Žû¼"]wƒŽ«˜ŠD,qP/:´,”lÇÛàñé†2Ë(ñLñžÆÔùC{ƒôåna+3…@ò°°Õ0ù3%ÔWX+9¤ ÚÇ®2Ö×2?ìµØ^;tWš£þˆ/>áC–w°ÃåpÔ­!¸,—X*bî}ݯî=¶TÔÞïÒdNFŒÓ½nŠ)ÈW\ ª_l~,û çYG~’)Ç¢ÿ»…$n}fp9×Ö5ÔZÏÍ1s0…/a*:¼÷ž^RõàÁ½-$mÖˆ3ü°’÷ð+fçKŽ9ëI¼‘s'IIS–·ì6;#)0«´²¯-*L/Í:œL2Ã’–/¯d"Mý®äqÛ÷ŸÑ“qjKíåq{ø›qq—~ÛØWcw•rÞ]¥„oûŸÀQ±Œ¥&ò!ZÒ/<Ákðƒûºùmæºݹš %[ w?k€ÇV¡]œ)Лϋkšsa/{ˆFÒ~ˆìƒ–GR°NËwdl¶F€©¨ LPŠ-GK<’sûËÖÿîR hov«Àóq€jf%µvi¿®¬I˜¨(¡#2è eßžÖð ¿pèËT}EöU;@ëP7j‚xšši²Ža ÑØøÑ¬TÛ¬4di1¶ûø°µÉê}ö¥Iµ¶ðEÅýU™(bz&OÞmLáy²Ë«”»Âá1w ¦$•÷¸ÃãÚ‚ÙUI1ôp¬‡4`Í`obò쑲¥§s¸UDÉ}b…žT0Ÿ$°âŒäŽe:b¶EªÄ(.bÔ(é-}n³õ‡ä³©zÛ²Jã¦ô*¡N`Nd(Ä´‘‰EOÝ6ïÍtðýE[í©Qb蜠$y ÏIîS™ÓÀèd©zÁ×X çÅ´pfŒ¬-‘9iZD.B4twØÖ sÒ¬ñÙŠò‚ÒŒt–)Ì Ê+3#…ùFk` xøR¬måL±¥l¿(Pžžú³½²ù¥5¨¸€–Eâc2Ñz°äzfš€¥út¬Ê-54µ}¿b®‘êØ(ž1"L¢ÙVfÛ#» ™Âd'7£àâ¦S«zJêë;d5½[uPyˆ´ëêUw0väê†â† H®Æ^±µæ‡s )*r¶=ƒ—0K× šú\šÍ@q¼ø±Rטåb°ê—ñÉhÊ7‰ÌžÐŽc¿Æ¬MÞ„U|ì)ÙÆá{‚‡“†JòD7S÷ÝV9‘¿çbb©ýd%ýù!î<‹?Œ…ŠÂ‚JlÒ(´#Yì Vpñø®mÿOcv!îÊ©+b«k îø…»>á¾^%zâ¨üùâ?ÜK¦†½ÍpŸG÷#blŽŽ˜puýtà ÜÉ wLÂÙ°À]À3Åûƒ;úäÑuµ«oêòˆ×—é¨MôRbúç9ž0ç™èñÅtÿÂ}«j<6,±°gY‰»™á>\P²—ÿ¶¹Aþ©3ƒõ%î€ÆH,ÑÅÐÀWü6‡Á9ñêÀ'5ѵ8gKWAËíÐiŒì`MŒG€û÷%·µŽÝ&ú¼æÞi³ë§›7Õ\þ_iÿÞI÷Õ•¤CÿÞ2>Ÿ¤C¬X@=É<Ò 9‰0yø=}RÚ%`ÀõÚöhD,L‚£óŽÅbªc²/牉4Ûr”F¹ðŽ… ·–Mdð9&k´z,9 æ~š¯dÀkø#}ü69)^,RÓ ¼2ü¶™`ÌL,é T½£Öd-ƒ…U ÙÜ!ïï¼ ¡zK0 ) NB¹ŽqáÒÖg0ûËâi‹ ¥Mx´¥±¿Obïѹ®[ŸtršAa%±:IMç|¡šˆådP}¤%5AøÃ‘j_DžC°bõKý <6‡+œwô¥V+s;î¼cF¯%÷οZ>dг›™"HD%Ìàþb¿áÿÍWGØ@–)éÊ{•&Ø~ê’ðE· “vP¥·Æ «’>_ÏP»Ì³ñDbÎÇÞž¥®gøèÅ­Ù¬Û(ÆrA™–-‘j£UB¦œƒ©Ô™ˆq3ó8yâ˜i,Ú¥0õ-ÒyEëØ÷…ˆ€mÌ­Ž¸CPõŠZp•¢YYúîËZºl†ÌǧnK¤/(v—×XC^ÇMi›@mb'y:J \§ µ6CKlmß¾o¹PtX«œp‡CREJ©ûZ=°ÝÃé9dhf:°+¡¥ºhHJÅ¡¶ ^ή6ÃX‚ï°9#óî/ØïwŒû%{ .SÔ«R „™8B°®2Óáø|r*qlo¯S'(©´7OŠÉ9üw‡6OëÕK›‹Šx¦ŠšòP”Õêx(>cè,—˜Ï~mEü¸¡Œa¶êÂK*âñ¹E]Þ ŽUdú,à·AÞc†gþÁïÂ|?ÓX›ÿùÜÀ¨/â‚7øÌá¾øÌa ÁR…uÞ9h *,UyhâÖÈ¿ê¾]ÆLmA‚´,K‡òv àÁœ9àîªó}š–$25bÖa¬ÀÂíÇÖY”7<’æ)£rMÙØöŽ8IJ‹“@i¬õaNÛÓOtSOáÜggPK HÀˆÓ³Ñˆë¯×ªž“95!«ÏºÖ2^G͸0Îò+Ò@ ›¡zNF4ò`tþFAø«·Qt"ËXZßãlHÍÚ uò¢mÕÔ„ôá5/Y¦‡×¼sûZÑ¥o4$½0Ä2ÊÜ&?¦ÊÃj±¡™‚µ¡EêÛ$ôNA$oq¾ð3}¬BIÈèEi-iäÀ!¢RA±¦bÁPTʈm<ãjiañ¨g \Yн?™a SÜO¸±ZÒSEððmTÇヨ<ÁŒ©# YŠÖ²xÑH±¬ØøÃ>H¢íTªŽ‰FÂNíZóDækžëv|káešA2‹CPRQR˜…b'©bLÆGÏ–oÊk{š*SP\Le™ÂÀ\X×ùF°jL-~ÕƒÊ [K)³ZöÑhmÆãÃ!íúF)hí‘Æ+ºÝRƒ ,_‹ãUïÅÈÃ7"˜¶Þ^éypÜp˜; Ó©#lŽRLÆL„GJ þaè_´³ÞÊã" Tö…Y[Ä…U6¶ŠZ8EyœCú±xzÜÊ$ÎcrÔ£¥þ¥Þ‰_ïA½—Èq„à^Y¯[ F‡0ž@¬R=©ÿ‚=ÇÒG²É”EeI%Õ‡ˆ‘d©ìQ:¦}{Õ¸˜Ï$9n3zj—î|2,Q,,#f’¨¼˜*âè¥&AìYHÚ’¶µ-sëÒ25EbÓæÀbu£MFøêµf@jL玙g/Fk¬<]`Ob?‰‡* Û¥‹RùÁ-u= –9‹-ÞµÔµ¿¦ÓÔííÊÒîz÷ëÆ^M­( ˆ¢\Ì(Åk2E )uçGÖ“ÏQlþ‘J÷Ö¡È…m$gû*¾¶I#xZ&+ÇÅzE±XÊÄM…b•70ˆmæ‰ lBÑÎ×±ëV9ã|ñ>ó¸¡a™}ð;Ëëú[œÖôp™¸ÀŒkcïfúØbƒ‰jüÖ`esDK:ÇnD>QÚ<Ã"òT}€!½Û:D¤x4¦"‚õ顚ò#i”!i{£²·ìøáh´ÖÃÁîÜÙÒ)ͨã-ò)x4TÐ û´’H¤‡¢g}ÿ”äR<±˜@#…êëM}.ÍæÎ g›4ÍŸtT•–ýÌQ( “™ŠÖè$U'­fÓp^CA‰´FÝú`]R¶†H¡²Ã—®dZ"Y5Ö BÅ&˜A2Ãâ ®6—õž>ùmÌ5f3“¤…'ã4çÒôà·áß”-üÍ¿S¿/îP}ÖÏème‰~SàQ_µži'i³Õ¶×wÌI¡×ÝD‚cr’¾Ï ì×ñE2Uì¤1·%\€ÆñH«!µ~Ì|b­Žâ@Áº$üR»DjhÐi–n8ãØï#󯆴2}e™™ãZ;°£¾^ÉÊó©;Ž4_åHÂãMg*ˆ´—ªXÉÖ°ÈàhàÅäBéÂpÚå’¨òÁ¸HÕ=SÚÁ²€Ñ(q¶gzDUdø¸#íõŽÖ9NHÖEXƈ¤Jg‰Ù¸¬¬Ô$^ ’Ex}Ò;y2Ë­½¨»Ò0Œzç…Û¯&6=ÔPÛ‚MRýéÆQ·ãef» |.^¦ÖñøK,õµ‹ÄKÙÅdÌÃ~ؙˣ갽H˜Ós¨×À-µ²Ç ÀÕ´¨dd‰aU+%7j­ò¹QçŸD JË`jûZFjrL“§Ή/Jàœ‘Ä&Ç«°¢ °øÙ-¨0ó,„¶Ê8H¬'(_Ccm¯8vÎD˜·1¼l <"}!ÕÒ¢Þs.9ðH/3âÌ\}™.zp[¢ï›æ]#¤ß÷ð7|?5oÎ×ý˜mïÒØø/ð ^~?€ýQý žáo^Гhðÿf0Ö¼øwwãÚõ¥*ƒú3I¸]‹„ð¦!¬ÇŽð³ÑŠ ÃÖh@ŠÚ>1Dk&rD\žKRLWË¿}QžãL@˜|Qø4àÜÞ=èf屚i›M„Í8ø(R¸·õWôüħ*LŠ×ÀÙ`Š›š¹üÏœT+ìíÆ_©úü0—ÉõQ²$\úœSèk„0´P•K¦ðJˆ×¶vd¡;_þíÇÀ“/öuJ3Ñ\Ús®ŠsyYªO>ìñ^YO6Œ`º½/Ìg¼½s2õ¯è‰ã;Ïh¦±ÀÂ>îPË5öK#x†£.>dåò×é÷‹P8eæûÚ°Á¿ê—dªºÜL.—½Ë”NÝé <\×5íLÒ5–UN]³UhçOª—ñ7íŒ^Á@ýõ‚¾S­%¸–Æömœéìþ;*2làj{3ñå¯Op> endobj 6000 0 obj << /Type /Annot /Subtype /Link /Rect [60 771.500000 94.5000000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn3 >> endobj 6001 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 126.750000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn4 >> endobj 6002 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 123.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn6 >> endobj 6003 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 177.750000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn7 >> endobj 6004 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 120 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn8 >> endobj 6005 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 136.500000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn9 >> endobj 6006 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 167.250000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn10 >> endobj 6007 0 obj << /Type /Annot /Subtype /Link /Rect [87 721.250000 165 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn11 >> endobj 6008 0 obj << /Type /Annot /Subtype /Link /Rect [87 714.500000 201 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn12 >> endobj 6009 0 obj << /Type /Annot /Subtype /Link /Rect [87 707 191.250000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_commandline >> endobj 6010 0 obj << /Type /Annot /Subtype /Link /Rect [60 700.250000 142.500000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn13 >> endobj 6011 0 obj << /Type /Annot /Subtype /Link /Rect [87 692.750000 109.500000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn14 >> endobj 6012 0 obj << /Type /Annot /Subtype /Link /Rect [87 686 112.500000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn15 >> endobj 6013 0 obj << /Type /Annot /Subtype /Link /Rect [87 678.500000 129.750000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn16 >> endobj 6014 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 144.750000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn17 >> endobj 6015 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 108.750000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn18 >> endobj 6016 0 obj << /Type /Annot /Subtype /Link /Rect [87 657.500000 114 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn19 >> endobj 6017 0 obj << /Type /Annot /Subtype /Link /Rect [87 650 119.250000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn20 >> endobj 6018 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 129 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn21 >> endobj 6019 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 192 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn22 >> endobj 6020 0 obj << /Type /Annot /Subtype /Link /Rect [87 629 154.500000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn23 >> endobj 6021 0 obj << /Type /Annot /Subtype /Link /Rect [87 621.500000 125.250000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn24 >> endobj 6022 0 obj << /Type /Annot /Subtype /Link /Rect [87 614.750000 133.500000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn25 >> endobj 6023 0 obj << /Type /Annot /Subtype /Link /Rect [87 607.250000 125.250000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn26 >> endobj 6024 0 obj << /Type /Annot /Subtype /Link /Rect [87 600.500000 139.500000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27 >> endobj 6025 0 obj << /Type /Annot /Subtype /Link /Rect [114 593 192.750000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_shared_ptr >> endobj 6026 0 obj << /Type /Annot /Subtype /Link /Rect [114 586.250000 176.250000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_generic >> endobj 6027 0 obj << /Type /Annot /Subtype /Link /Rect [87 578.750000 168.750000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27a >> endobj 6028 0 obj << /Type /Annot /Subtype /Link /Rect [60 572 175.500000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn28 >> endobj 6029 0 obj << /Type /Annot /Subtype /Link /Rect [87 564.500000 123.750000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn29 >> endobj 6030 0 obj << /Type /Annot /Subtype /Link /Rect [87 557.750000 123 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_types >> endobj 6031 0 obj << /Type /Annot /Subtype /Link /Rect [114 550.250000 142.500000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_limitations >> endobj 6032 0 obj << /Type /Annot /Subtype /Link /Rect [114 543.500000 224.250000 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_overloads >> endobj 6033 0 obj << /Type /Annot /Subtype /Link /Rect [87 536 144.750000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn30 >> endobj 6034 0 obj << /Type /Annot /Subtype /Link /Rect [60 529.250000 141 536 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_directors >> endobj 6035 0 obj << /Type /Annot /Subtype /Link /Rect [87 521.750000 134.250000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn33 >> endobj 6036 0 obj << /Type /Annot /Subtype /Link /Rect [87 515 129 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn34 >> endobj 6037 0 obj << /Type /Annot /Subtype /Link /Rect [87 507.500000 175.500000 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn35 >> endobj 6038 0 obj << /Type /Annot /Subtype /Link /Rect [87 500.750000 137.250000 507.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn36 >> endobj 6039 0 obj << /Type /Annot /Subtype /Link /Rect [87 493.250000 153.750000 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn37 >> endobj 6040 0 obj << /Type /Annot /Subtype /Link /Rect [87 486.500000 114.750000 493.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn38 >> endobj 6041 0 obj << /Type /Annot /Subtype /Link /Rect [87 479 124.500000 485.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn39 >> endobj 6042 0 obj << /Type /Annot /Subtype /Link /Rect [60 472.250000 145.500000 479 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn40 >> endobj 6043 0 obj << /Type /Annot /Subtype /Link /Rect [87 464.750000 147.750000 471.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn41 >> endobj 6044 0 obj << /Type /Annot /Subtype /Link /Rect [87 458 167.250000 464.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn42 >> endobj 6045 0 obj << /Type /Annot /Subtype /Link /Rect [87 450.500000 165.750000 457.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn43 >> endobj 6046 0 obj << /Type /Annot /Subtype /Link /Rect [87 443.750000 181.500000 450.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn44 >> endobj 6047 0 obj << /Type /Annot /Subtype /Link /Rect [87 436.250000 141 443 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_optimization >> endobj 6048 0 obj << /Type /Annot /Subtype /Link /Rect [114 429.500000 140.250000 436.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_fastproxy >> endobj 6049 0 obj << /Type /Annot /Subtype /Link /Rect [60 422 113.250000 428.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn45 >> endobj 6050 0 obj << /Type /Annot /Subtype /Link /Rect [87 415.250000 162 422 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn46 >> endobj 6051 0 obj << /Type /Annot /Subtype /Link /Rect [87 407.750000 128.250000 414.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn47 >> endobj 6052 0 obj << /Type /Annot /Subtype /Link /Rect [87 401 142.500000 407.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn48 >> endobj 6053 0 obj << /Type /Annot /Subtype /Link /Rect [87 393.500000 126.750000 400.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn49 >> endobj 6054 0 obj << /Type /Annot /Subtype /Link /Rect [87 386.750000 135.750000 393.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_default_args >> endobj 6055 0 obj << /Type /Annot /Subtype /Link /Rect [60 379.250000 87.7500000 386 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn53 >> endobj 6056 0 obj << /Type /Annot /Subtype /Link /Rect [87 372.500000 139.500000 379.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn54 >> endobj 6057 0 obj << /Type /Annot /Subtype /Link /Rect [87 365 132.750000 371.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn55 >> endobj 6058 0 obj << /Type /Annot /Subtype /Link /Rect [87 358.250000 137.250000 365 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn56 >> endobj 6059 0 obj << /Type /Annot /Subtype /Link /Rect [87 350.750000 151.500000 357.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn57 >> endobj 6060 0 obj << /Type /Annot /Subtype /Link /Rect [60 344 112.500000 350.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn58 >> endobj 6061 0 obj << /Type /Annot /Subtype /Link /Rect [87 336.500000 175.500000 343.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn59 >> endobj 6062 0 obj << /Type /Annot /Subtype /Link /Rect [87 329.750000 222 336.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn60 >> endobj 6063 0 obj << /Type /Annot /Subtype /Link /Rect [87 322.250000 183 329 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn61 >> endobj 6064 0 obj << /Type /Annot /Subtype /Link /Rect [87 315.500000 192 322.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn62 >> endobj 6065 0 obj << /Type /Annot /Subtype /Link /Rect [87 308 170.250000 314.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn63 >> endobj 6066 0 obj << /Type /Annot /Subtype /Link /Rect [87 301.250000 129.750000 308 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn64 >> endobj 6067 0 obj << /Type /Annot /Subtype /Link /Rect [87 293.750000 272.250000 300.500000 ] /Border [0 0 0] /Dest /#d5#84#14#19#bd#d8#0d#f7#04OZvU#85c#bc#d2#a2m#2a >> endobj 6068 0 obj << /Type /Annot /Subtype /Link /Rect [60 287 110.250000 293.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn65 >> endobj 6069 0 obj << /Type /Annot /Subtype /Link /Rect [87 279.500000 132 286.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn66 >> endobj 6070 0 obj << /Type /Annot /Subtype /Link /Rect [87 272.750000 140.250000 279.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn67 >> endobj 6071 0 obj << /Type /Annot /Subtype /Link /Rect [114 265.250000 178.500000 272 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn68 >> endobj 6072 0 obj << /Type /Annot /Subtype /Link /Rect [114 258.500000 178.500000 265.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn69 >> endobj 6073 0 obj << /Type /Annot /Subtype /Link /Rect [114 251 178.500000 257.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc2 >> endobj 6074 0 obj << /Type /Annot /Subtype /Link /Rect [114 244.250000 178.500000 251 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc3 >> endobj 6075 0 obj << /Type /Annot /Subtype /Link /Rect [114 236.750000 199.500000 243.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn70 >> endobj 6076 0 obj << /Type /Annot /Subtype /Link /Rect [87 230 143.250000 236.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn71 >> endobj 6077 0 obj << /Type /Annot /Subtype /Link /Rect [60 222.500000 106.500000 229.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn72 >> endobj 6078 0 obj << /Type /Annot /Subtype /Link /Rect [87 215.750000 159.750000 222.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_modulepackage >> endobj 6079 0 obj << /Type /Annot /Subtype /Link /Rect [87 208.250000 163.500000 215 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absrelimports >> endobj 6080 0 obj << /Type /Annot /Subtype /Link /Rect [87 201.500000 183 208.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absimport >> endobj 6081 0 obj << /Type /Annot /Subtype /Link /Rect [87 194 156 200.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_importfrominit >> endobj 6082 0 obj << /Type /Annot /Subtype /Link /Rect [87 187.250000 165 194 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_implicit_namespace_packages >> endobj 6083 0 obj << /Type /Annot /Subtype /Link /Rect [87 179.750000 139.500000 186.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search >> endobj 6084 0 obj << /Type /Annot /Subtype /Link /Rect [114 173 207.750000 179.750000 ] /Border [0 0 0] /Dest /#9a#aa#130#40z#fd#18#b13#98#e8#5e#ef#01#d61#21#85#e5 >> endobj 6085 0 obj << /Type /Annot /Subtype /Link /Rect [114 165.500000 178.500000 172.250000 ] /Border [0 0 0] /Dest /#d6#f5m#ad6#a4#20#2104#13#bb#94#dc#e1#7d#e8#a7#83#7f >> endobj 6086 0 obj << /Type /Annot /Subtype /Link /Rect [114 158.750000 207 165.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_wrapper_split >> endobj 6087 0 obj << /Type /Annot /Subtype /Link /Rect [114 151.250000 233.250000 158 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_custom_module_import >> endobj 6088 0 obj << /Type /Annot /Subtype /Link /Rect [114 144.500000 185.250000 151.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_static >> endobj 6089 0 obj << /Type /Annot /Subtype /Link /Rect [60 137 105.750000 143.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_python3support >> endobj 6090 0 obj << /Type /Annot /Subtype /Link /Rect [87 130.250000 139.500000 137 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn74 >> endobj 6091 0 obj << /Type /Annot /Subtype /Link /Rect [87 122.750000 127.500000 129.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn75 >> endobj 6092 0 obj << /Type /Annot /Subtype /Link /Rect [87 116 144.750000 122.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn76 >> endobj 6093 0 obj << /Type /Annot /Subtype /Link /Rect [87 108.500000 163.500000 115.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn77 >> endobj 6094 0 obj << /Type /Annot /Subtype /Link /Rect [87 101.750000 134.250000 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_2_unicode >> endobj 6095 0 obj << /Type /Annot /Subtype /Link /Rect [60 94.2500000 161.250000 101 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_multithreaded >> endobj 6096 0 obj << /Type /Annot /Subtype /Link /Rect [87 87.5000000 187.500000 94.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_thread_UI >> endobj 6097 0 obj << /Type /Annot /Subtype /Link /Rect [87 80 152.250000 86.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_thread_performance >> endobj 5998 0 obj << /Type /Page /Parent 2 0 R /Contents 6098 0 R /Resources 6100 0 R /Annots 6101 0 R /MediaBox [0 0 595 842] >> endobj 6100 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6101 0 obj [ 5999 0 R 6000 0 R 6001 0 R 6002 0 R 6003 0 R 6004 0 R 6005 0 R 6006 0 R 6007 0 R 6008 0 R 6009 0 R 6010 0 R 6011 0 R 6012 0 R 6013 0 R 6014 0 R 6015 0 R 6016 0 R 6017 0 R 6018 0 R 6019 0 R 6020 0 R 6021 0 R 6022 0 R 6023 0 R 6024 0 R 6025 0 R 6026 0 R 6027 0 R 6028 0 R 6029 0 R 6030 0 R 6031 0 R 6032 0 R 6033 0 R 6034 0 R 6035 0 R 6036 0 R 6037 0 R 6038 0 R 6039 0 R 6040 0 R 6041 0 R 6042 0 R 6043 0 R 6044 0 R 6045 0 R 6046 0 R 6047 0 R 6048 0 R 6049 0 R 6050 0 R 6051 0 R 6052 0 R 6053 0 R 6054 0 R 6055 0 R 6056 0 R 6057 0 R 6058 0 R 6059 0 R 6060 0 R 6061 0 R 6062 0 R 6063 0 R 6064 0 R 6065 0 R 6066 0 R 6067 0 R 6068 0 R 6069 0 R 6070 0 R 6071 0 R 6072 0 R 6073 0 R 6074 0 R 6075 0 R 6076 0 R 6077 0 R 6078 0 R 6079 0 R 6080 0 R 6081 0 R 6082 0 R 6083 0 R 6084 0 R 6085 0 R 6086 0 R 6087 0 R 6088 0 R 6089 0 R 6090 0 R 6091 0 R 6092 0 R 6093 0 R 6094 0 R 6095 0 R 6096 0 R 6097 0 R ] endobj 6098 0 obj << /Length 6099 0 R /Filter /FlateDecode >> stream xœí]O¯$¹m¿¿OÑg~[’¨@À³³ ‡‹] ‡ ‡`lÇ02FÆ>äë§T%ªJ”XO¥®îê~û<ðΈ­&ÕU$EQ?Q?üË/ÿuùï\~øñ—ÿ½|ÿøËËðjõ0ÿïþü~Mî5þûb¾|ýöòýòýåç—ŸÇÿ~™¿ðËÿ6þëÿ.òò¯ãÿÿzùÿ‰ŒB‡o/VØñïÿ™þöVŒÿÒßþ——ÿÝåo#Š‹ƒÉÛ¿WÊ;=„a¼!úû þL1ýùÇ׿½ü0?€}RŒõv¤ Ppäåïzùsøm}ƒ•ëÁÊ \ÊÏ;쀗—ð'õÆ$Tx_ñ†å1ÈøÄ0‹P—µ@5*È/÷}†Nhïoô ÞÇ?C'Ì0\¡u÷gx=¬½œc Ÿ‡ãóó(ì¾±µ'ÒAzyŠskǃäèòUQz}+goíøä3·ÅðêÜ8}MY!ÜL?ôin‹”¯/ƽ á¥s"õ²k.±eŒýc{úÚ…|{°TÆHùúBF2Òpä3—üw|'ÇO¿Ëž‰(ž‰àfÂï_üôëË_üE˜Ë¯?š^òüׯ£Áå÷ÓïÖ—_ÿxù§aæŸ/¿þõEÈWPS|úMŸˆOÓ'.9^ŒÔ«®ÃOÓ'úUI'²OJ&z"¨W ÆÙŒ Ë^þ8}òÓ¯£>/¥¢*æ—j¢ª-Ö„ ¥×)á7-J(}M •  2R % ½ìš ¶\®„ÒÖ”P*c¤J8Òp¤v­„IÆ©J8Æ^ñ«Y ‡WcEЊÍâÕE8VÅXåbBA- kÙtXJa nŸa(†aÍš»ïÊ÷Ì À"$¸Iuǹ êÝDÕ"¢v"åëø¥!êpê¥|Æ›6ªg"˜I{ ÐTÌH b²ÁL½ g¹˜¿Çp#ÚÌV U|›*Z@Xôi`5€ÕÁOz4Ú°Üfç 8¬>¬Uûùý:x•à,·Oºìô\!êª4jMhVvcˆ²v㩎”BÙC¯¨ÌÈ›†(»Ñ5e7PˆRÙ§^³\Ì©Ê>Î?QÙ5§ìÑ©5… ‡ê«€‹) ,{ÞˆÙïlLXü$×:) ¡X…†¢aMh6§‰¡8S3”Q‘‰”ÂPB¯hÈ›šŠƒš¡8UˆQ¥¡L½ g¹˜S Å Œ>±³ðvÁë8ïÇÕqÖ¸ø0J¨ýÆÕÈìøGÜáF” ²#‚ìŠT‹7ÈžgÏ¿uöó>oãÝÊþËËè~”÷kB«ÿräþË ºâ¿ÆÇâ¦uî~¦^³Jl° ¹ÿrƒªø/7ÈBŒ,ü×Ü r6‹9Ó9ÑòS%ovSåí?ÔãÈ/ÇE2Íæà„ÀéôšÐlRsP3i¨žN¢Í¡WTwdƒMEÌAÊš9HQˆ¥9L½ g¹˜SÍAúÇ{Ëi‰÷ô| Ë'6ÞÑ\ãÔ€ÆÕ3š $1.P5ã*R.¦62Û½¢ñ lJb\#³ŠqMÔJa\S/ÈÙ@.æT㇯ó3k\§‡¬Ïi¼óy>Âg¹IÇ~‡çƾ5¯eü«¢› ü'røùÍ«òä*ÿ wxêž÷´sï·Æ”kB³S2‚8%#kN©HA¹˜‚Ê|Jè²Á¦ NÉ 5§¤iB-P §¤/”Ø@.æT§dì8¥{…n„çÖQHÍ:2Á®Ê?sríðÏ÷4|ľÓc§“cßÂFô¶×ÜVUÖ„fæâÀœ¨9°"5èbj0ó?¡WtPÈ›q`Öט¥‰Î@)ØÔ r6‹9Õ9ƒjó·‚ßXôDH=ù÷cÝ»]®‘x+ó¬àcƒ¶÷þ4¥k:öE7´¬gמ=üg6ó£æc÷ßH5´;h‡ûþ`ÄšÐ젽ϴ†ŠƒöEîÓÇÜçÚ¿N½fœØDì=qÐÞÕ´/2¹Þ–zê9ÈÅœé ý€.åYÍgKzœíª›|$ûNœú!{mü'‡n»®Øp¿‰‹uÒ½Ò-;ìø}t²J¯ WýÈa‹^Ô`‹^RØ¢—%lqêe×\°•ý¨Á½ °Å@¡°Å@Ñ®a‹‹Œ3a‹^"l‘÷»Ëkß²îÇ&ûø5ò†¯Ù@¶ïÝm¤yPÙR•¡¿¾ægA>_Б:`ëq†—z‰8 5d„Ö(qŒ“I”¨jðR_ìZx(á¥S¯%"lx©W5x©Wt&Ph”8÷‚œ äbNá¥Â²ùšûî¶1WBwŠŒÐ¬jš€;½®;}‘‹öºwN½¢*é ܉bUÓ5p§×4³(…ªéî\Ø@.æTU3î]¤5ºy*ã©bxÔÎ$$å|P ÍZi ’ÒÛ’Ò FoK$åÔ+jÍ”(fÑJ[CRzKÓ¥Rh¥MHÊ… äbNÕJ‡Hʈ ¯uâ]«6=OÏòµ8AuìážÛƼ‡‡w”vXšmÉTßè%k¶T䂼/Q}S¯h+>Cõ¡˜Å–| Õ7ÆB…˜Õ7÷‚œ äbγ%7 ý­Àù˜”o4gÏÏ;rÍ÷B[÷ÈáMõ Mºðî$ ‚².„6ƒtaq²6È@(q…šã gJn±W0¸lf¸Â@(q…* 1Wˆ½ g¹˜S R ®pã%o=Yºž­$~^Ú«„2áï„^š•PI¢„ªÄߪ¦Ú¡(þ.öŠJ¦T¦„J%T%þ.P‡B Åßa/ÈÙ@.æT%T ×õÞH€ðk…öAWîì (&<ŸV~MhÖW-ˆ¾êš¨@IShVìõQËL_µ úªKhÖHOÅ…fa/ÈÙ@.æT}ÕoC³F*R}íÂõ±JA8No5îHPkB³ÞÚè­-9ª¨BYŠÈ‰½¢^Z‘é­ˆÞš‘¨ŽŠ1‘ƒ½ g¹˜SõÖš{ëmÏ¡~§ôتÇ.Še×É€ðr0w-[š-Æyb1¾„Hª¤ªì)D"öŠá‡Ìbœ'ãJˆD Z*ÆQˆö‚œ äbNµŸÊÜfc…÷6‡Žu{Ï!݃ëg6Á-´_šÍÀ1WÂ-•æ•„£p‹Ø+ª¹Ó™8 fàJ¸E Ò,Y fàdÒ{§23p·~¸·°x]gJø ¥ã”ôS§ðÚ Ñ§òM>#\q DÎê.qÑ㟿ÿéåÓÝuZJ7é´R%$$Úµ…Àë4@xö]ªÜ±6‡/kŽô'0ô· #hNP;ŠÊeœ¡Ž×Ù (×Ù'ðAo?PòüBŠÔÓz¥§‘Ãx™`),ð·kgâØmÌœÅf{“3ú ™*-yXZ£d Î#¡ç‘ERCB ç™zEÓ… ΃bR”,¡瑊¦h…FÉs/ÈÙ@.æÌ(YÂÝá<ï~Gõóé=› =ËðuDZ¬»Ú‘¸z ŠÞ¼PŠ&YX®<.>22`[ÇÅUeG¹gJ~\<ö²k.ØBDUlk_TGehGŽ‹Ï´8ÒÈ%ÿg£@ÔVש¸ŽYú`VÏ} ¹¬H¥ÿ„¦°êØǾ–wZÕäFø×CŒÇ†š›î»·=Úä×cS¸ªÖ„æpÕL¢t5L¢,²­Ò•˜Ä©W G]†ID1K¸jk˜Diiî8PŠpÕ&LâÂr1§†«®“È{c>Ü¢EßJ?pº}¶]!îAOwÖ,„fÍöÞ%} Þ¥ ï ªÙS¯¨¹>ƒw¡˜E³} ÞR½D³} ïš{AÎr1gjv¨ú5ûN#yÍuíš øò7lLW˜_¼d§]¨A'»kÂõ9=%ôù9=%S5¶ÒïÁ—<Þë’’["àbúJIÜ£ ô,„´CÁh ŠfãVÛçy½{„ëÄ/KÏâÒÊùinçöšÄAVkÂí¶×‚ Ül7¢ƒ±äÖæül¢¡ñÙ“GýíEËê³+šUš`Д®aД¦4¥K ÚÔkŽVl šÒ5 šÒƒ(4š{AÎr1§F³1h…Óz ’îÇRîàÚ¯üäƱøÑ·ò3í±±I÷F 4òÚègN4+‹q¶u%a®¬%Él5¥/ò”÷ÔË®¹` iØV•„¹  2d‘04©Z%Ìg&Ì•Ko˜/2Ô‘ ¹&Ø•鸚`£Ï¡–ØsÉFÀÇ>r|¨_ä»1¡·ßåÛšnU.UHжçöUHRžTHR¾V!IÙ"åË IS¯8Mû¬BŠY¦q_«¤|‘ûòe…¤¹äl sê4î»%øjÍó_Wu¼G¾È¼k°cwû'›`X.gTkB«ý Å¡@ÔŠC 'ï…ÚßÔk¶¯Ä›¤8ˆZq(ôa Pû›{AÎr1gÚˆ„ÂûÂÎæO¥•ïgDªNeüšÐl0ŠÀÙ@Õàl (œ-P ƒQ ΖØ`“ÀÙ@Õàl )œ-P ƒ‘‹…¨ ζˆ9Õ`ÂÙø$æF9ùca«íÐù¬;QžŸã{@رx›öʪ7.ÄwÅÖG»CS çåšÐìÐ4)[ºV¶ Š è²lÙÔ+:,•-C1‹CƒZÙ2š¯ ”Â¡A*[¶°\Ì©M#ŽÀËëÚÁªpÓÏ¡Ôu?øHã«‘vƒÔ©*šÖ„fƒ4¶†@KH`KÒÔ+œÍH(f1HSC ¡¤@) Ò$ÒÂr1§¤M$~›ôˆÍî]•CqÞw‹#vÀâ{fñžë—ݹݛl‹-¥ôšÐløŽ´ÀÕZP$©À—­©W4l—´PÌbø®ÐGSnR¾K­… äbN5|Ÿn.»-l©gjCÎÞe­O (%Ö„VÝÓ)ô¤WÑ=]$h´( =M½fÝJl°I =é¡VèI4Ý(T÷æ^³\Ì™º§EÃ=Tí©ù=ñaGlÔUB–ÿNÏ©J¯ÅRÖÉ® Wïnj‰®Û¶²»©C}ólçQOÉ—|rêe×\°…U˜°­+»›ZB!ŠÝÍ@ÑêÕîæ"ãÌÝM­Þ®ôt쯷>ʱ³Ós÷efSZ:Æó¡šÕ{‚䇻aÞÕ w6•PkBó” á4¾•Ú”\dL4”§©Wœr!C8¡˜eJ†ÂIÍÿJ1%CB8-l sꔬªlujÏ"’ŸØ…ÿ~ÔX¥Qˆ^0VnMh¶sCʈiS+#¦‹DŒ6e±©W´c“•C1‹›Z±qmTˆ)ˈͽ g¹˜SíÜ&ûã°üE¯=`‚cá )¡®Qßɍ޽ò¹_‘'kwJ6ᲬXš’#¸,íj¸,]$‰´+qYS¯èt\†ËB1‹Sr5\–v4å(…Sr —µ°\Ì©NÉ!.‹$î~Jœ7ÌbªçpøŽû/ïµøànr˰#€ù§ x•¢u7ýÆoCìÌukŸ*Ó™ŒÐê_Ì@pgf¨áÎL‘4C‰;›zÍþ#±Á&Á™¡†;3Mkš¡Äͽ g¹˜3ý‹wöÛÛuî*pÙ±v>Òõ½ø¯‡Õ»f'hܨ‡Á¯ ÍNP,¡‘5,¡‘Khd‰%œzE''3,!ŠYœ ¬a  XÂ@)œàÊëÉ K¸ˆ9Õ Ê·±„Ç*Ô»O×v]ò Ù#\nkÂõõŒrç×0€È3þœtW]¦×ÕóJq`ŸæSÞßÔË®¹Ä–Fø¶]e—ÐhzÎ2Pè.a áÈÝj—p‘qæ.¡1Ñâ‘]ˆë,³Ð³v£ñÒFäÆ{K~Bâ#Þþ [·ÊŒI¥­¤Yš)KSÆÖS¦H#W"§¦^1P²r Å,”­!§Œ¥I±@))›S ÈÅœH¹ts!¿!Æ› ¯O=N?5Ñó{îötz.žê¨üÓUåàÔ;GŒK7#æ„f—ã `Îø`Ι%;”€¹©Wt)È›0g| 0g|‘'ó%`nî9ÈÅœérìnFdëþ÷¬ÃzW!óË´î5;$ØÉ­¦c¹MÑŠÚmжÈGXQÞ¦8õšM#±Á&¹MÑŠÚmŠVÐìJ PÓ™{AÎr1§šŽDŒÒl~U(Rl­û{]÷»3äðµëžo+°lÐkB³ý),³ª,³ŠË¥°?•€e‰ 6 °Ìª°Ì* , ”ÂþT–-l sªýA–ñSWÏuV÷ÚUxæý“vÓt壑kB³éh‚Õ²º†Õ²šbµ¬.±ZS¯h:Ãj¡˜Ått «e5ÅjJa::aµ6‹9ÕtLzÑ|¹ŒŽKf6–+='ÈŽ]œòGO¡¬[™;à¾kÒŎή W§^­Å9ÛPI½ZkHZÔN‰˜ÕJŠñ·~¼ÊsÓ=±I‡»Þs¯Ççwì< Õ©½“€O—|Fh5;'Jbü ³sÅ:Þ‰%1õšÍ*±Á&AI8QCI¸f%…šÝÜ r6‹9ÓìœH(‰§ÂR?“¡ì–œÀM,iýšÐl(ŠTòqªVÉÇ n§ÊJ>S¯h*«äƒbC‘µJ>NÒôA †"S%Ÿ… äbN5•ðOñó­rÒu].Ÿ„?¶zèauÿœZP bMh6. Uyœ®UåqÅ’Üé²*ÏÔ+Ϊò ˜Å¸ V•ÇM0Ja\ªò,l sªqéùà“Öíµ { ¾ûãG]7p>ÿ©L§S1éÖ„«SÎà4m_I=¸"-঴@ž<˜zÙ5l!Û¶’zp†¦7…¦ GjW©‡EÆ™©gŸ³>?¿¶½èÁS¼•½/ƒ2²M8-½&4O¢Ž€&œ«&\‘Úp¾ML½â$‰l°I@ÎÕ@ÎÑDM “¨K ‰… äbND}MtTWÙØ[9¢^×ôpìÆÖ3MÖ]»c;JÎô R=½¾ã˜tWÖ¯£lÌj`ð0SñI{ÌáÓ]ƒs)^$´ºÇñçäîÑ5`Œ/RP~(1S¯Ùý%6Ø$À?Ô€1~  µ@¡îqî9ÈÅœé½H7­í˜™{p“=¨—ÓËI¼ÇùTE͆üõè_»5Þq^ã Hf³§ö"ÝüÚpÛGAÄýVÑä™{ÑÂÔ^›ӥ$86/k86_$¢½,qlS¯8Ê Ç†b–éRÖpl^Ò´z Ó¥L8¶… äbN.âØö¤äî4=ãöOS–C{WmÃck(ö,}~«Þ§$…à˜ËE"¡Ù&z¨A}±sà¡„&N½¢·ƒ šˆbo5h¢º(…7„M\Ø@.æTo¨“Ú°œ{|Ã†×øH‹ìñv~‹Di“3?=ºç.õܧ¼=׫êÝO9\á5‚Â¥d+B³6¤pž7µÂyÞÐ3ÂÞ”…ó¦^ÑÍš¬pŠYܰ©Îó†žx” ›T8oa¹˜SݰIš¾37¼gwûØú;¶xñŠÇz¸Žó]Ïã‚lª­7ãÀÐì‚Á){WÃ)ûbûË»§<õŠ.Æe8e³¸ WÃ){G7ó¥pA.á”6‹9Õ9Ä)ó‘ÓCòýŸüò.¡­XJŒ"3£ òH%›&…ÕÜk2š… 6sòH¨¡½/¶€|‰Bž{AÎr1'Õ8 D!o\ÓSt¢ãŽãÒmïË)?&Áw…[n—S‚Èsìˆô»ªvóOøØ"!=î±£tfÏ ]+ÙGÎÍÝ+æíx=7Æt=ë§‹{,ŒÿÎFQˆCß"Lß^Œt¾¸¡*‰ l‹¡:RUŽ(¡:÷²k.ØÂÓ±-|‰P©ŽÊŽ"T'Ziä’ÿŽSªã(ðÈÆñtÞX ·qÄíä÷rÕ½Þ¹œúPòw§äjn‡ç¦ØÁ`fs‘ùQ |qÂpW_Efæá|3câ3û0³Í‡òãíÍl\œäf†„ëÍLõf&Ň™}˜ÙæCùéf&%13)23%ÀÌ`ø0³3Ûâ&ùccÇ™bfpuyL43-ÀÌ´ÿ0³3Û|(ï!Mz['ap3æŒZS«ÂæhÀ‘PAŽT‚œ(4µ:õšS§‰ 6s4àH¨ GêPˆ)Ѐ±äl sfjUX÷áÙ>Œ¸9 +,îªÁ® Wïõ 1¶ee¯_x ûðB÷ú§^vÍ[ÄöPÙëÎSÎ{ý†#V{ý‹Œ3÷ú…ʲ¨ü`7JQoå !‹þÛ¹)/|BSnMhö¤È‹¡Ž„J1Ô‘JNmO:íM½æi-±Áf^ UÈ¡R U„AÄ E1ÔØ r6‹9sÚ“"AaøKNzJrŸ^%ªË†ß{Q•®*8·t+Íó­éQzXš½‡$©j©(¤'P '±‰MI =cÐ_ó’Bz¥ð2Az6‹9Õ{¨Tí•­Ä´9-âC~Ì]íYi÷ îu+iG„¿ñt½ƒ~OýÀŽÃÔ=%2{Î…VáaÔÿT’Öˆ5¡Ù)II¨¤¤¦ ©@)œ’N ©Ä›$%¡’’@ARR8%H ©… äbNuJAR|y8Þf7Öø=ªV¬‰O/÷NüñC»‘#‡{î«+g:íîQ#R „\šÝ£±Ä=WsERÚ¢¸ðÜ+º?dƒMKÜ£©©4Ÿ(…{4:ùCc2÷h ¸ðøRqaöø0¡{ÍáÝ=?jÞ-ò§µø”/l²’ý¤ëð9ÿö-ôŒM|Þ¿øTûÊòŽ:œÊò°&4;gˆcq•²¼#ÕS‹wEYÞ¹WtÎfŽÅâX\¥,ïH¥'Ì¥p,’'q:s,îÊò éåMKW•qWÏ4Þs¾ºç¬tQöéˆüÍaEWÇWŽà=éíšpÃò£ \Û.§uMªœ<ǰ°Ôµû–ƒSC^Hu$T ©ŽTšÄVCQHuî5;°Ä›y!Õ‘P)¤:RiJ>P¨ƒ›{AÎr1g:8%Ê)tGDUîØÜ̽ŠooL=‡ØÏ?ï·sM£„Ì]®Gx)ù@J¥Ò›þ‰ÍžðºÖ³ÃñÌzÓQ\&¢€”ÂmþðÈW„ÛÍAPþŽ»§o¹•aѱQ×{Ú>#Êõí¬£Úv¥Û‚¦*ðnë.nKÄméá^n+½ã®r2=öÞ‘ï¹·äÍš½ívž^O ¯_Ï•vn†°s“.—gñ*§:òÏèj?°X²ìØ;êÁ¹¿•>m÷R&¡3gðnè¥"àp¥¡Eâ¥c¶±ÞâwÀ:.Qè©‹{“ujƒ«Ë_ii }ÇWº:ëÀÕ¹†Rš=›.=÷±Ù…Çñ+¬žJK?3n±Ýq:—â»&Üð­ÁR}äéó½!Ú'© 8[ëj”(Õ· …–]麽;ßuÃЀªæÿ;á¶ç{.áŠ,×~סå‹4Ê”¦‡ÙsÁ#û­æ¨y"-5aw2ÂÕç›@`ÜÛr¨œo)ÉÙ£@¡ç›¦^vÍ%¶£±í*ç›@X*CØâ|S áÈÝê|Ó"ãÌóM ‚ýTøÃø&ɯø{ÅÔÛz dª®8Ø5¡uƒª‡(p8PèþîÔkÞ¿Ml°I€ÃãK©ìï‚¢Àá@¡û»s/ÈÙ@.æÌý]€T]‘-’»±RÙQgüôýÝ.)ÿIGbýá² q`©®˜š-SÌ*èf ŬJa™f1EdƒM‚Y]삦˜Õ@),S'ÌêÂr1§Z¦AÌ*¿»Ã[&ŸB;ø‚{] Ø16þ—ےA˜¦4°&4Û’%0M°5˜&X Ó ”–l‚i&6Ø$0M°5˜&X Ó ”–l‚i.l sª-9Îsf¯£¦Ã•ëHiôì³í8˜±'¯Ùs0¯ÉŽ¡í3K0è¼nÌ<‚¯Á ÁS˜a êÌ0±Á&‚¯Á ÁS˜a êÌpa¹˜3 T3ä'»+ºC6çWnéÙ›è9‹¶±`ì9ÙvDÞuãqí8Ë¿§âeß!ÌÖÂ(¬`EhõÀžæm½üÅ…2Jºö&ߌ»4©=ªu­ö¨.òŽZ—µG§^1®ÒYíQ³Ä]ºV{TkšE ”"îÒ©öèÂr1§Æ]!ƒa {¦öüsG•ƒïð¼WY•™hkV¹×Šÿñã¨ö(^'«ÔkB³C¶ä{mk·Øë"y­my‹ýÔ+:\dƒMr‹½¶•[ìÇESñR8d³xàÄr1§:dû6ôöÃà7§6pìîU‰\YéÚ]2mÊ¡”XZ×ñoZÀPZ€cÁ¸“%se®D$kÆÎÕà‚})ü%ŸXn÷ _ó|ðìÜ·˜óª€µà“ÁÀÞ·µ1ö-H¹ÿ- |YŸyl‹â7=ÑcŸ¯U¬ÄÔ`í¶ëc)ÿVÎÆûá]1ÿDÙÀj‰8þ¹|½Ã¦óøù­ozqÕ#R£ËDø±‰P«×ÅùiÛÊ”8¯…dåiâž‚ú¿öê=ö™~æä¨·²eµ±}‰¿´ÔEÃr‹ï›ª:>6åŒ_Lj?…Rù‚çÆ~'F7b×O_í(õ*\ø÷°l§òÏŽ_ð±*ÀsÛPϬ üÄ©çÆrD9J;œÖYç³K[;Æ }eåðÜ64™ÿ¥|`Áš}:q"^$ovüÏ`_6?XÉÏ‹¼qQ}âz›²ƒzþ¸Í¸$ÿ¢WYè7'Ÿ/?¿ü?¾r‘C endstream endobj 6099 0 obj 9182 endobj 6103 0 obj [351 /XYZ 32.2500000 749.750000 0] endobj 6104 0 obj [351 /XYZ 32.2500000 667.250000 0] endobj 6105 0 obj [351 /XYZ 38.2500000 647.750000 0] endobj 6106 0 obj [351 /XYZ 38.2500000 180.500000 0] endobj 6107 0 obj [351 /XYZ 31.5000000 750.500000 0] endobj 6108 0 obj [351 /XYZ 31.5000000 668 0] endobj 6109 0 obj [351 /XYZ 38.2500000 647.750000 0] endobj 6110 0 obj [351 /XYZ 38.2500000 180.500000 0] endobj 6111 0 obj << /Type /Annot /Subtype /Link /Rect [474 758 509.250000 764.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 6112 0 obj << /Type /Annot /Subtype /Link /Rect [426 158.750000 463.500000 165.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/3/library/distutils.html) >> >> endobj 6102 0 obj << /Type /Page /Parent 2 0 R /Contents 6113 0 R /Resources 6115 0 R /Annots 6116 0 R /MediaBox [0 0 595 842] >> endobj 6115 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 6116 0 obj [ 6111 0 R 6112 0 R ] endobj 6113 0 obj << /Length 6114 0 R /Filter /FlateDecode >> stream xœí]K¯ã¶ÞûWx] ñ¡P˜Ç]Ì]]IÓ"H‚N³è߯lÉ_Ê%~>¤([ Ú™\]Qäáy?ßüùó?öÿú}ÿæýçÿìþ|ÿyWê²èÿÙÿýîúº9 ß×M¹ÿá×Ý×ý×ݧݧîÿ¿îú>¿ÿk÷·ÿíõþ/Ýÿ~Þÿ÷î‡?¿tü…_wµª»?9ýÙÖªû[qùóøóïþö‡ýoÇÏŸ6óú¿¿3¶h´:ncâÓ_wçcªÓ¿¿ÿðÛîM€°¯Tª¬Þ+kì^µÝßþûÏÝOÝΡ¦þ'?Þ?^WM÷qÕ쓹mð—[«ºÙº¸¸µî>£‹­”n;T+ÚчNÿÊ,¯",®[oñÓÎÅ¡¢L¥ü«K^®©è›”s?ˆ.ËÇ€]Tñ?í\*çËÅ«K^n]6=€Ú2øÏ«ÇSꈈsܹ4PÎW ︾®mY´ üû]§j‹ÖÊ:Ì.«Ç¸¶]¼Å;—Êù¶áâ‘oÛÊÆ»ío«G¸Sy[´Å;tÛxqA®m¬ˆÁê&€.ËÇ€~SÅ“ ýÎÅ¡r¾ÛÑêŸBVÁ[éì ¯žß}Ù½ùØîUµÿòS·³Óû?¾üº³Ý-Ÿ¿ü¸ÿcQ˜úOû/?ïÚC]••.OûëŸèöô¤94mñúIQžž˜Ci«¦~õ¤éßùöƒ÷§؃5½íùí‰q~OiøÄÀ=Zøa¸ZñrzRŒnÔë'ðÊÂÕðwFPraáÙ „½)$v‚ïKž¨âPÕêøåoOú‹Så¡hÍktx W{׿£Ï.Ol5°¸¹Ü_U8…<ÈU(„~G7á«iƒnÐ(²p³®€RC €’=;ˆÂÿ0üÔpbsƪ9È‹i#"Á[TawÐååK'+㈹²³_Ë9ÝS©óFçÜ&CXR`)aè.F,Ì‚ðŒÿ*$f†ÃeÈ“<7øn>”ð%ŒXÆ?f÷ó9µh뺕—pé¢ßJÒ¯G¾aíð1H¶ƒù`\ñY¾EOŒ)x×qu¿¬UØQf K0-Ôì‚¡‚¿Š0ͱ§!º`m«Æ¬ŒÀ7á…0š¨'ûniì•eäéü$*YA.Jð0Ñp‘,ÅÚ+GÈ5ñ¨Q¦©šGu*ÀWªšÖ!» Ú´ƒòžŸÞ½0·Ìj æ´NÀÒÇTá}?ݘëŸü²ûœ<[ø´‡×whϦÙÀ”’:–å9(µ&ÝAÎ/Ùìµ½Mt=|ÊöüÉáa_Ö°™O´: ®Ì«wÞÂwZôŽÈ´9¸žQƒWû½¡XÀՆ뽱7ü­b#óàBn {>t!3ÑÊÅäk F£^^‘‰ý‰¸à^mL¿‹ûÕ±ïQð®1mÌO»¦Ü[¼s)j¾rä[†©PTùSá“$ñeACs’Y ÉÅC1L8Àƒß ‡Ë88S|@œpùê•Èò&Çqav7ÑÞµ7ZÍV3´U©ˆ“ŸÆ( k[ÌÐH%`ê!…³rìÀi: œdÚÜ¡Iæÿ„•5õ5”Q7’2Üdíþ`HDœÔJ;H™¡ŒÉ’bòÏâvMqœePá—±ÎÅ^x"X®ÀÕòMÿ|Üéd5MÙÜ£“Š0‘ͳ½϶H'¼{F®BüÓõ| p'ràb.pÇ©’©êô‡¯ÀàõŒ%pÙk/ó- 툪ç‹od?"Û³añ˜ÕŸ#Sªþ–!rG;¦PÁ%Fj., ‘9¡)3Ôé‰â£3]rˆfh2.Y‚\…s㵪P¥+k1¨ªJ dn!fo"Ý0`ÎØ*©îiñ>Õ3˜ØÁo}£ï~"Û)ÏB¿åÃJ”v@µy DÙf&Yžz]O“_ÎÝéR1š$ᕘ¹l —å3H6õèy”Z‘~'qk.©sÎ<ÙDw#… ‰º <^^&°6r}1³)˜Þ#D»HTw>ËÉ0À¯òb…Ðî…»^« w侄ˆ‚µ Ö-; |šìüågT<ÊÜœ sœd¨,>ÈF L½N–Ó*}Þ .6e˜áF”-î¯ΧXUJ(õDã2é'¢>7aoöóuô[¬ØvÒ¯*=ÈM¤íd V5›Æ¸â-öä°Äìö´@™·D¹“_ÎhgÉüú‰f'DN{v,‚jZ˜ª\9nr†ðÌÆDJϬ]5ÁÍ^c¶1mKGŽì/’ðø%Óš7ûjåöUªü(QË„á­ËŸ>”Àf.}še«•ï³G`,•ð5‰’µÄQ Âko×àq%²‹e{Ý{¾ãúI"): ž”¦R‘á*£šÄå-ìgfZýôEŠ7â Žm¦¬nàùN†C‰d ¢;zÖF?‰˜£x3X´“ìIEB#T6&S:‰T!Ây©¤%Ù˜À³Lä ‹WÈÖbâíLätq}nUÓ “æhëH£9ð;p4Ç@†¸¿ü¤¿Íã5<#9*¸>¼ÑËx­ÞZ­gáÊŽ‰ ¸4.„ ¢Z9$QíMWBuDÝn’táã'’”=óÎ[øN‹Þ9&Ìa4$è›ãѰp¾Þ 'î¾£á|žóÀ=1 ^}hµóîm`rÑ©º¨Jç7œ0©|EfÚ/Þ,(v™TÆ}e[”y.yùé,9‡¤ŸÅ½”ª¿Y†»l¶Î‹”tQVÈtJEÐJ5¯ÏÐzáúÜ5z2Ì'®6°€[O>ÂïTð¸¼7¼š†ï êî­'à#zRx ¢øNòø°ºÇpÃÖ#Ëž´ç¤5áw–·û±MÅð •ŠßÁþ)ߦ,ÂÿOÁ×l0OÜ\6U¥«Énš©M”±|<Ãéƒõè g`ù%I%w[´ª¬øW'2xjsIKÀ-ŸRDN•CD¬æIÃbšoS1)¦nÕë31Ò-)¦È ù wõ§Ñí$Vl äIsî*Ð49 Ó½™2ÕTµT©úCæ[µ²êªà§„cdbzá/ß4`bÀšKžâ 5S[‡¹a“ ë8Ń ÓcÇQü«xį:±¶r¿‰y37^¶ 2¡¦ß^ìLµO&¥k¬Xo"Üô+ ¥ç¶BRéŽí%Ÿ AfˆLºc"ÙJu*秨ÞxâùÎVñ>ãžQÖu«¿Ìàaª™1àoùÈÛèúËJRk£´kìèK¥‘h‚…qhþèò $…nkûn-W,zR7Ìõè[ø|¼ë©F1ûŒöÍÜ®n‘Ñï'óâ¢bY¶*¦AÅ ˆêèæi­ÌlôõH<ì·Ú"¨+µ¬©\ÖòPB¼iíCpN©:å0ˆÙ)µu­Ød­™¶š˜I0a¨ÉZÉ”™èB–;\Þò¸¯‡'c•3ÃèC¢,«‹JàÆ«­r™’hwÃ!%ýy5dBÎÁþ©";×z ²:©Q˜£¬j#adeÞµhîgd®Ê´ø”ÂÆ”¬Ñ&:@hˆûÍâZÄf©Ö²«,Á™B±,ù¦’vb  !ÂüMݲÊç*c²"–b ._¦„¢hD*—c¼TT¼<_VØ:‹)röµlþ^ÃXÒ<îàíy›ï$’ï„ÉÜÁ^J¼ÚÒ.‰[Ëϧ6WdL—Q ŸufO˜"·°£1•«8SΪ;%ë³’1ÊDÍj¶Mgtã^žèˆšdÌNÔ‚ ©se´‰DŒd¶A¶TŸ[g¥2-<~Q |UÌxßÙ’ro±œœC¾jpÛ$|ô­žqÙãÛÀ›%b9ËÓÑÆÄ©Cs¬CLé71³•v¤b*.ÅØ‹–iúÄRæ»’à(;{#Èù Â=vímã°–‡Ëd^ ÒØÒ!E훢±h’@ks‹› Å æËŽÃcµ‹\ëd³+(µŠêw-FÒR4 "’8B¹ë™D©œ¨ó‰™‘»‘£!)Mul>{WÛjúDÙúÌã²ê¶v@äiª"6W2åîfm„rÎ)Zµ>¼¤ãM¹XkTI7¯þ<|˜ôêǨqô&ΛَòÄ«x”¥Å¸j1GXsÙKd¥RÁ<÷ÅÄÄ5j†]›Õuãªô„®%Ûkwc™³À̼c­uizα¸Éô.QgP`Ê\rÉ£]JZ©¢±çüQ{5b”jì|ÿȃv5õH´TÙšÚÜÕnV–K`ÑÏär<’ Ñ ðÐŽÐ6Uõ¬DU“G/šï§`p‰*Ë“•ºDøÕcÐ2-¤DPg~„ªýZS&Xˆ»/UÆ­(Zéd<“§[ºbMØM8½=âf©È¦Ç(-Ceý<òTt¤Ž§-ëÈ£©Z-?éH–=>ÉÅ0:zšæ–‹Í'³ßš½joZªzAW_zö¾Uzó­p7sãÉpßåA»6Ÿð;-zg˜GÞ1¶>}µZ ÏcàŠ‹¨uæ²jøïM½ w<;À»îYxu0J;¸ø~¾ãÙA5±·øN£.×›ª“/a8áïcaüL¢©¼b&œ?ß•mÁ·Ò‘ä+[[˯9ÊwÎÁJÆÏJ• ¬)™l‘ø)žDS:â2v_ÂåíKÙ˜7SG˜6¥&Ìe€Ø‡Çø($¼{L ßUT ¢eHPˆ9T%|ýT€izÐDQtèaHä* #ýRÁ»U÷ùtrâ!PÛ,®,.&&!›ü1ßAùø´§žÆÊNºVäluÄl{Z;PÈ ÉŽ¬¾ ¥£*!òÁ'óÂ<÷]•¯¹!-®émà“ø-ÏÚÖÝ'sÝL†¾:Æ‹=\®˜š4VãbÆ1û{6fLU{ã–*qÆ MaÒãÌ÷­ÊCáf„38ƒ"LaX6N‘ɨ`Ø–ð ä©Œ©T¥ƒƒŒó‹JëJTË͠ϣ¦©Iö{ ó&È6÷ň˜*û2ÀÜ"‚Û”éž(\»˜í©ä¨½p£ÜT`".ñÖpLªj\µ%ÀÅ@ø6<}×€"úÌâ3ud–k+€ª¢µkT/éKA¥…‘ -CÆC¹DDÅ…n‰›Ë;Œ×Ë-Ô”¸þH(#¼d›´‹jQcí&~º·Fø\ T‰ÆCÔà<È¿ì‹<>³‡ºq4‹°¦=ñôÂ%·,ÛB°v …±h@oAHøž†4"i½©òºž.ȇ%Qª67”šFä©%ëÛ’mêML7äY^øYÖ…ç#“NÔSœ¬qÈÓy93H£Y¾»õƒõÆz¢¬qf$N¢Î…ëJ›ò>Çôž6¥+é69÷_bÄ’ˆ~¾ÒîF©z$JÁ‰ù$+¥µúŸwPÞ§ªëqt‹ ŒZ¾…tŠ´ UY 6H æ×\A*c—÷ÃUÉ6g–˜(°ª~ôIüÑu¯«ÙÚ¾Ä z-1õ—/Á©¬ïÿc0Ÿk!oÄ;€ßñ `‡«Ìñ`!"sôBÁ'xÞ^“ûJunsláé&Ÿ¤Ù©Q sƒpQá½AÚbFYQ;ÀO ñ|§€O )x§ Þ‚gù!KCgålºŸàÝ¿û¯Ý–¼;þ4õ 3TÐæv¼9êèãÞëKÄWA­§§ú†–ПHtßG}DÕøÉT¦•Û¬\+¨³}@ß1SÆû­½}N:rózv³Y—(omöÜ?}tÀÑâLt¬ß8†Â«ÁwBýªƒE¸ãß»Ÿ/Ãî%Ö«! è ¡çÀÔíœK{A˜<^Ã.¯ßß÷º0‡fç]€†ÛQWzÿ$cú´ÿ´û?³öi endstream endobj 6114 0 obj 5828 endobj 6118 0 obj [352 /XYZ 38.2500000 512.750000 0] endobj 6119 0 obj [352 /XYZ 38.2500000 350.750000 0] endobj 6120 0 obj [352 /XYZ 38.2500000 512.750000 0] endobj 6121 0 obj [352 /XYZ 38.2500000 350.750000 0] endobj 6122 0 obj << /Type /Annot /Subtype /Link /Rect [53.2500000 407 81.7500000 413.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 6117 0 obj << /Type /Page /Parent 2 0 R /Contents 6123 0 R /Resources 6125 0 R /Annots 6126 0 R /MediaBox [0 0 595 842] >> endobj 6125 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6126 0 obj [ 6122 0 R ] endobj 6123 0 obj << /Length 6124 0 R /Filter /FlateDecode >> stream xœí]IäÈu¾×¯È³€Éa,ÜÃÀtW· 4¦Œ‘eAÐnëà¿ïÌJ2+3È/ÈøòÅBVj éžb1ñâíëÏÿòëþû‡Ÿ?ÿú?‡ß†??ÿúRÛººüïpþç§Ûèî8üýÐvõá·ß_~~¼|{ùvú÷—Ë ¿~þ·Óßþï ÿzúÿ_üÓÿ4üÒù~iU{úóooö­:ý­ºþyþù_^þý‡¿ŸW?7læþ¿2Vµ½>ocáÓ?^Æcª·þñÛß_~¾ ì+MgêΔ5§õVþ÷¿^þ|úÀ¸|uì­RmcÛꑵúü%kOKè¾:XÝM>ôöÌò*Ââ]ÓÅ[ümçâPQ¦QþÕ]£[[W}ÿþȹl¥š ÐÚFjï«G¸[õñé²si  ×}Û¶ïCÙ@{_>Ââµêã-þ¶sq¨Œ÷Wäݶ·í@:ï~_>ükÕÚx—û¶sq¨Œ—‹WL͵Öãœþ/'ïËGXÜF” —‹Ce¸ðéêßBVÁ[¹ü(”?ýóáû__úc£ëq‹—'Õgø¿óŠž( Ÿ´pµ>éàžh¼køŽg_‰½Á“jüâ~T~ ž“Â;­Œä®ñ-xv aa@a<©ùB`<„µÆ'ÅÐÁ·1?!0qøÎ—ï'ö›s5u½xnámQXy€çN0þã`ÈcŽ‚q™Ù5„¨&¨v§ø?Ç îÔðæ0†lãñIÞ™†oœ¬ŠE¼|>y>)ü‰‡sAþä‘×`Ô£YÁ½a)a!wðpÈMòAäÇÅïàóà]öÇ"÷Â޽ݩ,D-|'©¤ìM1Üîùäù„}bl:šiZ”©<ˆàw°VAðØTväÞ¤I–R[—CÃÝ3ˆõ¬Dž‚T”¡í°.c›¾ì£l:Èy¨˜… ÇKO,!;td)Ãþß©àQ…w@Èg‹ïÛöDŒ à )Õv]1˜D=!´‡ß#–MøÌå™Xgvy†1–y‚)]8 *iñh"ßðy0t0ÆoR«öœ§ä܇DŸy’RJtU[Çgž04ƒ9ä&£ÇŸˆ¬”Ø™?`›·]†»ÓM9<€± !&i,¹7‰/ù¹ƒGSÜ$ßðÈô2hÓÖÅÐYÞÈBe«7@õ•£®Û£5—z¸w¹ uwìúêm§®;÷ŽEOårnµ‹ÐkÛtm=%àn͇5Z^ýâ,¢ð¯^Ü1ÊîÔéÑûßéàîáw¬Ç…,ÜþŽç<øž0¦`|Y€A\†¡UëÂ69ò6%ó3ëÓ{ DÖ'ޱÈ>‰/¡ê“~íˆ(1†¿i&bѸ¢çBêõ(V‰Ì!7÷ðìõÒÐóaB¨ô¥ªcÓª3çDz•:ÞÒäÄX5¢'†ŠþÎÀŸæžT’ʃGE€{3pV;˜Ð¼uFÓÁ€Ä[Òü£µï(Œ€Ùu:Ï® ]˜Ò*ƒ¹Z\õ¯·µ«þm¹8"¢hT'•l^K‘;!<,òÀ1³MúŸK1 %¬Mä³ÇÉ"„¤e>̈Jn»—`S8ÆFÞ7 3sK)qˆÉƒ÷æû-RŒs(F7Çï@F!k1B+ÂFEÓCеêN;×:áú² ¥FN³†9Á{.F<Çåy¦¶»`z9YιYØã,gJT²Ša {V#(ŠÒ1GÃjE€Þ´5P½¸4RCÛÔŽñWY–åÁãÉr3+FÌ£U+Ø0}±ñ}±›®&d¾'B“öÐ=¾0¼ƒD—,’à±äu ¿Û&À%Bd.Ⱥ7klçÌ,¦G@kãŠX !BÁ˜ìa=ŸV+€Wö˜¾#‹·éfv“Ê–‡w2%‘”¥¼<ø¤DÞåRŸpüÌŽ¿øiØÆf¬:Æ&šˆÁõ•C˜ý8?u‘KFäk¦îÆö”[œÜÊæ"Ü–$*ÙŽkÕÙW)bö„ šÑcu¥ç½… Ë~¢úµÝáRë‘öÓ^„yoªº‡ò¹DœèŒq%h)öP,'GJÊÔ„…RÖ £i¦ÊŽ*/µ€,"¼&LwÀ„"ñµxÊ€RHw¥ªÚï[N÷ üK}}£º)•š—ü |NíX§%r¹žU;gHÜý1*N¸÷ \™Ü *«"¿F9±˜ä¹€’!lb½‚©á° á¹<žÂÉêA€dÑ𠥞£3bžq¥&ñØÄtÞõÖá@žòîõj£þºžY©¸ÏRª0vIÄÊ©Ê&f5ÌØ˜`?ŸèŠÉŠ_…Tže«b«<úÎÓ9¶é–(Gû©&_žË†‰9êË1”­A‘"¸lísD™x$%R…(qPX¹±RºËkÐo&V¤ôè«»‚*_剄c‚áÄüKàì›{âù@Ú  $P*7Z€K,rR5~"kðd©¿TÛÊŽÃ/4HÜT\ãúo¢ªìX ¦½ýîSbE¬+p¹éÁåMâ˦5Ì “Lxט×` I5Z™h‚ˆ¹‡âQ¬˜{ÜÁ3†hilt Ñ*=N¥4°Ï°³’qòb7ÆzÏ7•['Z:‡=¸ƒƒ*5#ŽáÙ,ñdo™;!*vöÞ™ ʤ*'1¨eK+¨ ¸‚±8¿×d‘çÇtuçHºJÍ€ê¡TÅâ„Wb'D܇úÎ$“@Ä9’=5zS6ù‘*¶Ëë9D!b~ìÚ–#/»“V¶å†Î$ *JĘv«\i‰ÕJ&í„)R›évºÉšb<|G`5Eà¦;œ±°ÖÇó¿_ÿÛ»®:4ÍùV©á§õ¡©og=ýòð“ß^{Tª×]§®¿eîV1·ß8ýþðßêüÚÁ}»š|ãíg'çGw«t÷ßøË˧?Äó÷vƒS§îî7¿ï6fÌÜtî©1OEì?ÉÏ~6n°ˆV6nJ­Ž¬Ôbí‰JÈÀ{ËûÀ& [G¶³r°ÈÁvF¶W9ØÞÉÁÖ‘ƒí¬l'r°‘ƒíU¶wr°M+Û«DØr40¦ì¬[R;“ÏŽ1Rùí%y²uv+:81ý®ñN ‰ûSIËËÉÌ™ƒo§ì+rÍlªDmxE2Z®¨WŠÊPfT=†,rq-‘Xì’…T2øÃôx:` hü½£ñ÷³?Ñøû¿¿jüýÆß;?«ñ÷¿ŸÑøû«Æßßiü}Z¿ÁN³âbÚMëÀ0¿-à‘·ŒôNTÑúìÿ°Š‹nÒ´ÛBš?ýC’K«{É¥ÕœäÒÊ•\矸’ëí·ÌÝ*æö£äÒjNriåJ®óO\Éõö[ÝÝ*Ýý7’H.­®9úÏ\fRr½Ã0¿äŠ]²œJdôPzJ½‡¤žÇ–”5‰SY}{•”¢ùÇZ|÷ÙìsÃ7E{±dKÏ¡<ßLZÑ`*Å@‰ú ªõG¢AuTBàzU$ê§Ï_(LÎÈÆ7δ^ÈNUgjÜJ6z)e– ~*ot}ýÀÄ¿¾È¢ör–Ti "!dÛ _ÅE°l×(žéˆ&r Y^+ ̾DZšGW‰Úp[]Û‘è pþxVx6Þ!›Ðü-yž4Îi­v¦L¼õõƒ”¡0 e½ÎJõÅ,Ø-´©îsÓˆ°VÖ‘€Xâ;›Ty±)Ó‘é-qñé4ŸnìŸFi>©;²ÊvEgJ&™´Ø¨hÜOt6ô8±ÒšÍܱ,»O4`Ńø;3‘e"‘èµ\òœ»(šY K ÑþB)"UÆ‘*2%Ù¨²së˜z‹Èͼ愲’*¹ž‰rí¤$îïÆÎúsï6é WVJ²¾×aâ$LÌi3cÆLïŠÂ¡sg}¬zÓ®£:*¢„ ±=`¯oÊ1ÔH•uÞBõ\vé2—$ñ¶.æ1²èªŸ# ý6ÂÞ=R…ú:¢ÓÅë0Ñfž à¨zÒò‰yî`ÔÌ;úu¼Dw4üÀ§æÎS]©Ï»ú‚žà 6·ëOpµá;͈-ïçÑpo­Oð;>Á0À°ö¼a=…ÝÞ„5†ŽçN1Àï`<ðàÛ+|Þö†ßWišv‘ƒ1¾JÙçÉ|Œ§¨É˜ËL/eÑÊìxpwW°•JÉJeÂoÛZ•ÍJ;32š/Ž'¹¨qÚÚ‘±óµR‰±†î©Ì”ló¡±LÄ«1Yrgêx¦AÌìÙ¨”óŸ©+db‰1PZ3Ù­.‘>w©ïŒ#󓤯&1ɘdñå‰> Ùõ‚têš^¯Bx( aFú§ª+¡ó(›¢‰ØéÖ"5‰ùôr3&xøºæ$õð7¢0w£Æqz1¬&——L 3=U ι߫-,;Ö…*nc’Úsµ“¡uFžËDŒ‘uõ!f6çê2-DõLxÄstYØ(W˜²­1IöEyþÀÈ¥3žÙÆÉ#bJÉ ½jæ3±zîúë†ì©™ÍÞNÚzŒñx:¶—‘5ý=nMhÇ8*<÷ã…Ó«˜ñÅLÉ :ÕEöot„úDz¦ªà9(}B\¾Î £pbî‚ééI`¬‚»6/©ï@Œµ|îÀˆR-ѽьNI3mû¤™'Íl„fp÷}¾ßÁç!&~ ã5ÖDj¸ž€õ4 øO'i¸ Ï-àïà½=³={ƒ;À°öÌŽÀ8ŠÏS°‹9,¦’Á[™F¶õ×Ã&e›‡jñ=bj¼ó[ŒË;“, SÆÎ`P²tenÁCYÌôSòm{`ùÎ')î½Ú¯k5 ™D-2íª8D: ìÄá^@ë.üTÁ”\¾ÿI÷&Y0$½ _6ò[ Ò}„vL©:ûî n‹é$Qëp”#Îô{™íê&kžÀšH·Tª*e¸ˆiÃOG‹_àj¸-CDS­ðä¹øʤm£ÀY³L74LOxoŒºÆtw#2è"7ÂL†ºJ¦n6Õh‘g§µ"„cß5qm=ÙÆŒ":²(rÒf¶z ªú>û ™ÖfuM¡’­g£d£`Ùž¶ßlOX»‚¿¯÷P1ùÉ’•%RB6­J7\¥êƹj…s `äGŒöø£Â1®’}ÚØs]~„5"/1¶w™‰lY3%ÀWNè^Õ„)+ÂŽ‰Tr†j© ëàñ_ãÁrŠŽÄ¤‚•óüF×tŬºiŒË e-¦]¢ê7á TÙYi¯nÕ”é_#¡´¦ ff«ÙÛVÍ#&NÔ@ƒ©3Ã;©@cn=Q ‚¢•Ÿß†hã·´|Ìöªî\é+ëÌÙR8†t2´—ž °&òçGv&pÐ.1@*R f²HªžØu•e¾àv‡ên‡—Ÿ¬:š Pç[÷hù3ˆÙSÁîLW¸@NM!wÀÛùO¶ái½s‡{ûƒ¿½üêÁšH\ÞZ÷R²kÒŒ‰EùÂ ŠŠ:á“ep1šŒ,¬S X=}v‘‡¤ÊLjm¸”œr+ê ÉßçM®êªø«U?ÀRØi?ׯë+¼ü ­¶‘Wö¨Q=Ì®1ŸéZƒüpû¾Æñ¦ç{ÓZr5t DôçüdÜð-xd5æAxnß6ÄøÅ,¬á\!¼·ˆÜ©6ÊáNOT8Â0Àçùw€9(À¼n¨lÆã¬ùÃÑ Æ*ü 7Œ5zg¨p£Ìi ýxpß6¦F  7x§®ù£¯—p'f’î0Iæ†sn2‚r÷3¶·è¤•\ã1}øÕ0—ó)òµ-ØêŠ\œ`Åœ¾ÜD5ñLl Ü=&òëªubÇÄ…ÆïJÐÉr·RRh÷Æ_·–GÞØúž®VÂDgvNß8"Ë8iÓNkŠ:#¡qï îÖ±šY ,<´“jª®D?cF`„ð 2GO¢è¾uôÙ§JÒÇ8pǺU¥EhàIîôÕ½#þÑjÐÓ r7ÄÐTÊ•’KH:C&²Ófž ²wµg(6zÇ‚;@ ÄiK„®';ê§Ä‘)Û«Aímí0Sƒ»ï–"ª¢ú8•ž—.q?ê~%Vcb#. éT"ítƒ¤¨Ngs°ÀÓÉô#Тê]³g/Ý3%ßÉÒaþB ¹|L”12zM;u!s¸8é&1xˆ¤O‚ Ó3IQžwpú‘0x.ƒ`íII‚üa ZLÖÕµ1Ar*ˆ“¨ ÂSµ S°Í­±­ßÁßÁ«å/ ejÁ=É󌸭eªÞ™^vÕÛëu1PÓ©[×®¬Ù¦ÿ"•·* ë5a=QÄŒ4Önd›Z⸠±'z…1%ÕTÆ(Ê_Ç—Ã\]Œlbøÿ„öD’ 0ÌSyç#w‹]¿ žøR>íƒâ3~oغߒL”h³,ÛÈVXV‰Vm2©:ÍNY’hC&Ü–kˆôÖ|Eè†í6Ê!#rqëœ2—Ò²»¼.ìÂ-|™ôìèÞ’ÁéÖV©EÌÃL2£$UCºò;Põ…?Îx†¦´*ŠZ”kÏÆ’w‰còLe[sgO‰|a³O$†ÈšZTF}6… ‘]¸-ŠЉz¨ dޔ̩ÊSU©1ñ›Å7:IÉqQÑž@¡%Ê&©Š@Ü뤆jØ–œITKðÈn&Ù*³õ­ô¨˜Ñ{”rýËN¯xFm+­D%lÔ6˜´ãšvÚNîxwˆ„ ;æ©è)H²þ "L¿-SaÁþ2Õ`ÙR„j~ Õ1á´á-ÍÚ* Ë@мhm¬ƒî‹Õgs)Îp°•ÁC·pe\ôò}Ýk÷Ô;«{òènë‹<›-'YŽ.àÖJUˆÕ6Æ#šÊßî²ÆýäRðÈzÈ%,G†Õ/ å‹éò³€ãFýfãªr1,Ú¸È×´­{\·´M´ÌXîÞ¶Æ….¡@µ_R#»¤aÁF1v†z\ÓŒ'õdãˆú7eþ­ÎÆGÍnÄšÖ­­¿:•Uò4ìrm«ˆ°Ú$½‹@Ê`ZO­÷¡"óÙóòÍßCœ?® FÁbFhÊæáÉÊ@‚äd£”ܸߣN8Ìàf“å3””Ì×wÖ¤»7gRd0à(½€qMŠœ˜i71¹v2Ié"4¢€#eû“Pv6a©RÆ3–L²µkqK í‡øþ¼Nµ‹·q Áów4_¥qïy[Å{L]¤R“1x®$󦚹è7²ýX%²¤‡ž›A¹tLcš¯=Db²—W©Œô%RS“Éå\õ‡Œê#lܬGÞyu03ÐW'‘í°Æ스GKÜL1-რ$â%‘­ÛfR„¦—-ÚÓ6rïjT›ˆ‡|½¸)yl]²ž§‰Ë(„fî×c©ªÁey#šö:°Š¤—JdçS3 µHºƒ¨š» Œa“¥dÑ'pµ™f™¦ó÷ÕKb]G;ö»M5c0 !°l%^d$B€‹Š/ˆòG¦V€Q>„#ù©úŸË¶;5†¶™Ñ!é*7މ3­òL0<îôZ}]ÕŽ$¢F|2f÷–§snž’%Y¸^3ñ€Ý‰3ÑfITÞ­D¾†pNÞöZÖtµAjýÛnÌ;®n¯áj¢•÷žó˜Ø‚¯o;ç®R$ýia›ªgT²&‹Û,@Ù™úò¬ãð~G¡²7”É­ñ&ðÏõ×yTD#•i•!þÕDr`1½(nÉêþ—d½Q·5¬LŽH9sŸˆl+‘šù½taO$á P3Ë ›¬¨ aZýVˆÉ&Ý0éÁȵC +,©ôâ’k.e+˜T£D\Ä6î«å,&=“©]Àƒà;*ðœ+§VYC7;mK[c8 Ë7¸<%ɳgåojV_²¬™^_“ˆdëéEó™©ŽE²®©}M­É^*¦Þ)ò´†¦uhÓzEO |¯†ÃežÆÎ}lVe†é7¼J´bÜ3ЙK,þ-@µ ˜5£l"¦è«]|¢Fú‰„1J6*·KÌn^<£Þ½=GW…ðIO‚XGi/}w%p˜ƒ5‘üé9»zGÃwÔ ƒœÊ²xž7\ŸPpù†á…ÓŸDWcnŸÇˆ Y_Ó>‚q0íËc|&à‹wÀÜ=Þ5¦GL÷êðp¼ƒéQô¤㥘ݴûêeKò‰}•° K†c2RA´,?ý¹e,÷x_ð`/øûd5(œ–=Ì››[ ÂÍ`ìÃZ\ c9^MnIñ¿·Ë:X`ay?Êè(:¥GÞÃï`:ÁTÇPƒÅ8_¾7ì<˜ü—cx 5ðw°ÌØ$özö–hý?ÁR˜°á=ïš‘Gjáwà-àûñÈgšöHT w[¯†Ÿ`~ ‹°°öâ¹9Eà z¨¿ÖÕ5Ü£AFd•B;gØ€8™ÿozÏh™ÙnnÕÓ±3¦¯ÚÝþ‹îàœªð+ þÍ\h˜’ê†?ή'LJ¤!aª¶Ø·\J&-5á¤Ê­¦N$K(0cšÉ#Àzïó’É›K` ñÒ5®]ó̼ñ}‡ÉžMݵY¶·½HR)1L#×d­üŠc‡”ýgk0«Ö)&ö¦`·Ðرƒå‰qRçaºH•â¹ sÙ—ŸB—É{·‚žÛþz†”Lao7üq`€-<¿ƒÏƒw-z µNH›ïãd³‡­eŸ`©U'Jä5LïC"Ì‹OJÑ3Ær"8íéåˆwÍ$[1)U˜?‰J–”ôlÜѤEÒ¦,=[ˆ—5¤@‹±b…ÂwSý0ÆâD¸kƒÓwp’¤g¼k 7Š a žÇSƒ)s!œµÉÔ<Ïy ¶0 þ„%Ü“òÛë|šü2¿-šž Γ ý¤3ßÊ&Ãa !¼s{±æ«¡ä·Xîb­¾cám3ž6J‚áR Æ HhåyX_¯ëÅýlóÉ“¯{¿óäëEóõB¸Ck£Ðfþ'+›˜þñäOîPw 4«sÛÂpÃ4Ù3ŽnqƤò£7ÅpüTòÃåD«–Bµñ‹¬ƒw©š¡{fM0 œÄðßÝu5[—"3£eÜNÏL¶ye3ý0~Oìz‚+'‹Šl¬M‡m\‘Á\8f ž»"…qßmœ¯z0ØÚÓEÔAš*#Ó%îL"ª]L@û³Dé±cˆ|` ÙÃÿÂCìˆwREÙ0¢ííÃ<¾K8Q8öf"q¾#Uf+;6•íõìýµ~ ¼KF–kuì^à•œ„œß[’ç˜Ý‰äA †0’EZJª0çaƒÑLˆïxð€ÑY5 @æÊ*™CíPÎ S $˜ü.ñsŠj­ºÌwÓ:xRJ˜ž‡ÍÙ‰N¢º.fâ!^¥ÒtP¡BŽ5EÑð¸c$*Le‹)•‰ È2nFGM‚¦ÆÑÈæŽ‰š7LjE¸9³Æu˜{£+¤©ˆægSL—I”YÏN†àeÉò+sdNäá0&\øË°ºõN&º…#•lËÑ9®L™c2ïŒH΃TøZ˜<Çåb¢üó‘ó_66>°'ªK<>µT²î\Y›?3L¤³‘1.\;‚½-5ä7)\§?NWë½ùoK¿°5º9Ì0'ý±R甪ƒ›}V0£jhVØÎ\Ù…™ê1¥ëæÉÅqÕLŸ žú8¤tÝ܃‚÷ýоc–äÜÞ¾'ECdçVr—\DÃ*z3=àÀܰn€ilæ ¯ß¨Oý¦(—E¸óßO;/ÃîK8 (ÌŸ è¡çàqµk.í Âäé"îpyýùq¸·•94»î4ÞNu˽–8×áÛËÿm18/ endstream endobj 6124 0 obj 8249 endobj 6128 0 obj [353 /XYZ 38.2500000 764 0] endobj 6129 0 obj [353 /XYZ 38.2500000 112.250000 0] endobj 6130 0 obj [353 /XYZ 38.2500000 112.250000 0] endobj 6131 0 obj [353 /XYZ 38.2500000 764 0] endobj 6127 0 obj << /Type /Page /Parent 2 0 R /Contents 6132 0 R /Resources 6134 0 R /Annots 6135 0 R /MediaBox [0 0 595 842] >> endobj 6134 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 6135 0 obj [ ] endobj 6132 0 obj << /Length 6133 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sÙÝ|AK+È!€`99vœÀˆ(>äïgv†œ5çk²¿­j6¹´`K—Í~T×»¾úößÿýðÏßß¾ÿþ?‡úßßÿT›ª¸üsxùõÍý_ØöØÿùдÕá‡_ž¾¾<}zútúï—§Ë ß¿ÿóéOÿ;ØÃŸNÿþ|øëßNùcÿC/?ðËScšÓïÿ>ÿÞ5æô§âúûËßÿëé/¿;üú2âð¹~2_ÿÿ7®´Mí^¦1ñé/OÃ2Íù×o?üúôíeâ¾R·Ueëƒ)]y0]iÿýÇÓO§ ÃǶtÆ5¶*Oîê²)ª¶µ§?7®ÿ‡ýxc_¾^×ÅÁØîôŸÓHþÇÏ¿„†W¼é¬Þà癋ïŠqµ ®}àmYö›V©íõÛv^að®«ô?Ï\|W†Ç£+xm «xÃï†WÜ:=jºÌ\ë†F×>p×<×” Ûv^að²szƒŸg.¾+ÃãÑ'BnʪèZøçW­«núMkj…]»Ž®q$MÙê ~ž¹ô¦ Ç ×¾Þma4ùùmx…Á;§HK癫ñs<ºòõn Ûk='íG|×n£+IcL§7øyæÒ›Ò7\û´M×ß¿ªÑ8Nïv7¶lIéeæÒ›2œ¶?ø§˜AðL.¼_/¾ûüôíÇ“d¬Ÿ:MìüÁËoŸy*Oÿóâ7(Íáó‡ß…iÿpøüó“1Ǫ<-¦:ÿÜùIñîü¤;6uUÛª¸{òáòNy´æå•ÛkÑ;æò¤=¶]á=1ç'ÕÑÙÖ|ýÄŸ”ÇÒ]Ü>·'ü~§†Oð;pnöZOÑÁÑ ¸£p¯ñ Šhey~òáó‰_GF #ÓVïѪ]ƒÖf;¸‡Zúï¬Í”¦Ë³Öø×¤îqžÍýòŠgôÄÁwðh¦ßÁO:íã¶m;û¸{†â~r7Ï =q<î9`ï¸Ëej}jz° Û¢'x¥OÑsÔwŠöñ2)Àµ£QÆ_ÞžÑFY`뜷 ’(á.ãÉâbâÇ3h$¿ƒ9g`€jm œlQ[ŒE¾÷xÄSæSW`˜#¼óÁä™G×êµã†{4g¡˜Ïà …{!üÑÛà阬1c’=¸Ç?þQ¼„øqóçÍ…u™âX7æ+ƒ#â²L^uEQض¯ ÁÛÐp!ÅÈ |'ðF¿ XyÀ¾ƒB? èÒm`SðÒ1‹€£•Ïý”zR¿;°Ë;Ìn‚ÙÞñ‡ÜO‰ †"­C¬aÌØD¯¥9|€$ ¹¢ý½SB„°–FGÌjaÑQFÒH$aîÉð!F/ ¸ç¤­§(Ï—`íù:âDÁ–eˆ1ä%’ÑlŠïÅó|ƒFâŒÐ¬ñ!G\6Ê Ì¨±-&ê~»4¬²[Ípý±($®+c»¬\F/%¸$ÖP„YI"õ…"naM(³ ¯¦ñ¥v @Æü9À¹C$™ cx=˜õÌ÷«1–BáÂ1Ã8Ç!6¬?k`óíÐ ¥?s±b4ÂÊ B1þ”Ê ÒÒ³ûj¦{X«ÏÜ«.®Üë¢pœLàK¬t4™Oúc®Žv<&Þ±%|§Cï¸jP|wÃÍÛ7Zƒ³.®b¾s_óiøÏ­Ô?ZÏ;8Ú3zb.×£9:ö0ƒ!]¢H{Æ zïBÜÜj8ƒêrøbDÖ®HFýM)†^Z4R˜6Z±yND¦)—Ô|á’`E$F¦KK”g’øN¾ÎRÝÜWÕôœ7*7§×B=yŸ¼‡O¬>íüU/榙Êä{ÄÍD ŸIçœæAtÎ?Y·aù¸;þ¾ßø‰DnI Ì$ºô }kL„MöÔ©„‚Vñw„säùã§M8Ì(y<߯.?$ÃÍ%¸>±Ã~ê‘tìÖ()ÜGJ±¬}ôÄÄËt#^›Þ«ÆØaup¦Ì“Àþæ¢EÍgG[¼Ò¢+Å´\'¤gÓË v>*3Þ`Š…³¶øÎ@Zvp=%<'V¤1ƒ’ªëWáú™¦™Oݽž²õ½Y­-‡mƒI‹)? ZceûB¥’0Ñ,".Ä8ÉDj?*’½M¤#c%Y¹N%&SªªîÂÄkײ‹O$Ÿ4ºˆgI—"‘OÙ§8_„ÉAeošHmÓìjÿ6”Ï4ôÒÕ•âuã'[¼ó¸„•ùŽ+â©«ÖÆÛJR,>…-§`Dg0pðm‚7#pgð¾áÑð ˆ=px ¯ÎTÓ¼Ó׀ϑ0¢ñ JèŠs˜ 1;Uàu3°Ü ¬REËĬ™ó±B¨õ0³†£U åfçÊÞ³hFQn9Æí¿µ[‹qoìÖVnr>²OVj1ºf.Ü! %5CxÍàáò'Œ©†Ÿ0s#–[ ´Š©°Ü°vhñˆÊç€FÜ&jçˆ;„9uaœl²–v-“‰%ZÕ&’B¥?G¤šJÀq”†ØP* ZZƒØ%ª R7"Aåš.uõ˜p¡p˜†ˆ”ÊQ)¢ËÕŠ„Ýq ŸúŸ¢¬ŠÚ©¢‰8–G@BÈ¢Qi„E`#RÒ„©fʯD1÷Rë;‹¸‡wV¶B>ã2/ %€¸>Úº2QxrY÷£"ªÞb‰¬¤Ä)%Šb¬«[_Œí\d\$‘ºàI‹×R”D‹é(<Î*Áð;cX$]è6a̸¯ |dåv´* ŠI¼]›ð3®òŽh¥¶•HÞìò6ÏÖ$ô|}*Û—¿»ÚHÖ»V«£Ä¥`à`Ö;uSµþ¾zK $G´ÕBàB»—5“ù{yíGÓµÙ–¾æ’ÈÖ ˜ÃSA»åí”3B5˜¯„ÊZZ°Ä ·@ÈM©ïíýÂ0F& “*¨E¡sO‰™fTÂjWÎ%—{ÙÚ/[«_ŒÎ~u{ÙÚ^¶6M/Õ~¿—­íekwœThÖ{ÙZ‘²l­6Íkós.§ÙËÖ‚´¼—­¥,€©M·—-Ìz‡)ÂE¸ØN4ÍÓe@¢n­psHÌïEJéèo—Âe 8Rqeˈ=õÔ ät‘-1 tâów–â£AFè?‹‹ca¸¦Ã&BÀBŒhR™(7 ¶ÜÑ ¶¡1ê{]QOÞ¾T ']š—GjSñÐ=©fåI5Ü6B|vt¾ú’ AhÊÐÒbóÉ ÎÚC¼©¢­ÇrTbë²FÜ"ÌfY)a[„qæÁõähµ(€zÑT‹Î}½@ØÀ¨w;<º1jè   G‚¯,Ÿ™¹R,U‘ ¹hŸŠº¾}‡ñ@Hr-›™ˆmVãþ29pŒ,z3)4_]¥$¶hOå+Ú–Ëï_\)šÜâ®:[MoîÞOc†Ä”á'ËòtõUKܘ;D¦S²-Ú+ƒ¬KŸÃèG‰Ó`¬bÊ—"+æ3¸ÀÒ O1å¦_s²Ãf‡B)͸ƒ}î`Ÿw7ChÖ;Øç•C¦¹ÏÎNîÈ:Á>7W ¿ƒ! 7ŠeÁ›‚-+39Ù';D»HC/gäyŽ«„š pl(÷Úýàù§ÀÀ…f ÚŠç†é£B=SHÀº"J'(gü¾KæY¯®žõ„ó‘ó}~¦VÀ³Î€pίۗ­7 ÊiDb‰1iQÝÒM“Õ…Tf2I攕({\=|‘EQ´c +ÌJׄç,*Oà%Ëw`_²Â‹H Á@%Ç1à""ɰˆÅ£@Ú©¤©"‰ËçŸo½°(ç«¡ æŒãÛµ[­1Õ¬ÑïáïlËÔà»L N|Ö€±}d:à¥Ë&0-Ïk•¼túÄ Ì©J˜Õ l&³ˆQÎñæý¨ÊÙV›ÝžÄ²œ¦yÂmØ(æ¦bK:lSc¶ 47eëï®)ïšòÒ”Ó;yêD„sD¹K&®­9Ò±D†,\ÙÖx¥¤ÃPµ ¿ô¥å*Òµ]‘L vªb£ªé†É`;5Q]U„!áAð)¬ôŠ3°Š Œ“?Ç‘üLJÁ8u—O$–4r—‚£¢†s` æÇCÓ¡ZbmÍ»ÄxóI•"¾¼;AÈ;²Æp²y'· ƒš2BLçW¸ìvñ¬¦É0Ø<#Ö7¥¬û-."Z÷0Ô5ÿÔsLô‹@EéÔ(ñ‚á9±c½‘„L’¨«nZOH®<Í6µ¦¸8p%Љ¹Q½57‚]Wb¬„šÒX"ŒNQЊÄ[ e]»›‰ÍÍH¯k¼c]ÞðÀLÄóÀ „F8…I|Ý6 áɦ ™ÜFåIäyI†’•áíd\e \žnø ™|("ƒióvt‚À®m}'0“[Â8ǘ‡8Ïa›X§»»hªö}1ÉÔJGUY2›ï¨cúµ§.Ä`’Â)¤YŽ+‹HÉÜhQ5-×^«Ð-:_Ø._1B ',8EEw®GÙ,·üÿåµ &{6@²å:¼æ¦ï¦¬MójSNá]ëÖ=´{¶e*¢p}¶o‡~»^vèé c¢2hlSXuŠÜÆõíÐoûAE§VÝ´|y €?€é±Î&λ˜ƒî†êFuEÇÞ ß×EnwBLv“ÄÑ6ÑuÌ,NÖ'±·QšÁGeÛ(QN‡ˆô™¥j¹„û\&jÏHÙ ¹t˜Ò¬m0¾|[cˆPè~ÈÔ¯+¶Úi®=5-ÓÆ"9ÐþoCó0ýmà e>e† ho€£ol0¨~÷ ¿ƒ×ƒg-z øf•øfá†<øÎa×<¹%Â`@ùÀhèh k wÓ¦*¸×žÓ® 7Ùpe¼R 8m¹öV/²ÈPWxB4À°ØÃ=ᦈYYEèë}nË 4&² u–+>eªÆDÌ“€ÎÂHKB3ÉY޾¢™‹¾'°i=7.B»¥`QëïH _ÊÔÝÌÿä6• «åbZ/µTÛ¶¨u%–ΟԔ?¦öÙ-Ó²'a1ä'2׆ÃTù1AÑnå{ñÐù0Yÿ²°Ä˜m —¦e\ۯх/¡ˆâ# Ѭ›¶X¤8ç¸iÊGë@O _Ì“½‹q‘Ú†^nY@xÝ„C?öÂýÆ—5v–b?#\©Ã§…OS,víËë˜Sä³³¸Ó‰`CàÎà}ãá{àð äœóÓ÷¹±Ó¼Ó?WàsdŠp% 9&(Ž);d‰žÓXnÖ©¢eÙNÙø>ãP$³fÖ8(“Rnvf˜ .¯ÿà[‹G#9w.$å=ø²¡Ýa$jà61³f´<¼ ŒŽ˜Á*S§É XN”öÐ0ði‹êÔýv¨ÆTeáh½&ìïT{MÝm|KðzÍLÖ6 $ú+íÓ ’h%™ÖH'Ÿè'tõµãj`©øá?‹â2€çÌ p-hœwÝ=–/Ã{ó™ª?"¤;›æW5DÝl‰âá^D4fL„zKe•©<™·QóVÔ°°þn#·‡Á–Ã@R©âé{®W†Í"ãòøDñ""‹‰ß¡àR!eMöë‹éuÃ'íhöPiGÒOÞ$¥›a›¬=‹|Ø×Ê(j 2Òˆu‰(¸@ÒÞüË@©Å £`idŸ²b/ •áÓ‰è³qWød{]Ëbp¦µÕ×勨õ8¦§QÔ¨Y-c§ô±a­ñ¾)ËE’Ø®¦²k"1&àÂ$!­Œümë“ÿi®VXgò~F’¬Ašè;n~‘nLŒM“p©)"²×)¯‰èê½n¼_¢ã1Ãþ)ŒÈˆÖ b–.L¤2º6gX>´MÎb‹M&†]T…p¨k_lŠ!¡ ôYÆ3Ä8Y¨(¾h›WÆÇœ-ZJ”˦1Í'g&{D¶é&eÉ2äJT5Æ Y,1œå×œæ½ }ŒQ±ß˜jSTד;˜ê¦œÛ¦Zì`ª7Vwçv0ÕL5¼R 0Õ8Y‚ÏT4A3 HÒ¦hšÉù$~¢ }kœóŽYvÉ´ÃEe—˜ÁàfeøÚáË…/ P“°p ”1ÃY†Å¨x¯1Áû†Ù<¶ hž5S‰ qñ(¾?ĬB«<²`GðN»JÀ²«²™Í³“Ênf{ù';¬5iÕ-kݘj€èp}Éĸ+wÀU( ­IÎ)÷ÀTî¹·nŸ_L'%»¾:6[vÞ­ÂF~‰Y#á2èXûƒ¬±Ä,¿ƒY#^„™À3À|U¡Í4]ç¼ó•EBs&&o„ ‘á@7Ã2¦n»¦\ë|Á6ÚTÙ*4<šlfâòí˜#¼åCxSˆš¶åëÓrìþMD¨#J¨–ïê¹\Ô^Ô›QQ/UÎ7ïѬ½ôx¸×+Dtk&Á†Çé×Õ­»ºÝuë ëÖÆë0cR3pFD‘–‚É +™*Ûò~L*«B¨MY&š¼ÁÕ#Ã;Ú·•À™Ú˜W.“®,›†>¶1dëÊð dð.¾1Ë›õJ‚MdîÑŒ¡!Ì™ôhC…O³†4ꈽƣá5|Gôäúïè‹,wG{†:Äâ} r6eðh“%œžÀSpC˜Àõ/Íxò›'Ì×ý©t_Ó,hcþR‘œWª¸RVw”ÅÇ`â“Í_цj —ÆyÒeMÖ¨’~¤’€2É|$ÃÜpa`Q€9êN0šhe“ˆ³5à°bx SÍ-‹=Ç¡æ˜ –¿çOh´ú¨áú‚ž´¡àδ‰ÑanµTT—ñÆÕ+ÓèdA6R™‡ù5Ö•­?±?(®/j®Q©*p´Þ'7+UE4OH8ÉU£Â7+î®sŸG‘à*ÏUa]¬w«jÑJ]•ˆT|fºø‘¬Z¶X];ád>z#£±|oLC"3aPøŽ{†4q¶j („ Y1˺ŸR!’¼$R”)v$L…ï#ßKã•|óO¼—ŒÆ‰%Ó(¿pVÈ„^d!=”ëŠ(»“5;EcœÉð¡GúIÊ"ÂÛ“)OLdØHŠ˜0¡)–¸ Y¡Œ´¥o+­ ¨ŸQ“!,‰˜¢pü"(s Í£ï’D†‰°š#ë “KEè…ú{äJßëXš nÎÎ.,SMߢµÞv/×5„Ñq¦ð!jufŸ(n‡µ½Š©1Îöq+½Œ©öeXDñ!õöäV6%DÄFŒÞ²KœxÆÕÇóýOT$wa÷ìêݪ²ôÄZ2î¸*=gpîªî›¨ !€ö2Ó'€Øâ{ÄÕӯ×QiþÓÔ̸íCt®ÓZ ór2‡+2kŸNýhû/÷ºy°ÖË&Û£½”£Ý=¹Ü—zü¤ÚcíWvYÙà3úŽ›ÒÍíc¿RDœø.—>gÆ*B=^`OØBÆìöÁ2  ¾Óó µô»6:,Á½üù4ãá ñÞ}ˆ'ƒ¹$Þ²y@ž=H\9çÐ> J‚÷oß¿~ß›Âû;;ï,žŽ¹ç^Sœëðééÿq¿' endstream endobj 6133 0 obj 6812 endobj 6137 0 obj [354 /XYZ 38.2500000 487.250000 0] endobj 6138 0 obj [354 /XYZ 38.2500000 383 0] endobj 6139 0 obj [354 /XYZ 38.2500000 487.250000 0] endobj 6140 0 obj [354 /XYZ 38.2500000 383 0] endobj 6141 0 obj << /Type /Annot /Subtype /Link /Rect [352.500000 340.250000 510 347 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://boodebr.org/main/python/build-windows-extensions) >> >> endobj 6136 0 obj << /Type /Page /Parent 2 0 R /Contents 6142 0 R /Resources 6144 0 R /Annots 6145 0 R /MediaBox [0 0 595 842] >> endobj 6144 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6145 0 obj [ 6141 0 R ] endobj 6142 0 obj << /Length 6143 0 R /Filter /FlateDecode >> stream xœí]ËŽäÈuÝ×WäÚ€r|0 ¨§« xa`0xaxaŒ, ‚$x¬…ß™•ÌìÌ O$ãä‰YÔÀîîb‘ Æã>Ï=÷‡þù?ÿý÷Ã?þü?‡_Ç?üù­8vMqùßáüßïîPöÇño¿þõí·Ãoo?½ýtúÿ¿½]nøùÇ=ýíÿåá_Nÿ÷çÿÿÇé‡éü }ëLwúó/9ý­¸ýyþùŸÞþí;?ñúºq0ÿþ]UW]UŸ‡ñäÕ¿½]?Ó|ü÷÷_ÿööÃeüÞÒö]ÝöSŸ~`†º<üï½ýñô‚ëã‹cß–]ÝCÿN¾¼+oo/‡â`L=yùÇ¢ÇxxÓ›pÿ¹|VLÕ÷ÓC/xWt!üûã<¼/‹pÿy°ÇO¼àýùÇ—I«*ý´Ý=>ÀÃMU†{øÇÈå³2.¸ãéǾ®LÕ•M}úûÐÖ]Ñô}yú{Wÿ{é»Ó•üîñ^u¸‡Œ<Ô‚OŸþ“ÏSðPœ¦ÈoŽ¿üòöÃ7S›Ód¶‡_þxÜÇ;/ürš”æð»³-Ìá—?þ±(ÊoÿtøåÏoñ-›ë/WL®=¼ÒÂ+¼ò{ÿ”?Â+ð= |¾ÂŒ ¨à=ðK‹^1ðÊ8j¸>ø{ \¹ïƒwxå«ÿìx'â]Õ=ÙoᅵŽdðÓT¯œ&¸+bíXG]Á}I½îغ€÷ÀT‘äÆç93xð÷ŒW✳jØÏÙ~ÎVrÎ ¶ðÙÄ÷àïÁ£qÒU{[< |Ü׋Ï(|^mlsáu¬~>?pcƒ#Àsmà®rèü=[ËX*ã“UWõaÓ¯Z:N-^G|š°¬Á2ïåi#‡§„OÆÆæ g̬‚ãd1kJœŸœWÛ1×Xî|QIïˆîºøÝ­©®Jæ:Ì®m>Æc«íþØÅã•QÎ]¹,b}¬«KÆõ»2»L{s¬ÊÞ<¾§G÷”—1űíÌ9jh+™{Æå5æØÔíã=plãñ›ùSÁ/­áÓ.ÆFuÀ’÷Œ›ÅkF#€ë33cÃWÆíÚ/Òeÿšòziɲ0 †?O1|šÁ÷àŽ ßóŽŽ€Á÷‹ìøR¼ñL–ïïHgËÇ{àÓF•䵔މ$¶ 3ÇÄ«€Te/2‰Ì` ­×c,ÅV×PáHÕJÝÀͧ{´œfžæPºxkÛ‹çxÞøñòJ8¼7J¸ŸLAÌ1ÇŽÆ+‡@ÃcÃû≚êz%± ‰àPIø3<6"£Dð&â >ı©ˆ­ãq6°?‘/Ä~rÌ¥ôä0‰W›p ©ÏÀžâŒsÌ£Îà´Ýóa2F±¼ŒDÎ:}Nx”y´<åò468w&–ÖØ´ÿ¼Æ‰xƒ0ÛÖHŽ ×jCE“ڬƒ1!uUÛ[ÊŠ1œ(÷Ë#êªÅRqDO/rÿ#ÅÍÑ"½=ù@&4QC ¢6ãîP"v–Ï!<ˆ³Ï»€rk’YZ/¿Íÿ†ÕL,“’‘y@ŽIa nè5UW¸xeGñ•9ñ²´]­D #¡"ðÆr̶p™/]µ‡EGô³¶sÏÄ~ £Ï˜UXn«8¦‹q3vhqµ¤©ªÖvƒpå®ÑÇõ¨¸ÚýYÕi„@eß½°34®QàØÜ{„M4–Üvµ53~%·;qÒNœô]BæY‘8©k^!tÁy§,QïŠÜ©ºî*„}'©wRÎ¥ö;ùë=;ùÍN~ó!ù2'¿é†›3—±Ä7p…·&ñw‚™¼µž–`¦Æ:K;¬Áð÷šÒ@’Ãk LŒˆ¥*žü=e¥«¡Ö«ðî݉†b ©VakA˾¹"‹qA“,÷I 2uêËëH(à@¬„ôžÕ%93ÄGyà,´%ÈR¸H`$•ï—Ò¥@ ¥%|)~ ‚5Š¢ÅÂû‰ °p°-[)u%,ÊÁ5ŒÅ÷ -u,¥tù?1–Þ1g7Q< @X;‡ªg#,ê‰ÒFŠðP üU©ÕߎY†A‡yG%3³‰"WÊpª‰`c˜r]1’aRÏŠž% C cUJE‰ÁÔTK (4tŠŒÞVòP¬Šô…âA!üz¼*S´ZÜXJP~ÕÞÒf¸pzº˜ÕBÑ™êKJ#;Œ“¡¥…fèG?qYLˆr• ÓÚl¾À2Ö~D¿oÍãDkÙS ŽcGU†4”†¬µ4qESÚº6¿r\-íH†©¥X!ê¨zù‘¸wYP•[Q1eÂU–eUL$åhÇÊÈŸ^üüTH‚2Œ•–˜^Kbœ ³gêÊZDÇ'áØ!Ó³¦fCl»Ùøc½T4¨’ÅŠ¶æ?ï!J™0ùpjMÓ{ºŒ^».lKc4LöR X%±&–p‘YgÅp°Ü$h-ùbe£wð¦RÆãñ“-J|c¹j V#ÀaÆåŽ£t'é¥Ãt²yÁØ éAS.v!=f(4{]ªô²æ»Â²'îÙ‹dÙ‹XnG„¸`Ù„±ú$Õ[7<´ô£’öLŸ9tT,0D¿Í€g¬¬ëíñÇuáÛ¨.žLÙÓB9?Y4PøÐÞóèÛgc†ëàènÌèi邸÷¸$·..fÍÖ:ÛÚÆÂ‘¢€[I IÑ Lõ°{My¥ì^÷•¥×’ur˜/x‹c‰À4fÂnxlË£>Ú‚˜tTÕh&FMkåf$©¥-Rv|)ep`²µ=h¥á9f{eUƒ6†ã3°ìšíÛ^5…5dÜyIH)Ób*)|1²]Üy‚˜û ³>v¡5»9íy{ kY¤'–ŠL¤§¤`œ å¸Êµ‡ðeòÞzƒÙwÀ¿"|O!'a¶àén=œ…œ3; K"Ò} ©šöÙòFcsQ ã4 ŸŒ£rXµÆâyøÄ‰t|&{+eÍQÐ6qÛÑO¯ ŸB‚ÄëÎVk Z¯Wµ÷/MdÄÞi}QU¢Ä‹ýú…èŒß{Bôh‹3¿7ÞV÷ú*¯hyî+\úï$mß<†ã™<êwÀs€»ÁïÁ÷hùôñÓp‡?¼§„}"û:çnOÌÉŠõžýï'˜<Áî¹…¯À§ÕðÔ;ž†¯À­ñ>`Þ¯Tñz6öEg²±0²¶Wp›Hç K”ôšr¥l•kš³ì¬±LÛ¢ìò‘v9ËNG÷ÏŒÏÙ.;··¦YËN¸ßð•õÊNS OWkWr>éÿ[ê1;:AãþÕxF3öd?–Ø÷Žzïä¬Ò_Ñi#7*®7m}}åeSÎõ&R(\]ÆTph)²’uyÄŸ>Á±HÛ@©;í>Ú~_ª%m$¨ §PEe…ƒž–è¿(F[x*ÂB£X¿ Ùä°WT–¢U¼¸/¡n3l®’A³(oɲ¹ÒPÛçž1•Ÿ.ˆè¥Ö0ŽEÙsxNÁ¶ó„-QM©ú/j)Å}ÚÖ”ŽEøM©Í]vEЬ]okÖA>ÉŠ‚‚BÐI*Šâv°•[α7í6Ô¦¸#¡^œ¨4Ãb7‚÷)Œ4vÌŸ´^o|Ãj!ƒ¯e=,÷þ´;i¢Ä'¡…,&šð¬Eh„ˆ]y#cR?ØBb3iêçÛ(Ê®ÞCyÅ’2-mÚòþ1b¨ŸÖ®JÚ•t,éü.¨w<ÈOŽ—U ²Ñöú ¶Ü9#1ø¶éRE}:½0ͧ˜ãá[i›9i¦H|L¢Å±êŒjÇ_š–ɯ­æ£ï[KÑQãdj$‚!…´yM×.FE‚2.L€ß“¬’?ƒÄaWÈÿÐ|ÌãñÌÂuŠ€œZb m^tÇ«oâù÷†dv¸º¢u îŽôp‰µ¥ .&Lˆw±ž'VÂU[( ÏZŒ“O ¢E[gÁš"–þQÖ”$è Ñ*åe/™òzÓ÷wpÇ|U©Ñþ`†Y$ëè|Þš•š‹9mŠã…;i2˜™+ã.jŽ¥M¸ÄÜ3ǹ{øžþ:…¼ÊÝ=ßÓaCÕÍìVÓ^üûJtÏh„Í …Wð=zO ¯8æà2£í±ú8{‹æÀ\6rw¬&{¾çº‘gÖ_iÐØLC̵_ŠGׯ\ Ïxà5C$ »2ýS Fa‰¢fÆ´Š¥Ý×ÅS»\·:Ö)Ry°Ãrk ƒeÐ ×¢è0Z_"ç´y&rãS×p™«ÀžàV‰b1ÄHDXfH“²jHÌÖ™ì?”û%1Ø¡ºq0–rœJT†kk(Äk§u&=‚64*¡•"†T€)Ç`‰h‹]¨´'a¶9€¦Ä¼9„/QT#fjÞËñ–¨ÏTÀC +õ`RCGê·¡«-ýFÁ¤=ÂrÚ [kw.>£s±•œpòºÜh|‰éŸMJ„\Õ=7±V•òÛ ¦uÕhMomC"?؜ŠƒîÆe’‰'Šä™aO¥ÃsæEtxEŒ_›q7ÈÔ,O~KÉw¯›[~¦W–”úׇ¤ˆîZÛÄÙ(‘–¸ˆA#N¢VØõÅ“òŽ®äìúj=ŽuÒ5±Úfn5ZxÑ  ¥Ž¬[‰ìA°™Ï ŸÅ+º+/ îÄH)=¦“ ãâ D·ÜýZ§ú€" ® yr5ÙÄå æH¤ï¶°S-pVQ4ÎP&:º¦@ÞÓ Ú«¾³´¤¦ÞÖ4Ñžá$Œ»=š4ªÇisž«êwIá5°UÁPØ»6š6`£Ýß/DØBFFn•ïº60Ÿ¡¥f6Ü6~µ9±˜ú¤Yf 73‘»­²;†Y;†ƒA{qÕ>¢‰ï–¡ßü÷%ÊÚ% ‹I§XbÕÈJ“P⾂89g“JL{O0màcËÜó±Ž÷â›%2%UñMú´P°R[ ¶¶Ln¯Re Ëùö¦Ž„Ù29jOœ¤,YžÞÈÚ.ý|Z XâáɺlWiÈGª*Ë «:["6<^°dì ['ÐÕ…˜¢WXzeX Cw=IfÆ1EŠ@ø'';!ܵ©k[æ—)Ü|³­ã pË·kú Eè˜à¦Pô",ˆOi,{nëtÆ”Ÿâ°0£Çâ.A ÎcÞêNæG©¹N#œjË<”-}½bæûò$ÕÁHb6GjΠUɲ{T¢\Šbfuó|sn2©‚C3(u¡h ©J»ÊÚ#É2JTõ,^¦Çà êP)¦<“ò‘0žkSå;u|Fvî:©ãÓ·/%îÒ6ŽÛTˆ"$Žd¬J¸³Ë¶üpPöž¨£÷æ‘g‚ØÐÞwø"uNzJÇ—âs(ýRqµ}à> °)A< Ä­cWÖ¤ÖxgCÿ›çx/.g½šüjùî}8úú›ÿ=8âð‰l`Bw8Zê1t•LU+µ¤`†±CØ = n8HEÅ`ô÷…Þ-ªŒëò¸Ez–¬ev)”ôÂÖZŸ§g˪¾›c &L^Õ8dœrœ°#¬Ct3¼YäAõœ@5$Ü!äñ.[žXÛ¡L~P¼mÖ<'QÃPÚ*0lÓ5,ƨâ°X‡™!yLïÍn']åDàØ±T.SÛ-’;¸ö‡Š¢ÄêÖ]C¤s)A">ƒi6ÖŒ‰ùðVÙBÌ ¶ªð¯Äéb)Ls )öÖXœ2,NwLŠ-¯ÅxHƒ•9[ÉØ*ƒ`/BFp›ÎR—±Š2b_Je'É!RèI&vˆS‡ýÉ+¤ñtG3A£;R¯B,¨™½ªÍFkAËôs•E+·—"ˆ“ FñHm'>pîP«@™ Â{ ‚¹]5$T Oñs~ : tQT¬¤çºÛ¶ |´1ýóéHMðȱ`êN¸ª+"‡Ô¥momjµî–¶;ŽÑàPSª,ž6ÁïC¬„ïÑN8cÞ l19HŽ2Þ™À"7 ­-Ü‹åÕ%k¶‘o?ÈÅdµ­è¶Zä¯+­éf˜›ËòR—×4ש4ß®;ê‚lŸ fæÊøͱ´áðÌ=åïà=ÍU \ŽÁÝ=ß±¨CõhgTpÔ-¼òN<­@÷”ð þÒ1doÊɉ/¿À•»È‚öX}È•©àšÁø¥Ä¨ ¸«ªÒÔøixlî*¼rÌà÷8fïQü¸³sÍݱšˆ X šjè,I3Ê[Ó‡ÒŠagÉ1pGÆÔ×:{#øíÕΫ|Gªœ©ôp¸W æCÊ{Ç€g ƒfgܺ¦9öÂcpÓMˆNêGñ6jcÄò`ó5UýBËÉ⎠Ï`¦¨mU¨¥sηGy§c¶Þâ4G¨þF(Ú§ó·óçK™›sȬ3ÆlÂÑZsc\!8(xI«8§šm'¤ìF5'ð€?1epÌîdv@rGÍÁ­™ÜµOv 0Æ [TZL—¸Ä`#SœŸë›A]nâN=+ÙnØb@WIùŸ¥?cõÑÜ©sÓß°“´êrAãH¨h{¾â0å£d,“í†:£‚#ÀW0Ä][G˜,T°jx5µ)`0дóþîpüÎÃ2ý]—iîŠW¾ +ãAž»Rçá{ZÿQ—plxvŠÎÿ<£FÖÖʵú¦³}РΖcNxåü¾.´}`JÓÛ[{¹Ì`¬.†jQ§y$ZµÆaYz¨ëfA£Ë÷ld'7¤BêK#9r_Ú †ñÊ J¨@1ñ*󙃳êUæ"ŽǪ¢Þ¶Œj¼ª°ûtUMÏj©%_ÂFæû“Óò!Ô略yÚ—Ÿ,÷f¹¸ïÛÚ÷Ÿ§D'ß$ÿndy¢Ü´Ä”Û¨=IŸx¡<{E©‰c§0y7) ‘a.yêWß‚‹†0S qôr¾<žï?G#ûæþ'yûÙá3„q6>Æð¨~Ö 3®jcûc ½,xÿ,Ùáãªe’äÔ˜ˆêˆGîŠ[faM`ñÏÓ©*š «ÊFÛ»/ÅeŠÁÌ9ŸÀÑ› ÀHÙ›%ݶ‚ ÅBꛦ´Ž˜t~Rä"­Ã÷Ô±ÈL»úöÊ‘ïe&å»w¤ÌZÏOÙ ­"S¹Âd’7öÚ2¸Ñ“£TÆ?>M;ˆï]:·”„ÚuÀT¥TœÈŸ#¤ª¨[KWˆçÁ‡2z^+âðØò ˜‘tì ·€a@~i3¦‘Ó”ËÑíX)ÖÐ,{˜L— …ƒ ¯¦`Ö‰·HN¸·àP?öAÿ®«(àÇQò zgv aD®«Òè+ÚzÕX_Ù_Ñ6xÑDN2LÄbeà¯RÓ’êëÆ0æÃ±ùP®R«Ôí¸`E†«)Þ ¸q ´2+Û.8× ¯œŠI,GјÒÍä,¸ÞGãÃ0Ù -k¤)T‰ŽµXxáò›%\ž›Õõ‰m3Çäã(n¬PŠÇT4ÒË&¬R‰õ•­Å˜~yÌLeHy‚É÷ùÂìAæi<ÈLàOר“U®J‡dÌ$B•EJ“Säó©¾¶ÞÒkLž4RBϤJ?¥ª5'IméZ& Ubè(Ó@qÒGs2eÒÔ²CÈz¼X›Îצ;$¦è #-/ö8ašÒ0ðjF7%Ï Š%©y¤8/BØ®ëŸNîžÕWŽÐ›ê:ßfŽ„¥96ûrdž‚W1~4ƒTÏØª§pïÉSðùÖ•ÇRÂ|rŽ<¬?ixHÂAN¥'AE ËÁâ¿‚¤Zfl5ÃÈç¸Zw%àDÅC<Ž…6(ÈøZÄ~XÖ„h_“â]õÍ’bô™B÷¶?Wµ÷õµÎýúïêØ÷Å¡mÏtÆŒ?mmsü˜–Ó/?ùõ­­Æ åI°Ü~«zxJuÿŽÓïÿ6çÛöÝÅä÷X#9_zxJÿøŽ?½}ù‡PнÑZ¯¯ÞSÙ"3Jœ."D“§”ÿä®S¿Gáª&p¦QÅŸ IJ2†û›%oxO:v«–Ï“/á)ÜêÒš]05©ØþœôÀH^o¼»`ܼeà‚-ßÅ>RVó k{VS©¹›žaLO¯-ƒ7qhªÚ^yÂ&u ó àœƒå&¡îkz{¦´8|ÅÇÛ'Lš]¡mO¡QHV¥âìúÅÓ&柢7²ÃëžœA"lç£}E³îÆmÞvÇnÜI ë‘§âû)Û­¥Âʼn­%ŒÆÂeâiÒ»å`KÞdÜ%ŸÄÚšÙƒº pgÙaý¬ÖOì°~ÆëovXÿ`‡u–ÖÍÚaÝÄëfì°îf‡uvXÑë¯[ßQ€íW—¶ÑÞ¡Ô\d<ù§œDTêÑ“+]MøÄqÑZz ŸÿÝZ•1$ |ã³å#¬–‡¬(¤Š¤‡¢4|§-%Yis›½‹S:ü@zK’â-oüíRBf¦¡¯lGQ˼•ÜE¡-ˆvw7â»TJËE+µ*RGDœè“Ú‰LÞB¢½ž6ªõJÇ9 ÃsÁ\ÂvÆÜíHܾ‰í©Ú}† ¹f{5÷FõœÙ-^nsÕ5 ô°-™Ð #/ˆÓ¹Ó°ä¿„Ï‘ #†ø\ –R¸«Ñé”®jG+Åòhß™ õBàN0ÆXJÉÁüÎJ0»:„Á„Ç66í`õò8mÎ}>¨#¶<êë8ÛD­CÆ.}.µ¯)é¬+4Þ#H¤îR¶YÏhàŽrÙtÕ‹3W啲¨„#e®8æ7%á5êà+ãì—ºŠ½_ðŒàÆ=òp›—mî /Ô­Á§ Ž÷#Ä3êh_¡‘Þ‚]~³VðÆ‘ÆOo^?uáÃSUu$jáœJôÏœ}Ëà"±†DñäLUZë‡ûde ¤‰þbŽ+ÏÆðØ”UoŸI°nyÒ*ö’ô F¦šˆp¨(¿0‘ÖêSP5-Ë6VãZ¡*ªè“eŽDG1s1|yZ¦>n„Xœ@À|öøœ‰rd ò`¤Œkßåê,XGŪª`¼¼tUÛ9L†e!hc/Âö¥œæxDSÐëì½#Î.çÑzJã!rØÜ0ˆ“JIÆÑe Ë<4h¯+k~(AÃt aŸŒ}©í¼À8RŒÐ±B_D¡UÒUPŒ Šb\,J¼ÛÙÃñp, )ÜX3ÃøW²S&ÂØü/0úÅÕµ–¦óÁU2ÜÀÌ®ñ0d¥zÍáð2Þ>÷L±;DÂ9âxY< …’‡0f_¬p­G½¢žL‘HÀû(ÉÀ´æ‘reéÊ[6ZɱÎ`W„Ò½¢›ø…x à ‘V˜{4TNO¦Á”:RÉ&¯˜£\[õŠyÑMô¼t "OȤ¨E~fŸGºuÍ+§Ži³)5=rNM¦ëIrùÀ9F­›œœ'Ž£þ×T‹Ï!ƒÏ rÞäA[)D6fkK³Ìq ¤nrË)gFÃUu7Že¡­Šm1=iŸn«4—ù ¤‚Þ›]Q*ŒSEhб ø€b=€þŽ>æôßá·Óì9'÷§g¿°`öû¹É¯Lu,Ì9Š{¸Õ…ެsBâ2ýÝÌ$_¢Nå±¼t»»r1ÀÚé•êëxÏE¾›SWè+zOõLÂÌíÛø¥¨¤‡hk[ âU;ýÀQrÎ=¾{ròg>Ãà§Á{Æób¼>ý®Ý»áÎ?øºÐxîÞý·€ÁRn±ÏïÌö=‡zÉ¢½£<}žwøø{š7vÞ»¢:ŽgvÙ”x8w¡§‚é§ÃOoÿkó3 endstream endobj 6143 0 obj 9851 endobj 6147 0 obj [355 /XYZ 38.2500000 188.750000 0] endobj 6148 0 obj [355 /XYZ 38.2500000 673.250000 0] endobj 6149 0 obj [355 /XYZ 32.2500000 399.500000 0] endobj 6150 0 obj [355 /XYZ 38.2500000 359 0] endobj 6151 0 obj [355 /XYZ 38.2500000 314.750000 0] endobj 6152 0 obj [355 /XYZ 31.5000000 400.250000 0] endobj 6153 0 obj [355 /XYZ 38.2500000 188.750000 0] endobj 6154 0 obj [355 /XYZ 38.2500000 673.250000 0] endobj 6155 0 obj [355 /XYZ 38.2500000 359 0] endobj 6156 0 obj [355 /XYZ 38.2500000 314.750000 0] endobj 6157 0 obj << /Type /Annot /Subtype /Link /Rect [223.500000 680 252 686.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 6146 0 obj << /Type /Page /Parent 2 0 R /Contents 6158 0 R /Resources 6160 0 R /Annots 6161 0 R /MediaBox [0 0 595 842] >> endobj 6160 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6161 0 obj [ 6157 0 R ] endobj 6158 0 obj << /Length 6159 0 R /Filter /FlateDecode >> stream xœí]IÜÈ•¾×¯È³g3nÀ`UIeÀ‚ø`ÌaÐÏÀènŒìƒÿ¾³’Keù_½xdf¥[Õ 1–/Þ¾üô‡oÿ}øß~zúöÿ‡Ÿû?Ÿ¾=Ǻ,º_‡—ß¿¿ü ÛûŸuS~þõáÇáÇÃׇ¯§ÿÿñÐ}ðíéO§Ÿþu°‡?žþ÷÷Ã_þëô—íÿÑË?øõ¡6õéÏ_ζµ9ýTŒ¾üýÿ=üùw‡ß^f–ë7óö¿O‹ó6–þñ0Óœÿóçß~ê¶JÕ´Þã?˜ÖÛÃ?þçáo§†é‹ãiÜÔÕé‹÷,TÛ—•Êâ´ˆmO397Yèü[hú “W®Ê7ùyçâP1®2ñÙ%/÷åýœTÖ 4Ξü7ù&?ï\(ÃÕÂÉMÕÿ‚?“K7‡ª-ÎãMsÈI0Ú¢.¦®Äoæbvùko‹Æd£ýÎ¥ÒáTdòcãqµ-ýË-¿ÜpÙ4öôsíú_ïYÕö 3>ÇŒÓg˜¼=".½ì\*Ã}ãÙ3_¸)Ú*˸˜=ÕSæ»ïnçyXFdòÜ·mñ,ËmÛ|ÂßiòªÈ8ùY<ËtÛáä_S&Á;éþ¨'?">~øéùDoªÃ÷¿6v^°ûãû¯þô/ ‰-ßÿzø¢pí¾ÿýÁǪ6ÍIm{ùwç‘âé<âÞuÚÜ8â«óˆ;ž~zùäâ›çn6s,»¡×{iŽM[TöòW ƒG*4Ù<³ƒ¢ì×)ÃuLG<œ î­€'µ üÏæÑˆmáÞàÍáuìă/ç‘òèlcÞ®c\úHd×pEÑf ñ$pa ¯ŸA3f Ä·ùã·Òë¿¿qÅ7îçp&D3fKø’ë…Í~ù~bÂyøgië€F^(Þ'„C¶"D¡²{ûœŽÀ®ƒ[{¬«2x[ð-$u|añÑ»W`Ü0´†ÓaºG¦¯íãr­Py‚0üìNåç€r§Å±u²sǶiî`ð>!N`’Á‰ õÀÓc7ëÂéáÍx—Î ±"EñÂp³‘I˜G–™Õâ× ªÆx ÷†OänñÛ Ä° |<›(ÅvŸt˜“FpßA±±0ÑKÏ)ö`ô~!´biH˜Ma9‰a”Xº{\M¹Ó…ïŒWfœ ïl² †ÅaúrÈ=B[dK~BP%-ê‡ ÏÎ!Î`E¯Öòn?ß2ݵ®[ÓºÒœ$¢ÌmóÒqNKjÝlìîV¼V²(#€È>¡Ûð3bJ0û2~¹0äþš­¢DМ#ÀçmfEÐÁþ‰´ÇónÞ\¤#Ž88ò„F<܆#”ø¤O‹¼IåÜ•qË\]+¦ªšeY˜ILÌlÎ~ˆ5ªˆþ±>¯F6S="É3Á ¢™\ C‘ÛŸè;¢ZféíâµÌùQ>…ÀgÌßëÍnÂq-DèãA‹XŒÌ’Àú0-–½~…°âÂ7!W„)‡½9aîpp$EåÚ<+T˜äˆ$ñß(Ëc.Q"tEdK¢9eíL”í;$9KUS/#ôŽy¶l—iÆ!EzXqò *1åä‹M¢]dë)LÈ’l”¤”²E¹Ô^aÅa´‘ÌéC ¸"‡°hE¥)‰&idŽ Ñ£*€m@ /©™4U0ëȤI) r戩¯¯V‹Ö½…á'©ÞÈ1“ˆ¡‹×TÄ>‡øT¾å0èÌt/8àÜìïpI[_þÅ/ßÔ[]¼l!`^bÎÄæ`Ú¹5mu^²¶ã’c`'X\<¦Ïh¤«åцÒóý¿iá7Oî°÷b_F UdÄÁótϤ:º3Û\õMñ×)àˆ…·PÁu tÌøÃÇ=X#gÖ'íù×Ì®™“â]÷¤bà:½`cªÞ®‰À߯x?¬ÂЯ±‡[FÒàúzW¯´ÃÝZ­#mö¤q )ûO4NêS6êÎíÏ–uR ƒ—°ï…) Ìx ”4KáÜÛ/£ˆæT y‰zŒãk‡Qò›°|U|&!r-‚ŒsosÒzs篩Lîžc£ÔÚ4I˜ñr×#g¸WBù,-X‚ßU~2%K·ŠÀÓLÆkLóöPs¡ú8åñãd<œdaÊES|,N~ƒÉ2L2*pj‘(9Ns°† …X¢Hƒ$˜ÎŒÙT˜2Ãõzû–Œg¸¸À1õ}>¢‘1‡lúM _4d ÖÂٞȖrçvP#àoð:ø¤nø¤ø~"{#îGÁ®ã:tmÆäØ”G+ªŽRoêÜ€²® …#±©tY‡ümáÛ£~²‘ò‘LÂú™²j½²•c³²ë°ÂŠˆhx×$åhƒÖUeeB’7Ñ嘣åܶõßR•µ”ì*”†ˆ‰½RŸÙª;ÐÂoäcæ·N;Yæ/ v“õþY³V~€ bWkì[™x.X‡pqhÙrµl¬y°F-%v Sî°·¯lgzÊ.‘–Îä€Pž» ½ç« f»ê€äezÔJ‚ “À)kãÞ‘r%ª4n­Ë+J~xXPb€l»AjoïPý"¬•x7‘Ýcò+’N·avÖ(WŽéZ™P”`X"É×€hŒÎ©ƒhi òŽ#4"tBʼ=ý•mX¢Õ `¦‘d BÁkò](P "HÃx2Ýd“Y—Þ˜†ð1"ò]øØNøø(½I Ho›Õ¯@|JCñ»sr29ÍmH øh¸“¢iºiG wj$I›!í„‚©ðY‡ñ'´œa:Ž0N£ ÞÈO5N‘MœÚq’ŸVÄ„,A‹œtâ ’«ô§ÊÒNëΨæ} ^*YÛƒ` zCÓ'8·ˆÑ¾ˆSï1¶Qí²K —p‰„ø2‰¶Ui©Ú=¸fô”îB1ܬ oæ2µÙ¼yñ”´‰ßôâ1or ·}_9Œ›*$g²ÅÝ· x^ô¶MX²ËvCó¡ˆ^¤…¨éSÖ:ƒø¨†hð Eâ°T£]†Çm†xKcMš"ŒcÙ D Ñ ü”zæZ5'”DÒ”Ðø¥Æ#9Õ÷³›ä’¾ÈT %lJ•oD’ ½f¶´¾ÖŒZÎ ¾õeyÞä>­ôƒŒSŽM¡Œ“Ùè¤#ÚjÈ+¯°,!ç’hùÛ xZ¥J®O¡BŒšD×5·Yü •Ý ´kÙ0ýÅ>" ļÁŽmÌD!Oª1†H©(xßåP.d*ž2µ ìñÙ=#_¯5R;QßöÝ4‹¸Do`ª#¢¬Ñ7Á“ªÔä{fð)öLgò«˜… žnJMÌÿ°Áeó°ï!Ë!ÂùW¶;G_í.‰núª_§XîÅ$x=_æFñ^æ0f9i²rˆ)PSq%8©lh®ž4bб@’4"›E™ê°ëmUTœ¶Üâ–8ZW[®%Àf‘³J,Eð¼•IWîÝ…ûûcw@1 ܉ë÷¯¨:ºXeZCJ°ƒX‘Qa Û=ȵ~9ïuÚn}‚_ĹÍäêxµ‹}…Kf'ÇÞ€+eÄÁë C•CêÞ]µœŠ9V2;1±í3<&´}âÃzV{ù¯7“÷åËC}œnP‘kQÁÁ G.ì¡dLù9FüÛ³§ðÚ”Æ>êù•4lW\hój 7Çò™ø‚ ¦äæh¹¦ Ӵ˹_”L£gôO)žB\AÄaŠe“—vœg®VᘠOL¤3[„>0 HÑ&Ê’´}©5+²dâv3a¡¯ºÓÎ=ÐÎý±~œT:ë–ÃÌ"A¥n/‰—4a„‡L1ºÍ£Ô”,‰?FÞ‰pçÍrUY}Zá 8g[§ðHÃ-˜üEÂò¸Ø³"§Ç·Ùº­âA plQ*Ì|호eÞÃÈNGè~dvªu­ëó)k?“ž)ZÁG--[K<5 ËÒ÷üEq[Òˆ› GVà]+úGd¬Óâ`4Ñ >E>4Bªdb£‰Ú; .¢7k~[aLf(׿QÛŸ` m%r”×ÐâVÐó{͇U¬Ñ­è-›PÄÏZœêuã§8wJ CÆç·CÐÜ77/LÛ,&Á ª'SÔk}ÏRŠG¯/·™žÐå…Ká%0&X óÎ-k†µuH7ÃÃN_’h©°žÉ)ð4Û.«{Œ­I¶ˆ—B´Mò;ìSÿõZ3‡oßnÜ3Ý Šo™TâÊE ölrW³`]@ªEXNÙíìê`]dûú=ï.„4\¯È¦­ÔˆÜ¸‰S³kï0#èÔzÏDµ>ŒL€2#™b÷6BÔ!–…Q%@Šx(ëqä45¸š™ÙL=¼’pñÆýk pvÛü1§ÓÕEòfpš™Qjƨ™’.°çàä¼Ñ×;d²‰À¹ýY"-D5ha“Ÿh*ž¬ä“ÅבÿE3´}³¼p*¾‡Pß¶ôIù¶ XUm_¢³Ÿù¢êoÊÒZ³«­½¯m¤°ÝJV3%v0 “bN¤~GdH§VÐ^¥“µxkÙܵ ;Ì“[-)]ÒD²Ÿ67ã,Ζ‘¶M°ÂHqêÞæ[‹Ö½…NòÃAr›‹};tG›ÏRÞ¬Ÿ»pÓõWðÕP—Æ<\Ê¿½Õ~33#ýªcŸíyñ œ­Çž™o[u=å“𛞷ÖǶ ×é1Î'©¨ŸÑˆévÐÎh¸¼Noç˜Û>O g³ð~Z8âடÒï§/gî§·…%}ÓÛÞO'=ºZ7ÁžZ5 wŠ!j-º<‚aÝ‹as³eWîoåug¿¬'vJIj5ÂäN˜[oΙbžYF"öT¶]SÄé‹õ¢ “pbü„©0Eõ-^Á4ËVaÝ¡8öQâX¤L!æhù>Îü•ãÉLd»†oÞ{&s*O¯2$±ZOÔ<ÞoQÔ=ù¹"A@ MgÂ1e=_BÌmÕ཈¼a¤ÜÔÑÛìÑä´¬Õ.TÁîÏñPyHjžêɹÅK8vÅ1—˜»»(-[ÖŒa«ðA+TèÍ`¶„7”9ôGºòWvFØÓ„ÀÍC EkmÉÚ,X’L^ýRJà•„CJÐåˆS¢wIߟigÓxº°§²³xzo]qœø.>£‘þhåÑNÔu8[ä›Oð›}3¨-Ýí^|ó8¢D`›7_ÐÈ…å%ü¦B;(0ܲwéYZ5¶›¥#Æî§ë¡ñ¦€Ì« ÁøÜƒ±»Ñ)†Ì<¢S£ ¿)àLö ?ÓT<(/àf%Œ3—Þ¾†"9y=|Û^¢Ý^º© Y];& M{îàÍØ60›d1s¤ð~ˆa‚³¼Kw‹UY^ŸP17âÓ¿±ð›žõ§ÁÀíQHªÛPhŒô[gÜ1²\„ k‰õOˆn‘5ÈÆ¹')rz“|Èw`þM“¨!.œ úÚ¯@6i!F!£šuÑ„âÚ‡æÆÔ¡Xé@È”q¿J™—jº.ÛQ”(ÆÌ„V2…6Þ! (Ø­{ûâ¶s§-ŠY9yrBc+WÈžiƒH,bJØ]@÷çM»y$!‚…ŠÊ•ˆpÎÒP:«é,"ù¢ÈÔˆcsß@ã^Çf/ý].d›‰-Òœð(mˆm¢Õ #ÝB¹u½LBU]ªI¿Š1ž¦([±gÿ‚H^j[û&Äÿ!õ©it¸#¹éNSúîŒ2¨`ª4â—‹GTZqI%T~bÍFÅ„”hyÍ©xÜÇ ? ë åe³«2»Y#’Á²#G¢ú}î¢tZQ(ëûW ŸäxÈ v?ï·)“ѵyÑŒ‚‘F(Œë ­:YÃCL©²È0'áÄ-Ùè …³EÈ$a ÷,Þ‹è·aT£Z¦@56¼ÝA¦^f ôfZÔ¿y‚0è.±:º.!ábÄ¡½EràÔ² jk‚mNãôÃ^„}ËÖ’¹Ñ$ÿ{M‰(]Ü,‰ˆ$ˆò eÂ-ªß(µ‘­æó8§ÃÊøã­÷Ú0b]„äÂhoªËìÔèâ×êÚëÖ~…Š+n¸Õîî{y,y|þî ïÀaÈkÎæà7NKÞo|¹hùzÊÏ}7)Þå”,BA„"Zkƒ—qL"É]¿=é]$‰ Ÿ«ªò‰ú£(ÈhÝ„T=õ»ê'4ùÞ»} ¹;(-Ö¥ZÅp0¹Ç ­nïÜI¾J‰ySX0 bŒ ›q¯'ü¢'µ·… i á&F°,‹efŠ­aFcç( |ÿ \_FS‡¾`ˆàÖÒËöW&Öyˆ!rbÝ ,÷ãªð ^¬åŠý”íû_]v—¯)̰͸|ñ7ÐåÛËÆèð1¥¹bK8b!tð:¸¤,ƒY§#õÑßÙDñlø¤;.ƒgв~KywÙu!RôqÇNôIv åc&*±FÈÄëìЉNâ"uÑ%Ù„0jÊi/ZY\6@¦±RuLÆ'k_ùÛjëQÄâ”·FÐ 'i9/¸c€—­†‘BE´’†˜ ûõ TLhlBuÈîkN½3Åž€0¦ ZÖp¦-f¹‘lYq€)c¥å“`â»2ç?aÔÄ"%fg˜0ÀOpUd.ûO<’Èmˆ&kmÙÐ>d±j5z!}Œh< ‚æöÎÈkŠB}WÓ(‚ÐD$ FšåÚ^äݤà+Ø¡jÙ¶£ÄóŸ,L±žÍ“r™îdŒm„R}·/=»ar¦5e€ë[s Ç1vðˆ`v/ZÂ%i ·Ÿœ+kÒ™fˆ÷CØbùk˜.þ†ja— B‹êÀ™CR·o!Ü#R´&“eqÈ[Hkó*h2å/™Äo†»hq>%)#Á·.Di‹.PŽîÃ’¾¹Æ6$Y+8–_£:3y LåAñ_Ez²n°¿8"1‹‘ž ±ÐËIȶvñV´êÆiÉbZõRðÞ"œ\ö<²ÅÂ0…Ã\R¶¢¼–L™ÐÁUIÈT«'v?ïâçUˆŸYcÊ€;n/Ø2-rjî dE”YÉD!0.‘H6†ŽÝ©ý¤ö²„iÏBó] ÏÃÓÕ¬Á … xì]¿Øe¨ƒ?Âñh9w„²sµD9yFbËe1yÏŒNrªÜATe!VÛuÁzé̘Lôj©"[ö22… u+QÛ3ñ=sL C«ÿ0U>š(®ÒÓ›)–‚WJ@Sj%\®‹¡Ëx …dQt®öLi6 5`ªë-©Ò9­»MðDïÑ vÐïðÃ…x§Ä½áøü> endobj 6168 0 obj << /Type /Annot /Subtype /Link /Rect [153 144.500000 188.250000 151.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 6162 0 obj << /Type /Page /Parent 2 0 R /Contents 6169 0 R /Resources 6171 0 R /Annots 6172 0 R /MediaBox [0 0 595 842] >> endobj 6171 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6172 0 obj [ 6167 0 R 6168 0 R ] endobj 6169 0 obj << /Length 6170 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸ÞûWx]`ñ!QŠyè¢@]]3ƒÉ iýûµ-É×—òG‰Ÿ)ÉV.’{c^Qäááy?ÞüñËß÷ÿüïþÍû/ÿÞÿØ}ÿeW\Y´ö§¯®?Ðõ¡ûyïêrÿã·Ý÷ý÷ÝçÝçã¿ßwí_ÞÿùøÓÿözÿ§ãß_öýÛñߺ_:ý·Sîøý×ó÷Æ©ãOÅåûéóíþò»ýo§û×u‹yýÿŒ-+W–1òêï»~›êüõßÛ½i÷–ªQ¦Ô{eÝ«Æêýþ±ûùø‚~úâÐX¥\e]qÏ‹œ>½Én¯tsœéø×ÑùKhú“—M•nòóÊÅ¡¢L¥Â³jk”qº´§ƒ>rY×úø³3ÝŸûöUÙ:å¿LŸ`òÚ$ĦóÊ“8ž=õ×uÓí8S‚3¹L/?¹.´JˆM§•‹C¥?p<» ùÖJ€Ê!Ÿ¸þ/Ó'˜\Wé·]¹8TºÃ Ì.y¸Æ6)÷eú“ÓM~^y²ÃųêJ;[M ¾h¥iVºGÒÏžâHª"%2V. ”þ¸áä’WÙÕ=­s)ô2}‚É›2áäç•‹C¥?[<»àá}ÁýÊÚÝ ºš>Áä¦LG§Û•‹C¥;ÜáìŸcfÁKi?zþ÷Àƒï¾îÞ|:®©Úýù¸²ó Ûo_¿íìñ?';rû¯?í_Æýaÿõ—]spUYùeÑÕy¤>ÔMá¼?؃5­Áä2¢ |æãy¤<]«‰ïQïÚ‘—_-ϘCi«Ú½úU _¬‰màgŒ¿¤ÁøÙÚÿÕÁpE……#Ä1Î#Jõ€œ|L5:¼6SÀÙ üïÁ«öQ(p´C1ÚÁÙÄÛ˜Ž:ÖÀ³Å§®ÚS/•S¯O½iGÊCј×Kz gk!«t?4eƒË‚aŽÑC _’ˆKÉP¼cú…Œ :BŽÞž_¬+×ií0”Ájââ @‡qd:Ú2Pf®}€«ÁÅ–µÔi*{²/Ü<Ðò¨c¾>PÝtrÄy× 25énÿ­‘ä(YçíÀVÝÓ٠ƦRô ¯’ʆ1‘¸|–|¶â_|¶Kf¾X€ OG<yº,çE¦„Ô£ÑÊ£ª;_Óo{š.—¨ô¨>tbØ&îç÷)¡”­e9EW–§”‹²³À.DRº&èƒïc²XJ«3ìÕ Ö°>dû$FhF0|;]ûƒBVûþ@Yç„ᇩóà:ÊZd™ƒKqQ'Ñ< †C!P0]‹á•ZŠ4ì®I® ÀpÃ+€§P`ÜÁ+x¿ÓÂÍàý`Ó†(\õ&º8XÃÙ;%0DNÜš@Óʦß>áñg¯Ñøž‰Þ&üŒÆøñÃÒÛÑýä9aW¿fì·V:6’g¥ÇE†S‰ÎÆà"Þy—¾åi”¿²üÃ7—”‚O Ó.ÈÜé£q'ÓdÄXS®c1ÄœóGÙsdV˜ c9!¤Z|³âeiÇ)û‡Œëqf<~ļWé^1í5»Â…í ølj&¼=´‡ÌÆË}ߣ[Yö†›×(ëÌ’›Ý“X°nÙI?æ£ U­úMA»3ÂHs”®…µJ,K²á¦U¶øâŠ{°‚Á…eoøŒ…–UF–Õ2 Òfýâ^eñijáâž C`Õf% Ý’$zhš¦z[h6ˆ©üìôiœ.JËIⵂͮ”ù>›^Ý´*ã[ËKPù‚%£€ÏŸ*#å0þIÆÂ¾I9›”³QÅ)ôÉõ^ lôi“$„%‰uZè1†h‚³h|Úøä îXˆ×xÄdŒ=sMyÇÝÌ%UhÇ(ŽÊøíE9j€ á›.«…­D8ð{RûÁtK<£žjesߦnGìOÄ4€ÈŠ Ü Æ·ŽsU0…dr¦EWWÀx‚q`6¼¯Àf¼ÏÕŽŠñÛ2eÅcºl0b0çÇÞ&,×öÃø¡fÏmÅÖBj?¢ž½2c\Eãz5óM,Ë0>;…o ¾x„É `( !Ï­:ª'cŸFFÇ’Õ:³f1·/3ÖPhš>æõm<¹Gå%aUÔ¿Ã9x€L‘e¦ Ú ò86j‹ÍSÚ2í…ÖÆ¿*Íi,ª†‘‘RíjooTM@Œ×s•"xzˆºÒ£0чa‰õ^Ó;iŽ{ G´ijWÿ!ჽ§r}—Îé7QWäV{¦æ°¨‡'ðž¹Z,ÉÖƒÇ(ƒe¼´¦ø@ùš~kò `êt¬3 `à=fÈ‚,k—­ä>c4B])ŸÑÍ ÄJ ©“õ¥Š¥lCÀ¹âù(hô7 pØó|¢H ƒ~t¹sw­Ï(N€—4½ Gæª_iÖ 2á  ¸ÖáS4g©I¼ˆÛ•ºò ›^®('Jñ‘øS,úIÄŸnчë‹>ÔÊöâî"j,kUé×äà©ZpÅÚ€zl`Øû‡c±Dsn3V’ÕêRwq•dµ.ŠÑõ<(ãžô¥úØF96Ê1_.Õ­˜ÎÏqëFÌFº¹PŽ[¬ªå´¿‡g#Ø DUµ]*2bÕúP@X7pÓDlˆ˜~7¯#”+ìž '‰ csbªžî¢åd$åÊ'*9£^ãÝЈ»L<Cù¦§ G á/ÂFœéápŒK [ \„Õ›q<ùéÒŠU•õ9ÿªÅë„$ÑéÒƒcA픩[9ÓåL¹Ÿz¾ö“IpWpo¬¨…{TÔ!Ea9⎋þŒNÔgñ˜_èR{?Ôð~œÐüŒåöpzþÛ®yýÁ¯»/Ê•†ä5ë¡$¥Õìd›+ôQ™(ÐB ‹ø=²Dž)³Â¤IÚ3¥¸ Dï\ñYF¯²œ›ÕÈ20¡úâøN*€E´ãܪâè˜|°á5!’-"”ôâGØ^n ìD´Ã#øf3FNQPIRA×Dº‘Œh;g‚P㳨f: «d²m8‰b¦ÝžµÂð,S÷áPËÏ:™ñ;ÈmA[Å8¾èb3†gYó´qÕQXú¸Xö?ó6yŸ°RçFÏn£²« ²Q«ž¤ÀåêàHà=¸€Q˜—5ÒDQ®@aÜÖ0S™&áö‰{‰ö‰ß¼”ªJo÷-M/þ¯ÊîH¯'Þ00ÑDÄLJ²¬E8Ârч`¼§ÅÃÛI#v“Š ›Ý!ɬ@6KÚæÐm­<ŽÃˆ÷wÔÍ‚û²7Û‡§t1SWÀž¿ŽZÚœ{L-©›ë/VöRPMPV’ùÅ œõiH@1[pwt?Ä*A±!Uûò=Á©Šh™¼Z9$e}éÈÎt3À< cVu™n+ø–@ãA :a¬bÌ$Ô~–ëãp›/p—ÑZìÏÓå©È•ÕZ]øbë1Q–ÕŒ"„A&%2m5_á4CÙšn¢Z"¶xQÒ&Š LxÇìÙ LTU)ÃZ4Ò„Êúé õ–‡¢1¯ßMÈ‹Uºº ÖL…[ê|" ¥2‰U‹µ¸'­Öx{¯ºƒ(¦—¢ù¢)­¸Ny–ºÕÓ]€ 4G®9fØ…¡$âGé­Ó#ÓryA)´¬ùb}ke½Ëº6µµ.On2U•©‹“+¢S4L˜byÓËZS3ò*^) 1…*%8(#è­R<Å SL|âõØ×y›×iø—Ía$)‰Jú”;O¤§=CŒ[¤ÛzË㥓lináÖ¬Œ†I´ »¡E0Zð˜VŸ’ÿÖ¥‡O xçÉx‡#¢h± HäMÆh¥¹Š_Ï›¶d¬ómm ˜©+ÿºr q“+?W¶v©l¨mÖµ àœ-@aéAΖ]M1Þ®mÕ™PQ,Ù÷L×qù/¢ò²&Ö†åFgËŠ±ºÞ0vA;ÝšÔ…ö#|7quoHQ)>m,b¹ž¨/À¢¾8†Ž}‰êiê^ußêp|ãxA—(‘‘.“MÊ8ø¦÷˜Ž÷™?+WZ%‘‹ˆ—™½[‡pÎLgš¸ÑwÔ-ÉtÚ1å©p€hfÁhÕ´AHXÒ"ØÎc—ÂQILJD^`¦~ L( CdËQÝF«N2%•ÉöåÈDîyÔ–½¸+ŪémkÃ2ãC6ˆ™Ù4Èĵ¬pÔuL ÜŒÉÔñíKY&Wƒö“uL´JîdÑ3÷ùsô)0ñ½Ücê#uËrGÙ*# e­ˆàÓùU‘J6}‰Ï In)4ǽf–îpΠH`<ÕDV Sò_[{ÇÊdÔçºú Á¢Ÿ7Å…S#®£¡3€$ dÖ ikºÎO‹äŠ(Œñãz²ÂœÁŠ»Ðá8YƒÁR‘¦7K¶G¤§/~s'‡§ 6Ñ•½2GZ¤,fUÔÞÞæ¯‹°d¾|†¬¢u·\¸h/PÀ<˜¢óÏ$Rút…´ru«š¿Ôݘî´'‰6’¥Dì'/¢ >­}ž¹¶–õ ¬ªpMz¹Æ%u&¸ CØb±N¿uêæD„ÖCu#¼Çi±)™L´: ƒ1²ß’ Ö&±Mkz¸b>ÃHål–IJç{¹b×®\&<;W¥lÙª£òB +‰è3¼.ÀÙµ¼Î|1Œ=SÒÁ4ýêšÂ¨W¦ýdiR¦Jc<Ú4ŒþˆVþ¦G\^o÷Êjå°Î°ª§ [»ßÕ¿î¾XD"ÞÒk¥»N‰Þi”ÿÎA‘|‚Dœò1üæ‚‚CCV-;=&hjA¤‘P^SÙø?Y³†hóyʨ@d> cÖ­e2Y-°¾¸pX~®hü½S&«ÙÊg—ëLæ|TF¸`~³ ?¤lËrÑ:ÿ’ɪRlú·-Ñõ>Ѐ”Q6tVv§ió÷¨tÔ¼fΤ9k}ÐüÎ:›ã™rpµ¤à–> /|à‚0Fw¢¬#²Éæò ¨û’rµJÜ®–)[=F°eì³ 8"¦ç¯Qz‹›RËé¶,Ë("#MæŠçO«FÝ‘›“µÒ>2Î^¤*uÏ\fæÄ¾GªB)hI…ù£óuº518›‰¦ËZ1†q ¢2K@·L=*/Õægï¬-|÷ÿ½Hj‚{ 8ѵ8иÅEw0ƒƒÏTÔ¨º/¯½ä.¿î‹ÉÆì…@èí&B"VÐé•O©øOQÛ„¬Ñó¯øeRÔd;[-9~2`(e ç©3¶£ÙÕrJãÊb;Jéb-Ç.e;˦^2µÃ¨Â¸Ö [¦Ì½l5°dÃ=ÒV¡ÒwemRp¶§£J؈ž†¬£ƒ ¬Zpn”~Q›ü¶&UÝPÔ¶»>oh¶|¥3F„ä¢[Ï[2cËT£mïÇMŽpCÁ@AÜ|·‰Á§˜˜ðÛrá´y Üàgl?yN¸¾°hÜ L£¦Á!Ó&)Ð2à‡DCMgÛZ_‰Ÿ)^5C˜2¸I*nxJ4_Üp‡ÃYž8SÜ:ñÊtüÚ?ã ­þ<ö $¶úfnâQØ*ÔÉð¶×öõ Ý Ûu»âQk?Ò}¶8 aZ Gºø~}¨|§‡VPú€ÞcÆ|œ·Öö©Û)ÊÇ.@û²¤.¶÷÷ 6Ø])lÛÂúñm(<|¦“tUÔÖÝ Ú²wúù¸âþ 1ì`NŒx6Œ¦ÈŽÑCÂcIGön\ƒÀ à{:ýáÖ3ø0fÕÞ5 ”cûêS~“L`ð3ïºÕwvð)#xmÙð±€'ˆá§ a@ ©Æµ:ÀÞYW˜CGï§]^ ·­ß^s¾1®·ÿ¼û?6ùÙ endstream endobj 6170 0 obj 5533 endobj 6174 0 obj [357 /XYZ 38.2500000 233.750000 0] endobj 6175 0 obj [357 /XYZ 38.2500000 233.750000 0] endobj 6173 0 obj << /Type /Page /Parent 2 0 R /Contents 6176 0 R /Resources 6178 0 R /Annots 6179 0 R /MediaBox [0 0 595 842] >> endobj 6178 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6179 0 obj [ ] endobj 6176 0 obj << /Length 6177 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ€ €´’ä@€‚9N`ÄF6>äï‡3$gwI~Mö·ÕErv¬Ä’—b³»ªºÞwüú÷ã?;¾{øúŸã÷î÷‡¯‡ìTæYûÏñüë‡ç?°Õ©ûó±¬òã÷_ÇÇ×׿߇ö…¯nþô¿£=þ©ùÿÏÇ¿þ­ùáÝ_:ÿ…_¥)›ßÿ}ù½.Mó§ìúûùçÿ:üåwÇ_Ï+öŸë6óò¿p¾(|yÞÆÌ§ý1Íå×oß=¼k÷•¢v¶öGã]ó¯ÚÛãÿqø©ù@¿|vª½1eó÷³×|¨´—/eõÑØºYiâC—_BË'XÜåYºÅ/;‡Šq… ¯~ª¼3®´¹?#úŒä¼ªlóçÒuÿ¼î\>³ÐŒO¶§å,ž›<Ýâ—‹C¥G8^=5ÂóªhV)PÒ¯ž%E»tÄtÞ¹4PztÃÅSc»¬Ê„ؾ®ž!U‘u\vž ÛpñÔØ®~’Û×ÕS ¤®j—§Â6\<1¶}Vv·//åaö´z„xÓœ=Ùâ—K¥Ã6^\P ÷¦ÊÓÝã§ÕSßé”ðvç‰î1^\³®èØœ³.€®Ë§€~Q§S¿Ú‹C¥Ç-^]¹•7 m©gË'X¼ÎÓ ÷vç©l©Àê‰%pó¬·vòÞ’gË'XÜäéä{»sq¨t¯þ%f¼•ö'À£÷xñÃ·Ã»ÏÆ›˜ÅñÛOÍæ.ßlûÖ%?þpvPeÕñÛÇß7[ªÿpüöó¡>6ï·Ø>1z’YøŽ‡O>ÀÕzbñ;pܵÃß0ÈàÐ…[`o>ùŸ<;(!Dáwðj.‡ï@èxQƒ©—9ÞuûOßš žünÚr3w3@}Ÿãï ¾¦ˆ¿µo’j@F>kɨQ/^‘ÉOYíÎá¬!z«SUg—ÉhêI Ÿ´ÌÅŸ¼kƒfOßiŸsÊ}Q5‡¬*?9[™«¸ãâŸàótèxâ:>©k™rõôW øáLímpýƒ¯ˆz8 Þ5&¸F2þN`×Ä2Ÿ@Ì΃¡S Ct³ÔMÆdVÄ|Á Ža©8€ üáÌ1dñ‡ ~‡É:°øÀj<1—`˜U.ýˆ{>¤––¹ŠKLüt.ßɸþ¥% k/ŒÉNEi^€n †#WÉ|Œ—…¾WÊ"_¼ b|s0ݾ€+@âOuƒDþ“ž%á]Þ´™'X#ÆKö>~À’€v,eÿ@ëÃâ“b›9)´¦º½éÐKî•é[ž«ë61<õ´/Þ4Âφw€ý Ø.÷ïá;˜v?[g!Äí€ðXáÕ2·À¼â}.ö}~;÷lu¯5¦±ÞŒ °?ðô({­i± qšcù± ËQ0U©r‡újñܹƒ0wزß\ƒúf|Ó¹¿†8ÞCû›á²þ1ìùYî> XдŸ‡Ëc?Ïò$v@Sþ?lt/?ñè\Œw>à]ˆ€=ö^2ÁÑòÃ0®<&Ü!{­§¥šã›!ÆuáÆ·‡ C`$ãñ6Y†hðI1ˆG±…ôc“…<è¤ð">x£Eˆ{ϸv»ØûTŸ˜!J|SeÅ Ã_VÓ‰ÓÐrJ À|ÈÏà&ÌýÇd€ÅŒÄѵ"Ê•3qÓTïôº¿ë^Zð$°7x½÷¢£%"€¡³ké£-áT Ñ Ô ÑT“…#£¤b!¢Á3ÉM;atíK¸˜:†*Vd“†2ŠIH ¶Á4"|­QöESõ" ÄdÛY9f†sØWðSE¶—’!¢2 /@pŒžÆˆá=©$š…©{ZÓÊøÀ¾vµÑÍk×¼ë+j®±€q9IdÔÀ˜T"0úàp$SŽçà]x ĉ$ÞÅ‘~&wî Çu®iÀ»ÀGï˜Z(sÇõ8GïžÔcü@JôðþàNj”tŸæ=agê¨Ú>]E4p–«Š²Ö„lµ•™Í<¢]*QÄûš` š³Iu'bòáHáXd%˜$*ënd˜ádNï2<')¾”7o°úhý{D …ˆÛG4 € ¬0·nt ŠÓrúmÏkÂlV6el$ë)ÂãŸDeG*ûVìÈ„‚£*ëÁ©©LƸQ@7:u=Â5UÎ'¡á g[ŠE§AŠ˜M¾è`‘`Á¤b=–‘Ž"ö»lÆP®¯tG(«§ Ýš[å^°=u BÚö;Æö† Nïu,ƒWŠáà ]¸d›É4_ߢ‹ààZ" §7a É€JÈ5¨î"!ù)Ã$Î*uGY­JgW":®Àrýµ$Î(u*‚²ãòHŒLNðjþCY—ˆAÚ î$ H©tŽñææ!^ᱸ•|Ç|‚ïÀ' ~dsœ´.VŸzr¯˜ @ܵ/EzJ‘‘dÆ=½;ÊöÞUþ0ÜÆ,H6m4¢Þã“›ð7ya<²eü©›¨ø®‚v” ›È2²Ú‡Í¨2àUã.ùPò­ïâ‰àtJí)÷=S_„ù³ˆ ±eÇÞ­k\¸DMoÊã+jã%X…ˆQP â¥Bu¢}‰©NËN¥ôJ4¾˜¥Ù”e¿®¨Ò1ž€L0.lŽÅdÌD„n'l«Þón¥&U-¹^¤_ÆêþÍÞs2gw«î%¼Ô05¼ëu›b.À½ëË· <.­ÅEƒ¸l1P‚ß <Áe‹°Y+>i èc8EâszÍ´ªûÎûÝ|°‰àkÀØqLÌÉË–¨ƒZ/3—i4!â– iÊWWò˜1D8ê›Q&·XC,[—µœ™Ru™c,ÏF61ùkÖó•Rf5Âê¥ÐÚ`þsàaÐÁ{¨c'ø~G¤Ëõj_6PÇrwÝ@zrûîbøCÊ€¾«RL‹|¨œ‹©è›ª¯]]ï¾)éïlÝ7U?õÂÄþÜl‹ð áÕ˜'xÎ&ט/^ßÜ€~›]Rü„%‹Sù‰,b‘:­ú7á _Äè‘ôof÷DŸff³ëgÔ$®4§’:˜ FF+÷Æv'5{XÔùÈž+j›ÊHºQC÷´I›nùD P‘„)œÌ°ÖÕ‹ØîìŠìú=!(¢U ŠìÓÒÝ`PD«HÛgyo}9ŒoFÕ-c Qo:÷^ɬÁZƒƒò3 ih%­CÒÄóâL1Ÿ¼!™+Ò†ëF³‘wUÔ"›cˆJë#ôU9SϺÀ3ææ\§œêi‹Á (kYvŒ+1D5@ZíØ ëX_JKöt]’»Pαí¼Z»F‚E˜—NÛA¶Ô]­–l8‘¼#:á,Ž©4T(ï®ìWÍÂnÕ{*²“Q˜€'C;J© ”/ª3Å G‹Ðý1C"æD4¾ûgøÚ èìD®%*qàší@5Ubk®}D¶2ÉFhú¬%M±¢háI1 ð'VîºÃ®œ…â–•÷٤ܤðQÄmm_~r* &Â1¸Vßþ˜Ê˜µüÜÂÅ€’h½’V®íØMCTß15Ý¨ÜÆ„ÁÈe¢?F!»—hm±´š¡™Á–¸Á]´þŸ2jkŠÀ[?ñoƒÅÐTW~¦W4 z3ã…<51q#f\ÃècýƒH, zm2þ9+V«zOÅ+Tkœˆ‘S³Á{jÜ<áEO=ÃtÅ6ä¦9Ý@âE€Y¶aŠˆu¦–A¸¯EúòÊrTƒŒ!Ñ¢dç EDn´ìœqa:ÇöyeŠM#ø2/¦Ó;Ñœ1³”p#CZb†Ð1β^¾¥OJÁ\˜!Õˆè†7ÖŽ/&q]´héöM‘}Š«»Q´q“Î’›¿{ë'EÐ]¼jŸPl>ˆMF¥ª8uxu^¾å¦)5±Lb:HbEÄ}„²ƒ°¹…Çb¯NÅûÔH¨Ñ¦x×Dvf€Bˆ@ž²½é¦?L²16àñ=U’ÛìŽiÌÈ 2f»#Ç3¡ƒRù D+“D¾OâÀÃÙ)§î£D„)u8­rŸ±q*‰iNñWð©ºÛÔª”Ç7§¯•0Ÿ¨iø=,M:`›d½\%ªÓ‘ @u[«ƒL«þåíd+½cö(Ú9‡ÃËö9‹ 1ÔÌíBTó3‹t4!Ô‚˜«§”¸`¼„«À~^?Â8/¿bºTÙyx&,Sw½ˆÈþdäÝò ÙfÏ”%"r…™ùw˜2íÎGª7Q]šØˆeLUÊ2’mè*Ø(ŠmRêAÚ&5[õk]_ü躗ǵÍjBVV§‹ÐÏÖJx¢ôÛåIE1)±Ø)$·g DÆ-°¾æ¡28!Cuu>à¨TÁ ¾0¢ã¡˜RLAŒ&;}*"áš‘bk%É3Z©‡Î8a!¹«þ©Š½|vm΂»Ø0£%EWÃ=qpŸ"|žÎ,Ô¯T`Äõt§{W{€'Zø¦ij «[½ŠPÅXè0§C/þºSH/ˆ@Ü3çÆÝÎ}­à›ùâÎe¢0Àý³dO*Û½ wð pM—׳û Œ-Æ‹[/cn…±…¿ƒ¥†/îĶþ­%° >Å.|¾¼öY›d6ÿÕs×] Ãwð“»TgëR=w}+Õ HQÅHuYlšϵÁ߬TÏsÿ椺xÄü2`3#* ¿ÄœÔ@hq_‡5nÑ›Žï;Ðù‰»©© å¥[A*®6TXÞC* м•îÔÊ„!Àå¿ ¡Ãáïl]Šn~?7'Eáw°uÀ°"Ç-®ñ1UŽ[\­^ì±Öšì]Z÷ð¥v"sµeB™îÔyÌîöA•*(eæmqxàh*Ñ™ÊÓ%²Ëv1_›¯ }åòL5§Ät  ” iÕØ¥ÈÓM:jÛ$_DŸ⊙§Û)‘N|OÜH®Ôl¹»R@.`v‰e£D¥ÔÇÜjñvÌs%ª9÷ÉåTê0S¯‡&Õs÷ Á‡`ILCЉ¤­ßiøÍ²5ºãæ“ο§žþ²Šïq˸:f;á(øÔ¼}ÅERfài]žU1€H’©óIëó!N•Ü•jlL¢*)F¡Ç´º¼´I¸Em_Sê£&;;S¶`G­w(_“"Àª£©';`u,­êµtÓFLvj#£ÍL<éÈ(?Ù¡7¯†ß±|§Fïôí8ÜÓ>)NÎØµVžÜ½OºPíÊ ¢œ‚ü^-°Œ­¹ÇÕSé_{¯í`Ê7®7ÌjD-FjD½DC«ˆ¡Óªœ–r­f;Z„ÈHC&2'Ò¹œ£|1mŒæ§?n¶s\JÁÔÙ_O’)@ûL£¤‘Ú/ÛŒ@Äs´¼y£ ‹4ìc:ø3"Dx¾îê-W "ú0‰N5ºÇI±‚¢’^W•}!“ÚŽS#q:e ™H~5°X'2;¤ %1šI¶Uíæ¡H} p5NÌ•-¬Ã'¹qy µ|G3™·6ׯðÉígÆPWƒÓW¶!•HI“M.Œ±ë!5ŸO|–åðнXò†û Âz&æI€Mùý–bXTᚦ~ÖÞ0ì7Ãu4Êú#¯HËyµZÆxÄÔ'Kÿ– 1E%9ÏÊrØÂU¸¢Øòø>âJo±¶¨ °UÊØ ðUÜ—B©:PöÞ3 ¯,-«í@Q³1¦ïñ N¨u‡ãø ¾òŠœÝ8?{ïgŸ$7rSõªï>GüQ&ÓÈó¸Ü9àXmÆŒ©+›ÕBÙòØk¾V?Zª¸h‹|á2f Á0;`Òà;TšXDÑÒžÊuÜ] ¡J1(vLéR ÜÚkÀeOiO”@“x·+pRæ;Zlw­1 IXZ=Þ:7¸V.yá‚õÃoÞëWãÔW†wÁ_§cí”ÆgÄŸ¤î(.µ&Bð3¤—x s©•Úçè •âtË-÷çqËæ×ñ±¹Áûòeî/,¸PÕäô™†V2sN~:>‰UªöðåÄ[.hOöâzþ¤e¿ÅøIú·§bXÐy¶¦(â#úŽ›S©¦öö¹;)ÊÿÂ)°~ȱùXŒØÑ$Î;Ä49q ƒWƒïtÔj¢Ž^>‘-Kpç?7;îa÷)žðj˜\ ‰“ †*„¦’΂™¸Àït ñÔ; ˜²ªÁ5ÔðÆÎÕVq˜Áàw>t»ïœÕKžà½uŠÆ³€Äð3PGÃO †\ãyÕ-{gËÌ:~¿ìòZxlûÌÑ1+Ô¾¿þ­Àç endstream endobj 6177 0 obj 5022 endobj 6181 0 obj [358 /XYZ 38.2500000 68 0] endobj 6182 0 obj [358 /XYZ 38.2500000 68 0] endobj 6180 0 obj << /Type /Page /Parent 2 0 R /Contents 6183 0 R /Resources 6185 0 R /Annots 6186 0 R /MediaBox [0 0 595 842] >> endobj 6185 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6186 0 obj [ ] endobj 6183 0 obj << /Length 6184 0 R /Filter /FlateDecode >> stream xœí]K¯Ü¶Þß_1다Pˆ_º(`Ø@E…Ó´š nýûÕŒ¤ñ55%~:‡Ò̉oL‹ÃÃó~¼þã§¿þùÛáõÛOÿ9|~ûé©86UÑÿs8ýzõü¬??_¾üòôõðõéãÓÇî¿_Ÿú>½ýs÷Óÿöð§îߟý[÷‡?éô~yjLÓýþïóïmcºŸŠËï§?ÿ×Ó_~wøõ4ã¸Ü°™ïÿÿ•+›ÚøÓ6f–þú4Óœýöå×§×=ÒV©Ûʺú`JWL[ÚÃÿñôS·À8}qô¥3®±UÙýÜÖeSTÞÛîçÆ ÿ°‹7ö²ºm;ø×“µÏ¿df7 “;cô&?ï\(ÆÕ&:¹öm;ïzµ•Æ…Œ³k\HÙ4ЍtÚ¹4PÆÛ†“ÛÒ˜ætËkˆH‚ª®ðtÿÊèÛô “7º«M~Þ¹8TƻųK^®¯â³½Ì®þDz“Ÿw®õláäÊDº.Š‘Ò™RhϦW˜ÜØBoòóÎÅ¡2Üwdví 7Ó“Á¾Í®q%¶ôŠÈtÚ¹’ †'$ܵ»P¿F@N‘¸Ö•Uœü¼sq¨Œw‹g×~ÊUãŸòev+©+E:qÞ¹ÖS†“K>å¦PT”¿Í®üÆë xýεnN®ý޽sš2Ø·é&oKE\:ï\Mók_xÛ¤µj4®¤Õ#Ü$ôÔç~çÒ@¯;œücÊ$x'ýŸãí×ȇo>?½þ`JÓ²>|þ©ÛÛyÍþ·ÏHªÃ«“ù®nŸ<ü¾(¬ùÃáóÏOí±¶Õ¸E~Ä”h¤ppä-iá:~cÓ÷æúÙÞî®OòÞ«Âs»ÒÏ`ÞÁ‘Þ#„/†bñ&ý#XÁÜ0q÷Åûôu0t0D#'…;`0Ö@XÛ Ž0‚Gà:%¦Dö†©œ ³çW2PU*ÔTgäJ7šfØLSWçý„‡öGßßýÅ»cUÖ¾©¦Ó‡g-¥ë¦ßFj4½+ÐHiáÂnÖ…[*á–ðf%Nl$öh pðô»²{<âŒÄ¹à70űnÌiåÈ …ÈU4é›Ü>žm‚øJ1üðôŒ!.ld³Ä»¢ÖYþâ0%‰€‹¹ |À~ĘwBi ::ëÍÒ‡ìÒGðyÙŸG“µUÀˆ"!…Ÿ9&“øgá!Dû"w…ÉC‚ðƒd`M‘ÈyD‰Cü0ëûƯٽƒ¯¯ƒ_æ›ÅÔ=2=ñ;H”ð7ËùY„²áW)!EÃï]:×ÚNf¾SA$By1IàîËzh1èœ4£ÈÛÚ/gŽ·­:0Ï0cˆ2êñ. Ö!/Á#‘b9Ö³#Ä7A$pBRIàž2Ú»È$Œ¸ÈÆ?›<€lñ!:Ï‹ÎLµÍ,yÏŠŸŠ‡ö.<ôM™!ÃI(‰MÖ\‚M~·7TÛ)šWeÕuEÚÆ„a$á)>èçÁ^½BÌÓŠÞ¸3mx6†!ã÷Ih¾áð£‹<‚=1l½„l=Ân6ˆwŠ+U¥GFãÆ•H Œq¦|Ÿá}¡åi´§$ 1HãÚl7G¼ܽ«Fˆ<\ý·íêσ/U¹žVèëU1ÆaîB™xe…0‚‹EQBʈH&P–ˆ°3 ED?`$zFʤ¢ÞTxBnQŠ~ŠÍÇ æ4ûáJ8hž ÖHÆ•ËiI czÆdÈs„+˜€yQ˜-jU¤]ÙbdÚåE¶Àò”‚Vòjš}p´òCÕ2ò0á7”™ “‰Ëˆ­N”ŠÜkÁ8Ã;®qABM‚™±_ú78õ40Dšb›7H94ùhS†DW×¥ÁD6LáBÄ"lïK‰\üò˜ʹ"( È»'“‘§º!ÏrWŽ³Æ·s  ‹eeh™Ä#[‰¤7- ÷¨‰·:ýÅyÿý6ÒÂÃ7/=ìpJNn`Bñó•®Ë¢™ÝÏö¥‡qÊWÆÂ¿ui/º2þ]°ŸúQÊ{wïɯ)å‹Â࡜ø{ê©‘ï=͘«j$„ް¼õò¤ííkui{ývçmP ×¥ÖûàÝ12žºmÃ5©KÆI¨ELŸA*žçæJçDÇy"/Khò2—k–!lºëjY¥6c߯»«ç~‡…6j·æN¨B;.š¡ÏXºöWýäÉ$T\.:çè:y#Æ…·¥Ÿ}e¦¢ë†|9~±=+b;€èM5±ÝV%se<Òö(Ebâšú:1Ñ\ÓOØæ¯K;^h³9½l\ˆìµº˜äÃ5™ †ÍzsÈL’«†ËĆJ^ÜI äô&©dLB˜ †zŠƒ¥_ØL›ÑLÜjñ?ã…0wW&_š`"9CÛ­esiB3@N^S¹—vóª¥vUâ ¼ØÕŽMMs.Ú}Ö e‚HpË9lÒ‚³ (Ò0Q4Œ…ªåÉìàÙ0D s3e¢†;ð@ßLé/íÖmO”¯U‰Xîãe’é6s´Ë¶…»M»ØÎsúùž”»; HÞaŠ»vÃ%¬{3êQ‘B[sË`æÂ…:ë€áÝkXÙÜ2*Ñ'!¡R†).ÊÚ rÕD%’«¦'ËoÿåµõÓÎhÚqÕ¾ý4b}d$&]ö>lu¾ÎÝêȵâ¶|îŽI+¬’¾Áw"‹–À¾ÇHÆ¦ËÆ*lSÇß`k!N#v¡BØ–J¤¯áóD,ôøã7G¼,ÙžM{Nû‹@û»ˆBL¤ë áÉ̖#\eà‡m1¦|>›%›@ÞºÝ@þ!U:YÖY²¿J‹TŠ a0Ž¸ÈˆòÛWŽ¥Ìιº¬íƱ,ÓcGlL(Â}:3YÕäYU0-"®Lé$b ”C«„Ó1ó­:˜BìLŠÁ$÷ÜwU¸ ŽlBæ~Hžr’ÓqŠñ¿3‚ƒ D3„¨bÃËs‡˜Š2LW)†ÚG3ªóÂÖøöOéJ`°LˆßpA?U¸ÖC`š[`”# °í ê!>QÌ‘h(´}Ë›Œ±,MGŒÆæý`¼4{öc¨Û›Â_jÇ2©½»yÙÙrNˆ¾Ž{–ìv(PäÒd'‡)÷ÄgZb­¨¬ÉH6³ª¡r—º HÎíEââ†68›p'šÜ–ôí|uBŒp¥Dž¬ËS«„Jº"5Ę0˜¼É1Pçê½y/8µø–˜þö»”Ø!ZF¶÷h„hjìMWªðmJê…Þ:\çöª¶ÀPaS–#(}P4—qBQ …‘ÕÂð‹dQ§š°ÿC4í•ÁQaÍiÛjÆ4ùÉŸ1Ð?µ& ã•Ô‰‘Ÿ©½ºg‚–§Äó„‹bviˆ®ÎNض——ú¦_S¬Ñ¼Szî íJ4›ë`ŒOéäX­×2Õ5|•Ê}|Œ °|Ÿ­XliÃר\s‰a(ºæ/JÕÈä>gÞ›"j¨ÊÑÊÛ«£qÅ C”£ªùRjö[Ì…uc"è:YøÎ^¢ã#›jJ`úJ[í&RßÔöc’M)HñºGµ™Û(—¬º}aÊL hf雲1»¬³_…kî¶ê›³g.F…t3FDQÌ”¢‚›Û“µƒÔd…NQ“ýôÝî=LX_=4¶ñ!Ñ-1¸\i‘í°“¢-ás1ow¡2“í‚ËÌ•y¿¹Ñ5BÎ7÷5S>S"Ô`Zx˜ÈÖg¬%ƒr'€óþ`Ú«6ÛAb¾”ì4}í\S{Ðd3WF†û®Ž6ôáÙð7Æ]û¦…ëø‘úõQ`Ïfë×étÝ¢u Gð:.^ƒN ÷fá7múHïçY[¢î×ák‡Q¤ù8÷PR5<º»‡Âœöw°c1µ¡„Ï5×ﻹò˜ú°v{´ý¥>é_d=qï†oê>C0lC¹²Ž›ca×ööa8)ª?Œ­®eH-°¶SO8=œ‹5Ë+Ç0x6øÍ@MÒÑ›ohË"ÜéçnÇãEcؽOG<F×BdÇhƒ¡ a‡±dà)WžAdp$_ûÃ߯,<ƒB…/&r®wèA:L`ð7o†Ý×!«Á#xoƒ?é±€7ˆág ¯ D@ ©Æóz_ì›m wèý²Çká±}Îùæ¸ÞáãÓÿÆ·”F endstream endobj 6184 0 obj 4931 endobj 6188 0 obj [359 /XYZ 38.2500000 370.250000 0] endobj 6189 0 obj [359 /XYZ 38.2500000 120.500000 0] endobj 6190 0 obj [359 /XYZ 38.2500000 370.250000 0] endobj 6191 0 obj [359 /XYZ 38.2500000 120.500000 0] endobj 6187 0 obj << /Type /Page /Parent 2 0 R /Contents 6192 0 R /Resources 6194 0 R /Annots 6195 0 R /MediaBox [0 0 595 842] >> endobj 6194 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6195 0 obj [ ] endobj 6192 0 obj << /Length 6193 0 R /Filter /FlateDecode >> stream xœí]Kä¸ ¾×¯ð9ÀÖXÛ˜~L€4f€‚‚Ùl‚Ev‘Îò÷ãò£ºÛö'[,ŠvUy»ÝS*II‘_úôǯÏþù[öéñë²ïÝÏǯ‡üXyû';ýýáýڻ߳ÊÙ÷_¯ÙëáåðRÿÿõÐvøúøçú·ÿe:ûSýßÏÙ_ÿVøc÷¥Ó~9Tªªþ»ùé+Uÿ–Ÿž>ÿ×á/¿Ë~=ØO×óñß?ë çO`ÌLýzè—©š¿¿}ÿõð©E@Ü,e få2eÍ”·:ûï??ÕôÃçGo•ªJ[å—LTéÓLZ™Li_£]»ÑDÍ_žáU‚Á­ÍÓ Þ@ÎŽeJýè¬Q¦Ò…=úDäÂ9]ÿ^™îÏ…Hóº#xîSФ>Mª0ý¼o_UºýêÑù¼Ôï[r7düAD_k€ç¦¥8íÔÇÜΣîñ<6eâ[0ÔÊÆ¯Çä¨Q‹‘¯[`U~,+õ‘!GƒX8ˆ‡Ð—°¥Š_ñpõòA,‹Y ã·Q06ÔÀXîÀ|ÐÆèƒ!€Ñ®`ZØÇ™¬I8Ðw{‰y†¦×ñIâÌ)鼦Q’Ñb\"…ÃM":ާ˜×q …‰Óf`QA§€õgÓ`I2ÚWX âA(RaÄORª«ì5lwš˜pCÔ& –#ô¯´~ûÊ g‰q°qà«XTr”ãÉxÏ2æÆ, ¹; R°O—pЈù’~ØØ Š“ŒXó¸6èl¥¤½áe‚/oªÞÀxL2=Pxd…. dêÐòÏ>¸%ApƒèZÿ|À’^KI9¤\Í0çöå"õ‰u%I"’')½qsYíPMºÚ²nõ[³l°–ÝO õœÊU1Pt1ùÉ— Êq‚"Êáh³‰éW¯Å®JÆF˜~nTŠ]ð1ÔíN²^î°¼7È^š38 ØÐ\9í3S„#i/§W˜Ö ¨°„¶kSÅ1÷æ#³}†+h·¤Ò}Óì®lOª¤ðjñ‘„b1°*ÉoD0…2ß+xKý¬Îß ã€ÂèÊ‘dQâbZ«×cq)k†8$\`D±º ì›qü@ãT›äú³,"NAßD@Yñ^çG,ŽAbà½à2‡L$N¾›µ°¨íMg:B¬¥„ÓS %"Y’ ÁªI'”Õ ü~«% I^vÑ@”×Äñ=qÏ…½<Â׽šo¸Tc 7GµòZ·QªÑc½÷RFÎqè¼%è±ý˜{p·\ºIáy-[/´è|yw<&•ßI„bK’\áU_+bÅf|uF6ÞFÒ­e­l…Ý}ÊåÕJëw!-c{ C[Nþ¡D­Sp Œ„wv>Þä3Ö {l¹„ ŒäùŠ—OW+ž~-BIзV IìbŒ+_®~I ×I-¸dÃꆋsïV®w2ÅŠ—ž!˜³öÒnr;c#|YŠ¥ÁxL“û‘å{Ë®é6Á×3/6½C¼äîCÐ`¼ÅÓ(&RbT³VëÇ+ HUìŽÁ@à>C€K¤£É6N™³‰7*ž’S‹ ġǬ!Á¤øÛ[O¡å IÝž£Bª¦Ûu%pn¸¥x©¬Î5¤J‹ì㔊ɫfÚ`ÀÒΰÄÄÐòfÖ,—ñ\`žÇ^U\ç”ÕÛÎóÖ:…!±#r–""Ã,DIbÊ¿ßÇš¤ŠF­_q…$÷("k.t(¡rôe5PŽWy&‘*`êÔ[Lâ50½Îø¸û+/"vSER Å„%>’\S½s–RظB€»)Å\yKÐÞ¨0˜½ù%­RjZt§ä¸«4EÌŒ"@W½ç‘bûë©Cº iÕXÔ `Ûö·½Ë«ÁÎÇq˜¹t¦„²ËÙrx"'ÜäöÔé¥Z‹?׺á'¼n-ú$Éîßdü Ží¿ mSfÚ>Äj®Y]¦üÔ”º®&ï§T-»©üØž ß!ô µtÄ.Žzx˜Ä£á>‹Nõñpן*[Í»ÑÚy”ÕžÃ-y lÉûÑŠÁhݱo¢%ǸnÙ­:à¶‚ §<¥'OySó@¨;†Ÿ¢Â—Ô*¿³ÁÛG—¯_Zå£“%ÁÍrÑ äá1¯x+˜­].,mRN Þû©È|ÑÍô¡sf¸‘q ¯G¹î+†€âjÀ¶‘åWù Ä+\s™Üô/½×’„ñû+7wMoøÜ–=Cäòd¼ýiÔ•Zªò›ï×Sù7QßÍYÕß!¯›ÏµÈ@z~X[¢úÑxg×çY…y–` ˜)uÊ6\QðΤ€óW"ŠÜ J[GQšìÏßÇRiûšŽLBƉ-?¸ –XÁzϧÔ&FyßõÀ\µ3ÒÝ„ˆhhßrð.;=<ºzKŽq [(P‹ÕüÂ!É„gÊ{²O)EÓqý$¹bÙ>¯z ÁýH.üÌøú’«Àòv—\»äz“Q‡LÎJ¡¸y艃2ÒÎß_(¯&$f’|0'±&§®_õOJïÒ.x’ß0'Þ²$®ÿf¯µÈ Jä—¹/,°l¹Iÿ•2Ç\lÙù9¥.@`Ê`Ñ®¨š°´§º}ÖdÄ=帥«f©åÈ·ÕB0e8|Bó˜9#êl_º•"sj´o åØÞá>Z`· °¿ û¤&–¡ðh°O'òTÔÒß…-Sîô{ qOhŒ»çxÀ£a02;fŒUˆ;Ì%º˜Øà> endobj 6201 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6202 0 obj [ ] endobj 6199 0 obj << /Length 6200 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9ÀöФž@``Ÿr0ØrrÖv#62ñ!?RKꙑôQâ7EŠê–ñL–V‰ªw«ŠïÿôíÉ?OÞúöŸä{ÿóÓ·Sz.ó´û'iÿ¼{ùº:÷¿'e•'ß==%O§‡ÓCóï§S÷À·Oi~û_¢“?7ÿû%ùÛß›¿ü±ÿÚÿà×S©Êæç¿/?ëR5¿¥×Ÿíßÿëô×?$¿µ‡×õ›yýÿß™¬Î‹´ÝÆÂ«ŸNÃgªËŸß¿ÿvzß!Àí-E]+&*3Y¢êL'ÿýéôsó‚|z®3¥Ê"+Ó·¼¨Ôí›R]&J× ¤<¼èòG¼à ü¿ì\+ÊÊý\eF™RçYKè–ÈyUéæ÷Òôÿ¼í»tv%ø”³Þ޶gð€›ºòü²sq¬ ÇÐ%¥9kªCÊ< è¼àyaü¿ì\+q1tIâ–FwjÔž<†®Ð} ¿J=j…ËÎ¥‘2÷­§«¼öHí+t©[ÇÅ+µ;÷Em\RŽëªðiŸÁK/Ó´áx|ÓîÜ›ÆÐ½Šr‹´Ê›(¿„îƒÞºð%ÊÃνˆ² ¸˜(7/1ªðHÙ+tÈ7µò¼Ý¹/ÊBà’”Í2㑲Wè>Ÿ+_QÒ°s_”…ÀÏU¡ËÆËnâ?ôûÛPV¦©}…îƒ E–{d¥‹(y¢6.)ÇE]z‹ˆ_÷¼R>ù¦.}EÄVè’Äm¤ß'qŸÁ{^—åö²soÄ@p‚·Òý H°?YüøxzÿUe­¸ÉãÏÍæ.ïì~<6HÉ“wm¾¸‰KLþظÕÉã/§ú\è|Øb·’~„+5ZQ%\É 4¼W¾À•Ïh%ShÅÀ÷˜œÀ\Á8ÐpÅàLøLÌ+)Æ5\Áв”à̉pïÀÚhxoø{¾Â`ívýå±QeÞµPnîO a]±Ê F3H…}j.a-ô BcV ¿1ÅÂ!ï`hXh‘ÖwR½ Û:­ -K/ M§ÕðÊŽ Ù93]=Çóf:QªÎU^v:&üÌ3ºS *=¥ªšÅ1 «g RÃpn¶×cs?ƒÚ›†+4äg£+µö¼·NºÍ9ÏŠÃî©ÖÁ´Å(†ÐzasC D±ÂÏÀOWD „fÙ5ó¥dŸn‚ f$À‚eÁ¦Üþ:þ F6¹]O8ó 2^™Q†– 1+‚úcðX1iñÊDõ/ªdŸ°Òc ±²·èBY£BÈ¿Áñ‹³ApzaÍ–L m½v7.ús,Ëx÷ê³»×a†Ø¥,ò×{¼#F”uL°®ÅÐŒY†ÁÛ„Í– ‹ÅvÈ’ßÁ™Á@$°D±5\ÁЦÑy÷mbç#›hÁ ¶„?=õ )·°-††ÉK¸Œ¶×ÝfBe[eqÔ ‘œâ\Ôa°Pc+¿ÒŸ ’§Û’ÊÏim^¿çRº¤“ÒÃÒÝ„)ˆõ§l\°^ù2*–‰%¢æHt‰·ëBŘÁrº\v› 1VéD®Iرön©UjÆ8dÜÕPl_·¢Ô°í7yW˜Ý)AX¢ïÞ&~+f`"YÊøŒ&)¯ˆÉGc\Ÿeñ_ì9ShÑ ØÍø‡Òˆ–ØSsÊGW‡Ã£ÑÊóbd´°œPNïf' "Þþ ¿§ƒ²V“Ê*9è& mBbé#”"£„Ïj h¾÷/Rºi¹ÆKW×­ÃjfÅRÛÃT>ÁÚKEžhU–¥úk󚨮0U–ð\•…k•,õ˜ß 4Kí|î £7ê:°ÞUª!æ±À:íÐ1è +­ ®C'ª”-UíL4æxB?ÉE<ËÚÁ¨áHíÖ´ƒ˜?´C+k…ýìU,u‚ùBX×àŠî½(Æ\³(7¦Q4®¿?4J +kK<„õÑEgñ7°ü0ZèÐv¶Ë‹ÕvL—ï¡ímwY\å¥Çï:Œh~Þ¨ zlpè€ ïDܱ‹¹ç-ÅZâÚò ”FÆKÂþ`/þëé2sÝ ®YÅ“ý3f8¸]ó .í­ª²T>à¦.dR-Á” 0µSÚä|Rú‘³¾³$XQ½hŸ S¨dyÓá:檊`ïi;iÌ¥)Öã*(KÙ'QÎqó•€^*æ|–¥ÅȾÝjÙØýuÒ÷Â$|̪ëð¦P㉠;,°$ŽîÇ ¡VžêÀÔÊq2%µˆ£ÔH¨¥U`jmŸ´ÑøH¶?þÇ…™züÎøæR19@æ¬@fnÏæ­–¹ ܰ¾”<»a[ŽsÏTÙë'%2Ùâ>l›“Μ°"1Û‰á,ž}PzŒ%|„½K÷^S¦©ªÔÈ4 Cë'-lDxuÔ`^¹²³»YAšg/—²caxfŽ3pÒq”Ò#»æ2‚±"ô‰@gg"˜±/Z>Ké F+®céÙön– 48ÉD$)ã¸þ6Š’1[1¿ùIE(2¡ôŽï`žw¸ä÷x¬¬Ê‘A¥|m¶‰y’yhÛ±§¢¦_‰Ê³2‘÷ö)z¿· ìÔÚБÄÊUú/eø®7Å»¼Ftro`õåÓ–ª1E¨hHôÈÒ‚Ýí-ç$Öaò¢3Çc/Æç£ù˜`¢#b-]·L:T´‡”R.D;þž.\UY‹íoB6ðxàÖö³æ÷¹ÂLÈß³[Dk¥nT3È/9¼™ÿoY»Æ{‹Z;D,»¨ü‡MuQ¼FÇÎnnp8s9ÒÁ¾ÒÁ"-2_,–YÝa¦5Ô\ó²Õõë­»™A¬f‰9¿ÛOó5¡®|o1oª×‚4g^°¹dÜHa íC9¬-Fòr‘B¡x$ê)Ü-®Êb¸:&„Û&„GÂIϓߘyùø–Š¥• _§Ôõ Ó!È G»™b0¶žýHÏ–\‘Âô913vuŠà0nƒ(¦½C×9T†»‘f­ãÉp[r››FÆ•Š #¶ý sg*¾Áç½p(Ã;ÌUøþSìDÀ÷xáÑ0Ú! }O ~‰Y;wTÔ˜r8¸ãÏ ü»Úºâãþ¸v®L{W-Sf<ì«ÇÀó8\ìÒãÏ`¦6@ª[‚¿@ñ”ÈÀK83Ëuܨ€qa™ÕÈ )ô‹%Ùš2Ù–TáÛadï7"š¨÷Rzí+GæLxžˆlwÞö]€ñ5¹ÊæB¨Y›7ÄyÎTöW`šs*rkãƒILß±L~#Šq-~›ì·£ÙQ¨Ù1`îÒdדˆÍsB]”{G­W-…‹ê ðšàBŒ˜KÝ–+r"™6kµlÍ®5 Û³h¨bV…“§JVqåPŠ+«ï¯÷7WXjQ6åŠÅ•çËÁSÍK©‹T½2 yñ:pÈ‹ÜG “e“M HtòZb&ÅÎŒïÆ=ƒDͽï*ùÍg´S×ù0©¦J´6‚¡ã"™Z‡üLœW5=2…G ×Û}Í"5¯©>çIe+8Dµ¼°nßR ƒkl—*úç¾z¡†µšÅ«–mÛÃQ“Ö!Š2\"[X1MŒBÞÁ1”…«pzƒhˆµwሠ‘1é'(`Ž'FGÒÌÊUDÒÌ" ˜w0}ð ¶ XÃbÞÁíÂŒœBidJ³,Cc24D!*–Ò[¸|Þ‚Í[À+‡·ƒ·ÀtíRzƒ(.¶@cöÆX0Â_±h;¬ÓD}œ¿¥lÁö¾G #Y¹^Ä…vQÍÍøö`Ù»–dؤ€rãQ1e-)¢äV¸()UÆïÐNÝ=@ÔÂZòsL¹¶ha¢põ’輡ΜDßó·»*]],íó™ðÖzd7¢Á‹Ks5Á8ÈD÷Ø£#|Jü*Ó%êï*œÛe®-‚8!b¼…¬š*¯½±Od)ÂÔ âÜ ¼X•…÷¤¡Üò±ŒÀa¸bÉ Bà3¼bÉ—33 eO.e3µ÷æåøÏêUÙõn¾(Jê«çâib d}›3ï®y«¯#õbw5k3”wŽˆõ{vëjÖ¹>(¼' µ3WSáRžíme £KÕèì×l´å¼æLdR Ž“ã¸MÀaX”C3 ÞÉ®†S‰ž$Þá±.µßÕé“ÌÅŠ¡ºT6ì Éòb¤§&þ¥ÛábF‡ÞÇP‡ôÛbZ`!5¦Mñ)_7„š…èðÅGß³/s=q6ÖOx§î! 5T´¸kKcYõ8¨qháf] :¥IY$Ó!Þ_’1ǃ’MÄB4êp‰ë‰%UvÞ¨sAÖ_À²)ÙÊ6aÅ&[+{Q9ì°§j¢w ¯£‹·ÐápVlvû^¤Â#sêT¸3Tm.åLaúâPXv()3¯"¾è–‚YF03ÐýÖ »¸ëKÆË•®j ˜®ôfAŸû,Ð >SW>£÷˜%•1··¯ý—¢þ=¬ë³±Sˆbú=kàà ìÌg( >Ó«åôé/Ê{X†kov<ãî‹; `h˜ú"0bÍácâsI¯äfÄÀ²øžÞ0Ï=ƒq€©€9«‰…¡Æcù®ÁSœ1XÁàg>ö»ïKÃÖ¬à½õ¡Õœ²€ÄøSйÃ+C­ÑCo’Ù25ç^߯Þ~ÜÒÜv^„H‹Fí!y8ý³$ÜA endstream endobj 6200 0 obj 4309 endobj 6204 0 obj [361 /XYZ 38.2500000 310.250000 0] endobj 6205 0 obj [361 /XYZ 38.2500000 771.500000 0] endobj 6206 0 obj [361 /XYZ 38.2500000 310.250000 0] endobj 6207 0 obj [361 /XYZ 38.2500000 771.500000 0] endobj 6208 0 obj << /Type /Annot /Subtype /Link /Rect [168 317.750000 246 324.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0207/) >> >> endobj 6209 0 obj << /Type /Annot /Subtype /Link /Rect [258.750000 317.750000 347.250000 324.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/3/library/constants.html#NotImplemented) >> >> endobj 6203 0 obj << /Type /Page /Parent 2 0 R /Contents 6210 0 R /Resources 6212 0 R /Annots 6213 0 R /MediaBox [0 0 595 842] >> endobj 6212 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 6213 0 obj [ 6208 0 R 6209 0 R ] endobj 6210 0 obj << /Length 6211 0 R /Filter /FlateDecode >> stream xœí]Ënä¸Ý×Wh`ªERO `»íYh´,Y=™ƒéAœYä÷£*Ie›ªC‰§.©‡ÕF·ÝE‹"ï›—÷ñéÏ_ÿ‘üë÷äÓÃ×ÿ$ߺï_é±ÌÓöOrúúáíº:v?'e•'ß¾^’—×׿ߗCûÀׇ¿6?ý/ÑÉ_š¿¿$?þ½ùð§î—N¿ðýPª²ùþëù{]ªæ§ôòýôù¿ûCòÛiÆþuÝbÞÿÿ“§¹Q§eŒ¼úåÐoS¿~ÿöÛáS ¿·”©J ¨Ìd‰ª3ü÷Ÿ‡Ÿ›ôÓ§Ç:Sª,²2½åE¥>½I•y¢t&¦Pƒ¿d¦1ynN~^¹8TÔiBçìÇ*3Ê”:ÏNˆ>!9¯*Ýü\šîÏ@«Êhºa®8é§“ªáßpÔtZ¹8Tz„ãÙ%¹¹Ö¦PC&ò z^~ræ¹ù¼rq¨ôÈų "W«´c­¼ þËì!p«Š€„s^¹4P:ÔâÉ%1›]øªù+ ,$ÛJ‡›|zªU$Ï?7+;¿°ýöüý5ÿ9ôÊ2yþ)ùcšjó§äù—ƒJEÙºùù÷Î#ª:˜cž§×‘TŸGªcÕl^¿Qp$mg«&L’>œG²cfÚãùëÈãy$?])=mIº‚³áà÷àµep¤ v gÓ5œ€hö¹Ûi‡ý7Ï(Di»•ÓÚ¼æîç¾}F÷CÖæ ¦`FÀº…R=¥_FL»êúhìUãDñ ŒÅÉ(ÊÀ­cÒe«a Þ£:Ò4ýC·½‡D9”4e¡ƒaà`Lx?xmp§ÜŸ]F5úÓÒcx×&…ë„{Sø CL-ø=÷Óµ"&¬¨ñ‹±Á” z…WðYŠHªÆ´¾F$º8ÓÈɶì^ùÔ«´ü¼–Áb®Œt[˺ȭ ÀÙÏÜÁÀ‘NÝ^›­êe€­jtÙ«4[Eãüž^y7 ÒžM£‘úå“òhQ^{¦•vÅÑœIÒÚï©C˧ÎÌVy>jcP* !‡ð'¸7–Í´}ÑÉ<ÃÛ€ tK‚±ÀgÃé–2sHÀÓ;lÂJd¬xæhCÔ ºsP>c/a*ŽeÛN'& bmM¦i|±Ë´ÐÛ.ÓBÈ´ì59j—iÛ“iÐk¼Ë´%ÐÛ.Ó‚È4sK¤ãÖhls2°Óvžå™ò–˜Ã•Æá=8ÛÖhLö†–(^¦Ç{ˆ ŒD8Œ1oóú–H¯•JÌ›PÛïÒaƒÒaþøš…K‡\é÷o jËŒ”ÜÈ‹ò=⮤&S%Ôˆj©z­èQsÁ‘!LT}ÀÙ·Tî0Î%ê%9àF¤tÓbW†;LûgjU‰$³3%E©ä b&ú‚#Õ 1¨pÙÔ”u:-NH|#B~3ˆ91­¯0udêÆ÷N}.êËDÓy56ŠbR_^Ŧ>âÐE¥å2°ŒrSl½Ögž[LjÈ ´8ð­û+C(b9!Ò=e¥Ê×@#!Ü(qàk²Q1øjc4’›È4"+}SN—¥^ |·(§ËZ­^NWj9§Î-ÊéJ×£42¯œqYÖ—<úîØ{­Kv?Fê£1ôšaÏž~z-ÎÈÅêýÜ„»Óátþ8…~7_çY´D¾\63b'0umÀà–pô{Ž”­XI<^Áì­rü´9‡­×ÒS¦ S^7V(Ü2ÆÁïa+U/¹¦ùR¤kŽÙ;SVt$“J\B3å©-ž˜î‘Š÷û܇ccB´ ÃÉàÇm³PµÖEa«Ö8•Ê÷ÊüsVæÇ±&Í-¡ZòÌ£]Õi`y1AAJóGqÑÕyñ~¥^—û{%~.ó'f%þº¼TñÆ.汑8+­/™.D±£Ö0wÀ´HèlJ·–ŸÆÔFYr†ò´äÌ…ñÏj+â鯲^‡ÎЩYN†ƒN«K†ƒìé•iº`Ï·ã^…qG‹\™FJ uÅÊ\;L¿±(Óõ _øRÞ-Le!iû¹fRÈ·²y&aÛµúÄ$`9A\˜ÌŸóµŸfž–¶^ÛØm ãós\X2½vçò2­|ßFú”Dºç¥Œ2æÅ˜k<âH˜{ %æ¢6u#'Ûdv|‘TK¬èˆîÖ²± Ô+üo1[5¬j`f«ØUÝ™ÅËÖ*»¨!|!AÄÓ;Ü[Ø1 TÜþ:_„C×áVÇ#§8B\¶ÙÔîßánI±;Â)Gx w÷ˆÓVÕýý¨ÆuÆTð°§#Ýs «¯é…[<ÔŠÃ5¾à6|Aªœ†<ÀªÂö]Ì–¤ê0z™À ææÁƒUe W®"䊇ÿŠþžÿÐ0O²áíržG‚ÕLZŒCšÏ}ýÀ™Ëè ù3Ãíx„ðé0 KtÏa!Ì„¾2þÿ°äæ¬+«ËÚæn¦´)üL@wDyÙD*O2•ÞbG½ÃNûÉ$´ªéh5¥¶ÐŠ= ¦aãglÂlw †;8-伎òx‚ÍI›To?øõð5N/²(ûj'H¥Ýe’—éÚxE)uÕÞü0ls•Š»ø _¼yã·šHÄÍ~?äUj1–¿aw^ÙfYäô•YäZ¡rk×km¦k2¼|Ú#åÖÛòüÕ"Çüùn;²‰²éÄïdS•«¹eÓi –êK©ªU_5dÛX<“]^ùÔ“d{œ‹®ŒtøÈÚ>ýàÙÏÜ+¨álU/Z{Ã7e/í»t<âxOz¨Ö3_[u«ÂUÑòëÆBF´&VðGÆVÁuRõÝ!qX_ta#Y/4M§hlàãÇ{°!&k*Lo§à@Ø ÁBKnó²Y$,oÇÂÕ*ˆ Rǃ5—Ä Yé¨w7½*ºå§Îzò˜ð7&÷M–‰…Ë>GâÌ• [¯²D»LŠÊVÙ j¥Ü¹¦»iª0 qiéS韡.ŒÛ±ÚQA³Æº×7ªIÙ®zÓå‰Ã _2gJtp Ô¥„ž0ŠC92É ì/¥ÓÛmQ} hÇÆDù@i ÅrG\UYÚ·›Üót¶¦¤TÏëH%D«&b"ÖÐN§c“(] OUu:ÚÆ š8¶§¯âÞw8ï€ÈÀ]½¨†DGÅòâ`¸ÎÞóKðN’ŽúQV8u&ST©qôÈ»‡á\™ñ}cšÇðíè€<{¼Ü#2ÚNál1ú N £o¡V¸>Ö îû!䳦ßéB¤H®n  jdÁ=[Y1¶˜>¯¸03|&ª|)o¡ ƒ»±ÆÜCUG\ÏÈ´È&øÆ'¨#ºŸpR VQbÉ×y'Ò‚sU™"Ùc<>.ê²_ ,ÂÄŒ0ö4u†$ì Ê>ÚOËgz)U™^VùkÏ@Ûmþsž†«6YDJ2}“Ò,øÖ<‹L¿7„Åvê6%”Ÿ,øDŠy+*•f1´Œñˆ©O–þ±TÃkËTDlÕ:2¶œŠm£H>@Š’Äz(Œc«R½·Gc(â•F¼¡ªÌ-Ô£Å8`äŒ^U—žä07 ¶—¹r Õ`‚›D±&GlèåºOˆ6î³èîÕ¢mŸ©R.L–Љ‹°©£ŽÒJLå‹Á’°wt:‹gd×± %¡¼ ZBÝ¡sžÔ‡LÛ:qÐGTðwh”A§ü®Óc¹¨ÖÇJQJ6S›èMø.–©"ÊGÏd²¨m&Ü£U½¢U#^SÔ¦^Ñz9ŒTN¬ïìEƒÎ0 pÃu) GÓ"&hG:¯è벌LåKl4˜ÆVØX×Å8oÍØ·Æœò#üØ|%/ ZœXû2ö ì‘êjõ½F_7‚°Ya¢­Ê×LˆvÝå}Ý ú¨ÛŠ/j.†#]>ƒ²* ËŸÑ{ÌX¤Íµµ=u;E>Wg¯KJábU·õÁ;‚ÆŽìHº² …gƒÏtG åµõ7|Y‚;ýܬ¸G4†Ý£? àÙ0 ˜;& U;L%йÂŽÀ÷tžkÏ``,`ʪ,6p”Í1Ž}õõ(“,`ð3÷Ýê »ÁkëB©® ˆA ?ŠxÄb(5ÞžhYž-Ssìäý4æÕù[wšoLë%_ÿ)5Û endstream endobj 6211 0 obj 4342 endobj 6215 0 obj [362 /XYZ 37.5000000 386.750000 0] endobj 6216 0 obj [362 /XYZ 38.2500000 708.500000 0] endobj 6217 0 obj [362 /XYZ 38.2500000 440.750000 0] endobj 6218 0 obj [362 /XYZ 38.2500000 708.500000 0] endobj 6219 0 obj [362 /XYZ 37.5000000 424.250000 0] endobj 6220 0 obj [362 /XYZ 37.5000000 424.250000 0] endobj 6221 0 obj [362 /XYZ 38.2500000 440.750000 0] endobj 6222 0 obj [362 /XYZ 37.5000000 386.750000 0] endobj 6223 0 obj << /Type /Annot /Subtype /Link /Rect [329.250000 448.250000 369.750000 455 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 6224 0 obj << /Type /Annot /Subtype /Link /Rect [106.500000 395 171.750000 401.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 6214 0 obj << /Type /Page /Parent 2 0 R /Contents 6225 0 R /Resources 6227 0 R /Annots 6228 0 R /MediaBox [0 0 595 842] >> endobj 6227 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6228 0 obj [ 6223 0 R 6224 0 R ] endobj 6225 0 obj << /Length 6226 0 R /Filter /FlateDecode >> stream xœí]IÛȾëWðÀ2káÜv;@ ÈaCàÉ$Ì Ò™Cþ~(‘”ZE~EÖ§WEJ­1b;]f-o«Wo}ÿç¯ÿÈþõ{öþã×ÿdßû??~ÝåûªÈ»ÿ²Ã¯w¯ ë}ÿ÷¬ª‹ìû¯»—ìe÷e÷¥ýýe×}ðõã_Û¿ý/ÓÙ_Úÿýœýð÷ö‡?öÿèð~ÝUªjÿüåøgS©öoùéÏÃÏÿ½ûÛ²ß3Ëõ›¹üÿïL¡Š\¶1³ôËn8¦:þúýûo»÷ÂV©r“ç6SÖ´¿5Vgÿýçî§vaú|ßX¥ªÒVù5 Uº]I7y™©ö÷L«ñBÇ_2Ó+ùÉM „h“w;‡Š2¥òÏ.ˆ\cò¢ÐaUyøŸ¦1yYFœü¸sq¨ôÈõ̾¯­Q¦Ò…= ú€ä¢®uû÷Êôÿ]w®êÄEn~5}„É벎7ùqçâPŽgäf«Jݨ%q½š>Â亱ñ&?î\*=r=³K"ר2&rÏÓG˜ÜVñ8·Ûy4äâÙ%‘[˜¼²@tž>Âä¥5ñ&?î\*rñì’È-›2&rÏÓG˜¼Î›ˆ”Ó”‘‹g¬dÙºÝÀhM%Ãì1PÒñ”ênçÒ@ÐíNþ%d¼“î'àMÿâùðéÛîýgeU Ê2ûöS»·ãšÝßZÙ»ÃC^ÕÙ·³?æ¹ùô§ìÛÏ»çoíÖ£¯Z”ýªª>®ÚìK] €éFòg8ò ¨~ƒ×1á;ÐMø”…#ƒá똧„nÿœ=7É1|15±Ž(U`º4p6ƒ±Õ$ÄVûú‘– XÒæÇ%•m°}8.i÷ÖtFÖ3›Õh¤'ÿ‰£Ž#õùŸvYïë&?ùL9ÁÓ÷œ?5›†#Oî–à?Å «î\Êì®UûÑ‚ö¤Z ŸŒ˜%h¹•J^;À'ų1'…³yŒñƒwP;„¡ H#A]žz±´Ž wb²Æ|Û(µ/lYWÅ•$ YaYãó|^ŽuL³Üd¥€goêc¬ 9âÕêåîårêˆ1ÿLȘøkw'Tþ)A ö€ò|ƒ™~c Ál#¡È\#øAjõÈB~Œc°áÁ:– ˜cñMA8Y9ã¹™;ñÍñ ç€=dó}Y©KŠìð¤Š}Þ˜KJÞ©ÊJC‘4c̯XíðÈä ïS¸0³c5ûª,–^ k^Ÿê`ÞqîOLõ\LìaiÌ…ãÙ\'D‡K¥Ý&—­ÿ’[?cI“耳×d[RY§†öÃB°„…`¼YˆEù‰HÇÚX——_˜Ô‘$=Ô›ê6/˜å ¿ÇfÍ+kA¸ ¡ø}ìßäþؘE¼R¶èÆ!øÊcùÀ³á½€d}-Œ+ÑÅ#ÇèzÎÆíñ=cœõ0ŠèÔï-Á«®®ágÑ œÈW šy4BE7;ˆ HFl.ùzÞ3ËÃß”Xôa©fÒÒÖy¦´HuN•ï;ßÚh3#=›{í:äðlžo>ÀàÙ8[=ÙÎ;z-µîúcñˆgŽZ˽9bûõ7xרrÀüyúÄ}ÎzþŸÚ†p#ö¦ÄÂmgdw{Ža3ŸÈé#µ›½qÝàx„Ьu3Þ&X)™Û!Q¸cÖOPÍÇ.æiÏALE5±w ¢eµu/6Æê(‚R6 {»Þêm2¨”°ÜkV05‹z)³ÒêѤùpëò!±’5v0Wœ®VFÛ– J1˜ 3µÙ·ó(–Õ—û…óç°Û‡—hìó&1L쾬9C6ÐCt=-Á®¶—K^i}I*·~@S9 2Ÿ{zïÌ«ã†Uí€<õðp冹½Å¼äkëÀâ&‘6 P‚ØÁ~Ÿõ³¢ÂÔ ¦.='`ú¾hˆ1§ÒA˜å0?A–«Ðˆ†ß`¦§ òÀo4.%C”…a„˜œ@Z€á¢šÅpÊ¢B¦*/YO¨t.ç„ñ€iÓ/C‹Ÿ”)Q„O Jåð<½µï: U4Å<•&,nf¹•g ŠFòì —å‚#‚#^3poxÛ„t UBž)ôü¹áN±ìÂRÚƒ-ÌøöO$‹·QÜÏVj^‡Â°ÂGÜuž;•¹‡ñ­.*_SBoñáÀs8fFʤ¤'~µ–„‡ïy–^Ê&5½`Ö’ïÃSß`/ð–ouüúÃú q Z|oÙ„y'AÙ€\;·×MEÚ3) ½²¢è¦ª,0©L߀’›Ë 0R%í°6È}"ëØ£OÉv[X_&-J`{-cÔ¨A¶Z&œÔráTçÆN«W&ˆÒã$à;ª1  8BBº—g-ljõú¿ì¾ÆBB»ƒ¾bÚ‚ƒ^žë×]£FÕ¨à°Ë…"U•뎌.ŒõZ¦ÃfA,He{­ÿöZÞØRX’¨†œ¬*ù-i’!LˆŠß•ôÕ{‘-ö‘ìí?'ïâW¶mìiÉ W¶í¥Ö&+Û׌_3°~­§mG”ÕÞù2U¥Ãà îí\üЭ kàl9ü†© ‹O*»Q£j] …¦V—äŠîXž’p6Ï7à7s¡a³5ð›Á3ª`ÉñIñ:PÏÄëxî‘=ééŽË—ìM=£u ø>¹îÇ{SPŠã½Å'ñ¾)ý™Æ=úp/¨ì°Ñ«àŽáᡉ'¸·'wèîéU®<ÔݶÙ9æl®Tá2PÂ}IEKŠ÷€Â ¼Î$/[SÌÓ ’Ñ׈W‡pë¸å~Y™Ö)êEé®3ø+Π2p¬Ž\ ²¢p} OdÎÝf²;qÜ ŽÄ˜Ë“*ø\É'Ûq%À !ÛQk¶ËuJ×™­eáêÙ"5½ êq•0”¨£Ÿª¸~†ú~à‘€ö„/(™O•1ÖEF×/%:Ù9V­t¯aƒq¸&aЏ<®îU¯îƸW7Õƒƒ‘k›ìIÙT#UU¶M®ìM#Q€–2º‹®3Ò/dCLðl²|ÖïÓ³Ál³›ŽBÙd¯ Æ[ë‰m"‚Pñ7 ¯¯°ö$°áÙÓu(ÑÉ]¶‹Ù¦:UnˆQñmXkgbˆ^ê8:¹.×.M,Ì–UG0Z-ö0ÑPLñ‘Á/nÙ–-K£ˆ<âQ÷ÁqƘ×?ˆxXÈÄ+Xº2 ÊG€ÌÔ_{ÎZ»Mmx؂í÷®{„¼›$š"\Ñw&zø„Íï7|ﺰ{ôNiä:ÐQ=뎞r¼ÏY Ãγ•p˜„œ7.%o?a †‰ªÝXu¶n‰V» KQ½…1 QÇHÔ¢]8t€é¿Ëxe$Z~y&êĺ&½Œ ²grD‹T‡¹È-ÎF¹Ldöh'[  Ù$f‚˜Wk+L%@ò)˜1³Œrî¹ dዚž0®®zAÙÑÖœº–'QI)¢`³Ã1J7›`mcL˜z°‹Ç’ÎÌØ¡ìÁ¦Yì1aD$*Jßë•¿Ñ™˜Ò"£» ëY ^ÜËŸr… ê[Q};ƺïEÑh¦¯ùÛ©”JmÞ°.üv¢׉ÌWºn\Çñ}D»O G¢ü8SŽWã‘­î‹Ûɹ2[L?滨q6#ëéÑŸC/¯ôºLÂê×Vz”Þ]µÌT7Ù“©Šºå“ž<!TE„HcÚ±xsáÎA'MØÓjeç!ÃÖqþÚÜHšÓ:Ëö,óp>÷[SB‚ª˜o¢ëŽÕ§î½wÉ §n·r]Äg¼²æTØ[8qœOH z’1€±µš‰Ýž/…²l¬ýÞ¿[ߤ“¦j.·¾IýÐàžrDâß6´3ÓÔ—Œ4uÛÂ3xR!1¶ †=¸O×ÄZuUÇSÑ_-pÚŒ5Wõ5M+•¯·­k˜¶ì')ú:Îhg…r–œ .Ül¬ÿý¸—™2™„NéѽDÃ5Vsn á)U˜¥HV¦ž;ïÂô¥XÓÈ]”æ’,ïÆèˆÜ²êó–Ûšápóâd¢X¸B 3Í3ê%>)¹Mœz*«0õ`0@‰ä9)®.ƒ×Á'ÅøÁ¼Íœ”àzªÂ¸Nš¶¨CöÖÒe~rÜcájÀOpÙÛÄÓ~5‘$}Œí'•ñê2²’KVÞnÆŒ·I|Œ¼%ùt/Ä7ú–ÕÉ ]òLÂeªt´;I¹©ŠwTPÅ~‰ßC²™Ä Ñ6T¨½G”’”­‡¶Fý°hjãP8þ,foÚ†ó>ª*R) Î+wÍÕ#”btC]3PÔ„“´©Ì§€ªÿsÂ<®)méjk¼Z‘¡Êá™ì2qWß4V‡c9 ¾™lósÌÊ2!…£€ ¢ UE#nD+¥>ÇíÁÄTÄ‹’CWÊ4ÊåÞ‡² ÕèÅr.$–…)60÷8œ_››Ú½šp8é-' Æ,CÐ åå÷¦hzU9$ Þ¬*,R•¹¸-cïbŠ c¥r{M»SÆUUzH$ðH Ìý8Xz²qp<–žHlÛ†ß`?´G2‰J@9i¶Ãö”°°ñ¸ƒª¬æiñ–o¯ ¯ÚM«}Ñ}@ØçøvÒÕ×M™¦QÕCê̺rlÆ—WŸK°™Øê&\þö ;ÁDRrúȺ@ù7èóƒžTÙ-Øîòº'\^¸€$“ „Igd‘Ä §|"ÔÍPÄÚIŒ¬ŸvpO„ KnË!÷ë§Q¬Tµ"qËTå‘!p*!!чyzdæÙðX¢òÑM§Ó$¹]5$6®»â›eýÔ ÈÎÇÈcDþv]=4:eêFc†$¸-K»õ'6@Ë‘ÇÈJ»kAÚ_ÙK+ ½’òËÜ?X`e®'»¨*³ÏÕÁUžéÁ*“ÏõD¬&̈îô¸;`퉾}ܧÞ÷®ú‘\ÆÁ|ë˜9CÜÔÞ>÷'EѸܡ=o)‡›UýÑGìE8t÷NCáÙà7½EXý•σ%¸ÃßóS>¸Æ°{'<&Þ㄃?¦`‡¡ a‡©¤làÙ\§šúÃcSVí°‡ \Žñœk0P&1XÀàožúÝÌÝxï­7¥L ˆA ?OÛVìƒÂ ÆÍ„_™Xž­r³ïåý2æÕÉ_ß|s·^öe÷ù › endstream endobj 6226 0 obj 4382 endobj 6230 0 obj [363 /XYZ 38.2500000 187.250000 0] endobj 6231 0 obj [363 /XYZ 31.5000000 704 0] endobj 6232 0 obj [363 /XYZ 38.2500000 734 0] endobj 6233 0 obj [363 /XYZ 38.2500000 627.500000 0] endobj 6234 0 obj [363 /XYZ 32.2500000 703.250000 0] endobj 6235 0 obj [363 /XYZ 38.2500000 627.500000 0] endobj 6236 0 obj [363 /XYZ 38.2500000 187.250000 0] endobj 6237 0 obj [363 /XYZ 38.2500000 734 0] endobj 6238 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 711.500000 137.250000 718.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_ref_unref >> endobj 6239 0 obj << /Type /Annot /Subtype /Link /Rect [183.750000 635 219.750000 641.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_types >> endobj 6240 0 obj << /Type /Annot /Subtype /Link /Rect [60 605 98.2500000 611.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 6241 0 obj << /Type /Annot /Subtype /Link /Rect [111.750000 605 156.750000 611.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 6229 0 obj << /Type /Page /Parent 2 0 R /Contents 6242 0 R /Resources 6244 0 R /Annots 6245 0 R /MediaBox [0 0 595 842] >> endobj 6244 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6245 0 obj [ 6238 0 R 6239 0 R 6240 0 R 6241 0 R ] endobj 6242 0 obj << /Length 6243 0 R /Filter /FlateDecode >> stream xœí]I¯ÛȾëWè`4ì…MxyCÃrr¼Òǧ׮ݿnZx•£gŸþʬ®,Þ”eºÅO;—Š2íª¡Åc»½Vw ++y˜]VO€²p6áâÇK¥Ç6^üP»þü|t}|®jŽŒEÕû+\¥±JUGúº…}u°³Öôˆi©S5—å,^VéXH·sq¨ T…W—D®ÓU £S ÷¼| ø7¶I·øiçâP‹WO,!\azŒè–ûˆƒí²|œ8Sèt‹Ÿv.•áÕS#ÜT6xY=J¬K§ot;O¤âÅScÛUƒ4U6Ð.Ë'X¼ª]ºÅO;‡Ê€ïÑêŸcVÁ[é>fê÷Àï¿î~üÔŠG·ÿú÷vg§v?¾þº³í?ŽöU]í¿þ´ÿm»Ÿw¿ÛýygÖt¶ûñ{§+ºFWŠèŠQ§+õå«®ûàP7…Ó嫯ª]ÁË®öÞ0üjñrºRŒ®ÕÜWp5ü¼YK¼º…W ˆñj ïÚø€}€ï­ý¯Ž> ÞO7ìñ›c²ƒ8à‹ 2ÕÅÊVÈUeðô”è«Í2ä`à=x5bo"–=®øü¸·Éàç ƒa îmLLÝ"/_[ u›pQVH¾´V·'`:ÎÜNÛ{ƒ%ƒ®ô4|ížðÊ ¼¢á¼7ø¯(tÅÀ75V )Hâ—ò1‚Ï >ÓøäŽx<&pÈù°®aM¼2Þ|/ÕáL™áÏà‰1 œ‘CóšYœ¦e•õ UÁ£¸RI2|‚¬ƒÙõ’ ¢¶Õl #X¤ˆÍ($ÕÇ N‘†Mkþ½…¡è°rål•ŠQu0·}çñ¬ôËrA¼%û’ƒœ4²hÙÉ”\f®ôÇà=ê&ø¬7˜ù=YéÀJãpšëÊ;â¨ñðéMºpϮݯΦ¼š(ŸàÞ ~І€mSV Ñ*)]ïUsAkwbЪ´êÀ®ŠC'*G2ýÊ•žÕ•íËW¼Zàžwèmáj \­Äi¥<;§ÛR‡¢13¯žÓru0#MC´{Ž;¥=MßÃ<§Þ§ôßç„(Æ„A`µ÷pѼë^EŠƒÛ Ü~¸kU¢+ÖÁÕ0D!Üð›ª&µÝ…'JešëA5úV;öõÕ(ò¢æ½ššÿj•ö^ívô…ÕlÛôêþŒ+²ÎÐ@ì‡qÔâ{°›4"ì€_}´ŽugS±¸kìþµ:Þ<ƒkÊëwfÝyQãóÒ¥Ô({Š€î[á߯?øe÷%{ ô¸ï(&wèÆúÏŒpóEà{p±Û¸ÄÉbÎO >É„æ‡!µÄ¢ët·ËQùvEýZ¶äû‰‰C(19 ŒÏ2pὋ `lB4€uü Py˜HÐ$Sèü^´«àJ´(}yº˜®' ºÞã!â~Ñöè”ê w ³}:Ÿk뙜Ñ•bp#¸‘aéà= ºG÷;°‡‘û]9{€Ç 6ŸªMíí gÄמƒaŸƒßg0ü£žwÝsñk÷¸¯4ñøœW°PÀ7ÅÐÅOà9ý®Ý…ÎÞÇC?°'Q¨ ™+{øĔ±<‰ÿ„¬ÇV#Þƒ)ÂãŠ9ŽC4êÜa\õ;Hï"ÓF„¼”M‘+§šÎ8ý—°ƒc´ËˆÜ£õ™õLNUÀüÀÆ4¦œ…m?¸šùˆ(†1T#RÉËc@F*¶ z4ö粪7å( € §ic¬c¿fj™ÌQü¦ ¸[ʤÔÂyRLVÄpáLîýÉô´kÙÝ :d ø4ûÕ#üR1Ö5áP¤Ž{&§“,ߤ˜!fží‡á"àbð`± Ý6‹ÁÄ:í|í“*€‘P>ï©kÊ4àÚøÆ™e¬2Æèñ&mÍkæD ×`m]Ÿ¦”5¬0øÁÊ[ô’ÅÏ¥ç1YNSR.ƒªTib¾‰L•抰ÄŸà« «7RUi<¬2eY-"Àö ×˦xìòõÕØ¼‰iÀœ j_ÔsRÓ¶±Âa(D¼}ÜF•ãÔqècWz¸4g¢-(Æ‚òJÅcªì˜”&-S1†ôª`õS¸©ïI(µœj|]„qÎù2›aA¼áVLÖP.9-“ö7Ÿ#Œ@ÊÌÑ•ÈUdÌOF¢Ø²èùÑxÁÊõ$éZq¡³K‰¯0*DÚžX¹bÅO™(hÉ)£}¡(ª¶n+àθD+»‰ßdòÛ2!?ª£Ðòq×úã*LWëËBÊæ^Þ´71 É0,˜Œ"&–X#Ì’)•²è¯rþ¹”ÍÁ"\‘TæØšsB$¬D)„ý7J’,H J/S”ƒÍ¡á}‚tÝ« WšÍ½aȵî]pµ€ƒ¶Ÿ+Zl]Ùø÷1ï ¾!ÜúÄxwÐ]«’WWpž Þõ{7¢=éa­"àDŠºž›¼ûž¶Ö£~aµT¶G²HoÊÇMD~J8JÂ1w $5+ÿ(˺€§ƒô²•æ2íZ2µé Ø£SÁ¸ÝeÍä-å¬2DÁ´(·.#æ˜Ä—'øáˆÄP¢úv0IÑÀÓ¤Û$eF¯ö“µ=¥JÔ1'äãucÒ§G¼/›·Z4D·¬û-Ð Z)Wûçw†c½qa÷WÜK60bª—lÊ ¡î[ªÌ±D©¬‡Åã 2½Ã–ªÂÉF2úLw–s(¬±0ݵ˜LÉåGc­Ïíóô¤à¯ çìˆæ\§æÁD*$õ#¾Í° Æö~´‚»”;SùÂ}¬©3V˜H®@„C(…Æå— È&] £ZËùhCnjfŒW¬HRÊM®ŽW"-î͈Šànª&ÔÐÀ•ÑžÉÆ^Œu“­Ð-WïM'>öé×ÒðùæF#e DzBj¶„°aɉnÚ2j~°h-#£óGŒI•Ë1›rmY;@ádU[ª È¥0®×Ó”Ò%ÞÏìyE5Ë÷Ë@@E+çäOA_ŒOÑòð˜E«,LTªù”²Šl¡J»ˆqU™SøÒR«®ØÊVîíNã"Ÿ/ðJ¥—ƒ×"¹%\ Grá•ÀsÞg„|S¾=7QqjÛ` b8€{±4Ó9ö¯˜Â¾2kŠÜãçhL=bnü°2f° pHóžòB¯&ú¦f¸/õ-¸¯è+éT®¨Þ2©ÔZÜýM9“ø*V®ž 1.K¦‘¯lJh)0Õ£<˜\|Ðè{…ekƒEÆz¬`øÕò^O oƤK.e½¨6ž”´Œ³™3€álp&ÛD >ǾäÓÅœËm£j¨¥aVak^Q8¯ZôM±î޵íuXð®jnÑÃ!|Ø‚–I £?‡ðÄÓX&Cc9-:×Ôoõœ,O­Ô F ¶…‰J …9¦+|áébN¾gœpyÙ‚w½r.]7M}Û¤K¼kŒ­Œ\­*wV®V«2y9…O'ä6ØóŒïéRB´øäPI(¶¹É—¿M=>×sö#6V“imÚø]m†{Ëkq«æ„ŒåroœÆÖ–¨G¡¦…ùÆöÚåD]Îà«‹sÜÅn“*rJ7x”²JºÎ}Ö3ɉåóžÒ€£[GC,¬ç7çPÏÓ6à$Õò<`yZÎ)Ã=øÛädØDÖPSŸM ÙQÉûw÷Ž©ÔMÃ’¹Dõ¨dæ4åjM¾|/µÇÍó‰ÈŠ jl"Òçj¹…Sùðñ!’’d…ᶦ Â<\‰ï™¬J+š‡FóA‰m&¬b›ŸÑ—Ú×Tü,eµnßÓì)Ü©5W×PW\õ%T&"X‚lÇcY9óT¹æ3U&­hˆ‘t …ÇšˆÌÌ ŠG³s\Ÿbµ©)7 *}¢s©<Á‡U8*K}ôJÌ0·Qå0Ñ&= ªd;â¦åbã "¦&žèoÏL ÊtL¨ÿwUÁ>‡Ú¶Ù|šÊu¾rMœÞ–ü{ÛÐð|j2–u¸¢òÔf)Ó–¡0á³G7ï§1¬Šúí9‰Úé6_BTD£ Cnð&Šî36§pJ߈͕zŽC§¯À<‰I pÏì-@åL æVDÂqVе7>¬øJ.<bà‘/8Ó?!˜dºMkQø¹ÓRØ<|Õ7œÍ5_y¾ >L噸PŸÀ”‡–ë[ZŠÝ›Ö&\ÌøÔÍhºÔÅ-%_k¾° *rì‚âØYiYßÒŽîyå¡ôò5—Ó/®å?·ËiÏh«n9›+ÖWPÚKkcJ•/»È*…]"Z^üÊF‹˜F¦?N1çÉçõóÛ<\õ¦Ì•\…õ3ƒ±…)®8Dƃ†ô‚Oí“1·ÍFTzÒÁ*è@¶ ˜,˜(Á1f$P%Æ™’ËWÂÅ¢sþð{EäÂ3Ù€âÔä´‰ÕâœÄ);Ü€Á-3ÒbùÚ3ŒÙ p¦¦)âLä*üšÍŒ¥À­¬†0ÀÀŸ?lw2=­qb»Ñõ¯„5î'…-™²(È–Þ[S™æ JO™ÇùcDeÊ!}A´œ!µØ–¥\øªm !ÐG• ²#}ñjøe›GÞg$0æOê¹E_^‡¢¸OòªÑ¦ñmµM©%óNz;<{­ˆ½È,ÂÂHÆtŠ9N²¢§}]3ðL.¦Ö ¦h*ƒW¬´ÓhŽèèác]æâÚ |))f/¦ònç7Ä‚xƬ›jy#:40¤¿OD¾„š'+|÷+jô !5F~s¢a3æ–iQáðËYoÏýˆ½á‰+L7`áâ¸gpõ¥iöÜ[xyêÃϕ¡3¶K°¶Ì yœê!|î™4¬ÅSÑl†ó8¡üeRÿHÙ®ÛŒ•™Ö5“ÙGöÐÊ ÐùËSnqÑ~æknNÊ„-0D#²5¨žsLjÉã¶©¼›æ¶©=ùÃ8On•Ìã¨çAr àNt¼ÓÆ1&VHx×[bz'ö‹úß)ÜŽh–!ª'>\„ñú9,3¿c©¡&”rÈ '"åƒq“.Þ-ŠÓ”AëÚ·¦î$mfù,…MÚ?¹²¶Í?EÂõÔƒ AKQ(‘+Åøjp¦`õäûdðd©¡Ê/¢5Yž+ ˆ “-˜¦J­c]'2F—' .sϬW3‹z〠à ¨Ø/ß' åñ7B 5ª(Bka²¼ˆ¤®»÷Òåj¦/7»¬ÞÙì˜ k×1áò\AÿiÀCç mæÊ•„åAÿIÔ=ç4èž¾A+Ì;âyuÏ¥þɨնk;pðJG‹î`NˆŸ†+WÏ)ÐÞð›öÒåÊ=}Ï”+pë®×žƒ±-6ŒxJ­kÎcóR(Çݵ÷xö5nÑhvà =ÀcSíà“æ(6¤˜,Ë€|Ì•{Ìä­26Úü Nª„5ó )fJ^ xÊ6”1ˆ8A˜$VÑÁ”²S˜4I‘(C†Èä˜aêÄ`H|܉bBʇÆd¹lrú½etŒÏ) &klz&Žºâv‰c¯ÖsÕú…ñÙÒ8²H ©´4Œ0ÌR$¹¥ŒŽŽÌ Ç›¶›XÕ–*>}¯‰|¯LŽ Õ¾—H &#çDÜRÍ·ˆ²ô@.âüÂ4ÙÜq,re¯g+Hvªš|é (å)Ýe…ó µ­&‰d„H]jT÷ ¬F%R¨dÅ•a±_p¤Úa½;MV“_‹R™3ðãr˜ Ô‡Ty(üèc^.ïFZŒ-Òýˆ¬Tc ¢ŒH$ázÓºKT˜`…†¬™¸©ä‘6Õ7$ú¦lªGiÓ%3I: I™Í˜á`&/*L¶uêòhTØ¥ApLægj{±&Î$J‹ZLŒú!\6À`AB,ï}JÙJ›ýÕT•'®˜iË“iYq‰a¸¹ÊÔÞ’ú³JëKv¢¹Û Jëž>¯\J¹ð Žûôäì*×þï홊ËKÅ•0›#F:fŒï™¾wØÂÙÁ«_ǰÓJ—“ØÚæHßM‹ù8*Ï5:xk§GµlóÊã Eî;ˆOÓu" ŒOÆ«a®ŠyÍv<­œYÍIò Žo¨Sy&.Ô—7¦ת~ Â%#Á ;w"70®”ž]û˜»Óþc‰= ãˆv®”í$AÊkÎD´ódZÜÐË*-+1ýLÄË}ª•OµÁUG_ÓJsÌÔæ0ÉÜÜ´lÆ•>á¬Seqý`ÜûWYJ/¦s¥•-к.Fˆ_¾e®ùØ›&äÔï%ÛÜ"EÖÛ#¡tñÜ´Me†=«)¥ª)3)§,ð´zÛà{3õ[º‰²Œ.O8¢ÉÂçÆ:Aë0sØ;ikRça„Qä²µ„˜/R¨¨–Þ“û´kžÇrUÇÒÔ¥‡‘ÔÍÖß{)éP¡Ê£€@»Ù^Ý£Ä;ü`¬Ö2ÝéMG´ú‹Qú³5õÚ’¡@b:Á¯¯)kzÓ^q„1îl¿¥±AMµâ»w,e“uÙ™š |…ØÆéjB©)tY_—]/ãL«Õ«ö=P¬3H¢ £çk»ëãøÙ³5ˆA/Ô¬‰>«VÃO€lý1S8‰ 1T2ƒçåT«ñ©võþx2]}8îá×ó¿›C]{çŽ?*¥ºO+µwå¡c ÅðÉ·³¥]×êü-ófóúí÷ûWÇÛöÞÝÎùÏh?iïy»“ã·ê7«ÔoŸñÏÝûß$‹ýuܬ2ì³#TIçœñu º¦ôöy¯^ª¼œ¨ËŽhu/Ó»‹9 $°Ð3uåtÚ¿ûï-µÃç©/Ì8-õUh«ÅêÈ/÷ú|\Šv«+ëÉú »q9£ïÆWú(£>¸Ñ|5¹+Ï1Sšãµ½}êß9P0µÚË– ¸Ùa¸Ïèû3ÓѰîuå5^ ÞÓÓ¾ŠzõêB¶,Áow< Ãî%ž0Ù`°¼»ÏǾܦä ábx÷Œg>Æ=¾šÊ°”¢,H?½èeÕÞÑ œÌ)"Œ;ç²hÏÑÃd®çìUC{Û–d2bdq2¡4ǘL9F½ Gø>Ø^Ç)Y®XæÐKÔyì±/àºvE½Ö-¦ôŠýçÝÿÓ*-Ø endstream endobj 6243 0 obj 6006 endobj 6247 0 obj [364 /XYZ 37.5000000 728.750000 0] endobj 6248 0 obj [364 /XYZ 37.5000000 728.750000 0] endobj 6249 0 obj << /Type /Annot /Subtype /Link /Rect [226.500000 69.5000000 252.750000 76.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 >> endobj 6250 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 737 176.250000 743.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/3/extending/newtypes.html) >> >> endobj 6246 0 obj << /Type /Page /Parent 2 0 R /Contents 6251 0 R /Resources 6253 0 R /Annots 6254 0 R /MediaBox [0 0 595 842] >> endobj 6253 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6254 0 obj [ 6249 0 R 6250 0 R ] endobj 6251 0 obj << /Length 6252 0 R /Filter /FlateDecode >> stream xœí]I㸾ûWø`<â"‘‚½M€4º‚‚Ά`&H'‡üýȶ\eQúhñÓ#-»4¤ªD‰ëãÛ—ûåÏû¿ÿwÿã‡/ÿÞë~ø²«®®Îÿíÿ~¸~ ý¡ÿ}ï|½ÿöËîûþûîóîs÷ÿßwç¾|ø}÷Ûÿözÿ»îÿÜÿñOÝÿô/_øeç”ë~þ|úÙ:ÕýV½ü<>ÿÇî¿ÚÿëØãe¸~2ÿ0µ±Ö§qcèï»Ë2Õéß¿ýk÷ãyÒFqUã½ß+kì^µVïÿó×Ýߺ.ÝW‡Ö*åëª%©î‡«œnº>”oöªtú'ÕŽÞ­Ò{?Í]~cŒn㽋°ml¿Em•å^úÏÑ{S›œàsœ»üÆôŒ{=`WÕç-ÒÚçØ¤—þ³AkrÞàÓÜå7¦?`ÜûÁ[£ŒÓµ=öñ kïu÷»3ýK·ÍÛ¬hûµÿ ½{e²‚”·Ñ6î]òV{m³ðUÿ9z7mÆ>Ï=×GzÏ}«½µ®ß6eslÜkÿ9z¯›*cï§¹ËoLè¸÷ì‡Þ(“õÐ_ûÏÑ{ÇÆfìý4÷l‡>êýsJ/x*ç'GIQ%ÅÆŸ$¼ÖûíÕËßþà}µošã×íèñiÛ½ÑÔ¯òðùÉ·]cJµÚ{õò–ôb®ÇèÞïÿnŽŸí‡_ûUÇ8>é¾Ìäô–ôâ‡cüc÷þWqù{dËÞÝýøS»WÍþëߺ39mõùÇ×_vÝŠ~8­Óì¿þeÿëªR³ÿúÏ=XsVߣ[ªð}jé6µ­]_ã` ì­ªO-æPÛÆ»™½ùsËë+:Yv;ÁëjÐ7ÚߨóO_»;· h”U€]épúíl§y&¤aËÔ¢ßÖ6}eaK{k` žÁ;Ôbá8~£~B-ÎÍ(ØüææŽ €Â?¦#oC8²&™ès‹R—û®mêÒa”ÞÜH'øæŽ®?¼ÊÂ`$ T¸€ œ€eoÕ€·j’€ë×\_HöK/æzŒ oÕoUHÀOB~zËzñÃ1 p½"Ž/ÅGtOÍß›þ£-E²M°Á¦†è­¾%#"U®æùÜRƳýÍ©Û!]Wõ¡jÍ`["€gcóÂí…®¾¬NC^ s˜ ‹ð@k‰ð°7å³_œŽpÀ\œÑõÀˆ³šÇ tõíD Ã?á»LA>^ºëÁ›òéÔRŒöjñ ôyª:4N )šà"›Â0yx»<7ŒbÇËÀ»„w6ï H %‘9™D  ¶07MCÕ¨7 ÜBñ}-ºAº/!Qa! žRa ™#!2×}|•®¡È]Æl ƒÒ1–”Ý{†ÆH c}Yñ‰ØÈ­y"i ˜EÓxñJÍÇtE)¹ñ ÂcapØzÕk)lÛØÂgFqÉgAAó1vÄr€§¯¬:ƒž2—2^L=SÕ¡ »©ôï«ÒWÊéàH™”Ñ"•àÕcÀ¨UȯoÀx_`¼(ùÜô¾"Kq‚š‰¡< SÊôöBCä TÌîŒàodWÇœúZ‚;êŸM…Ùkâî1[dÖómÊxÖõ¤Ã5õl!’PkF6’çhf$xµv/‚ˆýÀ»!RXÔÁë‘Õ¾c;&Rø¢àoðJ7 ̓ih0v7ûX(“òˆ/”½$a÷”@‡É%>R¼¡ f(Su°ã›w2Ø©V;Å€U„TÝ]ÍÑô`jƨðz2›Û$bÄ"Ÿ¨Z¥ÒbÎ)"Û3÷—`‘0·8‚Î)m¯#躿ëq]÷Ô £ÛNO‚ºó[fЋ¹£ ëþ6ãºî©¡Ãºó[~ЋŽ‘=‚Î)ór.=œõI”Õ“‰“`¢xnó-Í VãôŽ¿Õ+ÙÌŽÍxöŒ»/>QFI¿‘Õ4ÄU† a惱­ê ¬¤¨‚ß5Eö9J†t%h—™8Ùkr%jꬔPuÛSµËƒ¦:$e|OMÎOu÷Äõ4çòä[‡››ž2½¾U»©¯‡9~Ñ?ð'štP»p˜Ú>LæøÖeú}7ÃÕi[> ”+ê³\¡šú‚¾¡«…°ŽFÂÖàß¹BÌ[„PaT_*…¸Œ‘cIpTcäŠX ëù¬E’%‚“×ì–²·”¢R: 8ã€1fÐo%‡.%Z9»ÿ@cCÊ·!)& o7)_^­²¬‚Ñ nÚ^ý)½%’Æ¡3©á M¢°fF†0yÙð¬#ñðpÔJ$ýœuäð8¶ØÜ8ªu&„d‚pVŒÍ$#±‘qPE¦RáùÞ"ãˬµ©NÖÚ4NÖÚøÀúø$t²>½e½˜ë1.NÖÚØ 'kmÌh 3r²>½å½øáù¬µUC€(¶ð˜©˜JŽ–ñÃÒ˜F0J·Jäó *)åUe¥ä6yŽA)ñëóùI$AëíŒSѨ¢R^D3—vD®è@⬠µµ> ‰ucïî±,ì›àl,âh+‘þSö6P²*AÄ8.‹QÂ,E$A\¡*$_8DzylšÌ¤‡%Ò2ÀÌ\ΑUîžTMU %=†V­¦ÌTÄOOË”øÍ::–'^V³“×¼0ÿö« _Ö»)ìw¿Áž~°²ôcÖÃ6b…Jg¾Qææ„pËC—ST«ìŒ¿Mš™P~ÂU(¢Ý“0Kóv|\Ö¡£vµ»¹%X9ùÌø1¢D‘4"—-qKÔöÔ“PÁOtŒÝ*"K Ÿß^YgÑÈêjƒÏ´¤œïÚ%¦˜:qnZúB¯`¼Y¢§ß°‰•003sc|À\3”½4î%ðã®H¥JҬ$'ÙÉ‘y0Ìýo±(oQ‚Ûêv€H1íuÛ¼¸*àÔÎDËÝ4M •ƨzºXý Ç¡’€3ÑëS~=VΡBš:BÙˤ½JÈóÊÈœpËÏ·ÌÄ´íåt›×m@vž55_I}¼¯”Þä§ÑÇSn oFù%É7´Ø-¬ ¨å+³DiOµ ´ÀŠWYÿÝX>ýu1Y¦2.D«x¯ ÎYVà%f°‚d!+¹êõEÿª[Þ Õˆ”ÇÞÐÝ ÐÝjM!”â–D ­¹¥á )gD„ ¢"ˆØ6{0% sPEÑC»ÄR¼fᢔ5vTpÌ«RKb×ÖÜ10âƒÄ±œ˜Òàq¥ØF£s»;z¸ÆóKêyyÕ¨ëz^Ýßz\Ï«{j‡µ¶NO‚z^ç·Ì s=F_Ï«û»×óòªnÃ1º'A=¯ó[~ЋŽ‘½žW7–PR‘š”ì: ÆóSĘEX€™ ¨” \Ø/šºÊ[ÆÄÍ7š½ù’ئ²ÁÅ£Ô!¸«ˆ à›sËYÒ«`§pMÈû‡e–ªª—P-‡ÊœÇ\Ñü™×å=³’>]]D>VÙ¦f1‘h/â¡%’N4+ê ý£(P-öü¡§÷ÊËÞ»ÇÉ>[rR wP*Ñ(¿[y9ë-"#)b>N>Bä`£¬dïrÓÛºQÁN1(‘q·c.ÔÝâô)B†ƒdd?|, ü Ã70¤x>cDíù|'É2¥óâ9_mxn¦\áC<—ßÝ×û:óþu}ç;¿SH(%q˜Çâ3äIT}L>vJV"”쇅[ Žþ±¢Y$pJ=—! ³Å-ä?dEYW„ÈŸ©ˆ¾P‘ ±”HPÌ(²#aR®™ 0[&“X¦;ØC£ƒrhNÐ*€q&ò.r·Eé#¹ ˆÒîY¢V#ª¤­´`J1¯ÛK(ΖR¬ß£•‰x;pº‘NéD…B#Ö‘Óɳđÿí\´OßMdƒOŸ6‘>RghËàuEÖ‹ÊÓàÿÕRhyîâ`ÿôNÞj7ó ÝeòU}¨Z3T"½CÂ\˜J_šÂ«qÿâŸiµm™:ÖX<&RãPyIò:7¤ø ¬Ž„ûb)o/YîÓ¹K3+•ð´Üh<°¬·£Nk1ƒ…ÇsúóÔ6 }«&<Ì8دô^¾¯EÕ¾Ö)MVÄß…»Y‘ð8x=8€G÷b–Ë/8äÇã2'W*Œ~-º–2שVþæAF*Šè^A…µ~’*ÉÂo4^ÈÏäî' U”P)251ÄãS(šG¢6îæÂ#˜o QGœÊ0!ŠÖŒÔ}2²ÈˆêE©2¦Þp°(c:Âßà•âõ`xƒãÔØJŒyf= êÕAÛüÞÌgýæk%nªøªHŠó¼OfB¥ÌNP!fŽ¥`äPƉ—ñ¦LH.ÀļÜ_…(¤dKð4¦V (LÏsz¶m°6*¹Àš}E2ًƱ!sGN]¥Á°lø“းðÌ=Täǃ) …P2‘@)2 š£"¦ìPÏb'±iÖ.oÒ)*)Ãýù'ÌÆ”²rºaY,JtÆ:ÓŽéL /×ER§›yZz‡‡Œ”²µ¡À—Ÿ:·Öcf–õŠÚÊûR°b³•m¶2ñóY¹¤ÐuòöæAÞ_­¼ÙÊ8[.CE•#`Ð*Ü·•Ø–ÜKŽ‡Í¶%e*%8lyÊÞõ:mgu™V}{(}·0ˆãKF¤öo$®ÜôÛU%(Ú1  ˆàŒ?9ü²~ëj)c¢6;ÿ䦛l ’Q;’SyîB™)ËUι‚V‡+X­)tyy"çý <‘óíDy"ת tÐñIXžèô–ôb®Ç¸”'rÞM”'r¾ Çèž„å‰NoùA/~8FþòD®µÃû”&â¼½Œø8.šÈsJÉ8#>‘ã=‚ÑîmIGèk¨óI<]6.u§–­æ—1”ÒB”ßdüE"j“R©D£«¯b¯IŽQi5V©á^·!±E Â^˜D…x ã&ö¨î™ º<øy÷e{%ª•iÃÃNÀ«qË+~5&Ü31áÐ>&Úç~$bjä<¾ð¸îñÜ[O©¼ïŽS¼£ ‡²DÜËï*4*j%aäˆHü.Ü.Ù*rù•Ú÷0¢5LGiÙdEžByå…=Õuåü‚•¥xøR‚M¤¶Hú’ð ÈT.3¾;ßK¡tŒ'½d¤¤›}”U›p¯Dûqò;y5ƒr0P*aH/Qåí2.Ø õ!&R ë)eÎ|NòÆ)œ‚ò:D¢û·ÿÞÁO¼>ßzaüùÉ]e•:zÿíµÝÔm;u7±ƒgWôé°¯[Î÷°·ô~ úÐ{^¡‚”ì#ÇÜb¦æöS¿RT”Ó}òZXÕŒØC:ö3¼ÖÄ2î ~Ó_•´ô« Ä,Àïf|9h¼wŸÒAƒ {Ùïóó±0…´ ÀÅû­a¨Zð8p=êV’Y)È‚ðÓãÁ)ÈòÁÕ‰ÜÌ[@˜vÏeŽÓûÝMùp©péÌ”d7e„ÈàÁEÀ`t¤ gŒQ™kÔó i€nÛ5ÍbEW™COQç¡G]Ö«éÜd>ï?ïþ9“” endstream endobj 6252 0 obj 5330 endobj 6256 0 obj [365 /XYZ 37.5000000 528.500000 0] endobj 6257 0 obj [365 /XYZ 37.5000000 528.500000 0] endobj 6258 0 obj << /Type /Annot /Subtype /Link /Rect [175.500000 270.500000 289.500000 277.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/3/c-api/typeobj.html) >> >> endobj 6255 0 obj << /Type /Page /Parent 2 0 R /Contents 6259 0 R /Resources 6261 0 R /Annots 6262 0 R /MediaBox [0 0 595 842] >> endobj 6261 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6262 0 obj [ 6258 0 R ] endobj 6259 0 obj << /Length 6260 0 R /Filter /FlateDecode >> stream xœí]I¯ä¶¾¿_Ñçn‹‹D 0Ì ‡ƒ ‡ ‡`'0l#ò÷£nI½PýQâ×EJÝO$3yz¢ÈÚ«XË÷úüÝ¿~ß}ÿîóv_û¿ß}~)ö®,ºÿì¾»ü®÷ý¿w®.w_}ù¶ûöòéåSû¿ß^º>¿ûKû¯ÿíôîÏíÞýíïíìéð ¿¾8åÚ¿9þÝ8Õþ«8ý}øù¿_þú‡Ýo‡‡Ïõ›¹þÿß™ÒZuܯħ¿½ ÇTÇ?¿ýíåûq_qE]›b§¬±;ÕX½ûï?_~j?0,_ì«”«¬+îù²öð©Æ¸RuµSÆŒ¾tü#µ~‚Õ›¢jÒ­Þí]0F7áÕ%Ü(­{¹$(8¯Ÿbuݤ\ý¸wyÀt¬¾¯­QÆéÒ}@tY׺ý·3ýî<˜©‹lʦÜyý«ÛÆ$\ý¸wyÀôHÇ«ËpµÓ‡¯TU«tÓjË¢=†·¼,ºÅëö¯d‹w.e*^=GwçjtÙ­÷ƒí¼¼øâª(\•áÇ‹Ce@8^]Ž›Uaª@ÖÊ %oùÈ­[fH¶øqçâPé{cõOœ; Æî€²½ß^ßýzúm%ÅAC˜úð·Sªûi+ë¿4üäëa£{¥]×çß*¯—)/?sx£ÿA}xqç-p08¯?ÓþäðÒÕf¿5l¿_æú4_[çésgÈÜp”¾^|ûååûíçªÝ—ŸZÌÞýõ¥…`Ë„ßÏ^î¾ü¸û¡(ŒûãîËÏ/ÍÞUe¥Ë#‚º'º9>iÕzWO Ÿ|8>)÷F×jî;ïŽOìÞšÎ==QêøD™a¹ó“®VwOÎ?°hyüaƒ—gŽßqÄjxop5¼ â Êã³/mU»«Õ*ø¼óÎÉ\6•ÊèÇÀ'v ãݨù°€ Æ| ¥€ä€{Ó5dSb×ø;XPòŽ]‚‡”‚YAÕˆ»öÙG½?þà×V{ÏRÉÎz*Ù•·T²éJçÆ*ùø[åõ2åågÎ*Ù™[*Ù4¿Óc•|ø­a·æJ%Ÿ>³¨J®OØp+&×+h±Ú‹à´§7vÈ~ãKˆýeb$Dà B 8BÍF`%`bLbcÀz·{¢Ôpä»à7©ù=ÃReUdi©œ'KÍÇÞ½9îæ Œ |ò>1ðÉ[øä|¢¥@‚tKY[rhÀ߬ýo.ÆØcÞÁ|)`*ÂÌeÌ= ‹}åԵ辣Ê}јëó¼«u¼¢ôð(Ü’Á.vPD;ÒIðžvÄ Óî¶ )Z‰p Íái'HW†“hx%Æ~!eóÀïXoî?ì àÍbÃ{ë#”>›[ÃÄ1ÊzLd“«t£ýo¤T<>ПŒÆÃº#±â~t‡Í’–ÚíÜæ…[ƶƒOšÔüc7›ì‡ €S¶ß›á'aoú< [c? î [ßzbÑû>$‚ß1b$2”¦•J×"- X½ü¸õ¤Ž‚¬JÉ0(6os"E»iA2õ$ÓVíɼ†¬+GÐa[¿Q…šôZŽÂqÌ5"£¼ "*x[ØL”OôæOØKÃ'• |÷ˆàˆÜ¢‘=ˆALsÉŒ I¼¸âfHs> 1žbüž´Ž]u „¹“¸¡@ N/§ ‹,в\ºÔw¼ô‰²}“ …­0˜0‘À!©ìf³„Ô쀰àR—¸ èZ¬V0¬?ÎFeN§¿Qå)÷óÕ8ýØ[]‰Ó¯3”µÜX'ÄLëðwò K›“*_qŒÆb^…Ü@><©aâ:Åø<ŽFáw `©d0tæÄ²E×v*gpþ:¢kºj-];\ÌõŸ”-ãÈá7(¥½Cl .9‡¨JëÚÇÈ “s%u¥õÞ˜J)MÄ›%v€½*Æÿ¦2G7¼Ùˆ¼é-%^€—E㉋ÞlIøQþ73Äï´ñϹæZ‡Äÿ7~@üPU¾úL­œÿÍ\iœ©<{÷Î4N&ø–ëhþ1_LãÕeSÔ"{ã*¡€Ô„Zª(²ÐD¨™¸^׉”ñ–ÊÕ|·êT"S3(Â󸾀Hp§ê¸§Ü³¤…LÎÓs[íxœy)ZëÄ$ÅÐ:ÓafBf½´j¸‰zÌpœœ:XF?4°ä”9ÀrH]€1—YX#£˜Ø5sý´üe#†NàÊ »ó‚Ò@ˆN2Ztr]| h¥ÄC®Ž•eMiNÛü­•÷áºehß ¼Ó@ß –AëA8.ó ŽÀª½>ºK³ §Þμe‹¼E;ÀßÁ'Å«™7nÌI«ø ó¾ƒ­}ƒÉkŠ[ß;«YƒŒé”Ï™8¯˜;¤=º½«s„o=Á«½'0é5@½ã%z¥ ìÀgåSKQ ¬pìBÂ幞0E>B\!-3ô:¾#Óë ƒé%qãJAV4÷ÐmÓºaÚÖ“jh”\ì™2Î tÃðj*¹43ºô ÅÄ‘ÐÅÙ$qf*_Þú›å{£¥ÔŽ•õè‰J :CPQMâR!¦âT¢¸ *hg0e²+(ªÍÉVEØ@Tò—D¿K¦¶[䢜¢HÿÄÔ6(¾(w³ùVö~rÔf‹R3øÎkªXòÖ16i½„Úlº¶9—f“}ÀHa\Ô·X¯ &‰"S×YþÈ]G;)°FÙÓo|_<,…ƒv[`š<éòi±©©`s!ag1ÉqT¥7“„'šg¶¤?ªJëá*°›ù"6  É7E˜©"2 btP"UY¸ó]_J%åŸbA0?DÁbrŒç™2ˆEÇz1bYØw^qû°±øá–h{$ræ«+RV¼èÊW^Lë-âl æ ©èñLqQ®·Pß0:JDèBŠfôÀ ÕìdÊNöÑÌ*ËÈŠ'î<ÊyÅF ±þ=3 bÊI ­™z-×pÏ+¦KæG\ O´ƒ+ ,àî^Ã=¼ùB5±ËD;%lä *ŒSѽá^xoËã4ˈµA>93 ‘q/6ø$Àgx5¦ñ#¦$,kàjÔ`.Br½:Iœ‡Ê}•¯@ ãÞŠ˜. ŠÝ4]h›¦Ë‡Óœ^K­Ôä~dŸô ¦ Å@ó)ü—Õx<¦rEP9±7Æ®ÏÆ›í¹ÚÜC—F,]`ÆNíFFöé Ma¯ öUßÇSÃ㈋&ªK‹Äͬl.lL$¦dGñ#‚ÎLÖB†ûÞPgÆÊù¼¹¹@‘âÍô= .`ÈdjDÌ+#î[¶[圅3)FlõœÙ( fù2‰ Tfu¦¼R*I €†”è5qâi_L·0 aO/8‡4îþÑßìúòr^¶7e=@“ Åãwˆša gÎãw¡.ü|xQ©ƒ9=+E86•7CúB ̉w ©/àƒ`zÁa¸µà$êAnhÒU ˆrò˜ƒˆt",y6<ÞGãå¯ ù÷‹bXZ Z‰»×,­˜À|f®ÍCË¥Ùhù!h”½† \\kÉIùàÅ‹j=þÁ±È5K&ó™) Áî Ž1E:Œ¿pè%¢Â²ãsÍâØÂ+³ÈM´?*S D ÿÀW©~ Õ}K´Œ)-¢z+ŠI}ÔÙßã‰ýls ñw`zᎧ“Nî %t]ô.¡ËÀ@i<5c6Ù¦—®ñ£Éƒi3ª›Çïlƒ(‚üÇLÃ…“`1öò_!á)Ä·víܰžêkp SØNh××…oØgêAÓ~Òž\lœÕ/îÆÔ ¬¢èaR¯¡Ä|_¢Æ¥PÁûë@_søÎ¤9–8/JŸÜŸ3/ G”RfL]‹g¥ËvùeFC¬pöEDR"ï§Ô&Æùüõê¥mZ‰V*ûä GÂñƒ£Í¯¦HÐ$çv§|n—¿Ñ·4`qȪ Ѹ‹Ðº/ t%z…1Y}™A¥ì6£Jƒ+p¾X›°g·*ÖÜZŒ©SHml3· ²ÍH™›C‘«QÙûÁm2Hj·€êÃÊ#…y“!Y™Émn¥”w–Rnæß]æóf¤m2þÒÛ%È€"ç “3I¶T# fÞåÔÒ†ólã<-è S©ž"LßÜuŒÙu®>N_Åï0ÅbÉÓp¦qí[S½Ñgûå›0._`V)£ßà;ãѸÙ2 šSošÞJŠþ,jõª˜1˜ kQ'Lx@ÌCæG´)gæv1É'¬Pޚ؜‹0ûH 禌d<«àÃ×Eì¥ UW2´ûÉ,á«"R/íIß<0¸á“€ÇjëoåUCõ‹ŸÄ>¦§Qxc~xt1î Ü^,ÎÚÂHÐPôáwFH$ baÉ›XxKacs‰‰P`ÈBøY Ä:ÃÙg}mv²IeÓAÄ´FÅþðÍÖÇh}Õ‹üòò9`:&µ9õ©ØY¸.Óm¿pµO¦b9¼ZL÷ ‰‹ªÔ¨äbBMTyàÖ#.•AI„~>àÈÉÔnlÒEÆFÉ1ƒp€ˆ+'1¿‡ÏÍhDœŠ÷†m "·Ÿ[¡ÊȬ²«±ï£Á•?ñX*s±¯4õ$ÏéŒ`Š+–rBÛ¾Š+Ï2ê§òœŠ56æÌ«D“Å<„½7ˆU…w«³på äU\Aˆëêðy°ÏS6†8—X Û6Ì;¸Š¾ƒeià;ü“,¼Yõ=’kKìí3C‡ {S¶ rùHD`7mþy0öÆPÈŠ«¼R[P¢s“˜Œc¥‡( ¶QË<;¨2žÎV“”ðlR~yïo“±›ŒÝdì…ªNQ9BÆbêcîRUFÿ·ªï‰båôÔ]qOœ†:Ý“Åý1¯dŠ,GgŒ49­3ÓK`Î'| >BÊb9d¦l½[ß‘õê×'½a»ˆð%á¦<ö'E½ÿqÒ¿=o©€›UýÑGì•.0ÃIÓ7Ž¡ðjðÞHUQG¿¸Êf îðïvÇ¢1ì`CkL˜l0 ØÞÝÏ/¿÷Ö»p7ûWE¸z!î;ð< ³A%Ê‚ôÓ›X·(«öX'À™SDÇç²hßéïKñìy{ß–d2dq2¡4ÇXBa£¾@)Žð}°]–<°RÑfßkÔyâ±·­ñ“Þ¶˜²+vŸ^þ§ØLß endstream endobj 6260 0 obj 5424 endobj 6264 0 obj [366 /XYZ 38.2500000 542.750000 0] endobj 6265 0 obj [366 /XYZ 38.2500000 542.750000 0] endobj 6266 0 obj << /Type /Annot /Subtype /Link /Rect [275.250000 188 331.500000 194.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn11 >> endobj 6263 0 obj << /Type /Page /Parent 2 0 R /Contents 6267 0 R /Resources 6269 0 R /Annots 6270 0 R /MediaBox [0 0 595 842] >> endobj 6269 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6270 0 obj [ 6266 0 R ] endobj 6267 0 obj << /Length 6268 0 R /Filter /FlateDecode >> stream xœí]ËŽÛÈÝë+¸`¹^|ƒvÛ ‹† ddx2 3ƒtf‘ß%’R7©SdÝ*Rmxº§Ù*VÝwÝçû?}ýGö¯ß³÷O_ÿ“}ï¾>}Ý©}™«öOvøûîõLµï¾ÏÊ*Ͼÿº{É^v_v_šÿ¾ìÚ|}úKóÝÿ2“ý¹ù÷sö·¿7?ü±û¥Ã/üº+uÙ|ýåøµ.uó:}=üüß»¿þ!ûí°bÿºn3oÿÿÍs[‡mL¼úe×Sÿþþý·Ýûao)µ*K“ig]¦kg²ÿþs÷Só‚~yµ¯ÖeáJuÍ‹šW4o²E‘iS«Ì97zÑñ¯Ìò:Â╪ã-~ܹ8T´-´uIäV…é¤c ÷¼|„Åë2H9‡‹C¥G.^]¹Z¶q¥<ˆÎËG€¿¶9·Ý¹8T:äzV—Dn^õÔom—°øAãF[ü¸sq¨ôÈÅ«ï+gµ-Mîˆ> 9¯*Ó|_ÚîÏ•@+zŽÈÇ _'ED†«ŠHM‡‹C¥G8^]’›ëÒÄDîyyùÅ6õÀqçÑ‹WÌͦ±Ý#ŠïWËGXÜD4¼ÚÇßžÕ¹Ù8Ýßišò :/añBEDîqçâPé‘‹WÍÍEÞ4eœäñì%S™ˆ‹w.•á£Õ¿„¬‚·Òþøq^<üøm÷þY;ݳȾýÔlîøÎöË·(yöîà¼i6ðíÇì¥ìó³o?ïê}aò~‹Ý“OÇ'Ÿ¿5‡ºn?5ØŒSÇÍTNw¯Tޝt{g[gÛi3¦BOÔzbõñIuþÕ¢ýÁ¾ªÕñ¸§'Z¡'xyeàj/ÖøWÛ=j»·¦ÒÍ£óòùñ‰Ý箨Ê7[*áfá{<Çpæµä{4¾g5椟Oò j0 ‹ *Ÿ‹‰¤ O(‹Ù,û‘ã–óu“'ãÑ*¢IWTŠÐú¢xwk Ì.oväyD$#<P?$¨Fêf¾qì±µ ]1òSVy­&»/zœ´¢ö–]Q#¨U>ÕRYÂzxÍ)F"^ŒùÔxUŒ„D)ûºFýfˆ”}J’1xŸo{`JP…®Ýžv{£ß²‡ÇÐ!ôN² táºOÝ“.ÆôjP¢Ž‰R”ƒ0¥yâ^q}-JØíÛYpAìî`0P8ÿ:nÁ#UÜ…‰7]*©Võt5-¾[R©—8Ù §éá$9œ,‰S<‰¤2O"NŸÀwâN®p²þ Níð†çÁpclQÛꟇ¹{¸‰ÑÐDaÊ;¢)Ê(¼¹Ö’¨9÷¥„¼%‡¡‰${nÔ±æ-VóD}™€7N-±h‹Åü–˯žŸ&çª'Xs"DHÄeþ2Y]Tþ¢D“ƒLØ€”J¢•"U¨ƒ#ØI’Æbæ´f ùkû8<,\ýŠÍÎìÈ÷ª¶oùWy„æÍ'O{R¦’•h,[‘µj¥8²fÖœ?$küII©­A*ó=G?Bf­\5Ðpу‘¤-l6ÜBiîuü—½káìÐ1¡·’Þ³ûÇ­0–­Ý`Ð’jf‹¶ÅUr m~'lF®-_¾Í RÏ Æjeê½À=" š®@øLƒÌtáÒ )Üv Q æ±R ÕT“+¶Kp²K0sçõ\ª¶íä/Ë%²tí¾Å¬;‘ö“ölD}V”vhSÉÒ ÖZDÿ@êV¼¼[4•Ü¿ÉJO¦æq¶{¨Š(ñ ‰ -îC®ë×Êbmµbû¤E¦…­Ï1”À‡«‹| /ïij”¬}=;ÁYJ{Éê‰FKiàcÈJ#&ˆF\(d]ɲ¾Y~µ¸™&¯‡<¹5ØšxÏ3YµÑóP‡DiÖ3ËIéá –¿2]ù—mÔ™çvÆ53-¬‡ v™–è뀅ªG à|}ü~¼\Dv,m‘B ,y·\ÜûÀŒöðÕ¯üÌØ+v ª2]_´¹ZŠs¶¯6éz 4joAj¸™ O:ŠË÷¤Í}ï £‘ Ÿé «†zZŽÌK«µxÐE¢]é}> Å®j®ÜÛÑÍâcø®ñ:깄÷?càg(è` Á{ÓѱÖseßldÍ•J®ÆÌȦbˆØÿŒ£ ¢M\c·•p@®0Šp1—€ô£d}ÙaRÃ~Œ"ø°Aà qG  ?‘4jû8Ÿiæ[1Â2@4[ ±o7jÞb ©´ÀÛ‹öÚfÒw¨a|¡Rª¤P6Ìu{CKŠÊ ÈÐÀ;=î?²šë1oû…@ŠQEu¹¼#aȉ‡O¦ÌÅ¿™ä§NØúŸ(@¬ìHÍX`’(™:*Jnf¦‡@p¿vÙ±4Ì.«>ñUÓŸhnP@‡‡]1©2Á~\ê†Y<Á8UMaëb B=>&Š‚m AÀÊT÷Á˜º¦K }©èW–C'›Jƒ¥ÅðºJx3«ÎÕœ+C|„•Éæ[Ù=²³qcßH™ ,ã&™_ÔE]Uæ÷VNÐf!D[N0üDô> €bðíÒÞÎú“IÕ¥ä%–}]R¡õ’}¶7Åì(žŸÜÔuŒ*ë#¦‘ÊDÓ–ˆùñ´–ÁÑ—V»©Þ‘Œ$k1þ›D–câþA |—ö*50|˜ð½!W[L•]À’,îq•àÃÅéÖí´ž_€2Ï=àv)ânưað•‘qH”nzÏt¥ác>H·ÀóÈÀNEäb¦¡TC“Onª %šÛ$l .¤d9ã®V@¢Þ <íz7Ó5Û=KÝ:<°Â¤áåcO·cÓFm­kÌð~¸´¹Ì4Œ=q€HPÆ„Le¿KÜ>S5NÝ B¨L—ñWœÊ8aqc*M*±j…î!™`öh'„—yù¼KŒžnæq=!áûÅL:Ù›«ìj¢ñª7‘³5/•D6yå‹©¡êz ¢n*ü¸Mªˆ5©Â#°Qþ<\^äJñ¸ÉÛ·y‘—É÷cÒîDg’Í€Â,>ôax¤PL=%ÖUŸ¥4ÒôäÛBWoés“áq%\€»5­b}aû)ÌÛ4ù"y1‰¡T4ÂÌO9û(óÕÀÊó¦=$®`^;NêS;œå§ˆ—®îŠ[z·^]RêËJ™þ °Âyâáb‚ï ¬Ë[üLƒ-£Wƒ­G¯¢œ-w‚|žð­y˜Fìï)ËÑ -&ÖØi0\V«Áð&&±U—âR`ÂVªó“R‡Ý W_&fD§@åB…wLN×ò¹ìTÅíâå@2=Fd‡vIìê'¼%•Bᘨ¿¢bì‹7¤NÕC¤pœS‚LÒ‚D|x˜Š£ŒõJsÈT3¬%Ûé~¼bóMKù¦EG1õ—L»*b+; ˜ÉZsÆ“H‚ؽeÍ¥êÈþ Ýgb¶œ¶v¨7J"uÖ¹IÝNÉKfó;TR]eyxÅYà+”"Œ­2¾Ýb•ŽªhçM‘Ä<1”iÒ2…I..º-©€Šf”NÊÕ^Bs ›­/ý{fÒ¤ŸÃÓ8E4ûósûd«ƒVØí8|ÆJ˜Œ‡[Ê“‰™¢Ï…ð á&ÆEx¸]ô†}SõTït ‰îiÂ}ë—¿=®4y1a{¢¢*)º‹›Äl$éVT™¢¼N»ê»;_¥ˆJÖ’Ç„À»i yŽ4øšÈô"k2‹:õ|ê,òj@®v{£¯wËyÔàúü?Ô•?#*%¦šŒÓ`Ì[!×’‘“ÑŽÄ`ö‡ÝUêÍ~Ù}õˆÁ8òó°…üL4@ÀغwŠt“—ȘɕY¼½ðEã>BF6Õ~à»ÂÀ˜Öîׄ¿dc¥T³“h1õã©ZÜäiŠÚ£[´ûúK‹­PfFà5‰„X"1ÚfÅê4UÂþ å.Y|ðŠgš0N\#¸›I™¨ _šiõ¾%LÊ’2-ãLw’ÍlÍ‚“¬X‰Údt•\Þ“‡ýË!Yî«èFáN-Í-îbë =õî°æwXÀ}4®’Ãõ£ð3×µ žšÈ©ó¤ÁpU¾eß°:HX׉ñèém±xÕö::‘äêš©©*j=°ÂïÁ¹Sæá”rs sA˜#˜^(é i,)¶\ʉ!3öS™Ä”àé(ƒkþ‰õXÇËv‚0¸ÛB¢É/æÕ`©Å'!{œÝxf,¾•á»Q#¬ˆàî›/xÕE›|Ró E}¿!>zLðN!"B,›„íáhìA  Èf%!d~‰³cj—ÒÕËÇ8‡"OxÌfY‰0輓 `¬ü¼-tw%•ma«› [Å,)¯ŠúÜb ÇŠú¤öî¬{è Ä‚zÞc7ÔR¥ž;yϳI›¿ÙKƒ/Ö¾Lý é^]B©mä¢Ò)žû¶k(ª[ø”äb+MŸ?‚O1~ÒyŽÍ¾Ó"#¹¤Ï?¡÷Ø)“óÒÞž»“"E†/Pî¼%7«»£Øç¥åË ðÂ14^ ~¦³itÐÑ_5ìf îð}³ãÑvŸÃI“ &×ûýùë÷À½u çábxw÷Sl儽žGOå`HQ¤ŸN¸]¢¬jÀ:Μ"Â0>—E |Oç¿ 9;·¸»nK²@ 2ˆ8ŒP€c,‚!ȰQç #ü!Ø^—-±R±TvßiÔyâ±›0|éɇ׶Ŕ]‘}Ùý2 Üÿ endstream endobj 6268 0 obj 4758 endobj 6272 0 obj [367 /XYZ 32.2500000 395.750000 0] endobj 6273 0 obj [367 /XYZ 38.2500000 286.250000 0] endobj 6274 0 obj [367 /XYZ 31.5000000 396.500000 0] endobj 6275 0 obj [367 /XYZ 38.2500000 286.250000 0] endobj 6271 0 obj << /Type /Page /Parent 2 0 R /Contents 6276 0 R /Resources 6278 0 R /Annots 6279 0 R /MediaBox [0 0 595 842] >> endobj 6278 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6279 0 obj [ ] endobj 6276 0 obj << /Length 6277 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ€ €¥]È!€ 99vœÀˆ(>ä$G»M~Mö7ÕÍÇЂ­µ(v«ªë]Õïþøùïçþv~÷áóÎ?t¿ø|Ê.ežµÿœ¯¿¾{ýººt?ŸË*?ÿðËéëùëéÓéSó߯§ö…ÏþÜüô¿³>ÿ©ù÷çó_ÿÖüáÝ_ºþ…_N¥*›ßÿýò{]ªæ§ìöûõÏÿuúËïο^Wì·ë€yûÿß™¼0yycb믧þ3Õ˯ß~øõô®E@Ø.¥Ò¥²geMóŸÚêóÿqú©Ù _>»TÖ(SêÜ6?×…-³¼ªtósiºØÍK}ݽhþGé:;«_îæ/¿„–°x¥#.þ¹8V”)”õدʺEšÖU šôËG ‰QY‘›®‹c¥'8^ýR[¥Ê+¡ï%‚ÊþDäCQ"€ÿ2Þ3¦ÁM<Î)_Λ0V:âzV|š©²˜ÿ¶|„Ås£"rS•E$8^=6Á ÓÉ׿å±v[=IŠ:¸øri¤ô䆋_ª¢ûþLn]]÷-««i¨ªóŸÉi «´ŠÇSßV@vS#µGâ)¼¸$eµíuj#wäômù‹ÇÔ=-äâXéi‹W—$®5ºEPYDÀÐmõèϳˆÇöri¤ô¤…‹KR6¯mç£5ÿFÀ~¿| ìW•‰È7WÈűÒÓv°ú§U0(ퟀ`ÒWϋᅵÞ}lTEƒÌâü姸—=Ûß¾4HÉÏß]#HçôåÇóï³Lç8ùùôü¥=ú®¶ìwU/»Ö—Bç=bø'ÊÂ'\ ¾“=Ã'Oð‰O>†Ã–•ê=1ñ=Â!È0ð÷@ÜÓTk‚Þ'äòÆ„OÌåï :B,b gû2Ì}6È/ªJH­*ï1oÒíZeö~€´`Ú¬3¯{b}ÿ²¥½XÓæb\«.U½@ꊗ±w,zÒ ¸±ÕZEe.¹-ª22_5gcãüU¥á~ƒUá_µî‡!iu‰Rý÷ÌyG˜^z¢?„ë¡$ܧ;ø#Ø ¿0¾€_ª ø{<œ‚qÝ*¾übt¥Þ¾WÓ\ C@ìãá÷x!Ž8&¿°À` †°™ ž~ C0@1ü@ó„hK=QîÆø0Â/îðSÿ”®R†`~‚šø˜{Þbkˆn,_°„Þa[t e¦ÄËr(ÿ=RË‚–ü*»¥zÁÅŒ¬ PœJöy#ÀxÁ 1Çg>[{Ô3I=ö”B ‚!PÝ;¦ÿö9ï`…PÏ’ƒ22³³1Ÿ4ßÀ$Çz³ê|Ð<öo]ÖF»ª³-dAüVk”½é‚9˶Z”E>[NO‘(È Vß»ŸA`›,øØ{œÌg)N›OÔJ÷§eñ–p pga“Ãwpà >1jcrŸQ‰¹¯‹nÜwpŸ®ó{xìß§ ß×Eo¥LdÖU•˜G°„:xd‚Z¦AQz1™ÞBPAªRºŠÐ‰ŒíNC:Úü8ëÛ9ëÅ-±š.k²ÊÜÏ#ÑÓ¹F™^m%ó°åmwåk¤>ÃDÖ#äq’N"Uò]8ÉI” xT‡(fCÒiPˆ,z$‹]Âì+¬C°4Æèbê%àjžS ÛSÕ>ÈZ…Ä‘“%՚ʬrõš+¨ž j(EÙ&UŸÇÂrR"CN™¢¸Žùt\ÁX&LÅÔúê.W]¸ÀøBóÃmç [±ÈÜT¼+/!t"Vá*R"c~?ƒÇÂa@ÂÇW°@¤è¡öEL…Yj—GâË%¬ß1Z9 Ux*p^ç‘pæ'ƒ«áj œÉÂùI×h´®'áñ<Ô2ð» Ѫéá&·‡+G˜vUˆùc§NH{ëåA߀)ì9ÃŽ §«²1º(ï8 îÁùIøÝL²GÞajá±WpN Ç>ŽL2 ­ËS[¶NÃQ|ñjO åSULÂ㑸NcêI’¯3Yþ§Qõã„—fŠÛ–8C„m¨†™½ú‰‰ÂkLs a¥Âx‰Å·Õª7€ÒéµJ KH½ · ¬ØÐš,ÚûÒãIß{Ɖ¸dº̼&ÁM˜”ž¹PÄÉò4–¤=%i¤IÞ¢—HÚ¥ ’kOiG¹;ÎBù”§nâôà ;ÝGO8ìµ»'„|RPƒQ\µ–pa¹QÞ#d½¸£Ýj’ZÕí·&ÏR·ß2ö¥§Õ~Šã]ó¢–“=§K•â]ÚǬB¹²ЙqXXNâ¡S£•»gä)­ÇôÔ옞JUÑÇ=|¦VÎAH¡²Ü= ÍrwO¦æ“‘áÆ¥:¡Ž†Ä°“­ìVù%«Í[NÁ¶V‡.Ý?ºKG„Ø>¢ƒÂeGȆ´ä‰¶ +• MglGª]p}|lnN=‘”i‹Ç æS8æÒ½m`›KªžOá!®¢þß¶ê?† 03‘qO* ‘2òÒdy9M´œ¯Pø]—GližøQbÕ¿S¡ÑÛ0/lâSáâþOàfq‘½‘c0q;Äø_·z†R0㘶}9að® ðž*ûÁˆgxyØ­ëĸqüd…Üåñ¸ΠhÏ=SX.kß!9bÔ2ÖU›LNaÆÃvÓü6rF}R³P¦ö‰”o¶tH?#VwÏ#9woà€ÉN`²à»í<)FÊâYê²+˜G`œJ‘1iž çø™n1£š È̱:ß('‘{¼"²[^>SãEn]d¦˜1s¢ED,1Õ8Õìâ ­$ºR=ª‰ˆÖ¬ xU¨¾ 'idÓ·Œ—54áe'à2Ò‘7îÓgQ©èˆhÂ@$åˆ2u02FåäLvŒ>æ–áåç´z$,1(ŽÊ³,žÙW*+¦ªª”£«öa®xXõLÏM]Fšðr¢LÝé¼ÓŽ øÛ©»–ú6´WTnɪ.Ï„ñSe–ˆœERÑp eÞXÌá‡$“Œ×Tiëq‚ø‚Ï@ÄÔÚº byØæ€å§èMVž}\üãd‡' "ZÒàù \­ì&s#”—Ðx¢G˜pøœ >ƒÑLÇ> x}Z÷ËfÖ _.J®M@UçFÒŒ•o]Û²ìlv³Û®¢ý˜‘'Ý¡(.ÇùJ3XøNÞéЮʡˆêç• ÝÔ®É^\§WÕð{àl|¢á>‚MÃ'}ÁÔÈ÷À}<«Ašâ/íü©±Õ0®!vúîºZæ×j˜ïÁû@>ÀPwÚsl5iŠ9DlNä„çXéÛ§Á6äå«‘ÍÊ;„¹L8œÁÚ êKvR®h:Vöj\Êc €ÿÍ£@ G˜JV­¯¢Üù±E'š–—µà6ÕÄë9“Ÿ!²Ϙ%·wûV™$(‹ZbÖyäÁÕ‹+M&¹Ô Ù3Bt²H•þಋ)³•­Ñö@`…È΃"ÂÊwwn¢AkÓ÷.Ö6{G$/êU³Êõ¥î’°ƒ°w @¢â‰‰Z²¶}”ù¥!'Ì¿#¸‹êaønþÜCªd[b&c½ßQÏ• Šdnw9®FÇR…²¢mßqììTÉгÊîÙ[¿ð¶•ÅOD¨,Ôa“g‰©!Òe|ª<‡‰‹b åTã:.®%º!Búïã–ô$ë©©JÛ363ø,nM!3޲¨‰F¹T½g‹tëu5E¸>HÔÝ 2 óKS(ž|¯F@47À>ITë'æ€b«­k^áŒÄ~øš v* ˆ%áªö]¼#uú˜‡ç’™©Áˆ†#€{çeusS•RҀыkI¦gå Ó_TÖºªuÙ^»%}L"Ñ{nCÒDü!ÕàÀޣާ«•žóH‰À;qž¬ª²¶·]Д‘­6¡fýÇ ó‡Ü^.ëË c¦ ‰ôn>Zün÷n$Oûª± ßÁûè§¥©@žÃ\%QmÛ)W¦Ë:'Œ§»Ö Ù`å¥-LjÇåFŒ2û0—ÝËNŒæOu[4¥Ê1‘?S6£¿³¥¦:Pýì–U•¡NÚ)oqË­ëií«_‰š¸$z-–Ìbœˆã¸œ‰ŠQaIPÕÄe=E»z¡˜ ÒSð›ex²CƘú+FD¾ÑY3ï(ˆÑNb}O·Oü€³Îê·Œ!¦ryê>E­R™K&d òùÝ!Ç牂œáò2dWÝâ{°ÒNŒô£t`™Ò†3Þ8–.…O<)c˜€fR¹øOª§aªÝN›?L‰‚xWašâÂ\T÷ñàïƒaÃ% Çôñpˆ=?bC`C€WcÎ)Ƨ¼…à^¦(ÇÃ; %>rW›Ok0“Ý(Œ±ˆ¿ãŠàí ‰Ëâpy×Þ´SÈfĺ†gpŸé=úÃ~:ì§ÕÛO„ü?tm¶]ö= ²fks"–ÊSg.þÈËÃzÙ­.-ÿƒ—£ZIÙ;«tŽn¤ÍHé _—˜>gvÔ.Ÿtªdªïטƒ>ê w[WH’DS³—jËé­zY#ÆOãÁ¿l×;2£ëK²3Çrw×_HTìyª£™»hR/lVÍ¿µ.Õ-]ª>‰{l‹þb¿Ã=>ÜãWòcCîñ .¯¦ç7<—ã =N†ðÉÈpXCÀð(ÄN²ÐUnúΚåÛ¿÷Ö°½­XÂNü¸D¡Åa€…!aÊÝwâ-ÉFv–wž™±“ĵå"NYÀ¨OjMü Yî(<¦¥ÄlƱyl–»ßbJË—·›l?†kùmkžØ©2F 'ï1,Ç+„˜^›T×ÇDx‰iÍmÂv”èõM˜#©ñ Ä€máK±R2g/@S3ág¦ÃøŒ{¾æîæÊYàÕ<Ù9ÌÌ`áTóží%ʽž' »ï }Tÿ¿ZíHâî²¼¡°Å4æ·Ü)¶Ï«î¢æ×ùkƒb/>Mý…ÖQ5FÓA™ºæPÎúPP2·´+G,Ë–ÏußG0ÀO1|Ò]C¯/…{ƒ°VЮxBû˜)½5ÛÇîKQ ;2ÖUÙ8wX ?°2Xec%;ò ¯ßéÜJôéå7¶eîúsv»AKcÜ=‡³€ÆxÀ,ðYà±§C•ÃÃ?€tnÛE<ô…Ü¢ Œ~…ûàÕ<œŒ¿ÇÉ0Ô;]ÌþÕÄÇ$6¶Ód8–>v¸\~耽ëL•™¹tòxÞáê. {ò*á:©t>?þÿs&C endstream endobj 6277 0 obj 5556 endobj 6281 0 obj [368 /XYZ 38.2500000 116.750000 0] endobj 6282 0 obj [368 /XYZ 38.2500000 595.250000 0] endobj 6283 0 obj [368 /XYZ 38.2500000 377 0] endobj 6284 0 obj [368 /XYZ 38.2500000 116.750000 0] endobj 6285 0 obj [368 /XYZ 38.2500000 595.250000 0] endobj 6286 0 obj [368 /XYZ 38.2500000 377 0] endobj 6280 0 obj << /Type /Page /Parent 2 0 R /Contents 6287 0 R /Resources 6289 0 R /Annots 6290 0 R /MediaBox [0 0 595 842] >> endobj 6289 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 6290 0 obj [ ] endobj 6287 0 obj << /Length 6288 0 R /Filter /FlateDecode >> stream xœí]Mä8r½×¯È³ÉI}ÆÓ]Õ|0И|0|0fwm,¼ ·÷à¿ï¬J©ª‡ÊG‰/ƒAJ©ìÎlkR"ƒÁøŽ?ÿÓ¯ÿqúÏ¿Ÿ~þüëÿœ~ÿþù×§êÜ5Õõ?§×¿~úñlÿùÔõÍé·¿>}?}úúôõò¿ßŸ®?øõó¿\þéÿNöôÏ—ÿþåôoÿ~ùÃ?ŽÿÒë¿ð×§Ît—¿ÿ÷Û߇Î\þ©zÿûëŸÿ×Ó¿þÃéo¯oœ>7.æ÷ÿÿ'×tÎö¯ËXøô÷§i›æí¯¿ÿö·§Ÿ¯ˆûJgê¶iO¦võÉ µ=ýþ|ùÀôúê<ÔÆtmÝU÷|¨³¯_j†ËGìp!ûå¿þ‡Þþ’y½Iðò¾wé^þ¶rqªךðÛÏ}íŒëlS¿ôë!7}o/ÿܹñ?÷íkpÍxàÕ€lï¯Op&ÍåJ¤;ð·•‹Se:püvÁÛÜ }—ðp?^Ÿ€þ­rÎÛÊSnàí‰oskÍD´.Å™|¼>ÁË]Ÿðåo+§Êxà· Þæ¶i&qW'ÐÍ?¼>ÁËÛÁ¦{ùÛÊÅ©2îìí_cÞ‚—rý`?~üðÓ·§Ÿ¿˜Ú\ˆÙž¾ýù²¸·o^ÿöíB”æôÓ«Ñxá¹o<ýãeIî§oyέm¦%^ŸØOè‰kÑ“ê |2ÀïÀ'UýöäåÛ…¬É)ÒãWMÖƒŸ¸îR?qðL0Mcã÷cˆUöƒé6èpWõ÷œ0¦/æßÏñg‚o]õëð~ȱZ¼\WØîàŠ5ûÁ+À2©‹_þ–pê£â¹¯nî+‰û *lólWöµÍôÕçÖÓWnÙ&Ä&æEÌWX¦àûˆõ#^¾uĽ/Ùfײ‘ßù¤È±ÖnàL4ý¨¾6‡FÛ†F3ñÅ–Övm°¾}ÿª‚Àbêêm1ƒi~iësí® Oÿ¢÷ç~¨ÞVêö­'|ò}Çà·Áµá· ï~Ç^ÙÍTç¶3ýåáÇ!^¾¿oI­$‰Gûã‡%]•¤;7uûºøÙ¢Òœp_¦"öå¼×x‰áL‚¶‡‹…4¬Íê ¨¡W%E6L*ˆP©×f!öƒMB¨ê+õVí„/_žÂ%;>Óž£Z`|˹F×/Žæ3# KlÃ`»GL!BjC3x:ÉÀG Ñ Gæq\d)–x+ÆA´0%ûTvb):•в0ÕPû¦En9:†f¢Œ=tJ•ÌÖXŠ‘™Q»­ÿ-åC¾nÀ†b,@bŒÖ¡rF‡õ©…Ç'sý296äH.v‡Þ£ÜN.qÚ•€ÇBÈç€ý„y?YOjüáy‘¬ïDô#áÈRà;L+þ–ò¼TLFbÆPxFJßM–¡óCø ¥<Êõʇa$Gv¾;2*Ͷ2¾½}o&ˆö‹Gºq\œþ.À‹Ú}2lCìÓ/-K$†?˜ß`Y€WÍÄe™tÃB¢n¢°bbn)>9lc0á^&ya‘,ÈÎjø¬§5Ë5¢˜{ƒµ%¬ÊU‘=qA¥X‰Pæ9¦Îz¿€ÉÓRh"9¼åˆ6Ÿ—Sß5Ý2Õ N¶"$¤uS’(àÖâƒhAÐì4%@£nѽIxqìüæàj.YF«¢ÑûRDÊÊHà3¿:.êÁ¿aÄñÞ¼øúyÜiëð'føÀ‡³“Ùˆ"«£(ã†-ü •ž©´æcØ µäëlOK>|t<.nuİŸµ| aÂVkõ‘°æ1öܱ€^_•ˆ¯M¿QÑøáºßV%1?1<|é•ÂåIäjÚêQ[·ÞÅ;ªG·W=êzãb~í¢kO§TM»É#nþÉ9„”„ft“5â+ÿs|ÍË+ýÚI!„ˆíèðM\¨_n[ƒ½’|•'›\!õCãÛl¢˜ñÇ4cOˆS)û¸ÜÙ/…—áÇA¨(>cJhª Õ?o`fØÒ/p9E-&X+\%/qê²½À¥ºþ°ÉU3—‘ µ9¦¦s=SŸ>ÔbOâ›ÎX´ª–H–‡eKð™Dîa¥./ ®áý‰Ø_)áM©LL„UÆÔ6¥¨6]uD¬M%¼ˆ€˜µw›!'lPÝ̤¿lï1¶È r >ßÔ “ÕHLY£”cÌ|&ÆÓ 'L`ãt™v8'“ì¨^2œ¯Ôs$;ÿP8௠TDÑ‚OA¥g°ÆS›Tí$ÃD'TL³n€bLßå(jÆÊà'D„#§hF,&l·"…\³‚ÚØ:–õíE3?ZÑ3Æwˆ¡X@@ocu½ÖXµ²Þû±V]®N[Ò-Ÿ¶RqcR‘ÁÞ F*Y_²Ã)ÔœÅmÚ™ù Ë0¿1c1ð…ÊйÆÓÂÙÊé(0,Ù ™ØµaÊù ë±äÀ•VÚùq›n´@wMekÔ)Edr1¹ú>Ë-vHþ}Réé7ÆŠ”ߊüEd/)´å\ÑR!€B¬î¹ „8‘ÓÐ1W+è•-/Ø"ï ‹è’1ÝA!&f#}µPLEñW0¥T6­/–ì7‘ýÞD ¤ZáhD•+Ñ#;Ù€’½mY88+k©2Em"u¡³_ÖŸ>××ÂFˆ`o¾Ÿ1Ê÷—Ň*:r½(ö2á Æùºr¯ñ ì|\YãF‡&Sr0Óm Ô¸­‚SX:#sŸÈçØŒ1ɘÞe¦ŸïGÂäcÌ`jI)ú%1IúV]ÕË‚q§™1|L ²ÄxµébLÕùQaòÈ&2a)Æjblç±j'0…¾N*Ê'Ë©9âËÁÈ‹Œq'+Ó)|žYWí Á¥›ìZ/0õJÕp^¿cìyFÈÄ•®¹€ø¨«3±r¹â2ÄÁY8¦ÐI)f+ìl2áÖ‰™Ö˜fÚ4f#?"$¡dTK†ž¢2êjsj÷§aHa 0ÆjvëA¶S0`‹¬D“Äu½/½°rb,Í‚€‡³©µÐ „'Zî]?ŽCSrhó=Ê‚ì0›ì Ú$RÙ_ƒ¶hÔ…UÕ5ÚtË©Ž(}ÎÎ]‰mp¥ 1+D˜ÚzqÓ²0•T V¶GV+£¢j€$m’¶³¨ù÷Ð…a饄AsG€O€%Lm*TB9ø\QM=fo«¹¡¼n=1ðÉŸ$G™p3ñ¨Ös'‚8-ò,t ™_UÓja¾#\h'!ÄLoár>Úž²áÙ8_2ì$ØY^D11ú~ $VvìWâr‚~Œsðùû"„q‰( SÑÐU€»”Ê`µÚÆd¢÷hý{ÊÉ\"~RüɾöýˆMFîñuÀ8jŒž‰èùÍ»?N+)ÿI8å]eàTèªóo“û|^  vHnMifæÀ׫°nû÷ÖX[1K\@wäYÕ¥u†XéàóW#lÔ1I9ƹgªŸb¼%Hâfów½–ÇÅGÞ3t<[Î{ÞÉ™Œ“)ÑI•®3³,·CçëD¥ì^bV¹¯¢'·4C­èИD¸¹q˜(rÉÆfK«˜:RÙÔf \Q Ç=£'LSp # OŠ<ÙÏ4ëLtc€õ3u²ÐË6™ÅD7pÌDÂ¥jëd7,éô±¸®rË×,Û„ùm"‚Dè•mz}S®ª#Œ©ÀX„±¬Ë1)këI­Ã˲ÐZÝû²}@ZX_²…x"iW¼ô4/¨t'¦K¶Ðo’²f&ÊVÃ(Û* ¡öìëÚמ’'S#™ h$Qñÿxyþõ¿¥ðÊduÊÞ%¬V ,SÏȾ1Ñ"YŒÞ˜Çlת2Õ¿ ‹ŽEÈß:Ÿ$W™2(ìÚÖ«?]!´g—ç £ˆfËÏ0£ ó;«ÛLUʶáDÄ– ýlɆ~2Ÿ¨$žo=-´8u7´º#ór” s·®‡ÖWp_h)ÊO˜^/¼H¸?™áö„ª+µ™/®žÙbn<7Мí¬«Žÿ ^ÁX}ã7£%lê)@õ±ƒžŒ|õ*]ýªjLƒ+÷tg7;ªýfäžßyïr™Ó͵AŒ‚àÖªáNÍKüw¦ÊòokГº…oçýîçJÑöìÞdÈ:êàâÓ†gŠW€9äÏ_±SÌ;ó©”ü±¾zÿäõšG¹ö²èà‘*lÃäçñ6òÇHDÜ×õåa©/d=øÙ¾ˆq3”Õ’Ï&?êYïÌX õ–¶VÈQÙ!LêØÔ¾¦ØIyK¶Rë‚ûŽô¢¬V£FÐ0UçD©@nôn{,#€Ö˜Ô.¾² ›ŒÜ(’zJ8ò¡ñ´gѵd O,‹X¼¯Ù ¶xv“îèQ•JðÁ·á¤Ú­KlP¶rHõ𘒠ùN!@öçÕqª ¦6ãRh"Ñ¡ôe2uãø¦mšo A®¿¬öËêÓܦ¥³-¯¨&ªÙ)AÅØ^é|\ç[G‡w´[ï¨d¯`n©¤íAN³‰váSÍ©D@uƒ¢Ãv˜ñ!Â8‹¢Ú$ÆœÒêôÁ† ƒDø8L‘‡–k}‘zg*JEts•+ž\ æ4,R¾QLÇôu™éë1š™»ÔpwÙSÁ“ZïJ1v¦Ò]N¤l¡ü–;V•¶13Á$2o‹}ÐiÖÎzR},é½1"0ð)\8xëÉ'ø¤…+€ocöã|R§V³MÝ{'²Ñ†ø£=\ÀÂ'~ï!ðƒÐ£UJÝ<²ŠA!.XØ,fR–'Yç ìBû.vÀÐøÞòàaY; él5Û­VÐÜ!³…cywD2Iw÷-šw>üðQæô $UpΤÀ5fæN0å5"“Š´šú’ë€)Ú%ÕøB1°½Ì{ˆÜ臔ÞÚ¤#{gݧi¶9³õ0 Ó ¥i¯Dv^@™„ÜSìÃÌÙ ñ• Ré0š6a4ÉïÜ0¾VÄ–±L¶4¾þ‘¹KÛ8¬<Éó!ÅÊN†;žzM³¬…Ä]§†2=G*ÄÌWí‘>\6˜÷Q%[<%÷@ˆHä7Ô‡ YÝëó:ÑeU"3H4¢(ÂÔ$¸t¾hF¢å:'|{*h©åáMZZxÕš'ìªFù„±¯²i §sZ¶ÞëiaáÐÅë W;e¾|=o†ê ·ö8áT'|ØâÛ–±Iïf¸¨±­Í{yú58×þZ^Ë̶ÐDÓb’¿fú®¹¿%RÈÞœ^3ØøÉ3ä.¦Œ™°À´ænÈ&Š«bšF$`ýò÷T,N®KÚôÖà€ÞÃ%°­œ§R)‚`6%À‚m×»ï ‘IK¹Ø®ž'??º’ìÛ ìÝ•4ìOf¸ hÚ^enóîÆ|™¨p½.³ÅÜx2n 9ÛÙ,š:þ7#¡nýf@¿qWþ5v~v¾í3|i0f _ÍÍa¼ íÙ{ÓPºµÓOðmz‚iðC€fõÛÆØtwv3¦ÄkkÑ O ðÚl•Úä˜"ÝCó{âÞëÅñÆVõà ²¡ðw™!¯ZÑ‘m"s%†ìËef¨Ô™ÔÎ1íi÷¢$e°ºj}E'ê}`“SnÊò»ñG+ž=v—‰‰2B~U6ñs_ö?"|—ŒôH‹‡R"(1G• > endobj 6304 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6305 0 obj [ ] endobj 6302 0 obj << /Length 6303 0 R /Filter /FlateDecode >> stream xœí]MÜ:vÝ÷¯¨u€WO¤¾`·»;@Œg ‹ ‹àÍL‚Afgùû©®’ÚÝTJýï/‡û÷Ó?þqø¡×øëCkÚÓŸÿ}þ³oÍéoÅÛŸ¯ÿþ_ÿú‡¿½>q|ݰ˜ÿÿ—²îlß¿.cæÕ?ÆÏ4çßÿýo¿^ö–Ö4ußLUVÓWöð¿zøóéãã‹c_Ó6U[Üò¢ÖžßT—cûÓ“ªbò¢óoÑã#<¼ém¼‡ŸW.§Š)ãºrs»²dª$úùøïë"ÞÃÏ+—SeÜ\ütáæ¶µ¹¿,õ$z÷øoª*ÞÃÏ+—SeØ\ÏÓ•›Ûš:ææþ||„‡wU<±pYy´ÍÅO?vÍð þ|w÷úâ¾lNÚÀt‡¨Ú¾3EwÙšºÕïÍϧGØøÎ4ñDÆeåj¢ L…~ìªÒ”­­«×]~Ýáºëìéïm9üºí«¬i.$³Eho±#•¸Ýç•Ë©2î7~ºò(Wý eKÛÅ OˆŸ˜<âæžW.§Ê¸¹“§ y ^Êå_€sùÃsãã÷‡__NªãDÌæðýϧÅßyùãû‰(õá—W_éd¶|ÿãá‹ÂT8|ÿËCll=.qîJÑÃ{ßV–èŠ}OkàÚ¾Wàªñ=ø{jü=6üi¶€W:t¥"®””º=?±}tŽ-Í Kq9Ü­ÂHy ò²gÕ+ðÓð©-¾À+˜:ðJ…¿¯Ÿ3ø=? ïqÒË–B ï`Ù‰Wi`±DÁÒ”iž/Åûƒ¿Ë'¸,¹Ê>¡|ªo‘5åS•6½ü­=xeUœ_Ùž,<ç0µM}¦‚˖ݱë‹WŠú|¥<ÖUÓµ®\Ø¥sOqu¬ÊK Áåàw?Ú ÷ Ûtm%^/¶—+ÆŒË_ð]Ã1ºðéRãœ<äe9í+Hf%˜Ô—5šâØœló÷¤.»XfIcŠ6|±ž|>_©'¿Â,½‚׆ïÁk›œ+H.ƒ?ÞÃì-~Ï`ñE|b+=Ô 8”˜(¶6å¸Ú%(å|¬\.0•n„µZ]4ŽZóð qd=ÛJœÏ=xó°ÊÅß³œ×=S+Çðg`‰Í¬mK*©*á2ÜßC‰†Ä óeÒV<¡÷”£T7-¸Bi /.›M#¾·$ >rZó ¾Ç#‹¥ü½Ó.¢|-žú¨=뜰ÜÄ(¤Ã e’y çšõœÙÏwÜ—ÛŒÌãKÌŒÔ0pá‹ V^˜¹ð>im¤õÞœ•– ¨U•³$Ä–<>lϳã2&ð]ƒÊØÈ´½ÃGø`kío†Ã0¥͉ÅD*K€á~L·©3‡?¿˜ð/éí1‰ƒâqLh0‘=׿1pÀßÃhä{¸ ëÏÊfçr¦bâÚx±¨t…VY¿úÀsáNj ˆ aˆM¾<KybøèÍ隘þ§©šÅ JF¤²c¡?ÃbÊÅ왬ĪíÆÅ| ߦÄÀãB-?yâÀk*s/ =‘Õ‰¾‹ò¾µå÷ê” 2=Æ«#|FÈ‹«¼¼b©FÊ0âÁX­šc÷ sñ£ÀØB[š¢ ëMóy’iØ•âSLKŒi+hĉK­âÁ»Í|©ëÂßâXxTF€¸tÿaw%]‰’û!å¹åî÷ªÃ Ó:Ñ?ب‘Ž'(’jzWEí½ä6g£ŸÊTCo:ç:ÃÏvŽTcx÷Tnãê\bå p};€¤N¹6âYÁÜ&FÕ q= ÆWÁæ8aꊃ™xãñV-óL<]\6±zTó*P­Ÿ9… 2j Qð—*Ò§‘³‘Š eŒqéˆÁǶ ç†ësx>s˜C0Wa‚wê‚sU’ضò·Î„únäB¥Æ$½oQJÚïX Þ퉌µðéð <.ýòÎÄH*©j'ň”Y›"—[OÍ¢´r# ¿f'EmkWß1µS’fìÕ 4"zW§ñÕéº(¹ª§Jà'gP‹ÈHT(¯ß#n6—6b+š¨X飼öšq¡ÒÂÏHla{5h–;Xç}¶ÕÂ3?4•ê8`RÝx²@ô]{¢åÝôö¨·»é½q# ¶ [F”ÔëØ”fÏÀaP™ž¯}ª­RÍ´l|‡ë½^Û©wC…Fo±àð3\}ªnP¤FI-i ÃâRA!ÞbÆP´‰ Æ’ÔBúâUOÊeÉþî`úk"Ö¶%¬ym†K®¿psåÊðEõÑN *é==ºg¨n1ÕX£ðóÊø4ü¥îiå¤nÚ¼÷¾üÈ¥øi^y†Oƒ_êyZžÆ¼g8A×èöH¼RÇó¥5|OW׆éfbÛ1£{Þ¾ÙBÿŒÁ ŠùSµgØxÊý€=aÜPý&k'˜×wò¨‰ ‚aþic¿âNø4jâõNÄÂ&Á*:îo/ò—Œ¿8¤¦i9ø¬çCUqmš‘ó¬}ÌW=WÍðÔ" 6ÊLeˆCànQiÖ€˜…b'©¶PÆFßô%©bàLE­Ð)Uðënàzïa‹ÁÿÔVÒà•am)E[c©…XMæh3J~bŸªLQ{¤1E—ë@j±ñ‚åsq¼þ­-:㪭sÉ!=‡ñI˜)qs”bÄi"cïí7ù*ňj¬Œÿ§…ÀJ½¦Mé%Kk®…¤?g ÷˜xÒ'†ôaL!­Æ ¨r#еÁþÝ' %)ôŽZqcZWåÅIm¬km="<¤—m”K(¤±—N˜€R"¸ª‰~j¦ˆÒkí°Dí01)Qd!+%~ìz·DY ¦^¦²„M JâŽ?£D~tM]õ½£ÎòuÑwÇFU..5 ‘›R×›Þýªÿ®€‘cT~PÑ]/Æs”J¦äRSOµö\NOé*Q HÍZˆÑ³u²¯˜¬yÎÝV±ë'jaÆ<δ¬RAȉ'>¥êø`êÏ&[2E ŠYËž]PÊ'®³I('™UÔ“ÚÕµf™äë;Å öV»½°ËµÎ½¶’Z¬l±=Žß0ó-  ‘˜5èÙDÕ[”&Ȱ±-¡x)Þ6úc½b„€‰cD²`ýÒ’¶çMmèCœ·Çi׋¶»u¹SšÑÇ„ iž¸OÊД'j+Xiî>þžïz[ôÁ“† n¤BgPŠéš¡è§ ¬.´3ÕÑšÅÓ@ˆ>iÃ^ cŠ€Ij%›`³ÖˆqD˜ ÂtM¹/ùžA7Qîâ>þ&¥÷ªë>¥Ýwöì~°Ž®²¸;˜þz»ë™iÊâMþ¾ŒT¸~&‹¹reø€úh'Ñ¢Š¸§÷ôèž{^ã}}ùQÔ<¢§Y‹î) Ñišq¯\qôÓ'R¯e5bŠàÀžd*8S»ìy"›+¶ô— wÑ1¸FÒ¾P-¬"ó=©¨£­± ÊÊ$p]›,ÑTÇIà×áK FdÅŽ©eºÒQ39!´z`CÛV* %ijÊ“ÉǛδAiý§TÛ¸•Éɪ'WGdZ/–§%—Dô@¦-•YÑÝôŽL´<]Ä”EP’wi«>R\ãxµèÀjã¡5‰D c,1—õ䜲Á¾“2ÂôYßÈKˆo\¢nJÂh‹Ô“)›zÅkïÑÎÖ“t'ò8ªf qÐç¶©ÀaÂa¢0àùû'±ÔBÔ?Š•sPwY;zf÷ìÈ:Oí_"fÌÆèÙHá\ܘµÖ ¥(»(`ÍìQ†—xTE°RâQkPˆG5ê¨S¹nq¨cffMŠ™ø¢¤¨3Ûäè +º ‹/á´ ÂÌ[Ð €¶ô\e0 !òäÌðC "m?Rd)š*úëóÆQb=1µn];Û+Ž3‘æi .S±~ÞÒ¸çÒ·pmée†×—`3¼-ÉŠï+ó&Ö/¾ïà=°ø¾'êãe?&Û{­`¿‡ïù ¯`ê4ð=ø ,Ø9¬1àÞó„®$+ÿ¯êÖù€ áMŸ6íTeÐß`FŸ4AÁ0¬© í±¡úÙduŒÚA2Äì¦äCܨKÂI³ÂÄ_NU6 [2¹˜åfZ6ˆ¯1ó•q_*,ÙdÓ´Ó(âFóŸ0×TÏè|%¤l9®ÅÂÅÕÈÒ¨&-!Á jŠ~LŸZƒí¤ ­I”vËQ¸Ì{B$Òø££ìÏjÇåò1'*Ä”—XPHÚh˜ é€a¾‘ÃÓ|9LTT8ë(ºÀM¢{‰"]ÎÉšüL*e>B´ÛÎ$«‡Ý{ÖzS“s«£‚õ ³„LÅëëYjOÆ®0@YÚP6UÌŠ§²q¶h=S-ÀwOURGL2`d)ÖR†—²–¥Z…É´æâˆ?ÜdIkÉNêá=Øõ¨@®¶Ï7gÿ ›b®Y=sàwQ:úŽú Àx-èÇ|· ”ŸÚ¶ÆèJ–§ÌÖzMRÐVÝÇ“r¯ÌJEùflGHY ÒvÍ,>Oe–¶úé^ãtá±®¨WàìÎŽ•ŽÔ8uo G.ô¢÷lK(tŸÏlÚò/Ûþþ°$ãjé/i=Åð©’\©ŽÂ®-Që \åHÕo¤ŠÂ¬uÃá&Ë„(¨8\ËÔ<+æ¦êΠþNZ=Ãd;ð=ÔÎÞóÝY»0ùGøãâaX×G½—ݦ&o(R‚…¼F@® ¥;owoÇx㈺z$’¹‹¹reøøæØ¸H ¶÷ôèžÁ90íT” •¶ÕqRórÙ2k¦÷à+ði#æé•÷ÀUH­W¾ô ¾§‡´¾ˆóöØwîÓ ‘Žkûs¹çtèi´&ü|-M ©‚¹–øÏŽqW‹sí=©âŠ};¶&¿‘à”*Ú4žq¢a‘Ò¼ìD[ù¢­Ms&•š»L½‰÷_‹³|>Æz“~B†;å%ž ƒï“‡ƒ”^r…êO5$Z/ÕÎ1šÝí˜áDÛ»:1.P$5Ö/QŒ# ·{¤#/™+û¤ÄŒìZS w*dƒýlË…’GþK¡Àµ¡:jÞm"D›k]—6:ŠG HrTÊàÓW…Ç6Žn]?lë‰Ð2‘ìâD¾“s`ö)¤ãYÛÜÇè—y0þ†!õì­0‹£`7 +¸5ìƒ"M ë Üw¬‡¥94JîH:…×>ò¨l«fxH6_çu¥ËWŒYÂÔœáSL ¾Š;ôó7±\\ƒ+¡É8趃¶SJYj$3>‚¡:ÊWÄ™xöj½v©Â°·ŸÎ€¤x¢¤ ÓBÊࢴqS® £VÔŸMÛ9úS<ƒŒqån¨å#¯_ªÇ¨ÀOJ‰nF…,)cÍ· —‹äÙÓ]ï^ãe0‰µaªb&ØiŽé¡ša8–/ô±©"™MùBìta„*zd­{˜‡hK¬›qg)·lõ´ìFÛ™¶T»Ÿj6¹¤¿51²«(B-ù7:Epeo §Éáß]¸ý»pâ"…å°CÔnø>©Œ½ü£Úš‰½ý5Éc›‹à©ß^ù2Z+“ˆ'te {}´¦ ¿g`´k÷ôðžnÜÄ‹‰õ΂~ ¿Ç^Övò]» _ÁkDù«ïéÞƒiÝ@ŠZâiæoåäX`ŠŽUåYj¾¿ç ­`l¬¹²¶¯pm½gÐ÷WÖV<†¯ U+LWt#r™Çðß{!€øë‘‹ C¼{©•*Ëœ³Z¤ÀˆLZd´©gŽö‘:ðDØŽI’#Š…Ó:Zl'¹•Õ²ï‰',ìd6ºÔg Qb7V0…ÐRô·ýgX‰~rMæêJ£A7¤ÿR ›v§ŸF¥Åˆ¹ã¶…W0b.FoÆ·1—Àöà C,]fšº!¥=kØ´Í×`À§yð„¿„ïœg¦=ä4¦Þ9ŒRW÷ãJ{š1®4A7Lƒ ~OeàHkíÓRàJÏ„{L¿`x.ÓNŒeV‡MUà35n™o·\2•—g2š8œ€Wp!è•åÔÖ•Böyºp˜ŽçD=þɆQKv@šå¥âÚ3OL0nìrù@ ¦šP2\mÍ!ºui\…7Á¦%b,Lÿ?£iïa˜Ã0±p2.†N…UA©ÂÊA™þ$Á–wÓçdSnç£/¶zC«‡žsÅã#Þ°Å1xÏ vÓP±yËÖc¿¸ÂL±š¥È5ú dLìÂâ N?ÍHy»vÛœ¤Ý­MòeœTÍ“6Η™p’­ïœ´§A¾ôÄÒÓÍNìÊjœb˜ÌÚ¼gô’eôRåÆ0݆LN^nÊñá•{'cŽe&°â÷ AÚ =ñpÎæb¾”ΧŻ€)Êì‚vª®gb51%˜š¬Œ i€ó¯EÊóÜÙYŠP3¼‰ÉãL%–B ǵød`îùFg`^&VMÕ”H}jÕðiu“îœUÅXï…õ¦…{_àz"¼'Ìôv|…±¦&uðÚ°U‘ŠnŒïwÛâÓDÐÍ£Ÿ±ìÄ»À|)¦þÆ÷àj+|çJ.5oñ뽪z Î%›t%Å=ÐÖ6Q5G«—Êh ‡WÇɹICâ{•Ðz@€‘G­bpµÄåD3=fkdcª®qôSèÇ`F{ʆ˜:ãŒ{§Ão¥M¡Ì@À ãú‚Me]~ÌÅø sÒrikˆ(;Ú¦söÊsn\<,ª˜S[$¬ÅI’ §Iñ=™Ï M ›V+›+xúªv=¸Ä!Z¨.f(Õ£¤Ð¨bÄ›ÈøeÄUjÌ„ÔGöˆefÚƒt(â¶šÄ'æ #õÝråýÃø5 õ%Ö×Ãrmó‘ð¢ÌK”ìSÔ ‰­CøßÆy§ÇaÆ'•‰?)DD콉HÕD”°².‹íˆ†°Ò¸‚a¢ü™¾§ß‡'BzéümîH‡î*´ñ‰— óÊù;–Àˆ×ØûB¹ö /]˜Øí¬óݕ˷6Ó+ö§=6.êäP¼€û¯¼§œÓÊ×Öö2|):üØm¨\ÕŽßšéGÕ±Ž¿ò? Þ3\ôéï:X†{ý{ñV©`1ížÃY`¨ c§pÀûêÙñ9ª†­z9öeµ„'ˆ/Æ|4`½Tk±iAßèÚ àª™ïñìÓ3’†añNŠ=mQa¾ìdZ8üâ}•ð¬Æúvøöðÿ9 °7 endstream endobj 6303 0 obj 7094 endobj 6307 0 obj [370 /XYZ 38.2500000 568.250000 0] endobj 6308 0 obj [370 /XYZ 38.2500000 568.250000 0] endobj 6306 0 obj << /Type /Page /Parent 2 0 R /Contents 6309 0 R /Resources 6311 0 R /Annots 6312 0 R /MediaBox [0 0 595 842] >> endobj 6311 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6312 0 obj [ ] endobj 6309 0 obj << /Length 6310 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sؾ€ €«9$ ‡ ‡ÀޱŇüýÌîã9_‘ýMu‘œ¥G›m³»º»Þ]7üü÷Ã?=¼yÿù?‡ï»¿ß~(ŽuYœÿ9<ýùîå/|sì~>ÔMyøþ燯‡¯Ÿ>þ÷ëÃùƒÏïÿ|úéøÓéߟýÛé—?tÿÑÓðóCíêÓßÿ~þ»­Ýé§âò÷Óïÿõð—ß~yš±_®æÛÿÿ]([_O`L,ýõ¡ß¦{þóë÷¿<¼9@Ú*µkÊX\ ñàÚèÿýÇçúé‹c««xúà†…jÿ´Rlëƒómq¾-ôüGgz—aòÆÇ|“?C®~*.TNžýØÄàBíËøtÑO—\ž6zú¹Ý?7Z]u‡Vg¹“Ëôú“·EÌ7ùrõSé/Ï®HÍ­wåù€ü‰sêŸÿeú—Û6ßäÏ«ŸJw¹Â왩¹-KŸ‘š_LŸaòÚgœüò\Ô,Ì®IÍmÑ“Ûé_ý#úmzõÉ}Q´ùdórõSé/Ï®w¹¾p±ÓŒüéýó¿LŸãrCòMþ ¹ú©œ/÷ÊìŸRfÁ œŒƒ¯Â‡ï¾<¼ùè¢;fuøòã ¸ç5Ï}9JyøîÉ"8I/?~©üÃáËOí±òeâyÄ×hÄEøMFŠwpÄÃu*ø „Ãæà~0lŽ ÛÇôýD[tp¤µ™ Ÿh¿)â~àé”p|?¶a+5ïÔáu0Æã³†ß`ìfƒ;¾ mc¬bNÓÜûŸ(A & #p6ÿö¾ø(†:@ìÅr.ÀÙ¬8,†­“Û_N*Gvm¡¯îîªÅPcØ0m~ xä\öÁ|:ÿ—§ŒðÎÿ[?Í1/Dz c¼aAãÁëcÅëáVXŽ×°ŠáðD…|§x?ø¬¡µ ;[XïôXO؈õAŒ×›¤†ã‡ÖŽWÎõ«~0\5̰ˆð°`ŒcäŒ0²IeÍ´¥+›üâº#µ,µ¶*¶7hmVt&ÜýÚyqÕ,Á‹›z5¼xyN(piÆ~…°ÝÇÅ´µfO|`¼¶ºXb5C°ŽA@½MZÀ|tí¾.ª$<Ã0^2<cå+fðß½¡&QûrM¢ŽqÓt»jí¿+íÚÇ®}ìÚÇ”ö±vÉ[…IxîíEd›ú‚©oúw2K9ÞŸ0äÒzð´˜Xœ)«á5ÖUù ÏP<—Çà÷íÈý›cÓß~ãÎWïBÿÑÉã1†sÖÓo{›®8VO—SŽ©ùm’'iHØ¢F#1 uð6ÆÀâS* Hpú.¬é¶é;~Že¬žNzÄOÒ@bnç߆€:ççú ÍAÞ޵ʅáÃ'Æ—Œ·î?evÌà¾fR|´cÖmÑ;å=f̈n¨#cJïCµÕ“|cI‹Ÿüòî~¼SÆÐò“–Ÿ ¤øQv”ë2¶NûÖ<Ûê)£ªvÊØ8e Áâ³m˜2šrÒÉ HÛ®[Ó°*ôˆ’ˆÔÁU÷ƒ]©„“ó>Wà”B<ãâÇ<ÉŽêÚñߎËÙšmQ_"½Î×sÅ¥ˆ]-‚ë’ñ¾$6èÒy×efǰ°Ê$Øqˆ]¿øz¬Ü؇ïgt\Ì1fb—"þ»;0±j|pdì"ÅÈ ·EØ>â>B½êà :¹1)¸é7ؽ™^óïã{Âoø ß ïïžß$çÍ(Kï"ZÌC ÆhxRcRšÏíæA=nŸ°ŸÑ¡à÷ʪ¶ÐVø†à›Â¡`^AŸî &³Œ2X¤ ,œ‘¹XuP•¹ /ïbíÒn!¯æ(HÉMkô Z æub)´Êx 3ùwÿŒb³mÚ¡Ø\Ê‚60–³% «®»Â0ŸÅ‚7tôÑù CˆÆþo;6Sõ7eò«°L9ÂÚáq c ¤ãDë’‡›9÷ŽAÂ\L•1øBÀÈ>¬aá{Â|‚)‘]´ú"p1ÅÒQaÌF=ã­¥´V…hN†‚˜ÓÁ;]é|’•atjá×ÍÁµW©¢z& .Dñ±×ŠÎÑ×#ëÊH·£òè‡!Û¾JÿFX§…ë¼ïÙüY•{1ÛWžm˜; lúÆÃ uG×ÎZ곬ŽÁù«ç•oŠwp¸Sa?\ŸNéç½öÊ:p§Nzí~ˆb¨;t {ñ:ðN»ü¹üš«/q Ð-"¨ËÄcM˜É”›ã­Z*@Wáèb®a—Š£ÎÊ¿Íø¢˜lüF­GÊ3 úT¡ãÍbž’GÓ3¥»Kw8[NiV»8Û3²²sá:R™÷ Os-–˜‡O–±×U¬æÇ”@5 ÎLÍÑ}>Ë6–7ì³)Ë¡•‚cªqaÀ·¹ÅOÓÄ!œÙE^Ó4C‘‡í4 «Œ8ãÏTõ2TŒu©±`Ãgát윮<C³‡&\œ"ÝÐM"¯wÏgØ#hytÃv ã²XŸ:³FÝxXcìOÆbÄt»‚à•¼¤„ÀüIcÙÀëØ–Ó ŠN]A›kázLÑü=az]-Rõ= óÏ„ì]H„í œ…®¡os<¼ÎÚž9“x¼P&Šñ¡39(o‡Û`b™TÃm +Ò´>^’Û–/(¾gššeš:|LÎ>Qð”jûf”»V5,¬º†v­oúÚk¯Š‹WJµy±cZC-I&ZŸR Nqf8›°SÈ/Ø0L«+FÖâu¬Š 3-p±DÅa1Ôº˜È´Úݵ$e-iå hÛàûš/¸Äïä{‰‡0Þ#¦&a6,Á˜&¸4²]Ùð6ÄéFÂÂîv^±^±|í¦1ZaXÕ'T·´ ¦ êï5n•«æ­¢ÆmgŒIº\„ÒŠU5i¦ Å— ÿÆ1/WÁáb‘ û–1ÂÜÊcÇÿ à¿»©µì>² ouqu[`é6ÆÜhë$KŽkÚ$špá{¨S:¦ Ÿ+¼Mì>€»ó¬£~o,ë<´Éè§= #›´ÍW‚uÿ’º|Cº¶ ½ AÆVÍåÈe´©@&ƒÒ¥Bº²"Á. Íd¡ÏA4Š‘3 ¼LåâQÄ0ofâõUêÖR_K”vNÁ3b:ÛÊDy½ÁêBÎ=ŽËfRñ˜ê º—Ì”à#Ê…êft1u÷qÝ€õ2'¥”^¡ŒQÇ“ ºß^¨Â9ræ#·a¨[Ý•å±*›n±"D]"¡‹JÕF¦}ÂQ«&¤en_a™T^:àÝ[gêh›_]ºóÝEÝ‹Šß‰”;¥®¹¿1~}ŸzI´Á¤Ko¼b’Q7ê“&1)ú“6Ž—+Á¤Ê혴٠^ Ñ#†Ù–Us‹N¹w1÷³øËÏ늂¨Úöv\Îÿ^——$²½‹ñ&ÜBØ»À<)—mc~ÇVå>ƒLOÕÚ2Lmbåæ»VeóRP-ÅxÜ„—ìM%znRõßÚæ©>2­PtFõê²6-®êûÊTæ7ꓚ¹Ê>sÏYZÚ%±a¥B2Ç¬Š·uÅcй>"í,%^(o8¥F '¡”¢-‚°c£Æ TŒÖ–‚†Ý2é†Å¨rƒ–Áu54Ó ª£,€˜£ë;Aä…µ¢k#26•ž«K=nëF%—À4 ÆÂd¾¯¡«°•føàZò8ÔÊ*ffmFø _Y&¡X’J™ü-Åa-Ð!¸Ïúxq‰ ÀtãlWÜn5AŒÙãÒVàô…ûI‹ªÁÔ{Û,2e4E•äÕÔ FÐÑ.U=IV¾QåF4Ä3u:Ù%kUŽÔ£‘ÇK£u;ÀŽ }§6©ˆWT]e"œ:iõxEõ"aZ¡itõ1sxÀÙT€5ÓYt›b1j®ªv!„A ‹âÅó)'[ñå´ñ\ÑNŠ"sR""¦+'=ëŠׂ Umö(ÜCS Y/¿Ó¨).t˜ÄŒçY·gôÚÚ°g.ªáµm²¸:n.#¶b¨§Šlf¤#_úÁ(ÇÆÍÎ&Yв¨W‘åƒ2ˆ+Šái$‡'$ñ ;N˜nt¨©Ø…3¿ ¾„¨¦,v=©¢à v_^ TÆp(K{œn¬ØÎy! ªÅ0ÁC̳+ãµÒuÕj¸ÇÍì}|Ä*²‚1¾¶5³\÷òUºÉÛ‘Ah…ÈŒ¿œA~Iðˆ•›wý.Ç̆mÑŒ49œ”;¥Wduâ¹8ßà×ǔ`Ãä@„EPþkñÕYW¹ƒ”Õžðkå3vÃÈ}6ö¼òy~ÞZßL¢”Jünz H^ñÐÆÁþw£ÓÂèôÅ侮´ùÁS)/y8±T5~W9It±ªyÖ5ÿ˜¼_þÙvM9˜y ú j5b‹‚Ñí€3˜QP'†¯¤â<ÜFáÌwï‡f@ 8ÑwŠªÛK ‡¿I jÂj”EËô­ßàqYRTl²ÞµÕéX™Öº^v¼ŽrÝ]¿¤JT{¨Z<³î5é„Éé½­ê¡´˜{çõõ,QÖ§Jé0,‚‰mcåpæ¡MªÈxƒLˆ;=ÀBg±UHnÄ–‰Ü~Ê`•™3åt5pÆf÷uçâ‚ÙÇÁ¡26œU¼Ðn”ØŽ•Q’9ÃSªÕ'rocSá(D˜¢•B˜9úI×=£“ÞgÄ)•1rˆ¡œÑŽÎÍ×[vÞ..ET*ÿ šF"†ŠÄ‹jicÂ[|ãG´É”hÇßÀrëBc¸Ž0!ð6( |ƒ! Z¹ #¸äæo½RÖ’\œ ˆÕ ¤NË_8w©.ë!qbã ›HSE,1«š¢îÍ­”Ëè%„üªòŽÜ%7ó‡ù0À€*²^/n–¢óª™¹j•¬,l1É¢¢‚4RðŒƒ1fQ*£x¨²]‡?rïî¬hؤ¸ ÛNl3®ç•äýÆ'ÞÞðIIì …ûÚCcß>¾Gìõ'NQx) R…×x[Âk †šQÄ!l+âc§Ò7µîφw [ çG„ý`˜bž†1‘™ 7ì&0Ña:%(ØÃ›Ã#l°ñ:Õä›ào˜êñ`™Ca<üF¯¦È )QWÓRËâ‘ÿÿte»^rÇzÉé†C_‹zâØ£8&nž›²Æ»B³ãUÜs;¦ ˆZMãÜ¡ô«¹Ç!ˆcG¼Æ¬óàŠdÌN1Ôp$ÚžmyÔl§F®î~ëk/Xƒ”UbÆiÁë`ØB4䃵3ÔËÅh7_81Œ¢Ýöpjá5÷K¹Õml4‘CåµCÏ7™óñêâ‰òʧëLXgÙÜXWC8ó×(k†òÒ,áÈìéð´»æé&–·^G÷‘+ÓØ]Ì<\`‰pU1®7a?„‹Bpxàu°Ž`7²pÖøŒ!Œ¹Å<5`W†0°ó›9Ñ.þ'ÉàðNñ3"ÞvAa^…ñàu0¾aÁXÅŒ`¹x6LÛøyCÀ8›±+eÊ)a#wÛö¹ëðóˆê3ú æ4=S Át6õÉ {×|{Ã6«†›…0¥Á‚ ”ÐX¨à"(E–G„(è2³uƒ#tÃ’¹7+yd x9qnBóø‰u3L ѵâ f¸˜ÕY3ALTȣϩ>„z”…u!Õ@Ua?øN-µ…²÷m1Ú‚Yðãâ¶£rH ¡£  û…0ÔÌ-,.C©[н&¸ÃЪômp¹Moîž&°§ È#{š€È£ÉÚÓDŒ_Aš€/BèÃ2÷ í=h{â¶÷ íW´J·š{܃¶÷ mz§{Ðö´ÍIG_~‹üWÚBR‘LÈkBñ¡µ;óJç›Á‰o3WtsÍ™Ÿ ƒéªÍËŽlõU{heœ‚œáBSÎF8ÖgùC„ýPZ¬9>) Ðd—¹¤YT³9¨*¸jnÃúqx\É"Tw?Õv#VÝw¬ÒH¨zx‡F:H¤Ð:aJy»ÛÇn§£VmÞc†‡l GyTã v¨Í~lV^نóÁo:Iã’¶þ¢æ"‹pO?Ÿ î/ŸÝc: ø’@é(€ïU¸ñ©SMƒz>v"ÎÁ bÇ|=„ÑM“´“€× €P3ûîéqCY¼(/Àd]„cÇÌçQ¦‡$î…àŸ”XŸŸþFo endstream endobj 6310 0 obj 5591 endobj 6313 0 obj << /Type /Page /Parent 2 0 R /Contents 6314 0 R /Resources 6316 0 R /Annots 6317 0 R /MediaBox [0 0 595 842] >> endobj 6316 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 6317 0 obj [ ] endobj 6314 0 obj << /Length 6315 0 R /Filter /FlateDecode >> stream xœí]Ko$·¾Ï¯˜sÏòÑO ¯vä@X99ë8‘5¢ø¿ŸÑt·$³çã4¿)²Ù3´`KVkÈêªb½«øáO_þ¾ÿç¯û¿ügÿuüþñËNÚZ ÿì_¾¾{ÿ ÓÆŸ÷mWï¿~Û=ïŸw»ÇãŸwþ|üËñ§ÿíÍþÏÇÞÿð·ã/ÿèå¾íZÝ¿ÿûô½oõñ'õúýå÷ÿÚýõwû_^Vœ¶ùíÿge*ýÆ…­ŸwÓkêÓׯ_Ù}¶KkTÕ™½®lµ×}eöÿýÇî§ãÓòêÐWZ·MÕªk6jÍËNõñ›6½Ú×ílŸÓ—Ìê:Ââéâ-~‚\)Ú6Ú»¸$e[¥ôXc# èuùØ×êr4Òž ÇÊD[¼º qµ®'âv*þ_—AÜÚªx‹Ÿ ÇÊH\Ïê’Äm”IÜ×åcà¿ïâIüòhÄÅ« ÷(üc÷mùø7•GÜòXįþ² eø 0 Ÿ=üþi÷á³®ô™Íþé§#p§=‡oOßvÕñ^,Á¾Ý?ý¸ÿ½RúØ?ý¼ë©'Ç'|Ò 'ê#ñäûðÏ`Ø”†O>ÁÕ:ø¤…«}†Oúð}Ô@…OOGºŽö= ¼îk‡òU}Ú³>XÓé€Þà|8=©•(—"çž x×êдº;>tñ¡ëƒêOŸrßúÜjOh3=ZQ§'Ý¡ëU³ð}lþ¼†Mø™Baóì3p˜=ÔUÓý×*Hü™Oˆw<‚?÷ÑBаá7¥Ü¸ZÄÓ\YíœfŠVø ƒ]|2;ˆwÑ}T¸ßsÊIÓ- 8>\xcêc¦—=B ù­ƒ.ßuîŸÎ~!J}ª1_£‹Ì.Ûà±²„zÀ=\ÄêÅ‹hFIŽ&„¨±àLÎAÂR¨‡ÀâÃ@&Œ{Ì0fñIÇGCØ,ˆ®øzm+¾ÑµyG<,fǃ8Ó%CЙÙGÖ”ÃjÛÃ5ú±°@ÅÊ9@C¥:ÃXUÉZP¢z¸‹0’-–Iêå6†ù|Ñ’À„ƒÛx¸ sæÚ/w®ˆ ±"òàä’³qî5fg«k‚!E6¦œ Ó 3挒c( ¦;7Dåjk'zÄg¬…ë´šçŒË†°~e¬Û<•Âuâæ/Èø¯‰ì móÑG"¢0ë<ÈaÌÇD$-Zôí ãÌKúáµZ­µ£Öf¸”UQÏÏ@Â!t,UDͧr<®t•ˆ=%Q͔ʵeRxvJv¶Mí¸J˜™âºÂ~I@üGVÈÌ–gÌ_˜fÒµ8„'FÅȤ®FµR½«G±Ÿ±´Z-£A!RBŠ„¤ð{1n[ÜøAÀ‘ Á£û Y+!ÌðDë ¶%@3¬$˘ŒJŒQ¶“ RV›‰J²ƒFraêBž¬šñT¨("1Žíf|…ÑM<¡Ê@.Ž.7ï(e)“š‰\œ°ZõãezÌUÂù·„K‚Ù- îŽÿ”IF,wH=ÄÆ¬ñ..ÙÊë¤éꙚ í€ˆŠµé*G±â(“l5TRóó=Ç‹>" êÁ“_K;ÏDlĬE&fµzD†Éµ{bè²ÁZ¦z« ‚©ü2Cm\·‰ –¢L5†Dñq”úÿ˜Þ ¶ÖÑZ"AqO3öè˜pê') y: Û¡Ÿ¬Qõt(pGœEO ì>ß.¬ÃvâÎ;»õ<«Á®@܉;+ŒÜ/ˆ{&ÂaK……») ©¢÷LŽÁƦqXï\´”É,ËV­1û,7H7ÞûúT Q"-ìeŠÆ¶©®Q‰Bá0|˜PB\ã?Y §²pÚ@6ò,ÚEìiJ!Bs"½|Âq0‚1¨úçøõµ]®? ˜œ‘¤²MsI TVAÂI)×ßBB7²ûSU.sóÖmÄCض³C¸zp)çâÄMåLd-O}³hTKXŠ¥Õ)Q ý´+SrìûQdË«[d£ÊÍ«H4*G1Ã,"©*Ô;A•ª<¿"Ødí³M7mYá33 fùpªY62$Ïœ^éSÛÖ•Ã57TcÒÊ+¹h÷߉­hâ¶XJÖÛÄuÐ+Ý;ç'(5Nsád'ŠS—†u !°0¬@¥™Á©8äß¾†zÓ3VÙ‡[˜ …ÇîȲС1î)u Î¡µÕE1‚sïLÝ#,° #ê3±œa æþ æþ°€û6®e*ÏÆ¸³€`xü¦)@XÈ6qóCDuVkWŸ1ø2½×Léÿnñ¨Í’3íóEDÅU׿Iá+|û Ï”,t™ÈÖž}ñU”ý™>\¢—ÎÓ¨•ʱLÚ‰–7]TúQ/Uݽ)EÙËÂ<²H¤}±2Y8V4¶µKÉ›Ö5=ºB4›(2AD6Ÿ ÒÛ½iN‹/ÿ™˜t*Ž5©=«¹v!ƒH*G);ÅOt|ïúÈ'_çbFuµ6®BÛRä zLEÊmS/Î 2Ñ®¸aCÙÔV©%FuejÉŒµÂp÷Ô£M™ZòîI™ZR¦–L'cëƒöÊÔ’¬û 3ïB6º+3C–hømv!—™!¤~λ?ùh²/"éúòŒ±efHÑ• 1ºY]iê2±ãvue™Ø±iØ^Ža¥Ôˆö­z­tª'•Ò¶^pãÛ=uªÛ^ãã•Nuî}2ïT7¶¿Æ2¹5®Èƒ&• ›püÚ?7öÂõxéd+»³wlj{P/W•Ôû·üÂ`ÇKÌ p·g²`ƒucæTó<×5ÍüɈss†ïÎÝÁ¹ŒÿÚÇ^*·8ÛçñMQÚ·!Uo )¬_}ö‚ã1Â-Y¸áÌkh¼ü̘*ÒA¯þî –á^~>B<ã^ YÀÔ <„³¦«‡â—°õr&mÊj OoŒùÈ´.ŒiÙ4¡c ø9 ÔÌûxèô IC°è®?­²‡Q˜/;™¶“êw5Öãþq÷!C…Ì endstream endobj 6315 0 obj 4067 endobj 6319 0 obj [372 /XYZ 38.2500000 299 0] endobj 6320 0 obj [372 /XYZ 38.2500000 761.750000 0] endobj 6321 0 obj [372 /XYZ 38.2500000 299 0] endobj 6322 0 obj [372 /XYZ 38.2500000 761.750000 0] endobj 6318 0 obj << /Type /Page /Parent 2 0 R /Contents 6323 0 R /Resources 6325 0 R /Annots 6326 0 R /MediaBox [0 0 595 842] >> endobj 6325 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 6326 0 obj [ ] endobj 6323 0 obj << /Length 6324 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯà9€Çýâ XÈ!€`99Þl‚E¼ˆ²‡üýp†äH"çk²?V÷£±`Kž›ÕõîêªêÏüö÷쟿eŸï¿ý'ûÞ}¿ÿ¶Sû2WíŸìðõéí¦Úw?ge•gßì^²—ÝÓî©ù÷e×>ðíþÏÍOÿËLö§æï/Ù_ÿÖ|øS÷K‡_ø±+uÙ|ÿ÷ñ{]êæ'uú~øü_»¿ü.ûõ0cÿº˜÷ÿÿd m´9€1ñê—]¿L}üúíû¯»Ï-ÂÞRãŒË´³Í?µ3Ùÿ±û¹yA?½Ú×Në²p¥Zò¢ÒÞ¤r›iS«ÌVjô¢ã—Ìô:ÂäΚx“!ÇŠn~ôÏ.IܼèäÊ<ŠNÓGÀ¿U¶ˆGÜ#äâX鉋gßWÎj[šÜ} r^U¦ù¹´ÝŸ…H«ªiÚÅ Éiú“¥#rÓrq¬t÷Ì.(ÍöÀ5GUÇÀ?} ü»˜ªâ¹8VzââÙcKs®{Šäc'`9Ú^§0yQäñ&?B.Ž•žàxvIi®ò^ÝÕ¯7ÓËOî”Sñˆ{„\+=qñì‘¥Ù©ºWÍLhRÇӰΘxª¢…\+Á=³ J³3eï­V<í7ÓG˜Üñ¤¹…\+=qG³?…Ì‚Ai?[ýσwÏ»Ï_ëLÙóÏ dǶߞì­ùé°m-\öüSö{¥lù‡ìù—]½/‹fÏákGL}©öU­Þ(Gî#nïlMy©ÚgNh8‰ÖÇm÷ÖTºZôbÏ{,1Ò.ÃîsWTå;r8‚¡"/ÃT³œþñ8’÷xœE'8›¾‹×_ìÁ~1¦  gQÏ3)v¸tŒór>±|ÆŸ‚Ó`ÄÓ33’߇ãÏÂ[¦«šk}NW™â¨«rÕë*ýµU 6=‚­†Àœéè‘ïÍH¿áÏ`T Ÿ©zuVê÷,¯ øŒ+­ÃG0l ®ÇbZõ\ìí‘CfÍÖ±­Öû¼¶ïq€×c!Ôwp6øŒÓ™×›À`XûÒ>Sô¹&ú7âŸ1ð™N4Ãp`éõ$¡p¡Ý$…í]Bx¬}/zç0WCÌUªðLÌ‹˜^tx¥p=X¶0/bغÐIØ3PìtÊùÜœ CÝa4 ÇæfZ‚ÄŽ¼fÀSÏàN, Ù‚ïñhf‚<q€¡N©#KUOc`y†#K´¨½ÆVÙb=„gƒ—š >cë„\aª÷ÚæÒðŤ^¤¼0¬S0_AMè±U7 ÅӾʧ±ˆå ã Z|oNàÊ`®À³aFÔ3X¸ ±}RrRõšÃÃØ:b„¢æ>ü ärÌÿk–ÏJ‰Ý±Ã‚Ž`.‡°9¼‡€MiE+c×Ãÿ8–u±W÷Xxì‡bØDù’ññþ~Íž„ÇfàX ¨_½ê÷Ô¦ö6ìÓ2{2¼÷è;…wkÛÄÁ|;cÌ!)­ëéü2™uÅž¦ÔëžÓüÌ/‰|»¤.ôj¥ŒÛVÕ"ŽÛ¤'q‹En¢Öm£8 ¬ÛJ¢*õ¢„+ÓOLÐVÔ§aÝyme¼)ì}àØö¤ñqöé‰HàÈŽ b­ŠµÎ_ â(kæ7ÏnbûŒZW“¼,;‚õ“ì~^VÛy<«”Բ嶩…ã²ÔÂ>`JjåŶ©ÅDƒj­"K¡.—œ œˆ 汤Ԫ—œ¾&ŒžX¥íû·FÅœ¿"ݪ┊ƒ+™pí+|ƵÎÙ«j.]í’„—´éc†­MŒ0Ò.k6õ~æ= ‘@ Á•RgÕ{»T tK䌑Àä6Li‡4˜Ïë›l]·l•ÕrÙŠ içF™S-Ð2ˆ#z•ºíöðë¶aqs¦#žm~7¦…CªžˆžšP‚,c{ͽžpƒùmº¬_—ŒT}tRµ ˜_°ÍT¤ŸÒjGM[0~Ì u>4ÛªÕݰ3M±Æ:÷/ÁÚ˜è/C‰Ñ‚êàƒßC´i»–Æ·¢ý.(’¢ T)™>„^fÔNdEáqHpc"ÅŒÁôBÂ21¥böرvhúâú ‹4<бn`kb]qØdÉgÖªE¶›Ä/U6Ê4Ø-\Ýf2“|æy†išB¤0­DjMêƒûmòØ*î­u©Ë¦ñºññ]²´²mOØÉ™™‹ë>áÔrV¤.Ϧä,UBà6åŒÀÎ’³5$yZ[¥.Ô¤ä,U*ç6åŒÀÎ’³5¤çZ§–”ËÞÒsSË,Òp Ós­ß¿5*æ&ÒsÝ)«Ù¶ÑÑsé¹×1$ºH…¹Ar|€.z”¿¹¸sîú¸s²ÄB‘`Òg ýF5a]¢p~95±¼¥‚'§pï½æhá-]užZ‰&ÓØL+ˆ›nT©v’Œlâ÷ÀÙ÷xtMBy.N ]o¥>k#*¡ÿS¼¶½2é¶¼ð=+*û¼Ò”ÒýzóÊ‹KŠzCH ŠK^ñAÝ&Id).Iî¿ü½–žJŒ Q:/ì–ÌTw¤BØl¯ßíð^e<PîD]Ï)zéŸçJéT¹©"wsã`»¼‚n©:oÌþz6œM:dqA5(š‚ ¢‘ÌZÉ‹Kw²Á·×ßP% ö°áÄ!”D–œ9²LË­½J.Ù½> ¹?¢HGÃí…ð<éµÚÙ| ÏeÙ8‡‘¹,ç2ákvÄ÷âì S M/£;°L3M!%6ZnÙ¤VŽËáZ«aàÆâ‚,®ëb6‹œ}Éö€ éÍJ4’ôHÐü |lÓJ¨ O`ÏÆTÕ]ðKÛbh=Æo>DAëb’s˜(h²ä&e {©:@ʶ¾&$ÎÓN3²hçÌ‹e& e1A‰Ñ^ZO^‚(R®-FÀw”ªM2̉–;dŸÐí•í;?xX³"&:@Eήþ‰1Ʋ)g¢zÚ§Äu˜¥Üc2¦"$U 0@ z$¿“%Qþ1•0âHŒYDä&ñÍbl©j`#\{¦È»ÜD×ÿÈ8ff¨Û‡ßNö oøÞPܲHç£pÄ5Þ¿aì\<å•Z“ZKœÐ{ œåPË'æ± …bÙFX"ŽÕúâÁ‘+F.µQ‚¸©²åpk*vLUò¯V‘½j ;‰Â‚˜(3+e绪:5=üh‡“aÝbp%Ü{ ÷ãÅ#¸·.Æè*n‚¨Õ’žçžÞÅ¿T™‹fÏÀ¢YÒÑÚÓŸ¯s”Çœèä‘{(ž¾½˜_¦úY­W‚\ê.ËNAÌãî÷X‚pß,ÌxÂÆt€Æ³yt…l0Ü1J“,}(k»k᎘>ØŠý½Rñ(Õ{Œé¬ ×c0÷]í™Þ“¾Æ † ®ÔÓqŸðÍ.ω˜¦Ø¥ì_q,‹gëuL{ÌËø.:lY0…±/5 ôD’Ò±¬Ð$eÏÿº®Ò¿Õ)}êëGh2½'îõÜ7¸â]&öR°ÿŽñæ¹õÛ Ù^öø®ïÀv‹èïˆñ–Â6øœ*û¨lâÏ ÖºŒ£$zH›ä}ËÝ>um}Ë·©‹qÿbÜ·üÚFv6vút£ª#î²bb›˜—±ÝbÞc±ŸND ©ý–hOu&2ÉPA¶¼'Æ-ª…\TQíá˜~sL‘Ô–ªfZ;«NwÝß2­×‘qé疳<‰EW.Àbªœe4ˆæ­2çyž&fDœtàx®ç¬Saa¦uó•½4¬éåܧ©_˜áoUçØÚ6vG郕ÌLº×EšÎ™Â–vå»Ó<³7ÇD‡1ã‘.'Êì‹Ñå zÂ8ó;U›u¶¯ÝJ‘£€ýE7t´pYZ1^`§qž ö¸Î,CãÙà3ÝfI-ýÍU¬,Ã~V¯:Œ»ÇpèÂXà!œ0]=ŸÂjÔó™°óöÝž VŒù¨Kýs—bÓ „v{ús@¨™õxèôˆ´¡GY¼ñ|X,•ÝwÊ|ždµ~sͤÅzÊžvÿâ·Î_ endstream endobj 6324 0 obj 3923 endobj 6328 0 obj [373 /XYZ 38.2500000 335.750000 0] endobj 6329 0 obj [373 /XYZ 38.2500000 335.750000 0] endobj 6330 0 obj [373 /XYZ 37.5000000 319.250000 0] endobj 6331 0 obj [373 /XYZ 37.5000000 319.250000 0] endobj 6332 0 obj << /Type /Annot /Subtype /Link /Rect [308.250000 343.250000 344.250000 350 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 6327 0 obj << /Type /Page /Parent 2 0 R /Contents 6333 0 R /Resources 6335 0 R /Annots 6336 0 R /MediaBox [0 0 595 842] >> endobj 6335 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6336 0 obj [ 6332 0 R ] endobj 6333 0 obj << /Length 6334 0 R /Filter /FlateDecode >> stream xœí]KÜÈ ¾÷¯ès·U/=€ €Ÿr`Ø@‹o6Áb½ˆ³‡üý¨»¥Ù©?JúšUz´<°gÜU±HÉ"Yäë?þÇñ_¿_¿ûüŸã׿û»Ï‡ìT„ìúçxþzõü[žšŸEŽ_¿¾¿>>Õÿ~?\_øüî¯õOÿ;Úã_ê¿?ø{ýáÍ/áÛ¡0Eýý—Ë÷ª0õOÙÓ÷óçÿ>üíÇ_Ï#¶Ó5À¼üÿ+—[Sº3S?´Ë4—¯ß¾þzx}EÀ´Y ë]žwþh*oÿýçá§z‚vøìTycŠÜÙ=ö<“-ê™lUTãº;ÑåKiøƒû<‹7øru¬—ytMâ_^ä2EOÃÇÀL¼Á/«c¥%.]“¸U=þAÁõEÄý(z>þƒw!q/«c¥%.]‘¸¡°­hs.þ>Âàe°ñ¿@®Ž•†¸Âè§Ò;ãά{&ô™È¡,mýsáš?÷­ëi»Y[F@[ÌÝœOT_!WÇJKp»NYÙvÊ+Ss >/‹ðŒŒ×Í]žÊ*»à§+Æü©†<ÜBè­w,|reز«‘\ Qëo råÓpr¶4vä;-# )Åttáw0ÔL0®]êcðJËYªc¤Àá‘SŽžÁ,¦í[ÇÝó6/»;ŠK¬^)³› PeP&à©Q¼OÈ/±ëdfS`¶Š¼Å°>|ªsXêc:b‹s…Oˆ‘êÉê0÷`‰‡-%lwaM¼J¨àï`N'6ìÕ æÑ= Z#ñíÕ'Þ ð‰0îIp±–f¸KoAŸá½€×ƒ¡Æ£{®y'‰þ(³{" kèIšÕ=—±Ç]ÏæHà*K÷ršpÊ*÷2¬Œã¾ºÙÐLvü„´Uü«8ûF5SH®¸JL“ò¼̞ë%0ñyÝû[MÁ#òD…Üœ(‚ïF`œÃôJ&IH/êíšT)$ Ò~Ùì*Û‘‡{(DzgþPˆS;ÐÂl°wuäæ3É­6>s¹÷«ŒÊU×å0á°hŸp_ŒÑ6xb枃bþ~Í­ŒXˆb”½W ”ÖuvüFÝü¥fez' ¼ùˆttÓÑï0.Ö¶ eÏÒÇô$uIm‚®Œ›Î/h7&[]ã@Áh³$ÆyešHÁ옽×~©Zĵªfk¸R½›Ã޼ê©"Æ’Ó²<“úÄ$GcÇ:SˆØI›–†ûB¾nîcR˜jV©BN[ä±"¬›Ç0íU=[8‰ƒJç_J º4Õ Ýxl ÁÞþOcÝbè« ½bØ„ÓH*;Aga¡–¶!\ÌC¦É6ªçÇ(gÌå…íï2 =vÐéÁñží9èˆèloᮑ 4ؤ"¾Û/dù nU:œ0æ’0JM’gi|èÇé·^ qþ¹8@‡õq$Š‘"³{³¨‹jwÁJ%Ì.ê¨Å„¾ Ôbn‚%ȸ¯™.RˆÃƒ²çpÁiA{ÀB¤é\ ½vOCö“ooï¤ê?(¸K‡ñaþ%d_Óì~RØŸ²Ü3S×vTíh–ĵ.ï°ùFíÍ[ïàrUléâ¼íàx ŽMƬ€ïL°›˜&ˆT*Ï\q;ÆÛ;=¼õ¦…ëê¼m4 U6=ŸÝhÀ°ï°#"ˆÂ&st† ùóýl^ìçë'£/ ßµ æ¿$eÂô½•X >‰æ+ELŸ"gÄ^ðZ[¿ÿíPÖ~öÁ/‡Ï‚ðŽ#õKdŠDÔ4eŸÁÆûÛ)²nÚ’Úé³<šê¦]Þà§lë†4Õ)ë x=|ö€¹ñ¤‘«ád{'ÖœxÇÃw*ôŽk6ºoÍ¿vEûÙ¯Ò30?9c;"À¡yR™¼¥âˆwl[?àjü÷ì®ØÞ•fè Æ(M£ÔFíØTB×þe[äÖ¿ÜØC„Í[zzÈD¹õ¶Gá;­QvãjÀ°º% øKJ,] Ͷçòž¬)ß‘ŸìÅ6¸u.ï½ãpþÉÛè«o/Ï[6ŠâÛ‹\]ÈvÖ`uk¨0U!±K‡¨x#¸›ÞÄf“Wìêäoà8ãÃÛJ^&*¬…‰ñ6ÿA”ITÂô™ëVš0|¢ü@ᆥ’h$ Dy&œ"'žÎŸ/9ž‘g+ΓênûlÉíºÙ‡ÂhxLvËøµJzÈã¤Fà*r{þð;­!èº>AüD7ˆÞ'²nR»j>EJjÝd·¯]W¡«6…Ÿ$Ò…å™ËâØàÄUÖtS¡×læm&c,YBU‘ ë•P¡UÀ2L®Ýüœ0¿åΘª¦À„bMS ½û(´6ÐpIñ"¸—`LsÓAg.Ù.ÿ‡óÜ ; qÍ©ù‹G`¾°Ã«Ã2Mqnn®@dê1%þ…'LƒrÈ?a¨€ÛJ«)ÁœT™“"q’‡Åé1' ØaZ!A¼aì8ÜÒ –jq½d¨1.j¼×+íJ3bÝ»´ãô&|K;¡$¶1'á,â^k*Ù¹NèJâuâ@W®¯‚–xì{AHîyd°}ÚáËÄõZ¶z9ë-x¢ßÕk×e5[pZˆœ(Þ%x–uË<ì•$0Oq|ª{»+Nƒ{üâ*‰,)ë•{*˜6ÔGpÚqbqwIUºàü"Ô—Ã ñQ•#`õ•©ÕÎÁ!¦‰î¦w2>Y´kƒ »‰1ÅðÎX_!5_&z‚Ô¡Áº0#— ¨ñMaâ^Ýxg0=ž±b‚¸8ô¼K¡{¤P Y“×$ßu`r™©¸ £©:ñuÝá©Ë‹°òÌݓ̲ä'»í í³ÝvÖ³Kï]z’Þidt‘\ªî6•R±ïÚ…ïZf4ݳ.MUƒžLø0©­ZVÃø]å“ÝVÍv[u×z»ÖÛµÞò´^Ýf²2µÎÁ)NCO¢'Úä&r37µEûUG'´`¤n+¯òæ±r_2f=›o™<{ÒÌøjcL½ª‚õ„;Ùª7ˆWÅ9ËIüZ§p×é©>À“µDD½Bè*>|×ÿ©²¦úZLnªÙ ³˜JNP¬«²0H ..Åt£Ò­ë1¥X¢2iÞµ5 VÈ’Ç5” :Ãý²¨ÖàoG+Áb„1 îžs^êÀE——ÃJƒ0z¨ûŸz8ËÃ2ê:ËLpµIlèè¶~š_°h”íœÒÁj¼õçqiy¢Ýη£ø–ÊNŸ»ý2Ò"Τ³ûU¨ãå"ë\Zﻬ>¡ïZ K6r ˲è¬wب²ìrÓÚ.ôåç§@"Â¥B†J„ |¢ú‹ µ§¡ph/AíW6÷+›O\Qøaš¨>Ytr®…×ÃT/à ï&œ*‚1 „Ô$&YËe¼R¦Rcfà”8Ó«[X)Á‰Âz |b´°PýlO^Û^òÚPØ4:§J}ErÉ4Á—_v³ëœ]çì:gÝ:G¸Ü÷LçÔ_Çïµruϧ¡_áÁ)o:pŒ;eæì‰?>uÍÍ`×FŠ7\8WÙga×Ý_›P¦=åÝFÊö Á-Ÿô{4Ã^ñw¶ÍJ{ÁˆFÆb_´ÿ¤ ÛvVî-°8·†‡m›Ãñe<|§ñÆ™IK–ãË2Üùçâ–Ðw¦³€  ¼ŸÎ˜®Ұ: êñLØhq?†'ˆc>²EÆ´l: ¡MîÌ- ÔÌz:}@ÒPåý²ÈÜ©æãv¦…ùØnÔÚJ;~:üu÷¯ endstream endobj 6334 0 obj 4402 endobj 6338 0 obj [374 /XYZ 32.2500000 482.750000 0] endobj 6339 0 obj [374 /XYZ 38.2500000 442.250000 0] endobj 6340 0 obj [374 /XYZ 31.5000000 484.250000 0] endobj 6341 0 obj [374 /XYZ 38.2500000 442.250000 0] endobj 6342 0 obj << /Type /Annot /Subtype /Link /Rect [396.750000 743.750000 437.250000 750.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn42 >> endobj 6343 0 obj << /Type /Annot /Subtype /Link /Rect [229.500000 715.250000 265.500000 722 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_types >> endobj 6337 0 obj << /Type /Page /Parent 2 0 R /Contents 6344 0 R /Resources 6346 0 R /Annots 6347 0 R /MediaBox [0 0 595 842] >> endobj 6346 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6347 0 obj [ 6342 0 R 6343 0 R ] endobj 6344 0 obj << /Length 6345 0 R /Filter /FlateDecode >> stream xœí][ܶ~Ÿ_1Ï2/ºEØ»[  èCЇÂiZIP7ýûQ³kJ%~{HI³²‘Ú]Yyxî×wþôã¿~?¾ûðé?Ç/îÏŸÅ©.‹î×ñòû»—?ÐÍÉýýX7åñ˯‡¯Ç¯‡‡çÿýzè^øôá¯ç¿ýï¨9ÿ÷óñ‡¿Ÿø£ûG—ðë¡VõùÏ_®¶µ:ÿ­¸ýyùù¿ûÃñ·ËŠýçÜf¾ýÿߙʨÒ^¶1ñ鯇þ˜êúû÷/¿ÞuˆûJ­+S4Ge=ªÖêãÿyøéü~ùâÔX£L­Ï/§¶²uQ6>ÿ½6îûñZ_¾® sTº-Žª~üú[hù‹›Ê¦[üºsq¨(S©ðê©/¼VM4}&8y°Ý–Op'uQèt~ݹ8Tú Ç«ŸšÊý‚'¿Ý\`¦lyf/篠Zk•ª/(ö&Ö]nݽ· °êyõXeÚtXÕí\(©ðâ’7k­Mx³·ÕS¿4 ÑæºóT7 —¼Ù²UÁâ­M¸øuçâPé/¯.HÍMazNzþOD/–O°¸NHÍÝÎÅ¡â.w¸úǘUðVºŸ ôkàÅ÷ŸïžÎߍ;~þé¼¹ë7»?>ŸR¿»OZ?ÿxücQ(û§ãçŸí©Òe¿ÅOt‹žðÉñäî­‚{Ãïàóh:à®øîºÀý>~ îà ï-pR¸k¼ƒtà-`¬ÂßÁ8Ša8)‰ó(øä=üNžC`¦ˆñÚ†Ð)àÞ0Õ a ðw0D!t¶ÉßLwsŸÏ‚+¹Ì±*³ÌÁw?ùD"-‡-:p´U=R)u*mÕÔ婚SÓ×úŒbìI‡nåÉèFÍ}çC4hïÜ»8 íz‡Áóðâ0!iÝz8î(Ëž¬é_Ï»ÔèZÔ‡OÒ#.,zB±|Àé9ќ՘½U¸èàïd†uB. å3iC|#ß{hjÔ|¼5Þ?uœËôbsm éd>á¨÷þ?-‰ àó= 5¿c:,RÅécúFu0艇c;ˆ€=æ^øVà“ˆKÐ AŸSñecÞoR½|È!K†Ë~„V6ÀFÇàXÀwjBÈ::¦‘!§Äxˆ7;ü„²¥5•oø@Zf."†’0è0€ð‡1ÞW´*À|BÛ°æ!×ñ®‡2˜DŒ 6XjâwzSĸ—f<¡ôiBÆF]ËC¼Ð2eDˆIšÑ¸‚ ˆZBpçÒf†’£Ì”Ù–Þ5fU5w3KÚÚ–SH“ÚJ5¸ûŒ8,m ]c~ˆ-Süi•‚ÀˆrÌ\ªs@ãÃ{Ã7Ȩ´ ÇÌÄÍ)õh· _e&v%0 `Œ; Y›%îR*ë±yÃÐyˆb2á{Ÿ7Öß§¢•òuJ Ð%¬žÉË ˜ŒÐiëªô¬MÌÐ%@ÌhÿX è)ŒöaÍŠÍ .?€,´0'42 ²¡{Â)$FLæS|É^Õ ×QÍãË*ÂÛØhß–Ì©LnGFoŠPË(“Øótת†×z¹ëåÔ—ÜØãÙ-ÚâåO~9|J– íáËfËrQ+ Gë†nQ÷ÅrVÞ”{ˆ‘/ƒEŸ€Çal¤ˆ89Þã|oˤ¼Ik4õžHÓsƒ32¡-£aâ™pb¶À;+Ž…³†qBN¤KžŽ¥\æéó-:3$ƒ »î ,(+†qa5?f†8³YFãZÎq”Bõ•Š ËfS¬8ȰLÝë÷¡ŠÉx”d==ó5fù]‰ uLÑ+…h“Í“<ÜgÛÊMyµÅüÞ¦õλû½ýÞf€M„‹W?"fKåõéI”-Ä—Ø$ÎÍ 4cþˆw Ë!D’+çsÀ`#t•á‰#B·Œû0:±%in¨Ï«ïEÛÏ”” ±('tím¥ß.Å*rÝí¦¢hŒ<Å™U"N *ö kbªXr¹"*£pQÇ@™iSÌàœkoRfcõyU=û ¹É|¶,ƒˆÐ%Ã; Â/³>‡ÐÒ~ Òü¦Ð±bÿƒÁ½;°g7<À±*왘jD²l¾n}¶Æ„9pXzùB°%­É,²‘…¥Ê'Ísg/•ÆôØSàÖØƒ=„!.ä“5«pÀtà4§R+=vs”.wp½ãr”*c^þ`‰¥Ë¾Å ¹ˆvƒ”æî“¥éÛ7¹æac.²§ ÅkyŒB×}s|ž¨GøN;¡ÔŒ­6Å`•=iå!öSj°«²ðàî7Œ9±1Ük÷À© ¤*]•ºh|x”ðlÄ©Nú†¸{k9„TÇÞªqæ`µ{sJ`Jè6í|è–ú0æÀä·IœÛ^­HîCpì°´H·“õT31¹¶~0µªçN70¢öÃQÉÆ'¯5¾ñ“W¿cÒŸ §ÙD'HDîi©vÒò´¤Å$Û$-5Ów ¥Gx‚2-½î˜¤?AOK©N‹-U…Y1-%O¿íié Ì=âhª£² ´ôº`n^7èié•'À´”^.9$ºu,¦Â²…&%™”Å{r´+c½ëÚý©Ù(ºwçœgÒùæf1b±œ–@NPDiÓ×%qà—éÒ¸T­M†\ðz@ÔËwÏÁj#”²ôHÕnæ‚èuxb"”ë)I^Ž'mªw[î:c«q¼“*RÃ×#Ú—*¾äHäzR憻6…•??&Kt¡µ0·J¤?áòKæÄÓ\LXr$NÐcj_˜ŠÚ”©£ÜÛKÔÔk}w¨N›ÔS#†WPÞ`Œn"ÏtËà ¬Ô4†óJRú¤ñçD 2YcÜMñìVÚÆZ+¬Ø¤L3ø([‹Îe£V)âhöÈF‘â£ø nŸ„w<-ߺ‰/$_†&Úÿæ6c óƒïÙBz?VqcÃÜç«(Ùš|Um’îZÄ.˜'ª\–{¥{†.Ué¾êFÕwÝlÊ6Ê o.%j4û®s_Me=<‰øY±´Å ¸n«uy3¬˜ e†pYˆ€ ¼~üÑÌÀN¿5…lÀ@b© 3°¢žq'²ODI?ÀÊð`\ÆøŸ<ø16€Ë˜špghÌš1e¬/›67^fzBuø†\$Ї‡áËÄ®±j @HMµ c9†(æB„4ÁÐÙ¹Pð~¦¸P^ÓMf°M¬œò'†£4JŒc¢Ø b8$ÞÖ^ðI§ºûH™œ«ðw0Žô4|R…§q@޹Ý.õ‚½7©—SæØÛì“ÝîÊv÷òh<˜G…Y-à!VÃxÀ¬àÞ«°W›ªÌMÏ»½ºÛ«oJrïÜûn¹wÝØé¾;SÓnçïvþ„]°Ûù»¶°Yþ–Sæ´úÖv·óóùxà;»¦¸YM‘YMô¤Âw õj5| «ð´~•xz>¸ûGvÿÈ›Òxv©·K½]ê- ãW¹eÎ6¹ÐîWÚýJaì~¥]ËÚ.Ë*sêÜùÑøî'Ÿ$/ù­Ï°ï/!SÉïâE¦²¨î-Í…µ¥óKæ©NRLã2Ñö'™gþÅãN_ĘÐÀI‰–,ÉHµ©#J}uɃ¢÷Õv‡‰»'ŒÅøž"C¦ï‡ÒhO-ø²õ]é‚ËÌU%z DÙ¸ Aê..ŒÑÌw~£QÙ;Q¡“©OjÌlõ­3J±v`=í“^ŠåBdæèLW‰vïTÛÊÅ{çdkRzo¦jµ¤–Ç`$cr9G½*OEk¾5s‰ÖzÂ{L™ºÛ .¿²cè<‡yà´çM´£rÌ”ÙFzó›JSƒOÖ'øÍÜDfe7 "1Ç Ú™3Rʈ;TböŒñnÐ0kÅŸý”’ìÌ‹‹Ø5ÅŠ1Wcˆ0Åm'í¬¬|q†q‚ÐϨA¢,=&°7Y¾?ߨ> 3"°ˆvs.¼{|Ù¢“$ߎ‰·x8YÄZ[ûH¶§5ÁVW ¸7&Û²õE c–1æ\.EÆiqoî ð†Åñ`±™uÑô=îK’.˜+xŨ}²öUOZ‰Ð r Š”= ¬>±¾ ”h’è>Œs6ˆl‘Ô æ€#‰ãÂEy]²ôÈyð€ÜÀ;}Z¸q/Íx’^-k_\bž1œ¡Qñ^GÓRþßLÃÓ­FG ‘3.Ï¥}«6HÒ©ÜÍQÛ1&ÒM2¬•¹µø|ºÁÇ~ýu›yâ°¶:9-}@Ûcï´èeO¾Òï¤ÇØw4|§%v ! øGô$ðëSÛø{ƒ·à0{ä‰SÆö†w !jžàyàŒ;mjièlGÕô½Œ»øá¤Xf*6EèX€2¾vÌS:)Nå(°Ô©4JŸ€J“Ì!ËH¬ceR"ˆ9íŒ2O¹]È—Ø+ˆk32Lj±èw"ò™0sà™ê°DÂX{1a >‡%C¹Í³$Zqbbòt0&w-ÀܱâŸ6/ŒbÇ¢…Eš 2eo²>½=|&“°Nëe8æL„æÃ¤.+¬ó¯pø¯HÂÃ|GX@¿ÆŒ–I³M„oZOÄ2û¤(5“ e2Ôdj³6@Ì¢¬Q@(’Q&D‡ÛG”˜SfY„KïD–&$ΈP2›%®'Æa€õ—ð; _‘¹Þ×§‹×ÜCö+êqíqKxJ7Þ…Dt½a,]aV*Ú fÿ"¡ÔGhùë«nJœV%\0ÍàTDs'"Õ²Û%$à?cJc$º-¬—ùUƒ²Jº0Eú½;à$ãÞªYºê$–½}ÒÅ.‹Ó Jû€ž8t*Oz ¸›øwœ‹bì½ãÐØj.æ{¶ ý*nž¼È€òž¸»«NæŠ;³öÖGÑG ÷ÖGÑGö†að^ò<¹ ƒ¿€[G÷õÉ%j wD«ž ŸŸ`ŒÇçÁïà½åŠýëú–7ý€w¢¬l”Ïçj¡VÈ5ÃÒl-˜j÷Ä13‰ä*¼FW,ïú}Ã.La ¼Â˜–-˜XÀ%Sv½·_ÈĈ¦1Ù"` SÄ$ÅÈ´Íx-ô ÛÞù×+µR3Ù®¾6æ–BŠÇOàÑWx”H@ŒQ¬F  †sèøóà²#u„wið®ñ¨ƒp5fB+t¶­&÷so“f¼ÔpVdM¥*s‹¦Kͺûd®Ö.Dþg„«$q›V™A<¹šH,ï£ÍÕR:m?ÿp" Ѿa…­xÏ1 ºÁˆel®%^@ XSyì= Ë¡ìÃó?:ž&ЧoÆs#“‡·K£}è2™[¢-úwÏö=ÛÕÍ1`ˆ1³Ì¸aƹŒ ‘õ(ÎsÃÖLß0a†Ãïà»Ä.ˆ»·X ¼5!„¡“ûš=r6‡šÑÅ\Ëï€qÏ(Ì…à,æ(…äjØÑ—ÓÙS¹okwgßô˱w Ž cß6éyy¸e Ú gi]öþÙ@·."=Vw3’=tŠ6DÛÍÖSJ¤QÑ8@xrÉüͯ”)ìÏåYK“æ)áh]AN¤_çFá¡DáàîüÙ ó§)úL`­  $žP&˜hBQ.SOc”8©…5b f`…®scV×a$=[žMNz´}~…kÆç«U™ù¾±á&Ì2•VÔu².ÐØ øX‘òmÑ;ìuίjýúûNo··DKƒM!f.ÂüfÇÔxQÂ4Øz÷”( Jÿf3{zRvAjïl{‘g±1¿Šl:H¦m=•Ë¿gB.ßÒ+F.§”tµñâJ)jˆÈ‡ez¶2ÇàÈßoÍr’f»þ$¥¿W>»XKä;!“l”Ý5+$ÜS½õ±mhèüs …"ðaÑy LR~à;L$f׃0ÓjªŸr¯Asfýf`Øœ‘ï‰#©IÉÔ+wCEÄ Ñ2$JÙ+8¢¾ÃL!aäVºþE]G7µGÏ÷ã+2¦ôya¥äÐ dÊÁ½eÔªùWGµÜß oJ\]Öââ&áž(êÐbiõ°ê˪ÙxFõ©gTD‰áÚÃ~Ý{•Ù%5EUO“é^e¶Ý*³¦hªéÞ«Ìö*³$اæT±æUâR_–¯®X‹š—–ƒ)}ŰÞf_?yMÆšµFÍ©fÞ)}ÕuTL}à6)ý µ®[wØ«ÍÓaÅ6qyïÓ¼‚>Í9yÀ‹‰“{Uû.éä%Ý,,?ÿ>~=£sÛ?Nýƒžâf4 £Ì©P_çñ¹ñsçWshvû®G¼‡ôI_‹Â‡R´>qš€>Uþ<0W$€F¾c¦Ãc{{r'Eî^<êË>o©€›íG¡ èP‡eqðeä ¯ßq.vuôúmY„»üý¼ão ‰1Ø=Æ£€Æ ˜ÞÝÏgAHáÈ\ã!þpàÒ (Ç1 àø8qø á§§RœpÄÃüUXYæä8Ú<ôĨ¦_dN²íLJÿŸ¼z{ endstream endobj 6345 0 obj 5140 endobj 6349 0 obj [375 /XYZ 38.2500000 202.250000 0] endobj 6350 0 obj [375 /XYZ 38.2500000 202.250000 0] endobj 6348 0 obj << /Type /Page /Parent 2 0 R /Contents 6351 0 R /Resources 6353 0 R /Annots 6354 0 R /MediaBox [0 0 595 842] >> endobj 6353 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6354 0 obj [ ] endobj 6351 0 obj << /Length 6352 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9À¶ER%`Àq€ ‡E7›`/2ÙCþ~Ô­ÇÌPýQâ×EJÝ#ì7GY,Ö‹_ßýéëß³þž½ûøõ?Ù·þûǯ‡üh˼û“¾~xù®ýÏ™­ËìÛ÷ÃSötørøÒþûtèøúñ/íOÿËtöçöï¯ÙOk?ü¹ÿ¥Ó/|?XeÛïÿ>o¬jÊÇï§Ïÿuøë²ßN=¯ëóúÿ?˜ªPú<Œ™W?†iªó×ïß~;¼ëö«k]æ™*L‘©¦ÐÙÿqø¥}ÁÐ}~l ¥lUØüšY}~SKb¥›–6åä=ç/™ÞU„Îmâu~¹4Q”©”·sÉ•-ŒŽ¸²cï1ˆ_ê*^çç‘ÇZYØù±mRÆê²8­òi…˺ÖíÏÖô®$™­{’©"ÆŠŒÝGè¼jTD^:\œ*ÃzãÞ%·²mlG [E ÐØ{ ò×6¢œ8\š(ÃÒÂÎ%W¶Ñƒ‚l€<ž»—ï¼Éˈ|s¹8U†µÅ½G–ÓÊ›ˆ þ¢ûë"žœîFkÁ=½ îæF7¦#P»3"è=ùM“qN#—&ʰ´°sÉ•-rsÛ>w¡óÒDä›óÈ£m[Ü{l9]žk”­\Fô‹[bÄd¦³ëi+ÃÎ%·rÕWvì=ñí),mN#µ²°sÉ•= €Ž<í_y=w/Þ¹ÉsqÓžG.N•amqïr‹krU Z¬p¼ì>B纎ÏêG.N•nq/ôþ%¤<”îLò<øáñðîsk«VÙã/íÈÎ/ì¾=~?íNñÕªÌÎ~lÇóþÙ㯇âX˜î„áô{ç]£–ü#jQúÜRë&¯t¹èü•ÃÞ,l1]ËóœFyn1Dz¨jûª“Šx1&Š:·(s4ºV§“‹„£öÏ?S»ä‚Ó ˆBð~ÑžEÆäZNeÐ`=ëôpn)vXò æ!‰~€c !J iWCv»gXÎX7°7Ì îŒ‹n±[xV…Ê„¶åYBU÷o5Ý0šãyܯ¦û¶4¨EYØRÀ8UÁ¼‡-°E‡¿Ç‚˜¢x:RTÃg ¦5~æCBî3vž+D)âéY“áü"»Ž¦I¸Ze5¼õ“Ô[g ÈÖm^©\Á õ·ÇÜÁ"ݵç¸Iý±„ê&j`du܇c T…9–]Cš8Çžý½dd¬˜;ƒn'ަ°ÀÕà)²€’Å›Œ.±![b¢€¥,Ö,ëdjãÌzhBa©'¸<iö 3¦:³ÊY¢ýttå8mó ºÄ\JŠð“=Q8ÆFÆq@Æ·À¦ÎWž›Ošöòk¹Ç£Ù˯Eᾦšç>†"Ä®Ã+¼e¯y3¶[Ð| qj±>­o3BáY|®•®bp“«ñþ‡m—`lrS$æÅ=žï‘pÖZ½ÉHø½IßõãÃM^;xª<æyåÌD«ÖÊc²L©Â9·”±LpcD/ï7FN•à¸(\tÓèdѵZ¯‚hlnƒY)Ó34±Œíy‹Yz‹«cÎ(«ç&mÙú˜»’ û 8þXâ2ðx¦8rÆ q4ûGv×ý†‚é–°æi£ªñb¼Ÿú2×:ˆîç-Ë´<å × VK´eËUmñ®óHFV@é[ÎIÒ4\Ñ4óœ%.Se:!ÏëñŽÇç½ú&@gLˆÏcVã&©“9ö…ÎÁÔ!®b\%êâsú„ZúýWõd_ÔáÏxÞÓ gú@ínv÷_ô¹ôL~W ûVng_¢ù’ û„ÞcæœéKcûÜÏ¡±:-\‚ÆÕt‚=£aÓkÏ ÓP¸7øL¯ªTÐÔ_dî° wú¹ñ°Ð˜vá, ±ÁYÀ ôî>_D!…mŸÚaübÏ¢AP cÀ#py¼·ÏÂøÒOã’‰<ƒ­¯çJ››c/Ñ–±'f5]¾”ísr=ûrø?«*‡ endstream endobj 6352 0 obj 3859 endobj 6356 0 obj [376 /XYZ 38.2500000 584 0] endobj 6357 0 obj [376 /XYZ 38.2500000 318.500000 0] endobj 6358 0 obj [376 /XYZ 38.2500000 584 0] endobj 6359 0 obj [376 /XYZ 38.2500000 318.500000 0] endobj 6360 0 obj << /Type /Annot /Subtype /Link /Rect [66 591.500000 102 598.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 6361 0 obj << /Type /Annot /Subtype /Link /Rect [384 199.250000 420 206 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 6355 0 obj << /Type /Page /Parent 2 0 R /Contents 6362 0 R /Resources 6364 0 R /Annots 6365 0 R /MediaBox [0 0 595 842] >> endobj 6364 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6365 0 obj [ 6360 0 R 6361 0 R ] endobj 6362 0 obj << /Length 6363 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾Ï¯ès·X `i¤9$ ‡ ‡À޶%‡üý°›dÏL±¿jÖׯŠÅZ°%O‰µ¼½ÞVïþøåï‡þ÷ðî×~ÿðå¡:6®þ9œ~}÷üº=Ž>4­;üðë÷÷‡ÏŸûÿ~{>øòáÏýŸþwЇ?õÿþ|øëßúþ8þ¥Ó_øõ¡QMÿû/çß»Fõª.¿Ÿ~þ¯‡¿üîðÛiÆi¹q3/ÿÿ;S»ª«OÛ¸±ô·‡é˜êüë¿?üöðn@Ü*©T§Ê{PÕ‡ÿüãá§~iúêØY¥šÚ6Õ= 5ú¼’5¥»~&kg  MŸ`rÝÖé&?ï\*ÊÔ*<û±µF™F;{Bô É®muÿçÆŒÿÜw.cÚhM °=MŸ`rW%œü¼sq¨Ldz§F¸ë70M¥àð§éL^76!5ÕgA- • áxvIñÝV6%7?MŸ`ò.%rÏ;OÆÍxvAäªJ7€šZBO³'¿êgO7ùyçÒ@Q‹'O,§{ª™ØÁÍM>Œ$ä6e´KHK͙ل¡2áÏ.ÉÊNÙ„¬|™=ø]Û%œü´óT¬ 'OÍÊî­tØžfOºNÈÉç'Ã6š\’ÛzÔkKŸËì)€ß¹t·åaçÒ@™0 'OÌǺšî›®‘‡ÙÓì ¢«:Jv. ”Û³É?ÇL‚w2üxï¾>|ÿõáÝ'eUÊúðõ§~oç5‡ß¾ö q‡ïNΨªýñðû~KÝ_~莵vÓ‡Õ¢‘JÃolüˆnàÜ[õŽ8Û÷poàl¢ÐÁ{3p$~X€ß<2ìúãמ!’ÓroΫbˆ`zÁð…a¨<0[ ÷ö‰øã~³Óÿ¦éßÚ Ð.J ÐòG8‚w€G°nÂzζQú‡ÍEx/`:€òVCþÁRµéP›b,½’¥Cô²MÊ;@â¶:“xç~)zíÑš!Eã ÃÑÚcÛUç>|@ßè!ª:ÖjûÁ§£©a¶§I,œ¤ƒ ×pnÖx@xŒùfáª" 4Œ(ut¶~%f‘ Í4ÙŒl£ö8OëEÇOOaXG·Ä1Á›ÅÄ[9„ †xç0Ljƒd€·¤?­…R %ÿÄöc>Ío5m]A¹NŒ´8Ô®û*Ô`X‡b½Ki=ÆÆ»œt“÷ïQ¿ç¡Øîº¤(Û\™p²nÊ‚{[u7¹A;8‚½¾Š„Žïu0%1^ žúòàQ·¹y{!° Ž`I¨ñÍðƒXxRÊ«RЬXYƒXÛì$»õ°Q¯ÊÎ3ÏÔS,ØæÔ­»ŸSÓû–œ½ ú–ðõ|5§ÌÈ]îht«ú”#Ø)ƒ¯Ø3/íÛxZ²S3„Ì—Xf0q4F¦c „¥»HT,épä ë"“#7"Ž&'Q‘Ä8%py"³?äé¹`ÈÁƵo–;ôŒa KØ(8›)`§‰Þ`˜ÃÐÁ·ä[qÔ„œ[W>õ3q–\Ñ€€»»Þ±‹ïÚx„ =wôˆØÂ a•™¶Àcì©À1|XPÖìÄþÌ#ÚtâðŠzÌwpÝ”ý´G9¤£o+úP+“›’vÏeÑÜ”•úŒÎM}%{. ¦Š s`ÁÞά´ì¦Ì9â ?]óTÐ2šwó¬­€©VJòÏPÏ!¡feAjÕrª*†ÃÙ”;Vyi9âÜ»•ž†@W9)h¡b§ 6ßö5üÆxÎç#jŽ‘`ÏpmN`‡Ò]ýü¿<|IV‘ÝoÁCöò{ ¦l GìV–½”2ésÔ…O6M¯#+_n'©cT{$ÈåÄ'€ðð0”°–»Í¶Õ]YÒ^àói’¿nPäþf®ŒŒf‰;êÚ½„ÂH—QßàŒàÊ7f€¶2ÇAiÌèÿ”#ìiQÎ_™´Æ•‘G8^ç#œ Ãa0ÒÕào¦ ê+pFš£™IU<¢ÑyFƒòÚIs¥ê7íä­ ˜8Š=w„Øf$cm>ѼŸeÿêÓÆ1P°Ññ½/ıá²Æ'Á>Æ~e¬a–Œº°ODJ™K[ ÇáG{€™¢•µdL€G0âVFÕ%ÔjN;O­ÙÉ9ÔøZ^ö®#úð_…zŽÉÂ[£©Y|O­™2@³ù*¿#Œƒ2e˜|¼Î&kÑq&SnØ›Mìºäš÷ÀlëSQnÞg”®¾ ßÕ1Œ×¡èRTrÉÆžqEOÎî ½†»ƒ*Ò àÈæFbçÅ–7ap+Z^ŠÂÍÁoðHñû’ù#Û‹d}y‰qBÕ*¯n3YhÏáX¬é2Êÿî’ÄЋɘ×]òG(Êfò-pn2£ÝpE}&~ÌJW— 9 »ÞUu‰¾ÆGÁô!üŒÔZ=;²eb3Àß[-ÁÆ‘Äøte±žÈ‹ývCÛô|'!¤KpK£çœRž¢ $þ`äapÏ@‡±)JüŠé£Æ„° º½}¹&í;¤´Ä8>½—j0&QÖ€:#f+Ñ“yd7Ø}0íí§mj_DcN™ÇÎ ¢ùs »:n94ª¹®6 Ó«Ö®n¼5™ ÂÌùÙKž±]Á¨É=•àÚí2_MUÕŠÂeBDài8("–÷AiøJ%5†AkºÛ4¶:|7Ú½Öæ%óGÛÂpkUÜÖ<€­[Þä•hS]$Yˆ-Ç<™Á_늈éÞÅßÄ2 µ QsŒœ{†«>ž¾?uH´îùO~yø È4”|ÞÃR9.¥ x6êûiËIK-Éž7ÆòoeLj\âªve=Ò-¦x+e½Æx§~%¹$÷Ô'Èv…X¿gY¶§˜Ò{\ŒO®ø±ãÐ6ðnÔ+¬¢1…ÉvîÊÔç²ÀTE*ãâ$¦\Yà"vË}€›”ˆÚd»çŠ N ODj =¼{æ #&ÔøzÑ24« dG¨Ëå:7†¸dEaómËtMü3V…¢aþõ“qÒ9Ï.M(™œ<ªJ$…—1îª={;(­`  c“ëZå?Ïš³÷rÛ¹—ÈŽKû€M#pÜ»6Ðãy“݉ìîjqOZ¸7óÒ5î" áfð:poT–;Üu ï1œMÁ00ÀXÀ}yq_éõâþʯâqåÞ®·€ß”L½ÊL½ø<°4E‰p$cWôNÙ—ÆO\ ŒXBá‚“›z°F%xïï ëç]&í2é†L*Ì:ÿ¾Áô­åïXܸwm;-I8ò˜¼0á«Ë‹Te¼ûéÊ^ªa3½«±M†_ÂÀòÎá`M…w×Á/•Þ0ÁR ŽÈžltø:^뼃À›,„~ÅçÉõ‹®ºK_«S×OÔÛ;ì)u›O©cª~pêAÀÞbBióñ6Ø+ÅVµ'š÷^)ÑÚmèô\½eè×Ôxkî]X⪸˜)|;¶Xþ®#ø;—‡lM^­À«¯·¯Qêw&_D¢ï´p)¸„iP€m¿<ßœÉ}^³â «Zu÷+Aœ«V¦€ŽiÓË€˜A²,i‹ “yñóäÍgå«ý¯Ã·žŸƒìþùÖ_X ÚkâÀô”W©“vЗ8²‚,‹æ (¹¨úx>2øTëùÈ?×ÇÑ|Æc À#ZÇܺÉ^ÛÛ§ñ¤3St$'lX_çáK|=?àHEØM†UÜ•c(<üfä uôgÉ,ÁþÜïxB4†ÝÇxиŸ$3Á{øù")ì/j=âÀ I@14ŽIïÀ§ññºG¯~ú–Ë] 󻨲©Ìq”hËÈ“Ú82Êö[rýðùáÿç=›^ endstream endobj 6363 0 obj 5175 endobj 6367 0 obj [377 /XYZ 32.2500000 353.750000 0] endobj 6368 0 obj [377 /XYZ 38.2500000 292.250000 0] endobj 6369 0 obj [377 /XYZ 38.2500000 785 0] endobj 6370 0 obj [377 /XYZ 38.2500000 785 0] endobj 6371 0 obj [377 /XYZ 31.5000000 354.500000 0] endobj 6372 0 obj [377 /XYZ 38.2500000 292.250000 0] endobj 6373 0 obj << /Type /Annot /Subtype /Link /Rect [219 763.250000 267.750000 770 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 6374 0 obj << /Type /Annot /Subtype /Link /Rect [113.250000 755.750000 143.250000 762.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 6375 0 obj << /Type /Annot /Subtype /Link /Rect [183 320 212.250000 326.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6366 0 obj << /Type /Page /Parent 2 0 R /Contents 6376 0 R /Resources 6378 0 R /Annots 6379 0 R /MediaBox [0 0 595 842] >> endobj 6378 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 6379 0 obj [ 6373 0 R 6374 0 R 6375 0 R ] endobj 6376 0 obj << /Length 6377 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€)‹‹6 Ð^:@ È!È!˜É$ŒqrÈߪ$UWQú(ñëGJª–Œ¦E>’o_ÞýñËßÿüïñ݇/ÿ>þØýùáË!;•yÖþ:žÿpû]º¿Ë*?þøíðýøýðùð¹ùï÷CûÁ—nþö¿£>þ©ùß/Ç¿þ­ùáOÝ?:ÿƒo‡R•ÍŸ¿^þ¬KÕü-»þyþù¿ùÝñ·óŒýr0÷ÿÿSYQžÁ˜Xúû¡ß¦ºüþï¿Þµ¶Ji´2ö¨ìù?µÕÇÿüãðs³@?}vª­ReaËì5 •ú¼’¶õQéº9›|°Îå·Ìì*ÂäÆšx“_ —>e åüTY£L©s{¾åó çU¥›¿—¦ûõÊ#kÖŒwÛ×Ùc\ˆ­b¢ÒòX· '}Û¹UÝ‘)áÐ^¦0yÑJ´É/‹ŸJßxvIÂ]fEħ|=ÆñWÍ£M~<ÖS†“Ç~ÊU®c>å—é#L^ÙÂòhOÏ.ø”R&ÞS~™=Âñ•ñ&¿@é)ãÉOUÑý‚'—®ÎëÕ«ªcT¹ÞäºãŸ:«#\Íuú÷Þ<¼x“_ ?•«ðì‘9„©Š,"‡¸™>Âäu‘D] Å!<³ ¾f›éNÓe%D/ÓG8k²x—ÛB.~*Ýågÿ2 ¥ý °$}÷|øþëáÝsuTõñëÏ d—Û?¾~;4Àþp¶52Ë×ŸŽ¿Ï2õü‡ã×_ª°Ðy _7òdåe$?5Øeè:¢+â ¿©Ñ7ÙSû9•ª*ïFð~ZŠ“Q—› !èÎ@òÚÜ­£ ›Rh¼ úp)O¦ÎœsËlêìS;Rœªvº9ç×Á;UíN?}m^Ãë¹>6²Ð"Û¬EäzdÓ¶8ãÄóþ2RŸ:SÞm dí±ÛS7p³µ]«þo¾Ñh¤{c³Áoºcig3ýFo °hÏ~ ²ä§FÇQzùàVý“í¦›qnÑ!vš™v¶—àm—ì9b¸µuæÂð7ø sˆfx?j|-xʽ0æUb`]|Xòbr€7Èœ,sOj]‹¾xÖ,æwzáQ·LH Ä05{©ùÜ+o”?‡}=#öµ³•U¼Ìê^¢iqB qâ|µ—›Ug™ÿøíPØìö¿¾D“úºCi ?óÑÅç8`¨‰˜I§š!¤);Y¯( ù‚HÌ<ˆß<~Ùƒéñm0Oa3˜˜¥…êˆáNµéU®¢Õb_pUÍ~Xä••Ò\LñÜFÁ€×ƒy›çJÓß°ø8”µ®s‡²zÇØCˆç˜% Ó&õ(uc¾Þ&Kp >HFzųÍg¬”°?ÿ”0±ò1Y`y]Bà1+«2¿Yé윹;ÖúÔZÅn!}B#¤c# ޼G#ÝŒ}c!l5œ­„#°u¤f üÍ3qnpÇÆFðýTR˜„Ø‚ÖÆÅ£µM­KšGcRMÓ:¼Ób¦®w>Øó¹ª¬ÓõLv÷ƒ%t½3÷—ÍhKúÓ|ÙôÁLåÖ"ŠBÇÕù|T~Ê\_Ìœ­¥J÷CsΚ¹;$¶Î1êÙ|õÖ3 ¡³ø<êàûÙ‡Ü1ñîëš>·ˆì½(]1ñáÌ'\¤§ô Fç  Œ;@”¾lʶ³…+et~F3ݨ¯VäÕ,å_þ¹¦òm®—,Dä–JU¹Ë. ­lxBŒ´W"ôh²¾kâeKõ.€4~˜˜ÖWÌ[ ¯cÔr ˜le>”§ùçG¨ŠŒÚ~’Â"a¸ìHX¥ïï3ÌŒ •Ø\ŠM¹x ÃE-„ÀB¨=ë¼Ow'&S“ðà‘ ›Ê‰ö@€ üĈn‰TûÁ&yü&ÖÑ9<Øã® Ùscœ6× Äì62ø ÄÂÃgP}]õc|x&ä†ÏNsr̯±>†ÍBÔE¤Q‰¨ªMl*Àsó¯ÇãÈÄ…Ù:œM·°îºÛH)¨Z]õ˜f$•h‰ÌV2ÛHøÂ°1¢éªGàm3’ÃoðˆG4Åb ŽWÁûÁ"#¡y¾ëx¢y0lðCˆrñP°8‹…}JÁPcJAîñ<­ž†³Ørç,é9 ı‡ã9;gÙ9‹8gÁïgç,Þ[HÉYŠbç,É9‹Æ<ÂÀj ú„Œqqç,;gIª³ý5sY÷¥ÿ˜0­çº÷ gú>ftìšâ¿6s·|}”WñØ”wiáhóW)Ý yi'<#Êx¢i6žJ¬Ç‘˜ñ¬¦ÂfÖ•Ã&Ä—ÚL‹å¢#X¡šIr"…Ò‰OD6åwNŒ2€#u0„ú+ëôpòÇ ËÇ ¥¤V…yM$ášGóOr?^‡àã ϶É2x?Q ñ@áÈ`<²s ÏmËR|#F;'Œ/EÕ[î»PÊ½Û <Ö„mæ¹0áj+®»‘RÁ,MŸ©cˆÇèyÚ˜Àʲ9ü!©²˜ïÕ‡VÀ¶S1gŒŒ·K–¡ãÛÆ#¬>aÒ@™W“·µ§y¥Mó*Ërž=ÍKz?{šW¶§yùåši^êGeôý¦ÃÊÊ 2³e®‘ëÖ³Qî[¦ÇüR½²¥•™´*¦œí°á¦”5¬bÂ|$J•eðnKYhüíæa2%<¹sOŽð»S5ñÓž ¶‰Ès¥wÈ„h•çëu{Û«G ëJi:­ª¾¸À›“í±9“øRgvò¶ÞVlN­SG+í±9>š$ëuÕÇøWòîmò´=ÊerIøÎö(—ÞÞÐÛøèºî}S{òQ¶÷ }AÊW–6—íäËc.Ç!F²eÛ‹m2e*UWÕ•°¤xjù2" Ƕ²·0(&.D°àä;Ši¤6Æa“Ÿ6².þBWèªYá³` ›{h1Î6‰Ú™»™ÜK‚e?{.Yö~Ö'¯i0å5ÆI)«~<˜crc.<•œ×¨2[9œXcß öy`{ãy´SAŽQ»ÖèÜZÒv§ŠŒ ªpm¨(C&rº°aÇTcÓÔStôÑyé/CI’µ=ãéltëšÉÔ5ò3>|„=ŒbH’Ñ߈»ÃÖÔ«72e\۞ƴ¿ÌÖš¨›¶‰ú-Åm&ÊŒðp¶ûÕôT[^ic¶Ž ²!–š<3Ž€ÄÑÝ1[NÚ%†æ–XÚ^™@ŽÍûð2ƒ]0Ø@ jÀa°‡²b0 `Î@”"39GÇÕß®G~ÛM¿¼HVM*…wù~á|Ø ó0jz’uXŸ‡Šú;D”Y D9F»zJù)«Í½Ö*»f!lÙ`l¶öZ”>H†˜F0¾Ó>HDÙ Od6Áâ@â¤Í°È)L‡d…Ìm l)ã’BLR¦]%rÕfœÅ©ÅjŒBo ¢t…˜2©X–¸Ž´ÞlT^Sûw?ÚîG fº÷£½à!á„?¨˜[*OcPÁ‚‰>ÈD0›‡]VFg¤ræ÷Y³|Lq’Í`­ÔÅDÃ[ OË…É„_‘RAÞŽe:²!:‘c7kÏ!èñ™cis—9îsQƒy*ìfí5‰(ž[œñe 5J„Ÿ ðÝ#˜Ä-¹‰GP¬i˜˜Ì§‘*ÒïíH*Á3jð½®]˜HòDtq"ÏÍ#É"&‚ó‰åä™_½r°žNT£ÚdõµêÒ–™±P€²µå=çqÍ÷è…[”ª]',Õh”-î¯<Ì ÍŒ{‰WÜI‘O³÷—ÞOªþ«¡iBŵö>ÜÙ^‡‹ô©ê˵šñá©üÒŒ¾¶iëžÏ˜Í¿¿¸Žß]œ²'­{·Fßx´UU)(Lª®ƒ¿)àþÂÖ±ê1)°F³u–ý ³Ætd_üªJ–@ìžÕØ]a= Ú¾ áÒë˜Ç’ÁÐL càÛd#ÄcØwâRySY÷EìÑ{´GxÄ}1Ÿ²n³-ãoPχ0ö¬F¶–„;ƒª£·|¨?vl0ÖE|øLQGQ(Å¢$<`DêÌWé¯jãRÅG5{` …õDlñZL®EˆCöùm!¼dùÀîGËiÞ@¥’åƒuÞp,Ëz£‘â{(u~µé=Ú³3aë!prUUª£¶ã.Ü ÚšìZðùzüö^Ié€鎿8uvÓÁ[û¦FßtGÙÓ ¬í=š­3y|“Áýth«ÕѺûZG¥Š0yïl_.þoðOE :¦ª†-RÙz°/BÍ£‚½2Id» ã8ÔïfÚt/UHF¸8:‘…¢¿%2.Ù¢ÛFö#ɃI@+èùB¨5)ª¥C;º®\žE<*m`UHdàô˜ŒE׉mdHx€m/˜Z-n¯¡Ü6Ä7!© "u]®4z çsÕ9 oˆá*õ¸¥¡+ÛÓ¦F9y\²&6[¨­uN*>+ª­ËŠ!Žªs,¡XÉ·•J&â“U˜ ܃´T<‡ÙKäÈ­¹€nHÉü ʆ Ø3JIÔM),†NÉH ìm×ô7¦2%ÇlN*Â×g¸©|t¨qx8i6ˆ·î±ÐÄ­ÍåÁèT¿E¼½©2‘! .èHPJÊí+ë?_ü~ì»ì–b©;ŠÕþd©SÜBi‡Ô1Ò¶ˆæÏ ©g'Ú¶=:5<ºó \ ÁšæûæHjuûƒ__<|$¯•s+¶OPèˆð,ü ÏaI|¢$"Y'{õëO³†~ÊNÊPs&L6 ò ‰QëDínËWpwF¦£ªAˆ6¤Šr”‰c~Ro]>MH¸ N\Czvº¦vkË7Jà‰ÌŒÃ´˜3î&Îäí0}i±§9U¨µh†ÍÝU‹§×2#{¯N4DHòÙT¸†Œ‹qö0R-&£SÆä¸FÞÜå­¢æ#&BO¦s@äa@H,ˆòrØî2ïë$•($"¼Èêi¢õÑ#ÇüR-dkqNyËØôµÀ„’’ DìLßÙB±q[L¡UL¦[kGd«¤R Dk0A‘£±¨X\DiSîsÙ$\B2`”ÈC>#^ˆ*);ë tc”;&Ÿ:$PP´¤Ì­3‰ ¢ëLbdDž[Tž;_Ë.ù3SXÕãíÂÚÍýæ_ÊA 2x?¢‘î¡ç' ⌃¾QOð›}Ó½Užj=ÊAτ˱ÔöùÀ#;m¿)N悦³ èDž±|x6›çuŸa=œ­Ï|žNñ /QZô<j¼ŽMñ™g×"±0˜ïQ¼‘‘ £¢žE*AÔNY"eíV²ÞvÑô‘BQ²}¨7Úê;Q%FÌ¢Š­9xdM=wl¥Dm–Bç[—ÏJ&N[èzSE$-t/-ù*y”êʈ7Ámcfeç¹Ãð<Ô‘)«öÕ)\}bÞÁP„Ȇf*£•‰ aB]E#Þ(r"ë@}ts“꬟ç³YGë|%eC¾<ïã¿<…OpAÜAö¼`ºTxúdàöYðM4eóœn%7µŸ47\çÓ7¼þÒ6Ñ›øáfgË7?LÙ²Pvúmá.8Çpƒ@Ù¶y©Z;2øb³ðwf1lLÿ"¸Žú!€#¸©`*¨= )1µcð¯ƒù;)+Ƽâ¥{øÆYzI´wµÿq3R,Iàý`¿1D‹NOo1¦õ,† Äç†o1ѳâ-`É ßOŽÏSUL™v¯^ åz)×(C3cÕRMKÒÌkÑ•ð~’Jžõ«t7†¦`ú°<%m 9Óì;ÙN m-%*³zú¥ªíRר=ÑlÆ6¨j¢ÐäÈ„Pí"g1]L$ "S4’ñŠa+¨í¸TÚÔƒÅ?¬. ,z=Œ4ÑuQÛD‡ëìq{\4‹§¦Hªº"qÃQïe£Z¢”®+KH8™"‡S Â™*NDÇöð¨™øÁ‰PsE¡X‘[ÆÇà×1ƒ§êÚa›TŽÄA9{ÿÐßý⽓’u­5¶©Pf9êá±<)] (o‹Yí¨Ê4ræÏ\Xç*ûØ.K:c⣶ÎE`û¥*dã,/>F(c”í…![fZ¶à$ËXh×,Z„4€Zñ˦Ž-–Ú+Ó9n±j|«äkçøÞ{¾¶"åŸÑ9çWÛñr‰.í»1w䆪`$&,Gg’KeýI‰‚²­«"7ÆöxàÕL J&Æp‘y²íVBêì.lZÉzã싊ø›}«fU—/WÄZÂÛT§\Ñl2ä6ªĸ7L‘'Ťø&Áê¥b ¡`ŠzÊåËôé„ûÐ-Êàk-¬‹$ÿçÇóír[*'rz«k¦f”‹—ët?kÜ÷ó6¤S¹_M&dL–j•‹–o˜j­©>^®µ{3©œ\+ެÁŒ#‰Õ’¬0ôù¸`sþR3©ý ' Á”µîŒ„Ò”™¤,]Æ&gu”w'ÐɬÃGš@RTjSÖÿ-Õ=ŒTà !vÌÄ)¤ê1FEX&*»©‚L rõTTŠ\A[y| û—Í ÈaIÕL Ž[‡Ñ1Ö4*ˆ K‘8ŒkÉÚxUÝ×ÇÑPèbF¨Ì~\S«­mºjžPM 6æ~±§±¼Vz=Xž¨~…ªo“æäM_Of¯=å³8îµ§|ßX1Çñ ŒÍ¯«âW‡k‰šØÂM«ÄÛssó»‹Û|8Þ–ò5§l?HÞƒLõ&“ –ïJ#›@R‹gàÌgš~2b˜V4Þ wëo‹—ÝÚ6¦ÿ–‘­ÒÉÞná|ô$_ª_QûNÇZRŠv×)Á"ÚznÍ 2ÚDB¢Ë_˜ª_§,Î2ÆåTÅ¢øX¼˜J”rhº}DÍð²ÕŒ„³u˜[$ö³·Ã“ÒBÓ9 l–O—Ý›èxÏà•MtšßÇïÍUzoúóÔ?˜A3«ñ˜XsÊÔùíõ5ÈMÁÖŠå6·ÏHŸÚ.÷C)†#]ya}*]Ùd±Ñ:fÊ;Ûs·SD~°¤j]±;Ï‹á»Ç©5–G¶¡ðlð›NPA[¿ñí°wþ{qÑøì>…£€žâ@chÓŸwûó¡ysÑØ:/£¾4Ï:Õë/ ÌÌ©{¼ónBCC´¾ m›¤PŸŸÿïæÆ7 endstream endobj 6377 0 obj 5567 endobj 6381 0 obj [378 /XYZ 38.2500000 443.750000 0] endobj 6382 0 obj [378 /XYZ 38.2500000 73.2500000 0] endobj 6383 0 obj [378 /XYZ 38.2500000 305 0] endobj 6384 0 obj [378 /XYZ 38.2500000 443.750000 0] endobj 6385 0 obj [378 /XYZ 38.2500000 305 0] endobj 6386 0 obj [378 /XYZ 38.2500000 73.2500000 0] endobj 6387 0 obj << /Type /Annot /Subtype /Link /Rect [192 359.750000 221.250000 366.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6388 0 obj << /Type /Annot /Subtype /Link /Rect [373.500000 282.500000 402.750000 289.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6380 0 obj << /Type /Page /Parent 2 0 R /Contents 6389 0 R /Resources 6391 0 R /Annots 6392 0 R /MediaBox [0 0 595 842] >> endobj 6391 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6392 0 obj [ 6387 0 R 6388 0 R ] endobj 6389 0 obj << /Length 6390 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ€ €µ+È!€ 99rœÀ°(>äï‡3$gvI~Mö7ÕÍæ,%8R–"Ù¬ª®ª®ÇWïþüùÇý~|÷ôù?ǯݟOŸ٩̳ö×ñüû»—?ÐÕ©ûû±¬òã×_ߎߟŸšÿývhoøüô׿oÿ;êã_šÿ~>þð÷æ‡?vÿèü~=”ªlþüåòg]ªæoÙõÏóÏÿ}øÛŽ¿ŸØ¿®[Ìëÿÿ)ÊÌTçe̼úÛ¡ÿLuùýû×ßïZø½¥46+‹£²ÆUmõñ¿ÿ<üÔ¼ |vª­ReaËìž•úò&ݼI× ÙËjô¢Ëo™Ç«7™ ÷ðËÊÅ©¢L¡ÜO—dnó¤Ž@Íò$º=>ÀËæÇÁ~Y¹8Uzæâ§K2·ÈuG |¬"è}|€‡W!wîeåâT陋Ÿ~ª¬Q¦Ô¹=3úÌ伪tó÷Òt¿î$Zi[¢Õy–ôOÁ’º¨ ÓyåÒDéÙ .¸•ó¬Òá8{{zâçª gàÛ•âìèáŸ|‚WÒþx‰ß7¾ÿrx÷QYÕ²8~ù©YÛåí_’äÇïTY}üòãñYf>þéøåçC}*tÞ/±½’itEï1èŠ*à=ÏðÊÿ÷x%«áÚ*ø4 ïW˜÷`Zã÷8žöÞÿÇÌ9,˜sðK1Ý ±6L7ÓRç×f³ßgºšç#¼¢áÞÔ9ñ4BÆdwæ=³Ïl毟¬èžÁò¯žà à• ¾'Öª1·±$Rr€ß¿‡‘SGÜé¶¼c§;¨ˆ9LìZYb ,;´¶ÜÝ¢êò¢¸ƒÃÌFÃ)(IÖ<˜ø \›Ã_À>Íá/àïat¡eù£ñžÁ߃ùÃxÕX;`-„=0QIÄ–ßcà—:öœ(ç˜óæ¶cÿ`.”„5"è¶ŸFÈÓ¦[¤}šA Á{!Ÿ«Ê#[d‡ÕSð ÞµX;`½Žõ –¬Q $Åä£Îì<1ÏWªÍoµº«ì9Lôi”öÃòѳׅš·ÊØZVÙáqcú®q$tãÍÄŠ:íÞ çͤaýuµ@‹ˆié,Æf—Å“¿fœ=YÓ–#ݘÐ:ZÕ©ª³ËJ‡ê`ê‹®tkêim(Çœr[Tå«+-³«%/6ƒÚ¹1Sï=þSkàûdI€K¼Ç¨!-Œÿ‹;Q™“Ñ•j.- ¬ã=Ë—ðñV”~"b‹wO§^'^Xùk—õ±WÇqj‡/âá×bOø/Œ7¤+GÚñ¥ï‹:?#gùô±•„Bå`ör9wÈô&™½ÁÜ#"K.œcø”AøÜç%GpIõÀ498B¨ñqì:¼Ø÷ÃÇc>C³6~ˆÈnÀÔÂÊʯlè…:R1–vD.Èc‡Íb<QryœßÚøê¦ÕNZÌŽƒÂ‹?_Ù–#$b E·8öaf +Bï¸A@›UWùÐfâJmjB?S;U6)KÆ•Rèvuv*JuþÔÛ•ö=*?eµyMœ?j­¿Òý¥%+hšR=±o¥á˜áÓð•ÕΉ½j¹`Ä2›\©7ˆ¹C”¿ÈÎhˆÕoÓ%WæLYD G2–>Hy‡T{&L Y$c܉±zqI¦5ÔëÏqè¦ü‹Y[$¥$°3r•_㉱ç:«^¨_šˆðˆ­Sø¢ºB¸`™îQ«+—µ¼H–ŽæWÑìÃç~C5ËvsQóI‰&;fGSçïÕs7ö…ax©ùÕ+Íßþd‘ÉP&Ô›Á´´¦xôд¤ScÒ)p!@}:ßÿë!o(õâ¿>;ìqC~^Âk®P±“åãá) ‹öI©hÞÑ­–êVT=lëcZ=êq ú¤ [BGjù@‡ ÂY"‰†SaðùLj‡2†Z¶•ùÒõKÒq¶,~ËƒÔ ŒãÕ°aT++$¤6+FõŽyKÙÓÞ^BuŸ"H¹„ŠÚJÛ ‚Æ!ê½ºØæÔ‚•޵­U Œ!Ë7RhcÄO+¯­Ý¥E‹îK³dÀ “]Ë1ò“Ùáq}´¼ K">ÎÆjiW7pxŠ6ï±WS'ƒjX´¬,ô€C.j,Þë#G÷)B íV#¼é=XA0Ø‹¿iT4¶±–WU¥‡ŠÇ¬š$ ›HˆãѲc±¼zÙ:GHœp€÷Œ(ÓMÌië×G?<œ+d­½nS] ‘ˆ£L7¯Í«<‡J¾.÷{ßr I¤ úà€dfÌc×?þ«h±Y4cçÿÃ…±0¶lûøÛUׯŽËSh²÷é¸~;²wËØCbµõ‘†ÛvÁŠŒ1Œ[®E° (øh¦’œIQ2¦G÷e»•ÖêŸ(bA¦­¤¸ÿ«bx4¡ÒÿûÑd‰JZÿh Udöˆ“Ïôˆ4%Œ‹DÆÚ˜P-š£’ÉDŠ‹Ê,Ú©¾vã],'|\-Ïòy™'\ŸÝ‘z0Gj;¢‚jÈ ®>Žk÷G6êÈ–µPÒLQ©æëT¸²š1¯6A|¹æŸù|bn¯ß€#Š5ºÒiO¯ˆ¢~ïѱü«²èy<—· Ë„®ö¶žnŠ›WðVAƼídÛ+à«¡às§9¦žV†f¶ªì€º œ:#e© W$.AËÔ#aÇÀjÈd‘Ap+iªz°s’n½Ø£2ÑZ˜>¢¼v+ŠÓW¨~ˆÃé{ò÷2è:œ¾¹Dvxw°°URîàm=»;(ïÞ¨»~'‡tK‘ÅMEü"›Bºƒ#=¹‡±8þ&xô‰êw4*xÎïèŠ×§ŒöHp —¢ÁòµÎä…÷;J}å~¤!=Ž8>s "šì(€;Y ¼d¿'eïçEfŒQ³ðgx …!tLXæ×´ƒ¨ RóAÖ=²x4¸©Þ¦ ‘ñfà7ãôUl]·0ž¾Èˆ-áÙ–°ÉbêóJ_ä²ú3å·Ù0UX¢¾ºììZ«_G²Ë"j…©™e°ë–—¸8ŒÉúþ',\ëÃF$–O¬L&ÍòÈ•—ƒ'Ýg`'Óke{Ô™4Ô€µXÑ_ÈA‘[±Ãö©òÖªì÷9.ÕÂÝøèŠ»¶ÙãPçýd™X%¾ öØ$ÝŒ°Éº«ý ä”·ÕJ²–8„_2¢Ì@çÁœžD[¦bØÏ™™óuÝÓgý™ó”{Íœ7y¯€‡3Ò^þÒvmÅÉ(=`â­¦cù$v¸êî8 ôÈ.và SkShm-šmÿ®:ƒ÷ÀUwîÕÔ=˜:ø=Oþ_Ú™€)Z_ÚIÈe“5¿ßšÝäÜlŸæþÁuUMg*Ì)SçO:ê¾-7SP=µë.'tqëÌê“n7È>ÅøJWÂÕˆâZACøŒÞcæBSkûØ})ÂÿŇU;d3Îlãì43ö±W5ñ ? ÞÓ™Uåõé/à9X;ÿ½YqÏhL»þ" ç’lSbÓÓ»ýùX¹½`4†† À"€™æxOu?ÊÌœºÍ»ŒÝ9uÊ{Í3«¡>?þÞ°w¹ endstream endobj 6390 0 obj 5276 endobj 6394 0 obj [379 /XYZ 31.5000000 161.750000 0] endobj 6395 0 obj [379 /XYZ 38.2500000 127.250000 0] endobj 6396 0 obj [379 /XYZ 32.2500000 161 0] endobj 6397 0 obj [379 /XYZ 38.2500000 127.250000 0] endobj 6393 0 obj << /Type /Page /Parent 2 0 R /Contents 6398 0 R /Resources 6400 0 R /Annots 6401 0 R /MediaBox [0 0 595 842] >> endobj 6400 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 6401 0 obj [ ] endobj 6398 0 obj << /Length 6399 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àjć( ðØã90Æ@AÁìn‚EfgùûQK”ì–ôQ­2©¦äï¬=f“,Öã«*>?ýéë?²þž}ºÿúŸì›û~ÿõTäUYt²ó×o!mî~Î*[fß¾Ÿ^²—ÓÓé©ùÿË©«ðõþ/ÍOÿËdöçæï¯ÙßþÞüò'÷¡ó¾Ÿ*Q5ßÿÝ~¯+ÑüT ßÏ¿ÿ×é¯È~;·Øw爹ü÷ÊØ¢¨Ïd,týrê‡)گ߿ývúÔ1`]/•2…°™ÐJg¢Ö2ûïϧ_šú拼ÖBTFWÅ{:ªdÛ“mz’uÛrÒOû¦u¡qae¼Æ[ÊC3E4D{)YyVŸh’ZÁ|%#ªMKy,ÉÂÆCJVÙ±G©ÜšÐx)"mKyp®ô²Å­‡niœaIcbðßD´[+눚s¦<8WzáâÖC ×ZáTNÝzþ͇o¼*TDËm)Ε^¸¸õ€Â­ ëLKɰüÚ| áêÂDÔœ3åÁ¹â„ëi=¤pu1N~m=ûË2žáv”GЦpã!%k gWe?Cë1˜oL¼H­£<4SzÉÂÆskÜø3±k{î·M¿ºÉ®ãºk\ d›Ö‹fh>‚Ümó_<¥j)Ε^«&­?­i“ÒýÌü¼x*~~>}zlh2Ùó/ em‡Ý·çï'Ýüã<Ð$Ï?elè©Ìž=‰2/juž;®-‘]‰Ím]ù¶¤°¤‚%÷m‰Îµê¦Ý†%º:¯5¨Q¬o^v%Bä¥6¶)|­ó¥-)ó&õ—­•m‰ê«¼)ѨS m‚PS0a¤Pë%(ºF„ê¹r±¸­à0n¥ž:vÌ?øQ/,R\21Öfh”’>›ªvX<$£Ä­As•WóOhØ<¶yŒ˜‘jLä_½À %`™ú»~¾<7n.އ*›¬ðÒEÉŽ—¢ÈM%.Æ6eeHXãÞ ·¦ šh EBÁ¦¸ö@@åŽu^™ò’Rœ€Ù®ç,sqk$S‚š"(èyàq^XWWh  ÅHÆzçeBÔ±=Æv¬néùSŒ-¤°ôú 7OQb!?„ò;v!32öRÌ3nG~^ˆžgÔÉië ~ŸQ‰cÔ\jŒ¸qk˜êâŠÓëˆNãL.[~^5ÛÍõó@àÛýzÉ œÃ$'êPŠ,´(€.We«ËBŠ>Âèéi‰¹àï*¨DX"`k°Ž‹fJ¸Ìµ¦ak*!ñS` TßC¾•°5XgоiÉ䦶æ)ä›R°Ôª°` Á(XGmiµ:^ݾ$e«ÕØ6a?··@öÉXzY_Æ?¡4öæV{4KW‚"¨–+ȶç[ÛóBâ(…Þuâˆ-'Þu ÐÒÓªD Ç“†Â‘bùxÆ6­æt7‚;•¦bH|—[𤡄TÄÍ­î-EÆu`‰„%Xw0G±îà @@=H€ê$‚miÍx•r°2:Rñ]Z:û¶TEåe<Çéû…S~Æ€…”_™å”2å”ß)ò Õžô®án•¾sŠLwYZô›êBˆ<€u0mž•8`Únž<§ÌìN=úµ×lÀñ¤êæ®À %77>$nà©ÜžbòŒR-!ÖP&’F;ô¢ÎF>4å|Ù¿oçß=TCË¢ÜzO⦠ÊÇã °sL°S[8dLPóa’½Ç˜¯ÆË®œW'€5œW‡æh`šzKÁ¯e0z_Ôጎ=ˆžåeMi ¾:ê›XއC|Œª½Ä³ ŒƒDLÃÒË£JëãXº€–N™1ÂÛ«=£Ã1ÑÁÔ•ÖB¾"iM¼}vÅ=hgíA%Ìè6zó¼] Vr{ÏÂ;1ØõÞHý¹/^EÚ«7¢œû’ø²~¯)Œ&q”ðòÅV×çzhÛH žlÁx3:’|HöÃ; ÷*¹ »&)sà‰DYÒ¼G“> ®ï3þâk»SÀ§ÔWm”æSÌ{·t‰åƒg±ÆbH˜÷ctð¢ä5ǃÄÙ°Ôc.Ã'^÷Ž· ¯(áõ‘bÛdTeTM‚£ª¾øÏ ~ß›²IÀD<˜UµŒ´S`£µ}Þë¹ÇYƒ…ëjµê· íóºZ|!+¾(5ì;°ÎÍÍ\˜K©»®pŽH¾âÖ]ï:W'è5²|an ç¬ë£ÆÚêÂ\U®wÎoŒÇà@‡xÛôF#õ\Ù )ÀŠÆ¡;¶ º#pòD^Št¸¸UÉÑ,]–PooµìY’ÁÉ/Çìø²q¶ô…„»´ýš‘¼G‰£è¥ë œÂWS(‰N•›Z}Ñ#Õ”$=(Õž@Àé!¾WP¦É9 6qfF {þ)sð8Àp×–nÊRÏ1Jˆ–QUÑoÙqX+T®:…{%æ••S§‡LŸ«S£:ŽQBçcµv3€3­I‰êpîS‹irê3CæJ¸™¥Úïªáæaí{‚cú™¢ClÕ;­7%]pjÇ>­“bžãÞîÆœÅƒñGÁ:PNAxŽ5ÓÃYÜ´ •Û+Fìa5殃ûsÉù¹U#ÖÂ<6ÿiØ6àÐIý,mß —Œè÷ÊRŒߨ°1“”ºûbì 1mXšX‘1m!¼ a¸Ž‡]aýe\—áî÷‹œÇé±Íàm žËñÖ|ÔžrAÞ|ëàÄô.6"Ù&=¾ä®jÙo¾¸Ê”±6Á8ÔBÞVá¬Õc…Ã{»°ÂQnM¡Ü¢‡OúR”4zêWÛqî·(îUªHJ‰nî„f¶<9‰ˆ2/êÑtÀl Îr’¼1ä¨Â 8=PëLS†`8`3QÏ©©4–_úI±"ŸLV= ’¢Ÿ5•“Y»õu®SÃ:¶ÿ&ät¤I}GzåâÌ™…)ÀÜé4®ÊÈL®„颂ã´IXâáÎ`'`£áÜx ÕNKç( ðÚCµ%˜oõúñx(ÀuàH=­Éõzípl¦–îë(¦@—¨Ž+‰?}j‡uz5ˆwâ>°Ë™LgâÌçê”É‚öÌÝà© Hö[”„ÉâÊlîg:%‡ñ0ÛÕó§aE‰'+(!ˆG”+&Rƒ¬Klx†•ÆSVL3L~A°:l5ñV£dÚ1g<µù*J¢áEŠÎR¬XžE2Œ&)zæ&WOqÏÁ \ #­ÀŽ­ÀÓHP9‘ô§±“…!,lìTðú*,Yáƒ=Ë%ï_<¼]àp‡b=aµŒ[¬ «‚z$-ÛmSÅûþæÄK(ÁŒÇ\1‹ kZçHY ¢GDW+ 3öµS³ÆcÂÊ6 ±ÖNÚ.vÍ Ç¸÷<Þ¡²Ux|ó©i’÷ 9X<ð±"ÚvÑwƒ™)mù³™DÞv¦yL>%§;FɽVøBDƒçâ´\ÐãwîьFÖࡆ€Ìžå·¸YPØä`MšB7ݸ{”Û¤ò*ê”ßvp%Qý@=Vý=aC¸õåå*uÑ?m®à7ÏÆ¼G ‹Ÿê§œAćZêìy4Çn(=ò‹s”âóñø,)æ $ø´=áÁ Ê#ìžmøjiOrâñà XîxìŒÒ†s,ʺ»|zˆraš‡6Š•P®¤\—L9‡ŒKÏ 4„Âë7Ç›¯ì¥i/Š?-}àŠØÄΆjBå…8Oµç!ßê<>”[ͧ’Óò+fŽÑªWgzJR,Ä"3ý¨¥Üf޶G7RtJÅsüx Ôx'ÂÜqC ›¯`‰Fø5XÇ9l±jèo"eªÂn(îy÷… ˜PTÏïî÷oKÄXÐx!vŒU ÍÓ†è·fMîÆÃ ‹ÏÜ[¨GXöýzT*wtBI8³îáñgO§ÿ©êI endstream endobj 6399 0 obj 3791 endobj 6403 0 obj [380 /XYZ 38.2500000 375.500000 0] endobj 6404 0 obj [380 /XYZ 38.2500000 375.500000 0] endobj 6402 0 obj << /Type /Page /Parent 2 0 R /Contents 6405 0 R /Resources 6407 0 R /Annots 6408 0 R /MediaBox [0 0 595 842] >> endobj 6407 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6408 0 obj [ ] endobj 6405 0 obj << /Length 6406 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWðÀ2ûÁðØÞ9Ø@A7›`‘]d²‡üýH"%I}¥áÇb±)ÉãÝ«‡Íîz¿ºúý¿ü=ûçoÙû_þ“}ë¾ü²É·U‘·²ý×»×øzÛýœUu‘}ûeó’½lž7Ï»ÿ¿lÚ¾|üóî§ÿe>ûÓ³¿þm÷áÝ/íá—MåªÝ÷¾7•Ûý”Ÿ¾ï?ÿ׿/¿Ë~ÝÏx|]·˜ïÿý.”uSçûe\yõËæ¸MwøúíÛ¯›÷-ƽ¥ US晋!f®‰>ûï?6?í^pœ>ß6ѹªŒU>åE•ß¿©.›Ìù&ÏêÝlý¾t¦wú“×»¿³MÞ®\*.”Nž}[ÇàB勸GôÉE]ûÝÏUèþLÚ^ 53 üÕô3LÞTsRÓa^m¨tfW俯ùŽ#ŠJBçÙgãê8ãäû•k¥C-ž|fVn|¨fÄöiö9â›0ãäû•Ï…m8¹&‡²c†" Õÿt¦ŸúuSÌ7ùaåêP9âv0ûó˜YðRÚO€åø"<øôuóþݘeöõ§Ýâïl¿}Ý¥ÈÞíÍÅ*f_Ì~Ÿçá‡?d_Þ4ÛÒÇ%¶#¹G#þ|& WÂg>Á‘ÏãßàHÞÀµÕp¶Ÿ#¾'wÄN?+¨ÆàÙÂÓaäó×qÏN—;)m=x$/T÷©âS9¦Š;Å´ü¤9[9C˜ Ò²ð –BÄÚ°äbx¦£* ú¯sç§Ð¿*U`I!ÅbÍ1¶t1 ååòüŒ!ê úÇZ kGéCë@F;j“:n7)s ª´8®Àc¹ ©\—Ī×)7\µ.¬oN:4†œ^ÌÃÏ p:~*ozìQYâ±lŒñˆyËCoBò߯ғd¬*€¥"N°ç˜Xƒ‘~.0æ õbü>Ñ~0~°³Nþa¬jSI\ׯ’cSƒ*Bh«kg·7+  ,!ñHê~­Ë+kÞ$FoÏAÍ0½¨Fo”c‡DÜíŽüJ陇_ùð+õýJBˆø½àë$|–2u&ó¬õÃӘŔ|¥ª°À[£;zîøü;¤–0¸z^õ$¹¹‚”)ØX–béǬó æh klÙµN¬?+Áto`Ö&ŒÀÙ¯Èõ­óìT1Çtä`à¦{ª„Áãb‰„%S!/Hb”¬â)ÞFW‡-ßMß%«jJâ>ÌýèP˸YŒ“¢ç‹WÜÜÚ)Tݸ|Xs–þY‘#ºþ™ÇÑPÌ ŒýÂÄ ˜ª\Õª‡U[C6téñ1Áab䪳Qù·2ÔhEŒS ÈD‹ñ©$Ý,q@×:òbzX8A¬kÕªv:5å¦rRgÐG·¦9pROêV‰-&¾LD„™S¶Vü¨[É’:w—¹y§Æåu%ÑÑH¨t^œ.±Õ…c½VµW‚… wZà÷0U¾ºgô˜Ù§]Ée©éJ?bpOu4²„U˜ɳŒÌ”Å”šV&²(Äö™&szsš%TÕønŽ‘8!B ¶ž,&æ‡ÅTU%®ØæMØ_kw&Šv¤ÞÖM~XiŸ.Tp¤%¤¸¡½<ï<ш°‚6d¶E,ëïVÝ©Ôú /îê¢\Ø_»ÝüçgJô⎶/äp¤†‹Å€ÄàÒØzg€ÖoÙ1„RW#6 = ,0Ìc€Ô%7O¾qî¸Õ¾-Túj§Öˆ pû÷ƒaPCÞƒÜ"ˆÑBT L ’]øø0ð{0{ègP€5~f„,=ÉŒJ²(|OKbB0E ªy;”ãg;{§öǘ©‡5fD7/d+‰ÓFV^.ca 7D?9a?|SºŒÞ˜.ˆö%œÃÏŠÄI› Ç¬Qf#¢VÂÍm)7¡ÓœÑ~ "GËT$°ÌYXòé«1W]Pº t©ŸÆYU³þsHU<ÖÖ˜€GÜÀ*ß4‡6±ÁcÓ$ƒÇ€Ïž.G^‹šà±qu2xôXÛáqëÁ¡JB1<òV“ ‹cî©‹˜ÏžajòóÁà– ÆEOß Áóv?çx›µ'r'L†D9‚C8xŽ#»8׃ô8Ü*b‰p7•ÈÄpÖÝýAõC HLfDBI'jÏÀ¿g‹‹%’^îÓx”žŒ³ª,¾ŸMWÅO ËÊõÄÎqAâf»âƯϙa ¾§%g&q½Œ´§ø~×Å¿Š žÞ> #ÏS…`PÁ.ÀBh$Fr;œêĵ/¸ÆÆH÷28¥øèí%5‹GP1æ4ÆBÁ´ªjïP$c¾Õ*”5C”R Õ&atŽ¥Ëª|’Ø#‚gWŽ.wE_;B†S`.€9ShÈ, ³$Æ!”.Ð-hÀª=²ªóR©7½ o]âç–VÇxש¹Îª¸)l´áâa»Åtx2¥È3’º÷±Gë8ž ã"bÎQudñ‘‡Š“™n4#I ö¡N]Œ¨Èf´Oý¤§ž1ùjEˆ+Ó^eUö´×ˆ߈è%¨³òcðùLO‹uw|ôÈ©­3×\4ê:®8uqíñT—oÛÄÖ`1Fº [?Ȇ}ÿŒðž=ÓÈ:?ˆ‡u…\fëŠ@ötÕ;ûêà3õ\zæ3 p§p6G0 ðª…gžܺCá—`Ð*°rºb¨Ú.­ú B‡Ø©0[Fb gƒßÉ—Q0`MÐðn–GIsIÆöWá†×†w*ðƒµ¶H<ÆÂõå#– -µTÛ0Ю˜Æ!Ü\a MБSƒá•™ËOU¡0y!d™ÐXã.åÃP$®B¸DŽV0¢ˆm0Þ;•áÑ€‰K(W¸5³þ~Ííq¡J’È¥ ÓýÔpŒè_ÒÿUÊú´tÔ³Ö}Õ=U8¾ñÁ’=MRnƒÀT[áD€]§„ÆO!uŠ¥î¥!:Fšu¾U=‚{53§pŸ¹ÎÏz᮸%þtiî:Oªî“*T Ö˜4àýžÀ¡¼žÛH6c5®b1½×¨ X&Õ¦*J¨ì6¦üÀW9%„1Ø®ñB„hò`䬪û-ŒëkáŸYÝ’¾*L×-™×$/ªº‰‡ýv²ßæLÎ×EŸ­å©•ÕĪt\>Z°®˜ ‘Z(陥bDØö"ºϯ›º¯×e•¨XÒ)GüúÛ° ÚùsoØåÛ›ªíp£ª ÑÞQw§fMU/¶Zµpñ%s l2kµ¡ýڢͯ!Ãù>ÌéAzª*!ˆ¥4‘¿\¬œjp—îJb!4B "ÂQ]…[Øæ³¸2Ê"ª¦{“†P\ d€l*’‰Óó‹}fÖ™ ¾ÑêiÄ1‰”O&]q1»›¢§ßÆÔm1a,µJq 9(æŠ%"Jާ@Çܲfp»‰Æ1Mˆ‹rÌkæ Ó&åîy*Ÿ¥Ô®©Ê‘¸OŠjŠ¥ÑgjÌ9V«& oo×£«L°ÊFæ-Þ§Ž­é)œÐhß§\&A¨¨a,€ÙÆÀ#Ük*TcíŠñº¡CÜÁÉ“1"cùUY^*,h)ì!Wû>¥=Ê$(“4ÌÐ…ætÍ3¼pY¸gL`^D¸z_¾‡s)ð=º÷¸[¸šäQòÿ(ù!Ê”ü ôöd'7â¹Xióò¾±ÂP Tޝ"®Åù{êâRæT‚ks¬%ˆµM¸S• ý‡b ý«R…P¥)V¸.cKÃP^.ÏÏ¢ž A§ã÷àQá˜XêÚ¤ˆ¸I™u-0L}jG÷Þß*Ãó ®=R¾¨s•²ÏÁUãx¬Ç¡T¼9 gÉMO†›ðœÊ×lb<®Òc4"ŸÀÜ„G g¶ adt±ŸÁ°lyB3rÃ[âëäÆ:´”ªEÿ“Ù¥*UAOà„ŠªJo|mz VÀ¬:0´LÈ'Ýý`i‡GR÷µŠ07©Ž0Ö»ÃV¶ƒU# Êñ,"tGž“aÂï#Â3D&k¥~)¾v^hi{#6ÉH»uFŠ…Xæ&œ%c¨¯m•Ñeá$êzí²N†›–Êà“¾˜þñÉËåí€uÊ€ˆW€ó¨ ïôÖ2€Ûîm»4¬¾ººº»åG¤1a6L±˜ú°´ƒ³¥aU”ù”ú£¤G˜Ø#Æ–jÛ5ipwé§Tå¤~O—šsµÐª.ôŸje‚ßúà C/¤ŽtPðÛ®!é+·+À¥/¼§Ã1îÉyim?t;E½¦q{Ûx^R뺭6Ø)?|í-îwaÏŸéÚ›¸Q[¯ÎdËÜþçüÀõvŸ Àp€$Žðn?=âúˆÆÝ¸á‹1 `¤ ïÛ袗zaèoƒY,\Rgà]¢#Œz:UyØv2èmåaÏd÷ª5âUAûœ=oþ m.V endstream endobj 6406 0 obj 4041 endobj 6410 0 obj [381 /XYZ 38.2500000 537.500000 0] endobj 6411 0 obj [381 /XYZ 38.2500000 537.500000 0] endobj 6412 0 obj << /Type /Annot /Subtype /Link /Rect [142.500000 669.500000 235.500000 676.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 6409 0 obj << /Type /Page /Parent 2 0 R /Contents 6413 0 R /Resources 6415 0 R /Annots 6416 0 R /MediaBox [0 0 595 842] >> endobj 6415 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6416 0 obj [ 6412 0 R ] endobj 6413 0 obj << /Length 6414 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9À¶E‘zAÛcÈ!ÀÀä°È!ðf,Ö‹8{Èߺ%õÌHý•ÄOEJÝ£‰'C‹ªb½«øîÏ_þ‘üë÷äÝÇ/ÿI¾vürHež¶ÿIN~xù‹¬:v?'e•'_¿¾'ß‡Çæ¿Ú¾|ükóÓÿ’,ùKóß_’ÿÞüò§îþÁ·CiÊæï_Ï×¥i~J/Ÿ~ÿïÃßþüvš±_®ÛÌëÿÿƒ-ê:7§mL,ýýÐÓœÿüþõ·Ã»~«”¶®Ó,1κÄÔ.KþûÏÃÏÍýôé±rÖØ2Ë]ós]¸2Í«*k~.m÷vñ2;¯^7«gušäåhíóÙúä.M]jònçÚ@1¶0âäÇÚSž°¼„¬Zð˜æ×gð”Eà_fYSæ'?í\(-f…É51›ee ž:ŸËì!€o3nòóεÒcN~¬Š¬tyZWðçe +m²2F.Ó˜O`ò* 8ùyçÁ‹g×DnU¤½n•†€N—Õ)ç´su¨ôÈų+"×äy¯£þÏÓ˜¼(ÂÝÜvçêPé+ÌÖRr¦¡¬hWÌ´å`{ž>ÀäUNíjw®•á£Ù}fÁ[i,üï>7̱Hž~nvv^°ýëéÛ¡Ùì'Ï”ÉÓOÉ›ýÔJž~9˜ü˜Ööäø8ý»óHÖŽTǪN‹ìåHšÁ‘Ž|<¸£³­{åyvĘc|þæÓy$?Ú¬2¯gËÏ#¶ÿäňCëßÀ]›Âÿ<CcZØþ¨Ï#)Ü[¥ c‰uàI휈mŒ:¢õbˆBœâol»·jðñf’ÁßÀuœ%ˆ×Á ¶ƒ£ \/ é!«4ñDqÀµè!­“;ÁœLòé©k$REfûðôâ †C±ˆ!e ×ÃùS…œnD=Ê¢éÃ8€b¹ƒe#ù˜{9¤y,TT¸—¿p·Ï8“‚ XZ3¸€Ùçó²õñ¼½W1ÍNú߀r@ Ä( m ¹ µYpÖC›1iËîe‘x//&žº²CÜ”B&PýHÐ`õ  F)pu ÂÎðp‚€7 жEX˱´U†fjÆü/3¡g¶]XuI ;¬hèÿÂ%að„-íÕ©ØC·cÈZàøÒófA@iiNïÊÒۤǢ4¯ürc~Ì +oep›³Ó1m9¹l…¸Œ°BF²B®ÓÑ"@¡QV»Í@_0ão¥<;«K7ŒoyþÝCÑ´SUm‡a½ÎG .Æ:f‹„ßšŠ“èª¶ªÊµ[!¼`TÜφ)’‰û`ˆN‰:¿Èã ïÆÍÍPš`èjÜб¾;Òõ@y˜šÅÔ³š¦ªrâXÒùîb„¾,2ˆ-Eóz‡šTâU~ YâŠ3Š•´0$ÊÑ ÂFH`ªù (æj[ÅÜ}„ïÄ{Íð5ùÚ‚“_¾ÄûùwYÕ³.@Ÿ´®’';…þÝ)¬Ø_Ó¡by$F:º6ò¤ÄˆµhäBZã‘÷qö†×±Ÿüá&ÌVÀ½Áuº«²â®;ÑumâT8ÏÃÚçéâó^߸îÍ…§gdê ßCiJ¤véxdV7K©ñ󽯂¾H8!«ä:UlAð2Úˆ®‹‹ÁSË’®8 m/2l÷ÑŒÆ+*ÜÛ]»Š¡]kûý@No°̶«]Å:£Á¤XFcyKèx¶êÅÌy„@èBÔBl[¸k[G¼yv§70|'tÇ,-_ƒƒÉ5¸Æ¢‹Ž­§¡&])H‡TKX¨á k“̺yi#݇_Uó/™ì}Ÿäv"¶9{ÿÌM^² 3*™4óøŒ™ÏglšMèJ*I>Ï·ËîÃÕÍò¸3–¯½Hùöö™ñí;]¢ó:7TK¾òܾüů‡/Ñk¡O[\ì[,ŠiKfÅ…À‚¬¯fØ 5LýÊŒåÃÌÖI2/½ØÀo ÞÖóñ:ØƒŽ½ÇsïCâ4WÍAß:†Æ†ŽÁ68¦k|RsøFôáfuÕ¯§0Ç¥6¿n6Ǧˆݰ*GÇ[Ò-·ˆåålM&âÌ”'nXÆSC%|/¨3 0¨ë?×-=Y¿4€©¸e Q4²X0sŽé³qiѯŠå2Öç¡ €5*¬…1Y‚ŒæFÙ©Ðà ÄLu-Xl×z-þF×îl[l?býŽpóá0Àšuª–)9ã>_²¥kÔB­]°ë0N»AÈÆ…ôí –±Çs!ì Á6¶¡U³~*'lNsæëÌy˜]ã½a?Á× ö–aY@Ü¥YÇ7œ[À7¨,µ/.Æ#–éN0Ø«Föª‘ Ýa¯Q¬™ÁÓŠÞE†mݨ3Ž] 6ÁwÃpb,‰½ :æOxop6AÖÂ;ƒ9ŠÀñ‰xƒ9a¶H9Ìy°d‰‹%è@×úÅ_9[•qÄ•¹ ‚ýσåÖ²0æð7›Rðu`ÚÁß;bx‘ôV¼Ž^ã¾’¿Ê¦qODÄ)_+4_Uo‹E‡ZŸÓ…©À‚ -3¾Ä7ºr—‘TþÞAD­¨›ž!„Ïæ?ÞJ½f…CnD—)Ý@8>Ï‚' ´á*yV$êñ†¯FÓrÝ®ýTß=ín÷v-ñoþ1b«º¯‚º²o¸ J,wþ‚ªä(x¬ít n _\3Dtùe‚}‚ŠIô£ê´cõêgB¡Œ3ÏÆ(ú„ʬ|3Îç·ÓOA8)ÆS{ϼ Î$ 0pc*ù‰Ä X'ˆ”!œ”¹ UDYOKdFVërHeýIµOý¦Sv˜t<¢ûs3”{§bˆâ´ ¦óP¬ä1Ö[¦Ä hªÅ!NÆqÌh´Êúʆƒ”–EX„“aë8¹èS”%²®%ÌhåŒöO茕®Û­K—§1½uÓC¢½¢Ät‡ÃIwªï+Q ^‡é0ÉÃ1¥Ä¤—GK׉Sð-Ú¥Ð}IÕ ¢œ ÁØ÷濺3ïÄ&R1Mš-Iî`ÞþÃxܲÌ`Òž¨lÌ:º=à¾1/YŤnÉÛ%Œë½Lá]Õ¾¹ÔKšxoLŸMܯžHÇŽ%Ï„·á¤Ü"„{nì‚ÕuµGß#1ÆûIÇf«pçko#œ$“¼… û[—oíêñø.&”ÝÛÁ©7 ʼnãªëP0`v0µ·ÎÖÌ ïÈnXz¡h(=ºŒ¦+€G°\ô!æmMÂ1fŒ¸9”ººòp_òØ/w@EŽu ½X抪8ƒ{ìcË^c!€‰¾„¸Ò!}¶õHýÜ ËDÙÂû#òK ·ðb¶G† æSêLÀMÕóºÕüíŠ6Áš÷ˆî3Êêüñ/˜47b™‰c˜aõR`t„ºLE~#géQêù›3°&yfHs9-ÂK8¬IèZ8Lî*\Ç28‹dg ,Ϧ›Âø¢4òo¨¬B!¸0& ÊŠØ`º—®¢å‘*ºKؽ¾„Žéqè¡tn%ù"hÌ5-²V¸vLªÝ9¾Œçᨲƒü+Rî!ãšç’ëBþ&c Œ³r&Ç5±"¸ÑžÛÇ­uË]Ž®®rq”ª³y0CUoƒÓ²ºªÄx'e >)¹uR¶õ¹À7‚6¿æiý¤1÷IëšO·RÉ«¾-ùzj™hCµu`Zúa0­np3]¢ƒÐ¢SÈTÝÞ(ãžeÜ[û"ÕFÁ¯bÚ|E|Œ©H—4¡gžšÕmSšcœÄÂpÄöqÅåQu½¦lÆk™^ÐÓ²š+9 Ôq 0-Æw¢ ÃxÓ±2/ñlŒ³ý€ô¥y¯;ÚaÍ…fû–³l6â úWëâÌU&Áˆ19·S¡ÚbÐ+@p#¨øÁ!PÖLìpu5Hczbæ§o­ÏŠî.¸ìÑÈ…pßêf¹S…k%’èú-}2#T¥t:~áÀÐù×£®ÏUæ’0}¤¿­~ Ôù±ŠµÆ²°zt/=¿n‰o 4ÖI™A4jU¹¦*Œš‰ZâÙ”ÓUc40061юǙ֕ƒ#D«0+³Ë9» ³ü˜Ööµ ± "´µ@G«ŠáÑöj0\ ›PWS)ÒH±Þ³[ýòÞV×÷6Pœ?ßK¦›ãÒõV0›õ)ø\¿®®#ÒÛ$ Y¾ç†âs×CiÈL¸B¥Õ{y{¶´¼e0lÞ/Lœl?^ò­U ööžÀ‰™Ë[^žÀîz>\Ëž"F˜çýtó·Öo÷è t˜Ì`¡­ä z¹Â‘XO|F¼©ÕåA`LqBæ4Aqø‰äfæbšèWõ6à½Mæ•ÇÁ£]rO˜”a 3¼ÖoP³íÒ  4hþ$ߢiúqḛ̂¸««-˜=¦æT£•d®‡œ¶V˳Ë+JUKqÙ1;›…/GZk¹tYÌÙ±«Ý kšæZÇN¹ç®ííswRT¦†-÷¼¥nÖtG°dØòÀ¶ã•c<ü¦3ÔŒ×ÑËg²e îôs³ãÑvŸÀp€$`{x·¿9b†ˆÆ?\“Fš°<†©Ñí !Ýœ…ñfá–:eíalTËé¨Lí±ãAó*ƒî.óBCœd´Éãáÿ˜¬pî endstream endobj 6414 0 obj 5035 endobj 6418 0 obj [382 /XYZ 38.2500000 764 0] endobj 6419 0 obj [382 /XYZ 38.2500000 513.500000 0] endobj 6420 0 obj [382 /XYZ 38.2500000 764 0] endobj 6421 0 obj [382 /XYZ 38.2500000 513.500000 0] endobj 6417 0 obj << /Type /Page /Parent 2 0 R /Contents 6422 0 R /Resources 6424 0 R /Annots 6425 0 R /MediaBox [0 0 595 842] >> endobj 6424 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 6425 0 obj [ ] endobj 6422 0 obj << /Length 6423 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯Ð9€Ûâ‡D ¬Çã90l ‡ ‡À›M°È.2ÙCþ~Ô-õÌXݯºõT¤¤®{bYb±ªX_$_½ÿã—¿ÿü­xÿðå?Å·áχ/»rª²ÿ¯8üz÷ú/l³~.BSß~Ù=O»Ï»ÏÝïO»þ…/î~ú_a‹?uÿû¹øëߺ¿üqøG‡ðË.˜ÐýùïãŸm0ÝOå󟇿ÿ×î/¿+~=|ñ4Ü@Ì÷ÿÿ ekíŒ+C?íNÓ4Ç_¿}ûu÷¾gÀ´Q‚7÷…ñ®û­õ¶øï?v?uœ>_îïŒ ¶òÝÏmíCY5í~nø<ØÃèÁ—…±m÷Û…Á¿”>áãMcâ}üH¹:WŒ«üõ}ë AÏѬ~m¨{U!‡ž¿ý¶t6žl”k3å$ZøqEÉÚ²ñ={œu1¸ú| Ñú2¦Þ(WçÊ [áë‘í´õUo)¿|=†H*SET¦å‘–2þ¸æR®ýÀª zþ|î;c"êÍ‘ru®œd‹¿®(\gÂàÆ:§ý!ž“tÖ‡ˆŠs \›)ƒhñÇ5%ëLÓ³§vm=>÷Û*žî)WçÊI¶g_ÿ<å+˜”þo@Â÷$¼øáëîý'ãMÇ̺øúSGÜqÌþ¯SªâÝ!W©šâëÅïËÒš?_ÞµûÚV'o|òøµ›î‚°Ž2• ìˆX*UW°`)0°ÇÀ–‚©ü3±!Aõ Ë—&ލª9ÖðÈT$m§ÚA°x|^¶{n&®÷pœ(ò¥'pÕ9«â—°¾ò óÚbÛǬ <–\MÂNo¤Yg­‹Ë,¿6+ÝUËT1p­¾ƒi£¼(±»³¼}Ú¨ `êBXCðÉÕ'˜f>©rŽ5ÓVáõ³¸mÎÇ©®…åçc±EÚ¬·Æ&öïÌÆ#⌆pz?Ñ=‚ý;®÷Y²àõ°ÅW˜°|ðùEœ1þšjå]Wß®ž‡‰a$Þ©™æ  ]hÓ­‚à=6\"¢í¼«,INˆN¯­Lã]Y¥ÎSbÃkÛNìCñªÅY-¶·P—“ʾJ-G÷1áìê6ñìpnó&ák„ͯp6±ø^šÅﬢ^o›f¾fG÷uL=lyœ+Câõ˜s2霓åœL?'£îü|cnpR`né©VSe¬%SG_E¦âl}•¿9ë(WŸu8?ç IÊ Â½\·RõÊ /ïNAèb7¼”ñ2â^î·à›J×pâ*—©ÌHÔù¾·HÁµW¥ õXVÄ%,AñÅñ-ÇdàV‰ƒtïYN¸JY1Õ»ŒÂu=lš(®ø÷’k7ZC•Ç”g°“ç¸EPŸ§ªÑùòå«ð?áåKßž¶ôg@ÚNK¼²‹M©"~é,NKUP1àw( ð™T@}c¸ƒP ’»v)~¢Uùçûßy,!°š·1ÑLŒ¬æ’ÿSE=ðFb» Q ÀH†XpŠz4"b*tÂ!\L@fm0@“Bˆ¾-…¸˜ 2*!e_U“PFü¯€èÇÑv|ÜÕÒ¼×b¨³tÓô'vgcó%,F¼ªÙ"å™TÏGƒ]BÉàÉâ—ÁÂÃëÛŠTe),äÛEÉ”~tÁ|˜tå˜*ª¯€Ê†ÕS ÚW!5X8cÇŒz¼|®-ƈnÓ”}“¢W~3•ª­¨þ<ØÆ¢Á*w»çfBPÊpª´å`"öÈÛ®o7ºÀÓÎÚRÍ#„µÏd$Xpj§äÞk¶jžÓÅ{¯ ǼÞvï5Ü Êgf»4ì|&t1ÃT?L§ê‰¦Û߬9y;ärÓ;o¦ï˜íÆ=±V³©zv0Øf߬놩Æ`8Æ=‹œ™¢<á ©¢Q§ÕEa¦ªoLJEøa&qbZÕÙ°æS(;bv}O8”4\üÞ;öè®´5ÃÐ'¨šwYÿÈK^«á¯ºd“ls {lá8 gu½ä„b‰Šù×è†OˆSÎ ›Ù‰[F¡Š–q:¡âŽ»›â効D(±PzÁ ŒéO«[ ¿“f ŠÇOãÖÈÛ‘—ÜÔÉÖ”çWëÐ|¿J.˜#®ü;|z”€ÆÏ JêÜo…¯cÚ8áZ28¤ ®,HÑ*̦ ž–¦MõR0†Þf‰Õ´ËIc×ÛÓ>Jn“"žýg.S¯XË…ø¬<ô‡R[«ÏÀ 1`Lº÷z0 …´r˜Ö`æÀ3¼­ÖÁEj£±bøyðhÕ‘xnA‘[PœÖs5§ÕK†6“´"C›eh39ÚMmFÈ'´™®^+ƒžÝY ní@i!¤nˆ”Ò¢È±Óø"%PZc怈¯¹ÕÁš€[­¨Fù ‰g@‚ ?ÁìïÜ[n"€qc ˆÊÅ6ëYkÏÜÉ#æÌ-gnê™›aö„°Ý`"éœÓåœîs:a¦Øò12%°ë¶éùs‹§µÔŸºN®D‘c­Ð & ¥Í¬V/XvD¼ÀT Ï‹­4>„³#b†6Gpg›^G—£¸Ñ®ÐRxåo[¦n£qwu7¼fˆ³Zº àòÉ Ñ 1ç0±p¬¨zúm£S&«$N¿¥ŒÀZ;çÜÖš÷FtÏz9|+k,±{#k>…y°Ý³Q­O}6*YŒu¬Âµ¼j±&a °Å_ƒkSY/SÚå:ù‰‡¼ó“w~DùäñIÞùÉ;?¬&¦ÚùÁ´±·PÕLow£m朄˻¢¾¬{×Ãu³J,Ç„;%®´©µtù›™XãðíÇ嫤k®ià[Ê‚Í'vÙRÝ+Þl&êºÁ¶UbMÊõ‰ZQmdçÞ•aÎÎ=µg¬jÙ+ì©÷{Ô­ÿ”ZÚÖê'ãV»C/ôïÒ×iÖ×ÅaBê 8ÙÉY0ø}cä_ 'C$bœT¢óT Za¡YFj¿S6­€müØ 0Íã€Cc çwÐRh'€0 4ºÈD1k1]°#_GZèY·Ãܘeª?ªF&•ÆVºM¾¦Èx¸¾®Ibz*-Ö0ñS:72þ@#|¹vfK!¯@©à8ëÅ­ŽèÛ!ñ|þ©†/º½\uô1ýeÖ*FVí)‹y=M¦Ä(w¶ïþ¤E endstream endobj 6423 0 obj 4163 endobj 6427 0 obj [383 /XYZ 38.2500000 714.500000 0] endobj 6428 0 obj [383 /XYZ 38.2500000 351.500000 0] endobj 6429 0 obj [383 /XYZ 38.2500000 714.500000 0] endobj 6430 0 obj [383 /XYZ 38.2500000 351.500000 0] endobj 6431 0 obj << /Type /Annot /Subtype /Link /Rect [90 322.250000 131.250000 329 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 6426 0 obj << /Type /Page /Parent 2 0 R /Contents 6432 0 R /Resources 6434 0 R /Annots 6435 0 R /MediaBox [0 0 595 842] >> endobj 6434 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 6435 0 obj [ 6431 0 R ] endobj 6432 0 obj << /Length 6433 0 R /Filter /FlateDecode >> stream xœí]K¯ä8Þß_Qk¤©‰í8 !õã6 ¤V·Ä±@3 h43¢aÁß§ª’܇SßIüÕ±“Ô -¸ÍMDZÏÛŸÏùþ_þ~øçßøòïÃýÏ_Šcí‹î?‡óŸï^þÂ6Çþñ‡~}øvøöðùáóé¿=t/|ùðçÓßþw°‡?þûóá¯;ýòÇþÿÁ¯µ©O?¹ülksú[ñôóüû=üåw‡ßÎ#Ÿë'óúÿçjÓ´î<‰O{–i.þûÃoßwˆûJ]ºº©¦tåÁ´¥=üç?>0 _ÛÒ˜º*ëâ–Õöü%gšƒ±mq¨\;úÐåÎð&Áà­¯Ò ~™¹:UŒ«Œ<ºâæ–ÎÖ=ê$z1|‚ÁË6áà—™«S¥ß\atÍÍõ¾è ä\=Ÿ`ðª±é¿Ì\*ÃæâÑ57·v>åæ>Ÿ`ð¦J(¹—™'Û\<ºâæú¢î¹ßžüu=Ÿ€þÞ%´¹ÝÌÕ©Òo®0ºææ–Åàñø±çv;‰ž‡O0¸÷mºÁ/3W§Ê°¹xôcSÙóî· üûM몌éˆÖ¦æ§ÑSlI]¤3Ý̵‰2lw8øç˜AðLºß€ï›ðâû¯ß2¥9‘²:|ýé4·Ë7»_O$ñ‡ïNnsšÊ׿/ ÷釯??´ÇÊúaŠý“—'_O‹J>×LΧ°è‰}ßq艩à;á“Çøï8ø¤háÜ8Z ßÁOj8ƒ÷¢ð‰Ãtƒ;‡ig]ÂY—ଠøœ[ wïÜ6)Šå‡’H¼s®Çz87¸ÛÂ.À=Åë±x=˜Citï3jU_OkÌ/X?A^Ö éëá‹÷ÏëNøDàÈ}‚41‹- ž~GÖï–ZÆ‚a½5$¦µƒ+]^2sÛ¦†Äzpõ²®nÐÔ裟`ŽÅ> æ ,gX a~ÁñC›qO¿'9#Ö”7Ì”Òx4ÌWð5áòþ%ãÃeäÒÖ9uŽk¦½öI[uŸl‡OšŽuLqôž·ç#zRt¤öG[uBG"î ¾Ó¢wzee챪MSû‘ hÌÑ·®öc¥xm´¾Ó)ßêèLÇ!¡‚»F·NÅÖGׯ¿ƒ×ã œ…ßÁ³~„O*H‚:}`­À®-²8³ky¢OÀ,öX^æ2Ò þEOÊæØŒ6¦ ßíÔ¦;ú²j^­¹¨à 5z‚?Ü;ÄW¾ƒŸô¼ò<Ù²[h9d \{‚XÆÖ‹‰qGg›³¤ÌøŽ„ìã»k$&ææ 8æL7¸ÉÂh#ÎŒ`Äð?öÜïÀ1Âú0…1ããÑF+g¤çý|òAP\íàwð2°\aÎÁscVŠ×’ÒKŒ8¸šà?¬‘˜Úõ„¦Ë>´]Ä b˜_Wâ'˜‘ñ¶Ž8€Ñ3˜ç1ýÊøÉ ,á'`}Æ(RB,(ófosäWwß1þX^`ñŽö䥜5b¥#+&èg‚úØë wÝ› äÓ€m,GŒ¶ä¢ ‚®Çÿ‘pɱì1Ìát&·…æ4À*k4† ±Èô1Pq‚ÏÞvOÎyî¥ßG"®!#ÄìþÃ3¥MäÞ∌ÈÈ[:éæfHTù7cd‹ÊT¥p}Sںʬ`›øX‡I âѰ²[AƒçF|ÓZˆê"œ¨Lþc„RÍå¬ÄDŪá¸rJr~BU[‘ŠHÂ2-ÞlFý>$Nõëªp,O78ËåŸÓž0•ZfM8®|œfUP@/\°<8Æa(ùŠ!‡%¤~Cñw0°Ð`€¤Ã» ßÀ¢'Zâͬ‡ b®Âs$®”¡Ž@7|‚áQø‰é†¥sæxB‚u¯°3 4¹œ‚§µS•«C%°AzŠÉr™J¼)¯ñ˜ý¦î"%Œ°k{Ù^cŸrÉ=R-*„\ o Úá¸Ó WNÆã–3Á,öÏáh8—WZè8G p2 e½Y˜wJšmÊpž™Ât†õ5<ëç\Pj›Ù|æàÒ ÖµA{uÁ IpœÆ«xLHÆâ|Ìòø·’0¡Ž#,7~!±¯ ¥¬ºZgÅð¦mêäôÖ«®]h½ˆS¦˜ã]ÕcEÊXÖlÊ:ô¬øDHBÎ8ß„ 8cÊCHL¸±K:Â'$O[„‚“Ú°ì Î(ùÇ:#712¿XUãë.x]ºPè `¾vÄôðnzàæùá»0ÈYV×S…Ê.s~/%Y3Êã%Ö÷` .Âà` ®Gp“Ãé†oi&7Dkü„W¬s‚f*h òi~¬ ÕÒå"&C’ žÜVž>0rÄ%dÊŠÈtGàht“Yo%ÉDÝÁŽ7“…TAQeÊÎømâ¶:…yïàëbÊÆEWô¶}ãƒ{‰¬*e×v…:¡íªÚ:tÂ4î¡1tÜ‹NQâª?•}‚ÅñÁ‡qzxBÁU \Á ·ÁÅÌàhW0r ކé&¬ï.㕼ÒN[¤=o„8•R˜0¤Ü¥N[êJŒûÃtch÷'½œÓ†ê[”£)÷ÛÔˆHŠˆVVàßÁÛ-Â5¡Q¢fÊ‹Ë8«ݳ¿û‹wúH0‡‘¦®ˆ%é]8Ù@ sî•kKuG[êsùÜxŽs2ˆ¼N#ŸT^6ª0÷Þ™ë¸DÕ]®ÂµÖ\`¿û/­ôNïþÇqÈ–¯ç'®rà«À¸ Ùbù{üÖÙašø/ÞV½}”úŽ !õ}”Øôu½; ÃÓ*1çÚP¬òœ«špžé¿9Ö[BsÞð¾¹Î8“ÕzÓêß_‘}Áÿ ÞôôUu]lu½ß½ˆ»ß}nYô;½ª+º7T*X5gS½§V¨%Óê(¦0þ&Q¸ndEù¤EÒ;î=H?›¹§jý-v}ÆTÅüp‹°ùÍcË\QMqˆÉ&¹Æ«ë"Åå覮2gÈ¢úm7•â‹ëàf)DM?Ý::èðV•üþëžüʂɘh“e›z û#RVÊå!¶É`·îåfFDPHD󃑙²‹çkñ´„l:Q¥Ä 6xªå2gjSšo;8¿"`1W“)Ëœ¾ñ†Á–2µÙ®áªœûÜé&$> ¥º3wچŹšõ-ß"±ìÂa‘X2ÝØZ?Û*;y Oµt&ËG2ÇQY9ÁûÂM,÷k³ñx˜ËTÄ;‹œ-ælæ ?UÊ”QíÂ#®pív“kõêRÛ¦>IçŠjzÑgKL7åÉø9¥ív)è³sýƽŢ<³••Þä‘ȆJ*%ø©„“l‚—}Ü raf?QÖ«ºø¢f Uÿ!¢*Ó‚{|kûYÂ\›n~“:2X¬ªU&¾xØTÁþ9ßïßež¯&”âžhJ0ó!oªÆ—›¥n^¼šÌD7_Ÿ¹ïÊR‹+)ÎØÔóƒÉ´sT³²:)"¼¥R ¼.\Fù˜ÁöÖ½yªžx6¯é*áÚŒ©Ûau¸”±n\XÅã"‹ØÁ£á‚'¸ Mù1ž:ËÓ—óøWÃÀt#Šÿà‹¬B1#¦$¤›ÅÝ™R(ø;X Áõ0\¶Y ?q¸d?|⡜ :š u.ÙÆm J¬«ðÜðžb9eôŽªEföÇbYÀòC<¤ñ}FËß6Ó»8/ ¶Ä;Œy[#¦° .uFØPX2pïZ<7\ZoÅþ ÖvÊ…à0ݰÄOðΩê+1 ˜òu¸¶¡X²°ü@Þä‡ð0<ö0°Ÿ©#ð¦ö²°´Æ+¥<B÷22Ç”v¥üp\€¯'WJì-¨zLXS>NÆLEiħËQyøª÷“òÛ),øÛLñÝœÜS—IÖ P‘ üòÞÔ^bZ[jßyÏ.ìÙ…Löu³êíÓ1¾ø¨ 2\ìtžAkâïì0‡æ o– µ0¸|Ô+ ŒGˆˆ.@ ô“QP[B D Xiãwˆz4mh¡r©Ïm=Ø’UA‹Sö¸AÝüÊ0­mˆ ÎbZè § 8Ê£,œ-eòéøæ”f*Ÿ²Ÿ\_Éãy¯˜b ¹à-Ž™ËÃX10²–Pæ7è |`)QŒ„£”b"4Ôaøò½UÔW…œÕ¡i‡õí°>YfvXßë“i°IXãS)ßÝý¾Åý^2ñ¾YX_eÍä|”Ÿ,nÛv( äÍíPÀ x¡ÎÜ¡€âJw(`±CEM±(`UÞâ¯ä„V¾Uÿꔣ6åkVŽ» Ìtq‰8ýºáÈ”9ùu­¯±Ã&fqh®Ò6ßQ½ƒ5Apbzc¸.]Óß;[Ýê»jäÒn‰;˜:ì£ïY31œ¼ÍZåêÐ-Ñ-±aïé`TÆÛ…Ãî † ‚êj¸ ¾ƒvC"{ê×°ƒvKƒ݃äÛA ù@ {h%òèâ–_HÖï0Š ¥y®+ºÃ(v…ì0ŠFAzY;Œ¢Øa¤îÝa vEïãX?Í—«€Q4e©þÕ EÓ¶¯·äJûp!±Ëª1×ÿqvüåwÖÒ S‡j Ï•~ËtXŒaLˬˆÊ]ñ"úm0œ¢+ €‡9Ie¾ÝD댕mÕÞm ü# ª)eñÂÆP· 6ƒ@£jáèöáÔíï¨Ú^÷P¦úŠÏo¡ÉÔ(Ù¨0ê`C`J™«”{¶›ò즜¡¬fß­¨¥3å»”Û¢-Ú°6«®Â8°?¹Ž7B5ü£fŒ;‰Ð ãÝÈŒ™¾¡ Úø"Rëó§×’i«‚ 2€õè|ð·ŠÞ™4€i“DÆmè¦.~ˆ²CU–Å÷i¼Ö<©oÜ’o'ÝÝ”ê:Xe±Æ4äÖ!tqÓ .˜ÜcÑa¿Ü])âPiã92&TQM•SYݤ³J°”æ»&ÔßÔÙ6>íl’ ¾pí‹0ÄÆœ¡ªÀ…r§Ä<ÁLùÞ)w¤ñT¦b÷‘Î"c[”)µ²°[ïkl×ò^ýÞ¥ÈÖ%}ŒPWÕløBµ ;ýKø}Êg$™Se±æcvðé)ʦˆ’R¦KëÐÛy{Èûˆlzôo”÷ÈÔ“¡®3wl5t”n7€ÒCU¡okgI jß#à|¼ñÊœ›âØÝ¾MæÊ“^?ú£ ¯l÷H͸wøN‹ÞéÝã_¼×ÓëS ;º[çÜ`ë^+„Žë£N½Ÿ˜uÂM4• v¯­gêkû[ÀUÃw,|‡¢;æ=<·NñWG×mün±½×S5B3µ<7<ÌGÂwðJ?Æó«@Qg ßø@—5¤~‡ù^ÏÈ×x´¾ƒ©ƒwj'<#s‚ñ„”à]ÀZZA‹aŽÇ|Gƒ+íãˆk´žâƒ Ç\íS XME€`)ÂÉÝRy•Äýú„³ÆùUþ0q”ÁL¢Â>•ÓCæ„.×2T³.BFH’Ž£q¦'¡0ݘÜÍü<€n`þUâr]päÆ@wÞ69[cê$B…CuL]¨bö9ו.3LÕ»ÅYÖˆdq®ÒšÑö»á|Çõ/Íx²æ§*‰²o‰âof¤\s‘` Áé"Ò#.3¨Öíœt«ZXS8˜XŠë1|Œp‚©jÒL±ïûh&Ìàש´Ãõw’ÐȈP‚ÅàåüÝä©*_˜zrv㥰ªÀr9_ì).RM<èfc(÷?š÷/Ló’+Ì+®è~3‹L„%«Ê€Ÿúêųö9Âºî¾ø÷I't›hÆ›xÞ‹ËV4Çóû¿>ØÚ¿üÅ/_­‘FÝØ®vÌ þÐ;\ŸRq~èØŒ#@»®˜gTcëåó Lå*‰Ç¤Öï= ˜`³Œ¥í½)žJ\©–íʨ᲼L¡=¦ˆS.ã T±€Æxc¢8_ëÈÃI¶LBÌL©>¡¾$ƒ±ó˜ûð>ârÑk(ìëMé¦iÅ4"`Ð÷ø;x48‹ËNb\~¾rƒþ Zã)¿<ÿê6Ñå aïq1_bLpa=Ì;¹$ï6± 7”;_¶ô¦7Í-ýä=,¨ºfyÖÝ-Š—±lB_K~"øØ/!Ú0Þ*~Âç^3'âYç¢Ûòœ(P×>Á3ÀRmõJ{[_]Øk³n8'db^!ªÃGË7¸p7œµ#îò®#†±þ–fjËë;AáÑry9e«šÌ0ͶðmkA±Œ¥[ídpEÚ[JÒçÒËG‚B4¬q1ÏçŠÝ–—n¦¥\&Š®#ÞsO}š·i[pÃ> endobj 6436 0 obj << /Type /Page /Parent 2 0 R /Contents 6442 0 R /Resources 6444 0 R /Annots 6445 0 R /MediaBox [0 0 595 842] >> endobj 6444 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6445 0 obj [ 6441 0 R ] endobj 6442 0 obj << /Length 6443 0 R /Filter /FlateDecode >> stream xœí]IÛȾëWè`dÖ Øîv€6CC0“I0âä¿I¤ÔÝE}¬O¯Š”Ä1Û]f­o_ßýñËß·ÿüïöÝÇ/ÿÞþØÿþñ˦ØÕeÑý·=üúáõl³ëÿ¼­›rûã·Í÷í÷ÍçÍçýÿßt|ùøçýŸþ·µÛ?íÿ÷Ëö¯Ûÿð§þþÁ·Mmêýï¿ok³ÿSqþýðómþò»ío‡OËõ›yû÷\m›Ê¶1²ô÷Íé˜æøë¿?þ¶y×]@Ü*µ/÷ÛïüÖ´ÞnÿóÍÏûNÓ»ÖSW¾.®Y¨¶‡•š²ÚÛîg2~°Ðñ—Òô &o«6Ýäǫߊq•‘gß5Þ™ý¥?<ôá‘˦±û?×®ÿïªsU…7Ý¥Ù¢Õ¿¶—é¼Ie}ºïv®~+ýƒ ³+bså ›òqÏÓ§¸ÿÒé&?î<ÙãâÙ5·:ݾwu‚+ª>n]¸&Ýãw®~+§Çųÿþ™\»9ÞY»_Ø›f›T¨MSwOS&€ª—ÙS@•õ.ÝäÇk_JTxrÍ—õÆ%|Ùóì).ß'íº§zY8¹æË–öD«Ë!q¸þ‚^¦O0yU'„›ãÎÕoåô¶ƒÙ?ÇÌ‚·Òýh–ß…?|ݼû´Ç”jûõçýÎŽ v¿}ý¶ñû¿tÉ=‘üúÓö÷ûý´Ø~ýecÊ]ѺƒÂ}øwÇÛ4»¦-*ûzÄX4Røãˆßy×)ï/#ѵNÓ$šÞ¸ø‘o¶ŽÿÆxø qRaoÏÇ‘rçlc¦~wP”Ç·+}ÕÔäƒa¢×1wðº\A€Üuù.¼b|À½¶4XS|b ˆsQŽ›¸PU ’õž¿îYâuÜl¯ñ€¡•{]è-G3jwÇݼ9^‹Fzì½0Òã¨Â!K.÷raÀ“‹™Ìâá+ hƒ§+C‹Uð_!–øÃíÁ1à…úª?F¡q ¥ (³Ÿfz'™ƒÑ(Ò«J®tufò¥˜îŸwâÉ×±q|ô§øWwuO°ëª QWHÄò>>)Þ—^#!»iÛ xÓLÅ»èI+˜¢ þý/ fD̈)>¥†cŠ*8Üèu_'H Á˜ d3ôßA m/þSŠ}Z!R î„9*G‹`¥Œ6jeKˆø'3auB{Û͘*MÙ&À¤„û®]°oJcTöL:~JîÁO6Ó¶!XܘÀº&8ÁãÙ4IÐYûíªxGŠAðV†n3&ä+d’”ì·,FÅÐòa:>ùêÛY};×"¦ ó0†,øßö¼^€Ì{úWÞ¸Ð×Ôþ²Ð—tÍ yÓâ$c®ZÍ:3šunÒ˜¢®nœÔcBjÉXÞ ”"(‚àôÁÓ«úœe*“goÅ)[› ïÇ­âL¨ßÝ«9§·>d0U·í‰åwT»êR?ÉÈ/®éúu•ºñ'¹Â@¦›Õ0ÍŽ‰DÐ%Õ·¬4­²ç›‹\Ý!ñ¼ÕµU@2{{o›´ðÈŽ“0êK¢´ƒ#é]§­ o7½½xð¢ŒwœeÌR±W%–o:_ÖµÛQ!|S.¶Åç0l ®#0']:Ì04]M“I4bìßÓÍÛ aÕ?gûVÞž²gŠð? q™¿#§àÓÂ$‰ £g ƒëŠ þ0FþÁÂol=Yäż„yl&t"&º-mÚÁWUmÞË•ú›2¤˜P~. ül¡¦€õ,õ ÔßÀožãwG½îÀÔ©™Û¡ìÍÛ·J¯C”ÆkRF¤ÒðwÇ„´@´öî>‚jLÂóׯd‰ÿfÚóšéÏ[ ž×õ™ÿC;é’jÙLLÌ¡91Ê©ÀèzÓ!;WÕö)ÓYD€Í˜ßíL;Ì1CÌ9 Àþ«C-Ží·McÛ×?øuó%{5ŽÃ.ÒùK´©„⿚²%ˆu/=4' Ó*=\%=\ñpwfŸÅ'ÅPå>äƒò¶hFw*Œà×Âçf –¸_~R`ˆÅ³X+@¾ÑC¬@7>ÆS. ×Á´ÓAv_›¹L‰ï Sv)Ý›Àõð¾7 Up6‹÷¦Â6zÛú ê­K‰ Ìí!uÀ#ã¦.ôaÊ…wgÃÔŸ‡Y‡‡Ë(±X²ÊKoó`“¯Æe³LQ^Õþè§%s¹{•Ô8C“@„U r•E\£l¥uÖÆ“}˜øœÂ:±G¡š«wƒÞ0ßyÃ^1”\’}e„û´ÿ$” *ŠŒœAaeV¨š +ø¾#¢q3ù?tÃæ/,€#}F¤M©Öä»+bß4MbŸ²hŸ­/º”k:ÞÚ<Åï.)J9övùZLâ\AS õnDc|;YÆY45‚2)ÈÊjCVòV\Î`´æš‹Âp…Ÿ¯“©½Ç Ðù%eã0:•NÃÝ©£ãü¬ƒ„ÇÐËÏõ$TEíß‚Xœ' {ß¿çü^œ£ˆ£°ÿÏbð Ðv䯬Wy ©uãï¨:‚ý¸£#YnÄ›ùF„86Æ|Ÿ¶Ï8¼Ï“³ 6Î䆨L#¹bù˜8!êó /ø­ôi„>-Ó«Sš¬^{‘ «6µúª#‰_¥?›Ês%~1A“Dæ“_¡\s©{:= _b3!¬Bñ?"˜IÒ-Y8[=Ucvö<!b'.ÕÁ¥ÌŽË\$“•+Öߨ€ad¢›§LÞ*Ê€Ý _@jæ 9„IrTíC¤’¥¤‹[þ©¿”>YäÕÈ'Ȟሀ˜€~šŒxá»Ï_Âït/ÍÎ"ºµàG r¹„fgÅà-Ü[Då"‡/“á<¶pÊ6ûÕ.IÁÞtlë+{ÇIC¢˜rW´î-…#ôBªj{.5B ÔAH°Šˆ`Ù>W#‰ˆv޹RÃ.%Ê #“ñ¬vyH^œp;ó ¯Ï÷È`Š«Î1s¡Š%\ ÁËoSÞ3=Úô-Ð^žèQt÷(f8‹™êNöâuˆÊS-ˆ ~‰iÜ eæ`X8AÞï¤ohž.ÁÎ4gužæsž .lµô@hÔlÜ&Eõ•”E–Š&i˜v¶ØÀÄtM&´ÝB# lT6jNì÷våJãf£qB(®ÁOÏ3Á©BúãØ’–IªBºFXº’DZ¤EÔ¶ ¾"ê•нCǤ…ëvºls'Š&Ö0ñ‚0Íç…0ÙbI$WQ±–L€ikÐFù¯©+$LÙŒgöªâñ7g$€Ä´l¨Qîö+<-¤1qA©šM›KQš7­øhÛ¾­âãcز¼÷!gÃö‡Kñ¼WfœéX@|ºQÑ®å”FÒÖ„€u›ldzd´n/‰›jñ!,̈fª^Oªìýƒkg§Šk,íK˂ۃÄÒ&=™æ^8êàTÏDI' Î¥“ê†|0h ÊE0ÓuOpA Š.Í#DjÊX¡k͘C\Méï@ÔÀj<áŠQ¸£j=x¦–Ôj€¸[ÿUõPðl 8Ó:;ceÐêÜ„jý«ÛѯƒkÝ1£ˆ^ ¸ŸP½¯CÐ ÝjÒ ” ß0-ÝálφGR„®D½†õå8¸°‘‘˜2U{]tÝT ‰¸.:^‡yÝþƒ?™)_ÙãÜm…‘=VaA.ËK#ëƒU/&2êöõ¹~íªÛ¯ºý20õNƒÈãàM׆@Ô¦ºP¥{÷F«pß…•V‘ë<Žráv»ú\•ª«ªMoÿ8ÕûמB‹¦5Œ³L?W!¦,ô+uX©ÃJø;Xpmöµã˜ø kDZµãØJG³ÒÑ¥wkŠêYЉ5ÀÖ ÂÚÂxöVø_åYŽÈŠö™ÑSÓTn†UÛâœ^Ix½-¦CDÏ{r`‹ô‚{‹/C7oíy§º‘pL,ÑãPY3™Ÿ™r¼”„¹Zׇ"è˜Ø‚#_ðyðÞ˜h&¼7f6Æ›GøùJ¬ ñì0ýWèO?¹®¿c–`!ÉdsÂvƒ~Sª<˜À«Ý©[¨.¯Æx¶d»³.… ÓÆFÉ`!{S6C½ñ°„MðÝ%SUÆo/¼Ž-É%-ô–á9£½žóPÕòÜ™•è©.p-ì? Þ^;±_KåªvÀ5RkÔbåÁùíšUJx æ·“• ?ÄÒ?#1Í~‚΂cFrZëk"|î.VÓ‚z ±Ÿ˜®cZCøj°a±ÄÄHŒ†ÙyeåÕùx5•«E¼©½cšIõÆö•EÄjñr“|^Ǻ0úÖfkýåúñÝ’Í9‘³»‚CÙÿ¶kh_tçÂH_ܧÚõí^}ó~ÓÀ‘ÍÖ‹5¦Vùì@Ìø]Ø¢GçKçiáHÇ(ë]Û„#'â0,IäàhoŽà;è‘öÒ7øålüI{ÅñÂ:ø„¨¡³\ð½6ölÍè,ÁŠß&®Â¦\tsPFpµô"¨–»­"ˆ ìÝ0ýá„꟭ð‰qç\È9{?æ\„ç?©Pñ™h4­Ûl“ªn8c3úÒ×ç{ 8bŠ—2åSUšÑ.¯y{.ÚªÌH3•Ͼúô’ιj¥ãSÅ̉õh§ÿfðIèßÑî éLKTêÕálB¥ßLXƒiŠwóñBStÝQ^1Cá½Û!éÖÑ32‘a¦ÿ/ÅVˆ0=Wð®§õýcD„v¨ªæöá"3µe¦8ß*.ƒQÉ×ãX·äÖ“Œ8aÓIÛÉEÀÿˆ–š*–‚J "¢çbô3%D ëÛ+r)œ„ #J¢)mâ…Bƒ¦¯>àjÊpç‚ÎÑ=›aà=ù÷֢˶!ú³Ÿ¼sö44D#¤óÛxü’ ‚NTå®hß"Q )ÉùZíÊûöTçj܉9£’¾ƒJs¹ç°¼±{fK‚2ŽeF}Æ­ÊÇlE—®kp)øI_1ž-¥$ÅT~ªÛS9B×dZQBt>1¤F/ 1mȽ†Å˜òˆÓÎo褺oEÚ¿“…©:… ¥³î,QC'21‰NB`7Le :éYð¤84¶‡”žÒP™Ë °±óÞ-IÊö¢ÞË”}3m]Ãè@ˆœÊ¶B ¤xyÀÂ$iƒe| Cê†K0.̓j}……‚©›´ñ)7‰&Ô1Æ­Ó¹>…ÛvF3…ð›V)lv ºr¾¦qçcâ±6&àA@©póˆH¾U&TáôÔw:Ó÷ÏZ3žgÏE"…4Xœ¢Ë´Ò$ ‡¬V€BÙ @^c 1ª¦õfÛµjë2¡8>YØ~C•äav€Kåàr¸¨ 1B•%¯@ؽ˜W(,³ƒù_!CŠûHø¢­Ïùä§©©ÈºQØÂChDB¤)ãàÓpSàñt"_—”™Ø»ØyU,B®ÚªÁ„£TG˜Çd¬c .™+#&2:qhB.£"“X5F8Ræ¹UÀÍÖr Ê 1_h ‘I,@)£4ð0AK÷b UɃΕ„®k¯c¢ÓÆ[*òNw;/ÀCì@פ¬ã“›‘ŸšýŇê¡F$j¶Žˆ$o†q3¬/1ãN[¹‚:±ªoœù Š,P]ã¯8ƒ9ªõ§[Ð þg"‰ (§2=x…òE3ä’aÕåTn,Ì̺6€õ5mAB)¼G•X²é™úc”V‰I’bÍWÓ^ÎÎâÜ™÷Á„ÅnP»ô ôh]îì >è{øM£:[‹¾é=º¦Üuwûê›>¿ÐìÊ 'Ñ<£‘S%Ô ßTh¼Q¼kap×§ê¶^®…#ˆW;×]Ϋ‘n¶zç îà® ´·ÞÖ^ pµ=-¹¼$rÊË„u«T `Ì9iËÙ,Ñ>ËÜÒüŠ’ªaD¸ÆQˆGf¯P8­5=qUusMÓç@Ἡä¹IÞÔá>¿‘';gð®÷Upji•ý ™JÇØ‰ðme£S„¢[@°dè–}Sq”år)4¨„¦¨dLÏÊš/·>‹ë$½u—bªéÊâ .e3šñ”±¶.d¬Ë í°|öH´—£˜$Åð˜\_wC•ƒË[2lЍÂdðçjH‘ºjWÚî01Ò{„?߃®c¦„ 6ÌöÌø —„Û¬l°M¦NÆÊ¶&0€´fSúà!…®ï¸;NôƒF#¦‡izô³Ö„€Íسu%ðÎMƒááfé†ÔÇ„:0±ªNÝœ9É‹àÍ pTÖ-Þm‰s’‰œW¡’“[ ódqv"®çqÞ/nÓNÜ“_L͆_i.3[q‹s¼7"ÏûF,îmÁ¸]b & äqèÆzœE|ÓŸ^¯* óö©.ز% ¤MdEtìÑ îIeÏoë-Ä#¼„ë‰r5”ê* ÓË;-:A)qúpâ/£øü…f ) ùZædzåj‡ØOû£`àgÂzˆH•”±8Vu±7`°HÚf¦ 1øá,މI1"×ü‘Áªéƒ1Xº3' ȨôXMÍ3›šËòœ Žé&.õ†[˜>fƈæ1W'u¸A,)‡¶é#J×õ0–*êSú˜®±šyÇî Äf8,k`(ǯ…Ëâ¥\…R‡g°¡Ã2.û‰M«X®ÃfE|;Œ3¯ƒ÷†Gð+¯-ìP±áï 7›Á³1uñypIß›Ä]§E.~¨ëš`QÂIqAj|c…nóp½Ö]AípÉd ʉ¢Í‚G^@”§p„ŽOÑh¦´9Á§(.g#¤e|oTAi¼–o1T¥¨" —§¦œøŒì_á9º…Ò> >> endobj 6446 0 obj << /Type /Page /Parent 2 0 R /Contents 6458 0 R /Resources 6460 0 R /Annots 6461 0 R /MediaBox [0 0 595 842] >> endobj 6460 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R /F1700 1700 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 6461 0 obj [ 6457 0 R ] endobj 6458 0 obj << /Length 6459 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sØÝ|AI» CArrì8aQrÈßw†œÝ%çk²¿­.>¦-Ø’—b³»ÞU]wüò÷ã?ÿ{|÷ñË¿?v¿ürÈNU‘]þ9>ýúáål}êþ|¬êâøã·Ã÷ã÷ÃçÃçö¿ß—¾|üsû§ÿíñOí¿¿ÿú·ö‡?uéé/|;T¦jÿõü{S™öOÙõ÷§Ÿÿëð—ß{Z±ÿ\·™×ÿÿƒ«\íÎÛ˜øô÷CLsþõß;¼» ì+U^•Uv4¹Ë¦Éíñ?ÿ8üÜ~ _>;5¹1U™?ý%þC•}úRaíÑØ¦]©èüKhù‹—•‹·øyçâP1®4þÕ‘[g¦¼¨*å!ô¼zð×Yc".þ´si t¨Å‹ŸêÜWÙ"Âò†‹º¶íŸ+×ýó¶Sµã²¦ˆ³ëê1b]oñóÎ¥Òc.Û®±±}]=Bò:¢à8ï<¶áâ±±]f>lÝ×åc`¤Ž‰îóÎÅ¡Òã¯.©¦›¢ŽÈÊ×Õ#€¿ÉŠˆ„sÞy,V†‹GfåÆdyÇÊe«ìyùèveoñóÎÅ¡ÒáÛ³zl„ç­ø¸ ¼©#€íº| œTu<þ¾ì\*=ÂG«YoåòøîyñÃ×ûO­ÐiŽ_nwvþà巯߶<þÐú…•iÿï§ãï³Ì|úÃñë/Óî°´ÅeÝ“ô$«ÎOŠ“-/žßyß©‰ÕðôNÞí <ÕMöôèyµËwÊ“3çÅ^¬†a`áWëvmNEãªWçùx~RÜeksvàJôüòN3c³ž-ác|€ï<¢'øì#ÚÛèǯ-'½ Z%RÞb‚<»0A^÷ŸlúÝ••©«bD¶õð ù)wÕk€uà¯{Â{ñ䲈;yYW3Ÿdpµ=Éðð;ðºXq®n”¹` â»Âö8aV³ÖÕ´¸À|FðŒ°1C$2Ê"þ ¦^LîÉÍ¿”ý,kò(òeô*#ÚWbTöîúoQR\¦ÿNÑŽómE¼…Ñîçǧ™l˜î’ ¾qR[Û£»+rK¯ùÁòjÚd9„GÅ3e y¸#ç0M=ö8†9f“€ (È“‘”Ì"JF)Þ/“½ˆÒüÔà1ÅMŒy³éšn® L%hÒ:qÄ÷™“L¸\TÜËzÈÛ’ Œå¥”ääªå&ãïŒì)*WA¢ÆC]²0{¹´l ‡*6&ÏÃc²aL(%Œœªš ŸɆIóó8¤KùÈLâLH˜ˆd¯¹Œì­$ ¹ŒÁecKß>à–›iÑDP‘pÍVF@|¥×ë¼+ÜØKVÃS¥è% %:§xf–Hc’ÛÄVÃk‰ÁMV=SÖ·hZÇÅ‘¼æšž;´ID¢¤KF GÆÂîãä²)Ó”U9 ²âºå~‹ûjyŒ´“Øü—íj(j â;ßm¦¿„4ç"ÊÛáL5_`ªð®qÜT¯ÑÌ ‡aDÆ<™ûI)€¥”.n_^' S=^Ê)UúNH5Á‚þd‹ºÙV•j";®D¢ƒƒHÇò#oVx§²X™1uÑÉÄãD8ÔR«¦^Ìlc‚KÃMD/rdcq+(Ÿó{M_§UcëêtÝtõq?ÕŽìn=)Ñ“&·žXôÄÂït0 Úƒýaó÷á»öì ž'ÃpÃ]má;×Ç=*ÐRújLñz?_­2ôÕbøÕŽsÃðé ¿#7eÌÓ¦¾ Ó[8Ž>õ̘j°›x\ZÙæŒÙ» Ñ\¾6€Øl1$ý.eæøîy–¯ÿj·|Dβ­ö6ºÓl›fÈÍJñ†âf‰ž†Â7¡›Ì€¡¤!ã\2Í.µ*âæçâz¼Z8ç:$e5½|åRÿk$g.©Mѧz˜O©'º¥dßO5h5Ù4èÎŒ3y?¼þyµ Ò†ÛÔ…ß­ÕÖÃe¿µ9;p%úN~y§:Õü¤¼7|žðGô¿ƒ|žRˆ‡àj˜zñ;i?½¡iÊ×G»Q­³‚2·Èv¢ºÀAƒƒIå—©¯“ȬÔJ)Ó t §^)·‡Ü@ V‹ßO"Q€ç#};®OŸ—#õ}ú‚°ëšèú¯.‡'ˆî¨çÍj²éÍ›J¬½}/—æë+p`¢Ö9ŒZ Àb¬¿²¡Çdg¤Sé|[ºï¦ª9%‚ï›Ê ¯›¢¨ÀÝw;Ë5®l«óµCåM¿õtù¿×Ëÿ[;€Wåx5K@ÔÁï81‹}•—uÿUL±Ãø æxnÌM˜Æ: DºÄï;À øtx€«œŽOêÙ„Æ©ÅTNp Ú®Eå†+$9ËB Épµ¬§2øâ''ž0X0 ˜ç 3XðHXfËcAAƒùï\Z[ÖõŸ”Í "<¦M5D I7í•B5`ÍÕê‡,âÐ.ÞR$u~ð}Ó·¦»i®]?° „ =#šÌí˜ÛØ\`T†ÝtQ“ ï?qÐøÈDÍ رÐÈ[ï9ýZUâáMÑ'8Á…¨hò 2QEKX“+k‰ Û(SO¢gJ×¶º‚co™Òø”)2¥ýt€¡ézùLéÚ]e[ʔʔ6˜®R¦´:é¤L_ ÞÐ2p±lñ¸™¾®6Cñ3}»Ë q‡%Ü2?‰*Ù«áÙb„£cžÀåƒ,'ÚRnnÊÍ»ae(x.”è Ï”$Œ' 5wî]ñ`ü!Òž…;‘“x³Œ€•@!Q\ï¹ñ•MO'‘¢Öt1S˜íPçî¥úpÍççw|´ê) L›kBH…d°HˆKÙQ˜!ŽQ’‘G­¹?ã–rÆdÆ áÀ„ÒÀÕÚ97 ~ädçF€¢&/lOÍ=fÄKäÁZ½òE:!xŸ¢ñªç]\o€j^Æ ú ç‹FsVÝ^"À@ h{?âì)%y®ÑG枘ƒ^m3ÔšŒÙ`ÕjÅYî…Ž7ed.Æt¹N h5`&\\Ì”öFÉXŒ(\ê>t…G^vŒ”½%ލմ• mxQóýn†==…)‹¶5°’1¬1zÄÏoC±ãy_Ú‰ZçðÈeMzƲÈa0?k“ã˜;6&M…)ˆÎ"²3ɨŽÌKMÛîT÷Í:|ý‹ßéó]÷Òð‰Bh®p“øŽlnº\3æ ‹ÞT»¢(r~ •õ`«ãV1±èma@O4Jµm¡o»hcÙ¬DY2ðd‹$C­/å‰ÉgÞæ°³US1Ö…DÇ6¾ÖŒ‹lst«i†ªv§lò½àG>—ÐÿdùôÒ‹G`lÿhŽ•¼ÂŽ¥ŒM¶¥n´Œ¿éñ?$îP©¸ÀŠ‹}„§ÚkéD¥[›ujXóÔ8l bS•ÕŠfrPa8†Sa¨RL!xXÙ·øaóÓ¢=¸SÊÖÚËeêB8æó/4;ÖåöÚÇ*u¬Û_ç©Ô±.u¬ë9=×îE”:ÖmUn¤ÆòÞ]¯¸±|êôç…hûøÔQÐË%©£` -^ºi*¿ŸŽ‚ÅutÀî: Â󤎂©£à`è@J\AGÁâY¶á¹+ Û>B˜2ýüVõ ¸ßßdÓ«}M«¼uŒ½Ï””)dà'zu·©ë*‡G®`Y©Û-¦Î*«¡ÒJíÕ¨úæ‡E¤T$’æçÑàLêÑÔ„*yVÒg2}êîfÖ ²“™Üm‰¾e)!ÈkÄÎomø†Äµ³~©fÍ+5{ùÉ,ýl*«r Ÿ=' „-&¬±AË+„«sèéœçcæ§§÷¿LÖîòÅO~=|ñØ8qŒ£óШR ðƒ™)оðÅ­d*ZÐ9¦|Ço…0dº/l)\9ÝZ!ÖWÛiÚ¿3l±:å:é˜ÉàµS­™zWº”z÷âÉÎRhRê]–RïzN/6”z§‘J;!É>/×¥·w”—ÒÓ6‘ž¦"‰+c´u¦ Æ*•ižt`üÞ›Ü@ºi<ºHz“á }>ÑÁcÞhãqÊFKå“ðuà[ÖÚðÅ~Ëá[W«±ì)ÝKì@«„ÊebNã±ÎJe<ÊZ¥ µÊCTñ¸¥²?ˆÜY ÅÄMLcz…è˜fÐLƒl+vÙ)sZ·ª)Il7ýCSnÓr¹M23ªæÏŒ¡ú„Í€&œÃG$÷{½›Æa…-ª/ro^ª(nÅ5¥‡È0 zåHÈMœ€¦'‡)pb£æZ ¬"£‘è+ÜTwîÂ'+ %›%%;ÕCÍoXK©bÌt©ÌÚÜÔœ{ŠHc÷ô¥Îl–õ*DÕñ˜àG†:ÑAI;¤rF·Kw¦OT†¿Á]W’¹jPë+Ñe:ÊÊί[£¯¢?~×Ô倌Ʊ Î寙L8†¨À9"xמ½áj 7œ“ë ×ãó0™ûžÕàI=ïà\¬FÊ›Ö*™¤r]bz4æá ˜3îáø†ÊÕ¨O7÷T(#™á ©ÊÂ|¿å««Å+ ¬…Óå9Ø#ãq(³|RüD´JU1¯·iÕ`ÏMJÍâSµ±7¥a%ä®W<¬÷”Xsý¶ÅÒŽx²ü ËW cAÁö_17Y¿áªZÀk5µ›úŽŠ%ažoûSg¦ÝÙ ©3S–:3õœ^hW¹®¼:²1U¡ ‘$û¼\—:3¥ÎLŠvuêÌä}¢×™©±F»N=ufŠ‚Gg•ñ¸šŽIZOtðXhwJcîAÓí ^Ô5ÝÚISïNoÆtäSÉ?#ìÿv6kl­Ý™/u6‹G—iwLÍ¢à1¿¯Øz“?7ìÛÙ(tOF…žF¡ûéCÂzùQèMþ,Û¶4 ÝÂKç4 }$éVY1šF¡§Qè,üîw:ÓgéOö†:ë˜:«2C¥ÅÀ}~F‘NÂíNi¿Âžh#õ©Õ¿‡èã隃±¡¤€(`„!Cw¢$˜†"©ûqê~<¯WK|íÕ¸‘Ëu7ÅìÉV\ÀV| ·÷2²\¶mÔÝ´ÆÛbç˜0†¨Å½·1êM^ÓüÈØ<¢Š.Q—£3XŰ󦸶N%5ÙþÒÊSIM*©é9Ýi\{IM¡^d”dŸ—ëRûÔ~€äŸû)EÒJK%O©äéª)õa¥wYòÔþ:~oæÅçç©¿0#xQßB¶3îÔŠ—v‡G{íyóÎ.šªºá _t‹½‘Gw¡ævî¡{§KHqÎY¼ñ7uë~koŸº“ŽsâJ¸Z·zÞR7kº£Ø‘ß‚ƒ_7Žaðjð.b‚Žþ"åŽ%¸§?·;~­nÁî1œ É,E§çs0òˆØÁƒ+œÜ‹÷O|Mê¼ü|½2´‡9ÆüúíTYeîÔI´yäiá-P×±“íSrýøùðä–‚ø endstream endobj 6459 0 obj 5212 endobj 6463 0 obj [386 /XYZ 38.2500000 642.500000 0] endobj 6464 0 obj [386 /XYZ 31.5000000 509.750000 0] endobj 6465 0 obj [386 /XYZ 32.2500000 508.250000 0] endobj 6466 0 obj [386 /XYZ 38.2500000 224.750000 0] endobj 6467 0 obj [386 /XYZ 38.2500000 224.750000 0] endobj 6468 0 obj [386 /XYZ 37.5000000 713 0] endobj 6469 0 obj [386 /XYZ 38.2500000 642.500000 0] endobj 6470 0 obj [386 /XYZ 37.5000000 713 0] endobj 6471 0 obj << /Type /Annot /Subtype /Link /Rect [159 266 237.750000 272.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_implicit_namespace_packages >> endobj 6472 0 obj << /Type /Annot /Subtype /Link /Rect [381 252.500000 434.250000 259.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search >> endobj 6473 0 obj << /Type /Annot /Subtype /Link /Rect [170.250000 272.750000 197.250000 279.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0420/) >> >> endobj 6462 0 obj << /Type /Page /Parent 2 0 R /Contents 6474 0 R /Resources 6476 0 R /Annots 6477 0 R /MediaBox [0 0 595 842] >> endobj 6476 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 6477 0 obj [ 6471 0 R 6472 0 R 6473 0 R ] endobj 6474 0 obj << /Length 6475 0 R /Filter /FlateDecode >> stream xœí]I丕¾ç¯ˆ³ŽmÀ`€Z² ø` Pø`ÌaÐÏ Ñ6¦ìƒÿ¾Tf$¥!~ùHQê‚]Ù©E>¾}ýù÷ßþûð¿ÿ<üüéÛÿ~qúöTÛººüs8ýùéúº;ºŸmW~ùÛÓç¯O_‡ÿÿñtyáÛ§??ýë þ÷ëáÏÿ5üò/î?:ý{jU;üýÛùï¾UÃOÕËß§ßÿßÓŸ~wøûiÅñsn3oÿý'ÓÚ®jNÛ¸ñéOã1ÕùÏ?ùûÓÏÄ}¥µ}£ôAYcª·úðÿyúëðqùêØY£L«k;üÜ7¶­ê®ÓÃÏ­qÿ°oõéëv»Òýp}7ùøùÌò*Áâíˆd‹Ÿw.e^ýØ[¥ÚÓE¿³.gè†õÏj›zY=øûÖ¤[ü¼si ŒW OKÊu¥†9ƒ¬nÅavµºü… ‹7É(Ùí\(—Û,žú¶µ²dÃò@{]>ÁâF·é?ï\*ã}ãÕ]ãþ?“ßîÎ0ë†ÏZÕ&:‚:!˜VuÓ5\‡ïUæò¯ïƒcm”»¤Uå¯éuù‹7M2éáv.•Áàꉮ¹UuÊk~]>ÁâMÈGÎ;OvÍxu9°Vª3éT‚×Õ€_iÓ§[ü¼óD*^\òfmÕ&¼Ù—ÕSß&dΗ§ºY´xÖ¬êWÖœ@Å»Z>ÁâMfº‹Ce¼åÉê_cVÁ[¹üø”~^üøýéç/ƒî7³9|ÿë ÝNß¼üõ}J}øéäHÒÃÓ¿þ£ª”ýÏÃ÷_Ÿúc£ëq‹)žèOöäùû€ ÉïÑÖ¹ï>©ˆÕª¾ÓÁwtFø667|?<|ý'/|ÕGxnæ ±SKî €Im¾{l+ùMaõ Ÿ@žÍÜ£Â÷Hì {´‰¨>±ßÝ|’"uŸ"UK?€HÀ¡ízÇ—ó'»c×Wçý¼í3zâ¶iÖ\»¯ï|€ïtÄjÄœb3÷NÞqˆ¨ìQ«®}ƒËwê£Ñz»†›†O\í³C‰¶©½w.¬¦·¶dŽ©Î|Ç^Þiuë=Á»ì Ÿç#|ç=Áï8v;³7| 1$€:¢»V}<†`CzÄïÀ½8‚èw0 ð%;:QfÜÂ’tÞ…á-9Û_©ñËﻈ‘Ùƒ¸dÇ<æVÃÖÜ`l3@31*ã]rb¢@‚‚)ÈbpaÅj}ìÂ{÷àcJ%æðCò­VÊpSž„O™.# 1\®`Ô‘ð‰à"ú‹bFFaÂ$9½u†#D,‚¯´‹'¶"2ºÞÛ…@UulZõݦ\˜‘–ø€„¼vJx¸0?#€Ó윣F‚;`` 7JýÑ h 03FúËc.…Éa²¡V:ï_œ=­Ì ä4„_@nÂÕ¦T!‹µcÆÞÀÚÙò{¢cøbLù°˜~ºår9øO±˜ÁPòAM¦/Ä¢½·œsm—Yw¼;WÈ6ŒUU«åŽAGø àÎäx,ÙËGyu"LÑÝ’á·pÇÁ«-7î¿sa” ÇLVÇ6Ä.Fs»; tßÎø„B±©jO(înþ"…c<¢Í² m„‰Ã8"³~Ç>KÑÔí$­Þ¨‘´¿¸«8oæ Ä)”L*¡FO4NâÄÉpÆ '8=ï:°7xž@ê)NGƒïh˜ŒÏcày˜´B!À[Åà©×:ûÁïà›ƒ;Àøfd‹>Tüjxo¸(Áœ‚aÀ^&9tÇÑŽö%KýòU  E\~yçŽ$V@è¼£§ãÇÝÔJ4ÜżÞ³Ã!wˆ!ŠŸˆq®îpJÄŸIÓo¶UŸìþ·€RÕñbš\ð3zRÉëz’„ý¾Ó«Á½9›ygL¹oF‹Ãg©ÍÑ(íÙM>Qp57u¬{óÖãpQwÚ£™X{p.å~æ;.¡º]þ}Øñ˹'Ÿàûø£ã:Ù4wÉÚ›†O&GÏ”B>ìÁŽþ™ê‚hq9]Œ‡DZ±G…‰0âwDš¿âyPcxÛp¨E¤€‘œ?qP&\#›çØF®åYLÊ]â<”§¿0ÆÞÍ rÝba)%Tßx"ŠràãèùòÈZ€÷ŠfûÄTM1– ´à½E½¶HXdjµ$’̨P–M¡$Dõ &ž©= p)Sº@6]P6µ\¢Ü‚Rãðw˜¢ "…†º°är´oµoêeB,ûÙÝ•Ë1–6 ÊSþñ‰©Ò¢‚³©¤sç‚©•ï)8P–¥RUN¾|ŽQ–på!™’aAÚ%·;œg¬io’ûe.­ž,iO¥Ìï´>w*먫š#Âã°¼îd}zɬ>.r/19Æ·ïkù»Œ+Gus— ­>-gê”EkÂÄáÏÕQ‡qèbÛÑÌjŒ‚ cx7³ùSæ‚7/e•zÆyIä ûÚ£‹Q15òL-•UËÆ7öf"Ån}+@¶ÖX¦yÀ䲉z"*4CؘÕeS¸mR§ »Oøë»&‡`7­¥fpºuÍmÌfºAÉZ?Œ /¯:¿¦ïûá8ˆ![òK96ÖÔJw½Ï4&à–­•qP½w˜°Â®ÎG©ó¥HÛ¨£3È$Óð“Á¡å÷äªªç’ ²Õ[×Ã-¾4ZçÇwDÕÔT°^4PEkw˜Ê&j5\û†ë_a-_ J´;På‡Ï+}©Z1Y¬sC[Wý8-L_.Qé‘NSɨëQNŠåÁ,ٙ‘8ʘәüÒT)ѽŠQ1"œ»³k0K4˜,zж£»±ì1cÃN›Ñf»;ˆ©/ÿŒž:ØÀŠp¦î\ø¡éìÚ^5j{yè¬æV¸gÓË‚ègƒ±<Ѓè!%kŸè™áD§ꤙ¨Vnãm\6Õhn¬+ݺƒ¶óQ¿Ë6Û—Ù°® ‚9û6ß}ìE1}R]šI›‚p5øÄ]öÜj®…B㋚¹õ/ÄÑûÎ{âee`ÜßÌ“±AÂÌ;»;YÌœùzâ•Ì®¦ñnñ튵=¹a€[5ê{›š“8Ï("!#&U”[í sމ]’6—ŒjXÀÔFNÊÇ}35à/aBØ>ؘX³S²ï/ds2"úŽ‹–×Ê–6¤ÒÖÖx¢ŠJÜg¼lk±Ø˜„@ÑòólL‘h‹áRžÀXTjH–hºÛ6£rÅOd§ðÈV l[ÿ`Ô l¯”s.$@’Îék¬/.·Äl©ü¤ˆT?‚“æš6/ã[¦ª:1âcy-ÑαD8VÚÔºZ5žØÂÓ©*üO*L^‹T×µwŠN™Ê’ÕXA/`ú¹Hš”åľÍ^宄"*÷Ƹh9.›Sr“^‘™íT«üy)ßåWÙv÷ª>±k[CŒfâ,XM³(‘ÚÖo°ƒ²|¶ c~0ÉOTJPÄÔÂ¥Eùs#ì+BÞ »mzS‰LGœw½º‰ÐTíå­Ë³õàËa]ªªóàº5ëRÙÖ;AÖ¥ˆ¹DÏ0/N e„¢¬M,*µvµsæº)XÃÚ¤-0g231½b•N6 }UL¯|…ƒ‰³Š¦S“›V'iưøfu’¦÷µªõuÊUÐ#±¸ñøgb]ž Ìnš{‹nîÞL»%@Ó2˾›È)ÜE¶IÑ”†Ú[‘,~0œ·dwfËÐ]= ÉäR†nĤ2¯>a±E[c»ÌOb•¥÷§ÖJ½ýä]u½ñ½ÛtÈJSÈÂ\aÙùÂñgL3tɨã¹z. §0–œñ™kìÉžœõŠ«»üÖÍØ‘騉»©êºL#iD:ss?ÎßÕ}?ød7óÞ}Sébî^– ¼ÇâïD«rîDt;Ù9B)ØgÓÜý6±OXG¸Õ º0GªsD4ýØÉù`¬2v;§;çþÓwÖ.ÝD+§±ÙÚ.³0 ÙŸ„ž@XÆDÀ;Åc/ðh•ÀÕ0†8Î’Ë_æ´gS uIVe,cw,ϋ寃’39 À—m>a°\öN‰Ác9q¹«ê›Ôcgrû€—;.§ÀemËÁå\«LÔ„V;.‹»Ùºvœ“ž«ù5—›ã2fìæX> &ÛŒ§RÓ‰Uk=<Ùc#9¼àºóé³älâÔ“D‡ Ü!ZØAŽ]вYeL†Ýò9 Ådn¥yuëÓÔòäºgB%Æn±›õïd—/Y*k³X¾ì5©eažm^VAïb¾ i¸s%éW4¼~‡l1ôø0¥µuáúÇc­Å΢J–x±A¾¹ÑDÆè«º„r"@½þ>wÀ ~ξ‡œì¬ßw¨Ñ‰[4ˆv,‹‹¯Ò>j¦u°QmB™º]â-nΛ£Û‰ 0EÓ°´1º1ÍnfEÛxpÇ᪠’±öwóȪ—H;‘>O5©U×rÂrdCWÌjD¶åöÇÔè2=Je3)e«&î£À'°Y‘î¼¢¤MÕ[2h-ZëØurÛŒú®¹m{äY®ª¬\ÕͨM3Þl N4ˆº…ì:œ`¸3Uª TÖõ¼|‚Þ,šâ•!§¥®¿3ï!²]˜"ŸÓJÛ+¼dŸ$¥j¯®!æÊdÙ³@Þl#t¯”¯kÆ¥Þ0®Ëoq<µœã™¶[Ìòß 8- Ñ ^ø3ž¯ð)5…ÔéÀçó6ÇÓû§¦QÕõ/~{ú‰ÄNíËƧ0Üe§C.¯.ËÉ4°v’àk÷ª=O_DëpÇꫳ« I»=µ¾`tdÑîÔÔ&Ù,lîHtùµ_Ð;øI®ºafo˜Åbª‹©gY+É@¸íÎ^ƒ•-ª@ʦgŽepõ’!SFÍtpÇ’â–Š•>crù+|v“kWN PN³5¥[”4—݇e{Ÿ.w£q§ËÕèrrÀØ3ÂÖÎ Y×o~±†ò´ŠÖ(ê˜p!QÁmº×OJÊ‘Uƒà>i+(¶ˆ<̈”wLð‰cg8 21‡eÈc7± 0±‹¶ZsÕ×3Q&¹fSîŒ-(M™ÚðMŽÁ˜9_Fúž/ —˜¶«<¾g&ÈÈE$j¶É&©bz&­T46pR”Uå#úSIôGÈÕMšŠø1ÞŒ:²)ÃŒœkŽÌ;[üçvõVù2£&T[hõdGá¹­ËŒÅÀTÎݤªÎ^ÿf Óynfs'4£+×PdœK¨ÑØNŸÉ8/Ú–bɉ+Ê$úzo€ó¤ª ô£-˜ºÈEE°DŠ:#v¿¾[P$mlùà囨”ŽKäæJªàOŒ‘¡”øÌðgø¨ˆä¥„ŒlÓYŸhÚ|ˈ€rL%ºì„&î)Ú„,p ŒK$É0‘øÄqÚÁÊ3ˆS¼°>ËÆã+žÑ [9—jÔjNÏ5jR‹0UŽŠÆŠßCࣵÿÑMÖw ÷¶Ø9)eZß°ÿñƒbl¢¥ñp¸ƒ ô¤« ƒÙT,Ð#\ó™"‹²¶Z’¤è¹'Là"“k^®óß-G`g!r27™\-Y7òYuâ îhý+*Y8K¤d ;£%ìµlÁYÌ üñK©s¢d±~ÓÁ$Ú›P 0Õà‘|Àtø#|%1&¡ûH2&ÎÝNg†ìœ›©ªÓ¼*÷É‹&¬ªã…­Uþffž¸ÕGíóBÇæVƒO˜Õœ«zæÑ½ª§îU|ÒË;ÍÑ(í±XüÄÀ]W/¸ï¹Ñ5|‚σwà¡s«Á“¾óÁÍYQQp ìí#z‚á†w­5\MC|BO\£š¹“ÂÕwú%“¢¬= †l7¢e¡,Þ¢ÇB{p}p`Ûûð¸³&lPóÏlÏJÚGg&¬õa]tIåWçAY¸=cŸ,mM#ѲUn¢±ãÜÁ]lƒÆÌ$ß‹€ ÈŒt”3zuJÑ ¢MR)>‹YäúÓOèP¸³¨Æ í•õµ•{Ÿ#ç) hÅí%AŸžnE)ž³7±õZ¾];·žX¸Z…W³ñ«øŽ‚OðwƒÀ°NïBÒ­ÆÄ¹0·IÙH(•È Œvgw)èN<Uëal`ˆ^ròÑ.žrµ›õûs ’Xj¯Ó„û`‹G2bыŰ;ˆ§ô:™ n‹F³‹šxl:åvÓIOBÈé5¹žuE-%q=ÙÁÐ1>*ÑŠÉ€eÅèŒKeõú°õÝ1¥mxE«¸ÇùVt搜+ÐÆgÐ"Ö.ÊËÕ—L4&"[¸.[¸“wÒ̃ÁfÞ±Â:Â;Q0?Þf0$W[f¦[X€}ãv6ÀôߑŷLP¥;_N252eO²)H˽T:EÃÕ ^î~¼æ=I`Åö)²b*—Û[B('ÆØÆm©’°û©½A>0E7Æ?ó1~Kc`„i)¹I©›!ÉOkù>Ž1RNÒ5]^‚±esF%îø¶œ6¶¾¾e]*ë ¦Yûm ‡(©gRùÒ`˵$)!åJ2® µMÅùÞs¸cºS0]á±LÚÇ«d›vµ;ê9 ):Ê›¸âêÚâ”Öô.>£¼™äþþ¢ó;Kæ&[.@“7y3Ñî&b—«/—lè…™˜$#o&“@˜–K7ó›d3ád6-« ¦íñs3>œ²¹kªz%%Mî úö³M 1v¬ÑZ?± ìÁ´Q¹ ¤&.`pb®°¯üŠº”å0®SÌ<¶ìÝ‹2©zYÄ,;¬°Â5óÄ‚Ä%Êx¸õØžtÛM$_úX® võM](¿åê6Ôþ"ˆ¶qÕšWó¤Ù4õr1¸º›ÊZH ëë„Ë×9ìªP ·™¨>DË\ÕWfû€NOè;W†k¡Ì‡s}žÀTÓÈŒEÆ@èôMp'¦;x Ѿ&„¸h¸0À‡ÓÎx—íPŸÄL9eÜÅD¡\ÉoŒí„%)Eëbš·3õ#¢$·¾‚#<(ò¤]ÃÕtMpÑÌÈ£wðÇôÚ¥íëw°möU¡L’ˆ5fA¦2ð;±àbâ6„Ç[F£gÒ|,câÝTò£hXM®ÏÅmÍ¢¶]nùT¿žnøsø1#xʯ·þƒL¼›ÕëºR'_ÀAÛqw Rë—Ú ¿@Aõ91c*‡šéóÙ½ã|WS?£ï˜[Ä2··/î¤È‚‹¶­O,8ÖÑLèÐgybÙ6s …Wƒï8TQG¿ÊIdîôó°ãñ¢1ìžãQ@}rÌiúæ—9\¶–v˜÷ÅB+ˆÍÃÇdסÈ.xWáÝãïuïGŸ¶2GÇz–ᑆé ×A©›üõëáëÓ¿¦È’ endstream endobj 6475 0 obj 6685 endobj 6479 0 obj [387 /XYZ 38.2500000 743 0] endobj 6480 0 obj [387 /XYZ 38.2500000 743 0] endobj 6481 0 obj [387 /XYZ 38.2500000 107.750000 0] endobj 6482 0 obj [387 /XYZ 38.2500000 107.750000 0] endobj 6478 0 obj << /Type /Page /Parent 2 0 R /Contents 6483 0 R /Resources 6485 0 R /Annots 6486 0 R /MediaBox [0 0 595 842] >> endobj 6485 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 6486 0 obj [ ] endobj 6483 0 obj << /Length 6484 0 R /Filter /FlateDecode >> stream xœí]I¯Üƾϯ˜sØ Ù$ÐöäàArrä8Q|ÈßgØœ™×ä×d×TqZ°%‹ÍêªêÚ»êÝ¿üýøÏߎï>~ùÏñ›ÿýã—CvryÖüs<ÿúáþ/tyò>º2?~ûåðýøýðzx­ÿûýмðåãŸë?ý飯ÿýùø×¿Õù£ÿ¡óürpÊÕ¿ÿûò{åTý§ìúûùïÿuøËžWl?çyûÿ?—;çÎ` |úû¡Ý¦ºüúíÛ¯‡w Ò¾âr•çö¨¬©ÿSY}üï??Õ¸-Ÿ*­ò¢,t½ÇS™™æ©ŸtúòM••®²£ª¿|²Y€iyÅ [Ê-~œ+Ê*ºº™5-™²nË ,^:Aº@ÎŽ•–ÌxõSi2N×G¾&xa]–—¥®ÿìŒÿç±}UÚŸÜ `íººIªÒ .~†œ)-¹áârÔVÖÖ_Ö™«M•űÊyw,ÏK¿º*œàêØÙñbt]\œâZg’¿./B£¬àêØ¥(§¸i‰ Åè)´µ„ä§3ìR‡‹‹S<¿Ål††ëK¬~6`åV¿ÀÎOs¼ú©²J¹3±ñ÷.ƈ.ÊÌ[:ÌÛ—XÜUr&¹q/fZduNâ–¶hÄ,–‚Õ%Ð_YAƹ@Î/«ÒÂÅ…ý-“•FÎߺ­.@-•ÜâÈ…ü-¼¸4µkO¯A™+$Ò®.A}¶fÄXé 97RZjÃÅ¥©m<Û×Õ%bµt¹ÔÙMYCÒü ç¼øáëáÝ‹²ªFeqüúÓ9P{þfóÛ×%ùñ‡s`·(_<þ¾ÉüáøõçCu*tÞ‚Ø<1z’½GOtßOÔÇô'Yß)ÓßÉ4+l>¸Ö F?­Hœö¥[ íy!0Ž;÷-…ûŠ¬Ø¹ïFÇðÊ:íû`³{BØ©xÃ| Šté€ßÉðIÿL(6È;ìÀÕH\ÏœRð Þ)>ÛvBi§ó]ÚÑgSÉA¬Ÿáj \óK;Œ7x6#ò ó«|Ê^Ò­1,ÓH’¾C‘y‹Ï¶;1v°TÅü†!ÀxÃï|"`bK$üN¿ƒŸ`Ø4¦–;˜ãñ)Ága·WžÞ^)ªê3VtÑ+ek¬¨F4¨ì”7àÜÀü„žx¥›ŸtÑ< UQßjðId5 A…ÞÑ S*srç:½ûÕÑ Ô)¯ÌÛ'üÎøN ð­ï†YŠ“Q åC´SÏ`}¸Î ŸÑ“ÈwŒº“©²`§˜w v"PCìøÓ³šÁ\EÁ(üŽhª8• nü¦!F1ï@ŒFpPq‰† ø16»ˆ§Í[{¯FaÑœ¥ÁÊ&=É ø¤ÑJe¨>z~Ô6ËÛ“5.8[Ñ“VVԲś âïDV«àÖájÞ”³Aüá̦ƒDÚ` !€ôv…i1<æ ^-B°®æ l˜ïDŽ@€qýÙ £K5’eð;Þë/GkTÈw˜»050?Pxâ/Â)K¡ä°Ÿ¹äçp(ȹ™ßÓì®ZN kOéL›Ò)•] íqà€âhG‚œK§‰1ˡɒÏ»Dà¾\ïÜ'$“4½ÍÊd•µU'>ä’æ@of~¨caG\WèvD6ˆA¢¬Öqž%l|Y!£œ Xj—2Ï.eŒq!O@Æ60PåÏÚ$:²*Ô[q”–¢ÃÉlàtN™P8„ üóÀNŵšÎÔÕ©÷é‚ü”…!_ŠNÁÁA Wñ¦!í)ËðUâj~qýn"b^­ò"#1GCÅæI©ŽO‡¡à€°?äBkdÐé<쮲4¾à(Í–àõ:Ô¦˜Dl´D¨+  .’š'œ]RŒŒ`Ø’ÊU(Ÿ²–l”à)Eø5P÷uë(XJð”#6KÒ@SÙãKžR¡Ð$b¸³ºv]^êÔnPj»ÅJ$ÛãïýhQNñ)~Õ}ŒÔtlZ7ãš/TâZª(ÂOéwI•™À˜•® ˜¨ºÍ~šÀTF˜ˆäÒ±7Š£È”ë)„k0_øQÒ̤UàГ.oU5I×tE1!ìs¡D$•æŒÆˆ B0#I¥ÎÁ¥Æâåy­b¬ZðjÓ—ñJ $ŠÕ…AÍŽS™r"Ñ6ÊQ];&Pît. |ù¹–1„¼]_¥n›Œ•„dŽ„c$"ᱟmËt×Yp€É¹·¾³ì’7”"ƒÅТÊKfò˜UUµ›f³E<æ»OÎï1߀yvù†‰uZKð˜o8Ü=fnyw(ƒ‡Ÿ AzR’H6™þ@p)PÕ°Ö¤dአ•eDgYÈg„ŒæÀ”KƬ9´Uå-½QׇYh{ùXS<“·º3"«(éIœåb½oosødÊ ÎÛ»œ{pÕ@íÖÜÚh,c"âWë¾ï3øm1 ³¿æ ~{-0̤mhüº}rÁ¯0Ïüº#ËüýG‡Yi‡v•¬Á¼*<ª æE\ô͉Vy›nv^¬‘• >iÇ=t·È’I¬·)xIÌRk½A!›§~ ­3(dÕ5­>» ;ËÖ â¬¬ig>QÀjm/\tž.:•êÃE·O. \t·ÿ†…”n¡a#‘šåîÌuüDR·kÊõXŽ6zûmDÞ./{GûY;Úóô´ì„ ñy¹~|ñ©#!:Å|Ý|ïþ2IÕ.x*C·©ù²†‘Ù{{þvæf4:´à 6c¹¼JPy¤ž+ Öa&åÞ.³õBW ²§¾íÚsÇc¡9ÁSRejô)I醵PZB4ØP|“2`”½Q:MÂÄóí{,À8Ô<ÎÉF å.?áŠÉÁÀÈÇPS2<¬ÖèªRr"r!©¥Ü^G5ì©¥5§–òb9ÕQY›KùH8M1Ìmð‚fÏEs½¹Èshâ–~†\ä|Ùt6ô±C30˜¤È¯ý°­Ïêtüç΃ÞÖÔgYÑ«3pÒìjñyçºPá®§m®0Åì)í”y i’5•…1/‡ŒÀ¢¹vmŦ¯ Å–"„@AE1dF V‡Ød‹2X¹â˜Ü©†œdájSÅ10Ø™øNsšr5|šVéwExlvcÔN7/X;7¬uHúï{艼‰^^ÛŠ\ž&œ ö°V$œÒU¸ë ‡¥«dã†8d«¶z~7³Ý8$‡óÁ—lžN‚öç¹R×ÁÒÏc¢T׆Eº9r£2ì¬Cþp5v$”F©é‚º—RÚŸ)„®Èd¸÷pµælô]Û`µ?HUì˜Ú”Nœ¸ž‚uŒÕC3„£®yœ¼ÄÔfœ½jtâƒÐj–4/¼“ è"WH‡9Ÿ!ÑøW¸«îŠ¥‚$up鯳>Ö¬˜Ü„¦1,wnX /ç.äM“?ó—Û~„rŽ0Þöš–wE˜kXRà&Œqnß¾p+ÇØ^JZ˜t¯[Æ„–+ó÷_á]ª2…·Æª>ÁA R±¶ýp—AaØž@9«Ì_:£S¦ãkÖøÉì½—HZŒ"Q)³´'º<™W°)Ué]²mX²µ¡¿J?r¸—sõ?Á¸œ=h÷À­z®þXÂR,mÈ:Ú1ø€‹î :žïvW6­mŽ"ø0µÚYÕEDÞ!3øC±5Z34jéNm,_R:–ålØË¨­`jiþÖEèÛ@kìtL]¿eO:èÒ}ÍÌwÞìSÕ‡˜ÇS9ü~§}O l¾v£¼ZÍêt\c¼ÙÝw+ÙJÕDºïø("^ ‘F¹Rž0%¥ÁX‹è®›²¤dùÓ6¯š׿Ú)¶ˆ(JùE.é–y(#f»pFqxCòk23óV‹›éñl¦iZÞ;é„Ê'Ò<Ç͇&j6º‡0F©ÿ…0›_I¶ kZTß+R|”¦'oFžÔrw¢®S)u,³y 9«²H°fe‘c$þ£¤&dAXÍOR]-fDJˆ"Ž ª6‚7¶àZ<gêï¶À`§‘rþC†&>‚YAª§gUQ]‘D0¨·ÝýC•6ä¾ùëÐå»XîzuŠØåçD‰ºÌ[»ÆäDåp†„ÛÔÎ9îÑ*b™×…fµó˜+W)êcÈR’yÊ÷½Š+*WVÅUØj´Ð›?Y4ÿeÅ”tÕ#6Å•e£T±4ŽO»ý4—ì'nÁ)ï´*§†Âƒ‚bÐ…ÎïàÌxÑViâc¿h{}B‰Y, O¸¾«¾º0îviT4­Ì.µY9ZÌì+yGWçýº[¯¬Ö«Ök˜E°¹ë^Ñò‹µ+à—}v‘/×ééªí¥hòöYX“O,i½©ÊÈRòa„¢Hç •¼Ã˜ Z(£0gëå²ý"8Þ{ø ,ÊÚY'’¾ê|˜R·EI–°v u+ "Úª ´ v˜sm, ”Z;–Á0ã%8ïXàô† 4û¢H:Ö龜B OŸ©™þ(%¬H±ç(÷JY4iƒSɲÝàZ“Á%ÚÌIë@¡Rº-%ä-˜ÍQÌ–Nñp‚„ëܼ#ˆ†¶ $YóL)5ÿ”²i,ŠÂ„Úàmù¤ãÎÛ¨6¡-äJ• £ #°2ª['Û“,`Êå¿PDuD˜¾‘›*))·NäUk•|E1®"â—åÊAÈòÞ@!½#{çr– ë¥%lr¥L°xºÊ—”øçÆ>ÌÆeSä.¹ªi™ÅEnu–JhXB‰f%H}‚aÃ|és¢þ O(°…óF \¶‡ÑF£„W"Š(!°Di¦MÑ21û'‰\Hú€ªµ&s – þIÉæøU”Îë#ÄØ„HxÔ•ÙkGU\äŽ ì`‰Ÿ‚e鑲@\®Gm™·_là}²î‘«ÕÍæ@èI—à±!<}ºP—á!Øö/;ã ‚õ[¤´˜v&Maeá¼ÍbY0‹íñJR¿Œ6pI¡¸åU:NÖ…q󧇵YYDÿð2Ë™gíÇÌ‘CòHP‹¹Ê†&ÏæOÁx~Šd¿)>RçÃXEBln|ð‚wÊó8m\4³ú¬-ªþûÇÍ¡p×øþuÞ@S`Ô¦ç‰9ùIwæ/¼‡«Á'‘Õ lÞ›ëyÇøiºÒó,x8¹%‘ª8¥ò~€ï4 æN°^ Ü)„MÃ'ž‘û Èá~*ˆkŒƒA௳õ½£ ® ÔÆm§®íɼaTCŒ¨Ù[ç7t˜éœfLEŒ]ˆ©á³ñ¡>1âÝó|@Ê^{ ™+ ;9ñêU¸§põnNjؘ„š|RƒÔ©ìRÙDÉdmÅ)ÞY¦øR„àx$ÈFÉ6Š1Rê]Xÿo$¢±êY'A“J;GóÒ(9óOWn\á úÚlG¼‹‡ÒGX»|œ}\fN^ôŒã#Ú»ï |}=¾þè„Õ« endstream endobj 6484 0 obj 4591 endobj 6488 0 obj [388 /XYZ 38.2500000 681.500000 0] endobj 6489 0 obj [388 /XYZ 38.2500000 146.750000 0] endobj 6490 0 obj [388 /XYZ 38.2500000 681.500000 0] endobj 6491 0 obj [388 /XYZ 38.2500000 146.750000 0] endobj 6492 0 obj << /Type /Annot /Subtype /Link /Rect [392.250000 778.250000 415.500000 785 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0328/) >> >> endobj 6493 0 obj << /Type /Annot /Subtype /Link /Rect [103.500000 125 130.500000 131.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0420/) >> >> endobj 6487 0 obj << /Type /Page /Parent 2 0 R /Contents 6494 0 R /Resources 6496 0 R /Annots 6497 0 R /MediaBox [0 0 595 842] >> endobj 6496 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6497 0 obj [ 6492 0 R 6493 0 R ] endobj 6494 0 obj << /Length 6495 0 R /Filter /FlateDecode >> stream xœí]K¯Ü¶Þϯ˜u€Lć^@PÀöµ tQÀ°.Š. §iÄAÝ,ú÷«I󠿣ÄïRÒŒl$÷z8¢ÈÃÃó~üðçOÿÜÿûýï>ýgÿ¥ûùîÓ.;”yÖþÙÿ~ý®Ýïû²Ê÷_¾î¾í¿í>î>6ÿÿ¶køôî¯ÍoÿÛëý_šÿ~Ýÿý͇?u_:~áë®Teóó·ÓϺTÍoÙùçñó_vûnÿûqÆþuÝbnÿý½)‹ÒVÇeŒ¼úۮߦ:ýýãËï»Z„½¥Ì­‹½²ÆîUmõþ¿ÿÚýܼ Ÿ>;TÖ(SêÜ6¿×…-³¼ªtó{iº?ìËK}|{ž7ë×u¶ÏËÁ»OefW&/²2Þä§•KE™By'?ÔV©òxʯA«ÏãLïF·+uÆîäC&Á+i?&¿ožß~Þýð¡A»bÿùç#¢_Øþøüug›->Jí?ÿ´ÿ±YÏû?í?ÿºËFWJç§õu#ú4Rª:+nFtu±kZÛé„g<ïig«.¼ƒÓ[8RÀÃÙ^¬è ”A#æEµ@1‡ÜU9íXÔ[ø«xz .uQ¦_í”­[8’kc #ÆÈù°„#ø=pmº†Ï0÷õÑ0$‡³áSÐ,8 Þ µXÙCÆï1Îñix0…à-˜ã»×nãýç†÷Æa›¹*¾‰‰ºçV»@Õ\(cŠï=~æeb÷FÞÀ|2p6ÝîXe‡¢TÇ{qa}ʽA fc 0‹Å(Î1t b˜äév6¥ú¡ ³  ƒmã&0>°8`ít¼ÃÓ½øÄ«®™‘(jSÓ¹Ø1å–‹aú¬j4‚ŸaH«z‰ÆË-Woᡆð8në´+}Ô²÷fž{ýÉo»OÉíÓnmsxy FmZWÊ"ŸÌ# Á˜ÖAbî‘+]i‰á¨«@ð]À¢S)˜cbŽo=|ƳY¸½IÃË=«Æ˜Àhðb1b9-º"ÕÛ ±W,OP†|˜˜HE#BP5ß‚Ð#±ÝK‚þz`tʪ A¯¨\¬;>zÚìÍÚ_àˆ#oáÈ;8¢ÑH' ßÁ›ºÈ]è b†”؂јPF±®FY¿ˆµy ŒŒ&;øûBkÃÒTë<œ“9[»<¬ã㉀ûÁÊ„5™fäØI:nB“[튡ÍfHÂÆcµg÷xì{ÌõÆö¬6@+(Ã"<Æv|¦xÕ “Ò „¡²ãÖ•—*°ô‚Ÿò“G®ïñŒÀh¼6(syžÁ+(D÷¡³NYµcowF „[GšÃVýA˜3]ÌùÄ×à SÇQ±¬ßφ6Dl®ÅŒñù2,$b‘ö Ñð C$æÂ¨|xmoœm ¤Š+ è*wîµî C"ƒG 1ëì­ “ÑÖÙ%°bñ°Î‘ušêo]çáËYmn÷ƒWÐRM¥û¡ó¥uòÁ1\ƒ?‡# Ï‘YeÚX¯`*E<(ÈUÉ®ÏXÄ(’‘URóÂ(… ”GIvÔÜ‘› iVAYëX:Ïðª¡tÞ­ "Q)m9™9yУ"clp°c® GÇ5G/ÚånþO@:ûNQ› L§A¶ Q#æm?áRéÛë¸Yð6 ^0Ü6 Þ‚Î' Ý0}l¢‡Ž½H­§Ú«ú~Ô@»˜úœ[ñ¡×YÛÈÆ«ƒ{A#nœ´ÙXîÍGðl÷¿÷L Ÿ1p¤½Xªè…‰ Âë³,ájçoÑH‡ÖåÁõ­8¥Ñ ®­3šÝy†#ª„+€«Æ;ÅpÃ+È3trx„Žçx ÌÚ0ŽbÜÑÑC€:÷@¥Ïz4&ÍD;Ò(ID›2ĉ…‘Š=¼ódfm‹47kU»˜Î跌ގU`&»x "À¸‰ubÊŸGXÀeüDÄ…£’gMbÖ˜¬-Ê¡,kuŠÀ–•.Õ^AB±-º3Ë^³‹ úï9xwI"¦ÈrZßÂ’`¾ÎàZa×6L3ñøX˜ðÞ­hH y~‚D¦Ì¸š ö„‡xˆd3%Dƒ}¬&0ÀM'Ðî¹ø);†ƒù³lÄU€<Åd£Æaj„dÝ$ S‘È~e.ô¨¶”À8fk´Wáh¦ £—áô8BË ˆ1†ˆl@Xù ט̶R.êÉ–0“ÍÙdâ·Ž ÙTèÈóJÎT|hÜøDÙPßT) ”þÇ;/²‘è†Q¬D­æÉ’^8¤Ÿ)TîòÂÃá)sÀ¢%*‹x4RY!Q¤-$QIVý“ͤ•M(cJO‰V¡ ©„ D.Úøš*m bÈb*°* »o$d0á’+ÌlÏ¡+‡…n):”î*6^Ï(-LUŠK nF)ã㣠Qcy LkUÞÓìö‚ßsºÂ .|vN1’‡lT>ÄG‘"ž/½ê˜ŸîÓ/×xã}Irç{óðî³ù·†'0¬ “5¥‹Ô¢þLY…G£±éJÄk…]LZE "l“)ƒ"k; ÙÆü R…ÄŠº*-œóéÌ(²Õú#‡ÛÌR€6 È+f$æöŒwFÆâšª'‘Ž’α¦~ ”šÃÓˆÊñ œ.Õä­€SEįü\[e '6ºnÓšÝêìÁT›}\Ð- MdÉ=‘J@1."›ÄLá^±Í$–Â$Ö•˜¿ÀR7%jdžH¾1œçqÜ"B(TÀ•Áem<¥­à¥0¸|^Û•›©®y~ÿ"E}gí¾“H^¦bT †fõ{¤ˆQ!LM;&ßU64nàè&œÖ%G4jV8— ÉÇþhLl™²x„°`nï¡ËXÆ<S.¢F:%½8–c°`ˆWí¹MøÖb{¶ Oå‹ÃåâàámDa<Ϫ™jýë¼õÌÍJÄ]»Äå,«â]ï”~ö„ÁÂ1TÅ€¦'¢¿–dÃ˘àÕÙzô¬÷` Sé‘ú°èܺo•¶ÃÕt¢RÜÚ=y¦;¦|D¯a­3¦GôÛé”"~ÔgY:PNÕ§*U…¼€¸|‘RvL/ p›ZѾe²ÑÞ!í×§1øŸ$“{!ÑsÜôô·,òÛé…±š ^ž¨íÁí<r›y‡]4¢¿pª§éÔüã‹‘áÕ¹+VP ™ª¤øä×ÔFhH&™†ðZW¨Î¨†p9è·Åƒd+Õéæ-ت[qŠoö«.UÂù®Îq)K^º+Ýâ_¶HÜ%‹ã K¢;‘ê ÷æÒ&©–瘞‰Ô‘'qO21C°ù¦žqi–)íF´" ]Ë$¹®œ“5¶Ä\q™'eÆ ðÇ]µ=ÔÒ¦é4e-ÔBÙ™ƒIu\ÒVTù\¤mvoüR뮡ë_©”ÏÈ/Œ-‹+D³X”ÊÃÁ8X²Ù‚E C%!Mõ|R×c’¦0“†Óhtlu‹Œ¯;D¨—Ù}ÇžbrÓM]úƒóG»Ã„gf»µî*‡E&Qí¢™’`ó ócÆ1B8ù4º/¹U¿ÊÜʘ˜°CÔuóD0–“eFʺ 1Ù ­+g¤~ ‡=<:>xø ±XYÏ/¤ŒW0=š‡1pP^ª¸ü @f`Ã4(£ëIJX摨¶ûÍá¬ñc9ëÜaŸÉ´ûÈ^¹ÂÅ(’îŠû‹‰ÔÊ"ÀB¥'NMÄÿOÔ!_r‡nJ`îÄ7:„ÈK\Ê™c$*]»úÅò"ƒ¤.\lÆ@i`‡îÊ<%*+7(®Ìl_:JØEÆN’SA> Sã%ámPm7˜t¬Ñ2J¢¨XíÑ®<Á½Ì\7GSF#Ñ¡æÊ†òˆ c F ¶]LÈÍ®‚uUA.ëÆ§ç<ö:`ÝX4!AØ5*êy¡¬îÅéø³ÊˆÊ“ÄtsÂ% K¦¬5Â:„0Ã:î òCV›Û{gkE4¥û!—Ó% ©U_±¨“Kï,F¶¯—'­Œ#Ü©©ÀeQ“Ù¢Ó¬E¼Ÿƒ*fÕ¹LôË â«”xNhMi #¬-5† %®}ÈÚÊá[ˆþs„è™vNžQƱ(´€bNƒH-BY£’kæ æ*3ãœì3àsY(—’-¸LDÊžˆµ9w°Yp.z*›üÃe©/µ×}}ù¹ßèV{ aè÷f{ŠjÐ~ÃJóÚzªÖâbåÍ«W@ÖÜFaSiðå"è/_61€ÃË…‹¹Ê-ì©Å€U l‚ȼ‚ˆ:w$Ž*õ$§ d ú`,IJnÛÈ®2‘dOax¼c¦8 cnÄ>Y"D݃¢³û‹©ôÜÛ›qƒ2ù޲…zÙíJè‰FJU‹e}U1s¥Æ¥±ì‹Ë¦a)‡‘±[·b! .F›ˆéJÊsW0!¢^=^ÚÙS#…˼ž ‡–'aH,)&0{öÇ+„¯€ÄÖ·p¬Å`à|‹Ö M9×”±ç) [C¶ãA¨H¨Ù©Óª Ï«÷ĵN„H%{4ߘ_÷zìòü¦0÷5‘ÈQvá®täãMËY‘–£zO†{ŠQßY;ï|bé×ÞK®¨öª¾[ý”FkuNXûгֶ€ð`1wFºMçíVîŒØ÷fƒ#x6má35z¦»÷FÚƒWE"—÷è3.:ÏŽRÜÛ)~Ï;øLgÑ/Fi‡;Õ±QBœÈ <4<Ý cXF<'‚WáŽW€ñHvb2žMÃS…h|ß¾DíI6ר¸ ½8øa5)=,šÚ)RêìZ˜¸Æ1uƒcí'“SMGNMÇNœ~Ÿñ¸¬ <´‚0„Š¢qJª´RCH7|Úo~8>ß@ Ô×ü¶ûä¹èq(Äq ·‡ÀØø¨¬¿é‰©³ŸÓ1•"+:r* L?[áZn„§”:§é] CŠ~> endobj 6508 0 obj << /Type /Annot /Subtype /Link /Rect [150.750000 360.500000 174 367.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0366/) >> >> endobj 6498 0 obj << /Type /Page /Parent 2 0 R /Contents 6509 0 R /Resources 6511 0 R /Annots 6512 0 R /MediaBox [0 0 595 842] >> endobj 6511 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6512 0 obj [ 6507 0 R 6508 0 R ] endobj 6509 0 obj << /Length 6510 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤DJ@Àã™ CÃrrv³ ëEœò÷£nIÝ3”>J¬©¢¤®‘ØZd±X¬ëñá_þ~üç>}ù÷ñÇþ÷O_ÅÉUE÷ßñü뇗?Ðõ©ÿóÑÕÕñÇo‡ïÇï‡Ï‡Ïíÿ?t|ùôçöOÿ;êãŸÚÿýrüëßÚþÔÿ£ó?øvpʵ¿ÿzù½qªýSqýýüóþò»ãoç‡åz`^ÿýãœSÍŒ™¥¿†mªË¯ÿþøÛáC‡€¸U\U•¦>ªÒ”GÕ”úøŸ~n¸M_œ­*[[ÝîñT¦û+uI§ÏkVV•nÚõ­¿b÷=ÏìJ`rkœÜäȹ‘¢ŒU¡É…ÎØÖà_g—8gKA:C.uÆhr¡3®]Ñ!ª©0u]âÉ3¾@ΔáŒÑä2gl e;DUŽS·ÙŽÁNNts#¥?c<ù©)•jùÓ…È‚¿ÛA‹Á“½Î.|kàägÈ¥NM.t{ªä8ômv‰c¨ 9ßA.Ä¡ñ䧺4Ê8]•çÓ>ß⪮uûggúÿÞˆ²v}¹}]â@%È..KÝh89#¯v…1r'{›]ù®TÕ;È…NN.ë*•œÅt›]â´ ×A.d1áÉ…yµÓ-¹ÈÝèëìb´œíÔA.u£ýÉ?ÇL‚!é~Üuß>|=|xnÙ£=~ýùÌVÎ v¿}ýv(Û¿œt•9~ýéøûõ‡ã×_ª8µ*FíªË¿ëFšn¤:9û7o#/#å©4ßó6òÐ}£‡¡ÛÈ'ô²—‘úT7…Õ¯ÖÑpľyºŒT'£kõjDáoJ¸Sø*álž¾¶4"s¼Ê–ÞùênM¥NUi_Ÿ/ÊÄPN¤¨»oOQ]F̰¿ED‚gƒ®Âá:º†Àë j´S<‚g £KŒq!Àh”GêQúN ,³®gY¦*X/ÆéèzHp„ÊåÁ}n’ñ§Ç·óVÎA„oÖ—œ;åí¬L‘²å´UÚfXhɵš@€Q`VN¡QÿŽŸ"]èJаø(!Š æL)öaÃl´›­99[y–®1гJW‹åY6„L€Eò’ÀWXxD€Ùbœ4|ýFÿc8 ÀŠ.–*3Ë\Š Œaƒø#IˆDn˜ cEd¬ÌR¤?‰p¡Ëg‚β:ŠÇ”‚ÙAZ–”5tëCÒ¡Ò"Þ—$ÃÙÇj@7 0% ëÁ -¾ úÙ'мáu±p˜Â›Vî—³î€G±Ó0¹%’Â$«ÜG> ÌRIˆôÕ¨Ñe Ø^sú¯¼{«*ÜÀ¢KDDñ7<,¾¹1â ó`cYAè ".`4aØ(6¨®mÑjί{x…–ÖúŠ‹cDë–ÇëŇÇá\,ŸRiÅ¥äJ 5Bå}?ïèk—‚½,׊´AÝÁ6áÑ7ðöbØLà [õ±ÿÆø°•=A÷˼X¿]D8¿J^˜¤„„DÉ-¡JU€»ãº¦ª©^_ˆætfáS#päô—hê #OpDÃÁPЇÍ@Œ’°ƒÏ§!@×Áß@:à ¦ð~\<…èén“Ue¾Mù6-ZGáo¶|Ïæ¨W^ݳ¶Éê^V÷îGÝ{Bßl)Ë×-Ý XBýÜéÁ¶ÍE‚¬Q¿Y_oØ„~îJµ‡Û„×!Ü™Ë7}7=ÛˆÌØ®±ƒ‡Š-ÉT`؈“Œˆ¤Ù`vEû"½t¿DSÒ[ðiPÖ¡¼+bsp„ŠnOyCÚ`à}Dˆüò[JŠ¥¤æQrX_ÉIi\0 K;‘ø}3µõcäˆ å <ÞìaÎi+ÁD¥‰àØÂ6bž’À6Ц¡\-kŒ’Ã7Z8Q …„ÛÀPûä OÞ·nö†pKÑ,!¥=™H † ˜ze+Qá–³Ùx·œ„¡Æ(^ë“”Ï3âû"˜BÃ&˜5”¬’6M©†‚u ŠXyBb%p`¥4cî}sµªfÅËï>ù7P5Î;¼}2bJˆ;)ÈžÔØO"]„’º¸AIÐÔbôÒTõCXoЍNìâZ¿ÆZ^„Ž@Hø#å‹â¨“œS¹ƒœJÉœ"Uû"ð¾²5÷U„‚㽆çAt¹ð«RʺQJ¾àçpÞw õÇåôÎËrYýÑk[ô‚Œ®qÚct9Ú9G;Gòg ©°(¡îËrÚŽëÓ_Ðöœ«º‚ùˆxÉ ¤x)³­UÎq»÷?IlrS Ý6ášfß× ‡Íì;Udoü^cÞß~÷ GbFx5oо3?¡t\MZž‚ÙØ¢læ¯`N°É 69Á†&@¬*Êפ·fÖª¹©úžäêû~iâòql÷=ˆæóøBxq§äü¬"ø˜(Ê× >ëÇÒ˜kcW á›;jâSO&ò¤/ÝY #)h?<BÉ(åÈ…{Ü  °Zï,˜ßðÄ*)·*íoDsƒèćHRKRwååݬýÙñƒIÊWNýîÔ{ ëޓøXDÑòTõ™d¿äê‡ì~²ˆµªÁÙ8µbØä™!hJ$áJâýàu8|k1Ô™¤žüUvw¦Æv¦“ ™¸Óùûo[V/ðëáK@ºË¨g<µ`õ¨2’!JÑ](¶–Ov¼¥ûo¿ÅÌ5ãóÓžôÓoL{J²ÎœV‹ÍØ@BáðH5˜#žÄdvê jý u".’–¤XtÉ‚pGV‚ß ­ÿؼÏHWhum*‘úé`¹³D¤³£¤#R9¹Á9*ø0o´º¹JJ‰dóp×ÚkB1éêsè¢$ü~©m8R`§—ƒ7‰àÇ"y«ÒæîKšåÉ>á×½õ/ñ–ó HÌoŸL‰µÀ7)*ŠÃ¾Çš"I’b` ³­ÖA…7‡;†ÅÒh’²0v<²´¾IÒ_]Ò‰[[OªÄäT/¯ÍBŠÐKÔŒšÅõ裇Ib®›ç&_šÖëñÇ{êÝ”Ò/![<Û¶x’9­L1Ør’M²Lªåù©Òx§ÈR]žôvM(ƒiƒò—ÂLI\ÿ~DèVë×Çb5“±*5΋ð*P„Ñ¢”ÔjU÷ZdÊ¡ ®gªÖúKÎö‚ÀÔ…Œîk¯Ä„ˆñ¿Ü²ÞÄãe ¨ç©êåUÞ`Ûǽ5®SnUvt+£õ”ŠÝ–Ü;º“Ù;J¿ƒ‘Bp¡ªÏ=ûÈÛ¶¥„&îÚKª¦HñO³'”75–À¤l32ÙŒÙb[Ñbcvqï³ÓÄrvÀóNÆZnÓ}Lä£. ç 8á:ÉÜÑe)äŽfÍj#®Pâõ)¹š”—~Žv8]|s¹šoÝ”§F|úËûžP,iÑ@ÁÅrr`)ÕÁëjOæèI•þ²K—´¼Œ-ûþ!7‰”ͤM™I,¡Ŧ²l#MX×¶ H‡ãA²ùî Ý}RÔ,t祪?NʼZQš5ý+ i–K3DÝÃDU×wZ£Õ)³†x÷/Á9?ž©kÆZõ’Eа&ðÑÙz`‰ÊרØr8u~’õa¤Tõg)©¼Ï ô¬ÌË*ó‚ÝuW}½*†;¦ êÁ;šb¼álpϦçpîÚ«+(ð ]{{95•“ÈÖ ¯2Ö;_ÜÉ9°·'¸ƒGø 콌»+Ì–àY:93xÇÊYÜ)ÂýÖ¡²ã“#@@éÛÝ‹€)] +¨ØëÏç9‘êU•×kÓ§RÙ,‰k"eQÂÁ–«€æ2EwcpoÙ¥Ó©ˆõ¶¬W{Ïu˜D㣬/.s¾óÝñ•TÞ'fž—¨GoNHZäôbLHâzƒÚž;š§Çåj:x#(¯Åë÷<•/EÐÂå Ý}ßPæžf¼Å #®k7 Ê;?o/ÞÛ¼k9Íp›U©Š—“úœö™÷ÍéÌ+ƒ#ýužyB#ý¾'FL?[ï(›‚ÚÆïG¾ú€*­‡wæÈfV3–9ÇŠ•IÎ>A ž¢Ö•{0ßò‹½ó¶,¢T‡KeÂqö˜[¥÷›ÑÎ;gìjT0j1Ð/ΣTØ\ì ÈŽºo.f¬yùƒss1!Xã£ÒUÿP‰Glôõ¾Úõ›Âßhêªg¼ÛNéõÒÉ#¥‡!!JS#e¢±ôza­øºžÞL 1}Qß›‚+jÈT_«9tß^ˆÆi«p¶Mj«¶ñå_ÖVSè—Ζ>…bçïá* 5¦Û“Ç”¥Z`²Ž»z_½ÿo÷ŽT%B7]1#•ʳ£xºy®rŽYÔEdm”,ù@"v0A(eíàyçDf¡MÉH£˜¬–ÚÍÛ>æÉVn4`þºÎwmË«(zF&¶W¯Ñùc«Ô¡ ¿) Ø.6øíi—¯R×øÑH gÃç£ñ7»ÄÆAë?5Á”87"/ºl3´ÎMÖh6w×Ùb`}2%S¦Éu"h‚ÅÛŠF6=YÑA)uw‹Ø®âõ‡J¡G¨ÀuÞì àš.§FðÉA¼õ¸NC}¾ç"SߺÔG‰8ƒû ¼Çᓃ:7 ¶­Óm3ýïƒþSñe|gRY;u©†ÁeßDšÀ¦*¿ŒSÃH=( ‡0‚&KÃ[` ?W– ÊHÆñX*ϧTH¼Ø6î½á<Ø"§¬±¼FèûyÌ)5Kg×I´«º¹6Ä’kJø3ý›ïG» àë«øUã€r¦ØºØ¨gz¦,WS]IüÞÊra¨ßQY®ÛùÞ]Y.,µºëk‡. @°ˆT`§£™Ë’•7Üš«¼ËŪ^À˜E¶`½ðöÔLÕÌßJ½Ÿ=¤çs´ Àì‡ò¸»ÁðRi÷ …ìxó¶(â+ÆÂ–/÷pÙR±åTíã—lÊ7˜š¸ç¶Ïq}“6ìJÜ€CàŠ©Š¦m°˜oÉ™É;´¦\kLå˵ÌW˜ùÊfr…¸4´œÐ“z²eæ*Üg"ޏ“ѵ†'õÜa+ìÕµÏ<ž­¾…ÍP¦Ò׸¥œ¥Áýr–F‚œ¥±„Šs–Æ›%Šråk ^1Nø]e(8Õ˜í`>G'WN_–rtò"ØrtrŽNÎÑÉÑšoŽNŽrnåèäX̓¹šãb¹ãb±rï..–Y($lM>atd ¡*Œ¥M1ëŸü½EÌö×wê Ž Ág±À(j| 8f×!¨1UÚÈb¼ÁäÙ^4Q°ÍâàrcÚ_ÇïíÕÞœÏsÿ`åUO[oµ‡BÁ;ê«b ±ÛqH=×ý€°mûozô¼8U¹Ð#ZÇÌMÁöÜïtL=øÞ÷çí&f™v¼Á^&ãð@¬ÓOlCáÙà7½¥¢¶îndK%¸óŸ‹«v¤1îžâI ¿Øfâ¬^Câèí;œ"²\ðm@.âõê·“+Ì©g=ËèÈ@pÌ‹WÕYþúùøùð>¾D endstream endobj 6510 0 obj 4823 endobj 6514 0 obj [390 /XYZ 37.5000000 571.250000 0] endobj 6515 0 obj [390 /XYZ 37.5000000 571.250000 0] endobj 6516 0 obj << /Type /Annot /Subtype /Link /Rect [207 94.2500000 241.500000 101 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_wrapper_split >> endobj 6513 0 obj << /Type /Page /Parent 2 0 R /Contents 6517 0 R /Resources 6519 0 R /Annots 6520 0 R /MediaBox [0 0 595 842] >> endobj 6519 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6520 0 obj [ 6516 0 R ] endobj 6517 0 obj << /Length 6518 0 R /Filter /FlateDecode >> stream xœí]ˮܸÝ÷Wô:À´ERO àÇu€,6EE0“I0âd‘ߺ[Ý÷^ª%WQT·ÆHl_YY,Ö›§Þüñóß÷ÿüïþÍûÏÿÞÿ8üþþó®84UqþoüõÃËØö0üyß´Õþǯ»oûo»O»OýÿÛ_øüþÏýŸþ··û?õÿûeÿ׿õ?üiøGÇðuט¦ÿý×Óï]cú?×ß?ÿ×î/¿Ûÿvñò¹a2¯ÿþƒkÚº+ŽÓ˜øô·Ýe™æôë¿?þ¶{s&@ÜWšªqm±7¥+÷¦+íþ?ÿØýÜà2|qèJcšºlŠïùPc_*«þ#¶ÿIÕŒ¾sú%3ºQ¼2…Þà§™KŸÚ—ÜÙªvŠ;{]ƒøµéÙæ8s­Eƒ›ãÞZSÕmm{¹th wþëwªh'Bu•Æ6\Fר†¦®è8si¢\ö~hKg\cûÓÝïöñWmkû?7nøïûVÕöªLïD_Gר¶Q§™kh8¸òn·EyѦ”'Ú‹á7•/g.N•a¿£ *çÖ–­ÞQ~]ƒü®PdœÓÌ•Ž2\û(»ªVÜíëèR«ÈJÇ™kí6\òWKUeg+E;¸íUÅÁ3×ÚY8¸äÎÖv¡¶èt^ƒú­S”§™‹Så²·xtm!Ýÿ§çK=®±%]«(¤O3Wò¥ðàʻݕ¦uýbx…ÁM­g]Ÿg®e]F”Ý-/‘A§ »_ ¯0xÿw½ÁO3§ÊesG£ŠOåüxÿxñÝ—Ý›½­Pï¿ü| Á?xþíË×]?ÙŽ¡ö^ø|ùiÿû~>oÿ°ÿòË®<”îœ8þ»ó“æô¤=´]QÛêå“÷ð=±­:=q‡ª¬ÛæÕ“öüΜãÉÖð |Ç}8=©ζƆ§Wllü‡M ŸàÑžÐdñh˜e=ìF1¹ÆÁɶpKñfCBâÉszbÜeí3v=@â‚XÜ–!1;Ÿ»æµ-ß`rA¢øó*ÞdÌ JÏL”ìÂ+ÅL‹ Akfö<SêÆ‰ý,øÌlñ ±aÃdŸ¾ôêSIóu§úr–6Q—xBëÎ;s ðh¾x´}•ßÅŽ:âº=™„YÒÍžG3æòÒ÷}ïÜ;Ÿ­ñ?ÅÃc@ËpØ4Æïœ'ÛÜðÒŒ'ë´o”%TÀ"!xÕá¥Ìd>Ä[®¶¿©+ï zFŠúÓWãùŽ›¹*c®jk{Æ9fÜ1FÇâ¹1/sšá“±5ŒIÌèóV!k£`ÊvM2ûiáã£éÏœ¥qiJ´¢€¾ÇÆ7|X+æ},DDÙ «wt„5¥k¼aNV‹ÇxŒœÇ§WÄ%¦D©†#,XÆtöUBÀž™‰fôʤT·ú’¹L@àÎ<Ï€•JãI(F“èk¼Ú´¾-’ƒ,aŽ‹KYÿÂç1°b‹™ìã˜!– ŒœÑË PSo‡Ý<£meü3úaP%§Ù¼ZÞ;ôÄ4艅ïáh5|§ƒOð¬]üzÒßzbµ¥fWû~eKbÑ„Ÿà£ I ‚Š… áþ©ä¬Tâヵ>é`ŠÆWáÛl‡æ¶š²š:±šU§cC‘°KbÒi;(ŒÃoÞΧþðü0[ ,Q`¦Ë“fj‚¦+§·‡ïá;˜üŒgG©`‰@Y ÈÔ É*'ü}ÍÛŒØGÖåÒ­eÍZ¸2¦s û0áï±þsjsEùÀ}*ü“G ‰T&ìâ~Wà;,Þùw.cúd¨HùaÆ8[·H©,¡Ácz’cNaÀˆ`ø õ‹xìà]Ö×"X 2LóÕ­ý~ GƒOðhvJðÄùݸfÀ3¸u¶pqÍyëKÓ‹w Eñ ß)ГÀhïá >Àïà .#"ʼpÁ”}òm`\[‰b§È¥y¶ªÎ?\tƒ£|kž û@rë Î3 ¬ƒcf÷—©dŽj€µ™ÃÅÐú£¶ëtŽ·Å5˜ê2}¾Q¢¬R$¢%ᨓpa YLÃ-·ù@¹M ÀU˜GGBÙ¡•@æ {l¼Wv¯’ˆTœ,o Ôõê¢óePášad&QÈs ¦R&×dZ¶™ªpÕƒŒ7›© ϸڒb^ }=¹@ծÕ§6[$[¿ÎwŒ«êÄR„™õ½__H…­- íÀtm<áý¾…e,S°C¤™ãC9<ŒnJ…Œ²¼8˜:Œ ¢sÏE0U¿Â8V÷!Q'}=ÍòΪö6loßœC«Xß3³ï=y‘³ôe\Bª2^)÷˜ÍF›LõÉ’-Ìa¶_¶ÁLtÏ͊кôiÖù‹ü⥲ñsŒWA¥$#®PÖj ‹d%Ï:%¶\Ú$^Z[4àÏž-ÑõB­]'ö±Ò^qVaÌYø¿Ã ¼a,dYÞ `.ãÝÆ˜~¢»]ˆAzÍ8Ï×ÎVúÊ>YgQ”c3¸7–¶›O¾4¦š<[f¾XŠàÑž:ãÊħnã_Iþ›¶»L¬PÝ;ßjM!Ï{+êÌ ŒD¹¸àƒß tOÅä"ÊTÆ4þ§¢®u á$ u'Šg˜/0¼¦v©O½PAABlE$íe3(É×€S˜ŸÚ¾ù!¯‚,cñbß‹baÈÈg¦Q"°.ÁÅÒmT$œN—¨:_Þt,ŠÒ¬±,kO'Ê&ñí™d‹Äˆü‚pßtbÜ™·³ÙT²‡ÁáÉÏK×vxÉÃ|Wçâ˜é4‹2Ýq~Û"”÷fš.ãì¶BÀD@Ïíw˜V2Uå  Roñã³ÄÜpˆÁ¼–À¢§*Ü™òÆ-Ã3`X‘qÿ"úó0aGf²‹;yYcÉÉ–2 "Âs#ªìTÊniÎi–D‡$ßÊ[EÝØ«Eß2ȸBL­t©{[Ä•“¬ËwÄß+ÆÃÂýzˆKú²>¦_Œ:âj&g»¸^P1wtËsº®õ¤z :W¹Âú2‹kS`-S b)—šÍëwÆ”þ–ˆæd2¨zÈßÉÐ=uÆiÀ¥}¹HM¦·ç~`³˜žò’E"ÄÉ ר$"Ú6ó3 ¯n5Þ2@‰m`,{Ux¥á‚¥œÆ-¡/*Ü‹z~‚s²é½z¾|J ¬‡ ö~!ëQÕ·n{a;8ãYgcñßZ)|RÂ[r9¯'ñ­„(º9Ù{WËߘpîr m±Z ƪd dë«æ]>͵Á9ç`fçœa·ûdÈ"w†º´¾8׆ö³¦c +(…à§ÊlYBÖÚðVî!+a¸À=_YÛ\¾tnUY^±¶ð=ât2ftLþ`yiŸ )ƒÊ)QÅ‘ìÆ‘l¡ÇªÚÙçS…7¡YA)ýË$ Öæ–Œ5ÅÖ.E¡ß%ÜÒö »glúgØì!güù ·Mu]š‰©3 aâÝ´¬rWEak^–³§H)œžo02˜6LDšjR•‰ñýª$ªº?çH°ìÎô,’ƒzžŠ5ßa˜ÈöÉ'&¢|³E¸ùo¬P¶*1YY¨½ý¡më*ï¨ØüKá%‡+¬G*QÂøÆó N N¥%¢’”QDiá@T#RÇF”$~܃„¼µ œºÂï\$¤^šñd¥æ?×Ä”ªg«†ëË‹µ%k›ºö%^"7)"IDî-âòs~éÛ%;Uv…o&Cl`pZEQÍEÒ¾”Úb’V%‰)#¢âÂ?  %ŠB(ÈfGÖY+Û†Tò(@·ˆ¼ôåÑ EaU§Ê—ökÇ3éì®ê’‘<¢ð;1U>ÄiHYñYUöBÖü£bÛÑí‚hôzpµð âÀ}Ý´.¼.¦¦:{m1f¹v¯ ºÀw Ó|ø4Ù²™Ä»î+ƒR9[ x±-Âa±Ž2J=ã:Q14â¦ÜyÜNÝÒ§n"|gžQ‡ڼq€D½tŒåácÑ´@û?GæF›l³õˆ~8$ Bê;‹R,Ö#(ƒèA¢Î³%µÌq $„Ç=â³ðÛ\¢±š c}]Å^Jˆ:œñ À G(IÙ›³£*¶Æù™Å5ÓÚŒî¢p²3HUò˜l¥¢íÅ’Üyho1ow¥ÚÆ£Ôb)Fl2ê~|i`A}y)ª{¦¿Hÿ¥ ‹߇*Êò6Éo@x÷Ã$‘À0I%†}ÂYtÉâwpô§‚£á(Áªpd ClÚÔX3_B.†ÖÎX ëîe/[>"Û•'YAŸ5Ý÷l3!MÙ|s·W·Yo¾pª}>H~Ù»œi‹—Ã4Ê%4³A›‰ùº²wPú&Ž€Ú#ÁLT‹5Ç२4¯Dåù'³d¬‰¹6\û2v¾”m9¶Î"äÂSƒç-2ã-:RúHh[ŽïÝU½süâ¿î>¥Ž†­ÿ|–†h(‚"ÊtÇÃìqqéC#p¨Ä°ÍVÛz©Èœ$al'uØ¢+nÜÚm¢Â¨À+%jG×yJÔÁugø”0 p¦®’M„§¹jœ©æÂç'Öëì…¾«Äà 4“XåmÜÊw¬Çûcñ;«¤¦Ãøˆ«Ä­Í¹B•áÑ嫎׉÷{§5Ìqg{uÍX¦õ®3wìmªÜw8­®ÿµÿÖ/#¸ÊOSÿ`F¬£½EgÜ¡w‡úîísàlûÞ ýù¼¹ :SÎì©4}¼“õøÉ€ÁbC(ýgžgp+üñ}ÇMEÐnÍíã°RÔ»|Êç)p²fXúhÃq½5|Ÿ”hß [µô—X†;þ¹Ÿñe£1ížâY`pøÝwpü2ÇHqã £å 2v½Ç±1Ùsøœ<¨årƻϯý~öi wDÏ<>rx /ò “òõÓþÓîÿÇ~3 endstream endobj 6518 0 obj 5534 endobj 6522 0 obj [391 /XYZ 37.5000000 755.750000 0] endobj 6523 0 obj [391 /XYZ 37.5000000 755.750000 0] endobj 6524 0 obj [391 /XYZ 38.2500000 446.750000 0] endobj 6525 0 obj [391 /XYZ 38.2500000 314.750000 0] endobj 6526 0 obj [391 /XYZ 31.5000000 535.250000 0] endobj 6527 0 obj [391 /XYZ 38.2500000 446.750000 0] endobj 6528 0 obj [391 /XYZ 32.2500000 534.500000 0] endobj 6529 0 obj [391 /XYZ 38.2500000 314.750000 0] endobj 6530 0 obj << /Type /Annot /Subtype /Link /Rect [64.5000000 719.750000 99.7500000 726.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn8 >> endobj 6531 0 obj << /Type /Annot /Subtype /Link /Rect [287.250000 672.500000 324 679.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn8 >> endobj 6532 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 626 114 632.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/2/extending/extending.html#methodtable) >> >> endobj 6533 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 618.500000 114 625.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/3.6/extending/extending.html#the-module-s-method-table-and-initialization-function) >> >> endobj 6534 0 obj << /Type /Annot /Subtype /Link /Rect [166.500000 322.250000 193.500000 329 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-3107/) >> >> endobj 6521 0 obj << /Type /Page /Parent 2 0 R /Contents 6535 0 R /Resources 6537 0 R /Annots 6538 0 R /MediaBox [0 0 595 842] >> endobj 6537 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 6538 0 obj [ 6530 0 R 6531 0 R 6532 0 R 6533 0 R 6534 0 R ] endobj 6535 0 obj << /Length 6536 0 R /Filter /FlateDecode >> stream xœí]Mä8r½×¯Èó“#RÔ`,ÐÕ|0Ðè|Xø`Ìzw°˜Y¸½ÿ}+3©¬LJ)¾ ’’Rݘ©êTŠ¢‚Áˆ`Ä‹ˆ_þõÛþöÏÃ/Ÿ¾ýÏáWûóÓ·—âØTÅåÏáô÷çÛt{´¿š¶:üúÇËׯ/_ûÿÿx¹ÜðíÓ¿÷¿ýßAþ­ÿïï‡?ÿgÿá_ì—N_øã¥QMÿó÷óÏ®QýoÅõçéóß^þã§Ã?N#³“¹ÿ÷ÏeÓÕµ:MãÁ£¼ ¯©Îÿùë?^~¹ ì)MÕ•Z”)ÍAuFþ÷¿_þÚ?`¾8vF©¦6Mñž5úô$múAt×ÿ¯ìF:ÿ>ÂàeÓÆü§­øþ>Z£+ކ×Gã{VILƒ>G™5òuií™5^S<·Oð äDŠGü>˜Cô*e¢g—À7Å4Pxn®¼~ïÕ`t VUÃL ‰¢ÚðÕ¼¬ÄÞ»/­Íù¥º¾ô…AÚcÛçù¼Mæ3ºR\^ÍMyq­¿ÝóޝàÑtMÜcà=º§Pç+ª8Öjû‹o³¾\©Ž¥nÕýûhø¦øžÎà ?§†«¯XADÏsàû¨A¡7uuÿœ¯æÄW4šgÖ—©Ô±2õÝšÚ{bn²Þ(¾ßeÖŒQæ¨Ï 6!GïæyëÏð¸VêŠÑ£ô0Å…WIkm·©iš[dêJu¾R+}såÂíœAF_Å3yE¼x$°ð6žºÒ¢÷*Õü÷“…’ÅNíŒ÷²ÂN•Ãø3®xŒ©„ÅøL.¼êxmáhV NÝ3b7L<<|Á1ƒ`Ê>RdS+ˆwœË:žá!{‹0>Ä3{H%kÉÏY/†í<¤Æ[>³‡(˜ÿæ QÝ» (b—ZCœ°Ï‰¨«²t5àghž`&)á0ÔÅ’ïB¿yVŽæá#8ÚX4àƒÅ2ÁŒxY°ìó˜Ù¢„Ô%: IÌìCQZ•à´'ê0ãšÊÔÚ¦Ð#AXŒIĘ»žm:ÿ5æ•Y"G(+-¾BUý©ÕÕ¨xðú.ùìÙ~Mk\M=‡1–,îéçTë³Û5²vM[cÖ°OæŸ'±oŒñ!yîÌéau,íEµJ ‰œ!M¥Ãi8vbýìª:]yÏØý{ñ†+=\š#%u(«ª³=…_ÙØ'Á8žEçf…Ûâ+WÆ+ÂÌ N$ @Ý™D1"Þ¦ÝÄ$"2ñ®UIt’¦Þ ²c2zŒ‹úñ\QÖ]çèQưԟÂOPùÄ ^gCdŽ ²)`öù]Œå@Ì ÷1i»î_ÏkÀA°õOÉM¼‘áR†` R9ÀðhóÃÏ”­™]>x^]vN#1»ªU®?ƒQLès÷áQ><&²… #mC‚8 !  2Ý8»’xù¥ˆ½3}n  F)MjåÔ|ÊuK9ìØbN9ÌydÉ:¢÷B5¦Â)§ìô.æ”0vè%ªQ·üþò-Oº'£ª9Æ"QõL2:dë_¯Ó.c¥ÞA ÷SpuÕ«9âËÄJ·Ãd c:•oUg,™Ó?ÖŸæsÞ‚Ã_ qèò¬­h<=éÍø³À[Ùi{8ÇG·TÐ áCWHTrçèB‰ÙÕŒI' Idb `ŸñØ1QaÂU±ùÈÍ’=.Œ,¢â8„¶Çtó0 ~ŸlAà¸aêiN(œR"¯Âr!81ýþ¦vÖ9•­+Û*zâI½÷$ª¢²*BâÕ•x~gk Áxsd!©²þßDÍ'Vuì¢<óQ XVx\¸„›/veàiN»QŒ=íje*ñ´ o²…œe„,£ü„ëͼ¾©Ï9Ù¿S‰Åí)¸)[›W<ü»;¶mq¨ëÓF©Ë§Fêêx¦BQ ŸüúR›£Rn[uýVy7JyûŒþûößÍ鶃swY»Ïè?é﹟Éé[íÝ(íý3~{ùøSòÔùÖž0ÍàQ0&2®3Îx!˜ÀJª’¨Ù‰mñlš^Ýl¾7všØb­Ý*•ÝbZw·ÌMÝÇ›·jî7oÕNmÞºp7V]Œ7o}Ý®Ã(åí3®›·ª§6oU¹Ïè?mÞÓ·Ú»QÚûgdݼý î›wë›×"TfoÞžÏï7¯ý GÝÁÙµeý˜{vLîkœ¤:ʿȇ\1WDyؠጆ˜ì’K¼Rõ_$H»¾fþFV¢Êv¹>±˜í!”qt"ƒåÝZÊîwÏtëÞ<T¶ï!=’pXÃqLe_ÙŒJœÉ½)  ¿Ë¡­É¡˜Ù¸•{PÜŠ„KOVFï¦Z‡°¦°Føy:wÜú]Q_Е²†W ÞceÆÄ»èS£8Z›m•R•Ë·¢ÉÈ‘sõ= à„"¦bs›¡&jÉ»ã%ûmتë6ÄE|B¼L¨Ót>Bêa Ö¨2­rh™¿ YäÒ{{ÔEZÏK.ÖÃÌšrÀbA·¤&Óz+NSåV®É9 ÛÕšÂV2k\áî‘o(j:¯«b=æ ¤Ôw¨höµ¬LOGÑÞ«:æyDêèÁn4Y¶ýN~q¼µ,µ'ÊO]^Ò¥pFl&;ZWÖ,•®¢ZªnÝ6 ©"™€·*3–Šq‰Öãˆ\l)¿5ž,y#;&²LYr:‡¬ý› ¤”¾­}UtŽþ¤I£‰|Õx§Br0VX*Ã&ÿy`UzmÏŽ_}o±%\ƒéÙôeòc®(oãu èüMì™Éæv F­Ü¤”{•è"jj»…ˆq?ÿ&[Ì#¤ÈÆí\b´s[XÁ©×Ø»-¸áfb£ß!§EJ+y,’ä³Ð‚C>€h©ÅY5>4"ëá ¥Ô¢q•Œ©›Êº hwì*sùí¨c–é>%zR\bLˆñɤZõ§OfЉï)JGUä¸3Î÷9ÆàE«}P"(e‰a'Fñ< BÆÃ2£z:Ñ&‰4˜d‡§½#Â"õ#ljz›ŒÝûp´¨i+Eã(ÝlrÒ£í ß”gƒ0ý[eß'‘õBŒj]sߌ !N”bêêÈ*%‘"Ù9>´ ˆ$•¸Æ¸Çe¡²I¹LÁaÆ£`™‰JÒ4*)¦T‡××ià§jD›ß¾^•u›ß DÝÖ²r%$°%›½µ÷M2Õ|`âˆË’Ùtn†9àØz"±®uOUÔ0W%ÙdÙè£)ý¡˜Z3©ÜÙŒ›Ä‰P{K†Ñæk$ÿÔÎRò‹£f”W5í€Ç%7‚sYb‘VˆÆ2çïaA(Ô¸ëw?Þûö­¨Ç—Éâ|êY V·Ž‚[§QÆ)#lmqfM5}ÖŰª‰vÿb„ùÔ=¼òHNDM5ªk— «Ä·,¹GÇû"—lRc ØGN ó:se:S?VÞ;–d µ§vŒÇ0«!PI6•U4? Ò…™å!€]KŽÃïOo©-ð¦Q—l±¯ªÙÖlÒÍ!ë‰*a˜¢s†ð¹>ÏzU)‹,Ε”Nð6–³%Õ­,f©ú§;jX¦s­Hu¦¸<¢nUÅ,—óöw-¼„ÕΟ#®Ÿ8ëêê]82Œ©-‹¢”­¸‘6Ï&¦"®”Ãù3x#cçû›ò9„DáÌr9xíA›éš.½Ì­O;jxä—+ùÍ=fÇNfâŠ}µúhñl7÷| Fëàh¿n¯>®ôÿÇ¿°QsìZçŠåReŽ.üÎb&®Ø-5už-¤$¾gÀR½½á€?Yëð+ž7¼ì˜ö{ŒíDé™°šÑ«“‡”)=\z—VÉ_\'piœ#Œ_ƒAÁÉêîm˜G¸È&Ž”Ž è-¥¼5ôåØazŸ‹FAöâÿ8f¥»åé5‰†.©b![‰9+YvÍ_")?8tUÚ—ÜÐÆ©üÙLM ‡›=6™ª|Õ[lIOªqT…`±r5^^*Ì×nFKãß®ÎöoÃXÃu¢Ññ³C•Ñ®åÙHÀW!–eý’”µ…é†M¨ü±ZYG"ÝJú>µÆû9;µ¬†RΨùK”ªbjÜJh9QïDøw—þq›£jGWÄ‚< X™lÅçæË P”x0ö ƒÄd¤ÝPîD)³%‰M‰jD×½±9àS„Ã’²8¸ açH;fÑ-þN³}$èØñÙ6g2â‹)Éh"BrS²‚ÁԭʯFˆýdK]D XŠ:©ÂsLä-»<{–2ïRhÅD=ж$–_¸÷o*ðÃüsž3SbªÏIÔÞ¼¶L`ž—#uœÏ–1C²>ꦤ/¸KmÜú<ÅqToæ3ºbwHuÔ£|ÌiF³dŸ¸ÇÂNNZÃ]ÏèÊPgâžOð}†Ød©´# J4·aáƒfßÔ â©¹ÁÑ<ÏÁsÃoŠgƒ: ¬ìVÅ´²ãz¥í¼ÃúÒ4•ó[ó‹.º˜7Q[/UÙ©Í÷§’Dû¯,º~òš ã‡.bª1c\ íÓTíDðCè!q¤½èßfâTL€KEäVÒ éZÄäV‹:©ˆ&.“í…KupÌ•-È€B’4d3åæ‹Æ[ÌÿûÔ¦ïðTgYV÷Ì7qò\ià•^ùH<ÞSWJŒ6jÃß#”ð¬Kˆ‘Â4(ñ 0â ˆñs ‚ yä“v«gK|Å Ø©¥=æd‘Öz¤Gò%æ3k—-™Âh$a¯Xªž"²Õ˜s]öY§BÃS‡ŽìmÝÆ[€ ¾®ºO1S¢3gÆm´‚Ì‘És^•-ƒŸÃç˜3“)›ªbB¥uFårC·cŽ•óF›=ÓŠæqµÙn²°xÑ…Û½ßOéý¨#á~•*![ð!‘=0Î&“u#ožËb”™YžoßÔg~¸ßó@9Ö5.5ƒUî;ЬéLßj€´xª?O1Y®ŸÎêÑ+Ìö'L: ™¾u-µçÚ“Á¶—£¢ëjTt]Í“Ž*î]wŽxÄu÷pS|U„þºRBáä–úV¨<ýé…Ïï[ÙúôƨÛ~ù6«ò½,Ž[9‹¬èUÕ]¹ä¢Wø\ôªÎ)–¼¹½ºÌ`ªD¼R`º]ø¸9–£ XÁRPžV°°37 `i+\ÌÎ ¾}W—z1'™È]f˜î•!Š ÛºXߊÔñLÔ«v M¯R¹XWUFˆ Ÿã÷ÁLÅTÌ¥P׌oH‘ÉMÆÇ—ù›ÿa!¨©µ•-;Ü -¦N5®òZ•Ô"°à!|E¸¼dÔ¨¨%{d1 Y=Ú>H=FÝì&"ÅgTiœ£Æ\Á= ÃøÏ.¶¬jKWV1 ß„nWǃ0²* LŸ¨Ñ’S'uUéî"fİí–(Ô-Û R%kqÊâ3â¶Á• ~{¶9a”âЄËëV% 8ˆËK4‰EºW‹€fÅê<ò¼Uƒ¢ð C™|Å´-‚cq/j—R[(æ¯êž*£b¥‡Žáóý=TÙ'Ñ t€ö]Uƒ1<æ?£ þ %¢F„lC.‹º˜(Êy`ׯubz"m’Ý›Š ˆ 0åó Ô=fÀÍ-rÌ "°'ß (!C¤s^!ºã)-¦dJ\§±ªÃ 8×Ùã²……³QÿÓ“¡ ŸSÀÚÒ¸°™…SEÜjºv÷Ú3ƒ,ñþdІÅmš¬’37‘œ Ì…÷µÅÔguån2Y#!¿Q´è˜çB݇ø{™£F"{O6[a™®´Lwš¸˜%gž§,*{ ÏÛõLÔ¹ÂSfôil< é†G“íã)Vù•-£ìñ°éêᑲ4ÂrŒ]Ee¬=¢ä¸¨_+IÑš›+êä¸02bªŠ2û§æöž)2Op üM©€“UöÕG/hwØÔð8JgÐk(<¼ÇžTЫ߰-Ëp§ßû i+õaPêŒ1‡ENâ²Îf™5 ­>$sØd!!=ÜCùxYp ×ÍÂoúŠ$@aÞÏjMQ­˜šÇs%ÜGêÆd(‹¿¾¾ü?ñ=:s endstream endobj 6536 0 obj 7768 endobj 6540 0 obj [392 /XYZ 38.2500000 469.250000 0] endobj 6541 0 obj [392 /XYZ 38.2500000 266.750000 0] endobj 6542 0 obj [392 /XYZ 38.2500000 469.250000 0] endobj 6543 0 obj [392 /XYZ 38.2500000 266.750000 0] endobj 6544 0 obj << /Type /Annot /Subtype /Link /Rect [165 294.500000 192 301.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-3119/) >> >> endobj 6539 0 obj << /Type /Page /Parent 2 0 R /Contents 6545 0 R /Resources 6547 0 R /Annots 6548 0 R /MediaBox [0 0 595 842] >> endobj 6547 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6548 0 obj [ 6544 0 R ] endobj 6545 0 obj << /Length 6546 0 R /Filter /FlateDecode >> stream xœí][ܶ~Ÿ_1Ï</ºE{w]  èCЇÂiZIP7ýûÕŒ¨Ù]J%}sHI³Š‘ØYZäáá¹ñÜøþÏ_þqü×ïÇ÷_þsüæ~ørÈNežµÿϿ޽ü®NîÏDzÊß~=|?~?|>|nþûýÐ~ðåá¯ÍŸþwÔÇ¿4ÿþ|üáïÍtéü~=”ªl~ÿåò{]ªæOÙõ÷óÏÿ}øÛŽ¿gì–sÀ¼þÿw¦Ê £Ï`Œ,ýýÐmS]~ýþí·ÃûóV) ¥ {TÖ4ÿ©­>þ÷Ÿ‡Ÿšºé³Sm•* [f·,¤LqY*kæP…>ªæþJ—_RóǘÝDý»9×)à¦Qê•…šÁh€Þ õxA”ë×Ì ˜·1Þrç‘ØÄ(ÅY˜ë‰×1í™>}m´ÝmŠªZªQÜg%u6‰˜.KÚ“5­¿Þß@uªêì©TßèVt«ìT”ªjŸ·Öeõ<‰…“ÔpáŽ@`í“N'(SÝ& 2#˜4 x‹(<‚™QØ>¢ÎƈµÀœ CM›ˆ4„i³<1a¾«T–ýd!aæÁNŸˆB¤dÆJ€°)¨‰s̶˜Õ“²­¶©ÙvqLÆhIÒšñM¼¥ˆqc^]\’åð46›°/Ž`¤%ÙBß.{@­œ6»€™«òµÌVö¤/wãµ,ò×·'8î *Gß\§iò“Ñ•š8â(q‚–‹n;=^º=! Vj=;އ.”p§x? ÞPC¼)ƒ`S¤8â¤Ø˜Þ…Pã35¥“ø ò\¿^rQøÚÞ‹9å¶ðˆ²µ^x kû z®wÌC`ô·“(Óæ”#ÃëÀm0ë8›¬ò)bHš` Æ,ž ‚ä4ÞR°lÂd@@ B:šÅ Ãu cpDW68€ #’ÀCL F<}¥O º>ˆ$ À‚"ÀGÐ @$µ‚Üï°Q#åÍ•øµJêK¼%|à R!‘XhhP´Ž!;! ÐtëÃ`1WÇ/Ëï¼A¨*bñSxsÊ0î­¼2=±‡=uŒëç1¶à®Jãí@=Î'_ ï#„ˆ»®U柖²ü‹ s]ÒÏ9c‡d\'iô´Èºè©Áî9ìPÃŽHÙ)ÁŽHœ^A¤=`¨©FP&`ìB*Lrh‚s \ÕkN³N9K–2Eè.R}CÖM"P­?‰5§Þ‰U†Ã`¨’ [7p„‘¿;ç¯"!­¨ë×BzOHQe.Ä›E´{B'Ö{§òy÷8ºcÁR%fÁ]¯ßiQYßB0{:Øj²ÊêñMì*)$Âa^µÂ^ 8òÆTR¥»ÅeS»F.UÕ%Mº»ò€°À{>…+_eµ·½Ýݙݻ3°£ ñí($"Ÿ—ƒùLɉÃÛqµÙÂΨwϨ«‰KDdÔsdm*£n4pñ„‡@Ú ‘fæ¸¹š€®€”ä3¸öŒŽé8Š×ûÁ6prLNÀXr[ÌtЬò¦qÌ\D≬éGðÂ~ö7cIQvY/í¼÷&aó#ŸûÂVXß¼O·MDÎU*WÓm¸Å²:Ž¡h¦¶…ÞYOxË2ÙAªR¨:»’/¶È°^ߤÆO#eóÌCp!SÄUµO"‹•³‰¥óŽ”ßÖ¦‹dìå·Á²X¢ô”)Å]¾\ÕånqC ±ƒ €!F]´ špÈø(ﮆ·.íë%Ó×ð®°øu±j(Ù[Þ:¶¬&,Þi@=°N§ci÷9qE°›®‹kgZ~}–‡[«¤²¶òw°|Ui‚ËÄG]úøèIHÛsÊÅSgn²áÍÌ 6 lŒA ååñÅ™èŒÇG¤ Êtºfú`ß@€½ï©Ê¶ÔÊ·•÷ˆÿÝEüßBjNû·¾@M5Ñ­bFóbÞâ(‘ÿØ¡&»K ·É±JÕùd–݃¡T >'8®¾Ú¤[Žm(Ã2œ‹ê?ŸÈ›‹èmÍãæ_˜k«iª%ñÞŠ&VöwÌöÑ2–_¢|JÝŽ(Õmh"Ÿ=^%¥k¢&ó€ŽÞ‚ÄôéŒò€!Ë\¸7–lUí¡.p•g PÅ'ÂäÒ'JÄ™›ç3ùÓË#ê]ôø)ªä´œÊO™g¯"“m@Fénè:²æ4`ᶪ~qÚM™hO÷~ ‘½±Í7ƒ1½ãœ1ws»M·«Æ;…?wnÄüC¸6ß÷ε!®Ux6‚*,ÑzÑ&§'²eRÉ€•p`ÑõN2ñ›´¡ {­XAÄ{˘x+S¶±xä2àmÅΤ¤tÆ]+š…÷ö§R„êtUxL›ØNŒ™<ìú<ïMÖAM*˜>ALjh!J}(&˜¤5¾žÚÃÓ©ÃÓ³ÖÁ"iÍMYn¤1{™Ö>õ¯ ÚgÏ£^‰9Pi_enà³µP­†¹%êš¹¿ænœ¼ãDe™Oq»u”»uµŒËæ“ã`Ñž ú&xô^×µ¯Åø¦‘=ا>T͵uÖêPë =×ü¨­µ±í¤æØ=:Z¾÷K¯:+i6 1¸ ñÍ •L9Ñ™tŽDîÝdïCÜ…é$Ó«sÑ¡ºs‰î/tD0â®ú…ç.3úG»Ç&Kí±‰™û;Co®¹q—pŸ¡wvâÊGé3Þ‘;?Ø·àw q¥ ¨Ýˆ}í•âqÍÞmàoYÕÉDë“uv'œ¨TÙt÷ p»fÑzζtß’!.Ú zƒö¬Ò¦ÞÕÕêªóóé8¯M®Úš¼jû€£: \êÁ¬o¾û\­¼Ñîe¹b¯Ý¹Ëû³qYJÅ”ÚÙMJ<œ7Çš‰ïÌséøÅM%’Ll^öðf4–}q~×_³¾Y¾D^ø¥¹ét'|!À)’¨Ì¤dà<&&û˜A$1›f¤ F>³Ÿ¶KѤú˜N¿²wuc¢­ûEóRêáò¾vÓE×(¿.O½UÿAr6G8³^c×yg–~ÎÌG~wžx>ð‚;\Çe^•'ü¦CëdW ÖËêÐp$ðŠýGøÍ#ÁûÑZr¶Ôð|à~0Þ ¤^L“ÃtÏtêø®¬23Ý!>MWf‰*™w!÷F(¼©ÌZÂP„k‰o0ÿx?µG.îí€3}e›Tc# kxd…ï]L&“ë»FNýîõŸ¥úê2=k·àÝ—ÍĈœ³“¤XWHþQÚ!ú¥.WÆÓ|=¤RŽNÆÍˆG½-'Ó% r¿#FúßU-Í,¯vªn”;{›?¡o°W»ã¨†¢ò2°PÎJجI¦û<ÃjÓ=Ó£M‚†šÛ‹6M°ˆúâ‚{ûé…Ê›nÏÎ)¯—}Ö€ %¿LGeêý[¦±q¢Ô“Tý—„U·¨ÁdnÍ0÷™´,L”ˆ ý… æ[5Øé±¹$eêì0<>¿ŸònÏ»Ð×­M¡»—Ö{'TôGœ_RŸ ¿Á¯ãÁ!kü­cÆŒ˜!Ø>¹öŸŽ‡°;½eŸAÊ °]GæÞpšúâœ5° …gƒß8ÓKÍÚú ²e îüçâ×Ù!Ü=Í'…/qp6LÚ 6p;ÍNBâ;Ê<ÀÀBD¨òy€¤¡vú„$@fo'µ23''¦¦Ñœ|¤_t•ÅŸŸÿ^Žœ‹ endstream endobj 6546 0 obj 5117 endobj 6550 0 obj [393 /XYZ 38.2500000 97.2500000 0] endobj 6551 0 obj [393 /XYZ 38.2500000 97.2500000 0] endobj 6552 0 obj << /Type /Annot /Subtype /Link /Rect [239.250000 586.250000 262.500000 593 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0383/) >> >> endobj 6549 0 obj << /Type /Page /Parent 2 0 R /Contents 6553 0 R /Resources 6555 0 R /Annots 6556 0 R /MediaBox [0 0 595 842] >> endobj 6555 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6556 0 obj [ 6552 0 R ] endobj 6553 0 obj << /Length 6554 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€ízA€yØr0˜rrv³ ;‹LrÈßO»[jÛ’>Jü\¤(5g°ke±Éb±ªX¯ÞýñËßÿüïñÝÇ/ÿ>þØ}ýøåPœê²¸þ9>ýýáåtsê¾?ÖMyüñÛáûñûáóáóùÿß×¾|üóù»ÿõñOçÿ~9þõoçþÔýÒÓ/|;Ôª>ýõòµ­Õù»âöõéçÿ:üåwÇßžFì?®›Ìëÿ`Uæi3ýýÐ/S]þþ÷Çßï®ðû”º2º¨ŽÊ{T­ÕÇÿüãðóùúá‹Sc2µ.íùû¶²uQ6>_›îûáµ¾|º=Ï_·gz•£Ï¾ü•]ܘ2Üà—™KE™J9½Û¦©¯$««ÒbCl¥²ÒÓÌ¥‰Òï6<ôn—ª? åX°¼hÏüªªpƒ_f.N•~¿ñè¡7¼)ÚŽhç‘äÉö<|€ÁÛªâ2sqªôŽG?W¥ê§~‹™pYƒ-”étþOœD/†0¸. ïëÌÅ©Òm®côÀ§Ùêºß‘:ÈžÔ7ÜÚÜT_¶D˜*ý†ãÑ%OsY–!Oóó𯭠7øeæÁN3=ôi®Û*äi~>Ààm@cì:ó`§y4úgŸQðT®?‚ïŽ?|=¼{<Û ÕñëÏç™]>ðúåë·ƒ=ÿãé~¨ÕñëOÇߟç£þpüúËA§ªVM]^~ïú¤¼<1§ÒVO^<©/OšSÓ•~õÄ\Ÿ<ÿ@Ã_ýxybOÖ\Ý5ÏO,z¢[8ó9Ÿ®KWý —¼Ó '[<\ž”'£õzJeUE,p´x¼¥p ÓœaeáºL1jùöàÙ/Ÿ ê²áÉ.ßcÇð˜öø æb²xã˜ó«,1Úò#Á ïx/C‚M‰d™¹îm{ª«òõð>1ŸèÒŸÐd­™á‡‡¯gÕF«•ÚÕ£C0¯6‚Q7P`ÐýUT:ÒÑÁÙX7ŠRÖqRèÜ<„д Ç1‚ÊÛ0ŽÑ–›b k¼¥ø V ø £Ú†j1ÊÚ äÑX}2ëÂ4¿?Ë+¸nT…®ÊQØ Ã£-—ŠŒslsY‚ï8Èën´þ]S”¸æ:.³ÌÕsUG[Í|òp-`³žÇad¤ÓrwŽ}dʪȲº¼J²Úö„PÝæ2™WìO<é„ÐÄSù¿£µÿ;L=©áhxnp´N8L}Î81cГަá LQøNwƒšzòÉnæÁO1u 87ÇLüæHQLÇhÌܘ•¾‡Oàþ8xŸ¼sÌÉÂsƒ§ÏÀÁ£6¢$nÍ:’8ÊêŒÒ³òßqNàêJÈ‹š"sé#ñˬµ0uˆ•â¤E?ï©- i)ŠõfÇ;/]¸ÏTõk*ÝÛŸK¬@ Å.Çá¯=Ä (_ãàë⳦¿_=?ÁL›áX€×8ÝÀƒO(W’¬s¢ÈµŠ B‰‘g£7SOˆMŽæ®Ì˜(LŒ€pJY ?‡q¡xx °·…!Øs2ö‚waÚv¨ÆŽ¼›øÉ‡á’ÎZIÈ?•pê‹HŒ‹Ñ‰±¢¼Ûö2ŽfF©¤ wÌ^T/ˆDcÏÑŽÈŠhrmÖ–åP›1¹Lb~ÇÃ"ŪwÈ`Ý=zbö1£VßÎàêчŸð®§ìÅwx˜mWêˆq`Ï?ôï¤áUµ¦§/äË Squ`9©Â£mÓçfÛ>Hi°yÇq‚%îðL6¤Ã\¹bAG9)ÖÏb¼~ï—[§›º°y$xmªx!VEGÎy|ÛùÝtÎc|ê iùj  ™yZ ÏVØ=cÜ¿݈Eã9\ÝÉøë±ÄᜅÎqÓ–aÍøªµC¾Çy]ØZÇv/Žã¡}ÚëRW-¡Üeª¼˜ø¨e|y”†Ãövч&ýäoªâR´7P4¤ÏŒx}¹-ïu¢‘º4’uKÛôìÉý†ÝXp:Ä03œºH¤úaå˜#!õ%›DëXŸ"é·§Øm ©ãH ÆÑÑXÞBØ1ÍMŒ«O4ùC1gsõ¹E+­$$þ6K_){Ct·–•¨-„ùšòª%} œ,†¢P#;¬>Ñ{åÛÂ6>q‚…ˆŒÖ#9Û²Ö‚Ã+ÃÜèo.s~ˆ•âCFcÜOÉ=åKÅÂèSÆ,šX‰=Úy+­±jûp–d°á|2È$ªF´˜00¶ÙjÈ]Tñ¢,r×òÌ0”ý¸x¿pØÖRôþ2<™S„:™LHó€É ó)CÃäÂHíW~Wå©hÍë|G»ªŸ) ˆðõ¼M5Ô%²…`‘ŠæÇOD‚:^ºƒ£EÓÐ…• ƒÆ'›QËTâàºz‘²q ‹(Zq)³@[¾ƒ‘ÉeÐ1Îy®Ì_$#Ù~o€² šh Î'á5R •ï "TCîSžáC0:8ËQUz›ÙŒH÷Ú #ÒCFQ-˜ÉâýVfy—ÜÞÏR›>l$7Zê+ÚÇJõ­ðó7`¬$‡¶Â\šþ- l]58÷ãO6 À3]¢Ä‹ýÍÕ:ѪuÖlÛd›¡®“µp}@ÀÂö/¡/ɨFÍ Õ2ú+úÜJèÍÃ.Õfâ ~‡±ìðÅ»{çÆWz¨1=ž–uY•}êºyüv8óò¿¾Dï»ù4…¥B.žYõ83؃ Owÿ“4éµrs(€·ÜâSî;«ƒìvkp¿Ó›Æf>ÂO»•»ã.5 # á¹yøÍ¶ÿÑÃö¾P3EÒ1=Ôd|ÚS\3ŒRQ:ì1aÂáë‡jà (Œ§Àh;µ)¨Sƒ)› ìÄÛ€Þ‡``!ìQ¬ûÛm4º†ùå¸F‚rÌà}hKBµ’ЉcQæJ)Û”™ ¤“š‚Ñ,>‡¤#ìEáæÙL>Úò8&c¶QNS8YF10ä2bÕ™sþ¯¦gu¼«woX‡”øÆ¶h/&{¾+«"˜Ïô…©ùfp‡—ÕóÄ“n È“µeÕ§È<4èé" ý>=údƒtذHfXLtÍÆö-Šc¡k:ð˜ÊYŒƒkÅ ÄòÛ–}.O(LеªN£OS©|6óÙ\ãl®Ž5²ËóÜÜÖq;3n§[dÜN ÒÀílÚv–"·Ó¥32n§ó›D³FˆƒÜç¸?½;(´D¦;ÅÎn0²]=(\H87‡¬!¸Jضƒº€é"ƒ1_£áÛ¢¬cpo#aŠ cØŠž`ÇÜÖofÜÖæõñózñJ°"ax™ZA @¨Ð¨|E?8t&QÏ@õÊÎ^¶E&UÀÃÄÚ=’1ˆòVªsiÊåË¢hcLöGÆvâ$ˆ7j„vÄÏÊ,ô®zÔB@jã9†nŒì1ûŒQ$S²¦²‡=DPI¸¤í-``±p×DL˜ôPh£#k”ªz¨EŽžá>¾â;7¼×Z8 ½¬Ø«YâõÀÑ4~߯ñ¬±{™p´ ú7Ÿƒg =9 ­Ý•à ðzðÎY¼±l5˜Ë¯íðÈì \Á!“=J\ë©tÚ9YÁ±ÔÞX"laDĤL[ؾ­ÁAÈ„Ãlë7ÂÂÏÁt⇱Sœok‡ûªr–ûðºkÀ‘ MãYˆHÅæÖÔ®›j¬F´ë–MKÈæj6W³¹ºD¨âæ(Ä2I ¬oÁ|ì-¡|ý€éêÁÜ”Ó$prlÊ;‡)Š6z<¢¶VÕ½'š.ìH§ ¯¨T)¼[mDÊ×·ýH°¥V›Þ4[Í]¾~9:ƒÖÏøaq¥OÇHn&ÌÀĽDž±LM+$¶<_Fv7(÷ít¸ý%ZÏì$´¸^žÂ.#ÚA1PëÎZ_u$Œ%€¾baº®ôµRÃ&Ñr©ž„ ca'˜ð ø-Ö1õ±\ÓÛðJ«-«ÒºŸVÍŽVª|”ã–¶Iá´7ã%+ßøÊ7_QÂ@úEp¼•ó}¢6uŽ™bŠ>)$SÌÔPæt‘0é"~áLkljá¾¶1Î Ôeä˜C¡®P(>M ÄA78k®,t¤áw`†¬Ü`‚…Ûë±à¤[;Ëc â^·\%ö‚ÕU73,˱äXÒÒJTŽil—`ŠÂ•R˜ LÊe–ŠW¹ÑôXÁ¿0ãÎðeÆ/L¿ÐÚBÍR$ãºtFÆ/tžç„ñ Ë*â9Ó·ÎH€ ÐÍ—9->£Ê[V=0“•2BŸµõ­êÇèqXM³jýãû$ê ä¤Ò¸ˆR{G ³-‰&O9ìF]¶ƒ3™knsÍ-Kë=ÕÜbh¾á‰‰hÌà3)íä‘n„eSÅCÈ_‡d–H^bŒO{@L¿å…ÛJõÍŒo²x¨ÄE&Õ™9¥.§¸â$[‘fä Vc‹æ nŠWgkúBâ°÷~xW̹¸å‚ ¢kçVòº;²ì=J’ G)pÙÚnYé+QëO˜-·j%"LICY T`F.îÀ(:q²¨†A!‹šóñµ·› 6ä¼oó9àZ›áZæã4 3Ù x‰…Æ;¹ e³64íÞ;˼jÕyÚ_hûèX¿ZDub9ËŒ”-áÈlÏIÜjüËhÅãÝa;´¿¡¯wà@qç^¸aQçZª{ª¥ÂSsô¶¸\š¨ÌÂ<ºµš-c›ÁÉŒ¥îrWo'Eeìý´å.›¦?j;k˽ÍÔ)S4Â(¼\õ,/ç&ß³TÔ=&{nòäl$g#9 ¬±·œ¡$š‰WM"½Mëjp½úJ“Éòâ>Œˆ»:Ý¢qÈf[ ×…žOn„òºÇáÖ½®{Ãuµè” dTQÏ$ɈÀ ¬Q·Vô2Çÿ­kD{íÎì\„MÃÖצȻá+U=Ð]²e,ë—bl+uL5K4wS„L£½d£Û~>wÓ^r›×Ò†=üv.7«œ;϶™=›²çyýÓ´Mç>›I7†ËíßÒá·8¥ªg9v»M1›&v{í,/‹Üö×ýNnûUµEbÍ .sƒË¾Ì .4H£Áe«í,ErƒK—Uœ\:Ïsnpy=g¶OÊ .ãípnpYìîÖ“\ºv!7¸äNÖúž†XéwÑÚe¶íͽžôd2mײ‡µTרñ™rÝÄ=ÕMäFÞâSOLäl‘À`•ÍáŽB.¤JUðÔµœLÎe[‰e8=• p4èbàó%º‰EK ãQÕ@mÓ_c® !(Jº*QÇFK  9`÷ñ3éèõ%øƒõãpø}ÞéÞVÌ·§K·ê±Ÿ¤›‰3ùáÄ,çÙM)ÇØk»ö0Á=SåYš…¼?¥tøN²Ç2¤â,«äÿbÅ[*[Äͤ”X‰psTí鎋ʛyì·ùZ!<šÌēަåIËŠ»D8¡Ñ´…ï´p]Km=bÛ¾ÙöÄÜ® ]ŒÒE¢nB¨5¯yäzÒñâÔ;xÖ˜:ð.…E™Óu¡KfÐ]$&FëÎÖÔ ðJàJc)ÄöVëÞ"yµ‡KɶU'»VCöþ$M˜éi½löh²¢wÓÝw¼ã¾³‚0¤Ú¹v¸}¡w¶uêÖG6‘hÀ8ÐdúZì^‡äÞñ7¼Ç½zy€õ;!í®'Ô§MË8ÀçX@EÔ=PD{Eó‰æéÜBãž„¥cw¦,y6eØÙ•WJ›¡õ-Ç8ît½ë¶ý r_ ÀŸÎ-¦Ôàzâ—œ“ÍçJÿR.ÉÉ"¶Òº£»6•|‚“8ÜàuÛ½›•>Û”ªxÅ”%²BdŠMwÂTþžØ `’C-xG>Þ°ÙŒfˆ"|QܽÛn²‚1ÎîºgÊ®iÆÿ=~?Kb§ þ<÷ $y3%ÈÍÙŒ(Ô“—êxÃÍïÜÒS7æë!¨'¶ì*äõI_kŽ_<¹ ìjü¤k|­OÕ°´¸C“ŸRŸÐç˜935·Çn¥#G]wp°2±CéˆÝÕxÓà*,›&–¡ðhðîô)¯¥¿ˆ#° ÷ôýyƯ/"Ø]èÅjÎùèÅÚ cЩh»€ÌÚÀ‚Þðd!!ÜϹƒ¥!~~âXé’/;†°¬VæÔ‰©e> endobj 6564 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6565 0 obj [ ] endobj 6562 0 obj << /Length 6563 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË|а=ã90<@‹o6‹E¼Èdùû‘Z”º[ÒGµjŠ”ºW6¼3Ûj‹Åªb½X|ÿç¯ÿ8þë·ãûO_ÿsü~~úz…³¢ýslþ¾»ü@ù"ü~tÞ¿}?¼___êÿ¾Ú¾~úkýÛÿŽêø—úß/Çþ^øcøRó…ï']ýóß§Ÿ•“õo¢ÿÙ|þóáo8þÚ@ì† È\ÿÿ;í•u¦Acfè×C7MyúûÛ·_ï[,Å•V”F›£¬Œ:þ÷Ÿ‡Ÿê:𢨌”®4N¼e §ú‘TUC’f4Ðé/øÀU)Ó?aÎN©kœ£Ð o´ÔNYÓ,t³ÈÖ{Uÿîtøó¶yÕÀÑ\ ²Á'n|Bà'ÌÙ©Ò-8†Î)ÍV—@õ?~Á'^³|:à'ÌÙ©Ò-.†žZšshv¼O0¬I>ðJ%ÜN˜³S¥[p ½ðeø'ŽíëK¡ëôÇÉ‘•3VTþNYɲ[UÕQŠš{­c%ê ýMiRBopOµº8ÏêJcšQl=)}É>‹xfã)@¯UzBè îìtѪŠç]ÝJ%]Ý*%ýËÆJ·º îÉVgÕÌNÛ”š¹ŸDwºJ¦„ÞàžJ3Cଫë¥L¹º=ø$ô÷¥K ½Á=ÕêBଫ[ɤ6s> ý+—R3œpOµº8ïêVI5s>ý°)5à ÷d«;þe ŒIû ð¿F^üørxÿ¹vËkž*/?Õ¸Æl¼|?Ôrô® úzy|ùñøG!ôç?_~9TE©l‡bûD<Á'ÑéÐßYÂ'fù8ÒC * >¡Ð 2ŸOpŒµ‚O048Ÿu>ÌàöüR³}jŽUâ†5‘ðÉórZEx sy&ܶÌZ¯MÊÊaŠj £?f”ŒÚÀ˜Ã?‰Pj+Ìc-Ç”`W«ÊHyí»QŸ¸F­ÀF´CVúz¢R¥“ÞÙ â´Lî _‰}†‹` £Û*‡á’N½Ó  -´òòÖ'%ÄMµO¤,¬)¯gjOOt÷`ÄT‹žD¨ƒçÓ*;?"-‚r¯-S"óñCZÀåÁKLjˆ’¶Að1n£%…(µŒæ˜ËFô3ð«˜uxi>B cO8Âçi7-o¦RD$ðŒ)"ñŒÞ1Ïùv#mÊnÞК¢<‰X„ÝûMØßܽ=±»ã±Ó0EqtúÞÁ4€t›õòHmi3Kíî£Æ|TƒùS↡¯2yFµØÿ%ÌÎf”#ô.'’¼ó>¢¥:|‘̘ǰõ q\†0ŽË%s%g@áÞxe"ÒD±8°®ÁgnpFÓ CÃh€£©"§<9K‘ÿ[‚½ËšåŠhEÖ}{7”}ï‘ù@î#ñ2kRri>¬!4[f”³²_aL+l/À}&²&X±dP¢øJ†u…#‘BN'bµQ¢"˜/÷¬jÄÇÔ!i u n‘¬™-+¨‰#ÔÁ|Ÿ`h8[Ê«ù6,Y”Œ<_ta&§je‚ "+m!*}•ÃÈ•]#%3ærMi·z)õ€Œû”8ƒeËä710Ð6ÄŠÅóÐ~b­1 à; [ÛìA„gj°Nd«Å@¬¥Š0ÎÒµ¼'u—4Òã¦ô>¥æ’3½=ñбÇéiJâ:òA‘ȵQå÷燚Ïš²Šv"¼Ž×Š—'ÒÖWäL¹Û²+½Û˨ŞX'ºv9˨­÷³‹ ‘ðžkh#‚uÆ’ÛR¸Sl0QøKw¦Àånºï¦;¯é~ƒ4©r^ºÙ ¬oÀ§ìÊ%¶Ùƒ¢ûQ“ìûž×³øìGMRPÞ‰®%ÛQg;#g¯¯¿i^iëë×?£ñÉŽÕˆ,™=dA`DááÁ [tÔ…BØñÁBHï-¤ÖøŠ¡ŸÈ¼°ð¤ 1Eþx;“au‘‰²˜‰)k*O4µ¢¼yûÑuò".g`à“°NÐC=!z ©KЖE‡¹ó:Þ‚1Ó¸’7,O CgJ ð(j,vS A¢Ž¤²Ì[GJŒYŽpš…l¤ØdrNò®Œöœ&/ûEÚuî¹§èL÷C7ÄãòH­ªÞ ›ûa5îhð#Ió¦ËäÞï¡Î¦iç.'Û‘“ßסNïË»— J0´HŸK¨ús@‡±7á JZ#à£4ÞÉÕ™ G«ñSsº+a̼WËìÕ2§w’ºá¼—9Ë’V´ŒQ»h±ˆ¦ÆMℊŒƒ±†§ô(´Æg€#* Ÿ¼ÄÅóa "…àäPbH aõdË’9ÇùJV1RiÁ‹ǹ æÄ åü¥üâ)€!d ()]–§KjW’'Û+?2+2I7ÉŸÁ žY¢ÕNãå’†L¾]$‹|WUÛ©Z ^xó²¹Ê²Ö²"@XVŸB‹9e“!(çoØ@? 0XDÑb ¤—³,.¹LH[Ù‰ü<Å(¥yI¤‹Dáäε¿X­8Þ•™îvÑ,oYÛ/ÝŸ{Ëß\÷ ÈL< „*‹Pœ8’·)hpœ‰˜€²5§öŸœL1¬‹Tjù“»ŸxÒ;Ú¨2Ê•¿y¡cêxœ“U7Ð t ¬=…5œiP ‹Þ ºlÙL1o*øä®6††ßa‹Œ"Ô®Hdg»‘/NáñÈúÂU JmÝ Üá~ŸdˆU· âúŽÍ=n)RÌ”4‹¸i„CxC"…$"îO²ýSШîÑÛhMi`²½˜¥Û f™H©?f™´G¦"f:6G)·6ˆ ý°Þ©Áf•qŠ¡1ã ¥þ”PÌç6[‡žò¨’Rƒ.²dñ¨IÉÞÀÓHm=-WÁ˜J°P”‹öÅštA¼ ’š!¿}õYް’Ì›\†Íª¤e§» ­ÜH»?KÄËïÞù.b'.ðƒ2{IC¥Ú=ÅÕ›dó@(fÁ›Xrž2S1íƒ(sS†Õo)Ò TPÊ¡±Z¤¤'XU)‡‡ÄPÅQòî_Nn3„ܪ®KPDãï|3S,AE nõyš9Sp@(œš=Þó!×`º»œÊëßb½e{›TNð„æ£±&Àït•îzÈ!øÉj ŸS—QRøŽW[Q¼B,áôߢK–:GJ¤B>…ï(õTK<@\‚CFÓT¿4v°Óíº|×åoÕå£:·!\R?/ÞŽ4{–Ç,ÜÝñè8nNš+n÷†&¨)Ý?©ü`WÜ@¹ïå?Xd(¶g¼1+d‚oº\a¸Ë“ö<<ð‚¬ûŠÊ”R¦a´=ƲÛåKìò„¬®BBñÌë˜#zþ>Eðîuˆ’N¹!vž‹²iKgÖ/‡Ë#¥ÿ7ÁÕ 䘪 éÆŒÈÛT˜BHJï,È)(K•¾.o@·o&K°‡»³jç5•ž‹Ÿ§Œpz9ØÅp7{ÞšmŠ'Å\V•¸öð÷{´‚ÒÜn‰W´z ‘ð e„æá’oÔä.ºì'7òܸÇCEI#©U9Ø}sµÇ œI¤h ÊÝ$Å$¾v.3Ÿ!̧sﻼåd¤­ŒWófÆrvÌ­x´ î§)"y 5VCÕ‰¨K²ùXµ7)Ü–«EÁŠ^íÈ$ïn>–]JçN—r*`I»7Ž´ø²Df?« l,ŠÄ­^¼Cé7²¼èš9Þ ?Ë9©üiFçËá†G1 Fˆ8p¡¥>‰¹!¥>"—¯B¹ÅrTJ9îù––”™ú4p6Ï“Õd~>Èë‡ -ÅD1j®õ„ž„ ØBZ[}€Ðà8h!W0ñNwU±.ÚôÂhU'ÞÁÐd×&PŸ¤Â箽°A¶"4ƒs…-<Æ:ôçR£¬H×Flbimá;%œ)¤Æ@Á'‘™†bd[´ õâ'Ö­Od>ð®Áߢ5Åòƒ×玓bªíä@Ÿtù½1'ãõíZÿ-yB‘?™é²­R‰®ânò?®ÉŸ¸[ý’Ì2ÁùÈÖ T6|q3 ³4òi]+Ÿ¦o–¾–¤¹ba‹CdM½6'Ürnø¡ò¼o+Ó¤8¢o8ÞsgÕ›vú)…Ž„”U„Ö£‚ØFrV—r¬.em–5ZÏ©¢áûù]øZ%J훟NÊöS[âŠÓD÷É·ZG–…”•òþü-{ Æ^Ó¼>Í‹Ç!1¦}é™ú[¶Ìõl¾~>|;‘JÛ6ÞT.©¥›öÎCéÍ`Q—]/(†Ð‚G»èªk‰¯HN^Ú J9 Ô–+<ïëÀ3¶³ðVŸ«o,ÅmÙò…† J p‰¥x‹·LRK91ˆ´¶âÍvÑÍ´[G)ÄP!ÂÛ‘#Ên* Þt,àEºoðõ!¹ÿëÜ€R¸_Ù´EÇ}‰¸l¯+Ѻo_o¸•ð†[¼Ü/7¼Wà˰![en¹¹ì|7Ê|¶o{-š)Æ@a~ƒ¸…¸ú2U9SÓ`2Ï€1íåµ#¦½špÄtmž_{HÍ'CG¬ý–½c/‡é1íÅ„#Ö\_4¦þd舾Õa+.±ó0k:bÚ»ûwÄΓ¸‘OénY9¤ká"¸wéõÜgÉéÞª­ˆ¸ 5NEà™RÎÍá(v¦—²ðž„%åÛX\fµ‡éŽ[ihDl l BEqrö‰†ÖŽáµzW·,ñ|v(-¤›93ÙJùXS•9Ø8~&{1äúùØ32&óLOñމ3fk%ñXL¬ zÏ3¯˜g^ÿÜ^äŒË1ŠÈåêDð*²Ø1Ò´›‰5Õ¬#±µBØÃIa\‚A±pp$[l[¶ŠðL5Ž·á¨´g)A{R¤ÎT'¿&:XÖûYÙ9%¸z^‚Œ¯ïŸGWòJß+[‘Éw8¹ßáŒÌ£øØ&¥T®S$³vrXÐyjw›v·iw›v·)ê6ἪÕu^ÕÕ{Á8¯ê¤$<›O†yÕö[öŒ½¦Ï«:á'òªN¸á0õ'üêé[úþ2¯zfͼª“½-Jiº«z¦Ê=Ö.î¸[ü}•ŽÞå>Kº_‡rƒÌöÎ÷gÍç¹²/Íßã`/ÐÎÞ™*X™6’=—øòàÖڨ͢[õ‡ŸDèýŒ$²®p>!?õ8NßžvôN„nr#…ƒá;Á§[6S(]XîäœGµìHk]A%pbd0­Gê0¯2Â53oRSNè"lq·é+ §Ž?…Í~n£?~9üžR9Ü endstream endobj 6563 0 obj 4402 endobj 6567 0 obj [395 /XYZ 32.2500000 528.500000 0] endobj 6568 0 obj [395 /XYZ 31.5000000 474.500000 0] endobj 6569 0 obj [395 /XYZ 32.2500000 473 0] endobj 6570 0 obj [395 /XYZ 31.5000000 663.500000 0] endobj 6571 0 obj [395 /XYZ 32.2500000 95.7500000 0] endobj 6572 0 obj [395 /XYZ 31.5000000 96.5000000 0] endobj 6573 0 obj [395 /XYZ 38.2500000 785 0] endobj 6574 0 obj [395 /XYZ 31.5000000 663.500000 0] endobj 6575 0 obj [395 /XYZ 31.5000000 529.250000 0] endobj 6576 0 obj [395 /XYZ 38.2500000 785 0] endobj 6577 0 obj << /Type /Annot /Subtype /Link /Rect [60 627.500000 73.5000000 634.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn2 >> endobj 6578 0 obj << /Type /Annot /Subtype /Link /Rect [60 620.750000 110.250000 627.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn3 >> endobj 6579 0 obj << /Type /Annot /Subtype /Link /Rect [60 613.250000 127.500000 620 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn4 >> endobj 6580 0 obj << /Type /Annot /Subtype /Link /Rect [60 606.500000 98.2500000 613.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn5 >> endobj 6581 0 obj << /Type /Annot /Subtype /Link /Rect [60 599 120 605.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_language_conventions >> endobj 6582 0 obj << /Type /Annot /Subtype /Link /Rect [60 592.250000 92.2500000 599 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn6 >> endobj 6583 0 obj << /Type /Annot /Subtype /Link /Rect [87 584.750000 113.250000 591.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_class_examples >> endobj 6584 0 obj << /Type /Annot /Subtype /Link /Rect [60 578 96.7500000 584.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn7 >> endobj 6585 0 obj << /Type /Annot /Subtype /Link /Rect [309 557 355.500000 563.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.r-project.org/) >> >> endobj 6586 0 obj << /Type /Annot /Subtype /Link /Rect [323.250000 536.750000 351 543.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://http//www.simpleitk.org/) >> >> endobj 6566 0 obj << /Type /Page /Parent 2 0 R /Contents 6587 0 R /Resources 6589 0 R /Annots 6590 0 R /MediaBox [0 0 595 842] >> endobj 6589 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 6590 0 obj [ 6577 0 R 6578 0 R 6579 0 R 6580 0 R 6581 0 R 6582 0 R 6583 0 R 6584 0 R 6585 0 R 6586 0 R ] endobj 6587 0 obj << /Length 6588 0 R /Filter /FlateDecode >> stream xœí]Y¯ã8v~÷¯ÐsíQ P·–yPèòä!¨™Ic¤2ùûÑBÙ¥)Ù×ÓHnY I‘g_ûçßÿ³ø¯¿}üýŠïîïÇßOå¹®ÊáE÷ß¯Ó ÒžÝ¿‹ÚVÅ÷§ŸÅÏÓ×Ó×öÿÿ< /üþñ_Ûý_!‹iÿïoÅ¿ÿG{ñÏî¡î§ZÔíßÿîÿ6µhÿU^þv×ÿ8ýÛ/Åß»ÇéÜbæ¿UVUº_Æ©žÆÏýÿøþ÷ÓoÃÄÍR›ºlÊBh¥ ÑhYüï_Nm'‡ï^)k«á¿‰“ÛnrÕ´Ë×ÂûÍ,òÏ,w›¹–œ[-´¬Vfþ3u™W’S’….–x4<|ÏæêZresï¸Ý>½2öÛW^·Oºíå°4ULªZz÷û£œ™1éÎÌûHgfÌô̺_tf)ðl Žq`Íðɺ=¯f\äc ]ïÇÏNmü•÷àÎÖ¸ÿÁ߃*¶4PlK;sS©À̲ÖUÙXøoâÌ-ׯ–eSÙt”˜½Ñ—R!Ãà-0¥¼[9÷¦eDpðÔ§Ý. ái_FOq Rˆtƒ÷+OuÚpðÔ§-[(Ýi_FOq JÙ„ Ô­<ÕiÃÁSŸ¶NJÉuJJ®SRr’’ÃÁSŸvUUÖ5U‚=»Œžâ@ŒNJýʹ7eZ‰ÏGÂ;ŸÑb;AgПÜY; ž@Î'é4Lùªþ@Š0d±*G°nk±x4lEy۬ߖl,èÉ­F_%v–ÌŠ|â;NàÝd*¨‘üIY hŽŒ}G èðPœ’Z/³Ñzݼ¨ó³QçꃣeÊÝòßIIXmé–q_].¨$>Ve ˜Å é ¯- æ¾eCNco®;°(;uÛ"ëV’57büDl9$H¡‡ÖRðª³s–y9VÌ2-Še 6«æM¬¼|…j³H†@RÓ%ô‹@\W=¬mÅd”äà3PŠëù„kL`H¹~Án”â ŃA¾T•<®æ~h½ˆ×ÖW0ŽPF[,–uÏ#8"FÞ‘žÕ·ñŠv]xŠ[RÑ[&%š’ýŒ!eÇJ6ÓrBÈÚ¦Âujç$]º5Ñ€˜®|€” SQ&1ì,ÑyïFLLN(‘¼8ä“B(É(¸¤¬&>óò¦€´¼=è”ð¬6cJ$.Ï FdõPàœÍ&BŠ ¥ˆ’ñʤ¼ Š´IùÓ›J¥<¦{IÍ%ÝN~)–oú+c 8{(q.Öññ—RÀûÙ·¬eQîÇ›BeÛ[-ÞhƱ‚%%3­ü“§°ŠüKR 8ìn1v>B²*s²¢ F’§’\x`CC¶Ìݽ2¬­7D 0["|•}ËlxHÕ$À×,¤ç¹ÆÔÏ} ñ4Š>4lÄ%"EÉÉËcÓgÕDH#ÅnyàÈcŠ!Bš!©)u\XlÒš‚%HRÄÊ'.Nd %×8ÑP‘EëK¶¦«ÚVŸëfN]ðSåAÜ”b W÷wP•gYª¹ z ¤omXÁXémå{\¥·fAGÇ:xË;x5‘¶gË3ìkN¶³‰.G¸øqù-ÏÖ–E]vj!ìpU¦«CŽW¾ŸŒ= ÑHkÅå©z:Êøk˜£}Þý.»×ŠùÛºi¼9º+ßOó•tׯ•£Ì¿ãûéÓÛ/³=‹=ÛàZl—°\å…ª¬GÄ„ùòÄÄÔÎS CµzØ ëUÈrzaÖ5ƒ.²œƒK‹k+à"•.핸tOÕÓQÆ_å\ZÌX‚KWÝÉ›£½âƒKwÍ­Ô2ÿŽÁåšÆ[!)k7ÒX³beI¬‚ )Vgµ»àåê\ú5a”Jù‡]²v8 E3½p?v©fŽ]º\Ã.-}Èo¯,°«{ªžŽâ~¹9.Ø¥ìv©ÚŸ£½²À®öÚ¸r;Ů˻b—®Fb¬ ¸P,¿: %Ô‡R<.W¼# bm`”àB½ÊVÂ/’k3R3»p?…©ìœÂTÍ…1ÂÇþöÊ‚ÂtOÕÓQÆ_vNaªzÂTÆŸ£½² 0íµq¥õ”Â\æØ•Â=g!BŽ´((J5XJ`3¥ÌöÀ6%â0ÅT£¤kÍôÂý˜R×sL©í¦tP?‡b[.1åŠn”ñW=ǔڬaJ]ùs´W˜Ò^Wj¦˜r™cWL±†+“„GBaSXR„œøÀèR';ZóbÙœÕ#›Ó³ ÷#ocæÈÛÔkÈ»°8T½ÅÁC¿î©z:ÊøËÌ‘·©Ö·YXN½DÞöÚ¸Òjм—9öD^SŽa“枌¥Æâj‹BøNŒÕ”"x.4ç謪­lJ5²¡ZL/t„סPmÄ…LkBK(ÃUÛ5è«ú¹+ßÛ—Jt—§T3füY9xº\Ð=¸ù¨Å4ªŸf¾˜î)=FϧùÃÃäP+ª¡& ‘—ú8£ùÃfó©†9);—â`¯£Ä r¤ÞÆ4„à%Û'fÉ#Y;2¹-H‚%²dÿˆ?ÊŽ.T]¼XB¦w`b %(Û7ä“Ók<Öð‡Áo;@…‚ÝK"¹ûIÜH›5ËNEÀ$%¸ø&ˆãÉ¡—ÔÚz$!Ð)‰p'@î IÀby{wiIPÌ·Çí>B'½JXP#êN´?ÐÑúik5½°‡JÔ-ae|Q†7Ô°Z]ÀŠRˆ/“:@ )Â!;›$ú±¨¢¼ý*yé/˜m‰î¸|´ôÖN«o'“2d25Ù¯£g®PéL¥csÑÅ÷ÜZ€Õc–«òíþJ^®ÀÂ\IcM@w!È›K ›°‘zÒ‘†˜Ônúàx[ùÂãoWªÔLSÉm­‹¡’P¿1îÊ÷“ÑÓ´ôþ)5EMçhŸw¿]ÁÓùÛ¦ñç0}ù‘ùJº§ìl;Ÿ£OjO÷­ãÛõ(ú`[7…ªÐ¯F‰7¦ ûæUHIjàñzŽÐÀKÑ1Ö$ÎjZjŒk †Ö@’PHÑLq›Âz;§Â@u<é-"ú?°$B„7%WöŽxñ”õF{¬0Wó¦#{I„íÕ;T”F.u‘£^I{#l &E´ê ^¾ðGÀÓö«–¾ÞæÓ¢%hGÔé¡ÔÈ›˜éïÓß›r®¿7bMo”¯[7j©¿wO©Ù(j:ÇE·Íšþn­?‡µKý½{ÊÎF±ó92èïÍØg3ß}Äåêù€H‘躿L”ÂížÞ‰Õè±b9³ë|:±tbWÖ¦à  { ;¾kûˆÖ†ß{?­¬»Þ>ǯm ‘2>A–òltY>—[E§fCÎéרKH Vý÷Ê¥yµ¿)¹ã—)–GW  Y[J’:bV³ˆÜß. ’J…åM˜z9¨ª?X¶¦ÔÑ£¤í RöR ãDJ“`¥=÷û×ï@™6%Á!¹x}S¼.¶ý u¦ª/ûçàï¿×¤LÈÝŒ\ØÏ+J²ž“ð²7èLDhQ¢$˜ªc#¶¼GZ§' *Ûò(Öî4ðÎtÇqú•;ßÖFƒwðh®ZÂwË_»ó ÞQðΗøµ•õ½ÎæÒÄîÞyÏ^Á¯Óo„.Ñ ÞÑÊ7^»S½è1Äâwð÷àUC‘Ö<Û)Ü܃äæ3+Ä¥Gt¦<º˜¾u¼!ù‹ø"BÊäÐÄÿÀ—ObËù’+R$—)1I\F)D˜f&‡”M1_ªàhøN.é80E{H>û˜ÒN`4xçÙNîZ’°ö¥%]ï¼´¤Ý8øÉ%Ù·ôÚ˜Ôcs…MÒ”ŒÈL~Ú;z1ÅHðxŒ""<"4‚/!qOæJkÏæhã(ôøò¼­lä‘ë<½Ü¸V2=^x€p\Öb…û;¼A a–ÎÚ®ñéÎ#“„¨‚6¤†!”®ò87)¢o¥ó›Œ@–ŸCiXºW4t.€Äý?÷ì¦Õ83Ó•ãÚ““I› hÌq¡¬ýˆ(DI}ßßÛøb"KªKjÅËßùHáÃÓ‚L÷QÝÛæ}yÍ_|¹_îÇîÎËðr#÷-§ûQ‰Koó—û‘ä~|Q¡ ,c®÷nvçE£õäÔÕ«ê ÞË͹[‹…—õå_ ¯à!ÍÝûûub*P‚EX‘׿¸¥ˆ\U9R„«'õãJÑå „'õlÄõKXáè1S HUJ^T÷i©î“ÄDÔ¨ E`ˆ¡x!xñ‰â@à¥À]Ä-|Û»'ñÈ$­È)|¥2›G¢¼²T%"ÔNd&ûU\)—ŽJIÌØH c)ÈOÑ@pC'V •¢óÄ åͺÍ`”»ÖÚŠ€IÖ\]žV­8@‰Ž"•§d®•ìЙºEšØ½êÁKb¦áî~jÑ“*Ò0ŸðšV š;EÐia] „[çi$žó)ŽÏù¤S@—Ū+\Æ–¤Ö_àÚ*¸6,˜†+€kËø¨¢&à+ðñQC3^A5zrÇ|Ô—ê”‡Âø´ Œ1$ÂUK8šÆ´óÉ c þ|'°o7_á´¯pZ*o{¶ïyN^Þf\¹‚êOñ¨Ød„mo³|@‹]ì,KqlÊ¡˜ö·¹³”sÁmÿ0€À#]ZŠxcX±1#¢™‰¿m$0¥Û<Å+|Àþðûþv’|˜ŽÄ)#<µô8àC¥¨ÖvoÉ´ÿ~ÓºñžØ5a(Çr€.锂¬e2^µžþ?/ÅÀÏ[^pÏÒ@¢¬|KéD8FÖˆA’žËQ@j7Õ‡Äÿ·ûªIŠÅ;Ëâ8ÝÜîÎB‡$±¯\™jtÌ`ScÁŠWÞÙàÌuYÜ{Õµ­6ýb·YÀÎKhÇŽ lÊÆ«VrÀdŽ¿»u Ñ¯íÙ\ø{Áñ‡¡ ;§ð†wŸ)†Q|»hà)H¼×¼xŠw:|ÁÑL‚^x $ØÁŽYü=(Á\À®n˜²¾Mí ”KüÚL¾hg›àÚnÂXH’ææ ãý ¼#ðB I˜òàUã ŸÁï`ø—0Œ„ïìohÆ Ûs;Ⲹÿ(©_x”JêN`±_ÎDIOÇïèá5kóGøN…Þ!Ù»3åÄØ‡Ó–Z'%lïž"°#pt #oz GG¡:à)Ȩ”ž%&%%C²Ç‘œB#ªsÙ¨ù'À(®”,nÊVM2•ltÌÉ”ô~Ї7"ô,Sݼ#»‰Ÿ%¦)":2m%4S¤§ý[¿%îXó1ÚÞásÉ}е7 s_^?> endobj 6602 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6603 0 obj [ ] endobj 6600 0 obj << /Length 6601 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWð¼€iöƒdxüCÃrr¼Ù,ÙEœ=äï‡I͈ä×R*)lìÎX­~UU׫«ªßþéË?²ýž½}ÿå?Ù·þçû/»"¯Ë¢û“íÿ¾yù yÿ{V‡2ûöëî{ö}÷y÷¹ýÿ÷]×áËû¿´¿ý/³ÙŸÛÿ~Éþö÷öÃû/í¿ðë®6uûó߇ŸMmÚߊãÏýç?ïþúCöÛ~Äaº~1§ÿ~ã‚/Mµ_Æ™©¿ï†mšÃßß¿ý¶{Û m–ºj g3ãÏLãmößî~j'†/òÆSW¾.®™¨¶‡™ÚÛ´°™Îsø+3ºY`pSÔË ~X¹4PŒ«LtðX‰d„d‚ɨ}"6å䫌"u9§ÔÊp$ˆ ŠÂ•‡×ÇG8Ÿì¥Ùã b@bó…Ìú9æhÌ7Zk‡)ûë —;j¸á–~UÞ«“MÏõi`Ÿ¸&ä“˼¶îÄŸÒgø@Rx®OW ÷ÓÌ­í µàyúó?·‚÷hÕ}èònT[ÕÚjå†í*2«&XÁó\.A¹\Ú‹Þhùª¨Û&BE¾ôQÏD]äŒá±YE/¢ÕŸ`žñ 8ìÞÄ}†€17q|ÂÊWr9É0·ÐØß–²¤¥yh1–k‘HFB`ež¸ôöP&¼Ìýçêg˜ %  xLPTL¥±Ö±§"/.÷*ÉN2œŽ!LÖŒpL â 3¾s­ÓÉøèñÚ&àŠðWF“Û= î[&`j ÝoAÁjÚc7’¬·å”•¥ÛóäC·EÔŽwãÓ ågrfHA”õ3Yû`¿L©ï öÿ@?“ŨéóDFÃÐÁ5èŠx à z gn4Â?×ó´:o¸öt«îÓ¡–÷¹êýKÖ³¬$JÔ4¥„Û¤-ƒ +Ì d\¢î„„ $˜ŒL÷ZÆCŸ²™t‰Òì°õå0'4¬¥ý@«G#Qaö Óãû!á,ö‚ŸÅZù„VSi´SÆ8×7x?ÔÚd#þ—u©å¥l9â_6‹ßaÏ1¨ŽwJ¸\oÒh¥¤2£¬vòêD ²0XÖÁ56§‰¤÷öé Æò^_„a‹²^"š¨²©'–[¯ŸæÐë‚ÆÇ‰åÁ~¦&½%â}Ñò}øÒj.ÿçÕÜ“RÑ0kYõTä„'86êÅlX ŠhuÄÚ&q¹)Pb™Ed”d#v™ëL]eƒo¦ÚsÃ9Ñ.°‹{T(ßñB-{'ì]:ÅMO9‘’9R²ùuËêè‚N°f…VDC}OQDÊz¤BzDÏÆúµŒÊlQ¹§LRò²wLŒ7a59ÇÈSYG²<åÆâsš¦ÉQÆã¡uBñ¤V&'›<ÉØ˜‡ Ã@7XX@˵¶óm&þSq}cÝ/á„3hšÏpÿ°¸ÝÓûßj{þü¬ž·H]-¿Ñ’w,FÖ)†Í(.›ã‚¸®gjë16 c:Êú™l¼­:e1„›k•.K9@LÙ Yã+ß"™(ßVÂèj^Ù'dˆU$gväøË*˜ &•KàbWK`§‚gnIxŠæ]*VpnÙá¥hJJèüФܸt˪8›¼Ú7UQ CÔC µìDÁ-,að8áH€‹¹•ÙX–ÚR@ã_Èç•PWàNJ¨9© q*3ŠR4¥Þ­þ‘Ç ±Ø¢BP$€O‹å27ùjÙ»ZæXÂó¯Dx&VõŒ‡!!Çñã3ëüí™)š)Slõ£=kkŠ|?ӯǛ<„"«ªýÚ˜þS—Ue~ØHûåþ“o»ÊçÆ46sü–;Žœ£ý~÷ïÐì»e£Þ!Œçh?iûœ®dÿ­p2J8ãçÝÓ ‰ƒÐ‹ƒfP)ñ£¸)WRk‰gÙ´2ÊëË0VÆi±Á&&€ ý–¨È(³¾{ù¦Þ¬±h™§9×å¹ý²ÀOÀÊÀÒõK˜K^ÅWÕHòaV$›A¡öbO‚o\”#,,¯_ÚÈW)ŠUÑœ(Š•)fÅÊØ‘·ÿd¬(¾åNFq/çŪ3ŠbUÔã9ÚOÆŠâá[ád”p:ÇòŠbu,ëú`Ë™0LBC Ä¤ìq‘­‘ðô ½I4Ó·¤\ˆ®¥W/º°AÕX»'^½R ÇCÅ[JÅ“-¢·ªfÜH¨h%ALŽŒ¸VèWJ‰ü _ÇÉÈÈOìREcMã7D2$-â#úŸÊo1e݆SeÝ6sʺ3cEºýd¢¬ï¿åNFq/ç8*ë¶žSÖm5ž£ýd¢¬ï¿NF §s((ënx7Yë’¯ÄtF(Þ”ò'â$«÷J< ¸Zá­bn›öº3–ÄD¸\Sg51pƒõõ)ƒõaŽÁ¶è1¿²˜2ØòÈR‡QÜË9Ž ÖWs Ö—ã9ÚO& vÿ­p2J8CÁ>Yé¯Í¦ÞÊÄ$ô¹ˆÃQô]Óµb2Ûó<ìâ¥ìâ{ ¢~Ü6JåÍå%½.åXxa­©c…_åMxæmᮿ¥—cîÎ\.À7d­Ê;s¼mw¯]5SÕtRŶôÒ¢ÌíÄ_P¥÷éSÌçú4¨ë`jìD¡vî¶ô2Õ€¼çýô}L^ŽjÆôúÄÌÚ Q­zýµâ·qí<™Ôd__Ýð«âPå4ô+¥Þ‹Ô´ˆ¨§JÛxÞ|g0Þ€9ÔeÇ‚?=!MÞñ©)›kù[BzKÏ%æZ>À– Îc` Ü)¼¼Ÿ¾ © †Cq¬’ïàîÞ§ÃÊa cª°½"¬¬=O‹°ÃÊ`XaˆàyðiÀx„8±x‚æñévbúÎx|~ Ò¼}‚+ŻÜá)š”]77@ÙÒ¯•BzqÜTù|®À0E[ÈCªÀç12Ç垘Æùjcê+èʼn94.XiY^³RŒ!L¥¸SÁ )½KT·gä#¦yUú}öt1œð&­[•hõÞW–h¯çÔY¬a>†wŠ÷ƒ­ý p„zk¬­5ݤþéÅáM<–×àDO3iW®ÒÓïL©ùLˆ´uùhŠk´ñ‡||ÈÇ hì¹€ÜC>Rò‘â<šöWYÊŠ’ÓTþtÖE!½U¯ k‡ªVÂÄãÒ9ºSô£Uîú¦"ˆ/ÏjdJƒ­{®U$Sï²¾å9Ç7ã°ºÕíLcâøÚ»Þ_‰âÔ®éZ 7æ,†±ÁýÀ0‡aצ‰{gŽ{x'jàðeT`&°'¢ìã`å‡âàѰQ!ö ë¸·ÍÙs9»…§á.Ôuàë§›¯Óáëñ9ÁWìA€ vWÕg©KÍP¬B¥L ½tQÙ/Je>rÓŽ?œX¯Í{ðhKï¶(º©¼?^ÝÚQdD¨£…múœ0ó`yòN‘*ªk,âWÇïV´=>›ØrÁØ‘ô¢jºJT¥\Ÿ'1¯¡mš‰JºHT#›dŸ´âÍNc©—Ÿ÷M‘ÄÞùZÚ¢¨ŠcX.ã_‚VHÄ.ÃV—%l9ËÜ&âp6xWÊø¨û?bm89+‚9¦P“FxS´ð£\Bç¤ÛᶬÀ'ƒ >)i}ZŽÄ>@Dâx+bJ[&Jû1%i#Òç‹Áµ©Ù϶íì½q|- u^èZ¿()Æ=†/á]£,sìC&N UT‰àÞg) CT…ÆÂUEI·Ür›v#r“)[,‘Óñ–ÜÙ½î½yÿ5¥VpÚE¯ÙDéÎmŠÒ¦p– n‘•Â8gÅ+æB…«Êj?ô¹Ø dJÖ?ìÚ‡ñJ;p»z}íÏbøF[î,:%¹°t$Z¶^7\÷¼À£%r2´,E(V…úõçÔî‹Ì6êD´ѲÑj§N“æË9iÿfßÛᣳ>÷… ²ÃÜÒœqyaö¥€³cåŸ^³žKzí$q=“BÕÝ=ÚÜÒõ§2ºš¶ôP°y5~nØv+˜Ë+û€æé1‰çÖö©ßé¤rŸ67Zÿùó’ ¸XÓo}²Á^Ù™¾†-mÃàÑ`Ÿ>Ð$m½~&[–àö¿·+ a‡[0 `²‰$O G¸ÏGDì{½;‡#¸Ÿ¾´4ΙL›SÉø8s=qÔ…Ë{Ær•8»—…ÎrÏÏÙçÝÿ™Ý endstream endobj 6601 0 obj 4392 endobj 6605 0 obj [397 /XYZ 31.5000000 722 0] endobj 6606 0 obj [397 /XYZ 31.5000000 502.250000 0] endobj 6607 0 obj [397 /XYZ 31.5000000 502.250000 0] endobj 6608 0 obj [397 /XYZ 32.2500000 720.500000 0] endobj 6609 0 obj << /Type /Annot /Subtype /Link /Rect [60 466.250000 94.5000000 473 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn2 >> endobj 6610 0 obj << /Type /Annot /Subtype /Link /Rect [87 458.750000 126.750000 465.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn3 >> endobj 6611 0 obj << /Type /Annot /Subtype /Link /Rect [87 452 161.250000 458.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn4 >> endobj 6612 0 obj << /Type /Annot /Subtype /Link /Rect [87 444.500000 163.500000 451.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn5 >> endobj 6613 0 obj << /Type /Annot /Subtype /Link /Rect [87 437.750000 136.500000 444.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn6 >> endobj 6614 0 obj << /Type /Annot /Subtype /Link /Rect [87 430.250000 120 437 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn7 >> endobj 6615 0 obj << /Type /Annot /Subtype /Link /Rect [87 423.500000 167.250000 430.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn8 >> endobj 6616 0 obj << /Type /Annot /Subtype /Link /Rect [60 416 188.250000 422.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn9 >> endobj 6617 0 obj << /Type /Annot /Subtype /Link /Rect [87 409.250000 187.500000 416 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn10 >> endobj 6618 0 obj << /Type /Annot /Subtype /Link /Rect [60 401.750000 136.500000 408.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn11 >> endobj 6619 0 obj << /Type /Annot /Subtype /Link /Rect [87 395 109.500000 401.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn12 >> endobj 6620 0 obj << /Type /Annot /Subtype /Link /Rect [87 387.500000 112.500000 394.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn13 >> endobj 6621 0 obj << /Type /Annot /Subtype /Link /Rect [87 380.750000 129.750000 387.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn14 >> endobj 6622 0 obj << /Type /Annot /Subtype /Link /Rect [87 373.250000 114 380 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn15 >> endobj 6623 0 obj << /Type /Annot /Subtype /Link /Rect [87 366.500000 108.750000 373.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn16 >> endobj 6624 0 obj << /Type /Annot /Subtype /Link /Rect [87 359 114 365.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn17 >> endobj 6625 0 obj << /Type /Annot /Subtype /Link /Rect [87 352.250000 119.250000 359 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn18 >> endobj 6626 0 obj << /Type /Annot /Subtype /Link /Rect [87 344.750000 129 351.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn19 >> endobj 6627 0 obj << /Type /Annot /Subtype /Link /Rect [87 338 158.250000 344.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn20 >> endobj 6628 0 obj << /Type /Annot /Subtype /Link /Rect [87 330.500000 126 337.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn21 >> endobj 6629 0 obj << /Type /Annot /Subtype /Link /Rect [87 323.750000 133.500000 330.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn22 >> endobj 6630 0 obj << /Type /Annot /Subtype /Link /Rect [87 316.250000 125.250000 323 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23 >> endobj 6631 0 obj << /Type /Annot /Subtype /Link /Rect [87 309.500000 186.750000 316.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23_1 >> endobj 6632 0 obj << /Type /Annot /Subtype /Link /Rect [87 302 135 308.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_STL_Functors >> endobj 6633 0 obj << /Type /Annot /Subtype /Link /Rect [87 295.250000 134.250000 302 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_Iterators >> endobj 6634 0 obj << /Type /Annot /Subtype /Link /Rect [87 287.750000 139.500000 294.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn24 >> endobj 6635 0 obj << /Type /Annot /Subtype /Link /Rect [114 281 192.750000 287.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_shared_ptr >> endobj 6636 0 obj << /Type /Annot /Subtype /Link /Rect [114 273.500000 176.250000 280.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_generic >> endobj 6637 0 obj << /Type /Annot /Subtype /Link /Rect [87 266.750000 170.250000 273.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn25 >> endobj 6638 0 obj << /Type /Annot /Subtype /Link /Rect [114 259.250000 165 266 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn26 >> endobj 6639 0 obj << /Type /Annot /Subtype /Link /Rect [60 252.500000 80.2500000 259.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn27 >> endobj 6640 0 obj << /Type /Annot /Subtype /Link /Rect [87 245 129.750000 251.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn28 >> endobj 6641 0 obj << /Type /Annot /Subtype /Link /Rect [87 238.250000 136.500000 245 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn29 >> endobj 6642 0 obj << /Type /Annot /Subtype /Link /Rect [87 230.750000 125.250000 237.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn30 >> endobj 6643 0 obj << /Type /Annot /Subtype /Link /Rect [87 224 138.750000 230.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn31 >> endobj 6644 0 obj << /Type /Annot /Subtype /Link /Rect [60 216.500000 135 223.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn32 >> endobj 6645 0 obj << /Type /Annot /Subtype /Link /Rect [60 209.750000 110.250000 216.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn33 >> endobj 6646 0 obj << /Type /Annot /Subtype /Link /Rect [87 202.250000 168.750000 209 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34 >> endobj 6647 0 obj << /Type /Annot /Subtype /Link /Rect [87 195.500000 144.750000 202.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34_2 >> endobj 6648 0 obj << /Type /Annot /Subtype /Link /Rect [87 188 136.500000 194.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn35 >> endobj 6649 0 obj << /Type /Annot /Subtype /Link /Rect [87 181.250000 134.250000 188 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn36 >> endobj 6650 0 obj << /Type /Annot /Subtype /Link /Rect [60 173.750000 87.7500000 180.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn37 >> endobj 6651 0 obj << /Type /Annot /Subtype /Link /Rect [87 167 139.500000 173.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn38 >> endobj 6652 0 obj << /Type /Annot /Subtype /Link /Rect [87 159.500000 129.750000 166.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Typemap_scope >> endobj 6653 0 obj << /Type /Annot /Subtype /Link /Rect [87 152.750000 138 159.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Copying_a_typemap >> endobj 6654 0 obj << /Type /Annot /Subtype /Link /Rect [87 145.250000 138 152 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Deleting_a_typemap >> endobj 6655 0 obj << /Type /Annot /Subtype /Link /Rect [87 138.500000 149.250000 145.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Placement_of_typemaps >> endobj 6656 0 obj << /Type /Annot /Subtype /Link /Rect [87 131 128.250000 137.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn39 >> endobj 6657 0 obj << /Type /Annot /Subtype /Link /Rect [114 124.250000 147 131 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_in_typemap >> endobj 6658 0 obj << /Type /Annot /Subtype /Link /Rect [114 116.750000 169.500000 123.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_typecheck_typemap >> endobj 6659 0 obj << /Type /Annot /Subtype /Link /Rect [114 110 150.750000 116.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_out_typemap >> endobj 6660 0 obj << /Type /Annot /Subtype /Link /Rect [114 102.500000 159 109.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_arginit_typemap >> endobj 6661 0 obj << /Type /Annot /Subtype /Link /Rect [114 95.7500000 160.500000 102.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_default_typemap >> endobj 6662 0 obj << /Type /Annot /Subtype /Link /Rect [114 88.2500000 158.250000 95 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_check_typemap >> endobj 6663 0 obj << /Type /Annot /Subtype /Link /Rect [114 81.5000000 159.750000 88.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_argout_typemap_ >> endobj 6664 0 obj << /Type /Annot /Subtype /Link /Rect [114 74 161.250000 80.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_freearg_typemap_ >> endobj 6665 0 obj << /Type /Annot /Subtype /Link /Rect [114 67.2500000 163.500000 74 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_newfree_typemap >> endobj 6666 0 obj << /Type /Annot /Subtype /Link /Rect [114 59.7500000 168.750000 66.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_memberin_typemap >> endobj 6604 0 obj << /Type /Page /Parent 2 0 R /Contents 6667 0 R /Resources 6669 0 R /Annots 6670 0 R /MediaBox [0 0 595 842] >> endobj 6669 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6670 0 obj [ 6609 0 R 6610 0 R 6611 0 R 6612 0 R 6613 0 R 6614 0 R 6615 0 R 6616 0 R 6617 0 R 6618 0 R 6619 0 R 6620 0 R 6621 0 R 6622 0 R 6623 0 R 6624 0 R 6625 0 R 6626 0 R 6627 0 R 6628 0 R 6629 0 R 6630 0 R 6631 0 R 6632 0 R 6633 0 R 6634 0 R 6635 0 R 6636 0 R 6637 0 R 6638 0 R 6639 0 R 6640 0 R 6641 0 R 6642 0 R 6643 0 R 6644 0 R 6645 0 R 6646 0 R 6647 0 R 6648 0 R 6649 0 R 6650 0 R 6651 0 R 6652 0 R 6653 0 R 6654 0 R 6655 0 R 6656 0 R 6657 0 R 6658 0 R 6659 0 R 6660 0 R 6661 0 R 6662 0 R 6663 0 R 6664 0 R 6665 0 R 6666 0 R ] endobj 6667 0 obj << /Length 6668 0 R /Filter /FlateDecode >> stream xœí]ËιuÞ÷SôÚÀôÉðFR€,…‘E Û3Fd/òú© YU¼vÕiÖ¥ÿ¿-x¤b±Iyîüxøó¿}ýïëÿüóúó/_ÿ÷úÝýýË×KsÓ²þwíþü4/àææþ}ÕF^¿ÿ~ùqýqùrùÒþ÷ÇeøÁ×_þ£ý×ÿ]ùõßÛÿÿíú§ÿj ÿì*u~¿h¦Û¿ëÿ¶šµÿjÆ¿»ò_/ÿù‡ëß»}wn0áóOÂH0ºÆ®\üg²þÏ?¿ÿýòó0ëzѺ±® Dû üú¿\þÚvà›onÓ tóHGšw=I-¯ŒÛæ*™H:êÿÔižÕoœ5íÃV#¯>+L(Vnýf”ûúobߦ›3¦Û9f®›’ãÊ8²Ò,üØúT%8l×x?òړ∠o¼æÊ ­Üô0ØböÇæ7hŒÝnº‘WŸ¿¶xëí/™U6€þû¡… ŒzNWkóžõa=w˼çT3à2Óó—5mP‡9YT|nQñ+\S«ê!6&·ý7ÏLîCü ­ºHÛ>`úšiú¸›>Ö C3×ù@Mký~}’5­äÛjÍâ¶O´fíÐà:(<ÑšmÂg9b8Ç‚Ùá“m»^Öò9 ‘]ï€Ç¼ÎëWÍ=m¿pøÄN?Í„J«ýáÛåçÏ­©Òš´êúí¯­ïçpøë[kšÊëO]<¡úßþ|ý—¦aÍ¿^¿ýíboŠK?åÛƢoþˆ½aýÍ'ô ÇÞðèo~AG Ðßàcƒþͧo-9n<ó¬iMI7R@¿á)ßðÃGðoö¡1®îòVQÞ*ð=Îuè(³øðQ‹õ¿a _ÊÖKRŽËØÏëGàfgéÇ£×”á’\·úÁÇö¢±ƒiÌ"MO`ŒY×¥ð‹¨•ìÇš¹Û„oœØÉ½n †=¦éÆ~ÃÐÖØ° LÜ7¬}µd!›%C’ýq“ Œ–‹[h °7Lä¶Ò†)Q®¸pBÇßÌEü Á`r½ù[0³ÍÖìÉ[/'Z”àÜ8sä‹vÂ(Õ(]Ä(”Œz’ž½YÎÛL Uñ!á‚jr}aËg_c\j¦kŒˆÄ-ÕŒ”“d9E¤¢Ó^XÞå:ƒoó+²dH(;Xø¥bß„ŠU2V±‚ÅyN廽ºÔr¹ºL©§ŒDÁáR'p‚zéÜuhÛâHå}ˆ§Ÿe|epå¶&tº) g…¸'è¤lS\Ÿ¦‹-þ@|f) » |)V J)ÜÄn2 #pA— Lf®²+xL;,ŸÇ)>n úÆI#usd¢r¿±ØoÄÀº-÷=DÂà‡Tšè›¡ÎRRÀ¿ÐkÞDh8ZÏýf 9}³&~#°/tº?3jüK™ÝÜÅ"Yœ ¿3Í ˆs®JVHJTïrŒ×$ŒGzéšh'’ÛÉM¡`U>°ðü3põKñ¶PÓ îtU¶WÑ$Ú¶`PâÄû‘` Lš›Ò,”¯¥\cå‘ÌØÜpTShˆTeœ2­áVQM6ÖiÁWø±Kr (´Â›§PöŠˆÞ1Áÿ+H-œÿ ÝáÆ‚½ƒFa £¦WDêqŽÃcø¸7^Ãç¦ì@PŒhܽÄÕg† ¾6αeÔ L¬WDq ´ÂöÆEÁ*„¾–+þ¹†-T5æYáPÁUe!)(†—íxk㩮棘b”¾¦I ¾Z4î^|4n/0QƒWàaÊÎí 5‚@Ý_¡ŠÚ¡Šóm›ï¥Uªèz’;EiíàŃEMWõâë:t$¸ ¾sDèUÝÐíMm ©K’ÄN,k|Yq¢˜ô‘WƒÍë(t»"tu™´“:«HL4Q À e³œVÛ²vd?/#óÜF&®ú>¢Rf¯¨Ãæ*–5Z,ֱ쑄¡¬¾+DZQTÅWxñwuþ^®® „ÿ±¡ÓŸj±Ûý‹¢a¡’\u®¦p?Ƈ•Æäáý ‡õðßУ£øy$ô7”ƒúø¡Mާ @ûáèù*‚Ù s€CÖÑõ)œãB[£Œ ?žMZ—(žp _9Ž·ÅWåS±PH’ëªÝaÒ&íN0aRà†°NšS!rëʪN&>ù+€Þ{ùS ›D«øVKQ×GÞKq<ÄeGK šñøÉ™SGZ#Y‰¸E[#$S*¤s"œ3¨¦¤Ï8³=ŒØ“gøxœ·ÿPn¢è¬kÏâÇ6 6=Jê«ë‰¨¼ª \XSüK kŠ¿ÁçZâÒ÷^îÅͽÁ©Š’¢î)¥PaÞªÒu¡ŸªÉ¿pÚÁ=_aåv‹«á4Š[?xâ,JÚ oãò[Kð8ÇžV ød–+i§ˆÙK#¿4ò94ò^ÿÒÕ/]ýÒÕ/]½PW+¿ùPð‘ßAziñ—?‡?ž^úý¥ß_úý©õû½7Ûc$÷°§·A¤ 8ÊQ ê¯n*£½p”oþhÇáðè»x’m½Ám$7pS¹p·þßV§´v~£sÓÖ­%éÔ&'¢·üj+c }!ÂI`Eöׂ֥ OxNö!Wdï"“[n0¾ÑÜE>»jjð:7sÝo¼îq)T—¼©s>„pºîÁ¡§˜n™,IóX9®XÖÎ%ÇÚž[Emrñuðm­™sX>ºº ×ñÖjhtŠƒ€+ ·¢•é')và»»oÞxØá\¶H¦›à_pœñp¾¦„ÐΜa[ƒ£îUU$߇àŽ”E§¢¿©r~ìZr²È„ßP™Tµ¦ø®#½md¤$$åøV!ÆŠß-FØî.Ý @%ð7¨Äæ·ŽIwIçL›mŸ<̘¸ÏÑ)‚×SÙ]E92•©UÕÉn™ÂéGI7¨qQA°¼Î…–Dè&çB7&Æè¼ÛüŒtå$nu¯k¨j² ºº¯³²iZ/!c‚ÝÅ%~2Þ¢IŒ‚ ¸Â1Ú8w|²‡Â§ã†ÓwM+ìvË"/µ?î¶[ù¤XWÓ¬¹m9z°®.ZÃì_¯HÀ“:®Š[£\V±óeȵô®X¸m¯Úy%¶-Їº0'‚ÍZ°fí†O1.·Æ0é¬wxVÕí÷ôÊ%‚?/tÊЕo›yÉåSËå/à=¡ƒW%ï#î×Ýwl ÿD".IÇ@«Ê™»ˆMï·æç:jg†Úí¥_^Än:_ŸÊ3ºí’•PT*® €ÇX¢/&Ü „cÈx¤ Ïsh¯›¯ên±,LœVì-îdS¿÷7‡æ0C݃9„{z+kcüŠÔJ_³û¼“|x'›¦Û¼D¬špÎÁa4x\‰/‡Ôå ~Õ4F¯ÄC™ýg6*Ö(Š¡XÇË# ’ÎÛ‡Ö“wMŠWˆË CUî,-P^]—jEÔŒbÓÌíÒ$g2"JÒÖaºI`ÒåK´ÌTÉÑ’Ü fJJzH9m»Ü™¯›¼ï­†Ô)1‰½Ò•P\4ŠË^æâß³S<±àP„ãæ~•XÎÆ/z„cãƒÍŒErw¯ìÉ€ç§ÇÏÞ¡'ùð±á§ÿ § )9Æ· ­ÕóYNR”ú(RĺSRo޵¾kòÕÞ8žÖw7«Òø¸U˜G9“‚þ&U᱆l•¯m½Uy|6Ö‚F!^ŠãóÖ/|/‘(f3>]{ᔸåÔÜ™y|sÕÖFz¦î^GÕ})’gC x,…ìq¡ˆIBòüÓ׈¼ª‚Û}c8úã09ÇÊ[°73óH ¼lïJ¶w)Ð|"«fÙ8 N=÷Ù\Ïf¢êéYKã{Ž3}Ó6š…¾ÁÅï° œùd»ñ7‹æÆ[9,nW 3ÈÁ¿Z0Ç™Q;.d6Õퟰ7x?b .n¬±"øÍG´‰½q!®~Ýñ…(‚¥¡ùµ]XÃÔ­æïã³¾Ó\uÓý¥3C©½*{âE/ù~QæÆ˜åÆ°±–ž·âŸ†>ÚúîYv?»Æ¿†¤h®~¤C+áw|¿üzùð‡`NX2'l—°ùÚ†C,†s¿@NVd‚Lu7ñH.á(ö%ò÷sÏšÃÈ·ñ~Â…#_¦Õ¼à·Ë×2ù3Ò7à TOº ¸£»¡Ô´%ÌQ§/ùÞþ¨q4<Ö6hÆ?JGžcôÔ7 ’nDßM8˜®„Í@ØÍ¯í÷ïÍL›fÌW8«MÙw>þ|C¹Ú•åmî³7xrú i½›Ø~^¹£U®Ä¼`1±Kˆˆ]ʱKSa[’{W˳oÆ?BDìRäˆ]ò¤ž{_ Âf ìæPbWÑr2îWz‰¸£œxcî4 «‹û»øØ(ÀÊeJè¼jöº‚«Tõö€ÅÊÚ 0ÅœüRÎ  0-"¦!'ÀZ[ ’,mI"ÀºZN@ùfü£ˆ˜æ9¦YÒ KX_ Âf ìæP¦mäˆdüÛ㯰Øk³„DÙ: õÖÍ1µ<Ádaô”˜áðù]³\Œ˜Æ‹ÕÌ ‹Ë#1bENŒXów[’ˆ‘®–¾ÿÈ#1bYNŒØ&é¦IÅH_ Âf ìæP1b}„ÈAirb䨔)ád ôù˜ËZïdxò´«˜Ë22—e<Ã\–ADõ¶÷„¼ÑטglÆ?²¹,k2ÌewÓØ„¹†Z6a7G2—e>«XÁ¥$ä¡8+TKUuž& ¤KÅì`™ñìr^°˜D±ƒ`9vH"?ÖE~jîj9r÷ÍøÇ&bnsìÀã8VW’°C_ Âf ìæPvãîÚ‰MÖì®í•it¯[q9¹R—r^mÅ6å» Ë…’ÐÞÖl^ð[Ä”«·ƒ,xíïže“Ù²’G[5¶Ü…:}-=oÅ=¹>üv“Ù² ã>@'ÛA]™¹™mM}¹d¥?È?aj›’­« sGRBþUà¡ …u¿ áðàÍ-|jÕ˜daƒ¤.ª–’{|ù ¨•~¸š,6S•‰ÌÔVøfÌÔ$äi]È3°2»ZÎ õÍøG™©JçÌTp»’ÄLíkAØ „Ýj¦jx@(¾»}ÐÜÆÙ‰Ñ`î&×UÙ!RÔ3òAɇSW–S‚xìŠb³¬uãµ壜¢ìEHWh wÁq¹»“Û]•|”BlËx ³³¬GÐpcç í,Þ.n`gµ:µ³ÚÒ(lÝ—DvÖP«·£¦fü£ 쬶@¦vV[ I7ÛY®„Í@ØÍvoÉè.¥í¼Ýòx§ý*uà,(XLj\F¤Æ3ÐÆ¶ÔÄ4ÀhãPË‘W©q‘Ï@ÛR‘t“@]-›°›CIMxh# úéSê,§J1b{Cj,XL•UBƒØ–ê˜\ Á µÕ ¨ ¢JÈ`ÛRžt“`]-›°›C©rJ§ð ‚UpN7Öš¸Q!kšGì-¶Ëæwʹnæ‹yI‰ˆ—T×–ª˜ÈU‡j9^Qð’/© ®-eI7 ÎÕ‚°»9”—Ô#p¸5a\Ê~==³êrªÔÍ(áͼ`1UQ¥É «ÚR“‹IÐUC-GuFTixD•&ƒ®jK›¤›]åjAØ „ÝJ•Æ£« ‹ª¦{Û$áçr"4# ‰ÉyÁR"dMˆBj 2(¤¶4v€X“ †Z‘ÍøÇ…ÔdPH¼±‰;g’«a3vs$²æRá2n0/7‹I¸½jÎkF˜·ó‚ÅôÊ›ˆ^y&Ô–Æ^ã Lh¨å葳€^yÑ+ËÀ„x+Œºa LÈÕ‚°»9”^ù}˜Pe€JL¯$tÐý„õè–ûè51/XL·ÂFt MŽn?‹9?+ »®–£Kߌ{6¢[art+b¯±+I趯a3vs(݂ܛnñ1î2QÂð”³Âuíd$±ÍrŽÀåÊÎ sŒ4ÇÈÌN;g‰7ÅT²Ó>Ôr!mÀ1ÒD#3;í¼ûª¨™ì´»Z6a7‡rŒ‚9†»déžõŠ=Þ‚IDÙý­zî’æïÆD™òvAÁb‘ u$´É‰„Ä•eΕ 8z&|3þQG"A«œHбcÞ•$"¡¯a3vs¨H0â<"¡*.ƒ„+§¤]ËfÜUl^°˜ l´7Êlno”%Î4³éÞh_Ë‘¹ öF}7ØÜÞ(³IhÀ¦{£C-›°›#Ù€7|g6¨|Äu¹›T€ ¬H|X͵â͸ÛãsÆ‚¥ìÐÚV!;´z%Ã<ñÕ9K÷oûZ¹ÍøÇhÿ¶µh3ìÐúFI7éþíP Âf ìæPvàlov ÜäC8¡´ÉÝ]5Ø€ÆÒÎ ³ˆ6Œ¹ÈmóÄõç"Ý0îk92Á†±ïfb‘Û0æ"dt% ˆqÃxjÂnehöfƒºçV H¤Qr£NГ2|Õ-øBruŠÁ‹þfÅÁ!w MÎF‰_d|R@®”œà·°€‹yÁbÉ)#x—9xOB@\¦ð€¾–“Œ2€øn&É)sð.ã€VW’HN9¦f ìæPÉ)ïÃö’œ"/XÌn6‚op›ƒoð$FÃm ßèk9v²|Ãw3±›ÍÁ7:¬ÔIáC-›°›CÙÍêÓ°[Áà¥lR2;¾ ·#.Åœ{㹋Æ\eûç¹|ئ;hbGÓ‚©»¼r¶Ò8ìX÷Jnʆ|Fs/Uþºó³çgôûŒá@­‚)TLPà5T}ší: iö dÐý æ¯õVU:ŸÐ% ×'4båPòm4Ì Ë$m¤ÈmdÁ’múZNæˆhã»™d’Èm¤ˆãq]I"“Ä´™š°›Cex  ÿ€É¤'Ћë¶vŽº­‹$dJ¸:MŸ¼2† aÄ®xVZ—BGÊ(…Ž”&Ç¡IØMª4…N_Ëq oÆ?F)t¤Ì¥Ð‘2"v% ‡Ê1…ÎÔ „ÝÊ¡Jܧ[œC—#v³4Þªž_Ëm*¼Åd,XÌm:ÊÔ#u.SÔñ¹)©ÓL=}-ÇM:ÈÔã»™¸Mç2õHŸëJnÓc¦ž©»9”ÛÌx‹É»óŒŸ.oª4Sr1/x<Üd½&ôÏ*nJBA²E᦮–ž·âŸ<¶Ç?C&Ü$mÒ²" 7ue~¤07Ù ?t\¸I5?„ŸKQ„tm”3…~Ö?U3nm9v|ÁRy®X·Q,·QI0D±nÓ×äõØŒŒà6Šåà6ŠÅ¡®$–çC-›°›#å¹âãj¢wb’"‚„mƒ5¶eg†Û9!׉•J@ñcƒ‚Ål'"ü9üJü}%RüM_˱•ð7¾›‰íD£D½èJ¶#þfjÂne;aŸRâ/?pœÚ|ô a—Ó:Œð›á®"_°˜Öe¿Q2¿Q‰ç¬d ¿ék9Z–üÆw3ѺÌÁo”Œã]IBër„ßLÍ@ØÍ¡´.ï'P¡GXÚÉA[*f9sÉ A#æ‹™KGéR”Î¥KQ‰£¬tš.¥¯å˜GéR|7sé\º¥b·¿+I˜KMܤƒt)S7‡2—á2”›¾)—ÝQüðÿUà?m"þÓënïQ6º½GÙÜí=ÊÆgr”Moïék9þ²Áí=¾›‰ÿLîöeâF]IÂf¼½gjÂnå?{?M)L´"dFAAQ’ Pj…³MOȪBrÊŽ]8Ÿ,ebÝDÀÍrÀD'4K'}­IÇfÜcOt“žè&޵t%1µ lÂnŽdbÍFàÉQ[Ÿošè5›n# ?óß2Ðñgþµð ðÙ1œxÌ8*´ö„„´ø½Ó6»žT 8AŠ-ÅýÞvSlÄv`ñ^ XŽy ´šT `' `Íï/pÕ“ ï•´­E=/¨@HFœ€,»»À¤##uó¯n}|¯k}ü\@Pð8Áš†O°†Ý_`Ê=†¸Ÿ\X<Ö{lH°†ù˜´|^P`9;Ár{_Æà–&šQ$ªyA ƒææ¾H¬«Ã_¦e²; ¾f^P,¥=Y*}w ÑiÊ)"|mª’ÿ{%XeF‚•ó‚ «OpI€1êþts4Åá^äÿ^ ÖŒ[=ÃMþ ÁÚäš·¼»À”½Iü7…kùêæ§EäCRn?4å¼ #å/—/×-9M„›¡¶/÷*ü(°„#G“½¯¢ýð†uÐÉ+s¢3tÍÏFgÖ|8´Âý±ëÙ›áà§J߸\èüæ ›3ÑÊPþ#Ö¸·óžÛg÷¥é5ž mmX|˜†Ô ƒeîÓ“tôˆ'çÁ!ó o ýc_¶êÓõD÷T‚ëþÝŒ68:wøœ8žò%w+GìèJT^ñOì¼®8.ù¡׸9i±léúÙüã4œ»"ñËõËåÿA a endstream endobj 6668 0 obj 7654 endobj 6672 0 obj [398 /XYZ 38.2500000 213.500000 0] endobj 6673 0 obj [398 /XYZ 31.5000000 465.500000 0] endobj 6674 0 obj [398 /XYZ 38.2500000 403.250000 0] endobj 6675 0 obj [398 /XYZ 38.2500000 284.750000 0] endobj 6676 0 obj [398 /XYZ 32.2500000 464 0] endobj 6677 0 obj [398 /XYZ 38.2500000 403.250000 0] endobj 6678 0 obj [398 /XYZ 38.2500000 213.500000 0] endobj 6679 0 obj [398 /XYZ 38.2500000 284.750000 0] endobj 6680 0 obj << /Type /Annot /Subtype /Link /Rect [114 778.250000 155.250000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varin_typemap >> endobj 6681 0 obj << /Type /Annot /Subtype /Link /Rect [114 771.500000 159 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varout_typemap_ >> endobj 6682 0 obj << /Type /Annot /Subtype /Link /Rect [114 764 159.750000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_throws_typemap >> endobj 6683 0 obj << /Type /Annot /Subtype /Link /Rect [114 757.250000 162.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorin_typemap >> endobj 6684 0 obj << /Type /Annot /Subtype /Link /Rect [114 749.750000 166.500000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorout_typemap >> endobj 6685 0 obj << /Type /Annot /Subtype /Link /Rect [114 743 175.500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorargout_typemap >> endobj 6686 0 obj << /Type /Annot /Subtype /Link /Rect [114 735.500000 145.500000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_ret_typemap >> endobj 6687 0 obj << /Type /Annot /Subtype /Link /Rect [114 728.750000 159 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_globalin_typemap >> endobj 6688 0 obj << /Type /Annot /Subtype /Link /Rect [87 721.250000 137.250000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn40 >> endobj 6689 0 obj << /Type /Annot /Subtype /Link /Rect [87 714.500000 131.250000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn41 >> endobj 6690 0 obj << /Type /Annot /Subtype /Link /Rect [114 707 190.500000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn42 >> endobj 6691 0 obj << /Type /Annot /Subtype /Link /Rect [114 700.250000 190.500000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn43 >> endobj 6692 0 obj << /Type /Annot /Subtype /Link /Rect [114 692.750000 162.750000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn44 >> endobj 6693 0 obj << /Type /Annot /Subtype /Link /Rect [114 686 143.250000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn45 >> endobj 6694 0 obj << /Type /Annot /Subtype /Link /Rect [114 678.500000 135.750000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn46 >> endobj 6695 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 139.500000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn47 >> endobj 6696 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 181.500000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn48 >> endobj 6697 0 obj << /Type /Annot /Subtype /Link /Rect [87 657.500000 168.750000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn49 >> endobj 6698 0 obj << /Type /Annot /Subtype /Link /Rect [87 650 129.750000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn50 >> endobj 6699 0 obj << /Type /Annot /Subtype /Link /Rect [114 643.250000 180 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn51 >> endobj 6700 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 180.750000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn52 >> endobj 6701 0 obj << /Type /Annot /Subtype /Link /Rect [60 629 110.250000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn65 >> endobj 6702 0 obj << /Type /Annot /Subtype /Link /Rect [87 621.500000 132 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn66 >> endobj 6703 0 obj << /Type /Annot /Subtype /Link /Rect [87 614.750000 140.250000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn67 >> endobj 6704 0 obj << /Type /Annot /Subtype /Link /Rect [114 607.250000 178.500000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn68 >> endobj 6705 0 obj << /Type /Annot /Subtype /Link /Rect [114 600.500000 178.500000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc1 >> endobj 6706 0 obj << /Type /Annot /Subtype /Link /Rect [114 593 178.500000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc2 >> endobj 6707 0 obj << /Type /Annot /Subtype /Link /Rect [114 586.250000 178.500000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_feature_autodoc3 >> endobj 6708 0 obj << /Type /Annot /Subtype /Link /Rect [114 578.750000 199.500000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn70 >> endobj 6709 0 obj << /Type /Annot /Subtype /Link /Rect [87 572 143.250000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn71 >> endobj 6710 0 obj << /Type /Annot /Subtype /Link /Rect [60 564.500000 105.750000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn53 >> endobj 6711 0 obj << /Type /Annot /Subtype /Link /Rect [87 557.750000 143.250000 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_operator_overloading >> endobj 6712 0 obj << /Type /Annot /Subtype /Link /Rect [87 550.250000 172.500000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn55 >> endobj 6713 0 obj << /Type /Annot /Subtype /Link /Rect [87 543.500000 153.750000 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn56 >> endobj 6714 0 obj << /Type /Annot /Subtype /Link /Rect [60 536 117.750000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn57 >> endobj 6715 0 obj << /Type /Annot /Subtype /Link /Rect [87 529.250000 181.500000 536 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn58 >> endobj 6716 0 obj << /Type /Annot /Subtype /Link /Rect [87 521.750000 134.250000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn59 >> endobj 6717 0 obj << /Type /Annot /Subtype /Link /Rect [87 515 128.250000 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn60 >> endobj 6718 0 obj << /Type /Annot /Subtype /Link /Rect [87 507.500000 127.500000 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn61 >> endobj 6719 0 obj << /Type /Annot /Subtype /Link /Rect [87 500.750000 126.750000 507.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn62 >> endobj 6720 0 obj << /Type /Annot /Subtype /Link /Rect [87 493.250000 181.500000 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn63 >> endobj 6721 0 obj << /Type /Annot /Subtype /Link /Rect [412.500000 417.500000 447.750000 424.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 6671 0 obj << /Type /Page /Parent 2 0 R /Contents 6722 0 R /Resources 6724 0 R /Annots 6725 0 R /MediaBox [0 0 595 842] >> endobj 6724 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 6725 0 obj [ 6680 0 R 6681 0 R 6682 0 R 6683 0 R 6684 0 R 6685 0 R 6686 0 R 6687 0 R 6688 0 R 6689 0 R 6690 0 R 6691 0 R 6692 0 R 6693 0 R 6694 0 R 6695 0 R 6696 0 R 6697 0 R 6698 0 R 6699 0 R 6700 0 R 6701 0 R 6702 0 R 6703 0 R 6704 0 R 6705 0 R 6706 0 R 6707 0 R 6708 0 R 6709 0 R 6710 0 R 6711 0 R 6712 0 R 6713 0 R 6714 0 R 6715 0 R 6716 0 R 6717 0 R 6718 0 R 6719 0 R 6720 0 R 6721 0 R ] endobj 6722 0 obj << /Length 6723 0 R /Filter /FlateDecode >> stream xœí]I¯ä8r¾¿_‘ç:›;EÀ0P[ðÁ@£ ðÁðÁèñx0ð \žƒÿ¾µJ‰Ôǔ⑒2_va¦*))¸ÅÆØøó?ýö—ÿúûåç/¿ýÏåwÿ÷—ßÞØÕj6üwéþü4mÍÕÿûb}ùý¯o?.?Þ~}ûµýÿoÿ}ù—ö_ÿw—nÿ÷—Ë¿ý{ÛøGÿR÷Â_ß,·íßÿÝÿí,oÿÅÆ¿»ö?¿ýë.ë †îü`æ¿’Qºé†q§ëoaš¼ÿó÷ßÿööó°Ûz±V8n.\IuáN‰ËÿþçÛŸº¹Ñ+¦ƒuI<¼LpÓ˜ÛƶŒC-˜+¡`¿cØm„_Ά.šË´Ã¦Eßv^Ci¹¬µ†1ì kØv¡.ÓÕkX—6§ìºaè®]?:Ûwñ­=*¡o«èòÚÿü÷{P©a²eî¼YXæ¶a•f®ÿ&ölEÛµb¼•L±‹¶E·8‚Îk7¶"ðn䥅KóÀkï6¬ânÐkl·¦"ðnäµv¯½ÛRù%k—®üšÐklˆG?òÒ‹v¿6Jri…Ví¿Q–é¦í¿­ôÿÑÅi'M•ngÇycŠÏ,_vK<ôv=*BïÇ^~Dž˯GßaÑœó‹ÖêÖ56e„_zë"T7öò ã÷<¾IwÅCZ:µ”§Áyo ò¢Û?mÏŸg xŠ#ãÄ̇Ÿ¿¿ýüK;=sùþ§öQ?öá¯ï}¢¹üÔ BòË÷?^þ1õõ/ßÿò¦¯Æò¦3Út/öOøçþIskCõq̈é«ì›"E‹³'º"¯Z™9xf4<$ö¥¢®Jö¥Û…žHOCÂiÀ ò—a†+Å÷óí{‹]·Ý\B Ñôˆ!E‡qíiGJ7mè<ïÄ9%N€súþ—Á9·„Ah>*6j°Q¹iCllU­ã±Ñ¸û ·Q¸’h)DâÕ"ž·Û½on7mx7nKÆ›à¶0Ï…Û­šã~^”²šR„ ”âÄ´¡¥H{JQú=XÿA‘B™€\L …6'@ £îòÞ@ö ¿‘»dö÷óÒX#´4z´Ìæøƒ W2˜ÝØÐ«=nq%º¿­ÇѾ…{kkhù½ýˆ]9w¢iÆ·¤› ?‡nÚ/Bƒé>¼D¬Ž»i[ºnfƒéßRs0jÞÍŸ#²Üƒ–xKÈ=-52àÑ€•îjŽèâ` ÛD(•­ÌZ†{`ÇÖ¬$®n#û}Tž6„ãÓ†ÕÄåLD\Î.Wçé˜c}Û’W÷–'ž&ü4q9½D\N%ݨ”¸ú·ÔŒšws$qq&rèÕ9Œ¢HOÁ=HB r‚ŒþeÚ†£™ø°€;ÞHBœÉ@BVMÞ¯6q~¼®ÕƒŽ}…؈_Ð7 wšòM1”’AåÊ`#„&%\?HTX¤$k;Ã`¹V€W‚ ±6ÐùZÊôš#Á“©¤˜6 Ly¼'S¶²ï…%Kö'Õ{\O™ŠG”© yu%×Ç{uÛA¯.·ÛÏ/)²¼È+ˆ$‡>cydgÁk|CB‡žp ¹Ô¹Ûˆ†Í|bcCl´Ç{uÛA4ó•YZçO1º$HH9oŸMg;nG/(3Ó†;ÞœÀ Ê]ð‚²OáGqËP¬éî²u§]ð ŠÆNÖ8gsG»Ï ÁedyèZbGÿÖ`ÀÁ„ŸlnàÌ-8kânÚ–ØÀ1¼¥æ`Ô¼›# ‚Gæ³X×óÕLÇx°pH{Ø·£ÐNV“p I¶DB­*ávÛ’P÷–'‘ÆÿôÝÜHH4K$$lÜMÛ’Pÿ–šƒQón%!9z8ñ±ƒ I;8EÄ>á,–Gç3µ\ I¼aHeOÆ”ÝHôOëJZ?lÆVÉ\ÅÙš iÜÓ¨óÃZ¦ÚpRÌ©ljë™ùØVN ÇJPROÞ}<×–ÏŽçÚŠ…ã¹¶*::ëÞ(6?`÷oÙ)”ð‹ÏŽçÚ²…ã¹6.îøäxÞµ…‘²ÉñüÖÇ¡Çskïc!‰rbØRÚƒRþó¢B³J þêC¾ëryÉf·ÕåÒ.ªË¥ÝR].íâ|<íÒº\ý[~nV—+ts“ÀÍR].ÝÄÙ…]K"›±.× Œšws¨væ=x &ÑþHeIà”´¿Ì-ˆxlE«‰±ÏÐÂBX|Òõ$œR÷„…Vî „õª…»E¬¹iÃZgXT7Íð¥ºi&10žÖMëßXØÆÿdQÝ4ÖꦛK»–˜Å o©95ïæHgx³;céjBí »Â²šRÑÔ™Ùdp\}÷'!Ã[4bÚ°š„DTAˈ¥ Z&±÷™VÐêßò$"f´B77K´Œˆ­—]KBBb¬ u£æÝJBR=" eÜ_Ä] ×fw#ƒ X Àаš>TT»É¨f‰>“Ñií¦þ-ÿLøÕn2j©v“Q±¹¬kIèCµ›n`Ô¼›CéC‡Ø·Ã´èzÑcÕ%£§ «ÉÁDSÆ,LL“Lõoyt7³€©ÐÍÌRÀ”1qÀT×’ƒ¦n`Ô¼›CÉÁŠ»XIJõ'œD>*]ØñŠ*#¦ «é¢‰j,™f©Æ’I¬ ¦Ik,õoy¼of5–B77ºh–j,™&¶ét- ]4c¥5ïæPºp+j,AV°(AC JÙ¤–X.kV‚ s\*jR‘Ÿ=‹“‰NŸPÌd¤Rz@i^ÏÈÜ­p’›6¬õÖÜ%d¶žëéØªû—PÎÊ[*×–¨•MºÅ¥hiP JWiÃåI8†ƒÀ]·ì¦*\ó_äÍÅÊø ²÷ WüjÆaK©1I Ù£\ÐûÉDë%Èø×9_¤3¯æ"Ô¢ÂæåÆ;ÑU %—4Ô¥'Ã3WÏï&«ð ~ãà7Í­åKX ÀÑzÊ|‰žxLÕ§\‚6ì&W×ä(!àØà|2cÃ3u¥äŽ„knq„;1®Œ!œCó+E‘+!—S‹ >ÒaöD1ðïTÙ336[ß`àÊtŒ7Ž¢›Ÿð(S䆞‰k(VMÖÉ4¥*ßN'ÀŒãš6MÉ+€ëF 9È8ó6 â=NUQˆiîb)¶×!}ý±Œt—Ãút1JævÊ’×¼l8VP‡;J"j<Á„ÓQe'„Ü7mHè] ‹S&ø©lÍ×GÊOu6ÞV…‚Ás ©U”Y®±Ìz(v‰Œ˜êä§$KP,ˆe•/TMÉÁ BvKm-€’|ãC:’ R†ÿ$ÑwXz _¹yÏ•¸ƒ%kL1£\–ñ P"È(¥LJxªœ„+î—"Þ<8š”IP’i(<<9Œ´ðÓäýo²Æïç*k'$¥¼L¤µ«qì6Š‚C8ß¾˜ØþLŒdÃÊ*ŠË.}`..³wfPp# ‰c—-URÔê’™)fªêmÐ7¸4¨[J­­Oá.qqïâBvÀ+\ì} ÁvSÇ<‹q”Ro ˆÑüxû!kŸ&‹M¡P--’&WE‚bÍ Ì†tb!@#Uú,wTÓuÎ\$³2ÔM96•½/J$nE©õH1ö•–§ú‰…`}ÊÜþLaº{ùèK¨*[ÂÉì?C땊„ÍáR“åh»ÞåCR?ŽŠÂ9ÌS[¶îè‘î çD$$÷bjrfÝ=‹‘ Oûø³Ç74‚-«Baó~µúÅ+“ûª{¡åˆ¶~ ó=Ä÷<‰fArca$-{z+áíaóŽ3a&L‚PŠp¯ô\’ y§¸Nø/]ìÔ7{:.îÒfaÉ_ôøDÂ"1sSiG ¦œð‹Øf)éé”ÁîTúCt‹¤¯r·xÏààãt:p•¾Ê®I¥O¬G'‘¤p~*úCßÈ/Aî%êÖ­ÀC¤2‡ÄÓMO$5üFÀ'x>á Ò#€OеW'¢'plqIázÂÉB¸#©°C€âF-£}ÆœG‚?m¯Šó;Væ|B©Cubwà–Ì©½Di óL&Åg€OI#"F%B)AÖ¤Zx">£'ÒÀo>UçÁ¾Åmn¤¹(öƒ¢>êÛˆ`u·VŠ·˜{ëöÂÎyþ·„! |ñÀó‹¥'Ÿ¶`gìÝ46Ž¡áýŸ|…O$|‚÷ï½³sÕµ(Åœ›£Ä¶è3kQ{ÝõsæJpØ“Ü6D±Øn¨%Q–mSÜeK,>“¦"œ‰˜æõÊ 9­®~&ìîŠØÙK¹£ð±äõ³é#ïÀÑ—FôÑ5"ÁB Æyb½w»ðõ(·HFÅ$(…‹SncLzLb䘽aÆßàùàQCv ª³Ét´‹™ žb NΞÄÕ ­öA«M+*ê{xlx>™¬ÂLÃ¥j O¾ ÁÕɬ¨%àŽxǶWt‚dáâÒLÈÑÛ$2>t"jvŠfÌDÿñÚòUK¹<ëB[w‚jÆžB2kV ³ì¢PÜZ‰\(q— I®ÚÝë†9䠬ˌ™èý{1c ¿Áaüp¦ pø %]àHâ4œUûtQŸXa'Ùë7\‡Z·zÖÇ©bK Æ ¸{ñŠRê“lâ„ µ²¹™QoÀ|ˆãê©Ë¯è›§Óxîa׆eؼIÕ£õbsCäÓqÁëEl“„ü,r÷,:!­›oÖ¶¢‡—U ”|ÀO2c;±²:™t`\’Ûò`j/ÆO3›J™à±)¸:™5€#àšÄ» Ÿ1VIl7=«¦zøχCî⦖ A‹wfç &*ˆ½ŽMÃuÃx°›?€Ã5ÀtŠiá^¡—m|–.PxEá7$þö¢ím?.mã"„"[˜S|‚õ¯Õì£m»HNá\0ÆX\ëǰ¼˜seðó Ì!!ŽeŠ˜áùìDÏx·%Þm\ÏygYéúÂÑÒ8š)t„¹–®pEñ7 J‰Ìé®iàZgV k2„¼¸ËÈ]êgb)}¢L,JFÑ€`KwÕø{!2p|nŽ ÖÅÛ² ô %›f·ì-˜…”ùæ'yRZÊÂ7ùàÀµÆ«ãÉ|[FìãA&G ßst/wª~`…r£+þU æU fiQÊÆ‰õP¦Q4wjâ˜,[om %<’Gy·ÈϲNûõU‰Ê¢÷^•.2U„ ÄÌLKd=Ô÷kÁ#9w‚:•{E\”¥6ÊUÔ”Êe+±Sêm`²Ãü¸nb$’ŠøG¨âñb³0u–½¸»Gº*œré;¾:‘Â9ååÌÁhëÏìÚ"^?µ©‰te´Iü¤l^BÝÔ&’ÀƒÅýœ¹Zd‰8Hïé^Eë“H›M©}…9+¡úVF¬$RY´¦Ì´ìIëÙÖm·\'Í5¤“*Ζ–Cêø@©Ë¥öìèhóR¹À”›p¹E\éxUpÞRÒ7ëVÊHÁo¸ bD:ÞøTÕƒ˜ŒøfäÐ5¯pØveã0nAøFC§}¹kÀ @u.æÎ'®÷³³ª[Óèjt¼î;1óܘ¤´ô ’§(Ï(‹ÜÜ‹‘¬vz•Mó°õóôLÜå=s]ÅÁxCÑm0ø¶´ܤZ´îËñL¾²ÕüØ»#r—¦s“å:N1·[ !òÞG Ö¼}•󘦋jÉe=,”dæl™¤1o8qìigñsÔÔ¤•ŒìÔF…¢Vø]¾¹´â£Ê¦8uœ5•‰&dÿÎO†‘òf¨áo0ïÞ%—hÜH¡î‹&Âg’Ïpjåvi|¿5N·„Û•1 ÷hK˜bƒó1o Çó‘‹ËA§.3V´àÅØêSפËãO]·Áàâm[¢ZÏ¢{<šÛáp?=Å‘s‚Û0ǪgÍØUË´RÌO3›4¹ãë ½luÐâvº£ E q§‰[v¶‰o!k7“×óR±r‹3Š‹¥²­ÙÈÆÝgô'õƒ5}¢¬âkbU$µˆJ´¾æÞ î|*›V7à§ðíßE¯¥\ ’Ñߊ†,îf̆£N Å™W M O.‘öYöÚJ‰nJ`ç–{ž×óÊ ÕÔ­9_&ß”žÕ\õn±Xö‘~˜å2·LrŽ2ÎÂÄ­èB|G÷I3˜|»…o¤Aßr¨à½²Ç]1~|Õö½R c£Œú°8|’i³hA ¼Äeüà„dËÊU- ×x0G?g²‰¢ÇMí«åW6U0§býæeÎ,‡ÀÜÅêã^ÇaJ‰ž-YÓ%´¹ÚÆúðƲwý•ø•Ók§¾žöÏåG‹îYjøõÞ +È¥Y”WÆ;ÿóeŒWñe–P˜¼]˜â ‹« ç%<ǤO|9`q5qe6Á!|EýÈ{\}il¿ø™&.xOÃUL&X«2é=‘cãäÂ48†¿ñØÊ7M}?EE¸îßíˆÃFõ£ Çô Q@HˆìßzâÝ $V®wKðA,ÉàžîCkÞ –É«ç#ëBÂáø'ž£Þ㦗_ßþó”žc endstream endobj 6723 0 obj 6729 endobj 6727 0 obj [399 /XYZ 38.2500000 625.250000 0] endobj 6728 0 obj [399 /XYZ 38.2500000 625.250000 0] endobj 6729 0 obj [399 /XYZ 38.2500000 149 0] endobj 6730 0 obj [399 /XYZ 38.2500000 472.250000 0] endobj 6731 0 obj [399 /XYZ 38.2500000 472.250000 0] endobj 6732 0 obj [399 /XYZ 38.2500000 407.750000 0] endobj 6733 0 obj [399 /XYZ 32.2500000 258.500000 0] endobj 6734 0 obj [399 /XYZ 38.2500000 407.750000 0] endobj 6735 0 obj [399 /XYZ 31.5000000 260 0] endobj 6736 0 obj [399 /XYZ 38.2500000 149 0] endobj 6737 0 obj << /Type /Annot /Subtype /Link /Rect [389.250000 632.750000 417.750000 639.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 6726 0 obj << /Type /Page /Parent 2 0 R /Contents 6738 0 R /Resources 6740 0 R /Annots 6741 0 R /MediaBox [0 0 595 842] >> endobj 6740 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 6741 0 obj [ 6737 0 R ] endobj 6738 0 obj << /Length 6739 0 R /Filter /FlateDecode >> stream xœí]Mä8r½×¯Èó“#’¢D†®®n>ht>,|0f½^,vnïÁßÊJ*«’ңėAJÊÊìvO©Dñ#ßñâ×ùþŸ‡ÿþÇá×Ïßÿçð›ÿóó÷§êØÚêüÏáôï/ï ÝÑÿýÐ:{øí÷§Ÿ‡ŸOßž¾õÿÿóéüÂ÷ÏÿÖÿíÿúð¯ýÿþzøãô?ü“ÿ¥Ó/üþÔª¶ÿóo¯v­êÿV]þ<ýü/Oÿþ‡ÃßO#Ÿó“¹þï_Œkkݦ1óéŸOÃ2Õë¿ÿøíïO¿ž7 í+m[;ëª6õAuµ>üï=ý¹ÿÀ0|utµQ¦Õ¶îÿÞ5u[Yçtÿ÷ÖøØ·úòuÝUÕ~üõ_¡á3 ÞÆÍ5øëÌÅwE™FÅG?ºF·µ­:ÿ~˺lÕ¿iª–ß¶wÃg\µM¾Á_g.¾+þÀ#£g¾áÖ´]Æþnø ƒ[¥ò þ:ó\7<2ú±«UOÉýAß";ü9Ýl›cû]ÆËܘœ„sš¹ô¦ G ÏÍ»»ºÊɻ߆—¼©lFZzy6ÞGÏÌ»UÛó¦u6Ñ\FÏqÞ:ãõ>Ï\zSüqãÁûkìÿ'?í^w¬ëoH­ÜaÊ ÈÊXã\F:»Œžƒêþ¾eüuæ¹è,ü[Ê x&çŸÓõgäÅçO¿~í °ßÊæðãÏýÜ^¿yþãG¿%öðËÉtéÔáÇŸÿÔOéùŸ?þúÔm‡)ú'=Q |âÐG«?ÁwZ8·/ðŠ˜5Þƒ>ùšþÈJázT>ÞÈ àwð Ü7üŽý gý’~>~´/?ú‹—ûÎtj~uøÎhLc>·)r&pñ©\A*÷w³ÌÎ÷ìrnÝ RväÁÕa®9G¼¿˜^ Í s8<8ëÈJ ÞÇÐr…9Áy*EÌŸiSþk7Oÿ[¿ÃM;|õEê«ødoêýrr×i=ãyÛêcmÎq‹·>£;º®zÝŸðè§Þ£éަ‰ïàwZôÄHÚwàhß)»;yIT5!Á`Ž 1r\c-ó1Ì/1_Æú2Ö ÄøºÚ6áu„Ä!8ûúÄmݸ֎wjâ &+õBö'bÖÌJ1K:ëöh´SK/÷ù;nÁðê, •Æ¿{áÉâcÁßY¾ ÌñdZ¾KU~^›5!£ÂüžØ ºñW©]%,A1‰ŸŸ(5ÜÌ%猘¬Üœüˆ:™ SJ­M~˜9'L‘‘Ñ ¯`ôüeÒŸDøæx¥&Ø||¶µI'x>†¹µ!Œ ßu¼ølÍW–?ààõà0·Kp¨>Q§°;íIÔ®nCå4¼¡”>F(?ã3oùì1±D˜¡¨Îè³²")ò¼â*é¯ËbS°1áØ˜“b‚©«Û72š;óa8Zä;Äõ¡ˆë9=Dxºè!Ga®×ƒ3¤mìbËèKny3¸&닸Á×ðS@Ù‘K°r†aϪ¤wNU]°u)Þ‚ðøŽÊêP^ZÄ‘¤ˆEìy¹üÑMUz­ ½;;&³êSh”ÉÃè«{³®\äŠ3¶=OÅy#:V7¡°`":0‰Ûà *j#:ž‹g¸2Á2)æÞ`>0â䌩*r)Rü«px}¥X1¾ó‘äeNE6L,â¨ÀOdÝÛ³{KE ”%.Þb¬v‡ÖCˆnÀxS¯m!«U¥C.?"ö±ú¼<‚ѰED^Øç‚E>_ÌR´æÌ~†Ñ²”K%Å+Ë}ñ¦„'X‹ù¡fólÕ5×;“–T Ó”*¬Ôât("‰Wã„r"µÕ`3˜Û½•˜Ñ1O—JÙ[èžNÆÃOꋤÝÂDAê;–kœ(g`Do ³£÷vgä õwÆÔ;ó¸3;¹3 Kn¢ #²<ë¹[+Eo¸Ä˦ë( ïüÖÆp z$¡Ò^‚§á·x=…´>|Ú˜WEè ¯¿c Jkv-Y"w–…E8Ê\YX•ß_ØDÙÞ>÷`˲9…ÈÍú0gÙQÌ]ž¥xôLF‘®†QŸd#¾ŽsÂqŽc ^d©êØ´êÚ ««üñN9}eCŒS_´ ‰r£3aûåá,O¿J– s`²,ø&zZ*vÄ„ç09'dñbú.t'0/¡B Dö:pé[‘d»Œríy-Øê Q±R[HŒDd’ -¯£òßø?QÈBeµàÉ2uÄDü¶TâF$›À± ŽÀ”_¦"#D$Š¡¨²Ž„Ôq\aù³‘Úë„ëŠe&.†–FùàÄŠ…ÓîDUñQ:’~ìfH­Y.ѹ‘]È,1šG³bê¡Ú`’P#6ñ„ÊêÇ»Ã(¸ÌH°IJ00Åý Éà,œj–°ôµ*^"e_LÙ§Dô+aȼ!e¶€ÿN·óÔ oæí”‹¾3N-äщ,pEUiÞèB0Õv¥LjSñ%“(ƒ£”6Q—”¢‰ÙzÓ„w±û)ƒÖçõM9pe+˜†;«X.™‚•ž»z%*¥eâïà,nbÂz†(Ãv×n?`•³Ô°îæä(åŸñ‚ž"{)[ÃÍ”+‹âÈ.C´Jpý³*…V¬=;MªÐR¶ žÀ›ÄŠý¤Dr ¦×òËÆT–É¢X —zÊVÓâÝõûîËÕqØW÷¢¸?Pæà¦äŒìW&”xÎ=àpÞ(Y7ˆ–™à¦5ê(EnË&âH7bû*¨¸‹âu1·k ‘ûT(¼•‚¿ü"S|b4ˆø×­ÈÁïÅ”µÙSËä›J½7#ù¦ eŸ×¦ì±êÌõ©bcçäâÝÅßI@J°×ªÁyëÔxëN;ðºæÔúðp‚é­Üw?ùÛÓ÷lÝ1ÔÉØÒ^]…gœ/Œ¿´” Îéa”àR˜´²è@Ì^‹¹¦ÜAu“­{Î(z¦º è}Ù¹´d´€©'­ß\Ö£ø$«¤w"ßéÐ;Ƈxæ¾ïfСѼN55k¯¦¨£ X©†OðÜ|QêÔzžáh/è‰/;kfDFpžøU3PØ‚¨/ÄÜ8ƒ¯¹MNÏùM}! s™fèð%¼•Þ#Q‰ÛV Uâ¶Á¼VSb§4\ù LpŒÈ3ÃÓsæ^îe0µE|„Á’Ðfˆ°0nȤYb60ÍwŠ%cU· w–Ð˨†=¥’r7è—2mœ‰Â*çÌbCä’]½)iZ,&ýfã‹„ÉjêIy6åÌzÇmݳ•)oÛSƒ@á4v‰r°”Fš¬EvTXìäƒÇè Ŧi–ú{CërÝJKÂt8O(²ÌDÌþDWYªR#é.A¿Tô7!+¯ÂÉ”Gt&½‰aò"‚G‘2©—¢E)‰â[.ë/¾M&­Œ ­0Ì¥½ãËÝuìH/m7¯±0媅J‚°×êa!Àdk šÁ #Ðu¶ C½aÐ4 Ûa2#Ч ð"^†m#Àæ˜`àÑÈŽB a \1t]ΓöÇ ¨˜F 0ÀÈ;òCâ•F·€vŽÐ>‚Þ(ØC|r”›¹ÄðŠsOÊðh£nàBÝbêÃô"Ê-ÀŒ¹7œµ-yZÍ }0õZâÿª  ð)îËð ÅJÀGö€ä}èI Ö¡7 $ Ÿ<4„Ø“ÙÝ)#%œ›=G†3·©†÷¹&4Wʆ’ÕEùÓúÜ»Â3ÀOà, ÞáX_ÁzsÓW§ÏÔ߬ü.¯ÞF&AØ©âŒå‰_28"Yê¥Sý²"a*8'²Õ(ü^f4‰X £q×&ê-D¾!œ­zùõàú}l‰ÄJ|YRØQB´o3è0 LUeÕ Ä\ÃNôM[éà›^{À…kSI|v¢¤ ‡¸Î;Ýõ¹¨cDÜiiCøJf¯N°mžÛ½ÅøK%rmYž*MÏlj·&Tޱ­°ÿaÆÛîFÆ‚,4^n4œi³¿€²1rÀÃe\QÛ+º×”îRå&¢Ù¢’$=j3𭍓…ÌØâZ–eæ²0”¢*¥,‹bD4$ëÕ=9%ó¿›ÓÓóQlß7’ß~«ïü:YÏÖo ^YC‹†V)ðrÑn3÷ªŒÞ›½˜R•¿ýÒ3)ÝfÃ…W[6ýë¡!EBÉí˲ÁËÈ;¢M K¡­?mwsÛÞ€Gø{ºmÅ <[u¹l«CxzÅ? ³º$ˆ<Šæh”žT÷¦À=ñ;öÓSiÒ¬1ä%/jà¾ÝVšßøië¡ËÀK+«ÍS6‡D0ÈÌuj»0³m¨™àȓ͗•m"2–û²r2! vµ¾2¥ì¤ía¼1 òɸƒ˜~}…LÑ2ºwVtÌ.gëM(þ\¨Òúü-6N{ø —ìùꦯp[Q0ayÆ`o3é 8^ÍøÞKµÄ$šK&³Q½L‹”…åÌ~mU HïÞ4aê£n)‡bÒo)½€@]”fš%&d‹Œf2 €QŠÃ˜ÁZM=¡lfÂê¤ a¢úyµNˆ7· øæ7Kq;÷w<Ÿªºá9“›ðœSR9á+‹œ‹ïލ‘’"ˆeD¸’l~ S[“ ßÈö.–ÀÜ×oÊBW‚hK„<$bÚ>£$øˆ4 ÈeLCL’íjÈäŒq“P—9çÈ(«ßÐíNÂÙÄ&‘@‰“¡¼¥¼$8"!á%‘Ío‹°ÿ1Ceø°yJ¥J=q–Ì ¶0êã°.Ɔ¶ä±T•«CÑtï.ËÈ­ÆŒ†‰Á̺ڊÉ7ÙTe‘ÔQ5'7ÎÃ&?Ç©pµ¹vþNc±»žò3ÛáôÐñCe k©Ëë@C–]• ^,*¾ ÊKœ Gò %¾QU䄎1†ö™Ñ!éZ­’„"À‘—ŸV\ µÜDñ=eèî,ncë:’÷•§yc#£ò"ߘ-ˆ¦òa%ò(„sårÜÁ¼øN»€‘P€ >±è‰¿¤RM¥æZ³äLXS6dÆ«£ÉÜ)ÊêÄ«Thy®•¾EXWÂêº/F,UF%ØŠd/`óñªsí6Iû”&³Zïb­oØB*ÁQйž|Üû³ÓzÆû€æ-ÿàÜEý_þ)œiD™ã¯æ-0DÈÙ8 ƒûJãîÑp>Û$©µ…£á'Ì *<7z28”FìÎÒÓú‹‹Ù6 nF§o¹ð´JQŸ‚4Vã0* –šBwóãÐ2Þ¼-æìž¥ÿ¦ºÀ»>èÿAÿ,ý+,ñÁïàõàYç¸R4J$ÁDÒV°6†w~ëi ~ï(¦¼Üi&Âoñz icø´ >mL£x=ø±ô¥RÂ\¾ºK)¹3ŠàBø¦c‰©üÎdAD¯Ç<àÎö`Ëò9…ÈÍú0gÙQÌ]ž¥xt3—Ýò>û€Ueç9TÞ¤fÙ´ÑH×WÜ[QôÄ(8¢Ëì¦!à‰íÒ Žœ(ÄÅÍKYÌøèªÅÚ0‰VYDê<_2EV†­Ž}'ÍU˜²Šv)Èmá*¤Gt#¶ð®ê»„û3°þ¶1©NóvsN¶ª E-cÉV“'°/ìÚdZƒQµT£GÙv{„™ÂsÊÜ@o$Q‹ÈÈxÙ hd$šºEŒÊJ,p¤ P]}™+êµ,ú^- #‹Ÿµ"„¯¿$†º¦÷4gŽFÌN&x²;ƒhLÆ„'³ qZ~GeÏ[VV‡+Ø¥¦Œs›×‰Öi=¢ ¦z>‰¤‚áL\\û‚ë `’N,Ãu\Tm®$ƒÑ0÷Íd†Ÿ}ãbtD-H4ÅE8£˜µÎï4v.<_Æ”aäú™7̬±š»‹ÕDôT‘ðþk<é&‹ò…Lw Å:¾aÓõþPi+x/ Og®Ê!eÏÃ$¨Ö]¯.É€²8w’©²a@ p2®'ÊáxÀ3(sŽÝÐqÃ]¨ØxÆEù°6ÅñplÀ°>U¸RL;5\)þÎl÷­¤r.ÏZÎ%3ÏQôééÌꎡXÌØ ²±ýzÒ¤»‰%Ý>aKðzäèßNôT˜âLüîÉñÌà` •Ë©'C¿‰fÔQá¾Ó¡w<Ò–jǾ?Z}u¯0p |ò…­Bïhø¯Ô|&Vjá žÓ÷Ú }TÞ~¢Ñ(Þ‡Õ;Žiï×Ð…câ¸ûCŽ‰Ñˆïà]‰ì>þ¤¦Èî Ì|l†â¹ÏGëcS¿ÚQ7QmdÖp¯µ÷e:‘½öÊÙÄ;žeO<1/h´Z£Uª=Yct7,Àoî8×åÞZiQ< íŽ'eÇm… rÖ@®o>œG§”÷|µêaá+ÆÛŒ·¯,Ìöìãt¹åþnƒËÂpÒ,¼Né‚‚3î;Á¸·I¢¹}˜iF ¶ eM(½˜­AåÀŠæ/n:`(šü8†žK‰%ÄÈ$’©\X¢¦:IÌ.-œÓønŒZá0™Ö¢YÓL…HÝž’‰n¸„Ï€B&- ™3\ìL Åd)“²šÂ|e ¬¯H,\|²eX«„ZVÆj*ÖÎP¶¾jÏ)%+ª^Y¬Ún§Úå9*I†aº²8°»lŽ(«Jå·ªU!í1ç› Eu˜h{¼®Ì¾¼µÐ3;÷¶ –´šñM©—ÌÃKg¼¤Yj،ݙxXQ“è–QZ#ö%kD®¦ŒgýàÓºÍ8š¦ Ä㣇œòÑëb¡ò‘€±V3¥wËþ&†-{vï$ž'‚­™‰¨åbB_ÍëóíUQKÔµ3:Í «œÖ¢ª›PÊ—,X–pFžu©ŒŸ âÆd-SrΜíê>ËÂnû^ÆÆÍ’zJ¸Û£A"Ê–l…/,_rP롳;îj^á‚ ÜÅw»Äe ؘÀs# "sÆì)£Âå@¢]¦…{¨~pcoÁ©«ÇÉtg0½d).*C/¶{ÐË}ÐKÿ‡{™5±o‘ò±¹ÒüêšUØÂ\¿Ñy.ë|‘M9]ŒI$C:¹qdâ1ˆô²¥ Vgž8ðÇcÞ’D,|y¨s!Âô”Å š ‹å%¾ÕØ›,)U¹åËü¦’xî¬m5åÏ[­w㽖͉B …¥ø)ÉÄJdvB0B¬BÂz²B!†ÕjË"ê¶NðÆwŸ€=¶º…»ƒðú#×ewLf“æCÝu¡8[îó*Þ§Âîëãæï n‘£«„ï}ÞNž"¾(ª ytÆ ‰ „5!¾Ïx$ÃH éšt¡ú¡í×,€/~'³vØ¥ Í^$OõEDGØãœP_•údêð¥[¾9ï0ý¿]5¾8;œ¨¿®Ž§9ü~ùout®:4ÍéV)ÿSshìñuý/ûŸüöÔÔG¥:휺ü–¹żÿFÿûçÿ6ÝéµCð¶qá7úŸôï\Ïäô[îjwý¿<=ÿ!ËpÞiS_šW6H¡£4xÆ\ÃüÏ@Vy!bS±,Ú( !q†Ÿ—Mž”è ²ˆ!̳f¼R n—›hL–b©Š„¾1Lœ/¡ly+O«$Yk1#«§û¶¹ï}øö6ÕÄvתISM©&Õ†þ'#Õäô[æjóþÕĺ)ÕĶá7úŸŒT“Óo¹«QÜõ7 ¨&g‹øZþó YÐÐR‰ëûWo6mËÌJQ±l¦’³Äv%aÂX}Gq¡Šp¾ ¼)éï 5ÌŒvÉt0a•²5m°¾º€2¤Ú@°­–—VŠ\·œž™58EÍ`}¼'F|açzB±ÑZ·õÅñúðÖO Þ&dq)ÑÅ zD`wÊêú9Ã\]ÐÍ@’ä…$U•¶ÁÊ)` 9‰a7 |a*#°›Ÿáh”¿ƒ×ƒg aŠ=¯ÍZ™Ð„® ÙÒwªu3cTÏóÒÑtá-iˆ‚:Q¹_£ò9¢ IJ¾#+ÊxÿÇ¢»0Q")Ód„ZesÌùf–9™[­ƒÝMp@P›Š%ü¹A4ÁDPãaœ‘çSÊ8[NÅ)\V0s3¯îiÆ\ó¡zæQ=“vÔ?Éé¯4uxò $RPëÆßíjy¹IÏ® wJ6Ã?Iñ*ÍC ÝŸ@c`„R’QsÜÝ4gÍHý³I(b$‡³?y`¯î {u}7{BÙ•öß̬Zj%…ÚÍlÀ¾—H?δ$ê…‹ñ™’q"b-— Ø]'¶ÕT2`[…É€§Ÿ„É€¯¿e®F1ï¿qIì&“»Q2`7‘ Ø]’»«dÀ®\2`[]¼J˜óo/Ç÷‘Ïeg|>!•¾T™(%ˆVà eÒJ%Â%{3©MxJX×fâšêÍe›öåô!Õm(évMiT˜re;¥øL=˜ýMo1®äjX ú ÒLJa-D6rÏ( ·Û!ýv\Û!ª›²C´ íþ'#;äô[æjóþƒÒªvÂi{–|£ÿIh‡¼þ–»Å]£€¢‡K¸'N)…—â… êÒ‰‚«daôŒ7NÈWÅÌquÖ$k#1¿€û¦5í5Û4nŠmÖUÈÒêjÌ6ë £F1ï¿qa›¦™b›Æ†ßè2b›§ßrW£¸ëo`›õžxûl3s.¯vÁ–DºÇã̘1à¹uRÏ{óàýŒžœ";78ƒÈh0sÄÀ¼ºJß<7-œú|'rÚpîÕ’»£àh Ó5 SU…gχÈ:ÂDxG÷™[¤Ä2ˆ"ìÎ6*`wû$²ÀÇG« 0ÙÓºš¶ Näã(ëx¥ëû)RªÙ6Üá2R’µ¼ïã– LCŒkÛó•)}xO½ö˜BÕ„T¤,A¤¬Y*f¤å3 s¦‹é•InÚ0YW‹G‘ŒÊÃ,)jåIÎÕ¿ 8Olà<±“Γfä"ZÀÜ ¾ ˆþßÃÏ^DÅ·¹_X IÜ$Þ\o*uº±‡K­O—›â£ç«ÜNìÏY¸ë£>ûPß=9Û2Íø‰‡ÚÑGÏ1Þª‚»ý‚¾cænÅÔܾú•Ž˜–§R¬TÖ!ÙbÖÔŒèIcjøvFG™X†Â£ÁwüõPIKoßÈ–%¸Óßû ÷Ž!5‡<ñŽÆ¸fpnxï<™z2'̧NÒ‚ÂgWêcÐÄŽWjð\üaŸG1µÅŸÂA0½27Æ…ÃóD¿hx¼˜–ðÏ™¤SO¾ –a‚˜©3”9g—a!>ņ—o±›¢á¥–S2L°­ÌÑïõ7„< 7s¥JÌ©‡oOÿÝÁ5# endstream endobj 6739 0 obj 8454 endobj 6743 0 obj [400 /XYZ 38.2500000 576.500000 0] endobj 6744 0 obj [400 /XYZ 32.2500000 610.250000 0] endobj 6745 0 obj [400 /XYZ 38.2500000 266 0] endobj 6746 0 obj [400 /XYZ 38.2500000 576.500000 0] endobj 6747 0 obj [400 /XYZ 38.2500000 266 0] endobj 6748 0 obj [400 /XYZ 31.5000000 611 0] endobj 6742 0 obj << /Type /Page /Parent 2 0 R /Contents 6749 0 R /Resources 6751 0 R /Annots 6752 0 R /MediaBox [0 0 595 842] >> endobj 6751 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1701 1701 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 6752 0 obj [ ] endobj 6749 0 obj << /Length 6750 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èóÛ) à™±äÀ°‚o6‹E¼ˆ³‡üý¨[R?(}l±¦Š’zdcwÚÍIUë]Åwúüý¿~ß¿{þüŸý×îçóç]qpeÑþÙÿþxý…ö‡îóÞùrÿõÛîûþûîÓîSóÿï»öÏÏi>ýo¯÷nþûuÿ·¿7_þÔýÒñ¾íœrÍÏŸ~ÖN5ŸŠóÏã÷¿ìþúÃþ·ãŒýrÝfnÿý£ñÞ6ŸšmÜYúû®Muúûû×ßvïZ¤­â\å›ÏÊ»WµÕûÿþs÷s³@?}qðÖ(ãti›Ïue]Qz¯›ÏÎt¨‹;}\½nÀ®tÝl¡™)\üô—izþÉjÐ-5y»sv¨(S©øì_igË¢öðóë€VÕ-Ð\%’~v |kk‰é¸sn tèÆ“7XíþÀÏÄ¥ý b µ(«ü~„±Ô¶9?G†òÖÂÎ6t|BLé0sž]íÖ ìiçÜ@éi NΉٲYK³çÙ%€_ J‡vçR˜…“sb¶:BF ³çÙ%€ïl%H6§y…0 'çĬ«kAÌžg—¾/ÕÅÓÎ¥0 '—Öçê bû<»BsFpòãÎ¥° 'ƶ/z¡&íËìñ…“SãÚ aOÎȵ½îu¡º€Ô´¼äÚíιÒcNΉY{æ¡.–«é&/­œ×î\ÊÅ™]اæËZK"ü2½ÀäNËÉävçbÌþ)e¼•öà þyðéËîÝÇF-¬ö_~nvvZ°ýñåÛÎ7ÿ8zU¹ÿòÓþÍ~Ì÷_~ÝùãpûEÕ~qðuQéò´ávD©Óˆ2£½j†.#=S”§s(måÝÍlŽh8›=؃5­7Â:ø} Gžá:xoN#eœI#xoø L½ÀÍÂ×0u‹ÊâP9u„×´ Žì.Œq«lúHOïá¢bmPtû¦J÷Ó]Ù=£zx]FÚuꃫÊÉ»ÆôM€5žM×p6Lß§øôc*Æt@™ CgÀÞð è;àñÖ0Ø0YÃ=jO`€˜Íágr1ÚÄÖÜaf¾4VF6–ºGL¥ l’p¤Œš.• ‰Œnv¸%<=¦ŠhÇ žºP0-h’‚õM¹X‰r‘I°’xz(ð"z6<$ÑDtø šÃPÖSÔ)¼0Þl‚N¡ítµCPZª¢,qÉ#µªÖÂñ:L—t¤:  H¦††Oõ*íjŠÀ&q)uÙ—î™NœM’t3»:N¡·5Š/A¶Ø;،ݤßкƒ'©Ó3Oˆ™âUC”Uþ”×jÝÑ׺ÿvþw³±)Uuüá”j¿mŽjU^²€Ûo¾î*{PªÖÞ«óo™›YÌõÍïwÿ®Žíƒ§m®Ñ|Óp«P|ËEçpZÜÌ¡…\I±Åyƒ•­l~¸Q<‹˜³C͇2IÏ%äÉàFW3D}É&´D)!ÊÈË…Œ2BóÓöƒñ„·ˆ`¿:öcG'+o°‚s',Ã1­Âg®½€2œ¦÷x9}›¡_‹rú"’…€»ä0õ"E¶„ú+%@Ö©ø ù‚‡@»ðÌÇ)ñ)€<'bm쮃åA»%‰l =¤;”VFˆÂ™'K޽G2¯á®…=ϧ–¼¡ df‹Ö^“娳e G-Núç d­Ik¥dÖDh0¤ÕKŠÈÀäúê;/ƒ„ å½J=Ã×€¬(bC°Š@Š¥`ÛÙÆ¼»¼ùï,yý”¸%˜@°br鉫¶°ÒÁ¯#¯“q1q`IG°.M R—¬˜§(U V²_A%\uµê—„Šw„™";¹²"ª¥gËR~þ’Ir±%êÖ…½IÔ­‹r$Q·.\D{ü&LÔ=ý–¹™Å\¯Ñ'êÖ…IÔ­ =XCuO¿åofñ·kÈ'êÖꌠðLcÚ¤ôb (kó9×”À(ë²ÑØs}¶”qÀ>CIæŽð¢»Õ÷Gvðf4³”añuð¦³î€‚¤” àä°N*Emna•Jœ,H…ù($¢šPìaŒSŠúLi-Ä[´8=a’‚áÊQõ4Y°#_¬^$Lç$¿Â½‚QÉð·%%e{oD<¦›æ¶&Í--Úà˜øS¸ÉôüFRÝ¥¡KBšÀýy[T¬ÀëÊ$C(uø â¼—™%´äZpÂMfUO4ûº¨H*,L0ØðÛR|¯”c°`#‚¤ÂÏoènÁ6˜Ãʬê %7 © îºÊÞ§tÖƒˆ$ÃP%"9Psuñ¥×·HÊáJK‘ŒP¥’‡¢ð¹æÍͤ’,AJŠ ¦dÞ˜Ëó äbhóµc©¡øÖd¹/O¯BçUJòj ¾r¸ÙJr$SŠÍªò¡â„ÁÑœy©Iuʪeªë2T-ž;1tÚÍ þ+4RÖhD?¡‘>sw’™ûµ‡Çß*Éj¥Ø³¼íŠ8<µFF¨o ù}±NI8ßê5xÎóõÀF!’bÖÊÛƒjȵ)¢«u _¶e~S.—ÂáR8 —:~È¡<œ¨Ð5`½åYc’ÛÂІð1]G)ðàÖD°^ÓÑØØl.}æñLÀ£qëÑ“ðXBÈ+¼kLàÈ 1œ´Ü½Oªpå+N·ÏD ![ø ©‚ÂÇ(¼ï “Ti§éÞòPRmïŸxîñÛE8.„Æ£…kÊtøF ©w×ú_'WÄò•sˆbü”Û®»ÙÄcŽNÙú–$’òÔ?xVg« fm®ñFÀ¼Å&!ƒ&WN*svO‚ùÊš"´À4Ùlåé¼n±Aö \žÂZó W¼ ÈšÂãåÉ3VXïá˜+ô—K®Íópîeš¡E²Kx{5SrÐp‰âìdÐ)ácÅ<°ûÎ’ÅíÑ:!©ütÑ5Þ,EBt'rÓRFǰ.ô-î“ܲØ0*°ÁCìÁ{æ^‡àŒÐ ®Ãêš6pךàÚ{[Îq­ûn3Kvi‚sD.(ú½¶ãñÊ„þìLøxfi6(˜¨àHûÕ¡ È_ÏVÃgZ*{ãû¶22RÖé;+¸¡xAëtÝBGFºƒ5¶ƒöw¨}0Ò‰‘‘¾eäMñl½O×€h Öðíú4/]M‰ÀºÓZë~Û¡à[wÈÆ` G:±;ö¦œ­·JZ9ß/Šó‰¥Sré ×\SêGEÌR¹Wšr“؇˜ðÓ µR@ÀzIl„.:K.D$åçac%aØRÌ噄;0½ŽgB@①ΪZrÄànßf½ü.›y‘C Ý2›yzR~ 7ÀÀ¡¸þ´^p­‹µ®êÑK€ªV`¸³ÀøØsŠÐÞé­õ‘×E¬'<~æ=|¦FÏôXZ¼ yUC›ë:ùŒ\‰ýð™ í €oÚ%SÈ[ƒV=°k3È+Vd}Çf®qn"ÎrÂÎ?ì”îÄ{™Q’…¾ à±®Ø7–­Éå“x5¥ª}ð:”ÒÙ{¡¶ûNi‚Ç ßKJ/ç>³ä«§HוC‘·À‚¹å0¶a&RÆp¶­ªõhiùÞ80¼”|oy]¹Ì¯ÿæhÒ¯Ö¨€¯ þH4dãC$®q—…f‚¤8ŽpåbÅ÷/+W_ Ï„¥5ÖƒÞq—†[,h°Ð€ÏP’*H— -Xp.ù"Ù„öÁ$û`¹9¯ÆH¡¿WÔ’fh¦~­æPXÅ(aio¸*Aº`¶EÉ”{M Õ‚XC.A®îÈ8}„@1 §_öª)DLÑ2E¥ºC™ÁûgÏ\y•¼c±2z^œ¤Ø-}€_ʉ(”„´E“ê© zqÄaK+ºG)Ï}€-Ž‚»¼DºÜQF° wâÂ¥aØs†»1v)Ä~8‚W/[wœêÜ€r‹ÅP"uP¡¸KÒ„´ŠÏÛÑ„ Ó³å‹lª|®«n6Kõq´Í¹rÞ·ÛQ%S‚Rc‚Ð2¢£zÎjq[³*\Š(!µ³™ý­%÷;Z@-ÔƒÜ%ApQÄ5ïýZÌ>J÷|e¥Rlp?ë ãòsæ®Ê†oTÈ»¬žSáð åí9ÛU«”¨™¯“N KÍÏIGŽ5çdþKq³e°,ÅTÍàÙ«êûÄ’ËÒ]Œ˜yEo¦Ø°¹Ré7¯¯UÆÄmÉJ»:dkÊè”®‚ÝÚ£0¹¶ö(IÄ›«rAw‹¼)½m•d€ð¾5Ý`™­q=‡½º5êâ RŠOr¹ž ¦`ÄÈ™ÞÄò&–åÄr΢~§ÍzŒš-mKFC.+çú[xç÷“,Øé—Åe»GŒW Ù–ÞtÂ]“„¦sï]ï î¬ð2ɇŽ0y僤°.À"ÅÖ%Ý÷xçŠ^ÅfBÚn…%[×› À“œ,m…ÖÛp…By&Ôžz„o… ßÝ&™JXÕÁÆ3¬éÂÓFÉ[Šˆ;–ðÆV^Ë’“ŸÓ÷fEýuÓ.I“03åIïÝ+äoJL¶ž{¼—¸â‘\Uð³»J·l KÔNGðm×L˜®†ä-‹ž)‹~©²9“úÒ5«áÏzOmä>PÌ:àH®ûcWÀÖ¶x Û"ÐYs[ê±gðMƹ®}©ë¾SyD Ä-) (ÌŸUÝ]€²9»Â­ž!Da¦›Æ._ÜGæzÆ@u‡äŽ~PgnDÁ„õ(–_‚¯OGd«ÙIi”øð³¶w'µczìŽý’ɦʇâlö¶÷[»àè®W™°˜<Žëó¶ù®ïý…ÅDÌRhÂ`3›q$“lùÑAqPë8X¥K^pÖ~`n}Y¶¾,òeR} NJÅåY÷Jºrx‡}QžÉ~óçóobøí]ÿ·H?«WEÙ“v@ð¶Ž^p'§%Jbà'dÖS÷)Xg­§ ‰|ÙüPiwî*/k&5…£´°gí7Aª ¸èraûyoD½¶6ŽoÇ\\§ÿsþâ¨o×ç»t¶µÐå&‚ŒÇ7_ŒgëËt±îžÞiæ1RmB‰ñ>¼ƒÔ÷ºt’Vå!ŧm9·±÷±e:#ˆ`N¸Ò`ú‰b¾ÁFé‚K*„Á³Q6±z"ëdªLò꜑uúlC¹ó¬|éÎfùÄv@‰‹‘¼š³»*×x Î$P®6!³ÛâJ•I/æPâgËÍY²3éAlJè×ö±7àú¼YHø(¬ð†fÉtº\‹¸ÖYªµ¶ÞKùbÑ÷ð7ífªSuãÇjk83½¶µ+Q¼À0ã5^×¶×:–ŸMðh­²`ØœoàÂ-ÆnX¦ džðÕ¸ýÜÁÏõ¦p6ƒ/lÈeÛü7}]œ*¡m˜HÏ'Ûdv@ª²!y,ŸS&Él-~Ât©æ”Ù6,”Ý8ú¬Ïfž2RE5áíðyÆðÅ:~oˆG ßHÃPˆG<™ îͰÝx7[®~ ¶`“¿ÄPħ¯CÁ#¼úO'šùÚ¿9È3ŸG(y—,Að›â–@ŠÅ°Î ùß§òRõš‰ÉÕ¿£tgCsv#%e%’$FIó¥ô§¥t"DÝxÛ3÷Éâ8Œ®PÈN°~ühàŠ[ˆÔ„çKÒôqƒWâuóK„Gd±l4`€c‘â÷ˆ5"v´ðôkhíîÆZŠq#ö@ {}Ð'Àš«áHçÄÕ‡*,=ÑÐÕ ^Ð:æž8¶·Ý›¢”fl9Úð±Ù_ _°“k¸þ »ŠF^CáÙà3梒^Ý]È–JpÇÏÅùˆh; àÙ0 ˜Þí÷CWv(§­c©aú1xDDˆÏR„ ¢#³½ ×0˜àgžºt~Ã)#Ä]zæÈqÃDÁü}<9:ðð^«žÔ£ã sèØîÍÂ~YÜßàÊéwW¶|ÚÚý{r4 endstream endobj 6750 0 obj 5444 endobj 6754 0 obj [401 /XYZ 38.2500000 785 0] endobj 6755 0 obj [401 /XYZ 38.2500000 785 0] endobj 6756 0 obj [401 /XYZ 38.2500000 311 0] endobj 6757 0 obj [401 /XYZ 38.2500000 311 0] endobj 6758 0 obj [401 /XYZ 38.2500000 142.250000 0] endobj 6759 0 obj [401 /XYZ 38.2500000 142.250000 0] endobj 6753 0 obj << /Type /Page /Parent 2 0 R /Contents 6760 0 R /Resources 6762 0 R /Annots 6763 0 R /MediaBox [0 0 595 842] >> endobj 6762 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 6763 0 obj [ ] endobj 6760 0 obj << /Length 6761 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸ÞûWx] ’HEäÞ¤@‚è¢è¢ÈtZ šAogÑ¿_Ù’ìkIe~÷–mM0s3aH‘‡çÅó|ÿǯßþó·íû§¯ÿÙ~ï~>}ݨ+UûÏvÿëÝë?0~×ý~ë|¹ýþcó²}Ù|Ù|iþû²i'|}úsó»ÿmÍöOÍ¿¿lÿú·æêþÒþ/üØ8횟ÿ>ü¬n~§Ž?÷þ¯Í_~·ýu¿bÿ¹n3çÿÿÎúÚ6ÓšmÌ|úeÓS~ýöý×Íûq_qλÂlua‹­®›ßý÷›Ÿ›ôË«]]híªÂ©·|È™ý—¼u[mêf¥æßᇿ„–—_¼V¦J¶x»sq¨h[éðê;_Xm)‹ýEï/¹ôÞ4¿w¶ûç@s¾šQuŠ;é—OqáÆ§»ðvçâPé.<°zê ·¶¿]$Ûiù‹¥N·øaçâPé/¯.Ⱦë²P€4‘Ñiù‹WÍd‹v.•þrñê©©Ùy•’}—Oq'µOÈ*;OƾñêrÔì•òE '¢×Ë'X|ñÉ?ì\*íå†VOKÍ^YU¥c߯—O°x‘Nðw;OľC«KRsYvòÍU t\=ø+“ìÙÖí\(ýÕÂÅS“råêdÕøÁ.p!ýê).Ä¥ÓòºK¥¿íáâ_bÁ;iÿXz^?~Û¼ÿܰÅzûíçfc‡¶?¾ýؘjûnoÛ©šÿûiû{¥ôç?l¿ý²ÑÍ+S¶ûkGTGÜa¤Ü™ªÚ^°3§Fs¬jç˜]å´wå«Õ ZM?FÜÎÖj° ÷†W+Û½+›»<›S¡ÕqRcáwð®šc xb5ÓŽ|úÖàüÛе¡ j ]¦p@×Ú÷€z>n¦¨Î.Þ~8Œ»Â¶vÜpñœ‡‘zg»IŒ¨'ôîâýÎÌFl¿‘MÌéP|j5C|ïº=©¿`yõ©Ãk¼>)чñjâcà½ùÁ1'fˆçÀï˜'„wø;»µñ#x׺ˆ?On"ÀÇsðÑñj#— w€ÉÔx8¯6Þ¬ƒGg¸ Wt¼·ÀUê–&lý7íÍÔp†Æ|€Å å[©Ý@Àð _ƒÑ PÚÅN\‘•Å'‚vr àF$¡šP,áúXu¹Ò‚#ua²"" WõŠ:+£%a…€Pén€›%”¾ºÁáûr¤ÈòG¬èÁÕôsüwŠööêÙ dµLÖ.çÐPE(þŒ¸·ËåÃŒÚlï¼VE_'Xwx FF½Î<¦Ë˜ ¶ú´2B›~èmä‰Ù!f„PÂx öržÅ –“sD˜Þ2è›Ô¬ø»r’’5]n0 p L±×ª¶Þ̪c.È.Ú=z0@Z$p­^åÝõ®u;ŒA41ÒQôÔˆ‚#Ž8bãwÐI¤©9ÎÁ;¨àœ'8ç#œó ¼k¸ƒÀ-àÀït.0¡( 7¼x ãÞÁ‡ø“*7‹Ïï4Q¸k‹qbbÖpµÀI é˜\žæëþ ø†Ÿãï^;4b0‰Ržc0þc|Á0€üvö|‹jžjdéIVGÀw’K³yd këŒ[•‡±Xrbi‹eª,VvåãMâ¿…xÿ}1/Až³í§n¾¶]"lF«UÙ«<–0* QؼB˜~;h/ûH vx[‹@Œ½ØØdõÅàº{“xF{X­µ>GX,1$ö³?æô~êb°ü&Ãv3#fä¿röI¥#–t¿EùLèÎkVpÄÀ]F°–ùΜ­,-þ[У)6Ñ•XuÅÀ"%`$„ß)1èñjØP„GQ4ÀÚfdEo¢ {!DðÓ £ªÖ•Ÿ‡öÊð#øArË ïˆ·ÉðË8`-ÀWŒÑ>^8iÏ™~w½¤bý ˜’wçÄ•å«FUó÷°²ÂжôÜ.+<¡Å½±Â€aî&Y¡Æ°–e…„ž]`Xã9„†ü͑ƔógÀoh¨Ì*ŠbWq ¨&7,Žh±Šƒ›y˜Eeg‘þº oÆ3cµ?h\ì6v(Œ\8JçÉiŸØh?vâdÊœbò[1¿xD6÷†ñÌÜ}¸³Hõ‚Ëóóy.87†É'œmL¾Sb¶À$QiN˜j˜lˆ|Œ!eæn)EU=’U æ›ùͲˆ@ò ‘{¿æ|Ê–xÈ¢kîKºÍjÅëÃ4ô0Å'½Ý‡é -Ö‡éMe'¥²@—22]Ã"âF±f(7ºF Þ`Ô`ézmøáØÁÔjùjÅÕemÞùµzê|«cu©Ç©Ep€à¤K¡Ø®&ˆÝºD¸ >ON®ì8Ÿ1Áº*ÞRü18óŒ¥Ä©c O¨›,VÉwfx†Gê)[ËT~ÝÇÓñcº ã–rØö4²vD˜DmØØ#ˆÇ¹@ÆÚÁTIe:n-6!©ÄÐC†ñÌdžŒøô#4bZ=ЏÐÎwy:£°£œ‰øˆ0-¦h]˜Vƒ(cTˆ‡Vöºö9¤²yó\q Ó„ˆÚ z•ö™”þÌñ%·ôL«ÙŒuºˆêõ¢ü’êìÊøWîÉ[c•PºÁÑ÷ n·˜Vd)™rÛrôÕ]1a Tô& ¦³zЧUJŸ›²C¸/ïѶä®ßqNpf‹… žÓ§ŠG<в׮½7´sý@K|tÙÈ&?!ÀGO^&󇉿&T8á.¾äÔ|Æ‘KDÔçdêϱ§{âlg¦PÂhùýœˆy:Ê&‰v€•ˆ´!Ù‘Uªï嬋’2×'õ[Š,§ì8DÂQ@¢Ì‘OBÁêÔP° # !‘mO&^KÖ>#j„»~r}@íÈU>Döé{9—Š©V„o}ɖɫˌÞæFÆI9åE>"šjÎL)¯e¦Ñ=ý´Ÿ¥wO÷¶ÏtZ+Ó«µ{z_™þ„k÷tµèü9»§ûòØÆ‚¨M¼ŒîéÞ]í•á=Z÷ôZèµù ÷!÷¾>GÓ,_­•_™ÊÛ´¨{ìC~B ÌTÖN9kGïDLɸù3,¼£w]T+c}c½ËŽÞ'´x8Æš‡ìªrá¬Ão÷Õ¼&0dïFòûÝ#ˆV»6ðÕ6+8Ò Ü™að``58'ð~§åÚîÚä¸WsN.àAv\gñŸ©Ñ:oNµ³º½«!)LÍÁßÁ«å)Ò\ü±«û’3(ÆLNDU*H\¤z>ßç"àÖ¢®ZªÞ5ãü~Ú ü£LÅ"¢Ÿ©sÑ•K•«,±Ô¼c˜Piì@¾ ³/¢v:µŒTðóò:"Ȧ±PH˜IäßÓÃÉ&Y²˜vÚ§¥ièØ„‡Ë jžb'-_[5eþžrËhG…Û“}ä©Ër,\ú(s§¹(Kaà;b¦˜»¢ s1ÆÝk‘ĵºÐ._xŸoÎäαd‘mãSÖyçà*l·Ç&o\·‡ñ|ž¼"[ŒOƒ/¶ºS|Á½·5Þ–F öa¹‹WÃøï‡q/¼`ÙzÜ7ØçæË3Þ´ŽuÃT›â;G `oü\°x”S/€å¸ >\-_©ücë;תãnøê']›H„Î#L›DQ Ö!¾m".Š©À¢F$†NNþd¬¾ÚÌ%épEéóNQjÂ/’n&6ÀøþY€K–1ͱ™9TR®¨­ïQZ7Nt`Ålª–6ã “-Ä\2ƒL¢½W«(LxsaŒ?ŒiÖ!Kj"ÔÓλ5•Ë»š+{eª”2a¤”üÌYïÎÕ'-!Ýüõ~–nÞì´\¥^A~M7¯h±¦›«5ݼg®wûÝjºys†zM`zûÃtó×hq›lÀàöbpÄbëTF¦Rè>3è1¼å3‰R…[N¢T×½;.QêØøkÔF 'JY¸‘Ú¤àI»Œ=·³£ÇJ.“gy,DUôeº«aFYG½ÓCðífˆ’@”ÜuÀP‚­nØ  ÛEƒ1áF$ŽÈÚ¯ˆÍ¬×L‚ còÄ{‹0.9E‚K¤EºÄY‘‰Ã,EC3—%Æ *kÒε„|¯ÓMìNEwN)ðj7xkÃg®œû¨’,ÓýŠI,ºzÙ1d‰úÚ”cmÉÍp3)@¸ðnLŸÙŠ¿D[Ž€.[Æ#Æš?Ïñ…ÄÍ0Á=›Ï˜2×ÌÙ¡p$úà&écò{$ú¾8)<1ã¼dÊ„ßNãNãõÇœ›Q‰ˆ‹£Ò—W5àÎÔ€ ¾SwJbä—l!¾•AÊäYí†àNÑÝ0•¥*À°¼Ç#e0íÑ9Ž|ʘ[úÞYƒ³^Cìg²=pf%ö«á@ ì$΃G°Û»³sf:Tê˜;ˆs˜,TœíŠÝøDæê¢oøê4#|Ò ;£|Tex˜­F#ü"ÚÝ^þN‰11Ⱦ˜xù/ÁÜҰ9®`E÷ a<•S#5ZÍÎáXÀÜ€ïo¹mà³E,z‘Ü> n]¦ò#¡AЊiù‡›1iâ÷ c¡°0ˆö ~‘'N‚xnúßá‡x ˜§”’®’ìÕí+Ç)“<"â¥d2¨0¸r½+E×K†y±Nè™ÜüÚ¾4T$º/sáªôSDi©¨ô^IÝšþ±Õé)SäÒÊ>7A°íØìL™6RÙ«ñˆ}îæTÃXA5%ýŒ¾cçÂ-¦öö¹;)ÒÓ1ŠC”ÄŠG5>`G.SË»Mwâ¯çt¼WGÝЖE¸ýï›÷ aÇ ^ £€íáÝþùXÑÃÌ.î;¡Æ‹Gô 1-P^t`µgt ‹9žó±ÛÁ( `wf râá“Hïë,–tœ²»ŽížÑ¤Ìõ™š>Û/›ÿð5IL endstream endobj 6761 0 obj 4306 endobj 6765 0 obj [402 /XYZ 38.2500000 743.750000 0] endobj 6766 0 obj [402 /XYZ 38.2500000 153.500000 0] endobj 6767 0 obj [402 /XYZ 38.2500000 743.750000 0] endobj 6768 0 obj [402 /XYZ 38.2500000 153.500000 0] endobj 6769 0 obj << /Type /Annot /Subtype /Link /Rect [307.500000 335 362.250000 341.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_memberin_typemap >> endobj 6764 0 obj << /Type /Page /Parent 2 0 R /Contents 6770 0 R /Resources 6772 0 R /Annots 6773 0 R /MediaBox [0 0 595 842] >> endobj 6772 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F1500 1500 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6773 0 obj [ 6769 0 R ] endobj 6770 0 obj << /Length 6771 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€ÛâCÁ¶ÇCÃä°È!ðf7X¬™ì!?꥞¦ôQR©HQmy`ϸ5"‹Åz±^|û—/ÿÌ~ù#{ûá˲¯öû‡/§ü\yû'»|½yý¬Ïö笪‹ìë·ÓKörú|úÜüûrj_øòáoÍOÿËdö׿ï¯Ùÿh>üÉþÒå¾*Q5ß»~7•h~Êûï—Ïÿ}úûŸ²ß/#vÓY`îÿÿF™\iycbê—S·Lqýúãëï§·-–ÍRÕyYëLhÕücšOÿû¯ÓÏÍÝðù¹ÖJ¨JºùÙ”ºÊ‹º–ÍÏ•²¨“Wò:{e2!Mž•ù¯_<£‹ƒW:7ørn¤U ïàg£…¨.»¼†¬ÚÔ \ÑcŠøéG|Sá¿BΔngáàùXä¢nQ&sôÛðvDHY†ü 9;Vì~{Fgde¡„¶jþò£è6|€Á‹\…ü 9;VºÍÅ£snn)òprú6zôWy@¹BHNãÁ9w¶*Ê€;Ûùu’l.‡ÚY88çΚ¢²è©B è6<ÿàRÈpƒ·³c¥Û[<:ãæJÑZBlî«á ®tÀÁ¯‡Ú\Ï蜛«KkŽÈ¢€¢~øø¯d8¡ÜBÎŽ•ns£^2 ¥ýøi^½ý$ôÅ (³çŸà®s¶ßž¤Ù›ËIÝÔÙóOÙŸÌÙó¯'s.eÑhŸ|@OT Ÿ(8Ú|ò>°‰B áhð‰„P{ž¬ó¸Òv´Ï i­¤Šfd@R‡,D‚›ŸäY |G¾ƒï¼_N̼„™CØ$œ?Á¤„çÉ+¸?˜ÈXw[B¼ÉOlÄ<)â.Ns )Ä•‚TáÁÆ¢„O0•Ä•ÆO>Á'x=XÈbžëÁï(,01×â'!‹ñ÷¦àncõˆ•†&HHÔ‚‹Ï `2·LÖYvÑ-‰ü\V¢®Šè ËôEáÀ#!ÁKh;è©'j´³‹6}Öª ,ºÒ¤>×&¿BzCu Ÿ´ô¥Î…./»3ÐcïhA.á;­ì/ÎJÖâþ \¶íõŒAÉÚŠ#ÃËv4!ºG3FSÂi>Œä`èñfF‹••.¬;6D—ÊçoÆ9VF VAZÂËX¼À°BT™ÊBøœå1ÙŒ<¨|d9.,CΩ\‡…-ÞW-¡¨Ã4§\Z€$-ž¸ÐPgÂŒž[Ì×BuS~êô~ÑR‚«ŒÆžTVrɲpÄ ¾#ñ<½“·ü%äÀZ±æ}yVB:Èmi¬:«Á=õ¼oT5"/F`ÃóàÑ<@¼Yó>¼)Xb¸GªwPLãwº3€²/ÍxâQˆ•Ô¯X¢/àUÛ†dÀy°=äÁÁrñØ4¬„oó‘G±ˆKKØ]²Ð û«ö(:+…¦°ÙO±Ù(T0àÖÁk‹c„C’ÕBu/Í‘‚Gµ‡7T:…¬­c½bcH…„fí¥e'üÜ<ýda³ÖÆ«Ñ0‘¶•ùÄ>ภ÷Á&EÖ{`[ ñÒìu .’ÖÃ5,¯L"ø\ð&„P{Vº¹G !S“U«àw°ÙÃÂ$$ÉÛEêÁÎ !ÝÀ…qOSx#Þ¹"ì™ÇJÇœ ç¡Xˆ$~äpï‚A±*œoÖ’„Ÿgx¿0Bû@äbÃé0²Éõ=¹Œy¾´Okz˜ÞvÂÆ?Uà£ÍTíT@ZªkgiO/+AÜuís´¢H=zH= Æ z‚óÌ*,DiB”LÓ®ýÕ’Fއ58±4¤ykG¦SZQ,éØ"W6üAkþzû,X^D>¼˜$¢O(ëòÔ³Æ=Âv&ÖÆ1 {7±­Œ]Û8²‡#8¾ å+*ʃÚäÅ|£‹&L¾›kA¿ì‘8ï6¬˜0…r°Li’F© á=­o\î&t©Çp>” ŸŽq §‘ç^‘ׂáL½¤É:k² ¿À¥L¸‹\2Mµ–5aL°õUÄ’¥«{êXf,lÞ”ˆ÷.˜$Ú U–“ðà'8ì<ù$ÎêêbÅê¾;Óyl´x­„î›–‘h‘[C‘ž&T 5NöÀIÑ;¸ ¦ üN*Áæ"%Ìé'Ô{0JHÆï`nòŒ†±qà¡7,I‹ˆ¼¹ªÝœGã¬3|ˆ ´æópåC ±¨’´o*Ǭ÷6…ùR¬À|êö”®{œnÞ¬Pª3î¬êÅ9wîž!9j#„ˆ<¨®KguÉϾ]¸{úðAË#ÝaÎ »LwØgÓhmÐ7 .h­\A3 SJ.å¢ Êhé]¿µ&Ÿó=IÈ?X6€'~?ˆ4àÀ7A'.Èuæ½L%p…ÒiInQ¤f·N•lÿjíJhJ¥>Ãj;eð3i{· à sºGmo—ñ…‘îù»m<޹à1fS ˆÇ#aV©@Š` ’*~b%_Q¬0‚AN2Sy^JŒ™7b1Šç!\ ä) …œ_¾ÛŠk!»Gs `¹‰rf%ÚXûS=ÝùÒž”¨\΀®µ:Êðå­³˜VË©ëV+ÖÈžÜ ëV¿Cç[Ê~ÛÀƒã2×dÜs\ÍŠ)îšGpÖ…T¥vtňà½7Bbä·f¬ ÃX4"F˜ àhݹõ$o/Ý $k­¯ïdzÁƒV´ëªYT-Ë ±Ä‘Ô3Ec<Ì8¿ P¢YÛ¾a7ý9 I`Sc™pÆ'Õ0³›-=–eÂCâeÂ{G³¡8ìœ@Éa Tgyæ‰ä¢îÆ›²E¶“Ž^.ô”{Ä< Äþ‰ùáâIgT¯é¡³¾¬o7Æ!=hIÐsUŠ¢]Ðb9qeF3ö€7YdEÿÌî Jßcž>S³$¥è" ÛWË0kUü„Pç«f)–eá©÷-¦]e$¥ZuCã.«Œ Âý¶”Š¡4ì®ËùÿÎîŠ3kÝŸžðiï7®¥Ü²Œ¤T¼=šŒÄwno~vò¬‡rS2¬UL]O¨¼šæ3 i$¹êÙGÞJqÞ½¨ ”ì¼H|ڠ΄›R–í”uߤEÈÏ­{þrJø¤²GBéúô=£Áwìaqìç±ï¨³[c Dˆa´>ÁóXq;›Uc°IøŽYþ$‡±3Zv^"«± yºk$“A0<åR¢ÀO)ºñnÕÉQå&žã'KÒóqªßçQ`Ïבk@Ꜿ ;`»»"åÇ¥|—DœÜÉ ÅCø ½¬M+ >p>$éndVRÁöW >Fè…´+ÍQÕ=xá,ŸG³|‚hÚ€š©ÔÆÑL»Öá¡ÒY·Ó´ ^dAé"Ai¼'eLºt÷ƒ ‘”>¡tÉM¯)wx°h8oóT y ]XõvÌ*mÊ{ ^”æÉ#ùg„\hGÃP³ÞÇ3‹±Å=©/ÊBÇYŒž}„XôP…Žˆ¥'wh{êñÜW“­²(Ô ,0—ùÀ¯Åoµ‡KI¹ü„ì{JOA¼ÃA:2åY{¨ïÆ5®ûIƒÊÍšZ¬íëlH|Fá\MCpý§Bÿ¥˜ÆUÒôO©†„{‚¡Æ+Åóô¿žþ›¯ì¥!t/|žú…žÙz´i¨Pç\\ 3²[æ©@gm‹¹jäÜÜVe˳l«YWŸØZ!y.ÝÂ[¥5æ€xBó¨©fàc°}²+E­½°Fß@Ê!°Â.}°@Kh8;³F–!ðhðë‹–þªQ•à.?ç·FÖwÀ£aP¾Ûχ" ÷IY6B¤†éGá'Â!BÌK€íí -Ca €ßyo!\C…Ÿ`[í:Ân˜Attã'ÖÌkõÇ*Ö©ru¶b÷އ §`‘h9Å* )å“}>ýà7Çy endstream endobj 6771 0 obj 4485 endobj 6775 0 obj [403 /XYZ 38.2500000 569 0] endobj 6776 0 obj [403 /XYZ 38.2500000 569 0] endobj 6774 0 obj << /Type /Page /Parent 2 0 R /Contents 6777 0 R /Resources 6779 0 R /Annots 6780 0 R /MediaBox [0 0 595 842] >> endobj 6779 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 6780 0 obj [ ] endobj 6777 0 obj << /Length 6778 0 R /Filter /FlateDecode >> stream xœí]K¯ã¶ÞûWh >% ( d^º(0˜º(º(&Mƒ  :Í¢¿²EÉ×”>Ê<>¤d_Í ¹w,‹óâáy¾ùÓçTÿú½zóîóª¯þç»Ïql¬èÿT§¿ß¿ü@¹£ÿ½jœ­¾þzøV};|:|êþÿíпðùÝ_ºßþW©êÏÝ¿Tû{÷áþK§/üzhdÓýü÷ùgÛÈî71þ<}þóá¯ßU¿F¦ó‹¹þ÷÷º•ZêÓ2¦þv¶)ÏÿúÛáM€´Y§jUWÒhSÉÖ¨ê¿ÿ<üÔM0 /Ž­‘²©M#Q§™L­+©ÚìÖM&:ÿå^f¼Q"ßà畳CEêZÆG?:Ó}·QÖœ}B²uNu¿7Úÿ¹o_ÎÉhZ˜ `‡Ï€-ɇðóÊÙ¡2 ÎÈÍZ5­P“þ—á3 nLÆÁÏ+g‡ŠGndtNäZ‘“s/Ã瀿ù8·_y.ΌΉ\gë@¶Éþaôào¥ÊH8§•se@-œ³FhçÁ#3°í‹á3 .m>™Ð¯œ*·‘Ñ®V±¢uð÷»ö¥”—uMjãè9P¢Ú|gp¿rn  è†ƒçÆ¶nd>Á}=BŒjò ~^y&ÁçÜfÔvUÔšŒÊ´©…ÍH7½ºË •·“Ñ?¥Œ‚—ÒÌ7ß"/¾ýrxóQÙ³®¾üÔ-îgÆ·‹U_|¦kÀ‡bff&‘„{;"„MXlR„Öí>ÿSâR"ó`øÝŽ8ŠÀKázV©DøTÃG›nãexÅšÑbZ+Í5ð’B\-´$„FRV€Ã-´Ä«Æ!˜8 †îEÂ6 áÄ~?e¨âí„WŠ2)aê‰×Ÿ” ˜˜þáh‘Ö©¯]Æ Þ)ð™zM £†)ÏC X<æsÍ,aXwHÚ1ªViÜ Ï×ÈÉ GÛU(·SÅ-ç>÷(Ékp?¡ 3ãTGÀ»á´žÅÔ™2¸¯ëÅõDà»å¤=ù¢ðuöúz:Ç[…ž0§¿ÁS'àá“3’6ˆùŸ-x§J¢Ü%ÖðÌø  Ã"áð¹‡aͪAa¥ŒÆ&µ(¤,@…5Ž2»Sz-»Ìî̘WG¿%–YéèQl³ºJ¶ó™ç)•¦”=¤8Ú¡š{Òö¨êþÑlx4øŽ?@æÞiá<=;J}ì³p_ŒÖÏ#å$ ?Áó W †Ñl0š÷Í<:²'Ñæ¨¡ƒ}º‚~žú¨eO½—' ÎWíÏ>reÜ=¨ÕXîBzHˆ…ËÁºz67öšMÜž’¶îsççü\¡ÿŽÙÉ ƒ(RhaO"‡¿‹”&ŸLHñãa×X)ç&s¼ç{´=h :äü„D)гLâ kBZyædè‘„0fQL Mæ¨8Ïb˜GÆÐêðÄäCa»©,"Ô ‰ˆTH ‘xõIév#¤R"s°Ç‘× ç)o,Òí'mÁ Ý©º×KO3¹à«:Å ‚ÝØø:M©ÔG1È ü1[Z.®'bžÂfí¥'evgý{Úåjii=æLo™k4v"àÊ—„ýªÌQ¨”`öÔØ0ˆñÃZÑo—]KÜdÆ ¨g”]fLŒX¿îž6N^3 SrK<õCéž…Œ‘H^8OäŠ-^[)A™RÜ‚7囂ŠZO UÝnwL0 ñ©2ç“<‡H¡HdRiÏüéýmž6¬f*R¢_BzÍúyj“Œ2B’5iâÝÊ{_¹ LTXècûàí4„R1˜b׽Ρë”Û´ýr¹2Ú"N3B­’ ÊXR)Và'qþÓ²í £¼8-7,ÎR!šàgšZî1Sc©O˜cƒT;èv÷vI?€Õcj&!e[Ù"Aß8$ÛÅᚸû¶A*liÄO,ë<8—/\óD}¨}’6/ÂŒ|øn°32"1Û”ø^‚¡{1^¿ Û1þgÓ`Ó2&`‚¡šDô؈ÙÂ>‰˜× 1þ‘UóU"^¦ŠF-rÃ.ÚcO4ŽÙ~`Ñ~! ‚(Ä"7"$±×¿ƒÅ~‡’ºAIyž=‹ s+_ÑÓŽ@ÌB8} ‹Ü‚ɵ\†é.>£O%-6/>/d+ìⳜøÄzmsx§›*¨ÕØÈç†aaér©FA™Ý™±6Ã.rI"ß<YäŽdÁ+r#éÎŒüvÝÏ3q=Öµ~\ÝÏÕ‹0ÝQTá>° ÉâÙÑëÒ¢1T$y\Õ¨Ýqs§ˆzFÇÍ…,6àPÁâ³Ý.¢z<šÁ¥óÀ"ªÞwЍgt@\ÈbÓ"ŠàÃ~e"ê·ôp¶¨…t™NÕ8fí“"/y£ ¡K…3ý“"úö|ü[†þ¾{âF©íÜX ŸŠ„¾ ¤d`¼|újíF*#?d’nDo Ñ8å·TjkÌ=üDIöX=þÿ¹dr^ %kÒÉꂯP2솭d¸kŠV0¡Œ„jV8“HÈK!¾éö XmF€gm ­Â]+U_´ó&‰ÇÚ¹oQ?Í gxD(ïš7#·¥¶ A7"iM¥Š•.R'¾ñÊ>¬a+Þ‹Çb|ÅÞÜRÕæ9Ø'BCxë fBú¥ Iäç/3ÓÈð@-[p®¼×~j‘"`†—žJÕóÜ@Ã*½ˆ±B’’ €ž¬ßf¬šÏv+`8lÇ€BºôÐwÔ´Á޶'‹lÎB¼ 9]=¦[Ì9Šæ±)òj_›­Ò›f˜Ä×wlÜqýäiÀ ¼â:äöÒÓÐ3sªcA;Šï$9ãc—álå ï»iÂ]®¿œò|“aJmлÝõ™˜0%Äau+ÔúÔC‰'`Y4¥AÀêQÙ5ƒí¥”FöëQòö¤Õ{“VhäõÒÓ ”êV½Tu%)§ÚâÄÝHTüÞ«7Öe–Ҁܚ@ÃyvXÓ`­Ë5à0¢g-×?¹{Þ.CûQû'©…cýþÉFº¡.Ü8°ZmBðÔí¦-§ÎÌ: ù ¬±$+$!5ôéô¾’gX”i5Û׳fn7!ë’¸®èB˜ܤ”ÐYø%ƒŽrÛ}–2i o9&ì¯'¸F(>ÖbÉżÙ)[>ÄXj¥àT }cUN\Àg«%¨¬~Ú£Cj!çµõ¼“Ú¢EÁ‘ߺ«Äx¿÷<çEî“o)•‹¢Ï 'Þ×j…RÛm¯Úª¦„ à±höL«{‡ïšX¥¤ÜOWÍ3’M'T€mX.èß‘ëþ…š0#ã¨q‘›š†³eBMYç 9š´J±´¬u3 xñ(iÿ —âËâ­xAÁÄ $1cF‹/_=ž5B‰„¬þ»ô¤,…!¶XÂê…™¤o¤ïb(BÎ ut,¥p°áÙï™Àl¥šÞÀó”ÇC0}ðFdPì·7¸‹°ÒD©ÊµV°sɘce›kÍùeqt¡ E¤§ŒÍŒÜoqŽ¡Æ±Í„~Α¨DÜÖ˜R GqSZâ¶{¸!Ä)îÆéºC4ÖR?Áûy²˜}…2¯¿ÌY‘hh,1õbЧÐ(… Æc«f艩ázpÞA$»ËAJXÂII¡Šîq—]V‰Î%«Ždr°Â’WEâ3Š ÀÐÁó`JÄOÒ!²Þœ/ÅG0)‘’¡¤ $.æ)ÔzHDŒØà(q”®…n¤ëç?oÀÞùBZ¶¢Ãw<ÃÌ…ó±Ú»Ò$…#í]iØŠÕP€Ÿ”w·ò`„V)ÁnÛ,NhLx€>G‡ŸR,ûÐU¬¹"<7¼Ÿ9>Œâ¨V ”O(ÔBèâÂS®TÓB—æÓëvlP´çbŠp²’*'>ç½'k‘Cã‚Ów?N^õqR,…" ×°»"ˆÂ(I ¹ÑyoŒ˜ôvŽF>{—8ßL'C抩˜ö±6´ýÌ9ÝÚôQÅ(}M0÷bAÉ[Âxõ¦(ÐIŽÄ¡)¬³ öY25Ëí1¯Ÿ½ÓÎCqÝ8ˆlû.ëœfF59Â9*dGnKø kB´ø¦) ¬å5Û·Õª ‘·a£d,ªf 8¾…× 0{Sâ¡p|$8îÄÂÑðÊ ° ãQ ­í‘Å|Z¤ÈsÆX翬;¶ï´P麽,¯ •¤ŒSLÏ{<¾qq´sOñ޼â.%8+d©Æ@¶ËàCÆSìyƒÙós÷Ú¡Øb)Xg1 æ‘áù¶÷ÉîCØûŽxêó÷.+Õâ=eï;ƒ¾÷ÙûŽ<,¬Kö±cú¢æ'X96—% ¸Xé·>Ù ×Cæ†oô™mH<|Çk(2ië/È–Jp§ß»ˆ†°£ “€àÝ>Êø:™6F¤†éGã'2 BÌK€ˆŽŒömCc €ßyëW0)㈟`{Ýl†Ý0ƒHhäÁO"¬™×Ÿ¯w±N#ôÑ‹Ý+‚œ‚E¢Ç@K‡Oõéðš@y endstream endobj 6778 0 obj 4862 endobj 6782 0 obj [404 /XYZ 38.2500000 469.250000 0] endobj 6783 0 obj [404 /XYZ 38.2500000 469.250000 0] endobj 6784 0 obj << /Type /Annot /Subtype /Link /Rect [479.250000 476.750000 516.750000 483.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://c2.com/cgi/wiki?DuckTyping) >> >> endobj 6781 0 obj << /Type /Page /Parent 2 0 R /Contents 6785 0 R /Resources 6787 0 R /Annots 6788 0 R /MediaBox [0 0 595 842] >> endobj 6787 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 6788 0 obj [ 6784 0 R ] endobj 6785 0 obj << /Length 6786 0 R /Filter /FlateDecode >> stream xœí]IãÆ¾ëWè`4¬EA€Ù:@3@FÁ8N`ØF&>äï‡I©›äW$?¾*’j¹a«-6k{û«·¼ýó—ÿõûñí‡/ÿ9~k>?|9d'ï²úŸãùçÍó/tqj~?ú¿ýzø~ü~ø|ø\ý÷û¡~áˇ¿V¿ý﨩þýùøÃß«/lþèü¿¼òÕç/—ÏÒ«ê·ìúyþþ߇¿ýáøÛyÄvºf1/ÿÿ)µ.ìy#S?´ÛT—Ÿß¿ývx[À¼Y|a]^•5ö¨J«ÿýçá§j‚vøìTZ¥|n}¶d"¯Ï3Y_•.«‘´ïMtù>Âàyæâ ~Y¹ø©(“«ðè§Âe¼vö è3]QèêwošZYÔ‡V!Y ˜´ÃG€‰SÎDĦóÊÅO¥8=2ÀÎU}h¥‹’ëè1àm\<¯W.}( ¸ñà‚¼ÛÙ"¯ÇG äÛè1ßÅD›ËÊ¥¥…,<6çÊD„öuôÉ‹ˆBá²òXІƒKÒ±·Ys<®¯ì-? Ûð/ʈ„|Y¹ø©´°Å£Ç&åÒÆ$åëè@’g*")_V‹”áà‚¤œg>‹ÙÛè1 «lâ¡Íyå± ?we]VYUè÷E»2ÚF„öuô1e<—K½òXІƒKÒ±u­Â¢b€ö6|„Á]Ï$«W.~*-l{£ž3 ^Jý pÊ~¼øþëá퓲ª:Ìüøõ§jq—9ë¯Õ¡¸ã›³'¶Òû¾þxüc–™:~ýùPžríÚ%6OÊË“O_«M-[O SiªçÅäÆ7S*}™²8evYÏu1™GO”…ï|¸<±'kj?ümkª~çö§9>›?|öéòÄŒ.ÔÔÑàóÔÛPÙ)÷ª¨ÞžÔ°S—·nOÞÁÑÞ×ïèöÑ„èú‰R'gó—+p—'¦}ð쉅£•Ä0£a4û …óÔÆuð¾9Æ"Ì y6 x¢ øŽ‚ïäð¼6¸‚æ€#²£uç (b¦S{CQ¦%Ý)OD™VÇxG) Óæ*c40tøÜ  Òg`Õp¼kà#Sy+t1_7 ¨Œ=k(‘†>ƒKá0…0ê>Y¼u^O‹«y(]]O›ƒjÄ'ø„P#´‹-;”±Óõˆ$D­+Ô¥‰îª)ŠîÖ>ÎW¿°Cs}pG “XÔfó ‹9?Y•WDdd•„vœ Ë(‚e"^£ï`Ý>–äÏè‰ v‰Â‡qŽRÎ^L•ﻈNð”ÞRß©¼<3Þeăœ3.-ˆá)Þ„Gƒô?ê|ߤ'4²WÓæÍ6²©)²ÿQ©®"öµB¬/WˆzÅ‹BŸ—]n³oó<æW‰ p(LŒcN›˜6…ïâr{†¹§AÆhRÑÔ™aÌPAP h}©z†Z°:§ÑX°Ú‡€I6Ö@„7b0‰,ITU¢ÜðØ´ÀNpÌþÓ‚9â€û€¹p;ÑÈ.Tc{n, µ´eà“§Ø2S™Âw¶Ðèí B<}êOê’n¶Æ.Å w%û6ËT#‡mf~—wÃt{Sâ'Ü”lYݽG7A€2Œ¬õf:Ë^ëæC˜ýNçNŒøêŸR¢ õê–¹ÙÇ÷êDtHªØ™]‚‰\×[68e}ØXgì®Ákû˜@‹iÀ¼Q/é+$B!à Ÿì.JeÂÉ» û†OŠ%&öpßð û@È0ÞÏFå ÐÊËÐRïæ¿Ã…+ G"KŒ‚pZJ¢™@˜=ÆXxÆP Ãe³øšwÒPSQ,¡&Œ—øÅÒÆwWd~ÁîJed7æùK_Ï?'¦ìãrûÐâ®OäBY'œ|aZÜn(ºÌôh=´¸H”úÐâv©Å•Z-¡¦ËÔÒ.²ÏZÜVx¾+÷‚q¥_€ ©´¸×‘¬> -—©| xh~)¹€ËŒ{póÛ“Õ½t>ë{Ä>gØ—û°uñʰÏ/ñQ¼«wšÍÃRÞ£¥ì²r‘ßiÛv‹Sj‰àî¤Ûnå„2ÛÀ¸p ¹SE«Êëz™•je[f„Táò½Ó3¬·’ŠG „aÛ›Ü{­QìNu¨i«Œ F±—]~°Ó(öÕƒd©”ºµs¤çz‰)š¬ëRÓ#ø•K“¨ß w©ûn²Lgªv§J-ßù ‚äeQuºÂˆ·(ÝHäóœÏåOo ¢Àw ÷j„WO,Š®ž¸O7Ù=¹|afwE ¯W%f ÔÌ0äÖR6zkL¦cˆK¢²îÙ¿a-dú»ziÊוøvì PFùaÎuRÝó¡l™©öÐ.QÕ§37Ê9*Ø Õý½õ`V­ 2] d ï´†_o–D ¸Œ˜ªÍ=cŠ©ïm5±ôå1¶rÐ5­Úïs'@©çqÅ@‚º©Vrpž¥¾¾I UŒ‚°€+¥âõê>MÞ×®j3®V¦ÏÓ.°æ‰Ü-ë—™°MF“µ'™š, ädE.Ó-’ñ2®º»é=éè&©›mÙ’Û|D@\‹×ù®±¿ #rUt ~à/˜ã‚.·åJ ‹ß!'/{4ùžTT¬SíΙÜy‰ï(‚9ò-‘ëRån‰b6²¬{šN¢d¦”`ÏØc”F¦Ú›ý”›šxT]¶Y38œjP/ü4‘¾DšÇ<ód cé2Q°Ÿ†I@À†J‰Ûp.So‹É¢òOøà`,g²²qþ-^ÁXÎʬs äãy˜ê>xŒ‰øÜ.Dp»,ažŒ1mЃs%7Ûâs.ûæÍOg47gÞ<¸jÖx¶ÌUcH–ø—\çf͔GD÷PƒD¸T߈ ÷Á ñ/‡EîœDaœy¢Yc3\6ÂqøŠA"x„ºö%B¥©f¯DSûþÖ™ÀA‰nÌ)Y=ÿ”f4¨H㎛Å}úÞÆ­™äb%ëJ­¸GbÞÊå¾+ÅEᦠµJuûG5– ^/öЉxX«##gqÔ!ÕQTgÄLí4L”I¤ tF œ,J!øJ§;Œþ~" TÖ“ê²·Yk÷ô<\xñc TV˜ÉÀ³v>óYÐáhÅÈí9œo£›ÅŸ lgø„zŽ1êÆÔßLB55ÕtÖe‚Ä‚'¤éLö±Á8D|Žu#ëâJü5DT"—ƒ½œkq:pN=zùÍ/‡/‰³˜>¸ârIÅQ•ƒå`êˆ «¯­e ËN5À{úÅÐßl@w±$0|G¿ƒï”pž¢Õ¤º£}K1Yi&>Áó˜ÚQ¶%ˆÛ¼jxÍ¥‘?€þ+h®Î ³êF‡šçz'°6ü<ýßùWÁw>ÀµÕ¼'?¥;z”!Î ®@•±õŒæºÂæyÿ ºi!­KÈ4\zÂ*¼|†­C±OÌýâ …Í²î˜’9ÞSÑ€z‘[]uÌ¥6Ãäšrs'Ráxâ¨ÊFn°ËnÜ‹\Ìÿ ÓÞhœÏ¤ŒD,x@ágp$F1ÈYþ³9Æ­jU“n)©F9R®¯Tâ@„F5éde,~ M6ááÓ ü€dÇɼïˆû^Ù }Ì=e»˜Ûw¬º¬u«ùøVŠ(¢v¯ºY@Dí*yúEcÊd§Ú6Vø¦æЬ¡P_â‰ÁuƒˆÒð8ÌÏÀý1ëxMñêà(×C/ñ= [lj=¸uŽ(I€/#ÞW¶¹.6ƒzš¨ôÉDŠ” MtGD…Ö‰–àkHjÖ%‰ŒY º ™ˆQÆO@: âU0Þ‰–pÇŠ(ãm`ŒNªfF¦DÜOJu,·WnPP²|°2„ /bQI(PXìáB¹‹~ü„è m,ÛW+ÎÈzQ˜²ƒ ƒžŠƒ|pÒD ¢unJV<Û¸hVÕ®M4œ(w£{xp¢Ð¦Oäö9Ñ-Rq"œ jp"d dƨD$Ï&á’ÆuiuŸ\r׆||sÝëÎq ™ëD9P*ÿC4Ö¡g:>®!VHîX½¤ýëóð‹•HWäüµM3ÓÞ”‰KgÊ£l¶¢&0Ïû„'mÏ‹{à2*X…@ B8û„FE±¨¥¯,Ž`ud7:…?‘õÏ*€W˜: ÎâõyŠƒ†ëF0É– 0iëåŠüzó‰áêf­Ô­°¬GF¾P „¦È&’29Õ«Ý^MT•-œ~·jp›•Ò?nVžïq³RvÐû33¸q‹ßÁŽ8Âo(Y†¥3öŽŠå ‡¼–¶K‘²^Kƒ·ÇTÀÄ´ŠUR¢na þ^ 7 Ï-wHËxî]Þ!=C |Œ¯ç ³(«ÒÜ;yÛd2ŽùÆzþæ+ºÁ˜gîºÌ&{| ÉeW §¢µ "wëH–¡u%:5ÑR6•W@¤xY ‡†©¡ÙëÆMTk‘ís.SâM¶¸hB?Uߪ3•ÉDûÅQóPFÍ õq–¬±›,¤Ê¡Þ^‰€õ[—®ŸNÙßnó†Ì3‘†žŒÖÓšˆ4¦´VñzƒC¢Åá©âCXœÎkŸ«ìzŸ¶zZcàr»$°× _V¾¦ÄÕ\iý€ð”àHX¢ÓºX1âQþZRtŒË&AQ}ÄYES…dS•jE¯îÿM0.m__å„TXˆ¨Z+F—É®E¡ñÁĤSÑ$"±ÛL ôö ÅÌð÷kÝÖk¤ ÒóŠØåbÇ£1YÚDæHì\Õ;¯.VDý3Lr‰lÑŸHt!%ã©áŸa`ßltG>‚—ëšÆù—PÒ¤‰Ð¢@¸ 6QqôÓBw,/eh§P eÂeZµlò)¶·Ô€#gpÈÅ0eNâÓg-àÞÀRD;é€E6Önžû R#Ó ›q=œfA¬"œfZÀ¸ƒáCt= dhaÜ퇈©‘ Í H <ã¡!‚…1ý˜”ÚÂ-°ú¡-´&¡á¡-¤Ó¨žh ß rKG[¸KÉP«QȘÛqÐŒ¶€ý·”,X_÷Ht%+—Q;âö¦MÑÇ­ÍdË“œa½Ê• vlÉ»p‰!·ÂAyL¨2žG´¿Õ¹…ˆ… øç˜pmÑÀDáè%fmØ÷ÊN–=G‰y˜«@a ¾ÐÕÑо˜o­;ró4¸rР-Ú»‡@…HƺÇ¡SªJ2ž.Q}WaØ.}m°6|n)£¦Ü5 wi]¡êçø½ZRpÅŸÇþ`ß/S`+Ž™©3?jû’CL¼>a?À1kV­OºnËÛƒ~ÞÒÔ9Ò§¼Û÷µIð’çÑ3§†í¾ !H)˜%êgrFeËçãçÃÿA­§“ endstream endobj 6786 0 obj 4422 endobj 6790 0 obj [405 /XYZ 38.2500000 662 0] endobj 6791 0 obj [405 /XYZ 38.2500000 426.500000 0] endobj 6792 0 obj [405 /XYZ 38.2500000 83 0] endobj 6793 0 obj [405 /XYZ 38.2500000 662 0] endobj 6794 0 obj [405 /XYZ 38.2500000 426.500000 0] endobj 6795 0 obj [405 /XYZ 38.2500000 83 0] endobj 6796 0 obj << /Type /Annot /Subtype /Link /Rect [93 668.750000 137.250000 675.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 6797 0 obj << /Type /Annot /Subtype /Link /Rect [264.750000 433.250000 348.750000 440 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_operator_overloading >> endobj 6789 0 obj << /Type /Page /Parent 2 0 R /Contents 6798 0 R /Resources 6800 0 R /Annots 6801 0 R /MediaBox [0 0 595 842] >> endobj 6800 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 6801 0 obj [ 6796 0 R 6797 0 R ] endobj 6798 0 obj << /Length 6799 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s—ÅEìîq€6à ‡À“I0Ò™Cþ~ªJKuSõQâ×”ªZ6<ÝÓìâò6>¾õýŸ¿ücÿ¯ß÷ï¾ügÿ­ûúðeWê²hÿìOß=ÿv‡îû}íÊý·ï»§ýÓîóîóñ¿O»ö_þzüî{½ÿËñß/ûÿ~üáOÝ/~áû®Võñë¯ç¯M­ŽßÃ×ÓÏÿ½ûÛö¿fì—ë6óòÿß™Æèò¼‰¥Ÿvý1Õùïïß~Û½o·JíªR{eÝ«Æêýÿ¹ûù¸@?}qh¬Rueëâ5 Õú´’-Sèæ8“ªF ÿ MŸ`ò²ªÒM~Þ¹8T”©TxvIäVÊõȵ @t™>ÁäµIH9ç‹C¥G.ž]¹ÍI<œdL]¦—Ÿ¼.RrîyçâPé‘‹gDîñÒ2-€š2ø‡ÙSàVWuºÉÏ;—J‡Z<ùÁY£L­K{Âò Ã¥súø}mº?¯;•QMBl³§@ˆU Ié¼óT؆“KòqYé<ÇòºLŸ`ò:¡îÖî\*=nñì©YÙ?hí€m˜>NŽsé~Þ¹8Tz„ãٹٮGnѤ€¿Kˆ\ݤãævçâPé;žýsÌ,x+íOÀƒþ)ðÁ_wï?){z¤Wû¯?7w^³ýòõ”rÿîô>Õvÿõ§ý‹Â¸?í¿þ²k•.û-¶#ÅG8Ò Uà gÃ;0pä8òˆF ž ŸïMÃuàI ^§ýÌ_”÷Öl¸Ÿ³E@ç!+½\[§ŒÁ³Yx ÷†GTE`ŽàÙ(JÄT…w°8]+LoyéZ@r5@lÙ¢[ë—lï®)ÎûñA˜EŒVÇ7HǦŸâ…eñ¸rô˜dqâ½i¡œ‡Æêa§P¤MŽäÙ©k6¥bÎyîP¡¬ ·áþ–dׂ ¥‚»^Á(&/'T™º2/IB‡ªV®.Gl¡ÊCјºÊ¬iC|p(Ýùà¸ö™–øËƒÑN½T¦4T³Z„¸Ë FÖáÎJ[¹ÇPýI"ÖÃÇÁ;‰XÂ'°0\§c“k;`>¢Qœ­†#Ƥ…Ø(ãÁXx>`˜ãéȪŽMO*s¨ ‚«{9_û ¦.¼ëpa2M‚QŠ!‹‘Í`ð!¹˜.+ON Œááƒ.  Œ¸07Æsܹ¸Ëô ú(À8̬‹÷H05sâ"g„¡þäÃ|}Â7B h9Ô'&.òT%FSYž¡E(f¤lŒ~@ ç¢×[ 7vY6Uã?jFˆ—t@XÏea”Ï &žËÍ#¤A<ó$±…è«#æ5ÀÜž˜S±Æ‚Ÿbó’ê1žbLo–ª«Ò£?B aèœlÄØ!&ïÓvD©~º9Å;Úa»ŽÓ›BX!Àb“Ï “pEBâÔ…ö¨“²@0ŒQ¦0~ñS˜Ð"ŠI[ÄB‰I/̾o)I€GdY³ê‡É—!4(Tôò‹±°Áͮڰ3Ÿ7(E€¡?B˜­ÙzÇÌèy“þ&ªléëI òæ[\#6~¨áaAÀÜʰÀ ψ{þª5„dͤ˜  ˜ G@‘ÕGÞð‹ ¼ë±M[BŸ{{vœÎh’þ=íTÝ£®ÝÝ•8 Æ $"ßdC*IV¿µ;'‘×gºzN8j”£æQœšOq§Û—$gûk¿£¸gû\¿¼;¥±Þ-ùv %T4Áâ!”¡‹Æ=™ÉE‹!ÁmãèAæÆÙÙ±'˜+”å—@#Q©Œ Ì ¢/wÆF1&ÆÁ˜µ2)ÍLtl@æ3’2ëa ¯XUçß±">à‘|Ó¹/2~]F&moI¡‡Ö2{æâæì{{5wæ”ô&·FÙiÒƒ×Tsõt}”¦ü^¸®!E&cJ–X#PeÖG T['Å•94®'‚Ïó1#†]5¹Ÿ@…•u×vªRò§»7º ìî-Pø×÷Á|kèõpJŒ9xž{Ãi‰ë<­¡\] åzïR¾\ Òb›¯ij­‹>PòLqmÿà:6†x B¼âÐ;F·Zn–ç“bþy3¡ÅkCÕzÈ:[yH©¶öNid“Š÷‡ÓM*®W*NXWt3ô=Ç>^üv†Ÿ¡âDãv?n™¦¶Ê¦ )6’¦­ŸóQhÊ¡1 !î4¼Ž¹2ð…ó”žÞÛ]X‰Äý܈ç¼TÅ\ÉïÀfä³Zõ«bCÊÆgŸeä3«Dù ›ÍÊUp`ã]ÒÆ63kÈÌJ˜§©'f†ûlâáemù½ y§œnD*D¢âÑò5×WA+9EVÂ[ˆÒˆÈ` %¢SËElX_EXY©´1í£LX™ó£<©ˆÃå›%®²óTe”G 1á¶é ¹JÝÍo‚ ;C€u†UÕu†ª ÷ü§ÎPiÐtZÈCÓ½‰Ò»/^ÉkpÓ”éâ÷+KŸ2s÷,s]èò³K&S—žÚºaÉwé ôïY¼KOws_ë„ûêt<¦ªž/#¸OƒFp7 ÀàÈÔÒÛ J=„Â/ž%RO Ðë¾—su1‘Ïö*Îi?¿—@aó{ö޼Œÿ)Z”¯¸W$¬ïÄ÷ÖÒ$[Õ>Å3¥U¡ÖþE·þWw\…6¢¦US”‰…»Úfâ̶–ÁV`ÍdG£2ñn“; ÙE™^ÒªüW¦b¬ŠšÏO u¥ÞrtÑ©•Ä5)êŠ'5|Íœ!e¯K‰{fÄ(Ëï>â6Ù²[eÈN6¾3]d0UÙ>&:qÐ;sùÅ׳Ò<˜ÜrY-‚)-sÉ.ï/ÖÐi: ²š×’Àq,Œ¿Ãq~ÇìñwhK&7o´e W—Z9™ó½°ˆ˜È@t.C˜úˆ‘Ut¼:jzúܘæ1|1™èg _÷x¸Û\'…³­#u¼rO(z!`…SŽñmÀà>pBŽ1;`Ò®W"EšP”Á™˜*àŽƒ—Õ+ÿL– ÌU¢fÙåK]4¯ Š}ÇfœA»Œû™x€Ön†mL6Ÿ0RŒŸV‰£À×ÑS¶•yXckSq•(…°hnº3}Á2¬Éá[6'…5FüêÃ/&BËÄz!ÎrÕpטyI­óE•\ç‰.¯S…îJö_ÈBaµ ^³%V&1°pub\§Ä„ɤ8ãúB¢d€uFÃÖ)Þ6ų$§éæÔ`x¯x¸tÄ- ¼,ðëaÍb ð+ˆ]c{¶Aã·„A§ÞæaüfèRæ[µQz«›¸ uLV/n.d7„u‹‘?s›bMcÑM˜`0 0tá‹il¸Ã»ë±0C™ÁÀÍkØ{›eZ·f£8%0ágpi#æ±lávrá`n ìZeä¦r†TÜÔ‚ÀÆã-«åô†° ˆQU‹¸€ý‘¹ªÞWЧDž:·‰M ŒÄÀ@ŒPùÜîÈG“@ ˜ Äl—agŸ+ªá“œ™¬]™ØUјo&K"ÑÍÃAú¢Qº1¹žDÞ€p¶¸lvN®º5·”ê›8ߎ ´_¾¯Ýè€`ÑÈ„‹ÇÔtšÏâ¸É3ÕÊM´cï¸9l›!‡ÚjÿNLÛ ÑÇ´D.+ô1?)„êÐQÈ.E¥ÎÄêbáÝ ôÇKÈ„uÕøL¸¥½­´©£Sê^›:ÂqððI2‘½‚aÀ´a”…ã2È|±¾N•63•¯9CÊ`»Õ )§j3Í[‹gHeã-.µ†ü$§šAñ+‘9½ª6¹ïº5KáÛvR@Û×ä¥lR ¯Е—¦ws©A³BÓû ËFl¦êÍTýÚÒp¢ÖKÆšµ˜cŒª Ì”À"؇)›S[…( š­&6Y.YNT•þåsêˆ1ÿSM¤$úZÅ46alçY›„{+ÂÀNuBcw×LTÎ0±"wƒ.ÞQঊ?®¦¾aÒ:£eåߟ7åC".œÀÞp¯ŠÅêã½âÇËÚdÂÏXÒd:àä5™Á–4 ÍíÍB0L»ÄÑf #Vå'!kc}BžaRG’xôÈöO\õ“¶¢pTNDuo,7ÑÀþM¾á0áYÄ+enœ·–A‘22QÕÞEõ>cÊ•ã8íz>wG˜l’¡Îù;¥bIô ZŽÎE¼©"{Lç(Q·I„ˆ¥ÚiE7sA0êú½jܳ”&p¥K'wÒb¨êÆÉúZWîüL%FŽEÐåœëã{Æ8`Ñ H®™È”Á«R¯ágÙ4®´WTW)Ñú̹Úä¥$#6ç¿|9±èC·WÍUK[뙲ÅPµ ¶gïÀm¤îÎ:n^gßù€>ÓãÚl œÍõB¶uÇŽ^KG ÷ý±x$°NK­ÕÁœ±ýü3-¨ªÇüezà>oÿ_Û†p#ö¦2˜wÖô‘ÑÙz»3oQ_«°=>q3ox Úª;`!Ñ€²4‰ˆjѸFªŸ¾R±ÝžQ2™ùI oU(%—Û!S¸cî ‰GµØ žñüIJý9'÷”ѲÚúcõÎA)ܽxµÞêu2¨”°ÜkV05‹z)³ÒâѤ›|¸uùYIJHÛ›+†«•Ѷeƒd æ„ÂLmöí<ŠeµÆùþDáü9ìöaÀ%»Æ¼I »/kÎ tˆn­žXO;‹ßãßýÓQÎÅðç©_˜!§Ý51mŽ¡P'ôîõÐDJA‘Ô¶¾ÁV‘ÑÝZnGŠL5éòõõ¡ò š]‰àkTôˆÖ1SöŸk{ûÔQ8V‹¬LZØÉBìœÄ$å Ï?Ó1ƒŠ:z}![–àN߃CCØ1$€gÃ$`zx·? |“Å­c©aú1xDyDˆy)@ÑÙÑ1 –ø3»T¾Ã`w 2®°f= °dÞçåYÖ© sèÄî ‚œ‚E¢~Ö.lònù¼ÿ¼û?;Ÿd endstream endobj 6799 0 obj 4631 endobj 6803 0 obj [406 /XYZ 38.2500000 532.250000 0] endobj 6804 0 obj [406 /XYZ 38.2500000 532.250000 0] endobj 6802 0 obj << /Type /Page /Parent 2 0 R /Contents 6805 0 R /Resources 6807 0 R /Annots 6808 0 R /MediaBox [0 0 595 842] >> endobj 6807 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R /F8 8 0 R >> /XObject << >> >> endobj 6808 0 obj [ ] endobj 6805 0 obj << /Length 6806 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àöð)Š@°ÀØÈ!€1rrfw,2‹8{ÈߺEu»%}”T]¤Ôm1cOË"‹õfU±øéO_ÿQüó÷âÓã×ÿßÂ÷ǯ;±wV4ŠÃ×ï?PÕ>ü\¸Êß¾ïÞŠ·ÝËî¥þ÷m×¼ðõñ/õOÿ+Tñçúï¯Åßþ^øSø¥Ã/|ß9éêïÿ>~÷NÖ?‰Ó÷ÃçÿÚýõÅo‡Ûé0—ÿÿA{£Tycdê·]»LyüúýÛo»O æÍâªÊXUH£M!ëÏ‹ÿþ¼û¥ž ^콑ҕƉk&rê8SURyQèJô&:~ñ / ^•.ÝàGÈÙ±"u)ã£ï+£¥vÊš¡D¶U¥êŸ®[——> ͧ øyxþÁ½ ¹é9;VZ‚ãÑ¥Ù«Z[ämôŸFOA[­Ëtƒ!çFJ -œ“²æÄúÒ$@I(YÞ*™nð#äìXii‹GO¬§}ÙRD—meJ‚W5R’ ~„œ+-ÁñèœÒì• r)Ptž}p/„O6x€œ+-qñèi¥Ù i‚«ª¿ú~7| ‚+Ò ~„œ+ ÁF™3 ¥ùlß"/>¼î>=מ`Y¼þRCvœ°ùöú}gêÿöõ¶æõ§âBHñcñúë®ÚW^”Êákžˆªyrþ@Á_}<>1{£›Möù‰AO”‡£ÍóåµFòuø‘F €"ï:(ÒÏÇYýþŒèC:ðD–ð'øDÃ'‚/dذˆ¸LV¦ƒCÌ!Ò@jÛã½·¦¬œí¯ÚäTÞÑ]v†¬‰'–“eB>Áá!.Œ 4s¥í@_Âua\`©ÄPî,Pâ_•Ç'R·3ŸŸhøNI ç1_2½³G†=l#F… ð9‡ž(øz¬\‚0ÍzGÁw"Ê…U‰ñ)¤ ¶~”Âú!#<®º½!Ìyˆ¹ R¾ƒé€yó/… ^)æÌ‹x¥ð \#Pçá ?î|è§|ð”ÚÞƒË3„EÈ# ŠÀ%?‰H|¢,\)„ Ïs›8ДÌ(3õFtÝR¬»°–ŽP K¶þ™t1† §.÷¡0®0Çl]ĦRì0¶ê¬ú%‚7ìãRl7Aš$-å´ÏÈË^m¼|•ˆ`[*¼ÃÂ\Ž×ƒçÁxûP\‚ËïMÃeżž€‘MóÒÄø+h’Ë×Óp¹"'ËꦱÈËÙ$O‹UãZ9`ÞÍ®;X+F°³iªÜÒd!W,/gëÀo%ÊvVÌ 9á1mÄãNS¦³xĈ<\y>Áü»ëFXiDKc™`Ax!P0×À'µ#… •oÝFÑl‡²Åƒ;«î#ˆ…”m¦÷Œ(Xp¢ñ“Qç¬tΜ°·ên&hŽˆ¾#HæL¬ö¡°ï‰Ÿ`KN™JM[®8pß0W(í;l!qW,65·‡ÀN7fL<€`uÎÊæ\ëŒÊµA)ÞÔNÎ ï¯2ߛ‹lÙnYáù DJÅ`âÃw"±é«çÁO">/~B1˜ ”º-\Eƒ)‡½aìc¼á=ŽâcÊ=gS²‡3£ð`®/WSÍ7Kù­y¯LRÙx¥P™Sügƒ¹jH A$³ˆkNòUÔx¡ª+h¿9&õ‚l®Ý1yϘ(X]aÕC1°%!Š’GPŒ»$xžYËrϫīæ[Ï3[Ä3"PØÇ$ÔDl_•Q„*{É ³V…ôƒô)SJÓN)"H±o½Ch Ÿ4h³{Õ=± ¿ó½ÍÃÑÂI½wòò°‘j r/¼žøÏXTª}ÙLt† yRîµl¸ªkA†V*Zlù>Á£5úÖíuï(-‚QßÁô ó”mXÿŒk×SBðJ!®#°Á•* aÓ6 ßÁT P.D g­'X×!ì`î…ÔÆØÑl^Nï9NI8ŽŠOBF À'Vñ<øx-^Æ>†J€-Äg‘Mr |hžÞéw8q„`‘˜,‘Ñ ›‘ˆ,[-Ò•û E¤íÛ@œ#~€BˆE †°qŽ8‚F{ç"{˱`Á¢p>çé±5¯&Ä  ‡Ï‘GˆM ijH0Uh¨„†ÎJÓ±tSxEƒ)B8¥?ƒ±(*œd1kÃöÁ(î5…Àý#°¢fm®ÒS_‘S<àwð<Ó$"u¼m0îÞÆ?üôN–núºk¯ñ“gÉINz©fôQš.#¡^|ˆß»ƒDZ¸¹ó\îü(/%­6“²c%çäUfàƒ× bÝDÛ(¬å)Ý Óäë¸é•k¤o·0ŠXð­ÞÂèµÔ—Â=¯'~‡ÒÛ™PÝáÜ«ì&»öo¥°‚Ô«zy¾Æí_𽑻Ø0ººŒ6:ʼn9ºñä\ôéâH“`‡I;iŠÿÂë)S/`Œ°Û"a”µà¯‡’YÍkáÙ¥öÂZ¼E¼¾6!A*>Ëgà•JópPv{(QÖíN9§HY§´^•ì•XÈ(§xMÒb•(¹J+¸ZsŸÄyo޽ĭ`Ò7ă†L|²ž@Þéú^zhùЛñ6Òy–jä-è8¡;\Ëqiçpù机tЉb){Ï»QHݰÁº®ÂuÂ÷"¯9¶$p-yTCJ§»$¹ÍÓ¼”c.”8ÆÁâ{ú[,3˱«Nœ·bÂ¥U®³´›*iÉ™b4¦½§kK1Š»L1çÇ)Lh¸1ÿ”tvZ´ßÜ&‘ÅmšÀ}þ¤‚On î-ÁM•¦-Á…íã$¸­=µÅJ|µ3®<ž˜….=nê®oøØåË3ŠDï£ÁT„x_‹!àM SRo„;¤Ðo1 å|'GÇñÛêy“«q¡;ž‡RR2'S”¾ƒ–­:&ñä=73£åJXüå #¶xp´9)cV¾ '† ä)ff¾°MJ.Ý;=[ÇX{ ·R:ÆÎÈÞyþwVý^KÙnœ¸©³Òãñå9£!øTBÜßá‰<áwpÄañŽˆâ•F¢cøe)®à »ŠDµðh*ãºÏ¹‹Å×óéò5_~Ý|ðޝÛI7ºîˆcY…‘ˈî»5z¿8Ú ß±&8O‰ß‰Ä÷qVëR¬)Ö Û ŒQ6çu÷Ùö¸-¶££w‰/¬13 è+çõÚ¢öù®Ñ=B¨PˆøJ8³}œ©'èž5ë+жˆÈ-Á3V„ʃœúªÒ2‰¾2P24œGC ;êY =ɕͫªòŠ)>´øuËv¹ÍúØÛÊïq4·‰à¯7|®#ɬÍHö†  ä:gHM¶k(—’R©Ùª½S”>¤´H^uLÒm]¨žø„!kÖkN´žpÂuŽM¤L¼øµWk˜3H+ÃÒ{ n®Ç!®eH<|'Dê䬥¿S T†;ü\C|éˆ…Ž ,€GÃ, [|7Ÿ÷j|~rÞ<±æŸÈbYа$td´'´ 5~ç!@лÜ?Á(Vk@ܰ€H˜œÁO"¢…÷ý5^TÑqBïƒÚ½!()X%ªÏï Иñ)^vÿWF endstream endobj 6806 0 obj 3956 endobj 6810 0 obj [407 /XYZ 38.2500000 743.750000 0] endobj 6811 0 obj [407 /XYZ 38.2500000 434.750000 0] endobj 6812 0 obj [407 /XYZ 38.2500000 434.750000 0] endobj 6813 0 obj [407 /XYZ 38.2500000 743.750000 0] endobj 6814 0 obj << /Type /Annot /Subtype /Link /Rect [351 751.250000 391.500000 758 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 6809 0 obj << /Type /Page /Parent 2 0 R /Contents 6815 0 R /Resources 6817 0 R /Annots 6818 0 R /MediaBox [0 0 595 842] >> endobj 6817 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 6818 0 obj [ 6814 0 R ] endobj 6815 0 obj << /Length 6816 0 R /Filter /FlateDecode >> stream xœí][ܶ}Ÿ_1Ï2/% (°öÆúPÀ°>}(œ¦Euóпߙ‘´J‡Ï|¤4ZÙˆw³Ú¡H~÷û»?þÇñ_¿ß}øüŸã×îë‡Ï‡âäÊ¢ýs¼üýîåt}ê¾?ºº<~ýõðíøíðéðéüï·CûÏþzþîG}üËù¿Ÿ?üýüû_ºü¯§Üùë/ׯSç¯—Ÿÿûð·?»¬Ø¿®ÛÌëÿÿÎ4¥jÜe¯þvè©®ÿúÛá]{qoqMa{TÖœÿi¬>þ÷Ÿ‡ŸÎ/è—/Nµ5Ê8]Úó÷Me]QÖµ>ïL÷‡}¹Ó—·+ëŽJ7ÅÑvðòë_™åU‚ÅmY¤[üºsñ[Q¦RáÕOUÊ]} fµgpO·Fù+r)[»&Ýâ׋ßJ\¼zjjnŒê¨¹.\ÛÓò `¢ŒJHÍ׋ßJp¼º 5«²ê(ÂU ®ÿiõ°­¬M·øuçÒ—Ò/. Ùº¨òéË'X¼±éȶÝy*>X=1ŸVM£ÛK³¦I“~ù0ÑÖ$øuçâ·Ò|°ú§˜UðVÚŸká[àƒï¿Þ}Tö"ùªã—ŸÎ›»¾³ýòå|)åñ»‹¢{FÔ/?ÿxÞ’ùÓñËχæTé²ßbûD¿GO ŸÔ色è‰i?óý—óå%?·výéà´Š?ƒupµžûûõ¾ÇÀÛ±ä{JxžC¡‚ŸùHÀ»†O øé™6„‚Åï𠼯†wÐHñ0³"regAýêhJŸ¬¹úœžV\ŸÔ§º)®;}|‹`õ3ìZJ5§ÒVµ{ù«EËw÷yyU£åò~µ»uÛŸæÅªà‹žèîQÃ'-%•'£k5÷3xoøfý[‹(âÅøÎ1HñEÞÓBP™þ¾æ¼GöŠñ®ñ˜ÕàÞð(?á€6±7|RÝ>Qªß øà½N ŸˆÃÁÕDaŠD poøÄàLð€€1[".¿[-¡|+ ç 8aî>ຠÇÁTðà‹¾LL#âÄê‘àòni.ß©±qÀ†¨ nHËŸ/Ê;Ûv‚0Du>JBÔñ’5 bžŽa›‚}¥W!_°É—|P *jUóh]ùBg¶ªâT9õZl´gSå©hÌë;|€7õÙ”þ*‹H@šÞ¤6+éýk‘ÖBD !r¹Øë½š‹ïìøë¡©ê—?øåð9™÷ û²Øó9£ût9F7Åz棔¢QU3vuººÞ\©û›S{2)[»ÞgvcO\w]•ÞEáÕðgˆ4pµºÙ-Õ¿`i®'Ÿìñüžž½è{éHøBŽþ{ z‚ߣ?ÂÏ<¢'0ûÌt£^VŒÒã¬oä=íjîd“Ë#TV>@Fø=–ÚØŠgôcŸÕ”D,¬E•·À{OP„·~=eì=‡Lï‚v†SZ=–4Ø?Bx¶¦3Ö¥}ß$¥ôfr[1n¸€Š‘›ÃëʅŘÂ0‹Ú™øRø½ó¿ ÿ,cRš¡DLa`)=O¦ò)¾º\“ds‡^Ì,2ß‘A±r¼a”pW Õ†•‹(<%­ê–VÁhOp5LêVÇ£hÌÑ%¼³ëdwÞE_6‚ˆõFìeü VÔy_ž|è#´˜˜1ãÿèrÄè¨ó¥s¶HNÄf1T°Ï =‚#0áfÌþCAŒ”¹{J¾¶ˆ³¶p>c o çYÁL¯@$Þ|»669³2f@~BÈZy²n'*ò1%ˆ38 ëì}AXéùÛœÏïfQ :WLoûÑßLlR&ÉÄÀ°TÁÁ¿fÈ%M˜1•*oÑíº4ÏÉ0¾dÃ(‰ÐT¶ ?VlÖ\N°+ã{ZCú´†üÛ3±n –ÊVMé§)Unm‚MZbà)ç;3n¸:)à=Â'8£Á$ž¶neÀÓå )/Ð’ 78ˆ[9­“ö{§¡éA•¤Ô5q2åaG·Õr«¦òñ-›_üŒ&Z™É/¾Ug€pEà ³ ‘gÉ8²%g¯¶Ð$-[Öeí^€/cˆ9ìþÇplÅ3Þ5æ¤0+Uãž…°Û$–xoß#M¦v’[åãQÞFiÉĺêŽÈDA$Å;Ø hYªªÆÃ0Ù-áTÄLI¿”Ÿ‘µX[Šh¥ÅkÍ×謅'Æ»ÇwA`×fuå¼1Û¸äÁ"¹„ì«qÎŒ~NT@Þ#ÛÚã Ž•5ÄJÛË—XDFÑp–¢)µ‡{¨Õ®Xí[Þ:²EüjرðöÁ („DEc··¤5ˆÆæ0œ›G÷®¹2Y³u´P,i«}Ü[Ü™(›|Ñóˆ‰üOf·¤÷ú»§á4¦ë;ÒUPDùa\ß›¯º#ò•—ÕdŒ¶]7rµ3”(Ÿ],jÂ4 ÐM¬ìz‚•{ªü38‹ã©Øµ‡'KQà€0ƪ £v0“Ȉ#ÖYvµª§!LÜU@¥ï 8£!¾0°Ç3°dó#ñ*g‹Q9UF+«i›Rgã8ìpÈ%áUí1Ãðj öAã…â<Ø€#R7ï y4Š;ä’&ÌÄ¿Ýø/v㟔‡xꡜ&2a6J½H\{¦š5í¸á^Äb‚X¢³ù„ûÕGlV´.‘ráJ±õ•ëenÛ˜¼L/Ûy>”«—jâÌ»jÀ¼p¸7iG{ç‰ÍÍ'íät{5•½A ,±ª‡[X dÔPfúŠbÝ®óÀ¾67ÜÈšÝ^²Ž‡e«¶&á¨ÎVM¿hüỲ&øæ1uCCN¶è‰r ¤™<ߎð1 û ™‹ác𮉌æ/ÇTËðBÎ`ø0îYWY î”XæÈÎ鹯±€c† ô5»—q ‚Á¾B,ÏeËæ8b—2ãlÖeÆs»z5ç69µ‡Æ­æÜ:#ž+U½>·Ä[/f\ø­ÆëÐ0vs8¤à r"‹]Þ8 ߃½Ôj0¬i3J.åz;ˆÑŸ±\h¼Œ‚Wƒ·¸kÉ»–¼v-C‡2xMÈ0Eج»ÆÓܛΗT¥T£§)p×úoÑú£4„Ì8GéØÓ„-X¼7Ì£=û¸™$Ɔ҈’zø3„¶ 7,mš£è§@uº»µ?µ¹ ªwkjÛ¬æÜ9íO]Õ¯ÏÅþÔuoíËÚŸŒeŠ­¿å-Sl5ËY¦õQ5£5g×f0ÊØTª ¨âÔvݨcOZU¤<éÁô ¼þÌúŒ¶pµ®Ö*Cʜڼ·«µ;PêT4fæüž~6ˆ$Øu,à’@ã¿Ç '÷xÒvÕɨž?¡Ð!²;Ðbì3ø=ïÑyïÉ” ©L{NM¶ùQ^4/ÙöqxƒH8=“™øB${f‡˜)ë3uòªèÈ6&½™ˆB%TItñÉ6?5W­øòïÁÈ„»Jà6/0í8ÐZg-3“¦IjO¢nžT©ÔàˆIUó‡Ú`ÔcªžWöoVt,Y€`dÙ1‘$[û ¼søD™òýåƒo%ôŸ)åÏj´ë7“ºãß,ÕËL´xY7[S¶–oÞ‘+‰k¹ï¹Ëô^Ù 4–‰•‰ûaïªUÊ,¤ZͱÿdÙL A´yT jl~ÂÅGö³D•£M‰¼x# Ùª$ñ™´Œ™Œä]J­¿!Í9eƒé ö_pÅ­i¢‹M}«šþNmKc]xD ã>ÀáO“­œÇ©uóÇ Æxvr6d <‡Pº¨—DƒüÄgÊ‚D‡ MŒZKÉômãqýmu Š#C‚EP}X±ødªÖÖÜ?1bäY–Öi}!UW]ûLM%Œjš¶«®Aèón²)‘ÎôIǹâþËÍgÞ5¨|Ô=µ ¾a¤ÍÝW›Dx2"l•ÆÝÁx–ÄUÒÊúœ;Öq‚LjÃŽõ€kAǺ­•w”íºôa€‡ìÂ'+ì†(³$^mÆi+¡)PÓ*D;†7ß­€ øìe+m#\`™‚Ê”2ö6D«kýi˜ó]$ÏP® çíf5ŠRžÚúj@€†ƒ? ¶DZ*‹¤rmÍ^’hÔ´pÖuÓ4«SOõ*3µUáªqÍõMf—JhžËE·Ñ$CÄ_—>ÒcÕˆ2væ§÷ÊâQØNœ‘±´Ýn'E\'t©ã¡ûv’·Wè1_WÔƒ(}ÞÜZ̘sT´jZÊÚªzÀ@wß\jß\62Dʃém$Ó}hÆ“ˆ€Uj{3Œˆ ‘ÍÁLÙ]´«¬û¡n‰dbɤq3“­ ^I9ž6÷S÷.™r¶g;ª“öD: pqŸ­@ÜSFw€wýZíQg:ñÀ˜/aª®oPA#T)%Œ¯˜‘UŒßoP—caFË”ñÈη$aƒþ¡µ¼ŽDø°õ†Œ‰áv&T½Àu‰NM¬ïäl€[Û¾¤Á-¹pƒI8‚">Pd wh™E<ÞSÛŸ1»Æá»@Àh—£Åü sÍ4ŽJÓ^.ê„øÂ`ÕÄï7{\ &=ÉÀ2}gõqû˜“˜+âLÛCbo8o1犊0°rá2n™‹ø=¸•効ƒÁíNV,¹54Û³µ mÜSàáê»5[‹y-V?"½X¾‚e…íN˜” ìøÅÙbÊH€ˆ±¡c¼/›º¢ ]NJÌK(Ÿ–%–iL›n(oK¬Á¯X¦­YKèn4^Z;‰/÷i®Yë_ öåÁ±z:…[6ÔµfدÙâÃÞ ¦å¹\^ç4Ž©BÝ€cØ. XlcËŒçÖ3xJ¦s±3ÎmšÕœ[çÄs×{ö”Xø{Æ[Ÿ†ÀÁ'Ÿ×BÀ.ÀoOc€·3üSÔ£)|£˜·ã÷òMvdMàv°IØD ‹õbb¨Q0ð]C<ÀŠï!nT6yCPÿÇ«á]#qT¤$FÚ %äUx þL@âÕ¦ô…¸;Ë¿š–zZõ>›œ²V›¹¨µÄPCæ{yn¾4“gXþæo¥—çŸC5ˆDPÙL†¶0Ïf`¯2Z ºQÓûa°”(¼NjÆø‚yWÞFY lÔ Œ[“Í/Wëo0º¹á~ïK—”uSç¹Bøü÷øí Ê ¤?MýÂŒD„z´R™S¡.ù÷Gý¤ŸµRl,þÚÂÛ.[HŸôµþÐ*ª†O:WŸºüÿphw0:}Dï1Smc{ûØ55ÂùöyKܬêŽ>8`g.-ïà‹Ž¡ðjð3]¤YEý…ºÅ"ÜåûâÉ©­áÝ1(€WÃ(`úûn>tàʸ÷„j ~¢<$Ä´@èÀjèsü™÷ݺ¹sžà+î¬râ`•~ H¼/u&–t\aNÛ}ECR0KÔ/Ü “²åÓñÓáÿ1!0ï endstream endobj 6816 0 obj 5631 endobj 6820 0 obj [408 /XYZ 37.5000000 242 0] endobj 6821 0 obj [408 /XYZ 37.5000000 713 0] endobj 6822 0 obj [408 /XYZ 31.5000000 136.250000 0] endobj 6823 0 obj [408 /XYZ 38.2500000 729.500000 0] endobj 6824 0 obj [408 /XYZ 38.2500000 729.500000 0] endobj 6825 0 obj [408 /XYZ 38.2500000 279.500000 0] endobj 6826 0 obj [408 /XYZ 37.5000000 713 0] endobj 6827 0 obj [408 /XYZ 37.5000000 242 0] endobj 6828 0 obj [408 /XYZ 32.2500000 134.750000 0] endobj 6829 0 obj [408 /XYZ 37.5000000 675.500000 0] endobj 6830 0 obj [408 /XYZ 37.5000000 675.500000 0] endobj 6831 0 obj [408 /XYZ 38.2500000 279.500000 0] endobj 6832 0 obj << /Type /Annot /Subtype /Link /Rect [106.500000 683.750000 171.750000 690.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 6833 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 250.250000 62.2500000 257 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Python >> endobj 6819 0 obj << /Type /Page /Parent 2 0 R /Contents 6834 0 R /Resources 6836 0 R /Annots 6837 0 R /MediaBox [0 0 595 842] >> endobj 6836 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F1500 1500 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6837 0 obj [ 6832 0 R 6833 0 R ] endobj 6834 0 obj << /Length 6835 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯è³·jã4)@ È!È!ã†mDñ!?ìf±—"¿"ë›W$»5ì5›µ¼zõöåÍŸ?ýsÿï?öoÞ}úÏþ‹ÿùîÓNªBuöÇ¿ß_`êƒÿ}_ÕÅþËo»¯û¯»»íÿ¿îº>½ûkûÛÿöfÿ—ö¿_öÿGûáþKÇ/ü¶«tÕþüõô³©tû›:ÿ<~þóîoßí?ŽØOçsûïïmSê²>.cb꯻~›úô÷/¿ïÞtH›¥jŒµå^;ëöºqfÿßí~j'è‡W‡ÚYm+S¸ö÷¦t•*êÚ´¿WÖÿa'¯L;»n³×¦Q{g›Áä§¿2ÃkùÁ³*ÛàÝÊÅ¡¢m©ã£§uu<è—`V m<€Z4‘‡ÿeø ƒ×E•oðÓÊÅ¡â72ºäá6ªÉy¸—áå·Êé|‡{Zy¶ÃÅ£ ®UõÒ.üÏÃgܨ2#æW.¸‘Ñ%×MÎý ŸaðVɈ9E“ñpñè™…,ëŒËHª¯†Ï0xQd¼Í§•ç"Õ‘ÑsxÙ3ÏVˆ‘‡Z™“5—e>¡®[¹4PúㆃKÒ;ð4EøœGÏüœºX·ri ô' ?Ô¥ÿ'§®ÛyV-¾8]ïGôr9œrí8ùpê2z†cw¦Ê§‚w+Ï„SƒÁ?¦ ‚WÒ} G_#/>}Þ½ùÐ"[ Êrÿù§vm§9»Ÿ[ûïÖ¢¢ý×û”ÒîOûÏ¿ìšCiŠ~‰SOTŸTp´>)уW`NOÞnžVe3¹ÒÈîªWZ×·'$1k»Ÿø¬NU~VkðU 'Î@˜>ÃyTú<ú­ähœÅ;uR§Õ€£rª;ªÒô‹é6íÎvvôËjôD½CO¬>=©/_ínJ}¨uÚîÚ =qÝ;öÐþVWżƒ—¤ÞŸžkj}»Gs( |W€WçÁ«ÖO!ðñ’0¸ºÔêPVúýËÙö$½*‹`ₘÇ‹õ”ÓŠÁ©ãmÔáŽ$¼‹£{¢u¿¶ð*,šB!â²àyð~"­Ð“áÍÆGK…¹=ÌýÅ ŽÜÒSœ]‰2F`®QË"—sŠ$gdf…*nY D–ŸÃˆ ïÉ$ÍÍ+… @â‰×˜´ñ%!(ïh Ÿ`) Ê|®Íà|HMC=¥€òºcVð~B²K[5„hd4¸ÓÈÚ0†àyàZ¬-ÂýàµÄÉMÞ…Œd¬®L(”¢%™b2ÆÈÓ˜oáyð‚øjÌÝ8'!íችŠ*€>õ^7cèc:&X({‹å­ßÉéÖ?ö¤ò§jÂ= ¿ó½cð 8ZwBÚ:äj´ª?*ÕØ™Oð<½êcªÇy]öçÒè‘ýxjWì%ºyʃÕ&ÀE ƒ'¸¶§3º;õ|wl4ßÁkƒxÙ©˜õ©´ÓtâNáÜ-º&ɽ‘Ç4%<~ç-”4™ÀÑ<²Œ½Ó³Æ¦n5z¢ðNñ<åày"æ‹wõLwËç¬í,l æ) 32®MCֆזÅuà8¶Ñô„Êõ }Ü1<"8ñ×öáõé³"’pVlÉ®‘zójQ÷G…f”¼†¥˜g$´ØìÖ¿4ã‰áË$,lža,SX猆…XÂÄìñ7ͨ„%Æ‹„¹Ù=óÚ%LQ7CAÍ[aKÔö¶à'xÐÊ¡ v«°½…Xï…£)ìAƒpËoŠs*¤|Â:,ÖCGBdbI)·üP®meŠ`¢„)Í|ßCA#6X†‚ê^aô/ÍaR².?¼Ó÷P>ÂÚ~2Ÿµ2þ HÌò°« ‚2øÀÛ#^`¸aÊ3¥Îù¶§\G™ãCÊ [Èœ4‰FžLý•u¯Ëº²no³L""]chn~xTQ‘æ4 L@f¿¢ó ä‹È’0»"BH,áó¦ø>Æ&$ÇX(ÉÂbÈD}0^¦…ıˆ)­›GC ™Sg+}hQ‰Ü Œf¢øÀ¨høNÂñ¿Àr“ßW*7y „4B¬ðeP_œå5L­\1Ù 4Û™`*Rtûìtò×G«ÙzNèù8aTâÄüh3YÑ«ÃVlÅJÁy‡kÏ P¦4û3Uè0@1àx§s,މ(ûßvÇÄÄ«~Ý}Ê„BljBŒOSWæ‚ò!§Ó à×î³6!@såö@P×&¼­.{¤è@¡µx)ÃhP,¢|ÜPˆgøtGûã“È1ÀNçI×ò˜}Êâ—¶Ÿ­¸þs"²jBLÞ~PÁ Å 5¥Þ\,UX5eDر•[µ ÑØˆÅ³Pä¦c‹Dv •ò#¨ÏB^Â_!0ÊbdŒˆó”ÁâŽR÷-œòn/“3"¨ãÑøTœy^V|.£ÏGìÌÆ$]Ôô$c\ H;ì3dHƒË7Н=@€ÍõÛ(ÃÌ€µ1iâÁV,s’_±s8rg±Ç„!E¢YÄ ~®+%M1¦c™‰É¹ð*,ga€&0¼¼ÌŸrk Ê[Y};Ö…ú¢hdC„’2’/¡Ì0ai”¸·a±yòð·i¸N”½6uÞp«‡ÓòqL ŽmÃÑu8¶ ¯ ÀOôö·êì\‰”ºÊÝP4Ábd==æC*óZ^–qï8t_߬*êI”Ž\X«, ë0× ¯ÍâK…+ü1kÃa»¸n Æ ®R‚ßÙðNq=–VáÎwp5”ÉÐå¤z»û2÷¹ª¦!CÐq.ÚÔ“ev×”/Ø]¤ò ¾Axßßš2†ÙS‚ÂØ¹ê“øRëâoCmÏ›X Æ„W¶®ûr±ÂIà|rQ’J¶ZýÏ úR(ËÆÚúþÃÊüv9ºqì¡¶}ùЊÂLß6¤³¦Ô“2‚{ˆ¤5âÓ‚'9{1%DêšQ«×,è’X Ü„4Ó4ÍÀ*‚¥„ö¶q Ó¶À»•Á²®'.YUÙÛ)Ç‚ 7ëÿ8îe¦èö²Œ¥Bkòº7ð´T˜¥HIw"—ŠwÁVŒß+¹­6å-Z>ŒÑ¹eÅgÆø1ƒaA‹8`‹¦†°Bô^ ¥^5n4s—ç©xÂÔiÁg ©Kd§¸ê žïŸ¾§ÌN‰LU¾a`ç‘ókÏàF®7JoÜÀluyvÂcsá6Àê´,g0˜.¯OE9SoÊ,‰óu¯™.f²\GÇdoÆfŒ'ßôÍxÁ)ä7ò{¶8A“`µTúɃ„ˆ¯V­Šrˆ`±PÐjJ¦4ÍX/¶\7‹(é¶Tƒ½|µ² ¶®’y×öŸœ¼¥t¤–˜³ç\=º@´Tÿ’xDm¸8Á’ÊZH¨¾=EÌó’‘²+ôt-yñ"jÆ U–fü'y0§ñ=«ÓŠ‡Î¯MÄTèõö»$¥L8ÐÀYJ”¢2à3÷\eDá¼½P˜jVYòßòR™F…·÷UXAŬ›Ùt.Å£9cæÜ8eŠ5áP°{NðÉ™B¬uß -¦²þ XMŠÂ"E ÆíÛSÀ •ogÃb©DÞ%c"LÓG(¾ý8Ðz®p`+¦Ï-ö!Áw°ß)B™D) 5›>a«ÏÁÆ÷3Z«¦qñž¹Wš×ýžÅ¾ìþì¹úvRM×úZ2ÄÚº>ì}]:6á—s—ò D”/¶º —®|‡–Hj\BnY×$¯OÎ1EE–´z”9¶!¦hê„û rc‚ò1ê ¬‹xâ%Å}WôupN„áb ÅZ‰à ,DBŸpÐ~‚Y+3ÏT@µV‘ ”#·MˆøPàÆ>|øŽËbŠÈ"™‚k3pžÈ[Œe>"V:"ûÀÑŽŽÃ7Ö«!¬=5Ì\¿ªR2GT",pÓì„Iƒ Ä^HQÂA“•Ù`S¢zË]§,#™TåäÝÄ ¯Æùí[1ö%I øÉÃ1 óÈ`¸RN] äC‡ƒ á~ð ")KS†œeîssNoyÕ4(MÃmÅ·¯i\Ð ¶½ã‹/ªÈu4‹…¥ª2‰°¼ºzÅ’©E…>7ÐXPj)ìtBÓ+•‹>!¤£ÍS¹+´ ¨Î?‹(X•ZW+ï©Ü$Få6&VÔç`&˜¢²Ájˆ™;¡X²•kdû¥%IF”m 飓ÄÁ´ßIȇ[ÈIøh•´¨ z–Îïc™6j¹­íEÈ`^+a¯Ü2C‡'ÂD†$ô}!2µ°¬ñ¨ ͹;–Þ_>nåBDÕX¯ÁO°”qÐ`׎q&V½&¨]5›@PͤTÄjd’“‰9“Ž´ `øšÂ°r Cy®cþjƒãlpØËtÇ6¸ ZD\¦¢^ÆÖ§1°ð2€ hD¬†³êµ£ƒ” ÑBÔ©qœ G°Ñ–ÐW"hAô]À+ÀóÈŠd9ŽÄb"}V·:Oö¸õ^7£ä²3ÏWê|-:°kuèÄ™<3ö¤òòŒ e Èhø·è¯=ŽÖÀÑê^ä ¯½”^ì@>óE›ô¡ =é­?ñ£üDVÅÙ¢“x¾=eéf{L ÕÒRD—cl«‹Ï2ÙžøŽ Ès510bà#ú¾2)oøJÕ[ÑáçðŒiLi… š œyT‡a ‘pÍíEØn±Ó`‚ð.hsKˆ›DBj˜+ÎXÓ†7`eó}Μhª,Tìø´ IE„Ù‘zŒ¸$Òá~)€lTNBbze¥\´ ŒÁ’ r$D‚qðh –äÇ 7¹ùjpåA6²Ò`»¨Xê)ëZQ¿`ÓÍŠ h…ȹ˜—À®Âó¨¬CB vÈbÎÄl±Al€ÁsÊYM’¬rjÀk%r¨ Á¥2Ê$ÂîH%y$¸¥ u†QMrwMHÈNÌ»lŠcîÒÝ=¯ú¾¢—sÄ5ÞD;Rõ‰J§‘±¸Ý,Q…5ÒT&Zí=Òq¯ ×íÃu1à’£p§ø|ò—“¶*¼ù™®U.˜s‹zXÍL¤\J£b²˜¯•9Ϙs·n0(*dåTèÉB*‰°¡…ˆ"JQpDmY‹%>Ý•õä±9{Cè&dæ"9åÛ‹, jÁ²fG¦’ eºÆáåL.œlZcÞ€…á| %^©ŒûùrÜRU†d+É”~Hi,$ƒ‚Ž 6Si¬îiÞ«‘ãÕÈñÃ]9ÒZ7<-x›Šéõà'‘³Ç {ðÙc|Á½ÏðªqO|öËqC¢’Ã;½Ë[k!bZËDpÓu¼ƒõéFä´‰æ6˜Ì)™¶7Ì Æ¸ƒé`³ ,ûÌ+VŠ"áëZü»EƒüùóÛsµ>Z¥ d6Çlü²†îMgõ­–jû~öš½óÎÆ] *ؘ'JRÜh"bE$ ÂT"†€3¥.Ü1ë1±¬]ˆ X¢ÅÚ*!SG$t¨ `ý%Ò4Û¥ þ²j¯p5£ )óA …DÄh¦xÑN*³@ RZ—äZ A¢«=7[ “Lqv*¾~à9#:%~¯.ûå"lÔ±NéŸLe²o'ó+AkÆ~gìëÇâ üe€°:7}q˜HHшª,å.s&ÇtáDWÐ}¥óBç+Í’¹j%‘NŸb:ž*™"Rû(îŽÝ¾îò5¦ŸòÃYåpv åÇžtGVÊA·rüNƒÞñíYt…ºzÖá¾Ñ¨ÂÈ<žjwX«r³Óöœ'´–PME¶gé$R:Z¶ÎkJ€!.ÆÁÄœ1D‹DQÚ ÆpF&N@&7>oÅÊb€-("Eˆdý2"Lx¡êGTê4SÑ[”†¥×õÉÚZ½Ø›p/Ó•ðÿÈÉ—ôe &[î²,k¼¤Õ›Ȳk amýs¹k³3…Ë$äF™hÿÕ/ͦc#VÆó¬õcšÌ U6ý몬g@¶Åã §òÛði ™ ¥I41gT"3/'»€¥§(§9Í FÁÈ[eDϜNß#-ĵ-÷-Œr¾‡øùƒâP×j¯­;þ¬´î>­ÚOìát´ªÿäKû’9hݘº¾|Kߣ¯§9¾á?°Ç÷áf09½t»˜ã·ÊÛaÊÛi~Þ=}÷Òh§ãH€ò»ê„>F[íÀlß?oì ̨Ù{æ9ý‰Å±SVêžEBÃL×Zò X‘„)œðƒ¹"£Aãw")ADÊ ^u$鯚-’†Géžɼ}F‚$$ãÆH’)CZÑ~2 I§oéÛaôõ4’dÌI2z0’¤Ó·ÊÛaÊÛi"I¦ž$I8ý׈¦ËFÕÄÚÄvHî”ð@n¹¨IºCRáL@*œ#®ïpûÉ€Tœ¾¥o‡Ñ×Ó\H…Óc¤Â©Á4jH*Nß*o‡)o§YˆT¸jú¬0Ó׎É&òSqD¶Ç×ÌäźŒ[&/“×qÍäOûwÿµ=ÿ(z|œú ý³­‚تˆJõáý%<¶úöØS¨ˆÝ…2°ÑöH nŸÀk†¡FCÛÇ3šÇNŽ­íƒß)2 `{“»,IÁÅj¿õaÜ‹ÃþñÞˆ4² Gƒïxc•NÚzuA[Ꮏ·+¾ Ç c àw0 xt0T#犡 Ïõš°P­”=øy^|[ìU¸ì$Ùù¸ÿ¸û?íGA* endstream endobj 6835 0 obj 5843 endobj 6839 0 obj [409 /XYZ 38.2500000 80.7500000 0] endobj 6840 0 obj [409 /XYZ 38.2500000 690.500000 0] endobj 6841 0 obj [409 /XYZ 38.2500000 325.250000 0] endobj 6842 0 obj [409 /XYZ 38.2500000 690.500000 0] endobj 6843 0 obj [409 /XYZ 38.2500000 325.250000 0] endobj 6844 0 obj [409 /XYZ 38.2500000 80.7500000 0] endobj 6845 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 332 111 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 6846 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 88.2500000 111 95 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 6838 0 obj << /Type /Page /Parent 2 0 R /Contents 6847 0 R /Resources 6849 0 R /Annots 6850 0 R /MediaBox [0 0 595 842] >> endobj 6849 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1701 1701 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 6850 0 obj [ 6845 0 R 6846 0 R ] endobj 6847 0 obj << /Length 6848 0 R /Filter /FlateDecode >> stream xœí]Ë®ã¸Ýû+¼H‘zA€~M€,4º,‚,‚™<Léd‘ßmQ¾¾”%)ÉW3HºçòJ"‹Åzž*þð»/9þý¿Ç>|ù÷ñ'÷ç‡/‡âTÛ¢ûçxù÷×÷?ÐÍÉýýX7öøÓ·Ã÷ã÷ÃçÃçóÿ?t|ùð‡óßþwÔÇߟÿ÷ÏãŸþ|þáÏî—.¿ðíP«úüç/×?ÛZÿVÜþ¼üü‡?þêø¯ËûϹɼþï_—ç‡Êö2‰O?ôËT×ÿûÓ¿?tˆûJÝ]7GeJsTç¿ÿó×ÃßÎè__œšJׯmÿN~¼Ö—¯—MuTº-޶|ûú¯ÌÛU‚—›3¹’½ü:si¢¨²RÁ—ŸZ£T]™ºx„­ºœù£#O9ÂVèöúÔo«&Ý˯3§J¿·øí‚›k ­:i“àܾ¼>ý­®ÒqN7sqª¸Í ¼]rsK]¤“É/oOAþ²N'ð»™'’Éøå’;[ÝÈS– T¥¤~S¤“ÉÝÌÅ©Òï-~»äæ6•š­MAþ*¡Hn­MÈ8—™K¥ßZøòScJUÖÚšË._vØ6>ÿ½.Ý?­ª* §Åμ%N³—·'تhÒÎÝÌ¥‰âv{ðòÏ1/Á3é~¼½ïß=üðc{TÕñëßλ~°ûãë·ƒ9ÿÇÅ¿kËãן¿) ]þöøõŸUœªZ5g/øò{בâÓuÄžJÝ(m‹»{)OÖT—GîFªëHsjÚ¢zý ~Û‡ëˆ9™²sÂ_F ÁßoSï»g^~U“mü—0´¨‰Ù@Ϩè]Ä?£>¡gôG4bJ¸Oxoä»¶±§¢-_Sô|[··J÷Cs(jà.À= <ƒWŠwsæ|üŸ5Þþ2~„:ÚÌ2à3º…3À'yp^ñ¯Â)•NFªž!f¸Ä#ÊŸ¦Eéÿ*!SbäfU¼“²pÀÄPR9²}úzÖ¸i”¥5ÚÓ–e7ñöTWÖ“Ž sâgö¹AÁqʉå²?Ì3¦ÄRÝü䟅)»»¶˜’xŸ0Qûݨ¨q`k¼Ì«úNI€R_âõÂô›6*ž`ÑÀw < ˆ…Z@] [˜AáYL‰…„šO—§úÛɈa<Âxe„" ì^Z{,b£‚†±Ôæ 'c©±T ®ù*=ðF³b* ä%dï€Å(Ôù› k‹–Áœl²[Õäd¶¨Õ„Úµæµ/'!%À˜iúOÒ²ñÛĽ?$âÒ«väÇ |RÁ„â³lÍ|ùÉÀ§=6?Á"Üðx©N$©+ôr!‹£¤i«Ú/öâkæ.‰RÞ@™1,Âf ªUr[©²þa®òe 89Ó@g®#M`©ǵtàMÈ·j|%µf;"“Ýœ ”¹¾Õª³1¢FUMEx<¢]WX@H9ØLi+ÓË9X²8Ûo/oQúò¹Ë´ÍÒ7Ä6•ÍØ’ªª<ÁÕ 'Ð76Â:ônv†ÞleˆfUÜDŠhVU¾Ï¸Ãõ­¶`bšt¸rR€ÇLFŠ´ÍäÚ°Ùø‘'@îÁÆMÃðnhF´n ì#öÙ‰vbožhhF5'ƒëaÎ}@^¦IYNS­êNÓ6%{ ù¥Ä+«Â˜±'Ö®FÂ)|ºñIŧŽi¿HH‘€¼Tñ롚zb-JP40¬gðˆ(ÝMJ™{F{ë5Iç\<†©ÈXD.!`a;‹àXFþZ×bþÏdfÕM/÷ÕC{,ç|šRõ_]öê ØVëðš;òÉå#ns±Ä]ÞæÉdqP–'¶_ˆˆ ¡ p<¶¾»üípüZl™<²³j§9éÙ¬ÕL³~6Ës%Ú¾y$"Lq9–Š+ŽŠàkKÚ„È `=ƒ¯ùÐ8¾°é+tžszGmñPtW¬QÒŒ™êj‰¯/Òš¼ãBâ׌0<•mŒ‡Á Doaª–`}ÁÈ1Œ¬anžX¾)ܳ¢¦S@”Òžym•hD 7.e CÑz«ÞaÍ/#®&x¬ä˜Á…áòJ kf$z ’RõÙÒçÁÕ]¬©óÓè- ½;ÌXxr"¾„M®ÍÔbE´Ê&ìEýcdÚ#¦¨ÓOoèÆ%eó‹öîe.š¡º¹3þˆho—a™k>4¯-¬yM¼=µg ß¶g 6Ëñk‰æ‘ƒõ c²ý p_%Ê&Q^xÌâšÏ cvÀ*Õc§öê!éÓ´ŠÌ¨U¥çYEeŸ°zÈ*óºa¯Ú«‡Èsÿ„Èv«ªGÛ”ì+Ïù[Õx9ÿ,_Õ/ÝG—«{ÍÒ°n{ÍR"™”ç<ë‡j·‰]±7ûlÈÑœQ›>®ž£fiÿ¥Û›â¡¤ÛdoàÄŠLi½6ÉŠÉ­Îï µ|zï‘^¼ˆÈ /Ëì‘Ýc2¶l%‘“dš¨2m·Ù´Oæ²ÂFïLÇ2ÑF˜PY­õ4RâÛ)ñbüEô=ÄÚŒ¹ånq9Æèƈ6ç¹:qn\ù‹‚²7ˆš®«Ö“«Iʦlª«k_6¾9Ô4Õávˆ ÅzSî¦öi'±´;è`°ÃɃé;è È8i…ÓsL‡ipP®Ôâ¥iÀÀþ)Ê@‡ Á3I&Z¦ès€NÃŒ‡bþ®­8kMôªmìãÈ”êA‹ÔÀ,wC9ˆöÇë¡ì YCŸ°ev“‹ð~ž¥ »hgzÆ{À„ 8è¢Ü%yZJÕÝqt§£d è¡fü6Y%+h—†crÉ^"´©»Øæï†­M„C¸N“ðâs±hD^a@?*+’©Î0=½å&Erñ³]$Ĩ³Áde3ð„I”ÄeJymËy^ž®M}¡R¦]€mdóÉSšD´.ÜÀv° ­ÂŽÆ8mPoî`.ÃVNyÄp¤À¢Õÿ°Á>¥ö稠© ÔMÊ“¤Zßj}à ¯ÄL£•}#Lã¤vî°€ˆóŸ[(:Šä¬W–ÊÛN¹ÌTQ÷¸u&ŽrO,¦ƒŽ®Ñ!<Ù\=%6˜ˆVòød5‰º„‡C—­·ê·—ˆNÜwO$üŽiO…3µÇ¢x‰qT„„2+·f¼]â2çP\ U¾šîÉl+CÝLˆ;Y@Ùßæ…ÖL¯'áH¬lïÙL+>Þ+¾ÐZ$Ñ¡¡1у ß‹2=$Ttm­=Eà+â!Î2¶_sÙFÄù'¢¬î:-x¦/f–È–*ßàÚtd«„~”Ž™?-G'ïÂÝœ¹õ¦ºªæ ÔU7¤4“ϵåsYÏI+­¿‘o ’¦ÚÒ[õI›µ®¸ žc.!Șc&T؈Œˆ@æJz¯¶AJWOD˜´í¨p'Ý ¤%£y&ÍàÇ€.xÂ>Ï|@âŸ/¾rÕPÍæ#¢‹G —Cx1ÐlÑ05îeÍ%þq¬Wô‘õ¤é(ŒÞø&.RMøLÂÕ$P‚J{*vFbx\"&›°y!þ^$€¯óŠ©lȇ¹ ‡1£©7&8#+êêt/cÔ+Óýd–pRññ­fÚúw•ÙQW‚Åôfa Þ8P_Ï6Ô–¿J3PD¼%±i¼hlÇ­jÈ­g¦»òœ9]Þ÷í õ«ürøеi”ôe ÞA€—½-o61—äQ[ÌD Æ$Ê ¦÷€1§îí°þš£jG«+0°ºç+ÕÙ~ª8ug}°wc#µ[€â·è±gZøÌ-š5Háuæ*”U‡UÒ! Cèkc½ •½ŸÕÁ}RjÏÆø+X> $Rb?×$`™Ö01ué˕峵÷Ù>Ý4„°+ØäÉ¥7£ZFõÇ`†1hpËôpGªA­_À šr¤g­ ’ Äg·™ËcTJn¡UzÀ£Bm7Þ6`¼Õ®?Úv·ºöý Æ^s¬úq8ÃèxS¼'Xw—òÖ«¡Ö“í:ǘ’iãrñíꓽ—«ßaZòÌo’ æ ÑJŽL‘ÈIˆ];±²å'"fD½jD^â`GøÚËß œ$XŸ>HY¢ÜSÙÎxβЎ ?>KÖo‡óIß¿Có¢Ì’n6[ó-!ÔõE‹aÎd›dDovJ°›ÑžÂÛ¡*ÛPZÙÚdU¥íWäêRFú/3 t#Ü,•à–Qsøü†Â="">ÌhžÅñÂ+¸˜^¤ùºè…l˜y…3x‰ûhÉî­èýŽÙš¼dŠ‚­Zy¥·cTí)+œ Ú»”åíRHCõÇ—m tp„i(|­xàÒuâ²úôI­ªõm®·×Û13ì#NÈÊ^»: ¦ŸhK¦p-Â(OÝ „еƒ 9“#b ï$WŠmã+ÅÄ3sÇÓñ¹œD[Þº{’+çeîøPU²·<[ü>± Íå1&.šäæ´ÆsŸ³ö5Á·ájý¤G•þ'yìAâòŠB{SUp«¨æöÐ5ÊPxa}Ö]5 +„õ•8¹;eèÑ®ò§.Ú^4®ßkqêadļƒßÁwBàix”å·tÃBÓÍÂL7w³ÐØwàÈNëbŠ–b}ÃfÈ3ãcH_Ï\7¦–¹é G ¸ØšÂ4=Ù‰¹|?!m©ƒ¥Õ‡x¥~#N#^©&žÁçSGÛøïXüf¥„¼ Ìá*,«Røwqò€ ^Of‡kÊ8K&§vmn~ê.ñ߈Í5ÇjŒ÷ɱ¤±,îÇärµÙzÔúÐ6"×ÔdNœ¤•ÉÚ*ÿbe„& R÷A«™Ë+±PN,MíQ÷íAÒÇ¿²•)œÑ0E¸ñm.ÌájYùÓ]²WW Š‚_8‘°&e°;󑈼!~®¨xN «HU¹ÞH½NJœ”ö]«5óàªS¥¹Àî²L?‡ÉTNƸp›J5uá‹ÕçZ!,^  >Q-®Lˆû0¶ãçWÇæÄ"4­éíÖ·æ”ïñÝMÅw§y¹-õ$}÷¨ÿsqÅDÔÿåwŸ„¦\ê ×ÛÄÛÔû²M0¨ZÅåaVˆvÅ4Uc*«ˆâ¡õÜ+AÆ‹Jkþ-æd´;«â%]µÔm%¡(”aG`­‡Q =˜ê;jÂú‘àŠ ÷awyÜ[ Žþ‚!ÑÍ/0€ ~Ü+¼)p$ð6èxÞ†G°ëWÄÓÍÊ1Ù´è±=ü~k…?Q[)uóÙ£vY4@­ý5¼µ¸CÊ¡ªñ¨ûfÁÉÐBxŽ™âÇÙ.‘mß·wÉÚ=êÓz"Â|t‡ÚQáNüaç’i *[ž=?qŒ(µ™çÕfu¾øbüølw–Ï¥.Ÿ0R6Wû³Å°QÍa±2‰¸&—øÇ¶‰"©bbÅàaá0¢,пMöDghB0Ñ>èNà ‹‹4f½©äIìF'LzÂØˆzcÜqL}ÁZ*ÓTû°\µ7SðÒ«º1ꕈé~2K6©øR9mü»iT^'u;œ^©gÛiËW-P…[›Æë¤Þq«rë™é®~>ü“0ˆ¹ endstream endobj 6848 0 obj 6168 endobj 6852 0 obj [410 /XYZ 38.2500000 647.750000 0] endobj 6853 0 obj [410 /XYZ 32.2500000 430.250000 0] endobj 6854 0 obj [410 /XYZ 38.2500000 647.750000 0] endobj 6855 0 obj [410 /XYZ 31.5000000 431 0] endobj 6856 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 655.250000 535.500000 669.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 6851 0 obj << /Type /Page /Parent 2 0 R /Contents 6857 0 R /Resources 6859 0 R /Annots 6860 0 R /MediaBox [0 0 595 842] >> endobj 6859 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1701 1701 0 R /F1410 1410 0 R /F1500 1500 0 R /F8 8 0 R >> /XObject << >> >> endobj 6860 0 obj [ 6856 0 R ] endobj 6857 0 obj << /Length 6858 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9À¶Å—HAÏØCÃrXäx³ ëEœ=äïG-QÝ3”>Jª.RR[Ø3nލb½X¬ßüùÓ?Šý^¼yþôŸâ‹ÿþüéTž­)»?Åå뇗Hwö?Ö™âË×Ó·âÛéãécóï·S÷À§ç¿6?ý¯Å_š¿¿?þ½ùð'ÿK—_øz²Â6ßm¿×V4?•×ï—Ïÿ}úÛŠß.3ö¯óÀ¼þÿªvB”0&^ýíÔ/S´_¿ùíô¦CÀ²·Øº’²,„Vºµ–Åÿyú¹yA?}y®µ¶Ò¶¼çEV^Þ¤šÿY7¸1ƒ÷´_<³‹“ëR§›¼…œ)BU":9'eµ©:ô›ùýì)o„LÈ6ȹ‘ÒSNÎIÙªêÑÓüåGÐmú“;#ÒMÞBÎŽ•ž¶xvNâÖR%TÈ×Ù ß–ÍV›Œ¶-ä©2œœ‘²¶¬ê=¶Jü~ö”:ÝVÛAÎOY<ùÙUþü™øj×b¬v'\‘Ô|³ÒètÚâ6{ ²+íÒMÞBžH[àÉ9)«Ë„†ùmöÈ×uB¶i!OEY89'eî·I¥ è6}‚É+›p—i!gÇJO[<ûÙi%T+Ö ¡/D6ÎÉæg«üŸûÖeUoóšánp?ÚnÓ'˜ü‚ˆd“·³c¥'8žSš/>¥t‡±ÓóOîD•ph!OuÎþqÉ,”îàäûyðéóé͇F9VÅçŸÈÚvß>=éæ?·ž2Å矊?–¥*>ÿrrgW—•4-|ÝHiáÈs;òþs³Ö4`6ÜÙ`¾oGÌYI'fŽàÙ”èFn¿ú®ý@Ÿµê<Ã!ÆFºg„8]¹fð6R°­á{ ,]°ÀÈôxðYÛvDõ8‰_,Ÿ!fñôSÀ2ð±°¥¬,U(r¥@‰Ž Dy®¬xµ<¡ ©áˆ_ø-Þ×ðW{NPkäW1$lˆF C•.À²VËù³‰¯U€ºÈ$XÔ°zÃ29^”5Š5Ó|Á($¼ôX{zÖ›£Ð#ïƒÓK7ÁK 9[»*ÔíKÀÿj{nfý¿Œ)3!Ÿ²üÑ¡X¨ž.þ*¶f0ƒP Ç ôXÞeÐuÒ˜Dc6ÀªC QŒaÊ:NóÝúrK‘ ˆƒÈJ)xìéàlÉ7¸Zé=öt‡îúl+Kakh‰†[p*#(Ã$árve(… À¶Â# lT.Oá$bvÀDà`YÊÁ.²ñNQŽ¡l£ ,0Heª“Ÿ]¼ëÃè  é78`¯ë-¡Pa”–ÙLH±¬±d“;¶I",=X1Å„ qA’wHÉȺÌ1¤#?”OŠM&?̦eéKœÜüQ"#”“É®ö&o!gØ3\ݯ¨ã¯1§øA¡EŠ;TŽwÄþMô X¼ô®íû;8"eúRr0Ñ*}Õ‘­>·Ð¼b¶ x&ñïØ3oSk5eE°¶7 ^R˜hyˆ=T Î’›»% ߘððˆÆÁª—pø—U©Gl+*nKÎÞÓ2åDÂ6Ä;aÓÅJƒå`@:æRuxI¹àœ-ª†gȲ÷ #œËZ½~Ï[8[· ÙÍáÕgˆ XŽà3â=zF¾[>[æ`DJרpwÄü&-EÂYøð@p7aôû f±íP¤´ZÇ*{FÃgðlOpäŽH¸RŸ© +…b4²8rÜá\‚°)¾ÄÆi¾t"7æÛáõ¤÷jUõÀÀ}/qBò¦]ƒ”úƒ4Hî¶K'a¥õ+Fr¼(ç Ì«Û;û.IþŘ¥_±ˆý'óÙ`µ¢Šœ¶ª¾™óp—Àû¶b#;ò;ÂJØÅñ~X ¡ŽŒÖ÷ˆô{µ¸p*©¶ðhA2áX‰=¾”õÍ4KhÂÈ0’`DbðˆW‚éÍ>£ûD’Ù·nËÊp ã2¤Ïãb>nD`Ìäò"x(ó‡Ðgr~ëʯ§¼ƒïô;/zÖYGB‰ såâü8^`†±·šoz“$dó£Þ¤¼Ÿùê‹rÎÌ4\RözàyˆY^µŒ_L)!b…€”þ…7“!¹Ô?®WâÓ³ä” &Éåæâ-¡Â³ñJ4¶¡ ‰Âˆ,i¢›,ƒ¯ë:Ø$Äò ì‰“ž`ì/ðÊú>!c+ž¯"²9G9zNP¬(LR %¯¦›ÕÕ饊A[*1OºÅ×®ñŽXä°½Ò’ŒŠ1qphÀζá’TT^UrG41$Z‹ûõæÒ¥¬¸´63êå'¿ž>%¢{ïÑ«®TÇ L{RêúÝLäëö–S]Q_Ö/?¸`>w‹¸ Q ÁžÉdÓQrdI$¦¸2)Œ‰ŸÁ¾?|.0&$%_e—+D=êT|U^ÝÍ+Ês'ëÚX¿ 2¹ž©á3í„îuÔm®ÇsiuVBŽòïÈHd¶ŽíY Ta½|=žãÆÞS^7ÚÀéóYGF"xó’*‡Ï­à-}ìªÒ²WUŽÐcQ¼-8(u„DâÃ¥§ê£Ì*D>áM‰¤9QºzÂg·U‰ä~MµZvp$ã3Þ÷œQ H9Yx6Êr‚`)–¡Ï)è¾Qìµ"ô÷‰xt)Ç·L§þ$A”„{¢&Ø—HèúèÞrî/hܰ~5Ñjÿ»ªù©jóš;Æòz`þP$ù g Á\¥ p®"Næƒ#‘÷<åüzž\ÁY¯8u‹c#l€øUêüf«¿Áp87¿‡’¦ ¥[b "äOórR£8唀QŒƒÈ{(sU&Ê œ-?U‡µ¶¤9  ó˜ö#0}šRmøh: —V]_šri»õWŠõ†Z[׃õuÝXq‰ ®Ð¥`Së4¾J¡I\¹²ž¤ÝúÖáújú<8J4Ò÷®Žx“מk7¶¾ÇÛp=¶¾ÇÛlOœëÉ…üžÞúÍe-ŽñN‡Q)†‡Ƚ‘õàg0l™Ê°¬T×û®- uE,—ÿá¶/” Z‚S„·!vI0ßÖ“)coÁ…ÌwXÀæÙz»ÒŠIžŽû£LÂ{± ö¹P²Exýh‘ÎQ„¢f/o—³8)HLŸ8Ñht]XHåÏØ·=qc8W[3’RÄ"EÙCÒ2ôщSr:“¥³½]´~# ™Å³Á‘õßñJWoºoÞ4Ô8BOiˆa‹4DÃn]¸ž;Ú$eѪ¬&áy4šð¶mÂ:?c(¸ÆR›1È¡dŸ*Ç×øi¢Ül‹! ôµïf¶šÁ å¹­®Êwº¡âõðÆ 2n ú®ž“ûìQJáK ! qEFU®í5^K•_ú¡øWRÒûx+¿ø7Xn~ TIâêE ý‚´;Þ» ø4£Øþ#4 É|{â5 ,)½¬|ÎRú™9ñ4u{²*PW¤@»4b3P²X°ý‹­B|ÐM6J†Ø¥4è¡\}ˆ7Ïü?O°¹¤# ŠX pz6t ~›H"$>ˆÀƒ6Ü)É“Õ1µž<®ëi Å”«s"épØ×O =Nóüî6!Œ,ÜW©#Ò4Gš"Ñ‚Õ\ëC@qϬ… kX½I™mÅ ÕŒ–'‡ÓšÈ}xŸœÄÌcû”Úõñ–A6'\¢Vô^ØÈMÛkóHêî›¶ƒÔšÍÍvè¿%\å›Í–&‘‘Ã5º¬¿°º˜Ä‡”~Gâ^"bçtרjFCÖT–¸Q–‹3q?Ša¦aS•¯Ë’µ·6²xÝø0Û„âò9³{ܵ÷‚–ßz«'¸ÀYñïqS³ºN¶!ëNOS+—¬«Œîrgzw¹LÞÝ÷êë¥è °}E Ð A ¦,¥tä4ôHÁoaBÊfök¤l*_»`mG¡_¹3Ïo‘2‘‘ªQ òwpÜÞAKû”;U¡BÜA¹+IäxòPIËÀ*§=zÝjæ›oûi™-^…êb+ÑÜ„JÒ5«=,+°¹§Ä{rÛð|DèFJÊ©æ0("/ÆJ‚Òn•hy¥ êA „õŽx‘«n¦6W``˜²¿'Ž5òv§Ö•§PÉq9,¥´†dÀU ‹Þ“«õ*WNJ§y~_‘òe /tá”’Ã6ˆH™¾cT‹t“é=)¡‘"¤Áu[âŠ+ëEþ)I脨L~IˆñufsTÌ£ÞCp¤òì/•Ç5o›Ó£òj¿•W®”jšÂGåÕQy•†ûªWOä5öV‹°3Y² –ô ãzŸ½áÔ5ë¸\9§†ûôMW=š<GMÛ6¡„pý[:룣oœc· õ.-„MÔs;qíµpÔsssßNukÒ—¼Ü|ߦòôÇ©_˜áõu£!¡Î¥¸ø-Û{Ì:üt>Â1çd·ñvXý=»ƒ½²Žøý^ŽÜwÕA€“FÞ£¦‚Äc°}ð+E®[|õ“¾TB`…_úð2 §·pD£e<|Æ»ËÅ¢¥ÛÛRîòsñëCÁXpˆÀã³f\H ãw˜"”€°EèŠa£ˆ¤8e=Ù°ƒßƒñö©ü IŠñz°yãà.¹³¥>{ýJ±˜uˆWpÄï^S;Wññô“æ endstream endobj 6858 0 obj 4150 endobj 6862 0 obj [411 /XYZ 32.2500000 308 0] endobj 6863 0 obj [411 /XYZ 38.2500000 288.500000 0] endobj 6864 0 obj [411 /XYZ 31.5000000 308.750000 0] endobj 6865 0 obj [411 /XYZ 38.2500000 288.500000 0] endobj 6866 0 obj << /Type /Annot /Subtype /Link /Rect [468.750000 266 531.750000 272.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 6861 0 obj << /Type /Page /Parent 2 0 R /Contents 6867 0 R /Resources 6869 0 R /Annots 6870 0 R /MediaBox [0 0 595 842] >> endobj 6869 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 6870 0 obj [ 6866 0 R ] endobj 6867 0 obj << /Length 6868 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àöˆ=füCc ä°È!˜Í&Xì,âì!?z¶ÝR%éI©í¶±kOӢȪbÕÇbUñÓŸ¿þ#ù×ïɧ»¯ÿI¾u?ï¾Òc‘¥íWRÿðö]»ß“¢Ì’oß/ÉËáéðTýÿåÐ>ðõî¯ÕoÿKtò—ê¿_’ÿ^}øS÷Gõ|?ª¨~þÚüt…ª~KO?ëÏÿ}øÛ’ßêû×uƒ9ÿ÷ƹ´Tõ0&^ýrè§©šïß¿ývøÔ`Ù[ Wª\'Ê›(guòß~®^ÐwŸUªÈm‘®yQ¡›7¹"QÚU´ÉFïi¾ýô®t® ×y3rßDQ&Wbç>9k¬ ÈÙSï!ˆoM®ófä¡8 ;?V“R¦Ð™­¹\s8+K]ý^˜îk%Éjjãö©÷ ÉÊ¢ÔôˆÛ°sŸë8ϲ–§ÞC¿0Ŧ¹o¢ôœ…ûälQšŽ<ʆ þ©û—.(7õȽS¥ç-î=´’v¶·kÙÕ­'Ûk÷þ;w©sáÞŒÜ;Uz†ãÞ=®f§ª-*1ñOÿ×îtnÒp&¸¹wªtÌz¼šÉ:˜!X’…S°•Ô‡¦z侉ҳv~,óî þN¾ºl(V=¯¬*“°J$ëmv‘—X“ƒešš,ÚkGî*½TzZÒ Jû p½~y>|z¬ nž<ÿ\¬yaûãùûÁVÿ¨½E‘<ÿ”ü±Ïç?%Ï¿ìÑšÖVÿ]Ó¢KÔ’Þ¡¥›–òXº4×Ù¬gð{T {+`‹i[^?°pYÓbŽ™ÍË⬓œx1&ŠjZ”9]ªê¡9„£HŒgŠŸ)‡ä‚Ó ˆBÈ~#‘“1¹æE4XOMK֋Üg° $fäŽm QJHsÈ ý8ìž8cí`oX@†3¶-³ž+¿N=Wp ºÈ ­MÿVÓÛqŸM÷ lq¨E°ÅÂ8•Ã|†-°E/1 0Eñ u4¤¨†ÏLküÌ—ˆÒg]y ½1”¿[.~¹e\DžT³{뽯·NÀD£MÿJ5TÏÐJ  +î!j¬'ƒÀðFVmÊì„åµ2CÊ+¸0t —Ì#|ª>kC •*ÊÁÜ> „xˆ§0Ìi“g <0FRÃgR,wª€}l,†xág €Ï=|0ˆÁPÒ ó´£NésùôH§Z¢ŒÔªìµg¼gÏP;²•Ü$NÀµÚ|&—ìŸ:Æ+Õ¸ÀÊà–!”ì¶ÕÁ{öÃu2¿l>Ç÷„áÚ` ( ûï|/qzAÂ|¢ä{Áü‹™@0[XXø=ÌïËìý#ÞYƒÅ½Ý/×]¶·bEžÍQjmàQžO.¬4±úÁ›7øž˜£ìu ’_O•‚ {ð†·¢A°#K ·®¦jüŒ7çÇ é³zš[г j§1×c®Î-1æ]x«~ßj ž@†W\*؃ À€k¾×Upêb3ÀŒ~cnøSgÆ‹¸ò1v"ÀRÜýHb ë“A` AGÛIf^‚xãgX/l¿ðö@SKÂ:æ;¯öJGÁ5 á­5EYo§@ÈeÊ Ñ{‰ò!O”l0¶ñ:÷ÁŒ1ff‹s bÅ©Ý|Wïs Ïc%F`fÊoŠ‘ó^Ä!Õš}§Æð:-ÏÏ£} ƒ¤ „àÅE/=0Ö„ØYmwÒpÝRæ ·Lá~/“Ašb‡-wáéÏËò\.–`ï(áÿ|æÌà€àÇbÜ‚}óП/øæ‰óì fŠÃAp ~æÈ#ŒòÔ`©Â4ÀóÁ´Æaz¸¾À± !wĉ°#­`ÌÎ{«\"&e_ðü¼º A¼*ï×wG¹p±«Îk`à®ãPG°ßÞˆ(?Á74ß-ê7Q‘©‰B…Ñb¡õêb‰àë*ÝÀžm–2>dñVrz[åÊ>i{û0¯dÅÌôvØ+úÛ|ìØËpý6ûÑ 2Û¤º¿Oéû9Ø7öªj®Ý¢­G† ÓCK€ûEÄjoPWŸÚ¿í£­™‚W~o@ØþX[ˆgN}™ZøDì‚"4Ñu…tï8FâݱÀj5xüÜáµtiøsn§†æoI] Y b¸™ß˜Do¹6¿eÆ/ÌìÂu/m¦aT `Ê[¬¯tß´N€0¾ñQY3Xh»‰$ YÙQ§j6мŠ=cÕ c$(PlÀˆŒêh(e_w³By5ÅÈNEâÞŸvµì=nO§ýÈ:‘þv Žû¿,(‡µæð-Áñ–àFú¬™–¾¸z5xlÂÇIˆÎ\‰8µíiMEðÄŠ´Þœ:LÜc „ø¯5q|“¿t¾òµ ˾SÀ~ÍU`"J½ÞðÍD8 «Gáö•‰ÿb$[Ö¾L¶´µS‡¸Œ’‰|ÂXžÒÿX#\¥Æþ8öì½Y­íSÍ1}ˆ™ßSàÐùÖñÊC9SºÉ•Ƭ !÷áv¡²„†n¨`¨@°¢ÞDʤvk]:j¦} În¬>µƒ±¶´ìÍ]Õ½7Ë?ãÐ3¨Éé {¹ƒ-pÝÂWö8,ØGWžé‚.Œ¶? ¼Ð[ŠZ„¹+ؤ~z€-9ž)~Ný‰i 6S7bš¼ï½˜¦ÇCrØÒŠivÔ£ ÏtaA—žqè“õLl¡G–åBoC. =ƒaEØ‚ÇÖ ~4Jˆ‚½a.À÷tÞT•÷ØdFo½¸ðž;Ø{ëÀx>˜˜ ½¸ÐÃ…Ø–ƒ»Nm™¨Äütch`ðZxŒ„¾³WÇ9,ë÷9rPIèx7$#41 ¦²“1bÂ>Í”Q­²u…È-…Ca™X2Õ§TŠÒp$~«) °· Ù>"޹BQg Ìy-s¡SfkØO \ºÝqË¥ èÍ™ÇÔ›÷œ&6?^AŠžpéÈöµù¼ÞdeˆâSDŸõ£“·2< "×>-°°˜ qîO;‘ÛÙ`‹ŸéÑ—Â[ܲ›kWæ~0Æ‘7ö!“3L>Ü$„=›ø€êW\´t£í€çß¡EÝóå7[‹¨m:©õ›Åöv5©³ÕÔ~2kªAáªm'¡â]R ¥#¤OÁuÑ=Ï2»qQ×Iw¶LSc¦5´oHouuJI©Þ~òëák(¾×o:ç»pá^p±Ê(Lå·Ì ö€¶uB„µCjckÆ öÇü´ú|=ø˜ ´ðQt„‚L̆ŸØéú%¤°’ÉʶËxÉ1h~þ͘B76ÕX|ÔñC"QÍïÎڋ瓹?4Úk´9fÒ…ç–< ê¸êkaMcÐòèß·‚œÍb zÄŒkËO×2Y^B„˜×ø}‹c1q½aØ‚«21j–©‹[ E™œ¦N{Æ‘¤ÓõŠ~+^ Dä¹pf±þw~º ª()Ú÷3k&?]GÈÐJˆßÜ\sPqþLdŽXŽÉG§'çà—òB. ¶uµ@¡Ô--o,ΉƱј'^5³@æv¢j8Δaƶ=."Š˜['ˆL@!› ÓšÉ$¢ç5–ªˆÕ 3ƒò7ÄL­ !£aó+WÈ%ÎÃØí®¡°knPñ\Ÿ@Pž³´"Ù¦=£b‹ÇiÍX¼ˆ—‹¼Œ¼2˜;XüÞçY÷ÅäV¹æŽïJW¦ùùxâ¼Ug+èãw¯ƒ±ukSåkYÍãµÁܪwßGúì[e솲9”½wTZæ«|Ž^ý”̽YT<ãã¸ZodYêÜš¼//Ê\ª¶x«^µûòjÉ …Ê2ÌÝŒ…ÅkÞK­NæLã¢Ò¦0ŸH¾Éh´~‡¨É™U·ÛÆò¤íXʯ¹,¶÷:gÚ\—ïãŒÜ×â}p.º÷¡¬Wè~¼Š©1ÍèÅkö x²4Ts6Ckæ4“‘¬ïï…ÀS‚n‚ǃðŸ0´f¢…èSâÞ ¬àMa+ŒlbU®5±Yã‰Ûó¹U¬ Ʊ´ÝÎÈñÊØ3z®¥<‹í?xBìš…} #X“B}Éœ+j¯»­ ® ÜÂP”¡›!â„ ~OLŒ^¬ñÈÞv©ñüôB„¾‰fû˜ŠZÆÜšˆ[ª…‰[žŠjhU}'/QDš=MýÁŒÜ´òA2ÇjW]09Ý:Õ¡ßK ´-‹ ™S-6ÒGÝ–!º|ÜÒù+ô…¢½í.å+Þ£÷˜©œÔKc{ìf:N^Ïao]ŽíëR8ؾå¸f¯†Ý°Å¢i(Ü|¦sy¨ES³Á`®þ==xiH;Ft¶\”CÂÞ•q±˜ó˜‹ 'b‡àÈ¢wUœ ¼è= 纗p>x¦ø=ùzÙ+RsìôÖ™bQÃyÓor;'•óSòtø?5•{< endstream endobj 6868 0 obj 3887 endobj 6872 0 obj [412 /XYZ 38.2500000 351.500000 0] endobj 6873 0 obj [412 /XYZ 38.2500000 351.500000 0] endobj 6874 0 obj << /Type /Annot /Subtype /Link /Rect [357 358.250000 420 365 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 6871 0 obj << /Type /Page /Parent 2 0 R /Contents 6875 0 R /Resources 6877 0 R /Annots 6878 0 R /MediaBox [0 0 595 842] >> endobj 6877 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6878 0 obj [ 6874 0 R ] endobj 6875 0 obj << /Length 6876 0 R /Filter /FlateDecode >> stream xœí]ËŽÜÆÝ÷WpÀ-Öƒ/ `¤Y$ #‹@޶‘‰ùý°›dk†ìs›ux«ÈnQ‚5ãát±êÖ}?ßüùÓ?²ýž½yúôŸìKÿõéÓ!?VEÞýÉN¿{ù[ûﳪ.²/¿ž³çÃÇÃÇößçC÷OOm¿û_f³¿´ÿýœýð÷ö‡?ö¿tú…_•©Ú¯¿œ¿6•i¿Ë/_O?ÿ÷áoÈ~;­8¼®ßÌëÿÿη_ {ÚÆW?†cšóßß¿üvxÓ ì-už›ÜgÆ»öŸÆÛì¿ÿ<üÔ¾`X>?6Þ˜ªôU¾äE•ͪ¦)j—Û´°.ëÉ‹Îu–7Ú‹·PrEiñaçêP1®4òêj—ÛÈç¶m Iþ—åc\nY—ñ?ï\*çËW×¼ÜÚ˜@§·êƒè²|„Å[Ä[¼Û¹:T†ËÅ«+^®ñ¶Ç~×J}ø_–q¹•mâ-~Þ¹:TúËV?ÖÞWÙŸ.útÉE]ÛöûÊõ­(Âĸð¯ËGX¼n|DlªÏê”2T† Ç«kRsã/ÔÜDÑeùð·'Œv¹ç«Ce¸ÜÉêCVÁ[é~ gáƒo?Þ|0Þ´À,³Ï?µ›;¿³ûò¹J‘}wÒþM}þ1ûcûÿSöùçCs,m1lq+Or Ÿøä >y Ÿ”Ä®ßÃÕàSÃÏ|?ƒ÷Ö0` ?ã|áæº]¿ÿÜ’Jt,wÕìsïî´(_ï'Í[Û¯ ¨³"¼'§Ì„]ÔɬFÑ \Íbþ€÷†ù††õ»D°®ˆ÷@>$œÞ‚Áœà‘ ÜÞ5Ü…OXç-XŒoPZãûÁ«9È)0Æ3’7¯râÖ¾Y ©ðé0ÆbX1ˆñ…àÞ©8Ö_(Lb¤ÆrÌ;1†`z&ø†À…>Ú*ƒ½XºÂ`ÍSØÁÛt”nKmEa\Æ2à ëü 5aie†%èÌ– ^­€?a ÊÀÍa½ŸR `Ç%´S¬³‰i†¢3|XÒÁÛò˜—C¬ð Ԥ̱zlaRã !Emj#Ò­Ú=î~Å|÷+ÆÁòºIŒ±)}‘._HºS[½~kT¼hÀf|Þm¦¶¯™ˆÉeeêªxòcÔ _ž¼xÒ‰ûúX7ùù cµ¢s¯k¿ÚQ”?z×%»%ÊœEz£`Öû:ŽT­ÍëEðò5ܽéê†ÍÙ›G«õž¥kŸ)á®=ü̲ø˜ÛÇ«1Ä;8Æ!ñ•b4˜¾oÉðkRRÆ)ÛíÀ˜ns(A÷¤˜J¿߯|.d\8M ˆ áÇœØÖpø=øncÜSDIUäÕXTaŽ—‡ßb/…èÞ^Íá½1ç7¢ÂõT˜ÐT€¨¿É?½ƒ¨÷êÌxUžŒ‡ôo0æ`nŒù æ S´Lì@ø æM*B¿x¼ˆó **ëë[„ªÞ¿×’fˆSŠŽ.eš¢K™=ã"C†dI¤g„_HKT|@Fù¢‘aI‰(ˆQò¬ŒjŸ Öª¼OÙì`öÆðH%CB´5]ÔÄF@¸ÿ^‹ËßöÂy7d:"/ÀùDBL…‰Áa7“Sµ‰8Œ/–ä1ñJ&C1)DªÔyÇ÷pž'‘ù´Ó@¾Y½OO(Ì’è°pw8¦o•ʦ$rL„÷ÜG®™ì¸=*em=Ó­pqø*“…*pO‚61Çt|xÃgÁ“Z¬™0ÙAÿ±¦¥š¯KMºyPBæ(xo8ï¯Æäw3ÙEXïÃBè?ãEˆor|ŸxX]€Ÿ¬/%„“yäÊx?ƒ+9~MÕ¹õ[®ŽÛÈ*|êü(]Œe*ô+Œà·”¾~—™áO˜ÛmÀb`2Á:‡œKÛà(å½ä$uµÂ[Û#oFè–¨¬MUŸ†m­õ+¹SZí¥_ä9ÆšÖ­'iNWº×Ô•¯ÝÈ®.MXÜœª,Îû‹{¥Èè7˜ðáÇÄ4qB˜¤Kñ\“ÍÌ Õj¹:ó“Ú…„ "°,À‡ÐñgðÑñ®ÂÔð€g’T”ƒùâ Ĥ-¨V;DÁ®˜’©®G¢‰IBª? ¨„CÕD“!@mÊoÌûú(BXÆi'MqÌ÷jK”Ú±~bѮޤWoT©SE—`Ô&1‹"xoL¾>|¢TIøÌfʶ„¢[JmÌdèf,PÀ€%Rªª]."¼_^@å*ñâdª(£<ΗQŒVä<‡̉Ø?a© /^¹ãQ•™N´KWc°ér$¢T2YÁëÑb8·"")Ë1Ö$*J¡ì&†$Ÿ昘]j¤®xªISÕXª¥0Õ±•©ú¤¨"5¢©/Õ5#T¼@[Vé×·Z`ü–nP •}LïZKžvü«L'^ ~Q®ÕåÚ©©÷æs{ô"#T¨ ÞÞ¤ %\?Ñõ= ‘ûŠE®žßLà*f ïFÂñABbL̾‡zÁ|·£í©ø³¶ØYe:%H¢ ¦J€3š¶jäS)» ðä¨z.ö¶Ta84_SiƒCéq+J3ÓÒìHœ10åðïƒ5ÔÙm¼Y"bËyºJ>£iÄuõs0§.d'i]Œu1_¶/P¸ïšK;ŽÇhÍxtú.2†BLiëüèf"› )ûXÕ—Ê—½•XãCTE®?ëmÕUu¹¤ Õ#öåªëÔ³ö¾\ä›|I·+\?·wÈ’øêÞ!K|òMuÈjl·wÈÚ;d±Ô´wȵâ½CÖÞ!K¯÷YßX‡¬Æí²æp®½CÖÞ!kÚ¥-<˜í~û‡5Žôkª5ú‡5Mù )Þjr³OŽ˜Å-ù¸>·Ø„Å´ h‰Öôxw“û$Œ =¦|¥0 # ò»Ç}÷¸«kÉwëq7y³$æµ{Üw{J›s÷¸ï÷ógvûîq—yÈîq¿!ù‰#ßwûãIäÝãžÖÉ<îwéC»[»1vI„3¡ïÛ_«¿U®l06w¯ÉùZÓwµ‚à€Þžó+Ÿ÷¾'sε×ÄåëõÞ`)œ€)xÀüb2†ŒÖïKò(d1úñÆl6bª‘À{f#!,‚èÑÇ kŠ{´©Ò5×u›-«ÜQ¿ÊË1<%åÙ›ññ¶oaE¼î:¯GðHÕæÐØK2i†½ÖΈic1_o¸Þœ>"E‡ÁØáÑå‰/ûæK´¹]©Ä“6ÐÌPe´ˆJC/ÜÞîz²þLŒ¸W"cÊm±Acw2¼0Fø[M¥bÊŸÆŒCæTßk¦MÿêFh¯…\iIçϹË5üdc+ƨinXÓÂ0HÕu’yÏ|ÏÓJ·y¿®‡ð%ë~É›Í+ÞÜýdS7†LUŽ­ ȶBÔ!‚“2’ÁV£SŽÒDlËùÏÌ´Á½‹ï‰Q`F)Óš)žPé„I>?ž>êÖè‹—?ùåðIÐ=â(-ç=ŒËÝñ9Œ{šyOÜxã¶dºðÝÄÀÉôS]·ÎLs mlÏ«‹ªûa·éN®ìÚ“ª¿2;™óN|¦?ôµÏ4ð=ï†êt„ _¹²ZÏ=Nüä¨éS[®=)á®|ßcá|R÷„NúBžw]À¼%`]@XCè ®+'}B;è>®ÝœZÂÇ ¤3Õ‘§:jæ6¡V1cÒRé´LÓjš²Ãu[ZkÄЙ«\m`c²Y©Œ® Ž§"9ƹ³dº“üÀ¸˜Ño $.Lµa¦µjŒiÑɉÁ¾£¦E”#±{Rˆ.‹eþ˜7Mü<“–Ç“¶ÀDŒ€™0?Cwr!5ÌŠ™9·ºFD9:ÆøÂo&oŒ޲OIYJ«Ìa€‚E/æ>ë_ËÊ©|aŽ*]_w L3¨Ôt–€„¡‚ýYaÎ2K$•)%ápXW]ÍÂÓºMèÓÔ”eGÓÌ<_CŽ’À½æJxV"¯‚rÆ3dTÆè誛ÂÑ*–æ_‚r¯ÛEDR›Û– ¨Gð„ÈZÈÂÀš&SNÂèÇ>ª^F#aC°b[²¼jW]¦éVi!Ý(sW¬ºÂ>ð*ZB(¿44Û`ÊxHÕ–jšÅ”—`Ï üf6KbîÒÿ9G;¤]µ²^““Å 9Øz$Ô+·Þj@™€¥ -¯Ie»ô öŒ?ÚqFË7—ð-èCxŒ“F£ÀxB5ºÕ/Œl ' %&æ…„aLR£ÿ0Ï”y¥JqO+ŒQ?5,áÌØ’LcÕ°»åÀ 8fh!פ¡½Rl’QõR¹Y|>¸ …r]3ðžrÝ“5ÁÒHÄšyD4TÀp:«Õ¯%wa{¾BJU³lYW‰œvú`BTÕœóïµDÊí®Ž¾ uÖï.tÀ„s3¨î§¸§4î̪Þq'Õ¥Óf™¾©^#þµÆ>¸W³€=Ä,†<áÜ­SúñMÌÜ>Îõ¨föÆÌ‡ÁSɨ®÷©v­Û«?Ñ®<Øò®!ýl£ssኛgNW„?VÃÜAõ‰°Ì…pï:< ‹è·.ì Oc:îa¾Ž§naX3=ÚuáFôÂoi¨¶æâ9qI¹HcoÒ=Ãðü)a C÷xšæÄ´ ff5·¿GwfÔ$ùJèØçaä81³“êwŠÏƒylª ªòL˜í€1$‘=^ü`ý™”˜1G¢¦¨2)¡¤+ÍLÛ§Fß«žc.t—çÙÆtÓÒÍÀ Œÿû”æŠ~Éä" /ø³ /f¦ËQ^NBê8<¯ËB£tÌ¡U61ö æ=ƒIXf¨†·¼Â\8„€1ö– Lƒ/—ê‘d&Hc“çäo¥MYPƒ ýöj³¬¦w SpÒ²&nçW¦‘‹PDtÄÁOB Äôm"zë’º.bŠj)6Ä#SÔžÉõH4M©¬xãe¦-_*ÿ¼ç ‘1Pbùà÷0"ê³Â¬íßì¹E&×>Þú…*U} ]+Îss²ê3;Ä*úTÏkzi·ïêŠî8³ÚM0®œ>é=öXŽgVYU€wè=îV@îÚÞ>ô'EŽ lÈú¯[ÊáfMôÉ{DÃÍ$±zwå¯?Ó³tôž,¾ow<\4„ƒý°µ 0 Bö¾„Ç7oÑ`í6Ƹg¦Ø´ zÁÜjx|Rüžr9îU¹;ö|ëbTÃvxþ’ƒßâÞÙÇÃÿ9Íý endstream endobj 6876 0 obj 4317 endobj 6880 0 obj [413 /XYZ 38.2500000 116.750000 0] endobj 6881 0 obj [413 /XYZ 38.2500000 686.750000 0] endobj 6882 0 obj [413 /XYZ 38.2500000 404.750000 0] endobj 6883 0 obj [413 /XYZ 32.2500000 178.250000 0] endobj 6884 0 obj [413 /XYZ 38.2500000 116.750000 0] endobj 6885 0 obj [413 /XYZ 38.2500000 686.750000 0] endobj 6886 0 obj [413 /XYZ 38.2500000 404.750000 0] endobj 6887 0 obj [413 /XYZ 31.5000000 179 0] endobj 6888 0 obj << /Type /Annot /Subtype /Link /Rect [148.500000 694.250000 176.250000 701 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn37 >> endobj 6889 0 obj << /Type /Annot /Subtype /Link /Rect [178.500000 144.500000 206.250000 151.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6879 0 obj << /Type /Page /Parent 2 0 R /Contents 6890 0 R /Resources 6892 0 R /Annots 6893 0 R /MediaBox [0 0 595 842] >> endobj 6892 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6893 0 obj [ 6888 0 R 6889 0 R ] endobj 6890 0 obj << /Length 6891 0 R /Filter /FlateDecode >> stream xœí]MÏÜ8r¾¿¿¢Ï¦GdéÛã90l ‡EÁlfƒÅxgùûé–(µTâCµJEJÝoÏ`×mi$–ê‹äÇşÿåëžþúÓÏ¿þÏé7÷çǯoÙ¹*²îŸÓõߟÆl}v¿OU]œ~ûþöãôãíËÛ—Ëÿÿxëøúñß.¿þïdOÿzùßßNþËÅ¿¸ÿèú|«LuùóöϦ2—_Ùðçõú¿ýû?þ~}cßœfú÷ŸòÌd–®b,4ýã­ÿLÓþûßþþös§€u­Ô™ÍòòdrÊO¦Éíéÿëí÷Kýë³s“S•y•mi¨²—–.ï¿´d›ìDY3k¨ýWçõFÿåÖy´—w’«kÅPi‚o7WóZS”ui/|®3êþºMU¹Íœ™/!¥o‰áõ1Ì\gñÌÜI®®gæÀÛ/Oš¦Ìª:‡¿Çm4$ES÷ ò’å&×›KZ+ʲ¿Û_¨Æü^uMˆ¿Ä3Õ%ºš‹,ð÷D¼üDU勪ÚI1þUäɧŸÊ¡®&'E>"¾’¦¦ù>¾àÓÒT n×M’—Ž¥ÕKûãÖ ÙfherÚ W9 ÷c“™ŠA»63—Óö|Z&Ïê)bÒÞ¬•ÑEEøõý}|}Y/Èt[ÔCdœ~ܯ±?³ £ö[ÑŒ††ÈŒ4á$™šêÖpàz'Ðô‚žj˜M lXS5ÌßÛ kU㜙[scPÙ̎ĺþ¦.ê.´îlG‚Ó¿k%CSqLÞ·>úEc9|Ïê«¥m56ÉA‘”ÄL2Í<>-žÙsk@MôÓ] çï[‹cI¦륜±ã´t‰1¿@¹¼×õå,äon’‘b©­·’ËCËŠšøô`â­!fŠ>¶ ¿§N®·Î]¸ jh¥[:9lÉÚó\`ÑÞ^PSĸ½Y+“䣦¿¾§ÙeY/­Èt›C¨ÕûÅ‘]µßÍv B²u•öµSÆ×Ytoö¦š©M nXQ5Ì.Ÿ¬UMçÌÜš[ƒÊŽ'¹×¿×ÌE» ­;§—ÅôïZI†ê©8Ôô­~g‘ÞgõÕÒ¶Ž›ä HJb&™fŸ–Æ Ïì¹9 Æúé.Ô½wö¿n-Ž%™>¬—rÆŽÓ6ÒYl$ÆüB=‘Ë{]_QÎBþæ&)–Úz+¹<´¬¨‰O&Þby[¹¯™^§ö‚ ª\3å=^Sp\ÂsE{¡€×ÜQ¼fÖ¬ž"üúžf—e½ä!Óm¡|ˆñk[GdFí÷A³]C£,¼¦ ¾Î¢{³ç0Õ¯™5¬¨f—OÖª&÷ZskP ˜(8^S xMÁ ˆ"^S2¼¦ð‡Ñ/•”Šx WKÉñ$D,%1“L3OKÀk ¼¦à0D1à5Çk <¨éd®%ÇkJŽ:Ì/ DËüŠ*9^ƒÄˆ¦¶ÞJ.-+ªàxÍfjCª‡)ÊÂï©“ë­s÷0E©‰×T=^SqÂsE{¥× Ѝ^3kVO~}O³Ë²^JŽ×ŒM·9„Ê”¿¶ó]€×”(±]C£¬¼¦à¾Î¢{³ç0ÕT¯™5¬¨f—OÖª¦,|ÖÜT&*Ž×T^S1(B“0ŠØšá5õ€?Œ~¨D†àQKÍñ$D,%1“L3OKÀk*¼¦â0D5à5Çk*<¨éd®5ÇkjŽ:Ì/ DËüŠª9^ƒÄˆ¦¶ÞJ.-+ªâxÍfºFÆ@+üËù5¶§•XM~ õüâ´ß…i´“¿fP~ͬYEEøõ=É.Ëz±œ_c5ù5öF"áü~aÔ~4šüø5È"ëÓèÞî9SÕà×ÌÖT 3A—OÖªÆ6^kn *bDâüø5Ĩ#_CŒ_C_düË•"¿f¦ίBÄR3É4óø´ø5¤Â¯!N¡_Cœ_Cœ(¢§“Qür~ q–ˆç‚(Qó#¿¢8¿ŠMm½•\ZVç×l÷¡6¤Š>¶üx q~ õ´Òä×Pϯ!Nñ]`Ñ®Á¯¹)ðkæÍê)¯ïivYÖ ç×&¿† q~ ¿0j¿M~ üd‘ÀuÝ*üš‘j¿fÞ°¢j˜ \>Y«š_£æ5m,M âüø5Ĩ#_CŒ_C_düË•"¿f¦ίBÄR3É4óø´ø5¤Â¯!N¡_Cœ_Cœ(¢§“Q¸r~ q–ˆç‚(Qó#¿¢8¿ŠMm½•\ZVç×l÷¡kdô´üâüêi%¤É¯¡ž_Cœ6â»À¢]ƒ_sSà×Ì›ÕS„_ßÓ첬ί!M~ $âü~aÔ~4šüø5È"ë,ºUø5#Õ~ͼaEÕ0¸|²V5¹×š[ƒŠIˆókhà×£ŽP~ 1~ |‘ñ/•(òkfjáü(D,%1“L3OK€_C*üâ´ø5Äù5ĉ"z:…+ç×g‰x. D“_3Wç×@1¢©­·’ËCËŠâüší>Ô†TSpÖ¿p¬‡)4ù5Ôók×Yìk°mnjl›y³Šj™jß9ÈZ½ „‰‰!§réбuå*¹UŒUÄ:1 ÙˆÕI®’k+¥¯_®hY2UÕ©çºQA]A·×GÐþeŒ¯6L'¹ºVœmo?×9º¦®«¡¯F.êÚ^~WäþÙ¨´¢¶b^\JÁ&E¼X¦K6èMWÉÕµÒ¿ý\—îø[ØvÝꬹV3õ)j)1júXŒÑCÜÞÃð—N:â˯’Gê!f/ÿ²æ%X’î ¨u÷#ðà‡oo?¾8ÛE•åéÛï×zf×6»?¾]TRœ~º¸«šÓ·¿œþ9ËèóŸNßþöÖœK[ô"vw2‹îØ_à3„î˜>ó Þùu};ïd ”­†oƒ˜|ýÛìRcí$€ÖÎð÷`ÁöÁzƒwD:€²,­ma;¦@wrYæ£àü=P;9”:‡~€e3™¦õ†íCÔ¿~»¤Ù販—ýEâ±Xóø»qV…Ï8B ÌÑØ+ð3îY ,Ôae¸ŸÂíàHÇÚÁÏ`Ù=˜$wºg’ÄÌe(»!fDq¦êËøm‘ô$ÜobO¶ϡ/[8Îþ²íTeÑjáæð]¯Ïu“±;[g²µ™Þ錟sêŽj¹Á´w õmkÇÂg Yç t.ò²®&ÏTèm.L}oHu`ð÷ä‚ïÁ²Á/ èM÷mð{¨ÓN}S Á×CuITh§f"å¿ 1IÀy—ÜºÍ ãÐ7³õs_Î0÷ç ²†% ‚Iã¸F’j§ 3WÐõ;ÛÏl™ãWŠXSŽ/üñö5ÚZÔýE„©î)V­÷¨O¦ñIc;a®ûŽ\“ÝðÂdçÎfYÃw§rùÑr籂g4èúØûWe¦™Óù—çmο|4‚gº¡1碡‰ÞÁß“AüçF¾;ðmn!Í#›‹ØòLÆ2§„:p“$ßÛ ŒÚ°la€tå].å:7_Z—ÇU‡4aƒîÐ vÚH$Èf?ÎÒƒîÐά—š÷Ñ]Jømx°ˆu~+†X$ÜÇþÂ_Ow·èŸSpï·q`ؽŠ˜ú`#|B^MýL›ÜCwÜ ´3³ þŒ\3luÃÈT¾$Á$€ï̱©æåÔ „'ÝnGâê8úpÌb ›9rF—à{õØI×gô¸•i*æ¨ÏÀ;{ÄÁªF1ÖX£Â(8f¥áuwB^ò=xe3 ¨¾H6¬TzƒQ`sàXÀ@+XXK ƒˆ}åeRÈrÐ"&²ªÿ9@׋a5ê¼ðü6ÜÓJÀr#™ÿÀ~4Ð×ÃÞ2 É•÷½óKT¬1ÚÐõH]à50åÓõ®‡šØ¹g²sÙ¼ 7Å9ãÈß/ðmC³çS> h$ÐŽd•0ött¯~äù©ÞÐõ¹ÆØY§û^p¢ü×+c[ýæ¹zÆŽ+ ܃IÑÓ1E$@Æw–d‹kü²Ì™ñuÙ¢²€•­ëOeÈ!ŠËê0Qx&‡=“Q†èŒ’*ºÞ½ê‡xhŽÓ«H™˜Hýádˆ]é™ÜbˆÈ&u÷2þîÆïsBa¢”ln,H<•‰ûø¾™ø=îËbõ@³Ò/q¨üx*C™|†ù2×–¸;Ð<oñ‘lk–lH×]LÇ­°c‚Í–‹N–(ò“Ï~£(+ºc>g9Òüº…¤B€ U/(‘½ŽgÈš™cL`fŽÞ‡!ûÈ/4ˆÖy$à yÞÇ´­â2ýüûeâÄñ} ™¹‘”È„}q})|ˆâôsv‰²ÞÇRýwš™K’®ˆÞüÞ—÷‡ˆL>—ÆÕM©UÐ{ºtœ(†4+ ¤<¬F|¿ Cx±APù½õ‘š¯¾V’¿Ï#Õæ¸˜PˆbŒGaƒ"Øø‚µ¤Ø¦¤ÄÜ;qÙ>_UÉgæ/Ç|pÇôI]¥Ì²GBðBcÙpÐ`ÃïÉ1¥Z2ðW] „:n#4pv()),(ë[L÷yÊž&9zô ÎWpêgÚ¾î@è^ T0.¥–­–”þ~Ê\š~É eØÛøCN &\J—ßÀ4H\$Z%Ç…à…Q Ku"#*œ‚'§Þ”{Y[[RÔeɦq€ÊYâ; FÁ †hx/8M(ÀZÀá”jÈ p2ݳ:¢8³Ö EP¥I´#IPø4"Á‘ä4"ɸB9JÞMÕ¶‡îÜâ×¼¬‡ÃÀRÞZSTñþ‚4ÒE¸T ”1vÌ÷[Å8Y•£ņ^%I7 OmÁòÈþ˜„ÌžêˆÎ@a<+:~+ё틲ÅuÌ‚*Ê9’óÚâ×à¬gA'¨´Ùø1/_‡‹ŸåæÊ¸ù5Еá†S•qT\Q«;ðéøõ÷×| |®«‰+9J,(9ÉêYëßá/柨F»¢£Ê![qÛ;µDÌäME,“¯)âG¿© saEæÅ'”çùìk÷ÊÊÓæÝbLµxyÛ­=y¢T÷|K*MãêÔ¸µ "¸ë _Åp ë'§Órv"]…>ztÃAt³ÒÒ‰ üy±Þi$õE¨-fä¼afÕ©Q=KB{áHÊÝÉî•Ð#™G0&:rï¡Üû¦ò®w×Ë'šIpžT‡Œ?Ö0#EYywÄ|“ çÊá…E¼ô¼;f½?¢·Ï [¼Á^Pv]ùˆ/ÉÆUbwÀڪǂ¥òÌðˡް` %öÑÀ‰dß³.@²¿Z÷ð<ÉzACwçɳ‘aDûA© S¹íäxõ?óŠŸWü$´öÑWßøê_±ýȱèͺvâCÒM™÷MJȘ*ø£ÊŠª} ã[øõ$@Àõabìh¾v‰Ï]ÄšU%³>Cp¦¼29Aµ€¦3[²¤”ÊØïû…oéV%–Ì“ƒ˜•¬Ï ,è`CHÜõ~5àþ`7¶~äÃh%ô-QBņ“Äãý©O´®‚wHh8Èþ#ˆd]Ôa3Ýä@‰^LaÑ@(ÊZjvgó>/o ²—ý|ÿøI° nrcPäÊ™ÛE1šu  “gƒAïŠÉ³¶a–°4×ì¸Såõ*wÝ8ÚVLØ$Ýð–ý¾1æv p¼ºw¸T_ܯˆÚÙqG„Ér¦CÉ IWï¢^;,¹½Ž+ÝÝ)3=¿Éê·šƒš“Ln#ƒ«ó±ªî„áx{û_ûø¶}ñ 0GDž~l¬íþp L ñ*P¢Ma±A¾Ò}F¶e¥Ä~ â0ï~‰Ì³ëjÖw=ø’+N’ì%èTòš(@?ÜÝÃÏ“GÞ%™¼ž!ºeWÌx_£j*¿v}."`B¬| ‰${WR% Ì%ã©{øãƒÐ¶æ³4ÉB™`Ö%q"QETQö Ë˱ò*õñ€.SqøäYö¿»9}äâ¢]Ÿ]ZömðÞKHÒQ…Ÿ©PWŒ=°#àžûõ©¢^B·íÛN)Ÿ ‘hÓêm: V›G9QÐq‹hÕÄ]N?Rü«lÔzZN£†*NG‰i¥!óƒFÞ#m«<"ŸKEž19ˆŒ^¦gœ0™n?ôȾïo´²\S§[‚Ežë<Çš§ÎmÅÔW°$-2ÏQç<º„„ØgWZžT"^ A N&—@ôŸRã·Iȧ¸|ôésY—ÌòÉXóq«åˆvëáøÄCh pÊ0Ð{™X'+¡†qɰëxM•­´’9±hEP>¼‹ZF¢0¼}¤:~¯t¢\ÊPrÖÞ|Z'YIűIUjFŸÛPž&U«¨–M%L%…}%C+åY4NX6IµÝkê(=0ÚŠ‡±’c;‘-U/9ÑŸ‡m³t`$,Èù‹[¢gÜ@Omõ ’‘Í«ç]=Kú×4y£´[rÀ1FµYe§*LSéšÌኸh]@Pe7çÁ `ãg$ìÏQt¹¸*\ Iu>‰°ÔK-¨í¼‚Ͻ›ò_Óåè¼Jiæ0’ÙÅ£ÃD3¯ i%gF—é¬Ud‡G„XR8"\DÛÒ|Ý‚‚éú/ö‘ÃÌnÒØ$ï‡MKðÝxv —¾fAÉðGœ¥-œÙb3eŽ,·àÜ*à”1‡‹}# ©ñÛ0v!è»%‘ž,— ·õU@çÏdø{ºp±mYÕN²zšõ«&ûàu´#nµ6@­ÕÙwáñü.»ú~3I0jÉZÂc¯¸è–½Œ]Ê+QYW•%8û $¥FÖ@lH¶±HöÆØ[³b¤«Ž6ê³)OR½iÅV6Ý9s²miüEåTJYSõM²g«D;l5%{ßÏÄ9º@§ßëQ„3ÖeÅ“¦t⥠YCØ>äBX8@(¦ØÝB“çLS uæ¼+:`!•Š[UA%rÑ„@PàaMo¼â¤ÚÝ«&‹†¢³ÏxÌŠËèœîI°+&ö’IIrz~Fwº4FJ€·}‡ñÐ…Lw™ÿ™Œëp¿ÝÝpöèáB‘%t'€¶Ä-Ž()® KíÕ©ñ˜è˜Q eAEIÖ;@í“Ýí“–¾ÆÙÇL²Owå®´eÖdþYÚ‚ãcUk—ñÂÆ‚Ì\A×ïl?óâ—Ÿ—¯Šñ…?Þ¾2¤^×Ñunº_ô‘¢OÂwùïý5dEºWMzë¿Kƒœaý×þ {6h¿¡ÜÕºl®ZmÅDL4ESÅÐDgÙ Æ«kˆ<’Í1‚EQy!ÕbškN—8ü†ÂкAªùxdPE½ÐYRÝóðbœF—€á¸€mÁûVUøHTyÅ […E¸áôÝÅ×טwÛˆ$@UŽØí\Ët7þ.îaE‹äª“J½Â [ {Ì5HÑÈ@ß Ò­6=K¹rÜ NNüN·±ÜGTçXɦ/‚  »eà¦â¹ÜnKá‰Cœ8+˜®aG)n›3·þwlY=Té·Íeg¾­ß6ç¹S9ýØé®^ÿŒÛjé{¦AÏ8šêÜØ)ÔáÜéêœ êè7ÇÍÛq[ž©µö]¸œá»Ó¬ÿ,[à(u¿Ýpþ¶~à\;ö·°Vöþz‡Ô¸<ý©Ê&`6̳Àù‘‘…T5áIQ9Ús¹J•+|Ä\$S¬ ŸA²V˜h[°¤z‚n]¬¾®Îs1; Ú°Hô±’Y+Ιޢ¯œœâÌ®%x•Êë÷Iöÿ%Ûôd=‘„b«K€“”Û>b¤²“K2àQ©Åsü1KÌÍ‘UÍºÚØûò46;ÆÍÇ;}=ÏáÌg²OäåñûtÍ"p¢5É\¢øM {eÉÏWe÷/ì¦ÛûçÒ[Ê*÷ÍpðûC—XU%ã*fÕ§W7·•:Üõ÷EâÞÐPw°K{Ú}nÓë»»>¾c¸¡ñ6hìØhvêí¨2:»àXëOyG‹»‹êËéËÛÿp|† endstream endobj 6891 0 obj 7169 endobj 6894 0 obj << /Type /Page /Parent 2 0 R /Contents 6895 0 R /Resources 6897 0 R /Annots 6898 0 R /MediaBox [0 0 595 842] >> endobj 6897 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1701 1701 0 R /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 6898 0 obj [ ] endobj 6895 0 obj << /Length 6896 0 R /Filter /FlateDecode >> stream xœí]ÉŽäÆ½÷WÔÙ€j˜À0 Ù ø``0ø`ø`H– Á<ÖÁ¿ïZÈšîd½$ù*r!›3º§Ù•ÌŒŒŒ-#^¼ùãç¿þùÛáÍ»Ïÿ9üÐ}÷ù©:6®ºþ9œÿ~÷üº=ößšÖ~øåéëáëÓ§§O§ÿ}º~àó»?Ÿ¾ûßAþtúïçÃ_ÿvúáý/á—§F5§¯ÿ¾|íuú®º}=ÿü_OùÝá×óˆÃëúɼü÷w¶R]gÏÓ˜xõ×§a™êò÷·~}zs%À²·´•éÚö ¬±ÕY}øï?ž~:½àÛðÕ±ÓÊÕm­Ok<žÿòOö•>½Ó*uz2Æåu¡á# ®moðËÌÅ©¢L­‚£GÚfãô•T‹@«Ûè16ÂÆÜåËÌ¥‰2l2üØ ©mS="3zòtí•Qj?9©õÇÙT p¦%¸¬FŸ ìÆ»Ø’Ïjí‹>HÔ‘ `¸4 ›ðgð{âÊiƒµfJ†Ÿ od-æA87êÜÃY6ÎM½'¤ã÷Ë%wl>iÆÌøÕÃCeüŠÕ4^z@ѤýÔ‹d­²ªâ¶iZOÜÚ+swÇËl^P¼COzJÜyÒQa´ªñW`⫯I[íæ“ô-z¢á“žcò»ñ“Ib/²<ª—'n8Ÿ©·®ëæoÝøä|²Fèšz¶‡j-ÜTž–)R¬–¨Xlßàãe,p›ðìEé§Þú–ž#· S/Û‡þf[‡–Á˜…¦éÏcS;ÏÌ…¾d õΰR¯:ál`B^¸Ix÷F’± y×V(³$8Á˜žŒ!Ë,2 ÛØŒ;„„õM÷ˆ¸P„ÿ:~$¼ IÉxùL(àÕ1²šÐJ,’>ãÁµ/eÙ½Ó3óÇN%ÖþøüÞû ¼Ãè¥é=*ê誢r ó]H`õN胀ŠJd”0A—ÀJGò/>‰è’{""®Ê˜¢²BLVÀ.9$LL1kl?àa›¦ó…1Œ<ì÷èI¸¾çGOyËwžfná  'gß“·Ý|ѾÀC ØÌÆ(ˆß?±ã[Djq-˜œ‘‹]*hÂì~|ÍWßÎÄKLJòûùº…Q«ÑC­j}aEÜt P£¬¥T¯ü烘ÁªîõO…J×p«(»ñøE9’2þ1§Ò¼‡ïab(DÞukÏÐ@4>F¥1džáDÌo)£RæsT«‘Ú~;±}Ø´À–X€…¿ ÒÅÖð݈,åe¾®Ñ­¯ßs=Nwr,Íà›þC3žd3(üÀ„­¿‰°/¸ -:!9¯Fc¦U¾Û†¹‹¦®>‘=ÈÜ}R,7ßã. 愉˜zD"-`69•‹^´®±o²Ù*‘­³5/Q" s 𣔤b¾G ë÷òW¶yyàï]Zà”Eƒžàë |9‚“‹+| gÝ{Š÷>Ÿ>“Š:ð3ë&8·uð `ê*¾¦Ãt³ zbàzö]àva§h…Ï< œ,\Š?cÄb734Këv{Hv–¬§‰àK¼sÌžââ ˜4‚- Cì‚MxÎte'烟8̱óXª„¡Ë‹áò[¢w*.Ç»•ÿdä÷¡(~ÙÏŒà™™¨ŒÐÍ-»òúJUëF½ˆ<ÄNBÚ/c]ÆDÎû`Ð!d¯\˜‚Ä5¡Éýˆ¦6{§y4Á#Q,¦.©¯LDó°MLj0‘ç“\$1zžÿ’R,PÏ ØQþ¼ßN\r[—½ª; ‰°`ÂŒO$t’J·)hc¦ *å)«uåÛHÔ7`É)XSc R•BPªÓ`÷žçì`~ïyŽ"†§ðe‰Ï$dÉ–ø‰¢éf¶¥ÀTÑ0é‹“öT‚€^×LsBt%ëŒ?™­;”þgP˜jKø™%È›¹0¿°ä¤Â=ó}-ŒF',~±]! Ù2mµc… ùÞ"Û>â1õn<…—¿úAÖâ\ÀÄ眖Þ{Á¥ƒ‚80¸ºt>bvÊBTcôðÖÚ?i*ZüÓÙ'‡|›÷‚½Þj;‹ü%2ÐdL¡7V€ó±ñ…EÌ:Ãúk œо!n„‰AÅÈÒdF0\çë‚@ \Z 'gkŽÃ:‹áuªIV\š³¸ÏÜJ04N ň„8]“H˜fŠ ž[öò#g—Oî£Mžâñ0óS^såÓ§ÃÔî¢OžuôF™½ójo×þF?…›,ˆœˆ^"0±3êî[ póÐõ~$“ºz”Å2`²adÛðJE ðð „,Žkdb÷ÇB—¸ ²|#Ì/ƒHòbRàÑll×c?…8r%w“| ›6êm…ótáª"9²éÆËC R>ùüć”Þ 3jÒZ ”Á~b oœUŒÿ±eL J§Ö“f‡ënz‡S•¨b*bÊÃ÷Ê@‰Ž¤Lá&óª°ömB~iÛ鳟hÜå£1´å ¼[ ¿è >Á|‰Á’0uðy†3°EñnS´Æï!zâýI xSWͧ) [pѺ¬L‚”Ç\ˆbè$¬­ñz°žŸÁ{6ûÂúŒý‘ÝSL7¼s ¼‘lÜ[Sp¦ÁTgò{3 €¿}XˆäÒõðÖ„·um'÷›: ¢£1þÈd ? }ÛGî.(Ÿ*?dZ"+ëJ¬ w°Ø²Idá2P[eÈ®¦ÒÓ§.ÕTãgà—wAcíVÇ@‰ã¬’@‚ú(¼™z~ó½9¦ù»›F©¥{,‡[¸­áºŠGÃK0³ÌBó—ü%IFŽzÛc<­Sr ˆdÍ´³Ã&dkôE6sD6•Õø)=´á,‚b|<sN¦‰*K Œµ€Œ›™"œž‘ )_ºÓ|l>á³Y[ÐCœ ®óÔ&•tΔ>3I0[ÃÊvîq B¬ýEÛ]É5Æ|FÕ(näIév$Aøh\DI§Lß+ýÙD#ƒ óÊ5At®i6Éí²¢3&?jëmŽQ®R\ܵW\c+,ƒª@f*5€€Ø*شDZZ0‰7‚„ Ó“3œB‘zÍuÎÓk9ÿŒÏ9.* ʱ\n9ÁÜdX)ŒTÁLLD(ÎpÊÞ'%¾”í¶½qˆ¸{+ÆÛ#_€-«,—×FÆôýªÎwþRTÊ…Â8ªj|wôct2(å¿´€d›¸æ\1ÎIì°àpïóN ŽlÑó9m#ÒŸw{„¿afËâhÎ×"Ôõ2žcvfš,VS™•Ûª¶>“¸Z @^³˜Ïm=w]Fù|YæU—±Æ??¯Ãê0­¿ðb*5cªT«|¶|ÅRkq¸)jRªöw&Õ…ZÁY<ù  FÃÃ[Mpçüün9Dó ƒ»5C\/ø”;Vy±"ŠWF^H]ìì”!u¦·qá]Ú¸h–syM8r‰»ªgè*³î_€tL{©r¾²Ý#•,—ãÞR¦ÄGkÛúårÕ±;è[ü$\NÌ €CL yƒœ†×“„+:m'×À`UºÂ_pMž’½ÛfÈ$z¯²"UI)•MÜ»/ e˜)› ËÊùù)KÄ]ù­×âª[{-:x®Èм™w×¢¿çóÜz2“z`¯çTUøÈ Ng~ÄîU) ,’¨gG6£MæŽ7WÝxމº7 ó,>`øð§B³âøbB¨(åÉôûˆ¢ˆÉÂ- —1»H¬‡R/{O¼¬·KNÕ7©¹wßÙb÷§ºvz‡qàkï¾S®7`Nˆéî´z¤ÇÈÞ±'¸ž½cÏëêØã´©8M›ëØCÈ>JìÝ]Òr¹sÃ[Óuwqº3“û½wwáék”žœéÞÝ%8ë½»KéÝ]œ™Ñ³6UwgÚ­¥ ¼:¼ø­Üí¯=ŽŠƒ/¸„`® pˆ˜¹^\€CºÊô†W =Ž·’â®õ%µ¯¼$BôKê=EŽ.!Yd— ¶)¼©úŠ¿ð|ûÒš†Y³®·6Ü€%UѰ³úÖO0ô~þ»v`¢{ïT‰_ØåFŒHÙök‡·L4™n–Ø*'lÔÍY•ÙóAr ¼8çiK*õkpÍ”/@É^phYPNa„Ñ´óû†PˆÎt¼õý€4~ö6Ÿg"šl‰ˆŸ¬Ë*¯Éu3š(Xñ³…ë‰ñ>R4q»ë¨`صП+mŒÙë;•¦+párUÿJZ©ˆÜ L_Íh?ϰ6œL?ìàic*‰–Ä0W$ùkVT|Í>"fUšs“¬eY <騨ò¿Eû)×zóœ¼ Ž ªÝÌæà(÷:Û ´©"ÎÚO,ëlF¬[ä7uíÏ3{„Q3LlpZ4 èu² ¢‡|~}¬ÈÅð’,ª²Äuþ $+âB3,eDïË”sõfÿ ó·& È,,±,ÁÇ3Ñ‘Þãßùæ@¬T8‹ÜîåÛV‰ÊG¨}ø3bÅ8jj|ï2E¨öÚFí¹ägRjG)6L§/ÙÐx\{lG)ºóL‰Rp•êÃ^þװGá1§ìôöö½†=¸Û{ {šn}#övNöí5ìå×°;wËÊOXÃîºÔ6ÏŽW™¶ÁóùÁ×Srv]u“3ÝkòC\žª&¼¥ö‡@Ý‚ŸZàS‹©ƒm QduzÆÌÙfº1sc0ÿiJïÆO¦ªëÁùí]Ž{Ñf&BÃT ê#`(­ä«™$àG©xŒkÂh]{L½;9â?c^yô(#y3‰‰Lê¬(…Sôt€Â({¨Ëz¦Be>˜ƒ0º¹hSÿýŠSË…‹w·ž:±Â¬ñ¦òõÑ |؈¶i|#œ²k™D©ÈˆZøøcÞÌJÔ{Ÿ1‹Ì'ß‘¸‚ÆCd$®D}¾dà6’ÔU£XB™9³ªª;ÿ˜§‚qjªÛÆÂœ¢Í8à²ÉÅX¸ŽfOÈ:Ü‹ mÌb…Þ£3£qDŽ‚¬Ž˜®º¤„_¾$þûz b²U£‚6µžnÜó`Á­|ãft/Xåm_þ<Ø@¶¾oT ˆ;q ï˜"·@† ‘½•*Ó‚ê'Ë! ³‘›æ‘>ù³‘Ì·eø’â1ëc$¦(Îsƒ|iE©³ç)?pÎ:åœrÔ_MÖ¿ÂÚ„ÈÆŒFdý+ÂYçiÒPnhl½ÈêÚ„ç¹U··B)Ÿt>¶rR„Qè0FV”lIÃP• ù׳{É<9¹1qKÐUæ% 3‚2©Ð  ËD¸È[ n=ÁE$a÷-E§7o핇ÃÍÜuâT|<Ú °ø—VyªO¶@zŠˆù ç(аžD¿¦@@¶_Bï;Üã_("ðÕ¼Hþ9Þjbé :Ô—Tw0 K«4hX•$ÓI! ¼råç³Í} *’Q»uó»èµë:ÿ¢ÉŸÂ Qx´ù)+ÙÔòAïeŽXh¾Êfr/h…ÇH],Ãúe×"”…Å”z2ëÁ³ÆY6¢H‚”ƒH€‡Vby>SÑ?m¦Ï‰Db€rL-‰h³#ë'<Ï·:ý=|=<¸Ÿ¦~aƆµwAæO”«ÔÙÌ>è[Ê»‚"ôz†š;4½f*裾vÙ9õøIàÔÇÞÌvVÕ„?qç=f*¼xonû•¢4CœÃj}µcÈõx=;áz#Ìœw–¡ðhð3ýñP‹–þ Êe¸ó÷§ iǰ€ÆàÌ@ïëÏÇŽ÷³Æ¡L¸˜ð¦ÞÓ>¾MeŽýá}±˜ÞØHyætLJ¨O‡OOÿž 6d endstream endobj 6896 0 obj 4932 endobj 6900 0 obj [415 /XYZ 38.2500000 749.750000 0] endobj 6901 0 obj [415 /XYZ 38.2500000 79.2500000 0] endobj 6902 0 obj [415 /XYZ 38.2500000 749.750000 0] endobj 6903 0 obj [415 /XYZ 38.2500000 218.750000 0] endobj 6904 0 obj [415 /XYZ 38.2500000 473.750000 0] endobj 6905 0 obj [415 /XYZ 38.2500000 218.750000 0] endobj 6906 0 obj [415 /XYZ 38.2500000 473.750000 0] endobj 6907 0 obj [415 /XYZ 38.2500000 79.2500000 0] endobj 6899 0 obj << /Type /Page /Parent 2 0 R /Contents 6908 0 R /Resources 6910 0 R /Annots 6911 0 R /MediaBox [0 0 595 842] >> endobj 6910 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 6911 0 obj [ ] endobj 6908 0 obj << /Length 6909 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯ˜sÙ²IÀ`ÉV€Ã"‡À›ÝÅ"»ˆ²‡üýp†‘H~Íá7ÕMr†lE±»ºÞ]]Uýñ/ßþ¹ÿùýÇÇoÿÙ¯¿?~Û%—&ÕŸýñëÃÛèüPÞ»<Ýÿm÷ºÝ=ïžË_wÕ ßÿV~úß^ïÿZþýuÿÃ?ÊþXÿÒñ~Û9åÊïÿ>}/œ*?%í÷ãÏÙýýOûß#6ÓÕÀ¼ÿÿ›è";12õë®Y¦:}ýñý÷ÝÇ ÓfÉ“´0É^Yc÷ª°zÿßí~*'h†O¹5Ê8Úòs‘Y—¤y®ËÏÎÔØÉng×E‰ÿ¬7÷éKft%?x–$i°Á+È¥‘¢L¦¼ƒ «”;Rù¶ªÐ£’÷&±°ß‚´61á?A.Ž•š¶žÑ%‰kKæ9!Hgäö<|ü;«rÎrq¬4ÄÅ£K775öSCíè!П:ààGÈ¥‘Ò.IÙÂÚ€”mG€|—„Ô÷'ÈCQ.HÙÒ-k_°¶o†0¸ÊÂ9RäâX©ië]’¸Zåáœäóè!Я‹pžTy '.IYc³€”mG|«Ã¹Qä¡( —¤lªjÜiü´£‡@~¹‡7ø ri¤4”…ƒKR6ËL@™mG|gªúä¡d¶;øó”A0$ÕO@œíÕóâÃËî㓲GIÉö/?•°æ¬¾½”(I÷Ž‘–ì—÷ŸJÌŸ÷/¿îŠC¦ÓÄê‰~@O Ÿä色ðI!€ï$_á“/ð \iòaËà;B ד@Œb\+ˆQLWšB¨1lø©€©GK‚ rž'טGÕôÑ’G‚ß0v0*¨¿¾”Ê'¸ÞÈu3«–šµTýÅД:;N™%¶™RUhS¥>­pFhŸThK:«E.ŸþŽúß)à;y”:¤…qi_èFÓ½“`T¨²C^$Çgg41^O!x„O ÆV*À`ài›T –·ÀÔl¤öK%ò·=«’wÕòЯVø±Íè=zŽVóïÀhIzzb©Íò÷8ÅË€ó`جà•ØI,zbTùÊ ¬Qæ`t®gè<^Æ×Z¤êiBÁF‘?ïr1^3<àoçc¤ôÄ2Ö3q'ÆT'„¤öŸx¡ö¬”ÓÚ#ž$•õ³Hày >18’¹˜ãÏc"ò‹S£ðx0‚O‹ÆžÄY]ÑâôK¼YµÎ#sŒÂgLPÒ<§Ä¹¡ìJ±t<æÒÍEµAÚºÈüŸ@Ìc.Ç'©±¸¯ç50'êÑ †TØäyÕòœ§æÏ+–×0Žùc5ÔæÍoÞüÅü¢Í(<ëõæM›èÓ›7ylŽÁóàìIOî"Î2Ãó@YÇúaÛø ^´.³h#‰TÖ4Ž•HÅ»]¡§å9­ŒuÀAîz扛²q»GÒýs§Sá,<s Ä'™À£#æ$bÂéClÏIä²ù’å–/®a½,›éŽmÀ[l=… ؃£a·D‰¹»ÈT¦ºèàC6+øæÓÑFŒÃòs¦»¾Î}ósIÑ‹ùÙÃLNs¸º`=‘ï㟙Ÿ¾•{ì0-RºX´† 'Mèœ=%cŽeq­ln–e³,Ÿn/µn³”›¥Ü,%o)=­wˆˆôh›Ñ£Œdɶ«ZŒVG7ºM¢±ŠX’e/7£òð$®¸ðÔgM9ó]W‘º.7,Å© y)…J;«–%*u‚ƒÏiDCêÂݵ{©šD”‘šxy—L)*¾%bUv¹Y¾KÒô¦ƒ©Åd6og —G€Œ» ,{‹%g˜ˆæìxvñÄh[Dë®hºàˆ–ÅTXбœ† Ó•‰‹0™‡;5FãØœ¢mk¶J›ƒ³A™ö™Lž(£Ópk!ÜÞqþ’uÏ\í0 yjOÐù JÉUgi·±öøæ˜ÜœÞ¶›Ù1cêì¾ôt?ÃÑê4HÝ<:Ó!«˜\qç·l>”Ç3gJ߉ۤ˜4?Žó¬§·Åd. cöI7½/ né‹«ŽîŒ¶’5pEWaÏ5Œ”]É„²ißSÃx9¢g„}èOaÁ¾öJ/e™pÏ £à"]K´†]³õ€D¸ŸLÆeðý r§–‡©ø>¢áóœ\qK²®LBUP®nÉ04ÂÞ€Ø%z#åþ¹i§œ½Ü_[ø.hoãµÝè/.ê÷Î?Â'D©»§y,÷Çúž–p47}´´Z©ØЈ"ÎϵL0Ug‰®†¨Ã<Á60`~ý;Å3»õF ‰-{4AmØfožCâL›pO˜C6P܉›se¯ïdb—ÕEùn4ÐÎ¥Zu ]N7€Ã¶SŸéž–ã'L@Cøˆ¥1dýª7¼À¹\k¢Ž”ÙkÛÀ3Æ*Ysk­¬ºê€÷æIÅÏYÿIݵ²ÜF÷ö\ Já4‹ÁöT¯1'–5{)À6ÛÚÞkÖÀ ;†ËPx4øN­Õ¤¥»3Û² wü\BÜâŽaSì ˜ßÕÏû;ê7„Æ6³&šgžüz¸Äjá}G ŒolÈÓ·jlL…íŸwÿ¥ÃkÊ endstream endobj 6909 0 obj 3788 endobj 6913 0 obj [416 /XYZ 37.5000000 361.250000 0] endobj 6914 0 obj [416 /XYZ 38.2500000 392 0] endobj 6915 0 obj [416 /XYZ 37.5000000 361.250000 0] endobj 6916 0 obj [416 /XYZ 37.5000000 118.250000 0] endobj 6917 0 obj [416 /XYZ 38.2500000 392 0] endobj 6918 0 obj [416 /XYZ 37.5000000 118.250000 0] endobj 6912 0 obj << /Type /Page /Parent 2 0 R /Contents 6919 0 R /Resources 6921 0 R /Annots 6922 0 R /MediaBox [0 0 595 842] >> endobj 6921 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6922 0 obj [ ] endobj 6919 0 obj << /Length 6920 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€{Å—(AïŒ7@»@A'0ªU*²Õ=Ê  µ"‹õf±XüðÇ/ÏþùßìÃË—g?¶¿_¾œò³5yó¿ìòóݰA–çö9³¥É~|;}˾>Ÿ>Wÿývj>øòòçêé™ÌþTýÿ—쯫jÿÑ弬°Õï_ëßΊê)ï_ÚÿuúËï²ß.=võÀŒÿþNçÊ©âÆÂÐßNÝ4Eýóß;}h°n”2·¥•™ÐJgÂi™ýç§Ÿ«ºîó³ÓBØBÛ|Ë@ÕÝHÒå™*óÉ@õO÷‚¿óR­órv¬UˆpïŒÄ-•ì°o¦\´ÿ×î#t®­Š×y 9;VZâzç$®‘Eƒ YiI~õÝÇÀ)òx׳c¥#..·¶A‹@ÛkïÐï„§•ȹ‘Ò’v..´•Âe!+§â\V_Ön›‹”†³´ó û+§ãu^CÎŽ•ŽÊ¸÷êKáŠÊ8kø<Û¨ÞQ-*ÎyóÚçÊÕ,*–òº?._þêwuñNÀUk´«€€Ï#¸tfëe oøiÃõË_½ž|¨ø°Õ@áVý;1Þê†e¼4O(¹‰N—¾Ê.»ªÓJ°®OWÊjÌøïM„1Wìº| ŽÓ†|Õ\OüHª@ƒ Ûc¡¬#Ð[󴌥áÀWênÁ‹PùLïoãvW³¬ò´ÐlW1¤Ä˜›†ƒÔè©Á<åC€Ý‚¨†^þ¨uClDyäy5Ì!j8ð„¶[%ÍÉNĤǰ^ÃDÙÊVýÀ¤‡l®8ª‡ÙaícÐ4p¡e4ìd”‘FbC‹‡ýFå¬ÅKÆ„\rUãgÜ0ϤãvÝÁ5îj»æiøgÐí/—çZ‘ßÎ2!ÔŒ)Ô×(vdÌã~¤d–QӀȸQ¶ln®`Õ-§öOWHÍy }㿹4°cpDé1m°C¨æzâGR l¤˜"¡¬#P«Ž–±4øJ]&)ágÔ^Œ9·kÐ@³]1è¡!7 ©ÑSƒ1x²C€Ý‚¨†^þ¨~ŠŒ( }É+²¯?_rm.c6¿¾V(1Ùwen]n²¯?e¿ÏsõéÙ×_Nî\HÓØ¼É%z#¿‡ß(ôFð›Wøæ‡õã(ø&w¶ö¦á7ð eŒk<ŽúX¿ùákÅtÑùEêEx±ä7if§U‡Óׄ£VVa‘/°@© HK „@b>‡x„"{v!5åe\ºÔ`üæXgc~Áø…ox©•¿°jLhƒ”KHáj™B§ða{ÙmïŽùr':I•8ö ­™»E†Óy •ÏPÜaÔ˺uÿIPò÷!«Bu~)Ö¹ò#„k}L-HáíuBŒ¹E%²ª¿éHòqo©£¬NS­‚ ^íoØçÀ:‰Â;XPÆ3¥¬Súé—Ct‡Ÿ~ƒŸ9 ÛŒŠÈæds'þ‹³"yܵŠÌ7Å®¤,Ç£Fµ£ó˜²w¤›!…9çN]ФøbRžK—×úªbî…oÖg­šR,WòàÞà7­‹=óF‰¦·k÷jý4DÓ‰Pg%KQ½ºØÀ8„©ãÞHóÁ(n¬¥é&:±å-Ôh–šêltQÚùaÒ=줕ßuŒÈËnp B @í#%À¸åc–2ã‚À1¸7¤Ö8ÏûväL´‚Pxê˜@oa'x¢[_b[SYiÏìÀÙËÍ ¿ pøDT9ÁÞáq°¢ƒRA±„$ûÇ!Øü€â&(žùïVÙççŠ é®o ÕnŒÌõÖ,)„ì^Eü€uÁO­‘ÉÐʆàvi,j‘òƒaUx^•H2ÓpmÐ7âu=ŠÛ‰&o‘ñø v´>ÞNˆ’ëC¹D´Âξ~ŽeÅÉZ#Ì+ܯDö& ¾°F˜8á˜Gd‚¥‰ëA£0³ŒmF(e9AÊ ,±º¡•®º˜Ÿ-Œ'Nö&˜¨d¦PÅÖÆm$Når‘TäbV_¡´V°àR(&I(U™.YûH Âö°‰¢ÊnI¯ÞsZΞòRn@+§6Pøm@‰¢;ÑIZlIµzÆÍW­6%‘$Ü|Õ†ÔÇÎô'Êxœ4‚KYàá7Óm ¼þ!ìØ<{ÊzŽå]é=ûæ5óRìî1•Èdá‹ïÔ’ÊW>¬«ƒÛªý{1u¾tÞ)áÝxæv‘(A¡èem…ÏmѬ€q"l(b%P‡+¶’„U¸‚Ãq÷¶"G°ôéFcÜ›GˆéÉBLÆn9÷w„˜öb2nÓ9Æ#Ät„˜®:iÝLáÙKIЊ‡ O£ÆuKŸ$Z¨Å"¤,”Ù0»”!ÀÂè{Œêä2o¿?Rá3éø4Aÿ¦ô#­Ø?üÈýû‘V-ãêð#i>üÈt~$¯ö=üÈ<©iõ–“®{÷#m±%“Ò£³¥eua+¹Ôr̾«Ž(Þ-^»æ<àŠä륜Í{æð6éI{ˬãp€cöÊ×lˆà=l|f o{`¤à´oBîO†Ä #œ1 è Ž£’•Û÷`G@~)'ÖXk¬gâ˜ÇƒÅÄαÇ8Üc(8æ£ß#I9 t·Œ¢ÛÕ—NR’P—¾; ’J£}¼S|Jú1þ¸lU–ΛÞÈHÁVÎï‹çÃ,…û¬ÀR˜£pK`ùw÷”6J Jq£€Dq+(Õ@îîv'ËrŽs|:Q<¯¿NòÊ!Î'©¤8ÑÝ ¼žcK¢à$” dl°…×ó1BûFïøÆJÖ”R·³þÏð$+8¸ç#\¬žD@™*’öGÕF%ÕŒÄ %Æ<ÙÞ¡8Æ`ß]OÊ1£GÜDŒhoDŽop0¾¿÷éKÙ«` ñ&ÛödÙùe1ØXÿc_•`gHAo¯kœj Æ|L6M-_^Ï„hhwH+ÌKLwÕÑEÚ\9æŸ#GõN "a " Œbás_ˆ·Ì.—DNÇ”Í4êÝöù¹©67‘¹7¶R9)QW¾Áã8ôzéì~)|óÚ¯A¼PQ{YÛÌ›®ŠêZÏ£8+!=S{“Ac*4B.ŠNSù qÕ8"ÕåÎö|¼õ YƒÈ”-¤XZªJ)„Sé<¥ž)þ¡¢,©®;G”ŠÄ)ÏV€ý¡òÎ0‘)! Š)¥()[nM†1!è±a6¦}sÊ3pkÖ©¬áVŒ 9d©”G{¤iÆ8bü±L0 î¥DYa%¶j+%`WYïn¹\ôÜúi½¾j¥;]ë¾!ŒÓ…g¾qèÝÌÔžõC 0š×’wÆYŽaZÖ›Û/ÿ‰ È1åÚ5‚>Kqk E²Õ’¯Üõ¦óÁÒìö”ìs\I0{·[⻩6Œ6Ü=¾ †ç‚§{eCìùnìÔ“®XA zü“k Çs))~×’n>Ùa¤T„欶‡ÚHKW_Πѫã>w}JŸGØC•'ä–Óßò˜„©ôÞ¸’9|ƒiO‚( –Ɔ¼Œ1Jâ><ë-ó «¦8¡½û®ã»ó2W>ëýø‰·§<­qãq4õÚ²ÉR”wF/ƒHçdÎNÒ¨¨*» s˜-@ÚDªD¶¡GÖýmåäv`Í…¥˜°\ÁÚ"`i(7XñîmPðFX-?Ûšæðú™ÆUC…qž:ÜŒ=À{w3µìrFH‰€û)t„3épªáà oÆÔOxRZ²à¹‚=Îñd!!UðÙJJ>IÍÒYöÛ׳A'éÙ;— ˆY"Wkßα–„¿[Ù€Tç.S)Kv(pG¯ -ã{l\¦ºÝÇ>Ò½¢8$å,8šÀá.úõ!kqÙ€YÁe0(Wë%:¦¼ƒ+*ñ™à×–m‹IÝ:‚«èíÙ*æJ]”£_qK5ñÞ2C9ROrw(ç×y‹¡íÇŸ¿'¦™±¾yú²©œdæË¤%Å(NÅQdãM¶GÐ/÷猘a.&M(€€"’65qú ÎèdÝy¶Á$é ©¾æÀQÈ%t(B3œþMà±ûæœõÂé³ãÒ8o¶Ž$KNtLƒ$Á¬|²t‘1rž=—.2˜&©(œ°l±Ý +Yٞ⺋ÑÞ¥9sË&%ô}·KŽÑDÊ:“M¼×ŽñŠ ?%¹4cÖˆó Sï7¾A‰Ó®`Dæ€Ç“ÆôX¯û •ÿ.о¾Ïc–ÿ~…ßPʧ*Ëý² I\½A;Š–Ý%›oJnäÝŒ| ²¯\Ióšt2¹þýîUò¤©>IºÐdï{M8&މ@ñC)Ëìr¸”jJóõßOR枥Ì'öCï¸Åk”óÌÛC]†Å|7åž; º(iÜ,ùãi,{dyyGË÷{ÙàÀ4(õºaʉÿxs§x£Q”Þ0càq(,Ú³Oq•ã°(& vb^ØœãÛÏgÍß™t·UÚ‘ôxYAÖtW©¼£ŒDóá=Ï{S°%Ï„RЋ5)k‹E °3q-0Mqo˜« ®qé %Xc¨1WAY0¬½iœ‡ù K0áb# u€>ø\–eÇ9J)s`¬-áÙsŒÂãÀÞ ÖO¬—ô¶Ov±W {‰r«r _ï"ãɺ®Äì0ã©úɾUÝGÿ¼ônXΕs ©ÊãÎÅe}É>‡n~¶œig<îÆÉnsð¦á¿bú¦Å‚<·ë“½ZlˆW4ŽZZÑÏÁö©)Z"áu»öÝ0(¦lE‡Fðsf÷¿iW½bÕÔéîT†»> endobj 6923 0 obj << /Type /Page /Parent 2 0 R /Contents 6937 0 R /Resources 6939 0 R /Annots 6940 0 R /MediaBox [0 0 595 842] >> endobj 6939 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1701 1701 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 6940 0 obj [ 6936 0 R ] endobj 6937 0 obj << /Length 6938 0 R /Filter /FlateDecode >> stream xœí]I¯ä8r¾¿_‘góZ\´†®ª.>(t>>=ný.ÏÁßJmIQú(éË S¹t¡«ô¨'2;ƒÁàOÿüëžþûï§Ÿ>ÿú?§ßú?ÿú–½—yÖýw:ÿù“Û «÷þùTVùé··§oßÞ¾5ÿxë>øõó¿6OÿwÒ§iþÿëéßÿ£iüsÿKç_øx+UÙüûGûo]ªæ)ÿ=·ÿåíßþáô·sÃp=0ÓŸÿd3[g匕¡¼ ÓT퟿ÿö··Ÿ:ì¥ÊêJÙ“²¦ù«¶úô¿ÿõö{3ÀÐ}ö^[¥Ê–Ù5•ú»cçf´uª†mŒ×¤ýl³Š†¥Æ§á÷œOþ]íÜïx Ìy3UÃç xö¤s3…GÏS`ígèlÿ0G[(ÆA›‡è¸(ôÑ>íÅÒŒ ±¯"^ÞrèGÿp龺YÃ}ÆOÞ?\E­ü‚äæUGe—‡Åí-8“žÑâ;ÅmC‹‡ý®a/^Z0f„¼/Êdnï^ƒË´Û®iWWâ˨žÜn]¼´/4´(– ¢fB¡q¸öI˸ÿ˜´¯£¦‘ñZÙªò XíÏÅÀ©ÃÓÒüÝ‘¾éÏRš§.§àÔ•ļ¡t¡ZêII-h°‰bŠ„²@½:ZÇ’;ð…ºRRæâgÒ^xœÛ7X Å®ôËMî -zZ0œ§ÒHÉ1ÐDuôòGíôSdDyä™*§%D¹Ïh{­¤Õõ bµÇ°^Ãĺ—­öAHi¥:8š‡ÅaíSÐ5H¡e2ìl”‰FC‹‡ýNåìÅKÆŒRrÕâgڰ̤Óv;À5íêzÍÓñÓí/ç—z‘¿žeB¨™Rh®S>âÈXÆýDɬ£¦‘ñJÙÒÊqÌÚŸMÏ©ãÓRÇñš~*§y´‚£sˆyÃòªhÒ.¤4ØD1EBÙ@ ^­cIyKꎺBR6ÁϤÝL9wh°@‹] è!—›ÜAZô´`8OÞÒHŒ¶ ª£—?j§Ÿ"#Ê#ÏT9-!J-/¯¯ç¨V²ŠAÄ a½† ˆE/[zîñzÈT=¦Z·{* mC‹;ìl”‰FC‹‡ý^åìÅ‹.–)%W-~¦ ËL:m·\Ó®4OË?n·.^Ú‘¿še‚¨™Ph®S>âÈXÆýTɬ£F2^+[ÆqÌÎ?ÛQåØs;Ž×ôS9Í“«)8¹ö€˜7€U‘Û.¤\›(¦H(Ô«£u,¹_¨+%e.~Üvë+ {ár Å®ôËMî ¹Àpžü¥‘mATG/ÔN?EF”Gž©rZB”Y^^/q”`Š„5u¿­l„MèK÷:ÏcîÍ·‹ceØ>ǽK·°ö‰€¢K÷:/+¯órq¬ ÄŽK·®Š˜Ä½t/ßyó_¸-äш‹{$®ÒçÄÇ3‚tVGÀÿØ} âZO-w‹c¥'.î=Nòš²uO‡: !êˆTΫ˜,t†\)‘aç{×W—ªÊºë+·½sïòËÓð{Î'€®®Î\«*³ V› á3o˜&‘M~J`ƒHëRìˆØ(Õ%°mÀ’ìª T¾rY\YÓ­‡›grf^¯á‡éÂ݃PРj:ìàÈóåaqût½Þ5ˆ¡Åv6ŠÛ ‡û]Ã^¼´`ÌyÕ"¸Ðnï^ÃâŠÒk·#\z èuø2=ÿ¸Ýæ¹7ðBC ‰`™ j¦2îÀòÈXÆý$"°5ÖÈx­låNµý¹8uxº@êDI§ŸÊiž¢š‚SÔó†å-ŒI»4’Š:0ØD1EBÙ@ ^­cÉøB]))sñ3i/=Îí¬ÐRWzÈå&w¢ÀpžÜ}ŒéÇñÕÓË,€Qy¦Êi Qùò^Øõur1÷L@˰^Ã8l9ÈV)©‡ª>K¾yX·{* ’p G´T“ o·A-ö{•³/å"!¥äªôjz¤Ä€v;Â¥§€^­yZþq»­´7ðBà òW³L5S w`yd,ã~ªdÖQS†Èø—v-¿#€c ] 8åü#ðá§ïo?}­Oª8}ÿý2:ØýóýãÍ6?œìæúôýϧÌ2[þÓéû_ßê÷²È ·ðuo²¢}S½Wuæ½ù¥}“¿]©é›ÏíûnMwüòÆ¢7Fu㌠ÊÀ5|c¼Nt-ÑÉW¯!ËÛ††ø¶¨ÊÉ·%êUAïïM}òiŒAÂÌ‘{3x$%®cT>a,Á1°ºëíœYÛ½Ú‚_âD` gÖ=¦dš2ù7h…d”„"Ž…C€ÕBjQÅ‹F€Èx¦‚²ñË÷ÆŠÆ1€¹²žœ!;{ü æ,~„ò•5äÆPão°|0^6ÂQ“NQëØVû” ëT0ZJÖÙÄÅãˆÊ¶¬3Fñ(¶—Ð'bpÀxrX~0lØ3`ôA;–Še"Ú˺V¾½ôWI”ìâ7Û—g²"+²U_bdXÁWåÌÏ£ªýø™¯ Y•õÓ`|uFÿ½a DZ_z©(Jå͇˜i ·›‰^Þ1Ž`%%lªÌ7]_àÔ ö°—¹ô&ºÆÐµõgYü —-@e܆0IÄ®žÆÎŽõfúõ±5…Ï,Ë~TY¢7x`L*f¥É¬ho”qý00Ô>×0qæÈ~À F Dp—"6—‹.í¹Ko‰ o_ThË‚w,*0þDc;¸7Æ¡x±%·êåÆ\Û™ox‡þ³Ò—ýü¥Jh ™¸£o-‰éÐ^x×j‡ Ô&ÞĤŒrª@§D¸, ñd Ö¹Ä:ž²´¢ö4€fwK6Ö¿ctOÖ¹ï-~ì¯xÕø˜×s†ˆfó+žŽÌJ¯.½ÝÕªWtwûV,ŠU¡(VĪíÀûêë~«ØOš}ßã ®!r»oÊ÷¼ô•ì'$å}XqáM/º L†{ÓŸ IÕjŒN””}×j«AëÇI «bŠö%o°B"ª&`2wl[2;ö±™Ð1ã9mO; 8LX&Ð!º¸§B-˜E 7<€L°zu²YZYŒAdÁ(Æ Ãyø–àHܽÕ,¾¼Ü.º²*º»ÌÝ­°êaº_{³ÔÂÍ'µðFÿ ¿1èMï_-}ó¾ùeÿ8¾݆ù|àŒƒ>#pi¦ðMïP,}Sí‡c>%䤼Z…¿Ñ˜û>œ± 0Áÿùß(,gzc1í‰Þ4ÄÛ¸ Þ!g µuNp9~S'äÿrˆ‚›4YP*SFûä™­)dS1L•Ê<Û7ØbŽ÷ð÷ðg‘Dbf²1˜N;pN첤Ây¿T)Óé¶F­Þk%º°Jô‡ìa¿Û@¨û•Ü®™jè]SP3L†}/Œk<¤†@A-0S5¦Õ^ÍAdp¥ÉP!5æx,sxÍ¡ðÆƒ±]¹ :[gƒ?ÐÙX á` Pш{+jsYp=vÅ$„4³"$ƒ¹’Ñæ8¾˜)f%¸&e¨€ÚºÔ„žÇÖ65±Âú s"†Û":ÈÄ'UR]ª‡À,,É [0o”ÜI“ zqœ¸Å'ü„€Ået©lœö%‘w ‘yq…D*½?¾sAɃù0Œ•¦ ] ZÇaÉÇšŒ¡cG&00ÔØëõ~w#‘Ž«Le 9‘ŽQ‚÷ÚRéf-DE ñòMø˜ë°1q¥D š2¹ jÌ 'Š®!1F`mï2“%i Ϩ%² mzQÛpAÖím¬Þ`=‚¥˜X®`m°4v°·U̲ Þˆøâ£­i^žÀ8Ó¸j¨ÈkO ½ÜŒ#À³»ÁCL »ãÔîòS6âS m¨³LÅpæÇzˆ¶Í7Áb'ŠùæuXJ:gÓf£nK”³‰OÉʯ¤Ž}ãoàñˆÇ/ì¹ÎºDm.æP±ì)£›®¾}q[Fj˜_ü<‡ëaL#Y—ž•|´Ëæ ‚:ð†æ¤Fª|xŒ·=7wbŽ|Ä|ûÂeð™+,vœzÇÀÎpï7PgÜ öÃ~SÍ‹rÉEꢋt’ªî?3VÖŒïL)Cª%f¼Ê_óQ¥&g¶C¸ggÕý6ÃUQ[^Ù °Ç0v±Ø°1v<ò:ŽñL™elM8F3DÞ¯Mîõ¼(ìM—›yInÏc-†¦êõ¹â `˜«Ô0ûÎ<& !ë0J6r3fDÖP…öx#À¨?o¦Yªùì/RZ¯T`K=å»¥Í ¢ƒ‚9ÀÂgôž&gVöD&S÷ÃodÏ9àLŒæÌ.ÃoSkÄöt`»È*yž\Œ·À‚w/ÜY×ѵèøŠÈ¯>rý/Snå[£6Y®ÖáIU­Š© –Êr§¬—•ç<åêe­$åÕ¸n¼ËÄ#7ݙģAhw¤Öôjc×ýaZÌ‚ú•x$4).òvûÄ#Ñ›«w&†ùJ•eº\¡‹a{4N>LÜ~×¥HO]/ª±(ïÓDn¨ŠĹtÙJ•GŽÜ°CT( Dɘ(~ÂÈÍùfòU\8rcq r’°áŠXTcŽ€ ƒwc°F¯”1ªR£&¼“£ï丢Œ[HÇ; ‰7TM"Ù=Ö²DL=ÔОêÛÛÔ7U¬„+5”3J Ä›˜ ˆˆ×ŽÔÖÈÑ«T‡”nvcñ+Þ¹TØ‘¸3Bø#&˜Ý`ÏœYaîoad0Ñ™ÏÀ68N%šéšì®^«E4…¹Öž-¼ëë3ÄôEN­IÜÖ9y3ÕWåÙvžA­¡x‡¸šŠº€S󛨇€-·°Cµ[Ì“Y_ òbe#MÆàòœ-zÎ$tÏÜh`Æeœ7ÆÂáiˆ¦Zô1å%åÊ>ûês ãÕÿm=<.\gI´ÎÍÃén‰õ9µHMuú±o} (³VKU>à®´c|skK¬«tñ¬-.õhNºÏÚL¥„ò±#ºFa».5¾¥–¹ W4’J…ÎC¿ÓµäL2D'ÙÚŽPS1n{Õ$™ DQÙ"5GŽ&ߺâ^DÛXXëÛÆÃÄãvUtE…‹Æì‘ ×~à–qâÚHÙzVOìU1ÕŸölßß¾´QdyO)Cì"‰¥¹­-b‹rP@Ý\•а…Wv”D{í’<¾zŽ\“îDg´’Õ¹:ð‰¼×y¸F™åhW%¦U)KϬ<o×ÞÅ>LñiбpzN±:žóÈe»÷4îÌíB!%ûK¨T6¸ÎÍH˜j•»«½ÕD{w-›Ô¾Ú®ö«²öÔ~ŸÉ¿$÷æèþƼ}úòµt{tz:îWsî?3qËÃÕû¹çsN™¹-¼ýð‹â8T- žh‰\Åsã»K„œ&•”º†Ø²N–ÚOäÊâš: ts~;æÍ;Êd¾-½ï0A ²*Õ@=Íù¹¨öJÁZÌrŸEo6í ï\î+®‡{ƒzêU,Ôzu10òí‹îIrÚîwÎR‹_Õý^Õý–€•ÍNɇºuÆÏÚÒi²s«Û/d¼d&"K-c +æÁ\Uzæçyœî§¹Ï2ÙÅŒ¢¡ñ'4èÇÏ9(ru®0vfÎp¿CƒËÙÒ7p ‚×:=‚#êàª,üY?[Ì>é¡…Ïd7Û ¾}šÓl èyÙW!ß}Ž“°¯ÊÆ›Ÿ§oà 2µjÜ›Áå=\”c4P|Rô²)ü sÝÛ!JüªôUx(ÚW$$C´”°Á…| ¾ÔXÒ Œ&¥}^^A{ê ¾¤k8L¬ËqÑc¬/‰«!6k+B¿PWPå“Q±¨X`ì`í‹q ¡¼!.´dŠõZ|±)¾l“°¨ŒW°é˜ øê‚—è-•”àBç˜S”YÞ`ÛÊb¿̧+8¯²:5œ)¡T> y§™xæ*F¼°î”w1$ 8 &tøßà«_. çP(u‘ª›çPW #B¸¯k_‰áÞ˜â+·¿Šñ0'ލwŒ ,âx/æy÷‰’íiïVQ˨[ÏÐÉè3LD¬V$ŽaîIúÁ‚ïe‰¤‹=†`²Ò™«1îôF‘DŸ›’ ÔÛÃg$ñ7ÃJÈøµeðá\;jؤ:™tO•Ó rV•XÔ²ê&÷Íå˦Š.PEpá,Ñ …{X*9óÃx´FüH›Vö‘ºÕzƒ;š¸·ùR!ýZQÙÜ#•Èj+²ÈÜŠ#ºú ¬ d/ìKT- ã\?¼Æ4Ãç—Žo¨ûfb¾ý`,™ŠÞ²žï«>¸pŽ€OLxGô‰“‘µzzíÛÜW®·‡£>B_ªÁlNMd òÜpÆ “™Œ3…ˆ¼máLkœS‹³¥àŒ$œ5sˆ°ÁÌÁFeóÐ1µ‰œg*›-UƽìL‰|G&§0pZƒÁ5æ^‚ãñ¹á,@ 5Îw„½Œk˜mÈè7¬ã{»Æ5§žçä£Q˜üeÜ£ñooq^1>I"{^$•-È&Ä›¬‡!˽²öPÖýÜÉòUxœ$z–‹9±•cš¤¢pÂLx£‡hʬvS —†=‘]ÉêUÊZËzÅx¦‰ÖtXWàÓ,²T^c*qìËS2acN½üŸÄ¾RWXxÅÃog1—cMLp,æê”â‘õÆO¦òec[6¬º“Y%^µÖÂ|€yçö«~"îFÅ+‰sÆ Ô²q7aŠùSð#dç#»»ˆ²ÎÜÒˆqmäêú­z6Û°þx}ËD1íaÜåÊ$P1åÁ8‘Šàu5Üg·ØÃ zÓx/zèšRðÆÓ¤b¶‡¨”a/•öÝ?­li}ÂENl?ô˜©ÊªÏN"0çÙf‰Ã8ýÈ&IVcN$¸™“0'Ç© 2Gc¶¶ €„1‹Å(Îån hS¥L«ÛÎUôïÆ5ˆ‹’†;=”(ìwÜÜ'b}cK¸"À,=dCtôò¦S¤*Ïj3 ßçò yÞÙ²YÚ€´Å)Þ3¸FS¿ýîÈîZ2ïµKE¸£ý(…#§ue3dÝee¤@®Îè;é/?¨ »¢:Á^Q.uAï[-LCáÞà7½IU»¦î$€² w~n žŠü’Ú#X@ãud3à»kŸ›|‡Ðxg³&Z`œêz”™yï…wB Œoìé86|UC};}{û/ +( endstream endobj 6938 0 obj 6366 endobj 6942 0 obj [418 /XYZ 37.5000000 394.250000 0] endobj 6943 0 obj [418 /XYZ 37.5000000 364.250000 0] endobj 6944 0 obj [418 /XYZ 37.5000000 146 0] endobj 6945 0 obj [418 /XYZ 37.5000000 364.250000 0] endobj 6946 0 obj [418 /XYZ 37.5000000 146 0] endobj 6947 0 obj [418 /XYZ 37.5000000 658.250000 0] endobj 6948 0 obj [418 /XYZ 37.5000000 658.250000 0] endobj 6949 0 obj [418 /XYZ 37.5000000 515.750000 0] endobj 6950 0 obj [418 /XYZ 37.5000000 394.250000 0] endobj 6951 0 obj [418 /XYZ 37.5000000 515.750000 0] endobj 6952 0 obj [418 /XYZ 37.5000000 424.250000 0] endobj 6953 0 obj [418 /XYZ 37.5000000 424.250000 0] endobj 6954 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 524 147 530.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 6955 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 153.500000 541.500000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 6941 0 obj << /Type /Page /Parent 2 0 R /Contents 6956 0 R /Resources 6958 0 R /Annots 6959 0 R /MediaBox [0 0 595 842] >> endobj 6958 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 6959 0 obj [ 6954 0 R 6955 0 R ] endobj 6956 0 obj << /Length 6957 0 R /Filter /FlateDecode >> stream xœí][¯Û¸~÷¯ðsuDRW (äl ô¡@}(úPd»],’EÓ}è߯lI>¶äo$~R²¬tc‘Ãápf8×7þôÏý¿ß¿yÿé?û/íï÷ŸvɡȒæûãÏ—_ØòÐ~Þe¶ÿòm÷}ÿ}÷q÷±þï÷]ó§÷­?ýoo÷©ÿÿëþïÿ¨¿ü©ý£ã|Û¦¨=ý® SJοßÿ²ûÛö¿Gì¦k¹þ÷i’•Eycdêï»n™æôóû—ßvoøÍRSdùÞ¤.Ý›*µûÿþk÷s=A7|r¨ÒúOò´H°Ç™JSb«íI5˜èô£3¼ÑÜ&¦ 6x¹:VŒË<ºâæZSÓ{³¹iÿçáClnZŸÛ`ƒŸ WÇJ»¹Âèš››å-õWY Gþ<·á?A®”nkáàš;[U®Esô:¼þà®FQ¸­=A®Ž•noñ芛ëLQ¸¯Ã‡Ø\W†ÛÜòPW]ss3—‡ãɯ£‡@îÂij äx2Ü÷Öššeç¶¾ ÊÄ5ÿ¼Qe+¼¬ÉCìCN6º² ÈN«c¥Ûeÿ´ÿc’¸âOûÏ¿îªC‘g¹ÍNð5OluzRÊ*¹~’XøäýéIzH]c˜9?I_NO²C^˜²¸š§Dï$?¶ï8{T¡§AŸüœÇä輌ƒ$EOœiæyØ l1®[Ç„¥ óàed§'õ™LóÞÒËÞ2ð &ÁЧôp¸ÙÂh®¿q%DC™|âÙRݳ!ÀIT8ÑÂVâ•B’pçÖ‹?lÉ[‚hÃSáL`Ò„G`ÀæÚ‰ü\KÍ0/3®'ñfã<¶ybL‡˜ûD->Ì1×mmLC^©°Ûlx49½›LèÌöc HGÌh"–`ÔÊ:£˜˜ q„‰ûXò„P–²£¤>ÈÌ`v…Ñá½;ƒ¥¤IlÞ“³i¶º»§«'Ï/™Épw¼RA¸×Læ¢+pA¼he¸-ÞŸ·ÅL«á„n-FþÛ>°$¼Œ¾Ð`.8w›2¿Î&VuSn¶*‰–k« ) Û#k¤ ƒTuht½^’ÝJÅD¸™¸¶Û‰úéy¨(¾Fø0Hº¤ °&ÄꥣY¥P³ÈzL(Oó²êÉSýU@*ÞŒnBò¥?j!ȤLjޛ8*²ŠÊÔ]Ÿ–êpæÆ%ãÆ“–¹Üzâà“ÎcýçiÉÌïðIŸ”ªP¿ƒïà'x4µa Æûó–xçýFãPyn;ŽŒ÷bÄÂu' •¿øÓ2žÇÁ' U8|žcQœÇþPTŽ÷®CíÞE¤òÒŒÂ3ÿ> £-x-±ÒÏ¡°ƒ¹„-1þ|ÃÒQ€Ï%^æOÖÆ;U2þ1AÌ[Bc(VWšèryJ61²Ó?~iÙB¼ ¸&8¤Åz0æ„‹Bðnc Y²då\qø“©ºY_"ÎêÊ wL‡Gƒ·Aòâ'˜¿’—š'î5UdÅÓÝÉ0_Õ¥Xj|‡Ýn…"…,üVXù:i,Šeî#X+^ˆ´­2ui+‡Ø$;/tK½ÙÂ<ƒ|™GT»°ë‘üšÊÁ£‘œŒgŸ EÅ1åø$ÏŽ-”P<žs…¦n„dÂgå\ÃÔ¢µùäë<‚ ÈNãmg8΀j˜`RŒ. ,Ž Â~ôÀ9j fqJÞ)˜Óª 7û”Òjë÷Q¹²±¤1‘®Éè¡ u šYc´ &rÓ*ƒhñá*,d:;Îí¬ <‰éIT4}"ÄÒ#–T˜˜ˆ×ò`‚Ê)b̵L•· KÇPâÔz€YœËÐ^q?‡•aî °‚&" õXƒ`í26¶ÊÂw;7¶2 q.8#u®è3Ò¸é±LÅÂnå`¾Ìdתèca¶Z4ŒÜ`juèjÞ„Íä±ì¯Óõ£h Á*µˆc‹Íà'nås‡cYШ<¡« "Š1å]üCÚTË´/×ðù Lf U6³ˆ¡xQsô–`#l³Æœ§ü@ÐX1ÂüÞaæy ß©Ð;i³Òâ}þž´:ý0A bǶg»‰^G+ iÎY~°oxÊ<ø ^ÆA{NnÀÖÞkn­Ôúc§='&í–:á<ÚHŬYP”#ݽ.RÌÄåð¨Fu/uŽ>ʹúH ¬pã jÝŒ)®s+¬U0µEŸWc‘(•i ‡áÚ‚)3¸ ̬ëa7Â`°£Ãƒ‘cŸ¡†ÐÌÐjz9’Kvêû½ÿ¶³Î^~ñu÷)¡'º¦Ô¶Äí0Aݸ8LdqNÄø¦ô6áÛõv%v?ö#=¦Ixt](”—Љ•{Del350çšž+-<=-;Š{ÌðtƒÃÓ1Dà:³¦B³;»€G 7i7°„·ßBÚ}yt«×fölH˜=¤]7¶ˆJÓ%rꟸ§ÓG8i42,Õ>QopÅTJ›jDU‚ËhñBS$²C×ã‡í=“V–n=aFs#—F¬0â-¾õä>4Ù²eÑÛ‹®TÓmnÁ0âJÀ/T'ÌcüBªh‰þÅ4Õ âõ`؈dHx²="@Ÿ>WõûÚ« 1Uù;Ý€§›+0]WydBK[Öë§.I©¢›bH¦ç4hö‘Y“ÇØ¾ [‡JK‚"LÓwÔS*”ÉÔvñÑÕ̵T *Æ*>¿Aö± ú$”y”Þ†àXIìgi9Š…'ÏÑÈ“'Œ2Æ1l8‚ˆj€¼²½)ŒOIa|U:Ö¶sæhæÜŽÃôŸ¤N~‚cyˆØ:åVLDƒöE· %Öƒé_h_¶5]|ôïÑ~ÕΫÁWþĸ@ÃqI \O¹,åôJïC´ tp'*e (KQu•©Ž´y²%Ê\¿'»HÜ < Ä!f¸&;$•»Æ,æ³€¼¦«Üò‚a‘„ÕrËlWÇêU¬Qee±Ïzà"Ãv&OÅ4§[(ÄWb’ˆU~#?’½…Œ‘*«œa¤HßùÌüýS9ÚŒ0”ç–‘ñB;,u=‹ h¯Ó¿”Íœ§0É+¼pg¡¾² p!<œwx,ȶ°í%„mŹîÕüaÛa{–=ó­t‹¯ž2šF1q†Cªi¬Ë‘ÜÑÊÂo½t#hin{2dm]z£qžFÝ2NÏ~ Žu–; ù+ÈÂé×S»Ù%{ýøÊ¨¿F°^1ö]ÓÀì­Î˜Óé°i¿Óy¥]ß莟ëÁ<’¨/4ïU \IwâÑ Ä¦›¼Ò¸À©xÍò™ÖE붺Œ{,ˆ@ôŽXöÀÒ¬Öˆ3 g·ž¼†6·ôÛö6K¡¯¤i-…e¶6K!q½Äz³!n6Ä›²ï‘lˆk»-Ñ&:ÿE—Ñ ‹È ±]yOòmVê@Vê[°=-Yè¦ÌÐA¤hL€f,›áÚäØfå[²•ï–þþ8¶¸ }ÛºS$èfæwo3óÅ3óU«5óáõf>l;÷£æ3_ÛùåFšŠÌt3óù2ëÖÌW¹å˜ù¨ aïrë›™ï>ý„1‡idËÎf_\Àínþ¤A¬Á©Ô“š+¿-ÚýÑYæ‰ï™ª”Ï$V P‡·}á¨l^^òÉ#ƒ_`òÛ dÊŠ=J™ÍPÝ&'L]F w¨–a+¦”Îõõc\L·ÖÃÅÁpá2<Ñö¯Ý¥ ÅJûÌ’ b& Ï‘‹Gˆî›$p0ïaŒS}¦ÇœÈøácE­/X3›¿ZôV ã>–\ ƒ¢üéÌ…R°§[(èCdÜD°Û], ¨©ÂÍÔO•õp¸]ì½ø!¥Ð¨^X|ÂìTÙúðbÉĺ01ªz™r”ÒZm s]‹=ŒãŒ¥Ži¡¼tUWO´0¯•YÕW+ë6R’-EŒËiŒ³Oá—?E ˜Ý7µZ¹­[«dÉÁýªu•«Oð£½0–yÿƸƒûFÛ’!ž(b~Óô¨ŽÁdW8¤1¶5¼ §A%èŠÈÁ ;ã,¤Ü{Œ_™_ëªßÚÔôÏáCÝ¿TüU*©%sõka2™‡{F«D [ìz3ò†Ò’ò&§“ñ¼Dk~ªëIzÈ‹ˆ&aŸEšöÅg¬R‡‘Í™öªÔ½O÷é6ÁxÞ$Þ;úûmØt¡øT ]bóŽž§á/\ŽömIË«9f2!¬Ô¼Wˆ^Æ;q«MÕ†¿Ldµ°Ûp`ûT¡}0<  »$ÍF! C\ -ª1•ã'x·ðÞ«¶Ö])†ÀÀ•â&ÁLK[oD³hƒGcvs;¼ ªí…6ÒKhøë’<]ð$Op& æËX cúÇ;ÌœtÌIcîIÙÝŸήVûb“ØnVÌð>àÚŒ¬ÃZ !‡1—f4›ù55o¸eü¦QúX þ-û ÉŠë)oeô{Øó=Ò[ ;Õlzz¾°0ˆê2ËcÏ'ÒN¢¥²1± LzUôr°ûô0A*ð_õ´0µÿpü3ÕcvþÊ"+#Z§îŸ Z4·ê «çóù- OÕ£¹ËœN9•’)ôLhÁö‡ }àõDF½¡2Á=BDfoF¶ÕÄ[}M¼ åM,Ú¥ØÔÈX¡T¦ØmDû”5=HoÝýǞĴօ®°íe¥ÀþKÁîÑdÓrž%[öbÚxm~6ÝÄ<)eç?Ÿ¿"e‘Œeõ[²M[Í /!cçŽÉS\²y•§œ™Í«¼>¯²îyŽ)ÝjUàŽS»y•ƒìIzö*GÔ8\ÞùŽçÕÍGš_HÜè\ºŠ›Í8å×Ôw"¾¢¥{k¯¾8’=Ö Â(G®O„oìR¤»d¬6Ï.-:„­­Í³5n~Üyº†-›¡!4sÆ}?rŸ¸¥ÍÃÖÐê¶µ†enfÎÖ–^bYm”¸X5³!–pØwj‰+‰W)HØË™¡TUO\èZ¿$~‡J«dr>pë1¢&álÚÄ| pÂÄÞ[ƒËð–ÈåŸCºÑÜ@6ª4¿P­ÊT†V©ÿ<µb¡ø™J¯¦&®ê£õ·ÑÍb"TˆÕ§1ÖZ‚¡ç0VösZž¯{¡9Üá¯êï2¦/F¦›ÄæaÃeK±NÏ4Ì‹TByÉ îÎÄB¨W/Eb¦bfy—àø<Zq3!%€Hí’Òp ‘ª"lS-ËÌÃ$ÌÅLWËÊ{R`qI†^p‚NÕ©*Tª"ñNä±0-(Å{OŒf1•ãbp8™õaKƒæ‰~ŠòˆC!?g i¤ëeÕ´ ¦Ñ1 ë9â_7Šr%ýtê|1nbœ«^‚ô€8ñµúgÿ½f`"û8ö`y‹ÿ¹Z×OÌ‘ÓíÏ©³ v7,°¸±ÖFƒ¶7ðÍ–ÝpŒ·ÜÝZN{Áš $4³½ß‚íC»Rê‹CóÓW¬i—>X`K8Mßýn,ÃàÑà;íñ0^K¿Nb îø¹†øZº% °Ø1IÀuøn¾Þ¨/6[Eá`À›&ÌSÞ¿Eâíá½Ú Œoœ`vï1Ê¡>î?îþ a' endstream endobj 6957 0 obj 5066 endobj 6961 0 obj [419 /XYZ 37.5000000 293 0] endobj 6962 0 obj [419 /XYZ 37.5000000 263 0] endobj 6963 0 obj [419 /XYZ 38.2500000 234.500000 0] endobj 6964 0 obj [419 /XYZ 37.5000000 702.500000 0] endobj 6965 0 obj [419 /XYZ 37.5000000 263 0] endobj 6966 0 obj [419 /XYZ 37.5000000 476 0] endobj 6967 0 obj [419 /XYZ 37.5000000 293 0] endobj 6968 0 obj [419 /XYZ 37.5000000 702.500000 0] endobj 6969 0 obj [419 /XYZ 38.2500000 234.500000 0] endobj 6970 0 obj [419 /XYZ 37.5000000 476 0] endobj 6971 0 obj << /Type /Annot /Subtype /Link /Rect [364.500000 212 393.750000 218.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6960 0 obj << /Type /Page /Parent 2 0 R /Contents 6972 0 R /Resources 6974 0 R /Annots 6975 0 R /MediaBox [0 0 595 842] >> endobj 6974 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 6975 0 obj [ 6971 0 R ] endobj 6972 0 obj << /Length 6973 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯È³©Ň$`±ÀL÷Œ=,Ðè|0|XÌîx±¨Z¸½ÿ}gJ¤Ä1¨T(¨|”<ð–Äl1‚_<|ü÷¯9ý÷¿N?~úú?§ßüßO__ª×ÆVÃÿ.ÿýÔí«>5­=ýöþòýôýåËË—óÿ~>øúéÏç§ÿ;Õ§?ÿÿ§ÿü¯sá_ý?ºüƒ÷—F5ç¿oýß®Qç§jü{)ÿûËüÛ韗9Ï |ÿÁT®5Ý…Òß_B3Uÿß¿~ûçË먴J»®=)£ÍIu¦>ýïß^~?˜ª¯^»ZY׺úܯ׶ÒÃ+—dS÷4Ûú¤êî,å0É¡™êUÊÛ®)WyϹ8*çzU¾öó—ªsUÓò9¦mõh7?¸‘êÙÀgÍwü/à‹7ªª‹Ñüñ§šÚšîÌ ù ø3§³VvºÉÔ7tù…93ü…¼Èc˜DÏw€ÊKè½X dcö&ÑÙÞ¥^þDêüör6¹yIà£GÇžæX¬•›©¦Çžå ÅÙ»%˜¬G —ž4E"*ÿÞ—,á‘Ù”®¦ÊßÁ+ á:Mý`¶âŠ6b£Ô”¨nå<Íé!ú´6ƒ\0­K0ìïñsH²Ûh.ç`l°—&nùEwQÁÈ^3XLÿWÈœÉõLŒTMºsÿ. ‰iÄŽE úàAÖ"Òs1ŸÕôЀwÐái¢Üx®@EÛ]J¯4Q¥’ ÕD·êÍz’J&ë‹4 iÈ3Y¥ç‚ÞF[Ûê;e­¼v†‡@4ú‡oèC1'cjȌчÙ{ xJÕ#PÏE+*/†—Îà|–TG± Ù€&.WP_ý»AÜ$+Úît€EDzh.\L5`GÉéÍ ’ÂD/ÅQ‚¢Îh Š…ºÑ¶Œñ6e–â‚‘=3SÿWÈéX70a]š&] Þ Œ €&¦;)<èƒsY‹HÏÅL|BvÔCÞÓz‰Êç T´ÝÉôJU ¹PMxóÞ¬'P d±ÞËH£†8“ePz.(ám´%Ç[—÷ÖkgxÙŒÃ)ø¡˜“qd¦A¦ƒß1´åÂ59Z±*…—Îà|–²x4lçœl»ÐÄå-ÔWÿn7ÉŠ¶; D‘&˜ÓøàðGLo®©Ií½Qi” h€3šƒd‰±ñfEºØ’ò6¥–â‚‘=5S3«ØN§Õ­NӤˡÁ÷ïB€š˜Fô.†}p.kiTJ|BvÔCÞÓz‰Êç T´ÝÉôJU ¹PMxóÞ¬'P d±Ëƒ8 iÈ3Y¥Qám´¥6Ž·.ïÖkgxÙŒÃ)ø¡˜“éd¦k ³wbhÊ…êš ­Ø •ÂË gp>Kµx4Ü‹UÈ®4q¹…úêß â&YÑv§”("Ò5ž‹épÄôæ Ia¢½7* pFsZblœP¤Î(Õ8ÓT[öß {>ºËTõeCIg ì(k/°]ÅTm[n/LϹ4(a+ Uy™ Oæ •ªë Èaª¾@åZ—òÀ¹8*^Ê™Ú×vÜSœR×aâîá©ëaê×NOáßEŸ¼UmÞï¤U›dK«2“(h#î |ÚùD60ƒ‰žß‹C5l|ZF ž¤¼1âªk?s}~˜ªï—ÇQÁćŸ»¤¶)h?›~H“¥Ëa,8ˆÁ“Q‰ ä`AèûÝ kq©MJBÖ€,ˆµSå&ð«ر ÑÄ>À¥'œ(ðAàv•ÉB$4’ëŸäÁHc7.,CS›Œ·Ú–n&¶ú÷0Á?>Mœ6¯‘õÁw)Ïc:ÈŽÅ–4+˜¾x#j’ÉæˆÇT² QŠ OÒ•²²PŽfúCA %«ðC±6ÅDìh[ÓS,Bôqy l’êàŸ …ÄS ¨˜ðL¶[-ͪ`b ),*˜XôsÜÔr~Öÿü&K—#à$Ö˜ìŒJ\  Bß»œµ¸X•¤”]Y… J¥•–›À¬JÀó8´pé ' ‚ÉoV™,4@B#¹þIŒ4öÐÉ,CcUFŒ[mËEYÿƧ‰Ó(ð‚ŸÊyžÆAv4±( FEq¹4HM“!S!È‚€¼;ZFÉá!µ\ø€r´" b(Y•€е)&Ò„Yîø ¤è š&EuðO…BâÎ)”#†×›5ª·¬6˜X‹L,¶Þ¶šÍ§ããÁÔ»*M–.G. “p@#,1Ùà‘Ä`Aè‡++qiÚ” ¥ìªÇ¤•–›À¬JâÔ ¶ð—á„Æ¼ ˜üf•ÉB$4’œ8iìÑá•Eh<’–Ò¡Þ¤¢À¬¯ƒ¦†§‰Ó(ð‚ŸŠy]iÀŽ® d"Qra&(bÀ1‚,hpGË(“t¥¬,Æ”×Hs}A %«Ú6s æÎfLOhh$¦@Wåå…©þ©0PH<À9¥€„g²Ý|V̳PaqÁÄ¢=½…OåüP8!«U“&K—#×8¹&•à‘Ä`Aè{—³—ʦ)vDÌbƒ²I%Eå&ð«ð<øÄ,À¥'œ(>`³Êd¡É ÎGŒ4öÐÉ,CSÙŒKmÇ2Fù½4¶)°ße¬½Äfã\ÁÊ/œKƒ6ê•KJÖva#“2šª/Py£T¹Ê{ÎÅQ ²%k/´×®qÚ'« $›ª/!‰®à†ÊsqT‚˜éÚ×dÓn/« Ü/v.ˆ; ;+/—/ßpU›7Ù9T§Ê?9’OÄcEß…6ÙÍиÀÔÎïÐA¶Õ-ã2žIrëMýû°å§šž&¢ ~*wTÞÀÝ$Ö 9§DA:âåÒ ™6C,./YÐûð´ŒRLx’î¶Z%j‡åÆ¥¡À`†RUmE¨†Ú1ã©Úè „ýµœ]”—W`£4PH<ð|} (:nר޲º`bRXT0±ØyÛ2ó„N|?äTÈ“‘ž^Ê”#àÒ˜L°80aЍ$ Bß»œµ¸˜.%H)»26¨.­¤°ÜŒ|)ÈèfÏãbÈ)D8QL~³Êd¡ªcÂò`¤±GI<¡1]FŒ[mËÅ..ï:hjxš8ZXø.åy¸›Ä6hÎ)Q¶‘¤j’©±bÀ1‚,È»£e”b“t¥¬,Æ”k¤¹NZJU%à‡“æ« [mâ'°—¤–S k€òòªl” ‰:§PpB²Ýœ3'd ƒ{}ªYÁÄ¢ó¶ÕÌ#0¾jÛÕ¨M“¥Ë‘ h6?O°ÄdgT€Gƒ¡ï]ÎZ\—¤”]5”K+iƒŽÐ¾dt³çi[ÄP‹6פ ‚ÉoV™,4PBuLXŒ4öÐÉ,CÓà‘´àVÛƒE¶]N7Snp˜¾Ke2«ànWÕ‰DAzTÊ…A˜ ˆÇT²  Á-£OÒ•²²Œ§ò; nÒrxž'ÉèV?´)"2ÀÓ§2‹žÐÐHL®*È«ž³Q($àœR@Â3Ùn´4Wé`b*,.˜XNøø)?¤ü¦§lš,]Ž\ƒØü<Á¢À¤2¢<’,}ïrÖâRé” …ìjÀ$••›‘/Ýìy”E )‹' ‚ج2Yh „꘰<iì¡“Y†¦Ò1nµ-¹¦zš8‡yà»”ç©[ÈŽ¿>`bb^rið-$¥ òîh%…†ÔN`'™JÔŽŒ Ý® f(U•€е)&Rwè Äè ¼¼ê¥BâÎ)”J¯·kÔÅ@t0±Iw½Â¢‚‘¬¶¥%ý©=¦N“¥Ë‘ 0›Ÿ'X ˜TFTâ9XúÞå¬ÅE')eWTL$VRXnF¾dt³çéõ'®ÖÔˆp¢ ˜üf•ÉB%TÇ„åÁHcÌ24:'Æ¿÷;ÉVìF£·´ %Ä•ªß3þüíåÇ_U¿CÕ¾ý~Ù¶x¡9üùvÆ_éÓ­ÒÍ9Úüö×Óªªþõ§oÿxé^]mÃ/Õ'êåÈoZê—úgòšƒºÿå—og\‹AR;ƒ Q¿ÜIÃSò’Ž&¹Öj}KëN”kŽ’‘t2XÓtHÉѨ†ÑR’kZr¬ÚHí¥1¨~’”B†kZãi›#åCsÑÍjôÙç^cÑgÓnˆl^õ™= #]›ÛÓ›O`U!ä™Ãòéoh­§Éñæý ƒƒÊJJ!Ã5Ù×e¸føyº·ÍpM"Êñ~M¤9 ûÚJôú_ûÔ|iã}iM+&©œ_¼ˆwò‹cà -qFœéq9¾”ÖzFÔqXäXd[é ©áýÝÇ0$OÃpzi×¢c¡»öq´åÓžŒ#9š(=3Ac@sMw¤Œñº6{ú8=ª’¨ËLˆÐ£¾¥a'7BbhÛÉ'pÆB¬™RøûfÄ´ÖgxãÌ+•P¿u2%ý/‹kZ8š(:†¤½ƒÞv'=`I›î·vrmS¦`,%Üß0‚uû¾žXÍüBûÚŠÃÚ[dz:t´–±UZe9¸1æŸmLsDcK˺!g;䆎0ã à3–ÃŒÖlJÆÿî9U=5‚vy–ÔúY ^+ewôb·èF‰L7Æé°é_öš,ßk …¨¿ÊøyÆvN šÁ€³üË é@”ž@ó˜-åiGÓéàhÔÀfûÚvUÏÏÄŒ#Ø4¯F7 ¾e|à£~¢¾© Y[GÖT¯q~£4ùÍàÜk­Úþ',øŸ¨_Ô`~öU×­‚ßüLòFs@~3vðóÚhhÜÈoüaJ>5ÉÛ eBS'ê:¦Ô¦dªÁ”ÁUêÕwáózSJ©„‡»'Ÿ”ì %;ïÒZ¬œ‰êZíRÅ’¦QW¦a£«7J:ð:sï)ü4fI6¿Ë'Å )tº6Eû5š­"XÐZM¦8è…Òá£+˜¥¿¡„eF$×¾ÃKµ‡æ€ÿ ði©3œÍµæè]é3uèÄ´ÿèŠ_Û•¨Ïä?¥ÛõCNŸJwV7¸o¤Õu…êÑJŠ—6CE~ã‡/©oZªkº5R24áŒÆ1tÞ‡µ«~ÉX÷L‚´°i¥m í–o/óÙk±kÔµž;Ó™\gè00˜éwFSý5ÈÓt 98ãD™¡Ä¯×ë7Îs:GŽI¸ÓŒÓ$ànÌq!KwÁ¾PùÂáõ3Óß2¢uœû G‚·w¿ ³~z'ëƒÒ²ë½Xˆ©ê°ì¨÷ÝÜQ|)ŒÞ«šY§¦'ª #¬SOŒ³¥ô7™}ƒ$š³¤ÅYšáì?þyGË0n‘ŸÌrÌýx_×Î7äy‚š^´¤÷PÓÐþ‰ä€ÞëEû Îf:Úšt·£.»u@‹õ-ù9z£ê™Hg˲QF&~¥ytÜFGÝt=ð–ZØkø2›àbD3ó 5:î¥Ã?z¤ˆ×_XÁ3ƒYzB’5øº~<Èj Ã62rZ¹èðGsóËÞÔo|2Ê-Ÿ"d…Dt׳Èí²Y*j8½†fUx#àCf¢¹ëSœ5¢ñýcn½zè\;yÌîŠÑ‘UÆ`°žìDöC[Jê›#«Ì‘ÃbÂz_Z«-§û7«LÔð#«Ì]Xä/ñb!gÂÂí‘§'x¿ ’'‹ <=â½Æ‘§çîóô˜ºQE|Üãæbˆ ¹}.†#OO®¥ws:•ÿ=Ðgez ßõ½©»¶Lð„yz"°nß7yzŽ<=÷áeH`lé.yz"7t„÷`G˜±fèÚnÊ}äé‰qä驎<=yùÜq‡}äéɵt<= —uƒ\þª$™m›œ ô!:ò@ÓŠóҜӜ{{–ä¢ç‹3b¡5E4eȤ—Åí‘®Ù÷Oï®–MDÀɃtÏÚEc°W^±ãÑ™¨Útuv™ Œ…NÙ#‰öŶ¹X:JpzÚ̉\ ¬ÑÝ,§Yæ@?íÈðc¯D Oĉ6f©íèÃÈFÈý´ä[2ßÞ|Ž\öüµÆêÐß=ݵtmæZÈŒo"¿Ó{̯k,qÉdI¯:¬ãÇõ•g8ššˆªƒVoŠz2;;Ec(VLÈÙËÁ¸žP6B—݃µ¢œ÷ô+.üÚëB¤ãJÍU{ ¡íq¥æ:ÂÄõŽ»,q:r×7éTz“Žh†0á{yv\®wv”‰,ŠœD΢9Óè{lèåà{^`Ï$a[Í,;s¼É›ìÒû3Þ>å\·ÈÏqûTV+«¶ÚLðdšÈÙ‚tÜvÆÜ8u7¤¹v\vÜ놴fÚyÜvÜv÷Ç iW5ð¸!íFÛ½CÊ©¦ —§>@P:•CÐw§Ý>òN‡ÅØžûMÏ6«õ¤7Q¬Ó޳‘=B²´=Ïܪww¥C ?î®ÌéöqÇLGøÐ=ÀNÓŒÍ;î®\ô²¦h#„¼ì=gô~h‹L}sÜ‘yÜ‘9a½“ÏvîŽL‡~Ü‘yyÄ¥¯ÜÉÇuÇ™ØûuÇ™¹>îÈ<îÈÌ~³ë™]}Ü‘‰|ÜÉíïA;îÈ̵ônnÆZåË«²2ýh—WíäçÍqæõ=€9n¼†·ã&LæZùCŽ\Žþ~liá›0Bnè&îÁŽ`"ÍCßwéP#Žû.«ã¾Ë¼|î¸[f¡Ã˜è£}gYàãLøÞÍ}¤…ùè÷ ÷rÙiñS¶ïN~ºS4tŽ)F¾¨Å,Jt*ëÈVn´7ú6]ÆiN;Θœ;$9 ’Ÿ%Ëc&;–8o—9áÅÉâ#6ÖXèTõ´}}v–ôÙtî=ßÁ§4›Î hÉ_h5"éd2 ÒÞ)×;)3öN>W.ÚäžXîVö˜³hïD÷Ý×É8RNs9 {°.Ü}téyªÁ‚ZÔ}œ-hð 3©¦~i<„õ,ñA+úMG}ãŸÍî4×»ÁDmÞ=%¾©h ¼tAVX%ÖÑ!Ûã' µÑtü€¨yÕD\œÂ®ÍR\{¨ÆMít9­k ÁUöµÂ°3nÏ•½^ÿðP×$²²Ô1&É9ýl̾×ÕL&Ji÷ ôCÉUˆº¾i;wu'BçA¼Ãñžb Ssè.ô˜×Ë÷ï/—5è¨àíåk¦‡.ÓµwCÚËH*‹—¯_ãVhµe!L÷{uÓ·º§W¤Îè÷Iºø½X¥:à=”ÏýF$hz‹)Zh¡eè´ÛÐTúÕ/÷/¤g®hXôP_N_^þæ’« endstream endobj 6973 0 obj 6860 endobj 6977 0 obj [420 /XYZ 37.5000000 659 0] endobj 6978 0 obj [420 /XYZ 37.5000000 564.500000 0] endobj 6979 0 obj [420 /XYZ 37.5000000 564.500000 0] endobj 6980 0 obj [420 /XYZ 37.5000000 348.500000 0] endobj 6981 0 obj [420 /XYZ 37.5000000 198.500000 0] endobj 6982 0 obj [420 /XYZ 37.5000000 348.500000 0] endobj 6983 0 obj [420 /XYZ 37.5000000 198.500000 0] endobj 6984 0 obj [420 /XYZ 38.2500000 723.500000 0] endobj 6985 0 obj [420 /XYZ 37.5000000 659 0] endobj 6986 0 obj [420 /XYZ 38.2500000 723.500000 0] endobj 6976 0 obj << /Type /Page /Parent 2 0 R /Contents 6987 0 R /Resources 6989 0 R /Annots 6990 0 R /MediaBox [0 0 595 842] >> endobj 6989 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 6990 0 obj [ ] endobj 6987 0 obj << /Length 6988 0 R /Filter /FlateDecode >> stream xœí]]¯ä6r}¿¿â>ØkQ$õì;@6‡Eoœ`áYd²ùûé–(‰,ñP­R‰R÷(FvÔìÛdéÔ'‹Eò»þå?Þÿëïïß}úåÞsÿ~úå­ø¨mÑÿßûý¿?ù eóážßëÆ¾ÿöåíëû×·Ÿß~¾ýï×·þ¿|ú×ÛÓÿ½—ïÿrûÿ¿¾ÿùßoqtÿƒ/oµªoÿþÑýÛÖêöTŒÿÞÛÿûíßþáýo÷‡á1áç?™¢nÊâNÆÂÐ_߆×TÝÿíooßõ¬¥Q¶2Å»2Ú¼«Ö”ïÿûŸo¿ß˜º/>ÚòöGMUÞÞñ£)tÿ‘;d]ÞÆ¬ŠPªlo·ŠÙw Ôý—ÅŽw”‹£¢t¥Ò½ß~©ÚêöŸý±­õFµw ÜóMò«ÖΆ÷_þA»º+Ëï]ª.­ioDÀç€.sSé2¤çÖ>Ñ~'˸‡9˜‚áÇѬÙÂ…/]ÃZ\z2f ÝÄ®{_j"«û|‡AµzzšPb6ü¼‰MvâJ¡rÊ„DD´OU¬'qz"Ð`^ûn úÒ=-£ U±žäAêˆ@ƒ~l'È9﵌’?ðÄ])£ìã´·ÄйM Šu%à¶|iòéàéÈðž Ÿ +'@åøe#dì aOèËb@ùÏx»Ù`ûõ -±~®ÁPJŒ$&k BP‡D7¾÷T”D“<4Ž'ñá·P„/¡g‹å{ ËÞ@† ‰¥3Ìzsf׳úÆ8:Œ‰‹Û‰ÿèÄ`ñ‡¸31XúÎ_­ÅE—1FJe]Rkì Xà]t™ÐÍn«“¿[—nàHÃà/6‹LšCÖXŒ8ö¡‡Z†F— 6n6ʺ­q°J¢£ÃõÖ°̰B>kJ|º# ÄCl–FÈ2Nà²äÀˆƒú¤eht™àßVSl¼I`÷¹ Ûð4QêMòŸÊ9*[‡ä؆1o ;¿]¤Ž4XàÇv‚l`ó^Ë(ùOÜ•2Ê&H^zí1t®AS‚b] ¸-_šüA:x:2¼'𵓠G€rü²2öа'ôe1 Lá%¼Ýl°MÃ4®ÛÀ`V£¥ (1’˜x¬© AÝøÞHåIÉPÇ“øpÛ (—гŀòž1u«™¶í`Ÿ[bíHÃDbë ³ÏöøN¬!)Ã†æ¾æ [ç·‹¡ÓÐ\!]Âç¶–q±mŒƒRÖØ¶Ô {ƒf0h×#]&$t³¿òÇï½S]ÞMËIÉJ¡Fņë=—8&q„*¥I^)áé­n;Ú_¯ÛÀðíf$Ȉ`â1ƒ&›1«å= œ”¸LšDã bÇ>tF1h,Mäb9iRueêbK-s_?«KãŠsí¬–Y 42ËИ&ÁÆ­ºU…»SMU’:42ËÐÔt&-%CJ…;ÆLÓ’:4JP¬«ív(&ož;þ™‰ Ð@ üjædìaO`œb@Ïx»QÓlQ*V†K&Ý þAÊ)·3êö·Ó vFM°¨ ©LF ,’,}grÖâR”1F éUOØRÒnFºêÐÍ–§“¿[eÈÀ‘†Ál™$4!‡`y0âØ‡Ffš¢L°q«n©p‡UÕ ©ÃÓDi¸o#ø,eyÊp«‹-Bļ!>+ Ú¥A*›Ä`aÚ ²AÎ-£¤È”ºç®”–©`†èµ“m Cƒ¡ź°C¾4ùƒ”Cé½ÿD¦FbôPŽ_M„Œ½"ì S (Ÿ^o—¨N³ÚAÅZ"°¤a"ÑÕã÷Rvȸ›ÛC|XÜNL€™—Rl€ÅIe2J`‘Ä`!è;“³—²1RJ¯Ê–*T¼ ´›‘®:$t³å1¤ú&À¥8Ò0¨üf‘IBr¨ñ–#Ž}hd–¡)Û·ê–ñ³î³$uxš(õþµág)ËcÊkI1R¤ÌŠ,¬“Ø’µ‰Áôdƒœ9ZFÉÐ)µ¬¶ ð Ú5‘\×`(A±®ì—ÝôðtdxOtj$%@åøÕDÈØ(žÐ8Å€2`z½Y¢:ͪ«ˆÀ’†‰ÄÊé–G`|;T¹Â›ÛC|XÜNL@5/¥ØK$•É(Eƒ… ïLÎZ\lc¤”^ÙŠ*TÒ°ÝŒtÕ!¡›-OEªo\º# ƒÊo™$4!‡`y0âØ‡FfKgÒT†~^³/o.JÞ_ò5ñÃ~}ûî'eTñ~“ð_¿o »Ùÿóë—7sûp¿´ä¦¿þåý‹¢üéŸÞýë[ûQ•v Ñ}cÑ7êú¦€½%ç{ø )¨ºo~üõø6¬ZT]ö@µÊ ©ÛnHU|Tµjjë‘Ywß4M[t”Nßô@™£ûKs¦(áošþ›DCϘ›šêNÈ –X¯FL‰.àoDAß cñ}AÜÉÝ7öC—Z€ ¢T0PÂÔãÞÊþ÷fÐ7e iã`nÖ˦ó­Ô}Á¾{¥QÙD¬³DÍ&n`Ìñk`œá—Y¨v´½ÆÖÄøî,FaIŒa 2_ ¡d°ugÝâÈKë0TÝ‹zg $Kî8ŽŽá‰X~-—'bÄ ÏŠuâ3B”%´8ž‚VS°&ÄÃN„£É¢Á ˈõ (5¼êsÏÐq$¸•qÉîèsÛÚRŸ ñ`yhÐXžA4¸7Òöy½è~œö£®lõ ¡I¼ÏL€OˆP?ûSÌ}ì±vË:nF(/kkK<ÃÓvü>Ø CDTcy™ÙsÃ_ËN.ªÕ8$”V –+ÄÆ²ˆ-G®øÚ½#U].~³é1”™ðûáê!Щð'Kxk¥¨àq‚˜%ÇjPxŽ1Â&h±ËÌàŸÐÉa¶` ñx^†Åuj Y #æZ Yc3½dŒw´¶®¨íìÇŒMã?Ù`“KÃÎ ÛŠG¨ZäšÙʘFÅYyJô63+Ø™ä× ÈŠ ›r,²¹ÜçNIÌhÌ›ð:‡l³”a"W8ㄺr¦¨+äOphÏI_Ჯ»ÍݱraÎçÊÿBáX±Ä}ž%Ž3q3­}'¼®ô«6Õ`Bp±Vƒ¾IÌ]?£oìÍ ÅºÞr•~ÝwrÈÉè3´TkDc3)S ¨cÍŒ_¬Šêšõ$-áa³F9+j’ Ògpq&,œðóPÕ¼«6šŸíS M9XaÕ»+U|ôFx&#±oja9³Ü ã7-üM‹~£í`&û|¨!î ¾©êi«>´* §:ŠVÇ‚˜m˜jDzKŒSÀß|‚ï£Ðû8“£ú‡õ8¬÷¬Y죫¦"à*ûQbX>ˆcìf#.ëü¶”³¶'[‰ôL5¦F¯Šv–‡y/Ù‘ $'£³fe–!vœ”UB)qoP]xhŽ3¥œ¬Óã©àÄ®¹À€2lYÂôï¿hSTÄE7ß„²ˆ»7%„[BXæ6*WégÞ‰çÄØ¤sÖßñ¬œ£¢Ó¥W™«®X¡ãW=Ô½lŽø|¾Q8¥¾b™±‘!"aEf˜,¼%Iؘ=J†b÷¶%®ð´&8ÛÈY­Û׌á7^càpÆš³ìÙ¾ÛÖd +È`( «–~)ÈXJ« …ÖkËÖÒt‚8ö"+‰ÔP¸ˆÉÒªl¬·¥½1]Äß(ˆ½] z_® )¸º(…Aj"±ßáû½ÝR]“Øß6Š ™°!ØHâiM °òV"SΟ ,¬Èïp¶eÊαúsÜêùªŽ9Ǭ$Æa¸ïÄÔûÊ tqÂGœÒ‚¾Ûøÿ G«LhWÕ°6acÍI:æÚTʰt Ñ“ÝY¿¢¶“Sµˆu‹±k1at%*wÙ¨}å«’$e+ŸUЙÀÕÙ„UsF¾¾zDÕŒzÄ+eM«´|Å9KLñx{§H3úÁYgí¸`$üYKÃØŽq’4œÒ^l§Ènš›» ÎA'O½ '¹…+EW'¹¯@!mAßz–ËsæÊœ íbYð®Û\f•Uɺ:Hxd½Ÿ³¢ÍY·þ†銲/Né;GÆE‹ eÏÂΈ½‹ý2™lNø4õ÷ÙÊ­,eç´†ŽÿðíÂõºGYpNH°áÄì=r¥©Ôž³aqQôl™ãjheWÏE·†%–—8g£0&!œ‚Ù´ù“hi>Öz §·ée‘êqÎzªè™Pf-¬î®Y8Z‘þ}Üxn¨ÝÑÃVU%àaEf_LJG¯š¿be‚Vè #:í[Ëí¨keeV¶ÉD‰ž"Nyï1mÉ)BëÖë…°zÝopУ¾‡¿iáoè¹àoÜäº] YÎo\%}ÌðêÏÂöòTa¬1n6W£ö¦qüðõ¦,ú£“ –­âqL%ëÏ'†„ˆË¤îÝPv»}«ÂŒœ.©ñ7?ÀoäNïÄ/Q• y S#‚ ÿòìçõì£Ñ…,—·¹ìbJ5ðÏáOÅV€½­_IÍ_Bb`̉ÑÂ\ÈN? œóxH6„*;ƒÕ4Ôèž%ÊämL³¬l0ÄI¤v¡TB²ð78Áü&á#78å±áÉèïFùvüÄdYl ¢¥1¥B†¹°‹xî€UðÌŠ†ß'‡ VmAm6¶²¢LáÜ(Ÿ7Ø!9^Jrelɰ¬¬•Øé£D*Y| N¤’H1²« Q®/Wtƒ],fü¦8€Å\Àˆ&BÖ覶ß\t“¿3‹Å3 óùb‹Q¦µ²KNàX ¹hËáîÿø/pÂüĶç+‰{ðg÷Bíª4£è=g¡ögø›«DxK‰ð%ÜW!½d¡vz«YU޾Ÿ©Ï:ÙþæøSeϯɵñþ°½ìOqíÎçØà"ð.e<ãHÝ\R&rÆÙcdŸàª[ÖéO¹ÎòÈ{^ÿþ—ízîìŬVB 8;ó1IŒmå²—L±Îv1k/r>gâ5d_}…ŸÏ»yÁ9¨ƒãßVÜl)zÆŠC¦çþtÖ°âdÿÇ…ÌdÉÝCc53WºYÁì”«È§ЗŠ@%|7ŒUŽŸ.6 ‰I5=ÿ)ç`rÖay¢fZä2ñl‘½Äé­,GË8|(q~ÓãÄî}vêáçÆWº0Ë€å=ðjÏ‹vòÒ¯z@Ôñǹ³nÈuçljÝd®£9ƒ²n!ãd;8g–‰žm¿eBpÂSÜ97ÂÎàÆÈ&:µím·Î,Ðx¥ïYÄUæx6ƒ+`¹KbEŽ#{¶®‚JÔ(œ¸Ô™³?9Û.q\]gÜY {©«Åw}»ÄÎ=¾Çç-ð>¬3ŠcpÍgØáZ›Øi‚­7Gk—Î7[GõRhä ¹ß´„U\‰V¹“ó–íFk—u“sЧâ rØb}>ÜnàÞvc)GºÎò}“PT¡sœ0è$Ö¨²à²ß/cÐbã=ÓxW"ÚÅ2†¥ïcžÄ*"ǾÓ50Q*~¸$bü >Ž £Ã‡q„U6›ÆðöøN¥9ž•²6n0°fÍd›íð9C²3ó3K/–*1àÄœ- nã­= ø}8:— \Ù£ãÑÁ1hâM±<¥T%ÐaìXßåÏýßôø7cÆ‘s&lÆ««8sÁƒâ—)oÉ2êpr€iÛ-ÂÄ9ZöøALìqŠXmðûpöÛ2ŽÌL¤ ñíYeÑ ²S϶ŽÏg:ó¿FßQÕGó?(‹ÎÁG† ö×–Õ.¯ÇÙ‚Ì:Ñô²¿ç·¿“]ö÷²¿—ýõí¯ï¶åÜ ÀXÂåL5 3ÎQk/é'àòA§ñA£¢]>(EÛË™!œÍÆr€¿¹|÷å»Gßݼ¬Òî»sÍ/ßâéY|÷¨h—ï¾|÷å»/ß½ÙwWE½¨h¹îéË5OM\óŒ !°:16¤\¾nÑ×M‚yùº¤ÍΤ¶/gÍ3áv;¯Mæ?~NsÙùâ ì¼>Ïaî—¿ìü³Ûùj¼QñÕ&Á‡³øx†•æòu)=‹¯«Îsï™}ÝË™®\ù»+FàUö¿š¼î*Ï 5¹¯\<>»‰/‚µØ¤À7}5Ï9¦…ÃíÓ\|yxÌÓœç.æSÇ<™ ÔSûî}E¶±-Ù—\ò«•Í,s §ÈˆaÎlZe­E".Å»{EÑáœ×q<²:¸IžÓÁáxQÖÈ &~ÓÄT L›èpOí| Zž“³$pæÿN\˜” €áÜ8©ˆƒó¸ceÊÌ A%ü=G˜B–  &ÆZ–‚çŒyNl8X7A30Hpjc^ÃQ0<å%ÜÙ*4ñÄ®´âhèÕr˜y§7£È&ì≅™sâêsNä®ÝùâS¢%ÙÙùj:]”]£`-ab!c» ÜtËþÞ¿F.^â¾x%l욆ñ|w üM‚êýf¸|͵JŽ!±[Yúoª²»z8fýëÊ’ßà7…T;/»¡ƒiÃèôÖ?r™râ¢=(p¥a‘ßè·¾¸kÊîKg@¦ê1zÍ!Ï£ÚÒÉ­§›)¦—©êòÉ—©´á…˜žU‘…ÍX¦* nã•Úóå#…EÃ7Å‹Qü&ÇULο•ãRÆY@¼ÎŒÿ/DÄßp.1elÉ=s1C¢Ü囹W¸Æ]vÛ8çdÿ3—3*è„ëâqYã›lj9.Ù&æuØâu>áNfʉqDŒC<ƒ}OI𥙇D‰q\ ³b|†ãàYý гpA6{ˆn!N¹’%†$’-œÀ¾·…ëʰ`œvÙM"|¬ ¬“nbžœÁ¯¶ñ¢‹‘}5ÊÐ7«2ÄcRÔ8Óù¸u¦‹6”Má¤D2­-s’xœLŸ±ì"6"~™! 1;<#–ðîœ7eÐÆQÏg2.H嬓,®ï|sUQóŒ'Œ™v'àI žêï?QhŒ¦N%Ç]Õ.¤õP±òj ¤Ä”Ošqꂱë&±UíJC\iˆ,ÖÅ¥!tU‡Bù¬iÆ,“3/L,áʯo.bðº ga“.âX3+á’¹*k3•Ÿ°pü>‹óÜ>Іż۞Sÿ²¢†‡ëörf73Äfõ[p’˪LÂSflò§%8ÁyE…Ä„S<Œg¥#œà$–N•“0™©=&I”·'oNj€% p^DN³¨³gª¡¥³k¹èZ.z`¹H®rm’œg[/R…-è+ˆ®ƒ_Ë:ײÎY£ÖkYGðŸ¥T[S-³÷]RÃ,zÄèZ•â…¦Ò”qUÈ”Ã.ÁW[¿Iȸ;éZá¹VxòX çvŒvqâYé“fØ%Üè•>g҉É#œNL‘0²Q ̭غ¦?#Nâoàãœ1›ÂÒ,;§e€5Èêž :ýyœžÝ”Ý.Î{ÓöIFrŒ“èºRÑßN*úÚ_p%Œy ãºn¨u}²|qSúyÓÅ»–œôÝ®Dô•ˆ¾Ñ«ßôÚ_pT&YÙšÚ°+• ’2N„iàIê8ÌJ”îìîäTYÏfxTYBÌ1ìx~ÀYœ˜dH?ÖÍ“±¢ÀœSŽÅ»Yê-SQ5ç<»D $‘ðÂ/(œyÊê~N1%'>e¥öWVZå¨ó"Xǽ=¾We17“eÖªáðÂW[…Åë™%¾“$»qõѵœ’Î:pbµ÷Ð;Ä kÈ{/·Ï.qð/ŽB>:WV7±d7Ûˆ€ŽÄ™Ç‰7Ær1ëþ›Û„¸bÅZ#“ؘŠW8©ã=R¥».Â6Äl ß’«êƒcúV,á9ÁlS£š ‘äh}¯ùDsÅ›3VXÛÑ8úϰ&œÍz™ó¶GªÑù—_{™¶¹}Cì/\¦Å‹±ƒ£š±ç ¦¶„pb~ûïýë­óäØ?/ýÁÄ5ѳõnê^…ñ^šÖ˜lôTGd£ËJxkä"TÍ–® ÄÓTÌØÏh½ä‘b´ýäÞt^}Z-j†ÊZŒXå^}ö‚Nïq…6l‘×P¸7ø§æjիדØrîþ\Œ7•;ޏ|Ì*ÐÞ}»ÿ¢ŒÆþ2‹fZbœf;êB8å 8ñÆ%/^̽h¡~~ÿùíÿäTC endstream endobj 6988 0 obj 7907 endobj 6992 0 obj [421 /XYZ 37.5000000 587.750000 0] endobj 6993 0 obj [421 /XYZ 38.2500000 383.750000 0] endobj 6994 0 obj [421 /XYZ 38.2500000 353.750000 0] endobj 6995 0 obj [421 /XYZ 37.5000000 587.750000 0] endobj 6996 0 obj [421 /XYZ 38.2500000 383.750000 0] endobj 6997 0 obj [421 /XYZ 38.2500000 353.750000 0] endobj 6991 0 obj << /Type /Page /Parent 2 0 R /Contents 6998 0 R /Resources 7000 0 R /Annots 7001 0 R /MediaBox [0 0 595 842] >> endobj 7000 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 7001 0 obj [ ] endobj 6998 0 obj << /Length 6999 0 R /Filter /FlateDecode >> stream xœí]Y¯ÜH~ï_ÑÏHÓ©Í›„’›‰¤h"ñ€x@3 hÄŒóÀß§ûÚî¥ì¯l}ª¼\AÂõµk;u–ïlïþøýßÿüíøîåûÿhþ~ùþ NE¦êÿ/¾»ÿ)OÍ¿E™øåðíøíðåðåü¿ßõ ß¿üùü¯ÿÍñOçÿþ|üëßÎ?ü±ù¥Ë/ür(tqþû߯W…>ÿK]ÿ¾üü_‡¿üîøëå‹ípÍdÿÿwN•E¥/ÓúÛ¡]¦~ýóÛ¿ÞÕ0m”RYiŽÚYwÔ•3ÇÿþãðÓy€öóêT9­‹Üê™ s©,MuÔ¦:ïµ²^ÿÈ|^˼ʬŽöñzæâ»¢m®{¿þeÊWðT‚4ú-ð⇯‡wŸµÓçÍÌ_:OîuÌú¯¯¿Üùÿ\³*Ž_<þ^)ýñǯ?ªSn²vŠõ÷Ÿ”è‰OtŸ8ôDÁØ~ ¾ƒ¿¦á×^)\ù0}ká; >ö©ë¢ð×ö‚Öfê'ZŸ2—?„ªWmÛcµáû}«†3 ¾†‰ŽÓÈ—¾wàJõ‡ñ—¢H@µ¦{²j›}홪®ïov²¦Ô‹€{¤MlªµºÃ¬>µajz©©øZ̵Yç¯mˆ‚㪭Öù„Ôðð>f¦ JE5VA ±‹¿†U‚€ÇO ÚŸx\GŠÈ’UW¾ûR<ð®%ä;˜„øÀã”þñG>!ޏ§Æ; ™´³ó“¥ÌiL ¿$úe\y\¨ñò8 u_¤îÝNäþ ÅgLEVõ3¦˜cæÖs×`פÁ–¹–¸1+Óm+寺Ñmãjy3(Ï«Uã1Œ3£‰X5 à™CêßfœA»ËgGTéüF\>-P± ¶Ê\ÛE³Èýª/`=¹a–¿5çI¡²ÇÚ'­óä¶5ÛsžÜ­mwžlÂô4ݓݜóäŽY 9ObΦ йÛé†uf'UÙ*¡èT–ê!ø¸wø>0_ÃH+ |‹gÃzw_ÃY—¯ám!ýyÖaiXx@<_Ae¨‹ô3(>ü®Ü[׎¢:7|½z zW©òñÖÂf ÿÒuVMÈå@Ð c~JqÜ¥¯ŠnÇ8¬ºŠ-fÅäü5¢£Rab¯÷_Ûö†øW§ï²hB-g”’”²Ây£.tN—‚@*ƒÄ0Tˆ³ð×– ÿî‰T;ÔáÖ/Å«Ö÷5¼ìBœŽ“,o ó·Ï¯Jæ¢(òGÛ]WÅuk¶£…^]·µ½5#|ë.ŠT»6ƒøê¢Aµ P=g$¬unƒÝ„ý`Àx pO°2Ï|§㣮^˜î7s¶þžã# ˜Þ„Ï/}0!JèbZ=žÜÞœK Ëg”hyΦ”¸N©uK„ØÁ:?¶npP]ªøff=8‘#1Ð2àGÐV Ødp*L‘À’Yk¥+'3íòKÜÎ dæDUm+oÓ NTeÐI|'ÊßNÒ©q™·ï»Ô5ƒDÚiÀÚÁ_ëà:¢®œ™ÐJùDI€ Ôªg‡7¨<ÝÎcÓÓ­„ÒP€¡0zǯx¼B$h,Q„`*KäDÆãP7@Ô%÷­kãL† ÃÛX j‘e4aLwøk–Ác>Î3—˜ÑJ•„dau ;aDzþ"îT€=¦Ä;Ê6¿|sxŽ"!¼Ó >Ê×½ÓL!&üNÀ×=Ò]¥¯¹µ<Ú„Gsc  5Pv`©2ß}¸¡•.·Ûd ÜH8yàGý7Lf’»¿᣻{MUú7™(ç·#¤Ã¥üº,"¤8 ‘:š+Cór<&ä”ûd¼ã £HŸÓì0 ±‘€í8 ‡jà ©ÖŸï1m²ÌñL |FGÛ&B¡üó¥ άÃ%©BDÔG&éI6!K Àꢩ{²H«HRPbräÕ´²ºãÏLeÙèˆxÌ™¢µé°ºtÐd©Ì5ïe‡&)h’"R\øe:w 3ø$ÐYªÜ>nTŸlÚÑ˽ÜÑËí¢—Ïa#+Àc†)Õéš÷Œtvô2UMŠÆåÊÔn`Na…g>û¿*›×·Í å¸–R^VÞ56CFGÔbßþl¨H,"k'€¦í.‘¹DbB»]óbÓΖJk½+s¶T¶ÍrvgKB£dw‰ì.‘Ý%2M[«+¶²íšò»»=€ÛÃUÞNÉy=JX>éuȋåò3¤Ò!ì«uÓÞÁº.~‡H:T°ŠEÃÜû¸ÜÆé’ŸÌkòï8ëÓhÇŒ“â27.2·ô²9‘‹È/ÄnbÖT y蜱0ûrþÚƒ¥Q׫]/ '¯žÒwá“.Ì4#4H*ƒdù+‚%²B(§£3J­(BNU#Â3ðO½s)SÆëõ¨íaˆ h»’¨| $L¤Ã’[ööÛ pß,Þƒd´¸Fœ½‡l!±«fŠt]ŸDg¥·óQ.VLc´*|Ú‘`«Y \ºJej •‡l]+ûž¶Äè94¬³þ°žÀ­–€$f [î|æ‘P뱪xu™’XTë ”Âsà ·ÀŒëÔ‡D[þ%Ó‡.Œ zÜ)£k|ᔀˆ‘¨ä!SÏD¤ñÞ:kà§Mv!„¬ûÖBÍÜ´@{ÜqÊ5gb5e=å㋲Qü…ñw8ªhIõ@ê'°4”úŒÑs2â ËêR£÷+ˆ-@©*o&¶† Ñl4ø¾x)Ù>‰Ø˜íbXéøÈÙÈi8DôŠ›Þ™¾ÝÁìKjA [zST·šŸ±1u‡ô’â:EÙN=UƒQŒ&[ÞC †ÖqXD h„Àpà ÓH207Ì1˜‡Óîq2}„…š¦u쎒þúj`h'ÂG×wu£±ß­ Fª]äc( o‰Ñ☽l6ú€‘ÇŒŽUƳSM™÷_¹%À¥ŒbH¼³ÃqÏíùš=GÍ@³,'Ö5#Öñe-¨F‹¢9ë ™@:f¿jÖ%™qS Ï|mPÂ:zÛ ëŒõJ–‚+ÒXß–Í7½Ú²(kìÞNL‰ºÌu™I«LcÚ¢âqÖK¨òˆ+âö}ø0ˆ†ë2bm¨&áÊÎ'0k¢ÊãüëI»hE¼æ}‹\EJ•žha˜ÀüŽ¡•^õUæÎ \Ë÷&sö•ùã4—“†7rM›ÂßÜiµz‹€5. ¶€pe1£úKçïÇ‚Ë3®:ì-r ù²MØO„db42f–±£‰tmÍnmVykKGÎï«òñlæ÷5s@x0þùn½Ñc+œõe Uq´æ‡}ÅURÄV¸\y‹ØNlE¦:¼‘©~JTº’»E×éX`Ô ’Ð¥ã²ò¢{yRdˆÚ·TV/' ç‹ú%ëÚɪ(¬Y§ŸÆV—Wë{ÞÆÁu¤rþõߎ:RU¾ªE¥&ò£SaGã£NbwœnÀiUùl}Õ,-2þ¦óñœ,N!Wa’‚Q>P‘2, 3æqÔebé²åbpXáÈ—-Ÿ··D ·à°<ìmÙ˜/Š Î`ʼ3~ÙÝûºïkäP‚ÆÅ¶q(šŽ™ 4SüætúfYù¸Q=X3®Þˆ‘o½2qšÉÒld^ãvty³]jltsÜKoŒOc‰5³˜©ˆ…òïOJ­¾Úl&ü“ÐWp«õ]wíè®»ïÊ­läÖÛ¨]ÙPãÞÙ•±ÊÆÆ‹’ÊÆÝý‘ì\íß^Wè‰ÅsÖ|M¶ÅÉAŸ¬6A[¸87ŸvãOy;úîhg 1%fÖ½ÆO0ÚÄÌ ž)¦7ÙóiØdÏ; é;bGñ \†Þiž$@µÊÖÉ<˜ød½G¬Ì16"Së›ÔDªl]4*qO¶¯RàqP«¾eܘáhXKö(‰2D«‡ÀQŠØ3wOŽ~]ž2OK«i–œ,—­®­fAæJOVX,Ã÷4B™ÔØCA9Æ:¥$•p¡èa°ÜΘÃ-+:A¯¢öóÞFj’ZÅK¤Ø©¶Öãæ–×Ãáp8„ΉÕõ‚ˆ[i¼Ä—UÓŸänLÙfÀ„ï% -0N YnÑaFx`|EeµG Ç-{" €µ¦º fSLI Y¥¾¹=ˆHƒ•d'åCT¸¾ak™öQ,™'Ê0îø Ž!@¢¼Ž\éš<­Tåàþ$»'qc˜"G'(¥àœwf t6=Žaã…¥KÜï%÷{˜`ÌÉj-±[§Ðïmîߪ%'™èåw\ÓÌó¶ŒÑ† Ü™¡÷œ>IîaQ‡0”y›Âmqýv B´jÀ!LPI²ŠÞr¥«ϤRž$šLƒwÄá½ÂL3œ7‡Ça¹`ºÄOˆ¹iÜŠîŽÆëÁÕ0ˆÝ Ü3æk˜ãS`šæ¬2¿?¡x sKˆœØ@þ1¦DB‡Ï‡ÉùÇ|¡f¯Å’úFpo}ÝÆü WAÀ5‰s Hn¼‹D û@ ܪsâ7Ã7쇄tiËÁùø Ô7˜u¤#ÑJŒ’X¦3º&£¹bŽy³ù0]ΟqC±z#öªÊžØ+|O ·0ü…ªWµ`Ý—Ñò)«…A‰˜ú§Œu”HÒeøä õ¸/Öe­‡ÑO×y•^ñ“t\µ:/j·GÐ £…bZ`mØž•éTw ¢¬dQÃÈ) ‘Ãt€õàµÚ¨Õ™Q?ÁQ–\’ªÑÎøjv»ö-Ùµ¢´³»¶R™¦KFnœ”±ÈÚ.öï`ûé´ÂT¨%ö •Æ/»ØÂO˜zIJw“š5qúž*u«;ÊÜôÙm‹=2D­p\#: 75ÖiÿDÁi3ÀÒsÂî Xý̾Á!æ¦S: ±×²qE©pæž.Ķ©âð4YÜÚὂ'ìg¥·Iƒfêø;ÑÝî)ÆÌ`ÉœÙÑ·òzŒ6•.f»Òæ™Hž%óŠ(iÉRv†,ŠÍ ‘LdªlŒ·wÆY„„×®˜ãÞ—Ù -®3/  S2~lÃý›³Æ8“lô¿¨¿iÉ~PáØûùã žp¦Á_ÃOdqÚ!ŠO‰jýᲜx~ŸsÀRÁþ3c ÈbÂy$C±DihÌÈÌÜXI€W0á¤LnèžÉ’Ô›`ò§¼ ‰hŒ‰\2UPTN` ˈx3åuÔ„žÕׂ¢zÆU˜žºÂ™«LN¸l”Ûšµ¡4ti¯x‡lÄè×M¯'¥D³YþÌ.2‘Û—õ°à¹68£a^±N9@@cT<Ғަ♠ùó¥d#;#ÎÒœIõTÖ„Z´ÎP >0Ñ}”õÎ-ýv;ýTä8C}óËJ"ßÉa‰8;]b­ £Ò˜b…30‰ªRïÞQÆŠÂ÷™ùÚì"˹RJºKñÁÄüI6:å^eÏ y)‘WñîIMsy÷I³ æ”wzÖ3ÀN{Æix8.Ðß7·ÏÍJQguÜïÉݦ¤àdÛ¶‰6W´ïó|âÐ24þ|§ƒõ¤¥ßÕße îòïóŒÛƒ†{Ç€Áõü! Øv¿ëŸß?ÑþAã.Kð0 àC ŒS>…²§æò>œÞïOO66ÄÂŽ_ÿ,KÇÎ endstream endobj 6999 0 obj 5215 endobj 7003 0 obj [422 /XYZ 38.2500000 671.750000 0] endobj 7004 0 obj [422 /XYZ 38.2500000 671.750000 0] endobj 7002 0 obj << /Type /Page /Parent 2 0 R /Contents 7005 0 R /Resources 7007 0 R /Annots 7008 0 R /MediaBox [0 0 595 842] >> endobj 7007 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1701 1701 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 7008 0 obj [ ] endobj 7005 0 obj << /Length 7006 0 R /Filter /FlateDecode >> stream xœí]M㸽ûWø`=⇾€ @fz&@3@‹‚Ýl‚Ev‘Éò÷#Û’ÛMùQâs‘’lî`§{ZmЬ*V‹U¯ÞýéËß÷ÿümÿî×ÿìè¿~ø²+uYœÿÛÿ|wýÝúï÷uSîøe÷mÿm÷y÷¹ûûÛîü/þÒ}÷¿½Þÿ¹ûÿçý÷ë~øcÿKÇ_øeW«ºûúïÓ×¶VÝwÅåëñçÿÚýõwû_#¯ë'óößßÙ¢­+}œÆÄ«¿í†eªÓŸß~øu÷îL€°·4ª-µÝ+kº¿Z«÷ÿýÇî§îÃðÅ¡µJÕ•­‹{^TëîMM£Û½ÒmGëÂŒ^tú#3¼’¼-Š6øyæâTQ¦RþÑ5ÊÔº´GF™\v¿Ý}_›þ¿;‰Ö˜žhuž\†0x]Fü4sqªô ÷Œ.¸›Ûn¨3Ê:….£Ç ÛÖ?Î\š(káàq·². ;(Weʼnv=|„ÁU÷hƒŸf.N•3¿}£Ëme]è£õÇÜ×á# nl´½ÜÏ<sñè’̵uTæ¾að²‰ÈÜÓÌ£1.Éܪ­zy—úzøƒ7º‰7øiæâT˜‹G—dnÛýøD må]¬«á#п“ûˆ’sš¹8UæâÑ™«´êU›)ªô¿ ƒ¹¥ŽçPg.N•ž¹ãÑ?‡Œ‚§rþ Ø|ó|ðý×Ý»O“Wí¿þÔÍìôÂ󗯿ìl÷ã®2û¯?îßͧýÃþëÏ;UŠÖãXÇß;=Ñç'Í¡i‹J_?)4|RÃ'NOìÁšs´ìõ‰EO<3(OOÌ¡´UófÖEsþÌŒ+u^º9ݨnü×ÏTèÅÊÂ'|ÒÀÉbBbrI,½0î¯âC*)Ά˜æÖÀÊŠÁ'}~¢Ô°Ô×Ï|<=)‚^­ÓÒÚ¢º½Àõ`4pïÁÝâQ!#¡…¬ôl(è”îŸïñ~ÞžûôÐ&@òñkgiãɲԎ•Ä‚ìá Tu%ÈHÍ|*ÛR¤SV€zuy"^u|z=ŸöpZÑ®WèIÙ¢'ú=zRÀÏ03èuä­¹Õ艅ïÁ3(þˆž˜fbiøhÊÄ«+ }{ 6( Ï@ÃÏà÷|”¤Nçf ,–Kø‹w\æÞMx¾ï@ÏhXv ˜b“ë!äMc9H´žR…¯ïÓåùãYÞYð3x¥žŒåÚ&´¥¢±®ÁÚNc ‰m佯¶ËK ­š†µYË¥ùÅš¤ác«WÃG)¿>òV4 k¥VÃG­m">FñÒðÑÄ9'0|´Š+à#ï5E õ·&ÇŒÞ7 ‹.’ö„Ïëy!y"ÑÄ}õŽíãðãh%ŽŸÃÀ3!z‚‹D—ºœÃÁ]‚ÖF¹ÂÄ\Q`1#.Id"Ñ Íñ{ð Èh²ÄEŽz géÅMª«òíh²zȾô„¬jå¨|o…×3Úƒ¯à]pÌ[£+YÄö2ÚžÚ÷£»Jü«ø²üýüA}Ƹ*ÄõøX@‹Ähn…¯ïp>ÎId{žRûh~šˆçÅRŒwã¡`Yõw(’q߉ Ê›!ÒÆf“ð?ú#ž*S~—Ú QÁÑ£*TéZG¸!GÄôl.ÂñsD2&yŽ™ÞBPÇT"vl’ƈ~T>MªÜ%‘ÊÇpñ¶% :¶¶êã]M1\êmj·3ÉZk¸xØn1¾šôÚˆ¢®µudÇ<‚ÅñÎ=ÈäøH6q~C&›ôËhRbûP•YÆÌm…•,ë3Ϙ ýšJ7f½ªºr¬WÀ_@ô’ Ô¥:Çàœy,O‹;uO\NÓ‡†¶E³WíM§®ßör~ùt¦vq8_lpëIÝë=º kÂ?Ó゚ÁOú$³[£5ƒòùtï/råÔsöâ­Ñà“Óí\ÏÙTsÒºcîÖ 4k Ÿx¨£áÜγ®f¤+ð{^à“³…QÕ ã3è†Wê¡[KHAk†¢ø3½Kpk¥˜?p¥ýh ‚Í9ÙWZÜPÑXÝüdtº®z¥ZÜSÈ;úU¦mÍÖ]ö*7‘u÷Ä>ÍöÂFC%1áˆq$}¸+VwûPÁ’ùA]ÏU8¼;™2{âR4àp'ìŒh7Fbˆek©3jÌ|]: a7ŸÙ÷xç`ŽHÔŸË jlòNŠÂ#Huõƒ¾xç`¹c¬$Äft‘h´Š’7Â67‡È–yF“µ eƒ°LÍþ¨yA3å|QÊ ;>‹fòôy®Wv“Ù9Xú1câ©<£·¿¼)–`oXÂ% äæRžÏšo0E%.$”{ü€[[ %®K[ )§h1ÕÎ{1 ¦m>‡ 2> *ƒ¸W¦R9D}]*y|$`L%Á§¢ç©¿Ö­q¤¯„ žÒl ý^ÂôþæÕþyMÔÚ2‰N"·4TC$W‰¡ùŠ“Ø¶–ŸSÖÊÙ»OìÖcÐÊÝ­îb2R¼ë»nt™Ý=&É{|!DØ**†o¼ðYkBPp´œ*´]¾Q6Â>ªõÄ ÃÆ$®{KIs3¶àÝžêˆø †‡I{çªÞHFë2/Ž›%|lM÷ì ìƺ{PZ„ËÛ6ˆ• Z©/§p×äxŽËL÷†¸¡ae‚ÇTr¡ÀC|ðøV·û»’Q_-UK‘V8=q¹Äò10€˜å"ùqSRd½?&±¼ RÉ«ŒóÊDv˜9D»Êk .Ï?scúQǪøå¥šrº˜%Qfþ‹CðuFùç ;ô´õPçéÅBtÛQy#ã 6ÜãÁÓ¥å%|Öx4ϵà'8|Éȼ†è£1 ·=½r˜.:MÏÀþî5TØ ˆîC…3ðÐàÓÕD¸3|g4FâñLkÜ­rÎÓg ÓË(çòæv0~BÉ(´2©ä ÕÆtóx„ÕÄ{Ž¢(îÒÆö\OÑB}Ü ÓÞ¨(dëÓÆõ¢ß”z޲¢ nø=¤e3sŠ`e“¸Eó@(ˆ7¦(u}—m"ƒD*"ÍU]AšîÔh1-Smæ›&Œ÷E¥{ö#ÓZ‹Ì#>Dî+e!˜›YѺ•ǬÜ|-GÜ[ áž £0&ƒKdIxr×ÅÊ—¦©*½T‚æ0¦÷=¢aLO‹_Ø8ÔNÀà‰¶Ú“‡ù$r©^+ëppŽhs_`Za)Ç‹› ã€”$!®ÿüÎæ±qe{¢½c¨–*‰ )%:Ä_Ùí}cG·éêö o-f„2¬,þø_ëG©´Eë#É¥z«ŒkaðÍltœßcßtg6XH“G»\Áä ߘ”,ÝݵÁ´¶™Oýð´¨Yo£mÅ ó1§~ê"–Adòu±N–èÆé™ÒüænLcƒd½Q·ÄÍé Å{ ׆2Ñ0áž·‰ FåšèM¥KóÖ"ÝJ<`ôíè'ZZMAçÜÇnõ±üy|›}¶nKT¸ŸªMz3ª/úik­^LS;+`ú|QÞUdÄ_†´IaÎx< l¢‰#uñ€ 1ß8òi/L÷»å=ý”˜Åe‘1‹GÊ,c‡>ɘÅ+ÀªÍ˜ÅYRj—ŒYƒÝñƒ£y(й€·*|ųƎ~’Ôº¬pð$äý=S¥.PÚxoAyŒ6ÑØ¤aƒ‚qÑP v=åÜg Ù]9‰\Êo5Äso$Ñ!™‰¶RèÇ£›?ý$îuz¡¼uëµâ´*w“¹Íýf¾Ž[{J4ýd–ÁÜtP¥9ñoqjײ0¢-’½D5«]>¯I"ÑžR'ø_Éo*c,gq 2S²®"ccQ¡˜"žã È&²5AiÆÖx²q(‘–U#Å5Aî¨}@ùãæ×-yt½l‚3SAÍ4*é¬#Ú(ÄãˆÀk.ðšòKbB]X娯T§1‘Þ^xæ<ÃTð`G^Ö ixx…¨š8€D„b([4…œñw’í[ѪÈÕÙkQŸ:)ˆt‚ïòUÇ~ǶyÒWq¶CÛ«Âhg¢øŽ&ô˜ˆ^–„ºgš—aAƧiæBŽ1<ÂtU`ö|Ÿ"r™õƒ\”Œ‚ÿ½P<Ùm\¯ z gˆ»ÕŽþ ŠG„åáúS'Rl¨G:Ø]gbZ‹MC›WU®lW½ÎË|…ùøàê‹—Ñꩾ`B§°±©c²V|, 0Ð}ŽùfX r}$æ¶Õ£DÓU„¡fDBaÞ2¦=Q…–Åã¸F4¨U<øjP—Ï,ÉÁ¨£ÜMÚØZq “%2zmßçJÊ14¥‹M‹›Äj Ž÷kS•îJˆëUFƒ2—Â| Ñ‹!rvHï°;p[ï3Ë´8h f%™ã¯=£†Z[ín;& •¸£öÄò±a[âš ~E¾3ÐÅÈÀðåû1Y›‘ cF,•Ï’¼ªÖ—šÍ ^•Á«¼ïÉàUë-ÊàUYRj— ^5i]m3IÅ ^•Á«äwúÃÁ3eðª ^5hÕªžæ–蓌gã³F8 Òƒø=Ĺ€Ù阢˜ ¹k?ƒGÃ{³OfJ³›{@9Wwµ(Àœ0l>öcH3ìJÃ-¤ e¡p¸Ïn!äa7«R¼RHQ€V=D?y@>YnS4ÀO ijÆïÁ<5x=ÄJ-ævjá{°f¸­±‹@ŒVÂÑ<Ü&«žR…U@66Å¥Ì>UeS9"z+Ý™IÚÀéN¢õÓ²ù\ã¢èDËH–ë¸Ír¿T“D S_"œìpΔ@;L‰C8U3QGÇdE«L“°A4‘erÃS«cÖökãZÇŒѲ·˜,'&=-U—lQ<®[.œZpát\5„[ö¨,ÖásìB³„©ã­ZkçÔñœ:îON_wÊpNÏrR»äÔñIëZêiSÇsê¸øN¸äèœ:žSÇ­Z«;´jN/r긗Û9u|r¶qöÙ Åa£1Þ.qËâÉÇÆ3ÀÑ,cL {<8›Ë2Ü›ï[G|º"ì™ÇÒ=N“å¶°‹OqXÞðžÃùØÄ)ƒª €ëÁ3ðèu&:£¢Œ=ÄŸ!èÆø«°zª[TL«—¤`êzž¿xÁ>êà'‚%˜ÀƒèfrݲO<|Ä*™S|´ub>zeLQ¸ÆJzL¢øÈãva‰• =LKEU¥– YH³céót±Ë€Ý@|%‰×ƒÝ3Q¹ô\g‹–¨2— ²ÚÓ-UÙ$¦Ö۔хK §5dSNïŒÅŸ,ï3y¤O¶tZTƲ¶{@m'*ok×OcŸXרtèJéK:_¢t¥êáÀ+ÜZ^¶“òòïÉ5ÝT­ð=…?‹µ‘aš«xR™z–-TCäúáÂÞ\€àÎ jùÚ±€Éª¼˜2"¢É …úð¼½ÉVØðÎS‡Žåéì+ÑÌœ)nH:߬yXÊìÛ€¶*¢0$kìi¹íÙâû÷±•®˜»¨’¼Wç½ýEÓhWÝ¢¯ë«øl:þ¸„z°Fh£À(líÌDpy=v-ð{0bŠÈa{Hq;¾¯$$Q`c“'Ù>( xØÖÓ‚°<&•hS`ˆªcaüRy«]¶b7 ;«Øag?°ž›H»ÉÅõˆ'nH WFá.вE¶Óôb4!LÅIrúid˜Š Sá}O†©X7£2dåÑÓ˜ÄR±MÍMÞ#1rIÝ8ç |'䉉jL·T¾¯ç^ >Ù¦Œ®ÝµÅ=àéËkÈT>ÓòùYÛem'/o«×O:5 ùÒ’Æ8 Ç!x %â6–ìÈD@üxBäxn˜øÒ Ï€Q0¢p= ôHƒßƒ![°Ù"e¹- …w#ž>Ü@Z š”HSàx޲ ¼&¾€&F+±«ˆyJ˜áu@0Y;M‘åŸxô-æaY`.a(:œBÀ…2³ÆÁ$ÂC·É®=OVpkËv5;p¤Z÷gÿ­[º—2Ÿ§~aFÉ[s‹lF™Cçbt3Üë °ÜYþnÕÝœ5s}£öèlõA«Óƒ«'gîWã'=Ä›>ôpkWRvžÁ­j¡ô3U{tknŸú•Žßú:9Œî`]E‹kÞ«ñûS#SÃ¥Z7–¡ðhð3½pª ¥×¯bË ÜñûnÆ£!íè3ñ‚DÀ ô>ÿ|ìŠ]1C÷@`ÀLó¼§¹Ÿuaýæ}à LïGŵ›RaûÏ»ÿ¾^P0 endstream endobj 7006 0 obj 6271 endobj 7010 0 obj [423 /XYZ 38.2500000 188.750000 0] endobj 7011 0 obj [423 /XYZ 38.2500000 188.750000 0] endobj 7009 0 obj << /Type /Page /Parent 2 0 R /Contents 7012 0 R /Resources 7014 0 R /Annots 7015 0 R /MediaBox [0 0 595 842] >> endobj 7014 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F1500 1500 0 R /F8 8 0 R >> /XObject << >> >> endobj 7015 0 obj [ ] endobj 7012 0 obj << /Length 7013 0 R /Filter /FlateDecode >> stream xœí]ˮܸµŸ¯¨q€.‹½€ €}lÈ €aît‚Fº§ùý¨ª¤c[Ò¢ÄU›¥âmÜë¾V›ûͽ_ýñãßOÿüíôêùãNŸû?Ÿ?>çº,nÿsºüó÷¡›sÿ狀)OŸyúrúòôáéC÷¿<Ý~ðñùÏÝ¿ýï¤Oêþ÷çÓ_ÿÖýåýtù~yªUÝýùïëŸm­º+^þ¼üý¿žþò»Ó¯—‡éúÅ|ÿÿÿ`UQsYÆÂÔ_ž†mªë?¿}þõéÕ~³4ZÙª:)kìIµVŸþû§Ÿº †á‹sk•ª+[÷LTëËLº#Òmq2E5™èúÌð*Àà¥Öá¿®\œ*ÊTÊ=ºäá–µíw†‹è? ‚þ­*rÎeåâT.y¸mÕô‡Û!è? €þÚØ€jáºrqª ‡‹G<\mÚöF «šô†q¸ªrÎeåâTé×1ºäá6Í Zʆ NrMQ¨€œsY¹8U†ÃŒþÁg¼”Ûß¿ð‹ã‡o>=½z¯º)NÄ|ú©[ÜuÎÛŸ:¢”§.Î`§k>ýxú}Gzû‡Ó§ŸŸÚs¥Ëa‰!¾˜·×/ï>u$ ¾»Nä¤gmÁ”¶¸NY–v˜Ò\§Tê\Úªébúú¥97mq¥Ï×/·ß4_éÿSÕ\¿˜aô5_Šçë{¶æ}ýbÑÝÂàmX±3®/:a–àªûëï)^(¸‰jDמsk Žà+W ûž£Õí`˳éLØÜ—€œ©5&äÇ™Öpo1N» kVŸ¶R¡IªõXÚ)’¾CLáÐx,ö˜a%ôcIoVï E ÍÄ6ðÚšyí1§h¨añ!à­?‡fd3Õ „%ÀGäA:<±Qc62p%˜oƒ(3y ÏÃyÔ[¸ ¸A[÷>Q]•£Uó¼1·¼ŸõŽ‡ã°™‰ ©ÃæTh¤0w9öƒÙÏ#êbõ; kZ+ÛdGj²¬• kõᇥëFkü]?¡ 1ã]R‚‹ƒY.¸­m¬±Â«YŠ­„豨züNþýX;¬ç[J cZLüÂ6agŽ2ó{ø—„¤Êf D¶‹!=•`0Á,iâiQÎ9ŽÇáEã%-eü¢<Ú’ž–Õú±2b~V9¶6]rjCæ¨ÌÔ·Še´˜ãËľsáóÝUQ qã™ü{O¢™/ú5üA_z9ûÍ[øåÿ<~)Z¸¶ŽÆÜ[ˆ®Ÿ‚ãN†) çq|yöß©| ß4À\…ÏÒSTÃýpÕŽS=mÇÚÁðL+¨ý¿P< 5Eæ—ÌÉj|¦†9Sh°> N[îîiÙºêjYGöCAþ·Pj-¤ˆ†_æ$¼êÂÿ´~^¶9„NÃ_íKÖ•XõãpÕá¨#ªo)_÷MD­jË;´*¥‰±~‚ž•ƒ/±Ôb.Ç<†í³ht†­‘Æ‘#£ñ…žÖ þ†eÓ´%°²‘%ó˜.‰Ñož Öå{Èx8Û‚yŒÉA`êÌÿ ʦÃ{ÇÖGW„=sXº‡Ñi²§-ìßâ(ó–9HkKDx§ŸÜ^C¯3Ù œeì!þ A7ÆïLÄê5&«ç°›[=õà/1ϱ.t2稱öÍç¸tŽZE>G‡ÝÃ^á› {»8Fe,HâÙÚ†9û£iv÷íò‰áKêÆ™ˆ3ð#$ª0Ýbù¾Ž{1øeŸ<šº[—íâî¶ÿ²½Ï´}ýFÖvYÛÉó[òú©n’ÑBsÏ-«;sv9g—ÙÓ>Zv9–¦ÈÙe§4¦aÛÚz‘" |Áz!, åñÈæE1/+`Vm‹LøÄ²û)áoð—Ô3‡¤°d$ÿ"A«ndÔvSê±°/ Ar(ÈÀ+ œÇÅXYàU<vPñ<˜n8°ÅöÄÚpÈ+|ÚøjBö°» 3ÌU‡+f±†8‡pŠÌ”Ë{Øå|•Å´ ¥¬kp°c§Äh²ræÐø8LƬXCây0'â,¡7dug]³ì4•±KAS‡lêØeBQw×jñY2[ûÒ£ÌàaÁ6n ùF¡4LÀà È7ø›íAz<:Øñi`d š†õ_¬µ¯ EÖ˲ƒ&2RJXÝb 5–ôÜqãÈŽÉõ°BÕ«êщ8ø™ÀIœbÚ`|š¸À.!‰Ú4c¢z@û@Mã0'Xoaà8 ¢˜0òÍañÊÖ#d9C‡WÕX‡ãOIÄqOô:´Hת]¯'y¤ìí€@¥@šrâ áü.ZÂq$.ŒÀyÚà±^[¬¤ˆYº£×p  +d¹WÈJ)å¢ñ (ßÎY7ëªWèhÂ~$ Ös°Âá u<®:u K&vƒWN×?R¹ÈZ”À2v SÈÊY¬=Ë-LÒ§}´¦ å´‡Û·0¥aõêØÍMÛèXImìF˜íÁŽxŽJÅJÎYég”ÙCÅööš}ŸàC2&CƤΣ©û±ªŒÝÁ±OŸiûú¬í²¶“ç·äõSÀ8dIëΜ]ÎÙeö´–]ÎY‰g—cÚ¶66¨{È"y9d=@V'œ I`¾jÊž"ã;vŠe¯ðQ˜µ9Ú§™ÈVà¦áh½zJ׈֢&­k˜L3¦¾¥•3‡æbòð‹d…ëÌÓÐ5v€ó‹_¢~C,GË?™°³)T ÖÆ‚BÀ³ÅÊdàæ4€t³øBކӅ »`ø{[À;,ƒ²¨êEÊïóK–g—<ËBF“g¬kp¢§±vÀ—ƒ¸°.K­›= ~G„xÔ¦ˆ]6uwÚŠÏê°Ô¦bY‹, ˆA o~™àU%99†Gc ”<†gÐ×&(HŽbŒ;ëOja˜' èÉ> ž9} ó„QX}ÔàÁáá­†ç[ˆn=à/Š'ÅK¤x‰€t¬í-T)ø7{×BAÆHdp?"hB2Çø. ™+•Ù¹hPw“Í2b™rsø] S­˜ÁrfÄÜ!øäÖûŽáE5ƒó1Q0«ºèXb¢äYó‚ ŸQò2JžsžŒ’—6:ZÊ#%/$ÐÑQònÖµ¼§&2£ä¹ÎqŸ5:%/®:u %ÏÖ+N ¯4#Þ=PÕSF¼[”¦æžzÍŒ^çZAF¯+r¡ÛƒËý…½ŽµmÛ÷&aÁÊâž*àíñŠŽˆ`Vê{·GH9䙨{ æ2B\ú‘qYÅ.Ü^{îI+ãeü£Ôy4y¿¯‰‡¹½_²}MAÖ\YsÉó[꺦*b#Kí5å~÷œ%ÍYRÚRnž%Í(l‰gIcÚ)a4#ªeD5ç~Žˆ¨VÙ= ft4×<-íˆáˆèhU•ŽvÈHg—eÍHgIG‹GD:«ê= *æÚÚxö9V5,®luŒ†×FTQ:ÀÈÒÍv(„Y6²)ÛAI6 ®ˆrVâ¼µl%u²Y«Ø/Û.~ ŒöiÌxãØ1ljCVœ Æ.;dS‹“zø7ø"7ûQxÌÚÄe€ÃÉÆXØ-ÀóÔ‰…’šBhmªEîÛþ‹Cžq‹bÂò,‹Mépd L[vn$¼Ñ4°6ëòÈÈ’u}O!YÔ•¶F|Ö Ìæ6¼gRUž‹Ö¬B³7ƒhÎ…¢Þ…²0•…£a”(KÌƒ×Æ@5Nð£ð pƒ½¥ðƒ­ìÍŠsU«ïAµܲ #A YÐR,ÚzŒÍE0¼°zB·j,µ»¬°”CiAêÍT͘R4 ƒÙ‰Yd*Û „0FÄr*ÇçPÚÒÖãã•Ý’¶¡ƒ¯6°tð/f0†) xO€á8J}Žæ ¡3”]þÔ%LQ](䲪‰)Rp傈`SŒ°Šµf@½SWfµY¹l7ðѵvõÑMaÔ±°¨g—l“³lì„ ÁíÖe®µvË?K`ÿ2j]ç:ç ˜MÔZ{˜†°0˜e&ŽaÕñÖGCâå ÊÚ2¹‰1[;y­S–y€„`*û¶'Jþ¯ruBbÁÕ„x?Œ˜N\RÇñ^²#xÁóDÒ6AŽ?Bb³jÉ]h*¨;FH5 œ"=\"KsápY6uºÇë4LNü,ʼق¹«¿ƒûF·ésÇ bŒ‡‚Sû8áA$™ Uà—Ê(¹‘§ÿÙvlG%¨Ì8ýTš–1Œk:Ù:¦c]b9y8àÆkÃ;%ÔJÌgqZ=´÷=γ8ŽF^¦ï‡i#Ú3RÑÉóô KÊ _ùažx|DWúóøiòˆ-ÿ­]¡×˜ Qëê(©aš_ðª1/cÂp,Ak”4v•¶¼«Í3óX<†¡ á±zˆ×cÕ›Ž/¾ßèL)U„E<~븭ؼ²ÊãòRö¦5éb%‘ÜÎܼ ÂTVâ<“‰f²¢> (Ѫ Y¹ÙU70¹¾ßœ =ÎþüÅã^E¶°„Ð-TÝsø\¸ªG†nûûM‘ÊW‘ëa#¹^•SõÕøÖÔ#“OTøPwaµæx_XÏ`ŠädP·™LýÓÂWÂQ# †"Õ8ÃEdñ]…RŒÈ/9z­1 †Ób õð "ÁÉÞ½ô+hWU§dž5¸1ï&[sªú’©š€Ì%®H‘×>hܣЛ—_ÃÑnÒ¯ôði×ÅpÊıÀ§N\¶c+î°®x¢NKA5'ÕÎvÄV7YþÚãÿ~à‘[Öds_êžìz\¼ÕKƒ×oz?uæ7=9æFkáh/\:áù7/aâˆçû8nn´þæ&[ÕÙ(=b HÑ£>› KÀýôJjn΃Wý~© êôˆ$ás©J ï}¢yN=M̈Gœ6Ê ÜXLQL™S'‹Ûf°±Åæ‘X›lLq}ŠNÆ- óiLÂÒ3iÅbJ®fš™˜˜šÉØBRz‰§° µ;Rˆ!Ó£E9¶]Ä|˜_VŠ&Õ|¼}æòM´/Õ'‰©ñqbÉÐ ‡æ-⮣ÙJŽ˜K0ƒ ÚmO„!¾ŸK¾1ÖXÐìbaFÆ0åNDÆÇ¦´­„Ìø{Lážg‰x¸†¢×UxõTUÎXÚƒ-Þð8Áon#$ªŒZ&Ø1Œ,ãcEk}ÝÒÖUjÄ T €(<Ÿ£Æmû¯M—ƒ©ªð¹šõe ÿd¢­@…S’몹•À â°eëœ+“ª€N'ÿ¸Ž.FŸøàãT//FÄêÆ/àgœð<¸Ö9’":,q_ó°:¦¨…tcº§]ôø 8šÅO2aê0O4Õlrõ4cÂ]`ø‹£B‘áæY[L7,%¸šxø8Ú…c„†e§gx‡¡Î"„µ`•­¶2aøP0Ø ñÜÔb«yHh}%®.^r¼}e—Wh·Y@Ø^«ÍÚ—0©ñðýÓY~[ V‹Ú­M=f: ¸Þ@Ö‚Pì}ád@©ÑÕDlb!&3WX¤–מ)4Õ˜w©K LC0Á$8—ãÈòˆä±EîŒÄú8ÚÉÞ^&Z§Þ@´ ’´ÉÓ®ÖNýã‰^uúŽ‹rÌxrÏá£+m¹÷£»=ö´Î°l†b¹gÛ°½…È>USØgŸgeKô…)Òyy6u‚h,\ˆ'›2Çé|¦>RôI‚íg±bªØaOš¦]oO Õèÿ€bßc»'Ü^’íIÂöäK‚#”„¨b,ü”ÕDt&)¢SÖA2Ù}‘æl`pyÂú"Ç L9S %GÇX•®&ñ^’fJ馈ÝÜñÚv`ˆÃ>øß®áµ/¾ZÅ×±6<à…R£ĪŒõ¸Î^ìÔò½ãŪ7Ú¾Ë#´ÿ{ŒŠ;‘¶SæùÅíß –”ûûÊÛ(üFQsTçã³%øÁã4¨@I‚xªG¸?J–”bkÚj/‡p ™K­›±aÕлÝ´ïÒÛFy±cvÄAÞ»…Æ*Ø+TŠð²ù$PJ1b„¿Áýé}‰ÞR‚ß –EæÆ”@© ­ÕÊ4÷o· Ú½]—cÉa.`<¼U¦WK6#/‹(‚c&ã¸}Ï^ض}EŒ±R ¥SŽËVLÈh…Ãöž´ÓËuÃ&†•µ#ºZ\æ/ÛЀÛ0p«þ²ôÄSÈêÜ"üÞŒ0g9žÓþ=î uóIÛQe±ì"°âc ×£¬ˆ .)JjÕDë?@jËb^Ÿ„ B =¼\-Þù‘Ÿ_” ™m-«±Œ­’yA(†{W÷˜j_·™ûänäæ}òá[0›¡¥hy‘ÅUaÂSÙB,ÆÍÄ ŸÏ’N+õèDˆR$¿y¶rteË12¤Uû !Û¯»”*'ušEªÙ‘è p¶IµãÅï®Q›qtFÅ7ŒzÞ*zÁÐ'öZ_åÑ¿!.¡!%]­HIÇ¿‘kšÑêvŠÇô–Ë5ÿ."é¶ú~Ö$®¶ú°žwÄið‹#cð²"ºTƇÂÃ1dÂhb3̵ӌÆQ‡âƒH°^™Ã'·=D—1+ º˜ÚÙŠû°­ÂÌSnŽ$yzÈ_‡ë…ÞÉlŽÄD6D¿<$Z¨ÖÀT²3˜Ó”ã„GþêÁ ¾™S¤à8RSÁáËÃ=zE7”U±^7l˜v-ëj^k ȯù….½xX|ÁC=±ZEîHe Φj4Ô’auT¬ö)AuÇUjP­·éo¹OáZ³ÝLÑÌ=“œp¼c…kîp^&R÷Oš/q«Ž¡×‡[Lÿúw!7ËQÐÒÄbc¡Cm î´”­-‡kÞí3ƒGÎ4ŸÉÂ×8Þz›”%0žó#‘…ö¨÷f:5^NÜœÈJ.Ò3ƒ‹TŽ:ca»û%ÔfÚ²–¿ÏC¦"þí1º= Ñv*<‘9¦>VvÀ#›Ï4u‰€l1 L4#ÚF»›{ (dGV’ò ÖçP©æ‡õÍ¡Ó Km·^"åèµaÒ õѯ¹‹ ç¶‹f„lî5ÍPx«o 0w…% ¸ÏÈF¢¥Ê‘jd`˜<˜SKÂãf0Çšp"d‰æˆ2á²`otpI£JÛâ™ÁµJåº?(J†Ùͺ Ò¹nÍu¬$ÒCÔC`"ÅC=„ÀuTT%Î1QU~\²ìŽŠktÃ;ëV—«- °“Çð‘b"_ê6¯ Ïü<¸Ïrû$szåWÛµÜG ?evÌFf»ù]i÷ÏéKg„œ6êÃҰˆ5³·È} uñŽOÚëV÷oÚ«ž¡Â-FÕg}j§1j5ýÒ˘>÷Þù7œëÕ[4YòæÖö¾ßé$@(0Xg¯¬ÆÂÍt5Ý`/RØb7³ …Gƒ¿éZym½þʶ,Ã]þ½[ñpÐv hœ(,`zßþ~jG¾9hl¦à`À‡æ˜§¹ÿêœ{áýî$0½!°kÿ›^-©°Ó‡§ÿWÖ} endstream endobj 7013 0 obj 5813 endobj 7017 0 obj [424 /XYZ 37.5000000 659 0] endobj 7018 0 obj [424 /XYZ 38.2500000 562.250000 0] endobj 7019 0 obj [424 /XYZ 37.5000000 659 0] endobj 7020 0 obj [424 /XYZ 38.2500000 562.250000 0] endobj 7016 0 obj << /Type /Page /Parent 2 0 R /Contents 7021 0 R /Resources 7023 0 R /Annots 7024 0 R /MediaBox [0 0 595 842] >> endobj 7023 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1701 1701 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 7024 0 obj [ ] endobj 7021 0 obj << /Length 7022 0 R /Filter /FlateDecode >> stream xœí]KäÆ ¾÷¯ès÷ªzFï+@»@FÁ:N`ÄF6>äï§§%õÌHú(é«¤î® ♚®É"Y$ë«7úü÷ã??¾y÷ù?ǯí÷wŸ٩̳æǧ¯ï^þÂV§öçcYåǯ¿¾¿>>ÿûíÐ|àó»¿œúßÑÿ|þÿ/ÇÿvþåOí=ýÁ¯‡Ò”çïÿ¾|¯Ksþ)»~úý¿ýÃñ·§»áÚɼþ÷wÞ˜2óOÓ˜úÛ¡[¦¹|ýþõ·Ã›†ËF©¬óYu4Þù£©½=þ÷‡ŸÏtÝg§úéÏ _fk*íe$ÄÖçžœ tùRê>@çyY„ëü2suªW¹wMæ¶nTç(tí=ùKëÂu~™¹6Q:ÖÂÎ9{þg+únD?¬&Ðs÷¨ï}^†ëü2suª´¼z×dnîó†@gBéSèÚ{ò™ ×ùeæÚDéX ;×äl‘·ZÍ›*õópJ3ÏžLnžf®N•Ž·¸wEææÆÚ€:ù¹ûÌõE@ɹÌ<”NöþiI/x*Ío€»ÿMøàÛ/‡7Ï>@qüòóyf—›o_~=øó?žü¿³{óå§ã÷Yfì_~9T§ªÎŠó.»üÝ¥%«š–ç_¼»üŸ¼kŽK×Û´s:s²:7>vošî]÷‘9-í >|99 }j‚>YWT¢îm{+à”>\Zò“³•yMmÓpÈuMÏ-xžXž\)¦ž›Ë`op¯óÔõÙO,ݼíw‚¹yKñ O /óÉ-ç37a¥ ÝðzúlÁ‚(¨1,n:EèóÖS"è—½GöÀ5”­O®ýÐŒe½Z«ÒÏʪ q±ä´ –È÷Ê, ùÌkÛ³Ÿ¾lÙZùlÕÀlYLT,>EÎôÖpÌÀpé‚ÕWcžñ&ü+ª¢Ç?—·ü»ÌóÕ„Þ.oiÐH‹-CËféò¾l:ÂìC™¡Ëþd“²³5PW„Ö…ýU¥2\»ÞØP¨„m;lÏT\“~'øO)— ¶ 6Mx[h2SÎ?LDa¾Árfð LK¼ÛS» d@o©6µ8hÑ_†ÿÁö–­y*ËmLïØgˆqp‹«#R±.^k˜±ÕØba‹ƒ-ïຠ¸UÁÞ`K{rÎ-ƒ+õnø3xéf?ÂÞêåÔÉð8XbázÜ‡å» ¯sNØM˜x×;·8Ø'I£ü‰¥<œ‡÷œÁr€÷6£«Tmà g€%1¦eÉïÖ¥ÜCúz¨,Öë˜÷"O •pPþ£Ò7wAÖ HÞÝ›k¼S-žö`‹`íÛ„-¦á½¨I))Ç\Hè‘,öà"X ‰Ì}‘UÝ¢›cÅØ Z5ÕºYŒ’ÉYãqR°7{e&ô×%ð˜¨1‚Wª18<x uƒ¸éüŸP£Áˆê}ÄNç‡Æƒo„Ìýšºo¡b©ÏAVQ’¡ÁºŠØ|wbEUjf(û@”‚ ܘ’²ÀG][ô¶ Ž‚âxö¡…Ø >eáÈôü…¸2þ ô®…¸2öüƒ«µ*7=^MØŒ´Ä*ƒôÀ³÷§ 2 b`öZÌ´ZQØN_à„@‹S8øˆ‹· fð¸ŠÇÁa &@Äûw¨Äs{QÆ*39ŸíÃB)Q)“•)QÉ:dT°19~k?-.ì<éXf×QßkZ!­o†,®dû=Ô©+/¸ðkÑg:ß»+õÖ ïØQ‹u*dàÙ›µ´*~Ñ Úpÿ¢è]ë8Œ¥ŸÁ³¾fP‡§,;x¥Mo&?eµ{h¸Pœ¬©^ßÁëÁsÃ-æ ®NÚ°·,‚:h“@UÖ“ÿ1·hó•7>æ`S€Õ:6‡Ðq qf êœb×P0ÕØiÄëÙ±T +Å:æ)vuñÁ†q¶7w©…ƒ ì T`Ç îÁɺÉCаžýËNàf¾è™0F0…2R¬Šá ·$ÁÜ‘`.S]Ìi«.µ­o'6g+W¼&¡±úG+ Š÷` ]Žg¬°á™ªìï§È±àØŽmfsŽ(îÚÂæ¤ We¡`c§¡©,"îÞÛ n QK¡ÏÈÔ•v›}tc™:‡y°7œOB½)S÷x™:ï ítWV½­ž—Ð!£Òs1êa}—ä¹’äÒ aI’×'IJȦ¼¹Ò”3Ý‘ì„5/UY'óòš$µ/ûÎõãdˆëë=´¶Ùd§¢4¯Ïtª@‰ƒ£õd€ æ9“˜ BáBªG‹|¾l`Ðð XÕZÜq26εî°ágWô5 ?wIÃç6G¹± ×T)û‹NpÝCðµÏêþêq€Z7õ>=+}˜„¥Êƒ5ÌS)ºE!‘B¦_¹”Wn¶^ØgåR‘½ìŠH þ†gÐ=h‚(”ßxËûsQ*H`2¡ÑŒ’G4}ŸbûCº $#g‚më*Ÿíƒ©¼> ü°Üü²ë˜¹ÇÚûýì=&ƒ[ÜÙÛsOI:FÈÔÖ¦·>dêòºG’8¹Ñ¢?ìÃsâl‹z$y¤àuÕS†‹ž f^ß|gl¤\£ {bÒ ØR¸‹ªg)eäL&0|g§FÝðü ­}_£š\æ–Áõ´×2‹“3¶'ºp¥­¸¬´Uê#s³µÍÐ8x=­Ö£µ+} )ÚôVžؾcREŒ#Ðà]çD6$xñ™÷pÖ9äÂÛårmá 0u„(ñV-X%¿8å³|ºàP0rØdêúî„a\ò á²ÇºCȼð±äÍ&ãÊ<<öûªg$;ooh$¯w\Rô2¹]¤X‘£{»]·vü6ÏåƒÇɈçƒtßú óžÊ=ª>sô!HÝÔ-žíCå÷±K•/úÜ bž9¯²gñnÂéJø—üÌSbŒ#ö«”5[ØpA¬L¾2Q6 >l|"Žx+ËDn–Z)“÷ñz7pCÙ²èIÀ$ds–òê·æ@'ì9CLk‰õ½‡*òm¥‡ŒÑ7ð8øeˆgâág ƒÏá0fHë¸/›æ1kjL8Q%‡s#f€Ñ^êÀ;ÎèÆrÍ ä€ß§gó—&ð®ÆÁ{#ëpõD/9t6§¸^‹ÁT„Rn¡îpå0Rvƒw:Æ–ÁxXx×b<,¬½‰§’Š·Ï0rØ›²æ‚üh€[0Ò\’Ä»“D§1À:ûQ•“óZöŒH$"”¶#üuan˜x72ϸíXti@ñ4¦²ùÿkU]#`rOQQigäØçÂú6Ò>S^)>«1žLÄXŸÕ¬Ûr›çSâƒØçÂG(UÏžŒ ÜÁ[ é)êŒe”ÐvïÜ’25]åÒ°ìÄ}5~ç°7¶}oøœÛß{¤p+¬+öøË2Ž«b[@ä •#¡º–2&ï«îÙgã5¥vT—™nÔ”ïMùÞ‡²Ö)w›¤J_ªö‘‡uvz>)›ò°òÎØsŸµR¶uR;¸zR–“%is;“²­·šm¢D)§zw9UÌíÇÊœºgdÍ”9M™Óïo9sêÊUU®)sš2§¬—”2§)sz§™”9M™Ó5¹^S?ž2§âžÙyæÔ›®&3fæÔ»®zN@gÐ=ËòXáqŠ|u«À耋ò£*Ö‹.Èr,Yc+_ô˜Ÿ|¦ä3]Äï‡ÐzÇ50¿½Ð`´ÈÒLáC?ÍãsÛã³€;ƼÈÈô† ÙüGÁf¼J¦‹€¶£‹G ý+ì Ý·51NH=8±¹±#—@dc‰cþðãQÞÂqT§``#½/í%ƒÁ{ bæ´®ÄÀp¢¦ Õ<V~½ƒˆA)ÍzOgìðí®<+s‹;×3â [bÅ ™M/†ˆãìæþ5/»‚‰—*Í:Á¥J-—ê0ݘâ!|ƒH¬á„ŒÇû¶ ,D:ÐáÒ5‚:ze8^pẻ’Â3òL€>ìÃU‚mVy “y>pÚEƒ4ÁGkåG¯TcHKÜ}ÌIÝp“®ë ÷ÿÞôÔ}Pj³ÇË÷ÞÚòu„¢ê*>îíu„䂯s÷ÓÑêVÝýÇÉó§×DêD¬û/³käýqÐ2˜[déVéî¦ôB’ÄÛ•Ä}`o”v ®&öúðý'F.q ã{ëÚ6)‚±SÔý4|“ˆ¹†%dǧ³}Üù(ý´¼¤å¥–íµY3òOÜ9ôfEáÓ350 ®&¦5S²‹cÐx§ãø¡Ÿžb”œ¡"0a°$æxŒÝ%òjB×ÍÀìýäUDííVáPFÒÞ)?Äå‡bùÄÑr=p× ç<¬‰÷áYå±q5'VÍdZ{FD>¨Yo~^µ„=ÃÜuŸ•kÐò˜–  25vX^î ëtÏvóqt4CÛÔÑ;ñ7êU¯yo^uBeÙ"arc ‰Oðx71çË?ízÏÔfUucD„ÖÚ…yM¿õ¡ëyêꊨ2’oñ–i]_×ú0·3„è;“Ë"4³€sY›[ÎTñ&Éhº’$ñ%qU,ç‘WåcEëˆu½©ˆKžÙ.+ÑcÉ3ßÅ»Ógr˜¬s¤Ï‹î¤ÏœÞîÒg3àa²˜Ä<ö¶`JÛ£'3|<°¤óÔÖÃz}@¿ðïTEψaQf± ìm°Ù+3Û7"þSnòi,ŽÅÚ1VP‚a©“`X(‘rÙ"uâá2妜~‹ïÞ"ÿT•8‘[LqÐ}ﳑO’x»’¸ˆ¼©×T ìúŽ¨ê«¾é&(wÖ÷¦ó.=‘K¡*ŰÞÀiز·9V¼:Ž%1ŠF±f ZK²gRK´÷u±æ"î.3ùTAG3Uóªh"B4L÷þE$m'ØÌ|rdPs=¨z¿^9×|“r KЧ묻mä"á3Û£EÚgÛã \ˆéså3$V÷f÷Mž`bÝb—ª§Rê.öö÷ñ¹‹‘¬!ïì¦"ƒäjð.!Ð^è„m–H4 bØØÛ¼7!Z÷Fˆa0´øhKû^¬©›PÒˆ›2X.Œ¦hØ{ºv7&ï«-ê³]6]ŸòÊ R^YäÏŽmÊ'©Ò—ª}ä{]…“ò½)ß+ÛêÍó½øä–²º+ô†_ƒ“,Ô’²ºâJSVWŠF¥ÜíÝån1·÷•¡=¿‹h{>MýÁŒkgÕ˜arÆ2“Ÿgx¼¾:ÙfdÆîý5ó.G.Ì5»Áž¬¹4 ôK1li#1öTä …ž¹ÚÌ`ìÛ{4Ž›ºØ=6·íJËv } _öÏSÊàdM»ôÁ[u<Ö} [> endobj 7025 0 obj << /Type /Page /Parent 2 0 R /Contents 7041 0 R /Resources 7043 0 R /Annots 7044 0 R /MediaBox [0 0 595 842] >> endobj 7043 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 7044 0 obj [ 7040 0 R ] endobj 7041 0 obj << /Length 7042 0 R /Filter /FlateDecode >> stream xœí]MܸѾ÷¯ès€m‹"õìñ8@ Èa‘C°›M°Ø]ÄÙCþ~Ô-©=¦ôPâÓERÝCo<ïhùU,V«ŠO½ùó§ÿõûñÍÓ§ÿÿ}út(NMU Žç¿ß½üEٞƟM[øõðåøåðñð±ÿß/‡¡Á§§¿ö?ýïXÿÒÿßÏÇïÿÞÿòÇñ?:ÿ¿Õôÿþrù·kTÿSqý÷üûþö‡ãoç§áÆÉ|ûÿgTY7—i¬ ýå0-S]þþþÃo‡7üFiËJWÅQmŽª3åñ¿ÿ<üÔ0u_œ:£TS›¦¸e ¦<¤Êò¨Ê®8ê….eºW:7µ×ùeæâTQºVîÞOm=þ?“c·çû?=g©ö¸8rÙ˜ªèZøóMm*3lWÕدkï!˜¡UE¸Î/3—&ÊÄh°óлÝwp·¯½‡Ø®?áXé<óP» ;Tu¡u¸ýÚ{â×EÛìü<ó@;‹;—ÜYe¦SU0^t ó² È7—™‹SeÚ[Ü»äæVõ¨Ãš:…®½‡ ­«p_f.M”ikaç§Öh¥›Þˆ=ïòy‡«¶-ûŸ=þ¹‘dmp·¯½‡Ø& nfj·aç¡w»íÚ€»}í=ĆtM@¹}™y¨Ý†ÞíFµÓ~´…<Ñ^t s]‡“ÃÌÅ©2î÷¼÷>½à© ¿~¥/ކï>Þ|è/ó=1ëãçŸúÉ]ÆþùÜ¥:~wv&ÕæøùÇã‹B™??ÿ|èNuYMS\ýò})ð—'ÿq´&Útþm ئ‚3(KÿÞT ¿´ðKi¥° þâØ…áËóçþ@çåVßÂËÄÌËï0lS<ûS¾%ÆÁ¼ŒO-äËBùŸZf¥ZÃÞðμR<7|Òñ °´ƒtsÐÏ KH<ƒ‚X)æDHÑÊ<æÜ›ããS‚¿ÀÞëù@ì>YXà6xœ÷þÚ¨À:óN$0§¾„\•¾· îã,ÀýÁú]¯éj¿/]<ýnŠò]]b¾ÄŸ È—Šgå c=Da½sïK5ú>â¨æºV¸w²¶¼ã çE:@Žv FÓMÔxB©Seê¶©^pË0ËöÔvÅe¢_¿ \iNFù6÷/µy‚m`o£v^èMáqðÜDgPT—/z"ÛLž´[–èd´>•>é²Uå¶œuI0²þµÚ>G¼_ Á1°·Ñl7 ŒÉ¦4liA1>Üž²•dâÙ>á:(‹É…ÛàqlþS…Ç– ßœ›áöŒ·-¯Í.¡œ¥Î†¨”sȉ§ÐúÈTµ¥‘ÔI­Hê†g<0Å©nÔ7®'à©+‹±*IÆrh†x¥ƒ)ZM’aËAÑø‹}ÞÝavYH †‡¢ÕÀ/ïì¥{ÄxAÎ-D,xX^„bpðÁ³Ô®Û d”"$ˆÀ ¨ù:cßÅæ%¤¤Žm%XAD,cV .ZÚæ4By9Xó ¦ŸÄµÍ!éDVÌÜEÕšðŸ¹A†½ñ3·™Ñ5¼$&áÒ÷ÆB‰¤ÉÓ©Z܉}°+Æl€iÁ°¨=%‡1õã°Pbqþd×ÞΗY¾œ†šåܨmóWÛç¯ {xߣS­§à‚møÂ?f_bcŽr^¾>ÊùÌÜþ°qºsð*$†C¦æ‡L_:š®;'Ì=”Uóò¿>K™CÇ÷<…oϯ DµÇÒ,©ÔeÈ~¿¦!?\YrØx[,}X¿>œ?““Km:ÔftŸªfnH™Óìˆ=¡qœÁxøšS×Ú_¦xäœ%5šõh/Ì­„_0 ÆHòR¸?ãqñZ餿ã`8f ­…^ÙAÃUÝ5T[Aëtfea «ƌĆ,žh„Šr0ÊSgf·2~b¸t‡6Á„Äëç°Wm†#™‹šˆ»ÛAÙ»‡$¼ƒæ9;`8€LÆãBp¦#ÞÊl¶ÈxÖ kN“€ú®*kKáM6Pyš]°×zzIï´"xž U{ˆ±äûàËòhÅV§¢³,8˜làà|R…‡Y†¹zË^b=Dy,ïßö$!jÅx7< bFüo'µŒÕÍRÂ/í°ádvܸtI„{]&´PŸª¢²oT˜qlc‰€Ïø¢âˆõøhVf„þ¤´3!}e$Ûö ·Cla«_4ãÒä‘‚XŽ%kfî‡k*"¼­Vl’ÀWHÙTcÆ„ópD¦!C.Sä*fìÖ}ç8¼Îî*›]eÚ± &We–Á!jÆr‰;\(ÛŲ’ÙcJódz‹£hërÕIAi˜j’0à-ìö!’‰Ûƒº;‰dÜ7Ùy÷³ƒDøÄ^yÙ lÑÀGºgrwÈÅ\Ǹô)í„QLùÓ¶Ÿ[/ÖÕ!ðSáG̃5Á2®RÔ–6KÿöxxA…9CNÂkΰQ:O' up6c¤oVÔ ìùfn¨É´™HT]4q†r§1 ÁˆÃ_ÂÑÏí‰å;¸æ3 :„u#$RØ7;æ¾ÃX#„¢>1c—Ìì`7ALØKÖ}´Ì¬Ê±¸Â¾ |×#vîáS6 kÕ8à›³‘vsñVƒs•BjæÊXÛêHc.€“8޾‡ÒÛþ\ØÁiÉ}î;¸{ˆÚ§8$2€ˆê“ý8À™Ê‘N¼@N×­*´ šo|2dÙ,‡üÄGŠx~ìE„‰¹òˆbîQiG3¬‚áe“)8°X¦ ³-Œ‚•‹[RÝ´µ¥oíªÎXn—Òèé’b0‚¬»'´UÊ£dÙAæÞÓý½i¾Sã1N,±Ÿì™ŠPþ ÂÌ3ÏRo¼¿i›ic1x?QÚ Côã¢gLÑšÏ€é ¶)q¢ø„ðJ!E;‡ +ÁYãâ8¸hU(ä(üéVàÂ%¸ Q\ ºßÂÛí™*É8€Á²G'GÄ>ªÛ³é'UDœG¬áõÚ2ˆ7Dþå#š§m7et=šyê˜[6™ÖM&@IÕ-‚XÞÞ®šXo”,N3 Ç~iFqZ‚§e^mFwàR›µ™r«Ó Ïg,~VV†zF_^¸ì65šAég혜õÈz ã(HëQ7×'=gÆüÍIu·4ëÍm„Î o­w¶6>>Šžl .lchÉ$ìðµ C¥XÕ‰}¢bê0O=ñ—X®‘JàE{))ñáá•‘ÒõdIW–²bà“(–“ÈAvj!]YWŒHÖx4xgÙ7×"¯çE ƒnGxM&£·ƒBw„Ž÷’56wì&_Í(Yâ¦+-’“¯× Vx˜Ö²æØŽãSõ “Ã:ûÀˆá”"|<;}»]µCä|¦Vzp·5!Ü}W÷sX—Y»Ü¢]¬”.­Ô0òâH¤Á©<8"‚£Bk±Ÿ ˜—ÍØŒ_UVaK€¾x\U›sÏÓ†œë¢®ïç/|Ñ0¨*ôu¿_!ãà:ç-œ5œm “+IPÇ‘® ÛÞ¸GJNJ€mp£#%Ÿ,œ,À¤8à¹íølWøòzä>õSçž9>ü…E•êÛ­ZpD{¤6o“q3ÕíDY˜zLÁ€âA Ù)¸ QG’òÙ§z…ÏD]vb9¯W„9ÑL¤:=¤yBÉj¨#þR¯E†åŽ…Yé(5‰™ŸÉ¾!ö>äzíǺ±9öOp£[û¿:càxÉ•>vCØÕ>5›™a 1÷w3ëxdWsbW³j®•ˆ°Ü„RØáÜ"Þ a· ãD3X«À•jè¤ÅŽ—ÓVA‡‹ÂÏòá8J¬¢á®è®8D¢Îjf+8ƒ »á˜¼[øÅžv_â“]‘ŽwØQ‹y™ŸÀts¸1u˜`Ï Á»@ì¶cÖØŠÏxnpO©·ð”PïYïò”È-béCÙЈr¬ÎÀ±§°ÆRY „d]–êúX„ƒ%>µ ÿCÛÁ±Ø"€{Z÷&š#nÿ”ô&ÖÃh0JàÞ;ÓmõúCRá—øTêÁñK;&¼ÏX%xmDPÔ¡Á˜sÊØ Çã{Ö9:†±"!fàS2ÞáâhJ½ž{ÊØŽå­±8iŠUŠìÆ7¾tr2Ÿ+™ï1½LK³&Ò”ÉHk·¸àè:µÖÖV¥D×yÛ@œšQ¬«zò ÛsYãáŒÌâ…Sã@ä6x£‘µ0ŽÒ†É:¦„—Á€P@³eèXO{tÝN³ÃÏè˜Ü‹YDŠÉJþ²ÕÁùžU‚Ǥ–-É!’5qóx®ìÃHá[G2 “½µc¸¢G©l º#†©HMÍĨ%A3挥ߨ÷Õ³‰oÏ$Á"B¸´U.c •ŠÉŒ]ä’Ž±2rcáËERŽLJ0˜[Ìia¨Dp¦¶ÛÌ”¢ÃÜ%KsˆO™,ä“ùbÄx¡Q h#‡9‰w‚Ѥ̣û‚CAš15Igø1²08©îïÉÀ~} t2xY÷x| ŒoÇ2˜GW‘wE~òÁiv­KEU y˜ë­ˆ:BjÎÖX\³á!–0Œ˜è±–„özâJ™[LÑÂé:Ìk”¹ïZÂ`ösó(@žÜãÂG 3ðóÌí&²¬: üR±lâÄÅ*]›ò q)š†k”ú @&«²ctTÆE½œEúð%IÞøAU™Ê²#ù=Íûqn£$Ù$Á™ð'qä<î?xÔV2 XA`rO½C».¨È¼MüU_FÈè ©-åH-V4‚D]…™‹µÇFì¹\cö94”‚cLŽÀØs…¾ƒ1HLb áÙ¥JÍI@;‰ÔHɱô-ׄhõ‘BÚ ĺ²”.å=5©+Âu¨v¬_b%ÍQùÄ5,}¡@ahLÙlÀíAg&Ì~ƒG"‚7ΨÈg+ZêËþÃiÔ^U[;ÿ ÕT9Æœ/—.Ú°œâ(ŋќÉ"î».½*‹@̸]EMk™¬ÙÜPKÖÚ¶Dø–É£¼b<Ì€'…K;ËúY"ãÇ"pì{%ž#ÞPEÖ/\•¾:žGÎj¤hå]Å “½À¡øŒŸYÔ%“Æ+¾‘Ì* ýTZÛš5p¡qQkh5=r*ÀŽŠ˜3!9<È5ï^}Ó4±h&ä [°èrHk?Ogò¡gâ¬Â6ã¢ýÚ¼…m:ÔfØ1§ÒÎj OCê¬ú}–z›pÁf·”`§ž¦¶e#ÀÎÂ8#2MsªšíÁ.<7¼žw°Í3ú‚ÛŒ’lIúÁõÈ!>€½MÒÏgÑ@*c--ay¼ô)‹*7&?p×w@Aì¿üþ ËGãïØÏðï:Þ÷ºCSa_/¯ú$°U›B¡ÔÞBÙ:NE¶²‡­Öδ8Cf>—=O‡-õ5UBÈëɽz'¬ÇƒiÂí@=&‚O¹ê™”ÇêAlÑ=aêu³ëヤ2ÅzWI¹¹ÃÚõ1+ VÝT+ÇQ£¦ãú¸ŽU‰¾0U¤$|\%ÏQˆ¨ðÃT`°øñz˜j0¸·’ (Æ¡×bvõ:—×êú¼s,Þa¦BQaó˜£J®Ð€ùR´"”Âg×n`ªÜ'ª+éÆTN`N`´Y‹Ê ]Iž¬R¶æ3¬§`=Žî®E„¿Pµ¼ð.à3O0³  ËÌ ý.DÐ`+±¡º¾bÛÉ&BÖw:üH‡ ¢ïÃ×cœ·+çrºËgÔùªkÌß1¯ŽM™MÚø&­¬©)kÆ2À˜R˲%Sc9Â+eŠÂáY+Qºñ×ï8ÒNwëü¯tØá³ö%|¶`Ó]—vŸÙ‚¸MÎÌÙ‚n>ÀÔ9¨;Èl¯Ò(g ^Lμ9[P’J‡îѸøå´%΋ ›\fTkKb9hàÇ%Ÿ™‚§V¯| ©dŒ±×<‘Á›žÂ> d¢í.SÐÒáý=FÒ˜¤]‡ÖsŽ÷‰©F‘§hÇȾL½ʘ lþ…E„±xeo¯ +œ7Iº PXÈäA]ÙzþA^ƤGúÚΔËÄŸ]Èbˆ;y×Õ˜²$²˜@¯¯þ’¬JWÑFûÛè±*µÕTxvL]ªdD¤ýS <¡V Ñ àÛ6 áÀžPB(lYÚhÈ„"ÀPÕBæ§PÀÂÞ^¢êymäH‰pÜ¡d]këÄãGÌ“‡ Ù)!•ˆ¶% HºXˆŒ8ˆ²àeѲÉjǪR¶vdV={¬Ì<5ˆk¨t\©+Ò Qz‰º±ÌïÑ‚½m¨ØäVîcÍfdÿ‚y¾‰ÉÈ8Zñ‡z}Îd×çù?ðE^ļKX&JÀøÐ¨¸ .¨‹Wš ´ß[Ï%¯BâD@q½‡‹cÏÏc!13Õ/…ý¶²Å!™¸±(u„†d½Ú u<Ì ŠÅ7. ~ ³©B ÌÉñØ\Å%,z~_¨"²Ðý!ÆDÐ¥Mkñ†ã®€MY cwï9R¸‹hzc^ïùTç Q×8±‘3™·°§$络_/Í7¼‰Y×É4¶ Ÿŷ;ÌdËÅ çÓÞC]ë g°ÁÏóé{§¯…[òÓ÷Œæäì-£9eÈ€ËQd¦ M¡ ®Ú¨ÚÀ}w MÐôVå´€û„&À³ÎКÀ͘:ÓC4Ee-íuC<íz5®“ Mp\œÏ®qîÁñ, Â+?ð†‡þ!ÕY×Zú,C܉kõ1 F¢W~¤ChlOVò*8#z¼¾K/Z…±M—¾Ï!Ù±0“M—f¶Òñêg &·fnõ! êÚÒ¹R͈JeΉm÷”Øæ%rúYN?‹wö"8ýênýle'BX'BÈÔÚÚÞ眗»û¸K½âìµ\Œg e_WöÚJD]÷ öï˜[Ž¨çˆº›0u ­wQW&ƒý¿ê¯×ctåˆú}pñƒx/÷lý GR$"“Ž»ã´…B\=¯!!ŠÊÒg>"(’ÓÎa'‰Ü† 8™Y:ã‹¥½DQob=[Œ…PËÝ”,8‘ca9‘Ýî _ªµ/‘9̶ƒcãd®qî!Ù6G³¸SÙ±Á?W·7°Q†ÝU0,h½³ø)‡Ù6‰Á]‚D4e™A"f‚)ƒDdïq2H„óüdˆ ±®ªéþo ɽ—•뙆Ûà¹aî3)ÿŽ”àß=Á:9A´ãe‡û¿Ç/ýV:wúãÚ°Á®o«þ(}ê{?Ãci¦ÙáÌša­Í‚1;èîr!Sh0 9DúýØfL¹™I?œ•µ0Ž^»ã-ÍíøÒyÖO {]¶_§TÀɪq鳎 €ß5ãÛÇÂ2î ¶ï%Êké/œ,ÃîgàqÚÛy¯)ôi”[ß0!fµgÈž/°äW…óÇãÇÃÿ=Š_§ endstream endobj 7042 0 obj 5796 endobj 7046 0 obj [426 /XYZ 38.2500000 614 0] endobj 7047 0 obj [426 /XYZ 32.2500000 633.500000 0] endobj 7048 0 obj [426 /XYZ 38.2500000 678.500000 0] endobj 7049 0 obj [426 /XYZ 38.2500000 214.250000 0] endobj 7050 0 obj [426 /XYZ 31.5000000 634.250000 0] endobj 7051 0 obj [426 /XYZ 38.2500000 614 0] endobj 7052 0 obj [426 /XYZ 38.2500000 214.250000 0] endobj 7053 0 obj [426 /XYZ 37.5000000 749 0] endobj 7054 0 obj [426 /XYZ 37.5000000 749 0] endobj 7055 0 obj [426 /XYZ 38.2500000 678.500000 0] endobj 7056 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 191.750000 143.250000 198.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 7045 0 obj << /Type /Page /Parent 2 0 R /Contents 7057 0 R /Resources 7059 0 R /Annots 7060 0 R /MediaBox [0 0 595 842] >> endobj 7059 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 7060 0 obj [ 7056 0 R ] endobj 7057 0 obj << /Length 7058 0 R /Filter /FlateDecode >> stream xœí]ˮ丑Ý߯Èõ}[|JÔs/ 4ºY^ Úö Œ,cÚ^ø÷'S"%2ÈC¥ÈnV¹º`—*”T„N[àÑ·¡R„ÏL¸?ÖÞB×rµrŒ$±œ˜Ø*ÐHÅH ±\Y:?PNCyv!ý0ؼ–¾ÌWÛ@…ŒW·ºØ¨¼o©¼¥Æt3µ¸ú¦l!GuNŽÛEÌ/Gˆ½}&pñK¸DÁ‡ ˆ<ÞQtÙÆe©®Ù…&|Ü1DBø{§a@ÈH8I"ÆzìÝí–CCtb!cNhˆ æx²šYŒD›N¥:½Š5ýÛÄ&ê &üé•4å 2‚ˆ#îÁU$G®-?,wÄ,ŠADTGžJ!ãDŸ­á3Œ³ÎåjåIb91YýWP#%Äreéü@9 åÙEé(ؼ–\Ú*d¼ª¸ÕÅ„õ¾eó–ÓÍÔâê›ò…éå”_†@¼]¦‚4òK¸DÁ‡ ˆ<ÞqtÙÆe©®Ù…&|Ü1DBø{§a@ÈHxI$`ŒéÄ»›-‡@ëÄbƌиx²šIŒD›­N%û¸—1QG0áO¯¤)_QDµp®"9rmùa™¸#fQ :$¢’8òäP 'úlv¨Ÿ™0xëôW+ÇHˉÉꮊ ¤¨)!–+KçÊi(Ï.ŠHGÁæµäâÐ6P!ãUÅ­.¦Fï[cÞRcº™Z\}S¾£ãÔ¬Ò>å^å³³ - \¢ĆGö8Èäp™#µ¢}Kçz„n¦Wß”Ï@Œ—ÃP~Q‘aHè­@ÐKØò‘Ç;¶Œm\´*¨®Cr†¦fÌò±ot`üo.s±D»p®@VÄ2}Rç`±45ƒ„8 $¢’؆r(™èËžè³¹gñ™ KjÆÐ/ûXˉÉÚá[*¥b¤á²£­šQ´ö#CÈ—«°ÙQ(Z5Å8 6¯%7„ÙŠVÍ´ÛÐäRþÛTÍ(Z5£|±ˆâ¬šÑ¾jFÓb!övÍQ5³¡AÕL–ˆ<ÞQtÙÆEѪÅY5£ÖÒZ5C ï4œU3z©šÑ ¤@½»Ýrbh4¨šIsBCT0Ç“½Ð¨¥j†Íj&_ŠsšVÍè¥jF“‚}@ÕŒ&U3z© ¯òYÍX5“ÀB«f GDTGžJ jF³TÍhZ ¢—ªM«f4-ÿ`Ädõ_Z5£iíG†Ï‰°ÙQ(Z5Å8 6¯%‡¶¢U3í64¹”õ¾•OÍhZ5£}±ˆæ¬šÑ"NÍh1.üÖ«|r$¢óá1¸Dt6<ò°“ “ÃÅtÖ ˆô‘ùÔ ¡›©ÅÕ7å3ååP”_†@T¤Xù%\By¼cËØÆE–T× ŠsZ‘ÔŒ'˜ð§WÒ”Ï\Èlµ^æbë|VD3ÎV'°ÐIk(ÄQ •Ä6”CIåS3³>›{fE2óc§þM‘/{"‰åÄdíð5HS1RB>'ÂfGy ´,° é‡Áæµä†0Û@)’ši·¡É¥|FÔ?hZÿ ý´¿æ¬оþAÓiýx;Gýà ¨HÙò‘Ç;Ž.Û¸ÐúÍUÿ0{Ì’Ð$5C ï4 Ù /‰Œ1xw³åh HÍ$Œ¡!*pñd/4Zå´Ù´ÃÀ:w5#1FD^®øQxõÂÙPøXCg“$‚ÁjŠÐDŒûˆñ`d±ÿÑ·¡™åjl ̤ÄHÓÊ+½T^iRT¤¨¼ Ïâ,•DáȬ1V^%°ÐÊ+(ÄQ •ĽW%Py¥Y*¯4-(ÒK啦•Wš–1b²†|Zy¥iýP†òjœ•W)P´ò Šql^K®/ÛŠV^µÛÐäR>*¯4­¼Ò¾ÒHsV^éÞËÑS~ñöžaQÜ DÈ/á6 òxÇÑeZ€¥¹ °f±‹ïEq”ð÷NÀ ð’ô€1¦ïn¶M¬‹3BCTàâÉ^h¬Íi³Õ©úxõ—îÉ¢8O0áO¯¤)_ˆ8ÃÂ=¸Ê¯G‹èܰ CYƒ‰¨$Ž<9”úü¢¸YŸÍÕ“µ^ócg»¨A“Õ]Œ˜¬î:P*FJȯFc³£3¡÷Öé¯VŽñÔ/'&«»*¡b¤„ü”4›årʳ‹"ÒQ°y-¹8´ TÈxUq«‹™ÁûÖ·Ô˜n¦Wß”/äX/‡¥ü2âí–aBnì`”²å"w]¶q1CAuÍ.d†Åwbˆ„ð÷NÀ ð’XÀÓ‰w7[&։Ō¡!*pñd/4fÈi³Õ©V³oѽ•<Á„?½’¦|A¦'â ÷õªäȵ凅8 $¢’8òäP 'úlv¨Ÿ‰Ð/±¦O :žúåÄduמ 4P1BË•¥ó5”ØEé(ؼ–\Ú*d¼ª˜iiG„PHŸíhL‚”}Tûâ—È¢B&Ã"ÆzÕG >z¨!Ëu"T¬žhEL¨H ªÛÖ =­óë‰ ÝL-®¾)_'6z9FÊ/C ýÇÈ1Å;äH¸„> òxÇýÕ6.-‡Á{½UåA,ј,¦„€¿à Ù /Éc:é/š-‡@¶áK3BCTàz¨½Ð "§ÍV§ƒ ×éßd!±'˜ð§WÒ”-ÈØ.Çvž{x•/lˆḛ̀Xº7â0ˆJ¢È“C)bœè³Ù¡B|f‚_C¼\­ãbNLì hF"#CÈ9°ÙQ(KwêCb›×Ò‡¶Š¯*nt1Ûiï[ùµ „n¦Wß”/ä/‡ ü2Ãï Ø”/eËDï8ºlãÒé‚êZ]hÆÇ]ņH ç4Ù /‰Œ1x}³åhÀ6|)cFhˆ \<Ù M§sÚlu*L¸Nÿ&‹@=Á„?½’¦|AFqäÂ=¸Ê6DtnX艖Pˆ£@"*‰#O%‘¯ƒ±™M+JDÕÖ=v¶kK :.&àÄduWI’TŒ”/r`³£b±¥¼{Ø ãÄÇûÂOq7ƒQ¢PW}db»8w wBBϪM´¿Ò´Æ×ñá)ä@Q° ]E>¡÷IIÄgÎØUehv|V~O&”úpÖ\0ôÇ?Ôkrl5 «ú†«ù`JB]kC몹}s=зX?2;HÒ)~OÙ?e'RóñX˜9fMlîùÄ©IDÔ|A>šmÀ¿]Zf„/)UŸ*&a¢‰ËðjÊ·$º#q±.ß‚¸¼t掆ŦXê‚lð} å‹ýþ6–®â÷Qð}pÙ~š€ˆ좣»ýt¸H¢SÐnƒ5%Àö¦j ¢¡ÅK±ÿiX6‰ÛTØ.ãÆ¬·¦Ôô»–lt<±gQ¾”]aD0ЏPÆÎïVQi†å¹èP£98*‘Pc Ô\ÍÓj"äwD‹ˆâ;l‘k¸ˆ1[X?OkšÑÄ@Ý)Ï⬠±ðŽ/D—I)︿MA‚µñEòÖWÐÀi_•äëòqC¹;>mþ¼§ GçæAMÿª’o:(+’Ïðq%ÐãúøOˆ±‹Š¹;à B…áWÇ/èz œ’;$›„w’W?­èÛªeŽh6´}UX5y8<[ó&5óˆ¸ÍÖ:®:êšùòo-OÊ8S÷u¤Ív—ÀÙQNŸ Uñ¢5“2¼•É °q=^{QSXwpµÉŽÔ>sÆ9Ìĸ¶BØ‘=ÔhIU•¦ÇsäÏŸb/kMÏžjÙŠiŽ‚Õt°5Ó)X¶¯þ4a³P–X³ºŠ£”¬jŠΙT•A°Žƒj*×kV TÙÒIE§y È9HT ã0ŸšÊ¾ŠB™*…ÞŽ½¤Ÿz'–þètå*‰¹? žoð߸ª†ô‰k«JË] Ƽv45òÄÕ‚¼!µj-íŸ÷ –ðú¤ŠN±fasG:þÝá2cFnºû¿P}Ò›úr~OYóíÊÛóùFûº*U%¯±#ãðøê’·÷—“‡¥—j*‰·õõxÛš†38º$&ôöÓ¼ ¾kV#ט]ÍõŽÄøY{àÔ$tñG×<­f€ çð6köìï‡$‘.‘wP_“¼¬¨ fε×|tUôQ{VÂ׬˜bñjÞùï3˜ ìÞþ+€wE1ω²+V UMÍT|c~¥cÙ#Ò6G~ ¥¿V8þÛ§&ž‚ýªG©'$ÝzÑÒU×$êNÚ Ô çY ^¥Î Âþ^;³ü¼ô6šTIZxÇ•ZZ%éÖ‚äÚŒ°ë9út…«íÔ¯´~RA>¾x5s§COóõ ©!:X6ü¦.påÚ¼Gw¤Dwœføà÷gUTßœ”SEõ»ýmn+ªÕ¢·H5QH¦¬WTãášZkXØ\¨µ†oŠŸ¦0n5oj÷KP@–}7]ßu _hPØA N€ª¯„Òßj™Tíåw‚À_;¾Ÿp^±»ó$ïªuŽJÖšÝ Œk¾Ÿx¯ššá\Um0ËŽ§;6¯ù:3þ{æÔï6›§tÏê™ÿu†É5G 1žLsd-¶Õ$غÅó9EÔ,M¨YıÓt•ïÖ”ÂVÌÎK…âq:Vg­…Á†¬ zu¾Í†‹PùßûÙu¿õ 1÷KëøcÉÒãÏ:wgLÔŠÛ|poÝ ´\ÎP~Ñ||dz†S>¹wSûŸ¶)ÛHʤ\T‘¯³,©íçÞmv9ù< †BOc´*[ΨZ,âáÞ@½Úd¸øÜö1ªí7°ÕH ÑqÙF±J£Ð&Åòi0ä·œÜÅç<®xï‰ÉA•溣٦¦6õ¦Æ½¹>>©qüÞ‹Ÿö]:ä­Ïе•->Šû'™pÙ#< =1TÄÆ-gÁýëÄP±õ"[#ìqé—¤ ¢ã¤Í‘o¦ï,ÜÁO3h¼ŽŸÖnS©¡;ª¿Åx häŠï<÷HòÖÇ{ÅÐ-ߨ+\Òs—µnÚqÎr>@¤Š,n¤–ュæ¬B(£Ûô‹í£ƒaD éy7{8øÍsÚØhèš¾H Â_z8G€Ûà¿ žÂÚÜÍ{ôn†3Ë\´ÑÖ«â¼Äw+(ZÁŠû¦äî¼;«'KO¬}CÚD}Z·ÖéÑ)±š 0îUÏó—¶¾[«Þç)ìxÁÃÕÌž¡ƒƒr©Ë|Eú=ï<…<Û ‚-Ȧ~£ã„H?÷7W€‡8MM™LWp?ìæ3¾ó:XðPlý㦚2ŒØpnê¹ûƒ³fbnÌÓøÁ7¨ÑݧAê›RÝÐbSx–¾ÛrüS2¾~+ðh|~^ϧ”hÑÎòTÌÔaÛ—¾ˆ0ý^ß³O¡ëÝÂL®0 qÚ<¿më‰!Òò©óÏë[ã•{çé ïšf*ª±ŸAÁ[Ÿ6Ó«‡؇ôSGœà­á\«µöŠú~)êÃûÊàm%*NµàÝçjÞÓ3x­ÁÇÚájö±ó¡’=o ¯Ž7 ÇÕl„MfÇ^_ß¾…J Þn®b#:3V<íðÔímã·®9ͪ2°âº?®å©Ø:a›GI•wÖ^]¬{ÃU­V±WA¶šŸøàŽBdÆèT3»c³ªaEÍ«'у÷Œ¯rw¿š=•Ï:Šã‰¤`ªÙòñ£8 C¹7?ø{_ ¶Š5ékÏê骾û*ö•-„áúžŽcÌÞwìÕõ‰ ûÅï‡í*·ed•â; ÉVz„öwxâDCS'{"cÍh‹£[WnëÑ4½ƒ‡8ì éVó>X§ÛYæJèÌ ¶ÖbzGéýVU°l£œ“Â¥~~XÎ]U½‹§}âæ¼ƒ2:¼®ùê, ×j2¬GºmæJ'­†j‘ÚfÊCú;º#‰Â 3Yù™áÓ뙋+ Ûzß=%骊O÷¼lMöš géaÝíc2y/c½|yQ]®/?BÍ11J¹Â•ÀfkfivdpilÚsP_û§ò‘³¯ƒ¥Pžô޳›Ÿ;“$[Ãqi!ãºãŒ´ŠÌAUŠý¬éA<+_³*ÞÇ­^ÍMMà)ƒ·Á ªªq ‰0æ£Úroß}ŸU›U33zÚy~õç ™:3‚tZÌÙíšúø¡p!ï§ÈYéôÇe‰<¼çà1÷¬GÅ“f|‘ª¦€+Îd>"k౞*ì·´ KÌVU ±ö¼¶ZuHðY|x'”Hº¼šrÊŠ—;ùÐøR›ã ´lÕ{ç­I« P55Uoÿ”¬MàÜí¦d#£\΂áWÀãÝöY´iùBE(Œ¥+tXU÷ùU(™çxë$ßܧµ?”)ÙPvO‚®æ³”uû‚¯sÕ¬ àMNi¶’ˆÂZ¨û8wþl°yJ4UÀ;Ÿà…îàõS]ï?-Û÷¬ x–øS/ú|ûå4,5ŒkJkúžéŽlOU:ks–ŒïØûB”éçÒ«±_6Zü ]ü#¼ó†0$lÓA p`r®“{Ú¹Aó m7X7µÅw<Ñò(¿‰ª~ã"‡Ô„m°`»Â¶XcW¾©‹rÏÙMC 4Ûz…ìŘmûeûÐ}@ž¥ð´Æâ ºÃ±ÞÁ÷öv…e;3Ú!7ß¡ƒËùq_ÕÉýˆì¥âi8Bug|qx|—ã0 ¶ˆïàw€È㘭pŒc%H<~À6†- z·bûLz@æm}kzÄã¯WË&èßãÝ!øC‹Ÿ¼y¯¬p›¯Ó‡ñ(âö¯ÇFçĘ$—Mú°Åò¢ˆ¿ 1éÄ("¥Ý¶ÅoÌJ;ü Œ%€ý„Á½-´1ì ßÂö‚s_røMCO½ý¹üv3À¢}þ´õƒ²êC~Ã5õÚ‰ûª¦‹\6÷¦¹Øe›È$¥<[‚ÌléÂHùèÚØd]^¦úñQ[ ÷œlŸÝ›& »\'5àIH›¾ 3 ¼žŸÈ¼†ÀOƒmÜì€ØõêÁ*ûZƒ»_ß$öІØU™Æš€‘± hPná¤~DXÔŽ°M`I ïå÷RGç^à 2ð\RÎZ’×Ú¤ïÔ« 0‘µ`›øí(HknFÑŸ.?½ü?2tôø endstream endobj 7058 0 obj 8933 endobj 7062 0 obj [427 /XYZ 38.2500000 218.750000 0] endobj 7063 0 obj [427 /XYZ 38.2500000 218.750000 0] endobj 7061 0 obj << /Type /Page /Parent 2 0 R /Contents 7064 0 R /Resources 7066 0 R /Annots 7067 0 R /MediaBox [0 0 595 842] >> endobj 7066 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1500 1500 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 7067 0 obj [ ] endobj 7064 0 obj << /Length 7065 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sØ/>€ €´’ä@€‚;N`ÄFò÷Ã’3³ÍùŠä7ÕMÎîXˆWÙ6»««ëÕÕõx÷Ç/ßýó·Ý»ç/ÿÙýÐÿ|þòTì«Ptÿì¾»ü…­÷ýßwUv?üòôm÷íéóÓçößßžº¾<ÿ¹ýÛÿvv÷§ö?ïþú·ö—?öÿÑá?øå©2UûóßÇŸMeÚ¿§Ÿ‡ßÿëé/¿Ûýz˜qX®æåÿÿÎ_¶S´`L,ýíiئ9þùí‡_ŸÞuX¶JmëüÎøÃ¿owÿýÇÓOíÃôžñÆT¥¯Š[ªl»RÝørglS윣…Žt¦7ú“7ÇyMÞA®ŽãJ#Ï®x¸ó®?Ü2þOÓ§˜¼*N~„\+ýá ³ïëÒV>M ÿ~ÒBèªG2ÌžâHjcÓrm¤ Ç 'ß×ÞWÙàl}`éP×¶ý{åúnDYé;”Ù¢Iq"Ãôú'⊢ý‘Ž–«ce8o<{Úw…±V)Îä<}‚Ém“pò#äêXé\š=õûªé9Üë ô‹éSœI•’šŽ«ce8p<{ê¯}‘N¤_LŸàLLáët~„<‘H—fO|àÆ½Ùcm?OŸâÀ] r²É«c¥?ðñ쟗̂Aé~|ß„?|}z÷½ñ¦Ef¹ûúS ÜqÍîÇ×)a÷ÝáÊÛòØ×w¿/ ãÿ°ûúóS³/m@œ©ÐHñX8âJ8Û÷ø †ºx¿|¶Â¢asޏ¶Ír\›~ƒGàN]Á§¯-q'§Ë²Vý˜žÓJñ0ÎÚ9Ý’&ì‹Æ\Œ1Úê}ÝGHÏ#ÏÇ¿÷®sJž~ÓœÛ_Ö/×éFêó/Êå ÷´tma Ò‡xaÕãoÆ;Æ0ºåû*>GÂÞÙÚÌýÆC`™ xØ•*p§¶&Ì)Ð^#Eà ï35תù—‚Dæxä™Ð „æ,°VO.q]ã#Lù€¨Và(ÈŒäxí9¹r!ÂGo!\ƒî€a3Aö`LDµª&`¶Ž…ž aæ«:$L±äÄMÀÒÕñ/ü§|æš«ÊÁ(ƒ§€†œ`ÀBQ„¯º—…Íê,çØ^I'ÏÑ}ÈsॠŸ¾þ0ç€)S)Cq_O µ#Ÿà¼žR¦„ ßOz öA/gN%p°#s”T™iIø1<¡h^Ú-×0Gt÷úJ¬É1]a‡“àÂÃPCêaxKpIb¹ ¥ˆ²ý--6jÂý+ìS!—9†)DÕ‘*`‡áü äF‚Õ탷rÈ#½íðÌ"Ü0]nYcÞ\ß&Íø`Êá¼e‰½e‹P 1â¹ S’î$ÆÆÎ}Jìœ÷þP‡i ÇhQ,á F*'fžÌs¼Dôø- ?M‹¯íÙÓ ä a§˜ï1õA‰ói½´n’·Ö—‘Y¹ÁÛ¸aË:‡ Ü'[| ˜‡_™³Øß÷fp€ù‡Ve•±¥™Æük;Õ°:ƒ­Úõµõ#°çŒú´êú}• / dQ`ŸïÈÚí‹ù!JBðÒ‚8„¹M†·\qZÇ™XbG˜°0!Fƒˆ~1D¼%ÔÓÔ€ l•6â‚k;èŽÕû²2TÅÞì«2D˜ÂñH}Ó«¤„¬oË&Þ5>7÷ó~6O ±I8ÄjÄò˜R1=âéqˆUÎn3ÖÁü…ù˜ âÌÐTÕƒÃÞb#‰qŠcS›ذÂFqÁ p6<Â@ \~ #_‡Þú£Å„ñS{÷rÓW„»`½‡ò®;Dc‡¡9b 1Fz®ìŸ6¶ç-cñyÓ…¬ 8BÜn8 @°÷0Þ°®äã…S'"”1ï¯. VX|¾|á% Ç`¿Á”2¥&:Eó‘¸Ã »áSWœ”{«]L¡£D#l‰BŽ$Y. ÃܱÕ?_Á(§—×_Ý\±‡AWvctò6ˆüM<²Às"P&æ B'áoß.×¼¹¸` áu›«wb_±!ñ­}ÛÏ»åIÒxƒ™’•³§#­Ø466 ðýšÂÖ}Òiñ-?ª…}"ÆuÛ0 œû#s‡É`ÄœDxûwü)¹¾G]Åš"´ c–R9¡l9ªuSM²'DyÃ%"p˜·ï€~åıž8Öî´‡ Ë96§§œeGŸªfæQ1 ™òŠ0 ^ÇJ`¯ A#ä-±LVur˜B°tÀ¡õó*ˆhJ!Ò‡ñ—a a¸ãÀ¨°ÜÏ Ky¤j8Åd3ø%rñ(o-6Ó±$2Utsñ²ÉõÔ÷ä¹*dÅÁÙ°Í•Mç¨ÚLþ«`«2œEØlëó)Ã%“‘•y´D5]…’ªxä.e@—|Â9oWÍ©HƯ.æ NµŒM˼Íf²Q„Wè S¹ Qqn×êTÅh{!ËJ×¥L„ááüd<‚÷cpE!h½8\ù…ðxÈ%Øv,_| j\Tó)Þ)ÆöÃx\o BàáNñÞ†Càðùà°OøÇ\Ÿ-;ÓŒö,An–¸ £™\ðõíà\w(FÞn r‹;0ÁÀªo Ê”„­Š{>áEv s¯ÍãˆaÓ“¤b¸·kU‰ÂE‘L$Ëzo´wð¦®a·dƒø™:S½ûÉpÀ´‚ÝÚ2f,9¶/#Sc/\„)ÝX'ªx6ŸJ™\¬‚à¨ü‰<à‹*>ÙvBJ­æc.ΛbUª+Å7‹ïæënªc£ý¤±ÎðXð!SÉið›qDn¶H¯–CÂìôY xû‘®>‚Gð‡Ao”àëÆWi&<™B +Sm{‰pl>GìwËö.ÖžpU½+ÞÓ©JÆŒoëÛ­3¨¢9Ue݆:Á#Ø[Ø¿Œi1[œ’+¬ “4›«”¦Lé×AR-´ [¶¿ 9â%VXK5¬5t×Áz˜¨Õ%¼·b }—B„ýd*¸OÓ¨{÷ƒ¿!"¡CF+Å:¿dêS¯ïIT ¸úÂ) ó°j=sA;êRU©ÊMø…ú Çõàz¢XŸáSÀë0°1G%2‘«ËAÆ#pŸ;ݲÄg0JÉBVeµk*;Íg˜ÓW/÷v ¶yÊ˹ÖärW+Ã$ª/ΙûA+µ.¦^™ÇÖ\9ûªuRÆårpéâÉE¹ž’F g¦¨EŪ•n˜B0Ù’Á'‡‹9³-)!‰ëKàNuºsD1@5S™HÏŒ0Æ<ÏbÁ&& •j_„äÆU¤„úRºe‘ˆâr¡\]VŒ¸î ‹•Le²¨ÄšHãsa£*#UCÇÅöú†×bMð$œ–£h.R3í’‘š¡Lùó7ËÔvÄ"‚¨QL•%*8 D9B¦lÌu„±š ]ºõz•â\‘¼Œ™xLR†Šç‡%2Ú_7Vóƒ]IG=¢8u£83¸ëü™Ôg¾^†’3Ä!Nº Òú´ë2ÂÈúo 7¼ö¤,tZº˜vÂrxA}wJÕbÒdy[®oú¨¯=GÚo¸Ã• “P÷Æ%žu„Æ5:KŒäºjUqåÄÊí¥ÕRåÙ1ïŽ(z« q÷‹´¶p®’õÙòy™—Eæò7¢&ûn~ÂÔúîÁmö ­]löᾡ½¼Vkù}ÀO¹·ÇftcLaë“w­kã#½[²Ñš[¶k.Sñ†Ó`*t™Î®¶/É+áá”e¼ä”y•’RŠ˜lå?Vï*©ÜÅêµõ¨\ýòùÚÚX&¾¤á…}Ž$W5‘$bĉ\&ƒê>£†·ÙU2X/öæ…‹Þ•º/NÚU­°Á„B¿Xr}…~FP§D™«lµžÖmf¼ÏôÑMF­é+­Ö–+€|½pgÕpC´¤Écµ-pÎïóJùU6šâÒ“Ò¸(b­ýºJ.‹ÛT ××uFb7fÝqTsáÑܼ ys+£lb=øÖkö Q•#qÏî÷Ç#üFn‰öä¬(rÝí–n‰çýw pÅû(.ùK|£o¥*ÕÆ_©ôfâ‹Ð…Nåáx‰K/{Iæ»+½Ü¿w_ì ±É¡éݹâl‡€k/…˜Ö#¥uÑø²§èb¤Xçç­_bšrqaˆ:‚Ô'7-vW™©oNWm9,f„¦V‚Žcx-g(Eeó‹iäbNÊÒ»V]i@*æ•9æN± ˆëtÚ%¶ªj1r¡Yøö¾^‹!BNSž[ÂW½å—¼$ÎŽÄqEˆDŒÐ( EJ\JGYp±øTfÈQ¼@:ººŽ¶'tÄ̵•ðP?Ò‰Éõpâ›è]Ùžë×ÑÍ/Ò úÔ)äÄ”ö`|ʺ~è\õ tÓq³’)Ê‚_©«ùF*DWΦMÁœÞŠ6Ñ,å `l¢ùPp抋Ââf·ŒÏ˜ikáˆÖö¸ ƒ0‚ „3ëà&Ù9è׺&" ¡§î¡Ct*cEèG× ˜01ê ÖˆãÍedü w¥:Ñ9{d…²™á%ÝmîXxÈâ /\L‡ φmb­>]›ïV¬•E5í‡X“Fp¢Üýе ² :öx|ø¸ËŽø]]¨XH²ÂȆ÷#ø1Ôx6|¹„ sÅpÈŽ@;ª³áœXÌêV­|Æ ‘mOÅ,à™8,²·â×^$0ñÈ}îGP˜›àlÂæ!×b;]€ËAµÒœ38ÇÎþaÌ´“ágÉ;6fÎdÕ(do¡4Vä¸N^ÆÈÂéKP½áÒ‚Ù†¡Îä”b ­ÌPçdåÐ÷Žo–õ©êCsÂïôŽ…ñ™,a,XˆØ„ÂãþØÖÊhéW§,O¦º|ë”8l®ži>R•§T¾9¦Øw½.À,áH·°·£† ï—#@Рo†lv5Ø¿Ž" ãš1xg4ÒÇZ\ƒºÛO¹w¦;ÅX–/›­@P[8‚±3D[†}ì1‚þ ¡5ÛPo<[_éÚ:á7%¤H&W Ѻ8¡#Sï¦6¢J6U‚Hq‚Èpt Sø©̬3 cÃ(af•JC³LaB&7–éK‹[GêvÖ! 5)WÐ'ÂË”žÁjT¶ÍüdF*áˆI!d8Œ‰í[Mì¤Oó±6RŠº‚ohÚ°BVšne_§ÅÖ(_’È*¥Ê3ë0­)‰àuåxð×>¯œÇзFÃÊB½¡qÇ’2y™š2%¾j:u#øjšªŒ4ãSd?/ö‰'O*2­¹#„^L?¦Û$…D·'oàÊe|æW(ì|«Q½m0æ3UÖp-;‹É‰U©S¨¬Õœ7Iue7›½Eé&G3ImTR9cyç¿ô[EG4éа ªÂÀ²é!¦3qʘ2³ì|¸ÉË6šÚÇ[Òµåç—+Iìí¹Ok…R²D§KÁi®VÄlúe´®ÜK,.{EÆáøMîÀ7iž#Ä fLȬ;½<2uɸ6‚¯,øeŸ¸N !'8 ƒéÓî^gËžÓsÃÙ\7á4¿Áa@Âl8¸‹àa‹S´à78$Í«= Ï8a7ƒ‡ñÆ<Æ¢žm5½;ß¼ÜCžUËúœf’˜oà¸&,ý2Fp7uõJç‚^n8áE¸v]Œˆkü ³‰œ£D¶”`Í`JĸÎgY›öòñzµ†)lؤ²¯ÉõM×GÕÚ£÷]9UåÑZèé£Zòò½œÙ®$ëµãŒ áåLWé™!ØX³¸Ÿs6–%÷C«r+Ó>mþ»Ni<¢6ZŽÊš¸Bs8ãv%¢±¨P:Õºöøª¼FAh&ÄJ·Úß‚v&¹ø~½–¡yb‡2ÖF4Æ y‹·ü X nzù*L^ÀÃd<3¥Kpõ+ÁåOԸŽáj+sáüS¼“ßËA:ºðÖNJÑÏ»ÏOÿ¦U³Q endstream endobj 7065 0 obj 4778 endobj 7069 0 obj [428 /XYZ 32.2500000 546.500000 0] endobj 7070 0 obj [428 /XYZ 38.2500000 465.500000 0] endobj 7071 0 obj [428 /XYZ 38.2500000 360.500000 0] endobj 7072 0 obj [428 /XYZ 31.5000000 547.250000 0] endobj 7073 0 obj [428 /XYZ 38.2500000 465.500000 0] endobj 7074 0 obj [428 /XYZ 38.2500000 360.500000 0] endobj 7075 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 554.750000 111 561.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 7068 0 obj << /Type /Page /Parent 2 0 R /Contents 7076 0 R /Resources 7078 0 R /Annots 7079 0 R /MediaBox [0 0 595 842] >> endobj 7078 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7079 0 obj [ 7075 0 R ] endobj 7076 0 obj << /Length 7077 0 R /Filter /FlateDecode >> stream xœí]Iä8v¾ç¯ˆs-.’(À0PK– ª>57Ó—çà¿oE†™Aécˆ_ükÿß_úþÃ?_:}á§VµýÏ¿½üìZÕÿV]~ž>ÿýéß9üý4â8ݰ˜ëÿjU];wZÆ©>ÛT/ÿñãïO¿7‹3JµÍAYcª³úð¿ÿõô—~‚qøêè¬Q¦ÕµíïÛVý»ºÿ½5ÃvòV¿Ì^õë×]ºLþòWfx•`pÓ/9Ùà/+‡Š2 ~ìì %úƒ¾³uÝx¸.üÇáSÀ¿ÑMBÌ9­\*ãáâÑ%·iè×).îeôàoMqN+—Êx´pð£k†?ðwrjwš×Ùž?Xå3B§z.3\º ‹Íëð Î]w'¥üeåâP°*0zbö¯»®IGD^GOp$¦ªuBd:­<™ þ5f¼’ó'@fýxñã÷§ß¾ôÔ¥esøþ—~m/sž|ïAR~=É,=¬¿ÿùðOU¥ì?¾ÿõ©;6º—xóI Ÿ4ðÉÇøyª¾ãâß©4ñÎ3|ò%~4 Gàöü½G Ôg¯«îž³'žÔðì«Ïñ˜„ß1ûðhŸàˆcx§â~ÇÂÛd»ŒXÑ‹¸wœ=†<†b›qw¶Ý½ `)¤Ó.•¾½L¼Ó”{hJEàØXkCàraaß PÜ„ô€! ¹z€`ùc"†õ猷ÖÕLóMe‹Xi–i«ó2ëQ3#еMý²žWD:oÀ]WyOÎWÆ­9›âýã™{GÃ'†çÁï D(nxžóQ¹× ÂAÔ™Æ)s4Ú©þÑ]›ŠØFÿŽvpëõËs¬mãÚ{,0F™3§©G€.‚›ò ¯0ˆ‰‰§ªcÓª¼|– êcÕ™k@~€£™ŸÒã#ŸTϬMŸ×¦Ôxb ö@gÿ£Ù@ÐãîžñïžC‰·1¹ÀÓ–¿kM<âË dò€é9^R?¥æjµq[K ÒJuSû¼›{ 0ñ&¯„G×hãÆFLE0³Â´·©N<èâ$JÎa¤³©4Cò)p 0ÓŸRÅõE=H…e¾ áÄK‚g§ˆÑÁ‘š‡« fæY‘Iuµò(³7L1¯Æ‚“ š74 ¦0ê ¿Øi į€àIȵ”jÇÜÌš>,fMxƒX 0cB•e¼[[QŸãß2ÖF»ÍÄ„1ü·ßh ‚e°¯µÝí«åßBFΨéÑgÜR5-tBÊ4þe2Ý`ÈPLL1táÕÇe€¤M4 ëZ:Ià"Œ,„¦H æ²V4ð&ä´MÂ0Àkû²XD LŒ1e2¼¨€,Æ”‰EòYŠ\ÞvmY£G^\Š]*ÎuXÁ'Ø5Ë„Ö@ç°"ö£eC°ƒºõq0BÀq ßÁÐ1NÁÎW×0.ØèáP‹‚1vµÈyw»L<Î3¸ <øìm>ˆÔÕ=Ap³ˆzÀØ‚Ãqœ„ÅB …±"pŽxLWs8{Ƴ×w…ŠÒï£Áø’‘fŸ’® ’gÖæžp%ÙÛ©06cª/* Póœ/poa(a`?˜r`*€)!Ì€('ß@jž[ëìíÛ„©æ[_°lOqæ ¿-æ7•gÅX*¶žFݦv×G:geœpLt¨ÝWÖýZ¢‹2m˜Ôƒ¸ô²¨ËqÇàEDLÀ Ž=y>1ŒSL¸Ž¢Iqè)‰~­=ª?õ2`(c‡~‚}ŸØÕ¾< 3À1å%IŒI .&ØD4*«h»©`9ÙPÉB½Ú!‘Ù)`ã§IH¦é|2ýîâ‡o†m¤ŒjT6‰)ŒpÂÂʘšØªÝùdž€[5 [’Á¥+°u[\!¬…çÁÞ+ÑyÏpïë +JÛŒ.ƒÖ0Çf¢žJŽ\Þžœ1н9ÈR¨eʰÁÎz»~reŠàñ3Å¿R*Šh„&¥ G$if2Üä ©µÍ°Ÿj)Þ¥dp£y!v4Ü PxCä°©ãÁy¨$÷ˆŒh¸AÊⱜÒQüßÔåä+°zÆŒ‰oc¥Ÿà|)–’Jkd³]7€.—ßläÛ×òŠT2`.e®Ê'ŒÎDÝè[kK)„÷òžÇb§Qú Žãs]+[ûA†)2¥g0õˆð´Z wQí$W–ˆ„Cœ£þhÑ”´;*¼ ·4溬ùù“EÄIÅÛ·Ümé0‹ÌX¾bØáðbBKt»XP[?û-½%²i=¯Ç[Õ[íK ˜Ö½ôÁ9üñ¤õÕ{ú–¬à7º§%x¡Ž¿ã¹Ä¦ÌõE⬅ bâw°y ‹ÞÄ„G)ç¨smg¥¿³Û™KDþ—ËÙY3GTæžœ DsèÛ |€ï8ø¤C£ ‘µª;vîå¥×wðªÏx¥Õ ˜=údMñÖӔðjf´έ ¾£á;tà;µ‰ª¾!8wÙô€”3•2`¢ÊFå*ýÁb‘x®´a}²òMŒ£eb`c¢”%Ü7T¦’0sdCÌ¿B…¼Ë`d!º³U,6ñº H\y¼Ï6e×F{ÜR8ì©*#«N0ÎÓb2 ?ã=!hy.W"êy}®B “%·(F¶Î`2ê.5’ "ãeZO_b"I»Æ+|ïÓ ¦LTXçe4ÛÄ4=—)ú2Ó³Û“¼á]˜‹ ¤”øžPÎpÿK=ã›uð“Õ“é ÐÇd½{™æ Ð@&͆Ñ÷"¬nËãÒ;#•ÎØt#úo µ.qÈϸúwòìwztõÿîŽ'e£iN?Z¥ÎŸuhê±øøÉ§ÆÕi§.ß2W£˜·sôßþÝž^;xoëÆŸ£ÿ¤çz%§o¹«QÜõ¿?}ü%Urð™=tƦ¡u7%0Šd IÄÛPT-Bt%È›lÁ†\ÞŒÀ<Ì9Á,ÂÒm®ÈÌ[Rô¢t]Ö%dÝ”^-Õy hmú, €ØöZ±nNéÏÆêj*€Ô‘cżã"€ØfN±µ?GÿÉD9}Ë]â®çÈ €Ô—2†»R’²¥¾ayƒ)—°> ß™îûeº[§TÅÏåEH·Òw¹1îMW„ñ' Qeªìš‹´Ê¶¥,°YïbgÛd!Û·N=½;·s—‚ŒL»ÎÄëLÄòÖ/© ›È:q0m6·$ GHÀœ)а ‹"¢Lð&“Ȱ܄ÍÔ#Èf@fò 4ÈV0Þš­´¶· ”cM^^_¤åmLŽåßr&ý𖩍¾õS‚ø2qº_*[k4Ðã™P§DŠO 'Gæª öËè.uv„˜[9¡„Íž ëÇÍತ©CÝÜW(S^Ž£´P\d9wdÚ‰˜T)Mmæ@¼z¾ï£¥0ÄO}W„+>GÓýäæ-Ý_$ÜÒ÷°/s¼¶‚íÏ~Háò³«Kß7«˜¤Ì80ÊCzµÄtw­”èZalá×!cª{ôLâÖV^ö¶dõ3ÕÍRžæLxì¥cü—Q&ô«xÕÏfž´ÃŽô¤ÖøŽ­CïŒv×úxöÑfFªŸµG3±»Úøæ©.Û“²Õ3z‚ç¥y=‘æõðÄŽÂ×wðiÃ'Zk³hÌ)¨Â ަ!¬0Àgz©Ý7)Âú®­£Á'µ}‚p;Ÿvs4g„_´¶ä"Î(Ö»Ú»˜Ù"2QP"¦2Y– ùÊÔÊÅ,6mS‰€ðÊ„*1>V¬ÿ1òÖe‘@&ºMÄÙOHIL./¶gQjãEÈ¥hm‹S:‚µñУÞÆ:I¹êDd#{Ek%v”Ɇç¢/ö„e•É1aºƒ•ç–øú,w±“ÿÕ-¹Œ›.&WâÖLÙýÚhWMÜ—”ÿ‡$â ´µ(÷/Á¦™ûn, ÏÚOpc'!/Æqu°%f7TL:!ÁÆ€lqGÄh.Q’$E’@z»žªìh{Ó‚”p­ò6ð yÂs˜ôkó탌‰%Ð#KV‰eBÕ"š™2$AT¿Ù”C)-»)l7è.Ûq„Cf¹ä#l’ˆ0ôê$ͦéé%– X /¨x\¹±äˆœýÔ_9cïH!™&ä|MW{œ¯\yr÷!„·ž©µàúormɦ Ùög{šÇ i¼¦•A oowÆz”¾¸¸ ”öš¤AO²#!&Q5˜—·S¡êÆFptŒû.PLîx¦Û*¸Ï§Iß)Ïa¾JóP.îˆ>"IqŒÝ=W`Ó-2ž2ZDYí2ÊÖSQÍçøw˜ˆÐÕŒçLY­‡ïý”+SSV³™½cb,²úÉÛ+„8v­¯=1b_à41>1ª˜ò²b„„çA¿ÄÆq"¥#2e/HŸMž Eðçn ~’Ë£ÕÅz-7Sw¥rlÒÖY¢êB¤m‡MùðS4ö]¢90uBî‰Ô{ü]b Wc,8"x=“íÜ™TõbBøZâI Ï+%ùˆÖ$LÊó¦,ò»YeãZAÑ•kv|ÈŽ1A^L_sÂŒ@N“%s¢¹ SbJ´J…IS‡të+›.Û3øºKº”n$‚ÄEK®,!Z%€1_ˆúÇ$…8Ágô{|ƒ…ÇS2ÌÆx¸A„hR¶oGx˜ª”.‘9-J™#*ïe3ÝH”[||Úô`±Ö©åYÁWD‚Ë$ú¬×yË¡i)‘lãqË@h;SÖæÁd÷MYÔÖNÜÌ 4í¸˜/ñ”åý íž_úæ ²ãz|K$˃똵&«/ÆÏÈÓ1ÞHQÁm †CÙ |áX¨’ÌôµrCbêQÞ!Œ<'qÑèr—e58‰Þ˲y§Ùª^N¨‰h=\áÒl‹d¯b¤lŒèt‘ ø{ë]Pº#Š5©[Õ¾ºVÌ¡m3 P6:, ˜11XõÚÂf¶±V ¤pÑ<*Jh‘›R”4Ê`sÍò brêº~EÕ–š6¼9øò4O9ƒ°;¨n úìÇ0ú…Á \Ï!¶“Í=i‡i?.w(z2÷Ž#Fû ßéÐ;ƒ§ì4ü:ÚktAg®ÐÑ6h´ Cçz2àHs4/§}窵‚û©Ð~ðª‡víÑL0»Cï X:3Ï`›žÙÖ™è¸i.=X`%£ëˆ9B÷‡$’‘:d‹ V‘"[¿²<’-\› D=æT`&8]¶ŒS牱EÈE²©Ëóa)«¡ˆ«dÕ&“ý »…©J]éÝ.C¯ÎWn)Ó ™±zL|gøR‹Ÿ 8,U‹jõä\Ö©Ýð{và (m²NÆúa [+Æúzèža·d±»ü±Ë»üq'É`_swÞØ}Òù¤SrYg=dܽÝÛðvSQoBƒl·;Q“{¶å\ ¬<Îð šLI)žzju#E «”I‹µÏ6w…©$ú¼+LÜùìÛm¸Æwõ¬ õìáC†SêŸÊ*“®¦ŸÝGs×K”3î ©é Œ¶º]jm52̘ñcaÍÛbBJ.ÁûI[ßšê:"k„€2«:D±ÖÇÊêÅ]7‡àa=>ºëø1t"ZÇhÕ9²MapƒD&¿<ù{M%E¬ñ"¢ú`„…¥”Zé)CŸó11A”áG¤Û)Ñ$J¨¬Ö]Ë>¿¢>óWdQSdiÜátâMs< üÇåßíѹêÐÜÿh•>íM}|ÙQÿåá“O=*ÕiçÔå[æjóvŽþûÿëÓkÿm;™ÃžÞñVÒË]â®çøýéã/‰®‰nI{‘’¡€­³Êc”±–í&ïWž*4äÈ™cuey§àÁja¦ë»p&£Öò%nSSZ¿jï]­ïð‹4µÖ­ñÞnߦ=>½Í‰80™b“„ö<µ<˜SvCYt{Æ}’/q¥m>Õy\kíàŽþ½hXfW_›Q\3gFqÎ7qôŸLÌ(§o™«QÌÛ9.fgçÌ(ÎLæ0S3Êé[îjw=G3J§nj»åaÌ(²>*"BÔðŽÕªð™¬†=¦Lç„yLôîQÂ#SŠC4ðf¦£”F‘Zyìk}£T®8´âŒ_{ÈèΛvÕuË=o`(„„ñÖ p­ÒGÜt¾ª¸Ûìîâ xIwÃÚê¯5£«ëKµc%w³<_2.ËæZ=zW+P™Ki¤ˆbÚ ªp<Žmžà£ÖÈ*rŒœŽ±ëƒ¢„­/<À <ÏQÎzy2\Í„Æ0£Æ¿ˆzÓÂê;ÃHÖ¬;d0¾²B*Ò_´ÀxžòS¼£ºŠÇ«¬ªÀ ·çþuÛ]3üîø²Ü+ð¶èÉpÀ3O m°¦Î=ùçiâW`?ÀwžáN?ÂýÀh<ÜO…÷Ÿ h9÷Žƒïà'Š8WßÑð|*x ƒ¿/j îT¯1tXwŠïÏpç²ÜôF™3š¸Ó"°¢ðnVbÕ @Ñ\tܳÖõÍÀЮÀyã±G¬×ˆ´ö&.%Á²¹Ñà™fmxžŒrAÓ™;à[Cøî¿ùVéëYçÖÓe\O½àæ¯Î7Æ+¼15j›îËòÌê\1T’‘1O`P‚ÎyŸ\uÉ`Þyù"¯FKï¸ùB¥bV ³±Î†©,Æ1Bæø›åëÎÖw`9–¨ÖÇò`n@оÀ;:þî3¤ØSȉåM9zc·¬°}‡Á$l³Å—õomÀ:IÀ Ë?Œt¿µ7o­»GÛG·VVfÚ©CÙÔa›rá´¦»Tð¤h ¶aXaˆ0´†ÁŠ’%„³òìzÊV%ž\k à(†u¦UO½µºžï!} n׎†Ã@|ŽcÅ@ËK†Q™†iÊšáì5Ѥ”ÃŒ×+&³ü$™Cx[C3ñÅ6§š$IȰ(±•VpТr²g*7ÚØùǹ’Ó¤ DDOâÛ³~?™wG±Ö«_m{þh¦üÑ´ŒË´Ö#‡ëbªm|²·ÔMʽYíïm¯Ù›‹ñĈ`L;#&õ«äŠS3q¦&ÎnÊA ›Ö§2wÈñ )F[M(Æ“£î6NOŠ)ÑAHò+ø*3¶Üí(!®;W{¸¾~!¦-HÊVä ™/JÛ+€îe±¦,à (¤ºeOz㢪ìM”X›x¤dÙ­ 'fT+,¢‰¶Ö“±"2Ò‹®`X@Qºd“ñÎêVdu%÷ûn½ØNOÜJJÎÀ ¡l‹OQ D¸4tú21ÆÖ¿©8‡1¯ ¯p-ÓµÑ(ë­S¦„ãÛ´ËàmÉŸþïág&Á#ûzë ÎÔÍzÕTvêDuÐXAâsqÚ™{r&Àú¨Ï²Â-›é“!¤L‡ ®7\VA\ùŒæ1·ýÜÚ¾ ;Euº0Á±>á Ítƒbc#æ#3ÛPx4øÎ@ŸUÔÖÛW´eîô{¿âñ !ìPXh"cˆø:½À‰c¨>£k0Xì]‹ D5üŽÂÛ`€Â_ƒ»°­Ìq `W؈qîb–~KÊo‘ñÃ×§ÿúf¯ endstream endobj 7077 0 obj 6430 endobj 7081 0 obj [429 /XYZ 38.2500000 304.250000 0] endobj 7082 0 obj [429 /XYZ 38.2500000 304.250000 0] endobj 7083 0 obj << /Type /Annot /Subtype /Link /Rect [81 655.250000 172.500000 662 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 7080 0 obj << /Type /Page /Parent 2 0 R /Contents 7084 0 R /Resources 7086 0 R /Annots 7087 0 R /MediaBox [0 0 595 842] >> endobj 7086 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R /F8 8 0 R >> /XObject << >> >> endobj 7087 0 obj [ 7083 0 R ] endobj 7084 0 obj << /Length 7085 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àöˆ/=€ ÀŒ=CÃrXäÌf,vqö¿uëѶ¤j~"Ùìn1cOÓ¢Šõf±ªøéÏ/ÿÈþõ{öéáå?Ù·îûÃË.ß—&oÿd‡¯Þ «}÷sVV&ûö}÷–½ížwÏÍ¿o»ö—‡¿6?ý/“Ù_š¿¿d?þ½ùð§î—¿ð}Wвùþëñ{]Šæ§|ø~øüß»¿ý!ûí0cÿº˜ÿÿA‹Â˜úÆÂ«ßvý2Åñë÷o¿í>µp{K¥”U&´Ò™¨µÌþûÏÝÏÍ úéó}¥•P¥4ºù¹.t™›ª’ÍÏ¥êþ°//åñíFeBÖ þ‹É»_~f&—² 7ùrßHªÖÉCS[©" µ‡ÙCD nò#䡨 'MmÓ¨Ã#ÊjgÃì!R„¤örßHé© 'ß× —*¯1í JU·è)ò*‚†é`¿±tµÄrïXéi‹g÷H\­ËA²@ÝwóûŸÜ”:œÅo!÷–޼3Ó?»Lƒai?Þä›åÁ/¯»OO ÏÙëÏ hǶß^¿ïtóŸƒ3ј‰×Ÿ²?æ¹zøSöúËNˆ½ÑEÕxÙ‡ß;Žäò8Rí«:/¤ÉO#âs;rúU}ü@ïµjýôaD+4’?À5ž¾@ä%©Æ“˜ãª_ç»åh8 DAþõ8böJVâã^Ä’¬á{ ÔÓú@(ƒ ÝââëkÃúë¸Vh‘Æ-M˸UÑ3n»†z&ŸÒfnätëž‘Òýa|ÂÖ1ùÜ{*8‚±SÄ£–ÌMÏ1â—Z~9 S+ÿLP ¯ó²W\+G´/NZ°V²¡pNÇaKp Y`C3™ëaÆÖ2(ÀÀÂ÷t\4ãfˆͦðˆHÅöy¡q§Æç\8âÀmæÂÐ?"z©^S¨î¡3F,°µ”ªw¤Îq?á3˜cüzr²‚ëÁ`5aQ(”íCøÈ‹ #¬“ µžWï)[È€ÖÎ1Æ–›Gw]/[Nù¾(ÅG™>_Ÿ2JÒ".XÈ¡ Yt¢ßm¨@èÊ[Ó(Ì>¯ÕG°Ò²ûó•£Ä{s¼™el ÆVZXß`íب‰sØØ3qƒ;v• ºðôZB¦ÂKw°w^ýØ™úN ÏÑP÷C€]tÁÍ;‹+ e­k9²¬ªß¥—…+(Ìtuco°¶§ô˦á®\Ãy‰4`hQ Påa,Y9¬+|ìª-ÛyÆòBRŒ ì<‡Ê‘¹j-ò{ð‚©:ÕX´0°˜ãFQÂnÊiF#Ê&¹Y•Á¹©ý³¬¤}öZ-¾ö¥´o盆חJ Ç—©L; æ0Uñþ¢Òå˜v ©Î×å)Ÿz0›G昀 !,cq©Ïæ64 °±+xÈ!Á óúYq,I;?YÉ"`±pîãìÎrÖ…·D_Æ/Ƹ¸`¸Æ(9²–†k(Ëwl3ïJuÏw[ÞUòyWªªÖoÞ¶¼+×Sež+î;¿Kkõ‘T[~×µåw]gZ@ʇÿL.“åì ctâ2Ç~^“¨<ûtñ"Å’·L¹RÆ:¼Fº?ä&HcãèÅ4ìêRƒy„I¤8ŸÞLB“°w;ø3±…8ÂAøLìrMšFBÇ3Ô·D…±`ì‚Iq$M¨¥c¯ãâN4¥"™Sü‚ü‹âò¸Ñ†c+™žÎ‹f›bï]‰=9åx2ÛNÆËcl»;íY-u%’ÎÓí…ÞËqF,A'æ¸3ŽZˆE+ä²T`î ëž[Ì»Ç3)·@‘¿ýÞ¢½§–˜´nç‘Y8Ø:-Ft–-OÏ„•Rtïï×e,(³)¹;]Ú ™˜ ÙAVŽ¢¢W²ï;Uï?øu÷½õÊ„ò{ùبeÃɼ‡ÙóþŒ_ìXŽë™œ¶E3œ‡º\³ñ`ñ–[;³bÙ’‘‚ ß-ˆ—F^u•‚9Y³éºÑà¼çßÍÄ/cF²4S†p‚õÕ&x™-5¤ãEKyc0’p«1Ï+N§اÅö‡±fÄɨ__“ê¯q`Ùêa¼9ãT:-%íÌÄj™–@¿‡\1‡3¿Õ7åEDU>•ƒ€}u|(zq¡¤²Ö"íò©£hc‚4 Z¤Çöó¦Z“„õ:‹\ް—f Ñån¼£òmd²Y‚]L3ËÉûóœ^5Y ƒ‚£”~ë(/=eG'VÃ³È &!{ˆ 3Öª[Ë›²^aË›F®Â`ŠÜ”×l1©¦µ_ ªdJÊ yÜÚþ]Þ·vÊѤN“¹ÍbЛ»ù¸iû¸¡ ?/®Pc]ÒKRÎñD°0¯b?k‡x€ßêhÆ-8ÿHÄ2IÂ'1'èjdGot#~;Ã"/ÆnO’ÃB™œé:©WV»mq¾°|(f€YŽê7]$TuÞwM\¼•¾„Œ¾ö‘¯Âo7 ÆYd‚/ü3M½¦ï2F”³Âd\ÜYÙZv¬£•ý~͎赓2H:B@² š!x{QŽ×~ÚnÈã­>ë§ZÞÅPYj~ói/Öñf’æî§0'¦YÒpbžÀNš""Wœ’¥6®°$Y’8ðJ1'a …Sè"rE1$‹ÜWà䢖fn$íVºÐ}qX­ ?k ÷Ä*Æ©¯ €×ƒ=2¼ž§ˆ4©¯2¢SI –æ,„¶¤übl¥U1ËaKU.ò¬%®Î’Ð[ö`mÌhp"5˜ñö,E`ø=DZùå= ì%£ÕœÒ½%.¸K_;q¯Æ»c¯r³¬º> endobj 7088 0 obj << /Type /Page /Parent 2 0 R /Contents 7090 0 R /Resources 7092 0 R /Annots 7093 0 R /MediaBox [0 0 595 842] >> endobj 7092 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 7093 0 obj [ 7089 0 R ] endobj 7090 0 obj << /Length 7091 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯èsµX  e ‡‚ä`äÈqÃ62ñ!?ì!9ÓCö÷ØüøªH¶(ÁžÑpºøêÕÛ·zûç/ÿ8þë÷ãÛ_þsüÖ~ýðåŠ5Žç¿o.`ËSûý±(ÃñÛ¯‡ÇããáóásýÿÇCó/þZ÷¿£=þ¥þïçã¯øcûKç_øõP˜¢þúËÓת0õwÙó×óÏÿ}øÛŽ¿Wì^×óúßo¼)‚ËÎ`Œ¼úñÐmÓ<ýýýÛo‡· ¦½¥t!˳£ñÎMåíñ¿ÿ<üT¿ [>;UÞ˜"÷E6çE…­ßä}‘­ê•l^ÞôôWi}ýÅCá]´ÅÈõÑb\nF–?•ÞWØàÏg}>çP–¶þ¾pퟙh«Bƒ¶¢œJ·|„Åsçã-Þ@®Ž•öÄ…Õ#x^ÿ»EZýŸþ™¼,añ<‹'@ÈÕ±Ò¸°º¢ÏKïÙ*Šž—°xa\¼ÅÈÕ±Òî`õÏSVÁ ˆVÆ£ðÁ÷_o?ojdæÇ¯?ÕÀ=½³ùòµFJ8¾9›…?~ýñøÇ,3þOǯ?ªSnCbó$+ዞ˜~¿>q“£'¶šuö>ùaƒO<|b0F1Ôá“øä„âÚ“³fúj¶åq€éÚ5<|­Ù8:Vî5“¼ÕÛaÁÁó†Üà × Ø†§*pjJŒ83J͇éOðjîÝt %ð!¿±¼ÃTÁH\]É!œ¦X,S gàýXxr‚ÄŲ ë£÷ 9#Ü€_ø$`‰0¶»kœÏİ9üž ñ›W·â7 CâSZ‚‘ØS!b]”ç•È®Y³6ÂRhynJë²>Ì ÿ”>™Í{qñ4o-Ýù ƒø k BŸì¾'S¨‰üµÎ¸^{Ìevoâ –°;ì“éòÃÏwæ ¬Ùz`¬ôUŸÂÊ-{gçd‚(ͽâÓ<[y#rŠÂ{°žÁYy"*‚½n—M—(k>ÓQoSoôs¸)¥ŸàBµ~Š9š»ÓuL\Cs‚„×qov’ ¥qnï”ÁSK€%ûÚm‘jN^i—¤t€;ìlA1†Ê O]89ŒœO ²ËSÞ©Ç.„ÍcY“0ÒêMêì„ÁÔGd1×zÌ3¸VÇß™¨ SçFìt—ë–ØÿÅÞ§@˜z±O†+˜‰:¹¤òÉÍÉ¥ª±Ñíb`"°Bܘà¡Êg±/H:"CÄXüIé?Œ÷Ý(Óÿ.ÿ“ɆÊ؈¸Ã ¸v|VÌɨ§ŒéùjN~ñû©'Z³?Ÿ’²ƒ™“¥J#?7¹®‰ÓjV›Ã5ªU6†ˆ®€Õ„–,Þ)Ôþ”WFxçB• S³IÛˆ±Ì×L‰k¯N ù¬ž­mfup¯%!;1lºRh›A¡W^µ#sÍ])ó~¡L÷Û¨7°Iž*§Iâñá…­÷ó¨mø=õËWå÷ä~NÌq÷{Diƒ?ƒ#qLå7£Ñt½›Mv0QO‚õë£4%Ÿ]½»J£DþÈjhl’]±QSµrp÷nZ¹QMi“IÔ¥jna۹ȶ’m)lï­§ ðTŸ5ÀÏ.Pã$”§²Êžàé³Ùµ' BýÉ»f ü ¹4LëNõwe†dYö9òÊ"ƒ_5gn^uø«9ZÕdpçèfy“òœ·Þg.NYå^ãä\­dÆvnžJ«Þ®í'´ç朗»³ž 6øbLm gº˜%` hA89[š[i•y¤ÈÖ€4¦#•¾1x…òýC:ñZÚ.ÑbÇZó5à9£ó:<•ïÁ#9cCÆ&ÄœïBÚ‚‰B4t .cð0ŶD1¨Å-²ø Á1ï oÄ¥_ëªYгØÓÁÈ"E¨Î†ï ˜0‰ù¾Bå *™ ¸v …EÞEùq¯5\uâqë;&ÁH•ùñ³ÛŧðÄá³ß®ø¼ bƒÐ¬€ƒ™xC!é1lxð&ŧ…ïÁON­1§wбƒwŠí_ >9,æá)8Lo+æ µM˜º©l—ºÑU°â _”bp€Rý1-ãð0¡¶Öœò¢” yâ"y¢ ×â'XvbºSêi807ã'¼tÂÁÞØ°A÷B+VbŒ”?ζãCÁØaL=l¶áya)ÕuùüVUuí ƒŒ1~™$îj¡Nù¼–s»˜ž%¦±òÞ®˜¾ }4¦áh÷”)O9ÍØÂ),îÛ&T.yæºüî Šg¯ê ¦ºnfÞ1$KÕUxoyö\Ù²›¤÷v‡ÙÌ ²P6 °°`*ñìñ÷A¤ E ݹ‹ûÐIyÕ%ƒ”9œL¸oãì8<»0–„ñæF/È"™0^<ø%”½à–ôM }Üžµ¯Ê„.«+ŒmºkMsSVãç° ÖïN°¾Åâö•Ðï¥JK¥B¨DâF@a#>…M* A`ì$T6{.)ßÃo{)«tƒyk…œ0æ3Ìáþ„Á<ëóñÞÍé ÞÏvÍœ ²X³™³boôK1r›w!Þ½#m)†ËÜø¾w1-y£÷XŠqA‹‹iªbN·»ð3÷tq\c•˜R8Û™•½7œê×Ô«ÖÃ&Ï‚È]Q¼–(W:¹U&0‡ùaã;nʆô'àîùV'\Y„–™a€7ˆŸ0SD ÔÔ ~Oªi ½ˆ++mYõdÀšmZæb—€gª‚<0Vìâ¸BPj–"T?•éÑžùyM4gÖ{ MŒ½2ñDJŒdV•d”>Y^–â÷0§€‡@Á)6ØpøÉí¶/ߦ(¯©_ŒâR§~û„'ÊäaÈ Ë-OÖ·O2k£xÆu˜œõâvÄÜ$K¢0cjqäOáA‚VmIt†'0å8:Ɉ´dUõµäݳ3`²÷ñˆ7芉{lXÆÇúˆô¨ë¬jן\ˆŸlJmŽ©×Dkç¸yèÉ—Ä£™‘‰*Ë l4ØŽÚð»±ÈWõìyÀД Ì ÚĬŒiSg™HЦ‡´)Ø\D KØà;Ñ. œ'œ\™ûð Ïž=£¦, }lÛÍž]ÅâTĨšÄtw»æ>ïêk¿¯>ží#bgЍ{lª|! KǶIQf~.ÅQö"! Ù8ƒSW/:ò}<ê<ÑqãQ/Ébqëf/á\K g(Ý8{늆‰UYU(<%šI-®'ÂŇc7ù\{’Á'8 ­Ú'Åܸ((&OÜ ¦[W&”0`É•*º–»®}ª½ÖèJ]™^a2éLX*QþGÙ™äªaı3΋\ý„KéˆÐÜ” ·nS÷ž~ì¶—LŠÝ ¤£’ÜWM¥£ÕL˜œI8C2ıš@ ¹MÈ­0 £3®‘XÃÓS,ئq„ÎÜÛ)Xc÷Æ,f3¾‡)FºÄ¦@>W—ÎBÞ§³5j ôœèÞcÁ':Ð1lØ'Œ_¬Z8Ó§‰e²â èúÛ!Œ\¦&‡hY Ê_c´9Ä,ÂÊúÒÛ1 é1ÖW²ªÆõÚfqfH•Ê ÅkËqew”[UãÚ ÆØõ zÉ(2¦ ·ëE ºÝã( ÄQ0.`¡ë¨Ã“*Xk˜öÑ…ãL`d̲K« å(:”•ò^V½—U/`@N𸘘É]5Δ}é°¸Mã¢Ï\‘÷w½Xˆ ØE1‚)Rh„È‘bïû›ØcazÑå¡Ñ€Õ<÷aŽ™½Àx*Lþ‰±Þßì´:Ê‘Be¨Î a¢˜”í8@Þ:I˜™„ŸµE#/?ó|áÆb­wwuŒÛJˆ7Hy—xë· VLŒ0ÑÕCTåB{êÃ2¬Öx7á”Uî5 ½ƒ«5ˆ4ö4Áï$HFØ)SÞ3¡›>rZQ‰x ø@”s«©BÍØkãP,‹cDvbÚÞ.ï+8Fp2ãv˜ø%£ö=Ê"ˆ‰§.¢˜Ì@ÆþfTU샢Yk˜S©›Uˆm¿DƒÜ”“*?F!mÌl_lO'n0di²¢êkö±ŽiU§¸‹†îìòÁ½/B¯îrÃ÷ýà´ÆAô¬©±] Ö ÉÉbªo`‚õ Zׯd6˜ â”Ò·{ù‚ÔÆ’ž°8tã43bÊñcl…y¦ýDì–¶ ™kh‡V›ÅG?c  ÓWKlÍLj…íÑe®«öü% 6¾%÷(ÙÿT–fôÒÉwÃg­†m[°.H~©2eªÛŽpuSoªCkñˆ>ÕÚBD¤™x°Î !ª=ȸ©¤Z¿ò…e§ ÁvîÔúíÕáFõo4{qûÁÝ[Òá;.¼]aŽaO ÇC¥!0ƒÝçU&QÃÍÆõm`†/tCH©VÈ ë±.RÂ÷—3dŽñ(Ä=šl1"D¥[ÛDùH“ïIO{ž²LÕÙ1˜#¼ÿå' è$è”AÇW¿yÕ#’5΢šà÷•éq(ÝH±JaôÎÔ+¸%5U½µðfÓ¬-Ó†h?Y“`:Ú5Ø ÞØ7ŸÞbš2ÂY™ Umï­%fóÂ)ØTÉ¡R&,pKø Îà0«á'ºÔ)øTL{r/³3'›oJaÉ*Ê솒¹KÜA)” ”¾·Ý½b`µYÕ'ÍÈŒñg:»²¯SéÛES¼–쟙£º/Ïͼ:·æ'7¸™RF2°y|×ÞÒºì€Âò´)–jÙ­0š¤¸Ù(Y>©"Ü~¾%Éè{¦†^Í^ŸÈî‰êÂé¼â¹—ѾúÉ/‡/‚‹#ýž`è1C‘QÛ;]œŽ'M6»máQ ¦Ön)ϦêõoDQޤ§™ã[C' cM#!¸dÊûâÆW©™d̆E˜bÝú*¦<cG¹ß]?ʘ“«¼'G“9/øXûh`Sºydå3ƒa6¸ÊäA‹6Æ/w.‹¢ÛÎÖá««q¸^€Æ\+\8Œ¯îÅ99|½41Z¸}l?IN¸2aô„Û®©4ð8ÿZLš[Gy ™V¸oL‹˜~ZôÄ óÕPé´ë a޼ÅA nœæÕê?ÌYxËðTfœF0¶ñÕö˜Þž@<¤O\z/è¦Eƒ÷ƒ«L0ecðNq>6,_ ? ‰nü,E°äÁû!èm͸ƲO؆~F8 Æ~ÖMp5OÜ8#\ñLp#–£æâŽúïñ±í¢äÿ<ö 78gåõ;|Ü)3g_ôh{Å×â N‹+nMƒSÛ•£,ó|ø¤Õ{öÔú§j +ô½ÇÅ.¯Áö©Ý)rÇqÄÊ¿€”A`M»õÁ[&À\5re¯?Ó’­™´õ‹Ùq,Á¿¯!îâŽ!ƒã.q´ÂmÒé 'ޱú€Ø @úYÀ ÄI Æàm0HáÙ`™;µì5BšÃtj.Âg£Rúóñóáÿ û endstream endobj 7091 0 obj 4446 endobj 7095 0 obj [431 /XYZ 38.2500000 384.500000 0] endobj 7096 0 obj [431 /XYZ 38.2500000 384.500000 0] endobj 7097 0 obj << /Type /Annot /Subtype /Link /Rect [248.250000 166.250000 343.500000 173 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn52 >> endobj 7098 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 151.250000 534 165.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 7094 0 obj << /Type /Page /Parent 2 0 R /Contents 7099 0 R /Resources 7101 0 R /Annots 7102 0 R /MediaBox [0 0 595 842] >> endobj 7101 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1500 1500 0 R /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7102 0 obj [ 7097 0 R 7098 0 R ] endobj 7099 0 obj << /Length 7100 0 R /Filter /FlateDecode >> stream xœí][ÛÆ~ׯÐsËœ o@QÀö:úPÀ°>}(œ¦Euóп_j5”´C}‡œO3CrÅ,’Ý,WÙ3ç~}ûçÏÿØÿë÷ýÛŸÿ³ÿê¾ø¼+uYœþÙ¿Þ\ÿB7÷ó¾nÊý×o»ïûï»O»OÝ¿ïNøüá¯ÝOÿÛëý_ºÙÿø÷î—?¹?:þÁ·]­êîû¯ÏßÛZu?çïÇßÿ{÷·?ì;®Ø¿Îmæåÿ¿±ª) uÜÆÈ«¿ïúcªç¯ß¿þ¶{{@Ø[S…Þ+kì^µVïÿûÏÝÏÝ úå‹Ck•ª+[÷¼¨ÖÝ›ªÆv/ÑmöV ^ôügù‹×ʤ[ü´óèPQ¦Ròê‡Æej]ÚãE/¹lÝý\÷Ï@kªÐÊ}ÜI¿|Š ¯Ë2!6w*îÂ…Õ#Rsݵ² @tY>Áâ­.Ò-þ¼óèPé/¯ž˜še¹YSÇÛeùwÒ” ’-þ¼óèPq.¬‘š›£úó  *…l¾,Ÿ`ñÖÖé?í<:Túˬþ)d¼•Óo€þø]øàû/»·?¨î}{Uí¿üÜmîù§o_: ”û7G¥ñøô§ý‹ÂÚùe×*]ö[<=Q5zR¼ƒO4\­BO4üŒm‰4ð >O‰ž”ð3ø<ÂIŸÂŸàó(7:èÀÕ” €U>ÁÐÁ縣OŸùø¥#ÖätÖ swn ±â ÆKó‘¸{LMø Ü…÷h1ÆÂÖïÃw€1S p¢ø ^9¦tŒÿð„“½ ÜÊᤠ=ã]ã'ß.é´ÀÜžË6wðÞ˜Õ0÷&䡯8 á†?£1?À²c¾‚²~£aÀ½a¸ ïÁüÓ†~‚± æ‚÷bîb3ÊêÚŒêÄóóèEëÑ+"ê\VÜ£Rª×’0.Bˆ(xn¡߃õÌ}Y‹uHÌå1¾`΃%*–ܘcCèzcp¬f‹‚UÕK4Rå¡hÍ1,å#KshÚây§¾¿õ¤†ONäcÖœ‚_¾ºr㉰ƒ#6‡ÒVÍ‹];¢o¦¼ØøZ¡÷9´ ƒ~ñ 9˃Ñzùž‚€ìô;¦T·ûŽ1x1^>qb" [Õªí :‡¸n­·A͇"Ñ Ë<3ÍŠ›LÒ0ÌÚ ‘h°Áæ¡ôk¬Œ3ïSÆÓâ¯6­‡Œ'¯d,‚P {M1bâÕ°ëÏQÑ\€µÉÈ,ÊzTŸEà0ß„¯ ½V!Ò–û¼‹}|÷+fŸ´`B ôØ”Â6á´„‹K¯’}2a/ƒ]ѳƒ6jÈTÃ[0„«s~ZÀ»vEqbT’‹+`„•ÁÁP¤\²s†[Àqs3œ ;!?ƒ…-VE'|b±€.˜«ŒXêM¡»K¡ÃX±b…î‚–‰C31ÿMžÄÍ}š_iʪdÔ} jS2Ä»ªd”XÄcÚÄO–¬`XcüÇf#qÊÑ[âË_°Í‰UÊœjAiûÉ–æ ÒLÄ›–žàó¬˜M_ÐbvÖ‘+9Œ²ªÚŒ¤Úž ÊaV™z|?‹’4ÉטîpA ,Iqé´ á1¹ØðÅšA‘„Êê1YGk7Ö1…¤qh›òËg´˜]»a˜‡Ždoµ~·É§µ0ñÀu…¬ç® vBdW —0š• kÞ€@äB#'n¢ôaz¸Q˜rƒ‡`ŒI§D"DÓˆd!݉ÁŒß>Ò $’ã’v'¹bÿñÆ‚ mËÚ£ nQ§3WM¨ŸTå@AÁ<‘I™ŒšDŽåÜhfG˜œ#ÒS)É”6—‚þTŠý¦Ÿ.H?eRw¨ŒÃ¼ŠjÊÔ,窺b‚› ¼)jŠšR…}XMm‹k¬OïSFûÓ§"•‡“Ö=`~7Vs‚·>˜ökÃwà¥G“À¯ÝzBOœŠqë3à®O˜]Ìé ãD߇ï@ej{×ÝWõ¸·Ê߈ &&HDeÁ1QÂã#°4&"×:‰‘^7@7lI+­¯ƒÁ|ª_á ŒìrرL³¤ÁmÄyˆ4]-0£]ágB2‡bÐb\OA”aŒé}SÝð G!@„qr+¼kLY…k„wE8€°dö©á{ðœÁŽ;i ³9ðI1tðI±þ‹÷†o³yx 8¼R0ÐÁdKTLX¸7¼kgQä'µM"`žø…cíx¾L›ËñÝc\ÆL–[BÏ|àÄÈp..e„ žÜ± «"¬áy,VóqÐsb•Òã7¼)tÒ‚6ã*tX6 š6'–ª‚é¶òPöqT°3aÙìJSN%õ)Ù•Œ‹x‚)-Y-°XýÆŸ èhÈC3ÕÙ¡¿©”Z€M¯»É/h8®@ÂH†¯Xx‚/¿gv‡ ß-ØÃUÄŸÓ#‹xÆÎxnëgÎml:”MçuÇçaÓWh±`c–ï-®+:߀ûÆÚsàà±XTc6µ±¨‹:£lã™ð‚¾ÈDc°î‡AmÕ8 •…~HÖQÚ ûÙX‡Ä:!¿xÖq…³k7¸t7®v“ÍÜ& ƒoáµ™Û8Ô“ÓØ=þŽ2²¸ “aWc™ (,Ä,Æ>ìcÅ"ÌJ1›Ç»Æu¼˜61A,x@ÔÆ˜Tæ4â[ÀÅ¢:\àƒÑRÒGj+ÕgÀXTqGËŒ[¥Lë¬[IÜÖsöRºÙF)eêL¯ò˜ã†UøÅÌø…AKâÅBaè‚‘jmxšÒcŒw¤·¤äß®òeŸ«¤£b²ò4ØÓÌφÀp!êÊOΡúHㆈDÙ0Õ§rpƒ³·8ÛÆÝǘú_FU ò­ß¦\T®+ôòÇ;À¦U”nöŒãmoö5Ö©XwúÍ$tUÓѵl|VèÒòÏìJÒüÖå9aZªZ½tÐ0=71åàð&ޛ뎫¾Š¾Ê™«žÐT ÑôˆmÏÈÖA¸ûü·]]7׿øu÷9ž_tSäÍÑšÏË3ÖÍpö¨¿í«|Øc™—FX·0U ia;—ŽBµ°,;Š<©,­)9lç‰Ù_ÀųàBÖŒ;j›iy$6ÖCFxçòÕ­/÷AécpŠZ ã9(åNhI86A;e¸Àídñ&h²Q0G¡û“,Ÿ·¶Wð)+0m¦ÁrY€R\7ÌÚÆÇ͇c1óe^•n´Uãöëý[ †%žóó®4®ÍŽ9£-ü)6Ÿ¹»SL± „»%|©a*ӽܸ€‘Ç«ù0沧ϸd $X&fMBYÐG,\~yóæ¢$SÓØ±#œbÈL¯âÝ´³¥•¶¾1&h†0Ž¢Ù‘7Afã¨E=Y)Iâ>Ãþô}œPÛ^ÿ&]¶÷äµç[ÇãÝÖÄAíÓDàwx>ÿôE{ý‹9B´ª÷a·ã|FxQ§ñÍ?~–ÊéŠZ/((ô+¡N›Ë9_ë¾çœq—®˜^í²ôö³¶ÌO7çðê0f(jhl$¶ÑZ¢Ú¸”UÊ[ÌDþJ.—w¶ÊN|§δ-G¨,lÔ`g¢¯)L¤¤½&j‘y6Ë÷qëË"—Kå*©Iœ–F„Ë*Äqc&( #¬p:0 #xr/Pf0ÜuÒéIªT.v£qEâ=¨Ó¡ÐÏÏsÂñj™Rwp‡H­e+´™*ÁhŠìà ÔÙ(5«!†E”Dº5õËcä+¥’« {‹ÚˆÛs1r÷ Æq?¿Þ=€ŒLŽÛjkÆÖmª3%|Ö½<‹!Ÿõ<º#[Ö­ÚeŠ@¨á¹ ªŠ,ƒEêÏ ‡îwÌpL™3\joŸ!ŒÛ/zQ€¢´<[8›¸Ûâ2EŒ1iØÚÃRA9ÃgÃ8ÁÔ¹GéöÕìºÃŸ<“ìµy}ã&U3:JÜ;ÏWÀÿ—ßåÖj~ÂáVu¥ŒÛ4.CéÙ‚õ1©2oÝͧ¹ÒËâ¢+S‡£J[è)›ÅšÔ/gze#%CfÏUÈÖL).a1’脌”ª«Û–ä3š)f¤të÷Lw7¨íF­¨€ë:¹Iè܉ÕùhL:ϸ3‚èD7pð85Ü™ "ÝÂ0Wùc,Ü_ب¦GG¦³î82à„‘zx8‰(bÖa€Ç>Ž'Ï —Õè ›hnâ û©Ï W$¦øb!ŽïA蘂Y¸h‰!‹ÁÒ !³xâ·ƒAkí8ÎG XŽï§5ýÌp„x_5|âäž>¸¤™«»SаzBï1cnÌ[{ûÁtXÑŒ³åÿï²¥nV¹£èP÷«ÁνÇPx5øG8*èèWeë,ÂîvÜ_4„ƒ {õ äpŠwÐí 7Ž¡ú‘‹Ø»6+ D5ü…Á…'ƒ»°.ÌÁ1°Øq㩺r‘ŒréOûO»ÿF…ñ endstream endobj 7100 0 obj 5313 endobj 7104 0 obj [432 /XYZ 38.2500000 341 0] endobj 7105 0 obj [432 /XYZ 38.2500000 341 0] endobj 7106 0 obj << /Type /Annot /Subtype /Link /Rect [158.250000 290.750000 225.750000 297.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 7103 0 obj << /Type /Page /Parent 2 0 R /Contents 7107 0 R /Resources 7109 0 R /Annots 7110 0 R /MediaBox [0 0 595 842] >> endobj 7109 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F1500 1500 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7110 0 obj [ 7106 0 R ] endobj 7107 0 obj << /Length 7108 0 R /Filter /FlateDecode >> stream xœí][¯ÛÈ ~÷¯ðs8š‹n@Q 9É)Ї ЇEŠl·ÅbwÑÓ}è߯lËr,ù£4Ÿ9cÉGlnŠ4ù‘Ã!9ïÿüåÛý¾}ÿôå?Ûoí¯O_6ٮ̳ãÛýwßÿ…­víï·e•o¿ýºyݾn^6/Íϯ›ã _žþÚüî[»ýKóÿÏÛþÞüåí?Úÿƒ_7¥)›_9üZ—¦ù]Öýºÿûoþö‡íoû/ž†k‰¹üó;oj_Ú=#C¿nNÓ4‡¿ûmóþÈ€°Q*WÕÞowÍOµ·ÛÿþsóS3ÀéóÙ®öÆ”…/³[j~nFÚ³ØØ:Ûµ tø¡óùoþïãGÊÕ¹b\aä¯ï*ïŒ+mî÷ ½_伪lóûÒµÿÝÆ´¼ùØi¾öÖ¤û¼þšø,‹¸àGÊÕ¹Ò.¸ðu=mö™/ü‘A6«#ð¿û|ŒÅ-ʈ’s \+ÇÅ•¾W›}VÚvE¼/#°­û|„5i„>‹·àÊÕ¹rZðÁ×_B¾‚I]ŒWáÅ_7ïŸ7 3‹íןâcùÚ0%ß¾ÛûyµýúãöYfüŸ¶_ÞÔ»Âæ'O²Ï艩à“>ã8Žýˆž¸¾ó!œ‚ŒÇ8¦­†XøóϾƒg*| ÎÏMà#o˜j<Î'øÄÁ'Ïá<Àã|Ã+%„Ò`üæüZöµ$#ðÊ(ÆÌ7Jçð;‰¾“å‡'Ÿ¿6¦æF+Ñ|yÄJ”e;ª‡ë(ÌóÊ F.eã-¤Àã†öC@U¼ZÐJØ'µu³öufòKé ’8AS±T@$¥¬#|"`ã`‰%¬ýб"GU1væHZgÎ#)– ¸öc¼ÄòÑûõ*¯åk_ƒ}ôd¼†èòÏ4©i¶µ-=Ð_°œÁ8Ž€c ç!¾xlg°¥#<öd»—iyDÆŒÉÆeŒ°ÖÂ^‰EàÚãù¸ ùëO‘!Ù±UÇòKxXï.±“¯8™wßɱf`àÄ—T¼fö&*ûR‡=i,‰)µ¶(GéÁOtå…Y-‹5ƒ @‡ˆ¢aùOÅ7Fú”å¿N(ËUq9»$£Ú,¿Aƒtã*žÁUüÇb˜¼Wõ†OMØ'`p‘§B÷?µhÃ+‡ñïTî­ÃaÆŸ#äS |‡1„Y9ÝsPL[‡µ~”¿ºËì¨Rå2òOƒ¹CH¬Ë$bS‚nêžË2Å2c«‰SkaÏȩ쇰ëŸëùï8Úyw Ú1ÚD`cϘS.Š6æÕ½°…úl1ªþ†ÀŒ(7ðLqV Î* |b*¯öŸ BÜ Ç*îÓma/e9ͨ•¹“°Eõ/ƒV(ö ãèb–E‚†jGÄîoîäÄÌѹG®]6AkUŸxÂ¥²ÔIÇŒ­ÛêIè°L…±zóðXœ©cœÇ(„£ÿGp+¼Èø6ƒBÆžŸ§`Ë’ªÆSqC5ÏC7ä๚²¿>g¼vº^ÅXšQó[ò”£VDŒQ¸E¢oçÃà²7Ëh¡A3Ù•Eb)§4ƒ8Ó<\hÃ;¿–(çn™ú< Rß’aÃ;“g'·¢ +³Ë}Q•ùwêtTÁjWÕÙÒó“ã2úwÇnE}¼öÎ|~­Uõk_'î’š,ï±1 þF”ã}pÚ]÷•'í¾òÚ2”ðÉÑ‚TS¤é¸ùq'Ñœ$›x`,xœªO,üH‹mAÂÚî¤ÃN¡@`^ÌHÝeY0¸ä/ÕjÖ¡NƒaCÝDáà› ÊD„ô<Ÿé­ì·s¶26p7u„€€ÁÊ»pà1ºp© I‚‘œn]ZÑÎOë5eÁ,œ @6…!d8KÈjšdÙ²ê»Ù8ÿ…éBTà=ýœwî­E„Í:s“aSÅQ¤\;øŽƒªÜÚ¼kÄb‡CƧpTö§Ãü²È§ÚfkÆŒÃìa±`À5ÅÛ*†jÌ %Uw^”E‡[#J®L³üŒuÆË) ”CXd¼”1öd ¢Z¶×ˆ—I[cw–‘v¦R˜$¼ÞýX‰}žN \]Žcò]V»Ëù|€_;:­ÆžÍZ@‚ÏlÀêM²…./&%N©Zų@!þP„8ÔcgG´!ºáu1<Ç’ ù&P0;bá“6Ñ$ÉAgÑ5Û´ciÑq[Ö¾GÐ ¬šó:s]“D!ɇHB’6˜cK¢´'`dDÉPŒƒIÌ8cM3âʯuu_,pU,^b¢¯ƒÐé÷ÀÃlÄý#ˆV]‘²°à8ø >jîåÄÜ!²ÚðÊaÀ„« t#±\ EŸš†ü”³„óLGáêÚÈ+¡Þ÷+d:e¤êëI˜ 9WÊQ çßáÜI¢cŠÅ®Ñ«C@b“Pk3¾Â«s&=!tsþÎY'oÇÍQn_~wÇ$¥!/»öÍ«!×^Õë6*µéÅ™{XÞ0ŒÁo9·ä^M/ezñöfÁ¦÷,ï»UïÓÀ1¡ÿíê¬nÁ8ÄuýËW·@\ûÕ-ÜB=‘¯9· ê:–¯néÑÕÙ»g±Pv 0XaBá öÕð8w?^ZSÍ8¸ŸÒÄW]ëleÏ·ŠH3ï~jÐ Ó¡0ýˆÓïÄbÆ¡»¤`:a‡Šªë-û¶ ªîúâ­%BŽr<¢'y ܤNhTO\Ï(@!Q]Ý~- uíÑÞtt ÚVèà ã!cÓ߉Åݽ¡k˜ªw“l»MpG¸ƒäÁ¶Û8Ë"åf·î:ú­ñlI–×|µYš?\¾šß+Ñê˜Üæ˜<ÞžæB,æì˜ÜÝø &ž9œÇí38~ö{­Žb®=q Ϥ+0×ù Šÿ!!çó5:~#Lãnlà’0¯¸=fðÀT«'Hl@K™i¬×£ÚîO®8ÛÅâ}×öÈS“íŽ?˜Àµ'e»d¶oZ½¹öNþµv“}í¾óÜaG¯ÉGëÓ—;7XÌü„  õo®Ñ–Áwž­²;glOæ¢íÔ›&„£vÌ;æwT]{†Ï§I÷ò ÀH·íµ€#Ø0}! 0éfпh€˜Dß9ª F‡Wa`ÜAòS;Á–åSdˆêìˆ;§@ ÞrÃü´Íz“u<à‚Ìý»¥ê«Å(p†¸BµŠ“œ «º³=³9ÇÆŠ‘¯¶ÀabÃ!t,Æ ƒáK#ü Ä=Tõ>dIõh¦‚OÏSÙë·l•ã8ªá”€íBl“÷ lÎÛÑžt§d×ßà'ñ žif9‹×¦Ä»]–øÊ¦~°D€0V˜.ñiúÁúÌÚN›>"ù§údb¸øØçá›PqD}S™kwx½“WÝV¶·™ÅÞ^æk˜ùº–½nã³sð"ˆ.ÀÔ>nú!ZÈ–O÷Ž¿±…‹ivêºgw†=×™ËM¨½à®ן07œF€ìOßUGnÌU#Xµˆ}¡€{æ.Ý4J¼ñ©p¢Ë‰tc¤ Gug:› W‡Aæyp\4ætEÕ7^ó;™˜ApQ÷–-Uí^æ²²T1ûùéÆweÄ: 8‰l;•£…Ý'æÈ„XÁ@nb÷+rH²Jš›è$w§Êñd0DdGåzìxøC˜a’ ÝßW ¸´š™6X+Ò2%nõ‡-û@oˆÆ•†B…2Q)T4Â'¸üÃFOhtyÙã!µ÷ѽñ\‘Ž2fà•§P_˜U]nÍdòÕ›W—Ø …‰.<`Nþ°›£šž¤ãm¤Š>'Úœ$2ÿT7Z5w\X[0L¹ãî¦!®‡¨”ú .ùfr¨±O6zÕ\"²,î¿{rV°‰3³TP/lf¦ëF2Ã@s¨T¢FÞ¬S5 ºÑu&ç@W£Õ®I‹æ]@¬_~KɱÊá6“‰›ŽÚçØc8.©âT¢ýÞëtG¸¿ÅÖp„#&óO(ÇbÙþ^IÍ…’ÿf’v›€ž/{Ú-øó0‘>Äþ§|‚ƒ„«ÊÉàýÏ,< . Q}/¹ý(®f(®{©Û ]‘íöüu“Û‹¿øeóE0WqìÜž„ž&äáúŸÊ!T"QÒ•Ì„%¿ƒCzÓ«ðR¦+Ȩ»¾¸±L‰Vµí—u%ֶμÙÂ¥¿øÂÕhSHð×°ôäDâ³û®'˜×Ì9gä ÝVT÷*¦Â\…)ª¾–îDXçµrVÉ¢rôt÷L3»ÈJãu*^uü v`àþ"¶º¾êŒ[©ÄΫŒœÊ|÷Ѓ”÷ŠÏ!žTQòUïAFx-M_V­“É$¸O wűHu^õ,’y¸Þ‚IÁ™³'E¤v/Jï©Ò¬ù*GH È«4—Jœ¦[ž?ëSÓTg'óÓE<ô\±zC=u ¦ñC€Îœ.yÐtù#Ò]öéN³YU*”ÓÉXz¨ÝSÜ$qSW}yÉÚÅš‹Å—™Xø^/²1øz˜$Ž/õ°ø8Žp5 ¾Ó†¯­‡ãx|侊īH\mæú’Lí˦îÉëÇ`© ÝZ±€ÞŸL0¸:.fh4آ̉Æöb™-AfxÒ§]¶ ¥çKîܹýÓXÂBØ >eš¤-ò”… ÚżPS'z<éd¿§oËc27°ŸªMBÞž5Öm€*Ë\d·†®×еö’â¯Q㨄”ÒZ¢qÍîòZêœmzÖÈÕT7—˜VДӹ mN‰Ã_n æsµªv%KvEµh—\·7àý6 ‡‰[’AcôŒñ7u¯¯ÒÍG-"®ìн—åþõg‰NÏ߈q2g¸‰›F¬Ò]Øûi¤‘1Û6Ý\ä(=•bfQ8Û3^ÉÒµ|36ü*ï0¹e®gd†çlt«¿¦wÓ`j˜¶ü±³_ï–¡@8$*‡h³–fÞ«‰|aqÊð'xÏa(Cvã'¸¥~‚[DÁà½ð„hÝ$4[‡¸I'{Žm¾Må{ëû†³ U¿Ìå‰L|_7o™ºíºsÃjxÝ‚"[X¾$22(7Îö¥ÖzÄÅmqSA®†ím«|e®cUÔ1óþ˜r š¨˜.YÒö›ë3¿Ú± ODˆïâ–wo±ÒY•ÅBP€8‹öj÷KÉ<-T×§¬–ûoUò>Q¥ÍÁ޾Òfà“61Éjåû§#ôO s“a·÷†[AÜùw2Îp—e|Je o,UgŠ)°xL5^èH2yvÎÇâqæ²½Ë(„ Üm[,½D§i…œZ&ɬqùŠ5Sf:–›`[e¡ˆ¢+³G‡Ü_J_šQK7®ø ãÇBÉÆ+”ÊûpØêÌØ3Ê!ß„SÖ:‚£9ñ$™„Ì}?SÛ[ô™xâ±ÄÞÝêXÂ+˜³Õõe0wãmÍ(ŒI¬‚OŠy…׿C¬É2å?©¼¸[ÖÞ©U!M Ô×꣎Ô>í /–Þ们vÚTUñTÏ)'Š[…»„n*  ^„Œ[ºØ#õqÔ•Ù1ÀÕ>zg$ûÏŠˆUæ]½3Žà˜´w6EJÚiåéä@°~Øó–YØ3¶”‰£'MïAqÜÇÒ˜qðM”zñ,Ù¶½ãæ,BÀRsìÊÁ£2Ä‚‰¿F„tÅ\àµÚ}ÁÀ¢>…þñFmT€ƒ\Ì_¡àV­SÚ8GªîŒ>9ø´xC¸\ø<‹…‡@ÄÔŸcXóX`à;ÂIØŒÏÂqð“œ9a¢8…y¡ßz¬–Ò>âòS,Vô äˆÃ±X(/–ˆ ‹µ‰‰l19O‰²®(ÅQ!(Lö¦ŸË _Ãè`Î:Óüؾ6Ê!êÎËØ?˜~ª®)–3n×x …[Û ŽÔ]ËP=Ê|y%4pÔ »³‡ ûPŠá“6¶fwm½Ú€?¸uï•qÜX‘Ö5ÚžÛ™¢6C¸°ÐŸIÊ ±¦ú`‚-Ð^û| Ÿx4 ƒ¿ßiM± šzy[Vàö¿o(>-4ä#'ÌÂÑРÕVsõ3Rƒ¶þÀßD¬ PÔð;Oƒa ¯7 a™¹] `ÒeNÓïªdFQúeû²ù?3Äpn endstream endobj 7108 0 obj 5277 endobj 7112 0 obj [433 /XYZ 38.2500000 92.7500000 0] endobj 7113 0 obj [433 /XYZ 38.2500000 92.7500000 0] endobj 7111 0 obj << /Type /Page /Parent 2 0 R /Contents 7114 0 R /Resources 7116 0 R /Annots 7117 0 R /MediaBox [0 0 595 842] >> endobj 7116 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F1500 1500 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7117 0 obj [ ] endobj 7114 0 obj << /Length 7115 0 R /Filter /FlateDecode >> stream xœí[·…ß÷WÌsšd_ €®ò@€<yä8Qü¿ŸÞöìnÏ|5ÓgØœžÝ¶`k-ªy)V:¬âåÍ¿ü}óÏß6oÞùÏæ[üýý—»bÛTÅîŸÍý¯žþo·ñçMÓV›o¿Ü}ß|¿û|÷¹ÿï÷»Ý_Þÿ¹ÿé¿ùSÿïÏ›¿þ­ÿÃã_ºÿ ¿Ü5®éÿ÷Ãï]ãúŸŠýï÷þ¯»¿ünóë}Cs±3Ïÿÿ‡Òeî»q¢éïwÃ0Ýï߾ýz÷f'€i­´eѶõÆ•¡Ü¸®ô›ÿþãî§¾¡úbÛ–Á…ÆWeÿsW—MQµ­ïnBüGm¼ñ÷­7¾oØwŦ,›ƒÆ~¥©Þ¥¯Ü¹¦˜­ò]Ï“KÅ…ÚÙµo»ûÝOô%šµï5åA@­›ar«ŸAþ¾èÚù4ç¡çÉ¥'ר}fkö®ŠQvå s²¯~Ž ¯ûÿ™­ò‡ž'—JœðÃÚ?O©…»bz¡ïƇï¾Þ½ùäJ×w«Þ|ý©ïÜC›»ß¾öB©6?ô(Ôõ]ùúãæ÷}—º?l¾þ|×mk_ ]Œ%ï©$ÔX°¶XòK°o®Å”X–xì5—”ߨ#™8V=# ‹­¾ªPŽÅÈfͬåÝÜÓ]Õa5ø¼û0}èag®ØÖ{f°ÑQŠbb¨L[~c´“R(Æ’™õôΈ/­ ƒÒ¢k0ò»ñX–(Ãü°a†<ÃȰ¶˜œdæì—%Š~þ¢DqáFm¸+"6zp`J—x*¸ŠCµVfCq›¹V„ç/_ÙeÄ0± ƒhg—¤¼ŒÂŒP‚a1EQ¢ A( FÀ é°íñzI¨-©˜ÑçºüñØÅ$ òìÙ…³ÂÜÎ-ª!4ëýéÎìD" ,Bî¢æ7µšãoP¯ Ôw)æôÚì“ ¬“Ñ¡IÞˆ}¨mWèW&_½€™›À±'„÷yÄ ?ºzÈ#C$³,Gànp%aQ:Ø2‘A…º¤]™MÉm!Šø2!DsƒAã!çäGÁ’i[d0uÏ[ï’í¼½„þ58»ÆI}eÿËÛ16Òðü°t8[ÈÛ1fçÈ­sc’¬¬F_ÂîQâÎ9y"Eȳ¬—Š o<΋_&eóÿ)²+Æ 'IWHÄD8?+^™6™§ï›—¬ ¡“rå*+W)µï*\ÅW~¤•ó»X_Õ£6_< 2¾áv„^l‹G:ÁEð#»8ÜB­ÕUÛ¢ Ï~‹µíÐÇù¡è&\¹áŠÇŽä¤Yó™G:Ý[¢iñœRØ—P!e·„BŸ8ŒŽ¤ùpzr¥.æØN|J53ó–€}vÛÔnÌ5y%'8:C•}^lÌã]ÒRUÙÆ$,<|NkUQ²$7I.XøÊÞ®ëócw+ ÑWMÉ *–|¾:Û¿ÒR/ú²´˜$”mLšï\jš7÷x_Ž—¸<{oÏghâg™hÞº˜¸Lã02lŸªýœÖôŠ"Äëšgv?) _Ùd6j зçÏy~ÔÕcD˜àœf¦[Iƒ£qI•åàªÁ9‹Àç‰ùZ¼PC¹HÁ¸š‚/yàüÂR®ŽÎ3ÃU89Ã!ÙaÐ3úÓøçVš(oedpܬ‹¬¿Š.–|UÒòµtÒõJ|Ÿ\”AëÜiψ²¥®Ô7ž®`®âù–ò®l|!ëgù·XOã\KfŠ‹`}]‘;§ºÖ'œL0N¸ §lŒõpŸŒ’»½>wXÀ9”L§‡Ófß‘ö>ƒãíÒyZçsçÖWžf®JY—¯ŽÞ×?Ù™;Wwn<ÞΞ rÞÕµ+×<«L7®¬žaõ +«žc=”m§û2Øn—=¾âÓŠO9™k¦³I¹¦ïE´²±Ë|SÚÓ¯Æk)w*gN¥%Ü7á¼Ä½_¾-9 ELÓfœ“ÞÑ"W¼ë­Þã‹}Ï”r·r«kßÕ½DVÆS]²{"c¤ÌÍé»ßø¾Ã8†Ù-ò.ì;ÃOÝáà Æóx“zÒãH»ÍF¯•'hømÚ/Ü$~K*I—ø8Ò„Ç]•¹6|n’ßm‹ð{ìYËL:;E °¤ü˜ Mï«5ÑÔµûl,ó=Ž¡÷Œ;û³x_ì_ƒb^ÈÞñÅ‘ …O+;ؘO ç“Ì€•vN­-çÕlº‘Z°šrÀ«bbˆ¡ÅP¸ªX1¹6e³vR57d2‚…bóᣓ œ(ØiÀÍ÷8˜÷UwzîVø´JxyyÃð¹W‹H‰­1¬•¬0¿IÀóØ—TÊí J¬„#N,k†RÎi}ÊqÍÏI úüz¡q‡Gë…hp¶ÛW(M{;œ¥±â{,kâ(ïŽèàòÙÌý[»+-¸„þìviÁµ`G! ÜØ…¦ZrJt%ÉLõ”Ùæ‘²t„Tr.ÊÂG—l Üëœ,„!m³R0S—“R°%_s³BÇV‹ã)ÙÙœrêy,° §gx%t¡ãÈï º½Z$Žó°á  d”°Sæv®NfŒ" ¦Y C7¤oÅñewÎèÏ ÓL¿Älæ£Z,9/kÆmneÙ½NPi›T.Ž™Ü2¨ìÕ‚SÑÆdá3ƒÝ0[cò·ùæö GÓã“dÑñØx A:ÜΊêmp~äXÝtYí´$ј²íÛѸ„Û‚u‡:Ê#eYG{¤$äºu°i‡‹âå‘ÇâçÓÀ—D8‡ú(KÉ´ëø\¡D¾F/ I1È1m äe[='Yê'·üV߯Í`­2â%Æ?çƒO3©T˜¶²ÒKrgç„¥Ÿáä Íüqݪ¹DîM?Çbø ¸ÌæºÍ7[N‹CKÀ±™!6æ!,#v†q)B17øR@ê‚£1_IÅ–˜¾)€­ÜNÌtT‘Ž@sŒÚf]Éê²¸Øø'°PÅ6®FÒf÷–®—ÝØ] ÞdÂ\oýqÓ46îõ?¶ÞÙZÆ+~ŽÄ0Ô1YT8=X[<™œÊw(xÉ„]ÙŒÂ˵«]‹Ÿ‹”)€6Vx)IÉBIv¥ü‰ Z[ìK k9ƒLN IÊF6îìò¢7`szÛö@Óría;_Ó¦ú˜°<ÍŸõ¿6ß{Y™¢ü|ê/œ!ëö˜¨Ca½›ë°ñû«-e§.͵Ü%ÔüÖï2OJvÓP–Ägˆü¶'â>îcRÿ@í„SþðXß>Å‘l ‰,ˆb嘱—¨­‹÷³†ãÚð›ˆ0nÒП‘QîþçbüÅ£ìp̦切è&Íž1ã,Õd‘µ—uÖPT5þÆñ0¡èfp‘6EØF{¦¨s'õ4Bù)ß|¾û?á…Õ endstream endobj 7115 0 obj 4359 endobj 7119 0 obj [434 /XYZ 31.5000000 116 0] endobj 7120 0 obj [434 /XYZ 31.5000000 567.500000 0] endobj 7121 0 obj [434 /XYZ 32.2500000 114.500000 0] endobj 7122 0 obj [434 /XYZ 31.5000000 567.500000 0] endobj 7123 0 obj [434 /XYZ 32.2500000 176 0] endobj 7124 0 obj [434 /XYZ 31.5000000 176.750000 0] endobj 7125 0 obj << /Type /Annot /Subtype /Link /Rect [60 531.500000 94.5000000 538.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_preliminaries >> endobj 7126 0 obj << /Type /Annot /Subtype /Link /Rect [60 524.750000 99.7500000 531.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig >> endobj 7127 0 obj << /Type /Annot /Subtype /Link /Rect [87 517.250000 147.750000 524 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_generating_module >> endobj 7128 0 obj << /Type /Annot /Subtype /Link /Rect [87 510.500000 138.750000 517.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_building_module >> endobj 7129 0 obj << /Type /Annot /Subtype /Link /Rect [87 503 138.750000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_loading_module >> endobj 7130 0 obj << /Type /Annot /Subtype /Link /Rect [87 496.250000 132.750000 503 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_using_module >> endobj 7131 0 obj << /Type /Annot /Subtype /Link /Rect [87 488.750000 162.750000 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_options >> endobj 7132 0 obj << /Type /Annot /Subtype /Link /Rect [60 482 142.500000 488.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping >> endobj 7133 0 obj << /Type /Annot /Subtype /Link /Rect [87 474.500000 111.750000 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_overview >> endobj 7134 0 obj << /Type /Annot /Subtype /Link /Rect [87 467.750000 112.500000 474.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_identifiers >> endobj 7135 0 obj << /Type /Annot /Subtype /Link /Rect [87 460.250000 112.500000 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_functions >> endobj 7136 0 obj << /Type /Annot /Subtype /Link /Rect [114 453.500000 162 460.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn13 >> endobj 7137 0 obj << /Type /Annot /Subtype /Link /Rect [114 446 182.250000 452.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn14 >> endobj 7138 0 obj << /Type /Annot /Subtype /Link /Rect [87 439.250000 129.750000 446 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_global_variables >> endobj 7139 0 obj << /Type /Annot /Subtype /Link /Rect [87 431.750000 163.500000 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants_and_enums >> endobj 7140 0 obj << /Type /Annot /Subtype /Link /Rect [114 425 141 431.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants >> endobj 7141 0 obj << /Type /Annot /Subtype /Link /Rect [114 417.500000 150.750000 424.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_enums >> endobj 7142 0 obj << /Type /Annot /Subtype /Link /Rect [87 410.750000 108.750000 417.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_pointers >> endobj 7143 0 obj << /Type /Annot /Subtype /Link /Rect [114 403.250000 154.500000 410 ] /Border [0 0 0] /Dest /#03#db#a2#ae#ba#c7#ed#17#3d#de#c6#94F#8b#96#12H3#bd#8d >> endobj 7144 0 obj << /Type /Annot /Subtype /Link /Rect [114 396.500000 148.500000 403.250000 ] /Border [0 0 0] /Dest /#bd#a2#baO#9f#3d#5b#85#3c#a3#e6#83#84#5d#ac#f8#d6gL#0a >> endobj 7145 0 obj << /Type /Annot /Subtype /Link /Rect [87 389 114 395.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_structs >> endobj 7146 0 obj << /Type /Annot /Subtype /Link /Rect [87 382.250000 119.250000 389 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_classes >> endobj 7147 0 obj << /Type /Annot /Subtype /Link /Rect [87 374.750000 129 381.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_inheritance >> endobj 7148 0 obj << /Type /Annot /Subtype /Link /Rect [87 368 130.500000 374.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_overloading >> endobj 7149 0 obj << /Type /Annot /Subtype /Link /Rect [87 360.500000 192.750000 367.250000 ] /Border [0 0 0] /Dest /G#b0#f8Jn_#9c#e8#1e#ad#82#04#1e#f1#15X#c24#ec#5c >> endobj 7150 0 obj << /Type /Annot /Subtype /Link /Rect [87 353.750000 125.250000 360.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_templates >> endobj 7151 0 obj << /Type /Annot /Subtype /Link /Rect [87 346.250000 125.250000 353 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_operators >> endobj 7152 0 obj << /Type /Annot /Subtype /Link /Rect [87 339.500000 133.500000 346.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_namespaces >> endobj 7153 0 obj << /Type /Annot /Subtype /Link /Rect [87 332 128.250000 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_exceptions >> endobj 7154 0 obj << /Type /Annot /Subtype /Link /Rect [87 325.250000 110.250000 332 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_stl >> endobj 7155 0 obj << /Type /Annot /Subtype /Link /Rect [60 317.750000 135 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps >> endobj 7156 0 obj << /Type /Annot /Subtype /Link /Rect [87 311 170.250000 317.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_primitive_types >> endobj 7157 0 obj << /Type /Annot /Subtype /Link /Rect [87 303.500000 104.250000 310.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_arrays >> endobj 7158 0 obj << /Type /Annot /Subtype /Link /Rect [87 296.750000 136.500000 303.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_pointer#2dto#2dpointers >> endobj 7159 0 obj << /Type /Annot /Subtype /Link /Rect [87 289.250000 109.500000 296 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_matrices >> endobj 7160 0 obj << /Type /Annot /Subtype /Link /Rect [87 282.500000 97.5000000 289.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_stl >> endobj 7161 0 obj << /Type /Annot /Subtype /Link /Rect [60 275 111.750000 281.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization >> endobj 7162 0 obj << /Type /Annot /Subtype /Link /Rect [60 268.250000 100.500000 275 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes >> endobj 7163 0 obj << /Type /Annot /Subtype /Link /Rect [87 260.750000 131.250000 267.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_nobuilder_mode >> endobj 7164 0 obj << /Type /Annot /Subtype /Link /Rect [87 254 122.250000 260.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_builder_mode >> endobj 7165 0 obj << /Type /Annot /Subtype /Link /Rect [60 246.500000 107.250000 253.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_generated_scripts >> endobj 7166 0 obj << /Type /Annot /Subtype /Link /Rect [87 239.750000 121.500000 246.500000 ] /Border [0 0 0] /Dest /TeY#b7#92HA#91#40#25#f0#9da#fd#2a#08#f5#a2F#d0 >> endobj 7167 0 obj << /Type /Annot /Subtype /Link /Rect [87 232.250000 121.500000 239 ] /Border [0 0 0] /Dest /#c7#a1#d1#f1#e6#a1#e2#85#3d#0e#1c#07#c4#15#87f#0b#1b#14#c5 >> endobj 7168 0 obj << /Type /Annot /Subtype /Link /Rect [60 225.500000 102.750000 232.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_other_resources >> endobj 7169 0 obj << /Type /Annot /Subtype /Link /Rect [230.250000 123.500000 312.750000 130.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping >> endobj 7170 0 obj << /Type /Annot /Subtype /Link /Rect [160.500000 197.750000 201 204.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.scilab.org) >> >> endobj 7118 0 obj << /Type /Page /Parent 2 0 R /Contents 7171 0 R /Resources 7173 0 R /Annots 7174 0 R /MediaBox [0 0 595 842] >> endobj 7173 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 7174 0 obj [ 7125 0 R 7126 0 R 7127 0 R 7128 0 R 7129 0 R 7130 0 R 7131 0 R 7132 0 R 7133 0 R 7134 0 R 7135 0 R 7136 0 R 7137 0 R 7138 0 R 7139 0 R 7140 0 R 7141 0 R 7142 0 R 7143 0 R 7144 0 R 7145 0 R 7146 0 R 7147 0 R 7148 0 R 7149 0 R 7150 0 R 7151 0 R 7152 0 R 7153 0 R 7154 0 R 7155 0 R 7156 0 R 7157 0 R 7158 0 R 7159 0 R 7160 0 R 7161 0 R 7162 0 R 7163 0 R 7164 0 R 7165 0 R 7166 0 R 7167 0 R 7168 0 R 7169 0 R 7170 0 R ] endobj 7171 0 obj << /Length 7172 0 R /Filter /FlateDecode >> stream xœí=IÏ,·q÷ïWÌÙ€FÍ‚z[€ƒ‘C Û ˈìCþ~zcOs)NwM5Ùó}£û½®æl²6ÖÆïÿí§ÿ¾üÏ?/ßþé/¿Ìþé­»ÕMÿ]†?ß­Ü^ç_ŒU—_~{ûýòûÛo?öÿÿûÛôƒŸ>ÿGÿ¯ÿ»ðË¿÷ÿûëåÿÕÿ47üöf˜éÿþÛø·3¬ÿW·ü=À}ûÏ?\þ>ô臛'>'9“LÓ¸3ôïoþ3ÙøçŸ¿üýíûiöb%·Ü^˜òœä—üùí/ý·î»«ãLi«yÿWÛ‰é;¤áã˜Z\wý¨xÄé÷4½³#:·æÀ·™S/ š;¿:ɘÑÒt Óø‚/kßCÉhÕý £ë|œ9ùªÌ{[è½ÿ%sº3V‚ÿFŽmÇ5ëÙf°—„uT9Ý­ÃGÖÍFV W–Éža¤#ÿ¸§ì4oB¯… ¿ÈK*"£qq¥Öýéâ>DŸ’ËLß –¯»-Ÿ—uÓÔÌe=QÓ+,?=ÉžõóíŽÚ³¸ïíY?5vYO”=ÑžBg9d8dž¹é“m¿_ÎOò96 à]€Æf™7íÚüTyã®VÏÿÿ~„Td?9Hm;väþ˜ŽLw‘†ÏÑ÷F®Íߺ?ਠ:Çë|š9ùªÌç´wE'S¹OÆRâwŸ~~ûþ›»0}ùù/ƒ5cpúëçßÞzŠþn8KqùùO—é:aþõòó_ßÜÕh¥¹ç7½án|c¯Öuᛎƒo>oäUŠÉät{c§ßÜjÊàîEÔ ÿ÷ O@oÄUõLΨâÔÀNDM­0é¤{x&ñ÷Á½2 u¿lûj»C‹…Þvì8ÙNƒÝߨ«à–qì*Ýs þ¦ýšƒsc zwf3MvÞRxŸà·“-fe   Ï $þ)þ@ÄfëÐüÞi_îåßA¢Ë™HvÌ.áe`rÿFð \TÚq _šL0‘%ŒCÔ­f+Ì£°lðR`faJ1g(,(çàeƒ{+è?2J6A „ÔŒ;)±D}„å*†ŽH(­C‚˜*QàL ûoÌÁÙT2 ¹·JBgu$ ù4&cþÃ'ÄWïQV`–tB|ÂHB³gò£øÙ{?AȯT”Ê$ëb5j¢U»,Ñ—qTw'³þ:ù|c¡7|ÃøFBoºOСÁ7 |ã?Læ,Çœ_(М…1Hü L°òDb˜Áp*+g€`ùlút&ü«c¥rŽ™ÑÊN™0ú¼ð.ìPC›eå]€b}ûjÙILqæ4tA2#Žˆ›Å=6t¤8P.’¨Àâ0]82ƒ½q †OÓÚaIUËÂ8KZƒŒ 9ZÀà7­96J’Î #ô ”Œ±!o7—¯ÛÛžŽU‘å7Rá‹àùRB(ÕŒ·TSÍû2ÀíóZ2±5|{l# '1giÚø„Õ–û…¸ÕÄ£B‘óƒÒ žÉp‚9¡TŸJ,XÃF81_zN?Ã*Ê›wo! M÷¢ iEœgQ2 žÆ-s)XŒ5Ϭy÷AÖÕ<ÃÓg0î_ÝÞ|αzÛ Å2*¦UXjeãé‘ÉBFrmOÆÏ± û™Míµ®‘Á¿96Auv€&²#ry[Jˆ„c4 ̉›ÔTõîmðw3ì]Ž?#g¨¥´>›'‚éd[ÛÛ¢›kÙÄÅ(´c²JhÝØ¨r ¤Ûô€†`ÄY—¨—$µ~0z¬›X@Ÿ01¿Ž{s†F«¬·„jÒê žü€[úÈã[OX÷d ªX¢¬OÁöŠÙqLb*©mŠÑí6’Z…Éý\Õ:áN@‡ÛÏD¿ÝO$¦Ú‡V Á|¶ãZq¢“ÚO†º!‚ƒä ­Y¢g!ñ¦PL¡-Ö*Íôª:qüf‡½î®‹œ¸¦¦hÎ;«¼€©ßz°j·?HçÐÐE‹Œív:Œ Uc^:¶ô?ÊÞ´½ÞªöW{­ºÞ¡‚q&¤ðÎ# äóÃöƒ Â7»Söq‡À] öï'æ‹ÎúÓ3ÿ)c»" ‹$˜Ö/Hœ BÊjQ|dµ¨*‘ð) C†Ñqð9¨Œ©±XÅ?ÜÐôûñ²áP^ÏN”Ä÷W¡(³‘ÐB™úa—-h{B&ÏŸow¸’ŒYƒ´èEÀ*"ûUFrO$K³,öfCU;7b¦˜Ø 8€åH[’»îêsGf_™ø\õ¢ÿ'+lŒ*k¾]DÑØ8kí`}Ö|iuï#Jø?»È(Ä{`2à9ëOZYc»ún2Öñ¶9Ömдk)‡KÎ^`†ýNÊq ”«VER÷àÐÆáÃüñ™L‰íј…lw6Æp÷))´©ÕÛ9‰Ž÷áꃶK3«`ºÔ*o'¼°«}ÀÁòç膰xk^'ô¹nxú(<~OÜé©“F¦=WIH rƒ½É U´‘ä;uŽåsç´Ïú¨¥€&ë‡ñ{ЯbôLœÅu±(½ª®ª‚íã\1÷^ݪլk¤ºš¤ .b²8áyI~Eœ¤Hãþ [DêbÙ!âv˜öP(~BCÁvõ>‹ J˜Ò–¹i.0é¡Ä ”Gù¯ä#"¡Ù}ˆ3 JêVò ')bª$ÐæÉT >Þcâ 5£ÒçBÄãlÛ£Mè~/‡‹—b×îÐP*ýªÓ‘,,°IR²8ø4Y…x ã]Ee¢ÕZá홢˜MhóÅëi}Öoa­•ÿ»#¸ Æg’bµê4<¥òŠJ÷ƒKòÌNuíœçßÚßÓÌ3ްút}LÌ÷`R«Iþ4®]Dí Bs?ˆF_Cù²ïÍñ€SáÔ%¦Ï aR˜zµ§Ik¡’ow8™w¢4×2 9c`o–*ðo@ýº0p àÞ ¹ˆà}| ^ëºÎC“U$^ÚcX!üÿ¦€àÀ½_Oৈµ{}]³,b;÷t¼Åˆwö>÷z¦ô!Ôa«R:y’0 !œ²mö2­#£dgI}ôZ'€¤¡´?mµ/¬úܨ†ZØŒ9iÇí~v ³/Ò “1UÂß—]î{Ú Ãx¼.®c±ÐúÀÂÑ`íϯ }"ûdèW‹ç­u;Õ3$\’îÆž•gIÌ;4QÛXj=uÎÆyŒÒ¨^øç¬mu‚èÅöWÆ“¦,V‹íâRÜÕáj•­…ÑuÇû½œh(b‡Q–NŒ=³nM5*ûì' ©ÅƒØªÕì’ãææ4ÚØ_R…3™®=,¥a^Ö¬TE`¿$Ëdg’u€èó®ç/ßfÑ7N&X3½™4»~3wî Üü›¯ÐÎ`&üÜ÷Hð7?€3€× œ[áKá7àÜ o¾€_ª÷ÿF€¿)ôöüÍ'pçÀ70¾Á»]Àø7ˆ˜JÀýÁ¼™5]o ½!¾ÆxRIa0†€XÅÁßÔâU…ïñíÿÒÂ8'æ–˜] ]Ñž"fÀ b ^c¸HÁ…ÐJ ÌþÀ|ÇÔÓ~Sh?Ìí`ÚÄì¼ò'æ/é¥1ÑkL´ÚO¯Ãß÷†¡zŒ†ñÒ˜^ÓKcziL-4&±?zÙ‹N­ýÔ²G¼Þœû ±½è¥-œ€»`´íBo0ßyøæ;w‰L¤KÆAœRÚë†íÙXG/RKÉK/zé¯7§C¬U’¡ç\ýÞ¬(Éë+ŠÑÙ^¶Æg8=è8ö"xö†ÕQ¿‘ÂøožÃýÍÕ¸è‚A ½éà`¿iÕ9» ™cå»+ïDƒ}¯È—þÕ†Ì`™YÏÁ\Ì¥©_¡7¨/ý ή• GÅÁߣn¸#à ‹XŠE†_dpê: ùÛò¬¯ÖvÓ Æìµí®ÂvòË›¶WÆ·–-­Ìºÿ4Ñ·ŸŸåð³Kük‘Œ!úßÄ3?Ó©—ð;~yûõíÓ‚5aÉš°m”ÅvÜ],GÒRó4'±e2\0÷!Ê0Yõ˜ðfxœ{AÌ dúö+>.8ŸÑ—½üíí§ÇC1†b*CŠ™iHLc+³îÅ?É€0T¿Y)a(Æ“1xBÌÏT¬ã6FSÂà‹”Cdwžºtĵ6£/‚fôwl пˆäLNá;ð9"(“|Æ® ª{›qÐC~éÔ͘º´.èÆ?Š q4î€%ðq˜p2C+v#Ãa~È¿ª35ÕòTÂ…»™+ó{æZ·Ï\âò>å Û4ìRyæs<éÐ#È0Pˆ ¨Œº•‡o\¶h•~{³Ü‰–í.ÇQ<â8Jä8ŽR1+è! ÇZÍÅwãyÄqËqÕ%Ãt)Ç[ɰÓ”ã(ŸÉÌ¿BÒ¨ ]1•%0…dÎÏ=ö•q8‰zΦœçlN­›IÔ°ˆD Ï‘¨‘1íô„D‡V3 únü#‹HÔt9Õ.¦‡$$ªo4¹t#Ãaš’¨YŒ.`½„Baì_„Øšql&D×E„èXŽˆ)d´œDt4´š Íw㻈­ËbÿW4Œµ)!Ž­dØ ‡iJˆ·,I°Âèšt‚p¾ò6t­¼”s±lF9­#”Ó&‡r‰ HÏ& c†V3Jùnü£ŽPN«Ê騠5@”[ɰÓåzi=o4ÈxQ÷ bŠ—/` PbböªF,(­Ö€Í(mU„ÒVçP:1¦èÙ˜`äÐjFYßTJ[™Ci›†H‚Òc+v#Ãaš¢´óa5,êøŒÕ·c¥ãVº‡Ã\ø´÷¦ãÕÿùÇŸß>Uß`ΧDÃõVêaÙ‡P˜Qw1–Q-¨‘;Ž"„–Ê >`>2ÃØrTÖk6rvlä‹Þ€FŒÍÁ]h¯XG™r`Æ ×Ç„gè Uý9¹ÅV¹à)Qx‘œéGì‹Æ02ŠÆ02a’Ø‘i4ÆØjÒF–nücad.ÃÈøh9@bmej%Ãnd8LKmÅÈ¥®<ÿU ^D-zâ‹rã£$mì/Æ–âu;u,#—° Ó­›iIGaFçÂ&LrÊ4: ›[Í´¢ƒ° ?Ì–t.l¨øÌ<@ZR7âÑAØÄm˜¦´¤}Øl+¤)GŽ©õŒçð›îu8ô²á»ä —à-×€#ã#e¼é˜% •âµBk–Çù$V}ÆV“j³tãm¨úXf2ªeq¶Ê‰UŸ©• »‘á0-U˽£»KXë2  –w˽áœ3µ<μ¬P'`^·›‰àÀCŒ…ŽÝ—²—ÈÅ'8…xÀzc?P¸ÂïëÒ¤ k.uÏÇ…Ž×þARò$¤½kS€Ã,ÊJÒþ†6@|[ɰÓ_]·lg¥Àô®0D¬ùï+޺Γ‡-W€­xëX”ÙïX.³ß%g%ÇÒÌþ±Õ„—K7þ1Êìw,—ÙïX|ò 1ÞN­dØ ‡iŠ·ÌÕÆ[„Æ@|G%Ⲃ%eg†ã·„~»l¦ùBÈùBˆ}¡$¡±øB—nücä u"ç u"ö…„bÄâ ½u#ÃašRŒ°µ)vï“ÄÙ"·•³w·SŒ¸y<Ű™bTäñt*çñt*öx„bÔâñ\ºñ‘ÇÓ©œÇÓÉØã9@Š‘7QÇó6LSŠQÞùõÔf¿Õ qs,ædPˆ(Æ|¡Û¢JbViG FAÝ…gϾVš$f÷ÎÔrºWåWÞ‰"=›ÛW.À™¨\€3¹r.±y8“– [Íó0A¹?Ìë\¹§c ÎIر^Êܺ‘á0MÙ±¹ïS&V`츌ŒˆE90éN¾fÉôWn ØL6Êôw.—éïSŠsi¦ÿØjFsdúûand`s™þÎÆ†¡’]2ýoÝÈp˜¦dàTm2Àä–×òÖÃú™;Ô9½]6’ìG È d|ò²‹-3#$"ƒ©Õˆæ·nücè“ïŸ|Õñ0]ⓟ[ɰÓ úeµÉQ‘Ϋt¨ô”Ý ðVrèW~‰°l ØLÜDäÀ3ÙͲ‹Í.#$!qÃß49ðLvsUñ0<Énž[ɰÓ”„¨M0ÒÿãÞvd|ºj%ýÊ/Q:l&©#r™Ìëêb<•IæõÔjFwir:"™É¼î¡2&ɼž[ɰÓ”¯M »WÀ‰²j'ª©%#š¹5àÑÂ8²ÓÁÝýsæîÝ=0B¢Â8S+³îÅ?wôÏ™»z¨HÆHîa~¦«»Vc4,Œ#ûiÞÝûÄFÒ¥eåNSMe“[·½Í ÓW¨„†9ü4¼Õ¡Gå%h#l–nVFÒÍf‚6z¨‰ÅŽM‚6¦V³ô²*nVFÒÍf‚6z(O†I‚6æV2ìF†Ã4•nnÙÍotÃXç ¬6ÇʇÉoÄÜ»‚‰ûÝáÎD)EÅv]Ã-•X·<< ¢÷SK±ûK­l¿Æå–úe]`Ô2F=46ü°. 0šZMÀS¥…×J2¶„Ýt| ØŒGœGxÄ3a7=4¶˜0ž„ÝL­f<á"À#Î#<â™°›ÛH‚G¼[‡³ø ÂnúY,BÉwÅùÈ™ V$*3q>’%V&“8Ÿ©ÕL‚’$*YD¢2ç#‡—Ñ0"‰ó™[ɰÓ”Dår!\dã›ÂÜŽ³Û3¹”``3îé.Â= jè¡"F 5L­fÜÒ,À=ÝE¸§2A =ÔÆÃ¨$¨an%Ãnd8LSÜÓKPC"Ó‹çŪ5àa"3ž±Í϶Ë™îO!±qleÖ½ÌOÆûßý³Í™1ñÆ$ÄægnWÄÛ- ˆÃîÜãH•¯‡Øw–ÅfÚ#9é®ÜÄ'𺅶Zë˜]"Æ*À àqúv6¤o—©œ/yUÎ!1}­ÌºÿdCúv™Êù=TÇôí’Êù#ÌÏÔ¬éÛ r~¿KAsKíE7dnÞ-I°N¬[µ"΢hÎrÑ <9ÍržF3Œ­&­géÆ?FÑ ½—ÑŠ†‚ Ñ0,f˜ZɰÓR+¸×¬ûÀ÷ ™…²vµ¨ sȬKS›µIÎoõ%ä°™tDùÀE.ò'§L.Òȇ±ÕL"ˆ|ðÃÜHGä"¸ˆÏÌ$!±D>ܺ‘á0MIGòóˆ–÷„ìr‰½PÝð°jÅU{ÁU.öb=T+•Æ^Œ­ÌºÿÆ^p•‹½à*޽ ±j5ÀüL×±·1šªVz)ÀðœW~c2áƒXP‘Ø—0~ULÞNµL/q““Ì6ËÅp“‹;à&Ž;à&;[ͲÃq~˜›l1¹¸ƒ¡*PÇ7Fý.¨ù/,1çÀšìæ¼GÊm"aB\æãBd”6»ªsBj!Á¨áÛã0ru&Bÿ§=é xm22­,ÄDPœ8« ²ÕëÉTÜÖù„üñRËqK­õ¡iuLv̵äùhµJ344Œb¯-MÁUœaz¯TùùÌbÓÒ‘d¶{éI>gÑf#0K “o ŽÈWs ½™iX_góIƒëN³Ù§Â ©ÛóÀ?°~UOK¿Ý?õ2Ûò<òT¨¾CP€.Œ{%0á¤å0*jµKPI&{ƒw¤Åãi²¯žŠnñ"jòœcëk˜© „ägán1„ís2NRžY…ª“Uéäpæ(ƒB4ÂiRù’Äû™$iŒ”áë\Zd’ SˆÔݺjèš¼±:ú6Lybóm¹pLMLÑ#„¶ÙËÑÂ×j$Ëùþ Ëñw;˜ÔF8÷– ƒcà7ˆP¾¿Ç+*:Æ4ίZŽhKÙ\/’ îœâµ]JYÁÑR)xzp†= ë½ò°6q¼Œ9 9¤æ’J¤¨{¹GgšQDD ªúÞds<³7ÝR_¦XLÕ…*évÏŽ¨c¢·{ÁÞž2’e#&uÇc u4Ë–¬\{Žhñ fx˜<á ã0¦{LÆP8€2h#ÌÖ‡¤Z)´\"µhs 1îãóéŒgŽVj˜ FÚŠÃÛ«»c_J{ì&-¥†º½ ³ƒ•„<Ê쇡#L6+¢®pª±L²ºJÆÆñî:ÙÇÖ›"¡73bæÞ|ßðÍ7è <·Î€oOªsså•Ô„9„‚H¸Y`±Ë€¶öÆx±$’Çʯ(×Lù+Fi¯a€dS ÂO ©ÅÁß`—Lå ѸÃýŸËïýVwúÇ{ 6p›­ÂØK›Ž *åè€Zë€9=a¢h“ÁóIäW>j)ŽèôÍ|á7O)œÚÀhq/-7·oó—&ZõÌr½ÍŒö6¥œ,›?=õñ;ŠÌh3ŸÁàÞÀßÌ,‹íútsC[, ÿîgì7\;~Œ R p"ûW=áÝ›ÅJnUÁõ.` ¼G –pþx¸7û8.˜N\g> HýwÑeæ¨÷¸éåÇ·ÿü@ endstream endobj 7172 0 obj 8365 endobj 7176 0 obj [435 /XYZ 38.2500000 366.500000 0] endobj 7177 0 obj [435 /XYZ 38.2500000 644 0] endobj 7178 0 obj [435 /XYZ 38.2500000 464.750000 0] endobj 7179 0 obj [435 /XYZ 38.2500000 464.750000 0] endobj 7180 0 obj [435 /XYZ 38.2500000 366.500000 0] endobj 7181 0 obj [435 /XYZ 38.2500000 644 0] endobj 7182 0 obj [435 /XYZ 38.2500000 249.500000 0] endobj 7183 0 obj [435 /XYZ 38.2500000 249.500000 0] endobj 7184 0 obj << /Type /Annot /Subtype /Link /Rect [288 485.750000 328.500000 492.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes >> endobj 7185 0 obj << /Type /Annot /Subtype /Link /Rect [258 472.250000 334.500000 479 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_options >> endobj 7175 0 obj << /Type /Page /Parent 2 0 R /Contents 7186 0 R /Resources 7188 0 R /Annots 7189 0 R /MediaBox [0 0 595 842] >> endobj 7188 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7189 0 obj [ 7184 0 R 7185 0 R ] endobj 7186 0 obj << /Length 7187 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ðy·Å7üš90<@‹o6‹ÅzgùûQ·¨~PúØRu‘’fÚÆîŒ[->ŠõâǪâÛ¿|ùgõï?ª·¾ü§ú~~ø²«÷ÎÔÝŸêð÷ÍåÒïÃï•ó¦úúm÷½ú¾û¼ûÜþÿû®{áˇ¿µ¿ý¯’Õ_Ûÿ~­~üGûáOáK‡/|Û9áÚŸ¿6N´¿Õ§Ÿ‡ÏÙýý‡ê÷C‹}wa0×ÿ~£¥TÝ0ntý}×OSÿþñõ÷ÝÛŽózñZ;WWB+]‰FËê¿ÿÚýÜvÐ7_ï-„³úð%zGN{’ª²©+Õ¶wtüËÓ¼àoÜÔÌÖx7rvªeEºõ½·ÒææáïwMJÝ͸ Krj=ÇzK_glü0rn¢„åÆç^mÝËŸ³h¦sJ·n瞯ñ£ü1¥_mØxîÕvÊe\íSë9Ä‹|º¼y®Õ†ï½VB9iôÁd̵ñ^¶¿;þÜ7«ÆÊŒšüÔz†±µÈ(ÛÇ‘çÒä°ñÌ«mkWç“ísë9V[h“‘•Ž^pÙÆç^mÙöÙ‘Lè D;7Ÿ¡qå›|GÎN•~½që¹\ë n¥Î ÍÏÍçXëóiónäìTé|Ðúç9­à¡tŸ¬à{âÅ÷Ï»·OB‹–˜¶zþ¹ܱÏîÇsKS½i÷¾VÕóOÕŸêZ=ý¹zþu×ì­4ý»'uƒžßamMXøD£'x>êýñɧçv‘²ÓWÊ~¤Rä=z"á)‚)O¢¢™?jü÷#%áLHk©àL›‚\aï’-­^­OVplx Ò·ØLak ¿ƒù¿¤®pÍíÙÁ' úä¯cBKãÖ>¤KêÚ×±ñw¬#ií1}±Ž„²…­N¢W¬C7ÂÝAyõ±àH•½‡{CÍê‘­YCaÿƒä™lVw5ÆïkŒ»ðj°mt|%šQ¿Ìv†Èžðϧ^çšÎMìG|‚#øß±pOÙÂŽ¸òšÔƒv. ¯ ‹(T¯-§¨^hé±R¦hÀÌ&_àÝY „ûSÊÃVt@H‚‡” qYß)/à#‰/>‰©ñéÆÏßåÖ?JÅ (±@˜ßM÷¯bW,Á‰!°üà-(¯"ZÁNk   óÊ‚¶6â$|^ƒ¥$q–„Ÿ`XžY©ìà§Qjºda“‹7`…@O¾íÈís iúø$‰#{ñÉnÝ;ïÄuýÏ‹ ñ*À|ì Ž¤%Dxãˆh¾ÝÒ ^ÂHþ< °5ã°îO À—æ¬ÏYAìS¦¶SçÞGqœ’$†‚jý!ÁTiqH7ª¾þ-÷Þוµ‡Nˆð©®¬9J Ÿ|ÝY½¢‘Þ‹Ó·ÔU+ê²öûáßõáµ*z[5qí'í;×#9|Ë_µâ¯ûøe÷þ‡|æÖ-¥Ýµ”mLÑ ln±qÀïàùàQãä›ì¦F ­b±8’Pý<þ»F0Ãh'ŒaßL:Û20´ÎCµ͹ǭu¤‚ 1+æâÇš`ºîKp'…×±¾¤(§×#‡¬Xûb2¡5\þíaí¾ö±Óºx¬zˆ.Ϩa}@U/4ìæâ‹ÚÔ"šÞIø—¡QñŽ)¿qmTl\)ÚâÓ’\¾R1¸Áp6ì(ˆ` ‚ì D°W ‚@; "˜ˆ`F@s‚ ìˆ`Ë‚ö$•&hj\C$üâÍ=Æ„ È|þÐyálDÝb›{;ðc»bÊÑíTa0FìãÑSÝXB-xýNZ~V*­Ÿ`AæM¬-%^¾3§>Ën ïU( ïÖÓœpŒÒæ0¾$±¬‡Ü†;C€×zN¯­ŽlCXÐ1/à\‰WŽƒŽžÆÎîÇp FO…òHV”‚ß`¡xóV¨wŒtJÌ>ň§Nª_„¡äÅóy¸¡ùá Î]±WÀSj‡qKA˜I©(+ͼµµ°=&¹ê‘Åù—âa1Kê æo¯(UžHéWæsÜÁRŪXóËxÏÓyRë§EÌjyÅ¡Ëz³ÀnŽ¡Àƺ~쌾üà·Ý—L‹pè(§Â¹iªo'¢Å!êXÆÄÉu£$ÌÉh‡pM¶—ZÖºÔæ‚ÄB¬Y®3’÷(ˆòrU@¦×ìJ@ø8'×ñ–Ûb9c)½±VÜ]ˆKuœàª„üDD=U#g …°~\OgíÔÅÆ¡”M-ÍÙú®âFËŠIXžó¶V±QÏàQ±qŠ/9’§ýŒ\žÁ¹kUªÙ(ÇI¼–‚<¿Bf„ðR!³MV™ÌX³Z3¯csÆr ºÔ©Ož!%\ ÑѯeP)1ð6}ìµM9GÄÇÖªÇÇ”¹ü #>¦LÄ%>A‰O@õ®WðÛη -iqTOØÉ~u)\ ÷C ÃYÜ•Û"Ηÿ«O÷E/~ÞÓR[‹Ñ™È‹wð+øx ¾Û%Ë:c­å¸ù&ëÝ=MÄa¯èNëûK—1LE‰ŽàÍ)VVƒ7Þ„7i}N6éðñ°™åë#’¼œÌÈklT©Ü±RQ.«)(3ÏÁ#¸˜CtïZ G¡ r ”X¼.²Û %KT0ånŽÕ I'Q‚J !É‹%2†òŒcÍ—:¯tât ^èrÅmqK™R*Š©oó*8^ìqé$ÔWà×bãEªFY…" ¿¢‰Ô,®Lkpä¿/EkÛ¦§&Íòþv±Zo+oÙˆ¼oÃIÉëâ29Pà÷nò2*RqŸì…ë]¨1p±VG† k% :¹5óŠcÑÍÕ¼Òa°>.¨¥qí |_ëÍ¥Ì3Å…È`ÉD°2–,\ô ²$Ô¯Oà ÷ƒÇF(¬–¦5)ÈÏgÅeÚ^Ú}¸¯ãšÄ VÂ7›¶ më(%V ëhÌI„R™á–JÉÎWZ{øûÉõYÐ߷׺'ûŠ«ç$`0T!qHEÁ1¹2_ãRªèË#5ýHõaGé%Ìç&HýbªÚ¬0š©œí|dxHjk!ƒÉ€•;ï½Â”r!”»HfT „>d-0œn6ã¬õ€ŠPÑlÜ弿ר˜ÇY•I¾Ý n5Å„³¸Ž+­Æoî u•.VsFê'KUÖ=éѧù{»„C(ÅLÚ=Êl(&Q,JžE‹L: ä}“*Î 3Ÿ¡ÊIÑl˜yY‘;Ò. @nVßAÂÕàÈi›ˆPm;flK¥6õ‰a—O;½•$9–vªNFœ–ˆS%êç‘\:—Dã">zEÉ¥>•„0/‚b ÝLJºÚdr‹W™X0J ÖÂ9 ŽK%\Ç•xRê¾ëR‡$‹§o³¤» ÑgÊ­H”4¯8ż`€lÓô·û&=ñ|MkØOâB £Çð5n™‚G4ÈŽOw^­ÍŠåé… ?¤šƒx7‰ñ ­-ooIŠnZí‘r÷x=t 1°øƒh)ì•à½A󭵺fò…ÌRF8 Å3ÅÁšøÂTÊíó‹[büNÍvWú¾”=h€/¤¥œÞ+œ$„}-Jx1+øè{Ã7ÎÝÔЋƒST6é!ï¡:s ã–|ÈÒåãîÙ€8ƒîp(%G)Ö ljyŒ…÷JÆG2ý6’éoÖBÏz¤Š¬Z©ÚEÛÄòI•’§Ç!/} ‚e‡V™0E÷ ersB­ž…£Äcâ‚Màa>ƒX ÞŠÝËß)ôâÏ(J£X)z;·|0JYÁ( Ö@ jmÓ%ct{5ám¯ýyZ( 0OÿnI¬ºö ñúJ¤Q…p­ ÖÅU‡0øš€™q="˜w¯tny=Ì6ØÌ¹*ƒ¯b9eMfžì3=…tvÆ ̆×2²“ê®­¿`§×s YòOÕÍõìòÇ«,® u59òÒßœ7>ÂÑ+ Êã¢5²à¼Ï÷5FJšÌxU{ä­rAù]_-û+4åZ ʳÒôÏS5:¢•ÂéÍXñd¯$Ê|gÂSP1øNr`½ØxE y-A­y– hÖ“J’’™áÈS‚ô .qÏeÃ(%}MíJÇFßa ÆúÁQƸ0Ž×)èsé&Ê{%¾¦QòŽ‘’fW >k¼ÝyÚ¦¤Q"ã({DH…iP®Ä®µµ©+¼r]je€öºt©µæŽ‘Rž`¼Ô¥íßê{;Áäü?ßú„Å)…Ú×â°+¯äÉÆ èwÂìH:®—{ÙjdÈŸ¨á;8ÀÐüˆúQ·KÇÆöfŠ€ Œ‰ëój8Øþ¸Üš¿Ÿ\­öA\1”þ»˜KzK›VŸwÿz)> endobj 7204 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 502.250000 93 509 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore >> endobj 7205 0 obj << /Type /Annot /Subtype /Link /Rect [452.250000 268.250000 495.750000 275 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps >> endobj 7190 0 obj << /Type /Page /Parent 2 0 R /Contents 7206 0 R /Resources 7208 0 R /Annots 7209 0 R /MediaBox [0 0 595 842] >> endobj 7208 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 7209 0 obj [ 7203 0 R 7204 0 R 7205 0 R ] endobj 7206 0 obj << /Length 7207 0 R /Filter /FlateDecode >> stream xœí]M㸽ûWø`="© ÌLOÈ!À`È!È!ØÍ&Xì,2É!?²M¹Ý’%>)ÊínìvÙ¢Èb±ªX¬zõî_þ¾ÿç÷ï>~ù÷þG÷óã—]qhªâüµ?~ÿpý¶÷û¾±ÕþÇo»ïûï»Ï»ÏÝÿ¿ïÎ|ùøçî·ÿíõþOÝ¿ìÿú·îßÜÿàÛ®QM÷ó×Ó϶QÝoÅåçñóíþò»ýoÇû×¹Á¼þ÷¥6¦ªÃ˜yõ÷]?Muúþï¿íÞ ö[ÖÒ{Ušr¯ÚRïÿóÝÏÝ ú­uSVEkáïäËݽ½)¬Ý+Ýûª½ûô-Ó»ŠÐ¹*ËxŸF.Mejåí¼[U÷'_mOë¸E•Êî'ø¬-•jênl·0ô™vUëV]kai.ÝÇXw««xŸF.N•ž«pï[e]•Ç…>.re­î~oŒûº‘hM¿"ªŒ±&MÄo[‘›Ž#§J¿à¸wÁÝlU¿ÝŒ6ò$zé>ým¥‹xŸF.N·¸žÞ#ïf[u?Îâ[U1Ö¤ï>Æš4¶ŽÈMÇ‘‹S¥_ðQïŸCzÁC9LÙïž?|ݽ{n÷ªÞý¹Ùé…ç_¿íÊîGãU7û¯?í_æãö_Ù)u¨ÊÚv&þñïN-E}j±Ûµ®Š«–òÔRJs>¼´hôLù >óµh ŸÁc;¿§:mÕëøžÂœ{[Ò}[FT§LOØ«?µÃ?…dó¼?3ê~øAiˆÅÀŒ‚G{S7Œ^èY¥Îc4ýêß4FÏâUÁ½ÁM£[bñ{–“ËÀ–Õ%\ Ü=ÃïXè`Z8~(Ýqý5Ï.ß­ÊÂ8 e%¤‚4Ÿå˜O_;G·TE=P.x4êýKñŸÂM­ |®YˆØÝˉÇpv"i⑨wz$wÜc–E}X®¥á‹=‚÷ÆHGÑ^ø=Ìn4ðHE‚:íE¨ f§¢gÔxãmCè&fÔ7Xgu :q ó3BÔ“ì^µStÐΨ{*¨çž Õi,#r¢Å-duÐu59 g<ïiÑ3ýÚéñÚ}D½9«djÔ5lѰ·êrìjÍk6Ç£†c+>ÀÞÎâ[Õ=·,hñŒº@ïQŸÂç㡦5A9Ñ æ¶hì`_àÑÒðÌ•õÁœí"zà÷xÖJŒ3î([T½Ì:oßöÐŒ¶¯¨]ËX8LhP?…Ðl ÛeÄ‚Ò)ŒÏØ$n5ltÅ=ëQ~›üÌ„'<Š{h±|^žíŠÙaÔ½ˆë{#pËú†¸1æ“ÇÉ„çÄÖ‚ÍàC ÑáIp€4À- 0…Ë(šG¸c¡‹i{sÈ4&j£ïÔDÍàb ÓnønÖæìlLh Ö}x§yɘ&Vàî¬nn*¦r¥D,Ùc³vÈqë{Ñ2pšI`hQä’u2å,î=dj›yrá÷Õ)Ô¡Õ³{j³÷ÝMQÌßw{Œ9lb# §¸¾{"54æŠ'Â0c¼Š›¤›"Œm|If¶^qò#+)]ö¥ìL1’ƒÇÈĘvkk,çÎüSÁ ´ªð…  .&ɘå<ÖU€+œÈœöøg·´?Êg‚²ØÓ)†l³ÀXÑóÄXz”.¡Â=êŽ@ö˜ºÒ…Þ*%ftÎ*êË*¾E {S®.5ɳ” BĊίJ…šçâŒV,54–c¢ôDn¦Cn™çüdÑáך¢¶ý†…_ñ·o ú#ÀyÇ8»„q†ñ`0‚–C‚Q¢zt`E“MuDI‚ ÓT§m­ô%[“ðy 5löa›¤ps™¹Ž%.6±ñ¯Ë©ù(ÂÄÆ£6RÓcë–„Ç;ÃDj1è==oÈ|œñÔZ;|æµsOͧg½±¥G€ßã¼CScÃó±h}ÌSø3ºéÇÖ-b½¬ÅÃ;ÎPµtÃÒãöŽé†[0ïôè¼½rÛÜâÝh Ä1ãgÞÃg |´¹0²³j_ZpoplŽ%:ž™(°7,3¦hô;gýëær±:ÎßÃã0eãsž:>5η„ÿT¦ŠqâÂ4‰É–¤& ¾Î›ršd/þÏFøç–q^ÂÀ„`‡¤˜=dØ*™$íPiy2®ÜO‹²§¯Çüº:ïù“E“U!ÎÖz¹†^-à2Qµ|ñL…QƒTTÔâÕ3û¨1û¹àÄõ±ˆìþÛ®[úë~Ý}I^Fö8„g®/׿ã_ýþoV½GÍ5žðŒû†eÝåª^6¬„ ¡öø V`H,*Ëñí›+ß–¶Æ\MÔŠÁû(*L]îl©þ¨ÇºÆÖa@íìÕ°û‰ĺCx#c²Gd:£›JâŒ0_Å;fn1 :êzxâ·™ÀN¼dwfa¤ÊˆÁ :˜mIàmË[–™‰x¸wßI27ÆbÄ{ŒÈò–uªÝ«ÒMfFŽTz,iBÅ\ºHÄôò™‰k¤Nc¢4ÄVÛ Ïù í­ Ä¥ì~Zÿ=Œó’ÈwaìhñàƒV ¤Î¶Ø‡eÆ6 •õ\«êžZpZPÎ,‰ÒË©ð¿½çœ@ø …s}òÛÂX&RÞ[çý–"ò3¸µF™ ÆXnµÅ-ŠžªèVF] fk­G¤‚µ*Ü«»VÎ:ÿkª )×ÿ}‚ÏÀøßFß:èÈ£T†µâøß=ã}0'ÞKÕ©4áÏ0±ÉJ,á}Nú\ªy"ƒ™ðÙʲ)mu%¾Ðžó¨“’l,/cÞÃ0àn °5Œ±æEŽ8²wJ‘±ãð¶e¯…øaJØecÜFs*8ƒ9¸*E’Ûã;û;Ð.”~äJÃâwÏü ØqêÂS$Þ‰@GôLHŸÎÀç95>ÕÉ\pw‡9Ç™›wbûlË*ÄìÐ*Ä`ý²yU F—G5áQœ‰|hüÃÌbÁÑçb´çÐ&+IP5îÃçBM †ÏP^dŒ‡ÄÌ'Ñ%̽ÜÖoêôI$µRY]²ÇxÙèwÆäω1±Ù 3ÐZoíº¦ƒE6æ¹`KVñ6cÝAEöˆZ¼žK”+sö—;Ã%¼²]dqÞR%£2gòਆ˜aG¦*“MI8Q£.Y²IY^°Ù×JwŒн‡y$Âõ«Ûs“-PDxM©[´È9`Ë1ACBx¿€ÇÇ'öC…·‰î« ÄR:ù¦ÛòðHª½>©–z îRÙe9Æ¡&Â-É@B$2åÃ0‡aÜ3å#ô$')ö\_YÆèlÈ¢[S¯¡ÃœT<,Àìݵîb˜ÜMá@ZYA#’8àrˆiñÊRkÈÈÞT÷É‚¥ÃP/Z ¤Ó¬/½òK /í7úØ­ãi+‡ù¨}ýÁ˜Ç!¼æ­;É­ñ3ÊbÚˆT`÷H(ܽ„5-Œ¼Mìxl{0 ý²’’ÛÛTœc*%‘îV¦íëÜìCÁ‡¸†we¢„L•»¿ŸËçz+Ç:l‰‚% ˆGpù’ú– «ñ S݉¤òå_ütI4òÚ%=Ãü(s×£–{j@a¯ç¦ì—3í–[W²ÖíÎzÔ-Ï®nyS•õ‘¥ h0ž Ñs”'Ý‹ì²%Òü“lT[«Áâ{j>¶ð-[8¨¬Kv‹z㤪ÁÒÏfØÅG©ÊË+×GÁÏ@W?y 'æ µ`œÇ¡Sø-‚L_f1dÉÐ`ª¦¯,_ÂxÖmEkä—yroq=2@ÅDÁ% ·uK¿‡‰k&r‰qÝKÙÃսĆI„`É›,åeˆ»ÂÜx“Ùý)ÞœM±Úô 5æÚ™O„Ú  Ÿ)à°EíYüŒ†ÏxN˜†žOš®Ûù†g |’À³czcVÏÇUUOC_ko¡"<_z8ï È¿Ÿ"ñ svª™ÂÞ ~óKB®hŠf~vXaúb‰‹ç בñ8°gª™uL³&݉Ÿ_j¡¿‡ñ8y4'~±ÂW@}Ÿ³£fŠiÍóÿT‹˜dÁθ„€SüyÛs–@šy_Âäß”\j{¬o#æž«-ô¼½™*ÚËV½Y1>÷Ž;Y|ÿãÃCt7¢׉ZëÁÎÈÙ¬3w‘ Ð¶JŠTA#ù¹›SzÒZÕ{Ò°…èi!NUë3z Gò\ךùy{üÌ [J:á¼k{ÃH™ys‚%2ùÓ"ïMÔÙir<# ñ_u.ìMø™÷ð™Z (îÜR÷©uWÏn©Æw.O°ÅA OdêÁ™*øw‘2eGá™jØ6o1¢$n‰˜x>Ž¢ÑÍ[\v|Öy·„Ùï¹2ÆÁ|¡Ówr3˜6Kø Z¦¦—RŸ–ŠD•…° äÉHü3QIðk!á©: ì5ƒ˜ar\@%ÏŒ‰¬F é»7R%ÅIpóÝ«i*ÝYܪg>„ÂcÀ<ÜÅdMª ¦˜@Õh$“`@r&Ó:ú4!±CààOÀÆt‘9A 0êÌ]ÜN©³;Ë«[ÍÊÈ0#ïÒÃn")ë|~6Û_žQ˜Xqb5Œ{“…¸‚#Xíºöe]Ö9ðd†—¤Ù-¼Ôq‰© ƒõÆ–ÅÕŽíÓaJ¯¸/‘kDU-I¤—“éÿÐ@ -/{<ØfÒµ¥@D=Z7#=zòeý"]oøÂ#™-üŸrÅïœó1Ψ‹„ÀïÅ€HgȘÌ9Ž`ª¬y›KÌÈ*¸äJ™á±ÿqL‹ud(èbeü´*§E±=θ.›ëOV?ŽaÀ+Ööji©€Š;Îéóh\ŸªÅû'UA:Ù”GøOíY0§ZvÁn¨b÷öÂ(¨pÄ‘+gy½&ÆÓ&‚Ø$±†Ùœ±ÐRí}þxS¹œÓ®µ á0Ë ðÂòÒâÔ®Ãö,TÆžsë§û¦%ÛKGi;?uãpíM/¦`Þ0xJÅ3ÎÈñ²ñaØHƦÖDm`ÑÀ*ÙùPÆ¢ÎR&{„ñ_`¸Ú±d£sÔÛ9‘dp݇w&T“¸ 6H› =ƒçÃÈ]#ÎŒ`ýùP« JƒûòÏ-ÒË¢×±ÔÙGô0>;‚N²RÍ2M¾%8šá0p„âÇpš€$ Ή=1¸!† € gEtÐrU›!u‰K(ꂌ0ð3!µ³6UíN uf\¯l­dªtW$Í%Œ×Õ"Lî²vs-nqÛ\f‰f¹FNˆÎ>cb¿%ö)û#»rÿ9‡£˜¹J¨qí-£ô@l`Ó#EhVaܧø0f¦ŠD&¹‘·NLRwhL-Vøq“^Ë·ãW£bú2E…ðÖ†,‡ŒIØcè¼5eÝ 7åÌO„Ê”ZZý²Çà[Ô‡pÌ[8¦µúQ†g¼&a4È» Õ‘Êðx]á{ðÚc~¡ ô@¸Û7çÆ¿I¸Ï¼”£aö#\-¦Ô-S€ÛŲϳ›ˆb%©ŽÖ©J+y ¶à½Y –¶h8ê¯6†qfJ&=è–7ݰž"h LÑÊóXóR¸ê!½9é輟Án"¤ìܨZ_zç!k.%±²(¯iÍKѧõ¥È›±±6ÙæîÆ§Êm·*#Gp¯§€œOæ¥Ymy)èFxÙäšÌ¬‰.7„ j2;=¡-õÅŸ›®T¡-ˇÅýЕ·Î‡ñ32 {`³× U;;ždÒsuù]‰Ò îK©'š<©žh/ð¶«—´µUuÉÜ–­i•„nófîÛ3„Ë~@ˆ„„§ªÄ’,³s“:8ç:®"“É'Jë5ó´«¢赇_Q„S½áMLdÉ¥J_• ˜Œ‘v*µ,Ë¡£„qš1^ ƒ°’ˆÄwžu“ä¤TUOM襔-êžêŽ©Ä1ë„×JãˆEÀ/X-]ÎÓ7«ñÝ÷þ{7u/e>ÏýÁ[ÅN'™C¡Ž6ôþB¹b®6w3±­Ïw=®5î¼ÍUÈAœ ?Ú5Srë ½ÇÌIõ©±=»™Ž¡¸±9÷ß’<6§ä§„¤æ¸ÅÃ2Pj\'8°{¶)ÌÁÉûW›Ji϶~­ùæ´Þþóîÿ1y^ endstream endobj 7207 0 obj 5373 endobj 7211 0 obj [437 /XYZ 38.2500000 443.750000 0] endobj 7212 0 obj [437 /XYZ 37.5000000 727.250000 0] endobj 7213 0 obj [437 /XYZ 37.5000000 727.250000 0] endobj 7214 0 obj [437 /XYZ 38.2500000 443.750000 0] endobj 7210 0 obj << /Type /Page /Parent 2 0 R /Contents 7215 0 R /Resources 7217 0 R /Annots 7218 0 R /MediaBox [0 0 595 842] >> endobj 7217 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7218 0 obj [ ] endobj 7215 0 obj << /Length 7216 0 R /Filter /FlateDecode >> stream xœí]Koä6¾÷¯ÐyÑð-X{ì{XÀ{rXL^’ Þöï‡-QÝmIÕª&ÙêÇ3ö´¬b±^,«Š¿ýòßê翪_þ¬¾†ï_6¬n4ëþTÛ¯‡[‡Ÿ«Æêêëï›·êmó²yñÿ¾mº¾<þÛÿôÿJTÿò­¾ûÞøCø¥í/ü¾ixã¿ÿÖ~w ÷?±Ý÷íç¿lþóê-Ä~¸€ÌûÿPBIÑlјúmÓO“·_}ýcó±#À²Q¬²F«Š+éÿqJTÿûqó“ Ïj«$—ð¿ÄjgTôµÂÿÜÈð‡:x#¶£kÿ çYÁõhðö+ xžxcM>à-æÉ©Â¥áqèµSœ7[FŸ"YÝœ´¶£¦'Ñ|àN¸|À;Ì“S¥g.†žY›ähBØ <ÙÏÁp­t>à-æÉ©ž›áÆ#Ði8SȶŸƒ'žù€·˜'§JÏp =ùödÐ)dr€OOía7ù€·˜'§JÇÜô¼Ú¬™b®×ædÛÏ¼É ¼Å<9Uz† ¿,‚Qé>›ˆ·È‹¯›Ï\qOLS½þä‘kÇì¾½z¢èêÃvç`lõúCõOƸú¦zýuãj#tbŽ'R '¬iŸ<½zâåžwÃLU<"|"Oøòy3ß±pøŽ”艂¸É§åX ¡©‚Üzž¾xv¾ >¡H¶)bda½UôÖ‚I ÕNڊݤŸÛ!mmkñÙ3A¡'MU+ÙEö“†Ð¿ó¾ãÐ;Aѹ¬¥°Ü¿´çs`Hcô{hÜ@ :ã {`O$zGˆåã0L8Sö€Æ‰ÌÎcM†±æÍ”wˇ©·íK{ÜØrÜ‚yãªw­9'".•2; ÌŠuʼ³`²’³Ú4íÜöS{„ÂÒŠóZ+sä;ÂB&²ežzÒ)ŒÝ  ²º}"{\žÂÀ˜(C”°pRÀodJа< ©„QÂó²GY2ÞÔ ÞBNbì!#be)ØéDÐ0Ö‘qÒR”Ãõ ƒçCÀm$]a™^D.Ù S‹µ#+ùPŠÏ¥óU (‰ÄÂ;g02.UšÙÁZ#‚¸FTƒ¹ˆy…bçÇæK'…\#}„TŠH6 °‡–»h%Љˆ,ÓÐ5¢Øg¼À'iñêݶ4šÆ¡=š1œWĦ㵠3áx‡.¢âùÃìÁö(…ÁÀÎLb†9ˆÉ…Ç9ã Ë=e.i‰Å¬nú` |’=6È¥R7ÿ4âhd©„Òqƒ^7~g D+Ø'ÂqöÍ=æ»lœ-ÁW!IÊš]»n>Ex× QðÈ/±®c]°¿MdÍòGšäŒ€6|°8Fô³èøà;嬂<ŽLƒ= X„BËæ ä\æ8ÊïxŸü—öø*Â,=Ÿ†T Z–èW"ƒÁ3àPþñ±Õ)/XmÏå+$¶íiýÀû&æÂü²B/þDxç‚Δ|„³z¼ÒÇkÙî=¥"Ý|zò¶r:,•ÏÁ³XÏ|@O8ŒM øƒàXk$A¾#©éàÈíÜ|JpØ1ææ9œ´äÏóË …÷„ÜÜ.Š)#}ª9AÆ0·"zO ˆÄ`¬ ‹‹ŠQB£Ÿ§kÆZ` Áb pÁK íNÑäÅO’Óa‰m_š‡ýùPÎÔ¼ÞŸ]âî«É}5YÖûs9Œ5ƒÞ;¶¤‘½@I›&JûF¸…÷Z˜Vx§ƒí–XMPäB[½T(QX*HEñÃØòÌ–Ø'ZM"ò¯“Úÿ‚þ7|5¼Ok¥Ï/ØÃ]½TØõð>¢u˜÷8"†#o8"ŒÇ!H…€¶¢(‡+Ì- c‘”è9ŽîFš´Pb¸WhÁK7Wº!­Ã~[A­²9Ö•™6—‚isDª >R÷^X©öbŠâQô›²÷Çž>)’ç£Jí(.2z‡ïEl)? ûCª 6'­|”=M¹öoN±›lÛ蔘_o)q…•pÕÌ·9L¼Ç+@I®Úù3›´«ØÚ%A‹Ò±=¼‹MÚÞÑM¶w4ݤ÷˜ÇYÝe£ ©Ð“€¦®Å¨Ù„†ß ù­Sï8øNÀMõYôCz§Û.mÓ|Ÿ–©áp‹Œ±–Ÿ 4§¥:#†L}ÒåBÒ?..HÛ—nAòp$›w"!tŒ!Ui$IENZÙ)P¡´m 4{!8‚¡J‹Òé‰T0Bé\‚©ƒ+b0XpE’Vë•âiƒQÊèƒJ?ú€^é“séð.ÎûµãZj{R4ÑÜŰÆÝ“Öm]T"¥JÍp£ˆº]}çÊÏ2ïßäPÁ%ÞXᣒd‡TÈ5†XÇîîmv÷–Ô¤÷‚ ­ÖuÍ[-Üïnò¯—®»ùá@L—ø„ Ñ´ýŽôq¾6_1M8.C'TØ^«« ;±‰È»äqn†‘Ö¼© %.»ƒÅu¤£Í¹TМMè„jŽ^#’F)<§XŒÁùûÝœ­(>«BiôPJæz”—è†éŒZ·»kÜMŠ[µÖN1ÛÜ]`†?ËL3!ko¥¦Ùé KYæ}ïy ÚÙ/rYÂÁ쫇4f È×ê¯àhAGíõ]ÛB‰’î¢4 KÚ©`Sgœz?»ìI¡”f5‘w‰U‘´~ìnà¤CBB$NŠ49!´§‰¤dLHo¸,,c© $Ý^iLáÜòR9—DLJkb^Å\žÆ‘*œMÈ'2°_ËêQçhXZ1q°é[pî1ÄDbÇk•T¹1Ÿ'Ÿä¼€rƒ)¶%Ù“j/Jô`y\@Ù‘Ì6éRÊ S¡ ¢ˆ*®¹¶€°äcõ™µª9so­¬ˆ¤êµë¨Â mv ÞÅÔ•ÊŸ½Ð:€ñWíFpêúùÝÅYû³×•åâù!¹FTO|ó$r¹$ ?ªÙÝYx¿Yè oÒ~£eæ9Lé&ž©÷ä nHðôú*RzlºÖá~4¸[îÿVîÀÝÓW©Y›‚í¶6’Ð;•"¥øÆ*Ì-¥b%<ÙµŠôáÃvžÒ¡ÛlŠÖá[Ñ0åñÁ5å \i"7œá{¡ à8¡Rpê ­¯ÓEbƒßy¸…^ÞÇ<Á¸…Mâ”±€tÃòÀay~h50Tm˜¬ƒ½§¼ÐJGÔú Ö<»¨½T/›¿ÀñU endstream endobj 7216 0 obj 3120 endobj 7220 0 obj [438 /XYZ 38.2500000 735.500000 0] endobj 7221 0 obj [438 /XYZ 37.5000000 719 0] endobj 7222 0 obj [438 /XYZ 38.2500000 735.500000 0] endobj 7223 0 obj [438 /XYZ 37.5000000 719 0] endobj 7224 0 obj << /Type /Annot /Subtype /Link /Rect [363.750000 254 414.750000 260.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 7219 0 obj << /Type /Page /Parent 2 0 R /Contents 7225 0 R /Resources 7227 0 R /Annots 7228 0 R /MediaBox [0 0 595 842] >> endobj 7227 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7228 0 obj [ 7224 0 R ] endobj 7225 0 obj << /Length 7226 0 R /Filter /FlateDecode >> stream xœí]Kã6¾ûWè¼ÀxX|ˆ°ÐÓö°@£ØCC0Ùdd‚íä¿¿²E¹mI-×P=f‰f“¬wYdñã?^~¬~ù³úxÿò¿ê³ÿ¼Ùˆ­5¢û§Úý|8þ…t[ÿ½²ÎTŸ¿lÞª·Íóæ¹ýïÛ¦ëðrÿ¯öÛ_•¬þÙþûkõýí/ò´ûƒ/K¶ýümÿÙXj¿‰Ãçî÷ÿÝüûoÕï»ûé<0§ÿÿAK#·ãÌÔo›MÚÿüùù÷ÍÇŽ—ÍâŒ0M]‘Vº¢FËêÿl~n'è‡[§)+n¿7µ¶Â8'ÛïVù¸“[¹›]‹¦"ÙˆJ M¾ÿ‰3üƒÛ%ßC*¤j ¾m4‘Ý1úk$«ÃÁië d— Ñûðñ'AË ÞA*=sñè k3‰Úk„3f žÔË)5R-(M;È£SÅ3<0zDm–B{êËÖxD'Ñûð Ð_J³œ6wG§Šgn`ô…µY*qÐæz²©ݧ¢Z/Çð=äÑ©Ò3|4úó%£`Pºß€˜ò-ÐñÓëæãij‰YW¯?·Àíçì>^[¢˜êCëvêö^ªþ.„¼ÿ®zýuÓlkiz϶j! ûÜÁ>pá`Ÿö‘¨E)Ô¢-„öSm`Ks9Ý-@kØã£àhªƒúñµîÅåR6× —¸OT¹ôx<„ @¨ED !¡èIÈž€Ò‚1°ÅãVo]#vã½·àyºÒnU×eu1âÕWHeŽLFQRw qöT}]OÁ‘’N´xÅÖ[­ì€p4܇5ÏìÓÀ>î@v]ï,ÈUÍÖŽNÀ–Aà…Ål•t4%`S}ðØsް¸Œ°0`ªnÅ=ëÇXnó|ÚÆ¹C\ôä-Ìx“ô¶|B-„·Þa!À‰ÂÀv0ì#)» ðæò9|Òp¸é“Ä„±8a†)ùˆ÷Œ# ©’„SΘnÃRÀ>°E§Â4j NJ©„éç†\‘ò- &™‹”é­'¡/¡7Áóø>i´IÙ¢Ms¤R§hS¨Å`9×'ü›ºÈÿ•Ëÿú“8òo0ÔP’jFûY4cF ”Øõ5c}ù¬& u ¦>FŒ÷4p ÞÓÀøÀ5MàÓxßW»Kh]lÀ•Û€œ½cÀ@¨‹ÝàÙ EãÙšð'Ú]ô¨•lJ²lJI‹Œ’ʼnÏjÄ’Œ ê¦ é§0&Þˆ„<Õø)—õî'!èùÉpž[tŒ3à<áhøN^€‚„÷C‰$¥–±œ“h¹ÜP][*ô M½¥»«DöümÞÄISl¡’PDRØrd˜,–£“ eŠå8¥ˆU‰-ÇM%¢IQê&ç”V±C^*T‰`©SG0~͘;-’G#[ÀÖ}±¼È§ (R«Ä”sò«è‰— '‹žœPÄÈe¼eà(PIOö;¹i8lúH©XÂKÌkÏrø¶ldM磫r(,‡Ã …Qm’G˜0ûf ni,/X‡‹%ì8lK´xJK_iܼÞÉåTfäÌãû¤¡¼NÅá#¨ø@Àk0´[Žb¡¼TÔ%V;¥ˆ©c5\YWg‘Ùv:yœ­@±¹XW—Øæ”"HÛ`ËÁÉlÇ‹FÎRoLob¿ù*œ¬º7Œúœ‘É…ñuª§ýáéáÈlaÎÄwÅ ÏÀ¹•ÒLëŸÆ/õ ¯£bl‚Ú—B 4ç”è %&§p.£¬_”‚‰‘1–ßo”æë[º€¹ ìÞ¢†¹‚‡ÍÊAe‘˱ÞÜm=NEÒ€"cZ`ÓV$]п5íš|àßp|Áˆ}p$à¦Ç(Z~š¾Dy"!®R3¬¸ÂÅ\a¢ç/®|µuコ˜££šq\×X²DÛ^<·efdâîÀ@Û¨ëÀ1ínL˜„Rˆ¾4k¡e7pýݳ•5%Òr&`ƒ¹<Ìüö G Ç+ûÕd9D.è’—¥+ž€¯¾•ªà ê¨%m8¯5ã´¸µŽ{¤«¾DzàYU”8" ·@FÖh;ôùø *£X >Ú8 “áŠQ2&Õq‡Ç#!­p‘õ|M~)¾€®1^Ôo›\‘bë„W£ù8IxpŠÃ­ïsIÚïõñXáèDáºßÌÒT𝩮1CMõOÔê­¤Ù KNúï”àµHÜboœ¨žAŒ-ûцãÙM½ƒ}句ÆR³cþŽ÷»×¦Ûþ_6Ô†áÇ¿ùmópËøŽ= §"Éʉh©×J+ŵ¶4Þ’À MÎú(î¾åüõ€£‰º¡<‰ýI‹£yîÑh¸Oª„jΛ/ëo[cþ(\+s ž&Ø7•ÍyBå·Ùè^Óöoy-uyZëîš$2ƒÎdÄâã0šqHæ’#KßjþyŇ\¥8Ôr)¹ŠÀöäÕ>ä*éP›¦lÿ†0ålÿâ{DYÜO“¤Ê#¾³Zr®?žqKøJ2åß9-Y×Êθå¦j'K²åßYR‘q­×õu&P¹0ïG|%5åßk—ÿœŸ)¼ÚG|¥¤òˆï¬–Œ+w®/ÿ¥^£¸ÞzRªòˆïµÛ€œ½cyÄ7ÝÈù_)Ýaë2ÑmÉ@B5ãB(‘¼d[å†.Ç=à½ÈÍ…5Ï?Lù¦ãÈ‚”é_¥Ës³oyN˜/cõÍ>'œ†¾n†ÌßRR©)»‡yÓàmnöùÝ4ôµå¸SŠºí‡lÛŸê­%dÎÏçþ`ÆZÙM1Aµq¥ ÝQåJöÛr~7µÒé|¾Xtº*ûkj£ˆ¨·¨ßǕّ©ÛšG»å2Û“ÇÖÆ'Eõаàí€zŒ Ýñ¯Ž&Ð <ìã×ttêG™"®Àí¾·Ÿšë©Ä ‹ ‹€cñáû©>˜ã˜n 6 %, À˜¿‹X^½ã™PÈpAuª­¿Û3"ŠÂ÷ùäaß.‚-6öL H7,whpK@d Õ8>'ÌÕY+ÔÖÛûå…V+âq,{Ö©=WÏ›ÿ_c endstream endobj 7226 0 obj 2760 endobj 7230 0 obj [439 /XYZ 37.5000000 542 0] endobj 7231 0 obj [439 /XYZ 38.2500000 148.250000 0] endobj 7232 0 obj [439 /XYZ 37.5000000 542 0] endobj 7233 0 obj [439 /XYZ 38.2500000 148.250000 0] endobj 7234 0 obj << /Type /Annot /Subtype /Link /Rect [314.250000 57.5000000 366 64.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization >> endobj 7235 0 obj << /Type /Annot /Subtype /Link /Rect [209.250000 105.500000 219.750000 112.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://help.scilab.org/docs/5.5.2/en_US/tlist.html) >> >> endobj 7236 0 obj << /Type /Annot /Subtype /Link /Rect [163.500000 83.7500000 180 90.5000000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://help.scilab.org/docs/5.5.2/en_US/typeof.html) >> >> endobj 7237 0 obj << /Type /Annot /Subtype /Link /Rect [276.750000 83.7500000 307.500000 90.5000000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://help.scilab.org/docs/5.5.2/en_US/overloading.html) >> >> endobj 7229 0 obj << /Type /Page /Parent 2 0 R /Contents 7238 0 R /Resources 7240 0 R /Annots 7241 0 R /MediaBox [0 0 595 842] >> endobj 7240 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7241 0 obj [ 7234 0 R 7235 0 R 7236 0 R 7237 0 R ] endobj 7238 0 obj << /Length 7239 0 R /Filter /FlateDecode >> stream xœí]Koä6¾÷¯Ð9ÀhćH dlO€0l`Á3y H‚õæ°¥Õî–ôQÍ2YênkŒÄvÓ¤ŠõfU±ôñ‡§¿þ]|¼{úOñÅ¿{ÚU¥­«þ_Ñ}}8þ@ºÒÿ\XW_þܽ/»ÇÝcûÿ—]?áéîíOÿ+dñcûßïÅOÿj?üêÿ¨ûƒ?wVØöûûïíOÕá{÷ùo»~SüÕ­8<Îsúû-4MÆÂ£_vÃ6Åþëï/í>öˆ{Š«e­\!´Ò…h´,þûóî—öÃòUé´ÊÊZ·?7FÛªvN¶?[åÿQne÷tU5…M‰™<|ÿ•fy‘~q%ŒÎ¶xyr¬eDxõ²ÑBØŽÐoá¬A²}ØA6m_WÏA[¥L¾Å÷§FŠ'-^<³(+å\2%UŠ Ëç ˆUF^ê OŽ•Þxõ”¢lêÔÔ9Ð?¬žý®¶§ƒ<5RÒÂÅs‹²³ejÆ%H@›"ZŠŒzbyr¬ ôž¬þ³ ¥ÿx“/‰Ÿžw? Ý)GS<ÿÒ·fÿí¹EJ]|è\ÈZÏ_‹o«JÞ}W<ÿ¾kJ#ëÄÅF„F#êûøñBPÁ9pD÷°=<·DÊŽßö,±„‘êîÁÁ9p?HɇÓú¯tHI»c¤w«Ðß«<ÍAÀÉWÆl’v‚[if^Ä·š‰ßiçHçàÕ0®1ÔÕ# 5 {loÜ9 aDF,¢!§$å» H‹R>‡ƒñs"°àÌ™PžXRcðòí¦û‚4 /W›Òø>^Ð$´LJœM/Í(Ü1¦q€U±„;(œ±»ì©iFé5^€]±°]§‘Ä«aÖΫ6/u¡™ ¹1¯tßD?ãm`ëœB§ST«†>fb+†™÷û^@@ž°Ò…ÏYTºqúSâh­î¶QL…}°³NÁ5ý ‘ÑÄŠ.¼’%èÔ€Ñ`Rzš/+§ä!ƒ©pç†pÜG¾pg{a„-¯ƒs$!RÀÌ‚-ÂêwõÒ0‡Xk€w  ¤}`¥Ö¯£×îƒÔÃR ÆÑx˜ŸÐð9 ¯†!À±gŒ7œ€P“`ÃüFÀ Ôfaj8„’s¢TäàÅÔUæô¥Ä«¶c֊Ǭ¤.?Ɇ(ŒH.6Ãxãò/“†EØ¢ºjŒƒ±PN‰Þ™8ë¸y5)ß%ÎÊä8ç´JLÄv í”ó¨åp*g«Ð!œÌs°÷‡Ïy ûŸ„óN æ®†kr8€¤ó Ïà1}'¥å±¤§,©…ï…`ÚÃs¸‚§Åw×LézùÖìûª)Ó}¤¤Ýá¨ß ,Õ~qË-Slâ}It]ëM¢O1ÒHn‰†œÍ)ÑF±[âõ#zïJÖÞ¬÷#ŽÛz+È#éd}!kõ à²”Øf&œï؇"|+p0„"£GÓ,NVRIˆeeGT$…$)AD\ø‰ƒzI+é’Ô(S¢–Óå %äŸY%åàj8 @)~bŽgÕöf,d[d5¦ 3Ôj›áèVl²¨×[lãD½LáÍc!y,ø­(*Ì8ƒ/•^ÄüVÒ<[ØV¶ßÏ;/[Ö58ì{K(o å<<&Ù[Ò56FôÖrg„ÇÞrç’¶ºUzܲ‘×àÁ•ÞÚçŒ0âØÛç\BbT ÁnQx½\,ªÍ 0b¹­GòѸÌä|öÑh-ë! æ›A‰ªìsGDÐhăY—rÒ ®†çøî\ssøœÞqrҌûóÝ}ˆFæ.\­‚szµaJ%zZ½>îÔW3ØRMbõL7}´l«é=ž™®%à<áþrâû<—×zcÚè§d(}5(É+¦ë(8µÑù¦{©uY¤ÏWÿàæi­üû¡× úOøƒñl˜ï(¤\_°ÎïðDjÁÄtIŒ$ÚikWÎ_ðá8YLQ°Ù“çµÐc{vc|>cf? +?ÆüRBÉçgv¸ZÏè£Æ>ÇÊTœ(Óþ“³´°ˆ0‹Ní"‘¾F„Üúõ›ÓÍv0ïAve·`W&Ž?øc÷0Jy¬YÂ)ux$틼ÖË2$y(æ)BŸ¢˜Wæ}a U¡§ô¼Çéò^­{kNÍ58¬7É»5îÊ™¬Ï?ú¦‰é,y:Q哤wàÞSò“Ô;¿j¾½Â˜µdb+„ Éøû;'&®e¦ C˜Ö w°™ Ö2nÍÙñÖ®²Ÿkc£ |ãêEîÀìq{•†»¦„ðÍy%)ÐiËö·@wr »¦@÷­IXàp·šoMи$›ø°žå«…™>}ï á…àÚYï'íÝ’Ü̈½Rß:fÜ_d¬9½rYûÈûxw/ðvñØÉòΓ¸*YlÒ¾‘dž#."'ͨ \¹.QrùB”»½IZY¼¤¼-Ó=6>¸[y ã.î¶¼Ô>gܼÑã½åÕ7nüÌ$ç–´÷))«ñ6(«5€äòœß“ M¾rà„«nn\žSÄöfû- ™:lB‰9_ÞùÜ!ò‡&uU¯.lWPDô†.s9‹•ë1Óö¯‹IK¿¥ä’{ë\žn HÅÑ! N¶ûqÜ%¨Êf¹t>].Aí`Þƒl| jüÑk” v ŒðxëÝr.ºå¥ª£«}“«fËÓß®~vgïMÃe[ N’Ãqy×a¶^|DÓÄ”[Kâ!Ý‹x!JÚ¤ ÅpSÈOi_W“öl•ôêÞ OΚ!éζk‰ó#isö”W^PV#00Éë»õ€ ©z0"›Ôf\ÛáÞ‡ûƒTû×ÏYWB{/J<‰ížË5™%ækUË;â†GSÉãÖp4¾ 쑊¸ –äšgÚXõÒ½™=™Ú¯â¥EZ§KpÒÝl*¦Õ•èê/‹Ã+‰ý)eN1÷úÑÎà§?¥ÈRö»“SЙލ{?ÇLÞ;) í»GÏQKîðlŸýN'%¨žÞ8­ÇJGáÌtƒž[ñé›­™m¼œãY]DmýH»P®û¹…x 4Ä„{Â,€WÃ, Èìx¦8¦„±M€c 00¦/¤"æWïÏdøïÀÎÍÁ« …ÿ¤(¬`ðœO¶É5<‚aó‡Á9eñ†ùAÀD& ° ÔÇ)ªÌÚJ•^ߟ/ÔÒxDµ|Z4jÅãîÿExà; endstream endobj 7239 0 obj 3381 endobj 7243 0 obj [440 /XYZ 37.5000000 533.750000 0] endobj 7244 0 obj [440 /XYZ 38.2500000 230.750000 0] endobj 7245 0 obj [440 /XYZ 37.5000000 316.250000 0] endobj 7246 0 obj [440 /XYZ 38.2500000 230.750000 0] endobj 7247 0 obj [440 /XYZ 37.5000000 533.750000 0] endobj 7248 0 obj [440 /XYZ 37.5000000 316.250000 0] endobj 7242 0 obj << /Type /Page /Parent 2 0 R /Contents 7249 0 R /Resources 7251 0 R /Annots 7252 0 R /MediaBox [0 0 595 842] >> endobj 7251 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 7252 0 obj [ ] endobj 7249 0 obj << /Length 7250 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø¼ÀxÄ—HA€éž9hL99³Ù,™E:{ÈßlÑn›ÒG™å"%?vt·eñQU¬*Öó㟾þcý¯ßן¿þgý-ü|þºj6Ö4ýëí¿ÇH· ¿¯­3ëoßWoë·ÕËê¥ûÿ·UÿÂ×ç¿t¿ýo-×îþ÷ëúoï>ü)|iû…ï++l÷óß»ŸÞŠî·æðsûù/«¿þ°þm;â~º°˜Ó¿?hi¥n¶Ë˜˜úmµß¦ØýûýÛo«=òfqFk׬…Vz-¼–ëÿþsõs7Á~øfãµ¶Õ¶¹d"+·3™í Òw`oü`¢Ý?žáEÁ­uåß­œ*Bµ"=úÆi%”•Fo½E²qNv¿[þ»l_Ní.]°†/€Ó[ổ³Cep|Á½*ˆðÝÊÙ¡²G8Q^·sÙ÷ûðàß*aÊ ¾[y)ö=ý%g¼”þ“­N)†:eëz]ÐoÇíTÚð·ï8H§¶íö‡"|*×­9hÎá“o«Vo„ðÒ9qø–:EÏÑ}?üí¶¯­£·;–ÍÑ}Ò½sº’í·ÜÉ(îtŽ_VO?¤µé·Èž^W¿t\¢]¿þÜádêþÇë÷U·£»Ý™õëOë?4t\¿þºÒ­ú+Æö{»'M»{â6Î7­4ÇO~Ü=1%8}òŒFŽfÑ%ú'g ŸXœ8±$OŒaW¯\,Þ†Ù=Q£[gGKà‰søŽìŸ±_ Æó•ÿ$0¿ŸÄ<§ Û†øÁX œ#<Ïà´P@L!ÍáiÁØhòÏ‘ü‘Qš k<܆Öq¬L“—`Ò‘ž•RzBͦµâÖý<Âl¯Nièí©GîÅ+øñµS6ÊHKÓšH\&˜ ´Lb^èªýæ?Õ”™Ø:e±xø ð±lrp|ˆm b‚èÓQ$I©{vÇD¤oŠš‘CÅJ!0ÛÄ™`Õä¨T1P0ÁC²ÆKR˜Þ˜š&>ç†ò- rþ}„rè'©« ˆ@bû Üï,j>ALb =°€cC*|@‘D’.¼V Vys'¡  †5#ô4±<€Â· Ò}€\Ì2ð­ûa´š>ÉRjQ%Æéþ:`Œ„;ŶJR¼úÑüƶ&"SVóGáb$‰EÌ,ÎzC³[a#Á:•Ø]»'S1¾ al †‡ ¤ óÕA#èxp¸šA„w”¸Æà““:ÆÚÊl× Š1?!º?ÅÇ[­°61H9t¬ZX-_Á4·Z”•øi>Cü°i¯B‹ðPå|ÄD• Lt·ƒ®0òD;øŽGO‚m¾¤|P6Ú[ù Ö"šó:•ÍvŸOŸím£ö´÷QK8&cOž íYH{ð® °¤±':ÿ ß 8Ƀ"阮»S1…aõTq=m¤ŒAr.¹„ï`<`ZÄôK¡Eõ ×÷Ó@Ž×†á†OjƒGn¢"½X?M¿l÷éõlSŠêJkLWS)Æ7~9Y‚æá~-qRñyÄç„r‚0DñÚàiHH xî™qJà}œRä#žGÁÑHøyÐN‚vxu¸N± ôy´j/Ð$(¸OœMÌñ;p˜bü–ûÌPøÓ’u‚…œMcs6)w†„þ„ñˆù%<µ÷NIž'Sòº>–zŠá÷6Ñ9Îx¼nŒDðʼnG;û”ð¥j†íx߯Ç#'έløÉÀK÷!d±‡„'{Q1¯)|º¦ÕÛµê”`Ǥ~5Ó«¶F=Áú4Öð-8ZB?Z„6ëQ›’ð kr¼7ÚÙ-ˆz¶Yîº[å­€pkÄ£5n‰,ãdÈ3èŸõd`."1| ›°šÀ'˜–ïèŠØR~¾˜² Ö¢ç™âcu bí+Å’3Aqð"¶€P40•¹À’-±˜g(i|Û¨Ö«D±%à Ó?ÖC¡½‰WÚNrÜy%§é–±˜3³d é¼xLÛ'Mãa 8 ”R@^­Ãz™‘–³Eëã0×&±²üA8ÑÖ}¨0̘Ëd‚Ò±¥pP„!ƒ •õâ0ãëÞ°döfÁ£‰¯2”¶V ‹Dö ¬" D2¬¢ÀO¥”ÓxÏ.jår¸kH42{îïÍ:–dJB9Ä¡GŒÙ  7šÈ_eM™ªUû’äÌÂûÁOæOâc-Èÿ T¹¡Tè$Aó¦ÃR¼©%î#%e¢u‘P¼ª„KRµA¤K.s¥Ó½ÀJ½õ¯šžøüú>µñí 'rÿ-w2Š;ƒ¡'r"lÜvoÍ)e¥ú$¾ ‘扴*œl„SQ©X|É•°ùWpâ¼Ã”¡A‰(Á($eÍ^̱Â_8¥§IŽª‘á‰m”^c Ï^yÿFc dš‹dš•i~ ÓüˆLó™æOdš‹dš•in Ó܈Ls™æNdš«+Óü‚d.½‚¥ÎÅšSrÙ6‚.Irex…)ùN,V’{ãTåCûYëTñyÊÁ´rPÞì¤Ô¡!Á‚3£ç‘œ¨ÍÀÈ*S6[J„‡òÂÇeT?}‡î‡ QºKæ8Þ«äÙ”Ií€XæªTAŠ$¤Ô eiRHˆªÜy¸T: )böªb'¯R‹©æ5Uí¾.Ü£å)-²«t¥‡ùÐGä’‘¤•¥$³sÅ‚g¨läd ¿«J¥¯W¾Üèê¥uE§E§'V°ˆÒ™úPÆxþ“ñ(7›:µ÷UÒUW™.źq[?Ü>®™ÿÏo=2iá>£üù]„7æPÊœTž²;ØæEáV°†«Æ-h°¤‚+ÀOÂU©NLíF> móÖ8a%—P-Iµ MÀXY›b¯²- ^AM)h¼˜¦Ò”u­œnCᑉ[TS:Á½rx\Y²RÂ-¬n&ÎW A—¹ØÓT¸mɽ) –¨MJdßtÆÊì­Nx{9-0ëaQÃõð’ƒ :"æIu1ýÝX\l² G1ÑÌ îPaèáž¹VIŽƒË0Y9S=äg~ÜÏ~9 2)'r6ÅÖ¡>ë&×s_®#/Ú VJyÂgOrkáG/ª}=o#êh6½ íÔ=iö-äÀðGÃï„àü±w¡ARÖCï‰{3¥¬Çì‰Þ¸yÉáF0Üä¤ÝÎÏ0(n™lã\IÁdl$™X*éçøÉx³èX ÐÕªtŒû¯ÝZR=³ñuyòú*%¥³G¢¡Ø* ¤r¨-€Ã{“Hµ§´Ž¬Ë8J6jбÀ#ÉpJE;BR_ ÖÒê3¤Šrw¾rArºœïLº¨ÑuFjÖBŠ×]I×ãžY˜¦(¬n¼—æ{#ÁEŠXK«žRÓP(Ë*ˆÍh«ÌŠ|­ðFB7ü© ¥UÉùµ\I½t)-‘(!9¥uH×ø*Vš;º»PähÂ.r¿–zž†Ú·ATœₒИX>šßrÛ¯ôâý(ž0$D-GŸÐÂÁÐ9þªóËR.±`-k…„h¢dJ—GÊa©åØ(q*Ù¦Ñn)wá‡-î °Õ*€Ü6í!äÑ(Â'Ô'R›†õ~†W«·R8 «£œ—Ï_UñÕ%·¯[ÎåŽäZ¼µžÇK6ΘªÓnË„Máê¸æ®ý+«$êÎà:-¸¢/Çuï!û àd‰©ýÔÁð!Q&aJ&ÖÑ(ÆûQOáëíéá£8ÖŠk‰úxøB%oœŒBI5Ãç>Qñ‡T÷ò¢¤æÚg8 h {­T—ÔQ­«„Àiyð‰ÆõÅ`ž†;­Š-³ªRPò%Î ¬F›¨Ô…kkÕÜ·ß×éLH—ZWn¥¢{ÉXºQ" a]·j„™?á$hC±°R ¯êøvtIïõVÙö¸÷z÷·ö^ï>õ§}ÑwŸD½×ûo©“QÔñ¡÷z÷·ö^ï>Õƒ9tÜ{½ÿ–;ÅÎÁÐ{q$8’“ÓèÎ(±Ârøf3¬< Ô%]©VºªÉ‘p³Äýnp fÍfÖ†¹*‚áu9ƒ)â“7¦°~p7¡x\K† Á!ò:>mXçÎèï¸ÀBg¤ £åè5D^wï‹ÈñQTðØØf )]—/SØ}¤°ûQ…Ýv?¢°ûƒÂîOv)ì~Ta÷…Ý(ìþ °û…Ý×SØu#'é÷Ž\m¼÷gÌjéÝÈa–òÏÒ™èˆð*÷ø ò‰Úo¸¾à@ø¬/"¸OÜ.ØÜÉ‚y×ÛpÄcúfÇr Ç¡¤©²F2K•ù³îÎÏ_Kä+PDz•Œ³Ò¼ŒHW?.­‹ç¼©RûVؤŸŠ_pd<'E?ãµ×:ÿ‹»sßšu¬ ÝnKÖFj.Giƒ³=Îo“à'Ë˰©uê\ÓmFE7ÖCFJ"H ÔRÌÖå‰)#âî¬ ¡Hߎ×vÿÖoSMòÜ—©/œÁ”Ýx« µiÄ6Új-£‚Âc¤Ø‚K¯õÈa;¶p+iÔ¢˜ä¦Ô²ïŸÑ> endobj 7253 0 obj << /Type /Page /Parent 2 0 R /Contents 7257 0 R /Resources 7259 0 R /Annots 7260 0 R /MediaBox [0 0 595 842] >> endobj 7259 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 7260 0 obj [ 7256 0 R ] endobj 7257 0 obj << /Length 7258 0 R /Filter /FlateDecode >> stream xœí]Kã6¾ûWè`<|Š$°X`ºgf=ht9{XL6™`{sÈßdQ[ÒGYeª$·=ÄÝ¢EëͪRñý?žÿ]ü÷âýãóÿŠ/ñóñy'öΊæ_Qÿ¼;¾ ü>þ^8o‹/_w¯Åëîi÷Týÿu×Üðüø}õÛŸ…*þYý÷kñ㿪‹?Å/Õ_øºsÒUŸ¿>ƒ“Õo¢û¬¯ÿ²ûá»â÷zÆöq˜Ó¿ßå•”5~ݵ˔‡Ÿ?¾ü¾{ß `ÞS¼-R…4Ú2Uüÿ?»Ÿ«´Ó‹½7Zj§¬©~¥qÂz¯ªßŽÿ¨wª~º•º*ˆB 3xøá'Ïôrɽ,—›üyv¬H]Êôìû`¤t5¡/ᬈ Ò7R•p-€ÿvúðï¤U rN yv¬´Äų/,Í•þ‹HSÆ-A·Mœ‘KrS yv¬D‚'f_šà¦²r ÒÜ"4é¦_`òÒ,8ùòìXi ŽgϨ¾«qs°Í^,€¢núð_™æ°qgÇJK\<ûÂÒ않¡dX€&ÝôKÜèåÞ@ž+‘àÃÙŸæÌ‚Ai®Ô›9ÜDT>BíükYÏ[íaÚ¿ÕÞWœW–õ‡“2^5Ei»­R¼òeWš½”Ay/»oé“Yôñ3ªïÇ¿E}[Ñ»[…þ3ª+Õ=§Ôßò'³øÓgü²{ø.½}zM ìáe÷þsÅHeñòsE“ª›—¯»jEïÏrÅËOÅß*0Íß‹—_wf_]²‘2͈z<ŒÈ *Súj°åaÄï}¥²G÷ˆG4›”Ílz¯•—êx6…fÃ÷h!€³‰O‡ÛNvÔÂ7³3=Ddb$+°ÊCäct98¢ûKÇ˰‡Ý2ÊYœ‚<Ày³âO/•R¹L*¤‘†ò¦'ºYUØÀ;YïÃüùˆF”™OÄÑØ=%¼G¡­áˆÉ…z¤tèk$£!Ÿq0‚~%Fˆ2?6‚ï#·ÀL\Œ}h°¥™`¢eQê¤í£ôÃÒ(­ö¯g£4ÁqX‰P|U&ùŠ!VVp ùŸáwb6ÖpzŒsìÅb_u ×~A¾õ®ì{[’ã¯bw`50ºú[š)4O×Ͱ4LR—Ð"˜o1fÈ0AȘŠ9Pyy=ļÌ4Ãß¼¹ ‚±?~Ó—&m/0iG“v˜´#IÛ&íI`Òö“v40iI3˜4](Òž&-c`Òºi‚5ÁrlÈÉê¾Áe þ)ßç¾ y1’Ï„{`\߃#;y#U«†éQ„ÍcY#Ä9÷,k·ov7¸ Sš ûjâ*÷™ÇÎB˜ŠÖ¼B؉fK&ö(±À8¥p.~·óA‚{“Ä-Ì'3èš VV«*pÒ Hh·p¢ gKà= [NüJæcûvxl$0òKi™ùåžšMÉŒ†yÄ„4AŒ*Ù_zsçËoÏù°:_fÛ5LÓ¾­ç³êØ$dc~ÊRñ¬ÛÈ %­.«æˆ.0®\x£úá­U’äµuÆv|‰ù®Ô„mÛÇ2ø;ÿ_Æÿ7eSëWCoѦ:k/€”´º)û¸8{¿>lÊÖú°a;Áéó¸."ÇÛ¹gR.Ñì‹úá[oü)·ùöKYè¼ú¡+H—$&!dÀò&¢˜¥Ô)Q˜ŠR}@Éø!Kaùaªó%ûÍÓ8±Ày0Ð8IÈ8r‚ÃWA„ëÛ¬%JÙç½'I)vÄiCL«í•Å’ª·®2™Î™™ ¢îjè!‹óýSì£+ìí|ôÄ.Þƒs‰(ÆÞYO­‡‡Â:LSÆÑ—¬³Q(Œ×£ñëÜ©¬qŒêaîI`„°ÿ¥ÔCàø^)Žyb¹W_;pÌœ´å$< üR¤Ž€¬ïsNÈ6æ©¡.M`GO‘yÖu[}×·©œpêý—ç\Á*'A^ 2GW×-Õ´¦³•×Nã{íÁ÷Ûr­ff[µíš8§wM\f½x•µš M¨_ÁYNJÞx#|Y*n¾¼×œ_o͹S^2ó WíR¾®®ÇòÖá%´â&xLKöúPŒJ$²ßÚ2—o¥Únm¾ÔÜu››öᘸ‚"›á{“u›NîºÍ <óÅ«¹œ±˜”iLn³‹áU&›¯´ÑT.‘ê; [Ôç>HYŠ*fL’¥Gα˜e¡ÐPÊ@)-$±=*X:V»§ÇQ4WÎÒ×r޾=…­‡ûÒÉsYp}eåO-›Dí²êÖÛöË2‡ÆSÝ…ßvÏguâÊj4Kß#Bìš1Kwt¯š¹Òžme(ÚÿªzYdíĜ٠ÁçhÙG$¡«4ýn¿ß°§×G ¥ÐOOz9#ŸÒ²gÅOÞ–}Û‹Ý?Ì$ñãhtç}ßµà*sI ³•x ¢ãz«¦˜ ,Þ7¥x¢‹>¶¾ØœPøÌÃç0ÖEW°²gµ·_¯<¯ ç pdPéµõ¼b}¢/'ÝëiÄ×ÓXÃ]·°ƒ+{Â×ÁÂÙrº;ÒmåHl@JÁ™<Ì¥Khü–’=W{•ýجƪ5'¾¨KJFú7›ÎÒuï®6‘bß„ îåÈHtÒí^õcx6|OܨŽÝàs5(õ¾‰RÍæÚM‡úÌüœHøØ"ëÁ¦à=p¥xD@ŒJ¦æÎÉöm¦¸{ÙÑ%vŽ36³3Ú‘gICQò•8ÐEÉh爳'vÓ9ß¹ ©56›lùy`„`ñ¹MnÃÑFJºEÃtKæ°÷ »aAcêŒñÖÚ ¬–BÉ|` qí'Á{ݳwyÎmÛNæjÀÍýçY3@|ƒmlÅ”“NGÿQšè0wÆ9C;ßkº ÃDJAâf=Úp‘.K™ÒNyrÓË8F‹[\ßêŒïj-IÎs·Ûíï²´6#Uý ÔX•´š¥Ï*k\ýÍî‡*¾U+ͤÒvš[ïÖžmë:[[%d©z<1§ŠœrŽ"¥ ïvÕ-æ ´ëÏ„¥ÌAÎóqAvÆò­ûò8÷\§S:ç:ßô^¦]eú·SF¹º8rÖqú®úîÞßVp׋òP¸<£ƒñ½¿-¿]=W¢#Æ測µoFÌ—a®þ«œÔ ]u–[¬¡p-EüÂX¡´›¤Ð¦{ôRÎÞ…u»œ•ÌÁ^Òy}‰Æ5\\AékCá— ¬s,Ej)5Ò£„*âÄl\’N:+4¶3Œýlƒ»¨gôó±Êk_I{ 5¶É”nÞ„7°W€WŠy9ácà½Áó¤h»õ-˜%tÒNœg ßÀx»@oðh‡`¦¥)ëH¢‹á͈D´?‡°¿Â¶X1'Q|.<‚q@Ñ(ØÖâõd•ÜY9¯×Gé2ˆg³Yà¢)ôk6@Sìs1Ñtï½z!õäêëæó(}…äK Å¢çè©F=c°}Ž+EïàÒnó $•qéƒFE‰»%áÐÈ2$ž Þ÷FrÖÒŽC¢2\ý»èâ âNÁ5aÀ³aÐ2;¾SSÂ÷Ø&A€>‡%ÓRók4<#™€>'¾2vž­mn2@ŠÆ ßóa+û=ïð†-ºqcÊâ óƒ„oðà‘Ë@­qüUfÐû¨ïO„jé„þ>гLµ§âi÷É{ endstream endobj 7258 0 obj 3157 endobj 7262 0 obj [442 /XYZ 38.2500000 630.500000 0] endobj 7263 0 obj [442 /XYZ 38.2500000 630.500000 0] endobj 7264 0 obj [442 /XYZ 38.2500000 187.250000 0] endobj 7265 0 obj [442 /XYZ 38.2500000 187.250000 0] endobj 7266 0 obj << /Type /Annot /Subtype /Link /Rect [204.750000 743.750000 226.500000 750.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_pointers >> endobj 7267 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 164.750000 178.500000 171.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 7268 0 obj << /Type /Annot /Subtype /Link /Rect [67.5000000 737 98.2500000 743.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://help.scilab.org/docs/5.5.2/en_US/overloading.html) >> >> endobj 7261 0 obj << /Type /Page /Parent 2 0 R /Contents 7269 0 R /Resources 7271 0 R /Annots 7272 0 R /MediaBox [0 0 595 842] >> endobj 7271 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7272 0 obj [ 7266 0 R 7267 0 R 7268 0 R ] endobj 7269 0 obj << /Length 7270 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€e>%ÌŒí9Ì9,r¼Ù {‘Éò÷#µ¤v7¥«IJÝ#ì7‡¯z³XUüøç—ÿú½øøôòŸâkÿýéåÀÊZ³îOÑ~}8ÿ@˜²ÿ¹¨.¾~?¼o‡çÃsóïÛ¡ëðòô׿§ÿ¢øKó÷×â§¿7þÜÿRû ß5¯›ïߎßmÍ›ŸØé{ûù¿ûCñ[;â0]¿˜ËÿPÂr#ÚeÌLýv¶É_¿ýíð±@Ø,FY©‚+Ùüc•(þûÏÃ/ÍÃð¬4JrY ­šŸm¥j¦MÓ¹¢ìÿP'¯E;»Íú…mPÁíhòãWœáy‚Á•´é?®<:T¸¬¸ôÔ×|@¸ª€í4| œÔºN7øqåÑ¡2 ^ZÅyÝ"úQÒíÁÖ=€´‹’ëAt>ü­f&r+•¹xôÄÜlµaÐÚ•$ÀÉ0|ŠÁ­J8øqåÑ¡Ò#Ü3z6å›§ããëáã®x̪xý¥YÜqÎîÛk]|h I[¯?dL<ý©xýõ`ËJèa‰³-µp[jØR¡ö…ÐG„÷áp§ŠÁya‹…ó˜ðUK ûÀ¡áh?²[õç׆„SSŸj[wê»Sê“x´ Ôgé5Ä‘ôÝOÙóR«ª9.œm­C•)eÇ•þhé6 J%;Ç„ ‰>ê3ìó„ZzTÉaig}4j¹šKÂ3ã‚wÜíK—R~1TRVM‘1²E)HI$¢ô‰‹™¬—Ÿ™)˜PB‡rZ0$I:y:Ãz¾†¨Â`–¦RæO+C\H¹d¤*3¶wÓpË ÛãÊtºŠR:)×щ¤3)™£™2Õ²9‰,;yþ†kõztëI9®0¦ËOƒ$ ´|_¤¬<¡l PBªgÜRm”"‰!ÓVwü¤í 4VÔ]Ü‹'äÖ…ê¢ê£mŠ2)ÕC]9úa÷8Óè6Š»?ryÝ¡}/í»’gSóŽºó€BwæÛÝýI«*V[[G±föTEb²ÝŸ´×aÛK7çXÊVT*.~Efð >O [u$gÆÏ½ºò¹bõ(ƒläŠ}/•*'úîN)•ÇÓ“§˜¶Q^–¡†ØâQâ›÷¤M”Ö8üÍq. ̇ôääãœÙ*Ööè’ªrö÷àI:PÂÑ)—)7xjJ©Å*—Ì·{Ÿ…ßµpyBÂÊ7žÊ8g÷™ËrN™JbÔº’ -R+n q „ËàxÄ;.…’©U]»¦i¾‚–¶ñÀ@°=ipÁ\ ã‡RÄæ–‹òäÁ°2ó¦Aˆ:Ãx?ò1#|ÍéW‚ÒðP†<¡¸jfs8 ±Å™žÝ–P’Püsƒ‡^ò• ²\¨yê!ŠÁº!.|)‡5¥H.Ô˜±X™åJ^G‰¥ ¥t.„u/¥$¥Ä2æTL±˜S±ŒÌTP—ºMÞ¤¬¥píÝAK!Š<À”Hª‘‹R(Ë*‚\϶Ÿ9͆Óh·, ´Q%æ÷MÑFg–Ä$_æç;“5q‹I“qÀó ìã3|Ü…xm”‚·qeô¬§+ÿày§WáF—ƒkÛë†oj=‚ŸŠoر7×QžÙ°b÷3Ír“47€Çœ~&¡ëyêÁÜ÷Ñ ‚~ÄTê±î(·Tø¤ŸSÔÕØÚ²”ö”hÎDcKxËÔW»my§„Gå6½Ÿ¨g‹X«VÏóÙî_Øý D+r÷/¼'ÿ‚‚†0ü ^5¦ìá Ü˜mYçlÜ?-¹ºœue}&õéYº {_6Æ'»÷åy_dÍo9½/Ò. žõ½/»\`]‡}%»bö ÈoYânÚ“’‹’âj\«¦x8V‡èíz+”˜–q÷V°Ý[A´ºvoÅ»òVô$ùòZcaØÎè+Pª¾œummbß·'&SE«ÕiJJEœa‚µKäÚ6¸:J@‰£\;r=‘-‰KtY«çŒ°•Ûï„Ü/º¬Õ³]Sj‡Þ®Ã£êS$þç*ë¥hØí±Ô3B;”v/UrH§ÖV¸„Þžgå[%ÏJFóãÂÂ5¶nZ!'ª)I=¿Ä¶=¯ßO£ºRîÞ6\¼÷ £$! pé#q%ÔÔfîCx.òƒß»m¶XnYc\ºÜ¥¹¥)‹r)Û÷e™ïÆÕMW‚…峪3wó­<žÁA\@yƒÅ׫›š³ \ŇÚ1û!q å>ŠR!BñvàÛa¬¢·âó 2! #çMW¥yfºÜ@%!g÷ÜÑ쎴íËÈÚÌ×b}_2ÒˆkêÈ‘vsAq^'ÎÅ}ú(Ο-S¡–~kºn´4ÍÓçö1°ÅÂÑú>²ì-ÎöÓ­€ó’Y¹°ÏÓ;sÚH §ÄûÐéq]Ê‘—¿ _Aﺟšç3ì#!Dê#X,rõÞÃTÍNYvØšHrƒð®!áBÏÍI¦÷Å“¼xDó9ù»O¸ÕÒ¡€Þ·ÈŰ¹ðˆ‡Æó’žGr—|ñÖ—[ ”$Ý\QÊ÷¢| äÆ i¤‡Ö!tÆ,C©y`>>.âæݧãÆ!\ ó0Æ/Ä"¦×^PO0¤gpžþ¢tªíbH‰ î󨝭rsaq ^[oL 7LÆ8áÉ@©qîf§òlÍdÙËû æ…RÚÓr–2;«Ôž‹çÃÿñ›ñ~ endstream endobj 7270 0 obj 4030 endobj 7274 0 obj [443 /XYZ 38.2500000 664.250000 0] endobj 7275 0 obj [443 /XYZ 38.2500000 306.500000 0] endobj 7276 0 obj [443 /XYZ 38.2500000 664.250000 0] endobj 7277 0 obj [443 /XYZ 38.2500000 306.500000 0] endobj 7273 0 obj << /Type /Page /Parent 2 0 R /Contents 7278 0 R /Resources 7280 0 R /Annots 7281 0 R /MediaBox [0 0 595 842] >> endobj 7280 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7281 0 obj [ ] endobj 7278 0 obj << /Length 7279 0 R /Filter /FlateDecode >> stream xœí]KãÆ¾ëWð`¹ýä ìÎÌÈ!À`È!È!XÛ ŒØÈćüýPb“Ú!õÉOÍ¥‘öÈâ°»ºÞÕ]UýñO_ÿ‘ýó÷ìãÃ×ÿdßÂ;•—^µÿdûŸßaª<|ÎÊÊgß~ݽf¯»çÝsóß×]ûÂׇ¿4Ÿþ—™ìÏÍ¿¿dû{óåáöðë®Ôeóû߇ßu©›Oªÿ½ÿþ_»¿þ!ûm?b7]æíÿpVio÷`LLýºë–©?¿ûm÷±EÀ²YªBYUdÚY—éÚ™ì¿?í~n&è†Wy嬶¥ñ®ù\®T¾ªLó¹´ávòÒô³›ZeV¹Ñ䇟8Ãë/T½ÞàÈ£cEÛBË£çµÓºÜúÎj×P6ãätµŠúáWÀ¿ÖF¯GÜäѱÒ¾²47Œc[¤™F4V I7ü·Õzo!Ž•@paôˆÒÜØˆ€ýÚ¯€¡~ô5ÐïM¹ÞàÈc#¥#-<&e‹:(RS­AÚ~ø5°_—Õzƒ ޕ޶xô•õ´iìðºªôôqøhbövmµÁGÇJ øxôç%£`PÚo@´ð*¼øùe÷ñ‹vº«È^~n€;ÌÙþziâ³{oÑÖÙËÙ•2?d/¿ìê¼0¾qò‰FO´ƒO 8|G=Á'ð‰…O¾,‡MChŸT‚>£Y¸ ñfÛyž^v\“|•˜“ Ä¢ð¦æXHGÌ/Šà$û‰àŒQüÁÿ˜û ~g|Y–‰ùRa~¹J¾Ô =ñÇÌgB—c¾´X“n‚/ö©ùÛJL¨“ë¦!W8 yà<®G@ŸlÜòîwxÓrÒ–-Öc/c}‰õ2ž?Á|Y.Ǩ c¡lRÒäòrMê1ŒE¬“›¼[ÑÞy£O€£>Á£PçžÒ…™¥íŽ„-<`6áF ÞÄ6w˜#ŽkN®ICáÒOR8xVià©{#ŽÎðVst†yó/Ë–ØÖƒŸ`^ĸÆ[ ÞÁÍã°­œ„û*m§¥á1!<^OÂCQ(êhÏoBÛTU}†~ìAÔ-g ”°…l/ž'!ækUMj%¬->f!8[ }ÂCŽÚ”“JÅ#ÂPT{ ¬3bxSÌA†â-Õz,¦iB»U»sާRñ˜€ù„‡îuáßRè²ðèf¶nVŒm¬S0í°ÏL$ ¾,¥á” !m6‘U6oXÖã PßZä‚ùÀá„#áCšz¢HF€€H_R«ˆÔƺY¢\ëθ  K=|‚Gs0ý)Yl÷Áp’Æ–SÆb0ÖGÑ6‰gØPcÞ ÊH.nC=Öwz·¡ m(Þ½5Ky·¡¤ eR•±v™²‡Ëæ!4RÂÓ,­\¿_þnì®PV|q»›ÊºÞí®ºÛݻݽÛÝ3ì®`1ðz˜Ü”ö°˜±º³‡îEmÙ:ˆQ7Un|·‡w{‘ßp¡æÄë´®‘í!Óæ€h€@Å”Xê}@äeX\Œ­8Ñü+èª4ÖµîrXRd‹É¥8Z÷ý "—â´„Ój\Aª³|®†µQ‚¾qX¤C¥¯Ãª‚À:ËjW˜Ì} ®’XPრ†3÷£–@0Å+Br?.ÊY€.\KÂT¦,(ÍÂÃcj¤*¼Â¢ IǵtÂhQ É"‹é‚°GB§`}LjÑ l#.† Eg¸WCN©í5‹r”š>Œn,Õëªp¡ÂްDTEÚ| ‡ycI6 XR¡lÅ5@Ò-˜3FW0jr>‹&¬ÓFuùŸÉ 1™un%š*Ÿ;amLòFžÎ<KC×·ÄL¸/m {£œÀdAm„*sN°Jß('0çòÛàkÔ%8!ù [>‘Ú'¯*ˆÆ û˜®/Á¢]܆wl:Íy‡ˆã¶Ç:@Ï_ˆ‹† h˜}+¡ ±t!§£¦F $óãs!¢ŽÚ…Ú]Æ:ƒbÇébÍŒFdöòúCÎrÔ%..m1R>ÍÇT]Bë,b«…:hD¬G{IŒÂÍèÌ©nakncj?°|©>6x±`—32f½/Ãá™cºÛÙtsE·évùÒÔd®5ÞØÚv¯uí*Ÿ˜Z¸*µ˜2ëMPË+—˜Z[7zÃÞDé}ývʤà«F=TZù|›‰jnՃҘȟaƒëŒð¢öòÝrרd§Âq“g¼ÍO™¢€ß”–Ùš )×µøÎú¡áMþšæ®p8–$6O°õ\’À×4Þ¼½KÁà¾2xbrE¡(¬-›¶× ¶N~M=ê,ásì Þ-íV,mU\‡¥­êù––Ù|ŽbOO5ò ŒÁqÖü#C³D¨ 6©g®.¹‡qgy\éOÞ¡ZŒœuº6¥*õ-ûƒ„ºÒÑJå{u¡ú)·|/ã# _åÖ2¦¶y·ž²s0‡Åø‰0q}b`#]t”?B`zçwx¼žO¸´Ž¹Ú1ÕfaûÜ(Ûq˵°=JU¸J¸S ‘À!¸‹oó}hÆY»­]¤ z£ca·éÛÿ˜8)QVÜ $Î~PÜ÷Q†uŒ?&Áˈî­b&ÖÌ#³C›˜ªwÃUU,Çs‹§|“²Ëç ­ÒÕ”'Ë|e‹GÍ¢‹[+ˆqÜ£üË N\ŒŽ„-j+Ê¢1™Äý™”íaLèöJâî R~ãñÎ/IU¹ssÞd‚œv=°[ÜÕ$¸“"DÔèŽÊ倅0g¤a¬{8XØrÀA˜Ìu Q¯ì²!¦`[Q Kã†R·5PÆØ‰ã´FiïƒÝô}ªˆ4YÝb’c°… VÃpL0ÀÄ¡ µ…±n³{Ýã©Óû„¥Xe—«`´°"îÇýÆ'ï™_V–‚»µâ‚"U1Â);«—ý­Wí|œ*ÔÁ=66|G¶ÃEЏèŒè¨}8º½à~<¡wL½Q¹éuãîÖX6ñ­Dm¡ø€º €°ZÌzÞy¯«þfe¦ì“ÑpÔM9˜Z˜ÂÌ- Ëw«þ>θ˜Çz•)ߥ:ác_ϽȤ4éïj‹, „W+h5Ø»‹‘“`¾˜¡nÌà’õ¸²Åh¸:_¸ë–ˆÐ"û‡Æ(Öå F…›PÞ F±&f0ŠqpÆ=XiômYOÂù¦¿‹Û³¸]·ýDܵe,.Þ-ÄàíÆ¸JÐ()½±þ)ê~ÛhÙlÓÖº|;ë…1Wû¾…Öm /òc5qÛ †[õM{ùï'ž!`£îÊ$¼Õ[ƒ÷OÕÔÌ(ÝO7•'UG¢kÊOxRlTú›0OiÃ7åÜힸ»uB¸É€ÙÕÀ'³[húitò»Iî¼,JúÅϬ0l ßÊUž'}ß4’a¦yÇ=ÌÎ$›híÆf`ÄŸÅS«Ã|U&\wü¦¿»Ž”ôЖ÷6ïÚó 3²¸2íÙüd¯ÍÒEÌÚÍLŸ=ÕjŽSéÊ-7—'ÂÓ–ËLnÚf.#>/ÆOÂN§É‹QGBZýˆæ±¸ÖáÂö%¬%sãzOwIA`»ö.£aÁqµÀ‰eh<|'üzÑÒ¿3~,Ãí?«£óqgàš0 àÑ0 Ø2;~SS¢°@€!‡ Œé ©ˆù5(Æ)@ç U4§ÞÁ£="´XÁàw>ØŠa‹)üÃ\­SÊâ óƒ†=tðe Öø>qŸ•ÙRÙ<èû7 µôä“`ù¦¬^ö¼û?ŠW_ endstream endobj 7279 0 obj 3313 endobj 7283 0 obj [444 /XYZ 38.2500000 701 0] endobj 7284 0 obj [444 /XYZ 38.2500000 388.250000 0] endobj 7285 0 obj [444 /XYZ 38.2500000 388.250000 0] endobj 7286 0 obj [444 /XYZ 38.2500000 701 0] endobj 7287 0 obj << /Type /Annot /Subtype /Link /Rect [185.250000 708.500000 210.750000 715.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 >> endobj 7282 0 obj << /Type /Page /Parent 2 0 R /Contents 7288 0 R /Resources 7290 0 R /Annots 7291 0 R /MediaBox [0 0 595 842] >> endobj 7290 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7291 0 obj [ 7287 0 R ] endobj 7288 0 obj << /Length 7289 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€Û|I¢€ €glÈ!ÀÀä°È!ðf,v™ì!?ê–Ô3CõW’¾&Ùê‡ö´G#²Xï*²ŠÿüíÅ¿~/>>~ûOñ½ÿþøm£¶u©º?ÅîëÃÛ¿í?µ/‹ï¿n^Š—ÍÓæ©ý÷eÓ½ðíñ¯í§ÿ¦øKû÷ç⇿·?ü±ÿ¥Ý/üº©uÝ~ÿeÿ½©uûI¾ï~þïÍßþPü¶q˜®æýÿ?8«µq;0&¦~Ù ËÔû¯ß¿ÿ¶ùØ!`Ù,¾2ÆùB;ë Ý8Sü÷Ÿ›ŸÚ †áÕÖ·¿nkSºösS¹Z•Þ›ösmû?ìäµÙÍ®¬*´iTa}3š|ÿgx`p§}ºÁ÷GÇŠ¶•–Gß6NëzGèS8«[C¥\‡ W— Pt>þ­ªwyt¬ ÄÅ£'–f«šiíß4iÒÑÄ_'ä¦äѱÒ\=¢4[§L¯ª›ªúuøø÷*è Ž•¸xôÔÒìKÛ!͸:M†áÐÄ©_é¸iyt¬ Ç£G”f§Ë^ÜŒJ ͯç ®­ÒIsyt¬ôÄþ´d J÷0¼/>~ÕN·È¬ŠçŸZàösvßž[¤”Ň]”P™âùÇâJi÷§âùçM³­L9€˜â‰Ó艪÷O¾<·ÈK½n«†YÍ#‚Gx× `ÄÀ'b¾ãà< B­øÄÂ'_!ÔÕr¨5† ¾£0¿àõÀytMÀö)&,Æ5~Çe” ÝLò²úBð2|Âhc2b¤¬3ëHS®BG6en‰¥KZ\ ßÁúá®ÙOÒjÇž4±¸¼,îÔžÅ]°ž¶[k¼nz]@‡¿õÚCªÁrxe´ècïtDt[g»|u(ÇÞÁ£98~§S.v[ºÊ×å˜]<é•·Ÿ± ]õr¤àb¤hH©-|.]@$›°ÒÅZA`ñ2àŠ‹ññ2l¸ Œ ‚,D ƒsã—s1& ^ Ú‘PLãÊ‘ihŒîõó[¬G±«ž§¹õÍ­} º¯NGø÷֯áãp‡Š=&ô.±P´¸ñõÛü²ù–,µÉÓ‚‡±xX[ô V“Æî±l1¦SK7a?õçXþ’/váߘ¬¦ê¨Ú¦ìÜG­¶eç¾½*‡žô (·¦*ƒÀÑ„w>¡w„Ñ8š˜¥Öï bzÏPoUcg>Áó¨‡á2Í ' ®§Jê­±„ïtbQm­6SBØ„yr¹ê¥ñ˜Ÿ`vÂóê<ô…ínÆÆ“Ü,¬  ›E鯛ïÄ Åy°±e Ô-žG0÷ð‰Õó㤋ò÷1–  ïÒ¢èÁtPk³ ÅôBEŽQ.!1 Ä¡<ž˜ 2¥hŒHŒ. Û§]¤‘Äĺ2¡+µ ]ÜPAÕ¹8¯OBŸšIaîÁ1»³ËUMˆÌ‰D† "0ŠïžIl5¹@˜ñ XZ0°Ëô©ûc <2'"£˜¦ñ|QcaW.ç²~ëˆÜ2²A¹kŒí%täÛ‹ŽËt9Ž{?ÁÑg—Þ²ê–Xi4[”(é’¬ðíØ™ õ7Òr$Þa¶:Æ\œ7ºl³ «+fëë̾J†œ«'’ ¬gð>Mܬ{ȶ”ªWf *tîj,ðØÒÛaï6¢Ô;–&7‰ ±yHmüãyðh!» ŽÿÍXw&0<¬+˜ð+ïÎ|¬ó f˜üXÕËWˆ§ê„S”¥¦…Gî„Ëø@">\çö *¸\S(T3ãy ÔB$®ÒĸÆÕï6Ìp¥e†ŠË\Þ¸kår‚ŽSøü¶ö.MTµú (7å%YÔvè;#èXÕ.HzÔÑ_¯§?陿ul/Ö­¨ý=,ì¬"Hj ïn‘ç)¬''…}3¹î¸ÚKÀc;×xå')tm¼ˆõüš­“à=~ŸÅ݈.Òv ØÁr9‘òá˜wÊ v[Q,Y ï`É"¸Š¡€¨‘dâ‹eϓѿô®º9[p;1™ÇÀ¾– œ%¼]¡·Ø•ñ[‰s' ' =AÛåÑ\U9 Oä'—é 1þ”Zf§ƒêsšÉKšìœ¹JߎÉ\¯Y×(,Y¹¼åœ>—w“4¹k.’öç×\™b*ë‹çÁýiqW縺3ÞnHw抲3êÎFÙIšÄ}Bi!H{A áynfÇ nÎj¶ —÷Âäà.£7c]×±ÿܘSî=±Ñê$f@êô)ZþÊ2— 0§1˜ÜûµYûÌQòzu@5Ãc!l‹et>qwFÎSM=}Íej‘ÕÈI:6§œæ¸P:^_dk[R¼×˜ç†§œ>cŸQ·[mÿ.×-Kx'ß;7'Æœ¸TÄÍL×–-0QÏ@¹³ÞÌ4C2ªf5’a .g$ã29VÈkäªû!Î}Pçïš‹Ó\в0TFð­B§5xC¹tÚeruSìeÖX1šk 7ÅZc¦ÏXÞÔM±ÖT¹O@ä¸M[¾ÊZsXôŠï„êð*ï„êÛo»w ÞâÔ –®†¦¡:vóSéïž x„O¦ HÞ`ÊÚýö™Û˜§ê ŒûŠàþ7¹nqŠÜì(×%¹:¿Žºí1—^ZeΟoÕ]ÏqëÜì(F§ô\w‚èZÐf.W39â>\¦Ÿá…ög òTËù”­ˆl:;lyÔ¡·{¨ qï4(æÂ­wqò]ÒEBÂ]˜;±þ:_Ñ0™ÆÒL»ýl»¶f¶ŽaÒ)æ%”;eÒoÏK#<ýÈKÅmQÌßp–ôæ§ÒfòJ®»‰bµR‹q%=ä(Âp¹w×.\«þZáeÒüUÎRþpÌ+ ¦«3Ö7ø ãÿE½ p÷a^YäsÎXÔh𸃱häëa¯£[ü Ú«3.ÈÝ&2©Qw×~úœYxBØÜÖÌš<ïB}¯M¶uvFå{›ìËm“m]m§)|oJã·ÔzWQ[* í”0/BðÁJêˆÃC‚YC“![Úë&Ê~aމcü´Ç0íô"¯4jCû¬œäN*·ŠË}ŒÔá2Xâuè|ê0k:V'•[Ý›Vp‡Æ1W@osÍú¯T8ÔÌæÎxd»ôunþgšsOù¡YpU©SÚ®Þµi'2JC;ù ˜ÏYXYU§´Tb¼ íPp™¡…õ±AÜÖ9ýÕÊŸÒøåvJÑ…"/¦` —¢3£ÁwrjÂZÒ˜gÅðµY<å…ä(Οزõ‡;Š„zf»W$Œ6àö³WŒ¿QçÉâîºÆ­H8ÛiOf4âzqjÓ=î¡Ë\hæïä ÃÏ,|<Ãêù¬“9i5°í7_µÞ:7m¿¹øF;'?à`½ç¼Ò}융ÞÉ‚\µðçO \2&{5ÄßVåvãÒô_vX‡F«Ïž±:Ÿ»Çî,x™¤ÖœXYù]¯n7of=¿bja£º¡0üOØ-,ÏTÓe¸ÓÅJ¸\çîVv¡\Žo°À\ŽßÉÅåù¼3ׂq÷ÎÞc¤N³­hðÁŸhÞ™œdt¯í?q’‘é¢1NVà¦ÚIàô Q»¬‰r*ÇgóaÂF¸G5%‘s¥D®JX:“¿œ–´‰Z ‚Ñ 6`Šé„ÍÕ¼ öÂQãJÐ,"CFö'q:´oŒÖa[ ¼!ö0[’˜m•%~ˆ²GÁæØ¨\ÐQ¨¹ ÎU%©0HÈ×µ®|0Uî÷úÈóî=8íg‰­…Űgœ‰{¼˜ÌS²ƒqÀ@ÄÅÂQ8s|0.vÞd¸Ú¯â¥Qvž¦~a†fôG÷H[ýÐ"¾…°84„íOºSYÜõýÐ)&³5]ÏÕ7O:;^ŸôG‚̶56ÕÐlFóØ©Ž]Ç`ûÚ¯)tìºÐ“ÀQb5^`¯N±‡#¾#ËÐx4øNïÔèEK“^an÷YÎàˆ;ׄY†YÀ6Ùñ;˜â˜>`!‡ Œé ©ˆùµWeGR€ÎÓyÇÞÁ£}Fi±‚Áï<ô°Ua'hüÃÖoSo˜4Œþñe Öxë[³2[+»íõý;á…ZZxò&ÿ> endobj 7302 0 obj << /Type /Annot /Subtype /Link /Rect [442.500000 242.750000 512.250000 249.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 7303 0 obj << /Type /Annot /Subtype /Link /Rect [215.250000 206.750000 225.750000 213.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_stl >> endobj 7292 0 obj << /Type /Page /Parent 2 0 R /Contents 7304 0 R /Resources 7306 0 R /Annots 7307 0 R /MediaBox [0 0 595 842] >> endobj 7306 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7307 0 obj [ 7301 0 R 7302 0 R 7303 0 R ] endobj 7304 0 obj << /Length 7305 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·Å—$‹ã±'@ È!È!ðf,Æ‹8{Èß$Rj‘âGµJ¤ú1Z#±Z²Xů,‹Ôû?}ùÇñ_¿ß?ùÏñ›ýûùË¡8Uª0ÿÛ?ïÆ7x}²×ǪVÇoß?Ž?ŸŸ›ÿÿq0/|yþKsõ¿#?þ¹ù߯ǿý½¹ù³ýGí?ø~¨XÕüýÚý­+Ö\Ãßíýþú‡ãom‹=9ËŒûû¼Ð3¤ún²îÏïß~;¼7,£R—’éâȤG¦%?þ÷Ÿ‡_}óÅIKƪRVÅBï()~d¼!×Üžêþ¤ižeh\”E¾Æ;Γ£ÂDÉâ­§®Ô=@UˆÎÍgh¼Ì)ÜŽóä¨ôÂÅ­Ÿj)˜¨¸’­ [!«ºæÍu%ì+A«-hÍÍ "©3ФªdFej9O J/nØxni×¼Ê黇æ3HDBåwÇy6ß[Oè»+j(dü‡æs·A!_ãçÉQ±Â´žÙšUÓzÆÁzÔ|†ÆË"cãç¹ëH맺´ÿÁk"íº%\Õ‘¬>|U0]U-áõ˜2oæ ²jæ<æÂRmæ8¬!áßè´o¼ö¯¶Ó¡_FôY«æº!¯]úÃŒ•¥`Øi~×.ÝàþWЖÏK‘ÝO'‡ïÝK 1¤'b\%,6êa}fɹ¯"µönhçWÐÒJQ5¯t˜«²°L çùê½™£2D´ý"O.ßSŒÆd'"]’f.8ÝoÝ©«:믹Qº|¸¯®ƒC kNK£,zê竱¸Â驪¥ŒÓ@GR‚ä‰ä»s#„Ò˜ðDž©L«€=›ba]ß׿ÅW¿¥õ~§‰6\v*î’þ¶&ß]dCeLv Ö^¤‡! ºëbæPé˜@Ò[kY8æ"¬ îýÒ²c_Mçi:]i[÷¾£¸áùjmq€pà÷©h_9’ÆÛu*ó¸tl Ñ¥2¦J„GïJzJÚÝÐί ¥õž¦–a®je™8_È7Üý£Ž Ÿhç€2CäÉÅu?SŒÆd'"]kgcpºßÒÓZ{£tùp_MçwÆšÓÒè@訮ä˜Ð»éa1ÂÄ4Б” y"qQ¥1á‰ÑÎe†È“‹ã~¦9d'"]kgÚKVh?‡£‡ŽöÒ©à±£9 BK}tU„Ó'Ét'‹ ¦Ž¤É‰ãŒB(9„'òLdZš1ߦÂ9ç¾6/¾ú-­÷;ÜËá47\²ÓßÖð„9œ)*ÜÍáœÉ¦‡! ºëbæPa,"½•–eÀ1Aõî—–ûj:OÃmÇé}G/pÃ3þÕÚâÁÃ9œ)Ùt@„ñvÊ<.ŒED—ʘx8?¡¹—Ã17´óÆ+hi½§áŽ6-1ºpÓ'ÎïÜ  Ú9 ÌyrqÝÏ#Îá‘®µ3î&+L£Ž¢ËAÃÝôD28ÆF,ÜŽ¡£>º §O’éN¡"Ä4Б” y"qQ%Îá¬×Ç„JߦÂ9ç¾6/¾ú-­÷;ÒËáhéf'¿­É¯¯óˆ¡"ÝΙlz ».fQF¤·Ö²DÙ›T8‡ãÝ/-;öÕtžFÚŽ–^j"tÃ3òÕÚâ!Ã9œ)Ùt@„ñvÊ<.¢Œˆ.•1í×áè¾Gƒ"°Gƒ:Ý—–œ/¼¡bT†ˆv(3Dž\\÷3ÅÔáèu8Ú+8Ñ~Žêp´Wb’ ޱ{u8z¨+]˜dº‚ůÃLäɉëŒB(:œ³Ö|^RwŠ gͰ·íGäÅ_ï_˜dÅ‘•ǯ¿Y÷/Þ™¿¾~?Têø®.%çâøõçãOEÁê?¿þzЧ’«žEó¤øŸ|DOX ßÁtÄr¸^Γè‰PƒËŸDè˜w>}mÔ$»„%Ÿå?)0¾XŽœ@'©V`½°5¥¥7”VÉzª7¤ªõîÎO°À<ß¶¬Þ½ÀÝx!ªä^@’²0$u?L£ÊmÆX–u¥F€cªOµ.:|ÎO lò$…90ÀWƒÀ;ò|ç>t¬ ñ9°t:pÇè±IÆ.ƒ];+´‡{QA>YÔg èŸ2ÜYá5bqTËô‘MûزÚqÚeõÚàØì·ìo¼¾d‹`!| |Pix½\9#8Bd|Ǩº: ^³eÊâÚŒO¢·Ïˆ¢DÁÚF±òçÜnŠ—ÜøÄ* þ{O"0`iÜ  CO’ùþúØLƒ v˜6Ñžä‹ñýÍLÕ €g#’è‰Õ$uâ¥ò:[‹¼óDà@ÃÖŒŽ0qª˜k*¼êG¹B‹ Ÿ`:ì©àëgøKc³ÇcÝ“ò$÷Ü’€\€­ðI²0h& i7ë[6YGi¤Ó k´šzMS`‡ý*6çˆCÁƒÀ•ú":”13"°áx%DÊV°Ëñ»«áw£ôäc"Âeý"ˆ6‚Åå1°ËÁÁ‰ÝBÀ“‘ˆ,0uÜÖ%ü„¢™cùHPUƒSÓ!˜2™Ãªƒ5½µŒ ÌÕ¨3Ïq(Ù‚pœ1]§¸¯H M©x‚­Ùè÷.áÀ×.Ò˜ï7B2÷j€u òHÅ›DÂÅË#•JX—ãéEUo/f¿þxJ>mB:1Åá^ƒü++&#«63ÑóCr=“h¹”I`ÞQ2â‚.o>2%¢ñdÚFHŸ‘`£XÎí¹:Š;‘¦ëúTMÒDtc^7A˜4[Š"ήQm²è§†RñbE±`I3R†R¡'µ@H êðŽ—‚ ˺‘Eâ¹þl#ásq–0e©=ik¤Â)ÈÁ–Eª¨b¬°Îc¬ EJ`ùƒ/‘D¸ÆÒÂ%){¤”ØDì£éD<”6¥Ðã–eŠûƒåá-i9S„‚ä"¥@„Â"-˜¢›ú´siÞ]j,æM>Áw`Çï8À\GzŠÑÁ1aüPÐÒ1n[–¨•CAá–…ªå¹0GòS±>fçP/"O° ^ßn÷èa>zØFÇÄš~ìG(‘Ö>Š^â y›}²U?û³‹Í¡ÞAëf8êÁvÇQÌA$ŠÃOðüF˜kAËäíÑ|R$*Ýç707ÀýÁDžPâP‚÷Æ*É÷ø½wó×IÖEéó--D\­DjvÍ:ïÏ÷…ƒÇ‡Ak‰ÄnØÓby›9rVü3ícˆÅMYƽ¼ …T'¶`ñs—ëŒç ÕlT†B* ™X0vD”¤Î‹´†IY@žt׿à:ìi'.~Û¾¼þTÖ•ç (YˆÈ;ØÏbMìÑ·È(À²ÒJzJEP}¬VXyÒF/FYûßkìiUÝ¸à”²aAÁ)¡v'¹ô"â//Ù¤ Å‘dBík¤÷ ³³)íyË^|IÈc‘rWÏ¢^sbR^Øã½ÛcÃŽàÊAÒ²(úòÙnd‡;d6+ãÁ’²‚+ã*Ù- òÚÏî9½K´¸—¶Pî–ƒZ…ÓŠûç ,&PÊ£°L$#iRœZM:Hnœ[†ÛMœ9TWó…F+Êb e9›óíѬZÁ)åÉŠ%ìòÕ†X)µñX¹ëÛ–¡èJîþaŒˆjb÷ýÃ^8²ŽPc½½p¤Ø Gˆ£Ö^8Åí. GTQöá-NÙGKÛ¦‚ßbjðÁKdjé«á¶9¡œ¥+¦ügÜ···˜¸à¤5Ìì‚ãl!÷'†{œä ›¤€ÞÁ‰A9-%|“Ê»49|€rV^‡ÁG¤U¹Ëá¢, -8i‘Ò㈋¸z ò=8ä`¢$ßþ Glå8wp™§¢TJ8Ô‰Ô®â¤`ýPg”eGu9Goåä¯TuÝÏuý"¹HñAüe¿´…($½Hš/À² ‹yKë eð™Û¾^\â èëoˆÔWM,RSM·Á ’Žõ0ìÀÑWÀ“èl~ø*g%ýëæð:UöšÅ|‰\+çŸv÷NÚݤMu“¤žŽáÓRñèžöØÙ¤à“N¾â¼”˜  [åçrD{0äynù›9x·ã†› Tó/zåÛOù}ÄS~ ©Óžò)…‚t°ì#åü_¼ ¿ŸóÁgˆ·dçkÌk,gó§*îçR¯ÀWô÷s©c6œö3ãoçìçĸÝö‰ÈŠ[MíDdË_–Öv[Ķ€lxÆ®Ã6‹Ý{F½'eS/Ž˜“zéˆäð €="Gʆ…ŸÁ½‘—Žè(¤ópã^Ò¹Þ°y²ÛBÄ"™8»DùËÁfù¡X:Ãó~Â6°BF ÿÜÂFW%Ô<§iŸ\ßÇFxÛ}ìîcã>–ð¥’GÀâ£Iß Ù1Œåè“HtIá ÚOä+7·p\Šååßr.\_ݹ…ïß(YöÍŽý¸þXyÃùË--@ÖbÞ_íOöoóütóßæQªŽrÙXÙX‰êÚ#V®¿v³¨K8ÈsîA„‚åq¸—1¢\Ù´¶g¾YÓȹ}”ûSf£K|JÝ£ïÑÞl䥜…õ–p ië7eo{Ò‚²É $ÕÞ»tÿW;Xó>¿¦JúŽ4åè™u‘ó¿®8²†ãCÊwøxE,ñ­tᢳÏÇâaŽxÌ‹äÊÈ•™/cŽåºíΡw>"}Iø­á'7€(Þ*nØøœðÁËmdSm씪Ó)yjhÔŒk6¾ózøñD™\X˃§ê×?Uë=ÕµA®Nñy"¨eD• Çᢋ'À§>2< ÍŽ’zÀç¥÷¦æ¸Ÿ‘ŠIôÄš:ñÉA°µÈ;Oƒ¶¦aku¯°fpµVõ^ÛðL§…ød²׎>­¾cS‰aØÇ9mu ɘ(8aÎF™·bDI‰B&`«ÃÀ#~ÝìA’ËNäLz >L‹”YðÕ"¬C”<!&»Úôþ®N[£äÏnf–y•ÙŸÔÚÏV˜ìü¼ %×QcvZ x=¾qYAË‚ÁcN – Mo5ªç2œ%1:r.Óz$$½T¢'6è*Oå$Ú.á;½ÓGÁò4 xÝIWƒtk¨Ÿ0oŠßáÒ\üÄÆ 8Iúšä8Xô{f¦kK/¹ÁeµôÐøïg8êÀÏÚiÙgÄãîpÇ_q7°óáð,ʳS®½n8vM$d<°OX°Ú`=Þæþø ó ×Á"â„„±r`qFVâ0oXÐPÕ𺞔å%$è8#q¿øè 캀z×W˜/ ~'>n­^oeU!NÖC;æ $òd4i™†>?þÿ³ýÕ endstream endobj 7305 0 obj 5017 endobj 7309 0 obj [446 /XYZ 38.2500000 641.750000 0] endobj 7310 0 obj [446 /XYZ 38.2500000 338.750000 0] endobj 7311 0 obj [446 /XYZ 38.2500000 338.750000 0] endobj 7312 0 obj [446 /XYZ 38.2500000 641.750000 0] endobj 7313 0 obj << /Type /Annot /Subtype /Link /Rect [248.250000 579.500000 264.750000 586.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_primitive_types >> endobj 7308 0 obj << /Type /Page /Parent 2 0 R /Contents 7314 0 R /Resources 7316 0 R /Annots 7317 0 R /MediaBox [0 0 595 842] >> endobj 7316 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 7317 0 obj [ 7313 0 R ] endobj 7314 0 obj << /Length 7315 0 R /Filter /FlateDecode >> stream xœí]I¯ã¸¾ûWø`<â"Q‚½È!@£È!È!èÉd0x=Hgùû±6?‘ÒGI¥"%ÛšFb[z$‹µ±X¬*þøçÏÿ<ÿû÷óï>ÿçüµý|÷ù”]Lž5ÿ«?ôÈòÒ~?›2?ývú~þ~útútýÿ罹Áçw½~ûßYžÿrý߯ç¿ÿãúð§öª?øv2Â\?_êOkÄõ[vû¬žÿrúÛοU=võÀ¸¿ÐJeEQ11ô÷S7MQÿûýëo§,¥, ¡äYh¥ÏÂjyþï¿N?_躯š [d¦Ôð{pyí_H}ÅIóMµC_‘ J3|Òý¨½ÜšW(û¹„02×ö:"üîq£ªÈŠnˆ$‘wà‘Å+„ã=ùЭ@Q3<¦÷œA>)¾ÕO¦qÓ=¤ä*j‰Û$k"õ~öøöåTZðÂ6Bæô³’DW‰.,âõk=âðw‚l>ã Ã²êúÉ-WÊ•ƒ—ê·r™µý]¸@¸ ÙTŒÃ0×1Ú•·è}Qc-ÙQÒŒekpbÈ%‡£|†rFõ É$L2÷„(gPç¹­Û½xý¬V2:ïQ«×·.š1oŸ}XÜvÑðRíU)n<ŒãÜQ*>>ê1­VJP‡úsœ½çELÓM™8Œqí»žx5Øë‡=G[²¡¢A;Ãz¬À‰qt;Êcˆ‘zTD(&!ÑÆÓ£Ï°ýç¶n÷âõ³Zy¦‡™^ßEÙŒyûìÃâ¶‹†—zl¬J™pãaçŽòðñQ‰hµRbj<ÔŸãÊÃ{^4À4 Ù”‡Ã×¾ë‰Wƒ½~qØs´%*´ƒ1¬Ç ˜G·£<†Ñ&@(&!)¬'$¶7FŸaûÏmÝîÅëgµò(=¥Qfî˜Ãß—ñáŒÙU)îùãÚQSø¨a@4[)95^êÏq%â=/`š†lJ¤l•‡3ñj°‘® ¯f‘ \´{cX%800ŽfGyLc¤†ŒIxJу®ÿ\ºŒYÿ¶Îß¿€~V+ ü¶õÛÜ>ÿ„tGÆO ƒ?f¥lbãÇ¥‰£l|ü8cú´\)Y^ªßÒåÕöwáá6dS2ÖóVØÎaóúÅõKŒµdGIC0–¬Á‰!—ŽòbÈÕ'$“0Yí ‘gPç¹­Û½xý¬?èÉšlʬ<ä,0ŸÇ“tk§i…gy9 ›>cañjù’èãi°²)I]àÞDýFd—ˆª»×7j¾ìB¾pê­OÀRtêHbB¼‡2ù&•ÖÔê°hö©ç: òN'p…ŠúPÔ»SÔ7ùÚ·¢.MfÉ©á0 ZŽMA‚ÛÜv³g‹OP%äMº#õsͺ#µ2HkJKL‚#@7м¸ÈZoá Œ;õü-8—Œ¹_é<0ŒñòqIXʘ¥Y3WÓÍU5ø­r8ç0ÁàT÷\KsN,Ä EY}ê&{ûüíöÛ\Ê2;Eõa„hŸÚsñšMÐ>ùz*ôE+ËRÜþJ9½¨þ׿oçU³³ßZÆÐU}î m{)Ý1~9½ýC$ú— ýõM‘go -ïÐâ\,vˆBå6éf]¡E†t•ýDC%{©¡q¦÷½‘ð*`oÑ›øJKJës-¨JøÛJ¼E¤¸þ±¾,'°“Àî€Õ ­œª®Ñ:³€®€Ãj€.Þ-6AêÈ'(IJoæMun@>æ:¯FÔ"yVøZ$®®À~L<Õ©sSäno5‰Cóð¨/hLb蟅³ÇÁ[ŸË0HØ&Št¾1Øz²ù‘fQ¥/šš%4Q$4x Y£¢{Lé«­&ôBdd[í„íÁÇ!C™Ë¥d“XìJ&¼Ñùv«aYú\@²0)–VrX•a-ŽÝÐÆôš/[{ü-I‹Ã7KÖÇÁ›r²è/J¤5/Õy/îÑ{Ù« rß-ô nQÍõ+܃­F1¿Ommc’F 6k$uŽ”UÊæŸ¢Î'õ_Ì5¿•ru3ü »)€9‚P¹ïË&Û>ÆBAr6X4 ¼ViLŠUE1]63¼(áq¬ü„¢Õ‰ ®€æfÕ·:%nr ã‰ø;…ãí-;T‚I¬å\JÏ`,çãá¾måTÞŽ'Ü“oožÅ8Ø_f$Sžâ•Ú3åæäÐfÂ×}INb£´¥Gc£ô 6JÄFé[l”vb£´¥Gc£ô 6JÄFé[l”vb£tÂØ¨Ü;„ù%³Ê‘‡(þ¦P•ïXgÖi¼aå%›‚2§ba´üAÛ/¶{Þs0"e3¼›0|.ÖLÄLÛíPâ‡9ÉÜ[ÆžóAx±lÔYÏŸg-äU÷Ÿ1kPÉ3Lˆ]ÌΩò_IGQ <[¦«ææfÂa`]ÃÓÀF«W†$ëF$­¬p>ø z‰‘Ä˼ñ«³Î'œÏðŽÃ]e §o!»Ww`ã,KÃB8‰&m&qo4ˆøÂXšÀçôiü,¯NŸÆÇâ;}®/=‡ÌõÉÀéSý•rzQý1nNŸ¦™ïô¹¾ôÇPC§OõW¥ÓK鎑ÀécÄ´ò&Ä%R==¯üìö8p )ôb½ Ö½lpãžwJ£|çø¼3/þ¶Ñ°M "U]W‡šÁe“3®A¸ûÑË‘ôÖüZaKg(\útë ¯û—%zâ™]!ص‘2Õ{$óvcu§Ý§#t³å3YRï†î + oM¤¸î(µ K-öÔ%:™àÑE„€P’wa«:É6•‰¶ÏÌÏ%H¨°ŠqÍeÆ÷H:HU߃b´\à¤T" ›aͦ9LVL³:%¶ŸÊÈ{ÚòL¢«©ðŠ©={ßé1I‘scKë£ñð~-dEiŒÃýy¿(‡·XÏ Yж è«ýåBlVóky®ûóZõÏ×É}yvTî›mdþš(õ±ÃB³îQH£7-ïçéož[ -jÓNz¬Em:{N]ÒõzkÞ˜‹ ¿‘oÑac«è¶.lnn|}LÓa‡ø¤¶‰™æÒ^¦Ú[aRi—Œ¹†~7ôÈ›ö&åøY_÷t€³ëðQ{Ïö[`½!(P- oýì­£dÞPŠ^Oå¢'ðùi5-8XùâÕ'.|œoì§ÒÓðîŒ-¯–R{$"]d5ÿ¼<ÐIäâ¬[ìCO¥ÓSéÎ&LÙ‘7FÖø®Y?°±ZÛqüÿÉò]4Ø8¶âNUä|p.D´  œŒc(qCG€÷œ}ÖÙҤ˅ôV3Ò>ÐÁf‘À4÷è¤T탪b–Å’;¹ ËPÒ[ »žIƒìÆuU1­¦UÏÊveLUÖðrú<«@*'CW x ªÐâõ+¢\í-€=4PbYí›WÙÁÝ+”Ò0%G÷ìÄ­ÜŸï9IaŠÒ–¾(>Á5”6,ywpÚ{wò|Pt·hLG¦îÜ<$4YåÇã¢ÎtìO¸ûÑê|&ö=%ðüÚrzj„œ fñcY°þÝÐwÊhŒÄ,&Íl±8Rèú…ª’Ü@è™Ïcÿûýùûý¼¾>|‚ý~!}ãèöû[FµÆ_7!æš¹ôæ5™ï+èkòÜ‹d)pdÙ“|Þ”ËBâÚ*¤¨vB`jìSÊý/”3ƒíãî Ò„µ˜(å(‰‰"®ÿ=¡"Dag)‡Ã?Ã?Õ^åi®ŸOkT—’•* –²‘.í äRó°²è‡y{”rnدÁZ¶Š÷–•%A¼”ªN¬‡I, ^¼wÑD>dÐ^TYÃÆäV*M§•ð ï—<ØH¦ФÁ³èFÜFâ[H>p ¶4à¦)\Ê|’ÂÞØÒ¦/º}EÂ6#˜+0'Q¸¢uÁ†o“‘ËaÃxÃ2“áÞÄÛQî N*Ô$'Qø%p÷¡7W@ÔÛtøµYw—¸Â܃q…%kB¬Õ°QheKãq(o f—P÷)ŒÖ™ø÷†W*ŠŽÅN†\¥!v„:À‰‰pM²>  Û%˜Ú)uœaAmO<l# ãH(éŠíš¢4QvM^ð¨/\JÑŠi©ǰ™L¿°Î4‡mð›Ýk¸¼\#M­¸¹Í„u–Zíl—cë›`cSìS l™²Ú%X§Þ@úäP;àùl3¼Ó‡3 ŒÃŠÑû´v1¤²ƒ)üÆ»I¨ßdÎÊ×xÃ:‘ ˜es|JëÒ˜I È&Û1Ù Hm‘~T“‰i?iRxn7K¤ ¿Ã=Û/{öùà¯Ý= Ô‹¤ì•°–e]4ä7ÅvÏÈ´Ì1M-ʾ’¢1)æ¥=…+N·V¡»½Û¡ûîU÷áÓ,Ì˯ÅöİIxÎKy¦xß‚÷{˜ßQÿf’c“é_+Ã…e–Oã÷Xv½2Pl&^í{ØË­4Ý® Ø^_2ë1V»{­XÈC+Þ¹V$Y„‰ô%¯µúš´“´?<[kÒò,ìhaŽºÆ•Qº#¢h\À"»4½ hô¦Ý„åé§u´ ‹Ú`²èè(µŽæ,MÈa‚ö¸äþõB N-ƒmY..J4Lð:D‡htº¹(r?Ò[`8Ü[{Ê6ÖfÇØllN|2ÊtaM̉OÛßMÉäáÍW§”Ùž_d$R6¿&ÐfõÄyogX’F½})zåcÌ_™*»ÝhÑyÛ½ìvÌ4ÇÄ$RÉìèù×J“®"¿$sWo1È&à·ÌóuÙ”Òm›ßZ=\‘8X4ÕÕž[#Ì¥ôV¼£ž ò¤z.,5æxë=H‰LuÊ5>S"Åèâ(‘2Xl–á`ß%RŒ.‹i …-ÈøÍoa&ɤZâãb*‰“¥(iÒ˜ö„I .Cኀ¤b鯰>°~ c}ÉšLÁì@ \H$ *Êow×ï¦âé2š`~ÁopÙ&¬ð|Ò˜)–³Ë3’Úy“ß‚êHežFf~“R[ݰMJ\Ù þÅ2H p£¿ÂAqÏ#[^¦¬x§‚ß`\c.Ç«%XŸRØË3^Ý(û ¼ï'iy4Ž”DØC±Sˆ£׬6wYŠ‹wï÷TeµL¡R—ÕÂöoQžÃzáÖå‡rØ(ûàëÝÛùšâL{Öª”T¸d::•<æƒ-„é€ixÙÏÇËó/ÓxyÒFOÃË6_× ËÅ™[8ÉÿI9ÝHt’J‘û”Çg}„Ó9¼£!ñ/Á³C*¹;•<¿¬·´|ÓÈ™½‡ýM€Ëaù ŠUÅÖ7Ž…ÃÞ5 Å2ºK¿ñ¼©ë¿ó÷«@åíÓǪ̂ËYŽ £ê’‰ªþæùµÚX3ױ¨ Üf¤Ô`Coy‘uñêáJU ß´^dy)·5ŒÕ |Æi±Ë-ŽÁö±é i»ë­½GठÛÝ<3˜`+îø¢\rd÷Û´.s±hêæ•m© W}¿BÜâNÂ9aÀlƒY@uønžE¾Gh|ƒ&3&'† &4d5Y ô˜ ÇAˆÛEul‚pê ò]ë(QJùÀ6äãÞÊõRf2ui5´#nP@oÞôת©uêüéôᦒP endstream endobj 7315 0 obj 5596 endobj 7319 0 obj [447 /XYZ 38.2500000 609.500000 0] endobj 7320 0 obj [447 /XYZ 38.2500000 609.500000 0] endobj 7321 0 obj [447 /XYZ 38.2500000 118.250000 0] endobj 7322 0 obj [447 /XYZ 38.2500000 118.250000 0] endobj 7318 0 obj << /Type /Page /Parent 2 0 R /Contents 7323 0 R /Resources 7325 0 R /Annots 7326 0 R /MediaBox [0 0 595 842] >> endobj 7325 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7326 0 obj [ ] endobj 7323 0 obj << /Length 7324 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾÷¯Ðy·Å‚^äÀ°‚O&ƒAfgùûÑîÉjUSlu?‘¼÷Z-.µ|U,‹¯ÿôùÕ¿~¯^¿ûüŸêëðóÝçS}6ªîÿ«Ú¯.?àö<ü^«ª¯¿ž¾UßNŸNŸšÿÿvê_øüî/Íoÿ«xõçæ¿Tû{óá×Ú/üz2Ì4?ÿÝýt†5¿ÕÓÏöóŸOý¡ú­mqìnÌüïWRÈZ˜v ];Ódݿ߿þvzÝ`]/VÛÚÈŠ5ŸUÌI^ý÷Ÿ§ŸšÆæë³“Œ-M}KG†7=™®îZtÔýËÓ<Ë߸åµÞ¬ñ~ä٩„féÖÏV & W²etËde-o~7bøïF¢)Ûk½OÆæ·`¸âbCijGž*ígÔf«Õ nÊl@¡©õ-ÈoX½]ãÝÈsed-l<#gSÖI±k¿7¿õr|»Æ»‘g§ÊÀÛDëã´Ól$šØÀ0_4¿AãFnýȳSedxÐú§5­à¡ôŸçñ[âÅ·_N¯?2Ù¢£®¾üÔ ®ë³ÿñ¥!Šª^µ£µÕ—«?Ô5“¬¾ürrgÍÕ8Ä-žˆ÷Ý“_m=;V›Â³«|ò>q° ßáð·òplò z¢p?pl¸5¥Â” ®E~¥ºG¯VŒ½~Üž  FÖÝ`¸J˜a0F«n<Ó`x/<öl]=2¨IìI/¾öš¯öš+Ï=W3*p‹ž°¶fàáI¢ækÕ=g%xÖˆ&tÐΘa*}螨³à†]ÉܦßõŒ”x]ÇRÒœÌ K˜Ù ñÆbp=K`‰Á­±î «ÏÚ°¶¹„xÃŽ1°ü (1òC9ìäŽ\ƒö>ñ„<Ž÷ëßáØªãw —‚=¦á;ž laß R‡2ŠDZ'ý±}øI‚»Ò²|ïùÉ$ z'2&·Yr)brö“X'`Þ›‚ôÕÛ¬€9FöBô•_JÒWÖã ­FBTKXÛïjGMA‘û·&1  îó¥¥uF¤yX‘%VóeóÃ~(ÆrŠMæå(Ò®¯·°ê7à]†yÛŠ¹Ø¤¹î'­§aöVŸûPd €‘'Ã0Õ™ûñË!f—ë‡Þ €©s¡» ;G­±nõYô¯0hÎ"ˆ» 8êwpÔ¢,›iZ5+·Q¨ù] ½äÞöl‹°‡RoÎl&O©¬Á`‡ÄrJT]ôŠyUÐ^¬oï# ŒWÅqq~ÅÆ e3ǧWìûàíÜ<$Þ+¢ì ÜOðï ±z1²ÿ Ê&ú¹žqƒwÏØ(2×à+Þ¦ð7`Rû$„ki[dKSà|oîµïFÙM@m^1¢³uÕû°sÃ}DÂÖÃS¦G@Ù¯$àf‚-x/ð=´´Ø"a+a’$LeÝËO 7AÃ( HÙuOAÃöSØ¿¡ÕrÏMq=þvc¯÷V¸¤¬Tö“rÃ8yJ–Á:‘œyÌ$F½­C³Ã¬‡Zš±»UkÉ! ¯`)e Gɇ V8ƒ »À£L£QòjM^àQcêT!±­­°L„ÔTJÚAÉäºfPsUY—“™))D‰t8؇©ù 'Mà¤7<Ӈܠ\ ãÍàí1#ÇÀD‚+ö½ƒ)Jò®ìž5´X,Aýzf'†T(šì$ÓBXVìÀKì-ÞûÀb£”ÐÖ#å×'”äî«|öæjäØ »ôœ®9ÊB«¦mwÞ°ö`iõëô7?[[WZ·? cç²Òjª‘2|òõ¤å™1Ç­eӷĬqÙGóýáïº}­òÞÖÎï£ù¤yg>’ö[vÖŠ÷ñóéíÛy“v0éfò&±ç=6ìË œR=ÃÁËË Î“•È‚‹È‚›dÁÍdÁy²à¢²`Y°Y°÷ÝL\YYp£,ÜpœàvîY6ç^sîYæs¯ýÄç^÷-1kE\ö1rϲ÷lís¯ýÄç^÷-;kÅÎû(Â=ËFî%Ve8]¯|ðÁ&œ„grÉ‚ðdADeA² "² &Y3Yž,ˆ¨,ð@xDøÄ}1“QV„YÆaˆÝ‰' ­4­³£%ÌBËìg㥌ï=%V=ØÕƒÎÒ ñ¦UÁËR J>Òc¹Èôì¦m„XàÈuß²³Vì¼"Žœ«ÇÓ牓KyÏ~/9õ±w`k¼†Â9¨R3¥ÌŸ‡cx¦8jŸâÃ[nxÎGâµÃ9 ­%œÏ8wqZð64çšó(šóÍyÍù„æ|†æÜCsEs 9 9ŸÐœÏМ—Es¾4?0îÀ¸§Ä¸s.³• Í¥‡æ2Šæ2@sAs9¡¹œ¡¹ôÐ\FÑ\h.#h.'4—34—eÑ\îÍßœh·ð;°…-¤A>]Õž®ê¨®ê@WuDWõ¤«z¦«ÚÓUÕU誎語tUÏtU—ÕU½]}P Þ1&lgWo“Ëô&—«§²YÅN˜áœ.BppŸ¡F×0ð"›¿U‘®-:?ƒ¯î"ûo‰Y+â²"›¿E‘ͧ<èƒûÙËÎZ±ó>J@¤«å¤w‡H¬Ð U',0žn‘•ÇrÿàöS†29ã®Vž¥QQK£K£"–FM–FÍ,ò,ŠZX±4j²4jfiTYK3UÛ³¥9°ôÀÒKŸ“ÛżÈl–Æx–ÆD- ,‰X3Y3³4Ƴ4&jiL`iLÄÒ˜ÉÒ˜™¥1e-}Ks¬iö€Ì vµó0ÁE1Á˜à"˜à&Lp3Lp&¸(&¸\Ü„ n† ®(&°ú0áé¤þ!±ç~Âmò¿rfb¼õ/ouß5uX)¹þ8-×Ï&%rã“ÀyËÅšŸî@s©²;„ª_¥ŽP2ü3Wc¦´†¥‹"ź} ð4ëY-NÐþ¡zNìÜÍöG$÷ÌXBÂòV—¡Ô¿ÌZD Õ_\u&f“šþ™ÎÞ¬0>‹G©æ›µžpž ‡Y+5?Ô!×<å,K1û8ÆwSŪ”V\­®[Ö 6Â7tUê´\=DÇì”Ú‡k⊄j„¸êÍbm›Uq üN¢~ ®ãi€ã`WÕêٚÜ›eÕ+_|õÊ+$I«eIÂTÄzBÐ Ž÷n)×Þ=Vz48²<ž‘sO—±A©­ÞCbÕžmèž5kÏtKXìáQc¶vp®ç0Ž.V¯Ë…‰øÂèr׈;nÇ»q–¦;Øýß1nì Cåðœ_·oûù¼í„N¨,ŽÇ&p?w÷qSë_ŽÕÃ!!Ç*e«UŠàãÅQywp0­(­‘öi0·Þ¤ï÷•˜VXâ0­°?HØLÔ¢§Œš°G—À>¬Ã;ö¬öÕÙ³=Û3ÝOä%q.³‡P0ïF·È­ûË˱*}TŒ>øsØ‚CBÀæÐ#œe씳`§p? xÿ£àª_²[n*?´{øŸàÏá½ç¶µ%uóûÁ‚C7ÔòºYÐË)©›Jºy“¼ì@3ðÎ~‚ùƒ½C~2}.æ×Pö<žŒÖÅì…ÖxÝ…©ƒ×P„û‘¾õ¾Ð^^s'ž”´`F.ò1ñ„r35á–r ·°ýà°5yO‰;Î ¾ä:¬D9ZoâagÒßÁOöÉ”N,Ž'ïŒÇ*#%/’pZäÿÙÖùÅèãã‰w .àwÁ²¼þÔ˜ÖYý /uJúëŠñE¹\Ì1-3RÁîÑ«^®1Srì–¤ØT8‰ùsUeõÍ5P/G8°Î$b>8;í.BSßbCH³ÃñÂê<óØ vßl+†±•‘ÎJó[ª»ó£çƶ¤gÛ×­7f›ºõ‰’¸oÖꙸÞ»Be'W”¥Ôñ”Yé‡û¡f&T¿$YÎZјÒéB5ÏðƆE‰| š'TÙÍ[ivÅu$Ô!`K¶ë‘m­f×ÙZG® ²µõ®ôi?ñ¯ ê¾%f­ˆË>Ækƒl-#×ÙZ}ˆàÚ î[vÖŠ÷‘áÚ d~†;ƒ,›¢…ÌϰzU=n\7×ÿÅCZQ³_Ç`¹ã[E«V²P)oe뇺(&+&ˆLrÉœ`âîÈÁ!3É9—ÊPVçƒÒÉm¤°Ÿâñ kš æ”Ïoá³÷kÒ Õ”èÉ05uæþBvUï$úq°Ÿ!®ÄƒÈài-ã˜1„‹­ÅpØ¿uõ”@WjÿJñ˜ZßÏCÝËG2a”Ûr³\ yýŽ!évÞ{EYœ¤,[r,4âMˆî&v²NâªíàžÑƒÙPÇ>&2x߉"èØ€<%¥,IÈ–ëÈaõ|é#¥òŠÝleoFQ*ôÕÅøËmV+/®x[ÙnYæ½=!e9§ä,N ]ǻօP`Vx9êu•Ê‘VF{º´œµ³™›¼'YÝ/á/¤({µÁ¶$VJVGޤÌitYFI4§´†ÙRÈíZ“˜`ÖDù<1úfLº0RCÊvk)ÒÆma;Â%Y›- ³æžlàM–-9Rê Ej²lƒ‚Y¶„ó€„3JIò)›of ÀôXå¦X®=åpQ y”EvÖúR!|’Á§, ‘ G )ëý@wØËÛ¶öyFª±”³¤nçD$©Û9å%\·ŸøIÝݷĬqÙǘÔí‹$u7ké :Hêî¾eg­Øy’º™bC^·›®ZH”þÀÅ:pr.±€¹®ùÃev%„–JRvÒØü«¾5$NràÓÒ®0­6š†Ú,´jÖÚЊe+† YL¿z*˜Lôÿø™wa¶ :|2„ág$S0ˆ ïQ?bÉÊÆÆöq˜i¸í¢0ZúvÇ€u8ÁAhð©¼@LƒáÖà;â³US¿8ÓO¸ö÷fÄ#£!í8œ,6XÄHïþó0œqÁh¼çƒ;ÆÂÙ‰Gf45†EÀzDIL ㌠ă› œº€r78PJ̾“ >nÍÞ®e¦ç¡gê$ñäbu·h†>UŸNÿn }¤ endstream endobj 7324 0 obj 4313 endobj 7328 0 obj << /Type /Annot /Subtype /Link /Rect [384.750000 543.500000 436.500000 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization >> endobj 7327 0 obj << /Type /Page /Parent 2 0 R /Contents 7329 0 R /Resources 7331 0 R /Annots 7332 0 R /MediaBox [0 0 595 842] >> endobj 7331 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 7332 0 obj [ 7328 0 R ] endobj 7329 0 obj << /Length 7330 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè¼ÀxDEQ@`¦g&@Ó@‹‚Ùl‹E:{ÈßlKê©’ÊEZm{»î–,>ª>Ö‹¬Òû¿|ýgñï?Š÷_ÿS|ë>¾îÊ}]•§ÅáçÝë Úí»ß‹ÚUÅ·ï»çây÷¸{lÿÿ¼;=ðõáoíoÿ+tñ×ö¿_‹ÿÑ^ü©ûÒá ßwµªÛÏߎŸM­ÚßÊáópý—Ýß(~?´Øw× fü÷;CíŸî0Œ™®Ÿwý4Õñço¿ïÞŸ°®W—¥²…2d Õ]ü÷_»ŸÛúæË}c”ª­©Ës:ªõ¡'S¶è¦,ª:èçø#ÓºJѸ-6~¹4QYm\’³•¢Ž<Ê$ ÐKó ·Ú¦kü8rqªô¼Å­K2·võ‰@Ô4 H44Ÿ€þJµR=s#§JÏ\ÜúÞRTëÊ}`råœn¯©ûwÑtY%døKó)nËt¢â4òT ´.¸š•­:qWS æÍ' ¿¦&Š?\œ*=sƒÖ×´‚‡rºr0Uh(Zw4ðtuh·µSû¿íÞ¹²°ÇƒŒ<]u…­s¸»òmgÍ^©F;§†oѨzÝGûýîïãc…ÿ4}Ðáo$í·Ü¨7îã—ÝÇâ&òs„dŸvï¿(£ZÙâéç–-GjŸ>ž¾ïÚI½;tGªxú©øS;R÷çâé×]³·ºê™ÓÝÑ莪á3†qç ¼ÓÀ;s£þüùdYfY&@–™@–eFÈ2²Ì$²L€,3,3 ËŒeò"«Ú²pkÊ¢;Äœþ8ÓÚsçÑ·Ä5q[³éÔ%†©Ê½­•kþrœ&íö®)#}¦Awʇã³7tм<£á3'öºÈ Ÿ%ÿ«Õñí+c³Y4ƒií£ß1nÒ$=ž(d}dÆp^‘~pkŸwª=i§fXËÁn>c> o¥ìHx·æ„ð> É‘`=\ñ…÷ñ[4j…^÷Ñ o¥ª á}p`ý>L ¼ßr£Vܸ,Â[i½áG€…·˜òo-Û1~h?à‡&ðC~h„òðC“ø¡?4ðC#üP^ü˜ áçÓzE1Eá¨9Fê2'5%TízS¢'{Ýúq#qLÊÓŠÖ«ujDQ¯èŽH?—RMœ~kƒ£Ú•[oQ ‡[ãL];h#a“[\ÐXÒ ÃðO„?˜Ö°5}›RýCg sᆭ[ÌD$a »ÄÌ]]Ö#sE—nÂ\Ñ­ú›‡+¾¹rüZ¡×}ôæŠ.턹rˆóz}´W|såø-7jÅûÈb®hEó¦4°AX½Cãu á<,h z `&°@÷õ ڞð '° ,èt^,ЀŽyˆŸùœÜYÑÆã¸™äxp¼šàx5ðØŒ8n<Ž›IŽ›€ãf‚ãfà¸qÜäåxÕs›ð*}œY[{v’{uÀ½z‚{õÀ/;âžõ¸g'¹gîÙ îÙ{vÄ=›—{5Õê:§ía½;ÁÂ),8 n M€…f ÍÀ}7‚ó°à&±à,¸ ,¸ n„— Ík^,¡çäýù|%Ï>£IûŒûŒ&ì3ì3ÙgäÙg4iŸQ`ŸÑ„}Fƒ}F#ûŒòÚg4ØgS²Ž{|©¾.dó)dC¦Ƕ¦¼ÄksÖ–Ç{"N5vë­ #8~*&>Þcè¶ã)_>Ê5)‘~ü©+˃”М—〠î5«Oë‰B”wRr…ÉD¥g F¶óñ|V/¹„j­j/{z-Ó"ÃñqŽÐÀ"HY®½–‡]#;*xÝ‹î/pŽ^p,C’¼Å’”ƒ¡­1†0Oƒƒ)Øš @•Xb̉FHÍ0C#àÅr“3Ž-Á`v„n åxwÒ;x°Ø¨ÀrhNÙ'Ô¹ª•žÒ½[ÐoÌ‚Žè>ßùŠð ¯óO©AØÇ3œéóŽëŽ/¦v¦-æÈ¨±ÒÆj6•œ›éØEÙ Äð03>›¤*I£1×L#GB å8+™ < ì¬@$C¶G”7¶AVز¾$g)pL)ßuŒ¸tX2 GE±&˜wݦÔ|ÎúªʾnÿBUû²¡1¥°º<¹‘J÷·Rq„aÐàuˆWuDŽñÙó~Œxɲ¼†ó€Ù4««#´Ú©ô’‰‘X‡·Æ4>ç û‰¤L1R³<ëMx;Ÿs8Ó Ãic*“9mšþð=¶šXR‘!—³ feÉ!Êý”l"§››6ß ÂqbNk²É•¢Ž$+oÓZv/ƒƒKyFg¸!)USc=ÝÄ’_Ë á³ìƃ(ž„¥áM¸XKØ’o‘Ž˜puتñÇɈžG”gw,ˆžci+áœåtÚõ0ëæDÎëÄÒÈÙ@Ü>ÑG€]0ŽÓ$›¢qÎ>fä°­fÇ#{'âdsÎ’BŒEð‚G0—{²jlG pkŒ1ÖY$8Ý||r†(ª"xc$•g£ŽlV[R™A“QÖ 1Ü»¬)³ÉÃÈãH’©y’ëmÊšÍäònVrêˆv½æ:ëa+7žèĆWäÌ8Þhä¤BˆžQ¸_ŒÊÁ&ü¦Ã¡Ø¿ÄLÌäLEKXáQ˜q ƒ[Óµ™ËŸÛæl ±Ž q†ËO®°5¥3>»‚aýÁŸàòÐëÔ>ÿÈJÊ|—RyºpƒÇ™„ƒÇøtËŠ ¢°X uEiSQ­ÌåœíKN«‹Û·—…æþ0ÕGjŒ‰î±Éö+'Os}+'´ƒz*¨w¡–)Gµ\96•¯;?þî]Ü´w1Øc •X9 眦«±¢Ê¦|}å·Ý×Eå[dó¬?ð±Æ¼X±³zy'ÓY?N´A¸Ò+'IHôŒ_dûöÙB{Cõ%ý™¡õ‹¯ÄÙN×îù°N­q¤=ã$âšãü+¢%+"xh‰—D…dÄŒ]AÐlzÎ+ªŸ6BϪ¶°\Èi†ÌJX„“4¼V{úè†éËÖ?`eÃ_<­lˆX!ýEµ(+o@6!S6#]4ý{‹¦Ç^s~l20ÝK8Ùê^q{öNB…Ú¸ÆS¨Æ ÎpŠÑa[Döý%Ùr( döœd.F5D,œ8wLÅXæ¹v–®ÁÖ¾§­^¯‰—>¬W+=Ëï»…˜²T›jL„ͲE™k3”µ­nð–j ­ˆgr²9‰ÕÊrŽ ¿Lm¹æ€ŠÓñr]#Üq®@­¨,œ­ÏyfÅ+¤WlÖŠzêØO;#.˜65ÁçÉùsßÊ”HÕµ?NÌއsí»²Û%¬œ‰sž²•§W¼)–SÜOfMVOäÊQyâšS´„oV)‡ "»*¢§—eê2Ä+çØo$¼Æ©.[ï&Å~bÊuCž2æXtW’“Ä:§Œ+‰fÊ/I­Èì´åJÊäH«0EàÚU|â7٘ﱔ-¤lëùµ&±«‘KËKе”‘dÝxôÏm ^WГ'hí¹‡½ß•U@‚“;°Üø[qÂ4[íö +ù+1Òs–;tz@.Û„‹@1j·ã2:¬rJ¸d.°ƒË2 ;r aucËÃá—ª:÷ZÿWUëï›{1Óóx¿õb¦:§˜é½Xà`‰Þ “^Qy¿k,%ÚP_JT® ß‚^ëá…1p¥f•wû²7mÍDæƒ×G«3V¦hF Hµžß<~ó­'Uš4ÖxD2Zc¡t òA•ÎήÁË—xبÐêáhâȺÅÖ”«ëJÖæ.1Ýî Ë‚áX~,;2£ På9>æVdaÊ3P‘Ë™|[Î:ãxñ‘; û…YÌåeâÕ„cHXçD(jGæƒW:¤(GÖ`êD´+^?˜Ö™fª±¦ÄsÆØ"’¢Ê߈D«S”³æð|òùíJé øíJÙ~{ÆñhêC½¹Ã°_ÞÀþÏÔlpâ” ;vëëI×63’"–ó˜[±/’ÞfÄ{ãX&e2cY1^ñT°$ÅÖ¦èšÑКÁžŠÉ$¢ÜÎuçf¤–¤X÷G|QLÌm,á°f`øãÝ©F!Ï–ãa¹±‰]õvõåíX–Ÿ›“VÍŠˆÒêÚ¢ç³1Ø,|4eså#Ú€aWÏZy(ò’K–IÛÖhp­wY#y(âªûZ?k­Fücs0éÎÔÌiò,¸¬Êùðޖ쪌>c¤×(»*—ÛNáœâD9{X÷¸Ñ¥ãFñ Ie©Wµ‘ÌlÑ—t]¬n¦H)JV‘—·TDmƒ/È\>"UiÜHÚØŠä°¹\i•©ÊFyXö1–ýø|¬K-+©&Ö²…¶VÔèÃyìxÀl¥”ŠÎ6óð á¯>”õÆ FÍ!Ù·Eª%®°\I±^Èêà båªßDZÛ$›ˆ= l¼ÈZœì~œÌ¥îã!ó2⼈A œ’Uu‘ö•`—|·Uc}“'qÍ›5ì•}ñF.O•³þ—/œˆ¯ÇqŸ®½(lê×6p ‡¦}ÑÓýÕmÑ5TIËW7EY×ï‰Þ릔×X7EÕºžçðÍdßTÝUÛj–÷93Új7ìbÞ³ÞyX”Í´„\ȉRWÒ£ñ†(f샳 26Ìh5…!à<¢D&ÈÀ¸b,âNÐOMN î:A?!”"óÏDˆ[s篲º¤}'¡GË .|‡^eÀ̪¡Çâq÷÷£XÙ endstream endobj 7330 0 obj 3908 endobj 7334 0 obj [449 /XYZ 31.5000000 386 0] endobj 7335 0 obj [449 /XYZ 38.2500000 158 0] endobj 7336 0 obj [449 /XYZ 32.2500000 275.750000 0] endobj 7337 0 obj [449 /XYZ 31.5000000 276.500000 0] endobj 7338 0 obj [449 /XYZ 38.2500000 207.500000 0] endobj 7339 0 obj [449 /XYZ 32.2500000 385.250000 0] endobj 7340 0 obj [449 /XYZ 38.2500000 158 0] endobj 7341 0 obj [449 /XYZ 38.2500000 207.500000 0] endobj 7333 0 obj << /Type /Page /Parent 2 0 R /Contents 7342 0 R /Resources 7344 0 R /Annots 7345 0 R /MediaBox [0 0 595 842] >> endobj 7344 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R /F1701 1701 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 7345 0 obj [ ] endobj 7342 0 obj << /Length 7343 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ÐÙ€{Ň( x_r°ð99ë8†‘5²ñ!?ÒˆêiQú(©¦HQ=Ú…=³­¦ø*V}õä›?ýøâ_¿oÞýøŸâ‹ûùîÇKy­«²ÿSt¿¿ÿ@Ú«û½¨mU|ùzùV|»|º|jÿÿíÒ7øñÝ_ÚßþWÈâÏí¿û{ûáOîKݾ^jQ·?ÿýô³©Eû[yûÙ}þËå¯ß¿uoºsƒÿû{­ª¦nºa,týí2LS<ýýýËo—7ýlëÅÖ¢©l!´Ò…h´,þûÏËÏmÃëËk£…¨®Ë—tTË®'S™BȦ]kÕL:zúËózÁÿr©íåýÈÙWE(#Âo¿Z­„ªe¥»î6¹²V¶¿×ÊýyÙ¢iá­²6üùõöD•¥ŒGMO#g_·á·_­qàïľíÓšu”¦…-føH\RSRYGjub¸½=¥Éˆ¬¥9÷¢8BÃ/LgJ[Î>my^ƒ ØýhøöóåÍÇvHí&šâóÏíª<õÙÿøÜnFU|ßÉÚvS>ÿTü¡,Õû?Ÿ½4W#«aˆîIóôäÃçvRÑÇÓ×k)ÑxäèI©Ðaà“šÐæ-|¢Ñ]nï§|ŸXø ¶Á£–xu9S<6Loxl O†,e3ôúŽç}Âñ˜zqµËð ä6ÁýÀsG ¹‡4¤«çý¨· wØšÅñF ©4°"xï!½öÓ%al ŽàõpBA™)ìGè ¯ip¦¯gO¥ÈAÚAº ­–ù– xWYßF‘TôP¶+–OAr–˜?œœ#Î@pÔ¤“)$ç]Pbµ]ÖxÔ° åœ'8ÚÙÿS¬/ûŸ,uÀL)’ŸÜÖz#`æÇ\7lÀö,Þu£èÒ ‘™,WÈêDvS”•4ŸHŠåúÁp^JÍZŠfyYw8`?¼ïÄYÓr*^CÚˆ7H6h¼¢{2ï)!Í{ý(˜ëè¿„ü@aÛžöL/æ|C*ÜO"Ú©à¨Oª Zl 'g ©0…à±å®)ûÄDѧðnbPôBx‚cC(ô‚÷^RЖÈ= )áHÜ.g{z+8ü„—zO éÌ4š±m-{ÉRÕ‹ãÉàÉiÕaƃ$‹8Åê€×s»Ý¹jRkXý’h7R„\ÂxÙT©ú%xÛN9Ì»ý¢¬O¾š¿µ¼KÚá4ÔCœTQßZ8%€xy=Iþ0ª¤ÄSâˆhóŒ¹ñ  HUºm( %Ù*1%)¬‰a®D± ´*JŒgI ¾œù| Žê‚ëžâ~(Ñ. ÒÎülV¥N|61%0!wžçdç瑤¢^ ±­*s}¸’ÞM&Ÿ1Åbüƒó)0j;Oz'F´óî6ïyÆ’[æ.ÓÍ I&“éØwžÀ¬£°˜³9s?vý³žŒ“’h”„Ïæ1ý(˜C’²+vס29ÏÍ×|žçó<÷<óÚ+ó8›FØólžgóøg3‘­"“S[™å³É«;¦²ÞœUŽZu€÷<ãÖ~4ŽÎ\K6M>>!|6%Þ -ñå$+_ µ¼Vm-pî ‘WŽû¦Y‘J¼`¤¤8ŒÇê„ó¶§f»¡¦ªHÀÈYGBµ˜CaO”ê‹ñóI¨Ü–vq·‘«Y:9±·=Í*ÚÔ8åä‘Ç#IÑ ydSž˜Ð[¾ ö0ÍŠÔ©Ñ"¥–>%ºšR½ãôë§óël3 l¶zîXÑ UÞRDOzB]•VÝ\Ïįѧ©ú)¬iÓ 6n EsmìS#ŸX„=oÕôĉç¹6 „k€G-|RÂà6=£©‡%XÕF¢Qã™â·9£‘kÞOm`/K.¢o€,ÐeOôÍíž—G×þ`Üöj›Ò#, Ÿô¼F_ûŘJ!®•6vDÚýrWW%­/ìÇ-î¦'xÔN‚mšÛøŽ$úa?·1Ûûq?÷¤—jX¶—í‚ãÄvÅ`g›{¢á¢à!Up¸ëïe°¸ \.Ü&@ù˜àÛ\~¶]³\„Á’h3 7’@?‚ß}‚À~ô‡gÁ°æv01æéf2!EwëXñõöoyµ¶,Œé~ÔB¸OuaªÛÕ£î“/£¯B4ÒZqû–½EÝ÷Ñ~ßý»ìš^ëî“qí'm›ñHºoÙÑ[ì¸_.o¿‹$,m/,…¬_ c É8 ^Q:‰[^M-Æ¢ïGTײñ@ëðm„ÉáÑš`¤BaM”íǨ®¨ËQ˜ëÏï_±b2,:îim`Œ‰û¡°L!xóÁý¸˜C»fꬬƒ¢Ld½üè³7Â&¼¥x^tr‹¨ûU²òäVÊH¬›‚ö°ZHXÃÝ6<0 ‚ø,~ÆR[\ÜzÕå½j1‡^µò‘eûɽvßR£·¨û>nèU5sèUY¿ö“ zí¾eGo±ã> ×›ùD¯;ž›×l/šØq($ JŠk@¢@TŠô l6A !«TF“ FÐ)&ÔŒK`-0‚ãUfÒBЏ.èJjOîÑÄy‹8—‚’eã!p6G`¼BéÙÓñG¾Èy„©wýéx(“/~ÅzŸÔŒÁ¢Qä„ÂkN|˜¬X¶'r‘`â"¹k)çiw¥9cÀB™:$ø€õ•²-ÑÍaº6ž8›.÷„7áµÄ’›LáúSlöFÀl1ÏXÿ~¸øÊPE)„m&^ƒÀ¶ÀMt¼'|í©Dm@(N&H ÁVzAbp'$‹%{tºÛ©`†/ؤ… šbÒJ„VN[ñ&°Š;Æ‹Ø °Ök&¼ ’sqmiZï&®.S¤íÏíýÂ9ª!(o4J8Þ“ j8…•à+%ŒXÙÛsÖ¬ ­"ç×)ŸMà’’ˆlÓ–¾bp¾oúè&Y§.l|€ÝÞ– þ*®¤YH TjÈ–eN 4° L°s:D=å°8Å'Ëá”8˜JHIñ“ð ž©;RLgJI€„;'ØÈhÁ8¢nå'RGH ô$r–b€ @­‰ÎˆGŸK`†3©|Ugæo¼9ÅúƒÿÈø“Ke¡äÆL¬›X‡!DCL┩o°aN|Ì¢¢l©à+ëR—Z´'>ÜÇîÖzÝ:A9ç6›p ’ÂÒi›3Q¸iÆïX "QpHøõx2ºæTM·}÷ˆÕØëüþIxý¦¦`^ßžà„¿SP®'­!âàµÁ®Û?Z8çp€ñ®§‡E#s\ãRSŸ3ãKï—J>E” ­VK’¯ãlë ’Wª -o§€âÒ¡¤ãóÁÊ}§bD ´9…c$áHq°íŸÚÈ£¥ô³BoŠø÷¯K™´¢¬Q®¼1A©m=1X]Š‚È[[c¢ €` b *à„ǼU*6…I° Ź{±¾-ÛÂU·KëfTù@WåLå]I¯*A÷‰_ùàé[jôußÇPù@k;Sù@ëÚï£ýį|ðô-;z‹÷¿ò®ª˜Â6®Â)JãM"à|‡¹§LVÂMW0J¥çèRL4Ê'„ÝYD2d9Í6¿hsÊn2 0¦èv„L»dBk%ký¾Åˆá9ð#8#&>éÀ‘MD2“³ðŠ4‰¡¨j‘tæ˜Cf³ì¯Ü[•_†Â‡ÂëY^OPx=ƒÂë ¯G(Üx(ÜÌ¢p3Aáf…› 7#n¢ðúPøm¯Q»Œ˜»MÝ¿Pä}W°VôŽŒÏ³VZ^_HÚ bₘ˜náÆ—VûÃ^WŸkÝ-˜YCÙËÊN7q]~XºiúÄM­ºÊ‰&f¶·q!ÎsmÔFß.ûéùÖ]§sŠkåë©ýV™«ÒcÑló=q<`n>>ùû»àR€ê«šcšÍ<±«=jqìS˜vW¬ûâ¬ãG’TÕ-Òæ±AEäš)œEÆBÉ þÝÕqÐè“#•w9fhÉ–j{„⎎7æíý mÍÊt¤Ø²õAz”È|Jl¶x»~CŽYa á-CΚzµA n(OO)†Â*4UúÁ4ɇ^¿n›¯°cÿ|ßȲj¯R¥iÒ/ìDÙÂuݱÝxµ}î !5W–_°E”®îÝòÆ5•’2À×óÉÏÀ¯?VÅpÍ®²a°Ç)€žÀ¶Uß ?¥ä*¡ð8s¨þþ¡M;ûºbJ —ùL$Vˆå¬ Çé6Zà5¦ nív«LÖ—ùÙÿHÆŠõ7ZPIÉøÞ÷ÈžœÓG§f Š5öÑ †©®•¸SR9@Òò»¨ÁÛ•'ñr9ö&;M‚¬÷Q’\ –ùÉjïy‰ oé—* Ëh¿”íŽYïa5”¿ ÈÊ?„j¦Ÿƒ:µ§qèò tÚÂSIÆZVûÅ,BŠK}0%댤¡!‚#GÒäÍv$·‹0¡v“kYÞc˜­[â s¡°|µŸq¬ƒ1ʧËüs ¢6·î¸Ne²Š|q£&_›Ç<¾ )ºÔj”ðµ±CqùDá²û[žNç1-†“׸@±ÂòPqšÖà(ZÅÛ‚i”EJugðÎÜ,òÝ­½)­.oÌ›Óp ñmoûƒËÅ{à1ÝíHüÀ)3¡–<Þl^Ä´Á$7ÅóAû£„’‰™óržË=6dk¥ºo‚”XžŠE¦Ò òÏjŠ(a»GëNÂæf]Œ|²¨ý8ó¥ø*Û 5±Éx·åÍíÜ-׊"—'v@ŠÙ!Q…‡93"§g6>»ÁÇ“rWy€Añ‘åN´ÿ­[µVlęکâ[ü`n×€ç.0$JXfŒrz¯1+ÃÔR˜@ý!±,Bq’ßÀ‘Ê[(²ÂË+{™æ±Ø ŸÝ>çh‡dQéëC FWZÞ3"ª©<ù¹"ßÞQ Û»Rw±„¥\M€òeÇ|KÊ:%16QZO†ø±,âùVA#ON” 'Šleý _†AI!ãU}y‹ón¸š…×î³Á0“ÊAa\,ù§îF^¥‹õ^ˆš‘éA]®éÜiÍ-C,Æý¥¯€hÄí8ÿ“C@Àò[\¥‰’³F+‚Ž„ÿ3u3Â4Ô·tã2ã´€=ï¹TÏa³©S¬héÏ:ãJ‹û'—=|´DΉbv2ÇI"Ü¿a’œË ˜Ú9ôh’l¯Kð˜ÝXêÔb] +$˜þ⻤´öéî5™S)húÃóêâå{^w1]÷þ’z+ë§Kê¿Þþm»»í‹ñ÷VµŸT×!–Ã'_.Fw÷ÝKkÅí[jôußGû}÷oÓ5+¼Ö²òûh?iÛŒGÒ}ËŽÞbÇ}üryûÝKÑ}÷&•ÐCV«ÔøPÎAx AwA7ÌÒŰGg;)4׎ÍI»MªžO Â¨ÝØ"ò)+oÝIcBg¼®qR]Á#Ö“{´R„û z®+Œ{w”`–ÖHµÁ×N)ëHð7¦J¹åÚp-«ÃˆÇ}G©ÇÉJ ©l¯nÊ”™U¦ÌD™23Ê”¹)Sf¤L™´ÊTý°Ê¡ŸR³A}ªY§šE¬±ìòãzüEÀ¼ù*1õ¡JxÇüT1NãT1öU1¶äQr qÀgÜšJÌ¥(wP1Ú¿Å·–ݹñ§¥/¬`ׄÜ_[Ìܯz çxo?£zæ´÷V^eêÝ“Þël¦OÔ{ׯLn{p‡Þ£~Ô÷šÛG7ÓIZ’cµØ0ªŸ‡TÂÁ 7õÉÝ©À§Ë…™iü6ØÆ±g±iêw×T‚ë~oG> endobj 7358 0 obj << /Type /Annot /Subtype /Link /Rect [87 219.500000 161.250000 226.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn3 >> endobj 7359 0 obj << /Type /Annot /Subtype /Link /Rect [87 212.750000 163.500000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn4 >> endobj 7360 0 obj << /Type /Annot /Subtype /Link /Rect [87 205.250000 120 212 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn5 >> endobj 7361 0 obj << /Type /Annot /Subtype /Link /Rect [87 198.500000 136.500000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn6 >> endobj 7362 0 obj << /Type /Annot /Subtype /Link /Rect [87 191 167.250000 197.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn7 >> endobj 7363 0 obj << /Type /Annot /Subtype /Link /Rect [87 184.250000 165 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn8 >> endobj 7364 0 obj << /Type /Annot /Subtype /Link /Rect [87 176.750000 150.750000 183.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn9 >> endobj 7365 0 obj << /Type /Annot /Subtype /Link /Rect [87 170 138 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn10 >> endobj 7366 0 obj << /Type /Annot /Subtype /Link /Rect [60 162.500000 190.500000 169.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn11 >> endobj 7367 0 obj << /Type /Annot /Subtype /Link /Rect [87 155.750000 187.500000 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn12 >> endobj 7368 0 obj << /Type /Annot /Subtype /Link /Rect [87 148.250000 125.250000 155 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn13 >> endobj 7369 0 obj << /Type /Annot /Subtype /Link /Rect [60 141.500000 142.500000 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn14 >> endobj 7370 0 obj << /Type /Annot /Subtype /Link /Rect [87 134 109.500000 140.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn15 >> endobj 7371 0 obj << /Type /Annot /Subtype /Link /Rect [87 127.250000 112.500000 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn16 >> endobj 7372 0 obj << /Type /Annot /Subtype /Link /Rect [87 119.750000 129.750000 126.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn17 >> endobj 7373 0 obj << /Type /Annot /Subtype /Link /Rect [87 113 144.750000 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn18 >> endobj 7374 0 obj << /Type /Annot /Subtype /Link /Rect [87 105.500000 108.750000 112.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn19 >> endobj 7375 0 obj << /Type /Annot /Subtype /Link /Rect [87 98.7500000 114 105.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn20 >> endobj 7376 0 obj << /Type /Annot /Subtype /Link /Rect [87 91.2500000 119.250000 98 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn21 >> endobj 7377 0 obj << /Type /Annot /Subtype /Link /Rect [87 84.5000000 129 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn22 >> endobj 7378 0 obj << /Type /Annot /Subtype /Link /Rect [87 77 192 83.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn23 >> endobj 7379 0 obj << /Type /Annot /Subtype /Link /Rect [87 70.2500000 154.500000 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn24 >> endobj 7380 0 obj << /Type /Annot /Subtype /Link /Rect [87 62.7500000 125.250000 69.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn25 >> endobj 7381 0 obj << /Type /Annot /Subtype /Link /Rect [70.5000000 284.750000 98.2500000 291.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://help.scilab.org/docs/5.5.0/en_US/api_scilab.html) >> >> endobj 7382 0 obj << /Type /Annot /Subtype /Link /Rect [71.2500000 278 85.5000000 284.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://wiki.scilab.org/howto/Create%20a%20toolbox) >> >> endobj 7346 0 obj << /Type /Page /Parent 2 0 R /Contents 7383 0 R /Resources 7385 0 R /Annots 7386 0 R /MediaBox [0 0 595 842] >> endobj 7385 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 7386 0 obj [ 7357 0 R 7358 0 R 7359 0 R 7360 0 R 7361 0 R 7362 0 R 7363 0 R 7364 0 R 7365 0 R 7366 0 R 7367 0 R 7368 0 R 7369 0 R 7370 0 R 7371 0 R 7372 0 R 7373 0 R 7374 0 R 7375 0 R 7376 0 R 7377 0 R 7378 0 R 7379 0 R 7380 0 R 7381 0 R 7382 0 R ] endobj 7383 0 obj << /Length 7384 0 R /Filter /FlateDecode >> stream xœí]I¯ä8r¾¿_‘ç&[Ü)À0P[ðÁ@¡ ðaàƒQãqc0=pyþûÖF¥¸|L)’Z2Ÿ¦a×KJâü"Œøå_¾ýçå¿ÿqùåÓ·ÿ¹üþýôí­ºUõÿ»´ÿýqZÀíuøûb¬ºüøýíçåçÛ×·¯ÍÿÿùÖðíÓ¿5ýß…_þµù¿¿^þôMះ—Ú~3Ì4ÿþ­û·6¬ù«ÿmË{û÷?\þÞÖèš:ãÿþ£ºVUÛ;Mÿ|sÃdÝÿøñ÷·_ú XÖŠ5¢nJ™òÂjÉ/ÿû_oipÕWW«¹‘ªª-ü›Ø¸áMë²âæÂx]]”‰Úîþ+S;[£r+V¬¼íyéIaB³låͪÿƒ›¶m»L4íJf/ :«%cFKS=BÐýÜñæŸ~a„XainÕ¯P¹¬äz•w=/>+Žªpí%Wë¥_cqÇêטÿÚÖëUÞõ¼ø¬¸Åŵ¯+3S Ê U±ZWÆJø÷#-ó–\÷m9¦“Õ[f»µÜ²Å–SÍ$W‰–¿.©ƒÚ;ãS|Ç/òc¼‡¸›\¡ÚÆ“ûd\&êÞaúªÛôñaúXÕw_¦å ÿö$k¦¹ª×Z³°î­™æººL:ª«'Z³Uø,E ÇX°º²hÖ«v|ŽÅ²ëðذçõ«6üZáðÄÞ>M:r«ýñûÛ/¿6pZ_¾ÿ¥Ù¾» ìÿùþû›l~´¦ ¦.ßÿ|ù§ªbêŸ/ßÿúf¯¶®šávóÝ?©8|"»'ò*Eo1ŸHÝ=׿/k¼ol_ۭ઄iذªWaõìcX=î=nc–׆{À>Å 3Ö=aâ*¸eÍ£Û¿±h–(“Âkø \'Þׯ˜ëœé‚D…ÛÁµ‰ Î|’¡.8£L%3ü ¤<;¸ox /ßQþ˜Ôj¬ .ÑHâ@rõ¯¯]o<’•èIõ>ù ŸøäWôdè[)‚œë`>¤€ Tl`o„ z3ÌÚD c:%ȸŒLˆ6,\ Ì›zöÎü/zJ‡ñ¤àÕÀò±gå–)b‘Y»oØ“»d[h£&Ij<Ñ„ÂÍ#Ó%ÂJ’6,Ôa¯ñŠÉ Ó7ø`óq!^AÌâX‚”¥! t ¹&š ùå&¸çh ,éÚvG™RµU£Ù¸ßújmuÑÝ?†±¡Ô^´~‡’oZ^«¹µl|KxµˆiÍûÃïî³KøµˆÚí7AOš·¬W‹õÛøííãVÚÌì #5*ð])Á1O,¥I ÷d_,Éj¬°€X2ƒá®à7~S¯Ñx3Ú€®·Ý`×]Tnõª‹*øUH9{Q¥$lÜeñÔ²b– ¥]Ú‚ ¦#þ&`R’®Rv ·)Ò^G¡'<)˜|(h/ ¥×Ñ®^”ÖcLªJaR`RĤ:¤:IõˆIµ‡Iu€Iu“ê“ê&Õ#&Õ&ÕbR³5&}Ý1Ãsê® AM´ Ð˜XÕ“@„3œ‡¤j»÷dMÊm8jÊŠÝÛ¼Vš2Æûx²±UMØÎ1—[p5{¹18¥È³ÌÅ„ƒ·åùzòûĤR§yåxl-µx%¶^ÔÞa†íë¶‹ŽÅ8ìƒ:ôúGiš™`å|&É,˪Û$…ÿåÑã¾B˘w,´è€yEabm=ó¨µ{Ó»{ɆLÝ89k´ ޝ×5âŽÿñ“­„í|µqzV·¿«~=õ¸jØ;ÁÀ=½Âs¼ÛXÞƒÁ¹aQß2xƒ€D2v~¬SƃkÃXˆ2ž»ø)Uìõû)¦ªÌ6F *Ì%˜â)«Àö˃ãk3ïšçHí˜%¬ ¯œÄ{ðûáÓ²o ÚÀ”Xt0…¼#®Ç{eGǽ&pýa\†RO0UáñÀ¾m5xØš<Ò'¸l°hÞªbžIöÂeò„³óF‘Œ[×Í~­6ßëÙá&ž Ð×ÁZ1ùÆÂojôÍpâÂì54~T°oƒó “K¾q Ù)Sßô¶s­m8ÜÎØ78¬†óö‰0ׇ£¾á‘²ÕÝå{3ÂG‚)ÓÏV.R‹=Rvv|r@pwÊÜW¡xìut‰ 6¾’G1å\®SfÕ —‹xƒgŽu(^îÝÌe /Å÷ÀÀ™åÇóVöšÜÀÕU拃èd€rí–Bfxàšp{‰8'=–Âx^ð¥&¼¼aOØçrÕIG©Î÷CræfÃ!Àꡉž Œ¡®<:°²Ë¿nÞ§¾©a;ÊÉùž’#ßîyµH­Pª>ù‚j«à¼ ÈÌ\ED ~zyÛøcÁúÖpv?-žC‡-óÎJ:ç)ÔƒH>ã¢É¡ 2X9$˜É×wÓaRó^ÒÝwÏ øÈš„Ôƒ­.µ·Äø (W tÝÀ‰mIt‡\ÊÖÄœƒKÈD*bè=ìÏêZ…›AúŒq÷h!Õ]N‰úù¶î5=_«ù[jÙDŽüLØq0ùRìó}×(W)¶™L; ðÌŸ<Ê–WÔ xpl{К·®=vK—?Q‘•(în”uìd„r G^$—xTHqÓxÒý¢«gG³$Ì òö,±wÙí·èÑ?‰ú x5ºÄr#ã^Œ¿ÁãÁ½&¸ àU˜›¶ä )VáûÐÿ1æWsh,s]!HéÍö=ŠäÁÒ»0a¹ {ÙuîH™ñì.“2hjÿ¹&HEAqSÅÓ·ÁÌž~Ò[¦/·rG¦^¶;©÷Ô»ÕÊaê=.²£ipw»ÃþÆZuŽÝgg+« EÖì©)½ÞßAšëôC¯l!Ÿ/ŒFq; Z>Rè”B¯+…VÍ´aBI³®ßÑ’¬ev‹¦àYâ½BäFñöXÿD])˯©L¼¦ o½F¶‘²ì÷jžZ›¥DÁN[•Ä—¬°7&åZeÞ^coÂ=ˆ]øÊzçb!…=ÇÕcWUød×DVñPGÛŒívwN>·ý' ÓXóïÚÛôž×#ñú¥Ôz¯¿ùmâxýMiíÇÒïJ‚xýý[«ELÛâõ7¿U¯¿)•Q2Œ×ß¿e½Z¬ßFxý¬­)²_JÃ}X¦ÈÃo2® >ÁW~ðAvú°ú2\¨¼ÍáàrY ¿ÏW^ËŠïÌ7 Òy¬|û7LÑÑY)ÊÚû¹ä½J¾èݳ5~J†ÒûL¸²‹eâ`º¥LñFÁ#HV(ãÙß 5?o=ioZp•S áFN9 l l“@ØF@Ø&€°°õ€° €°Maa›ÂvÂÖÂv[ \sŸ3Á]JêªX4Pû„F“±Qê¡å ÉÞK¹Ñ‰¡¹Ê·Ñ â9À8BrØ·"ªÌüÓÑÍlà .VRp}ÑÄ]s<õy…'20³D”ÌV§õ@¸~¿Sýc‚AUù`PU)0¨ª ¶%!ìÞ^-bÚ†ƒªJAU…`°- Á`÷–õj±~›€AÅF½º¨ísÈÇê`'ä;!ßÑ!_ž²ç<å~XÄÕh}ä%j Óã#ÑeþÄ‹Gä/Òñ"ð"OâEáEžÀ‹|Ä‹ÜË<À‹<‰y„y/ò/r/òmñ¢DÜ¢3ì ^¼gVÜÀxx IâC|SÄŸ¼`즂)øOx}Âë W°hl2’—ÝËwÕôï"”ÞE#Í’e1M`ÎY` .:@©‡ÎV÷ïíW®ÏœÍcf^pœPûíï=ƒÉ€â"•!ª[@û1œ‹¼ß"o–ªA™¥jø ¿Á©ÄH¿a€ãè‰KÉ•HMðt D¸Š/”áNJ/ÍÆÎ¥¸Î+dÏdþ¼E½•­Íý9nÈPô:ʼ8­áž1æT ·ŠWÁ® ·×2¡ “Ch ößPñ7¸Š2×z}eí¤7zJ.˜§º]Ÿ™”¦¯Âœ@½‡…+nxµxgÞj¦t¡ N53ËoGS3× FÈ´ È#ÿŒïû}g~ä:d¾W9Ÿ|‚äM nåQÂÞPöT’@"Xe¶Ìïdª`®RÜ Ÿd2F`§˜óÉùä|r>9Ÿ”x²Í.Ñžü­°KP²àHÏ$LŠ£Cã@G¸o/ã¨å8z7žJmGI,»•fª G»ÆùJpÔJ´kLoºÎDïÆ3г’àÚptuLU„œaÎÊP/¡™Xí0¼Y¦„,w«Ä]ßf—öÔ%Î'ç“óÉùäŸl³K˜¶jJn˜§ÌZ¼U~œL¯ ÆBesȖ͆GÊ…Z4×Íþëƒ35)Œ°ßÛ™Ò¢ÙÙ9™“ªµz@¢à¹*ËMØ5LJÎáÌH =Ø?WyF[<Ÿž`~Þ*/vF¢l(7,“‡Y“ç|’YǧÌx}ºâ0+üœO@—EÑûAèRA3‘'Ûš1O6q¬êœD81ÃÈ~³œ²§Ýàz©"ȱÌ)ÃI!¥3áôl¼gdd9!ç/ÉrqÒiÊ®Üi«ÈŽ´¨­âv*[ÏÞO"¼Â˜30™E½4Hˆ‰"7(~I˜Æ°LÃ8S9¬-³Í3ŸYfj#H.ŠÍi¸ûµ ?×U}·?…ý¤0§ÝgNplaË]«æöE©üDSD4µ%õIó ÔwžÕ?³„Ó£WÎé»y>9ŸœOÎ'ÏôdÝ]¢C¡*þþN›¶Â¬I±¬âyÃ#¥X| öŠGJOF³ h ÷¬¤kfÏéyMy©§ÊEÆ)aSÊæ»ÉD]X-ÆŒˆs½”‡\"‹=%Wÿ5lx÷Ĭ¤àø;†ZTB‡¼µ ~ ·ٰhîWR˜TBìtRÌJÎu‚(ÊO´”ï7a©¼PªRlšªùÍã¼PMi³©+ òBõo ¯1mcÈ Õü®â¼Pª’u؆¬Ã¼Pý[Ö«Åúml‘ªiÎød³ÌLtä¤ò“±QòB‘rÒ„lT6AÞ‘RTʽH¢¨²ÙII;?Îý –´l–Ç¢(êÅYb͈™BbìˆÌVBEÂ󟡸§3Û*=æT5Wòåp~ +kYÝcEJ ™ä©¢`¾YŸšà6+ÃýæEtÌH"HE@E[e¥)bpÃRøä-Ü0ïËéõ&ÐëMR¯7‘^oz½õzãéõ&ÐëMR¯×‘^¯z½5yãéõf[½ÞŒ ‡û"}ec±ûßú™ … F}jüEÔ›çÐø)éz„e³Rn¦gŸèa…›E²0&F (x/…ä(¹{ìŸyRN†1®*Jëå J@•: UêªÔ ¨RP¥ö J@•: UlUlªØœÔT©·…*õŒ#ìÑ¡Êú ΢~vœ6á4mšŠ$=Ü*‰ÓV9Ä7ã¶žQÝׇF2”tÇM÷>œ%[g{á2½£uËÌÆDQ.}ÃD2Èj*Ñ“aúªÃÜèƒPH}S£oÄyÞ^£ ÷= škmƒÚüÉdôMÇ3^“‰å.ì[æÜžƒ°×ŸÑ“L>Ávîõíq(̬ò 0³:…™µLmKB(ܽ%¼ZÄ´ …™• (̬ˆÚîÞ²^-Öo£††÷³š$ËVö!Ü´ ÛV¹È;½V6Ö2™i´÷¢©q)>Ӕ͑äúIÑç·=¦\÷VŠÐ@¤® ùj>VÓñeLʵiÂ…•»á9Ötç®d°¾¸W6¤)Ìš˜±6º—•"2.3àñÊG-¼J¡^…¨¥- QK÷–ðjÓ6jáU µð*D-mIˆZº·¬W‹õÛXµð17öf¶ŠÍfýe¾'³?ÓIsñÞwNÎy@†ïhç¤\%\CÅWv3{7å²)e<ïWH#êFmeÕ{tá.E5F)e%f‘“Š:‡.qW­ð½ÌfŠE8cyqH9„͓̈́›G›'66÷66O"l!lž@Ø|DØÜCØ|C„-VEØÑ¢²hQÙ¼¡±%'ç<ÛS' h å#ð‚dˆSڹ馆¬Â¬žüííÛ,&,êé`u¸^dÁe¡róEm‘©éÂ…‚wÊ:]4^ÒÊ-ˆ@¸ŠFòÞÊL¾€±ö:ÈÙ qQ,–Jë–;’#¬²2öØ÷„$Ç(’ËŠg¢ç½»¬¼$ø4gN™)µÓ@¤ô5©Rˆ4¡vДDHû–ðjÓ6F DŠ”"yÔ5ö-ëÕbý66Ð@Ô|)Èâmk'•DƒÍ\8!þïbŽ9šì–~ uÔ˜ì¢(L[Ù1D;%Áa–d­\ಕÄ~&¥yÁ^Ø-›â}d@à)<žLß(' #Í„(¶KBÛX£šatVº—z?B©iÁ\&™ X$Œ³P€5%‘kߘ«Æý´¾“ *‰˜l$CÐLS °þ-éW#ýfv`í-î~9qÌÌýóDl$ôH® Ï·å(çùbdtmï¯ù´`îUè/£ÆK"î7OøË¨6Ó±çË¢ú|ÈžÇK÷–™Öâ~Ɇß.€÷u›éØo£Ë‡ôD:W‹?Ž}ýeÔ-'Ú´¿’.aÈH ÖWÖÒïzÅÏpºIf®’ÍOg¶ Rî3ZŒ”@¹¼PÖ »ÏRˆ÷›ÄpÐüùS,0ºÂ¯˜ða—–˜ëS¦”ó¨BL fÃ.S°Ë°ìŠ Ïj0<{¨©}k€U®÷³ `—®S°K‡fô¶$‚]Ý[Ò¯FúÍì »Œó¬­3)éÀþ×Ðì%OIÔ…ñ$žƒ_¡8Á¸u~~ŸŒí«‹ee9Å5ŸòQàÍÂÃueœ«ˆäjZ0[>ÚÀçVÕ)Ÿ[ÙÀUûÜvo ò¯ö|n]37ùhS>·Ê†ý¶$’vô¹½U#ýfv•µó¹= ZšI i°À±Àä˜ižY”\;/®ì´àa5QWÖSuU'ÔDÝЖ¯ÂéÎHê+zÝ[fZ‹ûe=5QW&¡&êJ‡mT:RÛ2×S3Qomì©&j&ïREÙÓe}<Ê-gî|-¸èYÂS,sÈÊFã …pï2cß"œEptëUÍF·ÏÊ+˜»k¸}jžrûÔ‘éV‹Øí³{«ßjÇjÜÏÀíSó”Ûg3a3p.sB¹ˆBÉn_$¦nÙÀ”v0«s Ócâ{1k½Ì%ÌTK˜©R.a¦ ]ÂL»„uoõ 7Vã~.a¦J¹„™*t kKB†ìß’~5ÒofO†4•s Ë„xÀ I‰þU6jßB"4¬q¿šÌ&B8!žrB2‘îgxì„Ô½5÷œ\37"ä)'$ÃCM¶-‰ˆNH·j¤ßÌ®DÈåøà¹Â .¥W>ºþðzZ0›^% èµ'^#Ò ¤Gní[=ºjÜOÐkÿaH¯"T‡Û’ˆ^Å@Çj¤ßÌ®ô*Çüö[Ý‹™ïK³Äjº8ÙÏ|º•îÄ€K1-˜M·:ð:0:åu`"ÓèØë {k Kíy¸fnt«R^F… s[Ñ­½nÕH¿™]éVë­é–rźlN4µ’ŠÜ?çsŒv¶k®í´`6ǘàÚØÔ9´‰Icãsèî­#¬wíš¹qŒICªÅmIÄ1f<‡¾U#ýfvåëΡŸ?ã÷ås¥”˜¥f¶Ìæ]"â<©÷'H¶G ga)€±î|§ô`¶8®ƒHV¦NE²²‘ÁVq$«î­AÜÖ^$+×ÌMשHV¦ŽŒ"uɪKúÕH¿™=ű­îG²* `ðÉæ|‡½ S\ùŠFŸ+¡þ¥Oçl5º'ô"ÁÌ –î –¥ÜldÔ±> endobj 7397 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 125.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn27 >> endobj 7398 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 139.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn28 >> endobj 7399 0 obj << /Type /Annot /Subtype /Link /Rect [60 757.250000 165 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn29 >> endobj 7400 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 123.750000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn30 >> endobj 7401 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 144.750000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn31 >> endobj 7402 0 obj << /Type /Annot /Subtype /Link /Rect [60 735.500000 135 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn32 >> endobj 7403 0 obj << /Type /Annot /Subtype /Link /Rect [60 728.750000 110.250000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn33 >> endobj 7404 0 obj << /Type /Annot /Subtype /Link /Rect [60 721.250000 87.7500000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn34 >> endobj 7405 0 obj << /Type /Annot /Subtype /Link /Rect [87 714.500000 139.500000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn35 >> endobj 7406 0 obj << /Type /Annot /Subtype /Link /Rect [87 707 122.250000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn36 >> endobj 7407 0 obj << /Type /Annot /Subtype /Link /Rect [87 700.250000 137.250000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn37 >> endobj 7408 0 obj << /Type /Annot /Subtype /Link /Rect [87 692.750000 169.500000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn38 >> endobj 7409 0 obj << /Type /Annot /Subtype /Link /Rect [87 686 167.250000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn39 >> endobj 7410 0 obj << /Type /Annot /Subtype /Link /Rect [87 678.500000 129 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn40 >> endobj 7411 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 138.750000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn41 >> endobj 7412 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 129.750000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn42 >> endobj 7413 0 obj << /Type /Annot /Subtype /Link /Rect [60 657.500000 175.500000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn43 >> endobj 7414 0 obj << /Type /Annot /Subtype /Link /Rect [60 650 171.750000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn44 >> endobj 7415 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 123.750000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn45 >> endobj 7416 0 obj << /Type /Annot /Subtype /Link /Rect [60 635.750000 93 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn46 >> endobj 7417 0 obj << /Type /Annot /Subtype /Link /Rect [506.250000 294.500000 534.750000 301.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 7387 0 obj << /Type /Page /Parent 2 0 R /Contents 7418 0 R /Resources 7420 0 R /Annots 7421 0 R /MediaBox [0 0 595 842] >> endobj 7420 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 7421 0 obj [ 7396 0 R 7397 0 R 7398 0 R 7399 0 R 7400 0 R 7401 0 R 7402 0 R 7403 0 R 7404 0 R 7405 0 R 7406 0 R 7407 0 R 7408 0 R 7409 0 R 7410 0 R 7411 0 R 7412 0 R 7413 0 R 7414 0 R 7415 0 R 7416 0 R 7417 0 R ] endobj 7418 0 obj << /Length 7419 0 R /Filter /FlateDecode >> stream xœí]K¯ä¸uÞß_QkS#>DŠ@ Ÿ²0è²0²Úq cl¤ãEþ~TU·Dê£ÄS‡”êÞš†Ý]”Äçyóãá¯ÿòí?OÿýÓ¯Ÿ¾ýÏé‡ÿûÓ·—ælÛfüïtùóËmìÎþß'Ûµ§{ùyúùòÛËoýÿÿ|?øöéßúýßIžþµÿß_Oü¾ðOþ¥Ë {±Âöÿ>üí¬èÿÕ\ÿ¾”ÿååßÿpúû¥Æ©9ß™ùï_´²NŠK7Všþù2 S þñãï/¿Ž×JgÛNË“ÐJŸ„ëÿõ¿ÿõòçËØh•·•'}Š;<¾Lìpwé°jEßÀµ«, -õBÝwLCó: ÒOƒhÆ&äé¶AÙÈ·ÊshdëJÍaXw94Ò4§›M³Ã¡Ã¥Åá@7v]õóç¦ÆêNൢA-Û×Yô¿ˆyîŒÿþûRR]/×µè¦ùì´ÖhÛÜ£B¬¼4£u_…tÍ©µ¬ËÔ.JTîlÁÊ/=çž¡ŒHVι²mÛ\Ùkí%&ß4¦\åCÏK­,¬œsemk ®ìµö“ß U®ò¡ç¥VVι²®›¦GèôZ=å¶q™vè9û¬Lk‹kg\\«E;N”]ù¿V_bqÍÅÕ,UùÐsöYñ‹›¨sq›f¿+À¹7Õ¨¼³]Aʹôœ}V¦Åj'ú "ŽÕ=ø:]+.Ÿî‚/ç®ë'K[!ÆÒÁ\÷-M%?úš³NvÝõ-åfÕL?Çfú/¦‚áÃSPva3}É¥™Yg†·ô¼=oæ/½Ãs»súK@ëgâÃß_~ýÚ7gNßÿÜ?&|üë{?ƒ­9ý2ôž¾ÿéôOý>ÿóéû__Dß+mú'ËÃõqxâΪ_¯v\ºµ'ͧá‰>û7Oìð¤;w®éý½›'BÂ'bì›:+Ù yÓ·~Ótã“×JT~à *YmïË÷žð_×l‰šû©f¾óÔÜé¶`îÿ&ØÁ6;X±ÄV…tÚ—DìpyË“ûTÍô³ ØÁ¸%v0]ØL_±Ãð–žW£çÍìÊÖÔf ŸØ!Aã#yªi8›¨ŸÐ·l6°vbƒÖÝlfƒÎlàš%6p2¤Ï¾$bƒË[žÌ§jüOßÌ+tÝt6l¦/‰Ø`xKÏ«Ñófveƒ^—WfOÒÍÙX1k'A옿 OÚé“M$ û&ê[c`ZÄnXÿ‘Ø 4—™ÑÍ ~±‰²è`w¶®™4ÝôÛ œeÏ縞5Œ»n%ú’/¦óì%®oÙÛZ¦_ç›é·Ø*øº1a}É— '}ÙÔÓ±–ù8.¼ùñÕ™³·¬f@ûÖÖó™5m ìNÎÖF¡KÈgBÚ½NHÈ›XIFÖdB”a¡€YŸ`–¶£ 1E6pb–ð0¶W’X¸h2Vew,;©ÿc]ªwz—­½ÊÌ ¶ZWNÚ¹uÕËÒëÊ©&0{.%¡u5¼5ZO×j¦Ÿvn]9i¬+'Û°™¾$´®Æ·ô¼=ofOëÊ)µnY`ù Å‹ø‹ÛÙ£²ù Né«ß o 6S¶6ek»DÙQ˜Çù0ÏŒ0/oyʪ™~š€²u»DÙ: Z]J"ÊÞÒójô¼™])»•‘ØüˆM"ʃU*ä“ â'¹”0oèkM£mç²VMúÃS /¸ß)0íÜ)0fÉ)0]h°Q¥À¬¿¼eok™~µs§Àè%§À¨¨ ;}ÙÔS}ë\ÛØÕ)°bZá„À+ŽaG‚àH“¸ ; œ2žj³C‰OCñÇLß'4áX+¯‘òYÁýB¨Ós!ÔµKB¨³¡€bz¹¼eok™~é¹êÔ’êdÔ†Œ…P_6õTÝ ¡k» !w%1£y¡š±Ã‚$AžØícuÓ±3Î+ô¾7ÁÁõÉfFtÓ¬ôôè îeDÓ“Á-#ö¿ü}i¾JFß²·µL¿Ô-#ö¿ë}©ˆÚ!#eSOå+#Þ´±##ö½p«QÈ¼åøœÐêBз›¹¬m.kÍ—E3ág3&¹¼å¹hªfúÙ\Öê%.kÃ0à¥$â²á-=¯FϛٕËÌ=zÐs2ïuOb*sE×xëÏð kŒ°3tMÿ{]Ó—èš¡$ÜÔÞ²·µL¿fèšþ÷º¦/•Qºf(›zzƒ®¹icÏM}Ñ­G˜Ôã¤Ä‚°F‡ûÎ häèó 9=ÚÒkZ9!xcóµŽÁ¼˜*V\'sä×íq üóF±>‚cD7m²+§n î—ênÕn ª%\Õ.†j oÙÛZ¦_s¨VÿÅ’Tw!TëRIu7Aµ¦ZæãØYª» ª%¿@"ÄRp’1áUT’÷ IƒãŸ`³uÈ‘¤âéâ8Šã%ûÕÜÝ$ç<)yßÂi Í&Ö4Ë’ê6KEÈf«¨NÝlõ¦¥ð“R,á'e•"ÆOoÞòµšég€Ÿ”b ?)E]¾”„Þôø–žW£çÍìéM_€Õ«ÞôólhÚ¥•â QlõmÁÝÆTbfüH%Œ©t`˜È!|:7_†·ìm-Ó/13~¤jŒ)]؆t‘ñs)›zÚÜ?¯mìiüHÅŠZTпÃÕÇ6Åå$lc0V& ^ª+"ÀªÛ‚­Ä¾º°M¼°XXÝŒ ëä|µì¶„¨ø ãI>dƾ=Ž–,k[1Y=Ð8¢ ¤ ¼ÐPr]$rÞpö`A˜‘Ž)ÖJ¤”1K‘â]ÓX÷Øvw*`Ö˜¯6~’š{H)J?Š#¼øà7&%BF êóx‘  ÍÆîÛ9ì„W?aE%llà6–TÞ[xÕ”i„­—„´¤,ÄváQz¿ã3œ È[Š5I«6Žªe½%Œ‡BC”ÍÀœ˜ÌÚöS^Bœ‚‚†¢ $Þï‚í¶;qUûP¦&ƒ5‰[Pç^®aÙê“ñ¨¤ù’'ŠikªÓkv'RWŸ–¥lDR ˜@(g h ’øëb%„˜Ü–zq—KŒRÅN§NÅÞº€¨t$Ä 'žÌÙ ¢H ,}ãà7^Á˜×’O^Ò¡ðæBýž—êWè‰_V)Ð-Kµ$'ôý–úÇ“è©+­{|8PË ÞAø>/Îæ‘°qG†9Rô}ÂÁ P:°œ¯­…ü*‘ÌžA }…,J#¥M Žä$OG™wuá‰ÞÒ7_KËSÕµÁŠDlÊ.ƒnleXú†Í*‚ ¯ I¬BPÕ„Z6!ΜwS©@|Ö3òHH-W@La|bàL¯ò{P‹cp©Äóö>ù Ÿ(B¯ñ*Ø•õ)o ·ÒÍ>ëèõ¡á#2ªuùvÖ£tɔ͉µcî› A‚ئØç \ö*XJÖ½äÛœ ,ѱÜn¡¤m5×  )ªÚPœQ’øïnÔ´:Úîz[г:î Ñ§Ýó>죦ãÇÁ’¶Kܱ[*}u¤ܜ¸¯Ò6¤¤ÇdF…f`ü î5²¸8PM¬âư.›éOR¬BŠY3*‹Û½ºËä[´Íˆe.ó ‘.¥Y¯üÍqŽ)N+‰PŽfó"µ*]-œ±ê¤+ Y ðXt WÖ²<·»Ë'?x£¡¸ÇÜà_E—„@ÚPgóâP(^)WWHX á~d)òÈ…c;Ž6:D¹„uU^I-çØD8ç*„—Ô Õ\$FU!žÙ^]ÿJw!ó&Eé2 Μh©Ktœà“&2‹Ú¡(×j~Ë¡Åý³hÊD,n)™aJÊ¥Þœ¨~á÷¥Çmi㮲ͣǛsˆ+ŸPýñ/sÚ³ŒíX¿qèOÙBOöýë81Ý ¤„\´ï–ž(Øëæ*ŠÂ+Sá<ÜÏAKµÁ‘&ÚÆžب_ø÷ ÷2Òé$Å“/„Úàì$fÔhÇ@ºÆ}«µkÕt‡câNÙSd(%ÄH9.öôö3uFE¹RŽóñSÙ:é Íwö§|ÊÚÖ md`^©=\îFÕ°‚»`(Á5<¤E[©Â±aÉGX æ–ùª•J#J“Ýg•qX¥rdœCL„±YwØïI~|hÈoÄ›5ÅyµÊ%2–q7!ÁMQlZebn]0EK:ó#z’€˜cÐl'¡aúƒËp;¸o°ç€täŽT@+$¼ö«˜/ßé)y¾±„Ä·„»?H×|Wr[™‘s‘¾%xA”¡—N/Þ6M²+ cg _L½}‹¥Îp·mݧ÷Â華‰¹Šå+©™¬ TÓCˆBDˆr¹|⦠ެã…GqŒ¶'i?4ˆÀ˜¤Ô׬ <á^1k–”®G„åe€K 3ÃÍYñ H,\ÁÄ7GʸîL¤O ÷¾ÇX1V¯0ƒ(£)$)KL¿ˆ]=ÚÁwŸÏy×¹ðaâé4ñ+g¼]&q¹{0E–b"á½X”Cí×¢èÂßÌ7†€Èv…Ø¢iï˜Ê÷¨†étM˜©yGLçgø FÒu“¢#Ô7ßøŒª X>Ö6Ó¼¿ŽT¢o(¸¼j8PˆgL|‘Ž~ob Mû–èœk<;žýò°½°L ´çgøÍ ³¼ uzÊE.PltŠ_…Ý,C)²š’¬‡õ(3 H/‰lüø(%Æ<0©ø ¤KUé–£÷CË|åZnﺥóIËOZ¾<ÁúìÀwœè ÒÎ3@²oï"Àykﺟpwy› XA $ÌgXÖàu|cR5aíb*cspdÍBY…g½›5MÌ(–.¹dt:o…¼ëMJdm;J1µZøÂ±‡ šV‹ÊáβóªvS KB» CÂe¤ K,6es…²‚1ìx¿“pˆ“—¬)#e†`¾±yÛó>®Vˆ@yû| è¡í¹ îàüãþ œÝG-˜3±â¸ð™™€)ûÇÃ8`êÂÂáYJôõ•Äþ;ng¯$ixƒ’´””c4µ þo5sW-õ2ë¹fC›žÛ§dº§BG±,°ŽâPåØË”|¡”C9µàÆlž ÊǼ4¢£XOÍúÊmŽ CIBJÖ’%V£ðe>r§í\Ê.%á&ÞØ8ø ·»ÞŽ9r`‡_ñưTPIËF4ñ^Rà߈ª‡LÉ›œ‘ͽPŒjãI§)|ë*R"<ðó4Éó bF*ŠVÊ öJ3UëzН¤>£yKXŒxÞXÚî{h»Êy¬ãR¼ÇêuÞë+m$zÍ1yGáýí©À+ßÂ^4K€¡ö}¤mŠOâÜK—•â¬û;eC‚'!5Çõq%¹(î½\õ–ŌǒM¼+²ŽñGA‰ý÷äq;çIÛ¹ÜçNÄs7LÁ0ÝùRc?)ª·%¿¿|KÈÆBBõÒ‡­Ñ¢;ìà àEc×Þs¤Â*i’d ŒWC QÌÞ¹fË—½B®²‘«b¨È¡´×rd˜'k$dÿD£”pf5Š"áX¯¨|Ð-ZŠ©7þq|PÛ‘‘6ZvÃOò*ÅìDÞ%£æ UÞSâZâYÃ=æÖî“z÷ÜÞØ=Ôpd†* WÖlUåt¨bàxhÑX¹0¡Î][¡v⎧7ñ–uû~—ÅE"”›)ÛµµâÏ[²¦kç+Äø¤\%ÊÌUQ©¦ Æðõa.£ƒÙ¥¨ç”zªçwäz—>ؘa d(G¼—KPÌw0yt1ÌA1MÕ6¡ªR8KV;„ìi‰ìv;:­Ï·)—¢mºÐ\8àÑlÙ²\[Ä{mÖã1¢éBFL¤üzŒh[³ÙÊ{¬üS• Ì»¥»cBkÝÆnåõ¢ÜÆ{¸…Û²Œ"öžÄÍY ¼;<ñ ëÝá¼7¸+ ÇC¿¾|ÐC5b¾v‘õò³„Ì¡ÜlŒu5Á¥ÝÍy^3ž7]P×Å»–¼‘ ¬`"‹àÍøx6Á#9À•õ»‡±p˜1¾r Ä\Rgu*PZÌ·qÔ I SëaÂýóüì/ÙžB‡´YÝxO°½± 5ó¹£ä;ÈS¤ÌŠ««œd)22«UÍd[K%3¶m Hß¼BJxÇn)Q7¯cJi'cÄ”8`ä$Ý‘S¸pvvŠä½®”ä|K’»KIUy¼”Å«þC…œ\§¸jd~e|`QðP¸Î±$Ã&5EùR66YóŽÌÉ Õ@FB*±¦%íéeØ7¼ÛrIOüfnVÆ¿DøK„Œ8;$CCä3â˜Î±(Ù_/ïvö“`ú0;7Û‰w5QPW¥B›„5>…±]‘a̳¬ÌapAY³Ä%!LÀ—/`ñŸ/¦P^ÁŒkÂ*s ç­Ýû@G^g±RÁªì½‚,~JÀºš:RÄR4UÓ[Y&¸ –{v»¾‹²eZ À›2šø;ÇÌ¡ˆIŠƒ_bÕ+„Ú”[çé7;]›«'«tÌ,ã Å‘¥$ØãÕQ,Òþ«|¬vÙp­ ¬ð¶„rgÝ£8C‰èàÝéâĬQv†6Åðj`C # Áq7'éF[Š*<äîL+m  I|_ù,,¯ Äz€â°œð»#¼\øÐÜ„œ¹Ò‹†éV¯[:æài|8§`€O—ÈáD x<°6{ Šçõ°]hçîÔ;ârÞK“kA#±`U[$Q‹“Øíʽ 0âZ[OØþ¡/FÚ œddž¹&\ZÁ|Ÿr¥lš‡AV”µÿ„t¡Ãpǽ²yy®àÀ‰¬Y®´Ê'Ç*leU¹˜Y¹ëpŠ2¼¨¶t® Í +NdÑÃj¹,¦»ZÅŒý¥(XE9Z†59+V=Ç{9ò«ç1á½õ¨2‘ð©«FKn¯ùlΛk ‹¾°®ôwV–%ÈEêþéªÒ\Õ²@ŠBqõ²Y^2¤KFñ¾oF»íçä)gŽ-ÊEZl’„àó‰µî¦õ<~âÊ¥'pÃârF×Yáά¯0Ôl‰ ÖÚ(+ŒÇ£Ø²h¯ÏoÛ´÷PÞºÂvÜÁ:£­„§ô^[?vÛðHIüŒ©œ°G˜Ðϸ×Ì Ù‚å«f¹åçþÏégϸI¾þmí… Îo·xHª÷ q bœ®˜E¿ µäaŽcµ Æì¸ò,‡à1˜ø‰ÇÆÈ³‰n¢ÐöÿŒÚQkÑ祾}õ#Eq…Ò¯]j`g§k¦£z&À!Mì}, CàÚà7Þ/YC¿¹°†Jp—7×;Á$œ;Ùæ“€Àž$© ±Aä‰WÏ ¥Y…ó ¼FJ´€ÇƒÛÁµu÷Ó‚mÔÙË‘Q@î—xâo|çUaùÛé·—ÿá(c endstream endobj 7419 0 obj 7101 endobj 7423 0 obj [452 /XYZ 38.2500000 701.750000 0] endobj 7424 0 obj [452 /XYZ 38.2500000 190.250000 0] endobj 7425 0 obj [452 /XYZ 38.2500000 701.750000 0] endobj 7426 0 obj [452 /XYZ 38.2500000 190.250000 0] endobj 7422 0 obj << /Type /Page /Parent 2 0 R /Contents 7427 0 R /Resources 7429 0 R /Annots 7430 0 R /MediaBox [0 0 595 842] >> endobj 7429 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7430 0 obj [ ] endobj 7427 0 obj << /Length 7428 0 R /Filter /FlateDecode >> stream xœí]Ɏ丽×WäÙÀ䈤VÀ0Ы 4¦ ŒñÃ6ÜöÁ¿ïÌJ)«šÊG‰/#H*KÓ˜©žV‹âŒ=^üøëŸþxøë?~øé߇ŸÇŸ~zªŽ]S]þ9œýðúlèúæðó?Ÿ¾¾=}yúrúï·§Ë ?}øíéwÿ;ØÃoNÿþýðû?œþðOã_:ÿ…>u¦;ýüÇóÏ¡3§ßUןç?ÿÛÓï~qø×yÄésãd¾ÿÿj×÷ƒ=OcáÓßž¦ešç_ÿýù_O?^6 î+}×u}}0µ;ýg¨íá?~úËéÓðÕq¨éÚº«îùPgÏ_j‡æ`ìpéôIÿCÏ¿„†W¼ïz½ÁŸg.¾+Ƶ&<ºàáöUïÆ rN~‹^ ¯0¸5z”s™¹ø®Œ‡]òpmÛ]6èDJ Û?®±ýç}Ò#œóÌ¥7e:Z8¸äÉÖ½æÉ^Gרü¦W<Ùç™k,\òd»‰ð»Va:Íkuº´zƒ?Ï\zS¦“…ƒKžìéÿÆí1 zÔ«áåªÊ*ÒÍyæâ»2-]ðp‡j¨õòËègkz=ù2s%†Œ—}=±YmÙ›®ž–ŒCâ;³ß@nnpÞ æä3€\•áÂsÃ2Tô;˜?1+MÊ…\[ ßHÅ…ð}Æ£aJ²P³’½ng¤èeÄRWÏÄ2˜+#¿(f¦:¶é»æÕd.l§?öCõ<ӗͭГ‘]×ÇÚ]’üC4æØÔí÷ß¹0K7=˜)%QOð ªÎÚÆ? ,jª>{í²ýŠc5ö¸'p‹ñ>̬x¼8q§±øà.³7îèlols߇„ÉÚáësÑ5šijÕŠõàwð +õ7RölËÀwƒá)Ìv1Çr¶‘³L‘2l{i¥Š’¯©jOô¹I×ëÚÆ›óÙ #oñ>ÛÃ`€oÁŒn‰‹xS Á—GÏZÔÜð©Žoäz~‰ˆ¹bŒ¨ÅsÄŠÏz:(øRKHòùDP(£ì²þ.]sFSk…·:zÒº6ö`OxPN løŽ)‡]êØ•*æ@bÖœb<Ó-piݳ3'b8<ì!ëgýín†ØíŽ»oPx¤Pæ‚Ç:ôw³°ÓgtÓD¹«w:˜Gg¤&ù˜ÞglŒNU½#”SYÅYDC÷ÀjxŽE k#„£ ©†šÔb o™àØ…ZŒý¼¤ë1ÌíC,'Ö­PÓ!á¶Sù{“}sv«ðÄ„€WŒŽÆ°m€¿K‚#¼íw8Z¢œ@”‡ }Æ^Ä”B¸ægKpædnþDn$æXð• ì(A΋>(U>ÝyŒzã ŸÌ;J3­¿ ãH²þÃT¡…¹vÅDCñé‹á÷ PL.‚ ¸âðžCfE±Æëž=ž-+¯×'{غûoãÇ»ƒÃä ïgX"¯÷* Ǿ«}+&UÄŸ9_†ab7=yLŒYvn¥N¾_0_Ûæûë{‹!NÎí¹‘uY€©ÖÜ PÞzòyéÜøÎ(bnlT]k_co§?š,Ó¢bOë]`–&nÆÓ#£µ=†9O±'8뀨ÇÁkb¥"¹ex2ÃV|ÀžY“xxƧ²žš>mFlE0}#¾ëo‹«¨`>fÂsÇ51ˆa¼Cð;Œ;4À3ðÜfd´Þd8„l6ÐÊ‹K–Í åÓ"d~ e‰ÙƒgX®,ªTNp‘œ,jø‚ÓPE²iw÷œ°ÔøVÇà <Êþf¼1i€iÝS·®& æb2WV”h)©Â¬‡! F3!¾ Fg!Ô€™+«dŽ…ÏQI2Lm‹H`rô»$È|ékM.¬¸€¶ó°ß”8=›/x´ìº.fâ1^¥ÒtP¡:‡5EÑðx€b$J&e«ö(•‰ È2nFGÁ~†aÕi¹c²ak"µ"ÞÐ,Ú쬯+D¤©ˆæhSL—I”YÏNÆàeÜ•åë9n]s"‡90áºX†Õ­p2Ñ-L ˜¨dkè e“ù½3"9w Qácaò#1²)puÅaã[q¢ºÄ铺•„½/kEz–u„3Y‚aÖ ä’)\í·íù¼û“Ÿ>y‘d¦:^ò§^-ºEOF’mŽv–tõ.þ g@'%·óRÅFxÕ£WýÖ¬««<Ü÷uøÏmòüÝXÏ{8ÚGôd„WíŽnF`pS"];Q劘OÄÜZ8õ"è‹C±?-o" \ÖU^X2[©Aɉ÷TçzÓ0`Îë¢i‡¸)Q’u“º0Î:90ð°9kô]kýàóŸyy‰,&ÙˆA€cdG­ÈO‘Æ8x¤pŒ31ôõJ5Ÿ$6µÀ4ð·Sú%›ŸYtÅôzC³þ”@l]@ûs»qêüôö`‹W숛Ú³#²?n`·9€ØAÃÖCìÞkŒk„Wº„ƒ–†’šúJ2½nn¶gP§¼u›ö Î4é|ûýÙé{l=uùpW·Ò¬f —bž ""àf Š(|&Ã5"i kpë“ë²eeƒÔá'‚Öv¹HÔ®ˆD3 €•Ƭ‹±r˜XѲ” ½«®WfW_wõõJ:õ–ÔJ +Œé…脱q¼‹„ÊPº‰ÎvýcÃ೸3¦K<ëÀ™°´S€³.ù>ãÞ”N—ø¦/™rix€›z³.J}É W1W‹…¢ åT¬z%Iš,ÖùbÊ»#(& 4W¯¼'”Æ_rnÖÞõó* åM¢²J%<+y:Oî0ðEµ…lY KÔW#u žHì^溗QEýF¥1QÅíkv~Y6¿,9ó-‚˧jøÉ4—¢ ë"4¬ìE¤e–¦½õ…"F¸ãXͱòÓ|1å˜4l§G k 6ý±ƒol=Ã}£ïÊ’7Bµjchýg>Ò… ‰·1‰„Ÿ‘QÅ$‹É&J¢iÚÉúã™—èg—Ðù“˜Þ"è‹Épú®¼ÚLÌ„Q®çä”Q öµ·¢˜V–¢½¢wå6¸;ÙM™T5ó»S(ÊŽÜ]7%ù<¨ŽÛ8_Nä æÌ¦Q’À£]:f½–¹‰£,Eû«ö@ç},–ÁÀ{0zB~ÉW[óŽhopA‡d®dmÕ}…äw”@iV9·µo[ê*Å2‘h¢¿œlÙHà‚ʦäçµi«Þ-ݵ̢§DzÙr*)åo>QÓ–\L <‰/y_˜æ ·]`£˜›Š-éTÕîL HFinêÞ;ß]SÞ5å7¤)§wòÔ‰çˆ2n)Ñk£Ž‚t,‘Æ,‹òóh¼RÒa¨Y]mj_Zn2­SÛÉÔH¦JÙo¯)û;5Qvµp–™€ï5VzEªö˜´aÝî?³9Îä?> Æ©¸|"±¤™»l5œ©~˜Å`R,Ú^oÁ»ÄxëI•"¦ÆN?Êlk_„d«Ì”…Í;¾m bð˜ÂÅkÙ³šŒ\"W¥ÄD¿ˆªåˆ”M&ÓK4ñ‚á%±s½‘lK’¨«îzOHn<Í6µ¦Ô¥l¡¯>s œ>“µ¹Éì¶c%üÓ”ÆatŠ–~'FÀIà(ëÛÝ‘Áôðvt‚À®í}''“[Â8ǘ~e8ÏaÜíØðJE}_L2µÒ™CU–ÌÖ;êjGì_âB &)œB 帲¸nÌUÓ¶Ö&ÑTƒ/lóWŒP NQÑ]€ëQ6Ë­<Å?¿6ÁdÏC¶\‡×ÜôÝ”]ÕÜ£B=”S8£ëaÛº‡vç£BEtÎÊ6ƒw½Í~1òDÃÈhŒ±p4unãlëíÚt¯ßü@ƒ²¾Í£»˜ƒî†êFmÆOÖØ[¡Qã{_ä†q'Ädç0IÌ ]ÇÁâd}ÐæäO,¸ åtˆHŸÉUË%܇.Q3Ên(¥O‹fmƒñåÛC„B÷C¦~]9@°aE7ÔßïL8541d3~‡æaŠÜÀ'Z}É •j3ðh€ð¨ýÁöÀ`JÄû†ßÁëÁ³=|³j|³`£ƒÀîxrJ„3À÷Ñ0ð<>‚v€ýxG1`ª‚{íàùf½¾Ç•ñJ 'dà´Y‚ÏS/ñÏ­±é$Ey ðèìO§õfdNÞVU ^³¾ºbà°}1(Aº«÷wä¶¡›¥áŸÜC%“j¹c6…VKÁHåªùÚ µ®Dî\CMùcZŸÝ2Mbqr3L’6·PJÊ`œH°ö± Ü#S‚y„pÍTÁEçÚ©FøB‰h²ØÁº‰KÙB˜%ôRzÞ;!Mî­¢wûû.JºööVÑéèo½ñ»·£L«hY¶¨º€æÎø–à{Š›.3³fø Òuànãõ ¡KŽxbRð;©¢Uùy|%Ö6z…¶Ð^÷ªŠ?-ªQ9Ö=ð.â³Ï~ZwÀ÷ ¯óh¼â>S^b¥cü; •wÃÖÕž¨Gö†ÊM©a{‹yµ_Æ-L`_ xˆT¶ 3Ÿ¿6hîÉcJQˆØÉ< Z^*;u³%*R…°‰IÌ2˜Z‘GJÝhLãɼ5Þ5‘¶*ëïácÑÀ#Œn’*–¶'UØÁ,.aF´ˆ™!² føª†5|Ëb©˜ |À^Ø¿ŸI?Ñšû@:\ØÿX{ù°¯•QÔ:d¦ëfì1øD„õ—/, ŒDa%È >eÅ^¶~;§Ñü7â®ðY­º–ÅäLkêï7>.Õz\¡Qi£™–n:§ô ­ñ¾)ËE’Ø®¦±["1&D”ámümï“ÿ޳«VØfânF’¬Ašè;n~‘!ŒM“¤)"²×I­h5»mJ¢ 'Ãþ)ಈ~ubr×¥?RTÇ‚+ ,ØÑÏV1Žìèg‰±ÀTk¥ÛÖ›"DÈD(}–ñ 1N*Š/Ú{ñ1'†0•å²iLëəɑíG™@² ¹U1CË•\Êòë®Y~›ÖǨN÷oáo0vêÖ½#üUgæŽðWíç';ÂߎðGÒÎŽð\éŽð—áo0u»8ŸüOði5˜ÆJµ–ÖÁ8 QÏ Küs̹ð­%ªêvYä»,(Z$å·m³8ŸüOvDժЊÑ#cí•àÇ"‚yóÔ€óŒ |`¿!QJ¦ÜªL¹5Ò¶½`1%¥  *w;¬ïVa³·Æ 0¢ œÀ <5ÖXáÄï`ֈוa<ƒ‹ßJ›iºÁyçK•“c>7ãLL&4¡_†e,ÝvM¹6ø‚m¶©²uYx4Ù\½ü]3Ño Ó2{ÅV‰MZ‰˜mDQQþækùr‚ö2ׂÊ\©Ri¾o„fMä^üµ^!¢[3)'í‚N% ‹â©ò„EM¨Y§*ýdö2“/¾ž¹ä¯@ºˆjøÁ—…ÙõTí0f“x4Ñú ÙJ|í¸á%,[IV Rg»Þë^`pºäz”qχÃÔc:›ªWIàn­­„½&‚ÄÇ&,è±ÃÔ¸›)èaš‘8¢MÉî Nî ¾•„‡“6÷´Þ=­÷…n,­Ï:°R<·¥C}?¥«§.Ɔ ƒø/°Z «]g¬ÛN‚rÕŠÀʈº™äˆâ€A5ô߀zçœóXÓ€“ihCÇ´ÔÒ‡.0>ÓLfµ¶A xP¸S­OSÂ+`G²Ø*<ÚÞXŒ¯\„o¥Bû‰Àt–MwÍŸ'ŠsL ‹‘é@E•ñ¬'ÞL îSQ(À(Â=ɤ¡>€Q5ä:›wšÚ—÷DÚ–eÒ/dÆ#8*SKÂ$f0êñì2G$ ̶@¤Q…¨!¢l 2ÉúÂILIÑDxa…IßO´a•E6ÉGTǤz™ÎÑ({?J‰™þ`†›¥¢—Œ×O­ƒÍÅþ6Õñâ‰{uª-z2îvs´¾ûn„ô‹zg”Y·Þàwú‰F.Eã¯Þyå<^Sºñ™v:¢—XôÎH#·fÐÂ'­g¤ìö茽I‹7FÃëùò­•Â} ŒÖ¡¹1§`»é;³Ö€ðI`ÖF±×x4¼£f€ïˆžÜø}_|}ELÃZ·Duväî’m<ÚbI×­'ðÜäžtãK+ž¼Axñõ*6•þ'â'bÚi<˜[R$Ž*¶’Õeë噂ÕÅöˆhC5…Kç<é²Í6DT‰¯™TÈHÚ d0‘\QahQˆ(ŠŠÝE´6A¤X0àÉa¸S)‹Å¡¶•˜5òh.1¢OpÆúÒ¡6¾1&¼ÂÜ*W¸“ñéÅÕ 7²eò© ºòšEÊVÊt$g¸¾¨EåpÀÑF/ÚªÃ'U:\ö½¢›‰õî^r¾€¨k€ˆ(.`çyYÀ¦ÚRW&"Ë™.\Ë–‹x-Ñxo&Ö2Ƶìq&eu/ŒÑòdä¹yŒÄŒˆ2]Îvùâz´œ6ËzœDƲxµ™ YÄ09g!®7½(õ2¢¾¤d0®ŒŠOSמXKÆ·¤aÌʽ_© NYÞ¸k#O¦Ï#.Ä%·K%@B}IpISƒK¢e;£ˆ–›¾¡n*b);+è¿q÷Ð?¤ØT4†Kí0X?p‰nàÛ¡å@¿[¼£uBúïìNÿ;ýßIÿ%w¿½ãJÑ(§bq 5Ö¹ðŽ2Ðpí…M ÌèÊÉhVx¯=¼Û„> endobj 7446 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7447 0 obj [ ] endobj 7444 0 obj << /Length 7445 0 R /Filter /FlateDecode >> stream xœí]M丑½×¯È³ÉI}†þ\` 4¦=,ö`Œí5Œc{}ðß·2SÊ*‘zLñU””ò`·»K%’"ƒñù"âçûå§ÿùÇéçO¿üßé×áÏO¿¼ç¦*nÿ;]þûéít{þ~jÚêôëo/?N?^¾½|ëÿÿ—Û ¿|úþoÿ<éÓ¿÷ÿ÷·ÓýwÿÃ? ¿tù…ß^ÕôþïõÏ®QýߊûŸ—Ÿÿõå?wúûeÄqºa1ÓÿTš®­Íe¦þñ2~¦ºþ÷_ÿþòómÂfi›®ÑõI•¦<©®Ô§ÿÿóË_ú Æá‹sW*ÕÔeS¼g¢F_fªÛ~&Ýõ#©Ú™èúŸÐðo oðëÊÅwE™ZùG—<Ü®7¨r©èý[ô:¼øàýÑïp¯+ß•ñpñèr‡ÛUinT5¶ÿ>zŒ³­º.âà—•KoÊíh=ƒKžlcTÄ“½c󛶉8øeå±N~nëáðïäÔíeÞNõUªö•[(S§nŒüѼ>ÂàeÝV.¾+UyF—<ܪn][w¶è>|„ý×e]Å;ÜëÊÅwe<\gôo!£à¥Ü~ ž?~ùùkÏLúͬOßÿÒ/î:çíïý¦T§Ÿ.ÖEÙÿëO§ß…ùú‡Ó÷¿½tçZWãoOT‰ž˜áOðhúzR~†O 8N³6Ý…¦j8|§øŸÀÝ) |‚O®­hÂ÷ÏðäË÷þªD§òª;¨ü òEkSp |3ð;ø{ðªcÜ3!:ÀôVTp´ð–ØQ8>í®ï¨çäð~|Èp-”‘ÌÄ­©3Íoß2,x뢰jKRQF‘ð=sC—û`=ú –£q‘eÂÎgŒ¡èÈSì¦cDqû<Ö‚J5>@–Aˆ–€á%>‡Ñ\}›Cyœ‹ËÍNYpœˆ¡í!|FæüÛ¡yðI2éÄmz%ƒ[w¥WãÝL´4¶*›¸/lY'TˆpuѤÄ…v†p†å@lÙCa󘈫ç÷Ûí%#ŠÚ`²— Ü"‰Ž™æ#õ9¦Xk%×bK"l'c…“8æç¡exmËý4²©&žÑ$^À­ @1bZ–o&âZ²é¿ž/%üì4¦ÀÅLdj }(e¦B„áù Ì»œK"ûŶDa\Ä ´Ò4%O>U u$ÞX‚¸ª®ØÄ–쪧y{¡‘sNDo,ãKXA±ƨŽ›Œn0_&RMá-ºæK8Ü)¬#ô³½FžÀáV+´ köñ{ô4̉$rû%Í·˜Ò©ªo²:)X6˜ÎнrX´¦ª ðÄŽ‰|•BdCW›BšŠ^Jw8ðJQðJÅZ]6¶XÛ©Óz›H(Fq.q€š)ß(’ŠÌxôD«Z•bÙ•:´꘲’ ºÒïð΄̓«aãÚÚ¸?Ň„û{¯ˆê©]¾É'²uâ='¬Ã) ÷&©à÷à'LõtfðªK\­ïîx¿¿#[©fðiãóïhØgÁC×kîÄܬTó7ø¸Áä 6°«†ÆOàh%¼õžÑð¸£%¦føÄ$ëEØë+•^†±j}wˆItÏ0GÉ/)7*Á6y¦kæ%æi{äzxZÛ|’JKZó=;xçþÎtÕ¼Ò~²aÞÙ­‡Û óÎßtý-j1{ºãÞÇxGWlÉ>”8hGšvÖ,ò?I)TÑëù*5«‹×OY8s» s½†$àNìÎicòFdKieëÚˆ?ÝAψ¶uŠ’í&D) }ÐZþT¶¸#QòÐØHäs„TÚ“-ž*T¤‡ÒÎKQ½#W_eQ”Ju–Ld@†²âL¸¥±D2]ª›iy›Œ'-OÑ‘ÍubÒm¨Ì)¼)¢’ÏdÕßd’‘Ž ÛJ4ÛWrÕûr†©nhâÅ> c‰Øh[+l'šÜ°©îsT½1È‹dÒTábfëaÉêvQWaK”âÙ®¸ÅQeÓËßa%%p¶æñ§åê{K•T!D•–1cImžlÁÑ®y"U÷bU߇,Ì„˜„¨\:ÊÂ(âD¦\dÃÖ“‚.’›™ß“OügyÜz²es(÷ã‹ï•íZKš…×aZáH4v¤tùH4ؑͥ vˆ¶‡£ê´3.ø\Žvï"³K²ÞE¬.Š˜R+”Ý™¨¾!Âü.{ÿoÙˆ?Uà«7Œu˨¡Ëa ìDUØVþQAÕGs›jõ-»Å²,Ôs­E™kH‰ØGuÀâ;ÛtqO‚$ú4 £-¡¡Qµˆ?"ÞäÑWTVpCú™›$Ü?‰)(%Ñ„em ‚yaÄ‹ªëÚ¾©ŒrûØÕ@øeUÙTà‘#êæeEG=±%Â$WgEÙRŠÂضÊMU\¶­åÓñ®ˆ’µ©lɺFXNö‹€y 0o"9@i{SÇŠ§iZûŒbS¸saÂ›È Ãl·x`) 7öìŸh†&õ:ÂbºKµVË­?Y›hh#$…•,&OP´•(mÁó0–Õ£hKŸ¡‹ÿ<±{Œâ=–U,’X%›9¶¼ÏŒ08OV¯MêÉÙ½ÔÔ•ÅØ"wFX5«,,F¶'Ar.ÖEDág`EX§Ëå éÃ4©b(&À¶’mú$k0%ªÁZ<§Îˆvü¥ëC¯2ë­ei´C–Æ« £ÖÉdˆDýw†í‘ËÈt÷bXP" crQÎø=ÙrïWxb<ìü?vfx¼³ðœ’9 #‡–ED6.Ü1ÇD:(GÔÞKb¹ ‰åY€”¢&âO‡@}£%¥Ç—^'n ňE¦Ú“êæA²79×Þ§¼iêª8߀Èî¸O*ªÎÚF/˜È w<ótpžvÜÂæÍ;¯‘¶Î43ÔªêñÀ_W Ñ;ƒ~7·‚>Áïh Ÿxöà¶£õÙ\ïÞ¢=P7BnÎÆ¡y8ç|ð“ ­MUÄ^+ø¥xÕøLñÉiô=x§iTu‰T`£Ú‡Œ‚ÎŒj•Jºo«hírÙê9§D¹ÂÍ­‚–BO0ŒªÉ`aˆpÖîË’\Ÿ²„4¤F†í@b‰lbatA°û%ÈÇË,ÉÉX¡–ÄŽCÐß=´lb`I1ec§,áèrT¦ð–ãƒÄg'kL0Y¯«H)bIšÀbyK¬@6†Š¨2™ªXQ öÍÃ|‰|á²ÍG¦ßñ™ ÓHe¥‹Z0¹Q©å[×”–|£Ün9Ùv ºÖa\<£q±—psö”ßdÅ#×:~´) 3eÄsÉð5IôXEŒ]»âÖ¹ H…%ßÊnîø™Æ²uB '`xªqÌzÑMm«8;­Ñ%œdÄ ¯6}ñ¦|AOÖlúÊZÛt äëhµÏž0B¸ÕdîÅ,€lùøÎÊ®²…Èá›ùŒTe.L3–\ñ”5e„ÓÖ„1±¢Yn~mS|ˆ€1.‘¢¹2ñ¿å!†ˆó7K8ê.HkðÂDæ–\oˆôÉ*e GÆs¾jÙqÄ$ uìp_fu_ÊzÐd£”›jWI!,°VÁ¸< º¬ý×Å"Kßïð‰Å´åÇpæ]LF.nP_s5…n²iR•í ËÔ‘c6òÐUÃpG†á¼Êî^ˆ7F뜈PûÖlÆ…lä“+©’ZE£FÂ.w‰"ÊkÖ¨„Kà¥1ð5M¥í…(ÇG¶Ìž’+[&'ºÈ÷ÙÕU*osyí=¦.Rå2;ò鈛¬0n²›HÅn¥ÐÄã›Z¥®7©È'J[ 'èGÛrG„;:¶´çd˜ЉBkGDýÒdÄ/›É¼ z¼XÏ<˜Û°ãö ‘åg¶F)[í%Y™9‰à_6ƒ Ÿ~ oÌ‚-­±åÜúš”$«HIdì®Q|®¹ Dä´5"‚HiXÖc¤t@‹Ü/R÷^•ªW¿¹•]¾ÔðŸ,°;ßCîçÎ=éà“èÉÀ=gž ›77š†ïà|]Oà; îÛ  í¨†«Æßc*8^|‚çÁ_ŠW=°Î¹'Ÿ‰SÀ§©·yp ñ›µQÓ ³ËlyLTÙÕ˜4X^ˆEÁ<òBÚ¢Xƒ/¾ÚÑUZm”µÎrÔëoÞ"s›Í ²;.)Ý–°BóWDÙ¢³-¦ÁBø¥²Èˇ+ˆï¶kÔýàïm›ÜþÊ${býƒPר–{Ëýw]ŠŸ5—¯TvïPdÀ`*-(_{‹5-N•iœÈØ‘ìOS u¶Dz>yxµœE‰¶ŒOmyMJìzr½e MdC¡,òÇ!|…D(ÚVÆóàð5\8 +ˆÈ\𮵙ËÎ`G)¡6M]>¦j³×{zjRXæíÅÍtÛ¨/ÈÜ ©IFpõàM°Æèâ{®9:ž?º$›©±»}[ZŸ?/Ü®d÷µq%0ÜÉ€ë÷¥D­jÞXâ2¡¾xwñ %’Ûv,{+Ñk™JJ#Ô§TÑçgÉtŠkÛ¶Úf$È¡ˆÈXÛ®²ë&]&ÉZLµU5=¶™(T2Ô×öîŸRÆÚƧs¬ÄL&P‘nò6ÇNˆŽÛ'rg‚JM¨êé@"iêkak‡Ie˳¦±xEª~m îipášG"U6œàZŸëò*ÞEéžUýúA©6|¯#2¿ª6÷Ó ÷ƒ7ß»Áôœád*Uߪ®|Œœð($LHkàk΂Ì£Çúè¶ûŠ%J¤vx¤žâ†N/Æ¥Æ$©2ž|˜Î™{KTS)³f0‚ »@ð©Ã%yÈ-®[–jʆ½nø4pFÓòD°˜S[‚.€Ÿy,}FòÉÞÇM–™-û/ë4ÌéX³çqLqžY–èË«¨Pe„ñ¦ˆv ”M,ÜBl~ì%Õ;Q#ç‡l5jÉæÎ’b²Œ4_WVÆû ‰6œÆOde¢pиØAY¤3S9ÙÃc ³†*a–=OÙ3Z@α­ˆPaF¦+«¬ò²ü3VÓ “®nÃõÍÜ%k£Âìm ¨Q&‚Š^afà +Ù¤¬5b»³»ó›CÉ 'JH%F|,Ω3äÆ$|…§¾\òy|r„aê!Ñψ@̈©06¹á'ŒT¦¾‡!ÑDþÏNÍ®¶%àÞÅ e¡Ê. OQ@Ò¹pÚé>œÜù¥—‡xe¯)Í‹o´hñþm:URÕOíˆl‘¤Ÿ‰wpÑR\€ôsš\¼Ju»ø&. ŠŸ$*ZêiX‡ÊtÚz×VÜamƒ¹¿`ž†è·½žk¯þ~).¨Š÷à²õ˜d6Y†!Y zKîÜÅQè *cˬ b§ÃìÅ-uDv°@'ÜêDªçÒqíâ1ý¿^å^œº=]¨¿©Î—5üvÿw}¾äd××?¥†Ÿ¶§úú‹×U ?ùõ¥.ÏJuºÿ÷ý·ÌdóvŽþ÷‡__;ÙogsyÇZIÿ[íd”v:Ç__>þ.V¡¯ÁiÓŽ]´Fï°«ÐÉvçdPžÈ*/xÕ8Ù3Æœ&€k®*¹š¢Éz"Jä5ä‡>yºq1½s‰<7Ý,7Ñp&‚h^ ‰ÍÂD‰ëŒÇ„wT•%fdõôÈ%ÏÞ†oß§štåT5éª9Õ¤klµ¡ÿ‰£š\~ËLF1o縫&™SM:íÌ¡]Õäò[íd”v:G|ÕD Ø"ÆÒ<Èã@’ÅNd4+ðÊf+RŠés!Ó€éÚ.ÚÒ®,!«M…¾Ã®$LÙw´¬Ð¾1yF9~WG8¾òˆk&Å&{ßxŒN  ©ÆlÉ8M ©ÈUÖØh‰ÈDI#©öÍã¼À¡(ÜB{š_çOÏÍŸ//¼ @q`Òd¶X4Š+Ó6­®3ÌÕ•–õ(²X¡ÀGô(¾¹B¡•õ}Ûì£x¯Ü莆ËÑâwð÷àUÃNŽ:z'G¥ªÚ&Sh7$+ØÎBvaê‰((x²¢é‡Â+ ª6þÀT#ŠÙÂhpê’—hoî¡VY$9_ (&s+µµ»njS——à’…‘ÈV²;L0ò|R™`OÞ»À¸\óP=㨞A;¿ã_eJûä ¦ iYw»î”s§Z{§dq<øIˆµO¨4‡@ÛŸ@cÊR‡@NcÜÝ0š£þÔœi®L¸‡ sW>ñ°Ö]åt½¤œ*ójÍ>ô€œ" Óߺ,êÎVFež0·W`Ö‹t“…QÊv,g6’É'ÂÑbH?e¦H?eæ~ÊØH¿ËOl¤ßõ·ÌdóvŽé§ÌÒOéwù‰ô»þV;¥Î‘éWÞǪÖà=Àz^vv€õ„4ùT9LH • JuÕBøS¡Ü2¹Ü^Öµ™p&ј#J«¨˜®£²±%ݦ)ŠNn ''Ÿ)Gk¿ö”»³3|ÖWH!§EÏFn¹Ä‚€R™©R•svHUÛ6Bÿǹü–™ŒbÞÎq·C*=g‡TÊ™C¹vÈå·ÚÉ(ítŽvHuïI3ŽR)¼ïHd(P—N´²W²4FÏp¸q3Çì¬IÖFb„ ÷M£§l³1sl³©l–ÖÿÄa›—ß2“QÌÛ9îl³Qsl³)œ9 —m^~«ŒÒNçHÀ6›{íáõ³ÍÈ^ÝZ[2pƒ0@ Üzø€!Þ á;x”Á¬à#1\ Œ²€+ Ö6„çæïxήÀÀ=¨ðÉ»£àh S/Mã=À«ÆçC@Š0<ïè6C²·$?xî)ÞQ8Z爫«ê - ~gú4þÒü®„l2¦;Ñt…q€zR¢/LKY³®_Šéú¥ëw³º~çèúÝŒ®ßÝuýn¢ëw–®ßÍêú£ëw3º~w×õ»‰®ß%Ôõ»C×·uýû–šé¡™>¥f³ûX4ã~Ëm©ðëÄÚÆNb¼41Z‚hªîlΛ­Ê“h[34(æsÕjª‡i5§‡ieëa—ŸØzØõ·ÌdóvŽQÓjNÓÊÖÃ.?±õ°ëoµ“QÚéñõ0­FÒ÷dƒ`çám>"ýïãáÛÆyÙ¦b[ª¦z@S(Ge£- Á€¨’°*ˆ¾Éœ¯€©Ë´âVï{¨a…¡)ÕÊMÆ—ËÍéA„_&mLH"+*Ø1#§ «c…JE¶¶“¸RÍÆ—!íÐïU†P×0 {“±Y™ÎíÙ±R²ik©…ÂR…I+”…Ù2é!£žGF¥p{5u{=çö2¥í’ê⸽.¿e&£˜·sÜÝ^¦˜s{éΞ£ÿ‰ãöÒwG×8J;#ÛË4ãaIʸDDå£^N´w‡í]‚ýp¢yåÞáDÛ¤-HƒõtÁ"n¿[i%Aг²D Õ±1•¬P=µ—KÒ/0weñ;ðÔ=ù‰’l"µíò×båVÙÜP =„3âˆÝÈ03)#«.Ç0p<("þFí&al›2l´}«÷ieÓ°4jà‡çÁ°QSÇ>:U´õüÙÅ×/0-/Fö¬Ú”?ºn ¯z5ˆÏmjlñ;QèªyHÈTÈ*¸}L–Wwsñ¹~ÖýOœøÜå·ÚÉ(ítŽñ¹¦9ߊóyóù]¶iPbÖ0„ªÞˆÆ(5 ÎeÀ"¾#Üäø!øÓ#’°èKÔœN6ÀMÁÑéLh”bløì•œó7)môë¡kÆeê:È‚ M;.2EÔæ¶Ál{y¯ FÄc:§ŒÏG@Ϩ¥ƒ+[JЍ/Ä=4·MinBoLü!Üd¹¯ŠÂ±ˆô´"\ö,ŠÍÝh9ý£oD>ÏwbU/j¸¯è,H! 6üµLlM¶úHv#‚Ráóº‡AðĬ•U™(R Üuf¥Ñ:Oo>,Éð -ï€é92GEL”%øŽˆbL9\+‹ŽþÀ^òÉ®R– GÄ”ŒÏ‡È„]¡g C‹)EyÐâòX¨¾”¢qõm,Æ½Š‹|­šÎ¢ÈWO«[4Öº±¿-º8®#Žy¼xÜ£¯+[w¤º_ä<àÖ!Þü™xáD}ŽïPîâÒYÓ:t†Ù® käª&6µj9mª.ý‘#±ól×—WlG¶¥­˜º·ÖÎÆÕÈî/GótAõÐñ;‰•&…'É —…O˜èù…ï­×Z×xÕDMwOÝt¼oXûÁ_Ê$i}MH/Z¿ƒ^AžûˆûÀ”b:䂽*ï`Ü )åzêbzv³¶§^•™™RßR÷*m±|UœoBþÍ×èÉpMª³¶5ƒAÏz§CïŒmËÍÙI8ìÐhƒ"0·‚›p»x„¬Ð†OðÚ|ÉÌÚ†Vª:ß”£7ó|BïT%MLáxs¨ª{¹s&3S¶í ‘oÄDþ"±KQe8ïÕ;€A SþsQXn* !ƒÆÀk )EB¤„Ë^&‚MxÞi Á‹#Ë£ü‰T1…ØPòáUŠ%+t É–°”¸\þ¤Ç³š :‰/±S&‹ÉY"Τ GȦ™Ë:d9wtY­ m°³Ý¶Î(MŒ¢º+ÏÅÜuVeL¸æñ:°õkćA¢Ä1^G: Æ>ÀH²'¢Jà<ó01]üä±£8Ò/»øäàhž>õ íàÑ0rî¨gà¾yv®ÍC!˜®1rÇö!ÃSÁ§€))ÆuàSÀ'‡¿¯-R†Y¦^ü„ Ñ‡ó\¥DÿßéG/¼ÒâÛ£_X (µs¢ÄôÊG¡.îí“‘tƒ:§äÜv¡™‘7úÕg}‹Í;ûS»OÌçáÚ\(¨Q|Fó˜G ØÜÚ¾_Š<ü8ZÚÌ{Äk÷²Åy> endobj 7459 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7460 0 obj [ ] endobj 7457 0 obj << /Length 7458 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sØ/>€ €´+È!ÀB ääÈq#6²ñ!?œæh—äW~[Ý$gÇ‚-y[Ý]]]ïGóÿþ}ÿÏßöî¾þgÿ-þ~÷uWªPœþÙýðò¶>Ä?ï«:ì¿ý²{Ú?ívíŸv§ _ïþÜþé{»ÿSûïÏû¿þ­ýáñ/ÿÂ/»ÊTíïÿ~þ½©Lû§âüûñçÿÚýåwû_+vÛE`^ÿÿÞµóG0&¶~ÚuÇ4Ï¿~ûöëîà óv©kS–õÞøö¦ñvÿßì~j7è–/7¦*}U¼e£Êw Mµ7¶iw-›ÁFÏ¿t–7ú‹[_†d‹Ÿ WÇŠq¥‘W?Ôeüþ™Ü»>â,T®¥,Sï“’•­j{ºšªLpñçÕSPU’ì3äÚH‰D…×¼ÙÆ'ô´hÒÇÏyõÈoZÞI·ørm¤t7 W¼YW´{%ãÙï«'@¾kñ”nñgÈñ,^\ófMÝDô8—ûçå,îlJº9B®Ž•înñêš—ëMGûU }_>Áâ¡N¸ø3äêXé.w°úÜU0(§Ÿ/ãI˜øéq÷áKkÚµÈ,÷?µÀ=ïyúí±EJØÿpt-Z#áñÇýï‹ÂØ?þ¼k¥ ˆqä3qἚ¿XK¬VÂÕàœÞ\qGù2¶¢‚P7Ï#Ÿ[VIMåUa:H!æ]€§ƒs| ç4KÓØò#WJåy(ÖNSŸ…2ÖcübºÄRr†¿#4Ê9ƒ¡X éÅA[^ 9ÌMPb9%¶kº3˜ù‹éÒCž¹Éÿý?Ï´S`+ÏÁº k uØLUÕaËrˆE|'ŧ‰ÓÍÃ"¤Š¯!0˜’°¼Ä«á¼>–ƒ.€-#Œ7ˆ O*ܶ³ ÔØªp¡nŸÀ“bŒ 8€rÃB:p„\wXÚa !ö(ˆ!Å ü%qÔY$qm´]¹ Žzó½ál!ÌX>aYƒe4¾9H±˜Ê]‘–Ÿ¤el½c‹ß`[Þ‰ÀMW6r¥‘˜Y¶3æ A?ÉÈÁMZ9BTeqÛæH.wyÍ=^¬ûPxAobÞ$4–\9c»ue§ï‘‰úb wq>[~äÆékàtŸ‰}ÄÁ†¥C3«Ä2[˜’,ñ8‚oK7 ±jé€ý|sïF¢0üÌØ8â3é gáçc±fÄ"„‡É££!äÆ6óUÊ/œ0ÅB›Ë‡Œ4æëî „‡Èx•B~çÜtógpŽe¼d,qt˜ˆSsTóLÄ_ˆª›:)Žüa…Pcêõc¡M]¾ÒYrÌÀìúû‰,1š‰Ä;ÆÊÁrs:×$d4“§dÖ,DtYˆã}Ǩɗ]´­ÛûÛWg1ö¿£Ç4Fܰ@˪7¬k×ÕÅQƒÂTèP5Øçf$S…Gt¡Æò‰ˆ®mÚ&Î#}—*N™¨¼ª¶¼ý´¼5†£¾‚ÄHP¹ÀgDôsy{Cð®pc§aÙ©O^£‚ÇÌÐŽul;ÖFSÝWƒÁ dj™óÀ[ØFóØe—©¼ ÂÏ|O,!u+SÜV–;1Å¿W·ÎåßéJaD·ÏB5ÖÍô%0 º‘Ý"_tÚÓLÂCy0·Úò5T)­8ã ôæ©â`Í~þ$òÈ€¨PµÖ‹òú™l¶Í2u!f•ÿU9Mٸʈy›`Å#ÊõaL—“‡\‹û‘pת°ªÍ´j¼aÍ€ç` „%a½ãˆœ í jÅ0×õ¢Ìë"BÅ*!ô”n„ãZèkÃÝkÄ«Bgje 2UúGè$$R‘¯–Ïš¦ëöÝf½¨ ¹}›8 <˜\9b¢nR°ðK;ªÖ¦!’ÃxØÏÁ¯ aìàþ|?LäS/áÍlb5“}¼Š^]kݹV S½µrÌ–ÈÃRÝØ„ÿýáî1Ï`™–Ñ—¶•™¼{ÁÆ6-Æ/¶¿R¸;Ûªûv#SÏŽ-dU{[°>c<æOù¬™ÖÉL‡$¶r¶Ù£©+rõN VÓŸ¨úî^ó#*I±%œÛ„gÁh{¡v‡v7ÚÉH;|ÝK‰ïŠs–ZUâߪvµ%þ³sà*1*àm³5iÎWI°XdÌõ»²œæáMŽtG>Ñ] ûgÌû«Ld‰‰*2Q"¢²O¹h“oÌg« z7ß¦ÈøÞ¯uu˜¼­mŽP@â5Ì\ô¿æhn.Ü"m\¤-›ŒÎô]·TínYWgÑ,¾ð“w²Íª«’ˆbèÆ…p彸rßÞ[·*_ÞËõbq6ë%Sm»nE˜ð %œ¡Åˆa»}€‹hdâ,¦Ën›~AæîªwÀ X†àŽ ‡mï+ÃÛš¿ø†›S°˜`.ùâd.5]*ä\²[•áž> ëCݽ‘ ýÁ»*¼>@æ8Ë¢Ü!ø²®^ͩሟ[T ##1P>¶š%ösbj}HÂÆ©ûËCÌ w —÷‹qqb©pp¶6—Ò> ¦»Óˆ1ÝQûÆ„qßçœn݇²2¯æƒF œƒa‹*v‘Ýë ®E@Ü8Æ`FŽn u AÂw‹ï /æ UŽfdW.Z¥Ó/Pìz?ü |_è4°X6ž8EB…LÝÓH1´;vCXž]ŽL4ñ-ø1¸Ÿ/ú°bÔ >àà˜Ž5(Ïq•â}0sÑÒ G˜Û± Cal÷çzïÆú‚Û`˜R8܇12(£SÜGà[¬·1O¸ÆçLe82G×cžÀˆœ!²k—°• œ#Üm ó#¡BmêÐS¨øÔ”ôÅ|˜Öœ¡É){‰ðŰÑÊX 1“b¡hÜk&#Ø¡hJëc)Ï |§„6ѵUìô-xá€)ƒEtµ¤wú2B_̈ÕÖ VéÔe6ØÐ6"ÌBAò2ü„W›RÂé#ŠÁ”“` F$áF Ýæ)BKˆ…Ú÷±p¥QÀÁòQÓ)à¶Þ?r2Ä­1'ܖ粘/g~ö¯e|yd$ž¨§xñ‡ߣ‘sêchÈ@ð>Ñ{ƒ Ÿ'ÀÕ,Âh?qê»ù÷EÁÈý¸ûùslÕ´=tyÙˆ@;QÕ3îc4'ÜÁ¸Žšlµ"“")Ͻ‚öd‰ÛçÄyp\™qÀ±T'\s!ÉäZ`ÖBp,>ÂÕ¢¬°ÝÐ%`E†Ý.¬°ò›YPM¬9½IùnƒTá8«¤Œè±GˆqNøp”›¢hœÎó±}Æ“]Œ$œáÇfã[•È–aé³d…ï)ÇÎ2f¼–éxNW¬âúÒ—7 ŒnB=3±59•JîªÄ{4¼/J0Ù8œ¥”†q9&“¢¬G/G>“ÂÙ¹Qvéåªpî?и·Ó•8Œ¥’\kšÖ?ï©MႉRž›6+ñÄùºTÕÇ]î§rÍéå¹Ñ-¬›XËýæga‹ gvu³é*º »Õjm«SQ;[Ç-ã»ÄZÒrÀ|S^X*7=`’Ï ÈBËë3ª¶U#9ã ‹ßLv\5Î**Ee3ÂÊ5êí4¼ÉŸXêÖ©Î(„ó2‡[gƒªQC×l©—2Êž:Z?«Zž£YÔpüBç‡6¢°ìPØ•!‡A¸D#ñhá`QM¸š0ç#œÓ 9±³Ø„Ãév_Ìùt&‰^Ò1¶›ŒŒ¼P÷甂ž4¤7~«¢«ú¡ FoäÍõ¦}Âãø ÛqŸ?ócü:,ñº¾Q{ÕZûuÙÃUÞÀ4K¥µ‚çXq—›î:fšjGK[º ,Kˆ¤¼G[“Äb-M¡n AµeU‹ÆôuàœØ#î"¢”RÌ•‘W-ºSNµ_k? “ß^ÜLË(]ßt]¿÷HØÔ‡ÿR†lèÇ]t»–³©Ý¾,gjFfÝNP›Ü7Œ™Ý‚k¸|ƒ±JuzUâdLÖ˜‰‹$~Õ CÌ£vСJÒðyfdol I'W pñP¤Jõ7ÓŠ•«µL( ¼‡R€¯îÝnÜ4„¾rÔñ }0Yß—4ƒ=e<”ÝWÓ»<õH‘y*’y»…y'‡iöU}ìD×íÆ¥Tùõ ÛšÈï(?ІÃý‘D=©Î ‹7S[)Oʸcƒx,Æ9æõÁ"¹b«x5L𨷖./²ÌœÑKÚ„[ö4Þ-W¨cüÞd!i oïÍ.$þ€“s}®º²´/†ÃCM)_,sMïWÿª UÊEø^«éšL™R }÷/WtŠy QÈÌ-n)Àè/*Ý˼[ɘŌQªÒÆ(õ¥^ª2Wx`3øÏ9,ƒSÓcmºmcÃ@P¾Ø˜ÀêfŒ±Â ÀÙ_øé³7˜ «Ë?_pî{ÙÓ‰RSÄô‚ïb$`,ÚùTa0Ôø3Õøóz ]bz¹#nCMfÆ4‡°1¦¹ÃxÃ#L˜Ï0ÅçJÿ×uÓG‡ÊÇà¨o† й–j£¤JP/Ϲ3=Ž*]×k,ËcžÜW}ÃIè%"ªÊÙ)LÆ´zÝÙ¾dIb†%.ÖÆ½8ÁÂQ¸$`F#¿ñÝ÷ÛoF~v#CÑL¹ÞµäÓ³|;ý=œÛé£X˜×_À9w‚¨»Êƒ;uí¬±F{ÜÐ!ÈÕ‚ï oz`«P˜•P–¥ú,ʵ>z{jS‚z±÷i™‚,‘YjýÞuÑä¶R5 øÅî7s%­h¢Ë}c¦`€‰Lö6ä0ö]ÑtñÞkKõo ?-Ë ÓÙáL4[9žñ+d c>×IájǹsÙᦄ/”2fUûpkáHm\‹·’#j­íqFQ•µmiú¼½–§ü•*_5ŸaÿÍ`ôÐVJJ¡"²¡G­©«´3½Â2ãÅ{êËÛº·—+áŒiwÆSžÇµ¥6à“l¯fÉY?]®¾¼·‚!ð&#®Ê³"‚f…§jÞ"p¦fâ†0w ·ŠeÊò%”WóN/¸û¦~}÷é“’.¬èo<&%£Í`|Šíü¼da€#Á&ìƒ_&‡¯™ ûœl êà@vg £x5|Ò¿fî\s~ð`Åß*¶Vœæ´ SYPâS™žÈ[š7uš_Ø g>qúõƃkâÁ÷dõMèë¨M%Y3†:¼o^Óê¼ v> 8bàv`Ð@pÀtmØiêΕh&Ú‡”»Ú1Þ·±À´ƒ!ø8ÿ¤8Pçðyp0Œ8L£xÜ…q WNÊêr| “ieÏy¿Ž\Yሯ«žÉi¸ä3Œ¦R]jŠ„¸Œö`Ã[xCWßcübŽÆTJ´2ëÊlja5LË|Ûëv ¾×+oº€.ýtñ¢S{|óxÊs©Ý%fûkÿÔ‚$Bü0õ.ðíêÑŽ»Öû*ÌÑ ÝÛÃÑ*s5O7^x_'*±ûüaÄ!ߕÑx_öPâò†îÑ>n*Ç>Û—xRäˆãšpÿ¤Ûõû Ù ÷àŠ‡‘c¼œP3ëè/È–%¸ãŸ[ˆ»‹†¸³a> àÕ0 ¸;&ŒUˆ;L%Ñ a¸O,›ƒq€)SVÝc ú#œ«+¥,â°€Ás>EèãçZ/Á°ÅX÷˜°€7ˆñgàCxD@1”/Ý–g«Â¢¼żPJ[xlû¢nrR©=ìvÿú(y endstream endobj 7458 0 obj 4505 endobj 7462 0 obj [455 /XYZ 38.2500000 495.500000 0] endobj 7463 0 obj [455 /XYZ 38.2500000 149 0] endobj 7464 0 obj [455 /XYZ 38.2500000 495.500000 0] endobj 7465 0 obj [455 /XYZ 38.2500000 149 0] endobj 7466 0 obj << /Type /Annot /Subtype /Link /Rect [324.750000 578.750000 399.750000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 7467 0 obj << /Type /Annot /Subtype /Link /Rect [153 362 188.250000 368.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 7461 0 obj << /Type /Page /Parent 2 0 R /Contents 7468 0 R /Resources 7470 0 R /Annots 7471 0 R /MediaBox [0 0 595 842] >> endobj 7470 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 7471 0 obj [ 7466 0 R 7467 0 R ] endobj 7468 0 obj << /Length 7469 0 R /Filter /FlateDecode >> stream xœí]I¯ÛȾëWè`dö Œ·90l ‡AÁL&Á`<ˆ3‡üýh!¥§¦¾"û{ÕMRRŒÄÎëÇ^ªªkïª7þüí¿~ß¾y÷ù?Û»¿ß}Þ»º,NÿÙþ|÷ò¶ÙuÿÞÖM¹ýñëæÛöÛæÓæÓþ¿mN|~÷×ý¿þ·µÛ¿ìÿûËö‡¿ïøS÷K‡_øº©M½ÿû×ãßmmöÿ*Î~þïÍßþ°ýí0c¿\·™ëÿÿ÷¦)ŽÛYúÛ¦?¦9þùýÇß6oNˆ[¥i\eŠ­ñÎoMëíö¿ÿÜü¼_ Ÿ¾ØµÞ˜ºòuñš…j{\É—[cÛ=lÊÁ:Ç?:³›“×®M7ùqçÚ@1{ÄŠ“kb¶nMBÌžgOü¦II6‡§Â,œ\³mí;ð”Cæðz]¦×ŸÜ›µÇ«C¥Ç-ž]¹Þ—¹/¦O0ùž±¥›ü¸óTÈf×D®¯Š@u ]¦O0yåN~ܹ:TzäâÙ5‘ÛØºñ @t™>Áä­OˆÜãÎÕ¡Ò#Ï®‰Ü¶µ)‘{™^òÒédîiçÉ‹gWDniÊ&ª|™=nm™’p;O¤*ãÉ51ëš^Ýq.€.Ó'˜|¡t“w®•·ƒÙ?ÅÌ‚·rú pÁ|>|ûeóæc»5ÕöËÏû<ýõåëf/û¾;Xå{ÓäËOÛ?…{÷§í—_6ÆìJ_5uyü½ãHQGš]Óûß/.#sñ;ïN^®óˆiŽ#®ÿdÊ:Â>žF¦,láô}ƒgÃߨ®ƒw×qõq¤ÝÕU|ã‚£ ÅÇ(á75.|ÀÇ‘rçlc®1Ø Žö§…?|Ù_Ç×Ý$ãÊ›—©.O—©nz¬}ì°vÜÌÕ¡<éucľ…ßX8ÒÄïÀâ]×p¤‚#pxoERû}üIh„¤ŠUéïÚaªúGˆ“ ï6ž à“8-à7x×€µ2NßÜÎ&œŸ§Ê(sÚº§Øîroëòí´>ŒòÒË3Œ!‚‹Ü›¤³ûbªðð¤ζI—I:bî[˜xþ"ÐÞ!2KGŽ2b¹Öµ¹Ô-S Ú‚ÁeBÛŸ¦ˆ·çÌizãzKè2m˜¡‘K’‚5…-=l7–ž0‚-ü®M‹áö6¾H¼Y¸%<›ƒÔ%úº„Ñ„t7ø>F)D¾¹7E'Å–ÄO1$Æ$ LÕqv§|(¥ÀkÛ@âQeô2cÌ0´aÞÇÓ†ÇÎN] wýýt `Iî49wNfcýÓF»Œd²Ñ¦‘PÐ5• ÝìÑ’ŽQg0'ËÞ—(dP«²ÁÄñ{ Úÿ‚zO‰Ð÷®w.0Ð>t@¨Æ£…- è‚a)^¤uZx7`È8 …ÝïãG¨dõ…&#iWÚ*€nz½¢`”’3Œº8x÷ƒU?,B9óÌa¸§¿çÛ£ŒÆ½Í¸[]³ƒ¸Ø-ÃCìû2È1S&ò…½áà¨ÎnÇ;ÀÌž§óå¡_ŽÓ¯š5a?ÕxNÐ î¹)¡qOÎñä“éÅvü¦>ø­“ÝFÞ”gåêq‹5µjžáÑvB1U@—ÊŒXµ=$X#ï܉àˆ¸~"|iª} ž’“TÈøœ˜D¸h¹ I%† B„IÎ˜×øô2"À®“OÀp¾éQ”³ˆôe'ND "$-Q.ÂëÍžÆâtiժʇ’ÕêuB–XÛ2€ãA팩[‰9˜ÒLy >3(æf¦ÁÝDÀ½ˆ¢Ü£²)C诸èD}”ˆù™/î‡Þ™©üØ-cûuÓ^ÿà×ÍçìuÛáÕ‹0’ÒZv a fؾQÕ‰„‚€XÍÀëè2yâ<Ô3 Âz¦ ·ê)?Ë›ö°^Sùo!#t`ÂôÅùT‹jÅÓUåÑ1ïÁ†×„xla¤ „á¸{½ð d‡GðÍfœœª0 IE$]ÏtTÛ9µ¡ˆZàKGe“LUSdRˆ™’6Ïô¬¦gY?^4gz–­út›g’…¸·g’ʼn^šñt¨œéY®xؼê¸r wH‹Îö ?¸ÌèHžz3Š»'—]—Úõü#.‹G„upQ!¢$>.7d‰BQBa\È™)€ËAáóè¶SÀÔË´SxÊÍÂy-YÐlM{³ÀËñ¡’?dÍt›9mÓ»“!öPéDV¹³¡õ†gÃßx®Óô&Ù)6= ½ƒ‡¶u·\÷FZ´ƒÎô«vÎØk˲3o}ƒ×Á³Á0`vðàu ˆS¼Î‹Àw8Òí êíßéƒÞµÃmî|Ã!Â7=gqÝGF"’’(ïFB(ÀP©BÄ$ãêæ¦jÀ*ð±ÀjQ8„G4ð gëÜw/Aœˆo¾¤YÖÉ•þ´ÐŠøÁº D¡r±;¢\ 5qs¨Æ™Ë+BE[S-Â3ä¹’s%¬Zc‚Òš…SÒz4ׄL·R;v`ÜXMú„½-Ê£øO‹ Ö¸ADY|Á[“³8¥ó(ßMÜlrA#ÅØÆú Öë‰v·LãY¼†N¶‚†Õ¹“ãü^'!òs ð»°0.D…fkç1ý¦r2á­§B¥yãJ…¨—×LÈü4álLÙ…\8ÍÆ\îìI®°·éª)ˆèxÒ´¤:—Ùzp2i{sÕEerYÀèÒ­ÚÃå"ºZ™n}ÜLì~ÉÍsWJUÖÓ" é( ëɸæ3BÕÛ¹ïBSI³C ˆÔ˜ýM¯s44ÇRôéœS]°pjµvËÊ]>ÄÂ/œº't¶J&Á²{¡`a„Ö­+ ÓaÝLi,†#*RùäL[oæmÿ($ƒ§°1¯¡†yà"Å™ñTãu]5lLEL)»ªå´2Oºr]}†aQ™ÏOÃE§Q@Œ…Î’puIƒnW¨´#Y/ÊVÙ·6ço îQÜ¥ÇéÏ’ŽS È5Áoî—ëi“Ml^¯Ì™ 9‡ë^ã\Î6ц%KðÕÐ3]¸åŸm<^GâkªäÀøášg$”]½ÄÄûz(n„ƒi€¸é/®×Ø-ì>ž°ÖM(3±>€_`Œf7&ÍPÁP|ÃpE³!gJÕm Jë\ªˆêðþ1Œê·¸Ê¸5UQÃmð™°úb¸îª;Xé–§aèB§Ï…nÖ'¾,Œ+æi5å/\¶˜‚Šù<‰®—{¹rר÷\D+íÛ.B”Dhô™^ìbèb:¾TzB=[íW¥soš?Æ~@;ˆ_å¦6l=뫺kØzðû½øÁ [Ï®GWÝ §Dk:®9Èb#ßJj‚S>_ŸSPpjȪu§Ç±„¢ÍÄ3*jª›ÿ§ëÖPm¦J9ˆ—ÊΘu›E™\V*eÄ•ésyÑæªpœá½™)C‰·Î÷˜÷z‡#R»ˆ(*#2JÄÁS&>¡Z«_󽩖¤}M䃚¹h„ƒÝé]ý«[†¯êS¨ù£øycE1káL/^›D?Mû¦¬ Ħ.WªTªVã^(9—YÞçŒÞs·°Á•gb¡™¢LªÓ¢ƒ…ã»#XtÕ¿UuœÊ•ä³n]UÅ•1ÉÃe%ƄĖ\^‰):¤””ò¨ô@bt]ÕÔHæVĈU?¡f“šõÒ&iVΆ‹ &å …&Àcå ^Óª õƘÀ3#O™÷ÛLí/]“îÝž+7üÁô­”mŸÌ@¼éøPíšAE‚w)SÕK*é‡Ižš~“žƒ”Tüœƒš* ÿ¸ZÅDÝa¡f;þX•ÀjQ1÷ÈÀ½Fg˃ǺÝP•)J\®ÿypÒ6¯À ExS…*éVK‡okêëÛ™ÞsÜÖöúÊDå\ë–*SîMÈ[FT*‡"'¬Šo-W5cü >ºjÞ›²#ÿ¾l¨l%›T\¹Á@&±K7r9]cð¥šGȰ¡JûƲŠÂ3‘V;<¬j$L÷!$ã“¢ÊÈuv³®æ ßÂ×âµiÄn¾óîAJNÄÝAÌ9˜(>Qß{~XX0õ°˜H¥ÖIïg.›Ð:Ã6‹*·Êèª+ [öHfÜaؽ‡Gpû?ÜšvþÖxoLkf¢•+nM‹×ê¶ôÍ…Ëœg [Ë=*®U·[gXesô\MQGœæÁcå®…ï-ÈäÙiÓË-¡°C=˜J3¹–-³ó!‡G25³,«¯Áqãi=¥=«ú ™ª5ºŽÙù_¤*wZaì ëLM+¥šyL–)_i1UõÓŠg}ÀRV­'å½&d¾DLJ׎¤Ør.§Æ yÑM ˆêå´îXS&ɦü K©ÅÔëͦè–eÃ44WeÊuù§™g$*o”æjH¼ÜBqW‰ÌX £uU¨_„d4ôÒCe˜JôeŒ¯•7)W¹ªó)“Ĥc®¥›sðL·^_ Ç´æú¾=ӭטn]Z3¾ŸùS{žÀ[ZÛ^ã;½ÇÕ6}pgÉW]ŸâS*ç“ʉ_ã †FDýÜh’ñ¢Îüp?ÕƒñøT»¤2U‚c”HýÏÆ uUÊcŠ¿ )‹6vžð‹P¤jz„7O”àÌVXE÷¥v´ - |Œ±œºôÏ5¤2ê­-é¾ñÎäå¼·èmâèNŒn„q›¶'H¶þO* Ö#†+ÍÞ˜ ­Ëõe˜¢s\¿8ÅRÞ…'E^ëÃc?«û¬+ê,„B0Ü•œÁÜX%bÚn¶¦½ÝcýHÙîür óî™bw /ØR…F:2*w6”%x6üM—yë›®sî!4¨Òúö,'^§;ßš­€ßœˆ¥Ú9cô“šQÖ;7@o®,RwIt†]fnЄ¿é9¹ë>š0Bù,§–r/”ÝNUõÖ}G]V©"?¨EØ´½ u{XÅÀ/SË5ݘñ’[H rŸ!&¢ÃN¦ÌJšëѹ.6rÅ´(+v÷ ½˜Má ˤÄ&v6R/:T&é{ÔÙuêÜúÒfŒ¨n’‹oé2fUƒP°¾4 ôçLFôæÜ{sa"öóâgÇ?bÆ iÄCwü ~,ø 1 ˆÒÝÞò`¸ì]ÚB* |Tíqñ"ÝÔâÇè˜*ð„¼@/ð<ø™:N¬è?`×}ÚŽ÷“q•kÇ28Å»fx†(qŸñ:ÎFáçI;íèʧ @Làѵ½º%1„»‰ù þîSì“ßj߆?-Y'XÈÝlíbî¦@}D.¾¿„·öÑ)i$@»çñ×d4ã£Á¹ÊÔyg¢yDü ³ ãowÖÅ9Wõ\yÖÏÞ€w\*B¥mi¦Ö Ìc1¦¨Åq FY•péó®/](.…(Óâ„©ª´æ|>ÕW’/½ãû?Ûo{biñÓØ/L Öæf¹µýY sÀÌÖžÓ† ÿI$Ô7Îz²ÝÙc&ÈPw¯†#Ý+*»«Iœ2¡÷h7– |ko»“"âÄï5|Èom¶Ïð# ̳±¤¾q ƒgƒßtÒÉDýE-Y–àÿÞï¸G4„-ãIφIÀµØ1Ù`¨BØa*é¸Ýk ì®Ó‰š[ß`` Æ”Õ×@ ¨ðÆçêV&q˜ÁàoÞv»ïòÓ¦Œà½uÚÇ-f1ˆág %ˆGC®ñ2LÇÞÙºp»Žß_]^È¥-> endobj 7477 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7478 0 obj [ ] endobj 7475 0 obj << /Length 7476 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ€ €-Ér H@A'0b#Šùû™]’³³ä|Eö7UMÎìDH¤l/ûQ]]ïÇ»?~þûþŸ¿íß½ÿüŸýýßï?ïŠC]ÝöO¾9ÿoý¿÷uSîøe÷uÿu÷i÷éø¿_wÝŸßÿùø¯ÿíýþOÇÿþ¼ÿëߎ?ü±ÿ¥§_øeW»úø÷¿ŸÿnkwüWqúûéçÿÚýåwû_Ÿf–ë7óúÿ£¯ëêi3KÝ ÇtÏ~ûá×Ý»i«4MY–~ïbˆ{×F¿ÿï?v?¦/mt®®b]\³PíO+ùö8“‹“…žÿ(Mo0yU•v“?ï\*.TNž]órëPujKf· »ÉŸw® ”ájáäŠ7[Îuà >èèezèW!»ÉŸw®•þn…Ù5/76Á&ŸMo0yÙÚ…nçV4Y˜]órËô /÷ezƒÉëÆŽ(w;W‡Êp¹xvÍËmšºÐñ‡ú:Ínþ¶²“Ôºke¸Z8¹âÍÖE9 þñ¿ê:›Þ`rZ»ÉŸw®•þn…Ù5/7DC9ùev ðÇhˆ8Ï;7’“ñäš7õölzƒÉ«ÂN½ívn%JMgÿ”2 ÞJ÷`‚ù*|øÝ—Ý»ï]tG`Vû/?7÷¼f÷×—#PÊý7OjySî¿ü¸ÿ}Q„ïÿ°ÿòó®=T¾¶Ø¸ˆF øMñùש‰ÀoŠÎV¡×».>À‘7¼7á¤ÍÌ-|ürDGkLªŠx &Á3ñéë8ˆ—ø›ˆñc9XOê0tஃƒXŽa× q§ð<±Íˆ—>\— Ã{ÄðÅ+à?ÆËoÑH‰o ¿&LË */@â¥ðfÞ”¾ÚÓ x Öø¤ï-']ŽÞÿ}«*ô]È·ìGõäìm=­Cxˆ¡óù½l³A#=Â_‰p¶îBšCÓÏç‹BáPƪ©Ë)Ø› ÷ïÖ…Cð;Îÿ2âÑÂý=œM5a'=g;ûÕ Íê ¸>(þ¦†#ð\8“OΠZ·´dSØC$À–0ýøȉãôt!éÒ™g%œ˜€õ°ñ4À{Ó ÂëïW@7|Éø€e±‚ :|R âpĆ<¬t嘉áíÁkíyí":Ý é§“ïÞ}H¡;±sÞ–œ˜AJüRuÙ C_rQ+¼Îù1-ÇæczÆð`š0ï£f3GgnŸ!å½íÂK Pt¾tŒÐ´`DØ©à€†ßLO1¾dtÿ6E½ôÙsŦ:ùâïd]•#QÔØs›¶‰ JÔËmVºb%6<0›|ŒJ?E>'T»yïS6í”q`2VèL=aX¨„ˆ( ¨®}‹!f„UÓ^&Žuñ CÊÝ ZaÞ /¬a£ÎæÑÅtåÛ1‡À\YE¿ÍeÉg^ÝäøW±U9Á÷“Ëú³AϱYÝ¥ ¯§_~ êCã'"»…”¦M×ÖŒ£©ÛÑ©)×9£Ü¬hBj'wÍð& WÙv¥j*4Ž»SQ›bÕâ˜À‚‰iÃr,ÃUôwÝì[_èN VS¹7³ eÀäºú&2%ذóÁ\ÕêYGÛÌî[ãB7r)F®¹Þy;8¯åúˆÑ1fZ M*aN[qìÚêB¡jFDÎÃ3S¨æFL©t=:A6ÎІS^l‡Œ®8Tµ{mTIÃÁ2÷ò ã¨-ëÔ,g`Ó6}`(º„®Û†â£Ëå&júL 9”C#_E81t¢ÐÞŒ,¶A·.ƒ:qóMF—Ç¿fxw¢DR) ŒåHÕªµí’X>õ™1ü&áÕ1) ‘Úbüp&ƒòzi¥Œ‹Œ|RL˜óIÒ ƒÅH¼š·BCñæk)á=bŽ:Y0¹ÌÛ˜|aú¢‘ë¬KQä`Tü UÔ!ÑÓtK¢F~V¶ª' žë†Û1ù, t™gÓÌ^e˜Å„ÕaÙ—ñI WcÌêºvŒ4ŒP”,ÁY2Ùº£^.ù„HOóЧã-a 5oX¹Mvõ°úéXý¶l,¹û·'PBB}¥ô‚åx—.Úr¼*–#ŽG%…31¸Œ8¼:-§â¸sÉLV‚m¨¼± "” ` Mè†L®ŽÅ·)‘›©Y†a ZŠŸ4Æt Ä B4aüRB!!¼ÓLœãŠœKMÔM¬ S²;±i2(Á 2áh¦ˆø†‘£¯ép‰H0F£ž°\ù"Ü‹”8lkƒ¼Mß8v4'øg°©Ö~~›ªÑQÌ Âú÷ju½RR‹Œka¿[Î(jø’|Œ£§ÄÜ ÀØ{ó$Òš…åo­*¨yºņ—)+˜¹ ¶H,ˆ™ÛK×Èfg^«ãGÊÓ˸%^ÂT0­}x¿¥ëÐŽ˜¥u ø TL¡DâtÔ§÷Ñ‘©4ä±²±–JÌ(¾Raê•«ÙrÔÁD˜6?Ž˜KX{ô;X.DYZv}+ºýݬ9,žáľ•,;l}­›—tnÓ0DHÝ @U÷Óe²º2]‚|¶VøÕ¨pyˆRJ€-61éF0ê&cdÈ+yÒµPúa›^“û™+ý?FU-Ét·%\.¶VÈ=cڋд§Ì$U²jUmô3É×_£*â©8 nZ+uŠ6B lb6¦6>OÈ×y£*ªðú-㪦i§ƒíØ{ö›Ô¿÷<ñp¡ñ<Ó°7Sÿ¨yžÙÚ²—f+3âKsrËB| ïž97®÷+´±‡#wéßè À¾/º'e`íàlÎ&P‡ŒÎnv?B‡&Œ±ŠÔ ß^‡èê„1i¯–¸ûòu*ªœ?­ªV›nÁªåP/‡.á7xäÁÕ¥ól«?%æn†Ó¨R(†«ëÂ`Ó´¾™Ísõ¶šÝϽquïÓKAÆ8{bÝSR¦££.õ XâV}éøyGÈüÄÛÌ) yW® ùS¾Î8æ÷KœÏ„¥7ªeBŠ PyÆ.HÈpx­sQÿdÿv¸(\k7 礸'Ç\NŠÜ鬨b©V{ªò5à/$î .åþLÊaNT^/*zõC¨Ä‡L‘yTN·qÈØ­( Žu"ºŒ‰xÁ8”’ç Q´S¥n¤rnhBôï†ûseËØ³ˆÓµ,Úîãˆó%PLó·wöØNº À s¡f˵š¾€É%æ™t*¾éÞm.ÚŽi®FnèmR¹,Y–=yÛ±JFU°ÆmðCÅë$‰)/@Ûü-•òጠ›ñK¦D€Fqÿ›ê +ø>·Ž©c¶®N›Z¯xH™ ¸­É³©FÁm4ÇÇ\˜°iöc9¾ÓLæÊldL#+)E Ç¸º<µI¹àm]ËT•M·w¦nÂN¶J¤|NŠEhö®½XO«#iÑRºë<®8t†‘3@Uh¤G£òàÇÖ<þFX§Eß uýÔÝÓT‡àü:«ar½/²Pê Hyaox<›°7§æQœáûñ%õã–ä™ôMÁô†IªÆˆ¥ï”òl„_"¡é´²(—Ë ¹V±\ˆÈpCÆ3§RR²¦hô€U¶`«–Zƒê¯drÞQÍ Ì­±Žc¦e›œÎ˜¨®•Ei›ˆ eŸQ±§1Å—¤,7X¨gJ’¨¶Â[¯"%æULa³‰š®[<Ä3UŒ *å:ºÄˆ|Êݵïo¯Y&í©ÈËk~úˆ˜ÀªJ–@ÛÒ )ML’ ’ÆÕB2ï`Úgv $#Éq9ÃíËPÎC‘HÿR’pBÑ×M±Å'R:p¢5ü&gXYžJÜÀ¤·Ÿ£`åGÙæWʃÁ©ºaÆ)Âs@õ½Ää°b2>FΪLUsÊDÁÄâÞ…š?~¾uQ\ß@dE ðeÝòx\1йG†UaŠ`×3XÈÈ#®Àìg…ÃÙ"~M¸Š€ZÉÝ/ãÉËI¿ŒÂWÀ1 âEx'ÃW÷=c¬ ²6u_SÄ»ø›·7Œ;¸Ipƒb>†[ÿNóд0ÈܹxÆT>íNàÞð:>£É¥.Ou渉½êÕ¸S›lJJ)cki‚Ûs¢È©.¾Sg£DëFÎQVlé_«æu¶öR¹R嘞GØmÄì€ ©$¼×:A¾øÂ°‡‰§¾¹#0.ÏrÓñT¦OÚ“Z߇„ïwj+Êd²yÖºò‘©®“ÝÁ–+i”±|2%Ë0¦¨–FVR’£…Y'ç×G ?¯¨i޳u ÙCÓŒŽöˆ¯M È`¨ÛƒoXñ Õþ˜ö eë™2ÒËÅ!Æ>ÔˆMi{öˆÌ·/BxNtm}ÚTA­åus9Ó•Ã9*l©ê‰ëòîɤN,r.Õs£ÉKÒ´# †t‚«ºðå¾Ãõ™øêU¦2yyY(7]s|£ÑÑ斋«‚!w¹àÑòö¢ê¢ÕkN#«5 Ї+ø/±)a ekWøÙý¸ áÜHžÓywÅéÞ;¼4[¾xÚÅù;p×½!¨ UÄ’¨¼s›#¤„¾{a\®ã2þW“Á±1ŒÁ¾&¦Ö¦ p‰P\ñφ¡Ãĺaú_f¤(e{– ÒމƒxÉÔ™^ÆK¼DzÒÿº¹â¶nýà¼soë+ ¿u)ÐŸŠ©¯_T¹öõ ’ö‹+ŨUe2ÚB·Ô³Óm†xZæsÄr|§wå>y8^ÅéïÍñz›Mì6FoïlŒaLh4ZSQ<Ìl*•r½©Ù*cøÝë6¾M¿¤àIœxøtK0aÆrÏ<Ó²A¥%¦n¯ˆ”X&—“ ¨\Ùik,ÿÆ8¦ÐØŒÅ\¬Ãâ‘9ï‡iu Y6]s¬j\á¾³EŠÖõ¡M6˜ûªÛr‚¼Ø‹¡(ÈT"&DA*Á!W#…9%¦®ž‰¨ìgÇÅë0É}¸;´à¥^ûêv~Z²•’;Œ2¬Š´LÄ–+È ‘qcñk¶NsÃc;Ï/rœ)#4–K™¨é¼&Ö53ƒßžUlËUcRžP÷WÞŠÝ,IPÔdÆŽr§V4ª‡=c€°°)Y6&paÌ U+*PÕsWk~ªšR¯[‚À)@: ,¦ÌpºÙÊ£šÎ¡kÔ£D/¨QPÆ£ÂjU&É¥©æR|ˆ§À´4Hhƒ¥kZ˜Zô™BB{¦RyÏ26¢p~ÄkWƒj.¡GÇn¢[K\£Õ‡²¤8Í®f¢ p¶ cºÎd<ŸÞF‚PAÔƒULW/;2kk²7Ê?„&êÊKÀ*NWUÿ•+½Ñ!^S†®ÑãdƒbUÙ+%¥ãuŒYrf„1ÖÄFOE)áû♨¥a¬ä8ãG –2­Žq05&œ‚7Ú>´-}$¾/ÔÕpâ;ãþP‘–G»)7}[˺–³Æ@¨Û×Û¸±×PMŽÉYc ´×äõåÊëf2¾q¡Þ?'Í™ Ý©QðúÙr±>uÏ¥ÛêºiŒ|b[Û›a«woNÑÑî˜S!ÞÁ´oœªÙY]0:þÙ=ÒK‘œ~šû…ô¶¹DnÃQÞ>ÊÇ“ìýPb¾{½tSÝáë G쨴?øçHÙó‘yªéHÏfü¡';g@v#> uœßôÒÞ¾ïOŠ$¬ Ä1iÂF‡jzÀ'±Ëãä…c8<ü¦ÇV—tô³Äjážþ}ÜñpÑv½•„x6Œ½DƒÉÒ%Øa¨BØa,é ã…g ì®Ó E—¾Á0ÀŒ1«=¡Æ/F8×Y=™$`ƒ¿ù®ß}¿¿dï­'. xƒ~ÊKxD1¤ç/Ù7[áÐÓûWRiÝ—Hê9ß×ÛÚý%Ü‹ë endstream endobj 7476 0 obj 5148 endobj 7479 0 obj << /Type /Page /Parent 2 0 R /Contents 7480 0 R /Resources 7482 0 R /Annots 7483 0 R /MediaBox [0 0 595 842] >> endobj 7482 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 7483 0 obj [ ] endobj 7480 0 obj << /Length 7481 0 R /Filter /FlateDecode >> stream xœí]MÜÆ½Ï¯˜sØì&›‚ZÉ C€…È!È!ãFldãCþ~8Crv—œ×3ýXÕ$giÁ–,.›ÕUÕõ]Õÿøíïûþ¶ÿøùÛöß»ß?Ûe_dí?û㯯ÿ"¯ÝŸ÷¾*ößÙ=ïŸw»Çæ¿Ï»ö…oŸÿÜüéû|ÿ§æßŸ÷ý[ó—?v?tü_vÞøæ÷Ÿ~¯½iþ”?þý¿vùÝþ×ãŠýç:`Þþÿç¬wþÆ•O?ïúmšÓ¯ß¾ÿºûØ" î+Uå]íöÆÙæ?µË÷ÿýÇî§æýòÙ¡vÆøÒùlʇ|Þ~)ß›¼nV2nô¡Ó/¡å/³BoñäâX1¶4áÕ%‰[U‹ _j ¿_]ýÞZEÆ9B.”ž´pqIÊV.ëÐã5ô²¼üâUfôo!ÇJO[¼º q«¬´zÇöeu Ú«'ZÈ•Ž-^\’²¦6Š”=¯®ü¼,Ùæ¹eáâ’”µ¦R´£^-¯°¸³Š|s‚\ËŽ ¬.I\Wõ"³±Jð_)JäÒèÉ-äâX鉋W—$nYVšÄ}Y^añ*S´ÓN«¯.IÜÊw¢­ðè÷Š‚³Î½"ã!—FJOZ¸¸$ek_+šRçÕ_g…Sd›#äZ¦\\²µÉJ½3û²ºeM©îj!W:³xqIÊæÆ)ªÚWË+,n"ßœ ×RµÕ%‰kkÅ`ãËêèw^Ïo!WÈ£ÅcÁ´RÏžv¿wŒð•û§ŸØNßl{jPRì?4öA‘û§÷¿Ï2ûõû§Ÿwõ¡Ì‹Äö‰qðIžd?À'Ÿã¿cËÓ“ž´ªcĹ É,z’?Àwrø¤Š‡Àù+XŒZ-¯!lŸàjð;x§ ¿äuB~)m¿ éøó <[x5‡ß!Nª3Zp§˜ÿï@3ÿ;NJCá*¿U"ÀS`\v¦´¾¦?è¾,Nð muh<œ·O²– ì¡pe勱¨©†rÚ-U¼Ý«…˗ć=|Ç!:ê_z§åæâ`óʼ}÷ÓñìËÖ ^ —·|‡@~êmGßí;F†‰­¡%úBSò)8¼Iᯌ1±7—³¶ A¥–ÃMqÈjûÖÎüWkO’ÉûG·@0Š:ãhöb°¯Á³Çvdù!€&; AAaÏ‘Y-‚ê|XkÎøàÌ¢XQ½¦è·ˆÌ…æl‰¢:;ýBr!Ãióó-Ìù3YæÀ;« ’Í_£ÁŠ’ \)ý@Lð$…–¯ËœLX3`s© êLKÔž­+jJØÓ]™ä%›¡¸B'ÍT˜³CÅ™JnaIÃèãÛ9- 8‰ly “JfÙ’ÂÙ¨€Æ&$œÁçc¶úU:Ôñ±ƒÈiÏäJU:“M(“ÄÕ› †UqɡŔ]«°QÜtå›ÞSÖq¨†âžrÃF‹Œ€¨ƒk¿ •Î< ("03v_DËé”*þ1I$+œé,X°‡­NÆ Ðf*BÇÇäN«©Ùe̵ˆæŒóD)ªABÖ†PW§eV ôi yÓŠð½¨2ÝTyÏ‘WÑ]1Eüú/v ¸»³3tç[êÅU~zn”í%[k|gÅÀ²I7ƒ9çÍ0ºnoC ,"›À íù¨]EÒÆÓø‚Šr1ÄÖå?ªK•pÕ™L‚p6@Šfæ=«:ñÞ¬[Â"ói1‘\ ,ÃwÝ‚sE‘'ÒŸÈi·÷§rcü¹ÙÚšukR¶$UÞ¾#®<·JÀÂñ@y8ѬaqSnn`JñҤίÂ(æO4u7Ù„ dµ9·ÔÁÙaIáqõªÏS²¹‡ ÏS]VÎS* ƒ„’òoåž§p˜±ÊÜy<a;a{ëýYÛóO°ÒÎú-.Û R®+òªœ;#&¦ÑQÏëá7)"cŽ$Ü"l«ª˜zžÕ ” 0­Ìyx[BS·˜¡rIñM7ÄÍæ»NµUª¬.ûc¹àq '|WÆL™yhx—°° ™ ™À~€Üìï+v·ñt¬¾·&bnßíæöU7B÷Ì;¤–~Ç–sˆnêòýäÒ–ì¼-£Ž•gYŸgÒ 1,Eab}yY˜h~³ °ÙO—vQÄt<Ü—iÌËìÇ{•Ì.fpC3©~“)„˜í– ™ERÍ}Å]‰b;&_÷$ÕÀ€ES5ÄHOѲø ³y3šÍ~íTû׺öûÊôXJ$e@)Ïû Ò‡æMúU¹ë‹@R%;sÑù…9€)pzÒ$0_(v-­«?34Ñ“ _Ñ©øe'Š–¾Pó?ð¼Æ(¥B¨‚ŽôÔÇÔaÌÔ[Dy@ÀÖˆ¨홥ÚeCg·'Ø©~Eìy2±4¢#ÆòKÕˆ¥[º0ÿ…Õ6î»{-‘~wÑ’± M½TçÅ´€àbª8 ÃȲ†Ð„T÷ÙCxL´Gw”¦àXáã&DŒY¦3sMRx¶É*ÌPø€øaÄ\D·Ÿî©‹é‰ÔšYÔCE·ªnË„1E[¬áΧ”Ejö%S·©mEjS8©ª'pi^0M²„RÍegÁOD<-Žxb©)LEI ã¸3Ì%žÀn›#öˆ;c\C¨™è²Ã÷Ý]{G?†ìÊsêkÕåÔ ªÛ«bcî¡M>Ú‚ë RàXH]‹ìíÃ1õSÍ_CÕ ÊÆø‚á8=1ö5à;Šrñ÷Aåv ß©)ÌÀÌ”Øù¥üìµü“¨’í3pîgÃÑ..M$Ë)±Qï†e!­¨áùD›’.‡´•ˆœºòŸhy5uÆòÍ!‰ÆIÆO—6DÐvm“»MÖŽî~¥@—l¯à'#Ûƒ)?Â?Æ1”Mëè:8²úü6Qº˜²*æn&s³À¤ë T(Ì6Pa€» T¸ ‚çE–‘«* 7“røÎ–Åš@“óðÓÜ&üêy¼gÇ úYŽÒù·^ý@U•›Ì<'¤(L`NH9üæ½ —Xl›ýœW¦H(¤:D£ÿ÷ÚRp5À¦:ÏdÅl©xê^(¦k^w΂ððŒ¦Ó›¹ Ó6b°WªØä ªçg‹çÝki> endobj 7493 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7494 0 obj [ ] endobj 7491 0 obj << /Length 7492 0 R /Filter /FlateDecode >> stream xœí]Íoݸ¿¿¿Bçy?D‰@±@bÇz(`$@EEv·Å¢»¨»‡þûÕ{¢ägI¿‘4R²­‰Gk8š9Ÿüø§¯ÿÈþù{öñîë²ïáûÝ×S~.‹¼ù“]¾>Ü~ «sø9+«"ûþëé){:=žëŸNÍ_ïþRÿô¿Lg®ÿþ’ýíïõ‡?†_ºü¯§R•õ÷_¿ûRÕ?åÝ÷Ëçÿ:ýõÙoˆít™—ÿÿ`­-UuAcbê§Sûšêúõû÷ßN,›¥ª¼5.SÖØLy«³ÿþtú¹ž ŸŸ½Uªt¶Ì×LTêËLÆW™Ò¾¦µÌsý’®"·¥‰üй4Q”qŠ.ÉÙB9ÛAA|W øóXœ…À%9[š@­«êÀÇ ¾/ÊxÀ¯˜‹S¥å-†.Ç\_êsë¤It^žþ>×*sæâTi˜KA—d®Ém 1Hô >ðë™$ð+æâTi™‹¡K2×VñŽR7Ðc¿pÑŽRó8.\’³®hi_Æ Ð3øÀ+øsqª´¼ÅÐ%™[Uª!P}2‰@þz ò{q¿½b.M”–µ¸$g½o²ÊÆ ¾vNöJå5òsqª´¼ÅЙ«´1™{>pcã¥Ìc1wýq ŒJó p®=~þvúø ¬ª‰é²o?×È]çl¾}«‰Rd.΢¢þßÙóÜ<ü}ûåäÏN-ŠÍˆ²h$¿ƒÏ88RAh_àÈ=cˆµú¼üûibäË·šåë¸å«l~eU‘-9š—®Î—ÃÀŸ> ™¢>†ðEÇÙ=xD–ÙÇÈÎGàb$ä >ÃQb„ªÒ’ª K¼ÐŒZŽöŒ÷™Zsi´PY®ÐBí ±¼” IÂXãg¦d,þfäŒnÉÞC©sa]U7hâmª!®=[Ó8û¯6òŒýŸ¹C#¦eH銦™§,1í[ÌO¼`‰FðâÌ\F6#–ådg@m’äU±B’vp’fd¿¸áoˆ5q’NÉGcÛY±îJ­õS;e\ÇèÐM(ý"PZ8M”=È {l–øL<ƒó4ëѶÉʧü%‰¶e£pa{G¯NæÖ¬iåÔ ZéT[c"— mj£MÃÇ*?ø8çÀ”32ÐŒÄ!- ï½?x¿N³c#Žcv‰å%Ló^©5¥Â,Þ‹¢nEB*šò ëU¸2 ´â„Þ¡S„#¿„“'•dóÏí6™Ñ^KlÙ:_tÂ3”òöå:‰íðµ·[7Î—Ž”ÐÌ(å‹Ï$ª¨ÂÅ–"¥zÛ§{ó Ò`Dɉç$y˺iRÿ ˆÂÉú”­:d¹údËYãfòcUùóÍò'V6µuUínIôr¶Nå€ü['Л۱¹Ië=¢G =(ˆ-ŒÑÀeœ¦!Û•]Kô“`m™ýzÖÊÃ]# 4B@µ(h£Ú¤)E¡mo#ÂzœÎ/˜Üx·Á# ¢­œS g+–­9È=NÝæ D´ú­Ö8q,÷íOWGü|µÌtÞð=džzœÜÆéƒ»ƒ‚¬š'ÿ(È )W%è1268­I9TÜs‚6nëÉi.¼ïrªZƺˆÀû‘±T©«„Nb¤T§” «Ú‚åÍSJkd\›Â}cg“­òYÆÀVžû:+wí+äDrDü‹ïÍïG4Þ`x9¾B¢wÍ–†J¡×$¯&3 pèaj·l~A*žæøø´—£sšhó+pûÔ2±Þ\;È¸Š¢±û¬Ö;nÞ‘pû>«¸Çèæ}VƒŸl$ïN)=hÁE?2BôLm_ž ˆ4ŒaÐÌãÎFéуàØ<kÜQ6O•ŸèLg]â$ ,ʼnØ"mô»ÒíPÿ¥c™œh4ç,½¤%;´ð±;Uö…pÓÏœiÍË!+¶Å©²²)ñ<œxvªfÎŒP–Wˆ‘(Ár-ÈcÁìg4ZÅÞ;araÝÅpZpæ™t1FM#Ñý]òèž:g™¿¦žío*¡ ‰SÀyõÓ]椺&5e–ÀMŸjÜHhj$ ¦º«YNC›{9/XfE]B„SÔ™—*/åiʽ-Puoï ’^¹Þ”c¾Ñ‹3öx ¤¬Á1ÞgŸK&I£ålOoØ+µÕ>o¤B2eæ—W]áÞæ)ñ„‰/šñ@dü$2bqwjœÛ”"‘°óίYâ²÷F&Ên~#:%‘…gúr²ý’KâC‹CkÕëÄÉØÄ1‹—Hy ©Ò¾ìÑ7±šŽiX7[v„»!$`*|ëJ÷ÞšUsÎésŰÅX–hÖÇ©´ ojûZsìS’mÑ1ߺa¹¹° ˆ‘Å&.YJ¡uÔºu‰hÐ]{H8:K¤¾N"*¡aªrÝÕ†2 "R°¹¶ƒ²Ñrƒ{àr®cTg{±KÎEvÒ¬ŒU·r¤Ê|À ;ÿce°VƶñÚ+cÕ,©|¯t7á”°A.X±æª3¤bÕ.ÛKÅ®5éN¥‚vd+eÚt)¢²Š“ô#ÅZÐ ›°8Eãv,§EÜ«íˆ01§Ý&à /Ž>jyò%¦('Ùˆó!1ÃUxÊu(§+ªÕó-";¨¨þŸÁ•Î  ùÜ K!œêh\µÌªŽ†µãR‡ œ‡À­”|â~åö4Qº(oD%ºƒóÜÃ7Mô>œúyõbÍ™K<ÐBM¦[üÓ¤îÚØÉvŽ“-ÞA ¹T‰»²óˆÞ³¤A1ÒY¦‡œØ+ã0G´ÛX0ÕáÍg-kžˆ#\þ‚5Çâæˆè3C"–,ØŸŒLǬÓW®·ã ßžÅ1¶9ífDÛŠ¼®ŠµÅׇó˜2:®]wí»IÛÖ0ú´ç„n|³îdB÷>=þX0­áqW1n˜ª¯Œ»hFÔƒX œuÊé ¿‡{Ö•®ºJõw£¹ äÉöš«ÀúöÐ\‡æzÖËòN°$Ni¡eó@ê=LÒÝ„®LþþÊë4äÖöÚîýè´CÛñ´±NñûÀŒܱ)©zÎ¥~7ZȪר…,¤¨…\xšKX Á³>U#PÞXç',! Ù!.²Àû.\ ødEt8âªÓê¯ì©V^¤n{œú…žêj´ÂP™s®.¾ÉL·'°–3æ€lÞµñö5üÖgÝ´âðÁ GB6}vƒXuƒÁX àÍc¦‚"c¸=„7EîY\hŸQÊ!²mšËàƒhàø7Ž1¼†ÂÐà3Ay¨E¯~SæË¸ËÏ5Æ-£!í‚s‘`hXŒ‡ÂŽÅSÒKIP¢#Ë€À΂¬cÏ`` Æ’Uõ–!PýC¼×=Z+üÌ瀽ë_‚G0n!Ä>¦, 1ýÌ2Á#‰¡Ö¸=>s×l™›sÐ÷//ÔÒ¾vðð…oj×ËOÿø¹Dñ endstream endobj 7492 0 obj 3371 endobj 7496 0 obj [459 /XYZ 38.2500000 632.750000 0] endobj 7497 0 obj [459 /XYZ 38.2500000 632.750000 0] endobj 7498 0 obj [459 /XYZ 38.2500000 98 0] endobj 7499 0 obj [459 /XYZ 38.2500000 98 0] endobj 7495 0 obj << /Type /Page /Parent 2 0 R /Contents 7500 0 R /Resources 7502 0 R /Annots 7503 0 R /MediaBox [0 0 595 842] >> endobj 7502 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 7503 0 obj [ ] endobj 7500 0 obj << /Length 7501 0 R /Filter /FlateDecode >> stream xœí][oÜÆ}ß_ÁçYs.’@À–å}( X@Š>NÒ"¨ƒªyèß/wI®$’gÈ9úfÈÕ2FbGcÎí»_çß¾þ#ûçïÙ‡»¯ÿɾu¿ß}=äDzÈÛ²Ó¯^þ@WÇîÏYYٷìéðpxhþûth?øz÷—æOÿËtöçæß_³¿ý½ùáOÝ_:ý…ï‡R•Íïÿ>ÿ^—ªùS~ùýôóþú‡ì·ÓŒýrÝf^ÿÿÖ®ªOÛ˜YúéÐSýþí·Ã‡öÂV©jeÊ*SÖØLÕVgÿýùðK³@?}~¬­R¥³eþ–…J}ZÉ)]733ZèüKhú“ÎÆ›ü¼sñ[QÆ)ÿì’ÀuʵTnè2{Œë/UoòóÎ¥/¥-œ\²•ë®§tîç2{ŒË¯MoòóÎ¥/¥‡,œ\²uUF„ìeö—¯s‘ÙŸw ²prAÈj¥zqUŒeúÛoÿyú“khÛ‹ßJ[Ïì’À5*"Ù>ÏãúMlÛG"[<¹$d­µ!{™=ÆåªŽ7ùyç± '—„lјƒñ {™=Æå;O÷nw ²prIȺºŠÙËì1.¿,MD´9í<dáä’­t¯ˆ4b]þ‚ž§0ym"âÍyçâ·ÒÃÏ. ܺÎc÷yzùÉÊ#ÒíyçÑ€;šý!d¼•ö'ÀaúäùðÓãá×FuqÙã/ÍÎÎ ¶¿=~?ØæN.ÒÚd?elöóñÇìñ׃=ZÓz‘O¯)Ï#Õ±ªÛ´x9r‡¾1í7õ±tÅàÓÎvùªÎ?0Ǻª|ùW­[‚ çèCÑûóHq4ºRK¿Á{+ÐIójp)žI04\ø–”%.^±ÂßÀ£cðãxvÍœ4,ðèžI0À†¤@M¡NЭpúËð m0t»pês8+Ñ-ñ«üèJušÉGÜ #q'¡s¡/t•ˆ­.Ï,§¿lÄi$IX™¡(TðíaUqÌkóúHX|~j¿ÑýÐ2ĸ‰(8F¹å²ÊƒüÏx8Жq=àºD¹£QC†c$öHìAaE(Âz£­‚Uø„yª-òÞ‹°eª5øwª½!ªUXnb)Œñ`ŽÃÖ´ 1ßp )]÷Æ×–)]ÚÔNéïÒ!†x° îM3< LH›V]mZµÓæN› @éˆå¦gb¢füã)ËsL§øHYŒV- c¥8׌?·¨]¿œcƒS»oLï _ò i‰Æ©=¸E‰˜À ˆÇ³B £$8|9x'Ë£*ž8ˆì0ÙÀD€Ö³“Ò9Ä*þK ·Hf”d‹ ˆY'XÝdPžD"°õî3 ¢d DoEîòí½âo/u¼#¶$f³uO`‰Â•ªóÉŒD8VÍ Vçë„ÐrUbhØÉ‘ Z𤛇VU&†Ö0Øä[Z3fbi{ϳp*£>§ªa`NÊ${Vá’ã4zÆÕÀàÃu›L-NŠÄ@f2Ø1šÉ–,ˆ¦Ž‘[ZØ?6–¸ØvæÑ3__77 ŠS åOüòCSׄÆNÆNЇò¤žÆÃ+R²~a€°EŠ ·ˆâˆ÷"˱ÇÐB–=rHb¯áãë¢OSÔYRdËò_¢xƒkʯŠo ~ v^gQ4U•ˆ&achyHɃF„VGõ!”+Ï7Dð" ÒN¦XI¢A…lý£@{D.Ö¤16o¸‘#™ˆëF1!õtL‘0E·»E*ÔxjË É&£‚ʸr @±rÞ1-Öõû¾NU4ºV'‘`å;Ñ_0º¥rûoZf¯ïæ]-§(²ÊKTŒ{žiÁÁôJŠï¤,ô@ „ôåaä€„×’Ñ °«¦ó Ür•©zê–uë%¯ò‹¹Ý¦Ç¨üت/˜C#9G=Ô#ðlžo>Âo*8RÃÙª^ž´áç){†?l¬‡Gð:}˽F| ¾1ø<ðvTK^åÑb ÚAGúSëÜ£o<{Ãß`(´7êŽFéÁ|†»Îá:wpo ­ÓÙWa÷w R¥%Tvâ¢ú‰éÃW¦cG F˜¤ënA8~@¸æ¨LQ÷Ð{‰`Hô8¢B¾ŒjËtÝ9`"7Q€>#Ò#ÏC”‰P•IމêˆvL§ ЀF…[ж¹J™ß,Ó¨“Á‘DÑl:…DAõqÞëZ„|o{]Ë5=Æ…=»L°íêf7Xö’°³_uéLlpb<Óe‰é#A”àœf/Ûj%õ¥]çíÀ÷êÉa÷ O)î#D”pá½m È£v}=N×ZmJO•¾!YELP$òƒ.¢)e•èE‘'ÂRm–É"‘ñ0OjáçP0¦`ìí®àI}d˜¢‰|; rRðy*]:×J$ZHÉŠWpcÚ»í#Ò¢®Y)NCM¦¾j*`[/¦q•gävš¸m˜š®Ú4‰n€è¼¶¯¯ãÊš‘D/vÇj,Ç*e,·oB²QwŸeÂV=ZÙòõÖÃ$f³XÑ#ë¿zbÒ½¡•s¯ iJ¼`qÉ(:ÂØ'T>UUÌB(Žl¼ Ö¹½‚»òà¦N‚sx^›X§àfWÁ$mÞ€I¸òìHšÓ=÷êÀpH+к¾ôGF0¯óRϺYl|܇|oPÙMè+6ÅKö§÷öù‘ý!¿8ô“†;¸·ø¾Sq‡\ÔS»š¹Y ›c<îÄWŽ­î-Ú¾*p"EùªÊ…ˆÔ OÝìòMç×Gîî­| b³BÝc®%²€BœíL4Ób˜¤ïÂSmΔYǽ%Ùì,ÙrLáf—²íZ‰xjʨõOå@œ ÷à­L[¿n{ž²¾ªçßêÅ`‘}‹Öudž‹4act°‘ÖD${žK#ÒZ=z›lßȽÐO¨Ð/¡ïÒ–—ØÁêE)Éž?¿¥²#m/¯níöîgýáÛ¾Ôu±bÆ'Rýûȳ\6 ŠºKÖÁú(š*ýTaÇn¢$Sœë³ ÆåôíÕ½¦Â OöȪX1ø\Ù¿)‡&ÿ–Š©‹ä©2¥mÛ+óð®ÍcuGö²É:P$ªX=¶ãbgÚøâê;"K>v^ûê}—©†¤Œ+‚y—N´˜ÔÃ'¤d<µþ™M6›-ŒˆÂ=…ëíºfiÔk¨OiÒDÚ 6Q=/NÁ :8+v.ê¤ø[hÖâÙö€K)ëkt„N‰×¡<]¢ú®Â>°«ôµmÀNØð½¥Ìšª. ½[ï¡R퉩+ع¯£`9 &ÕªØ1éš8atì˱çŽx<µðpìxüòLwCÙ©¬GøÖ´©øÞú\lë¤`½&NÒ&Dn  ¸:ò^5#Oƒc—f{WiMîú4²]ñžgWiç0©ÊwLº&Nxe*­Â©IëËäD¡X£LñÖìÀÄxFÙíØÙËš_×à\U³-ÑÈè ¾ÿšèú«Š¦É<’˜ªêfÅZ[¸ŸÞ[²Ä§î€'j9S%¬ßJ‰)é…Ðjmù¨!ToÇ€ïuܱÄõHÙXÞ±žz¡4U—SÑdµ5…eíê¡QP’Î0ºDyW£4O¦â½{¦c ñlŒI6" Q«#Ä`¤'¦TÙþ©Á fAOrÈfê 36Ùl_ÑN±¸c•ã ´Ã~¾»B°`³ë7$‰B‘Sçz€©r)e Û²MV™þÛëéîIf8ÓÓ=nîsˆÊƒYƒlkïQå³iÇN@›~FX½·øúÞ;eÆUlÑ%‘³ÅPOb€ð²Ær† 5<"ÌâV:Ê´@_~ÃÔëæ‰¦fÕƒ£K‘ÕGnØb 0ï:¤ùX€©rs~œÎi’Àž®ú'ìºÎyÔû=q»i2p÷p$YýZ¶H:¿¶½î ÿâ›Õh’E»DŸSòÜèr= mR¦˜( xHM´Œ×`NÕ €ÐOeoGØ C¹ˆúxV1cøÔS‘1Eãjו:'Á•ÓuªLÕ“îÙ6×Hë Ž|éEZ^zA›tG+Žz“³y¾ùˆ¾Á#¸š­êyÀPÔtoD4"m(¢ñ^§Þ€ΦÑHo§«í* åÔ7-·sGsFýE{ó¬“*l¥Ý¥tê”&l´-?AùþY§l?&¼7"R'ì¦`4°85­=ºã c Ó†²Ô™œl<£//Å ë¶Ë‘‰ydÅ‚ðn…`B¡ê¡ôJä Øœ¢n*Dÿ’Äá¸DUÌK+2þÿÙ§J<›¾'@š_ÙSæ¼\ìaî/,`sÕ—3 æêÄ2²ç¸D¯º3&ÆGl©_ukƒøœtO}t#CTAŒøŒÖ1s.‰©½}éNЏ&& ;”úØCçÆìp§ï`œœ8†Â³Áo:lUAGQÀÊ"ÜéÏÍŽ{@ûëz¬¡ž £€©!²c´Á· ïcIÇÍ'ÈÀ³¸Nç_ú߯`ŒYÕ€ <5¤Ϲú°Áhƒ þæS·ûQà½uÉCSÌBߟ‚º ñ\1äëñM4[ææØñûWÄ ¹4&^ó¢×ĬP{ÈÿF¤LV endstream endobj 7501 0 obj 4081 endobj 7505 0 obj [460 /XYZ 38.2500000 317 0] endobj 7506 0 obj [460 /XYZ 38.2500000 317 0] endobj 7504 0 obj << /Type /Page /Parent 2 0 R /Contents 7507 0 R /Resources 7509 0 R /Annots 7510 0 R /MediaBox [0 0 595 842] >> endobj 7509 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7510 0 obj [ ] endobj 7507 0 obj << /Length 7508 0 R /Filter /FlateDecode >> stream xœí]KoäÆ¾Ï¯à9Àβ|}È!€°rrÖv#6¢ø¿ÎIä|Eò›ê&‡¢[²ZÓªêzWõû?}ûGòÏß“÷Ÿ¾ý'ùÞ~ÿôí‹,mþIN_ï^þ–Çöç¤(³äû¯‡§äéðpx¨ÿûth>ðíÓ_êŸþ—ØäÏõ¿¿$û{ýËÛ?:ýÁ¯‡Âõ÷Ÿ¿W…©J/ßO¿ÿ×á¯H~;ÍØ-×næõÿ¿ó>Ïóô´‘¥ŸÝ1Íùë÷ï¿Þ7˜·JY9gÓÄxçSy›ü÷§ÃÏõÝôé±òƹ/Ò[*ìe%[¥‰³n°ÐùKgz`ò¼†M°ÉÏ;W‡Šq¹‘g×Dn^ù@Eø_¦0y™œü¼su¨tÈųk"·Êò@6­€è2}ø{¹ç«C¥C.ž]¹Þšú.[~1}€É/ÃM~Þ¹:TZä ³k"×›ªP•€ÐeöàÏŒ 7ùyçÚ@éP '×Älžwà©ÿÕÐóô&/³pÚT³su¨t¸Å³k"·J}Hžü<½þäYê2üó΃ñd<»"r³´l¹¦5Aà_†cÊ™­N~Þ¹:TZäg˜3 ÞJó`«? üøxxÿÕxS3O®7w^³ùöX%KÞì·Ì%?&LS[ý<þr¨Ž¹Íº-6#éW8òŽ”óGŒG#îœí#ù GÜü“šX¸ká<Í®¿<ÖdÃ5ùžûTá0†1UØùðM}DXUfwÂH1ŸJ-q"•â] ¸Çô‚1Œgƒ¸wp6aט[ÅÚu.O0v:]JÂðäDÄ›êmuÃM½Oyâà:[ã<ø3Kü7†óÜ)¬á­k➦Ìg–—g„ž…¡s§Ò¯ƒ5J^“ž÷™Ïå”/w95EwÀx$,IÁÎØ¬ñy2¸7Œ…G‹4Š%ÿòçy3òƒÂÏòçÙ¢lË‹7'Û~+œ[tØ.ÀÔGøÝ„½Áu°]°KþuS"#ù£ú¹Ê|ç(›åÙn1¬šÞbY Ëã4&OËÒlçi›åi{ôvž¶zÛyZžfýÎÓ¶ËÓ eçik ·§áiÞBäíÐØæx¡§íwfôÎävꉳŸrÏß›2ÛÖh^7†Â@ï Sˆ°‘#½‚$‘c3^•§xÀÖ¸¾›PûعùÃòðµsS½^5¨nUÍø´ÙLá_#ÎdÇ´r§æ"ý‹UË*=ï´„k#iPêÞ5-Lž×iFŒ9f>/ëÁ>dGgKój6w`Üü|ž–t®Œx‡ÎƒOšfç×ôňŸ?›·žBÔ6b¡ìsÂrÂNZ†qí\ðÄÃõ0Qa€B° Ä‹‘Ð?±ÿ=¶KvqX@¿÷êÂgõÅ›ˆöùŽáç¨î Øb "Šø"ÏnÀ°P¸J(~ä™{±ÅÜTœ¨ÁЋè*J†m\ÇLˆ”é¥À;ƒçÆÜÓ•‹xk׃Õ1ƒ:D¼ŪÃôX1pʪ¶é‡ùÚ£ qöuDAÑ„Z¸IáÔ¤±%‚7ëà:”²=00ü ™!,<˜~ð ÂLÓµ°ÙIÑ&ÂTeŒeaׄ 9ÃbŒ0ƒ6Z¼Iya^[Âл!°…FŸ6¶š°†dÌG ƒ cÏFÜ[e1t‡ ŸÃ`·† —‘`.£h (OiU=ḳ ä:•§¶{Ÿq½- æ3!D0c|±%0Ø? F)å4e|| '%ø F¥3Ó Q׉‰7Ë„HJ’ÏÛó¤£NYe!¬.®\$„Qw‚ÑÖ¾:ƒ9ÇUÎÊ\sZîµÐ6Ê(¿[á ‡™ÂúWŒ1Y_ÛX*ä¨ß7äm³ÆöÁ«*/fð0Êû¢ËÆŽÅ¢­ýíº…&¬£ë²aŒÝö<á}‘•Éo¥b™0ö°ì¯*{‰ÀÒþšI¶übébØh£ä/\gÕÖÛtç4¥È¨ò>—GÐT…ëi÷óm~ïpy>™wèØ=Œ–qÍj8.ÚtŒkÓcÕgFIÕu7ô¶CÞ8´VìmYØž©!]¢gÙô[y—’/2 ºsWõ@oƒ3áÜ÷פüä‹ç9 ¤¨ª¦EóªíΪÐê€À;k€‰x©ðÞ#@ ÉìDÒ¼p¥ƒ;|«t …ý–‹~u=ü¼‘2Ïè—˜I ŠeŽ j2tŒí›ÍX †”OÑÁq¶¦ÿÍI€Ä¼0#x»)‚WÖ]TX•¤œ?D„­¨) s/c˜ 8àSõ°9Ç÷@Ð4c{´E¸×”›{ Ê ´A8´]Ù£Îð_LŒt"ñýVø}èm‰ " 9:~8б¨³*/5ß{Éß‹:}Í?w ?l¯¨Ó§7f¿¢NÜí†ØÞ¼ÙÖ<oúÞ#oïû¹îû~ºx=ö|zS›æýRʉNHR…ÀoïØÇðÛhç!zŒáó´ø‰CË—†AŠãçÉç•rO€âMM¢i`D¯·XØæ´©]‹Ý¥8ÊM7—f"»ìç8ʪe?sž»•ýæÒTß:ìÝR–ýX2˜uË~siDÓr„àAo.¥C-z®u‚ f”ëtTº±àÁô¢nå– L¿Ë)Bo;{íÍ' Ü–F#$(1ç nuóêW[º½Êv@ó2]>íË5ªijÒ®eBº±*F…D!¦£›F Žnâ¶Ý ‹–­ Ò{bÊ)^˜„ž.Ì®7– ¯Òb@P&$«ö0€wp0׿©})Zgtûº¡&“…xqÙ [”éÚw• ¦úŒCóCaO”=(7ÅbRÖ&#žÐ%¶õøD§šõÕëÎJ:‚DâÅÛI¯hƒŠƒá¼KKÄnÜÑ‘8;-»ô:g8t 0-é‹[£Ò­…#sh*"øÃ½Jõ î-EþоÛXNÒzð=$DEà˜™ àŒ¦°9;:Å©šv”ëb:knÍŒlKÝÇét;ïèfh2I5:ÆQÜmF÷¬±îÖ<|Õ%\º ûv5Ù#!ƒ9×CÞ}å¥ÄëRä}6þü5SW&„pð:ô…®]¼Ïà4B×x㔨KÆA¬=ؼ›åóìÁæ@[)û¢«Þ\{HÙW[¥‘ÇîMNÝ´½zmñêµIñÉ 5f1*ÓmOVÍiÞ¿?Êå«Í®ž ª, j!_uò9WöàA%,b‚ct çÿŒ¨ ãóÏp:1>—nZ€î{¨‘ŵöäebª«õ6uÇYyyõäk‡ªFÇqs4Ò-;Ú¾a€g>ó}¦ǵÙ*8[Ù©¼ å½8OÑ©òƒ‡ሰNz1 zŸiÉèÚ®¢4y‡ùç7SAüXbŸàÈØÂ[ž¹íÚµ._ŽøÝåÜ;ÕN*”ûÇu¾×>ÖÁL•ˆ¼ÎH½¤Lޤž¾Þš“¨6‹„õ8V}Ìò½Vã´i¶¶/èTÓ²bù˜©…a±ZºéÖA,~3ïœÙÎðéj£PTv—‰–wz;oo§¢òcL â3ª”0Íf#$`¦­òF1©›³>Ÿjøšo¦FŒ—rfpQá¨ÑN`5‰Ð³Š Ö˜®¢^W•¿¼7²Â.|%?TE)Ñ6UW‹ØVO¿;(JFc~éI*dõã¼+œG†sÃq~—ê{pTÈ’¨8¸!÷, † ç_ß—à•B¦ †ÜðÆC˜úˆ‘u´q,27~nâí$^ˆŒOòîñp~o´“ÂÙÖ‘o_öz!`…ó´±4`p/œ‡àc̘\õ•p‘ÊÜ@ÔÈŠóí…¬zŒ-&GæÁS³ÁÏÄä/¥¹…*b4kœp[EÜψZ–|cLÿBÜÐ…pR M+•Q„«×2ÌHŠ œÖ,˜ÏاÀ´óaO,Òˆuæ•ëZ}S¯»b+–Ð?™VßB¥"|[ûlÕy'Å:bD¦ÊÆ}ËÛ+‚4è%¨Š.éÙgW­ny³ýNuúxOxd©¹å¥lG<Ç¡[s*ÜA¼Ô¨Ï#Ó·Ã[»„>̼þܾ×\3ÍÒçD`FîrÏ©(™¾~d:&∲jHiNb"äVNmÖM%añ˜f¼÷”—89ŒŠ Ç‚ÅôòJ† „NqDlsN±Øô+î=¼®ª/Ü1—r &Zåu™„_oû21l‹`!ýŒ!h•.àŒïbFy"ó„êÂÅÂý´OtwÐ/à%,òª ÷­•¶”ÌŒÝjKI]}ÂðIq;-ÕT ¦m£. RìeBպЉ˜ÊL›ÊלÎã0Ýk:OfŠjün-žÎíná¶½kH¦ÉLuQ¼Ôú9Œ¯j]¾sPÒv\ÀfÙÎÔ¸@ý•<Õh±ö0ö¬’òJ]­µ×DZï0éw½¸fH4û.®hí¹`¶év2iùp¤åJö˜ZŠh2F븱,“k{ûÚž™Yػ柷”ÂÍšö胶݇Ø|åÏ?Ó:̬£¿htÅÜéçzÇ¢!ìl6Ÿðl˜\‰“ †*„¦’–é\¹Âà:­óÚg0 0cÊ*{×@ ¨þÎÕ=O9˜Äaƒ?ó±Ý}ÞïÁ„GðÞÚØé5f1ˆág`h †\ã¥_‹½³EêŽ-¿uy!—.ï Ïã¨P{Hÿ÷,“3 endstream endobj 7508 0 obj 3855 endobj 7512 0 obj [461 /XYZ 31.5000000 94.2500000 0] endobj 7513 0 obj [461 /XYZ 38.2500000 737 0] endobj 7514 0 obj [461 /XYZ 38.2500000 476.750000 0] endobj 7515 0 obj [461 /XYZ 38.2500000 737 0] endobj 7516 0 obj [461 /XYZ 32.2500000 93.5000000 0] endobj 7517 0 obj [461 /XYZ 38.2500000 476.750000 0] endobj 7518 0 obj << /Type /Annot /Subtype /Link /Rect [329.250000 483.500000 369.750000 490.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 7511 0 obj << /Type /Page /Parent 2 0 R /Contents 7519 0 R /Resources 7521 0 R /Annots 7522 0 R /MediaBox [0 0 595 842] >> endobj 7521 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7522 0 obj [ 7518 0 R ] endobj 7519 0 obj << /Length 7520 0 R /Filter /FlateDecode >> stream xœí]K¯ÛÆÞëWh] 2çÁá( ľv. 6ÐEÑE‘4-‚$¨ÛEÿ~)‘Ô•H~CΧ3CJW Z;w.çqÞs^óî_þ¾ÿç÷ï>|ù÷þ‡îÏ_vÅ¡*‹öŸýñßï. ý¡ûû¾òåþ‡_wßößvŸwŸ›ÿÿ¶k?øòáÏÍßþ·×û?5ÿûyÿ׿5?ü±û¥ã/üº«TÕüùËéϺRÍߊóŸÇŸÿk÷—ßí;ÎØ/×mæú¿¿³¶rF·1³ô·]Luú÷¿?ü¶{× n_—Úé½²ÆîUmõþ?ÿØýÔ,ÐO_j«TålUܲP¥+¾Þ+]7`Wj´Ðé_™éSL®ë„“Ÿv.eœ Ï.‰\ë«@ÇUåAtž>ÅäÞ&œü´sq¨ôÈųK"ן©ß˜ðOÈ\®hþ#åw.•¹xvAä:åuBä^LŸ`r£lºÉO;O…ÜÀì’È5Î¥Dîëô &·µOH9Ç'C.ž]¹eYtjØ@D¯Ó'˜Ü9“nòÓÎÅ¡Ò#Ï.‰ÜJ¹”È}>Áä^'Tè§'C.ž]¹ÞwFI]¦¿Ogò¸º*ÎqçÒ@éQ 'ÄlUèNi••<|^gOüªð錩vçÒ@é0‹'?x×ýÿN.íë*Ó¬k•ߟ'ŸcæÀ0hü?ß¾ÿº{÷©ÙRƒD·ÿúS•Óší_d”ûïŽîŒªýqÿû¢0/Øýy÷ñk³õÛV­Á’¶8-iš3·Kߟ–´kZWÜñ÷N#Ú£‘â1ê4â_Õµ?8øºpº¼øUU <½®ál޼n þ*^XµçRæ`´WÍG X|<”ý'ÅM;(¬$PŠŠØ>)ž9)œ-€dŒ¼? e@ ê"ð¤lü:2܉Éóm;¢Ô¡´ÎWå$ YaŸYãó|ZŽuL³Üd¥@`oåiÄôX‰@rBUªr¨£†œ:"dÌÿ2&~á2ÜIU£_%(!ÀCo0Ào¬!˜m$Õ1‚¤Ö€,$àLj1¬cÉ€9k BÀÉÊ™€vftâ›ãÁÀ;ÈW©kŠlñ¤ÊCQ›kJÑšÊJ÷C‰,c̯ØìÈä ï%^˜Ù–±êCåÊ¥ dMõ©ŠÒ õ'¦úï‡"˜8À:Ò…Ø\'ƆËeÝ'—­“[?cI“逳j2ƒ/©Ìí§‡` ,Áx³„+‰ñ“޵±CB^®0©#I\z¨;Õ}*˜åÀgÍkQ¸¡ø}ìßåþØ™EÜR¶Æ!ø*àùÀ³á½³<ýM‰eú½ª'=mmdÊ=©6£ŠC[»À»C#›”= ÈáÙß|¾ ÌVÃÙ|/dÛpìè¶ÔPø0‹Gë´Ôêæ„íËoð®[Q®Çüëô™û;èøjÂØ›ª3Énk«~3/H䘖eꃆÁñ•y–)Ö*ì_n›„á¼¶®;`±Ü¬ö4‰ˆjѼÆn™,jì·g Ln>lu3Ñ&Y)[Ø!SºãÖï¡™\ÌÕ "Ÿ‚˜Êj$rï2dËj;TlŒ×;S¥löv£ÕÛLeP)áxÔª aj*Rn¥Õ³IŸòáÞåCf#)i"mï®8«VÆÚ–MJq˜3µÙ·s)–µ—Ç…ëçp؇—hîs'1L;C6ÑCt;-ƒÃιë%oô¾äM€O @] @d>uôÞºWÇ;é<;Sß¼ÀGð>Ò{K©ä½Àâ¦6"Q‚ØÑqŸõ«¢âÌ –.}ÌÀô]ÓRŸ¥6f9ÌÀï!ËUhDÃo0ÓcáÒ1SÔ7~.¢BLN -À°©g1ܤòì§ô׬7¹BÎC¬Âo00-búehÑâ“bêÁ´ˆOúŽÀótÞ¼ëƒ5à+¸¬6ÁsIÒçÈs$«®µQ ¼ë9÷ZùdÏûÉå<ÄmE%—¬¼ÝŒo“øyKòé^HïôuõÙÍ<#½z‹Ã)IÝIƒ8SªzL}S*!ÚeËÝÀ>y&…©nHÖ.™¡g*5ŒwíõM©A¬@*Ú¥®¹zNQŠn|k–î‰FnpY5U«´›Q±ïÕ=š,ˆ¥œú½¶“%K­§t_á>Õ½nPÑ…5'Fº ¶;têu¤_§¾©Ñ7àTö0ÒÖ/hä,NÆžVV‡ÚvÐ]¦Ö0Àëàót¢!n¸ëÎp˜úÆÀ88RÇã§oG2…žCG?u,œí„(„[:ÄlœBü0˜ PÄÆÃ%Šˆ¢k ÑnéC4ªê³a]z˜Vð¹íاLxgÇñìªbBNŠ÷ÌòöÌqdcžÑb p|϶ÝÞ-S€Œ UÜæ'ü]Q¨P®DÝÌúmùb(Sp Ÿ4þµŒ”j§ªzGV‚ÇÈMÑâ Ã)¶ ^$ŠèÙÓrp¤]°â#ü{ŒÞFi&I·Zη#eÚ™x¢Z)EØ~xŒAl…F´“mصr“Á”‘™Ò¯S™ú4&†¶h_¶ H¢•Óbò[À™èº;%~ƒx{íǽ¥ÛyK\B3R–:¶—_`©ÌÈhñ—ÁÙVxx‘Þ Éõ\õ~=H@gÊ (B\¦–Æ«§³â«KL¶6ã©ÍÔ7š¡‡Ä¯wn¹¾lÆDË_Ê|c’šˆã¥P1†ô˜Pï 3‰]¢>Žïa÷ØPRý—K¨5¯‰eÛ¿øB ŒO«º@¸Ši>DbÀžeX7bÓØj%®–ŒíB‰eQþ1QÅÊY#s+ëÒÊ„Ú%.A̹}êDiÛr»1ê´ÝÇõð͸°vÄß`§ˆHl&“O– çQ\ëÇT×ò›ÝC.ÏcyýN²¨ùwÿ­:A™ôyî-?ù®ZÃ7…:Ú)?¹Ý‚k)°š@f{Û×Ýö̼iAéÆ#’ÐÈ ¢ù­cæ.ÐS{ûÔÕ%áH…Ú¸@l*IUÏØ"X4MCáÙà7A«¨£_dówü{³ãÑvºŒ'L6˜lïöçcÛ‡³'ûÞX±Ä­Ï£æ˜eAúé,Ž)ÊòÖ pæÆñ¹,Zà:î6cbK %|Œå“7BBV°Ð ÄCøÝÕ&ŽT‡`+."i¬« sètà•@ƒ"( Ð. AgýçýçÝÿua|Š endstream endobj 7520 0 obj 4617 endobj 7524 0 obj [462 /XYZ 38.2500000 771.500000 0] endobj 7525 0 obj [462 /XYZ 38.2500000 442.250000 0] endobj 7526 0 obj [462 /XYZ 38.2500000 771.500000 0] endobj 7527 0 obj [462 /XYZ 38.2500000 442.250000 0] endobj 7528 0 obj << /Type /Annot /Subtype /Link /Rect [60 749 98.2500000 755.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 7529 0 obj << /Type /Annot /Subtype /Link /Rect [111.750000 749 156.750000 755.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 7523 0 obj << /Type /Page /Parent 2 0 R /Contents 7530 0 R /Resources 7532 0 R /Annots 7533 0 R /MediaBox [0 0 595 842] >> endobj 7532 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 7533 0 obj [ 7528 0 R 7529 0 R ] endobj 7530 0 obj << /Length 7531 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯ˜sÙ’M °’ì90, ‡E7›`±^DÙCþ~8ÃÇŒÈùšìÕMŽ4–×ÒÅf³ªºÞþúý¿~ß|üúŸý·öûã×]v(ó¬ù³?~}¸ü@»Cûó¾tùþÛ÷ÝËþe÷e÷¥þ÷e×Üðõñ¯õOÿÛëý_êÿ~Ùÿø÷úßÚ_:þÂ÷]©Êúû¯§ïU©êŸ²þûñóïþö‡ýoǻǵ›yýÿ¬uE¦Û˜xôË®{MuúúýÛo» žâªRgv¯¬©ÿ©¬Þÿ÷Ÿ»ŸëtËg‡Ê*U¶Ì–<¨ÔÇ'™ÂâÖVñ?í\*ÊÊ¿º$róL52:rûåcÀßÕ[޶øiçâPé‹W—D®+ó@eø÷ËË/î2oñfçâPé‹WD®Óy‘-_,aqãt¼ÅO;Å–=«K"÷$ØOÊÇÂ}9ˆÎËGX®ä£z}%?]1‡Ü®|uî@;´¼·¬@«©‡æÊŒã×/¼W³{¥º›½%]ÁWÇÏavm‰LQä§çúŒÅ9ÚäÃóaZÇ4øÃ€|ŒÒ†¥üªrˆô<‡Ú Ÿ7ú à^L_˜V l0<õçá›?IB-˜««„P4t÷tÐìAÕœü´í‹ÝèJV¶o¤‹üê) º§¥k÷Tðž†])}(Jõ ªÁPy0#<<ô¸«Ì+²2Âà!|o-õ\¹Gð}àT~%ƒ8mï‰Èi:A\•Ýf~€¿ Ññïåûª‘Æ¢æJÍ”³@Ù§–:Z’¾Ø¦êð9¤ö– U~È4í{vÚK‹4£–ŒUŠ¡Ýkœ±Á‡ã£ë ª§hÕ¾Vg]yùÁ¯»¯ÉuÓãgÚNxZ”Ý"}k­oˆÀ£ÀýÚÞžaš]W3Ü5¾2ûT‘ñêX«×>Ç-Ì=#¹=ƤGå…R…±¥ÆÌË„[2âÂ[‚¯á!oÈ”± 0Ëšwž-æyBô<S×|3ܳ<äæ˜f±•# Œi‰ñ’Þ˜d,9‘ýÝÈ/ª¡îí1W1üÓÃY±Î‡‘ˆMi†Xd‰’aË#R6½èqVb ÂÝ·ž‡ nlÊV/) ì¡„ùŒjÕEÓÁkΆ@ ðu9›Ù Û²²¯»ž5Ç„‚2v{b—)>¿„{Ûƒ€ðÃ^£‹5¥Üȧ”Td‡)¢˜ž†ÞÞd<Ë`'…Ã+Ÿà~¥•ƒW®˜®ö~Å󜇄/ª×çæÊ~4|SØ‚öàÞ&„ˆs“ÂWðÛ)L‹:ü9S˜V6+oV.iÞÃSž äñj¢oj¶{],Á}I_‰ ²N-©„oÂ#ÔWwSÎ$CË£dulþ…¸,±º„¡Ä¬†¡„Ÿ#ë ð6Nç»W8ºWX6‹gì—bü²˜5`D sÌ<8Ãn@ŒMâtÛOét±ÜØÄ6ª†ZÖh¶á•6e+º5Žuw¬moÂÏs³D‡ðõ` Z&ØSàyቦ±D†ÆRZty©_ë9ižZubÄ`[C[Ö˜CaºÂ÷ž.æá{6À ×—-x×çÒ…šA}·I—x×[ ¹Z¡;wJ®VØÎ‹œÊË)|:!·Ážg|Oë¢Å;‡ŠB±Å"_þmê‘ð9Ó¿ ?Iùëüò)ù]™å›Ñâ6Í Ëå­qB[[?Vè¡^„šæcÛ[—¥¶“ûYŸãz(ö6©"¡)mçQJ*A ú¬'’ëçÜ¥G!,¶Ž†XØ<ÏïC=wÛ€“Tëó€õi9¥ sYÿT16‘5äòÞ‚ñP*kH"yÿĽ7Päƒï‘(“c²ð•€N+L²•'C¶ É“JÛ&"¬j~‰‚H2UZ3?OσœþA ΓÁ‡I”ÈE¢r¹ˆ¹(i3Qô@ÐÝVBQ¹fkÌds‡ççìyèJ´q€G0HH1taÊNcT]”$&Ì«².ip\[p¸š[cØ®'|úžªh‰`ëû ›ËcÁ11xü¦S‘•4”¤Ë%”$ÿ`¬w|}c96¡½]ÙbUl:b'š»àñb¸¥<ÝE§Ûi“ð©ÎÞõ¤òá- ‘°ÕŠdv5ˆº§æ ŸªõkºŠîtYÙ7Ø9÷ÝÖã¦iâµ|Ùö”uÏÔauŸ)ÔKäÇ-á‹m¤0„‘ÈÖªÕ¶Y §FŠVßÎh¬ð©â3";5e9Ø'ňØ3?Ãx·CH3ºÏæCòvIA‡{–Y Ñ+Œ ñŸ1r`3Íe‹1qÀˆ …¼†¨˜–mn'"r)‰ˆRj¨D{×õŽzÀîE•4¦!#ú 8`T¾€>ŒŒ*FÄ)ç58#,«Üu”7JóLsAFâ2ÌÊÃÆF]õD¡P›•J܆‚97²Y‚Û‹c‹C–!D‘ü¢€6jq$;“ŠQÈo2·FÆÐë*8å<7' Èå[Y#Ž>hÊ)ÓÛ˜ëšz‚÷ÀaNm®­ÊÑtq|ŸÖÒRE÷ó8‚ ­¢FPÁxMepox<¼‡‚[…÷¦oUö™¿ýÜ­Q·¾i7c@ï-,9Ó*×BòžLfä|nËÃ÷,ïh‰hL>˜hFÇ}÷5é’®ÓªÓμ¦Ï°~ª¸_N'¦[¤š“pJ‰3Y?AöãÃÓC 1I'î{p/Vu:"zÉÜ–w5ýÚ; ‘ œ'L¥Ä|—Íã$Ì –U]“RLgüG"fLJ g‹% S”„]suKºS½[±|IÕ¯r•÷Q7My?7eÏÛ\/饜ª?»‡J™þì«KÒ„½Ö]~žÏI`÷fprçC7À‡úɪr|hBW*Tß»mÆ¢;Åç œ-G„‰^ԘƛLöQƸä×O>§JAW¯zÙà Ã÷9N 1çÖO€”%&‘´&® ;ú0~°P¹•Í&à ó‘øµÙQdŽ€…'Ü–JŒÉ%Ñc¾(m“ˆë7?`2WqÌ)U+pQJn !𡱾ºþöƒí"’u³UWE­Ê¬«å|80¬çÏ¿½x~QŽô=žŸ ò®‹þÝãù DÊ~Š/£öL–º’æíúɲ[ŽÀkf>¯è|È­GíË~웤Ò~BjŠœ„éý8ÛåøÜ£ñ-DŠlD’E@ )/MůRÆF]Y-À½'6J`ëõr‘MÄF뿬ÒÍ»v•šA?V[•ý䵿Ú1ãј0èxT2ÓŒ@´Kˆ—F¤!n@})1e"v}Þáz pLTQQä´½€WlÓ Rmµþ亸uÛÛ\¨ä©hfŽ–l“õùþý»/WÊ—+:Ñ…©0¤f?2N&†ƒ L¦Ë–szDR ÞZ^XªfØï¤#JÌŽ[Æ …âêJI¤n/7)Û)~Éì`~ÓDª‘ŸìÞpžó¹Õ¥ddÝb‘Žªh3H’Ä<1Ö‘™ùÒÆ…à]¶h·”¼ hæ$_Mà%¬ú0Óm´Ý)ŠÁ¾“iL“.O—ÑÄÉwœ'[ ³Á^¼!“;ýn)OÄqªL÷EÕR+ãˆ^½ñ ,'z#úy¡\Fï—.éøNÍ=]`[Ê:"¨Z¹h1Å ©*$‚ ¢fÛÝ•$0¥HÀØ#ÌL~ðÌì¹ÉúÍTÑ|“ ±~§]Ïô(l§›É=ixˈ OQ¥èäà{4rÍhdœvÞ²ncÑ“d:XÜ ¯¡)¹~H;_CRH¶PUe3’mqZ°'¦9ãr\ÔƒSj=éêðÓ©‰ÔhO¢õÔû$Á°:·!À)¾8•¦c×å9õ×þ¥F‹k_¦~a†ˆr×Pjj…&SGõkß·íkð¯‰êfßåáÕhRú Õ鈚‹ñ•¶|IZõï¦ Ѝ'ô3e/_ÛÛçöM‘Š•-{ÞR6a•ãl úÚòå„6tå5^ ÞÓê!*èÕ/ªÜX‚;þ\ï¸C4„]Û).ˆ0Ù`°¼›Ï/Ÿ÷Ö²‰+„‹áÝŠ¬Ã…=¾šÒ¥( ÒOËÆ¯Q–ÏÉœ"°s.‹øœ62mÆÄ4æJø5æ/âAÜ XÁLƒ`[ á·ÆK©ÁÖ>x+3sheà+†Yfh-lµ)M`ÿe÷Î@Š endstream endobj 7531 0 obj 3984 endobj 7535 0 obj [463 /XYZ 32.2500000 319.250000 0] endobj 7536 0 obj [463 /XYZ 31.5000000 320.750000 0] endobj 7534 0 obj << /Type /Page /Parent 2 0 R /Contents 7537 0 R /Resources 7539 0 R /Annots 7540 0 R /MediaBox [0 0 595 842] >> endobj 7539 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7540 0 obj [ ] endobj 7537 0 obj << /Length 7538 0 R /Filter /FlateDecode >> stream xœí]IoÝȾ¿_Ás?³n@`$Kr`Ø@A'“`D™Cþ~ÈÇE~$¿&û{ÕM>‰–m-{©ª®ª®õã¿ü=ùçoÉÇÇ/ÿI¾uŸ¿œÒs‘¥íŸ¤ùøðýtyî¾NŠ2K¾ýrzI^NŸOŸëÿ_Ní _ÿ\õ¿D'ªÿýœüõoõì~©ù…_N…*êÏÿ¾|® U•Ÿ›Ÿÿëô—ß%¿6#öÓu‹¹þþƒµUV˜f S¿œúmªËÇoß~=}là7KYUÊæ‰²Æ&ª²:ùï?N?ÕôççÊ*Uä¶Ho™¨ÐÍLi3“®ê‘ªl2ÑåChøƒk›†ü²rq¨(“+÷è’ÈÕ•î”M©HþÃð·Ö¤œfåâPé‘‹G—Dným ­Ëðï‡ÿB‡¤œfåâPé‘‹G—DnQ™'÷uøƒ×G7 å4+vrñè’È­ª<$r_‡—¼JSe‹€”Så‘‹GCn u|³È€=n ¥Oõ+—ʵ®ÁÏeÞý_“S—ͼVUµž®Ê$,M٢ú¼Žþýè!ОåU¸Á/+—JOSppIÌæZÄì0zà* Ù\V ³ppIÌyÙǘІ0xý7 Ý4+‡J[<º$r«L<¶ÃèÀ¯ÂYdú•‡:¶ãÁ?û ‚WÒþ˜õ^/>|=}|®¥ Ê<ùúS½¶Ëœí§¯5H²äCcËËëï~L~ßèÎH¾þ|ªÎ¹Îú%.=1z’>ø?aV  øN Ÿäp48Oª! ªË“§¯5ʃc«¨úY?ía=Z‘)ã;UþøNŸà;˜®ðÚ 8Þ1áñX$Ú´EbÍ;p´SªìœV¦ñy¼.³}RžË*½¬t|0æžðÉãå‰=[ÓzV^çiŸ(uÎl^ÖǨÊÎF—êj4W Œÿ¼Ÿ‰^ûIÛcaúíÜÓe‘g£wºýŒ¹ßÌÄÖÀÅâmL†ÇX‡xÂÕ%šX¥pƒŽmäh4çIËÑÖIôa=ü,AKp_Âg®cƒÂAC;~?a †™&…~‚¬¨Ä„Áíñ!qÈ LC˜'?†…™ÖcY8fy6!”>²x´ +"ΰ°$—8º‚d`.+¬†¼¯mLTÔqÇr`=8à7dò|„A$«pa€âµ1PÂïÀyÒ… ?Y)棡à㊠ŽæØ ÞÞú'ÿód±VIf‰e”UU™e†Ç«ÑªÚû³2ýžVfEöI @Ëö £³žÌž;$ïѺõ"ÖÞÅXl*«àhØbÃØXýGÃÖ¤ïZôwÚ­8T‘›VYÄYK}-bhËRÏövŘüÁ¦êàS…`eB«7Uº p¸"ƒ9޹êæ‘— u½Í‘²æ¶JòœU(ì¥Ó/Æ„…­“ÄåÌq %¬ûŽ+²è5TÖOoÍÄ@Âl]Ô@1 fÕû³AuNæÜROÔxb|±;&øõº Á¹@Ã4&~Q‹c$™‚óÌპͻ%¥¢$¬˜ÿS&`b"^×hKŒJu/‰!øõ„è¨pIŒÉ¯ÓÞUzÎ µÖÅ íc”[”ñ"¯?ë”Z¸™fŒé|"«&'KŠõÞJ÷ÁÑ>mé /L¶„)Ø'!á6ÞùÞK~çFöL—=uFö"¶¸ˆtv•8Éó r˜Ó7iVÌÊ^JÅt;äé-.0õ´xÇ´˜ë-\`¹½Å&ÌñhØÕ†±JмƣAúÅç„9 ±’Fö!•óügßÁ £sB¼Ó8ôRPs®˜µª®©4¼ó±Èz!Úí2’—ÁaÀûñ°â‰ñý–±À0–/Y C>ÆzlB`âÐñ‰u²ÆzƒäÄúÄ·<ÌœLV ƒlÑœ3*“:!(÷&^Â\Øé˜sñL BØü‡Ef2%&×#Y(,£˜À&DBtž›|\D4×Iq,ûì ;ø‡y´,ÊÍR²D©Z24ÃO¿"R‰àbâ ˆ´>ÞËï/«Šfù³’€bM¥VåÚS=7¿(¾—¤b¿­ãp€÷›©ºk§=sZoî p»>ÄÕÆ ¶/ W'¢WEÙ|q}QKÂÇGo@ èg_ý"¤À,ô˜FŠŌ])u~½ô9«<ôà4/‡õÉ’?ç³HáhØg‡Í™‰=SÚlq=Ž'[îÛ)~za¼R[S¦>ìaÅ;YP®ÌGJ¹×0†gâÑáˆ>·²47œõž{&yU8MzowpN žžd%¢X¶Ç¶lHDñiÄ£}ŠÇŸªT/®ÇÁp9Ï¥'qv§Õ5LƒÊÇ…[ZU A´ØC˜mD*B¾•{b$ó“XBYdÌx‘ÒšC'Ö…½òG»¦VÍ*F!PïàJ„E"u-<žìá 2jà;LP°C=Ä4J(Ž @]ãËZä‡ÛÙ[ʶ7–1>ž¼Á'·£NÉ ç4ÊoIï¤ø¿¨mÏÆ“CëÛ7RPºÊ¦éD¦Ñ8|£¼% š9GºUºïÄÓ¦gm= º™U¯N‚lØl3´µ:j=J×zÜ<\pë a“n î\‘°ï@§F«ñœëvõ4Ó£ž&©öð™J‚ ~øšÙ³‡/èœÙxN&®£‘¡Æ­²Ž¤?¿‚†°§£C×êÀ¥ûG7ÉÝG´t´lQQŸ´7ÑÔži4p¤2Ú;èl·•ššcW¼dRÏq÷]àòZäÃ(‚Xy•ÂEBEï¡c,Øu¥Ë»jO«}LC&åMí)™¬œ©‰‹Ú쥑Ðñd¯™w°¼¦õ2Y¾²ô†óÌpÎ> LÎ.؆a€³Ö˜2f8Û6ÅïdpžL,Œ`™ßšô¦æ·¢üçŠâÌÈ „dšYû;àOoí Áo-ÄÜ}ÒÎåÞámb&ï+:2&îÉ2žqú†5P""`(”Š:Ï)cˆ‡âý6ŠÓ `O™4“¹]ðñ !僶c¡ÏU`ïÜë {èU&útÿˆ— lîÜ<9`â#‚E*‚%b÷,"X¶oç†+}ãÑp#1"¦ÁQ7œ©O‹=ÑDMóh«†þÌ]¯G?žNìMtøZqH\-ð7Gk—Úp],®ç­áıQ€ßÁ±6Ô©Õbµ¡;T!•U’§}=Yñ¡8²JˆÝ¢w% Jól蚉•3ÝѪh{5²Á;Uð~0Ú¹ Ë‹[:!Sâ BÞ!ÎðéÒAôLÕ*µ¹™yÌRÞÃÜÚž»"ã1.àdǤ1·XÕm}ZLLÃá‹=³ …GƒïtÚ–òÚzñJ¶,Á5_§C€¨†°Ó™? h L˜p!&tJcZp`®ÍW¼6æ@Œ3û‰<†Ûb9øêãýkû>ë˜=wEjÎϾ:€ÓâؽÓI¯%É•|>ý{ÙE1 endstream endobj 7538 0 obj 3882 endobj 7542 0 obj [464 /XYZ 32.2500000 184.250000 0] endobj 7543 0 obj [464 /XYZ 31.5000000 185.750000 0] endobj 7541 0 obj << /Type /Page /Parent 2 0 R /Contents 7544 0 R /Resources 7546 0 R /Annots 7547 0 R /MediaBox [0 0 595 842] >> endobj 7546 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 7547 0 obj [ ] endobj 7544 0 obj << /Length 7545 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯà9ÀŽÙ²I X@–í9, ‡ ‡À»›`/¢ì!?œae‘ó5ÙŸª{H™lÉÓb?ªªë]Åwúü⟿ïî?ÿ§øâ¿ß>”GW•ýŸâôõ÷èæè.\S_¾žŠ§ÃÃá¡û÷éÐ?ðùþ/ÝOÿ+tñçîï¯ÅßþÞ}ø“ÿ¥Ó/|=8åºïÿ>oê~*‡ï§ÏÿuøëŠßN3^–ó›yùÿlUVÖž¶1³ôÓárLuþúýËo‡w=âViKU6M¡¬±…j­.þûóá—nËôå±µJ¹Úºò5 9}ZIénÝv3uÇ ¿„¦O0¹Q&Ýäç‹CE™Z…g—D®©«@m•ü—ÙS€ßVmBÂ9í\(ÔÂÉ%1[)³Ãì)€_—uºÉÏ;O…Y8¹$fëªIˆÙaöÀwUJ²9í<fáä’˜m´W®NŸaöÀoÚ„dsÞ¹4P.˜…“Kb¶­”1 ô<½üäºlÒÍyçâP¹àÏ.ˆ\­LB%êyö¸Õ:Õï<CÆ“KbV7þ^U.𛄷Ö—lN;—ʳprIÌš¦MÈ¿™>Áä•NI7§§bÈÙ%‘[9“!³§]'¼¶ç§bÈpòcSû?ðgréæ´®;Ý«š"©L»Ö]tóD5LŸï¦ª2ŒóÎÅ¡r¡ªÉì1³à­ôŸWíSàÁ÷‡wŸ:&V¿t;;/Ø{üz°ÝN¾»Ò?ìös÷cñøëÁ­éý×§ß;è”÷hĨóHóü«uÿÁ±iËZWßüª*Ñž^Yø \§thÄöϘc÷Sã^>v áuw¹“%¸Îºq£ûìOÕÏÛ{×X8âyÀµg¬Ôñ«2ý4âU˘À?žGª *'4“A¦š è ì͠Ϊ娳&žÓm‘7¥¥3Û˜Ä ¤3%®bÓó]j:«¬ZLgÝ¡òz@5Ñ0óÀè6c Äb.¬Þ/&cõ!þþXçqÖ©­‹õ¨9Fzmx×w£2ÒXøLQ ×±3ÜSçc'f¯é8ò(/#|_`UÃ(ð3>`HCò{˃aWÏc¸…;…Â[ÃgŒ˜ ÷öî k¥øˆa¼·½0Bb¡„pÃ8µbâpžú´²kS¢(‰¹˜Æð:ÓÿZÔô¨ó|ÓW k¯@ÄÝtÌ! IÇœÇ@^cÚŒ7ݬNáßõeö˜ÄiSoì¦cÐ@]õy ů„;8uYCóK _|›-?01˜?墊mÒ2¦Ø5ïz“ºƒÁ’“´¹± òâq<`—tY¨|&œmlu9´h8;¹Åq`¸N jãÀÞd&8 öÇâÂ]@ŒO… b 0Á$¸C‘$cp-JÀ£ŽÂv†pÐ"(8˜±¡?§Ï‡Ä2>±¼fQBLÛ¬ÆÁ"3 2b75v®`üÖTÞ‘…ú¬róT! ‘Àl N ‘ƒéE9 k†ÐÙ‡L ¤m?IÚ Æ‰>G%fIŒI‹keÔòŒöQš„D¥\;:Ûw¨\d̦¨óoµ‡„þkOB}µßéÜHž6C¬pWÂ7ª„g–’ëô÷Õ¦yIQ‰ÿòœ9Ñ۠ܦš ¾f?\ Ùv÷=…”²±ÐŰ_V"Å8½ aØìžLþ–’Éëg3“Qªõ$Ê ¬Ò¬X ¨hð›ÑWæÔ¼iHj€ P†È\bˆèö¥ĸK¯¨ºfÈÆ\R¶Þ5 Ý`n<‘ÁLõñ$R§˜ 3»¿±Ÿ4}ÌW¶Qä€ãIJaD¥®‡#ô ï?s®yãg¥:`ü`åÐeb’*–;ˆsõ1Àw„ ½`Ö‚¬X¤VÈ*;Do%?I‚ž(Ú`dã6­PF3'Í…9¹²Äv‹ó?áö21Bg¦¼–XÓì}ÃøðR†å»;ûF…á6%Ï ]¿»†Ñ¤ AÄApü3Ò„°¬nççß¶AÊ‘ðÈœNï÷jžòD¸…pÐp~ö¦ª_ÒE\àž(Š ø¥ñ3Ì`*SDÁ¾y\:ŽÓ4˜B*¦\§\`Ï:^‡ð¬RÔðp2¦* | kœ G¯ã]ÒÚˆˆù½Á‚R†âñÃñŒ¼k¦ùÆN½Ä1+%‰9|³pZ(‘壆[¦ÄÔ@©v•QV»j–’dSö²Iqȉ7*ÅqÜÓ2¼é½,@Ë„d 4À“åø¹(žiw°æ“è`“òc)¼­–d¼ÉŒ„Ée²Ë}Hã8Ðß›¤ò¹¾p&t0­,Üû[/«ÛXMƒÆ”-ð}WïçS¯ „`DÓ3ö ¶ÀN)Μ¡hŽÞØOÛ6 šßî͵·Û\[—KÞr°üî¿i¨OëyêÛ[îî͵Wëmz(VÞv[—v¨¹ZwÑ¿.ëÜ´¸{ÂËÝÎj«›ô„¿5î{{ÿ°VjÀSÕ±lÍË>HŒ·êVÕbLK„€·tKÝ-r½ëóxµ©àvb‹&x®:ŸX´U •ß‹± êM[a‰L~ï6 ¬s#Åtñ‹¨ºVb}0çíU7/7§m0ö¡ân»õQRÖãy¬pË1|Rì3cò±[FDÖnÀï )Ã-c‡­÷Š›A½mÅ™º¾!I`|ÿT7i¼kÆÊ‡ˆœ«Ë:3ÅnÓJß©œ¤rX½#Gå3Þ ]ýƽw£<ÖN½4é°¡ƒJYK›ÉJØÛ-Ø,õ2¢ïƈݨ“aÛ¦·lãQÇ¥ÆMwpÁ“Fdh¾Wã$Wù†©t•Ñ#ḧÒÝ6•N›ç÷Èß¼c<ãÔXq$Ò—O ‰G˜ò>& Aƒ¡C4^ 8\°y%ú §@™ô6΢øžfé6¡Ã”Ç2©Ÿ~°Íp¼©/]uß\¹V–—,FYz‰ßA°®±é‡MY %¦Ò+Ÿ¢Ìƒ*™@=óÂ6ÃèÏ©Ú%‰×{adž ;ìV»v”Ýg/ìHB}Cªô^ØÁé×{aÇné­:Û´ôÖ^öbÝÅ \{Ù‹]Ñ çwÏep»çr÷\®\ž½59³bU 5üØUA¸7¨Ùpu¿ƒk)=Ì‹Lq)NF×K='OX˜1¹r»ØÎ&¶©Ü?ƒœÙªÝâ™o“ó¸çŠæã(ëÈ¢®­ÍL—¼ç.×@—òž›BÛ«ïÞ9wIÓN]"8ÞSx BÚQUwF¼2V}äyÑ3-zÆÛÝ%>Ñp–{8‚Ïág³Çq Ü`ݱmFÏøö•Ýzq{m¶ήàlxõŽÔhø¤x]f²M\u©™JòÚÞÄü_Ï@„*1‡£ª[p;XxÍ3å;ÄêfÝ@.îø€íM& ["{8¢ÝfDñ‡ìËmD™Rù›uõ}¿íû Q¯;m›¡j¿_]™d#\Nð0oº ¤1 =D¯^á"Ÿå9÷Sg2oß½eÍo¢fª&D½¦½ð™*&œÁvûʾˆšÉ=DpŒlæ’Yƒß![X^¤÷Š{•P|¶ñ)“¦Ì0ž^°^ þ˜;♋9á Þ%# SñÂÎÀ bÒãqâ·,1Š*¸"mëv†C½é=‰û#•ð§`.«Íá)ƒëÊ9x;"Ìâ3e%>¯b‘à ¯þžÒ‡dõU¥QÔd§Ä°Dß 7p.¼GF|EôS`•ˆvZ`\ ²€ ]‘b8ìÀÔLTžE¼¶-PÏE¦‰Â¶Ä%ƒ1J#k /G.Ÿ¬¬¢C5`!T}ÔÊ$¡X«µk [j«±fˆyÅc.ƒ7‹iü!ƒ‰Þ»>c/&^&¢rcäÌumÌq9H¸˜@4/Ráup‚;ÞÓ1C§ò3IþD¾#.é›-¤Ê_ äoÂ<,<Èêb¨ ã”(oRs¢8eèZ¶äþûÈ}YÀ!‡ñkæ– K\€ƒ»Z3­ ,Ã!ñ„(SFîygJº“Sœß-¢ù“¢>à8VlŸ·TÂÍ*ôi%´†Ó;8bÑ1ž >ãÍDuôo@Y‚;ýü,Â5„/ô"ü &¼–˜r7Bôó‹ '‰¥ÀHÔ‰½Ë§hD­£p^σOŠ×©_O{®4GÏ·^!ä6˜ ¼tñ|Ž{‡ÿÔì2® endstream endobj 7545 0 obj 3611 endobj 7549 0 obj [465 /XYZ 31.5000000 138.500000 0] endobj 7550 0 obj [465 /XYZ 38.2500000 76.2500000 0] endobj 7551 0 obj [465 /XYZ 32.2500000 137 0] endobj 7552 0 obj [465 /XYZ 38.2500000 76.2500000 0] endobj 7553 0 obj << /Type /Annot /Subtype /Link /Rect [358.500000 146 423 152.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 7554 0 obj << /Type /Annot /Subtype /Link /Rect [172.500000 103.250000 200.250000 110 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 7548 0 obj << /Type /Page /Parent 2 0 R /Contents 7555 0 R /Resources 7557 0 R /Annots 7558 0 R /MediaBox [0 0 595 842] >> endobj 7557 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7558 0 obj [ 7553 0 R 7554 0 R ] endobj 7555 0 obj << /Length 7556 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`<âC/ °3= ‡ƒ ‡EÁl6Ábg‘Îò÷#[”»-ù£ÄOdYöpÝî5["Y¬«¾"ßþùó?öÿú}ÿöýçÿ쿺Ÿï?ïŠC]ý?ûãçÍë/tsp¿ïë¦Üý¶{Þ?ï>í>uÿ}Þõ|~ÿ×î·ÿíõþ/Ý¿¿ìü{÷åOîŽðmW«ºûùëég[«î·âüóøý¿wûÃþ·ã‡îÜ`.ÿÿ-U÷9c¦ëçÝ0Muúüþõ·ÝÛža½´…é>{eÝ«Öêýÿ¹û¹ë`x}qh­RueëbMGµîzÒu[ï•n;ZW夣Ó'ÎëUü—›²RÉ^Þ<:U”éÆì}{ÄÅ5•Ñ=tÑ& ÿùõ)·±Eº—ŸF*nq=o¹¸­rÜoÚ‹{~}ú[ÓÑ&ÙâžF*Ãââ·G\\k½i ›‚þ Õr7ÿt’Û<:UÜâzÞ~h*÷üì»9Ѭéªf¶öŸBÞ‰àuZž=¾û²{û±R·ŒÕþËÏYN}ö?¾tËQîß=k÷_~Úÿ±(”ýÓþË/»öPérbŠótjùð¥#QòÙUFxvEÞ‚ßfßÁg*ØO[4ly[àôu>Àgਙ·yæƒ[àÛÜLe8¶ÑÂ[B¾ÄÜçá Øb0Ç~ çrˬ0¿ö׿c` £ßÉñ˜*”0Q-5¡ûNÂZ?ãÑI+íkZA®ÐÒ+,é (ÓÞµ' °å$8kiÌ‹”…Æ<¯¢J!÷x>ÔùÔ|ð¨±w‡[nOëôºTÙHk‡–àKl©âŽmÃÒtÇ^W]oÇ·Âkõÿ†í ~FÔƒj«ö ´‘ŽEö  æ öR1h'˜}KñDÐaìÙ0#xPÏ&=Wá4±õpÖåDÉCQ‚wX´ÛýØÂl=Òkµt®>Gzs¤wæméµV<×(%›Ž™z¤‰ÀÈ–A0ªb«{Èç%‰çn×ò6›ûÉ1à^!]×›áåmÄK%/Yó7x?g[0[ôhçÎ îK]•§ñ¼8ý`šCÓ—-N]^kéEجéOMzy[ƒZ\ˆþÚÛjØÒ+„æå ‹^ï²æPÚª©/^R7ãŽáŒ¦Òä%“/ðÐ&3‡óó S >ãø9lÑû¥†Á-Y86CÂPoÃc[¾ú“ur69læ%`¸Ìîq Û;,åÁèFée¢èa!Fòð|žP?fpXŒ{hA‹§Hf}Ös4HidZ5²2µòØ£' ?k×öÎÓ–†×©†cóXiHkçè„É;¤~›Ácc惥 ›À(n^~BicHa\.óÆK=A>ÄÚ[UŠÖ\Ê/£õÉ€×c5~É}ùAø%RúiN«&´„mS/ÞoxŒZb²12´XùhÀ©j®E€²„$ðX¹É  ò¸…q5DÔ@€G¸ñÞ Ë³¥¢uT¥Ùf1ccT TËžPQ€ìé仜>”V)=ÏÙ8Fƒù—-û!Ö¤çc U5 ´ fÑrΓmc2º8«Á 7‘¡«š5Ø&ûÍ a%)RÒ(3¿OLàõ¤ø7·l¡eËçÅ0øhü …§dÎ&dÎSÕÉœ´Ià„1 âÖ$0ÉCmäáÞ¨¸ÿ-ë^ÏØŠº»«×à·$sùµ]ƒj¢VKS5B`\3¦hû8÷º’ö1,ÃåXcLtÜšLæô`ÂûðèU86±ú¢²ï™™ÊfâD­MgüIÆ‘`®Ødîê¡jà‰Ë=£ÆÔ!ê$=#`üð¨g.<ˆ£ÇlpKeâk=¢=9" KsÆCâ{蘻r‰½Ïdõ=¡³ÂoµKºáP#›è‚€{£RŒ²HP¯…Ü4FÜjMoƒoŽŒz£p€è2{-æ€O4S®âÛZs–Aœ' 2¶8÷IåŒq?8g³8»§1Rc›ð|¶’á‘á$;à‡$QKTÍsÂw…AµÍš|ZÆ ò”/‹j%3™¥.׬wÆ f j¾´kîúÌÔŒA‘™ŒAÍTrG“1¨Ü|25cPXþU§‚e jÆ ®â¾U'°Iîܪó‰e¢½žOcªÉ);ÌÇe(r>ý"××{µìö¡=aö$G•7¢³«sâ.K W·¶Ê¸A œÁ’Õæ|ÙÄoÂCrW–‡¢5—CÂ6½<*=4½p\å&X¬© È"/£~´»c”Ž„S˜ÛâžP sNÜkd0?`0¹Ø¾Î# v’¨:X`MiZ52@Œ˜3÷]yf½á‚&çc]¹ Î ~¦Û5Ü’ÍØãš±ÈWCbHÝ÷Èô³¼Š‘¹‰‰Q!Þ1*£ÛW¡Æ×Z[]híþ›Eê^”Ë4cuϨºŠÐ¾Œ5qÚEøù›«:NK1Ï:1NÏüÕs§šrç‘ÉN<Ö²{þ[§ÏJóú›_wŸ=þJGç4†KÖ·ƒ«î”í"+…ò¨k 0ý¤=iáö ïé5wÑò9Í^Û« å4isîòãy®ö2¢+Ôâ´GupŠ`ÂhמiÑ3ÎéQö0Ö+.¡zml=SÀù8FÓ Eõ£¤‚lͧi N}`K@ˆáf5öL¡cÀ¹3Õ1p^8^2b/â©}Ü¥‡-*$lTÜZÙkUï)ˆ7Tè1ÏLبöÈQÀÉ\Í›$D² R7c›E¨$$Câ(ÓJÝSÅÍÇš’â|W{óõ¹%ŠÀ4v±rв#g˜ÑÓÏÒDöqž§iV.‘mËöõ·Èc‡pIûY JpßdGì¬×æœåÕ ecP¼BÉ|Ï‚gÓ…T0±¨‘2ê6 µº<éKoJ¤j˜½.•Y ÈwGy†ìü–ç×ã¤v݉CßI íÊ@ÔöñùÌY£)s‡…-††‡ì°Šˆþ¥Nǹa†Ãn¶øLBH \IÅ´ˆí›3tã ‘<Ÿ»XÄI;1鯫Åjt.ü›6,[ŽmkÔð…ûp²£`@¬—)Åš}ÞuIêËòb”ZSû4Kz» y …¥RáQ7•n¦¶v8ﺙ¢‹§ð†Ó¾ ©€ƒ˜s2A'º8ÐÍý•i(ü6øŒ3#*hêõ Û² wü½8_«!ítÎz£umz÷ßO·O¯gdá`À‹æé§Y¿uaNx/VŠ^ ×âÔØœ ÛÚý?!E endstream endobj 7556 0 obj 3941 endobj 7560 0 obj [466 /XYZ 38.2500000 236 0] endobj 7561 0 obj [466 /XYZ 38.2500000 236 0] endobj 7559 0 obj << /Type /Page /Parent 2 0 R /Contents 7562 0 R /Resources 7564 0 R /Annots 7565 0 R /MediaBox [0 0 595 842] >> endobj 7564 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 7565 0 obj [ ] endobj 7562 0 obj << /Length 7563 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯ès€m‹¤>#ÀzÆ ‡Ã"‡À›M°ˆ™ì!?ê–Ô3¦úQâë"ÅVk½‰½#‹"‹Åªb}¼úð§/ßÿó÷ý‡‡/ÿÙíø²ËU‘uÿì¿~xÿ]ú?﫺Øý¶{Ý¿îžwÏíÿ¿îº¾<ü¥ýÓÿözÿçö¿îú[ûßû¿tü ßv•ªÚßÿ}ú½©Tû§ìüûñçÿÚýõûߎ#Ÿë'óýÿ:¯Ëã4&>ýº–©N¿~ÿúÛîCG¿¯4YÞTz¯r“ïU“ëýÿ±û¥ýÀ0|vhr¥ª2¯²k>Ô~¢ÉÚgÕ^é¦%»®G:ý’^\ jðÓÌÅ©¢L©Ü£Kn®)uO • ÑÛðÏ«"Üà§™‹SeØ\<ºäæ-ó<¹çáCп*nîiæÁN.]rsëÒô››5Ht>ýˬղÁ6÷4sqª ›‹GÜÜRMO cÐÿmøƒë&Üæv3§J¿¹ŽÑ%7×äýѪÊ:‚ü¹ 'ò»™KeØZ8¸äΦ7wš"}Σ‡ ~©ËpƒŸf.M”agíÁŸ}Á3é~îr¯Ž?½ì><µr¤Ü¿üÒNìôÁî·—o»¼ýãí­®ö/?ï?f™iþ¸ùu§²CY©º½ãÿÞéIöpz’rÓ]}ßžäè‰Q§'õùÊt?8ÔGÉ\¼D£'ªD™ƒÑµÒ捻ð;ø;xÅé‰9yy\ù»'µµ Ç üp Ÿ@ú龃' g ð àz0ñëù|zR ¯ÌÙd†»0u0c8öÓ€™µ±Y’KåþgÂ1Y¼- Qð;p“ä‚[é`g¼b+³ÎàþÔpn˳3¦¨ œûüÒj±@ ¨V–¢ Ÿ8F³O¨CØb=ƒÏ.Á^—Nö>3jy,á _éšàÅÑðx9ŽRÃ(sÈ7Žá?æÛèÑÿüçÜlUYÌ6Q°JÇÛ‚gý£½tÆøƒäbvnA*z=,‡‰÷É„PàÂJ«iüÌŒyƒW_á5Ea)<‡tÄÇÖ$6Øáæ,l¦tœ­XçJ{æ ¤°ƒ²ÐB¤®OðÀ`wX(Ä‘eî”&gn²öÎ:޳‡M¯§ù AôÎâqËÈ?K ]•« ÈÝê$v‹,?oýS/ôNó¾ a.=ù„ž¨ =Ñð Π—žäþïhøN¯`üh`èõÄÙ᪞Þa iõ£ÿº1åTÄ”‡ß1˜ò œ[ GÜ„ù…ø¦5þŽù‘_šjúl1Á²¯îpßÑpŽóøŸ0\Žw?!øÅð¸,±ñÙTnÒ 7$‚ŸZ­ñþ`ê`Yåæ^å-³R87‡FżC¬§€‚Wª!2òVc=EHU,C Ôz9܇ Á»w?ÁR ¾ÓÓ:ŠþPǧ´þ t¦|õ1âW+3¹ßÔiñÿàõļM«FOK\|nEo7 HB,‡°Õ¥€ã¦ï=±nŸx¥„*¦ÒJMŸ 1 åNÄ,t9\&pL.ŘÅüIGüF4mб FÑÝhB‹x´qQ„£AF?À¡Óù‰9T®•h2&¹#€Ä„£æ'CQ±õ- ˃™eÊd©àÐ:&ÎÂ9¾•N¡¥u¶ìa.§®¿Øú,o÷àh )·ŽIÓu$C>öŒØ—»Ì"(ÜRÇhLŠqÔa„‘HO% æî…O@‹Äš %„ŽH«\ƒ××!S8›ÆR›T5Î_Ɖ†L𣄉$HJŽ1¹Á‹{˜xj°öÇï  Ó¿4ã c™`?‚¬´ZIA…œôpxž”®G„÷Æ”tʨڞhàúY^¹FðÎÕå*¹]Vt†äG[ýGÔUÉ£&pyûpY팻p™úƒí-YÇ3¶ø˜Z6ÌÅ„‡6eÓbì?ÄFhÂ$–-`] `@DÍ;®8óýJ‘‹¯C:b›ÂÒk ]þ™;§ýa&çàPÃæÌ.!¨=ÌÄ„ÇÒèL‰»l<)r@9”"gÞAjb²x³e‘[»!ê ÷€,‘Õ˜ã$þðv­dƒsöíŠøZ}«ö«¶þ^>&¬‰•Ì…!´«NÙ¦ÙdÊmPˆ±= w,‘'ͤð.A“]‚ÄSDÔS!_<%Æ$L'‡$ŠBCÁÓZæ6“`þŸŸÏ·Ùm±‚Èñ½®Q”šQ6_¦~:‚$[çç>¬SÛ O¦¶:¤J͕͖w,µRBé,´¶w&V+á̬X0“äš`’SŸW [ú[L dE`ÄQZ… U5²pc•J™|¨4ì5 *Yc¾;S”,º)ÿ-a¬†Nòˆw+f²„c—²«‘À¦ƒ‹2 ^MQëŽ*| ÊÞ­O©eÙªÚ‘ÊàfrÞ”–jb¼\Tr¶îpzÕ’8œ¦pk¸¸J߆‰ºz ¾“AÜ@èô[)ö/DDœÈU~'ÅÂapàb‰fÐÊ è'R’Ë?¶!%%ñŠJsŒq‚±íL¤Ëh‘UßoÜÍ'ÝÒÅ2åã•déËdýÞdjüòœdË|cF7tì@ÇQ&­ ËÊù‰>â.’w<ÙˆcÞg ¿SdI†„‹¾ìÝ<×^’JõøêÎé¥6®¢ým|CDÛ5¦Ü¢f1£M$w±j«ñcõ¸•åYÆå ÚˆÏ ‰§¡”%Óì#꜖ÅÞ®-av‘XÏÖBRêÑ}^”Ó ¥[+' ocU4ÍôcÇ×ÖÆ*gÂÁ¬»Tõô¶ÖW[ë«[ë+7÷&“ž-´ž­õÕÍ6ŠØúª4×´NÜZ_­û"6nh¯ž×pÒÚZ_|ÉHÒ­MRd.¯Î‰rÛ$•ÍtRÕÖ&‰§o¥Ìä¶6I.¹µIŠ+‡*£§OP¬ÚŸª^[ºÕÝ5^XK^ÔMÃ0R1D.rÅá5&5ÃÐ÷&SÃîÃo%Å]á‹è³ÒV^áMêp™£KHVÙ½·…gµ½Iq À€ X•µ¶hÅÚµ>·ÝÕbù\c›.RþO¬X v%¡lÏ™•õˆ\GF®L}2¶° {subsL[ª)VÆõˤÀŽPß™RsèxÓ@€5È¢â _'M;¿™^À,D²ëèîâÆho—»eˆ&ãâ'·e¥×ùݬN »øß™CfÊ×…­³d10òyùîòË#&Es§÷§úBÁDGsÄN:í¯ôðèª•Šˆ-‡¼´EÐø`Ž„ÃXn2=fǬSI´2‰v,_º§ÂƒÜö±7ô›R÷qñÜC÷vhì½H²æYµ5ÏXÝ+)ëõð%àYq-,Ú Ï~Þ·8IýXšÒØó\Ü ¨dK¦(XÖƒ,jô/ -г¼)l^Ÿ ÒUy O‡”Zv¾QÄ‘wˆëá°ü .§)AËZ[4\¾]§CbÙŠ¥ƒæ+*,¶Àð!ߥ²·²Åð‡£Èí¦]À#UÑ;ÀKñ;b5 ðr™™j¾ˤ°ÎGy—wYÌÛU„â’1Uêf¨&Üð6\VᆷÁóX£Šé5lxÞÆÇ oÃͽÞÆ†·qz²<âAD¼Æä“”ßð6îŠû"V7…¹†“6¼ oƒÔZQ¹¼:×¹GÄÛhšxžÞKß2S3´S*Þ¾4ïÖ¢÷«X"J޲½OÎtÃtqqy,L—Ûäå Ø1Áo~Ã>ÜBÛüX`Zc‹PTަߘ‘8kiÐç¸3èÝù6¥Åãè|@c^a©TÙpÙë/í—¸LЕ<*aà+ål‡•”´Á{À´.-¦¾[@À3®cÓ#=ˆ¨èmêÂVeËR8F·8¨!Œ²¸‡Êcj>çC ÷MMKdUî¸ZKcíÙˆ7XˆUe¶>ºz@ [U¶NÙµLîq`¼I|ü1o.ˆSw¥HcÆL²økétq*#u–°ŠR^›| i–¡¨¬lìcÍÏbÎmÞ`pŠæGhkÙz,\G³'dn¶K9‡Vf€±B/ÑÑ8"GAVĠ÷©%õ(äÀ'€¸—ûøï×™ôD-¶uÖVµ²lÕJ©šé®·}\¾jÏÀ‘só4 "þƘºqGþ ‘û+„ê;-Ë!3Ø´R“ó‘}ÂäpÊæ¾Þh%R&y©Ó„syWV×´ÕµßÁ3H!£ºÔæüU¸º¨ó)ëkx„c 2 æ8ªž1e[΀ª!_Qzõ±ŒÑÃx'|Š—žpÃRÙÚˆ|¹õ=Agm?î$‚G[{À+V5ƒHJ¿ %9DÑD$ÝÎ!£$Ym)¼ÚqÚ^zçñl‰Ø±/ÆÇÞ ϨÉñRÝà·‚ S1Äàtàï8f ÝR0|òyŽdœ¤fJ0n“É&LÀÆG¸„pY‡ ËèÙ—K‘Ø´ã”ç‚Ê´Ãl³u™’!¤lJe%Ý‚Ù/›íBaÔ5æÞމ/Â2ÜAÑêãSh©Û;ô ¥Ãìƒ,ÌÌ–Å4_®…TÕ¥²¸&4€ýÄÝaÿ02aã3W$Øéï×I¹Ö¥˜)E9D?ïOH_pT2"U¥Å¬×/êkzµE«|gR=0åE«¾ÒðÜ ¿8x™8é÷Ói3'j†qÚ“,~ìâhT×´$ªÿË3¦b´Þ­ì¼ôÅ*7pX·±ª3"Åk),[¬ Ñë•£ö¿C¤²,Wdz8P­ì [Ëma;fJTrÕR¨²WD…Ôo}ß–7§Ôê¦ñ}¿)G £8O»ë-,{?ÎŒ2d‰.N^;’:âm †ç+¢û‹ê,—ÊÇÜ#p žÁ޾ßrï•B»DQKU9xbïH-…ðé‡WXufju ‹JkÄÎ ¦Ï!#~æ'QSÅ;ŒC@63:RÓêÕº}J<Óä¶È[ØØŒ¢ŒksvÜLžžMúÆYWJ½£Vg¤-磡9-nWt!¨æXK•R9ÐE]bTi&…ïRÉ*¼} QÔRû練®SKÁnœí¯ýk»ÉNxžú 34[}ÑNkÏo¦Žk¯?B$ItZ¯ºÀøèƒîòRG”+ÇOúŒ }(G JGô3åX»4·§~¥¨`‡æò·)ep²ˆÊh=k\¾š¸{\X†Â£ÁwzE¥¼–^½±-ËpÇ?·36Ò®O òb {Òc0½»Ÿ¿¢ìÆp0 àMs|§¾~ªÌúÃûÝNÀ#‡wB¿ÃŠš”PÏûçÝÿ'!ða endstream endobj 7563 0 obj 4582 endobj 7567 0 obj [467 /XYZ 38.2500000 491.750000 0] endobj 7568 0 obj [467 /XYZ 38.2500000 491.750000 0] endobj 7569 0 obj [467 /XYZ 38.2500000 260 0] endobj 7570 0 obj [467 /XYZ 38.2500000 260 0] endobj 7571 0 obj << /Type /Annot /Subtype /Link /Rect [373.500000 470 402.750000 476.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 7566 0 obj << /Type /Page /Parent 2 0 R /Contents 7572 0 R /Resources 7574 0 R /Annots 7575 0 R /MediaBox [0 0 595 842] >> endobj 7574 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 7575 0 obj [ 7571 0 R ] endobj 7572 0 obj << /Length 7573 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·ùÒ ðø ‡†Èa‘CàÍn°X/2ÙCþ~º[T»GÒG5?)õÃ{ÆÍ‘H‹_=XU|û—/ÿÜþòÇöíû/ÿÙ~õßßÙ¨]U¨öÏöðõæüSïüÏÛª.¶_¿m^¶/›Ï›Ïû_6í_ÞÿmÿÓÿ¶fû×ýß_·?þcÿáOþ—¿ðmSéjÿý·ã÷¦ÒûŸÔéûáóoþþ§íï‡7vÝùÁ¼þÿWXWT‡aLtý²é¦©_|ý}ó¶%@\/*í¶ÚÙý?3Ûÿþkóó¾ƒîõj×8­«ÒUjNG•Ù÷T;½‰iö´.Ô £ã—ÌëµüË]4É^ÞŽ\œ*Ú–zôíŸcÞ‚‡äÑ—ÀƒOÏ›·Ÿöä,·Ï?ïGvì°ýö|¤È›WšfûüÓöÏJYûÃöù×ֻ•õaÊ·(sl©wõþS¨³wlq;gÛÍ~jÑ >óñØR쬩õë– >S·-ß?x;ƃ…Ϩp긟õ£ÛÁÚîegoƒÏXH.<Ÿ@?xÔO=Bȅש@ã·&ˆ§A,e`>iyȶÌÛ쪲è=cû4'ŽagÊöë·øÇç=œÍC"}ÈQ0rª£Òu“úä©y}¤Å¼ƒÏXÔâwñØ3`ËÇø~,Á|ÛûøQæƒG ûQ¢VŒ+Âò©:t:Ò ‚¶¸ˆÂpgEA >cjB4ã©XC*(0†:fˆ%W@hãÓ-ßÙîu— (ž¦œ©sñ’/@ÆàQGÈ‹Üÿ€YR«{/qE6U)[ÜÀ’$ Š?ƒ#¤h>±Tén˜í‚hÓí§Kp›MP:0o{€gPÞb *I¸ HJH¿YÐM«òþÐPºW€Gڙըɲº/Þ‹ŒŠsóZqÔ–÷âI¸¥0;Òyà´ªîNM¯øù{·@ºZàL-¤[6@7ÚN:³×€¾E¨Ü|Âý0cÃæLàmØ—%–Ù¤-ºå=ÏjWVzv8µ±¦œ¸ Êš`Ⱥ˜(VÃß],þޤ9>}ìã"ŽBð3ØÞ°7&(µ“TÌü3yäFs¢ÕýÈ œ®Ž€øÇ‰MUce³„â’ŠŒ ®¬Îº>9ŠÖ 3mA®]zÂÖ@“ˆc°uj‘Ð#kC8ù‡Ôœƒ°rÚ ÖÛe¯º¨2ÝŠÛCZ¿»°R]d¼×}ÞÒQç3 )Ïì` Ð0R‹™–¨ØÏáXn[ÆN¾°æƒ%s"…Ù3/6«˜ˆKÂ31 1³‚Žq¬$ñ@ŒÉÁY½=D« áÌ”G8«ô Î>upÖÆzž1Z‰Z¼¨(v¦ ê¡"ê<oÙŒ=ãN› ±¯Õò'8ƒžQxízë²c…>sÆõçãÃ…FÞ†ûÑ-«W; 6ÛÝðÛ 4jo!Œ¼ ÓÍ Éôr¹*Ìkâêb§úd'¬È80±»„œ‚¡„óJ޽\fœýÎÆk Tý5&—xñиÄ™ ß ùAÖ+s'Ñ2…s2u%DÕ"jQ6¿¨ÂK;%i½ë…±=YçÏwŠ×Âöûd «Àvœ+37¼Â—^²ÑDÂFá" îÏ$ÝîO> ýl¢g”’#¦ÀÄÓ1r(—âO9Èp`Á™Ká\èAig}™Ñ— ‘Æè‹…N:]£!Ô fnI§‡¤;PàH{(·½ý¶G}¥Î?ùmó%{Åíã^¯‹ç’¢Iqð \2.Ec,+r jÈ’”w ²%^Bjކυ­ìA!W„»3ú´5µ®Jår3Ø~›³î"× Œ¬2b¹ð1=µ9UG'L*s‹ÈÏŠÐ{ïÙÑ$R¦O ‰p@2XõÏ$+¼”MØEøÿˆ${ÙÝ™øX%CȲ÷¿}ÇÚÜ~ù€â…÷‰¨ã÷ îÄŽ_çú÷šãªn—Ò{ζ “m„Ž‘c9›ñŒ‰ëp©/Ñ´ G²èEqÌ-ÂÒI‘pÿ×eß4ÉvýÚÃ4ù®[å2Mžgª¹ÒZÍÙ'½(KO™@—ÍRÚ™¨C…Ób4&æóHŹ2ñ™YßÉàWsnšç×|—ÏC‘Ê£H-è  Ž)Ã\²×‡DHZÑz}äæôÙ°–U_†³–UHÍX4= +RãP«¢™\IáàTì©f "Œª¢-[‚©(ËÌgÍú4àcîÒÍtLãò:­³`Ó9Öe0ITkzÔvZ”Ýst>g—âþ·¨g$3®[Ý<¢äG6ꚪoåÄs]vnca<Ï›¿é:]5†]_²þõé«?±{Xô:‚Å\Êk¬‘|k©íq{£â6iÒ¢êâCGM#p Ðúˆ²f?@â¢Wk.IGd¯%Ÿ6.ÁЍbØE)¦%êàĨxDyÝlÅ÷Rää¥Ì*¬›ž<[‘Z¾âÀJšÞø\7²MÞ®E·åÊŠ-¦ˆŒ>¢p9%+¸™3TQ¬5Ø€“õòf* cÙ‹æxR¹¤|Eä .+sêr•që 3›î΄¼0 + wëKë7ÎöØð¾O6­Vým)Zû<×UWž¾B·pá“”~ÌÎîûÎë7¶/’•NÀ| ±†‰ÂÕÕWsC€n•ÂßìI1¼èÁSDîW@˜,¯¯a‰PÂ2$½YÄ`Œ™È6ã˜#¥ÉUT='ìÝg +®/ÅìVo]¡®Ëåý½üöÔkˆ¦Y{ ¯)ÊnŸãP-œ¥ˆMWœ•p9¦éîNÉâ›:Qùô«Œ”z˜6A¼[Ì´‘•¹4ñ¹«D4)‡\ ßV^[Ûaíò·•+ܾ­¼î`rp»ÖÓ <ú·n+Ô‚ï ÜÇÝrÜØ]á-„—;«Í¨V8686[Ô1Eáýï~oÑßcŽûϨÓÀ@ZF€Ÿ¼#KkLQ¯q/ìs"¿yÆ%¿óÈëŶ:Mš¹óèªîëµeØdòdSqã°Ÿ˜œ(&iNÖ°'*!Q¶ÃÖΕ]ˆ[×ç89„õ[Y/-¬&9IMYåÔÕ=YEÝçIø®îø ž)5Ž]ÔyKDîÑòÇ{—Ÿ~ÉÆ)Êø‘™2#Óà+F*«îdнc®œŒ¥¼Hø‹J$ w¶-P‹.àòêÅV!“c*½¨ÕªìËÚÄñé”6€Ô\é Œo7¦”FUÿ•Uývñ-x¯C±S}gÏ;ø6ï 2]S*é! 9ó‡ˆ7² ˆ€§|8;‹ N`Ÿ1oÃpŽWï&L¦ÞþZÄ“Ö0»¾-ð q§^íÀúàLŒë ‡0´ FïƒÐŸ”¨)ò=ã$7¦"ìÇÂæ®9‹‘ønpÃ>eäKÝLއÑ®ú–€¾AhIŒ´gh`ñl2rŸ­gpu—%¡—¬ºÏs£oc™±N*ª'ÍjÁ4ȺŽU™f [ k6¹äžcv7ñ²ò•ÑIñØŠ8ð&1Ò£¢¨¾La9öta-Ÿ°>Ws µÐ| &Aqy),:Ó›Óv{Ûé„N€e‰…V?–  ï9Ì!¸c/|†¡uV[¸)&Ç#¬s1>WÌ}q?„'òŽ86£æ[j7ƒ“lÆÓÁÒÚ#¥jäXÌèõ×éIdp•ò3gn“0­ñúà–5k`^mÈñxMžH‚ã%¦¶¥±Öv•{¯B %§Ì(Ìäì-X_`4 ov (âŒ(ĘQ[‚nkÆ4Yºa„Ä-k·&ÊJÏÙ›™4+‡¥ \-—i×f;]”õWˆ!&ö†ò”áx59†G€eö‡‰ú“òãÆ¼Q²»‘òÙbI¹§™ƒ9­äJ͉¬¸5,ŸÔÀò¬‰©—à„²;Ó¼¹È]—†Qi*Ohl+ˆÜÅ’†‘©D´;¥'ѾX ø¤ ŠæCäPùXG`¼’*¼>Äj3Q¸x×Sú²l´/3SÌ¢Qß‹è)¾,÷2»ÏãACoG`/#ÈÌ£y´’º;í¼ŸˆôÀ$Nb©¼&ËìŸÕsW«9'±¹b qí>ÓÚÌ9Y>E„\ë˜Óš®ÝœÓ§s |ÿµ}Ù)8âÏS¿pAfx=~oÝ)}(±5ÝÎ÷(9V§¥p5’æÝ"¸Ù™¶„ó@ç(‡-ž fWªU·#À™à#ýx¾À•%ÆÆöÉÏtX1£„oóí¾IÁÁvʼnôʾg—Á™†ÆoƒÏx§‹ŽšúY–á?«Ó…áÒÎ@ \ë²€íèÝ~~Þ¢û kÂÀ,€-ÐO=*ew~ó¾Z ¸åðJ˜W06aÛÏ›ÿiE_l endstream endobj 7573 0 obj 4019 endobj 7577 0 obj [468 /XYZ 38.2500000 355.250000 0] endobj 7578 0 obj [468 /XYZ 38.2500000 595.250000 0] endobj 7579 0 obj [468 /XYZ 38.2500000 595.250000 0] endobj 7580 0 obj [468 /XYZ 38.2500000 355.250000 0] endobj 7576 0 obj << /Type /Page /Parent 2 0 R /Contents 7581 0 R /Resources 7583 0 R /Annots 7584 0 R /MediaBox [0 0 595 842] >> endobj 7583 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7584 0 obj [ ] endobj 7581 0 obj << /Length 7582 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯà9ÀŽÙ/>€ €-Ùr`X@A7›`‘]DÙCþ~8"9’8óÅOÍšæL[Þ•<­~Õ»ª««?üñÛß‹þV|¸ûöŸâûðýîÛ®Üסìÿ‡¯^~`›ýðsQ7¡øþËî±xÜ}Ý}íþÿ¸ë;|»ûs÷Óÿ [ü©ûïçâ¯ë>üqø¥Ã/ü²«MÝ}ÿ÷Ó÷¶6ÝOåñûáóíþò»â×ÈãtÃb^ÿû¼·Ía3S?îÆmš§¯ß¾ÿºûÐ`Ù,mÙ4¡*Œw¾0­·Åÿ±û©›`¾Ü·Þ˜ºòuùž‰j{˜É›nÛv°åÉDO_q†7ñoMhW¼_yt¨WyôˆÈm­1€œ[þÏï0¸ón½ÁŸV*r…Ñc"×»¦kVàÜçá×€Ó åÕZyt¨ŒÈÅ£ÇDnÓ ¢­ k€¿YOp¶m³"ã>­<6PFÔÂÁãa֔ƸÕ0ûbôøÀ7¥-WãÚaåë`V<&fmXg_Œ¾ð]X“lÂj<+ ³¾ +bö8úÀ÷íŠdó´òµ0 ‰ÙÖvŸÆÐqø5 _׫YhÃÊ£CeÄíÉè_—Œ‚—Ò\ôG¡ã§‡Ý‡/æÉ+«Š‡ŸºÅ=ÍÙ{耊~yGs?¿/Kwÿ‡âáçÝç‡nékÏÚýf-ÃÓ¬í¾²aÌ\‹ñ¨Å–p´O°¥Z>Où™èca¸‚²!Fƒ+0¶¸Û._[‰û+ £C±¶ùäËòÝ {ˆ:¦$Lx?î“"|}5O¿˜·ÈT:Ør§´6<”IÂÚ>.—<Â@&æªù_/o‰ 7‡áFе*Vá˜4×ây0%óXÈ®UÄcãµñˆíÌ÷XV@}Di7,±•øÞcÉaàaKâR¤ífS¦>Šb/¯Ç¡½‹)Öcm}qZÆV¤}0•Ǖ˂Åwð<:¢Œ¿ˆe3ÚÅ)$®´SÔ¨mGtÉH.†^ìƒ[Táë2¬c]mY©Söœ°¥åŽ óà#ï4i±n·BWíC"8Šë1f™U€óñL¨ŸïB°È0?ûâÀØÃb4ñÇXôÒbñeO,í(ò#Ãï½ë3&§höM'C+ ž3}Ü¸éº “>½YÝL)Î탯šúå¯úÏz\c½Ÿåš¤ý˜‹Ç#gýÞsvæ¬í`FÛEÅ+À˜Ã¼Ž%!–j˜œÂ‹ý E½e+· Å2>Ž jùÊ«p†›áÙµ•å‹ †]i’Á°ƒ8Ѱ²”ÖÁ°=ÎZÅšµ)L{nJ[õS6GP÷˜)÷½éøjlÔ°·S{Ó6Dû´¨ëgܾ6¯ÍØîÇô»Ú;c'6w¯xÙ‡Ö½m0ôê½›Z㦄}Z5îca‹ƒp§¶Th4 ¢írÌ1ÐFÃ;…˜`aÐ SnÙ[ ƒ)R¢‰ô™qE½9ÆQ ó8øìç\Q»ÜIõ÷«)Ë<Ú硳yø ö-BÎõñËWwŠGs=â_¸ãn9ˆêédß•7R˜oã$v€ñÄ-06êpÛL¶!@ÖP‚ÈÆ„(Œ ^ \<J0pŸOo¦.³6H,I@W€kãÁ>øˆ12óD;}ËÈKi(Þ†¬¨ƒ íÈ6†‡@¯˜í¦b˜B8Fk\~'6Š@ Œ*ÂròB›38æÎˆ,”°Xüøv ŠMh`©KYЧ ¾6¯âœçOܳðDn®p"†£þ0Š%œdßÃÁóàs’ÈÄÞpœ‡éa-`މ 3·jð½âc£Y8·+êhLœT€ä9¢æx;8–.Üð‰+!«œ§÷‘¹ž¸ß¥ÆÛx4|ÅH$F†àLÌ?8óÃ*Z í‘›æÖ³1-®u Ó²€{Q&ןÉÀkÃR5î- ávV\ˆ2gfL–sSEñ$5”ïÉrôÌ­,cq^#„¯Ãò?*õE>ËU‚(¾/HbØâ1^^ÖD¥áÎ+–ЯNãVC°Í,]^žb…,<ãYD¥¹¼ÿ`¢Þ¼Ôòü .n>+Þ)S榖(Éx#‘vеD"Òo4(棆f¼‡Ÿc¶eä˜-Å÷˜âV‚!b4ÛsØÆ0ˆ Q*®ƒu††(³[ *Çl©zTæâÖaò§cuU9ÞŠ«%BÜ jØv&jXaÜSÖ±ja4‚3˜(‚ŽùŒ©†[°g¡¥%˜hî\¹XŸYuÜSᨾ͵è8ÆÊÚrÝDmdÇ;t7trDð&£§J"l;e[h‘¼Å‘s¡²Z>#»¥32,6‰SJWcÞŽÊ%šç‘•O…%æ &ò­iŒ- +ÆE«jÌ*ÕŒ‹Víxf};5Ã7my.ƒNÂÙšjw „¯uy ¯X¹½­7XÔê CùÍx:Œº:; Ò%åQmBÂÍÀàv| Ô-öÚÕó4ÆœÈ0ú,jÞ¯0ó"ATŸ,Àà nŒ|R‚·”­K:8ç*úuxÏ›-·#ËãÆ´,Ÿ6—`½$‘ëU×ïyýd£ò%‰hRÝ+ B¿)ÞzfŠ5þd*:…}9­PÅ"j âÿP5©¿w>eÍsµˆº7TåXÆ;´áfÿp)¿k M Å3Xê÷ìcìØô†0•„„êÓBÉœTë!*ï¼£pÕºÌoÛ0e¸Tnâ­(e¯Ov}õµ³âV…ZƒÒq±³uyàPã55äxÍ&lü%Dåª M0u÷rY"½jŽB1nL¥2lÚuOìŽ0*Y7µ§S%p:<£¼N+A° %Ù0¨Ô{¼x 2aLA\ë Ø£+ öž ÃË{ ‘í™ â*ŠQ+—ØÂ™ÂŽ˜™špŒXf,E̲owÆ®M÷2 ­‰@€Ì< æt«‘*DÀªv½—?Qõ#OŒÌuذÁdlÔcÙøuEମ¡Mc'TCIñ›K=lŸ@~cB’LµÛ(Ýr1ݕ˕ :GŽ7½½ûµÄß.Æuƒ PÆaV@­CVú›$8^,ökO†ß’‘¬Y¹=>ßL=±xñdNáPH°Ä¾Iɼpmr=®Ö‹ú’£%¹žuèõéP§Ležhúp&XcÝ1G}$£ÓLD|ëç\Ÿ¹0×¹Œw"\$„~Z8ÚpØx&Uï‡e©5¶3ó®MìÜN¸(?*-€Av­f¤3ÇrÖ9”µÑ€U–B×§CS6Ý·)ñ/Ÿ9œˆÄwÚ.XÊ-Û ™¥,ñsޤ€ËZü¦42†Ž°Ÿ”CsîùõrXªG¦áü¦¨a6Íl)ïš+eíÛ ragU¸ˆ†•LÜ÷„”Œ?p4¦¦+¥J˜‹œq_“Öz[ˆQ?ø¢mî˜u24¦Õry 9ƒ!a ™Ý1’BRvnçŒþ%~=Þ ÈG.zü쉰ó;SêÃ@(n’åíÕÉÛË[€ÙË©7Q3– ɒl)|¹‡²Õi8&‡_›¨JÙŠœGEC駸ëWp®öÓ=šg€ö¹ïàÚ¾ ;=}ù¿W8Ô¥z^R k†­Ÿlp熯a‹GÛ0x4ا쫰šE[¯ŸÉ–%¸ÃÏÝŠGDCØÙ°œìÇå$àFx÷ŸŸ²ü DÊd˜0Ò„yš÷# .Ý~`ÞW˜€,‡1áìK16'Н»ÿÎQÙ endstream endobj 7582 0 obj 3694 endobj 7586 0 obj [469 /XYZ 38.2500000 722.750000 0] endobj 7587 0 obj [469 /XYZ 38.2500000 344 0] endobj 7588 0 obj [469 /XYZ 38.2500000 722.750000 0] endobj 7589 0 obj [469 /XYZ 38.2500000 344 0] endobj 7585 0 obj << /Type /Page /Parent 2 0 R /Contents 7590 0 R /Resources 7592 0 R /Annots 7593 0 R /MediaBox [0 0 595 842] >> endobj 7592 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 7593 0 obj [ ] endobj 7590 0 obj << /Length 7591 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹/=€ ÀÎØC€ ääx³ ñ"“=äï§TO¤¯Ôúš¤¤n®±kïÐâ£X/V},~øã—¿oÿùÛöÃó—ÿl¿ùߟ¿lŠ]åŠÓ?Ûï. ëÿó¶ªÝöÛ÷Íëöuó²yÙÿ÷usúàËóŸ÷úßVoÿ´ÿ÷—í_ÿ¶ÿáOþ/þÂ÷M¥ªýïÿ>þÞTjÿ§âüûáçÿÚüåwÛ_=¶Ãùɼÿÿ¬s¦iÓúuÓ.Sýöí×͇¦Ò¨¢jê­²ÆnUcõö¿ÿØü¼ í¾Ø5V©ª´UqË@•>ŒT³UºÙ÷¤lo ã¯@ÝGè¼±e¼Î3NeJ%÷ps÷|ÔÈõ¹èf]t¡s­«xgœ*~s…ÞCn®¶ž@‹A~‘üƪˆŒs˜yh¢´[ ;¹³¦11Åö­û;k#òMc"Š-î=äæºÒFÛsï1È_º:"ãfKlaç!w¶REDWê¢û×:¢N8Î<–+%ôrskÓO¾è>Bç‹è§gms{½¿LéOåôp–{>|úºùðy¯Ëíן÷3;xúíë÷ÝÿÏÁ¹Wfûõ§íï‹Â<ýaûõ—Ò;kŽ'ÜÃß;¶(wlivUéJí.Zlyl±í'o-ÅçcK½«›âý7Å3jQêØâvF×ê}KslùôuOÓÛÈ¡ìA)R¹Eʲ]õë>NóruºA-~Ý-ê¶ÀoL [ì ϺB-©VjŸà8°¥0ÓgPÀY ëù[4\)ÜŸ°{j ‡G È!Eá LJ]S»vÔzúº1—+HELùT-É8K-¤µ0<Ô‚vÀ¼üãt>Àº¯ë´¬kîS×4…ͺ&¹_ƒu@Ö5Y×Ü­®Ñí©Rп̯Qæ×5د) EU¿œ$œ‡ðܰ‚üŸuÀu@½UÍÐåIÔæ=qU±;ÅŽ.ÈQ¢–âD(·ÓÝ€“®ƒ~Ó o¼X(½++UWîb{O-åΨu»‚90Ž?¥v®9ʺ}¨÷vbäjgz4Ø^)^7õC;§á8p·½:Qe÷»b¥xœpÁFŒªB«VvZéíEA½6ŠujØrÚÄÈ©gס˜j‰zó¶Ôìœ-ëêºÜ›~>“ýôÑÛ7öVÁ¹Áq0 ‹Z¼Ö«ßº7Ó‰ïy^™6ÒÜåÅ¡oð8ugJººU`f{0S%oGèÍt)‹;Áü÷Ôí å'¯%{ a]pö˜—(ᇽQût=ea-Ì> DùÜ,£†lùÅ‚7î9¶©r¦k«ðsD+¹7MÇL dÆrYºç¦XjM2ˆG®…¬xƒ2¤@Ú`ÏaØ ñhØþÆÇ-Ê>FTúÑ ,VCûð×çæC½³VP°Ü…ÑY§Ïï¦i)‚!40̬qÚ†rq`Ø{ÓÐpLf8Šƒ¼a'üð ð88Ø¿0lxÖ˜™”#äQ<€L#ºO*Æ!€o‚£/¥º6µÎ¤ß’OÓ9…Z¬7MWšsåÒTiº²9o‚¿‹X êb2Ôañ˜C0bMhAJpˆcåq(— ƺK#¤h*ë(”Žz2°A=¼s÷v:¢‚Qx=Ì’ '˜%Óz'Ѻ¹ª¸Î`yàÂíÄãÉ‚Ës~È6´X´ Åœ($t²eá¬xªÄÑ"ÎÒ ë[~¦B5Í‚ž©hà7øñ†ó›­ÝD˜¬¡§ ì ?S‰À>àg*ðz¼qžöó¸F i@PGKwÉQè=}Þë¦ ¨'®r»¢û6ÇÉÞàLÞÀÓ¿BAb\Û•¨‘,”Õ[vøú*äBå`Ü=SÙ9ha]ª´/SV;ìV¥¸#WUïs ž=懰ï¥Lx¨ ÄËxÅ‚l0|1û«2_ð!zS?vy–× 5à*ëŒ>°˜¯_XÛ1޽‚ûÌÄS<þ7"ÿ&ôt~7+´†Ã4Øëå ¯»à2†çCÇHZà'4°À½õVÖ[ êyõù‚pˆ…}b<þù5oPŒÎ êC®{Ü\éa3ÅlBWÎU ØH>8—¡Mö*óüÁ|âst„oŠ2‰ 1H²Ï/,“p>¦\ä”HGcêtÉG†ÖçÄ2‡¹ƒw9 ¥f@èk5Vµ&®5*uÕ1Gû¤§˜,•AdP Jn 7Ѭôq{Õ¹f€ðpäßó ’!˜-j½À‡_ƒX¢½N¹`:ÞàG” íÊîAÎÖ㋾Þ {LôŸ~iL úd®_¹·¸RU²Bwµ[ÎcT@—ɾ‡…*Bä»i³í¦™Ä-õjØÂxŒ?Âùš³ð¬ktÇ~ZŒÐߤRsáþn8UF¾¹S—ýž.qÑ*&0и.o=_® ïµä^Nš\ÕIØx}âòpB©ï 'GT²&*„ÏW0¸ê0·bEªRÀBK~[³» ¬ž`{ýýQ]·@½Ä¦wÒ]jÓ¤£ˆy+^‰ïBëÆ• ¾Å>{… ܾüŒ+:ØÓ©3? ò|Òþh|¥ž©%€ÇÁZ®‡zæn•Dp‹ÁoyÁåTÐÑ­SÉ6®id±®ÂsÃ{Šå”Ñ;A-2³?Ë–¢EƧ„–_«qŽ—[ í‡&jz Öˆ©Y€k6T – \à…¨k¶dE¨à¶’¦Öƒ¸ï\ÐJWÓ€©ÿ„+)aŠ% ËäA~Ãaûy:¿aê`/ K0Ak¼RÊ“!t/#sB FB÷ ´ÆÜðzRUpÃÞBP k ÁÇI©°çQST mG­Î ‡©štW›j”3¯{¬~ß"½œ\;5´d>m>õçS"»7‚%µæ\¡_H þ›-kΠ(ñ8~áò&t×%ì1zÒ©A³Âxœ‚¿½Lþ„G,H&£ Ö”ÍŸP œ8&Q5] •J}®»Áš¬h7eˆË 7¼û¨[vDG5ô‡…ˆŽ|âSŽb2qnü “=‹Ç|*ÛWØxÛ+¦B*`ö”‚ZŒÊÀE¸YK ôÚϪÕ8Ÿ(€‹ÃõBˆJ±@*I=?tn t[W£ó¡žÉp» ·“e&Ãí2ÜN¦Á*ávŒ[L…|³û}‹û=gà}µp;W”7x ¢'JS†è-ÚÇÉ=IN3DOô2D/CôßdˆÞâ!zN»ü•”°>gmðQG ®î°ò´‹»DÇ)Ù¯R¦Læ§—ëZ2^#Ã&®âÐT%g ¿£:K‚àôŸÎe %a0OÚ&«'}W@TÚ-ö£žºcê°ž£fb4ØÆöJJÿäé…[¶ôõ{ÇH£2›A +1”ª=NeC1Dâ1cGç“A Ä Ó ƒ2ˆAÞ¹ bHbÈG+‘Gg·üB°>Ã(ÆügFç“aF12· £È0 ™3Œ"Ã(HÝ›a 2ŒÂû8•çËEÀ(ÊF Œºÿµ}Ýw/Žþ2ö®ÈlÔCS3Êì uˆXouÛòZv(,}Ú×j |â½ÓÇ7ÃûœUö[<ôÎGÌ/$å4ƒ¡ÜÃG4ŽÁ9ýg8·Ï~¥(hsÒ¶ëêàLPÙ_ W ‚S(ËP¸7øO ©IK¿x…e¸ÃŸ÷3n7ÒÎÿ'±€ÆU_ ˜–Þ§Ÿ_¶¨îFcÔ ÜÌxÓ„qêÛ7 *ÌΠﻀ"‡©z™wÕP/Û—ÍÿŒòÛ÷ endstream endobj 7591 0 obj 4353 endobj 7595 0 obj [470 /XYZ 31.5000000 785 0] endobj 7596 0 obj [470 /XYZ 32.2500000 784.250000 0] endobj 7597 0 obj [470 /XYZ 31.5000000 439.250000 0] endobj 7598 0 obj [470 /XYZ 32.2500000 437.750000 0] endobj 7594 0 obj << /Type /Page /Parent 2 0 R /Contents 7599 0 R /Resources 7601 0 R /Annots 7602 0 R /MediaBox [0 0 595 842] >> endobj 7601 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 7602 0 obj [ ] endobj 7599 0 obj << /Length 7600 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯès÷’õ‚û C€Å.CC°Ž±‘ùûénQêI_©ùu‘’zä=ãf‹*Ö›UÅâ›?~ùû៿Þ¼ÿòŸÃ7ÿûý—'s¬ Óþs8ÿüðüƒ¬>ú¿U]¾ýòôýðýéóÓçÓ¿?µ|yÿçÓ_ÿ;d‡?þýùð׿>üÑéü…_ž*[~ÿûò»©ìé/Óÿ>þ¯§¿üîðëyÆîu˜—ÿÿƒ+ʼ2g0f^ýý©[¦½üüöí×§7-ÂÞÒØ¬ræ`]î¶qÙá¿ÿxúéô‚nzs¬Kÿü›|y}yyuz¯³õaâͳ¶*ÝéÛw,±Êί©‹Ó$YcE5zÏåGgvaòÆ”ñ&¿@®›—Vœ\“²MÑ´èiŠÈïf€üÜyD¶9C®”޲prEÊæ6+âQö:{ Êf6"Û\ DY<¹&e³Æzôäy ì÷ÓG˜Üeñ„¶…\+mñìšÄuU“¸×é#L^š*"çœ!F\<{\./›*—W§_Ò”¦Ž@œ~ú”wyÑ\ WÇJÇVxvEâ:—{güóëô1ˆ[ñtF ¹:V~=iÎû”ÞÉA(§”ž3¥WÛ~i•WÕÌ–±êëZëËù±pe=…9wl×ó oÛIŽuc<ø>cÑ3ø=¦€°Up6gk¥ºëTSÂõ88b C{U4½€¸@oœ¦fƒ0È Æ+e €dÉjø œM€3† ¯ôíü˜#êáôXH þ˜{“FÛ¡(dŸ†êãCŸêGPfÞØ›cYÙ3¯ÂQ‘Cˆfb)PëzòŸËgÐÓf5ÅÀhu>â˜Þ°ÅÑ4Ûú®ÀûY7t  –D ?-‘ JŒé B;bÆb\]žÌŽL:á1P/f¸ëvÿcÌ Ã†„L 7®Æ²@&ìò1ž #‚Œ?òêl°°_aØ`ÄÕ I£[À¦©†0‘:Û п»¼XþãºÑ³žÕMl‹w`ÞUÊGA-´ÐZ‡ø¹x× tií¹‚[w’Ñi)>a¿ˆqÖoÛ°ÕXˆ&FrŸy Ÿ©Ñˆ¸©Ù0lp6ï~O¼ƒÔÑ7>è•ßà“A¡ô¿ª>`Œ¢cŒ"VxÑí™Íì"·I㡪ë0HîcmQùMow2ü J#$Ë=–a¨_0‚†Ëà3»Ží¹<o9¤© ®áJñ{0v2Ì×áȇpj \…)qàéßž5yÝ‘ÊG½Æñ0!TÂlQçlÆÔ† Ç!±‡ˆÝYbÂÑ"7$ìC–1íÑOåÐ “\ÃΆnŽrPˆ=åxk‡—W7<™(JE޲z·GJ̪FS©*÷!§\äC{(8Ī.ŸÅîtCð{,t¸÷ º!³nUD¥tå€"žŠÎdÝĤ©¼óÃ#„©¢ôSšàÓÍ"a5P4„+•ÕD;îSñËÇ$t%ŒV4MÖ‘œØ‹â-Þ û~þŒnLBØÃÛd4ÉO,Ø™&‚´LŠûp|àEB0ÿ¿KÈÿ}™áŠ&XWd±]¯66”›º;Հ悫]–Ûë„ÖXb¡Qå$Ôâ`ÐZí~Ëv‚Õ󘲑X\­ *w" ýù$îKŠ0û-Ÿ(±¶ãÅ[ôHPÝ* BGì¨íb¢Ì0£¬pô ï-XåÊl¨uö¨ë3‹—ÒE®÷Ñ OQ€-P[ñ~\× Ð«É+Pi¥€2GÆöÎiýøÉ¶€ Ñsf:f9pYMá¨Ьg2èÄžn¼1d˜EãL&/µ7i}ÂBåÛÚd5 ·Ÿ4žê1˜TlŠN[ðnçˆâç¬)æ½§˜ÈóQ'[t9e!JS ‘†Ø‹„ø­ª—þ@X¸üÕŒì1OíBí}¤WûAÏ8LSœg µaJ_HxÚNHéã÷ÀIJ U±^ÇÒˆ¡&¾9–S‚öT½fmÛ –²)×£7Ö<²MŸ‹/kX'mdÍ–ëAü¬!!_ ¶c¯G÷ÛâÖUÐXNñÑ6ìýÌi—ø…¬èjü„Às Jµ×Ï(2Ëä­BÂk·GÅ…àŠOQ5 q3‚®ôè2*©Õü"•Èb´1!LqœFŸŽ€SLŽJYu>OU6¨x¼F¥ÐÓIµꢭÿêf`ߘ­Q~B'£Å”™$:«·ægVúÙ=Ï"u9*… ˜~U “*絬LGjìÓ..êÂÞ°ÁU1 †êz`FU¼>ŒKÁþ0¾‰n½³?Ð-šWmʲÅîy¶Æ:”“8”…OxÂ÷àÔ2ƒÏøDQÔfmmÛÂçˆ'J)Sô››/V#Ñ-ÄúpS,S$1ÑS½CÅsÑÆªß Ý-¦ ´p8Ž8×Byd#9N›pí‡W¡T=îŠ=Åz¨o±ÃïFK`#W3g(©Ë˜ƒ·/#ej~¾TpÆYØ;h:%7ÐÄÝÕ+—pÆ0®„’+ìÚ1I{¼¢$®À|ÉÿlºŒ( ——Ù\.q\.”rà"œ”¡î{AHSÂãŒyI»ø›5W/ÕK˜ý _\p/ˆ€Å8Ÿ˜¨Fdù‹]¸ê„ŸnD9U¶5 ù,FFLUc’I ¹Y'UãÒ$!¨ˆ°0n`40»òÑ’ð-OØÐ<ÙœQe™ f×ýÔiÖK´¦c"누¦;»GBÌJ"!EÖâ¥"!xux?wÍøøs9𘉾0T ¹Ï•÷p߇Ûãp2¬"W”Å\þºâpEÝeKRÄáf"beÞtÀà”ýú:ëžÒJv²Fµi!Ó/Ä=ÇHYüέmÅÊÄGwã˜èXØ8\£zâb‹¥q ‰sv ¼7à'FmÕC|ħÙlš¹¢I£Ê/ÙåCK]ñùàumƒÆ=YÔ•À!£ÿ ‘È ]áu©à 0'i¹r£›«ZÐûZj/ã:M=ÜÝ aLbómÕh𠅱ʹM¿ïØþ ,ïcä[¬Úí:õá\>:uÈ©e€º¿ÉôSO!÷rwé¯ZŸñ˜+ÞCyöÌ[øLŸi)d«ñ–»E‡uÇ¡+äýŽ‰Ù¼c<5ò‘˜Í g28‚WŠg3˜ ^‚ê€÷äÍÆ¬TÀ[Ní.211[ËUÕ±©ožÍ‹ÒFßC@ÞÃàÍÂõ@j÷ žñ½A;^ÑLQâ@€€ ©?Š87ÿžˆJ°°åP ªòQÝ’û@s•wõ貞ø1÷—07Y%žÉNà,ÕÕ=·ÆlTvHLW)ÕòÓ€íœpŠP¥ÂNår¦ê‡îÇ^¾´oùt†JµÖâ­‘bߢ5b*¾þ:f`8+o—¿¾â„“Á\Ʀs0âöþƒhýåÝ¡c€¹V¹øHõ,Els…]qYÊgW=ä@œÉ$ªîCœ¥zÔx¯±C³¹¸_"ï÷(€ÑªÙSª-Ö/“¸ùÇUg¬·T ÄŸ…´ÇÀ2íu–¹@9A€¬è޲3û5å®ÐŒ©#:† wÏŽ[È&€w‰cÁâvV`Ì8ˆÚ-Î]ž&Uа”ßÁ@D‡©ÛYgÇ£úzk)¼^3c.Aƒ³¥ºVÎ' ™^LçO|œpAÄ›prrî2Õ4<ÖwÕÂgjVs­Ïšù% µnèD$ð">)«:C-¼žü]BüöÝ‹0ÿbžÇœ-ô&Ö½®[æª1 >߸b¼åøü#3Ä @á¬:>Š $ñJ ûšRÎ3îù^¡ç¶Gø=Xš0~ñ©üË £kî| lDZÕ" ‘…“JXo$’gÁWLàéaNÜ$ÇcîFÔJônж?L­V}Ã[ó®40'.ãì+±e®©¦.$f®M}0ÏhÍPS{k¨ûVï3Õ¼d0Ý/˜^%ŒM`>©^­ú:)õjSlZÒ˜Î=‚^ݵç hJiOìSbÞIµëfbX„»1­Ü¶¸wØ–mîÇ1/;&Οˆ“Þ¥¦³•ÎôõS m¥3}Æzù=ÞwïvoÝPïv/¡Ý#°³MÞ4¿\½¿p½P5“¿MË+hBj•9)¥WÐôoMèXÓÜÁ#Œ^]>˪»Ò=/º½j³zžGÛ‡-Ï}{&3>Z&SY¯;÷è¬ëo9HiáË>2¿ø¾›¹ÇGó0¿çl]Ìsߞߣñ›™¾Ò9¡îʲ<±l¤ÊÈí:eþ]ð¶Ù¬Wæ²Yxm·õh±·¤¤ìï6NiAêäš#Qnk· »™± +ÆÎëÊødM3 Ïë±:{ƧåŠÜöUá -bžÏßµ©ÜQÃ9k_2ìDà æ ]åûBt›T©ÜxÐO·}Ám(ˆ^%Ê·tÜÞJRXÓ‹iÓ‚ŸYêR÷€FŒLs!¡Ýâcp3uIa@—0³˜c˜Û|˜ÖBL#'Åž†1 RU -ÒˆšMb±e ~ˆ~¾L¯§q×ÓT&Q£‡rÂ2Εî%éƒLLŠY¸þ–i»¡ÚÀev+²Ãb˜ Ø—/Ž… ëØ‚º:Ÿ…GwD9†ßƒe_IÃÂX/\Ëp9Ëâr&À–H]­{aîI~¬Yš„KÛ‰vUT1xB­Xd÷”b¯y$™öÅvxo(­Å}„.Wnæ¥R¥´/ÓÈ Û "išA;“Tc»õÈæF%(^x ú<†å™²ga6ŒÆ cy^ÜÛ4$±ßÒŠD)ÖF5$l)+èŒÂád]R]Ü“&]óˆ°Â:ë¼ÛÃÏ@ÏŠ’™Mz}IwÕ=‡‘ö£]ŠËD/7Y¤(Ä©pôRµˆB€ ÛÍD…ס-î{cÊ å¥ ËZŠæ®oûH²}ä®oW¡o•)ïúÖ<¤¾-m9‹ß}DYóaXB{¯YÛ­ׯGwÊœ¨•¡í2ôÔùûT­r‹¹j¢,·åÅì˜].÷Ó¡x‰Î޾ÚûN[¦ª˜? ÷äs5ÑS°}ò+EHãî ’ÀZ¿ôѽHMM_Á‡–añlð_amƒ–^]Ù–e¸óß'ˆ;BCÜùDg dswˆO±M‡ïöóçï°y6Á¸õ0¾á3S®Gà,‰^€K Ä…/Hd ©Àà © ‘‰¨í9>süXµatÁé} ¾(øê78î†g!ÁÏ<ó%YEV™üèeâ…Fƒ¦Ëo·§ÀyvdiÖÒ>|~ú?©ð˜, endstream endobj 7600 0 obj 4356 endobj 7604 0 obj [471 /XYZ 38.2500000 575 0] endobj 7605 0 obj [471 /XYZ 38.2500000 575 0] endobj 7603 0 obj << /Type /Page /Parent 2 0 R /Contents 7606 0 R /Resources 7608 0 R /Annots 7609 0 R /MediaBox [0 0 595 842] >> endobj 7608 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7609 0 obj [ ] endobj 7606 0 obj << /Length 7607 0 R /Filter /FlateDecode >> stream xœí]KÜXÞׯ¨5ÒTîÓ !%é‰R”H, ”a@#fD˜Ÿê²]é¶ë;UþúøØ®6$ômßÇy¿î¹oþøùïûþ¶óþóö_Û¿ßÞ¹C™]óŸý㟞þ T‡ößû²Êû¯¿ì¾í¿í>í>ÿ÷Û®ùàóû?ÿõ¿}ØÿéøßŸ÷ýÛñ‡?¶¿ôø ¿ìJ_ÿþ÷éïºôǹóß?ÿ×î/¿Ûÿú8c·\»™çÿÿ‡”˘üã6®,ým×ÓŸþüöõ×Ý›ãV©}*ª°÷)¦½¯SØÿ÷»ŸŽ tÓ»C¼/‹Tº—,T†Ç•R|÷e÷æ£OþÌbÿå§ãæNk6}9%ïx4êãèûß;çÓö_~ÞÕ‡"än‹SŒ„whÄE8ò®S ‘XÿFXž'½%ÎóŽ@脚€5<°·0~×xî QŒS¸ƒˆé¡F°¶Âv$(Ñ Öð›@ð)Þ…£½aüà½aé‚%’/‰½=\‘£¾UçÔZ¯ôÙXë üLп Cñ:„ìœD¢Ø`8¦ç§°j –L®Y²ª;°5(õáâ)BõÔî4RªÚàÓW”ùCåŸ4`KÝd¡Zõ±RÝ2k>ÄCNG»ûéˆp îîÑ4[K—vG\f ͼï> „Š7 GÓGóz¬qpϦ³¥q ~p;F eèñ$¡‚8‡$µ@MìDh•‚µñÁý‚FHÂ3÷†7ÁP€»@8‡–1m3æI„±Ü߈àNœ±+Řà8|åÁYŒä[§ Áòzéb£) ß;fŒË¶ä Ž„ØÂa‚ÛJì:2¡8UZÖ…ŽH;Bxˆ 3´!ª ùõá4%!ñ™@?ÆuÞFïNâ#Øh£j9«œ:Är°Ÿ¬4¥®6ÂZÂaË*R_ÝEAõ¯×W­}µna¼q¼ÂÆNP®&lcãäÔì²bÙF–nµÙ é}5,ùˆ¤ ã?± 8.àv€%ö‡° H”QÅEøìÛ`á 5r,u(Ž`QÑ(];K];‚ˆ;lqømd½#Êó6Á§B¤ïZµ ÕÊ&Ø´^«õÊ®°lþ8üëɦ3)kìïnÚuY¯Ö»»œ¹‘W‹Ï#ÈÑ…ç²ëº+œÝrÙ¢§õjrÙ Ånë-c½ 6.S¢g’‹Á½YVXÕ7Zu¾Ø†ÆbW1n˜ûÍ.û{¥&¢M¬³l#Ûˆ­Å²å~¥Ù¶Ü¯[o<»ÒZS ”d•Öµ0¶|ñ6²Øjd¢ÕƦ‘Åly!Ù»i꣙0äU3GÛÈ6²,_#'œóÀ’‚ÈÖRíø˜:»îÙ‡®þÖÊgÙtÁ6²¼¶‘MâsÞ™ž.ÛÒe_“r€.‹|ÚÏ÷£5Û¼Ôb 7ßÂ]Ô}Á`S,¦ù–°pB#Âa¼ö好áó]Ì"î ˆ¡ƒ¿00ƒ›Fk7Ü„PhOˆ{æa@ÞÞîN€†¬”ôçbƒ˜Í7W}ìuî[#–ë5È´ÔnÂAሠ+¡<Òk¬ uIÕW&ŒÜˆ…h„‰[:ŽéaIPÓK’jïŠù÷’dTS/ä1 è0ÝNñ7 ™°ôN†L:ˆbÈ.°ÃlÿÄþÀÊ[8rMŽ¢Ì1J['­¤Xd bsÌl #LI‰9llB(ˆÆÉunCOçRVƒ.F Mê…1R™oÌE¸*ÝR^ anüN(Êcä c¦áÞ÷8ê÷FÉ}Æã&ø‡|Š ¸Œð…°$ÕÕM·Þ¯É-ã{9§Ö3mœ08ýDàjØd£•±w4j›k•@²Îó„­Æc«éöç·¨p —L€€‰¬Úz “ëx*AdŸuýcbJºbN7Æ8:g>¡Úô.V=½ÙöŹÉ냀ó"–ÿLZ "ö¥l÷17ª1CÝä®ìQ~@Ш†i„èœdB- |ëšÃf  gÃ6!Êf^[µŠµ`°+WVé8¿Ëä&2™R/V¹G”/z8–)¡" ñhfì ålÁ:Mg«šU#MM«L!*U‹¯íÕè”á±Ô:PU{__¡h$`q^²IÕywhB:OH²@#-©äCÔä¿ÿÇßÔð›ÆñáP”þyü²Awyˆļ; ­:>WEÂàÝø½µwá›Ö˜¸t¸_q§^­)ë5»¯îînÇó6û¨š8èÅ%””zÅ7Fdîµ,(8Õœ5ƒ Ê^S5” uéîm0ÆD“oÏ%ŒqQF”=ÜnÕ(;µQÒá¥ÌyL؆É>/*§èsOCp£˜r\ Ê+⎫æì8§Æè¾'s†)>ZthSs_~ „¯ì0ɽL¯ÿélŒ©lÆ\ÀÆÔ—óJ¸Xl ª0»~€ æ–P¹JÆPyžïEz|ORé-&pð2 ),,<±ƒ¾48SUåQ†v%g,ÖmÃ[ñüt»Ð*‘xŠ7þð©sÜdFxNF­#T2¾ìAŠJ¿`«Ì¨Ü@uR8ª€eUm dn KˉF3”1mª¨+:æ. Ã0ª¹T|Òöýq¨¼ý’;³YÆŸQîû -¾÷Ö'ºa(lüQÜÏ𑮌G¦6M¨.‹”zêRåZ壬¡6Dù#Sx¯Ñ›h¶VnV·í©¨q)›‡y/P“°ßV•›ÖÚ˜™L¢Oõf²òÝ þªË¤´—c /ôxF°6ŒîuQYtBÜH•R*‰¿‚nÒw=–çnML¿`Ãýqh ïà=Á® wG~iöfBmj½PnÀcí_€Ç_÷sòB(Sõí¦“6õšCå÷ðíßmb^v½”P³Ò®JÄTÅ¿s4n6L½D¯uݽa¸yâU+Œm†F…wµ‚¿yk'‰—ÄÂ;«˜71U@Y“±¦c¤*~³c˜‘i„„ÄÚˆzçeãçÎJ²á¦P?ç&›U‹î5"A[–‘m,ú%x+.?i}ÉrźJ_ŒSÊ΂'¥^ÎÄr™±1b)BØÎ/`,@Dünå5굑UqkuGK"bÈcÜc‰‚qÏè0#ÏÍJvZYm¯ÇÛöŒ0Ü–Ñ”ÄÇœE¼GÌø¨ tõa4|2»¼yKIUŒ-""ø¼Ï<¹Œ^´ý¤êíÍ/¹„È,cÛï±bm¤‹Ÿ„¥Ý’é°×…“úé9¤yd´ÍéR\J˜zp|Ž(bâ¹X"¼ŸÃ,bDd#(«‚ñ‡ˆX‘°²ø×é]©ê3e.Á˜Ã\b”•$_e¨sŠpÏf×9f¸d«m³·): ô;¦^¦‚„€™í±é6i×Ö tlñc£?*gæ×›\_¶\Ç{cx†¨d*!éÀ`s:S+¦ 7ÆkÂ^  fð£vÕüº´+ÜD2©]ƒ]¹!ì Ç{–,ou«–rRú÷µ1ý[Æ_‹XÍsºqVÁ‚+.æ÷3¬j1ãÏØpF.ï™ïKóJ+¢ŽXàT¦Ž˜·´Ö©Gí:ãJPÿÑ•<ø.Q?Œeþ ZnF§U©µÍ¿AÚÕ3Õ9™œ®ô3UŒûWrªJ_Æ{œß†[²{uy®3U¾Øœ.[çXç¿O´ÒØqoI"ø†‰jýÃü÷bpuàüž¦Äí.šˆLÞ°…‹±`Å?÷&‘X[Éd©]Ë™2Ð6§«':ƒQM°r  •²äºA,_®˜Plåî9GTëãÃ/ºƒÅ‚yëõTܬÔRÍÝ œ¥z ûK®&õØošÝ¢èzóéîN`ÕÒ©Ò=gÇ«b }H<¦ÅÙïÅ/ÀŸY035 Ì­ÑùïŽànxºµÂ:Xþ¶*CñX×ZuvT)D÷&°êlL´O€5ŽÓêvFex›‘Û}lÓìoUÝsEJí¬+R–Ü#hÕˆ ½„®"v诋.‹2íÀÑŽŠl™î×ä7 ¶¶ލo§øt~û’¹…·ðþ²u5‘mµ ««ž) 9ßDÿ8FÆF\o¼àxÉVo|º‰¢«žjº÷'™è%¡¹­2ƺÝÖœoS8?Ó½^›ÓEëì“Е–ˆ¶aß$CÛ ß£x˜¨^D$®xÀ0pÏFH8<¦ƒi'`¯®q¬Άß勘°SµÿW…Ó…û@…Ëæ¹m«¦7ßcꮄÛ"[äòC!„}ªÜV·ËNæ=ÐÍ[4Ó õ®TSZú¥uVÕ0_U¸úŽ_(¼_ÃKTÍ~±XµkãU”NºÕ±Lµq¦^ê6§ËÖ÷,™šD¡Žφ¹ŽÉ¨3o\Ìž±]§=ÅàÇ$,í_N$–!+ª5d_ŽºÎmØìË—Ep÷œ# Áü†Ò’#y[oÅ×w{ІÏR—O°´%B•®bu«Ý%­ù¥Ðï(9†±½ôŒ\twÜ °ˆa ¯­ Ý|°µië &…¿tAóVoK¿’2¹§¡\ªû.{6{±”ˆóÐ!r¡ºoÃèÞÈÄuÒ¸šXE¿…ÎyD§#ˆH °»×G‹˜î¸w_‹‰Î@h“uö [²v\ÏËø 6œQvña=?¹K&wZ2ÅÎIŽ@Ë"Ÿ ð تCU»ÞHœtH±ÌÏêà7 J«>•š¾­¹0Òzç—f˧‘xÈ©¨JyKpáPÁ-Áé["¾´0ðªi!K$…ŠÃ2[5„=²‰j.À¤‡x¸èÿøgÿíHè"|ºö 7xÃÕ%&‰G«ÐùGvÒs9rÉPm誼`6X ‡Ðøa[ Ž´R Zú †¶'Ef<Ž ¥ï[rW|ÃbxÀV¼_š¾¼â·^8†Ç³ÁoZ‘çGýÉ;G,Á=þÛEr€° y< „kžÜ%²éàÝü|èW_ší"\{Þð1Ï#Ðf#†v9ÂÀC†8²‚X`àFàTàH#l·‡?m\pú¶=Îb6Û_¸Íþ¦¾˜óÄþdYéâ¡å‰g ª®ÖÄ»´'á‘«šþÓþÓîÿ†§?å endstream endobj 7607 0 obj 4566 endobj 7611 0 obj [472 /XYZ 31.5000000 476.750000 0] endobj 7612 0 obj [472 /XYZ 32.2500000 552.500000 0] endobj 7613 0 obj [472 /XYZ 31.5000000 476.750000 0] endobj 7614 0 obj [472 /XYZ 31.5000000 553.250000 0] endobj 7615 0 obj [472 /XYZ 31.5000000 398 0] endobj 7616 0 obj [472 /XYZ 31.5000000 167 0] endobj 7617 0 obj [472 /XYZ 32.2500000 166.250000 0] endobj 7618 0 obj [472 /XYZ 32.2500000 397.250000 0] endobj 7619 0 obj << /Type /Annot /Subtype /Link /Rect [60 440.750000 127.500000 447.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_nn2 >> endobj 7620 0 obj << /Type /Annot /Subtype /Link /Rect [60 433.250000 102 440 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_simple >> endobj 7621 0 obj << /Type /Annot /Subtype /Link /Rect [60 426.500000 123 433.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_external_docs >> endobj 7622 0 obj << /Type /Annot /Subtype /Link /Rect [204.750000 526.250000 304.500000 533 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.tcl.tk/doc/howto/stubs.html) >> >> endobj 7610 0 obj << /Type /Page /Parent 2 0 R /Contents 7623 0 R /Resources 7625 0 R /Annots 7626 0 R /MediaBox [0 0 595 842] >> endobj 7625 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7626 0 obj [ 7619 0 R 7620 0 R 7621 0 R 7622 0 R ] endobj 7623 0 obj << /Length 7624 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ÐÙ€Û|ŠØg€,v‚‚uÈl|ÈߺEõtKúJ­¯)JÚm¼3Ó‘ÅzW±XüáOÿQüë÷â‡7ÿS|Žßß|<¨cðªý¯8}}ý©Žñç"T¾øüëáKñåðáð¡ù÷Ë¡}á㛿4?ý¯0ÅŸ›ÿ)þö÷æÃãþà×CСùþïó÷:èæ'uù~úüçÃ_¿+~;ØM¹ýý{ç+«Í Œ‰©¿ºeêó×ïŸ;üÐ"`Þ,µ.Kã ílóOíLñß~j&è†WÇÚiJÔ#sšÉùfS«Â5xêOtþJ3¼^`ðê„€¥?Cž+Ú–Z=%qkcZ·q/Ã/€ÿÐw9âž!OޕޏxôcUÆÿàÏäÜÕ g&”ÚÐU1¢3¼Òu©BåàÏÌìÎ kÕ™‡|²øÌ~µ™OÚ#'ªõi±Ã™?̃óÅîšk»k W mïC|F®W¾™`ˆÜ‡4à oñW@ŸzAŸ‰èÓª­,®-éã^hVžüÆ…hÖ{K4+•.®Õ{¢Ùr6Æ Û XÝ.94ôª; ÷A, »¾‹6¯¥Z÷[^Â-ì0–'ÿ¸méâ\ÙúòV¹B…Ëð „ •rõrAÎòäX‰qˆ0zBâVº1;-‚|ZåÐ~Á_.‚m!OŽ•H\aôeuFe2²•­CKš&¦MO›ËèKÞ…¹ê yj¤tLOIYobNК²R/Ã/ýÊ/—rl!Oޕ޶ƒÑ9/kÊ‹C3’—|Ðן?¼o4IƒÌ²øôSÜyÎöÛ§)¾øþ” ÷¡øôcñ¥LýÇâÓ/‡úXߨ>Qïá“wðI5ÿ‰vè‰Ã£a¨ñ;f>öõùÉ»O a§I£""¤Ác^CHK‚Ž‹W¸Œ©ý$…Öç ©e1_A˜•*?ÿ‰Àó¯àhoàh˜û°®ÀòGpç0Šu^!“œ˜Eƒvð¥‡Ü÷µÉfZ tPË |I`˳‚¨ÒÊæŽeÆÚGt9澤ž£±–‡<&øz¾<3£1Pc¼™¡Æ”Ã@þÇ> ¦Ï¤¶Ë#Þ<À—!Fi‚ÔJ,›Œ4a½LXºMKÆ.=dõíê|°Só(%¨·kÛ]¬‘ðhPN©Hi¿žUÐû¶Lü yCW*xOû‘Ï~`M¼:lYGk,§D$KY‰ýêÎúþß²P8#¹ð£³Eæp´\Ú.í“ĺÒ‡¡öúÞå]b6¬½ùYŸ>ûÕø•ª‘Úõóó1lxW‹à¤-ëÛõŸ$Þ Áó$•tìãàŒ«àw±^ZÉÚ²üPãÌÉ3§²„•0Õ½ðÌóññ;DÕɦ³:8bÀÚ!©uÅ1ËúTBÜefŸY§ÖæF« ¶mÃQ“ÀV‚ÁhR[ÍÔ@>í¡Êk]WkaŒ›nϼÀ8u¦V݆¹mUˆÖGïÊ*ø+ä´ä©ŽU­Î¾ ~§}âŽÎ¶=B^HjÐhøÛ©øPúÞ;­aªúRc;ˆî>òE…G^ˆ?ZSé[<š/æ‘Æê $m Ž6€‚¤DC hƒËˆÊsl4‚úÌzc ‘MEpó€‡àŸê·pø©'Y4Ví»*iAëb+÷¢_{{Ø×ZÂṼˆ!2Û¾Mæy¨]xƃ'jN…È'—,äòµˆa¼!˜Ê'åÑvÁMË íuªµ0Ôx·ë ,Äz<®äg4>äæÌÙúškËÚNãÜÖe!—†$NÍY¯+Nä/7¡£Cãw߯{³°ÈÔ®ŸçŒ˜Ïƒ_ÛÕAìkštËõíÌi)ìÏMVÆå¡£WO:¾ø¸’ Ské*#ËúIÇ—'ÄéufGNå;›TU-Cá W„W«.»ÏôXH»³“˜“¶\íõ _»›‡_Ü¥Î7¨ZU~nñª`ÔEÐánPâ}‡Ao’À'Ô~³±’iÓoxX¼C…±ƒß!öÈãm°¯†'Æ[;¯zƒ`üéV»iÛí?õýyÜ•v£m."»h àe£ {ÜX|ðNâû>"ïǬ ±bA$˜½{¨dbšë.Öy‹h;ÉÆ—îxçYÒ2U¡gš0K`íè !ÃÓ”–³!ÿ ê +)\Gsó¹£xF-¬ŽeзHiFû£ªí-^ÁÑZîÔæ¸3‘1èjZ Î#Xr¬œæX"\ÂT»ô'fØz(·¸|ËãRÞïË2~ˆ° ,eô1/a’b©Õ5‚Ò´P?`n&â\r´×kA˪Àz¦•©ȬàôÎƳó©‡ÍWâ(iFÉ$ÖA¯ûú„(«{|Î"á0ܶpª›$¦4©o¹Hì•!i¦»}£õýZA˜<&"3öy†¼KÌ û_½jzŽÏx|ë³§…m`$+ñ® ãF¹&2MÙíYé÷9p·ºÀ”èI\kyŒ¦új­¯à;|RÃÑZ iwøoÐhÛ#£Å³7³æ‰§gAÝéݲ¯k±®ú£¼E3kŸä2%öRrå°sÆ8ÑŒC|€=H¸ Hp‚kž6YC¨!„$p@™ÈLü7´]µÁÓsس„ ĈÈ2c§s>Ž .øðŠ˜¤Á)xS¬s¶!×FBnŒÑ÷Y=úDÇõżÌ… “åî÷à'8@dž™IŒƒû…™~`H1.¨Ø¬½€j"‰'ÄïDXŠa›Ù$ј’Œ 6¾WìÚ*=T'y>‹³=ÝIUüz¶ºþàæÎ#ºŒ{áVǤ ­¦¼æ—Ãþ54“3¶´ÒŠu{³öf  ðii8…ºŠ2Ç™\:!ˆa²ÄDr‡rú“¦d…jÌ£KT˜ì¬´‚ Å™ô·à~QÆœþÌÆc±­—WeÏ|=£¼T¹o"ÇC÷íU|ì`Kn":~LÚ¤Óºî œGð჉ÀãÛŒÂàãèð¸>@‹çÁPcà–{ji…Z•®Gß|!HÕÝ÷ AV AŒ~† ÏD|ç‚ÜǨf♤G„ƒ*ETD¿“tp>£RüþP‹Šè§rYï,¦ìœêô¾à˜0-±kÄ\8Î4£ÄmDq3W¢¹&n—„¯²‰y¸%OiT®GßÌÇÀ—å^71îa_‹ã„'“®Ê¤ÖßϤ_Uhlë¾öeBc!ÆíË0+âËh¿µÝ¹y°áôNCàæüL9h… ÍÀѤœÁÍq ~¨’â< ª—2ô³×Èì d 1w’QÃsÒ|¦š·fOa ËöéÚ7X-ë<ÔÁ>‡§ó°Mç!M··%ƒ{k*/á ~kF7‚ÚCy‹Ž¡îå+ôDa3Ñ*£‡ÞcÓBu4ÊÞ¦ª§ºà×=º‚Hê¨#{èzxxîz‚牷)ìM­¼+o´q_k &H±èšêè|ÇðØÖ`l…-lÆu[PwŽ…õ8ø„-š°Á1StlätY0§³dÞºîpYüÝ«JA¾­«öÓP”õ±Õªûä󡬎Zצªôå¯Âõ(ÝoíÍßÇßíéµ¢ÿ¶Ìašwú˜¢ƒ´åvŸ?^—ýèmLFzw!,McêO·HHàÑ’B='œqÆC‚Kû°÷}/ÙÄJ÷ž)mõ̧:J½)ýõ÷)ÅúÄÛ[}âݘ>ñe_Ö›OúäôWáz”î7{«O¼Ó'^æÐC}Ò|ÖAj®õÉeŽUõ‰¿£ç³ož« úf›¹ß-)¥Šü¬ëpýÁã’Ì­¤;&)Á÷¹¸ùd )§¿ ×£t¿™[I zLR‚Ì¡†’Ò|ÖAª¯%å2Ǫ’º;4®Äêó\âm„!¤j§S´„ *g˜/ló¶:º[àCÝ™Fo®?X£ÛB¬a(íåØs_K’«(f”åÏh¨Ÿ«6jÆõ3iY™)„›A•g+3ŽÒŽ–éà+#vTJAÞga_Ú£“1e5Ö=êöˆ‚Šä»/yȵ6=s³¾®`ŽÍ¸¢dH3⢠a§1i›Å9õ¡¡Ú„þ X{Í(w%¢7á\Ýz˪»›YèÖ‹ûë2ÝzqOÞ˦Â@:º]¢¡æ„Pw‰è‘'°gnÔêc°Å ‚aÏ\Ÿ+…串Úb*@¼ P×l˜r°?±Ð™évÌðN®>ÈÁ”=äÞ´ïôÖ¿Lâ±ÅžáÉ0K\…¤¥@±Õh– eCèÝ0¶ޝšÅ—n×Ójæ:î¤Iã뢅wpE%M8Ë%ðeÚ0Fñ\°qÀ\ÂÌÐîcàzp¾@âz†ÚÂ…Ì«`0W1WˆC©Ú%N«»D¹Åg›ö©Ÿ 4 š C€©Å\ÞŽ5,,d¤vŽÿÃõ8¢%¬.Äsx¥˜G1lÉüLËY¥Ã¤œ G `1!æA+VσyL ó?^)¶@X×@ŒZì`ÉÈ$3ŒÍÈ&3¯3ÊŒ-'1"<Á弨–&Fÿã2[|ØÑP'öÚ°u$KÛú¹ &'N郤\•3â­­ž„‡ò/±™4 ó˜&¹(œÑ&×þ2kN›\v»BÆÇ•D†ûüŒTJ]®ÒIº/‹-šÀ³D+ÁZq—Þ@¹ogÿ—ˆu(/’ÑìiñFä©=@°o²ºR¹üõ¡Î—” v+u©—§"ò¤ªµq¾q­Ã_ùU+\Å4\!ð'UJz{×vz˜P‡˜ÃϨ>Ÿî`OtÌhpÿyz¦wå"-`î®»Ç×YÓY\RmÝ-6ç¹<~b™ä9³‘„ÝX&m°úÁœ¼Á86à;[ÙøêòM™$+sŒdŸ¡“`LšÚê·[TG{;‘]>at4NìópE.^Ò-Ćp3 .”ÅZ5SêC°~‚âx¼Rlõˆ lfËèuf=Dä>¥„ÚR"J–Ò–º3[~BB.ßA£J3ͱ»|ÂØ]\ÚDm¶2þzÒMT\t«S°zK>týH¡Ô–Ÿv3iUpAXGáz%¼Í ÌpAZýÛñúŸ˜‰Lpv‚8’NyŠI£™møFoG§=5äSC>5äV4$ã~ÒÔÓëÞå!Rb —±ÔbIŸz²x3ÇÊÔ]UxâfŽoá;°Y`×Tóå¦#ܦ°»›H{uÆvˆ#mýJ8ÑÚ¿cqCFød‘õ,_Ûd¹•¦±Ž¨Lû;¸c/ôÝá–$0%2Ì…²)ýû…˜®îL ¾%vÍ)׿xWAû oa›w Ò°Cófj©KI0Û1’=£:hQ>(¤ŒÆ^5fÚÚØÅû¾{ï{pÎåИðIÕ³p»†€©€Ã+e.ÇKzM€$·L—WfºŸcíû­W¼ä#ímò ŸSniŸ,‚¦K[ZM?e-1¸°ó7f@æÖü$—pÜ_’N9úxLÙu²³ûSe¸SÇ·Á¦åRÔUwßRøÊÙÞƲ\Ì.®`aj=‰æÌÁK!Ó§3ÒÄ]Zó§=ÂÎdÄ™Vö¸ÙbÒFUÔJ·|Ñ+wËðù)ÔA9¬Sܤ±pð•Ssz?ݨ…ÑœBCR,qŒ®cvi¾2­n®$»ù*¾4Œ!ò͇©?¸CTcLeµ=*}J©œ7‚®mΘ,¶p‡¯¢ ËÌÑœ¹aXVŸÄ†Of¸Aa4tuߢyìÔ‘Ê1ØÞÇ•²JQ?`UâúJ ç#Çv` >L„$#ËÐx4øNTzÖÒ¯¶Y†;ýÜ@Üâ.– Íbã|‚9bÊÑÛÏE¨2-” Ûz0|<êîa`,ª˜[ Î-|r}艥|PöµÆ @Y70ÕÙ&êÏ)ÝY|8ü–±Év endstream endobj 7624 0 obj 4889 endobj 7628 0 obj [473 /XYZ 32.2500000 320.750000 0] endobj 7629 0 obj [473 /XYZ 31.5000000 266 0] endobj 7630 0 obj [473 /XYZ 31.5000000 321.500000 0] endobj 7631 0 obj [473 /XYZ 31.5000000 266 0] endobj 7632 0 obj << /Type /Annot /Subtype /Link /Rect [60 230 94.5000000 236.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn2 >> endobj 7633 0 obj << /Type /Annot /Subtype /Link /Rect [87 223.250000 126.750000 230 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn3 >> endobj 7634 0 obj << /Type /Annot /Subtype /Link /Rect [87 215.750000 138 222.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn4 >> endobj 7635 0 obj << /Type /Annot /Subtype /Link /Rect [87 209 139.500000 215.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn5 >> endobj 7636 0 obj << /Type /Annot /Subtype /Link /Rect [87 201.500000 136.500000 208.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn6 >> endobj 7637 0 obj << /Type /Annot /Subtype /Link /Rect [87 194.750000 207.750000 201.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn7 >> endobj 7638 0 obj << /Type /Annot /Subtype /Link /Rect [60 187.250000 144 194 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn8 >> endobj 7639 0 obj << /Type /Annot /Subtype /Link /Rect [87 180.500000 147 187.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn9 >> endobj 7640 0 obj << /Type /Annot /Subtype /Link /Rect [87 173 105.750000 179.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn10 >> endobj 7641 0 obj << /Type /Annot /Subtype /Link /Rect [114 166.250000 171.750000 173 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn11 >> endobj 7642 0 obj << /Type /Annot /Subtype /Link /Rect [87 158.750000 104.250000 165.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn12 >> endobj 7643 0 obj << /Type /Annot /Subtype /Link /Rect [114 152 197.250000 158.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn13 >> endobj 7644 0 obj << /Type /Annot /Subtype /Link /Rect [114 144.500000 198.750000 151.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn14 >> endobj 7645 0 obj << /Type /Annot /Subtype /Link /Rect [114 137.750000 155.250000 144.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn15 >> endobj 7646 0 obj << /Type /Annot /Subtype /Link /Rect [114 130.250000 252.750000 137 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn16 >> endobj 7647 0 obj << /Type /Annot /Subtype /Link /Rect [87 123.500000 120.750000 130.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn17 >> endobj 7648 0 obj << /Type /Annot /Subtype /Link /Rect [114 116 195 122.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn18 >> endobj 7649 0 obj << /Type /Annot /Subtype /Link /Rect [114 109.250000 166.500000 116 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn19 >> endobj 7650 0 obj << /Type /Annot /Subtype /Link /Rect [114 101.750000 174 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn20 >> endobj 7651 0 obj << /Type /Annot /Subtype /Link /Rect [114 95 156.750000 101.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn21 >> endobj 7652 0 obj << /Type /Annot /Subtype /Link /Rect [87 87.5000000 130.500000 94.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn22 >> endobj 7653 0 obj << /Type /Annot /Subtype /Link /Rect [114 80.7500000 168 87.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn23 >> endobj 7654 0 obj << /Type /Annot /Subtype /Link /Rect [114 73.2500000 190.500000 80 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn24 >> endobj 7655 0 obj << /Type /Annot /Subtype /Link /Rect [114 66.5000000 178.500000 73.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn25 >> endobj 7656 0 obj << /Type /Annot /Subtype /Link /Rect [114 59 178.500000 65.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn26 >> endobj 7657 0 obj << /Type /Annot /Subtype /Link /Rect [66 294.500000 81.7500000 301.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.racket-lang.org/inside/index.html) >> >> endobj 7658 0 obj << /Type /Annot /Subtype /Link /Rect [336.750000 294.500000 348.750000 301.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.racket-lang.org/) >> >> endobj 7627 0 obj << /Type /Page /Parent 2 0 R /Contents 7659 0 R /Resources 7661 0 R /Annots 7662 0 R /MediaBox [0 0 595 842] >> endobj 7661 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7662 0 obj [ 7632 0 R 7633 0 R 7634 0 R 7635 0 R 7636 0 R 7637 0 R 7638 0 R 7639 0 R 7640 0 R 7641 0 R 7642 0 R 7643 0 R 7644 0 R 7645 0 R 7646 0 R 7647 0 R 7648 0 R 7649 0 R 7650 0 R 7651 0 R 7652 0 R 7653 0 R 7654 0 R 7655 0 R 7656 0 R 7657 0 R 7658 0 R ] endobj 7659 0 obj << /Length 7660 0 R /Filter /FlateDecode >> stream xœí]K¯ä8Þׯ¨5ÒÔÄ$¶„¦_H,ZÝ Ä5b þ>IÅέ8ùœä+ÇIÕ½Ó‚îr?ÏûŸóão¿üùü÷ÿž|ÿåßçoîï÷_NÅ¥.‹î¿sûç‡Ûi.îßçÚ”ço¿œ¾Ÿ¿Ÿ>Ÿ>7ÿÿýÔ}ðåýï›ýï,Ï¿kþ÷óÿÔ4þŽԾðË©uó÷?¯ÛZ4ÿ*ú¿ÛöŸOøÕù_m~87™áïti¥Qí4f†þ~òË×?ÿýö¯ÓݬŠSVÕYh¥ÏÂjyþÏ_OkðÝ«…¨+]÷ TËëH²DÚâ¬d=èú'M÷bƒÎMYl×ùuæÉwE¨JÄ{Oy¸¶nƒšÿ¥ß¢—îÓwn +¶;ÜëÌ“ïŠ?\ÜûÅT²Öea ü÷]›&*w"Z˜ Τï~‹/k»]ç×™'ßwà‘Þ›ƒuÿÁ“c›v`£Z>ÑŒ;Á$ÊBت¨†ÿ¾gdÛ®GÃÉæ#›ÝFnÖœu«…–åÄÈŸ×ôÁNóEÐ’·‚–<ëóXغ ›Í•Mc Åãͽ‹2è†ÁûÞaûŠ—í“nûDÑMÍžo'j¡øË£œYUÚÍÎ,èûHgVUÅÍ™µ¿è̶À³)`8ÆÙë’E{^ÖOò1 ЮW€cWžçOÍÿÚüàðƾ|:aqˆö»¯§?5¢J#LWç¯k8øu»¿¾6Bqyþ¡ÕBMóë/ç_7+þé7ç¯ÿ8ÙK%K¿åݓ¢' '~S|‚ß¼ƒãÔðIŸhôDÕâÞ$ì­øŸ|€OÔúÝÁs+àîbf>~mok«y™‡¤B®?a! ŸVbá >Ç\+…½)ü |¢Þe„ UϯcÞ_LEðºá9âýôö~ý7ÎàŽs\·£%œ¦¾˜Æâq MÂgZ§€¿‰ÌîæMŠMì[„3@¨Â³V˜g@:ùsnÌQñJ1–à@ 9<UpߘÞ"+ŧMÀþFáõ`ê‚¥$<‚·áo²Ñ\ “K†dx–;ËŒrDYÝ!GP²ÇCR®ˆ„a3žVó7¿óêCÆ™Zý¤ò©Ä°HPéM$×,'\ õF9–œ0Ô rRŽZÉ¡u)îBþŽH#„},+ÖÛ`Z.=7"×âs$,@”=‰ÐÊ"–3†Úà}Ã:+Ë‘z{d¥6áoö·6`MŽ¡Ýƒ½$RŒY„×Ú¨ÍROœÜ14¹ÚØ7ylÉzŽÀŒý½(ÿ"Üш´Šé`F9ÖæˆÍ)ÇY'Õ‚!uÑ i¼ïˆ¢(.UÝŠÔ#‚-ÊKaU{i d&ú¢Uw™ dBúG!jN}Ó’º”º2Ãq:d2c‹ë ½<Ѱ7 ¿é©¼(iÄà‰4¨7{ëÉ,.Œ7ÅáêÔvÁèù Ùªr¸†DTRÁÞ"V]ÆB›T—|Ðx,«\¶±¥·&*¬wàý%$^J‡ dÇ€±<'låì g´¬ØBôV¨·È®G€Òu”ð‘]¶PÅ<Ìç“Xñâ-Òl³•‘féôª¸Þ`…ô®åQ¦®Ê¡°é¶}J&DdgÄ]$g^5`U£‚½b%NZë· "×ù9í\ÿÑ‚¹ <·Û7EàÄg µ¹´°„µ¹ÈÁõ8’ôàøl}|E'Iñ)¢†½ÉnnSF l Á¸^­ÿF¸q”·E,YihpˆàcQÁÆ™ €òƒm:ï·fo¥¬þ–&©õ”'±ÅlVãN²ÏpÉ´8夰ÍÙ 6=¦]iäÒÎÃPjbß"g ¹£ø°žExÅ9C²#R$7 f(µðÜ6c2qÌÛµ!' b¬k)”³BÂû=òÞô1Bï÷Ôr¨LŒª‘l>¸åKgèס,—@ÑÆ1ðb!‚—ð@¦‹{S"Øü´Ï@…$i™G2îœOË;VUˆl#rÉžx+Å–,Têð ð<·€±)²ÄØñbÛÖOá±nË5())±‹è+ŒÔ›Ôî bLØ}0îðøEF˜°>È;ä¨ ŠØE‰YDø9ëÃ.W‰Ý´Œ› Æ…s£‚qq°(á,gÜõÇ70ûÖr„€|!®VŠù`'æJ†eü„Á³´½E(^A‰s&@ÖÅ]7á"šá §Š»’âÓyzÞèÓ}JNŸ²E³'-±·¿×“²å2~ƒ™ÞÄͳ‡ŽšO;¹î!t'Õ4²…ñ*0Ô2§_\Ë»n-b‰‰¹ïðæzE¾À74zÚo2è+’A#°ól4‘‘æŽBßòpd}× ÄGöÕæÙߪ¿“Ƭg¡HÊÏk~„ô®0na¹Ç"Øëù¦Æ¾pìÛǧ€=ŒŸc¥Å´ÐâsÏr -'¢ "Ú">mâ0ö›b\À®È88Ïž|‚!1’5ˆ™–Ÿ{¶†t'kMìõcÒ7¡—áü}­Úôó!(d$rˆó*±>ÄD %4{E…V ýïNÎü`ÚÚM`9WÉÓôỌû[ wó–YN•g¦ª¾Jxª:c>†²¼'¢˜Êx‰¥3B»Á±¹˜[R™`0#r¯â8LýJˆé¢¦fJ…T}íóHý2\¦Š(Aó,…qÁ\–)uÆ,#mբѦÀõM… —/-Æ]™s –º¸´sø¥ÿ-.¦‘8«ªý«µªsU^:Ü)|Ë·S¥/BXiŒèßRƒ^ÔíÍûÝoeÛÏÎÁ×Ê„c4-Í7Ù´o™A/f8ÆÏ§w¿Ú•CeÝÓ}¦²w’b{Ux"+!n ôD}@˜©Û†· ãöë-Iœ¤`T¤ )D­$UÇÓÖñ¥Î6H$\KZ¯ýk}b\Ç8(ñ|$VŠE2,DaÁÇÏÓâ-k}—:àxTéȤuî¨z鸈Æ%Œ1LA/†XdÂ2 {‘ÂîÁrÈ0߈ÐOòíäûäèÒå誘’£+ʸMËHŽnßRƒ^Ôí½]š)9º¬Ã1š–‘ݾe½˜áäèÊß"rþ¨uÇ)DX5BÄ1É ª 'ieJ4X!“dªìËècAw…˜ž´^0£mDÀiDBœ#’«fí<‹ëŠ3å0÷¢ñƒ5ÁhñvE¾G9Þ†,Àe¸lj¥Sj(¡µëÊ}S,5Œl*>—!£Ã2 6*0ÖZ ƒpëöç^T©lb“†7%?•’ÿH’Écòé°olo” 9CÄt‰é710’ð8{+D²KQ(ðËR­ð€¬p‰04o[_LäD°´»´¡º˜~º¦Rú…{c8B&*!J„(? É€ eŠMjó‹c ÄÈIðj%>¼æûl˜µÚ0k;eÃ4"´/6-#fû–ô¢nÇèm˜u=eì«pŒ¦edÃlß2ƒ^ÌpŒ 6LÓg[)!~ŽØ@R3+N1be¤FMºÍøSY“Z¨+XLÌÞ7B‡ñ”ýuËÓ„”6›°Á€Ì #”gÇJV1gwïd]8#ö+æ’(ŸÊ|»¥ ³Ò£c¢cAZÿ17ìþŽH¾ËÃ;÷'œ»q†ˆ¬OÈà«L £%$¶ÅˆÑçÀë‘a5+Jø›·$Vºˆÿ+©·ý‚ÕQX›Z7epRlÿÝÚC5r’$U+"E)bA?Æá}@K2ã¼ &›TŽôï¸[µ+Õð^îMY¨ÇtqäBúɽ<[S gfª 5¥{ùD)hRO!c¼ŽÌz²¥¥Mioq0Ñ!G!+¢T³æ§°1’qÃ@€’š6•¿p«BR†Ÿ0!òÔÕÌ#‡"ì¥-ÞcöÏà2ªE5pÕ¢žpÕ­kfàÎi[B—Ñõ-5èEÝŽá]Fµ('\FµÐ£1ôÈet}Ë z1Ã1¶wÕÒ'·s©DV)Q”óšñDî¯Ö3p%wŵ‚¥®°@tÇ|ˆ€.fx÷‹_‘HÅý÷ÍÏÍi/1ø>°W6brÇ d6Ûˆ’j3+î Ï.pK/oŠÄ&†²Ð˜Â­ðtñ´4|$K0^Æhÿ0‹ÅL$)rç>Ù?ö‚ŠÖÞ6Ÿ@âȬ¥HM¹ª±Ü{Ad,h1ÆÅ\F­¤^nŒ‘PÂ-NL·Ðz7dkÖ¨PåÊåfHkÊ[~-•" I³~Q©˜=+l2„´—öo.«Ðþw"bM¦SП³±±¤u<¢ËåagVD.àãÕ38À´˜fÚë£Ô…ˆÇqÛoéPWÁ™¹Ì½S)3  º\Ó^×H¤=Ì#ÂÌ`!ži#Fćä'G6—FŒ$L”±£‰Má„%íȰ³¿,aÞ³²Þóž½R={e9åÙ%›ª»dSCß\û–ô¢nÇè={¥šòì•aÒ¬¶eäÙkß2ƒ^ÌpŒ ž½ª<&1lÒ«J%~cW.Ê—"ò ò1/àØœ+æÔ•°¾Ï±&4$SŒ57Mž-c%œÀ±šø›íÝkJ ï.å["îŸ1&öˆ<µÂÉÌ\äÛ+zƒ2¾ìÎü©àDÆÊ}ŠÖ‡ooÄ_ÄÄsl“ bbé ·Æ¬eÁ@w çoˆ¶þo¼×‚¿Ð]eÕ{ã\C—÷Uhéà®kmN^ ¾å[óQá`¸KÙA7þ§ÏíÚ7t©_Ãôh}f8™ö-=ìF‡ù9°—dq—U‡UïOŦʸ+Òj%[.ð—lWÞ8&Û»Ê/ ‹½.`¯«)`¯M…MËØÛ·0ûnüÏ2öZO{­Fè1°_ßÒÃnôp˜]ÝôIap,ÄþÉNŸMmO³ºÿŒôøgåmÃbü³:À?[N៭CİõÿÚ·~ùnüOàŸUSø×,"FŽñïú–v£‡Ãì‰møc6™üw+2 EÐkÀñ¥X?ÙÃdFYŒe¢=– –b™jˆeBè ,kñ†àß¶„Xv}«Ã¢¾ÿS ±L9e¢-FŒ°¬{K»ÑÃavÅ2á-kJLgb:i2žeŠTÛ¹dá‘˧kXŒ\JÈ¥Ôr5jzõWe>Àö-‡<¾ÿSÈ¥Är©b4L1F®ë[zس+r)ó"ä‘£-žÞŸ­üë4dâ"¸F±¶dÖr ¬£ßº¶· Kl %Y”^nó¿å„%Y”:°òŠ«…kh ¾¾Ußöâ‰%Y”Å„%YhŽ¡íȒܶù™7–ä—1ö´$‹r>([cè q†ª±Â¯Î˜Ê1êw œº¼­®§°mpîbMªX†¤ŽÊH$Ί¬,‹c;®4Žî¨ÂÞ6,ië"ik1%Ҏ̕™+iû–Y}7þgˆ´ ši«ÐøÚ¶ŒDÚë[zس«H[W¹É×ÓÖd«ÖñxúhíÝÏJ #¯±òÚb yG¶NálÜkßrÈé»q?Ý0/ÈkÌòšÐrÛ¶Œ÷ú–v£‡Ã슼¶ôó’cÙ›¹°ÔëëÁÆz¯­, wH±²;œ¶Ã²ù󟿞Þe?)Íõ¤Ð¹O€péŒkNŠ_¶.„Y!\8õ-X\¡Â»o•Q· K‰¥”õX6OK9²ªIgU»¥u×·:bØwãÖCb)e5A,¥ m„mKH,»·ô°=fOb)•ùÁ—Ç#F(Bš@¥SO©tO=åmCêÙÍþÔ³\∛ÊU = ÅM‘ 2ío*<'ÄÜŸ Äm&&.+Â{ÆQz¨.‹Û†_© |;‡2b®Xïnîg°ë ‹÷ÂâZöX¬o`±‘ÀbÛoÕñb Š |Z2Èx½æ¬wê(5h¸æT!ö‡¹Öd<§hè6¥ë=‡ìÈ䮈Œ³ÿU[&ß$qÝxÍE´Ý£)˜«©ãTѹÜöø4‡&eÃÇë:l©.²«6úf1VÂû¨ÊN‚÷ ÛeÇk Hd® Þ9¿¡Áþ5ë´fjCçliJpJN©‘‘KÉq Üõ­ÎVÖwãpJNÂ)šìږЖֽ¥‡Ýèá0{ÚÒÂ=«Ç͆ÂLKa‡6‡19þçi=oˆY Yºèƒ=´ºmXª j{h1ì¡Gš£–ã`ë[ÚwãÁZL{hêÁmK¨ voéa7z8Ìž ª–>ØÃWÙXu[„IR¿—¦ñ¸š±–}xK­nî§ÉZ ¼Ekùj€ß`n4w™ðè<&ýåœDûèÕÝpò ð¡<@ô‡®|ôŽ×L’×–*à‘·šÀ”úY#!Œ©<ј ,+BÑž9²WW}h‡R· P´>@h‡6ýö>;ËZ»,æ2Ó3 ´ñq(Úi&UжˆCѶ¯o‹ PLâÈ´IÒ2&†5>)Ø;Ê ûuã]óõï|C‹wŸOŸÏߨÁ² Ôø<÷‚ìâf uTCŠ Ñúý®õOoÍ=S§ÔÑÀzb_;('‚4:¡q"|ÃÝn—ã —.G׸@㨹В©¹}r+—©`o®pýË” 8Y¹2.á)gT2lPžX†À½Áou«–~£3±×þ»™±?h¸w*­po[Ÿ Bþ)8èÈfâøˆ`4>N' L^à~ƒñÔ0^êâèãØ!UÃÀî¾¹Ng– |>>ý; ‚¤ endstream endobj 7660 0 obj 6687 endobj 7664 0 obj [474 /XYZ 38.2500000 589.250000 0] endobj 7665 0 obj [474 /XYZ 38.2500000 503.750000 0] endobj 7666 0 obj [474 /XYZ 38.2500000 341.750000 0] endobj 7667 0 obj [474 /XYZ 38.2500000 68 0] endobj 7668 0 obj [474 /XYZ 32.2500000 651.500000 0] endobj 7669 0 obj [474 /XYZ 38.2500000 589.250000 0] endobj 7670 0 obj [474 /XYZ 38.2500000 503.750000 0] endobj 7671 0 obj [474 /XYZ 38.2500000 341.750000 0] endobj 7672 0 obj [474 /XYZ 38.2500000 68 0] endobj 7673 0 obj [474 /XYZ 31.5000000 653 0] endobj 7674 0 obj << /Type /Annot /Subtype /Link /Rect [114 778.250000 275.250000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn27 >> endobj 7675 0 obj << /Type /Annot /Subtype /Link /Rect [114 771.500000 162.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn28 >> endobj 7676 0 obj << /Type /Annot /Subtype /Link /Rect [114 764 166.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn29 >> endobj 7677 0 obj << /Type /Annot /Subtype /Link /Rect [114 757.250000 175.500000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn30 >> endobj 7678 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 116.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn31 >> endobj 7679 0 obj << /Type /Annot /Subtype /Link /Rect [60 743 125.250000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn32 >> endobj 7680 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 132 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn33 >> endobj 7681 0 obj << /Type /Annot /Subtype /Link /Rect [224.250000 660.500000 276.750000 667.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://ocaml.org/) >> >> endobj 7682 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 603.500000 73.5000000 610.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://download.camlcity.org/download/) >> >> endobj 7663 0 obj << /Type /Page /Parent 2 0 R /Contents 7683 0 R /Resources 7685 0 R /Annots 7686 0 R /MediaBox [0 0 595 842] >> endobj 7685 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 7686 0 obj [ 7674 0 R 7675 0 R 7676 0 R 7677 0 R 7678 0 R 7679 0 R 7680 0 R 7681 0 R 7682 0 R ] endobj 7683 0 obj << /Length 7684 0 R /Filter /FlateDecode >> stream xœí]ËŽì8rÝ×WäÚÀd‹Ô0 ÜWðÂ@£ðÂðÂè™ñ`pïÀ=³ðï;S¢2EJ‡J))+§aß*ª$ƒñb0?ýë/ÿ}úŸœ~úòËÿž~3ÿ~ùå-;×eÖÿïtýïãÝœÍϧº)O¿ýxûýôûÛÏo?_þÿïoý ¿|ù÷ËOÿwÒ§»üß_Oÿù_—Á?š?ºþÁ·ZÕ—¿wÿ¶µºü”Ýþ½Žÿåí?þéô·ë‡é 0öï(ªL—ÅŒ…©–©ºÿþñÛßÞ~ê6K«³2kNªÈ‹“j }úûŸÞþ|]¬«OÅi pÿÇ$ÀÍàì°>Ý@ù°*t1óíhÈîhÐ *ë§hOã Û ü’‡UÙFáóí8¬ªl„Ãëoà0ÎmŽ,ÛtuÅ_;L–y€×Dƒ….ïX~ãyn*ó?øóRjÚò"ÜU3ƒæs[(UWE­Q!µ¾L£”®OJ·Ù©¬E·ÓùºŠññ&øñ+äÒHQy¥¼—ÜÙ¼Гçtÿ|„—ÆŒöñrq¬ {‹¿.¹¹eÝôºH‰è¾ýÕåŸx„s…\)ÃÖÂ_^Tm•ÕMO­³SÕÔÿ`¦½¨ ¢É‡_œñ¢{ãûðêõ`òçÑüª¾€Ú^&ƒ?ÛóßÎNmQ÷p\~°ç›è°ÞuáaÍ7™e4 ˆˆy|ÿ/ã¥mݪ}R£E—wð¬ñê2‰ºÏ8 ”ãW¾ƒO­Ü=}ª³j¬:« 㟪<Úþ=2šz(ÜI/¿GG’³5?ÆsX²&žìë4] ³ñÓ\?[Ôíý§ûŒ$•$Nª; * #0f* ®ÙqqD ;4?Ýh<Ú†]úÑý´Œ(kâû ±Z}9:<ÖÌR®3^vo~w?µ^å.<¹;ïÌ€‘ ùAÄŒç½ÍÖ #qDÌãÝ–:ËxéÀ@[¸–µzü˜ŸluFóf’ÀP5ÂÄI&ÆãŽ4XMAjì=©ðÄ‚¨q¶ÀÈ™PÔt`LvSйòöÞx¼p¥Nq'ïöÆü§Ö Ÿ2›«T£Ÿ²<Úþ=6š:(ÜI;™IÎÖØiKã‰'ûºšÑÆøéŠ› *&„nARIâäÎÆcê&é01c:YpÍŽË#ÊìÐüt–¤Š…¶a—Œ|ZFÔxâûK±Z©]Óó”k—Ý›ßÝO­Eµ¾ïØøãu>Ì;úi’ýnDütÓ»³u2Ióè·…Ï^º‰ÑÞ­æ©#æ'‡2Ñü àäΣµ…“Ê `<ñtÀ¢â¹O‰bÈìÉü<–’óFÎ,£¦›x²ëTÙøë?œ­4z2àÀej%†eÏøë=^FóO,@•ñxñeÀP3óÇÀvhè:°Œ‰–£!Kô®,{™;*·î€Žl®§Î×p]Õ”N’JCÕ! #0<ã¶U²ž¬f1äìP燯a{zùŠ( ŒûN ñ_3öaYã­MÀÃ@9~å;øÔzù¤[m‘ËÙ#*ºbãg<ýmÒNPEÆŽ³'¶|ZƸyè·w-÷5¶½2ŸíɾuéÝvÛJb¨!d€DÛžY”ÙãŽÀXMVó²w¨ÂóGÃ×°=F>…"ʽ™XOJc¶Éç½ÅM®Îwèè•ïàSëåS©xJu¶mfÀHˆî‡ØøO›ôúClì8{b˧e,Á˜lïjîc«PÕæŽ+Ô¤’ÄP5BÈÉc0ð¸#V“Õ<†ìªðüÑð5l‘O¡ˆƒqßi)þ+ç]ÈM™;\æ7šûrg?µ^>Õ¹OŸmF›0¢û!6~ÆÓß&íUdì8{b˧e,‹~{Ws_é8™ûÏödŸ»ôn{w%1T2@2ÆÄ <îȇÕd5!{‡*<4| ÛcäS(¢Ü‹õ¤dñÙÈ=f—›rüÊwð©Õò©ÍæÁj³ŠñOcx´ý{d4õP¸“vò*2’œ­±ÄÔ–¬‰'ûºšíÆøéÊ\‡Ÿî3ZT’8©î(pê11cfÀ†kv\QÃÍOg ¬Xhv©—OˈjÜ›Žõ4d±TåòؼËÔ/»7¿»ŸZ/ŠŠù8è¶¢ÃÇ?Ù—ÖïÑðÓMïÎÖÉ$q|Ì£ß>sxÉ*ÏÞ­å©#æ'›2ÝÑü†‹$prçÝ uîQ0žx:`Ç8ÏŽ bÈìÉü<–’óFÎ,£&«æ¶ñ/]ÂP@ÎN\ºg©ªi­TW@•§ëÿÓÛgëSjò)…jüîyñó¯o?½·'U~ýóåQ{ÿϯ6×ÍéW t~úõ§β¼þ—Ó¯}kÏuUVºìÖjž¨îIsPy?pn.ø³þ4Óè‰ê?¢òs®uyt‚ßÁó4HÙ—n 8y_âöD7èIVÁÏëž”¬Ùó¨~­ìž\¬ð¢jêçHÉrwé…è]Ì9üüÓã[£¯-¢ëÛ¯!sgê9ù »äòRwZ­“jåx`Hƒ—— ׉l©ð,; ßQü„à³Öžwð<ü¶,³‘Ã5?Þª²qÙh¥Ï‹hðB?‰1Ró†mk³æqEP䆂ó²Pp™ï€‚+õd,ªmž›¶+=ÐvÕŽh»Ö; íæeÄ1>§4jà”VìªX3PEW´«l5r(ÎÍ…>U¡¯ÿÖ†mÚêZÓêæ+éG~»¼”•juÓÜþ*o­Ï ¿öÓ\ÞôõÅ“û5™FuÓØÀ\ÿª°?SØÓüÅ‘)Ø[•UÏÞm;lgÛ“@v®juåâûFrr¡Œs'˜±eÕã‘ Øë‰Hð~)d gÆJ.ÏY›Ûäð ~ísÿŽÝÕje˜­!.÷O=¢ ’‡¸ÿsÂ…óx.@ñ¥i…p>µü˜S1Ôê«-1£‰µZ×[¯Õ³™RÓc@≠3ѳ™¢&¹úüø±‚4q÷Èâ"àhÏœq˜ÍöØpŒGró³åÎ$¾æ±i;Zߪ ÿ錄ò°Üã|D݉Ìá!ÚÅiLU·ŽÒz § œÙÑÆè ³7ñ<8nFÄ^O$±§ 0AT”`{|bŠÏ.„bðepŒîˆ}£Gìe/ùŽÂ|ox=˜"Þs”7"ºÎm[åè\a5Æ|Ô;<Þ2ïþÉÜ…hÌ>Iœ2=+žx=ßݯb {ƒ rde:#p¡K Œ7øŽÇ‹ÆØ£IòxÑŠj¶=4ÂÄ€b7¾H>sã¥?~Y.€"R„ª]’ î;ˆÛŒÇ !a< ÈD€b’õäNȃíc™{=æTþ¸iÂÜÞQg­¸Ž€œ2wÊ :žédš…|ÌÜS0Owߊ©)ÉG7„ Sh~R²&9Ñ`UWÛD*eèŠÙ1ʱ W‰q¥..%åЗÀ—T.ïÐ4ɑɿ3a£³½G½ËÆIäœïÙ‚¢”W°Áµ2fë°EäLXÙ¬y*ŠQ÷Dgá>U²‰[v„ËÎF¾îfªÜlÝLç˜å™²çÓBˆ‘/\dK?©QbOXÌ‚•Z»&f2÷¬@¹°mÍlÄþRG#Ÿ|Cê|0ê|²Ÿ”MÿÌ´<äUìžÛÛ„m·ya¶sª’#ª=¼VLÔâYáê(|t`Ò>˜üi¾¶ŒªÔµøÂV5Ñè=?¶ç‹À¾¡'†fž˜õÍ=)ÐC®s¨ðyð× Ô <^õ ˜Í»Õ&‹3Øüf‹ê|&š‚B%r3É6é ÄQ1¤âS,NÔ”Àa×WS~&‰û~ÊÁªÚŽíǹÿº\—ºDø¸7à!ñaÏVoqkµ'M7}0IÝ–Ž*ô´Q˜ ŠiÉÁÜõL¬#"b¡ãÍÚ¸{𤠽|\BPyŸ„âîP5ña/PEˆ°æÅ¸ksÊòˆ'.5ÃïñR4¥ Ëˈ៎ê0,'ç9ìm`â˜k!|x"ŽöúÁ÷k²m±qA¹%{f“dïÁq×´0ïˆÞ¯Æ3’/³]'k³!!Ùúýšg••»J*”qrÏæš=+ê7,ã®rp§ôy©“¹¯ 8xݱÂãŒÜ–à=üLzˆCDªÐׯ1‡¡Ÿ¢ ‹C:D¸(˜8qªùêãåõ¨h°½¤½ÆL-KG¶{.6E‘™*s© ˆÁÊ¡Ï_Õá&h@çí7N6r4Ä+‹Óñ^6 ŒHŒöœF_©A¢$UµˆÈŽÖÍo%z·E>jåjÔí«5oì/ÜŒ’èIÊt.¾f<ÀiB66cšö˜Êq ù’žIÀ\Duôà?uYâžþ¸QOŸgÞa$fT›*re h{Ž‚õ,U;»‚ª_@q+¡ù>ØznEEÝ¢'fË˳žÔtü$úN‹ÞÉ¿ j©7PGïÜÓå u¨Dô$‡PÃw4|‚×3XÜzjq›*™õù²mö[–¨JÊneQ·ÏdQŸl ÕË´+v]2]7DÃm¨N曟C_±©R><qKìöèÈIQéSõdÏã!ewÙ  ìë•´ä2›˜ó‚è…9£ S)‚ð¸á°Þoš°Œ}’‹%‰Z«‹<¦¾©„‡i»>žL•£ÉÄÍÔ‰PZá–²µ†UgÝÒƒ¢²>—z|td˜‹¹aHTþušÒMTJY‹}s‹ä•_¹¶C^7®‘žb^ã@»ˆC›Â*=ÀZžúï±E|Ó¸K#N ¯@¢²r¾xÔe«ê¦µßáÆ5ð ,ë‘aÒù„žxJŽ|_KK¼AP{ŠžÀw(Ørj¼sõžÆwîkU.š’±/Ë71ñÈ!ÆcCXN"½Ýq[&Ï;[Ð÷œ’86®öÑUãpú1…¥ÂŠ Xü^†Šk@\çÎ.ŠDàzNELކH&vt÷DQ+—#% ;ÌSUú€Í d¢À"ž˜¹áØ<ÀS6ÿål›!À—³-¹‹ù`¤™¬$ÌŽ)dËV”mãZª‘[Qnò|’d©TœóT3¥Êêu2;üÉLéÖ=NITŒÂˆÉêœ+íˆr¿wÛSôâ |âZ}[€ ¾w7WÅ€Ží;dÁø›T1 ;H„Ùñ9¥Õe+xÞÍ„)Ë6k hK7àU5ì„ûdlZˆ•Rò]Æe­£Yì¼"Ù'f©‹¢qVàA)´REjPí9tŽ\ÔÒ£W™b€Äyjæ›(¡/•Œ§Z˜1gbfÑ3qäâD”n$´Ì1ó¿=•'™L÷€îزi¶Œ—%KUØi‚ûbµ‘^†„K]©3òñ†àSdNmÙŽwÐIT5I‘yºzüæ¬,º·‹»‘ÀÁ–+ÐAel8"˜$%‘–RÐÕ‡›yÞ‚-s×âÀO<Ìí^ŽPY“LõÈàÜñ˜ÕÁÍÈ~7+œ œµÊx$E &ŠÔtfJ±IQœ¨ª'{Ü£ŠÅb…FÄɶصY+ѹP8oã;) œ¢–Ÿ4ë¬qM7 oŽGF0§"¡)[-Ö³E9éAR{s~ÜUã1é·/MÍ/“nàDXÝjbËæÈìXÊÔh² WŒeK¡áºerÖ`Š´æg@Þ"ýEMúÕÊÑ…;(ûŸÈëë9~oEýžyð±l/8ÛÊ|Ùâˆ\7þPΊÍ/þRÝVO­”íÃÂDƒä©p:‰k XrŒ¥sU•¾ø^nÊQŽDËÃø¯D|*_ôãÑ>ÂifûË£‹¼ 2Àž¾á¯´œX©P ûNMñ  lïoa®™âjñžPï³):òºÎ—©G<ÞB´ø–@€›M…¾µ+$z½z7ùÔµ6¸ží÷ÇÓÕ‰Qã¼ÒœxçE½/ê]I½idtq+ÏÈèÍ) Ï#Kc‡¦¤-åà‹BŽ@!idMu‹ñÉšd_côæ¢K#êR,^‚ó˜cÐÜ×ðz0b+ Îã‘pÏ.`zÃv ätOwT¸…ñF<Á»ýlýf?F£Žäz38/^rûÚ1é?ŠEš„bËL¿(öE±û±¸,ë½ÑXÔuî¢#ÝQQ’Ê¢'Ø„”?K|Ñ*ñÓ ÙÊ“±†8ìH¶ä¥èÝ0•]Mìàž›•x.½7¬·PT¹#t=1=¸Š¶l¡r¦è‹l s‰êƒTq,¦Â“U†·E$>QYÿØr™P<žÄe&„ÙõÇ•½©ï ‚ê¬IFÃ4²… ЇS+pÓþì+ çIk˜ó¨ þ¥‚#1.¥«Fws%QÊ$$5 ËÞÇ#•¨î~LØS=L¶˜hÿŠfôÑÂ#‰¥‹ñ§Œv«”pÆÄ½`¯ô€=›wî÷)AÅO^;wÔÛÇ[•ßäóëþ‚‹ÉÁ7Ä“g‹Øð@Mh°¾ƒŸ¼$dö’k$dÑ®‘¼tˆß.°Î†¥í ] ÑÂΠ}¦]ªVyÆ›7÷5Ø–·Ä k‡A ! ü}…ïÀõ$k X·;ˆDMC*Fÿ°P«p`÷\Üo±ù×#Åw„˨Èî5½(°s1èÞÑ¡9e9‚¬©ögOÚ|D¦¦ "W{…‰Ù_/«5CõõļŔƒÍq¾iÁPKÔÞõFþã×2]ADýú!˜z°D1mŠSEC«¶¯sÒS¶!tšºx»®ˆ%[¤Y¤–DñäÍŽ)úᙊ[#=W° ·q•h$»€ÈÕ=aÑï¹c¥l Ù˜+**%€kˆJCL ]&ú"YïTµwꪂÌ&[ ”ÚgÔØþ⌦ª”è‹G)¤-[#´µK¥²AN© ë–ð¸,Í=í±°Kb‰……eËVz0z‰³VÀAC¸]PªîJÛ‡p@QÔ,ÑF˜‘”Õ'kùæR‘AB¾ ˆ[[WµvU`€C2 WÇÄÛ˜(ƒƒpVØöÆdb—TÜØ“F»¶.†ò*˜½ Þ¥ÐÌ“BÁwD oêBl‡1v£ãç^ô00ùÝL(•Mó¾S^ÊT¶ @®Ëǵéæ+Ipëà±l*{Çç4ö]âB}©º,Ú²p°ÇóÚøŒkj=8ì{)},.ÅêJ9$[qèÛeBâMëÁyTÞ8S¾¸ê$“[àÙ9×%΂Í!Ô6þ1%âwp-ÓDxÃ<÷t5?ÀqÊXÖ.!GŸ÷øYB›3ô8¡ñ©‚‰Ê ¸³Ç¦|Œðا¹[9f2ƒÌU·lÛ-‘‹AŒs&H7&ªÝ‰%"è¨PéTü²5²à;8£äð‡eÖ:úÍ™1)hÅ(†q¹iˆ‡‘­h¼öŽš·§ºY#ø…ò Ê–1‹¡ºƒÐñgÏÚiêþ\…d˜'Ž Ä4E½ Ë W¿% $#”Dã_e+\2Ú~”V?'ðaCÑ<&IÁ³ß„â.ÍØÚiPc*¹ªpö÷é ‘2»©NuÔ1™ÈÝdêf‹¤º†è:ˆÙ¢2ÉDª³‹æ7SÒ*‘|ú³(æSâ•úÅòñ2ùš!yõ_SÙõ-Ræ3$šD-~’µÚüJ'™K}Ïõ\Rq*¶ge•óF¬¶v³úØ*'﫜97…FOn·û“'†´#®­Òí¹[Aæ,1ÇôùiZ!Kß¿TgÝ'¦ æë9Š‚O0lxcÌ™&s¦‰©8ú ÓövpÁÇlzŠàaqŠkÑO_»1¢YÔz~b‡ÐÀîE³¼V,• ÷gÜ 9XÂFरÛnôÿ²Ûvm·1Æ8˜^Âî „Ý»oÒîØÜ·ê˜L&'ßQüH[šð‘¬'„:·…Þ\üȰxî×ÁDoä B°”ì3† DóxÖóB€ ás3Q 6Ó´B\i>wÚÇ¡Rø"ïÂRCŠ9p$Žèû çÁ»€¡†S í`žÓ0. GLá˜-ýÍ•ÂØQA ¥j*7áŠ0ðÒ¿AÒËUB²¶hëQ¬ÞXÖBuâyRC.•¨žhAÈ/Ô–1ü"Ê}Xja9³x8 ’܋Ĥ£¨ýÁ+…ìŽßI̺RëÁ´ƒç!Š=zK{¬Y1UáØ]ÆZÂÖƒ7¼Û„EB)«ZJì{œªƒS©½³°ët©-ÆÎ¤Má,íP¾—yê7Ô¨ÔЇ»+Ks Ü*»­à嶸¿ x7çu»ù8f=ÅîÁ ¥n8¤x ² >¶.ã¥ðØXWö •µÃØŒMÍXÛØdÎûØÒ„¸ö¡¥ò—a:ˆ^ºC×Êå²dª¯º•“8’Mâ¹V|Øqv¢·X–á¢bOa>•ju0ŸŽ ý±$¾#$ЭΠ#].:mÉRmÖ¤¶›.¸A÷¶ Ôž[ÂRõÔŠ~j½Š[g¯RÙ;:+(m¨Pö#'Ó§Púm¹Œ—ÚdYÖYãÉÞÇú†P¨¯ðõ§__0t~ã>XÆã–"®¨ëÇ`ÚÙ‘tf@±—!•N1=t®È M ¸uþŠÀ>„âÆDéÑ›+îT‰× û¥Ó’õÔçђĵ'àŽߣ ˜k­§[íÐD:=Ý‘T…EÙh¬úˆ„%¬ÊeÕrªú×Xe¥ÂÖTÇ øD8G(ro©Í‰÷LÎÌ;eü>¥½TÌ•^ܦô“§Êx²H&ÝD•ø17G•î é’g³r·gÿTÚìWy{)å iȳ "3™é©ËÄ|’Ì›)ŽêÞ(ÚászÆXù½í;“.’·ð n [N ÷dmÞ¶ß[Öm‹å]eš³‰ô×é I¢Îõ²bžéº¹C’g–áipŠ>‚›ú°G·§5‡e•yb§nL%Ѻ! ¾ç#…lÊþ„'U7[ôd´‡4±ç=‡çn€ 1}ÕÀ(@`TMl„àýNÈ—ÿN¿_(ÖKÐ?/ýÁš§™U<ÉÔ¼“¾ÅÞ-ùñëYÚS¶ž)>Ñãt&ŸÁ¤±ês5á-X_}EóäKÊo¶w³RT<ßµ.{Ì«ÌÒ' 4B|îó¸Ö`–¡ð×à;F-ª ¥êw±wýù±-@æÆKYAsxÀÖ$Cbÿ†ÈïÞp¡6ƒUˆo•à=‚T⡼<þZ³žê,?9bä~ý >Ýâ- ËŸO?¿ý?,€Ø° endstream endobj 7684 0 obj 9433 endobj 7688 0 obj [475 /XYZ 38.2500000 325.250000 0] endobj 7689 0 obj [475 /XYZ 38.2500000 197 0] endobj 7690 0 obj [475 /XYZ 38.2500000 197 0] endobj 7691 0 obj [475 /XYZ 38.2500000 758 0] endobj 7692 0 obj [475 /XYZ 31.5000000 721.250000 0] endobj 7693 0 obj [475 /XYZ 38.2500000 325.250000 0] endobj 7694 0 obj [475 /XYZ 38.2500000 758 0] endobj 7695 0 obj [475 /XYZ 32.2500000 719.750000 0] endobj 7687 0 obj << /Type /Page /Parent 2 0 R /Contents 7696 0 R /Resources 7698 0 R /Annots 7699 0 R /MediaBox [0 0 595 842] >> endobj 7698 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R >> /XObject << >> >> endobj 7699 0 obj [ ] endobj 7696 0 obj << /Length 7697 0 R /Filter /FlateDecode >> stream xœí]K¯ã8vÞß_áõíI= @=d Ñ d1È"èIg0¨¤2‹üýØeK¤>Úü|HI¾êÂ̵%‹¤Ïûñó¿üúŸ‡ÿþÇáçO¿þÏáwû÷Ó¯oű©Šþ¿ÃùßOã º=Úχ¦­¿ûqøñöËÛ/§ÿÿñÖ?ðë§;}ú¿ƒ>üëé;üù?NÿbtþÁ÷·F5§¿ß.»F>׿çë}û÷?þ~q˜Î.fúý§²VZ_–qgêoÃkªË¿üþ÷·Ÿ{ÄÍÒi]VÅA•¦<¨®Ô‡ÿý¯·?N ÃǶ¶ÿÁÏääíyòºªN“«ö03sW*ÕÔeS<óŠ>OÓÔ§itWL×y]þÉ ¯ä7ª6ÉïW.ejýô¤êê¢iKøy<·.u;œÕÓ»|ïN'«îêáêp¡ÿô›óèù,þ1Z†jtUv§9áçé2nä¢)'ËišÊÎ>þTŽ×1÷¬»ž§ÁÒÏŽ&]O$gK¾/ÌAi2±·ŸOm—º½mwÏäÂmÖ¦×Û˃ßÜ‘žÜ5}h 5]ÎéÂdÚ™ïçehû!T&Ó^g;}H†y _¿•~h÷žRÓYàôÆZy®Û/§“N7B¿ŽÉÛ¦ \¿,g2’X¦›áÎ2º úß/báÒ/ÃÛH¡3ÕzDÇ×ÍWí…vüÄ70ÒóG™ùU©Ò.âöÁŒV£§ßSÃè²wÒ J "g_¦TȇÑxZoKŸ<`à\¾‹®×O7 ¯£Çè81ç<ÇãEøÌxUs#É©ß0Ù„:%Ù°A–&݇ÒxâÛîJ0U¹G«šGÙÉõöòà7w¤çÉ®åèz:­ÿÝžüˇdPO{íB€ÄÁ0ô)¥¹•Ë"Ðî={¤.Àé?8˜é\¸áteÑóÀéÆ@°ë¿ýxZ|Ý9ëOãÎ,“Ípg™1°8з´%.ªšÛH©3¥›Ûò&×[Wû íø‰o`¤ç ŽiçWe:»ˆÛ‡±¬§ßSÃè²wÒ J "g_¦TȇÑxZoKŸ=`cà\¾·ºŸn>^G'ŽÑécÎyÓ9‹ð/´ãUÍ$¤~kÀdê”dÃYštJã‰o»+uÂJ÷h•óöéõöòà7w¤çÉO=ÒQǃ×ÊN{û0ZÏôÉ„À©ÕÌlçïòИ‡ý”àøP)CÛöìY*‡C4ô‚’Î…+î–Ãéy££9F’óà—·Oë_#ïìH‚Щ]óš]:Î&XÚr.åìJŸZ»Ç¨ÿ“ëíåÁoîHÏÓ–Æ8ËiÌtZÿ»=ݤ†éA¥ql6×iåÁ0ô)Q¹•Ë"Ðî={ˆ.Àé?8$ƹpÃimÑóÀéÆ@°ë¿ýxZ|Ý9äOãÎ, °ÎxÓÊž¥-±p¹,ÃÛÈéºä×¥2Ú:‘wÿކO0¸®Ëtƒ_V.브.¹¹FÕ=€t[%Ñuøð¯O—“ ~Y¹8T†ÍõFÿ%f¼”`ÌÎÀƒ{ûùkw8-ë·?N+»LØÿùíûÛI´ùé¥SW‡ßþrø§¢(‹>üö·7UëFµMuùÝåNQ_î´Ç¶+j]·;ª@wŠO—;å±4}XÔíŽéŸ¹ ¢á 1| ïàyZgIxóùr§:ݪ),J8üôLQ]îœxBYŸA>í£»$¼z £ÜA˜Ä«‡«~be†‡Y„^›jü(pÁy|@ƒ@ŒÑ¾`Ýàhø<)¸-M&@81ŒäöG¬Àðø1 §{øøÜ]Ò—ßNl'Ǩ‡e0˜FÑgH‚0nÈžGvmŸáh}úg”@úbaX»|¢¤(Ä1×\,CN>mQ¬‘s&J¶tK€˜ 0×"Ne¢GõOËçä$µÂÏ«°k自ŽEg&«£!?àCP{ýÕå¶Ë 'pž)o…„'Fzeøœû^Œ$ÏÐxý ²DŒK ÿÙÕ¨9º4ñbA:ž.ª\ÈJØàþˆ7fT#Œ ÉÕÊ(—y*\à­ñéfDaQ•tÕêÿúè–.óà­ô8Q.òŽ,F*Y͘@Ä\ÄÒÀ1Âc‚F0ûÄæUJT~œì3öÓcWwlêÊ‘Äñ®G,–ˆWMû£_=!CíÚÆe¨ø•0s ž ¬Öâ?ÃΰbKW–a¨›”%Ú:c^MK¨ë®rv¢ö º9Ò ëž2”×){»Š*Ž=™÷pæŽÝ²ê¨]Þ >Ä?£KøLçiîÞ{˜GÏ|¼žeÇîe¥Up¿­@£g,Ë™[A ïhô>V&©æ"Å<4~{tçÞÂ-ð¦=Î7Gã¡+^Aï@èßðþ(Œ‰Cð.@¸©/ñµ´bnmËc"~Â@3XeeírY< –â$$ƒgrD!¥ÑͰNÏÂÞ¤–ðsÓ@»/ææqÑ; 31ÒN.¡\TÄB¢BÀãBeÅŠg?üpïåÓc¼cÑSË+xž“«§¾ PY7-Tl(ç2vˆ:ÿ].«lju»ø0Þ‰žÎ»‡$¥‹@·ÃËìÌx7Uª½^­œ×³Âcwì…J©3w¬X9wç3¼óõÎ< 7µ>É`Ó·f •º?2J·žÛn"ð™À<–|ͽÏ'8†këÏ–V>W‚k³f¹¹ý±á1Nðžx§@{jÏãÌÎ`ýi ûžˆØ@<Àpƒ°¶+H¯ýÖ¦ü@p &•°‚æR²(K™(Ëñ¹  d…÷ˆ€ïB„|—ØÔÉä€Dw±@€'^>KáEsßÖì5Ù"½Hɇ:å2¢×sD:$á¶µ;Rù78ž"F‹ ËÈMï%‰'7’âÈRaMžñ½æŠ¸fžIlÀÜ€$F.&B# OaóŸ”q>#ëª^"·3.Û„46@±—wD¹2cùBØéJMÖ´ŽíòKr‘ªWíÏ=šìbdUû¥P#›K$›$‚BËæ}KŠÍ¶ÇiÏј‡ñìuFd#x¨0ê\aî ÊH„Ñ1a©žªMÉú„àqw“ÖÕ5.3q¡L¹5!)ð 9Y¶Èl®³%õOà-Þä˜Ø¸öù8óg¦8«Lí­¥„'ªhsâdÃvD eS0`ÊÔâÜUÑBÂTo¬ ,Ó~—'M{q•¥Ä…ÓVíšÀâ²H©ÐLñtŒlO…¨‹† ËV˕հ?­\¥ÎÔäO¼f,~u2%Øß yÉ`ò+‡î'Û«eÓ]Œûj¯b2R.þDxc`±¥ð ª¶ˆýVÖW±û«)£)+ ÈEdjØÌ¾æ–™Ð¿Ã\)•èŽÄÌkt›»SÂy`Q…k(¬¿XhÆÀXÜŽ[›Î·'­jî®GöŽ;Œ!opÑ ¸'Þa±šƒÀ×ÔOÀª‚†/Äß|ñX–¯¦ð ƒï“_ªjø(Ié] $ ±jY|Iò>yð¥)·€/L‰¶“òbRg6€IòU¾˜²ãy „š “ò †AFɱSzø‚)ÏŽI«Á$£6€IO@qß{¼÷Õ3ºä ¨È{Ê9è`ëGNLª» `RfÈï8&‹cmûîp¬¬à¶¹f»û¦9pÌÅ3Ù\8†w+P”?ƒ5àÅéXæ7̓cz ViÕÄÃKj›0¶Wž¥ûîb_¹7ö7bš´¼ýqͼ_Ãó¼š÷ɃÿõlöŒ•=pކ=þËÛì—ȼ yð¿Ý„§óWìãY±ÍgÕXžÖYpY[ð‚dÛGÙ(,ç,@ƒàZÛ—ijÅçùÕÞÔ”)ŠÞ„7l“'PX×Z òàey"ËãeÀb¡ðîÁfk–Ú²Áà^ÌCòÄ £ºÁ”èêÍ”üƒAö¤WO‹)€“¼^Úé†L*i ù /É…=Õ1 Þ)? ÚƒŒªÑ³x‚×6Ë)ç?^˜k\ª ÓßáV>á®ÛÉüj]Ï¿~¯Žm[êúü§QÊ^muuìyD1\ùý­.JuºmÕõWf2ŠÏqú½ýnÎܧµ7‡>?ã¬äô«v2J;ã¯oÿ”ˆeµ=ËÒ“l¹ß8×\ˆ Ï#QYJøÔGÔxIìKÜRv}e&wšŸ|×}ü#:m20·^²ú¨/"öx4¢dü×–†Íž¨a˜(nȶÍ›^²¼}U)‡›‰ô\—-ÍÁ4kY¾ú«5Ô¥*úcÕ…NDÍÚP˲çdåÒLe岜“•ËÚ•cOWÿeª+e&£˜ñƒ®dT;£+åæñœ¯¸ºÒåWíd”v:G]IWèX¾ˆ®=AðWáóón„¾ÇÙƒ¬f¹»M·&.léü¾€ÁÑ´S&jº9&êÆ›>0~ÊÏ¿2“QÌxŽ+5Í5n€ÿùŠÇDÏ¿j'£´Ó920Ñr(S¸3Ñl‡JDà;³Þ™õó6&ÄžY5f]L%…Å!ú^ÄŸ”îÙÒãUë£é/-XUÍT°ªÚ9ÁÊ‹•6}¬ôT4ª¯¢Ô0ŠÏq¬ªzN°ªÜ˜ïóO°:ÿªŒÒNçÈ XÕCýÛ—¬Vlá|1YeÇ–uËEåJ-×tž(*eË›ŽÎ<¶õï>¦—–šŒqôsæ"ò¥‰ÇõÖöóÏ0Sh£+Á«Öã¥B}¼TBæÄ2ôŒá£3Î¥Hà\‚(R9ß²lÚ;FR›‡Õ¡lÔ4vPK»!óR÷¸9Wžöq „t‰ sF d˜ËÖ½LRÜ FXbäžFÚ´2_@õdâH"øÅò†íÅ‹Ä20ðv= B}•àXŒ/JRVsG%¸¤ m[—3A!š:~ÑÉ;qeK˜ÈS,‰Rá©ò¾­rEŒÑ>#óD,ÿ C‚BÚ0|Ši1Jö¾·Ï ‹{ŠrB>ªN³?ÌH™”-_0#Ì`í$JÖfã ¢*Õ9#—î*fËŸ©ì …Ÿ¡Êû‰vfr½…©ºèû²I­+4J´qn·m5D‹ôÔ!Ô_LÃðqJç¶–‰½ ¢ÙZ”·4­ƒjÊK„9ây+ Š’-ie äÇ;i)sSr¨¦sX•+jŽ–-—-?`Ó¹‹¤g²éç*·"ë·©ä—Züe kn¢™ºQbB$=Y$š'W™ª¥£ÃòÄ®rÕ¶—wöƤ×1cæ40£¥ Üd½ç¹ÈlH%Q*ŒÈÄpÒÇ2¥¼Œ…¬ʺc³j®üÿˆ"Ùô#ÙàéÌÅSú囯E’=yâ‘×XqŸ˜UF=SËå,&®~µfLYª™®°uVÂÑ.lËÊû™»R(ÁáË~±õQ÷ºÀ#øûþv? îb’„Å,pc/Ú¨=uíŠÇ#JÏûï¡ÐŽ»,)W›Ø¼aûi;—+ܽ§Q’¯põň8Ö-“MV†Ææ2ô/&ï¤í)´KB« 5¨Mm§NÆ‘HRxÕÝÍÀ'«ÆÙÞMIЩ+ÜDT›[qä/% ¦ Èfš1aëT_ Fa[LÌ—=®„p)“³º3ø^x_š­-Ú¡ÂxümSE²Ý¦%ìh1ÊQbm‰!p)J8ÄEãÍfB¶—U#ü²Œî(–‚Ëú²µ‚I„Šq/ÕÞQ LP&Á“‰LÏ’[˜¶×„v¸XLíC&†#W4±¨²/ì~džˆ'[ÉÔ»hSŸÙÁlVU›”;3¡†HH½H% 9Cj{PÝlÓ„¾WÝ]1¢çÞª8övT`3wìÆTGí_í Ä=ó>ÓÁgÊ+´O …é̾)žGñ£)æ™{š£tkî™Áa.Ìä±y¾ÀµAX¶¥êow>¢Ñó|†ÏÔp_3ÊÆä.öµ=g·*UEÄÎãW Æ}<˜»óÝQ º£á3\JÞ8JµµMéê©cIÓ†%j_QÝçWè„'4)Ùº+¨cÃèK5¤šYbrRòµ¶q(К£}r¹«°•P¶Ü3•½•+ Žñïˆz¥’º^Ú¦YÉ[‰Ù rac;õmJ.œ»SÆ?£á3ö<ÇÁÀ¬QÎítåì/ÎV^ÒÛ— ‹„Áj1ÇÇÒRÏsù–²qZÂ%·‰WI"˜SDàÌ}×:„V®>Û+°&ËÖË[±P®®b×veMºORѦhÙb”›*© 1eOJí¼À6Ñrf ‡ã™Ë^=BRÀšxFµáÁjXó0\.[rSu¿Ö—å&RËC¦/m¦ø‰5·¾\MlGÊ:mç /5˜«ý`â.3‰» ¬PáŽÝô^4 3p²Ý¢¨ª…‹‹‹™‚Ö,çS\Ì@ÔÝJü eÎa¢—_†[*eJ‡]fóÿn Šh ÎÖtøå»e,!Ü4:7´ù^â3wd‹G®±ËB[d¯š¶e¤p}×-å$ ×pN •(à’Ëõ&Œk©¯µ6&71àÍtÄB)•±\*çRéŸ6uÒÒ´ËsEÍSÊçú*eÓr¹Ë ϰL»ûõtvÝ…³TÂYZI¨ü’\aèƒñÚòª0À̱d Ã0»L®Y©ºp EÑnÇì ÅoßtD™9†Iåê­Çô[ÜÐKù Ãu ‚A ¦…k¦¶«ÉbJÉ>:íPElª£´Ñ^ñ²ý¤¨zD„°lÁcæÌ ×/Y¡·ýÕ‹ 0r•oÄÐã®Dl¥ë«Ã$ ]o’f”»¯0Üåî]î~lŽ×b=)i©r‰éÎÔ‚qv—š|¸»oߢ*Šn3‘"9p·[¾v|ÁwcùbR9d»Ù®Æº®•AL¨k‡ZmS³ZÞº”9wú¾zL¥2@päcš·wÛ™æÎ4ßyLÛb露 &) å‹„š¤g«6ßÿFÏ2³¡8A†|%®ÑE¥šG¨ð¯V2ÿ‰ÀÚÄôRÁ±`M—-Ðóò,0[pp6‰¶º^ÈJ´åÖ=Ìi—[å_ðË Kaóª½$²¡X žªlü­}/ŠJÔæQE›ëF„¿%& ïYzQjÏþ‰ ØÒ‰c +ò’á„)K—J‚Aˆ)$.¦GÕÉQAe·âµ¹$‚iÚº)«ˆp€E®,äk3k®Å”ºâ)^~uÑl4ªº'Ñ2×2žFŸz0[=aÀLÚ"K;ë|y+Ëë™F;5±8ÏÛ™LíûèE[Õ ç™kËh¾nb®Ö‡;²¤A–9€®°”Bb[}æNNO9’Ø·îáf¤€“KÚ ½”Þ+jF÷_ÃÃ̪‰î(2Žö½ÂeMÒ‚7Η©ýЫõ0¤Bm™Äç;u&9iËÎá!«v?n?ó¸=¨nn#ô% ¾,Ì )+Øæ]wèŽ}£™&ëö¤žíäÍ—@z~¨âJn›ÓÛîTÉ+³–ESîœä‘ˆ¦f'ò`;)SêY–Ë¥%\©ýrx±´ñÎóØ1æòÀöÀÅŠ¸ƒPrkœR9t„vJ¡$™Ûõ˜eûõ1L#¾¶ÂÎ5¯ðadÁ¯Q:9׆ÑTåWâ ‹rtÙþötd›†dJĦ2Ô< o“ŸË(óŒ 1SŒ”l» óÂàq'‰/‹Év1%ç·—¨ÂT®^(›òŸK¿qaÇ0ŽæRÜÄ™^¼– òËsnÙ¸PËQ3˜Ž:“PÙ6^6íÙ^Ùj¥XÒ`ŠÛ{r9VÝ3…±%ñ‹$¢;ªAw4|¦€+°è8w§$ži‰µA¨O𿶮͎–+Úò.Vر,ëхɽ«¯¬Æ… kÆEý>c$Ï£Á´>cTÜþàS‡Ÿ©àª‰f´¾‰Â T’«Æô_xçˆlà3F,óïšvkƒi¬Xjèë)ÕýÓ½ÓØÆî4v§±« ±wlÿº»°ËT—jÙsóˆvSKÜFXïDêæTÊMÙ­†¥ì¬˜„ÚŒ8V·÷ ¼SA(â}Ä{o³QÏ`ÓSqûòÀ·ÊtWøœ0ðÝÏãð>—}<ý;ü8mXp?¹÷ƒdvn³Í‰kê,T´SËe.v©ß»f†õPÐGÝ×_ôð¼öïXKk¯ˆ‚Lò3šÇÜ“æÖöÕ¾©'WÙ3ˆ¥€Òf°`Rû/hÑ ÇÙawÕÌk(<|ÆÊ*êÕGäE¸óçÓŠ‡†°ÓÐI‚Q@}‰G3À»¿î*캌šÇª(xÛ ôÄG'0\µ £*ù)¾ºoŸ¡þYÂó„—d0QúŒ  øÄg6€C_ Yl à‚xì†aqS˜£e“Ó É¶†¥"¬UŲÂ{lððËÛÿ‚¦Lé endstream endobj 7697 0 obj 8717 endobj 7701 0 obj [476 /XYZ 37.5000000 587 0] endobj 7702 0 obj [476 /XYZ 38.2500000 544.250000 0] endobj 7703 0 obj [476 /XYZ 37.5000000 527.750000 0] endobj 7704 0 obj [476 /XYZ 37.5000000 587 0] endobj 7705 0 obj [476 /XYZ 37.5000000 456.500000 0] endobj 7706 0 obj [476 /XYZ 37.5000000 412.250000 0] endobj 7707 0 obj [476 /XYZ 37.5000000 412.250000 0] endobj 7708 0 obj [476 /XYZ 38.2500000 544.250000 0] endobj 7709 0 obj [476 /XYZ 37.5000000 362 0] endobj 7710 0 obj [476 /XYZ 37.5000000 362 0] endobj 7711 0 obj [476 /XYZ 37.5000000 527.750000 0] endobj 7712 0 obj [476 /XYZ 37.5000000 456.500000 0] endobj 7700 0 obj << /Type /Page /Parent 2 0 R /Contents 7713 0 R /Resources 7715 0 R /Annots 7716 0 R /MediaBox [0 0 595 842] >> endobj 7715 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7716 0 obj [ ] endobj 7713 0 obj << /Length 7714 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹½€ €=¶äÀ°‚‚Ýl {gùûQ·¤žJÕüºHQ3²±;íæH,ëͪâ›?þçáß¿Þ<~þÏáÇáçãç‡âX—EÿçpúûÃõº9ŸuS~üöðýðýáÓçîÿßú>?þµûô¿ƒ>ü¥ûï×ÃßÿÑ}ùÓðK§_øöP«ºûùõü³­U÷©¸ü<}ÿËÃßþpøíôÆqº˜çÿþÁVZµÕ Œ…©¿?ŒËTç¿¿ÿøÛÛa³´ÚšV”5ö Z«ÿý×ÃÏÝãë‹ck•ª+[÷LTëóLª:(ÝžÐ^N&:ÿ•y½Šðòªû:ÚËÏ‹cE™Jùß.¹¹U©‡Íµu ü¯ÿ¦m"RÎ rq¬Œ›‹ß~lªáüLÎmOr£¬:‘Q×õ¡î†'s—E÷»EÝXøùzn]º—w‚´ÿ0ÌÛ N[4“/Æœžø:>z’±?_ͯj]Ú¶› ~~>ÿE ´õø¹§ãWÓÎ|Q<Á7ÿ&:;ýìh–«ï±ãl·óËxé'žìà]û¤®Ö§¯öéú{sžµz£ÿ¢¾~ä+xÕ¥•1ó`uÌ2@qõÉ\Á£Ÿÿ;6šÎP¸“žþIÎÖ|{öÅ–®'žì«šLéâ§œŸõù÷õùɯî«î&£¦mg·­½Ìûôéêw¿:ÏÆÃO;;Û™žÄñ1þg„3‡—~b´wBˆéÆ\ĨYÂq¾¯ÏO~u_u7á´J;ð(íÌ;óE¿uý‡hˆ¹ž÷2Ûéƒ<"æñþœb–ñR(ÏJ¡IÍë‹VYgre/€^KìÙWÝOFUëÀSµvf¾öóü!6~ªçbçiöØØqöä9Q-céŒÉöþr¶¢,qìJxß=¾ûòðæ£²ªs†ªÃ—Ÿ;çâÀˆQvà<ø['¤$káÁ#%¦1Lp‡ñž` H à·ñP§Ù­ÊŒ˜Ç¼ÅìÖ‡„kht”5˜*Ý:•e :¡)ue *¡ô*M»‚ö-Ëf¤9,°ù˜T.IiE,M××ò¯Æ6IfÓAØ´ZzAÍÐæwÁ¨„’«®K®œ¹‰‘iÉhy—\H®Ä2àõ¬T@Úµ@ÔÙâ,ê*3ºE?¥*ŽU­šº¼Z@fslÚâ éÓH¿h{´¦Ï’y)Ï#æXÚêô²«‹ž±ÕðL1y¦gÌæ†‰•ÀâeL^?ù.Çè­ƒ4™C& ÑÆlÏ@áaX"`øeîm˜@\äÛ„nwÕ”‹ÌéQýX¹Aaƒ”Á*¹†oƒj¼Í8aPÜaáéÁ(T¯ØÌÂÏ Ì*dþxT2£Ž v<ÆaLyÖC¸Ž9S6oð<øLñ˜O!×{Lô}ç|ÒK$,w\c®ßwŽä9^^'±#êb<0ÚíÒŽÀÒ®Ü9cÜ¡ÍâÞotR9Ò€Ïx´Þ{ø q2%³tx*dã{ Öã±Ó0oâ]À:Æm 5#½†Ñëj<þUDJåwòßÃÏD{£Ús– ’릸‡’°ÁXd#Á$>a›Á¡ŸV³EºlÇÄŠT… Œ-ójdÈàXk—IÓñ5&31(g¿4çãýÅÀÛõÙîÓ=Ûlûi{f¿ÖŒì7ÛÌä¨y²×z›Ë¬{Ÿè™·ð™=cz‡y&ÅS‰QuU:o{G†·Ù£VN„@õlQnÔs\¿ƒ» C®çÜ¡ &¥Fn˜ ‡·nO;Ÿüª0CÊ]ÿ€$ª'cc©!XC€iÓ¦UÌÉ8›g™CºSL>=¦!<†Ï©* dAxéXŒ2"-\‡¡xQQm–eíèÍ]yxw$ ú¿„†T] £'ʃ0Z„‹Š0· Nò)[òö¢"RYNYØòqXÞXŽ˜9‚($‚/WdÐóÐ^ V„ñ})ôÀÐ^ ·ˆÚRuë¨K eÆe+8=\v;«b‡R¹ PêÌZ=§í?¢­ªl®ÃŸtÆL /µC ÉòGVéR財ˆ”a¹+šQ"wà»$–šñú {à†øÊþD9!v,ïªÜ£ç6nDÝã÷C,áuQQñ¸ÑêõC¶T¼œI¨ 0Ýïéš¶Vúìj>Þ¼¥ÄMn¢Fò'zˆ‰tb&"Ñ‘eT±0­„D»¨lëp! àt?·«”ͧ¾$Æh̺¤Äaœ¬žfòÞSÉD+µH‚ÙLöWâ(wýÔ”dW׊ìEŽÊ¤é³À¿j\N%|ôÛt×j›µZ…L×ÀŒïʼn] P¡^ ¬ŠMŠZÙ]g®ä”µí^üM É*£l1ÊøVFWâB|I ¾BWëh8"[åD]`+–,s½# ¿¨TÕ’ÖŽ„ì nàÞÛ8D Ò¦? ùö.$žÓ…D½F¨Æ2‘^ß#æ6#37´…GR!eµ¦yƒ“Ùn@S÷ú`˜ÔüÈÇ «õ+MÔ¹›2µ²í¤S5­«ˆ º1éYM¬M"œ¸k²T`}µ[ EJ&_D3ò u×z7`,ÕÐMˆÛ¢‰qLEê¿„OH%ʦ3Þv~Ì ôšÚÕ„²Q³½”á“+ಙ¬+7e]Ž·u[¦Sþ Õ„«*H›L^2i;(ê/æ˜UÅ€ôb®ŠQuãЕpžRÀi.“VyGãƤšÌ'’”ìb:Û–# 0Ü)S)'+ù 'Ï“$D\k˜u¢¹ÊL`7r±ðAË]ôr.ï[[ðHK²]œ©Wµ‹¿Ü¡5ã‡!+eeo¾aÚU¼VU¸¨“)°©Ä'"'T/Çè.¶èOe«rÄ2“ÑŽë <#XwÂz OUŒ‘”'™Ôöq”ªqez-?“Kz©s˜Ž¼C#ªF#>S@õ;7báÛ4ùG‰ø6ý6Ý>ÖÊ,îãÐÛ6 <ærkï[ˆ¹¥ìå9œÂg0õ`ŠÃTÊPœÁ4׃©Æñ†ù±ÀoSob57ÐK}Á"Æ^¦$¼ÃXrB ´ìÙ{BFz°ƒå–‘j±ƒ1ºþz0ls¡A ”>ã¡DYªÂó0šBà‘˜Bð3)µVÓ.Óòú»ç1bU’˸jt}®<@éËÈ$ÏnaYÁÈ›! ` ÆvI*‰ »Ò>ƒG¶+“[ÝÃgŒËØþa8ÝBûJjF÷‹Z–ð&,#kðHJÝT•wп‹T-CÚfçÔ8¨Ä@¨ñÛr§ßVë5hñÒ¤ÝCJ OÝ.ƒ)S㸦L(?=1PìbËó-Á”ƒq°ûê¯ÈWÏÝúmÛf÷ÈoÃUU¨{<ò¢ ç:§âh<>‚(lÍ$’ÿ”L*î½¹ÇKÄ»e)Í<ƒÏ4°Á:ËHâ/Ê©`l²2Ò?¦J’ây°½i' ˼*Ê{gÈCÿXÓa d`p^8mˆÐÂQªg*ïþ¾wäì¥öOK¿pC7Ÿf6 £Ì±P§ÇA_Úù,]áYÏ´×éqªg®ðìñ3Óhfëãb¹ÚÕÜxgfžAãrs°}V:½Ç™†FuO X5,}²ÀÁ5ÅWBà6]3ËPømð™!ŸW-ýŠlY‚;}î 7âNÃþϘ†û]ƒHÀŒøî¿ŸŠ=ܦ7hž!P„ïA-Í'fÏ<ê! coùUüz¸ôÁæš»ÞwÂKxbÈK$ƒ…Ò{ÈøXX`Ž!xÖCC Xl à¢x˜ø.&® sÀ3n†b[Ã+p®ûJ-j¹O‡OÿÞ(H endstream endobj 7714 0 obj 5560 endobj 7718 0 obj [477 /XYZ 38.2500000 785 0] endobj 7719 0 obj [477 /XYZ 37.5000000 637.250000 0] endobj 7720 0 obj [477 /XYZ 38.2500000 785 0] endobj 7721 0 obj [477 /XYZ 37.5000000 171.500000 0] endobj 7722 0 obj [477 /XYZ 37.5000000 637.250000 0] endobj 7723 0 obj [477 /XYZ 37.5000000 171.500000 0] endobj 7717 0 obj << /Type /Page /Parent 2 0 R /Contents 7724 0 R /Resources 7726 0 R /Annots 7727 0 R /MediaBox [0 0 595 842] >> endobj 7726 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1410 1410 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 7727 0 obj [ ] endobj 7724 0 obj << /Length 7725 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜súÅЮvä@€‚;ŽaHFò÷Ã6¹3$¿æð›ê&‡¢öR¤È®®wWUW¿ûó§þýûáÝÓ§ÿ~ô¿Ÿ>=¨c‘©æÏáõç‡ó¦<úëCQf‡¿>|;|{øøð±þÿ·‡æ…OO­¯þw0‡¿Ôÿýzøû?ê›?ùôú¾>º¨9ý® ]_©î÷ëý_þö‡Ão¯_l‡óÀ\þý—[¯`L ýí¡¦>ýüþãoïÌ¥2¹µî Ýëÿ*gÿý×ÃÏõíçÕ±ÌýxMîN£—Æ\éÖ¨áØ™ÒU®Šú1º>»þ‚q®&GsáÇ­ÑorÝþ¥wßœÞøÒ¾úJ©ŸÏÆ×…É\U¯/Çï˜É)ÛsÇ)çÇ;¿²g Œ¾Û‡‡Ç‡Œrv_£hÿz~ /@³›ÒgÓÌÎ:¿ŸŸ?»z#;ÃØè§n¤W=÷,++zÀ oägЙ˿ÇFZŒežP_›«i,]ÔQY ?YÙGLÙ®wã в‡¡Ó¹É–Õ(½lÕ~xãíÍ/½/Åև FKb4ü3IŸ’B±•îcD_òOÿÆ úCÍùÇ)s O}ctøÀý†‚ÍE,4]oÞ†–K*4Œ3/®>A/᪜ÖEî u‹‡W˜ÚÉ*Œ)ÚÔÌ\_ ¼¬ÓÌçu„W®Š÷ñäâXÑ6×á¯GöªKU›5[•‡\±6ß‹,³¼ñ"Ë û®; Ø»_ÞøÒ¾*æUkë׫æ¶pôÆ¥gëïÜèQw¸¸q0ÌÙIdŒâüëùýiÔxxù„”t™£¾GémyñvõFqÎEcŸºÙ¤•y9V^õ€Þ8wÝÌåßc#­Æ ˆŽ2O¨¯ÍÕ4–.j©üËIÍPcX##ß/>~~x÷R+äêðùçZ-Ÿl~}~µâ‡^c!™9|þéðG¥ôËŸŸ}Ð5„¹Éøš'¦BOTqz’MÞ<êžèóßQ9|§‚ã”Í;öXè²8bšq´>ªÊ^ù„Gçðƒæ£!Fñéãßyþ\sÜmÌRëÎ|ŒYj{b–ªæC‹ÂÌå¯øè€±§'ÕѺn¯y¢žNOÜÑ?8{bOOÊ>l;îÛ屬T¯ÊÞG†7®×Y+œ OÇ ÃHü~Âfž%UasðkÕ|†Ô€ŸWÏ^Ö¬)õåÔ¸ÏBÏ !H ›œÀ¼à8ÂL%ƒH¸€èaŽ!¾¦­(l34Æ,fD< ‚‡,ä!«¯¦-Öøî‚Ù ƒä dÞ§Øf.³¦g眃¼!¡µ’*ªäí«ŒrbØî]9…1àØZj2 @EµÕ —/`ÎúÒ°£êß/wfy…¶ðœYô/JÄ"aÜËŠ+† ŠO6ü*ãî@HÞ ¡Æ)/*ºÔJ=¨¡^ùz¹†¾Ì‹ò›±ÒÀĺޤˮ…— ŒàÙ\DÆ0èÂv-ÀC˜¶}ÝÀ¬T™uXµbmB ן¦ ²FK†ïd=D"p03Df‚‰¾R¤œyÜcW:1P€©`æl­d™›ž•d"&3ÂpTÖåzóàùÅëÖ®"NØaNÃî%cxD…9ð5‰¨[ªmT ›Š`Ú2Ù¾Å6>x59ŒÎãJŒ€G×`I›öÑ›æxž¯9ðöáR5BHLIhBYWH¤$šÐ«2XXÉä±Íf=sÅ * û d)XaBö×kãÀ bKÔPK|¬ ñÿ$&ÓøÜ{™µCÂÜnÖ3R)è߉ZQWôàlwV”Û2w™Eލb¢ê£gÄÃ^äÄgáL•“, ,³YJv§‹¬¿ŽmøÂʸÕ”½Á>>“‚ŤìÛ5Ê­ùß~ÝAª„xKs_·îëõ¥m“-¿-t@ÿEx>~®ßS×êI«=„o£)®^bœÐKèð‚ÃÔbÉò'J43Ñ¢å;áà¥æqôØrïýÄroäýõ0öɉö ©R’²Õ^LÞ>`byÄTøEÙ×lSÁ²y:B6½ÃXÑÅ×f{ÝâmžX$½œªjõú*9*4Ýùi}ÂÌM[ ˜xYu™ß`¿_:‡²CêªÃN" ×¥Œ$˸­°2«Ö®YÒ›³eO­0ëGJWK$=Vç¾Ï:õ¸-6‘꺱ŒlÍÊ0YT°hk0Uÿéu;nÄßK¶¶MeÇ6f¶RIÝnp®7815u®úz†H'k¥/ÁF‡)Uh$W=K2/4Âôc¡Å}éLåR7b*¿ãÐHªjª‰%‘MCk–ûÅŠ5µîp™ë©¤vÔ¼K¸½¬h¹âÖúößÕf›t^–±7xYøIöxÓ‘HCgSÍëRøˆK|Ï>âõ»1.¨>é÷Ym\`?,£‹©ïu_º©|³¨NÑHT»Û ÅW ÉÎ  HJ|„éUNIDƒ É£"æéøå;63ù "2ƒ2«ŠTV:Ñê%Aß”Òõ¬Ùš+Ž™ª\ª[‰h—À^ ùXì˜ìGSTOÔþkαƒÄREÖSîÜ"{VÀJ…qy«*ð&Qm¬HI,Þ>œ …yÛ.aÆV_¦d4Õ±U„‚:¾ œpýb=U+ÛTÌ-²Ý|Í<yݵµƒH`iÉãU+ûr¿æ Ýo•MÕ:„êŸ!Úÿ–Yz§ŠÌ —1Š3¨N̰Êp1ÈÆ6® ·Ê팹æ6tËŸÑw׎aDK]•ý•ãîrrÛžuŸ*æ“J”VØë.Óà[Óÿ”‚S ‰¬ýœ~SáÈA–·ÈÕÆØg…gþÆ·ÌÆ7¡’ÉÔëR'&+cÍÅU7‰ ÕUØá¥qKª6½²Ç¥/·™m…½%D©Ùr¶¼_·æ@µìJË5µZó9ŽD÷¶dšpÉtA™õìYÀˆ3aüáU]‰Tw@ª‰ÃRÛQ¾úõ#dŠ|Rµ,è1¦w·hb·TŠô* ÔÀÏâ/Lm\Š® g<ãXɼ®°gÈÆ} BõþŒ¿3+¹¾€@@ª™.—gÓA-ßâms­åâ%Šy5ÕØ…ë8›Læbb³Þ™\áìãÈ;ÖÔ{3¶'Æ¢'x‹aƒ¸ö\Šy~Ltl¾ãy~4Meê5P¤NÁqžçcGãXœ)ž†®/†ÚÀ'š>#Þ±Œé¿æÚ ½Áf ®sÈ×/±íb -í¤(Q]ÿˆ'•€a xz‘JÕ.{:ã¬ïdX& ÃlÆÞü ´ÉÜ>(Úxç¨ÎæÏgNï•[ÉEq‘,j¹¾ôSO  èž3dY0\šÙ¬gñ’éKÙÖϺ”z,±ñ=•b[¡0¯Ð/ ªÇoh›Æ¨e¼ØŸøf6eFÓœ>Ïßfœ[fûîHÜj’¦1ËäT]z[(n3=X÷]ç²ÛÞÛð'šŸ ¬SµC,ÆD¶Rb‰#êŸÇ®Å?ø½‰••ÊL[A¢=ˆljzù•µ2ÄÁÑ*¼”˜V¶È{¶B­Ç¸;øÌÚ¶¤" î @@,d;ù  £Â³3*‡e™þ+ÛjFÄs2;w•ùe"; –ÆZ‡Í€›À.÷V`IävDÙSÑ|Öv³g>Sõo[¬C}`Ñ€mU¿QxµÌð#˜Ìžf‹{/Îè‹ÍôÔ%ÈBÅ¢âšF[Q¥˜áq@Zvoüš#b‘£–"͂ג‹¹Ä«ÿô£¢Ž•„ÉÃõßÂ!.L`¬ûvŒòREuCŠ"ÏìxBwu\)€”ZM6ü8‹(€Jí´‚Ç5X,;‡ñÅÏîæÅ>À'è‰.ÐßQß±'nþ;¾£ž Xz>I(\)=Iaû˜ÓÓbc˜« æJHUø¦æEÌ¿ /:8Ó;àÒ±w v|N ã ÙjšçÅ Öð¼ÜеìÆxÞ·–ƒ ÎG™ùó ð"ÄŽÑÉh_(MÒ‘‘è€tâq°€`c¸‚¡}€/1÷¥³h…²nÚÁbÎÆÁ´µ¾$`³‚n[Ë€õ ¡I¶Ð„ô2žö‹áL-Áo²¨ð8˜ã!Ëc”±g²¸NÆ×j}8[%ÔªYפ J`RxªéuÔÖ|¸}Ý"ºn©}Áƒ¶Ó¶ãùžâX ‚»Ê?nmÞ1Çæþù“FÛä>~6œ·=æƒn™Opœ÷ðk¾Ó@­Õ±ìW–<¢w<íGæƒaÃó‘ÅþšòÏ‚­Û\í‹÷kŒ7¯ŸÆ¸ª„_ËEg çƒa ðAç#« —^º¸b›2“_šQùš*EäWű‘j&¶ƒÌØÕBU9¤j{ž(i)Ûî“:B˜IoÇÝß;ب¿šÞÆ÷žÉŒÝµ˜ÉIö?/r¸ëds¼˜V­Êzf*X#tàòý— £ÊKgdl‹ñ6Ì£H¬dòM”ÜRm p>£¿#QëEõ‚=Cø8²Å›“Î8t’*Û“(SÂ8½]ô̶»j¾*¢öVPÍ¿¿ˆÊzæí¾Ûál—ÕÈ‹Ë5Ë AdáºÅëY”ÙÖƒ·ÿElçx?³ÕïØ}È6–Æ2;)n7µ‹ˆÒ=ãy«!¦¼Ïï …9™““©í/ JÏYàÂû6y—ÆYFœçÄyz˜4¸ú×àêk˜OuLmÎÁâ,0ÎÁfð ÄA ŽqMTôh\•ÁÔŸ¤¨ðo9¶œ¦É>Áµ½¸ Ê™pí|‡©~ T%áz¦Ú‚gf>',µ˜ „T?Õ#­š¥“t«ËõȦè“T\ޫ֏z Wµb¨E%C¶.p—ôÕHzÖºNÐqÒ/™g›Ìê½1M0W0¼ŒísŠšÒ–ŽEvßtÄ;lV\ºz®¨Ü-\ÁÔÅâʬ= ;nˆq|‰çC¬ãö=(ABì~È Å;˜-ëZ§»JfŸ±òb$ïÊÙš–øpX6±Õ‡áa‹$"`YóymŽe¡ÇlÁyAªãóî©c§á;>cò†'æœBÇÃòÍ[åk_SzcJ윟Vÿ¾Õ gòqê\afʱ™ÚZ÷ÔÔ¯§t0m Qá5LWŒˆL£ôLk\Ïž4f+>±ü;¥gYOøR#ãØ)¶ƒíÅÏt¨j°åohçú*Ÿ9™'èõÈØç±ëéÐ44þ|Ç˵ž5õ³Z–á^¯kˆ[BCÜx.fý<Ÿl‹ïæþpI­À¬qZG{¾ýzx„=±èÆPû¨‹»æŸâÏéûcªF4ÀP–ðÀP–0H+¥Pð±²ÀCÈl€‡ž¡Z, ÐGñyÓiVˆ eÞ\H3TÛ¾ó*–so §ÌàáãÃÿˆ‘¡ endstream endobj 7725 0 obj 5329 endobj 7729 0 obj [478 /XYZ 37.5000000 512 0] endobj 7730 0 obj [478 /XYZ 38.2500000 348.500000 0] endobj 7731 0 obj [478 /XYZ 37.5000000 634.250000 0] endobj 7732 0 obj [478 /XYZ 37.5000000 332 0] endobj 7733 0 obj [478 /XYZ 37.5000000 197.750000 0] endobj 7734 0 obj [478 /XYZ 37.5000000 512 0] endobj 7735 0 obj [478 /XYZ 37.5000000 112.250000 0] endobj 7736 0 obj [478 /XYZ 38.2500000 348.500000 0] endobj 7737 0 obj [478 /XYZ 37.5000000 332 0] endobj 7738 0 obj [478 /XYZ 37.5000000 197.750000 0] endobj 7739 0 obj [478 /XYZ 37.5000000 112.250000 0] endobj 7740 0 obj [478 /XYZ 37.5000000 634.250000 0] endobj 7728 0 obj << /Type /Page /Parent 2 0 R /Contents 7741 0 R /Resources 7743 0 R /Annots 7744 0 R /MediaBox [0 0 595 842] >> endobj 7743 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7744 0 obj [ ] endobj 7741 0 obj << /Length 7742 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯Ð9À¶EQO`ÀöØr`Ø@AÁn6‹…g'‡üýhZ”º[ÒWj}]¤Øm­‘LOs$’õ®bUñÍŸ>ÿ#ùד7ï?ÿ;ùÉý|ÿù)=TEÚý—¼þûáü‹¬>¸ÏIUÉO/Oß’oOŸž>µÿÿí©{àóû¿´Ÿþ—dÉŸÛÿý–üíïí—?»?zýƒ—§ÊTíϯǟMeÚOéðóõû_Ÿþú‡ä÷×7öÓ¹Å\þþC^æÆÖ¯ËX˜úÛS¿Msü÷ߟ~zÓ`Ý,MVgU™˜Üæ‰iò,ùÏ?Ÿ~i'è_ŸêÒý?““çÇÙÓ¼LlS'¥1Ó¹‹Ô4eZÕ9ü|>wÖ¾Þ˜¢ÅG÷)w3·ÈLèÉ@Ó=ôuxü]¿œ-ÂTY‘7íŒðóå"Š2MÚ­¥ýp9ãÜÇ\<;^È Ð¸œp<ÍÙº°˜‡úËùÀ2lú%!Þ¶ÂaçݺN¿ž‘íëäÕô›~ ݯg/ºqYbêúX'tÕÍåÔ3_ÔgÐË.÷)·†l2·6\F8x9~³ ’yü]®¤É©Ê¼Jo‘¦Uö*Ð*S'&kù*kEãX¢ÿé¼~*.oyS[/?®\*Æ–F~»"r›4/:ÙUy3ˆN¯÷ÿÆÖ¥¿—W®‡\áíšÈ-£þ,m<€hx½ø×™ñ÷òãÊÕ¡Ò#¿Ý¯íiSÓÚœec“2«lÏæ¤r^ºßëVÏØv‘ç~üìO¿ŽÕ³>3ë~q&`fÍå*f¿éŸù Þu³Q:“[šíì{oPëqôrüt  .¦>¡XÉÀjÚ¡—ÑçÓå§e\|_Ÿü:~ÕÍæhË*£õôæù¢3»Þs>ï0Ûë}@ÌÃýåâûe¸—PøëQ­cX‹„oƒï¾<½ùhrÓ’}™|ù¥ÍÇ9»_ZÑY$?´ö–MëäËÏÉij?þ1ùòÛSs(³ÁâîFÒg8ò˜ dð™®À”p$G#EçÉŽ#¾´HòßV'-Á×¾ ¸ž¼ì!÷ÂBÎÔ«Úpߘ0õ0”`ß4òŽXbó\Q¼¶lý<Cl§?©û1©¼Ñ;•_Aåb)©âÞÂýó`ZÆ#HË­ý²¨AžÃ­'Oí Ü È.Œ!8‚¹!‡óäOvÉ.Ê—€VJÞšþ¼„ÂÒF[y@ˆäfC;7hsƒ…;Űfì ¼a ŒSh a,X8^›€S¨S™ý+Àþ'Ö÷ªµŒŒÅ#M@YS.¯TئrlëažÁ62æ y¬ Z†^`0gÐÁtIÁ€ƒXçļSF¢¤xžˆ÷‰¬©š»–5'ó ÖÂ#Ác3Ä‘a´8äz [.Â4j/5]ï÷0‘SóŠÌÄá‹EKÜ}Q‘*_ÄÐNóÍ3–VÌÞ–€ 7¸ÆÝíÐø­À¢±‹+Ù xã¯ËLËpž˜cXØFf8=ت1§GÎg¥Éî›Ïm/¬à™HðhûÓ€ÞV “åÝbN»3iëCݤÇõŒM”™wüšrÛÕsÈàyý3¥ëæ«vÄ;÷LGˆÆм¬ÛÁ)¹Ue1z['ÒL~ÈÌë#gÐÉÐ3ÆÂ”p?“¢y28"À c¹â`³Ú\ä‚+XL²\õ6á`™9 ‘¤Óóf•î¼yoL—ÅRób&Q:dLbâX 1„49œN„8m§ìó6všÁÀt „àpÀus,á¬w±g’¦T1‡W-¬À K6—äÁ¨w)¡%ŒS÷Gõ»ÃÙ8Ûó3žG—Ó·—·ÛÛ+ŒtØ)ä.($ˆ¼­O¥™»¼ÝåíCTsÕÛ "å[ŒÿAY˘Kð<øâHÚÚQ€!Ä>ï’(Ž.†À6>¼•±—m|¬§°ìÅ8eŠù‰"{ QœPŸcÅè9Fg©Â óÜÃÙRacLaì¯Së†Ýþâì¯=¶,¶V`M¤ú06(¦˜Ï]…ÓÈkAÕb"Ý©—ÄCÓš]“’§‰gŽ %a{PÐø¦=aõa_(ïúÞàF -}v°GÃB¾9ϸ‰I8Ç«&Š‚BYŠ÷ Qe/#P fˆîÃ÷ä1ìöгWNmÛv{e·WÈ·)ûì|æCži†Ö‚;ÏìOÔWÞtšÌX6ª2‰i>Ìd{=’LjÐÕ©é‘$rS_N9—ªÛ|¿pÇüs‰¹.Øö×bž^ҙݶ¿2t"~æÞ†§;B›Iv¢älõð%xøõ8Ïçe;ùlI8…N,¤}ãÅv#s÷´bÈvl?s¯©Kã­ƒ£”™gJÄùzȺ@ÅÌÄÂÆ\°Á¥rƒu€„oËjø |›K·6Y?tâÁÞ ˜$áç8q3ŽÆLц€– ­bò!9|ªºéÜ‚8ÉáÞ0­ã`Ù«iP`LBQ²/”\†ûª±^!˱ö ”üÙ­À™UW® ¿MY]ªÚÛ‡X@cœâ‚ ]ÑŸNÕb3[µèD^Ñ‹ˆ[îù\äoŸQ¹¼éÆÍî¼ u8Cq*†¦'Õd#åî7D„f»xÙcôûŽYòP.Ó’IRµa•ÛñǓ५ýï-%Kó‘Ûûp<‚åÓc•·$®‹òJ˜(.|¼ Ñ‰/¢SÏ72ú1X[á+£ù~áo°E<Š$[4#™äÛò¿>§ãLHÜRë(.äBõr¼1—+ÝS¡öT¨é„±#jÑÍ• ~T±¢øVA„Iì¤Âô{䪉½kؼlÆü_$#X3•ÎûiæT¸QL>JáÊÍ`×'7 ¤Š™e«+WÉ-±¾ÏþU>v¶î)?T§.Aõvšƒ¿Û[D¾»ßø½ ÌwCÝäÏ9×Âj*Ètû Ò &;tWž}ÕgýŽ:æ3Å!mìeŽ1´)¨# ç…g¢åyñœVëV’Üs†ûPÔyé^ŸÞÒ$2â Kú;&]SÁÓ‰v|¥­Ò=êŸÒŒõÏcˆ×Ù±uµ”Î"2JuÏæuë!©œyÆÌŒFj1ð‹ Çy+ÁAC]Œu&ñ{óûŽ¥º"@¡ÝŒT^-s «/7Ëb^âe* ˜>T°¥¿*æâ·ÁD¸xÙp¿súîUµïªÊØÂÄXA¾ÕÐæª (Ïâ G>të=ƒøÑº­Çñ\öÿ ¹õ›ù`ÿú­¼áð̧îj²‘òŠñX=b?i3C”qE©x.„éc¬ÛÏwggùîP£’ÈꞪï@A4¦+— 0-q‹‘\Ǥg±o†)ͯ&,i¼z*ú^´xtKgõ@g÷y4\5¾Ð×ù¡syAøâàŽóg.vÆW$;iÉvδÃW$ãà«‹ ¸S‚²…«¥ ,Xx÷°ejàµÊY!ZB ùè›ýl‘ŽsvÁ,cÍ2šŸáF0b X”Af»îîêö_ò­…Œ¸OKp…­gÛê‚Ô¼‚!iEœ[7f·Ž<«× ‰lï†ì³{Æ¡áŒÍ‚ œ™Ç.Ï­í£Ûé”0±;¡7&'|ôTN7ètŽÁâ0ÖÌ6 ~|ÆÙsfÕÖ«Ù²÷ú¹]ñ¥ŒœÓnÐGÂ$`>¬'Ûûû~ªÇ±K´jg`­‚·;›!OÌ:Â'£'¼„'†¼„—d±Pz†Œ…æ‚gúÅbMH€1ˆÏkÉY&®R{p à‚›¡ØÎ aÏ–³¨å>%Ÿžþ³Ú‚¨ endstream endobj 7742 0 obj 4961 endobj 7746 0 obj [479 /XYZ 37.5000000 311.750000 0] endobj 7747 0 obj [479 /XYZ 37.5000000 236 0] endobj 7748 0 obj [479 /XYZ 37.5000000 274.250000 0] endobj 7749 0 obj [479 /XYZ 38.2500000 178.250000 0] endobj 7750 0 obj [479 /XYZ 37.5000000 236 0] endobj 7751 0 obj [479 /XYZ 37.5000000 512.750000 0] endobj 7752 0 obj [479 /XYZ 37.5000000 356.750000 0] endobj 7753 0 obj [479 /XYZ 38.2500000 178.250000 0] endobj 7754 0 obj [479 /XYZ 37.5000000 311.750000 0] endobj 7755 0 obj [479 /XYZ 37.5000000 274.250000 0] endobj 7756 0 obj [479 /XYZ 37.5000000 512.750000 0] endobj 7757 0 obj [479 /XYZ 37.5000000 356.750000 0] endobj 7758 0 obj << /Type /Annot /Subtype /Link /Rect [315 149 410.250000 155.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 7745 0 obj << /Type /Page /Parent 2 0 R /Contents 7759 0 R /Resources 7761 0 R /Annots 7762 0 R /MediaBox [0 0 595 842] >> endobj 7761 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7762 0 obj [ 7758 0 R ] endobj 7759 0 obj << /Length 7760 0 R /Filter /FlateDecode >> stream xœí]ËŽä8vÝçWÄÚ@G‹¤ž€1@eV–/ ª/^=î1]—gáßwDHŠŒ¤t(ñÄåCÊèÆLe'KyyßÏ_ÿåÛþúï/ßþçðÛðçË·§âØTEÿÏáüï/·¿ÐíqøùдÕá·O??Ÿ¾>}=ýÿϧþo/ÿvúéÿúð¯§ÿýíðçÿ8ýò/Ã_:ÿ…OjNþqù³kÔé§âúçù÷ÿýôïÿtøûùãç†Í¼ÿï_ʺREwÞÆÂ§>ÇT—ÿñÛߟ~íà÷•ÎZµUšò ºRþ÷¿ž~?}`|}qlëáø3ùñòòu¥Ô¡îÌ¡ÖÍôÛU¡ººhÚþ|ûm}z}e®úcøÅ þæ´ËëOÃ_x÷wÿ°>ßÙï7;Q®ÊîôYøóû\_¤«nüàeCº.Þocú‹·'þo²ww?œú] ¯Ýü> ÔÆ[úqùiPï¿üvÇwÝœº¾ò™›ÿ¼Áãó×ÊqöBu!ùw/ºó¾ôé6Ú÷»9ýâízÎßœûÅyzø! PÞ}õú­Ó àþq»° çŽß^W*ÕÔeSÜÃ^}âpê M¥»Ó›Œ™°¸Ë¿B¯ðrU©p/¿ì\*ÊÔÊývÉËíêfPDo¯—¹V&ÜËû‹Ce¼ÜÉÛ¿ú¼oÅ©výt<øüýé×/ªT'`և￟6wùfÿÇ÷“²S~9ëZÕé¿þrøçÓ–žÿtøþ·§îXë‘+­¨®´p¥„+ÜüNÑÁ•O—•×ï§«źËŠ">S¼Â•Ïþç)¾,œ4ʘ¢÷ÓÀ.­ÄÙééÏ•›Û©öÇüLñBPÄŒ¿u2Ø3·w­ñ®áwÔ€ÏCPªƒ‚ðý0ß<É`ˆâ·AŽÀàh¡ˆàûÁØ‹ñ€¨Ö¹C].ó|â¶P„·å &æÓc£W,í V´æ¬ˆµRBªs`æV˜Rñ=BŽ€÷æ {,g"Þ}YèlnXvÅ`‰˜3K.¶ËÇJ­²Á¾½­Ìá0^b­cÖŠ Û¤„6™ƒ/cèà“ŠR­ã Üçan.ÒyJæ±ì+Ê#ûlÙ2±‰üõ9) !’ÿßqRœaCØ¿ ¥ïMSd$–&²’ÎàŠÍqâ±á¢gÃ×’t3"eSW—ýØ„ÙÛ®x¿RôbŽUY·Í»•ZKËciú6VÂ/)ÑŠc÷®À羽M*s4ºU§‡V¼MáïÀ];NZ£·éÖÿmC€B©ú+à&{žÁíÓ®8àÐùÁëÂÝÔïúñU–Ä0PàIˆw€áö™¸†0…Ÿ16b@@bÄÀ¯ÝÛ›-{@VǺQÖ3öfñë'žð;ûŽ ¼—Ug‰ .Â3:˜–˜†ñ3˜êð3˜ñ0ÝOð—y=ÆyŒF²€„Ï(‚}Å’Óføl_ ~ýë@mƒ¬_Å<ð‡©"*‰å…º0 F~J臰*Y¥‚ÙArªÄu¨vø<ë„ MŒêŸl¶IÐ¥2’š V;€ßaP”qÚ:x“-™/ ¬ `œ%ôUÊ®gÐZ”OSwË@_e$æÚs6Qø±“˜ñ‹´(F«VÙrt|Óa§Fš~Eøë£X¯g—Lˆ¯LF@„Ö:ÎJņ0ÙcŒñpïfì)c@ìpÐȲ>"Z!ã¦ëë˜P¶ÃGAí¬RC–ÂûéDcÔw u@Q¨ŠF[²p£Á |ŒB–Ó&·ÉëE]ÜŒ#›‘µ±H4´LÇZ ~¸Áð®¤ömjãˆ$l9 N¬L¹P¡¦¼&ç¼¥ç¬[ÔŽ.Ûü(ÇCôDr¿ÈÆÕcÉ_ÁÀ÷ÈÁÖTÊ £ŒDr»R ²ßa°Ø åñÀ›%0e'Iòî-*ÁbYÉ„SyîPÄ6Ue‹XB ެÅÒ‰ü-Jx)™Sf+Ùõ3’gf¬h3vT¯ˆÄKdv´âŠü ¨¬;yÇ{cˆ~“jÞÁ„€ú.N8drA0Ñr“±"¸Ru¡l±µ>¬Úù©V[j&¢{L~V´¬FÂTtÀ KÒÏ¡Qztê±Å@º¼Ý%E§¤œ³ˆD2b1‘R S{F¹E&²œÈÆL©m>†‰‹ÈÆ×ý33©YT[¤—pˆ”ýfç"ÙFÈü°3lÆE²Vã„Â{ó‘°»Ñ8YX z[-!©""že5-(aXL0†Ž£às‰Ó¬íè¨ÕV²Á*·í­lª˜î=ÈÂÁµ°Ñ¸¸<ê……P$]J4Ö¡ÇJúŽ•_Jx•©l¯œe|2 ÒC¹Ø”$Ž‘ÌtŠà)6C 7¹é(‰dObU¢¶eµ(Ú˜b^ªr.?C&Y<1ç!£äЍG"Í °Ó}’ØäQÌh‘BßYËc‘8Aàz&ÑjwYƒÄÇ„ØX6nU”– ܰŒJWÀyk ×ÅNêm©$m¼ˆg{=.ÈθêqSõÌT )V:&P"j‰G…¤-üç1•ç³¾±Xè&‘ø\LˆkÍ»êªçUÞ Üž,Ã4CÙh‰®AJqBêZSáˆAGÊSI¢>'FUw°V¢ëÂZ8nCÖÕ#{ë‘…–l9]cbSÓÕëàuÈmasN"•ÄÀä‹Hû ¢—”ï)d[_c,¬¡„fJØJÔcP¦z5V•ì ¡ÉŽˆ¤5CvçRâ’ß‚#]ñÊOҨ׫ $2 AÃ:¼¯ª+–Õ¯½e)PFUªq%™–+µÆBŸ4?`Àí“{¸Sç—ƒE0ÜqÄdØî~27J¶±•‡åÎ8èD‹°e|¢·/Ò‡rà0šœ„S4›ìÖ€’©6¥%™<ÆÅæÆ‹sã¶–Z‘_±LúL2¦ £Ãÿ@  toÙŒM¶>pø±ý[ÒõoÙ Úc·klK=gêZ¯§ÄbzØÕ¼©ácL‡®X­n„¥;ÓèBT ÷@žŒv±mÈhß:Õ!Ì‹•ô¨“ÊÁI¥Í­Ÿå"2ÍÈßg²so]YôPôgîy±¬È/u‡Q1·I[¢Ná6VùÀLÀƒÌ=ªásn;Í(yL’Šèeãü6Gæ³k,6 ~wϰV¾1ÓæˆÌ^C`fÈV»C7û­2UqGú޲.+Ú=©½w#9Ξu&¡F6÷I0ñlð0‰€LÜL4:škU6?kÔ(©XEy¢…Âr•v-œ£Ò žêjŒÁz#5Y>û?£±Â ŸqˆËnA2ÌÕ¹÷×[uÏMnÞ¡³ˆ”sˆ eíà˜sŽÂÇI_Ñ3Ž0(`F*†Añ ÷†wOêx[…VʾMô¤ª ­F޾Én$fÊÇ.[ŸIXAGf2Zb¥"nS΋4@ÅhD¤c‹ Œ‚E¨DwQOhœ$ÜàÞ9*þ?qlL„¸Ræ\ÑÆäz‡`C ¼NYO¤yQù*µqW™ß% ¢ŠJ¿×6ºãewÅ”\gV|˜{¦ôf¸°¹•®¼Â´ð™Op…€>©+þXqZÜcÂÊq÷"ðUC|‡À CœÇ±7¼ƒg¸øÜ½ö¦1þÇın&É®DÂËó x[˜ó Bï:Êm®+òmxîÝñ|¸k¥Âï80 ŸSq?xEã;…ü?cðÍa)*» bo²p+eáVmn²»Îß–VâH ÝF–„¢ƒ?ï@Òû.Õ¹vød$ß%å‡ôèš/šìŠõúѺهÈÖ KªÓ>>L´‡‰G›Õ•…-Tê"‘ù°©^–T>qà]“Ícò¯Ð žþ%’ñ¾“Ê.ªäfSÔí%¦Ä£Q†Å–ŠÛvß<7ýL  l¦_¤,Îí:[¦ï?­'²l[ˆ²½ wf‰î¯0²’ú¢ýd³"·é ïÓ…ùp„ÉôñÂUÏþÏàôolŽ{Hsªy_øÎ]gag…o“P¦Ã_>öð—-%¢>ørp¾,ã+\_- 6‰þŽ[ŒzHØÌ%lÝ*[Â⢕ ‚n70ò§oC%ka&OôI?‡\¤É‰ˆcØ!r×7Ü¡ÌK¢¾pïÙnÌ.&“ øÓBìÚ Ó!ƒˆýRĹßpªR¶¤ä#·g›¹=RÕY„\sÜÑ7r‘¬#ø õX`DÅéeó˜ÎŒ!˜Ê¬¤|ø±ZÈìLûUMe¦C$”~º«,r—ígí°îÖwô§Œ†üJ»)oi,%^]E»äX‚¿É– ez²ˆ§ esטé3½ÿ¯lǪ­7hJ[òùà¯G FÝAÓσ»=ÌæJcáa£¬³mÓ•;À}nh¦‡Ô’jõð7 ‡érÃL‰óè /Û§˜àÿ”>°ÏÔ»°M[8¢H7|¸<<¯ïȶ¡îjFleÍ0¹¤K^Êj,ƒNÍ0­hSÆ5ÕY9ö„‚M2+ @,c<²Í²©Α¢<{óí+tR 9Þ$Ѧ˜î¦•h)CŒIpÛ}8BÏq.*"‰dêe;KÇì¾±ìFJ:üòÉ«Ş̌ô(Ù:º,#Ñ]UÛ‚4šfíEÎv…G»¬Ÿ•ÍE•m›™5Æž°Ù´gÃÃ}½BóŽà¿kš{”ãX­wD¹‰C`ØåÒ쪑†é-FêEöHRË*I-93õÐ9×,gˆ2•êXC\ÙÞÛÌL˜aj »§[µ%š²n’8ÑÙs¶@1M%¯íÈ`:kàt"Ñë‡o-å%½%HõúôR²µXtdï‘I¯pØ’)³¼Š1-öÍøZ¯QåW"ꤨýÄÄ… æ ¤§"žëc_²§ÙhÐ÷ëjBNKèCR·n&®•G–Í=Y6|™ÝxUÓr"3>ÿ~As˜k ¦[È–ßTËïXúuzív[y#1¤QE^º@‹ÁÅÑ6!G§TA9g`â¬43ÞˆZ±²EŸsH‘=vÆ»¢3ç@6 åSþK‘4".ÆÈ\D£IMn’°‡™V¬ ²½HûõÇL;ŸQ@$úPxޝ<ø6d‰?˰T§Z[mñpÚy ÊØ±/ÜOŒØƒ¤”u¤1°¬_ßBƒâú‘²o²­¾îEiÓ+–Ë0yàJ‹a| eh¹6¸@Ï~…ãp¢Lƒ°O¶Ž¶­ p&œç! dc¾ ƒ$цÏÑ`Èšiþ,Úb|'Ã!ÇÛNKlËí‘s=£ñĪŠJ•sÄ¡2!³©-9J)sw¸¤<:4ã—0éý3JKà`úžz"™“L-¢ˆƒšiJ¶ÁUIØÞÑš¹~øˆX–аÏÇCÑÊ¥BÐΦ´…bض ³`šwb6,¬ëxpP&_(ªeXF¾%&(£:ì!\ÁÇgê{t-¦%l2…\³Ê Ù¸|s…´NDÜ@Äýìÿ ŽZSÏt D5g‰$­NÒ²ÂN;6àW"&›JÙºŒ}·¥–­ù6´ \³Ò)‹…ª1ÈpÙÍŒìœ[yA+ƒGgfEã·i¸«fðð®q¥#›äŽK©Šfï—ŸÑømp‹×5·²7ˆâ)cø™Oî'dÒXmÓå–õð§Êr‘<è¨vgŠ×çÔßQ|´ÆÍÁž;¥m4 !cÒ³ÍÀ`ì:Œ€‡©¢ZÏĶmR*t>…;§¸ Œ¡¶)ƒ0Vsµ%ŸEW˜©ï€©Lé°„Þ“¾U#Ê)†nIe¨`pØ!é½m2-‚˜j^&qew+;Ó˜º0¦H,YC -I$çÉá;–-/ œ&ÊvR{“õ܇àr´6•-G·, î¿ÙýÌ­ð<ʽk;‘õ»ç›²Ê “ã¸&›¢¸à굌Opšø·ðÚòÓ”¶,Ü;Ž?¤d>R2‚Ç«ª–‘‡ð2PÎqÂ<ò©IßKûˆÊCÖF˜…¾>£ìFúÜh}Æ‘“KLäË; ÷–MõJx±U™‘,‚L˜ ºº7½awÙTK !Uöºµ »—À•¦©2±Ò·Þ ì½Ê ýðv4ߢ£ìl¾ûqmùô-:˜ÈSèV®x³ +uË´e‹Õ­Æc2˜(”d "‚!ƒRÙ©:¢Í_(z6ÙÙýíá'b“šÈ,Ó'ÖÇäæGj+–^‹Ù ÑM—j×%î:$óÝhfÀ«œÚk&4½ûÀëz®žlLz]9Y:§ÃOI¨ƒ)*Z‹Æ¦©dE_Uh(5t½áky¶ÆP­-Þv€£%[VÝÆ›a·ð™“l)Û ÷‘†étìÖײ˜í¦a¾awÖ@žrªi-¸ïDL=4W‘v~NÀ 4=ì9Ñ¢Ñ; ÖÒ¥.mÖ¼·LÍŒ3?Ò’REm°£À£I§þ²š• ç¼Äòã¤J+q°’Htá>‡ëÕŽªö}Ž­ ™ÜÔ=³‚æcNô牃5ì´‡ˆÂÿhVµK÷V7-!ëo˜†›¢—sbh>ñ+‡Fžª]D¾Ñ·~½ Ë–Á»aéÒ:Qœ¨ Ÿô vWœl˜.qƒ:)«À‡$Ü›ÝìÝÉ«KðîÓãÃ^ûú§w§¯šŒœh2Csh¦îÒ65’©Å¹³X‡u}l«q€¬˜‘­úñ.›uÄ–Dó'7ÈTë`Š–ZO,ÒX¹?u׌ŸÜfî3~g¹?Ù m~dùzÓ¼nð0“pT‰‘Rw'^ìÝøÙák™Ä¥™±Ô‘¬"‘¦F;£(3>‚èýÁh¾e‰ž)’beåÿXéý/9¤¸i+[ÞÈvG’¥NŸÓž4@1˜öaGŰ3ì6>M-š:¿ÒíÝ뉩nÇ™kT+[ZÎT&ô2G±?Ó³„qËe’`òO …¤¿pç+‚Pß™­Í\åÇkŒDD»egù9êH‰Ü6ʸÉÂ¥XÓ°›·Ø_,ìÙ›(|‹ÓYwå‡"– Ÿé8iHù¹ÄÞê9_‰g>ùï eu¨ÑÊæ=;IÜ’Èñ‹™Ø@qØþ{ ÊzÍpa©wvxZ-¡ìHèè2#²)šn:’qÏŒä \‘¼aé3áÒ× maæƒððQ=eËÖœ2öSÎåТu£Aî'h·±Âv8ŽÀ˜õ²I±²±{0Ö‹R‚tLòsæößQÕ±èÌ{ZÅÝx{>¬ô¸t¥$Sê8Dh÷ŒžL]å’–Á'جhÉÂÈ4FËÂ×KXáý¹¢Nnj$;cŠˆ1âœñÂL[±HÄýƒØý)V7µE²€‡þËôxHŽF_ÞÓd±¢]ñÓE0=ú ¬çµL7ûr“V÷F-³üHQò-ìp6aÿó 1³Ìÿè%lSj[ÂJ´µqнlE¬d«XtOʨËLø0Ew’²¹7ÑG59óh2Ȩ5LQv´X²h‚³LÅ‘Ý"óz"‹iký •.*ÛU´…àÍÎü3¸¤)ÁIÙ­—“ )n4Ø™¾iz¬1ô2~FYdg5Vq,A!M`Qm ™9´eZÅá&òá%ZÃ(zÛt=ms眦’µ­˜3~ÇêÍÏБhëuÌ™¨Fûèa¿57èäYc ÅmWl4RȰ{ .‰Š$*‘8ºìØŽÐ#ï1Ëc*õëMy;9'¯Ç*×á+Bƒã¹pPF¤[Ë¢‘ÃÈÆ³žuWÙ¦]6ÆÄ“ï¹kU¹¬‰vèr¨ALn2“‹šÍ5çìí£z_ÈöÖiÖs%Âäîy#ÚÂÍÇ׆©£hØÌûo?³×$~×¢²¬,a¨î2ÝÞˆ&He+Äòt1Øé1 “õÝYEÛŒw³ÙØ}2v[89´WűµNð™•áʪ£ž4žþìÿŒ®á3zÆ M¤õ¤šÈhø¶¸‚a ¯ ‡U›¤Æ&¨æ‚L·+íz¬Zšy[WºX:o§ÇmB'cáÉs£”B ’ÖSñ:É f¤]ª´&ˇ¢éR‘‚;ɤLW× Z„åáAÃÖ%ÅÃD½¾T4.Ÿá¦ Ã2UÑØò-¹o=k)–¼u‚¬Æ0ª—3¥âP Dkê„¿{ ^òiÃ8ë“Â!&¼”ªd1CQ›ÏLæ ú‹É(GßÈ®²Å”ù2Do“ÞB÷€,á ƒ ß6 _GIÜ…ösŒ0ˆ·¨Œ­l*G¢gj¹ø1(I©)?HÉ+FEôwô°‚Zæ „wvJ/n†j?DSwÖ‰BkU̧ä-C¨v~!¼»ÉFrd{0j¶h_;*{…Éc ðšÉk¥r÷$:Co´A3ãþ™‹D‚,Pvu é'5¶0ô™á¹^3›T+ ç™Ëv‹õh—Ïà¯h‹•XÓÝdƒ‰L¸L8§O¶æ>˜ïé–°Õ;Â#(¾Bue+ü×”;íbÛþjv2!"§Š*=mÄäÖR¸wPö0˜™ ¿‹8ÉUv÷”ª¦”z&¸ ½^zþì¶ÔÅíoþxúæïaô‚Ë,ÅÀÃûÖesGp*‚£¤¼Ž«”-‹ƒqKáäí½§¸»× ³7F 0~X st‰IT›6ææÂ-"³wrÎÃO>|G¤¼„!Ÿ˜wb/SÐt¬ÖŽe鮨gà˜ÃIø(4b ð®¦8Ä…)•uJun‘ÍÎfú%p3ÐÂ2ZQ„(\aâ5èDª€Å·PVh…!iýŒ`-;ñ<´»qK±iᦶÍO¥kÆ:  š¥%†› G·5L›9Pˆ8CÎÄHÉ”ŒÖR¾Ja½#9¬¹¸´õù»:~´Ô°¹xžÁÕä7BÔ±‚§€cˆÂ]U[q0é\g»°¼¢1D |©9ïIS W@Ñ´w@ŸNáÓaìÁôøBP7¤:Ç|{Œð†8ŸÁ+Ž·pž´$V Qé¾jîÀXŠW`Ƽóo,÷0–cŒÅ;À»ÆXŽ©‰á}ÊŸÒËOþø9)Cµ˜£`9î¢xoð¤nŒ¾ààGñ®!Žjx|§˜×±î +8ÊÛ  †÷‰E5WìôÚ.æWÕµŽ!(À¡#4þÐÖð™œ5f‡fƒ! ߦáy¼ Ò-Å#±ö€m7ÌïðínO9ý{øy"'í|]ú +Ü@íleŽ…:×uôµáaÏõç\ý¾›¯BS=æíL°´ž® œCëIÏ~s¾Ïè;fÉ3··/ÃIQÁ1¿•o[*àfÇA“ˆ†#+Ø 3s …ߟ\aÊëè7YL,Â>íø½*5çXÂá=ˆêÕÌïþ÷S&ŠýÒ^ß•¼ßê zbÒq|îzPêË5¿}h¿0æ´„? i oÉ`¦ô>f˜bšuàÐ+d‹-Álßξb‰¸)Ìq免mLÍÛDá’<|}ú7©´ endstream endobj 7760 0 obj 8068 endobj 7764 0 obj [480 /XYZ 31.5000000 327.500000 0] endobj 7765 0 obj [480 /XYZ 32.2500000 499.250000 0] endobj 7766 0 obj [480 /XYZ 38.2500000 465.500000 0] endobj 7767 0 obj [480 /XYZ 31.5000000 500 0] endobj 7768 0 obj [480 /XYZ 31.5000000 327.500000 0] endobj 7769 0 obj [480 /XYZ 38.2500000 465.500000 0] endobj 7770 0 obj << /Type /Annot /Subtype /Link /Rect [308.250000 508.250000 344.250000 515 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 7771 0 obj << /Type /Annot /Subtype /Link /Rect [60 291.500000 91.5000000 298.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn2 >> endobj 7772 0 obj << /Type /Annot /Subtype /Link /Rect [60 284 94.5000000 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn3 >> endobj 7773 0 obj << /Type /Annot /Subtype /Link /Rect [60 277.250000 100.500000 284 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn4 >> endobj 7774 0 obj << /Type /Annot /Subtype /Link /Rect [60 269.750000 104.250000 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn5 >> endobj 7775 0 obj << /Type /Annot /Subtype /Link /Rect [87 263 125.250000 269.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn6 >> endobj 7776 0 obj << /Type /Annot /Subtype /Link /Rect [87 255.500000 107.250000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn7 >> endobj 7777 0 obj << /Type /Annot /Subtype /Link /Rect [87 248.750000 119.250000 255.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn8 >> endobj 7778 0 obj << /Type /Annot /Subtype /Link /Rect [87 241.250000 144.750000 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn9 >> endobj 7779 0 obj << /Type /Annot /Subtype /Link /Rect [87 234.500000 126 241.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn10 >> endobj 7780 0 obj << /Type /Annot /Subtype /Link /Rect [87 227 147 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn11 >> endobj 7781 0 obj << /Type /Annot /Subtype /Link /Rect [87 220.250000 132 227 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn12 >> endobj 7782 0 obj << /Type /Annot /Subtype /Link /Rect [87 212.750000 128.250000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn13 >> endobj 7783 0 obj << /Type /Annot /Subtype /Link /Rect [60 206 126 212.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn14 >> endobj 7784 0 obj << /Type /Annot /Subtype /Link /Rect [87 198.500000 105.750000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn15 >> endobj 7785 0 obj << /Type /Annot /Subtype /Link /Rect [87 191.750000 107.250000 198.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn16 >> endobj 7786 0 obj << /Type /Annot /Subtype /Link /Rect [87 184.250000 99 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn17 >> endobj 7787 0 obj << /Type /Annot /Subtype /Link /Rect [87 177.500000 141 184.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn18 >> endobj 7788 0 obj << /Type /Annot /Subtype /Link /Rect [87 170 168.750000 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn19 >> endobj 7789 0 obj << /Type /Annot /Subtype /Link /Rect [87 163.250000 94.5000000 170 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn20 >> endobj 7790 0 obj << /Type /Annot /Subtype /Link /Rect [60 155.750000 167.250000 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn21 >> endobj 7791 0 obj << /Type /Annot /Subtype /Link /Rect [60 149 120 155.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn22 >> endobj 7792 0 obj << /Type /Annot /Subtype /Link /Rect [60 141.500000 93.7500000 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn23 >> endobj 7793 0 obj << /Type /Annot /Subtype /Link /Rect [87 134.750000 150.750000 141.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn24 >> endobj 7794 0 obj << /Type /Annot /Subtype /Link /Rect [87 127.250000 134.250000 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn25 >> endobj 7795 0 obj << /Type /Annot /Subtype /Link /Rect [87 120.500000 114.750000 127.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn26 >> endobj 7796 0 obj << /Type /Annot /Subtype /Link /Rect [87 113 150.750000 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn27 >> endobj 7797 0 obj << /Type /Annot /Subtype /Link /Rect [87 106.250000 107.250000 113 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn28 >> endobj 7798 0 obj << /Type /Annot /Subtype /Link /Rect [87 98.7500000 130.500000 105.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn29 >> endobj 7799 0 obj << /Type /Annot /Subtype /Link /Rect [60 92 90.7500000 98.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn30 >> endobj 7800 0 obj << /Type /Annot /Subtype /Link /Rect [60 84.5000000 132.750000 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn31 >> endobj 7801 0 obj << /Type /Annot /Subtype /Link /Rect [87 77.7500000 131.250000 84.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn32 >> endobj 7802 0 obj << /Type /Annot /Subtype /Link /Rect [87 70.2500000 117 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_starting_out >> endobj 7803 0 obj << /Type /Annot /Subtype /Link /Rect [87 63.5000000 146.250000 70.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn34 >> endobj 7804 0 obj << /Type /Annot /Subtype /Link /Rect [439.500000 473 468 479.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://caml.inria.fr/pub/docs/manual-ocaml/ocamldoc.html) >> >> endobj 7763 0 obj << /Type /Page /Parent 2 0 R /Contents 7805 0 R /Resources 7807 0 R /Annots 7808 0 R /MediaBox [0 0 595 842] >> endobj 7807 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 7808 0 obj [ 7770 0 R 7771 0 R 7772 0 R 7773 0 R 7774 0 R 7775 0 R 7776 0 R 7777 0 R 7778 0 R 7779 0 R 7780 0 R 7781 0 R 7782 0 R 7783 0 R 7784 0 R 7785 0 R 7786 0 R 7787 0 R 7788 0 R 7789 0 R 7790 0 R 7791 0 R 7792 0 R 7793 0 R 7794 0 R 7795 0 R 7796 0 R 7797 0 R 7798 0 R 7799 0 R 7800 0 R 7801 0 R 7802 0 R 7803 0 R 7804 0 R ] endobj 7805 0 obj << /Length 7806 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯Èó“#¾IÀ00ý2àƒF7àƒáƒÑëõ`áY¸½ÿ}ëA*ÅÇÇ”"))««»0S%ŠbÁˆ`0"üõŸ¾üÇå¿þ~ùõý—ÿ¹|ó¿ßyé®FuÓ¿Ëðó˲€Û«ÿûb¬º|ûãåûåûËç—Ïýÿ¿¿L|yÿ/ý_ÿwá—îÿûëåßþ½/ü³¯4TøãÅ0Óÿþïñ·3¬ÿ«›å¿¿üëŸ.Z à|gâç_¤Öí†nÜýý% “?ÿö·—_'lƒâgº»0)ä…9É/ÿûŸ/é„滫“Œ-M÷ ÃGHN]w=T•ÁÚ´Îvhœ[·_ãcÏ[#… ͪ·œY!™GÊIèqÝšß¡qéø~=oŽ•0·¸õ–“«ú‡AÜîÁ·só{àßj¹_ãcÏ›c%L.nýjµÿÿ&¶`§zœIf/»’•è‚HU¦ýÜÜZßaâ“û-5SÏ[#Ån¼åÌ2gw\ Íïи{ÒÍÐó½VƒJëý—ÌéÎX ÿ~@`¡,AÎgkwÈî4ÈÐ#QÍ$WÈŸ·´AíæÔì°âË¿ÈK¾zˆFäJázùSrYhûôu7ôq>Ö]“Ã6vî¨6­_^ÉœIiÙ^s–¶ýDsÖw_–å¯hÎvá³1<Ç„¹‰«X?_.tòuL]o€Çüš7ÍšÚâ0boŸ,‚µÙ~÷õå×O½²¢/_ÿÒ/ß#§__ÿxé%ý/ƒ‘ȨË×?_þ¡Çïoÿxùú×y•b2“õ¦7f|c¯Öuš«å›÷è®Ç7Œ‡W·o>LoØUImûwóÆƦoĵߨ3¾üÆŽoDhìöF~ß|üÚÓÕc(ìµ½`±ÇÞ€EÎmèÏ„Ew°7“èM÷ ~£á7œçãöo8{{ða{ß0v*oÞÁñ¸íã¾Á³q€{`[ζ€ßp8ž·óF`¼ÁùñoŽ‘(Ò„†ýá˜k1a‰q…©Ó2æÀ •c‰‚gK$ î5”(ާƒœŽqÇ#¡DáÝv\SäF¥×xæ°¼Å}ƒ#íamƒ+K…âñjD˜mǃçÔkVÇH­c¥Ô;Êe¯^ÞU.¹…j'T.±¢Xù*ŠBoDáLÂE}tUßà7b"x»fb{ó†zõ»0Ä…g½`­FÞUƒG Hb ØZ)x_G âÊî ³Æ¡¨|ƒIÆÁ‘pi‡"²*p0ðH1%Rè€À¸|ê[ÁZ@™ÓŒÙ¥¸Ãj;.’йd•Ì×,ñÒ„yJ$ÍSÈ•²*Wy½Ø¯Æ¸Èš'¬~[ÒJÀÖØ‡íb_¯Z­ôŽ"ãÍ+“kˆªbŃZM…t œ#-ÂÈÀ¼+Þ¶ƒ¯ìÓß8'NÜíOÅ≭ŠÐ¢€gkÌ‚EÉøX¬X9ñèØ 7` ,¶ØàoåÊ‚}dg2Û1Z±ŒRìsò½ìŠ%É ÌÃØúˆ­NxÁs)©©ý³Ã|F‘}ÐÂ÷œN±$bË(~ƒç{•`Úòó‘ž©á@ñáÀžj×ê ªâ2&ŠFÔÊþ޲£Ø³Í(Ôô)&UʬbUÁH!l”+6𦶓JðH×›l+%lEÎ ÎMM•¹½GÖûJn\ÂÏon»¸£°^@ß°{×®·)0Y5d±=W“~/#¨"i°-†b¥ÁhÀ= xSèœßÈ”IñrT¬Ûû:aæH~‚¿ b£År>U[ºS½kšÝwõÐ’%ìû6ŒTHœ™Î¦ÚñΪEÇò[wՆż=!•©kçDÜ%ƒ;¡»O»Þ§NbåŽîÞ‘X¬éÚ—*¡”  8ž„âæ ‘kÛ†¼UA1e¥£ì"3oªšàYß÷CqB’v†0:_`Ù„¿ ‹„H¥~óãk-ômõÐJ ¦¡£bPžXG®Äîf!ÔG³á†X€-’£ÿ,­Ÿ´ÀV³' ©©ÌÓúhÏ&Ë¥÷O ‡ñGˆò©l(Kü¾a`[šÇ³ž6RÑrÚîÚ~ ÑÊÍža“Š' ßaÛŠl§èí„8抖tÁ{ÃÂÐvçú̇߬ht'?qPïÓÆ‘ᦚ…ÐÆ7ç?Ü~H¡!õ°$;|Ž0:- üÄX$|Œ¨Ã ß„gæÍ#XN#…tâT ¸5Â!gäW 3Ä ãƒø•7”#à¸o„@ìJ`9!@´’,ãš°êàÙV„@ÔgÑÖÖÝíÏÏíîÇ ÑÆ²{@‘į7@zˆvxx <¦§ÜœU«û¼NЧ(Aý¤D5X>À78ñÔŒôÀõdH³÷À^'ŽÂ˜Çò cžpDÌkZ‡`Ñv˜l|<°i´×i¨èùGáï'()J‚¶£¨—DñXþÃ78o&)\£ýB½¹NÚ#Rwbž#p#;0™åXIˆgøÞ›c0"ç<0xeh¶ï¸Vd]È'`Š‘¶‘‡¤ÈMB¤Ž¬¸þÙµü$n &ù«)ÎÀ¶sŠÓöž‡yçóxB'dþv¼fi·»t’'xÿá36VŽgã#Müy¿ö\ò¬H×€¸íFõQá5÷àŒì¾äçøfº©d• `ÎÊT+8ÿSÛyëàUpÍÓŒ°|FÄŽx5Ãu.—áP_D7«dÂ{©o‘*²ëYÄŒÀÖ:SµT%©J3¯Ž½ §1s±é ³“Á¥Ã&ãËt)c6óˆ*¼ñrU_ý†u1ØšgçÂ7ž™É3¯xv–×,ùæ{çüfB;g9Øk¯YZóÁªæêlú ‡­áoÄÄîƵ{*}ƒq@ž…ÙŸïÚqŽ2Ê87KÞƒŒ2•Í å„Î}KX±šäo“Ö>Ó- ÇÆ){ŽÆ‡¶›f\j[½å€ ç»O…ßyKþsÿúÊ®H éiFt²îTfc7£ul§d¹#ؘŸ:;`&­7¡…È [J¸&n1%í>4‡Oöb‘×4ý ~³åð4AE¢(v¤›WžyAh¡@Êàæó¢U\/+óž`”NRªŽìDT°K§_·±ÿòé²åóU©}$¦>9sÒ)fcÖ¹t¢Ï?yü€ô¹oÏG<˜yƒ.c†/KΰèŽ}HôÕ†K抑ãÔ‹žVHo'ê®™uË¡7žÙÕ•gö(ØZå›ßà7}ãCN™ºN¼¾øæÝL°‰£ƒ}DoDž~£Q:k•ë²µjƒsÏE4MÜ8±'ç̤º?«VQêY§]ºçǺ;Ö÷ñIxž¤’ùç^öºÙ1¡Wo*úQÛÕ¼EŒÊ†ÛÕ~^6ÞH¡90û£`ó™ÙWÀÁÛ2á3i„‹—)ÙÐ*™Àšžòæ°~#)gà Ø¡äƒ µFÈ:EÉ F9ÓIÊ †Ït¸¤‚·'æm…9˜@!oG`®§äò{¿¿s‹OUÁ>@R×)!Ùv–˜ íM[îàmjcjkåj'D˜[É¡"¾!bº­ ºéizRô3a'NÚ$¬7®S.Þ™o÷¾ƒ¥éM¤ãÝG%95<>[o ™£\1Irwü9[—ߺmNw<¡ W°±ß‘£´7U.8êÍYæv¾Ht‹jr¾›‚ n¹ç•pÑÒÓN÷LS0Å3/Ùð§I6Á‘7Ér1'íÃr“’ŠËgJjV‚±IâUާ¥öbg“q“á´—øÂ ‡‰©BÍ£kjÔ%]#{ °¹Šrž-œ ÷€r¾`ˆ¨ãtÙÄéiÙ+ppßð< „Ù¦¤h¯hqßpÚ|ÂE0”‹¼0œ×É%mûG­‡‡%n&\áƒ{P™Sø8RÒî.%‘–Rœ4„ý-I>µMiŽ×PŠ„¤¤A'\o!½¦\¿P¡*,Q(Nh<§øRÌÏG/eÝ¥$‰¿— ~ۜ֜Êx(«+…â±æŒ¥*ÄŽ¤¬‡„µâ¢Ç\âw)Ǭö~"eul|Âq— ç]Œ<õ·Ä ?úja]?¦¥ÔkÊõŒ„ovÀÐ^†»Ž Б/ÆfŠ™«qñ‰'þzÓA§“¸eúL2I ŽZc·30àÜ|áÎÜå©&>Â7Ø [ãð Æ·qpàyYtWÞ‰8²äÞ1.ë=¨`ôÝöñ„Ü:øñÆ·¿Á}ó™†sMJMFŠÇƒçó#Ìv´`^ P"œ §Òæ¹…lZ“ÿ¤”,{H¤"zˆ>µJxvWk»‹é†_†1;–vé_L² %ß^ús½ªÅæZfÙJxš`ôõý³>»$_kÂèK¾½$=éËBO§Vâq|{ùýåÝŸÏÍcå$ÊM¸'²r0r¤“âA¤d;$…éýÄ?=:GlªöGÛeÁÚ¬?˜ê­‰©ÞÚÕ».¥H×åTïf:÷­„'S½Õ%ª·*…Ñ—dTß—…žê%ÕÏ0N¥zîõäb^Ò#´”JÂÁ¦¹·Ä*PR«Úmüàdàc–óƒêtĪ3~PKhu(Iùa¬e–­„'ñƒêTT'32㇡,ôT-øáãL~Pl>?uTÖ£ïp¬!„¦Âߘ1Ö¯)¤g_ËCЉÀC½ÔZ<ÎC\Å<Äu‰‡¸Mé»/Éxh¨e–­„'óP¯xˆ‹ †Èy¨/ =•KšaœÊCsÀË-]ZJsùåKëc²*¤vúYroÎj”X£SµmùQ‚{ç_ ¬Se&§ä¼~…57“ÜSæTjúæé7”|ë?ê<•ϵ„‹š Òð\ FúNà>‚‰;3Ô’q32ó{":Iª¦Ø9¥VÈfJ¸86‚ö"nE[‘Þˆ/º"å¨Òãäªq”+»,XMëZ$´®e‰ÖûílB„ã¦7!Õ¡–§åÐLx ­k^¢uÍ20,§õ±–Œ›‘1˜Siýæø‡´N¹_ì ëWcOa¬[¬¦0Ë ³¢DaýÖ1™úqƒ™ÈPËSPh&<ò„Â,+QØ8Óå6Ö’q32s*…ÍNý)Œ—û)›ëÇw¥’­ ”,Ų`-%ëŽÅ”¬;^ dÝoúbÓãÖ0&ıÖD©s3á‘Å”¬»®DÉÎ¥”ì\NÉn&Ý[32s&%ën>êõgRN©¦WN‘´pÊ™P,¶ Ç6(/?׆ó#ÍXUwÁÚ/OÙm¬Ê»„U9+±j¿·LXuÜ&¬:Ôò¬š ]ªÌXU÷;Ù ³«NµdÜŒŒÁœÊªs\Î@˜¼ÂÔY9šI¸ï†²QŽ’rán¥~¬þ\³eÁjê.¡~Ù•¨?ÛYj¿³Œˆw¨å©;4ã=˜õ [¢~‘’ŒúÇZ2nFÆ`N¥þùÖ£Œ¥>vŽÉ+Oî‘y¥×PþØgW׳·Ôóâ¬foeöV®ÄÞÙfZûÍtÄC-Ͼ¡™ðhöV¦ÄÞ*5 %{µdÜŒŒÁœÊÞzöˆÃiÚZ5+Z NÉûÌ73îéh¬£ƒï‚OžÅP°šuŒIXÇØëdVí­å/x%4MÂ:F—XǤ6¡$c±–Œ›‘1˜SYÇ·úù™©)ycHWqihvN¦6»•³h–»µ‹ÝèÚ•ÜèÚ¥ntír7úXË,[ O±]»’]»Ô>”¤.À¡,ôtéF¿Á8ÓhºàF'¹6°¢7ö”èŽ}“q„À-÷¸‘R,QÒâ¬DMbÏv¹Æ}­Ôtbݲ`íZi˜Š×JÃta­4™qÃxãÆr©kMkáÜLxTñZi˜,¬•†¥¦š¡$]+§Z2nFÆ`Î\+ g»ë.Wš®^© ¿yÜ£‚Õ¤&»%»É, Fä÷±–'%yܘ©‰’Ç݈Ô.2”d¤&fû­ƒ9•Ôäl.xGÍ©…˜dÛØJGröfO¾ÆP°šŽTâÍ6ªäÍ6ٖըܛ=Öòt¢"ovs£#Uòf•nÀ‡’ŒŽÔì;5#c0§Ò‘ Þl¯À>™zõÔ¢g¿uË‚ÕÔbÏ´1%Ï´ÉviÆäžé±–§y¦˜µ˜’gÚ˜tÏ9”dÔbfÏô­ƒ9•ZLrWÞ6; 妳ƒîG©D=¿…¥…p6Á© ynsŸ—¸Ï+¹ÏKÝçÆåîó±–g'¹Ï˜»¹’ûÜØÔ}>”dìfoüå"÷ù Ì©ìææ”tØŽBqQE¸M3'V˜w×}ù˜•qU>˃ `¯G§ts(A¿B/ ÖŠ-Ë’PËJ¡6ÛŸZ–‡Œµ&±47“PÛ•B l—’TlMµdÜŒŒÁœ)¶,ÓwÅ–€oøÆFËf£ÿä5R-k¢]Ájûblä´ã~26…ŽµÌ²ÿăû;<Û‚!Õr“Âà&3¤e¡çvaH½Á8ÓjÅìb‡Wªn¹Çp¤è™W·£D;)—0V3ñ,ÜË­°)üæ©gŽ]·o.Éȸgîd´¶bŽ0ݲàqQ-ãV–X•&°*O 0Ö2ËVÂSœ@ÀÊR+ÓCI&ªeH Z‰Çq²¨Vs¸öì’yóO«…x[=ÿo’{ñÏe‚šƒ>¤Z<.tœ^ÁêRzkÒô ÖäéÆZfÙJxŠÓ+X]J¯`uš^a(Éd‚éB+ñ8N– &ÄàÉ<>˜bU[ R~Ć]÷½ûÕlnùÔ²`õÔêd jMi š™´¬7iE;È¡–ßb†f£N¶ V•¶ 65Ð %Ùt¬%ãfd æÔ-¨ QOí‰%Ü \ÑųÐJDã鯼¶·!µI­RÖGåírQ°V$¸. Îè{T .3¹.ÎkM,?7“à ו‚3\—¿†’T$LµdÜŒŒÁœ)›//9m[Ï¡w=;«Ö¸} Žˆ vl>±|Y°š•x|âx)øÄñ4øÄñ<ød¬åY…GÁ'Ì•x)øÄñ4ød(ÉX‰ÏÁ'·fd æTVÝé¬Dß™ì­àÄÛ"ºeÁj2•Il‹“¥Ø'ÓØ'óØ–±–'CŶ072•¥Ø'ÓØ–¡$#S9Ƕܚ‘1˜SÉTºcÈ”r@„¢æe#¦($oEϦ„oЙ7÷rª›U=³,XÍø: Srº¦ät¦ät¦4ÖòŒ­£0¥æÆøº¦ät¦4”dŒ¯ç0¥[32s*ã름]÷™C©â{Ân ¬F5ÛL8='¶Øß™ãl™ãl)2ÇegóÈœ±–§ Eæ07 ³¥ÈgR3ÆP’Q˜¹‘”"sn`N¥0"s¼»ºpމbV¥xÍ(—ªãÕ§gƒ}Ò(7gƒ›ˆO¶ÕPð¨±Yö}Y›ûg–›ûÒ$'âX’›§ZfÙJx Ñ“±Ù9W06;—ævJRcóPæQà[‰Çqª±¹ïEˆ i›©qž•¦¡wÛü&=Šæ°—@mÂ^dÇ\LʼöÒ—ò””yö2Õ2ËVü‹Â^úçBØK_jR, {ËBÏí’”Ù„½ôãa/_jS=ø "V¡”¤½ 6pcg'”‘6MŸJ‰™Ù–“¸'T=¯vY°RÏ”ˆWô…IJKm cI¢gNµF=òÖLxŒWô…Ä}©NÁˆ,q…¯%ãfd æD=³GCˆÄxƒ ˆ ‡BvM@<)‘ýœÜÒTÈeÁjFQ&aeKŒ’îÅÇ’ŒQô3B3áÑ$Œ¢ i*úR•‚QYš _KÆÍÈÌ©Œ¢W¤© ˜ŽðÒ|ú\aƒ{l½žØõœ¦B˜eÁjb7:!vSˆnèK]J…&‹n˜jyb6&"v£b7…膾Tf`²è_KÆÍÈÌ©Änç膃ŽáŒµS‘K”#‚ÏiîèédŽC`jY00ïç—Ï—ï=-Þ˜¸@ªŸïU¸{ë »Ø)‹žÈúÝ@?¾ —±ä.ÉÚIù14NÊYôo&¯Î߈þï º½ñ—º•ó‚#î™ßJ}ûäGš'QÖ°µ‰üd*䱿¤ózŽÀÉi±«µ0 †[ƒßxŽ`›†¾ Üðwßã0ÑwüÃvÀ­ý$¶$° Å2|3•¯Âe> endobj 7821 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 166.500000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn36 >> endobj 7822 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 174.750000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn37 >> endobj 7823 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 156.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn38 >> endobj 7824 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 134.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_configuration_files >> endobj 7825 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 130.500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn40 >> endobj 7826 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 141 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn41 >> endobj 7827 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 126.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn42 >> endobj 7828 0 obj << /Type /Annot /Subtype /Link /Rect [87 721.250000 200.250000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_test_suite >> endobj 7829 0 obj << /Type /Annot /Subtype /Link /Rect [114 714.500000 171.750000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_running_test_suite >> endobj 7830 0 obj << /Type /Annot /Subtype /Link /Rect [87 707 127.500000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn43 >> endobj 7831 0 obj << /Type /Annot /Subtype /Link /Rect [87 700.250000 148.500000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_coding_style_guidelines >> endobj 7832 0 obj << /Type /Annot /Subtype /Link /Rect [87 692.750000 147.750000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_language_status >> endobj 7833 0 obj << /Type /Annot /Subtype /Link /Rect [114 686 159 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_supported_status >> endobj 7834 0 obj << /Type /Annot /Subtype /Link /Rect [114 678.500000 166.500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_experimental_status >> endobj 7835 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 280.500000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_prerequisites >> endobj 7836 0 obj << /Type /Annot /Subtype /Link /Rect [60 664.250000 111 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_debugging_options >> endobj 7837 0 obj << /Type /Annot /Subtype /Link /Rect [60 657.500000 129 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn46 >> endobj 7838 0 obj << /Type /Annot /Subtype /Link /Rect [60 650 147.750000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_further_info >> endobj 7809 0 obj << /Type /Page /Parent 2 0 R /Contents 7839 0 R /Resources 7841 0 R /Annots 7842 0 R /MediaBox [0 0 595 842] >> endobj 7841 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1701 1701 0 R /F1410 1410 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 7842 0 obj [ 7820 0 R 7821 0 R 7822 0 R 7823 0 R 7824 0 R 7825 0 R 7826 0 R 7827 0 R 7828 0 R 7829 0 R 7830 0 R 7831 0 R 7832 0 R 7833 0 R 7834 0 R 7835 0 R 7836 0 R 7837 0 R 7838 0 R ] endobj 7839 0 obj << /Length 7840 0 R /Filter /FlateDecode >> stream xœí]K¯ì6rÞŸ_ÑëæX|H¢€ À}È"€aYYžLƒx›YäïGÏ>"©b‹_Iu·ÆHì#©IŠb½¿ªúéŸ~ùËýýòÓ—_þçòÛüï/¿¼Uïm]Mÿ» ÿüq}Aš÷ù¿/­©/¿ýþöãòãíç·ŸûÿÿãmúÁ/_þ¥ÿ¯ÿ»ÈË?÷ÿ÷×Ë¿ý{ñOóCÿ¿µ¢íÿýßã¿»VôÿU]ÿ=\ÿËÛ¿þáò·aÄeºy1ößÔM[ÕbXÆ©¼-¯)ÆþþÛßÞ~š6 n–NiQÉ‹ÐJ_D§ååÿóíÏûa‹•ëÅÊ‹¾ø žlú+­º~‚ëRYZê±ï؆êcä¼ ¢§ÐѹN¨‡òKæ=ÔÚˆT{èŽ`û)äe=¡,°‡IÎáÖÇáÝÀn:u¢ß¿n™,ïæ´ö@gPËúcç¿À|7Íü?ò¿ï9Jµjzæ.ÌÆ6'ž¹1ªÐÌ]W—™¹VB3wZˆ¶ÑmuÀnå0M«û”]Ï kVâqF 7=Í'|\9÷¦Õˆààœ_ÖtrÚÝ黿 Ÿ`÷eRž›aå컲|[otP^_Wz”GBˆá磸˜/ÈwcúÍÒã¿[!¦«z` óLË•ßúUïBtÒ˜ëSª³†Yþœ¦é±\xq¨:wšþÊ0µ˜ñ)m£íiþÒ ¼õ§°Ïÿt…°b~~øù×·Ÿ¾÷Ó5—_ÿÜß7|úׯýÖÍåã*Ú˯ºüCÿ _ÿñòë_߆Uõr§7;ÍxǼ›®jd]­î´ÔiÆ;ú]«ÉRüøM=ÞQË4w9¨È|ïÔïJaÿF’¿ÑñkCö úBÍX9šÐÀ<*~ß*rmÐhô¾Í£í˜¸2î£ÞúÃÑ:-íÛ¯=§ú ²-öÓÓÊH*ff?ÊXl…5À¿Tåð/%¶ø—R.cé¯xükxjæOË0ËŸ•ÿd·Å¿¤q§é¯xük|JÛÃh{š¢ü«×ÍçÏÙMü«zoZaó/šBiN@žh%ܳ‡MÀI¼¹¶ÀoèµÑ£yÄLóršÑ €Þbz± üæ(rf?»Rí®³¾°›]éÎaWuµÅ®jéò‘þŠÇ®†§fv´ 3ÿ9OóÁ®´ÙbWºu§é¯xìj|JÛÃh{š¢ìª®—c3}N¡–uéÐ ’0äQÈ­úDÝQä9½O¯dÏ·¤ É/¤Ò <Íï’`9ïã*Fòûn- :)ˆ‰edu³0²®Z_ØÍÈã0²¦Ûbd­p9LÅcdÃS3£Z†Yþ4#kÚ-FÖ4î4ý‘Oi{mOS”‘µz96u¼’C“úJ’p<ÅgŽÓj=LZ½jšÕ™HfÑÖ ³Ðj}a7³0­Ã,ŒÙbƒÎ¦â®ò™E÷Á–a–?[‡Y˜f‹Y˜Úf±»Ìb|JÛÃh{š¢Ì¢S§“‰CùÓmÝAt€XíôLaÒ¨õ…½$*«Æ&QYµ$*=­œ´k ŸšHð:Ìògc“¨¬ê ••ën®¸$:=¥ía´=MI•B.XQ$ Ä5ABAšFˆÉâªÄ[ Ñß¡¦ã(Fö[1SL«ÖvSŒ¬Š‘ÍÅx.A9»­?<5SÄ2ÌògíPŒÔ[#]çpÅ£˜ñ)m£íiŠRŒËç¤ç‘<ý¼n`4Zt!ñZ<Ô¬xÅ*‡_ö¨’Q*¹(¯•X_ØMçZ;t®ë-:÷|irö¥Yd:<5Óñ2Ìò§vè\«-:×®gp¸âÑùø”¶‡Ñö4Eé¼¾ž°šT^½x¯W‡¶Z?¹Â~””ª±—ãÐ×KT_6r}a÷¡o”sè½uè=¿‹œý.Ö™žšõ2Ìò§r}#·}ãz‘†+Þ¡ŸÒö0Úž¦è¡oºåÐOâ¨{o›z·ÛÀ# @O4 Ñì{¿' èîçmÎÒTè׬ÁÇ\î}zm²ƒýqû9[»ÄûU§ÖÎÆO¿ÃD6ý>ýÒþÚ»+๵úÛÃÙûßßtmÜAá‚HÎ̼õe5~Îαklüâ½øIbÀÓwpÌMy"ŽCD¼¥ Gi5«N…øY¦ùP­º-Äê<ÇEç#~¦§´=Œ¶§)©ZéjAüHE$’%ˆüF‰ k!";Åç‡ ™ ÄS˜‘âVq€)Ñ<°I‘]-¡fÕZFtZ—\_Ǧˆå#çHñfVæŠ~Ð ¶Y_«ß«NÙ»Cæ|USl;.ç aHH@/¤±k¹TÆ}í0¤ßßš±è‡Å¡@3bH,Êò÷„ýl«Yé™Ênõÿjº¥ÊÇrå··ÆÌ ”¸>Õ®GYþZËßðÓýµòæ\çîJÔeYé4ŠýƒöõùÙÕ/£'v.¯èQ:žC’1r.Œž5ÑèÑ€˜+Áb¯±c¦¢irÁpÊɼ\¸Ÿ•¶ PÕ[¨Z—8F¿¯CBÃSíz”å/m R[¨¤7‡ô °¿¶¬T­ Pé# ¾-«r…DréçbÎE€^‘DlO^‹‚7›3’èX¬Y_¸ŸÔÊæ#µÞâ#½ÅãÐxÝø|dxª]²ü¥l>RË->R oáó‘þÚ²R¹æ#µ:©¤¦#T@ ³Þ ÎÅä…1­cI`üC„ÿÑÀ63k®Ù™Ô›8LæMz®|z6©7ý¢b¤çZ.@+ñýºÚ¶{å'êμÍûÌVŸ€þMGýf†mm6q”Þ°ñxÍtÚ÷Î8óˆ/3òyÀgr´oÔˆ³qç õ¦µ‘oX[e6üHP,¾WÇ#Ñ^scI`Ê΋ý•&èùò4ñSãz“¡÷‚׳ÃâøÏåMÓÍü‚Õ=‡‹·ärbhooÄ‘ª´6‚hä^ËÖù`G®-ñÐ <\…R3•6ubTüb®Vžœ#¹cL–5vƒ„å~ ˜9zulO°bÆÀâúÄÛÉá!mã9’M8ŸøxiïK€§Dø6IzÒ  4à«#u4¯Nó;Ú'”ÑD4.DQ k ÞzŸ„’UTªvD+½U>Sv&¼ˆÜ)5Hc”C:6¢ËÓ_­´Ø'ïD¨12‰–/ô½AX>"Š /‘“¤›Î™Õ‰;6êIÖq¢q—ðZ¸¯êRLHR¶ûécÿ.#Æ\?‡F²²AšwÀÑC´xft`ZJ…[¦5¤Ö"8€É^=&Ñ/R'Pyj-o…'$[‚ÛÏ/2šZ3¨T0\IG(ò¤œ#U!rå¤oÙY¢ž±”yŠè*†p+ ý2[Ï[:ð8Ô¿aq×ñÙ@xÌk‡°"D‡@ÌV¿é|,`ßþºñ<öb &P¾uMëÈ·Cgœ§3Šo`â›f¼˜ø¯äoHLüïë?èõ k'W‹üFÍwb°ð4®}qâm¬þ ‰Ÿ¼i—šŠfÏI+®%ÇLfÌ.‚3G ¼¥"Ø5«ÏÜ䄈Ÿ ©÷“Ökt³˜Öd­°@’&Ó±†|…í:ŠƒÇPºAúé>šJ¦uëHÄóýÕ®•xGÀJD+ÐLWûØe0Ó{JoõRË|ù{jXÝ4ëüêvÈ®×YØí˜…Ýèu®öø”²FQë9úçç¿§nÕίuãΡÇlr{%ÃSÆÅØsŒ™ÞiNž™Õ˜zÑuî;$c†õˆ@j ‹ïYl.Ÿ3¯¥Ÿ«ð]Ñð,j9ÒÊWñú…å[¼œy9ùòrÖ~‹ûä[ÓÚò­1[ò­­\ÙÓV¾|k¯mE­ç¸Ê·¦Ù’oMíÎÑÔ¾|ž2Ö(Æž#ƒ|kÕM&‚´@|Ï{qDøÔÄã“É5_ÝâKÚsy¿Õ ‚VÛµòc,P¨ˆÏ™Ææs¦Ýâs¦syé|>7<¥¬QÔzŽ+Ÿ3õŸ3Ú›Cû|nxÊX£{Ž |®»&3Ÿzü©Ç'ã?HK``¯£w?¦*Âunc¾m ØèºL!0àþÊÈYBÞÌ­+œƒPàõ.ÁnªÚì¦j6»©Œ#t‡+®`ŸRÖ(j=Ç"ØM¥7»©”7‡òûø”±F1öé»â6IgbQ€ 0ˆE g„¿g,a‰‘0°nJ6U)“§5i[?™sêA»Q0oÏáÀÄÈ’Æ\ÑÀÌ”°ëÚ•tÙØo*X®zV&¨k’ÕåJB3úŠ·§U–TÇlÓÆuOI>Þ4+ÞDˆ9‡»•'÷˜us"ªo2·!ÍålߟLp\ѱP}£<èqëEØ))ÅO×:òç„-Æ,°ÅRW(s )º„ Döc£s5 橎€xŠ»QžDÌð–X¨ÁpLöOÀ9ÃJ ÌEXòØ"î­MZTº–¤b? Ù%)± ¹—ö+1´[àÐe2x]='}a¼Dıf-–x[^£ έ¦¾É‰˜kGDð›Ç„òéµ97á§)åq×9g*©LîĪ«ˆõ¸VÍRXb?"”Q‡ p8ª¿e+†u<ÿ ss‡b^„MÒP°'©^ ÍÇLÊm+ãªn5 ºõAÓ©#5MÍÔ„Þ.Þªˆå‘ÌJÅk=9¢!âCFÜ}·Rî¶x«—O>JÏ+ŠhšÐ_¨;ô·¥çA\:ÏÖø0[`º”Jì¥K3Ü:è)V©\«5 ¶hÄ I]r’XEFÞ¡«Ô#*à\°kKJ òÎ×ø;â[êϸ¸ÁÌRgâÔn1ìó³é þ‘@kµ\(I@a.ïÕáu®ðzß ŠD¬YS‰ÝHÙà³ÝGí¨öp8kÓÝEÂÌ /ÏIMÓ ‚qÈ„€gÆ™ìæzÒÅqé¼ø9¨9"2K“OÖÎÐP%ÏÀ’5E ’§Û9‚Ž×!W¬mL+Þžž÷ÇUz†Ó)ÚJPÑ÷€ÎÜyë%:òŽwØ>ߨ£¤1å¾ÒËà1i š¤9 \ˆÅ›Ãî:n¸”]æ®B+é…”DÂVZ™©Ý[.×D œrD'u…ëž´#·Ü…2/Ó¶zf^,bz—·°ÚdH ˆ¸4‡ŠÈMHiˆÄyb3%–׸CÏÎà…Tæöþýiß?"‹8¤ÐgFâ Hû/^ÁCZH‘$q‹9¿’%÷I)^!'°jÄǘ — í– mÁA@JâÚÆÅ:¾uæš§ÈÛñ-ÐñmÚäîjó&oudæ‘i‰–Âmoý¦"WÓÁŽ>â[}Ýè^pt7º/ )]ï’kEuÿÍcMðOŸµTæBRp¡†Ë™ž>™úÀ!Yæψ¯aCWI"HrTÙ4â°õoâ>R–jìµ([¬=¨ÅË[†æ´7Iø[œ»É{d­i*²ºï“àP†u„ðÊäcâѯö¯>¡É”ãZÞ°HMhùc¶¢Òµß¢FügˆhÀ¨¼ÉEPe>¤p5«i÷´À¯,zæË"Ánù|ê»ì—§ìpuj®«¶[7‚©+Sù`ú«ÒnÒ2^qÁLO)kµžcnÓÿmüF0ýÕÖ£¿â4‚™ž2Ö(Æžƒ¡Œ 6‚éßîZ@Sj²$ƒR’ªõ÷âKèw)ö_zž9A2¥Ô®;w§X§m ÆæcIžbÍÉ€¬GÀæ…P ˆ3$¯N*2‡d_Ɔ¥“Ì™SaÜ×€êÚ"h¨L‰Ñ””§Úy®bà¼Ù™£qSô†?p@ã)0L¹ÌÜ,½´Š7Ó‹µo¹rË»?Y\÷?r„c”WŸæýêÝ—š·Š'T»W³§C–HZ`@fËK€Ÿý3¢Ò7OÜŽH½É¨Ì ð”ΞF;Ûž+©ùøUy/ÉckÅ{ IšJÛ»Ç=ÈZã4pb\­6q62¢A¿\MIX+é@ïÃR#ö5¡éIy$佃 Ã¿ß ¬þÀ[S‹¹¾?K=!Ä$FJh°VË„V0Ý4<>®!®HÆÛJ,Ò!`:x°’T\)Kì9ÅsÊ.¼Â8•9 +ÑV+{í˜þL%ç+ É.¢²ÇDøÜZm'¸µõV‚›W?WLõsíµá)e¢Ös\ÜZµ•àÖºu€‡+^‚Ûð”±F1öÜŒ#@·µd5ÚQ@S0™DF§Ø) ¹‹-’F¿Ï1SÅ*é~_Ä4(^ªŒ9røŠïRqóòvÅ¥RÕSxB鈛‰ÖHöC{cús0º#)'eR™påI±VPï§ÇÌå| U³b¡7EüMÇcy§Y¼•¾¤É×8hx¡{žF(Ϻq¸ú>ëzãj¬ÓÐPw¤¦î̯5Ú¬klÝIEí„r¹ÿHëj¸4­"³ˆìG¤ŽÞ~Ѐ®I½ˆµüCâ^Pì˜CËb®xD‹VÒŒ¤­Æœ²â˜ Åš°Çë.Ëu˜èºôRQw6o¹¶â»A.h#‰2êÔblöÃÉê6)=f ¶òúøcUÉx’fTÒGbHÓ›nx5é;åëjÒûH½‹ÐUŽç7 À\P`{óÂè'%ºIú£R]ûÉÐêK©úº+ ¨c›ƒÉ*d#y‰µ2 嘶<`yÌtL··3­.*­®xôIê^1W»@Ž1šJ† ™r…#/Fp¨ï{ú´SdIÁ ök© ¤=”ÞR‚,} S×–`é}‰8üY‰äÙKô—wq=t—Ÿ¤5UãˆØçj Ä£Jœûqîè,qt¸Ùy2#$âüAò•ö;È!I Ì™ki²†¿xê¤âÜ ƒ·®Ö7³òp\@Ìž>ï ¦tJ1Ü)÷\íG‡>@•鸨 P‚·Øc÷ƒÍ¦SŸ æ©£ù(œR~wr•Õâp‘AÀÞ<-Ýí*‘¢qDìÓºÙðCÅ11È rˆ¨ò!¿?É<@N&#‰×¡ĈVªûìng>ð޹H½i·MeUu-ÃøýºmÇ»å'êÎü¹›÷ÙVõ4ƒ­ßtÔoÔt6{iw½"ÉQÈÕÎ_uëÎ ÓïD‡Ñö½3Îoæsµõ†ŸÉÑ*êNàÝgLx·,aÏ<ßÈyÈÝÉægRºµ_zH±PÆ›¸î>’ÜŒ`ó‹cU`VX•K ¯…ªê·6L6%¢X‚o‡^Ã7ih¿2Äœ€’¿vW­”#ßh¿Lê bþ)-Ö<~¬´^΂9bFž#x?D"º;«¿}ÐÚ]ŽTÛXŽTÛn÷RmçÞ®¸Å½Æ§”5ŠZϱ÷êßn£¸—jµ7‡öŠ{OkcÏÁPÜëFR¡2‹ÝFç™Y‹ pûLi_ØD ³Wèxk¢fê‘Êd HbCÚJÌÝRxuo`b #+’bq˜ÈfR¹q„´ï¥€ŒÌ!§R°+ÈEîj|ҵ䂒Èxé)׿#1cÖv¸ˆ6ãG¥œÓqê¥eq“Õ» EˆA¼Ù¡¯ŽWD¡ÞÔç\©|å”{ŽÊ ï°‰è‡Ô äE/!𬈠‘ä1ÜÙɤ«kŠL7‚â‹8påQ¬æ@fÍ-e]ú9å}ujJ±€Ä§QëänI5 Àß" z€î€„š³ ÷SoEü©ÌÓ|­vÿ.AåºNˆ»q¿ ÎõàÍ0hµ§|¹Ëëzã“Ýɵù(–z*7Õ´-ºZ889tþ¸rþŸ©;3Ž3®@rkPTs¿ÂKJ‹cí¤ÅÁdÎ Lù¡…òL¸ÄÊ Ò^™‡¥4íshU‡º±1³P‹—YÁ’Ë!§;¼H’!W$§YuEß‘äoÀ<29§hZgÏdûû¨êáH'wD{H£³à² /~¦¹Ç>ùBv6/a¹ ¤¬˜‡\ÑEr¤Ž>s‰ZÚOOÇIZ€Z~ :¯šé•p`,JÆ¥&޳dðr¶öçZÕV†„VÍF†„VÆÉ^®¸ãSÊE­çX2$´Òº·Ý9”—!1>e¬QŒ=Gú ­¯ê=! ýiVøÍb,(7×–¾Ã\'‡>ò,tóH8þ3R¹!0îŠT÷(HéŠ[òt=¶ÒfÙ èº;úˆ¤L•¨¥#½Êq{VÝ•·3Bùæ§PµäÇ ä/;ò¬ÝŸ˜„d¸žÞ»¾-âæcns”<•¤QlÝF´òB:ÒöâŠI$d! ÿ&o.¯ß9O€ÜHžj3i²F9Їў2$^4äþ¨âÍ‹$ø¤ •VÊýÞƒ¦ß ùà¬{­;õÉ(_âz²êüÐ1+^ð·•r®¨wàMŸ4KðÌ÷Êå~J™W!¥#kÊü pÆÂ™qP2@Tä*U›§4“T‰°Ü -¸3…Í 3ôPD‚`œ:•º+ -螬¯¤4ÓŸ9Å·¾OJŸ«”®CÒRÃ*ì‚l/RŠUlñú>cz‰áì0ƒ ­ín“Rz‡¸_<¤ÊMÈ¥²"œŒúJž!Ĉ¸¨*Vgœ·è MzlÐØNÚÐØNmAc»Ú…­öWR>;çà`ùPk`ÀŸŸ ‘À²)À«kI2Úˆ²Vi³ÔOô[• ÔŸº×!oŒ0ÚHH ™m•#Õ˜ë ó:&YËañtY=ps+(í/퉆äöé¼Án‚Hô“gyc$û:ƒ„„YÐ wäå°ly¶:àL€”€¢åÀáJ±ÕtYkžpÇ™”_P•‹¨½á,\B_žËñS*yõáø©…ÜpüÔÂíè6\q?ãSÊE­çX?µ¨6?uåv¦®¸ŽŸñ)cbì9Ò;~jqmZ‰8~"ò>Y‘ÍŠÌ;ú§#VòzØ‹Ûóg:ezù÷=ïÎBM‡m×9²êÔ61†VÞ=Jåô5_öÊ¥¹#@ò™òî¨ÄÍE-,*qJ=>©ï§rͳ@A¼Ñ©MƒX¼èTÖä5(C˜ü>DÈëÆdRS–Éõž+ÜŽ$¥-ÆÄ l‚ˆÍ?Z^Sj K‘¤|hDæ b¢¤ûÕº³}¾uµåó­¥ëí¯x>ßá)e¢Ös\}¾Úlù|uëÎÑ_ñ|¾ÃSÆÅØsdðùÖõb* >ß_«wñA+àåÊù>]Ö‰gCrÄùxŠ´oŒTˆ¿<@ŽÔÖÚž3‘)¥gWKG"9Eê±È$€À},Q­³^ÙÓÕ+{6Œ·óA®6Gü’*è?à…>r@íå[eðùÊÖ†‰M-Hž‘ã¡SC2e×êf~ÓêÉa’'9¸Ê‹áfu¼Ca‰ë’yz†fðj¶ú¡ê•ª¢ÉÞKÊä=+Hu zû¬`°X¼`ÖX`†"µqÿ~o|®b#ÌôxEÊ{c×QŒ4'MO\¶©–Ò%Ij¬3%Oyh¨}8i%„6)8 ë,M w 4)D¤–åH<…œû·s\€-€º>Fœ6Þ¦é {dq*“¼DÙ'i`.¢ÛÔ;šIèEˆI)îíÚI¬¾Ç'êÎÌnêwI £~#èy:ò7WûÙó!LŸ¹}WÞnÓo*¯Ìß±à£}¦~3´­÷!W :àŽ"w§¢Ö&«\ꆹ&…eR7^§1"¯ûµô÷ŽFiwªÂ‘ Èëᆲ,x+a ¾·âaŒ#×@̯‡´? Eã0Æ3­¦ÄÍ!è76g±þö[µ®–E…‡ ÅþÊý|á8Ôµ¨òP<Þz6ÅÓï ÚYˆnÄ}G‚ŽœîÀi“ÐGJýBÇpê@Ä›)·‰ò1ÝBJ¡÷Ødõ!l1ŠxM,2ÏÉ·   Y›¸Ü<‘é]UmÅšUuJ– #»“󞎔@!]*(îC |p$؆ }óªí!­:èíb¥)T/">˜SÙMñ„ÇZ¨ÿKys)Õš¸êY.Gø*W´_F•ïmÆ“Rˆ$kâ ð”?+íŠÍâ˜Äõ Ô±j pàÂgµ&¯3.ãô P|JmOiHа…ˆ÷ÊXÝh©G¶/äÅF%s¾ÄìbýD<-V<ÙúÆ{Ä!+’'NÛŠÙóÄ`S€îï8Õ|ˆ²¾‡X»ç²°Ëû‰Ç’b†Ï1sTëSvµC²<*‚g-Tž 5qÖ5‹¥ÁþL]S+™ †³(´¨(GÂ|Ûk÷ÔÉ,íÞÇ—·>VGÝ™_wãŽ$S‘óÈÏä<-y§!ïhêŽþD®|ŸŠœ‡ÞŠž‡|hä<ô›Ò»sÞÁîÌ,-êN`O?I?Š>;ßâç ¬º"ïòŽŒßz¾Cs’æù„êiþ6 ʸïCî[`m·ö Ìé®ÐåW“9ûÛVÔþŠV8\!ìŠfô–Ð,¡¸H´$IHÒÄÕf µøÖ®òÙ$9¯´Ôô!#ùgà`"œæÓô—øH@?¤¥%9O€cÒü‰ô<§$¯X’±øþ_N’o­€NäÚ “ì(}Æè= W &ò”x pÐ{𘒒Y6"rïó2g4ðµ™C[Ý _¿S2½13õ% &é¼ÃC»ôRÆïuçîÔqV<}g|eZM Œd ’gÎLÈç«$$sej—ÌÏ–À÷”vHžU´ „`y«Ï;úP]7ËKº#W².–)“%üºU/xJ€êPg£[¨‘”Àk×J€hZ(I€áx¥Ç×jOLöµÔhùC”´Œ¢öl]³K¿bÀUtþEù”½òÕðÑÒú?Ä>= 7= R›Ý.¨hWDG‚Å&}ýN»RðI³Ùr*»x/M·îäY©vúŸl9ÄćÂ`¼!:(ø@‡ŽàC’n\ð‚)„Ø…|`wèßÐa°À›ÒàFz4xŸ@ø9½ôÚhX*?A‹ô›*š~诀óh®UæÊ3'Ï#?Œ\VJ‡Ü¾„M¯EÀó¡÷)U@îðƒrÉjEò4dRþ„Ö¦³q‡¦_áËqúŒÀi& ÁÑÒ°œÜ™;<æ 9G‘ו¾G¡- ¥ ÙDG/ç…8ÊOÈAø†ºö{¾ñdVÿÉ7ØùÆCž}¥ÿçò£gAÎòó­vDVÌ&äN¨÷J 䋼zØ'.½ËœÎU»ƘÞU¾Ëy²¾3qžÆ¿3{“ä{ãõœV°ÚúJÍ£nÅY·Öö}~S*†NãIõÇ’*r±b~uïgò QxtÜiã5=ù›Ùù&¢^}ðAÜðßæ¶$÷N‘ïDAÇìè#@\àKÌLgãHÓ»*hl¹;Þ!<Þ‡n+õ>3 ë‹“¤-IŒX…DorŸ/?¿ý?ˆ¶F endstream endobj 7840 0 obj 9883 endobj 7844 0 obj [482 /XYZ 38.2500000 581 0] endobj 7845 0 obj [482 /XYZ 38.2500000 236 0] endobj 7846 0 obj [482 /XYZ 38.2500000 581 0] endobj 7847 0 obj [482 /XYZ 38.2500000 236 0] endobj 7843 0 obj << /Type /Page /Parent 2 0 R /Contents 7848 0 R /Resources 7850 0 R /Annots 7851 0 R /MediaBox [0 0 595 842] >> endobj 7850 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1701 1701 0 R /F1700 1700 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 7851 0 obj [ ] endobj 7848 0 obj << /Length 7849 0 R /Filter /FlateDecode >> stream xœí]Ë®äÈqÝ߯¨µ©a>ø=Ý3¼0И¼0¼F’ ÁÜÒB¿ïºM²êv²N’y*òÁº©4£æ™ÈˆÈˆ'~ü×_ÿpúïœ~üøëÿ~›ÿþñ×—æÜ·ÍôŸÓë_?¼ý=œç>õC{úí¯/_O__>¿|¾üï×—é¿~ü÷Ë?ýó¤Oÿvùï_Nÿù_—?üãü/½þ }éUùûÿ~ûûØ«Ë?5׿¿þùÿ¼üÇ¿œþöúÆåsó`¾ÿÿ?Ønh´~ÆÆ§¿¾,ÓTßþúÇo{ùqZ€°¯Œ¦k¬=)k.ÿ3Z}úûŸ^þ|ùÀòúæ•„à˜i~þrQ$ÑuÀØ-#mÑx4ÖP^,Ü- × ?ñH#cpÔx Ôi©€{ï‘e¬;á ôœg¸s‰…cûàY7¼ð7†ÑÌnãÕiÓ@uñs«¾>ùþDã™béûŽË>ÄêÈZa¼Ûž3ׯ›g­ ½!kŸŸMv<Ç"÷ihùËðQTkÞŸ†<¤Ä–|O©Ò'UÇ”·BôÓ¨âÜ¡ýô~¼wöfN s'ÄÚëuøÄs2àwðØL#¹¢X`{(+UÔýû°wB­Çwçñ<Û9Ö[ãÕ©åñ<›ìlú5AÒâu#~cÆ„zо¿ •Çžaûüdò_o~U²z0©~âdϨÈ9Ö„Fa$¶æ¡Ê¿Y]³M93Oöij?̺áýÁ–Æ8+¬)o)ã¢Æ¾Ã¼MÁ{ß0Þ.þuªÈÇûÑ5ÿ˜’Hd©=žÕ–T¥Ñv^f‡=½­'#Á0móm˜VõËâ,ƒé»öÛxn :‰ÎpÆæû'³}ïÉ$ölÍTay{Û€ž(ü¶é( ®ÄÜy þ0þ ž gHÄ”úöD™³Ñƒº¼ÎÕÅ÷¾3HL¾ï†ìB2’0uÏ>õpo-±ë“†o— Üó6ÏgyhÎ]¯†þ­ÆŒ(Zãjx¡ÚTÎq·»í\3u2–ˆ›Úí:pŸRùŒý’ã} y*!-}£Ðê ÎH眓ÌWa\»_…9yŒ”õàS ­GàñwÌ„glË€õ(Æ©FGè¦ww‘ñÀ°7@ÄÁ%¯éL¢D6¯„=ØÓ.LàG)±AçA1mŒr  þ×Ã#ôX‰Õe2”¡•P h¸ÕõI¯1gJ$‹‚ïSO&Öæ¼$«22„Hê\{,›¾Š’óŽhLc\_Ž8Ôž½"nË *ÑŽ0¦i®]CwŠB̨$(>ªäD¬ç7x਩ä ã8?‡óB¬±šßŸg{!7F¬Þ°)‚‚èq˜p;Ã2„&„i¥òý|¾,fÚШ•m-÷ &:^Wa¿{HRŒ.³áF|³ “Ì8ˆFUV! æ(zTX@òmÿíg®xÛ•S„§Ã¶úC$ ¦T l¦ÇdÇ“´QÌŒãânŠ6ÇÔèºuUz\ÝÁÜ=ß ðâò— ï`éµ%²6Kvu<„ý4¬hˆÝ.À—N(Æ 'ÏÎEFL3±*&U7™ˆ7xÊ~.ØÙdjOD¯­ešÖQ»Mëódž˜¢J&JÀ”uJ@ðSÅKŸ4Éþr†ÔÕŠç¸øOÌ3 $&zó Áµ¬&Šå‚±Q²~Kšã‡úZ¥6—ß“œܤÀÕÎHÉÛ¤Ì[…ѯ§à†Ë318DZ%FuÖ]Ýã!¯ÕÐí + qÜ~çh‚ {ãêŽThíÖ^©®fv;¼;qcžŒ§ë):ÂO°á‡+QD€Á™áu;f¦Ås¯ùà à!™Îò3[15ÖZ"ÊL×3¥yƒÔòè•Yüãî~ÂC(b®ÕeklÝÔÑ¥˜unªw-†e<4ÏwR ¬—ÅyžÄ°à±/]Ö‘TÊme¸m1,®PÅ唸¾)Á„·HæZááÇ&ºsxF°ÕÕ!&¾¹9:Tq‰'ÐÄ(TlR‰·%H†tÊÝ '³ü¶g êƒ~3OúÞoFø›kÎÓÍ ÎÒsçmjÚÕþlVË>Âß8‚æ*ÙN¦V7±•ê|ñël»˜–DÝÉÖ>‚Q„bu`<‹š½ Qm²Džöa :>r±å~ø­ç®°=ù›Ô‰ž€d|0ÁÝþb*á™Yõ¦…©‹Q€CÁtSå ò?S #Êž-¢<˜7åJ“Ry²=ú°N—Ðäj³Básd‹½öK± ;žNÔ4¥ÊéäaæsÓ·WÖ’bµYÝ?˜J·’¹%úÇaÉ>£fä7 Ÿ]Uˆ$øRÛÙ¤.3xR…ª–ƒZ.A„¬³û”1¡èƒ3L†C–:L²®T.v†cBƨ²Q á™%r›“‰«¿öHÅ<<ðlÜo§oÃMS0û'±ñ”ÈZí.‰ñ¤g#Të~ÖSeû >Á®’¬Ý¨r¬nVŸÅå¸T@­(ÉçOXÜ}ÕcŸc_Mã~ÖÓ´h«"<¬Žÿï–\ƒ«â±œ¦Øq;3ß–ÞˆUÀxv|v û[ØwaŽ Œu9;úWÉøj |d? Êê¢ïqd_Š! zç­7ugÜ#5©ÆN¶Ü/úÕÓhåÌz3äwŒÝ“NÔV2}Nqu§Ž^óhW¿åÞ†±u·.œ‡B‰àÔQ¸é"þMtd;ºAB÷â$Ûm‡Á™žÁ§_)°‰…‡¨hžÉ•b†ºZWü7SqýÁveJ½Cluãž xî¦s¿™Ë9|þ.ï ƒî3¿a´¯®3RNƒ^9 fáÒ ƒ(Ax©Lç»SüéT’÷E×.Û€;anIý½MÅOpA‡h£ì8¼‹!¦8XŒqŠ»·böxEcÆëÈDŠh>ͬ\ÞHh zÀÈuw¶u&Që³Rd*L«ÜuØ …0u±š>%Õ4VÞþê0(•¹pËüð*¯‘[;»Ê·S¥£ãÚÁýf>‹ÑuŽ}†©"íÒ‘J–}3.‹4ß’¸æ‡0wʦ,DQy¤Œ‰é<ÏMžY)Þø‹ À߈'ø;&zCôQ¹.P²&ìƒqÙE#O/M”OÅØ#Ü€<ÀIô ‘?YÎ ýàšàmbFÏt©ôuµA0IgLË1ÇtÌqµ â ª5š„f ²´‰š×¤:dêK¸südÝó€åê_%ô³øO@²†nŒí%x÷@A˜e. i, K¯.{OLÖ†Ž@bˆÜG)t·l§>î•;kÆóߌn²Àøåûiž„’…—XÙ°`;vv$åñˆ‚heÌ1ƒƒ €4c5R •¼ç”2æ»3Ä4f)K²êú†I©M¼PØÀv„©åÆ–^(’-]Ï”•7‘cÚ‹RºT‚ÂFö¾RrWnªŠ~?Õgº¾™4û&l²(+O&¥|ZÀ ù$.Å[k±ªx˜7+G©Ò˜+…0œŒ;N³á±1yÆËí´¥1PÌÚ¯fpÅ4>$zu ñ³q0’é ²š1—‘qŸ¹ÚÿÉF–eÙŽU6, ¹ÆO$•©©gÏàʦe‹ñ7£ÅŽËOÃż6®Õbèb¯Èƒ+8r¦/H&dˆ«SQe‰´Æ »J•M†1’"%Á— <"C/J+ÿžÑ~™ÃÜéï‰r¹CO|}î:¶Ý÷Lôð:S\ì!Uð;0$op)&EeïLù9Süçƒ× ót2ó‰O9}t&„):Ñ_,ÿö$<&ªÁ]¢ˆ¦0LiÌIßÏ›XH.'Ð 2”Nyº N-HÞ³ôkLôÂ`\u6ž9_®gz˜…˜¶ß½ iœ÷˜“šf¿=L„O4&Ge‡–›pþÈb§-bJ&š&KÞ Bû9d0üÙD hÚ'7ƒƒˆ|Ŝ߾Ñ~(s÷Û)ÅÄkôÀŒÅüæàZ“Yv"|*I̜'iXmþpŠ1Y"ìÊß%bóÉð ²y¤ýÐæ¦ ‰H ÄßPA L:v<"|![å)%F ^P7®²Èõª¹æí\s‚ °Ù–„c§ªccH°D$"Þ‰\C˜ª9‰,¾žlÈQ©ª·™ºÐýEªóV"ÜM™X,;QÿUÇß"‹„0XÜ~ÿëá1ÇmÓ˜' ÊpèYkq,óL,Š'‰KÌT$ñ+ÜIàý ÃEbl­ÙsdVßf˜ÒÉDy™2ËøGÕí¾Mž€Ja‚QŒÿ@„ÉTÕ12(ÛÍ+‘:¡°ŒöÍÞù4U‘^ßtW¤gö*–ØuòQ Ñå¤& ]1$çgøñ 7Bö²ÇŒúP4ZÕv΋HY¯lj‚¾Á±t!˜œòY%†KË*H©Y~¡3üôI}AË2D=ŒúÇßAÉ2d‡„µ èò–*»…í[Hñ`¹uÙ×ö3Yî+ûµ6?ƒQ2zj|šsåë ÀÂʺLÛ¢q…,ïåT® ôrQ‰ˆh*êç¾ÚbT_œ#Bi&7š¤=bL ½Ü6^”P¶ã¯ÈGÄߢøs¹>ÂyYQ¬v<­kô¾DÔ¤' _œ´d®¢±|$b‚E·-sJ–'Túº¸?C¯"€Ž[C].SA$*ð©–H$”Þc(%àˆÉNr¶Fº"¸¨¸4 ’J;挡‹£\9¦{hÁÅÒ%›ËügÁ4JT0¦êÔ*ÜŽO+‘оéàòÐ=»™Àh㚌JÈ)#ÌÊ#ZwC™Oìè®Ú0× d-ñ6Qº|ªO#ª”TpÌ¡\ç€ÚpãÌS½8±òMb,- ~Úr¸Äó̸}%ò_µCuPFÙCÉ"Öq“ÿ»W£þþŸÿRPyX±·X¤Ãø²ŸìI‰^1c7~›ýHì)–‚K"~Ã*ï¡/ÃèÄþà]˜w.ÉI×7î£ü'዇o“Oɺ&ÿIÇ ˆ5ÑLØÃ ÷Ç£ˆxN-”Ѽ'}ÃÝÓWðnªªÆù …d¿”Pðòâ‘jÑD(%‘±òòzãEÓÔÈåcb𬽥$sC1ÙhkFU‹ÂEð‘ ©Š4°Áñ3Ù†ÂûIÌž«ÊêÞwµ² ÙlÂO˜<‘n )ÜÉU+MU 0¨iQra…ýEÆÓ–DWì<ó˜Ùâ®wLTz‹ñ’˜ëŽì±`òP¢ô¶ŒÊKvdnQ œc?z¨¦d¤R2 ÐcÓZ!bÂàŠzxHàÔ×–œÇµ%]Kãìš4¯þ›UÑÆ#é÷7ž `G…Iâ áÜ>ðÞa€+› ²UÎ>3kK½ }äÊãÄ¡²q¤‰šO«†\ ùD=Š“)@@$TF².Z¢ë·VtøÃ ÷[*/P4Nàï?ÑK˜«F%¤©Â*_c'#š¬Î¸®I¶š|°©ÊKÍ\]@~òI+4¨QÛœ(àVÖwHEAÁ°kÙ5¨ùÂÇÜõü¬µµlž*U“†ç-Ajµr¬¤lÐÍ£Ró—Ý`MÀT9ä/áÏU_£¾9£¾©Â ¢WyåfzŽ=ÜŽ™u¢ºç®êLÊU”} /—ljLM‘Ñ «¦í\3,Že¼–²0êòײšVŽçø‰§Œ·À'žâ XÜ‚ ³7´ ¦19RKžöýÖ£db¨zµ–rEÂ3D¬”Ú‰L#™ˆFÞ쀒–êé‚øÛæfvG€l„Šáo‹Üw÷Iò±Qï± •Eí‚”Ÿ¨ý Sd7»\§—/õލ«ú±wu‚ ¨ïl¿&Q%]ƒ¬1&ö_·®`fg২Lе=fB4Á—ª­$Äõ4)aÊ"“`u„‡n{òG¦áw7å*®Ë«fÈmSH?D­ÃX ¨5¡ÒÎ"÷'i³/bã‘^ÝÛû*%¢$êaõÍ´’wIéÍ™½ˆKj´ûMI3æÀÛÖ՞ωÅLÃr£†ÓEï½)DÛê~ùä/Ë ‘½Ñ³ГyÚ³ȳ ßàÌ1†{¿¹FVÝL5z›šd¹?›•$ŒpÌØ&Ix ð8‘<Ïwà“yÔñ½Í¶[ª`RÕÔ!a+Y ®_À׃(}!©Ê͸i *ùÀ ”L&SÂ\OÓòÍäL»1¼ýøt‘2¦m÷õM ÒÒoÌ‘‹’%Êùäš=y)Í4û–Mßæ çG® ˆazî>¢ªæ8†÷Šé/#o'H™|2¦¹ ª‘iÏV0çG~Ô]2ϧ$XuQ9Ž­]Gk‰¢Wm’­ÐŠ{7Á¬OPÔjyxE¥®*ÐÈS¤8²±I¢C¹gê„™ŒŒ TÑ‘dKl°HÖÙ!h)ð Q:¶v"EStžpü–š‰iÌàl.¡¦2á²Nö` (ÂaƒTÈ.»6÷D1*àjMðˈ@ÚR¦Š0ñ Ô(ó9M£áú+€ï ÑòÜ£…ðž@àáKÿÁ® 5Þa,Xsa›Áœ&,cØY„gÆÈY­mÛCË56‚?C㆒„Ýtæ:PÏÙ‘ÏY¯l=g?g²û£±÷AœgÊ3µéúsÌ͇E<«×@ãÕ!4—gOá|lCøÁ˜YúèžQã3‡µ ¾õ`9À^5ÞmÏw±eÁšB<ÝeF€¿µ‹ÅÚ² +n®|ØÕŠW+~X+þ~ÖÀ£q Ž[õ˜šê1U©zLÕcúÞcj—>ÕcªSéÞBµâ>y«V¼©V¼ZñV\C-†×-©ï—OÕŠW+~\+þ~Ö Æ=ªÇT=¦R<Œê1yGðŒÓ˜ÚU©âª6l›(®ÊBû‘òœ ÍXÏÙÁÏYª5À¶Ésfˆ²©êû¤ªúÄ>I¬>q#íãº&,oxçp Ö–Ìn—<êìÞ?Îz&õ=ôP}ê{TßcçÛªïá;ÁÕ÷ðŽ­úÕ÷(Â÷À‘Ǥ¾‡½¶›ª¾Ç{ò=™¬^‰OÞªWÒT¯¤z%Gu~¯ëƒ"ò¡C×m¯ÕÖ“4#*#ÆÑ=«š¹õé [DeÈØTFŒ£Ÿ3j ð™!Fí¡Â$ÎYÕ(>ÅÅ‘u­Î—åÉò1U£ã£ØZ½Z5Êñ× êšÆ§kŠˆŒ]­±;ú9«kÀ­3b¼¾ª;}1q¼seèÎ!ÒÙ¬º³h½Q× lÝIí)έÙâ'=X­D2+±¯Vìò×éëÅx­Åç­aGëáž)1ÊœõÚ è¤í÷s½×*p’¸þNwœ){«Ïz꿲Ýú‰ù4ÿfnEôFF¦Üëïõ }g^SÜ éÞØ~™gŠº!ápö6¤VÍS_Mp6±¸!î…xg ¿ þf†¨ ©¿IH³÷úÏ—/ ×ÎÀ9aP¸k,¸ÄNÌ*ìŽHãUUPp±d­„°¼îsž•Äw;¶†íÌf)™Õå–ª<}~ù¨ÌY- endstream endobj 7849 0 obj 7410 endobj 7852 0 obj << /Type /Page /Parent 2 0 R /Contents 7853 0 R /Resources 7855 0 R /Annots 7856 0 R /MediaBox [0 0 595 842] >> endobj 7855 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 7856 0 obj [ ] endobj 7853 0 obj << /Length 7854 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯Ð9€ÛüÒ,àYÈ!€árr¼» ÙE&{ÈßO÷´z½q‡»þ`ÿ¾¿xøÓŸ4··éoÞçf»ù©åÉ­b}cãwŸyÀ»ºéOFóÁÖ3 ÊóýÓJ°}çç›NO-Oo–aÈ_¹ý§)·Ám‰rÕcäÂïvï?Ú`ælª‡Ÿ­{zæéÇÃÁ,uõîÐðcS~¬þhŒ ßU¿ìú}ãêsOˆi¹ÆAä{ˆxÁs$mëá5B¼Æ|„×ÀžZÜê†6ÈeIÌvÃH¶þàQ´:²¶ï¦ÏƒH«%[€íæ1ïÀ™èðÈár?ùðLÄmÃsÇXˆÀþ8 þtͱ›]§lOÚ GÓëÓ)‰E©FT£§žÖ­ÎªS¾£Nm£iƒõéîÄÖëP%Lj•€HV•¨[ªÄ’6 JP%¨7ªDÛP%6È´U‚*¡_%¼Ž“‘¾¦Jl!iªUB¿J8Ø‚œ*am Jl!iªUB¿Jx·¬*á=Ubƒ IP%¨ P 9N¶vT‰ 2$m [%ȪF¡ýÉʪ­%«nQhݬ*SØ6ÜÓˆ¿.©Š ~äóÊuDøû™æ2õC5wÒëÓÆnÌBUçé¨Os†uÔ[dHÚ`}*Á]Ft|Ö¦*jœc}ó¹“6XŸ~ð}Q±PÁLbÓQ/ák¯·ÈÞ´Á–Œq2³P•ÐQ/áÖ^o‘!iªUB¿J託pk¯·È´n• ««ªˆÐxÃZå-2 m ›UyFMýˆë‡ŽJ ïXżEî¤ Ö§ŒÝ˜Õ©„Žz XżE†¤ Ö§ÜeDÇg‘úÏuTR¿üJýØwÒëÓfÂÆZ@3©LE-‡ïfbH*˜jö¦ ¶¤`Œ“™…ª„Žz ß³b|‹ IP%¨úU"G½D$"˜'‰õsÂÖiJX³oZÛµõ C–y7æÿnßõæ©éc˽†œö¨a|[k…!¦w;Í‘zï]go|Î0B¯µ ‡ÏÁ=…ϱ§9bý¹q·ô§›66ÒÁ‹›œöª~_‡æ8¢·´ÑzÔÆA;^¹›ÄJ¸m‘9„‚[g žwßÍß¼†>OÁ\S²À—óN2ðØâãçHZ0a Â&YsûÔ·ÜDb ɼ°ÅÝì‚Ô6cE‚„#™¥“¯dÎ']ÑþÕÛñàÁ®GfšDß°ÞÀDˆM"ÐöÃÈ(˜#óa¾ŸÞúpö;Û¦=8­'4ÁJøŸfr!D:*q.Ê«2¼ÆãeŠ—ö¯w]ÂxMà‰!¸›dbDˆvvëƒ Ü…Êb3DfÀín‹Hf0 c¶Ç¤ ÏAØ6l.LNC¦u°âáý®À‘=~ß´É”ÔI²xÔ’¹Š‘K× ÷Kââi ñˆñ5‚vdºaOóÝí†|ƒ<Ï{ s±µþÛ ûZ$ðB"g-8)É|Á1O| Ž ~˜[M­oÆÖÅ3ä‚(ðÚƒ+,BÛ‚md‹/Z¯ØØ@ÄÅÖIPt'ÄÚóín¡lñ”‰ÜS¼@%†ÉÂíJg×KK6Õ‘$¾?'‰ƒ]NÊEVZÚå57uF:®M7¢ãˆ¥ðD–xŽ·{*š°Y¾Ø´ "=FzÒ†’(ŸèØEr· ””vw•+À3a/Xåþ®žÛ ‘$¬‡—zÒ„DÓF£4»F‹ è`¨õ{sÑ6u$/ò2TÊfßù±lâ¹—6F'‰ÄeâI‰¬¤uÌ4«ˆæ˜üà ÍŸ·T? ‰®”*WJBÀIöÚLi)xl0óª¹=±-M"]Ò%qõÌñmf“S̼›NZ|ÃhÌ©C] ‘(<+¡hw|œ"ÚÑàt„p®ã(¢ã5ÉmZaD¨RÄ… ´l®¬Øˆ‡=ïI©æ|Ù ¿K*Ÿr,èq$† ±ß1éBÎsê>g¤éG:*J“Û_²…$NE$Wâ}%9[€…<¢áí®¶d•G,;aý/3Ž“)/q:V©}vät£ü>{{¥#ã&]=LÏ|þÀ­(Ésv©kܨ™˜·"d÷&Í‘¸SN>%Gy8àlT#‰~¶O@QήɆّzqüN(A½¸Ç5Ìø°Õ¸m¹Þ,á±uðìÜáëz4$›bQ"ܻə³k­kº9…ÆŸ™²¸2—/:§šîu&|[yŠ(W^°ÿÜmUšä^G"~Îíåê—ãt»kŽ=¹q¹ŠQr=‡uRKHµÕ´sÖ|B½ ÀÓœAÐÖß¼5Œ(D®£Ú±ýE^j®·þ¬ªÖ}æ}¬u 7²i6²øUe‚—æEÚ&x½ÙÒ¶ÅÖ_ø$»_I.l†-åеð¼‹Å,tQ¤‚™÷õZônƾÉÎ/úºõÏ´ó»è×eK&œ2¤lYž«`TÒº’²ÅòÉt jñs’¼Va ”RüìYãŠÎ»³¶ c“¼k ÷:×`.åÃ#Ÿôn‹*æŒTÙMH¼Š6ÌM›ë$Ѩ$oÅÍ{1ï–½ ݘkfß²tõø™ÙJ)ŸŽ$%Ëtut׿јó×TàÝïšDø-÷5¼F$-ÐüÆ'†Ü4„ÜS|Í꾪Ðgd;wýÛŸå ?I˜km_Љh"DÖŒäÑ G%"ú=8|7ìÉ | {¯ ‰øÑØÄ; uz}ØyÖsÛ©™/ËD²ùª‹Üß©QG"Dˆ¬Ñ#í[5Z°L„Þ²„Þr^Ï·=¢JÆ~™H‘å[_«é÷2Í1õÈWÄñΟ„ÁDîSˆ!RbŸÒ~ý°oq-X&"Ù§DNk3É® I»O©±VcŸç­ì<[gm;¿È9 Ì’XG2ß²îJÇRÉ𑬻ÒÞ©é÷2Í»RÍÊ Æw&B„È ÷«]B¦°f„çjž«Ñî*ç®§ ½šùBd©>¾Ä_¬MÉiýu"Dˆ”ð×fr¯‘ì%°¶ášäˆêáºlœ‰[ÑjAöÆ2÷®Vá{wÌŸ]/"â Ç'¯x'ËXGê„ÖÁoÈÀÅßQ‘§Ûæé®aŒTB~z?9f¦¯‘ð“Çó_…É(neòSù8qV~ Ì;^/¢`‡ãB‚øSy‹æâ'‡ßˆ9 úO‘»á(öŸðsðÝ®µ-Û5ÌŸ]/¢€íȪ«c;| ~N€ããò½»¸?X\ÍÚ$²%$[Þ¾à#‘ 9fû!BäíHåwz´€È–FÄ5 i#â‘ïtÀzÆHŽ¢ |¶Œ±òÞxÖ!)d¬ZïMÍLa"Efy¦¨è­?‚€$'+ª$'÷·€q "DˆŒ<¾GËj"%ÍgÇÛÉhf¦ñ¸³g%‘«44 äN9wZË* "%w Þ)©j(o…r'>ƒ<èñ.ŽvV†ô¬!Rá{ý5 iÒÃQ½ñ?—u$g@™¼eÜÉÙ™‡ë'×øx¸×˪z5ë…ˆ”@4Ç£Y˽Fq-Ób+7{Ûò[DJ 9sïlÏŠ="EfyR$ÒÁ.›vDˆY9’ÅÃpVæÙ¢9¢±l”´qüF ¶•?â+‰”@˜{§!«Îª•¨DJ i}Õ´Ñ£Èz|—²¼­s±ªÇãƒã~xðþð˜â‘ƒ9˜Yù¶aõ‘sü4 Ìñ‹îçøI¢ÎÌñT¯cÝ$‘ˆæˆ8sü¢×0Ço&ö†U˜DJ 9sü¼c%‘"³<)"Ù™—¯\V“íC„‘fØùÀšA"%Íñ„í䜤¢Gâ c¤¾aõ‘óÛ4 «ä´Žµ–DJ |ç›$-§åd®`ôX‘È–ÑgJ ¾8Fo,5saeÁyti¿û¦£Ú XÖp)hŽÛ1(z ó€æ`bϺ/"%œy@¡fµ ‘"³<)QGæ!BD’Gß[Ö)hŽ'lçl>ñ™¹Ž“§ž:DJ ÌÒ€¬‘ÓjËz,"%æi@–›T{VšY s1H7s1h`Õšµ.DJ šãvÌŠ^Ã< 9˜¸e…‘HÎ< º×Óo"[B˜¤('"+Ìj 늈”@4Ƕs6Ÿ6J±5ŽÅâ·¶«ˆ¸6Žõ>DJ Ì*Ò€!¯2d`­‘s”4 ‰Oú1â| ÅÙê®dŽ*èÞÁVgU£†•MDJ ¢ˆä´ˆ¿Ÿñ.Ë»N±©æÛ%ëGÆïX÷E¤ÂLc HÚýGäKÜøÛÙ‚‚œ>qkXEF¤¢ù”YÃÑk˜5<;VÅ)äÌn«”ˆ™åI‘ˆ:2k˜"Ú<úÞ°öH Dsø§K^Øô=g8~åš!ùZÛ>=m‡&|Ex·C…¯M2°±vèúEzíö-Dê†Åwƒ×˜9ÛI]q€%pÇß->4´‡}ÂSÀÞ ¦ž¸‚‘Ü‹W¦4¶ª…Ϭ‹I¨o [ã÷I|3âpi»{ˆØ—ty*«O»ÿª¶ÂZ endstream endobj 7854 0 obj 3968 endobj 7857 0 obj << /Type /Page /Parent 2 0 R /Contents 7858 0 R /Resources 7860 0 R /Annots 7861 0 R /MediaBox [0 0 595 842] >> endobj 7860 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R >> /XObject << >> >> endobj 7861 0 obj [ ] endobj 7858 0 obj << /Length 7859 0 R /Filter /FlateDecode >> stream xœí]o䶆ïçWèºÀΊúPh¼Ù½(`¬^½(6M‹  êæ¢¿²Gîzwç¥c–ÃsFzb$vüX‡¤^Q‡ç¥ÞþáÃ_«¿ÿR½½ùð¯êãúýæÃ¡>Ž}}ú§zøzóüÍt\®Æ©¯>þt¸¯î·‡Ûå¿÷‡Ónþ´üôŸª©þ¸üûcõÝ_–_~¿þÑÃütø|ÿçã÷y ËOõÿ¾?üþ‡?ÿ¦úù¡Ä§Ó­•ùüÿßtÃ<ÝC5^8õýáéc†Ç¯_>þ|x{j€×enç¹™ªÐµ]殩þý·ÃË žŠ¯ÓÐŒ]_Ï“ü9ñäc³œ}ꇹ Í\Wmú¯Îþø•§ü½ð.ÌS{©Âךço–Ðá|ñ·¯)F×%:tï#~swxû>taiΡºûa©Ýã9Oßî–fé«7ãu¥wßW¿­ëÐý®ºûñ0‡¦ª"r)Òg%ú<Í,%^_Zý>¡n7d—äÛ»e’pñûû2?ñ¢ø=‘^Ž}L=Ékæ÷ò˜w’èZËóÔß¾þØh% ¥õ²4­ú<º´—êVD‰ChÝ\›=‘¾X&÷2Ê[œZ“Qž•DîŽ8µ ˆ7RæþÞãÔ‚XÏñ„ý¸ 2Giu»i"Ÿæ#mâ65(¿ £Ÿ¾‡ì‰àºò@ÐÛÂz;á ‚XTH^½-©\Mãr-ÊE¾oåJêÝÖúy7Ò÷©¢ªÚàl‚X²R=̪ª×Žô¶¨v8Ž Äóºy¤ÑcÈ#½„ø¤ ¤di3á[Ù.±ÏÕÔ±îH#aõ,åŽ @6MŠÜCÛÇÑv‰ççâýäeÞù(!r¨×¾’Vú]¸ÖÛÙv ™…ÊuåêðÇl—$í~V¿þÊÐjÉø3oëT.ûQQ}üô#Ä…>éŒü„Qž’ßoßnöútk¥]ÂyJ®•¶#nŽí0Ǩ]AµÓn›wÕnƲ]â@íPÕͩ݋ó´s¥é,ó‚j×µd$C,H©ì%­v:fÙ.áÉœ¼&ò«I™;O<Ä‚°þçdödêwŸê]dÏ%½ë*á}ó%× »/Ä‚”tu3ÙÒ“Q^(žÀÎõÄ)rÁïàdŽèØ€ìŸÈ;IõzŽÞóÐE>qßâw€XöKö@òªjQåêý´"dO„==¼ÊÅûæWUp\@,Hɵ¢~"Ób2ʳ’È|ƒÜSr=¤È¨yÄ‚{ê”Ê=Íðþ–¥¡Á˱ %£C‡ob2Ê E "k¥ò~–ôNj½C€~JÐqx]ë¬ï¢$n@¾ eæ.ˆñ¼oÑ~²lóÆ-Øí{UÕ Ï Ä‚à)ð@PÕK¨êXãÔ‚X¤¹ªÞ?D«ªvéY,û§ÇJó’[F!\W ‚ëÊÉì]Ð:¨$^ôö\iú^-k]t~ÛùI=‘õNZÓMP|ûÖ¹Nõnu/ÈÒZù”QT{¼b âyMŠwiDqü.ë}sÐ8âg„X’ù·ãŒwb2ʳ’”g5ûœ›|;²Á×)à"ƒXÏñ„ýd}eöæ&doDö9‘¥•Œ¸N-Dˆ!_ÕA!_TÈŸÄ‚YåØgVEÞ ¨=ç q?ïYRÓˆ· bApx )J|í,£v3ž'ˆÉ»Ì»cND;õœë*Ÿó3ç„êþIp’FÞ=¡ûT÷œ|Ê(9»œ*ˆáí/Hæç|Çn¨¢ªÚúéaÈžˆçx2ú£ÇÑ %îðVA,HÉŒþyÀ·1åYIäîHF?ñFÊÜß'{ â9ž°Ÿ¼ØÌùª ñȪ˜žK%´µŽê¤Ô­`Ì7Ô5®+ˆÁSà ÑW Ñ ¾/ˆÁÕààj¨}¸BÝá/ƒX\ È®\ ¡ðpA,®WCáÙå„‹ bAp5x ¸.¡ª¡Æ+± ž³p5DÁÕp %nü\›=‘‚®†Z¼;Û%öÎ=ߎÄ7tì%!vï&‹lÏ9B3p»Äósñ~2L3GkÙÛr&“´R“°7uÑhãˆçi»„œu庈rÍ8¶KR”«•WF$?MÇt^¸yë\§rÙLjJêSpÁl—$éSÂÛh"ñN]ùͱc®s­T®XwòKÊ'õS‚ŽÃëZg}³%q ò)3÷8µ ÄóîDûɥ͜íÀžÞ'UmqB,ÎU½ˆªöø± $i®ªw I¸#³XvI•æ%ÿ¶ŒBޏ® ו’yÞ©uP;H¼èí¹Òô½ZÖºèüvÆy± )ê´¦› øö­sêÝê^¥µò)£¤¯Ä‚x^“âÑc¿1ãzß4´ø!¤dþíÐãݘŒò¬$åYÍ>ç&ßl0Çuq‘A,ˆçxÂ~²¾2{s³æOéÒŠF\g?½Ù!_ÕA!_RȱÆ'± dVy ö™U‘÷ê\ÿ„¸Ÿ÷,©±Á[± ¸<%¾ˆv–Q»ÏÄ‚ä]æÝ1'¢zÎu•Ïù™sBuÿèÙ¿î½”â>•OEg—*ˆáí/Hæç|Çn¨¢ª:ál‚XÏ+ðdôG!£ÿJ<Õx« ¤dFÿÔà[˜Œò¬$rw$£x#eîïŽ=ˆñOØO^læ|Õ„ˆxdULÏ¥ÚZGuRêV2æ; ¸® O‚Fÿÿ½|U÷‹Gµúö¥?xQÌçj:'ämhuè—VÍSÔ¸>E¾ûcÛLá¡ê_¶éxì»a?#§OÔ›ðž‘ÓZçð5Yw"kŽCj¡OãêTƒîص‡FÐ¥ÉcêÓ’HxÕG–™:à~^jüÔѲíZù™ô7 C@Ü„žXo$g†´nÕ ®Y_ B=Öíq‰Ïz\^ÚëÙ9Ò<—Ë—¤²º=ü —­J endstream endobj 7859 0 obj 2869 endobj 7863 0 obj [485 /XYZ 38.2500000 735.500000 0] endobj 7864 0 obj [485 /XYZ 38.2500000 677.750000 0] endobj 7865 0 obj [485 /XYZ 38.2500000 206 0] endobj 7866 0 obj [485 /XYZ 38.2500000 735.500000 0] endobj 7867 0 obj [485 /XYZ 38.2500000 677.750000 0] endobj 7868 0 obj [485 /XYZ 38.2500000 206 0] endobj 7862 0 obj << /Type /Page /Parent 2 0 R /Contents 7869 0 R /Resources 7871 0 R /Annots 7872 0 R /MediaBox [0 0 595 842] >> endobj 7871 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7872 0 obj [ ] endobj 7869 0 obj << /Length 7870 0 R /Filter /FlateDecode >> stream xœí]IäH½×¯ði²cuØBê‰RkZâ€8 4bF4sàï“UvfWÙ~aûUlÎ ZPME;þö=Þüñû¿7ÿü­yóþûÿ4?Œ?ßÿ NΊá?ÍãŸïžÿBu§ñïëlóÃ/_›¯Ÿ>Ÿÿ÷ëÃðÀ÷ïÿ|þÛÿÕüéüߟ›¿þíüËÇôø~ypÒþûégïäùoâúóñ÷ÿzøËïš_w¼¼n<ÌËÿÿq¢×OÇXyõׇËgʧ?¿ýðëÛûÞÒÙ9ÑH£M#{£šÿþãá§ó .Û‹S×*g¬è;øwòåN5½îlÛ7Rõ¢ÑFÚÙÛŸþ„Ù_ßÜȾӱ6O,R·reûÓùÓ¤kÍ#aðÄõ"¥Î?Ù9q½϶°¹QÑÐ;ž<8TìúvËÐg õí4+u œ\¶€-D‘šO*„ãÝr³ç—ÅãægÛGØ\Éx¢b8y,nöì™›µjÍ4›ŸmasST<<8T.Ç»‡äfÓ¡…‰¢ëö1àïzo󧓇ʹ³Ý?ïÙeø ð¾z|÷åáÍ'iä˜móå§óážÞ9üørŠm¾{t:Ó|ù±ù½Òü¡ùòóCj•½±®Ô•X+ö=±›ƒ+-ZQ=ZŸrà ÿŠ"°`ÞÂgÞ¡­áJñw§˜B4üŸ¿ôã—³8-‰{¡‹¡ŠºrO+Œ$ŸÅG¸ß#>À(òÃ-¿$Ž";ÓH;¥Š|]¹§JÚa>Sb9ˆe'¶¹ å›Ö©ìNÄÖ?ÆÄ©Â8Řƒ^FRëÒÈbp_Wîi…’·˜¡ Àé1%dÉò{ÙXëaÙ©!~<øLR©Ú–ƒáºrO+a­XTÅžyª÷` Ú\X¢ä—ª ê)…%±$v³p7,;á{ ÖÈsãJIÜ5²_ê}ÃJ¨+Ø…!ÅÉÇ™’ÞÂÊþµ'ÕKßVÚ Ïô虑Œ¤>9Ù¹ç+r@H{Òr€î–•a7wÒ½xù©Ñ ä@,Ržl¯_œ`dÌ…|±€a |‚» @¶§nøÔ '=¤Eœà=\Y;A¶èubÄÀ¶»ÈÃëG·…M¥¸9í&HÄ+G$jÕÉ—Ä?‘>YÓ¾$d= ·»`j†ø…Ï |fÐ=ÝCK›´hÕÁgàn#o-} >,äì3ð&ø â÷0'pðüQsî;Áv¬SØ`>¡.†à1ˆ Ze`àÙ85ƒ~Ï3+/²jƒÃø‹ öa!(CáÝF=}¶.F¤2 E‰7½WˆEÔ‰V·¥¨ Õ`•är©Ò“G`$ä—ü°_Ÿ™KˆÇ wŸôÀ!úvJƒ‰{è# ¾Çèý€¤„!<|x'6^ä_o'$U†1ƒ;l•‰û2%caýÿ=a"|½Ãð`°Ï¿‡0;ÂaãN5êߥ+¯‚ô³¾MvMç¡ÎÙÇÎ~¹nöO u–¬&ªà@w~9l¼ÇÛdÒA=vª0qÚ *p¨„´]Ç·¶ºGÕ¾›n67žˆI<¬´ÖCCø=„íX\ïÐ øÅ»7‰Z™&û‰Š kë0µÊ!«ïã+ê]MÕèÞÇ(AéùÙ:SñÆ*ñ&…i½ ~ŠÇvä‡ãºa¡T„ÈN·˜µVjJ·LÙj á/‚­Mea¢Ê«›¸Õ˜FwSþÂ3Ep5&n&3Eð¬(OÇî’³ùÖV¢¶š)t™RÁu±¶ÝL"x0—gà"óu4t·ZO¬TCp¤»~³Á[«w €å„T³jèqrÜ®0ž6ïÐÊHºKgÃck Ü Ágóœ ÿ8™Ç»–^fêõ8À„£6Š{BKÐÏ ª^˜P¦Ü¾œÖ¶òæ¾Ý·ÆTè,%sÚˉ•ï¼ïzO1.vÔ\ºh¼ê¼GÊ>Æu\Z¥¦¦KÙ± ©¾ŸBªf`Ò‰u¦× D?V²òª¸µ”ºb ›Ì鉈 ·zYT–`æ—œœÙžÓ¦JŽ·7†µû1c÷ íò‰=|5èÌ=KèˆÐ0ã‰2‚=dNhHÕËjõíŠìiµÎ.¥Žcsrú C‚”S,äbå‹ÓUÛŒVßò›…°§öŸmG}lØn¿B-Sk©',¢qʦ=÷@Ldèn‡È(o†§YzSlw)­ÆXÆYç[‹™ÄçÜá³äê±=Î6[²Þœñ eÒó„6"Ù@j*,«;° )×OeSä7Þä³0ÖŽ’KÌï‰,)˜a&† ¢þ3§Ê°XéÔ·Sž»oÓVŠñ¢Ž-¶mä %6ƒçÛ§jÅcF(N¸mh{UªzìÀµ0LÚÒV‘ËX¢wy«žÒ‚0ŠnU±…ì%îkÕ:EN ËŒ‰VûXÉMó1…37Tfiac--Ý£‚û'ø¾†¥ÝpÏEÏÆ\‘ôÔ:øÔÌÁÖ$ü¥:XQýZV¦Òò«hYº#Ò2>5ÞMá÷à¾+HUœ–ÁíÕ'Æ´Œq‚e„|~ª¸I ×É»Ãcåî5ª0BÜUXB'c½¿Ga˜•*VRc¯f}ØfƒT·†}Ïö$Õ]Édc²\½*Ý”<<<Žé®`¹+`>P%|ÒM¾š äzB`©fëÅ-š§ºQX;²$ BTxxBÊÌðì´ƒcª$£¦B‡h|a:•<íÙGA&Ë„m–Þq÷Rܾþü5Ô_Cýe9?²ê6ÊŽ»qîQvç®(LJŞj°y”¾â;Õ±;»¸hOƶúN0Å3Oñ’g艜qÁ%NÀïñœ áÀK™ô+¥½;_’¹ý.윤dµ,ÙmÊd£ý sP¿%ÌÎ5H uvõ0%Oºc7#Šm•%_ɶ£µ 3Cc‘Làð&£sóÇIDèLˆ’šx™d®³i'Šd䯘ºËNß™ NÛÎæö+Êßj¹#Ó”A¨[Žñî(ÍMrÌ|¼RæÖU‹gã •O›uŸcâÅù4fDÐ ‰G‚mF)Za3b‡™Ü¿—Q¹bô[Ug©²a:ñl0,7±Æ+©R¤£#ºÐY>ˆiOb:î‡ÆA?ê²t]IÙÉbUሆáf<É@àŠQX9‰ÃôžJC¢*¿€äBŒ\ÙŠ—ßxjQ1 0ø{˜”ˆÀõÎ kŠ­éÖϳ¶’椭[§„ºâY±AW<Ž©4Ç<Œ¥/!ÿ±„«+u¥®ÜôJ=ÕµÅHüc®X¢çÐÊŠÄ‚ÇOÁÖ;ö‡²wégK"Za‹Áã1Wp?¼Ye@b~¾NœÈ“c®PüœÝ[¼µ•TüœZŽY%•Fƒûc®P¾¦>bf€ÇK€›nùåÆ+8= o^gåä‡ï1W(Þ„²Üã§ãæJ­((‹YWêJ]¹Áʧ/µxù%þ1WJöSî';YrÖ™‰ž2Vál­rM/î‡7« HÌÏ®VfàçìÞâ­­ä¯8æýeÔ!¸¾Ö#fð,jBR¨¹‘„Ó;Y+3pz­j(€Ó﫪¡Óµ¶0§×ª†8½V5D‘(¶VD‘(i°åjUÛ+±tÅ#­jUC]©+u¥´•4zª/Gâs¥d?å~2§5£9ðs/j5mz~¾>«üœ˜ŸU­:ÌÀÏÙ=¿[[É_¡àÉ÷bl½ß¾ô:„ÞÔêÆ ¾@­C(@Ö„åtÏÙÎäíÛZݘŸkµAü|_Õ}W+3pz­6(€ÓkµAèËZµ0WÄ‘̯( {·ðìbšÙµ0øÖNÏ¥Yøâ5xF=yéJâŽ1”˜‹0ƒÞ¸5¿Hˆ¸M߇ä!|¿ÎìHÛ/'dîh‹ Pæ^lŠ–ˆ«Œ"ÜbWæF[Œ'üžÙyÄ=rÂÇ/f8;Ñ5UÔuk—®ETbVØ©Ãw4ï¸;-¬ðen.NQ`Ýz‡NVG¤³Öª)¤0M s9£G n'cæÊY¯œ |<£­BÜéÙ~ûm‹£±;W3>¾8s8ÛÒ=²©®[Ä,÷v;w5ÜrªÉ¾uñå‘/;no6b\­%Å\éì«'nãSNR¸íÚ‰’»x7ÆOaxǾcœ±™k‰1Ìo$hœò0¬™»«¡sŸ;ãdOéën™®aH‹þÒl|Q¸tÆI± å\¸,ÃÂÎ~aVþKªY?ƒ‹tñÙ°7E´þP²“ñ˜¨æF†BªOاÅýš4:GÛÕ“Þ‘ÎaÚ_ñn"$?{b„´ÃTNµ@VýZ0X¸›Èr!²Óšu*¿Ù‰¹©ÚëÕ^/]ÞV{ýö2)uÓëx?º ÚÑÕŽ.C®W;:³Ý5w—ϧjŸ§ùvÄ@®Rœ†þ™g$þ­ŒâÄžhºÙõŒÂÏô虄)­IRrÌ¿-¬ø¥ø=㤠Ù^²]S¡Ñž´°¸á=cîÒŠ„»}@ß3’¸;éY"ŽøRù¾GÃg˜¼ß|iôS(VZ)F0×qúx"UgŽ;C™yLÓ‘«÷ts\{@u23Æ;†ÀïiHÙ^·0ïÆÄ´4ý OIÓ”‘¥MKË;=v6»Áyµžï²ËSìI”0’J®%tŠ•­(ç.XO2|m% ¬Ôk¾N'¯Òê>Ç[; &ûv]®1i|l_ qKy˜„xòÆÉ‹…íþ°­XxpŸ°„Ééר¯ž‚Mì bÍ”»e¸x¬úbDiéx0iÔS*…¥"Æ)„NµQÓŽùpö5^ké‡sÿûrÏ¡}þÓ|=¿Ø{®Ïkÿ`CÔ¸[Î…ë“ñíF™—¹ÄÎí⺃4W'õTÖ1çÕv¾2ÂGÚY=Úp‚¥Åô½6ƒélŸÆ/E!~<¬Ñ|;’€‡½”9Í>p‡¸Jç'>CâÝà3cZEîúôglÄÜãßÅÕUv~&‰s»˜0á˜ÕÂIc¨J<*BgF„å!Ú }…Ä ŒCÖV0G7^z4ŠË5QÙ|~ø?Uï¬b endstream endobj 7870 0 obj 4757 endobj 7874 0 obj [486 /XYZ 38.2500000 659 0] endobj 7875 0 obj [486 /XYZ 38.2500000 71.7500000 0] endobj 7876 0 obj [486 /XYZ 38.2500000 71.7500000 0] endobj 7877 0 obj [486 /XYZ 38.2500000 659 0] endobj 7873 0 obj << /Type /Page /Parent 2 0 R /Contents 7878 0 R /Resources 7880 0 R /Annots 7881 0 R /MediaBox [0 0 595 842] >> endobj 7880 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 7881 0 obj [ ] endobj 7878 0 obj << /Length 7879 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾÷¯ès€i‹‹6 àmäÀ°‚O&Á Ä™Cþ~Ô-©ßk©?JüºH-ÍÛEÕ^ÅZÞüñóßÿüíøæýçÿ¿v¿¿ÿ|ÈNežµÿ;žýðúº:u>–U~üúíðýøýðéð©ùÿï‡öÏïÿÜüéG}üSóß/Ç¿þ­ùáOÝ?:ÿƒo‡R•Íïÿ¾ü^—ªùSvýýüóþò»ã¯çû×u‡¹ýû¶TuVœ1ñêï‡þ3Õå×o_=¼ià÷–ÚšJ飲ÆUmõñ¿ÿ8üܼ ß>;U….mžÕü3ùòR_Þ^TG¥ëY=zùå—ÌöJ~s›•E°ÍÛ“‹CE™B¹w?ÕV©²°eöeµÒu}eÀÿeû›7P·ùåäâPé‹wWgôj•gæ=ópfÚ¿>ªÂv *ƒ`âº}€Í póËÉšңîÍe–‡DóËö6¯Ê€›_N Íp÷@h®›ÍZP5ÿÉëe{ùÍs¥ÂiäöäâPéÑŒwÔȹ.t S0·^¶Ü¢ÈÂm~9¹8T:äŽwÿä³ >Jûà&|w<øîËáÍõ±a—/?ŸÉù…ío_¾l󗳨Pä—ŸŽ¿Ï2Sþáøå—C}*‹¼Ðùå|튮/+Õ©jÎz³’i¸òþ²bOÖ´žØuÅdþ»á(øŒz×®¼lŸ_~`N¹-ªòæÅ<ÒÇËJ~2ºq¡æ} ÞMWð™v·_¢y ßʪ  ¼QCœÿØáürÎl ½{+Zé€uoE£ ßÓŸ@Xˆ9´1H9ÐɪR ÜdL¬˜³ I5û}x{ÌP£ÏñyŸõç´,!FÈ0Ã`^‡(f„™ùWD†!+&S ÑÕMFP†W-õ(ÓíËŠÄYAḐE…cXÂÇnC£ô¨‡ !”qVʸÝM© Ña.Ë© ó0>kYˆOqêÃ$˜ Í4¦bYøáã÷Èr Ä ¥«0&ò¤î¸GXl3ï‰,#øMâ) †­M=а Ë ¬j=¬KLℬp0&þ FLÂgF"ÏqXlð瓬¥'•Ÿ²ÚÜ`ƒ¢4-„|qx¨ŒÇ€­&¬sYØ9ß…;#öñ3ÖÈ» ÷V†àrP1Ž`ËÑØÃ¬Í0‰ˆå]†Ö}Ï–Ó‡Ù§©¸*Óè:¸ŠÑk5G\AD[ ný¡Â{ÏØÐÄ£µáY8”´Ä=LeÊÏEÎD-'Û •ŠRÝj ìeaÁ‚a>ü Æ¥öИ¾(#:$¬!¬Äc¶X'9È¿¯²Þážel8‚ë˼̇"o{®)}õK W æ1pÅ¡áÞÂgàÙ°&Íð{ ü‹V¬ MV¥ªçkR¬#°{€OæÎ FÂkyá[k¬ÃßÎÖ“²w:øHöc9Ðɲ:S“,‹®à÷t2SHáÝ2œ€ÏQZI+ie×+q$±ž–B96Õà3ósïë Ù•}€+X®Ã÷8Â!ð=X®ã/µâ0˜±‰a Wálüb­Ÿq¼â§ûž8œaê œñ<›8c§œ‘Wa8cq{{o+²œ/% q`úwÈAÈÛvpø?•›Ê279¾ëøÂ¶Äãòô¿<7=@ÿq¨¯.ÂP¾rÄšJ“•#-Ë¡vÄ¡ô.ïKJ?C ‰(}m¦ò0¶Ì–/ðý0ÌDVñ °ÖÂör$ž1Ö9>ÛâÚÑá›à–ð=Û„Ž°Œ†Ró6#!^%–;ÖkÆÁ‘BîPï†}b%ªÖ36ŒÕ)ê+üÌg^°•´¼Õ§¡źÚBÛα[wƒ+cÝnqx&7sy&xjrsØ>çÈeØfuÁRY›T*ºì§r@qÞM¤¤&…:Óª"Vͧƒ°ÉæP8„òeÄ•l©?¥¹çzP™¬‹%pÿƒÝÂÆ2UWܺ@¶"WmPrŸ@¢»Á$‡…-¢ÔCUÇж‡ÇAH4Lº¾X´Ü-Vß=‡éÄÈ-FŒ(™¡W‚t(m%Zè›z1Â|Ë…éL?ŠḗV2ø£GÖ#ã-bOV"êb5Ü~þwQ:ƒw™ì³Rgå|bÁ¦åRMÄ(ïA„ì¡b4©^P¨^韢rù1@ú4^X¼ØUæî3²¨âŽá³ytUã ‚Y~ߺ®®×ø¨F‹*¨Ñh½˜V)²ÆHRÑ;‡}-Œx},™;²ÛÅ’ª£ªïv9*Z /®†b›W¦²Sk¼ò[´Ò}Q~ÒÀhñz¦Cæ½gjôL'ãBk{½zæÝ•cÕG´’Aàt4¢lo¹ÍØ­ãe¯¨–ÙÊ“Fù½gZ6,Næ"uÇvƽïÁpËBËÝÎÕÕÙ5a:'<‘t«*}«*Ñeбº\×9/Æ– Ú"ÌVJ-߻й»!®)r#ÜZŒª·ØÈÓYÊXó½Ü˜;‰>ëÌTá¶»—Ës5Ð’)ÑÀO–îs©C¡…¹i& *Ò_ÝGZñõ¼²˜¨“~˜¨³lgÑXS.€³ºäí¹Äœ’šD7M^±ÕЗÄpÇê‹­ù®‰p6T¤û'ºö_JQù “w–W‘Òt˜Øõ=Ì…ë”U!ž¦¯¥˜²éßDüÉã.”)¶`@lÔ1ªÚãzѱýR—°rS4™÷­ïºfh~bJ4éžÉ…b®ýFvКó¨ð61–’ª[>BÖX*³"PQSÊÌ-]~v¢lʃˆ±‚u¤ÄàTb¾Ô.|dzŠ;Cêªz¤¬ÖæC ÙÖc«ÅÃóMwVéÎj‰x ˆò’Ø„ªÑŸ†ä“/Zœ¢éñ£éáµZ]ÚVs8X½a9–0¾dëß…{qÌŠ·€ ^‰ħz!+€òç=j¶ða™Ë{ Ý16KEg=>Ð)B«ìë¢É%L Í‘lpªˆndé0½rFÔ_qªÂÏÄÇþS$ÛÃÔ8¨Í£n~¯qÑô7pdÚÉØnÐ1•7Jjqòù€E½š?ãö”lá6‹÷6"DŠé<ÜaŠÃ_›oR ¹17£Jdk8š‰Â†µ#LÄ!âøRL;x¥ŽHÿU¯ÙpSd¹óLØWÍqnÑ£òS6¨I‰6»:Ö­ÛR±Ê7›må“òθèù›(3xñ¤ÙÄ ˜…‰‚Àg¨@ÓtÂJm›Iù€Â )ÐM>8')áûÀ…ü¶|ˆƒ±ÈÍI œâ¸š69÷‚Žý…A1ªöÅÉ9?Pá8Éš@¬.‹«FÕ1¯¨‚³åcu{ÏàŽ¿²uyK&~‘ b ©Åþå&ß9F‚x‚ŒxBI¹*¦)) p¦¤eMæTa®u¾8"¸I¾_3U¬|¨ªÍókMGi*6=ž:]–7X(vÿ<á#K+æþ"%ÕzÃŽ±zÄÐZ]âa¥+Ö¢”5´þ;Ì(ÔW(5I}²'÷fóoÏŸ¸,ŠÞ=ÃÙêT§š}å® n©ÛM&J­öS¢À!Þg}fq¦ ¿hƒG™)ô]êªÜ‘÷bW¶&8d»8mÚk÷5+(—¨‰s”XàÃzäAX¬¹-Áò²\¦ìp¯“Ô0¨ VÍì¥7|Å ÕØÊ£&=/.õ7Uøìp½ nCÏîZMÏ‘h_biÍù=‰(÷Z´Å󘉸ÞÄêÃuuƒlV†FJp©Ù-"c '-áՆ݈–WŠ•W½å.›Ô.Gƒ ÔqX¦U¦¨þeÁ¦,XŽ’òùÔ›¼_3%­= ¶,¯×) 6^^ÎáÃÙ†‘rѶ¹b`®”&Vš!ó×ÂŽl:¢oÃY ¤ü哃ÞDóùŠw솱e4“g‡ßÜ:„TŽ£Yê넘”IŸ2éݺ-b&}¥ì$Ÿ¤Lzq‹g‡™ô•1“N™ôâUʤo©/Ÿ®ãH™ôûòç'.ë¬ñ|µ0¿ñïF3ÙDºgá°ºüv—±æìA&\â¦<ôÌD·Û™¹jê ››8ã¼ÏÚ¬*êléö›»­ôËMÝ`.÷I)‘rÄÃ'f0¹/Ï;ÍÕcÎóCì:?[:FGS<´=Ë u'ª‰"þ4Abf„©.ÐôŠb¦Ü£,åõ”TÖÓ”´Éâš)ií¹GuÝç6¦Ü£­ÞÄ­âN7oDcH¹JÜ/OI)×`’.MqûÖ”kCïEš)†ç+9°@L÷rðÎÑ[K&Æ*©j›+±r\-~kWBï:žÁÔ++GE}—àgâÙÛy–j’ý,½”¯”ò•¡¾òšw9Å ~߀%Æ#ÜÍá Yü«‚Ég(–ÉzÇùd˜ÆðlRÆv žqøŒf€òICë{#ý ë/¢Íè…Ž!|µmÚBk–޳‰Æër{&!lÈ8¬žÎ÷N·+÷汄•·ËÛªieÝ+±4˜‚«Œ¬rp a:N½¸ä[uͬ˜ÖsWäÊV·ÇôKÏ]_Çõ”<)‡*!R¼©ï™È€I”[Êd±1QDï2ªB"™1©ñLÞ°l[=ªk*†¨l¾:¤ÑÀ­¤)ä[ñ…œ `ÌPobäyÀÑZU&v RH}º2‹ÊýI¢_PE«Ü{‘© "›S#Xd™$U˜ ×RU•t^wŒäU—Šô.$ ZÄTëИ§P„?ŸàĈaª±¨UËÑXmñ_ÌèÅLíùŠ?aÅC'B|«(!VçK¦9ZùÉïrpDSBM6.Î@ŽaŠ=dýÒËJ{•Ÿ²ÚÜ>ƒ#¯mÈ]é~)¢>ÖåƒôGôm>’GènTÇ̰”°!E碾*U‰_CŠó°E‰p3Ó ‚é¥@…d§1fZ$ÿ ó„™ëæ@‚wâRám“˜˜Õá€ï@TQeŒ½ª(Æ¥c¦ÁÜ!LªÉX÷̽t Éf ›®Vë!ݧŒë«Ø ¢ÒõðL”³‘¼ÀøpŽØcÏŠú³Ôx;F„‡íÄCD@:Ue5TŒKÅì"õOŠvoJtÏ¡ÌRl`xíW™«iþGá›i«7Þšgß­9z—r_ŽÄ4Ñdb¶‹_Õúc= <3…4aeÄ\Ñy\nÉÒ†ì½åÎÜyÙþo— ™âŒ0f éTŒ;¼¡u??Aå„¢$nvD¤š"#¬D{à2-A=²ƒ² ½8nûHÄF=ZkS}À™1Ö¹ˆLâd¤¬á¤LÍ Í>oWpv5ceÃIÔ5KÊ™”®í@ã-?y~ÔšÉ+g(ÚÇô%ÌX™qï'‘Íæåº‰4¾gR뉂& HˆjŽ•`0ß.¶K#ë½p–/ú\ï ~ªhV™!&XJ1–á(Ê8:„DEÀá Y¿†ÈhshaìÙ‹•Æ©Œ}3rZ ̨ò ›d¡tQxß=+˜¾T§¿©.!Ť±CÄ#ŸÏ‘Gê}ñ!ªhõôéø*ÎÙrjøËggDÅ” ôÈ;e2¡×—ËZφŸ5%öi˜(<ÓQbÅi c-N˜ïšï²a=‰»L}šãb‹àÎ5OFÖíÙŒzQB\2 <ïr2_éµ5_‚í=WRDÕJš„:ì-e90éï Ž™k´oKÏ âq¸<ص"ZêZØFѳáqv9ÜMÁÝ4~F¶e8LïÇŽ§£-$ÆĶcÆÏ–o¿Æ¡ïâñ¦Qv’*%$V¸Á;3¦‹Ø 7›îx&|Ù4×E…U®'ϳé1R߃OÀŒÅ¸Ç Íñ—ç¢ “#†iÉ6 fÚ‰;†Év€µðBƒèúÄ‘(¥J%7QãpÁ'†”Xn`K:Öx ̵+áŒú<&Îæ <ßm£k°v”-H'†D3C”’D™’(6« ÿ$Q\§f Jˆ""j‰ÂÄe0 ’Dy6‰¢«è?I'7ÉB”ñD1ànL<ÌÁI¢<›D±eúO…óz‰Bx0sI:$ép•E‘¤ÃФ3îlHñÙÎl!œ¯ÀxqŽ»WâlIÚ‘vUþo&iç:õÞ¤ÝÞbIIÚ=›´Ë3ûo&iç:õÞ¤ÝÞîâ’´{:i§Í¼™¤ëÔ½‹Ã¶–vŒäÂ8…'HòééäÓ°9ɧEåC}I %)´q)T¤ìà5I¡å«“ x:P=B±IìOàècU8s1UB¸ó3SoÉÀšÉŠˆKò Y§¼î5IHêDþƒ,…lËVŠËf‡%‰ÂK”B¥¼îmHG8Îgd¬¤$Q’DyD¢˜>¯Ûà;b±óLt-ê>¸k ÕOX´yY¬vîÜæO> endobj 7891 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1410 1410 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 7892 0 obj [ ] endobj 7889 0 obj << /Length 7890 0 R /Filter /FlateDecode >> stream xœí]ËŽÛÈÝ÷Wh Ö‹ `»íY0Æ@AÁä… ÄÉ"¿ªI±¥"O‰uúV±¤æãn‹b=ïóÜ[·~øÍ:üí¿‡>ýøïÃOãÏO?>UÇÆUÇӟ_^~ Ûãøû¡iÝá§ŸŸ¾¾?}}úÚÿýýixáÇO¿ëûßA~ÛÿÿÃþØøçñK§/üüÔ¨¦ÿùÏ—Ÿ]£úߪéçéó¿?ýþ‡Zu®ÚÃBÏUª©mS½eŠî»©UÛ7¢»þ/7ïèåPó 7F¥küeäâ«¢L­Â­ËlnßOßMcºæ T­û¿¬ô<®ÛOѺSUÂÖ_Æ.¿0ºov©õ¯1­à¡Åß÷À‹¿=ýð¥;¨úðí¯ýÈ^:~|ûùÉöÿ8 ¼º;|ûóáWU¥š_¾ý£_ª£Ñ­Òîå{ÓêåI{l»ªî¼>©Ìðdú@wð«Ÿ^žØ£5ƒÊy}R£wt ßÁ­©aÕ±nTÛ\L£Ʀܱê^Þz}ò¶öqxGŸMOì0jsìk¯[k½E Ö_¿ÀR~yâλ³ê‰†­5ð‰_sePk z¶~L#x°¶†û™ É»ïüÝWšk«‡'J;Z³²ô‡‹W–™:|/ ž jáà£V/ŠRH– s ^®>óã-ÅÍãUÂt§n øAë÷ù[¯æÒh¨“-p­¢2b–Ž’¨3®#)5ALÈX™¬—gÅÜ€ ¬FÚ9`~8¦À‹OŒš¡¬e¨+“jÏeN•h\0ÔÅìíú]WÏñ;h:ÈrP[â  |ÈXXaÂ8Ù„ –ÀôJ¨%U5W“X0Ìcx/2¦a„F5Ì„ becV OOƒ!Ÿþ(ßZûÌ*žÊÊ‚)ÑMèÀ÷¢–Šî3×¶„gÖ¤%#ÉáR2t,"j3¨_«üM”…3 ]N!\Wlgø›GÑ”0ª+ ”è–A"/vî #åm Á¯nÁ€c„kÈèã™B•)ýÏX ¢±¬íE}`l˜DKtýÞÞäõ„ú³Öµ§?ã1è8\Ï82ž‡D4†±r¡!©QdšІ~ºcS»Õ •¨ l?ÀµÓe‘ Ƙ‹…LÁ Ù C@ü3Všï¦¿¬IYn6GJŸRií;•ÛG>Eõ xȸw0Í=( #âK1øabS2¸×VÍíÍ\hü ìú2>¨jÓ_VO ¨onç2‚d!üZ²Þó™ïm ÿ&!£öÛïqê\¡m*5AŒI+ á‰@¢IwŒõ€_ž¥(­=h»l× „æÜ¹Ë/Ó¤íµ «? 'ã~×ÇѽxÇÂw:ôΘƒØsÆôɰEÝ‚IcP+#­k5¦ðqÛc×z£Åï¼*p%ñÜG?A5ÈøXh-0jøN`j¶ú¸}¸/Õ@¸Ê}|bd·¨yàÖ#€«¯ºLvVWÝÖìÓE$yó.Ï1H¦9­É l6•ŠñÈd³z LÐ¥lOÙ¤GY{5b!gd°ƒkFŸ¤ø¼k`ÛÆS."Ë.Ì˰fîÖ¢¼Ó»JpÀHJ„®\*, Z%‘—·KËlÒ²€¬ ¸ÙsXE6WFB± y3†–ÍJ®»V{ 9š&o#†ÛñL‚œ’èAå]hQ‰Âqô\G2D!DpÜ|7ftÁÇÁâ¤ôM³8¾¤¦: û3©J„·ðÒ2´Ðê¤2”Ò§X8åm+ÅÎif"R8¯I&Ìq:YQuVqÊðA4Ba(T$ ³½…vGfWy{p 5„"z@'¥â‹qaO(ÃþÃjñ°mʼöu¤€™Œ§²ÝËc¶˜“+XÐåÂÍSû„½@ædž©Ho{¤ /1Þ–õU¨2Rxá`*c="&—ürËrö¼` P-’ŽÀ´#"òìÂä´2'&ÓT¤’†H> ¨âf’ðÁÈ’“9“ÇwÜrá«™R1(EOÄ;eKn‰Ù1ý÷U1Ý…~ØêT)%Î’$’QK‹uœ?æø„h‚µ¬½-SÃ0¢ÎV6›¶q˜šI){&ŽtvUɹŒ kaÈ Ë^G7ÏÐ&" ¹È›9'†‹Kjƒžà,å’ëQ¡h¦ A2Û3” θ}Uôæfm}!OЉl1Æ L[ØsLb~¡«5}¨9ÅÕ§+‚ê^pœ.9ü<ý»;¶mu¨ëÓF©áS­µ›ns?ùé©¶G¥:ݶjú–¹jÅ\öÑüwszíà½ÝÓ·×GÿIÿÎõHNßj¯Zi¯ûøûÓÇ_¼‘×”=ݳÈní‹…ÖOÕ^otw|Ù ;éÉ'ø¤COF¿ô·Ô2F™ÖŸµhÝèÄÐO6mßÁ¦«Õñ&X `õ,%'Œ''Ì¢œ°39aä„䄹’Æ“fQN˜™œ0 rÂLrÂ\É “WNØ3Ç8,'>Ã'˜çUržï—ìz¹x~»¼‡Gæ_çñ¯[äßzÆ¿õÿÖÿº+þuÿºEþu3þu üë&þuWüëòòo}¦~‹yêìÿ&/3ño›Sgj½Oþm<þmù·ño»À¿íÄ¿Íÿ6ÿ6‹üÛÌø·Yàßfâ߿Л¼üÛg§/½ƒûù?6ܚƒJÖIúJ:Êù»¸ûw!÷˜ÁRѯ È[@Ê×yš„Å–˜ÜB&o’CŽª]fK5×yj®[RsªòÕÜé_ͽ|Ë\µb.û˜Ô\·¨æº™šëÔ\7©¹îJÍuYÕœª¦ø‚èb,]·ôR¦‚ïèªÓ]Í…ÕÜÅ.ʪ9ÑDâ]§$Ö)Ú§†÷ SLk—yàí:Ey!µâP³‡Zq¨)Ä¡®BÊ q¨Å‡š…8ÔBˆCM!uâPyCJ§S2„8Tª‡ÈÑê{Êø(_ÎU%ލºEi¡7*†Iì§I–†ä’{;£8¬='*«D8R-8N‘h)Rž¸UVøê”ÍR–¶ºîëÑj‘Gœ˜ NuDœÝ>‰IÑħš“È ÙDIг™Ì3†2‹¬Zï´òõœ,§ŠþÕ©)Ä”~#Reª„d>’ϸ?¸Ä´Ìxp…Œqd™©ñ¿þèêeÊæÛX8à»7v¤•¹^Þ%o†#Ç•‰òÝUC¼Q_ŒDÆeF W'VG`1‚'ºÛF¬ ÿ Z6úAi9IJ`]O,3jÌÏEИS;½CK’Ô·5-7·Ç³Ór>ZÖxÔx ˆÍJc¯‡Ív+€Æ°}Ø(–4\ƒ@$0#]šªÝé² ºÌå”J±íáTRq!ã§ȵ>“ëùâ¾ê8»„ïz2¢’î¨gõÎlü; ÷Ó¡wÎxžã=ÓúhÔ°º¯O3­9PKeilñŸªûU0๋âÔ©Ù`lÐVõ™à¡8¨° ÀÄ‹Y÷Yn„–سî30œOÉ«£ 1ʨ…@Ê~ï\Á+ªˆ <6ÜZ`°‡“àðêü£ñ¨ Pr¬Û”0 ÔèA Ù s{ž¬_#„Q WyK{ƒ0õ ”TyŒ³&TÍ&(›Ž Ï­x4‹Rq(¦æh–lfÓyÅ`¯«àä‚ïdŠ{’ïØ­Ðhâ%tK_R[ù[/[Å0"q–*É[êÛúJú=pV­¦¦lçA°Â)%ƒ1-)ÖÚß”bâó)ïËh€`KÙgkü>Ë; @å Álj¦špâ+¨˜Ë*©òxDU<¢.k.§NVç¶QíùM7'nîR‡P$JÎËÙŽ˜óš'Û'Ëxyb¨W`ÚÍ96Q2ƸcÚ¡Õ „…ïí.é ¾8Ð×ÀàÖðêÀcºÌ“lX³Söz¡v¬yÝß1Öp•#M2û´ƒÏ¢àsܧ¹’í––uî:O„ÇÌW‹¨óޝÅÂ×{l~ãÑRÂë šÓ•¯¡( •áhûÇÔ¤ïšÖŸµ„Öš†c®Îä.2Q 4º'­ÿ†ãæ‰sLuã k\¶ìVrmJ»ÚÕþ83,áhjçÉÁʈRS™n¶ÈˆXf3lšQE#(;íAÿl7"á #.H® ²½ ÇßHœVf«ªž Ã"…¶ª:_NæD{;Oµd<“ÊÀ$hàÜL<Q}´Řn>̰­¯'½Áõ§Œ£¹ÞcÇB¤^`¶›zE*7•â­¤ÕUÚ9¸Ç•HYz¸öûÌ©uj=e°g’#PÞûÃOˆ¸|g×-uKÏ çÁ|Þãòe‰G%6§ò×(¹ˆRÖï3«ˆênƒ²æ ‚Üdn\yösŸþ’ÅÚ~¬­1ݘ‰aL¼˜ä°2Å@%n&.àry{’Mtß]™Ô®LNåyÂþËf„Htl»*®vUüˆª¸­ÎÕóD3Ø^ ¤ƒU$êfœEÑ:÷ÔA“L —*ŒW'É= Ô½!8ö+r‹‹,éˆ^ã´-ÌÏ늽J¸wnѵ挀ØâLxliá'¸‚G½#¶ä†ÝÞ-a–1šÍn¦’8É ŠÙ²‚¶‰œUHãÕsO;p³>Ìঌ\ø[yVTžÛúô˜>Äßù}æ4»©"ïö£bT.V…Ø`ÄjˆÓ•lv`0fŠÊRwÓ¸hÝMãÐ.d3;;%R0÷§FœçÄCô!…ı¶þÒ¤·ˆÍ¬OY·¢/öXàñbâéS—šYŸ ÌI€ÎT4bÆ›­Ê”w;Û%|þIoÈ·7NêŠú³*hf·È:¦§Óeƒ]i©m{{k¨,h•_ÀY%"àD/;žíe€®™ E ’d—G-qcj1â-e]Om–¹ö×ù®¿;÷± ʤ.Py»eñ]N°´¾ËIa_ [³É‹x43“$ ­ç)\â[¢†%#ö“Ô£LË]åîÂ~îb\_Ù`£A}Áb|iÞ¤§àUíïB$F‹Rø¸É!="YÄêù\*µl¡·@”6¹Ï¢'ÖÁ5ÈFm=Ÿ<à%ÒÁáZ\t†Üö“$ìA²=“q§Äò)qópms2įôÒ™ òWhl†`m~ÕécXÕ¬OÑû^n:‰C‰Ãm‡—ÓKÑ×Ö†i䨅|eâ¢á‚ZéØüÑÎßÈ\â¶Å¨Ç{0çBaIM7º®*ÄŽ40 ~bS“ˆµ3!PÝÐŒ£ˆƒ}²•nóy¼MåôÍí/Ùã Œm÷…w¤td÷…wJ,ƒù;²Òê©Ú4)*¦ìd B\6H¡Š>¤ðNª[¤Æ#:ŸN` M@þ¥Ç0tëóýÿ¸—„YìàψmÇÇ¥iÕòÒ$½mÖç#á‚V×þô’ã‚Öø}¾\pËôޝ’sf™u…л@Á›‡Áõê3å‹¢¤}Z¯Ï1ŒF OÇ)Ë÷g…ñ Ù+”îNNŠß±Ä“QbbŒo8Sy¡ZdŽ…'¾´w{TN՞ѵï]iôìÅ{ ÞŒ[®›§p)`p鳟qiK=ð>ç½`sgX8§bÆœ·‹qÞßå×VÏ&‘¾º€ñûܬÇG°Ô2 !X²­mŠSa¨5beG“âѤîväö¾u®SZx¦;š´ûð9)>š”i¦Ì²ÚLõÌwp`vp`íríàÀ¦É=#2ð*¾6+‹ïoko9Ñ~•zsm=ÛÜ;„SÚÙ$ÒÃ)ßç§<:œR+ßËvœ{eÂ)m·,VRöÙ_°î@M,P£ërna®Œ8ôW2|qŸ×Û6¦šòÊ 0( |¢û•zŒ²Vq•X\ 6S12ý‰X|¦‚ýzó‚:y´•ÛUtU¼òk&Že»Ú—5éÏ\Ô³>±ÍQ¡û&õC`þ+¨ dÈqÀ*‡#Ø€=ƒ4çÎíѧJ8Éó®©7­.pMç)ƒ5Êf@k„-ù.H…ÇÆ¨~¬* ð}›s øGøîÏ©< ˜ò±“*EÚø¶1·ô•ØÊLäÕãéÚ‹qhƒIH1ËØølâ ÔšÒ£®#[µAo ÞIQÙœµ".V<[­ˆ5»|3™úN>_b(|,vyزJNvë·!@Ùis·"®ÆÃAêÀÕR Ç2ê>Ó3÷y§ sgVÀÅ‘¼:Œ¶—ŽàÀ1ajG”$²Ÿ3ÈQ5ÖÕ¶fê6×½{PöbÛâù ÿnqR®é‡cʰ5ÜOàA\† #"?Ñx·qk˜ˆÜF×ã EcÂØ¶)ðØ:Àþáùž`ë ã+„«ÂÔ9 И-¶FDÚn‘o‘È ¬èæB­IT/¼sî‡c P]̑ȻÄ#À‚PD\šù5€t ?äžS.á.<9ቭH¼nÛ<˜üpkX@áùl.<1½1ìäpT G1Có`o™¶/nwޱVñ¼?Dx?°²UˆÍ]®ùm³‹ü7‰|ƒ嘘ñà™nnïBp>„M*[¨e‡!H…˜Âb_z§‘ì7ÒVœ}°ºÙñqPN œÉV4 [Çì7Ët¢ŽÖ2%("â´ø¦< |˜ƒ âÑRˆJ±`(…¹‰Â(o!­Cƒ•;tÑT·˜Ø3œqít"|êª:ºAzûR}áÉ8WwÔµó¸ÏÆ¿3Nzéöó|¦¸áHúl‡Z-Ý…'ãTFg®C¶puÆÖ²œ©õ4Rlóa;§*c+H6‚Àö´ìrÍŸ©É–rÛ÷y¸v£¢˜¼‰ [*o«(ØZ ƒ8xÈÜ7‡r&õ™Le7n&ŒFÙ˜¸cláÒhðšgÎÙ´¯Cªn¸õ|‚£Áª À…i(Ü|g$h5õ €„%¸ÓïýˆÏ ×ÎÀ9aÐx h‰ý3"O¼vÇëMìÑ(*í‚"¨Ÿ!¨À;xXÒàEÛ‚qƳiàF0=à©·o瘦2ÇQÚ^±”‘ž*ÐÌM•òõðõéÿVŒ j endstream endobj 7890 0 obj 5603 endobj 7894 0 obj [488 /XYZ 38.2500000 137 0] endobj 7895 0 obj [488 /XYZ 38.2500000 602 0] endobj 7896 0 obj [488 /XYZ 38.2500000 602 0] endobj 7897 0 obj [488 /XYZ 38.2500000 328.250000 0] endobj 7898 0 obj [488 /XYZ 38.2500000 328.250000 0] endobj 7899 0 obj [488 /XYZ 38.2500000 137 0] endobj 7893 0 obj << /Type /Page /Parent 2 0 R /Contents 7900 0 R /Resources 7902 0 R /Annots 7903 0 R /MediaBox [0 0 595 842] >> endobj 7902 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R /F8 8 0 R >> /XObject << >> >> endobj 7903 0 obj [ ] endobj 7900 0 obj << /Length 7901 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯à9€Z¬…KF€ÑŒÀ‚ä`øHq!6¢øà¿ö쥪¿jÖ«G²š]1l)Ãa±–·Õ÷¶·ûôâ_oŸ?ý·ø2üùüiWìÿWþysþÙM[_~Û}/¾ï>î>vÿý¾ë_øôüS÷·? YüØýû­øù—î‡_‡_:üÂo»F4ÝŸÿyýÓ4¢û[yüóðóïþþ—â÷Èãç†É\þÿ7ºQ­nÓ¸ñéï»q™âõŸ?¾ü¾{Ûo@ØWŒnjSB+]£eñ¿î~=¬m²§©ö¿v>ÕwŸwo?˜BÔÅç_»U¼Ûÿñ¹ÛTY¼é¦×Q|þZüP–¢ùkñùÛN¨½’­ÕëïõOäë“vßš²îœžÈý“ãJø«åóë½×ª' ÃãwÊÖú°4h<¼èQûJ×m3íIYýè'+ÄøÒ”e({ÿàðB¡'J؃àïáÙ·ð<šFOðiP„r¶2|øýç Îì$´(G©²µXª##FUÂV¼„Lø°Ôë#ë²X7ãõó5û× ºàÑ=HøÚ;-|§BOÔ|?1„wšðwä{8ëp´gøï5^Ü7 Ï6ï8êÕH«Æ9~€b ˆ=â Ï;¶Pàb}¡„½ ¬ß}Ñ–™õ[an³1fü38 ñð 2Kb–l«jÜ Î’˜½D ßéO£ H‡RXrEsO/]d<+¼]xnx#—2í*(‘ rïNÈñã)aêb’ïÒTOñ˜v¥=,·|7â’®É %ŰÂò -° •ïX>¬ÚOÀÝš¾„[Ðw0…àK†Ç{@¢7ÖÓ&ÙT¾C¸œá¹áÑ<烩 Ò¨gw”¨!ÿx¬G()8­-#ÇKtÙOÈQ…EY[ Ò†ÜRAö¶h´$Üã ïFˆ°‰ƒM) µas…Ëžè~lQ ‡=!¥=ì`OàÍŒ_ŠÒÖ7±RÀ‚J>q,¿Vö®bfgŒÙ(h%Yý!'MJi ¼îaJÌ`ƒ]@¦¤H*Ê=Šg»àÒ=t~<ÆÄÞÚá)‰­lS`½-h ɆQ*é(î{b‡›‚ýšPÚ¤ £MU艨àFÂ'(‚„µàMÁ’×HÂd†­¾A´\膩hûBèµç~˜Q‡Œ:ðSUF6‡:Ü5õF‹îª¶ewÊÈt¦~_PˆGG,âá4Æ\R´(÷u#.-[l(Q®+„He-ÖãBÇ‚ŠcÛEåì{’Þ:è#rù­=ìüèš0¥}ú«¡kÂL>}Nt-rÖU{}™‚2º–ѵtMÚì½t­[R¨¬¼öä =¹‰³DÍá¸Ñ»•œ.y=b! Ôf!Dê¦4ˆÜ·ÖÙ·é’—âMõ _„X/<ÚF¼¶ZCB±çR•Z…¯tˆVºLsd0P¦Ä¬×1Š àÙê*|J¤ÆyåjÀa;? Äžz"2)²…r•žÃC>Ÿ&ñÝÄÊÒÖ& Ûj K¨{ Æž(k{ÜY€k‚ú=1áx¶V»™46%§/„ë)×£åæíé+^_Ddg†8¶ ŒgC9 ±B£L»µå1«H`_ƨ ¨²'Õúª´Æ›¥â‘‹°0 .z¾;4ϊ“d«BÚHNô½¡5ªOÀ<£ÁÕÐU m»T<é–¹TÎÞ=á<6u«çYߌ‹•ñ³ÅJéî2E±Xý fÇöÂ#ÿ)9°”<çH)K¨ÖBˆ›$‰zÖo´ÎmE•ŠÎmµ¶o-ž9àÅ -|k1uk« Bí%Šü"ÝöðîP0 VéNq­{ö`º¤¦Üö˜“$ñÜžìepøA– úX¦âV˜=@Ñ›š`#ÊåF±:h™ 8¸tOºńϚãÑ–§ŠKU(â-A–sÏ>ƒõc#¼‡¹Ã…ÓÇ—¬gß1˜ï‡õ*¨ÕpXq*•bÆÒàM©¢T—Ç•„ᬷ†¶râUâXÙc#ºq)KÜÕ±øç"I v#ärbk "-üÚ¦Lo”å‚QÎE)D´·Å!ÀáZ±ÔWn•屵ȀΔûª—§É?¡'U{YWåèðwð ÿÚµïœdŒQ—! ~Ç ï fO½WBZ$dXÕ©ÔÇ DÂêTQÊÝA·ÌR+ÅÊ™SÍÉæX7ôª9^¬r^· ©4Ö¯€Äv/%ΆPñod@…癵5³ùÞɳ;7»Âqÿ9Èí÷,6ßÞrw³Òí¸¹!ènÏ A'ˆ3æ›Ò¼Õ&¸¼¿Ò‹¥dH&?îeË­,Z=Î77¥5}x5r¨l6|¸‚žm ë Aφef}]Õ·Ùø>‚f–4Ç;@fyn¹¹!(Mîn¥!èO1™vö°Ìò½’í%\“9«—]O !(Ö LôåQô)mc!KÃc50jÙª/OѲ˜som%UkÑ ‹V’Ú–ËD± ˜³/(Á¢¾\Iƒkö´ÝÃu8Ò¶Pö°ž¿·òOµ˜eË{عK9î.ÚË-½þõ‹µ÷æ°ðyý)ý"•—` ˜Z?Áoáj)uë(JÊÇRÖí•ÉSyMme,*¯i¦Ûzs÷šÀ§ˆmlÖÚ:í)ËI1âÄl÷¨”)µâ„ ÚX—ÇÉ,Õ xàmÝ›ñÁ·VŒ&eì?£ñ…ÝPŠãs¢Ûµª/)rÃ-WÏ»vËÕó}OÒ*úà‰wiíaïíšvȯI„–¤´;lm»©„S‚sÁ4KWä6‚¹àùsÁÜF0JÄöÂ1”¶Ññ¹iÊ%,Õ ƒÜ0÷Œ”/ÖpÎ;b©Œ}›ÛHÀÒ4Ó…ß² #W&”}å¹ÝåwÂTiÏ Ã9&‹‹[Èvº©â©/ àò˜×°½IÂ<èð){ŒÒý†R}óVý³°ûuÿ!ÇGs1íZEá(7üˆøïH`QVUÅ\|IÉU«÷c¢Ð©ŠÁRrˆ"XÊ!.óp*w¾zÌsò|Žyx ˜N¯qs,zÅÖ_‹7¥ëÊ:Kº±‡M&—j»/’—& ¾&¥ª÷² #“z†ôª3¢M/·ÝSPêMQ` ÞŽ°„0Õ>!·ý^óßɬ"55lc—!¥ÀÑ)w}OYò>rBÐãb”$¸ƒÃoµðÎFéÆQˆ­yÄ7F,(² Ÿ µC*øH‡=¢­õÖ(ë@4¼\ Øo ÂæpŒ"†£ s‹íÆ^rÜ$èÁHчfÚfŽ+–1ΰ¼xUsl×@±GŒ‡à€JãVœ}€3#2*•sZ¼{sZ¼”¸ ÒhÌHßÇ&vì/6fHf¥Ål™+£P?nÃ0ñØ,gإ¯r¾T]Y§ÈSª²‡½»¦žƒkdë »Z)…œ2ó€)3$OA‚‘Ä9Ýa-¥™îP aëœm¤;Ô 0‰b‡Õ¶2]Ê2ÉAÿ»~#/^mœpbä]©Xf0®UÕ(¤Vã% ‹p Æa˜ÐæÁSæÃ3x”=€Š‡›ÀM9¬ÌÓ”m©•f¨2C•Tž[ªlqy‚a7ú™ãÛç«­£íÕ³ ”Ê–7T‚n_2o¶öÚx‚7a)6&?Â0;ÞL‡ )@ÅYñðcåöâ.'4!'öi*¼!oÌ =Kn6å2F-Ç]ÑI ËY„,†R%.Á hVèó]0 gÅplÖÌq¹«âÕCÝA‡÷r Þ:x,­Ù| ^ãXÔIl$ LWµ-áXKr嘰F‰;ÊCï<ë(s@Y(ã(k a®ºñzQb:CuõÃx<=Ö}&»žÐ“a««½trþΰÕ×Þ1èáÂÖiÔž¦ÎÞ95B0êòIOT¢OaÊ8Ú »®}Î6D÷\ žÏ7{ÄÁµwzf¬÷JH‹ºTø¬ñ uœ°ìízÓ9o!ç1–%UV¤ÔëY]þ‘@JmÇ¥>–Û«û™û![Óai¬IÕ…ºÜüG', Àð×%Na`ç²ËÝn:R¼¾IFÀ’6âxZeŠc¤¡¿ ǽomG±Ï‘1×”úçÖŒ¶¦SçòË0“¸‚P¤ÛÖô8,‘±5O‚·;¾QcÑ/O*mË­š±ŠÑúùMÌű)MÄá;YÎóÊy!Æ"W÷X€šÁe)¬màéΫía™Å…Ð&qáI,$°¾§ñÃ"°q$´ôÁ”ÓHsŠžXÕF;^X=þ Š ˆßXÈXöò„F3¤H$J=dÞ ×í&B„â²_*e„„’SÀiÁë-wuégñ=ðvPÂ(Y»”oJx3þ¡¹Œç™r)‰F  $„çäëSÒ×'NƒZVÍå÷®µÚÌu6¨ËlPÏkPW?2Ôö°ÜúѤӬ€¤´Ýôèî¬ÑrCNVòXµtëÀ)0ŠÒ­Ž‚EI&!%lÜJ'ÏZ}Z]5wóhum{&‹ü`Ÿ söÁe0¶ùë d˜,Ãd&‹¾¨ºº¤¯ÙÍ2^ø*û´SX¾Ò¥¸üÞvá«l6{\6›·d6‹»™Ìf{XÆÜN£u:¹žwp–$ÌDÄÙ‹ëgIâ\HÉš)ªðÉöÏ@*4ÏÂŽÂw<Ù¿øäpFêûðS/£Î°³Œ=3€ë²*Âr|Ùòhny´Ì•ò(μ™¢¬¹!NÑR^û`ýRp'#Éa˜l‘l¦,¬ÕêÉEÔ eZ:¦Õû÷¦eÄ>Kå.“j`­s°Íš‘%—úf{gJo §Š–sàçæ«Ì[J¿ ‡Ûc%ŽÁ8žŒÈy"ô`â„' Žîá×0ˆ‡AIüBǬ Wò•U5"êtÏ›œõèQµ˜—±Ì˜YXj<'}§a5ñRôö±K ô§âm*ÆáàõP¯àodªÀ ÇÒX–W–x®Û¬½ ò}8ßm/Þ¹¯>J¾¾óCŃ3Åæ ÎÆ\ˆ+çFùóIò6¤`-½ê!5l.Ú&S†(¶ù’Cµ¸5l¶QW´Qg.CŸ²iº;$eëu)k¢5Åï—ͤ b/#Ÿ@|¥(a*;Âí q¶ïƒ6r¨ÏàØGÑã¶Ö¸ÙºJȺâÁ>›lB%mBy²“q5eJ³²…|n¼µ¦г&`n ­ŒÍ]*mùÃÑt›äŒ hM!ø…:zLÐSü¤åÕÚ¾ Š7ezQê{ï£îÃÿJÇ Hÿê§VÏ’ò¿ÍMm­`µÛBSV×73vXc û@w…ôˆŒ/Ã)¢‚ÛŸP°Ÿd@è{¿„XLsÕC«, Ï më‡ä{\Î1Ù¤ëlÊœ¶P+(ÞïD`$ä&ZGb‚£PQÂ(þÜÙðuy¬¶õ0ÁªŠ°tI I}œ½Æá¿çÁªÝ?Å÷Žœ{2þôüS÷·? YüØýû­øù—î‡__éÝû $L{½ Úwæ\7ÃBêqÞJ‹^â7W8¿?!¹—}. C=µûD½ ïÔN®€ÿ}GÝ2˜®ÍíðRäóÃF–>M©„“ó:⫬ˆ¯,CàÑà;ÙŠ ¥‡õë¾Jp‡¿—§„q¸w ® “€ÄûI@*Hìïyâ½óœ8Þo ɖz A¨ŸBPžwð °¤Á›3¢Ã³žeàA0=ॷñÓ”j?HÛ Ö2RB4R9 oª”ÅÇÝÿ 7ù endstream endobj 7901 0 obj 4717 endobj 7905 0 obj [489 /XYZ 38.2500000 658.250000 0] endobj 7906 0 obj [489 /XYZ 31.5000000 192.500000 0] endobj 7907 0 obj [489 /XYZ 38.2500000 658.250000 0] endobj 7908 0 obj [489 /XYZ 32.2500000 191.750000 0] endobj 7904 0 obj << /Type /Page /Parent 2 0 R /Contents 7909 0 R /Resources 7911 0 R /Annots 7912 0 R /MediaBox [0 0 595 842] >> endobj 7911 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1500 1500 0 R >> /XObject << >> >> endobj 7912 0 obj [ ] endobj 7909 0 obj << /Length 7910 0 R /Filter /FlateDecode >> stream xœí]IÛȾ÷¯à9ÀȬ…°Ýí90l ‡ ‡À“I0È âÌ!?l©¤–ŠúÅO¯Š”ÄI;®f-¯^½}y÷Ç//þù[ñîã—ÿßÂÏ_žÊMS•»ÿ¯~8þÛnÂß‹¦­Šo¿<}/¾?}~úÜÿï÷§Ý_>þ¹ÿÛÿ [ü©ÿïÏÅ_ÿÖÿãá—^á—§Æ4ýÏovéÿV~¾þû¿žþò»â××÷Ë…Íœþÿ|ã[Ó½ncdéïOûcšíŸß¾ýúôn€i«t¾«][ï|a:o‹ÿþãé§~ýôå¦óÆ4µoÊk2®Þ.ո˜Úöp¯+mÿ(ÍoRÌÞUMÂÙ·{׌íyv nlÑUeWUE¿bÿ®ÊNõÑôº°¼¿X—lòÝÎÕ¡ÒcŽ‘gß´uøü;¹vû 3[õÁ›¶8ÐÏSæÀ@ÉßwáÃ_ŸÞ}ê S_êa²]p÷ãëö.~x} •+¾þXü¾,ûCñõç'c6•¯Ûž-¼þÞv¤´Û‘vÓvem«òhÄoGüÆ»9Œ˜~ó²©6ζæt¤ß´»‘·øÆ›ÅÓÃÙÊj;âö0¹äè¸àÑ…]ãujÄø¤pÛ¡u¨]ã›sp6|R|?ø¶ñÞ.G3êZT/ ^ÎfÞÇ@!îV÷³#Unà×퀠 æãoZ¸¼·F2ÀW%9ˆ! õná—¯=ûLÃù*ã"Ö'°1x$œpÏ£Ÿ§_«ý@0l|á FgZG ! 2|9ÄGÇÄ 38e¦0+ ÛÎMË•e"¼7Œþû-ZÔ+% GÆu[rÔ”õ~ÙÝ¥t›ínNŽ×ÁüE#Æ£ÛÀÙ>³;ÚÈ´“~€#Ïpõô½aèÞÃÐér"¦­N_ä4$ƒæÜÈËôu„ˇëW /2/è뽈bðñT.¼;å—_¯ £óî0 àË}«JèWbÊŒ¿a'¤˜ºçÑÅ[N?©Å»f0Œ!pDx%r’¡ÖŽnxx)³ÅÃ:DRb^?N¸‹É7F?È…[xgÃâ „A…a¿v@œgÑ$r‚[[šý²Ï9—í,Á/KxøÝUE†™íÞÝûYÊ{¨Ú‡Sd¾”¬ ïöÆù ’ÇQd´PUdð: àÒªç¹Mu…ƒ¥«+©F7´ª+¤®"ƒÌ7©01¤Ø1jö]?˜š×9¯®æµ…éέiëÝ’Ý~I³{ ¦ÜT;(Äxpf$Ü\µ±õn(fnÓ¾©á7ú¦th$€ð܈ C mÛ~E·7¶…ª?Yݘç¶*…¦á›·€¾RÁ¹ÕØ_ü88²¿T»º`ìË‚qìÏ\™œÎ:±Žºq~ƒÍbÔñÓÂTcš„§ž‚n¸"sýp%?z&<ÊíåƒfÀ1˜˜Êˉáú‚#gKÈ=}ë#þI‡A ÚOÓe bx¶gx 5  bfU—\±a ÛUqL“a|ÃMjlªMKcÄuã Qoás› Á]ÉîÝt ŠåOaaÌyÞg˜ Î;½ &±…‘¹›]®²‘–ðµÛ©ËŸ`rÀ“uj"Ösžˆ%]³Š×¼‰Ÿƒ÷P €â… `b"ï~4EbN…'à¨îS€`¼RKÆŠ' ©[üW•û•k+„=e”%6–Z÷ˆb¬±m,Çú "°^”Ðë´@M ×Pïc1JèÓüSx^ªÃA8CuozS,ôŒxfÝó`¤ÀÁHØgÃ~0ƒÛð¡bÿÆÏïûÎð:‚ï€qcÞ°7"œEÀQÕ[ÀÞ;Æë)@û„‰‘`kJÈ‚ncʽ#ÏCs)c,’ Û$“#Ψ¾³­—“ ¯›Ó«QA¹žÁ¼¦Ñ× 9§¯HˆnÄ¡; + ! ‘kš†ém®5Ñš÷â;ÖHmîžPl©:³— ¡T^\<«ýÄl®ã Ó­Dh¼‚°äcó ÅØ°@€ß c5›ðøu¥Õ’DŒÕlJµšÕOtæccÊà3óaÇ¸Ï \U6’³ŠQ¢‘VXìLx,Ž8¥›ÆUçÅ®äQXʪábü˜”0ES5ò§Žw¹\ÿvBb£i"2™Mk\°|™ÀDƒ)AULçœ{{»Kn»3¡WËÝ—ª ì?SjI¢3‚]à!yä̈©àóÁ# ¦j‹±¸§ô†ÛX%¹;’:AJN&œK×7¬ª*\AW{=Ë®‹ÕéGðzšªÅãL Ж¨çÝR”ÛÐ)•Ñíb9ÝñœnlÊÄë`»~Á™NÊ®W'Á#¹„²Ù–mÝœ²¼5£êB~1oF•iãûc2ª˜"ÅXhš3;Êú.Æç{7*ä”\éF‘I—G $%ìRô5Ôâþø*#Eá`¡6¾SœJœTh¦€‹¶èVbÈ%3c]c"°Ê%_¹C§U¾ºEùêèþ˜¶Fªö— _Ác•¯嫦:=nrz*Ø>1/ÆÂÚ²JQ«µJQ™¥(\å 31l$¸M™Ì›ƒi{•ÉnP&;º?Ì0QÁÍ•pàð¬’WyþÔ«ä¥!yyßœ7½ä…é)æßª~®UòºUÉ+lß•GÞ"<ÜŸàÂOsÏõ áóÊ=õ¸ge²'çâR·ÉÅq×È’U‚x0 ¢ª&ÍU‚¸A âíþ°Â"˜áA¶¨ºÓWÙBQ¶èrG  \ Sg8â¡4°jæ÷ÇW—lõî÷­ÇçÁ¹„4½d¸ NzUÏ–Ú…è´\r\m×á[–ãŽîišƒ£Q0)\€·äèÔ"“%-†-à™+ÛâX_ F¬ Ï5egŒº>gI;€ p[#Ç>=\Kß»öé$*Ä£ŒÁ¹hC寿YF½Àb?6'ï&\uþb¤ó‚™’ªFßBZ<«ëXÖŒpÄð)ƒ#PˆøäòQãºR£-ÖÓ^]j‘/éêÖº°0ò’úêZ“•Ñ«ÓMñOÜE¾Š¥›ùÏfáÞü‡ÔˆÐÙÁ“l>§Á¶®>ö1î«å¾ÅnbìŠÅF*lÔÁx°šrïΔ›Ï´Ö­Éa7mZ{»?"‹*¶¼ÓZ·¦€%àžÛ{‘1ÕÜ™t.‚jââÚÂ:ðqä:©˜µ6’×n$¯zs¬qÂNr‚ëPnÈw¸ÞX#,}ºwŠ¥O¯ù›KËYêàš9b- b„=yÀ Ï&Ä79ÅësR)Ñ™j¦+øÃoºí ¤®Ð{A·ÂË5bO(圫Üåíõ¶­œà4&Š¡1ÌgN}ÌU&&@é]ÐUß~Ö•ß-Ó~3ô©jÔrmóyn$WÝò´E÷sQw¡A.ÑVZ8* H<=®Ží}Y|ùm=}‡N±ÆOè%s–Ï®ƒ¿t@d§Ùž˜òï‡VnxK”™Ÿ­Zþ¼u硎PÕ1¿Ä]~˜®8ñ³­±¦ã‹Äh•f¾B—$ÕîíT/ æZ ·(èЦڔ;½°÷p¶¬lì~ˆyÌTs- F¦åò!hçÜݲñ”¦ ñ¯2ñ 3‰¦Þ¯Æî…é1ØŒ 羂W»”FD‰=64×»HéÆ<èФ,¾Ø›3fYNÙhÅv±}"qا ¢b…ÙÍØlL©oŸó·¯›ùá™: ~Bˆ~]™^q@ç”ï®s1ò'u2ñÞgŽœ¶.†ÞŠgÀôiÊóx–tM¯©’/€EeBŒwÏHH æ™K´SÆ Fù´µn~v~‹¬… >uúäìS ùWØ*58ñ妜!` Çø5–œsí["Ä1§|R!r› u…zÙü€kŒº¨“µoIkxËÞ2M6`Üù‚ƒŽè¦|3f|ÁmK¼3²G®æÓæ}Œ2*ªsЏ§´ª³71…|‡¸E(ŽøÂ-Q1=ù(Àç%£lö'xm0ܦÌm4Р/ŒÇ\ '\Qr¸“Ä'ÆäA¡ÁÀ‡¯O?@âLrb.³ ãÅttJ4rÚ8Æâ§¦Uð)¼q+W žL \¦/ ¶¾§OömÌÏ84!+Û^UÜ®„ 5µ}s\`67 å˜^Fwš`¯Õˆ£¢äxƒ KY½*ù¼*Ìr0MXœ¨jcµ‡È]€ Èà-¾M o—a»Rìì[÷6&„”«w ¯&m@6ƒOwH²NçyeZiÞj3’&ŒØCÂØóA0ôÞÁ»ÛÒ¤ ü{±=iDÀ*K¤ #˜Féº8&@I5åhBR-cS›¢)3–ÛË ÃŒÝŠbÒ˜úðÊFJ~×uÃSNË”ÝĤpëè&X^:Gd ¹ÅKöLs4òø¥°q_yÙŒ™R5•] “äÎh|—çÎe“ƒçºAA”` ˤºæÏM™sòºÅS¸Ä?³¡á—WjZi}B^­Æ»TWa§kÛÓ âhŸIBWfÃq$NÒÄŽL\Î[u¡ Þ ¾aö¦ kÂ<)–¶4á–÷tt¼ØÿBÇõáÙˆ7ƒPéz ¾æ€Cøñˆƒ æóà¿­—C—q°NÅÀ•ñJŠo«b°œ¨¯ŽyF…áa°xìóÕèÝ •q¹`|:"©G™^â¤bÌ®7‹eÀLç©à7xc¹µö9àíG÷³hIzÁÛáàG(3)ÓXF–‡÷³ŠÝrMômGWíÅ”=|˜þÚj9)ìÔF…Ak¾Iýó6uýlů®·¿ —ApAá›L\¿ÚpA,#dà‚rœ•1ÝÁíŒÅ8zû—˜ˆ[Æ ry1 ª"b®8+œŒÍ„#2³a—ˆf)•+¦Î±$Äü¨TCÍ”p¯ì=Çþ/ÕÒ¹j[(Çf,/ÈM(-–+wc¢¦wµ…õçK?nùœõ{UÏ|:ð,öªÍœ Ю7!ùè›~Ó¡oB2©iPàË™ÙÜ[xlçö¶&ßÄ‘ÓxÀÑ›M×^¼Žëà`è{Ãçy™¾NxuÖL¸aø,ÜÛ3œ­& 3ûÍá“ »Þ«5C²ßÁ—_p©&6#r vÓ wx6ápÄ$W ÚÝÉ¡Á>©²ŽÔÃD<2ÉM7,ˆ£ã„ !XŠáÞLK¶4U+‰PnJ*¹Ü ݰÉÔm ˆ÷ËdiŠ Óð½#(ã„L@Õ²AºÑˆ‰kígH¸F×#>÷À¯¹gB¦’¹/O.b€Oµ@$8-#²$nÏHYTTÍ”0ÃX{®?ÓQíJëcq%ò¨0\—‘ªsuÀJΣ:SF¸˜&íZ >åXdÑﺈú.åtM¿¸5ê¦6vçâ*³ÑtÕ—ÖOæ—rjHÞ’xoRÎÖÁú œMСƇ ?i˜ªúãª;MeßAwòþÐ bÕ”(!¦jƒ^L•Úù•¶›ôš?0?g/¡é2Ÿ™ž¹¶‰Ú”ž–øW±S‰éƒ ×Yrnñ|¤Gwág®ÑN9ÅœÑøTó²ŠÓí¾ŠÓ’E/¡Úf±éÞb.† B%÷3(€¡ä0 ¦ò¥A´Á;À@ö†×!Þ~ Ì„[€"±ðx[8Û’oŸïúÑá !:žY ¼0^´×S§¦t›ÀÙNÈäG˜L~xü/>?ý—NQ! endstream endobj 7910 0 obj 5058 endobj 7914 0 obj [490 /XYZ 31.5000000 470 0] endobj 7915 0 obj [490 /XYZ 32.2500000 469.250000 0] endobj 7913 0 obj << /Type /Page /Parent 2 0 R /Contents 7916 0 R /Resources 7918 0 R /Annots 7919 0 R /MediaBox [0 0 595 842] >> endobj 7918 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R /F8 8 0 R >> /XObject << >> >> endobj 7919 0 obj [ ] endobj 7916 0 obj << /Length 7917 0 R /Filter /FlateDecode >> stream xœí]KǾï¯à9€©éǼ€ €V« CArrä8Q|ÈßC®ØÃ¯ÈþXÝÓŽö®·—3ÕÕÕõ~¼ûã翯þùÛê݇ÏÿY}¾øüT­ÛºÚÿ³Ú~ýðý/l·~^µ]½úúËÓ·Õ·§OOŸ6ÿýö´ÿÀçÞüô¿•]ýióïÏ«¿þmóˇ?ÚþÁ/O­i7ßÿ½ûÞ·fóSuü¾ýý¿žþò»Õ¯Û'^7súÿ?ø¶nûj Æ…W{:lÓì¾~ûúëÓ»=âÞÒצñίLïíê¿ÿxúió‚Ãã«u× ÿÀŸÉ—w›—[_oÞëM·:óæÞÓ6¾­nÙbk·¯©ÍævóS_´ûRz|‚‡7M÷ðäêX1®1òÓ5·un ¾N€¡ãÓS ¿³mº‡ï ×FÊáháÃ5O¶Û²¦zŒOýãã<¼ïSÒM·Ã®2Vg‹Ÿ®s¸›÷l^ã\µalfÃÝlßhïãäùº'0<½îÛ„OßÁ®»úÜÓ?Å<ƒ"j-ß„>yz÷Ú¯L³úòÓ²Ý ÷ß¾ìHþ‡­ž²a6_~\ý¾ªœûÃêËÏOƬkßtmnûw»•ÊîVºu×W­«ïVünů½Û«ÇSÁÏ|Ü­Ôkg;sºÒÂÏtû•·_|@/Æ Ù>o¾Çv‚z·âx¼jë£ Âm[wÁC„CMW|<–„#mЊðxNæ%]~[¿n›úZØ„Ä8ÀP¿Ìà?5ûÛéo~[qð3ð(1HÞt‰I¸$û§}ü²á’·1¸¡Sç:0¹% ¯E|Õõá;õ¶ŠßYï´3Ç$Ád…‡`*yA ¹çá"ºáCW¬DpA£Eà"BeâyÔUe¤#–g×#¤€¨C( )ÌÔ§×|&Wtr‘3¥jé êEuÌÃ4ŠÂncD"jN‚b?ãðíÆxg7¨­ZÐö±çQâ÷iœ9ìá øîÀ<á] \éÐJõ®ÔhÅÃ÷T=\ùW \;µ5Æ›ýˆVJ>ƒ1úšún.‹¦iˆZ\1rG‡§/Ž‰äŽ‰=!šjÝ´æf]Y ,ñ)@„3%HFØÏˆ"¥v*;hZ_ â¬Þô!k5á–TIòOà+‹ _L†ià÷`C„p¢.=¸"܈7”ëŸ|šà0˜œ©ç¢l&þdò™ñ¼0¾,µ.q]­+ÇÀÎiP¶•½ƒ¥‚f6(‡ˆ‚ FØÍ…·ÅÔŒUˆS³uÝQ‹©¥%` †p“Q€±SUÅDfm$m(Õn,ƒÓ‘>”jÛÑ; kÚÕðæÞ·%É«š)CÑMžö2àkð¬p2Bø[Q÷É9o‰Vc2bøñ%GXJ'Æ –¶>TnF >Ùây˜Â±ú³v°xÂÆ2f5Ø-À83p~Æhh ‡AŠ õ‘ ¦jdR¡Á´Ðé\®æ4RepŽÉ\×\zf.É?#P¾¢ˆO):Ú:1âûÁˆRÈŸ1RÖ@8‘)NÉ&Ò»„´B˜07täÈ–R¡Ê©*$é`‰7Әʰ¶É@ï¡ìU 8· £®§¿Õ̆" /ÚxŠÈ¬ãS¼& ëö® ÄNÂΦ—e2HtINpb0)Ï ÔLdžðŽ^÷îŠ+ÙRÅPW€@dâÜŠ\²P&Óß~ «`Úá,žÑ%!4VÉ:B‡[ï.ê Sw ÀÄ„›ÍA8º"4ÀœY=8ú-LÃÆ±dœR-D™a,YHÇ‘iÇûÉ5w0nožáÓp¾ÃÃä |(Žv ÔÂNqÎQ’ à€È-rXðÃïñÄ-Áxƒ°á§ çC”Œ`²å–tMAFY®À÷]ÖâŽ5&?—ñ·æŠÚN,Yu™¾_t™kÞƒµø4A†A¼Y,È"=Fº-šQÙ;Å·$›ï]} ̹º-UÿQ’÷ú–6ÔG>&JJxoÝ)§€êÛãI?Œ€Â-“¦ñ&`³9;‹ \á¡Ý(þ3„‚UGX[ãÌ'"k"&`‘³‘rÖVþÐ+åqä¬ÁïË¥¥'Ë"åô¥>¹lR®mOI|6RîÚ’=\ã˜,âΘC%÷㈻¥ÑXÙ¬~j…šñÝ)‰ÏF¨-=Ïf.ººCV׉®¥¥É"Ô ß)¦ÑlBÍšþôbÎG¨Ýgw•»?râ³µõÒià-F¹ÓSÔBhXL‘NDâþR£y#o*¯T2[{PL³LýwÁ“¦«ç,8óÒ{ôžÊÔRJËÞ‡âR¥Ž¡[F®1ýF‰~#ê•’ùZë¨.ÛÕ¶+(;d±%L”Áe=ØE·¸wç×–un¶8S:£K£¹l~gãL÷`ž±ùg×]½@Oó¤½)¥6¦UЉ@è ‹b.»M}9lÝ»¦zÙžÌtM9iœ”²‡Õ3" (ôX‚vTÐN;Ù”äþ˜Â¸eÔTfª¸J_Êl3‰¦kË´‡!:”-nÜän\ª¸ú[©#J¯÷&älÌ)^¯~ ›%Šfc¢w3­îÑáöº¾¦ê ógÆBÅ]EÓö”6Ó;-­ô¿S)–+ëf„ÈLÍTu{fÞ3K.ðº¦^.}ö®>ðáÁ÷`µ\PØUD;á[Ôó¦t+ëÏQšÙkVÞ]ǯGCc¿…7ü¼G+Ã94ëÁs<Âé¹Ïôè3¢¬]7~‡·•}iµñëÐEm.ûÅ9 þŠ;ó Wð~ç”éÆPcöŸi×}@=(Q ·áà{„ˆka?5„úž)„ ‚4:D<Ó'‡úþ Î>&¤Î˜¡L¯ÊÜ“A^€G¨< ê-"ĘdJ¦§<£>Ž¥°šO3æˆò¾„Û`†Ï<ð˜¢éoMÌd»®}y˜c‘AèÚ6à‹áw9$KÊJÝ×!^‰NeÎÃi.ø3x¦Æ8õ §ÐÙ‡™mÚCmúPKÄíw–CÑÌýxè˜CÍåMNK< 9­‡ yây}dâé+šiéÇqU!Áf LÔ˜2éa"3eRЮoo+$+â!–Øú&ìÿ1ËÙÏGµµ?Î, ²À10x¼äló<œ‡Žª˜«5®-À}nqþ>Nö‚Ü]§¶x?;LBîLKTí8LopÅ=g¼g»|3ð >BJS7×㨞£ ©¼hÒ˜î îæ,ζ;V£Î,m:[,gtñaò‘#'ÄD1õá9Д}ôMU‡8\\'É/«®?“ae„‘9Jeß1á{ºo/cÀg˜Ç”?]_šÍ›@ðX•$ZÝÈUâ>2á#²iù(@JyÜ÷0“z„¥¬+ÀÆV‰ªÓ&I-ë§/Ú§ºUa56Wô%iÎÄÇSb Ürl³(frn+[~mzÀqõi—2dÎå}O1lBí)®qÅ+0ÉâÏÀ¼6‹³‘pv®Äxðç#ÀFdq|¦˜BTq€3z1çßa؈zH]0;](QqF#î*ŽëÊyºN+?ê¾ ÈBJE“’O£GG¬(3i\k…‡¼j]8ÿp7ÓÒSŸ’ø™âí²°\DÃ<èÖŠqD媞»Ýž¥ØÔ6U@í¹æcX5é‡.²«º`oO§uû£ Û%PºÆÇ";îzà+5jÏÎdI1mÓ™ÄÑÉÓ'òÔ°·áÕ(=¥O¾½“ \kB •M›¦£\"‘«øäáez.ŸhÊ^½ o[D3ODÄ'£ZŽ£ÐjDÍT,åj ¦ó}®(óôéíªxc 7Ýt-A èržLesíYLM·ˆèúF4›ÖIwèæD –èˆÓ§L54]h Ýa*c¹Þ\M®ÞëBW…®6…c÷‚R’©l>mÃÞUW_DT‰mÃ'¯O³3‚l#¼ÅÊUÐY|š&¤±\ÓjqèFè”}8Âô„f¹ã>-ÄÊ Ý•{_Û&$‹ÇKìÇâp?c4y÷ÄÚVÁùùX°í_Mhˆj^ÁHú0|„/>Cå±C7é(+‹r±hD¦“”¡Å ß=%!7ìœ íb|’*a1¡DÀ•!Ë7Š¿$f“ºUT¹<·sõØeÛ±nu{D<”T”171EA÷C‡`öQ¿†[@eÆ'o0yðAÕW„.F»¼Ï\‚\B*•bRe:²EÈ·G½^]Ä?R„²™ä*Ræzg(ÃÉ•­©´~tJˆÜF†jl¢Û'“qÜ_ ¦ô¯ù.›T¬:Wí§îœê•‡9Öˆ<±bzy,%S¦ Œ¸…ëJäb0MÙcêetª®ï>³Í¨ÙJ—KÐMèEP‚.TâÈQ)T^à‚öû,˜ÎVógíaRûGê€;™SJ¥½Û’ã/B ‚üb"0ñé’SÒÒLUù<¹Vº–tâ²1ï>¼dneIñ}ˆ÷\!FLpã1¤Ä·)D2™,™ÜCcQŒÏ –UÛ€ã-MËã;Û,<~¿yŠ÷-³ž][-UKá#éM†¥ø<úgðì4‡ ÀIáWâU>ØÄ"2sˆLkªï÷—,ÕIùº<²ÂÍü0™¦Ð—I¤®»žH°Õ4. páM˜uáûP€1Â«ÝøicOðõh×U²÷ñN\¨@õþ`’Ù m8—›O×}‘ܧۄNeÆeL„e‰ì°³®<åTáÞö経 ãP¿;ë,Ò¼¤”&JxèŽ4Žh!”ibÊÂLJ|hÀ[.’ãÛŽLrÕ¦Ê%e)EŸ`wô òæJJùç0© ñ—©êñq«Ÿ¨ÎÔÏè2g‹•kÔRé–NÝUÓ°’31Æ£9‰T!¨{=(¿xò¬Å™ûZSf£ ­¥ß_ÉÕ.wåêTY(#nï+po­g ]!@}·,Ã^aœ¶_°5„ý:زC•°-Rc7tÞ%\NCÀ†ñ†-(ÜRÛpj¡d7µÃO»Ôº.ŽŸs^´Ú_HX™ÞQ0¹U蜸°”XŠngË¥ï'¹<•O@$ÎGw*ÖôK=·Òç-­K#Z°7—`žL‰*£#è^€\d.ì”бñÐN±ãÓÆ;ÅŸ!h‹þlÂàq˜g!¬«·—‰yr­ØãË©ª#Pì.“þœÏºJ-ƒ¥xcn Y¡Ê¥•LÛs·ÜH7Ü“…á„5ŠïÐ}ªtº÷[ðÌ`àéñЕ'x20và{nàJ2¨äܯîL¦ÛáOÌ5B{нÛõâ$ìË«Àg ¾_TîkØ*¾8>WÁ‹IV7V§?Ê¥ˆ.¤R X9¤(C]>ÅgbÅM7kS¥koÙ£fGÁ—M8(H6UCN€@mšì¤TWÍ„7eóµú¶Ù‡¸ÍO—þàŠ\«îlñ°qëÊlËøVöC0hôç’G÷Œ²=“Y¶¿Pvm÷³BFl·¯¸—á3CáwÂ|Á¹ô¨ôw)uël¯ÃNÑ„\œÈîß@ª °fØúhƒÃÇyÎ8oñÌ6 ~üÌ ÃMÔÖ¿#[–à¶?o >4ă{Â$`á¼ 0Ic<|„„û‡€fxпncH„=GÉHC‚dâˆb¼‡/"\ Àûén¿måÖ½ÜÈø„ûðVyQN|Z}zú?¤ :œ endstream endobj 7917 0 obj 5256 endobj 7921 0 obj [491 /XYZ 38.2500000 256.250000 0] endobj 7922 0 obj [491 /XYZ 32.2500000 706.250000 0] endobj 7923 0 obj [491 /XYZ 38.2500000 665.750000 0] endobj 7924 0 obj [491 /XYZ 38.2500000 256.250000 0] endobj 7925 0 obj [491 /XYZ 31.5000000 707.750000 0] endobj 7926 0 obj [491 /XYZ 38.2500000 665.750000 0] endobj 7920 0 obj << /Type /Page /Parent 2 0 R /Contents 7927 0 R /Resources 7929 0 R /Annots 7930 0 R /MediaBox [0 0 595 842] >> endobj 7929 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F1500 1500 0 R /F9 9 0 R /F1701 1701 0 R /F8 8 0 R >> /XObject << >> >> endobj 7930 0 obj [ ] endobj 7927 0 obj << /Length 7928 0 R /Filter /FlateDecode >> stream xœí]ËŽ·ÝÏWô:€ÛÅG½€ €¤±d@°€,‚,;N`ÄF/òûéžbõŒXuØÅ3—du-Ø’‡ª*>.ï=÷ýí¿ÿû៿¾ýðý?¸ß?|ÿÐû¶™þ9œ}óòz8º?ú¡=üðË×ׇOŸNÿýò0=ðý‡?Ÿþô¿ƒ>üéôïχ¿þíôÃÝ_:ÿ…_zÕŸ~ÿ÷Óïc¯Nj.¿Ÿþ¯‡¿üîðëùóçÜd¾þÿolßõ:Oãʧ¿<ÌËTO¿~ûáׇo§ ˆûÊØšV냲ÆÔhõá¿ÿxøéôùõÍq´Jõí›×|H™îü)Óœ>¥:}Ðc·øÒÓ/¡÷«ooÇ>áÛŸæ.¿1ú4éàÛCçþ&¿=œ?ÜwæD]j8,HK‰K«¶:ÝŸ¿×˜éÙïõúüÁ±í§UŸîv3Šn¥÷zY"xz¹UMöòiæâ»r¢^|{šc¶ºUn«NÿÊŸÄóë¼ÜÚ&ÝËŸf.¾+î˜ñÛsÛõÓVµ}‚½º¼=ÅAtÚ¤{ùÓÌ¥7e>dôòDgÜõmÂ3¾¼=Å1ô&!›xšyª3†/—|Ó †3êHv²—·§Øü¡¾ü %:YÿåŸb^‚g2ýh$_¾ÿüðíÇX&bI.ºÌJ+%ŠS"ÆzPla ±<]§•Fgƒ 'Ž*)íš”0Ò¢Dg̈0“†b+.ú£Ô¥ÁéõtaºÖ_@ßµOóyžÌD”Ãq›¯GÜv˜ck»¡o—$>øÔcÖLñ²/q—`mŽ=ÁS"Þ†w‰š›ñ—_â´¦¨ª÷›_ïtèöhô tøxðIv¢ÇߦøÌ‡ º˜w«v`&¬#˜11–\g¯MÈÌÌ8zû.wÜè›¶ñÏÚé’+ÄGñø6† b&`<œaxs ü ž›ÏJò /cñ’Û™dq .T=ÆŸ¾ãkôw-&—¨ãLð¨[Ûk8˜^>LøÞNЇ2óR_7¼†ß[†™‚ àMY,¡ob _ÈV»+bn $4‡v!4áÆY#Ê´à3˜9ÞÕíáÚqË"øJ }|³0éçBý·óúÀÁᥧUPºp–*Õ»^×ñ<2ÁÕ›Ñ|½@œYéyhË ¡ Ï6 ÀÅÀˆ›†™Ì4¢Ô<Û-Ë ô‰°F8ëÊÁwoÇ*‡ó³^3Ò ³´Ôº´”‰s3Ç‹GŒòîð«FT5"9h2ðeÜna ˆ/§úÄÿÑѬC*/F”˜þÓ7 ðTãqW·{˜ìñUY#Çô&ÈÖ_A`KShS)×Öþé,.¶žÁû·+I¼ Q¬›2GV±’Ÿ©cºÝ›VŒÙfV@Òš®zë3¾êgËáglçïû-û)RîÔ¸ Ðʘ+ÚÞ%Ú6rÙ m«fa̸5¸­”ò— ‹·+F¼5VDh »6ÇÉeŽÀÛt‰úfGØíÎrgÓ#AÝôÞ)Ø ´Ø.ûâʆCÁ+€õ$ü¶¥Qa; Áœâj>¬‘5Êç‚5È%ê\ Ì-‚2E¿„Ñ„” xñ.ED6çˆbÂm8h»'žØÎ™˜.iôÌùì×.wý¸tG†¿8æµgFôŒ»—ÊQýïáÜ4z¦ë ÌÎÏ?ãdIxnߥ–†ÎÕ—ì£òQ8B ‹cZ)‘À8ê˜Ð»¼žIÁŠqUd: aíé¡$3C\ãÓ*al¹(+Ðv#ÓŒGìpàŽÈ”.p!FX5ǯ8!‡À ¨zÕ”P µÚø‰8"Š)Ö &dL$uŽrŠcÂÂÍ\YYMÇçV”}’ˆÀ ¨rÌ2ÒÒƒÈ.åŠô½B¤‰ ÙÁÀQü e¶Ù¾)Œ[ÕUZÓ9ð¦âÖyó%R:Nê±'Z)\´¸ „aºÁDì]}Yµ% KK[sÑG+~©|„Œþ‹Í›²(s­äéÎ 5¨a^š3­}ᛋÅ$àðÎQXKÔâªâ˜cóš«aû©Â‘×Ú•Ò§¨ZŸ~ Ƕ+ª0`2ýN„SÒ[¡ÆÕížbùΕÆÝ'?Îráyx‡FjhT ŠzFáïŒè™ÙÔ®°×‰²îhžnÌËïL´Ü ˆÛX›[sዞá^ÑÀ¬á^ã︸¶;ïÑ3®ªñÚH®•â¹õè|ðÛð™Î²n…z5œ5>±Ò­×„õ8—Çúåª/³E*1ÊHyŸÛvÑX`„2'$#«Ã1YÆ /R΃°~Ȧ7Sl³™"ûHEC•Š ìµ ”P£öDT9 hËT›`üçLµ²´1 ¹ªÊQŽ&\‡B0A™Ò6dý¹bWKã\ž *’ñâ´õzÂ{ð" Ð×`B:£'Po!B}ùW‰`6Ê0/Rb“aܲ*SÇðÏ0ñ5ïDئwèÑÛ^÷-¦<¬`†fâ¦@çVÛvgútéÔ,QÝú%î¥\ˆw`SÅnTî{%ÀD/Ü1ËàT3Ü­K/³¼E.혮ULä¼W«¤pêÓ Åu •Íå> kdëúŽl%Jn¾F[ÙM\nÊþ±÷EïvMŒÉæ¤äc­”ÏÜTáÓÝøxs©ˆ¼›ê0°¿’B1HI J‹³îÔ±’6öÝú")rAÐQ„…'×%“oaœì"¦ÁéÂu{‘6× Ž}gX9a h „wé^ýNúлÑÀZ¸ü8æ7ï|œFd© —Xha9¬®ýd>ûÎ;¾p3wl©ÅmÑq/âÛnã6ï¸K/^i©#Ïphmö²Æ¤qãÀ ˆæô—õƒ~“ÀÝf\^wÁ…ø¨"¸L¡èzðÜäÊ^åëö4ùìáºëH¹Ç†¯—Ÿu©#/FòH Ý¿Fb\S§Õ‘:">b1ê½?î;yx€e‹“µP³(Âu¤ŽÐ<뫲ºô>øÆ¥×8e]À«å5•§Õ‘}ŒÈòÒ5¶š•¿§ßÓ{äƒM²ÆbŠù“Æoc,³¢+5Ð#Dù¤òfDíhyþT~D–C*|¦•z…©÷¹·jLfîmá.ìÿ†´lá¬ñw4<{æ;å9JÙ÷Æzq«5‚â)þD̹%oŒwj½äkZø|&„ž¿´\œÔqÞù(Iñ ÚŽ~[¼ÓªyÝDû€GFíSl4–ö8ª®ÚbëH˜wVƒÛ¼så91¾§r¼3œw`ÕsÉßi;âjí3)JÅû³ Wó(_êW$]g™”?J‘6#LHCÔž3©7¹±D)É\­¨œ5¦lÑ"!¬™+Q˜)„g‰¶<³„½Z3Ô°PÆy2L—yDäÃŒX I;¢;CL5ƒ\¹ËÄzܯ”ÉÁdª*1~Dï;U˜©)Ú²†ÉH¾xtåÞ¨â3¢¹ò;,nÎÔ:³37sиÙ0k|”öÆVRPšrl£<*_c °R6ȶ¸³-:‘ÀU•=+H{ÅÊIË^”]ÂË$y˜½Æl$¤"i¼@Ñ»áyQuç÷Ì™ö\ž‰*…‚á£òF”LJ_ýÉXë+s™¤G®Ö©V›‹O+Sab¦#Õ‰iøZÞâr›Å™ïÞl¼¿ú1™yÛOÇ„ÖrÌXoÊêKN„‚ÈLå¦@u¦á-ï ;#Gx` ÁÑøØÎWÊr›Ì%F}7u+êH†ÙÛT~=u¤Žìj$÷~Ž’gòÛŠKá:²‡ +RP¬lVÊñz®¢òƒG¼ã|ÓñÝdð†hÕl¹þ nz?Wègr¹)ØþŠ-¦÷­ˆg#”ÅÓ¾M²ºÖ‹ïS·‰z[滇ÛsÝz*ﯣ$¾’åi;Áð¸VÕ=ßgÙZ{}¾hÕ\œ©1ˆŸ ð$üL¦jå)öÞF,¶U`ɹ7A;X~žaâ Ĥ㕠:Û_ÜL×^"”ÇíPQÎZ6šx‡}ñ‡™öÇL¯¼ˆÐ2¢]cD/KMŧáäÑHFjÏ1Á3Ñ{ð’¸z'©"ñðEœ:ÕV´#¥ºý>1i{T0´Hè—¤LfÖÆ—oµéxþ *BÍÄÉǸͪ*÷Æúª0âµ×ÀzZ}l”Çw™Sc'v #c6ªÔ²ko¯â€”³{6“â¼RщJ Á%°f šñ([ˆ‚’'ŒÔMãaÊÿP“6ûË`ª`rOÚÞUh•ÁŽ6jt0”mg‘GHpÉ÷"N*¦ÒÚ©è’J©¡óH × x/E“\·qtŸ´K\^u¶„òVÏnbl gªü,ySµg¥Ãœpªª  ¹ªea†öN‚0H4Ò!™ñ0¨²ƒ¾Ó<|Y—’°y‰0 Ht‡Du)ô9J~¶¾ä[X_E+ÓÊúé(+XXÅŸIo.T&[@Œ©˜Q¼ðZ ¸Y„2&[;ÃYcVDÕ•LÞJÛôOCÜÎÊñº®¿u»ªùáúQ2Ÿ±\½—à™ IoÝŒ/‹A'|bå)¢š#¶ã2Å2`n%h· &FÙÈÅ^ÊÕ›•mEá_0J¥õOca’{1g£š#¿…ëŠÈ¤\8>‚+g ß°ŠŒ•ۺ悌D;nQXq~‡lÖ7ÓwüFWÊœi¦à[ȧÀ9 ÄÈ®é­x_`Ü%R¡Få)>02f]ÛΟ,ټݛÀAT·l²ÁP&bsd¹„¯Bà„wI6²öªðºæ€Þ¡Y1FK<ûk]ÕâZ4l·ŽPÑÓ²%Ñe³à2ª}3[äqË_~ß*%îsó¾3_r­ÅóvÏ"%pwk¦&–¹,¥0>uÆCŸ)jY¤¡H®¦aˆ8B*¤•9uÙ‚Âz “e‚aè <˜Á¦EIšx®=騱»³­íu¨0RцÑÃc$–¾A!qõ…Èö»—k¡»7•`Õ(ˆ•ŠnÍh¾~.Í4] ¥ç¡-3¸“xúâd-V¬æKÁ¨;u¢OJÖ{‘þ^ˆ(Ãaaµ®eò0Žéx DCZebÌŸ/#›wœuF%ŒlÏa‰Xìjƒ¾º•iDO„|×iAi9E¼C5¥$D“6Ö ƒ&ÜãŒZË(¢ŒXfry²íS˜† iˆ‰‘ˆØ›¶ãŽ\ñ¾;LµŠap™o+;—P7…#ÞËÛÊóg(wö䛵ðÀ#”1†ÄEKJ,÷2WUê…ÁgŠ`cå/¨H}©–E±å9µç̬[ ­f¶… uÏÙ†7•1$ë‚b|µ)|)Õ6e|½MXðH”¹Ö?j`‚P(¾¢Xe]ýDkô½"r%K0ñ`æ$’\‡8¬ç&BEa*T4Wˆà‰ œ)¶%¦¬ËbŽÛÙk¶º?¢,9`â-8RÆUóŠ#eРlϤb1 ËvÂgÐCêR™p :¢Ð@ñؘ·W¾×ŠU‡  ˆÖ…+<˳$ )Ã[ã­Àm\;Ç[¼R’È:rÅ×݉â!kz¸©ð©²Œ¡oµt™Ê#ºORy$!ô¸™ɆÀQe/‰v…åTì’õóLï+ågV2Á·i™Ñ®+:ãï0Ñe„BG™1o©)ŒÕˆ8ÒˆN0SlŒdÀýGà&ᇷ’×›Þö8*ˆØ«S7nbHz8¨qµéËÔéfl/Ÿ¼´˜›ÀÜ‹;û¸´G ’ ¢žq‹^{f„ÏØ‹$õ2\úµõhôL÷ÏÀ]øµgÞ£ï8î´6÷Íáãîh”öxÝ4ƒþhöW gøŽ{pm¥xÏp©]“"3'Î^…)6\-w©\Q™¨ípDjOá(»‚ÈV$5F|;1Ë7³h›™é/þD}>‹É/Ó3ÑÄã­>­6žœV²$\RoO$nQÀäUQL?“³ç¥:—Z.*ïÞ`¢òˆ,§+o÷¬æ’bH„§b² 0x9ßßùƒ!]¯mô¥ÐÏ´gkžèàÃ.¹@´¬‰qcÀ)ˆk âJ¸R*|¦ÁEíáŽ:ÊÚ·Àþ^)s¦L3f¼;ðL5bz›¸ ø|ˆ Àι›S÷zb'í8o!¬ªh %QÑ ágªP%î ?öà‹ëlå)»µ«Î›MVÑ;ÎQýUôæ½ÝÁlEVÑ{£rw¢W5oá´ík¾ ¦d V"bËÓÊïÄÂŒï ld.Vž èÑx·©$@1Ê¿Û9Šêææ— ÜŸmƒ€À¬I°xŸ6ß*¨¹YP£›ë]:vhO`☜U*NB¢!÷ šfeÿ™¤ŠšLëÍ&§d×f6xTÉ~’=ð\ ï5~–Uâ K\ƒ‘œÆJøn¦7ü sëñîXn9MðÄÀÍÂû†Ï™»íN!­déšÁ- €·׃ÁdŽ6˜Ú_º<ï¦Ê]!ZDã·E4ñ-_Íê†Lt]Ž wKQ´+1:ïÎx4æƒbhÛÞZož7¨ôãovQsf»}KsªCFÍæÕªÝ¡'¶ªCw§eCvÆÎ>êUÝ·Wuˆõ­àÅ{÷ ›vðxAQÕ÷Þl²B¥áb=— Vª€h@%Ö°Æ0ŸÂc…Jw•¬ºÄ~P «ÐT†ŽHB"585 Š*ªK\ñˆV€U$ÊvjÌd<¦P3ù,*'f²ílîÚ³×+ u*6Û56Ãû@ÏÝ(ž£"2éjøm/Qèé×áˉ±ùî§kaƒ0Öý:æØ¨s9«ƒ¶óŠÄ2“Á¹_‘ì%裞êÿ¾™Î®[Ž˜G÷L·(¤¦ ÜyDß1×jë¬Íí£[)*4Œ Ùç)5p²sųÅÝ¥Æ0»ÕV–¡ðÛà3ŽlUÔÒ_T–f îüçӌ烆{gàš0 èk¥‹ÖÈfÞïéçKþâ qI`|˜öïõ‹ï-þFà4ñn©×ŸYߘ£»ï_¼¥Ãûî%ç»ÆõŸþ¥Ût© endstream endobj 7928 0 obj 5830 endobj 7932 0 obj [492 /XYZ 38.2500000 458.750000 0] endobj 7933 0 obj [492 /XYZ 38.2500000 159.500000 0] endobj 7934 0 obj [492 /XYZ 38.2500000 458.750000 0] endobj 7935 0 obj [492 /XYZ 38.2500000 159.500000 0] endobj 7931 0 obj << /Type /Page /Parent 2 0 R /Contents 7936 0 R /Resources 7938 0 R /Annots 7939 0 R /MediaBox [0 0 595 842] >> endobj 7938 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R /F8 8 0 R >> /XObject << >> >> endobj 7939 0 obj [ ] endobj 7936 0 obj << /Length 7937 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜súA²I  i¥9$ ‡ ‡@ޱ‘ùû™g–Óä×C~Ó/rÛ‚-y[ìGu½«ºêÝ¿þ}÷Ïßvï>~ýÏî{ÿûǯObojqþgwüõÃðªÝ÷Þ™¶Þ}ÿåée÷òôåéËá¿/Oç¾~üóáOÿÛ©ÝŸÿþ¼ûëß?ü±ÿKÇ¿ðË“‘æðû¿O¿wFþ$®¿þ¯§¿ün÷ëqÆËrýfnÿÿ‡Ê£Õqw–~yºSž~ýöý×§wg,[¥«ëª©v²Ò‡ÿt•Úý÷O?¸L/ö]%¥i*#YȨÃJFµz'Uw˜IV£…N¿ûuD øÍ§ÓH½×ª•·#~ÓžG^ðñôƒOß@~ >²’€HjF²õµ,ºYÙkb«Âë#¼|—ø^àžMËé›ÚR·TŸFô#ßœ§—ú²§9Ⱥ½à¢!¦‡Gdz©~õU§m4<õ۟öyƒ†ïC…–#¢ÀØôì <Çû˜ÞP%Nû©e}DБ ~ÓÂoj4Rø ¼9¼ƒžéLŒèOp×àlðñÎ!ÚßýÔ7ð¤xÄ1p1¸±Mâ¥5V÷±Æ´ÀnòªÙ:4h<& LNQ^Nö¦ë+OHÚÈTönÂר6­µ¦ƒª±G¸°(M8q›¸eš0ÞlÚPÕŠŒ°¾êºi¬bD8Ñ1ÁoEOG´;¢õÔU¥‚{(M›²]p©"|?0¡©X59¤ X“6y4 ²½æ•öäDrÖGlIE™kùÙ‰éÌ5,µ™uüF}ÛË‹òy/T8Íè¢b^IÅQ†5|ÒEÅlª†ËÔé"êgÅ!¤Ðõ˜mV™Ô°î¤µ&þ¯/rÙ4õ-H=3R‚ŸQéô`ó›;šk˵ZÚXëè(„5ü`êHÔÒÖ«˜RD8½k÷8÷”n‰GªÐÔÞôé¦#ja!7óªèñ¯#ƒA¬øbÎMËuc‹ÿ`¥QÑFÔ×J¼«ŽŠúmfB¥´á0)À„…çH^S—â7l×o+Èj„Åb’Ú‚çvNÃÝ„²vÚZ³Yу_¦ãÅeÚÀl­liL¥£3·\¢(i•ŽgBÂoÏ Õ¢(Dycâæ¢Zë[/ ¡  ˜B4ØM~ ‘#ŽDdAQ.H"™«h9÷´œºénI¿h9IµÏéáŒ.ƒ¿aÚ”ÛÓ>qõÇíƒÖ>PÌ@ûì&?í£™¾Pƒî?š1â7¡ÎMŒ.ÄzG1í,¢6M%o7XT‹´Xß +5ÏV^žmP䛫7´ˆ|^ä›,Š’^D¾‰ÕçÁkþ"aú Ó$" O#õ-…á™Ö./íÿVŠ›ÅÇ~"E?*ŠPÌ@v“Ÿõ½‘ ì¨â»-‹9‰ï[¸¢ŽzÈð±ã¶™.%¨ÿ–{«J–ãã‚}Å û`7 öu¶Í<¤ÞÖ%q0'ÙïÁ³ádC|¬” ø¥uWRð63-Ä]§Ü””Ë’Éë”÷Þ¤,ë”ËOÄ7ç“NU0ÇçQp6vàØ^GøNÙË`p¦ ³× ð¶¨ò;ž†§°*¸0ïõ|Ù¶FªüÎTÈÁ;pÄUmS’ʹgú¬ñ%ž«ucÝù]Õc‘®ÍÄß|MJiXoÁ‚x¾BK)~³"õ–ò¢+z®ƒï·úSžHJ^PcU2#Ô§o”EÝ~¼@µQ<ë®  Y„­!¼çïv +Q!×'Q§FpXÏkÓI¼Ž£P ³ö¬a-þ&8¯2m5_Áž ¬?¥Œ¦4Ö$ ¦áX'l¥U¿Ù3± ;Nº À\Æ,(²^¿H”gP'?U€”’ ˜CÅŠh3´‡ë%{c¤NZ04S…4¶e¸Àpbœñ9³©ùérQ3áÙIî•úmD”Ê&sl{•Ï”qœ¬´2ëñ<‚çK]ÞÀ1L g0:ìJÌ6½öëcìäª"2æ@˜æóB&“Å!Õ1ÎãŒ<ŒÙÁå°6š.]$a›cí¬XaL~„áìErz¡ºœ½"â½ùm¹Ê$ƒAs »Reþ1_ #b=[ 8ý Q†ðg_N0Ù(Á¥dÓv¶2ÇP(¡;(‡H![n¦$îcR2ˆoü¤’Û<©ª!5x{»xÏÀhÔåˆL7Öqßá djà”.ÙX^AÆuH—]«-xÜM‰ÏÒ#ÏØÔ”Y‡5Œl ÔQF©— Q¬×a‘T6ªñbk,¤4QÆæv^ê2Bœ±b%zlÄ­À$ÏFªYᥜfÖïà0ˆßÛLjTuäî³·°ª–©O¼GG×¢i•·mÜ#š©úX]DÓ³ ¯ ÇÖy÷ø< Ãm•'­póB\m.š©«ÒL,¾¬àÝ+\ÖTÔ¹s_3»SQÁ¤éÌEàpL ƒ!V~í^×ïÄŽ/÷þ ӴlîsÐq…MBÃö­£ïåèLíísRd”`Pe# NâjÆì‘Ǥ±uówƒ endstream endobj 7937 0 obj 4694 endobj 7941 0 obj [493 /XYZ 32.2500000 148.250000 0] endobj 7942 0 obj [493 /XYZ 38.2500000 476 0] endobj 7943 0 obj [493 /XYZ 38.2500000 343.250000 0] endobj 7944 0 obj [493 /XYZ 31.5000000 149 0] endobj 7945 0 obj [493 /XYZ 38.2500000 476 0] endobj 7946 0 obj [493 /XYZ 38.2500000 343.250000 0] endobj 7940 0 obj << /Type /Page /Parent 2 0 R /Contents 7947 0 R /Resources 7949 0 R /Annots 7950 0 R /MediaBox [0 0 595 842] >> endobj 7949 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1500 1500 0 R /F8 8 0 R >> /XObject << >> >> endobj 7950 0 obj [ ] endobj 7947 0 obj << /Length 7948 0 R /Filter /FlateDecode >> stream xœí]Mä8r½×¯È³Í?ô ôtMðÁ@cðÁðÁ˜Ýµ±ð,ÜÞƒÿ¾³*¥Ìj*%¾ ~(“3Øížb‰¢‚Áˆ`Ä‹ˆŸþé×ÿ8üçß?}þõ¿M~þõ¥9ömsþçðöï>þ@Çéï‡~h¿ýþòýðýåëË×Óÿ9?ðëç9ýíÿúðϧÿýõðoÿ~ú៦_zû…ß_zÕŸþüï÷?Ç^þÖ\þ|ûù½üë?þö6ãüºi1?þ÷l?ôy[ÆÊ«¿¿ÌŸ©Þÿýûo{ùéL€°·Œmo›î ¬±5Z}øß?¿üåô‚ëôÍqÔªí†NŸ¾ñ84æüŸì+{ýþN{Zµ›ƒ2Æ}åy¡é#LÞö&Þäï+§Š2òÎi›ûvÞ‡vÁYĺNaò±Ññ&_¹8Uæm†³GÚæ±µ1·ù:½üäƒjÚˆ<ô¶òhÛŒg?ŽV©¾³}sv8ÈQT˜>ÂämosÏ+%ª=³‡núþ|÷pzñxZÀÉPÃ!‘ôÕ8 Ú±•ߥëìX`ÔCoò÷•Keb/8y¤=6fœ54Hu>Âäíé,D›ü}åâT™wy1û×YðRÎ?·“ïžþöòÓ—ÓšºÃ·¿¼ñÚÛ Ï|ûýÅžþãÍHÕêðíO‡leþxøö×—á8ŒM§Û÷õGš_ÞGڣуúq¤CÏ( Gøži×hø«ƒû«Ÿß`Öœ/œ×‹Fôù¥Ž­í†Óà†ïbÞã¡þ@‰OWç_5ó÷}˜¤E#úËöM`h>ÂÙà’_lÏýåÛéˆÝw:Nº·¤oϤ·?²ôx|_w³dö:RèH3ÂgøŒÎ½ê:âÝSGz8ÞS†:øÌ'â™Ï eÚhŠÙÇ:rÒ|¿<Ëlu¤„‘6¡ýÔ*]Ìw?ÏÈdLÇç¤Ï‰ÞS­±Ž´ íšÖ¨b¾ûÑFRI”ü²¦J¡½Ž$•5m9ß-W-»?®Zÿ ¿ç¼êT»ð4ƒM0ì’°Ð8{4(ŸÁaPÙ`ƒ? aü=Øä÷pž ›ïøê‡i W€¯‹Æ‰Ìidxt(ET½> ξ›—ùŠìÊòqµñr€nÃ@®5+:®›LÙ![ëO±·TuÊ] &©»?žÛaùlZ0×7æÞíl¦çÊÇ€' 뙺´ã­ÄU|OÈuߎo,›¡qŽÒÒÑ‚o¤î¡P¯+R÷Öȧðk`ˆ÷ ž Ê À¸óàz~Ïv§I~gƃˆ•ØkH”'æ|¹Ë´hDµ1ðÈklM498ú  . Ô!y˜¿žÄN¸ø°uAó}Lj(³–p‹Ä•&7Š23E70þ®âJ†Ä;‰;Ñ šT ‰ž]g!#’ÕFD…Ô6ÚÑHše–‰î3ÛŠWýÉýtâÈÊʱ’ã¡i<Až*Ï!Ûcl}aáÎH¼¶ìÂÃG=‡žPIÂÌ„©Ã¨K÷Q7ð³Rí±ÍÁFB­mXLÿý‰·]ÕZÎ!($¶"X¤Ù¬e«UÜUy"à†°øUìbd–@EêÊšŠ›“8•’q(M[™À­vM¦Jd y´.&aÈ7Àá†-_,wÒ‚˜Êv@\9 YmÑ1Ž£PÖ"æèÃNŒ$â(ŒU:e©Ü o%òs§ò§3Ñnî‘ îÉ=³+/ltŸ cÖIô‰H‹ªÂé:–.eñ°~¸;¯+(] #Q=(L¦ÔF{ÂU{Å×`~A¸ÖTI•Ï3bqò&Æ3©“D’h2ÞÁ¸cü ¤ŽÂ'ÓÓ ŸS¼?ðœ8^56ìš¹H™†T¬#uD~Ä“zŸ}mudç#id§¾]Ûe¡„üVR‘¹£oš3c/ÞNx–‘†\®×¬©[ß½ç¶Erß>GŠ?3Ýú-ìÑxùŽ">EòØ£0œø Ü›Fôc¥|=éE¤âļúyÀ1š9ø ò½€Qa܆läG¤’ù §l®{…ñmâ¿ì0¾=ˆÐL±&ÀË Tàìð•+íoŸØ—¢ ¯µM飯R‘ë¦dO¢ð€AÜ«,ÆéáóT<ïa€×¢9')‘1ãÐßawãX<öÐîóÖè©Þ&zûÙ'ud}q ­S•¯±‚gÁÕ)NÄg#ÿ0¦)]|a8©Ëª%ª–¨Zb# -QxŒqht{Ç2@¶]p=›õl>ìÙ´¶žÍ-ûø4繞ÀÄ'°3õF:ù¿´žŒ;NÆ ëÉxØ“!¼‚´ü&êH¡<ŒÇO™–ÑÑNƒ2s@ W¦RÍ‹Áñä¯gá©@!Š2YÀ3<(˜jL<•TPe¤dñ8¦LÀû˜°=Õ˜1Û‘{b¸HÒ&hQjS´.è*L,&¾J(ÇÚĵ6q ü@‚IJ !•JŠÜËBFU$ªPæY,­gžQö {ðo§·Ö®ŸGƒÚƒ×Ë!Ù{ðzö‡©½FxÞã­×ï ›Áݪ…\-Š¿/WÄ×Sx±[Y{ Ê] cg-ˆ¾=‰’*Vœ½YA¾V¹ø"ñ1{ðZë²fBl|& n ¡†eÁ-^Ì|se=ry*Ù'"@ü¡y“L![ëMÙl@&Ÿ›èbIe(o7•ئ-WÃK¹>¾ÃA·´™îÎÊÌÎ…d¦bÙª9žMð…Uwcd¢O{ÔÀ±öŒ…ÏŒð™«Vsºm¸êiïntè=Í+zOé6…îã‡áõ5¯3mó±[ÂËTæ=LϦØHªèVÔLÇ<ѳ±‹Ïæ>UEE´QBx冰6UWÔ;ʪ0ÑãsFöÚɨVÑM”ûB± \bFßMëêÄ=Uò8 ·7ù¥ dÉ–;IUÊŠð¦x®Xø<¾"1IÙvÆÛoÍŒ. ¦lGúõ"d˜~ŒÃ€¹Ê‚%±M&j&R A´¢µÄÚ2vXGë(«€òi >×£^°ÞB¢ÊccPe˜î%\œ‰¹=i)#•Ù~Ƴû ‰_ èëH52·P)Ÿëµû||o¹Ô×azå.›¦ÌHˆš9Q ¯¶µDå[€7ƒ‚ÚFÑrI"é²w‹8a=æžE`k¨ &&³ Yñ™XÝQ0¦ìù£EÂÓà ¢:ë´£ è$]-¹ûØ5®c|ù®ÎÄýQdKó{fk.ÚÃ䢥LÚ1—†€¾ÿx4ð$…àÔDé<5‘d·‰$¦¿Äz±³’ ÝHø=RZ">_˜¥ïM$iÝÝÊšHbÝÕ$·”{ÓË ÙÕ},j®Éàpg½émº'äºé¥Šy<®AÖ ™¿¡ÕƒäTåÓH"ˆÜ€ô!&‡F˜- çË™B9(娵G ëx¸¥¼èÞÎ#²…Ï$"±/Œ‰¢‰©n5ûìØ1Yo9bÕ\w>™³8LY Ù„¬’ûrx1 0Š$,«‹ÃaR3,aµ#Ê{¬Ø‘ÝDr)ùJ@Ù.ú2@¼`7uÔÕƒ£ðRaõ™í’ìîÙœ1;¡¨¯ !§Ðó*¯ ÏV“/¶®Ú—‰‹O€+`WÎÕ^þùeW=J0§}JlŠÈ:@ d0 ¶'Å.Ñ­&Õí‰q:y„9±ZV¾÷`»&•f‘³QVÊwÍ,R (?ÞÁg`ùq3¹Zí³¼> †O>½îhÔ™î.Ý*2N̆W=i·žÁïiàÚ>#ºáµMÞË[…Ö_A²Bë½l|méZÓè_zf:z•×#7:œeAqY±5±sbß·5™Bë4€l›,Q)º Ú‹©n:íèÏéÆ{…w™ÙÄðïëõAº~Žnxª2`ïQ¯ÁãK$ÖG㻫;WëvH×í0°I±ÇýŒ¯˜áu –ž¶Ï˜n؃é†÷û°çS‡áQLQìÝÂïÁ'¸M §:Ó;ŠJc·Qª9½š«jÍ×k=«ñ-vUÉ5E2IE‹Ÿ—xëIkK¥‡>FùUgÜà•1Ê•8¦#æ÷……mÚÆ]`>bÌ…÷îÂe‘ÿT“–Dž+ªàq¬0âg*Ätˆ'ÐÜzše%ô®ðʲ!S”DñHèÎW&f,Œ×u ›1nƸkþw½Ú\F$¼—¸9”lM ª_’ì EãëÉ“”Г«é<‘?cWÍ4(—¤ÙN$u]€#ø=$È–Ò(VÑ#¤ >i‘ ï6}¿]œñPØÈ_¡”+”1œÜ€Å.ybƒÓñÚdioÄh+%kíZ„“-U݇*6·(¤ŒÝîf׳Që4ÜuP´ÐÝ. îÉ9M5# 8…„pÿE¬&.—¨L¶o·^æÂm·`¼ŒIríÀx"‘‡šþO¥ÿSïÇß!wbšîíÂvg0Î…pœ©Ð£5bÎPS”›@-&Ež£Ä8Ž™pê´!iUi¢,XkÏò4\À­ÜpÎiö–4L«¤bÚÄäh5º½Z"CÈâË\ÈBi³-ô“BxHÑ¢‡…háÓÌcÒß(×R@ ŽüIÊÃ8“ã±R£²’KºG­Ñ‘ Ÿž?5;³\Õýàðe}eoº‡í2OC´"ˆ­³#«¥@’•F³¸-ü¯@%/O*½§¨äåª Tz6 ÒuTJ¾‹×xI­@¥Â¨ä¥A*U Ò]9&ðÆt®D­Ér²Érù뇥Á«é9Íøép ˜H]/Æ`ÍêN#ñ5FWdŒ'÷Íà¬&3p­W Q™1&Ö›Ö]M±Àµ˜dè].©¸]@â¤_¸Vk^S½׊®)eR;'rMu}Z]š^¢¦Â ,¨Š\{äš±.G˱ܚov¸pÛoq>"/îÍ%éCÈ¥Yø_¥HЂšrÒ®ëÜèíùú—Äìœ0(—S+XmË‹+Xm{®v¥LÉ—ÆVt tR׸A@º±Ñsm·’Á)Hç…Ô¼§‘Ù¢t…Øq» b— ù36í\Ë©"ÂâÆØQÉ\Ó±MK87©¾I{²$óu¤ËŽÌZu5gÃ+ĵëÍØº+g}sÁ’"U/Ö*Åv&Řˆ7$ä²g]\Ä!ÓøŽ åx],'cŸøì\f\Ç“,œ•¡,%ºp ÆÖqOè©-ß­¼6ŒòÅ¥‚06…ÁKàØ:.lƒcø“Åôjk‡~à‰] ‡ƒ¶·³ Þ£t?¿òËÅžµ?^‹¦0Ü‘I¬vÇÉ»´é™=3]ÈOÔsÀY.¬„å­7ŸE›VK‹~ût8ûã8¸³ágðÚÆØL6áÎT¿ÞSÔ#Š%ŠPçt沪Ϧ'×2ÿéA@îÖ4ã[]œ"$rŒùù„ e££DY“?Ôö›Y‘–íŽôµpzã*•ÇÈH>Y%õ0¬B¢”ñÈ TFDhƒL±*Ê¥Dyv8 e/2Ùs"ºƒBˆš£!!‹" År”c6cÞ`×û\rpGOãÙ0æ"‚9³ CkQ¬ ¥ÁE±7ÂqúíGÀþ"%¶|>곋Zëv~+N—Zƒè‡¹qR!NÏcRU ÑD"/Á|&•Øó L…Ä{êIšÆÏÔIÅ£ÌþàÔuÏ—ÂàšD8$âI.%V€Ã5SJyÉe/]S°ÜÀÉü¢\^%W•\¬äJţ’ Ëü N—-áéÀI%WgVå†ý:¬žG¦ÉJ.8ïæræd|€gÃÅ„¥]¢‘*¹ÄQFÍÈí ÇcGÂö¢»Œ×#Rý<áW«lj¨lnöA%rvï´ööT[ 3F@á>"£&ä¬äeå÷f«’¶º~D­ÖW­ÝA‰{ohϵa?,UøâŒ¯“ku£VõëÝ bŠp¬…©#wÑc¦­³Ì=D¶øeüv/ºs¨+ ÞbúuàÐcÆN%ä¢Õ?{7(%E. „'(ãŠÐí¶Œ,"+’%&ÑÓEÑ ÊhËó/jŠÔTÿ¯>ý{ø~bX/?]û… ?Ü,/wbÖF½ ñ÷¼—ór çïo|âÙ÷©ú\=øÃÈÙ«Ó-G¦$}#FAŽxEï1k [kû2})Òcø0X÷ðá„ý©;ObæÉŸ¡ðlð™‰[UЧ0OX†{ûûiÅóFCÚøMÀt€,0L±nÆØ˜Œ‹Ÿ¡xï±¶f¸÷úƧ“ÿÃ6ÂóŠ·dzf’kòïðõåÿ¥9%$ endstream endobj 7948 0 obj 5869 endobj 7952 0 obj [494 /XYZ 32.2500000 512.750000 0] endobj 7953 0 obj [494 /XYZ 38.2500000 464.750000 0] endobj 7954 0 obj [494 /XYZ 31.5000000 513.500000 0] endobj 7955 0 obj [494 /XYZ 38.2500000 464.750000 0] endobj 7956 0 obj [494 /XYZ 38.2500000 428 0] endobj 7957 0 obj [494 /XYZ 38.2500000 428 0] endobj 7951 0 obj << /Type /Page /Parent 2 0 R /Contents 7958 0 R /Resources 7960 0 R /Annots 7961 0 R /MediaBox [0 0 595 842] >> endobj 7960 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F1500 1500 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 7961 0 obj [ ] endobj 7958 0 obj << /Length 7959 0 R /Filter /FlateDecode >> stream xœí]Iä¶¾÷¯¨s׈‹6 0Kw€ f€‚‚qœÀˆL|ÈßOU‰ªî¦ê£Š_=RTµl$ÓµDòñíë»?~ùûíÞ}üòŸÝ7÷çÇ/Õ¾­«áŸÝñß^þ…îöîç]ÛÕ»o¿<|ß}øüðùðÿ߆¾|üóá§ÿíôîO‡ÿý¼ûëßù£û¥ã/üòЪöðç¿Oö­:üTÿ<þý¿þò»Ý¯Ç/ŽË¹Í¼þïlÛ7­=ncféïã1Õéßß¾ýúðn@Ü*}ÝÛí”5v§z«wÿýÇÃO‡ž?_í{­ê¦kôáŒû®2òK¶ú´¦éwJ÷ÕNu•¿äð¡Ï'øx­ºt?í\*Ê4*üõ}׸àÏäÚÝ®o*U5;n‚`ô²Jµm«[0ù½¦2m;\Íq)éËyñyù›oª¶·é>~Ú¹8T´ }}d¶®úþ|˹”jêhu+µç¯'¸¥µJ÷ñÓÎ¥â®<õm>ânÛ¦¸6*£Ó±ŽaçÒ@oÛÿøç˜àœï?|}x÷t%P6»¯?5”ãšÃ_ ©w?E]£w_Üý¾ªlõ‡Ýןú}£ëq‹Ã“ê>ùŸ|BO”EOt ¿fòì­êÐÓŸž<~=\lò;éÔªï$'¬lu>øSü CÄ`\„OðÕñïC B»–ýš,¬„jà:x×x˜Ò!t ÜAõÿ5|Òê½$-LYøð;2òÕÏã ~‚oß#¼-|'ã?|'@Mpo”Ì€øŸkoÂÜØ†A€{ãwðÈñ)ª…{ÃбøN3áÞA€ åÔ^L—†£X!+¨ó%°7LMXÞ8ÊJ9J.<(ž£ÔíÆQnâ(†Á$¨okh{RšÕÆQ²q”åñ x^Ó67P`…­„¹'yN××#L?I­Úƒ%muZ²®Ï×8†RûÚ6][¿Á€.ݾë«|žŸ  ¶{k†È½O€Þ±ðð \G÷poõé‰óâÉ@fÝ5 ÿW!,Ú]Ú „E`a‘ÝÃ…Õ{ï# ïqxNÆ^Ø´Q×oš¹kÂ>1Ô°{eöFwJ×·-õõW«!µb(Æt w0½RLU<”ð™u0fÈß >ÏäÌÄ·91ÈÂCpé§Ë(šPRÕJ{¢Êé—q(>ˆz$á|w†Æë0;há;²2kÂ7³é*ÝY=xœªöM«^3 FLBÆQcB„Ä£\ãŠîâ¿&K¨ÂšÐ]c˜HZÕŽ¢\‚C0PbDª"5†j¶‰ÍSCÁYãÃ' ‘®ã¾dQ„ÏÆõ}ÞŒ‚\ŸÇÄ®atù·Ãà“UL‘9qëXv€añAÄžŽpa`uãæQô¬!“Ln€šƒá†­KLXÑ–/Áæa2ì[L¦poˆV¢S ¢Æz’(À0è"$e† d­e¯ƒ óƒ@Œ¥„BÍ(º²ÎÇfÌ ¬ç0>7Y%“ÌÀ°v! ‰ÑqÁ°:\Ÿ 8 ŽsŒq\çäÖè‰Åù¨8{G€q,F2sÁ@ý•| ¢G“‹Óvpç6½z}è8W?–XDJ^Ãôó¢Š\@ÁÚLÚ,.Œy¶Ýê1q!Ã$“àDŸà‰M™X‰Í©auÍXÂj =* §} ›2÷ÞôŽ€&Ç| —pošÜZ5¹¾²¯W€„Õ™Iè—aÔ‰³’6YX¤ÛE6¹’ ë3š=&ŸˆÀSÆ Ìúag5 mj\ø jg¦W>Ôcª˜Ø!“¾'œ×o|D¾oîpðâT'Ë…§Eb”¬œE ¯íSb  Ó[‚èž@õ?$úä:þ³ë€)ÃÀ¸ÓÏŽê¢At “ë«€äP×ZûÑÕc…ÅD.g1ð{;‘ì›_¤90ð1mc‚©‘IÙ\ ›‹áÄNÎMc 4Þlo‰´ú•jzï rõ—¶˜Zp™Ñ{ðÞˆ¯1Ý©œ‘Ò^­¬w‹"=g",2¦Ü^6ØzC󔞄ç¾X›ç0dËž§¼ú)áY©Oï !œŒ Z§Åxq_€ˆN2Ë—Ž1…NLÁf.Ÿ ëËL›]¢UΜÝYάy°å!†NŠ[ 7¡hý‹a³k¬â`< v€Ýz›©¼RS¹9šM¯í-¯òf•óÍäU2š¬f"y¢uŒ&æžÄ!-‘Äb>Áu˜R¡Lm%˜¾’¶žÁÞ¤¦|æG™ÊL[RÆèdrP²ä§u%Ú¾÷nÉÉò”­G+M9 ¾Ûi{Ñeª†%ÏeDêéŒ$Ãm=3Ï÷艻«fïüÜ/P¿ÓÁ'=úšCS­÷=!Åó:£B7%÷6C»ï;owâRv?qéÃ'ø<Žð£`  ZÚõ§øu_ƒX…O:ê„ýxAÏï|€{{$ÎÓ@|{J/ Nä§ìh=ëa3J¼ò†Èh²ºX.½Ëú·©H 3ãÅdrϘæh.da÷ßÄ7…µR`Z—2ÙÖ¹’Ýd=îØêÁ-þˆD<¦FŸÒV1­cX3Al¢Ù$“*Û7GfbOã)ÕàS5ÙK¡ÓTò™Î΢Չ”`\ „Ó!¦³ëªX¸¨fc†ke†¹Šr¹V¨¼Ù.®¢\“¢FQ Ô@C(†k1ìÙ4„ÂWUÍÄ$u6õ…Fø"ÉŠL°F´=+eÐø*IÀÐÅŸÇO$¦Q¥ oFÔeNËK¦Ã_ïÞ`2m(|`bƒs6w'\£æ:W4zy·x(û‡FJÙt¶Üˤ²áˆ4jZÅ&žÊ¶Ä"&‡–<àd©¶ÛE b‰rñ˜ºøÅåf.»5ÏXé„¢¯1¯(E˜)‹ÁB‹A0"x˜ß#2rK4xHõÁaBÓfUF°>¦v,âÄ @—wÉ#†!‘ýCÍ%tL8­3ÀF»D50öcö¾U¿ÙAY±x'`*0‰3àzDqšëÈŒQ^àÛDy`‡Ï*;Ô>±K˜”²ãó°{}£LåX"c0f½"Sj´ê} Ï”`’mønšXÊšÌYŠÝ ñ𹨂²íÁÅ,L#<è@VSeT&ˆÉÎÃ:¬A*×T†0X,Ë0 6–Ìi]QÔ³´tm¤.iÒŒóízÄ 5#™p÷P\žà?‰la®†'“ÎTL„…q@2·L´åt>Ù['š¿PJ‹h‡û•ú¿Òõ»évƒé’5À´>/ù4 †Iæ{ôÄÁ´ÞëI%"~§ýZÞq=’•žê/~ ÂÀáâ¥'ÏãzsISköæ„×SÆva×c=è…¯Uè †£-ÕŒ(wÍ:p‡óéýZºî¦`¿~¬¨ƒ‹"t&ä ë¨Íe¬‘Ø~AÍ€e+ß–Õ¨e*à1„U¦o_¦šÛ‚L)¼W‰›¡4'HýŽq'vülû†g)ú7ã&rÉ%nm/r¯w/R ú„+ûAyà'[cR¥^ÏÔÄIĉîM”ÈX]!ÏjëÚ£D…{Á³\p I'Ýà6¸Í)1&0„Ÿ‡˜@ãxMÊ™1ýÄ„IîþízëcQ=Jq¿ˆ "Q./’SJµ‰(®n¤ÞW¾Ýü~ÍYáÓIÂI2LvÁífîTõ½t?¢S bH‰^˜0Fä4áh)G®þÏ•ŸÎäÛ/Þ iÿœŒí|;SáZÀˆÈÓN?BG„›£éÍ[B'ÙŠï믟êã˨ ‰—çD•í mYLa.™ F´Ge²à[ÈÂq“6¹«=±¹BK]kï›_M~îýë.¸1M@ËÇ~`‰¹Â)ewæÓ‘lÓ_e2™ô£‚cÛÙ2‡Ìñé°dÉ™CŸà;8kÆ]ï4s(ÑsŠ\?ÿvo€o"*?gi&?fÍf5¥7ÃM=rÀÓ‡™ÄÆ’yéÖa»ˆtÌUr~&:Náu„{™i%xïÍV](”’í[íñý­r_s¹# ¥\á¤ÅJ,®/…a&fË"¯H¼A˜÷1æ„&g¥øX0cçÄÉŽ¿ð ;.¹rpŠ ž ßÁ©/ØÍ˜É Óeä/ÍoÅ'ÅÎ1œ–ƒOŠ×Óm™4£À [8÷ÖÁ Ž'ì1Xp1âÛ‚OXÖ,Ü›…_«áׯü\§‚OïÀ9ɘ Æ|sð¶I{ø~ÖììŽ:©ù‘6›vXá°< Dꪞ½¡ÀÝaŒÃ§ƒÉ­NGÂRœtÊœïS7–ã˜[aY‰OJh,O'¾†o.pR|Œ!˜Á]Ì/áÞ´ u æ<`-Gnã-ÜŰfxHFþ_ÓÜŽy‚åLà¶d)Ë3¸7l3(¸N1ò´Üà:˜)ëj¡Û3ÄÞ–¡½ËZTÂ…pã(æB˜saŽÒgä(ÖÜ¢?‰Å†¯Øi§nÙéizÙ´Ì+ðI!_Æ[Ó G`8)ÖXZháúBS¥Ñ Þ¾ß à–ˆXê`è`¾i“(†cgˆRíÛ’ÉÍs"T.ªÅ¾Fâu--+¬cc|Á”Žw}ÍPÃÍŠI¦»+rjwMÛ¼^uaȵÊÎR€&´&F0´àqðI@ n~þQ?̃}f´ÊrÅ81 D÷0`.—'¼t  ­õì~îN/`ôoQßÛò1èe¡ã¶íèÍ‘Ó2fÒ¿;}V1`ú·l¯;N—riÿ/Þ™4³ÆYÒ8[‰i@ÁdÃÖ!\£ãÜaøÌÜ ÙÖÁLƳpsδ<&½X¢“ ÉE¶3Éòm®…Ó\¸‰´à+´  ÎzˆbN"=WÙ4B¸3H¡èК7vãƒVmx§¬&ï:RÂSF#æ`-ÝÞ”Jµ—ë=Ù!QeʲW8X&!™ôU듉ÄÜËÀa1€D»/Q ¶:a*s g#ZcÚ€eËËu_تK¨6nÜ;•è”JY’˜ó›Ëak,2S~,lº\ßå<[ÏÇΞk&®¿˜·QÄÿDQ&îÍeYºW—¥Œüa:¬ÒëSïO4̡Ԓ›ùÈŽ’蔜£ç£›²æZb¿ÓN%fLÓ-ŠMŒši°þAð±\3UW…]K{µ$üám¥Ð’ªóÙ…šá>wá‰X*œ¤b¬ÙE广oJÃ[.žÒ¡Ûú‘MË—(­}o®öó"vaà,ßdžq.PFJÁ~vʋŸz¸3w7¥€€Â± ‘îqsž ~ΦFûŽ0cÞBª&ÛÚQnÉE¬ìÉ470 ç ÚÁTi}rwÓã‹5⣀àò‘‘îôû¶ð¬¤•šÒaZOš0+5üÉc¤É$F„‚ˆq*+U2ÉUqá¸h– —NèL– …wØÊ'RÌZ-á˜Òˆm\¤LÌ%Ïô¦¤vZç‹Ö”m&c'ÓHÙÀ:L5–ÄÌf³Ä1ñ؈ü’õµ\Z’`¾L_WgçQ~•>T3æ¾Íà‘™MLŠ ¨ÿ“Ïc„{Cæ¹Áü¿3GŸ“ã'«ÖŽÒ˜n­Gd‹éÝŒ7:PK†³7˜¸Á⪕Ÿv}¢_@@îØ0zw„7KC"ÅIn猈ëϽ稩OÂ·Õ õuÖŸâMˎ틨LÅwŒª\boLÐêÒq}Þ7E„y“?›+w}Ø\¶d@dfÛÚ‚ðµ› ùBÎmI<È*ÆÕ­‘*Cæ•H1z‘=!› Q@®Í]ôÐÈ%zeÔ*ÑìVáôSBƒÈ0š`™ V' b˜Út®õdœþ Ù2S{ËÔ.ãø¶k¿y‰ýã¨3j§®<=œç‚¹‹‹•¨ŠaìÄÀ¼Ë¼?)c­=Ü`T#MJàŠÏV®Ìí\9H"¼´MP@šê Ë“©^§Ò‰D|y"íF&h²Œ,­K <îXõÁXñË`áL>n)ÝDî`E,„„Ÿ`¢fr$2¬K®´™Þ#ȱ€ }0†g@e‰HÎ_¸7P‚]â&Û²i³T‘ùêB9¶Ø½ëôÌT·¶ØR}狟¯¾Ì»÷ŽÛTlE”Š™„ÀïY¾_ü. —hNsožÇ»HÎà¬Ï8 Íò¶ÔTSÔQ¤L›®Œi˜ÏžÆoºµ]Á -t} ‡÷W=vN2j‹ÕP¢Eô{e¢íd p+0Ñ6ìtÅ¢"ÂMºõ£)Q$‰t D&D­Œ€f"áïÌWÑ#˜sUÔß›‰°Îä„Êj†iƒŠ² %0`:D˜}ŒÕ©˜f²÷aøÌ*viý³vtöÛ<û [b¦v'íÀßúw…uÿL)äÂ-7¯àËê»1*8“§MÄë$ö¢ˆšõÑ(ëo—hÍ#ø­3ºþf´ÞL!(*aϵ¸ÐT`fªpÐmN²¤­Ú˜á[€M0d=dw’¿±¼a·Âœ¥Mãш‚¦ƒËÓŽRéñ×*hT`•^ÁXhnøÄ½“’c®¶büù„½~ƒdNî TKà5’I)Øi%—Mºh§‘^Œjí]QƧè\ò˜²T½/+Ç#6[ÀôLJ˜,˜¦…D‹ºÅº×R£¤qÓ1 ßMÉj0ÅÜ£èÚ¼G¢Î¢@R†ãøa¦NŠ–k/)H뮤T¸;OøÖåægb#ê8YóõÅn‰óRÃ\Å—ªs¨ÇeFP˜ÞH«jƶ¸ˆ ›GÇía’¤Ä å4.ë­ÕK‰Ç-S/xõ²9 ¿Åmq“çVš’6× ƒÔ˜Ù¨÷¾NÍXo-Äá#ZM–M0ÿÂÍ)RJä¾ó‘2S»ü\yɪjºÙ£%ž˜ ¹—É•«Gß&×7¹.g†fÊÞž½Â45JeÁŠqûPò´m<Žs JNj®Z¸7˜Øó6túDèZ{pgú¼ærš0V}bOÒbM0 `Zo½#Ok|5ÕÉÌ(fÀ,ÌL ]5zb Ó °@Ìèðyžˆ]'·í“O=c#¹íÖ5ýeqÇ-ƒ¸˜ª³u¦ð/?’ŽÂ”7ÑJQ¸ã´¨G[¶§/åcb×’v±|Üu9GÁ½™ÏÙÜâÝYrFx±ˆØ¬f›­ ¥¬·}yÄdü1œ›€ÎV™ÄáŽì6—ëZe†DÃNÙ2UKgN%ÐØz4³W'­¤nµw¼»óÀ4NOŠw ðIqWƧBœ§Jómmík“¹¥."usuÑHn¶.wÖuYvô@Dö3e¾F-R6ZoíRòK¢DÀ,Úš‘oÚb† ž&R÷2;Ñõ°ïUq+%°už\ 圲§ â›»›l Sùt‘^ÆšÊzk.ïã’-À¿7Á)¬OŠ¸Ô™†²©;D§ª÷=á0  ü’+'ÓÁk:~–¶ìH͘žn¹ìç‚}ÆT´Ü@y„×á£r)Ór”ñå{®hN1^<ìˆyÂHcÛ¸wª[¦#Kd¼Xæg8­ c Æ2Ñê ¬92ýg‡É¤Ï¬.,DÒždÁ.¯€C—áwæÿ¹ÖND•Zlצó¡¡ÁM”Xfê;cëçŠC3­˜™t&ƯÂ(ÉŒ½¾¸µðs6«®ÏÃöÒÚ¬«Ö&S÷Õ·Þ]à€#SNeò1m$1y&o©•ò`¸éIAbȤ' 7¿3o‰Q‘P'ȯq;¡âþÝ}?vî?ÏýÂŒ¡»˜°p€íA;8ìw§ÏVž‚;Ün{áð?Ô{=ô¡˜päfúÄ )½wu›/.FAŒø„Ö1s¢õÒÞžÜIQé(ñ[_nâØa3= ÃœÌˆ‰îÂ1þ|Ça¸Š:zûŒ¶,Â>ìx¼h;Ï„Q@aC‹AŒìqPenâ‚ÂwÏÀüN=#¸¢0ï:@C0 ˜“¶Vñ®çàHÊ¥ÛÖ·SW[™½CÖWdù)&3ýb;³âçóîóÃÿrÈ` endstream endobj 7959 0 obj 6453 endobj 7963 0 obj [495 /XYZ 38.2500000 166.250000 0] endobj 7964 0 obj [495 /XYZ 38.2500000 703.250000 0] endobj 7965 0 obj [495 /XYZ 38.2500000 370.250000 0] endobj 7966 0 obj [495 /XYZ 38.2500000 703.250000 0] endobj 7967 0 obj [495 /XYZ 38.2500000 370.250000 0] endobj 7968 0 obj [495 /XYZ 38.2500000 166.250000 0] endobj 7962 0 obj << /Type /Page /Parent 2 0 R /Contents 7969 0 R /Resources 7971 0 R /Annots 7972 0 R /MediaBox [0 0 595 842] >> endobj 7971 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F1500 1500 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7972 0 obj [ ] endobj 7969 0 obj << /Length 7970 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜³Ø’M  •Vr X@AÇ0b#Šùûá,ÉÙ&¿žá7ÕÍ&—YÄ»ûQ]类z÷§þqø×ï‡w~øÏákÿûÃű.‹î‡ÓÏ÷¯?ÐîØÿ}¨]yøúë÷÷‡ÏŸÛÿ~{è^øáÃ_Ú¿þwЇ?·ÿÿåð·¿·þØéô…_jU·¿ÿýü»©UûWqþ}úü燿~wøí4â0]¿˜Ëo]QÙçe\™úÛðMõüóû×ßÞu˜7KS)Ýe=¨ÆêÃÿùðS;Á0|qt•®mY4þMN^ëçÙëvâÓJ;šûùGftap£ëxƒ?¯\(ÊT*8xìÓ6uÓŸvã@†Ñcˆ5eDT:­\(ÃiÃÁUª®l]ÜÃDºTEOi•‹AÈçá#@_k‘ŸW.•álñ肇«mm:m"Àÿ<|ŒÃ­›xtÛ­\*ýáŽGÿ©á“Îcà¸6UÂ'Žö^ ò »-:°—M?¥ÀQWåóz^ÓmÀK[¹úâI÷Ž;º¦¸|§ßÚÔ‡FÃOŒêF;`»s°Gk:CáeIà“§ç'åÑh§.7k ¸ øƒ+°u GÃû逢ŠcU«Óp/OšîIy,sy`ïáhÝ;zxtà t÷D©aC· Œ…£5óa0BŒ¢" #œXõÀ7ÃK·¬2^FŒ´UcªÄkèIŒfŸÄDÊUg•ÎJĽ¬§øÿô¤‡Ü’ÂÂVõÐ r (zÙùŠV fK€9b¼AüŽó¶àu(þ (@™ddÊHJ8J‰€«¦ä?F(Æò…P/’ãƒe wõ‚CŠ€#Ó+~‚—„QŠpó"º(õ_dDWjíI¼À‰`>‰9†&U )Q` !b£ž—zô¡V/!swSdêó1&àˆÀ´AÀ-°ê÷7#£>1€¼ªðĵ¨\e|~=nô¸õŠ6afùü44•°—NÃy ì‹SðÉ#\5öGb?! Ïx½›ý)D”žª0ÎG̾a ‹Õˬu†Èð?pÌà$DTÀÜÅü“ÐD3’Œš°?V)ŒЙ០ìªß;ëÊÕשKl¬âãÑð9`OÁG)p¸ƒj¦À¡«gp”ú ŽÎ5Úšù'Éʉ'=1•Gí³_…ßqÄhpm½ ›zÇ Øy-F²òDξۢ;U guÓþx'ÖÖÓÁÄ<ê ®ï§‚O |WPÅpÓî´cƒÕÑ(í1H¸j Α€ù(»a0ÃâÀÔ}œ'‚3b4Þϵ+³îÇám'øb^>ƒïá£áÜŸÀC¼œ—„Ï®Ú`ÜÁ™Q8Ï ç2û ¬g‰Â S½…+°Ö87 >1 ¹]Y]]p~qöÐ&žc,1†7{ ±fÕ†8ŸdœK%|?ÉžžëòêzdŸp ç²2”¾8—Ç;]1ÿolb|ÉÇ™±/ 3a®ms”Ah¡Ë ¼SY Û6XnÖÆ¼ † aí…Òk0^gÎ!ke²áƒ+åªó'¬éaM|½Ò¾6:ì[þÉÛ‘ Â6*¬e€^®ŒEè\Ô™b^³ó´O3b™ò7p®ReÃ72x‚iFö¦,ÆeÆ+G3˜£àÈR áaÌ„2êŒðrù';ed@ŒÊ„š\“./þDØwžð]á²¢ìùK`4Ìû`CªþmV®{¹‰¼øieðdy‰(*ð<ŒxBD°±¬ÌCº9{W´?ã'F¬ÌÁ P¬RÇXߎœØ#}kõ:eéÕ¸0öB¬2˜ð)T²Gí¢ðh·†¼†=j—·‡;\nŠ­F )üϘËl"“ë{¤/ÄöHßš#}Þsn¢™=žñÆ"}Ýcà;eäEëô5UF¸¼ø“õFúšz«Ûuzp“ZÆÍV£¼+•ˆ{¤/é¦ µÕxÂHŸ.Ìâ¥ë”©üØ{ °xK1@ 7‚ÿklÝÀµm-ž—ytDå²1(›lq\h`XgÂòƒ©%$ϸV]# ÆÖ[Mg`ì>¹\,f Që]wÞ5ä·¥!xÄÄ@KL L0\amcZuº³R[µ*Z2œ˜ ¦@ÌuZe6›ÞuÚ]§°¼Ì/wv×iw¶[¬ALá5<…] ÂU«­fp¼¤ð´š+æODUsFC–­Ïp†{*ï‹æd¢£¸5äĤŒâëb ¹–¼×ž¤¢N ‘Gì=QĤ+­¬ø¬á®QÚ¨A@SH™&;¸ƒY'hniv6ndá|3Úý0æˆ&X^¥Ûh©heçãR`ƒ²MÍEšçb(ÁÑzëG©á8n ½m¸*Ó›Ø ÓR"FüÑ+€CL‡-¦+ß–»›+O4m­çw?SzxtCcZ9Úˆâ&u··dº¼.Æ‚˜yP¬a±~Š÷ kvÛPQ„Û'úš*%Ò™Våkê¼Im#GL†¢ñ»ÍÚD­s©3ºõâÍP©FôŒzG¨¸cÁ-i±À`0~gtü Q¸“¨J°Ê Œ¤ºˆ'â4*™w©<·µ~uÂ!~'c#"€È˜­ÌpŽá 2Tq±ïãz“¶:ÃeÄh«TR³)° —hÀBXÞl"ŒXÆ5¶Lg(3>-ÊZÞr:c :auåqó=qŽ›‡IœëCÏ1nõHZ§R§% JDýév²Ü]"œÄ!¶8_ÀrÁªã‘UOc»2e Æõ²æLDNêšÆç¤ £Ádî“¥1öL·8Vµºô„wKRå±hÌåÄ>± Æé׎æ!#ã;Ħ%ᇠü„lbNBçD–]€•âÑ6j^3æÔœ}a½Ñè˜\ Œ„2A…òWú8øÎõ¾xÂ(2b^Mw8ÅGÆ›îí`«Îvð§A”v)s¯hõ=zÒŸMyÔ~žÂï¸ù£õ œz§+põvšÁXÌ·ÂÂS z¶;õ¤[[u4J{4jÐ 4­·ø§æé(±> J'`Ðó©Ykc`€5^†èÓüyú '³àV`¼fFƒpëyèŽÂ¨†xÏúÇÄø<Ô–ÃM퀖-jÅlg"†¸¼¿BØ´Ä  çúŽœRŒIÀlCÖzß•Ã)‡·x÷(÷B ×jäG1âÄLxèZ²¤Ûß–Îßut™­´7gÀwB00*\ÉØÊ·»è„cûþð®!’& 7je@Èz»çÜ"$%É#ªQ‘ UJÆÂÛ½è°|šV²«e©‚¡iÅX£j_ŒŠ%æ VÂwÆáHQ<¥‡3y´ÌAÆÃ8â_3Âá· ‘«ŽÌy!gx{7ƒûmÆ@™;ã.F;‘{Ê©4“Å®ƒÜtìhIuUjª>II¦ëÅÊb(ê€KB ybc—\Á07§©–¢D©&Ù¬@\‚Œ)°(h‹l1û ¬—;Y¼Új›HëRßSàäŽâ4R؇¹æGÁ”Nñ4\dŽà5TYE¢Y Ðq>Þ‰wºÚ2IeuOÙûóÅ\‘)](|ÆÈ3¢åÓ¤;P²N´0] Ð$^5¤¦À<˜šˆb¨ø<ShŸ‚Áü‰(+ЈbžFª´Ìa Ü|0@Û¸*¦mŒ½¢² cH@ƒ#´>æ|zg™P~¸»Jò§Â |ZëÄ ¢%ÅÖ8¶‹qÙã@[üÞ¶0 í’)Öœ²Pk¥o ç]SÜ5ÅÜ5E¢Ma«d›âýàö*å9dtH¬•c~ ½ ¹K´wÌ]³ªÌ=eæ-¾Íþv°œiéEhV?‹ üiŒ.”J÷Ƙh!mZˆ×%^5Mãw0€úJ@OcâL‹ã”Z_}O1ú]ë+v­/ ­‰Ô81±j B¢hÕF¯ëiLcÂ<4¸æ®‹ûÆr¦ªÕ»(ömÍÿˆGâw°Ü…ûÉÝÏU›{ÚݯTãÁ­Ý\¬É™’õ¬Rƒ£Gbî€ù Ól’Ñ^Ý.QxÚT›Ã,t‡º¼'/cyÝa¥…‰Šr”­iÙKûzˆ_'kOæôàRIÕž,P_×Áiñ~Äu¥á3×@DZÜ~Õb„EÛá$»DÀT…ðá×ìÔå0øD¸²4s¯ opÆýkÑR"}d„¯U•…ï å5A¿²Y¨U)Úâ'Ph¡©7ÓTaùÊ—ÉxÃŒ»øƒÎ°aA‡à-áÀ¦^P (ÑÏýf6U=„*m5Ú“øÅãË7ÂÊ` z¤ª¹¡`ª 6±ÛHж©¥ ̧ñÖ ¡BŸa4”Ûq¨Ïò¹É"IT¢A¸À ¨F4£äÉŒ=ÉÊ*;ëEÃ穃·Ï¦mÌ6›V{§ˆwÀÔóIÕ±ckf¬-D;&U©¤Ý wŸŽé9cõ ãѰ7–±k—×pd{1ÉÖ†©è#£WÜ®žo©"/t¨6Ö“ŸÉòÕ†+ÕøêAÆAé(©n‘§V¥ÝŒûPbÊ¢¾;JJÍÂz ³uaOŠhzNsêoÊž £ ¾éX^S;ßqªáÚ¬8ü¾¦È†°aóf<€r=«®y”εGtßCh¢ sÎ|w±@ƒóË·x‘FøÔ™zê¢ÎCYH3"qõíd®ŠôÆdZ3IT2Ot“éõ,qÎ9õæŽ bLƒVž”ÜhO¡ZÛv.ÀÒ(™ã‘]DÎ×Ú,QŸ¦¯ÓÙR4>ݼ9„£JTì’†9|g×…""¿k´ü{ç£ØGâ§A%Ò3¶Ê}k¡B ÜQ³Ç÷þ6ˆ›”o,ÆÕx”Övš›îQ1‰”$£}2™ë±Qn ^¿EÏçºhN!•#ÉèA£Û‰„s]V¿[Îa±±t²Í¹f|’£šé‹¥‚GX×"ì¤ÈÍLgtÕ•á{©b¸„±ß.³MåÉÅòù©k×¢áÆŽI¥rR×ðN™Í·fÏFv[6GyëÔáqa%K!ÙØ|­nJº‹'§SÉÕ»—L”«ÄL‡™p›âWM5¢¨Uò«L}E¥<ðÊùÜA5S“ê^÷+Ï :Ÿƒ*ޝot¢OzH—Gí;~ÇÍ­—Sï4è¾pºÒ£€qÏÄNÚ¸0î­êh”öøwGfõÑŒìãüµiV0¦'Öf ¬‰ýàµÞkãõìi :x§Opˆ£XCèàÑ0Dï@ éàÔ;ßàiàVD·{)× –Ïʹ‚DeŠaãñCªPà“½ˆHá=ÂfÖ˜°¦JÄÈtqë£3²jWwc  F£}þ±x¿{Ýmå¿kÆ!NXQ”_š0n©Ò€»Ä”^ÎG?êVY"çbÀÿ0Š•a7¶Hd²ô³¹J»ÇÊV+[®2.÷¢BH·ç®ÌH¢.i‰¦HÏ#šñ€Û tÈ~C㉤·SVPôîU˜&ò-ðå7˜qpc¤ÄP0gj‹âš23j¡É&Ì( À”Ïe—c& ‹xëOnvIt§™)Ôu—wFBkb,¹ù­¢æoZÚËÛx!Lð<ÙûšŒÃ!`U0U¬ £˜²3¾Z¹Æxd¹ìí&ŒCs¤°lÚòRµìœƒ±‘™’¢©’7D«:²*™6Dm‘ŠŒ‰{D¾•-=á›{sé~4‘_ɤz+â(É‚ñ“º+5õzo‹ŸÈZ“û½•è¾ø±¿–ÙúU“Žº¿xû?¦wàHå¾'0M•2>#ãØÈ·L•Qr%*P«‘äË/W(²oX8d·TqTÊÐc efD8Q¶Çh”Î# ÜžæL—"îæ¼GrtÄí‚À1KØ©ºÔÓ%¦ŠkUø#â¤.¬”ùWñê—õ$*MºyÁ’ª†„)^Z3Å[d=‘‹w·’ÉX–m¾5—®è-ßœóU2 ¬9™3rª¹óùáv¢V;oñs§»ÔýWs.FªLR«p<•áÇÄ~³¨¬]‘ô¦¹$LŒè<#Ü‹‰€Ž"†O/äŽéù…¨1#¨Ü¡¥fUèãi¦_Ïÿ6G×rΪ:ýª•ê?-Uyìø\1|òõ¡²G¥íœ:Ë\Œb^ÏÑ~¿ÿ·:½vðß.Fs<¿ã­¤ý–»Å]ÎñóÃãw±Ê˜vEç;ðLÿ5Ñ~̦ÃÑtÕ¢’UàWüÏÏ ¡¢ƒXÁí;óÚl¾ÑiuÉè´žbtÚúL¨ýdÄèNß2£˜×sœ.¦Ýé“Ë9ÚOFŒî…µ £¸Ë90:}Ã-ïUÿë¼JEåL3ébDg‹K¢³jŠè¬ñ ¢ýdDt§o™‹QÌë9ÎDgš)¢3Ο£ýdDt§o¹‹QÜå ˆî¥ŸZƒˆŽj4Σȭ~‚ÖR]¤]•2–³Û.²ò"Ç‘Êæ’#UÅGª´Ï-ÚOFéô-s1Šy=Ç™#•nŠ#•µ?GûɈ#¾å.Fq—s$àHU¹JŽ$ª$§j’ÅðÊ©±Î°§üŒfùòÊj‚Ü@žX»KžX7S<±e[¿j?ñÄÓ·ÌÅ(æõgžX×S<±®ü9ÚOF<ñô-w1Š»œ#OtvpÅá(+ãÜý9[ñç¬ÓÆLuc|F5Õ; /–é *yC«¡§ª¥žËºø˜†ØLÄ,†ö9mÚï ·u>Évoo ó#ŠN aCP÷Á†9ãÖ=a]PöÓñ#|lßZ” bÜçk_¸%ÝdŽG‹_…:©]=èc½«zJTwXTO€¥‹ãé£~fµc­ÆOúÚ›úXª%+ˆ+Ñ<æO­íS¿S”߇Ůõù?&áj¼ÁžL°1„µÈ‰m(<|§g"jÖÖë´eîôw»âá !ì ÜF…ƒÙŸâ ÊœÄ…Ïî'€%øò Óž…ÁxÕÂx€aÀì´†´ŠWõ;¼O[ßO]uaŽ=²^䧘ÌtùZF]“O‡Ïÿ„v endstream endobj 7970 0 obj 5784 endobj 7974 0 obj [496 /XYZ 38.2500000 600.500000 0] endobj 7975 0 obj [496 /XYZ 38.2500000 600.500000 0] endobj 7973 0 obj << /Type /Page /Parent 2 0 R /Contents 7976 0 R /Resources 7978 0 R /Annots 7979 0 R /MediaBox [0 0 595 842] >> endobj 7978 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7979 0 obj [ ] endobj 7976 0 obj << /Length 7977 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ÐyË⛂öx6@ È!È!ðf³XÄ‹Lö¿õHêi=¾êV‘MQÝÚÁºgšY,~õäëýŸ¾ü£ø×ïÅû§/ÿ)¾uŸO_UéLÕþWÞ!}Ùý^8oŠoß/ÅËáóásóïË¡}áËÓ_šßþWÈâÏÍÿ¿û{óåOÝCǾœpÍç¿_?k'šßªÓçñû_ý¡øíXcß\GÌðïwÚ +쑌 M¿únŠ×Ÿß¿ývxß2`Y+µURÉBh¥ QkYü÷Ÿ‡Ÿ›úꫲÖB8«]Ò“§–d]Ú™IC¯?qª7¨ÜUöv•¿R+BYA×spkßs_˜ú:j„œã™mæ‚Xþö&íË ªû Çi'Ñ,NR[Í»d®cùèXŒ8¬ÇrŸ3æ‰ø —Àè“ÕSÁ’®?ºtmÑít‚5C['¦Ë¸Û‘ÑÖ‰©+U]]K[7Y9C.Á£€) øV£Ú:—tn´1 ìtÊÒ–ª…õU¸®b©“h0]µêÄ‹! ñ«ÆÒzª4ÚúaIËB]jå†]ëbd_úÉPáÚ|ç µÓEÜ Û­ÇêÆ˜ëÏX[7 ²/º‚ùtĶCoïåµøa \{e.ƒ«K¬ÆÞ+ÎÆ`ðìá@²p3‡ð/ xôq7&Õsü™mZÂÎ$Îrrx¾É†mj·Õb‰x6Yû¡MÖõœM6bl/›o&6ùø”Ô¢ÎÛ8Ùdíæl²¶ã6šo&6ùø”Ôâ‡m$°ÉF¨ Â¥Œ›‘Ý-ïú–7rZjµæ`iÌYV6K­6QÆJÉà0óœ“ÃÅÝX0N R‚k±šðâpTÌp¦Ö÷ ‰yYÌüÛçß´›µÍe¬z1ÖÏy1®{®šz1îä·ôµ¨ó6N^LSùŒc͸曉s|ÊjñÃ6x1®_d¹ÍÄØîß<´ƒñ‡Æ*juÓ°M¼ƒø×Û¡åðnÎrøz¬Õ›o&–ãø”Ô¢ÎÛ8Yoæ,‡×“6ôÔrŸòƒZü°–£–—g ÊÚ®ëY×'sÏÙVÜAzq\åÈ$C ןa‹HZyFìÊJ[秈µ±[[fR™±õbäxˆ^’×»µØ=‹»¾…1—j[²º¸|ãdDñhs¸G¥­[Ð=Gu´m ömÕ²ßëßo<›‰Žà b¸@Ž»ã ªø1‡jLÁÇl›3óëOv¯µÐ”È20»œ|JÜÔ2‡‚££K6¢f¸{sÅM_Ú»‘Q$LŽÉY6ec3 Ë Jµ+g“Fq£ùçD‹ñïm¶a“ú?g·†³ceÁðø»~›=kyJÔ\[KÕ›»Q5™Õ’ùG]ÎÀöÙ=<ÿw"g@â¦Ò’-yŠ1;¶¾®æ„_’1ÍC°+êñ Œù’CY8úŒŽ3ì'„ÏÐmÙ€qÍ)y•ça,Úø‘á™+?Ëå’žùí'ß3ñœ1OƤbÂY&>éÎs,(^<³SW ;µì¦ |–7>3œqö*¾?]ã3QamŸäŠïfÁï0N 'ÞaÜç¢ð©¹œ;Fð)sª|÷´ëJ鋨 îšäÜÿõn-‚¿øk¿&è>–ÕoíåÜÒFà…qS¡ð-'°6B/ãQ`hEŸŸ˜u·çôz,µœ»ÿ8HLto q; çv0¬Qݹ›ì>lLõê7oö¾]9yY2°WmA²{±¤cM Qu'aY0*Kxo®ê›Ëîmì±®À¶‰ÐœÛ·Ð§Ä‹WXÑÇÁ úQ!ã<âÎô”¨õŽŠ7ÚâF 8þeÄMYØ#¡Cîe»;$%ºÃ7é{{¿ëçûRæbde0Ÿù}iZêÑÍX+ãOŽï¹‰äÓq2øÇ ŒˆšssuÎwˆây‡õïÎæÜošGf]‰_-wm£L>7Ÿ7 FµÞÄ;Œ¼6a-qä¹£÷ŽΟçžcS.äNÔm汈1áÜ*gHppÎ$Q¤€­¶aÄ<æ[¢[‰ÖØÿÁ¨‚íàw8¬mÜÑæDNvð Öêw]cù!î‘Ç% ã UEuXßb[€û ¹h0–7isr÷¾µ¹=<뜮1ß™oÇë.ˆžbO[nÆš@é߇…öÕ*d}«duƒXÁð3D¶Ók38J€íàU¬„‚ÚNc¾a Õ÷û§;™ÈŒ ZmóÚ”ºU ³2 çëËõ×ra ‡ãR"bÍCºë ë–ñìåŽòå=ÊM2»qok€vÉØ%ã$2de;j—¦]šÎ¤É†ÌçEžgfÌËr²®œÝq­Vªk§ Ö\XÎû3ãî¹"t4g%ö…Vß;”,?—3zñÚ1Æ^ebßgãÅf±¶Ãø™>ÂrsdkFnk£öcõùl<ŠçÏ [În!†7¶þ¼näõ w6·ÒóµUÐ ö®ívm—¹¶Ë9£·¾Ì™;™hH´ö`×»†Ì]Cn2³›îÜ$߈չyè[²ne×·Õ®os×·›\}”¾Ý$ß2Ѫ6hÝ®Uw­š»VM´>-=˜ê‘<4W´Ã=îÜ<>Uyý}˜P9'/´ÅÝL„òõ÷Ûíp¨føBÄœ,§D§v¤œv"h½ÝêþqÒg­@Ôóš‰Hû̱*èì”ÌO†q.h?v\¯€/FÞ±º–NuÖ6ÑS¼Š7a”3"Q–åÍÃîÕ!ëîí6œÏWËÝy’×ÏÝy’_‹l°&däX·¢àžrb*Æ9a©Ë`UóêkŠó°:Þ]Á+lu8'm`O£‹gvc_¯™ÖŠúlèF%#ç5j;þ“â¿®BòpÅÿ½­3Úe&­ÌÈL +šX}„41n díß„%ÄüzTªãžˆY§¥šÃÞuMZ]cóÉË+Ì_ÎŽVFÆ’ð*2Þq¼Ý»k”­Ærϸ§†c38+¢(׃†kZÙô@Ë9jÏI2dFätoñoèÓ!3V„¾GZmk*{…º£b÷z¼Ô!ùظ"ÚÂí0b Ά‡2£s¸•ÑÑgÏÏo~Š—¦z²õÏ—¸H^]ø9Ò”Pe%L×BöQb磚RI/Ž K¤+¶Þ™©ËRŠ×‚³’vZÒqA–Ö´ãò†Ù–]jõúÊÙBít’?óN‡ó9Ú~ìzê:ÆÞÕ\m-2õøsÄŠ®ë“vâ:W½ƒ%uCàÚà;]B,êúÙÒ!.àŽ¿7÷ y§`Ÿ0:Õ0WìϸW9#± ðÁþ(ÁïHÁ˜jB†008=uPV1ÕUD<m.]®ReÖ˜A}ŠÅ¬›élÔ%ûT|>üïý¨¿ endstream endobj 7977 0 obj 3625 endobj 7981 0 obj [497 /XYZ 38.2500000 498.500000 0] endobj 7982 0 obj [497 /XYZ 38.2500000 498.500000 0] endobj 7980 0 obj << /Type /Page /Parent 2 0 R /Contents 7983 0 R /Resources 7985 0 R /Annots 7986 0 R /MediaBox [0 0 595 842] >> endobj 7985 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 7986 0 obj [ ] endobj 7983 0 obj << /Length 7984 0 R /Filter /FlateDecode >> stream xœí]Ë®ãÆÝë+´` ›Ý$›€Àw|'@3@AÁ8ŽadŒL¼ÈïG”(ÝËÇ)ª‹Í–.cÄ3É~Vª®®Ç»?}úÇþ_¿ïß½ÿôŸý—öÏ÷ŸvÙ¡*²óÿöÍ?ß½þ!÷‡öïûÊû/_wßößvwÿþ¶;ðéý_Žûß>ßÿùøÿ_÷ûûñÇŸÚ—š¾î*Sÿü÷éϺ2Ç¿e×?›ßÙýõûßš/ݵƒéþ÷wÎç…¯šaLtýmw™¦9ýóû—ßvïÎ ÖK]¦r{ãìñ_µË÷ÿýçîçc—æ³C팩JWes:ªò¦'küÞäu³ìÅ £Ó?:Í›/³|¹ÆO#W_cK#·~ðe^¹"«=üû¼E+\»áe¹Äž\š_bOjS/HMÍÈÕWå²á¸uEn.3çrÕÜüÒüël½X®ñÓÈÕW¥Ý\¡uÍÍ}¡þ=ô×hIîò¹-—ÛÝÓÈõ—å²½Ãæ?†4ƒÇ"jß„Ÿ>ïÞ}8ªÜþù8´S‡ç?>ݹã4:„¯÷ŸÚŸe¶øãþó¯;c…+ýQÓjÞ;=Éüé‰ùáüª½¼ùêÕêüêÁ×Y™¿~bJô${zâΞõ»—'=ÉkØÛ`DÇ1 cá7ϧ'ÅÁæÞtŸà~l9|u0ãÛ—ÀàVá7¹‡ËwÅx¸_ÌÞC"&F Œ ¯Þ8<È5Â7t„ÃdM¬5E!xˆù`ÆXŽXÑõ)ÞYØÆHH£Âþà]xº¦–øùóQj.$ðê¢'ñ(ñ²} +HG¬€À~¬¹]1_b$!úÔàU áÄj 𥫔\°Ôæ¼Æ^¨ø†'ÔÆáÁ¶ýd‡²2]–8/Š)Ym»{ûl패&¿oæ`3£*ÉHaÃpó oØàb€š !B©°Øtˆ‰ ~cñ"]HÝ·¨Ÿ¼[P¶îÉÂÍ?Cï7¦+g˜ó Æ] ^%õî*—8Ó(ÌÐ5’*‘@wtŽwê|”• ßÎܧ÷ þ“&>Ó~ÐÐ]¦(_¹3ï:÷=ðn1 >œÆÙÙ?ø¤]×±ojô¤¥ ±'øb­Ò1ÖÚ{øä>±áOÚ³NÐ,lÍ.nþ4Y÷ˆbá‹Áõ<—u‡T>00·õ*éù¨¨H!¡)‰ÁÖT^õëÇ8Å(ß{M)p‹ÞXØÛ·s~ÀF ±ÙþÃl—º#Ðu$LÙ¢‡×špçA)Æ‚¬âËós`æˆäö(±(Œ#D,Ã˵¢ßxQ}ч¹€¸v²ãÝíÕ÷ÛšAFÜWñÞßîÅ,ˆlŒÙªqAŒn.° œ)ãQiÑÌï‘Ð(šS!£8 è›82c³oˆ)âvr£„A¢Œ˜€kIÐíº{]yìjד^K½îŒ øa±®ôo×Nݳ֮ –úê¬gÙÂ\†ÍäØŽî-˜ë†Ñc~‚Qâ …k ÌS¦*¼ xu0 á'¸5FRbùAÌçáä!ë-¾ÅAâkT)ƒÄKGUt.¨õQóQ•Âr©â:5B‚éJÊX¸Žu;A‚cN&øüñ )D8KD¢Dì9ôÒŽi=©ÜÕiÓ…6]( ]h}Éc ð¨‰û/¹6'ã4æš@KœÙ‰‘mÂZOyÀÆ‘,׬ØëkV)?y;ZŸ %ˆ3!"$–žÆHׄGc©å‡ U=¡uWÇbéQ÷ö™™¤ÿM÷ÎÞî}ŸúFz§®¾Ž=Ì6}ý!-”>OGLùÉÒUo1,‘UsièjV>%,tuï·£•§áÉé‹kÎÌMóÝ4ßï7«ó„‹5ÒÍꜶûv¬ÎSQÅq$K5'CêÛyò†4ùÍêœô¨)ý–ˆܬÎ-BÖo¬ Ë™©' #õ{S 3/Oì‹«ÓØYL™ìp±ÁÈ“v˜Å!ïÇåüo-ÇßÔð›336ÎçµíºG?¡'-+w 4zùæÌråÁšó^õ…øÈ2¸¢¯üFè®AË>cýÀ50ÏpÝàØ„]ÈÂ[3Ì7ç™V j¶Ž}cО «ƒûQ—‰°¸º¾†ÅáªÑÅY‰Xƒ£jpÀŽ\!¢wB­pÌV@9_¼~nB»=Å!ëÓñ°µ–òòË£y;8¨#ja#Ì*añÊÅŽûB"•­˜tC™ùõíEÑ…À,ø ®±M<1k¿Ñ€…X\³H5ìÕ£_¤˜À²L„3ñÚ*Dì­Å²  ‹r{Ø2n„‘7±ê»›B“îÚ¬c­LœæÓÍ‹OÉŽA¨=ÉO­¹®âHPdÊáåxxÔ!ÕëU¤þ"^%¼æ‘0Y$DZƒán,.Pk_ôª°¨xJªAüÑtmݤ%ªi0; ò1´Qùa§²3¾„%Ð`Žú·OCÈ@µ}<Ø€ˆFîp4Ä4&”€uNÌqƒ°®›ÀˆvU«Ôp³R@M)à‹ÛõÊ#þ,£U,l(`iSÓXpµ){ËMå"Â3PUW8šâù0²«N8÷Õí2BÙ˜MhꌊÕÖì;UbC1þærßnû&dü„Ñ@pR¾GS3cY$¶cyÊ´Á¦“6-•Ô’ JÔ2ó}†¡ ¬Y2—Iº\@<¡F鈹4P±ú6)j°±$·®õã¿jvV]}CW᥋œ“SV&¨3ÅÃëíªZÃq’¤.z®Í]_ ÷—™«AÀfÒ¢n>ºÛù~;àWPw±$á‰Ã#¶èI¾XÕ ðF8‡vÓåp^ªn_”µ«XD aKG$ÒpŽVgYÿRð˜­Ô5f¯{t§7‡ .6åŠÔºS-ðÁñµt=¹©{¯‚+ĵ^na# P5޼CîЬ©ê#“¢¶Ï8ðãkNà ¯eq[?S×/’Ñ]‹±æG͇ñ`š –Q“‚%o-sÓ_÷”ÃÍo÷7ÕuÐÃ\KY¯î…W?/-•æ„Ä3C ¸NW1›D²^*Çæ>š2¹–—)ù­k$0ܤソ¤­é« Ñt5Õ“ÍÒ÷©Ä!?ÄuÀ1­°¼"(»’nZÔ<-j­e2¸'ÓA4_–æpÓÝŸÉ„¦Œ%Eðì У7›å£š}f^í­†@Ì`,ŒtªN̨u<Œ—õÝsÏZò`2-pi*×`P:}!…2QŽ"邸~Bôãð˜¶ßÁR &AÏ™BèL±ŽÃ÷·x´²18A{4:À©Û‰±F-¤TŸ*t¤UH¤ˆˆÑõ53Þ8;¼'9.Å€ËDàÝ‚\‹*ôÆ2'’œb öl¨*­…ªx 0g%zЇ¹É§9cu,Ç(VAÆ+ÐQæÖÜÁnaÉû¦Ê©4}ßÁnQZ>ÆÈÕK FÝaïgì0S~*–Ü¢Kh¢ –Ý‚Îà Öˆ"`ëKD¦FRf­…el'X2`zƒkl6§à`,ý?ÃX#èïŒ.ÎÜÄk@`@,ìL¢Äriór]&,µ(Ís“Z œ 6©•¥"µ\‘ŒÔÂô²I­xØ™ˆÔòv]&|bÅ´¼Ù}³hvßhöBâÎ,šu, Nwù+磡|ïÆ4SaÖ‘2 ­WuD·š£°át ^êäÀàŒj^=ªÆ C茮 ¦±Z°l:à×Y0 ¾à§âgé÷G¬š¥9öôõúßùÁûl_–Íǧí¯n_‡Ó/·¿|Ù•î`L{o®oÙN+öuÇ÷ÛÿΚÏö½¯³ºßÇñ—ã7Ý‘4oùN+¾ÛÇ/»§?,$9üYrTæZ%ŠÉCưKÿ2[(—`ªA<çÐX‰£àÆ£åÞIºLÈÀn¤šó›™º "©Z‡EˆâdÆ„ªšŸvÊ,ihÉÊž Há'p†å5 |Öäô›uõkÆôkû:Çñ—^Ó¼e;­Ø×}\õš¼ÓkrßïãøË@¯iÞòV|·z½„EÓk’zµT t‡ÑbÖ7eèÞ©am‰¹kˆTN8ä^–ÐùÛ«ô±k l|$L@ºFªŽq*ÚÅÛ¹:[RªlOâ é%ryóvU]b/b s¦phˆ@f80 âÌ»YŒ9¥$i‹ñZ .“ar ‹5õ€Z3*š.aÊÙØ4!6]ÔnbzBsÁÀmƒ±l2uB„~@5È嵟]¤3ÔçLr„7Á¦E<.<ézË07”?t¬¤ñéé‘‹– °¶i–Áàxè„óðãLV-. йÚõhBP®·ívMqÈjÛÁ›hF(•˜ÿqu'à5q‚c$S¦E5¿æ íQ!¿Êô)ºFãt9š[›¹zLÛ[œ'Ÿ[yr½Ã,–³Xcî®u¯¡· 檂p¾Wq¤gê!­¦ÞßIkA6¯ï³9¡¶ãûaÖLpÐB… ¬åA­ k¤šÀ±j+W`S¨´||SÑ$+ÆŽ°ìÝ5³¥|`ÈmzA_Yg9Jy[v¥¼­F¥¼í;g7¿ô¥NoÙN+öuG)o‹G)oûNæÍ/}G©Ó[¾ÓŠïö±¼£”w×Z+g?ì±°\°˜ƒ­éFÇP˜¥êd@©1«û3Æ5Áõ³ÛŒºƒý¼)&‹±‚ðŽ @Z] -Ê1 -úÞ Í/ mÞ²Vìë>®@Z¸1 -ú^­Í/ mÞòV|·@ZN;©¨ÜÇ…¤(˜óËrýÔŒk#u™Ä$«ª½çzûeÒBL¢†¸•ë"nUŒ!nUõÑðøËq›·l§ûº+âVv q«|ÐG>DÜæ-ßiÅwûˆ€¸þº/øB_Ãgœ9ã2/Á$Ç8=H8 ‹Õ¶Ëbµc±ºì“ÿñ—‹5oÙN+öuW«ó1«Í 3d±æ-ßiÅwûˆÀbõ% o›Ë8H°Æ }‹¥BP~C8¬ŸKt êÂ÷©m¨]xN§x¬‹kFœÂ;\` &U'v«À‰2™R]D²r&áïæ“%àƒ ² «ƒ 8 õsÜNO¤ÔY:»®æ”)ÉpAF¦tQþ€át¹ˆb nP8H”õž` À…ïà3%JŽ0% 1½µ4‡›êä ~‚Nu™r&Ô|T‘T ¦X˜î|}ƒ‘›˜"¡–Ï‚ $Š…9\“(€)$Ãû‰ñL“(dVdLÃTŽõ`¸V¸ø«@RŸ¡"mô,mL‹D!ÉcMîgP,.æL•ž„XŽ‹%1e¸© ÆÝÒ Xn2EW6¬IkV§äQ¨ŸÊ?hå3Ì›SOâÌÎÏ*®jñ¬¤âîV-|š@©R¦8ïê\a>ÐJ„-K–XQÆöž¸e©2Ù¬Ò}wy@íɃñ £á›alŸî’v&«'tŒã?ûoGÆùúãÔ 7¸SøÑp}c™iœA÷ù…ï[Ù2æ xw5â?sÖ´òC~rÐbq9|Òæ5Ì­3ê+º:‡‡ôc§ÆÆö¡éÀ¶¥Rì¿ç^†”ÁÁšvêƒ ¶âû¬àð›‘iÜü¦)&hꯔG–àš¿Gܱ¨78'LÇÐ1ĉý®°ªÌN@Z0xà|*ÁßpãQ <„é¯3Ó ò*5ö Âóñp·óùÜUeöÐk‡Í žb6Ë_žMŠŸû»ÿ,Ïì endstream endobj 7984 0 obj 5696 endobj 7988 0 obj [498 /XYZ 38.2500000 344.750000 0] endobj 7989 0 obj [498 /XYZ 38.2500000 344.750000 0] endobj 7990 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 159.500000 81 166.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/autoconf/) >> >> endobj 7987 0 obj << /Type /Page /Parent 2 0 R /Contents 7991 0 R /Resources 7993 0 R /Annots 7994 0 R /MediaBox [0 0 595 842] >> endobj 7993 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7994 0 obj [ 7990 0 R ] endobj 7991 0 obj << /Length 7992 0 R /Filter /FlateDecode >> stream xœí]ËŽã¸Ýû+¼0‘Ôô3@Ý@AÁL&Á`fNùýØ%¹ºJò¡ÄãCвFRRK$//ïãÜ¿ÿãç¿ïÿùßý÷ï>ÿ{ÿÃðóÝç]qhª¢ÿÏþôç»—¿°íaøû¾i«ý¿î¾î¿î>í>ÿ÷ë®áó»?ÿö¿½ÝÿéøßŸ÷ýÛñ—?ÿèô~Ý5¦9þüåégטãߊ矧ßÿk÷—ßí;}ñ<Ü0™×ÿÿ»²uUÕž¦13ô×Ýy™æéÏøm÷}O€°Qºº1¦Þ›Ò•{Ó•vÿŸì~:pþ|qèJcšºlŠkjìq¤º3ÝÞØîø%gÚÉHODß×¼µ®Žöñ~æz²W›™Ïkö×”åqœ®°Ç¯˜¶ÞÛJ»ŽÑçµ[pþúñGįŸæ.§‹³Ý¥ ùž‰W}õ¼øöËîû¦4ÇYÕû/?çö4fÿãË‘é«ýw'ÉSvû/?î_¦üÃþËÏ»îPÛê<Ź'E…žØ&ük¶ƒã¼ƒ_«á;àþ5 à× £Ǽ…tƒOLKЯ¿CÌ €O<´Æ» 9ÄÃ.ü‰‡ß5Ä)ñP¯ô½’ñÙäÁ‡/Gñ]rÕí’Ëÿcƒ'ó[o¤”Çû¸>¿`yËì>X>aZãS›Šn˜«6)í‡9%RZ;Èo®K'¹lQgcsy4cY}”êtÆFÁ6ž´^¶Q˜³ ©ƒg€iw.m”аGŸëŠÓ„×À?I³îÚe#E(MEœîœý³mjëûñ7µ:S‡’¾S')ßÚ+¤]‰½ ­Ow [{y“Åâ'XÞJO Ã6ælÿà¯A)ñiÂ'Žc!÷bßÏ „V(>%x¥ E™ýYßÐr>õ%ÖÕxøÃ=ž0^ƒgN»Ûއ¶Ä6 ¯ßÙ–H*{Ÿgl;à¯áÆö áo2¾0ã%'‹€hq]ðXåÒ¹aëÇ3ã9¯9lÉàõ0Q:1¢âCÄ;”Þ•ž¹T^ºG¿3q5ìëm6zæÜUqÿ̱1×4ùèÚ6æÓMx¥„—Í`ü”ųº®õPr/¥k¡†Q@* Jì6•ABdiTpç<4æ215=Ó]ëd4<%;<83˜c=( œ5ö¡D²ñ¬ºá=Åt“bI9ãªy §$õ\,+F%¬ü5‡Ñ(Âoº]›‡*««âä™{:eg²9Ûôt´ZÔ£Ã ÂØ DÜ’‰äqº+³ÀмÁ쟪¼&ûù~νÇFÖ,PYãX"Hs¶«»«ú*o³§».®ÊiÔfã¤õÁWG)ï'ãMŒEÁ<äKm¯ñfsF§Öç>l¡zÞy 9IÑœº¾&«RlE25¾Ø«Ãˆ Qñ%Îl€òÒ£gŸWšåÃd6`)äÙSÆú&Ð6&){}Ö^…mÖ^nL>] rö†ï#lyOöþf%Bã®Â‰¶+š|jlSåÐyl~"Ç‘ÊêÅg K-vÇdLæ~†»û¬pm]>®ëG¦ª›É~àcÉ OGi=Mò¥­µ•‹f½:jÄÔV¦Ò¢Úú¸m¢A¸vW§á'žÞD¸†z^òA…}L<ëG½ßœTíhÔó@Ö·D˜˜:ƒÇRYÜÏíÎ<·®¸å*«®Ì§ÊêáŸÝ“Fu_ÃO)¿]o¯«¯AFÞ^ñðöÞ^ÿó5¦~‚-=ÜÕ cŸÎó5裮?ëôDÛã ³±ÓÄ}ó´TïÈÓW„ÉÔ&l.&žA'ÿDˆ]Ít+`2jSõ¤ÉÂîl {ÃuxmQçS‡W2¹/8c‡Ào!ÎØ×æ3e/+Ú{Ÿ@ËÙÛódùã¤ò¹o̳f<]rc7xxò-³ðgŒÉ¨ö•Ð oarÒÅ‘›,ä¿q×D°ýã9 LœÈÍf$é]ÝŽÓšê*|Z»÷›´$nN[çÁ—ÝU(Ú6nŒ†b?KEÌ12’p…5gTc@µ£v`Ȳè‡üvña¿PSêÆ´Mõ‚l½!ÑŽy©=´]ñD°ñYmÇ›~éŸöŒRJ×ßß=6Ü¡*ëÓD^8c/Úà—f ¿6@€—ÆéÙ¨98`µ\ Á .ƒæÆÐÀCk‚:ƒyin >˜qä]yF:tä·© =Âj]­™?ܳŸn µÈ¸¦Œí¨Ei( Ç@FŽ@u(Æá üÚ _ìùc‚`ã˜òñ £Á³a¦ö€°9KØŽØÆšXåÔIÃGO/}¹ á1­°½IL Ÿ'#âÄ춘=ÈUaeš‘.ÌÆb”Ã!ÇÐUž)1°Ö°Œ T ïŒ  t"ÆS0?`-@W1LE !¢œ sÒ·P”h°µÖ&eTÍÄŠ|.Ý9/¸°ùu.(%ÎbD¾"²¢5f̋҈­çä3–«Tb®¿ô(YBbj­÷dë[WyÔGøt#Í2IÔ0&öÔÍ—ØgLd"rÞ6}V ØOL‚!)ß/cEåX7CM+’ÇÃv̤Ƒ"ÒX]ãS7µ Œ$$É”@RÙ?’eL)ÌX×xÓ'Š‚à6ÆÑ¦âa©’µ*Qšm;PÍÛÅ1AßS•Úk=*.ßÐV7,?nS‘ا«b‹TzUÀTÌ=U†¤Ö—èß| إŖߠ•Ÿ¸ö%[šWlÙÿf?›p~nÍìá¢ÊçvаÐì¨~ª§™Òç¸Ì§UÚÃéõ_w¦4/ñËî³G Ä‘$§)¼&}”˜YÌô¹Ú™‡15˜›íˆë0¯¸H~Cážžf¶jFÛeaO3ÜEoP!—žàÎ{xœ7è îª6ëÒ ¢ƒÈ®,—Úù¦°L,¢Ó3•þ½–]£1Ž´µyRG&¶.½)tý A‚Ó6V¼x£6c­(isù6çÕdåà0·ak»30%DLEzÍÒ}r’0Â8¢«•3IÀŒi·•¸}¥4»2‡Ž|å*¯nÔFÅX&ë PŠ%Íͦîy]>%æn#OÐ8•ÆSDL=Ë`ÚDH/lWÞ ´n 3ËNš[¯_‘ªv}›õ•’"å·n{Îÿòlô4íƒbBR®Ÿîü"¥”@Æ“UÄ­s†ˆ(€€Áp$ÍZÖwc±ð%ÚPÁ…µ¸8rʶÈM\ZBðøÚbžüBiy"à0‰Döå Z²-š±–”&x¬V¬ÄVkâz4O#Æ–Іd5Ô Ü åªƒœöîùTHÝe0挧‹#KüDÛ·  =£E¯·>ã'î9鯂;$¹ñc{É%¦Ó¨„i&}øþš÷ü4Πy/=±pn𚿪ˆÍš¶¬Çt_÷æD[•Qá9/eúN¡d<· óœð×Ê÷á gçVnêÚ¼®,&'@Êp˜­,N…«Â¿6H‘¨—Ÿ¹¥âû]eÛŒÆÜBH>pp‡H2×IÚÍØSª§(æ¢z=i+š¹µè›¤hEëæãn [ÜÈצÇmO«¦¶ pDö¹Šb¬\Ë&¶B7…šXÆ&jeÇDíâµ§P)T þï͸ñå#û‘Ž}‰æÉªd¢·Ì8ã•Õ³ÏpÃh¸›Jª„©T-$…Íâ'®I^·®Ô‡"Ö͈… Ž¿"ñ¥n¤:“zâ1üµ=Rq„.Õ5Q™º+ˆM«¡$à›nº—0•Úªµ_¤¹œ’ka˜$þ6…2L-^Òº+ãš)†[)„¯aZ“:DÎ s;ZLàžÇ¸w2V-ÿúE‚±Ûާ* Å d’E×ß0"k‘ 3h]H­®—öµ\³oB5tú¦7·m!nêÎ’qÒÍÙ½Ô ©#Y[R‘¬Û ñŽ6ŒYhEK3¬#ÆÁ8dZ›¨€æþÂç›ë—PÔÕHõ%ë—°~W¬ !Q½…ïÀº«dnf6ÝÑBzS%aâ[—f2e³Tjã’$Š¢KšU”õ@âb²ë ›I|¤­3fž,ÚºéÕ}ßÈ55T,ÓŽÏáŠze­1–ÖL–^ užçk[ I&^ž‰NvÍxÜÆðÔ5‰Ò¥©ìx}çb!¬mñ¸ý•LÍÜÑ}»pÀA· Ãø4Àû˜»!¡}‰„Ì=xœèuugÓâ[W ?hSÙn,Pv+©g—,ápo/•.xõ%>ïp²ýg€¿3™”* $5ÄS]Kç‚mˆéq– Jæ0ÝFÇÉ<̪µ#u©ìŒyßÅux¥·¶d¬ùj €”0Ê·ZßïSä¼%kz$½ÄáQ§#®ÓñÜØ÷2_êªøå>uWAð鉿kÆNåú÷<,0R1ß®.7³yJDÞ${‰‘"ÄŠ)#fKõÞXZaìÐ6£É2"/Õ™Ÿ]`tô¬;Mgîái–²¾øÞ¾eM?U×¼æÈK…f°ÌËsÁl=eaqZ¿†/ų°Ùê zbà×,lJ…ßy6ìCÆÔ±¸ßžnæ)ZÂqp‰`ŸP»@4ó4ƒsÃë)ñ5G=Å…šx®¨ŒÁUqÅPUÚ‘Ú&Ëb&ÃÌLÕÕ¬ô²ÇñÏþëqǼúiî,ÐíÅš]ãÇeg¸·å™ tûy7,¢ž öµê=\¸p}Pþö0€,/xÄ@“å=Ç͙ٗæöqXé4ҀÇC(pÌ«§ œ?àÅò…eü5øÎ`Üš ¥¿héÃ2ÜéïÅsçs içàš0 c˜3ûĸª2;ãÑxàz<\‚ß©f|‡ Ƴöœ!̘ÌJxVñ¬ç‚Ž8(pi·íõ§«)Üa`ÖWÇ ÊS|ÌÜ‹é̪ŸOûO»ÿAå‚ endstream endobj 7992 0 obj 5395 endobj 7996 0 obj [499 /XYZ 37.5000000 206 0] endobj 7997 0 obj [499 /XYZ 38.2500000 431 0] endobj 7998 0 obj [499 /XYZ 37.5000000 206 0] endobj 7999 0 obj [499 /XYZ 38.2500000 629.750000 0] endobj 8000 0 obj [499 /XYZ 38.2500000 593 0] endobj 8001 0 obj [499 /XYZ 38.2500000 516.500000 0] endobj 8002 0 obj [499 /XYZ 38.2500000 629.750000 0] endobj 8003 0 obj [499 /XYZ 38.2500000 593 0] endobj 8004 0 obj [499 /XYZ 38.2500000 516.500000 0] endobj 8005 0 obj [499 /XYZ 38.2500000 431 0] endobj 8006 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 437.750000 542.250000 452 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_configuration_files >> endobj 8007 0 obj << /Type /Annot /Subtype /Link /Rect [491.250000 176.750000 507.750000 183.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_starting_out >> endobj 7995 0 obj << /Type /Page /Parent 2 0 R /Contents 8008 0 R /Resources 8010 0 R /Annots 8011 0 R /MediaBox [0 0 595 842] >> endobj 8010 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 8011 0 obj [ 8006 0 R 8007 0 R ] endobj 8008 0 obj << /Length 8009 0 R /Filter /FlateDecode >> stream xœí]Ë®ãHrÝ߯Ðz€Q3™|†ª®{ xa Qx1ðÂèñx0è¸< ÿ¾õ URR'É<ŠÈLJœÂô­º”’ùˆŒç‰ˆŸþåëîþû»Ÿ~þú?»_‡Ÿ?}+öm]œÿ·;þùãõ/Ên?ü}×võî×ß߾﾿ýòöËá¿ßßÎ_øúó¿þö»r÷¯‡ÿÿm÷§ÿ8üòÏÇŽøý­5íáço§Ÿ}k+.?¿ÿëÛ¿ÿa÷÷ãˆãë†ÉÜþûUWÕeœÆÌ«¿¿Ë4§?ÿøõïo?7 ì-}Óu·3•­v¦¯ÊÝÿþ×Û_/‡/ö}eLÛTmñÈ‹LU_eÊëL×ìÊzò¢Ó¡áÊèu©9úqîâûb?}ƒËœn[¨½°Õa²/vu+ºgtÙÝïÅÁ3—Þcã|ß5e[ÕEßÁ¿?´ª®¨Oû2ºÆt‡­Óü8s­Ó†ƒkŸvo¬âi_F×8ûSü8s­Óvÿ%d<¯jñÝóÅÏßÞ~ú8lf³ûö—ÃÄN/<ÿøöû[wøÇQ™híîÛŸwÿT¶ýçÝ·¿½õû¶©›²>Íïü¤ìOOº}×·OŠúôÄîëªéÚ›'Ýù;?~ñóéÕ¾²guîòĘÓc÷¶ìÌaüß)Ñ‹ |R´ðÉò)áu•ü­BO<;Û,_Þ ¼çŸA<ú~zR§Ãm¨ûQf妀O:t^¦ ßÙ¹ÛæÙ{¼mðÅ.9cÏ2à3¾±5ΦT6üŽ”ðœ<§þÉy±…+ÆOhÖ3¸mž Å7“<„5^½÷o©#Ýê¶uÅ›ìݲ.#À§  Øñì%Ã0g Ø%ž=bxÿˆÛÀ(” ™,¡†0K/ÏOŒ‡ËHäÊÞNÏ!ãïàó!žP$#zû™=ðPC½Áó±œßa±Éœú„[ã…â+'ÂáÕ%Ÿ)Æè­ècìÏf2\›x˜à~{F?bÄ$d~eØób† De…ù¢Mƒ—ÁÝxvŸ¡Ud¨ZnÏbYê!ÎH œ’ !Þ™»ìQ—ß <¾t"Ê#d=Þ Leør˪:¡6sp<·å7­ªÐÝÀ:£‡¬Á¸ïDEäFWÍpNÅ䜰*OoCߢéj¬¦K¢®]YèêÞƒÀ´Žgx±ŒTùï!ñ„bľ„‰žRc™¹Éò•åÊKU£Í¯Þ¥hÝT¦@vHuöÀ™ª¾a¿?-醶 ô¤èዞ ºÙ'5mPKï=©ÐŸ”%ñ¸;p¥Ï¶£Ãm zb«X6LW‡XC– ñ`«l¹qÉDZ”̓U‹ÿ0×ãý#Ë!.Æè:Ç<Ò‡ðeÌÌuÅ-[çö–˜ȶ!ûÁ£aŒÙéà¸÷ŠÌÐ-x=†øCÃEæ\µ¥s¾³)j¾³šxèA5b¿É. ³¶Î£Ý‹wIà8…}ÓŒU‡=RÃbÿÇL‰À.2ëòX' xë´¼ñ –Ãéd­±©ÍÈo"Âe1·åÐxÑÌ„7SåäKÀB“QŒdw)•›À£ß‰P&Þ =ˆIÊöA ,*Áù=\¸`‡šƒýkûq­çý1ži͇gÙÎ^GSíKã "Ơˤ ÁŠÕœ¼@ziäUÔ“:ž[ 5 è¾cö`¸ ø6`Å7‚ƒ¥q±².0Ê!*c§—óž€6ÂCÉà¹c%´PÖR€„ÓÍòöXÄŒŠÌä<˜ ¢¦q´ëcTGY=#™›4² žÐ¶ðÌšHÝž*¼RCŒ#…3±cÝÐå¾Åg’µedœ—Ã8Smï,“å#ÂE6·ôA¢YamûzVØšÁo:y‚÷ üþÏm hjº7klŸáѰXÄ6<µ‡£yF[ Žv`ßÜnT˜³hŠÚ™ªŒ ‘Ï8¬h‰'uø Jˆ2Ä€W .. Îуš„³Noöì5Peàͳ¢xí¿yuÓ+ú«ÊÅŠ¤Â‹äzÔ/ÃVžhÊñÑzHã­íDô,¯ýèqý¤ÇèΔ;‘y–d<š6mÍE~2rªåb]©FßY©. õREa™35£A±ˆaaèý\|âÞÉÍé²÷Þ3gg‡EbžM7·öRÌádþ„“T»d‘_NU±Y†(g^©ƒ*¹V•sè—Õ¡ÀËÁ¸LøðI€†5˜Ñ}ðv‰æ’è>ä¥^É„-q3ÓÄͦ(³¢òÂâÂSN¨¯j—|qõxÜØ{ä)±½:ðšxÈ—ð+QeF>´‰´ _Q•aûT™C†í"„0%ž5Þ£\1 n:)y¯n3u£îÉêºÞyç KBô¥kmRŒ#–ÄŸ´¨oºåL.‚GÀÀê±??¹Éöl&µ§kdx*U4{2|Ú6½ë^¤3·éF¸‚Ÿ±Sã³ö9CS5EÞº lœŠ1ü¾õeëañ „© £åâ:@Hì(¯mœÃ§ªb+”(ƒéq åo;§Ç˜hâEj—UÛιԫÑ,f:Jº7îõôÙOò c±G¦#`rQšÀ H3–%ÀçpzÔ>å<¢Ø6ëøÐ–øpç;³µ1#`¶Ú‹~1,zšqA" ¬0^ £ò=ˆ)"§ÏÚ¼ëÙrä¥säç"ñìð~,Bd{Dü²&Ïazž3Nbf4¦z§hÍçWlRå5{(ŸiûÇdôK—Ò“åœýy#kk{ú¶wE3H<ä5] ¤åH gÊáÅõ¤E°;0ÕÓu Õ}㜟Á,ìÂî \#º^,®]NÔ!·ð‰Ç•D8¦*\mœÈ“µp߬:Œ±m&Jæê¢’oû:;’/ ·1®uã!EÂwéI²f¼´8¸C¸’ …ç“òõ]·ø1µ¢uöMŽŒNåMe¸EÛÈäzòª’cÒ#b!è¢uª”½X×_/gô¼UÝ,©¯ÛÍç^w,cŸ;5ô^ºœ¦¸aÏz‰ÞãñÓ¿Ã'x4ì׆£yüô |#¦†³Æs#Ö3„ðÃâ-<¼¸8òaÔ«—œ¬)Ç)LêŸH’ ÕúˆPq™JëÂíj!Ïö %ñ܈õÈÈx]%ŽI iÓõ:ˆ„€S×õ%‹DnBÒ !½ß×8¶s‰:ì@q4cƒ¾ùCà…dqfll3Ù¢‘+›ñ Ì õš Íì‘iZù¶…i\É~…ámLòãÂÁÂ*Ruta (…€(EÉ¡Dè]©µ®È:4©®Šmá]û±ÝfºÝM·;îY]ïÿ~ùw³ïºbל~´Æ ¿ívÍ郧™¿ùõ­©öÆôeי˧ìÍ(öú‡Ïÿ>}mç~ÛNÞaßqfrøTw3JwûŽ¿¾}þƒnòNÓ˜ÙC ]1 %ôãÙvnäÕV·äÕÖ÷È«mÝ£?üfB^ÇOÙ›Qìõ;.äÕÚ{äÕ–“w”Sò:~ª»¥»}Gòê£ØÃ*p•¿›;R¶A ’ìí-IöÕ=’<ȇ\¿™äñSöf{ýŽ Iöå=’ìÍäfJ’ÇOu7£t·ïˆ@’}‡$C*^éVëŽ@‰íÁ„½¦ÄöÀ觔ؚڡ’ão\J<}ÊÞŒb¯ß1RâaÔ;”ØšbòŽbB‰§Ou7£t·ïЧÄÖ@ô¤‡±»è”uV4ÚƒF3X'¹I2¬¿Rü7ñ•(‰Ÿ¬¸[,pQú ~– g6_9Ë`¶Ù „,¢A"Ú~d›ë„Dxރ둸 ŠžT?>‡A(Žf1¸>ÁéŽ8Ù0k @gÍä@&²|¹Fë‘lOÇ|66¸Òz‰TÙòö³˜Šdhf*ïy£ 1ˆ ÙX¾>ùupÉ1âlhªÒgë>ÞUêbÕDgú]PÙÒ o’( JEûŸÈáýM–ŠE³˜YgˆÉÙîU(ܪÕq­+³Öå#‰„ôØ>†“áSš¼…•¯PÞ03’há!òT_(ü‰f9¸¿‘lßNª3MòôàY!ÁU눥 õx:]姆3ÙŒ Ù2’"rUHMq;TøAƒ”ñ±OÀ`‘=vkò4âô¥BÔk&…WÔ-«ÆË4“c<ϩׯ͑ÎÜÊå&§'Ð,ŠåfÜ¢CE{ö€h?Å€‚„T'e_]J䣫©=©§ÖÃ…™€S¤´åPJHáÚô6¹§`ŽYG‘K/[5U¢IUVW6F!ZîFÊ5çfèêñ•ÉP3«’š ?PJ€Q*=XRè` €3¦²‡„˜ë/¦f¬‹lñ„@DÔT!7\¿X8)Xħ$\83FåÙªnÑpÛœfs³ã²-ƘžUs­æ4±:¶rvŠjý¾ÊšßfÜ•PKóÄ×dëpÈžJ¯›çgvç¬ælù s&Ù$«„^¼ÞLx8ej©2a*ÏÜlŠ $"—‹;RÝ]a qƒW>ä.ŠÖ5ë9ê3…˜F¥ffp×3–ÓT:vÝÍEõ=Œ}QÏnnh]‰¤ô +ÒF«— ¼DÓ¢(Oc»&—|!Mlù.l‹^ 9žË´´fHT·4MHoÆ&`2,s1ì•Ý’qä‰NÁ²BO°ÃrèË{ï lÒ4ë|¼÷ܨªFO*쀅3À+õ´Ê‚=í*õ4þ¦¨]}A4¹k Ì$ƒ\XYÌw,í³3 ×c`4àƒj™¨J1½ A>‰OU€é¡÷å:‹`ÐôEÖÖeî¾0m¨•Q«==Bdït¬ªêŒ,‘è¥!œ%(;))ÚáX8‰ž!Ä­Ù !$£!ïúr¯HTÍ$OÅ-© 3ã*ë^5Bê·.\€ZKÍòLÑ—pV¶.Ý3yü;–ªã9þ8†,ýÙ.f]Ø~ò$4›£@¥±l"™¬ABµ_õ3•¨®¦°u%ìª.fúð:®d>]Èv»†ÍÐí1:Ý8Dg[‡@_'gPÂÈÁpWî=1ð ‚{bxÖø;V®q ª²ªÞå›qõZÝ[gŠ®Ú®Ýª®]IälxÎÏ@ÉdÊ®q‰/š›èÒð¬|_.ØEa®L¢å”ÃYT¢àuÙ gY£ÚžÃÚÍïFûc@€9WŸM‡ŽøŠ:¢U†U.s©n½Wu¤–r›NÄtµÑ±WûÕ2±ú(›" U[º>ü<Ú0kMP鑬»“ ¢3üd9n6}TM6Ã"Y ¾M¯ Å;|Ø÷¶þ`7SY_Ëc’½Üêa+(Š+¥»IÔò‘mÓR¹`>Ë8ä4Ð\ .#Ur(ãlX¹ææfÒ3Ù,&ÄsÖv®¦,G¤2íDUÈ5â.¢Ú ¾Ö§­>íôØÙÚØ¶¸þÍoo_•ŽyôUvæ‘óá5¨ùÝ©Î;ÑÝvýÿ}Ü™%íÄE­œÎÙ³Hí[ÛÃv^^¹Îö­_àh°yê »Üij:ÛºôÞ“³rÖì­)òÆ3xG3ÀÍ`â^;Z¼×x=ÜbÖžv´ÌÜpkÙÏh¸Q-nnËìuÚ%ñ¼×bÙwˆ5Øìæ†7ÀU¦IMxv ï®ìͬÑOç/ð¬àÍœ]vÌðpˆu?¬ Ae\HTD¤b“L¢€ŒQcxëˆų–ís¬\ÅX¤üo€‘ÏaÍP!qÙüµXžÑô ™Vܲ>òïq¤ÚXÙ8Âqcáa@Y K¤ ¶Lèдp¯1ÿÑ€D#™FÇ"ñŽh~R‰ò„ël¼­yz€w|¹c— °2l“›hA1ŒCa‡‡Éuy Q%ÚæqU(†Œté-ˆ+Ľƹ¦9݈C7WòOWäüxe"ç2O3BÑdCa@z¶'A–íé-!ЉË-…KÊ"~qE¬ÑÄê»6Llu¹P÷•I“¦Kϳ˜Æ³²f¿ÆÐtx·•+/usò…Å$sD² 0cÁïàü‡ª$v' r“\ižêéµè²hÇ]ÐoaÑ8¯Ì@‹¾šLMÈ\‹y’êž^tlw2>Y”«2qR¬N’LiŒR ÆwáúððžhÆ‘˜V|1Nübúc`ÃÅ¥sª˜“,š‹™ŒSU5<Á „xÙŒ§jb ñË+sâ—É<›+ŒA/‡ß77P´’JÊG¹–ï)s¢A·-B)"Œ0^Ä5ªéë\½!}¤y»\k»\éÕ&H²ÐÕ¬[–o*ï /fz>0¡à,.U ¦é]Y”J_Õ[¶Ù³r“Om,´líN‰2(M“a'[ÍÔ MÞªF¦Ão. U"8¸ªzþ~FÂ6RÝ]âzy4åUcœy:]&Ç(uS—QýÊîË+sppÿ˜ÌªÓ ¨DÏͱ)䨔5p™â~Ìvd`ª” ŒVÒ¹ìÇ¢ *îÑ2øÜ½eŒþçÉrc|:I•:O•ZÓ¸gŽ«Ô^ºª¢“½·XÖb \jð 2)a•5 nB¯ú]ÌËäMm\C8%ìÒQÙÊ%_ewš¬À(n@bëûÊ"%èyD»ˆ^øô¢\ue}%Ȧ£Ã%¶dä{ž¬Ygí ÏŽfáh%,Næ Ÿ¦QHoø<{€K·©—T3EU/×Y“;_%9>KýCã/š†’ ÎBó®–Í䮦¯¹"Úa›Êˆsºt~'›5—m?3(SíKãLæ º‹G‘Õ÷mç.€ ÖÂÀæ,m¬]®5Sm Óí6ö™eÐC§®ãqž ‹Ê¢´]}Ÿ=m–ÄŠ,‰ºœHÉÍHgHdtcĶ…ÂÐHKÑŒJ¬™Ïg70ØöÒãׄÇî7Ì Ûñ8¥—ÁîÄM`Ì }BUŽurž¤‰fÆaÔô jÂåÒeW¢•@֥ȓ›aÙ8zÂfÍÜ’É¥g`º²ië¢ !Œq Rhc¦b Àûk9Eëºh™½¢­¯fÁ´ºúh=¥¯ô¬Â襧I‘èhŒBŠ×c±š†Õ[l×O¨Y«#Y[kšñ”‰Te²4ÙH®`6ã)¹ÄìÁjC²Åò÷›kö·W3rCÈh0úê’+Í~}„“1¹ÀLIµ ä—È/ÌJÅ›+Ðü·¼.e††2‚Ùƒ[ 2U‹³vDS>í˜e«}¦GNP¥ù"c±Im­ãíµˆR6I|“Uod‡ï3²C×uÔUÃ=¯cÁõ1ÀÇñwS…W8a>ñÄ ñÀè0JÁ'‡Gó¤”ÀóÑïLnŠºsÉ’p²c~&Ü‹&­û×S½ú%Vʼn×ñ,ýšnKãxr°ñµ±u¹ÏèëëæyÏÚÄP×9K{–{ÏTªÃ"^Ay©ÊÏ0ŒM¤ŽÂÙÚ*ä’Vqä ¹šáŸ²ugÎùžž>âÎ ƒQ„G>‰7‘؉u»yî‰ë¢úwñ*XÛ?ïùÐÀ4Àlµ¨ŒÚxz<]¢w^¬òq”a$‡Ž×ƒøc\«bͱºøn…gÉeŠL¥ÏƒË0œÉŒ6 ácH‡.2 XÝž½#ÊérôHwNµä­ª•tU«(Þ½º¨fgš¾bÖp ‚(‰JÜjv gÚ¯3àªBoŠª§mZ÷6Ç5vµyUé,o:JB'h´ô‚Ÿf—x¾ö KÚ„É&L–Шf ³©\Î+G¤®.„)GÄã_Ã~<ÙHfþ PñÝ:CJä’ÒÚ·‘¹Fí…n¸_Ö;¥ÜÌ&$ÎÄ$=âÃvý/³œÕfÏdcM†_3À¥Ÿ„k[idÉkV­{G¨Èjƒïl¬óNOiRè–„Ò½3ø€£H`ê—@óh®vZ4¡ÙC_L#ް¬©™«LaXQ“?$%-yqeaÔT~Í‘)ð:¸óŒ†Ÿ0›/Ñkˆ §7Íó̲dóªç4£æMéÊl’¨tÄ% ᨓà^€ˆ¤ýQ9ÈÊØS¼Œ*¼ k(‹±ek°+Kò'áŽd¹Í)‹$“d0V6ðDp Ö½Îí`D˃>àùQMt«œ}§ÐK±¸¬,j’BIŒx wpU…6ÅcNâʳ‘¢…:…f yª GÖ ¨Ü‰µ¢'¸ÀɘœÎ)ô Ò@Òáé ÒF#ø5—icìrAš¡+EPË©²%å4 ù>Y}öäy1Ã&1‹µ¬£emÅ“dKþ ÷qcò„d«„á0"VWÿ‚®>™ãÖª‚:ãŠØ +0ÈÚ\ŒÔg.þ#ÖD¤JkÂx,¦…—h>j4 ך5öºW§ÍÈFWgÛÍÓ•è-÷¨+¢uá…K±dlä sÑ—ÈeÑ9”œž«2ªe@f(ãz¤O3U¶)RoÙºþu9[÷Фö@š±î,2YY§ã4duš{‚° hû€çÛcuT3ÀÊC¡ÕÖ–ŸJúÎ ¼¿½q%¡(W‘uAQBÔÙ–óý`´½Gx’J¥·ø,ýu¤Ù:½årÙ}(+b€’4æb×Â4†!½ȽÍÅßé$G6Jjn=Ô80ç“L§I8ý?Á (ð;%|‚×3pÇ{‡£A ÑOâ)‡ÒWô WàIÈÁv- ÂVðhšÀç;·}'WS_"Ù’›LÑbY9Ä`Ñž¬„ï &‹ú/<Ê;A)¥[5=‰R>Uì|c®)ccNàL¶‚l^Vþ%WU‹K7Ž4y¶b®9×\~¶½Ž“+t”Â0ž€ŽjŒ-QS€ÃhtŒ>Põ“=%²‰ôà£r07)ãý`6~‡š›F„MµgyïZp±ìg'F¯j,·qª2Ú+E[­@özX^  Œ^œ˜ Ðq…Ë#xÏÚö‘;-[5Ge+XÆdR‹+%¶¹™8¡ÚŠÔ•÷®±c&ywÏ9ÏJ(á.R¥†A)Öð;Œ‚‰Mnñ‘¬G€éMyˆ|œ XŒcZ·e4 «,@X4îO]eàÆ" =“2¶2s³);GFson’6H×bÂ3“ :mütËã¼N°6›@Ñk‡bytÊÞ‰ö ÑžÄÑ·2QkL]ºÖ¦+•…<˪6DN'q½Õæf«Ï¿YtF&¤.—­\}/áìÌöνçB´ç 1Ó 9­ë´¬nà¸Ò¶»þÍoo_=„­t#ŽspnD¬f­)ÇM„9ÆZÁØ"Já`0z²‰Ç±JFf¬Â½ ÞN¤à¶h–®G`è ˆ1†åˆÀ>È¡_ãTïdÔ¬·Ç²„Ö0«:눤•g<%¿dO"2„ËB°I÷£Ó`36ò˜z›„™@FbE)€‹–EÙ­I|æˆ'ÉÙG’P¬õUíZZ¬D"{X\ ¿Üs(l_ï‘uß G9cø-ƒ”sfpõ˜U5sJQàÝ9¼hÖÌ«p˃¶žê)33ãjK*ÁMÍÈDeÜÓL®è=[h2žc»iÆ;©Ëóæ8õ7Ù2= k²‘‚Œ FRPL¨|P§G'ÓÒtråbuue ¯öwö˜kŒÀ/¬k›¦Xë;G®=kp*Z=âXØ»' D3iêTÆ·.ÛŒ~•}Vüر\7L*Xru-V2玶hÞªÍ9 ãJÇ€j²Ë‘ãTõTѲÂw6}„˜HC`Ü%ÚÙL‚£}‹d`3u›]HÖâ¡<è±ìöX—D6‡†§®Þ¹®Ž£c­Êk†»ìJúÓT=èõâã)é œfJÀ£5¨ío„[WïRDb*S:iÏdÒÙKqŸ±¾ìišw˜ü'¶@O†¿÷¤BO·`Ø{ðh=\ Ÿ5 Ï ¯g Š  Ì2h4Ï àhågø¼£sëÑg]o7 ç1ööz¾„ ]·Úcúœã-8^À¯´þœzj|9T3S˜Q´ÕZH³(ý€QÝ;²)çgâµ±Z EslËÖ‹™ãr?3Å áUb.³G:.wäá2Sbò6˜ è2Ò¬e°„ÄÝeîXâXÅdé²ЧÞ¦E4£Ö¸/ŽiÍ÷Õ%ö’ÞšÏØþ®Z8·ð}3Ø2ÿg׳y n½‡?»ï‡Ëá½;¿Ì}`×Ý»XÖØ}aŽ~„]YÝÒï=-÷¼Öö“9SB¹/ÍéÁÕ“óÎ5Ó'ƒ-]î?ÆÕn(k¾ ÷Ø9KìÞÜ>†•"W f€•+0Œ¥™.p ŒŸÄÂàÎ2  ~gÐlMÐÒ¯’X‚;þýJî…kÂ$`pT!Lìïˆp=»ÊœnLJÏ®ÇC%ø;5œAÁxÖž;„éï³ÒÞU> >> endobj 8012 0 obj << /Type /Page /Parent 2 0 R /Contents 8014 0 R /Resources 8016 0 R /Annots 8017 0 R /MediaBox [0 0 595 842] >> endobj 8016 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 8017 0 obj [ 8013 0 R ] endobj 8014 0 obj << /Length 8015 0 R /Filter /FlateDecode >> stream xœí]K#¹ ¾÷¯ð9ÀzKzA€yÈ!À`È!È!ØÍ&Xì.2É!?n»ìîQùS•>“ª*[d{ÆÕVQ"ERäGêû?~þûîŸÿÝ}ÿîó¿w? ?ß}~ªöm]þ·{þóÝël·þ¾k»z÷ïO_w_Ÿ>=}:ü÷ëÓé Ÿßýùð·ÿíìîO‡ÿÿ¼ûëßþ8üÒó/üúÔšöðó—ãϾ5‡¿U—ŸÏŸÿëé/¿Ûýö<âùu1ßþû;ßÕ‡?“1ñê¯OçišãŸÿþðÛÓ÷§H{ËÊçOw~gzowÿùÇÓO‡œ‡¯ö]c[_W}ÿN¾¼µÇ·»zgl ¡¿üøGhx…ÁM×è ~¤\|UŒkL|tm†[×­mVí2ºKœqzƒ)—^”3»áàÚÜö•Säöet †øVQ”Ž”kq®ÍíÚ÷§%ëk…5»Œ®ÁÆ+ŠÒ‘réE9s®Ííöàá—¬nÖì2ºC:Ûê ~¤\zQÎ܆ƒks»ë*En_F×`Hïý´#åZ܆ƒ+sÛVU§Çí—Ñb«Æ+þL¹·ñàÚÜ6¦Qäöet †˜Ã½ÁŸ)×â6\›ÛÖz=/íet †8£¨8Ž”+yixpmn»ölY×àH«g¸­ïôœòåâ«ræ7]›áu[+*óËè,iœžÏ¢\K™ÃÁµ¹Ýœ·ˆ ·Í Ø:½óü‰r-nÃÁµ¹ÝöŠGî—Ñ5Òy½#÷‰r-n‡ƒJSrú¤x¾F¾øöËÓ÷[§Ù}ùé@Øñ…§_~}ò‡<Ç÷M½ûòãî÷UåÞýa÷åç'cöµoº¶>þÞñIÕŸtû®¯[W¯žøã¿÷î”+{ybáwÞÁïÀÑlF3ø=˜6LA}|âÎKðŠ‚.}´m˜‚Ç'õÞÙÎ|;Ó ŽÖkgjÌIÜ™%žFF;­u§ÄÊñðÍÛ`³ñRwð ÍA1À£á¥ö.XSB5âSøA„=XeÔû÷ælZóíÊz¶«ÅêK&¡³©’Ó{>|9˜5%‹ÔÔIRV¾F „®­p|ºo —®"" Ç„Ôã]‡©‡3Æû$"ó˜ûSò«¾OÌûtêO£õû¶©ƒ÷`=©ŽÌsîÍ|Õ U9#wÓôAJáo* sÚAå4ÝYè>¬8sek^yR½‡O> 'ƒ¿öž&‚a«\£À¤¿†©¶ñ5 üÎø›>Ÿê-œiGP )ÀëVÁ÷àÑ"`ªáL+,SóɳϺv5‹× ËK%6¢V,ÿª‹ü+ÈÿÁÐù/ò?ÏrCß¿‡ñ"ïÁ{rŽšñG¬µ,çðŠ:(ñ¦€Ð\M¹ ×kÕ5ïç3jo[OKyÑÞE{çÔÞkæÖëpu"¾¦ÓÖ¦gàiâ}Ñ(k’Ø¢QÖÍB£àùà'‘uôA]S<Å5쬬žbãŠ^_“ÞX\ú–×ë0‚Ÿ8¼nØë#äºhÕ5ȵœVªYsNÑ9˜-¥2Æ83!_¢'±€á ¬§ÄñwpJœÁÛ‰")q"ùO™`ž;’”Ÿ$‹ =àÔ#H…ùÒ¥ºöa1'hÓ¶æLÏš˜PJJ ”qÆ|òH__é›Á{S°8¸HP€CÖ®NÙ3’{f"€çü¥Ò4S¯ø™1ßgÅ1—l("À1éKXŸ¶2`3Yß»iÈB\›Þ[8 8¼ôkBÝÉ› ¾FƒŽoHªÅ<7廾 ¢®æœkBÎ0å°Ø…'‘ÙÊw¤ÎBÙH^NÕŒ«V²Úë›ÔTçŠÒp[™z_õîÛÍófbc{~t›®KÈÌ/ Œ0~þ1\6(NEWÜ“B&ŒºTð=¢éˆ SÙ”,Õ¿‡p3†:ÔÛšTD"ELâUÖ+ÃOr¥àw˜f/*ûHÑFõ• m”r«–„ÈhT ð„ŒÄbËtIb0„&›`š¹`…Ã4L(½ªòîåó6‘¶¹¡¶¡e4H‚UÆ–É¥gÑP‚€Ÿ¸ +&ÀÆZ5í²*—ƒ¾fÀÈÃ$P©h6áü lçî"»ŽÙ£c)†’2îp%2Q|¶c€Å ô“A£2ÂLP*Êx}ó…j£ Éô5#ÂcwiAÃZ/gY‰3ÉòxÄÇË‘FâŽØ%Mñ­¹^"AfåÐKBq…ìî ©‹¶èø\MÄ~dã+C¶ôZ‚ 3ad5™-H8ÓLçe<;…¢+VSõ6°¬LÄ&â`,»·Sf‚ÖÝphÓùé\Uy𪩩0cç3™ò—”|»3í’³À»sGÍåaØ‘N3LïCÜw@´“ÃòJ ;o邯ë²gîvÏ”‚‹GÙéNPmV¥Œb—}”.‘ÍM,!”uó©ò]:’Ð=†@Ë"»…Q3LÉÓ=†™éɲ^Ãןð ÜÕè;LPJf›2¹*Y‘I8xâ\œ£$2É‘#å&´ šd¥<Aµ JX¾”€ÆâØ8á¨)ƒšÛRnŒ½$Ü•!6SC¦m‹GÄWi%Ú¥QžÃR¢C¤™k‘$í–ÒF—wUspΦoù HÖ§`ñÖ_¿³ CºBɪ /ÖcúDåï† @†`–íu`Í1„-ä­æþ[E™´•…r¾NXÁͺ¹.}'Êu¨Z/åºÑÀ¤J€ÖvêèÙ+¥uýýH-ôñ˜òŠñ ã_e&¨[•¢åú ¹î-2†ÑTx§Eޱ#¸uF0MÝÙ3‹p¢ÖÁ»ÃI×m^^’â RÞT+ê[¤|ÕG•½™yoÚêáöfÀIkÌŸˆìཉ¯-+Ú!œ­i³÷N8eªxŠËuûD Wù1ÿlZM¢ð)„¤à|ø$S.tCºHÑ8¶cã(ëâH 4©…l#ŒÇ‰å¾qhÅ}ÿE€Ç•¯º*L šÞäF¸Úµ¡6ôE…E")¹"P  ¾Ó–!bclZˆ-§pT—ªmo8in ÕÁèÙH"»FødÆœæ2U†ß ¸úq¼ÖÔÓ2BñÉ^±æ÷M¢Cg#ƒ|Õã¤Q÷*Ô`¨wçêß—„ËÆÃ"n»hC±¢š¸ãßÈ&br±j*ÿ†ó£ØàJ{Æ¡®áZãF8¦ ’$"(`¨Î€~¬ûÀâQ—¤K„”o8xéžÎ›*ô Ü¥À]^iɤJÆ·ñ¢.²Â$øžáH¬¨oº6Ô7Ëgš·F.ÅIý#PgÕþ~uš‰ùžeÎ]å'5Áò¼‘P2íá‚æIz?B›Æêè‡iºº¿©0Í X³ÚÙZ„ „v6ʸÚ©2¸OÞ÷NgîçÀOJ )öƪY®+•ËR &XbG ‹¨†*¨Ï˜©f ¬µEMèŒ)ë7Sý‰ I¤öŒ¸aGä`…bÄ‚3³7³OKkæ:ssPä" ‹‡Õ6K×ñhŒ¡<î屩 wÃiÄ2„àº6Ý¡ÉuwY¶¾ÁD|cRl5Á®ÞÌ‹Dߘ~ÀØ[Ä„(ÂŤZ1íà3Åýî#Fî`¡€õ X/?K5«›:Pÿ¦EjÌÕHñ˜ºÐÎ O ¼® c ¡.£3.ÜEHX€„/Z¿ ªïúðDr?HBclN®@ gŒV „9¡„¶ò[¸¶¹@ ¥¡„˜ÛSŠïk€Ío3>o¿¾™>?1ácâL!82]Î%|y&cò°+_G‚¿L>&ÁºEµ[prZmナËbµÂjGhc‚S·xéÛ?ûÒ×F øØ1g²uL¯ßÅo}e‚vöã|-š —’@X±«‘`¹Rzß31ÕÒ|ÆN¾å|~ fÕþ³TöŽáûI̹>0…î=\©„fQ™Š¹šÓU¶õ%þº¸«\œÛê®z;¶)Ò·u黣pä ‰}¹D¦Hìª%¶„ðó왉†{i‹Œ!6 j6Si˜0fUâ¼Ë”M*ן ÷0 ¸‘phNÿÚW÷Ú‹¦‚£EôÖap4G³oˆÑ°FÄ ZlI"kpGáëòom‘ÿ"ÿ{Âõw ÂrAt2ž7Û| Ï{†ô5Ó§¡mJ_·Ì`ı\bªñ‰Pi\N«’{fâ´Z_®a¥jßBp.ÕcþMÞTþ{þíéÙÚ•ûf¯ämçg¹¨5¢ÈḐ”¬=¬#&( .L ’`¼#QÉy’+}Ï Zp¨3Y"Eµšßªâ†@¥fòÜ„fm›º–BãÎ"„Z¡¬¥Hý¾lw6¢E^L]ŠÃ…cÿX„àh‘F>‚vå3bçå`ðÏÀ'ØÑ‡‡u:ᯎÆíªÑÍUbƪ¶û&°¸Æ ÏÖØÝ7N‚ݲ] çÛ„û8é–#h;‰“vdjS—÷s1Ž‘ffëöÇM¨f¦Jµ˜³ÙˆzìÄ‹T*` Æ«÷Uï¾¥÷ÀÔK²E"‹1k×ë¨Æêl¸wç§Ç… ¹çßYAErbFçDæÞ»Ñ}€}»QÄgS`–_<—_-;~½•_ïUóÍ^=}2k“›„n‘öÔ-òµ·û©†ŒÖã;>^ôái©Ìx©Ž3>N¸Ù?ð¼]ûú“_ž>Gt¦Ž²=Ò à)ÉD"ä!{§Ö Þ3Dë˲ϯvJˆŽ£Ç¢H"*ÞÃôýcúÕo©0r¶(1E»¤%* YJAèèÁT°âóæÃñ=J ™ÜÄÃÀ8Kv„tÒ%²#*×?¬/O]pÆÚ˜[ñ˜Ãï6/}g¤ŠÙ˜§ÂäÜDiËÙ3 ©.·Æ.^µWªœ7^åœÄí à>¯Qgê¡ìÈJHß©…r€ógJSwÉoŠö›À)BÞ%ŠŽu-BÞ?PPµºXâßè¯N§97©¡*F$"ÞØ‘dð²”÷A\™-[T’X¬JG4"SÆÅD$îìd ê‹õql#Ä>–%&ÉÍœ—spE¯¼Ž„ŒE €ÚªVȺÀ2ú9Ây‰*Ô”<;s¾gà.‹ÛkPËjТZ)©r7B¹a»˜TïòeG)¸‘vJÜÔ- ©œm#2.QQgÛÙ¢-|©›hÒ˜9üQ½œ6•œN°Qó[`ÍJ8O):Q‘3ïКõÜÆPò•wØrã‘’‘È‘‘À-E»ÍbÎaÙ%¸«çâùlüÁßÁÙF,‰x DsI‘j=¬)puaÍðžÃ2±Y„&Ï–jÛs“lÜuU¶P© ‹€w RÖ=ŸRWÌo‘¨r0^u‹ª¤ž@ê&œAD2‰²½>d…ø†²œ¤h_B³‚H˜Œ Èö‚’€ª2õ*±MSÕ›ÀVmªd$²ý°Yƒr‹vÎxEg/·£—xE‰W^nÁIÆ¢8Ž€O;XF…ÏœXFñwðL—?um&fù\˜ì]‰éÚµbK"–ÊÔ]ÀÙ\¡ÎˆÒ‡­ƒp )GÃÊ «B¬>1F½ í\¸ ‰SZÊUÄiäÅLÙSó3¿³ÛFû´gjØÁÀŠe[/Mž¼5!yUîC|DÁ í\=LEx²Ñ:o +h+»¹/¿G9ꫨ¸d&–*7³Z5r‘â3: F®KfDšd%¢Ú‡®}fS3=öæ7R‹„›™2w\È-R®$ѵ,r1ã*#ô–˶Û®á*÷-Î1Æ™ZŠ>ŠvËôëû<ž‚àúBꬓz@½Z¨ÕâôõÛ%€C (qŠD•p«.¾3NÉïÈT toG}Ypƒlû(¦[´°CŠÙjàZEŠËƒ r¹ÞØË´'¶à¢…mlZØLW#Bu È»Œ@ §”*$Ý’³$léd# „µgT·L,A¹:>“¤0H˜šþlæ2—!€¥)"#"w×ñ“×ÀÃßÝ׃9ŒZËOS¿0Üv׬©;X³Ê<ÇÂw/Eeå´>í ?9Pvo ×ONéôfüdð/ì~ˆÅ¿’/õÍ{ô7•ê¿FÛÇa¦¨a;6Qþ…¤ k†©&8ˆÓµáÛ‰íxe¿3“4õöElY{þûâ3£áÚ98',«F8°°@‚YU†P æœODJðwê ß$Á˜êÈÂr€×€™i ÷*¦ÃXð|:Èm{ûîj+·„õ›mo óê$7i~>í>=ýzæÙO endstream endobj 8015 0 obj 5476 endobj 8019 0 obj [501 /XYZ 38.2500000 143 0] endobj 8020 0 obj [501 /XYZ 38.2500000 695.750000 0] endobj 8021 0 obj [501 /XYZ 38.2500000 590 0] endobj 8022 0 obj [501 /XYZ 38.2500000 695.750000 0] endobj 8023 0 obj [501 /XYZ 38.2500000 512.750000 0] endobj 8024 0 obj [501 /XYZ 37.5000000 475.250000 0] endobj 8025 0 obj [501 /XYZ 38.2500000 512.750000 0] endobj 8026 0 obj [501 /XYZ 37.5000000 475.250000 0] endobj 8027 0 obj [501 /XYZ 38.2500000 590 0] endobj 8028 0 obj [501 /XYZ 38.2500000 143 0] endobj 8029 0 obj [501 /XYZ 37.5000000 332.750000 0] endobj 8030 0 obj [501 /XYZ 37.5000000 332.750000 0] endobj 8031 0 obj << /Type /Annot /Subtype /Link /Rect [101.250000 666.500000 136.500000 673.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 8032 0 obj << /Type /Annot /Subtype /Link /Rect [149.250000 666.500000 189.750000 673.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 8033 0 obj << /Type /Annot /Subtype /Link /Rect [384 491 459.750000 497.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_target_languages >> endobj 8018 0 obj << /Type /Page /Parent 2 0 R /Contents 8034 0 R /Resources 8036 0 R /Annots 8037 0 R /MediaBox [0 0 595 842] >> endobj 8036 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F9 9 0 R /F8 8 0 R /F1701 1701 0 R >> /XObject << >> >> endobj 8037 0 obj [ 8031 0 R 8032 0 R 8033 0 R ] endobj 8034 0 obj << /Length 8035 0 R /Filter /FlateDecode >> stream xœí]KÏë8rÝ¿â[0ñ!‰‚÷ ‹n ‹ ‹ '“Á`fNùû±lÉ×"uhñ¸HIþ”FæÞkÙ$ÅGUñTÕ©?üÓÏÿñþ_ÿûþ‡/?ÿ÷û¯ÃŸ_~~«Nm]]ÿï½ÿï÷÷hwþþÞºúý׿½ýöþÛÛOo?ÿ÷··ë~þò/ç¿ýß»~ÿçóÿÿåýßþýüá‡/õ_øÛ[«ÚóŸ½üÙµêü·êögÿùŸßþõwïï[»3ý÷ï­kìùgça<èú··ñ5Õå¿ÿýõïo¸N@Z/]«;«ß•5ö]õûŸÿ|ûÓ¹ƒ±ùêäÝÚºêü;Ùy«o½ë®z¯Û ïË2­«Ÿß=_ãýÈ¥'E™FEϼڦª«|«ý£õ bTÕäkü2òL«4þSJ#x$Qõ[䇟yûÃweÕyTÍû/:íÒçõ_ÎSR¿ÿ¾ß¤ç?ùãû?T•jþñý—¿¼u§F×ã‡'=1ð‰²ðIŸ(øDÃ'>ùG]Ãßt艅­Yø¦ÏηôàyÓpv4µúž¾rÕWø¾Á«÷žQ8;Þ;°Ü5žÑ îDý þ®~Ÿêsú9ŒŸ,8oì·5|Ó ïƒGïóí—³h~Nªv@¤Úª©æ¼{ÆmÔƒi›ú2빓ëªé“áæž\§Ðž¬¹ÚÖþºûWyT-lÕ¢V‰úä7‡6ÈÀ¹A7pHWiRŸŒvŠ‚È<Â7Ž<¹ª sªmãÚIkpf~AüxÔ¸ŸÏþ«ãÁâ™ÅƒÅ_w™2csO½Fdòát¯Ž÷läÕátáÖ17)N>[°y×zc‘1FÎ<±ÿ"» #b7‹^F®ãÙK_r+³ZùÚ,r@I[ÖÄ‚‡ú Öšt©ð ##Çœ‘µÄ…±SÓQ©±ý§LýÝR‚ð•Ž)2¾_dNð~g6 ÓZ©“½üüFö.Ô.² ¥â iÀ¨ fË02 ·F-2¶ ÍhFØuÚWËåeg*¸êá}ÙOøàßà~°µécc´%¾zE.e¥®x¸ M„§˜™üÈoDµ‰ý&u˜BÞ¦rfÏê€f…Z ¿aˆ CÞ…àd¤5 Ây« àŒa¾È´°5‚:×Ç\îëˆSî*¼C"' Ã×ÄØ"®,Åð*àO0ã–Ö'?¯Œ—JŽçmÖ¬‚¼WôÈÅxù=˜1\§Û웚8zÛ ¿©î€xÇ0¸<þ?³‘Á7ŽŒ_[¾.}c.b«R—]<6ÏFYK^äv´È}Ä« °Öxº„‘þ‘Û"£K‚…>À{„ñ¬%*R°Õ„£µ\§„q)¨`€eªSÓª)Ê{}/UŸªÎLGð ¶vµG•=%ù(¿#Þ\…f42j܃¬oà9`ɇÂ&b^áÑ/ïO}%t > Œfòų—dÝ ðZ/V|;íãø¤Ž…¨ƒ€Ôa”XfÏg©EÀGvŒðÅÁŒjÂ~ì‘ÔÇw<8V `\uû̽„ðtGvërHFÖ¶«?¯}èj|²kjUo+DbDˆmOë[ÁàH¦Y~ EÛIW¶yý¦ºk|)³ºãtË™ ç vïà'ØÄäT™ 2AêÆ?1ÌýµXúHfü.»îkLë ¨„Ëz ­c±¼?y*†pºÌe¾ØÊÆHo'TYÆ?DDŒ…Í÷"/… ’-»VÄëZçk¨ù47ÃÁØ¢ƒaF8¤‹²`hÒ‡³L’fgËÖ&µ¡VÂ7f}˜}߇µ¹Ü†‘2Ö΢ºwÕÍ^Û·]×€ªNW3öîô|BO†ù¬OÚ·}þ“l zXљ֓2§«¿68W½eà;l¿À~¾Âß\ψjFmäïݹ÷©Pkƒ'¢9¥gɹÖðo œ8ÃØò¥Ú4ÞD%™j8~GX1f¤hÒ<ë3RÑüЈ)Íä5‹ÆƒQYúÐÅž ‘K$å¥Â¦3^ÊàÊ]P…ˆ"wa†éA4hª1Fx&|†‡§³*cYç<%9(x>p˜(i‘óâñÁfï1Q“Œ³.ʽ„§8!F‘ñ3½æ M y[ýET\S‘p&ú[8‡tyŒ<¥Êe¡ÁåGŽJšf,TB-Ûá8SÌ’ð[ÿæ&A ÁœáÈ®)t1d4žˆ¡¢?‘l¬PÞØDJ&1âX4Óʃc¢Êé›â¸ ÜJø¬y¢SÅÏT «ktL°pÄ·ÖÈ}v¹–§ˆéd—'@à<ÕIßTìí‡á_æãþ…UÀ ­–Í”J˜©Îú3µ~²Ö74‚”ûBÂiõüW×YVá,÷“u™«¦'@ÿÛ›vîþƒ¿¾ýœ- Á– X6¦f•m{6£7·móÍntSöS1Ù”¶Rþ¦Ì³}GÞ"@\ÌŒþkãOèðäñ‹zïuîß/ZúôõCXzúöuñ–H\|y¢’ˆíÀ¸ Ó3¤xµï…=¸=_a¿³Dô[{T À·«çÕÖÜK´H–êGìºsOºÜ6wk|•,ìDXN†ZxE|"'תVƺSµžR¤h~D%õÃàÁ€xk¡”Ù· rÛJÈR^‹Íc§3†Ø.œ&ŒpV'qÇ>¬!kE.ÿâ83U7C¼«—/ˆŒ#vÉ.Š}ȳ]™];0Òœ¬ðMPƲð¬è¤—™ÈÃr*›ÌÀøÔ`AÜWÀXâ™qô4§ª1nðóŒÿîNÎUïMÓÿÑ*uýÔª÷¦ëQŸüúÖØ“RvNݾe&­˜û>ÎßþÝö?{÷~m¿ó'çßLGÒËMZqÓ>þüöùwÙðÁ«®´7Ózâ]I÷¢4 ÑΜQ6>Ê''›ž#Bèq\ŽKÀG€,ï¯.Ï©¨ºª¨ÚÍ©¨¦òÕGS…*ª¹)¥±sßÇMEÕÍœŠªk¿ó'Šê¿å&­¸iTT3V­2 É < Í«ÌAb‚D¨ËhÞˆuê‚ï¸xSáÖD °#1P8ÜŒ›šy²eR-ë,•øÿq´s‚c áŠÉ0ó&”Ëx–“ÑO{YÛ&›÷¾«êÀTľ\<ª”³%ÓþyÛyD05'؇2䃢ÙÏ)ÉÌbËfC)ÀT¦R‘-ꃷ¨hµç5)nUÕXO“f® .«“(Ïžb)…ýG¢ò‘±añËÔ+“ðzQ '!Lfu•Ê”]»ù¡ÈÅ}}N]n+ÈKú«†,©/¡3…¤¥JWL¬³+´¶ó5¿o£?æ3kîažjÊú/¹gáÒcÞb\Ðü!/nÆ¥Ó­žß.IâMÄ0’¹dÈF(–»eI0DÕ*c{2É™ú:¶¹ç­0"¤Íèê5ñ(£ƒÏeËYiEZûÀï¶ß19~ º¯óÙ¾`H‰2¥ŸÊêå²Â18¡ øôâ4Ÿ .]þÛÈX­Ì¸R‚ш÷¯Ïç—ÿ†¨*ÿv•úGf• ûbô'•Uš9퀡Ïx±äŠ÷a!­”8©åwVdD1ñ>‹9²A¶ÒpÖ×V4ëà ¥.lT*nM*|Õªz¾jU3¾jÏLCKûOüðÕ˷̤sßǾj• _µÊ}˜ |õò-7iÅMûȾjµ7Ïg(+då‹,º”N Qt ¢ž,a¸©«`¤vs»e_0–±:e=SC©`L]p¡ìµ]6ZDµNéàìÖ9£G¯<˜t¶Hôsv™ „×àÛH)ÊA¸BdxéÀ•HŒO`ª— Ê\Xœñˆ éÎŒo}oA€]2ž±R~CfÁrô“µÈMçß’ˆ|,JŽaš° dCÛdaYRJ“ë-B•±ºÿ†r>ŠvgHˆÔRüŽ¥–A'"l1p°wöÚî#°fK[ãA8B›ßýW×þ¤®¥5ð;2Ák×Ìár{ £©‰qZ,mEê®n¿ÆT¶9—E™=+š^"‹ñ26Ã>‰¤ô÷GÒ­˜cg}¥@Ô¦ñÔšÌýB6xõÝX(~7"¾|U(+–™BÏR<=·Ý»êf9šëVt·.¿&É<¼[¡OèÉ Xê“öG…ãD[kà“¶æFƒ#ˆüá÷œ¢ê|b`?ú†O"£îЛTs2—“|ßÏgø›õSÁ} WƒnJm½]™©¯ÄŠÀUÄogŠYùH?Ù+ „Ôµr£Ì’­o–Ù_\ŠÅ€Ñ¦¢÷­b\¡Û*‹ÅÅl%qùI÷Zfûn{ Å29™ë)s ]ž#»A¥†áeö zb :FYlí©ÀÏtÂMHtæ/i.ŒRª½ð\¬#Ì+Ã`5X3B1G ZšåÀ †8žd}›b9ÓaJ¶Éê´^«éú¤’`Óʲü?É5œ³2›ÿ~(›GUi’ü£î” ¡Ž«Ç—ヒ0KYÄdf^&Õù[vÀ¨æ¸q|y{äàÁ­ lÒÖù¯½'éÙüø xÃø˜àqQ #¨¶Z¦kUB€€íŽ;Ýït²;Ï(#®˜ºj iØ|löÍ(U¨|¿ß/Û}¬$¯T­ï?ùëÛÏ‹ŠÔ‹º(û1LOáȆœSÕ¨ÅB¡xÔH¦¡ðá :™«>ITp¢n”¥-Zkž™ŸR• $°ŠŽhu í„ ®ç‰ðm¬¿ŠºgòP0¤u·£üîÍO^`næðoœdk flÜN8¬gÌ… UºNrËo ×]ÚœôµöN Eæ4\Sõ ŽÎÂ1p‰cæF g´˜kÎéñXŒî”ì¸úí\7¬ãx¸‰H7Ñì&lˆR{èOX‚Ì ëaWëhÿmNÎUïMÓÿÑ*5|Z¿7üáòNÃ'¿¾5ö¤T§S·o™I+æ¾ó÷‡«þgïþ¯« Ëo¼‘œ¿å&­¸i~ûü»¼•µ]}#ÁÅÆL|àZL²A ðÐ`ê-"¢™Jª#ÆLªÀz8T)gh^u°¬HêsR¹US©Üê9©ÜZ_bž? ¤rÿ-3iÅÜ÷q“Êm5'•›ÎïãüI •››[qÓ> Håö–B**•™ˆyy-ÂAÌ cŒ‰œeN0›2²þ »jÑ’ŠÜF–O(•¹'”Ɇ`ø¥¶ï×N )Âú(Ükõ¬R*3Ä%9ÓdŒó•".’)X( ÷8ù™Ù^*Iý°%Ö´%Š‘ÄÉò›K.–ž.rç$Vƒò|=Tp›©íÄD3{H66¬Ò0> IÊ™5‚KÝc œbŠL=F&$±“dK‚3¶Õó4›Ïã·]ÕMðÛî|äCü¶SÚÃVûO|üöò-3iÅÜ÷1â·]åfðÛ®jý>Οøøíå[nÒŠ›ö‘¿íT=®‹(~Kqµ>fŽË›í,ÌC³K‹2bdáÆÕ9§(˜6Èò+½lÄF ãÁ¥J,Fu¼þŽüpûa'´ïµñµÂO•/”¡ˆ1¾”„ÎR—ó¼çäõ‹ÀBrr CŸ#‰™8ÖjXÜA„R3jŠŽãøÉ±>Q»­,Ü‘G5Ê×8-2O†n3¯êôí‚M\féM^p“3 ;P‹),;gòW\ög)R#¤ˆ¹Ÿ>íŒE£+uˆL²ˆ»™É8&Âfp?›÷–oÒ+ÙçwºvÖßê²–¿¨’ç¶|r(]Né®ÏC¾Zq#ḠÆ!ÅpÁ0„e j®‰{ e Å=È9m;u.Z7ç\ Òéºk:ÝÔ=Xß܉c+æ¾›sÑ6sÎEë§öŸÎÅþ[nÒŠ›öQÀ¹XßòÎ_ÃÂÙR1›RkßïZŠàË+¶Eb›DK8Ra› úÀè‰ QDÖ'ƒžà<¡ Ib?Dd Sƒ•ÉíÌ‘)šÓû§´§f"3ŤìéTÅf.ì[/(¬GDí3¬÷ÕøoH?Öª¶Åð60±› ½^dR˜Â‡XÁ•º¬ïYÔgõPªÎ׊{Ð"xK¥Jj [ꥢJ1‚ìùˆnÀ£”à ŒgI4p£pîVk«_ÕÚÚgºØ>¢Vµ6þöa GYKö”©^=gM¯A~"•c%¢rì32 Ýxä½9e&ÿ–ó¹zêrÍœÈ9ßCsþ$ðõß2“VÌ}7/³s^ g‚>Lèê¿å&­¸i¼@×E–¸q¹Ëe¤¬ Az¥2½@^ï–p4«ág–'o 1á„¿ÕÓàhj¨™|æU î–E ¼.E¦H$“¯™ P·ÚÓo/r`¨tš„ø †¡]żU[”™ûV`æØKÌÞ%œIO„¸¥˜,²Ž‰„€’g¨^Ä.^UØ~y“¬î"]{Zìã`™‘QùJ)&)ÃŽòÅžká™]N¤˜ùul Ç(zÙL¸ê= ±Ïî|°çóóØÔ"ª”JÈ+E7ËhwʃM”Ö*ü±G“ ã 2Up„ˆ]¦Ú;•xA€ò"U[ËHJ)T$Á÷œ˜±kdïXÔÙb\hÛKÙ¦.îŒHGâH”ºñ2üíÔdvW!<’ù ‰5dév%û¥¼Ÿ¶ÒæÞûyþ· ½ŸçO›©gòò‰çý¼~ËLZ1÷} ÞÏó¿uèý<ª‚>”ïý¼~ËMZqÓ>²{?Ï}uãº"ØÜwùÜŽxQÙG,RÂ1üH&î„¢OX•¼Å!dK‚D„3‘úŸÙiLéfÙü9æº-J;E1¯¯8Bƒ$“•ß‘Yמª¢®úLò-ö³« ¶§ìl*޾Px£,ŒPÊ¥)¢Sb‹¦%R ÁÊ›ßyóܬÁzÍP½<ò£X=‘rê…B`5ã0%Úv½¤L0Å2W]$"b”a„€H½­)àȶnœÓÀf`Yá¯ÚëW›“¾èÏ×9°å3×T°d¸`êa±û¬Hý†,öc_lq_ì fî88–(¡ d^Ξ0jšG¥3*À¶ª}¸¼ôzB-vÊû.Kî/O+ζLBÂp—-)L­¶ìØö`#§…¹`EBåÐ|¬> NR*"Vɦ²už nœxÄ>Lx¿b‰)üÍyT®ñ¯íøå–+G&®íãŠïZ〚öP˜°¿HB2ù»"¤×²‡.ÁÓ´üš.«ÀÖ÷d¹,åLLi;Ož­_º5Ò“ðÎ8D7¼ö Óåâ¿]5ÿvj.þÛg¦º|Ä÷ß2“VÌ}·øï¶›‹ÿnßGëÂøïþ[nÒŠ›öQ þûl.ö.퉷±ï+ÅÝ*›S*kŽSZJ–ãAaei{žIjt6fÇ!‹)@\—n˹²¢Ûú嘕1 ]¨\àÎ霱á¶õÔcY¥XI„Œ`8BñkIÿ‰/ò/ßr“VÜ´"_Ûq]JÈÞTŠj)%˜Ž㯦Î7˜ Î )…OŸ) È8 J” t)tiÇ"ŸáK`pZ!q¬®§ðª«¤K+ø)Z’áØcrØR\g‘ h$à!Ùtá eÂì`ÞG–¦3¢?¿JH‡j^ÉT3žGõ½€þô`©æÿÆI¶†‹ FZû ÓAY sú ÎlÑP¾Ã¹V×->“«¬p ü06;þhI?Û°)ÓtOÇÖeßÈUçïd\®™y7ø›AƒÍÍ¡Ø[#}j¯÷G]ÝîDPù*_|ŸTÞˆë ºëKض^° ^0`?Ä‘‰áq.&ôCmÄö‡Ô IÕfJ³¬ÍͲ6>ÊÙâ#©—o™I+æ¾IÕfŽfY­í?ñ‘Ô˷ܤ7í#?’ªMše™¬Y2ŸåH`$ˆa9ÐH\tæ±À§ž©FÏxñ%¢«„ ö‰º#‹Á{²…ÒE+jÁ+ðÌ$¥‹ÄìeÇmÝyb?b£|˜Èî}Ûibžh]ë©ýT›9û©®}ÛæüI`?õß2“VÌ}7û©VsöÓy³ù}T¡ýÔËMZqÓ> ØOõÐfƒöSS!Ý…¯¢–/W ”î#x„ãDm“ ” Ï«B„¡3Ñ×®‹IbêºUSuÝê9uÝZ_•ž? Ôuÿ-3iÅÜ÷qS×m5§®›ÎïãüI ®››‚[qÓ> ¨ëöF°Au-›ÊÐIÉfûŠ FÏE|ø:RHgQT+LÈPÓð!ÉYIžGj îJ£ôÃ;¹¬i_ŒY‘)§Í0ž‰R0H(ÅŸDD s»m0’˜a‰>.2Ô”Çퟗ›€ºg—½µç 7U¾Â9bŽX€~ôwŒ”O]Z^Z»´ë_ZûOüKëå[fÒŠ¹ïc¼´;wi5Æ¿´öŸø—Ö˷ܤ7í#ÿ¥ÕØÛ¥'‡b[¡¢™ å$SELô&_*{«˜mG€ç)“ulWóê =«…ADÖ²HDÐlÀÌØ…Ló¦¥"@p²P~[R;O{½ÈaÞâx¹ð-–ƒLlJsE »“~´àIJiæ*ü˜/òÕÓ°ew e@.Ÿb1ïši¦œ½¦™ãì5ÏÙÛ\Tš‘³÷ÖŠ¹ïãvQ©ç8{MísööŸ•zäì½µâ¦}¸¨4#”þŒÎxJ&®lî‡Èqia£B¶tìžJƒl9÷5¡Ü,cüQÒŒál”¨R@­ ¬—R–…›‘¢Sª(ׯb¼U ~!â÷ÍUó¶ÓjO2.sÙs1˜òK…˜–Õ—Ÿöa-"Šº9!³‚ Q%cœÓ‘½Êpm¨îFue‰Vž0°²2;åëÚ±%k}ˆ±¢‚ñ+JÎ’CtÚ)·²qsÜÊÆùÜÊý'¢ãFnå[+æ¾¢ÓÎq+›ÖçVî? väV¾µâ¦}@tÜÈ­¼¢sÐ nJ}8†TÙ(öÃÛÂ&Îk„Y›®…ÙŠ7ëÌ Á …(~è¬b^µBžÆ•½¶FçEÎöë¦$릛#Y·•OÛÓâÛ~—o™I+æ¾›í×Í‘¬›Î§ê? l¿n$Y¿µâ¦}ä·ýlUœdý _r÷D¾¾â)N)š;YLu1^¼u‡Í]QD–qøEÌw‚ò¢XM®–ÍÌ,¥×`Y?+ì©Æ+…£2ùaÂ)JBD×N¥"3ïè„‹CB+ÅYÕNÌh«Üœ­}ö¦þ“ÀŒÖ£á|kÅÜ÷1šÑV53f´U> Uÿ‰oF_¾å&­¸iÌhmÆ{4£_Ž_0§"x]c9bøŠæSFŸ¨§‹ŠgXϨ7ºzÈg£j8øƒí\XkÖª XkƒÞ?Áý`œ'+cFH!ÌÂÁìøGvcÖúBj±’zµ½·Ï}D©ý,JW˜®ª”käÃaŒÅ‚=%8ÐÎÙ w LX[Y ÉŒt®óôÍÇ;2p!b…‘}‰dp&"Π°4aØ%¢Š[á¸fÙhF|›ÍâíX¾‘}Á\Y£ŸGo2 î̲#1Ô*–‘Ìzh•匠n:o5‹yø‰Ú±X.R ‰ò.„"•†M7}ƒKðwìᲜÀÂËd aÓ„ð» ŠŒzdr$dxKåo§FöZ@å½ÃýFIÄM¦ô6ÖxZ²FuhÉCK>¹‡J¥ÍHëÝ,‰ÅYÔõ4΢næâ,b {%šFJôß2“VÌ}·8‹ÚÎÅYÔ>ÁQÿIgÑËMZqÓ> ÄY4ªôef×Q÷ïúpbƒ,TþT¹M¡KÆ‘%ºhÏ2f)N–ÝkgޱÚÚÅZŒb©]Ε’bãàaQ2jÊ–ÞH˜\YL6­„@B6ÍJTˆMT6¶?¢¸‰¸ ̲@1OŠ03ÀWgj¬§ØÌGÕ Ú~­º>Y‰„Zÿê¸~øQæ Y"¡G>ŽvÆ%†DC1 ŠcDKù¿…#É‚Ü{<ù{ dd8åEI0e;6·4a4·À+… —ªÍX:])À–qkèªñö†lÈùÆØLGÛ$[}9µxd™z±‡l}SN¸R)c2ІDèïY•_1&^éÚß´!ª#œ%OÄ'åŒðh­¯×ö¦%t 32“¸eŠÝÅâ*:3«èì\\E@Ñf¯mÓȈþ[fÒŠ¹ïãWÑ鹸Š. šëTWÑËMZqÓ> ÄUtݨpò+ܾ)©Dæ?ÃÇT,sA”l;ñpëÖ¥B"ïã«DáÅ–u¬1¤&_„, K¸‚Â<^pÔLu÷ÜTÐ¥3ç ‘ñ·©¬k;Oáí /¢Lï¼R_˜©N6D¶ƒr=Áè¶~±˜M^+=±ÉëóÐC›¼øÞê+ßÛξ|ËLZ1÷}Œ6y}ÞÆ¡M^+Ÿ·®ÿÄ·É/ßr“VÜ´ü6y}ʰ@0؈Iº`,…sÝr¼LX9á!1îL1×sS×ëæ\AŽd}Í‘œ‚ÿý·Ì¤sßÇÍuàÚ9×ós=ûO×Aÿ-7iÅMû(à:èì¸ 0óÈÔb¨§ìsÆÿÀ®½ZÀýžn[ôÎ`¸Î“¼<ªòÚ¶"a¸ÛŽžØ™Œ()ÌÆ•׺ñ´—Ï%ðëÕ‚¾ÓAÈtX.@#°ùò¨cÊT!n¦”áÃ¹Š¼ þD¸}±€_)CjϰɦT&¬SÞüö'à´¬Õõô'£"êR:`ŠÉàç I‹! MÕN¦r3Hd¤7׌ô †qù–™´bîû¦jf¦ò3ëûO|äò-7iÅMûÈ€4ÊŒŠßE£À#À—¿9¦ì ¢WdœHf SÖȪˆøïdˈã¤0‰²ñ)öƇq$ ³]æ%eÿ@É5É»8'rPùR_8Ô+!Ç_"

    X ª=uÚ{Ïù`ƒ¤íkFž`Ù ç ËÇH?5±«ðð¼á}]IIAÈXs…'ZuÛ`8NûrñoŽDžÃËÆËön-ë(f bИàñÅ‹P”kÀ„¦ƒ¾Qõ©ò%7tÔW·ÎðhÉ!ÙYŠùyÖ=qŸÂ¹Ã€Dv Uƺ 'â‘%/zùTaj†á˜abŸœ”ÙfǾ FÑà.ÙØÊ…/ºü jϲcM¸<õYx5w)8W3u3ØSØ~A͸Ï™¹ëË"²wpÑÄxfŠº8*DT´ÂÍÃÈŽP›kUGBМÿ˜áèÝE6;c(<ðÂDT /ˆŒ@"çX.xàÑñonYáßÐ!—͵aÐùbàE°[KUf"¢0Bº)> endobj 8044 0 obj << /Type /Annot /Subtype /Link /Rect [218.250000 742.250000 278.250000 749 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.2#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_coding_style_guidelines >> endobj 8038 0 obj << /Type /Page /Parent 2 0 R /Contents 8045 0 R /Resources 8047 0 R /Annots 8048 0 R /MediaBox [0 0 595 842] >> endobj 8047 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1410 1410 0 R /F8 8 0 R >> /XObject << >> >> endobj 8048 0 obj [ 8043 0 R 8044 0 R ] endobj 8045 0 obj << /Length 8046 0 R /Filter /FlateDecode >> stream xœí][ܶ~ß_1Ï2E] €íµ ô¡€a}(úP$M‹ êæ¡¿š‘4»+é;?’Ò,cÄ»^îPÔ¹ó\ßüéó?Nÿúýôæýçÿœ~¾¾ÿüë2ëÿ;]þ|÷üys¾?ÕMyúáׇ¯§¯Ÿ>u}è?ðùý_ºïþwÊOîþÿùô·¿w?üqø¥Ë/üúP›ºûúËõk[›î»ìöõòó?üõ§ß.;ŽóòßßM]ùå+þú0¾¦¹þùý‡ßÞôp{J[MSœLa»¿Úî§ÿýçÃOÝÆí³sS ÿÁïɇ7ÝÃKS\nšÓâ“óº(³¶ß“O®óË£óîÇ&o/DPÎ~ý£³½ñ°yqÁ™¯Í¯'W‡Š±•‘w÷LjeHÍtŸlsSVʺ\|€Ï~ðËÃçàœ~9ÂMÞ¹+Ϧ¼.(wŒ*lžá•@÷ۼĂwÚ4¾÷Cî–¿G:ï™XðM‹B‹ËLa2ÀhEn§Œö8Ü ¯çÌæä·°2\SV,­he Ì¥÷çàÝð©Â\X)jx¶îpˆyé3oá àûàSäç· Ÿ î&œî–¿ƒŸÁt°ö>>­ÐvÊ1E USDut@=ã잦Õ2q]夜Ä<çÎ|Ù)T- ”@¡jæFèØ$*htÙF%ä´úàÞ1kCÛ¼•’Ê­UÓ C•°Äœ*˜wÚuB>ºÁâF¡fÊG)J]b4ޣŠbªÛh®KT¿-Söšmï001zN§®aIî£gGR=‚ºEb¹¦êÕõï+‡ T"AÌk€NìëHn±À·w'©¶ƒÞÀèÓ›ŸÕÍw¨ö :õtz›¡Å@MÃC…w•[ýÅï·Ê.Ð¥*¦Óãþº7ì°gX°.ž8†ãw˜ˆrn“_Î$ê«Nò\E˜GÛ¶ÅDç2!AÔÅW8ɃþŠ<è¡f(ªÂSÖp„Q| Õ‹pä0ÐH¡g‘CÕK8‡a3¶+²ióÔµkW]Säœꪫ[/Hµ `\|p!™æÝö¾¡äê>gª­¨Å6.=ubÕËë'ªÿT¤2u‹¯4ÊôŽÞžðG•úû½rSe¯ ‰kaz7^Á„¨ZûÏXp«÷,Ÿyc¹h¯øÂÊ)Ƅ↰9¤uëªg•¢bÕϯ‘DƒDÖÊ )ùØÉá®Z­;sîÐ3~GU·çdjâ©îÅÓ!Tÿ¾©¢8‰€5¥8±øÀª{úÅ-Ž1…ÉÓÔå•eò[ÍåpÀöÜ»fž¿n W*´báJþ­ ¶æÒgàÙò_Úí#\ùW÷ á3E˜§ð3Ɔ5†›ÕÄO)¿>µÁøÁ0À+Öƒë×s ðl›b¸Á³aÞÆ'¸¾©p6 ãΧÿÜ›t!ècN *¬1tù4:…0§(cKrŒS,Gñ©«€¶G™Úöä:æø>ÂÙ ¬a(ÖbXCŠÍ1Ï$ÛC’‡¤nX·a.!t%×1½áç0' l6a7BK'À4ªjG c~¸¾€2ÄÂ÷‰/ŹÃÐeƒÂXælX&2²—á,ñÊþ9+Œ-U›cÛR˜kán‚v%0,Üj“g¶”*…0> ÁÊbì† ;ÒSÉg6¾iéÝnàôW#½uy3IïlÒ›±¹0½1Öc‘Ðü~˜³ƒcj×`,¾7yÇX8€DWÛ¬=´®fü ñ©/”Oºº;ÀÝÎ’þØ’þôG~ë`~HýÁðY|êKúC„Nºë½¦»ž.09+‡Ô`AµD1¶w9¨–P±Å÷á%-AJ‡cHy¹ú÷œøÒ%eÒ¦LÚï÷’Ik«êN­Xz«ê6ælÉZy&Y Á¬]ω.]„F³¨ú=Ž)Å‚Þw›±%ܽi0Ï †ãç=' &q£ÁkÉTÆ0`ê R-Hª‘ñ“jAR-+{S-HP[ªÈŠ;µ¥„¶¥°\'`ÀP_²¥$nJÞ )v,v +]”mÝÁ!%ì+ÊãK±ÞúÉÝÑ,˜|b4á±JÖÈ3ÉúI±ué²çXÈž¥XÐ[zqðîW˜Ÿ1N˜>w„ŸY𓊅$=uTÀxwM½ÑeÈ´Q²˜‚ö³(ªƒw#"t›p&êIxuÒ,Kºm‹}ë†íøt]R$ FRâN5ØÊÀÇÒŒéÔÊs7<%Äsuˆ1%ÔÜ-Ý…³l ôIã#ÓøÈl áãñ8\ÑG÷Å÷ã2xO²$¦k £ç¹ª8tÝçøH;Õ…ÏÂd^ÌdxÅÇ>¿×Þ²i¦ÀÂÖ¶õ±MDXŒÂí–ˆU ÷*뛫¦š@7ؤú² >©þî†'Õ÷D°0¥O&È@ŸÁsïñÙð4x<óï&LÏ!DGF˜Ë­¾ê›âÏaNAˆBX3Øàæÿ"V™›d.b7 ly9ÌJœ]B¬ªÓ_ço<{/lñÁ÷ÂÆËIödž”iíºD¡`ÅÔÞ©ö"½7 IYÙ1Gufä-¦k¢‚XOº}y‰jS 7¦µ  ýAõíÃ} ‰÷9fŸH]Ì 0À<ß'¤kn“ê ¦ÛߟèütoÚ(”³¸ï>Ñ5±Æ‚u-Ö¥QU«®ôVÖ®¸gÓCŸ‘ªª³ãÓhPé}›%¤üv„®M2:IoVz3å12½šBqÉd4¦b Õek­¸¬ƒÊÛÛÄu,íð,Áª€°8=Iâø°©øø3˜gˆiñ)1I;ñ}¢J»•²º6ƒß¸î¦g¹p7×é|¦¯½–RuúTç¼ÏŸ}v‚Gô¡|>GxÿÅ£ØmýòÕòÈìxL;mÍ„WTÚ•¹TgU¬BYŽCñjO­{ÉS­§™9×nˆ°¥Ì¹=¬0WŽ#lª˜ìÕ’Ô-’ˆ£1QvlïPžµ8géPe)zqê>ÆH‡#ûôÃðÌŸqÊÃÛÃJÊÃË”óð°×áÞ¢P‚ÅÃôefZ¦X­4q=œ×ºÊ6x­S”p+)J˜¢„¬ –ÉiÇÄBJ»jì-ÈÂJb¬!Æ€9ŸKfê\t­›“Mét"«Uàt¼3™Ê &S™¡^ÊŸÆÐµ.ÿ06±ªP—™ScMi‰¾þ”MPkI|9NY™|,+dš|¦h¤ ܲzùjÞ£‘TÀ-ñaSð‘7%ó á…|ÜÃJ >rÍb\•)Åþ +Éy–œg+0Hγ5i·!Tìa%54¸¿†Ê.LU™&`,` a\~DÑBPÙ¹!ð¿$ãÞäàžkRqºvHÙ‰^t„w*½—>*¼`ŸÂ kí•ÝV˜D ‘ª• ïöw˜:ûÁ7t€w(‹Âs¨ÎâD¿ü®ïbƒëÛâë„j¼;™,ÚÆ £QûªÛSMÈ(ÅJ «*"#‚qýQõ¿¡ ƒñÃŽk0ð¯È‹ªXWʡ꙱ˆÇÏ1”ÑŽ’_˜]é·D˜Q¨Ìj—¨eLH\u¦žò2¶"ÌôêÑcŠ1­E€Ò`_5YcÌþG 2ÃMwaR–Æ)¤lŠ=¬¤lŠ]”rQÄ ™8}è‡48e+ipŠè9É3Ä÷Ù'n"y·„¹´\miË‘²Hv°òzJ°,æ¦#[zaøyKË;+©â¢X–ÃáÔU0®x]™özäF*Ýä8XÈ&B2‚Ärý­–„\ -T} Bïurwî  6£äÖŽÔÏèwݪ;ew-þ vs«Ù…rš &ü™ÝT{ ›q¤D‘Ò B*6MªMЬ¤@E&™»D¯‡=[„tam™ìšòßö°B•}b·dü¡@TŤß+»s’ LdÓ eàÌõUÕùìM£ëáM–|mšžJ”ü .FUwáëÑ,”Ã’·g`ç0!7YC`[—z™&‚K›±‰9՟۪ݟÓ×N܈ÒèÓÚ/lpå5K¢Ê{ÎÌ%›ø”ßR qÓ±ž®ê…[{ï|¡íY»…†höqøÌÍüŒzú,y;ÑsìZ’çÒÙ>o:oÉ=²ƒ ¨x:Rk†WŸ½à@‚KÛ×p¥@¯aðnð3ƒÆ8½ú3²e îò}wâÑv¾&¡ó]ø v2ÄÏf1-àìüǘÀ؃ô#ìaWˆy JsØÕûMÔXgö> endobj 8052 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 8053 0 obj [ ] endobj 8050 0 obj << /Length 8051 0 R /Filter /FlateDecode >> stream xœí]MÛ6½ûWè\ ¿$Q@Q Ù$z(°È==IÓ¢h‹n{è߯lÑ^{­GIoIJ²ÙE³›eL g†óñ8C½þöãÏůÿ¯ï>þ]|rßï>nĶ.E÷_±ûzuú e·î碶eñéÏÍcñ¸¹ßÜ·>nº|¼û¾ýé¿Bßµÿÿ^üøSûËÏîíþÁŸ›ZÖí÷?öß›Z¶?‰ã÷ÝïÛüðUñ×nÆÃã1çe¬5RïÈxôãæ°L¹ÿú÷Ó_›×¦=¥©+«ªBm ÙUüóËæKû€§éŶQ²¬l¥Ú5n­ÐÝ_ÙGÖj÷ÌZÛBª¦€¸xd7A˜ée„ÉÝÄ›|Oyp®H]IïìqÄ\‹jíY%MxfLarQÌåÁ¹âÄŒg$fWÌ*¦˜uL1«¨b†³G³‰+fSÌeL1›¨b†³GsWÌUL1×1Å\E3œ=’˜íAuW6¦”!ãM¾§<4SBF“G’qcmDg +*Qv”Ç’1š<ŽŒ­,EǨ²Ž †ãì1d¬D<#ÑQš)NÆpòH2VŽ·Ÿf!]E4{Ê#íc8y$›²Œ(ããì1ÄPêˆFbOy,£É#ɸ’uD[}œ=†ª:¢‘ØSËV£É#ɸ®Üf¨Êœ:ÎC V™x“ï)Í”ƒŒŸO~?eLI÷€Â?z>øöaóúƒ4²¥ª*¾ìtm÷ÌîÛCË’²xµƒÞMû·ÏÅ×B˜7ß¿ošm¥Ê‰ÝˆPhDÖpÄÂÙÞÑwp¶ `ª¥¹®u7ý3φ¥­§KÁ£ø3o î$Ò*׃9Šiƒ#î`@¾ xcŠ×ƒ9 õÀÃQ&úÁ¶ ëÖxìs0¯Sú‚ÚZHÅgôφw:Ö>ÂçÜŽ/0Ì~&8êÙxg^"•&®ÓO%Ë—a¹šz8Še"RÂ×zø‹mÍÍ :a£Ø%KnvCø3lŒ×ƒ-F[´IgkšÝèÀÞÄ1-^]*‹£ÐlkrÆÞ¢0Ñ¥g¥«ÜYáb! Œ“qªå¹àíÖ6bOÏ¥Š×Uy>r\ôåÈûP h¼ ¨…8XWÙéÛª–¶./¸‰—Ö7ÒåëRoµ²RΦÐgÜ¢ËÃGNfßé4×lî:›žFÊýˆÞ–¦Ú-çd¤‚³á•¾Kæñj1#ΧœKa<žÂÑuXë˜`0;êôG°8+!N’ÅêÌz0mx„Àüo¬‡Î ÓXÕhkÆ,–0’1‹eg³´5cðÑ\Û¶€‘\Û–0_g,ʕՂ- н²º®TÚ»Œ(Vf4|%#·ƒ†ÏoÓ2æ-’aÞµŒ‹yK³Uò°•CïyÌÜcÚ’aë*cë—úÙ7rÅÛíD;‚X·{HÂŒÄìJ ÷« ÷¯d$Ãýâ–à~fÏApÎT 5ƒ¥±BcàñDÉx¶B«…¬Â‚ÆL94ÞM@Oµ/m†ô0­1‚”ð¸Ïo}³"A b?_›ç^Àá¶ëð9˜oL4–Ң谨‡‹Lk Ó`G4 ô‚{x¨Æ?Ó¨Œ[ ƒZâEïDIæâýŒaD8›'!v •É2û@`ÝñÈûìYÞ„²­>B¶˜õà€˜õÀ QŠ àŽ|ÅÂ0×Á\gC¥<@OVï Ú!™#F0øé†1nÉ@Ãæž€¬zúƒ]²hG€¤—OÅϰcßžBfˆË;+>Â]%G¸=•¹Ï1iOÅ1†Éq-2&ÉÀÏ` `mµt¿Àˉbë‹òèe€îUÝW2’Aw‘ tÇTcÀM~ ^)U˜‚NbŸR÷o3E@8Ôg(`€=æ‹„P\5âèƒF²/X‚Å78z—<Å…½©hþ4Ïc‚¾“#°ä†Jœ¦­töÒÕT¥{)·Ç3Þ5©—q`ãYñž‡ì ‘•\ŽU¹X5ì1ø¼7 ÛšzLCÀÍ@·K¶vKÆ æ—Ü’#ÒloÉ焵·D«Ùüqçüz÷vȽc³úéØ ¶r82ûeð±>jÃ#]Òw\sØ—GzÕÕ¡æDð®ãBmŸŸ{y¨†³ÉTwÙãaŸÆwÁS2÷Æá¾Ã*|æOÉ\ÐsÜ8Ø“ÔwŸ>Áí6©ZzžŸúyn-߯sù æxsüQ%Eô‚ïŸJy6:æý¿_ÂÈ’ó’k;ÿ¶ó”ØÄ¨÷¾bM Úîm@h 1Ö>ÿÍý‰´ŠÉIŸ /x6Ï>Å× àóÔ°ï:ŠùÆœ¦âÁü¾À³ÒTùr£õ…DÉ(Î}=6àœT†Zô@NÚT¿ˆó1ßS© ÎÔˆzÓË<ŒH‡péîu—ÀöMyaj´Ç Ã£n˜ê7ÏÈ\þá¹Ñæò˜$M’‡‘ÝszîqÖ¶œT8EÉŒPT¿Nõ T&¢ñÕ}f}ñªhÝͦ}Ÿ™ðঈ±Â¦DÔ'¥¬Pò|3N Ëra΢R‰Ë¾™ä’)“fn#’Ë(:šfš—$‡a›R¥Îóï¦d;èy_róO‡…‘Èš¹=’±É&Æzc™/žŸ;LŸ¹g7½ö8:XdESžg€“J\#vtxÇJ}ä ‘Uã–I¸< x6˜(Œ·Ðuý&Μ&dAÄÒ)àg ]ÊVÚÄê1—øê=" ôTÝ%º{#Ô)®BŸ]r‰«øHi{ÎŽž­­‡`ËIïðóœ}$ª ³ª>ÚŒ—‡u=&R\ÒDÁ]9îŸÄ©hµœ¶“ÛqÙ©¬Ñ©ŒØM¦Ôå|£òFòÊœ†„Ýéa‹?ó½Ék¼7y T7âH ˜ðZ<ïnÍ;ÎÍÅÈ>z {Š'0êBO¸‹›Fµd0pŽ˜™4ñDùUϱJxjgpÂtÇab1‹añIÊ\ÇØï» Z)=–yë+ŽLò™%aÏǼù0lãì:õ-aó‰-Åð%<9§ZÂHΩ8 É9•W>9§ Sµ©Ð¹ñŸt¹çcèø9Uùte>äßîé™È<çSò‰2!r[•#ü5q©§§J‰hó´jÂZ1mØï,¸ý–º–isŸ?ÊžÿºOFw˜wÓsž¯ÇÊ3¢M‘ò–ø­ïás½#ÚÖOUÜa[h&ÜÀ_©¶?òŠÚ¯â±U ¯ÎÜýƒJe{û²¤Þ ¹SåB™s·ÔÇÁδÔ=\ï\Œºlìu&¬§åW¿sŸq[éÄ„I¨ïÐsôÄÙGÛ·RT"ŠoW2Ï7C±Ò-ýbN5ðûØq€Ø³ ‰gƒŸqz,'-ý$×an÷sKñAÐw® «€KXtÏgpÑ)£6uàé°$°ô þxfƒ> endobj 8059 0 obj <> endobj 8060 0 obj <> endobj 8102 0 obj <> endobj 8103 0 obj <> endobj 8104 0 obj <> endobj 8105 0 obj <> endobj 8101 0 obj <> endobj 8061 0 obj <> endobj 8106 0 obj <> endobj 8107 0 obj <> endobj 8108 0 obj <> endobj 8109 0 obj <> endobj 8110 0 obj <> endobj 8111 0 obj <> endobj 8112 0 obj <> endobj 8113 0 obj <> endobj 8114 0 obj <> endobj 8115 0 obj <> endobj 8116 0 obj <> endobj 8118 0 obj <> endobj 8119 0 obj <> endobj 8120 0 obj <> endobj 8121 0 obj <> endobj 8122 0 obj <> endobj 8117 0 obj <> endobj 8062 0 obj <> endobj 8123 0 obj <> endobj 8124 0 obj <> endobj 8132 0 obj <> endobj 8133 0 obj <> endobj 8125 0 obj <> endobj 8134 0 obj <> endobj 8135 0 obj <> endobj 8136 0 obj <> endobj 8137 0 obj <> endobj 8138 0 obj <> endobj 8126 0 obj <> endobj 8127 0 obj <> endobj 8128 0 obj <> endobj 8129 0 obj <> endobj 8130 0 obj <> endobj 8131 0 obj <> endobj 8063 0 obj <> endobj 8143 0 obj <> endobj 8139 0 obj <> endobj 8146 0 obj <> endobj 8147 0 obj <> endobj 8148 0 obj <> endobj 8149 0 obj <> endobj 8150 0 obj <> endobj 8151 0 obj <> endobj 8152 0 obj <> endobj 8144 0 obj <> endobj 8145 0 obj <> endobj 8140 0 obj <> endobj 8155 0 obj <> endobj 8156 0 obj <> endobj 8157 0 obj <> endobj 8153 0 obj <> endobj 8154 0 obj <> endobj 8141 0 obj <> endobj 8142 0 obj <> endobj 8064 0 obj <> endobj 8158 0 obj <> endobj 8161 0 obj <> endobj 8162 0 obj <> endobj 8163 0 obj <> endobj 8164 0 obj <> endobj 8165 0 obj <> endobj 8159 0 obj <> endobj 8166 0 obj <> endobj 8167 0 obj <> endobj 8168 0 obj <> endobj 8160 0 obj <> endobj 8065 0 obj <> endobj 8176 0 obj <> endobj 8177 0 obj <> endobj 8178 0 obj <> endobj 8179 0 obj <> endobj 8180 0 obj <> endobj 8181 0 obj <> endobj 8169 0 obj <> endobj 8182 0 obj <> endobj 8183 0 obj <> endobj 8184 0 obj <> endobj 8185 0 obj <> endobj 8186 0 obj <> endobj 8170 0 obj <> endobj 8187 0 obj <> endobj 8188 0 obj <> endobj 8189 0 obj <> endobj 8190 0 obj <> endobj 8191 0 obj <> endobj 8171 0 obj <> endobj 8192 0 obj <> endobj 8193 0 obj <> endobj 8194 0 obj <> endobj 8195 0 obj <> endobj 8196 0 obj <> endobj 8197 0 obj <> endobj 8201 0 obj <> endobj 8202 0 obj <> endobj 8203 0 obj <> endobj 8204 0 obj <> endobj 8198 0 obj <> endobj 8199 0 obj <> endobj 8200 0 obj <> endobj 8172 0 obj <> endobj 8205 0 obj <> endobj 8206 0 obj <> endobj 8207 0 obj <> endobj 8208 0 obj <> endobj 8209 0 obj <> endobj 8210 0 obj <> endobj 8211 0 obj <> endobj 8212 0 obj <> endobj 8173 0 obj <> endobj 8213 0 obj <> endobj 8214 0 obj <> endobj 8215 0 obj <> endobj 8216 0 obj <> endobj 8174 0 obj <> endobj 8217 0 obj <> endobj 8218 0 obj <> endobj 8219 0 obj <> endobj 8220 0 obj <> endobj 8221 0 obj <> endobj 8175 0 obj <> endobj 8066 0 obj <> endobj 8222 0 obj <> endobj 8223 0 obj <> endobj 8224 0 obj <> endobj 8225 0 obj <> endobj 8252 0 obj <> endobj 8253 0 obj <> endobj 8254 0 obj <> endobj 8226 0 obj <> endobj 8255 0 obj <> endobj 8256 0 obj <> endobj 8257 0 obj <> endobj 8258 0 obj <> endobj 8259 0 obj <> endobj 8260 0 obj <> endobj 8261 0 obj <> endobj 8227 0 obj <> endobj 8228 0 obj <> endobj 8229 0 obj <> endobj 8230 0 obj <> endobj 8231 0 obj <> endobj 8232 0 obj <> endobj 8233 0 obj <> endobj 8234 0 obj <> endobj 8235 0 obj <> endobj 8262 0 obj <> endobj 8263 0 obj <> endobj 8264 0 obj <> endobj 8265 0 obj <> endobj 8236 0 obj <> endobj 8237 0 obj <> endobj 8238 0 obj <> endobj 8266 0 obj <> endobj 8267 0 obj <> endobj 8268 0 obj <> endobj 8269 0 obj <> endobj 8270 0 obj <> endobj 8271 0 obj <> endobj 8272 0 obj <> endobj 8273 0 obj <> endobj 8239 0 obj <> endobj 8274 0 obj <> endobj 8240 0 obj <> endobj 8241 0 obj <> endobj 8242 0 obj <> endobj 8243 0 obj <> endobj 8244 0 obj <> endobj 8245 0 obj <\(\)) /Parent 8067 0 R /Dest /__WKANCHOR_9u /Count 0 /Next 8246 0 R /Prev 8244 0 R >> endobj 8246 0 obj <> endobj 8247 0 obj <> endobj 8248 0 obj <> endobj 8249 0 obj <> endobj 8275 0 obj <> endobj 8276 0 obj <> endobj 8250 0 obj <> endobj 8251 0 obj <> endobj 8067 0 obj <> endobj 8277 0 obj <> endobj 8280 0 obj <> endobj 8281 0 obj <> endobj 8282 0 obj <> endobj 8283 0 obj <> endobj 8284 0 obj <> endobj 8285 0 obj <> endobj 8286 0 obj <> endobj 8287 0 obj <> endobj 8288 0 obj <> endobj 8289 0 obj <> endobj 8290 0 obj <> endobj 8291 0 obj <> endobj 8292 0 obj <> endobj 8293 0 obj <> endobj 8294 0 obj <> endobj 8295 0 obj <> endobj 8296 0 obj <> endobj 8297 0 obj <> endobj 8298 0 obj <> endobj 8299 0 obj <> endobj 8300 0 obj <> endobj 8301 0 obj <> endobj 8302 0 obj <> endobj 8303 0 obj <> endobj 8304 0 obj <> endobj 8305 0 obj <> endobj 8306 0 obj <> endobj 8307 0 obj <> endobj 8308 0 obj <> endobj 8309 0 obj <> endobj 8278 0 obj <> endobj 8310 0 obj <> endobj 8311 0 obj <> endobj 8312 0 obj <> endobj 8313 0 obj <> endobj 8314 0 obj <> endobj 8315 0 obj <> endobj 8316 0 obj <> endobj 8317 0 obj <> endobj 8318 0 obj <> endobj 8319 0 obj <> endobj 8279 0 obj <> endobj 8068 0 obj <> endobj 8320 0 obj <> endobj 8323 0 obj <> endobj 8321 0 obj <> endobj 8322 0 obj <> endobj 8069 0 obj <> endobj 8324 0 obj <> endobj 8327 0 obj <> endobj 8328 0 obj <> endobj 8329 0 obj <> endobj 8325 0 obj <> endobj 8326 0 obj <> endobj 8070 0 obj <> endobj 8330 0 obj <> endobj 8331 0 obj <> endobj 8332 0 obj <> endobj 8333 0 obj <> endobj 8334 0 obj <> endobj 8335 0 obj <> endobj 8340 0 obj <> endobj 8341 0 obj <> endobj 8336 0 obj <> endobj 8337 0 obj <> endobj 8338 0 obj <> endobj 8339 0 obj <> endobj 8071 0 obj <> endobj 8342 0 obj <> endobj 8347 0 obj <> endobj 8348 0 obj <> endobj 8349 0 obj <> endobj 8350 0 obj <> endobj 8343 0 obj <> endobj 8351 0 obj <> endobj 8352 0 obj <> endobj 8353 0 obj <> endobj 8354 0 obj <> endobj 8344 0 obj <> endobj 8355 0 obj <> endobj 8356 0 obj <> endobj 8357 0 obj <> endobj 8360 0 obj <> endobj 8361 0 obj <> endobj 8362 0 obj <> endobj 8363 0 obj <> endobj 8364 0 obj <> endobj 8358 0 obj <> endobj 8359 0 obj <> endobj 8345 0 obj <> endobj 8365 0 obj <> endobj 8346 0 obj <> endobj 8072 0 obj <> endobj 8368 0 obj <> endobj 8369 0 obj <> endobj 8370 0 obj <> endobj 8371 0 obj <> endobj 8372 0 obj <> endobj 8366 0 obj <> endobj 8373 0 obj <> endobj 8374 0 obj <> endobj 8375 0 obj <> endobj 8367 0 obj <> endobj 8073 0 obj <> endobj 8393 0 obj <> endobj 8394 0 obj <> endobj 8395 0 obj <> endobj 8396 0 obj <> endobj 8397 0 obj <> endobj 8398 0 obj <> endobj 8399 0 obj <> endobj 8400 0 obj <> endobj 8376 0 obj <> endobj 8401 0 obj <> endobj 8402 0 obj <> endobj 8403 0 obj <> endobj 8404 0 obj <> endobj 8405 0 obj <> endobj 8377 0 obj <> endobj 8406 0 obj <> endobj 8407 0 obj <> endobj 8408 0 obj <> endobj 8409 0 obj <> endobj 8410 0 obj <> endobj 8411 0 obj <> endobj 8378 0 obj <> endobj 8412 0 obj <> endobj 8413 0 obj <> endobj 8414 0 obj <> endobj 8418 0 obj <> endobj 8419 0 obj <> endobj 8415 0 obj <> endobj 8416 0 obj <> endobj 8417 0 obj <> endobj 8379 0 obj <> endobj 8420 0 obj <> endobj 8421 0 obj <> endobj 8422 0 obj <> endobj 8423 0 obj <> endobj 8424 0 obj <> endobj 8425 0 obj <> endobj 8426 0 obj <> endobj 8427 0 obj <> endobj 8428 0 obj <> endobj 8429 0 obj <> endobj 8430 0 obj <> endobj 8431 0 obj <> endobj 8432 0 obj <> endobj 8433 0 obj <> endobj 8380 0 obj <> endobj 8434 0 obj <> endobj 8435 0 obj <> endobj 8381 0 obj <> endobj 8382 0 obj <> endobj 8383 0 obj <> endobj 8384 0 obj <> endobj 8385 0 obj <> endobj 8436 0 obj <> endobj 8437 0 obj <> endobj 8386 0 obj <> endobj 8438 0 obj <> endobj 8439 0 obj <> endobj 8387 0 obj <> endobj 8440 0 obj <> endobj 8388 0 obj <> endobj 8389 0 obj <> endobj 8390 0 obj <> endobj 8391 0 obj <> endobj 8392 0 obj <> endobj 8074 0 obj <> endobj 8444 0 obj <> endobj 8445 0 obj <> endobj 8446 0 obj <> endobj 8447 0 obj <> endobj 8448 0 obj <> endobj 8449 0 obj <> endobj 8450 0 obj <> endobj 8441 0 obj <> endobj 8442 0 obj <> endobj 8451 0 obj <> endobj 8452 0 obj <> endobj 8453 0 obj <> endobj 8454 0 obj <> endobj 8455 0 obj <> endobj 8443 0 obj <> endobj 8075 0 obj <> endobj 8456 0 obj <> endobj 8457 0 obj <> endobj 8458 0 obj <> endobj 8459 0 obj <> endobj 8076 0 obj <> endobj 8460 0 obj <> endobj 8461 0 obj <> endobj 8462 0 obj <> endobj 8463 0 obj <> endobj 8464 0 obj <> endobj 8465 0 obj <> endobj 8466 0 obj <> endobj 8467 0 obj <> endobj 8468 0 obj <> endobj 8077 0 obj <> endobj 8469 0 obj <> endobj 8476 0 obj <> endobj 8479 0 obj <> endobj 8480 0 obj <) /Parent 8477 0 R /Dest /__WKANCHOR_lw /Count 0 /Next 8481 0 R /Prev 8479 0 R >> endobj 8481 0 obj <) /Parent 8477 0 R /Dest /__WKANCHOR_ly /Count 0 /Next 8482 0 R /Prev 8480 0 R >> endobj 8482 0 obj <> endobj 8483 0 obj <> endobj 8477 0 obj <> endobj 8478 0 obj <> endobj 8470 0 obj <> endobj 8484 0 obj <> endobj 8485 0 obj <> endobj 8486 0 obj <> endobj 8487 0 obj <> endobj 8471 0 obj <> endobj 8488 0 obj <> endobj 8489 0 obj <> endobj 8490 0 obj <> endobj 8491 0 obj <> endobj 8472 0 obj <> endobj 8492 0 obj <> endobj 8473 0 obj <> endobj 8493 0 obj <> endobj 8494 0 obj <> endobj 8495 0 obj <> endobj 8474 0 obj <> endobj 8475 0 obj <> endobj 8078 0 obj <> endobj 8496 0 obj <> endobj 8497 0 obj <> endobj 8498 0 obj <> endobj 8499 0 obj <> endobj 8500 0 obj <> endobj 8501 0 obj <> endobj 8502 0 obj <> endobj 8503 0 obj <> endobj 8506 0 obj <> endobj 8507 0 obj <> endobj 8508 0 obj <> endobj 8509 0 obj <> endobj 8510 0 obj <> endobj 8511 0 obj <> endobj 8512 0 obj <> endobj 8513 0 obj <> endobj 8504 0 obj <> endobj 8505 0 obj <> endobj 8079 0 obj <> endobj 8514 0 obj <> endobj 8515 0 obj <> endobj 8516 0 obj <> endobj 8517 0 obj <> endobj 8518 0 obj <> endobj 8519 0 obj <> endobj 8520 0 obj <> endobj 8080 0 obj <> endobj 8521 0 obj <> endobj 8522 0 obj <> endobj 8523 0 obj <> endobj 8524 0 obj <> endobj 8525 0 obj <> endobj 8526 0 obj <> endobj 8527 0 obj <> endobj 8528 0 obj <> endobj 8529 0 obj <> endobj 8530 0 obj <> endobj 8531 0 obj <> endobj 8532 0 obj <> endobj 8533 0 obj <> endobj 8534 0 obj <> endobj 8535 0 obj <> endobj 8536 0 obj <> endobj 8537 0 obj <> endobj 8081 0 obj <> endobj 8538 0 obj <> endobj 8541 0 obj <> endobj 8542 0 obj <> endobj 8543 0 obj <> endobj 8544 0 obj <> endobj 8539 0 obj <> endobj 8540 0 obj <> endobj 8082 0 obj <> endobj 8553 0 obj <> endobj 8554 0 obj <> endobj 8545 0 obj <> endobj 8546 0 obj <> endobj 8547 0 obj <> endobj 8555 0 obj <> endobj 8556 0 obj <> endobj 8557 0 obj <> endobj 8548 0 obj <> endobj 8558 0 obj <> endobj 8559 0 obj <> endobj 8560 0 obj <> endobj 8561 0 obj <> endobj 8549 0 obj <> endobj 8562 0 obj <> endobj 8563 0 obj <> endobj 8564 0 obj <> endobj 8550 0 obj <> endobj 8551 0 obj <> endobj 8565 0 obj <> endobj 8566 0 obj <> endobj 8567 0 obj <> endobj 8568 0 obj <> endobj 8569 0 obj <> endobj 8570 0 obj <> endobj 8571 0 obj <> endobj 8572 0 obj <> endobj 8573 0 obj <> endobj 8552 0 obj <> endobj 8083 0 obj <> endobj 8574 0 obj <> endobj 8575 0 obj <> endobj 8584 0 obj < D name comparison) /Parent 8576 0 R /Dest /__WKANCHOR_ry /Count 0 /Next 8585 0 R >> endobj 8585 0 obj <> endobj 8586 0 obj <> endobj 8587 0 obj <> endobj 8588 0 obj <> endobj 8589 0 obj <> endobj 8590 0 obj <> endobj 8576 0 obj <> endobj 8577 0 obj <> endobj 8578 0 obj <> endobj 8579 0 obj <> endobj 8580 0 obj <> endobj 8591 0 obj <> endobj 8592 0 obj <> endobj 8593 0 obj <> endobj 8594 0 obj <> endobj 8581 0 obj <> endobj 8582 0 obj <> endobj 8583 0 obj <> endobj 8084 0 obj <> endobj 8595 0 obj <> endobj 8596 0 obj <> endobj 8599 0 obj <> endobj 8600 0 obj <> endobj 8597 0 obj <> endobj 8601 0 obj <> endobj 8602 0 obj <> endobj 8603 0 obj <> endobj 8604 0 obj <> endobj 8612 0 obj <> endobj 8613 0 obj <> endobj 8605 0 obj <> endobj 8606 0 obj <> endobj 8614 0 obj <> endobj 8615 0 obj <> endobj 8616 0 obj <> endobj 8617 0 obj <> endobj 8618 0 obj <> endobj 8619 0 obj <> endobj 8620 0 obj <> endobj 8621 0 obj <> endobj 8607 0 obj <> endobj 8608 0 obj <> endobj 8609 0 obj <> endobj 8610 0 obj <> endobj 8611 0 obj <> endobj 8598 0 obj <> endobj 8085 0 obj <> endobj 8622 0 obj <> endobj 8623 0 obj <> endobj 8624 0 obj <> endobj 8634 0 obj <> endobj 8635 0 obj <> endobj 8636 0 obj <> endobj 8637 0 obj <> endobj 8638 0 obj <> endobj 8625 0 obj <> endobj 8626 0 obj <> endobj 8627 0 obj <> endobj 8639 0 obj <> endobj 8640 0 obj <> endobj 8628 0 obj <> endobj 8629 0 obj <> endobj 8630 0 obj <> endobj 8631 0 obj <> endobj 8632 0 obj <> endobj 8641 0 obj <> endobj 8642 0 obj <> endobj 8633 0 obj <> endobj 8086 0 obj <> endobj 8643 0 obj <> endobj 8656 0 obj <> endobj 8657 0 obj <> endobj 8658 0 obj <> endobj 8659 0 obj <> endobj 8660 0 obj <> endobj 8661 0 obj <> endobj 8662 0 obj <> endobj 8664 0 obj <> endobj 8665 0 obj <> endobj 8663 0 obj <> endobj 8644 0 obj <> endobj 8666 0 obj <> endobj 8667 0 obj <> endobj 8668 0 obj <> endobj 8669 0 obj <> endobj 8681 0 obj <> endobj 8682 0 obj <> endobj 8683 0 obj <> endobj 8684 0 obj <> endobj 8685 0 obj <> endobj 8670 0 obj <> endobj 8671 0 obj <> endobj 8672 0 obj <> endobj 8673 0 obj <> endobj 8674 0 obj <> endobj 8686 0 obj <> endobj 8675 0 obj <> endobj 8676 0 obj <> endobj 8677 0 obj <> endobj 8678 0 obj <> endobj 8679 0 obj <> endobj 8687 0 obj <> endobj 8688 0 obj <> endobj 8680 0 obj <> endobj 8645 0 obj <> endobj 8695 0 obj <> endobj 8689 0 obj <> endobj 8696 0 obj <> endobj 8690 0 obj <> endobj 8697 0 obj <> endobj 8698 0 obj <> endobj 8699 0 obj <> endobj 8700 0 obj <> endobj 8701 0 obj <> endobj 8691 0 obj <> endobj 8692 0 obj <> endobj 8702 0 obj <> endobj 8703 0 obj <> endobj 8704 0 obj <> endobj 8693 0 obj <> endobj 8694 0 obj <> endobj 8646 0 obj <> endobj 8705 0 obj <> endobj 8706 0 obj <> endobj 8707 0 obj <> endobj 8708 0 obj <> endobj 8709 0 obj <> endobj 8710 0 obj <> endobj 8712 0 obj <> endobj 8711 0 obj <> endobj 8647 0 obj <> endobj 8648 0 obj <> endobj 8713 0 obj <> endobj 8714 0 obj <> endobj 8715 0 obj <> endobj 8716 0 obj <> endobj 8717 0 obj <> endobj 8649 0 obj <> endobj 8718 0 obj <> endobj 8719 0 obj <> endobj 8720 0 obj <> endobj 8721 0 obj <> endobj 8722 0 obj <> endobj 8723 0 obj <> endobj 8650 0 obj <> endobj 8724 0 obj <> endobj 8725 0 obj <> endobj 8726 0 obj <> endobj 8727 0 obj <> endobj 8728 0 obj <> endobj 8729 0 obj <> endobj 8730 0 obj <> endobj 8731 0 obj <> endobj 8732 0 obj <> endobj 8733 0 obj <> endobj 8651 0 obj <> endobj 8734 0 obj <> endobj 8735 0 obj <> endobj 8736 0 obj <> endobj 8737 0 obj <> endobj 8738 0 obj <> endobj 8739 0 obj <> endobj 8740 0 obj <> endobj 8741 0 obj <> endobj 8742 0 obj <> endobj 8743 0 obj <> endobj 8744 0 obj <> endobj 8745 0 obj <> endobj 8746 0 obj <> endobj 8652 0 obj <> endobj 8653 0 obj <> endobj 8747 0 obj <> endobj 8748 0 obj <> endobj 8749 0 obj <> endobj 8750 0 obj <> endobj 8751 0 obj <> endobj 8654 0 obj <> endobj 8655 0 obj <> endobj 8087 0 obj <> endobj 8752 0 obj <> endobj 8757 0 obj <> endobj 8758 0 obj <> endobj 8759 0 obj <> endobj 8753 0 obj <> endobj 8763 0 obj <> endobj 8760 0 obj <> endobj 8764 0 obj <> endobj 8765 0 obj <> endobj 8761 0 obj <> endobj 8762 0 obj <> endobj 8754 0 obj <> endobj 8766 0 obj <> endobj 8767 0 obj <> endobj 8755 0 obj <> endobj 8768 0 obj <> endobj 8769 0 obj <> endobj 8770 0 obj <> endobj 8771 0 obj <> endobj 8772 0 obj <> endobj 8756 0 obj <> endobj 8088 0 obj <> endobj 8773 0 obj <> endobj 8780 0 obj <> endobj 8781 0 obj <> endobj 8782 0 obj <> endobj 8783 0 obj <> endobj 8774 0 obj <> endobj 8784 0 obj <> endobj 8785 0 obj <> endobj 8786 0 obj <> endobj 8801 0 obj <> endobj 8787 0 obj <> endobj 8788 0 obj <> endobj 8789 0 obj <> endobj 8790 0 obj <> endobj 8791 0 obj <> endobj 8792 0 obj <> endobj 8793 0 obj <> endobj 8794 0 obj <> endobj 8795 0 obj <> endobj 8796 0 obj <> endobj 8797 0 obj <> endobj 8798 0 obj <> endobj 8799 0 obj <> endobj 8802 0 obj <> endobj 8803 0 obj <> endobj 8804 0 obj <> endobj 8800 0 obj <> endobj 8775 0 obj <> endobj 8805 0 obj <> endobj 8806 0 obj <> endobj 8807 0 obj <> endobj 8808 0 obj <> endobj 8776 0 obj <> endobj 8809 0 obj <> endobj 8810 0 obj <> endobj 8777 0 obj <> endobj 8811 0 obj <> endobj 8812 0 obj <> endobj 8778 0 obj <> endobj 8813 0 obj <> endobj 8814 0 obj <> endobj 8815 0 obj <> endobj 8779 0 obj <> endobj 8089 0 obj <> endobj 8816 0 obj <> endobj 8819 0 obj <> endobj 8820 0 obj <> endobj 8821 0 obj <> endobj 8817 0 obj <> endobj 8822 0 obj <> endobj 8823 0 obj <> endobj 8824 0 obj <> endobj 8825 0 obj <> endobj 8826 0 obj <> endobj 8827 0 obj <> endobj 8828 0 obj <> endobj 8829 0 obj <> endobj 8830 0 obj <> endobj 8831 0 obj <> endobj 8832 0 obj <> endobj 8839 0 obj <> endobj 8840 0 obj <> endobj 8833 0 obj <> endobj 8834 0 obj <> endobj 8835 0 obj <> endobj 8836 0 obj <> endobj 8837 0 obj <> endobj 8838 0 obj <> endobj 8818 0 obj <> endobj 8090 0 obj <> endobj 8841 0 obj <> endobj 8852 0 obj <> endobj 8853 0 obj <> endobj 8854 0 obj <> endobj 8855 0 obj <> endobj 8856 0 obj <> endobj 8857 0 obj <> endobj 8858 0 obj <> endobj 8842 0 obj <> endobj 8859 0 obj <> endobj 8860 0 obj <> endobj 8843 0 obj <> endobj 8861 0 obj <> endobj 8862 0 obj <> endobj 8863 0 obj <> endobj 8864 0 obj <> endobj 8865 0 obj <> endobj 8866 0 obj <> endobj 8867 0 obj <> endobj 8868 0 obj <> endobj 8869 0 obj <> endobj 8870 0 obj <> endobj 8844 0 obj <> endobj 8845 0 obj <> endobj 8846 0 obj <> endobj 8871 0 obj <> endobj 8872 0 obj <> endobj 8873 0 obj <> endobj 8874 0 obj <> endobj 8847 0 obj <> endobj 8875 0 obj <> endobj 8876 0 obj <> endobj 8877 0 obj <> endobj 8878 0 obj <> endobj 8879 0 obj <> endobj 8880 0 obj <> endobj 8848 0 obj <> endobj 8881 0 obj <> endobj 8882 0 obj <> endobj 8883 0 obj <> endobj 8884 0 obj <> endobj 8885 0 obj <> endobj 8886 0 obj <> endobj 8887 0 obj <> endobj 8849 0 obj <> endobj 8850 0 obj <> endobj 8888 0 obj <> endobj 8889 0 obj <> endobj 8890 0 obj <> endobj 8891 0 obj <> endobj 8892 0 obj <> endobj 8893 0 obj <> endobj 8851 0 obj <> endobj 8091 0 obj <> endobj 8897 0 obj <> endobj 8898 0 obj <> endobj 8894 0 obj <> endobj 8899 0 obj <> endobj 8900 0 obj <> endobj 8901 0 obj <> endobj 8902 0 obj <> endobj 8903 0 obj <> endobj 8906 0 obj <> endobj 8907 0 obj <> endobj 8908 0 obj <> endobj 8909 0 obj <> endobj 8910 0 obj <> endobj 8904 0 obj <> endobj 8905 0 obj <> endobj 8895 0 obj <> endobj 8911 0 obj <> endobj 8912 0 obj <> endobj 8913 0 obj <> endobj 8914 0 obj <> endobj 8915 0 obj <> endobj 8916 0 obj <> endobj 8917 0 obj <> endobj 8896 0 obj <> endobj 8092 0 obj <> endobj 8918 0 obj <> endobj 8931 0 obj <> endobj 8932 0 obj <> endobj 8933 0 obj <> endobj 8934 0 obj <> endobj 8935 0 obj <> endobj 8936 0 obj <> endobj 8937 0 obj <> endobj 8938 0 obj <> endobj 8939 0 obj <> endobj 8919 0 obj <> endobj 8940 0 obj <> endobj 8941 0 obj <> endobj 8942 0 obj <> endobj 8943 0 obj <> endobj 8944 0 obj <> endobj 8945 0 obj <> endobj 8946 0 obj <> endobj 8947 0 obj <> endobj 8948 0 obj <> endobj 8949 0 obj <> endobj 8950 0 obj <> endobj 8951 0 obj <> endobj 8952 0 obj <> endobj 8955 0 obj <> endobj 8956 0 obj <> endobj 8953 0 obj <> endobj 8954 0 obj <> endobj 8920 0 obj <> endobj 8957 0 obj <> endobj 8960 0 obj <> endobj 8961 0 obj <> endobj 8958 0 obj <> endobj 8959 0 obj <> endobj 8921 0 obj <> endobj 8962 0 obj <> endobj 8963 0 obj <> endobj 8964 0 obj <> endobj 8965 0 obj <> endobj 8966 0 obj <> endobj 8967 0 obj <> endobj 8968 0 obj <> endobj 8922 0 obj <> endobj 8969 0 obj <> endobj 8970 0 obj <> endobj 8971 0 obj <> endobj 8972 0 obj <> endobj 8974 0 obj <> endobj 8973 0 obj <> endobj 8923 0 obj <> endobj 8975 0 obj <> endobj 8976 0 obj <> endobj 8977 0 obj <> endobj 8978 0 obj <> endobj 8979 0 obj <> endobj 8924 0 obj <> endobj 8980 0 obj <> endobj 8981 0 obj <> endobj 8982 0 obj <> endobj 8983 0 obj <> endobj 8925 0 obj <> endobj 8984 0 obj <> endobj 8985 0 obj <> endobj 8986 0 obj <> endobj 8987 0 obj <> endobj 8988 0 obj <> endobj 8989 0 obj <> endobj 8990 0 obj <> endobj 8926 0 obj <> endobj 8991 0 obj <> endobj 8994 0 obj <> endobj 8995 0 obj <> endobj 8996 0 obj <> endobj 8997 0 obj <> endobj 8998 0 obj <> endobj 8992 0 obj <> endobj 8993 0 obj <> endobj 8927 0 obj <> endobj 8999 0 obj <> endobj 9000 0 obj <> endobj 9001 0 obj <> endobj 9002 0 obj <> endobj 9003 0 obj <> endobj 9005 0 obj <> endobj 9006 0 obj <> endobj 9007 0 obj <> endobj 9008 0 obj <> endobj 9009 0 obj <> endobj 9004 0 obj <> endobj 8928 0 obj <> endobj 9010 0 obj <> endobj 9011 0 obj <> endobj 9012 0 obj <> endobj 9013 0 obj <> endobj 9014 0 obj <> endobj 8929 0 obj <> endobj 9015 0 obj <> endobj 9016 0 obj <> endobj 8930 0 obj <> endobj 8093 0 obj <> endobj 9017 0 obj <> endobj 9018 0 obj <> endobj 9019 0 obj <> endobj 9020 0 obj <> endobj 9021 0 obj <> endobj 9024 0 obj <> endobj 9022 0 obj <> endobj 9023 0 obj <> endobj 8094 0 obj <> endobj 9035 0 obj <> endobj 9036 0 obj <> endobj 9037 0 obj <> endobj 9038 0 obj <> endobj 9039 0 obj <> endobj 9040 0 obj <> endobj 9025 0 obj <> endobj 9041 0 obj <> endobj 9026 0 obj <> endobj 9042 0 obj <> endobj 9043 0 obj <> endobj 9044 0 obj <> endobj 9045 0 obj <> endobj 9046 0 obj <> endobj 9047 0 obj <> endobj 9048 0 obj <> endobj 9049 0 obj <> endobj 9050 0 obj <> endobj 9051 0 obj <> endobj 9052 0 obj <> endobj 9053 0 obj <> endobj 9054 0 obj <> endobj 9055 0 obj <> endobj 9056 0 obj <> endobj 9059 0 obj <> endobj 9060 0 obj <> endobj 9057 0 obj <> endobj 9061 0 obj <> endobj 9058 0 obj <> endobj 9027 0 obj <> endobj 9062 0 obj <> endobj 9063 0 obj <> endobj 9064 0 obj <> endobj 9065 0 obj <> endobj 9028 0 obj <> endobj 9029 0 obj <> endobj 9066 0 obj <> endobj 9067 0 obj <> endobj 9068 0 obj <> endobj 9069 0 obj <> endobj 9030 0 obj <> endobj 9070 0 obj <> endobj 9071 0 obj <> endobj 9072 0 obj <> endobj 9073 0 obj <> endobj 9074 0 obj <> endobj 9083 0 obj <> endobj 9084 0 obj <> endobj 9085 0 obj <> endobj 9086 0 obj <> endobj 9087 0 obj <> endobj 9088 0 obj <> endobj 9089 0 obj <> endobj 9090 0 obj <> endobj 9091 0 obj <> endobj 9092 0 obj <> endobj 9093 0 obj <> endobj 9094 0 obj <> endobj 9095 0 obj <> endobj 9096 0 obj <> endobj 9097 0 obj <> endobj 9098 0 obj <> endobj 9099 0 obj <> endobj 9100 0 obj <> endobj 9075 0 obj <> endobj 9076 0 obj <> endobj 9101 0 obj <> endobj 9102 0 obj <> endobj 9103 0 obj <> endobj 9104 0 obj <> endobj 9105 0 obj <> endobj 9077 0 obj <> endobj 9078 0 obj <> endobj 9079 0 obj <> endobj 9080 0 obj <> endobj 9106 0 obj <> endobj 9081 0 obj <> endobj 9082 0 obj <> endobj 9031 0 obj <> endobj 9107 0 obj <> endobj 9110 0 obj <> endobj 9111 0 obj <> endobj 9112 0 obj <> endobj 9113 0 obj <> endobj 9114 0 obj <> endobj 9108 0 obj <> endobj 9109 0 obj <> endobj 9032 0 obj <> endobj 9115 0 obj <> endobj 9116 0 obj <> endobj 9117 0 obj <> endobj 9033 0 obj <> endobj 9118 0 obj <> endobj 9119 0 obj <> endobj 9120 0 obj <> endobj 9121 0 obj <> endobj 9122 0 obj <> endobj 9123 0 obj <> endobj 9034 0 obj <> endobj 8095 0 obj <> endobj 9124 0 obj <> endobj 9132 0 obj <> endobj 9133 0 obj <> endobj 9134 0 obj <> endobj 9135 0 obj <> endobj 9136 0 obj <> endobj 9125 0 obj <> endobj 9137 0 obj <> endobj 9138 0 obj <> endobj 9153 0 obj <> endobj 9154 0 obj <> endobj 9139 0 obj <> endobj 9140 0 obj <> endobj 9155 0 obj <> endobj 9156 0 obj <> endobj 9141 0 obj <> endobj 9157 0 obj <> endobj 9158 0 obj <> endobj 9142 0 obj <> endobj 9143 0 obj <> endobj 9144 0 obj <> endobj 9145 0 obj <> endobj 9146 0 obj <> endobj 9147 0 obj <> endobj 9148 0 obj <> endobj 9149 0 obj <> endobj 9150 0 obj <> endobj 9151 0 obj <> endobj 9152 0 obj <> endobj 9126 0 obj <> endobj 9159 0 obj <> endobj 9160 0 obj <> endobj 9161 0 obj <> endobj 9162 0 obj <> endobj 9163 0 obj <> endobj 9127 0 obj <> endobj 9128 0 obj <> endobj 9164 0 obj <> endobj 9165 0 obj <> endobj 9129 0 obj <> endobj 9166 0 obj <> endobj 9167 0 obj <> endobj 9130 0 obj <> endobj 9131 0 obj <> endobj 8096 0 obj <> endobj 9178 0 obj <> endobj 9179 0 obj <> endobj 9180 0 obj <> endobj 9181 0 obj <> endobj 9182 0 obj <> endobj 9183 0 obj <> endobj 9184 0 obj <> endobj 9185 0 obj <> endobj 9168 0 obj <> endobj 9186 0 obj <> endobj 9187 0 obj <> endobj 9169 0 obj <> endobj 9188 0 obj <> endobj 9189 0 obj <> endobj 9190 0 obj <> endobj 9191 0 obj <> endobj 9192 0 obj <> endobj 9193 0 obj <> endobj 9194 0 obj <> endobj 9195 0 obj <> endobj 9196 0 obj <> endobj 9197 0 obj <> endobj 9198 0 obj <> endobj 9199 0 obj <> endobj 9200 0 obj <> endobj 9201 0 obj <> endobj 9170 0 obj <> endobj 9202 0 obj <> endobj 9203 0 obj <> endobj 9171 0 obj <> endobj 9172 0 obj <> endobj 9173 0 obj <> endobj 9204 0 obj <> endobj 9205 0 obj <> endobj 9206 0 obj <> endobj 9207 0 obj <> endobj 9208 0 obj <> endobj 9209 0 obj <> endobj 9210 0 obj <> endobj 9211 0 obj <> endobj 9174 0 obj <> endobj 9175 0 obj <> endobj 9212 0 obj <> endobj 9176 0 obj <> endobj 9177 0 obj <> endobj 8097 0 obj <> endobj 9213 0 obj <> endobj 9214 0 obj <> endobj 9215 0 obj <> endobj 8098 0 obj <> endobj 9219 0 obj <> endobj 9220 0 obj <> endobj 9221 0 obj <> endobj 9222 0 obj <> endobj 9223 0 obj <> endobj 9216 0 obj <> endobj 9224 0 obj <> endobj 9230 0 obj <> endobj 9225 0 obj <> endobj 9231 0 obj <> endobj 9232 0 obj <> endobj 9233 0 obj <> endobj 9234 0 obj <> endobj 9226 0 obj <> endobj 9235 0 obj <> endobj 9236 0 obj <> endobj 9237 0 obj <> endobj 9238 0 obj <> endobj 9227 0 obj <> endobj 9239 0 obj <> endobj 9240 0 obj <> endobj 9241 0 obj <> endobj 9242 0 obj <> endobj 9243 0 obj <> endobj 9244 0 obj <> endobj 9245 0 obj <> endobj 9246 0 obj <> endobj 9228 0 obj <> endobj 9229 0 obj <> endobj 9217 0 obj <> endobj 9247 0 obj <> endobj 9218 0 obj <> endobj 8099 0 obj <> endobj 9248 0 obj <> endobj 9249 0 obj <> endobj 9250 0 obj <> endobj 9261 0 obj <> endobj 9262 0 obj <> endobj 9263 0 obj <> endobj 9264 0 obj <> endobj 9265 0 obj <> endobj 9266 0 obj <> endobj 9267 0 obj <> endobj 9268 0 obj <> endobj 9251 0 obj <> endobj 9269 0 obj <> endobj 9270 0 obj <> endobj 9271 0 obj <> endobj 9272 0 obj <> endobj 9273 0 obj <> endobj 9274 0 obj <> endobj 9252 0 obj <> endobj 9253 0 obj <> endobj 9254 0 obj <> endobj 9275 0 obj <> endobj 9276 0 obj <> endobj 9277 0 obj <> endobj 9278 0 obj <> endobj 9279 0 obj <> endobj 9280 0 obj <> endobj 9255 0 obj <> endobj 9256 0 obj <> endobj 9281 0 obj <> endobj 9282 0 obj <> endobj 9283 0 obj <> endobj 9284 0 obj <> endobj 9285 0 obj <> endobj 9286 0 obj <> endobj 9287 0 obj <> endobj 9288 0 obj <> endobj 9289 0 obj <> endobj 9290 0 obj <> endobj 9291 0 obj <> endobj 9297 0 obj <> endobj 9292 0 obj <> endobj 9293 0 obj <> endobj 9294 0 obj <> endobj 9298 0 obj <> endobj 9299 0 obj <> endobj 9295 0 obj <> endobj 9296 0 obj <> endobj 9257 0 obj <> endobj 9258 0 obj <> endobj 9259 0 obj <> endobj 9260 0 obj <> endobj 8100 0 obj <> endobj 8058 0 obj <> endobj 9300 0 obj << /Type /Catalog /Pages 2 0 R /Outlines 8058 0 R /PageMode /UseOutlines /Dests 8057 0 R >> endobj 8054 0 obj << /Type /Page /Parent 2 0 R /Contents 9301 0 R /Resources 9303 0 R /Annots 9304 0 R /MediaBox [0 0 595 842] >> endobj 9303 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1410 1410 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 9304 0 obj [ ] endobj 9301 0 obj << /Length 9302 0 R /Filter /FlateDecode >> stream xœí]IoÛF¾ëWð\Àôlœ( Xr\ ‡† ôPôP8M‹  êæÐ¿_R3”l’ßPz˜K2c$r4âÛçm³èúLJ߫?¿U×›‡ª§ðºyX±Ú4Ìÿ©ºŸ«—o[‡ß+c›êéËê¹z^ݯîÛŸWþ‡ÍÏíoÿU¢ú©ýû¹úõ·öÍáCݾ¬ 7íëßÛWgxûÛ½vïÿµúå»êk±Gˆyýÿ+e´ª#cõóªg“o¾=}]]{‡Åk´­¸’ªâR°êß?VŸZ{ð¬v‚7ÚjÑòX[&ý©(ð8YÅ…c•n†ýói ó À­Pù€o)O-.5Ϥcǹ”Ñ$µƒžC ÎêŒÀ;ÊS ¥×1žGÇŽéÕ˜ô’ÚCÏ ×Î|Kyj¡Cà™t,x?¸Ê ª=ø ÀeN%o)O.•^Ëz&5«^.CHÞCÏ¡ˆ†ç‹÷žòÔB镌€gÒqãL¾¼‡žC º}Ég@å™B2žIǦqu¼ƒžC VæK­=å¹tŒ€gÒq #cÚµƒžC Îdt[Ês¥]xmuø'¢¶•³ŒÉ¯â¶=æûc``øw@á9òàúqu}×’Ô*QWŸ:+ïpú—ÇVMuÕÕ›VT«ïS7?TŸW®Ö¢éIô#Ü¢öŽÜBhD(PïeDlŽF6P ŽÜ¯Ÿ,vðá±*¹­Ü2>ock‚¡¶–•€z„´1žTÃæ­g ÉÊß\:XÛ³s&•[`âŠyotRnQªZIßDNS®jÁm7¶WHo”F7[öϬÑ÷âÐ=°#<Ón†i·›×±Æ¼w”u£ôë‘@&—µ–·¼íG¼mmˆCÃ/ܦöbDA…lÐH˜Sx ? „8=„X,ÈõÄÇoËy}§Ô’ÛœÐÈ’Ûd±r-—ÜfÉm.8·q-¦Ù &’§|@#» <~FÃ(xW&·q¬ÙÍk˜Ûà ç)8³à ŽX˜sàÌbÉmòy}ÇYŸî/¹Í)ŒP¼¾`eôƒ)`0/ÀCŒþ8Š‘¨†2ˆð#ŸÀ¹Ñ\™?òqݸÁÕO8ÀÀÀ„CŠTõw3eìT°Ž/àɹÛy=\ïC'/ùÀ•GÊ|ìäqÓ?ƒñ,A2cÊ͆(ŠC¥8:Škº´ÀJ ’ CÃ:•â ‚ƒ1ÆC^oooJ%™)è´gÙù.)ôââ2(doEç™5³V.q)„yÀ’Ç­KlÐÃ]ÚÜ$Í3‚/Ì@¬S\Œaª ñ,­íDJHJ¹Nh¯cë4¡­eR[ÊsŠmGªržKÒd[–VNziåÒ2üLöp$Â)Ö¶ÞRKEòœfSx6\àÂЧùsri̱3oÌaŽƒÛ弇ÇØPâEÁXxyªtle[‘jiEžÔÈ’Jœ¶½½¯V¤: yž‰ßyúÅ;°X) çs¤%Š[ž¤½g9KŠúšÚ±KScijõ5ç9kK55ÕÒ<Ϧ>‘„ù™¥-S£1;OyñM ø ÆéGà ·H ¤í✆%SÍ ;PXD-¸tÂ]”È>r‚1EFànñÑœPø¬"Q›ˆ²o=bðÐD³qN>¥dMËùäìr'ñþëåÜSê‹\’Ê-2g°•N#v€ôcÚ—ÌDü ®«¡·£l6 œ­(uÉvðâ>–á’J ØŽ`”ó2Ø04‚¯bðú²Äg >>qå™”êÂ'$ó×ËVë×fjƒòÜ’ÍQËä‘ë9Y*¦g*i·»v7RçÝ^W&]<ެÌÝhÚ Ê~éÍ…³~è€g"xnzªÃÐÏà%oÊH„¶56ÜŠ8¼­€—l) ³¤Ý ¸o‚/Û£P¤‚pÍráé)UoÁWäÄ=‰!‰µ€iÓ‚5â4¬èLÉÀO Á :d¨SúZ`ÉÖ‡ñK¡Ö²—)KÆÈ”nÄZ tCê3%](Cù‰ÐV¦šhÅ®ûí¸²¯çÆžñ¶HJñ@8,É_ÔæØðŽ^Ê÷$¥2À)õ¨2À×ãk1¸0„âzûj""b\a]#là•[BY& Ý'V‰g ÅQL3ñÆzlLXs‡»7¬0ìø"ÐÂì7eBJÀ›š¹A¨½ÐB ýÐndv“wÆØp9Œq-$”æzqݧèº#3”p…ÒŸ‹øp<‚/çÀr#xô¤^7â”ßE9~Q¸YyÜ*J2ž"INdøQ Ñ”CR—v¸¬TÎk9SblI¹ZÙ 3ïgVd¢p“ß[—°Œñàæ)iÑ;ûûpn†YÜyíë%D»è¥[íOõÜ}OrLÜ÷s8@v²×†`Æ»˜µí÷½ôbSô¦k&¤î½˜/´‡‰0±/oÃ3ã¦5‡q‹ðH¬² ¤í.p:Þ‚¿û*T@ÃìŸê$ ÞÌxÌ 68†Ÿ ˆÅú‹¥ªÁu¿³Ý–e'!OØ8N lª×„œõã/—0i¬‰p?ã8<cDz^Œ=òQ{¼AÍÞ‰‘}êDÄ…=ÄФ©g𤂪Ä28§ o˜¬C°x5ó! Ø‘¿üŠ¥Ùˆx_ݯþnîŽì endstream endobj 9302 0 obj 2293 endobj 9305 0 obj << /Type /FontDescriptor /FontName /QXTNAA+LiberationSans-Bold /Flags 4 /FontBBox [-481.933593 -376.464843 1304.19921 1033.20312 ] /ItalicAngle 0 /Ascent 905.273437 /Descent -211.914062 /CapHeight 905.273437 /StemV 104.980468 /FontFile2 9306 0 R >> endobj 9306 0 obj << /Length1 11660 /Length 9309 0 R /Filter /FlateDecode >> stream xœy \SWÚ÷yî½I‘Å"¢’!R6!„@ÙÔ" »JÑB‚I\pGÛRj-jÕ©µÚuZ§µj¶¯ÕÖj}µ©N_§õµµ‹kk§í×v¦%‡÷97µ}ûõûý>.79ûyÖÿ󜄲šð„TT§¦ÃßOþ[Àw~»£§íùÑ'r°|ñN›ÕÒÚ¶rz!1Ø–iÆ€«Xߌõ ¶.ï’{Þ§ÆúB`¾ÃÕb±ÌšLˆv4öïï²,é&MdÖOb]ã´tY7äxÎb×±ƒðÂyî5"#DöˆÌ€+Dû¿ùÓ¤ ãF(Žý HÐP%Y2„«hñ%iÕ…DC4Cƒ²÷è,0(&ÃþùÞ8ÿ!‚YÖËv#I„#§pít¬óDAˆR®U†kÃO ÖÛËøS²Þë«dÆjáK$gèšL.ÛJ{ˆPȵ}¼>.RiÐãõ¿xŒ¦Ì8:R-ÊN£ŽÀâÍG&ß¶~@¿Û¶=Æ­­ÙFˆ0¥à?ËËO3Äê”%Èï^£§—ÔS‹VÒp\–i÷_g× ÑѰõÝ.çüùÇR¤^ËÕëÇDÅÇ©UšqIwä˜ï<ÜÞ UÕ¯é礦ìÊŠÕ3!IŸš>µéçQ¬CN£PDZ>^/WÈy-h•êLS¦R«ŒTšLJ­<†>ù†nôèÐÐôIºO¦ŒŽÚ3ö«Ò£ŒÏA"Ÿ:°óîÂ’Áe½ƒîï_½’»äUK?ô~·¡`H?~ìåI (É~Ð3!²ž”ßA”ŸŽ¸HS¦É¨5jÑ 2<ŒIL)Ê+V!WÉÕ‘|¼ÇáÈ¡»¸¶û_þOúìW¾ Mð]ý.©iÞÊÓXà|tã±s¾ëÞ)oÆîƃ€n¬êÈ2­\ùõ·kÖ⾕°kàÖ3Š”F­ª’ €m?þHP1h 6¤5ˆ(‘@¤Vkm¸AñHž\Z~7ýÑ·Š«ók4 d<]H_…G!†^„˜÷øA×ingf~þ¨¬Êx\‡»!m˜ûu …4ú.Û«rèk!¹%zÃ)äzÍÄ”iHWGB†h8( …Üo-†tÖ'Ä@Ïòi43:;ö\÷zèUeDBbEÝI£" bTÒ³*’#”ÜQºýÀ«À|â±™e/¿B·s8RSRÒ:ÇÞìt¦¤¦Or:¨Ùä9˜¨ývŒ @Ɖ]8ÛY¶ ¶îÑñ -ÿyŒž]´øÜéë¯/èæÞ9÷äÓµu²^Øÿ2Ý©g –®]ãçïšðPŽüEûùÓÆ«Õ¿´N£DÎ ‚ðlÜD)ذa|`=—Ÿ¿„A~Þbà¹ñôçÍ[·nȶn† ›è÷GëëéÆWîšLÂl“I;˜Ò‡]-V& N&J’«úéž{ûú~>¼r¹–~ô:¹RqÓ¯ý^m„þõ³Áé8ýe\|uù„øúјŠß9år©”i11c&*#"Õã;Ó AòÅs6´LLP©aBlnA–QQW»ýÙÙ œ`² 8ªBvTÏ‚VëAº¨Q«“?¬äà0¬g¸@N6j„ܙqñtù¥ÌOP4»d'¥x‡xÈpo¢PÄQ‚ïÝwoð‚ùÆ &?”›€óc£VÅËè‡4[xEØq£EØqå ®×‡²ÀõƉ~¿×Å2®°hEwQnAŠAÅÄ) @G×[ÞêšdN ô[ú 4 ¾ak£ešº=æÜ³û<§¥?<´%=mž.orXãvá mÞ÷_¢?˜ÝÐ4ÿ¥æÍQáW"î"?²“×3XFnö¨ý\  °èŒÆ¥òG´ø~±sgyùc-wLœ>vü~ùàÝüòà *-°—ÇŽ›V{ØÁ¾– †£Ä J2zÁAÚaÒÇúYä£a„  úñ'ÏÓçüó~¨ýiÇ£ùtP;¿yÍÛí¶ÎŽ÷FZN¶XÞ|æÂœC[¬GJ;J–¯øæÇU«q¿i(Ûôn.—$k’‚ƒ1ãölCtÅmû?AV­¹taábýOFÃêE™™‰ÉíßVU'&-Yôñ‘Å Çý{dJj›5-]׸ªÅ’gŽ‹…Ü sJK¶Ä•ÇhÆ+0hÆ«Rî˜X?Z¸óÎÇLÕÆ@Ô˜ÜÔèqác¢ÇÅé͹Hk¯”W¡0®ËŒqh2ª^¸‹î Aáiþè{Ÿ|v£òôp ÃÑ!¢^äÃQ(œy¿,CË … o²Çû&"r=¾þûèYz¾ Ù=…Sùcý抋€gá¹O© &çJÈÂQ”Y4³„_ ³CIëh!·e¢6&9±0S[”a7çð¹ yæÔQsÇ»SSÔ‘¡_‡ÖÖ=ãû®Œî#hQûñŒCq=|Äån€:Âïëâ£U•šÚZ·oÎ5˜›’6’~6zYÏûW–ö€^Ÿ7yú%¥Y9Ñ܃ǖx=+–”—ßy`Rúü°c¶vh·j­¨,,6çš²²ÍS®2‰U³X4ìg …1é`”œ¤}ƒ^ŒMb¨EšÔb$äËdè_ôõv4FgçÛžšªŽc±ê²9ǽcÒ'ÎÉy!“sŽlÙ„z Þ¼&¥5í‡u74Ö>N·w^ÓÜ»Ñ Í&ÝÔ¡/…”ÁŸ;ˆç‡5&kô.É4o‰iS1q¨˜5&¬Yûí•{ú"a|ôÉÖl G…Å÷47.™œ7)½±!ä W#{WŸþxår(«ØøÄìzè;ápØÛOD½“žfkJOƒËéiõéiË#^¶µ·X÷Þ][-DÔÍf2ª¡3…9¨û‰„¹¾\ÊÏMŒ$£É/.æ¬H’ùŒí€%ÁbæαøÎÕœX²4¢BÓÓ*ffrÜ]C‡™³žúºQ&d$‡5kCÁœ×u.tçši9̼ómA\=Eúm F«Ôª´¼èH‚yÝ?¼¿jõxˆŠÌ2ÕÙY‚eÎéX4~“ÆWøö©Û¶½½t œ¹p÷½0¿éõ܉ PT¸ÒY4u.uš>:–¯Äc¢ˆ3¸ë(2^” ;·ù³]sÕH)5Å&fÂÊøaä騰aˆøò¹{óœ©E}ÏÏi }¹“Ñ}PµÜl̳>£÷CïƒS§À¦#v;¢PܽKªjÆF`dÿ濾‰ô©¤ÄzßþÔÆtÔÎ äŸyÎx’"ùÎmY†Q%’¿È¤ÄB%¥ BÂÊ•Ÿþûž{¡¿op¿½-‰þ÷‚)É•m¯;»èUS–¥É”•cž×”™§.­Z û^€XräpEåãÖA·û³ —ôœY\¶kY^1«¨uRGžf /’,6êX„GÍ©¸·.Ñ0p 6qÙÔ_€‡©íŽo@ G‰Ò”0aFËÎJx~4j…¨y5u“ó'ÄýRSêë>÷ñG…'·®_ÿàÀÖ‡ŸÝûÌS»ÿ3¯2½LAid 4´(\)ºÉ¥¼Š¦YAL„„~XSÉEgVf°07œP è“?|¿ö^(/_ë.)…e=?[ÖÅ¥ÞûÊËèë)©¯À«sS“µ·efAf¦Ë™Óú]Npvï»k®Z=»Þ»ÛÚji~É[×)¨æÀ¿ZSS޾ƒ|tù6Œ¶çX‘•Íü¬£²þ¦&¹_¢ Ë ä·b2ÓäpHiÕÃ}ýƒí‰ _¿° ŸÓ×Ö·ìrö®º6¸b=›ÓÔ”:N®™;Kû¬,!î¡Ýçï¼# `õÊ>]±öîÛ¾¦¢ ÁsÑÂ’RÜ £u‚ 1e´ˆ|F¿_eš@„Ä&bˆ¶–e$ç$è51zZ Ïé'G<ñ´¦~n­‡· B™”Ø!¤R™ó¼¯aèÆúÓ•ŒkD|ÙF1Äc¾–×2ÈPˆ—¼^èZỺÃ4ñUÉGŒ Ý[Ö%‚>Ì.„]‘RR©¶Ü'ÝÈòpµ,ÿ¿õ‘¾Gè‡mø6úM|ïri×WáŒ*4›W¿@}%£ UU&ñATÎ%¾Åízç/¾ÆSÒêîÊÆbΧ×VÁ>î´/•~(„ ;hÙß Y/Ã¥¤dš?oÑ2–˜´ðà?•žñýª2°S¼¬wpñìë^âû¥|ShÅh̤}ó¬rÛI†]lÀÓÃ'ú…tˆ‰ß<|H©âšü˜×e'i§³ø©Ás‘Y” "Fõ¡ê€7 Rz }zõsHÃï¸.áR¹t'4û~öýÍÏ·\‹¼ŒfRe>Ä)xÏ‹@«T«‘±pY4p¥±ôï´3˜^‡uƒ‘“ò‡~¾nìø±ŸÐ:¿áGÁâ/g >‡,_+{ýŸã¿¿a%Œºrñòå‹é5úÕÅ‹W˜gà C¨’y0îâ¹U¥Òñ:¥_̆Ä×Àkñ5`lÓ*ùõÅgÿUõh%=U¹­bûk%ï~S³­ 5Ö<ísMc ßD_ÚB× ön²ÍÐKW±w3} Ê÷1C×ø«’4oFÑtQ–þ 5.ø£…‹ã!.<=­®>5™^åòñL1¯éL¢Ó`Ì1»¸ËWó>YºŒ­€ÔwH§ÑB„sî#º®€„×C³5ã߆xÁì{ÊðÖD[;7ŸeZ¨Ñˈáì¶UºE> ß÷Ü<ìa<½\_ÿä“Ð?zýµCP å‡Ñ÷Žc˜Ü¹ºŽœptpo}ò̳ ³áø›P Uo>r”¶Ï.Ÿ}‰!~íḛ́ùíD¯ñqþ .Ì¢¯Òg‰Ž öß5µ¢$7õÑ{aͲ‚)œÚ÷¥¬×áüë–G¬oú¯@çg±‰:ËÅùÏj0@辡—dÿ¼>b±ä~Ä2ø1E|û…šÁ÷¸ï|a|â Ýy…®g§âjÌÅX&ªfÖ¡ôçœÃ)§6sQ- ñHÌO$»ÆéxûëF9¦˜!rú¥Œk¢>ÌÙ¹kæœnÌ4»&çrcaÄ–‡Ž¥d›ÂëoD›Ûßf {ØnKЇósŒÌ²" Wnþ !t'>oô² ŸL g¸4Ä×ϸGi|ïkõE#åMh]¨ÙXvÎ5ë?Ì xn¿ó`gQv¨º“•iuý§Ì˜níHN„ì{[aq0½ýÀº‹×úû|ÓA+pÍe3kMéié¹m•¥Óͦ’ƒƒ«%ø¯în€Ç¡ßß!F2Nüñ .øË¾GF!rÍâ\£@.äíœ?x“̃[Wð1R ÄeFœà?ñ‹"àóé9FLÜêÀÈMõæ¦òù¾Ý\ óàã8ò3!Hºasð=z4Üw0†~î c7$Œ.9×ÇG‹'W&µB­Ð+ô&½IÍàÚ×Eר´åàáëEߎ:+¸lÇóÎô .{/ï¸ P5ÜÐŒ²ml”tû«7ªÓ¥‹E…|nsÑZl˜5m»‘ù÷œÀ‚&¦EXt£dCÙLvËLÁ>H#Á„Ä1 騥æo°/jLö«æø¸^ÐNí™ÛXQRW3Çqä(R{uøWÐada\¾õ¹ƒÿ9ÐÀsüÙë«DÑéâ×À ÿ ¾8²ù£1†mC˜Ù†¾•_•mDŒ q$“”ÜÊæYÊÃRwСóðÒaX7œ ”ݼûuƒüêœ9{^l˜]W{èÏuµ7 þÆ?|zкaC-ÌiÜ»—u–Œ×L¯¯MLÙtM †²zŒ´XׯÀ¾s/¸|r©Ûís‹?ßl„ï‚O.uwÁ`ÌcE…P\¼ã‰)S‹ å´;°ZX¼cga&ÅbV¼³âSDNˆÉh3áuü”Á#¿â2AñÚCÅÛ -­ã¾G]&úÏšÆpÆ»0bìÍ4`“á VÍbžÉ â’û*f™²õdfBeùýÇÍú„윹MxNÐ7šÑ@*gÀ4w¶‰?&˜Mn˜¶±¼ìp†ÑFß›W\¬Ô…ÅwÑ÷:Óð£"© ~*Ôþˆz3‡f騑œÝLÊ‘vW³¡×%f7&è³Mó³s@ŸÐ˜}¼¿²²2—.Å **ûŽ…Ç–NHž[R¤”Å…H¶3—•o¤d™…cœ9ÇI¬¯¨–ÏϺ&ë“õ#¹dZ6£á¦E¨ü·",²¨ñËiR‰I²^Ìœaø7Ÿµˆ0FöÓÔ°UÌ™5kߌfË+»š-ú‰%ÓžoÞÔn:]¼¼ö®)Ƭ;ëkJžÿ¯««Vó#!N?eæÄ„L[jÒ˜ÑUÏÚ_€‚) ¦ài¨÷ÞN[õÖÞíu5P1ë¾ò¼üŒÌŠ}ïø[É—‡f„¿£4¦œÞÎ~Gö„ ‰I%õIš]lòàÃŽÎÚÖ’›;ZÍÎÖü¾èþ£ciïGÑ ¤ÙøÎüƒú ]’ ÷ Õ0ÿQ ‡GÛ®——£¦<˜mlDMù1FŒn<½´^±ððõQŸQ8Ê$2Š·®áQI¿Â‘õoÈ~>üó:&ïè!›P'ûŽdÉì^JÄi•Nü2N´µ[¿E²ó™Ñ òߊW”áj6#Aü™ –~~ Ïêz–~ÓuvIOe¶©ƒž¬ªNN¯û£®5³ë33béÏ¡‰É#ÆnÙ4cºoÿA?Ö3FŠàù}¥Ù°w·b^㛩 2ŒAÐ@œ!­¢lÁçÜ{¯lB|ñ´5úúI)ÁôqnÒ¤»æqkB7&§Œˆ²ÁoÒ´1ÊXº1d8 ¼4ÏnåœB•ï Ë Á÷ ·Žë»ÇGñ´ÐË­òí|ï—^¬ €ªNàßà 8¦Bßzˆ¾vÇåa¼Ûå?+hµÃ a×-Üu_ÿ/Ÿœ×æÿrõÔ EŠcˆ¼WÅHæá·ãï[ A>0EÛ{3pT1žU]U Q„q$¾%£¿µÍ Íý'û¡ý×#f*Ö¡nÑ.ýáÅdZN ƒŽ ­Z­X'®tû_>%«#9Šõ„ã²I¿<›ÔpÏ‘JÁCb°¾¿gá7‘½Eú…Ëb{%~¯RŒ#}R¹ÇGa9Ç `]-¶aÛu8¯û¦áÛ‹ûôóþy¥8†µ§²oyöÐu6ß~lË÷ò;…ݤ¿ð-çxHöÄ~BªØx\3¿°/Dþœ8oû—áÞmørX×1^ð `¼±¹H[£…íߣ𻉵cY‡sŽ#r.{èãëGá*éB~ ŒìÓ⛈ãçðï0^†®á$ƒh‘6F÷e’‡mÇPÆ*²ì"/“ÿC(èñp¸Ÿ§á.„3sk¹CÜ?øQü~=ÿ8™ÿNˆÊ…§…CÂ2•¬FöÙçr³Ü*ÿ£ü%ù·Š ÅJÅVÅ¡€¨€Ö€Í‡Þø*F–¶n Üx.iƒf­Útf„lDĈÄí#îqrÄ—Á\ðè`Sðœ`OpðFŽ7rþȧB”! !Æi!sCÞ ¹JBÕ¡&ÉÞÈtv''Õ~ý7œ7ÛëÈ© $â¤2GÈ—Ê<K¥²@"0ùË2‚¤T–%— •d)oÊ$‚ÿ@*¢®GHå °Ë¿‘Ê#ÈØ€MR9˜¤Ž”Ê#‰1p—T!c‚"ÐgÉn‘*VäE&•9F©Ì“ (’Ê™[¤²ŒŒ…÷¥²œÄs •äG.O*‰ü©HÆòÿÊAÜß…1RyÉ hÊÁ¤1`¯TI:s¥rÉü”;iÇ׋ïRb%­Dƒ¯ë,µé&=Ä-޲a«†LÄÖüN'“H¾D{>íÄó5¤ËnœÅ>-âº.â$)$HìùýÕÒ±T%Q1Mœ„¥é8¿…ÝlÙÛí^ûRk«¦ÕâµhZ\Ý=n{»Í«™Ø’ IŸ”6ISêrµ;¬šB—»Ûå¶xí.gJPᯇ¥kªp‰io’fº³×-C‚šqÛÛ Öj¬9‰»íÍVÿbšj‹¦âI¦ºøY€ƒZpº›Ø"’ŒïÿcÑO‹ÕÙjuk’5ÿkýߟª¹µÿ¯fjüôÔ‰S=7'¦£ì&á“‚%Rgu{Øøô”I“RÒ{¯á’k'¶Q²£ß¦Ó.ÒÈÌÇ+ö0¡tá·›tb›‹´ý®’58Î*š¤{¬b­U\•­]‹#ªÅQ•âL&t¯¸›SUó;VàŽm8¿E4Ïá‘-âÚÌÌý+»°l“Ô× ê)hç óæaFx›ÌíEãu[Z­]w§ÆÕöKÃÒ¸­ív×êÆF»SS›R¢©´x­N¯ÆâlÕÔÜœXÑÖfo±Š-V·×‚ƒ]^ÚFÇB·ÝÓjoa»yR~ËÒ~ÛÛnY×mž@PrLb‹D9̇³ºÇ?¥Úk]dÕÌ´x½V<x$áû[ ¥ kLa‹Q\L86±l•Þ*.ǼÛ)ÍlF×üîÆi®E2'>.ëç†ÍI’Œ¢Müôˆû:q –‡]Â#ÊÃ.×íThDµZD#ñfözű-ØîÀ§GBº.”£×f Ë‹Èh»É;Ž×ÆŠæwK~“n“|N#¶vcÙ%Ò>,½dQsŒ~«H+YD¤mÆq?6Ñp-¢ÙY%3ôŠÔK©UâŠQØ-¶$“bÑd¾Z%IÖ#.—ýæŠ~iÝî6Ñ͉r»µ¶S¤¶UlsÝ”,åvòsìñ¿ó¦VÚDkôK¯U\-ùÿ"ß6Q6^iW—HQ+>~=û-Ê…sŠZó»ºßÖ½ÿKrQ¾.i^7ö°½ü´tù]wªÅƒ®ˆŽ[à¶w¹’4‹mö›f±Å£iµzìíNìlîÑüÒ4ØkAWw:]‹ÐY“ЭÛÜVÍîl×xêz¬n{›´„Æk³x0tY½n{‹ÅáèÁ8ÕÕS›10-¶{mlw‹ã¹?ˆmÉ{W·ÛµH$/ÙÓâ¶Z¸¥ÕÒlwؽ¸†Íâ¶´ –  Ø[<"V Dhº-Îäâ…nW·‰¬/-»5ÉòãŒÇåXdõˆ£Vk«‡áT+²èÀI¸±Ãåêd¬´¹ÜH^«×–|½m.§§º4–ÖVäåjYØÅ QÅ;Lœ¥Åí¾n‡Å‹«t1¤²‰>ÞMÌ$ŸÅâ“"zúíøÕ"¡WŠd©8Ñëí6§¦.^¼8Å"X bX •úÿ¿,3‘nјo(·hlÍ.4—ßÝÚÛÓm•ŒÄíI±y»þðçßv'Þ†ÌÃ^T¡­L CÝ’ï—HV¯ùÕ ç~»ÓÀ4tf¼ ETgº¬ž^¦©èF3)Ai¤Išáøž–’ökqùÈŽu¯È¸GôŸQXíØ_”•Ý¡½ÛëIñØ).w{jEIKuÿ6¡”_ endstream endobj 9309 0 obj 8091 endobj 9307 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /LiberationSans-Bold /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9305 0 R /CIDToGIDMap /Identity /W [0 [744 662 936 276 772 330 552 276 552 276 716 606 552 606 882 552 606 330 552 276 606 606 276 330 716 552 552 662 386 552 606 552 606 772 606 606 552 716 552 579 552 552 552 552 716 716 496 606 662 606 552 826 552 716 330 330 552 552 552 772 716 276 662 606 662 606 716 662 330 386 276 276 330 236 882 579 386 386 716 470 552 330 330 552 716 579 606 330 ] ] >> endobj 9308 0 obj << /Length 973 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0057> [<0053> <0057> <0049> <0047> <002D> <0034> <002E> <0030> <0020> <0044> <006F> <0063> <0075> <006D> <0065> <006E> <0074> <0061> <0069> <0054> <0062> <006C> <0066> <0043> <0073> <0031> <0050> <0072> <0032> <0064> <0033> <0067> <0077> <0070> <004C> <0035> <0042> <0036> <002B> <0037> <0038> <0039> <0079> <0041> <0048> <007A> <0046> <0056> <0068> <0078> <004D> <006B> <0055> <0028> <0029> <0023> <004A> <0076> <004F> <0052> <002F> <0045> <0071> <0058> <003F> <004E> <0059> <003A> <002A> <006A> <002C> <0021> <0027> <0025> <003E> <007B> <007D> <0026> <0022> <005F> <005B> <005D> <0024> <004B> <003C> <005A> <003B> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 8 0 obj << /Type /Font /Subtype /Type0 /BaseFont /LiberationSans-Bold /Encoding /Identity-H /DescendantFonts [9307 0 R] /ToUnicode 9308 0 R>> endobj 9310 0 obj << /Type /FontDescriptor /FontName /QCUNAA+Courier10PitchBT-Bold /Flags 4 /FontBBox [-44 -309 664 875 ] /ItalicAngle 0 /Ascent 875 /Descent -309 /CapHeight 875 /StemV 93 /FontFile2 9311 0 R >> endobj 9311 0 obj << /Length1 14436 /Length 9314 0 R /Filter /FlateDecode >> stream xœ…{ |õµÿœ™ÙG’Íc³¯$›d³Ùìnv“}ÎîN6ûJ€„¼$ä™ $¼DÄiÊÃr©Š‚Ö*©^)¥j¹h«­µ”r•ú·Ôzý{Õ öÚrmë_½\K&÷üf&ö>³;ó›Ùùßùó=ßs~?( (JEÕP4åÚÔ¯‹ž‰cËÝÅ}°byO_ï…†Š -Á¶È lPogíxý¼.[1|ûÿòï§x}’¢ ohuo£‹û>>Zˆ÷Ÿî¹s ÕE-ÄëßàuÉHÏðòâö[ñú¯øü: ¨ïN|ÄòÌ)쟲|$‡‡GØáøÇ#|8d+U9lJ¥Ai4‘FƒR©*•žs–*MØÌE {æwZÿÏ»Y¾¿kF_M1´wLëj˜ætz¡=V¾û¾WÎÀ3ÇæÜÑì€Ù­Û‚:“Én‰x€¶Â}.Àá–×–g«5ÚR«; PQUáñŒö*à‘Ýwî2i´¦r«»*<9eTÕîŒð¨<˜8;ñ±BÉ¢Po ÃA#¼.H¤9l6Îh r #ŠªÄ?ùïoôxSþ½lCάTmsÆfUz( µÉ?§j†Õi-«Õ9å–—Y«œ£J_HýWMbH¶5½qZÍìl8'Œòo„ÞÈóIŸ/9 ‚6mY™eFa;\‚aéÎøXÄ à ãœ?5!°MŠnJGùPz¥Q”$ “Y@ñ”J•iä9­Í¡4)¼ÕHîªlZ‡þ鿀Ã4¥¥™å®`AÚo…·j‰šµoÑkSôádmmòm(fwúÍj€tk,èI:´ZW‹ðs_2 …ð%“Msɤèu& åªFØû™çQ®ih¥ÄB(—h=Ê¥ÐN*gß¡"ŠE1ÑZP‘F¹tŠúFË #¢ÁŽ„Õšè:6[¢§©E=>ƒ¾ã+ŸÝZW»é©åÍ»g€9Ö5£c¨˜¯†ƒOlÿÉ —ʦ/ªâ—L·ا/á«M/û¿ô‰2¡ 9hÆwhF±ÐÌfA÷¿¡]bž£ZdYm¢9Û”ªPXÆwáZT¦A)ËŠ¢jQȈIk4ݪ!LØ­f4ÛÔˆÛz[Õö&‹sgU:Uª4E'„«.`h.¥:˜ P}”'W*uµxõ4N¥šž?oÛBx¼> (e¥8b~¬B­£½âŒuΛpßøY÷­¯q&Xa»Ç榒¥°iQٲђ9Q¡L†¨ë=ˆ¹ŠÅ"ÒÚ>Ó®­¡]m=Gˆ¸õÙ“ÑGjÃjuŒ8*ú×)‚À~D`[ªÍO0ùäTz nÛWJ¿ýfC9 ueq5Æ©d‚£wG»êŽº®h¬«În¯ëÂ速1QXIiDö`’$Ç ‚°¦«k Mw´z»ÖëX°|~GK½‚xÌœÑ>…U´¾)ã’¢'žØl!¤âMR '±Ð¤4Ù¤h'†È¨hÐÓoKA.ÇY´/ ‚0z×ßBãg¤§ üT3t •ôåf< ³!è®­.Ÿ7Ök.#"±º·Æw*(a‰@"0vÊI‘ƒ}óï>}~¾ž}3§ˆaAQ^wqqIawGv'Žl?z–õ¡•ÙÓF€rÚnçéØ3Ý:·7\’œEÃH|pYWŠÌç‰ü-r0÷Iù.Ìø:G¾â i0GÚ"ßAh¼E8G™^A™rØïQi$"MåŽkZgö«A·MÕ=*}Óí5 ìñèQÔ0û¸ØÁ¸QêÂ1Âþ„ºLù°Ÿócl¾â1ʈ– WmX©-"à ºI“`*uåÚüÆñ‚ÞæÖ—ø5ì |†¼2•xîïfÞ•ï(Ðó ¦O|ÂnBnÇJêùœV¶{~²Qt¥HVÉ\ÉnÏ\A%þ„¨oD­†¢ÐtçüT˜ù%lR¥Ã¡Ã»üEÅ¢s ©Þ%ìG4~áýHG´hí¼9Ùpâµ×Z y’놄ñg ãŽr’È{sèQ\ÏšDOeÇ uï¯îÞòëû››ïÿõ–»µ·uüƒxO£ÃÞØ“ˆ÷Ô;Êë—ÁëÇ·7] < ÷œø¾³¹?QÝ×XŽ4öUÇû[œ¨Œ=cˆ$öhC"4â4:EŸâ$P”"ND 9Z" 4ª¦ %¹Áj}¯õPø4†2]©\GÂÍåšÄZ¥²ˆ›QÞQjÅ:HÕ~Q“X£~Zñ44´JÑxH(„ai¸Ä0€5ÔV]¼vHxÿZ›¬«û‘ 8‰¤ÀnÐÎØœvØ$jÀÜ ?Â:éÇwDw·ö½»®nóÑeÝ…â“©[¥J/° gD7)›$šþ¶” i²©ñ ?*óÞô<½eÆÌéõ2³”Í"Ò‰+[íõ=±)×SoÙŸÀŽ¡Ô²vIÌÑŠ±]†d¢Dýu!GUuà VãÛvð‡fëK˜1¤©ÓUC‰šË’Á¥•ðõööjHW%R—¥‘¼ ìØ wÃaQº@´JrhŒ!¶ÐÜê€õ«…÷®µ¢†BKà< ?' \³ 2àXe\ #á‰×Ë´È©u8$‡£~ ÕõÂ’\@^ÿ'1l!Ð[ãÎ2*‘!eu†Lt¤â9™Z|N»~5±øL‰äæŠpÙŸ+®Ø î&ÞîÈÑgCÿÜ£´0K¼¹ZXøxˆ âŵÌìÆ\ T7¤:@RƒÕÿYöä—žW§‰š0éھ΃H DbLSC-sHtÞùðôdV6>ÿ jq q -”YOò"ÛÔ`º"‹ àló!¢ R“õ*•*IŠcPJñ™i6ÄÔ±1ÂÒjd#´ð=ðݱéÌàCÝËŸmõ¨ ßì,ÌÓgEN}0ˆä&§ÏÙ õj7«@ÙÿÛ s¿ÕŽ+á}%÷‚ÑîÖ›-pâž-ÂFW“ÝÊ÷àÄ{,òÕ¢°r‚8éD2q“ FJÅHÖ%ŽHœ×qbDzK_wxÙž…K®®t[3Ú9díçI9 œf øcÁY\@_gdqs*ñƒºV?»)kècž±ž†M·¡KÙª›œåAsY@[«?^’Ã*9e%ÉJ`´®ÆêÎå¥x+é+oàKªV=´dô Žã0¯³¡ p¼D OäÊV¥J…@%C Ç„G Ë9™W¨‚áñD\‹Éa‡ÓÏ\ɽbÉF}Ûχ®:˜•1*È<>;¡`s1£¾p“J/% ®Bn@-ÝdÅD7å SŠ$Œëå_j‚‡Ð»ˆ³¥+‡5!,k_v2Hh¿“%6ˆÍY ÕêaR©C¡Z–?CóU‡üÉÃUÔ¢— Õ!€'¿lJûŸ`8Ή¹m5f*/*q.e°ýÜ0Jõ‡H„¾å¢ÿ'¿1Lj­Ùï*u™šè“•™ëb,Ï^ ô<;¢jŠD{ŒªšØ7…¦MTˆðö[Ø·äg?ØZ'qôæ{}…–E–.*ï‘jêºøEØð}3¶<=ÐŒPŸ¶Z§Æpï»eôj¢°;Ùý„÷Ùµ„º’œ[+AÖ*á†U+‚}šü„Zú… Êï'¹XŒƒ>à­: 3«Þ(@ƒ?ó '¡Êç ÿÊÅIÁºâ}¶ˆýTÄô°e¬"[G:Æ_C¦I3Í’2YypÞKÉñµyùÇW]«möôÝ0ºÖ×Ñ*Èwûà•lì}å?-ZÂ8ÿˆã‡3 ŹBaÓ4ȳ}×ÀÐíZƒ@ç´µ]x·ûÑõ8"‘—îºÊK§`>&&jð—åºËŒ¹šñ“&¿Uï¶é¡P k ù¯™½Èa˜UP–W$Üo#Žyb±Ž²â[§Ú‚Œ³:¹LF°ͱõw4 wüxõÚ¶×ÕmaýÀ›mÉÀà(ÀÝÖ…Ï|ùØ¡/žY°ð™/}ìËg²­päÉ•#‡¼ÿÎùÿ ZNaÛØWÅ*¡ãëÊ<699—k÷À££o<Ôq¸åû{^>ƒô±wW÷}ìþæ…§–,yêÂØ.”lÑS±÷¹ˆqo!Æ¥Q)’I"±%½:M:dn«BðsŠ1Ï)URe^|-›&Ô3Âé£Ýís£®/ÕZSiÁh²vC–öÉÌ|ýºðûß \M‚¨ñ/Â#+¢eìë,§ƒyzs»__ ;³ó²UaÃ@[–å|bÝ£G‹ó<ºZP“ª5Õ€Òw¡ô 9üI2§X¢Ã˜cÕrzƒ])LÈ}©Ao°i­R$"e<æË+¯'|X™–® EI†ÃÙ_<Áw| Êë¯8oÒ$FœJö‰PL¨Š#9ßáX5¡"-mOÎá%Ò~  P¦j?à\DZ2ÓoâL×ÞÒþ ‡%€VY¥Œž3ˆ+bœ½f‘Ñ"‹üÝ#s;¾³£e׺6£ICâ¢óC¤¸v]Ë¡gàðÃ|k´,Kãõ&<¨Q·ÔuÕXÝ¡Rxë ÚjžgZÅuÆJÑÐ%œb˜­T&ñZ¸V¯@°Ò1$„˜0[ç!"§é°Fºå"F ¹}É^„§Ò–Œ´-ê rs>µÒ¯ÍX1¿½¹¨¨YÐŒ_ÎÌ*È4³PJ7åf¤iÀ„½Š5ì5›*BÑ‹Ý^í—¹N 8`îèîœgzé² `MWçjÚ[½þYíÇÝu­³ê*ÄÞàÕ)]“ZÌ~a„9Äž¦ ñÙ*­Íщå$^ZÏáC¹¼Ø³Òµ¥åÂ…–-.C!æâ1>ƒY-•Q ÙÓ]„c³…î¥oÌô.Þôåö‡A76«»@GjâÀ CL û!è>¹ÚF4ƒ4Ë&‰‚¢ÀŠò-­}Ôº¥Üh†X°°}FmöÆÌÂ0,]…ÐíPÜÙEºâîy‘».o›óí7¾ÙÚc2š±Ÿ¥8[õ°1 Éïo˜Oq>l×OØn9 úGÌ~ô4-e#Ù'!;„æ‘8m@Ùå–¶¨Ä¸?i6ÒðÞç±Ð:ØŸ4˜bÏ/àý[aR…üׯR {­ÅpS ñ˜…ÔVv#»’Ê'J¤Å”Ai4<í¬g|=Zfº,®+ù¼^S„A;´b"çÊö”yQw:a—+spza†¹¤ßêÒ‹™¢°QÌGHÁLÊœ’«"TŒa)¢R¡P|" E’ä<|Wë/ë³@™ÆU‰c¹L$’<ÿü)³ðÁKÑ*~°{ë¾ýÛïð Þ±½¾¸è%I ô %1ü÷èKô‹/ýü$À¿CFži&è^:Êf³%[!§xC©E1T=Ú9‘Ɇ–^EQÖ Q® 2} !Ó…eÁmZ-Óo¥ÞT6û¶¹³è—C÷6B6V¥§«ÂÈÆþûHO÷Úµ;´ÃÐP°9%EÞ±Ùƒ{Ëg=öðSôuüëܕشÆ*ZPB1ïÂ`&ên=Ê9Šrª(—Lz¥Í¦û¶(–ÐD‹‡÷^‚;7ì}ZèJ¿@¶¬åOÿ÷e€ËÌKð`Ë:ÿ&«~ý—?{þ'hQspæÖ"‹à Ë!a9ë•Àä³^cXfY8…g¡p»¸Æ¡¬I%R÷B¦Z½=ÿBU–°R(ºy^ø*™€Á4´§¿¼3µvÿ%|~­J+œ‚zX}µf Tµ²=LÖ¾­‚¢×s$¾èÉ b;3 §dO…Xg!ùxXö7$©Éåƒ7UÈÄ|Ñ@:­ÖW:®<éôê•\ÌÏê7d­!"%ôŸÎêõŒ5H–‘Y*ì~sf¦Ùoγl<á@NÚÙqc #ˆª#õYœ·é$*…§xÚÔ<Ü*/÷i­Ú©xOZðr²*4¿^sA±Š‘¡"l?YK«Ò`fºrDþÄJUº:me\vÖµš~ÿã«:¥ÈNá›JÄe)us:JÌ"KÐC¦QsѦætršØé¦^Xoñ´‘Š’A^楪sîÖ¡ÚšU­­«jj‡ZÝð/03‘jhH%f¡Q:m¡Ý={hÚ”G‡g»_0ÀR˜™C?ž‹ r©93›b½ÍÎòÆÞ¸¸îîÆÞhUmmUdÐ3ÂW>#çáZ¦‡ââsËcÑeM书eQH¨‹r,.%dªŠs‹ì Äyü-ZšU‘C‹ë¥SJ¿hqd?…J%‰Î:%/…µ’ØûXÝ–ðå¨¨È ±Ö+Ϫ„@%ªÌ»dÏ0×8 h‡…=ÌJ´±• D"µRýHÜ ¢Esý8KØ->h±C™ExÝáv {œÎ² `ßÅ/ÆEóW«‹Ë3š ÝÉÁ\Â,ï)qH/Ò¯¿:ÉôH¥•+ß%5•ë®èó|ÀRr©Ö_;Gy}ÂúËIy¥b º•\µÁ÷kúˆðºÕVVúÀ¥e6+pedÒØ'ÀUætþÝøUV¬Øgv_9Š:f˜C”›TÒ®¦ÃJ‰³ñÆpØ äå&«ÎHæ‰N­‚Kðn~>Äã'Ê|¦4PY“}À æ¼üMôÍS•‰*­<‚9\âÙ†´µÄLø>2Gͽ˜îš8÷~’0§u(Éoà–‘‘• •îÚ"¾Aç$I8×&…Jbü¼‘çMâOª’N»¨Y'&‘Ì‘+漂æ|(ú*;=#CY”VÈ:•–úÂ4Mήݙ™Œ.»ÞBgŸM Ú3ôiÌùÕ€>¤Õht¬Rød=޹½D•£Œÿ[Nfº i/˜>ýÔ¨Êà šÌœßT+sðsÝ×aä_Äþ‚š-픓LGÞ'‘‹.ÒÖ±ž¬rHÛ&eÓd9^y/ë „Õ#Ð4kÿ¬Oþž;9{S› Ì¡fÃ`‰:Ûà(‰zY°{]¾ìÚm3ž¾kZÅmߘ?wë<œêEýcåÙF“½0É2œ,©Ì-2Àk§ü¡#+ÏpGœy5q}iA6¦QVõJÃh3At`ï¼YC³"S‘÷54Ból³ŸR±&¹´Aª!O°12¥¤}uWi©Ž§ÄJÅED±¾\JöÕqÆIº:¹¯NÞ>B÷ýX•©·š}&kn³,M=„aáo¢±ÛÖœ”?X“y—½ %äõ3± ÚC§ë¬>Ÿ3‹>1~Ì\–‡Ä•Õ–3k'ƒV4ã/Àñ ×æÐM‰N†¯+÷—jYRZ&Õº{„5L¿¸ÇŽ»õ;ÐJî ˜×Ø&÷®‰ÏÒ>È0®@žjrŸT›Ç¿”3…ÖL{C¬f¨ÂËŒÕs>üð»íþaz&×èÇOÌZÓl- A#bÅé9'í6›`Ñ3ª¾®"$1ïX b)©¤V©ÓD6R!³îcýU^oUÿ1ø ø±À… ‘’€ýÕ€ L¸9Ã!5 »¤š xÈ/-I‰yŸä‘)¥I“XTIÙ/1 Ú%Í[ºB€‚ò€±¨$›L “É6ÚÒ¢B¿3ÚH¨kKs ª?슅B1WØœ±h¬cs» <ø«t¥*Ïw÷¶¬oókÒýs6´ö–'ÜùJ6Ck1—“%–y£m;¹F®H¡û‚a¥²8Ø@FcÇÑœ–F“«i×<Õ íõ»Nt }S–1€~»´yËÒp8ÏéÏ+°jÑ¢<í55í-(µ¥æâ@Yn8¼tKs)¤„+£¡P´2\F¿µ³mtF_yqi¶Z‘–ï¬võ¶n˜ãO×øÛÖ·ôºãîV™®µæUxÀÕ¾¹c,Ð,V*ÃA_X­(â‰uŸcYÅFäÛ3ÉŠ‡nH˜‰S‘/ŽCf&ùyÝÔSR÷´ñÒ—.$-«˜«§´3}³æ+ÓŽÚÚQÍêÚÚ]…Ë^É6›*Ýeư­‘eSÖ*òÕk¯³¼L£Ò M_¼ÈX„Nº©.Bc³p7øý°KØÊ².9ƒæ&ú"ù€G g%:j¹ÐyõœøÂRäv{¤µw˜\_™š²ˆ[¼I)åò"ÉSª€Ÿœ›”ûÓ¼•o}ŽŸ•¤x»’ÀËsÖüÍOº¬È’¿ÀLo½&S¸<ÓÞ\UYž¨yd+“ZE¬œtb1±VÒ†›ø&Ùˆvmw¢¦Ž:O=–X5COÏ£ãÏ÷¤6]1ðÔ+¶â[³g¹‹fÏ+¯AQ`ºsAG1ýê˧µ E¦«ÂY ƒ¯ ŸÝýûškíZtp=¢OLØím½k¼ÍœSU :ˆÕšøÖ©ÐPYâ¾Wi‹«S–E'{+± 6÷†µc†â9íóÐú:Ü ¼Eá:y(µ8ZݽŒ?ßKŒûèÀЧîHT|«½u'³Â7{>À]Ë—Ý`‰wß~åL¶ŠÍtºÜ6Xñ Ð=ó­ó´$×ZºäІTLÚA½Ž=+î²Äø©¸aïöÔ½ÓS«é8ýZæ»­é#r¨÷cTË[§Ž·oÙ;=ãî£}³÷Fþó†MÖ'¦lá“·:@yÃô˜¹ùhÏÐñmuà©þ cöºîX´›, :ëºÅ ~!/Ó?¢ß릷¨šÒM ©FºÝwëª(ÑÁŸ'>c¾d/Rq~²Øs¡“‘(|]î"å²ÑMÝÏ òg-]¼`Åâ¥ý­Õ| Ï¿ˆ9åÀ¾ÅswVÓSd·¨™+_9·ÀŸåvø ÒöYcÓÔ×ϧéà‹•{=­Þ·Í¾§sLƒÍgÞÊùAã¬Ð“]/ógâ®2“Áî&¼žœø„ñˆÒ“Õ­©Òë¤}K“piÐÃa0ÏY´˜”ä—,LºÀïr'Ô§R3öÛSuK[ÓôRæÞñÖŠ +=¦PD§L*ˆ¦8á§òJÚ¬[­¤)Tb}r£‡\vš²î'—ùë¶NÕ+nÂß—#G=¾¶Í_ÖØ9xêáDÊ=ˆ”&´-¸[IÎk$v G¤e/9• d#‡¸MdDÆ/j²£ú—ר¤5°*á8mÊÈ&;ŽÇ·»ýF%¤ÃªxˆaN_ù[®'¿" …Ðdk[bÚLzN À¦3 |ÎO•ÊõŸ!î5اP¦zbüÚ[Ô&«¤ž–`ï*ÃE™ ƨɔÃÏWÂÙ›J W‹Ç¤¨ÐémŒL9y…nÛ( >·gçÎØÛvMÆšDÍøp3g…³à»UqáÅE®ù –ú¼5GŠJô›Qðs~Šüß"<.ö~<Ø•ÿ‚¢ÔÔgÇw*”ŠÇð9åÕFü ³J8Kå(ÄK…R|ÓÔ¿…ì›…Çãì›gñû(õrÛ!<ÚñX„Çù{•øìgøÍ²oi?ƒ×oá÷&<~†Çy'õ‡¥þÁ'ëáMéYQ¾íÒÀ.ÑU§,ïã²®ð]p¿/Éï"rï!ýŠš^F½Xÿî‡i½”þýÓÆ¼ÌZØjv7ZìßvÅÅ£Š÷•œr¯ò‚ŠWíPWGÕƒêKi³Ó¾“ö_éÖôµéÓ›aÉèÌø‰F¯¹CóCÍÅÌüÌY™ë2ŸÍü K—ÕŸu*[‘Ý™} ûBŽ7çžœŸi3µÚŸæN˽=÷Pî¿å~®‹êÐgé×éi06>4¶Ÿ2©MKLÏæeåùòöæý"?ž_þ_EKYH- “–tÓŸ‚š†lØ4> /FontDescriptor 9310 0 R /CIDToGIDMap /Identity /DW 597 >> endobj 9313 0 obj << /Length 980 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0058> [<0073> <0077> <0069> <0067> <0020> <002D> <0074> <0063> <006C> <0065> <0078> <0061> <006D> <0070> <002E> <0066> <005F> <0072> <0049> <002F> <0075> <006F> <006E> <0064> <0068> <0034> <0079> <0032> <0033> <0037> <0024> <004D> <0076> <0062> <002B> <0035> <005C> <0030> <0043> <004F> <0052> <0045> <0047> <003B> <003A> <0028> <0029> <002C> <0022> <003C> <003E> <004A> <0041> <0056> <004E> <004C> <0055> <0044> <0042> <0050> <0059> <0054> <0048> <0025> <0031> <005B> <003D> <005D> <007A> <002A> <0053> <0057> <006A> <0046> <007B> <007D> <0023> <006B> <0058> <0036> <0039> <0071> <0027> <003F> <0021> <0051> <005A> <004B> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 1500 0 obj << /Type /Font /Subtype /Type0 /BaseFont /Courier10PitchBT-Bold /Encoding /Identity-H /DescendantFonts [9312 0 R] /ToUnicode 9313 0 R>> endobj 9315 0 obj << /Type /FontDescriptor /FontName /QHUNAA+Courier10PitchBT-Italic /Flags 4 /FontBBox [-91 -299 663 858 ] /ItalicAngle 0 /Ascent 858 /Descent -299 /CapHeight 858 /StemV 81 /FontFile2 9316 0 R >> endobj 9316 0 obj << /Length1 6044 /Length 9319 0 R /Filter /FlateDecode >> stream xœ•X TWv~wF?„ Hšèw4’! B$!0à`ìüƒ18&` Øcˆãú/”¤1ÁŽc×óc“ÄÎfsÒ4MÝ­“õi7NÒ´ñiZ×õf³©›nÓf³ÙÍ&›îfÓžÆ ½o$ÀΞ=mÅyš÷žÞÌÜwïw¿û=Bôd)aHYÿ྾6ýÞ31¯ØÚÝ»åÕå¿ÂþÛ8À‰¬§Ø¯ ±àx†Fï½Ìù6޽8>58¼¥»ãr×Q¿Šãæ¡î{w‘b²–Nƒc÷Îî¡­.KÙC8Æõpò: jÖ0a’OˆIàd¹2Zé—^o¶˜¹_²œÏXXh½ùSŸÑÊÃTô±¬Ñ å}6—Ç»É1M»f3qâÝ:üà=ÇÇE*b²ß/ÄÔ«Gÿb‘T”c´ù Yï3;=%ÒL ó†TàqzJ™÷&KQÅnÎÏVŽs—£Ä-Ð’_ì²{ÀŠæ’±ÙYö§ZÁÏCCEA§ã99 :^' ø*‘ÙÿKÆjU^) Tÿ쟕O6“bnt“œÔl1 r¡Ä—„¯¿‚Ö*€Õq‚~žý\SÆ~‡TzB„'Å$Ÿvgö„»Á}p<§ŸŸJoQgÑaÕÓIÑãVªëØM7àÛ»wdÁã§7œJ‰N¾¶õîøyòG‡ö¾~¤)°jèŽÞËëò ÛâÕfç4m;T·¦-|ב]Ì4ësIºGi•³ÐmŠq¯@—ÉÝ›R=¾Î»\Vû"þRŽv­4ÕW%Dê#avVĽÄÓ>òûé.ô2öD §ÎÑê´³p—ªÁ¯Ó/LûEöe4Ý[ßUýÇO™Y(2†êÚ)¹ƒIAv@²v±î®¡xs @îæªÀénû$|áõVn\êCƒW ÕÕ3{3®†GâÝM‰;êĈҞ´;Ðÿ‡•aÍ´9ŸÔàСœåV‡ªÈ’<Ôõèn™C‹MÕ|N¯÷ß.ÆŒWnX*B¼÷@îƒÑ®ÃŸš#w޵Ê<Å2 ~ÿOï´¼Tƒ¶&_0i²ƒ§·l¿t¼UîhÞü$¡zmYçcÃÕ‡ö´ØQ=sÿžgúÊ ŸaÂB¥Ÿ§ºØrXpØ›ZO¾9ÒþÐærh ~߇™0…™àÀAL=¢_µ -ãæp$k|åR.@ÀÏÝüq‘·À-Ì噥 àÎó1f»Ýâsa$—yì®â|å%å‚©Äጹø¦Sá/µNÆ7aÐæ€/˜dA΄”ãñe•~šz=Æž7ËŒcâE5&i>(' ­¯/d;+ZjñÕKŠËáþ©ÑSëËó?‡)TÍ|9ó‡™ð1;ðkeøw"Gƒ ¾ ŒeYÇýkj1Ì À8Ž eYÚM¤~K†RVYn>’ÔDæØÓ Ï)ïª){eR¹®šx3XLâ>!æ+¡ÄÁ‹{’ùȨË˽V)®¹^°¤¹Jtä/iN NšÑ³kQ~R†^è‹2©p Täùýˆ4긺Íló†vçCbèñÍû¯?Ýž97Ðþ½»öƒÃ&¶no9v*¯òôï.{` àYÐòe%wŠl|âíݛߙ„H¤¡‚³£81¡æp¿&hµ½éÙÏ4YšKéèQSdNNsä<äeJÄ~5”Q•;õ¢‡.„}ëŒG:w±®@ò­¸{ï 9káà ŽýÊD¹ 8î°DúÌ{Ê@¢tl  ‘«XÝ.ÉQŸ*\OÀZ¡è£/AßëDž²ÆìŸ({4?`Ï ãÆFbј”‰›)ƒ°Š¨_³.ý‹YŽ0ÉÓrT+_©a‹¿þÕUL«ü}$Ö0ð8¨V~E!´ü#C« é¨%”—™–*X• 7?K˜Ù‡Ñ‚ öYLd4()ͧ˜8¹"“UÔ!2†Ò¿@gN¿Ä~Éþ©ÕŽCõàÑÖ}“7ÿ}ã–Ûýöé6¤Îþãë_{†²ÙóÔàÔòÕSÞº@Q–d‚OŒÔÀ£wŸIüÆ*æùÌ_%·[³o‡D­=ÞºZì6ЬÊʲ:ÒÐTjYíg¯îÛ|²?º~}¯!Û ÷už«¦·3¾í[÷ÔL€ó³¢Ìo$F•ùyá…2n[ÇÆí ³}cG‹íV÷t·¬îa˜•õ¨M~ŽÌqâ£Õæsp®èETŠàn“(|ÅožÀœ¦’¨öý8­ãR0ËXqnÏœB9Úvù|¬³Þ ªŠ©éÝÉÁ“¬þõÖDýáò'ïlFyòÎ=í'Pžë7%ºÎîN [G6Ÿ©AL#>huô¥õœ›«‡&n+óu’† %s\•lÿE+_üˆ¾À8Ñåáá{U´"¾¦Æfóóà‚–ÛHJù¹®2yiAÊ!:² ÑLkÎe}ˆx½ÔËè=}™Nõšž‹ ãGQÅ™"´¢¡º¼ô/(ª´èˆrgÃh¯R§ê´‰7÷uÒªûY(œzÿò'ýðÊŸ]€Wá¬õ™ù<€%¾*¸¹ S¥¤XfY»éüIµÙEB´YšsôD)›p×éÃ=0YÌôÕ²új.Í8ô@¢6-Ãt™ÔW-Ät¿q-¥ †,oYË^lëH‚„ •x>á­®gmÅ.Gžr±>{ÕyÌi‡O¸AÓ‚T%¤&Ùñ™ç£X{uy®"æî›‡çÌIr:¶ 0s’y7X*¹,ó» ¬t}ø.ڤ疖ÈH²¨Ê8´Dâ6pKxT Î4Ï{“ÁÁ„qŠ©EËX|ËÍ«ÑPV›¶Þ)欂¢Ë¯u"‹2¦`8õ]Y¹škpX‚‡U(SFc9½½9«vj MhÉZb£•(­œÒzJæÝ„¢iy´ii4Ó ×@Ö[ :‚ùÖ’0õÃ#R±Íy{°)Ze˜ýž¤T=ÍôõêñPV)ELc¾ylürœ/ké7ˆx¶‡]£ÿðëÀ[ Xø™©þebžˆ·\%î¨×„.,˜™ÞñÔöèÂqþ•KìÑÃb£ [få7‘@Jg?ÒòìYR‰ «¦j’-ÍsÌŠ!}&­(vhTn=;H°ú—ÍSÂ}ž'†,wì³Ù˜K_ÐÛ­\si—»BÆŸØúè9ê† w4³É[j3xCð…"V³’¹”♤; ïU¡”S\Ì…¤C¯+¯²"fĽú/žb¥d4 Êó ú£±ƒ½˜c¹ÙWìÎìD!Ÿué\LH¯ÏÎ ‡™s}挖(õdEnÏ’F—õk®}¶X­͵<Ü*õÀ4óE6®¹˜þ7ÒíÓ39]‹«MHùægöa|6ñ¢›ŸÄ{Øå]ÔªC­U}Ò­Ÿæb0Ý^ÇÖˆm/¶al"¶ÃØöa{Û¶ lÓšk³/c;ŽíŽÛ°™±íÇ6žYCï}[[¶Í5xמyv6ö/âõ¶MØtØÂ¸FÀùëÛ\¤üù걄¼Ïø™Ì«,Ë.c§5VÍ&Í+Ú2í˜ö]±n\wCoÓïÕŸÔšU’5˜õŽ!ßPk8fø(ÛíSwì#k0#æ<ùÍ–Ô–€Æ€}ú¿ÝtˆGé>ƒûa¦¯Áù3})i ÃdÙGöm¤Ÿ Q\QŽê2Nʰ×MFÔïø=†ß»ð»‡ âÚ\»•ôâü^|²{=ø7Ú³ Ÿ2‚m®è&C8·ïÝ‚¹ìÆ¿:¼¯ oQG[ñº¯÷¨ÏM¯¥Öí$}¸²gwâÚmøÄAü•þ2¦>ƒÞCm¦ö¶¨ïÞ‚O]ƒóý¸b×ïù_Wßþ;ýuá·z²Ž„p£ê›·áùT@Ø5 endstream endobj 9319 0 obj 4210 endobj 9317 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /Courier10PitchBT-Italic /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9315 0 R /CIDToGIDMap /Identity /DW 597 >> endobj 9318 0 obj << /Length 616 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0024> [<0020> <002D> <003C> <006C> <0061> <006E> <0067> <003E> <0066> <0069> <0065> <0074> <0079> <0070> <006D> <0072> <0078> <0073> <007A> <0063> <0068> <0075> <006B> <006F> <0064> <002E> <0062> <0076> <0050> <004D> <0054> <0049> <006A> <0077> <002C> <005F> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 1700 0 obj << /Type /Font /Subtype /Type0 /BaseFont /Courier10PitchBT-Italic /Encoding /Identity-H /DescendantFonts [9317 0 R] /ToUnicode 9318 0 R>> endobj 9320 0 obj << /Type /FontDescriptor /FontName /QMUNAA+LiberationSans-Italic /Flags 4 /FontBBox [-664.062500 -303.222656 1360.83984 1014.16015 ] /ItalicAngle 0 /Ascent 905.273437 /Descent -211.914062 /CapHeight 905.273437 /StemV 73.2421875 /FontFile2 9321 0 R >> endobj 9321 0 obj << /Length1 10112 /Length 9324 0 R /Filter /FlateDecode >> stream xœy XSWÖöÞçœ$ jÁp¹B@I€ˆ"÷‹Èý~SPB$’˜EoU«¶U´Õâ¥::–ª­{W[{Q[Z¶_ÿ~í´_;½8íüS;Ó*9|kŸœ í8y~ÏsÈ>ûì½×Úk½ë]kFy¡ÕˆF¨¼:^޼óôl»¥ÃÜÝ~ñ¿­ÏAû&BS_1tmíM…a…¾#tܧ–Âó§ð|¿±Ó¹\ùÕ¤yMc¡f«^÷ñÑ/J aáýúå6TŠàùxf-ºNÃÅýí<_EÈçiD3ûñÃH„hHƒÂqÿ;~µSS¼D”˜¡(Ê›b>EF+ÐòQXE7JÌ®ÎE±£#¢ë\=ÖH2ð©„Ï}ò„˜TQ?‘†â`ÄZ´‡ig†!i2À8`-ýùÈz5û >¸‡ÛÎ=²T'«âE—‰U4Xƒe˜æ>]¾„(¤½É(™2”ˆòAÓHE´V+KÄrÒŠÖ¦DiS’£ÑòH‰X¢HѦhƒü%´8À_¨•ˆièç¯ qP F­…!Zzóô8,×44ön©oÄxÃ:ù•'%/X–ž1íTÜë+C½´È§2D69÷Ù Ës󢢂0V'”êÊÊ4j¿ Š¨Ò¬¾DMMõÚZˆh]øü¸Óãê¶çåàòв›¸ 1E{Ùü(9COñ ›¡L/QÅOÉË-…=G‚­™RF•’=ÐriŠVã- QT{¡®ôNÁ§z[tK‡Hý‡&øHèªÚ*ç@q!è£Ö7dÁ-ºC®ƒtõ‚M>9y1å \X´)[ïr€®žÑ$%Ê;³ ° ±oFÁI¼]R4D /Y#JÄØ?(†COr’`dÒ»•;žr(òâ¶²26’ÊT%¦¦—ìn^ˆ££²³4­î®© ¦$S¦ˆž’†?‘гŠÛ›œÔ¾¸±^•m—–ÆÕL߇‹ žhT( ú߯{|O»A0kÖ¼û ò½«¶¼ùâÅtøŠŒlŒ+Ê6mÜÙS]V±fú%²´É'dÍd}¾g7¶bËnÁØyîè·Œv€ba’¿[{…X<¶] åÞUÀ]x¤0ê˜ØÂb³yó›KìtAþªžç¯Y­/á *ª¨ÌÑä«ÂB3³m+ç̈Ãñª€… ¿ýêÙ¦ùÀbÍñ¡;Ò­UjËÂq[bÕ•+»[!|æ:Üß“žˆ.¥¾í‘~~¤~~í ÛLmXèÄMb GÈôºµ°² _¥z(ár©V&1Eà[øêÈÍyâbˆÇç¹÷û+( ðD^ÞI ôã(EmWm}ÈÒg=dXXTØÞ]0羪ªrÓ†¢¹}§<£êB—R+zÔE± ½þ€ëw‚´+•85ݶF£hR¤k=àz‚xïnF’@ "ƒÇpDäp$Wvmøºˆ=vìö§Lê·`W¢Ñoé˜b”ìæø¢Q@?øÔ}÷kØ yˆt»ØsÑö¬úúD»1f[ßµ X]£9¼:+[&ÇNÇqkÜ¡ ´ŒöUÙy8À?VñP_vÖý÷ãôƒ¹f§öÎlTÄ’ÄÔœ>#&)66&%iîÃe£ÁåòH¬ˆ-˜¤Œ™®)x€úbâùöÕ&r[žúCœÊTSf>%O‚µê 3ÿD ‹ñAævŠ;K®¶Ãû{§<ÛÛÒÂBó—ùx{Ñ5U5Ž…Å}Lªkecúï[Z~G-9¾pㄼœXç %$‡Í™j+ñFDtxC†´ kŒjä.’ÈS<¢É>‚îMA_ ds¬§¤,‚öò‚3¾“|®ö&d”{ObÊ<ŒCØ(:/Ÿžœ—[Äü…kŒo:zðÞ,„Q âkž…P”ZDÉÄî‚EȲ’è±`÷Åï_©\Á½øj‡㢹˗>ý¤^çsRœ’2¿·¬ Â{Å—‰Ülé|óÂñ§ª+këvë’“róv lã~ûŒ>µÄWPwIÐdˆ,ZFËû óaÍD»úÿz•®øßÏÕM 枦îkǃ\›¨ÿvóÿ¦Íˆs¤bAãLà©‹°Ê$X`À"Ī˜¾áúKôôöû#ìú÷=óÒS-#•¢þ;ÙgÒ‡n÷/‘ùëaþDžU˜ @?·—d˜–©=§S_á™Ïžê0¾úú-a¿dúúÎÊòÞ¾Ïþ&êLJsŸÜ=®|¥¦Ž@jÃú“?^|Ëbž×tHkËÉih<ðĵ‹gQáðKËè·bò¥¼,øâë$V-åÄGS€¿§B"~¤‡pÀÄ‹¿ôò·Üÿì݇ñbÓ™W¾¼øàÖ¢ŋÞycËæÒ³E´kï>î'î‡óošã}{qàwo_°˜÷à†Æ“'O¿×i©¯=qìü»V+`8„«ÃçW*0._ÓŒq `Y6,s]˜Y¤aS#Âýþ<ü6¿€0ñÏÚɽ¦OobßÉÚ—“'ðÀg_„ÇUÒòq•6&«â¾»…ôé±*ûY8€KCéþq…ô¸2[t™ë5´&o!Dÿ Ê!¹Ë Ýa™dbõ¥ëí`ÚwªkÕ¼‰Ž~pÓÈÿyhµk ëA+òàç+•SR_é”(ºÞuöÝâ]»p¬M¹fr+¹±?Š8 «?&ÃO,zøƒ½Ôá·¸kçß’¯§ò®ŠúGØŸ¦?%•á,®JpËsúÒš)~¾4%º@eãwO|°k÷9×€G¨·ñ:<û/n·…»Â]¾R*`zºÁŸÄÀ3^Ÿqã†`Ï:X‘ÄvOˇß{Ü­£s‰½ž½ŒMÿíúWà¿÷pD—GŸÅù\¼ëQ˜Ýy?ìÀG)/0 B²i`ªLÜ{Qâð©S¹g®6Š‘TâÚ×âÄ,^ÿ õÒÍmª+SöÖYêÏ®`sU9]kB¶¥ß{L šÊ¤"m”†–I’ÃqÇUîQ9î>r ׇïfTŸ qg*9eo1µ€sñVÊ//¾Â gH’¼ƒü=G ¸tª6/·¸°¬dîœ,¨üCCpzæ"KEeÔPòª•¯œvØ a·¯ì˜×¤¤> ëk**LKU'Ä+•J:cv©.# ª¥QOÎoÀX×:¸¸¥µ¡qMsIiÁnâ Â2¾°_4ÉAQ9ÂúŠÜY±L†e¬_R”ŒæY”çPX™»ºb9w|SiÉà ÷­ë8nÂÅXÏÝâNׯƶk­ºòÊn;jmÃ÷YjPeu×¶%ôtL½Œ¹—µhîC‹fi1Ž€ÓÉ×îÓ·|ê¤Îísåù‹>½ÍÜUµG‚vÂÙ¼O9Ç}GR¼[ƒ†³Ç³ŸÜO–,óӸɍ3;_Gwà£T WƒmÇǸšíŸò€ÉÅdƒ')Ù#Ï¥5~àüèn`†EÀ¨)x-î-¯ØÍ‚½tOÜÓëº!êwÍÆÚ¥Y™ ýG\=õhu ÑÈ”(°?ü5wîë`®^ÒÕÿóÖ~²ÏzÙ"ŒÔj°\+ÃO…³¿Ær[¹ú~±£ÿ'>N_=›ø|ÊWÇ$°éy·ÎÞâBÙ áÌwB˜/ÉÈÔÑ›¢,À”Ö]ã»ë>µ;1x®d Q™‡ÈÌøÊìŸ2ÞÞ¸9òdHsós7 m‡†Í)zª¦nz~ü1,¹±aü¸¬¶îaî<-xvê‰×ëjâ•xÏ cýsQý©³qNÖÆÜØYD¢J“P0§õ´©£¤ôIˆñ·éQÑ¡á*m¢fÎ\ÓÏâ?C,ò•­”ð,Üwb_åvÀzñ»ïŽì|÷]ä®ÄC`…©|µ®²”ÓÑ þèGâ¢W†™¿ ßÖ”ìú¿=/J"½OA‘póŒ$ØHÅbÄ}OxÁyfþH =:’Ö·zÄ ,¯8ò>}‰ÇO&áO â±ᛉýÎý@] ‡äBì;Ú2*¦oVñØL–`öÜ.)™ïƒ½ßó°!_h0uଃ[ýVS ¸²¨¹ô,×êàÈa/¢K0žTR¾>¢e¤²qõ¹pß9À´“u¾Ä}Gmu9]ǨRÓàÑ;Pã’Ø ç_þœM@Ág¥UûÛÚƒÎÒLÙY{¹ÃñŸ^‹[b÷on>)[šž‹ ž •ƒ#ÑŸvZ<š˜Üšh¯PUð7ìœ 9Ò@‡‡|¶^ 6äÒöpƒû{©`VÏ ”‚wqÎ'Îà¢ÞO îÃ¥©\ó'ÛÞ,÷•%kðÆç‹'1¾ áaøKtž¢¾Ø3Ò~è<û²ÃNÏÙñø{rG~>ý"È1@-ò'À3œœEÿýîžY%†tW!ü·ÁÔ—Ü»GšŒç_ýéㇶÎ|-º¥uàÕ‡·—”âeK?ÜÜÛÛ¬áæ³TmÛÖ½üqðÏo¾a^„kj¥Øgϵõ{÷_ý£Ý‰c¥ÜÎo¹û¤²4!vsHN "]ËH¡ U µí›õ¼$^»ÎôÃuûðêÒ£g‡RŽ>éW,¿6#3-šœnÐn*.Å?J·<Â}¿y ,‰¶þ ~S´5 )QªsçÕ¨±Ó…û$—ì¶€Äs¤ðû†ÿÓ‘øÉÃÌÁßßùcO^nHˆvfAQêܼxecýZœ7=.‚ ½53µááÝôÁ;FÔ?±¼bçb{WU DuÕc;ÚVTˆÍlvÞ"sÉ9Œór×­k9¹šÿhX:Š»‹!çC&•ÂAJ|úX¹lZÃô×Ù)2w{cï£ ‹KH•¿²h'åø³˜pÉÇgÕ¤qßeq%Ô™7–u…³ñêÙ³W'¨'==I™’´Á¯ „2˱e~SÔáÌMßP¼®íj3 ¶æÎIÔDEGjgå–§§&¨JÓ¦Çh³téis ºcÎ/l¾½èÒ%‚–·é·ðkî,…åØõ[3_€®—I~M†îí„Ó£å¸uæ+Z‰aÉPÂÑÚd¬¥åùª×Sþj…L½z¶Ë¹;pgZ궇~úÀÑ…›æ=Ó”¨ÆkלZ_RˆqVN߆¢âüÜMƒµuE…ëšæ—”‰vÎoÞ³U×ÈD–”u¾×½ÂÐöì.c‡‚‰*-2>chsíš;gƒnfJn^¯15íA\U½kIF6®«°fòß¶ÖàÆ@ߨý†þ|$ŒþœnàÐÀ•<󀍸‚?Ëd$‘/=ɸûÿÑè—Ié}e˜á¾h°Ôq;k,5—þT6‚§4ZðâKÃuWV^TFwq™9#~ŒÜf¼ÄìnqF3÷^KAlï‰à’[ ޽ÁÅÄœÁ[é[·ûÀYÊãê¡j(Eá(響ŒñŸÝ_%þóocü|Åǃ¦7\Ë2EUÿîóXrv–OÙGwRðóÛÿÅ2DþŸnͬÖ-¼/íGòŸ6¿þGN,ÀÉ—aœx¬æH2¸2”;aõèj8›_iü¿2˜šþ9†Öâ HÆ8 îH¸Ò¿¹ð¾™A£[ÇèxÎ'7ôåSCÈ$B‘ü<0<“yup‡Ás®¨nôqÑ”In˜úlÂóñ,dÅFCxYhôÌmÕ¡“ÔÐè,X»ÆF¸vxŸ roÁ»LjÖèxW z­ž?‚»žù½Ï©äè“ sà%ë½/ȾCÆK¶¢“ ×}»%ah;Œ‚±ûñèmøM!ë¯úKÉùÃycz+qQžÆŸS³©^ê u›ö¢›i}‰þž¹Ÿée†™™ˆ¢Eù¢ÑÑuq 8]lo¿"þHü…„‘¨$’’ë’Ï$õòòR{x5y-ñzÛëo_o™·Ò;ß[ç½Ùû°÷GÂ'”M¸>áŸdŸ\Ÿ'}Îøü}¢Ïļ÷ P=©PÜÞý§áØ2Ö_‡NmŒîÃQB›Bbœ+´!ÛàÕB›Aø’СɘÚböp·%h/´½?ýÐöF“™0¡=›$Ý|P¨×ï„öD¤òŽÚ“P²÷KB{2š6!4Á œ[Ñ1^+ÒÆ°‘ЦÐDœ,´i”„‹„6ƒ *Ú"Š?Úb4š$´%èU.´½P ýªÐöF¡ô¨Ðž@]câ„¶šéµHhODM^¯ íIh‘w™ÐžŒ’¼ÿ YÚ„:àv½PbáÖÁ³ZzdE6Ôìü(#ô²(zcáWP"Ü,xÓ W2Ã|åBÛ³È_¿®Yà„8óÛ«©¡U%h1—Ÿ­B˜¯'gÌÞý/¨­ä„ endstream endobj 9324 0 obj 6821 endobj 9322 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /LiberationSans-Italic /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9320 0 R /CIDToGIDMap /Identity /W [0 [744 276 579 220 552 552 552 579 552 276 496 552 552 552 276 330 826 220 496 330 552 552 496 662 716 716 496 496 716 716 772 220 552 496 330 662 330 276 496 716 552 552 662 276 276 579 662 276 276 606 662 276 826 552 552 662 716 496 662 936 772 716 882 276 552 189 552 579 552 276 552 ] ] >> endobj 9323 0 obj << /Length 854 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0046> [<0020> <003C> <006C> <0061> <006E> <0067> <003E> <006F> <0074> <0079> <0070> <0065> <0064> <0066> <002D> <006D> <0069> <0073> <0072> <0075> <0062> <0063> <0041> <004E> <0044> <0078> <0076> <0052> <0043> <004F> <006A> <0068> <007A> <0028> <0056> <0029> <002E> <006B> <0077> <0031> <0032> <0042> <002F> <0049> <002B> <0050> <005B> <005D> <0054> <0053> <003A> <004D> <004C> <005F> <0059> <0048> <004A> <0045> <0057> <0047> <0055> <0025> <002C> <003F> <0027> <0038> <003D> <0023> <0021> <0071> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 1701 0 obj << /Type /Font /Subtype /Type0 /BaseFont /LiberationSans-Italic /Encoding /Identity-H /DescendantFonts [9322 0 R] /ToUnicode 9323 0 R>> endobj 9325 0 obj << /Type /FontDescriptor /FontName /QRUNAA+LiberationSans /Flags 4 /FontBBox [-543.945312 -303.222656 1301.75781 979.980468 ] /ItalicAngle 0 /Ascent 905.273437 /Descent -211.914062 /CapHeight 905.273437 /StemV 73.2421875 /FontFile2 9326 0 R >> endobj 9326 0 obj << /Length1 12500 /Length 9329 0 R /Filter /FlateDecode >> stream xœz|G÷¾Ý•dc[زiɽ[– îÆ½wSeK¶…‹Œ$0v(nôBÇ´J8B1%B ¤P’Kî’Âå(—v$—€µþÞì®ÁÉåòý¾OËZ³³ofÞ¼ù¿ÿ{3‚Š¢l¨Š¡¨üâÐpjÿ;DZfÞ3ëÛjï:f7`ùE©¶Ô뵺ںL Eyô`]d=V8¬°™€ÏgðÙ«¾É2oÛžéø|“¢ §ÑX£=ráä|¥Ã÷¯7içµPuT#Eyûá³²YÛ¤ÿǃ¥·ñ9ƒ¢†­¤öiXGI(J²M¢ÆÆßÌ{T-=ÂFB“²4ù°7)»jÞö¢Â› K*N¡)å@¿ä:WjY<›IÁ¹ÏÿCQlŒ¤“ŒFQ4uûÇg†’Q”³J®r–«äWXýÃí9ÌIçƒEÍC7ö6Ô´»ì/’MTê!•IU,åêæªvŠÔDøú ½4>Q‘Þán®n2òˆ² |øÍÅþ›·rw­Ö¢—ÆêúNÕêÆ+££ó f,­S«Vý]Ç"õeYù¶C•žI‰“cc4jo7,~}V@wGL$%<‘à>Æe„›—WhP|\Áñj-dfUµ¨Ã¢&“‚ÆŽ tt”»¸uˆŽÁ¹—ãŒF²y”+5ç„:ªÃ£"£Üho_¹Y¹‚ÌÇÓC&•KnÎÆ9éi£wVsÏþ0áÂùwàÆËŽK»sr¥ðŸÓ:}hHf07k×À°Ç¿`=?rÅ¡‚¼òÊ-h¿ò{ÌÛ8šJË•Œ…ÆñÍuˆÅÀ95eÅ̤DÇŠ–Ùùzî¼yónîontÉ!:Ú°61‰öø{]=h"í{§M[·\@Ž¡´l³C•&`ú qüÀ÷t€$ˆR žpÜS£ŽR+Ô O¹0Y: rÚßôhæ½ùæèQ ^©6#¢ßïþñÇnkiÞx¥…6ZŽÚN’\ñ¡Q+¹Z¾¼¯¯O¢<|øÁM6æáE”*EKºã܆Sî(Oˤ¾R_g'†€ ¨ öeÝaþ‚oÿÕÖpë?sçœMNíÝ99ÒÓ6îIO£Çq_¯\°~ÈéPX¶‚ûòó:ÔÕúѬÆú:œÓ2Dÿ·‚Urw`rO|P 0SGFEªqd…œ‰V(BB+º³²û¤‡hÀ‹™T\Ð~¬¸ˆ>2+.fÌ(€ŠªÖÕLñÙ‰«Û÷ü–ЊÊËÖP)zà.s‚ͦbÈzá2áŒ|yÄã$4d\ìQö¨G`ljºýìÌ ³åÝw›U»\33:–%%@`°¶³71ÙÛ ¡þc õîO;%¦4µÇÄÂÈ‘¡![Ö$Æûx¹8Cà¶¢bHM^=¾ÜÏ?  $Áßo´‡Ÿ¯÷Ĩ‚ y9°Ò%Ã×¼}²BÝÇ)Þ^ã”^>HW¨¹-EÉ– OEy2¼OP;»º¡eœÉ7ª jÉ7_ß2zĈ¯9í%k°ÏHåøŸOþ¥²#wÛKÌ¢â-yyý:IgçÁcMÝL}ÿSÛàiÊJg^$#Å?óyö Ôˆ‹³çc`}íÀ]Énä _Ä =„ ˆ'ÉDGÓ¨4*¹T´¬O¼t rגּàDœ¡¡÷§ŽÎåËþ½bÞÜln ]:{Ï3goìÞS\F_‚ò3§!¿à¹ÈÖ‰QOmä~â~Ú¶= ƒÛÍ6OJ€Êòûˆfu÷$m¨ñ6Ô™ÆA•΃þ†Ëæ4D-fä®n€åK¿ßM½å;v¾ûá¶ÞÂb8qRnnÙœ~<¼¡™}°i ÷ëïÝ Þy'§Ï¨¬Ø·÷K(<÷ TTŽ{")‘ÐI/Ct*ˆ=À¨à§®¯‘’81ªÎÓÇ+nvL,oZñ’×JµÚnŸÝÌê­—Ñ›"'ëѪöÔ({¨423‹h¢}}¼±HÌ)Ñ—–mï½lýÞ‡Ú ¯ƒ5Or?p?@̶Ö9 ôµ÷>S^.é„c}Üq®X¦¦t."z.F.ºËÆðÖ‘óxåQKèâæ‰üøöM¥‘CŒÂ%4¤²+›÷"š&¾°xÞ‹…ÅlŒµ¨1&nÔèÊŠ]´¹ÿ¹³¨¢û˜‚ÙÁ¡•—é÷D‹H=Ñ"jÑ_‰ÜþÈ[…©áߊöb¨À £%9^tà˜ììÆ'2&»3Q…ù³÷ædÂ1”hML¦ìˆ‹«¨Ü5Ô›ÍÁÁa᳚&L@7ÛÊ‹”Wî¶®&ÌV†œeFÍ©IhoœiTZ5Џ6™»Ìw„Š'«R_‚òÆ—·~”†¬‹Û`ç3ˆcÓþ¡f^{äD»3Á°øú:…"v”GÚd}P¨Dš6eZeMnNH ¼Ñ‘˜âá9!Ä¥¬tóÁª*)Û ~þUrðš6ã.¤ÀÏlZä QÏ^®YTW\ÉÒ#G……V†N Ú÷påȸ¹Ô*˜0®ÊÃ×ÓUdA×Çvuø—`¼¦"s懥¶OzMʰ¡ù—t5g'Å÷4ÄÅS¦¦l[œ0‰ö°¾}Ææi®R"Ý%q®vÖ…†Àâ¥Üg_TkƒC¦ÏÜú¡N_£¥øpùãÄh*€D;BpSûŠÀB†>¨£ /*i»:£`M{qQ8M÷I3Œ¬ÇÅ-Ýš†ŸÍËcãÔ¯X£h ‡hÛേ·4ޱ1Ðòµ¶ 7?Ôëtz‚8ô6½G"p’Jqðý¦¤óá˜^^O®ŒùYÝ—Š%yÌ §+5ž”$av5‚Љ‡`Ã(~ýi¯£øã#âãô`tDEÕÜ7§Î}ÍUSYq( Fòé‹^Þ‰)E+bcÖ•&'{yqåé:FgãÇ©ÐôtÃX·bY„F;.+Ó&êÙþ7¸‰ÌÅž™Ó#Â@§ÿü3œ\xØŒi¼¤´Èêòˆ(ÌH<Á×׸‹ÈŠP‚Z.)³ ÷á6,áÖNT1졇Ðêì2B*3ÊZ~b÷®ëÓõ'2¯j6ží/AfMIç[\¨`Þã¹{Ú%žø¼ýVôI.?ˆíÊáøÃH½J¡ïƒlpÿz&¼ÿ*³YÒÙËÅmã½(í†qú2 J«55ÿQq7¸OÎC'÷ä%pû·¸'a œáRé Ú›û¬÷­ï“UÄlƒùÛÛ‘ÆÇ®¨(g5­ÿ+×úê·Ã'zúþ|é'Ñÿõ9séó(‹Ë:¢v(¯Æ°"Ñx%{¡Ž;¹û¡|+÷Õ¡[GnEÙÓ8ÀBê~†˜Ñœ¾ðÉ'$b`ö1HmdÔ£ë1! æ.‚çã¥RÔ©³2 ò’ü}!%µÍ’™=ü”ó‚'Î`1yûff¿kAëÒŸ/šSU‘•?)aRZJ¹9)&%¶È"dkO=;#+7m«»%¹8aÞà†KÊ8\´¾ö,))ž·pÅ”¿þÊÜDÙjþ‚[-ìù²'8-Ü¢¢jmõSÅ…É©]­™YöÇÉ4®·ÎÉÎ]»£²BH¸«gž•?HMéÁIô&%šZRp.ñ͇1ßÖêž_ZRæÎލ¨DO E{Fñ+âL¢Œ§\¥Atªdó ™LÅÌ>d­§Ÿ½È­cFÎmŽt‚!{ V1'úsÖ0­²Pgë½,‚ˆ¢{¬;öç!ÎÖƒŸí#.!½z:#&~–¬{Ï’;o´µ?}o]qQQÉʬø„„B•µ{Ìœ#×<ïÜ\ÔQVúŒâ=L¶ö¡EÑ?oå’ª ­â0{‡ÃΘ¾*2 „€ÌIE2{§«çs®ú]x¯»ëUî·º!ùû›s[Áú‰¤Óh¼ rë@¢ WÎ|цçG‰”¤üÞCH†xq™ƒó`è“ < __9ÖÉVsˆýW™TQ¼7ÿ_Öhwÿ_~¨«Õ×à $È¢ýˆ.„…³‡¯†PA.r!¸øØ"=—æz°Zοú5k#óñf'ÿënfjtlZW>l©~ d5ÖCÎ.Fãð7è£/>WRæ@æ:±6±6±FÓ£¨J¦ã,6ðÈteƒ\=xtÉŽèYr_>à°æ¥me%ÿ™Õæs³M°`þ;ím¯çåwugeggw䦦øzÓ7¸.`>¸}Ì ëÖÁ°ªÈ‰Ý]}Ú±ðÈ‘çŸ5ÔUTnÞ^Qå呜(F#I="È‘Ì^ƒ¡ˆ=0>|ˆÑWqë¹ÌsôæuwN™¶ÖýE%;¸X¸²¹¸ˆÎ´ž”tÎjxe笆±Ö=Ì=ܸZAˆÒT®²'ÎÜ‘? szÈ(Œ“@IÎÈ¿Q$xÎ_ðïûmí­s~m{rrúÓÒ³ +cÏ®¬Lú5n×Ë/#-ë`Ö‰ã'OqÛ`n?—.åÞá> Ç;k×àZîĺ?Îg”°û";M²K\Và=™”þä¹Î®Éé窵/Ÿm0¼’‘Õ½Ä%!a^릳íù=Ô×¾ÉèúŸüËü‰Éã!Ø[ ÈWCòN¶‚«ä ®Ó#9ùuX ®sãèat½u ý)½Ïúío­¶º‹íÙ>l/ÌYT úÝW¸±ìöÖÃ1ì­^~Q‚R¾h« %B>Èÿñ’8>J=†$¸§S°¾®n~þÓ 2=<áyPŒPŽ÷õñ÷óõïî2ròW®**~jTwçGŸw,²®»ÀÚäÄÄ…©Sb51Uרýý”ãÝǺõôŒ3%'ONo³£a–¡áaü[oíX´A?'´£" €J`ÑÇ—]»Çºðé‹tÂßéHëÛÑúhÇãîc —Ó‘Óö‡±Å]\¼—VNìA Ü££…Ý€‚ô²}'gp‘Ü| Äw:ªMgw[‹¶â÷[ô®§¸ 8ø¤gr%px=æJÖ‰%ÃÉÚˆ~Õ‘ó$’CŸÑì³/hôWà~-ãB%ÓËïH¦À»t>ÝBtpÆõ˜÷áÝÝ»ÉL1f³I2Á,C²?ÌñÆÈŒ·ÊYÍ[õ*g¦#XîVEs·±¤¹ä­/òúaDes4T4W\·&À¬a=Eg0ÑV-½ ¥Uô1Ú*Fqo7‰›Œa|£¼£$ŒÞ›`î/µnêm=Ëý3†Ù/c«êz2d=@eü’¹¤üÑVWqï)œäŽNråBî§qny_\ܼ¼°øT÷±Âánæ•¶+¥^^õì>Ôá÷:qׄi…·BdO t:»ø>1½â“ƒ “3—-$;©…\½G!œþaz+ _S«Î9SV 奯9[UE»€ê·.¿wû.w—»óÏÛ×/s ¾ì±Ÿ@¡ÂG¼sÉ ‘`/§«¦ž>rº¢¼¼òe¾'î³[ß¼ýþ킸ÝþçûWný“û’`¸ž¹Já”<Ñdv«§°êôàiÁ“øÎ–¬ÙÑ"ŽPÇŒèÿös›½e½¿Óúnlq¹¨ÌûÒ$«‘!]0†GR“çÏ$ äÝ›¸C¹¡/Àç·gàQ Ò‚›X!ý °hGo~Anö½¹9c·3ÛvôëïÊÍüÂ;ñEÎAöxûN™êëþ>S+üýàá÷àíS5+Àßoj9ÖûÈl™Ýrã«ÙF“Å:›ÿõfuËì[æXÌŸ~6ÛØï}¬(ò Žÿ¥¨¸¤èíþ|Qa~á±çð©m¡§¶±ì!JJQQ (ôLUÿ~æ«m[ÁÍÛ¸éWPʃ+§—áª\€?$AŸß0ËI\T+øT‹ìò¹€¥VÐБ’ÙÔD~žHMî^š0ÕÛ"4‘¾ÞS¸òÜœU`°ÄFK1±Ñs`֪ܜNˆˆläzg¤¤)h×”T-·½A3Q(h±TЙäLòÁdPЇì}ű݃úàŽxznÓ5•呾þUq=˜¥i"Zfc⟒¶¨‡ûLÔ4€^›–¢ Ó’«A×9¹«¸M–˜Xf‘$:ÖÂm^™“GДŽ,R²œò§bpW'!EÑÞ>1á&¤xü¯=ÂQâàòcâ D rHÿh—õìѶì™3 á& B5räÔ)7O›S¦~i<Ñûd↳'‡Näê L]ª OêJ˜¤Ÿu±í^^ÎÒÉ“í¡#Ùó¾ö%Pl™TV’¾©¸('·»uÊÔª«W÷ýøë§Õ _êÆ¶§‡«5U¦®?ßààÈþÆÛ7õo¶cRæ>†ü6Æ\¤;ä½ozÖ—S\›è>\º-œ¦`Nöø"þLå¦áÚµþ×®á®à ÎÀ®àîdÁdzÏr†®.’»˜Ø"É=*”Š¥R‘Y¼xNu“‹?%òg²Øß£ßÆäƒ¿¬ð¹¾'rrbDò/ä,-åÊ&U·öhJš_À˜ÝrmþéÚÚ€#.“â-Çr³ƒGºâ&ÿÆ|Ø £F‡…¯^•›m £G…‡¹~ŒÂ¥Þ­qq¶ð} —GhFµ­²Ü¶»Û6;w—jº&b—èáW¸O§·{š™èï>Ú‡ ²‰©¥×ÄùùňºÏQdIÂ`Fò8ëf‹¬WNáêÀÖƒ4^«¬_ã>*ž>oííÿŠú­7:£+ñƯЫèØ+ðô6LòžÜJä’Áö ¦R n`Ù½w¢ï~ÇÜÁËײe½+î'ó%l²h躒Ղº #_¿xV3÷,"9PSi?¶€ñÅÈ*œ’ ,ÐBÔ#~Åä¤edetV`nhÜ¢NŠïÜeŠŽ¥ýÁÍut08»†¬-îlï$Ÿº1ÀÙ…hÁÇþtÏá7ÑDN”#Ê…k½BH¹F÷"ˆ~›‹Hˆ 7s†°}0™Å¥GH¾&ç¾È]jgôq'®ý= ®îÜ.8êLn>ΠÌí%®CÏö}ú_G›6q?ù¥&×FÅM+Ý2³fÒ¥5ë²sá?p=÷šÇ¢¨‰à°Ä ÊJß´ZõôîÿçIMé ‚Mgî z®#Þ:\twæ+¦bÃŽÚ°Øa=rŸ?ÚHa´BD)ÖÃæÛ·¹rÙœÎ_Ww'ŒöDZ޹Üéöm4Yy§ÔÜùËJ² {¸¯eÍ(SFÍÌbù}uÔ£ß~"¢„£ u”šÁ]pò­ñüÙU`≸›Ø\8¶´¢dðøqÈ.IÖ«¯_XÉH“µ5-;KË“-æ5K}{->P˜Ÿ–âë 9¹O®íÇ—_&¿óämÜpñÉöD­?xèÈ/ž˜>÷TŸ‚ó÷/¯ (xBˆn¾¡Îß•þ÷Ë›¶CP`åä'&Å×êOì]³º¸àønNº¯b¤¥¶·=ulÕŠìL€Y o½óëùõó ÀÇ»¼¥<8fN?öü7àö[‹ª¦>³ÿ‹Ú„Id4uµ¥¤êwNA Ÿäò`š€Fgôé“û¹<ÙÂ_ºð½‡Á]ñ\!#pÆ­ÏÕ§¡å0Ñ{è6ëRú¦UÉc.°&:‡ô"ÇÕfMpaùrROîÒ_¾øv†cÜOä?¤üþƒù\žl 2'qĶ‘ÅsyTŠ]Ç@Ç%[Â÷4ô£Eá+’2jk¦Êq£PNGSãᵟËð^†uѲՔ-ÖŸ•FSuøMI.Qõô!j~D™ÅR,óíÍTØŽÔ—aýAìköûqÃ[†õ½ØÇiü®Ãz[üÎÃ;ï"^Nh_ciQ¾eÝñy Þ2žäҀ˕bŸ+ø1Iòm¦fŠúà÷N|Â~…·™*Á2KôfS:"ƒºOÁz[l§ÄwÁŒ;Rñ¥«(s ß-ÂÛ–RõØþ ÌÊÄvzú0åAn”Ï ?âí„søûqåuA”OÂú—°<•ï ÇľfñsÁ±ñy=ÞN6ã©=´ u’y²Ãö䣠RÇ©oÁ ñQ«á=ž¤ñ:@¿M?d&0 ˜OY/ÖÀÎcÿ*±•($A’‰NÒ.Y,ySò™4XZ*]#í“þ*K–uÊ6Ë^‘}oãdãgSdÓgó³íÛrÛe¶µ“ØM²«·[f·ÝîÎ0§aã†E+6cØ–ag†]ö“½Â>À>ÏÞdßa¿i¸tø¨áS‡ït°wP9¨Ž:\qøÂáG{ÇXÇ2G½ã\Ç‹Ž;Þsäœv8rzÕé2,-Õ@øV@Þ}ÆAó£úrê± ”#ø‰eš’A†Xf¨Ñ0ˆWe^ËʾËRÊ+–eT;£Ë6” sQ,ÛR̯bÙ ÒOÅò0j¬M‡X¶§BlŠåá”Æv“Xv FÛѨ °M©#¼V¤ 8±L£>Å2CE@XfQfX–Pcá=±,Å2'–eÔ}:P,ÛP~L¯X¶¥Æ2Ÿˆe;ú}vp¬aÔD›ÉbÙžšj³C,§fÙˆe*Âö2æNªo Þí˜;è0Êép},x+©ÊHµPm”‰—ªÇZ%凵þøŽÑ0 o%•ŽRFþÿ£éñ)Ë&lEþjù~T3‚oìøwÞ_8–ŠD=2øöAXÊÄjÈKª¡Î`1´ëuJÖ¢UÖ[ÚL†ºz‹Ò¯Æ_>!l‚2Ýh¬kÔ+SŒ¦£Ik1›C”v)¿— WaZK2³¹;ÎAªqÜ¡:+©b|j¦Ðór Õz¡7e±¶+ˆŽuÔœ³ÛPEúº9Z,$¡t ¾kÆÞ”¸cWþßzO2×è›uz“2Xù_ý¿*VÆËšI†£Ù&à‚%ªLo2Ñð BÂÿ¸ó?èúÏ41 ¨’‹…C¦ÝÄ¥ëŒTíŸ.¨åô<ÍøFÏ?éø^Iߥ(QÌKð-‰Y-ühͼTÉŒ˜#ÖbûŒƒ’5|ßÔBÏF,׋ 4 —ÑÄk ãÛ ÎÍL7ľ³R«´˜´:}“ÖÔ 4ÖþCJ“¾Î`¶èMXihV–†‡( ´}³E©mÖ)K5̯­5ÔèùʽɢEa£¥WÖ“Á¬3ÔÑÌ!„¥?ö­Çø‚z ‰¼ÅæòvÈåÅɳYhRlÑÏÕ+sµ‹ÞL„“QÀ,_XØ$Þ(MøD¬ÍEŒSÏ—µü¢ëøîˆ'7‹-«Ñ·•:°Rl«ÁÓŒ—e…Ù6A"(jù¿f~ÜfC‰e™J^S¢]íï´Pò˪åA"³ ßZxÙ¬oÄ«Mäµ&´£0jµÈ\­<Ö?š;Ê«ݺ֤7ךë”fäA¥Yo2ÔŠ](-õZ !†&½Åd¨Ñ66¶aLjjÁ¦Õ„Z –z2º¶ñPˆ ²F-r°ÒÐÔb2ÎåÕ 6טôúfG«ÓV ì£^kÒÖ — ¡jÌ”¿jDö ñŠ -––˜ÐÐÖÖÖ­Hb5Èa!¨Tèÿ·"-<˜‡”‰‡鳉ü×ù?ÚÒÖ¢Ab2‡Ô[š…ð' ;È“s†0ó chËáÃP‹èû“EÔ+×á¹ßë0T0ŒÔ‡€wÏêd-‹3s”ù-“ɸFJQ H9ÐÃBÂ~o. ølá'næý'„7V¾ÏGÍr™Ahh±˜C̆Æ£©.42¾û?À‰› endstream endobj 9329 0 obj 8774 endobj 9327 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /LiberationSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9325 0 R /CIDToGIDMap /Identity /W [0 [744 662 552 496 276 220 552 552 496 936 276 772 276 716 330 716 552 826 552 552 552 552 552 826 220 662 496 496 552 276 552 662 552 552 552 662 552 552 772 496 276 552 552 716 716 552 662 496 552 496 552 716 552 716 662 606 552 662 276 579 716 330 552 496 662 386 220 276 330 330 189 606 882 579 331 331 662 352 276 552 552 662 579 606 276 579 276 276 330 772 579 276 276 1007 258 465 552 ] ] >> endobj 9328 0 obj << /Length 1036 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0060> [<0053> <0065> <0063> <0074> <0069> <006F> <006E> <0073> <0057> <0049> <0047> <0020> <0043> <0072> <0044> <0075> <006D> <0061> <0070> <0064> <004C> <0067> <004D> <006C> <0045> <0078> <0076> <0031> <002E> <0032> <0056> <0033> <0034> <0035> <0050> <0071> <0036> <004F> <007A> <0066> <0068> <0037> <0048> <0077> <0038> <0042> <006B> <0062> <0079> <0039> <0052> <0030> <0055> <0058> <0054> <003F> <0041> <002F> <002B> <004E> <002D> <0023> <004A> <0059> <002A> <006A> <002C> <0028> <0029> <0027> <0046> <0025> <003E> <007B> <007D> <0026> <0022> <003A> <005F> <0024> <004B> <003C> <005A> <0021> <007E> <003B> <005C> <0060> <0051> <003D> <005B> <005D> <0040> <007C> <005E> <2013> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 9 0 obj << /Type /Font /Subtype /Type0 /BaseFont /LiberationSans /Encoding /Identity-H /DescendantFonts [9327 0 R] /ToUnicode 9328 0 R>> endobj 9330 0 obj << /Type /FontDescriptor /FontName /QWUNAA+Courier10PitchBT-BoldItalic /Flags 4 /FontBBox [-78 -309 664 875 ] /ItalicAngle 0 /Ascent 875 /Descent -309 /CapHeight 875 /StemV 93 /FontFile2 9331 0 R >> endobj 9331 0 obj << /Length1 2468 /Length 9334 0 R /Filter /FlateDecode >> stream xœ…VkpW¾gwµëWüˆ¬•E¶õ\=mÉ’w+ǵ »–•*JZ»ŽäÖ•,YQmÙŽåGB[§®Ë£iÁ1ͣĥ?h~0™2L ôW~4L§ÐL À¦Í0~00 $gW2qËvæÞ½ç»ç{¾sΊ!„#„"ÞìÜ™™è¿|‘ga?>™I¦§U#7Q!˜xªFú#”/£l9™_>(‚埡ìž[˜NV‡jþ‚òŸQÖå“§I=y”*åöùd>ÓvÇ7€²…X'PÚ*•˜múmrœ5m2³¬¦Yòw‰’MP‹¢ÄóZ–£Y Ë+`à³àÌfXÎfÃóœ¤Hf–kæý_›Q©†ÂÓ=HÄš"½ zž­ak$ñ‡eÈ„ÐCIçP+­kÈŽ¯U óRðûß8Vê§Å6îMÀ`ÿOŒNR`mkwÞûGS½Vó¿`]G Æm“Ó§¤C€Î²lCPg=^Œ÷héc ¯ bU‹Ýò-XŽÅk•¯ÙÌÉ€^ËˈäÇ [YV`¥ÊZúíX|÷Íßÿà1KôÑx׃C°o~aé‡gCç_þÂÕÚÕ5qŠW"_ö¿›k=Ë·a­ÇùÌ&P³‰¨ÁÚÐ'Z<€/¾yìÙ¯tf€ç·`~`Œ5Eº‘¥ú2ÑOÁŠ>`€MÈŠ–D!`3˼¡¤U±eZ$-Ëjw‰³Ñ—ßöyðuŸ¿ šgǧÀïÿ RàèúAñ“ÃÔì«— Q½•ô»ºÄëÃëöÝ;5kn¼¢1Ô \ÖëÃýn;û§±¡ž¼¬1Ôol¨Ð¾BN‡ìçdé·ŒDß Qô“çËq Ø0¬8lÝ%¨<¯ìHå<1aÚ˜•³|eS+s œL'_ê¡>rñXú[‹½àˆ­u‡†X¸?c®Vë,z£“5ÒN¡ÅY·óÕ©W³Ý`Ž,Å´6á|rpiÌwwÚÄ.ˆmÝX{|;+ŒŒ„8Æ©p{÷ë“Ô`{v™u ßA¥k•{•†—[2:VnÝR¹zÎåî U|ÞÓßEøÒ`/¶ˆ>`ÃpâSL´l¤Àš)\ÞªÁ˜kÕWF#è³>Å1C#©Ê>ß÷h° ø€A_|kßj³ sèPïã)x±—cÕZõ»:‹+½s‘"1Ì‚Iú*Q+~gö’]¡ÛÊï ¿ ‡?Ö·úfnýÖÎ €•ïd×?|}‚ò¹#þ¶;:Ó;½îc9Øœº>öÍ›«‰‹ù€¯Ýü´vDŸ›òÃZnäé'°µËÕ Œ‹½ïUO5ôþ¿äó’ ÛXÍ@Øÿ‚x†ž-¾GUŠÈl+–ö>µÌˆPÚÂ÷( Ç$Žte ãÞ“8ЏŽ)'ÖÉ/A€×áSÊK­S¿¦ýtA±ZKÁHízûùGE M€©Æõ5å5v”Êk ¿ô¿ª¬Ä?®¬Y"KBd,’3d‰äH–œ$˨áà /®’¤ Ìó8¯à¼ˆsŠÌ¡nu3$øZX"³¸J¡vô'‡V 8–P#Iòˆ…ñì4éÀU;9Œççð}ÿ Š”Áwß«ŠÝ²®ìÝ<™AÍ4¢ó¨›C‹s¸+ï¬(6ä3²Ï²¿1å·§Ñêqij¨1‡úKÿWû³ûòîý½AüŸäÁym¥ñ&ËŠ9Ü#ÿÒíP endstream endobj 9334 0 obj 1820 endobj 9332 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /Courier10PitchBT-BoldItalic /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9330 0 R /CIDToGIDMap /Identity /DW 597 >> endobj 9333 0 obj << /Length 434 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <000A> [<006D> <0061> <0078> <0073> <0069> <007A> <0065> <0070> <006E> <006F> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 2698 0 obj << /Type /Font /Subtype /Type0 /BaseFont /Courier10PitchBT-BoldItalic /Encoding /Identity-H /DescendantFonts [9332 0 R] /ToUnicode 9333 0 R>> endobj 9335 0 obj << /Type /FontDescriptor /FontName /QBVNAA+DejaVuSans /Flags 4 /FontBBox [-1020.50781 -462.890625 1793.45703 1232.42187 ] /ItalicAngle 0 /Ascent 928.222656 /Descent -235.839843 /CapHeight 928.222656 /StemV 43.9453125 /FontFile2 9336 0 R >> endobj 9336 0 obj << /Length1 16132 /Length 9339 0 R /Filter /FlateDecode >> stream xœí;[h$Ùu·õ˜™ÜYïZ›Í:$ع۶ñ Ô´–™d4›°¥VIjO«[î.ivö'[êºÝ]3ÝUªj=üµHL!_ÎBì/„üåwãŸØ!f€7£œsî­WwK«‘4@ºGê[·ÎûuOõ°cìûÍ3Öl/ß~pkÿìü!üìöGÝßa•{°þ1üü^_:®û­Ú±Ò®ßêÃÆõã—þ®¿ ×_éãÃWcþoàúŸàú¥AÐq˜ÁÞƒë —¡s8bWØu¸þ®…ï å¯[ßëOûÍk¬´ðréÙ"c‹wÿ v¿¤>çÿuç^elîú•ùùk ss ÿÁüãï³ÿ9æ_ùàæ/mw-—½ËÄññ•׿Vúó«ÃÒ>`¥ã3|ͱîão/t¿ Z^eì—ÞXúêKotاÑü¯~úï¿}õåŸþWxå&+•@šÅW?f¿üï”®~méËKW¿6ëýÒ·ò½O?~¼øÉÏßYøè“C„>þ@ÿ+B/~¹ôö–î,½ý…ùß¾÷“ë¥?8üdᣟ¿Àð*©Ÿ¿úà/üö+ïü7~ê’ÿX*yÎÕáã/2ö ;þðøÃÅWˆRþ5¿ð/¬{åïKßÁ¸þ%°{• æý_)ýVºÿ§¥Ûz]b×K?Òë9¶Pú™^ϳës¯ëõ¬Wôz‘½4÷^_a|îwõú[šû;½¾Î¾8ŸÈð¹WÿâÆûzý2ûõ»{zýyvýîßêõ[¸ûÀ±´€žx“¸ãºÄ^/ý³^ϱk¥ÿÔëyØ¬× ìõ¹²^/²_ž[×ë+ìµ¹¡^_cå¹?Òëëleî#½þÜWW濤×/³þÊOõúóìõ»¢×KìÚÝûlÄŽXÈ<Öc}3Án°» Ÿ·Ù›ð¾«=€l`bÁOÈ$sØü#Xù_•Éð¬•ÒŠèJ§œ}øí$?×·R®6pÚ^Çh”Ü'㸫‡€·ËÆÑX‡¨IÂpH#T|ø=˜= ëœü¸;t3V FG¡×ëÇâF禸ýæ›wÄÞ‘Xõâ(¥34DÍïT„9ˆBE¢%#îK·Â§PßBTÛÙ> üžXuú' ®É‡ÎîXtúŽß“‘pB)<_ŒÆ{¯#Ü`èx>HVT±M F°­ÛŽ« LÀÁ" å,0»díloƒÍﰷᆠ#/ðÅíÊ·‹¤&ÍâÕ%jʧ±Ž¸„o7ðÁD1Xœ‘ßcðÚ [†·«iì àð‚'%Ñ Éç +‡õãx´²¼ìÑýq% ÆaGvƒ°'+¾„Ûë9 ’Iât:ðƤؕA;XŒÔˉ?¤´wަO˜Ü‘^1Å:Z-$ ̤º?aÉI=²üòë$m8¼gé®bÀUÞjÓ™ÎÙ­ ¼ù™ªÇå׬ÙþÎtöà§UL;…C²õ#Ø ÀŸ% j¶Mô†D-Ë&dêÓ=©õê_{ÝÐ~WÞRÜTŒ©x7H®€¼ïþHg¬âÕXǘ§£À!ÊÒ\ÓŒIŠÉxêÆ¡¢žP@h%»ŠeI ¯b¯œ‹’2yq]úŒH®à8Z?NYЕ˜î$öéÂj 3éF*cÆ«ÊCüªèGŽ™MpgDYã‡a'Ò¸¤AL±¶wcº«xðS8:›; Ù˜¨(›P ô©*ÅÚ2CÚËk”è¢RI;&9ïàzHþT¾æ¹ ¶q‚Fªç2UA”U>(Úž¶jÑû§kXNI;J#:&¹²¨Ë4: { ÏÄ!Ɇ.Uu_k(s]ú< úDK<ˆÑS0‰ÿ0Žº²%êo—$ö´¤+”¶–ΊU†ÌùZ”Y`ºøëlˆ °I®dË×€<ž ’œSm.Æš²†:KœSüÐ)(´ï‡ô™Õ³ø"¦“OVGkT)Xê4\´É‘>[w´y—dtu$ (NÃtGIŠ6us>ÏG]r‚:t"zT3tÅS\’ýåç¬Ñ+œ«ŠSRCŠ» IûDŸ©S"%×dæÎ.A‘Ϥ=fÉfhÏ;¡šóÔ;!ÕY‡êJF7Ù‰ÒˆLòeòôºÎIÒ"át@Z¹„_žq–S½'18ÜKNÛr.ÊTÎÔ'Η=Ê÷ 'ëXçA'ûp×›a1ÉÉξÎä¼ÕéåPE•)FÞïJæd‡ÏÌ”>UxAŸ‘–QR$'I­›U»]: |ò{Þ^³¬Ês–Ëûð¼¹QÕLÎê,Û’LÂÎaö¡Æ(RQD?‚ß=í1ubTñ´ª>ÍJu²V{:Gb}vSKm2‹ø4Y®O®lvúÈÝ«Áž€>®wváj v×È/&ÝÁûeÊÆû°FŠM¶C´üFÚ`i ºÆ«{ßZˆk±÷ˆ‡ÔÚ YÖH{ vëðii8ĨÂÎ\ãzƒaªø5˦ÜA<”EIjÃ~Ƶ(U8&’mÁU èoê»&Ю=”ß þ× -§²\‹¨£2Ò¬‚DuºÂÝøÜ¸6ÙÓ$•´ Òaî+],’@yBIT…Ïmà —MV@N¶†4ȨÏá#×{¥$kj/ã:£RѶTr ýwSÎmÒ¿oAúÛ°c“oL ŸÐMbgƒ( Üœ¬±Cú™d‡&qX%8´"Ú³žF\+ç•*Ù ý†’¯'“,Òž©IB-ïYÑÁS¤ŸE–ªtìh|-ÝQñX#]«ÚÖŠ¦Š{õœu«¤#zöÀÕÒ1e’íŠZ Ÿî“ü™Ê¦þ]ÍÙ,ó~C{7‘Ç&Îö «Ü§\´Ê$_·ÓY§üÝҒ烙ՀŸÍT²¢}“¤¶Â&§ hƒ^Nr—lÍ™šá!ONõ*™q=ÿ©ÓeϬ_¤y/̃&;¯§7â3çAâσø™æAÅN¾““)›u$g› Îš°ðç6WSs%þÿs¥Ü\)›0üßœ+ñ ûüæJ|ÆÓÚ‹0Wâ3çJ™FÏf®ÄO™<›¹gO:WÊþêt™s¥,ߊs¥“Nß“§Kêù\u/Út‰³âtiötãÙL—ø)Ö9 ¾ØS&N16ÝÍ<û)§L|bÊ”=ë>Ë)ÿÌ)“xfS&þS&ñÔ¦Lœl° T¿NÒ*k›pÿÙÍŽøLŸ?¯ÙŸš‰ç6;â'ÎŽ²ÐÓŸñ'˜F÷éÎŽ’Êzò‰2=ñáç˜øä§4—9ñášøL?³oâÃsŸÓæ—1¡‰§è¿Ë²I'>xUal¾ …_UÃ/»¥ß7")Åž7+â _l«ˆÁѨ o8 ÂXº¢Ca†r_ ,áA_¤«/ÒåÙpžqß•¡#”hé·ñø­S_|ú{{gþÊŸ˜àìEÜqè¸rè„DФÂù¶ ‡^D_šó"Ñ—¡^½ÐñAutµ ,ö¤!â@8þ‘É0„`/‹y`Gt@hq_&vêt‚áÀ îu°²ô#°^™LR¾ Ä\áDQÐñàÇÝ 3J?vb”§ë ÀI7"!ˆvÐÀüå›$I(GaàŽ;’ȸ(æíc‰2ð‚nî Æ.JràÅý`ƒ0CO3B¡2%Gêb(QkNõy.¡ˆ$ø =U«?Á…²#4tÌ•éˆÑAk ÝЇ>0”„è" ÷ÊNŒ;¨_7@°¡BÀw=Ô#ZáÜrÎ^°/IE$@~ƒ"µ‹^e î‰¨ï |Oj«%NAÏÀ‡¸Å0åLµE|4’]U”PÅ»Cç²Ð]¯ëa 9ƒB@Ôq]Ò\™Ô A®ñÀ 92reäõ|£§r0B‰#‘'šä„$90 ƒ9ƒÙ4N"GF ÄóGÂË…9GuB‰_Ë'X\DhHôK’bN†„t„n$Êi–‘wrƒ—1mËd2ðL]çËž„LBªcðÚd?ðRÁäa #œÑÒËÙH¼¡tʸà™SúN,úN¥_° F]Ý®û®8•“pJÃÓ¼Ìjr:ɬ+ àÈé$®Ú£%KYtê¨ê–ØxªôRù€è†“H•^w_BŒ°”!°˜xe:Ã@y"rÀ °0‹ j¥3´(³P<9 G¡(¡C1ÎvCï›úõ1EˆLä’%(£œRÞ¾U6ijŒ$ñünµêd¾N¼’´ ±èq7ˆyö*‚sê¸.Ü:õ¿<\NÄU$ÎÓñ¬çìƒøt¤‹|‡(EÉ™1£AÍ~‘^I$½1z%®üðÔz%®öB½¿Ä^‰g½’8g¯Ä }Á9z%~R¯$ÎÞ+ñ\¯”OßB»ç9‰Ëj—¸n—Ä…Ú%^—ž/»eâ~ .Ü2ñKm™¸n™Äù[&>Ù2‰ó´L|fË$ž¤eâ¶¹»õõ&Šmnž«;â™æéŽxÒ‰‹tG<߉suG|fw$.Òa°%m|ø‰x‚ƇŸÞøˆ34>œŸbïðÙ MœÀ¿KM¯ÀGå"ÿgp™ævàg™fg.ýU¯B_Á^ñ¯…§ÿÃåï‘·ìA±:¬Œú£e]1Ïó9ÿ b±• endstream endobj 9339 0 obj 4256 endobj 9337 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /DejaVuSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9335 0 R /CIDToGIDMap /Identity /W [0 [595 831 831 ] ] >> endobj 9338 0 obj << /Length 378 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0002> [<2191> <2193> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 4049 0 obj << /Type /Font /Subtype /Type0 /BaseFont /DejaVuSans /Encoding /Identity-H /DescendantFonts [9337 0 R] /ToUnicode 9338 0 R>> endobj 9340 0 obj << /Type /FontDescriptor /FontName /QGVNAA+Courier10PitchBT-Roman /Flags 4 /FontBBox [-44 -299 663 858 ] /ItalicAngle 0 /Ascent 858 /Descent -299 /CapHeight 858 /StemV 81 /FontFile2 9341 0 R >> endobj 9341 0 obj << /Length1 16812 /Length 9344 0 R /Filter /FlateDecode >> stream xœ¥{ xå™ÿ¼3#ɲeɺ%ëK²,ë¶âC¾ÄŽÄv“ÃÎi'19'˜@C &¤!„”(„4M)„”f)–mYŽÒôø³”MY¶KYÊB¡KZJiéA©=Þ÷›‘xžÿöYçù¢™oF3ß÷~ïñû½ï' (ŠRPõMUnÙ>¹ù›ÿd;ö\GQ5ÿ5²ixã†_µ¿CQµ«±/=‚‡Øj<ÿž{GÆö\ó«}u9<’¢àKÛwlþð›tœ¢rxý_Ɔ¯ÙIm£ÖPT½ÏÝWmrž©<ƒçUxÿ ¨M³{½ÌAá32Þ/7œ)Júy¹B›L§Ó™¸É¬õð¹YnÊpñ ^ñðZ?þñrr‹?ÀËxÉdþ ¸ ® z (ì$tÖHçU•ëwBiq:à@a7TV˜ [9Ùºôö6‡ýîˆÄŒ–£à¶Ó®pÀ §3«ê8¸æaÈ»èv/ú¦®ŠBS\ЙÚÄÛpðÔªÙß²›ÙïP <áRi–Ù`4’)àhZÊlÊÄÓ™t:å÷äøÇ{pØ-gÂY0“Â>pÅ{èíÐYº¸´ÿ¿[N¯Ëd hsuÕ4vy î\•ÌÆÚ›zËŠ_„Ò ?£š’Ö½áàób^{.èòµl¨…¥ÐæóP¸–MÂNvŠ9Eé©ZŠò‘÷¦DišðÏLÆZ“)']D–¹"•äq 8öx"/oi%ôÉöñ¾òò¾ñöÖñ¾ €h߸pSÝ#Û‡Øß °øàC럽%{O^¨4™•…¹E€‹ðÝp°óxEßݽQ¼Ô»»©}ÏŠ°°޵w4ì}`óèù­G†ƒ­8¡¿}à µi8v¸öL„9@Qf;ŽW$JYp ÷Ãèભ4½uÕà(,8¾¿g`ÝòîašÞÿ¹à×ìÒì1V.»›ÒR” òR€\!ŠÑJ€°ÝYf˜¹%p:Ël²Å:½ÃÝ‘Ÿ1é]0.÷ìog_c_fî£Rx¢7¡ò¥3zYfž“Õ”a<óÈ C.£B+8ñŠx{†šR…˹²¢7#ApÛ…+ƒ™œ#xözu°œ/S|˜w5,ŠD„;‚•ï…Ëu0-d£!—Ÿþ-pe¯#qÑÀÌœ…Ó‘0Ç ô´+rÝ\ÆÁLo§[)d ý(Ó+$z…JŽhø·fÿ›µ2OPh›( 41¢/D™çô‰'*T'ˆê3¯â¢² øDÚdD{üIËäæG¡ÃÝzöК/nHà ?X¼gYÙ²®Dçd6è·ë¼®&£Ó¬/, æúÒko_{åÅf×.úº«G¾R¦Ñ–XL8§öáÊ„»ÇžUš+ƒµµÅCQ $âA¥)RéÔ(³Å[jÝÙ%-ýÐÖù]z€P-ã,zœå²!Ô­ Ê‚8-7‘Ðr£ä|pာ!™lÒ/.£\N_pÚ…×z`ÅóÂK½=LA¨ ü>¥#u|™Q®09>lT¥…^¢µ}æ@ ñ)¼‡Öh(´'þ”C£áp‡Ð6¡mƨ2‚8Ÿh|Æyɉ2Í x†Âˆ}’/ $aÞ†ùy»f¥².ÛsW5»{Í©ÉæÜÄ©µë×vW”ûbÛwùQ6haiãöî0@y÷X}ÓXw(Ô=–¢_Å‘¶Ûw4LœÚøµ½9hj›\º{ j #®x–vd÷Ñ¿@Áæ·v†BK·Ö×v‡ˆ¯Yz2Î<о&€jã_ y#û ÿÃŽÃâÃÏí|öH{û‘g'÷>wxñÌŸ»oX¯¹¡»ë†µ €ÄÚàÅ-Ü´ ã¦GF¶~ûƶ¶¿ýA|ÍÎŽkS©µ:º¬Ž£®Žáªîb£"D¢ù÷$Lé9߻л%´ü‚•¦åëÿa…=Z0j\V-Œ¬½æ_Wg~¹ /á›é]Fß&.õQ8µk@oÑ‚¦Ôc¨j£abâ\°5àùÅÆqŽãÚÌ ”„Ö`N€¥À€•&j¤=-p´þyG+†¼tåc0ŠáÃH<•ÿzš\0™˜Wz'[¡²J©„¾µÍÇz"_¨^`¬Î/wã€+Í& Ð …åþЏÁœYí`ô±­1ò†Þ6)èˆÙíAÀ…ó‡¢û÷‡Êy«4“ÁŒB_§¾ZÔ9C~éþÓ× :Á]7@Öý0®ûa”y9µ¥n6%¤áòZ2•9 …p£Á(š‘u½ˆÞ(ª/.M—Šé,,ÎÞד­K<ùLÿáõ ŸÓ^×Þ—Þ½óÚ=»¾ùD¦îÙüÏK¡jøÚæÁ­pöÌØÚÆöÇþØy°–Å­eå®vîbXWôÆ{›®žÄ08µo¯õÁÊæ¾QW…z ×%‡8£”¬Ë¼¥ã@9Ñä!í~ÓÛC¿  mÿÈažèЏÆË¦æ zËÔí³?e3ìj©èW¥éÒ¾€?“×v³I2‚L2E\`ÃÃó0›Éj/pxÙ`4‹šë}h²@øêé_¯cC®çZZ§u9½PÓfW)ï„–ëkÖŸ™h¨¼óG_Z»B»o;áÖ”h9gÅtYyÀËó|bÃá^°Å Î=Y *j,>ŸLv1Pª³Ý†ÓÉn¼±£kç5Vƒfhi´gt7ÙRa„ÃÊ¢wÓhŽ^ØÙYö‡ì×ÈŠƒó’NµC[‚¸-½x€sÖ£k#q†#¸»Ä˜HL6o? GcÂS&n©\~7­)í´˜åϾ*/µ´J˜[åò.Î$üs<Š‘÷¾õÏ+­ŽˆÛ"б¹¼A\|¯«¦KKm ³ÐÎôXôó.4»¼ö ×5ý=Xª7“妞Å1—°g(®¯½mÀC"µ<Õ$#Œ•ÀEClv÷[oå²¼jæ«®ˆSƒ¢©ÿ¯ÿªÏ"ØÑÛéuÒ•=ÊLѶhÈÔvkÔFOï‡Òòv`4ŽÒòR|gëì›ì öyªß¹ÐQ'ò*!b‚TÚŸ÷ & <©¹À B ÞÍû«×žšÈe¶Ü¾jõaŸB¥µ[B0»¬Nrñáæ?ýòŠ÷½~øÆ{–Z … yO =>À¢v»®{l÷Ä`e—Ž/ÕPÑSµ2¥µZœ.€¡‡Þžºí¯¯ŸCSd5©T`‡¯Ñém ªå7òó ¥#nçâ&iŒ(©€è_9Ñ®ó’DSJèµ ÑÍx­6Ï»ü½Æ·låò® F·Ý?ÿ¡¼TŽ(ÇñÅÐö—¿î½àÖ#?}wÙþ>„9ô[âvTîÞz[ ëÔ—¤¡­Ô®a¥­·›Ûé3°†V­‚™ßÀ=ÆòîÚ}Íz@Ï4‚ži5za%E˜;2.>¡2spH\)°9nÞÝT3²“PÀÇ–/ÝöZÖ|Gð®#*ôÐ°ß ^›Ý ÖãFðØ²¬õÎÆÆc…S¯7;mu¼êNuúYŽƒ<è߇Füîà 8Ýàr Kó‡µxÔЈW½®FúÆÅ½÷ý÷ɪ<«R+s¡¿¡|(tbD2~Ñ}æ­ƒŒ˜G©›Qúè\<ãgN OÂj j…p™ÐÆ] ›ý<òÿ±±w^¦ÙÓHR—?p®zéÛ0£7ø¼H;mÛÖÓFðyRñ¯}‹÷A[;Ì܇¾yÓìË3'e”ÐH© ËGë#"ãIùÙ‹‹-#{Q‡k+4‚I×i.µ™:ËÈ 4³²ÏaœDD¬{†Ø,ˆ.] ˆò ¸sÔP!7MÂN¥Öì)Íx‘ËãºYøa*ôÚ)áqáá«£‘ʤp± Æê¦—Û‚$ e˜ó¨Qmô"0}73¼?‚ãi »P3jÐ^Eí®•˜†!Íz“)ÕÐ(1"$ï'Z§8„„‘EŸ‡¦Ú«@ÅÃᛸxyÄö|‘Ñ]¶£%’Ðè~¬ Ú¨Iò+†vÔ ƒ8Ä@yQé¢E¨´e-Г¬L¦›_ÀÑ#/… иSeÂë—«­!iéÜ÷ïY2UéðhåЄá{·ËßNÛI²ƒ9 ÿoÃf‚7;1¦NaLÕŠ‘\NBêÏ`ôÈò©uqxú¡î©¡$@rh ~=Ç01yáxWÏñ {'~p¼gäö?¶÷Ò_?ßûØþ¼ý…·¼ àªßþ‘w|à\SÏìûì­¸¦ÍD– ;‚w¤@FL‘Ïþù‰£!böJo)e±`€6©5VÃ^(é hç‹W•F½H¥µA©2˜]æµ½õF€e…Jô†ôbÿ±½ÜŽl7¡KebÓÛŒ–" K|ÌïÀBE°U k›þ5³ÙhQË@ïÈ» â#Y½ÔËáL&©£ìv-åÈGG"8ðçy¦`»gX_,PŒ±Îoš~§Ô«ssá ýìL}0̹Kü¥´Î`·} Æ ñ6ÝU¦Î êC§*&‘¦ØÍÌFb=Z±Q‚Lâ"…é,s  nú`Å¿à¦cíX =‹;:ã“^š}ƒ¥ej|Ž ½Ü|æJ $â‚ëM:=MóšÑéè‘«NŒ¡­;qÕêc‹X½óš¾a箃,¸•çþrú+:·jÕ¹?}åô_έdOƒð7Af„¿‚Ðs€ŒXq/ÚÏa椸â3Ÿ÷ö&) –ñGÀŠ»|>YGûÆeGh”‘¸f@G5]Uþ(•ø—†*øY¹p\šâQ8…éTìj•òÅŸ!O$^l\„ºJ¡€:á)UÁNðq K¤ PýóŸÁïFÓ í圠ÑÓ.?ð¾6xùehóñÎPÐ Â ÂcЈK œŸ ¾B¦ÅLË (7N/£•¢°è;ÅD‡HÝ< ™´ü0ùÔÞW=t7踤ç´Y§·?kôz4l,2•©mæöv³M-c9yy!æà‰Üžœ}ƒùתQÔ¯+—D‘òF«c-Y<³dÄŠ|úè²£@vËFHßܽôÆõiŸÝ”jZYî¬r½¦;˜tƒ>-ÜŒNgÛdí†e5F.X³íÖåb"Ðx¿0Ú8qš¿?[kur® 2 w¶»²sSq¬¨´”s*™~rUzÕF4DÃ~§·)åªÞv|åäƒ8›—á^f½(á<9“Ò Œzrs¹BAb¨LüŸ$|3éÿtÀø×ˆÜŸ>ƒ¥Çb›ðQ‰R©’Ùä˜žÒØê-ruñ_**Q˜­ÅOÅ%·Ê‹”Êf\r¹V¥ÒÊå›ã2ÐbŒQh幟«Õ…ú(:¡>2CIT_¨Vÿ<'3ÈÌ:­œ¬@Ýìëìm諪Ñê´¢0Yígø)­IJ0‰yi‰oø‘Áσ³'kÇO­‡oK¾ÉjúEU ­´Åj‡á-K–îçuº"Ú¢o¨ÑFr/:£ÏD*V7sÛ¶öÔÐð.Ý5ç“Ê0óã<Æœ½fm;íG¹Õ¡±LÈE˜ôzÄÅQæ11§J—Ÿä ®Ä¼ó0]±RIIÈŒ‰ cìê½·kì/Y|Ë?í|ð¦. ËèM–göÕtn0_s°{àHÔt/¦w|'W À„B°xê‘-[½±=ÚÙës¢¡hƒ.Ÿ¯rðºÎökVÆaŲP@Êù/v²Ç˜û¨ <¸˜µóÏÛz|.˜{D†¿\²Pxh­NVöü%ŽP=Û 3 ¿>Ôëj²Ñ¨p©Òu°ãþW‘ò–Eà…º¦Á0K±jW°¡°‹žy• Š 9 •œÅ„ç -ä„6*UÇì{ìŽ*Ir„TæóK%œÈH*Ï(ˆ}ñ~ µÙä~Ø ÿ]$åU‰ÎñÀ»`ÑÝ$¡„ˆ›@åW–Óà †È’µ±‰«a¼!“¹9 #¡N8ݘk.ƒv/GŸ7y-j„~„ Uƒõhf×ñ„16AG †Ò‹Ø))æÉFÓ™Z½ ¬¦éçMâÆJ[uf³n+Š—¡.¢¿§Ð‡8©JªóI5¸Â¯È.À„Q3sÔÊœw+pzóhvÛ]«OlÇȰ}ãÐ&ÈŽ<>R_®®?•ìGæüº-[?…|n03¶Þ ô;³8úPä¾M½G6¦Ó¯Øz*\qÇÆŽ†3èʇoXòýïWöÔâW=µ=‘ä û7ÍœMöc½¶/9vpõ}D?F&­ÆxâÅxÄ5no4$Éàļ•!ù ‘„ Dõ ¹ÔÒíÈä_Ÿù>çßM¯ÉÖ@‹È1ŽÒÖ¾šžë¦¶ÄÌW†>þ€ä¯“â;åè‹{©Úy&yEZЬ…_ádˆ/“¥´Ôe¹Í¥îEìk¿­ ,(Aœœ´ôÏv.ñíÛŒŠb­Í¡ymζV9ÝÜ,—ý°gô|rEÖ °c8Ú×R©Ti]ö@¸¢ÌÈk¼å*pZYUÿ¡5•éGë-½U­}4T´.kqÀ·¿,^N×#—·ÝÓ©>u`Ó½¾jƒ'˜õ·õƒÖîÕª|> ºÏ‘ʘÍ6NñVaaÐ×ÿ._¶½~÷½{eïAæ%±Ä”QGâÏ!#f4Ò"ÑÀ+fÙ|eq.¯Aj8{xt‚K!Xäà€pèxzØor:€.á÷ýÐ ¼á°?ÓZ.É£Í5°ìŸ¬¨– OYÒ¼¼^Ÿî9IÈiy‘ÝÖ„(%RúúE1¯(¥7(°…Û!RNPïo„ÌIÙå!žÑ§MI Ѽ9í‚öˆsƒé“µ æ¤Ó>ójÉik¼pH¬ ô†}1Ûqî?ËtEÂﱌ!7–‰eŒCôY“Ŕptéøo¾€Èeצø)ö~wÀqeU¨¯ÍÎ2ï ½b”äˆgD+õ(¸9%‘ñùÀ’Ï Íå†$$@R*úK&[ˆÐïn,2û×?D Õ[o]1òd½¹Àì³zLÚ"Ïx}e÷"lí®SÙeY;$ótB0°wÝWï¼gÕÒ©MH­;jÍ~[* :»[]ž¾~e:7yðÄêDw.m†ˆ+¿O¸šI°D<,Cå´Y®“Ê·’¤¤3 0•´ï\ °rpo{ .™>ŽUBÒôr¥3—›£w¿mÆ0[¦<:—·E…eP“+.žÏ[à70 ´!EÝÄ®kÔ-³¿e§Ðý"²“]bíÔ<Ç–H~9•W–¼þè?«”½9;½TÊ:tÉËž0é7ýtÓ74Üs·}–”°#}ãmR²¬¢wœQÁ»Á|í é‘ÅÖsÚo<·aÃC õ˜ÉFVN´µìéCÉÇú÷4uLôEPºÅÈ žGé¶ 8ÁÌsy,faÕ‹Y?WÖ{ò0›cÝñ<‰ Ù_zëkêTð~ªr$UPàЩlAX±Tºt?VU„BQõ÷Í&c…[™kkEJ£³$"À¹(OÃ{ônŸ ¼®2;LïvòܘÕ3Ï…ð“ ѹéûq–v7sØË\^pùˆ_ Íþ'{ñCPÊUˆÎc.UÁsÒȱãJ€s Ú´ñx©·Ô¨‚ÅJeut /tSÛnõoÓ:=¢›Já]D7ŒZ,DC¡‘³JÕFÄ5¤r 3“ô¡ydCjÿ;„§™ Xû' eA¥ZψÜÔŒ=˜“œ"åëí4½}Õàh×$«Ñ4*•Èi%h‹_r›é”´g~.ðEj•žµ°ˆÿi«V©(3οgö-¶—}NÌÇ~¢»qä ’øs!íŠtJž–¹ÿØ-Ÿ»xOoß½?Ù¿îìŠ :ŸKíŒGk&3}Ç·VWm¹} ÖßUÊ µ‡™ÚauòìÁ:Ö=ôË©#o}2&n‘Ç…Sã³­ÈM~cÇÄ×5Bi¤ÎÃ'y-”•û÷X}Öb’•¯p óûUOÆŸždÒTÌÆ¼{÷£qK1-žÈqüò­ýÈÍ}™Û€´ŸÛ|  =š+»$âv UvÄ¡X&×÷£½A %¶ªª¶@ ÓjªtÐ2•ÓáEFšØtׯ\ß@™NYÀ»ý~¹ÒX1ОÃNÄÊÝW‘L®pDråëZÇ–WëJ2Ëv´“º u”`×"ê£ôó+a ¬,¤óqåáÒ@i‘Êæ·26³ÏàôòþLý=tÿàqz*èWUzc©Îh7h …£ªbÎåé¡z´e.»DÉùHN‹Y™a>"¡ÌˆX$#ÆTQd)Idsã#r¥å ´UW·Ô 0Eüæ [ +×M6X̱%ñ€ÇåŒvV9­MŸÛÀQv&O™Aδ®kß±,S¢«^>Öº®¼±Â.—É4ŽRô•‰wmʵT•¨vn¾@©+èËa'J/ìu;‹d¬ÒÉ‘Y›‰B'ɰ#7ˆ<4o%¢‘üá ílW*% /÷k+˜¶ PaU•Š–P£+4 !P2ê%ômû>© ™c;Õ«°tçuê³úŒóY£Ìüù$¬)’µ”>?!èÜÿRhéö²—­{´¾a[wèÒ§»à×3ëõ·U¥¡Okñ K±fæÜªî®U4½ª«{ÕÃUKñ,]K[ÌÌ›Õë;ÊÊ:ÖWg×w§t¬ŸþÂ.ŒUx”¥}Ÿ•ΫKE §Îâù#M+hzESóŠÍ3a験­E_–%qjJ…ÄSç\QRENÊ\tèÉ»}¿ŸIxÍrOÿ×óþà£? ±6(v'øVSÚàR2‘Ù'a€ðƒ'Bì;ÿøø?ÜçÐ0[ˆãæ=̼ûk²ŠzlV`~/+¤âýqsñ#•V`®h…¼.K‰0—£6JY(=R¤=©j­®×i—)eÈÆõê"¥ZpmÖ¨´Æ"aPm¶[áå=/‚®/ 7õ"΂“ Z v€"µ’þ("/¡µ†™¤1̵¸g=|Ø/Ñøñ¯³ï1ﳿ#è YM&%æ³D:$ú!¯A+3¥ô>X¯§!3³­VQÈ€ËË{qÒÂ>9„Ú”š[™ryR@W jT¨‚6Y9,æñOx¢>"R•dŒ¬I1/'ʼn´Ÿx:úS²šçÏ&i³‰~°¿ô©äªFT”%ýÇ/=4X;þ• Ël©BS½¥ód?W»,V¹¢–OuwE¼ió±›q€ÌÆHn¿ ¼÷›ÿíÄÒšw¯¸ëê:´‚mÙu-¤:Ú¾©¶n¸Å ŽÍ8Öf_3ˆZqe~·ˆ¸«Bä úËŒÀCÝ?”Ÿ“¾nYŦÕ¸V Wöå¼&û…“)2ö¶Þ;~û’ôúñÓC}G6¥«GwwdFª×µøàêÍu5ãt°c³ðø+;‹€%C§G~Æo~þå»DÕí¼{ðªc5MÄ÷žŽ"ž?Cv*Ê.;¹Q›¯á)½ø¬ÝK’ãÂï=>¤~Œ>àµ$s¹vTr¿íãN/ç²¹¤êÎ.|b¹¨åZ©^àŸÛ°`¼rþAJé øxsæ½³®ˆCƒÐµØ#Ôº"ÎbÈ4\}B·W ³óçK‡p‡ð1ºRøÄŸ:äUWÎ ´¼äÝÅ7æçˆ§ô¡³NÞí•‹ø[—ðG—›w²ßœçuÊŽ“Ê7gw¸ÛÕÒßfîÀçi)’$wЬ©A*ûò=É©ç‘8Vg3!í¨¸Á¢gdªðŒ~ ì–+W*äÂm©OöºavšÝ'îþ¨DJâyfNÇ=sJ”k4¡RiŠ~/V›”§j«þú€KÖÐ-Ë—¿}Ë~~Ïò¹Ôæô~G ã(3%xí½÷^½:Ù%ö*û5ôéd4ÌooÎ׆|†3‹)_¸¹:RSÅ|ÍY¯×ËÂÃŪD9N7 {—-›î‡éá5Õi(vF\PR ' ”¤!~ékæéìºg_euÄe µ è€÷ߟ«[“í_Næb”ÔÉ¥8ƒ™÷iÝÌûR¦Q`OทL„˜F2‹•M©ž%Êt¾ÄI¦”1e@;Oò‚ž£š—wzÃɫۯ¯=¬)ry†šéH¼X“Û:¼1 7¤t³ð*®½N£Ö™M¹XR8×P+—e ô' U: ‹FŠ&wN[,%€lâ;Ÿï.†½86à}40Â(ÜŽr±>êç%.*%R]>«‹zªû³wLçscó¡faBz>ä(2WòÕ¼C¢GºoN¥†oê^zÓp 3üùKËVAج®ÈuÇK»—…½)7МIãæ¼FGvQ­«kå677ù£ãètzïx~÷ø…;–¥7ݺ«vÿcãïÏIõʉÇö×îèZiqT€ÑŽáÈhÓë\ž"pTQµýÍ8Ê@ßWß¾uê—­XûЛ7ïüÞÉídE»Èþ{\ÑÙÌS!gM~u ²Bµ-`ùÙÉé#aHn?³ƒ>°p#\~—=+;!î²Ï·ùê²™¹^ÉíAåÌþ ÑéW6-—Þ$Ûª³‘`¨×‘<ÀùÙK ϾC‰¨ra@/=RÚÂB çaCÿF€ý+×·ðöyà uéLíáÖUmÍ4=ÀŸÙç …<ôa™lQ#@ã"Žu#µõè©)§•ž¨åĪ$½*î6‘6 øY‡p'<Þ€p—'‚oÑçABºG\N? “â/‚ÓãKwíó{¸¾iЦØNú=Š#œêS^ä '"—OÅJ©ÖòÄæ‘-©ô†n²¿Kδ“[F7'ª6u‡éŵ’¹—òg¬ÊVMƒÙn´ð¥HèbU$Æ|<ûæ”`LÌkäëù©ô•¾i¾ ›þ¤«c ~%ðâ– ¬92A׵鶎ƒ›²A$ÔJÄãÞD£wÑ`ÎÆÝ½>^É ¯ì߸$C4[ÍûÊ<=Ü’þ­K¬I¢w⣶õáˆ3äW*õú"WfI$»$.µ4+úV45†añô×é×E¼p-ðdï6Át{Îa¢9:z8ê¤ôààázYA"Q nâI"—˜e'ñûõ$¯•g§sÁT¡q·m¾@ ¢­äaN<ž!?ܯˆYÉç!'œ„ý»#ádºÔ> ”ÕT%ÉN(äýô¡õæ*B-ÓþP*!×¼÷Ë’â0B‘ŽéV« 1šóxühá7 ÃÂWp­åð{xO  °Ûë§…g ¿·D*®f°“=Μ¢‚âjòùâEjŸûô/Ȇ£ÏØ_Èìú`))4~·;5š Šêªºï^‡ŸÙøÛ›&ܸõ[¹™£á¾ñöñç>}ã-­ã}‘YJ*:ú=¬ZüÁÀð€ÖçG7?°·¡£j.ÿÒ§ew_ExÅm(¶ÉÉ©b±æB’ i“ ã+x…­á(V³…)0##¬–©Ùb#Kô÷ÙÌ‹²*Kv_ˆ‹•ß*@~‰"m©ö´âÖ"mŸ7"8 (=>È¡ÿˆ29(‹Çg/± ;D)El"—‹õzÌù×$BŽD fDü2ïb¤„ÌeHb¾,Mú;¡îP×b =ϸ4C/™Ei‰µ6fóÚ’ê\.­Q÷QY¼.íLU”é¬> Ù€­*Ž­,_4ÜQ¦º:!Ò·»ùÔËehI]Íe»– «”9úGGäñ À×÷% 7Õª¨°Øimu¡Þ7&ÓãÁÎk†[÷T¢î°Ì]¨#”EªÊxyFP ¢m¢ÐzMzá’\îÖkT`sQ‰ÎwÊz ‹Á"œ.*)´–B˜„_A©µ°¤HÚ¡2˼¾TòI†Br ½ˆŒä3 ²/R*¢¡€³3ß‹%#ô¿—V#z÷Ù\Y¡¥{¼°oæ{Šóûø0³Ÿi« U‚ËQ­!VÛ#î_3ƒéh 9O­Ô0!”‹Û¯R •›}“=F}ŒQÏJù¯Œ{2ñxîç,ÜÂ3x ºjk»izYumÜKN²fº‡œLÿºk¤³šî±j’Ý5‹–á‹Èñ¢¸ëÓ'H?¥_ôÈ\b0MöÈþoÕÃÃÜMr³‘[xö¿ûÅO—p 4§’ 4ÝO&ô @S2Õ„¼ q™î÷s 6•jæL¬™¦å¦Ç(aqg8ú#%²ÁÜß¿7< 7û¤ïq+óß»W¼àZ]¨B¥a¸«dþž½ãwÐ÷¥þ‰5³jY5Ú àlD)÷!ÌRWý˜$¹2‰›Íy`ÌOýÿB6…-P8^—M÷Ö¸À_bµ—9ËÊÇë³ÉÞEnðél6¿Ãý÷óQæ};‚o>–ÐyAo3â´\,¥Gaz´ð‰Ù ìföw$"#b: Mh‘Ç%ò!S„ÈiDzùOЧšZ-@ å»}°ä™2¾eby‡.ágÂEᥚÝg6—hÍ` 7‚­,®e¯ÿÛM./9nb¯GY ÐÏ?ºüæa²û‚øê ÷ú‘ušš?QTõÉ?i‡1Æ äóøfPx… ËÄSq/╛؋h¨½^¤±5³á~ü¼Ä^œ}?ü(¶³Øa[m í0¶§°ÇÆb{[kþyýØFòÏÜ*=—ú¶§ñ¹/ãg ¶ZlØxl“ùû_ÂÖ‹ï•ãç“ØÈ½9lë±Uc[Œí$¶‹Ø~œoäùïañÂ)läúÚüXÔØÂØ·?{ðÓ'õ“O±ï¥üË?ó<¶¡|ÿ ÒóÈ{Åç’ñnÌÏ}q~ìKó};$™Áùüù¶ñüø97‘ËìEÚ€ŸOà9›Ÿc./בü³'Ä•YC= …ˆu®‚Çà't–¾–~‹ñ2#Ì/Ø$;Äþ‡,.Û.û©ì§ò°|Rþ3E½âLAQAOÁö‚Pš”ýÊï*?(4v>Yø›¢åE«dª•ª3ª?ï+þ–:­>®~GÓ¤¹FsN#”¬*ùž¶@Û¨=£+Ðåtgt?Ô/×ß®Ë`2l3Ûvµ½Æ~Èþ‚£Êñdº;EÛD­¦dsù©?ÕH|«Äã')* ”ϤcšRSÿ‘?f±ÿWùc9UrŒ+;¨Ô$µ›¥¶P#Ô¼#†ž,‹¾ÙM SãâÿWãÿøÿNü=µïÇ{7!ssSûð »©mx´ŸãÆñŒâSƱíÆ;†©1ìëÀïnÀ8ïÆ øýíøyùãâÙ&üÜ„Ÿ{ÅçJ÷’Ñ]MmÆ;7bïÕxï(>q;^%W&Ägï1“ñöˆïÞ€O]Žý[ðŽíxÿîÿïÝW^'W/_k¤z©>oÎ%ñ?&½H6 endstream endobj 9344 0 obj 11692 endobj 9342 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /Courier10PitchBT-Roman /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9340 0 R /CIDToGIDMap /Identity /DW 597 >> endobj 9343 0 obj << /Length 1064 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0064> [<0068> <0074> <0070> <003A> <002F> <0077> <002E> <0073> <0069> <0067> <006F> <0072> <006D> <0061> <006C> <0053> <0057> <0049> <0047> <0020> <0042> <0065> <0064> <006E> <0045> <0023> <0066> <005F> <0056> <0052> <004F> <004E> <003E> <003D> <0030> <0078> <0031> <0033> <002A> <0055> <0063> <0079> <0075> <002D> <0038> <007A> <0024> <006B> <006A> <0032> <0028> <0029> <0046> <0062> <004D> <0076> <003B> <0043> <007B> <003C> <007D> <002C> <0025> <0050> <0034> <0037> <0035> <0054> <0036> <0039> <005B> <004C> <005D> <0022> <0044> <0041> <004B> <0051> <0059> <0048> <004A> <005C> <0021> <002B> <007E> <003F> <0027> <0058> <0071> <0060> <0040> <007C> <0026> <005E> <005A> <2026> <00F6> <00E9> <00C3> <00B6> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 1410 0 obj << /Type /Font /Subtype /Type0 /BaseFont /Courier10PitchBT-Roman /Encoding /Identity-H /DescendantFonts [9342 0 R] /ToUnicode 9343 0 R>> endobj 2 0 obj << /Type /Pages /Kids [ 5 0 R 107 0 R 212 0 R 310 0 R 412 0 R 509 0 R 608 0 R 713 0 R 815 0 R 918 0 R 1023 0 R 1126 0 R 1229 0 R 1330 0 R 1409 0 R 1446 0 R 1471 0 R 1499 0 R 1515 0 R 1539 0 R 1585 0 R 1614 0 R 1637 0 R 1658 0 R 1669 0 R 1699 0 R 1746 0 R 1756 0 R 1771 0 R 1780 0 R 1790 0 R 1805 0 R 1816 0 R 1829 0 R 1838 0 R 1847 0 R 1859 0 R 1867 0 R 1879 0 R 1887 0 R 1898 0 R 1910 0 R 1919 0 R 1924 0 R 1931 0 R 1945 0 R 1952 0 R 1970 0 R 2036 0 R 2057 0 R 2064 0 R 2077 0 R 2085 0 R 2100 0 R 2108 0 R 2121 0 R 2128 0 R 2136 0 R 2145 0 R 2160 0 R 2167 0 R 2175 0 R 2181 0 R 2187 0 R 2196 0 R 2203 0 R 2214 0 R 2223 0 R 2232 0 R 2239 0 R 2246 0 R 2253 0 R 2261 0 R 2267 0 R 2272 0 R 2280 0 R 2289 0 R 2303 0 R 2308 0 R 2316 0 R 2324 0 R 2334 0 R 2347 0 R 2405 0 R 2416 0 R 2429 0 R 2440 0 R 2453 0 R 2467 0 R 2480 0 R 2499 0 R 2522 0 R 2533 0 R 2569 0 R 2599 0 R 2610 0 R 2624 0 R 2665 0 R 2670 0 R 2677 0 R 2686 0 R 2697 0 R 2708 0 R 2713 0 R 2720 0 R 2729 0 R 2736 0 R 2748 0 R 2763 0 R 2788 0 R 2795 0 R 2804 0 R 2819 0 R 2895 0 R 2904 0 R 2911 0 R 2921 0 R 2938 0 R 2949 0 R 2960 0 R 2967 0 R 2974 0 R 2985 0 R 2993 0 R 3001 0 R 3010 0 R 3017 0 R 3031 0 R 3044 0 R 3065 0 R 3086 0 R 3096 0 R 3101 0 R 3113 0 R 3121 0 R 3127 0 R 3137 0 R 3144 0 R 3153 0 R 3164 0 R 3172 0 R 3179 0 R 3185 0 R 3194 0 R 3204 0 R 3234 0 R 3244 0 R 3255 0 R 3263 0 R 3272 0 R 3281 0 R 3293 0 R 3303 0 R 3319 0 R 3328 0 R 3348 0 R 3359 0 R 3368 0 R 3376 0 R 3381 0 R 3388 0 R 3397 0 R 3440 0 R 3457 0 R 3472 0 R 3480 0 R 3488 0 R 3493 0 R 3505 0 R 3514 0 R 3521 0 R 3540 0 R 3571 0 R 3581 0 R 3601 0 R 3610 0 R 3630 0 R 3643 0 R 3662 0 R 3696 0 R 3705 0 R 3739 0 R 3758 0 R 3764 0 R 3774 0 R 3780 0 R 3785 0 R 3790 0 R 3842 0 R 3852 0 R 3863 0 R 3878 0 R 3889 0 R 3898 0 R 3905 0 R 3915 0 R 3922 0 R 3932 0 R 3939 0 R 3947 0 R 3960 0 R 3968 0 R 3977 0 R 3982 0 R 3990 0 R 4000 0 R 4010 0 R 4048 0 R 4072 0 R 4088 0 R 4100 0 R 4131 0 R 4180 0 R 4202 0 R 4211 0 R 4230 0 R 4245 0 R 4257 0 R 4265 0 R 4275 0 R 4311 0 R 4329 0 R 4351 0 R 4366 0 R 4375 0 R 4394 0 R 4496 0 R 4518 0 R 4530 0 R 4546 0 R 4559 0 R 4568 0 R 4579 0 R 4599 0 R 4609 0 R 4618 0 R 4631 0 R 4642 0 R 4659 0 R 4670 0 R 4685 0 R 4696 0 R 4706 0 R 4716 0 R 4725 0 R 4735 0 R 4746 0 R 4756 0 R 4764 0 R 4774 0 R 4791 0 R 4801 0 R 4809 0 R 4815 0 R 4820 0 R 4827 0 R 4838 0 R 4847 0 R 4857 0 R 4871 0 R 4881 0 R 4888 0 R 4898 0 R 4910 0 R 4921 0 R 4934 0 R 4957 0 R 4966 0 R 4977 0 R 4983 0 R 4993 0 R 5004 0 R 5013 0 R 5020 0 R 5029 0 R 5036 0 R 5043 0 R 5050 0 R 5055 0 R 5066 0 R 5071 0 R 5081 0 R 5089 0 R 5094 0 R 5102 0 R 5113 0 R 5131 0 R 5168 0 R 5181 0 R 5199 0 R 5213 0 R 5222 0 R 5232 0 R 5239 0 R 5246 0 R 5255 0 R 5297 0 R 5320 0 R 5328 0 R 5343 0 R 5352 0 R 5361 0 R 5368 0 R 5377 0 R 5386 0 R 5391 0 R 5401 0 R 5412 0 R 5417 0 R 5430 0 R 5441 0 R 5451 0 R 5466 0 R 5481 0 R 5488 0 R 5527 0 R 5545 0 R 5556 0 R 5563 0 R 5574 0 R 5583 0 R 5597 0 R 5612 0 R 5676 0 R 5690 0 R 5697 0 R 5709 0 R 5726 0 R 5735 0 R 5742 0 R 5755 0 R 5762 0 R 5769 0 R 5780 0 R 5787 0 R 5801 0 R 5810 0 R 5819 0 R 5832 0 R 5839 0 R 5848 0 R 5860 0 R 5871 0 R 5886 0 R 5927 0 R 5941 0 R 5948 0 R 5959 0 R 5970 0 R 5981 0 R 5998 0 R 6102 0 R 6117 0 R 6127 0 R 6136 0 R 6146 0 R 6162 0 R 6173 0 R 6180 0 R 6187 0 R 6196 0 R 6203 0 R 6214 0 R 6229 0 R 6246 0 R 6255 0 R 6263 0 R 6271 0 R 6280 0 R 6291 0 R 6306 0 R 6313 0 R 6318 0 R 6327 0 R 6337 0 R 6348 0 R 6355 0 R 6366 0 R 6380 0 R 6393 0 R 6402 0 R 6409 0 R 6417 0 R 6426 0 R 6436 0 R 6446 0 R 6462 0 R 6478 0 R 6487 0 R 6498 0 R 6513 0 R 6521 0 R 6539 0 R 6549 0 R 6557 0 R 6566 0 R 6591 0 R 6604 0 R 6671 0 R 6726 0 R 6742 0 R 6753 0 R 6764 0 R 6774 0 R 6781 0 R 6789 0 R 6802 0 R 6809 0 R 6819 0 R 6838 0 R 6851 0 R 6861 0 R 6871 0 R 6879 0 R 6894 0 R 6899 0 R 6912 0 R 6923 0 R 6941 0 R 6960 0 R 6976 0 R 6991 0 R 7002 0 R 7009 0 R 7016 0 R 7025 0 R 7045 0 R 7061 0 R 7068 0 R 7080 0 R 7088 0 R 7094 0 R 7103 0 R 7111 0 R 7118 0 R 7175 0 R 7190 0 R 7210 0 R 7219 0 R 7229 0 R 7242 0 R 7253 0 R 7261 0 R 7273 0 R 7282 0 R 7292 0 R 7308 0 R 7318 0 R 7327 0 R 7333 0 R 7346 0 R 7387 0 R 7422 0 R 7431 0 R 7448 0 R 7461 0 R 7472 0 R 7479 0 R 7484 0 R 7495 0 R 7504 0 R 7511 0 R 7523 0 R 7534 0 R 7541 0 R 7548 0 R 7559 0 R 7566 0 R 7576 0 R 7585 0 R 7594 0 R 7603 0 R 7610 0 R 7627 0 R 7663 0 R 7687 0 R 7700 0 R 7717 0 R 7728 0 R 7745 0 R 7763 0 R 7809 0 R 7843 0 R 7852 0 R 7857 0 R 7862 0 R 7873 0 R 7882 0 R 7893 0 R 7904 0 R 7913 0 R 7920 0 R 7931 0 R 7940 0 R 7951 0 R 7962 0 R 7973 0 R 7980 0 R 7987 0 R 7995 0 R 8012 0 R 8018 0 R 8038 0 R 8049 0 R 8054 0 R ] /Count 505 /ProcSet [/PDF /Text /ImageB /ImageC] >> endobj xref 0 9345 0000000000 65535 f 0000000009 00000 n 0004579578 00000 n 0000000207 00000 n 0000000302 00000 n 0000026188 00000 n 0000000339 00000 n 0000005552 00000 n 0004520588 00000 n 0004557430 00000 n 0000005572 00000 n 0000005624 00000 n 0000005669 00000 n 0000005714 00000 n 0000005759 00000 n 0000005811 00000 n 0000005856 00000 n 0000005901 00000 n 0000005946 00000 n 0000005991 00000 n 0000006036 00000 n 0000006081 00000 n 0000006126 00000 n 0000006171 00000 n 0000006216 00000 n 0000006261 00000 n 0000006306 00000 n 0000006549 00000 n 0000006806 00000 n 0000007064 00000 n 0000007324 00000 n 0000007598 00000 n 0000007767 00000 n 0000008033 00000 n 0000008289 00000 n 0000008542 00000 n 0000008802 00000 n 0000009066 00000 n 0000009319 00000 n 0000009579 00000 n 0000009832 00000 n 0000010085 00000 n 0000010338 00000 n 0000010601 00000 n 0000010862 00000 n 0000011116 00000 n 0000011378 00000 n 0000011655 00000 n 0000011922 00000 n 0000012181 00000 n 0000012438 00000 n 0000012696 00000 n 0000012957 00000 n 0000013222 00000 n 0000013480 00000 n 0000013758 00000 n 0000014029 00000 n 0000014296 00000 n 0000014554 00000 n 0000014805 00000 n 0000015070 00000 n 0000015335 00000 n 0000015586 00000 n 0000015844 00000 n 0000016103 00000 n 0000016355 00000 n 0000016629 00000 n 0000016881 00000 n 0000017147 00000 n 0000017403 00000 n 0000017665 00000 n 0000017925 00000 n 0000018176 00000 n 0000018432 00000 n 0000018695 00000 n 0000018949 00000 n 0000019210 00000 n 0000019473 00000 n 0000019726 00000 n 0000019984 00000 n 0000020238 00000 n 0000020496 00000 n 0000020765 00000 n 0000021023 00000 n 0000021290 00000 n 0000021553 00000 n 0000021824 00000 n 0000022096 00000 n 0000022360 00000 n 0000022611 00000 n 0000022873 00000 n 0000023121 00000 n 0000023383 00000 n 0000023638 00000 n 0000023893 00000 n 0000024155 00000 n 0000024410 00000 n 0000024665 00000 n 0000024928 00000 n 0000025177 00000 n 0000025440 00000 n 0000025694 00000 n 0000025937 00000 n 0000027063 00000 n 0000034327 00000 n 0000026312 00000 n 0000026500 00000 n 0000060041 00000 n 0000034349 00000 n 0000034603 00000 n 0000034854 00000 n 0000035105 00000 n 0000035349 00000 n 0000035607 00000 n 0000035858 00000 n 0000036117 00000 n 0000036369 00000 n 0000036621 00000 n 0000036880 00000 n 0000037125 00000 n 0000037377 00000 n 0000037636 00000 n 0000037888 00000 n 0000038147 00000 n 0000038406 00000 n 0000038658 00000 n 0000038917 00000 n 0000039169 00000 n 0000039421 00000 n 0000039680 00000 n 0000039932 00000 n 0000040191 00000 n 0000040464 00000 n 0000040725 00000 n 0000040984 00000 n 0000041242 00000 n 0000041507 00000 n 0000041777 00000 n 0000042037 00000 n 0000042289 00000 n 0000042541 00000 n 0000042793 00000 n 0000043052 00000 n 0000043297 00000 n 0000043567 00000 n 0000043826 00000 n 0000044097 00000 n 0000044359 00000 n 0000044618 00000 n 0000044870 00000 n 0000045122 00000 n 0000045374 00000 n 0000045626 00000 n 0000045878 00000 n 0000046123 00000 n 0000046382 00000 n 0000046634 00000 n 0000046886 00000 n 0000047145 00000 n 0000047390 00000 n 0000047641 00000 n 0000047903 00000 n 0000048158 00000 n 0000048413 00000 n 0000048668 00000 n 0000048917 00000 n 0000049180 00000 n 0000049429 00000 n 0000049685 00000 n 0000049947 00000 n 0000050195 00000 n 0000050450 00000 n 0000050712 00000 n 0000050968 00000 n 0000051231 00000 n 0000051487 00000 n 0000051750 00000 n 0000052013 00000 n 0000052269 00000 n 0000052532 00000 n 0000052795 00000 n 0000053051 00000 n 0000053314 00000 n 0000053563 00000 n 0000053827 00000 n 0000054104 00000 n 0000054360 00000 n 0000054616 00000 n 0000054797 00000 n 0000055053 00000 n 0000055316 00000 n 0000055583 00000 n 0000055839 00000 n 0000056109 00000 n 0000056379 00000 n 0000056654 00000 n 0000056932 00000 n 0000057207 00000 n 0000057474 00000 n 0000057742 00000 n 0000058007 00000 n 0000058276 00000 n 0000058534 00000 n 0000058719 00000 n 0000059002 00000 n 0000059260 00000 n 0000059523 00000 n 0000059781 00000 n 0000061165 00000 n 0000071223 00000 n 0000060167 00000 n 0000060344 00000 n 0000094782 00000 n 0000071245 00000 n 0000071501 00000 n 0000071774 00000 n 0000072031 00000 n 0000072308 00000 n 0000072489 00000 n 0000072656 00000 n 0000072919 00000 n 0000073172 00000 n 0000073439 00000 n 0000073715 00000 n 0000073891 00000 n 0000074069 00000 n 0000074346 00000 n 0000074618 00000 n 0000074902 00000 n 0000075178 00000 n 0000075453 00000 n 0000075638 00000 n 0000075918 00000 n 0000076088 00000 n 0000076374 00000 n 0000076650 00000 n 0000076824 00000 n 0000077107 00000 n 0000077274 00000 n 0000077551 00000 n 0000077825 00000 n 0000078098 00000 n 0000078377 00000 n 0000078651 00000 n 0000078934 00000 n 0000079216 00000 n 0000079488 00000 n 0000079761 00000 n 0000080026 00000 n 0000080287 00000 n 0000080557 00000 n 0000080821 00000 n 0000081086 00000 n 0000081355 00000 n 0000081627 00000 n 0000081902 00000 n 0000082168 00000 n 0000082427 00000 n 0000082708 00000 n 0000082880 00000 n 0000083057 00000 n 0000083329 00000 n 0000083503 00000 n 0000083682 00000 n 0000083854 00000 n 0000084100 00000 n 0000084374 00000 n 0000084643 00000 n 0000084913 00000 n 0000085192 00000 n 0000085438 00000 n 0000085712 00000 n 0000085981 00000 n 0000086253 00000 n 0000086531 00000 n 0000086703 00000 n 0000086982 00000 n 0000087236 00000 n 0000087495 00000 n 0000087754 00000 n 0000088024 00000 n 0000088283 00000 n 0000088549 00000 n 0000088808 00000 n 0000089081 00000 n 0000089347 00000 n 0000089599 00000 n 0000089880 00000 n 0000090133 00000 n 0000090395 00000 n 0000090652 00000 n 0000090899 00000 n 0000091160 00000 n 0000091421 00000 n 0000091672 00000 n 0000091933 00000 n 0000092187 00000 n 0000092441 00000 n 0000092702 00000 n 0000092950 00000 n 0000093212 00000 n 0000093474 00000 n 0000093739 00000 n 0000094000 00000 n 0000094260 00000 n 0000094517 00000 n 0000095850 00000 n 0000105812 00000 n 0000094908 00000 n 0000095085 00000 n 0000131139 00000 n 0000105834 00000 n 0000106102 00000 n 0000106375 00000 n 0000106648 00000 n 0000106919 00000 n 0000107197 00000 n 0000107453 00000 n 0000107715 00000 n 0000107970 00000 n 0000108222 00000 n 0000108485 00000 n 0000108734 00000 n 0000108990 00000 n 0000109246 00000 n 0000109495 00000 n 0000109758 00000 n 0000110021 00000 n 0000110277 00000 n 0000110541 00000 n 0000110791 00000 n 0000111034 00000 n 0000111296 00000 n 0000111544 00000 n 0000111806 00000 n 0000112068 00000 n 0000112316 00000 n 0000112578 00000 n 0000112833 00000 n 0000113092 00000 n 0000113354 00000 n 0000113610 00000 n 0000113877 00000 n 0000114140 00000 n 0000114396 00000 n 0000114659 00000 n 0000114915 00000 n 0000115183 00000 n 0000115446 00000 n 0000115716 00000 n 0000115979 00000 n 0000116157 00000 n 0000116437 00000 n 0000116712 00000 n 0000116968 00000 n 0000117217 00000 n 0000117480 00000 n 0000117749 00000 n 0000118031 00000 n 0000118314 00000 n 0000118580 00000 n 0000118866 00000 n 0000119146 00000 n 0000119402 00000 n 0000119665 00000 n 0000119914 00000 n 0000120177 00000 n 0000120440 00000 n 0000120689 00000 n 0000120952 00000 n 0000121208 00000 n 0000121464 00000 n 0000121720 00000 n 0000121975 00000 n 0000122231 00000 n 0000122494 00000 n 0000122750 00000 n 0000123016 00000 n 0000123272 00000 n 0000123528 00000 n 0000123784 00000 n 0000124040 00000 n 0000124306 00000 n 0000124588 00000 n 0000124848 00000 n 0000125116 00000 n 0000125396 00000 n 0000125665 00000 n 0000125944 00000 n 0000126200 00000 n 0000126485 00000 n 0000126748 00000 n 0000127010 00000 n 0000127273 00000 n 0000127529 00000 n 0000127785 00000 n 0000128041 00000 n 0000128297 00000 n 0000128570 00000 n 0000128837 00000 n 0000129097 00000 n 0000129364 00000 n 0000129625 00000 n 0000129878 00000 n 0000130061 00000 n 0000130320 00000 n 0000130593 00000 n 0000130865 00000 n 0000132239 00000 n 0000142014 00000 n 0000131265 00000 n 0000131442 00000 n 0000166005 00000 n 0000142036 00000 n 0000142299 00000 n 0000142580 00000 n 0000142851 00000 n 0000143124 00000 n 0000143382 00000 n 0000143637 00000 n 0000143899 00000 n 0000144161 00000 n 0000144408 00000 n 0000144658 00000 n 0000144912 00000 n 0000145166 00000 n 0000145427 00000 n 0000145681 00000 n 0000145942 00000 n 0000146203 00000 n 0000146457 00000 n 0000146718 00000 n 0000146973 00000 n 0000147223 00000 n 0000147494 00000 n 0000147761 00000 n 0000148031 00000 n 0000148297 00000 n 0000148559 00000 n 0000148822 00000 n 0000149079 00000 n 0000149345 00000 n 0000149609 00000 n 0000149878 00000 n 0000150146 00000 n 0000150417 00000 n 0000150680 00000 n 0000150954 00000 n 0000151220 00000 n 0000151479 00000 n 0000151757 00000 n 0000152018 00000 n 0000152299 00000 n 0000152579 00000 n 0000152845 00000 n 0000153110 00000 n 0000153378 00000 n 0000153646 00000 n 0000153915 00000 n 0000154171 00000 n 0000154440 00000 n 0000154698 00000 n 0000154953 00000 n 0000155223 00000 n 0000155471 00000 n 0000155719 00000 n 0000155994 00000 n 0000156249 00000 n 0000156511 00000 n 0000156766 00000 n 0000157021 00000 n 0000157284 00000 n 0000157540 00000 n 0000157796 00000 n 0000158052 00000 n 0000158308 00000 n 0000158574 00000 n 0000158837 00000 n 0000159093 00000 n 0000159356 00000 n 0000159606 00000 n 0000159869 00000 n 0000160130 00000 n 0000160384 00000 n 0000160659 00000 n 0000160920 00000 n 0000161167 00000 n 0000161428 00000 n 0000161677 00000 n 0000161930 00000 n 0000162183 00000 n 0000162436 00000 n 0000162696 00000 n 0000162956 00000 n 0000163202 00000 n 0000163455 00000 n 0000163708 00000 n 0000163962 00000 n 0000164223 00000 n 0000164470 00000 n 0000164724 00000 n 0000164985 00000 n 0000165238 00000 n 0000165499 00000 n 0000165752 00000 n 0000167065 00000 n 0000176028 00000 n 0000166131 00000 n 0000166308 00000 n 0000200279 00000 n 0000176050 00000 n 0000176300 00000 n 0000176566 00000 n 0000176825 00000 n 0000177083 00000 n 0000177355 00000 n 0000177619 00000 n 0000177891 00000 n 0000178152 00000 n 0000178401 00000 n 0000178670 00000 n 0000178846 00000 n 0000179100 00000 n 0000179373 00000 n 0000179636 00000 n 0000179899 00000 n 0000180168 00000 n 0000180337 00000 n 0000180601 00000 n 0000180861 00000 n 0000181032 00000 n 0000181217 00000 n 0000181389 00000 n 0000181674 00000 n 0000181940 00000 n 0000182207 00000 n 0000182488 00000 n 0000182754 00000 n 0000183020 00000 n 0000183293 00000 n 0000183467 00000 n 0000183749 00000 n 0000184022 00000 n 0000184287 00000 n 0000184567 00000 n 0000184825 00000 n 0000185093 00000 n 0000185371 00000 n 0000185641 00000 n 0000185892 00000 n 0000186156 00000 n 0000186424 00000 n 0000186684 00000 n 0000186952 00000 n 0000187215 00000 n 0000187497 00000 n 0000187775 00000 n 0000188045 00000 n 0000188320 00000 n 0000188582 00000 n 0000188842 00000 n 0000189094 00000 n 0000189349 00000 n 0000189610 00000 n 0000189869 00000 n 0000190127 00000 n 0000190401 00000 n 0000190666 00000 n 0000190928 00000 n 0000191189 00000 n 0000191450 00000 n 0000191702 00000 n 0000191956 00000 n 0000192217 00000 n 0000192482 00000 n 0000192739 00000 n 0000192999 00000 n 0000193255 00000 n 0000193508 00000 n 0000193759 00000 n 0000194014 00000 n 0000194272 00000 n 0000194532 00000 n 0000194790 00000 n 0000195060 00000 n 0000195308 00000 n 0000195570 00000 n 0000195841 00000 n 0000196102 00000 n 0000196373 00000 n 0000196645 00000 n 0000196912 00000 n 0000197182 00000 n 0000197439 00000 n 0000197708 00000 n 0000197984 00000 n 0000198246 00000 n 0000198521 00000 n 0000198782 00000 n 0000199022 00000 n 0000199281 00000 n 0000199525 00000 n 0000199776 00000 n 0000200035 00000 n 0000201355 00000 n 0000210723 00000 n 0000200405 00000 n 0000200582 00000 n 0000237087 00000 n 0000210745 00000 n 0000210990 00000 n 0000211249 00000 n 0000211501 00000 n 0000211753 00000 n 0000212013 00000 n 0000212266 00000 n 0000212519 00000 n 0000212779 00000 n 0000213032 00000 n 0000213292 00000 n 0000213538 00000 n 0000213791 00000 n 0000214051 00000 n 0000214304 00000 n 0000214564 00000 n 0000214817 00000 n 0000215064 00000 n 0000215327 00000 n 0000215588 00000 n 0000215848 00000 n 0000216114 00000 n 0000216383 00000 n 0000216648 00000 n 0000216908 00000 n 0000217180 00000 n 0000217459 00000 n 0000217716 00000 n 0000217977 00000 n 0000218230 00000 n 0000218488 00000 n 0000218766 00000 n 0000219023 00000 n 0000219287 00000 n 0000219551 00000 n 0000219811 00000 n 0000220074 00000 n 0000220336 00000 n 0000220596 00000 n 0000220867 00000 n 0000221134 00000 n 0000221390 00000 n 0000221655 00000 n 0000221910 00000 n 0000222169 00000 n 0000222437 00000 n 0000222698 00000 n 0000222973 00000 n 0000223245 00000 n 0000223503 00000 n 0000223767 00000 n 0000224022 00000 n 0000224295 00000 n 0000224572 00000 n 0000224835 00000 n 0000225090 00000 n 0000225360 00000 n 0000225620 00000 n 0000225888 00000 n 0000226149 00000 n 0000226414 00000 n 0000226683 00000 n 0000226947 00000 n 0000227200 00000 n 0000227476 00000 n 0000227744 00000 n 0000228011 00000 n 0000228281 00000 n 0000228549 00000 n 0000228821 00000 n 0000229079 00000 n 0000229343 00000 n 0000229616 00000 n 0000229881 00000 n 0000230154 00000 n 0000230419 00000 n 0000230686 00000 n 0000230962 00000 n 0000231235 00000 n 0000231521 00000 n 0000231788 00000 n 0000232056 00000 n 0000232327 00000 n 0000232590 00000 n 0000232840 00000 n 0000233113 00000 n 0000233367 00000 n 0000233637 00000 n 0000233915 00000 n 0000234178 00000 n 0000234441 00000 n 0000234700 00000 n 0000234959 00000 n 0000235223 00000 n 0000235479 00000 n 0000235765 00000 n 0000236050 00000 n 0000236295 00000 n 0000236558 00000 n 0000236822 00000 n 0000238211 00000 n 0000247921 00000 n 0000237213 00000 n 0000237390 00000 n 0000273131 00000 n 0000247943 00000 n 0000248201 00000 n 0000248478 00000 n 0000248739 00000 n 0000248998 00000 n 0000249269 00000 n 0000249537 00000 n 0000249802 00000 n 0000250078 00000 n 0000250355 00000 n 0000250624 00000 n 0000250896 00000 n 0000251160 00000 n 0000251428 00000 n 0000251682 00000 n 0000251959 00000 n 0000252148 00000 n 0000252421 00000 n 0000252692 00000 n 0000252953 00000 n 0000253210 00000 n 0000253474 00000 n 0000253742 00000 n 0000254020 00000 n 0000254286 00000 n 0000254543 00000 n 0000254806 00000 n 0000255051 00000 n 0000255313 00000 n 0000255587 00000 n 0000255853 00000 n 0000256136 00000 n 0000256409 00000 n 0000256674 00000 n 0000256950 00000 n 0000257219 00000 n 0000257488 00000 n 0000257752 00000 n 0000258009 00000 n 0000258282 00000 n 0000258551 00000 n 0000258819 00000 n 0000259093 00000 n 0000259361 00000 n 0000259619 00000 n 0000259887 00000 n 0000260148 00000 n 0000260423 00000 n 0000260698 00000 n 0000260944 00000 n 0000261201 00000 n 0000261451 00000 n 0000261702 00000 n 0000261959 00000 n 0000262202 00000 n 0000262452 00000 n 0000262709 00000 n 0000262952 00000 n 0000263202 00000 n 0000263453 00000 n 0000263704 00000 n 0000263955 00000 n 0000264206 00000 n 0000264470 00000 n 0000264728 00000 n 0000264979 00000 n 0000265237 00000 n 0000265488 00000 n 0000265739 00000 n 0000265997 00000 n 0000266248 00000 n 0000266506 00000 n 0000266757 00000 n 0000267008 00000 n 0000267272 00000 n 0000267523 00000 n 0000267774 00000 n 0000268032 00000 n 0000268283 00000 n 0000268534 00000 n 0000268792 00000 n 0000269053 00000 n 0000269333 00000 n 0000269596 00000 n 0000269850 00000 n 0000270101 00000 n 0000270345 00000 n 0000270596 00000 n 0000270854 00000 n 0000271105 00000 n 0000271356 00000 n 0000271607 00000 n 0000271858 00000 n 0000272114 00000 n 0000272366 00000 n 0000272626 00000 n 0000272886 00000 n 0000274231 00000 n 0000284068 00000 n 0000273257 00000 n 0000273434 00000 n 0000309058 00000 n 0000284090 00000 n 0000284336 00000 n 0000284596 00000 n 0000284842 00000 n 0000285088 00000 n 0000285349 00000 n 0000285603 00000 n 0000285864 00000 n 0000286125 00000 n 0000286379 00000 n 0000286633 00000 n 0000286887 00000 n 0000287141 00000 n 0000287402 00000 n 0000287649 00000 n 0000287931 00000 n 0000288210 00000 n 0000288464 00000 n 0000288718 00000 n 0000288965 00000 n 0000289219 00000 n 0000289480 00000 n 0000289720 00000 n 0000289979 00000 n 0000290238 00000 n 0000290490 00000 n 0000290742 00000 n 0000290994 00000 n 0000291246 00000 n 0000291505 00000 n 0000291757 00000 n 0000292017 00000 n 0000292277 00000 n 0000292523 00000 n 0000292783 00000 n 0000293036 00000 n 0000293282 00000 n 0000293542 00000 n 0000293795 00000 n 0000294055 00000 n 0000294315 00000 n 0000294568 00000 n 0000294821 00000 n 0000295067 00000 n 0000295320 00000 n 0000295573 00000 n 0000295826 00000 n 0000296086 00000 n 0000296346 00000 n 0000296599 00000 n 0000296859 00000 n 0000297112 00000 n 0000297365 00000 n 0000297625 00000 n 0000297871 00000 n 0000298131 00000 n 0000298391 00000 n 0000298644 00000 n 0000298904 00000 n 0000299157 00000 n 0000299403 00000 n 0000299656 00000 n 0000299909 00000 n 0000300169 00000 n 0000300422 00000 n 0000300675 00000 n 0000300935 00000 n 0000301188 00000 n 0000301434 00000 n 0000301692 00000 n 0000301945 00000 n 0000302205 00000 n 0000302458 00000 n 0000302711 00000 n 0000302964 00000 n 0000303210 00000 n 0000303456 00000 n 0000303713 00000 n 0000303965 00000 n 0000304224 00000 n 0000304481 00000 n 0000304733 00000 n 0000304985 00000 n 0000305230 00000 n 0000305482 00000 n 0000305741 00000 n 0000305993 00000 n 0000306254 00000 n 0000306515 00000 n 0000306762 00000 n 0000307023 00000 n 0000307277 00000 n 0000307529 00000 n 0000307786 00000 n 0000308037 00000 n 0000308296 00000 n 0000308548 00000 n 0000308799 00000 n 0000310166 00000 n 0000319444 00000 n 0000309184 00000 n 0000309361 00000 n 0000345096 00000 n 0000319466 00000 n 0000319718 00000 n 0000319970 00000 n 0000320219 00000 n 0000320472 00000 n 0000320732 00000 n 0000320985 00000 n 0000321245 00000 n 0000321505 00000 n 0000321758 00000 n 0000322011 00000 n 0000322265 00000 n 0000322519 00000 n 0000322773 00000 n 0000323034 00000 n 0000323295 00000 n 0000323549 00000 n 0000323796 00000 n 0000324057 00000 n 0000324311 00000 n 0000324565 00000 n 0000324826 00000 n 0000325080 00000 n 0000325341 00000 n 0000325602 00000 n 0000325856 00000 n 0000326117 00000 n 0000326371 00000 n 0000326625 00000 n 0000326879 00000 n 0000327154 00000 n 0000327433 00000 n 0000327695 00000 n 0000327949 00000 n 0000328210 00000 n 0000328473 00000 n 0000328742 00000 n 0000329016 00000 n 0000329270 00000 n 0000329536 00000 n 0000329797 00000 n 0000330051 00000 n 0000330305 00000 n 0000330559 00000 n 0000330813 00000 n 0000331074 00000 n 0000331321 00000 n 0000331582 00000 n 0000331843 00000 n 0000332097 00000 n 0000332358 00000 n 0000332605 00000 n 0000332867 00000 n 0000333126 00000 n 0000333380 00000 n 0000333641 00000 n 0000333902 00000 n 0000334149 00000 n 0000334410 00000 n 0000334672 00000 n 0000334926 00000 n 0000335180 00000 n 0000335434 00000 n 0000335695 00000 n 0000335949 00000 n 0000336203 00000 n 0000336457 00000 n 0000336711 00000 n 0000336965 00000 n 0000337219 00000 n 0000337473 00000 n 0000337734 00000 n 0000337913 00000 n 0000338167 00000 n 0000338428 00000 n 0000338682 00000 n 0000338936 00000 n 0000339197 00000 n 0000339455 00000 n 0000339720 00000 n 0000339981 00000 n 0000340235 00000 n 0000340497 00000 n 0000340761 00000 n 0000341025 00000 n 0000341292 00000 n 0000341557 00000 n 0000341835 00000 n 0000342107 00000 n 0000342284 00000 n 0000342468 00000 n 0000342747 00000 n 0000343018 00000 n 0000343297 00000 n 0000343562 00000 n 0000343817 00000 n 0000344072 00000 n 0000344319 00000 n 0000344574 00000 n 0000344833 00000 n 0000346244 00000 n 0000355990 00000 n 0000345225 00000 n 0000345403 00000 n 0000381344 00000 n 0000356013 00000 n 0000356273 00000 n 0000356549 00000 n 0000356794 00000 n 0000357043 00000 n 0000357299 00000 n 0000357548 00000 n 0000357804 00000 n 0000358077 00000 n 0000358326 00000 n 0000358593 00000 n 0000358842 00000 n 0000359082 00000 n 0000359341 00000 n 0000359593 00000 n 0000359852 00000 n 0000360104 00000 n 0000360349 00000 n 0000360608 00000 n 0000360860 00000 n 0000361105 00000 n 0000361358 00000 n 0000361611 00000 n 0000361864 00000 n 0000362117 00000 n 0000362370 00000 n 0000362630 00000 n 0000362883 00000 n 0000363136 00000 n 0000363396 00000 n 0000363649 00000 n 0000363909 00000 n 0000364169 00000 n 0000364422 00000 n 0000364682 00000 n 0000364930 00000 n 0000365193 00000 n 0000365460 00000 n 0000365706 00000 n 0000365987 00000 n 0000366265 00000 n 0000366518 00000 n 0000366778 00000 n 0000367031 00000 n 0000367284 00000 n 0000367537 00000 n 0000367790 00000 n 0000368050 00000 n 0000368310 00000 n 0000368563 00000 n 0000368823 00000 n 0000369078 00000 n 0000369324 00000 n 0000369584 00000 n 0000369837 00000 n 0000370090 00000 n 0000370359 00000 n 0000370625 00000 n 0000370899 00000 n 0000371169 00000 n 0000371422 00000 n 0000371688 00000 n 0000371954 00000 n 0000372221 00000 n 0000372492 00000 n 0000372756 00000 n 0000373018 00000 n 0000373282 00000 n 0000373540 00000 n 0000373811 00000 n 0000374076 00000 n 0000374345 00000 n 0000374616 00000 n 0000374879 00000 n 0000375153 00000 n 0000375414 00000 n 0000375685 00000 n 0000375952 00000 n 0000376217 00000 n 0000376477 00000 n 0000376737 00000 n 0000376990 00000 n 0000377250 00000 n 0000377503 00000 n 0000377749 00000 n 0000378009 00000 n 0000378255 00000 n 0000378508 00000 n 0000378768 00000 n 0000379014 00000 n 0000379274 00000 n 0000379527 00000 n 0000379780 00000 n 0000380040 00000 n 0000380292 00000 n 0000380552 00000 n 0000380816 00000 n 0000381072 00000 n 0000382556 00000 n 0000390552 00000 n 0000381474 00000 n 0000381652 00000 n 0000415777 00000 n 0000390575 00000 n 0000390828 00000 n 0000391088 00000 n 0000391334 00000 n 0000391603 00000 n 0000391856 00000 n 0000392109 00000 n 0000392369 00000 n 0000392629 00000 n 0000392882 00000 n 0000393142 00000 n 0000393395 00000 n 0000393648 00000 n 0000393908 00000 n 0000394150 00000 n 0000394421 00000 n 0000394691 00000 n 0000394972 00000 n 0000395251 00000 n 0000395522 00000 n 0000395798 00000 n 0000396069 00000 n 0000396328 00000 n 0000396603 00000 n 0000396874 00000 n 0000397136 00000 n 0000397398 00000 n 0000397646 00000 n 0000397922 00000 n 0000398201 00000 n 0000398470 00000 n 0000398742 00000 n 0000399017 00000 n 0000399196 00000 n 0000399382 00000 n 0000399649 00000 n 0000399920 00000 n 0000400202 00000 n 0000400477 00000 n 0000400650 00000 n 0000400930 00000 n 0000401203 00000 n 0000401484 00000 n 0000401758 00000 n 0000402025 00000 n 0000402291 00000 n 0000402566 00000 n 0000402839 00000 n 0000403122 00000 n 0000403383 00000 n 0000403646 00000 n 0000403918 00000 n 0000404183 00000 n 0000404470 00000 n 0000404748 00000 n 0000405023 00000 n 0000405194 00000 n 0000405370 00000 n 0000405636 00000 n 0000405875 00000 n 0000406126 00000 n 0000406384 00000 n 0000406628 00000 n 0000406886 00000 n 0000407137 00000 n 0000407388 00000 n 0000407646 00000 n 0000407897 00000 n 0000408149 00000 n 0000408408 00000 n 0000408653 00000 n 0000408912 00000 n 0000409171 00000 n 0000409416 00000 n 0000409668 00000 n 0000409920 00000 n 0000410172 00000 n 0000410431 00000 n 0000410683 00000 n 0000410942 00000 n 0000411201 00000 n 0000411453 00000 n 0000411712 00000 n 0000411964 00000 n 0000412216 00000 n 0000412475 00000 n 0000412720 00000 n 0000412979 00000 n 0000413238 00000 n 0000413490 00000 n 0000413749 00000 n 0000414001 00000 n 0000414253 00000 n 0000414505 00000 n 0000414756 00000 n 0000415015 00000 n 0000415267 00000 n 0000415518 00000 n 0000416989 00000 n 0000426380 00000 n 0000415907 00000 n 0000416085 00000 n 0000451303 00000 n 0000426403 00000 n 0000426655 00000 n 0000426914 00000 n 0000427166 00000 n 0000427418 00000 n 0000427677 00000 n 0000427922 00000 n 0000428181 00000 n 0000428444 00000 n 0000428696 00000 n 0000428969 00000 n 0000429218 00000 n 0000429471 00000 n 0000429731 00000 n 0000429984 00000 n 0000430237 00000 n 0000430490 00000 n 0000430743 00000 n 0000430996 00000 n 0000431249 00000 n 0000431503 00000 n 0000431764 00000 n 0000432018 00000 n 0000432272 00000 n 0000432533 00000 n 0000432780 00000 n 0000433041 00000 n 0000433295 00000 n 0000433549 00000 n 0000433810 00000 n 0000434064 00000 n 0000434325 00000 n 0000434579 00000 n 0000434833 00000 n 0000435094 00000 n 0000435348 00000 n 0000435602 00000 n 0000435856 00000 n 0000436110 00000 n 0000436371 00000 n 0000436632 00000 n 0000436886 00000 n 0000437147 00000 n 0000437401 00000 n 0000437654 00000 n 0000437918 00000 n 0000438175 00000 n 0000438439 00000 n 0000438703 00000 n 0000438960 00000 n 0000439224 00000 n 0000439481 00000 n 0000439738 00000 n 0000440003 00000 n 0000440261 00000 n 0000440526 00000 n 0000440791 00000 n 0000441049 00000 n 0000441314 00000 n 0000441572 00000 n 0000441830 00000 n 0000442095 00000 n 0000442353 00000 n 0000442611 00000 n 0000442876 00000 n 0000443127 00000 n 0000443392 00000 n 0000443650 00000 n 0000443908 00000 n 0000444173 00000 n 0000444431 00000 n 0000444696 00000 n 0000444954 00000 n 0000445212 00000 n 0000445477 00000 n 0000445735 00000 n 0000446001 00000 n 0000446266 00000 n 0000446524 00000 n 0000446782 00000 n 0000447047 00000 n 0000447298 00000 n 0000447578 00000 n 0000447836 00000 n 0000448094 00000 n 0000448352 00000 n 0000448616 00000 n 0000448888 00000 n 0000449153 00000 n 0000449430 00000 n 0000449699 00000 n 0000449969 00000 n 0000450235 00000 n 0000450509 00000 n 0000450772 00000 n 0000451030 00000 n 0000452497 00000 n 0000461347 00000 n 0000451433 00000 n 0000451611 00000 n 0000476466 00000 n 0000461370 00000 n 0000461425 00000 n 0000461480 00000 n 0000461528 00000 n 0000461583 00000 n 0000461638 00000 n 0000461686 00000 n 0000461741 00000 n 0000461796 00000 n 0000461844 00000 n 0000461892 00000 n 0000461947 00000 n 0000462002 00000 n 0000462057 00000 n 0000462112 00000 n 0000462160 00000 n 0000462215 00000 n 0000462263 00000 n 0000462318 00000 n 0000462569 00000 n 0000462824 00000 n 0000463068 00000 n 0000463321 00000 n 0000463576 00000 n 0000463820 00000 n 0000464082 00000 n 0000464344 00000 n 0000464599 00000 n 0000464855 00000 n 0000465106 00000 n 0000465352 00000 n 0000465611 00000 n 0000465868 00000 n 0000466119 00000 n 0000466377 00000 n 0000466628 00000 n 0000466887 00000 n 0000467138 00000 n 0000467388 00000 n 0000467639 00000 n 0000467888 00000 n 0000468132 00000 n 0000468378 00000 n 0000468634 00000 n 0000468882 00000 n 0000469136 00000 n 0000469382 00000 n 0000469624 00000 n 0000469880 00000 n 0000470134 00000 n 0000470384 00000 n 0000470628 00000 n 0000470876 00000 n 0000471118 00000 n 0000471372 00000 n 0000471631 00000 n 0000471887 00000 n 0000472147 00000 n 0000472401 00000 n 0000472648 00000 n 0000472899 00000 n 0000473153 00000 n 0000473400 00000 n 0000473647 00000 n 0000473901 00000 n 0000474148 00000 n 0000474412 00000 n 0000474660 00000 n 0000474908 00000 n 0000475171 00000 n 0000475428 00000 n 0000475689 00000 n 0000475956 00000 n 0000476207 00000 n 0000477300 00000 n 0000485214 00000 n 0000476596 00000 n 0000476774 00000 n 0000488243 00000 n 0004579423 00000 n 0000485237 00000 n 0000485292 00000 n 0000485340 00000 n 0000485395 00000 n 0000485450 00000 n 0000485505 00000 n 0000485560 00000 n 0000485615 00000 n 0000485670 00000 n 0000485725 00000 n 0000485773 00000 n 0000485828 00000 n 0000485883 00000 n 0000485938 00000 n 0000485993 00000 n 0000486048 00000 n 0000486096 00000 n 0000486151 00000 n 0000486199 00000 n 0000486247 00000 n 0000486302 00000 n 0000486357 00000 n 0000486412 00000 n 0000486684 00000 n 0000486942 00000 n 0000487128 00000 n 0000487303 00000 n 0000487488 00000 n 0000487672 00000 n 0000487866 00000 n 0000488058 00000 n 0000488670 00000 n 0000496752 00000 n 0000488373 00000 n 0000488567 00000 n 0000499634 00000 n 0000496775 00000 n 0000496830 00000 n 0000496885 00000 n 0000496940 00000 n 0000496995 00000 n 0000497050 00000 n 0000497105 00000 n 0000497160 00000 n 0000497215 00000 n 0000497270 00000 n 0000497325 00000 n 0000497576 00000 n 0000497835 00000 n 0000498086 00000 n 0000498350 00000 n 0000498615 00000 n 0000498802 00000 n 0000498991 00000 n 0000499159 00000 n 0000499343 00000 n 0000500070 00000 n 0000509179 00000 n 0000499764 00000 n 0000499958 00000 n 0000513065 00000 n 0000509202 00000 n 0000509257 00000 n 0000509305 00000 n 0000509360 00000 n 0000509408 00000 n 0000509463 00000 n 0000509518 00000 n 0000509565 00000 n 0000509620 00000 n 0000509675 00000 n 0000509722 00000 n 0000509990 00000 n 0000510249 00000 n 0000510501 00000 n 0000510753 00000 n 0000511012 00000 n 0000511264 00000 n 0000511523 00000 n 0000511776 00000 n 0000512029 00000 n 0000512297 00000 n 0000512550 00000 n 0000512796 00000 n 0000513528 00000 n 0000524370 00000 n 0000513195 00000 n 0000513389 00000 n 0000525364 00000 n 0004532034 00000 n 0000524394 00000 n 0000524449 00000 n 0000524504 00000 n 0000524559 00000 n 0000524607 00000 n 0000524662 00000 n 0000524717 00000 n 0000524772 00000 n 0000524827 00000 n 0000525091 00000 n 0000525744 00000 n 0000531247 00000 n 0000525494 00000 n 0000525704 00000 n 0000533787 00000 n 0000531270 00000 n 0000531325 00000 n 0000531380 00000 n 0000531435 00000 n 0000531490 00000 n 0000531545 00000 n 0000531600 00000 n 0000531655 00000 n 0000531710 00000 n 0000531758 00000 n 0000531813 00000 n 0000532075 00000 n 0000532337 00000 n 0000532599 00000 n 0000532792 00000 n 0000532971 00000 n 0000533163 00000 n 0000533399 00000 n 0000533607 00000 n 0000534230 00000 n 0000541874 00000 n 0000533917 00000 n 0000534127 00000 n 0000548694 00000 n 0000541897 00000 n 0000541952 00000 n 0000542000 00000 n 0000542055 00000 n 0000542110 00000 n 0000542158 00000 n 0000542213 00000 n 0000542261 00000 n 0000542316 00000 n 0000542364 00000 n 0000542419 00000 n 0000542474 00000 n 0000542529 00000 n 0000542584 00000 n 0000542639 00000 n 0000542694 00000 n 0000542749 00000 n 0000542804 00000 n 0000542859 00000 n 0000543122 00000 n 0000543376 00000 n 0000543628 00000 n 0000543892 00000 n 0000544143 00000 n 0000544399 00000 n 0000544655 00000 n 0000544906 00000 n 0000545161 00000 n 0000545407 00000 n 0000545656 00000 n 0000545922 00000 n 0000546171 00000 n 0000546430 00000 n 0000546692 00000 n 0000546943 00000 n 0000547216 00000 n 0000547475 00000 n 0000547733 00000 n 0000547986 00000 n 0000548238 00000 n 0000548512 00000 n 0000549263 00000 n 0000558679 00000 n 0000548824 00000 n 0000549034 00000 n 0000560776 00000 n 0000558702 00000 n 0000558757 00000 n 0000558812 00000 n 0000558867 00000 n 0000558915 00000 n 0000558970 00000 n 0000559025 00000 n 0000559080 00000 n 0000559135 00000 n 0000559190 00000 n 0000559238 00000 n 0000559293 00000 n 0000559348 00000 n 0000559403 00000 n 0000559458 00000 n 0000559513 00000 n 0000559568 00000 n 0000559623 00000 n 0000559678 00000 n 0000559862 00000 n 0000560038 00000 n 0000560207 00000 n 0000560391 00000 n 0000560582 00000 n 0000561192 00000 n 0000568054 00000 n 0000560906 00000 n 0000561116 00000 n 0000570417 00000 n 0000568077 00000 n 0000568132 00000 n 0000568187 00000 n 0000568242 00000 n 0000568297 00000 n 0000568352 00000 n 0000568407 00000 n 0000568455 00000 n 0000568510 00000 n 0000568565 00000 n 0000568620 00000 n 0000568869 00000 n 0000569110 00000 n 0000569359 00000 n 0000569607 00000 n 0000569848 00000 n 0000570039 00000 n 0000570242 00000 n 0000570835 00000 n 0000577788 00000 n 0000570547 00000 n 0000570741 00000 n 0000581563 00000 n 0000577811 00000 n 0000579603 00000 n 0000579626 00000 n 0000579681 00000 n 0000579736 00000 n 0000579791 00000 n 0000579846 00000 n 0000579901 00000 n 0000579956 00000 n 0000580011 00000 n 0000580066 00000 n 0000580308 00000 n 0000580564 00000 n 0000580813 00000 n 0000581063 00000 n 0000581320 00000 n 0000581980 00000 n 0000588757 00000 n 0000581693 00000 n 0000581904 00000 n 0000589110 00000 n 0000588780 00000 n 0000588835 00000 n 0000588890 00000 n 0000588945 00000 n 0000589000 00000 n 0000589055 00000 n 0000589456 00000 n 0000594234 00000 n 0000589240 00000 n 0000589434 00000 n 0000598517 00000 n 0000594257 00000 n 0000594312 00000 n 0000594367 00000 n 0000594422 00000 n 0000594477 00000 n 0000594532 00000 n 0000594587 00000 n 0000594642 00000 n 0000594697 00000 n 0000594752 00000 n 0000594807 00000 n 0000595051 00000 n 0000595302 00000 n 0000595549 00000 n 0000595800 00000 n 0000596051 00000 n 0000596295 00000 n 0000596546 00000 n 0000596790 00000 n 0000597035 00000 n 0000597287 00000 n 0000597524 00000 n 0000597776 00000 n 0000598028 00000 n 0000598265 00000 n 0000598998 00000 n 0000606652 00000 n 0000598647 00000 n 0000598841 00000 n 0000616305 00000 n 0004537629 00000 n 0004546417 00000 n 0000606675 00000 n 0000606730 00000 n 0000606785 00000 n 0000607023 00000 n 0000607275 00000 n 0000607520 00000 n 0000607765 00000 n 0000608017 00000 n 0000608262 00000 n 0000608514 00000 n 0000608766 00000 n 0000609004 00000 n 0000609256 00000 n 0000609515 00000 n 0000609769 00000 n 0000610022 00000 n 0000610281 00000 n 0000610547 00000 n 0000610811 00000 n 0000611064 00000 n 0000611316 00000 n 0000611561 00000 n 0000611806 00000 n 0000612058 00000 n 0000612303 00000 n 0000612573 00000 n 0000612818 00000 n 0000613075 00000 n 0000613337 00000 n 0000613582 00000 n 0000613827 00000 n 0000614079 00000 n 0000614324 00000 n 0000614576 00000 n 0000614828 00000 n 0000615073 00000 n 0000615318 00000 n 0000615563 00000 n 0000615808 00000 n 0000616060 00000 n 0000617025 00000 n 0000624526 00000 n 0000616435 00000 n 0000616661 00000 n 0000625010 00000 n 0000624549 00000 n 0000624604 00000 n 0000624651 00000 n 0000624706 00000 n 0000624753 00000 n 0000625397 00000 n 0000632794 00000 n 0000625140 00000 n 0000625366 00000 n 0000633773 00000 n 0000632817 00000 n 0000632872 00000 n 0000632927 00000 n 0000632982 00000 n 0000633037 00000 n 0000633092 00000 n 0000633147 00000 n 0000633202 00000 n 0000633257 00000 n 0000633506 00000 n 0000634137 00000 n 0000641927 00000 n 0000633903 00000 n 0000634097 00000 n 0000642149 00000 n 0000641950 00000 n 0000642005 00000 n 0000642053 00000 n 0000642101 00000 n 0000642511 00000 n 0000649071 00000 n 0000642279 00000 n 0000642489 00000 n 0000649559 00000 n 0000649094 00000 n 0000649149 00000 n 0000649204 00000 n 0000649259 00000 n 0000649314 00000 n 0000649914 00000 n 0000657204 00000 n 0000649689 00000 n 0000649883 00000 n 0000658177 00000 n 0000657227 00000 n 0000657282 00000 n 0000657337 00000 n 0000657392 00000 n 0000657447 00000 n 0000657502 00000 n 0000657557 00000 n 0000657612 00000 n 0000657667 00000 n 0000657918 00000 n 0000658541 00000 n 0000666312 00000 n 0000658307 00000 n 0000658501 00000 n 0000666665 00000 n 0000666335 00000 n 0000666390 00000 n 0000666445 00000 n 0000666500 00000 n 0000666555 00000 n 0000666610 00000 n 0000667011 00000 n 0000674865 00000 n 0000666795 00000 n 0000666989 00000 n 0000675321 00000 n 0000674888 00000 n 0000674943 00000 n 0000674998 00000 n 0000675046 00000 n 0000675101 00000 n 0000675156 00000 n 0000675211 00000 n 0000675266 00000 n 0000675667 00000 n 0000680418 00000 n 0000675451 00000 n 0000675645 00000 n 0000680661 00000 n 0000680441 00000 n 0000680496 00000 n 0000680551 00000 n 0000680606 00000 n 0000681023 00000 n 0000686688 00000 n 0000680791 00000 n 0000681001 00000 n 0000686917 00000 n 0000686711 00000 n 0000686766 00000 n 0000686821 00000 n 0000686869 00000 n 0000687279 00000 n 0000692382 00000 n 0000687047 00000 n 0000687257 00000 n 0000693297 00000 n 0000692405 00000 n 0000692453 00000 n 0000692508 00000 n 0000692563 00000 n 0000692611 00000 n 0000692877 00000 n 0000693129 00000 n 0000693670 00000 n 0000699973 00000 n 0000693427 00000 n 0000693621 00000 n 0000700289 00000 n 0000699996 00000 n 0000700051 00000 n 0000700106 00000 n 0000700660 00000 n 0000712917 00000 n 0000700419 00000 n 0000700629 00000 n 0000713446 00000 n 0000712941 00000 n 0000712996 00000 n 0000713051 00000 n 0000713106 00000 n 0000713161 00000 n 0000713216 00000 n 0000713271 00000 n 0000713801 00000 n 0000720063 00000 n 0000713576 00000 n 0000713770 00000 n 0000720461 00000 n 0000720086 00000 n 0000720141 00000 n 0000720196 00000 n 0000720816 00000 n 0000726043 00000 n 0000720591 00000 n 0000720785 00000 n 0000726809 00000 n 0000726066 00000 n 0000726121 00000 n 0000726176 00000 n 0000726231 00000 n 0000726286 00000 n 0000726538 00000 n 0000727173 00000 n 0000731734 00000 n 0000726939 00000 n 0000727133 00000 n 0000732344 00000 n 0000731757 00000 n 0000731812 00000 n 0000731860 00000 n 0000731915 00000 n 0000731963 00000 n 0000732018 00000 n 0000732073 00000 n 0000732715 00000 n 0000737835 00000 n 0000732474 00000 n 0000732684 00000 n 0000738078 00000 n 0000737858 00000 n 0000737913 00000 n 0000737968 00000 n 0000738023 00000 n 0000738440 00000 n 0000744257 00000 n 0000738208 00000 n 0000738418 00000 n 0000744280 00000 n 0000744626 00000 n 0000748375 00000 n 0000744410 00000 n 0000744604 00000 n 0000748508 00000 n 0000748398 00000 n 0000748453 00000 n 0000748854 00000 n 0000753117 00000 n 0000748638 00000 n 0000748832 00000 n 0000753847 00000 n 0000753140 00000 n 0000753195 00000 n 0000753250 00000 n 0000753305 00000 n 0000753360 00000 n 0000753415 00000 n 0000753470 00000 n 0000753525 00000 n 0000753580 00000 n 0000754202 00000 n 0000760744 00000 n 0000753977 00000 n 0000754171 00000 n 0000760877 00000 n 0000760767 00000 n 0000760822 00000 n 0000761223 00000 n 0000765173 00000 n 0000761007 00000 n 0000761201 00000 n 0000766368 00000 n 0000765196 00000 n 0000765251 00000 n 0000765306 00000 n 0000765361 00000 n 0000765416 00000 n 0000765464 00000 n 0000765519 00000 n 0000765574 00000 n 0000765629 00000 n 0000765684 00000 n 0000765739 00000 n 0000765991 00000 n 0000766176 00000 n 0000766741 00000 n 0000773899 00000 n 0000766498 00000 n 0000766692 00000 n 0000787933 00000 n 0000773922 00000 n 0000773970 00000 n 0000774025 00000 n 0000774080 00000 n 0000774135 00000 n 0000774183 00000 n 0000774238 00000 n 0000774493 00000 n 0000774741 00000 n 0000774996 00000 n 0000775244 00000 n 0000775493 00000 n 0000775749 00000 n 0000775998 00000 n 0000776254 00000 n 0000776502 00000 n 0000776750 00000 n 0000777005 00000 n 0000777253 00000 n 0000777495 00000 n 0000777751 00000 n 0000778000 00000 n 0000778263 00000 n 0000778511 00000 n 0000778753 00000 n 0000779009 00000 n 0000779258 00000 n 0000779500 00000 n 0000779756 00000 n 0000779998 00000 n 0000780262 00000 n 0000780525 00000 n 0000780774 00000 n 0000781030 00000 n 0000781197 00000 n 0000781446 00000 n 0000781702 00000 n 0000781955 00000 n 0000782211 00000 n 0000782481 00000 n 0000782744 00000 n 0000783012 00000 n 0000783283 00000 n 0000783551 00000 n 0000783818 00000 n 0000784079 00000 n 0000784344 00000 n 0000784606 00000 n 0000784850 00000 n 0000785028 00000 n 0000785297 00000 n 0000785549 00000 n 0000785805 00000 n 0000786057 00000 n 0000786318 00000 n 0000786574 00000 n 0000786833 00000 n 0000787090 00000 n 0000787359 00000 n 0000787518 00000 n 0000787692 00000 n 0000788774 00000 n 0000798838 00000 n 0000788063 00000 n 0000788257 00000 n 0000800548 00000 n 0000798861 00000 n 0000798916 00000 n 0000798971 00000 n 0000799026 00000 n 0000799081 00000 n 0000799129 00000 n 0000799184 00000 n 0000799239 00000 n 0000799294 00000 n 0000799349 00000 n 0000799404 00000 n 0000799459 00000 n 0000799514 00000 n 0000799776 00000 n 0000800038 00000 n 0000800300 00000 n 0000800930 00000 n 0000810793 00000 n 0000800678 00000 n 0000800872 00000 n 0000810926 00000 n 0000810816 00000 n 0000810871 00000 n 0000811288 00000 n 0000816336 00000 n 0000811056 00000 n 0000811266 00000 n 0000816778 00000 n 0000816359 00000 n 0000816407 00000 n 0000816455 00000 n 0000816510 00000 n 0000816558 00000 n 0000816613 00000 n 0000816668 00000 n 0000816723 00000 n 0000817124 00000 n 0000822105 00000 n 0000816908 00000 n 0000817102 00000 n 0000822516 00000 n 0000822128 00000 n 0000822183 00000 n 0000822238 00000 n 0000822871 00000 n 0000829482 00000 n 0000822646 00000 n 0000822840 00000 n 0000830459 00000 n 0000829505 00000 n 0000829560 00000 n 0000829615 00000 n 0000829670 00000 n 0000829725 00000 n 0000829780 00000 n 0000829835 00000 n 0000829890 00000 n 0000829945 00000 n 0000830195 00000 n 0000830839 00000 n 0000835854 00000 n 0000830589 00000 n 0000830799 00000 n 0000836676 00000 n 0000835877 00000 n 0000836141 00000 n 0000836405 00000 n 0000837049 00000 n 0000843241 00000 n 0000836806 00000 n 0000837000 00000 n 0000843690 00000 n 0000843264 00000 n 0000843319 00000 n 0000843367 00000 n 0000843422 00000 n 0000843477 00000 n 0000843532 00000 n 0000843587 00000 n 0000843635 00000 n 0000844052 00000 n 0000848415 00000 n 0000843820 00000 n 0000844030 00000 n 0000848541 00000 n 0000848438 00000 n 0000848493 00000 n 0000848887 00000 n 0000854470 00000 n 0000848671 00000 n 0000848865 00000 n 0000854860 00000 n 0000854493 00000 n 0000854541 00000 n 0000854596 00000 n 0000855231 00000 n 0000861046 00000 n 0000854990 00000 n 0000855200 00000 n 0000861275 00000 n 0000861069 00000 n 0000861124 00000 n 0000861172 00000 n 0000861227 00000 n 0000861637 00000 n 0000867928 00000 n 0000861405 00000 n 0000861615 00000 n 0000869713 00000 n 0000867951 00000 n 0000868006 00000 n 0000868061 00000 n 0000868116 00000 n 0000868171 00000 n 0000868449 00000 n 0000868728 00000 n 0000868903 00000 n 0000869167 00000 n 0000869445 00000 n 0000870113 00000 n 0000876400 00000 n 0000869843 00000 n 0000870037 00000 n 0000876519 00000 n 0000876423 00000 n 0000876471 00000 n 0000876865 00000 n 0000881779 00000 n 0000876649 00000 n 0000876843 00000 n 0000882090 00000 n 0000881802 00000 n 0000881857 00000 n 0000881912 00000 n 0000882445 00000 n 0000888316 00000 n 0000882220 00000 n 0000882414 00000 n 0000888517 00000 n 0000888339 00000 n 0000888872 00000 n 0000894602 00000 n 0000888647 00000 n 0000888841 00000 n 0000894890 00000 n 0000894625 00000 n 0000895235 00000 n 0000899550 00000 n 0000895020 00000 n 0000895204 00000 n 0000899793 00000 n 0000899573 00000 n 0000899628 00000 n 0000899683 00000 n 0000899738 00000 n 0000900155 00000 n 0000905804 00000 n 0000899923 00000 n 0000900133 00000 n 0000905930 00000 n 0000905827 00000 n 0000905882 00000 n 0000906292 00000 n 0000912470 00000 n 0000906060 00000 n 0000906270 00000 n 0000913148 00000 n 0000912493 00000 n 0000912541 00000 n 0000912589 00000 n 0000912644 00000 n 0000912692 00000 n 0000912876 00000 n 0000913512 00000 n 0000919120 00000 n 0000913278 00000 n 0000913472 00000 n 0000919363 00000 n 0000919143 00000 n 0000919198 00000 n 0000919253 00000 n 0000919308 00000 n 0000919725 00000 n 0000924354 00000 n 0000919493 00000 n 0000919703 00000 n 0000924597 00000 n 0000924377 00000 n 0000924432 00000 n 0000924487 00000 n 0000924542 00000 n 0000924959 00000 n 0000930218 00000 n 0000924727 00000 n 0000924937 00000 n 0000930351 00000 n 0000930241 00000 n 0000930296 00000 n 0000930697 00000 n 0000934402 00000 n 0000930481 00000 n 0000930675 00000 n 0000934535 00000 n 0000934425 00000 n 0000934480 00000 n 0000934881 00000 n 0000939006 00000 n 0000934665 00000 n 0000934859 00000 n 0000939139 00000 n 0000939029 00000 n 0000939084 00000 n 0000939501 00000 n 0000943231 00000 n 0000939269 00000 n 0000939479 00000 n 0000943615 00000 n 0000943254 00000 n 0000943309 00000 n 0000943357 00000 n 0000943970 00000 n 0000949644 00000 n 0000943745 00000 n 0000943939 00000 n 0000949925 00000 n 0000949667 00000 n 0000950270 00000 n 0000954702 00000 n 0000950055 00000 n 0000950239 00000 n 0000954725 00000 n 0000955087 00000 n 0000960236 00000 n 0000954855 00000 n 0000955065 00000 n 0000960635 00000 n 0000960259 00000 n 0000960314 00000 n 0000960369 00000 n 0000961006 00000 n 0000965613 00000 n 0000960765 00000 n 0000960975 00000 n 0000965848 00000 n 0000965636 00000 n 0000965691 00000 n 0000965746 00000 n 0000965793 00000 n 0000966194 00000 n 0000971033 00000 n 0000965978 00000 n 0000966172 00000 n 0000972180 00000 n 0000971056 00000 n 0000971111 00000 n 0000971159 00000 n 0000971207 00000 n 0000971255 00000 n 0000971310 00000 n 0000971365 00000 n 0000971639 00000 n 0000971913 00000 n 0000972569 00000 n 0000979146 00000 n 0000972310 00000 n 0000972520 00000 n 0000979169 00000 n 0000979505 00000 n 0000983975 00000 n 0000979299 00000 n 0000979483 00000 n 0000984381 00000 n 0000983998 00000 n 0000984053 00000 n 0000984108 00000 n 0000984752 00000 n 0000988630 00000 n 0000984511 00000 n 0000984721 00000 n 0000989023 00000 n 0000988653 00000 n 0000988708 00000 n 0000988763 00000 n 0000989378 00000 n 0000994152 00000 n 0000989153 00000 n 0000989347 00000 n 0000994565 00000 n 0000994175 00000 n 0000994230 00000 n 0000994285 00000 n 0000994333 00000 n 0000994388 00000 n 0000994920 00000 n 0001001220 00000 n 0000994695 00000 n 0000994889 00000 n 0001002051 00000 n 0001001243 00000 n 0001001298 00000 n 0001001346 00000 n 0001001394 00000 n 0001001442 00000 n 0001001490 00000 n 0001001545 00000 n 0001001798 00000 n 0001002415 00000 n 0001009067 00000 n 0001002181 00000 n 0001002375 00000 n 0001019986 00000 n 0001009090 00000 n 0001009145 00000 n 0001009193 00000 n 0001009248 00000 n 0001009303 00000 n 0001009358 00000 n 0001009413 00000 n 0001009461 00000 n 0001009509 00000 n 0001009557 00000 n 0001009612 00000 n 0001009872 00000 n 0001010141 00000 n 0001010310 00000 n 0001010474 00000 n 0001010744 00000 n 0001011009 00000 n 0001011279 00000 n 0001011548 00000 n 0001011816 00000 n 0001011994 00000 n 0001012274 00000 n 0001012437 00000 n 0001012709 00000 n 0001012971 00000 n 0001013138 00000 n 0001013414 00000 n 0001013581 00000 n 0001013851 00000 n 0001014118 00000 n 0001014384 00000 n 0001014649 00000 n 0001014916 00000 n 0001015185 00000 n 0001015460 00000 n 0001015725 00000 n 0001015998 00000 n 0001016270 00000 n 0001016524 00000 n 0001016787 00000 n 0001017044 00000 n 0001017302 00000 n 0001017564 00000 n 0001017829 00000 n 0001018104 00000 n 0001018370 00000 n 0001018629 00000 n 0001018896 00000 n 0001019061 00000 n 0001019217 00000 n 0001019489 00000 n 0001019649 00000 n 0001019814 00000 n 0001020719 00000 n 0001029451 00000 n 0001020116 00000 n 0001020310 00000 n 0001029804 00000 n 0001029474 00000 n 0001029529 00000 n 0001029584 00000 n 0001029639 00000 n 0001029694 00000 n 0001029749 00000 n 0001030150 00000 n 0001035412 00000 n 0001029934 00000 n 0001030128 00000 n 0001035875 00000 n 0001035435 00000 n 0001035490 00000 n 0001035545 00000 n 0001035600 00000 n 0001035655 00000 n 0001035710 00000 n 0001035765 00000 n 0001035820 00000 n 0001036221 00000 n 0001040678 00000 n 0001036005 00000 n 0001036199 00000 n 0001041031 00000 n 0001040701 00000 n 0001040756 00000 n 0001040811 00000 n 0001040866 00000 n 0001040921 00000 n 0001040976 00000 n 0001041377 00000 n 0001045301 00000 n 0001041161 00000 n 0001041355 00000 n 0001045764 00000 n 0001045324 00000 n 0001045379 00000 n 0001045434 00000 n 0001045489 00000 n 0001045544 00000 n 0001045599 00000 n 0001045654 00000 n 0001045709 00000 n 0001046110 00000 n 0001050212 00000 n 0001045894 00000 n 0001046088 00000 n 0001050911 00000 n 0001050235 00000 n 0001050290 00000 n 0001050345 00000 n 0001050400 00000 n 0001050455 00000 n 0001050510 00000 n 0001050558 00000 n 0001050613 00000 n 0001050661 00000 n 0001051266 00000 n 0001056225 00000 n 0001051041 00000 n 0001051235 00000 n 0001056660 00000 n 0001056248 00000 n 0001056303 00000 n 0001056358 00000 n 0001056406 00000 n 0001056454 00000 n 0001056502 00000 n 0001056550 00000 n 0001056605 00000 n 0001057006 00000 n 0001062084 00000 n 0001056790 00000 n 0001056984 00000 n 0001062835 00000 n 0001062107 00000 n 0001062155 00000 n 0001062210 00000 n 0001062265 00000 n 0001062320 00000 n 0001062368 00000 n 0001062416 00000 n 0001062471 00000 n 0001062526 00000 n 0001062581 00000 n 0001062629 00000 n 0001062677 00000 n 0001062725 00000 n 0001062780 00000 n 0001063181 00000 n 0001068328 00000 n 0001062965 00000 n 0001063159 00000 n 0001069732 00000 n 0001068351 00000 n 0001068406 00000 n 0001068454 00000 n 0001068502 00000 n 0001068557 00000 n 0001068612 00000 n 0001068667 00000 n 0001068715 00000 n 0001068770 00000 n 0001068825 00000 n 0001068880 00000 n 0001068935 00000 n 0001068983 00000 n 0001069038 00000 n 0001069093 00000 n 0001069148 00000 n 0001069203 00000 n 0001069459 00000 n 0001070112 00000 n 0001075767 00000 n 0001069862 00000 n 0001070072 00000 n 0001076120 00000 n 0001075790 00000 n 0001075845 00000 n 0001075900 00000 n 0001075955 00000 n 0001076010 00000 n 0001076065 00000 n 0001076466 00000 n 0001082131 00000 n 0001076250 00000 n 0001076444 00000 n 0001086045 00000 n 0001082154 00000 n 0001082209 00000 n 0001082264 00000 n 0001082319 00000 n 0001082374 00000 n 0001082429 00000 n 0001082484 00000 n 0001082539 00000 n 0001082594 00000 n 0001082642 00000 n 0001082697 00000 n 0001082745 00000 n 0001082793 00000 n 0001082848 00000 n 0001082903 00000 n 0001082958 00000 n 0001083013 00000 n 0001083068 00000 n 0001083123 00000 n 0001083178 00000 n 0001083233 00000 n 0001083486 00000 n 0001083746 00000 n 0001084015 00000 n 0001084278 00000 n 0001084543 00000 n 0001084803 00000 n 0001085072 00000 n 0001085337 00000 n 0001085608 00000 n 0001085780 00000 n 0001086490 00000 n 0001091556 00000 n 0001086175 00000 n 0001086369 00000 n 0001095572 00000 n 0001091579 00000 n 0001091627 00000 n 0001091682 00000 n 0001091737 00000 n 0001091785 00000 n 0001091840 00000 n 0001091895 00000 n 0001091950 00000 n 0001092005 00000 n 0001092060 00000 n 0001092115 00000 n 0001092163 00000 n 0001092218 00000 n 0001092477 00000 n 0001092736 00000 n 0001092999 00000 n 0001093258 00000 n 0001093510 00000 n 0001093762 00000 n 0001094028 00000 n 0001094280 00000 n 0001094532 00000 n 0001094806 00000 n 0001095052 00000 n 0001095314 00000 n 0001096035 00000 n 0001102552 00000 n 0001095702 00000 n 0001095896 00000 n 0001102898 00000 n 0001102575 00000 n 0001102630 00000 n 0001102678 00000 n 0001102733 00000 n 0001102788 00000 n 0001102843 00000 n 0001103244 00000 n 0001108631 00000 n 0001103028 00000 n 0001103222 00000 n 0001109339 00000 n 0001108654 00000 n 0001108709 00000 n 0001108764 00000 n 0001108812 00000 n 0001108867 00000 n 0001108922 00000 n 0001108977 00000 n 0001109032 00000 n 0001109080 00000 n 0001109694 00000 n 0001113940 00000 n 0001109469 00000 n 0001109663 00000 n 0001120756 00000 n 0001113963 00000 n 0001114018 00000 n 0001114073 00000 n 0001114128 00000 n 0001114183 00000 n 0001114238 00000 n 0001114293 00000 n 0001114348 00000 n 0001114403 00000 n 0001114458 00000 n 0001114513 00000 n 0001114568 00000 n 0001114623 00000 n 0001114870 00000 n 0001115110 00000 n 0001115357 00000 n 0001115615 00000 n 0001115862 00000 n 0001116116 00000 n 0001116363 00000 n 0001116610 00000 n 0001116865 00000 n 0001117113 00000 n 0001117368 00000 n 0001117627 00000 n 0001117881 00000 n 0001118142 00000 n 0001118400 00000 n 0001118658 00000 n 0001118927 00000 n 0001119194 00000 n 0001119468 00000 n 0001119740 00000 n 0001120005 00000 n 0001120268 00000 n 0001120508 00000 n 0001121318 00000 n 0001129265 00000 n 0001120886 00000 n 0001121080 00000 n 0001129288 00000 n 0001129640 00000 n 0001134756 00000 n 0001129418 00000 n 0001129618 00000 n 0001134889 00000 n 0001134779 00000 n 0001134834 00000 n 0001135251 00000 n 0001140158 00000 n 0001135019 00000 n 0001135229 00000 n 0001140385 00000 n 0001140181 00000 n 0001140236 00000 n 0001140283 00000 n 0001140338 00000 n 0001140763 00000 n 0001145076 00000 n 0001140515 00000 n 0001140741 00000 n 0001145435 00000 n 0001145099 00000 n 0001145155 00000 n 0001145211 00000 n 0001145267 00000 n 0001145323 00000 n 0001145379 00000 n 0001145813 00000 n 0001151567 00000 n 0001145565 00000 n 0001145791 00000 n 0001152074 00000 n 0004560451 00000 n 0001151590 00000 n 0001151646 00000 n 0001151702 00000 n 0001151758 00000 n 0001151814 00000 n 0001152461 00000 n 0001158104 00000 n 0001152204 00000 n 0001152430 00000 n 0001158127 00000 n 0001158521 00000 n 0001163887 00000 n 0001158257 00000 n 0001158499 00000 n 0001164022 00000 n 0001163910 00000 n 0001163966 00000 n 0001164384 00000 n 0001172760 00000 n 0001164152 00000 n 0001164362 00000 n 0001172993 00000 n 0001172783 00000 n 0001172839 00000 n 0001172888 00000 n 0001172944 00000 n 0001173339 00000 n 0001178589 00000 n 0001173123 00000 n 0001173317 00000 n 0001178710 00000 n 0001178612 00000 n 0001178661 00000 n 0001179056 00000 n 0001183911 00000 n 0001178840 00000 n 0001179034 00000 n 0001184516 00000 n 0001183934 00000 n 0001183983 00000 n 0001184039 00000 n 0001184095 00000 n 0001184151 00000 n 0001184200 00000 n 0001184256 00000 n 0001184871 00000 n 0001190871 00000 n 0001184646 00000 n 0001184840 00000 n 0001191869 00000 n 0001190894 00000 n 0001190950 00000 n 0001191006 00000 n 0001191062 00000 n 0001191118 00000 n 0001191174 00000 n 0001191230 00000 n 0001191286 00000 n 0001191342 00000 n 0001191599 00000 n 0001192233 00000 n 0001196589 00000 n 0001191999 00000 n 0001192193 00000 n 0001199629 00000 n 0001196612 00000 n 0001196661 00000 n 0001196710 00000 n 0001196759 00000 n 0001196808 00000 n 0001196864 00000 n 0001196920 00000 n 0001196976 00000 n 0001197025 00000 n 0001197081 00000 n 0001197130 00000 n 0001197379 00000 n 0001197628 00000 n 0001197877 00000 n 0001198126 00000 n 0001198382 00000 n 0001198638 00000 n 0001198880 00000 n 0001199136 00000 n 0001199386 00000 n 0001200081 00000 n 0001205906 00000 n 0001199759 00000 n 0001199969 00000 n 0001206041 00000 n 0001205929 00000 n 0001205985 00000 n 0001206387 00000 n 0001210602 00000 n 0001206171 00000 n 0001206365 00000 n 0001210849 00000 n 0001210625 00000 n 0001210681 00000 n 0001210737 00000 n 0001210793 00000 n 0001211195 00000 n 0001214393 00000 n 0001210979 00000 n 0001211173 00000 n 0001214976 00000 n 0001214416 00000 n 0001214472 00000 n 0001214528 00000 n 0001214584 00000 n 0001214640 00000 n 0001214696 00000 n 0001214752 00000 n 0001214808 00000 n 0001214864 00000 n 0001214920 00000 n 0001215322 00000 n 0001220655 00000 n 0001215106 00000 n 0001215300 00000 n 0001237519 00000 n 0001220678 00000 n 0001220734 00000 n 0001220790 00000 n 0001220839 00000 n 0001220895 00000 n 0001220944 00000 n 0001220993 00000 n 0001221241 00000 n 0001221489 00000 n 0001221744 00000 n 0001221985 00000 n 0001222240 00000 n 0001222495 00000 n 0001222743 00000 n 0001223002 00000 n 0001223250 00000 n 0001223499 00000 n 0001223752 00000 n 0001224001 00000 n 0001224250 00000 n 0001224499 00000 n 0001224748 00000 n 0001225009 00000 n 0001225258 00000 n 0001225521 00000 n 0001225770 00000 n 0001225941 00000 n 0001226214 00000 n 0001226482 00000 n 0001226731 00000 n 0001226987 00000 n 0001227236 00000 n 0001227491 00000 n 0001227759 00000 n 0001228022 00000 n 0001228296 00000 n 0001228568 00000 n 0001228841 00000 n 0001229097 00000 n 0001229339 00000 n 0001229588 00000 n 0001229844 00000 n 0001230086 00000 n 0001230342 00000 n 0001230598 00000 n 0001230847 00000 n 0001231103 00000 n 0001231352 00000 n 0001231600 00000 n 0001231856 00000 n 0001232105 00000 n 0001232354 00000 n 0001232620 00000 n 0001232869 00000 n 0001233125 00000 n 0001233374 00000 n 0001233616 00000 n 0001233875 00000 n 0001234143 00000 n 0001234403 00000 n 0001234664 00000 n 0001234937 00000 n 0001235213 00000 n 0001235471 00000 n 0001235720 00000 n 0001235998 00000 n 0001236247 00000 n 0001236516 00000 n 0001236772 00000 n 0001237021 00000 n 0001237277 00000 n 0001238466 00000 n 0001247557 00000 n 0001237649 00000 n 0001237859 00000 n 0001247790 00000 n 0001247580 00000 n 0001247629 00000 n 0001247685 00000 n 0001247734 00000 n 0001248152 00000 n 0001253712 00000 n 0001247920 00000 n 0001248130 00000 n 0001253833 00000 n 0001253735 00000 n 0001253784 00000 n 0001254195 00000 n 0001259021 00000 n 0001253963 00000 n 0001254173 00000 n 0001259532 00000 n 0001259044 00000 n 0001259100 00000 n 0001259156 00000 n 0001259212 00000 n 0001259268 00000 n 0001259919 00000 n 0001265955 00000 n 0001259662 00000 n 0001259888 00000 n 0001267353 00000 n 0001265978 00000 n 0001266034 00000 n 0001266090 00000 n 0001266146 00000 n 0001266195 00000 n 0001266244 00000 n 0001266300 00000 n 0001266356 00000 n 0001266405 00000 n 0001266648 00000 n 0001266915 00000 n 0001267128 00000 n 0001267767 00000 n 0001274570 00000 n 0001267483 00000 n 0001267709 00000 n 0001274887 00000 n 0001274593 00000 n 0001274642 00000 n 0001274691 00000 n 0001274740 00000 n 0001274789 00000 n 0001274838 00000 n 0001275233 00000 n 0001279231 00000 n 0001275017 00000 n 0001275211 00000 n 0001279583 00000 n 0001279254 00000 n 0001279310 00000 n 0001279366 00000 n 0001279415 00000 n 0001279471 00000 n 0001279527 00000 n 0001279929 00000 n 0001285319 00000 n 0001279713 00000 n 0001279907 00000 n 0001285454 00000 n 0001285342 00000 n 0001285398 00000 n 0001285800 00000 n 0001289661 00000 n 0001285584 00000 n 0001285778 00000 n 0001289796 00000 n 0001289684 00000 n 0001289740 00000 n 0001290142 00000 n 0001296134 00000 n 0001289926 00000 n 0001290120 00000 n 0001296861 00000 n 0001296157 00000 n 0001296206 00000 n 0001296255 00000 n 0001296304 00000 n 0001296353 00000 n 0001296592 00000 n 0001297225 00000 n 0001303222 00000 n 0001296991 00000 n 0001297185 00000 n 0001303621 00000 n 0001303245 00000 n 0001303301 00000 n 0001303357 00000 n 0001303976 00000 n 0001309035 00000 n 0001303751 00000 n 0001303945 00000 n 0001309349 00000 n 0001309058 00000 n 0001309114 00000 n 0001309170 00000 n 0001309704 00000 n 0001315126 00000 n 0001309479 00000 n 0001309673 00000 n 0001315373 00000 n 0001315149 00000 n 0001315205 00000 n 0001315261 00000 n 0001315317 00000 n 0001315735 00000 n 0001320438 00000 n 0001315503 00000 n 0001315713 00000 n 0001320559 00000 n 0001320461 00000 n 0001320510 00000 n 0001320937 00000 n 0001327778 00000 n 0001320689 00000 n 0001320915 00000 n 0001328944 00000 n 0001327801 00000 n 0001327857 00000 n 0001327913 00000 n 0001327969 00000 n 0001328025 00000 n 0001328081 00000 n 0001328137 00000 n 0001328416 00000 n 0001328676 00000 n 0001329317 00000 n 0001335432 00000 n 0001329074 00000 n 0001329268 00000 n 0001335861 00000 n 0001335455 00000 n 0001335504 00000 n 0001335553 00000 n 0001335602 00000 n 0001335658 00000 n 0001335707 00000 n 0001335756 00000 n 0001335805 00000 n 0001336207 00000 n 0001340325 00000 n 0001335991 00000 n 0001336185 00000 n 0001342067 00000 n 0001340348 00000 n 0001340404 00000 n 0001340460 00000 n 0001340516 00000 n 0001340572 00000 n 0001340628 00000 n 0001340684 00000 n 0001340740 00000 n 0001340796 00000 n 0001340852 00000 n 0001340908 00000 n 0001340964 00000 n 0001341020 00000 n 0001341289 00000 n 0001341546 00000 n 0001341806 00000 n 0001342465 00000 n 0001348199 00000 n 0001342197 00000 n 0001342407 00000 n 0001349519 00000 n 0001348222 00000 n 0001348278 00000 n 0001348334 00000 n 0001348390 00000 n 0001348446 00000 n 0001348502 00000 n 0001348558 00000 n 0001348614 00000 n 0001348663 00000 n 0001348719 00000 n 0001348775 00000 n 0001348831 00000 n 0001348887 00000 n 0001348943 00000 n 0001348992 00000 n 0001349259 00000 n 0001349899 00000 n 0001355876 00000 n 0001349649 00000 n 0001349859 00000 n 0001356397 00000 n 0001355899 00000 n 0001355955 00000 n 0001356011 00000 n 0001356067 00000 n 0001356123 00000 n 0001356752 00000 n 0001361027 00000 n 0001356527 00000 n 0001356721 00000 n 0001361050 00000 n 0001361386 00000 n 0001366171 00000 n 0001361180 00000 n 0001361364 00000 n 0001366808 00000 n 0001366194 00000 n 0001366243 00000 n 0001366299 00000 n 0001366355 00000 n 0001366411 00000 n 0001366467 00000 n 0001366523 00000 n 0001367179 00000 n 0001373133 00000 n 0001366938 00000 n 0001367148 00000 n 0001373528 00000 n 0001373156 00000 n 0001373205 00000 n 0001373261 00000 n 0001373899 00000 n 0001379527 00000 n 0001373658 00000 n 0001373868 00000 n 0001379807 00000 n 0001379550 00000 n 0001380168 00000 n 0001385682 00000 n 0001379937 00000 n 0001380137 00000 n 0001386178 00000 n 0001385705 00000 n 0001385761 00000 n 0001385817 00000 n 0001385873 00000 n 0001385929 00000 n 0001386533 00000 n 0001391787 00000 n 0001386308 00000 n 0001386502 00000 n 0001392337 00000 n 0001391810 00000 n 0001392070 00000 n 0001392691 00000 n 0001397337 00000 n 0001392467 00000 n 0001392651 00000 n 0001397978 00000 n 0001397360 00000 n 0001397416 00000 n 0001397472 00000 n 0001397718 00000 n 0001398358 00000 n 0001402954 00000 n 0001398108 00000 n 0001398318 00000 n 0001403306 00000 n 0001402977 00000 n 0001403033 00000 n 0001403089 00000 n 0001403138 00000 n 0001403194 00000 n 0001403250 00000 n 0001403652 00000 n 0001409099 00000 n 0001403436 00000 n 0001403630 00000 n 0001409510 00000 n 0001409122 00000 n 0001409178 00000 n 0001409234 00000 n 0001409865 00000 n 0001419004 00000 n 0001409640 00000 n 0001409834 00000 n 0001419132 00000 n 0001419027 00000 n 0001419083 00000 n 0001419478 00000 n 0001424196 00000 n 0001419262 00000 n 0001419456 00000 n 0001424478 00000 n 0001424219 00000 n 0001424823 00000 n 0001429659 00000 n 0001424608 00000 n 0001424792 00000 n 0001430331 00000 n 0001429682 00000 n 0001429738 00000 n 0001429794 00000 n 0001430053 00000 n 0001430695 00000 n 0001437362 00000 n 0001430461 00000 n 0001430655 00000 n 0001438277 00000 n 0001437385 00000 n 0001437434 00000 n 0001437490 00000 n 0001437761 00000 n 0001438018 00000 n 0001438650 00000 n 0001445506 00000 n 0001438407 00000 n 0001438601 00000 n 0001449923 00000 n 0001445529 00000 n 0001445585 00000 n 0001445641 00000 n 0001445697 00000 n 0001445753 00000 n 0001445809 00000 n 0001445858 00000 n 0001445907 00000 n 0001445963 00000 n 0001446019 00000 n 0001446075 00000 n 0001446341 00000 n 0001446594 00000 n 0001446854 00000 n 0001447107 00000 n 0001447368 00000 n 0001447628 00000 n 0001447797 00000 n 0001448043 00000 n 0001448309 00000 n 0001448567 00000 n 0001448842 00000 n 0001449112 00000 n 0001449379 00000 n 0001449657 00000 n 0001450404 00000 n 0001458273 00000 n 0001450053 00000 n 0001450247 00000 n 0001458690 00000 n 0001458296 00000 n 0001458352 00000 n 0001458408 00000 n 0001458464 00000 n 0001458520 00000 n 0001459045 00000 n 0001463604 00000 n 0001458820 00000 n 0001459014 00000 n 0001463963 00000 n 0001463627 00000 n 0001463683 00000 n 0001463739 00000 n 0001463795 00000 n 0001463851 00000 n 0001463907 00000 n 0001464309 00000 n 0001469020 00000 n 0001464093 00000 n 0001464287 00000 n 0001469330 00000 n 0001469043 00000 n 0001469099 00000 n 0001469155 00000 n 0001469685 00000 n 0001474346 00000 n 0001469460 00000 n 0001469654 00000 n 0001474586 00000 n 0001474369 00000 n 0001474425 00000 n 0001474481 00000 n 0001474530 00000 n 0001474932 00000 n 0001479617 00000 n 0001474716 00000 n 0001474910 00000 n 0001480181 00000 n 0001479640 00000 n 0001479689 00000 n 0001479745 00000 n 0001480007 00000 n 0001480545 00000 n 0001486196 00000 n 0001480311 00000 n 0001480505 00000 n 0001487266 00000 n 0001486219 00000 n 0001486275 00000 n 0001486331 00000 n 0001486387 00000 n 0001486443 00000 n 0001486710 00000 n 0001486992 00000 n 0001487655 00000 n 0001492841 00000 n 0001487396 00000 n 0001487606 00000 n 0001493332 00000 n 0001492864 00000 n 0001492920 00000 n 0001492976 00000 n 0001493025 00000 n 0001493074 00000 n 0001493687 00000 n 0001499149 00000 n 0001493462 00000 n 0001493656 00000 n 0001500750 00000 n 0001499172 00000 n 0001499221 00000 n 0001499277 00000 n 0001499333 00000 n 0001499382 00000 n 0001499438 00000 n 0001499494 00000 n 0001499751 00000 n 0001499999 00000 n 0001500247 00000 n 0001500502 00000 n 0001501141 00000 n 0001506997 00000 n 0001500880 00000 n 0001501074 00000 n 0001507244 00000 n 0001507020 00000 n 0001507076 00000 n 0001507132 00000 n 0001507188 00000 n 0001507590 00000 n 0001511483 00000 n 0001507374 00000 n 0001507568 00000 n 0001514079 00000 n 0001511506 00000 n 0001511562 00000 n 0001511618 00000 n 0001511674 00000 n 0001511730 00000 n 0001511779 00000 n 0001511835 00000 n 0001512089 00000 n 0001512343 00000 n 0001512590 00000 n 0001512844 00000 n 0001513084 00000 n 0001513331 00000 n 0001513585 00000 n 0001513824 00000 n 0001514506 00000 n 0001520205 00000 n 0001514209 00000 n 0001514403 00000 n 0001520542 00000 n 0001520228 00000 n 0001520277 00000 n 0001520326 00000 n 0001520382 00000 n 0001520438 00000 n 0001520494 00000 n 0001520904 00000 n 0001527302 00000 n 0001520672 00000 n 0001520882 00000 n 0001527966 00000 n 0001527325 00000 n 0001527381 00000 n 0001527430 00000 n 0001527702 00000 n 0001528330 00000 n 0001534588 00000 n 0001528096 00000 n 0001528290 00000 n 0001534905 00000 n 0001534611 00000 n 0001534667 00000 n 0001534723 00000 n 0001535276 00000 n 0001541919 00000 n 0001535035 00000 n 0001535245 00000 n 0001541942 00000 n 0001542278 00000 n 0001546168 00000 n 0001542072 00000 n 0001542256 00000 n 0001546296 00000 n 0001546191 00000 n 0001546247 00000 n 0001546642 00000 n 0001551518 00000 n 0001546426 00000 n 0001546620 00000 n 0001551765 00000 n 0001551541 00000 n 0001551597 00000 n 0001551653 00000 n 0001551709 00000 n 0001552111 00000 n 0001557973 00000 n 0001551895 00000 n 0001552089 00000 n 0001566306 00000 n 0001557996 00000 n 0001558045 00000 n 0001558094 00000 n 0001558143 00000 n 0001558199 00000 n 0001558255 00000 n 0001558304 00000 n 0001558561 00000 n 0001558828 00000 n 0001559091 00000 n 0001559343 00000 n 0001559599 00000 n 0001559849 00000 n 0001560093 00000 n 0001560353 00000 n 0001560611 00000 n 0001560880 00000 n 0001561134 00000 n 0001561391 00000 n 0001561654 00000 n 0001561914 00000 n 0001562173 00000 n 0001562425 00000 n 0001562689 00000 n 0001562950 00000 n 0001563224 00000 n 0001563490 00000 n 0001563756 00000 n 0001564014 00000 n 0001564275 00000 n 0001564536 00000 n 0001564798 00000 n 0001565054 00000 n 0001565323 00000 n 0001565515 00000 n 0001565730 00000 n 0001565908 00000 n 0001566100 00000 n 0001566940 00000 n 0001574757 00000 n 0001566436 00000 n 0001566630 00000 n 0001575762 00000 n 0001574780 00000 n 0001574836 00000 n 0001574892 00000 n 0001574948 00000 n 0001574997 00000 n 0001575046 00000 n 0001575095 00000 n 0001575144 00000 n 0001575200 00000 n 0001575249 00000 n 0001575298 00000 n 0001575571 00000 n 0001576126 00000 n 0001581835 00000 n 0001575892 00000 n 0001576086 00000 n 0001582411 00000 n 0001581858 00000 n 0001581914 00000 n 0001581970 00000 n 0001582026 00000 n 0001582082 00000 n 0001582138 00000 n 0001582194 00000 n 0001582243 00000 n 0001582299 00000 n 0001582355 00000 n 0001582757 00000 n 0001587368 00000 n 0001582541 00000 n 0001582735 00000 n 0001587762 00000 n 0001587391 00000 n 0001587440 00000 n 0001587489 00000 n 0001588133 00000 n 0001592073 00000 n 0001587892 00000 n 0001588102 00000 n 0001592445 00000 n 0001592096 00000 n 0001592152 00000 n 0001592208 00000 n 0001592816 00000 n 0001596582 00000 n 0001592575 00000 n 0001592785 00000 n 0001596605 00000 n 0001596957 00000 n 0001599146 00000 n 0001596735 00000 n 0001596935 00000 n 0001599676 00000 n 0001599169 00000 n 0001599218 00000 n 0001599274 00000 n 0001599330 00000 n 0001599379 00000 n 0001599435 00000 n 0001599491 00000 n 0001600031 00000 n 0001603610 00000 n 0001599806 00000 n 0001600000 00000 n 0001604159 00000 n 0001603633 00000 n 0001603689 00000 n 0001603745 00000 n 0001603964 00000 n 0001604539 00000 n 0001610119 00000 n 0001604289 00000 n 0001604499 00000 n 0001610254 00000 n 0001610142 00000 n 0001610198 00000 n 0001610616 00000 n 0001613515 00000 n 0001610384 00000 n 0001610594 00000 n 0001614301 00000 n 0001613538 00000 n 0001613594 00000 n 0001613643 00000 n 0001613699 00000 n 0001613755 00000 n 0001613811 00000 n 0001613860 00000 n 0001613916 00000 n 0001613965 00000 n 0001614021 00000 n 0001614077 00000 n 0001614133 00000 n 0001614189 00000 n 0001614245 00000 n 0001614647 00000 n 0001619214 00000 n 0001614431 00000 n 0001614625 00000 n 0001624203 00000 n 0001619237 00000 n 0001619293 00000 n 0001619349 00000 n 0001619405 00000 n 0001619461 00000 n 0001619517 00000 n 0001619573 00000 n 0001619622 00000 n 0001619671 00000 n 0001619919 00000 n 0001620182 00000 n 0001620430 00000 n 0001620671 00000 n 0001620932 00000 n 0001621180 00000 n 0001621435 00000 n 0001621690 00000 n 0001621938 00000 n 0001622194 00000 n 0001622436 00000 n 0001622685 00000 n 0001622941 00000 n 0001623190 00000 n 0001623449 00000 n 0001623698 00000 n 0001623947 00000 n 0001624727 00000 n 0001632689 00000 n 0001624333 00000 n 0001624543 00000 n 0001633195 00000 n 0001632712 00000 n 0001632761 00000 n 0001632817 00000 n 0001632873 00000 n 0001632929 00000 n 0001633566 00000 n 0001638439 00000 n 0001633325 00000 n 0001633535 00000 n 0001639458 00000 n 0001638462 00000 n 0001638518 00000 n 0001638567 00000 n 0001638616 00000 n 0001638672 00000 n 0001638721 00000 n 0001638777 00000 n 0001638826 00000 n 0001638874 00000 n 0001638922 00000 n 0001638978 00000 n 0001639027 00000 n 0001639083 00000 n 0001639132 00000 n 0001639188 00000 n 0001639813 00000 n 0001646104 00000 n 0001639588 00000 n 0001639782 00000 n 0001646351 00000 n 0001646127 00000 n 0001646183 00000 n 0001646239 00000 n 0001646295 00000 n 0001646713 00000 n 0001656462 00000 n 0001646481 00000 n 0001646691 00000 n 0001657884 00000 n 0001656485 00000 n 0001656541 00000 n 0001656597 00000 n 0001656653 00000 n 0001656702 00000 n 0001656751 00000 n 0001656807 00000 n 0001656863 00000 n 0001656919 00000 n 0001656975 00000 n 0001657024 00000 n 0001657080 00000 n 0001657129 00000 n 0001657384 00000 n 0001657638 00000 n 0001658257 00000 n 0001669221 00000 n 0001658014 00000 n 0001658208 00000 n 0001670471 00000 n 0001669245 00000 n 0001669294 00000 n 0001669350 00000 n 0001669406 00000 n 0001669462 00000 n 0001669723 00000 n 0001669977 00000 n 0001670224 00000 n 0001670853 00000 n 0001677321 00000 n 0001670601 00000 n 0001670795 00000 n 0001678489 00000 n 0001677344 00000 n 0001677392 00000 n 0001677441 00000 n 0001677489 00000 n 0001677545 00000 n 0001677601 00000 n 0001677650 00000 n 0001677699 00000 n 0001677748 00000 n 0001677797 00000 n 0001677853 00000 n 0001677909 00000 n 0001677965 00000 n 0001678238 00000 n 0001678853 00000 n 0001688509 00000 n 0001678619 00000 n 0001678813 00000 n 0001693394 00000 n 0001688532 00000 n 0001688588 00000 n 0001688644 00000 n 0001688700 00000 n 0001688749 00000 n 0001688805 00000 n 0001688861 00000 n 0001688910 00000 n 0001688959 00000 n 0001689008 00000 n 0001689064 00000 n 0001689113 00000 n 0001689169 00000 n 0001689422 00000 n 0001689668 00000 n 0001689921 00000 n 0001690174 00000 n 0001690412 00000 n 0001690665 00000 n 0001690904 00000 n 0001691150 00000 n 0001691404 00000 n 0001691651 00000 n 0001691898 00000 n 0001692145 00000 n 0001692392 00000 n 0001692646 00000 n 0001692893 00000 n 0001693140 00000 n 0001693893 00000 n 0001699662 00000 n 0001693524 00000 n 0001693718 00000 n 0001699895 00000 n 0001699685 00000 n 0001699741 00000 n 0001699790 00000 n 0001699839 00000 n 0001700241 00000 n 0001708902 00000 n 0001700025 00000 n 0001700219 00000 n 0001712098 00000 n 0001708925 00000 n 0001708974 00000 n 0001709023 00000 n 0001709079 00000 n 0001709135 00000 n 0001709184 00000 n 0001709240 00000 n 0001709289 00000 n 0001709345 00000 n 0001709394 00000 n 0001709450 00000 n 0001709506 00000 n 0001709562 00000 n 0001709611 00000 n 0001709667 00000 n 0001709723 00000 n 0001709772 00000 n 0001709821 00000 n 0001709877 00000 n 0001709933 00000 n 0001709989 00000 n 0001710240 00000 n 0001710491 00000 n 0001710756 00000 n 0001711006 00000 n 0001711270 00000 n 0001711528 00000 n 0001711727 00000 n 0001711906 00000 n 0001712509 00000 n 0001721265 00000 n 0001712228 00000 n 0001712406 00000 n 0001723080 00000 n 0001721288 00000 n 0001721344 00000 n 0001721400 00000 n 0001721456 00000 n 0001721505 00000 n 0001721561 00000 n 0001721610 00000 n 0001721659 00000 n 0001721708 00000 n 0001721955 00000 n 0001722195 00000 n 0001722461 00000 n 0001722658 00000 n 0001722855 00000 n 0001723496 00000 n 0001729289 00000 n 0001723210 00000 n 0001723420 00000 n 0001729532 00000 n 0001729312 00000 n 0001729893 00000 n 0001734052 00000 n 0001729662 00000 n 0001729862 00000 n 0001742357 00000 n 0001734075 00000 n 0001742040 00000 n 0001742063 00000 n 0001742119 00000 n 0001742175 00000 n 0001742729 00000 n 0001747029 00000 n 0001742487 00000 n 0001742698 00000 n 0001747311 00000 n 0001747052 00000 n 0001747656 00000 n 0001750886 00000 n 0001747441 00000 n 0001747625 00000 n 0001750909 00000 n 0001751245 00000 n 0001755475 00000 n 0001751039 00000 n 0001751223 00000 n 0001755498 00000 n 0001755834 00000 n 0001759254 00000 n 0001755628 00000 n 0001755812 00000 n 0001782512 00000 n 0001759277 00000 n 0001774013 00000 n 0001774037 00000 n 0001774093 00000 n 0001774149 00000 n 0001774205 00000 n 0001774254 00000 n 0001774310 00000 n 0001774366 00000 n 0001774422 00000 n 0001774478 00000 n 0001774534 00000 n 0001774583 00000 n 0001774639 00000 n 0001774695 00000 n 0001774950 00000 n 0001775112 00000 n 0001775373 00000 n 0001775632 00000 n 0001775895 00000 n 0001776151 00000 n 0001776413 00000 n 0001776589 00000 n 0001776846 00000 n 0001777099 00000 n 0001777277 00000 n 0001777441 00000 n 0001777613 00000 n 0001777884 00000 n 0001778128 00000 n 0001778388 00000 n 0001778648 00000 n 0001778907 00000 n 0001779173 00000 n 0001779432 00000 n 0001779606 00000 n 0001779874 00000 n 0001780133 00000 n 0001780398 00000 n 0001780664 00000 n 0001780922 00000 n 0001781190 00000 n 0001781454 00000 n 0001781717 00000 n 0001781928 00000 n 0001782130 00000 n 0001782312 00000 n 0001783172 00000 n 0001791793 00000 n 0001782642 00000 n 0001782853 00000 n 0001792682 00000 n 0001791816 00000 n 0001791872 00000 n 0001791921 00000 n 0001792169 00000 n 0001792428 00000 n 0001793055 00000 n 0001800983 00000 n 0001792812 00000 n 0001793006 00000 n 0001802651 00000 n 0001801006 00000 n 0001801282 00000 n 0001801556 00000 n 0001801822 00000 n 0001802103 00000 n 0001802385 00000 n 0001803041 00000 n 0001810071 00000 n 0001802781 00000 n 0001802965 00000 n 0001811316 00000 n 0001810094 00000 n 0001810150 00000 n 0001810206 00000 n 0001810262 00000 n 0001810318 00000 n 0001810374 00000 n 0001810430 00000 n 0001810697 00000 n 0001810956 00000 n 0001811140 00000 n 0001811714 00000 n 0001819646 00000 n 0001811446 00000 n 0001811656 00000 n 0001820368 00000 n 0001819669 00000 n 0001819725 00000 n 0001819774 00000 n 0001819823 00000 n 0001819879 00000 n 0001820122 00000 n 0001820732 00000 n 0001827320 00000 n 0001820498 00000 n 0001820692 00000 n 0001827992 00000 n 0001827343 00000 n 0001827399 00000 n 0001827448 00000 n 0001827732 00000 n 0001828356 00000 n 0001835332 00000 n 0001828122 00000 n 0001828316 00000 n 0001835453 00000 n 0001835355 00000 n 0001835404 00000 n 0001835799 00000 n 0001840543 00000 n 0001835583 00000 n 0001835777 00000 n 0001841043 00000 n 0001840566 00000 n 0001840615 00000 n 0001840671 00000 n 0001840720 00000 n 0001840776 00000 n 0001841398 00000 n 0001846362 00000 n 0001841173 00000 n 0001841367 00000 n 0001846497 00000 n 0001846385 00000 n 0001846441 00000 n 0001846843 00000 n 0001853090 00000 n 0001846627 00000 n 0001846821 00000 n 0001853574 00000 n 0001853113 00000 n 0001853162 00000 n 0001853218 00000 n 0001853267 00000 n 0001853323 00000 n 0001853929 00000 n 0001858254 00000 n 0001853704 00000 n 0001853898 00000 n 0001858389 00000 n 0001858277 00000 n 0001858333 00000 n 0001858735 00000 n 0001862713 00000 n 0001858519 00000 n 0001858713 00000 n 0001863114 00000 n 0001862736 00000 n 0001862792 00000 n 0001862848 00000 n 0001863469 00000 n 0001869665 00000 n 0001863244 00000 n 0001863438 00000 n 0001870534 00000 n 0001869688 00000 n 0001869744 00000 n 0001869800 00000 n 0001869856 00000 n 0001869912 00000 n 0001869968 00000 n 0001870017 00000 n 0001870268 00000 n 0001870898 00000 n 0001877719 00000 n 0001870664 00000 n 0001870858 00000 n 0001878128 00000 n 0001877742 00000 n 0001877798 00000 n 0001877854 00000 n 0001878483 00000 n 0001883058 00000 n 0001878258 00000 n 0001878452 00000 n 0001883728 00000 n 0001883081 00000 n 0001883137 00000 n 0001883193 00000 n 0001883463 00000 n 0001884092 00000 n 0001889611 00000 n 0001883858 00000 n 0001884052 00000 n 0001889634 00000 n 0001889970 00000 n 0001896113 00000 n 0001889764 00000 n 0001889948 00000 n 0001896498 00000 n 0001896136 00000 n 0001896185 00000 n 0001896234 00000 n 0001896853 00000 n 0001901903 00000 n 0001896628 00000 n 0001896822 00000 n 0001902424 00000 n 0001901926 00000 n 0001901982 00000 n 0001902038 00000 n 0001902094 00000 n 0001902150 00000 n 0001902779 00000 n 0001908791 00000 n 0001902554 00000 n 0001902748 00000 n 0001909305 00000 n 0001908814 00000 n 0001908870 00000 n 0001908926 00000 n 0001908982 00000 n 0001909038 00000 n 0001909660 00000 n 0001914350 00000 n 0001909435 00000 n 0001909629 00000 n 0001921070 00000 n 0001914373 00000 n 0001914429 00000 n 0001914485 00000 n 0001914541 00000 n 0001914597 00000 n 0001914646 00000 n 0001914702 00000 n 0001914751 00000 n 0001914807 00000 n 0001915064 00000 n 0001915332 00000 n 0001915578 00000 n 0001915846 00000 n 0001916102 00000 n 0001916370 00000 n 0001916648 00000 n 0001916897 00000 n 0001917165 00000 n 0001917420 00000 n 0001917666 00000 n 0001917910 00000 n 0001918158 00000 n 0001918397 00000 n 0001918656 00000 n 0001918900 00000 n 0001919167 00000 n 0001919432 00000 n 0001919680 00000 n 0001919941 00000 n 0001920188 00000 n 0001920438 00000 n 0001920686 00000 n 0001920864 00000 n 0001921657 00000 n 0001929216 00000 n 0001921200 00000 n 0001921410 00000 n 0001931039 00000 n 0004565908 00000 n 0001929239 00000 n 0001929295 00000 n 0001929351 00000 n 0001929400 00000 n 0001929456 00000 n 0001929512 00000 n 0001929568 00000 n 0001929624 00000 n 0001929680 00000 n 0001929736 00000 n 0001929792 00000 n 0001929848 00000 n 0001929904 00000 n 0001929960 00000 n 0001930016 00000 n 0001930261 00000 n 0001930535 00000 n 0001930787 00000 n 0001931453 00000 n 0001938653 00000 n 0001931169 00000 n 0001931395 00000 n 0001941099 00000 n 0001938676 00000 n 0001938732 00000 n 0001938788 00000 n 0001939047 00000 n 0001939310 00000 n 0001939576 00000 n 0001939818 00000 n 0001940068 00000 n 0001940321 00000 n 0001940581 00000 n 0001940842 00000 n 0001941526 00000 n 0001947775 00000 n 0001941229 00000 n 0001941423 00000 n 0001948793 00000 n 0001947798 00000 n 0001947854 00000 n 0001947903 00000 n 0001947959 00000 n 0001948015 00000 n 0001948281 00000 n 0001948530 00000 n 0001949182 00000 n 0001954695 00000 n 0001948923 00000 n 0001949133 00000 n 0001957740 00000 n 0001954718 00000 n 0001954774 00000 n 0001954830 00000 n 0001954879 00000 n 0001954935 00000 n 0001954984 00000 n 0001955040 00000 n 0001955096 00000 n 0001955152 00000 n 0001955208 00000 n 0001955264 00000 n 0001955320 00000 n 0001955376 00000 n 0001955432 00000 n 0001955488 00000 n 0001955544 00000 n 0001955600 00000 n 0001955656 00000 n 0001955712 00000 n 0001955980 00000 n 0001956245 00000 n 0001956505 00000 n 0001956764 00000 n 0001957033 00000 n 0001957300 00000 n 0001957520 00000 n 0001958174 00000 n 0001968904 00000 n 0001957870 00000 n 0001958080 00000 n 0001978112 00000 n 0001968928 00000 n 0001968984 00000 n 0001969040 00000 n 0001969096 00000 n 0001969152 00000 n 0001969208 00000 n 0001969264 00000 n 0001969320 00000 n 0001969376 00000 n 0001969623 00000 n 0001969877 00000 n 0001970128 00000 n 0001970378 00000 n 0001970631 00000 n 0001970880 00000 n 0001971133 00000 n 0001971384 00000 n 0001971625 00000 n 0001971883 00000 n 0001972129 00000 n 0001972374 00000 n 0001972638 00000 n 0001972886 00000 n 0001973148 00000 n 0001973420 00000 n 0001973668 00000 n 0001973933 00000 n 0001974192 00000 n 0001974453 00000 n 0001974717 00000 n 0001974975 00000 n 0001975245 00000 n 0001975507 00000 n 0001975755 00000 n 0001976023 00000 n 0001976270 00000 n 0001976532 00000 n 0001976805 00000 n 0001976979 00000 n 0001977162 00000 n 0001977348 00000 n 0001977530 00000 n 0001977715 00000 n 0001977923 00000 n 0001978798 00000 n 0001986107 00000 n 0001978242 00000 n 0001978452 00000 n 0001987286 00000 n 0001986130 00000 n 0001986179 00000 n 0001986235 00000 n 0001986291 00000 n 0001986347 00000 n 0001986403 00000 n 0001986459 00000 n 0001986515 00000 n 0001986571 00000 n 0001986627 00000 n 0001986683 00000 n 0001986739 00000 n 0001986788 00000 n 0001986844 00000 n 0001986900 00000 n 0001986956 00000 n 0001987012 00000 n 0001987641 00000 n 0001996583 00000 n 0001987416 00000 n 0001987610 00000 n 0001997127 00000 n 0001996606 00000 n 0001996662 00000 n 0001996718 00000 n 0001996920 00000 n 0001997491 00000 n 0002003672 00000 n 0001997257 00000 n 0001997451 00000 n 0002004889 00000 n 0002003695 00000 n 0002003751 00000 n 0002003807 00000 n 0002003856 00000 n 0002003912 00000 n 0002003968 00000 n 0002004024 00000 n 0002004080 00000 n 0002004136 00000 n 0002004192 00000 n 0002004241 00000 n 0002004297 00000 n 0002004353 00000 n 0002004616 00000 n 0002005253 00000 n 0002010482 00000 n 0002005019 00000 n 0002005213 00000 n 0002011917 00000 n 0002010505 00000 n 0002010561 00000 n 0002010617 00000 n 0002010673 00000 n 0002010729 00000 n 0002010785 00000 n 0002010841 00000 n 0002011112 00000 n 0002011382 00000 n 0002011652 00000 n 0002012299 00000 n 0002018889 00000 n 0002012047 00000 n 0002012241 00000 n 0002019924 00000 n 0002018912 00000 n 0002018968 00000 n 0002019024 00000 n 0002019080 00000 n 0002019136 00000 n 0002019406 00000 n 0002019672 00000 n 0002020297 00000 n 0002025646 00000 n 0002020054 00000 n 0002020248 00000 n 0002026005 00000 n 0002025669 00000 n 0002025725 00000 n 0002025781 00000 n 0002026360 00000 n 0002032532 00000 n 0002026135 00000 n 0002026329 00000 n 0002033034 00000 n 0002032555 00000 n 0002032604 00000 n 0002032660 00000 n 0002032716 00000 n 0002032765 00000 n 0002033389 00000 n 0002037795 00000 n 0002033164 00000 n 0002033358 00000 n 0002043965 00000 n 0002037818 00000 n 0002037874 00000 n 0002037923 00000 n 0002037979 00000 n 0002038028 00000 n 0002038084 00000 n 0002038140 00000 n 0002038196 00000 n 0002038245 00000 n 0002038497 00000 n 0002038767 00000 n 0002039012 00000 n 0002039264 00000 n 0002039516 00000 n 0002039753 00000 n 0002040005 00000 n 0002040250 00000 n 0002040495 00000 n 0002040740 00000 n 0002040985 00000 n 0002041238 00000 n 0002041491 00000 n 0002041737 00000 n 0002041990 00000 n 0002042229 00000 n 0002042475 00000 n 0002042721 00000 n 0002042967 00000 n 0002043220 00000 n 0002043473 00000 n 0002043712 00000 n 0002044518 00000 n 0002053917 00000 n 0002044095 00000 n 0002044289 00000 n 0002054815 00000 n 0002053940 00000 n 0002053989 00000 n 0002054045 00000 n 0002054101 00000 n 0002054150 00000 n 0002054199 00000 n 0002054255 00000 n 0002054311 00000 n 0002054367 00000 n 0002054423 00000 n 0002054479 00000 n 0002054535 00000 n 0002054591 00000 n 0002055186 00000 n 0002063390 00000 n 0002054945 00000 n 0002055155 00000 n 0002064968 00000 n 0002063413 00000 n 0002063469 00000 n 0002063525 00000 n 0002063581 00000 n 0002063637 00000 n 0002063693 00000 n 0002063749 00000 n 0002063798 00000 n 0002063847 00000 n 0002063903 00000 n 0002063952 00000 n 0002064001 00000 n 0002064050 00000 n 0002064106 00000 n 0002064162 00000 n 0002064428 00000 n 0002064694 00000 n 0002065373 00000 n 0002074460 00000 n 0002065098 00000 n 0002065324 00000 n 0002075375 00000 n 0002074483 00000 n 0002074532 00000 n 0002074588 00000 n 0002074644 00000 n 0002074700 00000 n 0002074756 00000 n 0002074812 00000 n 0002074861 00000 n 0002074910 00000 n 0002075132 00000 n 0002075771 00000 n 0002082535 00000 n 0002075505 00000 n 0002075731 00000 n 0002082768 00000 n 0002082558 00000 n 0002082607 00000 n 0002082663 00000 n 0002082712 00000 n 0002083146 00000 n 0002088783 00000 n 0002082898 00000 n 0002083124 00000 n 0002092013 00000 n 0002088806 00000 n 0002088862 00000 n 0002088918 00000 n 0002089167 00000 n 0002089428 00000 n 0002089681 00000 n 0002089933 00000 n 0002090202 00000 n 0002090460 00000 n 0002090720 00000 n 0002090984 00000 n 0002091248 00000 n 0002091512 00000 n 0002091759 00000 n 0002092499 00000 n 0002100452 00000 n 0002092143 00000 n 0002092369 00000 n 0002125594 00000 n 0002100475 00000 n 0002100726 00000 n 0002100997 00000 n 0002101247 00000 n 0002101504 00000 n 0002101754 00000 n 0002102007 00000 n 0002102264 00000 n 0002102527 00000 n 0002102781 00000 n 0002103046 00000 n 0002103300 00000 n 0002103549 00000 n 0002103800 00000 n 0002104048 00000 n 0002104300 00000 n 0002104568 00000 n 0002104816 00000 n 0002105084 00000 n 0002105342 00000 n 0002105593 00000 n 0002105850 00000 n 0002106105 00000 n 0002106379 00000 n 0002106650 00000 n 0002106906 00000 n 0002107161 00000 n 0002107418 00000 n 0002107671 00000 n 0002107940 00000 n 0002108194 00000 n 0002108460 00000 n 0002108730 00000 n 0002108981 00000 n 0002109235 00000 n 0002109491 00000 n 0002109752 00000 n 0002110012 00000 n 0002110276 00000 n 0002110545 00000 n 0002110818 00000 n 0002111069 00000 n 0002111326 00000 n 0002111585 00000 n 0002111836 00000 n 0002112102 00000 n 0002112360 00000 n 0002112620 00000 n 0002112889 00000 n 0002113148 00000 n 0002113428 00000 n 0002113681 00000 n 0002113942 00000 n 0002114206 00000 n 0002114462 00000 n 0002114719 00000 n 0002114985 00000 n 0002115239 00000 n 0002115502 00000 n 0002115759 00000 n 0002116015 00000 n 0002116271 00000 n 0002116530 00000 n 0002116789 00000 n 0002117053 00000 n 0002117302 00000 n 0002117581 00000 n 0002117852 00000 n 0002118098 00000 n 0002118361 00000 n 0002118626 00000 n 0002118885 00000 n 0002119150 00000 n 0002119413 00000 n 0002119674 00000 n 0002119933 00000 n 0002120190 00000 n 0002120458 00000 n 0002120716 00000 n 0002120985 00000 n 0002121255 00000 n 0002121517 00000 n 0002121796 00000 n 0002122053 00000 n 0002122314 00000 n 0002122568 00000 n 0002122831 00000 n 0002123013 00000 n 0002123279 00000 n 0002123536 00000 n 0002123797 00000 n 0002124047 00000 n 0002124304 00000 n 0002124565 00000 n 0002124829 00000 n 0002125088 00000 n 0002125345 00000 n 0002126787 00000 n 0002136445 00000 n 0002125724 00000 n 0002125892 00000 n 0002138397 00000 n 0002136468 00000 n 0002136524 00000 n 0002136580 00000 n 0002136636 00000 n 0002136685 00000 n 0002136741 00000 n 0002136797 00000 n 0002136853 00000 n 0002136909 00000 n 0002136965 00000 n 0002137014 00000 n 0002137070 00000 n 0002137119 00000 n 0002137374 00000 n 0002137633 00000 n 0002137877 00000 n 0002138132 00000 n 0002138788 00000 n 0002147165 00000 n 0002138527 00000 n 0002138721 00000 n 0002148118 00000 n 0002147188 00000 n 0002147237 00000 n 0002147293 00000 n 0002147349 00000 n 0002147398 00000 n 0002147664 00000 n 0002147937 00000 n 0002148507 00000 n 0002155813 00000 n 0002148248 00000 n 0002148458 00000 n 0002156985 00000 n 0002155836 00000 n 0002155885 00000 n 0002155941 00000 n 0002155997 00000 n 0002156046 00000 n 0002156095 00000 n 0002156151 00000 n 0002156200 00000 n 0002156256 00000 n 0002156516 00000 n 0002156796 00000 n 0002157358 00000 n 0002166028 00000 n 0002157115 00000 n 0002157309 00000 n 0002166478 00000 n 0002166051 00000 n 0002166107 00000 n 0002166163 00000 n 0002166219 00000 n 0002166275 00000 n 0002166324 00000 n 0002166373 00000 n 0002166429 00000 n 0002166840 00000 n 0002173379 00000 n 0002166608 00000 n 0002166818 00000 n 0002174061 00000 n 0002173402 00000 n 0002173458 00000 n 0002173514 00000 n 0002173788 00000 n 0002174425 00000 n 0002180292 00000 n 0002174191 00000 n 0002174385 00000 n 0002180651 00000 n 0002180315 00000 n 0002180371 00000 n 0002180427 00000 n 0002180483 00000 n 0002180539 00000 n 0002180595 00000 n 0002180997 00000 n 0002187286 00000 n 0002180781 00000 n 0002180975 00000 n 0002189929 00000 n 0002187309 00000 n 0002187365 00000 n 0002187414 00000 n 0002187470 00000 n 0002187526 00000 n 0002187575 00000 n 0002187631 00000 n 0002187902 00000 n 0002188171 00000 n 0002188429 00000 n 0002188698 00000 n 0002188963 00000 n 0002189185 00000 n 0002189430 00000 n 0002189669 00000 n 0002190372 00000 n 0002198298 00000 n 0002190059 00000 n 0002190269 00000 n 0002198809 00000 n 0002198321 00000 n 0002198377 00000 n 0002198433 00000 n 0002198489 00000 n 0002198545 00000 n 0002199180 00000 n 0002206121 00000 n 0002198939 00000 n 0002199149 00000 n 0002206758 00000 n 0002206144 00000 n 0002206193 00000 n 0002206242 00000 n 0002206499 00000 n 0002207122 00000 n 0002211294 00000 n 0002206888 00000 n 0002207082 00000 n 0002211765 00000 n 0002211317 00000 n 0002211373 00000 n 0002211429 00000 n 0002211485 00000 n 0002211541 00000 n 0002211597 00000 n 0002211653 00000 n 0002211709 00000 n 0002212111 00000 n 0002217041 00000 n 0002211895 00000 n 0002212089 00000 n 0002217801 00000 n 0002217064 00000 n 0002217120 00000 n 0002217169 00000 n 0002217218 00000 n 0002217274 00000 n 0002217536 00000 n 0002218165 00000 n 0002222426 00000 n 0002217931 00000 n 0002218125 00000 n 0002223957 00000 n 0002222449 00000 n 0002222505 00000 n 0002222561 00000 n 0002222617 00000 n 0002222673 00000 n 0002222729 00000 n 0002222785 00000 n 0002222841 00000 n 0002222897 00000 n 0002223163 00000 n 0002223425 00000 n 0002223684 00000 n 0002224339 00000 n 0002230275 00000 n 0002224087 00000 n 0002224281 00000 n 0002231000 00000 n 0002230298 00000 n 0002230347 00000 n 0002230403 00000 n 0002230459 00000 n 0002230508 00000 n 0002230748 00000 n 0002231364 00000 n 0002236521 00000 n 0002231130 00000 n 0002231324 00000 n 0002237912 00000 n 0002236544 00000 n 0002236600 00000 n 0002236656 00000 n 0002236712 00000 n 0002236761 00000 n 0002236810 00000 n 0002236866 00000 n 0002237135 00000 n 0002237404 00000 n 0002237658 00000 n 0002238294 00000 n 0002246068 00000 n 0002238042 00000 n 0002238236 00000 n 0002246778 00000 n 0002246091 00000 n 0002246147 00000 n 0002246203 00000 n 0002246252 00000 n 0002246301 00000 n 0002246572 00000 n 0002247142 00000 n 0002252546 00000 n 0002246908 00000 n 0002247102 00000 n 0002253402 00000 n 0002252569 00000 n 0002252625 00000 n 0002252681 00000 n 0002252938 00000 n 0002253212 00000 n 0002253775 00000 n 0002259018 00000 n 0002253532 00000 n 0002253726 00000 n 0002259844 00000 n 0002259041 00000 n 0002259097 00000 n 0002259153 00000 n 0002259411 00000 n 0002259631 00000 n 0002260233 00000 n 0002266143 00000 n 0002259974 00000 n 0002260184 00000 n 0002266721 00000 n 0002266166 00000 n 0002266222 00000 n 0002266278 00000 n 0002266528 00000 n 0002267085 00000 n 0002273247 00000 n 0002266851 00000 n 0002267045 00000 n 0002273730 00000 n 0002273270 00000 n 0002273319 00000 n 0002273375 00000 n 0002273431 00000 n 0002273480 00000 n 0002274085 00000 n 0002280166 00000 n 0002273860 00000 n 0002274054 00000 n 0002280931 00000 n 0002280189 00000 n 0002280245 00000 n 0002280301 00000 n 0002280357 00000 n 0002280413 00000 n 0002280670 00000 n 0002281295 00000 n 0002286303 00000 n 0002281061 00000 n 0002281255 00000 n 0002286819 00000 n 0002286326 00000 n 0002286382 00000 n 0002286438 00000 n 0002286494 00000 n 0002286550 00000 n 0002287174 00000 n 0002292245 00000 n 0002286949 00000 n 0002287143 00000 n 0002292632 00000 n 0002292268 00000 n 0002292317 00000 n 0002292366 00000 n 0002292987 00000 n 0002300551 00000 n 0002292762 00000 n 0002292956 00000 n 0002301046 00000 n 0002300574 00000 n 0002300630 00000 n 0002300679 00000 n 0002300728 00000 n 0002300784 00000 n 0002301401 00000 n 0002307411 00000 n 0002301176 00000 n 0002301370 00000 n 0002308064 00000 n 0002307434 00000 n 0002307483 00000 n 0002307532 00000 n 0002307581 00000 n 0002307637 00000 n 0002307693 00000 n 0002307749 00000 n 0002307798 00000 n 0002307847 00000 n 0002307903 00000 n 0002307952 00000 n 0002308008 00000 n 0002308410 00000 n 0002316107 00000 n 0002308194 00000 n 0002308388 00000 n 0002317014 00000 n 0002316130 00000 n 0002316179 00000 n 0002316228 00000 n 0002316502 00000 n 0002316755 00000 n 0002317387 00000 n 0002325100 00000 n 0002317144 00000 n 0002317338 00000 n 0002325896 00000 n 0002325123 00000 n 0002325389 00000 n 0002325639 00000 n 0002326285 00000 n 0002333494 00000 n 0002326026 00000 n 0002326236 00000 n 0002333777 00000 n 0002333517 00000 n 0002334122 00000 n 0002339209 00000 n 0002333907 00000 n 0002334091 00000 n 0002339232 00000 n 0002339568 00000 n 0002344323 00000 n 0002339362 00000 n 0002339546 00000 n 0002344451 00000 n 0002344346 00000 n 0002344402 00000 n 0002344797 00000 n 0002350075 00000 n 0002344581 00000 n 0002344775 00000 n 0002350413 00000 n 0002350098 00000 n 0002350154 00000 n 0002350203 00000 n 0002350259 00000 n 0002350315 00000 n 0002350364 00000 n 0002350759 00000 n 0002355523 00000 n 0002350543 00000 n 0002350737 00000 n 0002356192 00000 n 0002355546 00000 n 0002355602 00000 n 0002355658 00000 n 0002355911 00000 n 0002356556 00000 n 0002360749 00000 n 0002356322 00000 n 0002356516 00000 n 0002361706 00000 n 0002360772 00000 n 0002360828 00000 n 0002360884 00000 n 0002361158 00000 n 0002361424 00000 n 0002362079 00000 n 0002367278 00000 n 0002361836 00000 n 0002362030 00000 n 0002368418 00000 n 0002367301 00000 n 0002367357 00000 n 0002367413 00000 n 0002367469 00000 n 0002367525 00000 n 0002367574 00000 n 0002367630 00000 n 0002367901 00000 n 0002368159 00000 n 0002368791 00000 n 0002373408 00000 n 0002368548 00000 n 0002368742 00000 n 0002373891 00000 n 0002373431 00000 n 0002373487 00000 n 0002373543 00000 n 0002373599 00000 n 0002373655 00000 n 0002374246 00000 n 0002378520 00000 n 0002374021 00000 n 0002374215 00000 n 0002378641 00000 n 0002378543 00000 n 0002378592 00000 n 0002378987 00000 n 0002384003 00000 n 0002378771 00000 n 0002378965 00000 n 0002384492 00000 n 0002384026 00000 n 0002384082 00000 n 0002384131 00000 n 0002384187 00000 n 0002384236 00000 n 0002384847 00000 n 0002390731 00000 n 0002384622 00000 n 0002384816 00000 n 0002391603 00000 n 0002390754 00000 n 0002390803 00000 n 0002390852 00000 n 0002390908 00000 n 0002390957 00000 n 0002391201 00000 n 0002391406 00000 n 0002391976 00000 n 0002399982 00000 n 0002391733 00000 n 0002391927 00000 n 0002400341 00000 n 0002400005 00000 n 0002400061 00000 n 0002400117 00000 n 0002400173 00000 n 0002400229 00000 n 0002400285 00000 n 0002400687 00000 n 0002406900 00000 n 0002400471 00000 n 0002400665 00000 n 0002408590 00000 n 0002406923 00000 n 0002406979 00000 n 0002407035 00000 n 0002407295 00000 n 0002407562 00000 n 0002407829 00000 n 0002408089 00000 n 0002408375 00000 n 0002408990 00000 n 0002418119 00000 n 0002408720 00000 n 0002408914 00000 n 0002422052 00000 n 0002418142 00000 n 0002418191 00000 n 0002418247 00000 n 0002418303 00000 n 0002418352 00000 n 0002418618 00000 n 0002418898 00000 n 0002419177 00000 n 0002419430 00000 n 0002419682 00000 n 0002419955 00000 n 0002420225 00000 n 0002420479 00000 n 0002420733 00000 n 0002420984 00000 n 0002421243 00000 n 0002421520 00000 n 0002421786 00000 n 0002422556 00000 n 0002435241 00000 n 0002422182 00000 n 0002422408 00000 n 0002436314 00000 n 0002435265 00000 n 0002435532 00000 n 0002435797 00000 n 0002436055 00000 n 0002436718 00000 n 0002442128 00000 n 0002436444 00000 n 0002436660 00000 n 0002442877 00000 n 0002442151 00000 n 0002442200 00000 n 0002442256 00000 n 0002442312 00000 n 0002442361 00000 n 0002442626 00000 n 0002443241 00000 n 0002450552 00000 n 0002443007 00000 n 0002443201 00000 n 0002450841 00000 n 0002450575 00000 n 0002451212 00000 n 0002456493 00000 n 0002450971 00000 n 0002451181 00000 n 0002457402 00000 n 0002456516 00000 n 0002456572 00000 n 0002456628 00000 n 0002456886 00000 n 0002457152 00000 n 0002457775 00000 n 0002465146 00000 n 0002457532 00000 n 0002457726 00000 n 0002465928 00000 n 0002465169 00000 n 0002465225 00000 n 0002465281 00000 n 0002465330 00000 n 0002465386 00000 n 0002465660 00000 n 0002466308 00000 n 0002472267 00000 n 0002466058 00000 n 0002466268 00000 n 0002472911 00000 n 0002472290 00000 n 0002472346 00000 n 0002472402 00000 n 0002472668 00000 n 0002473275 00000 n 0002478741 00000 n 0002473041 00000 n 0002473235 00000 n 0002478876 00000 n 0002478764 00000 n 0002478820 00000 n 0002479222 00000 n 0002484146 00000 n 0002479006 00000 n 0002479200 00000 n 0002484798 00000 n 0002484169 00000 n 0002484218 00000 n 0002484267 00000 n 0002484524 00000 n 0002485162 00000 n 0002490231 00000 n 0002484928 00000 n 0002485122 00000 n 0002490366 00000 n 0002490254 00000 n 0002490310 00000 n 0002490712 00000 n 0002495292 00000 n 0002490496 00000 n 0002490690 00000 n 0002495427 00000 n 0002495315 00000 n 0002495371 00000 n 0002495773 00000 n 0002501335 00000 n 0002495557 00000 n 0002495751 00000 n 0002501456 00000 n 0002501358 00000 n 0002501407 00000 n 0002501802 00000 n 0002505779 00000 n 0002501586 00000 n 0002501780 00000 n 0002505802 00000 n 0002506138 00000 n 0002510905 00000 n 0002505932 00000 n 0002506116 00000 n 0002511236 00000 n 0002510928 00000 n 0002510984 00000 n 0002511033 00000 n 0002511082 00000 n 0002511138 00000 n 0002511187 00000 n 0002511582 00000 n 0002517562 00000 n 0002511366 00000 n 0002511560 00000 n 0002517585 00000 n 0002517921 00000 n 0002523473 00000 n 0002517715 00000 n 0002517899 00000 n 0002523978 00000 n 0002523496 00000 n 0002523545 00000 n 0002523601 00000 n 0002523657 00000 n 0002523706 00000 n 0002524333 00000 n 0002529542 00000 n 0002524108 00000 n 0002524302 00000 n 0002529954 00000 n 0002529565 00000 n 0002529621 00000 n 0002529677 00000 n 0002530309 00000 n 0002535009 00000 n 0002530084 00000 n 0002530278 00000 n 0002535032 00000 n 0002535368 00000 n 0002539821 00000 n 0002535162 00000 n 0002535346 00000 n 0002540210 00000 n 0002539844 00000 n 0002539900 00000 n 0002539949 00000 n 0002540581 00000 n 0002548618 00000 n 0002540340 00000 n 0002540550 00000 n 0002548942 00000 n 0002548641 00000 n 0002548690 00000 n 0002548739 00000 n 0002548795 00000 n 0002548844 00000 n 0002548893 00000 n 0002549304 00000 n 0002554472 00000 n 0002549072 00000 n 0002549282 00000 n 0002555695 00000 n 0002554495 00000 n 0002554551 00000 n 0002554607 00000 n 0002554656 00000 n 0002554705 00000 n 0002554761 00000 n 0002554810 00000 n 0002554859 00000 n 0002554907 00000 n 0002554956 00000 n 0002555004 00000 n 0002555181 00000 n 0002555441 00000 n 0002556068 00000 n 0002563806 00000 n 0002555825 00000 n 0002556019 00000 n 0002570198 00000 n 0002563829 00000 n 0002563885 00000 n 0002563934 00000 n 0002563990 00000 n 0002564046 00000 n 0002564102 00000 n 0002564158 00000 n 0002564207 00000 n 0002564263 00000 n 0002564523 00000 n 0002564789 00000 n 0002565051 00000 n 0002565310 00000 n 0002565575 00000 n 0002565837 00000 n 0002566107 00000 n 0002566376 00000 n 0002566620 00000 n 0002566871 00000 n 0002567137 00000 n 0002567392 00000 n 0002567653 00000 n 0002567906 00000 n 0002568174 00000 n 0002568439 00000 n 0002568700 00000 n 0002568961 00000 n 0002569222 00000 n 0002569483 00000 n 0002569657 00000 n 0002569828 00000 n 0002570002 00000 n 0002570776 00000 n 0002577951 00000 n 0002570328 00000 n 0002570538 00000 n 0002578728 00000 n 0002577974 00000 n 0002578030 00000 n 0002578086 00000 n 0002578135 00000 n 0002578191 00000 n 0002578247 00000 n 0002578303 00000 n 0002578515 00000 n 0002579092 00000 n 0002584419 00000 n 0002578858 00000 n 0002579052 00000 n 0002585985 00000 n 0002584442 00000 n 0002584498 00000 n 0002584554 00000 n 0002584610 00000 n 0002584666 00000 n 0002584715 00000 n 0002584771 00000 n 0002584820 00000 n 0002584876 00000 n 0002585139 00000 n 0002585399 00000 n 0002585581 00000 n 0002585771 00000 n 0002586392 00000 n 0002591345 00000 n 0002586115 00000 n 0002586325 00000 n 0002592299 00000 n 0002591368 00000 n 0002591424 00000 n 0002591480 00000 n 0002591536 00000 n 0002591592 00000 n 0002591648 00000 n 0002591704 00000 n 0002591898 00000 n 0002592089 00000 n 0002592672 00000 n 0002596747 00000 n 0002592429 00000 n 0002592623 00000 n 0002597253 00000 n 0002596770 00000 n 0002596826 00000 n 0002596882 00000 n 0002597076 00000 n 0002597617 00000 n 0002601624 00000 n 0002597383 00000 n 0002597577 00000 n 0002602125 00000 n 0002601647 00000 n 0002601703 00000 n 0002601759 00000 n 0002601815 00000 n 0002601871 00000 n 0002602480 00000 n 0002606746 00000 n 0002602255 00000 n 0002602449 00000 n 0002606867 00000 n 0002606769 00000 n 0002606818 00000 n 0002607229 00000 n 0002609944 00000 n 0002606997 00000 n 0002607207 00000 n 0002610079 00000 n 0002609967 00000 n 0002610023 00000 n 0002610441 00000 n 0002614010 00000 n 0002610209 00000 n 0002610419 00000 n 0002614257 00000 n 0002614033 00000 n 0002614089 00000 n 0002614145 00000 n 0002614201 00000 n 0002614603 00000 n 0002618519 00000 n 0002614387 00000 n 0002614581 00000 n 0002627337 00000 n 0002618542 00000 n 0002618591 00000 n 0002618640 00000 n 0002618883 00000 n 0002619126 00000 n 0002619384 00000 n 0002619627 00000 n 0002619877 00000 n 0002620127 00000 n 0002620370 00000 n 0002620620 00000 n 0002620863 00000 n 0002621107 00000 n 0002621358 00000 n 0002621603 00000 n 0002621854 00000 n 0002622104 00000 n 0002622348 00000 n 0002622592 00000 n 0002622829 00000 n 0002623073 00000 n 0002623324 00000 n 0002623568 00000 n 0002623819 00000 n 0002624070 00000 n 0002624314 00000 n 0002624558 00000 n 0002624808 00000 n 0002625053 00000 n 0002625305 00000 n 0002625550 00000 n 0002625801 00000 n 0002626052 00000 n 0002626295 00000 n 0002626556 00000 n 0002626821 00000 n 0002627076 00000 n 0002627998 00000 n 0002633693 00000 n 0002627467 00000 n 0002627661 00000 n 0002636450 00000 n 0002633716 00000 n 0002633772 00000 n 0002633821 00000 n 0002633877 00000 n 0002633933 00000 n 0002633989 00000 n 0002634038 00000 n 0002634094 00000 n 0002634150 00000 n 0002634394 00000 n 0002634645 00000 n 0002634889 00000 n 0002635126 00000 n 0002635370 00000 n 0002635614 00000 n 0002635865 00000 n 0002636116 00000 n 0002636282 00000 n 0002636902 00000 n 0002644364 00000 n 0002636580 00000 n 0002636790 00000 n 0002644707 00000 n 0002644387 00000 n 0002644443 00000 n 0002644499 00000 n 0002645062 00000 n 0002650532 00000 n 0002644837 00000 n 0002645031 00000 n 0002651094 00000 n 0002650555 00000 n 0002650604 00000 n 0002650653 00000 n 0002650702 00000 n 0002650758 00000 n 0002650814 00000 n 0002650870 00000 n 0002650926 00000 n 0002650982 00000 n 0002651038 00000 n 0002651440 00000 n 0002656414 00000 n 0002651224 00000 n 0002651418 00000 n 0002656645 00000 n 0002656437 00000 n 0002656493 00000 n 0002656549 00000 n 0002656597 00000 n 0002656991 00000 n 0002662214 00000 n 0002656775 00000 n 0002656969 00000 n 0002662447 00000 n 0002662237 00000 n 0002662286 00000 n 0002662335 00000 n 0002662391 00000 n 0002662793 00000 n 0002667990 00000 n 0002662577 00000 n 0002662771 00000 n 0002668125 00000 n 0002668013 00000 n 0002668069 00000 n 0002668471 00000 n 0002673124 00000 n 0002668255 00000 n 0002668449 00000 n 0002673371 00000 n 0002673147 00000 n 0002673203 00000 n 0002673259 00000 n 0002673315 00000 n 0002673717 00000 n 0002678227 00000 n 0002673501 00000 n 0002673695 00000 n 0002678474 00000 n 0002678250 00000 n 0002678306 00000 n 0002678362 00000 n 0002678418 00000 n 0002678820 00000 n 0002683335 00000 n 0002678604 00000 n 0002678798 00000 n 0002683358 00000 n 0002683694 00000 n 0002689430 00000 n 0002683488 00000 n 0002683672 00000 n 0002689923 00000 n 0002689453 00000 n 0002689502 00000 n 0002689551 00000 n 0002689600 00000 n 0002689649 00000 n 0002690278 00000 n 0002695752 00000 n 0002690053 00000 n 0002690247 00000 n 0002696083 00000 n 0002695775 00000 n 0002695824 00000 n 0002695880 00000 n 0002695929 00000 n 0002695978 00000 n 0002696034 00000 n 0002696429 00000 n 0002700611 00000 n 0002696213 00000 n 0002696407 00000 n 0002700634 00000 n 0002700970 00000 n 0002705712 00000 n 0002700764 00000 n 0002700948 00000 n 0002706570 00000 n 0002705735 00000 n 0002705791 00000 n 0002705840 00000 n 0002705889 00000 n 0002705938 00000 n 0002705994 00000 n 0002706043 00000 n 0002706303 00000 n 0002706934 00000 n 0002711456 00000 n 0002706700 00000 n 0002706894 00000 n 0002711815 00000 n 0002711479 00000 n 0002711535 00000 n 0002711591 00000 n 0002711647 00000 n 0002711703 00000 n 0002711759 00000 n 0002712177 00000 n 0002717554 00000 n 0002711945 00000 n 0002712155 00000 n 0002718046 00000 n 0002717577 00000 n 0002717626 00000 n 0002717675 00000 n 0002717731 00000 n 0002717787 00000 n 0002718401 00000 n 0002723951 00000 n 0002718176 00000 n 0002718370 00000 n 0002724891 00000 n 0002723974 00000 n 0002724030 00000 n 0002724086 00000 n 0002724135 00000 n 0002724184 00000 n 0002724233 00000 n 0002724289 00000 n 0002724338 00000 n 0002724394 00000 n 0002724639 00000 n 0002725255 00000 n 0002732813 00000 n 0002725021 00000 n 0002725215 00000 n 0002733354 00000 n 0002732836 00000 n 0002732885 00000 n 0002732934 00000 n 0002732983 00000 n 0002733039 00000 n 0002733095 00000 n 0002733151 00000 n 0002733207 00000 n 0002733256 00000 n 0002733305 00000 n 0002733732 00000 n 0002740258 00000 n 0002733484 00000 n 0002733710 00000 n 0002740393 00000 n 0002740281 00000 n 0002740337 00000 n 0002740739 00000 n 0002746366 00000 n 0002740523 00000 n 0002740717 00000 n 0002753285 00000 n 0002746389 00000 n 0002746445 00000 n 0002746501 00000 n 0002746557 00000 n 0002746613 00000 n 0002746669 00000 n 0002746725 00000 n 0002746781 00000 n 0002746837 00000 n 0002747083 00000 n 0002747336 00000 n 0002747575 00000 n 0002747828 00000 n 0002748081 00000 n 0002748327 00000 n 0002748580 00000 n 0002748826 00000 n 0002749073 00000 n 0002749327 00000 n 0002749574 00000 n 0002749828 00000 n 0002750075 00000 n 0002750322 00000 n 0002750576 00000 n 0002750823 00000 n 0002751070 00000 n 0002751324 00000 n 0002751593 00000 n 0002751866 00000 n 0002752113 00000 n 0002752360 00000 n 0002752614 00000 n 0002752861 00000 n 0002753108 00000 n 0002753865 00000 n 0002761760 00000 n 0002753415 00000 n 0002753609 00000 n 0002762689 00000 n 0002761783 00000 n 0002761832 00000 n 0002761881 00000 n 0002761937 00000 n 0002761993 00000 n 0002762049 00000 n 0002762105 00000 n 0002762161 00000 n 0002762217 00000 n 0002762273 00000 n 0002762329 00000 n 0002762378 00000 n 0002762434 00000 n 0002763076 00000 n 0002768730 00000 n 0002762819 00000 n 0002763045 00000 n 0002769089 00000 n 0002768753 00000 n 0002768809 00000 n 0002768865 00000 n 0002768921 00000 n 0002768977 00000 n 0002769033 00000 n 0002769435 00000 n 0002774024 00000 n 0002769219 00000 n 0002769413 00000 n 0002774159 00000 n 0002774047 00000 n 0002774103 00000 n 0002774505 00000 n 0002779315 00000 n 0002774289 00000 n 0002774483 00000 n 0002779660 00000 n 0002779338 00000 n 0002779387 00000 n 0002779443 00000 n 0002779499 00000 n 0002779555 00000 n 0002779604 00000 n 0002780006 00000 n 0002784688 00000 n 0002779790 00000 n 0002779984 00000 n 0002784935 00000 n 0002784711 00000 n 0002784767 00000 n 0002784823 00000 n 0002784879 00000 n 0002785281 00000 n 0002789879 00000 n 0002785065 00000 n 0002785259 00000 n 0002790616 00000 n 0002789902 00000 n 0002789958 00000 n 0002790014 00000 n 0002790070 00000 n 0002790126 00000 n 0002790182 00000 n 0002790238 00000 n 0002790294 00000 n 0002790350 00000 n 0002790971 00000 n 0002794988 00000 n 0002790746 00000 n 0002790940 00000 n 0002795557 00000 n 0002795011 00000 n 0002795067 00000 n 0002795123 00000 n 0002795179 00000 n 0002795235 00000 n 0002795291 00000 n 0002795340 00000 n 0002795396 00000 n 0002795452 00000 n 0002795508 00000 n 0002795903 00000 n 0002801402 00000 n 0002795687 00000 n 0002795881 00000 n 0002814901 00000 n 0002801425 00000 n 0002801481 00000 n 0002801537 00000 n 0002801586 00000 n 0002801642 00000 n 0002801698 00000 n 0002801754 00000 n 0002802006 00000 n 0002802251 00000 n 0002802503 00000 n 0002802755 00000 n 0002803000 00000 n 0002803245 00000 n 0002803490 00000 n 0002803735 00000 n 0002803981 00000 n 0002804227 00000 n 0002804480 00000 n 0002804726 00000 n 0002804972 00000 n 0002805225 00000 n 0002805471 00000 n 0002805710 00000 n 0002805963 00000 n 0002806202 00000 n 0002806455 00000 n 0002806708 00000 n 0002806954 00000 n 0002807207 00000 n 0002807453 00000 n 0002807692 00000 n 0002807945 00000 n 0002808191 00000 n 0002808444 00000 n 0002808697 00000 n 0002808943 00000 n 0002809189 00000 n 0002809435 00000 n 0002809681 00000 n 0002809934 00000 n 0002810180 00000 n 0002810433 00000 n 0002810679 00000 n 0002810925 00000 n 0002811178 00000 n 0002811424 00000 n 0002811670 00000 n 0002811923 00000 n 0002812169 00000 n 0002812422 00000 n 0002812675 00000 n 0002812921 00000 n 0002813167 00000 n 0002813411 00000 n 0002813657 00000 n 0002813903 00000 n 0002814149 00000 n 0002814402 00000 n 0002814655 00000 n 0002815724 00000 n 0002823845 00000 n 0002815031 00000 n 0002815225 00000 n 0002824484 00000 n 0002823868 00000 n 0002823917 00000 n 0002823973 00000 n 0002824029 00000 n 0002824085 00000 n 0002824141 00000 n 0002824197 00000 n 0002824246 00000 n 0002824302 00000 n 0002824839 00000 n 0002831068 00000 n 0002824614 00000 n 0002824808 00000 n 0002831189 00000 n 0002831091 00000 n 0002831140 00000 n 0002831551 00000 n 0002838067 00000 n 0002831319 00000 n 0002831529 00000 n 0002838611 00000 n 0002838090 00000 n 0002838146 00000 n 0002838202 00000 n 0002838258 00000 n 0002838314 00000 n 0002838370 00000 n 0002838426 00000 n 0002838982 00000 n 0002849362 00000 n 0002838741 00000 n 0002838951 00000 n 0002850429 00000 n 0002849386 00000 n 0002849442 00000 n 0002849498 00000 n 0002849547 00000 n 0002849596 00000 n 0002849645 00000 n 0002849701 00000 n 0002849750 00000 n 0002849806 00000 n 0002849862 00000 n 0002849911 00000 n 0002850155 00000 n 0002850793 00000 n 0002854920 00000 n 0002850559 00000 n 0002850753 00000 n 0002855167 00000 n 0002854943 00000 n 0002854999 00000 n 0002855055 00000 n 0002855111 00000 n 0002855513 00000 n 0002860558 00000 n 0002855297 00000 n 0002855491 00000 n 0002860693 00000 n 0002860581 00000 n 0002860637 00000 n 0002861039 00000 n 0002864768 00000 n 0002860823 00000 n 0002861017 00000 n 0002865225 00000 n 0002864791 00000 n 0002864840 00000 n 0002864896 00000 n 0002864945 00000 n 0002865001 00000 n 0002865057 00000 n 0002865113 00000 n 0002865169 00000 n 0002865571 00000 n 0002870801 00000 n 0002865355 00000 n 0002865549 00000 n 0002870936 00000 n 0002870824 00000 n 0002870880 00000 n 0002871282 00000 n 0002875719 00000 n 0002871066 00000 n 0002871260 00000 n 0002875847 00000 n 0002875742 00000 n 0002875798 00000 n 0002876193 00000 n 0002879933 00000 n 0002875977 00000 n 0002876171 00000 n 0002880682 00000 n 0002879956 00000 n 0002880012 00000 n 0002880061 00000 n 0002880117 00000 n 0002880166 00000 n 0002880423 00000 n 0002881062 00000 n 0002885714 00000 n 0002880812 00000 n 0002881022 00000 n 0002885849 00000 n 0002885737 00000 n 0002885793 00000 n 0002886195 00000 n 0002890401 00000 n 0002885979 00000 n 0002886173 00000 n 0002891124 00000 n 0002890424 00000 n 0002890480 00000 n 0002890536 00000 n 0002890592 00000 n 0002890648 00000 n 0002890697 00000 n 0002890753 00000 n 0002890809 00000 n 0002890865 00000 n 0002891479 00000 n 0002896210 00000 n 0002891254 00000 n 0002891448 00000 n 0002896443 00000 n 0002896233 00000 n 0002896282 00000 n 0002896338 00000 n 0002896387 00000 n 0002896789 00000 n 0002901164 00000 n 0002896573 00000 n 0002896767 00000 n 0002901397 00000 n 0002901187 00000 n 0002901243 00000 n 0002901292 00000 n 0002901348 00000 n 0002901743 00000 n 0002906336 00000 n 0002901527 00000 n 0002901721 00000 n 0002906807 00000 n 0002906359 00000 n 0002906415 00000 n 0002906471 00000 n 0002906527 00000 n 0002906583 00000 n 0002906639 00000 n 0002906695 00000 n 0002906751 00000 n 0002907153 00000 n 0002912817 00000 n 0002906937 00000 n 0002907131 00000 n 0002912952 00000 n 0002912840 00000 n 0002912896 00000 n 0002913298 00000 n 0002917055 00000 n 0002913082 00000 n 0002913276 00000 n 0002917302 00000 n 0002917078 00000 n 0002917134 00000 n 0002917190 00000 n 0002917246 00000 n 0002917648 00000 n 0002923553 00000 n 0002917432 00000 n 0002917626 00000 n 0002924129 00000 n 0002923576 00000 n 0002923632 00000 n 0002923681 00000 n 0002923730 00000 n 0002923779 00000 n 0002923828 00000 n 0002923877 00000 n 0002924484 00000 n 0002929330 00000 n 0002924259 00000 n 0002924453 00000 n 0002929689 00000 n 0002929353 00000 n 0002929409 00000 n 0002929465 00000 n 0002929521 00000 n 0002929577 00000 n 0002929633 00000 n 0002930035 00000 n 0002935479 00000 n 0002929819 00000 n 0002930013 00000 n 0002936062 00000 n 0002935502 00000 n 0002935558 00000 n 0002935614 00000 n 0002935670 00000 n 0002935726 00000 n 0002935782 00000 n 0002935838 00000 n 0002935894 00000 n 0002935950 00000 n 0002936006 00000 n 0002936424 00000 n 0002946793 00000 n 0002936192 00000 n 0002936402 00000 n 0002953718 00000 n 0002946817 00000 n 0002946865 00000 n 0002946921 00000 n 0002946969 00000 n 0002947018 00000 n 0002947074 00000 n 0002947130 00000 n 0002947186 00000 n 0002947242 00000 n 0002947291 00000 n 0002947340 00000 n 0002947583 00000 n 0002947835 00000 n 0002948073 00000 n 0002948316 00000 n 0002948561 00000 n 0002948806 00000 n 0002949058 00000 n 0002949310 00000 n 0002949548 00000 n 0002949800 00000 n 0002950048 00000 n 0002950289 00000 n 0002950544 00000 n 0002950785 00000 n 0002951040 00000 n 0002951292 00000 n 0002951528 00000 n 0002951780 00000 n 0002952018 00000 n 0002952263 00000 n 0002952515 00000 n 0002952760 00000 n 0002953012 00000 n 0002953264 00000 n 0002953510 00000 n 0002954298 00000 n 0002962977 00000 n 0002953848 00000 n 0002954042 00000 n 0002963698 00000 n 0002963000 00000 n 0002963056 00000 n 0002963112 00000 n 0002963161 00000 n 0002963210 00000 n 0002963266 00000 n 0002963322 00000 n 0002963371 00000 n 0002963420 00000 n 0002964053 00000 n 0002968484 00000 n 0002963828 00000 n 0002964022 00000 n 0002968605 00000 n 0002968507 00000 n 0002968556 00000 n 0002968951 00000 n 0002973553 00000 n 0002968735 00000 n 0002968929 00000 n 0002973870 00000 n 0002973576 00000 n 0002973625 00000 n 0002973674 00000 n 0002973723 00000 n 0002973772 00000 n 0002973821 00000 n 0002974216 00000 n 0002978091 00000 n 0002974000 00000 n 0002974194 00000 n 0002978422 00000 n 0002978114 00000 n 0002978163 00000 n 0002978212 00000 n 0002978268 00000 n 0002978324 00000 n 0002978373 00000 n 0002978768 00000 n 0002982839 00000 n 0002978552 00000 n 0002978746 00000 n 0002983198 00000 n 0002982862 00000 n 0002982918 00000 n 0002982974 00000 n 0002983030 00000 n 0002983086 00000 n 0002983142 00000 n 0002983544 00000 n 0002991185 00000 n 0002983328 00000 n 0002983522 00000 n 0002991852 00000 n 0002991208 00000 n 0002991257 00000 n 0002991313 00000 n 0002991369 00000 n 0002991418 00000 n 0002991467 00000 n 0002991523 00000 n 0002991579 00000 n 0002991635 00000 n 0002991691 00000 n 0002991747 00000 n 0002991796 00000 n 0002992214 00000 n 0003000679 00000 n 0002991982 00000 n 0002992192 00000 n 0003025418 00000 n 0003000702 00000 n 0003000948 00000 n 0003001201 00000 n 0003001447 00000 n 0003001693 00000 n 0003001946 00000 n 0003002185 00000 n 0003002438 00000 n 0003002692 00000 n 0003002932 00000 n 0003003179 00000 n 0003003433 00000 n 0003003680 00000 n 0003003934 00000 n 0003004181 00000 n 0003004435 00000 n 0003004689 00000 n 0003004936 00000 n 0003005183 00000 n 0003005430 00000 n 0003005670 00000 n 0003005917 00000 n 0003006164 00000 n 0003006418 00000 n 0003006672 00000 n 0003006919 00000 n 0003007173 00000 n 0003007442 00000 n 0003007708 00000 n 0003007963 00000 n 0003008210 00000 n 0003008464 00000 n 0003008720 00000 n 0003008983 00000 n 0003009251 00000 n 0003009498 00000 n 0003009743 00000 n 0003009997 00000 n 0003010237 00000 n 0003010491 00000 n 0003010745 00000 n 0003010992 00000 n 0003011246 00000 n 0003011493 00000 n 0003011740 00000 n 0003011994 00000 n 0003012241 00000 n 0003012495 00000 n 0003012749 00000 n 0003012997 00000 n 0003013257 00000 n 0003013504 00000 n 0003013744 00000 n 0003013998 00000 n 0003014245 00000 n 0003014499 00000 n 0003014761 00000 n 0003015008 00000 n 0003015262 00000 n 0003015509 00000 n 0003015756 00000 n 0003016010 00000 n 0003016257 00000 n 0003016511 00000 n 0003016758 00000 n 0003016998 00000 n 0003017245 00000 n 0003017492 00000 n 0003017739 00000 n 0003017911 00000 n 0003018158 00000 n 0003018405 00000 n 0003018659 00000 n 0003018907 00000 n 0003019162 00000 n 0003019414 00000 n 0003019666 00000 n 0003019921 00000 n 0003020168 00000 n 0003020422 00000 n 0003020685 00000 n 0003020941 00000 n 0003021193 00000 n 0003021443 00000 n 0003021706 00000 n 0003021970 00000 n 0003022140 00000 n 0003022317 00000 n 0003022589 00000 n 0003022853 00000 n 0003023125 00000 n 0003023382 00000 n 0003023629 00000 n 0003023883 00000 n 0003024130 00000 n 0003024384 00000 n 0003024643 00000 n 0003024899 00000 n 0003025158 00000 n 0003026639 00000 n 0003035901 00000 n 0003025548 00000 n 0003025726 00000 n 0003036810 00000 n 0003035924 00000 n 0003035980 00000 n 0003036036 00000 n 0003036092 00000 n 0003036148 00000 n 0003036204 00000 n 0003036253 00000 n 0003036309 00000 n 0003036365 00000 n 0003036606 00000 n 0003037174 00000 n 0003043082 00000 n 0003036940 00000 n 0003037134 00000 n 0003043518 00000 n 0003043105 00000 n 0003043161 00000 n 0003043217 00000 n 0003043273 00000 n 0003043329 00000 n 0003043873 00000 n 0003052202 00000 n 0003043648 00000 n 0003043842 00000 n 0003052435 00000 n 0003052225 00000 n 0003052274 00000 n 0003052330 00000 n 0003052386 00000 n 0003052797 00000 n 0003059689 00000 n 0003052565 00000 n 0003052775 00000 n 0003060126 00000 n 0003059712 00000 n 0003059768 00000 n 0003059817 00000 n 0003059873 00000 n 0003059922 00000 n 0003060481 00000 n 0003070412 00000 n 0003060256 00000 n 0003060450 00000 n 0003071163 00000 n 0003070435 00000 n 0003070491 00000 n 0003070547 00000 n 0003070603 00000 n 0003070652 00000 n 0003070708 00000 n 0003070764 00000 n 0003070820 00000 n 0003070876 00000 n 0003070925 00000 n 0003070981 00000 n 0003071518 00000 n 0003078108 00000 n 0003071293 00000 n 0003071487 00000 n 0003078856 00000 n 0003078131 00000 n 0003078180 00000 n 0003078236 00000 n 0003078285 00000 n 0003078341 00000 n 0003078608 00000 n 0003079220 00000 n 0003084833 00000 n 0003078986 00000 n 0003079180 00000 n 0003084968 00000 n 0003084856 00000 n 0003084912 00000 n 0003085314 00000 n 0003090416 00000 n 0003085098 00000 n 0003085292 00000 n 0003090535 00000 n 0003090439 00000 n 0003090487 00000 n 0003090881 00000 n 0003095892 00000 n 0003090665 00000 n 0003090859 00000 n 0003096139 00000 n 0003095915 00000 n 0003095971 00000 n 0003096027 00000 n 0003096083 00000 n 0003096485 00000 n 0003100377 00000 n 0003096269 00000 n 0003096463 00000 n 0003100498 00000 n 0003100400 00000 n 0003100449 00000 n 0003100844 00000 n 0003105233 00000 n 0003100628 00000 n 0003100822 00000 n 0003105896 00000 n 0003105256 00000 n 0003105312 00000 n 0003105368 00000 n 0003105424 00000 n 0003105480 00000 n 0003105670 00000 n 0003106260 00000 n 0003110682 00000 n 0003106026 00000 n 0003106220 00000 n 0003111671 00000 n 0003110705 00000 n 0003110761 00000 n 0003110817 00000 n 0003110873 00000 n 0003110929 00000 n 0003110985 00000 n 0003111041 00000 n 0003111097 00000 n 0003111153 00000 n 0003111405 00000 n 0003112035 00000 n 0003116497 00000 n 0003111801 00000 n 0003111995 00000 n 0003117972 00000 n 0003116520 00000 n 0003116576 00000 n 0003116625 00000 n 0003116674 00000 n 0003116730 00000 n 0003116786 00000 n 0003116842 00000 n 0003116898 00000 n 0003116947 00000 n 0003117216 00000 n 0003117480 00000 n 0003117720 00000 n 0003118354 00000 n 0003124440 00000 n 0003118102 00000 n 0003118296 00000 n 0003125042 00000 n 0003124463 00000 n 0003124519 00000 n 0003124575 00000 n 0003124837 00000 n 0003125406 00000 n 0003130816 00000 n 0003125172 00000 n 0003125366 00000 n 0003131158 00000 n 0003130839 00000 n 0003130895 00000 n 0003130951 00000 n 0003131513 00000 n 0003137017 00000 n 0003131288 00000 n 0003131482 00000 n 0003137408 00000 n 0003137040 00000 n 0003137096 00000 n 0003137152 00000 n 0003137763 00000 n 0003142601 00000 n 0003137538 00000 n 0003137732 00000 n 0003142848 00000 n 0003142624 00000 n 0003142680 00000 n 0003142736 00000 n 0003142792 00000 n 0003143194 00000 n 0003148830 00000 n 0003142978 00000 n 0003143172 00000 n 0003149175 00000 n 0003148853 00000 n 0003148909 00000 n 0003148965 00000 n 0003149014 00000 n 0003149070 00000 n 0003149126 00000 n 0003149537 00000 n 0003157722 00000 n 0003149305 00000 n 0003149515 00000 n 0003158284 00000 n 0003157745 00000 n 0003157794 00000 n 0003157850 00000 n 0003157906 00000 n 0003157962 00000 n 0003158018 00000 n 0003158067 00000 n 0003158123 00000 n 0003158172 00000 n 0003158228 00000 n 0003158630 00000 n 0003165804 00000 n 0003158414 00000 n 0003158608 00000 n 0003165939 00000 n 0003165827 00000 n 0003165883 00000 n 0003166285 00000 n 0003171956 00000 n 0003166069 00000 n 0003166263 00000 n 0003171979 00000 n 0003172315 00000 n 0003176462 00000 n 0003172109 00000 n 0003172293 00000 n 0003176695 00000 n 0003176485 00000 n 0003176534 00000 n 0003176590 00000 n 0003176639 00000 n 0003177041 00000 n 0003181044 00000 n 0003176825 00000 n 0003177019 00000 n 0003181542 00000 n 0003181067 00000 n 0003181123 00000 n 0003181179 00000 n 0003181235 00000 n 0003181291 00000 n 0003181897 00000 n 0003186379 00000 n 0003181672 00000 n 0003181866 00000 n 0003187152 00000 n 0003186402 00000 n 0003186458 00000 n 0003186514 00000 n 0003186570 00000 n 0003186626 00000 n 0003186888 00000 n 0003187516 00000 n 0003192736 00000 n 0003187282 00000 n 0003187476 00000 n 0003192871 00000 n 0003192759 00000 n 0003192815 00000 n 0003193217 00000 n 0003197156 00000 n 0003193001 00000 n 0003193195 00000 n 0003197869 00000 n 0003197179 00000 n 0003197228 00000 n 0003197284 00000 n 0003197333 00000 n 0003197389 00000 n 0003197632 00000 n 0003198233 00000 n 0003203488 00000 n 0003197999 00000 n 0003198193 00000 n 0003204614 00000 n 0003203511 00000 n 0003203567 00000 n 0003203623 00000 n 0003203672 00000 n 0003203721 00000 n 0003203777 00000 n 0003203833 00000 n 0003204091 00000 n 0003204369 00000 n 0003204987 00000 n 0003210634 00000 n 0003204744 00000 n 0003204938 00000 n 0003211490 00000 n 0003210657 00000 n 0003210713 00000 n 0003210769 00000 n 0003210818 00000 n 0003210874 00000 n 0003210923 00000 n 0003210979 00000 n 0003211231 00000 n 0003211854 00000 n 0003217210 00000 n 0003211620 00000 n 0003211814 00000 n 0003217450 00000 n 0003217233 00000 n 0003217289 00000 n 0003217345 00000 n 0003217394 00000 n 0003217796 00000 n 0003221667 00000 n 0003217580 00000 n 0003217774 00000 n 0003221802 00000 n 0003221690 00000 n 0003221746 00000 n 0003222148 00000 n 0003226269 00000 n 0003221932 00000 n 0003222126 00000 n 0003226675 00000 n 0003226292 00000 n 0003226348 00000 n 0003226404 00000 n 0003227030 00000 n 0003232145 00000 n 0003226805 00000 n 0003226999 00000 n 0003232378 00000 n 0003232168 00000 n 0003232217 00000 n 0003232273 00000 n 0003232322 00000 n 0003232724 00000 n 0003236967 00000 n 0003232508 00000 n 0003232702 00000 n 0003237480 00000 n 0003236990 00000 n 0003237046 00000 n 0003237102 00000 n 0003237158 00000 n 0003237214 00000 n 0003237835 00000 n 0003243605 00000 n 0003237610 00000 n 0003237804 00000 n 0003244107 00000 n 0003243628 00000 n 0003243684 00000 n 0003243740 00000 n 0003243796 00000 n 0003243852 00000 n 0003244462 00000 n 0003250767 00000 n 0003244237 00000 n 0003244431 00000 n 0003251561 00000 n 0003250790 00000 n 0003250846 00000 n 0003250902 00000 n 0003250958 00000 n 0003251014 00000 n 0003251070 00000 n 0003251119 00000 n 0003251175 00000 n 0003251231 00000 n 0003251287 00000 n 0003251336 00000 n 0003251948 00000 n 0003257240 00000 n 0003251691 00000 n 0003251917 00000 n 0003258437 00000 n 0003257263 00000 n 0003257319 00000 n 0003257375 00000 n 0003257431 00000 n 0003257487 00000 n 0003257543 00000 n 0003257592 00000 n 0003257648 00000 n 0003257697 00000 n 0003257968 00000 n 0003258233 00000 n 0003258810 00000 n 0003265575 00000 n 0003258567 00000 n 0003258761 00000 n 0003265808 00000 n 0003265598 00000 n 0003265647 00000 n 0003265696 00000 n 0003265752 00000 n 0003266154 00000 n 0003270825 00000 n 0003265938 00000 n 0003266132 00000 n 0003271466 00000 n 0003270848 00000 n 0003270904 00000 n 0003270960 00000 n 0003271016 00000 n 0003271072 00000 n 0003271269 00000 n 0003271830 00000 n 0003277709 00000 n 0003271596 00000 n 0003271790 00000 n 0003278624 00000 n 0003277732 00000 n 0003277788 00000 n 0003277844 00000 n 0003277900 00000 n 0003277956 00000 n 0003278012 00000 n 0003278068 00000 n 0003278124 00000 n 0003278180 00000 n 0003278427 00000 n 0003278988 00000 n 0003283891 00000 n 0003278754 00000 n 0003278948 00000 n 0003284298 00000 n 0003283914 00000 n 0003283970 00000 n 0003284026 00000 n 0003284653 00000 n 0003290267 00000 n 0003284428 00000 n 0003284622 00000 n 0003291923 00000 n 0003290290 00000 n 0003290346 00000 n 0003290402 00000 n 0003290458 00000 n 0003290514 00000 n 0003290570 00000 n 0003290626 00000 n 0003290682 00000 n 0003290738 00000 n 0003290999 00000 n 0003291253 00000 n 0003291464 00000 n 0003291726 00000 n 0003292314 00000 n 0003300162 00000 n 0003292053 00000 n 0003292247 00000 n 0003300599 00000 n 0003300185 00000 n 0003300241 00000 n 0003300297 00000 n 0003300353 00000 n 0003300409 00000 n 0003300954 00000 n 0003306151 00000 n 0003300729 00000 n 0003300923 00000 n 0003306483 00000 n 0003306174 00000 n 0003306230 00000 n 0003306286 00000 n 0003306838 00000 n 0003312377 00000 n 0003306613 00000 n 0003306807 00000 n 0003312624 00000 n 0003312400 00000 n 0003312456 00000 n 0003312512 00000 n 0003312568 00000 n 0003312970 00000 n 0003317452 00000 n 0003312754 00000 n 0003312948 00000 n 0003320352 00000 n 0003317475 00000 n 0003317531 00000 n 0003317587 00000 n 0003317636 00000 n 0003317692 00000 n 0003317748 00000 n 0003317804 00000 n 0003317853 00000 n 0003317909 00000 n 0003317965 00000 n 0003318014 00000 n 0003318262 00000 n 0003318510 00000 n 0003318751 00000 n 0003318999 00000 n 0003319250 00000 n 0003319491 00000 n 0003319750 00000 n 0003319991 00000 n 0003320165 00000 n 0003320788 00000 n 0003327821 00000 n 0003320482 00000 n 0003320676 00000 n 0003328285 00000 n 0003327844 00000 n 0003327900 00000 n 0003327956 00000 n 0003328005 00000 n 0003328061 00000 n 0003328117 00000 n 0003328173 00000 n 0003328229 00000 n 0003328631 00000 n 0003333103 00000 n 0003328415 00000 n 0003328609 00000 n 0003347890 00000 n 0003333126 00000 n 0003333175 00000 n 0003333231 00000 n 0003333287 00000 n 0003333343 00000 n 0003333587 00000 n 0003333838 00000 n 0003334082 00000 n 0003334333 00000 n 0003334584 00000 n 0003334821 00000 n 0003335072 00000 n 0003335316 00000 n 0003335561 00000 n 0003335813 00000 n 0003336058 00000 n 0003336310 00000 n 0003336562 00000 n 0003336800 00000 n 0003337052 00000 n 0003337290 00000 n 0003337535 00000 n 0003337780 00000 n 0003338025 00000 n 0003338270 00000 n 0003338522 00000 n 0003338767 00000 n 0003339021 00000 n 0003339269 00000 n 0003339521 00000 n 0003339773 00000 n 0003340040 00000 n 0003340311 00000 n 0003340563 00000 n 0003340802 00000 n 0003341054 00000 n 0003341299 00000 n 0003341544 00000 n 0003341796 00000 n 0003342041 00000 n 0003342286 00000 n 0003342538 00000 n 0003342783 00000 n 0003343037 00000 n 0003343282 00000 n 0003343527 00000 n 0003343779 00000 n 0003344024 00000 n 0003344285 00000 n 0003344543 00000 n 0003344795 00000 n 0003345064 00000 n 0003345309 00000 n 0003345554 00000 n 0003345820 00000 n 0003346073 00000 n 0003346330 00000 n 0003346594 00000 n 0003346848 00000 n 0003347112 00000 n 0003347369 00000 n 0003347625 00000 n 0003348758 00000 n 0003356492 00000 n 0003348020 00000 n 0003348214 00000 n 0003367519 00000 n 0003356515 00000 n 0003356571 00000 n 0003356627 00000 n 0003356683 00000 n 0003356739 00000 n 0003356788 00000 n 0003356844 00000 n 0003356900 00000 n 0003356956 00000 n 0003357211 00000 n 0003357468 00000 n 0003357724 00000 n 0003357984 00000 n 0003358252 00000 n 0003358516 00000 n 0003358776 00000 n 0003359034 00000 n 0003359279 00000 n 0003359531 00000 n 0003359777 00000 n 0003360023 00000 n 0003360276 00000 n 0003360522 00000 n 0003360775 00000 n 0003361027 00000 n 0003361272 00000 n 0003361524 00000 n 0003361769 00000 n 0003362008 00000 n 0003362260 00000 n 0003362505 00000 n 0003362750 00000 n 0003363002 00000 n 0003363248 00000 n 0003363505 00000 n 0003363755 00000 n 0003364013 00000 n 0003364266 00000 n 0003364511 00000 n 0003364763 00000 n 0003365031 00000 n 0003365276 00000 n 0003365528 00000 n 0003365773 00000 n 0003366018 00000 n 0003366270 00000 n 0003366515 00000 n 0003366767 00000 n 0003367019 00000 n 0003367264 00000 n 0003368243 00000 n 0003375052 00000 n 0003367649 00000 n 0003367843 00000 n 0003375810 00000 n 0003375075 00000 n 0003375131 00000 n 0003375187 00000 n 0003375236 00000 n 0003375292 00000 n 0003375348 00000 n 0003375404 00000 n 0003375460 00000 n 0003375516 00000 n 0003375565 00000 n 0003375614 00000 n 0003376181 00000 n 0003384715 00000 n 0003375940 00000 n 0003376150 00000 n 0003385053 00000 n 0003384738 00000 n 0003384794 00000 n 0003384850 00000 n 0003384899 00000 n 0003384955 00000 n 0003385004 00000 n 0003385431 00000 n 0003390955 00000 n 0003385183 00000 n 0003385409 00000 n 0003391286 00000 n 0003390978 00000 n 0003391027 00000 n 0003391076 00000 n 0003391125 00000 n 0003391174 00000 n 0003391230 00000 n 0003391664 00000 n 0003396050 00000 n 0003391416 00000 n 0003391642 00000 n 0003396562 00000 n 0003396073 00000 n 0003396129 00000 n 0003396185 00000 n 0003396241 00000 n 0003396297 00000 n 0003396933 00000 n 0003401498 00000 n 0003396692 00000 n 0003396902 00000 n 0003401619 00000 n 0003401521 00000 n 0003401570 00000 n 0003401997 00000 n 0003406939 00000 n 0003401749 00000 n 0003401975 00000 n 0003407270 00000 n 0003406962 00000 n 0003407018 00000 n 0003407074 00000 n 0003407641 00000 n 0003412143 00000 n 0003407400 00000 n 0003407610 00000 n 0003412992 00000 n 0003412166 00000 n 0003412215 00000 n 0003412271 00000 n 0003412319 00000 n 0003412368 00000 n 0003412424 00000 n 0003412472 00000 n 0003412723 00000 n 0003413372 00000 n 0003418083 00000 n 0003413122 00000 n 0003413332 00000 n 0003418218 00000 n 0003418106 00000 n 0003418162 00000 n 0003418580 00000 n 0003422616 00000 n 0003418348 00000 n 0003418558 00000 n 0003423108 00000 n 0003422639 00000 n 0003422695 00000 n 0003422751 00000 n 0003422807 00000 n 0003422863 00000 n 0003423479 00000 n 0003429190 00000 n 0003423238 00000 n 0003423448 00000 n 0003430380 00000 n 0003429213 00000 n 0003429262 00000 n 0003429311 00000 n 0003429367 00000 n 0003429423 00000 n 0003429479 00000 n 0003429535 00000 n 0003429584 00000 n 0003429633 00000 n 0003429689 00000 n 0003429745 00000 n 0003429801 00000 n 0003429857 00000 n 0003430130 00000 n 0003430760 00000 n 0003436683 00000 n 0003430510 00000 n 0003430720 00000 n 0003437541 00000 n 0003436706 00000 n 0003436762 00000 n 0003436818 00000 n 0003436874 00000 n 0003436930 00000 n 0003436986 00000 n 0003437042 00000 n 0003437292 00000 n 0003437937 00000 n 0003444185 00000 n 0003437671 00000 n 0003437897 00000 n 0003444689 00000 n 0003444208 00000 n 0003444264 00000 n 0003444320 00000 n 0003444376 00000 n 0003444425 00000 n 0003445076 00000 n 0003449306 00000 n 0003444819 00000 n 0003445045 00000 n 0003449803 00000 n 0003449329 00000 n 0003449378 00000 n 0003449434 00000 n 0003449490 00000 n 0003449546 00000 n 0003450158 00000 n 0003454125 00000 n 0003449933 00000 n 0003450127 00000 n 0003454503 00000 n 0003454148 00000 n 0003454204 00000 n 0003454260 00000 n 0003454858 00000 n 0003459255 00000 n 0003454633 00000 n 0003454827 00000 n 0003460231 00000 n 0003459278 00000 n 0003459334 00000 n 0003459390 00000 n 0003459446 00000 n 0003459502 00000 n 0003459558 00000 n 0003459614 00000 n 0003459670 00000 n 0003459719 00000 n 0003459972 00000 n 0003460595 00000 n 0003467844 00000 n 0003460361 00000 n 0003460555 00000 n 0003467867 00000 n 0003468219 00000 n 0003473231 00000 n 0003467997 00000 n 0003468197 00000 n 0003473702 00000 n 0003473254 00000 n 0003473310 00000 n 0003473366 00000 n 0003473422 00000 n 0003473478 00000 n 0003473534 00000 n 0003473590 00000 n 0003473646 00000 n 0003474048 00000 n 0003477916 00000 n 0003473832 00000 n 0003474026 00000 n 0003478261 00000 n 0003477939 00000 n 0003477995 00000 n 0003478044 00000 n 0003478100 00000 n 0003478156 00000 n 0003478205 00000 n 0003478607 00000 n 0003483294 00000 n 0003478391 00000 n 0003478585 00000 n 0003484215 00000 n 0003483317 00000 n 0003483366 00000 n 0003483422 00000 n 0003483471 00000 n 0003483527 00000 n 0003483583 00000 n 0003483639 00000 n 0003483695 00000 n 0003483751 00000 n 0003483807 00000 n 0003483856 00000 n 0003483905 00000 n 0003483961 00000 n 0003484586 00000 n 0003491032 00000 n 0003484345 00000 n 0003484555 00000 n 0003492247 00000 n 0003491055 00000 n 0003491111 00000 n 0003491167 00000 n 0003491216 00000 n 0003491272 00000 n 0003491321 00000 n 0003491377 00000 n 0003491433 00000 n 0003491489 00000 n 0003491545 00000 n 0003491601 00000 n 0003491657 00000 n 0003491713 00000 n 0003491973 00000 n 0003492627 00000 n 0003497773 00000 n 0003492377 00000 n 0003492587 00000 n 0003498566 00000 n 0003497796 00000 n 0003497845 00000 n 0003497894 00000 n 0003497950 00000 n 0003498006 00000 n 0003498055 00000 n 0003498104 00000 n 0003498153 00000 n 0003498209 00000 n 0003498265 00000 n 0003498314 00000 n 0003498921 00000 n 0003505861 00000 n 0003498696 00000 n 0003498890 00000 n 0003506430 00000 n 0003505884 00000 n 0003505933 00000 n 0003505989 00000 n 0003506045 00000 n 0003506101 00000 n 0003506157 00000 n 0003506213 00000 n 0003506269 00000 n 0003506325 00000 n 0003506374 00000 n 0003506808 00000 n 0003514795 00000 n 0003506560 00000 n 0003506786 00000 n 0003515154 00000 n 0003514818 00000 n 0003514874 00000 n 0003514930 00000 n 0003514986 00000 n 0003515042 00000 n 0003515098 00000 n 0003515516 00000 n 0003520811 00000 n 0003515284 00000 n 0003515494 00000 n 0003520946 00000 n 0003520834 00000 n 0003520890 00000 n 0003521324 00000 n 0003527675 00000 n 0003521076 00000 n 0003521302 00000 n 0003527810 00000 n 0003527698 00000 n 0003527754 00000 n 0003528188 00000 n 0003534081 00000 n 0003527940 00000 n 0003528166 00000 n 0003534314 00000 n 0003534104 00000 n 0003534153 00000 n 0003534209 00000 n 0003534258 00000 n 0003534692 00000 n 0003539850 00000 n 0003534444 00000 n 0003534670 00000 n 0003540905 00000 n 0003539873 00000 n 0003539929 00000 n 0003539985 00000 n 0003540041 00000 n 0003540097 00000 n 0003540153 00000 n 0003540209 00000 n 0003540265 00000 n 0003540321 00000 n 0003540377 00000 n 0003540426 00000 n 0003540482 00000 n 0003540531 00000 n 0003540587 00000 n 0003540643 00000 n 0003541276 00000 n 0003547152 00000 n 0003541035 00000 n 0003541245 00000 n 0003547965 00000 n 0003547175 00000 n 0003547224 00000 n 0003547280 00000 n 0003547336 00000 n 0003547392 00000 n 0003547448 00000 n 0003547497 00000 n 0003547553 00000 n 0003547602 00000 n 0003547651 00000 n 0003547707 00000 n 0003548336 00000 n 0003557349 00000 n 0003548095 00000 n 0003548305 00000 n 0003557484 00000 n 0003557372 00000 n 0003557428 00000 n 0003557862 00000 n 0003562720 00000 n 0003557614 00000 n 0003557840 00000 n 0003563336 00000 n 0003562743 00000 n 0003562799 00000 n 0003562855 00000 n 0003562911 00000 n 0003562967 00000 n 0003563023 00000 n 0003563079 00000 n 0003563691 00000 n 0003570201 00000 n 0003563466 00000 n 0003563660 00000 n 0003570595 00000 n 0003570224 00000 n 0003570280 00000 n 0003570336 00000 n 0003570966 00000 n 0003574925 00000 n 0003570725 00000 n 0003570935 00000 n 0003575198 00000 n 0003574948 00000 n 0003575559 00000 n 0003580085 00000 n 0003575328 00000 n 0003575528 00000 n 0003580730 00000 n 0003580108 00000 n 0003580164 00000 n 0003580220 00000 n 0003580473 00000 n 0003581110 00000 n 0003586503 00000 n 0003580860 00000 n 0003581070 00000 n 0003586888 00000 n 0003586526 00000 n 0003586575 00000 n 0003586624 00000 n 0003587259 00000 n 0003592616 00000 n 0003587018 00000 n 0003587228 00000 n 0003592751 00000 n 0003592639 00000 n 0003592695 00000 n 0003593113 00000 n 0003597552 00000 n 0003592881 00000 n 0003593091 00000 n 0003609543 00000 n 0003597575 00000 n 0003597624 00000 n 0003597680 00000 n 0003597736 00000 n 0003597792 00000 n 0003597841 00000 n 0003597897 00000 n 0003598160 00000 n 0003598422 00000 n 0003598695 00000 n 0003598973 00000 n 0003599243 00000 n 0003599511 00000 n 0003599781 00000 n 0003600032 00000 n 0003600299 00000 n 0003600569 00000 n 0003600830 00000 n 0003601078 00000 n 0003601326 00000 n 0003601594 00000 n 0003601872 00000 n 0003602127 00000 n 0003602392 00000 n 0003602659 00000 n 0003602831 00000 n 0003603010 00000 n 0003603262 00000 n 0003603525 00000 n 0003603792 00000 n 0003604059 00000 n 0003604231 00000 n 0003604503 00000 n 0003604768 00000 n 0003605041 00000 n 0003605307 00000 n 0003605566 00000 n 0003605817 00000 n 0003606084 00000 n 0003606349 00000 n 0003606631 00000 n 0003606891 00000 n 0003607153 00000 n 0003607417 00000 n 0003607674 00000 n 0003607953 00000 n 0003608223 00000 n 0003608490 00000 n 0003608660 00000 n 0003608835 00000 n 0003609100 00000 n 0003609366 00000 n 0003610303 00000 n 0003618748 00000 n 0003609673 00000 n 0003609867 00000 n 0003619734 00000 n 0003618771 00000 n 0003618827 00000 n 0003618876 00000 n 0003618932 00000 n 0003618988 00000 n 0003619044 00000 n 0003619093 00000 n 0003619149 00000 n 0003619205 00000 n 0003619470 00000 n 0003620098 00000 n 0003624324 00000 n 0003619864 00000 n 0003620058 00000 n 0003625792 00000 n 0003624347 00000 n 0003624403 00000 n 0003624459 00000 n 0003624515 00000 n 0003624571 00000 n 0003624627 00000 n 0003624683 00000 n 0003624739 00000 n 0003624795 00000 n 0003624851 00000 n 0003624907 00000 n 0003624963 00000 n 0003625019 00000 n 0003625279 00000 n 0003625533 00000 n 0003626165 00000 n 0003631618 00000 n 0003625922 00000 n 0003626116 00000 n 0003631865 00000 n 0003631641 00000 n 0003631697 00000 n 0003631753 00000 n 0003631809 00000 n 0003632211 00000 n 0003635411 00000 n 0003631995 00000 n 0003632189 00000 n 0003635910 00000 n 0003635434 00000 n 0003635490 00000 n 0003635539 00000 n 0003635595 00000 n 0003635644 00000 n 0003636265 00000 n 0003639105 00000 n 0003636040 00000 n 0003636234 00000 n 0003640252 00000 n 0003639128 00000 n 0003639177 00000 n 0003639233 00000 n 0003639282 00000 n 0003639338 00000 n 0003639610 00000 n 0003639824 00000 n 0003640032 00000 n 0003640634 00000 n 0003644095 00000 n 0003640382 00000 n 0003640576 00000 n 0003644454 00000 n 0003644118 00000 n 0003644174 00000 n 0003644230 00000 n 0003644286 00000 n 0003644342 00000 n 0003644398 00000 n 0003644800 00000 n 0003649318 00000 n 0003644584 00000 n 0003644778 00000 n 0003649728 00000 n 0003649341 00000 n 0003649397 00000 n 0003649453 00000 n 0003650083 00000 n 0003653320 00000 n 0003649858 00000 n 0003650052 00000 n 0003654333 00000 n 0003653343 00000 n 0003653399 00000 n 0003653455 00000 n 0003653511 00000 n 0003653567 00000 n 0003653842 00000 n 0003654120 00000 n 0003654706 00000 n 0003658816 00000 n 0003654463 00000 n 0003654657 00000 n 0003659063 00000 n 0003658839 00000 n 0003658895 00000 n 0003658951 00000 n 0003659007 00000 n 0003659409 00000 n 0003662802 00000 n 0003659193 00000 n 0003659387 00000 n 0003663299 00000 n 0003662825 00000 n 0003662874 00000 n 0003662930 00000 n 0003662986 00000 n 0003663035 00000 n 0003663654 00000 n 0003667138 00000 n 0003663429 00000 n 0003663623 00000 n 0003668382 00000 n 0003667161 00000 n 0003667217 00000 n 0003667273 00000 n 0003667322 00000 n 0003667378 00000 n 0003667434 00000 n 0003667490 00000 n 0003667539 00000 n 0003667595 00000 n 0003667853 00000 n 0003668112 00000 n 0003668755 00000 n 0003673852 00000 n 0003668512 00000 n 0003668706 00000 n 0003674381 00000 n 0003673875 00000 n 0003673931 00000 n 0003673987 00000 n 0003674043 00000 n 0003674099 00000 n 0003674736 00000 n 0003680412 00000 n 0003674511 00000 n 0003674705 00000 n 0003680659 00000 n 0003680435 00000 n 0003680491 00000 n 0003680547 00000 n 0003680603 00000 n 0003681005 00000 n 0003685398 00000 n 0003680789 00000 n 0003680983 00000 n 0003685700 00000 n 0003685421 00000 n 0003686045 00000 n 0003690033 00000 n 0003685830 00000 n 0003686014 00000 n 0003690483 00000 n 0003690056 00000 n 0003690105 00000 n 0003690154 00000 n 0003690210 00000 n 0003690266 00000 n 0003690322 00000 n 0003690378 00000 n 0003690427 00000 n 0003690861 00000 n 0003695823 00000 n 0003690613 00000 n 0003690839 00000 n 0003702695 00000 n 0003695846 00000 n 0003695902 00000 n 0003695951 00000 n 0003696007 00000 n 0003696063 00000 n 0003696119 00000 n 0003696175 00000 n 0003696231 00000 n 0003696280 00000 n 0003696336 00000 n 0003696385 00000 n 0003696628 00000 n 0003696878 00000 n 0003697128 00000 n 0003697364 00000 n 0003697614 00000 n 0003697857 00000 n 0003698093 00000 n 0003698343 00000 n 0003698580 00000 n 0003698831 00000 n 0003699082 00000 n 0003699326 00000 n 0003699577 00000 n 0003699821 00000 n 0003700065 00000 n 0003700316 00000 n 0003700560 00000 n 0003700811 00000 n 0003701055 00000 n 0003701298 00000 n 0003701542 00000 n 0003701778 00000 n 0003702021 00000 n 0003702272 00000 n 0003702490 00000 n 0003703291 00000 n 0003710812 00000 n 0003702825 00000 n 0003703035 00000 n 0003716644 00000 n 0003710835 00000 n 0003710891 00000 n 0003710947 00000 n 0003711003 00000 n 0003711059 00000 n 0003711115 00000 n 0003711171 00000 n 0003711227 00000 n 0003711283 00000 n 0003711527 00000 n 0003711778 00000 n 0003712022 00000 n 0003712259 00000 n 0003712510 00000 n 0003712754 00000 n 0003712998 00000 n 0003713249 00000 n 0003713493 00000 n 0003713744 00000 n 0003713988 00000 n 0003714232 00000 n 0003714483 00000 n 0003714727 00000 n 0003714971 00000 n 0003715222 00000 n 0003715466 00000 n 0003715717 00000 n 0003715961 00000 n 0003716205 00000 n 0003716448 00000 n 0003717188 00000 n 0003724369 00000 n 0003716774 00000 n 0003716968 00000 n 0003724616 00000 n 0003724392 00000 n 0003724448 00000 n 0003724504 00000 n 0003724560 00000 n 0003724962 00000 n 0003731379 00000 n 0003724746 00000 n 0003724940 00000 n 0003732011 00000 n 0003731402 00000 n 0003731458 00000 n 0003731507 00000 n 0003731556 00000 n 0003731605 00000 n 0003731654 00000 n 0003731710 00000 n 0003731759 00000 n 0003731808 00000 n 0003731857 00000 n 0003731913 00000 n 0003731962 00000 n 0003732357 00000 n 0003741402 00000 n 0003732141 00000 n 0003732335 00000 n 0003741859 00000 n 0003741425 00000 n 0003741481 00000 n 0003741537 00000 n 0003741593 00000 n 0003741642 00000 n 0003741698 00000 n 0003741747 00000 n 0003741803 00000 n 0003742205 00000 n 0003746790 00000 n 0003741989 00000 n 0003742183 00000 n 0003747538 00000 n 0003746813 00000 n 0003746869 00000 n 0003746918 00000 n 0003746974 00000 n 0003747023 00000 n 0003747297 00000 n 0003747902 00000 n 0003752982 00000 n 0003747668 00000 n 0003747862 00000 n 0003753117 00000 n 0003753005 00000 n 0003753061 00000 n 0003753463 00000 n 0003758691 00000 n 0003753247 00000 n 0003753441 00000 n 0003758714 00000 n 0003759050 00000 n 0003763295 00000 n 0003758844 00000 n 0003759028 00000 n 0003763640 00000 n 0003763318 00000 n 0003763374 00000 n 0003763423 00000 n 0003763479 00000 n 0003763528 00000 n 0003763584 00000 n 0003763986 00000 n 0003767437 00000 n 0003763770 00000 n 0003763964 00000 n 0003767668 00000 n 0003767460 00000 n 0003767516 00000 n 0003767572 00000 n 0003767620 00000 n 0003768014 00000 n 0003772175 00000 n 0003767798 00000 n 0003767992 00000 n 0003772296 00000 n 0003772198 00000 n 0003772247 00000 n 0003772642 00000 n 0003776577 00000 n 0003772426 00000 n 0003772620 00000 n 0003777181 00000 n 0003776600 00000 n 0003776656 00000 n 0003776705 00000 n 0003776761 00000 n 0003776810 00000 n 0003776866 00000 n 0003776922 00000 n 0003777536 00000 n 0003782233 00000 n 0003777311 00000 n 0003777505 00000 n 0003782972 00000 n 0003782256 00000 n 0003782312 00000 n 0003782368 00000 n 0003782424 00000 n 0003782480 00000 n 0003782720 00000 n 0003783336 00000 n 0003787400 00000 n 0003783102 00000 n 0003783296 00000 n 0003787535 00000 n 0003787423 00000 n 0003787479 00000 n 0003787881 00000 n 0003791843 00000 n 0003787665 00000 n 0003787859 00000 n 0003791978 00000 n 0003791866 00000 n 0003791922 00000 n 0003792324 00000 n 0003796015 00000 n 0003792108 00000 n 0003792302 00000 n 0003796757 00000 n 0003796038 00000 n 0003796094 00000 n 0003796150 00000 n 0003796199 00000 n 0003796255 00000 n 0003796505 00000 n 0003797121 00000 n 0003801142 00000 n 0003796887 00000 n 0003797081 00000 n 0003801263 00000 n 0003801165 00000 n 0003801214 00000 n 0003801609 00000 n 0003806271 00000 n 0003801393 00000 n 0003801587 00000 n 0003806756 00000 n 0003806294 00000 n 0003806350 00000 n 0003806406 00000 n 0003806455 00000 n 0003806504 00000 n 0003807111 00000 n 0003811210 00000 n 0003806886 00000 n 0003807080 00000 n 0003811457 00000 n 0003811233 00000 n 0003811289 00000 n 0003811345 00000 n 0003811401 00000 n 0003811803 00000 n 0003815577 00000 n 0003811587 00000 n 0003811781 00000 n 0003815810 00000 n 0003815600 00000 n 0003815656 00000 n 0003815705 00000 n 0003815761 00000 n 0003816156 00000 n 0003820589 00000 n 0003815940 00000 n 0003816134 00000 n 0003820829 00000 n 0003820612 00000 n 0003820661 00000 n 0003820717 00000 n 0003820773 00000 n 0003821175 00000 n 0003825611 00000 n 0003820959 00000 n 0003821153 00000 n 0003825732 00000 n 0003825634 00000 n 0003825683 00000 n 0003826078 00000 n 0003830724 00000 n 0003825862 00000 n 0003826056 00000 n 0003832132 00000 n 0003830747 00000 n 0003830803 00000 n 0003830859 00000 n 0003830915 00000 n 0003830971 00000 n 0003831020 00000 n 0003831069 00000 n 0003831125 00000 n 0003831181 00000 n 0003831436 00000 n 0003831680 00000 n 0003831938 00000 n 0003832514 00000 n 0003837483 00000 n 0003832262 00000 n 0003832456 00000 n 0003844303 00000 n 0003837506 00000 n 0003837562 00000 n 0003837611 00000 n 0003837667 00000 n 0003837716 00000 n 0003837961 00000 n 0003838206 00000 n 0003838451 00000 n 0003838696 00000 n 0003838948 00000 n 0003839200 00000 n 0003839438 00000 n 0003839683 00000 n 0003839929 00000 n 0003840176 00000 n 0003840429 00000 n 0003840676 00000 n 0003840930 00000 n 0003841184 00000 n 0003841431 00000 n 0003841684 00000 n 0003841924 00000 n 0003842171 00000 n 0003842418 00000 n 0003842664 00000 n 0003842917 00000 n 0003843164 00000 n 0003843410 00000 n 0003843664 00000 n 0003843910 00000 n 0003844111 00000 n 0003844892 00000 n 0003851659 00000 n 0003844433 00000 n 0003844627 00000 n 0003854340 00000 n 0003851682 00000 n 0003851738 00000 n 0003851794 00000 n 0003851850 00000 n 0003851898 00000 n 0003851954 00000 n 0003852010 00000 n 0003852066 00000 n 0003852122 00000 n 0003852170 00000 n 0003852219 00000 n 0003852466 00000 n 0003852720 00000 n 0003852967 00000 n 0003853214 00000 n 0003853467 00000 n 0003853713 00000 n 0003853959 00000 n 0003854139 00000 n 0003854783 00000 n 0003864296 00000 n 0003854470 00000 n 0003854680 00000 n 0003864739 00000 n 0003864319 00000 n 0003864375 00000 n 0003864424 00000 n 0003864473 00000 n 0003864522 00000 n 0003864578 00000 n 0003864634 00000 n 0003864683 00000 n 0003865085 00000 n 0003873882 00000 n 0003864869 00000 n 0003865063 00000 n 0003874549 00000 n 0003873905 00000 n 0003873954 00000 n 0003874010 00000 n 0003874066 00000 n 0003874115 00000 n 0003874171 00000 n 0003874227 00000 n 0003874283 00000 n 0003874339 00000 n 0003874388 00000 n 0003874437 00000 n 0003874493 00000 n 0003874895 00000 n 0003880535 00000 n 0003874679 00000 n 0003874873 00000 n 0003880880 00000 n 0003880558 00000 n 0003880607 00000 n 0003880663 00000 n 0003880712 00000 n 0003880768 00000 n 0003880824 00000 n 0003881242 00000 n 0003886651 00000 n 0003881010 00000 n 0003881220 00000 n 0003887318 00000 n 0003886674 00000 n 0003886723 00000 n 0003886779 00000 n 0003886835 00000 n 0003886884 00000 n 0003886940 00000 n 0003886989 00000 n 0003887045 00000 n 0003887101 00000 n 0003887150 00000 n 0003887206 00000 n 0003887262 00000 n 0003887664 00000 n 0003892705 00000 n 0003887448 00000 n 0003887642 00000 n 0003893646 00000 n 0003892728 00000 n 0003892784 00000 n 0003892833 00000 n 0003892889 00000 n 0003892945 00000 n 0003892994 00000 n 0003893050 00000 n 0003893106 00000 n 0003893162 00000 n 0003893218 00000 n 0003893274 00000 n 0003893330 00000 n 0003893386 00000 n 0003894001 00000 n 0003902149 00000 n 0003893776 00000 n 0003893970 00000 n 0003911268 00000 n 0003902172 00000 n 0003902228 00000 n 0003902284 00000 n 0003902340 00000 n 0003902389 00000 n 0003902445 00000 n 0003902501 00000 n 0003902752 00000 n 0003903008 00000 n 0003903257 00000 n 0003903506 00000 n 0003903762 00000 n 0003904011 00000 n 0003904267 00000 n 0003904523 00000 n 0003904772 00000 n 0003905022 00000 n 0003905265 00000 n 0003905508 00000 n 0003905765 00000 n 0003906008 00000 n 0003906265 00000 n 0003906522 00000 n 0003906764 00000 n 0003907014 00000 n 0003907264 00000 n 0003907514 00000 n 0003907771 00000 n 0003908014 00000 n 0003908271 00000 n 0003908528 00000 n 0003908778 00000 n 0003909035 00000 n 0003909285 00000 n 0003909535 00000 n 0003909792 00000 n 0003910041 00000 n 0003910298 00000 n 0003910555 00000 n 0003910805 00000 n 0003911062 00000 n 0003911929 00000 n 0003918515 00000 n 0003911398 00000 n 0003911592 00000 n 0003923987 00000 n 0003918538 00000 n 0003918594 00000 n 0003918650 00000 n 0003918706 00000 n 0003918755 00000 n 0003918804 00000 n 0003918853 00000 n 0003918909 00000 n 0003918965 00000 n 0003919021 00000 n 0003919077 00000 n 0003919327 00000 n 0003919584 00000 n 0003919834 00000 n 0003920084 00000 n 0003920356 00000 n 0003920606 00000 n 0003920856 00000 n 0003921113 00000 n 0003921369 00000 n 0003921641 00000 n 0003921891 00000 n 0003922160 00000 n 0003922428 00000 n 0003922684 00000 n 0003922957 00000 n 0003923223 00000 n 0003923479 00000 n 0003923729 00000 n 0003924536 00000 n 0003934499 00000 n 0003924117 00000 n 0003924343 00000 n 0003934718 00000 n 0003934522 00000 n 0003934571 00000 n 0003934620 00000 n 0003934669 00000 n 0003935112 00000 n 0003942602 00000 n 0003934848 00000 n 0003935090 00000 n 0003942625 00000 n 0003942961 00000 n 0003947009 00000 n 0003942755 00000 n 0003942939 00000 n 0003947032 00000 n 0003947368 00000 n 0003950317 00000 n 0003947162 00000 n 0003947346 00000 n 0003950662 00000 n 0003950340 00000 n 0003950396 00000 n 0003950452 00000 n 0003950501 00000 n 0003950557 00000 n 0003950613 00000 n 0003951008 00000 n 0003955845 00000 n 0003950792 00000 n 0003950986 00000 n 0003956078 00000 n 0003955868 00000 n 0003955917 00000 n 0003955973 00000 n 0003956029 00000 n 0003956424 00000 n 0003961848 00000 n 0003956208 00000 n 0003956402 00000 n 0003962207 00000 n 0003961871 00000 n 0003961927 00000 n 0003961983 00000 n 0003962039 00000 n 0003962095 00000 n 0003962151 00000 n 0003962569 00000 n 0003968252 00000 n 0003962337 00000 n 0003962547 00000 n 0003968583 00000 n 0003968275 00000 n 0003968324 00000 n 0003968373 00000 n 0003968422 00000 n 0003968478 00000 n 0003968534 00000 n 0003968945 00000 n 0003973742 00000 n 0003968713 00000 n 0003968923 00000 n 0003973989 00000 n 0003973765 00000 n 0003973821 00000 n 0003973877 00000 n 0003973933 00000 n 0003974351 00000 n 0003979489 00000 n 0003974119 00000 n 0003974329 00000 n 0003979617 00000 n 0003979512 00000 n 0003979561 00000 n 0003979979 00000 n 0003985315 00000 n 0003979747 00000 n 0003979957 00000 n 0003985674 00000 n 0003985338 00000 n 0003985394 00000 n 0003985450 00000 n 0003985506 00000 n 0003985562 00000 n 0003985618 00000 n 0003986052 00000 n 0003991962 00000 n 0003985804 00000 n 0003986030 00000 n 0003992209 00000 n 0003991985 00000 n 0003992041 00000 n 0003992097 00000 n 0003992153 00000 n 0003992571 00000 n 0003997345 00000 n 0003992339 00000 n 0003992549 00000 n 0003997683 00000 n 0003997368 00000 n 0003997424 00000 n 0003997473 00000 n 0003997529 00000 n 0003997578 00000 n 0003997627 00000 n 0003998045 00000 n 0004003994 00000 n 0003997813 00000 n 0003998023 00000 n 0004004339 00000 n 0004004017 00000 n 0004004073 00000 n 0004004129 00000 n 0004004185 00000 n 0004004241 00000 n 0004004290 00000 n 0004004717 00000 n 0004011250 00000 n 0004004469 00000 n 0004004695 00000 n 0004011609 00000 n 0004011273 00000 n 0004011329 00000 n 0004011385 00000 n 0004011441 00000 n 0004011497 00000 n 0004011553 00000 n 0004011971 00000 n 0004017835 00000 n 0004011739 00000 n 0004011949 00000 n 0004017970 00000 n 0004017858 00000 n 0004017914 00000 n 0004018316 00000 n 0004022021 00000 n 0004018100 00000 n 0004018294 00000 n 0004022156 00000 n 0004022044 00000 n 0004022100 00000 n 0004022502 00000 n 0004028278 00000 n 0004022286 00000 n 0004022480 00000 n 0004028605 00000 n 0004028301 00000 n 0004028357 00000 n 0004028413 00000 n 0004028960 00000 n 0004034435 00000 n 0004028735 00000 n 0004028929 00000 n 0004035522 00000 n 0004034458 00000 n 0004034507 00000 n 0004034556 00000 n 0004034605 00000 n 0004034661 00000 n 0004034710 00000 n 0004034766 00000 n 0004034822 00000 n 0004034871 00000 n 0004034927 00000 n 0004034976 00000 n 0004035249 00000 n 0004035902 00000 n 0004045189 00000 n 0004035652 00000 n 0004035862 00000 n 0004045381 00000 n 0004045212 00000 n 0004045742 00000 n 0004051298 00000 n 0004045511 00000 n 0004045711 00000 n 0004052745 00000 n 0004051321 00000 n 0004051370 00000 n 0004051426 00000 n 0004051475 00000 n 0004051531 00000 n 0004051587 00000 n 0004051643 00000 n 0004051699 00000 n 0004051755 00000 n 0004051804 00000 n 0004051853 00000 n 0004051909 00000 n 0004051965 00000 n 0004052220 00000 n 0004052479 00000 n 0004053134 00000 n 0004065010 00000 n 0004052875 00000 n 0004053085 00000 n 0004065807 00000 n 0004065034 00000 n 0004065090 00000 n 0004065139 00000 n 0004065195 00000 n 0004065251 00000 n 0004065530 00000 n 0004066171 00000 n 0004071783 00000 n 0004065937 00000 n 0004066131 00000 n 0004071806 00000 n 0004072152 00000 n 0004075144 00000 n 0004071936 00000 n 0004072130 00000 n 0004507761 00000 n 0004075167 00000 n 0004075223 00000 n 0004075272 00000 n 0004507582 00000 n 0004285090 00000 n 0004285238 00000 n 0004286239 00000 n 0004289178 00000 n 0004292080 00000 n 0004295676 00000 n 0004297855 00000 n 0004307598 00000 n 0004317853 00000 n 0004326024 00000 n 0004326864 00000 n 0004328088 00000 n 0004330428 00000 n 0004334758 00000 n 0004336719 00000 n 0004348746 00000 n 0004351745 00000 n 0004352626 00000 n 0004354297 00000 n 0004359302 00000 n 0004362696 00000 n 0004364095 00000 n 0004366984 00000 n 0004368348 00000 n 0004374388 00000 n 0004378223 00000 n 0004383166 00000 n 0004386904 00000 n 0004408000 00000 n 0004411638 00000 n 0004419451 00000 n 0004423959 00000 n 0004433643 00000 n 0004438105 00000 n 0004456471 00000 n 0004457922 00000 n 0004475582 00000 n 0004483168 00000 n 0004491337 00000 n 0004492014 00000 n 0004498041 00000 n 0004507357 00000 n 0004286101 00000 n 0004285393 00000 n 0004285543 00000 n 0004285744 00000 n 0004285951 00000 n 0004286439 00000 n 0004286575 00000 n 0004286730 00000 n 0004286883 00000 n 0004287040 00000 n 0004287195 00000 n 0004287378 00000 n 0004287569 00000 n 0004287744 00000 n 0004287900 00000 n 0004288046 00000 n 0004289004 00000 n 0004288200 00000 n 0004288359 00000 n 0004288529 00000 n 0004288719 00000 n 0004288869 00000 n 0004289352 00000 n 0004289491 00000 n 0004289951 00000 n 0004290966 00000 n 0004291159 00000 n 0004291355 00000 n 0004291549 00000 n 0004291755 00000 n 0004291935 00000 n 0004289647 00000 n 0004289796 00000 n 0004290148 00000 n 0004290303 00000 n 0004290469 00000 n 0004290649 00000 n 0004290831 00000 n 0004292401 00000 n 0004294064 00000 n 0004295260 00000 n 0004295473 00000 n 0004292265 00000 n 0004293575 00000 n 0004293835 00000 n 0004292595 00000 n 0004292720 00000 n 0004292866 00000 n 0004293012 00000 n 0004293162 00000 n 0004293306 00000 n 0004293446 00000 n 0004294847 00000 n 0004295055 00000 n 0004294271 00000 n 0004294468 00000 n 0004294666 00000 n 0004295889 00000 n 0004296860 00000 n 0004297631 00000 n 0004296070 00000 n 0004296221 00000 n 0004296387 00000 n 0004296539 00000 n 0004296717 00000 n 0004297105 00000 n 0004297294 00000 n 0004297486 00000 n 0004298980 00000 n 0004299978 00000 n 0004301051 00000 n 0004303733 00000 n 0004305416 00000 n 0004306283 00000 n 0004307390 00000 n 0004298054 00000 n 0004298195 00000 n 0004298351 00000 n 0004298501 00000 n 0004298663 00000 n 0004298827 00000 n 0004299152 00000 n 0004299307 00000 n 0004299473 00000 n 0004299625 00000 n 0004299807 00000 n 0004300203 00000 n 0004300350 00000 n 0004300544 00000 n 0004300748 00000 n 0004300920 00000 n 0004301272 00000 n 0004301443 00000 n 0004301607 00000 n 0004301801 00000 n 0004301969 00000 n 0004302115 00000 n 0004303123 00000 n 0004303360 00000 n 0004303546 00000 n 0004302305 00000 n 0004302504 00000 n 0004302692 00000 n 0004302890 00000 n 0004303938 00000 n 0004304099 00000 n 0004304297 00000 n 0004304457 00000 n 0004304635 00000 n 0004304829 00000 n 0004305041 00000 n 0004305209 00000 n 0004305623 00000 n 0004305776 00000 n 0004305952 00000 n 0004306124 00000 n 0004306476 00000 n 0004306653 00000 n 0004306833 00000 n 0004307033 00000 n 0004307227 00000 n 0004307781 00000 n 0004307942 00000 n 0004308088 00000 n 0004308262 00000 n 0004309000 00000 n 0004310475 00000 n 0004310678 00000 n 0004310828 00000 n 0004310996 00000 n 0004311140 00000 n 0004311318 00000 n 0004311498 00000 n 0004311652 00000 n 0004311926 00000 n 0004312818 00000 n 0004313049 00000 n 0004313221 00000 n 0004314767 00000 n 0004315120 00000 n 0004315307 00000 n 0004315515 00000 n 0004315695 00000 n 0004315891 00000 n 0004316061 00000 n 0004316257 00000 n 0004316487 00000 n 0004316687 00000 n 0004316847 00000 n 0004317443 00000 n 0004317674 00000 n 0004308464 00000 n 0004308639 00000 n 0004308833 00000 n 0004309191 00000 n 0004309364 00000 n 0004309626 00000 n 0004309840 00000 n 0004310008 00000 n 0004310174 00000 n 0004310336 00000 n 0004312092 00000 n 0004312267 00000 n 0004312451 00000 n 0004312653 00000 n 0004313383 00000 n 0004313548 00000 n 0004313720 00000 n 0004313908 00000 n 0004314086 00000 n 0004314268 00000 n 0004314436 00000 n 0004314614 00000 n 0004314952 00000 n 0004317051 00000 n 0004317234 00000 n 0004318038 00000 n 0004323767 00000 n 0004325828 00000 n 0004318175 00000 n 0004318362 00000 n 0004318560 00000 n 0004318724 00000 n 0004318892 00000 n 0004319070 00000 n 0004319232 00000 n 0004319406 00000 n 0004319604 00000 n 0004319788 00000 n 0004319986 00000 n 0004320178 00000 n 0004320356 00000 n 0004320546 00000 n 0004320724 00000 n 0004320918 00000 n 0004321114 00000 n 0004321288 00000 n 0004321460 00000 n 0004321640 00000 n 0004321814 00000 n 0004321992 00000 n 0004322168 00000 n 0004322408 00000 n 0004322580 00000 n 0004322750 00000 n 0004323024 00000 n 0004323234 00000 n 0004323438 00000 n 0004323594 00000 n 0004323974 00000 n 0004324131 00000 n 0004324287 00000 n 0004324443 00000 n 0004324615 00000 n 0004324809 00000 n 0004325009 00000 n 0004325177 00000 n 0004325393 00000 n 0004325589 00000 n 0004326213 00000 n 0004326496 00000 n 0004326703 00000 n 0004326350 00000 n 0004327053 00000 n 0004327720 00000 n 0004327927 00000 n 0004327190 00000 n 0004327363 00000 n 0004327545 00000 n 0004328277 00000 n 0004328420 00000 n 0004328576 00000 n 0004328754 00000 n 0004328916 00000 n 0004329070 00000 n 0004329652 00000 n 0004329875 00000 n 0004330057 00000 n 0004330243 00000 n 0004329246 00000 n 0004329461 00000 n 0004330617 00000 n 0004331404 00000 n 0004332293 00000 n 0004334253 00000 n 0004334574 00000 n 0004330824 00000 n 0004330963 00000 n 0004331117 00000 n 0004331271 00000 n 0004331613 00000 n 0004331778 00000 n 0004331952 00000 n 0004332156 00000 n 0004332494 00000 n 0004332635 00000 n 0004332793 00000 n 0004333871 00000 n 0004334090 00000 n 0004332957 00000 n 0004333114 00000 n 0004333306 00000 n 0004333512 00000 n 0004333700 00000 n 0004334450 00000 n 0004335769 00000 n 0004336497 00000 n 0004334945 00000 n 0004335088 00000 n 0004335256 00000 n 0004335426 00000 n 0004335608 00000 n 0004335963 00000 n 0004336132 00000 n 0004336304 00000 n 0004338342 00000 n 0004339336 00000 n 0004340679 00000 n 0004342387 00000 n 0004344918 00000 n 0004345481 00000 n 0004345690 00000 n 0004345898 00000 n 0004346124 00000 n 0004346302 00000 n 0004346858 00000 n 0004347341 00000 n 0004347794 00000 n 0004348011 00000 n 0004348201 00000 n 0004348393 00000 n 0004348563 00000 n 0004336916 00000 n 0004337065 00000 n 0004337217 00000 n 0004337385 00000 n 0004337553 00000 n 0004337751 00000 n 0004337953 00000 n 0004338175 00000 n 0004338516 00000 n 0004338671 00000 n 0004338833 00000 n 0004339003 00000 n 0004339175 00000 n 0004339547 00000 n 0004339706 00000 n 0004339896 00000 n 0004340092 00000 n 0004340276 00000 n 0004340492 00000 n 0004340890 00000 n 0004341019 00000 n 0004341213 00000 n 0004341725 00000 n 0004341942 00000 n 0004342158 00000 n 0004341383 00000 n 0004341542 00000 n 0004342596 00000 n 0004342739 00000 n 0004342913 00000 n 0004343075 00000 n 0004343245 00000 n 0004343415 00000 n 0004343581 00000 n 0004343749 00000 n 0004343919 00000 n 0004344089 00000 n 0004344253 00000 n 0004344427 00000 n 0004344595 00000 n 0004344765 00000 n 0004345129 00000 n 0004345286 00000 n 0004346468 00000 n 0004346645 00000 n 0004347061 00000 n 0004347210 00000 n 0004347560 00000 n 0004350281 00000 n 0004350499 00000 n 0004351525 00000 n 0004348925 00000 n 0004349102 00000 n 0004349306 00000 n 0004349488 00000 n 0004349688 00000 n 0004349898 00000 n 0004350098 00000 n 0004350693 00000 n 0004350848 00000 n 0004351010 00000 n 0004351180 00000 n 0004351376 00000 n 0004351952 00000 n 0004352113 00000 n 0004352287 00000 n 0004352501 00000 n 0004352807 00000 n 0004352946 00000 n 0004353100 00000 n 0004353278 00000 n 0004353480 00000 n 0004353652 00000 n 0004353840 00000 n 0004354010 00000 n 0004354162 00000 n 0004354510 00000 n 0004356186 00000 n 0004356999 00000 n 0004357832 00000 n 0004358205 00000 n 0004358922 00000 n 0004359131 00000 n 0004354681 00000 n 0004355762 00000 n 0004356005 00000 n 0004354856 00000 n 0004355017 00000 n 0004355213 00000 n 0004355411 00000 n 0004355597 00000 n 0004356377 00000 n 0004356522 00000 n 0004356682 00000 n 0004356850 00000 n 0004357202 00000 n 0004357347 00000 n 0004357515 00000 n 0004357683 00000 n 0004358031 00000 n 0004358402 00000 n 0004358571 00000 n 0004358793 00000 n 0004359521 00000 n 0004359660 00000 n 0004359846 00000 n 0004360024 00000 n 0004360206 00000 n 0004360370 00000 n 0004360522 00000 n 0004360690 00000 n 0004362350 00000 n 0004362565 00000 n 0004360864 00000 n 0004361043 00000 n 0004361225 00000 n 0004361407 00000 n 0004361601 00000 n 0004361789 00000 n 0004361979 00000 n 0004362185 00000 n 0004362891 00000 n 0004363046 00000 n 0004363190 00000 n 0004363364 00000 n 0004363556 00000 n 0004363768 00000 n 0004363920 00000 n 0004364298 00000 n 0004364421 00000 n 0004364569 00000 n 0004364723 00000 n 0004364885 00000 n 0004365031 00000 n 0004365187 00000 n 0004365345 00000 n 0004365519 00000 n 0004365693 00000 n 0004365861 00000 n 0004366019 00000 n 0004366201 00000 n 0004366365 00000 n 0004366513 00000 n 0004366707 00000 n 0004366855 00000 n 0004367243 00000 n 0004368020 00000 n 0004368219 00000 n 0004367374 00000 n 0004367535 00000 n 0004367703 00000 n 0004367873 00000 n 0004368883 00000 n 0004369057 00000 n 0004369249 00000 n 0004369997 00000 n 0004371028 00000 n 0004371709 00000 n 0004371900 00000 n 0004374200 00000 n 0004368543 00000 n 0004368702 00000 n 0004369407 00000 n 0004369576 00000 n 0004369822 00000 n 0004370182 00000 n 0004370385 00000 n 0004370595 00000 n 0004370833 00000 n 0004371221 00000 n 0004371374 00000 n 0004371558 00000 n 0004372064 00000 n 0004372309 00000 n 0004372551 00000 n 0004372817 00000 n 0004373067 00000 n 0004373363 00000 n 0004373583 00000 n 0004373801 00000 n 0004374031 00000 n 0004374573 00000 n 0004374712 00000 n 0004376160 00000 n 0004376343 00000 n 0004376503 00000 n 0004376649 00000 n 0004376805 00000 n 0004377669 00000 n 0004377864 00000 n 0004378032 00000 n 0004374890 00000 n 0004375057 00000 n 0004375233 00000 n 0004375433 00000 n 0004375641 00000 n 0004375813 00000 n 0004375995 00000 n 0004376959 00000 n 0004377150 00000 n 0004377330 00000 n 0004377506 00000 n 0004378406 00000 n 0004378537 00000 n 0004379031 00000 n 0004382956 00000 n 0004378685 00000 n 0004378866 00000 n 0004379238 00000 n 0004379387 00000 n 0004379539 00000 n 0004379699 00000 n 0004380203 00000 n 0004380394 00000 n 0004382044 00000 n 0004382253 00000 n 0004382457 00000 n 0004382625 00000 n 0004382813 00000 n 0004379865 00000 n 0004380040 00000 n 0004380554 00000 n 0004380709 00000 n 0004380895 00000 n 0004381087 00000 n 0004381275 00000 n 0004381449 00000 n 0004381633 00000 n 0004381859 00000 n 0004383351 00000 n 0004383514 00000 n 0004383684 00000 n 0004384712 00000 n 0004384893 00000 n 0004385061 00000 n 0004385493 00000 n 0004385730 00000 n 0004385904 00000 n 0004386072 00000 n 0004386252 00000 n 0004386714 00000 n 0004383848 00000 n 0004383995 00000 n 0004384161 00000 n 0004384351 00000 n 0004384561 00000 n 0004385209 00000 n 0004385338 00000 n 0004386432 00000 n 0004386579 00000 n 0004387095 00000 n 0004389047 00000 n 0004393203 00000 n 0004396476 00000 n 0004398180 00000 n 0004398433 00000 n 0004399611 00000 n 0004401034 00000 n 0004403141 00000 n 0004406360 00000 n 0004406562 00000 n 0004407660 00000 n 0004407856 00000 n 0004387226 00000 n 0004387369 00000 n 0004387565 00000 n 0004387761 00000 n 0004387949 00000 n 0004388119 00000 n 0004388303 00000 n 0004388855 00000 n 0004388525 00000 n 0004388710 00000 n 0004389240 00000 n 0004389447 00000 n 0004389601 00000 n 0004389769 00000 n 0004390739 00000 n 0004390934 00000 n 0004391086 00000 n 0004391242 00000 n 0004391400 00000 n 0004391700 00000 n 0004391965 00000 n 0004392151 00000 n 0004392331 00000 n 0004392497 00000 n 0004393011 00000 n 0004389923 00000 n 0004390076 00000 n 0004390244 00000 n 0004390418 00000 n 0004390592 00000 n 0004391566 00000 n 0004392661 00000 n 0004392842 00000 n 0004393604 00000 n 0004393974 00000 n 0004395235 00000 n 0004395442 00000 n 0004396142 00000 n 0004396337 00000 n 0004393430 00000 n 0004393810 00000 n 0004394187 00000 n 0004394344 00000 n 0004394506 00000 n 0004394718 00000 n 0004395020 00000 n 0004395618 00000 n 0004395783 00000 n 0004395971 00000 n 0004396733 00000 n 0004396888 00000 n 0004397056 00000 n 0004397238 00000 n 0004397422 00000 n 0004397608 00000 n 0004397966 00000 n 0004397798 00000 n 0004398619 00000 n 0004398782 00000 n 0004398974 00000 n 0004399172 00000 n 0004399414 00000 n 0004399836 00000 n 0004400089 00000 n 0004400255 00000 n 0004400459 00000 n 0004400631 00000 n 0004400811 00000 n 0004401239 00000 n 0004401421 00000 n 0004401638 00000 n 0004401813 00000 n 0004401986 00000 n 0004402215 00000 n 0004402398 00000 n 0004402579 00000 n 0004402794 00000 n 0004402967 00000 n 0004403335 00000 n 0004403555 00000 n 0004403806 00000 n 0004404057 00000 n 0004404276 00000 n 0004404505 00000 n 0004404712 00000 n 0004404949 00000 n 0004405174 00000 n 0004405397 00000 n 0004405588 00000 n 0004405855 00000 n 0004406102 00000 n 0004406749 00000 n 0004406903 00000 n 0004407126 00000 n 0004407321 00000 n 0004407520 00000 n 0004408189 00000 n 0004408798 00000 n 0004410006 00000 n 0004410458 00000 n 0004411459 00000 n 0004408321 00000 n 0004408465 00000 n 0004408654 00000 n 0004409129 00000 n 0004409608 00000 n 0004409810 00000 n 0004408992 00000 n 0004409338 00000 n 0004409478 00000 n 0004410196 00000 n 0004410328 00000 n 0004410642 00000 n 0004410784 00000 n 0004410949 00000 n 0004411100 00000 n 0004411265 00000 n 0004411840 00000 n 0004412718 00000 n 0004416515 00000 n 0004417435 00000 n 0004417935 00000 n 0004418491 00000 n 0004419248 00000 n 0004411982 00000 n 0004412164 00000 n 0004412375 00000 n 0004412564 00000 n 0004412910 00000 n 0004413044 00000 n 0004413199 00000 n 0004413551 00000 n 0004413761 00000 n 0004413914 00000 n 0004414071 00000 n 0004414230 00000 n 0004414397 00000 n 0004414614 00000 n 0004414801 00000 n 0004414966 00000 n 0004415161 00000 n 0004415368 00000 n 0004415533 00000 n 0004415708 00000 n 0004416338 00000 n 0004413368 00000 n 0004415875 00000 n 0004416037 00000 n 0004416190 00000 n 0004416743 00000 n 0004416899 00000 n 0004417064 00000 n 0004417239 00000 n 0004417619 00000 n 0004417783 00000 n 0004418135 00000 n 0004418319 00000 n 0004418719 00000 n 0004418911 00000 n 0004419094 00000 n 0004419639 00000 n 0004420284 00000 n 0004423748 00000 n 0004419781 00000 n 0004419941 00000 n 0004420130 00000 n 0004420476 00000 n 0004420610 00000 n 0004420765 00000 n 0004420934 00000 n 0004421109 00000 n 0004421262 00000 n 0004421451 00000 n 0004421618 00000 n 0004421803 00000 n 0004421966 00000 n 0004422161 00000 n 0004422678 00000 n 0004422888 00000 n 0004423109 00000 n 0004423262 00000 n 0004423435 00000 n 0004423596 00000 n 0004422326 00000 n 0004422508 00000 n 0004424153 00000 n 0004425646 00000 n 0004426190 00000 n 0004428062 00000 n 0004428276 00000 n 0004428463 00000 n 0004429288 00000 n 0004430648 00000 n 0004432021 00000 n 0004432215 00000 n 0004433436 00000 n 0004424285 00000 n 0004424465 00000 n 0004424654 00000 n 0004424871 00000 n 0004425074 00000 n 0004425243 00000 n 0004425466 00000 n 0004425840 00000 n 0004426028 00000 n 0004426434 00000 n 0004426572 00000 n 0004426741 00000 n 0004426896 00000 n 0004427049 00000 n 0004427206 00000 n 0004427365 00000 n 0004427560 00000 n 0004427745 00000 n 0004427900 00000 n 0004428632 00000 n 0004428800 00000 n 0004428965 00000 n 0004429136 00000 n 0004429522 00000 n 0004429716 00000 n 0004429879 00000 n 0004430078 00000 n 0004430281 00000 n 0004430496 00000 n 0004430848 00000 n 0004430994 00000 n 0004431187 00000 n 0004431356 00000 n 0004431521 00000 n 0004431688 00000 n 0004431847 00000 n 0004432404 00000 n 0004432562 00000 n 0004432733 00000 n 0004432936 00000 n 0004433113 00000 n 0004433298 00000 n 0004434173 00000 n 0004436511 00000 n 0004437900 00000 n 0004433835 00000 n 0004434013 00000 n 0004434374 00000 n 0004434512 00000 n 0004434681 00000 n 0004434836 00000 n 0004434995 00000 n 0004436091 00000 n 0004436315 00000 n 0004435178 00000 n 0004435330 00000 n 0004435527 00000 n 0004435714 00000 n 0004435901 00000 n 0004436717 00000 n 0004436873 00000 n 0004437042 00000 n 0004437243 00000 n 0004437418 00000 n 0004437601 00000 n 0004437754 00000 n 0004438293 00000 n 0004440074 00000 n 0004443180 00000 n 0004444260 00000 n 0004445701 00000 n 0004447002 00000 n 0004448063 00000 n 0004448929 00000 n 0004450568 00000 n 0004452249 00000 n 0004454611 00000 n 0004455674 00000 n 0004456242 00000 n 0004438425 00000 n 0004438569 00000 n 0004438736 00000 n 0004438935 00000 n 0004439100 00000 n 0004439271 00000 n 0004439466 00000 n 0004439663 00000 n 0004439880 00000 n 0004440268 00000 n 0004440402 00000 n 0004440557 00000 n 0004440726 00000 n 0004440901 00000 n 0004441054 00000 n 0004441211 00000 n 0004441370 00000 n 0004441537 00000 n 0004441754 00000 n 0004441941 00000 n 0004442106 00000 n 0004442273 00000 n 0004442790 00000 n 0004443000 00000 n 0004442438 00000 n 0004442620 00000 n 0004443408 00000 n 0004443906 00000 n 0004444106 00000 n 0004443554 00000 n 0004443700 00000 n 0004444518 00000 n 0004444674 00000 n 0004444843 00000 n 0004445044 00000 n 0004445219 00000 n 0004445402 00000 n 0004445555 00000 n 0004445923 00000 n 0004446087 00000 n 0004446282 00000 n 0004446475 00000 n 0004446807 00000 n 0004446680 00000 n 0004447228 00000 n 0004447402 00000 n 0004447569 00000 n 0004447742 00000 n 0004447909 00000 n 0004448269 00000 n 0004448425 00000 n 0004448592 00000 n 0004448763 00000 n 0004449113 00000 n 0004449303 00000 n 0004449538 00000 n 0004449743 00000 n 0004449958 00000 n 0004450153 00000 n 0004450322 00000 n 0004450768 00000 n 0004451869 00000 n 0004452083 00000 n 0004450922 00000 n 0004451098 00000 n 0004451291 00000 n 0004451484 00000 n 0004451677 00000 n 0004452455 00000 n 0004452629 00000 n 0004452826 00000 n 0004453035 00000 n 0004453226 00000 n 0004454416 00000 n 0004453419 00000 n 0004453609 00000 n 0004453798 00000 n 0004454009 00000 n 0004454236 00000 n 0004454811 00000 n 0004454971 00000 n 0004455142 00000 n 0004455323 00000 n 0004455520 00000 n 0004455876 00000 n 0004456074 00000 n 0004456665 00000 n 0004456789 00000 n 0004456954 00000 n 0004457139 00000 n 0004457300 00000 n 0004457592 00000 n 0004457782 00000 n 0004457473 00000 n 0004459150 00000 n 0004459498 00000 n 0004463160 00000 n 0004464020 00000 n 0004464200 00000 n 0004465071 00000 n 0004471775 00000 n 0004473424 00000 n 0004474153 00000 n 0004475395 00000 n 0004458106 00000 n 0004458250 00000 n 0004458447 00000 n 0004458636 00000 n 0004458807 00000 n 0004458972 00000 n 0004459327 00000 n 0004459754 00000 n 0004459888 00000 n 0004460043 00000 n 0004460212 00000 n 0004460367 00000 n 0004460520 00000 n 0004460677 00000 n 0004460836 00000 n 0004461003 00000 n 0004461188 00000 n 0004461353 00000 n 0004461520 00000 n 0004461685 00000 n 0004461896 00000 n 0004462067 00000 n 0004462592 00000 n 0004462949 00000 n 0004462240 00000 n 0004462422 00000 n 0004462802 00000 n 0004463378 00000 n 0004463530 00000 n 0004463701 00000 n 0004463862 00000 n 0004464387 00000 n 0004464567 00000 n 0004464744 00000 n 0004464917 00000 n 0004465275 00000 n 0004465431 00000 n 0004465594 00000 n 0004465765 00000 n 0004465938 00000 n 0004469227 00000 n 0004469425 00000 n 0004470445 00000 n 0004470649 00000 n 0004470818 00000 n 0004471029 00000 n 0004471381 00000 n 0004471587 00000 n 0004466117 00000 n 0004466265 00000 n 0004466444 00000 n 0004466611 00000 n 0004466786 00000 n 0004466961 00000 n 0004467132 00000 n 0004467305 00000 n 0004467480 00000 n 0004467655 00000 n 0004467834 00000 n 0004468007 00000 n 0004468182 00000 n 0004468357 00000 n 0004468536 00000 n 0004468717 00000 n 0004468904 00000 n 0004469069 00000 n 0004469596 00000 n 0004469774 00000 n 0004469969 00000 n 0004470142 00000 n 0004470303 00000 n 0004471228 00000 n 0004471959 00000 n 0004473048 00000 n 0004473260 00000 n 0004472111 00000 n 0004472285 00000 n 0004472476 00000 n 0004472667 00000 n 0004472858 00000 n 0004473628 00000 n 0004473788 00000 n 0004473985 00000 n 0004474351 00000 n 0004474537 00000 n 0004474708 00000 n 0004474877 00000 n 0004475044 00000 n 0004475211 00000 n 0004475772 00000 n 0004476767 00000 n 0004480626 00000 n 0004481639 00000 n 0004481861 00000 n 0004482330 00000 n 0004482820 00000 n 0004483022 00000 n 0004475914 00000 n 0004476076 00000 n 0004476251 00000 n 0004476424 00000 n 0004476593 00000 n 0004476959 00000 n 0004477095 00000 n 0004477584 00000 n 0004477774 00000 n 0004478233 00000 n 0004478767 00000 n 0004478955 00000 n 0004479112 00000 n 0004479271 00000 n 0004479438 00000 n 0004479607 00000 n 0004479826 00000 n 0004479991 00000 n 0004480156 00000 n 0004480323 00000 n 0004480490 00000 n 0004477254 00000 n 0004477410 00000 n 0004477943 00000 n 0004478085 00000 n 0004478457 00000 n 0004478615 00000 n 0004480854 00000 n 0004481036 00000 n 0004481185 00000 n 0004481360 00000 n 0004481513 00000 n 0004482036 00000 n 0004482186 00000 n 0004482526 00000 n 0004482674 00000 n 0004484796 00000 n 0004485303 00000 n 0004487891 00000 n 0004488419 00000 n 0004488671 00000 n 0004488858 00000 n 0004490407 00000 n 0004490591 00000 n 0004490935 00000 n 0004491195 00000 n 0004483362 00000 n 0004483542 00000 n 0004483731 00000 n 0004483896 00000 n 0004484067 00000 n 0004484262 00000 n 0004484459 00000 n 0004484644 00000 n 0004484973 00000 n 0004485161 00000 n 0004485563 00000 n 0004485697 00000 n 0004485852 00000 n 0004486021 00000 n 0004486196 00000 n 0004486349 00000 n 0004486506 00000 n 0004486665 00000 n 0004486832 00000 n 0004487049 00000 n 0004487236 00000 n 0004487401 00000 n 0004487568 00000 n 0004487733 00000 n 0004488119 00000 n 0004488265 00000 n 0004489027 00000 n 0004489183 00000 n 0004489344 00000 n 0004489515 00000 n 0004489720 00000 n 0004489915 00000 n 0004490084 00000 n 0004490255 00000 n 0004490806 00000 n 0004491525 00000 n 0004491693 00000 n 0004491854 00000 n 0004493091 00000 n 0004497481 00000 n 0004497846 00000 n 0004492226 00000 n 0004492370 00000 n 0004492543 00000 n 0004492714 00000 n 0004492885 00000 n 0004493268 00000 n 0004493575 00000 n 0004494539 00000 n 0004495415 00000 n 0004497137 00000 n 0004497341 00000 n 0004493428 00000 n 0004493757 00000 n 0004493941 00000 n 0004494138 00000 n 0004494309 00000 n 0004494723 00000 n 0004494905 00000 n 0004495080 00000 n 0004495263 00000 n 0004495609 00000 n 0004495775 00000 n 0004495970 00000 n 0004496155 00000 n 0004496346 00000 n 0004496613 00000 n 0004496790 00000 n 0004496969 00000 n 0004497711 00000 n 0004498233 00000 n 0004498373 00000 n 0004498532 00000 n 0004499983 00000 n 0004501107 00000 n 0004501325 00000 n 0004501536 00000 n 0004502697 00000 n 0004502887 00000 n 0004506603 00000 n 0004506823 00000 n 0004506992 00000 n 0004507177 00000 n 0004498695 00000 n 0004498841 00000 n 0004498992 00000 n 0004499151 00000 n 0004499328 00000 n 0004499491 00000 n 0004499672 00000 n 0004499839 00000 n 0004500181 00000 n 0004500315 00000 n 0004500464 00000 n 0004500611 00000 n 0004500782 00000 n 0004500981 00000 n 0004501715 00000 n 0004501883 00000 n 0004502054 00000 n 0004502211 00000 n 0004502394 00000 n 0004502545 00000 n 0004503040 00000 n 0004503192 00000 n 0004503355 00000 n 0004503534 00000 n 0004503735 00000 n 0004503934 00000 n 0004504135 00000 n 0004504324 00000 n 0004504501 00000 n 0004504670 00000 n 0004504855 00000 n 0004505177 00000 n 0004505437 00000 n 0004505604 00000 n 0004506117 00000 n 0004506337 00000 n 0004505022 00000 n 0004505791 00000 n 0004505951 00000 n 0004507651 00000 n 0004508107 00000 n 0004510480 00000 n 0004507891 00000 n 0004508085 00000 n 0004510503 00000 n 0004510776 00000 n 0004518986 00000 n 0004519561 00000 n 0004518963 00000 n 0004520737 00000 n 0004520954 00000 n 0004530778 00000 n 0004531000 00000 n 0004530755 00000 n 0004532188 00000 n 0004532407 00000 n 0004536735 00000 n 0004536959 00000 n 0004536712 00000 n 0004537785 00000 n 0004538060 00000 n 0004545000 00000 n 0004545509 00000 n 0004544977 00000 n 0004546571 00000 n 0004546839 00000 n 0004555732 00000 n 0004556339 00000 n 0004555709 00000 n 0004557574 00000 n 0004557797 00000 n 0004559735 00000 n 0004559963 00000 n 0004559712 00000 n 0004560611 00000 n 0004560875 00000 n 0004565250 00000 n 0004565476 00000 n 0004565227 00000 n 0004566051 00000 n 0004566269 00000 n 0004578081 00000 n 0004578304 00000 n 0004578057 00000 n trailer << /Size 9345 /Info 1 0 R /Root 9300 0 R >> startxref 4584205 %%EOF swig-4.0.2/Doc/Manual/Preprocessor.html0000644000175000017500000003351713667507562017674 0ustar williamwilliam SWIG Preprocessor

    SWIG includes its own enhanced version of the C preprocessor. The preprocessor supports the standard preprocessor directives and macro expansion rules. However, a number of modifications and enhancements have been made. This chapter describes some of these modifications.

    10.1 File inclusion

    To include another file into a SWIG interface, use the %include directive like this:

    %include "pointer.i"
    

    Unlike, #include, %include includes each file once (and will not reload the file on subsequent %include declarations). Therefore, it is not necessary to use include-guards in SWIG interfaces.

    By default, the #include is ignored unless you run SWIG with the -includeall option. The reason for ignoring traditional includes is that you often don't want SWIG to try and wrap everything included in standard header system headers and auxiliary files.

    10.2 File imports

    SWIG provides another file inclusion directive with the %import directive. For example:

    %import "foo.i"
    

    The purpose of %import is to collect certain information from another SWIG interface file or a header file without actually generating any wrapper code. Such information generally includes type declarations (e.g., typedef) as well as C++ classes that might be used as base-classes for class declarations in the interface. The use of %import is also important when SWIG is used to generate extensions as a collection of related modules. This is an advanced topic and is described in later in the Working with Modules chapter.

    The -importall directive tells SWIG to follow all #include statements as imports. This might be useful if you want to extract type definitions from system header files without generating any wrappers.

    10.3 Conditional Compilation

    SWIG fully supports the use of #if, #ifdef, #ifndef, #else, #endif to conditionally include parts of an interface. The following symbols are predefined by SWIG when it is parsing the interface:

    SWIG                            Always defined when SWIG is processing a file
    SWIGIMPORTED                    Defined when SWIG is importing a file with %import
    SWIG_VERSION                    Hexadecimal (binary-coded decimal) number containing SWIG version,
                                    such as 0x010311 (corresponding to SWIG-1.3.11).
    
    SWIGCSHARP                      Defined when using C#
    SWIGD                           Defined when using D
    SWIGGO                          Defined when using Go
    SWIGGUILE                       Defined when using Guile
    SWIGJAVA                        Defined when using Java
    SWIGJAVASCRIPT                  Defined when using Javascript
    SWIG_JAVASCRIPT_JSC             Defined when using Javascript with -jsc
    SWIG_JAVASCRIPT_V8              Defined when using Javascript with -v8 or -node
    SWIGLUA                         Defined when using Lua
    SWIGMZSCHEME                    Defined when using Mzscheme
    SWIGOCAML                       Defined when using OCaml
    SWIGOCTAVE                      Defined when using Octave
    SWIGPERL                        Defined when using Perl
    SWIGPHP                         Defined when using PHP (any version)
    SWIGPHP7                        Defined when using PHP7
    SWIGPYTHON                      Defined when using Python
    SWIGR                           Defined when using R
    SWIGRUBY                        Defined when using Ruby
    SWIGSCILAB                      Defined when using Scilab
    SWIGTCL                         Defined when using Tcl
    SWIGXML                         Defined when using XML
    

    In addition, SWIG defines the following set of standard C/C++ macros:

    __LINE__                        Current line number
    __FILE__                        Current file name
    __STDC__                        Defined to indicate ISO C
    __cplusplus                     Defined when -c++ option used
    

    The following are language specific symbols that might be defined:

    SWIG_D_VERSION                  Unsigned integer target version when using D
    SWIGGO_CGO                      Defined when using Go for cgo
    SWIGGO_GCCGO                    Defined when using Go for gccgo
    SWIGGO_INTGO_SIZE               Size of the Go type int when using Go (32 or 64)
    SWIGPYTHON_PY3                  Defined when using Python with -py3
    SWIGPYTHON_BUILTIN              Defined when using Python with -builtin
    SWIG_RUBY_AUTORENAME            Defined when using Ruby with -autorename
    

    Interface files can look at these symbols as necessary to change the way in which an interface is generated or to mix SWIG directives with C code.

    10.4 Macro Expansion

    Traditional preprocessor macros can be used in SWIG interfaces. Be aware that the #define statement is also used to try and detect constants. Therefore, if you have something like this in your file,

    #ifndef _FOO_H 1
    #define _FOO_H 1
    ...
    #endif
    

    you may get some extra constants such as _FOO_H showing up in the scripting interface.

    More complex macros can be defined in the standard way. For example:

    #define EXTERN extern
    #ifdef __STDC__
    #define ISOC_(args)   (args)
    #else
    #define ISOC_(args) ()
    #endif
    

    The following operators can appear in macro definitions:

    • #x
      Converts macro argument x to a string surrounded by double quotes ("x").
    • x ## y
      Concatenates x and y together to form xy.
    • `x`
      If x is a string surrounded by double quotes, do nothing. Otherwise, turn into a string like #x. This is a non-standard SWIG extension.

    10.5 SWIG Macros

    SWIG provides an enhanced macro capability with the %define and %enddef directives. For example:

    %define ARRAYHELPER(type, name)
    %inline %{
    type *new_ ## name (int nitems) {
      return (type *) malloc(sizeof(type)*nitems);
    }
    void delete_ ## name(type *t) {
      free(t);
    }
    type name ## _get(type *t, int index) {
      return t[index];
    }
    void name ## _set(type *t, int index, type val) {
      t[index] = val;
    }
    %}
    %enddef
    
    ARRAYHELPER(int, IntArray)
    ARRAYHELPER(double, DoubleArray)
    

    The primary purpose of %define is to define large macros of code. Unlike normal C preprocessor macros, it is not necessary to terminate each line with a continuation character (\)--the macro definition extends to the first occurrence of %enddef. Furthermore, when such macros are expanded, they are reparsed through the C preprocessor. Thus, SWIG macros can contain all other preprocessor directives except for nested %define statements.

    The SWIG macro capability is a very quick and easy way to generate large amounts of code. In fact, many of SWIG's advanced features and libraries are built using this mechanism (such as C++ template support).

    10.6 C99 and GNU Extensions

    SWIG-1.3.12 and newer releases support variadic preprocessor macros. For example:

    #define DEBUGF(fmt, ...)   fprintf(stderr, fmt, __VA_ARGS__)
    

    When used, any extra arguments to ... are placed into the special variable __VA_ARGS__. This also works with special SWIG macros defined using %define.

    SWIG allows a variable number of arguments to be empty. However, this often results in an extra comma (, ) and syntax error in the resulting expansion. For example:

    DEBUGF("hello");   --> fprintf(stderr, "hello", );
    

    To get rid of the extra comma, use ## like this:

    #define DEBUGF(fmt, ...)   fprintf(stderr, fmt, ##__VA_ARGS__)
    

    SWIG also supports GNU-style variadic macros. For example:

    #define DEBUGF(fmt, args...)  fprintf(stdout, fmt, args)
    

    Comment: It's not entirely clear how variadic macros might be useful to interface building. However, they are used internally to implement a number of SWIG directives and are provided to make SWIG more compatible with C99 code.

    10.7 Preprocessing and delimiters

    The preprocessor handles { }, " " and %{ %} delimiters differently.

    10.7.1 Preprocessing and %{ ... %} & " ... " delimiters

    The SWIG preprocessor does not process any text enclosed in a code block %{ ... %}. Therefore, if you write code like this,

    %{
    #ifdef NEED_BLAH
    int blah() {
      ...
    }
    #endif
    %}
    

    the contents of the %{ ... %} block are copied without modification to the output (including all preprocessor directives).

    10.7.2 Preprocessing and { ... } delimiters

    SWIG always runs the preprocessor on text appearing inside { ... }. However, sometimes it is desirable to make a preprocessor directive pass through to the output file. For example:

    %extend Foo {
      void bar() {
        #ifdef DEBUG
          printf("I'm in bar\n");
        #endif
      }
    }
    

    By default, SWIG will interpret the #ifdef DEBUG statement. However, if you really wanted that code to actually go into the wrapper file, prefix the preprocessor directives with % like this:

    %extend Foo {
      void bar() {
        %#ifdef DEBUG
          printf("I'm in bar\n");
        %#endif
      }
    }
    

    SWIG will strip the extra % and leave the preprocessor directive in the code.

    10.8 Preprocessor and Typemaps

    Typemaps support a special attribute called noblock where the { ... } delimiters can be used, but the delimiters are not actually generated into the code. The effect is then similar to using "" or %{ %} delimiters but the code is run through the preprocessor. For example:

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in) Int {$1= SWIG_macro(int);}
    

    might generate

      {
        arg1=(int)jarg1;
      }
    

    whereas

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in, noblock=1) Int {$1= SWIG_macro(int);}
    

    might generate

      arg1=(int)jarg1;
    

    and

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in) Int %{$1=SWIG_macro(int);%}
    

    would generate

      arg1=SWIG_macro(int);
    

    10.9 Viewing preprocessor output

    Like many compilers, SWIG supports a -E command line option to display the output from the preprocessor. When the -E option is used, SWIG will not generate any wrappers. Instead the results after the preprocessor has run are displayed. This might be useful as an aid to debugging and viewing the results of macro expansions.

    10.10 The #error and #warning directives

    SWIG supports the commonly used #warning and #error preprocessor directives. The #warning directive will cause SWIG to issue a warning then continue processing. The #error directive will cause SWIG to exit with a fatal error. Example usage:

    #error "This is a fatal error message"
    #warning "This is a warning message"
    

    The #error behaviour can be made to work like #warning if the -cpperraswarn commandline option is used. Alternatively, the #pragma directive can be used to the same effect, for example:

      /* Modified behaviour: #error does not cause SWIG to exit with error */
      #pragma SWIG cpperraswarn=1
      /* Normal behaviour: #error does cause SWIG to exit with error */
      #pragma SWIG cpperraswarn=0
    
    swig-4.0.2/Doc/Manual/R.html0000644000175000017500000002312213667507563015377 0ustar williamwilliam SWIG and R

    33 SWIG and R

    R is a GPL'ed open source statistical and plotting environment. Information about R can be found at www.r-project.org.

    The R bindings are under active development. They have been used to compile and run an R interface to QuantLib running on Mandriva Linux with gcc. They are also used to create the SimpleITK R package, which runs on Linux and MacOS. SWIG is used to create all wrapper interfaces to SimpleITK. The R bindings also work on Microsoft Windows using Visual C++.

    33.1 Bugs

    Currently the following features are not implemented or broken:

    • Garbage collection of some created objects. Finalizers are available for wrapped C++ classes and are called by the garbage collection system.
    • C Array wrappings

    33.2 Using R and SWIG

    To use R and SWIG in C mode, execute the following commands where example.c is the name of the file with the functions in them

    swig -r example.i
    R CMD SHLIB example_wrap.c example.c
    

    The corresponding options for C++ mode are

    swig -c++ -r -o example_wrap.cpp example.i
    R CMD SHLIB example_wrap.cpp example.cpp
    

    Note that R is sensitive to the names of the files. The name of the wrapper file must be the name of the library unless you use the -o option to R when building the library, for example:

    swig -c++ -r -o example_wrap.cpp example.i
    R CMD SHLIB -o example.so example_wrap.cpp example.cpp
    

    R is also sensitive to the name of the file extension in C and C++ mode. In C++ mode, the file extension must be .cpp rather than .cxx for the R compile command to recognize it. If your C++ code is in a file using something other than a .cpp extension, then it may still work using PKG_LIBS:

    swig -c++ -r -o example_wrap.cpp example.i
    PKG_LIBS="example.cxx" R CMD SHLIB -o example example_wrap.cpp
    

    The commands produces two files. A dynamic shared object file called example.so, or example.dll, and an R wrapper file called example.R. To load these files, start up R and type in the following commands

    dyn.load(paste("example", .Platform$dynlib.ext, sep=""))
    source("example.R")
    cacheMetaData(1)
    

    The cacheMetaData(1) will cause R to refresh its object tables. Without it, inheritance of wrapped objects may fail. These two files can be loaded in any order.

    If you are compiling code yourself (not using R itself), there are a few things to watch out for:

    • The output shared library name (to the left of the file extension) MUST match the module name, or alternatively, you can also set the -package NAME command line argument. See swig -r -help for more information
    • If you do not set the output file name appropriately, you might see errors like
      > fact(4)
      Error in .Call("R_swig_fact", s_arg1, as.logical(.copy), PACKAGE = "example") :
        "R_swig_fact" not available for .Call() for package "example"
      
    • Make sure the architecture of the shared library(x64 for instance), matches the architecture of the R program you want to load your shared library into

    33.3 Precompiling large R files

    In cases where the R file is large, one make save a lot of loading time by precompiling the R wrapper. This can be done by creating the file makeRData.R which contains the following

    source('BigFile.R')
    save(list=ls(all=TRUE), file="BigFile.RData", compress=TRUE)
    q(save="no")
    

    This will generate a compiled R file called BigFile.RData that will save a large amount of loading time.

    There is no need to precompile large R files if the SWIG-generated code is being included in an R package. The package infrastructure provides this service during package installation.

    33.4 General policy

    The general policy of the module is to treat the C/C++ as a basic wrapping over the underlying functions and rely on the R type system to provide R syntax.

    33.5 Language conventions

    getitem and setitem use C++ conventions (i.e. zero based indices). [<- and [ are overloaded to allow for R syntax (one based indices and slices)

    33.6 C++ classes

    Wrapping of C++ classes for R works quite well. R has a special type, known as an external reference, that can be used as a pointer to arbitary things, including C++ classes. The proxy layers generated for other classes are not required.

    SWIG currently creates a custom hierarchy of R classes derived from the external reference type and implements type checking and function overloading in the R code it generates. In the future we hope to utilise the built in R6 class structures.

    The R interface has the following capabilities:

    • Destructor methods are registered and called automatically by the R garbage collector.
    • A range of std::vector types are converted automatically to R equivalents via the std_vector.i library.
    • The $ operator is used for method access.
    • Variable accessors are automatically generated and called via the $, [, [[, $<-, [<-, [[<- operators.

    33.6.1 Examples

    Consider the following simple example:

    class Vehicle {
    private:
      int m_axles;
    
    public:
      int Axles() {
        return(m_axles);
      }
    
      bool Available;
    
      Vehicle() {
        Available=false;
        m_axles=2;
      }
    
      Vehicle(int ax) {
        Available=false;
        m_axles=ax;
      }
    };
    

    The following options are available in R:

    v1 <- Vehicle()
    v2 <- Vehicle(4)
    # access members
    v1$Axles()
    [1] 2
    v2$Axles
    [1] 4
    v1$Available
    [1] FALSE
    # Set availabilty
    v1$Available <- TRUE
    v1$Available
    [1] TRUE
    

    A useful trick to determine the methods that are available is to query the R method definition as follows:

    # display the methods for the class
    getMethod("$", class(v1))
        
    Method Definition:
    
    function (x, name) 
    {
        accessorFuns = list(Axles = Vehicle_Axles, Available = Vehicle_Available_get)
        vaccessors = c("Available")
        idx = pmatch(name, names(accessorFuns))
        if (is.na(idx)) 
            return(callNextMethod(x, name))
        f = accessorFuns[[idx]]
        if (is.na(match(name, vaccessors))) 
            function(...) {
                f(x, ...)
            }
        else f(x)
    }
    
    Signatures:
            x           
    target  "_p_Vehicle"
    defined "_p_Vehicle"
    
    

    The names in the accessorFuns list correspond to class methods while names in the vaccessors section correspond to variables that may be modified.

    33.7 Enumerations

    R doesn't have a native enumeration type. Enumerations are represented as character strings in R, with calls to R functions that convert back and forth between integers.

    The details of enumeration names and contents are stored in hidden R environments, which are named according the the enumeration name - for example, an enumeration colour:

    enum colour { red=-1, blue, green = 10 };
    

    will be initialized by the following call in R:

    defineEnumeration("_colour",
     .values=c("red" = .Call('R_swig_colour_red_get',FALSE, PACKAGE='enum_thorough'),
    "blue" = .Call('R_swig_colour_blue_get',FALSE, PACKAGE='enum_thorough'),
    "green" = .Call('R_swig_colour_green_get',FALSE, PACKAGE='enum_thorough')))
    

    which will create an environment named .__E___colour. The enumeration values are initialised via calls to C/C++ code, allowing complex values for enumerations to be used. Calls to the C/C++ code require the compiled library to be loaded, so a delayedAssign is employed within defineEnumeration in order to allow the code to be easily used in R packages.

    The user typically does not need to access the enumeration lookup functions or know the name of the enumeration type used by R. Attributes containing the type information are attached by swig to functions requiring enumeration arguments or returning enumeration values, and those attributes are used to identify and access the appropriate environments and thus translate between characters and integers.

    The relevant functions, for debugging purposes, are enumToInteger and enumFromInteger.

    Anonymous enumerations are ignored by the binding generation process, leaving no way of accessing the value of anonymous enumerations from R code.

    swig-4.0.2/Doc/Manual/Java.html0000644000175000017500000111757013667507563016073 0ustar williamwilliam SWIG and Java

    26 SWIG and Java

    This chapter describes SWIG's support of Java. It covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters.

    26.1 Overview

    The 100% Pure Java effort is a commendable concept, however in the real world programmers often either need to re-use their existing code or in some situations want to take advantage of Java but are forced into using some native (C/C++) code. The Java extension to SWIG makes it very easy to plumb in existing C/C++ code for access from Java, as SWIG writes the Java Native Interface (JNI) code for you. It is different to using the 'javah' tool as SWIG will wrap existing C/C++ code, whereas javah takes 'native' Java function declarations and creates C/C++ function prototypes. SWIG wraps C/C++ code using Java proxy classes and is very useful if you want to have access to large amounts of C/C++ code from Java. If only one or two JNI functions are needed then using SWIG may be overkill. SWIG enables a Java program to easily call into C/C++ code from Java. Historically, SWIG was not able to generate any code to call into Java code from C++. However, SWIG now supports full cross language polymorphism and code is generated to call up from C++ to Java when wrapping C++ virtual methods via the director feature.

    Java is one of the few non-scripting language modules in SWIG. As SWIG utilizes the type safety that the Java language offers, it takes a somewhat different approach to that used for scripting languages. In particular runtime type checking and the runtime library are not used by Java. This should be borne in mind when reading the rest of the SWIG documentation. This chapter on Java is relatively self contained and will provide you with nearly everything you need for using SWIG and Java. However, the "SWIG Basics" chapter will be a useful read in conjunction with this one.

    This chapter starts with a few practicalities on running SWIG and compiling the generated code. If you are looking for the minimum amount to read, have a look at the sections up to and including the tour of basic C/C++ wrapping section which explains how to call the various C/C++ code constructs from Java. Following this section are details of the C/C++ code and Java classes that SWIG generates. Due to the complexities of C and C++ there are different ways in which C/C++ code could be wrapped and called from Java. SWIG is a powerful tool and the rest of the chapter details how the default code wrapping can be tailored. Various customisation tips and techniques using SWIG directives are covered. The latter sections cover the advanced techniques of using typemaps for complete control of the wrapping process.

    26.2 Preliminaries

    SWIG 1.1 works with JDKs from JDK 1.1 to JDK1.4 (Java 2 SDK1.4) and should also work with any later versions. Given the choice, you should probably use the latest version of Sun's JDK. The SWIG Java module is known to work using Sun's JVM on Solaris, Linux and the various flavours of Microsoft Windows including Cygwin. The Kaffe JVM is known to give a few problems and at the time of writing was not a fully fledged JVM with full JNI support. The generated code is also known to work on vxWorks using WindRiver's PJava 3.1. The best way to determine whether your combination of operating system and JDK will work is to test the examples and test-suite that comes with SWIG. Run make -k check from the SWIG root directory after installing SWIG on Unix systems.

    The Java module requires your system to support shared libraries and dynamic loading. This is the commonly used method to load JNI code so your system will more than likely support this.

    Android uses Java JNI and also works with SWIG. Please read the Android chapter in conjunction with this one if you are targeting Android.

    26.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    /* File: example.i */
    %module test
    %{
    #include "stuff.h"
    %}
    int fact(int n);
    

    To build a Java module, run SWIG using the -java option :

    %swig -java example.i
    

    If building C++, add the -c++ option:

    $ swig -c++ -java example.i
    

    This creates two different files; a C/C++ source file example_wrap.c or example_wrap.cxx and numerous Java files. The generated C/C++ source file contains the JNI wrapper code that needs to be compiled and linked with the rest of your C/C++ application.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. It is also possible to change the output directory that the Java files are generated into using -outdir.

    The module name, specified with %module, determines the name of various generated classes as discussed later. Note that the module name does not define a Java package and by default, the generated Java classes do not have a Java package. The -package option described below can specify a Java package name to use.

    The following sections have further practical examples and details on how you might go about compiling and using the generated files.

    26.2.2 Additional Commandline Options

    The following table lists the additional commandline options available for the Java module. They can also be seen by using:

    swig -java -help 
    
    Java specific options
    -nopgcpp suppress the premature garbage collection prevention parameter
    -noproxy generate the low-level functional interface instead of proxy classes
    -package <name> set name of the Java package to <name>

    Their use will become clearer by the time you have finished reading this section on SWIG and Java.

    26.2.3 Getting the right header files

    In order to compile the C/C++ wrappers, the compiler needs the jni.h and jni_md.h header files which are part of the JDK. They are usually in directories like this:

    /usr/java/include
    /usr/java/include/<operating_system>
    

    The exact location may vary on your machine, but the above locations are typical.

    26.2.4 Compiling a dynamic module

    The JNI code exists in a dynamic module or shared library (DLL on Windows) and gets loaded by the JVM. Assuming you have code you need to link to in a file called example.c, in order to build a shared library file, you need to compile your module in a manner similar to the following (shown for Solaris):

    $ swig -java example.i
    $ gcc -fPIC -c example_wrap.c -I/usr/java/include -I/usr/java/include/solaris
    $ gcc -fPIC -c example.c
    $ ld -G example_wrap.o example.o -o libexample.so
    

    The exact commands for doing this vary from platform to platform. However, SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the Examples/java directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    Important
    If you are going to use optimisations turned on with gcc (for example -O2), ensure you also compile with -fno-strict-aliasing. The GCC optimisations have become more aggressive from gcc-4.0 onwards and will result in code that fails with strict aliasing optimisations turned on. See the C/C++ to Java typemaps section for more details.

    The name of the shared library output file is important. If the name of your SWIG module is "example", the name of the corresponding shared library file should be "libexample.so" (or equivalent depending on your machine, see Dynamic linking problems for more information). The name of the module is specified using the %module directive or -module command line option.

    26.2.5 Using your module

    To load your shared native library module in Java, simply use Java's System.loadLibrary method in a Java class:

    // runme.java
    
    public class runme {
      static {
        System.loadLibrary("example");
      }
    
      public static void main(String argv[]) {
        System.out.println(example.fact(4));
      }
    }
    

    Compile all the Java files and run:

    $ javac *.java
    $ java runme
    24
    $
    

    If it doesn't work have a look at the following section which discusses problems loading the shared library.

    26.2.6 Dynamic linking problems

    As shown in the previous section the code to load a native library (shared library) is System.loadLibrary("name"). This can fail with an UnsatisfiedLinkError exception and can be due to a number of reasons.

    You may get an exception similar to this:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: no example in java.library.path
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1312)
            at java.lang.Runtime.loadLibrary0(Runtime.java:749)
            at java.lang.System.loadLibrary(System.java:820)
            at runme.<clinit>(runme.java:5)
    

    The most common cause for this is an incorrect naming of the native library for the name passed to the loadLibrary function. The string passed to the loadLibrary function must not include the file extension name in the string, that is .dll or .so. The string must be name and not libname for all platforms. On Windows the native library must then be called name.dll and on most Unix systems it must be called libname.so.

    Another common reason for the native library not loading is because it is not in your path. On Windows make sure the path environment variable contains the path to the native library. On Unix make sure that your LD_LIBRARY_PATH contains the path to the native library. Adding paths to LD_LIBRARY_PATH can slow down other programs on your system so you may want to consider alternative approaches. For example you could recompile your native library with extra path information using -rpath if you're using GNU, see the GNU linker documentation (ld man page). You could use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    The native library will also not load if there are any unresolved symbols in the compiled C/C++ code. The following exception is indicative of this:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: libexample.so: undefined
    symbol: fact
            at java.lang.ClassLoader$NativeLibrary.load(Native Method)
            at java.lang.ClassLoader.loadLibrary0(ClassLoader.java, Compiled Code)
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java, Compiled Code)
            at java.lang.Runtime.loadLibrary0(Runtime.java, Compiled Code)
            at java.lang.System.loadLibrary(System.java, Compiled Code)
            at runme.<clinit>(runme.java:5)
    $
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the native library file. Make sure you compile both the SWIG wrapper file and the code you are wrapping into the native library file. If you forget to compile and link in the SWIG wrapper file into your native library file, you will get a message similar to the following:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: exampleJNI.gcd(II)I
            at exampleJNI.gcd(Native Method)
            at example.gcd(example.java:12)
            at runme.main(runme.java:18)
    

    where gcd is the missing JNI function that SWIG generated into the wrapper file. Also make sure you pass all of the required libraries to the linker. The java -verbose:jni commandline option is also a great way to get more information on unresolved symbols. One last piece of advice is to beware of the common faux pas of having more than one native library version in your path.

    In summary, ensure that you are using the correct C/C++ compiler and linker combination and options for successful native library loading. If you are using the examples that ship with SWIG, then the Examples/Makefile must have these set up correctly for your system. The SWIG installation package makes a best attempt at getting these correct but does not get it right 100% of the time. The SWIG Wiki also has some settings for commonly used compiler and operating system combinations. The following section also contains some C++ specific linking problems and solutions.

    26.2.7 Compilation problems and compiling with C++

    On most machines, shared library files should be linked using the C++ compiler. For example:

    % swig -c++ -java example.i
    % g++ -c -fpic example.cxx
    % g++ -c -fpic example_wrap.cxx -I/usr/java/j2sdk1.4.1/include -I/usr/java/j2sdk1.4.1/include/linux
    % g++ -shared example.o example_wrap.o -o libexample.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    % swig -c++ -java example.i
    % CC -c example.cxx
    % CC -c example_wrap.cxx -I/usr/java/include -I/usr/java/include/solaris
    % CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o libexample.so -lCrun
    

    If you aren't entirely sure about the linking for C++, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your shared library. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    Finally make sure the version of JDK header files matches the version of Java that you are running as incompatibilities could lead to compilation problems or unpredictable behaviour.

    26.2.8 Building on Windows

    Building on Windows is roughly similar to the process used with Unix. You will want to produce a DLL that can be loaded by the Java Virtual Machine. This section covers the process of using SWIG with Microsoft Visual C++ 6 although the procedure may be similar with other compilers. In order for everything to work, you will need to have a JDK installed on your machine in order to read the JNI header files.

    26.2.8.1 Running SWIG from Visual Studio

    If you are developing your application within Microsoft Visual studio, SWIG can be invoked as a custom build option. The Examples\java directory has a few Windows Examples containing Visual Studio project (.dsp) files. The process to re-create the project files for a C project are roughly:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Don't worry if the wrapper file doesn't exist yet--Visual Studio will keep a reference to it.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -java -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to C/C++ tab and select the Preprocessor category. Add the include directories to the JNI header files under "Additional include directories", eg "C:\jdk1.3\include, C:\jdk1.3\include\win32".
    • Next, select the settings for the entire project and go to Link tab and select the General category. Set the name of the output file to match the name of your Java module (ie. example.dll).
    • Next, select the example.c and example_wrap.c files and go to the C/C++ tab and select the Precompiled Headers tab in the project settings. Disabling precompiled headers for these files will overcome any precompiled header errors while building.
    • Finally, add the java compilation as a post build rule in the Post-build step tab in project settings, eg, "c:\jdk1.3\bin\javac *.java"
    • Build your project.

    Note: If using C++, choose a C++ suffix for the wrapper file, for example example_wrap.cxx. Use _wrap.cxx instead of _wrap.c in the instructions above and add -c++ when invoking swig.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. When doing a build, any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file.

    The Java classes that SWIG output should also be compiled into .class files. To run the native code in the DLL (example.dll), make sure that it is in your path then run your Java program which uses it, as described in the previous section. If the library fails to load have a look at Dynamic linking problems.

    26.2.8.2 Using NMAKE

    Alternatively, a Makefile for use by NMAKE can be written. Make sure the environment variables for MSVC++ are available and the MSVC++ tools are in your path. Now, just write a short Makefile like this :

    # Makefile for using SWIG and Java for C code
    
    SRCS          = example.c
    IFILE         = example
    INTERFACE     = $(IFILE).i
    WRAPFILE      = $(IFILE)_wrap.c
    
    # Location of the Visual C++ tools (32 bit assumed)
    
    TOOLS         = c:\msdev
    TARGET        = example.dll
    CC            = $(TOOLS)\bin\cl.exe
    LINK          = $(TOOLS)\bin\link.exe
    INCLUDE32     = -I$(TOOLS)\include
    MACHINE       = IX86
    
    # C Library needed to build a DLL
    
    DLLIBC        = msvcrt.lib oldnames.lib  
    
    # Windows libraries that are apparently needed
    WINLIB        = kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib
    
    # Libraries common to all DLLs
    LIBS          = $(DLLIBC) $(WINLIB) 
    
    # Linker options
    LOPT      = -debug:full -debugtype:cv /NODEFAULTLIB /RELEASE /NOLOGO \
                 /MACHINE:$(MACHINE) -entry:_DllMainCRTStartup@12 -dll
    
    # C compiler flags
    
    CFLAGS        = /Z7 /Od /c /nologo
    JAVA_INCLUDE    = -ID:\jdk1.3\include -ID:\jdk1.3\include\win32
    
    java::
            swig -java -o $(WRAPFILE) $(INTERFACE)
            $(CC) $(CFLAGS) $(JAVA_INCLUDE) $(SRCS) $(WRAPFILE)
            set LIB=$(TOOLS)\lib
            $(LINK) $(LOPT) -out:example.dll $(LIBS) example.obj example_wrap.obj
            javac *.java
    

    To build the DLL and compile the java code, run NMAKE (you may need to run vcvars32 first). This is a pretty simplistic Makefile, but hopefully its enough to get you started. Of course you may want to make changes for it to work for C++ by adding in the -c++ command line option for swig and replacing .c with .cxx.

    26.3 A tour of basic C/C++ wrapping

    By default, SWIG attempts to build a natural Java interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped as classes, variables are wrapped with JavaBean type getters and setters and so forth. This section briefly covers the essential aspects of this wrapping.

    26.3.1 Modules, packages and generated Java classes

    The SWIG %module directive specifies the name of the Java module. When you specify `%module example', the module name determines the name of some of the generated files in the module. The generated code consists of a module class file example.java, an intermediary JNI class file, exampleJNI.java as well as numerous other Java proxy class files. Each proxy class is named after the structs, unions and classes you are wrapping. You may also get a constants interface file if you are wrapping any unnamed enumerations or constants, for example exampleConstants.java. When choosing a module name, make sure you don't use the same name as one of the generated proxy class files nor a Java keyword. Sometimes a C/C++ type cannot be wrapped by a proxy class, for example a pointer to a primitive type. In these situations a type wrapper class is generated. Wrapping an enum generates an enum class, either a proper Java enum or a Java class that simulates the enums pattern. Details of all these generated classes will unfold as you read this section.

    The JNI (C/C++) code is generated into a file which also contains the module name, for example example_wrap.cxx or example_wrap.c. These C or C++ files complete the contents of the module.

    The generated Java classes can be placed into a Java package by using the -package commandline option. This is often combined with the -outdir to specify a package directory for generating the Java files.

    swig -java -package com.bloggs.swig -outdir com/bloggs/swig example.i
    

    SWIG won't create the directory, so make sure it exists beforehand.

    26.3.2 Functions

    There is no such thing as a global Java function so global C functions are wrapped as static methods in the module class. For example,

    %module example
    int fact(int n);
    
    

    creates a static function that works exactly like you think it might:

    public class example {
      public static int fact(int n) {
        // makes call using JNI to the C function
      }
    }
    

    The Java class example is the module class. The function can be used as follows from Java:

    System.out.println(example.fact(4));
    

    26.3.3 Global variables

    C/C++ global variables are fully supported by SWIG. Java does not allow the overriding of the dot operator so all variables are accessed through getters and setters. Again because there is no such thing as a Java global variable, access to C/C++ global variables is done through static getter and setter functions in the module class.

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern int My_variable;
    extern double density;
    %}
    ...
    

    Now in Java :

    // Print out value of a C global variable
    System.out.println("My_variable = " + example.getMy_variable());
    // Set the value of a C global variable
    example.setDensity(0.8442);
    

    The value returned by the getter will always be up to date even if the value is changed in C. Note that the getters and setters produced follow the JavaBean property design pattern. That is the first letter of the variable name is capitalized and preceded with set or get. If you have the misfortune of wrapping two variables that differ only in the capitalization of their first letters, use %rename to change one of the variable names. For example:

    %rename Clash RenamedClash;
    float Clash;
    int clash;
    

    If a variable is declared as const, it is wrapped as a read-only variable. That is only a getter is produced.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    26.3.4 Constants

    C/C++ constants are wrapped as Java static final variables. To create a constant, use #define or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    By default the generated static final variables are initialized by making a JNI call to get their value. The constants are generated into the constants interface and look like this:

    public interface exampleConstants {
      public final static double PI = exampleJNI.PI_get();
      public final static String VERSION = exampleJNI.VERSION_get();
      public final static int FOO = exampleJNI.FOO_get();
      public final static String path = exampleJNI.path_get();
    }
    

    Note that SWIG has inferred the C type and used an appropriate Java type that will fit the range of all possible values for the C type. By default SWIG generates runtime constants. They are not compiler constants that can, for example, be used in a switch statement. This can be changed by using the %javaconst(flag) directive. It works like all the other %feature directives. The default is %javaconst(0). It is possible to initialize all wrapped constants from pure Java code by placing a %javaconst(1) before SWIG parses the constants. Putting it at the top of your interface file would ensure this. Here is an example:

    %javaconst(1);
    %javaconst(0) BIG;
    %javaconst(0) LARGE;
    
    #define EXPRESSION (0x100+5)
    #define BIG 1000LL
    #define LARGE 2000ULL
    

    generates:

    public interface exampleConstants {
      public final static int EXPRESSION = (0x100+5);
      public final static long BIG = exampleJNI.BIG_get();
      public final static java.math.BigInteger LARGE = exampleJNI.LARGE_get();
    }
    

    Note that SWIG has inferred the C long long type from BIG and used an appropriate Java type (long) as a Java long is the smallest sized Java type that will take all possible values for a C long long. Similarly for LARGE.

    Be careful using the %javaconst(1) directive as not all C code will compile as Java code. For example neither the 1000LL value for BIG nor 2000ULL for LARGE above would generate valid Java code. The example demonstrates how you can target particular constants (BIG and LARGE) with %javaconst. SWIG doesn't use %javaconst(1) as the default as it tries to generate code that will always compile. However, using a %javaconst(1) at the top of your interface file is strongly recommended as the preferred compile time constants will be generated and most C constants will compile as Java code and in any case the odd constant that doesn't can be fixed using %javaconst(0).

    There is an alternative directive which can be used for these rare constant values that won't compile as Java code. This is the %javaconstvalue(value) directive, where value is a Java code replacement for the C constant and can be either a string or a number. This is useful if you do not want to use either the parsed C value nor a JNI call, such as when the C parsed value will not compile as Java code and a compile time constant is required. The same example demonstrates this:

    %javaconst(1);
    %javaconstvalue("new java.math.BigInteger(\"2000\")") LARGE;
    %javaconstvalue(1000) BIG;
    
    #define EXPRESSION (0x100+5)
    #define BIG 1000LL
    #define LARGE 2000ULL
    

    Note the string quotes for "2000" are escaped. The following is then generated:

    public interface exampleConstants {
      public final static int EXPRESSION = (0x100+5);
      public final static long BIG = 1000;
      public final static java.math.BigInteger LARGE = new java.math.BigInteger("2000");
    }
    

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using a getter as described in the previous section. They are not wrapped as constants. The exception to this rule are static const integral values defined within a class/struct, where they are wrapped as constants, eg:.

    struct Maths {
      static const int FIVE = 5;
    };
    

    Compatibility Note: In SWIG-1.3.19 and earlier releases, the constants were generated into the module class and the constants interface didn't exist. Backwards compatibility is maintained as the module class implements the constants interface (even though some consider this type of interface implementation to be bad practice):

    public class example implements exampleConstants {
    }
    

    You thus have the choice of accessing these constants from either the module class or the constants interface, for example, example.EXPRESSION or exampleConstants.EXPRESSION. Or if you decide this practice isn't so bad and your own class implements exampleConstants, you can of course just use EXPRESSION.

    26.3.5 Enumerations

    SWIG handles both named and unnamed (anonymous) enumerations. There is a choice of approaches to wrapping named C/C++ enums. This is due to historical reasons as SWIG's initial support for enums was limited and Java did not originally have support for enums. Each approach has advantages and disadvantages and it is important for the user to decide which is the most appropriate solution. There are four approaches of which the first is the default approach based on the so called Java typesafe enum pattern. The second generates proper Java enums. The final two approaches use simple integers for each enum item. Before looking at the various approaches for wrapping named C/C++ enums, anonymous enums are considered.

    26.3.5.1 Anonymous enums

    There is no name for anonymous enums and so they are handled like constants. For example:

    enum { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    is wrapped into the constants interface, in a similar manner as constants (see previous section):

    public interface exampleConstants {
      public final static int ALE = exampleJNI.ALE_get();
      public final static int LAGER = exampleJNI.LAGER_get();
      public final static int STOUT = exampleJNI.STOUT_get();
      public final static int PILSNER = exampleJNI.PILSNER_get();
      public final static int PILZ = exampleJNI.PILZ_get();
    }
    

    The %javaconst(flag) and %javaconstvalue(value) directive introduced in the previous section on constants can also be used with enums. As is the case for constants, the default is %javaconst(0) as not all C values will compile as Java code. However, it is strongly recommended to add in a %javaconst(1) directive at the top of your interface file as it is only on very rare occasions that this will produce code that won't compile under Java. Using %javaconst(1) will ensure compile time constants are generated, thereby allowing the enum values to be used in Java switch statements. Example usage:

    %javaconst(1);
    %javaconst(0) PILSNER;
    enum { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    generates:

    public interface exampleConstants {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = exampleJNI.PILSNER_get();
      public final static int PILZ = PILSNER;
    }
    

    As in the case of constants, you can access them through either the module class or the constants interface, for example, example.ALE or exampleConstants.ALE.

    26.3.5.2 Typesafe enums

    This is the default approach to wrapping named enums. The typesafe enum pattern is a relatively well known construct to work around the lack of enums in versions of Java prior to JDK 1.5. It basically defines a class for the enumeration and permits a limited number of final static instances of the class. Each instance equates to an enum item within the enumeration. The implementation is in the "enumtypesafe.swg" file. Let's look at an example:

    %include "enumtypesafe.swg" // optional as typesafe enums are the default
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", exampleJNI.LAGER_get());
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", exampleJNI.PILZ_get());
      [... additional support methods omitted for brevity ...]
    }
    

    See Typesafe enum classes to see the omitted support methods. Note that the enum item with an initializer (LAGER) is initialized with the enum value obtained via a JNI call. However, as with anonymous enums and constants, use of the %javaconst directive is strongly recommended to change this behaviour:

    %include "enumtypesafe.swg" // optional as typesafe enums are the default
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", 10);
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", PILSNER);
      [... additional support methods omitted for brevity ...]
    }
    

    The generated code is easier to read and more efficient as a true constant is used instead of a JNI call. As is the case for constants, the default is %javaconst(0) as not all C values will compile as Java code. However, it is recommended to add in a %javaconst(1) directive at the top of your interface file as it is only on very rare occasions that this will produce code that won't compile under Java. The %javaconstvalue(value) directive can also be used for typesafe enums. Note that global enums are generated into a Java class within whatever package you are using. C++ enums defined within a C++ class are generated into a static final inner Java class within the Java proxy class.

    Typesafe enums have their advantages over using plain integers in that they can be used in a typesafe manner. However, there are limitations. For example, they cannot be used in switch statements and serialization is an issue. Please look at the following references for further information: Replace Enums with Classes in Effective Java Programming on the Sun website, Create enumerated constants in Java JavaWorld article, Java Tip 133: More on typesafe enums and Java Tip 122: Beware of Java typesafe enumerations JavaWorld tips.

    Note that the syntax required for using typesafe enums is the same as that for proper Java enums. This is useful during the period that a project has to support legacy versions of Java. When upgrading to JDK 1.5 or later, proper Java enums could be used instead, without users having to change their code. The following section details proper Java enum generation.

    26.3.5.3 Proper Java enums

    Proper Java enums were only introduced in JDK 1.5 so this approach is only compatible with more recent versions of Java. Java enums have been designed to overcome all the limitations of both typesafe and type unsafe enums and should be the choice solution, provided older versions of Java do not have to be supported. In this approach, each named C/C++ enum is wrapped by a Java enum. Java enums, by default, do not support enums with initializers. Java enums are in many respects similar to Java classes in that they can be customised with additional methods. SWIG takes advantage of this feature to facilitate wrapping C/C++ enums that have initializers. In order to wrap all possible C/C++ enums using proper Java enums, the "enums.swg" file must be used. Let's take a look at an example.

    %include "enums.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public enum Beverage {
      ALE,
      LAGER(10),
      STOUT,
      PILSNER,
      PILZ(PILSNER);
      [... additional support methods omitted for brevity ...]
    }
    

    See Proper Java enum classes to see the omitted support methods. The generated Java enum has numerous additional methods to support enums with initializers, such as LAGER above. Note that as with the typesafe enum pattern, enum items with initializers are by default initialized with the enum value obtained via a JNI call. However, this is not the case above as we have used the recommended %javaconst(1) to avoid the JNI call. The %javaconstvalue(value) directive covered in the Constants section can also be used for proper Java enums.

    The additional support methods need not be generated if none of the enum items have initializers and this is covered later in the Simpler Java enums for enums without initializers section.

    26.3.5.4 Type unsafe enums

    In this approach each enum item in a named enumeration is wrapped as a static final integer in a class named after the C/C++ enum name. This is a commonly used pattern in Java to simulate C/C++ enums, but it is not typesafe. However, the main advantage over the typesafe enum pattern is enum items can be used in switch statements. In order to use this approach, the "enumtypeunsafe.swg" file must be used. Let's take a look at an example.

    %include "enumtypeunsafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = STOUT + 1;
      public final static int PILZ = PILSNER;
    }
    

    As is the case previously, the default is %javaconst(0) as not all C/C++ values will compile as Java code. However, again it is recommended to add in a %javaconst(1) directive. and the %javaconstvalue(value) directive covered in the Constants section can also be used for type unsafe enums. Note that global enums are generated into a Java class within whatever package you are using. C++ enums defined within a C++ class are generated into a static final inner Java class within the Java proxy class.

    Note that unlike typesafe enums, this approach requires users to mostly use different syntax compared with proper Java enums. Thus the upgrade path to proper enums provided in JDK 1.5 is more painful.

    26.3.5.5 Simple enums

    This approach is similar to the type unsafe approach. Each enum item is also wrapped as a static final integer. However, these integers are not generated into a class named after the C/C++ enum. Instead, global enums are generated into the constants interface. Also, enums defined in a C++ class have their enum items generated directly into the Java proxy class rather than an inner class within the Java proxy class. In fact, this approach is effectively wrapping the enums as if they were anonymous enums and the resulting code is as per anonymous enums. The implementation is in the "enumsimple.swg" file.

    Compatibility Note: SWIG-1.3.21 and earlier versions wrapped all enums using this approach. The type unsafe approach is preferable to this one and this simple approach is only included for backwards compatibility with these earlier versions of SWIG.

    26.3.6 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Java. For example:

    SWIGTYPE_p_FILE f = example.fopen("junk", "w");
    example.fputs("Hello World\n", f);
    example.fclose(f);
    

    C pointers in the Java module are stored in a Java long and cross the JNI boundary held within this 64 bit number. Many other SWIG language modules use an encoding of the pointer in a string. These scripting languages use the SWIG runtime type checker for dynamic type checking as they do not support static type checking by a compiler. In order to implement static type checking of pointers within Java, they are wrapped by a simple Java class. In the example above the FILE * pointer is wrapped with a type wrapper class called SWIGTYPE_p_FILE.

    Once obtained, a type wrapper object can be freely passed around to different C functions that expect to receive an object of that type. The only thing you can't do is dereference the pointer from Java. Of course, that isn't much of a concern in this example.

    As much as you might be inclined to modify a pointer value directly from Java, don't. The value is not necessarily the same as the logical memory address of the underlying object. The value will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Most JVMs are 32 bit applications so any JNI code must also be compiled as 32 bit. The net result is pointers in JNI code are also 32 bits and are stored in the high order 4 bytes on big-endian machines and in the low order 4 bytes on little-endian machines. By design it is also not possible to manually cast a pointer to a new type by using Java casts as it is particularly dangerous especially when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return a NULL pointer if the conversion can't be performed.

    26.3.7 Structures

    If you wrap a C structure, it is wrapped by a Java class with getters and setters for access to the member variables. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    Vector v = new Vector();
    v.setX(3.5);
    v.setY(7.2);
    double x = v.getX();
    double y = v.getY();
    

    The variable setters and getters are also based on the JavaBean design pattern already covered under the Global variables section. Similar access is provided for unions and the public data members of C++ classes.

    This object is actually an instance of a Java class that has been wrapped around a pointer to the C structure. This instance doesn't actually do anything--it just serves as a proxy. The pointer to the C object is held in the Java proxy class in much the same way as pointers are held by type wrapper classes. Further details about Java proxy classes are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Java, you will see behavior like this:

    Bar b = new Bar();
    SWIGTYPE_p_int x = b.getX();
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    Bar b = new Bar();
    SWIGTYPE_p_int x = b.getX();
    Bar c = new Bar();
    c.setX(x);                    // Copy contents of b.x to c.x
    

    For array assignment (setters not getters), SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation. The default wrapping makes it hard to set or get just one element of the array and so array access from Java is somewhat limited. This can be changed easily though by using the approach outlined later in the Wrapping C arrays with Java arrays and Unbounded C Arrays sections.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f member of Bar like this:

    Bar b = new Bar();
    Foo x = b.getF();
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    Bar b = new Bar();
    b.getF().setA(3);   // Modify b.f.a
    Foo x = b.getF();                   
    x.setA(3);          // Modify x.a - this is the same as b.f.a
    

    26.3.8 C++ classes

    C++ classes are wrapped by Java classes as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Java like this:

    List l = new List();
    l.insert("Ale");
    l.insert("Stout");
    l.insert("Lager");
    String item = l.get(2);
    int length = l.getLength();
    

    Class data members are accessed in the same manner as C structures.

    Static class members are unsurprisingly wrapped as static members of the Java class:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    The static members work like any other Java static member:

    Spam.foo();
    int bar = Spam.getBar();
    

    26.3.9 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    those classes are wrapped into a hierarchy of Java classes that reflect the same inheritance structure:

    Bar b = new Bar();
    Class c = b.getClass();
    System.out.println(c.getSuperclass().getName());
    

    will of course display:

    Foo
    

    Furthermore, if you have functions like this

    void spam(Foo *f);
    

    then the Java function spam() accepts instances of Foo or instances of any other proxy classes derived from Foo.

    Note that Java does not support multiple inheritance so any multiple inheritance in the C++ code is not going to work. A warning is given when multiple inheritance is detected and only the first base class is used.

    26.3.10 Pointers, references, arrays and pass by value

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In Java, there is no detailed distinction like this--specifically, there are only instances of classes. There are no pointers nor references. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this from Java:

    Foo f = new Foo();  // Create a Foo
    example.spam1(f);   // Ok. Pointer
    example.spam2(f);   // Ok. Reference
    example.spam3(f);   // Ok. Value.
    example.spam4(f);   // Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Java will release this memory when the returned object's finalizer is run by the garbage collector).

    26.3.10.1 Null pointers

    Working with null pointers is easy. A Java null can be used whenever a method expects a proxy class or typewrapper class. However, it is not possible to pass null to C/C++ functions that take parameters by value or by reference. If you try you will get a NullPointerException.

    example.spam1(null);   // Pointer - ok
    example.spam2(null);   // Reference - NullPointerException
    example.spam3(null);   // Value - NullPointerException
    example.spam4(null);   // Array - ok
    

    For spam1 and spam4 above the Java null gets translated into a NULL pointer for passing to the C/C++ function. The converse also occurs, that is, NULL pointers are translated into null Java objects when returned from a C/C++ function.

    26.3.11 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    %module example
    
    void foo(int);
    void foo(char *c);
    

    You can use them in Java in a straightforward manner:

    example.foo(3);           // foo(int)
    example.foo("Hello");     // foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Java code like this:

    Foo f = new Foo();        // Create a Foo
    Foo g = new Foo(f);       // Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG cannot disambiguate as there can be more than one C++ type mapping onto a single Java type. For example:

    void spam(int);
    void spam(unsigned short);
    

    Here both int and unsigned short map onto a Java int. Here is another example:

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 515: Overloaded method spam(unsigned short) ignored.
    Method spam(int) at example.i:11 used.
    

    To fix this, you either need to either rename or ignore one of the methods. For example:

    %rename(spam_ushort) spam(unsigned short);
    ...
    void spam(int);    
    void spam(unsigned short);   // Now renamed to spam_ushort
    

    or

    %ignore spam(unsigned short);
    ...
    void spam(int);    
    void spam(unsigned short);   // Ignored
    

    26.3.12 C++ default arguments

    Any function with a default argument is wrapped by generating an additional function for each argument that is defaulted. For example, if we have the following C++:

    %module example
    
    void defaults(double d=10.0, int i=0);
    

    The following methods are generated in the Java module class:

    public class example {
      public static void defaults(double d, int i) { ... }
      public static void defaults(double d) { ... }
      public static void defaults() { ... }
    }
    

    It is as if SWIG had parsed three separate overloaded methods. The same approach is taken for static methods, constructors and member methods.

    Compatibility note: Versions of SWIG prior to SWIG-1.3.23 wrapped these with a single wrapper method and so the default values could not be taken advantage of from Java. Further details on default arguments and how to restore this approach are given in the more general Default arguments section.

    26.3.13 C++ namespaces

    SWIG is aware of named C++ namespaces and they can be mapped to Java packages, however, the default wrapping flattens the namespaces, effectively ignoring them. So by default, the namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Java as follows:

    int f = example.fact(3);
    Vector v = new Vector();
    v.setX(3.4);
    double y = v.getY();
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and you want to keep their symbols separate, consider wrapping them as separate SWIG modules. Each SWIG module can be placed into a separate package.

    The default behaviour described above can be improved via the nspace feature. Note that it only works for classes, structs, unions and enums declared within a named C++ namespace. When the nspace feature is used, the C++ namespaces are converted into Java packages of the same name. Proxy classes are thus declared within a package and this proxy makes numerous calls to the JNI intermediary class which is declared in the unnamed package by default. As Java does not support types declared in a named package accessing types declared in an unnamed package, the -package commandline option described earlier generally should be used to provide a parent package. So if SWIG is run using the -package com.myco option, a wrapped class, MyWorld::Material::Color, can then be accessed as com.myco.MyWorld.Material.Color. If you don't specify a package, you will get the following warning:

    example.i:16: Warning 826: The nspace feature is used on 'MyWorld::Material::Color' without -package. The generated code 
    may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package.
    

    If it is undesirable to have a single top level package, the nspace feature may be used without the -package commandline option (and the resulting warning ignored) if all of the types exposed using SWIG are placed in a package using the nspace feature and the 'jniclasspackage' pragma is used to specify a package for the JNI intermediary class.

    If the resulting use of the nspace feature and hence packages results in a proxy class in one package deriving or using a proxy class from another package, you will need to open up the visibility for the pointer constructor and getCPtr method from the default 'protected' to 'public' with the SWIG_JAVABODY_PROXY macro. See Java code typemaps.

    26.3.14 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include <utility>
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Java:

    pairii p = new pairii(3, 4);
    int first = p.getFirst();
    int second = p.getSecond();
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter.

    26.3.15 C++ Smart Pointers

    26.3.15.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Java in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    26.3.15.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Java, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Java, everything should just "work":

    SmartPtrFoo p = example.CreateFoo(); // Create a smart-pointer somehow
    p.setX(3);                           // Foo::x
    int y = p.bar();                     // Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    Foo f = p.__deref__();               // Returns underlying Foo *
    

    26.4 Further details on the generated Java classes

    In the previous section, a high-level view of Java wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Java proxy classes and type wrapper classes are used in situations where no proxies are generated. This provides a very natural, type safe Java interface to the C/C++ code and fits in with the Java programming paradigm. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work and then covers the type wrapper classes. Finally enum classes are covered. First, the crucial intermediary JNI class is considered.

    26.4.1 The intermediary JNI class

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a global function and class like this

    class Foo {
    public:
      int x;
      int spam(int num, Foo* foo);
    };
    void egg(Foo* chips);
    

    then SWIG transforms the class into a set of low-level procedural wrappers. These procedural wrappers essentially perform the equivalent of this C++ code:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int num, Foo* foo) {
      return f->spam(num, foo);
    }
    

    These procedural function names don't actually exist, but their functionality appears inside the generated JNI functions. The JNI functions have to follow a particular naming convention so the function names are actually:

    SWIGEXPORT jlong JNICALL Java_exampleJNI_new_1Foo(JNIEnv *jenv, jclass jcls);
    SWIGEXPORT void JNICALL Java_exampleJNI_delete_1Foo(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1);
    SWIGEXPORT void JNICALL Java_exampleJNI_Foo_1x_1set(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1, jobject jarg1_, jint jarg2);
    SWIGEXPORT jint JNICALL Java_exampleJNI_Foo_1x_1get(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1, jobject jarg1_);
    SWIGEXPORT jint JNICALL Java_exampleJNI_Foo_1spam(JNIEnv *jenv, jclass jcls,
                                                      jlong jarg1, jobject jarg1_, jint jarg2,
                                                      jlong jarg3, jobject jarg3_);
    SWIGEXPORT void JNICALL Java_exampleJNI_egg(JNIEnv *jenv, jclass jcls,
                                                jlong jarg1, jobject jarg1_);
    

    For every JNI C function there has to be a static native Java function. These appear in the intermediary JNI class:

    class exampleJNI {
      public final static native long new_Foo();
      public final static native void delete_Foo(long jarg1);
      public final static native void Foo_x_set(long jarg1, Foo jarg1_, int jarg2);
      public final static native int Foo_x_get(long jarg1, Foo jarg1_);
      public final static native int Foo_spam(long jarg1, Foo jarg1_, int jarg2,
                                              long jarg3, Foo jarg3_);
      public final static native void egg(long jarg1, Foo jarg1_);
    }
    

    This class contains the complete Java - C/C++ interface so all function calls go via this class. As this class acts as a go-between for all JNI calls to C/C++ code from the Java proxy classes, type wrapper classes and module class, it is known as the intermediary JNI class.

    You may notice that SWIG uses a Java long wherever a pointer or class object needs to be marshalled across the Java-C/C++ boundary. This approach leads to minimal JNI code which makes for better performance as JNI code involves a lot of string manipulation. SWIG favours generating Java code over JNI code as Java code is compiled into byte code and avoids the costly string operations needed in JNI code. This approach has a downside though as the proxy class might get collected before the native method has completed. You might notice above that there is an additional parameters with a underscore postfix, eg jarg1_. These are added in order to prevent premature garbage collection when marshalling proxy classes.

    The functions in the intermediary JNI class cannot be accessed outside of its package. Access to them is gained through the module class for globals otherwise the appropriate proxy class.

    The name of the intermediary JNI class can be changed from its default, that is, the module name with JNI appended after it. The module directive attribute jniclassname is used to achieve this:

    %module (jniclassname="name") modulename
    

    If name is the same as modulename then the module class name gets changed from modulename to modulenameModule.

    26.4.1.1 The intermediary JNI class pragmas

    The intermediary JNI class can be tailored through the use of pragmas, but is not commonly done. The pragmas for this class are:

    Pragma Description
    jniclassbase Base class for the intermediary JNI class
    jniclasspackage Package in which to place the intermediary JNI class
    jniclassclassmodifiers Class modifiers and class type for the intermediary JNI class
    jniclasscode Java code is copied verbatim into the intermediary JNI class
    jniclassimports Java code, usually one or more import statements, placed before the intermediary JNI class definition
    jniclassinterfaces Comma separated interface classes for the intermediary JNI class

    The pragma code appears in the generated intermediary JNI class where you would expect:

    [ jniclassimports pragma ]
    [ jniclassclassmodifiers pragma ] jniclassname extends [ jniclassbase pragma ]
                                              implements [ jniclassinterfaces pragma ] {
    [ jniclasscode pragma ]
    ... SWIG generated native methods ...
    }
    

    The jniclasscode pragma is quite useful for adding in a static block for loading the shared library / dynamic link library and demonstrates how pragmas work:

    %pragma(java) jniclasscode=%{
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. \n" + e);
          System.exit(1);
        }
      }
    %}
    

    Pragmas will take either "" or %{ %} as delimiters. For example, let's change the intermediary JNI class access to just the default package-private access.

    %pragma(java) jniclassclassmodifiers="class"
    

    All the methods in the intermediary JNI class will then not be callable outside of the package as the method modifiers have been changed from public access to default access. This is useful if you want to prevent users calling these low level functions.

    26.4.2 The Java module class

    All global functions and variable getters/setters appear in the module class. For our example, there is just one function:

    public class example {
      public static void egg(Foo chips) {
        exampleJNI.egg(Foo.getCPtr(chips), chips);
      }
    }
    

    The module class is necessary as there is no such thing as a global in Java so all the C globals are put into this class. They are generated as static functions and so must be accessed as such by using the module name in the static function call:

    example.egg(new Foo());
    

    The primary reason for having the module class wrapping the calls in the intermediary JNI class is to implement static type checking. In this case only a Foo can be passed to the egg function, whereas any long can be passed to the egg function in the intermediary JNI class.

    26.4.2.1 The Java module class pragmas

    The module class can be tailored through the use of pragmas, in the same manner as the intermediary JNI class. The pragmas are similarly named and are used in the same way. The complete list follows:

    Pragma Description
    modulebase Base class for the module class
    moduleclassmodifiers Class modifiers and class type for the module class
    modulecode Java code is copied verbatim into the module class
    moduleimports Java code, usually one or more import statements, placed before the module class definition
    moduleinterfaces Comma separated interface classes for the module class

    The pragma code appears in the generated module class like this:

    [ moduleimports pragma ]
    [ modulemodifiers pragma ] modulename extends [ modulebase pragma ]
                                          implements [ moduleinterfaces pragma ] {
    [ modulecode pragma ]
    ... SWIG generated wrapper functions ...
    }
    

    See The intermediary JNI class pragmas section for further details on using pragmas.

    26.4.3 Java proxy classes

    A Java proxy class is generated for each structure, union or C++ class that is wrapped. Proxy classes have also been called peer classes. The default proxy class for our previous example looks like this:

    public class Foo {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Foo(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Foo obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Foo(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      public void setX(int value) {
        exampleJNI.Foo_x_set(swigCPtr, this, value);
      }
    
      public int getX() {
        return exampleJNI.Foo_x_get(swigCPtr, this);
      }
    
      public int spam(int num, Foo foo) {
        return exampleJNI.Foo_spam(swigCPtr, this, num, Foo.getCPtr(foo), foo);
      }
    
      public Foo() {
        this(exampleJNI.new_Foo(), true);
      }
    
    }
    

    This class merely holds a pointer to the underlying C++ object (swigCPtr). It also contains all the methods in the C++ class it is proxying plus getters and setters for public member variables. These functions call the native methods in the intermediary JNI class. The advantage of having this extra layer is the type safety that the proxy class functions offer. It adds static type checking which leads to fewer surprises at runtime. For example, you can see that if you attempt to use the spam() function it will only compile when the parameters passed are an int and a Foo. From a user's point of view, it makes the class work as if it were a Java class:

    Foo f = new Foo();
    f.setX(3);
    int y = f.spam(5, new Foo());
    

    26.4.3.1 Memory management

    Each proxy class has an ownership flag swigCMemOwn. The value of this flag determines who is responsible for deleting the underlying C++ object. If set to true, the proxy class's finalizer will destroy the C++ object when the proxy class is garbage collected. If set to false, then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Java automatically takes ownership of the result. On the other hand, when pointers or references are returned to Java, there is often no way to know where they came from. Therefore, the ownership is set to false. For example:

    class Foo {
    public:
      Foo();
      Foo bar1();
      Foo &bar2();
      Foo *bar2();
    };
    

    In Java:

    Foo f = new Foo();   //  f.swigCMemOwn = true
    Foo f1 = f.bar1();   // f1.swigCMemOwn = true
    Foo f2 = f.bar2();   // f2.swigCMemOwn = false
    Foo f3 = f.bar3();   // f3.swigCMemOwn = false
    

    This behavior for pointers and references is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Java to assume ownership and destroy it!

    For the most part, memory management issues remain hidden. However, there are situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Obj {};
    class Node {
      Obj *value;
    public:
      void set_value(Obj *v) { value = v; }
    };
    

    Now, consider the following Java code:

    Node n = new Node();    // Create a node
    {
      Obj o = new Obj();    // Create an object
      n.set_value(o);       // Set value
    }                       // o goes out of scope
    

    In this case, the Node n is holding a reference to o internally. However, SWIG has no way to know that this has occurred. The Java proxy class still thinks that it has ownership of o. As o has gone out of scope, it could be garbage collected in which case the C++ destructor will be invoked and n will then be holding a stale-pointer to o. If you're lucky, you will only get a segmentation fault.

    To work around this, the ownership flag of o needs changing to false. The ownership flag is a private member variable of the proxy class so this is not possible without some customization of the proxy class. This can be achieved by using a typemap to customise the proxy class with pure Java code as detailed later in the section on Java typemaps.

    Sometimes a function will create memory and return a pointer to a newly allocated object. SWIG has no way of knowing this so by default the proxy class does not manage the returned object. However, you can tell the proxy class to manage the memory if you specify the %newobject directive. Consider:

    class Obj {...};
    class Factory {
    public:
      static Obj *createObj() { return new Obj(); }
    };
    

    If we call the factory function, then we have to manually delete the memory:

    Obj obj = Factory.createObj();   // obj.swigCMemOwn = false
    ...
    obj.delete();
    

    Now add in the %newobject directive:

    %newobject Factory::createObj();
    
    class Obj {...};
    class Factory {
    public:
      static Obj *createObj() { return new Obj(); }
    };
    

    A call to delete() is no longer necessary as the garbage collector will make the C++ destructor call because swigCMemOwn is now true.

    Obj obj = Factory.createObj();   // obj.swigCMemOwn = true;
    ...
    

    Some memory management issues are quite tricky to fix and may only be noticeable after using for a long time. One such issue is premature garbage collection of an object created from Java and resultant usage from C++ code. The section on typemap examples cover two such scenarios, Memory management for objects passed to the C++ layer and Memory management when returning references to member variables

    26.4.3.2 Inheritance

    Java proxy classes will mirror C++ inheritance chains. For example, given the base class Base and its derived class Derived:

    class Base {
    public:
      virtual double foo();
    };
    
    class Derived : public Base {
    public:
      virtual double foo();
    };
    

    The base class is generated much like any other proxy class seen so far:

    public class Base {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Base(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Base obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Base(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      public double foo() {
        return exampleJNI.Base_foo(swigCPtr, this);
      }
    
      public Base() {
        this(exampleJNI.new_Base(), true);
      }
    
    }
    

    The Derived class extends Base mirroring the C++ class inheritance hierarchy.

    public class Derived extends Base {
      private transient long swigCPtr;
    
      protected Derived(long cPtr, boolean cMemoryOwn) {
        super(exampleJNI.SWIGDerivedUpcast(cPtr), cMemoryOwn);
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Derived obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Derived(swigCPtr);
        }
        swigCPtr = 0;
        super.delete();
      }
    
      public double foo() {
        return exampleJNI.Derived_foo(swigCPtr, this);
      }
    
      public Derived() {
        this(exampleJNI.new_Derived(), true);
      }
    
    }
    

    Note the memory ownership is controlled by the base class. However each class in the inheritance hierarchy has its own pointer value which is obtained during construction. The SWIGDerivedUpcast() call converts the pointer from a Derived * to a Base *. This is a necessity as C++ compilers are free to implement pointers in the inheritance hierarchy with different values.

    It is of course possible to extend Base using your own Java classes. If Derived is provided by the C++ code, you could for example add in a pure Java class Extended derived from Base. There is a caveat and that is any C++ code will not know about your pure Java class Extended so this type of derivation is restricted. However, true cross language polymorphism can be achieved using the directors feature.

    26.4.3.3 Proxy classes and garbage collection

    By default each proxy class has a delete() and a finalize() method. The finalize() method calls delete() which frees any malloc'd memory for wrapped C structs or calls the C++ class destructors. The idea is for delete() to be called when you have finished with the C/C++ object. Ideally you need not call delete(), but rather leave it to the garbage collector to call it from the finalizer. When a program exits, the garbage collector does not guarantee to call all finalizers. An insight into the reasoning behind this can be obtained from Hans Boehm's Destructors, Finalizers, and Synchronization paper. Depending on what the finalizers do and which operating system you use, this may or may not be a problem.

    If the delete() call into JNI code is just for memory handling, there is not a problem when run on most operating systems, for example Windows and Unix. Say your JNI code creates memory on the heap which your finalizers should clean up, the finalizers may or may not be called before the program exits. In Windows and Unix all memory that a process uses is returned to the system on exit, so this isn't a problem. This is not the case in some operating systems like vxWorks. If however, your finalizer calls into JNI code invoking the C++ destructor which in turn releases a TCP/IP socket for example, there is no guarantee that it will be released. Note that with long running programs the garbage collector will eventually run, thereby calling any unreferenced object's finalizers.

    Some not so ideal solutions are:

    1. Call the System.runFinalizersOnExit(true) or Runtime.getRuntime().runFinalizersOnExit(true) to ensure the finalizers are called before the program exits. The catch is that this is a deprecated function call as the documentation says:

      This method is inherently unsafe. It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock.

      In many cases you will be lucky and find that it works, but it is not to be advocated. Have a look at Java web site and search for runFinalizersOnExit.

    2. From jdk1.3 onwards a new function, addShutdownHook(), was introduced which is guaranteed to be called when your program exits. You can encourage the garbage collector to call the finalizers, for example, add this static block to the class that has the main() function:

        static {
          Runtime.getRuntime().addShutdownHook( 
            new Thread() {
              public void run() { System.gc(); System.runFinalization(); }
            }
          );
        }
      

      Although this usually works, the documentation doesn't guarantee that runFinalization() will actually call the finalizers. As the shutdown hook is guaranteed you could also make a JNI call to clean up any resources that are being tracked by the C/C++ code.

    3. Call the delete() function manually which will immediately invoke the C++ destructor. As a suggestion it may be a good idea to set the object to null so that should the object be inadvertently used again a Java null pointer exception is thrown, the alternative would crash the JVM by using a null C pointer. For example given a SWIG generated class A:

      A myA = new A();
      // use myA ...
      myA.delete();
      // any use of myA here would crash the JVM 
      myA=null;
      // any use of myA here would cause a Java null pointer exception to be thrown
      

      The SWIG generated code ensures that the memory is not deleted twice, in the event the finalizers get called in addition to the manual delete() call.

    4. Write your own object manager in Java. You could derive all SWIG classes from a single base class which could track which objects have had their finalizers run, then call the rest of them on program termination. The section on Java typemaps details how to specify a pure Java base class.

    See the How to Handle Java Finalization's Memory-Retention Issues article for alternative approaches to managing memory by avoiding finalizers altogether.

    26.4.3.4 The premature garbage collection prevention parameter for proxy class marshalling

    As covered earlier, the C/C++ struct/class pointer is stored in the proxy class as a Java long and when needed is passed into the native method where it is cast into the appropriate type. This approach provides very fast marshalling but could be susceptible to premature garbage collection. Consider the following C++ code:

    class Wibble {
    };
    void wobble(Wibble &w);
    

    The module class contains the Java wrapper for the global wobble method:

    public class example {
      ...
      public static void wobble(Wibble w) {
        exampleJNI.wobble(Wibble.getCPtr(w), w);
      }
    }
    

    where example is the name of the module. All native methods go through the intermediary class which has the native method declared as such:

    public class exampleJNI {
      ...
      public final static native void wobble(long jarg1, Wibble jarg1_);
    }
    

    The second parameter, jarg1_, is the premature garbage collection prevention parameter and is added to the native method parameter list whenever a C/C++ struct or class is marshalled as a Java long. In order to understand why, consider the alternative where the intermediary class method is declared without the additional parameter:

    public class exampleJNI {
      ...
      public final static native void wobble(long jarg1);
    }
    

    and the following simple call to wobble:

    {
      Wibble w = new Wibble();
      example.wobble(w);
    }
    

    The hotspot compiler effectively sees something like:

    {
      Wibble w = new Wibble();
      long w_ptr = Wibble.getCPtr(w);
      // w is no longer reachable
      exampleJNI.wobble(w_ptr);
    }
    

    The Wibble object is no longer reachable after the point shown as in this bit of code, the Wibble object is not referenced again after this point. This means that it is a candidate for garbage collection. Should wobble be a long running method, it is quite likely that the finalizer for the Wibble instance will be called. This in turn will call its underlying C++ destructor which is obviously disastrous while the method wobble is running using this object. Even if wobble is not a long running method, it is possible for the Wibble instance to be finalized. By passing the Wibble instance into the native method, it will not be finalized as the JVM guarantees not to finalize any objects until the native method returns. Effectively, the code then becomes

    {
      Wibble w = new Wibble();
      long w_ptr = Wibble.getCPtr(w);
      exampleJNI.wobble(w_ptr, w);
      // w is no longer reachable
    }
    

    and therefore there is no possibility of premature garbage collection. In practice, this premature garbage collection was only ever observed in Sun's server JVM from jdk-1.3 onwards and in Sun's client JVM from jdk-1.6 onwards.

    The premature garbage collection prevention parameter for proxy classes is generated by default whenever proxy classes are passed by value, reference or with a pointer. The implementation for this extra parameter generation requires the "jtype" typemap to contain long and the "jstype" typemap to contain the name of a proxy class.

    The additional parameter does impose a slight performance overhead and the parameter generation can be suppressed globally with the -nopgcpp commandline option. More selective suppression is possible with the 'nopgcpp' attribute in the "jtype" Java typemap. The attribute is a flag and so should be set to "1" to enable the suppression, or it can be omitted or set to "0" to disable. For example:

    %typemap(jtype, nopgcpp="1") Wibble & "long"
    

    Compatibility note: The generation of this additional parameter did not occur in versions prior to SWIG-1.3.30.

    26.4.3.5 Single threaded applications and thread safety

    Single threaded Java applications using JNI need to consider thread safety. The same applies for the C# module where the .NET wrappers use PInvoke. Consider the C++ class:

    class Test {
      string str;
    public:
      Test() : str("initial") {}
    };
    

    and the Java proxy class generated by SWIG:

    public class Test {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Test(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Test obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      // Call C++ destructor
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Test(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      // Call C++ constructor
      public Test() {
        this(exampleJNI.new_Test(), true);
      }
    
    }
    

    It has two methods that call JNI methods, namely, exampleJNI.new_Test() for the C++ constructor and exampleJNI.delete_Test() for the C++ destructor. If the garbage collector collects an instance of this class, ie delete() is not explicitly called, then the C++ destructor will be run in a different thread to the main thread. This is because when an object is marked for garbage collection, any objects with finalizers are added to a finalization queue and the objects in the finalization queue have their finalize() methods run in a separate finalization thread. Therefore, if the C memory allocator is not thread safe, then the heap will get corrupted sooner or later, when a concurrent C++ delete and new are executed. It is thus essential, even in single threaded usage, to link to the C multi-thread runtime libraries, for example, use the /MD option for Visual C++ on Windows. Alternatively, lock all access to C++ functions that have heap allocation/deallocation.

    Note that some of the STL in Visual C++ 6 is not thread safe, so although code might be linked to the multithread runtime libraries, undefined behaviour might still occur in a single threaded Java program. Similarly some older versions of Sun Studio have bugs in the multi-threaded implementation of the std::string class and so will lead to undefined behaviour in these supposedly single threaded Java applications.

    The following innocuous Java usage of Test is an example that will crash very quickly on a multiprocessor machine if the JNI compiled code is linked against the single thread C runtime libraries.

    for (int i=0; i<100000; i++) {
      System.out.println("Iteration " + i);
      for (int k=0; k<10; k++) {
        Test test = new Test();
      }
      System.gc();
    }
    

    26.4.4 Type wrapper classes

    The generated type wrapper class, for say an int *, looks like this:

    public class SWIGTYPE_p_int {
      private transient long swigCPtr;
    
      protected SWIGTYPE_p_int(long cPtr, boolean bFutureUse) {
        swigCPtr = cPtr;
      }
    
      protected SWIGTYPE_p_int() {
        swigCPtr = 0;
      }
    
      protected static long getCPtr(SWIGTYPE_p_int obj) {
        return obj.swigCPtr;
      }
    }
    

    The methods do not have public access, so by default it is impossible to do anything with objects of this class other than pass them around. The methods in the class are part of the inner workings of SWIG. If you need to mess around with pointers you will have to use some typemaps specific to the Java module to achieve this. The section on Java typemaps details how to modify the generated code.

    Note that if you use a pointer or reference to a proxy class in a function then no type wrapper class is generated because the proxy class can be used as the function parameter. If however, you need anything more complicated like a pointer to a pointer to a proxy class then a typewrapper class is generated for your use.

    Note that SWIG generates a type wrapper class and not a proxy class when it has not parsed the definition of a type that gets used. For example, say SWIG has not parsed the definition of class Snazzy because it is in a header file that you may have forgotten to use the %include directive on. Should SWIG parse Snazzy * being used in a function parameter, it will then generates a type wrapper class around a Snazzy pointer. Also recall from earlier that SWIG will use a pointer when a class is passed by value or by reference:

    void spam(Snazzy *x, Snazzy &y, Snazzy z);
    

    Should SWIG not know anything about Snazzy then a SWIGTYPE_p_Snazzy must be used for all 3 parameters in the spam function. The Java function generated is:

    public static void spam(SWIGTYPE_p_Snazzy x, SWIGTYPE_p_Snazzy y, SWIGTYPE_p_Snazzy z) {
     ...
    }
    

    Note that typedefs are tracked by SWIG and the typedef name is used to construct the type wrapper class name. For example, consider the case where Snazzy is a typedef to an int which SWIG does parse:

    typedef int Snazzy;
    void spam(Snazzy *x, Snazzy &y, Snazzy z);
    

    Because the typedefs have been tracked the Java function generated is:

    public static void spam(SWIGTYPE_p_int x, SWIGTYPE_p_int y, int z) { ... }
    

    26.4.5 Enum classes

    SWIG can generate three types of enum classes. The Enumerations section discussed these but omitted all the details. The following sub-sections detail the various types of enum classes that can be generated.

    26.4.5.1 Typesafe enum classes

    The following example demonstrates the typesafe enum classes which SWIG generates:

    %include "enumtypesafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    The following is the code that SWIG generates:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", 10);
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", PILSNER);
    
      public final int swigValue() {
        return swigValue;
      }
    
      public String toString() {
        return swigName;
      }
    
      public static Beverage swigToEnum(int swigValue) {
        if (swigValue < swigValues.length && swigValue >= 0 &&
            swigValues[swigValue].swigValue == swigValue)
          return swigValues[swigValue];
        for (int i = 0; i < swigValues.length; i++)
          if (swigValues[i].swigValue == swigValue)
            return swigValues[i];
        throw new IllegalArgumentException("No enum " + Beverage.class + " with value " +
                                                                             swigValue);
      }
    
      private Beverage(String swigName) {
        this.swigName = swigName;
        this.swigValue = swigNext++;
      }
    
      private Beverage(String swigName, int swigValue) {
        this.swigName = swigName;
        this.swigValue = swigValue;
        swigNext = swigValue+1;
      }
    
      private Beverage(String swigName, Beverage swigEnum) {
        this.swigName = swigName;
        this.swigValue = swigEnum.swigValue;
        swigNext = this.swigValue+1;
      }
    
      private static Beverage[] swigValues = { ALE, LAGER, STOUT, PILSNER, PILZ };
      private static int swigNext = 0;
      private final int swigValue;
      private final String swigName;
    }
    

    As can be seen, there are a fair number of support methods for the typesafe enum pattern. The typesafe enum pattern involves creating a fixed number of static instances of the enum class. The constructors are private to enforce this. Three constructors are available - two for C/C++ enums with an initializer and one for those without an initializer. Note that the two enums with initializers, LAGER and PILZ, each call one the two different initializer constructors. In order to use one of these typesafe enums, the swigToEnum static method must be called to return a reference to one of the static instances. The JNI layer returns the enum value from the C/C++ world as an integer and this method is used to find the appropriate Java enum static instance. The swigValue method is used for marshalling in the other direction. The toString method is overridden so that the enum name is available.

    26.4.5.2 Proper Java enum classes

    The following example demonstrates the Java enums approach:

    %include "enums.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    SWIG will generate the following Java enum:

    public enum Beverage {
      ALE,
      LAGER(10),
      STOUT,
      PILSNER,
      PILZ(PILSNER);
    
      public final int swigValue() {
        return swigValue;
      }
    
      public static Beverage swigToEnum(int swigValue) {
        Beverage[] swigValues = Beverage.class.getEnumConstants();
        if (swigValue < swigValues.length && swigValue >= 0 &&
            swigValues[swigValue].swigValue == swigValue)
          return swigValues[swigValue];
        for (Beverage swigEnum : swigValues)
          if (swigEnum.swigValue == swigValue)
            return swigEnum;
        throw new IllegalArgumentException("No enum " + Beverage.class +
                                           " with value " + swigValue);
      }
    
      private Beverage() {
        this.swigValue = SwigNext.next++;
      }
    
      private Beverage(int swigValue) {
        this.swigValue = swigValue;
        SwigNext.next = swigValue+1;
      }
    
      private Beverage(Beverage swigEnum) {
        this.swigValue = swigEnum.swigValue;
        SwigNext.next = this.swigValue+1;
      }
    
      private final int swigValue;
    
      private static class SwigNext {
        private static int next = 0;
      }
    }
    

    The enum items appear first. Like the typesafe enum pattern, the constructors are private. The constructors are required to handle C/C++ enums with initializers. The next variable is in the SwigNext inner class rather than in the enum class as static primitive variables cannot be modified from within enum constructors. Marshalling between Java enums and the C/C++ enum integer value is handled via the swigToEnum and swigValue methods. All the constructors and methods in the Java enum are required just to handle C/C++ enums with initializers. These needn't be generated if the enum being wrapped does not have any initializers and the Simpler Java enums for enums without initializers section describes how typemaps can be used to achieve this.

    26.4.5.3 Type unsafe enum classes

    The following example demonstrates type unsafe enums:

    %include "enumtypeunsafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    SWIG will generate the following simple class:

    public final class Beverage {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = STOUT + 1;
      public final static int PILZ = PILSNER;
    }
    

    26.4.6 Interfaces

    By default SWIG wraps all C++ classes as Java classes. As Java only supports derivation from a single base class, SWIG has to ignore all bases except the first when a C++ class inherits from more than one base class. However, there is a family of SWIG macros that change the default wrapping and allows a C++ class to be wrapped as a Java interface instead of a Java class. These macros provide a way to support some sort of multiple inheritance as there is no limit to the number of interfaces that a Java class can inherit from.

    When a C++ class is wrapped as a Java interface, a Java proxy class is still needed. The swiginterface.i library file provides three macros for marking a C++ class to be wrapped as a Java interface. There is more than one macro in order to provide a choice for choosing the Java interface and Java proxy names.

    Interface Macro Name Description
    %interface(CTYPE) For C++ class CTYPE, proxy class name is unchanged without any suffix added, interface name has SwigInterface added as a suffix.
    %interface_impl(CTYPE) For C++ class CTYPE, proxy class name has SwigImpl added as a suffix, interface name has no added suffix.
    %interface_custom("PROXY", "INTERFACE", CTYPE) For C++ class CTYPE, proxy class name is given by the string PROXY, interface name is given by the string INTERFACE. The PROXY and INTERFACE names can use the string formatting functions used in %rename.

    The table below has a few examples showing the resulting proxy and interface names for a C++ class called Base.

    Example Usage Proxy Class Name Interface Class Name
    %interface(Base) Base BaseSwigInterface
    %interface_impl(Base) BaseSwigImpl Base
    %interface_custom("BaseProxy", "IBase", Base) BaseProxy IBase
    %interface_custom("%sProxy", "IBase", Base) BaseProxy IBase
    %interface_custom("%sProxy", "%sInterface", Base) BaseProxy BaseProxyInterface
    %interface_custom("%sProxy", "%(rstrip:[Proxy])sInterface", Base) BaseProxy BaseInterface

    The 2nd last example shows the names used in the string formatting functions. The input for PROXY that "%s" expands to is the proxy name, that is, Base. The input for INTERFACE that "%s" expands to is the proxy name, that is, BaseProxy.

    The last example shows rstrip and in this case strips the Proxy suffix and then adds on Interface.

    Consider the following C++ code:

    namespace Space {
      struct Base1 {
        virtual void Method1();
      };
      struct Base2 {
        virtual void Method2();
      };
      struct Derived : Base1, Base2 {
      };
      void UseBases(const Base1 &b1, const Base2 &b2);
    }
    

    By default all classes are wrapped and are available in Java, but, Derived has all bases ignored except the first. SWIG generates a warning for the above code:

    example.i:10: Warning 813: Warning for Derived, base Base2 ignored. 
    Multiple inheritance is not supported in Java.
    

    If we decide to wrap the two base classes as interfaces and add the following before SWIG parses the above example code:

    %include <swiginterface.i>
    %interface_impl(Space::Base1);
    %interface_impl(Space::Base2);
    

    then two interface files are generated, Base1.java and Base2.java in addition to proxy class files, Base1SwigImpl.java and Base2SwigImpl.java. The contents of interface file Base1.java for Base1 is shown below:

    public interface Base1 {
      long Base1_GetInterfaceCPtr();
      void Method1();
    }
    

    The proxy class in Base1SwigImpl.java for Base1 is as it would have been if %interface was not used, except the name has changed to Base1SwigImpl and it implements the appropriate base:

    public class Base1SwigImpl implements Base1 {
    ...
      public long Base1_GetInterfaceCPtr() {
        return exampleJNI.Base1SwigImpl_Base1_GetInterfaceCPtr(swigCPtr);
      }
    
      public void Method1() {
        exampleJNI.Base1SwigImpl_Method1(swigCPtr, this);
      }
    ...
    }
    

    In fact any class deriving from Base will now implement the interface instead of deriving from it (or ignoring the base in the case of multiple base classes). Hence the Derived proxy class will now implement both bases:

    public class Derived implements Base1, Base2 {
    ...
      public long Base1_GetInterfaceCPtr() {
        return exampleJNI.Derived_Base1_GetInterfaceCPtr(swigCPtr);
      }
    
      public long Base2_GetInterfaceCPtr() {
        return exampleJNI.Derived_Base2_GetInterfaceCPtr(swigCPtr);
      }
    
      public void Method1() {
        exampleJNI.Derived_Method1(swigCPtr, this);
      }
    
      public void Method2() {
        exampleJNI.Derived_Method2(swigCPtr, this);
      }
    ...
    }
    

    Wherever a class marked as an interface is used, such as the UseBases method in the example, the interface name is used as the type in the Java layer:

      public static void UseBases(Base1 b1, Base2 b2) {
        exampleJNI.UseBases(b1.Base1_GetInterfaceCPtr(), b1, b2.Base2_GetInterfaceCPtr(), b2);
      }
    

    Note that each Java interface has a method added to obtain the correct C++ pointer for passing to the native function - Base1_GetInterfaceCPtr for Base1. This method is similar to the getCPtr method in the proxy classes. In fact, as shown above in the Derived class, the proxy classes implement this generated interface by calling a native method (Derived_Base1_GetInterfaceCPtr) which calls an appropriate C++ cast of the pointer up the inheritance chain.

    The interface macros are implemented using the interface feature and typemaps. For example:

    %define %interface(CTYPE...)
    %feature("interface", name="%sSwigInterface") CTYPE;
    INTERFACE_TYPEMAPS(CTYPE)
    %enddef
    

    The feature accepts one attribute called name, which is the name of the Java interface mentioned earlier. The INTERFACE_TYPEMAPS macro implements the typemaps and can be viewed in the swiginterface.i file and contain the usual Java typemaps for generating code plus the javainterfacecode typemap which is only used when a class is marked with the interface feature. See Java code typemaps for details.

    26.5 Cross language polymorphism using directors

    Proxy classes provide a natural, object-oriented way to wrap C++ classes. as described earlier, each proxy instance has an associated C++ instance, and method calls from Java to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Java. In particular, if a C++ class has been extended in Java (by deriving from the proxy class), these classes will not be visible from C++ code. Virtual method calls from C++ are thus not able to access the lowest implementation in the inheritance chain.

    SWIG can address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Java implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Java and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Java code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions transparently takes care of all the cross-language method routing.

    26.5.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    26.5.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Java proxy classes. The director classes store a pointer to their underlying Java proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in Java via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its Java derived classes were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy JNI glue code that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Java. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Java, the Java API is used to call the method of the underlying Java object (after which the usual virtual method resolution in Java automatically finds the right implementation).

    26.5.3 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from Java types can result in large director methods. For this reason it is recommended that directors are selectively enabled only for specific classes that are likely to be extended in Java and used in C++.

    Although directors make it natural to mix native C++ objects with Java objects (as director objects), one should be aware of the obvious fact that method calls to Java objects from C++ will be much slower than calls to C++ objects. Additionally, compared to classes that do not use directors, the call routing in the director methods adds a small overhead. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Java.

    26.5.4 Simple directors example

    Consider the following SWIG interface file:

    %module(directors="1") example;
    
    %feature("director") DirectorBase;
    
    class DirectorBase {
    public:
      virtual ~DirectorBase() {}
      virtual void upcall_method() {}
    };
    
    void callup(DirectorBase *director) {
      director->upcall_method();
    }
    

    The following DirectorDerived Java class is derived from the Java proxy class DirectorBase and overrides upcall_method(). When C++ code invokes upcall_method(), the SWIG-generated C++ code redirects the call via JNI to the Java DirectorDerived subclass. Naturally, the SWIG generated C++ code and the generated Java intermediary class marshal and convert arguments between C++ and Java when needed.

    class DirectorDerived extends DirectorBase {
      @Override
      public void upcall_method() {
        System.out.println("DirectorDerived.upcall_method() invoked.");
      }
    }
    

    Running the following Java code

    DirectorDerived director = new DirectorDerived();
    example.callup(director);
    

    will result in the following being output:

    DirectorDerived.upcall_method() invoked.
    

    26.5.5 Director threading issues

    Depending on your operating system and version of Java and how you are using threads, you might find the JVM hangs on exit. There are a couple of solutions to try out. The preferred solution requires jdk-1.4 and later and uses AttachCurrentThreadAsDaemon instead of AttachCurrentThread whenever a call into the JVM is required. This can be enabled by defining the SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON macro when compiling the C++ wrapper code. For older JVMs define SWIG_JAVA_NO_DETACH_CURRENT_THREAD instead, to avoid the DetachCurrentThread call but this will result in a memory leak instead. For further details inspect the source code in the java/director.swg library file.

    Macros can be defined on the commandline when compiling your C++ code, or alternatively added to the C++ wrapper file as shown below:

    %insert("runtime") %{
    #define SWIG_JAVA_NO_DETACH_CURRENT_THREAD
    %}
    

    26.5.6 Director performance tuning

    When a new instance of a director (or subclass) is created in Java, the C++ side of the director performs a runtime check per director method to determine if that particular method is overridden in Java or if it should invoke the C++ base implementation directly. Although this makes initialization slightly more expensive, it is generally a good overall tradeoff.

    However, if all director methods are expected to usually be overridden by Java subclasses, then initialization can be made faster by avoiding these checks via the assumeoverride attribute. For example:

    %feature("director", assumeoverride=1) Foo;
    

    The disadvantage is that invocation of director methods from C++ when Java doesn't actually override the method will require an additional call up into Java and back to C++. As such, this option is only useful when overrides are extremely common and instantiation is frequent enough that its performance is critical.

    26.5.7 Java exceptions from directors

    With directors routing method calls to Java, and proxies routing them to C++, the handling of exceptions is an important concern. The default behavior for Java exceptions thrown in a director method overridden in Java is to store the thrown Java exception into a SWIG defined Swig::DirectorException C++ class exception in the C++ layer and then throw this C++ exception.

    Of course, should this exception be thrown, your C++ code must catch it and handle it before returning back to Java. The default generated code does not attempt to handle the C++ exception, but there is a simple way to make this all work by catching the C++ exception and extracting the original Java exception by using %catches for Swig::DirectorException. Consider the example shown earlier with a modification to the upcall_method Java method to throw a Java exception:

    class DirectorDerived extends DirectorBase {
      @Override
      public void upcall_method() {
        System.out.println("DirectorDerived.upcall_method() invoked.");
        throw new RuntimeException("There was a problem!");
      }
    }
    

    Now, by default, the JVM will abort when example.callup(director) is called as the C++ Swig::DirectorException (storing the Java exception) is thrown and not handled by the callup method. Needless to say this is not very user friendly and so the recommendation is to add the following simple %catches directive before SWIG parses the callup function:

    %catches(Swig::DirectorException) callup;
    

    Or target all wrapped methods using:

    %catches(Swig::DirectorException);
    

    This tells SWIG to generate a C++ catch handler using some code from the throws typemap for Swig::DirectorException that SWIG supplies by default, see Exception handling with %catches. This typemap code is written to simply catch the C++ Swig::DirectorException class and immediately return to Java throwing the original Java exception that it has stored. The net result is a stack trace containing the original Java exception including the location that the exception was thrown from.

    DirectorDerived.upcall_method() invoked.
    Exception in thread "main" java.lang.RuntimeException: There was a problem!
        at DirectorDerived.upcall_method(runme.java:4)
        at exampleJNI.SwigDirector_DirectorBase_upcall_method(exampleJNI.java:20)
        at exampleJNI.callup(Native Method)
        at example.callup(example.java:12)
        at runme.main(runme.java:21)
    

    More on the Swig::DirectorException class can be found in the next section which details how to customize the handling of director exceptions.

    26.5.7.1 Customizing director exceptions

    This section is for advanced customization of director exceptions. The recommendation for most users is to use the simple %catches directive described above as it should be sufficient for most users needs.

    The conversion of Java exceptions into C++ exceptions can be customized in two different ways using the director:except feature. In the first approach, a code block is attached to each director method to handle the mapping of Java exceptions into C++ exceptions. The code block is generated just after the call up from the C++ director method into the overloaded method in Java. Its primary function is to check if a Java exception has been thrown and then handle it in C++. The example below converts a java.lang.IndexOutOfBoundsException into a C++ std::out_of_range exception and converts a user's Java MyJavaException into a C++ MyCppException exception. If the Java exception doesn't match either of these, a fallback std::runtime_error C++ exception is thrown.

    %feature("director:except") MyClass::dirmethod(int x) {
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException"))
          throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
        if (Swig::ExceptionMatches(jenv, $error, "$packagepath/MyJavaException"))
          throw MyCppException(Swig::JavaExceptionMessage(jenv, $error).message());
        throw std::runtime_error("Unexpected exception thrown in MyClass::dirmethod");
      }
    }
    
    class MyClass {
    public:
      /** Throws either a std::out_of_range or MyCppException on error */
      virtual void dirmethod(int x);
      virtual ~MyClass();
    };
    

    A few special variables are expanded within the director:except feature.

    • The special variable $error is expanded into a unique variable name (swigerror) and should be used for the assignment of the jthrowable exception that occurred.
    • The special variable $packagepath is replaced by the outer package provided for SWIG generation by the -package option.
    • The special variable $directorthrowshandlers is not shown above, but is replaced by applicable "directorthrows" typemap contents (covered later in this section).
    • The special variable $null is not shown above, but is replaced by a suitable default constructed object for returning from the director method (or nothing if the director method has a void return).

    Utility functions/classes in director.swg are provided to aid the exception conversion as follows:

    namespace Swig {
    
      // Helper method to determine if a Java throwable matches a particular Java class type
      // Note side effect of clearing any pending exceptions
      bool ExceptionMatches(JNIEnv *jenv, jthrowable throwable, const char *classname);
    
      // Helper class to extract the exception message from a Java throwable
      class JavaExceptionMessage {
      public:
        JavaExceptionMessage(JNIEnv *jenv, jthrowable throwable);
    
        // Return a C string of the exception message in the jthrowable passed in the constructor
        // If no message is available, null_string is return instead
        const char *message(const char *null_string = 
                            "Could not get exception message in JavaExceptionMessage") const;
      };
    
      // C++ Exception class for handling Java exceptions thrown during a director method Java upcall
      class DirectorException : public std::exception {
      public:
    
        // Construct exception from a Java throwable
        DirectorException(JNIEnv *jenv, jthrowable throwable);
    
        // More general constructor for handling as a java.lang.RuntimeException
        DirectorException(const char *msg);
    
        // Return exception message extracted from the Java throwable
        const char *what() const throw();
    
        // Reconstruct and raise/throw the Java Exception that caused the DirectorException
        // Note that any error in the JNI exception handling results in a Java RuntimeException
        void throwException(JNIEnv *jenv) const;
    
        // Create and throw the DirectorException
        static void raise(JNIEnv *jenv, jthrowable throwable) {
          throw DirectorException(jenv, throwable);
        }
      };
    
    }
    

    The utility function Swig::ExceptionMatches and class Swig::JavaExceptionMessage are provided to simplify writing code for wrappers that use the director:except feature. The function Swig::ExceptionMatches matches the type of the jthrowable thrown against a fully qualified JNI style class name, such as "java/lang/IOError". If the throwable class is the same type, or derives from the given type, Swig::ExceptionMatches will return true. Care must be taken to provide the correct fully qualified name, since for wrapped exceptions the generated proxy class will have an additional package qualification, depending on the '-package' argument and use of the nspace feature. The utility class Swig::JavaExceptionMessage is a holder providing access to the message from the thrown Java exception. The message() method returns the exception message as a const char *, which is only valid during the lifetime of the holder. Any code using this message needs to copy it, for example into a std::string or a newly constructed C++ exception.

    Using the first approach above to write handlers for a large number of methods will require repetitive duplication of the director:except feature code for each director method. To mitigate this, a second approach is provided via typemaps in a fashion analogous to the "throws" typemap. The "throws" typemap provides a way to map all the C++ exceptions listed in a method's defined exceptions (either from a C++ exception specification or a %catches feature) into Java exceptions. The "directorthrows" typemap provides the inverse mapping and should contain code to convert a suitably matching Java exception into a C++ exception. Only use this typemap if you wish to write custom conversions of Java exceptions into C++ exceptions and apply them to many different methods. The default handling which uses the Swig::DirectorException class should otherwise meet your needs.

    The example below converts a Java java.lang.IndexOutOfBoundsException exception to the typemap's type, that is a std::out_of_range C++ exception:

    %typemap(directorthrows) std::out_of_range %{
      if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    

    The "directorthrows" typemap is then used in conjunction with the director:except feature if the $directorthrowshandlers special variable is used in the code block. Consider the following, which also happens to be the default:

    %feature("director:except") %{
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        $directorthrowshandlers
        Swig::DirectorException::raise(jenv, $error);
      }
    %}
    

    where Swig::DirectorException::raise is the helper method to throw a C++ Swig::DirectorException, see above. The code generated from the director:except feature has the $directorthrowshandlers special variable replaced with the code in the relevant "directorthrows" typemaps, for each and every exception defined for the method. The relevant exceptions can be defined either with a C++ exception specification or %catches as described for the "throws" typemap.

    Let's try and put all this together by considering the following director method:

    struct X {
      virtual void doSomething(int index) throw (std::out_of_range);
      ...
    };
    
    OR
    
    %catches(std::out_of_range) X::doSomething;
    struct X {
      virtual void doSomething(int index);
      ...
    };
    

    When combined with the default director:except feature and the "directorthrows" typemap above, the resulting code generated in the director method after calling up to Java will be:

    jthrowable swigerror = jenv->ExceptionOccurred();
    if (swigerror) {
      if (Swig::ExceptionMatches(jenv, swigerror, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, swigerror).message());
      }
      Swig::DirectorException::raise(jenv, swigerror);
    }
    

    Note: Beware of using exception specifications as the SWIG director methods will be generated with the same exception specifications and if the director method throws an exception that is not specified in the exception specifications list it is likely to terminate your program. See the C++ standard for more details. Using the %catches feature instead to define the handled exceptions does not suffer this potential fate.

    Because the default code generation maps any unhandled Java exceptions to Swig::DirectorException, any director methods that have exception specifications may cause program termination as this exception class won't be in the exception specifications list. You can avoid throwing Swig::DirectorException by changing the default handling for all methods by adding a director:except feature without any method name. For example, you can just ignore them:

    %feature("director:except") %{
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        $directorthrowshandlers
        jenv->ExceptionClear();
        return $null; // exception is ignored
      }
    %}
    

    Alternatively an exception compatible with the existing director method exception specifications can be thrown. Assuming that all methods allow std::runtime_error to be thrown, the return $null line above could be changed to:

      throw std::runtime_error(Swig::JavaExceptionMessage(jenv, $error).message());
    

    In more complex situations, a separate director:except feature may need to be attached to specific methods by providing a method name to the director:except feature.

    This is all no doubt quite hard to follow without seeing a full example and some code. Below is a complete example demonstrating the use of most of the exception customizations one can use, that is, "directorthrows" and "throws" typemaps, %exception and %catches. See the Exception handling with %exception and %javaexception section for more on converting C++ exceptions to Java exceptions. The example also has a user defined C++ exception class called MyNS::MyException and this is wrapped as a Java exception. The director class being wrapped is MyClass and the director method is called MyClass::dirmethod. A number of std::cout calls have been added to help understand code flow. You can copy the code below into an interface file and run SWIG on it and examine the generated code.

    %module(directors="1") example
    
    %{
      #include <stdexcept>
      #include <iostream>
    %}
    
    // Generic catch handler for all wrapped methods
    %exception %{
      try {
        $action
      } catch (const std::exception &e) {
        std::cout << "Generic std::exception catch handler" << std::endl;
        jclass clazz = jenv->FindClass("java/lang/RuntimeException");
        jenv->ThrowNew(clazz, e.what()); 
        return $null;
      }
    %}
    
    // Expose C++ exception as a Java Exception by changing the Java base class and providing a getMessage()
    %typemap(javabase) MyNS::MyException "java.lang.RuntimeException";
    %rename(getMessage) MyNS::MyException::whatsup;
    
    %inline %{
    namespace MyNS {
      class MyException {
        std::string msg;
      public:
        MyException(const char *msg) : msg(msg) {}
        const char * whatsup() const { return msg.c_str(); }
      };
    }
    %}
    
    %typemap(directorthrows) MyNS::MyException %{
      if (Swig::ExceptionMatches(jenv, $error, "$packagepath/MyException")) {
        std::cout << "$1_type exception matched (directorthrows typemap)" << std::endl;
        throw $1_type(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    
    %typemap(throws) MyNS::MyException %{
      std::cout << "$1_type caught (throws typemap)" << std::endl;
      jclass excep = jenv->FindClass("MyException");
      if (excep) {
        std::cout << "$1_type class found (throws typemap)" << std::endl;
        jenv->ThrowNew(excep, $1.whatsup());
      }
      return $null;
    %}
    
    // These are the exceptions that the director method MyClass::dirmethod will have catch handlers for.
    // Note that this is also a virtual method / director method and the C++ exceptions listed can be
    // thrown after converting them from Java exceptions.
    %catches(MyNS::MyException, Swig::DirectorException) MyClass::dirmethod;
    
    // These are the exceptions that call_dirmethod C++ wrapper will have catch handlers for.
    // Note that this is not a virtual method, hence not a director method.
    %catches(MyNS::MyException, Swig::DirectorException) call_dirmethod;
    
    %feature("director") MyClass;
    
    %feature("director:except") MyClass::dirmethod(int x) {
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        std::cout << "Upcall finished, an exception was thrown in Java" << std::endl;
        $directorthrowshandlers
        std::cout << "Upcall finished, no exception conversion, throwing DirectorException" << std::endl;
        Swig::DirectorException::raise(jenv, $error);
      }
    }
    
    %inline %{
    class MyClass {
    public:
      /** Throws either a std::out_of_range or MyException on error */
      virtual void dirmethod(int x) {
        if (x <= 0)
          throw std::out_of_range("MyClass::dirmethod index is out of range");
        else if (x == 1)
          throw MyNS::MyException("MyClass::dirmethod some problem!");
      }
      virtual ~MyClass() {}
      static void call_dirmethod(MyClass& c, int x) {
        return c.dirmethod(x);
      }
    };
    %}
    

    The generated code for the call_dirmethod wrapper contains the various exception handlers. The outer exception handler is from the %exception directive and the others are from the "throws" typemaps.

    SWIGEXPORT void JNICALL Java_exampleJNI_MyClass_1call_1dirmethod(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2) {
      ...
      try {
        try {
          MyClass::call_dirmethod(*arg1,arg2);
        } catch(MyNS::MyException &_e) {
          std::cout << "MyNS::MyException caught (throws typemap)" << std::endl;
          jclass excep = jenv->FindClass("MyException");
          if (excep) {
            std::cout << "MyNS::MyException class found (throws typemap)" << std::endl;
            jenv->ThrowNew(excep, (&_e)->whatsup());
          }
          return ;
          
        } catch(Swig::DirectorException &_e) {
          (&_e)->throwException(jenv);
          return ; 
        }
      } catch (const std::exception &e) {
        std::cout << "Generic std::exception catch handler" << std::endl;
        jclass clazz = jenv->FindClass("java/lang/RuntimeException");
        jenv->ThrowNew(clazz, e.what()); 
        return ;
      }
    

    The director method calling up to Java contains the exception handling code from the "directorthrows" typemaps and director:except feature.

    void SwigDirector_MyClass::dirmethod(int x) {
          ... [call up to Java using CallStaticVoidMethod]
          jthrowable swigerror = jenv->ExceptionOccurred();
          if (swigerror) {
            std::cout << "Upcall finished, an exception was thrown in Java" << std::endl;
            
            if (Swig::ExceptionMatches(jenv, swigerror, "MyException")) {
              std::cout << "MyNS::MyException exception matched (directorthrows typemap)" << std::endl;
              throw MyNS::MyException(Swig::JavaExceptionMessage(jenv, swigerror).message());
            }
            
            std::cout << "Upcall finished, no exception conversion, throwing DirectorException" << std::endl;
            Swig::DirectorException::raise(jenv, swigerror);
          }
    

    Let's use the following Java class to override the director method.

    class DerivedClass extends MyClass {
      @Override
      public void dirmethod(int x) {
        if (x < 0)
          throw new IndexOutOfBoundsException("Index is negative");
        else if (x == 0)
          throw new MyException("MyException: bad dirmethod");
      }
    }
    public class runme {
      public static void main(String argv[]) {
        System.loadLibrary("example");
        ... code snippets shown below ...
      }
    }
    

    Consider the output using the Java code in the four slightly different scenarios below.

    1. Non-director C++ class is used, thus, no upcall to a Java director method is made. A std::out_of_range exception is thrown, which is derived from std::exception, and hence caught by the generic exception handler in the call_dirmethod wrapper. The Java code snippet and resulting output is:

    MyClass.call_dirmethod(new MyClass(), 0);
    
    Generic std::exception catch handler
    Exception in thread "main" java.lang.RuntimeException: MyClass::dirmethod index is out of range
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:14)
    

    2. Non-director C++ class again but this time the MyNS::MyException class is thrown and caught:

    MyClass.call_dirmethod(new MyClass(), 1);
    
    MyNS::MyException caught (throws typemap)
    MyNS::MyException class found (throws typemap)
    Exception in thread "main" MyException: MyClass::dirmethod some problem!
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:15)
    

    3. The DerivedClass director class is used so the upcall to Java occurs, but it throws a Java MyException, which gets converted into a C++ MyNS::MyException, then caught and converted back into a Java MyException:

    MyClass.call_dirmethod(new DerivedClass(), 0);
    
    Upcall finished, an exception was thrown in Java
    MyNS::MyException exception matched (directorthrows typemap)
    MyNS::MyException caught (throws typemap)
    MyNS::MyException class found (throws typemap)
    Exception in thread "main" MyException: MyException: bad dirmethod
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:16)
    

    4. The director class is used again, but this time the director method throws a Java IndexOutOfBoundsException exception which is converted into a C++ Swig::DirectorException, thrown and caught again. This time the original Java exception is extracted from the Swig::DirectorException and rethrown. Note that this approach keeps the stack trace information of the original exception, so it has the exact location of where the IndexOutOfBoundsException exception was thrown. This is arguably an improvement over the approach above that converts from a Java excepton to C++ exception and then back to a new Java exception, losing the location of the original exception.

    MyClass.call_dirmethod(new DerivedClass(), -1);
    
    Upcall finished, an exception was thrown in Java
    Upcall finished, no exception conversion, throwing DirectorException
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index is negative
            at DerivedClass.dirmethod(runme.java:5)
            at exampleJNI.SwigDirector_MyClass_dirmethod(exampleJNI.java:23)
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:17)
    

    26.6 Accessing protected members

    When using directors, the protected virtual methods are also wrapped. These methods are wrapped with a protected Java proxy method, so the only way that Java code can access these is from within a Java class derived from the director class.

    Members which are protected and non-virtual can also be accessed when using the 'allprotected' mode. The allprotected mode requires directors and is turned on by setting the allprotected option in addition to the directors option in the %module directive, like this:

    %module(directors="1", allprotected="1") modulename
    

    Protected member variables and methods (both static and non-static) will then be wrapped with protected access in the Java proxy class.

    Note: Neither the directors option nor the allprotected mode support types defined with protected scope. This includes any enums or typedefs declared in the protected section of the C++ class.

    The following simple example is a class with numerous protected members, including the constructor and destructor:

    %module(directors="1", allprotected="1") example
    
    %feature("director") ProtectedBase;
    
    // Ignore use of unsupported types (those defined in the protected section)
    %ignore ProtectedBase::typedefs;
    
    %inline %{
    
    class ProtectedBase {
    protected:
      ProtectedBase() {}
      virtual ~ProtectedBase() {}
      virtual void virtualMethod() const {}
      void nonStaticMethod(double d) const {}
      static void staticMethod(int i) {}
      int instanceMemberVariable;
      static int staticMemberVariable;
    
      // unsupported: types defined with protected access and the methods/variables which use them
      typedef int IntegerType;
      IntegerType typedefs(IntegerType it) { return it; }
    };
    int ProtectedBase::staticMemberVariable = 10;
    
    %}
    
    

    Note that the IntegerType has protected scope and the members which use this type must be ignored as they cannot be wrapped.

    The proxy methods are protected, so the only way the protected members can be accessed is within a class that derives from the director class, such as the following:

    class MyProtectedBase extends ProtectedBase
    {
      public MyProtectedBase() {
      }
    
      public void accessProtected() {
        virtualMethod();
        nonStaticMethod(1.2);
        staticMethod(99);
    
        setInstanceMemberVariable(5);
        int i = getInstanceMemberVariable();
    
        setStaticMemberVariable(10);
        i = getStaticMemberVariable();
      }
    }
    

    26.7 Common customization features

    An earlier section presented the absolute basics of C/C++ wrapping. If you do nothing but feed SWIG a header file, you will get an interface that mimics the behavior described. However, sometimes this isn't enough to produce a nice module. Certain types of functionality might be missing or the interface to certain functions might be awkward. This section describes some common SWIG features that are used to improve the interface to existing C/C++ code.

    26.7.1 C/C++ helper functions

    Sometimes when you create a module, it is missing certain bits of functionality. For example, if you had a function like this

    typedef struct Image {...};
    void set_transform(Image *im, double m[4][4]);
    

    it would be accessible from Java, but there may be no easy way to call it. The problem here is that a type wrapper class is generated for the two dimensional array parameter so there is no easy way to construct and manipulate a suitable double [4][4] value. To fix this, you can write some extra C helper functions. Just use the %inline directive. For example:

    %inline %{
    /* Note: double[4][4] is equivalent to a pointer to an array double (*)[4] */
    double (*new_mat44())[4] {
      return (double (*)[4]) malloc(16*sizeof(double));
    }
    void free_mat44(double (*x)[4]) {
      free(x);
    }
    void mat44_set(double x[4][4], int i, int j, double v) {
      x[i][j] = v;
    }
    double mat44_get(double x[4][4], int i, int j) {
      return x[i][j];
    }
    %}
    

    From Java, you could then write code like this:

    Image im = new Image();
    SWIGTYPE_p_a_4__double a = example.new_mat44();
    example.mat44_set(a, 0, 0, 1.0);
    example.mat44_set(a, 1, 1, 1.0);
    example.mat44_set(a, 2, 2, 1.0);
    ...
    example.set_transform(im, a);
    example.free_mat44(a);
    

    Admittedly, this is not the most elegant looking approach. However, it works and it wasn't too hard to implement. It is possible to improve on this using Java code, typemaps, and other customization features as covered in later sections, but sometimes helper functions are a quick and easy solution to difficult cases.

    26.7.2 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods or constructors. Here is a simple example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    struct Vector {
      double x, y, z;
    };
    
    %extend Vector {
      char *toString() {
        static char tmp[1024];
        sprintf(tmp, "Vector(%g, %g, %g)", $self->x, $self->y, $self->z);
        return tmp;
      }
      Vector(double x, double y, double z) {
        Vector *v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
    };
    

    Now, in Java

    Vector v = new Vector(2, 3, 4);
    System.out.println(v);
    

    will display

    Vector(2, 3, 4)
    

    %extend works with both C and C++ code. It does not modify the underlying object in any way---the extensions only show up in the Java interface.

    26.7.3 Class extension with %proxycode

    The previous section described how to extend a wrapped class with C or C++ code. This section describes how to extend a wrapped class with Java code instead of C/C++ code. The %proxycode directive is used and is just a macro for %insert("proxycode"). The Code insertion block section describes the %insert directive. The section of code for insertion is "proxycode", that is, the Java proxy class. This directive must hence only be used within the scope of a class, otherwise it is silently ignored. There are two common ways to get the scope correct.

    The first is to use %proxycode inside a class that SWIG parses, for example a toString() method can be added to a C++ class using pure Java code. A C++ header file can mix C++ and Java code inside the C++ class as follows:

    // flag.h header file
    class Flag {
      bool flag;
    public:
      Flag(bool flag) : flag(flag) {}
      bool FetchFlag() { return flag; }
    #if defined(SWIG)
    %proxycode %{
      public String toString() {
        boolean flag = FetchFlag();
        return Boolean.toString(flag);
      }
    %}
    #endif
    };
    

    and wrapped using:

    %{
    #include "flag.h"
    %}
    %include "flag.h"
    

    The second is to use %proxycode within %extend as everything within a %extend block is effectively within the scope of the class, for example:

    // flag.h header file
    class Flag {
      bool flag;
    public:
      Flag(bool flag) : flag(flag) {}
      bool FetchFlag() { return flag; }
    };
    

    and wrapped using:

    %{
    #include "flag.h"
    %}
    %include "flag.h"
    
    %extend Flag {
    #if defined(SWIG)
    %proxycode %{
      public String toString() {
        boolean flag = FetchFlag();
        return Boolean.toString(flag);
      }
    %}
    #endif
    }
    

    There is some very limited support of typemaps within a %proxycode block. A useful trick is to obtain the Java type for a given C/C++ type using the $typemap special macro. The following C++ template demonstrates this:

    %inline %{
    template<typename T> struct Value {
      T value;
      Value(const T& val) : value(val) {}
    };
    %}
    
    %extend Value {
    %proxycode %{
      public String toString() {
        // Note template type expansion is supported, so T is expanded to 'unsigned int' in this example
        // and $typemap(jstype, unsigned int) in turn is expanded to 'long'
        $typemap(jstype, T) val = getValue();
        return "$javaclassname value: " + val + " Java type: $typemap(jstype, T) JNI type: $typemap(jni, T)";
      }
    %}
    }
    %template(ValueUnsignedInt) Value<unsigned int>;
    

    The generated Java contains the expanded special variable and macro resulting in Java proxy code:

    public class ValueUnsignedInt {
      ...
      public String toString() {
        long val = getValue();
        return "ValueUnsignedInt value: " + val + " Java type: long JNI type: jlong";
      }
    
    }
    

    26.7.4 Exception handling with %exception and %javaexception

    If a C or C++ function throws an error, you may want to convert that error into a Java exception. To do this, you can use the %exception directive. The %exception directive simply lets you rewrite part of the generated wrapper code to include an error check. It is detailed in full in the Exception handling with %exception section.

    In C, a function often indicates an error by returning a status code (a negative number or a NULL pointer perhaps). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (!result) {
        jclass clazz = (*jenv)->FindClass(jenv, "java/lang/OutOfMemoryError");
        (*jenv)->ThrowNew(jenv, clazz, "Not enough memory");
        return $null;
      }
    }
    void *malloc(size_t nbytes);
    

    In Java,

    SWIGTYPE_p_void a = example.malloc(2000000000);
    

    will produce a familiar looking Java exception:

    Exception in thread "main" java.lang.OutOfMemoryError: Not enough memory
            at exampleJNI.malloc(Native Method)
            at example.malloc(example.java:16)
            at runme.main(runme.java:112)
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception malloc {
      $action
      if (err_occurred()) {
        jclass clazz = (*jenv)->FindClass(jenv, "java/lang/OutOfMemoryError");
        (*jenv)->ThrowNew(jenv, clazz, "Not enough memory");
        return $null;
      }
    }
    void *malloc(size_t nbytes);
    

    If no declaration name is given to %exception, it is applied to all wrapper functions. The $action is a SWIG special variable and is replaced by the C/C++ function call being wrapped. The return $null; handles all native method return types, namely those that have a void return and those that do not. This is useful for typemaps that will be used in native method returning all return types. See the section on Java special variables for further explanation.

    C++ exceptions are also easy to handle. We can catch the C++ exception and rethrow it as a Java exception like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        jclass clazz = jenv->FindClass("java/lang/Exception");
        jenv->ThrowNew(clazz, "Range error");
        return $null;
      }
    }
    
    class FooClass {
      public:
        FooClass *getitem(int index);      // Might throw std::out_of_range exception
        ...
    };
    

    In the example above, java.lang.Exception is a checked exception class and so ought to be declared in the throws clause of getitem. Classes can be specified for adding to the throws clause using %javaexception(classes) instead of %exception, where classes is a string containing one or more comma separated Java classes. The %clearjavaexception feature is the equivalent to %clearexception and clears previously declared exception handlers. The %nojavaexception feature is the equivalent to %noexception and disables the exception handler. See Clearing features for the difference on disabling and clearing features.

    %javaexception("java.lang.Exception") getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        jclass clazz = jenv->FindClass("java/lang/Exception");
        jenv->ThrowNew(clazz, "Range error");
        return $null;
      }
    }
    
    class FooClass {
    public:
      FooClass *getitem(int index);      // Might throw std::out_of_range exception
      ...
    };
    

    The generated proxy method now generates a throws clause containing java.lang.Exception:

    public class FooClass {
      ...
      public FooClass getitem(int index) throws java.lang.Exception { ... }
      ...
    }
    

    The examples above first use the C JNI calling syntax then the C++ JNI calling syntax. The C++ calling syntax will not compile as C and also vice versa. It is however possible to write JNI calls which will compile under both C and C++ and is covered in the Typemaps for both C and C++ compilation section.

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter. The typemap example Handling C++ exception specifications as Java exceptions provides further exception handling capabilities.

    26.7.5 Method access with %javamethodmodifiers

    A Java feature called %javamethodmodifiers can be used to change the method modifiers from the default public. It applies to both module class methods and proxy class methods. For example:

    %javamethodmodifiers protect_me() "protected";
    void protect_me();
    

    Will produce the method in the module class with protected access.

    protected static void protect_me() {
      exampleJNI.protect_me();
    }
    

    26.8 Tips and techniques

    Although SWIG is largely automatic, there are certain types of wrapping problems that require additional user input. Examples include dealing with output parameters, strings and arrays. This chapter discusses the common techniques for solving these problems.

    26.8.1 Input and output parameters using primitive pointers and references

    A common problem in some C programs is handling parameters passed as simple pointers or references. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x-*y;
    }
    

    The typemaps.i library file will help in these situations. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Java, this allows you to pass simple values. For example:

    int result = example.sub(7, 4);
    System.out.println("7 - 4 = " + result);
    int[] sum = {0};
    example.add(3, 4, sum);
    System.out.println("3 + 4 = " + sum[0]);
    

    Which will display:

    7 - 4 = 3
    3 + 4 = 7
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter will return the result in the first element of the integer array.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Java, the input parameter is the first element in a 1 element array and is replaced by the output of the function. For example:

    int[] neg = {3};
    example.negate(neg);
    System.out.println("Negative of 3 = " + neg[0]);
    

    And no prizes for guessing the output:

    Negative of 3 = -3
    

    These typemaps can also be applied to C++ references. The above examples would work the same if they had been defined using references instead of pointers. For example, the Java code to use the negate function would be the same if it were defined either as it is above:

    void negate(int *INOUT);
    

    or using a reference:

    void negate(int &INOUT);
    

    Note: Since most Java primitive types are immutable and are passed by value, it is not possible to perform in-place modification of a type passed as a parameter.

    Be aware that the primary purpose of the typemaps.i file is to support primitive datatypes. Writing a function like this

    void foo(Bar *OUTPUT);
    

    will not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    26.8.2 Simple pointers

    If you must work with simple pointers such as int * or double * another approach to using typemaps.i is to use the cpointer.i pointer library file. For example:

    %module example
    %include "cpointer.i"
    
    %inline %{
    extern void add(int x, int y, int *result);
    %}
    
    %pointer_functions(int, intp);
    

    The %pointer_functions(type, name) macro generates five helper functions that can be used to create, destroy, copy, assign, and dereference a pointer. In this case, the functions are as follows:

    int  *new_intp();
    int  *copy_intp(int *x);
    void  delete_intp(int *x);
    void  intp_assign(int *x, int value);
    int   intp_value(int *x);
    

    In Java, you would use the functions like this:

    SWIGTYPE_p_int intPtr = example.new_intp();
    example.add(3, 4, intPtr);
    int result = example.intp_value(intPtr);
    System.out.println("3 + 4 = " + result);
    

    If you replace %pointer_functions(int, intp) by %pointer_class(int, intp), the interface is more class-like.

    intp intPtr = new intp();
    example.add(3, 4, intPtr.cast());
    int result = intPtr.value();
    System.out.println("3 + 4 = " + result);
    

    See the SWIG Library chapter for further details.

    26.8.3 Wrapping C arrays with Java arrays

    SWIG can wrap arrays in a more natural Java manner than the default by using the arrays_java.i library file. Let's consider an example:

    %include "arrays_java.i";
    int array[4];
    void populate(int x[]) {
      int i;
      for (i=0; i<4; i++)
        x[i] = 100 + i;
    }
    

    These one dimensional arrays can then be used as if they were Java arrays:

    int[] array = new int[4];
    example.populate(array);
    
    System.out.print("array: ");
    for (int i=0; i<array.length; i++)
      System.out.print(array[i] + " ");
    
    example.setArray(array);
    
    int[] global_array = example.getArray();
    
    System.out.print("\nglobal_array: ");
    for (int i=0; i<array.length; i++)
      System.out.print(global_array[i] + " ");
    

    Java arrays are always passed by reference, so any changes a function makes to the array will be seen by the calling function. Here is the output after running this code:

    array: 100 101 102 103
    global_array: 100 101 102 103
    

    Note that for assigning array variables the length of the C variable is used, so it is possible to use a Java array that is bigger than the C code will cope with. Only the number of elements in the C array will be used. However, if the Java array is not large enough then you are likely to get a segmentation fault or access violation, just like you would in C. When arrays are used in functions like populate, the size of the C array passed to the function is determined by the size of the Java array.

    Please be aware that the typemaps in this library are not efficient as all the elements are copied from the Java array to a C array whenever the array is passed to and from JNI code. There is an alternative approach using the SWIG array library and this is covered in the next section.

    26.8.4 Unbounded C Arrays

    Sometimes a C function expects an array to be passed as a pointer. For example,

    int sumitems(int *first, int nitems) {
      int i, sum = 0;
      for (i = 0; i < nitems; i++) {
        sum += first[i];
      }
      return sum;
    }
    

    One of the ways to wrap this is to apply the Java array typemaps that come in the arrays_java.i library file:

    %include "arrays_java.i"
    %apply int[] {int *};
    

    The ANY size will ensure the typemap is applied to arrays of all sizes. You could narrow the typemap matching rules by specifying a particular array size. Now you can use a pure Java array and pass it to the C code:

    int[] array = new int[10000000];          // Array of 10-million integers
    for (int i=0; i<array.length; i++) {      // Set some values
      array[i] = i;
    }
    int sum = example.sumitems(array, 10000);
    System.out.println("Sum = " + sum);
    

    and the sum would be displayed:

    Sum = 49995000
    

    This approach is probably the most natural way to use arrays. However, it suffers from performance problems when using large arrays as a lot of copying of the elements occurs in transferring the array from the Java world to the C++ world. An alternative approach to using Java arrays for C arrays is to use an alternative SWIG library file carrays.i. This approach can be more efficient for large arrays as the array is accessed one element at a time. For example:

    %include "carrays.i"
    %array_functions(int, intArray);
    

    The %array_functions(type, name) macro generates four helper functions that can be used to create and destroy arrays and operate on elements. In this case, the functions are as follows:

    int *new_intArray(int nelements);
    void delete_intArray(int *x);
    int intArray_getitem(int *x, int index);
    void intArray_setitem(int *x, int index, int value);
    

    In Java, you would use the functions like this:

    SWIGTYPE_p_int array = example.new_intArray(10000000);  // Array of 10-million integers
    for (int i=0; i<10000; i++) {                           // Set some values
      example.intArray_setitem(array, i, i);
    }
    int sum = example.sumitems(array, 10000);
    System.out.println("Sum = " + sum);
    

    If you replace %array_functions(int, intp) by %array_class(int, intp), the interface is more class-like and a couple more helper functions are available for casting between the array and the type wrapper class.

    %include "carrays.i"
    %array_class(int, intArray);
    

    The %array_class(type, name) macro creates wrappers for an unbounded array object that can be passed around as a simple pointer like int * or double *. For instance, you will be able to do this in Java:

    intArray array = new intArray(10000000);  // Array of 10-million integers
    for (int i=0; i<10000; i++) {             // Set some values
      array.setitem(i, i);
    }
    int sum = example.sumitems(array.cast(), 10000);
    System.out.println("Sum = " + sum);
    

    The array "object" created by %array_class() does not encapsulate pointers inside a special array object. In fact, there is no bounds checking or safety of any kind (just like in C). Because of this, the arrays created by this library are extremely low-level indeed. You can't iterate over them nor can you even query their length. In fact, any valid memory address can be accessed if you want (negative indices, indices beyond the end of the array, etc.). Needless to say, this approach is not going to suit all applications. On the other hand, this low-level approach is extremely efficient and well suited for applications in which you need to create buffers, package binary data, etc.

    26.8.5 Binary data vs Strings

    By default SWIG handles char * as a string but there is a handy multi-argument typemap available as mentioned in Passing binary data. The following simple example demonstrates using a byte array instead of passing the default string type and length to the wrapped function.

    %apply (char *STRING, size_t LENGTH) { (const char data[], size_t len) }
    %inline %{
    void binaryChar1(const char data[], size_t len) {
      printf("len: %d data: ", len);
      for (size_t i=0; i<len; ++i)
        printf("%x ", data[i]);
      printf("\n");
    }
    %}
    

    Calling from Java requires just the byte array to be passed in as the multi-argument typemap being applied reduces the number of arguments in the target language to one, from the original two:

    byte[] data = "hi\0jk".getBytes();
    example.binaryChar1(data);     
    

    resulting in the output

    $ java runme
    len: 5 data: 68 69 0 6a 6b
    

    26.8.6 Overriding new and delete to allocate from Java heap

    Unlike some languages supported by SWIG, Java has a true garbage collection subsystem. Other languages will free SWIG wrapped objects when their reference count reaches zero. Java only schedules these objects for finalization, which may not occur for some time. Because SWIG objects are allocated on the C heap, Java users may find the JVM memory use quickly exceeds the assigned limits, as memory fills with unfinalized proxy objects. Forcing garbage collection is clearly an undesirable solution.

    An elegant fix for C++ users is to override new and delete using the following code (here shown included in a SWIG interface file)

    /* File: java_heap.i */
    %module test
    %{
    #include <stdexcept>
    #include "jni.h"
    
    /**
     *  A stash area embedded in each allocation to hold java handles
     */
    struct Jalloc {
      jbyteArray jba;
      jobject ref;
    };
    
    static JavaVM *cached_jvm = 0;
    
    JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
      cached_jvm = jvm;
      return JNI_VERSION_1_2;
    }
    
    static JNIEnv * JNU_GetEnv() {
      JNIEnv *env;
      jint rc = cached_jvm->GetEnv((void **)&env, JNI_VERSION_1_2);
      if (rc == JNI_EDETACHED)
        throw std::runtime_error("current thread not attached");
      if (rc == JNI_EVERSION)
        throw std::runtime_error("jni version not supported");
      return env;
    }
    
    void * operator new(size_t t) {
      if (cached_jvm != 0) {
        JNIEnv *env = JNU_GetEnv();
        jbyteArray jba = env->NewByteArray((int) t + sizeof(Jalloc));
        if (env->ExceptionOccurred())
          throw bad_alloc();
        void *jbuffer = static_cast<void *>(env->GetByteArrayElements(jba, 0));
        if (env->ExceptionOccurred())
          throw bad_alloc();
        Jalloc *pJalloc = static_cast<Jalloc *>(jbuffer);
        pJalloc->jba = jba;
        /* Assign a global reference so byte array will persist until delete'ed */
        pJalloc->ref = env->NewGlobalRef(jba);
        if (env->ExceptionOccurred())
          throw bad_alloc();
        return static_cast<void *>(static_cast<char *>(jbuffer) + sizeof(Jalloc));
      }
      else { /* JNI_OnLoad not called, use malloc and mark as special */
        Jalloc *pJalloc = static_cast<Jalloc *>(malloc((int) t + sizeof(Jalloc)));
        if (!pJalloc)
          throw bad_alloc();
        pJalloc->ref = 0;
        return static_cast<void *>(
          static_cast<char *>(static_cast<void *>(pJalloc)) + sizeof(Jalloc));
      }
    }
    
    void operator delete(void *v) {
      if (v != 0) {
        void *buffer = static_cast<void *>( static_cast<char *>(v) - sizeof(Jalloc));
        Jalloc *pJalloc = static_cast<Jalloc *>(buffer);
        if (pJalloc->ref) {
          JNIEnv *env = JNU_GetEnv();
          env->DeleteGlobalRef(pJalloc->ref);
          env->ReleaseByteArrayElements(pJalloc->jba, static_cast<jbyte *>(buffer), 0);
        }
        else {
          free(buffer);
        }
      }
    }
    %}
    ...
    

    This code caches the Java environment during initialization, and when new is called, a Java ByteArray is allocated to provide the SWIG objects with space in the Java heap. This has the combined effect of re-asserting the Java virtual machine's limit on memory allocation, and puts additional pressure on the garbage collection system to run more frequently. This code is made slightly more complicated because allowances must be made if new is called before the JNI_OnLoad is executed. This can happen during static class initialization, for example.

    Unfortunately, because most Java implementations call malloc and free, this solution will not work for C wrapped structures. However, you are free to make functions that allocate and free memory from the Java heap using this model and use these functions in place of malloc and free in your own code.

    26.9 Java typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. You are advised to be familiar with the material in the "Typemaps" chapter. While not absolutely essential knowledge, this section assumes some familiarity with the Java Native Interface (JNI). JNI documentation can be consulted either online at the Java web site or from a good JNI book. The following two books are recommended:

    • Title: 'Essential JNI: Java Native Interface.' Author: Rob Gordon. Publisher: Prentice Hall. ISBN: 0-13-679895-0.
    • Title: 'The Java Native Interface: Programmer's Guide and Specification.' Author: Sheng Liang. Publisher: Addison-Wesley. ISBN: 0-201-32577-2. Also available online at the Sun Developer Network.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the generated code.

    26.9.1 Default primitive type mappings

    The following table lists the default type mapping from Java to C/C++.

    C/C++ type Java type JNI type
    bool
    const bool &
    boolean jboolean
    char
    const char &
    char jchar
    signed char
    const signed char &
    byte jbyte
    unsigned char
    const unsigned char &
    short jshort
    short
    const short &
    short jshort
    unsigned short
    const unsigned short &
    int jint
    int
    const int &
    int jint
    unsigned int
    const unsigned int &
    long jlong
    long
    const long &
    int jint
    unsigned long
    const unsigned long &
    long jlong
    long long
    const long long &
    long jlong
    unsigned long long
    const unsigned long long &
    java.math.BigInteger jobject
    float
    const float &
    float jfloat
    double
    const double &
    double jdouble
    char *
    char []
    String jstring

    Note that SWIG wraps the C char type as a character. Pointers and arrays of this type are wrapped as strings. The signed char type can be used if you want to treat char as a signed number rather than a character. Also note that all const references to primitive types are treated as if they are passed by value.

    Given the following C function:

    void func(unsigned short a, char *b, const long &c, unsigned long long d);
    

    The module class method would be:

    public static void func(int a, String b, int c, java.math.BigInteger d) {...}
    

    The intermediary JNI class would use the same types:

    public final static native void func(int jarg1, String jarg2, int jarg3,
                                         java.math.BigInteger jarg4);
    

    and the JNI function would look like this:

    SWIGEXPORT void JNICALL Java_exampleJNI_func(JNIEnv *jenv, jclass jcls,
                    jint jarg1, jstring jarg2, jint jarg3, jobject jarg4) {...}
    

    The mappings for C int and C long are appropriate for 32 bit applications which are used in the 32 bit JVMs. There is no perfect mapping between Java and C as Java doesn't support all the unsigned C data types. However, the mappings allow the full range of values for each C type from Java.

    26.9.2 Default typemaps for non-primitive types

    The previous section covered the primitive type mappings. Non-primitive types such as classes and structs are mapped using pointers on the C/C++ side and storing the pointer into a Java long variable which is held by the proxy class or type wrapper class. This applies whether the type is marshalled as a pointer, by reference or by value. It also applies for any unknown/incomplete types which use type wrapper classes.

    So in summary, the C/C++ pointer to non-primitive types is cast into the 64 bit Java long type and therefore the JNI type is a jlong. The Java type is either the proxy class or type wrapper class.

    26.9.3 Sixty four bit JVMs

    If you are using a 64 bit JVM you may have to override the C long, but probably not C int default mappings. Mappings will be system dependent, for example long will need remapping on Unix LP64 systems (long, pointer 64 bits, int 32 bits), but not on Microsoft 64 bit Windows which will be using a P64 IL32 (pointer 64 bits and int, long 32 bits) model. This may be automated in a future version of SWIG. Note that the Java write once run anywhere philosophy holds true for all pure Java code when moving to a 64 bit JVM. Unfortunately it won't of course hold true for JNI code.

    26.9.4 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Java to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variables prefaced by a $ are used. The $1 variable is a placeholder for a local variable of type int. The $input variable contains the Java data, the JNI jint in this case.

    When this example is compiled into a Java module, it can be used as follows:

    System.out.println(example.fact(6));
    

    and the output will be:

    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int nonnegative {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int nonnegative.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG C++ type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int nonnegative {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer nonnegative);    // Above typemap is applied
    %}
    

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
    ...
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Java parameter. This allows the function to be used like this (notice how the length parameter is omitted):

    int c = example.count('e', "Hello World");
    

    26.9.5 Typemaps for mapping C/C++ types to Java types

    The typemaps available to the Java module include the common typemaps listed in the main typemaps section. There are a number of additional typemaps which are necessary for using SWIG with Java. The most important of these implement the mapping of C/C++ types to Java types:


     
    Typemap Description
    jni JNI C types. These provide the default mapping of types from C/C++ to JNI for use in the JNI (C/C++) code.
    jtype Java intermediary types. These provide the default mapping of types from C/C++ to Java for use in the native functions in the intermediary JNI class. The type must be the equivalent Java type for the JNI C type specified in the "jni" typemap.
    jstype Java types. These provide the default mapping of types from C/C++ to Java for use in the Java module class, proxy classes and type wrapper classes.
    javain Conversion from jstype to jtype. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). In other words the typemap provides the conversion to the native method call parameter types.
    javaout Conversion from jtype to jstype. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). In other words the typemap provides the conversion from the native method call return type.
    jboxtype Java boxed type. These are Java code typemaps to provide the Java boxed type, such as, Integer for C type int. As autoboxing is only relevant to the Java primitive types, these are only provided for the C types that map to Java primitive types. This typemap is usually only used by C++ STL container wrappers that are wrapped by Java generic types as the boxed type must be used instead of the unboxed/primitive type when declaring a Java generic type.
    javadirectorin Conversion from jtype to jstype for director methods. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). This typemap provides the conversion for the parameters in the director methods when calling up from C++ to Java. See Director typemaps.
    javadirectorout Conversion from jstype to jtype for director methods. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). This typemap provides the conversion for the return type in the director methods when returning from the C++ to Java upcall. See Director typemaps.
    directorin Conversion from C++ type to jni type for director methods. These are C++ typemaps which convert the parameters used in the C++ director method to the appropriate JNI intermediary type. The conversion is done in JNI code prior to calling the Java function from the JNI code. See Director typemaps.
    directorout Conversion from jni type to C++ type for director methods. These are C++ typemaps which convert the JNI return type used in the C++ director method to the appropriate C++ return type. The conversion is done in JNI code after calling the Java function from the JNI code. See Director typemaps.

    If you are writing your own typemaps to handle a particular type, you will normally have to write a collection of them. The default typemaps are in "java.swg" and so might be a good place for finding typemaps to base any new ones on.

    The "jni", "jtype" and "jstype" typemaps are usually defined together to handle the Java to C/C++ type mapping. An "in" typemap should be accompanied by a "javain" typemap and likewise an "out" typemap by a "javaout" typemap. If an "in" typemap is written, a "freearg" and "argout" typemap may also need to be written as some types have a default "freearg" and/or "argout" typemap which may need overriding. The "freearg" typemap sometimes releases memory allocated by the "in" typemap. The "argout" typemap sometimes sets values in function parameters which are passed by reference in Java.

    Note that the "in" typemap marshals the JNI type held in the "jni" typemap to the real C/C++ type and for the opposite direction, the "out" typemap marshals the real C/C++ type to the JNI type held in the "jni" typemap. For non-primitive types the "in" and "out" typemaps are responsible for casting between the C/C++ pointer and the 64 bit jlong type. There is no portable way to cast a pointer into a 64 bit integer type and the approach taken by SWIG is mostly portable, but breaks C/C++ aliasing rules. In summary, these rules state that a pointer to any type must never be dereferenced by a pointer to any other incompatible type. The following code snippet might aid in understand aliasing rules better:

    short a;
    short* pa = 0;
    int i = 0x1234;
    
    a = (short)i;    /* okay */
    a = *(short*)&i; /* breaks aliasing rules */
    

    An email posting, Aliasing, pointer casts and gcc 3.3 elaborates further on the subject. In SWIG, the "in" and "out" typemaps for pointers are typically

    %typemap(in) struct Foo * %{
      $1 = *(struct Foo **)&$input; /* cast jlong into C ptr */
    %}
    %typemap(out) struct Bar * %{
      *(struct Bar **)&$result = $1; /* cast C ptr into jlong */
    %}
    struct Bar {...};
    struct Foo {...};
    struct Bar * FooBar(struct Foo *f);
    

    resulting in the following code which breaks the aliasing rules:

    SWIGEXPORT jlong JNICALL Java_exampleJNI_FooBar(JNIEnv *jenv, jclass jcls,
                                                    jlong jarg1, jobject jarg1_) {
      jlong jresult = 0 ;
      struct Foo *arg1 = (struct Foo *) 0 ;
      struct Bar *result = 0 ;
      
      (void)jenv;
      (void)jcls;
      (void)jarg1_;
      arg1 = *(struct Foo **)&jarg1; 
      result = (struct Bar *)FooBar(arg1);
      *(struct Bar **)&jresult = result; 
      return jresult;
    }
    

    If you are using gcc as your C compiler, you might get a "dereferencing type-punned pointer will break strict-aliasing rules" warning about this. Please see Compiling a dynamic module to avoid runtime problems with these strict aliasing rules.

    The default code generated by SWIG for the Java module comes from the typemaps in the "java.swg" library file which implements the Default primitive type mappings and Default typemaps for non-primitive types covered earlier. There are other type mapping typemaps in the Java library. These are listed below:


     
    C Type Typemap File Kind Java Type Function
    primitive pointers and references INPUT typemaps.i input Java basic types Allows values to be used for C functions taking pointers for data input.
    primitive pointers and references OUTPUT typemaps.i output Java basic type arrays Allows values held within an array to be used for C functions taking pointers for data output.
    primitive pointers and references INOUT typemaps.i input
    output
    Java basic type arrays Allows values held within an array to be used for C functions taking pointers for data input and output.
    string
    wstring
    [unnamed] std_string.i input
    output
    String Use for std::string mapping to Java String.
    arrays of primitive types [unnamed] arrays_java.i input
    output
    arrays of primitive Java types Use for mapping C arrays to Java arrays.
    arrays of classes/structs/unions JAVA_ARRAYSOFCLASSES macro arrays_java.i input
    output
    arrays of proxy classes Use for mapping C arrays to Java arrays.
    arrays of enums ARRAYSOFENUMS arrays_java.i input
    output
    int[] Use for mapping C arrays to Java arrays (typeunsafe and simple enum wrapping approaches only).
    char * BYTE various.i input byte[] Java byte array is converted to char array
    char ** STRING_ARRAY various.i input
    output
    String[] Use for mapping NULL terminated arrays of C strings to Java String arrays
    unsigned char * NIOBUFFER various.i input
    output
    java.nio.Buffer Use for mapping directly allocated buffers to c/c++. useful with directors and long lived memory objects

    26.9.6 Java typemap attributes

    There are a few additional typemap attributes that the Java module supports.

    The first of these is the 'throws' attribute. The throws attribute is optional and specified after the typemap name and contains one or more comma separated classes for adding to the throws clause for any methods that use that typemap. It is analogous to the %javaexception feature's throws attribute.

    %typemap(typemapname, throws="ExceptionClass1, ExceptionClass2") type { ... }
    

    The attribute is necessary for supporting Java checked exceptions and can be added to just about any typemap. The list of typemaps include all the C/C++ (JNI) typemaps in the "Typemaps" chapter and the Java specific typemaps listed in the previous section, barring the "jni", "jtype" and "jstype" typemaps as they could never contain code to throw an exception.

    The throws clause is generated for the proxy method as well as the JNI method in the JNI intermediary class. If a method uses more than one typemap and each of those typemaps have classes specified in the throws clause, the union of the exception classes is added to the throws clause ensuring there are no duplicate classes. See the NaN exception example for further usage.

    The "jtype" typemap has the optional 'nopgcpp' attribute which can be used to suppress the generation of the premature garbage collection prevention parameter.

    The "javain" typemap has the optional 'pre', 'post' and 'pgcppname' attributes. These are used for generating code before and after the JNI call in the proxy class or module class. The 'pre' attribute contains code that is generated before the JNI call and the 'post' attribute contains code generated after the JNI call. The 'pgcppname' attribute is used to change the premature garbage collection prevention parameter name passed to the JNI function. This is sometimes needed when the 'pre' typemap creates a temporary variable which is then passed to the JNI function.

    Note that when the 'pre' or 'post' attributes are specified and the associated type is used in a constructor, a constructor helper function is generated. This is necessary as the Java proxy constructor wrapper makes a call to a support constructor using a this call. In Java the this call must be the first statement in the constructor body. The constructor body thus calls the helper function and the helper function instead makes the JNI call, ensuring the 'pre' code is called before the JNI call is made. There is a Date marshalling example showing 'pre', 'post' and 'pgcppname' attributes in action.

    26.9.7 Java special variables

    The standard SWIG special variables are available for use within typemaps as described in the Typemaps documentation, for example $1, $input, $result etc.

    The Java module uses a few additional special variables:

    $javaclassname
    This special variable works like the other special variables and $javaclassname is similar to $1_type. It expands to the class name for use in Java given a pointer. SWIG wraps unions, structs and classes using pointers and in this case it expands to the Java proxy class name. For example, $javaclassname is replaced by the proxy classname Foo when wrapping a Foo * and $&javaclassname expands to the proxy classname when wrapping the C/C++ type Foo and $*javaclassname expands to the proxy classname when wrapping Foo *&. If the type does not have an associated proxy class, it expands to the type wrapper class name, for example, SWIGTYPE_p_unsigned_short is generated when wrapping unsigned short *. The class name is fully qualified with the package name when using the nspace feature.

    $javaclazzname
    This special variable works like $javaclassname, but expands the fully qualified C++ class into the package name, if used by the nspace feature, and the proxy class name, mangled for use as a function name. For example, Namespace1::Namespace2::Klass is expanded into Namespace1_Namespace2_Klass_. This special variable is usually used for making calls to a function in the intermediary JNI class, as they are mangled with this prefix.

    $null
    Used in input typemaps to return early from JNI functions that have either void or a non-void return type. Example:

    %typemap(check) int * %{ 
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return $null;
      }
    %}
    

    If the typemap gets put into a function with void as return, $null will expand to nothing:

    SWIGEXPORT void JNICALL Java_jnifn(...) {
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return ;
      }
      ...
    }
    

    otherwise $null expands to NULL

    SWIGEXPORT jobject JNICALL Java_jnifn(...) {
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return NULL;
      }
      ...
    }
    

    $javainput, $jnicall and $owner
    The $javainput special variable is used in "javain" typemaps and $jnicall and $owner are used in "javaout" typemaps. $jnicall is analogous to $action in %exception. It is replaced by the call to the native method in the intermediary JNI class. $owner is replaced by either true if %newobject has been used, otherwise false. $javainput is analogous to the $input special variable. It is replaced by the parameter name.

    Here is an example:

    %typemap(javain) Class "Class.getCPtr($javainput)"
    %typemap(javain) unsigned short "$javainput"
    %typemap(javaout) Class * {
        return new Class($jnicall, $owner);
      }
    
    %inline %{
      class Class {...};
      Class * bar(Class cls, unsigned short ush) { return new Class(); };
    %}
    

    The generated proxy code is then:

    public static Class bar(Class cls, int ush) {
      return new Class(exampleJNI.bar(Class.getCPtr(cls), cls, ush), false);
    }
    

    Here $javainput has been replaced by cls and ush. $jnicall has been replaced by the native method call, exampleJNI.bar(...) and $owner has been replaced by false. If %newobject is used by adding the following at the beginning of our example:

    %newobject bar(Class cls, unsigned short ush);
    

    The generated code constructs the return type using true indicating the proxy class Class is responsible for destroying the C++ memory allocated for it in bar:

    public static Class bar(Class cls, int ush) {
      return new Class(exampleJNI.bar(Class.getCPtr(cls), cls, ush), true);
    }
    

    $static
    This special variable expands to either static or nothing depending on whether the class is an inner Java class or not. It is used in the "javaclassmodifiers" typemap so that global classes can be wrapped as Java proxy classes and nested C++ classes/enums can be wrapped with the Java equivalent, that is, static inner proxy classes.

    $error, $jniinput, $javacall and $packagepath
    These special variables are used in the directors typemaps. See Director specific typemaps for details.

    $module
    This special variable expands to the module name, as specified by %module or the -module commandline option.

    $imclassname
    This special variable expands to the intermediary class name. Usually this is the same as '$moduleJNI', unless the jniclassname attribute is specified in the %module directive.

    $javainterfacename
    This special variable is only expanded when the interface feature is applied to a class. It works much like $javaclassname, but instead of expanding to the proxy classname, it expands to the value in the name attribute in the interface feature. For example:

    %feature("interface", name="MyInterface") MyClass;
    %typemap(jstype) MyClass  "$&javainterfacename"
    %typemap(jstype) MyClass * "$javainterfacename"
    

    will result in the jstype typemap expanding to MyInterface for both MyClass and MyClass *. The interface name is fully qualified with the package name when using the nspace feature.

    $interfacename
    This special variable is only expanded when the interface feature is applied to a class. It expands to just the interface name and is thus different to $javainterfacename in that it is not fully qualified with the package name when using the nspace feature.

    26.9.8 Typemaps for both C and C++ compilation

    JNI calls must be written differently depending on whether the code is being compiled as C or C++. For example C compilation requires the pointer to a function pointer struct member syntax like

    const jclass clazz = (*jenv)->FindClass(jenv, "java/lang/String");
    

    whereas C++ code compilation of the same function call is a member function call using a class pointer like

    const jclass clazz = jenv->FindClass("java/lang/String");
    

    To enable typemaps to be used for either C or C++ compilation, a set of JCALLx macros have been defined in Lib/java/javahead.swg, where x is the number of arguments in the C++ version of the JNI call. The above JNI calls would be written in a typemap like this

    const jclass clazz = JCALL1(FindClass, jenv, "java/lang/String");
    

    Note that the SWIG preprocessor expands these into the appropriate C or C++ JNI calling convention. The C calling convention is emitted by default and the C++ calling convention is emitted when using the -c++ SWIG commandline option. If you do not intend your code to be targeting both C and C++ then your typemaps can use the appropriate JNI calling convention and need not use the JCALLx macros.

    26.9.9 Java code typemaps

    Most of SWIG's typemaps are used for the generation of C/C++ code. The typemaps in this section are used solely for the generation of Java code. Elements of proxy classes and type wrapper classes come from the following typemaps (the defaults).

    %typemap(javabase)

    base (extends) for Java class: empty default
    Note that this typemap accepts a replace attribute as an optional flag. When set to "1", it will replace/override any C++ base classes that might have been parsed. If this flag is not specified and there are C++ base classes, then a multiple inheritance warning is issued and the code in the typemap is ignored. The typemap also accepts a notderived attribute as an optional flag. When set to "1", it will not apply to classes that are derived from a C++ base. When used with the SWIGTYPE type, it is useful for giving a common base for all proxy classes, that is, providing a base class that sits in between all proxy classes and the Java base class Object for example: %typemap(javabase, notderived="1") SWIGTYPE "CommonBase".

    %typemap(javabody)

    the essential support body for proxy classes (proxy base classes only), typewrapper classes and enum classes. Default contains extra constructors, memory ownership control member variables (swigCMemOwn, swigCPtr), the getCPtr method etc.

    %typemap(javabody_derived)

    the essential support body for proxy classes (derived classes only). Same as "javabody" typemap, but only used for proxy derived classes.

    %typemap(javaclassmodifiers)

    class modifiers for the Java class: default is "public class"

    %typemap(javacode)

    Java code is copied verbatim to the Java class: empty default As there can only be one "javacode" typemap per class, also consider using the %proxycode directive which can be used multiple times per class and offers nearly identical functionality.

    %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized", parameters="")

    destructor wrapper - the delete() method (proxy classes only), used for all proxy classes except those which have a base class : default calls C++ destructor (or frees C memory) and resets swigCPtr and swigCMemOwn flags

    Note that the delete() method name is configurable and is specified by the methodname attribute. The method modifiers are also configurable via the methodmodifiers attribute. If a %javamethodmodifiers is attached to the class' destructor, it will be used in preference to the methodmodifiers typemap attribute for the class. The delete method's parameters declaration can be provided in the optional parameters typemap attribute.

    %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized", parameters="")

    destructor wrapper - the delete() method (proxy classes only), same as "javadestruct" but only used for derived proxy classes : default calls C++ destructor (or frees C memory) and resets swigCPtr and swigCMemOwn flags

    Note that the delete() method name is configurable and is specified by the methodname attribute. The method modifiers are also configurable via the methodmodifiers attribute. If a %javamethodmodifiers is attached to the class' destructor, it will be used in preference to the methodmodifiers typemap attribute for the class. The delete method's parameters declaration can be provided in the optional parameters typemap attribute.

    %typemap(javaimports)

    import statements for Java class: empty default

    %typemap(javainterfaces)

    interfaces (implements) for Java class: empty default

    %typemap(javafinalize)

    the finalize() method (proxy classes only): default calls the delete() method

    Note that the default javafinalize typemap must contain the full implementation of the finalize method. Any customization to this typemap must still declare a java finalize method with the correct signature. Note also that the name of the generated "delete" method may be affected by javadestruct and javadestruct_derived typemaps. Below shows an example modifying the finalizer, assuming the delete method has been renamed to swig_delete.

    %typemap(javafinalize) SWIGTYPE %{
      protected void finalize() {
        swig_delete();  // renamed to prevent conflict with existing delete method
      }
    ]%
    

    %typemap(javainterfacecode, declaration="...", cptrmethod="...")

    The code in this typemap is added to the body of a Java proxy class but only when a class is marked with the interface feature. The typemap is used in the proxy class marked with the interface feature as well as all proxy classes derived from the marked C++ class, as they are all generated as implementing the Java interface. The default typemap used in the %interface family of macros mentioned in the Java interfaces section, where CTYPE is the C++ class macro argument, is as follows:

    %typemap(javainterfacecode,
             declaration="  long $interfacename_GetInterfaceCPtr();\n",
             cptrmethod="$interfacename_GetInterfaceCPtr") CTYPE %{
      public long $interfacename_GetInterfaceCPtr() {
        return $imclassname.$javaclazzname$interfacename_GetInterfaceCPtr(swigCPtr);
      }
    %}
    

    The special variable $interfacename is expanded into the name specified in the interface feature.

    Compatibility Note: In SWIG-1.3.21 and earlier releases, typemaps called "javagetcptr" and "javaptrconstructormodifiers" were available. These are deprecated and the "javabody" typemap can be used instead. The javainterfacecode typemap and interface feature was introduced in SWIG-3.0.9.

    In summary the contents of the typemaps make up a proxy class like this:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    [ javabody or javabody_derived typemap ]
    [ javafinalize typemap ]
    public synchronized void delete() [ javadestruct OR javadestruct_derived typemap ]
    [ javacode typemap ]
    [ javainterfacecode typemap]
    ... proxy functions ...
    }
    

    Note the delete() methodname and method modifiers are configurable, see "javadestruct" and "javadestruct_derived" typemaps above.

    The javainterfacecode typemap is only used when bases are marked by the interface feature and the implements list will also then be expanded to include these Java interfaces.

    The type wrapper class is similar in construction:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    [ javabody typemap ]
    [ javacode typemap ]
    }
    

    The enum class is also similar in construction:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    ... Enum values ...
    [ javabody typemap ]
    [ javacode typemap ]
    }
    

    The "javaimports" typemap is ignored if the enum class is wrapped by an inner Java class, that is when wrapping an enum declared within a C++ class.

    The Java interface turned on by the interface feature is fairly simple:

    [ javaimports typemap ]
    public interface [ javainterfacename ] {
    [ javainterfacecode:cptrmethod typemap attribute ]
    ... interface declarations ...
    }
    

    where javainterfacename is the name attribute in the interface feature.

    The defaults can be overridden to tailor the generated classes. Here is an example which will change the getCPtr method and constructor from the default public access to protected access. If the classes in one package are not using the classes in another package, then these methods need not be public and removing access to these low level implementation details, is a good thing. If you are invoking SWIG more than once and generating the wrapped classes into different packages in each invocation, then you cannot do this as you will then have different packages.

    %typemap(javabody) SWIGTYPE %{
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected $javaclassname(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr($javaclassname obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    %}
    

    The typemap code is the same that is in "java.swg", barring the last two method modifiers. Note that SWIGTYPE will target all proxy classes, but not the type wrapper classes. Also the above typemap is only used for proxy classes that are potential base classes. To target proxy classes that are derived from a wrapped class as well, the "javabody_derived" typemap should also be overridden.

    For the typemap to be used in all type wrapper classes, all the different types that type wrapper classes could be used for should be targeted:

    %typemap(javabody) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) %{
      private transient long swigCPtr;
    
      protected $javaclassname(long cPtr, boolean bFutureUse) {
        swigCPtr = cPtr;
      }
    
      protected $javaclassname() {
        swigCPtr = 0;
      }
    
      protected static long getCPtr($javaclassname obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    %}
    

    Again this is the same that is in "java.swg", barring the method modifier for getCPtr.

    When using multiple modules or the nspace feature it is common to invoke SWIG with a different -package command line option for each module. However, by default the generated code may not compile if generated classes in one package use generated classes in another package. The visibility of the getCPtr() and pointer constructor generated from the javabody typemaps needs changing. The default visibility is protected but it needs to be public for access from a different package. Just changing 'protected' to 'public' in the typemap achieves this. Two macros are available in java.swg to make this easier and using them is the preferred approach over simply copying the typemaps and modifying as this is forward compatible with any changes in the javabody typemap in future versions of SWIG. The macros are for the proxy and typewrapper classes and can respectively be used to to make the method and constructor public:

      SWIG_JAVABODY_PROXY(public, public, SWIGTYPE)
      SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    

    26.9.10 Director specific typemaps

    The Java directors feature requires the "javadirectorin", "javadirectorout", "directorin" and the "directorout" typemaps in order to work properly. The "javapackage" typemap is an optional typemap used to identify the Java package path for individual SWIG generated proxy classes used in director methods.

    %typemap(directorin)

    The "directorin" typemap is used for converting arguments in the C++ director class to the appropriate JNI type before the upcall to Java. This typemap also specifies the JNI field descriptor for the type in the "descriptor" attribute. For example, integers are converted as follows:

    %typemap(directorin, descriptor="I") int "$input = (jint) $1;"
    

    $input is the SWIG name of the JNI temporary variable passed to Java in the upcall. The descriptor="I" will put an I into the JNI field descriptor that identifies the Java method that will be called from C++. For more about JNI field descriptors and their importance, refer to the JNI documentation mentioned earlier. A typemap for C character strings is:

    %typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * {
      $input = 0;
      if ($1) {
        $input = JCALL1(NewStringUTF, jenv, (const char *)$1);
        if (!$input) return $null;
      }
      Swig::LocalRefGuard $1_refguard(jenv, $input);
    }
    

    The Swig::LocalRefGuard class should be used in directorin typemaps for newly allocated objects. It is used to control local reference counts ensuring the count is decremented after the call up into Java has completed. Its destructor simply calls jenv->DeleteLocalRef(obj) on the obj passed in during construction.

    User-defined types have the default "descriptor" attribute "L$packagepath/$javaclassname;" where $packagepath is the package name passed from the SWIG command line and $javaclassname is the Java proxy class' name. If the -package commandline option is not used to specify the package, then '$packagepath/' will be removed from the resulting output JNI field descriptor. Do not forget the terminating ';' for JNI field descriptors starting with 'L'. If the ';' is left out, Java will generate a "method not found" runtime error. Note that the $packagepath substitution always uses the path separator '/' when expanded. The $javaclassname expansion can be confusing as it is normally expanded using the '.' separator. However, $javaclassname is expanded using the path separator '/' in typemap's "descriptor" attribute as well as in the "directorthrows" typemap.

    %typemap(directorout)

    The "directorout" typemap is used for converting the JNI return type in the C++ director class to the appropriate C++ type after the upcall to Java. For example, integers are converted as follows:

    %typemap(directorout) int %{ $result = (int)$input; %}
    

    $input is the SWIG name of the JNI temporary variable returned from Java after the upcall. $result is the resulting output. A typemap for C character strings is:

    %typemap(directorout) char * {
      $1 = 0;
      if ($input) {
        $result = (char *)jenv->GetStringUTFChars($input, 0);
        if (!$1) return $null;
      }
    }
    

    %typemap(javadirectorin)

    Conversion from jtype to jstype for director methods. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). This typemap provides the conversion for the parameters in the director methods when calling up from C++ to Java.

    For primitive types, this typemap is usually specified as:

    %typemap(javadirectorin) int "$jniinput"
    

    The $jniinput special variable is analogous to $javainput special variable. It is replaced by the input parameter name.

    %typemap(javadirectorout)

    Conversion from jstype to jtype for director methods. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). This typemap provides the conversion for the return type in the director methods when returning from the C++ to Java upcall.

    For primitive types, this typemap is usually specified as:

    %typemap(javadirectorout) int "$javacall"
    

    The $javacall special variable is analogous to the $jnicall special variable. It is replaced by the call to the target Java method. The target method is the method in the Java proxy class which overrides the virtual C++ method in the C++ base class.

    %typemap(directorthrows)

    Conversion of Java exceptions to C++ exceptions in director method's exception handling. This typemap is expected to test the $error special variable for a matching Java exception and if successful convert and throw it into a C++ exception given by the typemap's type. The $error special variable is of type jthrowable and is substituted with a unique variable name in the generated code.

    The example below converts a Java java.lang.IndexOutOfBoundsException exception to the typemap's type, that is std::out_of_range:

    %typemap(directorthrows) std::out_of_range %{
      if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    

    The utility function Swig::ExceptionMatches and class Swig::JavaExceptionMessage are helpers available when using directors and are described in the Java Exceptions from Directors section.

    %typemap(javapackage)

    The "javapackage" typemap is optional; it serves to identify a class's Java package. This typemap should be used in conjunction with classes that are defined outside of the current SWIG interface file. The typemap is only used if the type is used in a director method, that is, in a virtual method in a director class. For example:

    // class Foo is handled in a different interface file:
    %import "Foo.i"
    
    %feature("director") Example;
    
    %inline {
      class Bar { };
    
      class Example {
      public:
        virtual ~Example();
        virtual void ping(Foo *arg1, Bar *arg2);
      };
    }
    

    Assume that the Foo class is part of the Java package com.wombat.foo but the above interface file is part of the Java package com.wombat.example. Without the "javapackage" typemap, SWIG will assume that the Foo class belongs to com.wombat.example class. The corrected interface file looks like:

    // class Foo is handled in a different interface file:
    %import "Foo.i"
    %typemap("javapackage") Foo, Foo *, Foo & "com.wombat.foo";
    %feature("director") Example;
    
    %inline {
      class Bar { };
    
      class Example {
      public:
        virtual ~Example();
        virtual void ping(Foo *arg1, Bar *arg2);
      };
    }
    

    SWIG looks up the package based on the actual type (plain Foo, Foo pointer and Foo reference), so it is important to associate all three types with the desired package. Practically speaking, you should create a separate SWIG interface file, which is %import-ed into each SWIG interface file, when you have multiple Java packages. Note the helper macros below, OTHER_PACKAGE_SPEC and ANOTHER_PACKAGE_SPEC, which reduce the amount of extra typing. "TYPE..." is useful when passing templated types to the macro, since multiargument template types appear to the SWIG preprocessor as multiple macro arguments.

    %typemap("javapackage") SWIGTYPE, SWIGTYPE *, SWIGTYPE &
                                                "package.for.most.classes";
    
    %define OTHER_PACKAGE_SPEC(TYPE...)
    %typemap("javapackage") TYPE, TYPE *, TYPE & "package.for.other.classes";
    %enddef
    
    %define ANOTHER_PACKAGE_SPEC(TYPE...)
    %typemap("javapackage") TYPE, TYPE *, TYPE & "package.for.another.set";
    %enddef
    
    OTHER_PACKAGE_SPEC(Package_2_class_one)
    ANOTHER_PACKAGE_SPEC(Package_3_class_two)
    /* etc */
    

    The basic strategy here is to provide a default package typemap for the majority of the classes, only providing "javapackage" typemaps for the exceptions.

    26.10 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "java.swg" and "typemaps.i" in the SWIG library.

    26.10.1 Simpler Java enums for enums without initializers

    The default Proper Java enums approach to wrapping enums is somewhat verbose. This is to handle all possible C/C++ enums, in particular enums with initializers. The generated code can be simplified if the enum being wrapped does not have any initializers.

    The following shows how to remove the support methods that are generated by default and instead use the methods in the Java enum base class java.lang.Enum and java.lang.Class for marshalling enums between C/C++ and Java. The type used for the typemaps below is enum SWIGTYPE which is the default type used for all enums. The "enums.swg" file should be examined in order to see the original overridden versions of the typemaps.

    %include "enums.swg"
    
    %typemap(javain) enum SWIGTYPE "$javainput.ordinal()"
    %typemap(javaout) enum SWIGTYPE {
        return $javaclassname.class.getEnumConstants()[$jnicall];
      }
    %typemap(javabody) enum SWIGTYPE ""
    
    %inline %{
      enum HairType { blonde, ginger, brunette };
      void setHair(HairType h);
      HairType getHair();
    %}
    

    SWIG will generate the following Java enum, which is somewhat simpler than the default:

    public enum HairType {
      blonde,
      ginger,
      brunette;
    }
    

    and the two Java proxy methods will be:

    public static void setHair(HairType h) {
      exampleJNI.setHair(h.ordinal());
    }
    
    public static HairType getHair() {
      return HairType.class.getEnumConstants()[exampleJNI.getHair()];
    }
    

    For marshalling Java enums to C/C++ enums, the ordinal method is used to convert the Java enum into an integer value for passing to the JNI layer, see the "javain" typemap. For marshalling C/C++ enums to Java enums, the C/C++ enum value is cast to an integer in the C/C++ typemaps (not shown). This integer value is then used to index into the array of enum constants that the Java language provides. See the getEnumConstants method in the "javaout" typemap.

    These typemaps can often be used as the default for wrapping enums as in many cases there won't be any enum initializers. In fact a good strategy is to always use these typemaps and to specifically handle enums with initializers using %apply. This would be done by using the original versions of these typemaps in "enums.swg" under another typemap name for applying using %apply.

    26.10.2 Handling C++ exception specifications as Java exceptions

    This example demonstrates various ways in which C++ exceptions can be tailored and converted into Java exceptions. Let's consider a simple file class SimpleFile and an exception class FileException which it may throw on error:

    %include "std_string.i" // for std::string typemaps
    #include <string>
    
    class FileException {
      std::string message;
    public:
      FileException(const std::string& msg) : message(msg) {}
      std::string what() {
        return message;
      }
    };
    
    class SimpleFile {
      std::string filename;
    public:
      SimpleFile(const std::string& filename) : filename(filename) {}
      void open() throw(FileException) {
      ...
      }
    };
    

    As the open method has a C++ exception specification, SWIG will parse this and know that the method can throw an exception. The "throws" typemap is then used when SWIG encounters an exception specification. The default generic "throws" typemap looks like this:

    %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE *, SWIGTYPE [ANY] %{
      SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException,
                              "C++ $1_type exception thrown");
      return $null;
    %}
    

    Basically SWIG will generate a C++ try catch block and the body of the "throws" typemap constitutes the catch block. The above typemap calls a SWIG supplied method which throws a java.lang.RuntimeException. This exception class is a runtime exception and therefore not a checked exception. If, however, we wanted to throw a checked exception, say java.io.IOException, then we could use the following typemap:

    %typemap(throws, throws="java.io.IOException") FileException {
      jclass excep = jenv->FindClass("java/io/IOException");
      if (excep)
        jenv->ThrowNew(excep, $1.what().c_str());
      return $null;
    }
    

    Note that this typemap uses the 'throws' typemap attribute to ensure a throws clause is generated. The generated proxy method then specifies the checked exception by containing java.io.IOException in the throws clause:

    public class SimpleFile {
      ...
      public void open() throws java.io.IOException { ... }
    }
    

    Lastly, if you don't want to map your C++ exception into one of the standard Java exceptions, the C++ class can be wrapped and turned into a custom Java exception class. If we go back to our example, the first thing we must do is get SWIG to wrap FileException and ensure that it derives from java.lang.Exception. Additionally, we might want to override the java.lang.Exception.getMessage() method. The typemaps to use then are as follows:

    %typemap(javabase) FileException "java.lang.Exception";
    %typemap(javacode) FileException %{
      public String getMessage() {
        return what();
      }
    %}
    

    This generates:

    public class FileException extends java.lang.Exception {
      ...
      public String getMessage() {
        return what();
      }
    
      public FileException(String msg) { ... }
    
      public String what() {
        return exampleJNI.FileException_what(swigCPtr, this);
      }
    }
    

    We could alternatively have used %rename to rename what() into getMessage().

    26.10.3 NaN Exception - exception handling for a particular type

    A Java exception can be thrown from any Java or JNI code. Therefore, as most typemaps contain either Java or JNI code, just about any typemap could throw an exception. The following example demonstrates exception handling on a type by type basis by checking for 'Not a number' (NaN) whenever a parameter of type float is wrapped.

    Consider the following C++ code:

    bool calculate(float first, float second);
    

    To validate every float being passed to C++, we could precede the code being wrapped by the following typemap which throws a runtime exception whenever the float is 'Not a Number':

    %module example
    %typemap(javain) float "$module.CheckForNaN($javainput)"
    %pragma(java) modulecode=%{
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    %}
    

    Note that the CheckForNaN support method has been added to the module class using the modulecode pragma. The following shows the generated code of interest:

    public class example {
      ...
    
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    
      public static boolean calculate(float first, float second) {
        return exampleJNI.calculate(example.CheckForNaN(first), example.CheckForNaN(second));
      }
    }
    

    Note that the "javain" typemap is used for every occurrence of a float being used as an input. Of course, we could have targeted the typemap at a particular parameter by using float first, say, instead of just float.

    The exception checking could alternatively have been placed into the 'pre' attribute that the "javain" typemap supports. The "javain" typemap above could be replaced with the following:

    %typemap(javain, pre="    $module.CheckForNaN($javainput);") float "$javainput"
    

    which would modify the calculate function to instead be generated as:

    public class example {
      ...
      public static boolean calculate(float first, float second) {
        example.CheckForNaN(first);
        example.CheckForNaN(second);
        {
          return exampleJNI.calculate(first, second);
        }
      }
    }
    

    See the Date marshalling example for an example using further "javain" typemap attributes.

    If we decide that what we actually want is a checked exception instead of a runtime exception, we can change this easily enough. The proxy method that uses float as an input, must then add the exception class to the throws clause. SWIG can handle this as it supports the 'throws' typemap attribute for specifying classes for the throws clause. Thus we can modify the pragma and the typemap for the throws clause:

    %typemap(javain, throws="java.lang.Exception") float "$module.CheckForNaN($javainput)"
    %pragma(java) modulecode=%{
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) throws java.lang.Exception {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    %}
    

    The calculate method now has a throws clause and even though the typemap is used twice for both float first and float second, the throws clause contains a single instance of java.lang.Exception:

    public class example {
      ...
    
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) throws java.lang.Exception {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    
      public static boolean calculate(float first, float second) throws java.lang.Exception {
        return exampleJNI.calculate(example.CheckForNaN(first), example.CheckForNaN(second));
      }
    }
    

    If we were a martyr to the JNI cause, we could replace the succinct code within the "javain" typemap with a few pages of JNI code. If we had, we would have put it in the "in" typemap which, like all JNI and Java typemaps, also supports the 'throws' attribute.

    26.10.4 Converting Java String arrays to char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Java String array to be used as a char ** object.

    %module example
    
    /* This tells SWIG to treat char ** as a special case when used as a parameter
       in a function call */
    %typemap(in) char ** (jint size) {
      int i = 0;
      size = (*jenv)->GetArrayLength(jenv, $input);
      $1 = (char **) malloc((size+1)*sizeof(char *));
      /* make a copy of each string */
      for (i = 0; i<size; i++) {
        jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i);
        const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0);
        $1[i] = malloc((strlen(c_string)+1)*sizeof(char));
        strcpy($1[i], c_string);
        (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string);
        (*jenv)->DeleteLocalRef(jenv, j_string);
      }
      $1[i] = 0;
    }
    
    /* This cleans up the memory we malloc'd before the function call */
    %typemap(freearg) char ** {
      int i;
      for (i=0; i<size$argnum-1; i++)
        free($1[i]);
      free($1);
    }
    
    /* This allows a C function to return a char ** as a Java String array */
    %typemap(out) char ** {
      int i;
      int len=0;
      jstring temp_string;
      const jclass clazz = (*jenv)->FindClass(jenv, "java/lang/String");
    
      while ($1[len]) len++;
      jresult = (*jenv)->NewObjectArray(jenv, len, clazz, NULL);
      /* exception checking omitted */
    
      for (i=0; i<len; i++) {
        temp_string = (*jenv)->NewStringUTF(jenv, *result++);
        (*jenv)->SetObjectArrayElement(jenv, jresult, i, temp_string);
        (*jenv)->DeleteLocalRef(jenv, temp_string);
      }
    }
    
    /* These 3 typemaps tell SWIG what JNI and Java types to use */
    %typemap(jni) char ** "jobjectArray"
    %typemap(jtype) char ** "String[]"
    %typemap(jstype) char ** "String[]"
    
    /* These 2 typemaps handle the conversion of the jtype to jstype typemap type
       and vice versa */
    %typemap(javain) char ** "$javainput"
    %typemap(javaout) char ** {
        return $jnicall;
      }
    
    /* Now a few test functions */
    %inline %{
    
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    
    char **get_args() {
      static char *values[] = { "Dave", "Mike", "Susan", "John", "Michelle", 0};
      return &values[0];
    }
    
    %}
    

    Note that the 'C' JNI calling convention is used. Checking for any thrown exceptions after JNI function calls has been omitted. When this module is compiled, our wrapped C functions can be used by the following Java program:

    // File runme.java
    
    public class runme {
    
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. " + e);
          System.exit(1);
        }
      }
    
      public static void main(String argv[]) {
        String animals[] = {"Cat", "Dog", "Cow", "Goat"};
        example.print_args(animals);
        String args[] = example.get_args();
        for (int i=0; i<args.length; i++)
          System.out.println(i + ":" + args[i]);
      }
    }
    

    When compiled and run we get:

    $ java runme
    argv[0] = Cat
    argv[1] = Dog
    argv[2] = Cow
    argv[3] = Goat
    0:Dave
    1:Mike
    2:Susan
    3:John
    4:Michelle
    

    In the example, a few different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function. The "out" typemap is used for function return values. Lastly the "jni", "jtype" and "jstype" typemaps are also required to specify what Java types to use.

    26.10.5 Expanding a Java object to multiple arguments

    Suppose that you had a collection of C functions with arguments such as the following:

    int foo(int argc, char **argv);
    

    In the previous example, a typemap was written to pass a Java String array as the char **argv. This allows the function to be used from Java as follows:

    example.foo(4, new String[]{"red", "green", "blue", "white"});
    

    Although this works, it's a little awkward to specify the argument count. To fix this, a multi-argument typemap can be defined. This is not very difficult--you only have to make slight modifications to the previous example's typemaps:

    %typemap(in) (int argc, char **argv) {
      int i = 0;
      $1 = (*jenv)->GetArrayLength(jenv, $input);
      $2 = (char **) malloc(($1+1)*sizeof(char *));
      /* make a copy of each string */
      for (i = 0; i<$1; i++) {
        jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i);
        const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0);
        $2[i] = malloc((strlen(c_string)+1)*sizeof(char));
        strcpy($2[i], c_string);
        (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string);
        (*jenv)->DeleteLocalRef(jenv, j_string);
      }
      $2[i] = 0;
    }
    
    %typemap(freearg) (int argc, char **argv) {
      int i;
      for (i=0; i<$1-1; i++)
        free($2[i]);
      free($2);
    }
    
    %typemap(jni) (int argc, char **argv) "jobjectArray"
    %typemap(jtype) (int argc, char **argv) "String[]"
    %typemap(jstype) (int argc, char **argv) "String[]"
    
    %typemap(javain) (int argc, char **argv) "$javainput"
    

    When writing a multiple-argument typemap, each of the types is referenced by a variable such as $1 or $2. The typemap code simply fills in the appropriate values from the supplied Java parameter.

    With the above typemap in place, you will find it no longer necessary to supply the argument count. This is automatically set by the typemap code. For example:

    example.foo(new String[]{"red", "green", "blue", "white"});
    

    26.10.6 Using typemaps to return arguments

    A common problem in some C programs is that values may be returned in function parameters rather than in the return value of a function. The typemaps.i file defines INPUT, OUTPUT and INOUT typemaps which can be used to solve some instances of this problem. This library file uses an array as a means of moving data to and from Java when wrapping a C function that takes non const pointers or non const references as parameters.

    Now we are going to outline an alternative approach to using arrays for C pointers. The INOUT typemap uses a double[] array for receiving and returning the double* parameters. In this approach we are able to use a Java class myDouble instead of double[] arrays where the C pointer double* is required.

    Here is our example function:

    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2);
    

    If we define a structure MyDouble containing a double member variable and use some typemaps we can solve this problem. For example we could put the following through SWIG:

    %module example
    
    /* Define a new structure to use instead of double * */
    %inline %{
    typedef struct {
      double value;
    } MyDouble;
    %}
    
    
    %{
    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2) {
      int status = 1;
      *out1 = a*10.0;
      *out2 = b*100.0;
      return status;
    }
    %}
    
    /* 
    This typemap will make any double * function parameters with name OUTVALUE take an
    argument of MyDouble instead of double *. This will 
    allow the calling function to read the double * value after returning from the function.
    */
    %typemap(in) double *OUTVALUE {
      jclass clazz = jenv->FindClass("MyDouble");
      jfieldID fid = jenv->GetFieldID(clazz, "swigCPtr", "J");
      jlong cPtr = jenv->GetLongField($input, fid);
      MyDouble *pMyDouble = NULL;
      *(MyDouble **)&pMyDouble = *(MyDouble **)&cPtr;
      $1 = &pMyDouble->value;
    }
    
    %typemap(jtype) double *OUTVALUE "MyDouble"
    %typemap(jstype) double *OUTVALUE "MyDouble"
    %typemap(jni) double *OUTVALUE "jobject"
    
    %typemap(javain) double *OUTVALUE "$javainput"
    
    /* Now we apply the typemap to the named variables */
    %apply double *OUTVALUE { double *out1, double *out2 };
    int spam(double a, double b, double *out1, double *out2);
    

    Note that the C++ JNI calling convention has been used this time and so must be compiled as C++ and the -c++ commandline must be passed to SWIG. JNI error checking has been omitted for clarity.

    What the typemaps do are make the named double* function parameters use our new MyDouble wrapper structure. The "in" typemap takes this structure, gets the C++ pointer to it, takes the double value member variable and passes it to the C++ spam function. In Java, when the function returns, we use the SWIG created getValue() function to get the output value. The following Java program demonstrates this:

    // File: runme.java
    
    public class runme {
    
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. " + e);
          System.exit(1);
        }
      }
    
      public static void main(String argv[]) {
        MyDouble out1 = new MyDouble();
        MyDouble out2 = new MyDouble();
        int ret = example.spam(1.2, 3.4, out1, out2);
        System.out.println(ret + "  " + out1.getValue() + "  " + out2.getValue());
      }
    }
    

    When compiled and run we get:

    $ java runme
    1 12.0  340.0
    

    26.10.7 Adding Java downcasts to polymorphic return types

    SWIG support for polymorphism works in that the appropriate virtual function is called. However, the default generated code does not allow for downcasting. Let's examine this with the following code:

    %include "std_string.i"
    
    #include <iostream>
    using namespace std;
    class Vehicle {
    public:
      virtual void start() = 0;
    ...
    };
    
    class Ambulance : public Vehicle {
      string vol;
    public:
      Ambulance(string volume) : vol(volume) {}
      virtual void start() {
        cout << "Ambulance started" << endl;
      }
      void sound_siren() {
        cout << vol << " siren sounded!" << endl;
      }
    ...
    };
    
    Vehicle *vehicle_factory() {
      return new Ambulance("Very loud");
    }
    

    If we execute the following Java code:

    Vehicle vehicle = example.vehicle_factory();
    vehicle.start();
    
    Ambulance ambulance = (Ambulance)vehicle;
    ambulance.sound_siren();
    

    We get:

    Ambulance started
    java.lang.ClassCastException
            at runme.main(runme.java:16)
    

    Even though we know from examination of the C++ code that vehicle_factory returns an object of type Ambulance, we are not able to use this knowledge to perform the downcast in Java. This occurs because the runtime type information is not completely passed from C++ to Java when returning the type from vehicle_factory(). Usually this is not a problem as virtual functions do work by default, such as in the case of start(). There are a few solutions to getting downcasts to work.

    The first is not to use a Java cast but a call to C++ to make the cast. Add this to your code:

    %exception Ambulance::dynamic_cast(Vehicle *vehicle) {
      $action
        if (!result) {
          jclass excep = jenv->FindClass("java/lang/ClassCastException");
          if (excep) {
            jenv->ThrowNew(excep, "dynamic_cast exception");
          }
        }
    }
    %extend Ambulance {
      static Ambulance *dynamic_cast(Vehicle *vehicle) {
        return dynamic_cast<Ambulance *>(vehicle);
      }
    };
    

    It would then be used from Java like this

    Ambulance ambulance = Ambulance.dynamic_cast(vehicle);
    ambulance.sound_siren();
    

    Should vehicle not be of type ambulance then a Java ClassCastException is thrown. The next solution is a purer solution in that Java downcasts can be performed on the types. Add the following before the definition of vehicle_factory:

    %typemap(out) Vehicle * {
      Ambulance *downcast = dynamic_cast<Ambulance *>($1);
      *(Ambulance **)&$result = downcast;
    }
    
    %typemap(javaout) Vehicle * {
        return new Ambulance($jnicall, $owner);
      }
    

    Here we are using our knowledge that vehicle_factory always returns type Ambulance so that the Java proxy is created as a type Ambulance. If vehicle_factory can manufacture any type of Vehicle and we want to be able to downcast using Java casts for any of these types, then a different approach is needed. Consider expanding our example with a new Vehicle type and a more flexible factory function:

    class FireEngine : public Vehicle {
    public:
      FireEngine() {}
      virtual void start() {
        cout << "FireEngine started" << endl;
      }
      void roll_out_hose() {
        cout << "Hose rolled out" << endl;
      }
      ...
    };
    Vehicle *vehicle_factory(int vehicle_number) {
      if (vehicle_number == 0)
        return new Ambulance("Very loud");
      else
        return new FireEngine();
    }
    

    To be able to downcast with this sort of Java code:

    FireEngine fireengine = (FireEngine)example.vehicle_factory(1);
    fireengine.roll_out_hose();
    Ambulance ambulance = (Ambulance)example.vehicle_factory(0);
    ambulance.sound_siren();
    

    the following typemaps targeted at the vehicle_factory function will achieve this. Note that in this case, the Java class is constructed using JNI code rather than passing a pointer across the JNI boundary in a Java long for construction in Java code.

    %typemap(jni) Vehicle *vehicle_factory "jobject"
    %typemap(jtype) Vehicle *vehicle_factory "Vehicle"
    %typemap(jstype) Vehicle *vehicle_factory "Vehicle"
    %typemap(javaout) Vehicle *vehicle_factory {
        return $jnicall;
      }
    
    %typemap(out) Vehicle *vehicle_factory {
      Ambulance *ambulance = dynamic_cast<Ambulance *>($1);
      FireEngine *fireengine = dynamic_cast<FireEngine *>($1);
      if (ambulance) {
        // call the Ambulance(long cPtr, boolean cMemoryOwn) constructor
        jclass clazz = jenv->FindClass("Ambulance");
        if (clazz) {
          jmethodID mid = jenv->GetMethodID(clazz, "<init>", "(JZ)V");
          if (mid) {
            jlong cptr = 0;
            *(Ambulance **)&cptr = ambulance;
            $result = jenv->NewObject(clazz, mid, cptr, false);
          }
        }
      } else if (fireengine) {
        // call the FireEngine(long cPtr, boolean cMemoryOwn) constructor
        jclass clazz = jenv->FindClass("FireEngine");
        if (clazz) {
          jmethodID mid = jenv->GetMethodID(clazz, "<init>", "(JZ)V");
          if (mid) {
            jlong cptr = 0;
            *(FireEngine **)&cptr = fireengine;
            $result = jenv->NewObject(clazz, mid, cptr, false);
          }
        }
      }
      else {
        cout << "Unexpected type " << endl;
      }
    
      if (!$result)
        cout << "Failed to create new java object" << endl;
    }
    

    Better error handling would need to be added into this code. There are other solutions to this problem, but this last example demonstrates some more involved JNI code. SWIG usually generates code which constructs the proxy classes using Java code as it is easier to handle error conditions and is faster. Note that the JNI code above uses a number of string lookups to call a constructor, whereas this would not occur using byte compiled Java code.

    26.10.8 Adding an equals method to the Java classes

    When a pointer is returned from a JNI function, it is wrapped using a new Java proxy class or type wrapper class. Even when the pointers are the same, it will not be possible to know that the two Java classes containing those pointers are actually the same object. It is common in Java to use the equals() method to check whether two objects are equivalent. The equals() method is usually accompanied by a hashCode() method in order to fulfill the requirement that the hash code is equal for equal objects. Pure Java code methods like these can be easily added:

    %typemap(javacode) SWIGTYPE %{
      public boolean equals(Object obj) {
        boolean equal = false;
        if (obj instanceof $javaclassname)
          equal = ((($javaclassname)obj).swigCPtr == this.swigCPtr);
        return equal;
      }
      public int hashCode() {
        return (int)getPointer();
      }
    %}
    
    class Foo { };
    Foo* returnFoo(Foo *foo) { return foo; }
    

    The following would display false without the javacode typemap above. With the typemap defining the equals method the result is true.

    Foo foo1 = new Foo();
    Foo foo2 = example.returnFoo(foo1);
    System.out.println("foo1? " + foo1.equals(foo2));
    

    26.10.9 Void pointers and a common Java base class

    One might wonder why the common code that SWIG emits for the proxy and type wrapper classes is not pushed into a base class. The reason is that although swigCPtr could be put into a common base class for all classes wrapping C structures, it would not work for C++ classes involved in an inheritance chain. Each class derived from a base needs a separate swigCPtr because C++ compilers sometimes use a different pointer value when casting a derived class to a base. Additionally as Java only supports single inheritance, it would not be possible to derive wrapped classes from your own pure Java classes if the base class has been 'used up' by SWIG. However, you may want to move some of the common code into a base class. Here is an example which uses a common base class for all proxy classes and type wrapper classes:

    %typemap(javabase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], 
                                                             SWIGTYPE (CLASS::*) "SWIG"
    
    %typemap(javacode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], 
                                                             SWIGTYPE (CLASS::*) %{
      protected long getPointer() {
        return swigCPtr;
      }
    %}
    

    Define new base class called SWIG:

    public abstract class SWIG {
      protected abstract long getPointer();
    
      public boolean equals(Object obj) {
        boolean equal = false;
        if (obj instanceof SWIG)
          equal = (((SWIG)obj).getPointer() == this.getPointer());
        return equal;
      }
      
      SWIGTYPE_p_void getVoidPointer() {
        return new SWIGTYPE_p_void(getPointer(), false);
      }
    }
    

    This example contains some useful functionality which you may want in your code.

    • It has an equals() method. Unlike the previous example, the method code isn't replicated in all classes.
    • It also has a function which effectively implements a cast from the type of the proxy/type wrapper class to a void pointer. This is necessary for passing a proxy class or a type wrapper class to a function that takes a void pointer.

    26.10.10 Struct pointer to pointer

    Pointers to pointers are often used as output parameters in C factory type functions. These are a bit more tricky to handle. Consider the following situation where a Butler can be hired and fired:

    typedef struct {
      int hoursAvailable;
      char *greeting;
    } Butler;
    
    // Note: HireButler will allocate the memory 
    // The caller must free the memory by calling FireButler()!!
    extern int HireButler(Butler **ppButler);
    extern void FireButler(Butler *pButler);
    

    C code implementation:

    int HireButler(Butler **ppButler) {
      Butler *pButler = (Butler *)malloc(sizeof(Butler));
      pButler->hoursAvailable = 24;
      pButler->greeting = (char *)malloc(32);
      strcpy(pButler->greeting, "At your service Sir");
      *ppButler = pButler;
      return 1;
    }
    void FireButler(Butler *pButler) {
      free(pButler->greeting);
      free(pButler);
    }
    

    Let's take two approaches to wrapping this code. The first is to provide a functional interface, much like the original C interface. The following Java code shows how we intend the code to be used:

    Butler jeeves = new Butler();
    example.HireButler(jeeves);
    System.out.println("Greeting:     " + jeeves.getGreeting());
    System.out.println("Availability: " + jeeves.getHoursAvailable() + " hours per day");
    example.FireButler(jeeves);
    

    Resulting in the following output when run:

    Greeting:     At your service Sir
    Availability: 24 hours per day
    

    Note the usage is very much like it would be used if we were writing C code, that is, explicit memory management is needed. No C memory is allocated in the construction of the Butler proxy class and the proxy class will not destroy the underlying C memory when it is collected. A number of typemaps and features are needed to implement this approach. The following interface file code should be placed before SWIG parses the above C code.

    %module example
    
    // Do not generate the default proxy constructor or destructor
    %nodefaultctor Butler;
    %nodefaultdtor Butler;
    
    // Add in pure Java code proxy constructor
    %typemap(javacode) Butler %{
      /** This constructor creates the proxy which initially does not create nor own any C memory */
      public Butler() {
        this(0, false);
      }
    %}
    
    // Type typemaps for marshalling Butler **
    %typemap(jni) Butler ** "jobject"
    %typemap(jtype) Butler ** "Butler"
    %typemap(jstype) Butler ** "Butler"
    
    // Typemaps for Butler ** as a parameter output type
    %typemap(in) Butler ** (Butler *ppButler = 0) %{
      $1 = &ppButler;
    %}
    %typemap(argout) Butler ** {
      // Give Java proxy the C pointer (of newly created object)
      jclass clazz = (*jenv)->FindClass(jenv, "Butler");
      jfieldID fid = (*jenv)->GetFieldID(jenv, clazz, "swigCPtr", "J");
      jlong cPtr = 0;
      *(Butler **)&cPtr = *$1;
      (*jenv)->SetLongField(jenv, $input, fid, cPtr);
    }
    %typemap(javain) Butler ** "$javainput"
    

    Note that the JNI code sets the proxy's swigCPtr member variable to point to the newly created object. The swigCMemOwn remains unchanged (at false), so that the proxy does not own the memory.

    Note: The old %nodefault directive disabled the default constructor and destructor at the same time. This is unsafe in most of the cases, and you can use the explicit %nodefaultctor and %nodefaultdtor directives to achieve the same result if needed.

    The second approach offers a more object oriented interface to the Java user. We do this by making the Java proxy class's constructor call the HireButler() method to create the underlying C object. Additionally we get the proxy to take ownership of the memory so that the finalizer will call the FireButler() function. The proxy class will thus take ownership of the memory and clean it up when no longer needed. We will also prevent the user from being able to explicitly call the HireButler() and FireButler() functions. Usage from Java will simply be:

    Butler jeeves = new Butler();
    System.out.println("Greeting:     " + jeeves.getGreeting());
    System.out.println("Availability: " + jeeves.getHoursAvailable() + " hours per day");
    

    Note that the Butler class is used just like any other Java class and no extra coding by the user needs to be written to clear up the underlying C memory as the finalizer will be called by the garbage collector which in turn will call the FireButler() function. To implement this, we use the above interface file code but remove the javacode typemap and add the following:

    // Don't expose the memory allocation/de-allocation functions
    %ignore FireButler(Butler *pButler);
    %ignore HireButler(Butler **ppButler);
    
    // Add in a custom proxy constructor and destructor
    %extend Butler {
      Butler() {
        Butler *pButler = 0;
        HireButler(&pButler);
        return pButler;
      }
      ~Butler() {
        FireButler($self);
      }
    }
    

    Note that the code in %extend is using a C++ type constructor and destructor, yet the generated code will still compile as C code, see Adding member functions to C structures. The C functional interface has been completely morphed into an object-oriented interface and the Butler class would behave much like any pure Java class and feel more natural to Java users.

    26.10.11 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable.

    Consider the following C++ code:

    struct Wheel {
      int size;
      Wheel(int sz = 0) : size(sz) {}
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from Java after running the code through SWIG:

    Wheel wheel = new Bike(10).getWheel();
    System.out.println("wheel size: " + wheel.getSize());
    // Simulate a garbage collection
    System.gc();
    System.runFinalization();
    System.out.println("wheel size: " + wheel.getSize());
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance a reference to the Bike must be added to the wheel instance. You can do this by adding the reference when the getWheel() method is called using the following typemaps.

    %typemap(javacode) Wheel %{
      // Ensure that the GC doesn't collect any Bike instance set from Java
      private Bike bikeReference;
      protected void addReference(Bike bike) {
        bikeReference = bike;
      }
    %}
    
    // Add a Java reference to prevent premature garbage collection and resulting use
    // of dangling C++ pointer. Intended for methods that return pointers or
    // references to a member variable.
    %typemap(javaout) Wheel& getWheel {
      long cPtr = $jnicall;
      $javaclassname ret = null;
      if (cPtr != 0) {
        ret = new $javaclassname(cPtr, $owner);
        ret.addReference(this);
      }
      return ret;
      }
    

    The code in the first typemap gets added to the Wheel proxy class. The code in the second typemap constitutes the bulk of the code in the generated getWheel() function:

    public class Wheel {
      ...
      // Ensure that the GC doesn't collect any bike set from Java 
      private Bike bikeReference;
      protected void addReference(Bike bike) {
        bikeReference = bike;
      }
    }
    
    public class Bike {
      ...
      public Wheel getWheel() {
        long cPtr = exampleJNI.Bike_getWheel(swigCPtr, this);
        Wheel ret = null;
        if (cPtr != 0) {
          ret = new Wheel(cPtr, false);
          ret.addReference(this);
        }
        return ret;
      }
    }
    

    Note the addReference call.

    26.10.12 Memory management for objects passed to the C++ layer

    Managing memory can be tricky when using C++ and Java proxy classes. The previous example shows one such case and this example looks at memory management for a class passed to a C++ method which expects the object to remain in scope after the function has returned. Consider the following two C++ classes:

    struct Element {
      int value;
      Element(int val) : value(val) {}
    };
    class Container {
      Element* element;
    public:
      Container() : element(0) {}
      void setElement(Element* e) { element = e; }
      Element* getElement() { return element; }
    };
    

    and usage from C++

    Container container;
    Element element(20);
    container.setElement(&element);
    cout << "element.value: " << container.getElement()->value << endl;
    

    and more or less equivalent usage from Java

    Container container = new Container();
    container.setElement(new Element(20));
    System.out.println("element value: " + container.getElement().getValue());
    

    The C++ code will always print out 20, but the value printed out may not be this in the Java equivalent code. In order to understand why, consider a garbage collection occurring...

    Container container = new Container();
    container.setElement(new Element(20));
    // Simulate a garbage collection
    System.gc();
    System.runFinalization();
    System.out.println("element value: " + container.getElement().getValue());
    

    The temporary element created with new Element(20) could get garbage collected which ultimately means the container variable is holding a dangling pointer, thereby printing out any old random value instead of the expected value of 20. One solution is to add in the appropriate references in the Java layer...

    public class Container {
    
      ...
    
      // Ensure that the GC doesn't collect any Element set from Java
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    
      public void setElement(Element e) {
        exampleJNI.Container_setElement(swigCPtr, this, Element.getCPtr(e), e);
        elementReference = e;
      }
    }
    

    The following typemaps can be used to generate this code:

    %typemap(javacode) Container %{
      // Ensure that the GC doesn't collect any element set from Java
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    %}
    
    %typemap(javain, 
             post="      elementReference = $javainput;"
             ) Element *e "Element.getCPtr($javainput)"
    

    The 'javacode' typemap simply adds in the specified code into the Java proxy class. The 'javain' typemap matches the input parameter type and name for the setElement method and the 'post' typemap attribute allows adding code after the JNI call. The 'post' code is generated into a finally block after the JNI call so the resulting code isn't quite as mentioned earlier, setElement is actually:

      public void setElement(Element e) {
        try {
          exampleJNI.Container_setElement(swigCPtr, this, Element.getCPtr(e), e);
        } finally {
          elementReference = e;
        }
      }
    

    26.10.13 Date marshalling using the javain typemap and associated attributes

    The NaN Exception example is a simple example of the "javain" typemap and its 'pre' attribute. This example demonstrates how a C++ date class, say CDate, can be mapped onto the standard Java date class, java.util.GregorianCalendar by using the 'pre', 'post' and 'pgcppname' attributes of the "javain" typemap. The idea is that the GregorianCalendar is used wherever the C++ API uses a CDate. Let's assume the code being wrapped is as follows:

    class CDate {
    public:
      CDate(int year, int month, int day);
      int getYear();
      int getMonth();
      int getDay();
      ...
    };
    struct Action {
      static int doSomething(const CDate &dateIn, CDate &dateOut);
      Action(const CDate &date, CDate &dateOut);
    };
    

    Note that dateIn is const and therefore read only and dateOut is a non-const output type.

    First let's look at the code that is generated by default, where the Java proxy class CDate is used in the proxy interface:

    public class Action {
      ...
      public static int doSomething(CDate dateIn, CDate dateOut) {
        return exampleJNI.Action_doSomething(CDate.getCPtr(dateIn), dateIn, 
                                             CDate.getCPtr(dateOut), dateOut);
      }
    
      public Action(CDate date, CDate dateOut) {
        this(exampleJNI.new_Action(CDate.getCPtr(date), date, 
                                   CDate.getCPtr(dateOut), dateOut), true);
      }
    }
    

    The CDate & and const CDate & Java code is generated from the following two default typemaps:

    %typemap(jstype) SWIGTYPE & "$javaclassname"
    %typemap(javain) SWIGTYPE & "$javaclassname.getCPtr($javainput)"
    

    where '$javaclassname' is translated into the proxy class name, CDate and '$javainput' is translated into the name of the parameter, eg dateIn. From Java, the intention is then to call into a modified API with something like:

    java.util.GregorianCalendar calendarIn = 
      new java.util.GregorianCalendar(2011, java.util.Calendar.APRIL, 13, 0, 0, 0);
    java.util.GregorianCalendar calendarOut = new java.util.GregorianCalendar();
    
    // Note in calls below, calendarIn remains unchanged and calendarOut 
    // is set to a new value by the C++ call
    Action.doSomething(calendarIn, calendarOut);
    Action action = new Action(calendarIn, calendarOut);
    

    To achieve this mapping, we need to alter the default code generation slightly so that at the Java layer, a GregorianCalendar is converted into a CDate. The JNI intermediary layer will still take a pointer to the underlying CDate class. The typemaps to achieve this are shown below.

    %typemap(jstype) const CDate& "java.util.GregorianCalendar"
    %typemap(javain, 
             pre="    CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), "
                 "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", 
             pgcppname="temp$javainput") const CDate &
             "$javaclassname.getCPtr(temp$javainput)"
    
    %typemap(jstype) CDate& "java.util.Calendar"
    %typemap(javain, 
             pre="    CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), "
                 "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", 
             post="      $javainput.set(temp$javainput.getYear(), temp$javainput.getMonth(), "
                  "temp$javainput.getDay(), 0, 0, 0);", 
             pgcppname="temp$javainput") CDate &
             "$javaclassname.getCPtr(temp$javainput)"
    

    The resulting generated proxy code in the Action class follows:

    public class Action {
      ...
      public static int doSomething(java.util.GregorianCalendar dateIn, 
                                    java.util.Calendar dateOut) {
        CDate tempdateIn = new CDate(dateIn.get(java.util.Calendar.YEAR), 
                                     dateIn.get(java.util.Calendar.MONTH), 
                                     dateIn.get(java.util.Calendar.DATE));
        CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), 
                                      dateOut.get(java.util.Calendar.MONTH), 
                                      dateOut.get(java.util.Calendar.DATE));
        try {
          return exampleJNI.Action_doSomething(CDate.getCPtr(tempdateIn), tempdateIn, 
                                               CDate.getCPtr(tempdateOut), tempdateOut);
        } finally {
          dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      static private long SwigConstructAction(java.util.GregorianCalendar date, 
                                              java.util.Calendar dateOut) {
        CDate tempdate = new CDate(date.get(java.util.Calendar.YEAR), 
                                   date.get(java.util.Calendar.MONTH), 
                                   date.get(java.util.Calendar.DATE));
        CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), 
                                      dateOut.get(java.util.Calendar.MONTH), 
                                      dateOut.get(java.util.Calendar.DATE));
        try {
          return exampleJNI.new_Action(CDate.getCPtr(tempdate), tempdate, 
                                       CDate.getCPtr(tempdateOut), tempdateOut);
        } finally {
          dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      public Action(java.util.GregorianCalendar date, java.util.Calendar dateOut) {
        this(Action.SwigConstructAction(date, dateOut), true);
      }
    }
    

    A few things to note:

    • The "javatype" typemap has changed the parameter type to java.util.GregorianCalendar or java.util.Calendar instead of the default generated CDate proxy.
    • The code in the 'pre' attribute appears before the JNI call (exampleJNI.new_Action / exampleJNI.Action_doSomething).
    • The code in the 'post' attribute appears after the JNI call.
    • A try .. finally block is generated with the JNI call in the try block and 'post' code in the finally block. The alternative of just using a temporary variable for the return value from the JNI call and the 'post' code being generated before the return statement is not possible given that the JNI call is in one line and comes from the "javaout" typemap.
    • The temporary variables in the "javain" typemaps are called temp$javain, where "$javain" is replaced with the parameter name. "$javain" is used to mangle the variable name so that more than one CDate & type can be used as a parameter in a method, otherwise two or more local variables with the same name would be generated.
    • The use of the "javain" typemap causes a constructor helper function (SwigConstructAction) to be generated. This allows Java code to be called before the JNI call and is required as the Java compiler won't compile code inserted before the 'this' call.
    • The 'pgcppname' attribute is used to modify the object being passed as the premature garbage collection prevention parameter (the 2nd and 4th parameters in the JNI calls).

    26.11 Living with Java Directors

    This section is intended to address frequently asked questions and frequently encountered problems when using Java directors.

    1. When my program starts up, it complains that method_foo cannot be found in a Java method called swig_module_init. How do I fix this?

      Open up the C++ wrapper source code file and look for "method_foo" (include the double quotes, they are important!) Look at the JNI field descriptor and make sure that each class that occurs in the descriptor has the correct package name in front of it. If the package name is incorrect, put a "javapackage" typemap in your SWIG interface file.

    2. I'm compiling my code and I'm using templates. I provided a javapackage typemap, but SWIG doesn't generate the right JNI field descriptor.

      Use the template's renamed name as the argument to the "javapackage" typemap:

      %typemap(javapackage)  std::vector<int>  "your.package.here"
      %template(VectorOfInt) std::vector<int>;
      
    3. When I pass class pointers or references through a C++ upcall and I try to type cast them, Java complains with a ClassCastException. What am I doing wrong?

      Normally, a non-director generated Java proxy class creates temporary Java objects as follows:

      public static void MyClass_method_upcall(MyClass self, long jarg1)
      {
        Foo darg1 = new Foo(jarg1, false);
      
        self.method_upcall(darg1);
      }
      

      Unfortunately, this loses the Java type information that is part of the underlying Foo director proxy class's Java object pointer causing the type cast to fail. The SWIG Java module's director code attempts to correct the problem, but only for director-enabled classes, since the director class retains a global reference to its Java object. Thus, for director-enabled classes and only for director-enabled classes, the generated proxy Java code looks something like:

      public static void MyClass_method_upcall(MyClass self, long jarg1,
                                               Foo jarg1_object)
      {
        Foo darg1 = (jarg1_object != null ? jarg1_object : new Foo(jarg1, false));
      
        self.method_upcall(darg1);
      }
      

      When you import a SWIG interface file containing class definitions, the classes you want to be director-enabled must be have the feature("director") enabled for type symmetry to work. This applies even when the class being wrapped isn't a director-enabled class but takes parameters that are director-enabled classes.

      The current "type symmetry" design will work for simple C++ inheritance, but will most likely fail for anything more complicated such as tree or diamond C++ inheritance hierarchies. Those who are interested in challenging problems are more than welcome to hack the Java::Java_director_declaration method in Source/Modules/java.cxx.

      If all else fails, you can use the downcastXXXXX() method to attempt to recover the director class's Java object pointer. For the Java Foo proxy class, the Foo director class's java object pointer can be accessed through the javaObjectFoo() method. The generated method's signature is:

        public static Foo javaObjectFoo(Foo obj);
      

      From your code, this method is invoked as follows:

      public class MyClassDerived {
        public void method_upcall(Foo foo_object)
        {
          FooDerived    derived = (foo_object != null ?
                       (FooDerived) Foo.downcastFoo(foo_object) : null);
          /* rest of your code here */
        }
      }
      

      An good approach for managing downcasting is placing a static method in each derived class that performs the downcast from the superclass, e.g.,

      public class FooDerived extends Foo {
        /* ... */
        public static FooDerived downcastFooDerived(Foo foo_object)
        {
          try {
            return foo_object != null ? (FooDerived) Foo.downcastFoo(foo_object);
          }
      
          catch (ClassCastException exc) {
            // Wasn't a FooDerived object, some other subclass of Foo
            return null;
          }
        }
      }
      

      Then change the code in MyClassDerived as follows:

      public class MyClassDerived extends MyClass {
        /* ... */
        public void method_upcall(Foo foo_object)
        {
          FooDerived    derived = FooDerived.downcastFooDerived(foo_object);
          /* rest of your code here */
        }
      }
      
    4. Why isn't the proxy class declared abstract? Why aren't the director upcall methods in the proxy class declared abstract?

      Declaring the proxy class and its methods abstract would break the JNI argument marshalling and SWIG's downcall functionality (going from Java to C++.) Create an abstract Java subclass that inherits from the director-enabled class instead. Using the previous Foo class example:

      public abstract class UserVisibleFoo extends Foo {
        /** Make sure user overrides this method, it's where the upcall
         * happens.
         */
        public abstract void method_upcall(Foo foo_object);
      
        /// Downcast from Foo to UserVisibleFoo
        public static UserVisibleFoo downcastUserVisibleFoo(Foo foo_object)
        {
          try {
            return foo_object != null ? (FooDerived) Foo.downcastFoo(foo_object) : null;
          } catch (ClassCastException exc) {
            // Wasn't a FooDerived object, some other subclass of Foo
            return null;
          }
        }
      }
      

      This doesn't prevent the user from creating subclasses derived from Foo, however, UserVisibleFoo provides the safety net that reminds the user to override the method_upcall() method.

    26.12 Odds and ends

    26.12.1 JavaDoc comments

    The SWIG documentation system is currently deprecated. When it is resurrected JavaDoc comments will be fully supported. If you can't wait for the full documentation system a couple of workarounds are available. The %javamethodmodifiers feature can be used for adding proxy class method comments and module class method comments. The "javaimports" typemap can be hijacked for adding in proxy class JavaDoc comments. The jniclassimports or jniclassclassmodifiers pragmas can also be used for adding intermediary JNI class comments and likewise the moduleimports or moduleclassmodifiers pragmas for the module class. Here is an example adding in a proxy class and method comment:

    %javamethodmodifiers Barmy::lose_marbles() "
      /**
        * Calling this method will make you mad.
        * Use with <b>utmost</b> caution. 
        */
      public";
    
    %typemap(javaimports) Barmy "
    /** The crazy class. Use as a last resort. */"
    
    class Barmy {
    public:
      void lose_marbles() {}
    };
    

    Note the "public" added at the end of the %javamethodmodifiers as this is the default for this feature. The generated proxy class with JavaDoc comments is then as follows:

    /** The crazy class. Use as a last resort. */
    public class Barmy {
    ...
      /**
        * Calling this method will make you mad.
        * Use with <b>utmost</b> caution. 
        */
      public void lose_marbles() {
        ...
      }
    ...
    }
    

    26.12.2 Functional interface without proxy classes

    It is possible to run SWIG in a mode that does not produce proxy classes by using the -noproxy commandline option. The interface is rather primitive when wrapping structures or classes and is accessed through function calls to the module class. All the functions in the module class are wrapped by functions with identical names as those in the intermediary JNI class.

    Consider the example we looked at when examining proxy classes:

    class Foo {
    public:
      int x;
      int spam(int num, Foo* foo);
    };
    

    When using -noproxy, type wrapper classes are generated instead of proxy classes. Access to all the functions and variables is through a C like set of functions where the first parameter passed is the pointer to the class, that is an instance of a type wrapper class. Here is what the module class looks like:

    public class example {
      public static void Foo_x_get(SWIGTYPE_p_Foo self, int x) {...}
      public static int Foo_x_get(SWIGTYPE_p_Foo self) {...}
      public static int Foo_spam(SWIGTYPE_p_Foo self, int num, SWIGTYPE_p_Foo foo) {...}
      public static SWIGTYPE_p_Foo new_Foo() {...}
      public static void delete_Foo(SWIGTYPE_p_Foo self) {...}
    }
    

    This approach is not nearly as natural as using proxy classes as the functions need to be used like this:

    SWIGTYPE_p_Foo foo = example.new_Foo();
    example.Foo_x_set(foo, 10);
    int var = example.Foo_x_get(foo);
    example.Foo_spam(foo, 20, foo);
    example.delete_Foo(foo);
    

    Unlike proxy classes, there is no attempt at tracking memory. All destructors have to be called manually for example the delete_Foo(foo) call above.

    26.12.3 Using your own JNI functions

    You may have some hand written JNI functions that you want to use in addition to the SWIG generated JNI functions. Adding these to your SWIG generated package is possible using the %native directive. If you don't want SWIG to wrap your JNI function then of course you can simply use the %ignore directive. However, if you want SWIG to generate just the Java code for a JNI function then use the %native directive. The C types for the parameters and return type must be specified in place of the JNI types and the function name must be the native method name. For example:

    %native (HandRolled) void HandRolled(int, char *);
    %{
    JNIEXPORT void JNICALL Java_packageName_moduleName_HandRolled(JNIEnv *, jclass,
                                                                  jlong, jstring);
    %}
    

    No C JNI function will be generated and the Java_packageName_moduleName_HandRolled function will be accessible using the SWIG generated Java native method call in the intermediary JNI class which will look like this:

      public final static native void HandRolled(int jarg1, String jarg2);
    

    and as usual this function is wrapped by another which for a global C function would appear in the module class:

      public static void HandRolled(int arg0, String arg1) {
        exampleJNI.HandRolled(arg0, arg1);
      }
    

    The packageName and moduleName must of course be correct else you will get linker errors when the JVM dynamically loads the JNI function. You may have to add in some "jtype", "jstype", "javain" and "javaout" typemaps when wrapping some JNI types. Here the default typemaps work for int and char *.

    In summary the %native directive is telling SWIG to generate the Java code to access the JNI C code, but not the JNI C function itself. This directive is only really useful if you want to mix your own hand crafted JNI code and the SWIG generated code into one Java class or package.

    26.12.4 Performance concerns and hints

    If you're directly manipulating huge arrays of complex objects from Java, performance may suffer greatly when using the array functions in arrays_java.i. Try and minimise the expensive JNI calls to C/C++ functions, perhaps by using temporary Java variables instead of accessing the information directly from the C/C++ object.

    Java classes without any finalizers generally speed up code execution as there is less for the garbage collector to do. Finalizer generation can be stopped by using an empty javafinalize typemap:

    %typemap(javafinalize) SWIGTYPE ""
    

    However, you will have to be careful about memory management and make sure that you code in a call to the delete() member function. This method normally calls the C++ destructor or free() for C code.

    26.12.5 Debugging

    The generated code can be debugged using both a Java debugger and a C++ debugger using the usual debugging techniques. Breakpoints can be set in either Java or C++ code and so both can be debugged simultaneously. Most debuggers do not understand both Java and C++, with one noteable exception of Sun Studio, where it is possible to step from Java code into a JNI method within one environment.

    Alternatively, debugging can involve placing debug printout statements in the JNI layer using the %exception directive. See the special variables for %exception section. Many of the default typemaps can also be overridden and modified for adding in extra logging/debug display information.

    The -Xcheck:jni and -Xcheck:nabounds Java executable options are useful for debugging to make sure the JNI code is behaving. The -verbose:jni and -verbose:gc are also useful options for monitoring code behaviour.

    26.13 Java Examples

    The directory Examples/java has a number of further examples. Take a look at these if you want to see some of the techniques described in action. The Examples/index.html file in the parent directory contains the SWIG Examples Documentation and is a useful starting point. If your SWIG installation went well Unix users should be able to type make in each example directory, then java main to see them running. For the benefit of Windows users, there are also Visual C++ project files in a couple of the Windows Examples. There are also many regression tests in the Examples/test-suite directory. Many of these have runtime tests in the java subdirectory.

    swig-4.0.2/Doc/Manual/Scilab.html0000644000175000017500000015045513667507563016405 0ustar williamwilliam SWIG and Scilab

    35 SWIG and Scilab

    Scilab is a scientific software package for numerical computations providing a powerful open computing environment for engineering and scientific applications that is mostly compatible with MATLAB. More information can be found at www.scilab.org.

    This chapter explains how to use SWIG for Scilab. After this introduction, you should be able to generate with SWIG a Scilab external module from a C/C++ library.

    35.1 Preliminaries

    SWIG for Scilab supports Linux. Other operating systems haven't been tested.

    Scilab is supported from version 5.3.3 onwards. The forthcoming version 6, as of January 2015, is also supported.

    SWIG for Scilab supports C language. C++ is partially supported. See A basic tour of C/C++ wrapping for further details.

    35.2 Running SWIG

    Let's see how to use SWIG for Scilab on a small example.
    In this example we bind from C a function and a global variable into Scilab. The SWIG interface (stored in a file named example.i), is the following:

    %module example
    
    %inline %{
    double Foo = 3.0;
    
    int fact(int n) {
      if (n < 0) {
        return 0;
      }
      else if (n == 0) {
        return 1;
      }
      else {
        return n * fact(n-1);
      }
    }
    %}
    

    Note: a code in an %inline section is both parsed and wrapped by SWIG, and inserted as is in the wrapper source file.

    35.2.1 Generating the module

    The module is generated using the swig executable and its -scilab option.

    $ swig -scilab example.i
    

    This command generates two files:

    • example_wrap.c: a C source file containing the wrapping code and also here the wrapped code (the fact() and Foo definitions)
    • loader.sce: a Scilab script used to load the module into Scilab

    Note: if the following error is returned:

    :1: Error: Unable to find 'swig.swg'
    :3: Error: Unable to find 'scilab.swg'
    

    it may be because the SWIG library is not found. Check the SWIG_LIB environment variable or your SWIG installation.

    Note: SWIG for Scilab can work in two modes related to the way the module is built, see the Building modes section for details. This example uses the builder mode.

    The swig executable has several other command line options you can use. See Scilab command line options for further details.

    35.2.2 Building the module

    To be loaded in Scilab, the wrapper has to be built into a dynamic module (or shared library).

    The commands to compile and link the wrapper (with gcc) into the shared library libexample.so are:

    $ gcc -fPIC -c -I/usr/local/include/scilab example_wrap.c
    $ gcc -shared example_wrap.o -o libexample.so
    

    Note: we supposed in this example that the path to the Scilab include directory is /usr/local/include/scilab (which is the case in a Debian environment), this should be changed for another environment.

    35.2.3 Loading the module

    Loading a module is done by running the loader script in Scilab:

    --> exec loader.sce
    

    Scilab should output the following messages:

    Shared archive loaded.
    Link done.
    

    which means that Scilab has successfully loaded the shared library. The module functions and other symbols are now available in Scilab.

    35.2.4 Using the module

    In Scilab, the function fact() is simply called as following:

    --> fact(5)
    ans  =
    
        120.
    

    For the Foo global variable, the accessors need to be used:

    --> Foo_get
    ans  =
    
        3.
    
    --> Foo_set(4);
    
    --> Foo_get
    ans  =
    
        4.
    

    Note: for conciseness, we assume in the subsequent Scilab code examples that the modules have been beforehand built and loaded in Scilab.

    35.2.5 Scilab command line options

    The following table lists the Scilab specific command line options in addition to the generic SWIG options:

    -builder Generate the Scilab builder script
    -buildercflags <cflags> Add <cflags> to the builder compiler flags
    -builderldflags <ldflags> Add <ldlags> to the builder linker flags
    -buildersources <files> Add the (comma separated) files <files> to the builder sources
    -builderverbositylevel <level> Set the build verbosity level to <level> (default 0: off, 2: high)
    -builderflagscript <file> Use the Scilab script <file> to configure the compiler and linker flags
    -gatewayxml <gateway_id> Generate the gateway XML with the given <gateway_id>
    -targetversion Generate for Scilab target (major) version

    These options can be displayed with:

    $ swig -scilab -help
    

    35.3 A basic tour of C/C++ wrapping

    35.3.1 Overview

    SWIG for Scilab provides only a low-level C interface for Scilab (see Scripting Languages for the general approach to wrapping). This means that functions, structs, classes, variables, etc... are interfaced through C functions. These C functions are mapped as Scilab functions. There are a few exceptions, such as constants and enumerations, which can be wrapped directly as Scilab variables.

    35.3.2 Identifiers

    In Scilab 5.x, identifier names are composed of 24 characters maximum (this limitation disappears from Scilab 6.0 onwards).
    By default, variable, member, and function names longer than 24 characters are truncated, and a warning is produced for each truncation.

    This can cause ambiguities, especially when wrapping structs/classes, for which the wrapped function name is composed of the struct/class name and field names. In these cases, the %rename directive can be used to choose a different Scilab name.

    Note: truncations can be disabled by specifying the target version 6 of Scilab in the targetversion argument (i.e. -targetversion 6).

    35.3.3 Functions

    Functions are wrapped as new Scilab built-in functions. For example:

    %module example
    
    %inline %{
    int fact(int n) {
      if (n > 1)
        return n * fact(n - 1);
      else
        return 1;
    }
    %}
    

    creates a built-in function fact(n) in Scilab:

    --> fact(4)
    ans  =
    
        24.
    

    35.3.3.1 Argument passing

    In the above example, the function parameter is a primitive type and is marshalled by value. So this function is wrapped without any additional customization. Argument values are converted between C types and Scilab types through type mappings. There are several default type mappings for primitive and complex types, described later in the Scilab typemaps section.

    When a parameter is not passed by value, such as a pointer or reference, SWIG does not know if it is an input, output (or both) parameter. The INPUT, OUTPUT, INOUT typemaps defined in the typemaps.i library can be used to specify this.

    Let's see this on two simple functions: sub() which has an output parameter, and inc(), which as input/output parameter:

    %module example
    
    %include <typemaps.i>
    
    extern void sub(int *INPUT, int *INPUT, int *OUTPUT);
    extern void inc(int *INOUT, int *INPUT);
    
    %{
    void sub(int *x, int *y, int *result) {
      *result = *x - *y;
    }
    void inc(int *x, int *delta) {
      *x = *x + *delta;
    }
    %}
    

    In Scilab, parameters are passed by value. The output (and inout) parameters are returned as the result of the functions:

    --> sub(5, 3)
     ans  =
    
        2.
    
    --> inc(4, 3)
     ans  =
    
        7.
    

    35.3.3.2 Multiple output arguments

    A C function can have several output parameters. They can all be returned as results of the wrapped function as Scilab supports multiple return values from a function when using the typemaps.i library. If the C function itself returns a result, this is returned first before the parameter outputs.

    The example below shows this for a C function returning 2 values and a result:

    %module example
    
    %include <typemaps.i>
    
    int divide(int n, int d, int *OUTPUT, int *OUTPUT);
    
    %{
      int divide(int n, int d, int q*, int *r) {
        if (d != 0) {
          *q = n / d;
          *r = n % d;
          return 1;
        } else {
          return 0;
        }
      }
    %}
    

    --> [ret, q, r] = divide(20, 6)
     r  =
    
        2.
     q  =
    
        3.
     ret  =
    
        1.
    

    35.3.4 Global variables

    Global variables are manipulated through generated accessor functions. For example, for a given Foo global variable, SWIG actually generates two functions: Foo_get() to get the value of Foo, and Foo_set() to set the value. These functions are used as following:

    --> exec loader.sce;
    --> c = Foo_get();
    
    --> Foo_set(4);
    
    --> c
    c =
    
        3.
    
    --> Foo_get()
    ans  =
    
        4.
    

    It works for variables of primitive type, but also for non-primitive types: arrays, and structs/classes which are described later. For now, an example with two global primitive arrays x and y is shown:

    %module example
    
    %inline %{
    int x[10];
    double y[7];
    
    void initArrays()
    {
      int i;
      for (i = 0; i < 10; i++)
        x[i] = 1;
      for (i = 0; i < 7; i++)
        y[i] = 1.0f;
    }
    %}
    

    It works the same:

    --> exec loader.sce
    
    --> initArrays();
    --> x_get()
     ans  =
    
        1.    1.    1.    1.    1.    1.    1.    1.    1.    1.
    
    --> y_set([0:6] / 10);
    --> y_get()
     ans  =
    
        0.    0.1    0.2    0.3    0.4    0.5    0.6
    

    35.3.5 Constants and enumerations

    35.3.5.1 Constants

    There is not any constant in Scilab. By default, C/C++ constants are wrapped as getter functions. For example, for the following constants:

    %module example
    #define    ICONST      42
    #define    FCONST      2.1828
    #define    CCONST      'x'
    #define    CCONST2     '\n'
    #define    SCONST      "Hello World"
    #define    SCONST2     "\"Hello World\""
    

    the following getter functions are generated:

    --> exec loader.sce;
    --> ICONST_get();
     ans  =
    
        42.
    
    --> FCONST_get();
     ans  =
    
        2.1828
    
    --> CCONST_get();
     ans  =
    
        x
    
    --> CCONST2_get();
     ans  =
    
    --> SCONST_get();
     ans  =
    
        Hello World
    
    --> SCONST2_get();
     ans  =
    
        "Hello World"
    
    --> EXPR_get();
     ans  =
    
        48.5484
    
    --> iconst_get();
     ans  =
    
        37.
    
    --> fconst_get();
     ans  =
    
        3.14
    

    There is another mode in which constants are wrapped as Scilab variables. The variables are easier to use than functions, but the drawback is that variables are not constant and so can be modified.

    This mode can be enabled/disabled at any time in the interface file with %scilabconst(), which works like all the other %feature directives. Use the argument value "1" to enable and "0" to disable this mode. For example in this mode the previous constants:

    %module example
    
    %scilabconst(1);
    #define    ICONST      42
    #define    FCONST      2.1828
    #define    CCONST      'x'
    #define    CCONST2     '\n'
    #define    SCONST      "Hello World"
    #define    SCONST2     "\"Hello World\""
    

    are mapped to Scilab variables, with the same name:

    --> exec loader.sce;
    --> ICONST
     ans  =
    
        42
    
    --> FCONST
     ans  =
    
        2.1828
    
    --> CCONST
     ans  =
    
        x
    
    --> CCONST2
     ans  =
    
    --> SCONST
     ans  =
    
        Hello World
    
    --> SCONST2
     ans  =
    
        "Hello World"
    
    --> EXPR
     ans  =
    
        48.5484
    
    --> iconst
     ans  =
    
        37
    
    --> fconst
     ans  =
    
        3.14
    

    35.3.5.2 Enumerations

    The wrapping of enums is the same as for constants. By default, enums are wrapped as getter functions. For example, with the following enumeration:

    %module example
    typedef enum { RED, BLUE, GREEN } color;
    

    a getter function will be generated for each value of the enumeration:

    --> exec loader.sce;
    --> RED_get()
     ans  =
    
        0.
    
    --> BLUE_get()
     ans  =
    
        1.
    
    --> GREEN_get()
     ans  =
    
        2.
    

    The %scilabconst() feature is also available for enumerations:

    %module example
    %scilabconst(1) color;
    typedef enum { RED, BLUE, GREEN } color;
    

    --> exec loader.sce;
    --> RED
     ans  =
    
        0.
    
    --> BLUE
     ans  =
    
        1.
    
    --> GREEN
     ans  =
    
        2.
    
    

    35.3.6 Pointers

    Pointers are supported by SWIG. A pointer can be returned from a wrapped C/C++ function, stored in a Scilab variable, and used in input argument of another C/C++ function.

    Also, thanks to the SWIG runtime which stores information about types, pointer types are tracked between exchanges Scilab and the native code. Indeed pointer types are stored alongside the pointer address. A pointer is mapped to a Scilab structure (tlist), which contains as fields the pointer address and the pointer type (in fact a pointer to the type information structure in the SWIG runtime).
    Why a native pointer is not mapped to a Scilab pointer (type name: "pointer", type ID: 128) ? The big advantage of mapping to a tlist is that it exposes a new type for the pointer in Scilab, type which can be acessed in Scilab with the typeof function, and manipulated using the overloading mechanism.

    Notes:

    • type tracking needs the SWIG runtime to be first initialized with the appropriate function (see the Module initialization section).
    • for any reason, if a wrapped pointer type is unknown (or if the SWIG runtime is not initialized), SWIG maps it to a Scilab pointer. Also, a Scilab pointer is always accepted as a pointer argument of a wrapped function. The drawaback is that pointer type is lost.

    Following is an example of the wrapping of the C FILE* pointer:

    %module example
    
    %{
    #include <stdio.h>
    %}
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    These functions can be used the same way as in C from Scilab:

    --> example_Init();
    
    --> f = fopen("junk", "w");
    --> typeof(f)
     ans  =
    
      _p_FILE
    
    --> fputs("Hello World", f);
    --> fclose(f);
    

    Note: the type name _p_FILE which means "pointer to FILE".

    The user of a pointer is responsible for freeing it or, like in the example, closing any resources associated with it (just as is required in a C program).

    35.3.6.1 Utility functions

    As a scripting language, Scilab does not provide functions to manipulate pointers. However, in some cases it can be useful, such as for testing or debugging.

    SWIG comes with two pointer utility functions:

    • SWIG_this(): returns the address value of a pointer
    • SWIG_ptr(): creates a pointer from an address value

    Note: a pointer created by SWIG_ptr() does not have any type and is mapped as a Scilab pointer.

    Following we use the utility functions on the previous example:

    --> f = fopen("junk", "w");
    --> fputs("Hello", f);
    --> addr = SWIG_this(f)
     ans  =
    
        8219088.
    
    --> p = SWIG_ptr(addr);
    --> typeof(p)
    ans  =
    
      pointer
    
    --> fputs(" World", p);
    --> fclose(f);
    

    35.3.6.2 Null pointers:

    Using the previous SWIG_this() and SWIG_ptr(), it is possible to create and check null pointers:

    --> p = SWIG_ptr(0);
    --> SWIG_this(p) == 0
     ans  =
    
        T
    

    35.3.7 Structures

    Structs exist in Scilab, but C structs are not (at least in this version of SWIG) mapped to Scilab structs. A C structure is wrapped through low-level accessor functions, i.e. functions that give access to the member variables of this structure. In Scilab, a structure is manipulated through a pointer which is passed as an argument to the accessor functions.

    Let's see it on an example of a struct with two members:

    %module example
    
    %inline %{
    
    typedef struct {
      int x;
      int arr[4];
    } Foo;
    
    %}
    

    Several functions are generated:

    • a constructor function new_Foo() which returns a pointer to a newly created struct Foo.
    • two member getter functions Foo_x_get(), Foo_arr_get(), to get the values of x and y for the struct pointer (provided as the first parameter to these functions)
    • two member setter functions Foo_x_set(), Foo_arr_set(), to set the values of x and y for the struct pointer (provided as the first parameter to these functions).
    • a destructor function delete_Foo() to release the struct pointer.

    Usage example:

    --> f = new_Foo();
    --> Foo_x_set(f, 100);
    --> Foo_x_get(f)
    ans  =
    
        100.
    
    --> Foo_arr_set(f, [0:3]);
    --> Foo_arr_get(f)
    ans  =
    
        0.    1.    2.    3.
    
    --> delete_Foo(f);
    

    Members of a structure that are also structures are also accepted and wrapped as a pointer:

    %module example
    
    %inline %{
    
    typedef struct {
      int x;
    } Bar;
    
    typedef struct {
      Bar b;
    } Foo;
    
    %}
    

    --> b = new_Bar();
    --> Bar_x_set(b, 20.);
    
    --> f = new_Foo();
    --> Foo_b_set(f, b);
    
    --> b2 = Foo_b_get(f);
    --> Bar_x_get(b2);
    ans  =
    
        20.
    

    Note: the pointer to the struct works as described in Pointers. For example, the type of the struct pointer can be get with typeof, as following:

    --> example_Init();
    --> b = new_Bar();
    --> typeof(b)
     ans  =
    
        _p_Bar
    --> delete_Bar(b);
    

    35.3.8 C++ classes

    Classes do not exist in Scilab. The classes are wrapped the same way as structs. Low-level accessor functions are generated for class members. Also, constructor and destructor functions are generated to create and destroy an instance of the class.

    For example, the following class:

    %module example
    
    %inline %{
    
    class Point {
    public:
      int x, y;
      Point(int _x, int _y) : x(_x), y(_y) {}
      double distance(const Point& rhs) {
        return sqrt(pow(x-rhs.x, 2) + pow(y-rhs.y, 2));
      }
      void set(int _x, int _y) {
        x=_x;
        y=_y;
      }
    };
    
    %}
    

    can be used in Scilab like this:

    --> p1 = Point_new(3, 5);
    --> p2 = Point_new(1, 2);
    --> p1.distance(p2)
    ans  =
    
        3.6056
    
    --> delete_Point(p1);
    --> delete_Point(p2);
    

    Note: like structs, class pointers are mapped as described in Pointers. Let's give an example which shows that each class pointer type is a new type in Scilab that can be used for example (through overloading) to implement a custom print for the Point class:

    --> function %_p_Point_p(p)
    -->     mprintf('[%d, %d]\n', Point_x_get(p), Point_y_get(p));
    --> endfunction
    
    --> example_Init();
    --> p = new_Point(1, 2)
     p  =
    
    [1, 2]
    
    --> delete_Point(p);
    

    35.3.9 C++ inheritance

    Inheritance is supported. SWIG knows the inheritance relationship between classes.

    A function is only generated for the class in which it is actually declared. But if one of its parameters is a class, any instance of a derived class is accepted as the argument.

    This mechanism also applies for accessor functions: they are generated only in the class in which they are defined. But any instance of a derived class can be used as the argument to these accessor functions.

    For example, let's take a base class Shape and two derived classes Circle and Square:

    %module example
    
    %inline %{
    
    class Shape {
    public:
      double x, y;
      void set_location(double _x, double _y) { x = _x; y = _y; }
      virtual double get_perimeter() { return 0; };
    };
    
    class Circle : public Shape {
    public:
      int radius;
      Circle(int _radius): radius(_radius) {};
      virtual double get_perimeter() { return 6.28 * radius; }
    };
    
    class Square : public Shape {
    public:
      int size;
      Square(int _size): size(_size) {};
      virtual double get_perimeter() { return 4 * size; }
    };
    
    %}
    

    To set the location of the Circle, we have to use the function set_location() of the parent Shape. But we can use either use the get_perimeter() function of the parent class or the derived class:

    --> c = new_Circle(3);
    
    --> Shape_set_location(c, 2, 3);
    --> Shape_x_get(c)
     ans  =
    
        2.
    
    --> Circle_get_perimeter(c)
     ans  =
    
        18.84
    
    --> Shape_get_perimeter(c)
     ans  =
    
        18.84
    

    35.3.10 C++ overloading

    As explained in Overloaded functions and methods SWIG provides support for overloaded functions and constructors.

    As SWIG knows pointer types, the overloading works also with pointer types, here is an example with a function magnify overloaded for the previous classes Shape and Circle:

    %module example
    
    void magnify(Square *square, double factor) {
      square->size *= factor;
    };
    
    void magnify(Circle *circle, double factor) {
      square->radius *= factor;
    };
    
    --> example_Init();
    --> c = new_Circle(3);
    --> s = new_Square(2);
    
    --> magnify(c, 10);
    --> Circle_get_radius(c)
     ans  =
    
       30;
    --> magnify(s, 10);
    --> Square_get_size(s)
     ans  =
    
       20;
    

    35.3.11 Pointers, references, values, and arrays

    In C++ objects can be passed by value, pointer, reference, or by an array:

    %module example
    
    %{
    #include <sciprint.h>
    %}
    
    %inline %{
    
    class Foo {
    public:
      Foo(int _x) : x(_x) {}
      int x;
    };
    
    void spam1(Foo *f)  { sciprint("%d\n", f->x); }   // Pass by pointer
    void spam2(Foo &f)  { sciprint("%d\n", f.x); }    // Pass by reference
    void spam3(Foo f)   { sciprint("%d\n", f.x); }    // Pass by value
    void spam4(Foo f[]) { sciprint("%d\n", f[0].x); } // Array of objects
    
    %}
    

    In SWIG, there is no real distinction between these. So in Scilab, it is perfectly legal to do this:

    --> f = new_Foo()
    --> spam1(f)
    3
    --> spam2(f)
    3
    --> spam3(f)
    3
    --> spam4(f)
    3
    

    Similar behaviour occurs for return values. For example, if you had functions like this:

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    All these functions will return a pointer to an instance of Foo. As the function spam7 returns a value, new instance of Foo has to be allocated, and a pointer on this instance is returned.

    35.3.12 C++ templates

    As in other languages, function and class templates are supported in SWIG Scilab.

    You have to tell SWIG to create wrappers for a particular template instantiation. The %template directive is used for this purpose. For example:

    %module example
    
    template<class T1, class T2, class T3>
    struct triplet {
      T1 first;
      T2 second;
      T3 third;
      triplet(const T1& a, const T2& b, const T3& c) {
        third = a; second = b; third = c;
      }
    };
    
    %template(IntTriplet) triplet<int, int, int>;
    

    Then in Scilab:

    --> t = new_IntTriplet(3, 4, 1);
    
    --> IntTriplet_first_get(t)
     ans  =
    
        3.
    
    --> IntTriplet_second_get(t)
     ans  =
    
        4.
    
    --> IntTriplet_third_get(t)
     ans  =
    
        1.
    
    --> delete_IntTriplet(t);
    

    More details on template support can be found in the templates documentation.

    35.3.13 C++ operators

    C++ operators are partially supported. Operator overloading exists in Scilab, but a C++ operator is not (in this version) wrapped by SWIG as a Scilab operator, but as a function. It is not automatic, you have to rename each operator (with the instruction %rename) with the suitable wrapper name.

    Let's see it with an example of class with two operators + and double():

    %module example
    
    %rename(plus) operator +;
    %rename(toDouble) operator double();
    
    %inline %{
    
    class Complex {
    public:
      Complex(double re, double im) : real(re), imag(im) {};
    
      Complex operator+(const Complex& other) {
        double result_real = real + other.real;
        double result_imaginary = imag + other.imag;
        return Complex(result_real, result_imaginary);
      }
      operator double() { return real; }
    private:
      double real;
      double imag;
    };
    
    %}
    

    --> c1 = new_Complex(3, 7);
    
    --> c2 = Complex_plus(c, new_Complex(1, 1));
    
    --> Complex_toDouble(c2)
     ans  =
    
        4.
    

    35.3.14 C++ namespaces

    SWIG is aware of C++ namespaces, but does not use it for wrappers. The module is not broken into submodules, nor do namespace appear in functions names. All the namespaces are all flattened in the module. For example with one namespace Foo:

    %module example
    
    %inline %{
    
    namespace foo {
      int fact(int n) {
        if (n > 1)
          return n * fact(n-1);
        else
          return 1;
      }
    
      struct Vector {
        double x, y, z;
      };
    };
    
    %}
    
    

    In Scilab, there is no need to the specify the Foo namespace:

    --> fact(3)
     ans  =
    
       6.
    
    --> v = new_Vector();
    --> Vector_x_set(v, 3.4);
    --> Vector_y_get(v)
     ans  =
    
       0.
    

    If your program has more than one namespace, name conflicts can be resolved using %rename. For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    Note: the nspace feature is not supported.

    35.3.15 C++ exceptions

    Scilab does not natively support exceptions, but has errors. When an exception is thrown, SWIG catches it, and sets a Scilab error. An error message is displayed in Scilab. For example:

    %module example
    
    %inline %{
    void throw_exception() throw(char const *) {
      throw "Bye world !";
    }
    %}
    

    -->throw_exception()
      !--error 999
    SWIG/Scilab: Exception (char const *) occurred: Bye world !
    

    Scilab has a try-catch mechanism (and a similar instruction execstr()) to handle exceptions. It can be used with the lasterror() function as following:

    --> execstr('throw_exception()', 'errcatch');
     ans  =
    
        999.
    
    --> lasterror()
     ans  =
    
        SWIG/Scilab: Exception (char const *) occurred: Bye world !
    

    If the function has a throw exception specification, SWIG can automatically map the exception type and set an appropriate Scilab error message. It works for a few primitive types, and also for STL exceptions (the library std_except.i has to be included to get the STL exception support):

    %module example
    
    %include <std_except.i>
    
    %inline %{
    void throw_int() throw(int) {
      throw 12;
    }
    
    void throw_stl_invalid_arg(int i) throw(std::invalid_argument) {
      if (i < 0)
        throw std::invalid_argument("argument is negative.");
    }
    %}
    

    --> throw_int();
                !--error 999
    SWIG/Scilab: Exception (int) occurred: 12
    
    -->throw_stl_invalid_arg(-1);
                              !--error 999
    SWIG/Scilab: ValueError: argument is negative.
    

    More complex or custom exception types require specific exception typemaps to be implemented in order to specifically handle a thrown type. See the SWIG C++ documentation for more details.

    35.3.16 C++ STL

    The Standard Template Library (STL) is partially supported. See STL for more details.

    35.4 Type mappings and libraries

    35.4.1 Default primitive type mappings

    The following table provides the equivalent Scilab type for C/C++ primitive types.

    C/C++ type Scilab type
    boolboolean
    charstring
    signed chardouble or int8
    unsigned chardouble or uint8
    shortdouble or int16
    unsigned shortdouble or uint16
    intdouble or int32
    unsigned intdouble or uint32
    longdouble or int32
    unsigned longdouble or uint32
    signed long longnot supported in Scilab 5.x
    unsigned long longnot supported in Scilab 5.x
    floatdouble
    doubledouble
    char * or char[]string

    Notes:

    • In Scilab the double type is far more used than any integer type. This is why integer values (int32, uint32, ...) are automatically converted to Scilab double values when marshalled from C into Scilab. Additionally on input to a C function, Scilab double values are converted into the related integer type.
    • When an integer is expected, if the input is a double, the value must be an integer, i.e. it must not have any decimal part, otherwise a SWIG value error occurs.
    • In SWIG for Scilab 5.x, the long long type is not supported, since Scilab 5.x does not have a 64-bit integer type. The default behaviour is for SWIG to generate code that will give a runtime error if long long type arguments are used from Scilab.

    35.4.2 Arrays

    Typemaps are available by default for arrays. Primitive type arrays are automatically converted to/from Scilab matrices. Typemaps are also provided to handle members of a struct or class that are arrays.

    In input, the matrix is usually one-dimensional (it can be either a row or column vector). But it can also be a two-dimensional matrix. Warning: in Scilab, the values are column-major ordered, unlike in C, which is row-major ordered.

    The type mappings used for arrays is the same for primitive types, described earlier. This means that, if needed, a Scilab double vector is converted in input into the related C integer array and this C integer array is automatically converted on output into a Scilab double vector. Note that unlike scalars, no control is done for arrays when a double is converted into an integer.

    The following example illustrates all this:

    %module example
    
    %#include <stdio.h>
    
    %inline %{
    
    void printArray(int values[], int len) {
      int i = 0;
      for (i = 0; i < len; i++) {
        printf("%s %d %s", i==0?"[":"", values[i], i==len-1?"]\n":"");
      }
    }
    %}
    

    --> printArray([0 1 2 3], 4)
    [ 0  1  2  3 ]
    
    --> printArray([0.2; -1.8; 2; 3.7], 4)
    [ 0  -1  2  3 ]
    
    --> printArray([0 1; 2 3], 4)
    [ 0  2  1  3 ]
    
    --> printArray([0; 1; 2; 3], 4)
    [ 0  1  2  3 ]
    

    35.4.3 Pointer-to-pointers

    There are no specific typemaps for pointer-to-pointers, they are mapped as pointers in Scilab.

    Pointer-to-pointers are sometimes used to implement matrices in C. The following is an example of this:

    %module example
    %inline %{
    
    // Returns the matrix [1 2; 3 4];
    double **create_matrix() {
      double **M;
      int i;
      M = (double **) malloc(2 * sizeof(double *));
      for (i = 0; i < 2; i++) {
        M[i] = (double *) malloc(2 * sizeof(double));
        M[i][0] = 2 * i + 1;
        M[i][1] = 2 * i + 2;
      }
      return M;
    }
    
    // Gets the item M(i, j) value
    double get_matrix(double **M, int i, int j) {
      return M[i][j];
    }
    
    // Sets the item M(i, j) value to be val
    void set_matrix(double **M, int i, int j, double val) {
      M[i][j] = val;
    }
    
    // Prints a matrix (2, 2) to console
    void print_matrix(double **M, int nbRows, int nbCols) {
      int i, j;
      for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++) {
          printf("%3g ", M[i][j]);
        }
        printf("\n");
      }
    }
    
    %}
    

    These functions are used like this in Scilab:

    --> m = create_matrix();
    
    --> print_matrix(m);
       1.   2.
       3.   4.
    
    --> set_matrix(m, 1, 1, 5.);
    
    --> get_matrix(m, 1, 1)
     ans  =
    
        5.
    

    35.4.4 Matrices

    The matrix.i library provides a set of typemaps which can be useful when working with one-dimensional and two-dimensional matrices.

    In order to use this library, just include it in the interface file:

      %include <matrix.i>
    

    Several typemaps are available for the common Scilab matrix types:

    • double
    • int
    • char *
    • bool

    For example: for a matrix of int, we have the typemaps, for input:

    • (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT)
    • (int IN_ROWCOUNT, int IN_COLCOUNT, int *IN)
    • (int *IN, int IN_SIZE)
    • (int IN_SIZE, int *IN)

    and output:

    • (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT)
    • (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT)
    • (int **OUT, int *OUT_SIZE)
    • (int *OUT_SIZE, int **OUT)

    They marshall a Scilab matrix type into the appropriate 2 or 3 C parameters. The following is an example using the typemaps in this library:

    %module example
    
    %include <matrix.i>
    
    %apply (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { (int *matrix, int matrixNbRow, int matrixNbCol) };
    %apply (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { (int **outMatrix, int *outMatrixNbRow, int *outMatrixNbCol) };
    
    %inline %{
    
    void absolute(int *matrix, int matrixNbRow, int matrixNbCol,
      int **outMatrix, int *outMatrixNbRow, int *outMatrixNbCol) {
      int i, j;
      *outMatrixNbRow = matrixNbRow;
      *outMatrixNbCol = matrixNbCol;
      *outMatrix = malloc(matrixNbRow * matrixNbCol * sizeof(int));
      for (i=0; i < matrixNbRow * matrixNbCol; i++) {
        (*outMatrix)[i] = matrix[i] > 0 ? matrix[i]:-matrix[i];
      }
    }
    
    %}
    

    --> absolute([-0 1 -2; 3 4 -5])
     ans  =
    
        0.    1.    2.
        3.    4.    5.
    

    The remarks made earlier for arrays also apply here:

    • The values of matrices in Scilab are column-major orderered,
    • There is no control while converting double values to integers, double values are truncated without any checking or warning.

    35.4.5 STL

    The STL library wraps some containers defined in the STL (Standard Template Library), so that they can be manipulated in Scilab. This library also provides the appropriate typemaps to use the containers in functions and variables.

    The list of wrapped sequence containers are:

    • std::vector
    • std::list
    • std::deque

    And associative containers are:

    • std::set
    • std::multiset

    Typemaps are available for the following container types:

    • double
    • float
    • int
    • string
    • bool
    • pointer

    Containers of other item types are not supported. Using them does not break compilation, but provokes a runtime error. Containers of enum are not supported yet.

    In order to use the STL, the library must first be included in the SWIG interface file:

    %include <stl.i>
    

    Then for each container used, the appropriate template must be instantiated, in the std namespace:

    namespace std {
        %template(IntVector)    vector<int>;
        %template(DoubleVector) vector<double>;
    }
    

    Additionally, the module initialization function has to be executed first in Scilab, so that all the types are known to Scilab. See the Module initialization section for more details.

    Because in Scilab matrices exist for basic types only, a sequence container of pointers is mapped to a Scilab list. For other item types (double, int, string...) the sequence container is mapped to a Scilab matrix.

    The first example below shows how to create a vector (of int) in Scilab, add some values to the vector and pass it as an argument of a function. It also shows, thanks to the typemaps, that we can also pass a Scilab matrix of values directly into the function:

    %module example
    
    %include <stl.i>
    
    namespace std {
      %template(IntVector) vector<int>;
    }
    
    %{
    #include <numeric>
    %}
    
    %inline %{
    
    double average(std::vector<int> v) {
      return std::accumulate(v.begin(), v.end(), 0.0) / v.size();
    }
    
    %}
    

    --> example_Init();
    
    --> v = new_IntVector();
    
    --> for i = 1:4
    -->     IntVector_push_back(v, i);
    --> end;
    
    --> average(v)
     ans  =
    
        2.5
    
    --> average([0 1 2 3])
     ans  =
    
        2.5
    
    --> delete_IntVector();
    

    In the second example, a set of struct (Person) is wrapped. A function performs a search in this set, and returns a subset. As one can see, the result in Scilab is a list of pointers:

    %module example
    
    %include <stl.i>
    
    %{
    #include <string>
    %}
    
    %inline %{
    
    struct Person {
      Person(std::string _name, int _age) : name(_name), age(_age) {};
      std::string name;
      int age;
    };
    typedef Person * PersonPtr;
    
    %}
    
    namespace std {
      %template(PersonPtrSet) set<PersonPtr>;
    }
    
    %inline %{
    
    std::set<PersonPtr> findPersonsByAge(std::set<PersonPtr> persons, int minAge, int maxAge) {
      std::set<PersonPtr> foundPersons;
      for (std::set<PersonPtr>::iterator it = persons.begin(); it != persons.end(); it++) {
        if (((*it)->age >= minAge) && ((*it)->age <= maxAge)) {
          foundPersons.insert(*it);
        }
      }
      return foundPersons;
    }
    
    %}
    

    --> example_Init();
    
    --> joe = new_Person("Joe", 25);
    --> susan = new_Person("Susan", 32);
    --> bill = new_Person("Bill", 50);
    
    --> p = new_PersonPtrSet();
    --> PersonPtrSet_insert(p, susan);
    --> PersonPtrSet_insert(p, joe);
    --> PersonPtrSet_insert(p, bill);
    
    --> l = findPersonsByAge(p, 20, 40);
    
    --> size(l)
     ans  =
    
        2.
    
    --> Person_name_get(l(1))
    ans  =
    
        Susan
    
    --> Person_name_get(l(2))
     ans  =
    
        Joe
    
    --> delete_PersonPtrSet(p);
    

    35.5 Module initialization

    The wrapped module contains an initialization function to:

    • initialize the SWIG runtime, needed for pointer type tracking or when working with the STL
    • initialize the module constants and enumerations declared with %scilabconst()

    This initialization function should be executed at the start of a script, before the wrapped library has to be used.

    The function has the name of the module suffixed by _Init. For example, to initialize the module example:

    --> example_Init();
    

    35.6 Building modes

    The mechanism to load an external module in Scilab is called Dynamic Link and works with dynamic modules (or shared libraries, .so files).

    To produce a dynamic module, when generating the wrapper, there are two possibilities, or build modes:

    • the nobuilder mode, this is the default mode in SWIG. The user is responsible of the build.
    • the builder mode. In this mode, Scilab is responsible of building.

    35.6.1 No-builder mode

    In this mode, used by default, SWIG generates the wrapper sources, which have to be manually compiled and linked. A loader script loader.sce is also produced, this one is executed further in Scilab to load the module.

    This mode is the best option to use when you have to integrate the module build into a larger build process.

    35.6.2 Builder mode

    In this mode, in addition to the wrapper sources, SWIG produces a builder Scilab script (builder.sce), which is executed in Scilab to build the module. In a few words, the Scilab ilib_build() command is used, which produces the shared library file, and the loader script loader.sce (and also a cleaner script cleaner.sce).

    An advantage of this mode is that it hides all the complexity of the build and other platform issues. Also it allows the module to conform to a Scilab external module convention which is that an external module should be simply built by calling a builder script.

    The builder mode is activated with the -builder SWIG option. In this mode, the following SWIG options may be used to setup the build:

    • -buildersources: to add sources to the build (several files must be separated by a comma)
    • -buildercflags: to add flags to the builder compiler flags, for example to set library dependencies include paths
    • -builderldflags: to add flags to the linker flags, for example to set library dependency names and paths

    Let's give an example how to build a module example, composed of two sources, and using a library dependency:

    • the sources are baa1.c and baa2.c (and are stored in the current directory)
    • the library is libfoo in /opt/foo (headers stored in /opt/foo/include, and shared library in /opt/foo/lib)

    The command is:

    $ swig -scilab -builder -buildercflags -I/opt/foo/include -builderldflags "-L/opt/foo/lib -lfoo" -buildersources baa1.cxx, baa2.cxx example.i
    

    35.7 Generated scripts

    In this part we give some details about the generated Scilab scripts.

    35.7.1 Builder script

    builder.sce is the name of the builder script generated by SWIG in builder mode. It contains code like this:

    ilib_name = "examplelib";
    files = ["example_wrap.c"];
    libs = [];
    table = ["fact", "_wrap_fact";"Foo_set", "_wrap_Foo_set";"Foo_get", "_wrap_Foo_get";];
    ilib_build(ilib_name, table, files, libs);
    

    ilib_build(lib_name, table, files, libs) is used to create shared libraries, and to generate a loader file used to dynamically load the shared library into Scilab.

    • ilib_name: a character string, the generic name of the library without path and extension.
    • files: string matrix containing objects files needed for shared library creation.
    • libs: string matrix containing extra libraries needed for shared library creation.
    • table: two column string matrix containing a table of pairs of 'scilab function name', 'C function name'.

    35.7.2 Loader script

    The loader script is used to load in Scilab all the module functions. When loaded, these functions can be used as other Scilab functions.

    The loader script loader.sce contains code similar to:

    // ------------------------------------------------------
    // generated by builder.sce: Please do not edit this file
    // ------------------------------------------------------
    
    libexamplelib_path = get_file_path('loader.sce');
    list_functions = [             'fact';
                'Foo_set';
                'Foo_get';
    ];
    addinter(libexamplelib_path+'/libexamplelib.so', 'libexamplelib', list_functions);
    // remove temp. variables on stack
    clear libexamplelib_path;
    clear list_functions;
    clear get_file_path;
    // ------------------------------------------------------
    

    addinter(files, spname, fcts) performs dynamic linking of a compiled C interface function.

    • files: a character string or a vector of character strings defining the object files (containing the C interface functions) to link with.
    • spname: a character string. Name of interface routine entry point.
    • fcts: vector of character strings. The name of new Scilab function.

    35.8 Other resources

    • Example use cases can be found in the Examples/scilab directory.
    • The test suite in the Examples/test-suite/scilab can be another source of useful use cases.
    • The Scilab API is used in the generated code and is a useful reference when examining the output.
    • This guide describes the Scilab external modules structure and files, in particular the files that are generated by SWIG for Scilab.
    swig-4.0.2/Doc/Manual/style.css0000644000175000017500000000302213667507523016153 0ustar williamwilliamdiv.sectiontoc { border-style: dotted; border-width: 2px; padding: 2pt; } h2 { padding: 3px; color: #000000; border-bottom: 2px solid #dddddd; } h3, h4 { margin-left: 1em; } p,li,table,dl { margin-left: 2em; margin-right: 2em; } div.indent { margin-left: 4em; margin-right: 4em; } div.code { border-style: solid; border-width: 1px; padding: 2pt; margin-left: 4em; margin-right: 4em; background-color: #F0FFFF; font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } div.targetlang { border-style: solid; border-width: 1px; padding: 2pt; margin-left: 4em; margin-right: 4em; background-color: #d7f6bb; font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } div.shell { border-style: solid; border-width: 1px; padding: 2pt; margin-left: 4em; margin-right: 4em; background-color: #DCDCDC; font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } div.diagram { border-style: solid; border-width: 1px; padding: 2pt; margin-left: 4em; margin-right: 4em; background-color: #FFEBCD; font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } div.diagram li { margin-left: 0; } ul li p { margin-left: 0; margin-right: 0; } ol li p { margin-left: 0; margin-right: 0; } dl dd p { margin-left: 0; margin-right: 0; } div.indent p { margin-left: 0; margin-right: 0; } pre, code, tt { font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } body { font-family: serif; } swig-4.0.2/Doc/Manual/Go.html0000644000175000017500000013242213667507563015547 0ustar williamwilliam SWIG and Go

    24 SWIG and Go

    This chapter describes SWIG's support of Go. For more information on the Go programming language see golang.org.

    24.1 Overview

    Go does not support direct calling of functions written in C/C++. The cgo program may be used to generate wrappers to call C code from Go, but there is no convenient way to call C++ code. SWIG fills this gap.

    There are (at least) two different Go compilers. The first is the gc compiler of the Go distribution, normally invoked via the go tool. The second Go compiler is the gccgo compiler, which is a frontend to the GCC compiler suite. The interface to C/C++ code is completely different for the two Go compilers. SWIG supports both Go compilers, selected by the -gccgo command line option.

    Go is a type-safe compiled language and the wrapper code generated by SWIG is type-safe as well. In case of type issues the build will fail and hence SWIG's runtime library and runtime type checking are not used.

    24.2 Examples

    Working examples can be found in the SWIG source tree .

    Please note that the examples in the SWIG source tree use makefiles with the .i SWIG interface file extension for backwards compatibility with Go 1.

    24.3 Running SWIG with Go

    Most Go programs are built using the go tool. Since Go 1.1 the go tool has support for SWIG. To use it, give your SWIG interface file the extension .swig (for C code) or .swigcxx (for C++ code). Put that file in a GOPATH/src directory as usual for Go sources. Put other C/C++ code in the same directory with extensions of .c and .cxx. The go build and go install commands will automatically run SWIG for you and compile the generated wrapper code. To check the SWIG command line options the go tool uses run go build -x. To access the automatically generated files run go build -work. You'll find the files under the temporary WORK directory.

    To manually generate and compile C/C++ wrapper code for Go, use the -go option with SWIG. By default SWIG will generate code for the Go compiler of the Go distribution. To generate code for gccgo, you should also use the -gccgo option.

    By default SWIG will generate files that can be used directly by go build. This requires Go 1.2 or later. Put your SWIG interface file in a directory under GOPATH/src, and give it a name that does not end in the .swig or .swigcxx extension. Typically the SWIG interface file extension is .i in this case.

    % swig -go example.i
    % go install
    

    You will now have a Go package that you can import from other Go packages as usual.

    SWIG can be used without cgo, via the -no-cgo option, but more steps are required. This only works with Go versions before 1.5. When using Go version 1.2 or later, or when using gccgo, the code generated by SWIG can be linked directly into the Go program. A typical command sequence when using the Go compiler of the Go distribution would look like this:

    % swig -go -no-cgo example.i
    % gcc -c code.c    # The C library being wrapped.
    % gcc -c example_wrap.c
    % go tool 6g example.go
    % go tool 6c example_gc.c
    % go tool pack grc example.a example.6 example_gc.6 code.o example_wrap.o
    % go tool 6g main.go
    % go tool 6l main.6
    

    You can also put the wrapped code into a shared library, and when using the Go versions before 1.2 this is the only supported option. A typical command sequence for this approach would look like this:

    % swig -go -no-cgo -use-shlib example.i
    % gcc -c -fpic example.c
    % gcc -c -fpic example_wrap.c
    % gcc -shared example.o example_wrap.o -o example.so
    % go tool 6g example.go
    % go tool 6c example_gc.c
    % go tool pack grc example.a example.6 example_gc.6
    % go tool 6g main.go  # your code, not generated by SWIG
    % go tool 6l main.6
    

    24.3.1 Go-specific Commandline Options

    These are the command line options for SWIG's Go module. They can also be seen by using:

    swig -go -help
    
    Go-specific options
    -cgo Generate files to be used as input for the Go cgo tool. This is the default.
    -no-cgo Generate files that can be used directly, rather than via the Go cgo tool. This option does not work with Go 1.5 or later. It is required for versions of Go before 1.2.
    -intgosize <s> Set the size for the Go type int. This controls the size that the C/C++ code expects to see. The <s> argument should be 32 or 64. This option is currently required during the transition from Go 1.0 to Go 1.1, as the size of int on 64-bit x86 systems changes between those releases (from 32 bits to 64 bits). In the future the option may become optional, and SWIG will assume that the size of int is the size of a C pointer.
    -gccgo Generate code for gccgo. The default is to generate code for the Go compiler of the Go distribution.
    -package <name> Set the name of the Go package to <name>. The default package name is the SWIG module name.
    -use-shlib Tell SWIG to emit code that uses a shared library. This is only meaningful for the Go compiler of the Go distribution, which needs to know at compile time whether a shared library will be used.
    -soname <name> Set the runtime name of the shared library that the dynamic linker should include at runtime. The default is the package name with ".so" appended. This is only used when generating code for the Go compiler of the Go distribution; when using gccgo, the equivalent name will be taken from the -soname option passed to the linker. Using this option implies the -use-shlib option.
    -go-pkgpath <pkgpath> When generating code for gccgo, set the pkgpath to use. This corresponds to the -fgo-pkgpath option to gccgo.
    -go-prefix <prefix> When generating code for gccgo, set the prefix to use. This corresponds to the -fgo-prefix option to gccgo. If -go-pkgpath is used, -go-prefix will be ignored.
    -import-prefix <prefix> A prefix to add when turning a %import prefix in the SWIG interface file into an import statement in the Go file. For example, with -import-prefix mymodule, a SWIG interface file %import mypackage will become a Go import statement import "mymodule/mypackage".

    24.3.2 Generated Wrapper Files

    There are two different approaches to generating wrapper files, controlled by SWIG's -no-cgo option. The -no-cgo option only works with version of Go before 1.5. It is required when using versions of Go before 1.2.

    With or without the -no-cgo option, SWIG will generate the following files when generating wrapper code:

    • MODULE.go will contain the Go functions that your Go code will call. These functions will be wrappers for the C++ functions defined by your module. This file should, of course, be compiled with the Go compiler.
    • MODULE_wrap.c or MODULE_wrap.cxx will contain C/C++ functions will be invoked by the Go wrapper code. This file should be compiled with the usual C or C++ compiler.
    • MODULE_wrap.h will be generated if you use the directors feature. It provides a definition of the generated C++ director classes. It is generally not necessary to use this file, but in some special cases it may be helpful to include it in your code, compiled with the usual C or C++ compiler.

    When the -no-cgo option is used, and the -gccgo option is not used, SWIG will also generate an additional file:

    • MODULE_gc.c will contain C code which should be compiled with the C compiler distributed as part of the gc compiler. It should then be combined with the compiled MODULE.go using go tool pack.

    24.4 A tour of basic C/C++ wrapping

    By default, SWIG attempts to build a natural Go interface to your C/C++ code. However, the languages are somewhat different, so some modifications have to occur. This section briefly covers the essential aspects of this wrapping.

    24.4.1 Go Package Name

    All Go source code lives in a package. The name of this package will default to the name of the module from SWIG's %module directive. You may override this by using SWIG's -package command line option.

    24.4.2 Go Names

    In Go, a function is only visible outside the current package if the first letter of the name is uppercase. This is quite different from C/C++. Because of this, C/C++ names are modified when generating the Go interface: the first letter is forced to be uppercase if it is not already. This affects the names of functions, methods, variables, constants, enums, and classes.

    C/C++ variables are wrapped with setter and getter functions in Go. First the first letter of the variable name will be forced to uppercase, and then Get or Set will be prepended. For example, if the C/C++ variable is called var, then SWIG will define the functions GetVar and SetVar. If a variable is declared as const, or if SWIG's %immutable directive is used for the variable, then only the getter will be defined.

    C++ classes will be discussed further below. Here we'll note that the first letter of the class name will be forced to uppercase to give the name of a type in Go. A constructor will be named New followed by that name, and the destructor will be named Delete followed by that name.

    24.4.3 Go Constants

    C/C++ constants created via #define or the %constant directive become Go constants, declared with a const declaration.

    24.4.4 Go Enumerations

    C/C++ enumeration types will cause SWIG to define an integer type with the name of the enumeration (with first letter forced to uppercase as usual). The values of the enumeration will become variables in Go; code should avoid modifying those variables.

    24.4.5 Go Classes

    Go has interfaces, methods and inheritance, but it does not have classes in the same sense as C++. This sections describes how SWIG represents C++ classes represented in Go.

    For a C++ class ClassName, SWIG will define two types in Go: an underlying type, which will just hold a pointer to the C++ type, and an interface type. The interface type will be named ClassName. SWIG will define a function NewClassName which will take any constructor arguments and return a value of the interface type ClassName. SWIG will also define a destructor DeleteClassName.

    SWIG will represent any methods of the C++ class as methods on the underlying type, and also as methods of the interface type. Thus C++ methods may be invoked directly using the usual val.MethodName syntax. Public members of the C++ class will be given getter and setter functions defined as methods of the class.

    SWIG will represent static methods of C++ classes as ordinary Go functions. SWIG will use names like ClassNameMethodName. SWIG will give static members getter and setter functions with names like GetClassName_VarName.

    Given a value of the interface type, Go code can retrieve the pointer to the C++ type by calling the Swigcptr method. This will return a value of type SwigcptrClassName, which is just a name for uintptr. A Go type conversion can be used to convert this value to a different C++ type, but note that this conversion will not be type checked and is essentially equivalent to reinterpret_cast. This should only be used for very special cases, such as where C++ would use a dynamic_cast.

    Note that C++ pointers to compound objects are represented in go as objects themselves, not as go pointers. So, for example, if you wrap the following function:

    class MyClass {
      int MyMethod();
      static MyClass *MyFactoryFunction();
    };
    
    

    You will get go code that looks like this:

    type MyClass interface {
      Swigcptr() uintptr
      SwigIsMyClass()
      MyMethod() int
    }
    
    func MyClassMyFactoryFunction() MyClass {
      // swig magic here
    }
    

    Note that the factory function does not return a go pointer; it actually returns a go interface. If the returned pointer can be null, you can check for this by calling the Swigcptr() method.

    24.4.5.1 Go Class Memory Management

    Calling NewClassName for a C++ class ClassName will allocate memory using the C++ memory allocator. This memory will not be automatically freed by Go's garbage collector as the object ownership is not tracked. When you are done with the C++ object you must free it using DeleteClassName.

    The most Go idiomatic way to manage the memory for some C++ class is to call NewClassName followed by a defer of the DeleteClassName call. Using defer ensures that the memory of the C++ object is freed as soon as the function containing the defer statement returns. Furthermore defer works great for short-lived objects and fits nicely C++'s RAII idiom. Example:

    func UseClassName(...) ... {
      o := NewClassName(...)
      defer DeleteClassName(o)
      // Use the ClassName object
      return ...
    }
    

    With increasing complexity, especially complex C++ object hierarchies, the correct placement of defer statements becomes harder and harder as C++ objects need to be freed in the correct order. This problem can be eased by keeping a C++ object function local so that it is only available to the function that creates a C++ object and functions called by this function. Example:

    func WithClassName(constructor args, f func(ClassName, ...interface{}) error, data ...interface{}) error {
      o := NewClassName(constructor args)
      defer DeleteClassName(o)
      return f(o, data...)
    }
    
    func UseClassName(o ClassName, data ...interface{}) (err error) {
      // Use the ClassName object and additional data and return error.
    }
    
    func main() {
      WithClassName(constructor args, UseClassName, additional data)
    }
    

    Using defer has limitations though, especially when it comes to long-lived C++ objects whose lifetimes are hard to predict. For such C++ objects a common technique is to store the C++ object into a Go object, and to use the Go function runtime.SetFinalizer to add a finalizer which frees the C++ object when the Go object is freed. It is strongly recommended to read the runtime.SetFinalizer documentation before using this technique to understand the runtime.SetFinalizer limitations.

    Common pitfalls with runtime.SetFinalizer are:

    • If a hierarchy of C++ objects will be automatically freed by Go finalizers then the Go objects that store the C++ objects need to replicate the hierarchy of the C++ objects to prevent that C++ objects are freed prematurely while other C++ objects still rely on them.
    • The usage of Go finalizers is problematic with C++'s RAII idiom as it isn't predictable when the finalizer will run and this might require a Close or Delete method to be added the Go object that stores a C++ object to mitigate.
    • The Go finalizer function typically runs in a different OS thread which can be problematic with C++ code that uses thread-local storage.

    runtime.SetFinalizer Example:

    import (
      "runtime"
      "wrap" // SWIG generated wrapper code
    )
    
    type GoClassName struct {
      wcn wrap.ClassName
    }
    
    func NewGoClassName() *GoClassName {
      o := &GoClassName{wcn: wrap.NewClassName()}
      runtime.SetFinalizer(o, deleteGoClassName)
      return o
    }
    
    func deleteGoClassName(o *GoClassName) {
      // Runs typically in a different OS thread!
      wrap.DeleteClassName(o.wcn)
      o.wcn = nil
    }
    
    func (o *GoClassName) Close() {
      // If the C++ object has a Close method.
      o.wcn.Close()
    
      // If the GoClassName object is no longer in an usable state.
      runtime.SetFinalizer(o, nil) // Remove finalizer.
      deleteGoClassName() // Free the C++ object.
    }
    

    24.4.5.2 Go Class Inheritance

    C++ class inheritance is automatically represented in Go due to its use of interfaces. The interface for a child class will be a superset of the interface of its parent class. Thus a value of the child class type in Go may be passed to a function which expects the parent class. Doing the reverse will require an explicit type assertion, which will be checked dynamically.

    24.4.6 Go Templates

    In order to use C++ templates in Go, you must tell SWIG to create wrappers for a particular template instantiation. To do this, use the %template directive.

    24.4.7 Go Director Classes

    SWIG's director feature permits a Go type to act as the subclass of a C++ class. This is complicated by the fact that C++ and Go define inheritance differently. SWIG normally represents the C++ class inheritance automatically in Go via interfaces but with a Go type representing a subclass of a C++ class some manual work is necessary.

    This subchapter gives a step by step guide how to properly subclass a C++ class with a Go type. In general it is strongly recommended to follow this guide completely to avoid common pitfalls with directors in Go.

    24.4.7.1 Example C++ code

    The step by step guide is based on two example C++ classes. FooBarAbstract is an abstract C++ class and the FooBarCpp class inherits from it. This guide explains how to implement a FooBarGo class similar to the FooBarCpp class.

    FooBarAbstract abstract C++ class:

    class FooBarAbstract
    {
    public:
      FooBarAbstract() {};
      virtual ~FooBarAbstract() {};
    
      std::string FooBar() {
        return this->Foo() + ", " + this->Bar();
      };
    
    protected:
      virtual std::string Foo() {
        return "Foo";
      };
    
      virtual std::string Bar() = 0;
    };
    

    FooBarCpp C++ class:

    class FooBarCpp : public FooBarAbstract
    {
    protected:
      virtual std::string Foo() {
        return "C++ " + FooBarAbstract::Foo();
      }
    
      virtual std::string Bar() {
        return "C++ Bar";
      }
    };
    

    Returned string by the FooBarCpp::FooBar method is:

    C++ Foo, C++ Bar
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide.

    24.4.7.2 Enable director feature

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Second, you must use the %feature("director") directive to tell SWIG which classes should get directors. In the example the FooBarAbstract class needs the director feature enabled so that the FooBarGo class can inherit from it, like this:

    %feature("director") FooBarAbstract;
    

    For a more detailed documentation of the director feature and how to enable or disable it for specific classes and virtual methods see SWIG's Java documentation on directors.

    24.4.7.3 Constructor and destructor

    SWIG creates an additional set of constructor and destructor functions once the director feature has been enabled for a C++ class. NewDirectorClassName allows overriding virtual methods on the new object instance and DeleteDirectorClassName needs to be used to free a director object instance created with NewDirectorClassName. More on overriding virtual methods follows later in this guide under overriding virtual methods.

    The default constructor and destructor functions NewClassName and DeleteClassName can still be used as before so that existing code doesn't break just because the director feature has been enabled for a C++ class. The behavior is undefined if the default and director constructor and destructor functions get mixed and so great care needs to be taken that only one of the constructor and destructor function pairs is used for any object instance. Both constructor functions, the default and the director one, return the same interface type. This makes it potentially hard to know which destructor function, the default or the director one, needs to be called to delete an object instance.

    In theory the DirectorInterface method could be used to determine if an object instance was created via NewDirectorClassName:

    if o.DirectorInterface() != nil {
      DeleteDirectorClassName(o)
    } else {
      DeleteClassName(o)
    }
    

    In practice it is strongly recommended to embed a director object instance in a Go struct so that a director object instance will be represented as a distinct Go type that subclasses a C++ class. For this Go type custom constructor and destructor functions take care of the director constructor and destructor function calls and the resulting Go class will appear to the user as any other SWIG wrapped C++ class. More on properly subclassing a C++ class follows later in this guide under subclass via embedding.

    24.4.7.4 Override virtual methods

    In order to override virtual methods on a C++ class with Go methods the NewDirectorClassName constructor functions receives a DirectorInterface argument. The methods in the DirectorInterface are a subset of the public and protected virtual methods of the C++ class. Virtual methods that have a final specifier are unsurprisingly excluded. If the DirectorInterface contains a method with a matching signature to a virtual method of the C++ class then the virtual C++ method will be overwritten with the Go method. As Go doesn't support protected methods all overridden protected virtual C++ methods will be public in Go.

    As an example see part of the FooBarGo class:

    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      ...
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
      ...
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb
      ...
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide. In this part of the example the virtual methods FooBarAbstract::Foo and FooBarAbstract::Bar have been overwritten with Go methods similarly to how the FooBarAbstract virtual methods are overwritten by the FooBarCpp class.

    The DirectorInterface in the example is implemented by the overwrittenMethodsOnFooBarAbstract Go struct type. A pointer to a overwrittenMethodsOnFooBarAbstract struct instance will be given to the NewDirectorFooBarAbstract constructor function. The constructor return value implements the FooBarAbstract interface. overwrittenMethodsOnFooBarAbstract could in theory be any Go type but in practice a struct is used as it typically contains at least a value of the C++ class interface so that the overwritten methods can use the rest of the C++ class. If the FooBarGo class would receive additional constructor arguments then these would also typically be stored in the overwrittenMethodsOnFooBarAbstract struct so that they can be used by the Go methods.

    24.4.7.5 Call base methods

    Often a virtual method will be overwritten to extend the original behavior of the method in the base class. This is also the case for the FooBarCpp::Foo method of the example code:

    virtual std::string Foo() {
      return "C++ " + FooBarAbstract::Foo();
    }
    

    To use base methods the DirectorClassNameMethodName wrapper functions are automatically generated by SWIG for public and protected virtual methods. The FooBarGo.Foo implementation in the example looks like this:

    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      return "Go " + DirectorFooBarAbstractFoo(om.fb)
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide.

    24.4.7.6 Subclass via embedding

    As previously mentioned in this guide the default and director constructor functions return the same interface type. To properly subclass a C++ class with a Go type the director object instance returned by the NewDirectorClassName constructor function should be embedded into a Go struct so that it represents a distinct but compatible type in Go's type system. This Go struct should be private and the constructor and destructor functions should instead work with a public interface type so that the Go class that subclasses a C++ class can be used as a compatible drop in.

    The subclassing part of the FooBarGo class for an example looks like this:

    type FooBarGo interface {
      FooBarAbstract
      deleteFooBarAbstract()
      IsFooBarGo()
    }
    
    type fooBarGo struct {
      FooBarAbstract
    }
    
    func (fbgs *fooBarGo) deleteFooBarAbstract() {
      DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
    }
    
    func (fbgs *fooBarGo) IsFooBarGo() {}
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb
    
      return &fooBarGo{FooBarAbstract: fb}
    }
    
    func DeleteFooBarGo(fbg FooBarGo) {
      fbg.deleteFooBarAbstract()
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide. In this part of the example the private fooBarGo struct embeds FooBarAbstract which lets the fooBarGo Go type "inherit" all the methods of the FooBarAbstract C++ class by means of embedding. The public FooBarGo interface type includes the FooBarAbstract interface and hence FooBarGo can be used as a drop in replacement for FooBarAbstract while the reverse isn't possible and would raise a compile time error. Furthermore the constructor and destructor functions NewFooBarGo and DeleteFooBarGo take care of all the director specifics and to the user the class appears as any other SWIG wrapped C++ class.

    24.4.7.7 Memory management with runtime.SetFinalizer

    In general all guidelines for C++ class memory management apply as well to director classes. One often overlooked limitation with runtime.SetFinalizer is that a finalizer doesn't run in case of a cycle and director classes typically have a cycle. The cycle in the FooBarGo class is here:

    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om) // fb.v = om
      om.fb = fb // Backlink causes cycle as fb.v = om!
      ...
    }
    

    In order to be able to use runtime.SetFinalizer nevertheless the finalizer needs to be set on something that isn't in a cycle and that references the director object instance. In the FooBarGo class example the FooBarAbstract director instance can be automatically deleted by setting the finalizer on fooBarGo:

    type fooBarGo struct {
      FooBarAbstract
    }
    
    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb // Backlink causes cycle as fb.v = om!
    
      fbgs := &fooBarGo{FooBarAbstract: fb}
      runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
      return fbgs
    }
    

    Furthermore if runtime.SetFinalizer is in use either the DeleteClassName destructor function needs to be removed or the fooBarGo struct needs additional data to prevent double deletion. Please read the C++ class memory management subchapter before using runtime.SetFinalizer to know all of its gotchas.

    24.4.7.8 Complete FooBarGo example class

    The complete and annotated FooBarGo class looks like this:

    // FooBarGo is a superset of FooBarAbstract and hence FooBarGo can be used as a
    // drop in replacement for FooBarAbstract but the reverse causes a compile time
    // error.
    type FooBarGo interface {
      FooBarAbstract
      deleteFooBarAbstract()
      IsFooBarGo()
    }
    
    // Via embedding fooBarGo "inherits" all methods of FooBarAbstract.
    type fooBarGo struct {
      FooBarAbstract
    }
    
    func (fbgs *fooBarGo) deleteFooBarAbstract() {
      DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
    }
    
    // The IsFooBarGo method ensures that FooBarGo is a superset of FooBarAbstract.
    // This is also how the class hierarchy gets represented by the SWIG generated
    // wrapper code.  For an instance FooBarCpp has the IsFooBarAbstract and
    // IsFooBarCpp methods.
    func (fbgs *fooBarGo) IsFooBarGo() {}
    
    // Go type that defines the DirectorInterface. It contains the Foo and Bar
    // methods that overwrite the respective virtual C++ methods on FooBarAbstract.
    type overwrittenMethodsOnFooBarAbstract struct {
      // Backlink to FooBarAbstract so that the rest of the class can be used by
      // the overridden methods.
      fb FooBarAbstract
    
      // If additional constructor arguments have been given they are typically
      // stored here so that the overridden methods can use them.
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      // DirectorFooBarAbstractFoo calls the base method FooBarAbstract::Foo.
      return "Go " + DirectorFooBarAbstractFoo(om.fb)
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
      return "Go Bar"
    }
    
    func NewFooBarGo() FooBarGo {
      // Instantiate FooBarAbstract with selected methods overridden.  The methods
      // that will be overwritten are defined on
      // overwrittenMethodsOnFooBarAbstract and have a compatible signature to the
      // respective virtual C++ methods. Furthermore additional constructor
      // arguments will be typically stored in the
      // overwrittenMethodsOnFooBarAbstract struct.
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb // Backlink causes cycle as fb.v = om!
    
      fbgs := &fooBarGo{FooBarAbstract: fb}
      // The memory of the FooBarAbstract director object instance can be
      // automatically freed once the FooBarGo instance is garbage collected by
      // uncommenting the following line.  Please make sure to understand the
      // runtime.SetFinalizer specific gotchas before doing this.  Furthermore
      // DeleteFooBarGo should be deleted if a finalizer is in use or the fooBarGo
      // struct needs additional data to prevent double deletion.
      // runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
      return fbgs
    }
    
    // Recommended to be removed if runtime.SetFinalizer is in use.
    func DeleteFooBarGo(fbg FooBarGo) {
      fbg.deleteFooBarAbstract()
    }
    

    Returned string by the FooBarGo.FooBar method is:

    Go Foo, Go Bar
    

    For comparison the FooBarCpp class looks like this:

    class FooBarCpp : public FooBarAbstract
    {
    protected:
      virtual std::string Foo() {
        return "C++ " + FooBarAbstract::Foo();
      }
    
      virtual std::string Bar() {
        return "C++ Bar";
      }
    };
    

    For comparison the returned string by the FooBarCpp::FooBar method is:

    C++ Foo, C++ Bar
    

    The complete source of this example can be found under SWIG/Examples/go/director/.

    24.4.8 Default Go primitive type mappings

    The following table lists the default type mapping from C/C++ to Go. This table will tell you which Go type to expect for a function which uses a given C/C++ type.

    C/C++ type Go type
    bool bool
    char byte
    signed char int8
    unsigned char byte
    short int16
    unsigned short uint16
    int int
    unsigned int uint
    long int64
    unsigned long uint64
    long long int64
    unsigned long long uint64
    float float32
    double float64
    char *
    char []
    string

    Note that SWIG wraps the C char type as a character. Pointers and arrays of this type are wrapped as strings. The signed char type can be used if you want to treat char as a signed number rather than a character. Also note that all const references to primitive types are treated as if they are passed by value.

    These type mappings are defined by the "gotype" typemap. You may change that typemap, or add new values, to control how C/C++ types are mapped into Go types.

    24.4.9 Output arguments

    Because of limitations in the way output arguments are processed in swig, a function with output arguments will not have multiple return values. Instead, you must pass a pointer into the C++ function to tell it where to store the output value. In go, you supply a slice in the place of the output argument.

    For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters):

    double modf(double x, double *ip);
    

    You could wrap it with SWIG as follows:

    %include <typemaps.i>
    double modf(double x, double *OUTPUT);
    

    or you can use the %apply directive:

    %include <typemaps.i>
    %apply double *OUTPUT { double *ip };
    double modf(double x, double *ip);
    

    In Go you would use it like this:

    ptr := []float64{0.0}
    fraction := modulename.Modf(5.0, ptr)
    

    Since this is ugly, you may want to wrap the swig-generated API with some additional functions written in go that hide the ugly details.

    There are no char *OUTPUT typemaps. However you can apply the signed char * typemaps instead:

    %include <typemaps.i>
    %apply signed char *OUTPUT {char *output};
    void f(char *output);
    

    24.4.10 Adding additional go code

    Often the APIs generated by swig are not very natural in go, especially if there are output arguments. You can insert additional go wrapping code to add new APIs with %insert(go_wrapper), like this:

    %include <typemaps.i>
    // Change name of what swig generates to Wrapped_modf.  This function will
    // have the following signature in go:
    //   func Wrapped_modf(float64, []float64) float64
    %rename(wrapped_modf) modf(double x, double *ip);
    
    %apply double *OUTPUT { double *ip };
    double modf(double x, double *ip);
    
    %insert(go_wrapper) %{
    
    // The improved go interface to this function, which has two return values,
    // in the more natural go idiom:
    func Modf(x float64) (fracPart float64, intPart float64) {
      ip := []float64{0.0}
      fracPart = Wrapped_modf(x, ip)
      intPart = ip[0]
      return
    }
    
    %}
    

    For classes, since swig generates an interface, you can add additional methods by defining another interface that includes the swig-generated interface. For example,

    %rename(Wrapped_MyClass) MyClass;
    %rename(Wrapped_GetAValue) MyClass::GetAValue(int *x);
    %apply int *OUTPUT { int *x };
    
    class MyClass {
     public:
      MyClass();
      int AFineMethod(const char *arg); // Swig's wrapping is fine for this one.
      bool GetAValue(int *x);
    };
    
    %insert(go_wrapper) %{
    
    type MyClass interface {
      Wrapped_MyClass
      GetAValue() (int, bool)
    }
    
    func (arg SwigcptrWrapped_MyClass) GetAValue() (int, bool) {
      ip := []int{0}
      ok := arg.Wrapped_GetAValue(ip)
      return ip[0], ok
    }
    
    %}
    

    Of course, if you have to rewrite most of the methods, instead of just a few, then you might as well define your own struct that includes the swig-wrapped object, instead of adding methods to the swig-generated object.

    If you need to import other go packages, you can do this with %go_import. For example,

    %go_import("fmt", _ "unusedPackage", rp "renamed/package")
    
    %insert(go_wrapper) %{
    
    func foo() {
      fmt.Println("Some string:", rp.GetString())
    }
    
    // Importing the same package twice is permitted,
    // Go code will be generated with only the first instance of the import.
    %go_import("fmt")
    
    %insert(go_wrapper) %{
    
    func bar() {
      fmt.Println("Hello world!")
    }
    
    %}
    

    24.4.11 Go typemaps

    You can use the %typemap directive to modify SWIG's default wrapping behavior for specific C/C++ types. You need to be familiar with the material in the general "Typemaps" chapter. That chapter explains how to define a typemap. This section describes some specific typemaps used for Go.

    In general type conversion code may be written either in C/C++ or in Go. The choice to make normally depends on where memory should be allocated. To allocate memory controlled by the Go garbage collector, write Go code. To allocate memory in the C/C++ heap, write C code.

    Typemap Description
    gotype The Go type to use for a C++ type. This type will appear in the generated Go wrapper function. If this is not defined SWIG will use a default as described above.
    imtype An intermediate Go type used by the "goin", "goout", "godirectorin", and "godirectorout" typemaps. If this typemap is not defined for a C/C++ type, the gotype typemape will be used. This is useful when gotype is best converted to C/C++ using Go code.
    goin Go code to convert from gotype to imtype when calling a C/C++ function. SWIG will then internally convert imtype to a C/C++ type and pass it down. If this is not defined, or is the empty string, no conversion is done.
    in C/C++ code to convert the internally generated C/C++ type, based on imtype, into the C/C++ type that a function call expects. If this is not defined the value will simply be cast to the desired type.
    out C/C++ code to convert the C/C++ type that a function call returns into the internally generated C/C++ type, based on imtype, that will be returned to Go. If this is not defined the value will simply be cast to the desired type.
    goout Go code to convert a value returned from a C/C++ function from imtype to gotype. If this is not defined, or is the empty string, no conversion is done.
    argout C/C++ code to adjust an argument value when returning from a function. This is called after the real C/C++ function has run. This uses the internally generated C/C++ type, based on imtype. This is only useful for a pointer type of some sort. If this is not defined nothing will be done.
    goargout Go code to adjust an argument value when returning from a function. This is called after the real C/C++ function has run. The value will be in imtype. This is only useful for a pointer type of some sort. If this is not defined, or is the empty string, nothing will be done.
    directorin C/C++ code to convert the C/C++ type used to call a director method into the internally generated C/C++ type, based on imtype, that will be passed to Go. If this is not defined the value will simply be cast to the desired type.
    godirectorin Go code to convert a value used to call a director method from imtype to gotype. If this is not defined, or is the empty string, no conversion is done.
    godirectorout Go code to convert a value returned from a director method from gotype to imtype. If this is not defined, or is the empty string, no conversion is done.
    directorout C/C++ code to convert a value returned from a director method from the internally generated C/C++ type, based on imtype, into the type that the method should return If this is not defined the value will simply be cast to the desired type.
    swig-4.0.2/Doc/Manual/swightml.book0000644000175000017500000000241413667507563017023 0ustar williamwilliam#HTMLDOC 1.8.24 -t html -f SWIGDocumentation.html --book --toclevels 4 --no-numbered --toctitle "Table of Contents" --title --titleimage swig16.png --linkcolor #0000ff --linkstyle underline --size Universal --left 0.50in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --footer h.1 --nup 1 --tocheader .t. --tocfooter ..i --portrait --color --no-pscommands --no-xrxcomments --compression=1 --jpeg=0 --fontsize 10.0 --fontspacing 1.2 --headingfont Helvetica --bodyfont Times --headfootsize 10.0 --headfootfont Helvetica --charset iso-8859-1 --links --no-embedfonts --pagemode outline --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password "" --user-password "" --browserwidth 680 Sections.html Preface.html Introduction.html Windows.html Scripting.html SWIG.html SWIGPlus.html CPlusPlus11.html CPlusPlus14.html CPlusPlus17.html Preprocessor.html Library.html Arguments.html Typemaps.html Customization.html Contract.html Varargs.html Doxygen.html Warnings.html Modules.html CCache.html Android.html CSharp.html D.html Go.html Guile.html Java.html Javascript.html Lua.html Octave.html Perl5.html Php.html Python.html R.html Ruby.html Scilab.html Tcl.html Mzscheme.html Ocaml.html Extending.html swig-4.0.2/Doc/Manual/README0000644000175000017500000000152213667507523015164 0ustar williamwilliamThis directory contains the HTML for the SWIG users manual. All of this HTML is hand-written. However, section numbering, indices, and the table of contents are generated automatically by the 'maketoc.py' script. The Makefile has further information on how the various alternative forms of the documentation are generated from the hand-written HTML. There are 4 types of boxes that code or whatever can be inside: -
    ...
    This is for text that shows the output of running commands on the shell. -
    ...
    This is for either C, C++, or SWIG code -
    ...
    This is for code in a target scripting language -
    ...
    This is for text that is not code or a shell The general format is
    whatever here
    
    swig-4.0.2/Doc/Manual/D.html0000644000175000017500000007456613667507563015403 0ustar williamwilliam SWIG and D

    23 SWIG and D

    23.1 Introduction

    From the D Programming Language web site: D is a systems programming language. Its focus is on combining the power and high performance of C and C++ with the programmer productivity of modern languages like Ruby and Python. [...] The D language is statically typed and compiles directly to machine code. As such, it is not very surprising that D is able to directly interface with C libraries. Why would a SWIG module for D be needed then in the first place?

    Well, besides the obvious downside that the C header files have to be manually converted to D modules for this to work, there is one major inconvenience with this approach: D code usually is on a higher abstraction level than C, and many of the features that make D interesting are simply not available when dealing with C libraries, requiring you e.g. to manually convert strings between pointers to \0-terminated char arrays and D char arrays, making the algorithms from the D2 standard library unusable with C arrays and data structures, and so on.

    While these issues can be worked around relatively easy by hand-coding a thin wrapper layer around the C library in question, there is another issue where writing wrapper code per hand is not feasible: C++ libraries. D did not support interfacing to C++ in version 1 at all, and even if extern(C++) has been added to D2, the support is still very limited, and a custom wrapper layer is still required in many cases.

    To help addressing these issues, the SWIG C# module has been forked to support D. Is has evolved quite a lot since then, but there are still many similarities, so if you do not find what you are looking for on this page, it might be worth having a look at the chapter on C# (and also on Java, since the C# module was in turn forked from it).

    23.2 Command line invocation

    To activate the D module, pass the -d option to SWIG at the command line. The same standard command line options as with any other language module are available, plus the following D specific ones:

    -d2

    By default, SWIG generates code for D1/Tango. Use the -d2 flag to target D2/Phobos instead.

    -splitproxy

    By default, SWIG generates two D modules: the proxy module, named like the source module (either specified via the %module directive or via the module command line option), which contains all the proxy classes, functions, enums, etc., and the intermediary module (named like the proxy module, but suffixed with _im), which contains all the extern(C) function declarations and other private parts only used internally by the proxy module.

    If the split proxy mode is enabled by passing this option at the command line, all proxy classes and enums are emitted to their own D module instead. The main proxy module only contains free functions and constants in this case.

    -package <pkg>

    By default, the proxy D modules and the intermediary D module are written to the root package. Using this option, you can specify another target package instead.

    -wrapperlibrary <wl>

    The code SWIG generates to dynamically load the C/C++ wrapper layer looks for a library called $module_wrap by default. With this option, you can override the name of the file the wrapper code loads at runtime (the lib prefix and the suffix for shared libraries are appended automatically, depending on the OS).

    This might especially be useful if you want to invoke SWIG several times on separate modules, but compile the resulting code into a single shared library.

    23.3 Typemaps

    23.3.1 C# <-> D name comparison

    If you already know the SWIG C# module, you might find the following name comparison table useful:

     ctype                  <->  ctype
     imtype                 <->  imtype
     cstype                 <->  dtype
     csin                   <->  din
     csout                  <->  dout
     csdirectorin           <->  ddirectorin
     csdirectorout          <->  ddirectorout
     csinterfaces           <->  dinterfaces
     csinterfaces_derived   <->  dinterfaces_derived
     csbase                 <->  dbase
     csclassmodifiers       <->  dclassmodifiers
     cscode                 <->  dcode
     csimports              <->  dimports
     csbody                 <->  dbody
     csfinalize             <->  ddestructor
     csdisposing            <->  ddispose
     csdisposing_derived    <->  ddispose_derived
    

    23.3.2 ctype, imtype, dtype

    Mapping of types between the C/C++ library, the C/C++ library wrapper exposing the C functions, the D wrapper module importing these functions and the D proxy code.

    The ctype typemap is used to determine the types to use in the C wrapper functions. The types from the imtype typemap are used in the extern(C) declarations of these functions in the intermediary D module. The dtype typemap contains the D types used in the D proxy module/class.

    23.3.3 in, out, directorin, directorout

    Used for converting between the types for C/C++ and D when generating the code for the wrapper functions (on the C++ side).

    The code from the in typemap is used to convert arguments to the C wrapper function to the type used in the wrapped code (ctype->original C++ type), the out typemap is utilized to convert values from the wrapped code to wrapper function return types (original C++ type->ctype).

    The directorin typemap is used to convert parameters to the type used in the D director callback function, its return value is processed by directorout (see below).

    23.3.4 din, dout, ddirectorin, ddirectorout

    Typemaps for code generation in D proxy and type wrapper classes.

    The din typemap is used for converting function parameter types from the type used in the proxy module or class to the type used in the intermediary D module (the $dinput macro is replaced). To inject further parameter processing code before or after the call to the intermediary layer, the pre, post and terminator attributes can be used (please refer to the C# date marshalling example for more information on these).

    The dout typemap is used for converting function return values from the return type used in the intermediary D module to the type returned by the proxy function. The $excode special variable in dout typemaps is replaced by the excode typemap attribute code if the method can throw any exceptions from unmanaged code, otherwise by nothing (the $imcall and $owner macros are replaced).

    The code from the ddirectorin and ddirectorout typemaps is used for conversion in director callback functions. Arguments are converted to the type used in the proxy class method they are calling by using the code from ddirectorin, the proxy class method return value is converted to the type the C++ code expects via the ddirectorout typemap (the $dcall and $winput macros are replaced).

    The full chain of type conversions when a director callback is invoked looks like this:

          type              CPPClass::method(type a)
            ↑                       ↓
       <directorout>          <directorin>
            ↑                       ↓
          ctype             methodCallback(ctype a)           C++
     :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
          imtype            methodCallback(imtype a)           D
            ↑                       ↓
      <ddirectorout>          <ddirectorin>
            ↑                       ↓
          dtype             DClass.method(dtype a)

    23.3.5 typecheck typemaps

    Because, unlike many scripting languages supported by SWIG, D does not need any dynamic dispatch helper to access an overloaded function, the purpose of these is merely to issue a warning for overloaded C++ functions that cannot be overloaded in D (as more than one C++ type maps to a single D type).

    23.3.6 Code injection typemaps

    These typemaps are used for generating the skeleton of proxy classes for C++ types.

    By overriding dbase, dinterfaces or dinterfaces_derived, the inheritance chain of the generated proxy class for a type can be modified. dclassmodifiers allows you to add any custom modifiers around the class keyword.

    Using dcode and dimports, you can specify additional D code which will be emitted into the class body respectively the imports section of the D module the class is written to.

    dconstructor, ddestructor, ddispose and ddispose_derived are used to generate the class constructor, destructor and dispose() method, respectively. The auxiliary code for handling the pointer to the C++ object is stored in dbody and dbody_derived. You can override them for specific types.

    Code can also be injected into the D proxy class using %proxycode.

    23.3.7 Special variable macros

    The standard SWIG special variables are available for use within typemaps as described in the Typemaps documentation, for example $1, $input, $result etc.

    When generating D wrappers, a few additional macros are available:

    $dclassname (C#: $csclassname)

    This special variable works similar to $n_type in that it returns the name of a type - it expands to the D proxy class name of the type being wrapped. If the type does not have an associated proxy class, it expands to the type wrapper class name, for example, SWIGTYPE_p_p_SomeCppClass is generated when wrapping SomeCppClass **.

    There are two other variants available, $&dclassname and $*dclassname. The former adds a level of indirection, while the latter removes one. For instance, when wrapping Foo **, $*dclassname would be replaced by the proxy class name corresponding to Foo *.

    $dclazzname (C#: $csclazzname)

    This special variable expands the fully qualified C++ class into the package name, if used by the nspace feature, and the proxy class name, mangled for use as a function name. For example, Namespace1::Namespace2::Klass is expanded into Namespace1_Namespace2_Klass_.

    This special variable might be useful for calling certain functions in the wrapper layer (e.g. upcast wrappers) which are mangled like this.

    $null

    In code inserted into the generated C/C++ wrapper functions, this variable is replaced by either 0 or nothing at all, depending on whether the function has a return value or not. It can be used to bail out early e.g. in case of errors (return $null;).

    $dinput (C#: $csinput)

    This variable is used in din typemaps and is replaced by the expression which is to be passed to C/C++.

    For example, this input

    %typemap(din) SomeClass * "SomeClass.getCPointer($dinput)"
    
    %inline %{
      class SomeClass {};
      void foo(SomeClass *arg);
    %}

    leads to the following D proxy code being generated:

    void foo(SomeClass arg) {
      example_im.foo(SomeClass.getCPointer(arg));
    }
    $imcall and $owner (C#: $imcall)

    These variables are used in dout typemaps. $imcall contains the call to the intermediary module which provides the value to be used, and $owner signals if the caller is responsible for managing the object lifetime (that is, if the called method is a constructor or has been marked via %newobject).

    Consider the following example:

    %typemap(dout) SomeClass * {
      return new SomeClass($imcall, $owner);
    }
    
    %inline %{
      class SomeClass;
      SomeClass *foo();
    
      %newobject bar();
      SomeClass *bar();
    %}
    

    The code generated for foo() and bar() looks like this:

    SomeClass foo() {
      return new SomeClass(example_im.foo(), false);
    }
    
    SomeClass bar() {
      return new SomeClass(example_im.bar(), true);
    }
    
    $dcall and $winput (C#: $cscall, $iminput)

    These variables are used in the director-specific typemaps ddirectorin and ddirectorout. They are more or less the reverse of the $imcall and $dinput macros: $dcall contains the invocation of the D proxy method of which the return value is to be passed back to C++, $winput contains the parameter value from C++.

    $excode

    This variable is used in dout and dconstructor typemaps and is filled with the contents of the excode typemap attribute if an exception could be thrown from the C++ side. See the C# documentation for details.

    $dbaseclass

    Currently for internal use only, it contains the D name of the C++ base class (if any) inside proxy classes.

    $directorconnect

    This macro is only valid inside the dconstructor typemap and contains the value of the dconstructor typemap attribute if the currently wrapped class has directors enabled.

    This is how the default dconstructor typemap looks like (you usually do not want to specify a custom one):

    %typemap(dconstructor, excode=SWIGEXCODE,
             directorconnect="\n  swigDirectorConnect();") SWIGTYPE {
      this($imcall, true);$excode$directorconnect
    }
    
    $importtype(SomeDType)

    This macro is used in the dimports typemap if a dependency on another D type generated by SWIG is added by a custom typemap.

    Consider the following code snippet:

    %typemap(dinterfaces) SomeClass "AnInterface, AnotherInterface";
    

    This causes SWIG to add AnInterface and AnotherInterface to the base class list of SomeClass:

    class SomeClass : AnInterface, AnotherInterface {
      ...
    }
    

    For this to work, AnInterface and AnotherInterface have to be in scope. If SWIG is not in split proxy mode, this is already the case, but if it is, they have to be added to the import list via the dimports typemap. Additionally, the import statement depends on the package SWIG is configured to emit the modules to.

    The $importtype macro helps you to elegantly solve this problem:

    %typemap(dimports) RemoteMpe %{
    $importtype(AnInterface)
    $importtype(AnotherInterface)
    %}
    

    If SWIG is in split proxy mode, it expands to an import statement for the specified type, to nothing if not.

    $module

    Expands to the name of the main proxy D module.

    $imdmodule

    Contains the fully qualified name of the intermediary D module.

    23.4 D and %feature

    The D module defines a number of directives which modify the SWIG features set globally or for a specific declaration:

    %dmanifestconst and %dconstvalue(value)

    Out of the box, SWIG generates accessor methods for C #defines and C++ constants. The %dmanifestconst directive enables wrapping these constants as D manifest constants (const in D1, enum in D2).

    For this to work, the C/C++ code for the constant value must directly compile as D code, though. If this is not the case, you can manually override the expression written to the D proxy module using the %dconstvalue directive, passing the new value as parameter.

    For enums, again %dconstvalue can be used to override the value of an enum item if the initializer should not compile in D.

    %dmethodmodifiers

    This directive can be used to override the modifiers for a proxy function. For instance, you could make a public C++ member function private in D like this:

    %dmethodmodifiers A::foo "private";
    
    %inline %{
    struct A {
      void foo();
    };
    %}
    

    23.5 Pragmas

    There are a few SWIG pragmas specific to the D module, which you can use to influence the D code SWIG generates:

    %pragma(d) imdmodulecode

    The passed text (D code) is copied verbatim to the intermediary D module. For example, it can be (and is, internally) used to emit additional private helper code for the use by proxy typemaps.

    %pragma(d) imdmoduleimports

    Additional code to be emitted to the imports section of the intermediary D module (the $importtype macro can be used here). You probably want to use this in conjunction with the imdmodulecode pragma.

    %pragma(d) proxydmodulecode

    Just like proxydmodulecode, the argument is copied to the proxy D module (if SWIG is in split proxy mode and/or the nspace feature is used, it is emitted to the main proxy D module only).

    %pragma(d) globalproxyimports

    The D module currently does not support specifying dependencies on external modules (e.g. from the standard library) for the D typemaps. To add the import statements to the proxy modules (resp. to all proxy modules if in split proxy mode), you can use the globalproxyimports directive.

    For example:

    %typemap(din) char[] "($dinput ? tango.stdc.stringz.toStringz($dinput) : null)"
    %pragma(d) globalproxyimports = "static import tango.stdc.stringz;";
    
    %pragma(d) wrapperloadercode

    The D code for loading the wrapper library (it is copied to the intermediary D module). The $wrapperloaderbindcode variable is replaced by the list of commands for binding the functions from the wrapper library to the symbols in the intermediary D module.

    Each time this pragma is specified, the previous value is overwritten.

    %pragma(d) wrapperloaderbindcommand

    The D command to use for binding the wrapper functions from the C/C++ library to the symbols in the intermediary D module. The $function variable contains the name of the D function in the wrap module, the $symbol variable is replaced by the name of the symbol in the library.

    Each time this pragma is specified, the previous value is overwritten.

    23.6 D Exceptions

    Out of the box, C++ exceptions are fundamentally incompatible to their equivalent in the D world and cannot simply be propagated to a calling D method. There is, however, an easy way to solve this problem: Just catch the exception in the C/C++ wrapper layer, pass the contents to D, and make the wrapper code rethrow the exception in the D world.

    The implementation details of this are a bit crude, but the SWIG D module automatically takes care of this, as long as it is able to detect that an exception could potentially be thrown (e.g. because the C++ method has a throw(...) exception specification).

    As this feature is implemented in exactly the same way it is for C#, please see the C# documentation for a more detailed explanation.

    23.7 D Directors

    When the directors feature is activated, SWIG generates extra code on both the C++ and the D side to enable cross-language polymorphism. Essentially, this means that if you subclass a proxy class in D, C++ code can access any overridden virtual methods just as if you created a derived class in C++.

    There is no D specific documentation yet, but the way the feature is implemented is very similar to how it is done in Java and C#.

    23.8 Other features

    23.8.1 Extended namespace support (nspace)

    By default, SWIG flattens all C++ namespaces into a single target language namespace, but as for Java and C#, the nspace feature is supported for D. If it is active, C++ namespaces are mapped to D packages/modules. Note, however, that like for the other languages, free variables and functions are not supported yet; currently, they are all allows written to the main proxy D module.

    23.8.2 Native pointer support

    Contrary to many of the scripting languages supported by SWIG, D fully supports C-style pointers. The D module thus includes a custom mechanism to wrap C pointers directly as D pointers where applicable, that is, if the type that is pointed to is represented the same in C and D (on the bit-level), dubbed a primitive type below.

    Central to this custom pointer handling scheme are two typemap attributes: the cprimitive attribute on the dtype typemap and the nativepointer attribute on all the typemaps which influence the D side of the code (dtype, din, dout, ...). When a D typemap is looked up, the following happens behind the scenes:

    First, the matching typemap is determined by the usual typemap lookup rules. Then, it is checked if the result has the nativepointer attribute set. If it is present, it means that its value should replace the typemap value if and only if the actual type the typemap is looked up for is a primitive type, a pointer to a primitive type (through an arbitrary level of indirections), or a function pointer with only primitive types in its signature.

    To determine if a type should be considered primitive, the cprimitive attribute on its dtype attribute is used. For example, the dtype typemap for float has cprimitive="1", so the code from the nativepointer attribute is taken into account e.g. for float ** or the function pointer float (*)(float *).

    23.8.3 Operator overloading

    The D module comes with basic operator overloading support for both D1 and D2. There are, however, a few limitations arising from conceptual differences between C++ and D:

    The first key difference is that C++ supports free functions as operators (along with argument-dependent lookup), while D requires operators to be member functions of the class they are operating on. SWIG can only automatically generate wrapping code for member function operators; if you want to use operators defined as free functions in D, you need to handle them manually.

    Another set of differences between C++ and D concerns individual operators. For example, there are quite a few operators which are overloadable in C++, but not in D, for example && and ||, but also !, and prefix increment/decrement operators in D1 resp. their postfix pendants in D2.

    There are also some cases where the operators can be translated to D, but the differences in the implementation details are big enough that a rather involved scheme would be required for automatic wrapping them, which has not been implemented yet. This affects, for example, the array subscript operator, [], in combination with assignments - while operator [] in C++ simply returns a reference which is then written to, D resorts to a separate opIndexAssign method -, or implicit casting (which was introduced in D2 via alias this). Despite the lack of automatic support, manually handling these cases should be perfectly possible.

    23.8.4 Running the test-suite

    As with any other language, the SWIG test-suite can be built for D using the *-d-test-suite targets of the top-level Makefile. By default, D1 is targeted, to build it with D2, use the optional D_VERSION variable, e.g. make check-d-test-suite D_VERSION=2.

    Note: If you want to use GDC on Linux or another platform which requires you to link libdl for dynamically loading the shared library, you might have to add -ldl manually to the d_compile target in Examples/Makefile, because GDC does not currently honor the pragma(lib, ...) statement.

    23.9 D Typemap examples

    There are no D-specific typemap examples yet. However, with the above name comparison table, you should be able to get an idea what can be done by looking at the corresponding C# section.

    23.10 Work in progress and planned features

    There are a couple of features which are not implemented yet, but would be very useful and might be added in the near future:

    • Static linking: Currently, the C wrapper code is compiled into a dynamic library, out of which the symbol addresses are looked up at runtime by the D part. If statically linking the different languages into one binary was supported, a tool-chain capable of performing IPO at link time could inline the wrapping code, effectively reducing the overhead for simple calls to zero.
    • C array handling: Many data structures in some C/C++ libraries contain array containing of a pointer to the first element and the element count. Currently, one must manually writing wrapper code to be able to access these from D. It should be possible to add a set of SWIG macros to semi-automatically generate conversion code.

    Some generated code might also be a bit rough around the edges, particularly in the following areas:

    • Memory management: Although the currently generated wrapper code works fine with regard to the GC for the test-suite, there might be issues coming up in real-world multi-threaded usage.
    • D2 support: Originally, the module has been developed for the use with D1, D2/Phobos support has been added in later. The basic features should work equally well for both, but there could be issues concerning const-correctness etc.
    swig-4.0.2/Doc/Manual/Extending.html0000644000175000017500000036236113667507563017136 0ustar williamwilliam Extending SWIG to support new languages

    39 Extending SWIG to support new languages

    39.1 Introduction

    This chapter describes SWIG's internal organization and the process by which new target languages can be developed. First, a brief word of warning---SWIG is continually evolving. The information in this chapter is mostly up to date, but changes are ongoing. Expect a few inconsistencies.

    Also, this chapter is not meant to be a hand-holding tutorial. As a starting point, you should probably look at one of SWIG's existing modules.

    39.2 Prerequisites

    In order to extend SWIG, it is useful to have the following background:

    • An understanding of the C API for the target language.
    • A good grasp of the C++ type system.
    • An understanding of typemaps and some of SWIG's advanced features.
    • Some familiarity with writing C++ (language modules are currently written in C++).

    Since SWIG is essentially a specialized C++ compiler, it may be useful to have some prior experience with compiler design (perhaps even a compilers course) to better understand certain parts of the system. A number of books will also be useful. For example, "The C Programming Language" by Kernighan and Ritchie (a.k.a, "K&R") and the C++ standard, "ISO/IEC 14882 Programming Languages - C++" will be of great use.

    Also, it is useful to keep in mind that SWIG primarily operates as an extension of the C++ type system. At first glance, this might not be obvious, but almost all SWIG directives as well as the low-level generation of wrapper code are driven by C++ datatypes.

    39.3 The Big Picture

    SWIG is a special purpose compiler that parses C++ declarations to generate wrapper code. To make this conversion possible, SWIG makes three fundamental extensions to the C++ language:

    • Typemaps. Typemaps are used to define the conversion/marshalling behavior of specific C++ datatypes. All type conversion in SWIG is based on typemaps. Furthermore, the association of typemaps to datatypes utilizes an advanced pattern matching mechanism that is fully integrated with the C++ type system.
    • Declaration Annotation. To customize wrapper code generation, most declarations can be annotated with special features. For example, you can make a variable read-only, you can ignore a declaration, you can rename a member function, you can add exception handling, and so forth. Virtually all of these customizations are built on top of a low-level declaration annotator that can attach arbitrary attributes to any declaration. Code generation modules can look for these attributes to guide the wrapping process.
    • Class extension. SWIG allows classes and structures to be extended with new methods and attributes (the %extend directive). This has the effect of altering the API in the target language and can be used to generate OO interfaces to C libraries.

    It is important to emphasize that virtually all SWIG features reduce to one of these three fundamental concepts. The type system and pattern matching rules also play a critical role in making the system work. For example, both typemaps and declaration annotation are based on pattern matching and interact heavily with the underlying type system.

    39.4 Execution Model

    When you run SWIG on an interface, processing is handled in stages by a series of system components:

    • An integrated C preprocessor reads a collection of configuration files and the specified interface file into memory. The preprocessor performs the usual functions including macro expansion and file inclusion. However, the preprocessor also performs some transformations of the interface. For instance, #define statements are sometimes transformed into %constant declarations. In addition, information related to file/line number tracking is inserted.
    • A C/C++ parser reads the preprocessed input and generates a full parse tree of all of the SWIG directives and C declarations found. The parser is responsible for many aspects of the system including renaming, declaration annotation, and template expansion. However, the parser does not produce any output nor does it interact with the target language module as it runs. SWIG is not a one-pass compiler.
    • A type-checking pass is made. This adjusts all of the C++ typenames to properly handle namespaces, typedefs, nested classes, and other issues related to type scoping.
    • A semantic pass is made on the parse tree to collect information related to properties of the C++ interface. For example, this pass would determine whether or not a class allows a default constructor.
    • A code generation pass is made using a specific target language module. This phase is responsible for generating the actual wrapper code. All of SWIG's user-defined modules are invoked during this latter stage of compilation.

    The next few sections briefly describe some of these stages.

    39.4.1 Preprocessing

    The preprocessor plays a critical role in the SWIG implementation. This is because a lot of SWIG's processing and internal configuration is managed not by code written in C, but by configuration files in the SWIG library. In fact, when you run SWIG, parsing starts with a small interface file like this (note: this explains the cryptic error messages that new users sometimes get when SWIG is misconfigured or installed incorrectly):

    %include "swig.swg"             // Global SWIG configuration
    %include "langconfig.swg"       // Language specific configuration
    %include "yourinterface.i"      // Your interface file
    

    The swig.swg file contains global configuration information. In addition, this file defines many of SWIG's standard directives as macros. For instance, part of of swig.swg looks like this:

    ...
    /* Code insertion directives such as %wrapper %{ ... %} */
    
    #define %begin       %insert("begin")
    #define %runtime     %insert("runtime")
    #define %header      %insert("header")
    #define %wrapper     %insert("wrapper")
    #define %init        %insert("init")
    
    /* Access control directives */
    
    #define %immutable   %feature("immutable", "1")
    #define %mutable     %feature("immutable")
    
    /* Directives for callback functions */
    
    #define %callback(x) %feature("callback") `x`;
    #define %nocallback  %feature("callback");
    
    /* %ignore directive */
    
    #define %ignore         %rename($ignore)
    #define %ignorewarn(x)  %rename("$ignore:" x)
    ...
    

    The fact that most of the standard SWIG directives are macros is intended to simplify the implementation of the internals. For instance, rather than having to support dozens of special directives, it is easier to have a few basic primitives such as %feature or %insert.

    The langconfig.swg file is supplied by the target language. This file contains language-specific configuration information. More often than not, this file provides run-time wrapper support code (e.g., the type-checker) as well as a collection of typemaps that define the default wrapping behavior. Note: the name of this file depends on the target language and is usually something like python.swg or perl5.swg.

    As a debugging aid, the text that SWIG feeds to its C++ parser can be obtained by running swig -E interface.i. This output probably isn't too useful in general, but it will show how macros have been expanded as well as everything else that goes into the low-level construction of the wrapper code.

    39.4.2 Parsing

    The current C++ parser handles a subset of C++. Most incompatibilities with C are due to subtle aspects of how SWIG parses declarations. Specifically, SWIG expects all C/C++ declarations to follow this general form:

    storage type declarator initializer;
    

    storage is a keyword such as extern, static, typedef, or virtual. type is a primitive datatype such as int or void. type may be optionally qualified with a qualifier such as const or volatile. declarator is a name with additional type-construction modifiers attached to it (pointers, arrays, references, functions, etc.). Examples of declarators include *x, **x, x[20], and (*x)(int, double). The initializer may be a value assigned using = or body of code enclosed in braces { ... }.

    This declaration format covers most common C++ declarations. However, the C++ standard is somewhat more flexible in the placement of the parts. For example, it is technically legal, although uncommon to write something like int typedef const a in your program. SWIG simply doesn't bother to deal with this case.

    The other significant difference between C++ and SWIG is in the treatment of typenames. In C++, if you have a declaration like this,

    int blah(Foo *x, Bar *y);
    

    it won't parse correctly unless Foo and Bar have been previously defined as types either using a class definition or a typedef. The reasons for this are subtle, but this treatment of typenames is normally integrated at the level of the C tokenizer---when a typename appears, a different token is returned to the parser instead of an identifier.

    SWIG does not operate in this manner--any legal identifier can be used as a type name. The reason for this is primarily motivated by the use of SWIG with partially defined data. Specifically, SWIG is supposed to be easy to use on interfaces with missing type information.

    Because of the different treatment of typenames, the most serious limitation of the SWIG parser is that it can't process type declarations where an extra (and unnecessary) grouping operator is used. For example:

    int (x);         /* A variable x */
    int (y)(int);    /* A function y */
    

    The placing of extra parentheses in type declarations like this is already recognized by the C++ community as a potential source of strange programming errors. For example, Scott Meyers "Effective STL" discusses this problem in a section on avoiding C++'s "most vexing parse."

    The parser is also unable to handle declarations with no return type or bare argument names. For example, in an old C program, you might see things like this:

    foo(a, b) {
    ...
    }
    

    In this case, the return type as well as the types of the arguments are taken by the C compiler to be an int. However, SWIG interprets the above code as an abstract declarator for a function returning a foo and taking types a and b as arguments).

    39.4.3 Parse Trees

    The SWIG parser produces a complete parse tree of the input file before any wrapper code is actually generated. Each item in the tree is known as a "Node". Each node is identified by a symbolic tag. Furthermore, a node may have an arbitrary number of children. The parse tree structure and tag names of an interface can be displayed using swig -debug-tags. For example:

    $ swig -c++ -python -debug-tags example.i
     . top (example.i:1)
     . top . include (example.i:1)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/swig.swg:71)
     . top . include . typemap . typemapitem (/r0/beazley/Projects/lib/swig1.3/swig.swg:71)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/swig.swg:83)
     . top . include . typemap . typemapitem (/r0/beazley/Projects/lib/swig1.3/swig.swg:83)
     . top . include (example.i:4)
     . top . include . insert (/r0/beazley/Projects/lib/swig1.3/python/python.swg:7)
     . top . include . insert (/r0/beazley/Projects/lib/swig1.3/python/python.swg:8)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/python/python.swg:19)
    ...
     . top . include (example.i:6)
     . top . include . module (example.i:2)
     . top . include . insert (example.i:6)
     . top . include . include (example.i:9)
     . top . include . include . class (example.h:3)
     . top . include . include . class . access (example.h:4)
     . top . include . include . class . constructor (example.h:7)
     . top . include . include . class . destructor (example.h:10)
     . top . include . include . class . cdecl (example.h:11)
     . top . include . include . class . cdecl (example.h:11)
     . top . include . include . class . cdecl (example.h:12)
     . top . include . include . class . cdecl (example.h:13)
     . top . include . include . class . cdecl (example.h:14)
     . top . include . include . class . cdecl (example.h:15)
     . top . include . include . class (example.h:18)
     . top . include . include . class . access (example.h:19)
     . top . include . include . class . cdecl (example.h:20)
     . top . include . include . class . access (example.h:21)
     . top . include . include . class . constructor (example.h:22)
     . top . include . include . class . cdecl (example.h:23)
     . top . include . include . class . cdecl (example.h:24)
     . top . include . include . class (example.h:27)
     . top . include . include . class . access (example.h:28)
     . top . include . include . class . cdecl (example.h:29)
     . top . include . include . class . access (example.h:30)
     . top . include . include . class . constructor (example.h:31)
     . top . include . include . class . cdecl (example.h:32)
     . top . include . include . class . cdecl (example.h:33)
    

    Even for the most simple interface, the parse tree structure is larger than you might expect. For example, in the above output, a substantial number of nodes are actually generated by the python.swg configuration file which defines typemaps and other directives. The contents of the user-supplied input file don't appear until the end of the output.

    The contents of each parse tree node consist of a collection of attribute/value pairs. Internally, the nodes are simply represented by hash tables. A display of the entire parse-tree structure can be obtained using swig -debug-top <n>, where n is the stage being processed. There are a number of other parse tree display options, for example, swig -debug-module <n> will avoid displaying system parse information and only display the parse tree pertaining to the user's module at stage n of processing.

    $ swig -c++ -python -debug-module 4 example.i
          +++ include ----------------------------------------
          | name         - "example.i"
    
                +++ module ----------------------------------------
                | name         - "example"
                |
                +++ insert ----------------------------------------
                | code         - "\n#include \"example.h\"\n"
                |
                +++ include ----------------------------------------
                | name         - "example.h"
    
                      +++ class ----------------------------------------
                      | abstract     - "1"
                      | sym:name     - "Shape"
                      | name         - "Shape"
                      | kind         - "class"
                      | symtab       - 0x40194140
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Shape"
                            | name         - "Shape"
                            | decl         - "f()."
                            | code         - "{\n    nshapes++;\n  }"
                            | sym:symtab   - 0x40194140
                            |
                            +++ destructor ----------------------------------------
                            | sym:name     - "~Shape"
                            | name         - "~Shape"
                            | storage      - "virtual"
                            | code         - "{\n    nshapes--;\n  }"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "x"
                            | name         - "x"
                            | decl         - ""
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "y"
                            | name         - "y"
                            | decl         - ""
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "move"
                            | name         - "move"
                            | decl         - "f(double, double)."
                            | parms        - double, double
                            | type         - "void"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | value        - "0"
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | value        - "0"
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "nshapes"
                            | name         - "nshapes"
                            | decl         - ""
                            | storage      - "static"
                            | type         - "int"
                            | sym:symtab   - 0x40194140
                            |
                      +++ class ----------------------------------------
                      | sym:name     - "Circle"
                      | name         - "Circle"
                      | kind         - "class"
                      | bases        - 0x40194510
                      | symtab       - 0x40194538
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "private"
                            |
                            +++ cdecl ----------------------------------------
                            | name         - "radius"
                            | decl         - ""
                            | type         - "double"
                            |
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Circle"
                            | name         - "Circle"
                            | parms        - double
                            | decl         - "f(double)."
                            | code         - "{ }"
                            | sym:symtab   - 0x40194538
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194538
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194538
                            |
                      +++ class ----------------------------------------
                      | sym:name     - "Square"
                      | name         - "Square"
                      | kind         - "class"
                      | bases        - 0x40194760
                      | symtab       - 0x40194788
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "private"
                            |
                            +++ cdecl ----------------------------------------
                            | name         - "width"
                            | decl         - ""
                            | type         - "double"
                            |
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Square"
                            | name         - "Square"
                            | parms        - double
                            | decl         - "f(double)."
                            | code         - "{ }"
                            | sym:symtab   - 0x40194788
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194788
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194788
    

    39.4.4 Attribute namespaces

    Attributes of parse tree nodes are often prepended with a namespace qualifier. For example, the attributes sym:name and sym:symtab are attributes related to symbol table management and are prefixed with sym:. As a general rule, only those attributes which are directly related to the raw declaration appear without a prefix (type, name, declarator, etc.).

    Target language modules may add additional attributes to nodes to assist the generation of wrapper code. The convention for doing this is to place these attributes in a namespace that matches the name of the target language. For example, python:foo or perl:foo.

    39.4.5 Symbol Tables

    During parsing, all symbols are managed in the space of the target language. The sym:name attribute of each node contains the symbol name selected by the parser. Normally, sym:name and name are the same. However, the %rename directive can be used to change the value of sym:name. You can see the effect of %rename by trying it on a simple interface and dumping the parse tree. For example:

    %rename(foo_i) foo(int);
    %rename(foo_d) foo(double);
    
    void foo(int);
    void foo(double);
    void foo(Bar *b);
    

    There are various debug- options that can be useful for debugging and analysing the parse tree. For example, the debug-top <n> or debug-module <n> options will dump the entire/top of the parse tree or the module subtree at one of the four n stages of processing. The parse tree can be viewed after the final stage of processing by running SWIG:

    $ swig -debug-top 4 example.i
    ...
                +++ cdecl ----------------------------------------
                | sym:name     - "foo_i"
                | name         - "foo"
                | decl         - "f(int)."
                | parms        - int
                | type         - "void"
                | sym:symtab   - 0x40165078
                |
                +++ cdecl ----------------------------------------
                | sym:name     - "foo_d"
                | name         - "foo"
                | decl         - "f(double)."
                | parms        - double
                | type         - "void"
                | sym:symtab   - 0x40165078
                |
                +++ cdecl ----------------------------------------
                | sym:name     - "foo"
                | name         - "foo"
                | decl         - "f(p.Bar)."
                | parms        - Bar *
                | type         - "void"
                | sym:symtab   - 0x40165078
    

    All symbol-related conflicts and complaints about overloading are based on sym:name values. For instance, the following example uses %rename in reverse to generate a name clash.

    %rename(foo) foo_i(int);
    %rename(foo) foo_d(double);
    
    void foo_i(int);
    void foo_d(double);
    void foo(Bar *b);
    

    When you run SWIG on this you now get:

    $ ./swig example.i
    example.i:6. Overloaded declaration ignored.  foo_d(double )
    example.i:5. Previous declaration is foo_i(int )
    example.i:7. Overloaded declaration ignored.  foo(Bar *)
    example.i:5. Previous declaration is foo_i(int )
    

    39.4.6 The %feature directive

    A number of SWIG directives such as %exception are implemented using the low-level %feature directive. For example:

    %feature("except") getitem(int) {
      try {
         $action
      } catch (badindex) {
         ...
      }
    }
    
    ...
    class Foo {
    public:
      Object *getitem(int index) throws(badindex);
      ...
    };
    

    The behavior of %feature is very easy to describe--it simply attaches a new attribute to any parse tree node that matches the given prototype. When a feature is added, it shows up as an attribute in the feature: namespace. You can see this when running with the -debug-top 4 option. For example:

     +++ cdecl ----------------------------------------
     | sym:name     - "getitem"
     | name         - "getitem"
     | decl         - "f(int).p."
     | parms        - int
     | type         - "Object"
     | feature:except - "{\n    try {\n       $action\n    } catc..."
     | sym:symtab   - 0x40168ac8
     |
    

    Feature names are completely arbitrary and a target language module can be programmed to respond to any feature name that it wants to recognize. The data stored in a feature attribute is usually just a raw unparsed string. For example, the exception code above is simply stored without any modifications.

    39.4.7 Code Generation

    Language modules work by defining handler functions that know how to respond to different types of parse-tree nodes. These handlers simply look at the attributes of each node in order to produce low-level code.

    In reality, the generation of code is somewhat more subtle than simply invoking handler functions. This is because parse-tree nodes might be transformed. For example, suppose you are wrapping a class like this:

    class Foo {
    public:
      virtual int *bar(int x);
    };
    

    When the parser constructs a node for the member bar, it creates a raw "cdecl" node with the following attributes:

    nodeType    : cdecl
    name        : bar
    type        : int
    decl        : f(int).p
    parms       : int x
    storage     : virtual
    sym:name    : bar
    

    To produce wrapper code, this "cdecl" node undergoes a number of transformations. First, the node is recognized as a function declaration. This adjusts some of the type information--specifically, the declarator is joined with the base datatype to produce this:

    nodeType    : cdecl
    name        : bar
    type        : p.int        <-- Notice change in return type
    decl        : f(int).p
    parms       : int x
    storage     : virtual
    sym:name    : bar
    

    Next, the context of the node indicates that the node is really a member function. This produces a transformation to a low-level accessor function like this:

    nodeType    : cdecl
    name        : bar
    type        : int.p
    decl        : f(int).p
    parms       : Foo *self, int x            <-- Added parameter
    storage     : virtual
    wrap:action : result = (arg1)->bar(arg2)  <-- Action code added
    sym:name    : Foo_bar                     <-- Symbol name changed
    

    In this transformation, notice how an additional parameter was added to the parameter list and how the symbol name of the node has suddenly changed into an accessor using the naming scheme described in the "SWIG Basics" chapter. A small fragment of "action" code has also been generated--notice how the wrap:action attribute defines the access to the underlying method. The data in this transformed node is then used to generate a wrapper.

    Language modules work by registering handler functions for dealing with various types of nodes at different stages of transformation. This is done by inheriting from a special Language class and defining a collection of virtual methods. For example, the Python module defines a class as follows:

    class PYTHON : public Language {
    protected:
    public :
      virtual void main(int, char *argv[]);
      virtual int  top(Node *);
      virtual int  functionWrapper(Node *);
      virtual int  constantWrapper(Node *);
      virtual int  variableWrapper(Node *);
      virtual int  nativeWrapper(Node *);
      virtual int  membervariableHandler(Node *);
      virtual int  memberconstantHandler(Node *);
      virtual int  memberfunctionHandler(Node *);
      virtual int  constructorHandler(Node *);
      virtual int  destructorHandler(Node *);
      virtual int  classHandler(Node *);
      virtual int  classforwardDeclaration(Node *);
      virtual int  insertDirective(Node *);
      virtual int  importDirective(Node *);
    };
    

    The role of these functions is described shortly.

    39.4.8 SWIG and XML

    Much of SWIG's current parser design was originally motivated by interest in using XML to represent SWIG parse trees. Although XML is not currently used in any direct manner, the parse tree structure, use of node tags, attributes, and attribute namespaces are all influenced by aspects of XML parsing. Therefore, in trying to understand SWIG's internal data structures, it may be useful to keep XML in the back of your mind as a model.

    39.5 Primitive Data Structures

    Most of SWIG is constructed using three basic data structures: strings, hashes, and lists. These data structures are dynamic in same way as similar structures found in many scripting languages. For instance, you can have containers (lists and hash tables) of mixed types and certain operations are polymorphic.

    This section briefly describes the basic structures so that later sections of this chapter make more sense.

    When describing the low-level API, the following type name conventions are used:

    • String. A string object.
    • Hash. A hash object.
    • List. A list object.
    • String_or_char. A string object or a char *.
    • Object_or_char. An object or a char *.
    • Object. Any object (string, hash, list, etc.)

    In most cases, other typenames in the source are aliases for one of these primitive types. Specifically:

    typedef String SwigType;
    typedef Hash   Parm;
    typedef Hash   ParmList;
    typedef Hash   Node;
    typedef Hash   Symtab;
    typedef Hash   Typetab;
    

    39.5.1 Strings

    String *NewString(const String_or_char *val)

    Creates a new string with initial value val. val may be a char * or another String object. If you want to create an empty string, use "" for val.

    String *NewStringf(const char *fmt, ...)

    Creates a new string whose initial value is set according to a C printf style format string in fmt. Additional arguments follow depending on fmt.

    String *Copy(String *s)

    Make a copy of the string s.

    void Delete(String *s)

    Deletes s.

    int Len(const String_or_char *s)

    Returns the length of the string.

    char *Char(const String_or_char *s)

    Returns a pointer to the first character in a string.

    void Append(String *s, const String_or_char *t)

    Appends t to the end of string s.

    void Insert(String *s, int pos, const String_or_char *t)

    Inserts t into s at position pos. The contents of s are shifted accordingly. The special value DOH_END can be used for pos to indicate insertion at the end of the string (appending).

    int Strcmp(const String_or_char *s, const String_or_char *t)

    Compare strings s and t. Same as the C strcmp() function.

    int Strncmp(const String_or_char *s, const String_or_char *t, int len)

    Compare the first len characters of strings s and t. Same as the C strncmp() function.

    char *Strstr(const String_or_char *s, const String_or_char *pat)

    Returns a pointer to the first occurrence of pat in s. Same as the C strstr() function.

    char *Strchr(const String_or_char *s, char ch)

    Returns a pointer to the first occurrence of character ch in s. Same as the C strchr() function.

    void Chop(String *s)

    Chops trailing whitespace off the end of s.

    int Replace(String *s, const String_or_char *pat, const String_or_char *rep, int flags)

    Replaces the pattern pat with rep in string s. flags is a combination of the following flags:

    DOH_REPLACE_ANY       - Replace all occurrences
    DOH_REPLACE_ID        - Valid C identifiers only
    DOH_REPLACE_NOQUOTE   - Don't replace in quoted strings
    DOH_REPLACE_FIRST     - Replace first occurrence only.
    

    Returns the number of replacements made (if any).

    39.5.2 Hashes

    Hash *NewHash()

    Creates a new empty hash table.

    Hash *Copy(Hash *h)

    Make a shallow copy of the hash h.

    void Delete(Hash *h)

    Deletes h.

    int Len(Hash *h)

    Returns the number of items in h.

    Object *Getattr(Hash *h, const String_or_char *key)

    Gets an object from h. key may be a string or a simple char * string. Returns NULL if not found.

    int Setattr(Hash *h, const String_or_char *key, const Object_or_char *val)

    Stores val in h. key may be a string or a simple char *. If val is not a standard object (String, Hash, or List) it is assumed to be a char * in which case it is used to construct a String that is stored in the hash. If val is NULL, the object is deleted. Increases the reference count of val. Returns 1 if this operation replaced an existing hash entry, 0 otherwise.

    int Delattr(Hash *h, const String_or_char *key)

    Deletes the hash item referenced by key. Decreases the reference count on the corresponding object (if any). Returns 1 if an object was removed, 0 otherwise.

    List *Keys(Hash *h)

    Returns the list of hash table keys.

    39.5.3 Lists

    List *NewList()

    Creates a new empty list.

    List *Copy(List *x)

    Make a shallow copy of the List x.

    void Delete(List *x)

    Deletes x.

    int Len(List *x)

    Returns the number of items in x.

    Object *Getitem(List *x, int n)

    Returns an object from x with index n. If n is beyond the end of the list, the last item is returned. If n is negative, the first item is returned.

    int *Setitem(List *x, int n, const Object_or_char *val)

    Stores val in x. If val is not a standard object (String, Hash, or List) it is assumed to be a char * in which case it is used to construct a String that is stored in the list. n must be in range. Otherwise, an assertion will be raised.

    int *Delitem(List *x, int n)

    Deletes item n from the list, shifting items down if necessary. To delete the last item in the list, use the special value DOH_END for n.

    void Append(List *x, const Object_or_char *t)

    Appends t to the end of x. If t is not a standard object, it is assumed to be a char * and is used to create a String object.

    void Insert(String *s, int pos, const Object_or_char *t)

    Inserts t into s at position pos. The contents of s are shifted accordingly. The special value DOH_END can be used for pos to indicate insertion at the end of the list (appending). If t is not a standard object, it is assumed to be a char * and is used to create a String object.

    39.5.4 Common operations

    The following operations are applicable to all datatypes.

    Object *Copy(Object *x)

    Make a copy of the object x.

    void Delete(Object *x)

    Deletes x.

    void Setfile(Object *x, String_or_char *f)

    Sets the filename associated with x. Used to track objects and report errors.

    String *Getfile(Object *x)

    Gets the filename associated with x.

    void Setline(Object *x, int n)

    Sets the line number associated with x. Used to track objects and report errors.

    int Getline(Object *x)

    Gets the line number associated with x.

    39.5.5 Iterating over Lists and Hashes

    To iterate over the elements of a list or a hash table, the following functions are used:

    Iterator First(Object *x)

    Returns an iterator object that points to the first item in a list or hash table. The item attribute of the Iterator object is a pointer to the item. For hash tables, the key attribute of the Iterator object additionally points to the corresponding Hash table key. The item and key attributes are NULL if the object contains no items or if there are no more items.

    Iterator Next(Iterator i)

    Returns an iterator that points to the next item in a list or hash table. Here are two examples of iteration:

    List *l = (some list);
    Iterator i;
    
    for (i = First(l); i.item; i = Next(i)) {
      Printf(stdout, "%s\n", i.item);
    }
    
    Hash *h = (some hash);
    Iterator j;
    
    for (j = First(j); j.item; j= Next(j)) {
      Printf(stdout, "%s : %s\n", j.key, j.item);
    }
    

    39.5.6 I/O

    Special I/O functions are used for all internal I/O. These operations work on C FILE * objects, String objects, and special File objects (which are merely a wrapper around FILE *).

    int Printf(String_or_FILE *f, const char *fmt, ...)

    Formatted I/O. Same as the C fprintf() function except that output can also be directed to a string object. Note: the %s format specifier works with both strings and char *. All other format operators have the same meaning.

    int Printv(String_or_FILE *f, String_or_char *arg1, ..., NULL)

    Prints a variable number of strings arguments to the output. The last argument to this function must be NULL. The other arguments can either be char * or string objects.

    int Putc(int ch, String_or_FILE *f)

    Same as the C fputc() function.

    int Write(String_or_FILE *f, void *buf, int len)

    Same as the C write() function.

    int Read(String_or_FILE *f, void *buf, int maxlen)

    Same as the C read() function.

    int Getc(String_or_FILE *f)

    Same as the C fgetc() function.

    int Ungetc(int ch, String_or_FILE *f)

    Same as the C ungetc() function.

    int Seek(String_or_FILE *f, int offset, int whence)

    Same as the C seek() function. offset is the number of bytes. whence is one of SEEK_SET, SEEK_CUR, or SEEK_END..

    long Tell(String_or_FILE *f)

    Same as the C tell() function.

    File *NewFile(const char *filename, const char *mode, List *newfiles)

    Create a File object using the fopen() library call. This file differs from FILE * in that it can be placed in the standard SWIG containers (lists, hashes, etc.). The filename is added to the newfiles list if newfiles is non-zero and the file was created successfully.

    File *NewFileFromFile(FILE *f)

    Create a File object wrapper around an existing FILE * object.

    There's no explicit function to close a file, just call Delete(f) - this decreases the reference count, and the file will be closed when the reference count reaches zero.

    The use of the above I/O functions and strings play a critical role in SWIG. It is common to see small code fragments of code generated using code like this:

    /* Print into a string */
    String *s = NewString("");
    Printf(s, "Hello\n");
    for (i = 0; i < 10; i++) {
      Printf(s, "%d\n", i);
    }
    ...
    /* Print string into a file */
    Printf(f, "%s\n", s);
    

    Similarly, the preprocessor and parser all operate on string-files.

    39.6 Navigating and manipulating parse trees

    Parse trees are built as collections of hash tables. Each node is a hash table in which arbitrary attributes can be stored. Certain attributes in the hash table provide links to other parse tree nodes. The following macros can be used to move around the parse tree.

    String *nodeType(Node *n)

    Returns the node type tag as a string. The returned string indicates the type of parse tree node.

    Node *nextSibling(Node *n)

    Returns the next node in the parse tree. For example, the next C declaration.

    Node *previousSibling(Node *n)

    Returns the previous node in the parse tree. For example, the previous C declaration.

    Node *firstChild(Node *n)

    Returns the first child node. For example, if n was a C++ class node, this would return the node for the first class member.

    Node *lastChild(Node *n)

    Returns the last child node. You might use this if you wanted to append a new node to the children of a class.

    Node *parentNode(Node *n)

    Returns the parent of node n. Use this to move up the pass tree.

    The following macros can be used to change all of the above attributes. Normally, these functions are only used by the parser. Changing them without knowing what you are doing is likely to be dangerous.

    void set_nodeType(Node *n, const String_or_char)

    Change the node type. tree node.

    void set_nextSibling(Node *n, Node *s)

    Set the next sibling.

    void set_previousSibling(Node *n, Node *s)

    Set the previous sibling.

    void set_firstChild(Node *n, Node *c)

    Set the first child node.

    void set_lastChild(Node *n, Node *c)

    Set the last child node.

    void set_parentNode(Node *n, Node *p)

    Set the parent node.

    The following utility functions are used to alter the parse tree (at your own risk)

    void appendChild(Node *parent, Node *child)

    Append a child to parent. The appended node becomes the last child.

    void deleteNode(Node *node)

    Deletes a node from the parse tree. Deletion reconnects siblings and properly updates the parent so that sibling nodes are unaffected.

    39.7 Working with attributes

    Since parse tree nodes are just hash tables, attributes are accessed using the Getattr(), Setattr(), and Delattr() operations. For example:

    int functionHandler(Node *n) {
      String *name    = Getattr(n, "name");
      String *symname = Getattr(n, "sym:name");
      SwigType *type  = Getattr(n, "type");
      ...
    }
    

    New attributes can be freely attached to a node as needed. However, when new attributes are attached during code generation, they should be prepended with a namespace prefix. For example:

    ...
    Setattr(n, "python:docstring", doc);     /* Store docstring */
    ...
    

    A quick way to check the value of an attribute is to use the checkAttribute() function like this:

    if (checkAttribute(n, "storage", "virtual")) {
      /* n is virtual */
      ...
    }
    

    Changing the values of existing attributes is allowed and is sometimes done to implement node transformations. However, if a function/method modifies a node, it is required to restore modified attributes to their original values. To simplify the task of saving/restoring attributes, the following functions are used:

    int Swig_save(const char *ns, Node *n, const char *name1, const char *name2, ..., NIL)

    Saves a copy of attributes name1, name2, etc. from node n. Copies of the attributes are actually resaved in the node in a different namespace which is set by the ns argument. For example, if you call Swig_save("foo", n, "type", NIL), then the "type" attribute will be copied and saved as "foo:type". The namespace name itself is stored in the "view" attribute of the node. If necessary, this can be examined to find out where previous values of attributes might have been saved.

    int Swig_restore(Node *n)

    Restores the attributes saved by the previous call to Swig_save(). Those attributes that were supplied to Swig_save() will be restored to their original values.

    The Swig_save() and Swig_restore() functions must always be used as a pair. That is, every call to Swig_save() must have a matching call to Swig_restore(). Calls can be nested if necessary. Here is an example that shows how the functions might be used:

    int variableHandler(Node *n) {
      Swig_save("variableHandler", n, "type", "sym:name", NIL);
      String *symname = Getattr(n, "sym:name");
      SwigType *type  = Getattr(n, "type");
      ...
      Append(symname, "_global");        // Change symbol name
      SwigType_add_pointer(type);        // Add pointer
      ...
      generate wrappers
      ...
      Swig_restore(n);                  // Restore original values
      return SWIG_OK;
    }
    

    int Swig_require(const char *ns, Node *n, const char *name1, const char *name2, ..., NIL)

    This is an enhanced version of Swig_save() that adds error checking. If an attribute name is not present in n, a failed assertion results and SWIG terminates with a fatal error. Optionally, if an attribute name is specified as "*name", a copy of the attribute is saved as with Swig_save(). If an attribute is specified as "?name", the attribute is optional. Swig_restore() must always be called after using this function.

    39.8 Type system

    SWIG implements the complete C++ type system including typedef, inheritance, pointers, references, and pointers to members. A detailed discussion of type theory is impossible here. However, let's cover the highlights.

    39.8.1 String encoding of types

    All types in SWIG consist of a base datatype and a collection of type operators that are applied to the base. A base datatype is almost always some kind of primitive type such as int or double. The operators consist of things like pointers, references, arrays, and so forth. Internally, types are represented as strings that are constructed in a very precise manner. Here are some examples:

    C datatype                     SWIG encoding (strings)
    -----------------------------  --------------------------
    int                            "int"
    int *                          "p.int"
    const int *                    "p.q(const).int"
    int (*x)(int, double)          "p.f(int, double).int"
    int [20][30]                   "a(20).a(30).int"
    int (F::*)(int)                "m(F).f(int).int"
    vector<int> *                  "p.vector<(int)>"
    

    Reading the SWIG encoding is often easier than figuring out the C code---just read it from left to right. For a type of "p.f(int, double).int" is a "pointer to a function(int, double) that returns int".

    The following operator encodings are used in type strings:

    Operator              Meaning
    -------------------   -------------------------------
    p.                    Pointer to
    a(n).                 Array of dimension n
    r.                    C++ reference
    m(class).             Member pointer to class
    f(args).              Function.
    q(qlist).             Qualifiers
    

    In addition, type names may be parameterized by templates. This is represented by enclosing the template parameters in <( ... )>. Variable length arguments are represented by the special base type of v(...).

    If you want to experiment with type encodings, the raw type strings can be inserted into an interface file using backticks `` wherever a type is expected. For instance, here is an extremely perverted example:

    `p.a(10).p.f(int, p.f(int).int)` foo(int, int (*x)(int));
    

    This corresponds to the immediately obvious C declaration:

    (*(*foo(int, int (*)(int)))[10])(int, int (*)(int));
    

    Aside from the potential use of this declaration on a C programming quiz, it motivates the use of the special SWIG encoding of types. The SWIG encoding is much easier to work with because types can be easily examined, modified, and constructed using simple string operations (comparison, substrings, concatenation, etc.). For example, in the parser, a declaration like this

    int *a[30];
    

    is processed in a few pieces. In this case, you have the base type "int" and the declarator of type "a(30).p.". To make the final type, the two parts are just joined together using string concatenation.

    39.8.2 Type construction

    The following functions are used to construct types. You should use these functions instead of trying to build the type strings yourself.

    void SwigType_add_pointer(SwigType *ty)

    Adds a pointer to ty.

    void SwigType_del_pointer(SwigType *ty)

    Removes a single pointer from ty.

    void SwigType_add_reference(SwigType *ty)

    Adds a reference to ty.

    void SwigType_add_array(SwigType *ty, const String_or_char *size)

    Adds an array with dimension dim to ty.

    void SwigType_del_array(SwigType *ty)

    Removes a single array dimension from ty.

    int SwigType_array_ndim(SwigType *ty)

    Returns number of array dimensions of ty.

    String* SwigType_array_getdim(SwigType *ty, int n)

    Returns nth array dimension of ty.

    void SwigType_array_setdim(SwigType *ty, int n, const String_or_char *rep)

    Sets nth array dimensions of ty to rep.

    void SwigType_add_qualifier(SwigType *ty, const String_or_char *q)

    Adds a type qualifier q to ty. q is typically "const" or "volatile".

    void SwigType_add_memberpointer(SwigType *ty, const String_or_char *cls)

    Adds a pointer to a member of class cls to ty.

    void SwigType_add_function(SwigType *ty, ParmList *p)

    Adds a function to ty. p is a linked-list of parameter nodes as generated by the parser. See the section on parameter lists for details about the representation.

    void SwigType_add_template(SwigType *ty, ParmList *p)

    Adds a template to ty. p is a linked-list of parameter nodes as generated by the parser. See the section on parameter lists for details about the representation.

    SwigType *SwigType_pop(SwigType *ty)

    Removes the last type constructor from ty and returns it. ty is modified.

    void SwigType_push(SwigType *ty, SwigType *op)

    Pushes the type operators in op onto type ty. The opposite of SwigType_pop().

    SwigType *SwigType_pop_arrays(SwigType *ty)

    Removes all leading array operators from ty and returns them. ty is modified. For example, if ty is "a(20).a(10).p.int", then this function would return "a(20).a(10)." and modify ty so that it has the value "p.int".

    SwigType *SwigType_pop_function(SwigType *ty)

    Removes a function operator from ty including any qualification. ty is modified. For example, if ty is "f(int).int", then this function would return "f(int)." and modify ty so that it has the value "int".

    SwigType *SwigType_base(SwigType *ty)

    Returns the base type of a type. For example, if ty is "p.a(20).int", this function would return "int". ty is unmodified.

    SwigType *SwigType_prefix(SwigType *ty)

    Returns the prefix of a type. For example, if ty is "p.a(20).int", this function would return "p.a(20).". ty is unmodified.

    39.8.3 Type tests

    The following functions can be used to test properties of a datatype.

    int SwigType_ispointer(SwigType *ty)

    Checks if ty is a standard pointer.

    int SwigType_ismemberpointer(SwigType *ty)

    Checks if ty is a member pointer.

    int SwigType_isreference(SwigType *ty)

    Checks if ty is a C++ reference.

    int SwigType_isarray(SwigType *ty)

    Checks if ty is an array.

    int SwigType_isfunction(SwigType *ty)

    Checks if ty is a function.

    int SwigType_isqualifier(SwigType *ty)

    Checks if ty is a qualifier.

    int SwigType_issimple(SwigType *ty)

    Checks if ty is a simple type. No operators applied.

    int SwigType_isconst(SwigType *ty)

    Checks if ty is a const type.

    int SwigType_isvarargs(SwigType *ty)

    Checks if ty is a varargs type.

    int SwigType_istemplate(SwigType *ty)

    Checks if ty is a templatized type.

    39.8.4 Typedef and inheritance

    The behavior of typedef declaration is to introduce a type alias. For instance, typedef int Integer makes the identifier Integer an alias for int. The treatment of typedef in SWIG is somewhat complicated due to the pattern matching rules that get applied in typemaps and the fact that SWIG prefers to generate wrapper code that closely matches the input to simplify debugging (a user will see the typedef names used in their program instead of the low-level primitive C datatypes).

    To handle typedef, SWIG builds a collection of trees containing typedef relations. For example,

    typedef int Integer;
    typedef Integer *IntegerPtr;
    typedef int Number;
    typedef int Size;
    

    produces two trees like this:

                     int               p.Integer
                   ^  ^  ^                 ^
                  /   |   \                |
                 /    |    \               |
            Integer  Size   Number    IntegerPtr
    

    To resolve a single typedef relationship, the following function is used:

    SwigType *SwigType_typedef_resolve(SwigType *ty)

    Checks if ty can be reduced to a new type via typedef. If so, returns the new type. If not, returns NULL.

    Typedefs are only resolved in simple typenames that appear in a type. For example, the type base name and in function parameters. When resolving types, the process starts in the leaf nodes and moves up the tree towards the root. Here are a few examples that show how it works:

    Original type            After typedef_resolve()
    ------------------------ -----------------------
    Integer                  int
    a(30).Integer            int
    p.IntegerPtr             p.p.Integer
    p.p.Integer              p.p.int
    

    For complicated types, the process can be quite involved. Here is the reduction of a function pointer:

    p.f(Integer, p.IntegerPtr, Size).Integer          : Start
    p.f(Integer, p.IntegerPtr, Size).int
    p.f(int, p.IntegerPtr, Size).int
    p.f(int, p.p.Integer, Size).int
    p.f(int, p.p.int, Size).int
    p.f(int, p.p.int, int).int                        : End
    

    Two types are equivalent if their full type reductions are the same. The following function will fully reduce a datatype:

    SwigType *SwigType_typedef_resolve_all(SwigType *ty)

    Fully reduces ty according to typedef rules. Resulting datatype will consist only of primitive typenames.

    39.8.5 Lvalues

    When generating wrapper code, it is necessary to emit datatypes that can be used on the left-hand side of an assignment operator (an lvalue). However, not all C datatypes can be used in this way---especially arrays and const-qualified types. To generate a type that can be used as an lvalue, use the following function:

    SwigType *SwigType_ltype(SwigType *ty)

    Converts type ty to a type that can be used as an lvalue in assignment. The resulting type is stripped of qualifiers and arrays are converted to a pointers.

    The creation of lvalues is fully aware of typedef and other aspects of the type system. Therefore, the creation of an lvalue may result in unexpected results. Here are a few examples:

    typedef double Matrix4[4][4];
    Matrix4 x;    // type = 'Matrix4', ltype='p.a(4).double'
    
    typedef const char * Literal;
    Literal y;    // type = 'Literal', ltype='p.char'
    

    39.8.6 Output functions

    The following functions produce strings that are suitable for output.

    String *SwigType_str(SwigType *ty, const String_or_char *id = 0)

    Generates a C string for a datatype. id is an optional declarator. For example, if ty is "p.f(int).int" and id is "foo", then this function produces "int (*foo)(int)". This function is used to convert string-encoded types back into a form that is valid C syntax.

    String *SwigType_lstr(SwigType *ty, const String_or_char *id = 0)

    This is the same as SwigType_str() except that the result is generated from the type's lvalue (as generated from SwigType_ltype).

    String *SwigType_lcaststr(SwigType *ty, const String_or_char *id = 0)

    Generates a casting operation that converts from type ty to its lvalue. id is an optional name to include in the cast. For example, if ty is "q(const).p.char" and id is "foo", this function produces the string "(char *) foo".

    String *SwigType_rcaststr(SwigType *ty, const String_or_char *id = 0)

    Generates a casting operation that converts from a type's lvalue to a type equivalent to ty. id is an optional name to include in the cast. For example, if ty is "q(const).p.char" and id is "foo", this function produces the string "(const char *) foo".

    String *SwigType_manglestr(SwigType *ty)

    Generates a mangled string encoding of type ty. The mangled string only contains characters that are part of a valid C identifier. The resulting string is used in various parts of SWIG, but is most commonly associated with type-descriptor objects that appear in wrappers (e.g., SWIGTYPE_p_double).

    39.9 Parameters

    Several type-related functions involve parameter lists. These include functions and templates. Parameter list are represented as a list of nodes with the following attributes:

    "type"        -  Parameter type  (required)
    "name"        -  Parameter name  (optional)
    "value"       -  Initializer     (optional)
    

    Typically parameters are denoted in the source by using a typename of Parm * or ParmList *. To walk a parameter list, simply use code like this:

    Parm *parms;
    Parm *p;
    for (p = parms; p; p = nextSibling(p)) {
      SwigType *type  = Getattr(p, "type");
      String   *name  = Getattr(p, "name");
      String   *value = Getattr(p, "value");
      ...
    }
    

    Note: this code is exactly the same as what you would use to walk parse tree nodes.

    An empty list of parameters is denoted by a NULL pointer.

    Since parameter lists are fairly common, the following utility functions are provided to manipulate them:

    Parm *CopyParm(Parm *p);

    Copies a single parameter.

    ParmList *CopyParmList(ParmList *p);

    Copies an entire list of parameters.

    int ParmList_len(ParmList *p);

    Returns the number of parameters in a parameter list.

    String *ParmList_str(ParmList *p);

    Converts a parameter list into a C string. For example, produces a string like "(int *p, int n, double x);".

    String *ParmList_protostr(ParmList *p);

    The same as ParmList_str() except that parameter names are not included. Used to emit prototypes.

    int ParmList_numrequired(ParmList *p);

    Returns the number of required (non-optional) arguments in p.

    39.10 Writing a Language Module

    One of the easiest routes to supporting a new language module is to copy an already supported language module implementation and modify it. Be sure to choose a language that is similar in nature to the new language. All language modules follow a similar structure and this section briefly outlines the steps needed to create a bare-bones language module from scratch. Since the code is relatively easy to read, this section describes the creation of a minimal Python module. You should be able to extrapolate this to other languages.

    39.10.1 Execution model

    Code generation modules are defined by inheriting from the Language class, currently defined in the Source/Modules directory of SWIG. Starting from the parsing of command line options, all aspects of code generation are controlled by different methods of the Language that must be defined by your module.

    39.10.2 Starting out

    To define a new language module, first create a minimal implementation using this example as a guide:

    #include "swigmod.h"
    
    class PYTHON : public Language {
    public:
    
      virtual void main(int argc, char *argv[]) {
        printf("I'm the Python module.\n");
      }
    
      virtual int top(Node *n) {
        printf("Generating code.\n");
        return SWIG_OK;
      }
    
    };
    
    extern "C" Language *
    swig_python(void) {
      return new PYTHON();
    }
    

    The "swigmod.h" header file contains, among other things, the declaration of the Language base class and so you should include it at the top of your language module's source file. Similarly, the "swigconfig.h" header file contains some other useful definitions that you may need. Note that you should not include any header files that are installed with the target language. That is to say, the implementation of the SWIG Python module shouldn't have any dependencies on the Python header files. The wrapper code generated by SWIG will almost always depend on some language-specific C/C++ header files, but SWIG itself does not.

    Give your language class a reasonable name, usually the same as the target language. By convention, these class names are all uppercase (e.g. "PYTHON" for the Python language module) but this is not a requirement. This class will ultimately consist of a number of overrides of the virtual functions declared in the Language base class, in addition to any language-specific member functions and data you need. For now, just use the dummy implementations shown above.

    The language module ends with a factory function, swig_python(), that simply returns a new instance of the language class. As shown, it should be declared with the extern "C" storage qualifier so that it can be called from C code. It should also return a pointer to the base class (Language) so that only the interface (and not the implementation) of your language module is exposed to the rest of SWIG.

    Save the code for your language module in a file named "python.cxx" and place this file in the Source/Modules directory of the SWIG distribution. To ensure that your module is compiled into SWIG along with the other language modules, modify the file Source/Makefile.am to include the additional source files. In addition, modify the file Source/Modules/swigmain.cxx with an additional command line option that activates the module. Read the source---it's straightforward.

    Next, at the top level of the SWIG distribution, re-run the autogen.sh script to regenerate the various build files:

    $ ./autogen.sh
    

    Next re-run configure to regenerate all of the Makefiles:

    $ ./configure
    

    Finally, rebuild SWIG with your module added:

    $ make
    

    Once it finishes compiling, try running SWIG with the command-line option that activates your module. For example, swig -python foo.i. The messages from your new module should appear.

    39.10.3 Command line options

    When SWIG starts, the command line options are passed to your language module. This occurs before any other processing occurs (preprocessing, parsing, etc.). To capture the command line options, simply use code similar to this:

    void Language::main(int argc, char *argv[]) {
      for (int i = 1; i < argc; i++) {
        if (argv[i]) {
          if (strcmp(argv[i], "-interface") == 0) {
            if (argv[i+1]) {
              interface = NewString(argv[i+1]);
              Swig_mark_arg(i);
              Swig_mark_arg(i+1);
              i++;
            } else {
              Swig_arg_error();
            }
          } else if (strcmp(argv[i], "-globals") == 0) {
            if (argv[i+1]) {
              global_name = NewString(argv[i+1]);
              Swig_mark_arg(i);
              Swig_mark_arg(i+1);
              i++;
            } else {
              Swig_arg_error();
            }
          } else if ((strcmp(argv[i], "-proxy") == 0)) {
            proxy_flag = 1;
            Swig_mark_arg(i);
          } else if (strcmp(argv[i], "-keyword") == 0) {
            use_kw = 1;
            Swig_mark_arg(i);
          } else if (strcmp(argv[i], "-help") == 0) {
            fputs(usage, stderr);
          }
          ...
        }
      }
    }
    

    The exact set of options depends on what you want to do in your module. Generally, you would use the options to change code generation modes or to print diagnostic information.

    If a module recognizes an option, it should always call Swig_mark_arg() to mark the option as valid. If you forget to do this, SWIG will terminate with an unrecognized command line option error.

    39.10.4 Configuration and preprocessing

    In addition to looking at command line options, the main() method is responsible for some initial configuration of the SWIG library and preprocessor. To do this, insert some code like this:

    void main(int argc, char *argv[]) {
      ... command line options ...
    
      /* Set language-specific subdirectory in SWIG library */
      SWIG_library_directory("python");
    
      /* Set language-specific preprocessing symbol */
      Preprocessor_define("SWIGPYTHON 1", 0);
    
      /* Set language-specific configuration file */
      SWIG_config_file("python.swg");
    
      /* Set typemap language (historical) */
      SWIG_typemap_lang("python");
    }
    

    The above code does several things--it registers the name of the language module with the core, it supplies some preprocessor macro definitions for use in input files (so that they can determine the target language), and it registers a start-up file. In this case, the file python.swg will be parsed before any part of the user-supplied input file.

    Before proceeding any further, create a directory for your module in the SWIG library (The Lib directory). Now, create a configuration file in the directory. For example, python.swg.

    Just to review, your language module should now consist of two files-- an implementation file python.cxx and a configuration file python.swg.

    39.10.5 Entry point to code generation

    SWIG is a multi-pass compiler. Once the main() method has been invoked, the language module does not execute again until preprocessing, parsing, and a variety of semantic analysis passes have been performed. When the core is ready to start generating wrappers, it invokes the top() method of your language class. The argument to top is a single parse tree node that corresponds to the top of the entire parse tree.

    To get the code generation process started, the top() procedure needs to do several things:

    • Initialize the wrapper code output.
    • Set the module name.
    • Emit common initialization code.
    • Emit code for all of the child nodes.
    • Finalize the wrapper module and cleanup.

    An outline of top() might be as follows:

    int Python::top(Node *n) {
    
      /* Get the module name */
      String *module = Getattr(n, "name");
    
      /* Get the output file name */
      String *outfile = Getattr(n, "outfile");
    
      /* Initialize I/O (see next section) */
      ...
    
      /* Output module initialization code */
      ...
    
      /* Emit code for children */
      Language::top(n);
    
      ...
      /* Cleanup files */
      ...
    
      return SWIG_OK;
    }
    

    39.10.6 Module I/O and wrapper skeleton

    Within SWIG wrappers, there are five main sections. These are (in order)

    • begin: This section is a placeholder for users to put code at the beginning of the C/C++ wrapper file.
    • runtime: This section has most of the common SWIG runtime code.
    • header: This section holds declarations and inclusions from the .i file.
    • wrapper: This section holds all the wrapper code.
    • init: This section holds the module initialisation function (the entry point for the interpreter).

    Different parts of the SWIG code will fill different sections, then upon completion of the wrappering all the sections will be saved to the wrapper file.

    To perform this will require several additions to the code in various places, such as:

    class PYTHON : public Language {
    protected:
      /* General DOH objects used for holding the strings */
      File *f_begin;
      File *f_runtime;
      File *f_header;
      File *f_wrappers;
      File *f_init;
    
    public:
      ...
    
    };
    
    int Python::top(Node *n) {
    
      ...
    
      /* Initialize I/O */
      f_begin = NewFile(outfile, "w", SWIG_output_files());
      if (!f_begin) {
        FileErrorDisplay(outfile);
        SWIG_exit(EXIT_FAILURE);
      }
      f_runtime = NewString("");
      f_init = NewString("");
      f_header = NewString("");
      f_wrappers = NewString("");
    
      /* Register file targets with the SWIG file handler */
      Swig_register_filebyname("begin", f_begin);
      Swig_register_filebyname("header", f_header);
      Swig_register_filebyname("wrapper", f_wrappers);
      Swig_register_filebyname("runtime", f_runtime);
      Swig_register_filebyname("init", f_init);
    
      /* Output module initialization code */
      Swig_banner(f_begin);
      ...
    
      /* Emit code for children */
      Language::top(n);
    
      ...
      /* Write all to the file */
      Dump(f_runtime, f_begin);
      Dump(f_header, f_begin);
      Dump(f_wrappers, f_begin);
      Wrapper_pretty_print(f_init, f_begin);
    
      /* Cleanup files */
      Delete(f_runtime);
      Delete(f_header);
      Delete(f_wrappers);
      Delete(f_init);
      Delete(f_begin);
    
      return SWIG_OK;
    }
    

    Using this to process a file will generate a wrapper file, however the wrapper will only consist of the common SWIG code as well as any inline code which was written in the .i file. It does not contain any wrappers for any of the functions or classes.

    The code to generate the wrappers are the various member functions, which currently have not been touched. We will look at functionWrapper() as this is the most commonly used function. In fact many of the other wrapper routines will call this to do their work.

    A simple modification to write some basic details to the wrapper looks like this:

    int Python::functionWrapper(Node *n) {
      /* Get some useful attributes of this function */
      String   *name   = Getattr(n, "sym:name");
      SwigType *type   = Getattr(n, "type");
      ParmList *parms  = Getattr(n, "parms");
      String   *parmstr= ParmList_str_defaultargs(parms); // to string
      String   *func   = SwigType_str(type, NewStringf("%s(%s)", name, parmstr));
      String   *action = Getattr(n, "wrap:action");
    
      Printf(f_wrappers, "functionWrapper   : %s\n", func);
      Printf(f_wrappers, "           action : %s\n", action);
      return SWIG_OK;
    }
    

    This will now produce some useful information within your wrapper file.

    functionWrapper   : void delete_Shape(Shape *self)
               action : delete arg1;
    
    functionWrapper   : void Shape_x_set(Shape *self, double x)
               action : if (arg1) (arg1)->x = arg2;
    
    functionWrapper   : double Shape_x_get(Shape *self)
               action : result = (double) ((arg1)->x);
    
    functionWrapper   : void Shape_y_set(Shape *self, double y)
               action : if (arg1) (arg1)->y = arg2;
    ...
    

    39.10.7 Low-level code generators

    As ingenious as SWIG is, and despite all its capabilities and the power of its parser, the Low-level code generation takes a lot of work to write properly. Mainly because every language insists on its own manner of interfacing to C/C++. To write the code generators you will need a good understanding of how to manually write an interface to your chosen language, so make sure you have your documentation handy.

    At this point it is also probably a good idea to take a very simple file (just one function), and try letting SWIG generate wrappers for many different languages. Take a look at all of the wrappers generated, and decide which one looks closest to the language you are trying to wrap. This may help you to decide which code to look at.

    In general most language wrappers look a little like this:

    /* wrapper for TYPE3 some_function(TYPE1, TYPE2); */
    RETURN_TYPE _wrap_some_function(ARGS){
      TYPE1 arg1;
      TYPE2 arg2;
      TYPE3 result;
    
      if(ARG1 is not of TYPE1) goto fail;
      arg1=(convert ARG1);
      if(ARG2 is not of TYPE2) goto fail;
      arg2=(convert ARG2);
    
      result=some_function(arg1, arg2);
    
      convert 'result' to whatever the language wants;
    
      do any tidy up;
    
      return ALL_OK;
    
      fail:
      do any tidy up;
      return ERROR;
    }
    

    Yes, it is rather vague and not very clear. But each language works differently so this will have to do for now.

    Tackling this problem will be done in two stages:

    • The skeleton: the function wrapper, and call, but without the conversion
    • The conversion: converting the arguments to-from what the language wants

    The first step will be done in the code, the second will be done in typemaps.

    Our first step will be to write the code for functionWrapper(). What is shown below is NOT the solution, merely a step in the right direction. There are a lot of issues to address.

    • Variable length and default parameters
    • Typechecking and number of argument checks
    • Overloaded functions
    • Inout and Output only arguments
    virtual int functionWrapper(Node *n) {
      /* get useful attributes */
      String   *name   = Getattr(n, "sym:name");
      SwigType *type   = Getattr(n, "type");
      ParmList *parms  = Getattr(n, "parms");
      ...
    
      /* create the wrapper object */
      Wrapper *wrapper = NewWrapper();
    
      /* create the functions wrappered name */
      String *wname = Swig_name_wrapper(iname);
    
      /* deal with overloading */
      ....
    
      /* write the wrapper function definition */
      Printv(wrapper->def, "RETURN_TYPE ", wname, "(ARGS) {", NIL);
    
      /* if any additional local variable needed, add them now */
      ...
    
      /* write the list of locals/arguments required */
      emit_args(type, parms, wrapper);
    
      /* check arguments */
      ...
    
      /* write typemaps(in) */
      ....
    
      /* write constraints */
      ....
    
      /* Emit the function call */
      emit_action(n, wrapper);
    
      /* return value if necessary  */
      ....
    
      /* write typemaps(out) */
      ....
    
      /* add cleanup code */
      ....
    
      /* Close the function(ok) */
      Printv(wrapper->code, "return ALL_OK;\n", NIL);
    
      /* add the failure cleanup code */
      ...
    
      /* Close the function(error) */
      Printv(wrapper->code, "return ERROR;\n", "}\n", NIL);
    
      /* final substitutions if applicable */
      ...
    
      /* Dump the function out */
      Wrapper_print(wrapper, f_wrappers);
    
      /* tidy up */
      Delete(wname);
      DelWrapper(wrapper);
    
      return SWIG_OK;
    }
    

    Executing this code will produce wrappers which have our basic skeleton but without the typemaps, there is still work to do.

    39.10.8 Configuration files

    At the time of this writing, SWIG supports nearly twenty languages, which means that for continued sanity in maintaining the configuration files, the language modules need to follow some conventions. These are outlined here along with the admission that, yes it is ok to violate these conventions in minor ways, as long as you know where to apply the proper kludge to keep the overall system regular and running. Engineering is the art of compromise, see...

    Much of the maintenance regularity depends on choosing a suitable nickname for your language module (and then using it in a controlled way). Nicknames should be all lower case letters with an optional numeric suffix (no underscores, no dashes, no spaces). Some examples are: foo, bar, qux99.

    The numeric suffix variant, as in the last example, is somewhat tricky to work with because sometimes people expect to refer to the language without this number but sometimes that number is extremely relevant (especially when it corresponds to language implementation versions with incompatible interfaces). New language modules that unavoidably require a numeric suffix in their nickname should include that number in all uses, or be prepared to kludge.

    The nickname is used in four places:

    usagetransform
    "skip" tag(none)
    Examples/ subdir name(none)
    Examples/test-suite/ subdir name(none)

    As you can see, most usages are direct.

    configure.ac
    This file is processed by

    autoconf to generate the configure script. This is where you need to add shell script fragments and autoconf macros to detect the presence of whatever development support your language module requires, typically directories where headers and libraries can be found, and/or utility programs useful for integrating the generated wrapper code.

    Use the AC_ARG_WITH, AC_MSG_CHECKING, AC_SUBST macros and so forth (see other languages for examples). Avoid using the [ and ] character in shell script fragments. The variable names passed to AC_SUBST should begin with the nickname, entirely upcased.

    At the end of the new section is the place to put the aforementioned nickname kludges (should they be needed). See Perl5 for examples of what to do. [If this is still unclear after you've read the code, ping me and I'll expand on this further. --ttn]

    Makefile.in

    Some of the variables AC_SUBSTituted are essential to the support of your language module. Fashion these into a shell script "test" clause and assign that to a skip tag using "-z" and "-o":

    skip-qux99 = [ -z "@QUX99INCLUDE@" -o -z "@QUX99LIBS" ]

    This means if those vars should ever be empty, qux99 support should be considered absent and so it would be a good idea to skip actions that might rely on it.

    Here is where you may also define an alias (but then you'll need to kludge --- don't do this):

    skip-qux = $(skip-qux99)

    Lastly, you need to modify each of check-aliveness, check-examples, check-test-suite and lib-languages (var). Use the nickname for these, not the alias. Note that you can do this even before you have any tests or examples set up; the Makefile rules do some sanity checking and skip around these kinds of problems.

    Examples/Makefile.in
    Nothing special here; see comments at the top of this file and look to the existing languages for examples.
    Examples/qux99/check.list
    Do cp ../python/check.list . and modify to taste. One subdir per line.
    Lib/qux99/extra-install.list
    If you add your language to the top-level Makefile.in var lib-languages, then make install will install all *.i and *.swg files from the language-specific subdirectory of Lib. Use (optional) file extra-install.list in that directory to name additional files to install (see ruby for example).
    Source/Modules/Makefile.am
    Add appropriate files to this Automake file. That's it!

    When you have modified these files, please make sure that the new language module is completely ignored if it is not installed and detected on a box, that is, make check-examples and make check-test-suite politely displays the ignoring language message.

    39.10.9 Runtime support

    Discuss the kinds of functions typically needed for SWIG runtime support (e.g. SWIG_ConvertPtr() and SWIG_NewPointerObj()) and the names of the SWIG files that implement those functions.

    39.10.10 Standard library files

    The standard library files that most languages supply keeps growing as SWIG matures. The following are the minimum that are usually supported:

    • typemaps.i
    • std_string.i
    • std_vector.i
    • stl.i

    Please copy these and modify for any new language.

    39.10.11 User examples

    Each of the language modules provides one or more examples. These examples are used to demonstrate different features of the language module to SWIG end-users, but you'll find that they're useful during development and testing of your language module as well. You can use examples from the existing SWIG language modules for inspiration.

    Each example is self-contained and consists of (at least) a Makefile, a SWIG interface file for the example module, and a 'runme' script that demonstrates the functionality for that module. All of these files are stored in the same subdirectory under the Examples/[lang] directory. There are two classic examples which should be the first to convert to a new language module. These are the "simple" C example and the "class" C++ example. These can be found, for example for Python, in Examples/python/simple and Examples/python/class.

    By default, all of the examples are built and run when the user types make check. To ensure that your examples are automatically run during this process, see the section on configuration files.

    39.10.12 Test driven development and the test-suite

    A test driven development approach is central to the improvement and development of SWIG. Most modifications to SWIG are accompanied by additional regression tests and checking all tests to ensure that no regressions have been introduced.

    The regression testing is carried out by the SWIG test-suite. The test-suite consists of numerous testcase interface files in the Examples/test-suite directory as well as target language specific runtime tests in the Examples/test-suite/[lang] directory. When a testcase is run, it will execute the following steps for each testcase:

    1. Execute SWIG passing it the testcase interface file.
    2. Compile the resulting generated C/C++ code with either the C or C++ compiler into object files.
    3. Link the object files into a dynamic library (dll/shared object).
    4. Compile any generated and any runtime test target language code with the target language compiler, if the target language supports compilation. This step thus does not apply to the interpreted languages.
    5. Execute a runtime test if one exists.

    For example, the ret_by_value testcase consists of two components. The first component is the Examples/test-suite/ret_by_value.i interface file. The name of the SWIG module must always be the name of the testcase, so the ret_by_value.i interface file thus begins with:

    %module ret_by_value
    

    The testcase code will then follow the module declaration, usually within a %inline %{ ... %} section for the majority of the tests.

    The second component is the optional runtime tests. Any runtime tests are named using the following convention: [testcase]_runme.[ext], where [testcase] is the testcase name and [ext] is the normal extension for the target language file. In this case, the Java and Python target languages implement a runtime test, so their files are respectively, Examples/test-suite/java/ret_by_value_runme.java and Examples/test-suite/python/ret_by_value_runme.py.

    The goal of the test-suite is to test as much as possible in a silent manner. This way any SWIG or compiler errors or warnings are easily visible. Should there be any warnings, changes must be made to either fix them (preferably) or suppress them. Compilation or runtime errors result in a testcase failure and will be immediately visible. It is therefore essential that the runtime tests are written in a manner that displays nothing to stdout/stderr on success but error/exception out with an error message on stderr on failure.

    39.10.12.1 Running the test-suite

    In order for the test-suite to work for a particular target language, the language must be correctly detected and configured during the configure stage so that the correct Makefiles are generated. Most development occurs on Linux, so usually it is a matter of installing the development packages for the target language and simply configuring as outlined earlier.

    If when running the test-suite commands that follow, you get a message that the test was skipped, it indicates that the configure stage is missing information in order to compile and run everything for that language.

    The test-suite can be run in a number of ways. The first group of commands are for running multiple testcases in one run and should be executed in the top level directory. To run the entire test-suite (can take a long time):

    make -k check-test-suite
    

    To run the test-suite just for target language [lang], replace [lang] with one of csharp, java, perl5, python, ruby, tcl etc:

    make check-[lang]-test-suite
    

    Note that if a runtime test is available, a message "(with run test)" is displayed when run. For example:

    $ make check-python-test-suite
    checking python test-suite
    checking python testcase argcargvtest (with run test)
    checking python testcase python_autodoc
    checking python testcase python_append (with run test)
    checking python testcase callback (with run test)
    

    The files generated on a previous run can be deleted using the clean targets, either the whole test-suite or for a particular language:

    make clean-test-suite
    make clean-[lang]-test-suite
    

    The test-suite can be run in a partialcheck mode where just SWIG is executed, that is, the compile, link and running of the testcases is not performed. Note that the partialcheck does not require the target language to be correctly configured and detected and unlike the other test-suite make targets, is never skipped. Once again, either all the languages can be executed or just a chosen language:

    make partialcheck-test-suite
    make partialcheck-[lang]-test-suite
    

    If your computer has more than one CPU, you are strongly advised to use parallel make to speed up the execution speed. This can be done with any of the make targets that execute more than one testcase. For example, a dual core processor can efficiently use 2 parallel jobs:

    make -j2 check-test-suite
    make -j2 check-python-test-suite
    make -j2 partialcheck-java-test-suite
    

    The second group of commands are for running individual testcases and should be executed in the appropriate target language directory, Examples/test-suite/[lang]. Testcases can contain either C or C++ code and when one is written, a decision must be made as to which of these input languages is to be used. Replace [testcase] in the commands below with the name of the testcase.

    For a C language testcase, add the testcase under the C_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].ctest
    

    For a C++ language testcase, add the testcase under the CPP_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].cpptest
    

    A third category of tests are C++ language testcases testing multiple modules (the %import directive). These require more than one shared library (dll/shared object) to be built and so are separated out from the normal C++ testcases. Add the testcase under the MULTI_CPP_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].multicpptest
    

    To delete the generated files, execute:

    make -s [testcase].clean
    

    If you would like to see the exact commands being executed, drop the -s option:

    make [testcase].ctest
    make [testcase].cpptest
    make [testcase].multicpptest
    

    Some real examples of each:

    make -s ret_by_value.clean
    make -s ret_by_value.ctest
    make -s bools.cpptest
    make -s imports.multicpptest
    

    Advanced usage of the test-suite facilitates running tools on some of the five stages. The make variables SWIGTOOL and RUNTOOL are used to specify a tool to respectively, invoke SWIG and the execution of the runtime test. You are advised to view the Examples/test-suite/common.mk file for details but for a short summary, the classic usage is to use Valgrind for memory checking. For example, checking for memory leaks when running the runtime test in the target language interpreter:

    make ret_by_value.ctest RUNTOOL="valgrind --leak-check=full"
    

    This will probably make more sense if you look at the output of the above as it will show the exact commands being executed. SWIG can be analyzed for bad memory accesses using:

    make ret_by_value.ctest SWIGTOOL="valgrind --tool=memcheck --trace-children=yes"
    

    A debugger can also be invoked easily on an individual test, for example gdb:

    make ret_by_value.ctest RUNTOOL="gdb --args"
    

    SWIG reads the SWIG_FEATURES environment variable to obtain options in addition to those passed on the command line. This is particularly useful as the entire test-suite or a particular testcase can be run customized by using additional arguments, for example the -O optimization flag can be added in, as shown below for the bash shell:

    env SWIG_FEATURES=-O make check-python-test-suite
    

    The syntax for setting environment variables varies from one shell to the next, but it also works as shown in the example below, where some typemap debugging is added in:

    make ret_by_value.ctest SWIG_FEATURES="-debug-tmsearch"
    

    There is also a special 'errors' test-suite which is a set of regression tests checking SWIG warning and error messages. It can be run in the same way as the other language test-suites, replacing [lang] with errors, such as make check-errors-test-suite. The test cases used and the way it works is described in Examples/test-suite/errors/Makefile.in.

    39.10.13 Documentation

    Don't forget to write end-user documentation for your language module. Currently, each language module has a dedicated chapter You shouldn't rehash things that are already covered in sufficient detail in the SWIG Basics and SWIG and C++ chapters. There is no fixed format for what, exactly, you should document about your language module, but you'll obviously want to cover issues that are unique to your language.

    Some topics that you'll want to be sure to address include:

    • Command line options unique to your language module.
    • Non-obvious mappings between C/C++ and target language concepts. For example, if your target language provides a single floating point type, it should be no big surprise to find that C/C++ float and double types are mapped to it. On the other hand, if your target language doesn't provide support for "classes" or something similar, you'd want to discuss how C++ classes are handled.
    • How to compile the SWIG-generated wrapper code into shared libraries that can actually be used. For some languages, there are well-defined procedures for doing this, but for others it's an ad hoc process. Provide as much detail as appropriate, and links to other resources if available.

    39.10.14 Coding style guidelines

    The coding guidelines for the C/C++ source code are pretty much K&R C style. The style can be inferred from the existing code base and is largely dictated by the indent code beautifier tool set to K&R style. The code can formatted using the make targets in the Source directory. Below is an example of how to format the emit.cxx file:

    $ cd Source
    $ make beautify-file INDENTFILE=Modules/emit.cxx
    

    Of particular note is indentation is set to 2 spaces and a tab is used instead of 8 spaces. The generated C/C++ code should also follow this style as close as possible. However, tabs should be avoided as unlike the SWIG developers, users will never have consistent tab settings.

    39.10.15 Target language status

    Target languages are given a status of either 'Supported' or 'Experimental' depending on their maturity as broadly outlined in the Target language introduction. This section provides more details on how this status is given.

    39.10.15.1 Supported status

    A target language is given the 'Supported' status when

    • It is in a mature, well functioning state.
    • It has its own comprehensive chapter in the documentation. The level of documentation should be comprehensive and match the standard of the other mature modules. Python and Java are good references.
    • It passes all of the main SWIG test-suite. The main test-suite is defined by the tests in the C_TEST_CASES, CPP_TEST_CASES and MULTI_CPP_TEST_CASES lists in Examples/test-suite/common.mk. The tests in CPP11_TEST_CASES will also be required in the near future.
    • The test-suite must also include at least twenty wide-ranging runtime tests. The most mature languages have a few hundred runtime tests. Note that porting runtime tests from another language module is a quick and easy way to achieve this.
    • It supports the vast majority of SWIG features. Some more advanced features, such as, directors, full nested class support and target language namespaces (nspace) may be unimplemented. A few support libraries may be missing, for example, a small number of STL libraries.
    • It provides strong backwards compatibility between releases. Each point release must aim to be fully backwards compatible. A point release version is the 3rd version digit, so each of the x.y.* versions should be backwards compatible. Backwards compatibility breakages can occur in a new major or minor version if absolutely necessary and if documented. A major or minor version is the first or second digit in the three digit version.
    • Fixing unintended regressions in the Supported languages will be given higher priority over experimental languages by the core SWIG developers.
    • Examples must be available and run successfully.
    • The examples and test-suite must be fully functioning on the Travis Continuous Integration platform.

    39.10.15.2 Experimental status

    A target language is given the 'Experimental' status when

    • It is of sub-standard quality, failing to meet the above 'Supported' status.
    • It is somewhere between the mid to mature stage of development.
    • It is in need of help to finish development.

    Some minimum requirements and notes about languages with the 'Experimental' status:

    • Will at least implement basic functionality - support wrapping C functions and simple C++ classes and templates.
    • Have its own documentation chapter containing a reasonable level of detail. The documentation must provide enough basic functionality for a user to get started.
    • Have fully functional examples of basic functionality (the simple and class examples).
    • The test-suite must be implemented and include a few runtime tests for both C and C++ test cases.
    • Failing tests must be put into one of the FAILING_CPP_TESTS or FAILING_C_TESTS lists in the test-suite. This will ensure the test-suite can be superficially made to pass by ignoring failing tests. The number of tests in these lists should be no greater than half of the number of tests in the full test-suite.
    • The examples and test-suite must also be fully functioning on the Travis Continuous Integration platform. However, experimental languages will be set as 'allow_failures'. This means that pull requests and normal development commits will not break the entire Travis build should an experimental language fail.
    • Any new failed tests will be fixed on a 'best effort' basis by core developers with no promises made.
    • If a language module has an official maintainer, then the maintainer will be requested to focus on fixing test-suite regressions and commit to migrating the module to become a 'Supported' module.
    • If a module does not have an official maintainer, then, as maintenance will be on a 'best efforts' basis by the core maintainers, no guarantees will be provided from one release to the next and regressions may creep in.
    • Experimental target languages will have a (suppressible) warning explaining the Experimental sub-standard status and encourage users to help improve it.
    • No backwards compatibility is guaranteed as the module is effectively 'in development'. If a language module has an official maintainer, then a backwards compatibility guarantee may be provided at the maintainer's discretion and should be documented as such.

    39.10.16 Prerequisites for adding a new language module to the SWIG distribution

    New target language modules can be included in SWIG and contributions are encouraged for popular languages. In order to be considered for inclusion, a language must at a minimum fit the 'Experimental' status described above.

    Below are some practical steps that should help meet these requirements.

    1. The "simple" example needs to be working to demonstrate basic C code wrappers. Port the example from another language, such as from Examples/python/simple.
    2. The "class" example needs to be working to demonstrate basic C++ code wrappers. Port the example from another language, such as from Examples/python/class.
    3. Modify configure.ac, Makefile.in and Examples/Makefile.in to run these examples. Please make sure that if the new language is not installed properly on a box, make -k check should still work by skipping the tests and examples for the new language module.
    4. Copying an existing language module and adapting the source for it is likely to be the most efficient approach to fully developing a new module as a number of corner cases are covered in the existing implementations. The most advanced scripting languages are Python and Ruby. The most advanced compiled target languages are Java and C#.
    5. Get the test-suite running for the new language (make check-[lang]-test-suite). While the test-suite tests many corner cases, we'd expect the majority of it to work without much effort once the generated code is compiling correctly for basic functionality as most of the corner cases are covered in the SWIG core. Aim to first get one C and one C++ runtime test running in the test-suite. Adding further runtime tests should be a lot easier afterwards by porting existing runtime tests from another language module.
    6. The structure and contents of the html documentation chapter can be copied and adapted from one of the other language modules.
    7. Source code can be formatted correctly using the info in the coding style guidelines section.
    8. When ready, post a patch on Github, join the swig-devel mailing list and email the SWIG developers with a demonstration of commitment to maintaining the language module, certainly in the short term and ideally long term.

    Once accepted into the official Git repository, development efforts should concentrate on getting the entire test-suite to work in order to migrate the language module to the 'Supported' status. Runtime tests should be added for existing testcases and new test cases can be added should there be an area not already covered by the existing tests.

    39.11 Debugging Options

    There are various command line options which can aid debugging a SWIG interface as well as debugging the development of a language module. These are as follows:

    -debug-classes    - Display information about the classes found in the interface
    -debug-module <n> - Display module parse tree at stages 1-4, <n> is a csv list of stages
    -debug-symtabs    - Display symbol tables information
    -debug-symbols    - Display target language symbols in the symbol tables
    -debug-csymbols   - Display C symbols in the symbol tables
    -debug-lsymbols   - Display target language layer symbols
    -debug-tags       - Display information about the tags found in the interface
    -debug-template   - Display information for debugging templates
    -debug-top <n>    - Display entire parse tree at stages 1-4, <n> is a csv list of stages
    -debug-typedef    - Display information about the types and typedefs in the interface
    -debug-typemap    - Display information for debugging typemaps
    -debug-tmsearch   - Display typemap search debugging information
    -debug-tmused     - Display typemaps used debugging information
    

    The complete list of command line options for SWIG are available by running swig -help.

    39.12 Guide to parse tree nodes

    This section describes the different parse tree nodes and their attributes.

    cdecl

    Describes general C declarations including variables, functions, and typedefs. A declaration is parsed as "storage T D" where storage is a storage class, T is a base type, and D is a declarator.

    "name"          - Declarator name
    "type"          - Base type T
    "decl"          - Declarator type (abstract)
    "storage"       - Storage class (static, extern, typedef, etc.)
    "parms"         - Function parameters (if a function)
    "code"          - Function body code (if supplied)
    "value"         - Default value (if supplied)
    

    constructor

    C++ constructor declaration.

    "name"          - Name of constructor
    "parms"         - Parameters
    "decl"          - Declarator (function with parameters)
    "code"          - Function body code (if any)
    "feature:new"   - Set to indicate return of new object.
    

    destructor

    C++ destructor declaration.

    "name"          - Name of destructor
    "code"          - Function body code (if any)
    "storage"       - Storage class (set if virtual)
    "value"         - Default value (set if pure virtual).
    

    access

    C++ access change.

    "kind"          - public, protected, private
    

    constant

    Constant created by %constant or #define.

    "name"          - Name of constant.
    "type"          - Base type.
    "value"         - Value.
    "storage"       - Set to %constant
    "feature:immutable" - Set to indicate read-only
    

    class

    C++ class definition or C structure definition.

    "name"          - Name of the class.
    "kind"          - Class kind ("struct", "union", "class")
    "symtab"        - Enclosing symbol table.
    "tdname"        - Typedef name. Use for typedef struct { ... } A.
    "abstract"      - Set if class has pure virtual methods.
    "baselist"      - List of base class names.
    "storage"       - Storage class (if any)
    "unnamed"       - Set if class is unnamed.
    

    enum

    Enumeration.

    "name"          - Name of the enum (if supplied).
    "storage"       - Storage class (if any)
    "tdname"        - Typedef name (typedef enum { ... } name).
    "unnamed"       - Set if enum is unnamed.
    

    enumitem

    Enumeration value.

    "name"          - Name of the enum value.
    "type"          - Type (integer or char)
    "value"         - Enum value (if given)
    "feature:immutable" - Set to indicate read-only
    

    namespace

    C++ namespace.

    "name"          - Name of the namespace.
    "symtab"        - Symbol table for enclosed scope.
    "unnamed"       - Set if unnamed namespace
    "alias"         - Alias name. Set for namespace A = B;
    

    using

    C++ using directive.

    "name"          - Name of the object being referred to.
    "uname"         - Qualified name actually given to using.
    "node"          - Node being referenced.
    "namespace"     - Namespace name being reference (using namespace name)
    

    classforward

    A forward C++ class declaration.

    "name"          - Name of the class.
    "kind"          - Class kind ("union", "struct", "class")
    

    insert

    Code insertion directive. For example, %{ ... %} or %insert(section).

    "code"          - Inserted code
    "section"       - Section name ("header", "wrapper", etc.)
    

    top

    Top of the parse tree.

    "module"        - Module name
    

    extend

    %extend directive.

    "name"          - Module name
    "symtab"        - Symbol table of enclosed scope.
    

    apply

    %apply pattern { patternlist }.

    "pattern"       - Source pattern.
    "symtab"        - Symbol table of enclosed scope.
    

    clear

    %clear patternlist;

    "firstChild"    - Patterns to clear
    

    include

    %include directive.

    "name"         - Filename
    "firstChild"   - Children
    

    import

    %import directive.

    "name"         - Filename
    "firstChild"   - Children
    

    module

    %module directive.

    "name"         - Name of the module
    

    typemap

    %typemap directive.

    "method"       - Typemap method name.
    "code"         - Typemap code.
    "kwargs"       - Keyword arguments (if any)
    "firstChild"   - Typemap patterns
    

    typemapcopy

    %typemap directive with copy.

    "method"       - Typemap method name.
    "pattern"      - Typemap source pattern.
    "firstChild"   - Typemap patterns
    

    typemapitem

    %typemap pattern. Used with %apply, %clear, %typemap.

    "pattern"      - Typemap pattern (a parameter list)
    "parms"        - Typemap parameters.
    

    types

    %types directive.

    "parms"        - List of parameter types.
    "convcode"     - Code which replaces the default casting / conversion code
    

    extern

    extern "X" { ... } declaration.

    "name"       - Name "C", "Fortran", etc.
    

    39.13 Further Development Information

    There is further documentation available on the internals of SWIG, API documentation and debugging information. This is shipped with SWIG in the Doc/Devel directory.

    swig-4.0.2/Doc/Manual/Doxygen.html0000644000175000017500000012362613667507563016625 0ustar williamwilliam SWIG and Doxygen Translation

    17 SWIG and Doxygen Translation

    This chapter describes SWIG's support for translating Doxygen comments found in interface and header files into a target language's normal documentation language. Currently only Javadoc and Pydoc is supported.

    17.1 Doxygen translation overview

    The Doxygen Translation module of SWIG adds an extra layer of functionality to SWIG, allowing automated translation of Doxygen formatted comments from input files into a documentation language more suited for the target language. Currently this module only translates into Javadoc and Pydoc for the SWIG Java and Python modules. Other extensions could be added at a later date. The Doxygen Translation module originally started as a Google Summer of Code proposal from Summer 2008.

    17.2 Preparations

    To make use of the comment translation system, your documentation comments must be in properly formatted Doxygen. Doxygen comments can be present in your main SWIG interface file or any header file that it imports. You are advised to be validate that your comments compile properly with Doxygen before you try to translate them. Doxygen itself is a more comprehensive tool and can provide you better feedback for correcting any syntax errors that may be present. Please look at Doxygen's Documenting the code for the full comment format specifications. However, SWIG's Doxygen parser will still report many errors and warnings found in comments (like unterminated strings or missing ending tags).

    Currently, the whole subset of Doxygen comment styles is supported (See Documenting the code). Here they are:

    /**
     * Javadoc style comment, multiline
     */
    /*!
     * QT-style comment, multiline
     */
    /**
     Any of the above, but without intermediate *'s
     */
    /// Single-line comment
    //! Another single-line comment
    

    Also any of the above with '<' added after comment-starting symbol, like /**<, /*!<, ///<, or //!< will be treated as a post-comment and will be assigned to the code before the comment. Any number of '*' or '/' within a Doxygen comment is considered to be a separator and is not included in the final comment, so you may safely use comments like /*********/ or //////////.

    Please note, as SWIG parses the input file by itself with strict grammar, there is only a limited support for various cases of comment placement in the file.

    Comments can be placed before C/C++ expressions on separate lines:

    /**
     * Some comment
     */
    void someOtherFunction();
    /**
     * Some comment
     */
    void someFunction();
    
    class Shape {
      /*
       * Calculate the area in cm^2
       */
      int getArea();
    }
    

    After C/C++ expressions at the end of the line:

    int someVariable = 9; ///< This is a var holding magic number 9
    void doNothing(); ///< This does nothing, nop
    

    and in some special cases, like function parameter comments:

    void someFunction(
             int a ///< Some parameter 
         );
    

    or enum element comments:

    enum E_NUMBERS
    {
        EN_ZERO, ///< The first enum item, gets zero as it's value
        EN_ONE, ///< The second, EN_ONE=1
        EN_THREE
    };
    

    Currently only comments directly before or after the code items are supported. Doxygen also supports comments containing structural commands, where the comments for a code item are not put directly before or after the code item. These structural commands are stripped out by SWIG and are not assigned to anything.

    17.2.1 Enabling Doxygen translation

    Doxygen comments translation is disabled by default and needs to be explicitly enabled using the command line -doxygen option for the languages that do support it (currently Java and Python).

    17.2.2 Doxygen-specific %feature directives

    Translation of Doxygen comments is influenced by the following %feature directives:

    17.2.2.1 doxygen:notranslate

    Turns off translation of Doxygen comments to the target language syntax: the original comment will be copied to the output unchanged. This is useful if you want to use Doxygen itself to generate documentation for the target language instead of the corresponding language tool (javadoc, sphinx, ...).

    17.2.2.2 doxygen:alias:<command-name>

    Specify an alias for a Doxygen command with the given name. This can be useful for custom Doxygen commands which can be defined using ALIASES option for Doxygen itself but which are unknown to SWIG. "command-name" is the name of the command in the Doxyfile, e.g. if it contains

    ALIASES = "sideeffect=\par Side Effects:\n"
    

    Then you could also specify the same expansion for SWIG with:

    %feature("doxygen:alias:sideeffect") "\par Side Effects:\n"
    

    Please note that command arguments are not currently supported with this feature.

    Notice that it is perfectly possible and potentially useful to define the alias expansion differently depending on the target language, e.g. with

    #ifdef SWIGJAVA
    %feature("doxygen:alias:not_for_java") "This functionality is not available for Java"
    #else
    %feature("doxygen:alias:not_for_java") ""
    #endif
    

    you could use @not_for_java in the documentation comments of all functions which can't, for whatever reason, be currently exposed in Java wrappers of the C++ API.

    17.2.2.3 doxygen:ignore:<command-name>

    This feature makes it possible to just ignore an unknown Doxygen command, instead of replacing it with the predefined text that doxygen:alias does. For example, you could use

    %feature("doxygen:ignore:transferfull") Fantastic();
    /**
        A fantastic function.
    
        @transferfull Command ignored, but anything here is still included.
     */
    int * Fantastic();
    

    if you use a custom Doxygen transferfull command to indicate that the return value ownership is transferred to the caller, as this information doesn't make much sense for the other languages without explicit ownership management.

    Doxygen syntax is rather rich and, in addition to simple commands such as @transferfull, it is also possible to define commands with arguments. As explained in Doxygen documentation, the arguments can have a range of a single word, everything until the end of line or everything until the end of the next paragraph. Currently, only the "end of line" case is supported using the range="line" argument of the feature directive:

    // Ignore occurrences of
    //
    //    @compileroptions Some special C++ compiler options.
    //
    // in Doxygen comments as C++ options are not interesting for the target language
    // developers.
    %feature("doxygen:ignore:compileroptions", range="line") Amazing();
    
    /**
        An amazing function.
    
        @compileroptions This function must be compiled with /EHa when using MSVC.
     */
    void Amazing();
    
    

    In addition, it is also possible to have custom pairs of begin/end tags, similarly to the standard Doxygen @code/@endcode, for example. Such tags can also be ignored using the special value of range starting with end to indicate that the range is an interval, for example:

    %feature("doxygen:ignore:forcpponly", range="end"); // same as "end:endforcpponly"
    /**
        An incredible function.
    
        @forcpponly
        This is C++-specific.
        @endforcpponly
     */
    void Incredible();
    

    would ignore everything between @forcpponly and @endforcpponly commands in Doxygen comments. By default, the name of the end command is the same as of the start one with "end" prefix, following Doxygen conventions, but this can be overridden by providing the end command name after the colon.

    This example shows how custom tags can be used to bracket anything specific to C++ and prevent it from appearing in the target language documentation. Conversely, another pair of custom tags could be used to put target language specific information in the C++ comments. In this case, only the custom tags themselves should be ignored, but their contents should be parsed as usual and contents="parse" can be used for this:

    %feature("doxygen:ignore:beginPythonOnly", range="end:endPythonOnly", contents="parse");
    /**
        A splendid function.
    
        @beginPythonOnly
        This is specific to @b Python.
        @endPythonOnly
     */
    void Splendid();
    
    

    Putting everything together, if these directives are in effect:

    %feature("doxygen:ignore:transferfull");
    %feature("doxygen:ignore:compileroptions", range="line");
    %feature("doxygen:ignore:forcpponly", range="end");
    %feature("doxygen:ignore:beginPythonOnly", range="end:endPythonOnly", contents="parse");
    

    then the following C++ Doxygen comment:

    /**
        A contrived example of ignoring too many commands in one comment.
    
        @forcpponly
        This is C++-specific.
        @endforcpponly
    
        @beginPythonOnly
        This is specific to @b Python.
        @endPythonOnly
    
        @transferfull Command ignored, but anything here is still included.
    
        @compileroptions This function must be compiled with /EHa when using MSVC.
     */
    int * Contrived();
    

    would be translated to this comment in Python:

    def func():
        r"""
        A contrived example of ignoring too many commands in one comment.
    
        This is specific to **Python**.
    
        Command ignored, but anything here is still included.
        """
        ...
    

    17.2.2.4 doxygen:nolinktranslate

    Turn off automatic link-objects translation. This is only applicable to Java at the moment.

    17.2.2.5 doxygen:nostripparams

    Turn off stripping of @param and @tparam Doxygen commands if the parameter is not found in the function signature. This is only applicable to Java at the moment.

    17.2.3 Additional command line options

    ALSO TO BE ADDED (Javadoc auto brief?)

    17.3 Doxygen to Javadoc

    If translation is enabled, Javadoc formatted comments should be automatically placed in the correct locations in the resulting module and proxy files.

    17.3.1 Basic example

    Here is an example segment from an included header file

    /*! This is describing class Shape
     \author Bob
     */
    
    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      };
      double  x, y; /*!< Important Variables */
      void    move(double dx, double dy); /*!< Moves the Shape */
      virtual double area(void) = 0; /*!< \return the area */
      virtual double perimeter(void) = 0; /*!< \return the perimeter */
      static  int nshapes;
    };
    

    Simply running SWIG should result in the following code being present in Shapes.java

    
    /**
     * This is describing class Shape 
     * @author Bob 
     * 
     */
    
    public class Shape {
    
    ...
    
    /**
     * Important Variables 
     */
      public void setX(double value) {
        ShapesJNI.Shape_x_set(swigCPtr, this, value);
      }
    
    /**
     * Important Variables 
     */
      public double getX() {
        return ShapesJNI.Shape_x_get(swigCPtr, this);
      }
    
    /**
     * Moves the Shape 
     */
      public void move(double dx, double dy) {
        ShapesJNI.Shape_move(swigCPtr, this, dx, dy);
      }
    
    /**
     * @return the area 
     */
      public double area() {
        return ShapesJNI.Shape_area(swigCPtr, this);
      }
    
    /**
     * @return the perimeter 
     */
      public double perimeter() {
        return ShapesJNI.Shape_perimeter(swigCPtr, this);
      }
    }
    
    

    The code Java-wise should be identical to what would have been generated without the doxygen functionality enabled. When the Doxygen Translator module encounters a comment that contains nothing useful or a doxygen comment that it cannot parse, it will not affect the functionality of the SWIG generated code.

    The Javadoc translator will handle most of the tags conversions (see the table below). It will also automatically translate link-objects params, in \see and \link...\endlink commands. For example, 'someFunction(std::string)' will be converted to 'someFunction(String)'. If you don't want such behaviour, you could turn this off by using the 'doxygen:nolinktranslate' feature. Also all '\param' and '\tparam' commands are stripped out, if the specified parameter is not present in the function. Use 'doxygen:nostripparams' to avoid.

    Javadoc translator features summary (see %feature directives):

    17.3.2 Javadoc tags

    Here is the list of all Doxygen tags and the description of how they are translated to Javadoc

    Doxygen tags
    \a wrapped with <i> html tag
    \arg wrapped with <li> html tag
    \author translated to @author
    \authors translated to @author
    \b wrapped with <b> html tag
    \c wrapped with <code> html tag
    \cite wrapped with <i> html tag
    \code translated to {@code ...}
    \code{<ext>} translated to {@code ...}; code language extension is ignored
    \cond translated to 'Conditional comment: <condition>'
    \copyright replaced with 'Copyright:'
    \deprecated translated to @deprecated
    \e wrapped with <i> html tag
    \else replaced with '}Else:{'
    \elseif replaced with '}Else if: <condition>{'
    \em wrapped with <i> html tag
    \endcode see note for \code
    \endcond replaced with 'End of conditional comment.'
    \endif replaced with '}'
    \endlink see note for \link
    \endverbatim see note for \verbatim
    \exception translated to @exception
    \f$, \f[, \f], \f{, \f} LateX formulas are left unchanged
    \if replaced with 'If: <condition> {'
    \ifnot replaced with 'If not: <condition> {'
    \image translated to <img/> html tag only if target=HTML
    \li wrapped with <li> html tag
    \link translated to {@link ...}
    \n replaced with newline char
    \note replaced with 'Note:'
    \overload prints 'This is an overloaded ...' according to Doxygen docs
    \p wrapped with <code> html tag
    \par replaced with <p alt='title'>...</p>
    \param translated to @param
    \param[<dir>] translated to @param; parameter direction ('in'; 'out'; or 'in,out') is ignored
    \remark replaced with 'Remarks:'
    \remarks replaced with 'Remarks:'
    \result translated to @return
    \return translated to @return
    \returns translated to @return
    \sa translated to @see
    \see translated to @see
    \since translated to @since
    \throw translated to @throws
    \throws translated to @throws
    \todo replaced with 'TODO:'
    \tparam translated to @param
    \verbatim translated to {@literal ...}
    \version translated to @version
    \warning translated to 'Warning:'
    \$ prints $ char
    \@ prints @ char
    \\ prints \ char
    \& prints & char
    \~ prints ~ char
    \< prints < char
    \> prints > char
    \# prints # char
    \% prints % char
    \" prints " char
    \. prints . char
    \:: prints ::

    17.3.3 Unsupported tags

    Doxygen has a wealth of tags such as @latexonly that have no equivalent in Javadoc (all supported tags are listed in Javadoc documentation). As a result several tags have no translation or particular use, such as some linking and section tags. These are suppressed with their content just printed out (if the tag has any sense, typically text content). Here is the list of these tags:

    Unsupported Doxygen tags
    • \addindex
    • \addtogroup
    • \anchor
    • \attention
    • \brief
    • \bug
    • \callergraph
    • \callgraph
    • \category
    • \class
    • \copybrief
    • \copydetails
    • \copydoc
    • \date
    • \def
    • \defgroup
    • \details
    • \dir
    • \dontinclude
    • \dot
    • \dotfile
    • \enddot
    • \endhtmlonly
    • \endinternal
    • \endlatexonly
    • \endmanonly
    • \endmsc
    • \endrtfonly
    • \endxmlonly
    • \enum
    • \example
    • \extends
    • \file
    • \fn
    • \headerfile
    • \hideinitializer
    • \htmlinclude
    • \htmlonly
    • \implements
    • \include
    • \includelineno
    • \ingroup
    • \interface
    • \internal
    • \invariant
    • \latexonly
    • \line
    • \mainpage
    • \manonly
    • \memberof
    • \msc
    • \mscfile
    • \name
    • \namespace
    • \nosubgrouping
    • \package
    • \page
    • \paragraph
    • \post
    • \pre
    • \private
    • \privatesection
    • \property
    • \protected
    • \protectedsection
    • \protocol
    • \public
    • \publicsection
    • \ref
    • \related
    • \relatedalso
    • \relates
    • \relatesalso
    • \retval
    • \rtfonly
    • \section
    • \short
    • \showinitializer
    • \skip
    • \skipline
    • \snippet
    • \struct
    • \subpage
    • \subsection
    • \subsubsection
    • \tableofcontents
    • \test
    • \typedef
    • \union
    • \until
    • \var
    • \verbinclude
    • \weakgroup
    • \xmlonly
    • \xrefitem

    If one of the following Doxygen tags appears as the first tag in a comment, the whole comment block is ignored:

    Ignored Doxygen tags
    • \addtogroup
    • \callergraph
    • \callgraph
    • \category
    • \class
    • \def
    • \defgroup
    • \dir
    • \enum
    • \example
    • \file
    • \fn
    • \headerfile
    • \hideinitializer
    • \interface
    • \internal
    • \mainpage
    • \name
    • \namespace
    • \nosubgrouping
    • \overload
    • \package
    • \page
    • \property
    • \protocol
    • \relates
    • \relatesalso
    • \showinitializer
    • \struct
    • \typedef
    • \union
    • \var
    • \weakgroup

    17.3.4 Further details

    TO BE ADDED.

    17.4 Doxygen to Pydoc

    If translation is enabled, Pydoc formatted comments should be automatically placed in the correct locations in the resulting module and proxy files. The problem is that Pydoc has no tag mechanism like Doxygen or Javadoc, so most of Doxygen commands are translated by merely copying the appropriate command text.

    17.4.1 Basic example

    Here is an example segment from an included header file

    /*! This is describing class Shape
     \author Bob
     */
    
    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      };
      double  x, y; /*!< Important Variables */
      void    move(double dx, double dy); /*!< Moves the Shape */
      virtual double area(void) = 0; /*!< \return the area */
      virtual double perimeter(void) = 0; /*!< \return the perimeter */
      static  int nshapes;
    };
    

    Simply running SWIG should result in the following code being present in Shapes.py

    
    ...
    
    class Shape(_object):
        """
        This is describing class Shape 
        Authors:
        Bob 
    
        """
        
        ...
        
        def move(self, *args):
            """
            Moves the Shape 
            """
            return _Shapes.Shape_move(self, *args)
    
        def area(self):
            """
            Return:
            the area 
            """
            return _Shapes.Shape_area(self)
    
        def perimeter(self):
            """
            Return:
            the perimeter 
            """
            return _Shapes.Shape_perimeter(self)
    

    If any parameters of a function or a method are documented in the Doxygen comment, their description is copied into the generated output using Sphinx documentation conventions. For example

    /**
        Set a breakpoint at the given location.
    
        @param filename The full path to the file.
        @param line_number The line number in the file.
     */
    bool SetBreakpoint(const char* filename, int line_number);
    

    would be translated to

    def SetBreakpoint(filename, line_number):
        r"""
        Set a breakpoint at the given location.
    
        :type filename: string
        :param filename: The full path to the file.
        :type line_number: int
        :param line_number: The line number in the file.
        """
    

    The types used for the parameter documentation come from the "doctype" typemap which is defined for all the primitive types and a few others (e.g. std::string and shared_ptr<T>) but for non-primitive types is taken to be just the C++ name of the type with namespace scope delimiters (::) replaced with a dot. To change this, you can define your own typemaps for the custom types, e.g:

    %typemap(doctype) MyDate "datetime.date";
    

    Currently Doxygen comments assigned to global variables and static member variables are not present in generated code, so they have no comment translated for them.

    Whitespace and tables Whitespace is preserved when translating comments, so it makes sense to have Doxygen comments formatted in a readable way. This includes tables, where tags <th>, <td> and </tr>are translated to '|'. The line after line with <th> tags contains dashes. If we take care about whitespace, comments in Python are much more readable. Example:

    /**
     * <table border = '1'>
     * <caption>Animals</caption>
     * <tr><th> Column 1 </th><th> Column 2 </th></tr>
     * <tr><td> cow      </td><td> dog      </td></tr>
     * <tr><td> cat      </td><td> mouse    </td></tr>
     * <tr><td> horse    </td><td> parrot   </td></tr>
     * </table>
     */
    

    translates to Python as:

      Animals
      | Column 1 | Column 2 |
      -----------------------
      | cow      | dog      |
      | cat      | mouse    |
      | horse    | parrot   |
    

    Overloaded functions Since all the overloaded functions in c++ are wrapped into one Python function, Pydoc translator will combine every comment of every overloaded function and put it into the comment for the one wrapper function.

    If you intend to use resulting generated Python file with the Doxygen docs generator, rather than Pydoc, you may want to turn off translation completely (doxygen:notranslate feature). Then SWIG will just copy the comments to the proxy file and reformat them if needed, but all the comment content will be left as is. As Doxygen doesn't support special commands in Python comments (see Doxygen docs), you may want to use some tool like doxypy (doxypy) to do the work.

    17.4.2 Pydoc translator

    Here is the list of all Doxygen tags and the description of how they are translated to Pydoc

    Doxygen tags
    \a wrapped with '*'
    \arg prepended with '* '
    \author prints 'Author:'
    \authors prints 'Authors:'
    \b wrapped with '**'
    \c wrapped with '``'
    \cite wrapped with single quotes
    \code replaced with '.. code-block:: c++'
    \code{<ext>} replaced with '.. code-block:: <lang>', where the following doxygen code languages are recognized: .c -> C, .py -> python, .java > java
    \cond translated to 'Conditional comment: <condition>'
    \copyright prints 'Copyright:'
    \deprecated prints 'Deprecated:'
    \e wrapped with '*'
    \else replaced with '}Else:{'
    \elseif replaced with '}Else if: <condition>{'
    \em wrapped with '*'
    \endcond replaced with 'End of conditional comment.'
    \endif replaced with '}'
    \example replaced with 'Example:'
    \exception replaced with ':raises:'
    \f$ rendered using ':math:``'
    \f[ rendered using '.. math::'
    \f{ rendered using '.. math::'
    \if replaced with 'If: <condition> {'
    \ifnot replaced with 'If not: <condition> {'
    \li prepended with '* '
    \n replaced with newline char
    \note replaced with 'Note:'
    \overload prints 'This is an overloaded ...' according to Doxygen docs
    \p wrapped with '``'
    \par replaced with 'Title: ...'
    \param add ':type:' and ':param:' directives
    \param[<dir>] same as \param, but direction ('in'; 'out'; 'in,out') is included in ':type:' directive
    \remark replaced with 'Remarks:'
    \remarks replaced with 'Remarks:'
    \result add ':rtype:' and ':return:' directives
    \return add ':rtype:' and ':return:' directives
    \returns add ':rtype:' and ':return:' directives
    \sa replaced with 'See also:'
    \see replaced with 'See also:'
    \since replaced with 'Since:'
    \throw replaced with ':raises:'
    \throws replaced wih ':raises:'
    \todo replaced with 'TODO:'
    \tparam add ':type:' and ':param:' directives
    \verbatim content copied verbatim
    \version replaced with 'Version:'
    \warning translated to 'Warning:'
    \$ prints $ char
    \@ prints @ char
    \\ prints \ char
    \& prints & char
    \~ prints ~ char
    \< prints < char
    \> prints > char
    \# prints # char
    \% prints % char
    \" prints " char
    \. prints . character
    \:: prints ::

    17.4.3 Unsupported tags

    Doxygen has a wealth of tags such as @latexonly that have no equivalent in Pydoc. As a result several tags that have no translation (or particular use, such as some linking and section tags) are suppressed with their content just printed out (if it has any sense, typically text content). Here is the list of these tags:

    Unsupported Python Doxygen tags
    • \addindex
    • \addtogroup
    • \anchor
    • \attention
    • \brief
    • \bug
    • \callergraph
    • \callgraph
    • \category
    • \class
    • \copybrief
    • \copydetails
    • \copydoc
    • \date
    • \def
    • \defgroup
    • \details
    • \dir
    • \dontinclude
    • \dot
    • \dotfile
    • \enddot
    • \endhtmlonly
    • \endinternal
    • \endlatexonly
    • \endlink
    • \endmanonly
    • \endmsc
    • \endrtfonly
    • \endxmlonly
    • \enum
    • \extends
    • \file
    • \fn
    • \headerfile
    • \hideinitializer
    • \htmlinclude
    • \htmlonly
    • \image
    • \implements
    • \include
    • \includelineno
    • \ingroup
    • \interface
    • \internal
    • \invariant
    • \latexonly
    • \line
    • \link
    • \mainpage
    • \manonly
    • \memberof
    • \msc
    • \mscfile
    • \name
    • \namespace
    • \nosubgrouping
    • \package
    • \page
    • \paragraph
    • \post
    • \pre
    • \private
    • \privatesection
    • \property
    • \protected
    • \protectedsection
    • \protocol
    • \public
    • \publicsection
    • \ref
    • \related
    • \relatedalso
    • \relates
    • \relatesalso
    • \retval
    • \rtfonly
    • \section
    • \short
    • \showinitializer
    • \skip
    • \skipline
    • \snippet
    • \struct
    • \subpage
    • \subsection
    • \subsubsection
    • \tableofcontents
    • \test
    • \typedef
    • \union
    • \until
    • \var
    • \verbinclude
    • \weakgroup
    • \xmlonly
    • \xrefitem

    17.4.4 Further details

    TO BE ADDED.

    17.5 Troubleshooting

    When running SWIG with command line option -doxygen, it may happen that SWIG will fail to parse the code, which is valid C++ code and is parsed without problems without the option. The problem is, that Doxygen comments are not tokens (the C/C++ compiler actually never sees them) and that they can appear anywhere in the code. That's why it is practically impossible to handle all corner cases with the parser. However, these problems can usually be avoided by minor changes in the code or comment. Known problems and solutions are shown in this section.

    Recommended approach is to first run SWIG without command line option -doxygen. When it successfully processes the code, include the option and fix problems with Doxygen comments.

    17.5.1 Problem with conditional compilation

    Inserting a conditional compilation preprocessor directive between a Doxygen comment and a commented item may break parsing:

    class A {
      /**
       * Some func.
       */
      #ifndef SWIG
      void myfunc()
      {
      }
      #endif
    };
    

    The solution is to move the directive above the comment:

    class A {
      #ifndef SWIG
      /**
       * Some func.
       */
      void myfunc()
      {
      }
      #endif
    };
    

    17.6 Developer information

    This section contains information for developers enhancing the Doxygen translator.

    17.6.1 Doxygen translator design

    If this functionality is turned on, SWIG places all comments found into the SWIG parse tree. Nodes contain an additional attribute called doxygen when a comment is present. Individual nodes containing Doxygen with Structural Indicators, such as @file, as their first command, are also present in the parse tree. These individual "blobs" of Doxygen such as :

    /*! This is describing function Foo
     \param x some random variable
     \author Bob
     \return Foo
     */
    

    are passed on individually to the Doxygen Translator module. This module builds its own private parse tree and hands it to a separate class for translation into the target documentation language. For example, JavaDocConverter is the Javadoc module class.

    17.6.2 Debugging the Doxygen parser and translator

    There are two handy command line options, that enable lots of detailed debug information printing.

      -debug-doxygen-parser     - Display Doxygen parser module debugging information
      -debug-doxygen-translator - Display Doxygen translator module debugging information
    

    17.6.3 Tests

    Doxygen tests have been added to the regular SWIG test-suite. There are a number of tests beginning doxygen_ in the Examples/test-suite sub-directory.

    Like any other SWIG test case, the tests are included in Examples/test-suite/common.mk and can be tested with commands like make check-test-suite or make check-python-test-suite. To run them individually, type make -s <testname>.cpptest in the language-specific sub-directory in Examples/test-suite directory. For example:

      Examples/test-suite/java $ make -s doxygen_parsing.cpptest
    

    If the test fails, both expected and translated comments are printed to std out, but also written to files expected.txt and got.txt. Since it is often difficult to find a single character difference in several lines of text, we can use some diff tool, for example:

      Examples/test-suite/java $ kdiff3 expected.txt got.txt
    

    Runtime tests in Java are implemented using Javadoc doclets. To make that work, you should have tools.jar from the JDK in your classpath. Or you should have JAVA_HOME environment variable defined and pointing to the JDK location.

    The Java's comment parsing code (the testing part) is located in commentParser.java. It checks the generated code. It is possible to run this file as a stand-alone program, with java commentParser <some java package>, and it will print the list of comments found in the specified directory (in the format it has used in the runtime tests). So, when you want to create a new Doxygen test case, just copy an existing one and replace the actual comment content (section of entries in form 'wantedComments.put(...)' with the output of the above command.

    Runtime tests in Python are just plain string comparisons of the __doc__ properties.

    17.7 Extending to other languages

    In general, an extension to another language requires a fairly deep understanding of the target language module, such as Modules/python.cxx for Python. Searching for "doxygen" in the java.cxx module can give you a good idea of the process for placing documentation comments into the correct areas. The basic gist is that anywhere a comment may reside on a node, there needs to be a catch for it in front of where that function, class, or other object is written out to a target language file. The other half of extension is building a target documentation language comment generator that handles one blob at a time. However, this is relatively simple and nowhere near as complex as the wrapper generating modules in SWIG. See Source/Doxygen/javadoc.cxx for a good example. The target language module passes the Doxygen Translator the blob to translate, and receives back the translated text.

    What is given to the Doxygen Translator

    /*! This is describing function Foo
     \param x some random variable
     \author Bob
     \return Foo
     */
    

    What is received back by java.cxx

    /** This is describing function Foo
     *
     * @param x some random variable
     * @author Bob
     * @return Foo
     */
    

    Development of the comment translator itself is simplified by the fact that the Doxygen Translator module can easily include a main function and thus be developed, compiled, and tested independently of SWIG.

    swig-4.0.2/Doc/Manual/android-simple.png0000644000175000017500000001726413667507523017733 0ustar williamwilliam‰PNG  IHDRÎv)r{IDATxœí”UU½Ço ©©é³Ÿýì­·ÞzÇwüð‡?¼þúë]Ô§>õ)µùý7>¨w¿üòËoºé¦t:ýàƒ®^½ú[ßúÖ7¿ùMIÔç?ÿù›o¾yîܹcÇŽÍ;rÄð“Ÿ0lð rGØ©NÞ 02Ž‹.ºhn€[n¹åÅ_üç?ÿù‹_üâöÛoFM:ÕåÒhpÙe—¹¨òòò7Þxã¯ýë»ï¾û—¿üå׿þµ”ÁÅ*eqqqìÙ¡÷!Ѽæšk¾öµ¯Iô~øay¾úÕ¯®\¹²¶¶öë_ÿú7¾ñÏ|æ3R’hÆ¢qE%M¾ás+î;ëŽû&訸ïlçYxß„›—ŸyÉôñg×¢ô£². ^_ÕÕ z_}õÕÁ¨É“'»\ãÇŸ5k–‹zÉã¹çž“æÈ³}ûöW_}ÕÅjà;ûì³;érCn¾ô¥/©WRwfjˆ~á…t¸sçΫ®º*6×–-[öíÛWUUež{î¹?þøþðÝ_ õ¹Ï¨Éᥗ^ZQQ!+@†Ciié%—\"W†Æµ×^k{F+Á¡\S&O™ûøûží·üùÄŠç<ŸyîîCw>:pê”)gÙ‡Œ™Of¢z«/¿ñÆe̼óÎ;ºÒ]…ŸwÞy.—ælúU«Ví‹cÍš56Rj{vèT}ôQ‰¬î…À†ÜvÛmo½õVccãOúS…k´æª¬¬´wð‹_ü¢ yöÙgß{ï=‰þÚµk—/_žû¤#FŒY¡û~×]w=ñį¿þúßÿþ÷_þò—O>ùä’%K®X‰{4ãy“λþ®1Ë·}¸z[BîkŽ™ué%Éä¬drvrÖœdòÒdòâ9³fNŸ9½èŒ"¥Ï[†Äqæ™gªk—¦>ýôÓê¶uÔ+H4ŠÉ°yûí·u!4&(z}—Ksp %%%jŒ®ò‹-¨Sq~õ%š@ŸvÚi±g‡ÎCÖ¶¤ݺurþóŸ»pÝq둱ºgÏyæÏŸ¯ýÝï~W~'Vuöºï_øÂl¬üšê^ËôÝïyO>ùdMùÔåÿñ”DmÛ¶M¢%÷•W^ùóŸÿ,C±Ã† å5bÄÉ¢÷ ªz&QõtŸª-‰O/ýÉiŸœ=köW¬yçÿÞÙ¹ó…ÊÊÏMŸ:}ÊESN;ÕˆSÇ(€¦#à4`©ºj§ì6Ín¥°¦OŸ®Jÿä'?QˆÒœ~úé­Õ5J×bµÇ† þ·Mÿûßÿ¾Í~ìã£|ît 7ÜpƒZ·5¨½“Éä—¿üe;J+Dcþ?þñ òë†J{ì1§ÿåÿñ,Wã€lãýž÷¬³Î’e¡þ^«Æù§L™"‰Ò$Xv„b‡L?|øÐqcO½å‘ƒïþŸßûTâž§þåž§so:éüIKÒé×_}m÷뻯H]9iây“&NRi#GÒ8)‰²}¦©jpœ1c†,6õ Ò{É®,Cpœ‡„Øå’Kî¾ûn…ÿà?pfzç× «ØÅ‹+¥¬Ø³Cg#kÛ*€ ‘aãn:c¨NB)ÅôkªúÈ#(Á½÷Þ«(« »víºÿþû52H$$ĹOªßÊ̲eËš››5åP‡¨ÙˆŒ*vðàÁÁôC‡ •VT®í·øÛN?‘Ho0ÇìkŽ¿éÆ›^ØþÂk¯¼¶mû¶]/¾¨š\TrÑØÓÆ=y¨ruŒH“ì,D›F¨t:-ãG  oݺUS7MÑÐÌ%Sï{ßûž:ŒçŸÞ ýo¼áüºè?ü°Ò(e¨ÁÐeD@]ò¢E‹48kœ×ýR袞yæ™ßÿþ÷êªëëë•K½Fo«wÞy§¬_¿^~W9Îxâ‰'Ú·ŸbÓ¦MÏ=÷ÜSO=%ÐDB]¡£½á¨Q#¦N›>;5¸ìþûÜc‰ÿ|,±øÛ‰’+Žqòˆ“‡Ÿ|ö¹g?ÞðdÍWª'Nœ4rÄÈ“†žtâ 'žÔ”[ uðwÙj2ߥåRwõ ÁZüñ.‹üj§¬Æ|ðg?û™ú_ýêWÎÿÒK/ÉpT¥Ìvjèl$pº/¿ür4J¢©(õúò«V'¥®:ô$CÝvMM<ÕÕÕJ¶qãFùeÇç8£dã„N°2£éŸ,u’%M!Ôo*P±AY 3z̸3ÆÏPù_ ‹þ;1ë¦)á ãYt¦ “aC‡§LÇ*,,ñ et±‡~¸j/#Rª)Wþ#Ž8ÂÅ*å!‡ÒI—zR€|ä#’Ýzý\¶l™:DM)e÷+ÄFÅ*€P͆fA¦—æ“ÇëÛWy+ÀÑq¨*z[oËĉïºë.Y~.D±cÇŽUÊ`®SN9EÃVl™A”æÔSO æ…ÞîµfºêccmT‡ÈCÇ(€l)Éú´ý¡4êÝ].‰õ9眳ß\– & z7îÑ£G“%Ž)S¦¨Cìå­‡ô"òV€€^ 4y+Àa½ˆ¼ vemíªZ\ÜÞá¶GªWV›ÌÞ!õ ÿ¨ZQ Ç¿çûóV€ê“Ó¹UË«ÒKÓUËZÜei£ ™iä*™Ñ7kÊY–öÝeUÁôÑÒ²¹¹Ï‚‹uójLN{È_¹¤²rQeùÂòÊ…•ò5ü-¯¦ñõd™¯!&AK¸ªZZeËÑáûU”Ó„@9¹ý¶|{È¿ßôøñç?x]²s%©ÍÛ›ß~ïm±cçI°t ½$mÜ¥ž,.1®Âeo)MÃÆ“Æ 7R¾$-åÑ¡Bö¾µWÇŽ—M!RM•Ù°¡Á/Е™Y²üpeaeõªê}ûö5nj4êä)¤IiÕ2³æ¸¸íU€ÀQ¿Öüé¡ik“d®isSyE¹‘¼…•ƳÐ<\ÉhÓ–&²lA™~ÚÃD-(¯[Sg Ùâ²Å"‘mÞÖœ‘xA¹óØ’Ûâ±çU”²¨(©™MïÒXÍ Užƒ#oÙÙ%pê°Kç”–Í/K]—Ú»w¯†‚²ËÔ—+J3c+”n¹õëë%ÓŠ²ÿ”·ÊS¿®Þ¦LÍK)£n[OãæF3>ìÝ«=oîQÞæ­Í©S¶äºµuŠRxåÒJUÉ(Àú†äܤ…›Äۛ̀#û*sv‹›ÿ°¼ÚZùÎ}û-cÿH¾ìÎ/3Ñ[o—Î-•ÈJ(5DHj•@ón#Óëê­¸K"¥ÐÔ‚”üJl Q·--ò`]½ ó_ÒWv™y¨«?êã¥3V…¤ Fз5KüŒKÓÆâÚР4¶äô"oˆÔ÷@vóVnêòKè%Uêò%vr%÷Ö(’ØI¦5>¨ó–\îÚ½K¹í­uÈSVaTE¢,¥óK]! Tˆ•{¥´¹$ÐÅïÙ³Gå”\X" Ç”° ÌŠ»,(JI” t;¯°ºaͰPýñàþ¼Àå´‡@òšœÜ±}Ǿ÷ö¥æ§di9ÞÖ¬~Z½µDVr)5p¢Y:¯T!J‰¦dW?•KÆŒ(åR¸¬—°¬­/™Z"m‘”Ë£~ÝW+ؽ+¨fv¬Z¹W¸õ„êÏq€ùKÓUK[ž½,M7mjÒ´U=´dZmºó¹¥Ö/¡—ŒÚXš`eZÂ* ±ÆIíªZ• ÑW®B¤ {vï1FÑÜT•gÊ[KÆz¤cVäñ ÂWɽòªLÙB.½¢lǯFš¹DMµ(‡êÿ÷ç?d–bì{ÍÞ{[‚[»ºÖôåóS;¶cF?ÍLÀ›†jÂêdº|a¹´Â΀nÔTK|m2‰xÝê:•à&ÁU-“Zé‰Q€Ý»ä±3oóòaI¥û÷°bíƒQ›^³e·ÅÊ•"ýø£þüG€àóø%iÍDÍÜ÷:s˜'ÞOç‰J¸Õ‹«c.™Q"¿(65Êcþ˜d-O<íRÿé§-Á{ j‹ÒØ¢\i¯¿7š6§ÔÔÁ‹²OE[ëИñŽwI» pøÒVxèz<¿ÐUlO|ÕU›ç¤ Êì«1‰¯Ñ“@ ¦k_Ôš«õ‘fù*Ê*R_UyýÒZêà¿ àày+€£ keNn(<6¥ÄÑØúÞ³|Y&ö•”a¿y£®rù¯½64˜ q‹ˆãâ¶ÝmÏÐîóU.ªtfŒŽÔu)¿ão—ìºÞÝõñÝ~5q?pnŒíÐÉ«[ãÐ>éOFžÊ¶?¸¸Q·KG\Üžævõ€‹Û£Ü¼|úè_<©89'Y:§´ó\¢=ÿÞèTúÔ¯zeµYë¶µ¹ikSç¹M››jWÕJÙº»Åª–WízŬ?3nç»}·ª&ÿuKÇ®—wííB¤ÝÝb€öOX{ßì:·»[ @BÙ*{:Ù}Ó,“îîPv1ÝÝb€¾Tîî׺»ÅöxÿеOi$¦î‰Mgùw3 †žD«ô¿²Ç=µì<¿t »[ ÀHçËæØñòŽNw=Mèîð¥çç&ú&† R8¨ÐìŠï×Óîn1@+æØî»ýêgý%SKjWÕºðŽqwîèî°BÙ¼½Yj]«òWy{5mn*šPdCRóRõëê›·6+’¿xR±”$˜7·ku »[ ÀHç¶æà!°ž¢ñE÷ÆMòسcܺú¦-M2“ä*$9#iT"³„¬Çvstw‹˜½ß¶íP§nÔsÍ`Ø©AÕŠ*…´*ÀÖf»e¢D_“¢y‚Ì$—w?î63tw‹H(ýË[|׎•Þ?tC œ“´ 0zÔè¶+€+ÙW0€žƒJ+[Œë+€ç/Tذ¡¡iSSÁQ6Jžº5uR £^³ôÊjù«–WÙ4A+³UPèQX¹4Çfß•XuMµú~ù%åR†â ÅÉÙIõ÷Ø4fÿÕÕÒ“‚‚…øž-M.$X²q·6uw‹˜ÿjYéÜÜÔ¸¹Ñz:ÉoÇîn1@óE£Ífû6}Xèî°Ý¿•ÎVIÝÔ þÍþ·Ãº»ÅZå~c—¸›»»Å¬ÞEÒïÝÝb€¾ôollØØÐé®§ÝÝb€þô—LÜÀï¡7v²Ÿz ëºbÜr4lhèîH/Mûo¬Ü“ÐÍî÷߈mijÏçœ:þýû×­©³«tÚ´¢³ÝîÖæúµõG±?.ô0 ’3’ö‘©ëRîÚ?ê… »»­kW×Ö­­+_PžèÛ1eŽ>utåBóÕ↠ukêt”W´µp—×Q4®¨uh{®ö•½YN_ó¼âIÅRfá`³£hFáËÚZ¸ËëÓ7Q»ª6ï´=Wûʇ^ƒ[—V:·TGÿýÓKÓå Ë­X$g˜ t7ݤb«WTW¯¬®]YÛ¯_?ý¬ZQ%uMµ~º2^2µ$á­± ^pT²ÛuóêzM5Õ•‹*ÍŒKÓG—×’šŸÒ¥Ø!ƒ‡ë#O°¡š(——+½,­:×­®2lˆMìÚ*8¬Œšï×TËüpHt¬4hXHx+…ê×Õ'<ù+WjÒ{â.IMÍK¹Ÿ1…{Ú¥XIçèQ£Ô„@ò§òÞ‚<¥ Ñ7Q¿¶Þz•ݨ¥gJ©œÂA­K*Â5 är*<½Ä, ¶1”8Ì@}êJ¿O•p¨§´Q2Z$¦Ë¯©–/%‘J(V}¹ü OC”×ýŒbæ«ë¤¶Sœ¢IHÑ„ˆ9Ðâ ‹u$= áš(׺zWBÙue}êéCmDtBKóƒYra‰™g¢Þ49;)²¢æÿ\S«¶põͲ4Vܰ(¬e ÊŠ'Dæ U}œ¨Ì”Q“`®©%f ®ÙÅ B@ œ8Щ_ŸqûeÈ\öýÌik?X+Å™:2WdB„~f-Ü›hJú•¾nm QÉÆâ œNÂ3jh& -‰eSW•Fkâr%ç$­u$ýBð¤W oŸ~D=Ð[É¡ Ï ²“NûhR?«Ãö©¡Ÿ9 —dÛÞ7u]J¢/ATmT® Øù«ÄÑžQÒL­‰Ëeû{)L6p)Íž§ž~F=Ð+ÐÔÓ.×±J41mcÆ6¦Ôd×Î_zb·C‰yÐÙ7|<’‹6§D çZz©A aCƒ{”.Yö³ªÖþ”†T.©,¯(W`(¥{:éVV–Î-µˆ@Ï¥jy•ÄÚ-ŒÉxìí­º‘ø*AÂS }4¥Yˆæ=ãwï¹Ì_;>xÉPèÑM(ò_-e*€ºy‰¾ºy÷þ(¸‚À¥,žT,¿:{öͱBR×¥l¬Ñ.z8~çëÖ%4 c^ f*@Æ ~/€v…O“r+ÜíXB]2”a­ñL –Ù@DÆT†™ªzÆ};–Ð$"K†-“`;if™ ôì“û† þî=ö…@—½íëŽòMÜ-ØE¡GŽláï‡ä³GFèt»­öCöå½}Iÿ>·½ˆYÒÒ×ÿ e÷ì¾û¯[[ç¯4ky,nÙïÕˆ¯yäŒCÕrÿï…q“²ÒöuGù&î&œˆôÐ?6A¶ðv#is²}ÝP«ýúõ³U’ Ù·õí&ª*PbíÄÑÿÃjߌ¿\çØs)÷Õˆ­yèŒFPì£LûÓÆF×ù8”2½4]¿¾^é º•B±¹B+‹r¯&RMT+ýTg¦kJìP.hÆ./Wë&g$]!ê Ír…•¥sKm§¢KŸ#*¾œU¶±î²8B«ž\'bJó¤Ó^UjZìé‚W2ØØ`2¹ºò**(—G¨’JúËhl×]ëmfŽ5]VF8š·ŸóRN¢ì_ÀMãÈq5²¥Œž±Ã*€äÌ ‘6ïm@hC6‰­Šî„.wp¥P|®Ì•E¹WéêÒ»\áEJÁm‚q™·U²oè”Ò¾wSU]mã£r–z±]õän˜êo‹µ’áÂCMËvºªÇn š‡vdÒe´;‹…@?ý“‰[ëlæ~×tÅÑ\½–}:œ5¨\V¸Cl¶«%TóNW€ÖMJn,S·]çãr¹•¤N¤\ÞØ\¡•E¹WÙaTꮢ \pú©K¦›¬’NjÛ¨yŽ’åˆÊ]޽,±'µBãn­[Bb×¶öy™MË}º­KD@eZ• )€±"âú×k½ÜÝϽ¤%·¸dºv¡#ÛÕ—©y§+@h†è:Ÿ v¬´ßóFsEWå^MdØI•¹4íUW¥¨d‹Ê]NhëŠ hP+U¡•T®i¹O—£u‰ˆ˜í½§®•¬#ÛqÚ¡#jpç^ëåî~Û jSJŽƒ!Ù®F0KlÍ»Z¢ë|Zé›Zx¹7Š®,Jä\M”cŸ‡?@·ØH±¶D; w9!ˆ®z &Viæ ™žn»ðPÓrŸ®õò¶Í²¸ÀZᱟå̽ÖË63fMW&Aq vêJl©ýoìmk©l5ïjHÄ­óññ.Š]J´q-¡\Ñ•E‰œ«‰rìó¬BëÞ½¡IpËCÀv(@îr¢›…V=ëŽJoýGC-áѦå8]èžHûU¹ª€?,¬©Ëèƒs®õrÍ µ.t¢8Úg:¬Å¯æÛ ëÈ6ȶµT¶šwŠ´ÕÃoUßÖ' öƒñÙ-ö;èã 4iÕè)7vKCèÙ¸…@Ù^ÚµÍ)íë=7= ]1ÐmD/¾Ì›,»  å‰˜#vÅ@·R€Ð‚“ض£î?´x&÷뀮&¨1/e²“B¢l/Ø#ôÎBÓbûH8ô&/Ç s€nÀÍÊ+Ê£ïÛcßÀ·iEÈÎA gòR€Ü#€#´œzí6rà$Þì}²Æÿ(˜]¨]1ÐdωL‚ç´Õþ±kBìBpkäw ­è*º~-P¶Ý]Ün6±i¢;ÌÈÜÖ7v'™þúÛ½rü±hºx-P"Ëî.ÁÝlbÓ„^¨÷2p®‹ÙIfEïÚ ]¼(·»Kt7›Pšè3ÁÄ:Eì®[ÿ€.^ d )@ìn6¡?\‡v˜1›²xªe¶Êü¿¶ÛIFu¥d*Ÿq@<]¼ÈÚO&~7›¸¿?w˜IÍKI²•Æý©?‘¹“Œ ôý}Ã+2|ºx-%(ܱ»Ù$²ÿÿ?´ÃŒp[n„v’‘æÖiÌdbèâµ@–XáÎ1äØaF:iwR‰î$ãO¼ÄŒOׯJ䯱;ÌØç›JcÕ#v'7iÇ zÁµ@9>‘ÔQŸ¾ò?0 g,ÁÈ› æxVÕ>ˆ~o {ÈxürSæç¢²}Ô©Ÿ jªo®Ï§tÙ ô¹¨¬Ÿ¸jÃgÅb?5Õ«¯ÚOp-PPBŸ‹ÊöQ§¶|V,öK;¬Ó„A¶ ü­¤,ujËgÅb@Û0€¶¯„?qՆϊÅ|j*si@·‘¯„>êÔÆÏŠ…>5Z=šÿ'ޝSé‹2ÃIEND®B`‚swig-4.0.2/Doc/Manual/Perl5.html0000644000175000017500000026160013667507563016172 0ustar williamwilliam SWIG and Perl5

    30 SWIG and Perl5

    Caution: This chapter is under repair!

    This chapter describes SWIG's support of Perl5. Although the Perl5 module is one of the earliest SWIG modules, it has continued to evolve and has been improved greatly with the help of SWIG users. For the best results, it is recommended that SWIG be used with Perl 5.8 or later. We're no longer testing regularly with older versions, but Perl 5.6 seems to mostly work, while older versions don't.

    30.1 Overview

    To build Perl extension modules, SWIG uses a layered approach. At the lowest level, simple procedural wrappers are generated for functions, classes, methods, and other declarations in the input file. Then, for structures and classes, an optional collection of Perl proxy classes can be generated in order to provide a more natural object oriented Perl interface. These proxy classes simply build upon the low-level interface.

    In describing the Perl interface, this chapter begins by covering the essentials. First, the problem of configuration, compiling, and installing Perl modules is discussed. Next, the low-level procedural interface is presented. Finally, proxy classes are described. Advanced customization features, typemaps, and other options are found near the end of the chapter.

    30.2 Preliminaries

    To build a Perl5 module, run SWIG using the -perl or -perl5 option as follows:

    swig -perl example.i
    
    

    This produces two files. The first file, example_wrap.c contains all of the C code needed to build a Perl5 module. The second file, example.pm contains supporting Perl code needed to properly load the module.

    To build the module, you will need to compile the file example_wrap.c and link it with the rest of your program.

    30.2.1 Getting the right header files

    In order to compile, SWIG extensions need the following Perl5 header files:

    #include "Extern.h"
    #include "perl.h"
    #include "XSUB.h"
    

    These are typically located in a directory like this

    /usr/lib/perl/5.14/CORE
    

    The SWIG configuration script automatically tries to locate this directory so that it can compile examples. However, if you need to find out where the directory is located, an easy way to find out is to ask Perl itself:

    $ perl -e 'use Config; print "$Config{archlib}\n";'
    /usr/lib/perl/5.14
    

    30.2.2 Compiling a dynamic module

    The preferred approach to building an extension module is to compile it into a shared object file or DLL. Assuming you have code you need to link to in a file called example.c, you will need to compile your program using commands like this (shown for Linux):

    $ swig -perl example.i
    $ gcc -fPIC example.c
    $ gcc -fPIC -c example_wrap.c -I/usr/lib/perl/5.14/CORE -Dbool=char
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The exact compiler options vary from platform to platform. SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/perl5 directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the shared object file must match the module name used in the SWIG interface file. If you used `%module example', then the target should be named `example.so', `example.sl', or the appropriate dynamic module name on your system.

    30.2.3 Building a dynamic module with MakeMaker

    It is also possible to use Perl to build dynamically loadable modules for you using the MakeMaker utility. To do this, write a Perl script such as the following:

    # File : Makefile.PL
    use ExtUtils::MakeMaker;
    WriteMakefile(
            `NAME'    => `example',                  # Name of package
            `LIBS'    => [`-lm'],                    # Name of custom libraries
            `OBJECT'  => `example.o example_wrap.o'  # Object files
    );
    
    

    Now, to build a module, simply follow these steps:

    $ perl Makefile.PL
    $ make
    $ make install
    

    If you are planning to distribute a SWIG-generated module, this is the preferred approach to compilation. More information about MakeMaker can be found in "Programming Perl, 2nd ed." by Larry Wall, Tom Christiansen, and Randal Schwartz.

    30.2.4 Building a static version of Perl

    If you machine does not support dynamic loading or if you've tried to use it without success, you can build a new version of the Perl interpreter with your SWIG extensions added to it. To build a static extension, you first need to invoke SWIG as follows:

    $ swig -perl -static example.i
    

    By default SWIG includes code for dynamic loading, but the -static option takes it out.

    Next, you will need to supply a main() function that initializes your extension and starts the Perl interpreter. While, this may sound daunting, SWIG can do this for you automatically as follows:

    %module example
    
    %inline %{
    extern double My_variable;
    extern int fact(int);
    %}
    
    // Include code for rebuilding Perl
    %include <perlmain.i>
    

    The same thing can be accomplished by running SWIG as follows:

    $ swig -perl -static -lperlmain.i example.i
    

    The perlmain.i file inserts Perl's main() function into the wrapper code and automatically initializes the SWIG generated module. If you just want to make a quick a dirty module, this may be the easiest way. By default, the perlmain.i code does not initialize any other Perl extensions. If you need to use other packages, you will need to modify it appropriately. You can do this by just copying perlmain.i out of the SWIG library, placing it in your own directory, and modifying it to suit your purposes.

    To build your new Perl executable, follow the exact same procedure as for a dynamic module, but change the link line to something like this:

    $ gcc example.o example_wrap.o -L/usr/lib/perl/5.14/CORE \
            -lperl -lsocket -lnsl -lm -o myperl
    

    This will produce a new version of Perl called myperl. It should be functionality identical to Perl with your C/C++ extension added to it. Depending on your machine, you may need to link with additional libraries such as -lsocket, -lnsl, -ldl, etc.

    30.2.5 Using the module

    To use the module, simply use the Perl use statement. If all goes well, you will be able to do this:

    $ perl
    use example;
    print example::fact(4), "\n";
    24
    

    A common error received by first-time users is the following:

    use example;
    Can't locate example.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at - line 1.
    BEGIN failed--compilation aborted at - line 1.
    

    This error is almost caused when the name of the shared object file you created doesn't match the module name you specified with the %module directive.

    A somewhat related, but slightly different error is this:

    use example;
    Can't find 'boot_example' symbol in ./example.so
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    

    This error is generated because Perl can't locate the module bootstrap function in the SWIG extension module. This could be caused by a mismatch between the module name and the shared library name. However, another possible cause is forgetting to link the SWIG-generated wrapper code with the rest of your application when you linked the extension module.

    Another common error is the following:

    use example;
    Can't load './example.so' for module example: ./example.so: 
    undefined symbol: Foo at /usr/lib/perl/5.14/i386-linux/DynaLoader.pm line 169.
    
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration. Better yet, update the header file so that it doesn't have an undefined declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o example.so
    

    If the foo library is compiled as a shared library, you might get the following error when you try to use your module:

    use example;
    Can't load './example.so' for module example: libfoo.so: cannot open shared object file: 
    No such file or directory at /usr/lib/perl/5.14/i386-linux/DynaLoader.pm line 169.
    
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    >>>                 
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To get the loader to look in other locations, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib \
          -o example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Perl, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib perl
    

    Finally, you can use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    30.2.6 Compilation problems and compiling with C++

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Perl interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -perl example.i
    $ g++ -fPIC -c example.cxx
    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.14/i386-linux/CORE
    $ g++ -shared example.o example_wrap.o -o example.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    $ swig -c++ -perl example.i
    $ CC -Kpic -c example.cxx
    $ CC -Kpic -c example_wrap.cxx -I/usr/lib/perl/5.14/i386-linux/CORE
    $ CC -shared example.o example_wrap.o -o example.so -lCrun
    

    Of course, the names of the extra libraries are completely non-portable---you will probably need to do some experimentation.

    Another possible compile problem comes from recent versions of Perl (5.8.0) and the GNU tools. If you see errors having to do with _crypt_struct, that means _GNU_SOURCE is not defined and it needs to be. So you should compile the wrapper like:

    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.8.0/CORE -D_GNU_SOURCE
    

    -D_GNU_SOURCE is also included in the Perl ccflags, which can be found by running

    $ perl -e 'use Config; print "$Config{ccflags}\n";'
    

    So you could also compile the wrapper like

    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.8.0/CORE \
    `perl -MConfig -e 'print $Config{ccflags}'`
    

    Sometimes people have suggested that it is necessary to relink the Perl interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary on most platforms. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Perl.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example, notice the first line of output here:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    If linking wasn't enough of a problem, another major complication of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Perl, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. Also, be aware that certain C++ features, especially RTTI, can behave strangely when working with multiple modules.

    It should be noted that you may get a lot of error messages about the 'bool' datatype when compiling a C++ Perl module. If you experience this problem, you can try the following:

    • Use -DHAS_BOOL when compiling the SWIG wrapper code
    • Or use -Dbool=char when compiling.

    Finally, recent versions of Perl (5.8.0) have namespace conflict problems. Perl defines a bunch of short macros to make the Perl API function names shorter. For example, in /usr/lib/perl/5.8.0/CORE/embed.h there is a line:

    #define do_open Perl_do_open
    

    The problem is, in the <iostream> header from GNU libstdc++v3 there is a private function named do_open. If <iostream> is included after the perl headers, then the Perl macro causes the iostream do_open to be renamed, which causes compile errors. Hopefully in the future Perl will support a PERL_NO_SHORT_NAMES flag, but for now the only solution is to undef the macros that conflict. Lib/perl5/noembed.h in the SWIG source has a list of macros that are known to conflict with either standard headers or other headers. But if you get macro type conflicts from other macros not included in Lib/perl5/noembed.h while compiling the wrapper, you will have to find the macro that conflicts and add an #undef into the .i file. Please report any conflicting macros you find to swig-user mailing list.

    30.2.7 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Perl executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    30.3 Building Perl Extensions under Windows

    Building a SWIG extension to Perl under Windows is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into the Perl interpreter. This section assumes you are using SWIG with Microsoft Visual C++ although the procedure may be similar with other compilers.

    30.3.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly requires these steps:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note: If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -perl5 -o $(ProjDir)\$(InputName)_wrap.cxx $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.cxx" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Perl 5 installation under "Additional include directories".
    • Define the symbols WIN32 and MSWIN32 under preprocessor options. If using the ActiveWare port, also define the symbol PERL_OBJECT. Note that all extensions to the ActiveWare port must be compiled with the C++ compiler since Perl has been encapsulated in a C++ class.
    • Finally, select the settings for the entire project and go to "Link Options". Add the Perl library file to your link libraries. For example "perl.lib". Also, set the name of the output file to match the name of your Perl module (ie. example.dll).
    • Build your project.

    Now, assuming you made it this far, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Perl extension, simply run Perl and use the use command as normal. For example:

    DOS > perl
    use example;
    $a = example::fact(4);
    print "$a\n";
    
    

    30.3.2 Using other compilers

    SWIG is known to work with Cygwin and may work with other compilers on Windows. For general hints and suggestions refer to the Windows chapter.

    30.4 The low-level interface

    At its core, the Perl module uses a simple low-level interface to C function, variables, constants, and classes. This low-level interface can be used to control your application. However, it is also used to construct more user-friendly proxy classes as described in the next section.

    30.4.1 Functions

    C functions are converted into new Perl built-in commands (or subroutines). For example:

    %module example
    int fact(int a);
    ...
    

    Now, in Perl:

    use example;
    $a = &example::fact(2);
    

    30.4.2 Global variables

    Global variables are handled using Perl's magic variable mechanism. SWIG generates a pair of functions that intercept read/write operations and attaches them to a Perl variable with the same name as the C global variable. Thus, an interface like this

    %module example;
    ...
    double Spam;
    ...
    

    is accessed as follows:

    use example;
    print $example::Spam, "\n";
    $example::Spam = $example::Spam + 4
    # ... etc ...
    
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can also use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    It is also possible to tag a specific variable as read-only like this:

    %{
    extern char *path;
    %}
    %immutable path; 
    ...
    ...
    extern char *path;       // Declared later in the input
    

    30.4.3 Constants

    By default, constants are wrapped as read-only Perl variables. For example:

    %module example
    
    #define FOO 42
    

    In Perl:

    use example;
    print $example::FOO, "\n";   # OK
    $example::FOO = 2;           # Error
    

    Alternatively, if you use swig's -const option, constants are wrapped such that the leading $ isn't required (by using a constant subroutine), which usually gives a more natural Perl interface, for example:

    use example;
    print example::FOO, "\n";
    

    30.4.4 Pointers

    SWIG represents pointers as blessed references. A blessed reference is the same as a Perl reference except that it has additional information attached to it indicating what kind of reference it is. That is, if you have a C declaration like this:

    Matrix *new_Matrix(int n, int m);
    

    The module returns a value generated as follows:

    $ptr = new_Matrix(int n, int m);     # Save pointer return result
    bless $ptr, "p_Matrix";              # Bless it as a pointer to Matrix
    

    SWIG uses the "blessing" to check the datatype of various pointers. In the event of a mismatch, an error or warning message is generated.

    To check to see if a value is the NULL pointer, use the defined() command:

    if (defined($ptr)) {
      print "Not a NULL pointer.";
    } else {
      print "Is a NULL pointer.";
    }
    
    

    To create a NULL pointer, you should pass the undef value to a function.

    The "value" of a Perl reference is not the same as the underlying C pointer that SWIG wrapper functions return. Suppose that $a and $b are two references that point to the same C object. In general, $a and $b will be different--since they are different references. Thus, it is a mistake to check the equality of $a and $b to check the equality of two C pointers. The correct method to check equality of C pointers is to dereference them as follows:

    if ($$a == $$b) {
      print "a and b point to the same thing in C";
    } else {
      print "a and b point to different objects.";
    }
    
    

    As much as you might be inclined to modify a pointer value directly from Perl, don't. Manipulating pointer values is architecture dependent and could cause your program to crash. Similarly, don't try to manually cast a pointer to a new type by reblessing a pointer. This may not work like you expect and it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return NULL if the conversion can't be performed.

    Compatibility Note: In earlier versions, SWIG tried to preserve the same pointer naming conventions as XS and xsubpp. Given the advancement of the SWIG typesystem and the growing differences between SWIG and XS, this is no longer supported.

    30.4.5 Structures

    Access to the contents of a structure are provided through a set of low-level accessor functions as described in the "SWIG Basics" chapter. For example,

    struct Vector {
      double x, y, z;
    };
    

    gets mapped into the following collection of accessor functions:

    struct Vector *new_Vector();
    void           delete_Vector(Vector *v);
    double         Vector_x_get(Vector *obj)
    void           Vector_x_set(Vector *obj, double x)
    double         Vector_y_get(Vector *obj)
    void           Vector_y_set(Vector *obj, double y)
    double         Vector_z_get(Vector *obj)
    void           Vector_z_set(Vector *obj, double z)
    
    

    These functions are then used to access structure data from Perl as follows:

    $v = example::new_Vector();
    print example::Vector_x_get($v), "\n";   # Get x component
    example::Vector_x_set($v, 7.8);          # Change x component
    

    Similar access is provided for unions and the data members of C++ classes.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    Array members are normally wrapped as read-only. For example,

    struct Foo {
      int x[50];
    };
    

    produces a single accessor function like this:

    int *Foo_x_get(Foo *self) {
      return self->x;
    };
    

    If you want to set an array member, you will need to supply a "memberin" typemap described later in this chapter. As a special case, SWIG does generate code to set array members of type char (allowing you to store a Python string in the structure).

    When structure members are wrapped, they are handled as pointers. For example,

    struct Foo {
      ...
    };
    
    struct Bar {
      Foo f;
    };
    

    generates accessor functions such as this:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    
    void Bar_f_set(Bar *b, Foo *val) {
      b->f = *val;
    }
    

    30.4.6 C++ classes

    C++ classes are wrapped by building a set of low level accessor functions. Consider the following class:

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    static void print(List *l);
    };
    

    When wrapped by SWIG, the following functions are created:

    List    *new_List();
    void     delete_List(List *l);
    int      List_search(List *l, char *item);
    void     List_insert(List *l, char *item);
    void     List_remove(List *l, char *item);
    char    *List_get(List *l, int n);
    int      List_length_get(List *l);
    void     List_length_set(List *l, int n);
    void     List_print(List *l);
    
    

    In Perl, these functions are used in a straightforward manner:

    use example;
    $l = example::new_List();
    example::List_insert($l, "Ale");
    example::List_insert($l, "Stout");
    example::List_insert($l, "Lager")
    example::List_print($l)
    Lager
    Stout
    Ale
    print example::List_length_get($l), "\n";
    3
    

    At this low level, C++ objects are really just typed pointers. Member functions are accessed by calling a C-like wrapper with an instance pointer as the first argument. Although this interface is fairly primitive, it provides direct access to C++ objects. A higher level interface using Perl proxy classes can be built using these low-level accessors. This is described shortly.

    30.4.7 C++ classes and type-checking

    The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    and a function

    void spam(Foo *f);
    

    then the function spam() accepts Foo * or a pointer to any class derived from Foo. If necessary, the type-checker also adjusts the value of the pointer (as is necessary when multiple inheritance is used).

    30.4.8 C++ overloaded functions

    If you have a C++ program with overloaded functions or methods, you will need to disambiguate those methods using %rename. For example:

    /* Forward renaming declarations */
    %rename(foo_i) foo(int); 
    %rename(foo_d) foo(double);
    ...
    void foo(int);           // Becomes 'foo_i'
    void foo(char *c);       // Stays 'foo' (not renamed)
    
    class Spam {
    public:
      void foo(int);      // Becomes 'foo_i'
      void foo(double);   // Becomes 'foo_d'
      ...
    };
    

    Now, in Perl, the methods are accessed as follows:

    use example;
    example::foo_i(3);
    $s = example::new_Spam();
    example::Spam_foo_i($s, 3);
    example::Spam_foo_d($s, 3.14);
    

    Please refer to the "SWIG Basics" chapter for more information.

    30.4.9 Operators

    As of version 1.3.27 SWIG automatically renames the most common C++ operators, and maps them into the perl module with the proper 'use overload ...' so you don't need to do any work.

    The following C++ operators are currently supported by the Perl module:

    • operator++
    • operator--
    • operator+
    • operator-
    • operator*
    • operator/
    • operator==
    • operator!=
    • operator%
    • operator>
    • operator<
    • operator and
    • operator or

    30.4.10 Modules and packages

    When you create a SWIG extension, everything gets placed into a single Perl module. The name of the module is determined by the %module directive. To use the module, do the following:

    $ perl5
    use example;                      # load the example module
    print example::fact(4), "\n"      # Call a function in it
    24
    

    Usually, a module consists of a collection of code that is contained within a single file. A package, on the other hand, is the Perl equivalent of a namespace. A package is a lot like a module, except that it is independent of files. Any number of files may be part of the same package--or a package may be broken up into a collection of modules if you prefer to think about it in this way.

    SWIG installs its functions into a package with the same name as the module.

    Incompatible Change: previous versions of SWIG enabled you to change the name of the package by using the -package option, this feature has been removed in order to properly support modules that used nested namespaces, e.g. Foo::Bar::Baz. To give your module a nested namespace simply provide the fully qualified name in your %module directive:

    %module "Foo::Bar::Baz"
    

    NOTE: the double quotes are necessary.

    Using the package option of the %module directive allows you to specify what Perl namespace that the module will be living in when installed. This is useful in the situation where a module maintainer wants to split a large module into smaller pieces to make maintenance easier, but doesn't want to have that affect the module name used by applications. So for example, if I wanted to split XML::Xerces into XML::Xerces::SAX, etc. , but I wanted all the applications to be able to access the classes using the XML::Xerces namespace I could use:

    %module(package="XML::Xerces") "XML::Xerces::SAX
    

    And now all the applications could use the class XML::Xerces::SAXParser. Without the package directive splitting the module would force applications to use the class XML::Xerces::SAX::SAXParser. This could break compatibility for existing applications that are already using the class under the name XML::Xerces::SAXParser.

    30.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x+*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Perl, this allows you to pass simple values. For example:

    $a = example::add(3, 4);
    print "$a\n";
    7
    $b = example::sub(7, 4);
    print "$b\n";
    3
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Perl, a mutated parameter shows up as a return value. For example:

    $a = example::negate(3);
    print "$a\n";
    -3
    

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Perl, the function will return multiple values.

    ($bytes, $success) = example::send_message("Hello World");
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Perl:

    ($r, $c) = example::get_dimensions($m);
    

    In certain cases, it is possible to treat Perl references as C pointers. To do this, use the REFERENCE typemap. For example:

    %module example
    %include "typemaps.i"
    
    void add(int x, int y, int *REFERENCE);
    

    In Perl:

    use example;
    $c = 0.0;
    example::add(3, 4, \$c);
    print "$c\n";
    7
    

    Note: The REFERENCE feature is only currently supported for numeric types (integers and floating point).

    30.6 Exception handling

    The SWIG %exception directive can be used to create a user-definable exception handler for converting exceptions in your C/C++ program into Perl exceptions. The chapter on customization features contains more details, but suppose you have a C++ class like the following:

    class RangeError {};   // Used for an exception
    
    class DoubleArray {
      private:
        int n;
        double *ptr;
      public:
        // Create a new array of fixed size
        DoubleArray(int size) {
          ptr = new double[size];
          n = size;
        }
        // Destroy an array
        ~DoubleArray() {
          delete ptr;
        }
        // Return the length of the array
        int   length() {
          return n;
        }
    
        // Get an item from the array and perform bounds checking.
        double getitem(int i) {
          if ((i >= 0) && (i < n))
            return ptr[i];
          else
            throw RangeError();
        }
    
        // Set an item in the array and perform bounds checking.
        void setitem(int i, double val) {
          if ((i >= 0) && (i < n))
            ptr[i] = val;
          else
            throw RangeError();
        }
      };
    

    Since several methods in this class can throw an exception for an out-of-bounds access, you might want to catch this in the Perl extension by writing the following in an interface file:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    
    class DoubleArray {
    ...
    };
    

    The exception handling code is inserted directly into generated wrapper functions. The $action variable is replaced with the C/C++ code being executed by the wrapper. When an exception handler is defined, errors can be caught and used to gracefully generate a Perl error instead of forcing the entire program to terminate with an uncaught error.

    As shown, the exception handling code will be added to every wrapper function. Since this is somewhat inefficient. You might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    
    %exception setitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    If you had a lot of different methods, you can avoid extra typing by using a macro. For example:

    %define RANGE_ERROR
    {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    %enddef
    
    %exception getitem RANGE_ERROR;
    %exception setitem RANGE_ERROR;
    

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on "Customization features" for more examples.

    Compatibility note: In SWIG1.1, exceptions were defined using the older %except directive:

    %except(python) {
      try {
        $function
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    

    This is still supported, but it is deprecated. The newer %exception directive provides the same functionality, but it has additional capabilities that make it more powerful.

    30.7 Remapping datatypes with typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Perl C API as well as the material in the "Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Perl interface.

    30.7.1 A simple typemap example

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Perl to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) SvIV($input);
      printf("Received an integer : %d\n", $1);
    }
    ...
    %inline %{
    extern int fact(int n);
    %}
    
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object (usually a SV *).

    When this example is used in Perl5, it will operate as follows:

    use example;
    $n = example::fact(6);
    print "$n\n";
    ...
    
    Output:
    Received an integer : 6
    720
    

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) SvIV($input);
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    It should be noted that the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, unsigned len) {
        $1 = SvPV($input, $2);
    };
    
    int count(char c, char *str, unsigned len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Perl object. This allows the function to be used like this (notice how the length parameter is omitted):

    example::count("e", "Hello World");
    1
    >>>
    

    30.7.2 Perl5 typemaps

    The previous section illustrated an "in" typemap for converting Perl objects to C. A variety of different typemap methods are defined by the Perl module. For example, to convert a C integer back into a Perl object, you might define an "out" typemap like this:

    %typemap(out) int {
      $result = sv_newmortal();
      sv_setiv($result, (IV) $1);
      argvi++;
    }
    

    The following typemap methods are available:

    %typemap(in)

    Converts Perl5 object to input function arguments.

    %typemap(out)

    Converts function return value to a Perl5 value.

    %typemap(varin)

    Converts a Perl5 object to a global variable.

    %typemap(varout)

    Converts a global variable to a Perl5 object.

    %typemap(freearg)

    Cleans up a function argument after a function call

    %typemap(argout)

    Output argument handling

    %typemap(ret)

    Clean up return value from a function.

    %typemap(memberin)

    Setting of C++ member data (all languages).

    %typemap(memberout)

    Return of C++ member data (all languages).

    %typemap(check)

    Check value of input parameter.

    30.7.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the "Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Perl.

    $input

    A Perl object holding the value of an argument of variable value.

    $result

    A Perl object that holds the result to be returned to Perl.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Perl name of the wrapper function being created.

    30.7.4 Useful functions

    When writing typemaps, it is necessary to work directly with Perl5 objects. This, unfortunately, can be a daunting task. Consult the "perlguts" man-page for all of the really ugly details. A short summary of commonly used functions is provided here for reference. It should be stressed that SWIG can be used quite effectively without knowing any of these details--especially now that there are typemap libraries that can already been written.

    Perl Integer Functions

    int   SvIV(SV *);
    void  sv_setiv(SV *sv, IV value);
    SV   *newSViv(IV value);
    int   SvIOK(SV *);
    

    Perl Floating Point Functions

    double SvNV(SV *);
    void   sv_setnv(SV *, double value);
    SV    *newSVnv(double value);
    int    SvNOK(SV *);
    

    Perl String Functions

    char     *SvPV(SV *, STRLEN len);
    void      sv_setpv(SV *, char *val);
    void      sv_setpvn(SV *, char *val, STRLEN len);
    SV       *newSVpv(char *value, STRLEN len);
    int       SvPOK(SV *);
    void      sv_catpv(SV *, char *);
    void      sv_catpvn(SV *, char *, STRLEN);
    

    Perl References

    void      sv_setref_pv(SV *, char *, void *ptr);
    int       sv_isobject(SV *);
    SV       *SvRV(SV *);
    int       sv_isa(SV *, char *0;
    

    30.8 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "perl5.swg" and "typemaps.i" in the SWIG library.

    30.8.1 Converting a Perl5 array to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Perl5 array reference to be used as a char ** datatype.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      AV *tempav;
      I32 len;
      int i;
      SV  **tv;
      if (!SvROK($input))
        croak("Argument $argnum is not a reference.");
      if (SvTYPE(SvRV($input)) != SVt_PVAV)
        croak("Argument $argnum is not an array.");
      tempav = (AV*)SvRV($input);
      len = av_len(tempav);
      $1 = (char **) malloc((len+2)*sizeof(char *));
      for (i = 0; i <= len; i++) {
        tv = av_fetch(tempav, i, 0);
        $1[i] = (char *) SvPV(*tv, PL_na);
      }
      $1[i] = NULL;
    };
    
    // This cleans up the char ** array after the function call
    %typemap(freearg) char ** {
      free($1);
    }
    
    // Creates a new Perl array and places a NULL-terminated char ** into it
    %typemap(out) char ** {
      AV *myav;
      SV **svs;
      int i = 0, len = 0;
      /* Figure out how many elements we have */
      while ($1[len])
        len++;
      svs = (SV **) malloc(len*sizeof(SV *));
      for (i = 0; i < len ; i++) {
        svs[i] = sv_newmortal();
        sv_setpv((SV*)svs[i], $1[i]);
      };
      myav = av_make(len, svs);
      free(svs);
      $result = newRV_noinc((SV*)myav);
      sv_2mortal($result);
      argvi++;
    }
    
    // Now a few test functions
    %inline %{
      int print_args(char **argv) {
        int i = 0;
        while (argv[i]) {
          printf("argv[%d] = %s\n", i, argv[i]);
          i++;
        }
        return i;
      }
    
      // Returns a char ** list
      char **get_args() {
        static char *values[] = { "Dave", "Mike", "Susan", "John", "Michelle", 0};
        return &values[0];
      }
    %}
    
    

    When this module is compiled, the wrapped C functions can be used in a Perl script as follows:

    use argv;
    @a = ("Dave", "Mike", "John", "Mary");           # Create an array of strings
    argv::print_args(\@a);                           # Pass it to our C function
    $b = argv::get_args();                           # Get array of strings from C
    print @$b, "\n";                                 # Print it out
    

    30.8.2 Return values

    Return values are placed on the argument stack of each wrapper function. The current value of the argument stack pointer is contained in a variable argvi. Whenever a new output value is added, it is critical that this value be incremented. For multiple output values, the final value of argvi should be the total number of output values.

    The total number of return values should not exceed the number of input values unless you explicitly extend the argument stack. This can be done using the EXTEND() macro as in:

    %typemap(argout) int *OUTPUT {
      if (argvi >= items) {
        EXTEND(sp, 1);              /* Extend the stack by 1 object */
      }
      $result = sv_newmortal();
      sv_setiv($target, (IV) *($1));
      argvi++;
    }
    

    30.8.3 Returning values from arguments

    Sometimes it is desirable for a function to return a value in one of its arguments. This example describes the implementation of the OUTPUT typemap.

    %module return
    
    // This tells SWIG to treat an double * argument with name 'OutDouble' as
    // an output value.  
    
    %typemap(argout) double *OUTPUT {
      $result = sv_newmortal();
      sv_setnv($result, *$input);
      argvi++;                     /* Increment return count -- important! */
    }
    
    // We don't care what the input value is. Ignore, but set to a temporary variable
    
    %typemap(in, numinputs=0) double *OUTPUT(double junk) {
      $1 = &junk;
    }
    
    // Now a function to test it
    %{
    /* Returns the first two input arguments */
    int multout(double a, double b, double *out1, double *out2) {
      *out1 = a;
      *out2 = b;
      return 0;
    };
    %}
    
    // If we name both parameters OutDouble both will be output
    
    int multout(double a, double b, double *OUTPUT, double *OUTPUT);
    ...
    

    When this function is called, the output arguments are appended to the stack used to return results. This shows up an array in Perl. For example:

    @r = multout(7, 13);
    print "multout(7, 13) = @r\n";
    ($x, $y) = multout(7, 13);
    

    30.8.4 Accessing array structure members

    Consider the following data structure:

    #define SIZE  8
    typedef struct {
      int   values[SIZE];
      ...
    } Foo;
    
    

    By default, SWIG doesn't know how to the handle the values structure member it's an array, not a pointer. In this case, SWIG makes the array member read-only. Reading will simply return a pointer to the first item in the array. To make the member writable, a "memberin" typemap can be used.

    %typemap(memberin) int [SIZE] {
      int i;
      for (i = 0; i < SIZE; i++) {
        $1[i] = $input[i];
      }
    }
    
    

    Whenever a int [SIZE] member is encountered in a structure or class, this typemap provides a safe mechanism for setting its value.

    As in the previous example, the typemap can be generalized for any dimension. For example:

    %typemap(memberin) int [ANY] {
      int i;
      for (i = 0; i < $1_dim0; i++) {
        $1[i] = $input[i];
      }
    }
    

    When setting structure members, the input object is always assumed to be a C array of values that have already been converted from the target language. Because of this, the memberin typemap is almost always combined with the use of an "in" typemap. For example, the "in" typemap in the previous section would be used to convert an int[] array to C whereas the "memberin" typemap would be used to copy the converted array into a C data structure.

    30.8.5 Turning Perl references into C pointers

    A frequent confusion on the SWIG mailing list is errors caused by the mixing of Perl references and C pointers. For example, suppose you have a C function that modifies its arguments like this:

    void add(double a, double b, double *c) {
      *c = a + b;
    }
    

    A common misinterpretation of this function is the following Perl script:

    # Perl script
    $a = 3.5;
    $b = 7.5;
    $c = 0.0;          # Output value
    add($a, $b, \$c);    # Place result in c (Except that it doesn't work)
    

    To make this work with a reference, you can use a typemap such as this:

    %typemap(in) double * (double dvalue) {
      SV* tempsv;
      if (!SvROK($input)) {
        croak("expected a reference\n");
      }
      tempsv = SvRV($input);
      if ((!SvNOK(tempsv)) && (!SvIOK(tempsv))) {
        croak("expected a double reference\n");
      }
      dvalue = SvNV(tempsv);
      $1 = &dvalue;
    }
    
    %typemap(argout) double * {
      SV *tempsv;
      tempsv = SvRV($input);
      sv_setnv(tempsv, *$1);
    }
    

    Now, if you place this before the add function, you can do this:

    $a = 3.5;
    $b = 7.5;
    $c = 0.0;
    add($a, $b, \$c);            # Now it works!
    print "$c\n";
    
    

    30.8.6 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. To convert a pointer from Perl to C, the following function is used:

    int SWIG_ConvertPtr(SV *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Perl object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. flags is currently undefined and reserved for future expansion. Returns 0 on success and -1 on error.

    void *SWIG_MakePtr(SV *obj, void *ptr, swig_type_info *ty, int flags)

    Creates a new Perl pointer object. obj is a Perl SV that has been initialized to hold the result, ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and flags is a flag that controls properties of the conversion. flags is currently undefined and reserved.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    SV *sv = sv_newmortal();
    SWIG_MakePtr(sv, f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    30.9 Proxy classes

    Out of date. Needs update.

    Using the low-level procedural interface, SWIG can also construct a high-level object oriented interface to C structures and C++ classes. This is done by constructing a Perl proxy class (also known as a shadow class) that provides an OO wrapper to the underlying code. This section describes the implementation details of the proxy interface.

    30.9.1 Preliminaries

    Proxy classes, are generated by default. If you want to turn them off, use the -noproxy command line option. For example:

    $ swig -c++ -perl -noproxy example.i
    

    When proxy classes are used, SWIG moves all of the low-level procedural wrappers to another package name. By default, this package is named 'modulec' where 'module' is the name of the module you provided with the %module directive. Then, in place of the original module, SWIG creates a collection of high-level Perl wrappers. In your scripts, you will use these high level wrappers. The wrappers, in turn, interact with the low-level procedural module.

    30.9.2 Structure and class wrappers

    Suppose you have the following SWIG interface file:

    %module example
    struct Vector {
      Vector(double x, double y, double z);
      ~Vector();
      double x, y, z;
    };
    
    

    When wrapped, SWIG creates the following set of low-level accessor functions as described in previous sections.

    Vector *new_Vector(double x, double y, double z);
    void    delete_Vector(Vector *v);
    double  Vector_x_get(Vector *v);
    double  Vector_x_set(Vector *v, double value);
    double  Vector_y_get(Vector *v);
    double  Vector_y_set(Vector *v, double value);
    double  Vector_z_get(Vector *v);
    double  Vector_z_set(Vector *v, double value);
    
    

    However, when proxy classes are enabled, these accessor functions are wrapped inside a Perl class like this:

    package example::Vector;
    @ISA = qw( example );
    %OWNER = ();
    %BLESSEDMEMBERS = ();
    
    sub new () {
      my $self = shift;
      my @args = @_;
      $self = vectorc::new_Vector(@args);
      return undef if (!defined($self));
      bless $self, "example::Vector";
      $OWNER{$self} = 1;
      my %retval;
      tie %retval, "example::Vector", $self;
      return bless \%retval, "Vector";
    }
    
    sub DESTROY {
      return unless $_[0]->isa('HASH');
      my $self = tied(%{$_[0]});
      delete $ITERATORS{$self};
      if (exists $OWNER{$self}) {
        examplec::delete_Vector($self));
        delete $OWNER{$self};
      }
    }
    
    sub FETCH {
      my ($self, $field) = @_;
      my $member_func = "vectorc::Vector_${field}_get";
      my $val = &$member_func($self);
      if (exists $BLESSEDMEMBERS{$field}) {
        return undef if (!defined($val));
        my %retval;
        tie %retval, $BLESSEDMEMBERS{$field}, $val;
        return bless \%retval, $BLESSEDMEMBERS{$field};
      }
      return $val;
    }
    
    sub STORE {
      my ($self, $field, $newval) = @_;
      my $member_func = "vectorc::Vector_${field}_set";
      if (exists $BLESSEDMEMBERS{$field}) {
        &$member_func($self, tied(%{$newval}));
      } else {
        &$member_func($self, $newval);
      }
    }
    

    Each structure or class is mapped into a Perl package of the same name. The C++ constructors and destructors are mapped into constructors and destructors for the package and are always named "new" and "DESTROY". The constructor always returns a tied hash table. This hash table is used to access the member variables of a structure in addition to being able to invoke member functions. The %OWNER and %BLESSEDMEMBERS hash tables are used internally and described shortly.

    To use our new proxy class we can simply do the following:

    # Perl code using Vector class
    $v = new Vector(2, 3, 4);
    $w = Vector->new(-1, -2, -3);
    
    # Assignment of a single member
    $v->{x} = 7.5;
    
    # Assignment of all members
    %$v = ( x=>3,
            y=>9,
            z=>-2);
    
    # Reading members
    $x = $v->{x};
    
    # Destruction
    $v->DESTROY();
    
    

    30.9.3 Object Ownership

    In order for proxy classes to work properly, it is necessary for Perl to manage some mechanism of object ownership. Here's the crux of the problem---suppose you had a function like this:

    Vector *Vector_get(Vector *v, int index) {
      return &v[i];
    }
    

    This function takes a Vector pointer and returns a pointer to another Vector. Such a function might be used to manage arrays or lists of vectors (in C). Now contrast this function with the constructor for a Vector object:

    Vector *new_Vector(double x, double y, double z) {
      Vector *v;
      v = new Vector(x, y, z);        // Call C++ constructor
      return v;
    }
    

    Both functions return a Vector, but the constructor is returning a brand-new Vector while the other function is returning a Vector that was already created (hopefully). In Perl, both vectors will be indistinguishable---clearly a problem considering that we would probably like the newly created Vector to be destroyed when we are done with it.

    To manage these problems, each class contains two methods that access an internal hash table called %OWNER. This hash keeps a list of all of the objects that Perl knows that it has created. This happens in two cases: (1) when the constructor has been called, and (2) when a function implicitly creates a new object (as is done when SWIG needs to return a complex datatype by value). When the destructor is invoked, the Perl proxy class module checks the %OWNER hash to see if Perl created the object. If so, the C/C++ destructor is invoked. If not, we simply destroy the Perl object and leave the underlying C object alone (under the assumption that someone else must have created it).

    This scheme works remarkably well in practice but it isn't foolproof. In fact, it will fail if you create a new C object in Perl, pass it on to a C function that remembers the object, and then destroy the corresponding Perl object (this situation turns out to come up frequently when constructing objects like linked lists and trees). When C takes possession of an object, you can change Perl's ownership by simply deleting the object from the %OWNER hash. This is done using the DISOWN method.

    # Perl code to change ownership of an object
    $v = new Vector(x, y, z);
    $v->DISOWN();     
    

    To acquire ownership of an object, the ACQUIRE method can be used.

    # Given Perl ownership of a file
    $u = Vector_get($v);
    $u->ACQUIRE();
    
    

    As always, a little care is in order. SWIG does not provide reference counting, garbage collection, or advanced features one might find in sophisticated languages.

    30.9.4 Nested Objects

    Suppose that we have a new object that looks like this:

    struct Particle {
      Vector r;
      Vector v;
      Vector f;
      int type;
    }
    
    

    In this case, the members of the structure are complex objects that have already been encapsulated in a Perl proxy class. To handle these correctly, we use the %BLESSEDMEMBERS hash which would look like this (along with some supporting code):

    package Particle;
    ...
    %BLESSEDMEMBERS = (
            r => `Vector',
            v => `Vector',
            f => `Vector',
    );
    
    

    When fetching members from the structure, %BLESSEDMEMBERS is checked. If the requested field is present, we create a tied-hash table and return it. If not, we just return the corresponding member unmodified.

    This implementation allows us to operate on nested structures as follows:

    # Perl access of nested structure
    $p = new Particle();
    $p->{f}->{x} = 0.0;
    %${$p->{v}} = ( x=>0, y=>0, z=>0);         
    

    30.9.5 Proxy Functions

    When functions take arguments involving a complex object, it is sometimes necessary to write a proxy function. For example:

    double dot_product(Vector *v1, Vector *v2);
    

    Since Vector is an object already wrapped into a proxy class, we need to modify this function to accept arguments that are given in the form of tied hash tables. This is done by creating a Perl function like this:

    sub dot_product {
      my @args = @_;
      $args[0] = tied(%{$args[0]});         # Get the real pointer values
      $args[1] = tied(%{$args[1]});
      my $result = vectorc::dot_product(@args);
      return $result;
    }
    

    This function replaces the original function, but operates in an identical manner.

    30.9.6 Inheritance

    Simple C++ inheritance is handled using the Perl @ISA array in each class package. For example, if you have the following interface file:

    // shapes.i
    // SWIG interface file for shapes class
    %module shapes
    %{
    #include "shapes.h"
    %}
    
    class Shape {
    public:
      virtual double area() = 0;
      virtual double perimeter() = 0;
      void    set_location(double x, double y);
    };
    class Circle : public Shape {
    public:
      Circle(double radius);
      ~Circle();
      double area();
      double perimeter();
    };
    class Square : public Shape {
    public:
      Square(double size);
      ~Square();
      double area();
      double perimeter();
    }
    
    

    The resulting, Perl wrapper class will create the following code:

    Package Shape;
    @ISA = (shapes);
    ...
    Package Circle;
    @ISA = (shapes Shape);
    ...
    Package Square;
    @ISA = (shapes Shape);
    
    

    The @ISA array determines where to look for methods of a particular class. In this case, both the Circle and Square classes inherit functions from Shape so we'll want to look in the Shape base class for them. All classes also inherit from the top-level module shapes. This is because certain common operations needed to implement proxy classes are implemented only once and reused in the wrapper code for various classes and structures.

    Since SWIG proxy classes are implemented in Perl, it is easy to subclass from any SWIG generated class. To do this, simply put the name of a SWIG class in the @ISA array for your new class. However, be forewarned that this is not a trivial problem. In particular, inheritance of data members is extremely tricky (and I'm not even sure if it really works).

    30.9.7 Modifying the proxy methods

    It is possible to override the SWIG generated proxy/shadow methods, using %feature("shadow"). It works like all the other %feature directives. Here is a simple example showing how to add some Perl debug code to the constructor:

    /* Let's make the constructor of the class Square more verbose */
    %feature("shadow") Square(double w)
    %{
      sub new {
        my $pkg = shift;
        my $self = examplec::new_Square(@_);
        print STDERR "Constructed an @{[ref($self)]}\n";
        bless $self, $pkg if defined($self);
      }
    %}
    
    class Square {
    public:
      Square(double w);
      ...
    };
    

    30.10 Adding additional Perl code

    If writing support code in C isn't enough, it is also possible to write code in Perl. This code gets inserted in to the .pm file created by SWIG. One use of Perl code might be to supply a high-level interface to certain functions. For example:

    void set_transform(Image *im, double x[4][4]);
    
    ...
    /* Rewrite the high level interface to set_transform */
    %perlcode %{
    sub set_transform
    {
      my ($im, $x) = @_;
      my $a = new_mat44();
      for (my $i = 0; $i < 4, $i++)
      {
        for (my $j = 0; $j < 4, $j++)
        {
          mat44_set($a, $i, $j, $x->[i][j])
        }
      }
      example.set_transform($im, $a);
      free_mat44($a);
    }
    %}
    

    In this example, set_transform() provides a high-level Perl interface built on top of low-level helper functions. For example, this code now seems to work:

    my $a =
      [[1, 0, 0, 0],
      [0, 1, 0, 0],
      [0, 0, 1, 0],
      [0, 0, 0, 1]];
    set_transform($im, $a);
    

    30.11 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Perl. In particular, if a C++ class has been extended in Perl (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Perl implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Perl and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Perl code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    30.11.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      Foo(int foo);
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    then at the Perl side you can define

    use mymodule;
    
    package MyFoo;
    use base 'mymodule::Foo';
    
    sub one {
      print "one from Perl\n";
    }
    

    30.11.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Perl proxy classes. The director classes store a pointer to their underlying Perl object and handle various issues related to object ownership.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in Perl via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in Perl were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Perl. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Perl, the Perl API is used to call the method of the underlying Perl object (after which the usual virtual method resolution in Perl automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in Perl, unless there's a good reason not to. The reason for this is simple: Perl has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the Perl proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the Perl method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the pointer to the Perl object that called the wrapper function to the pointer stored by the director. If these are the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in Perl, SWIG creates an instance of the original C++ class. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through Perl.

    30.11.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. Perl instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to a Perl object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special DISOWN() method of the proxy class. After calling this method the director class increments the reference count of the Perl object. When the director class is deleted it decrements the reference count. Assuming no outstanding references to the Perl object remain, the Perl object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    Also note that due to the proxy implementation, the DESTROY() method on directors can be called for several reasons, many of which have little to do with the teardown of an object instance. To help disambiguate this, a second argument is added to the DESTROY() call when a C++ director object is being released. So, to avoid running your clean-up code when an object is not really going away, or after it has already been reclaimed, it is suggested that custom destructors in Perl subclasses looks something like:

    sub DESTROY {
      my($self, $final) = @_;
      if($final) {
        # real teardown code
      }
      shift->SUPER::DESTROY(@_);
    }
    

    30.11.4 Exception unrolling

    With directors routing method calls to Perl, and proxies routing them to C++, the handling of exceptions is an important concern. By default, the directors ignore exceptions that occur during method calls that are resolved in Perl. To handle such exceptions correctly, it is necessary to temporarily translate them into C++ exceptions. This can be done with the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
      if ($error != NULL) {
        throw Swig::DirectorMethodException();
      }
    }
    

    This code will check the Perl error state after each method call from a director into Perl, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler.

    It may be the case that a method call originates in Perl, travels up to C++ through a proxy class, and then back into Perl via a director method. If an exception occurs in Perl at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
      try { $action }
      catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the Perl error state is still set when Swig::DirectorMethodException is thrown, Perl will register the exception as soon as the C wrapper function returns.

    30.11.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in Perl and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from Perl. Relative to the speed of Perl execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through Perl in order to ensure that the method does not have an extended Perl implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with Perl objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to Perl objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Perl.

    30.11.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    swig-4.0.2/Doc/Manual/Contract.html0000644000175000017500000001462013667507563016756 0ustar williamwilliam Contract Checking

    15 Contracts

    A common problem that arises when wrapping C libraries is that of maintaining reliability and checking for errors. The fact of the matter is that many C programs are notorious for not providing error checks. Not only that, when you expose the internals of an application as a library, it often becomes possible to crash it simply by providing bad inputs or using it in a way that wasn't intended.

    This chapter describes SWIG's support for software contracts. In the context of SWIG, a contract can be viewed as a runtime constraint that is attached to a declaration. For example, you can easily attach argument checking rules, check the output values of a function and more. When one of the rules is violated by a script, a runtime exception is generated rather than having the program continue to execute.

    15.1 The %contract directive

    Contracts are added to a declaration using the %contract directive. Here is a simple example:

    %contract sqrt(double x) {
    require:
      x >= 0;
    ensure:
      sqrt >= 0;
    }
    
    ...
    double sqrt(double);
    

    In this case, a contract is being added to the sqrt() function. The %contract directive must always appear before the declaration in question. Within the contract there are two sections, both of which are optional. The require: section specifies conditions that must hold before the function is called. Typically, this is used to check argument values. The ensure: section specifies conditions that must hold after the function is called. This is often used to check return values or the state of the program. In both cases, the conditions that must hold must be specified as boolean expressions.

    In the above example, we're simply making sure that sqrt() returns a non-negative number (if it didn't, then it would be broken in some way).

    Once a contract has been specified, it modifies the behavior of the resulting module. For example:

    >>> example.sqrt(2)
    1.4142135623730951
    >>> example.sqrt(-2)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    RuntimeError: Contract violation: require: (arg1>=0)
    >>>
    

    15.2 %contract and classes

    The %contract directive can also be applied to class methods and constructors. For example:

    %contract Foo::bar(int x, int y) {
    require:
      x > 0;
    ensure:
      bar > 0;
    }
    
    %contract Foo::Foo(int a) {
    require:
      a > 0;
    }
    
    class Foo {
    public:
      Foo(int);
      int bar(int, int);
    };
    

    The way in which %contract is applied is exactly the same as the %feature directive. Thus, any contract that you specified for a base class will also be attached to inherited methods. For example:

    class Spam : public Foo {
    public:
      int bar(int, int);    // Gets contract defined for Foo::bar(int, int)
    };
    

    In addition to this, separate contracts can be applied to both the base class and a derived class. For example:

    %contract Foo::bar(int x, int) {
    require:
      x > 0;
    }
    
    %contract Spam::bar(int, int y) {
    require:
      y > 0;
    }
    
    class Foo {
    public:
      int bar(int, int);   // Gets Foo::bar contract.
    };
    
    class Spam : public Foo {
    public:
      int bar(int, int);   // Gets Foo::bar and Spam::bar contract
    };
    

    When more than one contract is applied, the conditions specified in a "require:" section are combined together using a logical-AND operation. In other words conditions specified for the base class and conditions specified for the derived class all must hold. In the above example, this means that both the arguments to Spam::bar must be positive.

    15.3 Constant aggregation and %aggregate_check

    Consider an interface file that contains the following code:

    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    One thing you might want to do is impose a constraint on the direction parameter to make sure it's one of a few accepted values. To do that, SWIG provides an easy to use macro %aggregate_check() that works like this:

    %aggregate_check(int, check_direction, UP, DOWN, LEFT, RIGHT);
    

    This merely defines a utility function of the form

    int check_direction(int x);
    

    That checks the argument x to see if it is one of the values listed. This utility function can be used in contracts. For example:

    %aggregate_check(int, check_direction, UP, DOWN, RIGHT, LEFT);
    
    %contract move(SomeObject *, int direction, in) {
    require:
      check_direction(direction);
    }
    
    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    Alternatively, it can be used in typemaps and other directives. For example:

    %aggregate_check(int, check_direction, UP, DOWN, RIGHT, LEFT);
    
    %typemap(check) int direction {
      if (!check_direction($1)) SWIG_exception(SWIG_ValueError, "Bad direction");
    }
    
    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    Regrettably, there is no automatic way to perform similar checks with enums values. Maybe in a future release.

    15.4 Notes

    Contract support was implemented by Songyan (Tiger) Feng and first appeared in SWIG-1.3.20.

    swig-4.0.2/Doc/Manual/Warnings.html0000644000175000017500000005227713667507563017003 0ustar williamwilliam Warning Messages

    18 Warning Messages

    18.1 Introduction

    During compilation, SWIG may generate a variety of warning messages. For example:

    example.i:16: Warning 501: Overloaded declaration ignored.  bar(double)
    example.i:15: Warning 501: Previous declaration is bar(int)
    

    Typically, warning messages indicate non-fatal problems with the input where the generated wrapper code will probably compile, but it may not work like you expect.

    18.2 Warning message suppression

    All warning messages have a numeric code that is shown in the warning message itself. To suppress the printing of a warning message, a number of techniques can be used. First, you can run SWIG with the -w command line option. For example:

    % swig -python -w501 example.i
    % swig -python -w501,505,401 example.i
    

    Alternatively, warnings can be suppressed by inserting a special preprocessor pragma into the input file:

    %module example
    #pragma SWIG nowarn=501
    #pragma SWIG nowarn=501,505,401
    

    Finally, code-generation warnings can be disabled on a declaration by declaration basis using the %warnfilter directive. For example:

    %module example
    %warnfilter(501) foo;
    ...
    int foo(int);
    int foo(double);              // Silently ignored.
    

    The %warnfilter directive has the same semantics as other declaration modifiers like %rename, %ignore and %feature, see the %feature directive section. For example, if you wanted to suppress a warning for a method in a class hierarchy, you could do this:

    %warnfilter(501) Object::foo;
    class Object {
    public:
      int foo(int);
      int foo(double);      // Silently ignored
      ...
    };
    
    class Derived : public Object {
    public:
      int foo(int);
      int foo(double);      // Silently ignored
      ...
    };
    

    Warnings can be suppressed for an entire class by supplying a class name. For example:

    %warnfilter(501) Object;
    
    class Object {
    public:
      ...                      // All 501 warnings ignored in class
    };
    

    There is no option to suppress all SWIG warning messages. The warning messages are there for a reason---to tell you that something may be broken in your interface. Ignore the warning messages at your own peril.

    18.3 Enabling extra warnings

    Some warning messages are disabled by default and are generated only to provide additional diagnostics. These warnings can be turned on using the -Wextra option. For example:

    % swig -Wextra -python example.i
    

    To selectively turn on extra warning messages, you can use the directives and options in the previous section--simply add a "+" to all warning numbers. For example:

    % swig -w+309,+452 example.i
    

    or in your interface file use either

    #pragma SWIG nowarn=+309,+452
    

    or

    %warnfilter(+309,+452) foo;
    

    Note: selective enabling of warnings with %warnfilter overrides any global settings you might have made using -w or #pragma.

    You can of course also enable all warnings and suppress a select few, for example:

    % swig -Wextra -w309,452 example.i
    

    The warnings on the right take precedence over the warnings on the left, so in the above example -Wextra adds numerous warnings including 452, but then -w309,452 overrides this and so 452 is suppressesed.

    If you would like all warnings to appear, regardless of the warning filters used, then use the -Wall option. The -Wall option also turns on the extra warnings that -Wextra adds, however, it is subtely different. When -Wall is used, it also disables all other warning filters, that is, any warnings suppressed or added in %warnfilter, #pragma SWIG nowarn or the -w option.

    18.4 Issuing a warning message

    Warning messages can be issued from an interface file using a number of directives. The %warn directive is the most simple:

    %warn "900:This is your last warning!"
    

    All warning messages are optionally prefixed by the warning number to use. If you are generating your own warnings, make sure you don't use numbers defined in the table at the end of this section.

    The %ignorewarn directive is the same as %ignore except that it issues a warning message whenever a matching declaration is found. For example:

    %ignorewarn("362:operator= ignored") operator=;
    

    Warning messages can be associated with typemaps using the warning attribute of a typemap declaration. For example:

    %typemap(in, warning="901:You are really going to regret this usage of $1_type $1_name") blah * {
      ...
    }
    

    In this case, the warning message will be printed whenever the typemap is actually used and the special variables will be expanded as appropriate, for example:

    example.i:23: Warning 901: You are really going to regret this usage of blah * self
    example.i:24: Warning 901: You are really going to regret this usage of blah * stuff
    

    18.5 Symbolic symbols

    The swigwarn.swg file that is installed with SWIG contains symbol constants that could also be used in %warnfilter and #pragma SWIG nowarn. For example this file contains the following line:

    %define SWIGWARN_TYPE_UNDEFINED_CLASS 401 %enddef
    

    so SWIGWARN_TYPE_UNDEFINED_CLASS could be used instead of 401, for example:

    #pragma SWIG nowarn=SWIGWARN_TYPE_UNDEFINED_CLASS
    

    or

    %warnfilter(SWIGWARN_TYPE_UNDEFINED_CLASS) Foo;
    

    18.6 Commentary

    The ability to suppress warning messages is really only provided for advanced users and is not recommended in normal use. You are advised to modify your interface to fix the problems highlighted by the warnings wherever possible instead of suppressing warnings.

    Certain types of SWIG problems are errors. These usually arise due to parsing errors (bad syntax) or semantic problems for which there is no obvious recovery. There is no mechanism for suppressing error messages.

    18.7 Warnings as errors

    Warnings can be handled as errors by using the -Werror command line option. This will cause SWIG to exit with a non successful exit code if a warning is encountered.

    18.8 Message output format

    The output format for both warnings and errors can be selected for integration with your favourite IDE/editor. Editors and IDEs can usually parse error messages and if in the appropriate format will easily take you directly to the source of the error. The standard format is used by default except on Windows where the Microsoft format is used by default. These can be overridden using command line options, for example:

    $ swig -python -Fstandard example.i
    example.i:4: Syntax error in input(1).
    $ swig -python -Fmicrosoft example.i
    example.i(4) : Syntax error in input(1).
    

    18.9 Warning number reference

    18.9.1 Deprecated features (100-199)

    • 101. Deprecated %extern directive.
    • 102. Deprecated %val directive.
    • 103. Deprecated %out directive.
    • 104. Deprecated %disabledoc directive.
    • 105. Deprecated %enabledoc directive.
    • 106. Deprecated %doconly directive.
    • 107. Deprecated %style directive.
    • 108. Deprecated %localstyle directive.
    • 109. Deprecated %title directive.
    • 110. Deprecated %section directive.
    • 111. Deprecated %subsection directive.
    • 112. Deprecated %subsubsection directive.
    • 113. Deprecated %addmethods directive.
    • 114. Deprecated %readonly directive.
    • 115. Deprecated %readwrite directive.
    • 116. Deprecated %except directive.
    • 117. Deprecated %new directive.
    • 118. Deprecated %typemap(except).
    • 119. Deprecated %typemap(ignore).
    • 120. Deprecated command line option (-runtime, -noruntime).
    • 121. Deprecated %name directive.
    • 126. The 'nestedworkaround' feature is deprecated.

    18.9.2 Preprocessor (200-299)

    • 201. Unable to find filename.
    • 202. Could not evaluate expression expr.
    • 203. Both includeall and importall are defined: using includeall.
    • 204. CPP #warning, "warning".
    • 205. CPP #error, "error".
    • 206. Unexpected tokens after #directive directive.

    18.9.3 C/C++ Parser (300-399)

    • 301. class keyword used, but not in C++ mode.
    • 302. Identifier 'name' redefined (ignored).
    • 303. %extend defined for an undeclared class 'name'.
    • 304. Unsupported constant value (ignored).
    • 305. Bad constant value (ignored).
    • 306. 'identifier' is private in this context.
    • 307. Can't set default argument value (ignored)
    • 308. Namespace alias 'name' not allowed here. Assuming 'name'
    • 309. [private | protected] inheritance ignored.
    • 310. Template 'name' was already wrapped as 'name' (ignored)
    • 312. Unnamed nested class not currently supported (ignored).
    • 313. Unrecognized extern type "name" (ignored).
    • 314. 'identifier' is a lang keyword.
    • 315. Nothing known about 'identifier'.
    • 316. Repeated %module directive.
    • 317. Specialization of non-template 'name'.
    • 318. Instantiation of template 'name' is ambiguous, instantiation templ used, instantiation templ ignored.
    • 319. No access specifier given for base class name (ignored).
    • 320. Explicit template instantiation ignored.
    • 321. identifier conflicts with a built-in name.
    • 322. Redundant redeclaration of 'name'.
    • 323. Recursive scope inheritance of 'name'.
    • 324. Named nested template instantiations not supported. Processing as if no name was given to %template().
    • 325. Nested kind not currently supported (name ignored).
    • 326. Deprecated %extend name used - the kind name 'name' should be used instead of the typedef name 'name'.
    • 350. operator new ignored.
    • 351. operator delete ignored.
    • 352. operator+ ignored.
    • 353. operator- ignored.
    • 354. operator* ignored.
    • 355. operator/ ignored.
    • 356. operator% ignored.
    • 357. operator^ ignored.
    • 358. operator& ignored.
    • 359. operator| ignored.
    • 360. operator~ ignored.
    • 361. operator! ignored.
    • 362. operator= ignored.
    • 363. operator< ignored.
    • 364. operator> ignored.
    • 365. operator+= ignored.
    • 366. operator-= ignored.
    • 367. operator*= ignored.
    • 368. operator/= ignored.
    • 369. operator%= ignored.
    • 370. operator^= ignored.
    • 371. operator&= ignored.
    • 372. operator|= ignored.
    • 373. operator<< ignored.
    • 374. operator>>ignored.
    • 375. operator<<= ignored.
    • 376. operator>>= ignored.
    • 377. operator== ignored.
    • 378. operator!= ignored.
    • 379. operator<= ignored.
    • 380. operator>= ignored.
    • 381. operator&& ignored.
    • 382. operator|| ignored.
    • 383. operator++ ignored.
    • 384. operator-- ignored.
    • 385. operator, ignored.
    • 386. operator-<* ignored.
    • 387. operator-< ignored.
    • 388. operator() ignored.
    • 389. operator[] ignored.
    • 390. operator+ ignored (unary).
    • 391. operator- ignored (unary).
    • 392. operator* ignored (unary).
    • 393. operator& ignored (unary).
    • 394. operator new[] ignored.
    • 395. operator delete[] ignored.

    18.9.4 Types and typemaps (400-499)

    • 401. Nothing known about class 'name'. Ignored.
    • 402. Base class 'name' is incomplete.
    • 403. Class 'name' might be abstract.
    • 450. Deprecated typemap feature ($source/$target).
    • 451. Setting const char * variable may leak memory.
    • 452. Reserved
    • 453. Can't apply (pattern). No typemaps are defined.
    • 460. Unable to use type type as a function argument.
    • 461. Unable to use return type type in function name.
    • 462. Unable to set variable of type type.
    • 463. Unable to read variable of type type.
    • 464. Unsupported constant value.
    • 465. Unable to handle type type.
    • 466. Unsupported variable type type.
    • 467. Overloaded declaration not supported (incomplete type checking rule - no precedence level in typecheck typemap for 'type')
    • 468. No 'throw' typemap defined for exception type type
    • 469. No or improper directorin typemap defined for type
    • 470. Thread/reentrant unsafe wrapping, consider returning by value instead.
    • 471. Unable to use return type type in director method
    • 474. Method method usage of the optimal attribute ignored in the out typemap as the following cannot be used to generate optimal code: code
    • 475. Multiple calls to method might be generated due to optimal attribute usage in the out typemap.
    • 476. Initialization using std::initializer_list.
    • 477. No directorthrows typemap defined for type

    18.9.5 Code generation (500-559)

    • 501. Overloaded declaration ignored. decl. Previous declaration is decl.
    • 502. Overloaded constructor ignored. decl. Previous declaration is decl.
    • 503. Can't wrap 'identifier' unless renamed to a valid identifier.
    • 504. Function name must have a return type. Ignored.
    • 505. Variable length arguments discarded.
    • 506. Can't wrap varargs with keyword arguments enabled.
    • 507. Adding native function name not supported (ignored).
    • 508. Declaration of 'name' shadows declaration accessible via operator->(), previous declaration of'declaration'.
    • 509. Overloaded method declaration effectively ignored, as it is shadowed by declaration.
    • 510. Friend function 'name' ignored.
    • 511. Can't use keyword arguments with overloaded functions.
    • 512. Overloaded method declaration ignored, using non-const method declaration instead.
    • 513. Can't generate wrappers for unnamed struct/class.
    • 514.
    • 515.
    • 516. Overloaded method declaration ignored, using declaration instead.
    • 517.
    • 518. Portability warning: File file1 will be overwritten by file2 on case insensitive filesystems such as Windows' FAT32 and NTFS unless the class/module name is renamed.
    • 519. %template() contains no name. Template method ignored: declaration
    • 520. Base/Derived class 'classname1' of 'classname2' is not similarly marked as a smart pointer.
    • 521. Illegal destructor name name. Ignored.
    • 522. Use of an illegal constructor name 'name' in %extend is deprecated, the constructor name should be 'name'.
    • 523. Use of an illegal destructor name 'name' in %extend is deprecated, the destructor name should be 'name'.
    • 524. Experimental target language. Target language language specified by lang is an experimental language. Please read about SWIG experimental languages, htmllink.
    • 525. Destructor declaration is final, name cannot be a director class.

    18.9.6 Doxygen comments (560-599)

    • 560: Unknown Doxygen command: command.
    • 561: Unexpected end of Doxygen comment encountered.
    • 562: Expected Doxygen command: command
    • 563: Doxygen HTML error for tag tag: error text.
    • 564: Error parsing Doxygen command command: error text. Command ignored."

    18.9.7 Language module specific (700-899)

    • 801. Wrong name (corrected to 'name'). (Ruby).
    • 810. No jni typemap defined for type (Java).
    • 811. No jtype typemap defined for type (Java).
    • 812. No jstype typemap defined for type (Java).
    • 813. Warning for classname, base baseclass ignored. Multiple inheritance is not supported in Java. (Java).
    • 814.
    • 815. No javafinalize typemap defined for type (Java).
    • 816. No javabody typemap defined for type (Java).
    • 817. No javaout typemap defined for type (Java).
    • 818. No javain typemap defined for type (Java).
    • 819. No javadirectorin typemap defined for type (Java).
    • 820. No javadirectorout typemap defined for type (Java).
    • 821.
    • 822. Covariant return types not supported in Java. Proxy method will return basetype (Java).
    • 823. No javaconstruct typemap defined for type (Java).
    • 824. Missing JNI descriptor in directorin typemap defined for type (Java).
    • 825. "directorconnect" attribute missing in type "javaconstruct" typemap. (Java).
    • 826. The nspace feature is used on 'type' without -package. The generated code may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package. (Java).
    • 830. No ctype typemap defined for type (C#).
    • 831. No cstype typemap defined for type (C#).
    • 832. No cswtype typemap defined for type (C#).
    • 833. Warning for classname, base baseclass ignored. Multiple inheritance is not supported in C#. (C#).
    • 834.
    • 835. No csfinalize typemap defined for type (C#).
    • 836. No csbody typemap defined for type (C#).
    • 837. No csout typemap defined for type (C#).
    • 838. No csin typemap defined for type (C#).
    • 839.
    • 840.
    • 841.
    • 842. Covariant return types not supported in C#. Proxy method will return basetype (C#).
    • 843. No csconstruct typemap defined for type (C#).
    • 844. C# exception may not be thrown - no $excode or excode attribute in typemap typemap. (C#).
    • 845. Unmanaged code contains a call to a SWIG_CSharpSetPendingException method and C# code does not handle pending exceptions via the canthrow attribute. (C#).
    • 870. Warning for classname: Base baseclass ignored. Multiple inheritance is not supported in PHP. (Php).
    • 871. Unrecognized pragma pragma. (Php).

    18.9.8 User defined (900-999)

    These numbers can be used by your own application.

    18.10 History

    The ability to control warning messages was first added to SWIG-1.3.12.

    swig-4.0.2/Doc/Manual/Customization.html0000644000175000017500000010036113667507563020047 0ustar williamwilliam Customization Features

    14 Customization Features

    In many cases, it is desirable to change the default wrapping of particular declarations in an interface. For example, you might want to provide hooks for catching C++ exceptions, add assertions, or provide hints to the underlying code generator. This chapter describes some of these customization techniques. First, a discussion of exception handling is presented. Then, a more general-purpose customization mechanism known as "features" is described.

    14.1 Exception handling with %exception

    The %exception directive allows you to define a general purpose exception handler. For example, you can specify the following:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        ... handle error ...
      }
    }
    

    How the exception is handled depends on the target language, for example, Python:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        PyErr_SetString(PyExc_IndexError, "index out-of-bounds");
        SWIG_fail;
      }
    }
    

    When defined, the code enclosed in braces is inserted directly into the low-level wrapper functions. The special variable $action is one of a few %exception special variables supported and gets replaced with the actual operation to be performed (a function call, method invocation, attribute access, etc.). An exception handler remains in effect until it is explicitly deleted. This is done by using either %exception or %noexception with no code. For example:

    %exception;   // Deletes any previously defined handler
    

    Compatibility note: Previous versions of SWIG used a special directive %except for exception handling. That directive is deprecated--%exception provides the same functionality, but is substantially more flexible.

    14.1.1 Handling exceptions in C code

    C has no formal exception handling mechanism so there are several approaches that might be used. A somewhat common technique is to simply set a special error code. For example:

    /* File : except.c */
    
    static char error_message[256];
    static int error_status = 0;
    
    void throw_exception(char *msg) {
      strncpy(error_message, msg, 256);
      error_status = 1;
    }
    
    void clear_exception() {
      error_status = 0;
    }
    char *check_exception() {
      if (error_status)
        return error_message;
      else
        return NULL;
    }
    
    

    To use these functions, functions simply call throw_exception() to indicate an error occurred. For example :

    double inv(double x) {
      if (x != 0)
        return 1.0/x;
      else {
        throw_exception("Division by zero");
        return 0;
      }
    }
    

    To catch the exception, you can write a simple exception handler such as the following (shown for Perl5) :

    %exception {
      char *err;
      clear_exception();
      $action
      if ((err = check_exception())) {
        croak(err);
      }
    }
    

    In this case, when an error occurs, it is translated into a Perl error. Each target language has its own approach to creating a runtime error/exception in and for Perl it is the croak method shown above.

    14.1.2 Exception handling with longjmp()

    Exception handling can also be added to C code using the <setjmp.h> library. Here is a minimalistic implementation that relies on the C preprocessor :

    /* File : except.c
       Just the declaration of a few global variables we're going to use */
    
    #include <setjmp.h>
    jmp_buf exception_buffer;
    int exception_status;
    
    /* File : except.h */
    #include <setjmp.h>
    extern jmp_buf exception_buffer;
    extern int exception_status;
    
    #define try if ((exception_status = setjmp(exception_buffer)) == 0)
    #define catch(val) else if (exception_status == val)
    #define throw(val) longjmp(exception_buffer, val)
    #define finally else
    
    /* Exception codes */
    
    #define RangeError     1
    #define DivisionByZero 2
    #define OutOfMemory    3
    
    

    Now, within a C program, you can do the following :

    double inv(double x) {
      if (x)
        return 1.0/x;
      else
        throw(DivisionByZero);
    }
    
    

    Finally, to create a SWIG exception handler, write the following :

    %{
    #include "except.h"
    %}
    
    %exception {
      try {
        $action
      } catch(RangeError) {
        croak("Range Error");
      } catch(DivisionByZero) {
        croak("Division by zero");
      } catch(OutOfMemory) {
        croak("Out of memory");
      } finally {
        croak("Unknown exception");
      }
    }
    

    Note: This implementation is only intended to illustrate the general idea. To make it work better, you'll need to modify it to handle nested try declarations.

    14.1.3 Handling C++ exceptions

    Handling C++ exceptions is also straightforward. For example:

    %exception {
      try {
        $action
      } catch(RangeError) {
        croak("Range Error");
      } catch(DivisionByZero) {
        croak("Division by zero");
      } catch(OutOfMemory) {
        croak("Out of memory");
      } catch(...) {
        croak("Unknown exception");
      }
    }
    
    

    The exception types need to be declared as classes elsewhere, possibly in a header file :

    class RangeError {};
    class DivisionByZero {};
    class OutOfMemory {};
    

    14.1.4 Exception handlers for variables

    By default all variables will ignore %exception, so it is effectively turned off for all variables wrappers. This applies to global variables, member variables and static member variables. The approach is certainly a logical one when wrapping variables in C. However, in C++, it is quite possible for an exception to be thrown while the variable is being assigned. To ensure %exception is used when wrapping variables, it needs to be 'turned on' using the %allowexception feature. Note that %allowexception is just a macro for %feature("allowexcept"), that is, it is a feature called "allowexcept". Any variable which has this feature attached to it, will then use the %exception feature, but of course, only if there is a %exception attached to the variable in the first place. The %allowexception feature works like any other feature and so can be used globally or for selective variables.

    %allowexception;                // turn on globally
    %allowexception Klass::MyVar;   // turn on for a specific variable
    
    %noallowexception Klass::MyVar; // turn off for a specific variable
    %noallowexception;              // turn off globally
    

    14.1.5 Defining different exception handlers

    By default, the %exception directive creates an exception handler that is used for all wrapper functions that follow it. Unless there is a well-defined (and simple) error handling mechanism in place, defining one universal exception handler may be unwieldy and result in excessive code bloat since the handler is inlined into each wrapper function.

    To fix this, you can be more selective about how you use the %exception directive. One approach is to only place it around critical pieces of code. For example:

    %exception {
      ... your exception handler ...
    }
    /* Define critical operations that can throw exceptions here */
    
    %exception;
    
    /* Define non-critical operations that don't throw exceptions */
    

    More precise control over exception handling can be obtained by attaching an exception handler to specific declaration name. For example:

    %exception allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    In this case, the exception handler is only attached to declarations named "allocate". This would include both global and member functions. The names supplied to %exception follow the same rules as for %rename described in the section on Renaming and ambiguity resolution. For example, if you wanted to define an exception handler for a specific class, you might write this:

    %exception Object::allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    When a class prefix is supplied, the exception handler is applied to the corresponding declaration in the specified class as well as for identically named functions appearing in derived classes.

    %exception can even be used to pinpoint a precise declaration when overloading is used. For example:

    %exception Object::allocate(int) {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    Attaching exceptions to specific declarations is a good way to reduce code bloat. It can also be a useful way to attach exceptions to specific parts of a header file. For example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    // Define a few exception handlers for specific declarations
    %exception Object::allocate(int) {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    
    %exception Object::getitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Index out of range");
      }
    }
    ...
    // Read a raw header file
    %include "someheader.h"
    

    Compatibility note: The %exception directive replaces the functionality provided by the deprecated "except" typemap. The typemap would allow exceptions to be thrown in the target language based on the return type of a function and was intended to be a mechanism for pinpointing specific declarations. However, it never really worked that well and the new %exception directive is much better.

    14.1.6 Special variables for %exception

    The %exception directive supports a few special variables which are placeholders for code substitution. The following table shows the available special variables and details what the special variables are replaced with.

    $action The actual operation to be performed (a function call, method invocation, variable access, etc.)
    $name The C/C++ symbol name for the function.
    $symname The symbol name used internally by SWIG
    $overname The extra mangling used in the symbol name for overloaded method. Expands to nothing if the wrapped method is not overloaded.
    $wrapname The language specific wrapper name (usually a C function name exported from the shared object/dll)
    $decl The fully qualified C/C++ declaration of the method being wrapped without the return type
    $fulldecl The fully qualified C/C++ declaration of the method being wrapped including the return type
    $parentclassname The parent class name (if any) for a method.
    $parentclasssymname The target language parent class name (if any) for a method.

    The special variables are often used in situations where method calls are logged. Exactly which form of the method call needs logging is up to individual requirements, but the example code below shows all the possible expansions, plus how an exception message could be tailored to show the C++ method declaration:

    %exception Special::something {
      log("symname: $symname");
      log("overname: $overname");
      log("wrapname: $wrapname");
      log("decl: $decl");
      log("fulldecl: $fulldecl");
      try {
        $action
      } 
      catch (MemoryError) {
        croak("Out of memory in $decl");
      }
    }
    void log(const char *message);
    struct Special {
      void something(const char *c);
      void something(int i);
    };
    

    Below shows the expansions for the 1st of the overloaded something wrapper methods for Perl:

      log("symname: Special_something");
      log("overname: __SWIG_0");
      log("wrapname: _wrap_Special_something__SWIG_0");
      log("decl: Special::something(char const *)");
      log("fulldecl: void Special::something(char const *)");
      try {
        (arg1)->something((char const *)arg2);
      } 
      catch (MemoryError) {
        croak("Out of memory in Special::something(char const *)");
      }
    

    14.1.7 Using The SWIG exception library

    The exception.i library file provides support for creating language independent exceptions in your interfaces. To use it, simply put an "%include exception.i" in your interface file. This provides a function SWIG_exception() that can be used to raise common scripting language exceptions in a portable manner. For example :

    // Language independent exception handler
    %include exception.i       
    
    %exception {
      try {
        $action
      } catch(RangeError) {
        SWIG_exception(SWIG_ValueError, "Range Error");
      } catch(DivisionByZero) {
        SWIG_exception(SWIG_DivisionByZero, "Division by zero");
      } catch(OutOfMemory) {
        SWIG_exception(SWIG_MemoryError, "Out of memory");
      } catch(...) {
        SWIG_exception(SWIG_RuntimeError, "Unknown exception");
      }
    }
    
    

    As arguments, SWIG_exception() takes an error type code (an integer) and an error message string. The currently supported error types are :

    SWIG_UnknownError
    SWIG_IOError
    SWIG_RuntimeError
    SWIG_IndexError
    SWIG_TypeError
    SWIG_DivisionByZero
    SWIG_OverflowError
    SWIG_SyntaxError
    SWIG_ValueError
    SWIG_SystemError
    SWIG_AttributeError
    SWIG_MemoryError
    SWIG_NullReferenceError
    

    The SWIG_exception() function can also be used in typemaps.

    14.2 Object ownership and %newobject

    A common problem in some applications is managing proper ownership of objects. For example, consider a function like this:

    Foo *blah() {
      Foo *f = new Foo();
      return f;
    }
    

    If you wrap the function blah(), SWIG has no idea that the return value is a newly allocated object. As a result, the resulting extension module may produce a memory leak (SWIG is conservative and will never delete objects unless it knows for certain that the returned object was newly created).

    To fix this, you can provide an extra hint to the code generator using the %newobject directive. For example:

    %newobject blah;
    Foo *blah();
    

    %newobject works exactly like %rename and %exception. In other words, you can attach it to class members and parameterized declarations as before. For example:

    %newobject ::blah();                   // Only applies to global blah
    %newobject Object::blah(int, double);  // Only blah(int, double) in Object
    %newobject *::copy;                    // Copy method in all classes
    ...
    

    When %newobject is supplied, many language modules will arrange to take ownership of the return value. This allows the value to be automatically garbage-collected when it is no longer in use. However, this depends entirely on the target language (a language module may also choose to ignore the %newobject directive).

    Closely related to %newobject is a special typemap. The "newfree" typemap can be used to deallocate a newly allocated return value. It is only available on methods for which %newobject has been applied and is commonly used to clean-up string results. For example:

    %typemap(newfree) char * "free($1);";
    ...
    %newobject strdup;
    ...
    char *strdup(const char *s);
    

    In this case, the result of the function is a string in the target language. Since this string is a copy of the original result, the data returned by strdup() is no longer needed. The "newfree" typemap in the example simply releases this memory.

    As a complement to the %newobject, from SWIG 1.3.28, you can use the %delobject directive. For example, if you have two methods, one to create objects and one to destroy them, you can use:

    %newobject create_foo;
    %delobject destroy_foo;
    ...
    Foo *create_foo();
    void destroy_foo(Foo *foo);
    

    or in a member method as:

    %delobject Foo::destroy;
    
    class Foo {
    public:
      void destroy() { delete this;}
    
    private:
      ~Foo();
    };
    

    %delobject instructs SWIG that the first argument passed to the method will be destroyed, and therefore, the target language should not attempt to deallocate it twice. This is similar to use the DISOWN typemap in the first method argument, and in fact, it also depends on the target language on implementing the 'disown' mechanism properly.

    The use of %newobject is also integrated with reference counting and is covered in the C++ reference counted objects section.

    Compatibility note: Previous versions of SWIG had a special %new directive. However, unlike %newobject, it only applied to the next declaration. For example:

    %new char *strdup(const char *s);
    

    For now this is still supported but is deprecated.

    How to shoot yourself in the foot: The %newobject directive is not a declaration modifier like the old %new directive. Don't write code like this:

    %newobject
    char *strdup(const char *s);
    

    The results might not be what you expect.

    14.3 Features and the %feature directive

    Both %exception and %newobject are examples of a more general purpose customization mechanism known as "features." A feature is simply a user-definable property that is attached to specific declarations. Features are attached using the %feature directive. For example:

    %feature("except") Object::allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    
    %feature("new", "1") *::copy;
    

    In fact, the %exception and %newobject directives are really nothing more than macros involving %feature:

    #define %exception %feature("except")
    #define %newobject %feature("new", "1")
    

    The name matching rules outlined in the Renaming and ambiguity resolution section applies to all %feature directives. In fact the %rename directive is just a special form of %feature. The matching rules mean that features are very flexible and can be applied with pinpoint accuracy to specific declarations if needed. Additionally, if no declaration name is given, a global feature is said to be defined. This feature is then attached to every declaration that follows. This is how global exception handlers are defined. For example:

    /* Define a global exception handler */
    %feature("except") {
      try {
        $action
      }
      ...
    }
    
    ... bunch of declarations ...
    

    The %feature directive can be used with different syntax. The following are all equivalent:

    %feature("except") Object::method { $action };
    %feature("except") Object::method %{ $action %};
    %feature("except") Object::method " $action ";
    %feature("except", "$action") Object::method;
    

    The syntax in the first variation will generate the { } delimiters used whereas the other variations will not.

    14.3.1 Feature attributes

    The %feature directive also accepts XML style attributes in the same way that typemaps do. Any number of attributes can be specified. The following is the generic syntax for features:

    %feature("name", "value", attribute1="AttributeValue1") symbol;
    %feature("name", attribute1="AttributeValue1") symbol {value};
    %feature("name", attribute1="AttributeValue1") symbol %{value%};
    %feature("name", attribute1="AttributeValue1") symbol "value";
    

    More than one attribute can be specified using a comma separated list. The Java module is an example that uses attributes in %feature("except"). The throws attribute specifies the name of a Java class to add to a proxy method's throws clause. In the following example, MyExceptionClass is the name of the Java class for adding to the throws clause.

    %feature("except", throws="MyExceptionClass") Object::method { 
      try {
        $action
      } catch (...) {
        ... code to throw a MyExceptionClass Java exception ...
      }
    };
    

    Further details can be obtained from the Java exception handling section.

    14.3.2 Feature flags

    Feature flags are used to enable or disable a particular feature. Feature flags are a common but simple usage of %feature and the feature value should be either 1 to enable or 0 to disable the feature.

    %feature("featurename")          // enables feature
    %feature("featurename", "1")     // enables feature
    %feature("featurename", "x")     // enables feature
    %feature("featurename", "0")     // disables feature
    %feature("featurename", "")      // clears feature
    

    Actually any value other than zero will enable the feature. Note that if the value is omitted completely, the default value becomes 1, thereby enabling the feature. A feature is cleared by specifying no value, see Clearing features. The %immutable directive described in the Creating read-only variables section, is just a macro for %feature("immutable"), and can be used to demonstrates feature flags:

                                    // features are disabled by default
    int red;                        // mutable
    
    %feature("immutable");          // global enable
    int orange;                     // immutable
    
    %feature("immutable", "0");     // global disable
    int yellow;                     // mutable
    
    %feature("immutable", "1");     // another form of global enable
    int green;                      // immutable
    
    %feature("immutable", "");      // clears the global feature
    int blue;                       // mutable
    

    Note that features are disabled by default and must be explicitly enabled either globally or by specifying a targeted declaration. The above intersperses SWIG directives with C code. Of course you can target features explicitly, so the above could also be rewritten as:

    %feature("immutable", "1") orange;
    %feature("immutable", "1") green;
    int red;                        // mutable
    int orange;                     // immutable
    int yellow;                     // mutable
    int green;                      // immutable
    int blue;                       // mutable
    

    The above approach allows for the C declarations to be separated from the SWIG directives for when the C declarations are parsed from a C header file. The logic above can of course be inverted and rewritten as:

    %feature("immutable", "1");
    %feature("immutable", "0") red;
    %feature("immutable", "0") yellow;
    %feature("immutable", "0") blue;
    int red;                        // mutable
    int orange;                     // immutable
    int yellow;                     // mutable
    int green;                      // immutable
    int blue;                       // mutable
    

    As hinted above for %immutable, most feature flags can also be specified via alternative syntax. The alternative syntax is just a macro in the swig.swg Library file. The following shows the alternative syntax for the imaginary featurename feature:

    %featurename       // equivalent to %feature("featurename", "1") ie enables feature
    %nofeaturename     // equivalent to %feature("featurename", "0") ie disables feature
    %clearfeaturename  // equivalent to %feature("featurename", "")  ie clears feature
    

    The concept of clearing features is discussed next.

    14.3.3 Clearing features

    A feature stays in effect until it is explicitly cleared. A feature is cleared by supplying a %feature directive with no value. For example %feature("name", ""). A cleared feature means that any feature exactly matching any previously defined feature is no longer used in the name matching rules. So if a feature is cleared, it might mean that another name matching rule will apply. To clarify, let's consider the except feature again (%exception):

    // Define global exception handler
    %feature("except") {
      try {
        $action
      } catch (...) {
        croak("Unknown C++ exception");
      }
    }
    
    // Define exception handler for all clone methods to log the method calls
    %feature("except") *::clone() {
      try {
        logger.info("$action");
        $action
      } catch (...) {
        croak("Unknown C++ exception");
      }
    }
    
    ... initial set of class declarations with clone methods ...
    
    // clear the previously defined feature
    %feature("except", "") *::clone();
    
    ... final set of class declarations with clone methods ...
    

    In the above scenario, the initial set of clone methods will log all method invocations from the target language. This specific feature is cleared for the final set of clone methods. However, these clone methods will still have an exception handler (without logging) as the next best feature match for them is the global exception handler.

    Note that clearing a feature is not always the same as disabling it. Clearing the feature above with %feature("except", "") *::clone() is not the same as specifying %feature("except", "0") *::clone(). The former will disable the feature for clone methods - the feature is still a better match than the global feature. If on the other hand, no global exception handler had been defined at all, then clearing the feature would be the same as disabling it as no other feature would have matched.

    Note that the feature must match exactly for it to be cleared by any previously defined feature. For example the following attempt to clear the initial feature will not work:

    %feature("except") clone() { logger.info("$action"); $action }
    %feature("except", "") *::clone();
    

    but this will:

    %feature("except") clone() { logger.info("$action"); $action }
    %feature("except", "") clone();
    

    SWIG provides macros for disabling and clearing features. Many of these can be found in the swig.swg library file. The typical pattern is to define three macros; one to define the feature itself, one to disable the feature and one to clear the feature. The three macros below show this for the "except" feature:

    #define %exception      %feature("except")
    #define %noexception    %feature("except", "0")
    #define %clearexception %feature("except", "")
    

    14.3.4 Features and default arguments

    SWIG treats methods with default arguments as separate overloaded methods as detailed in the default arguments section. Any %feature targeting a method with default arguments will apply to all the extra overloaded methods that SWIG generates if the default arguments are specified in the feature. If the default arguments are not specified in the feature, then the feature will match that exact wrapper method only and not the extra overloaded methods that SWIG generates. For example:

    %feature("except") hello(int i=0, double d=0.0) { ... }
    void hello(int i=0, double d=0.0);
    

    will apply the feature to all three wrapper methods, that is:

    void hello(int i, double d);
    void hello(int i);
    void hello();
    

    If the default arguments are not specified in the feature:

    %feature("except") hello(int i, double d) { ... }
    void hello(int i=0, double d=0.0);
    

    then the feature will only apply to this wrapper method:

    void hello(int i, double d);
    

    and not these wrapper methods:

    void hello(int i);
    void hello();
    

    If compactdefaultargs are being used, then the difference between specifying or not specifying default arguments in a feature is not applicable as just one wrapper is generated.

    Compatibility note: The different behaviour of features specified with or without default arguments was introduced in SWIG-1.3.23 when the approach to wrapping methods with default arguments was changed.

    14.3.5 Feature example

    As has been shown earlier, the intended use for the %feature directive is as a highly flexible customization mechanism that can be used to annotate declarations with additional information for use by specific target language modules. Another example is in the Python module. You might use %feature to rewrite proxy/shadow class code as follows:

    %module example
    %rename(bar_id) bar(int, double);
    
    // Rewrite bar() to allow some nice overloading
    
    %feature("shadow") Foo::bar(int) %{
    def bar(*args):
        if len(args) == 3:
            return apply(examplec.Foo_bar_id, args)
        return apply(examplec.Foo_bar, args)
    %}
        
    class Foo {
    public:
      int bar(int x);
      int bar(int x, double y);
    }
    

    Further details of %feature usage is described in the documentation for specific language modules.

    swig-4.0.2/Doc/Manual/Ruby.html0000644000175000017500000046024713667507563016134 0ustar williamwilliam SWIG and Ruby

    34 SWIG and Ruby

    This chapter describes SWIG's support of Ruby.

    34.1 Preliminaries

    SWIG 4.0 is known to work with Ruby versions 1.9 and later. Given the choice, you should use the latest stable version of Ruby. You should also determine if your system supports shared libraries and dynamic loading. SWIG will work with or without dynamic loading, but the compilation process will vary.

    This chapter covers most SWIG features, but in less depth than is found in earlier chapters. At the very least, make sure you also read the "SWIG Basics" chapter. It is also assumed that the reader has a basic understanding of Ruby.

    34.1.1 Running SWIG

    To build a Ruby module, run SWIG using the -ruby option:

    $ swig -ruby example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -ruby example.i
    

    This creates a file example_wrap.c (example_wrap.cxx if compiling a C++ extension) that contains all of the code needed to build a Ruby extension module. To finish building the module, you need to compile this file and link it with the rest of your program.

    34.1.2 Getting the right header files

    In order to compile the wrapper code, the compiler needs the ruby.h header file and its dependencies, notably ruby/config.h which is found in a different, architecture-dependent, directory. The best way to find the compiler options needed to compile the code is to ask Ruby itself:

    $ ruby -rrbconfig -e 'puts "-I#{RbConfig::CONFIG[%q{rubyhdrdir}]} -I#{RbConfig::CONFIG[%q{rubyarchhdrdir}]}"'
    -I/usr/include/ruby-2.1.0 -I/usr/include/x86_64-linux-gnu/ruby-2.1.0
    

    34.1.3 Compiling a dynamic module

    Ruby extension modules are typically compiled into shared libraries that the interpreter loads dynamically at runtime. Since the exact commands for doing this vary from platform to platform, your best bet is to follow the steps described in the README.EXT file from the Ruby distribution:

    1. Create a file called extconf.rb that looks like the following:

      require 'mkmf'
      create_makefile('example')
    2. Type the following to build the extension:

      $ ruby extconf.rb
      $ make
      $ make install
          

    Of course, there is the problem that mkmf does not work correctly on all platforms, e.g, HPUX. If you need to add your own make rules to the file that extconf.rb produces, you can add this:

    open("Makefile", "a") { |mf|
     puts <<EOM
     # Your make rules go here
     EOM
    }
    

    to the end of the extconf.rb file. If for some reason you don't want to use the standard approach, you'll need to determine the correct compiler and linker flags for your build platform. For example, assuming you have code you need to link to in a file called example.c, a typical sequence of commands for the Linux operating system would look something like this:

    $ swig -ruby example.i
    $ gcc -O2 -fPIC -c example.c
    $ gcc -O2 -fPIC -c example_wrap.c -I/usr/include/ruby-2.1.0
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The -fPIC option tells GCC to generate position-independent code (PIC) which is required for most architectures (it's not vital on x86, but still a good idea as it allows code pages from the library to be shared between processes). Other compilers may need a different option specified instead of -fPIC.

    If in doubt, consult the manual pages for your compiler and linker to determine the correct set of options. You might also check the SWIG Wiki for additional information.

    34.1.4 Using your module

    Ruby module names must be capitalized, but the convention for Ruby feature names is to use lowercase names. So, for example, the Etc extension module is imported by requiring the etc feature:

    # The feature name begins with a lowercase letter...
    require 'etc'
    
    # ... but the module name begins with an uppercase letter
    puts "Your login name: #{Etc.getlogin}"
    

    To stay consistent with this practice, you should always specify a lowercase module name with SWIG's %module directive. SWIG will automatically correct the resulting Ruby module name for your extension. So for example, a SWIG interface file that begins with:

    %module example

    will result in an extension module using the feature name "example" and Ruby module name "Example".

    34.1.5 Static linking

    An alternative approach to dynamic linking is to rebuild the Ruby interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Ruby involves finding the Ruby source, adding an entry to the ext/Setup file, adding your directory to the list of extensions in the file, and finally rebuilding Ruby.

    34.1.6 Compilation of C++ extensions

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -ruby example.i
    $ g++ -fPIC -c example.cxx
    $ g++ -fPIC -c example_wrap.cxx -I/usr/include/ruby-2.1.0
    $ g++ -shared example.o example_wrap.o -o example.so
    

    If you've written an extconf.rb script to automatically generate a Makefile for your C++ extension module, keep in mind that (as of this writing) Ruby still uses gcc and not g++ as its linker. As a result, the required C++ runtime library support will not be automatically linked into your extension module and it may fail to load on some platforms. A workaround for this problem is use the mkmf module's append_library() method to add one of the C++ runtime libraries to the list of libraries linked into your extension, e.g.

    require 'mkmf'
    $libs = append_library($libs, "supc++")
    create_makefile('example')

    34.2 Building Ruby Extensions under Windows 95/NT

    Building a SWIG extension to Ruby under Windows 95/NT is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into the Ruby interpreter. For all recent versions of Ruby, the procedure described above (i.e. using an extconf.rb script) will work with Windows as well; you should be able to build your code into a DLL by typing:

    C:\swigtest> ruby extconf.rb
    C:\swigtest> nmake
    C:\swigtest> nmake install
    

    The remainder of this section covers the process of compiling SWIG-generated Ruby extensions with Microsoft Visual C++ 6 (i.e. within the Developer Studio IDE, instead of using the command line tools). In order to build extensions, you may need to download the source distribution to the Ruby package, as you will need the Ruby header files.

    34.2.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly follows these steps :

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (i.e. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer Studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -ruby -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field". You may have to include the path to swig.exe.
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to the C/C++ tab and select the Preprocessor category. Add NT=1 to the Preprocessor definitions. This must be set else you will get compilation errors. Also add IMPORT to the preprocessor definitions, else you may get runtime errors. Also add the include directories for your Ruby installation under "Additional include directories".
    • Next, select the settings for the entire project and go to the Link tab and select the General category. Set the name of the output file to match the name of your Ruby module (i.e.. example.dll). Next add the Ruby library file to your link libraries under Object/Library modules. For example "mswin32-ruby16.lib. You also need to add the path to the library under the Input tab - Additional library path.
    • Build your project.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Ruby extension, simply run Ruby and use the require command as normal. For example if you have this ruby file run.rb:

    # file: run.rb
    require 'Example'
    
    # Call a c function
    print "Foo = ", Example.Foo, "\n"

    Ensure the dll just built is in your path or current directory, then run the Ruby script from the DOS/Command prompt:

    C:\swigtest> ruby run.rb
    Foo = 3.0
    

    34.3 The Ruby-to-C/C++ Mapping

    This section describes the basics of how SWIG maps C or C++ declarations in your SWIG interface files to Ruby constructs.

    34.3.1 Modules

    The SWIG %module directive specifies the name of the Ruby module. If you specify:

    %module example

    then everything is wrapped into a Ruby module named Example that is nested directly under the global module. You can specify a more deeply nested module by specifying the fully-qualified module name in quotes, e.g.

    %module "foo::bar::spam"

    An alternate method of specifying a nested module name is to use the -prefix option on the SWIG command line. The prefix that you specify with this option will be prepended to the module name specified with the %module directive in your SWIG interface file. So for example, this declaration at the top of your SWIG interface file:

    %module "foo::bar::spam"

    will result in a nested module name of Foo::Bar::Spam, but you can achieve the same effect by specifying:

    %module spam

    and then running SWIG with the -prefix command line option:

    $ swig -ruby -prefix "foo::bar::" example.i
    

    Starting with SWIG 1.3.20, you can also choose to wrap everything into the global module by specifying the -globalmodule option on the SWIG command line, i.e.

    $ swig -ruby -globalmodule example.i
    

    Note that this does not relieve you of the requirement of specifying the SWIG module name with the %module directive (or the -module command-line option) as described earlier.

    When choosing a module name, do not use the same name as a built-in Ruby command or standard module name, as the results may be unpredictable. Similarly, if you're using the -globalmodule option to wrap everything into the global module, take care that the names of your constants, classes and methods don't conflict with any of Ruby's built-in names.

    34.3.2 Functions

    Global functions are wrapped as Ruby module methods. For example, given the SWIG interface file example.i:

    %module example
    
    int fact(int n);

    and C source file example.c:

    int fact(int n) {
      if (n == 0)
      return 1;
      return (n * fact(n-1));
    }

    SWIG will generate a method fact in the Example module that can be used like so:

    $ irb
    irb(main):001:0> require 'example'
    true
    irb(main):002:0> Example.fact(4)
    24

    34.3.3 Variable Linking

    C/C++ global variables are wrapped as a pair of singleton methods for the module: one to get the value of the global variable and one to set it. For example, the following SWIG interface file declares two global variables:

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
      extern int variable1;
      extern double Variable2;
    %}
    ...

    Now look at the Ruby interface:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> Example.variable1 = 2
    2
    irb(main):003:0> Example.Variable2 = 4 * 10.3
    41.2
    irb(main):004:0> Example.Variable2
    41.2

    If you make an error in variable assignment, you will receive an error message. For example:

    irb(main):005:0> Example.Variable2 = "hello"
    TypeError: no implicit conversion to float from string
    from (irb):5:in `Variable2='
    from (irb):5

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can also use the %immutable directive. For example:

    %immutable;
    %inline %{
      extern char *path;
    %}
    %mutable;

    The %immutable directive stays in effect until it is explicitly disabled using %mutable.

    Note: When SWIG is invoked with the -globalmodule option in effect, the C/C++ global variables will be translated into Ruby global variables. Type-checking and the optional read-only characteristic are available in the same way as described above. However the example would then have to be modified and executed in the following way:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> $variable1 = 2
    2
    irb(main):003:0> $Variable2 = 4 * 10.3
    41.2
    irb(main):004:0> $Variable2
    41.2

    34.3.4 Constants

    C/C++ constants are wrapped as module constants initialized to the appropriate value. To create a constant, use #define or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    
    const int BAR = 32;

    Remember to use the :: operator in Ruby to get at these constant values, e.g.

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> Example::PI
    3.14159

    34.3.5 Pointers

    "Opaque" pointers to arbitrary C/C++ types (i.e. types that aren't explicitly declared in your SWIG interface file) are wrapped as data objects. So, for example, consider a SWIG interface file containing only the declarations:

    Foo *get_foo();
    void set_foo(Foo *foo);

    For this case, the get_foo() method returns an instance of an internally generated Ruby class:

    irb(main):001:0> foo = Example::get_foo()
    #<SWIG::TYPE_p_Foo:0x402b1654>

    A NULL pointer is always represented by the Ruby nil object.

    34.3.6 Structures

    C/C++ structs are wrapped as Ruby classes, with accessor methods (i.e. "getters" and "setters") for all of the struct members. For example, this struct declaration:

    struct Vector {
      double x, y;
    };

    gets wrapped as a Vector class, with Ruby instance methods x, x=, y and y=. These methods can be used to access structure data from Ruby as follows:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> f = Example::Vector.new
    #<Example::Vector:0x4020b268>
    irb(main):003:0> f.x = 10
    nil
    irb(main):004:0> f.x
    10.0

    Similar access is provided for unions and the public data members of C++ classes.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive (in C++, private may also be used). For example:

    struct Foo {
      ...
      %immutable;
      int x; /* Read-only members */
      char *name;
      %mutable;
      ...
    };

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described shortly).

    Array members are normally wrapped as read-only. For example, this code:

    struct Foo {
      int x[50];
    };

    produces a single accessor function like this:

    int *Foo_x_get(Foo *self) {
      return self->x;
    };

    If you want to set an array member, you will need to supply a "memberin" typemap described in the section on typemaps. As a special case, SWIG does generate code to set array members of type char (allowing you to store a Ruby string in the structure).

    When structure members are wrapped, they are handled as pointers. For example,

    struct Foo {
      ...
    };
    
    struct Bar {
      Foo f;
    };

    generates accessor functions such as this:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    
    void Bar_f_set(Bar *b, Foo *val) {
      b->f = *val;
    }

    34.3.7 C++ classes

    Like structs, C++ classes are wrapped by creating a new Ruby class of the same name with accessor methods for the public class member data. Additionally, public member functions for the class are wrapped as Ruby instance methods, and public static member functions are wrapped as Ruby singleton methods. So, given the C++ class declaration:

    class List {
    public:
      List();
      ~List();
      int search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int length;
      static void print(List *l);
    };

    SWIG would create a List class with:

    • instance methods search, insert, remove, and get;
    • instance methods length and length= (to get and set the value of the length data member); and,
    • a print singleton method for the class.

    In Ruby, these functions are used as follows:

    require 'Example'
    
    l = Example::List.new
    
    l.insert("Ale")
    l.insert("Stout")
    l.insert("Lager")
    Example.print(l)
    l.length()
    ----- produces the following output 
    Lager
    Stout
    Ale
    3

    34.3.8 C++ Inheritance

    The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have classes like this:

    class Parent {
      ...
    };
    
    class Child : public Parent {
      ...
    };

    those classes are wrapped into a hierarchy of Ruby classes that reflect the same inheritance structure. All of the usual Ruby utility methods work normally:

    irb(main):001:0> c = Child.new
    #<Bar:0x4016efd4>
    irb(main):002:0> c.instance_of? Child
    true
    irb(main):003:0> b.instance_of? Parent
    false
    irb(main):004:0> b.is_a? Child
    true
    irb(main):005:0> b.is_a? Parent
    true
    irb(main):006:0> Child < Parent
    true
    irb(main):007:0> Child > Parent
    false

    Furthermore, if you have a function like this:

    void spam(Parent *f);

    then the function spam() accepts Parent* or a pointer to any class derived from Parent.

    Until recently, the Ruby module for SWIG didn't support multiple inheritance, and this is still the default behavior. This doesn't mean that you can't wrap C++ classes which inherit from multiple base classes; it simply means that only the first base class listed in the class declaration is considered, and any additional base classes are ignored. As an example, consider a SWIG interface file with a declaration like this:

    class Derived : public Base1, public Base2
    {
      ...
    };

    For this case, the resulting Ruby class (Derived) will only consider Base1 as its superclass. It won't inherit any of Base2's member functions or data and it won't recognize Base2 as an "ancestor" of Derived (i.e. the is_a? relationship would fail). When SWIG processes this interface file, you'll see a warning message like:

    example.i:5: Warning 802: Warning for Derived: Base Base2 ignored.
    Multiple inheritance is not supported in Ruby.

    Starting with SWIG 1.3.20, the Ruby module for SWIG provides limited support for multiple inheritance. Because the approach for dealing with multiple inheritance introduces some limitations, this is an optional feature that you can activate with the -minherit command-line option:

    $ swig -c++ -ruby -minherit example.i
    

    Using our previous example, if your SWIG interface file contains a declaration like this:

    class Derived : public Base1, public Base2
    {
      ...
    };

    and you run SWIG with the -minherit command-line option, then you will end up with a Ruby class Derived that appears to "inherit" the member data and functions from both Base1 and Base2. What actually happens is that three different top-level classes are created, with Ruby's Object class as their superclass. Each of these classes defines a nested module named Impl, and it's in these nested Impl modules that the actual instance methods for the classes are defined, i.e.

    class Base1
      module Impl
      # Define Base1 methods here
      end
      include Impl
    end
    
    class Base2
      module Impl
      # Define Base2 methods here
      end
      include Impl
    end
    
    class Derived
      module Impl
      include Base1::Impl
      include Base2::Impl
      # Define Derived methods here
      end
      include Impl
    end

    Observe that after the nested Impl module for a class is defined, it is mixed-in to the class itself. Also observe that the Derived::Impl module first mixes-in its base classes' Impl modules, thus "inheriting" all of their behavior.

    The primary drawback is that, unlike the default mode of operation, neither Base1 nor Base2 is a true superclass of Derived anymore:

    obj = Derived.new
    obj.is_a? Base1 # this will return false...
    obj.is_a? Base2 # ... and so will this

    In most cases, this is not a serious problem since objects of type Derived will otherwise behave as though they inherit from both Base1 and Base2 (i.e. they exhibit "Duck Typing").

    34.3.9 C++ Overloaded Functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);

    You can use them in Ruby in a straightforward manner:

    irb(main):001:0> foo(3) # foo(int)
    irb(main):002:0> foo("Hello") # foo(char *c)

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };

    you can write Ruby code like this:

    irb(main):001:0> f = Foo.new # Create a Foo
    irb(main):002:0> g = Foo.new(f) # Copy f

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);

    or

    void foo(Bar *b);
    void foo(Bar &b);

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int); 
    void spam(short); // Accessed as spam_short

    or

    %ignore spam(short);
    ...
    void spam(int); 
    void spam(short); // Ignored

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    34.3.10 C++ Operators

    For the most part, overloaded operators are handled automatically by SWIG and do not require any special treatment on your part. So if your class declares an overloaded addition operator, e.g.

    class Complex {
      ...
      Complex operator+(Complex &);
      ...
    };

    the resulting Ruby class will also support the addition (+) method correctly.

    For cases where SWIG's built-in support is not sufficient, C++ operators can be wrapped using the %rename directive (available on SWIG 1.3.10 and later releases). All you need to do is give the operator the name of a valid Ruby identifier. For example:

    %rename(add_complex) operator+(Complex &, Complex &);
    ...
    Complex operator+(Complex &, Complex &);

    Now, in Ruby, you can do this:

    a = Example::Complex.new(2, 3)
    b = Example::Complex.new(4, -1)
    c = Example.add_complex(a, b)

    More details about wrapping C++ operators into Ruby operators is discussed in the section on operator overloading.

    34.3.11 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };

    it works in Ruby as follows:

    irb(main):001:0> require 'example'
    true
    irb(main):002:0> Example.fact(3)
    6
    irb(main):003:0> v = Example::Vector.new
    #<Example::Vector:0x4016f4d4>
    irb(main):004:0> v.x = 3.4
    3.4
    irb(main):004:0> v.y
    0.0

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    34.3.12 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(Pairii) pair<int, int>;

    In Ruby:

    irb(main):001:0> require 'example'
    true
    irb(main):002:0> p = Example::Pairii.new(3, 4)
    #<Example:Pairii:0x4016f4df>
    irb(main):003:0> p.first
    3
    irb(main):004:0> p.second
    4

    34.3.13 C++ Standard Template Library (STL)

    On a related note, the standard SWIG library contains a number of modules that provide typemaps for standard C++ library classes (such as std::pair, std::string and std::vector). These library modules don't provide wrappers around the templates themselves, but they do make it convenient for users of your extension module to pass Ruby objects (such as arrays and strings) to wrapped C++ code that expects instances of standard C++ templates. For example, suppose the C++ library you're wrapping has a function that expects a vector of floats:

    %module example
    
    float sum(const std::vector<float>& values);

    Rather than go through the hassle of writing an "in" typemap to convert an array of Ruby numbers into a std::vector<float>, you can just use the std_vector.i module from the standard SWIG library:

    %module example
    
    %include std_vector.i
    float sum(const std::vector<float>& values);

    Ruby's STL wrappings provide additional methods to make them behave more similarly to Ruby's native classes.

    Thus, you can do, for example:

    v = IntVector.new
    v << 2
    v << 3
    v << 4
    v.each { |x| puts x }
    
    => 2
    3
    4
    v.delete_if { |x| x == 3 }
    => [2, 4]

    The SWIG Ruby module provides also the ability for all the STL containers to carry around Ruby native objects (Fixnum, Classes, etc) making them act almost like Ruby's own Array, Hash, etc. To do that, you need to define a container that contains a swig::GC_VALUE, like:

    %module nativevector
    
    %{
    std::vector< swig::GC_VALUE > NativeVector;
    %}
    
    %template(NativeVector) std::vector< swig::GC_VALUE >;
    

    This vector can then contain any Ruby object, making them almost identical to Ruby's own Array class.

    require 'nativevector'
    include NativeVector
    
    v = NativeVector.new
    v << 1
    v << [1, 2]
    v << 'hello'
    
    class A; end
    
    v << A.new
    
    puts v
    => [1, [1, 2], 'hello', #<A:0x245325>]
    

    Obviously, there is a lot more to template wrapping than shown in these examples. More details can be found in the SWIG and C++ chapter.

    34.3.14 C++ STL Functors

    Some containers in the STL allow you to modify their default behavior by using so called functors or function objects. Functors are often just a very simple struct with operator() redefined or an actual C/C++ function. This allows you, for example, to always keep the sort order of a STL container to your liking.

    The Ruby STL mappings allows you to modify those containers that support functors using Ruby procs or methods, instead. Currently, this includes std::set, set::map, std::multiset and std::multimap.

    The functors in swig are called swig::UnaryFunction and swig::BinaryFunction. For C++ predicates (ie. functors that must return bool as a result) swig::UnaryPredicate and swig::BinaryPredicate are provided.

    As an example, if given this swig file:

    %module intset;
    
    %include <std_set.i>
    
    %template(IntSet) std::set< int, swig::BinaryPredicate >;
    

    You can then use the set from Ruby with or without a proc object as a predicate:

    require 'intset'
    include Intset
    
    # Default sorting behavior defined in C++
    a = IntSet.new
    a << 1
    a << 2
    a << 3
    a
    => [1, 2, 3]
    
    # Custom sorting behavior defined by a Ruby proc
    b = IntSet.new( proc { |a, b| a > b } )
    b << 1
    b << 2
    b << 3
    b
    =>  [3, 2, 1]
    

    34.3.15 C++ STL Iterators

    The STL is well known for the use of iterators. There are a number of iterators possible with different properties, but in general there are two main categories: const iterators and non-const iterators. The const iterators can access and not modify the values they point at, while the non-const iterators can both read and modify the values.

    The Ruby STL wrappings support both type of iterators by using a proxy class in-between. This proxy class is swig::Iterator or swig::ConstIterator. Derived from them are template classes that need to be initialized with the actual iterator for the container you are wrapping and often times with the beginning and ending points of the iteration range.

    The SWIG STL library already provides typemaps to all the standard containers to do this wrapping automatically for you, but if you have your own STL-like iterator, you will need to write your own typemap for them. For out typemaps, the special functions make_const_iterator and make_nonconst_iterator are provided.

    These can be used either like:

    make_const_iterator( iterator, rubyclass );
    make_const_iterator( iterator, iterator_begin, iterator_end, rubyclass );
    

    The iterators support a next() and previous() member function to just change the iterator without returning anything. previous() should obviously only be used for bidirectional iterators. You can also advance the iterator multiple steps by using standard math operations like +=.

    The value the iterator points at can be accessed with value() -- this is equivalent to dereferencing it with *i. For non-const iterators, a value=() function is also provided which allows you to change the value pointed by the iterator. This is equivalent to the C++ construct of dereferencing and assignment, like *i = something.

    Thus, given say a vector class of doubles defined as:

    %module doublevector
    
    %include std_vector.i
    
    %template(DoubleVector) std::vector<double>;
    

    Its iterator can then be used from Ruby like:

    require 'doublevector'
    include Doublevector
    
    v = DoubleVector.new
    v << 1
    v << 2
    v << 3
    
    #
    # an elaborate and less efficient way of doing v.map! { |x| x+2 }
    #
    i = v.begin
    e = v.end
    while i != e
      val = i.value
      val += 2
      i.value = val
      i.next
    end
    i
    >> [3, 4, 5 ]
    

    If you'd rather have STL classes without any iterators, you should define -DSWIG_NO_EXPORT_ITERATOR_METHODS when running swig.

    34.3.16 C++ Smart Pointers

    34.3.16.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Ruby in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    34.3.16.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo(); // Created somehow (not shown)
    ...
    p->x = 3; // Foo::x
    int y = p->bar(); // Foo::bar

    To wrap this in Ruby, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...

    Now, in Ruby, everything should just "work":

    irb(main):001:0> p = Example::CreateFoo() # Create a smart-pointer somehow
    #<Example::SmartPtrFoo:0x4016f4df>
    irb(main):002:0> p.x = 3 # Foo::x
    3
    irb(main):003:0> p.bar() # Foo::bar

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    irb(main):004:0> f = p.__deref__() # Returns underlying Foo *

    34.3.17 Cross-Language Polymorphism

    SWIG's Ruby module supports cross-language polymorphism (a.k.a. the "directors" feature) similar to that for SWIG's Python module. Rather than duplicate the information presented in the Python chapter, this section just notes the differences that you need to be aware of when using this feature with Ruby.

    34.3.17.1 Exception Unrolling

    Whenever a C++ director class routes one of its virtual member function calls to a Ruby instance method, there's always the possibility that an exception will be raised in the Ruby code. By default, those exceptions are ignored, which simply means that the exception will be exposed to the Ruby interpreter. If you would like to change this behavior, you can use the %feature("director:except") directive to indicate what action should be taken when a Ruby exception is raised. The following code should suffice in most cases:

    %feature("director:except") {
      throw Swig::DirectorMethodException($error);
    }

    When this feature is activated, the call to the Ruby instance method is "wrapped" using the rb_rescue2() function from Ruby's C API. If any Ruby exception is raised, it will be caught here and a C++ exception is raised in its place.

    34.4 Naming

    Ruby has several common naming conventions. Constants are generally in upper case, module and class names are in camel case and methods are in lower case with underscores. For example:

    • MATH::PI is a constant name
    • MyClass is a class name
    • my_method is a method name

    Prior to version 1.3.28, SWIG did not support these Ruby conventions. The only modifications it made to names was to capitalize the first letter of constants (which includes module and class names).

    SWIG 1.3.28 introduces the new -autorename command line parameter. When this parameter is specified, SWIG will automatically change constant, class and method names to conform with the standard Ruby naming conventions. For example:

    $ swig -ruby -autorename example.i
    

    To disable renaming use the -noautorename command line option.

    Since this change significantly changes the wrapper code generated by SWIG, it is turned off by default in SWIG 1.3.28. However, it is planned to become the default option in future releases.

    34.4.1 Defining Aliases

    It's a fairly common practice in the Ruby built-ins and standard library to provide aliases for method names. For example, Array#size is an alias for Array#length. If you would like to provide an alias for one of your class' instance methods, one approach is to use SWIG's %extend directive to add a new method of the aliased name that calls the original function. For example:

    class MyArray {
    public:
      // Construct an empty array
      MyArray();
    
      // Return the size of this array
      size_t length() const;
    };
    
    %extend MyArray {
      // MyArray#size is an alias for MyArray#length
      size_t size() const {
        return $self->length();
      }
    }
     

    A better solution is to use the %alias directive (unique to SWIG's Ruby module). The previous example could then be rewritten as:

    // MyArray#size is an alias for MyArray#length
    %alias MyArray::length "size";
    
    class MyArray {
    public:
      // Construct an empty array
      MyArray();
     
      // Return the size of this array
      size_t length() const;
    };

    Multiple aliases can be associated with a method by providing a comma-separated list of aliases to the %alias directive, e.g.

    %alias MyArray::length "amount, quantity, size";

    From an end-user's standpoint, there's no functional difference between these two approaches; i.e. they should get the same result from calling either MyArray#size or MyArray#length. However, when the %alias directive is used, SWIG doesn't need to generate all of the wrapper code that's usually associated with added methods like our MyArray::size() example.

    Note that the %alias directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.4.2 Predicate Methods

    Ruby methods that return a boolean value and end in a question mark are known as predicate methods. Examples of predicate methods in standard Ruby classes include Array#empty? (which returns true for an array containing no elements) and Object#instance_of? (which returns true if the object is an instance of the specified class). For consistency with Ruby conventions, methods that return boolean values should be marked as predicate methods.

    One cumbersome solution to this problem is to rename the method (using SWIG's %rename directive) and provide a custom typemap that converts the function's actual return type to Ruby's true or false. For example:

    %rename("is_it_safe?") is_it_safe();
    
    %typemap(out) int is_it_safe "$result = ($1 != 0) ? Qtrue : Qfalse;";
    
    int is_it_safe();

    A better solution is to use the %predicate directive (unique to SWIG's Ruby module) to designate a method as a predicate method. For the previous example, this would look like:

    %predicate is_it_safe();
    
    int is_it_safe();

    This method would be invoked from Ruby code like this:

    irb(main):001:0> Example::is_it_safe?
    true

    The %predicate directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.4.3 Bang Methods

    Ruby methods that modify an object in-place and end in an exclamation mark are known as bang methods. An example of a bang method is Array#sort! which changes the ordering of items in an array. Contrast this with Array#sort, which returns a copy of the array with the items sorted instead of modifying the original array. For consistency with Ruby conventions, methods that modify objects in place should be marked as bang methods.

    Bang methods can be marked using the %bang directive which is unique to the Ruby module and was introduced in SWIG 1.3.28. For example:

    %bang sort(int arr[]);
    
    int sort(int arr[]); 

    This method would be invoked from Ruby code like this:

    irb(main):001:0> Example::sort!(arr)

    The %bang directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.4.4 Getters and Setters

    Often times a C++ library will expose properties through getter and setter methods. For example:

    class Foo {
      Foo() {}
      int getValue() { return value_; }
      void setValue(int value) { value_ = value; }
    
    private:
      int value_;
    };

    By default, SWIG will expose these methods to Ruby as get_value and set_value. However, it more natural for these methods to be exposed in Ruby as value and value=. That allows the methods to be used like this:

    irb(main):001:0> foo = Foo.new()
    irb(main):002:0> foo.value = 5
    irb(main):003:0> puts foo.value

    This can be done by using the %rename directive:

    %rename("value") Foo::getValue();
    %rename("value=") Foo::setValue(int value);

    34.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }

    or

    int sub(int *x, int *y) {
      return *x-*y;
    }

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module Example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int sub(int *INPUT, int *INPUT);

    In Ruby, this allows you to pass simple values. For example:

    a = Example.add(3, 4)
    puts a
    7
    b = Example.sub(7, 4)
    puts b
    3

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module Example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT { int *x, int *y};
    
    void add(int x, int y, int *result);
    int sub(int *x, int *y);

    If a function mutates one of its parameters like this,

    void negate(int *x) {
     *x = -(*x);
    }

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);

    In Ruby, a mutated parameter shows up as a return value. For example:

    a = Example.negate(3)
    print a
    -3

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, success code, and error_code */
    int send_message(char *text, int *success, int *error_code);

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    ...
    int send_message(char *, int *OUTPUT, int *OUTPUT);

    When used in Ruby, the function will return an array of multiple values.

    bytes, success, error_code = send_message("Hello World")
    if not success
      print "error #{error_code} : in send_message"
    else
      print "Sent", bytes
    end

    Another way to access multiple return values is to use the %apply rule. In the following example, the parameters rows and columns are related to SWIG as OUTPUT values through the use of %apply

    %module Example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, int*columns);

    In Ruby:

    r, c = Example.get_dimensions(m)

    34.6 Exception handling

    34.6.1 Using the %exception directive

    The SWIG %exception directive can be used to define a user-definable exception handler that can convert C/C++ errors into Ruby exceptions. The chapter on Customization Features contains more details, but suppose you have a C++ class like the following :

    class DoubleArray {
    private:
      int n;
      double *ptr;
    public:
      // Create a new array of fixed size
      DoubleArray(int size) {
        ptr = new double[size];
        n = size;
      }
     
      // Destroy an array
      ~DoubleArray() {
        delete ptr;
      } 
     
      // Return the length of the array
      int length() {
        return n;
      }
     
      // Get an array item and perform bounds checking.
      double getitem(int i) {
        if ((i >= 0) && (i < n))
          return ptr[i];
        else
          throw RangeError();
      }
     
      // Set an array item and perform bounds checking.
      void setitem(int i, double val) {
        if ((i >= 0) && (i < n))
          ptr[i] = val;
        else {
          throw RangeError();
        }
      }
    };

    Since several methods in this class can throw an exception for an out-of-bounds access, you might want to catch this in the Ruby extension by writing the following in an interface file:

    %exception {
      try {
        $action
      }
      catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error.");
      }
    }
    
    class DoubleArray {
      ...
    };

    The exception handling code is inserted directly into generated wrapper functions. When an exception handler is defined, errors can be caught and used to gracefully raise a Ruby exception instead of forcing the entire program to terminate with an uncaught error.

    As shown, the exception handling code will be added to every wrapper function. Because this is somewhat inefficient, you might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      } catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error in getitem.");
      }
    }
     
    %exception setitem {
      try {
        $action
      } catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error in setitem.");
      }
    }

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on Customization Features for more examples.

    34.6.2 Handling Ruby Blocks

    One of the highlights of Ruby and most of its standard library is the use of blocks, which allow the easy creation of continuations and other niceties. Blocks in ruby are also often used to simplify the passing of many arguments to a class.

    In order to make your class constructor support blocks, you can take advantage of the %exception directive, which will get run after the C++ class' constructor was called.

    For example, this yields the class over after its construction:

    class Window
    {
    public:
      Window(int x, int y, int w, int h);
      // .... other methods here ....
    };
    
    // Add support for yielding self in the Class' constructor.
    %exception Window::Window {
      $action
      if (rb_block_given_p()) {
        rb_yield(self);
      }
    }

    Then, in ruby, it can be used like:

    Window.new(0, 0, 360, 480) { |w|
      w.color = Fltk::RED
      w.border = false
    }
    

    For other methods, you can usually use a dummy parameter with a special in typemap, like:

    //
    // original function was:
    //
    // void func(int x);
    
    %typemap(in, numinputs=0) int RUBY_YIELD_SELF {
      if ( !rb_block_given_p() )
        rb_raise("No block given");
      return rb_yield(self);
    }
    
    %extend {
      void func(int x, int RUBY_YIELD_SELF );
    }
    

    For more information on typemaps, see Typemaps.

    34.6.3 Raising exceptions

    There are three ways to raise exceptions from C++ code to Ruby.

    The first way is to use SWIG_exception(int code, const char *msg). The following table shows the mappings from SWIG error codes to Ruby exceptions:

    SWIG_MemoryError
    rb_eNoMemError
    SWIG_IOError
    rb_eIOError
    SWIG_RuntimeError
    rb_eRuntimeError
    SWIG_IndexError
    rb_eIndexError
    SWIG_TypeError
    rb_eTypeError
    SWIG_DivisionByZero
    rb_eZeroDivError
    SWIG_OverflowError
    rb_eRangeError
    SWIG_SyntaxError
    rb_eSyntaxError
    SWIG_ValueError
    rb_eArgError
    SWIG_SystemError
    rb_eFatal
    SWIG_AttributeError
    rb_eRuntimeError
    SWIG_NullReferenceError
    rb_eNullReferenceError*
    SWIG_ObjectPreviouslyDeletedError
    rb_eObjectPreviouslyDeleted*
    SWIG_UnknownError
    rb_eRuntimeError
    * These error classes are created by SWIG and are not built-in Ruby exception classes

    The second way to raise errors is to use SWIG_Raise(obj, type, desc). Obj is a C++ instance of an exception class, type is a string specifying the type of exception (for example, "MyError") and desc is the SWIG description of the exception class. For example:

    %raise(SWIG_NewPointerObj(e, SWIGTYPE_p_AssertionFailedException, 0), ":AssertionFailedException", SWIGTYPE_p_AssertionFailedException);
    

    This is useful when you want to pass the current exception object directly to Ruby, particularly when the object is an instance of class marked as an %exceptionclass (see the next section for more information).

    Last, you can raise an exception by directly calling Ruby's C api. This is done by invoking the rb_raise() function. The first argument passed to rb_raise() is the exception type. You can raise a custom exception type or one of the built-in Ruby exception types.

    34.6.4 Exception classes

    Starting with SWIG 1.3.28, the Ruby module supports the %exceptionclass directive, which is used to identify C++ classes that are used as exceptions. Classes that are marked with the %exceptionclass directive are exposed in Ruby as child classes of rb_eRuntimeError. This allows C++ exceptions to be directly mapped to Ruby exceptions, providing for a more natural integration between C++ code and Ruby code.

    %exceptionclass CustomError;
    
    %inline %{
      class CustomError { };
    
      class Foo { 
      public:
        void test() { throw CustomError; }
      };
    %}

    From Ruby you can now call this method like this:

    foo = Foo.new
    begin
      foo.test()
    rescue CustomError => e
      puts "Caught custom error"
    end 

    For another example look at swig/Examples/ruby/exception_class.

    34.7 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Ruby C API as well as the material in the "Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Ruby interface.

    34.7.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. The general form of this declaration is as follows ( parts enclosed in [...] are optional ):

    %typemap( method [, modifiers...] ) typelist code;
    

    method is a simply a name that specifies what kind of typemap is being defined. It is usually a name like "in", "out", or "argout" (or its director variations). The purpose of these methods is described later.

    modifiers is an optional comma separated list of name="value" values. These are sometimes to attach extra information to a typemap and is often target-language dependent.

    typelist is a list of the C++ type patterns that the typemap will match. The general form of this list is as follows:

    typelist : typepattern [, typepattern, typepattern, ... ] ;
    
    typepattern : type [ (parms) ]
      | type name [ (parms) ]
      | ( typelist ) [ (parms) ]

    Each type pattern is either a simple type, a simple type and argument name, or a list of types in the case of multi-argument typemaps. In addition, each type pattern can be parameterized with a list of temporary variables (parms). The purpose of these variables will be explained shortly.

    code specifies the C code used in the typemap. It can take any one of the following forms:

    code : { ... }
      | " ... "
      | %{ ... %}

    For example, to convert integers from Ruby to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) NUM2INT($input);
      printf("Received an integer : %d\n", $1);
    }
    
    %inline %{
      extern int fact(int n);
    %}

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variables prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input Ruby object.

    When this example is compiled into a Ruby module, the following sample code:

    require 'example'
    
    puts Example.fact(6)

    prints the result:

    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int n {
      $1 = (int) NUM2INT($input);
      printf("n = %d\n", $1);
    }
    
    %inline %{
      extern int fact(int n);
    %}

    In this case, the typemap code is only attached to arguments that exactly match "int n".

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) NUM2INT($input);
      printf("n = %d\n", $1);
    }
    
    typedef int Integer;
    extern int fact(Integer n); // Above typemap is applied

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = StringValuePtr($input);
      $2 = (int) RSTRING($input)->len;
    };
    
    int count(char c, char *str, int len);

    When a multi-argument typemap is defined, the arguments are always handled as a single Ruby object. This allows the function count to be used as follows (notice how the length parameter is omitted):

    puts Example.count('o', 'Hello World')
    2

    34.7.2 Typemap scope

    Once defined, a typemap remains in effect for all of the declarations that follow. A typemap may be redefined for different sections of an input file. For example:

    // typemap1
    %typemap(in) int {
      ...
    }
    
    int fact(int); // typemap1
    int gcd(int x, int y); // typemap1
    
    // typemap2
    %typemap(in) int {
      ...
    }
    
    int isprime(int); // typemap2

    One exception to the typemap scoping rules pertains to the %extend declaration. %extend is used to attach new declarations to a class or structure definition. Because of this, all of the declarations in an %extend block are subject to the typemap rules that are in effect at the point where the class itself is defined. For example:

    class Foo {
      ...
    };
    
    %typemap(in) int {
      ...
    }
    
    %extend Foo {
      int blah(int x); // typemap has no effect. Declaration is attached to Foo which 
      // appears before the %typemap declaration.
    };

    34.7.3 Copying a typemap

    A typemap is copied by using assignment. For example:

    %typemap(in) Integer = int;

    or this:

    %typemap(in) Integer, Number, int32_t = int;

    Types are often managed by a collection of different typemaps. For example:

    %typemap(in) int { ... }
    %typemap(out) int { ... }
    %typemap(varin) int { ... }
    %typemap(varout) int { ... }

    To copy all of these typemaps to a new type, use %apply. For example:

    %apply int { Integer }; // Copy all int typemaps to Integer
    %apply int { Integer, Number }; // Copy all int typemaps to both Integer and Number

    The patterns for %apply follow the same rules as for %typemap. For example:

    %apply int *output { Integer *output }; // Typemap with name
    %apply (char *buf, int len) { (char *buffer, int size) }; // Multiple arguments

    34.7.4 Deleting a typemap

    A typemap can be deleted by simply defining no code. For example:

    %typemap(in) int; // Clears typemap for int
    %typemap(in) int, long, short; // Clears typemap for int, long, short
    %typemap(in) int *output; 

    The %clear directive clears all typemaps for a given type. For example:

    %clear int; // Removes all types for int
    %clear int *output, long *output;

    Note: Since SWIG's default behavior is defined by typemaps, clearing a fundamental type like int will make that type unusable unless you also define a new set of typemaps immediately after the clear operation.

    34.7.5 Placement of typemaps

    Typemap declarations can be declared in the global scope, within a C++ namespace, and within a C++ class. For example:

    %typemap(in) int {
      ...
    }
    
    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    
    class Bar {
    public:
      typedef const int & const_reference;
      %typemap(out) const_reference {
        ...
      }
    };

    When a typemap appears inside a namespace or class, it stays in effect until the end of the SWIG input (just like before). However, the typemap takes the local scope into account. Therefore, this code

    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }

    is really defining a typemap for the type std::string. You could have code like this:

    namespace std {
      class string;
      %typemap(in) string { /* std::string */
      ...
      }
    }
    
    namespace Foo {
      class string;
      %typemap(in) string { /* Foo::string */
      ...
      }
    }

    In this case, there are two completely distinct typemaps that apply to two completely different types (std::string and Foo::string).

    It should be noted that for scoping to work, SWIG has to know that string is a typename defined within a particular namespace. In this example, this is done using the class declaration class string .

    34.7.6 Ruby typemaps

    The following list details all of the typemap methods that can be used by the Ruby module:

    34.7.6.1 "in" typemap

    Converts Ruby objects to input function arguments. For example:

    %typemap(in) int {
      $1 = NUM2INT($input);
    }

    The following special variables are available:

    $input Input object holding value to be converted.
    $symname Name of function/method being wrapped
    $1...n Argument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.

    This is probably the most commonly redefined typemap because it can be used to implement customized conversions.

    In addition, the "in" typemap allows the number of converted arguments to be specified. For example:

    // Ignored argument.
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }

    At this time, only zero or one arguments may be converted.

    34.7.6.2 "typecheck" typemap

    The "typecheck" typemap is used to support overloaded functions and methods. It merely checks an argument to see whether or not it matches a specific type. For example:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_INTEGER) int {
      $1 = FIXNUM_P($input) ? 1 : 0;
    }

    For typechecking, the $1 variable is always a simple integer that is set to 1 or 0 depending on whether or not the input argument is the correct type.

    If you define new "in" typemaps and your program uses overloaded methods, you should also define a collection of "typecheck" typemaps. More details about this follow in a later section on "Typemaps and Overloading."

    34.7.6.3 "out" typemap

    Converts return value of a C function to a Ruby object.

    %typemap(out) int {
      $result = INT2NUM( $1 );
    }
    

    The following special variables are available.

    $result Result object returned to target language.
    $symname Name of function/method being wrapped
    $1...n Argument being wrapped
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.

    34.7.6.4 "arginit" typemap

    The "arginit" typemap is used to set the initial value of a function argument--before any conversion has occurred. This is not normally necessary, but might be useful in highly specialized applications. For example:

    // Set argument to NULL before any conversion occurs
    %typemap(arginit) int *data {
      $1 = NULL;
    }

    34.7.6.5 "default" typemap

    The "default" typemap is used to turn an argument into a default argument. For example:

    %typemap(default) int flags {
      $1 = DEFAULT_FLAGS;
    }
    ...
    int foo(int x, int y, int flags);

    The primary use of this typemap is to either change the wrapping of default arguments or specify a default argument in a language where they aren't supported (like C). Target languages that do not support optional arguments, such as Java and C#, effectively ignore the value specified by this typemap as all arguments must be given.

    Once a default typemap has been applied to an argument, all arguments that follow must have default values. See the Default/optional arguments section for further information on default argument wrapping.

    34.7.6.6 "check" typemap

    The "check" typemap is used to supply value checking code during argument conversion. The typemap is applied after arguments have been converted. For example:

    %typemap(check) int positive {
      if ($1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected positive value.");
      }
    }

    34.7.6.7 "argout" typemap

    The "argout" typemap is used to return values from arguments. This is most commonly used to write wrappers for C/C++ functions that need to return multiple values. The "argout" typemap is almost always combined with an "in" typemap---possibly to ignore the input value. For example:

    /* Set the input argument to point to a temporary variable */
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    
    %typemap(argout, fragment="output_helper") int *out {
      // Append output value $1 to $result (assuming a single integer in this case)
      $result = output_helper( $result, INT2NUM(*$1) );
    }

    The following special variables are available.

    $result Result object returned to target language.
    $input The original input object passed.
    $symname Name of function/method being wrapped.

    The code supplied to the "argout" typemap is always placed after the "out" typemap. If multiple return values are used, the extra return values are often appended to return value of the function.

    Output helper is a fragment that usually defines a macro to some function like SWIG_Ruby_AppendOutput.

    See the typemaps.i library for examples.

    34.7.6.8 "freearg" typemap

    The "freearg" typemap is used to cleanup argument data. It is only used when an argument might have allocated resources that need to be cleaned up when the wrapper function exits. The "freearg" typemap usually cleans up argument resources allocated by the "in" typemap. For example:

    // Get a list of integers
    %typemap(in) int *items {
      int nitems = Length($input); 
      $1 = (int *) malloc(sizeof(int)*nitems);
    }
    // Free the list 
    %typemap(freearg) int *items {
      free($1);
    }

    The "freearg" typemap inserted at the end of the wrapper function, just before control is returned back to the target language. This code is also placed into a special variable $cleanup that may be used in other typemaps whenever a wrapper function needs to abort prematurely.

    34.7.6.9 "newfree" typemap

    The "newfree" typemap is used in conjunction with the %newobject directive and is used to deallocate memory used by the return result of a function. For example:

    %typemap(newfree) string * {
      delete $1;
    }
    %typemap(out) string * {
      $result = PyString_FromString($1->c_str());
    }
    ...
    
    %newobject foo;
    ...
    string *foo();

    See Object ownership and %newobject for further details.

    34.7.6.10 "memberin" typemap

    The "memberin" typemap is used to copy data from an already converted input value into a structure member. It is typically used to handle array members and other special cases. For example:

    %typemap(memberin) int [4] {
      memmove($1, $input, 4*sizeof(int));
    }

    It is rarely necessary to write "memberin" typemaps---SWIG already provides a default implementation for arrays, strings, and other objects.

    34.7.6.11 "varin" typemap

    The "varin" typemap is used to convert objects in the target language to C for the purposes of assigning to a C/C++ global variable. This is implementation specific.

    34.7.6.12 "varout" typemap

    The "varout" typemap is used to convert a C/C++ object to an object in the target language when reading a C/C++ global variable. This is implementation specific.

    34.7.6.13 "throws" typemap

    The "throws" typemap is only used when SWIG parses a C++ method with an exception specification or has the %catches feature attached to the method. It provides a default mechanism for handling C++ methods that have declared the exceptions they will throw. The purpose of this typemap is to convert a C++ exception into an error or exception in the target language. It is slightly different to the other typemaps as it is based around the exception type rather than the type of a parameter or variable. For example:

    %typemap(throws) const char * %{
      rb_raise(rb_eRuntimeError, $1);
      SWIG_fail;
    %}
    void bar() throw (const char *);

    As can be seen from the generated code below, SWIG generates an exception handler with the catch block comprising the "throws" typemap content.

    ...
    try {
      bar();
    }
    catch(char const *_e) {
      rb_raise(rb_eRuntimeError, _e);
      SWIG_fail;
    }
    ...

    Note that if your methods do not have an exception specification yet they do throw exceptions, SWIG cannot know how to deal with them. For a neat way to handle these, see the Exception handling with %exception section.

    34.7.6.14 directorin typemap

    Converts C++ objects in director member functions to ruby objects. It is roughly the opposite of the "in" typemap, making its typemap rule often similar to the "out" typemap.

    %typemap(directorin) int {
      $result = INT2NUM($1);
    }
    

    The following special variables are available.

    $result Result object returned to target language.
    $symname Name of function/method being wrapped
    $1...n Argument being wrapped
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.
    this C++ this, referring to the class itself.

    34.7.6.15 directorout typemap

    Converts Ruby objects in director member functions to C++ objects. It is roughly the opposite of the "out" typemap, making its rule often similar to the "in" typemap.

    %typemap(directorout) int {
      $result = NUM2INT($1);
    }
    

    The following special variables are available:

    $input Ruby object being sent to the function
    $symname Name of function/method being wrapped
    $1...n Argument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.
    this C++ this, referring to the class itself.

    Currently, the directorout nor the out typemap support the option numoutputs, but the Ruby module provides that functionality through a %feature directive. Thus, a function can be made to return "nothing" if you do:

    %feature("numoutputs", "0") MyClass::function;
    

    This feature can be useful if a function returns a status code, which you want to discard but still use the typemap to raise an exception.

    34.7.6.16 directorargout typemap

    Output argument processing in director member functions.

    %typemap(directorargout,
    fragment="output_helper") int {
      $result = output_helper( $result, NUM2INT($1) );
    }
    

    The following special variables are available:

    $result Result that the director function returns
    $input Ruby object being sent to the function
    $symname name of the function/method being wrapped
    $1...n Argument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap
    $1_ltype The assignable version of the C datatype matched by the typemap
    this C++ this, referring to the instance of the class itself

    34.7.6.17 ret typemap

    Cleanup of function return values

    34.7.6.18 globalin typemap

    Setting of C global variables

    34.7.7 Typemap variables

    Within a typemap, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the "Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that is supposed to hold an argument value. For output values, this is the raw result that is supposed to be returned to Ruby.

    $input

    A VALUE holding a raw Ruby object with an argument or variable value.

    $result

    A VALUE that holds the result to be returned to Ruby.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Ruby name of the wrapper function being created.

    34.7.8 Useful Functions

    When you write a typemap, you usually have to work directly with Ruby objects. The following functions may prove to be useful. (These functions plus many more can be found in Programming Ruby book, by David Thomas and Andrew Hunt.)

    In addition, we list equivalent functions that SWIG defines, which provide a language neutral conversion (these functions are defined for each swig language supported). If you are trying to create a swig file that will work under multiple languages, it is recommended you stick to the swig functions instead of the native Ruby functions. That should help you avoid having to rewrite a lot of typemaps across multiple languages.

    34.7.8.1 C Datatypes to Ruby Objects

    RUBY SWIG
    INT2NUM(long or int) SWIG_From_int(int x) int to Fixnum or Bignum
    INT2FIX(long or int) int to Fixnum (faster than INT2NUM)
    CHR2FIX(char) SWIG_From_char(char x) char to Fixnum
    rb_str_new2(char*) SWIG_FromCharPtrAndSize(char*, size_t) char* to String
    rb_float_new(double) SWIG_From_double(double),
    SWIG_From_float(float)
    float/double to Float

    34.7.8.2 Ruby Objects to C Datatypes

    Here, while the Ruby versions return the value directly, the SWIG versions do not, but return a status value to indicate success (SWIG_OK). While more awkward to use, this allows you to write typemaps that report more helpful error messages, like:

    %typemap(in) size_t (int ok)
      ok = SWIG_AsVal_size_t($input, &$1);
      if (!SWIG_IsOK(ok)) {
        SWIG_exception_fail(SWIG_ArgError(ok), Ruby_Format_TypeError( "$1_name", "$1_type", "$symname", $argnum, $input));
      }
    }
    
    int NUM2INT(Numeric) SWIG_AsVal_int(VALUE, int*)
    int FIX2INT(Numeric) SWIG_AsVal_int(VALUE, int*)
    unsigned int NUM2UINT(Numeric) SWIG_AsVal_unsigned_SS_int(VALUE, int*)
    unsigned int FIX2UINT(Numeric) SWIG_AsVal_unsigned_SS_int(VALUE, int*)
    long NUM2LONG(Numeric) SWIG_AsVal_long(VALUE, long*)
    long FIX2LONG(Numeric) SWIG_AsVal_long(VALUE, long*)
    unsigned long FIX2ULONG(Numeric) SWIG_AsVal_unsigned_SS_long(VALUE, unsigned long*)
    char NUM2CHR(Numeric or String) SWIG_AsVal_char(VALUE, int*)
    char * StringValuePtr(String) SWIG_AsCharPtrAndSize(VALUE, char*, size_t, int* alloc)
    char * rb_str2cstr(String, int*length)
    double NUM2DBL(Numeric) (double) SWIG_AsVal_int(VALUE) or similar

    34.7.8.3 Macros for VALUE

    RSTRING_LEN(str)

    length of the Ruby string

    RSTRING_PTR(str)

    pointer to string storage

    RARRAY_LEN(arr)

    length of the Ruby array

    RARRAY(arr)->capa

    capacity of the Ruby array

    RARRAY_PTR(arr)

    pointer to array storage

    34.7.8.4 Exceptions

    void rb_raise(VALUE exception, const char *fmt, ...)

    Raises an exception. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_fatal(const char *fmt, ...)

    Raises a fatal exception, terminating the process. No rescue blocks are called, but ensure blocks will be called. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_bug(const char *fmt, ...)

    Terminates the process immediately -- no handlers of any sort will be called. The given format string fmt and remaining arguments are interpreted as with printf(). You should call this function only if a fatal bug has been exposed.

    void rb_sys_fail(const char *msg)

    Raises a platform-specific exception corresponding to the last known system error, with the given string msg.

    VALUE rb_rescue(VALUE (*body)(VALUE), VALUE args, VALUE(*rescue)(VALUE, VALUE), VALUE rargs)

    Executes body with the given args. If a StandardError exception is raised, then execute rescue with the given rargs.

    VALUE rb_ensure(VALUE(*body)(VALUE), VALUE args, VALUE(*ensure)(VALUE), VALUE eargs)

    Executes body with the given args. Whether or not an exception is raised, execute ensure with the given rargs after body has completed.

    VALUE rb_protect(VALUE (*body)(VALUE), VALUE args, int *result)

    Executes body with the given args and returns nonzero in result if any exception was raised.

    void rb_notimplement()

    Raises a NotImpError exception to indicate that the enclosed function is not implemented yet, or not available on this platform.

    void rb_exit(int status)

    Exits Ruby with the given status. Raises a SystemExit exception and calls registered exit functions and finalizers.

    void rb_warn(const char *fmt, ...)

    Unconditionally issues a warning message to standard error. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_warning(const char *fmt, ...)

    Conditionally issues a warning message to standard error if Ruby was invoked with the -w flag. The given format string fmt and remaining arguments are interpreted as with printf().

    34.7.8.5 Iterators

    void rb_iter_break()

    Breaks out of the enclosing iterator block.

    VALUE rb_each(VALUE obj)

    Invokes the each method of the given obj.

    VALUE rb_yield(VALUE arg)

    Transfers execution to the iterator block in the current context, passing arg as an argument. Multiple values may be passed in an array.

    int rb_block_given_p()

    Returns true if yield would execute a block in the current context; that is, if a code block was passed to the current method and is available to be called.

    VALUE rb_iterate(VALUE (*method)(VALUE), VALUE args, VALUE (*block)(VALUE, VALUE), VALUE arg2)

    Invokes method with argument args and block block. A yield from that method will invoke block with the argument given to yield, and a second argument arg2.

    VALUE rb_catch(const char *tag, VALUE (*proc)(VALUE, VALUE), VALUE value)

    Equivalent to Ruby's catch.

    void rb_throw(const char *tag, VALUE value)

    Equivalent to Ruby's throw.

    34.7.9 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the examples in the Example/ruby directory.

    34.7.10 Converting a Ruby array to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Ruby Array instance to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      /* Get the length of the array */
      int size = RARRAY($input)->len; 
      int i;
      $1 = (char **) malloc((size+1)*sizeof(char *));
      /* Get the first element in memory */
      VALUE *ptr = RARRAY($input)->ptr; 
      for (i=0; i < size; i++, ptr++) {
        /* Convert Ruby Object String to char* */
        $1[i]= StringValuePtr(*ptr); 
      }
      $1[i]=NULL; /* End of list */
    }
    
    // This cleans up the char ** array created before 
    // the function call
    
    %typemap(freearg) char ** {
      free((char *) $1);
    }
    
    // Now a test function
    %inline %{
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    %}

    When this module is compiled, the wrapped C function now operates as follows :

    require 'Argv'
    Argv.print_args(["Dave", "Mike", "Mary", "Jane", "John"])
    argv[0] = Dave
    argv[1] = Mike
    argv[2] = Mary
    argv[3] = Jane
    argv[4] = John

    In the example, two different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function.

    34.7.11 Collecting arguments in a hash

    Ruby's solution to the "keyword arguments" capability of some other languages is to allow the programmer to pass in one or more key-value pairs as arguments to a function. All of those key-value pairs are collected in a single Hash argument that's presented to the function. If it makes sense, you might want to provide similar functionality for your Ruby interface. For example, suppose you'd like to wrap this C function that collects information about people's vital statistics:

    void setVitalStats(const char *person, int nattributes, const char **names, int *values);

    and you'd like to be able to call it from Ruby by passing in an arbitrary number of key-value pairs as inputs, e.g.

    setVitalStats("Fred", 
      'weight' => 270, 
      'age' => 42 
    )

    To make this work, you need to write a typemap that expects a Ruby Hash as its input and somehow extracts the last three arguments (nattributes, names and values) needed by your C function. Let's start with the basics:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
    }
     

    This %typemap directive tells SWIG that we want to match any function declaration that has the specified types and names of arguments somewhere in the argument list. The fact that we specified the argument names (nattributes, names and values) in our typemap is significant; this ensures that SWIG won't try to apply this typemap to other functions it sees that happen to have a similar declaration with different argument names. The arguments that appear in the second set of parentheses (keys_arr, i, key and val) define local variables that our typemap will need.

    Since we expect the input argument to be a Hash, let's next add a check for that:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
    }

    Check_Type() is just a macro (defined in the Ruby header files) that confirms that the input argument is of the correct type; if it isn't, an exception will be raised.

    The next task is to determine how many key-value pairs are present in the hash; we'll assign this number to the first typemap argument ($1). This is a little tricky since the Ruby/C API doesn't provide a public function for querying the size of a hash, but we can get around that by calling the hash's size method directly and converting its result to a C int value:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
    }

    So now we know the number of attributes. Next we need to initialize the second and third typemap arguments (i.e. the two C arrays) to NULL and set the stage for extracting the keys and values from the hash:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
        }
    }

    There are a number of ways we could extract the keys and values from the input hash, but the simplest approach is to first call the hash's keys method (which returns a Ruby array of the keys) and then start looping over the elements in that array:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
          for (i = 0; i < $1; i++) {
          }
        }
    }

    Recall that keys_arr and i are local variables for this typemap. For each element in the keys_arr array, we want to get the key itself, as well as the value corresponding to that key in the hash:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
          for (i = 0; i < $1; i++) {
            key = rb_ary_entry(keys_arr, i);
            val = rb_hash_aref($input, key);
          }
        }
    }

    To be safe, we should again use the Check_Type() macro to confirm that the key is a String and the value is a Fixnum:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
          for (i = 0; i < $1; i++) {
            key = rb_ary_entry(keys_arr, i);
            val = rb_hash_aref($input, key);
            Check_Type(key, T_STRING);
            Check_Type(val, T_FIXNUM);
          }
        }
    }

    Finally, we can convert these Ruby objects into their C equivalents and store them in our local C arrays:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
      Check_Type($input, T_HASH);
      $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
      $2 = NULL;
      $3 = NULL;
      if ($1 > 0) {
        $2 = (char **) malloc($1*sizeof(char *));
        $3 = (int *) malloc($1*sizeof(int));
        keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
        for (i = 0; i < $1; i++) {
          key = rb_ary_entry(keys_arr, i);
          val = rb_hash_aref($input, key);
          Check_Type(key, T_STRING);
          Check_Type(val, T_FIXNUM);
          $2[i] = StringValuePtr(key);
          $3[i] = NUM2INT(val);
        }
      }
    }

    We're not done yet. Since we used malloc() to dynamically allocate the memory used for the names and values arguments, we need to provide a corresponding "freearg" typemap to free that memory so that there is no memory leak. Fortunately, this typemap is a lot easier to write:

    %typemap(freearg) (int nattributes, const char **names, const int *values) {
      free((void *) $2);
      free((void *) $3);
    }

    All of the code for this example, as well as a sample Ruby program that uses the extension, can be found in the Examples/ruby/hashargs directory of the SWIG distribution.

    34.7.12 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. Since there are several ways in which pointers can be represented, the following two functions are used to safely perform this conversion:

    int SWIG_ConvertPtr(VALUE obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Ruby object obj to a C pointer whose address is ptr (i.e. ptr is a pointer to a pointer). The third argument, ty, is a pointer to a SWIG type descriptor structure. If ty is not NULL, that type information is used to validate type compatibility and other aspects of the type conversion. If flags is non-zero, any type errors encountered during this validation result in a Ruby TypeError exception being raised; if flags is zero, such type errors will cause SWIG_ConvertPtr() to return -1 but not raise an exception. If ty is NULL, no type-checking is performed.

    VALUE SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int own)

    Creates a new Ruby pointer object. Here, ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag that indicates whether or not Ruby should take ownership of the pointer (i.e. whether Ruby should free this data when the corresponding Ruby instance is garbage-collected).

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *foo;
    SWIG_ConvertPtr($input, (void **) &foo, SWIGTYPE_p_Foo, 1);
    
    VALUE obj;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 1);
    }

    34.7.12.1 Ruby Datatype Wrapping

    VALUE Data_Wrap_Struct(VALUE class, void (*mark)(void *), void (*free)(void *), void *ptr)

    Given a pointer ptr to some C data, and the two garbage collection routines for this data (mark and free), return a VALUE for the Ruby object.

    VALUE Data_Make_Struct(VALUE class, c-type, void (*mark)(void *), void (*free)(void *), c-type *ptr)

    Allocates a new instance of a C data type c-type, assigns it to the pointer ptr, then wraps that pointer with Data_Wrap_Struct() as above.

    Data_Get_Struct(VALUE obj, c-type, c-type *ptr)

    Retrieves the original C pointer of type c-type from the data object obj and assigns that pointer to ptr.

    34.7.13 Example: STL Vector to Ruby Array

    Another use for macros and type maps is to create a Ruby array from a STL vector of pointers. In essence, copy of all the pointers in the vector into a Ruby array. The use of the macro is to make the typemap so generic that any vector with pointers can use the type map. The following is an example of how to construct this type of macro/typemap and should give insight into constructing similar typemaps for other STL structures:

    %define PTR_VECTOR_TO_RUBY_ARRAY(vectorclassname, classname)
    %typemap(out) vectorclassname &, const vectorclassname & {
      VALUE arr = rb_ary_new2($1->size());
      vectorclassname::iterator i = $1->begin(), iend = $1->end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, *i));
      $result = arr;
    }
    %typemap(out) vectorclassname, const vectorclassname {
      VALUE arr = rb_ary_new2($1.size());
      vectorclassname::iterator i = $1.begin(), iend = $1.end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, *i));
      $result = arr;
    }
    %enddef

    Note, that the "c ## classname.klass" is used in the preprocessor step to determine the actual object from the class name.

    To use the macro with a class Foo, the following is used:

    PTR_VECTOR_TO_RUBY_ARRAY(vector<foo *="">, Foo)

    It is also possible to create a STL vector of Ruby objects:

    %define RUBY_ARRAY_TO_PTR_VECTOR(vectorclassname, classname)
    %typemap(in) vectorclassname &, const vectorclassname & {
      Check_Type($input, T_ARRAY);
      vectorclassname *vec = new vectorclassname;
      int len = RARRAY($input)->len;
      for (int i=0; i!=len; i++) {
        VALUE inst = rb_ary_entry($input, i);
        //The following _should_ work but doesn't on HPUX
        // Check_Type(inst, T_DATA);
        classname *element = NULL;
        Data_Get_Struct(inst, classname, element);
        vec->push_back(element);
      }
      $1 = vec;
    }
    
    %typemap(freearg) vectorclassname &, const vectorclassname & {
      delete $1;
    }
    %enddef

    It is also possible to create a Ruby array from a vector of static data types:

    %define VECTOR_TO_RUBY_ARRAY(vectorclassname, classname)
    %typemap(out) vectorclassname &, const vectorclassname & {
      VALUE arr = rb_ary_new2($1->size()); 
      vectorclassname::iterator i = $1->begin(), iend = $1->end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, &(*i)));
      $result = arr;
    }
    %typemap(out) vectorclassname, const vectorclassname {
      VALUE arr = rb_ary_new2($1.size()); 
      vectorclassname::iterator i = $1.begin(), iend = $1.end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, &(*i)));
      $result = arr;
    }
    %enddef
    Note that this is mostly an example of typemaps. If you want to use the STL with ruby, you are advised to use the standard swig STL library, which does much more than this. Refer to the section called the C++ Standard Template Library.

    34.8 Docstring Features

    Using ri and rdoc web pages in Ruby libraries is a common practice. Given the way that SWIG generates the extensions by default, your users will normally not get any documentation for it, even if they run 'rdoc' on the resulting .c or .cxx file.

    The features described in this section make it easy for you to add rdoc strings to your modules, functions and methods that can then be read by Ruby's rdoc tool to generate html web pages, ri documentation, Windows chm file and an .xml description.

    rdoc can then be run from a console or shell window on a swig generated file.

    For example, to generate html web pages from a C++ file, you'd do:

    $ rdoc -E cxx=c -f html file_wrap.cxx
    

    To generate ri documentation from a c wrap file, you could do:

    $ rdoc -r file_wrap.c
    

    34.8.1 Module docstring

    Ruby allows a docstring at the beginning of the file before any other statements, and it is typically used to give a general description of the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example

    When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus, 
    layout of controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc

    34.8.2 %feature("autodoc")

    Since SWIG does know everything about the function it wraps, it is possible to generate an rdoc containing the parameter types, names and default values. Since Ruby ships with one of the best documentation systems of any language, it makes sense to take advantage of it.

    SWIG's Ruby module provides support for the "autodoc" feature, which when attached to a node in the parse tree will cause an rdoc comment to be generated in the wrapper file that includes the name of the function, parameter names, default values if any, and return type if any. There are also several options for autodoc controlled by the value given to the feature, described below.

    34.8.2.1 %feature("autodoc", "0")

    When the "0" option is given then the types of the parameters will not be included in the autodoc string. For example, given this function prototype:

    %feature("autodoc", "0");
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);

    Then Ruby code like this will be generated:

    function_name(x, y, foo=nil, bar=nil) -> bool
      ...

    34.8.2.2 %feature("autodoc", "1")

    When the "1" option is used then the parameter types will be used in the rdoc string. In addition, an attempt is made to simplify the type name such that it makes more sense to the Ruby user. Pointer, reference and const info is removed, %rename's are evaluated, etc. (This is not always successful, but works most of the time. See the next section for what to do when it doesn't.) Given the example above, then turning on the parameter types with the "1" option will result in rdoc code like this:

    function_name(int x, int y, Foo foo=nil, Bar bar=nil) -> bool
      ...

    34.8.2.3 %feature("autodoc", "2")

    When the "2" option is used then the parameter types will not be used in the rdoc string. However, they will be listed in full after the function. Given the example above, then turning on the parameter types with the "2" option will result in Ruby code like this:

    34.8.2.4 %feature("autodoc", "3")

    When the "3" option is used then the function will be documented using a combination of "1" and "2" above. Given the example above, then turning on the parameter types with the "2" option will result in Ruby code like this:

    function_name(int x, int y, Foo foo=nil, Bar bar=nil) -> bool
    
    Parameters:
            x - int
            y - int
            foo - Foo
            bar - Bar

    34.8.2.5 %feature("autodoc", "docstring")

    Finally, there are times when the automatically generated autodoc string will make no sense for a Ruby programmer, particularly when a typemap is involved. So if you give an explicit value for the autodoc feature then that string will be used in place of the automatically generated string. For example:

    %feature("autodoc", "GetPosition() -> (x, y)") GetPosition;
    void GetPosition(int* OUTPUT, int* OUTPUT);

    34.8.3 %feature("docstring")

    In addition to the autodoc strings described above, you can also attach any arbitrary descriptive text to a node in the parse tree with the "docstring" feature. When the proxy module is generated then any docstring associated with classes, function or methods are output. If an item already has an autodoc string then it is combined with the docstring and they are output together.

    34.9 Advanced Topics

    34.9.1 Operator overloading

    SWIG allows operator overloading with, by using the %extend or %rename commands in SWIG and the following operator names (derived from Python):

    General
    __repr__ inspect
    __str__ to_s
    __cmp__ <=>
    __hash__ hash
    __nonzero__ nonzero?
    Callable
    __call__ call
    Collection
    __len__ length
    __getitem__ []
    __setitem__ []=
    Numeric
    __add__ +
    __sub__ -
    __mul__ *
    __div__ /
    __mod__ %
    __divmod__ divmod
    __pow__ **
    __lshift__ <<
    __rshift__ >>
    __and__ &
    __xor__ ^
    __or__ |
    __neg__ -@
    __pos__ +@
    __abs__ abs
    __invert__ ~
    __int__ to_i
    __float__ to_f
    __coerce__ coerce
    Additions in 1.3.13
    __lt__ <
    __le__ <=
    __eq__ ==
    __gt__ >
    __ge__ >=

    Note that although SWIG supports the __eq__ magic method name for defining an equivalence operator, there is no separate method for handling inequality since Ruby parses the expression a != b as !(a == b).

    34.9.2 Creating Multi-Module Packages

    The chapter on Working with Modules discusses the basics of creating multi-module extensions with SWIG, and in particular the considerations for sharing runtime type information among the different modules.

    As an example, consider one module's interface file (shape.i) that defines our base class:

    %module shape
    
    %{
    #include "Shape.h"
    %}
    
    class Shape {
    protected:
      double xpos;
      double ypos;
    protected:
      Shape(double x, double y);
    public:
      double getX() const;
      double getY() const;
    };

    We also have a separate interface file (circle.i) that defines a derived class:

    %module circle
    
    %{
    #include "Shape.h"
    #include "Circle.h"
    %}
    
    // Import the base class definition from Shape module
    %import shape.i
    
    class Circle : public Shape {
    protected:
      double radius;
    public:
      Circle(double x, double y, double r);
      double getRadius() const;
    };

    We'll start by building the Shape extension module:

    $ swig -c++ -ruby shape.i
    

    SWIG generates a wrapper file named shape_wrap.cxx. To compile this into a dynamically loadable extension for Ruby, prepare an extconf.rb script using this template:

    require 'mkmf'
    
    # Since the SWIG runtime support library for Ruby
    # depends on the Ruby library, make sure it's in the list
    # of libraries.
    $libs = append_library($libs, Config::CONFIG['RUBY_INSTALL_NAME'])
    
    # Create the makefile
    create_makefile('shape')

    Run this script to create a Makefile and then type make to build the shared library:

    $ ruby extconf.rb
    creating Makefile
    $ make
    g++ -fPIC -g -O2 -I. -I/usr/include/ruby-2.1.0 \
    -I. -c shape_wrap.cxx
    gcc -shared -L/usr/local/lib -o shape.so shape_wrap.o -L. \
    -lruby -lruby -lc

    Note that depending on your installation, the outputs may be slightly different; these outputs are those for a Linux-based development environment. The end result should be a shared library (here, shape.so) containing the extension module code. Now repeat this process in a separate directory for the Circle module:

    1. Run SWIG to generate the wrapper code (circle_wrap.cxx);
    2. Write an extconf.rb script that your end-users can use to create a platform-specific Makefile for the extension;
    3. Build the shared library for this extension by typing make.

    Once you've built both of these extension modules, you can test them interactively in IRB to confirm that the Shape and Circle modules are properly loaded and initialized:

    $ irb
    irb(main):001:0> require 'shape'
    true
    irb(main):002:0> require 'circle'
    true
    irb(main):003:0> c = Circle::Circle.new(5, 5, 20)
    #<Circle::Circle:0xa097208>
    irb(main):004:0> c.kind_of? Shape::Shape
    true
    irb(main):005:0> c.getX()
    5.0

    34.9.3 Specifying Mixin Modules

    The Ruby language doesn't support multiple inheritance, but it does allow you to mix one or more modules into a class using Ruby's include method. For example, if you have a Ruby class that defines an each instance method, e.g.

    class Set
      def initialize
      @members = []
      end
     
      def each
      @members.each { |m| yield m }
      end
    end

    then you can mix-in Ruby's Enumerable module to easily add a lot of functionality to your class:

    class Set
      include Enumerable
      def initialize
        @members = []
      end
      def each
        @members.each { |m| yield m }
      end
    end

    To get the same benefit for your SWIG-wrapped classes, you can use the %mixin directive to specify the names of one or more modules that should be mixed-in to a class. For the above example, the SWIG interface specification might look like this:

    %mixin Set "Enumerable";
    
    class Set {
    public:
      // Constructor
      Set();
     
      // Iterates through set members
      void each();
    };

    Multiple modules can be mixed into a class by providing a comma-separated list of module names to the %mixin directive, e.g.

    %mixin Set "Fee, Fi, Fo, Fum";

    Note that the %mixin directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.10 Memory Management

    One of the most common issues in generating SWIG bindings for Ruby is proper memory management. The key to proper memory management is clearly defining whether a wrapper Ruby object owns the underlying C struct or C++ class. There are two possibilities:

    • The Ruby object is responsible for freeing the C struct or C++ object
    • The Ruby object should not free the C struct or C++ object because it will be freed by the underlying C or C++ code

    To complicate matters, object ownership may transfer from Ruby to C++ (or vice versa) depending on what function or methods are invoked. Clearly, developing a SWIG wrapper requires a thorough understanding of how the underlying library manages memory.

    34.10.1 Mark and Sweep Garbage Collector

    Ruby uses a mark and sweep garbage collector. When the garbage collector runs, it finds all the "root" objects, including local variables, global variables, global constants, hardware registers and the C stack. For each root object, the garbage collector sets its mark flag to true and calls rb_gc_mark on the object. The job of rb_gc_mark is to recursively mark all the objects that a Ruby object has a reference to (ignoring those objects that have already been marked). Those objects, in turn, may reference other objects. This process will continue until all active objects have been "marked." After the mark phase comes the sweep phase. In the sweep phase, all objects that have not been marked will be garbage collected.

    The Ruby C/API provides extension developers two hooks into the garbage collector - a "mark" function and a "sweep" function. By default these functions are set to NULL.

    If a C struct or C++ class references any other Ruby objects, then it must provide a "mark" function. The "mark" function should identify any referenced Ruby objects by calling the rb_gc_mark function for each one. Unsurprisingly, this function will be called by the Ruby garbage during the "mark" phase.

    During the sweep phase, Ruby destroys any unused objects. If any memory has been allocated in creating the underlying C struct or C++ struct, then a "free" function must be defined that deallocates this memory.

    34.10.2 Object Ownership

    As described above, memory management depends on clearly defining who is responsible for freeing the underlying C struct or C++ class. If the Ruby object is responsible for freeing the C++ object, then a "free" function must be registered for the object. If the Ruby object is not responsible for freeing the underlying memory, then a "free" function must not be registered for the object.

    For the most part, SWIG takes care of memory management issues. The rules it uses are:

    • When calling a C++ object's constructor from Ruby, SWIG will assign a "free" function thereby making the Ruby object responsible for freeing the C++ object
    • When calling a C++ member function that returns a pointer, SWIG will not assign a "free" function thereby making the underlying library responsible for freeing the object.

    To make this clearer, let's look at an example. Assume we have a Foo and a Bar class.

    /* File "RubyOwernshipExample.h" */
    
    class Foo
    {
    public:
      Foo() {}
      ~Foo() {}
    };
    
    class Bar
    {
      Foo *foo_;
    public:
      Bar(): foo_(new Foo) {}
      ~Bar() { delete foo_; }
      Foo* get_foo() { return foo_; }
      Foo* get_new_foo() { return new Foo; }
      void set_foo(Foo *foo) { delete foo_; foo_ = foo; }
    };

    First, consider this Ruby code:

    foo = Foo.new

    In this case, the Ruby code calls the underlying Foo C++ constructor, thus creating a new foo object. By default, SWIG will assign the new Ruby object a "free" function. When the Ruby object is garbage collected, the "free" function will be called. It in turn will call Foo's destructor.

    Next, consider this code:

    bar = Bar.new
    foo = bar.get_foo()

    In this case, the Ruby code calls a C++ member function, get_foo. By default, SWIG will not assign the Ruby object a "free" function. Thus, when the Ruby object is garbage collected the underlying C++ foo object is not affected.

    Unfortunately, the real world is not as simple as the examples above. For example:

    bar = Bar.new
    foo = bar.get_new_foo()

    In this case, the default SWIG behavior for calling member functions is incorrect. The Ruby object should assume ownership of the returned object. This can be done by using the %newobject directive. See Object ownership and %newobject for more information.

    The SWIG default mappings are also incorrect in this case:

    foo = Foo.new
    bar = Bar.new
    bar.set_foo(foo)

    Without modification, this code will cause a segmentation fault. When the Ruby foo object goes out of scope, it will free the underlying C++ foo object. However, when the Ruby bar object goes out of scope, it will call the C++ bar destructor which will also free the C++ foo object. The problem is that object ownership is transferred from the Ruby object to the C++ object when the set_foo method is called. This can be done by using the special DISOWN type map, which was added to the Ruby bindings in SWIG-1.3.26.

    Thus, a correct SWIG interface file correct mapping for these classes is:

    /* File RubyOwnershipExample.i */
    
    %module RubyOwnershipExample
    
    %{
    #include "RubyOwnershipExample.h"
    %}
    
    class Foo
    {
    public:
      Foo();
      ~Foo();
    };
    
    class Bar
    {
      Foo *foo_;
    public:
      Bar();
      ~Bar();
      Foo* get_foo();
    
      %newobject get_new_foo;
      Foo* get_new_foo();
    
      %apply SWIGTYPE *DISOWN {Foo *foo};
      void set_foo(Foo *foo);
      %clear Foo *foo;
    };
    

    This code can be seen in swig/examples/ruby/tracking.

    34.10.3 Object Tracking

    The remaining parts of this section will use the class library shown below to illustrate different memory management techniques. The class library models a zoo and the animals it contains.

    %module zoo
    
    %{
    #include <string>
    #include <vector>
    
    #include "zoo.h"
    %}
    
    class Animal
    {
    private:
      typedef std::vector<Animal*> AnimalsType;
      typedef AnimalsType::iterator IterType;
    protected:
      AnimalsType animals;
    protected:
      std::string name_;
    public:
      // Construct an animal with this name
      Animal(const char* name) : name_(name) {}
     
      // Return the animal's name
      const char* get_name() const { return name.c_str(); }
    };
    
    class Zoo
    {
    protected:
     std::vector<Animal *> animals;
     
    public:
      // Construct an empty zoo
      Zoo() {}
      
      /* Create a new animal. */
      static Animal* Zoo::create_animal(const char* name) {
        return new Animal(name);
      }
     
      // Add a new animal to the zoo
      void add_animal(Animal* animal) {
        animals.push_back(animal); 
      }
     
      Animal* remove_animal(size_t i) {
        Animal* result = this->animals[i];
        IterType iter = this->animals.begin();
        std::advance(iter, i);
        this->animals.erase(iter);
       
        return result;
      }
      
      // Return the number of animals in the zoo
      size_t get_num_animals() const {
        return animals.size(); 
      }
      
      // Return a pointer to the ith animal
      Animal* get_animal(size_t i) const {
        return animals[i]; 
      }
    };

    Let's say you SWIG this code and then run IRB:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be3820>
    
    irb(main):004:0> tiger1.get_name()
    => "tiger1"
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0a60>
    
    irb(main):006:0> zoo.add_animal(tiger)
    => nil
    
    irb(main):007:0> zoo.get_num_animals()
    => 1
    
    irb(main):007:0> tiger2 = zoo.remove_animal(0)
    => #<Example::Animal:0x2bd4a18>
    
    irb(main):008:0> tiger2.get_name()
    => "tiger1"
    
    irb(main):009:0> tiger1.equal?(tiger2)
    => false
    

    Pay particular attention to the code tiger1.equal?(tiger2). Note that the two Ruby objects are not the same - but they reference the same underlying C++ object. This can cause problems. For example:

    irb(main):010:0> tiger1 = nil
    => nil
    
    irb(main):011:0> GC.start
    => nil
    
    irb(main):012:0> tiger2.get_name()
    (irb):12: [BUG] Segmentation fault
    

    After the garbage collector runs, as a result of our call to GC.start, callingtiger2.get_name() causes a segmentation fault. The problem is that when tiger1 is garbage collected, it frees the underlying C++ object. Thus, when tiger2 calls the get_name() method it invokes it on a destroyed object.

    This problem can be avoided if SWIG enforces a one-to-one mapping between Ruby objects and C++ classes. This can be done via the use of the %trackobjects functionality available in SWIG-1.3.26. and later.

    When the %trackobjects is turned on, SWIG automatically keeps track of mappings between C++ objects and Ruby objects. Note that enabling object tracking causes a slight performance degradation. Test results show this degradation to be about 3% to 5% when creating and destroying 100,000 animals in a row.

    Since %trackobjects is implemented as a %feature, it uses the same name matching rules as other kinds of features (see the chapter on "Customization Features") . Thus it can be applied on a class-by-class basis if needed. To fix the example above:

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Tell SWIG that create_animal creates a new object */
    %newobject Zoo::create_animal;
    
    /* Tell SWIG to keep track of mappings between C/C++ structs/classes. */
    %trackobjects;
    
    %include "example.h"

    When this code runs we see:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be37d8>
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0a18>
    
    irb(main):004:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):006:0> tiger2 = zoo.remove_animal(0)
    => #<Example::Animal:0x2be37d8>
    
    irb(main):007:0> tiger1.equal?(tiger2)
    => true
    
    irb(main):008:0> tiger1 = nil
    => nil
    
    irb(main):009:0> GC.start
    => nil
    
    irb(main):010:0> tiger.get_name()
    => "tiger1"
    irb(main):011:0>

    For those who are interested, object tracking is implemented by storing Ruby objects in a hash table and keying them on C++ pointers. The underlying API is:

    static void SWIG_RubyAddTracking(void* ptr, VALUE object);
    static VALUE SWIG_RubyInstanceFor(void* ptr) ;
    static void SWIG_RubyRemoveTracking(void* ptr);
    static void SWIG_RubyUnlinkObjects(void* ptr);

    When an object is created, SWIG will automatically call the SWIG_RubyAddTracking method. Similarly, when an object is deleted, SWIG will call the SWIG_RubyRemoveTracking. When an object is returned to Ruby from C++, SWIG will use the SWIG_RubyInstanceFor method to ensure a one-to-one mapping from Ruby to C++ objects. Last, the RubyUnlinkObjects method unlinks a Ruby object from its underlying C++ object.

    In general, you will only need to use the SWIG_RubyInstanceFor, which is required for implementing mark functions as shown below. However, if you implement your own free functions (see below) you may also have to call the SWIG_RubyRemoveTracking and RubyUnlinkObjects methods.

    34.10.4 Mark Functions

    With a bit more testing, we see that our class library still has problems. For example:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bea6a8>
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be7960>
    
    irb(main):004:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> tiger1 = nil
    => nil
    
    irb(main):007:0> GC.start
    => nil
    
    irb(main):005:0> tiger2 = zoo.get_animal(0)
    (irb):12: [BUG] Segmentation fault

    The problem is that Ruby does not know that the zoo object contains a reference to a Ruby object. Thus, when Ruby garbage collects tiger1 it frees the underlying C++ object.

    This can be fixed by implementing a mark function as described above in the Mark and Sweep Garbage Collector section. You can specify a mark function by using the %markfunc directive. Since the %markfunc directive is implemented using SWIG's' "features" mechanism it uses the same name matching rules as other kinds of features (see the chapter on "Customization Features" for more details).

    A mark function takes a single argument, which is a pointer to the C++ object being marked; it should, in turn, call rb_gc_mark() for any instances that are reachable from the current object. The mark function for our Zoo class should therefore loop over all of the C++ animal objects in the zoo object, look up their Ruby object equivalent, and then call rb_gc_mark(). One possible implementation is:

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Keep track of mappings between C/C++ structs/classes
     and Ruby objects so we can implement a mark function. */
    %trackobjects;
    
    /* Specify the mark function */
    %markfunc Zoo "mark_Zoo";
    
    %include "example.h"
    
    %header %{
    
    static void mark_Zoo(void* ptr) {
      Zoo* zoo = (Zoo*) ptr;
     
      /* Loop over each object and tell the garbage collector
      that we are holding a reference to them. */
      int count = zoo->get_num_animals();
     
      for(int i = 0; i < count; ++i) {
        Animal* animal = zoo->get_animal(i);
        VALUE object = SWIG_RubyInstanceFor(animal);
     
        if (object != Qnil) {
          rb_gc_mark(object);
        }
      }
    }
    %}

    Note the mark function is dependent on the SWIG_RUBY_InstanceFor method, and thus requires that %trackobjects is enabled. For more information, please refer to the ruby_track_objects.i test case in the SWIG test suite.

    When this code is compiled we now see:

    $ irb
    irb(main):002:0> tiger1=Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be3bf8>
    
    irb(main):003:0> Example::Zoo.new()
    => #<Example::Zoo:0x2be1780>
    
    irb(main):004:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2bde9c0>
    
    irb(main):005:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):009:0> tiger1 = nil
    => nil
    
    irb(main):010:0> GC.start
    => nil
    irb(main):014:0> tiger2 = zoo.get_animal(0)
    => #<Example::Animal:0x2be3bf8>
    
    irb(main):015:0> tiger2.get_name()
    => "tiger1"
    irb(main):016:0>

    This code can be seen in swig/examples/ruby/mark_function.

    34.10.5 Free Functions

    By default, SWIG creates a "free" function that is called when a Ruby object is garbage collected. The free function simply calls the C++ object's destructor.

    However, sometimes an appropriate destructor does not exist or special processing needs to be performed before the destructor is called. Therefore, SWIG allows you to manually specify a "free" function via the use of the %freefunc directive. The %freefunc directive is implemented using SWIG's' "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    IMPORTANT ! - If you define your own free function, then you must ensure that you call the underlying C++ object's destructor. In addition, if object tracking is activated for the object's class, you must also call the SWIG_RubyRemoveTracking function (of course call this before you destroy the C++ object). Note that it is harmless to call this method if object tracking if off so it is advised to always call it.

    Note there is a subtle interaction between object ownership and free functions. A custom defined free function will only be called if the Ruby object owns the underlying C++ object. This also to Ruby objects which are created, but then transfer ownership to C++ objects via the use of the disown typemap described above.

    To show how to use the %freefunc directive, let's slightly change our example. Assume that the zoo object is responsible for freeing any animal that it contains. This means that the Zoo::add_animal function should be marked with a DISOWN typemap and the destructor should be updated as below:

    Zoo::~Zoo() {
      IterType iter = this->animals.begin();
      IterType end = this->animals.end();
     
      for(iter; iter != end; ++iter) {
        Animal* animal = *iter;
        delete animal;
      }
    }
    

    When we use these objects in IRB we see:

    $irb
    irb(main):002:0> require 'example'
    => true
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0fe8>
    
    irb(main):005:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bda760>
    
    irb(main):006:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> zoo = nil
    => nil
    
    irb(main):008:0> GC.start
    => nil
    
    irb(main):009:0> tiger1.get_name()
    (irb):12: [BUG] Segmentation fault
    

    The error happens because the C++ animal object is freed when the zoo object is freed. Although this error is unavoidable, we can at least prevent the segmentation fault. To do this requires enabling object tracking and implementing a custom free function that calls the SWIG_RubyUnlinkObjects function for each animal object that is destroyed. The SWIG_RubyUnlinkObjects function notifies SWIG that a Ruby object's underlying C++ object is no longer valid. Once notified, SWIG will intercept any calls from the existing Ruby object to the destroyed C++ object and raise an exception.

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Specify that ownership is transferred to the zoo when calling add_animal */
    %apply SWIGTYPE *DISOWN { Animal* animal };
    
    /* Track objects */
    %trackobjects;
    
    /* Specify the mark function */
    %freefunc Zoo "free_Zoo";
    
    %include "example.h"
    
    %header %{
      static void free_Zoo(void* ptr) {
        Zoo* zoo = (Zoo*) ptr;
    
        /* Loop over each animal */
        int count = zoo->get_num_animals();
    
        for(int i = 0; i < count; ++i) {
          /* Get an animal */
          Animal* animal = zoo->get_animal(i);
    
          /* Unlink the Ruby object from the C++ object */
          SWIG_RubyUnlinkObjects(animal);
    
          /* Now remove the tracking for this animal */
          SWIG_RubyRemoveTracking(animal);
        }
    
        /* Now call SWIG_RubyRemoveTracking for the zoo */
        SWIG_RubyRemoveTracking(ptr);
        /* Now free the zoo which will free the animals it contains */
        delete zoo;
      }
    %} 

    Now when we use these objects in IRB we see:

    $irb
    irb(main):002:0> require 'example'
    => true
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0fe8>
    
    irb(main):005:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bda760>
    
    irb(main):006:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> zoo = nil
    => nil
    
    irb(main):008:0> GC.start
    => nil
    
    irb(main):009:0> tiger1.get_name()
    RuntimeError: This Animal * already released
     from (irb):10:in `get_name'
     from (irb):10
    irb(main):011:0>

    Notice that SWIG can now detect the underlying C++ object has been freed, and thus raises a runtime exception.

    This code can be seen in swig/examples/ruby/free_function.

    34.10.6 Embedded Ruby and the C++ Stack

    As has been said, the Ruby GC runs and marks objects before its sweep phase. When the garbage collector is called, it will also try to mark any Ruby objects (VALUE) it finds in the machine registers and in the C++ stack.

    The stack is basically the history of the functions that have been called and also contains local variables, such as the ones you define whenever you do inside a function:

    VALUE obj;

    For ruby to determine where its stack space begins, during initialization a normal Ruby interpreter will call the ruby_init() function which in turn will call a function called Init_stack or similar. This function will store a pointer to the location where the stack points at that point in time.

    ruby_init() is presumed to always be called within the main() function of your program and whenever the GC is called, ruby will assume that the memory between the current location in memory and the pointer that was stored previously represents the stack, which may contain local (and temporary) VALUE ruby objects. Ruby will then be careful not to remove any of those objects in that location.

    So far so good. For a normal Ruby session, all the above is completely transparent and magic to the extensions developer.

    However, with an embedded Ruby, it may not always be possible to modify main() to make sure ruby_init() is called there. As such, ruby_init() will likely end up being called from within some other function. This can lead Ruby to measure incorrectly where the stack begins and can result in Ruby incorrectly collecting those temporary VALUE objects that are created once another function is called. The end result: random crashes and segmentation faults.

    This problem will often be seen in director functions that are used for callbacks, for example.

    To solve the problem, SWIG can now generate code with director functions containing the optional macros SWIG_INIT_STACK and SWIG_RELEASE_STACK. These macros will try to force Ruby to reinitialize the beginning of the stack the first time a director function is called. This will lead Ruby to measure and not collect any VALUE objects defined from that point on.

    To mark functions to either reset the ruby stack or not, you can use:

    %initstack Class::memberfunction;   // only re-init the stack in this director method
    %ignorestack Class::memberfunction; // do not re-init the stack in this director method
    %initstack Class;                   // init the stack on all the methods of this class
    %initstack;                         // all director functions will re-init the stack
    
    swig-4.0.2/Doc/Manual/Guile.html0000644000175000017500000007764413667507563016265 0ustar williamwilliam SWIG and Guile

    25 SWIG and Guile

    This section details guile-specific support in SWIG.

    25.1 Supported Guile Versions

    SWIG works with Guile versions 1.8.x and 2.0.x. Support for version 1.6.x has been dropped. The last version of SWIG that still works with Guile version 1.6.x is SWIG 2.0.9.

    Note that starting with guile 2.0, the guile sources can be compiled for improved performance. This is currently not tested with swig so your mileage may vary. To be safe set environment variable GUILE_AUTO_COMPILE to 0 when using swig generated guile code.

    25.2 Meaning of "Module"

    There are three different concepts of "module" involved, defined separately for SWIG, Guile, and Libtool. To avoid horrible confusion, we explicitly prefix the context, e.g., "guile-module".

    25.3 Old GH Guile API

    Guile 1.8 and older could be interfaced using two different api's, the SCM or the GH API. The GH interface to guile is deprecated. Read more about why in the Guile manual.

    Support for the guile GH wrapper code generation has been dropped from SWIG. The last version of SWIG that can still generate guile GH wrapper code is 2.0.9. Please use that version if you really need the GH wrapper code.

    25.4 Linkage

    Guile support is complicated by a lack of user community cohesiveness, which manifests in multiple shared-library usage conventions. A set of policies implementing a usage convention is called a linkage.

    25.4.1 Simple Linkage

    The default linkage is the simplest; nothing special is done. In this case the function SWIG_init() is exported. Simple linkage can be used in several ways:

    • Embedded Guile, no modules. You want to embed a Guile interpreter into your program; all bindings made by SWIG shall show up in the root module. Then call SWIG_init() in the inner_main() function. See the "simple" and "matrix" examples under Examples/guile.
    • Dynamic module mix-in. You want to create a Guile module using define-module, containing both Scheme code and bindings made by SWIG; you want to load the SWIG modules as shared libraries into Guile.

      (define-module (my module))
      (define my-so (dynamic-link "./libexample.so"))
      (dynamic-call "SWIG_init" my-so) ; make SWIG bindings
      ;; Scheme definitions can go here
      

      Newer Guile versions provide a shorthand for dynamic-link and dynamic-call:

      (load-extension "./libexample.so" "SWIG_init")
      

      A more portable approach would be to drop the shared library extension:

      (load-extension "./libexample" "SWIG_init")
      

      You need to explicitly export those bindings made by SWIG that you want to import into other modules:

      (export foo bar)
      

      In this example, the procedures foo and bar would be exported. Alternatively, you can export all bindings with the following module-system hack:

      (module-map (lambda (sym var)
                    (module-export! (current-module) (list sym)))
                  (current-module))
      

      SWIG can also generate this Scheme stub (from define-module up to export) semi-automagically if you pass it the command-line argument -scmstub. The code will be exported in a file called module.scm in the directory specified by -outdir or the current directory if -outdir is not specified. Since SWIG doesn't know how to load your extension module (with dynamic-link or load-extension), you need to supply this information by including a directive like this in the interface file:

      %scheme %{ (load-extension "./libexample.so" "SWIG_init") %}
      

      (The %scheme directive allows to insert arbitrary Scheme code into the generated file module.scm; it is placed between the define-module form and the export form.)

    If you want to include several SWIG modules, you would need to rename SWIG_init via a preprocessor define to avoid symbol clashes. For this case, however, passive linkage is available.

    25.4.2 Passive Linkage

    Passive linkage is just like simple linkage, but it generates an initialization function whose name is derived from the module and package name (see below).

    You should use passive linkage rather than simple linkage when you are using multiple modules.

    25.4.3 Native Guile Module Linkage

    SWIG can also generate wrapper code that does all the Guile module declarations on its own if you pass it the -Linkage module command-line option.

    The module name is set with the -package and -module command-line options. Suppose you want to define a module with name (my lib foo); then you would have to pass the options -package my/lib -module foo. Note that the last part of the name can also be set via the SWIG directive %module.

    You can use this linkage in several ways:

    • Embedded Guile with SWIG modules. You want to embed a Guile interpreter into your program; the SWIG bindings shall be put into different modules. Simply call the function scm_init_my_modules_foo_module in the inner_main() function.
    • Dynamic Guile modules. You want to load the SWIG modules as shared libraries into Guile; all bindings are automatically put in newly created Guile modules.
      (define my-so (dynamic-link "./libfoo"))
      ;; create new module and put bindings there:
      (dynamic-call "scm_init_my_modules_foo_module" my-so) 
      
      Newer Guile versions have a shorthand procedure for this:
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module")
      

    25.4.4 Old Auto-Loading Guile Module Linkage

    Guile used to support an autoloading facility for object-code modules. This support has been marked deprecated in version 1.4.1 and is going to disappear sooner or later. SWIG still supports building auto-loading modules if you pass it the -Linkage ltdlmod command-line option.

    Auto-loading worked like this: Suppose a module with name (my lib foo) is required and not loaded yet. Guile will then search all directories in its search path for a Scheme file my/modules/foo.scm or a shared library my/modules/libfoo.so (or my/modules/libfoo.la; see the GNU libtool documentation). If a shared library is found that contains the symbol scm_init_my_modules_foo_module, the library is loaded, and the function at that symbol is called with no arguments in order to initialize the module.

    When invoked with the -Linkage ltdlmod command-line option, SWIG generates an exported module initialization function with an appropriate name.

    25.4.5 Hobbit4D Linkage

    The only other linkage supported at this time creates shared object libraries suitable for use by hobbit's (hobbit4d link) guile module. This is called the "hobbit" linkage, and requires also using the "-package" command line option to set the part of the module name before the last symbol. For example, both command lines:

    swig -guile -package my/lib foo.i
    swig -guile -package my/lib -module foo foo.i
    

    would create module (my lib foo) (assuming in the first case foo.i declares the module to be "foo"). The installed files are my/lib/libfoo.so.X.Y.Z and friends. This scheme is still very experimental; the (hobbit4d link) conventions are not well understood.

    25.5 Underscore Folding

    Underscores are converted to dashes in identifiers. Guile support may grow an option to inhibit this folding in the future, but no one has complained so far.

    You can use the SWIG directives %name and %rename to specify the Guile name of the wrapped functions and variables (see CHANGES).

    25.6 Typemaps

    The Guile module handles all types via typemaps. This information is read from Lib/guile/typemaps.i. Some non-standard typemap substitutions are supported:

    • $descriptor expands to a type descriptor for use with the SWIG_NewPointerObj() and SWIG_ConvertPtr functions.
    • For pointer types, $*descriptor expands to a descriptor for the direct base type (i.e., one pointer is stripped), whereas $basedescriptor expands to a descriptor for the base type (i.e., all pointers are stripped).

    A function returning void (more precisely, a function whose out typemap returns SCM_UNSPECIFIED) is treated as returning no values. In argout typemaps, one can use the macro GUILE_APPEND_RESULT in order to append a value to the list of function return values.

    Multiple values can be passed up to Scheme in one of three ways:

    • Multiple values as lists. By default, if more than one value is to be returned, a list of the values is created and returned; to switch back to this behavior, use

      %values_as_list;
    • Multiple values as vectors. By issuing

      %values_as_vector;

      vectors instead of lists will be used.

    • Multiple values for multiple-value continuations. This is the most elegant way. By issuing

      %multiple_values;

      multiple values are passed to the multiple-value continuation, as created by call-with-values or the convenience macro receive. The latter is available if you issue (use-modules (srfi srfi-8)). Assuming that your divide function wants to return two values, a quotient and a remainder, you can write:

      (receive (quotient remainder)
          (divide 35 17)
        body...)
      

      In body, the first result of divide will be bound to the variable quotient, and the second result to remainder.

    See also the "multivalue" example.

    Constants are exported as a function that returns the value. The %feature("constasvar") can be applied to any constant, immutable variable, or enum. Instead of exporting the constant as a function that must be called, the constant will appear as a scheme variable. See Features and the %feature directive for info on how to apply the %feature.

    25.7 Representation of pointers as smobs

    For pointer types, SWIG uses Guile smobs. SWIG smobs print like this: #<swig struct xyzzy * 0x1234affe> Two of them are equal? if and only if they have the same type and value.

    To construct a Scheme object from a C pointer, the wrapper code calls the function SWIG_NewPointerObj(), passing a pointer to a struct representing the pointer type. The type index to store in the upper half of the CAR is read from this struct. To get the pointer represented by a smob, the wrapper code calls the function SWIG_ConvertPtr(), passing a pointer to a struct representing the expected pointer type. See also The run-time type checker. If the Scheme object passed was not a SWIG smob representing a compatible pointer, a wrong-type-arg exception is raised.

    25.7.1 Smobs

    In earlier versions of SWIG, C pointers were represented as Scheme strings containing a hexadecimal rendering of the pointer value and a mangled type name. As Guile allows registering user types, so-called "smobs" (small objects), a much cleaner representation has been implemented now. The details will be discussed in the following.

    The whole type system, when it is first initialized, creates two smobs named "swig" and "collected_swig". The swig smob is used for non-garbage collected smobs, while the collected_swig smob is used as described below. Each smob has the same format, which is a double cell created by SCM_NEWSMOB2() The first word of data is the pointer to the object and the second word of data is the swig_type_info * structure describing this type. If a generated GOOPS module has been loaded, smobs will be wrapped by the corresponding GOOPS class.

    25.7.2 Garbage Collection

    Garbage collection is a feature of Guile since version 1.6. As SWIG now requires Guile > 1.8, it is automatically included. Garbage collection works like this. Every swig_type_info structure stores in its clientdata field a pointer to the destructor for this type. The destructor is the generated wrapper around the delete function. So swig still exports a wrapper for the destructor, it just does not call scm_c_define_gsubr() for the wrapped delete function. So the only way to delete an object is from the garbage collector, since the delete function is not available to scripts. How swig determines if a type should be garbage collected is exactly like described in Object ownership and %newobject in the SWIG manual. All typemaps use an $owner var, and the guile module replaces $owner with 0 or 1 depending on feature:new.

    25.8 Native Guile pointers

    In addition to SWIG smob pointers, Guile's native pointer type are accepted as arguments to wrapped SWIG functions. This can be useful for passing pointers to bytevector data to wrapped functions.

    25.9 Exception Handling

    SWIG code calls scm_error on exception, using the following mapping:

          MAP(SWIG_MemoryError,     "swig-memory-error");
          MAP(SWIG_IOError,         "swig-io-error");
          MAP(SWIG_RuntimeError,    "swig-runtime-error");
          MAP(SWIG_IndexError,      "swig-index-error");
          MAP(SWIG_TypeError,       "swig-type-error");
          MAP(SWIG_DivisionByZero,  "swig-division-by-zero");
          MAP(SWIG_OverflowError,   "swig-overflow-error");
          MAP(SWIG_SyntaxError,     "swig-syntax-error");
          MAP(SWIG_ValueError,      "swig-value-error");
          MAP(SWIG_SystemError,     "swig-system-error");
    

    The default when not specified here is to use "swig-error". See Lib/exception.i for details.

    25.10 Procedure documentation

    If invoked with the command-line option -procdoc file, SWIG creates documentation strings for the generated wrapper functions, describing the procedure signature and return value, and writes them to file.

    SWIG can generate documentation strings in three formats, which are selected via the command-line option -procdocformat format:

    • guile-1.4 (default): Generates a format suitable for Guile 1.4.
    • plain: Generates a format suitable for Guile 1.4.1 and later.
    • texinfo: Generates texinfo source, which must be run through texinfo in order to get a format suitable for Guile 1.4.1 and later.

    You need to register the generated documentation file with Guile like this:

    (use-modules (ice-9 documentation))
    (set! documentation-files 
          (cons "file" documentation-files))
    

    Documentation strings can be configured using the Guile-specific typemap argument doc. See Lib/guile/typemaps.i for details.

    25.11 Procedures with setters

    For global variables, SWIG creates a single wrapper procedure (variable :optional value), which is used for both getting and setting the value. For struct members, SWIG creates two wrapper procedures (struct-member-get pointer) and (struct-member-set pointer value).

    If invoked with the command-line option -emit-setters (recommended), SWIG will additionally create procedures with setters. For global variables, the procedure-with-setter variable is created, so you can use (variable) to get the value and (set! (variable) value) to set it. For struct members, the procedure-with-setter struct-member is created, so you can use (struct-member pointer) to get the value and (set! (struct-member pointer) value) to set it.

    If invoked with the command-line option -only-setters, SWIG will only create procedures with setters, i.e., for struct members, the procedures (struct-member-get pointer) and (struct-member-set pointer value) are not generated.

    25.12 GOOPS Proxy Classes

    SWIG can also generate classes and generic functions for use with Guile's Object-Oriented Programming System (GOOPS). GOOPS is a sophisticated object system in the spirit of the Common Lisp Object System (CLOS).

    To enable GOOPS support, pass the -proxy argument to swig. This will export the GOOPS wrapper definitions into the module.scm file in the directory specified by -outdir or the current directory. GOOPS support requires either passive or module linkage.

    The generated file will contain definitions of GOOPS classes mimicking the C++ class hierarchy.

    Enabling GOOPS support implies -emit-setters.

    If -emit-slot-accessors is also passed as an argument, then the generated file will contain accessor methods for all the slots in the classes and for global variables. The input class

      class Foo {
        public:
          Foo(int i) : a(i) {}
          int a;
          int getMultBy(int i) { return a * i; }
          Foo getFooMultBy(int i) { return Foo(a * i); }
      }; 
      Foo getFooPlus(int i) { return Foo(a + i); }
    

    will produce (if -emit-slot-accessors is not passed as a parameter)

    (define-class <Foo> (<swig>)
      (a #:allocation #:swig-virtual 
         #:slot-ref primitive:Foo-a-get 
         #:slot-set! primitive:Foo-a-set)
      #:metaclass <swig-metaclass>
      #:new-function primitive:new-Foo
    )
    (define-method (getMultBy (swig_smob <Foo>) i)
      (primitive:Foo-getMultBy  (slot-ref swig_smob 'smob) i))
    (define-method (getFooMultBy (swig_smob <Foo>) i)
      (make <Foo> #:init-smob (primitive:Foo-getFooMultBy  (slot-ref swig_smob 'smob) i)))
    
    (define-method (getFooPlus i)
      (make <Foo> #:init-smob (primitive:getFooPlus i)))
    
    (export <Foo> getMultBy getFooMultBy getFooPlus )
    

    and will produce (if -emit-slot-accessors is passed as a parameter)

    (define-class <Foo> (<swig>)
      (a #:allocation #:swig-virtual 
         #:slot-ref primitive:Foo-a-get 
         #:slot-set! primitive:Foo-a-set 
         #:accessor a)
      #:metaclass <swig-metaclass>
      #:new-function primitive:new-Foo
    )
    (define-method (getMultBy (swig_smob <Foo>) i)
      (primitive:Foo-getMultBy  (slot-ref swig_smob 'smob) i))
    (define-method (getFooMultBy (swig_smob <Foo>) i)
      (make <Foo> #:init-smob (primitive:Foo-getFooMultBy  (slot-ref swig_smob 'smob) i)))
    
    (define-method (getFooPlus i)
      (make <Foo> #:init-smob (primitive:getFooPlus i)))
    
    (export <Foo> a getMultBy getFooMultBy getFooPlus )
    

    which can then be used by this code

    ;; not using getters and setters
    (define foo (make <Foo> #:args '(45)))
    (slot-ref foo 'a)
    (slot-set! foo 'a 3)
    (getMultBy foo 4)
    (define foo2 (getFooMultBy foo 7))
    (slot-ref foo 'a)
    (slot-ref (getFooPlus foo 4) 'a)
    
    ;; using getters and setters
    (define foo (make <Foo> #:args '(45)))
    (a foo)
    (set! (a foo) 5)
    (getMultBy foo 4)
    (a (getFooMultBy foo 7))
    

    Notice that constructor arguments are passed as a list after the #:args keyword. Hopefully in the future the following will be valid (make <Foo> #:a 5 #:b 4)

    Also note that the order the declarations occur in the .i file make a difference. For example,

    %module test
    
    %{ #include "foo.h" %}
    
    %inline %{
      int someFunc(Foo &a) {
        ...
      }
    %}
    
    %include "foo.h"
    

    This is a valid SWIG file it will work as you think it will for primitive support, but the generated GOOPS file will be broken. Since the someFunc definition is parsed by SWIG before all the declarations in foo.h, the generated GOOPS file will contain the definition of someFunc() before the definition of <Foo>. The generated GOOPS file would look like

    ;;...
    
    (define-method (someFunc (swig_smob <Foo>))
      (primitive:someFunc (slot-ref swig_smob 'smob)))
    
    ;;...
    
    (define-class <Foo> (<swig>)
      ;;...
    )
    
    ;;...
    

    Notice that <Foo> is used before it is defined. The fix is to just put the %import "foo.h" before the %inline block.

    25.12.1 Naming Issues

    As you can see in the example above, there are potential naming conflicts. The default exported accessor for the Foo::a variable is named a. The name of the wrapper global function is getFooPlus. If the -useclassprefix option is passed to swig, the name of all accessors and member functions will be prepended with the class name. So the accessor will be called Foo-a and the member functions will be called Foo-getMultBy. Also, if the -goopsprefix goops: argument is passed to swig, every identifier will be prefixed by goops:

    Two guile-modules are created by SWIG. The first module contains the primitive definitions of all the wrapped functions and variables, and is located either in the _wrap.cxx file (with -Linkage module) or in the scmstub file (if -Linkage passive -scmstub). The name of this guile-module is the swig-module name (given on the command line with the -module argument or with the %module directive) concatenated with the string "-primitive". For example, if %module Test is set in the swig interface file, the name of the guile-module in the scmstub or -Linkage module will be Test-primitive. Also, the scmstub file will be named Test-primitive.scm. The string "primitive" can be changed by the -primsuffix swig argument. So the same interface, with the -primsuffix base will produce a module called Test-base. The second generated guile-module contains all the GOOPS class definitions and is located in a file named module.scm in the directory specified with -outdir or the current directory. The name of this guile-module is the name of the swig-module (given on the command line or with the %module directive). In the previous example, the GOOPS definitions will be in a file named Test.scm.

    Because of the naming conflicts, you can't in general use both the -primitive and the GOOPS guile-modules at the same time. To do this, you need to rename the exported symbols from one or both guile-modules. For example,

    (use-modules ((Test-primitive) #:renamer (symbol-prefix-proc 'primitive:)))
    (use-modules ((Test) #:renamer (symbol-prefix-proc 'goops:)))
    

    25.12.2 Linking

    The guile-modules generated above all need to be linked together. GOOPS support requires either passive or module linkage. The exported GOOPS guile-module will be the name of the swig-module and should be located in a file called Module.scm. This should be installed on the autoload path for guile, so that (use-modules (Package Module)) will load everything needed. Thus, the top of the GOOPS guile-module will contain code to load everything needed by the interface (the shared library, the scmstub module, etc.). The %goops directive inserts arbitrary code into the generated GOOPS guile-module, and should be used to load the dependent libraries.

    This breaks up into three cases

    • Passive Linkage without -scmstub: Note that this linkage style has the potential for naming conflicts, since the primitive exported function and variable names are not wrapped in a guile-module and might conflict with names from the GOOPS guile-module (see above). Pass the -goopsprefix argument to solve this problem. If the -exportprimitive option is passed to SWIG the (export ...) code that would be exported into the scmstub file is exported at the bottom of the generated GOOPS guile-module. The %goops directive should contain code to load the shared library.
      %goops %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      

      Produces the following code at the top of the generated GOOPS guile-module (with the -package my/modules -module foo command line arguments)

      (define-module (my modules foo))
      
      ;; %goops directive goes here
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") 
      
      (use-modules (oop goops) (Swig common))
      
    • Passive Linkage with -scmstub: Here, the name of the scmstub file should be Module-primitive.scm (with primitive replaced with whatever is given with the -primsuffix argument. The code to load the shared library should be located in the %scheme directive, which will then be added to the scmstub file. SWIG will automatically generate the line (use-modules (Package Module-primitive)) into the GOOPS guile-module. So if Module-primitive.scm is on the autoload path for guile, the %goops directive can be empty. Otherwise, the %goops directive should contain whatever code is needed to load the Module-primitive.scm file into guile.

      %scheme %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      // only include the following definition if (my modules foo) cannot
      // be loaded automatically
      %goops %{ 
        (primitive-load "/path/to/foo-primitive.scm") 
        (primitive-load "/path/to/Swig/common.scm")
      %}
      

      Produces the following code at the top of the generated GOOPS guile-module

      (define-module (my modules foo))
      
      ;; %goops directive goes here (if any)
      (primitive-load "/path/to/foo-primitive.scm")
      (primitive-load "/path/to/Swig/common.scm")
      
      (use-modules (oop goops) (Swig common))
      (use-modules ((my modules foo-primitive) :renamer (symbol-prefix-proc
                                                             'primitive:)))
      
      
    • Module Linkage: This is very similar to passive linkage with a scmstub file. SWIG will also automatically generate the line (use-modules (Package Module-primitive)) into the GOOPS guile-module. Again the %goops directive should contain whatever code is needed to get that module loaded into guile.

      %goops %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      

      Produces the following code at the top of the generated GOOPS guile-module

      (define-module (my modules foo))
      
      ;; %goops directive goes here (if any)
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") 
      
      (use-modules (oop goops) (Swig common))
      (use-modules ((my modules foo-primitive) :renamer (symbol-prefix-proc
                                                               'primitive:)))
      
      

    (Swig common): The generated GOOPS guile-module also imports definitions from the (Swig common) guile-module. This module is included with SWIG and should be installed by SWIG into the autoload path for guile (based on the configure script and whatever arguments are passed). If it is not, then the %goops directive also needs to contain code to load the common.scm file into guile. Also note that if you are trying to install the generated wrappers on a computer without SWIG installed, you will need to include the common.swg file along with the install.

    Multiple Modules: Type dependencies between modules is supported. For example, if mod1 includes definitions of some classes, and mod2 includes some classes derived from classes in mod1, the generated GOOPS file for mod2 will declare the correct superclasses. The only problem is that since mod2 uses symbols from mod1, the mod2 GOOPS file must include a (use-modules (mod2)). Currently, SWIG does not automatically export this line; it must be included in the %goops directive of mod2. Maybe in the future SWIG can detect dependencies and export this line. (how do other language modules handle this problem?)

    swig-4.0.2/Doc/Devel/0000755000175000017500000000000013667507523014126 5ustar williamwilliamswig-4.0.2/Doc/Devel/index.html0000644000175000017500000000155413667507523016130 0ustar williamwilliam SWIG Documentation This directory contains SWIG documentation: The following documentation describe the internal APIs used by SWIG. These may be useful to module developers.
    Copyright (C) 1999-2007 SWIG Development Team. swig-4.0.2/Doc/Devel/file.html0000644000175000017500000001330213667507523015732 0ustar williamwilliam SWIG File Handling

    10 Preprocessing

    Introduction

    This document describes the functions related to file and filename handling in the SWIG core. These functions are defined in the header file Source/Swig/swigfile.h. This API is considered to be stable.

    File Search Path

    These functions manipulate the search path for locating files.

    List *Swig_add_directory(const String_or_char *dirname)

    Adds a new directory to the system search path. The directory is appended to the end of the search path. Returns a list containing the current system search path.

    void Swig_push_directory(const String_or_char *dirname)

    Pushes a temporary directory onto the search path. This directory is searched before directories added with Swig_add_directory() except when including a system file explicitly (either using #include <file> or calling Swig_include_sys()). This function is normally used by the preprocessor to add temporary directories when processing #include statements.

    void Swig_pop_directory()

    Pops off the last pushed directory with Swig_push_directory()

    int Swig_get_push_dir()

    Returns a flag that indicates whether directory pushing is enabled or not.

    void Swig_set_push_dir(int dopush)

    Enables or disables directory pushing. By default, it is turned on. However, the -I- command line option to SWIG disables it.

    List *Swig_search_path()

    Returns the current search path.

    File access functions

    FILE *Swig_open(const String_or_char *name)

    Opens a file, using the applicable search paths, and returns an open FILE * object if found. Returns NULL if the file is not found.

    String *Swig_read_file(FILE *f)

    Reads all of the data from an open file into a string which is returned.

    String *Swig_include(const String_or_char *name)

    Searches for an include file name and returns its contents as a string if found. Returns NULL if not found. All of the applicable search paths are searched when trying to locate the file.

    String *Swig_include_sys(const String_or_char *name)

    Searches for an include file name and returns its contents as a string if found. Returns NULL if not found. All of the applicable search paths are searched when trying to locate the file, but preference is given to system paths first. This mimics the behavior of #include <file> in the preprocessor.

    int Swig_insert_file(const String_or_char *name, File *outfile)

    Searches for a file name and dumps its contents to outfile if found. Returns 0 on success, -1 if the file couldn't be found.

    Query functions

    String *Swig_last_file()

    Returns the full pathname of the file last opened or included.

    Named files

    void *Swig_register_filebyname(const String_or_char *filename, File *outfile)

    Registers a file object outfile with a specific name filename. This function is used to implement the SWIG %insert directive and to manage different sections of the output file such as "runtime","header","wrapper","init", etc. Different language modules may add their own sections for generating Python code, Perl code, etc.

    File *Swig_filebyname(const String_or_char *filename)

    This looks up a file object previously registered using Swig_register_filebyname(). This is used to implement the %insert directive.

    Filename utilities

    char *Swig_file_suffix(const String_or_char *filename)

    Returns the suffix of a filename. For instance, if the filename is "foo.txt", it returns ".txt".

    char *Swig_file_basename(const String_or_char *filename)

    Returns the filename without the suffix attached to it. For instance, if the filename is "foo.txt", it returns "foo". The result is stored in a static variable. If you need to save it, make your own copy.

    char *Swig_file_filename(const String_or_char *filename)

    Returns the filename without any leading directories. For instance, if the filename is "/bar/spam/foo.txt", it returns "foo.txt". This function is aware of local naming conventions on the machine (e.g., forward versus back slashes on Unix and Windows). The result is stored in a static variable. If you need to save the value, make a copy.

    char *Swig_file_dirname(const String_or_char *filename)

    Returns the directory name (if any). For instance, if the filename is "/bar/spam/foo.txt", it returns "/bar/spam/". This function is aware of local naming conventions on the machine (e.g., forward versus back slashes on Unix and Windows). The result is stored in a static variable. If you need to save the value, make a copy.

    SWIG_FILE_DELIMITER

    This macro contains the file delimiter string for the local machine. On Unix it is "/", on Windows it is "\\".
    swig-4.0.2/Doc/Devel/engineering.html0000644000175000017500000003146713667507523017321 0ustar williamwilliam SWIG Engineering Manual

    SWIG Engineering Manual

    David Beazley

    (Note : This is a work in progress.)

    Table of Contents

    1. Introduction

    The purpose of this document is to describe various coding conventions and organizational aspects for SWIG developers. The idea for this document is largely borrowed from John Ousterhout's Tcl/Tk Engineering Manual. It is not my intent to overly managerial about matters--rather I'm hoping to make life a little less chaotic for everyone.

    First a little background: SWIG was started in 1995 as a one-person project and continued in this mode of operation until about 1998. Most of this development was driven by ideas submitted by early SWIG users as opposed to being motivated by a grand design. As a result, the code ended up being a pretty horrible C++ coding disaster. A mostly working disaster perhaps, but a disaster nonetheless.

    With that said, the primary goal of future SWIG development is to reengineer the original system, fix most of its inherent design flaws, and to produce what I hope will become a highly extensible and modular interface compiler framework. To this do this, there are a few critical areas of work. First, I want to restructure SWIG as a collection of loosely coupled modules written in either ANSI C or an scripting language. Second, I want the system to be minimalistic in its use of data structures and interconnections. The primary reason for this is that the fewer data structures there are, the less users will have to remember. This will also make the system more accessible to non-experts. Finally, I want to reevaluate the whole idea of a SWIG module is and expand the definition to include just about anything from parsers, preprocessors, optimizers, interface editors, and code generators.

    The rest of this document outlines a few general rules of how code should be developed within the SWIG project. These rules are primarily drawn from my own experience developing software and observing the practices of other successful projects.

    2. Programming Languages and Libraries

    All SWIG modules must be written in either ANSI C or one of the scripting languages for which SWIG can generate an interface (e.g., Perl, Python, or Tcl). C++ is currently being used to write SWIG modules, but it is only being utilized to avoid working with a lot of pointers to functions. Advanced C++ features like namespaces, templates, and overloading should not be used..

    Module writers should make every attempt to use only those functions described in the POSIX.1 standard. This includes most of the functions contained the Kernighan and Ritchie C programming book. Use of operating system dependent functionality such as socket libraries should always be included inside a conditional compilation block so that it can be omitted on problematic platforms. If you are unsure about a library call, check the man page or contact Dave.

    3. The Source Directory and Module Names

    All SWIG modules are contained within the "Source" directory. Within this directory, each module is placed into its own subdirectory. The name of this subdirectory should exactly match the name of the module. For example, if you are creating a module called "Tcl", all of your files should be placed in a directory "Tcl".

    When choosing a module name, please pick a name that is not currently in use. As a general convention, the first letter of a module name is capitalized such as "Perl". Alternatives such as "perl" or "PERL" should be avoided. In certain instances, the first two letters may be capitalized as in "CParse." The exact usage of this is somewhat inconsistent and isn't terribly important--just make sure the first letter is capitalized. Also, module names should not start with numbers, include underscores or any other special non-alphanumeric characters.

    5. File Structure

    Each file in a module should be given a filename that is all lowercase letters such as "parser.c", not "Parser.c" or "PARSER.c". Please note that filenames are case-insensitive on Windows so this convention will prevent you from inadvertently creating two files that differ in case-only.

    Each file should include a short abstract and license information like this:

    /* -----------------------------------------------------------------------------
     * This file is part of SWIG, which is licensed as a whole under version 3 
     * (or any later version) of the GNU General Public License. Some additional
     * terms also apply to certain portions of SWIG. The full details of the SWIG
     * license and copyrights can be found in the LICENSE and COPYRIGHT files
     * included with the SWIG source code as distributed by the SWIG developers
     * and at http://www.swig.org/legal.html.
     *
     * xxx.c
     *
     * This file defines ...
     * ----------------------------------------------------------------------------- */
    
    #include "swig.h"
    
    /* Declarations */
    typedef struct {
       int x, y;
    } Foo;
    
    ...
    
    /* Private Declarations (used only in this file) */
    static int  avariable;
    
    ...
    
    /* Functions */
    ... 
    
    

    As a general rule, files start to get unmanageable once they exceed about 2000 lines. Files larger than this should be broken up into multiple files. Similarly, you should avoid the temptation to create many small files as this increases compilation time and makes the directory structure too complicated.

    6. Bottom-Up Design

    Within each source file, the preferred organization is to use what is known as "bottom-up" design. Under this scheme, lower-level functions appear first and the highest level function appears last. The easy way to remember is that the "main" function of your module should always appear last in the source file. For example:
    /* Simple bottom-up program */
    #include <stdio.h>
    
    int foo(int x, int y) {
        /* Implement foo */
        ...
    }
    
    int bar() {
        ...
        foo(i,j);
        ...
    }
    
    ...
    int main(int argc, char **argv) {
        ...
        bar();   
        ...
    }
    
    This choice of design is somewhat arbitrary however it has a number of benefits particular to C. In particular, a bottom-up design generally eliminates the need to include forward references--resulting in cleaner code and fewer compilation errors.

    7. Functions

    All functions should have a function header that gives the function name and a short description like this:
    /* -------------------------------------------------------------------------
     * Swig_add_directory()
     *
     * Adds a directory to the SWIG search path.
     * ------------------------------------------------------------------------- */
    
    void 
    Swig_add_directory(DOH *dirname) {
    ...
    
    }
    
    In the function declaration, the return type and any specifiers (extern or static) should appear on a separate line followed by the function name and arguments as shown above. The left curly brace should appear on the same line as the function name.

    Function declarations should NOT use the pre-ANSI function declaration syntax. The ANSI standard has been around long enough for this to be a non-issue.

    8. Naming Conventions

    The following conventions are used to name various objects throughout SWIG.

    Functions

    Functions should consist of the module name and the function name separated by an underscore like this:
    Preprocessor_define()
    Swig_add_directory()
    
    In general, the module name should match the name of the module subdirectory and the function name should be in all lowercase with words separated by underscores.

    Structures and Types

    If your module defines new structures, the structure name should include the name of the module and the name of the structure appended together like this:
    typedef struct SwigScanner {
       ...
    } SwigScanner;
    
    typedef struct LParseType {
       ...
    } LParseType;
    
    In this case, both the name of the module and the type should be capitalized. Also, whenever possible, you should use the "typedef struct Name { ... } Name" form when defining new data structures.

    Global Variables

    Global variables should be avoided if at all possible. However, if you must use a global variable, please prepend the module name and use the same naming scheme as for functions.

    Constants

    Constants should be created using #define and should be in all caps like this:
    #define   SWIG_TOKEN_LPAREN  1
    
    Separate words in a constant should be separated by underscores as with functions.

    Structure members

    Structure members should be in all lower-case and follow the same word-separation convention as for function names. However, the module name does not have to be included. For example:
    typedef struct SwigScanner {
      DOH           *text;           /* Current token value */
      DOH           *scanobjs;       /* Objects being scanned */
      DOH           *str;            /* Current object being scanned */
      char          *idstart;        /* Optional identifier start characters */
      int            next_token;     /* Next token to be returned */
      int            start_line;     /* Starting line of certain declarations */
      int            yylen;          /* Length of text pushed into text */
      DOH           *file;           /* Current file name */
    } SwigScanner;
    

    Static Functions and Variables

    Static declarations are free to use any naming convention that is appropriate. However, most existing parts of SWIG use lower-case names and follow the same convention as described for functions.

    9. Visibility

    Modules should keep the following rules in mind when exposing their internals:
    • Only publicly accessible functions should be included in the module header file.
    • All non-static declarations must be prepended with some form of the module name to avoid potential linker namespace conflicts with other modules.
    • Modules should not expose global variables or use global variables in their public interface.
    • Similarly, modules should discourage the direct manipulation of data contained within data structures in favor of using function calls instead. For example, instead of providing a user with a structure like this:
      typedef struct Foo {
         int line;
      } Foo;
      
      It is better to hide the implementation of Foo and provide an function-call interface like this:
      typedef struct Foo Foo;
      extern int  Foo_getline(Foo *f);
      extern void Foo_setline(Foo *f, int line);
      
      Although this results in worse performance, there are many practical reasons for doing this. The most important reason is that it allows you to change the internal representation of Foo without breaking all of the other modules or having to recompile the entire universe after making your changes.

    10. Miscellaneous Coding Guidelines

    These are largely covered in the main documentation in the Extending.html file.

    11. Git Tagging Conventions

    Use git tag to declare some set of file revisions as related in some symbolic way. This eases reference, retrieval and manipulation of these files later. At the moment (2001/01/16 14:02:53), the conventions are very simple; let's hope they stay that way!

    There are two types of tags, internal (aka personal) and external. Internal tags are used by SWIG developers primarily, whereas external tags are used when communicating with people w/ anonymous git access.

    • Internal tags should start with the developer name and a hyphen.
    • External tags should start with "rel-".
    That's all there is to it. Some example tags:
    • ttn-pre-xml-patch
    • ttn-post-xml-patch
    • ttn-going-on-vacation-so-dutifully-tagging-now
    • rel-1.3.40
    • rel-2.0.9

    Copyright (C) 1999-2004 SWIG Development Team. swig-4.0.2/Doc/Devel/tree.html0000644000175000017500000002176213667507523015763 0ustar williamwilliam SWIG Parse Tree Handling

    SWIG Parse Tree Handling

    Introduction

    This document describes the functions related to the handling of parse trees in SWIG. The structure of SWIG parse trees has been influenced heavily by ideas from XML-DOM trees. In fact, the functions in the API and attribute names are nearly identical. The header file Source/swig/swigtree.h contains the functions and macros described in this document. This API is considered to be stable.

    Parse tree navigation

    The following macros are used to navigate the parse tree.

    nodeType(n)

    Returns the type of a node as a String object. The type is stored in the "nodeType" attribute of n.

    parentNode(n)

    Returns the parent of a node. This is found in the "parentNode" attribute of n.

    previousSibling(n)

    Returns the previous sibling of a node (if any). This is found in the "previousSibling" attribute of n.

    nextSibling(n)

    Returns the next sibling of a node (if any). This is found in the "nextSibling" attribute of n.

    firstChild(n)

    Returns the first child of a node (if any). This is found in the "firstChild" attribute of n.

    lastChild(n)

    Returns the last child of a node (if any). This is found in the "lastChild" attribute of n.

    Parse Tree Construction

    The following macros are used to construct parse trees.

    set_nodeType(n, val)

    Sets the nodeType attribute of n. val is a string containing the type.

    set_parentNode(n, parent)

    Sets the parent of node n.

    set_previousSibling(n, prev)

    Sets the previous sibling of node n.

    set_nextSibling(n, next)

    Sets the next sibling of node n.

    set_firstChild(n, chd)

    Sets the first child of node n.

    set_lastChild(n, chd)

    Sets the last child of node n.

    Tree Management Functions

    The following functions are used to help with the management and construction of parse trees.

    void appendChild(Node *node, Node *child)

    Adds a new child to node. This function takes care of adjusting the "firstChild" and "lastChild" attributes of node to appropriate values. After calling this function, the "lastChild" attribute will point to child.

    void prependChild(Node *node, Node *child)

    Prepends a new child to node. The new child is added so that it becomes the first child of node.

    void removeNode(Node *node)

    Removes a node from the parse tree. The removal process detaches a node from its parent by removing it from the parent's child list. Upon return, node will have no parent and no siblings. This function does NOT delete node or modify children of node. If desired, node could be reattached to a different part of the parse tree.

    Node *copyNode(Node *node)

    Copies a node, but only copies those attributes that are simple strings. Thus, the new node will not contain any references to other nodes, lists, hashes, or other complex data structures. This function may be useful if you want to copy the data contents of a node in the process of creating a new parse tree node.

    Attribute Checking

    The following utility is provided since this is an extremely common operation.

    int checkAttribute(Node *n, const String_or_char *name, const String_or_char *value)

    This function checks to see whether node n has a given attribute name and that the attribute has a given value. Returns 0 or 1.

    Node Transformation

    In the course of processing, SWIG often applies a transform to a node. This transformation process made modify many of the attributes--even changing the type of a node. The following functions are used to help manage this transformation process. In addition to provide sanity checks, they save the old contents of the node so that they can be restored later.

    void Swig_save(const char *namespace, Node *n, ...)

    This function takes a node and a list of attribute names and saves their contents in a specified namespace. For example, the call
    Swig_save("temp",n,"type","parms","name",NIL)
    
    takes the attributes "type","parms", and "name" and saves their contents under the attribute names "temp:type","temp:parms","temp:name". In addition, this function sets an attribute "view" to hold the name of the current namespace. In this example, the "view" attribute would be set to "temp". The attribute names specified are all optional. If one or more of the attributes don't exist, this function merely records that those attributes did not exist in the original node.

    void Swig_require(const char *namespace, Node *n, ...)

    This function is similar to Swig_save() except that adds additional attribute checking. There are different interpretations of the attribute names. A name of "attr" merely requests that the function check for the presence of an attribute. If the attribute is missing, SWIG will exit with a failed assertion. An attribute name of "?attr" specifies that the attribute "attr" is optional and that its old value must be saved (if any). An attribute name of "*attr" specifies that the attribute is required and that its value must be saved. The saving of attributes is performed in the same manner as with Swig_save(). Here is an example:
    Swig_require("temp",n,"type","*name","?parms",NIL);
    

    void Swig_restore(Node *n)

    This function restores a node to the state it was in prior to the last Swig_save() or Swig_require() call. This is used to undo node transformations.

    Debugging Functions

    The following functions can be used to help debug any SWIG DOH object.

    void Swig_print(DOH *object, int count = -1)
    Prints to stdout a string representation of any DOH type. The number of nested Hash types to expand is set by count (default is 1 if count<0). See Swig_set_max_hash_expand() to change default.
    
    
    void Swig_print_with_location(DOH *object, int count = -1)
    Prints to stdout a string representation of any DOH type, within [] brackets for Hash and List types, prefixed by line and file information. The number of nested Hash types to expand is set by count (default is 1 if count<0). See Swig_set_max_hash_expand() to change default.
    
    

    The following functions can be used to help debug SWIG parse trees.

    void Swig_print_tags(Node *node, String_or_char *prefix)

    Prints the tag-structure of the parse tree to standard output. node is the top-level parse tree node. prefix is a string prefix that's added to the start of each line. Normally, you would specify the empty string or NIL for prefix. This function is called by the -debug-tags option to SWIG.
    % swig -debug-tags -python example.i
     . top (:1)
     . top . include (/Users/beazley/Projects/share/swig/1.3.31/swig.swg:0)
     . top . include . include (/Users/beazley/Projects/share/swig/1.3.31/swigwarnings.swg:0)
     . top . include . include . include (/Users/beazley/Projects/share/swig/1.3.31/swigwarn.swg:0)
    ...
    ...
     . top . include (example.i:0)
     . top . include . module (example.i:2)
     . top . include . insert (example.i:7)
     . top . include . cdecl (example.i:5)
     . top . include . cdecl (example.i:6)
    
    Since many language modules include hundreds of typemaps and other information, the output of this can be significantly more complicated than you might expect.

    void Swig_print_node(Node *node)

    Prints the contents of a parse tree node, including all children, to standard output. The output includes all attributes and other details.

    void Swig_print_tree(Node *node)

    Prints the same output as Swig_print_node() except that it also processes all of the siblings of node. This can be used to dump the entire parse tree to standard output. The command line options -debug-module and -debug-top use this function to display the parse tree for a SWIG input file.
    swig-4.0.2/Doc/Devel/wrapobj.html0000644000175000017500000001663113667507523016467 0ustar williamwilliam Wrapper Objects

    SWIG File Handling

    David M. Beazley
    dave-swig@dabeaz.com
    December, 2006

    Introduction

    This document describes the functions related to management of wrapper objects. A wrapper object is a low-level data structure used to contain the C/C++ code that is emitted during the wrapping process. It contains not only the emitted code, but information about local variables. These objects are a critical component of almost all SWIG target language modules.

    The functions described here are declared in Source/Swig/swigwrap.h. This API is considered to be stable.

    Creating and Destroying Wrappers

    The following functions create and destroy wrapper objects.

    Wrapper *NewWrapper()

    Creates a new wrapper object.

    void DelWrapper(Wrapper *w)

    Destroys a wrapper object.

    Wrapper Objects

    The Wrapper object returned by NewWrapper() has three public attributes.
    typedef struct Wrapper {
        String *def;
        String *locals;
        String *code;
    } Wrapper;
    
    The def attribute is a string that holds the function definition line. This line declares the function name, return type, and parameters. Language modules create this declaration by simply printing the appropriate text into this attribute.

    The locals attribute is a string that holds the code related to any local variables declaration. Normally, language modules do not emit code to this string directly. They use Wrapper_add_local() or Wrapper_new_local() to do this.

    The code attribute is a string that holds code related to the body of the function. Almost all code emitted by SWIG language modules is printed into this attribute.

    Creating Local Variables

    Perhaps the most useful aspect of Wrapper objects is the management of local variables. When creating a wrapper, it is often necessary to emit local variables related to the API of the target language. In addition to this, typemaps and other aspects of SWIG rely upon their own local variables. The following functions are used to create local variables, but also provide support for renaming variables in order to avoid name clashes.

    int Wrapper_add_local(Wrapper *w, const String_or_char *name, const String_or_char *decl)

    Adds a new local variable to the wrapper object. name is the name of the local variable. decl is a string containing the actual variable declaration code. For example, if you wanted to declare a variable "int x = 42;", you would set name to "x" and decl to "int x = 42;". On success, the text in decl is added to the locals attribute of w and 0 is returned. -1 is returned if a variable with the given name has already been declared.

    int Wrapper_add_localv(Wrapper *w, const String_or_char *name, ...)

    The same as Wrapper_add_local() except that instead of passing a single string for the declaration, a NULL-terminated list of strings can be passed. These strings are joined together when producing the output. This convention turns out to be fairly useful since language modules often create their output into pieces.

    char * Wrapper_new_local(Wrapper *w, const String_or_char *name, const String_or_char *decl)

    The same as Wrapper_add_local() except that if a local variable with the given name already exists, this function picks a new name and adds the declaration using the new name. The actual name used for the variable is returned. This function is used when generating code originating from typemaps. For instance, if a typemap declares a local variable, that variable might have to be renamed if the same typemap is used more than once in the same function.

    char * Wrapper_new_localv(Wrapper *w, const String_or_char *name,...)

    The same as Wrapper_new_localv(), but accepts a NULL-terminated list of strings as code output.

    int Wrapper_check_local(Wrapper *w, const String_or_char *name)

    Checks to see if a local variable with name name has been declared. Returns 1 if the local is defined, 0 otherwise.

    Output

    void Wrapper_print(Wrapper *w, File *f)

    This function is used to format a wrapper function for output. The formatted wrapper function is emitted to f which may be any file-like object including a FILE * object or a String * object. When emitting the wrapper, the code printed to the wrapper object is automatically formatted. By default, the formatting is done according to a "pretty printing" style in which lines are split onto multiple lines and indented according to reasonable C formatting rules. This produces code that is moderately readable should you want to look at the wrapper code output. An alternative output mode is "compact printing" in which lines are collected and compacted. This may result in multiple C statements appearing on the same line. This mode is sometimes used when the size of a wrapper file is too large for certain compilers. For example, some compilers might impose a limit of 65536 lines per source file.

    void Wrapper_compact_print_mode_set(int flag)

    Sets the output mode of the Wrapper_print() function. If flag is set to 1, then wrapper code is formatted to be compact.

    void Wrapper_pretty_print(String *str, File *f)

    Utility function that reformats a string containing C/C++ code and outputs it to the file-like object f. The formatting process indents the code and structures it according to reasonable C formatting rules.

    void Wrapper_compact_print(String *str, File *f)

    Utility function that reformats a string containing C/C++ code and outputs it to the file-like object f. The formatting process tries to make the code as compact as possible, without going completely overboard. For example, multiple C statements may be combined onto a single line and braces may be aligned to not use up extra lines.

    An Example

    Here is a simple example of how these functions are used. Suppose you wanted to emit the following C function:
    void foo(int n) {
       int i;
       for (i = 0; i < n; i++) {
           printf("%d\n", i);
       }
    }
    
    Here is code that generates the above function:
    Wrapper *w = NewWrapper();
    Printf(w->def,"void foo(int n) {");
    Wrapper_add_local(w,"n","");         /* parameter n */
    Wrapper_add_local(w,"i", "int i;");  /* local i */
    Printv(w->code,"for (i = 0; i < n; i++) {",
                   "printf(\"%d\n",i);",
                   "}\n", NIL);
    Printf(w->code,"}\n");
    
    /* Emit wrapper code */
    Wrapper_print(w,outf);
    DelWrapper(w);
    
    Within different language modules, this process is obviously much more involved. However, this example shows the basic idea of how C/C++ code is prepared for output. swig-4.0.2/Doc/Devel/internals.html0000644000175000017500000011566013667507523017024 0ustar williamwilliam SWIG Internals

    SWIG Internals Manual

    (Note : This is a work in progress.)

    Table of Contents

    1. Introduction

    This document details SWIG internals: architecture and sometimes implementation. The first few sections concentrate on data structures, interfaces, conventions and code shared by all language targets. Subsequent sections focus on a particular language.

    The audience is assumed to be SWIG developers (who should also read the SWIG Engineering Manual before starting to code).

    1.1 Directory Guide

    Doc HTML documentation. If you find a documentation bug, please let us know.
    Examples This subdir tree contains examples of using SWIG w/ different scripting languages, including makefiles. Typically, there are the "simple" and "class" examples, w/ some languages offering additional examples. See the README more index.html file in each directory for more info. [FIXME: Ref SWIG user manual.]
    Lib These are the .i (interface) files that form the SWIG installed library. Language-specific files are in subdirectories (for example, guile/typemaps.i). Each language also has a .swg file implementing runtime type support for that language. The SWIG library is not versioned.
    Misc Currently this subdir only contains file fileheader. See the Engineering Manual for more info.
    Source The C and C++ source code for the swig executable is in this subdir tree.
    DOH C library providing memory allocation, file access and generic containers.
    Include Configuration .h files
    CParse Parser (lex / yacc) files and support
    Modules Language-specific callbacks that does actual code generation (each language has a .cxx and a .h file).
    Preprocessor SWIG-specialized C/C++ preprocessor.
    Swig This directory contains the ANSI C core of the system and contains generic functions related to types, file handling, scanning, and so forth.
    Tools The mkdist.py script and other tools. Win This improperly-named (spit spit) subdir only has README.txt.

    1.2 Overall Program Flow

    Here is the general control flow and where under subdir Source to look for code:
    • Modules/swigmain.cxx:main() is the program entry point. It parses the language-specifying command-line option (for example, -java), creating a new language-specific wrapping object (each language is a C++ class derived from base class Language). This object and the command-line is passed to SWIG_main(), whose return value is the program exit value.
    • Modules/main.cxx:SWIG_main() is the "real" main. It initializes the preprocessor and typemap machinery, defines some preprocessor symbols, locates the SWIG library, processes common command-line options, and then calls the language-specific command-line parser. From here there are three paths: "help", "checkout" and everything else.
      • In "help" mode, clean up open files and exit.
      • In "checkout" mode, copy specified files from the SWIG library to the current directory. Errors cause error messages but no non-local exits.
      • Otherwise, do wrapping: determine output file name(s), define some preprocessor symbols and run the preprocessor, initialize the interface-definition parser, set up the typemap for handling new return strings, and finally do the language-specific parse (by calling the language object's parse() method), which creates output files by side-effect.
      Afterwards, remove temporary files, and clean up. If the command-line included -freeze, go into an infinite loop; otherwise return the error count.
    • The language-specific parse() (and all other language-specific code) lives in Modules/foo.{h,cxx} for language Foo. Typically, FOO::parse() calls FOO::headers() and then the global function yyparse(), which uses the callbacks registered by SWIG_main() above.

    2. DOH

    DOH is a collection of low-level objects such as strings, lists, and hash tables upon which the rest of SWIG is built. The name 'DOH' unofficially stands for "Dave's Object Hack", but it's also a good expletive to use when things don't work (as in "SWIG core dumped---DOH!").

    2.1 Motivation and Background

    The development of DOH is influenced heavily by the problems encountered during earlier attempts to create a C++ based version of SWIG2.0. In each of these attempts (over a 3 year period), the resulting system always ended up growing into a colossal nightmare of large inheritance hierarchies and dozens of specialized classes for different types of objects (functions, variables, constants, etc.). The end result was that the system was tremendously complicated, difficult to understand, difficult to maintain, and fairly inflexible in the grand scheme of things.

    DOH takes a different approach to tackling the complexity problem. First, rather than going overboard with dozens of types and class definitions, DOH only defines a handful of simple yet very useful objects that are easy to remember. Second, DOH uses dynamic typing---one of the features that make scripting languages so useful and which make it possible to accomplish things with much less code. Finally, DOH utilizes a few coding tricks that allow it to perform a limited form of function overloading for certain C datatypes (more on that a little later).

    The key point to using DOH is that instead of thinking about code in terms of highly specialized C data structures, just about everything ends up being represented in terms of a just a few datatypes. For example, structures are replaced by DOH hash tables whereas arrays are replaced by DOH lists. At first, this is probably a little strange to most C/C++ programmers, but in the long run in makes the system extremely flexible and highly extensible. Also, in terms of coding, many of the newly DOH-based subsystems are less than half the size (in lines of code) of the earlier C++ implementation.

    2.2 Basic Types

    The following built-in types are currently provided by DOH:
    • String. A string of characters with automatic memory management and high-level operations such as string replacement. In addition, strings support file I/O operations that make it possible to use them just about anyplace a file can be used.

    • List. A list of arbitrary DOH objects (of possibly mixed types).

    • Hash. A hash table that maps a set of string keys to a set of arbitrary DOH objects. The DOH version of an associative array for all of you Perl fans.

    • File. A DOH wrapper around the C FILE * structure. This is provided since other objects sometimes want to behave like files (strings for instance).

    • Void. A DOH wrapper around an arbitrary C pointer. This can be used if you want to place arbitrary C data structures in DOH lists and hash tables.
    Due to dynamic typing, all of the objects in DOH are represented by pointers of type DOH *. Furthermore, all objects are completely opaque--that means that the only way to access the internals of an object is through a well-defined public API. For convenience, the following symbolic names are sometimes used to improve readability:
    • DOHString *. A String object.
    • DOHList *. A list object.
    • DOHHash *. A hash object.
    • DOHFile *. A file object.
    • DOHVoid *. A void object.
    • DOHString_or_char *. A DOH String object or a raw C "char *".
    It should be stressed that all of these names are merely symbolic aliases to the type DOH * and that no compile-time type checking is performed (of course, a runtime error may occur if you screw up).

    2.3 Creating, Copying, and Destroying Objects

    The following functions can be used to create new DOH objects
    • NewString(DOHString_or_char *value)
      Create a new string object with contents initially set to value. value can be either a C string or a DOH string object.

    • NewStringf(char *fmt, ...)
      Create a new string object with contents initially set to a formatted string. Think of this as being sprintf() combined with an object constructor.

    • NewList()
      Create a new list object that is initially empty.

    • NewHash()
      Create a new hash object that is initially empty.

    • NewFile(DOHString_or_char *filename, char *mode)
      Open a file and return a file object. This is a wrapper around the C fopen() library call.

    • NewFileFromFile(FILE *f)
      Create a new file object given an already opened FILE * object.

    • NewVoid(void *obj, void (*del)(void *))
      Create a new DOH object that is a wrapper around an arbitrary C pointer. del is an optional destructor function that will be called when the object is destroyed.
    Any object can be copied using the Copy() function. For example:
    DOH *a, *b, *c, *d;
    a = NewString("Hello World");
    b = NewList();
    c = Copy(a);         /* Copy the string a */
    d = Copy(b);         /* Copy the list b */
    
    Copies of lists and hash tables are shallow. That is, their contents are only copied by reference.

    Objects can be deleted using the Delete() function. For example:

    DOH *a = NewString("Hello World");
    ...
    Delete(a);              /* Destroy a */
    
    All objects are referenced counted and given a reference count of 1 when initially created. The Delete() function only destroys an object when the reference count reaches zero. When an object is placed in a list or hash table, its reference count is automatically increased. For example:
    DOH *a, *b;
    a = NewString("Hello World");
    b = NewList();
    Append(b,a);         /* Increases refcnt of a to 2 */
    Delete(a);           /* Decreases refcnt of a to 1 */
    Delete(b);           /* Destroys b, and destroys a */
    
    Should it ever be necessary to manually increase the reference count of an object, the DohIncref() function can be used:
    DOH *a = NewString("Hello");
    DohIncref(a);
    

    2.4 A Word About Mutability and Copying

    All DOH objects are mutable regardless of their current reference count. For example, if you create a string and then create a 1000 references to it (in lists and hash tables), changes to the string will be reflected in all of the references. Therefore, if you need to make any kind of local change, you should first make a copy using the Copy() function. Caveat: when copying lists and hash tables, elements are copied by reference.

    2.5 Strings

    The DOH String type is perhaps the most flexible object. First, it supports a variety of string-oriented operations. Second, it supports many of the same operations as lists. Finally, strings provide file I/O operations that allow them to be used interchangeably with DOH file objects. [ TODO ]

    2.6 Lists

    Example usage of lists:

    /* Create and populate */
    List *list = NewList();
    Append(list, NewString("listval1"));
    Append(list, NewString("listval2"));
    Append(list, NewString("listval3"));
    Append(list, NewString("listval4"));
    Append(list, NewString("listval5"));
    
    /* Size */
    Printf(stdout, "list len: %d\n", Len(list));
    
    /* Delete */
    Delitem(list, 3);
    
    /* Replace */
    Setitem(list, 0, NewString("newlistval1"));
    
    /* Get */
    String *item = Getitem(list,1);
    if (item)
      Printf(stdout, "get: %s\n", item);
    else
      Printf(stdout, "get: [non-existent]\n");
    
    /* Iterate through the container */
    int len = Len(list);
    for (int i=0; i<len; i++) {
      String *item = Getitem(list,i);
      Printf(stdout, "list item: %s\n", item);
    }
    

    Wrapper Objects

    David M. Beazley
    dave-swig@dabeaz.com
    January 15, 2007

    Resulting output:

    hash len: 5
    get: hashval2
    hash item: hashval5 [h5]
    hash item: hashval1 [h1]
    hash item: hashval2 [h2]
    hash item: hashval3 [h3]
    

    2.7 Hash tables

    Example usage of hash tables:

    /* Create and populate */
    Hash *hash = NewHash();
    Setattr(hash, "h1", NewString("hashval1"));
    Setattr(hash, "h2", NewString("hashval2"));
    Setattr(hash, "h3", NewString("hashval3"));
    Setattr(hash, "h4", NewString("hashval4"));
    Setattr(hash, "h5", NewString("hashval5"));
    
    /* Size */
    Printf(stdout, "hash len: %d\n", Len(hash));
    
    /* Delete */
    Delattr(hash, "h4");
    
    /* Get */
    String *item = Getattr(hash, "h2");
    if (item)
      Printf(stdout, "get: %s\n", item);
    else
      Printf(stdout, "get: [non-existent]\n");
    
    /* Iterate through the container */
    Iterator it;
    for (it = First(hash); it.key; it= Next(it))
      Printf(stdout, "hash item: %s [%s]\n", (it.item), (it.key));
    

    Resulting output:

    list len: 5
    get: listval2
    list item: newlistval1
    list item: listval2
    list item: listval3
    list item: listval5
    

    2.8 Files

    [ TODO ]

    2.9 Void objects

    [ TODO ]

    2.10 Utility functions

    [ TODO ]

    3. Types and Typemaps

    The representation and manipulation of types is currently in the process of being reorganized and (hopefully) simplified. The following list describes the current set of functions that are used to manipulate datatypes.

    • SwigType_str(SwigType *t, char *name).
      This function produces the exact string representation of the datatype t. name is an optional parameter that specifies a declaration name. This is used when dealing with more complicated datatypes such as arrays and pointers to functions where the output might look something like "int (*name)(int, double)".

    • SwigType_lstr(SwigType *t, char *name).
      This function produces a string representation of a datatype that can be safely be assigned a value (i.e., can be used as the "lvalue" of an expression). To do this, qualifiers such as "const", arrays, and references are stripped away or converted into pointers. For example:
      Original Datatype              lstr()
      ------------------             --------
      const char *a                  char *a
      double a[20]                   double *a
      double a[20][30]               double *a
      double &a                      double *a
      
      The intent of the lstr() function is to produce local variables inside wrapper functions--all of which must be reassignable types since they are the targets of conversions from a scripting representation.

    • SwigType_rcaststr(SwigType *t, char *name).
      This function produces a string that casts a type produced by the lstr() function to the type produced by the str() function. You might view it as the inverse of lstr(). This function only produces output when it needs to (when str() and lstr() produce different results). Furthermore, an optional name can be supplied when the cast is to be applied to a specific name. Examples:
      Original Datatype             rcaststr()
      ------------------            ---------
      char *a                       
      const char *a                 (const char *) name
      double a[20]                  (double *) name
      double a[20][30]              (double (*)[30]) name
      double &a                     (double &) *name
      

    • SwigType_lcaststr(SwigType *t, char *name).
      This function produces a string that casts a type produced by the str() function to the type produced by the lstr() function. This function only produces output when it needs to (when str() and lstr() produce different results). Furthermore, an optional name can be supplied when the cast is to be applied to a specific name.
      Original Datatype             lcaststr()
      ------------------            ---------
      char *a                       
      const char *a                 (char *) name
      double a[20]                  (double *) name
      double a[20][30]              (double *) name
      double &a                     (double *) &name
      

    • SwigType_manglestr(SwigType *t).
      Produces a type-string that is used to identify this datatype in the target scripting language. Usually this string looks something like "_p_p_double" although the target language may redefine the output for its own purposes. Normally this function strips all qualifiers, references, and arrays---producing a mangled version of the type produced by the lstr() function.
    The following example illustrates the intended use of the above functions when creating wrapper functions using shorthand pseudocode. Suppose you had a function like this:
    int foo(int a, double b[20][30], const char *c, double &d);
    
    Here's how a wrapper function would be generated using the type generation functions above:
    wrapper_foo() {
       lstr("int","result")
       lstr("int","arg0")
       lstr("double [20][30]", "arg1")
       lstr("const char *", "arg2")
       lstr("double &", "arg3")
       ...
       get arguments
       ...
       result = (lcaststr("int"))  foo(rcaststr("int","arg0"),
                                   rcaststr("double [20][30]","arg1"),
                                   rcaststr("const char *", "arg2"),
                                   rcaststr("double &", "arg3"))
       ...
    }
    
    Here's how it would look with the corresponding output filled in:
    wrapper_foo() {
       int      result;
       int      arg0;
       double  *arg1;
       char    *arg2;
       double  *arg3;
       ...
       get arguments
       ...
       result = (int) foo(arg0,
                          (double (*)[30]) arg1,
                          (const char *) arg2,
                          (double &) *arg3);
       ...
    }
    
    Notes:
    • For convenience, the string generation functions return a "char *" that points to statically allocated memory living inside the type library. Therefore, it is never necessary (and it's an error) to free the pointer returned by the functions. Also, if you need to save the result, you should make a copy of it. However, with that said, it is probably worth nothing that these functions do cache the last 8 results. Therefore, it's fairly safe to make a handful of repeated calls without making any copies.
    [TODO]

    4. Parsing

    [TODO]

    5. The C/C++ Wrapping Layer

    Added: Dave Beazley (July 22, 2000)

    When SWIG generates wrappers, it tries to provide a mostly seamless integration with the original code. However, there are a number of problematic features of C/C++ programs that complicate this interface.

    • Passing and returning structures by value. When used, SWIG converts all pass-by-value functions into wrappers that pass by reference. For example:
      double dot_product(Vector a, Vector b);
      
      gets turned into a wrapper like this:
      double wrap_dot_product(Vector *a, Vector *b) {
           return dot_product(*a,*b);
      }
      
      Functions that return by value require a memory allocation to store the result. For example:
      Vector cross_product(Vector *a, Vector *b);
      
      become
      Vector *wrap_cross_product(Vector *a, Vector *b) {
         Vector *result = (Vector *) malloc(sizeof(Vector));
         *result = cross_product(a,b);
         return result;
      }
      
      Note: If C++ is being wrapped, the default copy constructor is used instead of malloc() to create a copy of the return result.

    • C++ references. C++ references are handled exactly the same as pass/return by value except that a memory allocation is not made for functions that return a reference.

    • Qualifiers such as "const" and "volatile". SWIG strips all qualifiers from the interface presented to the target language. Besides, what in the heck is "const" in Perl anyways?

    • Instance Methods. Method invocations are handled as a function call in which a pointer to the object (the "this" pointer) appears as the first argument. For example, in the following class:
      class Foo {
      public:
          double bar(double);
      };
      
      The "bar" method is wrapped by a function like this:
      double Foo_bar(Foo *self, double arg0) {
         return self->bar(arg0);
      }
      

    • Structure/class data members. Data members are handled by creating a pair of wrapper functions that set and get the value respectively. For example:
      struct Foo {
          int x;
      };
      
      gets wrapped as follows:
      int Foo_x_get(Foo *self) {
          return self->x;
      }
      int Foo_x_set(Foo *self, int value) {
          return (self->x = value);
      }
      

    • Constructors. Constructors for C/C++ data structures are wrapped by a function like this:
      Foo *new_Foo() {
          return new Foo;
      }
      
      Note: For C, new objects are created using the calloc() function.

    • Destructors. Destructors for C/C++ data structures are wrapper like this:
      void delete_Foo(Foo *self) {
          delete self;
      }
      
      Note: For C, objects are destroyed using free().
    The creation of wrappers and various type transformations are handled by a collection of functions found in the file Source/Swig/cwrap.c.
    • char *Swig_clocal(DataType *t, char *name, char *value)
      This function creates a string containing the declaration of a local variable with type t, name name, and default value value. This local variable is stripped of all qualifiers and will be a pointer if the type is a reference or user defined type.

    • DataType *Swig_clocal_type(DataType *t)
      Returns a type object corresponding to the type string produced by the Swig_clocal() function.

    • char *Swig_clocal_deref(DataType *t, char *name)
      This function is the inverse of the clocal() function. Given a type and a name, it produces a string containing the code needed to cast/convert the type produced by Swig_clocal() back into its original type.

    • char *Swig_clocal_assign(DataType *t, char *name)
      Given a type and name, this produces a string containing the code (and an optional cast) needed to make an assignment from the real datatype to the local datatype produced by Swig_clocal(). Kind of the opposite of deref().

    • int Swig_cargs(Wrapper *w, ParmList *l)
      Given a wrapper function object and a list of parameters, this function declares a set of local variables for holding all of the parameter values (using Swig_clocal()). Returns the number of parameters. In addition, this function sets the local name of each parameter which can be retrieved using the Parm_Getlname() function.

    • void Swig_cresult(Wrapper *w, DataType *t, char *resultname, char *decl)
      Generates the code needed to set the result of a wrapper function and performs all of the needed memory allocations for ANSI C (if necessary). t is the type of the result, resultname is the name of the result variable, and decl is a string that contains the C code which produces the result.

    • void Swig_cppresult(Wrapper *w, DataType *t, char *resultname, char *decl)
      Generates the code needed to set the result of a wrapper function and performs all of the needed memory allocations for C++ (if necessary). t is the type of the result, resultname is the name of the result variable, and decl is a string that contains the C code which produces the result.

    • Wrapper *Swig_cfunction_wrapper(char *fname, DataType *rtype, ParmList *parms, char *code)
      Create a wrapper around a normal function declaration. fname is the name of the wrapper, rtype is the return type, parms are the function parameters, and code is a string containing the code in the function body.

    • Wrapper *Swig_cmethod_wrapper(char *classname, char *methodname, DataType *rtype, DataType *parms, char *code)

    • char *Swig_cfunction_call(char *name, ParmList *parms) This function produces a string containing the code needed to call a C function. The string that is produced contains all of the transformations needed to convert pass-by-value into pass-by-reference as well as handle C++ references. Produces a string like "name(arg0, arg1, ..., argn)".
    Here is a short example showing how these functions could be used. Suppose you had a C function like this:
    double dot_product(Vector a, Vector b);
    
    Here's how you might write a really simple wrapper function
    ParmList *l = ... parameter list of the function ...
    DataType *t = ... return type of the function ...
    char     *name = ... name of the function ...
    Wrapper *w = NewWrapper();
    Printf(w->def,"void wrap_%s() {\n", name);
    
    /* Declare all of the local variables */
    Swig_cargs(w, l);
    
    /* Convert all of the arguments */
    ...
    
    /* Make the function call and declare the result variable */
    Swig_cresult(w,t,"result",Swig_cfunction(name,l));
    
    /* Convert the result into whatever */
    ...
    
    Printf(w->code,"}\n");
    Wrapper_print(w,out);
    
    The output of this would appear as follows:
    void wrap_dot_product() {
        Vector *arg0;
        Vector *arg1;
        double  result;
    
        ...
        result = dot_product(*arg0, *arg1);
        ...
    }
    
    Notice that the Swig_cargs(), Swig_cresult(), and Swig_cfunction() functions have taken care of the type conversions for the Vector type automatically.

    Notes:

    • The intent of these functions is to provide consistent handling of function parameters and return values so that language module writers don't have to worry about it too much.

    • These functions may be superseded by features in the new typemap system which provide hooks for specifying local variable declarations and argument conversions.

    6. Symbol Naming Guidelines for Generated C/C++ Code

    The C++ standard (ISO/IEC 14882:1998(E)) states:
    
    17.4.3.1.2 Global names [lib.global.names]
    
    1 Certain sets of names and function signatures are always reserved to the implementation:
    
        * Each name that contains a double underscore (__) or begins with an underscore followed 
          by an upper case letter (2.11) is reserved to the implementation for any use.
        * Each name that begins with an underscore is reserved to the implementation for use as 
          a name in the global namespace.165)
    
        165) Such names are also reserved in namespace ::std (17.4.3.1). [back to text] 
    
    
    When generating code it is important not to generate symbols that might clash with the code being wrapped. It is tempting to flout the standard or just use a symbol which starts with a single underscore followed by a lowercase letter in order to avoid name clashes. However even these legal symbols can also clash with symbols being wrapped. The following guidelines should be used when generating code in order to meet the standard and make it highly unlikely that symbol clashes will occur:

    For C++ code that doesn't attempt to mangle a symbol being wrapped (for example SWIG convenience functions):

    • Put symbols in the Swig namespace, for example class Swig::Director. Qualify using the Swig namespace whenever the symbol is referenced, even within the Swig namespace, for example new Swig::Director() not new Director().
    • Use swig_ as a prefix for all member variables and member functions that are involved in an inheritance chain with wrapped classes, for example Swig::Director::swig_get_up() and bool Swig::Director::swig_up.
    • Alternatively class names can be prefixed with Swig in the global namespace for example template<class T> class SwigValueWrapper.

    For code compiled as C or C++ that doesn't attempt to mangle a symbol being wrapped (for example SWIG convenience functions):

    • Use SWIG_ as a prefix for structures for example SWIG_JavaExceptions_t.
    • Use SWIG_ as a prefix for global functions for example SWIG_TypeRegister.
    • Use SWIG_ as a prefix for macros for example #define SWIG_PY_INT 1
    For code compiled as C or C++ that attempts to mangle a wrapped symbol:
    • Use SWIGxxx or Swigxxx as a prefix where xxx is chosen which would make SWIGxxx/Swigxxx a unique symbol in the global namespace, for example class SwigDirectorFoo when wrapping class Foo. Don't use a trailing underscore for the prefix as this may generate a double underscore when wrapping a symbol which starts with a single underscore.
    In the past SWIG has generated many symbols which flout the standard especially double underscores. In fact they may not all be rooted out yet, so please fix them when you see them.

    7. Debugging SWIG

    The DOH types used in the SWIG source code are all typedefined to void. Consequently, it is impossible for debuggers to automatically extract any information about DOH objects. The easiest approach to debugging and viewing the contents of DOH objects is to make a call into one of the family of SWIG print functions from the debugger. The "Debugging Functions" section in SWIG Parse Tree Handling lists them. It is sometimes easier to debug by placing a few calls to these functions in code of interest and recompile, especially if your debugger cannot easily make calls into functions within a debugged binary.

    The SWIG distribution comes with some additional support for the gdb debugger in the Tools/swig.gdb file. Follow the instructions in this file for 'installing'. This support file provides an easy way to call into some of the family of SWIG print functions via additional user-defined gdb commands. Some usage of the swigprint and locswigprint user-defined commands are demonstrated below.

    More often than not, a parse tree node needs to be examined. The session below displays the node n in one of the Java language module wrapper functions. The swigprint method is used to show the symbol name (symname - a DOH String type) and the node (n - a DOH Hash type).

    Breakpoint 1, JAVA::functionWrapper (this=0x97ea5f0, n=0xb7d2afc8) at Modules/java.cxx:799
    799	    String *symname = Getattr(n, "sym:name");
    (gdb) next
    800	    SwigType *t = Getattr(n, "type");
    (gdb) swigprint symname
    Shape_x_set
    (gdb) swigprint n
    Hash(0xb7d2afc8) {
      'membervariableHandler:view' : variableHandler, 
      'feature:except' : 0, 
      'name' : x, 
      'ismember' : 1, 
      'sym:symtab' : Hash(0xb7d2aca8) {......}, 
      'nodeType' : cdecl, 
      'nextSibling' : Hash(0xb7d2af98) {.............}, 
      'kind' : variable, 
      'variableHandler:feature:immutable' : <Object 'VoidObj' at 0xb7cfa008>, 
      'sym:name' : Shape_x_set, 
      'view' : membervariableHandler, 
      'membervariableHandler:sym:name' : x, 
      'membervariableHandler:type' : double, 
      'membervariableHandler:parms' : <Object 'VoidObj' at 0xb7cfa008>, 
      'parentNode' : Hash(0xb7d2abc8) {..............................}, 
      'feature:java:enum' : typesafe, 
      'access' : public, 
      'parms' : Hash(0xb7cb9408) {......}, 
      'wrap:action' : if (arg1) (arg1)->x = arg2;, 
      'type' : void, 
      'memberset' : 1, 
      'sym:overname' : __SWIG_0, 
      'membervariableHandler:name' : x, 
    }
    

    Note that all the attributes in the Hash are shown, including the 'sym:name' attribute which was assigned to the symname variable.

    Hash types can be shown either expanded or collapsed. When a Hash is shown expanded, all the attributes are displayed along with their values, otherwise a '.' replaces each attribute when collapsed. Therefore a count of the dots provides the number of attributes within an unexpanded Hash. Below shows the 'parms' Hash being displayed with the default Hash expansion of 1, then with 2 provided as the second argument to swigprint to expand to two Hash levels in order to view the contents of the collapsed 'nextSibling' Hash.

    (gdb) swigprint 0xb7cb9408
    Hash(0xb7cb9408) {
      'name' : self, 
      'type' : p.Shape, 
      'self' : 1, 
      'nextSibling' : Hash(0xb7cb9498) {...}, 
      'hidden' : 1, 
      'nodeType' : parm, 
    }
    (gdb) swigprint 0xb7cb9408 2
    Hash(0xb7cb9408) {
      'name' : self, 
      'type' : p.Shape, 
      'self' : 1, 
      'nextSibling' : Hash(0xb7cb9498) {
        'name' : x, 
        'type' : double, 
        'nodeType' : parm, 
      }, 
      'hidden' : 1, 
      'nodeType' : parm, 
    }
    

    The same Hash can also be displayed with file and line location information via the locswigprint command.

    (gdb) locswigprint 0xb7cb9408
    example.h:11: [Hash(0xb7cb9408) {
    Hash(0xb7cb9408) {
      'name' : self, 
      'type' : p.Shape, 
      'self' : 1, 
      'nextSibling' : Hash(0xb7cb9498) {...}, 
      'hidden' : 1, 
      'nodeType' : parm, 
    }]
    

    Tip: Commands in gdb can be shortened with whatever makes them unique and can be command completed with the tab key. Thus swigprint can usually be shortened to sw and locswigprint to loc. The help for each command can also be obtained within the debugging session, for example, 'help swigprint'.

    The sub-section below gives pointers for debugging DOH objects using casts and provides an insight into why it can be hard to debug SWIG without the family of print functions.

    7.1 Debugging DOH Types The Hard Way

    The DOH types used in SWIG are all typedefined to void and hence the lack of type information for inspecting types within a debugger. Most debuggers will however be able to display useful variable information when an object is cast to the appropriate type. Getting at the underlying C string within DOH types is cumbersome, but possible with appropriate casts. The casts below can be used in a debugger windows, but be sure to compile with compiler optimisations turned off before attempting the casts else they are unlikely to work. Even displaying the underlying string in a String * doesn't work straight off in all debuggers due to the multiple definitions of String as a struct and a void.

    Below are a list of common SWIG types. With each is the cast that can be used in the debugger to extract the underlying type information and the underlying char * string.

    • String *s;
    • (struct String *)((DohBase *)s)->data
      The underlying char * string can be displayed with
      (*(struct String *)(((DohBase *)s)->data)).str

    • SwigType *t;
    • (struct String *)((DohBase *)t)->data
      The underlying char * string can be displayed with
      (*(struct String *)(((DohBase *)t)->data)).str

    • const_String_or_char_ptr sc;
    • Either
      (*(struct String *)(((DohBase *)sc)->data)).str
      or
      (char *)sc
      will work depending on whether the underlying type is really a String * or char *.

    7.2 Debugging DOH memory allocation problems

    The DOH objects are reference counted and use pools for memory allocation. The implementation is in memory.c. When there are memory corruption problems, various memory allocator tools are normally used to diagnose problems. These can be used on SWIG and can be very useful. However, they won't necessarily find use of stale DOH objects, that is, DOH objects that are used after they have been deleted. This is because the DOH memory allocator grabs a chunk of memory from the C memory allocator and manages the usage internally. Stale DOH object usage can be checked for by defining DOH_DEBUG_MEMORY_POOLS in memory.c. If an attempt to use an object is made after the reference count is zero, an assertion is triggered instead of quietly re-using the stale object...

    swig: DOH/memory.c:91: DohCheck: Assertion `!DOH_object_already_deleted' failed.
    

    This can be memory intensive as previously used memory in the pool is not re-used so is only recommended for diagnosing memory corruption problems.


    Copyright (C) 1999-2010 SWIG Development Team. swig-4.0.2/Doc/Devel/migrate.txt0000644000175000017500000001122713667507523016322 0ustar williamwilliamSWIG1.3 Migration Guide (The not entirely complete guide to updating language modules to work with SWIG1.3). Dave Beazley August 15, 2000 1. Introduction --------------- Virtually all of SWIG's internal data structures have now been rewritten. Take everything you thought you knew about SWIG1.1 and throw it out. 2. DataTypes ------------ The old 'DataType' data structure is gone. Therefore, direct manipulation of 'is_pointer', 'implicit_ptr', and 'arraystr' attributes no longer applies. Sorry. Datatypes are now represented by the type 'SwigType' which has no public attributes. Actually, if you look at it closely, 'SwigType' is really just an alias for 'void' and if you look at it even closer than that you will realize that it's nothing more than a string! The string encoding of types is described in more detail in the file Source/Swig/stype.c and is not so important here. What is important is the functions used to produce various types of output: SwigType_str(type,name = 0); This produces an exact C representation of the datatype with all qualifiers, arrays, references, and so forth. name is an optional name that is given if you wanted to associate the type with a parameter name or something. SwigType_lstr(type,name = 0); This function takes a type and produces a C string containing a type suitable for assignment (appearing as an lvalue in an expression). To do this, certain things such as 'const', arrays, and references are stripped away or converted into pointers. SwigType_ltype(type); Returns a SwigType object corresponding to the type created by SwigType_lstr(). SwigType_lcaststr(type,name); Produces a string casting a value 'name' from the real datatype to the assignable type created by SwigType_lstr(). SwigType_rcaststr(type,name) Produces a string that casts a value 'name' from the type created by SwigType_lstr() to the real datatype. SwigType_manglestr(type) Produces the 'mangled' version of a datatype. Getting the 'type' code. Most language modules still operate by looking at special integer type codes. This interface is a little ragged and will probably go away at some point. However, for now the following function can be used to get the type code: int SwigType_type(type) The codes are the same as the before, except that there are a few special codes: T_STRING - The 'char *' type and variations. T_POINTER - Any pointer type (not char * though) T_REFERENCE - Any C++ reference T_ARRAY - Any array T_FUNCTION - A function (this is usually an error). Because of the special codes, it is no longer necessary to have code like this: if ((t->is_pointer == 1) and (t->type == T_CHAR)) { ... get a string ... } Instead, just use the type code above like this: switch(SwigType_type(type)) { case T_STRING: ... get a string ... break; case T_POINTER: ... get a pointer ... break; } There are about 2-dozen type manipulation functions that could also be useful. See Source/Swig/swig.h and Source/Swig/stype.c. 3. Parameter Lists ------------------ The ParmList data structure is gone. In reality, parameter lists are nothing more than a linked list of parameters. The proper way to iterate over this list and get parameter values is as follows: ParmList *l; Parm *p; for (p = l; p; p = Getnext(p)) { SwigType *pt = Gettype(p); /* Get parameter type */ String *pn = Getname(p); /* Get parameter name */ String *value = Getvalue(p); /* Get parameter value */ ... do whatever ... } 4. Typemaps ----------- Typemaps more or less work. However, the interface has changed slightly. Instead of typemap_lookup("in","python",type,pname,"$source","$target",wrapper); the function is Swig_typemap_lookup("in",type,pname,"$source","$target",wrapper); There are a variety of other changes to typemaps (see CHANGES). 5. Use of new types ------------------- When possible, language modules should try to use the built in String, List, and Hash objects instead of C arrays or 'char *'. This will probably require a detailed pass through the code with an eye towards cleanup. 6. Miscellaneous ---------------- Language modules no longer need to concern themselves with formatting the wrapper code they produce (provided you are using the special Wrapper object). The function Wrapper_print() passes everything through a pretty-printer that automatically performs indentation and tries to clean things up. This especially works well when there are lots of typemaps. swig-4.0.2/Doc/Devel/scanner.html0000644000175000017500000002420113667507523016444 0ustar williamwilliam SWIG C Scanner

    SWIG C/C++ Scanning

    David M. Beazley
    dave-swig@dabeaz.com
    January 11, 2007

    Introduction

    This document describes functions that can be used to tokenize C/C++ input text. These functions are relatively low-level and are meant to be used in the implementation of scanners that can be plugged into yacc or used for other purposes. For instance, the preprocessor uses these functions to evaluate and test constant expressions.

    All of these functions are declared in Source/Swig/swigscan.h. This API is considered to be stable.

    Creation and Deletion of Scanners

    The following functions are used to create and destroy a scanner object. More than one scanner object can be created and used as necessary.

    Scanner *NewScanner()

    Creates a new scanner object. The scanner contains initially contains no text. To feed text to the scanner use Scanner_push().

    Scanner *DelScanner()

    Deletes a scanner object.

    Scanner Functions

    void Scanner_clear(Scanner *s)

    Clears all text from the scanner. This can be used to reset a scanner to its initial state, ready to receive new input text.

    void Scanner_push(Scanner *s, String *text)

    Pushes an input string into the scanner. Subsequent tokens will be returned from the new string. If the scanner is already processing a string, the pushed string takes precedence--in effect, interrupting the scanning of the previous string. This behavior is used to implement certain SWIG features such as the %inline directive. Once the pushed string has been completely scanned, the scanner will return to scanning the previous string (if any). The scanning of text relies upon the DOH file interface to strings (Getc(), Ungetc(), etc.). Prior to calling this function, the input string should be set so that its file pointer is in the location where you want scanning to begin. You may have to use Seek() to set the file pointer back to the beginning of a string prior to using this function.

    void Scanner_pushtoken(Scanner *s, int tokvalue, String_or_char *val)

    Pushes a token into the scanner. This exact token will be returned by the next call to Scanner_token(). tokvalue is the integer token value to return and val is the token text to return. This function is only used to handle very special parsing cases. For instance, if you need the scanner to return a fictitious token into order to enter a special parsing case.

    int Scanner_token(Scanner *s)

    Returns the next token. An integer token code is returned (see table below) on success. If no more input text is available 0 is returned. If a scanning error occurred, -1 is returned. In this case, error information can be obtained using Scanner_errinfo().

    String *Scanner_text(Scanner *s)

    Returns the scanned text corresponding to the last token returned by Scanner_token(). The returned string is only valid until the next call to Scanner_token(). If you need to save it, make a copy.

    void Scanner_skip_line(Scanner *s)

    Skips to the end of the current line. The text skipped can be obtained using Scanner_text() afterwards.

    void Scanner_skip_balanced(Scanner *s, int startchar, int endchar)

    Skips to the end of a block of text denoted by starting and ending characters. For example, { and }. The function is smart about how it skips text. String literals and comments are ignored. The function also is aware of nesting. The skipped text can be obtained using Scanner_text() afterwards. Returns 0 on success, -1 if no matching endchar could be found.

    void Scanner_set_location(Scanner *s, int startchar, int endchar)

    Changes the current filename and line number of the scanner.

    String *Scanner_file(Scanner *s)

    Gets the current filename associated with text in the scanner.

    int Scanner_line(Scanner *s)

    Gets the current line number associated with text in the scanner.

    int Scanner_start_line(Scanner *s)

    Gets the starting line number of the last token returned by the scanner.

    void Scanner_idstart(Scanner *s, char *idchar)

    Sets additional characters (other than the C default) that may be used to start C identifiers. idchar is a string containing the characters (e.g., "%@"). The purpose of this function is to up special keywords such as "%module" or "@directive" as simple identifiers.

    String *Scanner_errmsg(Scanner *s)

    Returns the error message associated with the last scanner error (if any). This will only return a meaningful result if Scanner_token() returned -1.

    int Scanner_errline(Scanner *s)

    Returns the line number associated with the last scanner error (if any). This will only return a meaningful result if Scanner_token() returned -1. The line number usually corresponds to the starting line number of a particular token (e.g., for unterminated strings, comments, etc.).

    int Scanner_isoperator(int tokval)

    A convenience function that returns 0 or 1 depending on whether tokval is a valid C/C++ operator (i.e., a candidate for operator overloading).

    void Scanner_freeze_line(int val)

    Freezes the current line number depending upon whether or not val is 1 or 0. When the line number is frozen, newline characters will not result in updates to the line number. This is sometimes useful in tracking line numbers through complicated macro expansions.

    Token Codes

    The following table shows token codes returned by the scanner. These are integer codes returned by the Scanner_token() function.
    Token code                   C Token
    -------------------------    -------------
    SWIG_TOKEN_LPAREN            (
    SWIG_TOKEN_RPAREN            )
    SWIG_TOKEN_SEMI              ; 
    SWIG_TOKEN_COMMA             , 
    SWIG_TOKEN_STAR              * 
    SWIG_TOKEN_TIMES             *
    SWIG_TOKEN_LBRACE            { 
    SWIG_TOKEN_RBRACE            } 
    SWIG_TOKEN_EQUAL             = 
    SWIG_TOKEN_EQUALTO           == 
    SWIG_TOKEN_NOTEQUAL          != 
    SWIG_TOKEN_PLUS              + 
    SWIG_TOKEN_MINUS             - 
    SWIG_TOKEN_AND               & 
    SWIG_TOKEN_LAND              && 
    SWIG_TOKEN_OR                | 
    SWIG_TOKEN_LOR               || 
    SWIG_TOKEN_XOR               ^ 
    SWIG_TOKEN_LESSTHAN          < 
    SWIG_TOKEN_GREATERTHAN       > 
    SWIG_TOKEN_LTEQUAL           <= 
    SWIG_TOKEN_GTEQUAL           >= 
    SWIG_TOKEN_NOT               ~ 
    SWIG_TOKEN_LNOT              ! 
    SWIG_TOKEN_LBRACKET          [ 
    SWIG_TOKEN_RBRACKET          ] 
    SWIG_TOKEN_SLASH             / 
    SWIG_TOKEN_DIVIDE            /
    SWIG_TOKEN_BACKSLASH         \ 
    SWIG_TOKEN_POUND             # 
    SWIG_TOKEN_PERCENT           % 
    SWIG_TOKEN_MODULO            %
    SWIG_TOKEN_COLON             : 
    SWIG_TOKEN_DCOLON            :: 
    SWIG_TOKEN_DCOLONSTAR        ::*
    SWIG_TOKEN_LSHIFT            << 
    SWIG_TOKEN_RSHIFT            >> 
    SWIG_TOKEN_QUESTION          ? 
    SWIG_TOKEN_PLUSPLUS          ++ 
    SWIG_TOKEN_MINUSMINUS        -- 
    SWIG_TOKEN_PLUSEQUAL         += 
    SWIG_TOKEN_MINUSEQUAL        -= 
    SWIG_TOKEN_TIMESEQUAL        *= 
    SWIG_TOKEN_DIVEQUAL          /= 
    SWIG_TOKEN_ANDEQUAL          &= 
    SWIG_TOKEN_OREQUAL           |= 
    SWIG_TOKEN_XOREQUAL          ^= 
    SWIG_TOKEN_LSEQUAL           <<= 
    SWIG_TOKEN_RSEQUAL           >>= 
    SWIG_TOKEN_MODEQUAL          %= 
    SWIG_TOKEN_ARROW             -> 
    SWIG_TOKEN_ARROWSTAR         ->* 
    SWIG_TOKEN_PERIOD            . 
    SWIG_TOKEN_AT                @ 
    SWIG_TOKEN_DOLLAR            $ 
    SWIG_TOKEN_ENDLINE           Literal newline
    SWIG_TOKEN_ID                identifier 
    SWIG_TOKEN_FLOAT             Floating point with F suffix (e.g., 3.1415F)
    SWIG_TOKEN_DOUBLE            Floating point (e.g., 3.1415 )
    SWIG_TOKEN_INT               Integer (e.g., 314)
    SWIG_TOKEN_UINT              Unsigned integer (e.g., 314U)
    SWIG_TOKEN_LONG              Long integer (e.g., 314L) 
    SWIG_TOKEN_ULONG             Unsigned long integer (e.g., 314UL)
    SWIG_TOKEN_LONGLONG          Long long integer (e.g., 314LL )
    SWIG_TOKEN_ULONGLONG         Unsigned long long integer (e.g., 314ULL) 
    SWIG_TOKEN_CHAR              Character literal in single quotes ('c')
    SWIG_TOKEN_STRING            String literal in double quotes ("str")
    SWIG_TOKEN_RSTRING           Reverse quote string (`str`)
    SWIG_TOKEN_CODEBLOCK         SWIG code literal block %{ ... %}
    SWIG_TOKEN_COMMENT           C or C++ comment  (// or /* ... */)
    SWIG_TOKEN_ILLEGAL           Illegal character
    
    Notes
    • When more than one token code exist for the same token text, those codes are identical (e.g., SWIG_TOKEN_STAR and SWIG_TOKEN_TIMES).

    • String literals are returned in their exact representation in which escape codes (if any) have been interpreted.

    • All C identifiers and keywords are simply returned as SWIG_TOKEN_ID. To check for specific keywords, you will need to add extra checking on the returned text.

    • C and C++ comments include the comment starting and ending text (e.g., "//", "/*").

    • The maximum token integer value is found in the constant SWIG_MAXTOKENS. This can be used if you wanted to create an array or table for the purposes of remapping tokens to a different set of codes. For instance, if you are using these functions to write a yacc-compatible lexer.
    swig-4.0.2/Doc/Devel/parm.html0000644000175000017500000000507613667507523015763 0ustar williamwilliam SWIG Parameter Handling

    SWIG Parameter Handling

    David M. Beazley
    dave-swig@dabeaz.com
    January 9, 2007

    Introduction

    This document describes the functions related to management of function parameters and parameter lists in the SWIG core. These functions are declared in Source/Swig/swigparm.h. This API is considered to be stable.

    Parameters

    The following utility functions are used to create and copy individual parameters. In their most basic form, a parameter merely contains a type, a name, and an optional default value.

    Parm *NewParm(SwigType *type, const String_or_char *name)

    Creates a new parameter object with type type and name name. The type is stored in the attribute "type" and the name is stored in the attribute "name".

    Parm *CopyParm(Parm *p)

    Copies a parameter object. All string attributes are copied in the process of making the copy. However, no complex attributes (lists, hashes, etc.) are copied.

    Parameter Lists

    ParmList *CopyParmList(ParmList *p)

    Creates a copy of a parameter list. A parameter list is merely a linked list of parameters created by NewParm().

    ParmList *CopyParmListMax(ParmList *p, int count)

    Copies at most count parameters from the parameter list p.

    int ParmList_len(ParmList *p)

    Returns the total number of parameters in a parameter list.

    int ParmList_numrequired(ParmList *p)

    Returns the number of required parameters in a parameter list. This pertains to invoking a function/method in C/C++.

    int ParmList_has_defaultargs(ParmList *p)

    Returns 1 if the parameter list has any default arguments. Otherwise returns 0.

    Code Generation Functions

    String *ParmList_str(ParmList *p)

    Creates a C prototype string of the parameters, but without any default values.

    String *ParmList_str_defaultargs(ParmList *p)

    Creates a C prototype string of the parameters and includes the default values (if any).

    String *ParmList_protostr(ParmList *p)

    Creates a C prototype string of the parameters.
    swig-4.0.2/Doc/Devel/runtime.txt0000644000175000017500000001745513667507523016366 0ustar williamwilliamThis file describes the necessary functions and interfaces a language module needs to implement to take advantage of the run time type system. I assume you have read the run-time section of the Typemaps chapter in the SWIG documentation. Last updated: February 23, 2005 The file we are concerned with here should be named langrun.swg. A good example of a simple file is the Lib/mzscheme/mzrun.swg file. First, a few requirements and notes: 1) Every function in this file should be declared static. 2) It should be inserted into the runtime section of the _wrap file from your config file. The Lib/swigrun.swg file should be included before this file. That is, you need to have %runtime "swigrun.swg" %runtime "langrun.swg" 3) You must also include the swiginit.swg file in the init section of the wrapper. That is, you should have %insert(init) "swiginit.swg" 4) From module.cxx, you need to call the SwigType_emit_type_table function, as well as register types with SwigType_remember or SwigType_remember_clientdata 5) By convention, all functions in this file are of the form SWIG_Language_Whatever, and #defines are used to rename SWIG API functions to these function names 6) You need to call void SWIG_InitializeModule(void *clientdata) from your init function. 7) You need to implement the runtimeCode() and defaultExternalRuntimeFilename() functions inside module.cxx. runtimeCode should return all the language specific runtime code as a string, and defaultExternalRuntimeFilename should return a string for the default name of the external runtime header. This is usually "swigpyrun.h", where "py" is replaced by the language name. These two functions are used by the -external-runtime argument. ------------------------------------------------------------------------------- Required Functions ------------------------------------------------------------------------------- swig_module_info *SWIG_GetModule(void *clientdata); void SWIG_SetModule(void *clientdata, swig_module_info *mod); The SetModule function should store the mod argument into some globally accessible variable in the target language. The action of these two functions is to provide a way for multiple modules to share information. The SetModule function should create a new global var named something like "swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME SWIG_RUNTIME_VERSION is currently defined as "2", and SWIG_TYPE_TABLE_NAME is defined by the -DSWIG_TYPE_TABLE=mytable option when compiling the wrapper. Alternatively, if the language supports modules, a module named "swig_runtime_data" SWIG_RUNTIME_VERSION can be created, and a global variable named "type_table" SWIG_TYPE_TABLE_NAME can be created inside it. The most common approach is to store the mod pointer in some global variable in the target language, but if the language provides an alternative place to store data then that is good too. The way the code is set up, SetModule should only be called when GetModule returns NULL, and if SetModule is called a second time, the behavior is undefined. Just make sure it doesn't crash in the random chance occurrence that SetModule is called twice. There are two options here. 1) The preferred approach is for GetModule and SetModule to not require a clientdata pointer. If you can at all avoid it, please do so. Here, you would write swig_module_info *SWIG_Language_GetModule(); void SWIG_Language_SetModule(swig_module_info *mod); and then add #define SWIG_GetModule(clientdata) SWIG_Language_GetModule() #define SWIG_SetModule(cd, ptr) SWIG_Language_SetModule(ptr) You would then call SWIG_InitializeModule(0) 2) If GetModule and SetModule need to take a custom pointer (most notably an environment pointer, see tcl or mzscheme), then you should write swig_module_info *SWIG_Language_GetModule(void *clientdata) void SWIG_Language_SetModule(void *clientdata, swig_module_info *mod); and also define #define SWIG_GetModule(cd) SWIG_Language_GetModule(cd) #define SWIG_SetModule(cd, ptr) SWIG_Language_SetModule(cd, ptr) #define SWIG_MODULE_CLIENTDATA_TYPE Whatever SWIG_MODULE_CLIENTDATA_TYPE should be defined to whatever the type of clientdata is. You would then call SWIG_InitializeModule(clientdata), and clientdata would get passed to GetModule and SetModule. clientdata will not be stored and will only be referenced during the InitializeModule call. After InitializeModule returns, clientdata does not need to be valid any more. This method is not preferred, because it makes external access to the type system more complicated. See the Modules chapter of the documentation, and read the "External access to the run-time" section. Then take a look at Lib/runtime.swg. Anybody that calls SWIG_TypeQuery needs to pass along the clientdata pointer, and that is the reason for defining SWIG_MODULE_CLIENTDATA_TYPE. ------------------------------------------------------------------------------- Standard Functions ------------------------------------------------------------------------------- These functions are not required and their API is not formalized, but almost all language modules implement them for consistency across languages. Throughout this discussion, I will use LangType to represent the underlying language type (Scheme_Object * in mzscheme, PyObject * in python, etc) LangObj SWIG_NewPointerObj(void *ptr, swig_type_info *type, int flags); Create and return a new pointer object that has both ptr and type. For almost all language modules, flags is used for ownership. If flags==1, then the created pointer should be registered to be garbage collected. int SWIG_ConvertPtr(LangType obj, void **result, swig_type_info *type, int flags); Convert a language wrapped pointer into a void *. The pointer is returned in result, and the function should return 0 on success, non-zero on error. A sample ConvertPtr is given here: swig_cast_info *cast; if () { cast = SWIG_TypeCheck(, type); cast = SWIG_TypeCheckStruct(, type); if (cast) { *result = SWIG_TypeCast(cast, ); return 0; } } return 1; Either TypeCheck or TypeCheckStruct can be called, depending on how the pointer is wrapped in langtype. If obj stores the void pointer and the type name, then the TypeCheck function should be used, while if obj stores the void pointer and a pointer to the swig_type_info structure, then the TypeCheckStruct function should be called. The TypeCheckStruct is slightly faster, since it does a pointer comparison instead of a strcmp. The flag argument to ConvertPtr is used in some languages for disowning a pointer. If the wrapped C function is taking ownership of the pointer (that means, the wrapped C function is responsible for deleting the object), then that pointer should be removed from the garbage collector. We do that in the ConvertPtr function. The pointer is still valid in the target language, but when the target language type is garbage collected, it will not call the associated destructor. Languages have a special typemap called DISOWN that can be applied which passes this argument. All the languages have the flags argument for consistency, and the flags argument can be ignored or used for some other purpose. void *SWIG_MustGetPtr(LangType obj, swig_type_info *type, int flags, int argnum, const char *func_name) { void *result; if (SWIG_ConvertPtr(s, &result, type, flags)) { generate runtime type error ("Error in func_name, expected a" + type->str ? type->str : "void *" + "at argument number" + argnum); } return result; } This function is optional, and the number and type of parameters can be different, but is useful for typemap purposes: %typemap(in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, 0, $argnum, FUNC_NAME); } swig-4.0.2/Doc/Devel/plan-gsoc-2012.txt0000644000175000017500000002736313667507523017147 0ustar williamwilliam Project Plan ============ SWIG Code Comments Google Summer of Code 2012 This document describes goals for the Google Summer of Code 2012, SWIG code documentation project. Author: Marko Klopcic, Dmitry Kabak Introduction ============ The goal of this project is _not_ to translate _any_ possible Doxygen formatted comment to JavaDoc or PyDoc, but to make it possible to translate a subset of comment types in C/C++ code to JavaDoc and PyDoc. Covering all the Doxygen functionality would be to complex for the limited time. However, the code must be flexible so that implementing missing features would not require redesign of the comment handling code in SWIG. There will also be a possibility to add untranslated comments to Java and Python code (## comments, see Doxygen manual), if the user will prefer to use Doxygen on the generated code. Note: '-OK-' tick below means that the item is implemented, committed and working. Abbreviations: JD - JavaDoc PD - PyDoc Functionality ============= Types of comments ----------------- Note: See 'http://www.stack.nl/~dimitri/doxygen/docblocks.html' for the detailed description of Doxygen syntax and terms used in this section. 1. -OK- Only JavaDoc (/** */) and Qt (/*! */) styles of comment blocks will be supported by SWIG translator. 2. -OK- The following doc after members will be supported: int var; ///< Detailed description after the member //!< int var; //!< Brief description after the member int var; ///< Brief description after the member 3. -OK- Only comments before or after declaration/definition will be supported. Comments with structural commands will be ignored (warning will be written). (What about writing them to 'package.info.java' for JD?) Tags ---- This section contains all doxygen tags taken from http://www.stack.nl/~dimitri/doxygen/commands.html. If a tag is marked as 'ignored', then the tag is ignored, but the text is copied to the destination documentation. 'Not implemented' means that the tag with it's contents is stripped out of the output. Doxygen tags: All tags: -OK- \a - translated to in JD, surrounded with _ in PD \addindex - ignored \addtogroup - ignored \anchor - ignored, not supported by JD and PD \arg - equivalent to \li \attention - ignored \authors, \author - translated to @author in JD, 'Author:' in PD \b - in JD, surrounded with __ in PD \brief - ignored \bug - ignored \c - translated to in JD, ignored in PD \callgraph - ignored, not supported by JD and PD \callergraph - ignored, not supported by JD and PD \category - ignored, used only in Objective C \cite - translated to in JD, single quotes in PD \class - ignored (structural command) \code - translated to {@code ...} in JD, ignored in PD \cond - translated to 'Conditional comment: '. Later SWIG may support definitions of conditions in config file. \copybrief - ignored. Later SWIG may support this command by performing copy \copydetails - ignored. Later SWIG may support this command by performing copy \copydoc - ignored. Later SWIG may support this command by performing copy \copyright - replaced with text 'Copyright' in PD and PD \date - ignored \def - ignored (structural command) \defgroup - not supported \deprecated - translated to @deprecated in JD, 'Deprecated:' in PD \details - ignored \dir - not supported \dontinclude - not supported \dot - not supported. Later SWIG may call dot and produce the graph image to include in JD and PD \dotfile - see note for \dot \e - equivalent \a \else - see note for \cond \elseif - see note for \cond \em - equivalent to \a \endcode - see note for \code \endcond - translated to 'End of conditional comment: '. Later SWIG may support definitions of conditions in config file. \enddot - see note for \dot \endhtmlonly - ignored \endif - see note for \cond \endinternal - ignored \endlatexonly - ignored \endlink - see note for \link \endmanonly - ignored \endmsc - see note for \msc \endrtfonly - ignored \endverbatim - see note for \verbatim \endxmlonly - ignored \enum - ignored (structural command) \example - translated to 'Example:' in JD and PD \exception - equivalent to throws, but translates to @exception in JD \extends - not supported \f$ - ignored. Later swig may call LATeX to produce bitmaps with formulas to include in JD and PD \f[ - see note for \f$ \f] - see note for \f$ \f{ - see note for \f$ \f} - see note for \f$ \file - ignored (structural command) \fn - ignored (structural command) \headerfile - not supported \hideinitializer - not supported \htmlinclude - not supported \htmlonly - ignored \if - see note for \cond \ifnot - see note for \cond \image - translated to in JD only when target=HTML, translated to 'Image: filename(Title)' \implements - not supported \include - not supported \includelineno - not supported \ingroup - not supported. Later swig may print group names as plain text in comments like 'Code group: something' in both JD and PD \internal - ignored \invariant - ignored \interface - ignored (structural command) \latexonly - ignored \li - trabslated to
  • in JD, ignored in PD \line - not supported \link - translated to {@link ...} in JD, ignored in PD \mainpage - ignored \manonly - ignored \memberof - not supported \msc - not supported. Later SWIG may call dot and produce the graph image to include in JD and PD \mscfile - see note for \msc \n - prints the new line \name - ignored \namespace - included in package-info.java if nspace feature is enabled, otherwise ignored, ignored in PD \nosubgrouping - ignored \note - translated to 'Note:' in both JD and PD \overload - prints 'This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.' to the output in both JD and PD \p - equivalent to \c \package - is kept same in JD (it is already a JD tag), ignored in PD \page - ignored \par - translated to

    in JD, 'Title: ...' in PD \paragraph - ignored \param - translated to @param in JD, special formatting in PD \post - ignored \pre - ignored \private - ignored \privatesection - ignored \property - ignored \protected - ignored \protectedsection - ignored \protocol - ignored (Objective-C tag) \public - ignored \publicsection - ignored \ref - ignored, not supported by JD and PD \related - ignored \relates - ignored \relatedalso - ignored \relatesalso - ignored \remark - translated to 'Remarks:' in both JD and PD \remarks - equivalent to remark \result - translated to @return in JD, 'Return:' in PD \return - equivalent to result \returns - equivalent to result \retval - ignored \rtfonly - ignored \sa - translated to @see in JD, 'See also:' in PD \section - not supported \see - equivalent to \sa \short - equivalent to \brief \showinitializer - not supported \since - translated to @since in JD, 'Since:' in PD \skip - not supported \skipline - not supported \snippet - not supported \struct - ignored (structural command) \subpage - not supported \subsection - not supported \subsubsection - not supported \tableofcontents - not supported \test - ignored \throw - translated to @throws in JD, 'Throws:' in PD \throws - equivalent to \throw \todo - translated to 'TODO:' in both JD and PD \tparam - similar to \arg \typedef - ignored (structural command) \union - ignored (structural command) \until - not supported \var - ignored (structural command) \verbatim - translated to {@literal ...} in JD, ignored in PD \verbinclude - ignored \version - translated to @version in JD, 'Version:' in PD \warning - translated to 'Warning:' in both JD and PD \weakgroup - not supported \xmlonly - ignored \xrefitem - ignored \$ - this and all the others below: these commands insert single char, it is escaped as HTML char in JD, kept as-is in PD \@ \\ \& \~ \< \> \# \% \" \. \:: Optional functionality ====================== That section describes some complex cases where the current code does not behave really well. Like a short to-do list of special cases. -OK- When translating functions with default parameters in swig to java, it creates overloaded functions with all the parameters except the default ones. We need to copy the doxygen comment to such functions and correct the list of @param tags. -OK- In doxygen there is a special tags (and even a special option) to create links to some code members from the current comment. Sometimes it needs a type of parameters specified because of the overloaded functions. And the same linking tags are supported in JD, but it has a completely different typesystem, so we need to translate the types of function parameters in comments also. For example: {@link MyClass#doSomething(const std::string &)} does not make sense in Java, so the type should be converted. {@link MyClass#doSomething(String)} Tests ===== The following test cases will be implemented: -OK- Class comments. -OK- Struct comments. -OK- Enum comments. -OK- Function comments. -OK- Var comments. -OK- Class attributes, comment before and after declaration. -OK- Class methods, comment of parameters in function comment. -OK- Class methods, comment of parameters after parameter declaration. -OK- Struct attributes, comment before and after declaration. -OK- Struct methods, comment of parameters in function comment. -OK- Struct methods, comment of parameters after parameter declaration. -OK- Enum items JD and Qt style, comment before items -OK- Enum items JD and Qt style, comment after items -OK- Class comment, with all supported tags. -OK- Class comment, with all doxygen tags, including ignored ones. The list of all tests, in form of shell commands to make it simple to test project by copying the text below into terminal program. make doxygen_parsing.cpptest -s make doxygen_translate.cpptest -s make doxygen_translate_all_tags.cpptest -s make doxygen_basic_translate.cpptest -s make doxygen_basic_notranslate.cpptest -s make doxygen_translate_links.cpptest -s make doxygen_tricky_constructs.cpptest -s Refactoring =========== All the code in directory _Doxygen_ should be refactored: -OK- all methods should be class members -OK- most static methods should be normal members -OK- replace C arrays of strings and sequential searches with STL data structures and algorithms. -OK- use singletons instead of class instantiaion for each comment found. Documentation ============= SWIG documentation will contain: -OK- command line options -OK- list of implemented features (types and placements of comments) -OK- list of unimplemented features (types and placements of comments) -OK- list of tags and their translations (all Doxygen tags). -OK- some amount of debugging and development information swig-4.0.2/Doc/Devel/cmdopt.html0000644000175000017500000000433113667507523016303 0ustar williamwilliam SWIG Command Line Handling

    SWIG Command Line Handling

    David M. Beazley
    dave-swig@dabeaz.com
    December, 2006

    Introduction

    This document describes the functions related to the handling of command line options passed to SWIG. These functions are defined in the header file Source/Swig/swigopt.h. This API is considered to be stable.

    Initialization

    Upon SWIG startup, the following function is called:

    void Swig_init_args(int argc, char **argv_)

    Registers command line options with the SWIG core. This creates an internal array that is used by other functions to mark whether or not a particular command line option was used. This is ultimately used to issue error messages about unused or unknown command line options. This function is currently invoked in the SWIG main() function that is found in Source/Modules/swigmain.cxx.

    Argument Marking

    As command line options are processed by language modules, the following functions are used to mark the arguments as used:

    void Swig_mark_arg(int n)

    Mark argument number n as used.

    int Swig_check_marked(int n)

    Check to see if argument n has been marked. Returns 0 or 1.

    Argument Checking

    The following function is used to check all of the command line options after parsing. It looks at the marked list and issues an error message if any unconsumed arguments are found.

    void Swig_check_options()

    Checks all command line options to see if they have all been processed. If not, an error message is generated and execution terminates with a call to exit(). This function is currently invoked in Source/Modules/main.cxx just before SWIG starts any processing of input files.

    Utility Function

    void Swig_arg_error())

    A generic function that issues an error message about being unable to parse command line options. SWIG is terminated by a call to exit(). swig-4.0.2/Doc/README0000644000175000017500000000040013667507523013741 0ustar williamwilliamDoc/Manual - Latest version of the SWIG user manual Doc/Devel - Developer documentation concerning SWIG internals. (not necessarily up to date) Open the index.html file in each of these directories with a web browser. swig-4.0.2/configure.ac0000644000175000017500000025571013667507523014662 0ustar williamwilliamdnl Process this file with autoconf to produce a configure script. dnl The macros which aren't shipped with the autotools are stored in the dnl Tools/config directory in .m4 files. AC_INIT([swig],[4.0.2],[http://www.swig.org]) AC_PREREQ(2.60) AC_CONFIG_SRCDIR([Source/Swig/swig.h]) AC_CONFIG_AUX_DIR([Tools/config]) AC_CONFIG_HEADERS([Source/Include/swigconfig.h]) AC_CANONICAL_HOST AM_INIT_AUTOMAKE dnl Some extra defines for the config file AH_BOTTOM([ /* Deal with attempt by Microsoft to deprecate C standard runtime functions */ #if defined(_MSC_VER) # define _CRT_SECURE_NO_DEPRECATE #endif ]) dnl Check for programs that a user requires to build SWIG AC_PROG_CC AC_PROG_CXX AM_PROG_CC_C_O # Needed for subdir-objects in AUTOMAKE_OPTIONS AC_COMPILE_WARNINGS # Increase warning levels AC_DEFINE_UNQUOTED(SWIG_CXX, ["$CXX"], [Compiler that built SWIG]) AC_DEFINE_UNQUOTED(SWIG_PLATFORM, ["$host"], [Platform that SWIG is built for]) dnl Checks for header files. AC_HEADER_STDC dnl Look for popen AC_ARG_WITH(popen, AS_HELP_STRING([--without-popen], [Disable popen]), with_popen="$withval") if test x"${with_popen}" = xno ; then AC_MSG_NOTICE([Disabling popen]) else AC_CHECK_FUNC(popen, AC_DEFINE(HAVE_POPEN, 1, [Define if popen is available]), AC_MSG_NOTICE([Disabling popen])) fi dnl PCRE AC_ARG_WITH([pcre], [AS_HELP_STRING([--without-pcre], [Disable support for regular expressions using PCRE])], [], [with_pcre=yes]) AC_MSG_CHECKING([whether to enable PCRE support]) AC_MSG_RESULT([$with_pcre]) dnl To make configuring easier, check for a locally built PCRE using the Tools/pcre-build.sh script if test x"${with_pcre}" = xyes ; then AC_MSG_CHECKING([whether to use local PCRE]) local_pcre_config=no if test -z $PCRE_CONFIG; then if test -f `pwd`/pcre/pcre-swig-install/bin/pcre-config; then PCRE_CONFIG=`pwd`/pcre/pcre-swig-install/bin/pcre-config local_pcre_config=$PCRE_CONFIG fi fi AC_MSG_RESULT([$local_pcre_config]) fi AS_IF([test "x$with_pcre" != xno], [AX_PATH_GENERIC([pcre], [], dnl Minimal version of PCRE we need -- accept any [], dnl custom sed script for version parsing is not needed [AC_DEFINE([HAVE_PCRE], [1], [Define if you have PCRE library]) LIBS="$LIBS $PCRE_LIBS" CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS" ], [AC_MSG_FAILURE([ Cannot find pcre-config script from PCRE (Perl Compatible Regular Expressions) library package. This dependency is needed for configure to complete, Either: - Install the PCRE developer package on your system (preferred approach). - Download the PCRE source tarball, build and install on your system as you would for any package built from source distribution. - Use the Tools/pcre-build.sh script to build PCRE just for SWIG to statically link against. Run 'Tools/pcre-build.sh --help' for instructions. (quite easy and does not require privileges to install PCRE on your system) - Use configure --without-pcre to disable regular expressions support in SWIG (not recommended).]) ]) ]) dnl CCache AC_ARG_ENABLE([ccache], AS_HELP_STRING([--disable-ccache], [disable building and installation of ccache-swig executable (default enabled)]), [enable_ccache=$enableval], [enable_ccache=yes]) AC_MSG_CHECKING([whether to enable ccache-swig]) AC_MSG_RESULT([$enable_ccache]) if test "$enable_ccache" = yes; then AC_CONFIG_SUBDIRS(CCache) ENABLE_CCACHE=1 fi AC_SUBST(ENABLE_CCACHE) echo "" echo "Checking packages required for SWIG developers." echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball" echo "" AC_PROG_YACC echo "" echo "Checking for installed target languages and other information in order to compile and run" echo "the examples and test-suite invoked by 'make check'." echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball" echo "" dnl Some test cases require Boost AX_BOOST_BASE(,,,) AC_SUBST(BOOST_CPPFLAGS) dnl Info for building shared libraries ... in order to run the examples # SO is the extension of shared libraries (including the dot!) AC_MSG_CHECKING(SO) if test -z "$SO" then case $host in *-*-hp*) SO=.sl;; *-*-darwin*) SO=.bundle;; *-*-cygwin* | *-*-mingw*) SO=.dll;; *) SO=.so;; esac fi AC_MSG_RESULT($SO) # LDSHARED is the ld *command* used to create shared library # -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5 # (Shared libraries in this instance are shared modules to be loaded into # Python, as opposed to building Python itself as a shared library.) AC_MSG_CHECKING(LDSHARED) if test -z "$LDSHARED" then case $host in *-*-aix*) LDSHARED="\$(srcdir)/ld_so_aix \$(CC)";; *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then LDSHARED="$CC -shared" else if test "cl" = $CC ; then # Microsoft Visual C++ (MSVC) LDSHARED="$CC -nologo -LD" else # Unknown compiler try gcc approach LDSHARED="$CC -shared" fi fi ;; *-*-irix5*) LDSHARED="ld -shared";; *-*-irix6*) LDSHARED="ld ${SGI_ABI} -shared -all";; *-*-sunos4*) LDSHARED="ld";; *-*-solaris*) LDSHARED="ld -G";; *-*-hp*) LDSHARED="ld -b";; *-*-osf*) LDSHARED="ld -shared -expect_unresolved \"*\"";; *-sequent-sysv4) LDSHARED="ld -G";; *-*-next*) if test "$ns_dyld" then LDSHARED='$(CC) $(LDFLAGS) -bundle -prebind' else LDSHARED='$(CC) $(CFLAGS) -nostdlib -r' fi if test "$with_next_framework" ; then LDSHARED="$LDSHARED \$(LDLIBRARY)" fi ;; *-*-linux*) LDSHARED="$CC -shared";; *-*-dgux*) LDSHARED="ld -G";; *-*-freebsd3*) LDSHARED="$CC -shared";; *-*-freebsd* | *-*-openbsd*) LDSHARED="ld -Bshareable";; *-*-netbsd*) if [[ "`$CC -dM -E - &1 | grep -i clang >/dev/null && CLANGXX=yes case $host in *-*-darwin11* | *-*-darwin12* |*-*-darwin13* ) if test "$CLANGXX" = "yes"; then PLATCXXFLAGS="$PLATCXXFLAGS -stdlib=libc++" fi;; *) ;; esac # Check for compiler pre-compiled header support AC_MSG_CHECKING([if compiler supports pre-compiled headers]) PCHSUPPORT=no if test "$CLANGXX" = "yes"; then PCHINCLUDEARG="-include-pch" PCHINCLUDEEXT=".gch" else PCHINCLUDEARG="-include" PCHINCLUDEEXT="" fi AC_LANG_PUSH([C++]) echo '#include ' > conftest.hpp echo '#include "conftest.hpp"' > conftest.cpp $CXX -c conftest.hpp 2>/dev/null if test $? -eq 0; then if test -f conftest.hpp.gch; then $CXX -H -c -I. ${PCHINCLUDEARG} ./conftest.hpp${PCHINCLUDEEXT} -o conftest.o conftest.cpp >conftest.out 2>&1 if test $? -eq 0; then if test "$CLANGXX" = "yes"; then PCHSUPPORT=yes elif grep -q '^!.*conftest.hpp.gch$' conftest.out; then PCHSUPPORT=yes fi fi fi fi rm -f conftest.hpp conftest.cpp conftest.out AC_LANG_POP([C++]) AC_MSG_RESULT([$PCHSUPPORT]) AC_SUBST(PCHSUPPORT) AC_SUBST(PCHINCLUDEARG) AC_SUBST(PCHINCLUDEEXT) # Set info about shared libraries. AC_SUBST(SO) AC_SUBST(LDSHARED) AC_SUBST(CCSHARED) AC_SUBST(CXXSHARED) AC_SUBST(TRYLINKINGWITHCXX) AC_SUBST(RPATH) AC_SUBST(PLATCFLAGS) AC_SUBST(PLATCXXFLAGS) AC_SUBST(HAVE_CXX11_COMPILER) AC_SUBST(LINKFORSHARED) # This variation is needed on OS-X because there is no (apparent) consistency in shared library naming. # Sometimes .bundle works, but sometimes .so is needed. It depends on the target language AC_SUBST(PYTHON_SO) case $host in *-*-mingw*) PYTHON_SO=.pyd;; *-*-darwin*) PYTHON_SO=.so;; *) PYTHON_SO=$SO;; esac AC_SUBST(TCL_SO) case $host in *-*-darwin*) TCL_SO=.dylib;; *) TCL_SO=$SO;; esac AC_SUBST(GUILE_SO) case $host in *-*-darwin*) GUILE_SO=.so;; *) GUILE_SO=$SO;; esac AC_SUBST(PHP_SO) case $host in *-*-darwin*) PHP_SO=.so;; *) PHP_SO=$SO;; esac AC_SUBST(MZSCHEME_SO) case $host in *) MZSCHEME_SO=.so;; esac AC_SUBST(LUA_SO) case $host in *-*-darwin*) LUA_SO=.so;; *) LUA_SO=$SO;; esac # Check for specific libraries. Used for SWIG examples AC_CHECK_LIB(dl, dlopen) # Dynamic linking for SunOS/Solaris and SYSV AC_CHECK_LIB(dld, shl_load) # Dynamic linking for HP-UX dnl The following three libraries (nsl,inet,socket) are needed on Sequent, dnl and must be checked for in this order since each library depends on the dnl preceding one. dnl dnl Most SVR4 platforms will need -lsocket and -lnsl. However on SGI IRIX 5, dnl these exist but are broken, so we use AC_SEARCH_LIBS which will only try dnl the library if the function isn't already available without it. AC_SEARCH_LIBS(t_open, nsl) # SVR4 AC_SEARCH_LIBS(gethostbyname, inet) # Sequent AC_SEARCH_LIBS(socket, socket) # SVR4 sockets AC_CHECK_LIB(swill, swill_init, [SWIGLIBS="-lswill $LIBS" SWILL="-DSWIG_SWILL"]) AC_SUBST(SWIGLIBS) AC_SUBST(SWILL) # check for --with-libm=... AC_SUBST(LIBM) LIBM=-lm AC_ARG_WITH(libm, [ --with-libm=STRING math library], [ if test "$withval" != yes then LIBM=$withval else AC_MSG_ERROR([proper usage is --with-libm=STRING]) fi]) AC_CHECK_LIB(ieee, main, [LIBM="-lieee $LIBM"]) AC_CHECK_LIB(crypt,crypt, [LIBCRYPT="-lcrypt"]) AC_SUBST(LIBCRYPT) # check for --with-libc=... AC_SUBST(LIBC) AC_ARG_WITH(libc, [ --with-libc=STRING C library], [ if test "$withval" != yes then LIBC=$withval else AC_MSG_ERROR([proper usage is --with-libc=STRING]) fi]) #-------------------------------------------------------------------- # Target languages #-------------------------------------------------------------------- AC_ARG_WITH(alllang, AS_HELP_STRING([--without-alllang], [Disable all languages]), with_alllang="$withval") if test "$with_alllang" = "no"; then alllang_default=no else alllang_default=yes fi AC_CHECK_PROGS(PKGCONFIG, [pkg-config]) #-------------------------------------------------------------------- # Look for Tcl #-------------------------------------------------------------------- TCLINCLUDE= TCLLIB= TCLPACKAGE= AC_ARG_WITH(tclconfig, AS_HELP_STRING([--without-tcl], [Disable Tcl]) AS_HELP_STRING([--with-tclconfig=path], [Set location of tclConfig.sh]), [with_tclconfig="$withval"], [with_tclconfig=]) AC_ARG_WITH(tcl, [ --with-tcl=path Set location of Tcl package],[ TCLPACKAGE="$withval"], [TCLPACKAGE="$alllang_default"]) AC_ARG_WITH(tclincl,[ --with-tclincl=path Set location of Tcl include directory],[ TCLINCLUDE="-I$withval"], [TCLINCLUDE=]) AC_ARG_WITH(tcllib,[ --with-tcllib=path Set location of Tcl library directory],[ TCLLIB="-L$withval"], [TCLLIB=]) # First, check for "--without-tcl" or "--with-tcl=no". if test x"${TCLPACKAGE}" = xno; then AC_MSG_NOTICE([Disabling Tcl]) else AC_MSG_CHECKING([for Tcl configuration]) # First check to see if --with-tclconfig was specified. if test x"${with_tclconfig}" != x ; then if test -f "${with_tclconfig}/tclConfig.sh" ; then TCLCONFIG=`(cd ${with_tclconfig}; pwd)` else AC_MSG_ERROR([${with_tcl} directory does not contain tclConfig.sh]) fi fi # check in a few common install locations dirs="/usr/lib*/ /usr/lib*/tcl*/ /usr/local/lib*/ /usr/local/lib*/tcl*/" case $host in *-*-darwin*) dirs="/System/Library/Frameworks/Tcl.framework/ $dirs" ;; *) ;; esac if test x"${TCLCONFIG}" = x ; then for d in $dirs ; do for i in `ls -d -r $d 2>/dev/null` ; do if test -f $i"tclConfig.sh" ; then TCLCONFIG=`(cd $i; pwd)` break fi done done fi if test x"${TCLCONFIG}" = x ; then AC_MSG_RESULT(no) else AC_MSG_RESULT(found $TCLCONFIG/tclConfig.sh) . $TCLCONFIG/tclConfig.sh if test -z "$TCLINCLUDE"; then TCLINCLUDE=`echo $TCL_INCLUDE_SPEC` fi if test -z "$TCLLIB"; then TCLLIB=$TCL_LIB_SPEC fi fi if test -z "$TCLINCLUDE"; then if test "x$TCLPACKAGE" != xyes; then TCLINCLUDE="-I$TCLPACKAGE/include" fi fi if test -z "$TCLLIB"; then if test "x$TCLPACKAGE" != xyes; then TCLLIB="-L$TCLPACKAGE/lib -ltcl" fi fi AC_MSG_CHECKING(for Tcl header files) if test -z "$TCLINCLUDE"; then AC_TRY_CPP([#include ], , TCLINCLUDE="") if test -z "$TCLINCLUDE"; then dirs="/usr/local/include /usr/include /opt/local/include" for i in $dirs ; do if test -r $i/tcl.h; then AC_MSG_RESULT($i) TCLINCLUDE="-I$i" break fi done fi if test -z "$TCLINCLUDE"; then AC_MSG_RESULT(not found) fi else AC_MSG_RESULT($TCLINCLUDE) fi AC_MSG_CHECKING(for Tcl library) if test -z "$TCLLIB"; then dirs="/usr/local/lib /usr/lib /opt/local/lib" for i in $dirs ; do if test -r $i/libtcl.a; then AC_MSG_RESULT($i) TCLLIB="-L$i -ltcl" break fi done if test -z "$TCLLIB"; then AC_MSG_RESULT(not found) fi else AC_MSG_RESULT($TCLLIB) fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) TCLDYNAMICLINKING="$TCLLIB";; *)TCLDYNAMICLINKING="";; esac case $host in *-*-darwin*) TCLLDSHARED='$(CC) -dynamiclib -undefined suppress -flat_namespace' TCLCXXSHARED='$(CXX) -dynamiclib -undefined suppress -flat_namespace' ;; *) TCLLDSHARED='$(LDSHARED)' TCLCXXSHARED='$(CXXSHARED)' ;; esac fi AC_SUBST(TCLINCLUDE) AC_SUBST(TCLLIB) AC_SUBST(TCLDYNAMICLINKING) AC_SUBST(TCLLDSHARED) AC_SUBST(TCLCXXSHARED) #---------------------------------------------------------------- # Look for Python #---------------------------------------------------------------- PYINCLUDE= PYLIB= PYLINK= PYPACKAGE= AC_ARG_WITH(python, AS_HELP_STRING([--without-python], [Disable Python]) AS_HELP_STRING([--with-python=path], [Set location of Python executable]),[ PYBIN="$withval"], [PYBIN="$alllang_default"]) # First, check for "--without-python" or "--with-python=no". if test x"${PYBIN}" = xno; then AC_MSG_NOTICE([Disabling Python]) else # First figure out the name of the Python executable if test "x$PYBIN" = xyes; then AC_CHECK_PROGS(PYTHON, [python python2.7]) else PYTHON="$PYBIN" fi PYVER=0 if test -n "$PYTHON"; then AC_MSG_CHECKING([for $PYTHON major version number]) PYVER=`($PYTHON -c "import sys; sys.stdout.write(sys.version[[0]])") 2>/dev/null` AC_MSG_RESULT($PYVER) if test -z "$PYVER"; then PYVER=0 else AC_MSG_CHECKING(for Python os.name) PYOSNAME=`($PYTHON -c "import sys, os; sys.stdout.write(os.name)") 2>/dev/null` AC_MSG_RESULT($PYOSNAME) AC_MSG_CHECKING(for Python path separator) PYSEPARATOR=`($PYTHON -c "import sys, os; sys.stdout.write(os.sep)") 2>/dev/null` AC_MSG_RESULT($PYSEPARATOR) fi fi if test $PYVER -eq 1 -o $PYVER -eq 2; then AC_MSG_CHECKING(for Python prefix) PYPREFIX=`($PYTHON -c "import sys; sys.stdout.write(sys.prefix)") 2>/dev/null` AC_MSG_RESULT($PYPREFIX) AC_MSG_CHECKING(for Python exec-prefix) PYEPREFIX=`($PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)") 2>/dev/null` AC_MSG_RESULT($PYEPREFIX) if test x"$PYOSNAME" = x"nt" -a x"$PYSEPARATOR" = x"\\"; then # Windows installations are quite different to posix installations (MinGW path separator is a forward slash) PYPREFIX=`echo "$PYPREFIX" | sed -e 's,\\\\,/,g'` # Forward slashes are easier to use and even work on Windows most of the time PYTHON_SO=.pyd AC_MSG_CHECKING(for Python header files) if test -r $PYPREFIX/include/Python.h; then PYINCLUDE="-I$PYPREFIX/include" fi AC_MSG_RESULT($PYINCLUDE) AC_MSG_CHECKING(for Python library directory) if test -d $PYPREFIX/libs; then PYLIB=$PYPREFIX/libs PYLINKFILE=`ls $PYLIB/python*.lib | grep "python[[0-9]][[0-9]]\.lib"` if test -r "$PYLINKFILE"; then PYLINK=-l`basename $PYLINKFILE | sed -e 's/\.lib$//'` else PYLIB= fi fi else # Note: I could not think of a standard way to get the version string from different versions. # This trick pulls it out of the file location for a standard library file. AC_MSG_CHECKING(for Python version) # Need to do this hack since autoconf replaces __file__ with the name of the configure file filehack="file__" PYVERSION=`($PYTHON -c "import sys,string,operator,os.path; sys.stdout.write(operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1))") 2>/dev/null` AC_MSG_RESULT($PYVERSION) # Find the directory for libraries this is necessary to deal with # platforms that can have apps built for multiple archs: e.g. x86_64 AC_MSG_CHECKING(for Python lib dir) PYLIBDIR=`($PYTHON -c "import sys; sys.stdout.write(sys.lib)") 2>/dev/null` if test -z "$PYLIBDIR"; then # Fedora patch Python to add sys.lib, for other distros we assume "lib". PYLIBDIR="lib" fi AC_MSG_RESULT($PYLIBDIR) # Set the include directory AC_MSG_CHECKING(for Python header files) if test -r $PYPREFIX/include/$PYVERSION/Python.h; then PYINCLUDE="-I$PYPREFIX/include/$PYVERSION -I$PYEPREFIX/$PYLIBDIR/$PYVERSION/config" fi if test -z "$PYINCLUDE"; then if test -r $PYPREFIX/include/Py/Python.h; then PYINCLUDE="-I$PYPREFIX/include/Py -I$PYEPREFIX/$PYLIBDIR/python/lib" fi fi AC_MSG_RESULT($PYINCLUDE) # Set the library directory blindly. This probably won't work with older versions AC_MSG_CHECKING(for Python library directory) dirs="$PYVERSION/config $PYVERSION/$PYLIBDIR python/$PYLIBDIR" for i in $dirs; do if test -d $PYEPREFIX/$PYLIBDIR/$i; then PYLIB="$PYEPREFIX/$PYLIBDIR/$i" break fi done PYLINK="-l$PYVERSION" fi if test -z "$PYLIB"; then AC_MSG_RESULT(Not found) else AC_MSG_RESULT($PYLIB) fi AC_MSG_CHECKING(for Python library) if test -z "$PYLINK"; then AC_MSG_RESULT(Not found) else AC_MSG_RESULT($PYLINK) fi fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PYTHONDYNAMICLINKING="-L$PYLIB $PYLINK" DEFS="-DUSE_DL_IMPORT $DEFS" ;; *)PYTHONDYNAMICLINKING="";; esac fi AC_SUBST(PYINCLUDE) AC_SUBST(PYLIB) AC_SUBST(PYLINK) AC_SUBST(PYTHONDYNAMICLINKING) #---------------------------------------------------------------- # Look for Python 3.x #---------------------------------------------------------------- PY3INCLUDE= PY3LIB= PY3LINK= PY3PACKAGE= AC_ARG_WITH(python3, AS_HELP_STRING([--without-python3], [Disable Python 3.x support]) AS_HELP_STRING([--with-python3=path], [Set location of Python 3.x executable]),[ PY3BIN="$withval"], [PY3BIN="$alllang_default"]) # First, check for "--without-python3" or "--with-python3=no". if test x"${PY3BIN}" = xno; then AC_MSG_NOTICE([Disabling Python 3.x support]) else if test -z "$PYVER"; then PYVER=0 fi if test "x$PY3BIN" = xyes; then if test x"$PYOSNAME" = x"nt" -a x"$PYSEPARATOR" = x"\\" -a $PYVER -ge 3; then PYTHON3="$PYTHON" else for py_ver in 3 3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 ""; do AC_CHECK_PROGS(PYTHON3, [python$py_ver]) if test -n "$PYTHON3"; then AC_CHECK_PROGS(PY3CONFIG, [$PYTHON3-config]) if test -n "$PY3CONFIG"; then break fi fi done fi else PYTHON3="$PY3BIN" AC_CHECK_PROGS(PY3CONFIG, [$PYTHON3-config]) fi if test -n "$PYTHON3"; then AC_MSG_CHECKING([for $PYTHON3 major version number]) PYVER=`($PYTHON3 -c "import sys; sys.stdout.write(sys.version[[0]])") 2>/dev/null` AC_MSG_RESULT($PYVER) if test -z "$PYVER"; then PYVER=0 fi fi if test $PYVER -ge 3; then AC_MSG_CHECKING(for Python 3.x os.name) PY3OSNAME=`($PYTHON3 -c "import sys, os; sys.stdout.write(os.name)") 2>/dev/null` AC_MSG_RESULT($PY3OSNAME) AC_MSG_CHECKING(for Python 3.x path separator) PYSEPARATOR=`($PYTHON3 -c "import sys, os; sys.stdout.write(os.sep)") 2>/dev/null` AC_MSG_RESULT($PYSEPARATOR) if test x"$PY3OSNAME" = x"nt" -a x"$PYSEPARATOR" = x"\\"; then # Windows installations are quite different to posix installations # There is no python-config to use AC_MSG_CHECKING(for Python 3.x prefix) PY3PREFIX=`($PYTHON3 -c "import sys; sys.stdout.write(sys.prefix)") 2>/dev/null` AC_MSG_RESULT($PY3PREFIX) PY3PREFIX=`echo "$PY3PREFIX" | sed -e 's,\\\\,/,g'` # Forward slashes are easier to use and even work on Windows most of the time PYTHON_SO=.pyd AC_MSG_CHECKING(for Python 3.x header files) if test -r $PY3PREFIX/include/Python.h; then PY3INCLUDE="-I$PY3PREFIX/include" fi AC_MSG_RESULT($PY3INCLUDE) AC_MSG_CHECKING(for Python 3.x library directory) if test -d $PY3PREFIX/libs; then PY3LIB=$PY3PREFIX/libs PY3LINKFILE=`ls $PY3LIB/python*.lib | grep "python[[0-9]][[0-9]]\.lib"` if test -r "$PY3LINKFILE"; then PY3LINK=-l`basename $PY3LINKFILE | sed -e 's/\.lib$//'` else PY3LIB= fi fi if test -z "$PY3LIB"; then AC_MSG_RESULT([Not found]) else AC_MSG_RESULT($PY3LIB) fi AC_MSG_CHECKING([for Python 3.x library]) if test -z "$PY3LINK"; then AC_MSG_RESULT(Not found) else AC_MSG_RESULT($PY3LINK) fi elif test -n "$PY3CONFIG"; then AC_MSG_CHECKING([for Python 3.x prefix]) PY3PREFIX=`($PY3CONFIG --prefix) 2>/dev/null` AC_MSG_RESULT($PY3PREFIX) AC_MSG_CHECKING(for Python 3.x exec-prefix) # Piped through xargs to strip trailing whitespace (bug in msys2 + mingw Python) PY3EPREFIX=`($PY3CONFIG --exec-prefix | xargs) 2>/dev/null` AC_MSG_RESULT($PY3EPREFIX) # Note: I could not think of a standard way to get the version string from different versions. # This trick pulls it out of the file location for a standard library file. AC_MSG_CHECKING([for Python 3.x version]) # Need to do this hack since autoconf replaces __file__ with the name of the configure file filehack="file__" PY3VERSION=`($PYTHON3 -c "import string,operator,os.path; print(operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1))") 2>/dev/null` AC_MSG_RESULT($PY3VERSION) # Find the directory for libraries this is necessary to deal with # platforms that can have apps built for multiple archs: e.g. x86_64 AC_MSG_CHECKING([for Python 3.x lib dir]) PY3LIBDIR=`($PYTHON3 -c "import sys; print(sys.lib)") 2>/dev/null` if test -z "$PY3LIBDIR"; then # some dists don't have sys.lib so the best we can do is assume lib PY3LIBDIR="lib" fi AC_MSG_RESULT($PY3LIBDIR) # Set the include directory AC_MSG_CHECKING([for Python 3.x header files]) PY3INCLUDE=`($PY3CONFIG --includes) 2>/dev/null` AC_MSG_RESULT($PY3INCLUDE) # Set the library directory blindly. This probably won't work with older versions AC_MSG_CHECKING([for Python 3.x library directory]) dirs="$PY3VERSION/config $PY3VERSION/$PY3LIBDIR python/$PY3LIBDIR" for i in $dirs; do if test -d $PY3EPREFIX/$PY3LIBDIR/$i; then PY3LIB="$PY3EPREFIX/$PY3LIBDIR/$i" break fi done if test -z "$PY3LIB"; then AC_MSG_RESULT([Not found]) else AC_MSG_RESULT($PY3LIB) fi PY3LINK="-l$PY3VERSION" AC_MSG_CHECKING([for Python 3.x library]) if test -z "$PY3LINK"; then AC_MSG_RESULT(Not found) else AC_MSG_RESULT($PY3LINK) fi fi fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PYTHON3DYNAMICLINKING="-L$PY3LIB $PY3LINK" DEFS="-DUSE_DL_IMPORT $DEFS" ;; *)PYTHON3DYNAMICLINKING="";; esac AC_SUBST(PY3INCLUDE) AC_SUBST(PY3LIB) AC_SUBST(PY3LINK) AC_SUBST(PYTHON3DYNAMICLINKING) fi if test -n "$PYINCLUDE" || test -n "$PY3INCLUDE" ; then AC_CHECK_PROGS(PYCODESTYLE, pycodestyle) if test -n "$PYCODESTYLE"; then AC_MSG_CHECKING(pycodestyle version) pycodestyle_version=`$PYCODESTYLE --version 2>/dev/null` AC_MSG_RESULT($pycodestyle_version) fi fi AC_ARG_WITH(2to3, AS_HELP_STRING([--with-2to3=path], [Set location of Python 2to3 tool]), [PY2TO3BIN="$withval"], [PY2TO3BIN="yes"]) if test -n "$PYTHON3"; then if test "x$PY2TO3BIN" = xyes; then py3to2=`echo $PYTHON3 | sed -e "s/python/2to3-/"` AC_CHECK_PROGS(PY2TO3, $py3to2 2to3) if test -z "$PY2TO3"; then # Windows distributions don't always have the 2to3 executable AC_MSG_CHECKING(for 2to3.py) py2to3script="$PY3PREFIX/Tools/scripts/2to3.py" if test -f "$py2to3script"; then AC_MSG_RESULT($py2to3script) PY2TO3="$PYTHON3 $py2to3script" else AC_MSG_RESULT(Not found) fi fi else PY2TO3="$PY2TO3BIN" fi if test -z "$PY2TO3"; then PYTHON3= fi fi #---------------------------------------------------------------- # Look for Perl5 #---------------------------------------------------------------- PERLBIN= AC_ARG_WITH(perl5, AS_HELP_STRING([--without-perl5], [Disable Perl5]) AS_HELP_STRING([--with-perl5=path], [Set location of Perl5 executable]),[ PERLBIN="$withval"], [PERLBIN="$alllang_default"]) # First, check for "--without-perl5" or "--with-perl5=no". if test x"${PERLBIN}" = xno; then AC_MSG_NOTICE([Disabling Perl5]) PERL= else # First figure out what the name of Perl5 is if test "x$PERLBIN" = xyes; then AC_CHECK_PROGS(PERL, perl perl5.6.1 perl5.6.0 perl5.004 perl5.003 perl5.002 perl5.001 perl5 perl) else PERL="$PERLBIN" fi # This could probably be simplified as for all platforms and all versions of Perl the following apparently should be run to get the compilation options: # perl -MExtUtils::Embed -e ccopts AC_MSG_CHECKING(for Perl5 header files) if test -n "$PERL"; then PERL5DIR=`($PERL -MConfig -le 'print $Config{archlibexp}') 2>/dev/null` if test -n "$PERL5DIR" ; then dirs="$PERL5DIR $PERL5DIR/CORE" PERL5EXT=none for i in $dirs; do if test -r $i/perl.h; then AC_MSG_RESULT($i) PERL5EXT="$i" break fi done if test "$PERL5EXT" = none; then PERL5EXT="$PERL5DIR/CORE" AC_MSG_RESULT(could not locate perl.h...using $PERL5EXT) fi AC_MSG_CHECKING(for Perl5 library) PERL5LIB=`($PERL -e 'use Config; $_=$Config{libperl}; s/^lib//; s/$Config{_a}$//; s/\.$Config{so}.*//; print $_, "\n"') 2>/dev/null` if test -z "$PERL5LIB" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5LIB) fi AC_MSG_CHECKING(for Perl5 ccflags) PERL5CCFLAGS=`($PERL -e 'use Config; print $Config{ccflags}, "\n"' | sed "s/-Wdeclaration-after-statement//") 2>/dev/null` if test -z "$PERL5CCFLAGS" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5CCFLAGS) fi AC_MSG_CHECKING(for Perl5 ccdlflags) PERL5CCDLFLAGS=`($PERL -e 'use Config; print $Config{ccdlflags}, "\n"') 2>/dev/null` if test -z "$PERL5CCDLFLAGS" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5CCDLFLAGS) fi AC_MSG_CHECKING(for Perl5 cccdlflags) PERL5CCCDLFLAGS=`($PERL -e 'use Config; print $Config{cccdlflags}, "\n"') 2>/dev/null` if test -z "$PERL5CCCDLFLAGS" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5CCCDLFLAGS) fi AC_MSG_CHECKING(for Perl5 ldflags) PERL5LDFLAGS=`($PERL -e 'use Config; print $Config{ldflags}, "\n"') 2>/dev/null` if test -z "$PERL5LDFLAGS" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5LDFLAGS) fi AC_MSG_CHECKING(for Perl5 Test::More module) # For test-suite PERL5TESTMORE=`($PERL -e 'use Test::More; print "good";') 2>/dev/null` if test -z "$PERL5TESTMORE" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT(found) fi else AC_MSG_RESULT(unable to determine perl5 configuration) PERL5EXT=$PERL5DIR fi else AC_MSG_RESULT(could not figure out how to run perl5) fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PERL5DYNAMICLINKING="-L$PERL5EXT -l$PERL5LIB";; *)PERL5DYNAMICLINKING="";; esac fi AC_SUBST(PERL) AC_SUBST(PERL5EXT) AC_SUBST(PERL5DYNAMICLINKING) AC_SUBST(PERL5LIB) AC_SUBST(PERL5CCFLAGS) AC_SUBST(PERL5CCDLFLAGS) AC_SUBST(PERL5CCCDLFLAGS) AC_SUBST(PERL5LDFLAGS) #---------------------------------------------------------------- # Look for Octave #---------------------------------------------------------------- OCTAVEBIN= OCTAVE_SO=.oct AC_ARG_WITH(octave, AS_HELP_STRING([--without-octave], [Disable Octave]) AS_HELP_STRING([--with-octave=path], [Set location of Octave executable]),[OCTAVEBIN="$withval"], [OCTAVEBIN="$alllang_default"]) # Check for "--without-octave" or "--with-octave=no". if test x"${OCTAVEBIN}" = xno; then AC_MSG_NOTICE([Disabling Octave]) OCTAVE= # Check for Octave; prefer command-line program "octave-cli" to (in newer versions) GUI program "octave" elif test "x$OCTAVEBIN" = xyes; then AC_PATH_PROG(OCTAVE, [octave-cli octave]) else OCTAVE="$OCTAVEBIN" fi # Check if Octave works if test -n "$OCTAVE"; then AC_MSG_CHECKING([if ${OCTAVE} works]) AS_IF([test "x`${OCTAVE} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/Octave, version/p'`" != x],[ AC_MSG_RESULT([yes]) ],[ AC_MSG_RESULT([no]) OCTAVE= ]) fi # Check for required Octave helper program "mkoctfile" if test -n "$OCTAVE"; then AC_MSG_CHECKING([for mkoctfile]) version_suffix=["`echo $OCTAVE | sed -e 's|.*\(-[0-9][0-9.]*\)$|\1|'`"] case $version_suffix in -*) ;; *) version_suffix="" ;; esac octave_directory=`dirname $OCTAVE` if test "$octave_directory" = "." ; then mkoctfile="mkoctfile${version_suffix}" else mkoctfile="${octave_directory}/mkoctfile${version_suffix}" fi AC_MSG_RESULT([${mkoctfile}]) AC_MSG_CHECKING([if ${mkoctfile} works]) mkoctfile="env - PATH=$PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH ${mkoctfile}" AS_IF([test "x`${mkoctfile} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/mkoctfile, version/p'`" != x],[ AC_MSG_RESULT([yes]) ],[ AC_MSG_RESULT([no]) OCTAVE= ]) fi # Check for Octave preprocessor/compiler/linker flags if test -n "$OCTAVE"; then AC_MSG_CHECKING([for Octave preprocessor flags]) OCTAVE_CPPFLAGS= for var in CPPFLAGS INCFLAGS ALL_CXXFLAGS; do for flag in `${mkoctfile} -p ${var}`; do case ${flag} in -D*|-I*) OCTAVE_CPPFLAGS="${OCTAVE_CPPFLAGS} ${flag}";; *) ;; esac done done AC_MSG_RESULT([$OCTAVE_CPPFLAGS]) AC_MSG_CHECKING([for Octave compiler flags]) OCTAVE_CXXFLAGS= for var in CXX ALL_CXXFLAGS; do for flag in `${mkoctfile} -p ${var}`; do case ${flag} in -std=*|-g*|-W*) OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} ${flag}";; *) ;; esac done done save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-Werror -O0" AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([],[]) ],[ OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} -O0" ]) CXXFLAGS="${save_CXXFLAGS}" AC_MSG_RESULT([$OCTAVE_CXXFLAGS]) AC_MSG_CHECKING([for Octave linker flags]) OCTAVE_LDFLAGS= for var in OCTLIBDIR; do OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "-L`${mkoctfile} -p ${var}` done for var in RDYNAMIC_FLAG RLD_FLAG OCTAVE_LIBS LIBS; do OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "`${mkoctfile} -p ${var}` done AC_MSG_RESULT([$OCTAVE_LDFLAGS]) fi # Check for Octave options if test -n "$OCTAVE"; then for octave_opt in --no-window-system --silent --norc --no-history; do AC_MSG_CHECKING([if Octave option '${octave_opt}' is supported]) octave_out=`${OCTAVE} ${octave_opt} /dev/null 2>&1 | sed -n '1p' | sed -n '/unrecognized/p'` AS_IF([test "x${octave_out}" = x],[ AC_MSG_RESULT([yes]) OCTAVE="${OCTAVE} ${octave_opt}" ],[ AC_MSG_RESULT([no]) ]) done fi AC_SUBST(OCTAVE) AC_SUBST(OCTAVE_SO) AC_SUBST(OCTAVE_CPPFLAGS) AC_SUBST(OCTAVE_CXXFLAGS) AC_SUBST(OCTAVE_LDFLAGS) #---------------------------------------------------------------- # Look for Scilab #---------------------------------------------------------------- AC_ARG_WITH(scilab, AS_HELP_STRING([--without-scilab], [Disable Scilab]) AS_HELP_STRING([--with-scilab=path], [Set location of Scilab executable]),[SCILABBIN="$withval"], [SCILABBIN="$alllang_default"]) AC_ARG_WITH(scilab-inc, [ --with-scilab-inc=path Set location of Scilab include directory], [SCILABINCDIR="$withval"], [SCILABINCDIR=""]) # First, check for "--without-scilab" or "--with-scilab=no". if test x"${SCILABBIN}" = xno; then AC_MSG_NOTICE([Disabling Scilab]) SCILAB= else # Check for Scilab executable if test "x$SCILABBIN" = xyes; then AC_CHECK_PROGS(SCILAB, scilab) else AC_MSG_CHECKING(for scilab) if test -f "$SCILABBIN"; then AC_MSG_RESULT($SCILABBIN) SCILAB="$SCILABBIN" else AC_MSG_RESULT(not found) fi fi if test -n "$SCILAB"; then # Check for Scilab version (needs api_scilab so needs version 5.3.3 or higher) SCILAB_FULL_VERSION=`$SCILAB -version | head -1 | sed -e 's|Scilab version \"\(.*\)\"|\1|g'` AC_MSG_CHECKING(Scilab version is 5.3.3 or higher) SCILAB_MAJOR_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f1` SCILAB_MINOR_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f2` SCILAB_MAINTENANCE_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f3` SCILAB_VERSION="$SCILAB_MAJOR_VERSION$SCILAB_MINOR_VERSION$SCILAB_MAINTENANCE_VERSION" if test $SCILAB_VERSION -ge 533; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) SCILAB= fi if test -n "$SCILAB"; then # Set Scilab startup options depending on version AC_MSG_CHECKING(for Scilab startup options) SCILABOPT="-nwni -nb" if test $SCILAB_VERSION -ge 540; then SCILABOPT+=" -noatomsautoload" fi AC_MSG_RESULT($SCILABOPT) # Check for Scilab header files AC_MSG_CHECKING(for Scilab header files) if test "$SCILABINCDIR" != ""; then dirs="$SCILABINCDIR" elif test -n "$PKGCONFIG"; then dirs=`$PKGCONFIG scilab --cflags-only-I | sed -e 's/-I//g'` else dirs="" fi for i in $dirs; do if test -r $i/api_scilab.h; then AC_MSG_RESULT($i) SCILABINCLUDE="-I$i" break fi if test -r $i/scilab/api_scilab.h; then AC_MSG_RESULT($i/scilab) SCILABINCLUDE="-I$i/scilab" break fi done if test "$SCILABINCLUDE" = "" ; then AC_MSG_RESULT(not found) SCILAB= fi fi fi fi AC_SUBST(SCILAB) AC_SUBST(SCILABINCLUDE) AC_SUBST(SCILABOPT) #---------------------------------------------------------------- # Look for java #---------------------------------------------------------------- AC_ARG_WITH(java, AS_HELP_STRING([--without-java], [Disable Java]) AS_HELP_STRING([--with-java=path], [Set location of java executable]),[JAVABIN="$withval"], [JAVABIN="$alllang_default"]) AC_ARG_WITH(javac, [ --with-javac=path Set location of javac executable],[JAVACBIN="$withval"], [JAVACBIN=]) # First, check for "--without-java" or "--with-java=no". if test x"${JAVABIN}" = xno; then AC_MSG_NOTICE([Disabling Java]) JAVA= else dnl Detect everything we need for Java: java for running Java tests, javac for dnl compiling them and C headers for compiling C code. dnl dnl If JAVA_HOME is defined and contains everything needed, as it's supposed to, dnl just use it. Otherwise try to locate the necessary files in the path. case $host in *-*-cygwin*) dnl Ensure that JAVA_HOME is in the form we can use, it's typically set to Windows path by the installer. if test -n "$JAVA_HOME"; then JAVA_HOME=`cygpath --mixed "$JAVA_HOME"` fi dnl Java uses semicolons and not colons as separators in its classes search path under Windows. JAVA_CLASSPATH_SEP=";" ;; *-*-mingw*) if test -n "$JAVA_HOME"; then JAVA_HOME=`${srcdir}/Tools/convertpath -u "$JAVA_HOME"` fi JAVA_CLASSPATH_SEP=";" ;; *-*-darwin*) dnl Under OS X JAVA_HOME is not set by default, try to use the system default JRE. if test -z "$JAVA_HOME" -a -x /usr/libexec/java_home; then JAVA_HOME=`/usr/libexec/java_home` fi dnl The JAVA_HOME doesn't contain the JDK headers though, but they seem to dnl always be in the same location, according to Apple JNI documentation. JAVA_OSX_STD_INCDIR="/System/Library/Frameworks/JavaVM.framework/Headers" if test -r "$JAVA_OSX_STD_INCDIR/jni.h"; then JAVA_HOME_INCDIR=$JAVA_OSX_STD_INCDIR fi JAVA_CLASSPATH_SEP=":" ;; *) dnl Assume generic Unix. JAVA_CLASSPATH_SEP=":" ;; esac AC_MSG_CHECKING(for java JDK) if test -n "$JAVA_HOME"; then dnl Don't complain about missing executables/headers if they had been dnl explicitly overridden from the command line, but otherwise verify that we dnl have everything we need. java_home_ok=1 if test -z "$JAVABIN" -a ! -x "$JAVA_HOME/bin/java"; then AC_MSG_WARN([No java executable under JAVA_HOME.]) java_home_ok=0 fi if test -z "$JAVACBIN" -a ! -x "$JAVA_HOME/bin/javac"; then AC_MSG_WARN([No javac executable under JAVA_HOME.]) java_home_ok=0 fi dnl By default the headers are under JAVA_HOME/include, but OS X is special dnl and defines JAVA_HOME_INCDIR differently above. if test -z "$JAVA_HOME_INCDIR"; then JAVA_HOME_INCDIR="$JAVA_HOME/include" fi if test -z "$JAVAINCDIR" -a ! -r "$JAVA_HOME_INCDIR/jni.h"; then AC_MSG_WARN([No java headers under JAVA_HOME (does it point to a JDK and not just JRE?).]) java_home_ok=0 fi if test "$java_home_ok" = 1; then AC_MSG_RESULT([found (in $JAVA_HOME)]) else AC_MSG_RESULT(no) AC_MSG_WARN([JAVA_HOME ($JAVA_HOME) is defined but does not point to a complete JDK installation, ignoring it.]) JAVA_HOME= fi else AC_MSG_RESULT([no (JAVA_HOME is not defined)]) fi if test "x$JAVABIN" = xyes; then if test -n "$JAVA_HOME"; then JAVA="$JAVA_HOME/bin/java" else AC_CHECK_PROGS(JAVA, java kaffe guavac) fi else JAVA="$JAVABIN" fi if test -z "$JAVACBIN"; then if test -n "$JAVA_HOME"; then JAVAC="$JAVA_HOME/bin/javac" else AC_CHECK_PROGS(JAVAC, javac) fi else JAVAC="$JAVACBIN" fi # Check Java version: we require Java 9 or later for Doxygen tests. if test -n "$JAVAC"; then AC_MSG_CHECKING(if java version is 9 or greater) javac_version=`"$JAVAC" -version 2>&1` java_version_num=`echo $javac_version | sed -n 's/^javac //p'` if test -z "$java_version_num"; then AC_MSG_WARN([unknown format for Java version returned by "$JAVAC" ($javac_version)]) JAVA_SKIP_DOXYGEN_TEST_CASES=1 AC_MSG_RESULT(unknown) else dnl Until Java 8 version number was in format "1.x", starting from dnl Java 9 it's just "x". case $java_version_num in 1.*) JAVA_SKIP_DOXYGEN_TEST_CASES=1 AC_MSG_RESULT([no, disabling Doxygen tests]) ;; *) AC_MSG_RESULT(yes) ;; esac fi AC_SUBST(JAVA_SKIP_DOXYGEN_TEST_CASES) fi AC_MSG_CHECKING(for java include file jni.h) AC_ARG_WITH(javaincl, [ --with-javaincl=path Set location of Java include directory], [JAVAINCDIR="$withval"], [JAVAINCDIR=]) JAVAINC="" if test -z "$JAVAINCDIR" ; then if test -n "$JAVA_HOME"; then JAVAINCDIR="$JAVA_HOME_INCDIR" JAVAINC=-I\"$JAVAINCDIR\" else JAVAINCDIR="/usr/j2sdk*/include /usr/local/j2sdk*/include /usr/jdk*/include /usr/local/jdk*/include /opt/j2sdk*/include /opt/jdk*/include /usr/java/include /usr/java/j2sdk*/include /usr/java/jdk*/include /usr/local/java/include /opt/java/include /usr/include/java /usr/local/include/java /usr/lib/java/include /usr/lib/jvm/java*/include /usr/lib64/jvm/java*/include /usr/include/kaffe /usr/local/include/kaffe /usr/include" # Add in default installation directory on Windows for Cygwin case $host in *-*-cygwin* | *-*-mingw*) JAVAINCDIR="c:/Program*Files*/Java/jdk*/include d:/Program*Files*/Java/jdk*/include c:/j2sdk*/include d:/j2sdk*/include c:/jdk*/include d:/jdk*/include $JAVAINCDIR";; *-*-darwin*) JAVAINCDIR="$JAVA_OSX_STD_INCDIR $JAVAINCDIR";; *);; esac for d in $JAVAINCDIR ; do if test -r "$d/jni.h" ; then JAVAINCDIR=$d JAVAINC=-I\"$d\" JAVA_HOME_MAYBE="`dirname $d`" break fi done fi else if test -r "$JAVAINCDIR/jni.h" ; then JAVAINC=-I\"$JAVAINCDIR\" fi fi if test "$JAVAINC" = "" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($JAVAINC) # now look for /jni_md.h AC_MSG_CHECKING(for java include file jni_md.h) JAVAMDDIR=`find "$JAVAINCDIR" -follow -name jni_md.h -print` if test "$JAVAMDDIR" = "" ; then AC_MSG_RESULT(not found) else JAVAMDDIR=-I\"`dirname "$JAVAMDDIR" | tail -1`\" AC_MSG_RESULT($JAVAMDDIR) JAVAINC="${JAVAINC} ${JAVAMDDIR}" fi fi # Auto-detecting JAVA_HOME is not so easy, below will only work up to and including jdk8 if test -z "$JAVA_HOME" && test -n "$JAVA_HOME_MAYBE" ; then AC_MSG_CHECKING(for java jdk from jni include paths) if test -r "$JAVA_HOME_MAYBE/lib/tools.jar" ; then JAVA_HOME=$JAVA_HOME_MAYBE AC_MSG_RESULT([$JAVA_HOME]) else AC_MSG_RESULT(not found) fi fi case $host in *-*-cygwin*) # TODO: Only use this flag if the compiler supports it, later versions of gcc no longer have it GCC_MNO_CYGWIN=" -mno-cygwin" ;; *) GCC_MNO_CYGWIN="" ;; esac # java.exe on Cygwin requires the Windows standard (Pascal) calling convention as it is a normal Windows executable and not a Cygwin built executable case $host in *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then JAVADYNAMICLINKING="$GCC_MNO_CYGWIN -mthreads -Wl,--add-stdcall-alias" JAVACFLAGS="$GCC_MNO_CYGWIN -mthreads" else JAVADYNAMICLINKING="" JAVACFLAGS="" fi ;; *-*-darwin*) JAVADYNAMICLINKING="-dynamiclib -framework JavaVM" JAVACFLAGS="" ;; *) JAVADYNAMICLINKING="" JAVACFLAGS="" ;; esac # Java on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls case $host in *-*-cygwin* | *-*-mingw*) JAVALIBRARYPREFIX="";; *)JAVALIBRARYPREFIX="lib";; esac # Java on Mac OS X tweaks case $host in *-*-darwin*) JAVASO=".jnilib" JAVALDSHARED='$(CC)' JAVACXXSHARED='$(CXX)' ;; *) JAVASO=$SO JAVALDSHARED='$(LDSHARED)' JAVACXXSHARED='$(CXXSHARED)' ;; esac fi # Quote for spaces in path to executables if test -n "$JAVA"; then JAVA=\"$JAVA\" fi if test -n "$JAVAC"; then JAVAC=\"$JAVAC\" fi # Turned off due to spurious warnings in later versions of openjdk-1.8 # JAVAFLAGS=-Xcheck:jni AC_SUBST(JAVA) AC_SUBST(JAVAC) AC_SUBST(JAVAINC) AC_SUBST(JAVA_CLASSPATH_SEP) AC_SUBST(JAVADYNAMICLINKING) AC_SUBST(JAVALIBRARYPREFIX) AC_SUBST(JAVASO) AC_SUBST(JAVALDSHARED) AC_SUBST(JAVACXXSHARED) AC_SUBST(JAVAFLAGS) AC_SUBST(JAVACFLAGS) #---------------------------------------------------------------- # Look for Javascript #---------------------------------------------------------------- AC_ARG_WITH(javascript, AS_HELP_STRING([--without-javascript], [Disable Javascript]), [with_javascript="$withval"], [with_javascript="$alllang_default"]) # First, check for "--without-javascript" or "--with-javascript=no". if test x"${with_javascript}" = xno; then AC_MSG_NOTICE([Disabling Javascript]) JAVASCRIPT= else JAVASCRIPT=1 #---------------------------------------------------------------- # General Javascript settings shared by JSC and V8 #---------------------------------------------------------------- case $host in *-*-darwin*) JSSO=".dylib" # HACK: didn't manage to get dynamic module loading working with a g++ compiled interpreter JSINTERPRETERCXX='c++' JSINTERPRETERLINKFLAGS='-g -Wl,-search_paths_first -Wl,-headerpad_max_install_names' ;; *) JSSO=$SO JSINTERPRETERCXX='$(CXX)' JSINTERPRETERLINKFLAGS='-ldl' ;; esac #---------------------------------------------------------------- # Look for Node.js which is the default Javascript engine #---------------------------------------------------------------- AC_CHECK_PROGS(NODEJS, [nodejs node]) if test -n "$NODEJS"; then # node-gyp is needed to run the test-suite/examples AC_CHECK_PROGS(NODEGYP, node-gyp) if test -z "$NODEGYP"; then NODEJS= fi fi #---------------------------------------------------------------- # Look for JavascriptCore (Webkit) settings (JSCOREINCDIR, JSCOREDYNAMICLINKING) #---------------------------------------------------------------- # check for include files AC_MSG_CHECKING(for JavaScriptCore/JavaScript.h) AC_ARG_WITH(jscoreinc, [ --with-jscoreinc=path Set location of Javascript include directory], [JSCOREINCDIR="$withval"], [JSCOREINCDIR=]) JSCOREVERSION= if test -z "$JSCOREINCDIR"; then JSCOREINCDIR="/usr/include/ /usr/local/include/" # Add in default directory for JavaScriptCore headers for Linux and Mac OS X case $host in *-*-linux*) JSCOREINCDIR="/usr/include/webkit-1.0/ /usr/include/webkitgtk-1.0/ /usr/local/include/webkit-1.0/JavaScriptCore/ $JSCOREINCDIR" ;; *-*-darwin*) JSCOREINCDIR="/System/Library/Frameworks/JavaScriptCore.framework/Headers/ $JSCOREINCDIR" ;; *) ;; esac fi for d in $JSCOREINCDIR ; do if test -r "$d/JavaScriptCore/JavaScript.h" || test -r "$d/JavaScript.h" ; then AC_MSG_RESULT($d) JSCOREINCDIR=$d JSCOREINC=-I\"$d\" break fi done if test "$JSCOREINC" = "" ; then AC_MSG_RESULT(not found) fi # check for JavaScriptCore/Webkit libraries AC_ARG_WITH(jscorelib,[ --with-jscorelib=path Set location of the JavaScriptCore/Webkit library directory],[JSCORELIB="-L$withval"], [JSCORELIB=]) if test -z "$JSCORELIB" -a -n "$PKGCONFIG"; then AC_MSG_CHECKING(for JavaScriptCore/Webkit library) if $PKGCONFIG javascriptcoregtk-1.0; then JSCORELIB=`$PKGCONFIG --libs javascriptcoregtk-1.0` JSCOREVERSION=`$PKGCONFIG --modversion javascriptcoregtk-1.0` fi if test -z "$JSCORELIB"; then AC_MSG_RESULT(not found) JSCENABLED= else AC_MSG_RESULT([$JSCORELIB]) JSCOREDYNAMICLINKING="$JSCORELIB" JSCENABLED=1 fi fi #---------------------------------------------------------------- # Look for V8 settings (JSV8INCDIR, JSV8DYNAMICLINKING) #---------------------------------------------------------------- # check for include files AC_MSG_CHECKING(for V8 Javascript v8.h) AC_ARG_WITH(jsv8inc, [ --with-jsv8inc=path Set location of Javascript v8 include directory], [JSV8INCDIR="$withval"], [JSV8INCDIR=]) # if not include dir is specified we try to find if test -z "$JSV8INCDIR"; then # Add in default directory for JavaScriptCore headers for Linux and Mac OS X case $host in *-*-linux*) JSV8INCDIR="/usr/include /usr/local/include/ $JSV8INCDIR" ;; *-*-darwin*) JSV8INCDIR="$JSV8INCDIR" ;; *) ;; esac fi for d in $JSV8INCDIR ; do if test -r "$d/v8.h" ; then JSV8INCDIR=$d JSV8INC=-I\"$d\" break fi done if test "$JSV8INC" = "" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($JSV8INCDIR) fi # check for V8 library AC_MSG_CHECKING(for V8 Javascript library) AC_ARG_WITH(jsv8lib,[ --with-jsv8lib=path Set location of V8 Javascript library directory],[JSV8LIBDIR="$withval"], [JSV8LIB=]) v8libdirs="$JSV8LIBDIR /usr/lib64/ /usr/local/lib64/ /usr/lib/ /usr/local/lib/" for d in $v8libdirs ; do if test -r $d/libv8$JSSO; then JSV8LIBDIR=$d JSV8LIB="-L$d -lv8" break fi done if test "$JSV8LIB" = "" ; then AC_MSG_RESULT(not found) JSV8ENABLED= else AC_MSG_RESULT($JSV8LIBDIR) JSV8ENABLED=1 fi # linking options case $host in *-*-darwin*) JSV8DYNAMICLINKING="$JSV8LIB" ;; *-*-linux*) JSV8DYNAMICLINKING="$JSV8LIB" ;; *) JSV8DYNAMICLINKING="" ;; esac fi AC_SUBST(JSINTERPRETERCXX) AC_SUBST(JSINTERPRETERLINKFLAGS) AC_SUBST(JSCOREINC) AC_SUBST(JSCOREDYNAMICLINKING) AC_SUBST(JSCOREVERSION) AC_SUBST(JSV8INC) AC_SUBST(JSV8DYNAMICLINKING) AC_SUBST(JSCENABLED) AC_SUBST(JSV8ENABLED) AC_SUBST(NODEJS) AC_SUBST(NODEGYP) #---------------------------------------------------------------- # Look for Android #---------------------------------------------------------------- AC_ARG_WITH(android, AS_HELP_STRING([--without-android], [Disable Android]) AS_HELP_STRING([--with-android=path], [Set location of android executable]),[ANDROIDBIN="$withval"], [ANDROIDBIN="$alllang_default"]) AC_ARG_WITH(adb, [ --with-adb=path Set location of adb executable - Android Debug Bridge],[ADBBIN="$withval"], [ADBBIN=]) AC_ARG_WITH(ant, [ --with-ant=path Set location of ant executable for Android],[ANTBIN="$withval"], [ANTBIN=]) AC_ARG_WITH(ndk-build, [ --with-ndk-build=path Set location of Android ndk-build executable],[NDKBUILDBIN="$withval"], [NDKBUILDBIN=]) # First, check for "--without-android" or "--with-android=no". if test x"${ANDROIDBIN}" = xno; then AC_MSG_NOTICE([Disabling Android]) ANDROID= else if test "x$ANDROIDBIN" = xyes; then AC_CHECK_PROGS(ANDROID, android) else ANDROID="$ANDROIDBIN" fi if test -z "$ADBBIN"; then AC_CHECK_PROGS(ADB, adb) else ADB="$ADBBIN" fi if test -z "$ANTBIN"; then AC_CHECK_PROGS(ANT, ant) else ANT="$ANTBIN" fi if test -z "$NDKBUILDBIN"; then AC_CHECK_PROGS(NDKBUILD, ndk-build) else NDKBUILD="$NDKBUILDBIN" fi fi AC_SUBST(ANDROID) AC_SUBST(ADB) AC_SUBST(ANT) AC_SUBST(NDKBUILD) #---------------------------------------------------------------- # Look for Guile #---------------------------------------------------------------- GUILE= GUILE_CFLAGS= GUILE_LIBS= AC_ARG_WITH(guile-config, AS_HELP_STRING([--without-guile], [Disable Guile]) AS_HELP_STRING([--with-guile-config=path], [Set location of guile-config]),[ GUILE_CONFIG="$withval"], [GUILE_CONFIG=]) AC_ARG_WITH(guile,[ --with-guile=path Set location of Guile executable],[ GUILE="$withval"], [GUILE="$alllang_default"]) AC_ARG_WITH(guile-cflags,[ --with-guile-cflags=cflags Set cflags required to compile against Guile],[ GUILE_CFLAGS="$withval"]) AC_ARG_WITH(guile-libs,[ --with-guile-libs=ldflags Set ldflags needed to link with Guile],[ GUILE_LIBS="$withval"]) # First, check for "--without-guile" or "--with-guile=no". if test x"${GUILE}" = xno; then AC_MSG_NOTICE([Disabling Guile]) else if test -z "$GUILE_CONFIG" ; then AC_PATH_PROG(GUILE_CONFIG, guile-config) fi if test -n "$GUILE_CONFIG" ; then if test x"$GUILE" = xyes; then AC_MSG_CHECKING([for guile executable]) # Try extracting it via guile-config first. If it's defined there it's the most reliable result GUILE="`$GUILE_CONFIG info guile 2>/dev/null`" if test -n "$GUILE"; then AC_MSG_RESULT([$GUILE]) else AC_MSG_RESULT([not found via guile-config - constructing path]) AC_MSG_CHECKING([for guile bindir]) guile_bindir="`$GUILE_CONFIG info bindir`" AC_MSG_RESULT([$guile_bindir]) GUILE="$guile_bindir/guile" fi if ! test -f "$GUILE" ; then GUILE= AC_PATH_PROG(GUILE, guile) fi if test -z "$GUILE" ; then AC_MSG_WARN([no suitable guile executable found. Disabling Guile]) fi fi if test -n "$GUILE" ; then AC_MSG_CHECKING([for guile version]) guile_version=`$GUILE -c '(display (effective-version))'` AC_MSG_RESULT([$guile_version]) AC_MSG_CHECKING([for guile version >= 1.8]) guile_good_version=`$GUILE -c '(if (>= (string->number (effective-version)) 1.8) (display "yes") (display "no"))'` AC_MSG_RESULT([$guile_good_version]) if test x"$guile_good_version" != xyes ; then AC_MSG_WARN([at least guile version 1.8 is required. Disabling Guile]) GUILE= fi fi if test -n "$GUILE" ; then # Test if guile-config and guile versions match. They should. gc_version="`$GUILE_CONFIG --version 2>&1 | sed '1 s/.* //;q'`" g_version="`$GUILE --version | sed '1 s/.* //;q'`" if test "$gc_version" != "$g_version"; then AC_MSG_WARN([different versions reported by $GUILE_CONFIG ($gc_version) and $GUILE ($g_version). Disabling Guile]) GUILE= fi fi if test -n "$GUILE" ; then if test -z "$GUILE_CFLAGS" ; then AC_MSG_CHECKING([for guile compile flags]) GUILE_CFLAGS="`$GUILE_CONFIG compile`" # Note that this can sometimes be empty AC_MSG_RESULT([$GUILE_CFLAGS]) fi if test -z "$GUILE_LIBS" ; then AC_MSG_CHECKING([for guile link flags]) GUILE_LIBS="`$GUILE_CONFIG link`" AC_MSG_RESULT([$GUILE_LIBS]) fi fi fi fi AC_SUBST(GUILE) AC_SUBST(GUILE_CFLAGS) AC_SUBST(GUILE_LIBS) #---------------------------------------------------------------- # Look for MzScheme #---------------------------------------------------------------- AC_ARG_WITH(mzscheme, AS_HELP_STRING([--without-mzscheme], [Disable MzScheme]) AS_HELP_STRING([--with-mzscheme=path], [Set location of MzScheme executable]),[ MZSCHEMEBIN="$withval"], [MZSCHEMEBIN="$alllang_default"]) AC_ARG_WITH(mzc, AS_HELP_STRING([--with-mzc=path], [Set location of MzScheme's mzc]), [ MZCBIN="$withval"], [MZCBIN=]) # First, check for "--without-mzscheme" or "--with-mzscheme=no". if test x"${MZSCHEMEBIN}" = xno; then AC_MSG_NOTICE([Disabling MzScheme]) MZC= else if test "x$MZSCHEMEBIN" = xyes; then AC_PATH_PROG(MZSCHEME, mzscheme) else MZSCHEME="$MZSCHEMEBIN" fi if test -z "$MZCBIN"; then AC_PATH_PROG(MZC, mzc) fi if test -n "$MZSCHEME"; then AC_MSG_CHECKING(for MzScheme dynext object) MZDYNOBJ=`$MZSCHEME --eval '(begin (require dynext/link) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (printf "~a" x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null` if test -f "$MZDYNOBJ"; then : else # older versions (3.72 approx and earlier) MZDYNOBJ=`$MZSCHEME --mute-banner --version --eval '(begin (require (lib "link.ss" "dynext")) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x) (display " ")) ((current-make-standard-link-libraries)))) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null` fi if test -f "$MZDYNOBJ"; then AC_MSG_RESULT($MZDYNOBJ) else AC_MSG_RESULT(not found) MZDYNOBJ="" fi fi fi AC_SUBST(MZDYNOBJ) #---------------------------------------------------------------- # Look for Ruby #---------------------------------------------------------------- RUBYBIN= AC_ARG_WITH(ruby, AS_HELP_STRING([--without-ruby], [Disable Ruby]) AS_HELP_STRING([--with-ruby=path], [Set location of Ruby executable]),[ RUBYBIN="$withval"], [RUBYBIN="$alllang_default"]) # First, check for "--without-ruby" or "--with-ruby=no". RUBYSO=$SO if test x"${RUBYBIN}" = xno; then AC_MSG_NOTICE([Disabling Ruby]) RUBY= else # First figure out what the name of Ruby is if test "x$RUBYBIN" = xyes; then AC_CHECK_PROGS(RUBY, ruby) else RUBY="$RUBYBIN" fi AC_MSG_CHECKING(for Ruby header files) if test -n "$RUBY"; then # Try Ruby1.9+ first RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["rubyhdrdir"]] || $rubyhdrdir') 2>/dev/null` RUBYARCHHDRDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["rubyarchhdrdir"]] || $rubyarchhdrdir') 2>/dev/null` if test x"$RUBYDIR" = x"" || test x"$RUBYDIR" = x"nil"; then RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["archdir"]] || $archdir') 2>/dev/null` else RUBYARCH=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["arch"]] || $arch') 2>/dev/null` fi if test x"$RUBYDIR" != x""; then dirs="$RUBYDIR" RUBYINCLUDE= for i in $dirs; do if test -r $i/ruby.h; then if test x"$RUBYARCH" = x""; then RUBYINCLUDE="-I$i" elif test -n "$RUBYARCHHDRDIR"; then RUBYINCLUDE="-I$i -I$RUBYARCHHDRDIR" else RUBYINCLUDE="-I$i -I$i/$RUBYARCH" fi AC_MSG_RESULT($RUBYINCLUDE) break fi done if test x"$RUBYINCLUDE" = x""; then AC_MSG_RESULT(could not locate ruby.h) fi # Find library and path for linking. AC_MSG_CHECKING(for Ruby library) RUBYLIB="" rb_archlibdir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["archlibdir"]]') 2>/dev/null` rb_libdir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["libdir"]]') 2>/dev/null` rb_bindir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["bindir"]]') 2>/dev/null` dirs="$dirs $rb_archlibdir $rb_libdir $rb_bindir" rb_libruby=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["LIBRUBY_A"]]') 2>/dev/null` RUBYLINK=`($RUBY -rrbconfig -e ' c = RbConfig::CONFIG if c.has_key? "LIBRUBYARG_STATIC" # 1.8.x if c[["LIBRUBY"]] == c[["LIBRUBY_A"]] link = c[["LIBRUBYARG_STATIC"]] else link = c[["LIBRUBYARG_SHARED"]] end else # 1.6.x link = "-l" + c[["RUBY_INSTALL_NAME"]] end # Get the target Ruby was built for target = c[["target"]] if target == "i386-pc-mswin32" # Need to change msvcrt-ruby*.lib to -lmsvcrt-ruby* ext = File.extname(link) # Get index that counts backwards from end of string index = -1 - ext.size # Strip off the extension link = link.slice(0..index) puts "-l#{link}" else puts link end') 2>/dev/null` if test "$rb_libruby" != ""; then for i in $dirs; do if (test -r $i/$rb_libruby;) then RUBYLIB="$i" break fi done fi if test "$RUBYLIB" = ""; then RUBYLIB="$RUBYDIR" AC_MSG_RESULT(not found... using $RUBYDIR) else AC_MSG_RESULT($RUBYLINK in $RUBYLIB) fi else AC_MSG_RESULT(unable to determine ruby configuration) fi case $host in *-*-mingw*) ;; # do nothing, the default windows libraries are already included *) RUBYLINK="$RUBYLINK `($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["LIBS"]]') 2>/dev/null`";; esac RUBYCCDLFLAGS=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["CCDLFLAGS"]]') 2>/dev/null` RUBYSO=.`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["DLEXT"]]') 2>/dev/null` else AC_MSG_RESULT(could not figure out how to run ruby) fi case $host in *-*-cygwin* | *-*-mingw*) RUBYDYNAMICLINKING="-L$RUBYLIB $RUBYLINK";; *) RUBYDYNAMICLINKING="";; esac fi AC_SUBST(RUBYINCLUDE) AC_SUBST(RUBYLIB) AC_SUBST(RUBYLINK) AC_SUBST(RUBYCCDLFLAGS) AC_SUBST(RUBYSO) AC_SUBST(RUBYDYNAMICLINKING) #------------------------------------------------------------------------- # Look for PHP7 #------------------------------------------------------------------------- PHPBIN= AC_ARG_WITH(php, AS_HELP_STRING([--without-php], [Disable PHP]) AS_HELP_STRING([--with-php=path], [Set location of PHP executable]),[ PHPBIN="$withval"], [PHPBIN="$alllang_default"]) # First, check for "--without-php" or "--with-php=no". if test x"${PHPBIN}" = xno; then AC_MSG_NOTICE([Disabling PHP]) PHP= else if test "x$PHPBIN" = xyes; then AC_CHECK_PROGS(PHP, [php7.3 php7.2 php7.1 php7.0 php]) else PHP=$PHPBIN fi if test -n "$PHP"; then AC_MSG_CHECKING(for PHP header files) dnl /usr/bin/php7.0 -> /usr/bin/php-config7.0 case $PHP in *7.*) PHPCONFIG=`echo "$PHP"|sed 's/7\...*$/-config&/'` ;; *) PHPCONFIG=$PHP-config ;; esac php_version=`$PHPCONFIG --version 2>/dev/null` case $php_version in 7.*) PHPINC=`$PHPCONFIG --includes 2>/dev/null` if test -n "$PHPINC"; then AC_MSG_RESULT($PHPINC) else AC_MSG_RESULT(not found) fi ;; "") AC_MSG_RESULT([could not find $PHPCONFIG or obtain PHP version from it]) ;; *) AC_MSG_RESULT([found PHP $php_version - not PHP 7]) ;; esac fi fi AC_SUBST(PHP) AC_SUBST(PHPINC) #---------------------------------------------------------------- # Look for OCaml #---------------------------------------------------------------- AC_ARG_WITH(ocaml, AS_HELP_STRING([--without-ocaml], [Disable OCaml]), [with_ocaml="$withval"], [with_ocaml="$alllang_default"]) AC_ARG_WITH(ocamlc,[ --with-ocamlc=path Set location of ocamlc executable],[ OCAMLC="$withval"], [OCAMLC=]) AC_ARG_WITH(ocamldlgen,[ --with-ocamldlgen=path Set location of ocamldlgen],[ OCAMLDLGEN="$withval" ], [OCAMLDLGEN=]) AC_ARG_WITH(ocamlfind,[ --with-ocamlfind=path Set location of ocamlfind],[OCAMLFIND="$withval"],[OCAMLFIND=]) AC_ARG_WITH(ocamlmktop,[ --with-ocamlmktop=path Set location of ocamlmktop executable],[ OCAMLMKTOP="$withval"], [OCAMLMKTOP=]) AC_ARG_WITH(camlp4,[ --with-camlp4=path Set location of camlp4 executable],[ CAMLP4="$withval"], [CAMLP4=]) # First, check for "--without-ocaml" or "--with-ocaml=no". if test x"${with_ocaml}" = xno; then AC_MSG_NOTICE([Disabling OCaml]) OCAMLC= else # OCaml compiler if test -z "$OCAMLC"; then AC_CHECK_PROGS(OCAMLC, ocamlc) fi # OCaml Pre-Processor-Pretty-Printer if test -z "$CAMLP4"; then AC_CHECK_PROGS(CAMLP4, camlp4) fi # OCaml DL load generator if test -z "$OCAMLDLGEN"; then AC_CHECK_PROGS(OCAMLDLGEN, ocamldlgen) fi # OCaml package tool if test -z "$OCAMLFIND"; then AC_CHECK_PROGS(OCAMLFIND, ocamlfind) fi # OCaml toplevel creator if test -z "$OCAMLMKTOP"; then AC_CHECK_PROGS(OCAMLMKTOP, ocamlmktop) fi fi AC_SUBST(OCAMLC) AC_SUBST(CAMLP4) AC_SUBST(OCAMLDLGEN) AC_SUBST(OCAMLFIND) AC_SUBST(OCAMLMKTOP) #---------------------------------------------------------------- # Look for C# #---------------------------------------------------------------- AC_ARG_WITH(csharp, AS_HELP_STRING([--without-csharp], [Disable CSharp]), [with_csharp="$withval"], [with_csharp="$alllang_default"]) AC_ARG_WITH(cil-interpreter, [ --with-cil-interpreter=path Set location of CIL interpreter for CSharp],[CSHARPBIN="$withval"], [CSHARPBIN=]) AC_ARG_WITH(csharp-compiler, [ --with-csharp-compiler=path Set location of CSharp compiler],[CSHARPCOMPILERBIN="$withval"], [CSHARPCOMPILERBIN=]) # First, check for "--without-csharp" or "--with-csharp=no". if test x"${with_csharp}" = xno; then AC_MSG_NOTICE([Disabling CSharp]) CSHARPCOMPILER= else if test -z "$CSHARPCOMPILERBIN" ; then case $host in *-*-cygwin* | *-*-mingw*) # prefer unified Mono mcs compiler (not to be confused with the ancient .NET 1 mcs) over older/alternative names. AC_CHECK_PROGS(CSHARPCOMPILER, csc mcs mono-csc gmcs cscc) if test -n "$CSHARPCOMPILER" && test "$CSHARPCOMPILER" = "csc" ; then AC_MSG_CHECKING(whether csc is the Microsoft CSharp compiler) csc 2>/dev/null | grep "C#" > /dev/null || CSHARPCOMPILER="" if test -z "$CSHARPCOMPILER" ; then AC_MSG_RESULT(no) AC_CHECK_PROGS(CSHARPCOMPILER, mcs mono-csc gmcs cscc) else AC_MSG_RESULT(yes) fi fi ;; *)AC_CHECK_PROGS(CSHARPCOMPILER, mono-csc gmcs mcs cscc);; esac else CSHARPCOMPILER="$CSHARPCOMPILERBIN" fi CSHARPCONVERTPATH="Tools/convertpath -u" if test -z "$CSHARPBIN" ; then CSHARPCILINTERPRETER="" CSHARPCILINTERPRETER_FLAGS="" if test "cscc" = "$CSHARPCOMPILER" ; then AC_CHECK_PROGS(CSHARPCILINTERPRETER, ilrun) else if test "mcs" = "$CSHARPCOMPILER"; then # Check that mcs is the C# compiler and not the Unix mcs utility by examining the output of 'mcs --version' # The Mono compiler should emit: Mono C# compiler version a.b.c.d csharp_version_raw=`(mcs --version) 2>/dev/null` csharp_version_searched=`(mcs --version | sed -e "/C#/b" -e "/Mono/b" -e d) 2>/dev/null` # return string if contains 'Mono' or 'C#' CSHARPCOMPILER="" if test -n "$csharp_version_raw" ; then if test "$csharp_version_raw" = "$csharp_version_searched" ; then CSHARPCOMPILER="mcs" fi fi if test "mcs" != "$CSHARPCOMPILER" ; then echo "mcs is not a working Mono C# compiler" fi fi if test "mcs" = "$CSHARPCOMPILER" || test "gmcs" = "$CSHARPCOMPILER" || test "mono-csc" = "$CSHARPCOMPILER"; then AC_CHECK_PROGS(CSHARPCILINTERPRETER, mono) # Mono JIT CSHARPCILINTERPRETER_FLAGS="--debug" else if test "csc" = "$CSHARPCOMPILER"; then CSHARPCONVERTPATH="Tools/convertpath -w" fi fi fi else CSHARPCILINTERPRETER="$CSHARPBIN" fi # Cygwin requires the Windows standard (Pascal) calling convention as it is a Windows executable and not a Cygwin built executable case $host in *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then CSHARPDYNAMICLINKING="$GCC_MNO_CYGWIN -mthreads -Wl,--add-stdcall-alias" CSHARPCFLAGS="$GCC_MNO_CYGWIN -mthreads" else CSHARPDYNAMICLINKING="" CSHARPCFLAGS="" fi ;; *) CSHARPDYNAMICLINKING="" CSHARPCFLAGS="" ;; esac # CSharp on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls case $host in *-*-cygwin* | *-*-mingw*) CSHARPLIBRARYPREFIX="";; *)CSHARPLIBRARYPREFIX="lib";; esac # C#/Mono on Mac OS X tweaks case $host in *-*-darwin*) CSHARPSO=".so" ;; *) CSHARPSO=$SO ;; esac fi AC_SUBST(CSHARPCILINTERPRETER_FLAGS) AC_SUBST(CSHARPCILINTERPRETER) AC_SUBST(CSHARPCONVERTPATH) AC_SUBST(CSHARPCOMPILER) AC_SUBST(CSHARPDYNAMICLINKING) AC_SUBST(CSHARPLIBRARYPREFIX) AC_SUBST(CSHARPCFLAGS) AC_SUBST(CSHARPSO) #---------------------------------------------------------------- # Look for Lua #---------------------------------------------------------------- LUABIN= LUAINCLUDE= LUALIB= LUADYNAMICLOADLIB= LUAFLAGS= LUALINK= # note: if LUABIN is empty then lua tests will not be done # LUABIN will be cleared if certain dependencies cannot be found AC_ARG_WITH(lua, AS_HELP_STRING([--without-lua], [Disable Lua]) AS_HELP_STRING([--with-lua=path], [Set location of Lua executable]),[ LUABIN="$withval"], [LUABIN="$alllang_default"]) AC_ARG_WITH(luaincl,[ --with-luaincl=path Set location of Lua include directory],[ LUAINCLUDE="$withval"], [LUAINCLUDE=]) AC_ARG_WITH(lualib,[ --with-lualib=path Set location of Lua library directory],[ LUALIB="$withval"], [LUALIB=]) # First, check for "--without-lua" or "--with-lua=no". if test x"${LUABIN}" = xno; then AC_MSG_NOTICE([Disabling Lua]) else # can we find lua? if test "x$LUABIN" = xyes; then # We look for a versioned Lua binary first, as there can be # multiple versions of Lua installed on some systems (like Debian). AC_PATH_PROGS(LUABIN, [lua5.4 lua5.3 lua5.2 lua5.1 lua]) fi # check version: we need Lua 5.x if test "$LUABIN"; then AC_MSG_CHECKING(Lua version) [LUA_VERSION=`$LUABIN -e 'print(string.match(_VERSION, "%d+[.]%d+"))'`] # For 5.0 and 5.1 header and libraries may be named using 50 or 51. LUA_VERSION_NO_DOTS= if test -n "$LUA_VERSION" ; then AC_MSG_RESULT([Lua $LUA_VERSION.x]) else AC_MSG_RESULT([failed]) fi case $LUA_VERSION in 5.0) LUA_VERSION_NO_DOTS=50 ;; 5.1) LUA_VERSION_NO_DOTS=51 ;; 5.*) ;; *) AC_MSG_WARN([Not Lua 5.x, SWIG does not support this version of Lua]) LUABIN="" ;; esac fi if test "$LUABIN"; then AC_MSG_CHECKING(whether Lua dynamic loading is enabled) # using Lua to check Lua # lua 5.0 & 5.1 have different fn names if test "$LUA_VERSION" = "5.0"; then LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=loadlib("no_such_lib","") if c~="absent" then print "1" end'` else LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=package.loadlib("no_such_lib","") if c~="absent" then print "1" end'` fi if test -z "$LUADYNAMICLOADLIB"; then AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi # look for the header files & set LUAFLAGS accordingly # will clear LUABIN if not present if test -n "$LUAINCLUDE"; then AC_CHECK_FILE($LUAINCLUDE/lua.h,[LUAFLAGS="-I$LUAINCLUDE"],[LUABIN=]) else LUA_OK="1" CFLAGS_SAVED=$CFLAGS CFLAGS= # Use empty CFLAGS to avoid failure: "present but cannot be compiled" AC_CHECK_HEADER([lua.h],[LUAFLAGS=""],[LUA_OK=""]) CFLAGS=$CFLAGS_SAVED # if we didn't get it, going to have to look elsewhere (the hard way) if test -z "$LUA_OK"; then AC_MSG_CHECKING(for lua.h in other locations) # note: Debian/Ubuntu seem to like /usr/include/lua5.1/lua.h # The ordering of the include directories to search should match # the ordering of libraries to search in the library test below. inc=/usr/include incloc=/usr/local/include dirs="$inc/lua$LUA_VERSION" test -z "$LUA_VERSION_NO_DOTS" || dirs="$dirs $inc/lua$LUA_VERSION_NO_DOTS" dirs="$dirs $incloc/lua$LUA_VERSION" test -z "$LUA_VERSION_NO_DOTS" || dirs="$dirs $incloc/lua$LUA_VERSION_NO_DOTS" dirs="$dirs $incloc" for i in $dirs; do #echo "$i" if test -r $i/lua.h; then AC_MSG_RESULT($i/lua.h) LUAFLAGS="-I$i" break fi done if test -z "$LUAFLAGS"; then AC_MSG_RESULT(not found) LUABIN="" # clear the bin fi fi fi # look for the library files & set LUALINK accordingly # will clear LUABIN if not present lua_save_LIBS=$LIBS # the code seems to disrupt LIBS, so saving if test -n "$LUALIB"; then AC_CHECK_FILE($LUALIB/liblua.a,[LUALINK="-L$LUALIB -llua"],[LUABIN=]) else libs="lua lua$LUA_VERSION" test -z "$LUA_VERSION_NO_DOTS" || libs="$libs lua$LUA_VERSION_NO_DOTS" AC_SEARCH_LIBS(lua_close, [$libs], [LUALINK="-l$ac_lib"],[LUABIN=]) fi # adding lualib for lua 5.0 if test "$LUA_VERSION" = "5.0"; then LUALINK="$LUALINK -llualib" fi LIBS=$lua_save_LIBS # restore LIBS fi fi # if not disabled AC_SUBST(LUADYNAMICLINKING) AC_SUBST(LUAFLAGS) AC_SUBST(LUALINK) AC_SUBST(LUABIN) #---------------------------------------------------------------- # Look for GNU R #---------------------------------------------------------------- RBIN= AC_ARG_WITH(r, AS_HELP_STRING([--without-r], [Disable R]) AS_HELP_STRING([--with-r=path], [Set location of R executable (r)]),[ RBIN="$withval"], [RBIN="$alllang_default"]) # First, check for "--without-r" or "--with-r=no". if test x"${RBIN}" = xno; then AC_MSG_NOTICE([Disabling R]) RBIN= else # can we find R? if test "x$RBIN" = xyes; then AC_PATH_PROG(RBIN, R) fi fi AC_SUBST(RBIN) #---------------------------------------------------------------- # Look for Go compilers #---------------------------------------------------------------- AC_ARG_WITH(go, AS_HELP_STRING([--without-go], [Disable Go]) AS_HELP_STRING([--with-go=path], [Set location of Go compiler]),[GOBIN="$withval"], [GOBIN="$alllang_default"]) if test x"${GOBIN}" = xno; then AC_MSG_NOTICE([Disabling Go]) GO= GOGCC=false GCCGO= GOOPT= GCCGOOPT= GOVERSIONOPTION= else if test "x$GOBIN" = xyes; then AC_CHECK_PROGS(GO, go) else GO="$GOBIN" fi GOGCC=false GCCGO= GOOPT= GCCGOOPT= GOVERSIONOPTION= if test -n "$GO" ; then GOVERSIONOPTION=version go_version=$($GO $GOVERSIONOPTION | sed -e 's/go version //') AC_MSG_CHECKING([whether go version is too old]) case $go_version in go1.[012]*) AC_MSG_RESULT([yes - minimum version is 1.3]) GO= GOOPT="-intgosize 32" ;; *) AC_MSG_RESULT([no]) case "$(go env GOARCH)" in amd64 | arm64 | ppc64*) GOOPT="-intgosize 64" ;; *) GOOPT="-intgosize 32" ;; esac ;; esac fi AC_CHECK_PROGS(GCCGO, gccgo) if test -n "$GCCGO" ; then if $GCCGO --help 2>/dev/null | grep gccgo >/dev/null 2>&1 ; then AC_MSG_CHECKING([whether gccgo version is too old]) go_version=[`$GO $GOVERSIONOPTION | sed -n '1p' | sed -e 's/^.* \([0-9.]*\) *$/\1/' -e 's/[.]//g'`] if test "x$go_version" = x; then AC_MSG_RESULT([could not determine gccgo version]) GCCGO= elif test "$go_version" -lt 470; then AC_MSG_RESULT([yes - minimum version is 4.7.0]) GCCGO= else AC_MSG_RESULT([no]) if test "$go_version" -lt 480; then GCCGOOPT="-intgosize 32" else AC_CHECK_SIZEOF([void *], [4]) if test "$ac_cv_sizeof_void_p" = "8"; then GCCGOOPT="-intgosize 64" else GCCGOOPT="-intgosize 32" fi fi fi fi fi fi AC_SUBST(GOGCC) AC_SUBST(GCCGO) AC_SUBST(GO) AC_SUBST(GOC) AC_SUBST(GO1) AC_SUBST(GO12) AC_SUBST(GO13) AC_SUBST(GO15) AC_SUBST(GOOPT) AC_SUBST(GCCGOOPT) AC_SUBST(GOVERSIONOPTION) #---------------------------------------------------------------- # Look for D #---------------------------------------------------------------- AC_ARG_WITH(d, AS_HELP_STRING([--without-d], [Disable D]), [with_d="$withval"], [with_d="$alllang_default"]) AC_ARG_WITH(d1-compiler, [ --with-d1-compiler=path Set location of D1/Tango compiler (DMD compatible)],[D1COMPILERBIN="$withval"], [D1COMPILERBIN=]) AC_ARG_WITH(d2-compiler, [ --with-d2-compiler=path Set location of D2 compiler (DMD compatible)],[D2COMPILERBIN="$withval"], [D2COMPILERBIN=]) # First, check for "--without-d" or "--with-d=no". if test x"${with_d}" = xno; then AC_MSG_NOTICE([Disabling D]) D1COMPILER= D2COMPILER= else old_ac_ext=$ac_ext ac_ext=d if test -z "$D1COMPILERBIN" ; then AC_CHECK_PROGS(D1COMPILER, dmd ldmd gdmd) if test -n "$D1COMPILER" ; then AC_MSG_CHECKING(whether the D1/Tango compiler works) cat > conftest.$ac_ext <<_ACEOF import tango.io.Stdout; void main() { } _ACEOF rm -f conftest.$ac_objext AS_IF( [$D1COMPILER conftest.$ac_ext 2>&AS_MESSAGE_LOG_FD && test ! -s conftest.err && test -s conftest.$ac_objext], [AC_MSG_RESULT([yes])], [_AC_MSG_LOG_CONFTEST AC_MSG_RESULT([no]) D1COMPILER=] ) rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else D1COMPILER="$D1COMPILERBIN" fi if test -z "$D2COMPILERBIN" ; then AC_CHECK_PROGS(D2COMPILER, dmd gdmd) if test -n "$D2COMPILER" ; then AC_MSG_CHECKING(whether the D2 compiler works) cat > conftest.$ac_ext <<_ACEOF import std.algorithm; void main() { } _ACEOF rm -f conftest.$ac_objext AS_IF( [$D2COMPILER conftest.$ac_ext 2>&AS_MESSAGE_LOG_FD && test ! -s conftest.err && test -s conftest.$ac_objext], [AC_MSG_RESULT([yes])], [_AC_MSG_LOG_CONFTEST AC_MSG_RESULT([no]) D2COMPILER=] ) rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else D2COMPILER="$D2COMPILERBIN" fi ac_ext=$old_ac_ext fi if test -n "$D1COMPILER"; then DDEFAULTVERSION=1 elif test -n "$D2COMPILER"; then DDEFAULTVERSION=2 fi # Do not prefix library file names with "lib" on Windows. case $host in *-*-cygwin* | *-*-mingw*) DLIBPREFIX="";; *)DLIBPREFIX="lib";; esac AC_SUBST(D1COMPILER) AC_SUBST(D2COMPILER) AC_SUBST(DDEFAULTVERSION) AC_SUBST(DLIBPREFIX) #---------------------------------------------------------------- # Determine which languages to use for examples/test-suite #---------------------------------------------------------------- SKIP_TCL= if test -z "$TCLINCLUDE" || test -z "$TCLLIB" ; then SKIP_TCL="1" fi AC_SUBST(SKIP_TCL) SKIP_PERL5= if test -z "$PERL" || test -z "$PERL5EXT" || test -z "$PERL5TESTMORE"; then SKIP_PERL5="1" fi AC_SUBST(SKIP_PERL5) SKIP_OCTAVE= if test -z "$OCTAVE" ; then SKIP_OCTAVE="1" fi AC_SUBST(SKIP_OCTAVE) SKIP_PYTHON= if (test -z "$PYINCLUDE" || test -z "$PYLINK") && (test -z "$PY3INCLUDE" || test -z "$PY3LINK") ; then SKIP_PYTHON="1" fi AC_SUBST(SKIP_PYTHON) SKIP_PYTHON3= if test -z "$PY3INCLUDE" || test -z "$PY3LINK" ; then SKIP_PYTHON3="1" fi AC_SUBST(SKIP_PYTHON3) SKIP_JAVA= if test -z "$JAVA" || test -z "$JAVAC" || test -z "$JAVAINC" ; then SKIP_JAVA="1" fi AC_SUBST(SKIP_JAVA) SKIP_JAVASCRIPT= if test -z "$JAVASCRIPT" || ( test -z "$NODEJS" && test -z "$JSCENABLED" && test -z "$JSV8ENABLED" ) ; then SKIP_JAVASCRIPT="1" fi AC_SUBST(SKIP_JAVASCRIPT) SKIP_GUILE= if test -z "$GUILE" || test -z "$GUILE_LIBS" ; then SKIP_GUILE="1" fi AC_SUBST(SKIP_GUILE) SKIP_MZSCHEME= if test -z "$MZC" || test -z "$MZDYNOBJ" ; then SKIP_MZSCHEME="1" fi AC_SUBST(SKIP_MZSCHEME) SKIP_RUBY= if test -z "$RUBY" || test -z "$RUBYINCLUDE" || test -z "$RUBYLIB" ; then SKIP_RUBY="1" fi AC_SUBST(SKIP_RUBY) SKIP_PHP= if test -z "$PHP" || test -z "$PHPINC" ; then SKIP_PHP="1" fi AC_SUBST(SKIP_PHP) SKIP_OCAML= if test -z "$OCAMLC" || test -z "$CAMLP4" ; then SKIP_OCAML="1" fi AC_SUBST(SKIP_OCAML) SKIP_CSHARP= if test -z "$CSHARPCOMPILER" ; then SKIP_CSHARP="1" else if test "cscc" = "$CSHARPCOMPILER" && test -z "$CSHARPCILINTERPRETER" ; then SKIP_CSHARP="1" fi fi AC_SUBST(SKIP_CSHARP) SKIP_LUA= # we need LUABIN & dynamic loading if test -z "$LUABIN" || test -z "$LUADYNAMICLOADLIB"; then SKIP_LUA="1" fi AC_SUBST(SKIP_LUA) SKIP_R= if test -z "$RBIN" ; then SKIP_R="1" fi AC_SUBST(SKIP_R) SKIP_SCILAB= if test -z "$SCILAB"; then SKIP_SCILAB="1" fi AC_SUBST(SKIP_SCILAB) SKIP_GO= if test -z "$GO" ; then SKIP_GO="1" fi AC_SUBST(SKIP_GO) SKIP_D= if test -z "$DDEFAULTVERSION" ; then SKIP_D="1" fi AC_SUBST(SKIP_D) #---------------------------------------------------------------- # Additional language dependencies #---------------------------------------------------------------- SKIP_ANDROID= if test -z "$ANDROID" || test -z "$ADB" || test -z "$ANT" || test -z "$NDKBUILD" ; then SKIP_ANDROID="1" fi AC_SUBST(SKIP_ANDROID) #---------------------------------------------------------------- # Miscellaneous #---------------------------------------------------------------- ABS_SRCDIR=`(cd ${srcdir} && pwd)` dnl Under Cygwin, we may need native absolute path as it is used by SWIG, which dnl may be a native, and not a Cygwin, program (this is the case when it's dnl built using MinGW or cccl compiler in Cygwin environment). However it may, dnl although this is probably more rare, also be built as a Cygwin program. dnl Using "mixed" path like we do here allows the path to work in both cases. case $host in *-*-mingw* ) ABS_SRCDIR=`${srcdir}/Tools/convertpath -m $ABS_SRCDIR` ;; *-*-cygwin* ) ABS_SRCDIR=`cygpath --mixed $ABS_SRCDIR` ;; esac # Root directory ROOT_DIR=`pwd` case $host in *-*-cygwin*) # Translate path for native Windows compilers for use with 'make check' if (cygpath --mixed $ROOT_DIR) >/dev/null 2>/dev/null; then ROOT_DIR=`cygpath --mixed $ROOT_DIR` fi ;; esac case $host in *-*-cygwin* | *-*-mingw*) # Extra files generated by some Windows compilers EXTRA_CLEAN="*.stackdump *.exp *.lib *.pdb *.ilk" ;; esac AC_SUBST(ROOT_DIR) AC_SUBST(EXTRA_CLEAN) AC_SUBST(ac_aux_dir) # Configure SWIG_LIB path AC_ARG_WITH(swiglibdir,[ --with-swiglibdir=DIR Put SWIG system-independent libraries into DIR.], [swig_lib="$withval"], [swig_lib="${datadir}/swig/${PACKAGE_VERSION}"]) SWIG_LIB_INSTALL=${swig_lib} AC_SUBST(SWIG_LIB_INSTALL) AC_DEFINE_DIR(SWIG_LIB, swig_lib, [Directory for SWIG system-independent libraries]) case $build in # Windows does not understand unix directories. Convert into a windows directory with drive letter. *-*-mingw*) SWIG_LIB_WIN_UNIX=`${srcdir}/Tools/convertpath -m $SWIG_LIB`;; *-*-cygwin*) SWIG_LIB_WIN_UNIX=`cygpath --mixed "$SWIG_LIB"`;; *) SWIG_LIB_WIN_UNIX="";; esac AC_DEFINE_UNQUOTED(SWIG_LIB_WIN_UNIX, ["$SWIG_LIB_WIN_UNIX"], [Directory for SWIG system-independent libraries (Unix install on native Windows)]) SWIG_LIB_PREINST=$ABS_SRCDIR/Lib AC_SUBST(SWIG_LIB_PREINST) dnl For testing purposes, clear SWIG_LIB when building SWIG in the source dnl directory under Windows because it is supposed to work without SWIG_LIB dnl being set. Otherwise it always needs to be set. SWIG_LIB_SET="env SWIG_LIB=\$(SWIG_LIB_DIR)" if test "${srcdir}" = "."; then AC_EGREP_CPP([yes], [#ifdef _WIN32 yes #endif ], [SWIG_LIB_SET="env SWIG_LIB="], []) fi AC_SUBST(SWIG_LIB_SET) AC_CONFIG_FILES([ Makefile swig.spec Examples/Makefile Examples/d/example.mk Examples/xml/Makefile Examples/test-suite/errors/Makefile Examples/test-suite/csharp/Makefile Examples/test-suite/d/Makefile Examples/test-suite/guile/Makefile Examples/test-suite/java/Makefile Examples/test-suite/javascript/Makefile Examples/test-suite/mzscheme/Makefile Examples/test-suite/ocaml/Makefile Examples/test-suite/octave/Makefile Examples/test-suite/perl5/Makefile Examples/test-suite/php/Makefile Examples/test-suite/python/Makefile Examples/test-suite/ruby/Makefile Examples/test-suite/scilab/Makefile Examples/test-suite/tcl/Makefile Examples/test-suite/lua/Makefile Examples/test-suite/r/Makefile Examples/test-suite/go/Makefile Source/Makefile Tools/javascript/Makefile ]) AC_CONFIG_FILES([preinst-swig], [chmod +x preinst-swig]) AC_CONFIG_FILES([CCache/ccache_swig_config.h]) #-------------------------------------------------------------------- # Building Examples/ out of source directory #-------------------------------------------------------------------- # If building out of source tree, replicate Examples/ source tree in # build directory, and copy over Makefiles from source directory. # Prefix each Makefile with a header which sets SRCDIR to the relative # source directory, and provides a rule for updating the Makefile from # its original source. AC_CONFIG_COMMANDS([Examples],[ if test "x${srcdir}" != "x." ; then AC_MSG_NOTICE([generating Examples build tree]) for mkfile in `cd ${srcdir} && find Examples/ -type f -name Makefile`; do dir=`dirname ${mkfile}` d=${dir} reldir="" while test "x$d" != "x." ; do d=`dirname $d` reldir="${reldir}../" done relsrcdir=${reldir}${srcdir}/ AS_MKDIR_P([${dir}]) cat <${mkfile} # DO NOT EDIT: instead edit ${relsrcdir}${mkfile} # and run (cd ${reldir} && ./config.status) to regenerate TOP_BUILDDIR_TO_TOP_SRCDIR = ${srcdir}/ SRCDIR = ${relsrcdir}${dir}/ EOF cat ${srcdir}/${mkfile} >>${mkfile} done fi ]) #-------------------------------------------------------------------- AC_OUTPUT langs="" test -n "$SKIP_CSHARP" || langs="${langs}csharp " test -n "$SKIP_D" || langs="${langs}d " test -n "$SKIP_GO" || langs="${langs}go " test -n "$SKIP_GUILE" || langs="${langs}guile " test -n "$SKIP_JAVA" || langs="${langs}java " test -n "$SKIP_JAVASCRIPT" || langs="${langs}javascript " test -n "$SKIP_LUA" || langs="${langs}lua " test -n "$SKIP_MZSCHEME" || langs="${langs}mzscheme " test -n "$SKIP_OCAML" || langs="${langs}ocaml " test -n "$SKIP_OCTAVE" || langs="${langs}octave " test -n "$SKIP_PERL5" || langs="${langs}perl5 " test -n "$SKIP_PHP" || langs="${langs}php " test -n "$SKIP_PYTHON" || langs="${langs}python " test -n "$SKIP_R" || langs="${langs}r " test -n "$SKIP_RUBY" || langs="${langs}ruby " test -n "$SKIP_SCILAB" || langs="${langs}scilab " test -n "$SKIP_TCL" || langs="${langs}tcl " echo " The SWIG test-suite and examples are configured for the following languages: $langs " dnl configure.ac ends here swig-4.0.2/Win/0000755000175000017500000000000013667507523013117 5ustar williamwilliamswig-4.0.2/Win/README.txt0000644000175000017500000000023113667507523014611 0ustar williamwilliamPlease see the Doc/Manual/Windows.html file in the main manual for instructions for using and installing SWIG on Windows including running the examples. swig-4.0.2/TODO0000644000175000017500000002410313667507523013052 0ustar williamwilliamSWIG TO-DO ----------------------------------------------------------------------------- **** = High Priority *** = Implement if possible. ** = Will implement if time. * = Implement if bored (or deemed necessary). defer = Implement in next version CORE: **** Add support for nested classes. The type system should be defer ready to go. The primary obstacle lies in the target language modules (which were never programmed with nested classes in mind). There are also issues with nested C structures. For example: struct Foo { struct { int x,y; } z; }; This is one of the last remaining "hard" problems in the SWIG core, but it is important that we solve it. *** "Nested" typemaps. The basic idea is similar to allowing one to use $descriptor(T) for any T, rather than just $descriptor for the type currently being typemapped. In short (ha!), given a previously defined typemap: %typemap(in) Foo { // whatever it takes to initialize $1 from $input } it would be possible to inline its code inside another typemap. While the syntax is still to be defined, the use would be along the lines of: template class vector { %typemap(in) vector { ... for (int i=0; i $typemap(in, input=x) ( int FIRST = foo, double SECOND = bar ); The advantage of this syntax would be that the formal arguments (int FIRST, double SECOND) are close to the actual arguments (foo, bar). Comment by beazley $typemap(in, input=x) int = foo; is a little bit hard to parse in terms of variable substitution. I'm considering something like this: $typemap(in,1=int foo, input=x) Note: This is partially implemented in the new Unified Typemap Library(python,tcl,ruby and perl) via %fragments and the SWIG_From/SWIG_AsVal methdos. *** Implement $fail special variable substitution in wrappers. Used to properly transfer control out of a wrapper function while reclaiming resources. Note: Implemented in languages that uses the UTL via the 'SWIG_fail' macro. *** Rewrite declaration annotation to better unify %rename and related directives. Add a selector mechanism that allows specific parse tree nodes to be identified. For example: %feature("foo", nodetype="class") Foo { ... some code ... }; Consider use of wildcards. Namespace/nested scope support in %feature is currently weak. It works, but is fragile. Consider an implementation that is better integrated with symbol table management. Continue to consolidate SWIG directives to %feature. Note: Initial implementation in the %rename directive. *** Add more intelligent information related to object ownership. SWIG should be able to automatically strip ownership from objects when they are assigned to pointer variables and structure members as well as stored in a container (i.e., an array of pointers). [ Partially finished for Ruby/Perl/Tcl/Python. ] ** Restoration of the documentation system. [ Partially done for Python. ] ** Restoration of Objective-C support. ** Unification of symbol tables and type system scopes. In a sense they capture the same information so it is not necessary to have both. The existence of two symbol management systems is mostly historical. Build ----- Library ------- **** Add more support for the C++ standard library. std::complex and other core datatypes. Refine support for STL vector. Add more STL objects. [ Partially finished for Python. ] **** Continue to expand the set of recognized typemaps. Windows ------- All language modules -------------------- Python ------ *** Ability to wrap certain classes as Python built-in types. Perl ---- **** Rewrite runtime pointer type checking to better integrate shadow classes. Creation of shadow classes should be done in C instead of Perl. This will fix a number of problems related to typemaps and reduce the amount of Perl wrapper code. **** Create tests for existing support for operator overloading Tcl --- Ruby ---- **** The "Resource Management in Proxies" section of the "SWIG and C++" chapter discusses how proxies' ownership of their associated C++ object can change, and the use of the special disown() and acquire() methods to change this ownership status. Need to address this for Ruby as well. *** Add support for keyword arguments (by collecting them in a hash?). Java ---- C# -- PHP --- **** Look at moving to using the UTL. ** When returning wrapped objects via alternate constructors if that pointer value already exists "out there" as a resource we should use the same resource, we can't have multiple ref-counted resources mapping to the same object in case it gets twice destroyed. And check if ref count destroying is even working, see smart_pointer_rename * Work out how classes without even inherited constructors should interact with the php "new " notation. See: abstract_inherit_wrap.cpptest ** Look at pass by point and passby ref, Make sometype** to be auto allocated Make sometype& and sometype* to be autoallocated IF THEY ARE NOT ALREADY swigtype wrapped. * Review to see what else is missing! Guile ----- ** Maybe rename slot setters from CLASS-SLOT-set to CLASS-SLOT-set! to match Scheme convention for naming of mutators. ** Support keyword args. ** Director Support! ** Cleaner handling of multiple values. Use a typemap keyword argument "numoutputs" of "out" and "argout" to indicate how many values are returned. ** Make SWIG's types first-class by using a separate smob type for SWIG type descriptors; enable reflection on types. (Maybe GOOPS metaclasses?) ** Provide a clean way to construct type predicates. ** In GOOPS mode, maybe make overloaded functions methods. ** Increase the safety of destructor functions. John Lenz suggests: I think the best way of doing this would be to use %feature to mark which classes allow for "normal" smobs to be deleted explicitly. We separate pointers into two classes, those that can be deleted from scheme and those that can't. The pointers that can be deleted use the smob and those that can not be deleted use the smob. A user can specify which type of each object they want with %newobject and the CONSUMED typemap. By default, the exported destructor will only accept smobs, because by definition, collectable-swig smobs are those that can be deleted from scheme. This allows for the user to implement protection. In the interface file, the user has complete control over which objects can and can not be deleted, and can guarantee that objects that should not be deleted can not be deleted, and that objects that should eventually be deleted will be garbage collected. This protection can then be overridden with a %feature directive, something like %feature("guile_allow_destroy_all","1") Foo::~Foo; I don't know what word we want to use, guile_allow_destroy_all is kinda bad. This feature would then allow for a smob to be deleted by passing it to the destructor. This would allow users to maintain the protection on other classes, only manually overriding the protection on the classes that need it. Mzscheme -------- ** Port list-vector.i and pointer-in-out.i from Guile. ** Add shadow class support for the Swindle system. Ocaml ----- ** I've been working with my camlp4 module and type information from the compiler. When I'm done, the user will have access to type inference when writing code, when the inference is unambiguous. This allows the user to write x = _foo 1.0 instead of x = get_float (_foo (C_float 1.0)). It's not as easy as it sounds, because O'caml doesn't keep type information at run time, and doesn't really have a mechanism for doing what I need. However, it's possible to write a preprocessor that inserts correct type info at compile time. That having been said, the program must compile for type info to be available, so I need to attend to a lot of details; The program must compile both with and without type augmentation. Xml --- Documentation ------------- **** Extending SWIG (and internals). *** Perl, Python, Tcl modules. *** add section for Perl module support for operator overloading swig-4.0.2/configure0000755000175000017500000137446613667507560014317 0ustar williamwilliam#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for swig 4.0.2. # # 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" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: http://www.swig.org about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # 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'" 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='swig' PACKAGE_TARNAME='swig' PACKAGE_VERSION='4.0.2' PACKAGE_STRING='swig 4.0.2' PACKAGE_BUGREPORT='http://www.swig.org' PACKAGE_URL='' ac_unique_file="Source/Swig/swig.h" enable_option_checking=no # 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 LIBOBJS SWIG_LIB_SET SWIG_LIB_PREINST SWIG_LIB SWIG_LIB_INSTALL ac_aux_dir EXTRA_CLEAN ROOT_DIR SKIP_ANDROID SKIP_D SKIP_GO SKIP_SCILAB SKIP_R SKIP_LUA SKIP_CSHARP SKIP_OCAML SKIP_PHP SKIP_RUBY SKIP_MZSCHEME SKIP_GUILE SKIP_JAVASCRIPT SKIP_JAVA SKIP_PYTHON3 SKIP_PYTHON SKIP_OCTAVE SKIP_PERL5 SKIP_TCL DLIBPREFIX DDEFAULTVERSION D2COMPILER D1COMPILER GOVERSIONOPTION GCCGOOPT GOOPT GO15 GO13 GO12 GO1 GOC GOGCC GCCGO GO RBIN LUALINK LUAFLAGS LUADYNAMICLINKING LUABIN CSHARPSO CSHARPCFLAGS CSHARPLIBRARYPREFIX CSHARPDYNAMICLINKING CSHARPCONVERTPATH CSHARPCILINTERPRETER_FLAGS CSHARPCILINTERPRETER CSHARPCOMPILER OCAMLMKTOP OCAMLFIND OCAMLDLGEN CAMLP4 OCAMLC PHPINC PHP RUBYDYNAMICLINKING RUBYSO RUBYCCDLFLAGS RUBYLINK RUBYLIB RUBYINCLUDE RUBY MZDYNOBJ MZC MZSCHEME GUILE_LIBS GUILE_CFLAGS GUILE GUILE_CONFIG NDKBUILD ANT ADB ANDROID JSV8ENABLED JSCENABLED JSV8DYNAMICLINKING JSV8INC JSCOREVERSION JSCOREDYNAMICLINKING JSCOREINC JSINTERPRETERLINKFLAGS JSINTERPRETERCXX NODEGYP NODEJS JAVACFLAGS JAVAFLAGS JAVACXXSHARED JAVALDSHARED JAVASO JAVALIBRARYPREFIX JAVADYNAMICLINKING JAVA_CLASSPATH_SEP JAVAINC JAVA_SKIP_DOXYGEN_TEST_CASES JAVAC JAVA SCILABOPT SCILABINCLUDE SCILAB OCTAVE_LDFLAGS OCTAVE_CXXFLAGS OCTAVE_CPPFLAGS OCTAVE_SO OCTAVE PERL5LDFLAGS PERL5CCCDLFLAGS PERL5CCDLFLAGS PERL5CCFLAGS PERL5LIB PERL5DYNAMICLINKING PERL5EXT PERL PY2TO3 PYCODESTYLE PYTHON3DYNAMICLINKING PY3LINK PY3LIB PY3INCLUDE PY3CONFIG PYTHON3 PYTHONDYNAMICLINKING PYLINK PYLIB PYINCLUDE PYTHON TCLCXXSHARED TCLLDSHARED TCLDYNAMICLINKING TCLLIB TCLINCLUDE PKGCONFIG LIBC LIBCRYPT LIBM SWILL SWIGLIBS LUA_SO MZSCHEME_SO PHP_SO GUILE_SO TCL_SO PYTHON_SO LINKFORSHARED HAVE_CXX11_COMPILER PLATCXXFLAGS PLATCFLAGS RPATH TRYLINKINGWITHCXX CXXSHARED CCSHARED LDSHARED SO PCHINCLUDEEXT PCHINCLUDEARG PCHSUPPORT BOOST_LDFLAGS BOOST_CPPFLAGS YFLAGS YACC ENABLE_CCACHE subdirs PCRE_LIBS PCRE_CFLAGS PCRE_CONFIG SED EGREP GREP CPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX 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 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 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 runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking with_maximum_compile_warnings with_popen with_pcre with_pcre_prefix with_pcre_exec_prefix enable_ccache with_boost with_boost_libdir enable_cpp11_testing with_libm with_libc with_alllang with_tclconfig with_tcl with_tclincl with_tcllib with_python with_python3 with_2to3 with_perl5 with_octave with_scilab with_scilab_inc with_java with_javac with_javaincl with_javascript with_jscoreinc with_jscorelib with_jsv8inc with_jsv8lib with_android with_adb with_ant with_ndk_build with_guile_config with_guile with_guile_cflags with_guile_libs with_mzscheme with_mzc with_ruby with_php with_ocaml with_ocamlc with_ocamldlgen with_ocamlfind with_ocamlmktop with_camlp4 with_csharp with_cil_interpreter with_csharp_compiler with_lua with_luaincl with_lualib with_r with_go with_d with_d1_compiler with_d2_compiler with_swiglibdir ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP PCRE_CONFIG PCRE_CFLAGS PCRE_LIBS YACC YFLAGS' ac_subdirs_all='CCache' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: 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 runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures swig 4.0.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/swig] --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 swig 4.0.2:";; 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-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-ccache disable building and installation of ccache-swig executable (default enabled) --enable-cpp11-testing enable C++11 testing if supported by compiler (default disabled) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --without-maximum-compile-warnings Disable maximum warning verbosity --without-popen Disable popen --without-pcre Disable support for regular expressions using PCRE --with-pcre-prefix=PREFIX Prefix where pcre is installed (optional) --with-pcre-exec-prefix=EPREFIX Exec prefix where pcre is installed (optional) --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-libm=STRING math library --with-libc=STRING C library --without-alllang Disable all languages --without-tcl Disable Tcl --with-tclconfig=path Set location of tclConfig.sh --with-tcl=path Set location of Tcl package --with-tclincl=path Set location of Tcl include directory --with-tcllib=path Set location of Tcl library directory --without-python Disable Python --with-python=path Set location of Python executable --without-python3 Disable Python 3.x support --with-python3=path Set location of Python 3.x executable --with-2to3=path Set location of Python 2to3 tool --without-perl5 Disable Perl5 --with-perl5=path Set location of Perl5 executable --without-octave Disable Octave --with-octave=path Set location of Octave executable --without-scilab Disable Scilab --with-scilab=path Set location of Scilab executable --with-scilab-inc=path Set location of Scilab include directory --without-java Disable Java --with-java=path Set location of java executable --with-javac=path Set location of javac executable --with-javaincl=path Set location of Java include directory --without-javascript Disable Javascript --with-jscoreinc=path Set location of Javascript include directory --with-jscorelib=path Set location of the JavaScriptCore/Webkit library directory --with-jsv8inc=path Set location of Javascript v8 include directory --with-jsv8lib=path Set location of V8 Javascript library directory --without-android Disable Android --with-android=path Set location of android executable --with-adb=path Set location of adb executable - Android Debug Bridge --with-ant=path Set location of ant executable for Android --with-ndk-build=path Set location of Android ndk-build executable --without-guile Disable Guile --with-guile-config=path Set location of guile-config --with-guile=path Set location of Guile executable --with-guile-cflags=cflags Set cflags required to compile against Guile --with-guile-libs=ldflags Set ldflags needed to link with Guile --without-mzscheme Disable MzScheme --with-mzscheme=path Set location of MzScheme executable --with-mzc=path Set location of MzScheme's mzc --without-ruby Disable Ruby --with-ruby=path Set location of Ruby executable --without-php Disable PHP --with-php=path Set location of PHP executable --without-ocaml Disable OCaml --with-ocamlc=path Set location of ocamlc executable --with-ocamldlgen=path Set location of ocamldlgen --with-ocamlfind=path Set location of ocamlfind --with-ocamlmktop=path Set location of ocamlmktop executable --with-camlp4=path Set location of camlp4 executable --without-csharp Disable CSharp --with-cil-interpreter=path Set location of CIL interpreter for CSharp --with-csharp-compiler=path Set location of CSharp compiler --without-lua Disable Lua --with-lua=path Set location of Lua executable --with-luaincl=path Set location of Lua include directory --with-lualib=path Set location of Lua library directory --without-r Disable R --with-r=path Set location of R executable (r) --without-go Disable Go --with-go=path Set location of Go compiler --without-d Disable D --with-d1-compiler=path Set location of D1/Tango compiler (DMD compatible) --with-d2-compiler=path Set location of D2 compiler (DMD compatible) --with-swiglibdir=DIR Put SWIG system-independent libraries into DIR. Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor PCRE_CONFIG config script used for pcre PCRE_CFLAGS CFLAGS used for pcre PCRE_LIBS LIBS used for pcre YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. 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 swig configure 4.0.2 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_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_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_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_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_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_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 http://www.swig.org ## ## ---------------------------------- ##" ) | 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_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 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 swig $as_me 4.0.2, 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 Tools/config "$srcdir"/Tools/config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in Tools/config \"$srcdir\"/Tools/config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ac_config_headers="$ac_config_headers Source/Include/swigconfig.h" # 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 am__api_version='1.15' # 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; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != 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; } 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='swig' VERSION='4.0.2' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi 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 # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; 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}gcc" $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 fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; 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="gcc" $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 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 else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_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}cc" $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 fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_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 ac_prog_rejected=no 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 if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $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 if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi 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 fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe 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 cl.exe 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 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 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 $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $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 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 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 10 /bin/sh. echo '/* dummy */' > 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 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 g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC 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 g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC 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=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="$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 10 /bin/sh. echo '/* dummy */' > 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 # Needed for subdir-objects in AUTOMAKE_OPTIONS { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum warning verbosity option" >&5 $as_echo_n "checking maximum warning verbosity option... " >&6; } # Check whether --with-maximum-compile-warnings was given. if test "${with_maximum_compile_warnings+set}" = set; then : withval=$with_maximum_compile_warnings; ac_compile_warnings_on="$withval" else ac_compile_warnings_on="" fi if test x"$ac_compile_warnings_on" = xno then ac_compile_warnings_msg=no else if test -n "$CXX" then if test "$GXX" = "yes" then ac_compile_warnings_opt='-Wall -W -ansi -pedantic' fi CXXFLAGS="$CXXFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_opt for C++" fi if test -n "$CC" then if test "$GCC" = "yes" then ac_compile_warnings_opt='-Wall -W -ansi -pedantic' fi CFLAGS="$CFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_msg $ac_compile_warnings_opt for C" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_compile_warnings_msg" >&5 $as_echo "$ac_compile_warnings_msg" >&6; } unset ac_compile_warnings_msg unset ac_compile_warnings_opt # Increase warning levels cat >>confdefs.h <<_ACEOF #define SWIG_CXX "$CXX" _ACEOF cat >>confdefs.h <<_ACEOF #define SWIG_PLATFORM "$host" _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 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 # Check whether --with-popen was given. if test "${with_popen+set}" = set; then : withval=$with_popen; with_popen="$withval" fi if test x"${with_popen}" = xno ; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling popen" >&5 $as_echo "$as_me: Disabling popen" >&6;} else ac_fn_c_check_func "$LINENO" "popen" "ac_cv_func_popen" if test "x$ac_cv_func_popen" = xyes; then : $as_echo "#define HAVE_POPEN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling popen" >&5 $as_echo "$as_me: Disabling popen" >&6;} fi fi # Check whether --with-pcre was given. if test "${with_pcre+set}" = set; then : withval=$with_pcre; else with_pcre=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable PCRE support" >&5 $as_echo_n "checking whether to enable PCRE support... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_pcre" >&5 $as_echo "$with_pcre" >&6; } if test x"${with_pcre}" = xyes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use local PCRE" >&5 $as_echo_n "checking whether to use local PCRE... " >&6; } local_pcre_config=no if test -z $PCRE_CONFIG; then if test -f `pwd`/pcre/pcre-swig-install/bin/pcre-config; then PCRE_CONFIG=`pwd`/pcre/pcre-swig-install/bin/pcre-config local_pcre_config=$PCRE_CONFIG fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $local_pcre_config" >&5 $as_echo "$local_pcre_config" >&6; } fi { $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 if test "x$with_pcre" != xno; then : # Check whether --with-pcre-prefix was given. if test "${with_pcre_prefix+set}" = set; then : withval=$with_pcre_prefix; pcre_config_prefix="$withval" else pcre_config_prefix="" fi # Check whether --with-pcre-exec-prefix was given. if test "${with_pcre_exec_prefix+set}" = set; then : withval=$with_pcre_exec_prefix; pcre_config_exec_prefix="$withval" else pcre_config_exec_prefix="" fi if test x"$PCRE_CFLAGS" != x -o x"$PCRE_LIBS" != x; then : : $as_echo "#define HAVE_PCRE 1" >>confdefs.h LIBS="$LIBS $PCRE_LIBS" CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS" else if test x$pcre_config_exec_prefix != x; then : pcre_config_args="$pcre_config_args --exec-prefix=$pcre_config_exec_prefix" if test x${PCRE_CONFIG+set} != xset; then : PCRE_CONFIG=$pcre_config_exec_prefix/bin/pcre-config fi fi if test x$pcre_config_prefix != x; then : pcre_config_args="$pcre_config_args --prefix=$pcre_config_prefix" if test x${PCRE_CONFIG+set} != xset; then : PCRE_CONFIG=$pcre_config_prefix/bin/pcre-config fi fi for ac_prog in pcre-config 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_PCRE_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PCRE_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PCRE_CONFIG="$PCRE_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_PCRE_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 PCRE_CONFIG=$ac_cv_path_PCRE_CONFIG if test -n "$PCRE_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PCRE_CONFIG" >&5 $as_echo "$PCRE_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PCRE_CONFIG" && break done test -n "$PCRE_CONFIG" || PCRE_CONFIG="no" if test "$PCRE_CONFIG" = "no"; 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 $? " Cannot find pcre-config script from PCRE (Perl Compatible Regular Expressions) library package. This dependency is needed for configure to complete, Either: - Install the PCRE developer package on your system (preferred approach). - Download the PCRE source tarball, build and install on your system as you would for any package built from source distribution. - Use the Tools/pcre-build.sh script to build PCRE just for SWIG to statically link against. Run 'Tools/pcre-build.sh --help' for instructions. (quite easy and does not require privileges to install PCRE on your system) - Use configure --without-pcre to disable regular expressions support in SWIG (not recommended). See \`config.log' for more details" "$LINENO" 5; } else if test x"" = x; then : PCRE_CFLAGS="`$PCRE_CONFIG $pcre_config_args --cflags`" else PCRE_CFLAGS="`$PCRE_CONFIG $pcre_config_args `" fi if test x"" = x; then : PCRE_LIBS="`$PCRE_CONFIG $pcre_config_args --libs`" else PCRE_LIBS="`$PCRE_CONFIG $pcre_config_args `" fi if test x"" != x; then : if test x" " != x; then : pcre_version="`$PCRE_CONFIG $pcre_config_args --version | $SED -e `" else pcre_version="`$PCRE_CONFIG $pcre_config_args --version | $SED -e 's/^\ *\(.*\)\ *$/\1/'`" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcre ($pcre_version) >= " >&5 $as_echo_n "checking for pcre ($pcre_version) >= ... " >&6; } # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo "$pcre_version" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : $as_echo "#define HAVE_PCRE 1" >>confdefs.h LIBS="$LIBS $PCRE_LIBS" CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : { { $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 find pcre-config script from PCRE (Perl Compatible Regular Expressions) library package. This dependency is needed for configure to complete, Either: - Install the PCRE developer package on your system (preferred approach). - Download the PCRE source tarball, build and install on your system as you would for any package built from source distribution. - Use the Tools/pcre-build.sh script to build PCRE just for SWIG to statically link against. Run 'Tools/pcre-build.sh --help' for instructions. (quite easy and does not require privileges to install PCRE on your system) - Use configure --without-pcre to disable regular expressions support in SWIG (not recommended). See \`config.log' for more details" "$LINENO" 5; } fi else : $as_echo "#define HAVE_PCRE 1" >>confdefs.h LIBS="$LIBS $PCRE_LIBS" CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS" fi fi fi fi # Check whether --enable-ccache was given. if test "${enable_ccache+set}" = set; then : enableval=$enable_ccache; enable_ccache=$enableval else enable_ccache=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ccache-swig" >&5 $as_echo_n "checking whether to enable ccache-swig... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_ccache" >&5 $as_echo "$enable_ccache" >&6; } if test "$enable_ccache" = yes; then subdirs="$subdirs CCache" ENABLE_CCACHE=1 fi echo "" echo "Checking packages required for SWIG developers." echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball" echo "" for ac_prog in 'bison -y' byacc 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_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # 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_YACC="$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 YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" echo "" echo "Checking for installed target languages and other information in order to compile and run" echo "the examples and test-suite invoked by 'make check'." echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball" echo "" # Check whether --with-boost was given. if test "${with_boost+set}" = set; then : withval=$with_boost; case $withval in #( no) : want_boost="no";_AX_BOOST_BASE_boost_path="" ;; #( yes) : want_boost="yes";_AX_BOOST_BASE_boost_path="" ;; #( *) : want_boost="yes";_AX_BOOST_BASE_boost_path="$withval" ;; esac 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 : _AX_BOOST_BASE_boost_lib_path="$withval" else as_fn_error $? "--with-boost-libdir expected directory name" "$LINENO" 5 fi else _AX_BOOST_BASE_boost_lib_path="" fi BOOST_LDFLAGS="" BOOST_CPPFLAGS="" if test "x$want_boost" = "xyes"; then : if test "x" = "x"; then : _AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0" else _AX_BOOST_BASE_TONUMERICVERSION_req="" fi _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\.[0-9]*\)'` _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\)'` if test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"; then : as_fn_error $? "You should at least specify libboost major version" "$LINENO" 5 fi _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[0-9]*\.\([0-9]*\)'` if test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"; then : _AX_BOOST_BASE_TONUMERICVERSION_req_minor="0" fi _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[0-9]*\.[0-9]*\.\([0-9]*\)'` if test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"; then : _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0" fi _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor` WANT_BOOST_VERSION=$_AX_BOOST_BASE_TONUMERICVERSION_RET succeeded=no case ${host_cpu} in #( x86_64) : libsubdirs="lib64 libx32 lib lib64" ;; #( ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64) : libsubdirs="lib64 lib lib64" ;; #( *) : libsubdirs="lib" ;; esac case ${host_cpu} in #( i?86) : multiarch_libsubdir="lib/i386-${host_os}" ;; #( *) : multiarch_libsubdir="lib/${host_cpu}-${host_os}" ;; esac if test "x$_AX_BOOST_BASE_boost_path" != "x"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= ($WANT_BOOST_VERSION) includes in \"$_AX_BOOST_BASE_boost_path/include\"" >&5 $as_echo_n "checking for boostlib >= ($WANT_BOOST_VERSION) includes in \"$_AX_BOOST_BASE_boost_path/include\"... " >&6; } if test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include" for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= ($WANT_BOOST_VERSION) lib path in \"$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp\"" >&5 $as_echo_n "checking for boostlib >= ($WANT_BOOST_VERSION) lib path in \"$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp\"... " >&6; } if test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"; break; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi done else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else if test X"$cross_compiling" = Xyes; then search_libsubdirs=$multiarch_libsubdir else search_libsubdirs="$multiarch_libsubdir $libsubdirs" fi for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then for libsubdir in $search_libsubdirs ; do if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir" BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include" break; fi done fi if test "x$_AX_BOOST_BASE_boost_lib_path" != "x"; then : BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= ($WANT_BOOST_VERSION)" >&5 $as_echo_n "checking for boostlib >= ($WANT_BOOST_VERSION)... " >&6; } 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 () { (void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($WANT_BOOST_VERSION))])); ; 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=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$succeeded" != "xyes" ; then CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" BOOST_CPPFLAGS= if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then BOOST_LDFLAGS= fi _version=0 if test -n "$_AX_BOOST_BASE_boost_path" ; then if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "x$V_CHECK" = "x1" ; then _version=$_version_tmp fi VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE" done if test -z "$BOOST_CPPFLAGS"; then if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path" fi fi if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then for libsubdir in $libsubdirs ; do if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir" fi fi else if test "x$cross_compiling" != "xyes" ; then for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "x$V_CHECK" = "x1" ; then _version=$_version_tmp best_path=$_AX_BOOST_BASE_boost_path fi done fi done VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" if test -z "$_AX_BOOST_BASE_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 -n "$BOOST_ROOT" ; 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 "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_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 () { (void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($WANT_BOOST_VERSION))])); ; 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=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 if test "x$succeeded" != "xyes" ; then if test "x$_version" = "x0" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: We could not detect the boost libraries (version 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 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): : else $as_echo "#define HAVE_BOOST /**/" >>confdefs.h # execute ACTION-IF-FOUND (if present): : fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi # SO is the extension of shared libraries (including the dot!) { $as_echo "$as_me:${as_lineno-$LINENO}: checking SO" >&5 $as_echo_n "checking SO... " >&6; } if test -z "$SO" then case $host in *-*-hp*) SO=.sl;; *-*-darwin*) SO=.bundle;; *-*-cygwin* | *-*-mingw*) SO=.dll;; *) SO=.so;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SO" >&5 $as_echo "$SO" >&6; } # LDSHARED is the ld *command* used to create shared library # -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5 # (Shared libraries in this instance are shared modules to be loaded into # Python, as opposed to building Python itself as a shared library.) { $as_echo "$as_me:${as_lineno-$LINENO}: checking LDSHARED" >&5 $as_echo_n "checking LDSHARED... " >&6; } if test -z "$LDSHARED" then case $host in *-*-aix*) LDSHARED="\$(srcdir)/ld_so_aix \$(CC)";; *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then LDSHARED="$CC -shared" else if test "cl" = $CC ; then # Microsoft Visual C++ (MSVC) LDSHARED="$CC -nologo -LD" else # Unknown compiler try gcc approach LDSHARED="$CC -shared" fi fi ;; *-*-irix5*) LDSHARED="ld -shared";; *-*-irix6*) LDSHARED="ld ${SGI_ABI} -shared -all";; *-*-sunos4*) LDSHARED="ld";; *-*-solaris*) LDSHARED="ld -G";; *-*-hp*) LDSHARED="ld -b";; *-*-osf*) LDSHARED="ld -shared -expect_unresolved \"*\"";; *-sequent-sysv4) LDSHARED="ld -G";; *-*-next*) if test "$ns_dyld" then LDSHARED='$(CC) $(LDFLAGS) -bundle -prebind' else LDSHARED='$(CC) $(CFLAGS) -nostdlib -r' fi if test "$with_next_framework" ; then LDSHARED="$LDSHARED \$(LDLIBRARY)" fi ;; *-*-linux*) LDSHARED="$CC -shared";; *-*-dgux*) LDSHARED="ld -G";; *-*-freebsd3*) LDSHARED="$CC -shared";; *-*-freebsd* | *-*-openbsd*) LDSHARED="ld -Bshareable";; *-*-netbsd*) if [ "`$CC -dM -E - &5 $as_echo "$LDSHARED" >&6; } # CXXSHARED is the ld *command* used to create C++ shared library # -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5 # (Shared libraries in this instance are shared modules to be loaded into # Python, as opposed to building Python itself as a shared library.) { $as_echo "$as_me:${as_lineno-$LINENO}: checking CXXSHARED" >&5 $as_echo_n "checking CXXSHARED... " >&6; } if test -z "$CXXSHARED" then CXXSHARED="$LDSHARED" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXSHARED" >&5 $as_echo "$CXXSHARED" >&6; } # { $as_echo "$as_me:${as_lineno-$LINENO}: checking TRYLINKINGWITHCXX" >&5 $as_echo_n "checking TRYLINKINGWITHCXX... " >&6; } if test -z "$TRYLINKINGWITHCXX" then case $host in *-*-solaris*) if test "$GCC" = yes then TRYLINKINGWITHCXX="CXXSHARED= $CXX -Wl,-G" else TRYLINKINGWITHCXX="CXXSHARED= $CXX -G -L/opt/SUNWspro/lib -lCrun -lCstd" fi;; *-*-hp*) TRYLINKINGWITHCXX="CXXSHARED= $CXX +z ";; *-*-darwin*) TRYLINKINGWITHCXX="CXXSHARED= $CXX -bundle -undefined suppress -flat_namespace";; *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then TRYLINKINGWITHCXX="CXXSHARED= $CXX -shared " else if test "cl" = $CXX ; then # Microsoft Visual C++ (MSVC) TRYLINKINGWITHCXX="CXXSHARED= $CXX -nologo -LD" else TRYLINKINGWITHCXX="#unknown Windows compiler" fi fi ;; *) TRYLINKINGWITHCXX="CXXSHARED= $CXX -shared ";; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRYLINKINGWITHCXX" >&5 $as_echo "$TRYLINKINGWITHCXX" >&6; } # CCSHARED are the C *flags* used to create objects to go into a shared # library (module) -- this is only needed for a few systems { $as_echo "$as_me:${as_lineno-$LINENO}: checking CCSHARED" >&5 $as_echo_n "checking CCSHARED... " >&6; } if test -z "$CCSHARED" then case $host in *-*-hp*) if test "$GCC" = yes then CCSHARED="-fpic" else CCSHARED="+z" fi;; s390x*-*-*) CCSHARED="-fpic" ;; s390*-*-*) CCSHARED="-fPIC" ;; *-*-linux*) CCSHARED="-fpic";; *-*-freebsd* | *-*-openbsd*) CCSHARED="-fpic";; *-*-netbsd*) CCSHARED="-fPIC";; *-sco-sysv*) CCSHARED="-KPIC -dy -Bdynamic";; *-*-irix6*) case $CC in *gcc*) CCSHARED="-shared";; *) CCSHARED="";; esac;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CCSHARED" >&5 $as_echo "$CCSHARED" >&6; } # RPATH is the path used to look for shared library files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking RPATH" >&5 $as_echo_n "checking RPATH... " >&6; } if test -z "$RPATH" then case $host in *-*-solaris*) RPATH='-R. -R$(exec_prefix)/lib';; *-*-irix*) RPATH='-rpath .:$(exec_prefix)/lib';; *-*-linux*) RPATH='-Xlinker -rpath $(exec_prefix)/lib -Xlinker -rpath .';; *) RPATH='';; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RPATH" >&5 $as_echo "$RPATH" >&6; } # LINKFORSHARED are the flags passed to the $(CC) command that links # a few executables -- this is only needed for a few systems { $as_echo "$as_me:${as_lineno-$LINENO}: checking LINKFORSHARED" >&5 $as_echo_n "checking LINKFORSHARED... " >&6; } if test -z "$LINKFORSHARED" then case $host in *-*-aix*) LINKFORSHARED='-Wl,-bE:$(srcdir)/python.exp -lld';; *-*-hp*) LINKFORSHARED="-Wl,-E -Wl,+s -Wl,+b\$(BINLIBDEST)/lib-dynload";; *-*-linux*) LINKFORSHARED="-Xlinker -export-dynamic";; *-*-next*) LINKFORSHARED="-u libsys_s";; *-sco-sysv*) LINKFORSHARED="-Bdynamic -dy -Wl,-Bexport";; *-*-irix6*) LINKFORSHARED="-all";; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINKFORSHARED" >&5 $as_echo "$LINKFORSHARED" >&6; } # Optional CFLAGS used to silence/enhance compiler warnings on some platforms. { $as_echo "$as_me:${as_lineno-$LINENO}: checking PLATCFLAGS" >&5 $as_echo_n "checking PLATCFLAGS... " >&6; } case $host in *-*-solaris*) if test "$GCC" = yes then PLATCFLAGS= else PLATCFLAGS= # else PLATCFLAGS="-errtags=yes" # Need more work as C examples use ld for linking fi;; *) PLATCFLAGS= esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PLATCFLAGS" >&5 $as_echo "$PLATCFLAGS" >&6; } # Add switch if necessary to enable C++11 support - just for tests # Check whether --enable-cpp11-testing was given. if test "${enable_cpp11_testing+set}" = set; then : enableval=$enable_cpp11_testing; enable_cpp11_testing=$enableval else enable_cpp11_testing=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable C++11 testing" >&5 $as_echo_n "checking whether to enable C++11 testing... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_cpp11_testing" >&5 $as_echo "$enable_cpp11_testing" >&6; } PLATCXXFLAGS="$PLATCFLAGS" if test x"$enable_cpp11_testing" = xyes; 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 CXXFLAGS_SAVED=$CXXFLAGS CXXFLAGS= ac_success=no CXX11FLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5 $as_echo_n "checking whether $CXX supports C++11 features by default... " >&6; } if ${ax_cv_cxx_compile_cxx11+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ax_cv_cxx_compile_cxx11=yes else ax_cv_cxx_compile_cxx11=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5 $as_echo "$ax_cv_cxx_compile_cxx11" >&6; } if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 $as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval \${$cachevar+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval $cachevar=yes else eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$ac_save_CXXFLAGS" fi eval ac_res=\$$cachevar { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" CXX11FLAGS=$switch ac_success=yes break fi done fi if test x$ac_success = xno; then if test xnostop != xnostop; then as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5 fi else HAVE_CXX11_COMPILER=yes fi CXXFLAGS=$CXXFLAGS_SAVED 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"$CXX11FLAGS" != x; then PLATCXXFLAGS="$CXX11FLAGS $PLATCXXFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++11 enabled compiler" >&5 $as_echo_n "checking for C++11 enabled compiler... " >&6; } if test x"$HAVE_CXX11_COMPILER" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_CXX11_COMPILER" >&5 $as_echo "$HAVE_CXX11_COMPILER" >&6; } fi fi # On darwin 10.7,10.8,10.9 using clang++, need to ensure using # libc++ for tests and examples to run under mono. May affect # other language targets as well - problem is a Mac OS X incompatibility # between libraries depending on libstdc++ and libc++. CLANGXX= $CXX -v 2>&1 | grep -i clang >/dev/null && CLANGXX=yes case $host in *-*-darwin11* | *-*-darwin12* |*-*-darwin13* ) if test "$CLANGXX" = "yes"; then PLATCXXFLAGS="$PLATCXXFLAGS -stdlib=libc++" fi;; *) ;; esac # Check for compiler pre-compiled header support { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports pre-compiled headers" >&5 $as_echo_n "checking if compiler supports pre-compiled headers... " >&6; } PCHSUPPORT=no if test "$CLANGXX" = "yes"; then PCHINCLUDEARG="-include-pch" PCHINCLUDEEXT=".gch" else PCHINCLUDEARG="-include" PCHINCLUDEEXT="" 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 echo '#include ' > conftest.hpp echo '#include "conftest.hpp"' > conftest.cpp $CXX -c conftest.hpp 2>/dev/null if test $? -eq 0; then if test -f conftest.hpp.gch; then $CXX -H -c -I. ${PCHINCLUDEARG} ./conftest.hpp${PCHINCLUDEEXT} -o conftest.o conftest.cpp >conftest.out 2>&1 if test $? -eq 0; then if test "$CLANGXX" = "yes"; then PCHSUPPORT=yes elif grep -q '^!.*conftest.hpp.gch$' conftest.out; then PCHSUPPORT=yes fi fi fi fi rm -f conftest.hpp conftest.cpp conftest.out 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}: result: $PCHSUPPORT" >&5 $as_echo "$PCHSUPPORT" >&6; } # Set info about shared libraries. # This variation is needed on OS-X because there is no (apparent) consistency in shared library naming. # Sometimes .bundle works, but sometimes .so is needed. It depends on the target language case $host in *-*-mingw*) PYTHON_SO=.pyd;; *-*-darwin*) PYTHON_SO=.so;; *) PYTHON_SO=$SO;; esac case $host in *-*-darwin*) TCL_SO=.dylib;; *) TCL_SO=$SO;; esac case $host in *-*-darwin*) GUILE_SO=.so;; *) GUILE_SO=$SO;; esac case $host in *-*-darwin*) PHP_SO=.so;; *) PHP_SO=$SO;; esac case $host in *) MZSCHEME_SO=.so;; esac case $host in *-*-darwin*) LUA_SO=.so;; *) LUA_SO=$SO;; esac # Check for specific libraries. Used for SWIG examples { $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 : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" fi # Dynamic linking for SunOS/Solaris and SYSV { $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 : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDLD 1 _ACEOF LIBS="-ldld $LIBS" fi # Dynamic linking for HP-UX { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing t_open" >&5 $as_echo_n "checking for library containing t_open... " >&6; } if ${ac_cv_search_t_open+:} 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 t_open (); int main () { return t_open (); ; return 0; } _ACEOF for ac_lib in '' nsl; 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_t_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_t_open+:} false; then : break fi done if ${ac_cv_search_t_open+:} false; then : else ac_cv_search_t_open=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_t_open" >&5 $as_echo "$ac_cv_search_t_open" >&6; } ac_res=$ac_cv_search_t_open if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # SVR4 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} 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 gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' inet; 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_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # Sequent { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 $as_echo_n "checking for library containing socket... " >&6; } if ${ac_cv_search_socket+:} 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 socket (); int main () { return socket (); ; return 0; } _ACEOF for ac_lib in '' socket; 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_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_socket+:} false; then : break fi done if ${ac_cv_search_socket+:} false; then : else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 $as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # SVR4 sockets { $as_echo "$as_me:${as_lineno-$LINENO}: checking for swill_init in -lswill" >&5 $as_echo_n "checking for swill_init in -lswill... " >&6; } if ${ac_cv_lib_swill_swill_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lswill $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 swill_init (); int main () { return swill_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_swill_swill_init=yes else ac_cv_lib_swill_swill_init=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_swill_swill_init" >&5 $as_echo "$ac_cv_lib_swill_swill_init" >&6; } if test "x$ac_cv_lib_swill_swill_init" = xyes; then : SWIGLIBS="-lswill $LIBS" SWILL="-DSWIG_SWILL" fi # check for --with-libm=... LIBM=-lm # Check whether --with-libm was given. if test "${with_libm+set}" = set; then : withval=$with_libm; if test "$withval" != yes then LIBM=$withval else as_fn_error $? "proper usage is --with-libm=STRING" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=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_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : LIBM="-lieee $LIBM" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt in -lcrypt" >&5 $as_echo_n "checking for crypt in -lcrypt... " >&6; } if ${ac_cv_lib_crypt_crypt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcrypt $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 crypt (); int main () { return crypt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_crypt_crypt=yes else ac_cv_lib_crypt_crypt=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_crypt_crypt" >&5 $as_echo "$ac_cv_lib_crypt_crypt" >&6; } if test "x$ac_cv_lib_crypt_crypt" = xyes; then : LIBCRYPT="-lcrypt" fi # check for --with-libc=... # Check whether --with-libc was given. if test "${with_libc+set}" = set; then : withval=$with_libc; if test "$withval" != yes then LIBC=$withval else as_fn_error $? "proper usage is --with-libc=STRING" "$LINENO" 5 fi fi #-------------------------------------------------------------------- # Target languages #-------------------------------------------------------------------- # Check whether --with-alllang was given. if test "${with_alllang+set}" = set; then : withval=$with_alllang; with_alllang="$withval" fi if test "$with_alllang" = "no"; then alllang_default=no else alllang_default=yes fi for ac_prog in pkg-config 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_PKGCONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PKGCONFIG"; then ac_cv_prog_PKGCONFIG="$PKGCONFIG" # 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_PKGCONFIG="$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 PKGCONFIG=$ac_cv_prog_PKGCONFIG if test -n "$PKGCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5 $as_echo "$PKGCONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PKGCONFIG" && break done #-------------------------------------------------------------------- # Look for Tcl #-------------------------------------------------------------------- TCLINCLUDE= TCLLIB= TCLPACKAGE= # Check whether --with-tclconfig was given. if test "${with_tclconfig+set}" = set; then : withval=$with_tclconfig; with_tclconfig="$withval" else with_tclconfig= fi # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; TCLPACKAGE="$withval" else TCLPACKAGE="$alllang_default" fi # Check whether --with-tclincl was given. if test "${with_tclincl+set}" = set; then : withval=$with_tclincl; TCLINCLUDE="-I$withval" else TCLINCLUDE= fi # Check whether --with-tcllib was given. if test "${with_tcllib+set}" = set; then : withval=$with_tcllib; TCLLIB="-L$withval" else TCLLIB= fi # First, check for "--without-tcl" or "--with-tcl=no". if test x"${TCLPACKAGE}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Tcl" >&5 $as_echo "$as_me: Disabling Tcl" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } # First check to see if --with-tclconfig was specified. if test x"${with_tclconfig}" != x ; then if test -f "${with_tclconfig}/tclConfig.sh" ; then TCLCONFIG=`(cd ${with_tclconfig}; pwd)` else as_fn_error $? "${with_tcl} directory does not contain tclConfig.sh" "$LINENO" 5 fi fi # check in a few common install locations dirs="/usr/lib*/ /usr/lib*/tcl*/ /usr/local/lib*/ /usr/local/lib*/tcl*/" case $host in *-*-darwin*) dirs="/System/Library/Frameworks/Tcl.framework/ $dirs" ;; *) ;; esac if test x"${TCLCONFIG}" = x ; then for d in $dirs ; do for i in `ls -d -r $d 2>/dev/null` ; do if test -f $i"tclConfig.sh" ; then TCLCONFIG=`(cd $i; pwd)` break fi done done fi if test x"${TCLCONFIG}" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $TCLCONFIG/tclConfig.sh" >&5 $as_echo "found $TCLCONFIG/tclConfig.sh" >&6; } . $TCLCONFIG/tclConfig.sh if test -z "$TCLINCLUDE"; then TCLINCLUDE=`echo $TCL_INCLUDE_SPEC` fi if test -z "$TCLLIB"; then TCLLIB=$TCL_LIB_SPEC fi fi if test -z "$TCLINCLUDE"; then if test "x$TCLPACKAGE" != xyes; then TCLINCLUDE="-I$TCLPACKAGE/include" fi fi if test -z "$TCLLIB"; then if test "x$TCLPACKAGE" != xyes; then TCLLIB="-L$TCLPACKAGE/lib -ltcl" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl header files" >&5 $as_echo_n "checking for Tcl header files... " >&6; } if test -z "$TCLINCLUDE"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else TCLINCLUDE="" fi rm -f conftest.err conftest.i conftest.$ac_ext if test -z "$TCLINCLUDE"; then dirs="/usr/local/include /usr/include /opt/local/include" for i in $dirs ; do if test -r $i/tcl.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } TCLINCLUDE="-I$i" break fi done fi if test -z "$TCLINCLUDE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TCLINCLUDE" >&5 $as_echo "$TCLINCLUDE" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl library" >&5 $as_echo_n "checking for Tcl library... " >&6; } if test -z "$TCLLIB"; then dirs="/usr/local/lib /usr/lib /opt/local/lib" for i in $dirs ; do if test -r $i/libtcl.a; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } TCLLIB="-L$i -ltcl" break fi done if test -z "$TCLLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TCLLIB" >&5 $as_echo "$TCLLIB" >&6; } fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) TCLDYNAMICLINKING="$TCLLIB";; *)TCLDYNAMICLINKING="";; esac case $host in *-*-darwin*) TCLLDSHARED='$(CC) -dynamiclib -undefined suppress -flat_namespace' TCLCXXSHARED='$(CXX) -dynamiclib -undefined suppress -flat_namespace' ;; *) TCLLDSHARED='$(LDSHARED)' TCLCXXSHARED='$(CXXSHARED)' ;; esac fi #---------------------------------------------------------------- # Look for Python #---------------------------------------------------------------- PYINCLUDE= PYLIB= PYLINK= PYPACKAGE= # Check whether --with-python was given. if test "${with_python+set}" = set; then : withval=$with_python; PYBIN="$withval" else PYBIN="$alllang_default" fi # First, check for "--without-python" or "--with-python=no". if test x"${PYBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Python" >&5 $as_echo "$as_me: Disabling Python" >&6;} else # First figure out the name of the Python executable if test "x$PYBIN" = xyes; then for ac_prog in python python2.7 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_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PYTHON"; then ac_cv_prog_PYTHON="$PYTHON" # 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_PYTHON="$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 PYTHON=$ac_cv_prog_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PYTHON" && break done else PYTHON="$PYBIN" fi PYVER=0 if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $PYTHON major version number" >&5 $as_echo_n "checking for $PYTHON major version number... " >&6; } PYVER=`($PYTHON -c "import sys; sys.stdout.write(sys.version[0])") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYVER" >&5 $as_echo "$PYVER" >&6; } if test -z "$PYVER"; then PYVER=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python os.name" >&5 $as_echo_n "checking for Python os.name... " >&6; } PYOSNAME=`($PYTHON -c "import sys, os; sys.stdout.write(os.name)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYOSNAME" >&5 $as_echo "$PYOSNAME" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python path separator" >&5 $as_echo_n "checking for Python path separator... " >&6; } PYSEPARATOR=`($PYTHON -c "import sys, os; sys.stdout.write(os.sep)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYSEPARATOR" >&5 $as_echo "$PYSEPARATOR" >&6; } fi fi if test $PYVER -eq 1 -o $PYVER -eq 2; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python prefix" >&5 $as_echo_n "checking for Python prefix... " >&6; } PYPREFIX=`($PYTHON -c "import sys; sys.stdout.write(sys.prefix)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYPREFIX" >&5 $as_echo "$PYPREFIX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python exec-prefix" >&5 $as_echo_n "checking for Python exec-prefix... " >&6; } PYEPREFIX=`($PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYEPREFIX" >&5 $as_echo "$PYEPREFIX" >&6; } if test x"$PYOSNAME" = x"nt" -a x"$PYSEPARATOR" = x"\\"; then # Windows installations are quite different to posix installations (MinGW path separator is a forward slash) PYPREFIX=`echo "$PYPREFIX" | sed -e 's,\\\\,/,g'` # Forward slashes are easier to use and even work on Windows most of the time PYTHON_SO=.pyd { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python header files" >&5 $as_echo_n "checking for Python header files... " >&6; } if test -r $PYPREFIX/include/Python.h; then PYINCLUDE="-I$PYPREFIX/include" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYINCLUDE" >&5 $as_echo "$PYINCLUDE" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python library directory" >&5 $as_echo_n "checking for Python library directory... " >&6; } if test -d $PYPREFIX/libs; then PYLIB=$PYPREFIX/libs PYLINKFILE=`ls $PYLIB/python*.lib | grep "python[0-9][0-9]\.lib"` if test -r "$PYLINKFILE"; then PYLINK=-l`basename $PYLINKFILE | sed -e 's/\.lib$//'` else PYLIB= fi fi else # Note: I could not think of a standard way to get the version string from different versions. # This trick pulls it out of the file location for a standard library file. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python version" >&5 $as_echo_n "checking for Python version... " >&6; } # Need to do this hack since autoconf replaces __file__ with the name of the configure file filehack="file__" PYVERSION=`($PYTHON -c "import sys,string,operator,os.path; sys.stdout.write(operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1))") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYVERSION" >&5 $as_echo "$PYVERSION" >&6; } # Find the directory for libraries this is necessary to deal with # platforms that can have apps built for multiple archs: e.g. x86_64 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python lib dir" >&5 $as_echo_n "checking for Python lib dir... " >&6; } PYLIBDIR=`($PYTHON -c "import sys; sys.stdout.write(sys.lib)") 2>/dev/null` if test -z "$PYLIBDIR"; then # Fedora patch Python to add sys.lib, for other distros we assume "lib". PYLIBDIR="lib" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYLIBDIR" >&5 $as_echo "$PYLIBDIR" >&6; } # Set the include directory { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python header files" >&5 $as_echo_n "checking for Python header files... " >&6; } if test -r $PYPREFIX/include/$PYVERSION/Python.h; then PYINCLUDE="-I$PYPREFIX/include/$PYVERSION -I$PYEPREFIX/$PYLIBDIR/$PYVERSION/config" fi if test -z "$PYINCLUDE"; then if test -r $PYPREFIX/include/Py/Python.h; then PYINCLUDE="-I$PYPREFIX/include/Py -I$PYEPREFIX/$PYLIBDIR/python/lib" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYINCLUDE" >&5 $as_echo "$PYINCLUDE" >&6; } # Set the library directory blindly. This probably won't work with older versions { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python library directory" >&5 $as_echo_n "checking for Python library directory... " >&6; } dirs="$PYVERSION/config $PYVERSION/$PYLIBDIR python/$PYLIBDIR" for i in $dirs; do if test -d $PYEPREFIX/$PYLIBDIR/$i; then PYLIB="$PYEPREFIX/$PYLIBDIR/$i" break fi done PYLINK="-l$PYVERSION" fi if test -z "$PYLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYLIB" >&5 $as_echo "$PYLIB" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python library" >&5 $as_echo_n "checking for Python library... " >&6; } if test -z "$PYLINK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYLINK" >&5 $as_echo "$PYLINK" >&6; } fi fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PYTHONDYNAMICLINKING="-L$PYLIB $PYLINK" DEFS="-DUSE_DL_IMPORT $DEFS" ;; *)PYTHONDYNAMICLINKING="";; esac fi #---------------------------------------------------------------- # Look for Python 3.x #---------------------------------------------------------------- PY3INCLUDE= PY3LIB= PY3LINK= PY3PACKAGE= # Check whether --with-python3 was given. if test "${with_python3+set}" = set; then : withval=$with_python3; PY3BIN="$withval" else PY3BIN="$alllang_default" fi # First, check for "--without-python3" or "--with-python3=no". if test x"${PY3BIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Python 3.x support" >&5 $as_echo "$as_me: Disabling Python 3.x support" >&6;} else if test -z "$PYVER"; then PYVER=0 fi if test "x$PY3BIN" = xyes; then if test x"$PYOSNAME" = x"nt" -a x"$PYSEPARATOR" = x"\\" -a $PYVER -ge 3; then PYTHON3="$PYTHON" else for py_ver in 3 3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 ""; do for ac_prog in python$py_ver 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_PYTHON3+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PYTHON3"; then ac_cv_prog_PYTHON3="$PYTHON3" # 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_PYTHON3="$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 PYTHON3=$ac_cv_prog_PYTHON3 if test -n "$PYTHON3"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON3" >&5 $as_echo "$PYTHON3" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PYTHON3" && break done if test -n "$PYTHON3"; then for ac_prog in $PYTHON3-config 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_PY3CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PY3CONFIG"; then ac_cv_prog_PY3CONFIG="$PY3CONFIG" # 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_PY3CONFIG="$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 PY3CONFIG=$ac_cv_prog_PY3CONFIG if test -n "$PY3CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3CONFIG" >&5 $as_echo "$PY3CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PY3CONFIG" && break done if test -n "$PY3CONFIG"; then break fi fi done fi else PYTHON3="$PY3BIN" for ac_prog in $PYTHON3-config 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_PY3CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PY3CONFIG"; then ac_cv_prog_PY3CONFIG="$PY3CONFIG" # 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_PY3CONFIG="$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 PY3CONFIG=$ac_cv_prog_PY3CONFIG if test -n "$PY3CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3CONFIG" >&5 $as_echo "$PY3CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PY3CONFIG" && break done fi if test -n "$PYTHON3"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $PYTHON3 major version number" >&5 $as_echo_n "checking for $PYTHON3 major version number... " >&6; } PYVER=`($PYTHON3 -c "import sys; sys.stdout.write(sys.version[0])") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYVER" >&5 $as_echo "$PYVER" >&6; } if test -z "$PYVER"; then PYVER=0 fi fi if test $PYVER -ge 3; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x os.name" >&5 $as_echo_n "checking for Python 3.x os.name... " >&6; } PY3OSNAME=`($PYTHON3 -c "import sys, os; sys.stdout.write(os.name)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3OSNAME" >&5 $as_echo "$PY3OSNAME" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x path separator" >&5 $as_echo_n "checking for Python 3.x path separator... " >&6; } PYSEPARATOR=`($PYTHON3 -c "import sys, os; sys.stdout.write(os.sep)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYSEPARATOR" >&5 $as_echo "$PYSEPARATOR" >&6; } if test x"$PY3OSNAME" = x"nt" -a x"$PYSEPARATOR" = x"\\"; then # Windows installations are quite different to posix installations # There is no python-config to use { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x prefix" >&5 $as_echo_n "checking for Python 3.x prefix... " >&6; } PY3PREFIX=`($PYTHON3 -c "import sys; sys.stdout.write(sys.prefix)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3PREFIX" >&5 $as_echo "$PY3PREFIX" >&6; } PY3PREFIX=`echo "$PY3PREFIX" | sed -e 's,\\\\,/,g'` # Forward slashes are easier to use and even work on Windows most of the time PYTHON_SO=.pyd { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x header files" >&5 $as_echo_n "checking for Python 3.x header files... " >&6; } if test -r $PY3PREFIX/include/Python.h; then PY3INCLUDE="-I$PY3PREFIX/include" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3INCLUDE" >&5 $as_echo "$PY3INCLUDE" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x library directory" >&5 $as_echo_n "checking for Python 3.x library directory... " >&6; } if test -d $PY3PREFIX/libs; then PY3LIB=$PY3PREFIX/libs PY3LINKFILE=`ls $PY3LIB/python*.lib | grep "python[0-9][0-9]\.lib"` if test -r "$PY3LINKFILE"; then PY3LINK=-l`basename $PY3LINKFILE | sed -e 's/\.lib$//'` else PY3LIB= fi fi if test -z "$PY3LIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LIB" >&5 $as_echo "$PY3LIB" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x library" >&5 $as_echo_n "checking for Python 3.x library... " >&6; } if test -z "$PY3LINK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LINK" >&5 $as_echo "$PY3LINK" >&6; } fi elif test -n "$PY3CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x prefix" >&5 $as_echo_n "checking for Python 3.x prefix... " >&6; } PY3PREFIX=`($PY3CONFIG --prefix) 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3PREFIX" >&5 $as_echo "$PY3PREFIX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x exec-prefix" >&5 $as_echo_n "checking for Python 3.x exec-prefix... " >&6; } # Piped through xargs to strip trailing whitespace (bug in msys2 + mingw Python) PY3EPREFIX=`($PY3CONFIG --exec-prefix | xargs) 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3EPREFIX" >&5 $as_echo "$PY3EPREFIX" >&6; } # Note: I could not think of a standard way to get the version string from different versions. # This trick pulls it out of the file location for a standard library file. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x version" >&5 $as_echo_n "checking for Python 3.x version... " >&6; } # Need to do this hack since autoconf replaces __file__ with the name of the configure file filehack="file__" PY3VERSION=`($PYTHON3 -c "import string,operator,os.path; print(operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1))") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3VERSION" >&5 $as_echo "$PY3VERSION" >&6; } # Find the directory for libraries this is necessary to deal with # platforms that can have apps built for multiple archs: e.g. x86_64 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x lib dir" >&5 $as_echo_n "checking for Python 3.x lib dir... " >&6; } PY3LIBDIR=`($PYTHON3 -c "import sys; print(sys.lib)") 2>/dev/null` if test -z "$PY3LIBDIR"; then # some dists don't have sys.lib so the best we can do is assume lib PY3LIBDIR="lib" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LIBDIR" >&5 $as_echo "$PY3LIBDIR" >&6; } # Set the include directory { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x header files" >&5 $as_echo_n "checking for Python 3.x header files... " >&6; } PY3INCLUDE=`($PY3CONFIG --includes) 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3INCLUDE" >&5 $as_echo "$PY3INCLUDE" >&6; } # Set the library directory blindly. This probably won't work with older versions { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x library directory" >&5 $as_echo_n "checking for Python 3.x library directory... " >&6; } dirs="$PY3VERSION/config $PY3VERSION/$PY3LIBDIR python/$PY3LIBDIR" for i in $dirs; do if test -d $PY3EPREFIX/$PY3LIBDIR/$i; then PY3LIB="$PY3EPREFIX/$PY3LIBDIR/$i" break fi done if test -z "$PY3LIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LIB" >&5 $as_echo "$PY3LIB" >&6; } fi PY3LINK="-l$PY3VERSION" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x library" >&5 $as_echo_n "checking for Python 3.x library... " >&6; } if test -z "$PY3LINK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LINK" >&5 $as_echo "$PY3LINK" >&6; } fi fi fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PYTHON3DYNAMICLINKING="-L$PY3LIB $PY3LINK" DEFS="-DUSE_DL_IMPORT $DEFS" ;; *)PYTHON3DYNAMICLINKING="";; esac fi if test -n "$PYINCLUDE" || test -n "$PY3INCLUDE" ; then for ac_prog in pycodestyle 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_PYCODESTYLE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PYCODESTYLE"; then ac_cv_prog_PYCODESTYLE="$PYCODESTYLE" # 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_PYCODESTYLE="$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 PYCODESTYLE=$ac_cv_prog_PYCODESTYLE if test -n "$PYCODESTYLE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYCODESTYLE" >&5 $as_echo "$PYCODESTYLE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PYCODESTYLE" && break done if test -n "$PYCODESTYLE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking pycodestyle version" >&5 $as_echo_n "checking pycodestyle version... " >&6; } pycodestyle_version=`$PYCODESTYLE --version 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pycodestyle_version" >&5 $as_echo "$pycodestyle_version" >&6; } fi fi # Check whether --with-2to3 was given. if test "${with_2to3+set}" = set; then : withval=$with_2to3; PY2TO3BIN="$withval" else PY2TO3BIN="yes" fi if test -n "$PYTHON3"; then if test "x$PY2TO3BIN" = xyes; then py3to2=`echo $PYTHON3 | sed -e "s/python/2to3-/"` for ac_prog in $py3to2 2to3 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_PY2TO3+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PY2TO3"; then ac_cv_prog_PY2TO3="$PY2TO3" # 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_PY2TO3="$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 PY2TO3=$ac_cv_prog_PY2TO3 if test -n "$PY2TO3"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY2TO3" >&5 $as_echo "$PY2TO3" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PY2TO3" && break done if test -z "$PY2TO3"; then # Windows distributions don't always have the 2to3 executable { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 2to3.py" >&5 $as_echo_n "checking for 2to3.py... " >&6; } py2to3script="$PY3PREFIX/Tools/scripts/2to3.py" if test -f "$py2to3script"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $py2to3script" >&5 $as_echo "$py2to3script" >&6; } PY2TO3="$PYTHON3 $py2to3script" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } fi fi else PY2TO3="$PY2TO3BIN" fi if test -z "$PY2TO3"; then PYTHON3= fi fi #---------------------------------------------------------------- # Look for Perl5 #---------------------------------------------------------------- PERLBIN= # Check whether --with-perl5 was given. if test "${with_perl5+set}" = set; then : withval=$with_perl5; PERLBIN="$withval" else PERLBIN="$alllang_default" fi # First, check for "--without-perl5" or "--with-perl5=no". if test x"${PERLBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Perl5" >&5 $as_echo "$as_me: Disabling Perl5" >&6;} PERL= else # First figure out what the name of Perl5 is if test "x$PERLBIN" = xyes; then for ac_prog in perl perl5.6.1 perl5.6.0 perl5.004 perl5.003 perl5.002 perl5.001 perl5 perl 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_PERL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PERL"; then ac_cv_prog_PERL="$PERL" # 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_PERL="$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 PERL=$ac_cv_prog_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 test -n "$PERL" && break done else PERL="$PERLBIN" fi # This could probably be simplified as for all platforms and all versions of Perl the following apparently should be run to get the compilation options: # perl -MExtUtils::Embed -e ccopts { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 header files" >&5 $as_echo_n "checking for Perl5 header files... " >&6; } if test -n "$PERL"; then PERL5DIR=`($PERL -MConfig -le 'print $Config{archlibexp}') 2>/dev/null` if test -n "$PERL5DIR" ; then dirs="$PERL5DIR $PERL5DIR/CORE" PERL5EXT=none for i in $dirs; do if test -r $i/perl.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } PERL5EXT="$i" break fi done if test "$PERL5EXT" = none; then PERL5EXT="$PERL5DIR/CORE" { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not locate perl.h...using $PERL5EXT" >&5 $as_echo "could not locate perl.h...using $PERL5EXT" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 library" >&5 $as_echo_n "checking for Perl5 library... " >&6; } PERL5LIB=`($PERL -e 'use Config; $_=$Config{libperl}; s/^lib//; s/$Config{_a}$//; s/\.$Config{so}.*//; print $_, "\n"') 2>/dev/null` if test -z "$PERL5LIB" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5LIB" >&5 $as_echo "$PERL5LIB" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 ccflags" >&5 $as_echo_n "checking for Perl5 ccflags... " >&6; } PERL5CCFLAGS=`($PERL -e 'use Config; print $Config{ccflags}, "\n"' | sed "s/-Wdeclaration-after-statement//") 2>/dev/null` if test -z "$PERL5CCFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5CCFLAGS" >&5 $as_echo "$PERL5CCFLAGS" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 ccdlflags" >&5 $as_echo_n "checking for Perl5 ccdlflags... " >&6; } PERL5CCDLFLAGS=`($PERL -e 'use Config; print $Config{ccdlflags}, "\n"') 2>/dev/null` if test -z "$PERL5CCDLFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5CCDLFLAGS" >&5 $as_echo "$PERL5CCDLFLAGS" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 cccdlflags" >&5 $as_echo_n "checking for Perl5 cccdlflags... " >&6; } PERL5CCCDLFLAGS=`($PERL -e 'use Config; print $Config{cccdlflags}, "\n"') 2>/dev/null` if test -z "$PERL5CCCDLFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5CCCDLFLAGS" >&5 $as_echo "$PERL5CCCDLFLAGS" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 ldflags" >&5 $as_echo_n "checking for Perl5 ldflags... " >&6; } PERL5LDFLAGS=`($PERL -e 'use Config; print $Config{ldflags}, "\n"') 2>/dev/null` if test -z "$PERL5LDFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5LDFLAGS" >&5 $as_echo "$PERL5LDFLAGS" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 Test::More module" >&5 $as_echo_n "checking for Perl5 Test::More module... " >&6; } # For test-suite PERL5TESTMORE=`($PERL -e 'use Test::More; print "good";') 2>/dev/null` if test -z "$PERL5TESTMORE" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: unable to determine perl5 configuration" >&5 $as_echo "unable to determine perl5 configuration" >&6; } PERL5EXT=$PERL5DIR fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not figure out how to run perl5" >&5 $as_echo "could not figure out how to run perl5" >&6; } fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PERL5DYNAMICLINKING="-L$PERL5EXT -l$PERL5LIB";; *)PERL5DYNAMICLINKING="";; esac fi #---------------------------------------------------------------- # Look for Octave #---------------------------------------------------------------- OCTAVEBIN= OCTAVE_SO=.oct # Check whether --with-octave was given. if test "${with_octave+set}" = set; then : withval=$with_octave; OCTAVEBIN="$withval" else OCTAVEBIN="$alllang_default" fi # Check for "--without-octave" or "--with-octave=no". if test x"${OCTAVEBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Octave" >&5 $as_echo "$as_me: Disabling Octave" >&6;} OCTAVE= # Check for Octave; prefer command-line program "octave-cli" to (in newer versions) GUI program "octave" elif test "x$OCTAVEBIN" = xyes; then # Extract the first word of "octave-cli octave", so it can be a program name with args. set dummy octave-cli octave; 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_OCTAVE+:} false; then : $as_echo_n "(cached) " >&6 else case $OCTAVE in [\\/]* | ?:[\\/]*) ac_cv_path_OCTAVE="$OCTAVE" # 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_OCTAVE="$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 OCTAVE=$ac_cv_path_OCTAVE if test -n "$OCTAVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE" >&5 $as_echo "$OCTAVE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else OCTAVE="$OCTAVEBIN" fi # Check if Octave works if test -n "$OCTAVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ${OCTAVE} works" >&5 $as_echo_n "checking if ${OCTAVE} works... " >&6; } if test "x`${OCTAVE} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/Octave, version/p'`" != x; 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" >&5 $as_echo "no" >&6; } OCTAVE= fi fi # Check for required Octave helper program "mkoctfile" if test -n "$OCTAVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mkoctfile" >&5 $as_echo_n "checking for mkoctfile... " >&6; } version_suffix="`echo $OCTAVE | sed -e 's|.*\(-[0-9][0-9.]*\)$|\1|'`" case $version_suffix in -*) ;; *) version_suffix="" ;; esac octave_directory=`dirname $OCTAVE` if test "$octave_directory" = "." ; then mkoctfile="mkoctfile${version_suffix}" else mkoctfile="${octave_directory}/mkoctfile${version_suffix}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${mkoctfile}" >&5 $as_echo "${mkoctfile}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ${mkoctfile} works" >&5 $as_echo_n "checking if ${mkoctfile} works... " >&6; } mkoctfile="env - PATH=$PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH ${mkoctfile}" if test "x`${mkoctfile} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/mkoctfile, version/p'`" != x; 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" >&5 $as_echo "no" >&6; } OCTAVE= fi fi # Check for Octave preprocessor/compiler/linker flags if test -n "$OCTAVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Octave preprocessor flags" >&5 $as_echo_n "checking for Octave preprocessor flags... " >&6; } OCTAVE_CPPFLAGS= for var in CPPFLAGS INCFLAGS ALL_CXXFLAGS; do for flag in `${mkoctfile} -p ${var}`; do case ${flag} in -D*|-I*) OCTAVE_CPPFLAGS="${OCTAVE_CPPFLAGS} ${flag}";; *) ;; esac done done { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE_CPPFLAGS" >&5 $as_echo "$OCTAVE_CPPFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Octave compiler flags" >&5 $as_echo_n "checking for Octave compiler flags... " >&6; } OCTAVE_CXXFLAGS= for var in CXX ALL_CXXFLAGS; do for flag in `${mkoctfile} -p ${var}`; do case ${flag} in -std=*|-g*|-W*) OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} ${flag}";; *) ;; esac done done save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-Werror -O0" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} -O0" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="${save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE_CXXFLAGS" >&5 $as_echo "$OCTAVE_CXXFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Octave linker flags" >&5 $as_echo_n "checking for Octave linker flags... " >&6; } OCTAVE_LDFLAGS= for var in OCTLIBDIR; do OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "-L`${mkoctfile} -p ${var}` done for var in RDYNAMIC_FLAG RLD_FLAG OCTAVE_LIBS LIBS; do OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "`${mkoctfile} -p ${var}` done { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE_LDFLAGS" >&5 $as_echo "$OCTAVE_LDFLAGS" >&6; } fi # Check for Octave options if test -n "$OCTAVE"; then for octave_opt in --no-window-system --silent --norc --no-history; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Octave option '${octave_opt}' is supported" >&5 $as_echo_n "checking if Octave option '${octave_opt}' is supported... " >&6; } octave_out=`${OCTAVE} ${octave_opt} /dev/null 2>&1 | sed -n '1p' | sed -n '/unrecognized/p'` if test "x${octave_out}" = x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } OCTAVE="${OCTAVE} ${octave_opt}" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi done fi #---------------------------------------------------------------- # Look for Scilab #---------------------------------------------------------------- # Check whether --with-scilab was given. if test "${with_scilab+set}" = set; then : withval=$with_scilab; SCILABBIN="$withval" else SCILABBIN="$alllang_default" fi # Check whether --with-scilab-inc was given. if test "${with_scilab_inc+set}" = set; then : withval=$with_scilab_inc; SCILABINCDIR="$withval" else SCILABINCDIR="" fi # First, check for "--without-scilab" or "--with-scilab=no". if test x"${SCILABBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Scilab" >&5 $as_echo "$as_me: Disabling Scilab" >&6;} SCILAB= else # Check for Scilab executable if test "x$SCILABBIN" = xyes; then for ac_prog in scilab 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_SCILAB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$SCILAB"; then ac_cv_prog_SCILAB="$SCILAB" # 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_SCILAB="$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 SCILAB=$ac_cv_prog_SCILAB if test -n "$SCILAB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SCILAB" >&5 $as_echo "$SCILAB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$SCILAB" && break done else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for scilab" >&5 $as_echo_n "checking for scilab... " >&6; } if test -f "$SCILABBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SCILABBIN" >&5 $as_echo "$SCILABBIN" >&6; } SCILAB="$SCILABBIN" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi fi if test -n "$SCILAB"; then # Check for Scilab version (needs api_scilab so needs version 5.3.3 or higher) SCILAB_FULL_VERSION=`$SCILAB -version | head -1 | sed -e 's|Scilab version \"\(.*\)\"|\1|g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking Scilab version is 5.3.3 or higher" >&5 $as_echo_n "checking Scilab version is 5.3.3 or higher... " >&6; } SCILAB_MAJOR_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f1` SCILAB_MINOR_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f2` SCILAB_MAINTENANCE_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f3` SCILAB_VERSION="$SCILAB_MAJOR_VERSION$SCILAB_MINOR_VERSION$SCILAB_MAINTENANCE_VERSION" if test $SCILAB_VERSION -ge 533; 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" >&5 $as_echo "no" >&6; } SCILAB= fi if test -n "$SCILAB"; then # Set Scilab startup options depending on version { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Scilab startup options" >&5 $as_echo_n "checking for Scilab startup options... " >&6; } SCILABOPT="-nwni -nb" if test $SCILAB_VERSION -ge 540; then SCILABOPT+=" -noatomsautoload" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SCILABOPT" >&5 $as_echo "$SCILABOPT" >&6; } # Check for Scilab header files { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Scilab header files" >&5 $as_echo_n "checking for Scilab header files... " >&6; } if test "$SCILABINCDIR" != ""; then dirs="$SCILABINCDIR" elif test -n "$PKGCONFIG"; then dirs=`$PKGCONFIG scilab --cflags-only-I | sed -e 's/-I//g'` else dirs="" fi for i in $dirs; do if test -r $i/api_scilab.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } SCILABINCLUDE="-I$i" break fi if test -r $i/scilab/api_scilab.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i/scilab" >&5 $as_echo "$i/scilab" >&6; } SCILABINCLUDE="-I$i/scilab" break fi done if test "$SCILABINCLUDE" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } SCILAB= fi fi fi fi #---------------------------------------------------------------- # Look for java #---------------------------------------------------------------- # Check whether --with-java was given. if test "${with_java+set}" = set; then : withval=$with_java; JAVABIN="$withval" else JAVABIN="$alllang_default" fi # Check whether --with-javac was given. if test "${with_javac+set}" = set; then : withval=$with_javac; JAVACBIN="$withval" else JAVACBIN= fi # First, check for "--without-java" or "--with-java=no". if test x"${JAVABIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Java" >&5 $as_echo "$as_me: Disabling Java" >&6;} JAVA= else case $host in *-*-cygwin*) if test -n "$JAVA_HOME"; then JAVA_HOME=`cygpath --mixed "$JAVA_HOME"` fi JAVA_CLASSPATH_SEP=";" ;; *-*-mingw*) if test -n "$JAVA_HOME"; then JAVA_HOME=`${srcdir}/Tools/convertpath -u "$JAVA_HOME"` fi JAVA_CLASSPATH_SEP=";" ;; *-*-darwin*) if test -z "$JAVA_HOME" -a -x /usr/libexec/java_home; then JAVA_HOME=`/usr/libexec/java_home` fi JAVA_OSX_STD_INCDIR="/System/Library/Frameworks/JavaVM.framework/Headers" if test -r "$JAVA_OSX_STD_INCDIR/jni.h"; then JAVA_HOME_INCDIR=$JAVA_OSX_STD_INCDIR fi JAVA_CLASSPATH_SEP=":" ;; *) JAVA_CLASSPATH_SEP=":" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for java JDK" >&5 $as_echo_n "checking for java JDK... " >&6; } if test -n "$JAVA_HOME"; then java_home_ok=1 if test -z "$JAVABIN" -a ! -x "$JAVA_HOME/bin/java"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No java executable under JAVA_HOME." >&5 $as_echo "$as_me: WARNING: No java executable under JAVA_HOME." >&2;} java_home_ok=0 fi if test -z "$JAVACBIN" -a ! -x "$JAVA_HOME/bin/javac"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No javac executable under JAVA_HOME." >&5 $as_echo "$as_me: WARNING: No javac executable under JAVA_HOME." >&2;} java_home_ok=0 fi if test -z "$JAVA_HOME_INCDIR"; then JAVA_HOME_INCDIR="$JAVA_HOME/include" fi if test -z "$JAVAINCDIR" -a ! -r "$JAVA_HOME_INCDIR/jni.h"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No java headers under JAVA_HOME (does it point to a JDK and not just JRE?)." >&5 $as_echo "$as_me: WARNING: No java headers under JAVA_HOME (does it point to a JDK and not just JRE?)." >&2;} java_home_ok=0 fi if test "$java_home_ok" = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found (in $JAVA_HOME)" >&5 $as_echo "found (in $JAVA_HOME)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: JAVA_HOME ($JAVA_HOME) is defined but does not point to a complete JDK installation, ignoring it." >&5 $as_echo "$as_me: WARNING: JAVA_HOME ($JAVA_HOME) is defined but does not point to a complete JDK installation, ignoring it." >&2;} JAVA_HOME= fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (JAVA_HOME is not defined)" >&5 $as_echo "no (JAVA_HOME is not defined)" >&6; } fi if test "x$JAVABIN" = xyes; then if test -n "$JAVA_HOME"; then JAVA="$JAVA_HOME/bin/java" else for ac_prog in java kaffe guavac 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_JAVA+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$JAVA"; then ac_cv_prog_JAVA="$JAVA" # 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_JAVA="$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 JAVA=$ac_cv_prog_JAVA if test -n "$JAVA"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA" >&5 $as_echo "$JAVA" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$JAVA" && break done fi else JAVA="$JAVABIN" fi if test -z "$JAVACBIN"; then if test -n "$JAVA_HOME"; then JAVAC="$JAVA_HOME/bin/javac" else for ac_prog in javac 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_JAVAC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$JAVAC"; then ac_cv_prog_JAVAC="$JAVAC" # 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_JAVAC="$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 JAVAC=$ac_cv_prog_JAVAC if test -n "$JAVAC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5 $as_echo "$JAVAC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$JAVAC" && break done fi else JAVAC="$JAVACBIN" fi # Check Java version: we require Java 9 or later for Doxygen tests. if test -n "$JAVAC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if java version is 9 or greater" >&5 $as_echo_n "checking if java version is 9 or greater... " >&6; } javac_version=`"$JAVAC" -version 2>&1` java_version_num=`echo $javac_version | sed -n 's/^javac //p'` if test -z "$java_version_num"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unknown format for Java version returned by \"$JAVAC\" ($javac_version)" >&5 $as_echo "$as_me: WARNING: unknown format for Java version returned by \"$JAVAC\" ($javac_version)" >&2;} JAVA_SKIP_DOXYGEN_TEST_CASES=1 { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5 $as_echo "unknown" >&6; } else case $java_version_num in 1.*) JAVA_SKIP_DOXYGEN_TEST_CASES=1 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, disabling Doxygen tests" >&5 $as_echo "no, disabling Doxygen tests" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for java include file jni.h" >&5 $as_echo_n "checking for java include file jni.h... " >&6; } # Check whether --with-javaincl was given. if test "${with_javaincl+set}" = set; then : withval=$with_javaincl; JAVAINCDIR="$withval" else JAVAINCDIR= fi JAVAINC="" if test -z "$JAVAINCDIR" ; then if test -n "$JAVA_HOME"; then JAVAINCDIR="$JAVA_HOME_INCDIR" JAVAINC=-I\"$JAVAINCDIR\" else JAVAINCDIR="/usr/j2sdk*/include /usr/local/j2sdk*/include /usr/jdk*/include /usr/local/jdk*/include /opt/j2sdk*/include /opt/jdk*/include /usr/java/include /usr/java/j2sdk*/include /usr/java/jdk*/include /usr/local/java/include /opt/java/include /usr/include/java /usr/local/include/java /usr/lib/java/include /usr/lib/jvm/java*/include /usr/lib64/jvm/java*/include /usr/include/kaffe /usr/local/include/kaffe /usr/include" # Add in default installation directory on Windows for Cygwin case $host in *-*-cygwin* | *-*-mingw*) JAVAINCDIR="c:/Program*Files*/Java/jdk*/include d:/Program*Files*/Java/jdk*/include c:/j2sdk*/include d:/j2sdk*/include c:/jdk*/include d:/jdk*/include $JAVAINCDIR";; *-*-darwin*) JAVAINCDIR="$JAVA_OSX_STD_INCDIR $JAVAINCDIR";; *);; esac for d in $JAVAINCDIR ; do if test -r "$d/jni.h" ; then JAVAINCDIR=$d JAVAINC=-I\"$d\" JAVA_HOME_MAYBE="`dirname $d`" break fi done fi else if test -r "$JAVAINCDIR/jni.h" ; then JAVAINC=-I\"$JAVAINCDIR\" fi fi if test "$JAVAINC" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAINC" >&5 $as_echo "$JAVAINC" >&6; } # now look for /jni_md.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for java include file jni_md.h" >&5 $as_echo_n "checking for java include file jni_md.h... " >&6; } JAVAMDDIR=`find "$JAVAINCDIR" -follow -name jni_md.h -print` if test "$JAVAMDDIR" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else JAVAMDDIR=-I\"`dirname "$JAVAMDDIR" | tail -1`\" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAMDDIR" >&5 $as_echo "$JAVAMDDIR" >&6; } JAVAINC="${JAVAINC} ${JAVAMDDIR}" fi fi # Auto-detecting JAVA_HOME is not so easy, below will only work up to and including jdk8 if test -z "$JAVA_HOME" && test -n "$JAVA_HOME_MAYBE" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for java jdk from jni include paths" >&5 $as_echo_n "checking for java jdk from jni include paths... " >&6; } if test -r "$JAVA_HOME_MAYBE/lib/tools.jar" ; then JAVA_HOME=$JAVA_HOME_MAYBE { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA_HOME" >&5 $as_echo "$JAVA_HOME" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi fi case $host in *-*-cygwin*) # TODO: Only use this flag if the compiler supports it, later versions of gcc no longer have it GCC_MNO_CYGWIN=" -mno-cygwin" ;; *) GCC_MNO_CYGWIN="" ;; esac # java.exe on Cygwin requires the Windows standard (Pascal) calling convention as it is a normal Windows executable and not a Cygwin built executable case $host in *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then JAVADYNAMICLINKING="$GCC_MNO_CYGWIN -mthreads -Wl,--add-stdcall-alias" JAVACFLAGS="$GCC_MNO_CYGWIN -mthreads" else JAVADYNAMICLINKING="" JAVACFLAGS="" fi ;; *-*-darwin*) JAVADYNAMICLINKING="-dynamiclib -framework JavaVM" JAVACFLAGS="" ;; *) JAVADYNAMICLINKING="" JAVACFLAGS="" ;; esac # Java on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls case $host in *-*-cygwin* | *-*-mingw*) JAVALIBRARYPREFIX="";; *)JAVALIBRARYPREFIX="lib";; esac # Java on Mac OS X tweaks case $host in *-*-darwin*) JAVASO=".jnilib" JAVALDSHARED='$(CC)' JAVACXXSHARED='$(CXX)' ;; *) JAVASO=$SO JAVALDSHARED='$(LDSHARED)' JAVACXXSHARED='$(CXXSHARED)' ;; esac fi # Quote for spaces in path to executables if test -n "$JAVA"; then JAVA=\"$JAVA\" fi if test -n "$JAVAC"; then JAVAC=\"$JAVAC\" fi # Turned off due to spurious warnings in later versions of openjdk-1.8 # JAVAFLAGS=-Xcheck:jni #---------------------------------------------------------------- # Look for Javascript #---------------------------------------------------------------- # Check whether --with-javascript was given. if test "${with_javascript+set}" = set; then : withval=$with_javascript; with_javascript="$withval" else with_javascript="$alllang_default" fi # First, check for "--without-javascript" or "--with-javascript=no". if test x"${with_javascript}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Javascript" >&5 $as_echo "$as_me: Disabling Javascript" >&6;} JAVASCRIPT= else JAVASCRIPT=1 #---------------------------------------------------------------- # General Javascript settings shared by JSC and V8 #---------------------------------------------------------------- case $host in *-*-darwin*) JSSO=".dylib" # HACK: didn't manage to get dynamic module loading working with a g++ compiled interpreter JSINTERPRETERCXX='c++' JSINTERPRETERLINKFLAGS='-g -Wl,-search_paths_first -Wl,-headerpad_max_install_names' ;; *) JSSO=$SO JSINTERPRETERCXX='$(CXX)' JSINTERPRETERLINKFLAGS='-ldl' ;; esac #---------------------------------------------------------------- # Look for Node.js which is the default Javascript engine #---------------------------------------------------------------- for ac_prog in nodejs node 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_NODEJS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NODEJS"; then ac_cv_prog_NODEJS="$NODEJS" # 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_NODEJS="$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 NODEJS=$ac_cv_prog_NODEJS if test -n "$NODEJS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NODEJS" >&5 $as_echo "$NODEJS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$NODEJS" && break done if test -n "$NODEJS"; then # node-gyp is needed to run the test-suite/examples for ac_prog in node-gyp 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_NODEGYP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NODEGYP"; then ac_cv_prog_NODEGYP="$NODEGYP" # 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_NODEGYP="$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 NODEGYP=$ac_cv_prog_NODEGYP if test -n "$NODEGYP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NODEGYP" >&5 $as_echo "$NODEGYP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$NODEGYP" && break done if test -z "$NODEGYP"; then NODEJS= fi fi #---------------------------------------------------------------- # Look for JavascriptCore (Webkit) settings (JSCOREINCDIR, JSCOREDYNAMICLINKING) #---------------------------------------------------------------- # check for include files { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JavaScriptCore/JavaScript.h" >&5 $as_echo_n "checking for JavaScriptCore/JavaScript.h... " >&6; } # Check whether --with-jscoreinc was given. if test "${with_jscoreinc+set}" = set; then : withval=$with_jscoreinc; JSCOREINCDIR="$withval" else JSCOREINCDIR= fi JSCOREVERSION= if test -z "$JSCOREINCDIR"; then JSCOREINCDIR="/usr/include/ /usr/local/include/" # Add in default directory for JavaScriptCore headers for Linux and Mac OS X case $host in *-*-linux*) JSCOREINCDIR="/usr/include/webkit-1.0/ /usr/include/webkitgtk-1.0/ /usr/local/include/webkit-1.0/JavaScriptCore/ $JSCOREINCDIR" ;; *-*-darwin*) JSCOREINCDIR="/System/Library/Frameworks/JavaScriptCore.framework/Headers/ $JSCOREINCDIR" ;; *) ;; esac fi for d in $JSCOREINCDIR ; do if test -r "$d/JavaScriptCore/JavaScript.h" || test -r "$d/JavaScript.h" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 $as_echo "$d" >&6; } JSCOREINCDIR=$d JSCOREINC=-I\"$d\" break fi done if test "$JSCOREINC" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi # check for JavaScriptCore/Webkit libraries # Check whether --with-jscorelib was given. if test "${with_jscorelib+set}" = set; then : withval=$with_jscorelib; JSCORELIB="-L$withval" else JSCORELIB= fi if test -z "$JSCORELIB" -a -n "$PKGCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JavaScriptCore/Webkit library" >&5 $as_echo_n "checking for JavaScriptCore/Webkit library... " >&6; } if $PKGCONFIG javascriptcoregtk-1.0; then JSCORELIB=`$PKGCONFIG --libs javascriptcoregtk-1.0` JSCOREVERSION=`$PKGCONFIG --modversion javascriptcoregtk-1.0` fi if test -z "$JSCORELIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } JSCENABLED= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JSCORELIB" >&5 $as_echo "$JSCORELIB" >&6; } JSCOREDYNAMICLINKING="$JSCORELIB" JSCENABLED=1 fi fi #---------------------------------------------------------------- # Look for V8 settings (JSV8INCDIR, JSV8DYNAMICLINKING) #---------------------------------------------------------------- # check for include files { $as_echo "$as_me:${as_lineno-$LINENO}: checking for V8 Javascript v8.h" >&5 $as_echo_n "checking for V8 Javascript v8.h... " >&6; } # Check whether --with-jsv8inc was given. if test "${with_jsv8inc+set}" = set; then : withval=$with_jsv8inc; JSV8INCDIR="$withval" else JSV8INCDIR= fi # if not include dir is specified we try to find if test -z "$JSV8INCDIR"; then # Add in default directory for JavaScriptCore headers for Linux and Mac OS X case $host in *-*-linux*) JSV8INCDIR="/usr/include /usr/local/include/ $JSV8INCDIR" ;; *-*-darwin*) JSV8INCDIR="$JSV8INCDIR" ;; *) ;; esac fi for d in $JSV8INCDIR ; do if test -r "$d/v8.h" ; then JSV8INCDIR=$d JSV8INC=-I\"$d\" break fi done if test "$JSV8INC" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JSV8INCDIR" >&5 $as_echo "$JSV8INCDIR" >&6; } fi # check for V8 library { $as_echo "$as_me:${as_lineno-$LINENO}: checking for V8 Javascript library" >&5 $as_echo_n "checking for V8 Javascript library... " >&6; } # Check whether --with-jsv8lib was given. if test "${with_jsv8lib+set}" = set; then : withval=$with_jsv8lib; JSV8LIBDIR="$withval" else JSV8LIB= fi v8libdirs="$JSV8LIBDIR /usr/lib64/ /usr/local/lib64/ /usr/lib/ /usr/local/lib/" for d in $v8libdirs ; do if test -r $d/libv8$JSSO; then JSV8LIBDIR=$d JSV8LIB="-L$d -lv8" break fi done if test "$JSV8LIB" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } JSV8ENABLED= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JSV8LIBDIR" >&5 $as_echo "$JSV8LIBDIR" >&6; } JSV8ENABLED=1 fi # linking options case $host in *-*-darwin*) JSV8DYNAMICLINKING="$JSV8LIB" ;; *-*-linux*) JSV8DYNAMICLINKING="$JSV8LIB" ;; *) JSV8DYNAMICLINKING="" ;; esac fi #---------------------------------------------------------------- # Look for Android #---------------------------------------------------------------- # Check whether --with-android was given. if test "${with_android+set}" = set; then : withval=$with_android; ANDROIDBIN="$withval" else ANDROIDBIN="$alllang_default" fi # Check whether --with-adb was given. if test "${with_adb+set}" = set; then : withval=$with_adb; ADBBIN="$withval" else ADBBIN= fi # Check whether --with-ant was given. if test "${with_ant+set}" = set; then : withval=$with_ant; ANTBIN="$withval" else ANTBIN= fi # Check whether --with-ndk-build was given. if test "${with_ndk_build+set}" = set; then : withval=$with_ndk_build; NDKBUILDBIN="$withval" else NDKBUILDBIN= fi # First, check for "--without-android" or "--with-android=no". if test x"${ANDROIDBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Android" >&5 $as_echo "$as_me: Disabling Android" >&6;} ANDROID= else if test "x$ANDROIDBIN" = xyes; then for ac_prog in android 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_ANDROID+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ANDROID"; then ac_cv_prog_ANDROID="$ANDROID" # 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_ANDROID="$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 ANDROID=$ac_cv_prog_ANDROID if test -n "$ANDROID"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ANDROID" >&5 $as_echo "$ANDROID" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ANDROID" && break done else ANDROID="$ANDROIDBIN" fi if test -z "$ADBBIN"; then for ac_prog in adb 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_ADB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ADB"; then ac_cv_prog_ADB="$ADB" # 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_ADB="$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 ADB=$ac_cv_prog_ADB if test -n "$ADB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ADB" >&5 $as_echo "$ADB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ADB" && break done else ADB="$ADBBIN" fi if test -z "$ANTBIN"; then for ac_prog in ant 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_ANT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ANT"; then ac_cv_prog_ANT="$ANT" # 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_ANT="$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 ANT=$ac_cv_prog_ANT if test -n "$ANT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ANT" >&5 $as_echo "$ANT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ANT" && break done else ANT="$ANTBIN" fi if test -z "$NDKBUILDBIN"; then for ac_prog in ndk-build 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_NDKBUILD+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NDKBUILD"; then ac_cv_prog_NDKBUILD="$NDKBUILD" # 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_NDKBUILD="$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 NDKBUILD=$ac_cv_prog_NDKBUILD if test -n "$NDKBUILD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NDKBUILD" >&5 $as_echo "$NDKBUILD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$NDKBUILD" && break done else NDKBUILD="$NDKBUILDBIN" fi fi #---------------------------------------------------------------- # Look for Guile #---------------------------------------------------------------- GUILE= GUILE_CFLAGS= GUILE_LIBS= # Check whether --with-guile-config was given. if test "${with_guile_config+set}" = set; then : withval=$with_guile_config; GUILE_CONFIG="$withval" else GUILE_CONFIG= fi # Check whether --with-guile was given. if test "${with_guile+set}" = set; then : withval=$with_guile; GUILE="$withval" else GUILE="$alllang_default" fi # Check whether --with-guile-cflags was given. if test "${with_guile_cflags+set}" = set; then : withval=$with_guile_cflags; GUILE_CFLAGS="$withval" fi # Check whether --with-guile-libs was given. if test "${with_guile_libs+set}" = set; then : withval=$with_guile_libs; GUILE_LIBS="$withval" fi # First, check for "--without-guile" or "--with-guile=no". if test x"${GUILE}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Guile" >&5 $as_echo "$as_me: Disabling Guile" >&6;} else if test -z "$GUILE_CONFIG" ; then # Extract the first word of "guile-config", so it can be a program name with args. set dummy guile-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_GUILE_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $GUILE_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_GUILE_CONFIG="$GUILE_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_GUILE_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 GUILE_CONFIG=$ac_cv_path_GUILE_CONFIG if test -n "$GUILE_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE_CONFIG" >&5 $as_echo "$GUILE_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -n "$GUILE_CONFIG" ; then if test x"$GUILE" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile executable" >&5 $as_echo_n "checking for guile executable... " >&6; } # Try extracting it via guile-config first. If it's defined there it's the most reliable result GUILE="`$GUILE_CONFIG info guile 2>/dev/null`" if test -n "$GUILE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE" >&5 $as_echo "$GUILE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found via guile-config - constructing path" >&5 $as_echo "not found via guile-config - constructing path" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile bindir" >&5 $as_echo_n "checking for guile bindir... " >&6; } guile_bindir="`$GUILE_CONFIG info bindir`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $guile_bindir" >&5 $as_echo "$guile_bindir" >&6; } GUILE="$guile_bindir/guile" fi if ! test -f "$GUILE" ; then GUILE= # Extract the first word of "guile", so it can be a program name with args. set dummy guile; 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_GUILE+:} false; then : $as_echo_n "(cached) " >&6 else case $GUILE in [\\/]* | ?:[\\/]*) ac_cv_path_GUILE="$GUILE" # 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_GUILE="$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 GUILE=$ac_cv_path_GUILE if test -n "$GUILE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE" >&5 $as_echo "$GUILE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$GUILE" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no suitable guile executable found. Disabling Guile" >&5 $as_echo "$as_me: WARNING: no suitable guile executable found. Disabling Guile" >&2;} fi fi if test -n "$GUILE" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile version" >&5 $as_echo_n "checking for guile version... " >&6; } guile_version=`$GUILE -c '(display (effective-version))'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $guile_version" >&5 $as_echo "$guile_version" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile version >= 1.8" >&5 $as_echo_n "checking for guile version >= 1.8... " >&6; } guile_good_version=`$GUILE -c '(if (>= (string->number (effective-version)) 1.8) (display "yes") (display "no"))'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $guile_good_version" >&5 $as_echo "$guile_good_version" >&6; } if test x"$guile_good_version" != xyes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: at least guile version 1.8 is required. Disabling Guile" >&5 $as_echo "$as_me: WARNING: at least guile version 1.8 is required. Disabling Guile" >&2;} GUILE= fi fi if test -n "$GUILE" ; then # Test if guile-config and guile versions match. They should. gc_version="`$GUILE_CONFIG --version 2>&1 | sed '1 s/.* //;q'`" g_version="`$GUILE --version | sed '1 s/.* //;q'`" if test "$gc_version" != "$g_version"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: different versions reported by $GUILE_CONFIG ($gc_version) and $GUILE ($g_version). Disabling Guile" >&5 $as_echo "$as_me: WARNING: different versions reported by $GUILE_CONFIG ($gc_version) and $GUILE ($g_version). Disabling Guile" >&2;} GUILE= fi fi if test -n "$GUILE" ; then if test -z "$GUILE_CFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile compile flags" >&5 $as_echo_n "checking for guile compile flags... " >&6; } GUILE_CFLAGS="`$GUILE_CONFIG compile`" # Note that this can sometimes be empty { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE_CFLAGS" >&5 $as_echo "$GUILE_CFLAGS" >&6; } fi if test -z "$GUILE_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile link flags" >&5 $as_echo_n "checking for guile link flags... " >&6; } GUILE_LIBS="`$GUILE_CONFIG link`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE_LIBS" >&5 $as_echo "$GUILE_LIBS" >&6; } fi fi fi fi #---------------------------------------------------------------- # Look for MzScheme #---------------------------------------------------------------- # Check whether --with-mzscheme was given. if test "${with_mzscheme+set}" = set; then : withval=$with_mzscheme; MZSCHEMEBIN="$withval" else MZSCHEMEBIN="$alllang_default" fi # Check whether --with-mzc was given. if test "${with_mzc+set}" = set; then : withval=$with_mzc; MZCBIN="$withval" else MZCBIN= fi # First, check for "--without-mzscheme" or "--with-mzscheme=no". if test x"${MZSCHEMEBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling MzScheme" >&5 $as_echo "$as_me: Disabling MzScheme" >&6;} MZC= else if test "x$MZSCHEMEBIN" = xyes; then # Extract the first word of "mzscheme", so it can be a program name with args. set dummy mzscheme; 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_MZSCHEME+:} false; then : $as_echo_n "(cached) " >&6 else case $MZSCHEME in [\\/]* | ?:[\\/]*) ac_cv_path_MZSCHEME="$MZSCHEME" # 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_MZSCHEME="$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 MZSCHEME=$ac_cv_path_MZSCHEME if test -n "$MZSCHEME"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MZSCHEME" >&5 $as_echo "$MZSCHEME" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MZSCHEME="$MZSCHEMEBIN" fi if test -z "$MZCBIN"; then # Extract the first word of "mzc", so it can be a program name with args. set dummy mzc; 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_MZC+:} false; then : $as_echo_n "(cached) " >&6 else case $MZC in [\\/]* | ?:[\\/]*) ac_cv_path_MZC="$MZC" # 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_MZC="$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 MZC=$ac_cv_path_MZC if test -n "$MZC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MZC" >&5 $as_echo "$MZC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -n "$MZSCHEME"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MzScheme dynext object" >&5 $as_echo_n "checking for MzScheme dynext object... " >&6; } MZDYNOBJ=`$MZSCHEME --eval '(begin (require dynext/link) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (printf "~a" x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null` if test -f "$MZDYNOBJ"; then : else # older versions (3.72 approx and earlier) MZDYNOBJ=`$MZSCHEME --mute-banner --version --eval '(begin (require (lib "link.ss" "dynext")) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x) (display " ")) ((current-make-standard-link-libraries)))) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null` fi if test -f "$MZDYNOBJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MZDYNOBJ" >&5 $as_echo "$MZDYNOBJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } MZDYNOBJ="" fi fi fi #---------------------------------------------------------------- # Look for Ruby #---------------------------------------------------------------- RUBYBIN= # Check whether --with-ruby was given. if test "${with_ruby+set}" = set; then : withval=$with_ruby; RUBYBIN="$withval" else RUBYBIN="$alllang_default" fi # First, check for "--without-ruby" or "--with-ruby=no". RUBYSO=$SO if test x"${RUBYBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Ruby" >&5 $as_echo "$as_me: Disabling Ruby" >&6;} RUBY= else # First figure out what the name of Ruby is if test "x$RUBYBIN" = xyes; then for ac_prog in ruby 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_RUBY+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RUBY"; then ac_cv_prog_RUBY="$RUBY" # 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_RUBY="$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 RUBY=$ac_cv_prog_RUBY if test -n "$RUBY"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBY" >&5 $as_echo "$RUBY" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$RUBY" && break done else RUBY="$RUBYBIN" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ruby header files" >&5 $as_echo_n "checking for Ruby header files... " >&6; } if test -n "$RUBY"; then # Try Ruby1.9+ first RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubyhdrdir"] || $rubyhdrdir') 2>/dev/null` RUBYARCHHDRDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubyarchhdrdir"] || $rubyarchhdrdir') 2>/dev/null` if test x"$RUBYDIR" = x"" || test x"$RUBYDIR" = x"nil"; then RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["archdir"] || $archdir') 2>/dev/null` else RUBYARCH=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["arch"] || $arch') 2>/dev/null` fi if test x"$RUBYDIR" != x""; then dirs="$RUBYDIR" RUBYINCLUDE= for i in $dirs; do if test -r $i/ruby.h; then if test x"$RUBYARCH" = x""; then RUBYINCLUDE="-I$i" elif test -n "$RUBYARCHHDRDIR"; then RUBYINCLUDE="-I$i -I$RUBYARCHHDRDIR" else RUBYINCLUDE="-I$i -I$i/$RUBYARCH" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBYINCLUDE" >&5 $as_echo "$RUBYINCLUDE" >&6; } break fi done if test x"$RUBYINCLUDE" = x""; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not locate ruby.h" >&5 $as_echo "could not locate ruby.h" >&6; } fi # Find library and path for linking. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ruby library" >&5 $as_echo_n "checking for Ruby library... " >&6; } RUBYLIB="" rb_archlibdir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["archlibdir"]') 2>/dev/null` rb_libdir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["libdir"]') 2>/dev/null` rb_bindir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["bindir"]') 2>/dev/null` dirs="$dirs $rb_archlibdir $rb_libdir $rb_bindir" rb_libruby=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["LIBRUBY_A"]') 2>/dev/null` RUBYLINK=`($RUBY -rrbconfig -e ' c = RbConfig::CONFIG if c.has_key? "LIBRUBYARG_STATIC" # 1.8.x if c["LIBRUBY"] == c["LIBRUBY_A"] link = c["LIBRUBYARG_STATIC"] else link = c["LIBRUBYARG_SHARED"] end else # 1.6.x link = "-l" + c["RUBY_INSTALL_NAME"] end # Get the target Ruby was built for target = c["target"] if target == "i386-pc-mswin32" # Need to change msvcrt-ruby*.lib to -lmsvcrt-ruby* ext = File.extname(link) # Get index that counts backwards from end of string index = -1 - ext.size # Strip off the extension link = link.slice(0..index) puts "-l#{link}" else puts link end') 2>/dev/null` if test "$rb_libruby" != ""; then for i in $dirs; do if (test -r $i/$rb_libruby;) then RUBYLIB="$i" break fi done fi if test "$RUBYLIB" = ""; then RUBYLIB="$RUBYDIR" { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found... using $RUBYDIR" >&5 $as_echo "not found... using $RUBYDIR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBYLINK in $RUBYLIB" >&5 $as_echo "$RUBYLINK in $RUBYLIB" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: unable to determine ruby configuration" >&5 $as_echo "unable to determine ruby configuration" >&6; } fi case $host in *-*-mingw*) ;; # do nothing, the default windows libraries are already included *) RUBYLINK="$RUBYLINK `($RUBY -rrbconfig -e 'print RbConfig::CONFIG["LIBS"]') 2>/dev/null`";; esac RUBYCCDLFLAGS=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["CCDLFLAGS"]') 2>/dev/null` RUBYSO=.`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["DLEXT"]') 2>/dev/null` else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not figure out how to run ruby" >&5 $as_echo "could not figure out how to run ruby" >&6; } fi case $host in *-*-cygwin* | *-*-mingw*) RUBYDYNAMICLINKING="-L$RUBYLIB $RUBYLINK";; *) RUBYDYNAMICLINKING="";; esac fi #------------------------------------------------------------------------- # Look for PHP7 #------------------------------------------------------------------------- PHPBIN= # Check whether --with-php was given. if test "${with_php+set}" = set; then : withval=$with_php; PHPBIN="$withval" else PHPBIN="$alllang_default" fi # First, check for "--without-php" or "--with-php=no". if test x"${PHPBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling PHP" >&5 $as_echo "$as_me: Disabling PHP" >&6;} PHP= else if test "x$PHPBIN" = xyes; then for ac_prog in php7.3 php7.2 php7.1 php7.0 php 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_PHP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PHP"; then ac_cv_prog_PHP="$PHP" # 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_PHP="$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 PHP=$ac_cv_prog_PHP if test -n "$PHP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PHP" >&5 $as_echo "$PHP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PHP" && break done else PHP=$PHPBIN fi if test -n "$PHP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PHP header files" >&5 $as_echo_n "checking for PHP header files... " >&6; } case $PHP in *7.*) PHPCONFIG=`echo "$PHP"|sed 's/7\...*$/-config&/'` ;; *) PHPCONFIG=$PHP-config ;; esac php_version=`$PHPCONFIG --version 2>/dev/null` case $php_version in 7.*) PHPINC=`$PHPCONFIG --includes 2>/dev/null` if test -n "$PHPINC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PHPINC" >&5 $as_echo "$PHPINC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi ;; "") { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find $PHPCONFIG or obtain PHP version from it" >&5 $as_echo "could not find $PHPCONFIG or obtain PHP version from it" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: found PHP $php_version - not PHP 7" >&5 $as_echo "found PHP $php_version - not PHP 7" >&6; } ;; esac fi fi #---------------------------------------------------------------- # Look for OCaml #---------------------------------------------------------------- # Check whether --with-ocaml was given. if test "${with_ocaml+set}" = set; then : withval=$with_ocaml; with_ocaml="$withval" else with_ocaml="$alllang_default" fi # Check whether --with-ocamlc was given. if test "${with_ocamlc+set}" = set; then : withval=$with_ocamlc; OCAMLC="$withval" else OCAMLC= fi # Check whether --with-ocamldlgen was given. if test "${with_ocamldlgen+set}" = set; then : withval=$with_ocamldlgen; OCAMLDLGEN="$withval" else OCAMLDLGEN= fi # Check whether --with-ocamlfind was given. if test "${with_ocamlfind+set}" = set; then : withval=$with_ocamlfind; OCAMLFIND="$withval" else OCAMLFIND= fi # Check whether --with-ocamlmktop was given. if test "${with_ocamlmktop+set}" = set; then : withval=$with_ocamlmktop; OCAMLMKTOP="$withval" else OCAMLMKTOP= fi # Check whether --with-camlp4 was given. if test "${with_camlp4+set}" = set; then : withval=$with_camlp4; CAMLP4="$withval" else CAMLP4= fi # First, check for "--without-ocaml" or "--with-ocaml=no". if test x"${with_ocaml}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling OCaml" >&5 $as_echo "$as_me: Disabling OCaml" >&6;} OCAMLC= else # OCaml compiler if test -z "$OCAMLC"; then for ac_prog in ocamlc 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_OCAMLC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLC"; then ac_cv_prog_OCAMLC="$OCAMLC" # 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_OCAMLC="$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 OCAMLC=$ac_cv_prog_OCAMLC if test -n "$OCAMLC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLC" >&5 $as_echo "$OCAMLC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$OCAMLC" && break done fi # OCaml Pre-Processor-Pretty-Printer if test -z "$CAMLP4"; then for ac_prog in camlp4 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_CAMLP4+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CAMLP4"; then ac_cv_prog_CAMLP4="$CAMLP4" # 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_CAMLP4="$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 CAMLP4=$ac_cv_prog_CAMLP4 if test -n "$CAMLP4"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAMLP4" >&5 $as_echo "$CAMLP4" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CAMLP4" && break done fi # OCaml DL load generator if test -z "$OCAMLDLGEN"; then for ac_prog in ocamldlgen 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_OCAMLDLGEN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLDLGEN"; then ac_cv_prog_OCAMLDLGEN="$OCAMLDLGEN" # 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_OCAMLDLGEN="$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 OCAMLDLGEN=$ac_cv_prog_OCAMLDLGEN if test -n "$OCAMLDLGEN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLDLGEN" >&5 $as_echo "$OCAMLDLGEN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$OCAMLDLGEN" && break done fi # OCaml package tool if test -z "$OCAMLFIND"; then for ac_prog in ocamlfind 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_OCAMLFIND+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLFIND"; then ac_cv_prog_OCAMLFIND="$OCAMLFIND" # 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_OCAMLFIND="$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 OCAMLFIND=$ac_cv_prog_OCAMLFIND if test -n "$OCAMLFIND"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLFIND" >&5 $as_echo "$OCAMLFIND" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$OCAMLFIND" && break done fi # OCaml toplevel creator if test -z "$OCAMLMKTOP"; then for ac_prog in ocamlmktop 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_OCAMLMKTOP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLMKTOP"; then ac_cv_prog_OCAMLMKTOP="$OCAMLMKTOP" # 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_OCAMLMKTOP="$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 OCAMLMKTOP=$ac_cv_prog_OCAMLMKTOP if test -n "$OCAMLMKTOP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLMKTOP" >&5 $as_echo "$OCAMLMKTOP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$OCAMLMKTOP" && break done fi fi #---------------------------------------------------------------- # Look for C# #---------------------------------------------------------------- # Check whether --with-csharp was given. if test "${with_csharp+set}" = set; then : withval=$with_csharp; with_csharp="$withval" else with_csharp="$alllang_default" fi # Check whether --with-cil-interpreter was given. if test "${with_cil_interpreter+set}" = set; then : withval=$with_cil_interpreter; CSHARPBIN="$withval" else CSHARPBIN= fi # Check whether --with-csharp-compiler was given. if test "${with_csharp_compiler+set}" = set; then : withval=$with_csharp_compiler; CSHARPCOMPILERBIN="$withval" else CSHARPCOMPILERBIN= fi # First, check for "--without-csharp" or "--with-csharp=no". if test x"${with_csharp}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling CSharp" >&5 $as_echo "$as_me: Disabling CSharp" >&6;} CSHARPCOMPILER= else if test -z "$CSHARPCOMPILERBIN" ; then case $host in *-*-cygwin* | *-*-mingw*) # prefer unified Mono mcs compiler (not to be confused with the ancient .NET 1 mcs) over older/alternative names. for ac_prog in csc mcs mono-csc gmcs cscc 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_CSHARPCOMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCOMPILER"; then ac_cv_prog_CSHARPCOMPILER="$CSHARPCOMPILER" # 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_CSHARPCOMPILER="$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 CSHARPCOMPILER=$ac_cv_prog_CSHARPCOMPILER if test -n "$CSHARPCOMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCOMPILER" >&5 $as_echo "$CSHARPCOMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCOMPILER" && break done if test -n "$CSHARPCOMPILER" && test "$CSHARPCOMPILER" = "csc" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether csc is the Microsoft CSharp compiler" >&5 $as_echo_n "checking whether csc is the Microsoft CSharp compiler... " >&6; } csc 2>/dev/null | grep "C#" > /dev/null || CSHARPCOMPILER="" if test -z "$CSHARPCOMPILER" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } for ac_prog in mcs mono-csc gmcs cscc 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_CSHARPCOMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCOMPILER"; then ac_cv_prog_CSHARPCOMPILER="$CSHARPCOMPILER" # 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_CSHARPCOMPILER="$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 CSHARPCOMPILER=$ac_cv_prog_CSHARPCOMPILER if test -n "$CSHARPCOMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCOMPILER" >&5 $as_echo "$CSHARPCOMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCOMPILER" && break done else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi ;; *)for ac_prog in mono-csc gmcs mcs cscc 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_CSHARPCOMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCOMPILER"; then ac_cv_prog_CSHARPCOMPILER="$CSHARPCOMPILER" # 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_CSHARPCOMPILER="$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 CSHARPCOMPILER=$ac_cv_prog_CSHARPCOMPILER if test -n "$CSHARPCOMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCOMPILER" >&5 $as_echo "$CSHARPCOMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCOMPILER" && break done ;; esac else CSHARPCOMPILER="$CSHARPCOMPILERBIN" fi CSHARPCONVERTPATH="Tools/convertpath -u" if test -z "$CSHARPBIN" ; then CSHARPCILINTERPRETER="" CSHARPCILINTERPRETER_FLAGS="" if test "cscc" = "$CSHARPCOMPILER" ; then for ac_prog in ilrun 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_CSHARPCILINTERPRETER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCILINTERPRETER"; then ac_cv_prog_CSHARPCILINTERPRETER="$CSHARPCILINTERPRETER" # 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_CSHARPCILINTERPRETER="$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 CSHARPCILINTERPRETER=$ac_cv_prog_CSHARPCILINTERPRETER if test -n "$CSHARPCILINTERPRETER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCILINTERPRETER" >&5 $as_echo "$CSHARPCILINTERPRETER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCILINTERPRETER" && break done else if test "mcs" = "$CSHARPCOMPILER"; then # Check that mcs is the C# compiler and not the Unix mcs utility by examining the output of 'mcs --version' # The Mono compiler should emit: Mono C# compiler version a.b.c.d csharp_version_raw=`(mcs --version) 2>/dev/null` csharp_version_searched=`(mcs --version | sed -e "/C#/b" -e "/Mono/b" -e d) 2>/dev/null` # return string if contains 'Mono' or 'C#' CSHARPCOMPILER="" if test -n "$csharp_version_raw" ; then if test "$csharp_version_raw" = "$csharp_version_searched" ; then CSHARPCOMPILER="mcs" fi fi if test "mcs" != "$CSHARPCOMPILER" ; then echo "mcs is not a working Mono C# compiler" fi fi if test "mcs" = "$CSHARPCOMPILER" || test "gmcs" = "$CSHARPCOMPILER" || test "mono-csc" = "$CSHARPCOMPILER"; then for ac_prog in mono 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_CSHARPCILINTERPRETER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCILINTERPRETER"; then ac_cv_prog_CSHARPCILINTERPRETER="$CSHARPCILINTERPRETER" # 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_CSHARPCILINTERPRETER="$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 CSHARPCILINTERPRETER=$ac_cv_prog_CSHARPCILINTERPRETER if test -n "$CSHARPCILINTERPRETER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCILINTERPRETER" >&5 $as_echo "$CSHARPCILINTERPRETER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCILINTERPRETER" && break done # Mono JIT CSHARPCILINTERPRETER_FLAGS="--debug" else if test "csc" = "$CSHARPCOMPILER"; then CSHARPCONVERTPATH="Tools/convertpath -w" fi fi fi else CSHARPCILINTERPRETER="$CSHARPBIN" fi # Cygwin requires the Windows standard (Pascal) calling convention as it is a Windows executable and not a Cygwin built executable case $host in *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then CSHARPDYNAMICLINKING="$GCC_MNO_CYGWIN -mthreads -Wl,--add-stdcall-alias" CSHARPCFLAGS="$GCC_MNO_CYGWIN -mthreads" else CSHARPDYNAMICLINKING="" CSHARPCFLAGS="" fi ;; *) CSHARPDYNAMICLINKING="" CSHARPCFLAGS="" ;; esac # CSharp on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls case $host in *-*-cygwin* | *-*-mingw*) CSHARPLIBRARYPREFIX="";; *)CSHARPLIBRARYPREFIX="lib";; esac # C#/Mono on Mac OS X tweaks case $host in *-*-darwin*) CSHARPSO=".so" ;; *) CSHARPSO=$SO ;; esac fi #---------------------------------------------------------------- # Look for Lua #---------------------------------------------------------------- LUABIN= LUAINCLUDE= LUALIB= LUADYNAMICLOADLIB= LUAFLAGS= LUALINK= # note: if LUABIN is empty then lua tests will not be done # LUABIN will be cleared if certain dependencies cannot be found # Check whether --with-lua was given. if test "${with_lua+set}" = set; then : withval=$with_lua; LUABIN="$withval" else LUABIN="$alllang_default" fi # Check whether --with-luaincl was given. if test "${with_luaincl+set}" = set; then : withval=$with_luaincl; LUAINCLUDE="$withval" else LUAINCLUDE= fi # Check whether --with-lualib was given. if test "${with_lualib+set}" = set; then : withval=$with_lualib; LUALIB="$withval" else LUALIB= fi # First, check for "--without-lua" or "--with-lua=no". if test x"${LUABIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Lua" >&5 $as_echo "$as_me: Disabling Lua" >&6;} else # can we find lua? if test "x$LUABIN" = xyes; then # We look for a versioned Lua binary first, as there can be # multiple versions of Lua installed on some systems (like Debian). for ac_prog in lua5.4 lua5.3 lua5.2 lua5.1 lua 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_LUABIN+:} false; then : $as_echo_n "(cached) " >&6 else case $LUABIN in [\\/]* | ?:[\\/]*) ac_cv_path_LUABIN="$LUABIN" # 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_LUABIN="$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 LUABIN=$ac_cv_path_LUABIN if test -n "$LUABIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LUABIN" >&5 $as_echo "$LUABIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LUABIN" && break done fi # check version: we need Lua 5.x if test "$LUABIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking Lua version" >&5 $as_echo_n "checking Lua version... " >&6; } LUA_VERSION=`$LUABIN -e 'print(string.match(_VERSION, "%d+[.]%d+"))'` # For 5.0 and 5.1 header and libraries may be named using 50 or 51. LUA_VERSION_NO_DOTS= if test -n "$LUA_VERSION" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Lua $LUA_VERSION.x" >&5 $as_echo "Lua $LUA_VERSION.x" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } fi case $LUA_VERSION in 5.0) LUA_VERSION_NO_DOTS=50 ;; 5.1) LUA_VERSION_NO_DOTS=51 ;; 5.*) ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not Lua 5.x, SWIG does not support this version of Lua" >&5 $as_echo "$as_me: WARNING: Not Lua 5.x, SWIG does not support this version of Lua" >&2;} LUABIN="" ;; esac fi if test "$LUABIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Lua dynamic loading is enabled" >&5 $as_echo_n "checking whether Lua dynamic loading is enabled... " >&6; } # using Lua to check Lua # lua 5.0 & 5.1 have different fn names if test "$LUA_VERSION" = "5.0"; then LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=loadlib("no_such_lib","") if c~="absent" then print "1" end'` else LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=package.loadlib("no_such_lib","") if c~="absent" then print "1" end'` fi if test -z "$LUADYNAMICLOADLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # look for the header files & set LUAFLAGS accordingly # will clear LUABIN if not present if test -n "$LUAINCLUDE"; then as_ac_File=`$as_echo "ac_cv_file_$LUAINCLUDE/lua.h" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LUAINCLUDE/lua.h" >&5 $as_echo_n "checking for $LUAINCLUDE/lua.h... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$LUAINCLUDE/lua.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : LUAFLAGS="-I$LUAINCLUDE" else LUABIN= fi else LUA_OK="1" CFLAGS_SAVED=$CFLAGS CFLAGS= # Use empty CFLAGS to avoid failure: "present but cannot be compiled" # 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" "lua.h" "ac_cv_header_lua_h" "$ac_includes_default" if test "x$ac_cv_header_lua_h" = xyes; then : LUAFLAGS="" else LUA_OK="" fi CFLAGS=$CFLAGS_SAVED # if we didn't get it, going to have to look elsewhere (the hard way) if test -z "$LUA_OK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lua.h in other locations" >&5 $as_echo_n "checking for lua.h in other locations... " >&6; } # note: Debian/Ubuntu seem to like /usr/include/lua5.1/lua.h # The ordering of the include directories to search should match # the ordering of libraries to search in the library test below. inc=/usr/include incloc=/usr/local/include dirs="$inc/lua$LUA_VERSION" test -z "$LUA_VERSION_NO_DOTS" || dirs="$dirs $inc/lua$LUA_VERSION_NO_DOTS" dirs="$dirs $incloc/lua$LUA_VERSION" test -z "$LUA_VERSION_NO_DOTS" || dirs="$dirs $incloc/lua$LUA_VERSION_NO_DOTS" dirs="$dirs $incloc" for i in $dirs; do #echo "$i" if test -r $i/lua.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i/lua.h" >&5 $as_echo "$i/lua.h" >&6; } LUAFLAGS="-I$i" break fi done if test -z "$LUAFLAGS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } LUABIN="" # clear the bin fi fi fi # look for the library files & set LUALINK accordingly # will clear LUABIN if not present lua_save_LIBS=$LIBS # the code seems to disrupt LIBS, so saving if test -n "$LUALIB"; then as_ac_File=`$as_echo "ac_cv_file_$LUALIB/liblua.a" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LUALIB/liblua.a" >&5 $as_echo_n "checking for $LUALIB/liblua.a... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$LUALIB/liblua.a"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : LUALINK="-L$LUALIB -llua" else LUABIN= fi else libs="lua lua$LUA_VERSION" test -z "$LUA_VERSION_NO_DOTS" || libs="$libs lua$LUA_VERSION_NO_DOTS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing lua_close" >&5 $as_echo_n "checking for library containing lua_close... " >&6; } if ${ac_cv_search_lua_close+:} 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 lua_close (); int main () { return lua_close (); ; return 0; } _ACEOF for ac_lib in '' $libs; 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_lua_close=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_lua_close+:} false; then : break fi done if ${ac_cv_search_lua_close+:} false; then : else ac_cv_search_lua_close=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_lua_close" >&5 $as_echo "$ac_cv_search_lua_close" >&6; } ac_res=$ac_cv_search_lua_close if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" LUALINK="-l$ac_lib" else LUABIN= fi fi # adding lualib for lua 5.0 if test "$LUA_VERSION" = "5.0"; then LUALINK="$LUALINK -llualib" fi LIBS=$lua_save_LIBS # restore LIBS fi fi # if not disabled #---------------------------------------------------------------- # Look for GNU R #---------------------------------------------------------------- RBIN= # Check whether --with-r was given. if test "${with_r+set}" = set; then : withval=$with_r; RBIN="$withval" else RBIN="$alllang_default" fi # First, check for "--without-r" or "--with-r=no". if test x"${RBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling R" >&5 $as_echo "$as_me: Disabling R" >&6;} RBIN= else # can we find R? if test "x$RBIN" = xyes; then # Extract the first word of "R", so it can be a program name with args. set dummy R; 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_RBIN+:} false; then : $as_echo_n "(cached) " >&6 else case $RBIN in [\\/]* | ?:[\\/]*) ac_cv_path_RBIN="$RBIN" # 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_RBIN="$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 RBIN=$ac_cv_path_RBIN if test -n "$RBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RBIN" >&5 $as_echo "$RBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi #---------------------------------------------------------------- # Look for Go compilers #---------------------------------------------------------------- # Check whether --with-go was given. if test "${with_go+set}" = set; then : withval=$with_go; GOBIN="$withval" else GOBIN="$alllang_default" fi if test x"${GOBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Go" >&5 $as_echo "$as_me: Disabling Go" >&6;} GO= GOGCC=false GCCGO= GOOPT= GCCGOOPT= GOVERSIONOPTION= else if test "x$GOBIN" = xyes; then for ac_prog in go 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_GO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GO"; then ac_cv_prog_GO="$GO" # 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_GO="$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 GO=$ac_cv_prog_GO if test -n "$GO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GO" >&5 $as_echo "$GO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GO" && break done else GO="$GOBIN" fi GOGCC=false GCCGO= GOOPT= GCCGOOPT= GOVERSIONOPTION= if test -n "$GO" ; then GOVERSIONOPTION=version go_version=$($GO $GOVERSIONOPTION | sed -e 's/go version //') { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether go version is too old" >&5 $as_echo_n "checking whether go version is too old... " >&6; } case $go_version in go1.012*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes - minimum version is 1.3" >&5 $as_echo "yes - minimum version is 1.3" >&6; } GO= GOOPT="-intgosize 32" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } case "$(go env GOARCH)" in amd64 | arm64 | ppc64*) GOOPT="-intgosize 64" ;; *) GOOPT="-intgosize 32" ;; esac ;; esac fi for ac_prog in gccgo 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_GCCGO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GCCGO"; then ac_cv_prog_GCCGO="$GCCGO" # 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_GCCGO="$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 GCCGO=$ac_cv_prog_GCCGO if test -n "$GCCGO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCCGO" >&5 $as_echo "$GCCGO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GCCGO" && break done if test -n "$GCCGO" ; then if $GCCGO --help 2>/dev/null | grep gccgo >/dev/null 2>&1 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gccgo version is too old" >&5 $as_echo_n "checking whether gccgo version is too old... " >&6; } go_version=`$GO $GOVERSIONOPTION | sed -n '1p' | sed -e 's/^.* \([0-9.]*\) *$/\1/' -e 's/[.]//g'` if test "x$go_version" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not determine gccgo version" >&5 $as_echo "could not determine gccgo version" >&6; } GCCGO= elif test "$go_version" -lt 470; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes - minimum version is 4.7.0" >&5 $as_echo "yes - minimum version is 4.7.0" >&6; } GCCGO= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$go_version" -lt 480; then GCCGOOPT="-intgosize 32" else # 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_void_p+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : else if test "$ac_cv_type_void_p" = 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_void_p=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 $as_echo "$ac_cv_sizeof_void_p" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_VOID_P $ac_cv_sizeof_void_p _ACEOF if test "$ac_cv_sizeof_void_p" = "8"; then GCCGOOPT="-intgosize 64" else GCCGOOPT="-intgosize 32" fi fi fi fi fi fi #---------------------------------------------------------------- # Look for D #---------------------------------------------------------------- # Check whether --with-d was given. if test "${with_d+set}" = set; then : withval=$with_d; with_d="$withval" else with_d="$alllang_default" fi # Check whether --with-d1-compiler was given. if test "${with_d1_compiler+set}" = set; then : withval=$with_d1_compiler; D1COMPILERBIN="$withval" else D1COMPILERBIN= fi # Check whether --with-d2-compiler was given. if test "${with_d2_compiler+set}" = set; then : withval=$with_d2_compiler; D2COMPILERBIN="$withval" else D2COMPILERBIN= fi # First, check for "--without-d" or "--with-d=no". if test x"${with_d}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling D" >&5 $as_echo "$as_me: Disabling D" >&6;} D1COMPILER= D2COMPILER= else old_ac_ext=$ac_ext ac_ext=d if test -z "$D1COMPILERBIN" ; then for ac_prog in dmd ldmd gdmd 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_D1COMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$D1COMPILER"; then ac_cv_prog_D1COMPILER="$D1COMPILER" # 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_D1COMPILER="$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 D1COMPILER=$ac_cv_prog_D1COMPILER if test -n "$D1COMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $D1COMPILER" >&5 $as_echo "$D1COMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$D1COMPILER" && break done if test -n "$D1COMPILER" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the D1/Tango compiler works" >&5 $as_echo_n "checking whether the D1/Tango compiler works... " >&6; } cat > conftest.$ac_ext <<_ACEOF import tango.io.Stdout; void main() { } _ACEOF rm -f conftest.$ac_objext if $D1COMPILER conftest.$ac_ext 2>&5 && test ! -s conftest.err && test -s conftest.$ac_objext; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } D1COMPILER= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else D1COMPILER="$D1COMPILERBIN" fi if test -z "$D2COMPILERBIN" ; then for ac_prog in dmd gdmd 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_D2COMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$D2COMPILER"; then ac_cv_prog_D2COMPILER="$D2COMPILER" # 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_D2COMPILER="$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 D2COMPILER=$ac_cv_prog_D2COMPILER if test -n "$D2COMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $D2COMPILER" >&5 $as_echo "$D2COMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$D2COMPILER" && break done if test -n "$D2COMPILER" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the D2 compiler works" >&5 $as_echo_n "checking whether the D2 compiler works... " >&6; } cat > conftest.$ac_ext <<_ACEOF import std.algorithm; void main() { } _ACEOF rm -f conftest.$ac_objext if $D2COMPILER conftest.$ac_ext 2>&5 && test ! -s conftest.err && test -s conftest.$ac_objext; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } D2COMPILER= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else D2COMPILER="$D2COMPILERBIN" fi ac_ext=$old_ac_ext fi if test -n "$D1COMPILER"; then DDEFAULTVERSION=1 elif test -n "$D2COMPILER"; then DDEFAULTVERSION=2 fi # Do not prefix library file names with "lib" on Windows. case $host in *-*-cygwin* | *-*-mingw*) DLIBPREFIX="";; *)DLIBPREFIX="lib";; esac #---------------------------------------------------------------- # Determine which languages to use for examples/test-suite #---------------------------------------------------------------- SKIP_TCL= if test -z "$TCLINCLUDE" || test -z "$TCLLIB" ; then SKIP_TCL="1" fi SKIP_PERL5= if test -z "$PERL" || test -z "$PERL5EXT" || test -z "$PERL5TESTMORE"; then SKIP_PERL5="1" fi SKIP_OCTAVE= if test -z "$OCTAVE" ; then SKIP_OCTAVE="1" fi SKIP_PYTHON= if (test -z "$PYINCLUDE" || test -z "$PYLINK") && (test -z "$PY3INCLUDE" || test -z "$PY3LINK") ; then SKIP_PYTHON="1" fi SKIP_PYTHON3= if test -z "$PY3INCLUDE" || test -z "$PY3LINK" ; then SKIP_PYTHON3="1" fi SKIP_JAVA= if test -z "$JAVA" || test -z "$JAVAC" || test -z "$JAVAINC" ; then SKIP_JAVA="1" fi SKIP_JAVASCRIPT= if test -z "$JAVASCRIPT" || ( test -z "$NODEJS" && test -z "$JSCENABLED" && test -z "$JSV8ENABLED" ) ; then SKIP_JAVASCRIPT="1" fi SKIP_GUILE= if test -z "$GUILE" || test -z "$GUILE_LIBS" ; then SKIP_GUILE="1" fi SKIP_MZSCHEME= if test -z "$MZC" || test -z "$MZDYNOBJ" ; then SKIP_MZSCHEME="1" fi SKIP_RUBY= if test -z "$RUBY" || test -z "$RUBYINCLUDE" || test -z "$RUBYLIB" ; then SKIP_RUBY="1" fi SKIP_PHP= if test -z "$PHP" || test -z "$PHPINC" ; then SKIP_PHP="1" fi SKIP_OCAML= if test -z "$OCAMLC" || test -z "$CAMLP4" ; then SKIP_OCAML="1" fi SKIP_CSHARP= if test -z "$CSHARPCOMPILER" ; then SKIP_CSHARP="1" else if test "cscc" = "$CSHARPCOMPILER" && test -z "$CSHARPCILINTERPRETER" ; then SKIP_CSHARP="1" fi fi SKIP_LUA= # we need LUABIN & dynamic loading if test -z "$LUABIN" || test -z "$LUADYNAMICLOADLIB"; then SKIP_LUA="1" fi SKIP_R= if test -z "$RBIN" ; then SKIP_R="1" fi SKIP_SCILAB= if test -z "$SCILAB"; then SKIP_SCILAB="1" fi SKIP_GO= if test -z "$GO" ; then SKIP_GO="1" fi SKIP_D= if test -z "$DDEFAULTVERSION" ; then SKIP_D="1" fi #---------------------------------------------------------------- # Additional language dependencies #---------------------------------------------------------------- SKIP_ANDROID= if test -z "$ANDROID" || test -z "$ADB" || test -z "$ANT" || test -z "$NDKBUILD" ; then SKIP_ANDROID="1" fi #---------------------------------------------------------------- # Miscellaneous #---------------------------------------------------------------- ABS_SRCDIR=`(cd ${srcdir} && pwd)` case $host in *-*-mingw* ) ABS_SRCDIR=`${srcdir}/Tools/convertpath -m $ABS_SRCDIR` ;; *-*-cygwin* ) ABS_SRCDIR=`cygpath --mixed $ABS_SRCDIR` ;; esac # Root directory ROOT_DIR=`pwd` case $host in *-*-cygwin*) # Translate path for native Windows compilers for use with 'make check' if (cygpath --mixed $ROOT_DIR) >/dev/null 2>/dev/null; then ROOT_DIR=`cygpath --mixed $ROOT_DIR` fi ;; esac case $host in *-*-cygwin* | *-*-mingw*) # Extra files generated by some Windows compilers EXTRA_CLEAN="*.stackdump *.exp *.lib *.pdb *.ilk" ;; esac # Configure SWIG_LIB path # Check whether --with-swiglibdir was given. if test "${with_swiglibdir+set}" = set; then : withval=$with_swiglibdir; swig_lib="$withval" else swig_lib="${datadir}/swig/${PACKAGE_VERSION}" fi SWIG_LIB_INSTALL=${swig_lib} prefix_NONE= exec_prefix_NONE= test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix eval ac_define_dir="\"$swig_lib\"" eval ac_define_dir="\"$ac_define_dir\"" SWIG_LIB="$ac_define_dir" cat >>confdefs.h <<_ACEOF #define SWIG_LIB "$ac_define_dir" _ACEOF test "$prefix_NONE" && prefix=NONE test "$exec_prefix_NONE" && exec_prefix=NONE case $build in # Windows does not understand unix directories. Convert into a windows directory with drive letter. *-*-mingw*) SWIG_LIB_WIN_UNIX=`${srcdir}/Tools/convertpath -m $SWIG_LIB`;; *-*-cygwin*) SWIG_LIB_WIN_UNIX=`cygpath --mixed "$SWIG_LIB"`;; *) SWIG_LIB_WIN_UNIX="";; esac cat >>confdefs.h <<_ACEOF #define SWIG_LIB_WIN_UNIX "$SWIG_LIB_WIN_UNIX" _ACEOF SWIG_LIB_PREINST=$ABS_SRCDIR/Lib SWIG_LIB_SET="env SWIG_LIB=\$(SWIG_LIB_DIR)" if test "${srcdir}" = "."; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _WIN32 yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : SWIG_LIB_SET="env SWIG_LIB=" fi rm -f conftest* fi ac_config_files="$ac_config_files Makefile swig.spec Examples/Makefile Examples/d/example.mk Examples/xml/Makefile Examples/test-suite/errors/Makefile Examples/test-suite/csharp/Makefile Examples/test-suite/d/Makefile Examples/test-suite/guile/Makefile Examples/test-suite/java/Makefile Examples/test-suite/javascript/Makefile Examples/test-suite/mzscheme/Makefile Examples/test-suite/ocaml/Makefile Examples/test-suite/octave/Makefile Examples/test-suite/perl5/Makefile Examples/test-suite/php/Makefile Examples/test-suite/python/Makefile Examples/test-suite/ruby/Makefile Examples/test-suite/scilab/Makefile Examples/test-suite/tcl/Makefile Examples/test-suite/lua/Makefile Examples/test-suite/r/Makefile Examples/test-suite/go/Makefile Source/Makefile Tools/javascript/Makefile" ac_config_files="$ac_config_files preinst-swig" ac_config_files="$ac_config_files CCache/ccache_swig_config.h" #-------------------------------------------------------------------- # Building Examples/ out of source directory #-------------------------------------------------------------------- # If building out of source tree, replicate Examples/ source tree in # build directory, and copy over Makefiles from source directory. # Prefix each Makefile with a header which sets SRCDIR to the relative # source directory, and provides a rule for updating the Makefile from # its original source. ac_config_commands="$ac_config_commands Examples" #-------------------------------------------------------------------- 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= 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 swig $as_me 4.0.2, 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="\\ swig config.status 4.0.2 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" _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 "Source/Include/swigconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS Source/Include/swigconfig.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "swig.spec") CONFIG_FILES="$CONFIG_FILES swig.spec" ;; "Examples/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/Makefile" ;; "Examples/d/example.mk") CONFIG_FILES="$CONFIG_FILES Examples/d/example.mk" ;; "Examples/xml/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/xml/Makefile" ;; "Examples/test-suite/errors/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/errors/Makefile" ;; "Examples/test-suite/csharp/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/csharp/Makefile" ;; "Examples/test-suite/d/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/d/Makefile" ;; "Examples/test-suite/guile/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/guile/Makefile" ;; "Examples/test-suite/java/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/java/Makefile" ;; "Examples/test-suite/javascript/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/javascript/Makefile" ;; "Examples/test-suite/mzscheme/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/mzscheme/Makefile" ;; "Examples/test-suite/ocaml/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/ocaml/Makefile" ;; "Examples/test-suite/octave/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/octave/Makefile" ;; "Examples/test-suite/perl5/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/perl5/Makefile" ;; "Examples/test-suite/php/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/php/Makefile" ;; "Examples/test-suite/python/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/python/Makefile" ;; "Examples/test-suite/ruby/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/ruby/Makefile" ;; "Examples/test-suite/scilab/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/scilab/Makefile" ;; "Examples/test-suite/tcl/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/tcl/Makefile" ;; "Examples/test-suite/lua/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/lua/Makefile" ;; "Examples/test-suite/r/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/r/Makefile" ;; "Examples/test-suite/go/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/go/Makefile" ;; "Source/Makefile") CONFIG_FILES="$CONFIG_FILES Source/Makefile" ;; "Tools/javascript/Makefile") CONFIG_FILES="$CONFIG_FILES Tools/javascript/Makefile" ;; "preinst-swig") CONFIG_FILES="$CONFIG_FILES preinst-swig" ;; "CCache/ccache_swig_config.h") CONFIG_FILES="$CONFIG_FILES CCache/ccache_swig_config.h" ;; "Examples") CONFIG_COMMANDS="$CONFIG_COMMANDS Examples" ;; *) 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"" || { # Older Autoconf 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"` # 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'`; 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 } ;; "preinst-swig":F) chmod +x preinst-swig ;; "Examples":C) if test "x${srcdir}" != "x." ; then { $as_echo "$as_me:${as_lineno-$LINENO}: generating Examples build tree" >&5 $as_echo "$as_me: generating Examples build tree" >&6;} for mkfile in `cd ${srcdir} && find Examples/ -type f -name Makefile`; do dir=`dirname ${mkfile}` d=${dir} reldir="" while test "x$d" != "x." ; do d=`dirname $d` reldir="${reldir}../" done relsrcdir=${reldir}${srcdir}/ as_dir=${dir}; as_fn_mkdir_p cat <${mkfile} # DO NOT EDIT: instead edit ${relsrcdir}${mkfile} # and run (cd ${reldir} && ./config.status) to regenerate TOP_BUILDDIR_TO_TOP_SRCDIR = ${srcdir}/ SRCDIR = ${relsrcdir}${dir}/ EOF cat ${srcdir}/${mkfile} >>${mkfile} done fi ;; 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 # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 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 cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done 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 langs="" test -n "$SKIP_CSHARP" || langs="${langs}csharp " test -n "$SKIP_D" || langs="${langs}d " test -n "$SKIP_GO" || langs="${langs}go " test -n "$SKIP_GUILE" || langs="${langs}guile " test -n "$SKIP_JAVA" || langs="${langs}java " test -n "$SKIP_JAVASCRIPT" || langs="${langs}javascript " test -n "$SKIP_LUA" || langs="${langs}lua " test -n "$SKIP_MZSCHEME" || langs="${langs}mzscheme " test -n "$SKIP_OCAML" || langs="${langs}ocaml " test -n "$SKIP_OCTAVE" || langs="${langs}octave " test -n "$SKIP_PERL5" || langs="${langs}perl5 " test -n "$SKIP_PHP" || langs="${langs}php " test -n "$SKIP_PYTHON" || langs="${langs}python " test -n "$SKIP_R" || langs="${langs}r " test -n "$SKIP_RUBY" || langs="${langs}ruby " test -n "$SKIP_SCILAB" || langs="${langs}scilab " test -n "$SKIP_TCL" || langs="${langs}tcl " echo " The SWIG test-suite and examples are configured for the following languages: $langs " swig-4.0.2/RELEASENOTES0000644000175000017500000004674213667507523014213 0ustar williamwilliamThis file contains a brief overview of the changes made in each release. A detailed description of changes are available in the CHANGES.current and CHANGES files. Release Notes ============= Detailed release notes are available with the release and are also published on the SWIG web site at http://swig.org/release.html. SWIG-4.0.2 summary: - A few fixes around doxygen comment handling. - Ruby 2.7 support added. - Various minor improvements to C#, D, Java, OCaml, Octave, Python, R, Ruby. - Considerable performance improvement running SWIG on large interface files. SWIG-4.0.1 summary: - SWIG now cleans up on error by removing all generated files. - Add Python 3.8 support. - Python Sphinx compatibility added for Doxygen comments. - Some minor regressions introduced in 4.0.0 were fixed. - Fix some C++17 compatibility problems in Python and Ruby generated code. - Minor improvements/fixes for C#, Java, Javascript, Lua, MzScheme, Ocaml, Octave and Python. SWIG-4.0.0 summary: - Support for Doxygen documentation comments which are parsed and converted into JavaDoc or PyDoc comments. - STL wrappers improved for C#, Java and Ruby. - C++11 STL containers added for Java, Python and Ruby. - Improved support for parsing C++11 and C++14 code. - Various fixes for shared_ptr. - Various C preprocessor corner case fixes. - Corner case fixes for member function pointers. - Python module overhaul by simplifying the generated code and turning most optimizations on by default. - %template improvements wrt scoping to align with C++ explicit template instantiations. - Added support for a command-line options file (sometimes called a response file). - Numerous enhancements and fixes for all supported target languages. - SWIG now classifies the status of target languages into either 'Experimental' or 'Supported' to indicate the expected maturity level. - Support for CFFI, Allegrocl, Chicken, CLISP, S-EXP, UFFI, Pike, Modula3 has been removed. - Octave 4.4-5.1 support added. - PHP5 support removed, PHP7 is now the supported PHP version. - Minimum Python version required is now 2.7, 3.2-3.7 are the only other versions supported. - Added support for Javascript NodeJS versions 2-10. - OCaml support is much improved and updated, minimum OCaml version required is now 3.12.0. SWIG-3.0.12 summary: - Add support for Octave-4.2. - Enhance %extend to support template functions. - Language specific enhancements and fixes for C#, D, Guile, Java, PHP7. SWIG-3.0.11 summary: - PHP 7 support added. - C++11 alias templates and type aliasing support added. - Minor fixes and enhancements for C# Go Guile Java Javascript Octave PHP Python R Ruby Scilab XML. SWIG-3.0.10 summary: - Regression fixes for smart pointers and importing Python modules. SWIG-3.0.9 summary: - Add support for Python's implicit namespace packages. - Fixes to support Go 1.6. - C++11 std::array support added for Java. - Improved C++ multiple inheritance support for Java/C# wrappers. - Various other minor fixes and improvements for C#, D, Go, Java, Javascript, Lua, Python, R, Ruby, Scilab. SWIG-3.0.8 summary: - pdf documentation enhancements. - Various Python 3.5 issues fixed. - std::array support added for Ruby and Python. - shared_ptr support added for Ruby. - Minor improvements for CFFI, Go, Java, Perl, Python, Ruby. SWIG-3.0.7 summary: - Add support for Octave-4.0.0. - Remove potential Android security exploit in generated Java classes. - Minor new features and bug fixes. SWIG-3.0.6 summary: - Stability and regression fixes. - Fixed parsing of C++ corner cases. - Language improvements and bug fixes for C#, Go, Java, Lua, Python, R. SWIG-3.0.5 summary: - Added support for Scilab. - Important Python regression fix when wrapping C++ default arguments. - Minor improvements for C#, Go, Octave, PHP and Python. SWIG-3.0.4 summary: - Python regression fix when wrapping C++ default arguments. - Improved error messages. SWIG-3.0.3 summary: - Add support for C++11 strongly typed enumerations. - Numerous bug fixes and minor enhancements for C#, D, Go, Java, Javascript, PHP, Perl and Python wrappers. SWIG-3.0.2 summary: - Bug fix during install and a couple of other minor changes. SWIG-3.0.1 summary: - Javascript module added. This supports JavascriptCore (Safari/Webkit), v8 (Chromium) and node.js currently. - A few notable regressions introduced in 3.0.0 have been fixed - in Lua, nested classes and parsing of operator <<. - The usual round of bug fixes and minor improvements for: C#, GCJ, Go, Java, Lua, PHP and Python. SWIG-3.0.0 summary: - This is a major new release focusing primarily on C++ improvements. - C++11 support added. Please see documentation for details of supported features: http://www.swig.org/Doc3.0/CPlusPlus11.html - Nested class support added. This has been taken full advantage of in Java and C#. Other languages can use the nested classes, but require further work for a more natural integration into the target language. We urge folk knowledgeable in the other target languages to step forward and help with this effort. - Lua: improved metatables and support for %nspace. - Go 1.3 support added. - Python import improvements including relative imports. - Python 3.3 support completed. - Perl director support added. - C# .NET 2 support is now the minimum. Generated using statements are replaced by fully qualified names. - Bug fixes and improvements to the following languages: C#, Go, Guile, Java, Lua, Perl, PHP, Python, Octave, R, Ruby, Tcl - Various other bug fixes and improvements affecting all languages. - Note that this release contains some backwards incompatible changes in some languages. - Full detailed release notes are in the changes file. SWIG-2.0.12 summary: - This is a maintenance release backporting some fixes from the pending 3.0.0 release. - Octave 3.8 support added. - C++11 support for new versions of erase/insert in the STL containers. - Compilation fixes on some systems for the generated Lua, PHP, Python and R wrappers. SWIG-2.0.11 summary: - Minor bug fixes and enhancements mostly in Python, but also C#, Lua, Ocaml, Octave, Perl, PHP, Python, R, Ruby, Tcl. SWIG-2.0.10 summary: - Ruby 1.9 support is now complete. - Add support for Guile 2.0 and Guile 1.6 support (GH interface) has been dropped. - Various small language neutral improvements and fixes. - Various bug fixes and minor improvements specific to C#, CFFI, D, Java, Octave, PHP, Python, - Minor bug fix in ccache-swig. - Development has moved to Github with Travis continuous integration testing - patches using https://github.com/swig/swig are welcome. SWIG-2.0.9 summary: - Improved typemap matching. - Ruby 1.9 support is much improved. - Various bug fixes and minor improvements in C#, CFFI, Go, Java, Modula3, Octave, Perl, Python, R, Ruby, Tcl and in ccache-swig. SWIG-2.0.8 summary: - Fix a couple of regressions introduced in 2.0.5 and 2.0.7. - Improved using declarations and using directives support. - Minor fixes/enhancements for C#, Java, Octave, Perl and Python. SWIG-2.0.7 summary: - Important regression fixes since 2.0.5 for typemaps in general and in Python. - Fixes and enhancements for Go, Java, Octave and PHP. SWIG-2.0.6 summary: - Regression fix for Python STL wrappers on some systems. SWIG-2.0.5 summary: - Official Android support added including documentation and examples. - Improvements involving templates: 1) Various fixes with templates and typedef types. 2) Some template lookup problems fixed. 3) Templated type fixes to use correct typemaps. - Autodoc documentation generation improvements. - Python STL container wrappers improvements including addition of stepped slicing. - Approximately 70 fixes and minor enhancements for the following target languages: AllegroCL, C#, D, Go, Java, Lua, Ocaml, Octave, Perl, PHP, Python, R, Ruby, Tcl, Xml. SWIG-2.0.4 summary: - This is mainly a Python oriented release including support for Python built-in types for superior performance with the new -builtin option. The -builtin option is especially suitable for performance-critical libraries and applications that call wrapped methods repeatedly. See the python-specific chapter of the SWIG manual for more info. - Python 3.2 support has also been added and various Python bugs have been fixed. - Octave 3.4 support has also been added. - There are also the usual minor generic improvements, as well as bug fixes and enhancements for D, Guile, Lua, Octave, Perl and Tcl. SWIG-2.0.3 summary: - A bug fix release including a couple of fixes for regressions in the 2.0 series. SWIG-2.0.2 summary: - Support for the D language has been added. - Various bug fixes and minor enhancements. - Bug fixes particular to the Clisp, C#, Go, MzScheme, Ocaml, PHP, R, Ruby target languages. SWIG-2.0.1 summary: - Support for the Go language has been added. - New regular expression (regex) encoder for renaming symbols based on the Perl Compatible Regular Expressions (PCRE) library. - Numerous fixes in reporting file and line numbers in error and warning messages. - Various bug fixes and improvements in the C#, Lua, Perl, PHP, Ruby and Python language modules. SWIG-2.0.0 summary: - License changes, see LICENSE file and http://www.swig.org/legal.html. - Much better nested class/struct support. - Much improved template partial specialization and explicit specialization handling. - Namespace support improved with the 'nspace' feature where namespaces can be automatically translated into Java packages or C# namespaces. - Improved typemap and symbol table debugging. - Numerous subtle typemap matching rule changes when using the default (SWIGTYPE) type. These now work much like C++ class template partial specialization matching. - Other small enhancements for typemaps. Typemap fragments are also now official and documented. - Warning and error display refinements. - Wrapping of shared_ptr is improved and documented now. - Numerous C++ unary scope operator (::) fixes. - Better support for boolean expressions. - Various bug fixes and improvements in the Allegrocl, C#, Java, Lua, Octave, PHP, Python, R, Ruby and XML modules. SWIG-1.3.40 summary: - SWIG now supports directors for PHP. - PHP support improved in general. - Octave 3.2 support added. - Various bug fixes/enhancements for Allegrocl, C#, Java, Octave, Perl, Python, Ruby and Tcl. - Other generic fixes and minor new features. SWIG-1.3.39 summary: - Some new small feature enhancements. - Improved C# std::vector wrappers. - Bug fixes: mainly Python, but also Perl, MzScheme, CFFI, Allegrocl and Ruby SWIG-1.3.38 summary: - Output directory regression fix and other minor bug fixes SWIG-1.3.37 summary: - Python 3 support added - SWIG now ships with a version of ccache that can be used with SWIG. This enables the files generated by SWIG to be cached so that repeated use of SWIG on unchanged input files speeds up builds quite considerably. - PHP 4 support removed and PHP support improved in general - Improved C# array support - Numerous Allegro CL improvements - Bug fixes/enhancements for Python, PHP, Java, C#, Chicken, Allegro CL, CFFI, Ruby, Tcl, Perl, R, Lua. - Other minor generic bug fixes and enhancements SWIG-1.3.36 summary: - Enhancement to directors to wrap all protected members - Optimisation feature for objects returned by value - A few bugs fixes in the PHP, Java, Ruby, R, C#, Python, Lua and Perl modules - Other minor generic bug fixes SWIG-1.3.35 summary: - Octave language module added - Bug fixes in Python, Lua, Java, C#, Perl modules - A few other generic bugs and runtime assertions fixed SWIG-1.3.34 summary: - shared_ptr support for Python - Support for latest R - version 2.6 - Various minor improvements/bug fixes for R, Lua, Python, Java, C# - A few other generic bug fixes, mainly for templates and using statements SWIG-1.3.33 summary: - Fix regression for Perl where C++ wrappers would not compile - Fix regression parsing macros SWIG-1.3.32 summary: - shared_ptr support for Java and C# - Enhanced STL support for Ruby - Windows support for R - Fixed long-standing memory leak in PHP Module - Numerous fixes and minor enhancements for Allegrocl, C#, cffi, Chicken, Guile, Java, Lua, Ocaml, Perl, PHP, Python, Ruby, Tcl. - Improved warning support SWIG-1.3.31 summary: - Python modern classes regression fix SWIG-1.3.30 summary: - Python-2.5 support - New language module: R - Director support added for C# - Numerous director fixes and improvements - Improved mingw/msys support - Better constants support in Guile and chicken modules - Support for generating PHP5 class wrappers - Important Java premature garbage collection fix - Minor improvements/fixes in cffi, php, allegrocl, perl, chicken, lua, ruby, ocaml, python, java, c# and guile language modules - Many many other bug fixes SWIG-1.3.29 summary: - Numerous important bug fixes - Few minor new features - Some performance improvements in generated code for Python SWIG-1.3.28 summary: - More powerful renaming (%rename) capability. - More user friendly warning handling. - Add finer control for default constructors and destructors. We discourage the use of the 'nodefault' option, which disables both constructors and destructors, leading to possible memory leaks. Use instead 'nodefaultctor' and/or 'nodefaultdtor'. - Automatic copy constructor wrapper generation via the 'copyctor' option/feature. - Better handling of Windows extensions and types. - Better runtime error reporting. - Add the %catches directive to catch and dispatch exceptions. - Add the %naturalvar directive for more 'natural' variable wrapping. - Better default handling of std::string variables using the %naturalvar directive. - Add the %allowexcept and %exceptionvar directives to handle exceptions when accessing a variable. - Add the %delobject directive to mark methods that act like destructors. - Add the -fastdispatch option to enable smaller and faster overload dispatch mechanism. - Template support for %rename, %feature and %typemap improved. - Add/doc more debug options, such as -dump_module, -debug_typemaps, etc. - Unified typemap library (UTL) potentially providing core typemaps for all scripting languages based on the recently evolving Python typemaps. - New language module: Common Lisp with CFFI. - Python, Ruby, Perl and Tcl use the new UTL, many old reported and hidden errors with typemaps are now fixed. - Initial Java support for languages using the UTL via GCJ, you can now use Java libraries in your favorite script language using gcj + swig. - Tcl support for std::wstring. - PHP4 module update, many error fixes and actively maintained again. - Allegrocl support for C++, also enhanced C support. - Ruby support for bang methods. - Ruby support for user classes as native exceptions. - Perl improved dispatching in overloaded functions via the new cast and rank mechanism. - Perl improved backward compatibility, 5.004 and later tested and working. - Python improved backward compatibility, 1.5.2 and later tested and working. - Python can use the same cast/rank mechanism via the -castmode option. - Python implicit conversion mechanism similar to C++, via the %implicitconv directive (replaces and improves the implicit.i library). - Python threading support added. - Python STL support improved, iterators are supported and STL containers can use now the native PyObject type. - Python many performance options and improvements, try the -O option to test all of them. Python runtime benchmarks show up to 20 times better performance compared to 1.3.27 and older versions. - Python support for 'multi-inheritance' on the python side. - Python simplified proxy classes, now swig doesn't need to generate the additional 'ClassPtr' classes. - Python extended support for smart pointers. - Python better support for static member variables. - Python backward compatibility improved, many projects that used to work only with swig-1.3.21 to swig-1.3.24 are working again with swig-1.3.28 - Python test-suite is now 'valgrinded' before release, and swig also reports memory leaks due to missing destructors. - Minor bug fixes and improvements to the Lua, Ruby, Java, C#, Python, Guile, Chicken, Tcl and Perl modules. SWIG-1.3.27 summary: - Fix bug in anonymous typedef structures which was leading to strange behaviour SWIG-1.3.26 summary: - New language modules: Lua, CLISP and Common Lisp with UFFI. - Big overhaul to the PHP module. - Change to the way 'extern' is handled. - Minor bug fixes specific to C#, Java, Modula3, Ocaml, Allegro CL, XML, Lisp s-expressions, Tcl, Ruby and Python modules. - Other minor improvements and bug fixes. SWIG-1.3.25 summary: - Improved runtime type system. Speed of module loading improved in modules with lots of types. SWIG_RUNTIME_VERSION has been increased from 1 to 2, but the API is exactly the same; only internal changes were made. - The languages that use the runtime type system now support external access to the runtime type system. - Various improvements with typemaps and template handling. - Fewer warnings in generated code. - Improved colour documentation. - Many C# module improvements (exception handling, prevention of early garbage collection, C# attributes support added, more flexible type marshalling/asymmetric types.) - Minor improvements and bug fixes specific to the C#, Java, TCL, Guile, Chicken, MzScheme, Perl, Php, Python, Ruby and Ocaml modules). - Various other bug fixes and memory leak fixes. SWIG-1.3.24 summary: - Improved enum handling - More runtime library options - More bugs fixes for templates and template default arguments, directors and other areas. - Better smart pointer support, including data members, static members and %extend. SWIG-1.3.23 summary: - Improved support for callbacks - Python docstring support and better error handling - C++ default argument support for Java and C# added. - Improved c++ default argument support for the scripting languages plus option to use original (compact) default arguments. - %feature and %ignore/%rename bug fixes and mods - they might need default arguments specified to maintain compatible behaviour when using the new default arguments wrapping. - Runtime library changes: Runtime code can now exist in more than one module and so need not be compiled into just one module - Further improved support for templates and namespaces - Overloaded templated function support added - More powerful default typemaps (mixed default typemaps) - Some important %extend and director code bug fixes - Guile now defaults to using SCM API. The old interface can be obtained by the -gh option. - Various minor improvements and bug fixes for C#, Chicken, Guile, Java, MzScheme, Perl, Python and Ruby - Improved dependencies generation for constructing Makefiles. SWIG-1.3.22 summary: - Improved exception handling and translation of C errors or C++ exceptions into target language exceptions. - Improved enum support, mapping to built-in Java 1.5 enums and C# enums or the typesafe enum pattern for these two languages. - Python - much better STL support and support for std::wstring, wchar_t and FILE *. - Initial support for Modula3 and Allegro CL. - 64 bit TCL support. - Java and C#'s proxy classes are now nearly 100% generated from typemaps and/or features for finer control on the generated code. - SWIG runtime library support deprecation. - Improved documentation. SWIG now additionally provides documentation in the form of a single HTML page as well as a pdf document. - Enhanced C++ friend declaration support. - Better support for reference counted classes. - Various %fragment improvements. - RPM fixes. - Various minor improvements and bug fixes for C#, Chicken, Guile, Java, MzScheme, Perl, Php, Python, Ruby and XML. swig-4.0.2/Lib/0000755000175000017500000000000013667507562013073 5ustar williamwilliamswig-4.0.2/Lib/windows.i0000644000175000017500000001012513667507523014733 0ustar williamwilliam/* ----------------------------------------------------------------------------- * windows.i * * SWIG library file to support types found in windows.h as well as Microsoft * integral type extensions. The types are set for 32 bit Windows. * ----------------------------------------------------------------------------- */ // Support for non ISO (Windows) integral types %apply unsigned char { unsigned __int8 }; %apply const unsigned char& { const unsigned __int8& }; %apply signed char { __int8 }; %apply const signed char& { const __int8& }; %apply unsigned short { unsigned __int16 }; %apply const unsigned short& { const unsigned __int16& }; %apply short { __int16 }; %apply const short& { const __int16& }; %apply unsigned int { unsigned __int32 }; %apply const unsigned int& { const unsigned __int32& }; %apply int { __int32 }; %apply const int& { const __int32& }; %apply unsigned long long { unsigned __int64 }; %apply const unsigned long long& { const unsigned __int64& }; %apply long long { __int64 }; %apply const long long& { const __int64& }; // Workaround Microsoft calling conventions #define __cdecl #define __fastcall #define __far #define __forceinline #define __fortran #define __inline #define __pascal #define __stdcall #define __syscall #define _cdecl #define _fastcall #define _inline #define _pascal #define _stdcall #define WINAPI #define __declspec(WINDOWS_EXTENDED_ATTRIBUTE) #define __w64 // Types from windef.h typedef unsigned long ULONG; typedef ULONG *PULONG; typedef unsigned short USHORT; typedef USHORT *PUSHORT; typedef unsigned char UCHAR; typedef UCHAR *PUCHAR; typedef char *PSZ; typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; typedef float FLOAT; typedef FLOAT *PFLOAT; typedef BOOL *PBOOL; typedef BOOL *LPBOOL; typedef BYTE *PBYTE; typedef BYTE *LPBYTE; typedef int *PINT; typedef int *LPINT; typedef WORD *PWORD; typedef WORD *LPWORD; typedef long *LPLONG; typedef DWORD *PDWORD; typedef DWORD *LPDWORD; typedef void *LPVOID; typedef const void *LPCVOID; typedef int INT; typedef unsigned int UINT; typedef unsigned int *PUINT; // Types from basetsd.h typedef signed char INT8, *PINT8; typedef signed short INT16, *PINT16; typedef signed int INT32, *PINT32; typedef signed __int64 INT64, *PINT64; typedef unsigned char UINT8, *PUINT8; typedef unsigned short UINT16, *PUINT16; typedef unsigned int UINT32, *PUINT32; typedef unsigned __int64 UINT64, *PUINT64; typedef signed int LONG32, *PLONG32; typedef unsigned int ULONG32, *PULONG32; typedef unsigned int DWORD32, *PDWORD32; typedef __w64 int INT_PTR, *PINT_PTR; typedef __w64 unsigned int UINT_PTR, *PUINT_PTR; typedef __w64 long LONG_PTR, *PLONG_PTR; typedef __w64 unsigned long ULONG_PTR, *PULONG_PTR; typedef unsigned short UHALF_PTR, *PUHALF_PTR; typedef short HALF_PTR, *PHALF_PTR; typedef __w64 long SHANDLE_PTR; typedef __w64 unsigned long HANDLE_PTR; typedef ULONG_PTR SIZE_T, *PSIZE_T; typedef LONG_PTR SSIZE_T, *PSSIZE_T; typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; typedef __int64 LONG64, *PLONG64; typedef unsigned __int64 ULONG64, *PULONG64; typedef unsigned __int64 DWORD64, *PDWORD64; // Types from winnt.h typedef void *PVOID; typedef void *PVOID64; #ifndef VOID #define VOID void #endif typedef char CHAR; typedef short SHORT; typedef long LONG; typedef CHAR *PCHAR; typedef CHAR *LPCH, *PCH; typedef const CHAR *LPCCH, *PCCH; typedef CHAR *NPSTR; typedef CHAR *LPSTR, *PSTR; typedef const CHAR *LPCSTR, *PCSTR; typedef char TCHAR, *PTCHAR; typedef unsigned char TBYTE , *PTBYTE ; typedef LPSTR LPTCH, PTCH; typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR; typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR; typedef SHORT *PSHORT; typedef LONG *PLONG; typedef void *HANDLE; typedef HANDLE *PHANDLE; typedef BYTE FCHAR; typedef WORD FSHORT; typedef DWORD FLONG; typedef LONG HRESULT; typedef char CCHAR; typedef DWORD LCID; typedef PDWORD PLCID; typedef WORD LANGID; typedef __int64 LONGLONG; typedef unsigned __int64 ULONGLONG; typedef LONGLONG *PLONGLONG; typedef ULONGLONG *PULONGLONG; typedef ULONGLONG DWORDLONG; typedef DWORDLONG *PDWORDLONG; typedef BYTE BOOLEAN; typedef BOOLEAN *PBOOLEAN; swig-4.0.2/Lib/pike/0000755000175000017500000000000013667507523014020 5ustar williamwilliamswig-4.0.2/Lib/pike/pikekw.swg0000644000175000017500000000152113667507523016033 0ustar williamwilliam#ifndef PIKE_PIKEKW_SWG_ #define PIKE_PIKEKW_SWG_ /* Warnings for Pike keywords */ #define PIKEKW(x) %namewarn("314: '" #x "' is a pike keyword") #x /* from http://www.http://docs.linux.cz/pike/tutorial_C.html */ PIKEKW(array); PIKEKW(break); PIKEKW(case); PIKEKW(catch); PIKEKW(continue); PIKEKW(default); PIKEKW(do); PIKEKW(else); PIKEKW(float); PIKEKW(for); PIKEKW(foreach); PIKEKW(function); PIKEKW(gauge); PIKEKW(if); PIKEKW(inherit); PIKEKW(inline); PIKEKW(int); PIKEKW(lambda); PIKEKW(mapping); PIKEKW(mixed); PIKEKW(multiset); PIKEKW(nomask); PIKEKW(object); PIKEKW(predef); PIKEKW(private); PIKEKW(program); PIKEKW(protected); PIKEKW(public); PIKEKW(return); PIKEKW(sscanf); PIKEKW(static); PIKEKW(string); PIKEKW(switch); PIKEKW(typeof); PIKEKW(varargs); PIKEKW(void); PIKEKW(while); #undef PIKEKW #endif //PIKE_PIKEKW_SWG_ swig-4.0.2/Lib/pike/pike.swg0000644000175000017500000002271713667507523015503 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pike.swg * * Pike configuration module. * ----------------------------------------------------------------------------- */ %insert(runtime) "swigrun.swg"; // Common C API type-checking code %insert(runtime) "pikerun.swg"; // Pike run-time code %insert(runtime) %{ #ifdef __cplusplus extern "C" { #endif #include #include #include #ifdef __cplusplus } #endif %} /* ----------------------------------------------------------------------------- * standard typemaps * ----------------------------------------------------------------------------- */ /* --- Input arguments --- */ /* Primitive datatypes. */ %typemap(in, pikedesc="tInt") int, unsigned int, short, unsigned short, long, unsigned long, char, signed char, unsigned char, bool, enum SWIGTYPE, long long, unsigned long long { if ($input.type != T_INT) Pike_error("Bad argument: Expected an integer.\n"); $1 = ($1_ltype) $input.u.integer; } %typemap(in, pikedesc="tFloat") float, double { if ($input.type != T_FLOAT) Pike_error("Bad argument: Expected a float.\n"); $1 = ($1_ltype) $input.u.float_number; } %typemap(in, pikedesc="tStr") char *, char [ANY] { if ($input.type != T_STRING) Pike_error("Bad argument: Expected a string.\n"); $1 = ($1_ltype) STR0($input.u.string); } /* Pointers, references and arrays */ %typemap(in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "SWIG_ConvertPtr($input.u.object, (void **) &$1, $1_descriptor, 1);" /* Void pointer. Accepts any kind of pointer */ %typemap(in) void * "/* FIXME */"; /* Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_ltype argp) "/* FIXME */"; /* Pointer to a class member */ %typemap(in) SWIGTYPE (CLASS::*) "/* FIXME */"; /* Const primitive references. Passed by value */ %typemap(in, pikedesc="tInt") const int & (int temp), const short & (short temp), const long & (long temp), const unsigned int & (unsigned int temp), const unsigned short & (unsigned short temp), const unsigned long & (unsigned long temp), const char & (char temp), const signed char & (signed char temp), const unsigned char & (unsigned char temp), const bool & (bool temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const enum SWIGTYPE & ($*1_ltype temp), const enum SWIGTYPE && ($*1_ltype temp) { if ($input.type != T_INT) Pike_error("Bad argument: Expected an integer.\n"); temp = ($*1_ltype) $input.u.integer; $1 = &temp; } %typemap(in, pikedesc="tFloat") const float & (float temp), const double & (double temp) { if ($input.type != T_FLOAT) Pike_error("Bad argument: Expected a float.\n"); temp = ($*1_ltype) $input.u.float_number; $1 = &temp; } /* ----------------------------------------------------------------------------- * Output Typemaps * ----------------------------------------------------------------------------- */ %typemap(out, pikedesc="tInt") int, unsigned int, short, unsigned short, long, unsigned long, char, signed char, unsigned char, bool, enum SWIGTYPE "push_int($1);"; %typemap(out, pikedesc="tInt") long long "push_int64($1);"; %typemap(out, pikedesc="tInt") unsigned long long "push_int64($1);"; %typemap(out, pikedesc="tFloat") float, double "push_float($1);"; %typemap(out, pikedesc="tStr") char * "push_text($1);"; /* Pointers, references, and arrays */ %typemap(out, pikedesc="tObj") SWIGTYPE*, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "push_object(SWIG_NewPointerObj((void *) $1, $1_descriptor, $owner));"; /* Void return value; don't push anything */ %typemap(out, pikedesc="tVoid") void ""; /* Dynamic casts */ %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC "/* FIXME */"; /* Member pointer */ %typemap(out) SWIGTYPE (CLASS::*) "/* FIXME */"; /* Special typemap for character array return values */ %typemap(out, pikedesc="tStr") char [ANY], const char [ANY] "push_text($1);"; /* Primitive types--return by value */ %typemap(out, pikedesc="tObj") SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype((const $1_ltype &) $1); push_object(SWIG_NewPointerObj((void *) resultptr, $&1_descriptor, 1)); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); push_object(SWIG_NewPointerObj((void *) resultptr, $&1_descriptor, 1)); } #endif /* References to primitive types. Return by value */ %typemap(out, pikedesc="tInt") const int &, const unsigned int &, const short &, const unsigned short &, const long &, const unsigned long &, const char &, const signed char &, const unsigned char &, const bool &, const long long &, const unsigned long long &, const enum SWIGTYPE & ($*1_ltype temp), const enum SWIGTYPE && ($*1_ltype temp) "push_int(*($1));"; %typemap(out, pikedesc="tFloat") const float &, const double & "push_float(*($1));"; /************************ Constant Typemaps *****************************/ %typemap(constant) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, bool, enum SWIGTYPE, long long, unsigned long long "add_integer_constant(\"$symname\", $1, 0);"; %typemap(constant) char "add_integer_constant(\"$symname\", '$1', 0);"; %typemap(constant) long long, unsigned long long "add_integer_constant(\"$symname\", $1, 0);"; %typemap(constant) float, double "add_float_constant(\"$symname\", $1, 0);"; %typemap(constant) char * "add_string_constant(\"$symname\", \"$1\", 0);"; /* ------------------------------------------------------------ * String & length * ------------------------------------------------------------ */ %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { if ($input.type != T_STRING) Pike_error("Bad argument: Expected a string.\n"); $1 = ($1_ltype) STR0($input.u.string); $2 = ($2_ltype) $input.u.string->length; } /* ------------------------------------------------------------ * ANSI C typemaps * ------------------------------------------------------------ */ %typemap(in, pikedesc="tInt") size_t { if ($input.type != T_INT) Pike_error("Bad argument: Expected an integer.\n"); $1 = ($1_ltype) $input.u.integer; } %typemap(out) size_t = long; /* ------------------------------------------------------------ * Typechecking rules * ------------------------------------------------------------ */ %typecheck(SWIG_TYPECHECK_INTEGER) int, short, long, unsigned int, unsigned short, unsigned long, signed char, unsigned char, long long, unsigned long long, const int &, const short &, const long &, const unsigned int &, const unsigned short &, const unsigned long &, const long long &, const unsigned long long &, enum SWIGTYPE, enum SWIGTYPE &, SWIGTYPE &&, bool, const bool & { $1 = ($input.type == T_INT) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_DOUBLE) float, double, const float &, const double & { $1 = (($input.type == T_FLOAT) || ($input.type == T_INT)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = ($input.type == T_INT) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = ($input.type == T_STRING) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { void *ptr; if (SWIG_ConvertPtr($input.u.object, (void **) &ptr, $1_descriptor, 0) == -1) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; if (SWIG_ConvertPtr($input.u.object, (void **) &ptr, $&1_descriptor, 0) == -1) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; if (SWIG_ConvertPtr($input.u.object, (void **) &ptr, 0, 0) == -1) { $1 = 0; } else { $1 = 1; } } /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus %rename("`+") *::operator+; %rename("`-") *::operator-; %rename("`*") *::operator*; %rename("`/") *::operator/; %rename("`%") *::operator%; %rename("`<<") *::operator<<; %rename("`>>") *::operator>>; %rename("`&") *::operator&; %rename("`|") *::operator|; %rename("`^") *::operator^; %rename("`~") *::operator~; %rename("`<") *::operator<; %rename("`>") *::operator>; %rename("`==") *::operator==; /* Special cases */ %rename("`()") *::operator(); #endif /* ------------------------------------------------------------ * The start of the Pike initialization function * ------------------------------------------------------------ */ %init "swiginit.swg" %init %{ #ifdef __cplusplus extern "C" #endif PIKE_MODULE_EXIT {} #ifdef __cplusplus extern "C" #endif PIKE_MODULE_INIT { struct program *pr; SWIG_InitializeModule(0); %} /* pike keywords */ %include swig-4.0.2/Lib/pike/pikerun.swg0000644000175000017500000000403713667507523016223 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pikerun.swg * * This file contains the runtime support for Pike modules * and includes code for managing global variables and pointer * type checking. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #include "pike/object.h" #include "pike/program.h" #ifdef __cplusplus } #endif #include /* Stores information about a wrapped object */ typedef struct swig_object_wrapper { void *self; swig_type_info *type; } swig_object_wrapper; #ifdef THIS #undef THIS #endif #define THIS (((swig_object_wrapper *) Pike_fp->current_storage)->self) #define SWIG_ConvertPtr SWIG_Pike_ConvertPtr #define SWIG_NewPointerObj SWIG_Pike_NewPointerObj #define SWIG_GetModule(clientdata) SWIG_Pike_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Pike_SetModule(pointer) /* These need to be filled in before type sharing between modules will work */ static swig_module_info *SWIG_Pike_GetModule(void *SWIGUNUSEDPARM(clientdata)) { return 0; } static void SWIG_Pike_SetModule(swig_module_info *pointer) { } /* Convert a pointer value */ static int SWIG_Pike_ConvertPtr(struct object *obj, void **ptr, swig_type_info *ty, int flags) { struct program *pr; swig_cast_info *tc; swig_object_wrapper *obj_wrapper; if (ty) { pr = (struct program *) ty->clientdata; obj_wrapper = (swig_object_wrapper *) get_storage(obj, pr); if (obj_wrapper && obj_wrapper->type) { tc = SWIG_TypeCheckStruct(obj_wrapper->type, ty); if (tc) { int newmemory = 0; *ptr = SWIG_TypeCast(tc, obj_wrapper->self, &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return 0; } } } return -1; } /* Create a new pointer object */ static struct object * SWIG_Pike_NewPointerObj(void *ptr, swig_type_info *type, int own) { return 0; } swig-4.0.2/Lib/pike/std_string.i0000644000175000017500000000310713667507523016353 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; class string; /* Overloading check */ %typemap(typecheck) string = char *; %typemap(typecheck) const string & = char *; %typemap(in, pikedesc="tStr") string { if ($input.type != T_STRING) Pike_error("Bad argument: Expected a string.\n"); $1.assign(STR0($input.u.string)); } %typemap(in, pikedesc="tStr") const string & ($*1_ltype temp) { if ($input.type != T_STRING) Pike_error("Bad argument: Expected a string.\n"); temp.assign(STR0($input.u.string)); $1 = &temp; } %typemap(out, pikedesc="tStr") string "push_text($1.c_str());"; %typemap(out, pikedesc="tStr") const string & "push_text($1->c_str());"; %typemap(directorin) string, const string &, string & "$1.c_str()"; %typemap(directorin) string *, const string * "$1->c_str()"; %typemap(directorout) string { if ($input.type == T_STRING) $result.assign(STR0($input.u.string)); else throw Swig::DirectorTypeMismatchException("string expected"); } %typemap(directorout) const string & ($*1_ltype temp) { if ($input.type == T_STRING) { temp.assign(STR0($input.u.string)); $result = &temp; } else { throw Swig::DirectorTypeMismatchException("string expected"); } } } swig-4.0.2/Lib/swiglabels.swg0000644000175000017500000000733013667507523015751 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIG_MSC_UNSUPPRESS_4505 # if defined(_MSC_VER) # pragma warning(disable : 4505) /* unreferenced local function has been removed */ # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if defined(__GNUC__) # if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif /* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */ #if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES) # define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 #endif /* Intel's compiler complains if a variable which was never initialised is * cast to void, which is a common idiom which we use to indicate that we * are aware a variable isn't used. So we just silence that warning. * See: https://github.com/swig/swig/issues/192 for more discussion. */ #ifdef __INTEL_COMPILER # pragma warning disable 592 #endif swig-4.0.2/Lib/php/0000755000175000017500000000000013667507523013657 5ustar williamwilliamswig-4.0.2/Lib/php/std_deque.i0000644000175000017500000000003413667507523016003 0ustar williamwilliam%include swig-4.0.2/Lib/php/phpkw.swg0000644000175000017500000005303313667507523015536 0ustar williamwilliam/* ----------------------------------------------------------------------------- * phpkw.swg * ----------------------------------------------------------------------------- */ /* Keyword (case insensitive) */ #define PHPKW(x) %keywordwarn("'" `x` "' is a PHP keyword, renaming to 'c_" `x` "'",sourcefmt="%(lower)s",rename="c_%s") `x` /* Class (case insensitive) */ #define PHPCN(x) %keywordwarn("'" `x` "' is a PHP reserved class name, renaming to 'c_" `x` "'",%$isclass,sourcefmt="%(lower)s",rename="c_%s") `x` /* Constant (case insensitive) */ #define PHPBN1a(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "enum conflicts with a built-in constant '"`x`"' in PHP"),%$isenumitem,sourcefmt="%(lower)s") `x` #define PHPBN1b(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "constant conflicts with a built-in constant '"`x`"' in PHP"),%$isconstant,sourcefmt="%(lower)s") `x` %define PHPBN1(X) PHPBN1a(X); PHPBN1b(X) %enddef /* Constant (case sensitive) */ #define PHPBN2a(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "enum conflicts with a built-in constant '"`x`"' in PHP"),%$isenumitem) `x` #define PHPBN2b(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "constant conflicts with a built-in constant '"`x`"' in PHP"),%$isconstant) `x` %define PHPBN2(X) PHPBN2a(X); PHPBN2b(X) %enddef #define PHPFN(x) %keywordwarn("'" `x` "' is a PHP built-in function, renaming to 'c_" `x` "'",sourcefmt="%(lower)s",%$isfunction,%$not %$ismember,rename="c_%s") `x` /* From: http://php.net/manual/en/reserved.keywords.php * "You cannot use any of the following words as constants, class names, * function or method names. Using them as variable names is generally OK, but * could lead to confusion." */ /* Check is case insensitive - these *MUST* be listed in lower case here */ PHPKW(abstract); PHPKW(and); PHPKW(as); PHPKW(break); PHPKW(callable); PHPKW(case); PHPKW(catch); PHPKW(class); PHPKW(clone); PHPKW(const); PHPKW(continue); PHPKW(declare); PHPKW(default); PHPKW(do); PHPKW(else); PHPKW(elseif); PHPKW(enddeclare); PHPKW(endfor); PHPKW(endforeach); PHPKW(endif); PHPKW(endswitch); PHPKW(endwhile); PHPKW(extends); PHPKW(final); PHPKW(finally); PHPKW(for); PHPKW(foreach); PHPKW(function); PHPKW(global); PHPKW(goto); PHPKW(if); PHPKW(implements); PHPKW(instanceof); PHPKW(insteadof); PHPKW(interface); PHPKW(namespace); PHPKW(new); PHPKW(or); PHPKW(private); PHPKW(protected); PHPKW(public); PHPKW(static); PHPKW(switch); PHPKW(throw); PHPKW(trait); PHPKW(try); PHPKW(use); PHPKW(var); PHPKW(while); PHPKW(xor); PHPKW(yield); // Compile-time "magic" constants // From: http://php.net/manual/en/reserved.keywords.php // also at: http://php.net/manual/en/language.constants.predefined.php /* These *MUST* be listed in lower case here */ PHPKW(__class__); PHPKW(__dir__); PHPKW(__file__); PHPKW(__function__); PHPKW(__line__); PHPKW(__method__); PHPKW(__namespace__); PHPKW(__trait__); /* We classify these as built-in names since they conflict, but PHP still runs */ /* Predefined case-insensitive constants */ /* These *MUST* be listed in lower case here */ PHPBN1(null); PHPBN1(true); PHPBN1(false); /* "Core Predefined Constants" from http://php.net/manual/en/reserved.constants.php */ /* These are case sensitive */ PHPBN2(PHP_VERSION); PHPBN2(PHP_MAJOR_VERSION); PHPBN2(PHP_MINOR_VERSION); PHPBN2(PHP_RELEASE_VERSION); PHPBN2(PHP_VERSION_ID); PHPBN2(PHP_EXTRA_VERSION); PHPBN2(PHP_ZTS); PHPBN2(PHP_DEBUG); PHPBN2(PHP_MAXPATHLEN); PHPBN2(PHP_OS); PHPBN2(PHP_SAPI); PHPBN2(PHP_EOL); PHPBN2(PHP_INT_MAX); PHPBN2(PHP_INT_SIZE); PHPBN2(DEFAULT_INCLUDE_PATH); PHPBN2(PEAR_INSTALL_DIR); PHPBN2(PEAR_EXTENSION_DIR); PHPBN2(PHP_EXTENSION_DIR); PHPBN2(PHP_PREFIX); PHPBN2(PHP_BINDIR); PHPBN2(PHP_BINARY); PHPBN2(PHP_MANDIR); PHPBN2(PHP_LIBDIR); PHPBN2(PHP_DATADIR); PHPBN2(PHP_SYSCONFDIR); PHPBN2(PHP_LOCALSTATEDIR); PHPBN2(PHP_CONFIG_FILE_PATH); PHPBN2(PHP_CONFIG_FILE_SCAN_DIR); PHPBN2(PHP_SHLIB_SUFFIX); PHPBN2(E_ERROR); PHPBN2(E_WARNING); PHPBN2(E_PARSE); PHPBN2(E_NOTICE); PHPBN2(E_CORE_ERROR); PHPBN2(E_CORE_WARNING); PHPBN2(E_COMPILE_ERROR); PHPBN2(E_COMPILE_WARNING); PHPBN2(E_USER_ERROR); PHPBN2(E_USER_WARNING); PHPBN2(E_USER_NOTICE); PHPBN2(E_DEPRECATED); PHPBN2(E_USER_DEPRECATED); PHPBN2(E_ALL); PHPBN2(E_STRICT); PHPBN2(__COMPILER_HALT_OFFSET__); // TRUE, FALSE, NULL are listed on the same page, but are actually // case-insensitive, whereas all the other constants listed there seem to be // case-sensitive, so we handle TRUE, FALSE, NULL in PHPBN1. PHPBN2(PHP_OUTPUT_HANDLER_START); PHPBN2(PHP_OUTPUT_HANDLER_CONT); PHPBN2(PHP_OUTPUT_HANDLER_END); /* These don't actually seem to be set (tested on Linux, I guess they're * Windows only?) */ PHPBN2(PHP_WINDOWS_NT_DOMAIN_CONTROLLER); PHPBN2(PHP_WINDOWS_NT_SERVER); PHPBN2(PHP_WINDOWS_NT_WORKSTATION); PHPBN2(PHP_WINDOWS_VERSION_BUILD); PHPBN2(PHP_WINDOWS_VERSION_MAJOR); PHPBN2(PHP_WINDOWS_VERSION_MINOR); PHPBN2(PHP_WINDOWS_VERSION_PLATFORM); PHPBN2(PHP_WINDOWS_VERSION_PRODUCTTYPE); PHPBN2(PHP_WINDOWS_VERSION_SP_MAJOR); PHPBN2(PHP_WINDOWS_VERSION_SP_MINOR); PHPBN2(PHP_WINDOWS_VERSION_SUITEMASK); /* "Standard Predefined Constants" from http://php.net/manual/en/reserved.constants.php */ PHPBN2(EXTR_OVERWRITE); PHPBN2(EXTR_SKIP); PHPBN2(EXTR_PREFIX_SAME); PHPBN2(EXTR_PREFIX_ALL); PHPBN2(EXTR_PREFIX_INVALID); PHPBN2(EXTR_PREFIX_IF_EXISTS); PHPBN2(EXTR_IF_EXISTS); PHPBN2(SORT_ASC); PHPBN2(SORT_DESC); PHPBN2(SORT_REGULAR); PHPBN2(SORT_NUMERIC); PHPBN2(SORT_STRING); PHPBN2(CASE_LOWER); PHPBN2(CASE_UPPER); PHPBN2(COUNT_NORMAL); PHPBN2(COUNT_RECURSIVE); PHPBN2(ASSERT_ACTIVE); PHPBN2(ASSERT_CALLBACK); PHPBN2(ASSERT_BAIL); PHPBN2(ASSERT_WARNING); PHPBN2(ASSERT_QUIET_EVAL); PHPBN2(CONNECTION_ABORTED); PHPBN2(CONNECTION_NORMAL); PHPBN2(CONNECTION_TIMEOUT); PHPBN2(INI_USER); PHPBN2(INI_PERDIR); PHPBN2(INI_SYSTEM); PHPBN2(INI_ALL); PHPBN2(INI_SCANNER_NORMAL); PHPBN2(INI_SCANNER_RAW); PHPBN2(M_E); PHPBN2(M_LOG2E); PHPBN2(M_LOG10E); PHPBN2(M_LN2); PHPBN2(M_LN10); PHPBN2(M_PI); PHPBN2(M_PI_2); PHPBN2(M_PI_4); PHPBN2(M_1_PI); PHPBN2(M_2_PI); PHPBN2(M_2_SQRTPI); PHPBN2(M_SQRT2); PHPBN2(M_SQRT1_2); PHPBN2(M_EULER); PHPBN2(M_LNPI); PHPBN2(M_SQRT3); PHPBN2(M_SQRTPI); PHPBN2(CRYPT_SALT_LENGTH); PHPBN2(CRYPT_STD_DES); PHPBN2(CRYPT_EXT_DES); PHPBN2(CRYPT_MD5); PHPBN2(CRYPT_BLOWFISH); PHPBN2(DIRECTORY_SEPARATOR); PHPBN2(SEEK_SET); PHPBN2(SEEK_CUR); PHPBN2(SEEK_END); PHPBN2(LOCK_SH); PHPBN2(LOCK_EX); PHPBN2(LOCK_UN); PHPBN2(LOCK_NB); PHPBN2(HTML_SPECIALCHARS); PHPBN2(HTML_ENTITIES); PHPBN2(ENT_COMPAT); PHPBN2(ENT_QUOTES); PHPBN2(ENT_NOQUOTES); PHPBN2(INFO_GENERAL); PHPBN2(INFO_CREDITS); PHPBN2(INFO_CONFIGURATION); PHPBN2(INFO_MODULES); PHPBN2(INFO_ENVIRONMENT); PHPBN2(INFO_VARIABLES); PHPBN2(INFO_LICENSE); PHPBN2(INFO_ALL); PHPBN2(CREDITS_GROUP); PHPBN2(CREDITS_GENERAL); PHPBN2(CREDITS_SAPI); PHPBN2(CREDITS_MODULES); PHPBN2(CREDITS_DOCS); PHPBN2(CREDITS_FULLPAGE); PHPBN2(CREDITS_QA); PHPBN2(CREDITS_ALL); PHPBN2(STR_PAD_LEFT); PHPBN2(STR_PAD_RIGHT); PHPBN2(STR_PAD_BOTH); PHPBN2(PATHINFO_DIRNAME); PHPBN2(PATHINFO_BASENAME); PHPBN2(PATHINFO_EXTENSION); PHPBN2(PATHINFO_FILENAME); PHPBN2(PATH_SEPARATOR); PHPBN2(CHAR_MAX); PHPBN2(LC_CTYPE); PHPBN2(LC_NUMERIC); PHPBN2(LC_TIME); PHPBN2(LC_COLLATE); PHPBN2(LC_MONETARY); PHPBN2(LC_ALL); PHPBN2(LC_MESSAGES); PHPBN2(ABDAY_1); PHPBN2(ABDAY_2); PHPBN2(ABDAY_3); PHPBN2(ABDAY_4); PHPBN2(ABDAY_5); PHPBN2(ABDAY_6); PHPBN2(ABDAY_7); PHPBN2(DAY_1); PHPBN2(DAY_2); PHPBN2(DAY_3); PHPBN2(DAY_4); PHPBN2(DAY_5); PHPBN2(DAY_6); PHPBN2(DAY_7); PHPBN2(ABMON_1); PHPBN2(ABMON_2); PHPBN2(ABMON_3); PHPBN2(ABMON_4); PHPBN2(ABMON_5); PHPBN2(ABMON_6); PHPBN2(ABMON_7); PHPBN2(ABMON_8); PHPBN2(ABMON_9); PHPBN2(ABMON_10); PHPBN2(ABMON_11); PHPBN2(ABMON_12); PHPBN2(MON_1); PHPBN2(MON_2); PHPBN2(MON_3); PHPBN2(MON_4); PHPBN2(MON_5); PHPBN2(MON_6); PHPBN2(MON_7); PHPBN2(MON_8); PHPBN2(MON_9); PHPBN2(MON_10); PHPBN2(MON_11); PHPBN2(MON_12); PHPBN2(AM_STR); PHPBN2(PM_STR); PHPBN2(D_T_FMT); PHPBN2(D_FMT); PHPBN2(T_FMT); PHPBN2(T_FMT_AMPM); PHPBN2(ERA); PHPBN2(ERA_YEAR); PHPBN2(ERA_D_T_FMT); PHPBN2(ERA_D_FMT); PHPBN2(ERA_T_FMT); PHPBN2(ALT_DIGITS); PHPBN2(INT_CURR_SYMBOL); PHPBN2(CURRENCY_SYMBOL); PHPBN2(CRNCYSTR); PHPBN2(MON_DECIMAL_POINT); PHPBN2(MON_THOUSANDS_SEP); PHPBN2(MON_GROUPING); PHPBN2(POSITIVE_SIGN); PHPBN2(NEGATIVE_SIGN); PHPBN2(INT_FRAC_DIGITS); PHPBN2(FRAC_DIGITS); PHPBN2(P_CS_PRECEDES); PHPBN2(P_SEP_BY_SPACE); PHPBN2(N_CS_PRECEDES); PHPBN2(N_SEP_BY_SPACE); PHPBN2(P_SIGN_POSN); PHPBN2(N_SIGN_POSN); PHPBN2(DECIMAL_POINT); PHPBN2(RADIXCHAR); PHPBN2(THOUSANDS_SEP); PHPBN2(THOUSEP); PHPBN2(GROUPING); PHPBN2(YESEXPR); PHPBN2(NOEXPR); PHPBN2(YESSTR); PHPBN2(NOSTR); PHPBN2(CODESET); PHPBN2(LOG_EMERG); PHPBN2(LOG_ALERT); PHPBN2(LOG_CRIT); PHPBN2(LOG_ERR); PHPBN2(LOG_WARNING); PHPBN2(LOG_NOTICE); PHPBN2(LOG_INFO); PHPBN2(LOG_DEBUG); PHPBN2(LOG_KERN); PHPBN2(LOG_USER); PHPBN2(LOG_MAIL); PHPBN2(LOG_DAEMON); PHPBN2(LOG_AUTH); PHPBN2(LOG_SYSLOG); PHPBN2(LOG_LPR); PHPBN2(LOG_NEWS); PHPBN2(LOG_UUCP); PHPBN2(LOG_CRON); PHPBN2(LOG_AUTHPRIV); PHPBN2(LOG_LOCAL0); PHPBN2(LOG_LOCAL1); PHPBN2(LOG_LOCAL2); PHPBN2(LOG_LOCAL3); PHPBN2(LOG_LOCAL4); PHPBN2(LOG_LOCAL5); PHPBN2(LOG_LOCAL6); PHPBN2(LOG_LOCAL7); PHPBN2(LOG_PID); PHPBN2(LOG_CONS); PHPBN2(LOG_ODELAY); PHPBN2(LOG_NDELAY); PHPBN2(LOG_NOWAIT); PHPBN2(LOG_PERROR); PHPBN2(PREG_BACKTRACK_LIMIT_ERROR); PHPBN2(PREG_BAD_UTF8_ERROR); PHPBN2(PREG_INTERNAL_ERROR); PHPBN2(PREG_NO_ERROR); PHPBN2(PREG_RECURSION_LIMIT_ERROR); PHPBN2(UPLOAD_ERR_EXTENSION); PHPBN2(STREAM_SHUT_RD); PHPBN2(STREAM_SHUT_WR); PHPBN2(STREAM_SHUT_RDWR); PHPBN2(CURLE_FILESIZE_EXCEEDED); PHPBN2(CURLE_FTP_SSL_FAILED); PHPBN2(CURLE_LDAP_INVALID_URL); PHPBN2(CURLFTPAUTH_DEFAULT); PHPBN2(CURLFTPAUTH_SSL); PHPBN2(CURLFTPAUTH_TLS); PHPBN2(CURLFTPSSL_ALL); PHPBN2(CURLFTPSSL_CONTROL); PHPBN2(CURLFTPSSL_NONE); PHPBN2(CURLFTPSSL_TRY); PHPBN2(CURLOPT_FTP_SSL); PHPBN2(CURLOPT_FTPSSLAUTH); PHPBN2(CURLOPT_TCP_NODELAY); PHPBN2(CURLOPT_TIMEOUT_MS); PHPBN2(CURLOPT_CONNECTTIMEOUT_MS); PHPBN2(GMP_VERSION); PHPBN2(SWFTEXTFIELD_USEFONT); PHPBN2(SWFTEXTFIELD_AUTOSIZE); PHPBN2(SWF_SOUND_NOT_COMPRESSED); PHPBN2(SWF_SOUND_ADPCM_COMPRESSED); PHPBN2(SWF_SOUND_MP3_COMPRESSED); PHPBN2(SWF_SOUND_NOT_COMPRESSED_LE); PHPBN2(SWF_SOUND_NELLY_COMPRESSED); PHPBN2(SWF_SOUND_5KHZ); PHPBN2(SWF_SOUND_11KHZ); PHPBN2(SWF_SOUND_22KHZ); PHPBN2(SWF_SOUND_44KHZ); PHPBN2(SWF_SOUND_8BITS); PHPBN2(SWF_SOUND_16BITS); PHPBN2(SWF_SOUND_MONO); PHPBN2(SWF_SOUND_STEREO); PHPBN2(OPENSSL_VERSION_NUMBER); PHPBN2(SNMP_OID_OUTPUT_FULL); PHPBN2(SNMP_OID_OUTPUT_NUMERIC); PHPBN2(MSG_EAGAIN); PHPBN2(MSG_ENOMSG); PHPBN2(CURLOPT_PROGRESSFUNCTION); PHPBN2(IMG_FILTER_PIXELATE); PHPBN2(JSON_ERROR_CTRL_CHAR); PHPBN2(JSON_ERROR_DEPTH); PHPBN2(JSON_ERROR_NONE); PHPBN2(JSON_ERROR_STATE_MISMATCH); PHPBN2(JSON_ERROR_SYNTAX); PHPBN2(JSON_FORCE_OBJECT); PHPBN2(JSON_HEX_TAG); PHPBN2(JSON_HEX_AMP); PHPBN2(JSON_HEX_APOS); PHPBN2(JSON_HEX_QUOT); PHPBN2(LDAP_OPT_NETWORK_TIMEOUT); PHPBN2(LIBXML_LOADED_VERSION); PHPBN2(PREG_BAD_UTF8_OFFSET_ERROR); PHPBN2(BUS_ADRALN); PHPBN2(BUS_ADRERR); PHPBN2(BUS_OBJERR); PHPBN2(CLD_CONTIUNED); PHPBN2(CLD_DUMPED); PHPBN2(CLD_EXITED); PHPBN2(CLD_KILLED); PHPBN2(CLD_STOPPED); PHPBN2(CLD_TRAPPED); PHPBN2(FPE_FLTDIV); PHPBN2(FPE_FLTINV); PHPBN2(FPE_FLTOVF); PHPBN2(FPE_FLTRES); PHPBN2(FPE_FLTSUB); PHPBN2(FPE_FLTUND); PHPBN2(FPE_INTDIV); PHPBN2(FPE_INTOVF); PHPBN2(ILL_BADSTK); PHPBN2(ILL_COPROC); PHPBN2(ILL_ILLADR); PHPBN2(ILL_ILLOPC); PHPBN2(ILL_ILLOPN); PHPBN2(ILL_ILLTRP); PHPBN2(ILL_PRVOPC); PHPBN2(ILL_PRVREG); PHPBN2(POLL_ERR); PHPBN2(POLL_HUP); PHPBN2(POLL_IN); PHPBN2(POLL_MSG); PHPBN2(POLL_OUT); PHPBN2(POLL_PRI); PHPBN2(SEGV_ACCERR); PHPBN2(SEGV_MAPERR); PHPBN2(SI_ASYNCIO); PHPBN2(SI_KERNEL); PHPBN2(SI_MESGQ); PHPBN2(SI_NOINFO); PHPBN2(SI_QUEUE); PHPBN2(SI_SIGIO); PHPBN2(SI_TIMER); PHPBN2(SI_TKILL); PHPBN2(SI_USER); PHPBN2(SIG_BLOCK); PHPBN2(SIG_SETMASK); PHPBN2(SIG_UNBLOCK); PHPBN2(TRAP_BRKPT); PHPBN2(TRAP_TRACE); PHPBN2(ENT_DISALLOWED); PHPBN2(ENT_HTML401); PHPBN2(ENT_HTML5); PHPBN2(ENT_SUBSTITUTE); PHPBN2(ENT_XML1); PHPBN2(ENT_XHTML); PHPBN2(IPPROTO_IP); PHPBN2(IPPROTO_IPV6); PHPBN2(IPV6_MULTICAST_HOPS); PHPBN2(IPV6_MULTICAST_IF); PHPBN2(IPV6_MULTICAST_LOOP); PHPBN2(IP_MULTICAST_IF); PHPBN2(IP_MULTICAST_LOOP); PHPBN2(IP_MULTICAST_TTL); PHPBN2(MCAST_JOIN_GROUP); PHPBN2(MCAST_LEAVE_GROUP); PHPBN2(MCAST_BLOCK_SOURCE); PHPBN2(MCAST_UNBLOCK_SOURCE); PHPBN2(MCAST_JOIN_SOURCE_GROUP); PHPBN2(MCAST_LEAVE_SOURCE_GROUP); PHPBN2(CURLOPT_MAX_RECV_SPEED_LARGE); PHPBN2(CURLOPT_MAX_SEND_SPEED_LARGE); PHPBN2(LIBXML_HTML_NODEFDTD); PHPBN2(LIBXML_HTML_NOIMPLIED); PHPBN2(LIBXML_PEDANTIC); PHPBN2(OPENSSL_CIPHER_AES_128_CBC); PHPBN2(OPENSSL_CIPHER_AES_192_CBC); PHPBN2(OPENSSL_CIPHER_AES_256_CBC); PHPBN2(OPENSSL_RAW_DATA); PHPBN2(OPENSSL_ZERO_PADDING); PHPBN2(PHP_OUTPUT_HANDLER_CLEAN); PHPBN2(PHP_OUTPUT_HANDLER_CLEANABLE); PHPBN2(PHP_OUTPUT_HANDLER_DISABLED); PHPBN2(PHP_OUTPUT_HANDLER_FINAL); PHPBN2(PHP_OUTPUT_HANDLER_FLUSH); PHPBN2(PHP_OUTPUT_HANDLER_FLUSHABLE); PHPBN2(PHP_OUTPUT_HANDLER_REMOVABLE); PHPBN2(PHP_OUTPUT_HANDLER_STARTED); PHPBN2(PHP_OUTPUT_HANDLER_STDFLAGS); PHPBN2(PHP_OUTPUT_HANDLER_WRITE); PHPBN2(PHP_SESSION_ACTIVE); PHPBN2(PHP_SESSION_DISABLED); PHPBN2(PHP_SESSION_NONE); PHPBN2(STREAM_META_ACCESS); PHPBN2(STREAM_META_GROUP); PHPBN2(STREAM_META_GROUP_NAME); PHPBN2(STREAM_META_OWNER); PHPBN2(STREAM_META_OWNER_NAME); PHPBN2(STREAM_META_TOUCH); PHPBN2(ZLIB_ENCODING_DEFLATE); PHPBN2(ZLIB_ENCODING_GZIP); PHPBN2(ZLIB_ENCODING_RAW); PHPBN2(U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR); PHPBN2(IDNA_CHECK_BIDI); PHPBN2(IDNA_CHECK_CONTEXTJ); PHPBN2(IDNA_NONTRANSITIONAL_TO_ASCII); PHPBN2(IDNA_NONTRANSITIONAL_TO_UNICODE); PHPBN2(INTL_IDNA_VARIANT_2003); PHPBN2(INTL_IDNA_VARIANT_UTS46); PHPBN2(IDNA_ERROR_EMPTY_LABEL); PHPBN2(IDNA_ERROR_LABEL_TOO_LONG); PHPBN2(IDNA_ERROR_DOMAIN_NAME_TOO_LONG); PHPBN2(IDNA_ERROR_LEADING_HYPHEN); PHPBN2(IDNA_ERROR_TRAILING_HYPHEN); PHPBN2(IDNA_ERROR_HYPHEN_3_4); PHPBN2(IDNA_ERROR_LEADING_COMBINING_MARK); PHPBN2(IDNA_ERROR_DISALLOWED); PHPBN2(IDNA_ERROR_PUNYCODE); PHPBN2(IDNA_ERROR_LABEL_HAS_DOT); PHPBN2(IDNA_ERROR_INVALID_ACE_LABEL); PHPBN2(IDNA_ERROR_BIDI); PHPBN2(IDNA_ERROR_CONTEXTJ); PHPBN2(JSON_PRETTY_PRINT); PHPBN2(JSON_UNESCAPED_SLASHES); PHPBN2(JSON_NUMERIC_CHECK); PHPBN2(JSON_UNESCAPED_UNICODE); PHPBN2(JSON_BIGINT_AS_STRING); PHPBN2(IMG_AFFINE_TRANSLATE); PHPBN2(IMG_AFFINE_SCALE); PHPBN2(IMG_AFFINE_ROTATE); PHPBN2(IMG_AFFINE_SHEAR_HORIZONTAL); PHPBN2(IMG_AFFINE_SHEAR_VERTICAL); PHPBN2(IMG_CROP_DEFAULT); PHPBN2(IMG_CROP_TRANSPARENT); PHPBN2(IMG_CROP_BLACK); PHPBN2(IMG_CROP_WHITE); PHPBN2(IMG_CROP_SIDES); PHPBN2(IMG_FLIP_BOTH); PHPBN2(IMG_FLIP_HORIZONTAL); PHPBN2(IMG_FLIP_VERTICAL); PHPBN2(IMG_BELL); PHPBN2(IMG_BESSEL); PHPBN2(IMG_BICUBIC); PHPBN2(IMG_BICUBIC_FIXED); PHPBN2(IMG_BLACKMAN); PHPBN2(IMG_BOX); PHPBN2(IMG_BSPLINE); PHPBN2(IMG_CATMULLROM); PHPBN2(IMG_GAUSSIAN); PHPBN2(IMG_GENERALIZED_CUBIC); PHPBN2(IMG_HERMITE); PHPBN2(IMG_HAMMING); PHPBN2(IMG_HANNING); PHPBN2(IMG_MITCHELL); PHPBN2(IMG_POWER); PHPBN2(IMG_QUADRATIC); PHPBN2(IMG_SINC); PHPBN2(IMG_NEAREST_NEIGHBOUR); PHPBN2(IMG_WEIGHTED4); PHPBN2(IMG_TRIANGLE); PHPBN2(JSON_ERROR_RECURSION); PHPBN2(JSON_ERROR_INF_OR_NAN); PHPBN2(JSON_ERROR_UNSUPPORTED_TYPE); PHPBN2(MYSQLI_SERVER_PUBLIC_KEY); PHPBN2(LDAP_ESCAPE_DN); PHPBN2(LDAP_ESCAPE_FILTER); PHPBN2(OPENSSL_DEFAULT_STREAM_CIPHERS); PHPBN2(STREAM_CRYPTO_METHOD_ANY_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_ANY_SERVER); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_0_SERVER); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_1_SERVER); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_2_SERVER); PHPBN2(PGSQL_CONNECT_ASYNC); PHPBN2(PGSQL_CONNECTION_AUTH_OK); PHPBN2(PGSQL_CONNECTION_AWAITING_RESPONSE); PHPBN2(PGSQL_CONNECTION_MADE); PHPBN2(PGSQL_CONNECTION_SETENV); PHPBN2(PGSQL_CONNECTION_SSL_STARTUP); PHPBN2(PGSQL_CONNECTION_STARTED); PHPBN2(PGSQL_DML_ESCAPE); PHPBN2(PGSQL_POLLING_ACTIVE); PHPBN2(PGSQL_POLLING_FAILED); PHPBN2(PGSQL_POLLING_OK); PHPBN2(PGSQL_POLLING_READING); PHPBN2(PGSQL_POLLING_WRITING); /* Class names reserved by PHP (case insensitive) */ PHPCN(directory); PHPCN(stdclass); PHPCN(__php_incomplete_class); /* Added in PHP5. */ PHPCN(exception); PHPCN(errorexception); PHPCN(php_user_filter); PHPCN(closure); PHPCN(generator); PHPCN(self); PHPCN(static); PHPCN(parent); /* http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.other.classes */ PHPCN(bool); // As of PHP 7.0 PHPCN(int); // As of PHP 7.0 PHPCN(float); // As of PHP 7.0 PHPCN(string); // As of PHP 7.0 PHPCN(NULL); // As of PHP 7.0 PHPCN(TRUE); // As of PHP 7.0 PHPCN(FALSE); // As of PHP 7.0 PHPCN(resource); // As of PHP 7.0 (currently works but reserved) PHPCN(object); // As of PHP 7.0 (currently works but reserved) PHPCN(mixed); // As of PHP 7.0 (currently works but reserved) PHPCN(numeric); // As of PHP 7.0 (currently works but reserved) /* http://php.net/manual/en/migration71.incompatible.php#migration71.incompatible.invalid-class-names */ PHPCN(iterable); // As of PHP 7.1 PHPCN(void); // As of PHP 7.1 /* From extensions (which of these are actually predefined depends which * extensions are loaded by default). */ PHPCN(xmlwriter); PHPCN(libxmlerror); PHPCN(simplexmlelement); PHPCN(soapclient); PHPCN(soapvar); PHPCN(soapserver); PHPCN(soapfault); PHPCN(soapparam); PHPCN(soapheader); PHPCN(recursiveiteratoriterator); PHPCN(filteriterator); PHPCN(recursivefilteriterator); PHPCN(parentiterator); PHPCN(limititerator); PHPCN(cachingiterator); PHPCN(recursivecachingiterator); PHPCN(iteratoriterator); PHPCN(norewinditerator); PHPCN(appenditerator); PHPCN(infiniteiterator); PHPCN(emptyiterator); PHPCN(arrayobject); PHPCN(arrayiterator); PHPCN(recursivearrayiterator); PHPCN(splfileinfo); PHPCN(directoryiterator); PHPCN(recursivedirectoryiterator); PHPCN(splfileobject); PHPCN(spltempfileobject); PHPCN(simplexmliterator); PHPCN(logicexception); PHPCN(badfunctioncallexception); PHPCN(badmethodcallexception); PHPCN(domainexception); PHPCN(invalidargumentexception); PHPCN(lengthexception); PHPCN(outofrangeexception); PHPCN(runtimeexception); PHPCN(outofboundsexception); PHPCN(overflowexception); PHPCN(rangeexception); PHPCN(underflowexception); PHPCN(unexpectedvalueexception); PHPCN(splobjectstorage); PHPCN(reflectionexception); PHPCN(reflection); PHPCN(reflectionfunction); PHPCN(reflectionparameter); PHPCN(reflectionmethod); PHPCN(reflectionclass); PHPCN(reflectionobject); PHPCN(reflectionproperty); PHPCN(reflectionextension); PHPCN(domexception); PHPCN(domstringlist); PHPCN(domnamelist); PHPCN(domimplementationlist); PHPCN(domimplementationsource); PHPCN(domimplementation); PHPCN(domnode); PHPCN(domnamespacenode); PHPCN(domdocumentfragment); PHPCN(domdocument); PHPCN(domnodelist); PHPCN(domnamednodemap); PHPCN(domcharacterdata); PHPCN(domattr); PHPCN(domelement); PHPCN(domtext); PHPCN(domcomment); PHPCN(domtypeinfo); PHPCN(domuserdatahandler); PHPCN(domdomerror); PHPCN(domerrorhandler); PHPCN(domlocator); PHPCN(domconfiguration); PHPCN(domcdatasection); PHPCN(domdocumenttype); PHPCN(domnotation); PHPCN(domentity); PHPCN(domentityreference); PHPCN(domprocessinginstruction); PHPCN(domstringextend); PHPCN(domxpath); PHPCN(xmlreader); PHPCN(sqlitedatabase); PHPCN(sqliteresult); PHPCN(sqliteunbuffered); PHPCN(sqliteexception); PHPCN(datetime); /* Built-in PHP functions (incomplete). */ /* Includes Array Functions - http://php.net/manual/en/ref.array.php */ /* Check is case insensitive - these *MUST* be listed in lower case here */ PHPFN(__halt_compiler); PHPFN(acos); PHPFN(array); PHPFN(array_change_key_case); PHPFN(array_chunk); PHPFN(array_column); PHPFN(array_combine); PHPFN(array_count_values); PHPFN(array_diff); PHPFN(array_diff_assoc); PHPFN(array_diff_key); PHPFN(array_diff_uassoc); PHPFN(array_diff_ukey); PHPFN(array_fill); PHPFN(array_fill_keys); PHPFN(array_filter); PHPFN(array_flip); PHPFN(array_intersect); PHPFN(array_intersect_assoc); PHPFN(array_intersect_key); PHPFN(array_intersect_uassoc); PHPFN(array_intersect_ukey); PHPFN(array_key_exists); PHPFN(array_keys); PHPFN(array_map); PHPFN(array_merge); PHPFN(array_merge_recursive); PHPFN(array_multisort); PHPFN(array_pad); PHPFN(array_pop); PHPFN(array_product); PHPFN(array_push); PHPFN(array_rand); PHPFN(array_reduce); PHPFN(array_replace); PHPFN(array_replace_recursive); PHPFN(array_reverse); PHPFN(array_search); PHPFN(array_shift); PHPFN(array_slice); PHPFN(array_splice); PHPFN(array_sum); PHPFN(array_udiff); PHPFN(array_udiff_assoc); PHPFN(array_udiff_uassoc); PHPFN(array_uintersect); PHPFN(array_uintersect_assoc); PHPFN(array_uintersect_uassoc); PHPFN(array_unique); PHPFN(array_unshift); PHPFN(array_values); PHPFN(array_walk); PHPFN(array_walk_recursive); PHPFN(arsort); PHPFN(asin); PHPFN(asort); PHPFN(atan); PHPFN(atan2); PHPFN(ceil); PHPFN(compact); PHPFN(cos); PHPFN(cosh); PHPFN(count); PHPFN(current); PHPFN(die); // "Language construct" PHPFN(each); PHPFN(echo); // "Language construct" PHPFN(empty); PHPFN(end); PHPFN(eval); // "Language construct" PHPFN(exit); // "Language construct" PHPFN(exp); PHPFN(extract); PHPFN(floor); PHPFN(fmod); PHPFN(in_array); PHPFN(include); // "Language construct" PHPFN(include_once); // "Language construct" PHPFN(isset); // "Language construct" PHPFN(key); PHPFN(key_exists); PHPFN(krsort); PHPFN(ksort); PHPFN(list); // "Language construct" PHPFN(log); PHPFN(log10); PHPFN(max); PHPFN(min); PHPFN(natcasesort); PHPFN(natsort); PHPFN(next); PHPFN(pos); PHPFN(pow); PHPFN(prev); PHPFN(print); // "Language construct" PHPFN(range); PHPFN(reset); PHPFN(rsort); PHPFN(require); // "Language construct" PHPFN(require_once); // "Language construct" PHPFN(return); // "Language construct" PHPFN(shuffle); PHPFN(sin); PHPFN(sinh); PHPFN(sizeof); PHPFN(sort); PHPFN(sqrt); PHPFN(tan); PHPFN(tanh); PHPFN(uasort); PHPFN(uksort); PHPFN(unset); // "Language construct" PHPFN(usort); #undef PHPKW #undef PHPBN1a #undef PHPBN1b #undef PHPBN1 #undef PHPBN2a #undef PHPBN2b #undef PHPBN2 #undef PHPCN #undef PHPFN swig-4.0.2/Lib/php/director.swg0000644000175000017500000000776713667507523016235 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that PHP proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #ifndef SWIG_DIRECTOR_PHP_HEADER_ #define SWIG_DIRECTOR_PHP_HEADER_ #include #include #include namespace Swig { /* memory handler */ struct GCItem { virtual ~GCItem() { } virtual int get_own() const { return 0; } }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem * operator->() const { return _item; } private: GCItem *_item; }; struct GCItem_Object : GCItem { GCItem_Object(int own) : _own(own) { } virtual ~GCItem_Object() { } int get_own() const { return _own; } private: int _own; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; class Director { protected: // "mutable" so we can get a non-const pointer to it in const methods. mutable zval swig_self; typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; public: Director(zval *self) { ZVAL_COPY_VALUE(&swig_self, self); } static bool swig_is_overridden_method(const char *cname, const char *lc_fname) { bool result = false; zend_string * cname_str = zend_string_init(cname, strlen(cname), 0); zend_class_entry *ce = zend_lookup_class(cname_str); if (ce) { zval * mptr = zend_hash_str_find(&ce->function_table, lc_fname, strlen(lc_fname)); if (mptr) { // common.scope points to zend_class_entry for the declaring class, // and there's only one of those per class, so we can just use a // pointer compare here. result = Z_FUNC_P(mptr)->common.scope != ce; } } zend_string_release(cname_str); return result; } template void swig_acquire_ownership(Type *vptr) const { if (vptr) { swig_owner[vptr] = new GCItem_T(vptr); } } }; /* base class for director exceptions */ class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(int code, const char *hdr, const char *msg) : swig_msg(hdr) { if (msg && msg[0]) { swig_msg += " "; swig_msg += msg; } SWIG_ErrorCode() = code; SWIG_ErrorMsg() = swig_msg.c_str(); } virtual ~DirectorException() throw() { } const char *what() const throw() { return swig_msg.c_str(); } static void raise(int code, const char *hdr, const char *msg) { throw DirectorException(code, hdr, msg); } }; /* attempt to call a pure virtual method via a director method */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg) : DirectorException(E_ERROR, "SWIG director pure virtual method called", msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; /* any php exception that occurs during a director method call */ class DirectorMethodException : public DirectorException { public: DirectorMethodException() : DirectorException(E_ERROR, "SWIG director method error", NULL) { } DirectorMethodException(const char *msg) : DirectorException(E_ERROR, "SWIG director method error", msg) { } static void raise(const char *msg) { throw DirectorMethodException(msg); } }; } #endif swig-4.0.2/Lib/php/php.swg0000644000175000017500000003313713667507523015177 0ustar williamwilliam/* ----------------------------------------------------------------------------- * php.swg * * PHP configuration file * ----------------------------------------------------------------------------- */ %runtime "swigrun.swg" // Common C API type-checking code %runtime "swigerrors.swg" // SWIG errors %runtime "phprun.swg" // PHP runtime functions %include // PHP initialization routine. %include // Global variables. %include // use %init %{ "/*code goes here*/ " %} // or %minit %{ "/* code goes here*/ " %} to // insert code in the PHP_MINIT_FUNCTION #define %minit %insert("init") // use %rinit %{ "/* code goes here*/ " %} to // insert code in the PHP_RINIT_FUNCTION #define %rinit %insert("rinit") // use %shutdown %{ " /*code goes here*/ " %} to // insert code in the PHP_MSHUTDOWN_FUNCTION #define %shutdown %insert("shutdown") #define %mshutdown %insert("shutdown") // use %rshutdown %{ " /*code goes here*/" %} to // insert code in the PHP_RSHUTDOWN_FUNCTION #define %rshutdown %insert("rshutdown") /* Typemaps for input parameters by value */ %include %pass_by_val(bool,CONVERT_BOOL_IN); %pass_by_val(size_t, CONVERT_INT_IN); %pass_by_val(enum SWIGTYPE, CONVERT_INT_IN); %pass_by_val(signed int, CONVERT_INT_IN); %pass_by_val(int,CONVERT_INT_IN); %pass_by_val(unsigned int,CONVERT_INT_IN); %pass_by_val(signed short, CONVERT_INT_IN); %pass_by_val(short,CONVERT_INT_IN); %pass_by_val(unsigned short, CONVERT_INT_IN); %pass_by_val(signed long, CONVERT_INT_IN); %pass_by_val(long, CONVERT_INT_IN); %pass_by_val(unsigned long, CONVERT_INT_IN); %pass_by_val(signed long long, CONVERT_LONG_LONG_IN); %pass_by_val(long long, CONVERT_LONG_LONG_IN); %pass_by_val(unsigned long long, CONVERT_UNSIGNED_LONG_LONG_IN); %pass_by_val(signed char, CONVERT_INT_IN); %pass_by_val(char, CONVERT_CHAR_IN); %pass_by_val(unsigned char, CONVERT_INT_IN); %pass_by_val(float, CONVERT_FLOAT_IN); %pass_by_val(double, CONVERT_FLOAT_IN); %pass_by_val(char *, CONVERT_STRING_IN); %typemap(in) char *& = const char *&; %typemap(directorout) char *& = const char *&; // char array can be in/out, though the passed string may not be big enough... // so we have to size it %typemap(in) char[ANY] %{ convert_to_string(&$input); $1 = ($1_ltype) Z_STRVAL($input); %} %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) %{ convert_to_string(&$input); $1 = ($1_ltype) Z_STRVAL($input); $2 = ($2_ltype) Z_STRLEN($input); %} /* Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_ltype tmp) %{ if (SWIG_ConvertPtr(&$input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); } $1 = *tmp; %} %typemap(directorout) SWIGTYPE ($&1_ltype tmp) %{ /* If exit was via exception, PHP NULL is returned so skip the conversion. */ if (!EG(exception)) { if (SWIG_ConvertPtr($input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); $result = *tmp; } %} %typemap(in) SWIGTYPE *, SWIGTYPE [] %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } %} %typemap(in) SWIGTYPE & %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } %} %typemap(in) SWIGTYPE && %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } %} %typemap(in) SWIGTYPE *const& ($*ltype temp) %{ if (SWIG_ConvertPtr(&$input, (void **) &temp, $*1_descriptor, 0) < 0) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $*1_descriptor"); } $1 = ($1_ltype)&temp; %} %typemap(in) SWIGTYPE *DISOWN %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, SWIG_POINTER_DISOWN ) < 0) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } %} %typemap(argout) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE &&; %typemap(in) void * %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, 0, 0) < 0) { /* Allow NULL from php for void* */ if (Z_ISNULL($input)) $1=0; else SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } %} /* Special case when void* is passed by reference so it can be made to point to opaque api structs */ %typemap(in) void ** ($*1_ltype ptr, int force), void *& ($*1_ltype ptr, int force) { /* If they pass NULL by reference, make it into a void* This bit should go in arginit if arginit support init-ing scripting args */ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0) { /* So... we didn't get a ref or ptr, but we'll accept NULL by reference */ if (!(Z_ISREF($input) && Z_ISNULL_P(Z_REFVAL($input)))) { /* wasn't a pre/ref/thing, OR anything like an int thing */ SWIG_PHP_Error(E_ERROR, "Type error in argument $arg of $symname."); } } force=0; if (arg1==NULL) { #ifdef __cplusplus ptr=new $*1_ltype(); #else ptr=($*1_ltype) calloc(1,sizeof($*1_ltype)); #endif $1=&ptr; /* have to passback arg$arg too */ force=1; } } %typemap(argout) void **, void *& %{ if (force$argnum) { SWIG_SetPointerZval(&$input, (void*) ptr$argnum, $*1_descriptor, 1); } %} /* Typemap for output values */ %typemap(out) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, bool, size_t %{ RETVAL_LONG($1); %} %typemap(out) enum SWIGTYPE %{ RETVAL_LONG((long)$1); %} %typemap(out) long long %{ if ((long long)LONG_MIN <= $1 && $1 <= (long long)LONG_MAX) { RETVAL_LONG((long)($1)); } else { char temp[256]; sprintf(temp, "%lld", (long long)$1); RETVAL_STRING(temp); } %} %typemap(out) unsigned long long %{ if ($1 <= (unsigned long long)LONG_MAX) { RETVAL_LONG((long)($1)); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)$1); RETVAL_STRING(temp); } %} %typemap(out) const int &, const unsigned int &, const short &, const unsigned short &, const long &, const unsigned long &, const signed char &, const unsigned char &, const bool &, const size_t & %{ RETVAL_LONG(*$1); %} %typemap(out) const enum SWIGTYPE & %{ RETVAL_LONG((long)*$1); %} %typemap(out) const enum SWIGTYPE && %{ RETVAL_LONG((long)*$1); %} %typemap(out) const long long & %{ if ((long long)LONG_MIN <= *$1 && *$1 <= (long long)LONG_MAX) { RETVAL_LONG((long)(*$1)); } else { char temp[256]; sprintf(temp, "%lld", (long long)(*$1)); RETVAL_STRING(temp); } %} %typemap(out) const unsigned long long & %{ if (*$1 <= (unsigned long long)LONG_MAX) { RETVAL_LONG((long)(*$1)); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)(*$1)); RETVAL_STRING(temp); } %} %typemap(directorin) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, size_t, enum SWIGTYPE %{ ZVAL_LONG($input,$1); %} %typemap(directorin) enum SWIGTYPE %{ ZVAL_LONG($input, (long)$1_name); %} %typemap(directorin) char *, char [] %{ if(!$1) { ZVAL_NULL($input); } else { ZVAL_STRING($input, (const char*)$1); } %} %typemap(out) bool %{ RETVAL_BOOL(($1) ? 1 : 0); %} %typemap(out) const bool & %{ RETVAL_BOOL((*$1) ? 1 : 0); %} %typemap(directorin) bool %{ ZVAL_BOOL($input, ($1) ? 1 : 0); %} %typemap(out) float, double %{ RETVAL_DOUBLE($1); %} %typemap(out) const float &, const double & %{ RETVAL_DOUBLE(*$1); %} %typemap(directorin) float, double %{ ZVAL_DOUBLE($input, $1); %} %typemap(out) char %{ RETVAL_STRINGL(&$1, 1); %} %typemap(out) const char & %{ RETVAL_STRINGL(&*$1, 1); %} %typemap(out) char *, char [] %{ if (!$1) { RETVAL_NULL(); } else { RETVAL_STRING((const char *)$1); } %} %typemap(out) char *& %{ if (!*$1) { RETVAL_NULL(); } else { RETVAL_STRING((const char *)*$1); } %} %typemap(out) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && %{ SWIG_SetPointerZval(return_value, (void *)$1, $1_descriptor, $owner); %} %typemap(out) SWIGTYPE *const& %{ SWIG_SetPointerZval(return_value, (void *)*$1, $*1_descriptor, $owner); %} %typemap(directorin) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && %{ SWIG_SetPointerZval($input, (void *)&$1, $1_descriptor, ($owner)|2); %} %typemap(out, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { void * p = emalloc(sizeof($1)); memcpy(p, &$1, sizeof($1)); RETVAL_RES(zend_register_resource(p, swig_member_ptr)); } %typemap(in, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { void * p = (void*)zend_fetch_resource_ex(&$input, SWIG_MEMBER_PTR, swig_member_ptr); memcpy(&$1, p, sizeof($1)); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1); SWIG_SetPointerZval(return_value, (void *)$1, ty, $owner); } %typemap(out) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultobj = new $1_ltype((const $1_ltype &) $1); SWIG_SetPointerZval(return_value, (void *)resultobj, $&1_descriptor, 1); } #else { $&1_ltype resultobj = ($&1_ltype) emalloc(sizeof($1_type)); memcpy(resultobj, &$1, sizeof($1_type)); SWIG_SetPointerZval(return_value, (void *)resultobj, $&1_descriptor, 1); } #endif %typemap(directorin) SWIGTYPE %{ SWIG_SetPointerZval($input, SWIG_as_voidptr(new $1_ltype((const $1_ltype &)$1)), $&1_descriptor, 1|2); %} %typemap(out) void ""; %typemap(out) char [ANY] { int len = 0; while (len < $1_dim0 && $1[len]) ++len; RETVAL_STRINGL($1, len); } // This typecheck does hard checking for proper argument type. If you want // an argument to be converted from a different PHP type, you must convert // it yourself before passing it (e.g. (string)4.7 or (int)"6"). %define %php_typecheck(_type,_prec,is) %typemap(typecheck,precedence=_prec) _type, const _type & " $1 = (Z_TYPE($input) == is);" %enddef // Like %php_typecheck but allows either of two values. %define %php_typecheck2(_type,_prec,is1,is2) %typemap(typecheck,precedence=_prec) _type, const _type & " $1 = (Z_TYPE($input) == is1 || Z_TYPE($input) == is2);" %enddef %php_typecheck(int,SWIG_TYPECHECK_INTEGER,IS_LONG) %php_typecheck(unsigned int,SWIG_TYPECHECK_UINT32,IS_LONG) %php_typecheck(short,SWIG_TYPECHECK_INT16,IS_LONG) %php_typecheck(unsigned short,SWIG_TYPECHECK_UINT16,IS_LONG) %php_typecheck(long,SWIG_TYPECHECK_INT32,IS_LONG) %php_typecheck(unsigned long,SWIG_TYPECHECK_UINT32,IS_LONG) %php_typecheck(long long,SWIG_TYPECHECK_INT64,IS_LONG) %php_typecheck(unsigned long long,SWIG_TYPECHECK_UINT64,IS_LONG) %php_typecheck(signed char,SWIG_TYPECHECK_INT8,IS_LONG) %php_typecheck(unsigned char,SWIG_TYPECHECK_UINT8,IS_LONG) %php_typecheck(size_t,SWIG_TYPECHECK_SIZE,IS_LONG) %php_typecheck(enum SWIGTYPE,SWIG_TYPECHECK_INTEGER,IS_LONG) %php_typecheck2(bool,SWIG_TYPECHECK_BOOL,IS_TRUE,IS_FALSE) %php_typecheck(float,SWIG_TYPECHECK_FLOAT,IS_DOUBLE) %php_typecheck(double,SWIG_TYPECHECK_DOUBLE,IS_DOUBLE) %php_typecheck(char,SWIG_TYPECHECK_CHAR,IS_STRING) %typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char *, char *&, char [] " $1 = (Z_TYPE($input) == IS_STRING); " %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *tmp; $1 = (SWIG_ConvertPtr(&$input, (void **)&tmp, $&1_descriptor, SWIG_POINTER_NO_NULL) >= 0); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [], SWIGTYPE *const& { void *tmp; $1 = (SWIG_ConvertPtr(&$input, (void**)&tmp, $1_descriptor, 0) >= 0); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE &, SWIGTYPE && { void *tmp; $1 = (SWIG_ConvertPtr(&$input, (void**)&tmp, $1_descriptor, SWIG_POINTER_NO_NULL) >= 0); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *const& { void *tmp; $1 = (SWIG_ConvertPtr(&$input, (void**)&tmp, $*1_descriptor, 0) >= 0); } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *tmp; $1 = (SWIG_ConvertPtr(&$input, (void**)&tmp, 0, 0) >= 0); } /* Exception handling */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short %{ zend_throw_exception(NULL, "C++ $1_type exception thrown", $1); return; %} %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] %{ (void)$1; zend_throw_exception(NULL, "C++ $1_type exception thrown", 0); return; %} %typemap(throws) char * %{ zend_throw_exception(NULL, $1, 0); return; %} /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* php keywords */ %include swig-4.0.2/Lib/php/phppointers.i0000644000175000017500000000275713667507523016417 0ustar williamwilliam%define %pass_by_ref( TYPE, CONVERT_IN, CONVERT_OUT ) %typemap(in, byref=1) TYPE *REF ($*1_ltype tmp), TYPE &REF ($*1_ltype tmp) %{ /* First Check for SWIG wrapped type */ if (Z_ISNULL($input)) { $1 = 0; } else if (Z_ISREF($input)) { /* Not swig wrapped type, so we check if it's a PHP reference type */ CONVERT_IN(tmp, $*1_ltype, $input); $1 = &tmp; } else { SWIG_PHP_Error(E_ERROR, SWIG_PHP_Arg_Error_Msg($argnum, Expected a reference)); } %} %typemap(argout) TYPE *REF, TYPE &REF %{ if (Z_ISREF($input)) { CONVERT_OUT(Z_REFVAL($input), tmp$argnum); } %} %enddef %pass_by_ref( size_t, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed int, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( int, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( unsigned int, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed short, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( short, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( unsigned short, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed long, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( long, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( unsigned long, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed char, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( char, CONVERT_CHAR_IN, ZVAL_STRING ); %pass_by_ref( unsigned char, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( float, CONVERT_FLOAT_IN, ZVAL_DOUBLE ); %pass_by_ref( double, CONVERT_FLOAT_IN, ZVAL_DOUBLE ); %pass_by_ref( char *, CONVERT_CHAR_IN, ZVAL_STRING ); swig-4.0.2/Lib/php/std_vector.i0000644000175000017500000000604613667507523016213 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %include %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); void clear(); %rename(push) push_back; void push_back(const value_type& x); %extend { bool is_empty() const { return $self->empty(); } T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef bool value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef bool const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); void clear(); %rename(push) push_back; void push_back(const value_type& x); %extend { bool is_empty() const { return $self->empty(); } bool pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); bool x = self->back(); self->pop_back(); return x; } bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && ivalue.lval = (long)$1; } } //SAMFIX need to cast zval->type, what if zend-hash_find fails? etc? %typemap(varout) bool { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); if ($1 != ($1_ltype)Z_LVAL_P(z_var)) { z_var->value.lval = (long)$1; } } %typemap(varout) double, float { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); if ($1 != ($1_ltype)Z_DVAL_P(z_var)) { z_var->value.dval = (double)$1; } } %typemap(varout) char { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); char c = $1; if ($1 != Z_STRVAL_P(z_val)[0]) { ZVAL_STRING(z_var, &c); } } %typemap(varout) char * { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); const char *s1 = Z_STRVAL_P(z_var); if ((s1 == NULL) || ($1 == NULL) || strcmp(s1, $1)) { if (s1) efree(s1); if ($1) { (z_var)->value.str.val = estrdup($1); (z_var)->value.str.len = strlen($1) + 1; } else { (z_var)->value.str.val = 0; (z_var)->value.str.len = 0; } } } %typemap(varout) SWIGTYPE { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); SWIG_SetPointerZval(z_var, (void*)&$1, $&1_descriptor, 0); } %typemap(varout) SWIGTYPE [] { if($1) { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); SWIG_SetPointerZval(z_var, (void*)$1, $1_descriptor, 0); } } %typemap(varout) char [ANY] { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); const char *s1 = Z_STRVAL_P(z_var); deliberate error cos this code looks bogus to me if ((s1 == NULL) || strcmp(s1, $1)) { if ($1) { (z_var)->value.str.val = estrdup($1); (z_var)->value.str.len = strlen($1) + 1; } else { (z_var)->value.str.val = 0; (z_var)->value.str.len = 0; } } } %typemap(varout) SWIGTYPE *, SWIGTYPE &, SWIGTYPE && { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); SWIG_SetPointerZval(z_var, (void*)$1, $1_descriptor, 0); } %typemap(varout, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { zval resource; void * p = emalloc(sizeof($1)); memcpy(p, &$1, sizeof($1)); ZVAL_RES(&resource, zend_register_resource(p, swig_member_ptr)); zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &resource); } swig-4.0.2/Lib/php/utils.i0000644000175000017500000000454513667507523015201 0ustar williamwilliam %define CONVERT_BOOL_IN(lvar,t,invar) lvar = (t) zval_is_true(&invar); %enddef %define CONVERT_INT_IN(lvar,t,invar) lvar = (t) zval_get_long(&invar); %enddef %define CONVERT_LONG_LONG_IN(lvar,t,invar) switch (Z_TYPE(invar)) { case IS_DOUBLE: lvar = (t) Z_DVAL(invar); break; case IS_STRING: { char * endptr; errno = 0; lvar = (t) strtoll(Z_STRVAL(invar), &endptr, 10); if (*endptr && !errno) break; /* FALL THRU */ } default: lvar = (t) zval_get_long(&invar); } %enddef %define CONVERT_UNSIGNED_LONG_LONG_IN(lvar,t,invar) switch (Z_TYPE(invar)) { case IS_DOUBLE: lvar = (t) Z_DVAL(invar); break; case IS_STRING: { char * endptr; errno = 0; lvar = (t) strtoull(Z_STRVAL(invar), &endptr, 10); if (*endptr && !errno) break; /* FALL THRU */ } default: lvar = (t) zval_get_long(&invar); } %enddef %define CONVERT_INT_OUT(lvar,invar) lvar = (t) zval_get_long(&invar); %enddef %define CONVERT_FLOAT_IN(lvar,t,invar) lvar = (t) zval_get_double(&invar); %enddef %define CONVERT_CHAR_IN(lvar,t,invar) convert_to_string(&invar); lvar = (t) Z_STRVAL(invar)[0]; %enddef %define CONVERT_STRING_IN(lvar,t,invar) if (Z_ISNULL(invar)) { lvar = (t) 0; } else { convert_to_string(&invar); lvar = (t) Z_STRVAL(invar); } %enddef %define %pass_by_val( TYPE, CONVERT_IN ) %typemap(in) TYPE %{ CONVERT_IN($1,$1_ltype,$input); %} %typemap(in) const TYPE & ($*1_ltype temp) %{ CONVERT_IN(temp,$*1_ltype,$input); $1 = &temp; %} %typemap(directorout) TYPE %{ if (!EG(exception)) { CONVERT_IN($result, $1_ltype, *$input); } %} %typemap(directorout) const TYPE & ($*1_ltype temp) %{ if (!EG(exception)) { CONVERT_IN(temp, $*1_ltype, *$input); } $result = &temp; %} %enddef %fragment("t_output_helper","header") %{ static void t_output_helper(zval *target, zval *o) { zval tmp; if (Z_TYPE_P(target) == IS_ARRAY) { /* it's already an array, just append */ add_next_index_zval(target, o); return; } if (Z_TYPE_P(target) == IS_NULL) { /* NULL isn't refcounted */ ZVAL_COPY_VALUE(target, o); return; } ZVAL_DUP(&tmp, target); array_init(target); add_next_index_zval(target, &tmp); add_next_index_zval(target, o); } %} swig-4.0.2/Lib/php/phprun.swg0000644000175000017500000002013713667507523015720 0ustar williamwilliam/* ----------------------------------------------------------------------------- * phprun.swg * * PHP runtime library * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #include "zend.h" #include "zend_API.h" #include "zend_exceptions.h" #include "php.h" #if PHP_MAJOR_VERSION != 7 # error These bindings need PHP7 - to generate PHP5 bindings use: SWIG < 4.0.0 and swig -php5 #endif #include "ext/standard/php_string.h" #include /* for abort(), used in generated code. */ /* This indirection is to work around const correctness issues in older PHP. * FIXME: Remove for PHP7? Or might user code be using it? */ #define SWIG_ZEND_NAMED_FE(ZN, N, A) ZEND_NAMED_FE(ZN, N, A) #define SWIG_BOOL_CONSTANT(N, V) REGISTER_BOOL_CONSTANT(#N, V, CONST_CS | CONST_PERSISTENT) #define SWIG_LONG_CONSTANT(N, V) REGISTER_LONG_CONSTANT(#N, V, CONST_CS | CONST_PERSISTENT) #define SWIG_DOUBLE_CONSTANT(N, V) REGISTER_DOUBLE_CONSTANT(#N, V, CONST_CS | CONST_PERSISTENT) #define SWIG_STRING_CONSTANT(N, V) REGISTER_STRING_CONSTANT(#N, (char*)V, CONST_CS | CONST_PERSISTENT) #define SWIG_CHAR_CONSTANT(N, V) do {\ char swig_char = (V);\ REGISTER_STRINGL_CONSTANT(#N, &swig_char, 1, CONST_CS | CONST_PERSISTENT);\ } while (0) /* ZEND_CONSTANT_SET_FLAGS is new in PHP 7.3. */ #ifdef ZEND_CONSTANT_SET_FLAGS # define SWIG_ZEND_CONSTANT_SET_FLAGS ZEND_CONSTANT_SET_FLAGS #else # define SWIG_ZEND_CONSTANT_SET_FLAGS(C, F, N) do { (C)->flags = (F); (C)->module_number = (N); } while (0) #endif #ifdef __cplusplus } #endif #define SWIG_fail goto fail static const char *default_error_msg = "Unknown error occurred"; static int default_error_code = E_ERROR; #define SWIG_PHP_Arg_Error_Msg(argnum,extramsg) "Error in argument " #argnum " "#extramsg #define SWIG_PHP_Error(code,msg) do { SWIG_ErrorCode() = code; SWIG_ErrorMsg() = msg; SWIG_fail; } while (0) #define SWIG_contract_assert(expr,msg) \ if (!(expr) ) { zend_printf("Contract Assert Failed %s\n",msg ); } else /* Standard SWIG API */ #define SWIG_GetModule(clientdata) SWIG_Php_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_Php_SetModule(pointer, *(int*)clientdata) /* used to wrap returned objects in so we know whether they are newobject and need freeing, or not */ typedef struct { void * ptr; int newobject; } swig_object_wrapper; #define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) static void SWIG_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject) { /* * First test for Null pointers. Return those as PHP native NULL */ if (!ptr ) { ZVAL_NULL(z); return; } if (type->clientdata) { swig_object_wrapper *value; if (! (*(int *)(type->clientdata))) zend_error(E_ERROR, "Type: %s failed to register with zend",type->name); value=(swig_object_wrapper *)emalloc(sizeof(swig_object_wrapper)); value->ptr=ptr; value->newobject=(newobject & 1); if ((newobject & 2) == 0) { /* Just register the pointer as a resource. */ ZVAL_RES(z, zend_register_resource(value, *(int *)(type->clientdata))); } else { /* * Wrap the resource in an object, the resource will be accessible * via the "_cPtr" member. This is currently only used by * directorin typemaps. */ zval resource; zend_class_entry *ce = NULL; const char *type_name = type->name+3; /* +3 so: _p_Foo -> Foo */ size_t type_name_len; const char * p; HashTable * ht; /* Namespace__Foo -> Foo */ /* FIXME: ugly and goes wrong for classes with __ in their names. */ while ((p = strstr(type_name, "__")) != NULL) { type_name = p + 2; } type_name_len = strlen(type_name); ZVAL_RES(&resource, zend_register_resource(value, *(int *)(type->clientdata))); if (SWIG_PREFIX_LEN > 0) { zend_string * classname = zend_string_alloc(SWIG_PREFIX_LEN + type_name_len, 0); memcpy(classname->val, SWIG_PREFIX, SWIG_PREFIX_LEN); memcpy(classname->val + SWIG_PREFIX_LEN, type_name, type_name_len); ce = zend_lookup_class(classname); zend_string_release(classname); } else { zend_string * classname = zend_string_init(type_name, type_name_len, 0); ce = zend_lookup_class(classname); zend_string_release(classname); } if (ce == NULL) { /* class does not exist */ ce = zend_standard_class_def; } ALLOC_HASHTABLE(ht); zend_hash_init(ht, 1, NULL, NULL, 0); zend_hash_str_update(ht, "_cPtr", sizeof("_cPtr") - 1, &resource); object_and_properties_init(z, ce, ht); } return; } zend_error(E_ERROR, "Type: %s not registered with zend",type->name); } /* This pointer conversion routine takes the native pointer p (along with its type name) and converts it by calling appropriate casting functions according to ty. The resultant pointer is returned, or NULL is returned if the pointer can't be cast. Sadly PHP has no API to find a type name from a type id, only from an instance of a resource of the type id, so we have to pass type_name as well. The two functions which might call this are: SWIG_ConvertResourcePtr which gets the type name from the resource and the registered zend destructors for which we have one per type each with the type name hard wired in. */ static void * SWIG_ConvertResourceData(void * p, const char *type_name, swig_type_info *ty) { swig_cast_info *tc; void *result = 0; if (!ty) { /* They don't care about the target type, so just pass on the pointer! */ return p; } if (! type_name) { /* can't convert p to ptr type ty if we don't know what type p is */ return NULL; } /* convert and cast p from type_name to ptr as ty. */ tc = SWIG_TypeCheck(type_name, ty); if (tc) { int newmemory = 0; result = SWIG_TypeCast(tc, p, &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } return result; } /* This function returns a pointer of type ty by extracting the pointer and type info from the resource in z. z must be a resource. If it fails, NULL is returned. It uses SWIG_ConvertResourceData to do the real work. */ static void * SWIG_ConvertResourcePtr(zval *z, swig_type_info *ty, int flags) { swig_object_wrapper *value; void *p; const char *type_name; if (Z_RES_TYPE_P(z) == -1) return NULL; value = (swig_object_wrapper *) Z_RES_VAL_P(z); if (flags & SWIG_POINTER_DISOWN) { value->newobject = 0; } p = value->ptr; type_name=zend_rsrc_list_get_rsrc_type(Z_RES_P(z)); return SWIG_ConvertResourceData(p, type_name, ty); } /* We allow passing of a RESOURCE pointing to the object or an OBJECT whose _cPtr is a resource pointing to the object */ static int SWIG_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags) { if (z == NULL) { *ptr = 0; return 0; } switch (Z_TYPE_P(z)) { case IS_OBJECT: { HashTable * ht = Z_OBJ_HT_P(z)->get_properties(z); if (ht) { zval * _cPtr = zend_hash_str_find(ht, "_cPtr", sizeof("_cPtr") - 1); if (_cPtr) { if (Z_TYPE_P(_cPtr) == IS_INDIRECT) { _cPtr = Z_INDIRECT_P(_cPtr); } if (Z_TYPE_P(_cPtr) == IS_RESOURCE) { *ptr = SWIG_ConvertResourcePtr(_cPtr, ty, flags); return (*ptr == NULL ? -1 : 0); } } } break; } case IS_RESOURCE: *ptr = SWIG_ConvertResourcePtr(z, ty, flags); return (*ptr == NULL ? -1 : 0); case IS_NULL: *ptr = 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } return -1; } static const char const_name[] = "swig_runtime_data_type_pointer"; static swig_module_info *SWIG_Php_GetModule() { zval *pointer = zend_get_constant_str(const_name, sizeof(const_name) - 1); if (pointer) { if (Z_TYPE_P(pointer) == IS_LONG) { return (swig_module_info *) pointer->value.lval; } } return NULL; } static void SWIG_Php_SetModule(swig_module_info *pointer, int module_number) { REGISTER_LONG_CONSTANT(const_name, (long) pointer, CONST_CS | CONST_PERSISTENT); } swig-4.0.2/Lib/php/std_common.i0000644000175000017500000000044213667507523016173 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; swig-4.0.2/Lib/php/typemaps.i0000644000175000017500000002321713667507523015700 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i. * * SWIG Typemap library for PHP. * * This library provides standard typemaps for modifying SWIG's behavior. * With enough entries in this file, I hope that very few people actually * ever need to write a typemap. * * Define macros to define the following typemaps: * * TYPE *INPUT. Argument is passed in as native variable by value. * TYPE *OUTPUT. Argument is returned as an array from the function call. * TYPE *INOUT. Argument is passed in by value, and out as part of returned list * TYPE *REFERENCE. Argument is passed in as native variable with value * semantics. Variable value is changed with result. * Use like this: * int foo(int *REFERENCE); * * $a = 0; * $rc = foo($a); * * Even though $a looks like it's passed by value, * its value can be changed by foo(). * ----------------------------------------------------------------------------- */ %define BOOL_TYPEMAP(TYPE) %typemap(in) TYPE *INPUT(TYPE temp), TYPE &INPUT(TYPE temp) %{ convert_to_boolean(&$input); temp = (Z_TYPE($input) == IS_TRUE); $1 = &temp; %} %typemap(argout) TYPE *INPUT, TYPE &INPUT ""; %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp), TYPE &OUTPUT(TYPE temp) "$1 = &temp;"; %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT, TYPE &OUTPUT { zval o; ZVAL_BOOL(&o, temp$argnum); t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (TYPE lvalue), TYPE &REFERENCE (TYPE lvalue) %{ convert_to_boolean($input); lvalue = (Z_TYPE_P($input) == IS_TRUE); $1 = &lvalue; %} %typemap(argout) TYPE *REFERENCE, TYPE &REFERENCE %{ ZVAL_BOOL(&$arg, lvalue$argnum ? true : false); %} %enddef %define DOUBLE_TYPEMAP(TYPE) %typemap(in) TYPE *INPUT(TYPE temp), TYPE &INPUT(TYPE temp) %{ temp = (TYPE) zval_get_double(&$input); $1 = &temp; %} %typemap(argout) TYPE *INPUT, TYPE &INPUT ""; %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp), TYPE &OUTPUT(TYPE temp) "$1 = &temp;"; %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT, TYPE &OUTPUT { zval o; ZVAL_DOUBLE(&o, temp$argnum); t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (TYPE dvalue), TYPE &REFERENCE (TYPE dvalue) %{ dvalue = (TYPE) zval_get_double(&$input); $1 = &dvalue; %} %typemap(argout) TYPE *REFERENCE, TYPE &REFERENCE %{ ZVAL_DOUBLE(&$arg, (double)(lvalue$argnum)); %} %enddef %define INT_TYPEMAP(TYPE) %typemap(in) TYPE *INPUT(TYPE temp), TYPE &INPUT(TYPE temp) %{ temp = (TYPE) zval_get_long(&$input); $1 = &temp; %} %typemap(argout) TYPE *INPUT, TYPE &INPUT ""; %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp), TYPE &OUTPUT(TYPE temp) "$1 = &temp;"; %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT, TYPE &OUTPUT { zval o; ZVAL_LONG(&o, temp$argnum); t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (TYPE lvalue), TYPE &REFERENCE (TYPE lvalue) %{ lvalue = (TYPE) zval_get_long(&$input); $1 = &lvalue; %} %typemap(argout) TYPE *REFERENCE, TYPE &REFERENCE %{ ZVAL_LONG(&$arg, (long)(lvalue$argnum)); %} %enddef BOOL_TYPEMAP(bool); DOUBLE_TYPEMAP(float); DOUBLE_TYPEMAP(double); INT_TYPEMAP(int); INT_TYPEMAP(short); INT_TYPEMAP(long); INT_TYPEMAP(unsigned int); INT_TYPEMAP(unsigned short); INT_TYPEMAP(unsigned long); INT_TYPEMAP(unsigned char); INT_TYPEMAP(signed char); INT_TYPEMAP(long long); %typemap(argout,fragment="t_output_helper") long long *OUTPUT { zval o; if ((long long)LONG_MIN <= temp$argnum && temp$argnum <= (long long)LONG_MAX) { ZVAL_LONG(&o, (long)temp$argnum); } else { char temp[256]; sprintf(temp, "%lld", (long long)temp$argnum); ZVAL_STRING(&o, temp); } t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (long long lvalue) %{ CONVERT_LONG_LONG_IN(lvalue, long long, $input) $1 = &lvalue; %} %typemap(argout) long long *REFERENCE %{ if ((long long)LONG_MIN <= lvalue$argnum && lvalue$argnum <= (long long)LONG_MAX) { ZVAL_LONG(&$arg, (long)temp$argnum); } else { char temp[256]; sprintf(temp, "%lld", (long long)lvalue$argnum); ZVAL_STRING(&$arg, temp); } %} %typemap(argout) long long &OUTPUT %{ if ((long long)LONG_MIN <= *arg$argnum && *arg$argnum <= (long long)LONG_MAX) { ZVAL_LONG($result, (long)(*arg$argnum)); } else { char temp[256]; sprintf(temp, "%lld", (long long)(*arg$argnum)); ZVAL_STRING($result, temp); } %} INT_TYPEMAP(unsigned long long); %typemap(argout,fragment="t_output_helper") unsigned long long *OUTPUT { zval o; if (temp$argnum <= (unsigned long long)LONG_MAX) { ZVAL_LONG(&o, temp$argnum); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)temp$argnum); ZVAL_STRING(&o, temp); } t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (unsigned long long lvalue) %{ CONVERT_UNSIGNED_LONG_LONG_IN(lvalue, unsigned long long, $input) $1 = &lvalue; %} %typemap(argout) unsigned long long *REFERENCE %{ if (lvalue$argnum <= (unsigned long long)LONG_MAX) { ZVAL_LONG($arg, (long)(lvalue$argnum)); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)lvalue$argnum); ZVAL_STRING((*$arg), temp); } %} %typemap(argout) unsigned long long &OUTPUT %{ if (*arg$argnum <= (unsigned long long)LONG_MAX) { ZVAL_LONG($result, (long)(*arg$argnum)); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)(*arg$argnum)); ZVAL_STRING($result, temp); } %} %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) signed char *INOUT = signed char *INPUT; %typemap(in) bool &INOUT = bool *INPUT; %typemap(in) float &INOUT = float *INPUT; %typemap(in) double &INOUT = double *INPUT; %typemap(in) int &INOUT = int *INPUT; %typemap(in) short &INOUT = short *INPUT; %typemap(in) long &INOUT = long *INPUT; %typemap(in) long long &INOUT = long long *INPUT; %typemap(in) long long &INPUT = long long *INPUT; %typemap(in) unsigned &INOUT = unsigned *INPUT; %typemap(in) unsigned short &INOUT = unsigned short *INPUT; %typemap(in) unsigned long &INOUT = unsigned long *INPUT; %typemap(in) unsigned char &INOUT = unsigned char *INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long *INPUT; %typemap(in) unsigned long long &INPUT = unsigned long long *INPUT; %typemap(in) signed char &INOUT = signed char *INPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT= double *OUTPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT= long *OUTPUT; %typemap(argout) long long *INOUT= long long *OUTPUT; %typemap(argout) unsigned short *INOUT= unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) signed char *INOUT = signed char *OUTPUT; %typemap(argout) bool &INOUT = bool *OUTPUT; %typemap(argout) float &INOUT = float *OUTPUT; %typemap(argout) double &INOUT= double *OUTPUT; %typemap(argout) int &INOUT = int *OUTPUT; %typemap(argout) short &INOUT = short *OUTPUT; %typemap(argout) long &INOUT= long *OUTPUT; %typemap(argout) long long &INOUT= long long *OUTPUT; %typemap(argout) unsigned short &INOUT= unsigned short *OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char *OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long *OUTPUT; %typemap(argout) signed char &INOUT = signed char *OUTPUT; %typemap(in) char INPUT[ANY] ( char temp[$1_dim0] ) %{ convert_to_string(&$input); strncpy(temp, Z_STRVAL($input), $1_dim0); $1 = temp; %} %typemap(in,numinputs=0) char OUTPUT[ANY] ( char temp[$1_dim0] ) "$1 = temp;"; %typemap(argout,fragment="t_output_helper") char OUTPUT[ANY] { zval o; ZVAL_STRINGL(&o, temp$argnum, $1_dim0); t_output_helper($result, &o); } %typemap(in,numinputs=0) void **OUTPUT (int force), void *&OUTPUT (int force) %{ /* If they pass NULL by reference, make it into a void* This bit should go in arginit if arginit support init-ing scripting args */ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0) { /* So... we didn't get a ref or ptr, but we'll accept NULL by reference */ if (!(Z_ISREF($input) && Z_ISNULL_P(Z_REFVAL($input)))) { /* wasn't a pre/ref/thing, OR anything like an int thing */ SWIG_PHP_Error(E_ERROR, "Type error in argument $arg of $symname."); } } force=0; if (arg1==NULL) { #ifdef __cplusplus ptr=new $*1_ltype(); #else ptr=($*1_ltype) calloc(1,sizeof($*1_ltype)); #endif $1=&ptr; /* have to passback arg$arg too */ force=1; } %} %typemap(argout) void **OUTPUT, void *&OUTPUT %{ if (force$argnum) { /* pass back arg$argnum through params ($arg) if we can */ if (!Z_ISREF($arg)) { SWIG_PHP_Error(E_WARNING, "Parameter $argnum of $symname wasn't passed by reference"); } else { SWIG_SetPointerZval(*$arg, (void *) ptr$argnum, $*1_descriptor, 1); } } %} swig-4.0.2/Lib/php/std_pair.i0000644000175000017500000000140513667507523015636 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.2/Lib/php/stl.i0000644000175000017500000000044313667507523014634 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/php/const.i0000644000175000017500000000262213667507523015161 0ustar williamwilliam/* ----------------------------------------------------------------------------- * const.i * * Typemaps for constants * ----------------------------------------------------------------------------- */ %typemap(consttab) int, unsigned int, short, unsigned short, long, unsigned long, unsigned char, signed char, enum SWIGTYPE "SWIG_LONG_CONSTANT($symname, ($1_type)$value);"; %typemap(consttab) bool "SWIG_BOOL_CONSTANT($symname, ($1_type)$value);"; %typemap(consttab) float, double "SWIG_DOUBLE_CONSTANT($symname, $value);"; %typemap(consttab) char "SWIG_CHAR_CONSTANT($symname, $value);"; %typemap(consttab) char *, const char *, char [], const char [] "SWIG_STRING_CONSTANT($symname, $value);"; %typemap(consttab) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { zend_constant c; SWIG_SetPointerZval(&c.value, (void*)$value, $1_descriptor, 0); zval_copy_ctor(&c.value); c.name = zend_string_init("$symname", sizeof("$symname") - 1, 0); SWIG_ZEND_CONSTANT_SET_FLAGS(&c, CONST_CS, module_number); zend_register_constant(&c); } /* Handled as a global variable. */ %typemap(consttab) SWIGTYPE (CLASS::*) ""; swig-4.0.2/Lib/php/std_string.i0000644000175000017500000000515513667507523016217 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string types * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ %include %{ #include %} namespace std { %naturalvar string; class string; %typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) string, const string& %{ $1 = (Z_TYPE($input) == IS_STRING) ? 1 : 0; %} %typemap(in) string %{ convert_to_string(&$input); $1.assign(Z_STRVAL($input), Z_STRLEN($input)); %} %typemap(directorout) string %{ if (!EG(exception)) { convert_to_string($input); $result.assign(Z_STRVAL_P($input), Z_STRLEN_P($input)); } %} %typemap(out) string %{ ZVAL_STRINGL($result, $1.data(), $1.size()); %} %typemap(directorin) string, const string& %{ ZVAL_STRINGL($input, $1.data(), $1.size()); %} %typemap(out) const string & %{ ZVAL_STRINGL($result, $1->data(), $1->size()); %} %typemap(throws) string, const string& %{ zend_throw_exception(NULL, $1.c_str(), 0); return; %} %typemap(in) const string & ($*1_ltype temp) %{ convert_to_string(&$input); temp.assign(Z_STRVAL($input), Z_STRLEN($input)); $1 = &temp; %} /* These next two handle a function which takes a non-const reference to * a std::string and modifies the string. */ %typemap(in,byref=1) string & ($*1_ltype temp) %{ { zval * p = Z_ISREF($input) ? Z_REFVAL($input) : &$input; convert_to_string(p); temp.assign(Z_STRVAL_P(p), Z_STRLEN_P(p)); $1 = &temp; } %} %typemap(directorout) string & ($*1_ltype *temp) %{ if (!EG(exception)) { convert_to_string($input); temp = new $*1_ltype(Z_STRVAL_P($input), Z_STRLEN_P($input)); swig_acquire_ownership(temp); $result = temp; } %} %typemap(argout) string & %{ if (Z_ISREF($input)) { ZVAL_STRINGL(Z_REFVAL($input), $1->data(), $1->size()); } %} /* SWIG will apply the non-const typemap above to const string& without * this more specific typemap. */ %typemap(argout) const string & ""; } swig-4.0.2/Lib/php/std_map.i0000644000175000017500000000515213667507523015463 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } bool is_empty() const { return self->empty(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.2/Lib/php/phpinit.swg0000644000175000017500000000126713667507523016062 0ustar williamwilliam /* ------------------------------------------------------------ * The start of the PHP initialization function * ------------------------------------------------------------ */ %insert(init) "swiginit.swg" %init %{ SWIG_php_minit { SWIG_InitializeModule((void*)&module_number); %} %fragment("swig_php_init_member_ptr2", "header") %{ #define SWIG_MEMBER_PTR "CLASS::*" static void swig_member_ptr_dtor(zend_resource *res) { efree(res->ptr); } static int swig_member_ptr = 0; %} %fragment("swig_php_init_member_ptr", "init", fragment="swig_php_init_member_ptr2") %{ swig_member_ptr = zend_register_list_destructors_ex(swig_member_ptr_dtor, NULL, SWIG_MEMBER_PTR, module_number); %} swig-4.0.2/Lib/php/factory.i0000644000175000017500000000604513667507523015505 0ustar williamwilliam/* Implement a more natural wrap for factory methods, for example, if you have: ---- geometry.h -------- struct Geometry { enum GeomType{ POINT, CIRCLE }; virtual ~Geometry() {} virtual int draw() = 0; // // Factory method for all the Geometry objects // static Geometry *create(GeomType i); }; struct Point : Geometry { int draw() { return 1; } double width() { return 1.0; } }; struct Circle : Geometry { int draw() { return 2; } double radius() { return 1.5; } }; // // Factory method for all the Geometry objects // Geometry *Geometry::create(GeomType type) { switch (type) { case POINT: return new Point(); case CIRCLE: return new Circle(); default: return 0; } } ---- geometry.h -------- You can use the %factory with the Geometry::create method as follows: %newobject Geometry::create; %factory(Geometry *Geometry::create, Point, Circle); %include "geometry.h" and Geometry::create will return a 'Point' or 'Circle' instance instead of the plain 'Geometry' type. For example, in python: circle = Geometry.create(Geometry.CIRCLE) r = circle.radius() where circle is a Circle proxy instance. NOTES: remember to fully qualify all the type names and don't use %factory inside a namespace declaration, ie, instead of namespace Foo { %factory(Geometry *Geometry::create, Point, Circle); } use %factory(Foo::Geometry *Foo::Geometry::create, Foo::Point, Foo::Circle); */ /* for loop for macro with one argument */ %define %_formacro_1(macro, arg1,...)macro(arg1) #if #__VA_ARGS__ != "__fordone__" %_formacro_1(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with one argument */ %define %formacro_1(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef %define %formacro(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef /* for loop for macro with two arguments */ %define %_formacro_2(macro, arg1, arg2, ...)macro(arg1, arg2) #if #__VA_ARGS__ != "__fordone__" %_formacro_2(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with two arguments */ %define %formacro_2(macro,...)%_formacro_2(macro, __VA_ARGS__, __fordone__)%enddef %define %_factory_dispatch(Type) if (!dcast) { Type *dobj = dynamic_cast($1); if (dobj) { dcast = 1; SWIG_SetPointerZval(return_value, SWIG_as_voidptr(dobj),$descriptor(Type *), $owner); } }%enddef %define %factory(Method,Types...) %typemap(out) Method { int dcast = 0; %formacro(%_factory_dispatch, Types) if (!dcast) { SWIG_SetPointerZval(return_value, SWIG_as_voidptr($1),$descriptor, $owner); } }%enddef swig-4.0.2/Lib/cpointer.i0000644000175000017500000000673713667507523015102 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cpointer.i * * SWIG library file containing macros that can be used to manipulate simple * pointer objects. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %pointer_class(type,name) * * Places a simple proxy around a simple type like 'int', 'float', or whatever. * The proxy provides this interface: * * class type { * public: * type(); * ~type(); * type value(); * void assign(type value); * }; * * Example: * * %pointer_class(int, intp); * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = intp() * >>> a.assign(10) * >>> a.value() * 10 * >>> b = intp() * >>> b.assign(20) * >>> print add(a,b) * 30 * * As a general rule, this macro should not be used on class/structures that * are already defined in the interface. * ----------------------------------------------------------------------------- */ %define %pointer_class(TYPE, NAME) %{ typedef TYPE NAME; %} typedef struct { } NAME; %extend NAME { #ifdef __cplusplus NAME() { return new TYPE(); } ~NAME() { if ($self) delete $self; } #else NAME() { return (TYPE *) calloc(1,sizeof(TYPE)); } ~NAME() { if ($self) free($self); } #endif } %extend NAME { void assign(TYPE value) { *$self = value; } TYPE value() { return *$self; } TYPE * cast() { return $self; } static NAME * frompointer(TYPE *t) { return (NAME *) t; } } %types(NAME = TYPE); %enddef /* ----------------------------------------------------------------------------- * %pointer_functions(type,name) * * Create functions for allocating/deallocating pointers. This can be used * if you don't want to create a proxy class or if the pointer is complex. * * %pointer_functions(int, intp) * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = copy_intp(10) * >>> intp_value(a) * 10 * >>> b = new_intp() * >>> intp_assign(b,20) * >>> print add(a,b) * 30 * >>> delete_intp(a) * >>> delete_intp(b) * * ----------------------------------------------------------------------------- */ %define %pointer_functions(TYPE,NAME) %{ static TYPE *new_##NAME() { %} #ifdef __cplusplus %{ return new TYPE(); %} #else %{ return (TYPE *) calloc(1,sizeof(TYPE)); %} #endif %{} static TYPE *copy_##NAME(TYPE value) { %} #ifdef __cplusplus %{ return new TYPE(value); %} #else %{ TYPE *obj = (TYPE *) calloc(1,sizeof(TYPE)); *obj = value; return obj; %} #endif %{} static void delete_##NAME(TYPE *obj) { %} #ifdef __cplusplus %{ if (obj) delete obj; %} #else %{ if (obj) free(obj); %} #endif %{} static void NAME ##_assign(TYPE *obj, TYPE value) { *obj = value; } static TYPE NAME ##_value(TYPE *obj) { return *obj; } %} TYPE *new_##NAME(); TYPE *copy_##NAME(TYPE value); void delete_##NAME(TYPE *obj); void NAME##_assign(TYPE *obj, TYPE value); TYPE NAME##_value(TYPE *obj); %enddef /* ----------------------------------------------------------------------------- * %pointer_cast(type1,type2,name) * * Generates a pointer casting function. * ----------------------------------------------------------------------------- */ %define %pointer_cast(TYPE1,TYPE2,NAME) %inline %{ TYPE2 NAME(TYPE1 x) { return (TYPE2) x; } %} %enddef swig-4.0.2/Lib/wchar.i0000644000175000017500000000046513667507523014353 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wchar.i * ----------------------------------------------------------------------------- */ /* wchar_t not supported, unless otherwise specified in the target language. */ #if defined(SWIG_WCHAR) #undef SWIG_WCHAR #endif swig-4.0.2/Lib/clisp/0000755000175000017500000000000013667507523014202 5ustar williamwilliamswig-4.0.2/Lib/clisp/clisp.swg0000644000175000017500000000163713667507523016045 0ustar williamwilliam/* ----------------------------------------------------------------------------- * clisp.swg * ----------------------------------------------------------------------------- */ /* Define a C preprocessor symbol that can be used in interface files to distinguish between the SWIG language modules. */ #define SWIG_CLISP /* Typespecs for basic types. */ %typemap(in) void "NIL"; %typemap(in) char "character"; %typemap(in) char * "ffi:c-string"; %typemap(in) unsigned char "ffi:uchar"; %typemap(in) signed char "ffi:char"; %typemap(in) short "ffi:short"; %typemap(in) signed short "ffi:short"; %typemap(in) unsigned short "ffi:ushort"; %typemap(in) int "ffi:int"; %typemap(in) signed int "ffi:int"; %typemap(in) unsigned int "ffi:uint"; %typemap(in) long "ffi:long"; %typemap(in) signed long "ffi:long"; %typemap(in) unsigned long "ffi:ulong"; %typemap(in) float "SINGLE-FLOAT"; %typemap(in) double "DOUBLE-FLOAT"; swig-4.0.2/Lib/tcl/0000755000175000017500000000000013667507523013652 5ustar williamwilliamswig-4.0.2/Lib/tcl/std_deque.i0000644000175000017500000000003413667507523015776 0ustar williamwilliam%include swig-4.0.2/Lib/tcl/tclresult.i0000644000175000017500000000125413667507523016047 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclresult.i * ----------------------------------------------------------------------------- */ /* int Tcl_Result Makes the integer return code of a function the return value of a SWIG generated wrapper function. For example : int foo() { ... do stuff ... return TCL_OK; } could be wrapped as follows : %include typemaps.i %apply int Tcl_Result { int foo }; int foo(); */ // If return code is a Tcl_Result, simply pass it on %typemap(out) int Tcl_Result { return $1; } swig-4.0.2/Lib/tcl/cpointer.i0000644000175000017500000000004113667507523015642 0ustar williamwilliam%include swig-4.0.2/Lib/tcl/tcl8.swg0000644000175000017500000000273413667507523015254 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tcl8.swg * * Tcl configuration module. * ----------------------------------------------------------------------------- */ /* ------------------------------------------------------------ * Inner macros * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The runtime part * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Special user directives * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Typemap specializations * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Warnings for Tcl keywords * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Tcl initialization function * ------------------------------------------------------------ */ %include swig-4.0.2/Lib/tcl/tclmacros.swg0000644000175000017500000000004613667507523016363 0ustar williamwilliam%include swig-4.0.2/Lib/tcl/tclprimtypes.swg0000644000175000017500000001327213667507523017140 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header") { %define_as(SWIG_From_dec(bool), Tcl_NewBooleanObj) } %fragment(SWIG_AsVal_frag(bool),"header") { SWIGINTERN int SWIG_AsVal_dec(bool)(Tcl_Obj *obj, bool *val) { int v; if (Tcl_GetBooleanFromObj(0, obj, &v) == TCL_OK) { if (val) *val = v ? true : false; return SWIG_OK; } return SWIG_TypeError; } } /* long */ %fragment(SWIG_From_frag(long),"header", fragment="") { SWIGINTERNINLINE Tcl_Obj* SWIG_From_dec(long)(long value) { if (((long) INT_MIN <= value) && (value <= (long) INT_MAX)) { return Tcl_NewIntObj(%numeric_cast(value,int)); } else { return Tcl_NewLongObj(value); } } } %fragment(SWIG_AsVal_frag(long),"header") { SWIGINTERN int SWIG_AsVal_dec(long)(Tcl_Obj *obj, long* val) { long v; if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { if (val) *val = (long) v; return SWIG_OK; } return SWIG_TypeError; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long), fragment="") { SWIGINTERNINLINE Tcl_Obj* SWIG_From_dec(unsigned long)(unsigned long value) { if (value < (unsigned long) LONG_MAX) { return SWIG_From(long)(%numeric_cast(value, long)); } else { char temp[256]; sprintf(temp, "%lu", value); return Tcl_NewStringObj(temp,-1); } } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(Tcl_Obj *obj, unsigned long *val) { long v; if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { if (v >= 0) { if (val) *val = (unsigned long) v; return SWIG_OK; } /* If v is negative, then this could be a negative number, or an unsigned value which doesn't fit in a signed long, so try to get it as a string so we can distinguish these cases. */ } { int len = 0; const char *nptr = Tcl_GetStringFromObj(obj, &len); if (nptr && len > 0) { char *endptr; unsigned long v; if (*nptr == '-') return SWIG_OverflowError; errno = 0; v = strtoul(nptr, &endptr,0); if (nptr[0] == '\0' || *endptr != '\0') return SWIG_TypeError; if (v == ULONG_MAX && errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_OK; } } } } return SWIG_TypeError; } } /* long long */ %fragment(SWIG_From_frag(long long),"header", fragment=SWIG_From_frag(long), fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE Tcl_Obj* SWIG_From_dec(long long)(long long value) { if (((long long) LONG_MIN <= value) && (value <= (long long) LONG_MAX)) { return SWIG_From(long)(%numeric_cast(value,long)); } else { char temp[256]; sprintf(temp, "%lld", value); return Tcl_NewStringObj(temp,-1); } } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(Tcl_Obj *obj, long long *val) { long v; if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { if (val) *val = v; return SWIG_OK; } else { int len = 0; const char *nptr = Tcl_GetStringFromObj(obj, &len); if (nptr && len > 0) { char *endptr; long long v; errno = 0; v = strtoll(nptr, &endptr,0); if (nptr[0] == '\0' || *endptr != '\0') return SWIG_TypeError; if ((v == LLONG_MAX || v == LLONG_MIN) && errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_OK; } } } } return SWIG_TypeError; } %#endif } /* unsigned long long */ %fragment(SWIG_From_frag(unsigned long long),"header", fragment=SWIG_From_frag(long long), fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE Tcl_Obj* SWIG_From_dec(unsigned long long)(unsigned long long value) { if (value < (unsigned long long) LONG_MAX) { return SWIG_From(long long)(%numeric_cast(value, long long)); } else { char temp[256]; sprintf(temp, "%llu", value); return Tcl_NewStringObj(temp,-1); } } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment=SWIG_AsVal_frag(unsigned long), fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(Tcl_Obj *obj, unsigned long long *val) { long v; if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { if (val) *val = (unsigned long) v; return SWIG_OK; } else { int len = 0; const char *nptr = Tcl_GetStringFromObj(obj, &len); if (nptr && len > 0) { char *endptr; unsigned long long v; if (*nptr == '-') return SWIG_OverflowError; errno = 0; v = strtoull(nptr, &endptr,0); if (nptr[0] == '\0' || *endptr != '\0') return SWIG_TypeError; if (v == ULLONG_MAX && errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_OK; } } } } return SWIG_TypeError; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { %define_as(SWIG_From(double), Tcl_NewDoubleObj) } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(Tcl_Obj *obj, double *val) { double v; if (Tcl_GetDoubleFromObj(0, obj, &v) == TCL_OK) { if (val) *val = v; return SWIG_OK; } return SWIG_TypeError; } } swig-4.0.2/Lib/tcl/std_vector.i0000644000175000017500000003750413667507523016211 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // Tcl as much as possible, namely, to allow the user to pass and // be returned Tcl lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector< T >), f(const std::vector< T >&), f(const std::vector< T >*): // the parameter being read-only, either a Tcl list or a // previously wrapped std::vector< T > can be passed. // -- f(std::vector< T >&), f(std::vector< T >*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector< T > f(): // the vector is returned by copy; therefore, a Tcl list of T:s // is returned which is most easily used in other Tcl functions procs // -- std::vector< T >& f(), std::vector< T >* f(), const std::vector< T >& f(), // const std::vector< T >* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %fragment(""); %fragment(""); %fragment(""); %{ #include Tcl_Obj* SwigString_FromString(const std::string &s) { return Tcl_NewStringObj(s.data(), (int)s.length()); } int Tcl_GetBoolFromObj(Tcl_Interp *interp, Tcl_Obj *o, bool *val) { int v; int res = Tcl_GetBooleanFromObj(interp, o, &v); if (res == TCL_OK) { *val = v ? true : false; } return res; } int SwigString_AsString(Tcl_Interp *interp, Tcl_Obj *o, std::string *val) { int len; const char* temp = Tcl_GetStringFromObj(o, &len); if (temp == NULL) return TCL_ERROR; val->assign(temp, len); return TCL_OK; } // behaviour of this is such as the real Tcl_GetIntFromObj template int SwigInt_As(Tcl_Interp *interp, Tcl_Obj *o, Type *val) { int temp_val, return_val; return_val = Tcl_GetIntFromObj(interp, o, &temp_val); *val = (Type) temp_val; return return_val; } // behaviour of this is such as the real Tcl_GetDoubleFromObj template int SwigDouble_As(Tcl_Interp *interp, Tcl_Obj *o, Type *val) { int return_val; double temp_val; return_val = Tcl_GetDoubleFromObj(interp, o, &temp_val); *val = (Type) temp_val; return return_val; } %} // exported class namespace std { template class vector { %typemap(in) vector< T > (std::vector< T > *v) { Tcl_Obj **listobjv; int nitems; int i; T* temp; if (SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0){ $1 = *v; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, \ &nitems, &listobjv) == TCL_ERROR) return TCL_ERROR; $1 = std::vector< T >(); for (i = 0; i < nitems; i++) { if ((SWIG_ConvertPtr(listobjv[i],(void **) &temp, $descriptor(T *),0)) != 0) { char message[] = "list of " #T " expected"; Tcl_SetResult(interp, message, TCL_VOLATILE); return TCL_ERROR; } $1.push_back(*temp); } } } %typemap(in) const vector< T >* (std::vector< T > *v, std::vector< T > w), const vector< T >& (std::vector< T > *v, std::vector< T > w) { Tcl_Obj **listobjv; int nitems; int i; T* temp; if(SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0) { $1 = v; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) return TCL_ERROR; w = std::vector< T >(); for (i = 0; i < nitems; i++) { if ((SWIG_ConvertPtr(listobjv[i],(void **) &temp, $descriptor(T *),0)) != 0) { char message[] = "list of " #T " expected"; Tcl_SetResult(interp, message, TCL_VOLATILE); return TCL_ERROR; } w.push_back(*temp); } $1 = &w; } } %typemap(out) vector< T > { for (unsigned int i=0; i<$1.size(); i++) { T* ptr = new T((($1_type &)$1)[i]); Tcl_ListObjAppendElement(interp, $result, \ SWIG_NewInstanceObj(ptr, $descriptor(T *), 0)); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector< T > { Tcl_Obj **listobjv; int nitems; T* temp; std::vector< T > *v; if(SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0) { /* wrapped vector */ $1 = 1; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) $1 = 0; else if (nitems == 0) $1 = 1; //check the first value to see if it is of correct type else if ((SWIG_ConvertPtr(listobjv[0], (void **) &temp, $descriptor(T *),0)) != 0) $1 = 0; else $1 = 1; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector< T >&, const vector< T >* { Tcl_Obj **listobjv; int nitems; T* temp; std::vector< T > *v; if(SWIG_ConvertPtr($input, (void **) &v, \ $1_descriptor, 0) == 0){ /* wrapped vector */ $1 = 1; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) $1 = 0; else if (nitems == 0) $1 = 1; //check the first value to see if it is of correct type else if ((SWIG_ConvertPtr(listobjv[0], (void **) &temp, $descriptor(T *),0)) != 0) $1 = 0; else $1 = 1; } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(const T& x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T& get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i<0) i += size; if (i>=0 && isize()); if (i<0) i+= size; if (i>=0 && i class vector< T > { %typemap(in) vector< T > (std::vector< T > *v){ Tcl_Obj **listobjv; int nitems; int i; T temp; if(SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0) { $1 = *v; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) return TCL_ERROR; $1 = std::vector< T >(); for (i = 0; i < nitems; i++) { if (CONVERT_FROM(interp, listobjv[i], &temp) == TCL_ERROR) return TCL_ERROR; $1.push_back(temp); } } } %typemap(in) const vector< T >& (std::vector< T > *v,std::vector< T > w), const vector< T >* (std::vector< T > *v,std::vector< T > w) { Tcl_Obj **listobjv; int nitems; int i; T temp; if(SWIG_ConvertPtr($input, (void **) &v, \ $1_descriptor, 0) == 0) { $1 = v; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) return TCL_ERROR; w = std::vector< T >(); for (i = 0; i < nitems; i++) { if (CONVERT_FROM(interp, listobjv[i], &temp) == TCL_ERROR) return TCL_ERROR; w.push_back(temp); } $1 = &w; } } %typemap(out) vector< T > { for (unsigned int i=0; i<$1.size(); i++) { Tcl_ListObjAppendElement(interp, $result, \ CONVERT_TO((($1_type &)$1)[i])); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector< T > { Tcl_Obj **listobjv; int nitems; T temp; std::vector< T > *v; if(SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0){ /* wrapped vector */ $1 = 1; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) $1 = 0; else if (nitems == 0) $1 = 1; //check the first value to see if it is of correct type if (CONVERT_FROM(interp, listobjv[0], &temp) == TCL_ERROR) $1 = 0; else $1 = 1; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector< T >&, const vector< T >*{ Tcl_Obj **listobjv; int nitems; T temp; std::vector< T > *v; if(SWIG_ConvertPtr($input, (void **) &v, \ $1_descriptor, 0) == 0){ /* wrapped vector */ $1 = 1; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) $1 = 0; else if (nitems == 0) $1 = 1; //check the first value to see if it is of correct type if (CONVERT_FROM(interp, listobjv[0], &temp) == TCL_ERROR) $1 = 0; else $1 = 1; } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(T x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i<0) i += size; if (i>=0 && isize()); if (i<0) i+= size; if (i>=0 && i,Tcl_NewIntObj); specialize_std_vector(int, Tcl_GetIntFromObj,Tcl_NewIntObj); specialize_std_vector(short, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(long, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(unsigned char, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(unsigned int, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(unsigned short, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(unsigned long, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(double, Tcl_GetDoubleFromObj, Tcl_NewDoubleObj); specialize_std_vector(float, SwigDouble_As, Tcl_NewDoubleObj); specialize_std_vector(std::string, SwigString_AsString, SwigString_FromString); } swig-4.0.2/Lib/tcl/Makefile.in0000644000175000017500000000704713667507523015727 0ustar williamwilliam# --------------------------------------------------------------- # SWIG Tcl Makefile # # This file can be used to build various Tcl extensions with SWIG. # By default this file is set up for dynamic loading, but it can # be easily customized for static extensions by modifying various # portions of the file. # # SRCS = C source files # CXXSRCS = C++ source files # OBJCSRCS = Objective-C source files # OBJS = Additional .o files (compiled previously) # INTERFACE = SWIG interface file # TARGET = Name of target module or executable # # Many portions of this file were created by the SWIG configure # script and should already reflect your machine. However, you # may need to modify the Makefile to reflect your specific # application. #---------------------------------------------------------------- SRCS = CXXSRCS = OBJCSRCS = OBJS = INTERFACE = WRAPFILE = $(INTERFACE:.i=_wrap.c) WRAPOBJ = $(INTERFACE:.i=_wrap.o) TARGET = module@SO@ # Use this kind of target for dynamic loading #TARGET = my_tclsh # Use this target for static linking prefix = @prefix@ exec_prefix = @exec_prefix@ CC = @CC@ CXX = @CXX@ OBJC = @CC@ -Wno-import # -Wno-import needed for gcc CFLAGS = INCLUDES = LIBS = # SWIG Options # SWIG = location of the SWIG executable # SWIGOPT = SWIG compiler options # SWIGCC = Compiler used to compile the wrapper file SWIG = $(exec_prefix)/bin/swig SWIGOPT = -tcl # use -tcl8 for Tcl 8.0 SWIGCC = $(CC) # SWIG Library files. Uncomment if rebuilding tclsh #SWIGLIBS = -ltclsh.i # Rules for creating .o files from source. COBJS = $(SRCS:.c=.o) CXXOBJS = $(CXXSRCS:.cxx=.o) OBJCOBJS = $(OBJCSRCS:.m=.o) ALLOBJS = $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(OBJS) # Command that will be used to build the final extension. BUILD = $(SWIGCC) # Uncomment the following if you are using dynamic loading CCSHARED = @CCSHARED@ BUILD = @LDSHARED@ # Uncomment the following if you are using dynamic loading with C++ and # need to provide additional link libraries (this is not always required). #DLL_LIBS = -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.5.1/2.7.2 \ -L/usr/local/lib -lg++ -lstdc++ -lgcc # Tcl installation (where is Tcl located) TCL_INCLUDE = @TCLINCLUDE@ TCL_LIB = @TCLLIB@ # Build libraries (needed for static builds) LIBM = @LIBM@ LIBC = @LIBC@ SYSLIBS = $(LIBM) $(LIBC) @LIBS@ # Build options (uncomment only one of these) BUILD_LIBS = $(LIBS) # Dynamic loading #BUILD_LIBS = $(TCL_LIB) -ltcl $(LIBS) $(SYSLIBS) # tclsh # Compilation rules for non-SWIG components .SUFFIXES: .c .cxx .m .c.o: $(CC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< .cxx.o: $(CXX) $(CCSHARED) $(CXXFLAGS) $(INCLUDES) -c $< .m.o: $(OBJC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< # ---------------------------------------------------------------------- # Rules for building the extension # ---------------------------------------------------------------------- all: $(TARGET) # Convert the wrapper file into an object file $(WRAPOBJ) : $(WRAPFILE) $(SWIGCC) -c $(CCSHARED) $(CFLAGS) $(WRAPFILE) $(INCLUDES) $(TCL_INCLUDE) $(WRAPFILE) : $(INTERFACE) $(SWIG) $(SWIGOPT) -o $(WRAPFILE) $(SWIGLIBS) $(INTERFACE) $(TARGET): $(WRAPOBJ) $(ALLOBJS) $(BUILD) $(WRAPOBJ) $(ALLOBJS) $(BUILD_LIBS) -o $(TARGET) clean: rm -f $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(WRAPOBJ) $(WRAPFILE) $(TARGET) swig-4.0.2/Lib/tcl/cwstring.i0000644000175000017500000000007413667507523015665 0ustar williamwilliam%include %include swig-4.0.2/Lib/tcl/std_wstring.i0000644000175000017500000000007713667507523016377 0ustar williamwilliam%include %include swig-4.0.2/Lib/tcl/tclruntime.swg0000644000175000017500000000074413667507523016567 0ustar williamwilliam/* tcl.h has to appear first */ %insert(runtime) %{ #include #include #include #include #include #include %} %insert(runtime) "swigrun.swg"; /* Common C API type-checking code */ %insert(runtime) "swigerrors.swg" /* SWIG errors */ %insert(runtime) "tclerrors.swg"; /* Tcl Errors */ %insert(runtime) "tclapi.swg"; /* Tcl API */ %insert(runtime) "tclrun.swg"; /* Tcl run-time code */ swig-4.0.2/Lib/tcl/attribute.i0000644000175000017500000000004213667507523016023 0ustar williamwilliam%include swig-4.0.2/Lib/tcl/cmalloc.i0000644000175000017500000000004013667507523015430 0ustar williamwilliam%include swig-4.0.2/Lib/tcl/tclstrings.swg0000644000175000017500000000143113667507523016567 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header") { SWIGINTERN int SWIG_AsCharPtrAndSize(Tcl_Obj *obj, char** cptr, size_t* psize, int *alloc) { int len = 0; char *cstr = Tcl_GetStringFromObj(obj, &len); if (cstr) { if (cptr) *cptr = cstr; if (psize) *psize = len + 1; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } return SWIG_TypeError; } } %fragment("SWIG_FromCharPtrAndSize","header", fragment="") { SWIGINTERNINLINE Tcl_Obj * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { return (size < INT_MAX) ? Tcl_NewStringObj(carray, %numeric_cast(size,int)) : NULL; } } swig-4.0.2/Lib/tcl/tclkw.swg0000644000175000017500000000036713667507523015526 0ustar williamwilliam#ifndef TCL_TCLKW_SWG_ #define TCL_TCLKW_SWG_ // Some special reserved words in classes %keywordwarn("cget is a tcl reserved method name") *::cget; %keywordwarn("configure is a tcl reserved method name") *::configure; #endif //_TCL_TCLKW_SWG_ swig-4.0.2/Lib/tcl/tclsh.i0000644000175000017500000000351713667507523015147 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclsh.i * * SWIG File for building new tclsh program * ----------------------------------------------------------------------------- */ #ifdef AUTODOC %subsection "tclsh.i" %text %{ This module provides the Tcl_AppInit() function needed to build a new version of the tclsh executable. This file should not be used when using dynamic loading. To make an interface file work with both static and dynamic loading, put something like this in your interface file : #ifdef STATIC %include #endif %} #endif %{ /* A TCL_AppInit() function that lets you build a new copy * of tclsh. * * The macro SWIG_init contains the name of the initialization * function in the wrapper file. */ #ifndef SWIG_RcFileName char *SWIG_RcFileName = "~/.myapprc"; #endif #ifdef MAC_TCL extern int MacintoshInit _ANSI_ARGS_((void)); #endif int Tcl_AppInit(Tcl_Interp *interp){ if (Tcl_Init(interp) == TCL_ERROR) return TCL_ERROR; /* Now initialize our functions */ if (SWIG_init(interp) == TCL_ERROR) return TCL_ERROR; #if TCL_MAJOR_VERSION > 7 || TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION >= 5 Tcl_SetVar(interp, (char *) "tcl_rcFileName",SWIG_RcFileName,TCL_GLOBAL_ONLY); #else tcl_RcFileName = SWIG_RcFileName; #endif #ifdef SWIG_RcRsrcName Tcl_SetVar(interp, (char *) "tcl_rcRsrcName",SWIG_RcRsrcName,TCL_GLOBAL); #endif return TCL_OK; } #if TCL_MAJOR_VERSION > 7 || TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION >= 4 int main(int argc, char **argv) { #ifdef MAC_TCL char *newArgv[2]; if (MacintoshInit() != TCL_OK) { Tcl_Exit(1); } argc = 1; newArgv[0] = "tclsh"; newArgv[1] = NULL; argv = newArgv; #endif Tcl_Main(argc, argv, Tcl_AppInit); return(0); } #else extern int main(); #endif %} swig-4.0.2/Lib/tcl/tclfragments.swg0000644000175000017500000000105313667507523017064 0ustar williamwilliam/* Create a file with this name, 'tclfragments.swg', in your working directory and add all the %fragments you want to take precedence over the ones defined by default by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal_dec(int)(TclObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-4.0.2/Lib/tcl/std_common.i0000644000175000017500000000072313667507523016170 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %types(std::size_t); %apply size_t { std::size_t }; %apply const unsigned long& { const std::size_t& }; %types(std::ptrdiff_t); %apply long { std::ptrdiff_t }; %apply const long& { const std::ptrdiff_t& }; swig-4.0.2/Lib/tcl/std_except.i0000644000175000017500000000004313667507523016163 0ustar williamwilliam%include swig-4.0.2/Lib/tcl/tclrun.swg0000644000175000017500000005337713667507523015722 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclrun.swg * * This file contains the runtime support for Tcl modules and includes * code for managing global variables and pointer type checking. * ----------------------------------------------------------------------------- */ /* Common SWIG API */ /* for raw pointers */ #define SWIG_ConvertPtr(oc, ptr, ty, flags) SWIG_Tcl_ConvertPtr(interp, oc, ptr, ty, flags) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Tcl_NewPointerObj(ptr, type, flags) /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Tcl_ConvertPacked(interp, obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Tcl_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_Tcl_ConvertPtr(interp, obj, pptr, type, flags) #define SWIG_NewInstanceObj(thisvalue, type, flags) SWIG_Tcl_NewInstanceObj(interp, thisvalue, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Tcl_ConvertPtr(interp, obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Tcl_NewPointerObj(ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Tcl_ConvertPacked(interp,obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Tcl_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Tcl_GetModule((Tcl_Interp *) (clientdata)) #define SWIG_SetModule(clientdata, pointer) SWIG_Tcl_SetModule((Tcl_Interp *) (clientdata), pointer) /* Error manipulation */ #define SWIG_ErrorType(code) SWIG_Tcl_ErrorType(code) #define SWIG_Error(code, msg) SWIG_Tcl_SetErrorMsg(interp, SWIG_Tcl_ErrorType(code), msg) #define SWIG_fail goto fail /* Tcl-specific SWIG API */ #define SWIG_Acquire(ptr) SWIG_Tcl_Acquire(ptr) #define SWIG_MethodCommand SWIG_Tcl_MethodCommand #define SWIG_Disown(ptr) SWIG_Tcl_Disown(ptr) #define SWIG_ConvertPtrFromString(c, ptr, ty, flags) SWIG_Tcl_ConvertPtrFromString(interp, c, ptr, ty, flags) #define SWIG_MakePtr(c, ptr, ty, flags) SWIG_Tcl_MakePtr(c, ptr, ty, flags) #define SWIG_PointerTypeFromString(c) SWIG_Tcl_PointerTypeFromString(c) #define SWIG_GetArgs SWIG_Tcl_GetArgs #define SWIG_GetConstantObj(key) SWIG_Tcl_GetConstantObj(key) #define SWIG_ObjectConstructor SWIG_Tcl_ObjectConstructor #define SWIG_Thisown(ptr) SWIG_Tcl_Thisown(ptr) #define SWIG_ObjectDelete SWIG_Tcl_ObjectDelete #define SWIG_TCL_DECL_ARGS_2(arg1, arg2) (Tcl_Interp *interp SWIGUNUSED, arg1, arg2) #define SWIG_TCL_CALL_ARGS_2(arg1, arg2) (interp, arg1, arg2) /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #define SWIG_GetConstant SWIG_GetConstantObj #define SWIG_Tcl_GetConstant SWIG_Tcl_GetConstantObj #if TCL_MAJOR_VERSION >= 8 && TCL_MINOR_VERSION >= 5 #define SWIG_TCL_HASHTABLE_INIT {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} #else #define SWIG_TCL_HASHTABLE_INIT {0} #endif #include "assert.h" #ifdef __cplusplus extern "C" { #endif /* Object support */ SWIGRUNTIME Tcl_HashTable* SWIG_Tcl_ObjectTable(void) { static Tcl_HashTable swigobjectTable; static int swigobjectTableinit = 0; if (!swigobjectTableinit) { Tcl_InitHashTable(&swigobjectTable, TCL_ONE_WORD_KEYS); swigobjectTableinit = 1; } return &swigobjectTable; } /* Acquire ownership of a pointer */ SWIGRUNTIME void SWIG_Tcl_Acquire(void *ptr) { int newobj; Tcl_CreateHashEntry(SWIG_Tcl_ObjectTable(), (char *) ptr, &newobj); } SWIGRUNTIME int SWIG_Tcl_Thisown(void *ptr) { if (Tcl_FindHashEntry(SWIG_Tcl_ObjectTable(), (char *) ptr)) { return 1; } return 0; } /* Disown a pointer. Returns 1 if we owned it to begin with */ SWIGRUNTIME int SWIG_Tcl_Disown(void *ptr) { Tcl_HashEntry *entryPtr = Tcl_FindHashEntry(SWIG_Tcl_ObjectTable(), (char *) ptr); if (entryPtr) { Tcl_DeleteHashEntry(entryPtr); return 1; } return 0; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Tcl_ConvertPtrFromString(Tcl_Interp *interp, const char *c, void **ptr, swig_type_info *ty, int flags) { swig_cast_info *tc; /* Pointer values must start with leading underscore */ while (*c != '_') { *ptr = (void *) 0; if (strcmp(c,"NULL") == 0) return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; /* Empty string: not a pointer */ if (*c == 0) return SWIG_ERROR; /* Hmmm. It could be an object name. */ /* Check if this is a command at all. Prevents cget -this */ /* from being called when c is not a command, firing the unknown proc */ if (Tcl_VarEval(interp,"info commands ", c, (char *) NULL) == TCL_OK) { Tcl_Obj *result = Tcl_GetObjResult(interp); if (*(Tcl_GetStringFromObj(result, NULL)) == 0) { /* It's not a command, so it can't be a pointer */ Tcl_ResetResult(interp); return SWIG_ERROR; } } else { /* This will only fail if the argument is multiple words. */ /* Multiple words are also not commands. */ Tcl_ResetResult(interp); return SWIG_ERROR; } /* Check if this is really a SWIG pointer */ if (Tcl_VarEval(interp,c," cget -this", (char *) NULL) != TCL_OK) { Tcl_ResetResult(interp); return SWIG_ERROR; } c = Tcl_GetStringFromObj(Tcl_GetObjResult(interp), NULL); } c++; c = SWIG_UnpackData(c,ptr,sizeof(void *)); if (ty) { tc = c ? SWIG_TypeCheck(c,ty) : 0; if (!tc) { return SWIG_ERROR; } if (flags & SWIG_POINTER_DISOWN) { SWIG_Disown((void *) *ptr); } { int newmemory = 0; *ptr = SWIG_TypeCast(tc,(void *) *ptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } } return SWIG_OK; } /* Convert a pointer value */ SWIGRUNTIMEINLINE int SWIG_Tcl_ConvertPtr(Tcl_Interp *interp, Tcl_Obj *oc, void **ptr, swig_type_info *ty, int flags) { return SWIG_Tcl_ConvertPtrFromString(interp, Tcl_GetStringFromObj(oc,NULL), ptr, ty, flags); } /* Convert a pointer value */ SWIGRUNTIME char * SWIG_Tcl_PointerTypeFromString(char *c) { char d; /* Pointer values must start with leading underscore. NULL has no type */ if (*c != '_') { return 0; } c++; /* Extract hex value from pointer */ while ((d = *c)) { if (!(((d >= '0') && (d <= '9')) || ((d >= 'a') && (d <= 'f')))) break; c++; } return c; } /* Convert a packed pointer value */ SWIGRUNTIME int SWIG_Tcl_ConvertPacked(Tcl_Interp *SWIGUNUSEDPARM(interp) , Tcl_Obj *obj, void *ptr, int sz, swig_type_info *ty) { swig_cast_info *tc; const char *c; if (!obj) goto type_error; c = Tcl_GetStringFromObj(obj,NULL); /* Pointer values must start with leading underscore */ if (*c != '_') goto type_error; c++; c = SWIG_UnpackData(c,ptr,sz); if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; } return SWIG_OK; type_error: return SWIG_ERROR; } /* Take a pointer and convert it to a string */ SWIGRUNTIME void SWIG_Tcl_MakePtr(char *c, void *ptr, swig_type_info *ty, int SWIGUNUSEDPARM(flags)) { if (ptr) { *(c++) = '_'; c = SWIG_PackData(c,&ptr,sizeof(void *)); strcpy(c,ty->name); } else { strcpy(c,"NULL"); } } /* Create a new pointer object */ SWIGRUNTIMEINLINE Tcl_Obj * SWIG_Tcl_NewPointerObj(void *ptr, swig_type_info *type, int flags) { Tcl_Obj *robj; char result[SWIG_BUFFER_SIZE]; SWIG_MakePtr(result,ptr,type,flags); robj = Tcl_NewStringObj(result,-1); return robj; } SWIGRUNTIME Tcl_Obj * SWIG_Tcl_NewPackedObj(void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(type->name)) > 1000) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); strcpy(r,type->name); return Tcl_NewStringObj(result,-1); } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ SWIGRUNTIME swig_module_info * SWIG_Tcl_GetModule(Tcl_Interp *interp) { const char *data; swig_module_info *ret = 0; /* first check if pointer already created */ data = Tcl_GetVar(interp, (char *)"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TCL_GLOBAL_ONLY); if (data) { SWIG_UnpackData(data, &ret, sizeof(swig_type_info **)); } return ret; } SWIGRUNTIME void SWIG_Tcl_SetModule(Tcl_Interp *interp, swig_module_info *module) { char buf[SWIG_BUFFER_SIZE]; char *data; /* create a new pointer */ data = SWIG_PackData(buf, &module, sizeof(swig_type_info **)); *data = 0; Tcl_SetVar(interp, (char *)"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, buf, TCL_GLOBAL_ONLY); } /* -----------------------------------------------------------------------------* * Object auxiliaries * -----------------------------------------------------------------------------*/ SWIGRUNTIME void SWIG_Tcl_ObjectDelete(ClientData clientData) { swig_instance *si = (swig_instance *) clientData; if (!si) return; if (si->destroy && SWIG_Disown(si->thisvalue)) { if (si->classptr->destructor) { (si->classptr->destructor)(si->thisvalue); } } Tcl_DecrRefCount(si->thisptr); free(si); } /* Function to invoke object methods given an instance */ SWIGRUNTIME int SWIG_Tcl_MethodCommand(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST _objv[]) { char *method, *attrname; swig_instance *inst = (swig_instance *) clientData; swig_method *meth; swig_attribute *attr; Tcl_Obj *oldarg; Tcl_Obj **objv; int rcode; swig_class *cls; swig_class *cls_stack[64]; int cls_stack_bi[64]; int cls_stack_top = 0; int numconf = 2; int bi; objv = (Tcl_Obj **) _objv; if (objc < 2) { Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); return TCL_ERROR; } method = Tcl_GetStringFromObj(objv[1],NULL); if (strcmp(method,"-acquire") == 0) { inst->destroy = 1; SWIG_Acquire(inst->thisvalue); return TCL_OK; } if (strcmp(method,"-disown") == 0) { if (inst->destroy) { SWIG_Disown(inst->thisvalue); } inst->destroy = 0; return TCL_OK; } if (strcmp(method,"-delete") == 0) { Tcl_DeleteCommandFromToken(interp,inst->cmdtok); return TCL_OK; } cls_stack[cls_stack_top] = inst->classptr; cls_stack_bi[cls_stack_top] = -1; while (1) { Tcl_HashEntry* hashentry; bi = cls_stack_bi[cls_stack_top]; cls = cls_stack[cls_stack_top]; if (bi != -1) { if (!cls->bases[bi] && cls->base_names[bi]) { /* lookup and cache the base class */ swig_type_info *info = SWIG_TypeQueryModule(cls->module, cls->module, cls->base_names[bi]); if (info) cls->bases[bi] = (swig_class *) info->clientdata; } cls = cls->bases[bi]; if (cls) { cls_stack_bi[cls_stack_top]++; cls_stack_top++; cls_stack[cls_stack_top] = cls; cls_stack_bi[cls_stack_top] = -1; continue; } } if (!cls) { cls_stack_top--; if (cls_stack_top < 0) break; else continue; } cls_stack_bi[cls_stack_top]++; hashentry = Tcl_FindHashEntry(&(cls->hashtable), method); if (hashentry) { ClientData cd = Tcl_GetHashValue(hashentry); swig_wrapper method_wrapper = (swig_wrapper)cd; oldarg = objv[1]; objv[1] = inst->thisptr; Tcl_IncrRefCount(inst->thisptr); rcode = (method_wrapper)(clientData,interp,objc,objv); objv[1] = oldarg; Tcl_DecrRefCount(inst->thisptr); return rcode; } /* Check class methods for a match */ if (strcmp(method,"cget") == 0) { if (objc < 3) { Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); return TCL_ERROR; } attrname = Tcl_GetStringFromObj(objv[2],NULL); attr = cls->attributes; while (attr && attr->name) { if ((strcmp(attr->name, attrname) == 0) && (attr->getmethod)) { oldarg = objv[1]; objv[1] = inst->thisptr; Tcl_IncrRefCount(inst->thisptr); rcode = (*attr->getmethod)(clientData,interp,2, objv); objv[1] = oldarg; Tcl_DecrRefCount(inst->thisptr); return rcode; } attr++; } if (strcmp(attrname, "-this") == 0) { Tcl_SetObjResult(interp, Tcl_DuplicateObj(inst->thisptr)); return TCL_OK; } if (strcmp(attrname, "-thisown") == 0) { if (SWIG_Thisown(inst->thisvalue)) { Tcl_SetResult(interp,(char*)"1",TCL_STATIC); } else { Tcl_SetResult(interp,(char*)"0",TCL_STATIC); } return TCL_OK; } } else if (strcmp(method, "configure") == 0) { int i; if (objc < 4) { Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); return TCL_ERROR; } i = 2; while (i < objc) { attrname = Tcl_GetStringFromObj(objv[i],NULL); attr = cls->attributes; while (attr && attr->name) { if ((strcmp(attr->name, attrname) == 0) && (attr->setmethod)) { oldarg = objv[i]; objv[i] = inst->thisptr; Tcl_IncrRefCount(inst->thisptr); rcode = (*attr->setmethod)(clientData,interp,3, &objv[i-1]); objv[i] = oldarg; Tcl_DecrRefCount(inst->thisptr); if (rcode != TCL_OK) return rcode; numconf += 2; } attr++; } i+=2; } } } if (strcmp(method,"configure") == 0) { if (numconf >= objc) { return TCL_OK; } else { Tcl_SetResult(interp,(char *) "Invalid attribute name.", TCL_STATIC); return TCL_ERROR; } } if (strcmp(method,"cget") == 0) { Tcl_SetResult(interp,(char *) "Invalid attribute name.", TCL_STATIC); return TCL_ERROR; } Tcl_SetResult(interp, (char *) "Invalid method. Must be one of: configure cget -acquire -disown -delete", TCL_STATIC); cls = inst->classptr; bi = 0; while (cls) { meth = cls->methods; while (meth && meth->name) { char *cr = (char *) Tcl_GetStringResult(interp); size_t meth_len = strlen(meth->name); char* where = strchr(cr,':'); while(where) { where = strstr(where, meth->name); if(where) { if(where[-1] == ' ' && (where[meth_len] == ' ' || where[meth_len]==0)) { break; } else { where++; } } } if (!where) Tcl_AppendElement(interp, (char *) meth->name); meth++; } cls = inst->classptr->bases[bi++]; } return TCL_ERROR; } /* This function takes the current result and turns it into an object command */ SWIGRUNTIME Tcl_Obj * SWIG_Tcl_NewInstanceObj(Tcl_Interp *interp, void *thisvalue, swig_type_info *type, int flags) { Tcl_Obj *robj = SWIG_NewPointerObj(thisvalue, type,0); /* Check to see if this pointer belongs to a class or not */ if (thisvalue && (type->clientdata) && (interp)) { Tcl_CmdInfo ci; char *name; name = Tcl_GetStringFromObj(robj,NULL); if (!Tcl_GetCommandInfo(interp,name, &ci) || (flags)) { swig_instance *newinst = (swig_instance *) malloc(sizeof(swig_instance)); newinst->thisptr = Tcl_DuplicateObj(robj); Tcl_IncrRefCount(newinst->thisptr); newinst->thisvalue = thisvalue; newinst->classptr = (swig_class *) type->clientdata; newinst->destroy = flags; newinst->cmdtok = Tcl_CreateObjCommand(interp, Tcl_GetStringFromObj(robj,NULL), (swig_wrapper_func) SWIG_MethodCommand, (ClientData) newinst, (swig_delete_func) SWIG_ObjectDelete); if (flags) { SWIG_Acquire(thisvalue); } } } return robj; } /* Function to create objects */ SWIGRUNTIME int SWIG_Tcl_ObjectConstructor(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Tcl_Obj *newObj = 0; void *thisvalue = 0; swig_instance *newinst = 0; swig_class *classptr = (swig_class *) clientData; swig_wrapper cons = 0; char *name = 0; int firstarg = 0; int thisarg = 0; int destroy = 1; if (!classptr) { Tcl_SetResult(interp, (char *) "swig: internal runtime error. No class object defined.", TCL_STATIC); return TCL_ERROR; } cons = classptr->constructor; if (objc > 1) { char *s = Tcl_GetStringFromObj(objv[1],NULL); if (strcmp(s,"-this") == 0) { thisarg = 2; cons = 0; } else if (strcmp(s,"-args") == 0) { firstarg = 1; } else if (objc == 2) { firstarg = 1; name = s; } else if (objc >= 3) { char *s1; name = s; s1 = Tcl_GetStringFromObj(objv[2],NULL); if (strcmp(s1,"-this") == 0) { thisarg = 3; cons = 0; } else { firstarg = 1; } } } if (cons) { int result; result = (*cons)(0, interp, objc-firstarg, &objv[firstarg]); if (result != TCL_OK) { return result; } newObj = Tcl_DuplicateObj(Tcl_GetObjResult(interp)); if (!name) name = Tcl_GetStringFromObj(newObj,NULL); } else if (thisarg > 0) { if (thisarg < objc) { destroy = 0; newObj = Tcl_DuplicateObj(objv[thisarg]); if (!name) name = Tcl_GetStringFromObj(newObj,NULL); } else { Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); return TCL_ERROR; } } else { Tcl_SetResult(interp, (char *) "No constructor available.", TCL_STATIC); return TCL_ERROR; } if (SWIG_Tcl_ConvertPtr(interp,newObj, (void **) &thisvalue, *(classptr->type), 0) != SWIG_OK) { Tcl_DecrRefCount(newObj); return TCL_ERROR; } newinst = (swig_instance *) malloc(sizeof(swig_instance)); newinst->thisptr = newObj; Tcl_IncrRefCount(newObj); newinst->thisvalue = thisvalue; newinst->classptr = classptr; newinst->destroy = destroy; if (destroy) { SWIG_Acquire(thisvalue); } newinst->cmdtok = Tcl_CreateObjCommand(interp,name, (swig_wrapper) SWIG_MethodCommand, (ClientData) newinst, (swig_delete_func) SWIG_ObjectDelete); return TCL_OK; } /* -----------------------------------------------------------------------------* * Get arguments * -----------------------------------------------------------------------------*/ SWIGRUNTIME int SWIG_Tcl_GetArgs(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], const char *fmt, ...) { int argno = 0, opt = 0; long tempi; double tempd; const char *c; va_list ap; void *vptr; Tcl_Obj *obj = 0; swig_type_info *ty; va_start(ap,fmt); for (c = fmt; (*c && (*c != ':') && (*c != ';')); c++,argno++) { if (*c == '|') { opt = 1; c++; } if (argno >= (objc-1)) { if (!opt) { Tcl_SetResult(interp, (char *) "Wrong number of arguments ", TCL_STATIC); goto argerror; } else { va_end(ap); return TCL_OK; } } vptr = va_arg(ap,void *); if (vptr) { if (isupper(*c)) { obj = SWIG_Tcl_GetConstantObj(Tcl_GetStringFromObj(objv[argno+1],0)); if (!obj) obj = objv[argno+1]; } else { obj = objv[argno+1]; } switch(*c) { case 'i': case 'I': case 'l': case 'L': case 'h': case 'H': case 'b': case 'B': if (Tcl_GetLongFromObj(interp,obj,&tempi) != TCL_OK) goto argerror; if ((*c == 'i') || (*c == 'I')) *((int *)vptr) = (int)tempi; else if ((*c == 'l') || (*c == 'L')) *((long *)vptr) = (long)tempi; else if ((*c == 'h') || (*c == 'H')) *((short*)vptr) = (short)tempi; else if ((*c == 'b') || (*c == 'B')) *((unsigned char *)vptr) = (unsigned char)tempi; break; case 'f': case 'F': case 'd': case 'D': if (Tcl_GetDoubleFromObj(interp,obj,&tempd) != TCL_OK) goto argerror; if ((*c == 'f') || (*c == 'F')) *((float *) vptr) = (float)tempd; else if ((*c == 'd') || (*c == 'D')) *((double*) vptr) = tempd; break; case 's': case 'S': if (*(c+1) == '#') { int *vlptr = (int *) va_arg(ap, void *); *((char **) vptr) = Tcl_GetStringFromObj(obj, vlptr); c++; } else { *((char **)vptr) = Tcl_GetStringFromObj(obj,NULL); } break; case 'c': case 'C': *((char *)vptr) = *(Tcl_GetStringFromObj(obj,NULL)); break; case 'p': case 'P': ty = (swig_type_info *) va_arg(ap, void *); if (SWIG_Tcl_ConvertPtr(interp, obj, (void **) vptr, ty, 0) != SWIG_OK) goto argerror; break; case 'o': case 'O': *((Tcl_Obj **)vptr) = objv[argno+1]; break; default: break; } } } if ((*c != ';') && ((objc-1) > argno)) { Tcl_SetResult(interp, (char *) "Wrong # args.", TCL_STATIC); goto argerror; } va_end(ap); return TCL_OK; argerror: { char temp[32]; sprintf(temp,"%d", argno+1); c = strchr(fmt,':'); if (!c) c = strchr(fmt,';'); if (!c) c = (char *)""; Tcl_AppendResult(interp,c," argument ", temp, NULL); va_end(ap); return TCL_ERROR; } } #ifdef __cplusplus } #endif swig-4.0.2/Lib/tcl/tclopers.swg0000644000175000017500000000275013667507523016233 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclopers.swg * * C++ overloaded operators. * * These declarations define how SWIG is going to rename C++ * overloaded operators in Tcl. Since Tcl allows identifiers * to be essentially any valid string, we'll just use the * normal operator names. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus %rename("+") *::operator+; //%rename("u+") *::operator+(); // Unary + //%rename("u+") *::operator+() const; // Unary + %rename("-") *::operator-; //%rename("u-") *::operator-(); // Unary - //%rename("u-") *::operator-() const; // Unary - %rename("*") *::operator*; %rename("/") *::operator/; %rename("<<") *::operator<<; %rename(">>") *::operator>>; %rename("&") *::operator&; %rename("|") *::operator|; %rename("^") *::operator^; %rename("%") *::operator%; %rename("=") *::operator=; /* Ignored operators */ %ignoreoperator(NOTEQUAL) operator!=; %ignoreoperator(PLUSEQ) operator+=; %ignoreoperator(MINUSEQ) operator-=; %ignoreoperator(MULEQ) operator*=; %ignoreoperator(DIVEQ) operator/=; %ignoreoperator(MODEQ) operator%=; %ignoreoperator(LSHIFTEQ) operator<<=; %ignoreoperator(RSHIFTEQ) operator>>=; %ignoreoperator(ANDEQ) operator&=; %ignoreoperator(OREQ) operator|=; %ignoreoperator(XOREQ) operator^=; #endif swig-4.0.2/Lib/tcl/tclinterp.i0000644000175000017500000000115113667507523016026 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclinterp.i * * Tcl_Interp *interp * * Passes the current Tcl_Interp value directly to a C function. * This can be used to work with existing wrapper functions or * if you just need the interp value for some reason. When used, * the 'interp' parameter becomes hidden in the Tcl interface--that * is, you don't specify it explicitly. SWIG fills in its value * automatically. * ----------------------------------------------------------------------------- */ %typemap(in,numinputs=0) Tcl_Interp *interp { $1 = interp; } swig-4.0.2/Lib/tcl/mactkinit.c0000644000175000017500000001237113667507523016005 0ustar williamwilliam/* ----------------------------------------------------------------------------- * mactkinit.c * * This is a support file needed to build a new version of Wish. * Normally, this capability is found in TkAppInit.c, but this creates * tons of namespace problems for many applications. * ----------------------------------------------------------------------------- */ #include #include #include #include #include #include #include "tk.h" #include "tkInt.h" #include "tkMacInt.h" typedef int (*TclMacConvertEventPtr) _ANSI_ARGS_((EventRecord *eventPtr)); Tcl_Interp *gStdoutInterp = NULL; void TclMacSetEventProc _ANSI_ARGS_((TclMacConvertEventPtr procPtr)); int TkMacConvertEvent _ANSI_ARGS_((EventRecord *eventPtr)); /* * Prototypes for functions the ANSI library needs to link against. */ short InstallConsole _ANSI_ARGS_((short fd)); void RemoveConsole _ANSI_ARGS_((void)); long WriteCharsToConsole _ANSI_ARGS_((char *buff, long n)); long ReadCharsFromConsole _ANSI_ARGS_((char *buff, long n)); char * __ttyname _ANSI_ARGS_((long fildes)); short SIOUXHandleOneEvent _ANSI_ARGS_((EventRecord *event)); /* * Forward declarations for procedures defined later in this file: */ /* *---------------------------------------------------------------------- * * MacintoshInit -- * * This procedure calls Mac specific initialization calls. Most of * these calls must be made as soon as possible in the startup * process. * * Results: * Returns TCL_OK if everything went fine. If it didn't the * application should probably fail. * * Side effects: * Inits the application. * *---------------------------------------------------------------------- */ int MacintoshInit() { int i; long result, mask = 0x0700; /* mask = system 7.x */ /* * Tk needs us to set the qd pointer it uses. This is needed * so Tk doesn't have to assume the availiblity of the qd global * variable. Which in turn allows Tk to be used in code resources. */ tcl_macQdPtr = &qd; InitGraf(&tcl_macQdPtr->thePort); InitFonts(); InitWindows(); InitMenus(); InitDialogs((long) NULL); InitCursor(); /* * Make sure we are running on system 7 or higher */ if ((NGetTrapAddress(_Gestalt, ToolTrap) == NGetTrapAddress(_Unimplemented, ToolTrap)) || (((Gestalt(gestaltSystemVersion, &result) != noErr) || (mask != (result & mask))))) { panic("Tcl/Tk requires System 7 or higher."); } /* * Make sure we have color quick draw * (this means we can't run on 68000 macs) */ if (((Gestalt(gestaltQuickdrawVersion, &result) != noErr) || (result < gestalt32BitQD13))) { panic("Tk requires Color QuickDraw."); } FlushEvents(everyEvent, 0); SetEventMask(everyEvent); /* * Set up stack & heap sizes */ /* TODO: stack size size = StackSpace(); SetAppLimit(GetAppLimit() - 8192); */ MaxApplZone(); for (i = 0; i < 4; i++) { (void) MoreMasters(); } TclMacSetEventProc(TkMacConvertEvent); TkConsoleCreate(); return TCL_OK; } /* *---------------------------------------------------------------------- * * SetupMainInterp -- * * This procedure calls initialization routines require a Tcl * interp as an argument. This call effectively makes the passed * iterpreter the "main" interpreter for the application. * * Results: * Returns TCL_OK if everything went fine. If it didn't the * application should probably fail. * * Side effects: * More initialization. * *---------------------------------------------------------------------- */ int SetupMainInterp( Tcl_Interp *interp) { /* * Initialize the console only if we are running as an interactive * application. */ TkMacInitAppleEvents(interp); TkMacInitMenus(interp); if (strcmp(Tcl_GetVar(interp, "tcl_interactive", TCL_GLOBAL_ONLY), "1") == 0) { if (TkConsoleInit(interp) == TCL_ERROR) { goto error; } } /* * Attach the global interpreter to tk's expected global console */ gStdoutInterp = interp; return TCL_OK; error: panic(interp->result); return TCL_ERROR; } /* *---------------------------------------------------------------------- * * InstallConsole, RemoveConsole, etc. -- * * The following functions provide the UI for the console package. * Users wishing to replace SIOUX with their own console package * need only provide the four functions below in a library. * * Results: * See SIOUX documentation for details. * * Side effects: * See SIOUX documentation for details. * *---------------------------------------------------------------------- */ short InstallConsole(short fd) { #pragma unused (fd) return 0; } void RemoveConsole(void) { } long WriteCharsToConsole(char *buffer, long n) { TkConsolePrint(gStdoutInterp, TCL_STDOUT, buffer, n); return n; } long ReadCharsFromConsole(char *buffer, long n) { return 0; } extern char * __ttyname(long fildes) { static char *devicename = "null device"; if (fildes >= 0 && fildes <= 2) { return (devicename); } return (0L); } short SIOUXHandleOneEvent(EventRecord *event) { return 0; } swig-4.0.2/Lib/tcl/typemaps.i0000644000175000017500000003727213667507523015701 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * SWIG typemap library for Tcl8. This file contains various sorts * of typemaps for modifying SWIG's code generation. * ----------------------------------------------------------------------------- */ #if !defined(SWIG_USE_OLD_TYPEMAPS) %include #else /* The SWIG typemap library provides a language independent mechanism for supporting output arguments, input values, and other C function calling mechanisms. The primary use of the library is to provide a better interface to certain C function--especially those involving pointers. */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include typemaps.i double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include typemaps.i %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ %typemap(in) double *INPUT(double temp), double &INPUT(double temp) { if (Tcl_GetDoubleFromObj(interp,$input,&temp) == TCL_ERROR) { SWIG_fail; } $1 = &temp; } %typemap(in) float *INPUT(double dvalue, float temp), float &INPUT(double dvalue, float temp) { if (Tcl_GetDoubleFromObj(interp,$input,&dvalue) == TCL_ERROR) { SWIG_fail; } temp = (float) dvalue; $1 = &temp; } %typemap(in) int *INPUT(int temp), int &INPUT(int temp) { if (Tcl_GetIntFromObj(interp,$input,&temp) == TCL_ERROR) { SWIG_fail; } $1 = &temp; } %typemap(in) short *INPUT(int ivalue, short temp), short &INPUT(int ivalue, short temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (short) ivalue; $1 = &temp; } %typemap(in) long *INPUT(int ivalue, long temp), long &INPUT(int ivalue, long temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (long) ivalue; $1 = &temp; } %typemap(in) unsigned int *INPUT(int ivalue, unsigned int temp), unsigned int &INPUT(int ivalue, unsigned int temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (unsigned int) ivalue; $1 = &temp; } %typemap(in) unsigned short *INPUT(int ivalue, unsigned short temp), unsigned short &INPUT(int ivalue, unsigned short temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (unsigned short) ivalue; $1 = &temp; } %typemap(in) unsigned long *INPUT(int ivalue, unsigned long temp), unsigned long &INPUT(int ivalue, unsigned long temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (unsigned long) ivalue; $1 = &temp; } %typemap(in) unsigned char *INPUT(int ivalue, unsigned char temp), unsigned char &INPUT(int ivalue, unsigned char temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (unsigned char) ivalue; $1 = &temp; } %typemap(in) signed char *INPUT(int ivalue, signed char temp), signed char &INPUT(int ivalue, signed char temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (signed char) ivalue; $1 = &temp; } %typemap(in) bool *INPUT(int ivalue, bool temp), bool &INPUT(int ivalue, bool temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = ivalue ? true : false; $1 = &temp; } %typemap(in) long long *INPUT($*1_ltype temp), long long &INPUT($*1_ltype temp) { temp = ($*1_ltype) strtoll(Tcl_GetStringFromObj($input,NULL),0,0); $1 = &temp; } %typemap(in) unsigned long long *INPUT($*1_ltype temp), unsigned long long &INPUT($*1_ltype temp) { temp = ($*1_ltype) strtoull(Tcl_GetStringFromObj($input,NULL),0,0); $1 = &temp; } // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Tcl list. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include typemaps.i double modf(double x, double *OUTPUT); or you can use the %apply directive : %include typemaps.i %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Tcl output of the function would be a list containing both output values. */ %typemap(in,numinputs=0) int *OUTPUT(int temp), short *OUTPUT(short temp), long *OUTPUT(long temp), unsigned int *OUTPUT(unsigned int temp), unsigned short *OUTPUT(unsigned short temp), unsigned long *OUTPUT(unsigned long temp), unsigned char *OUTPUT(unsigned char temp), signed char *OUTPUT(signed char temp), bool *OUTPUT(bool temp), float *OUTPUT(float temp), double *OUTPUT(double temp), long long *OUTPUT($*1_ltype temp), unsigned long long *OUTPUT($*1_ltype temp), int &OUTPUT(int temp), short &OUTPUT(short temp), long &OUTPUT(long temp), unsigned int &OUTPUT(unsigned int temp), unsigned short &OUTPUT(unsigned short temp), unsigned long &OUTPUT(unsigned long temp), signed char &OUTPUT(signed char temp), bool &OUTPUT(bool temp), unsigned char &OUTPUT(unsigned char temp), float &OUTPUT(float temp), double &OUTPUT(double temp), long long &OUTPUT($*1_ltype temp), unsigned long long &OUTPUT($*1_ltype temp) "$1 = &temp;"; %typemap(argout) int *OUTPUT, int &OUTPUT, short *OUTPUT, short &OUTPUT, long *OUTPUT, long &OUTPUT, unsigned int *OUTPUT, unsigned int &OUTPUT, unsigned short *OUTPUT, unsigned short &OUTPUT, unsigned long *OUTPUT, unsigned long &OUTPUT, unsigned char *OUTPUT, unsigned char &OUTPUT, signed char *OUTPUT, signed char &OUTPUT, bool *OUTPUT, bool &OUTPUT { Tcl_Obj *o; o = Tcl_NewIntObj((int) *($1)); Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); } %typemap(argout) float *OUTPUT, float &OUTPUT, double *OUTPUT, double &OUTPUT { Tcl_Obj *o; o = Tcl_NewDoubleObj((double) *($1)); Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); } %typemap(argout) long long *OUTPUT, long long &OUTPUT { char temp[256]; Tcl_Obj *o; sprintf(temp,"%lld",(long long)*($1)); o = Tcl_NewStringObj(temp,-1); Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); } %typemap(argout) unsigned long long *OUTPUT, unsigned long long &OUTPUT { char temp[256]; Tcl_Obj *o; sprintf(temp,"%llu",(unsigned long long)*($1)); o = Tcl_NewStringObj(temp,-1); Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); } // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Tcl list. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include typemaps.i void neg(double *INOUT); or you can use the %apply directive : %include typemaps.i %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Tcl). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Tcl variable you might do this : set x [neg $x] */ %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) unsigned int *INOUT = unsigned int *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) signed char *INOUT = signed char *INPUT; %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) int &INOUT = int &INPUT; %typemap(in) short &INOUT = short &INPUT; %typemap(in) long &INOUT = long &INPUT; %typemap(in) unsigned int &INOUT = unsigned int &INPUT; %typemap(in) unsigned short &INOUT = unsigned short &INPUT; %typemap(in) unsigned long &INOUT = unsigned long &INPUT; %typemap(in) unsigned char &INOUT = unsigned char &INPUT; %typemap(in) signed char &INOUT = signed char &INPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(in) float &INOUT = float &INPUT; %typemap(in) double &INOUT = double &INPUT; %typemap(in) long long &INOUT = long long &INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT = long *OUTPUT; %typemap(argout) unsigned int *INOUT = unsigned int *OUTPUT; %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) signed char *INOUT = signed char *OUTPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT = double *OUTPUT; %typemap(argout) long long *INOUT = long long *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) int &INOUT = int &OUTPUT; %typemap(argout) short &INOUT = short &OUTPUT; %typemap(argout) long &INOUT = long &OUTPUT; %typemap(argout) unsigned int &INOUT = unsigned int &OUTPUT; %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; %typemap(argout) signed char &INOUT = signed char &OUTPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; %typemap(argout) float &INOUT = float &OUTPUT; %typemap(argout) double &INOUT = double &OUTPUT; %typemap(argout) long long &INOUT = long long &OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; /* Overloading information */ %typemap(typecheck) double *INPUT = double; %typemap(typecheck) bool *INPUT = bool; %typemap(typecheck) signed char *INPUT = signed char; %typemap(typecheck) unsigned char *INPUT = unsigned char; %typemap(typecheck) unsigned long *INPUT = unsigned long; %typemap(typecheck) unsigned short *INPUT = unsigned short; %typemap(typecheck) unsigned int *INPUT = unsigned int; %typemap(typecheck) long *INPUT = long; %typemap(typecheck) short *INPUT = short; %typemap(typecheck) int *INPUT = int; %typemap(typecheck) float *INPUT = float; %typemap(typecheck) long long *INPUT = long long; %typemap(typecheck) unsigned long long *INPUT = unsigned long long; %typemap(typecheck) double &INPUT = double; %typemap(typecheck) bool &INPUT = bool; %typemap(typecheck) signed char &INPUT = signed char; %typemap(typecheck) unsigned char &INPUT = unsigned char; %typemap(typecheck) unsigned long &INPUT = unsigned long; %typemap(typecheck) unsigned short &INPUT = unsigned short; %typemap(typecheck) unsigned int &INPUT = unsigned int; %typemap(typecheck) long &INPUT = long; %typemap(typecheck) short &INPUT = short; %typemap(typecheck) int &INPUT = int; %typemap(typecheck) float &INPUT = float; %typemap(typecheck) long long &INPUT = long long; %typemap(typecheck) unsigned long long &INPUT = unsigned long long; %typemap(typecheck) double *INOUT = double; %typemap(typecheck) bool *INOUT = bool; %typemap(typecheck) signed char *INOUT = signed char; %typemap(typecheck) unsigned char *INOUT = unsigned char; %typemap(typecheck) unsigned long *INOUT = unsigned long; %typemap(typecheck) unsigned short *INOUT = unsigned short; %typemap(typecheck) unsigned int *INOUT = unsigned int; %typemap(typecheck) long *INOUT = long; %typemap(typecheck) short *INOUT = short; %typemap(typecheck) int *INOUT = int; %typemap(typecheck) float *INOUT = float; %typemap(typecheck) long long *INOUT = long long; %typemap(typecheck) unsigned long long *INOUT = unsigned long long; %typemap(typecheck) double &INOUT = double; %typemap(typecheck) bool &INOUT = bool; %typemap(typecheck) signed char &INOUT = signed char; %typemap(typecheck) unsigned char &INOUT = unsigned char; %typemap(typecheck) unsigned long &INOUT = unsigned long; %typemap(typecheck) unsigned short &INOUT = unsigned short; %typemap(typecheck) unsigned int &INOUT = unsigned int; %typemap(typecheck) long &INOUT = long; %typemap(typecheck) short &INOUT = short; %typemap(typecheck) int &INOUT = int; %typemap(typecheck) float &INOUT = float; %typemap(typecheck) long long &INOUT = long long; %typemap(typecheck) unsigned long long &INOUT = unsigned long long; #endif // -------------------------------------------------------------------- // Special types // -------------------------------------------------------------------- %include %include swig-4.0.2/Lib/tcl/tclinit.swg0000644000175000017500000000774313667507523016055 0ustar williamwilliam/* ------------------------------------------------------------ * The start of the Tcl initialization function * ------------------------------------------------------------ */ %insert(init) "swiginit.swg" /* This initialization code exports the module initialization function */ %header %{ #ifdef __cplusplus extern "C" { #endif #ifdef MAC_TCL #pragma export on #endif SWIGEXPORT int SWIG_init(Tcl_Interp *); #ifdef MAC_TCL #pragma export off #endif #ifdef __cplusplus } #endif /* Compatibility version for TCL stubs */ #ifndef SWIG_TCL_STUBS_VERSION #define SWIG_TCL_STUBS_VERSION "8.1" #endif %} %init %{ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ SWIGINTERN void SWIG_Tcl_InstallConstants(Tcl_Interp *interp, swig_const_info constants[]) { size_t i; Tcl_Obj *obj; if (!swigconstTableinit) { Tcl_InitHashTable(&swigconstTable, TCL_STRING_KEYS); swigconstTableinit = 1; } for (i = 0; constants[i].type; i++) { switch(constants[i].type) { case SWIG_TCL_POINTER: obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_TCL_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { SWIG_Tcl_SetConstantObj(interp, constants[i].name, obj); } } } /* Create fast method lookup tables */ SWIGINTERN void SWIG_Tcl_InstallMethodLookupTables(void) { size_t i; for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = swig_module.type_initial[i]; if (type->clientdata) { swig_class* klass = (swig_class*) type->clientdata; swig_method* meth; Tcl_InitHashTable(&(klass->hashtable), TCL_STRING_KEYS); for (meth = klass->methods; meth && meth->name; ++meth) { int newEntry; Tcl_HashEntry* hashentry = Tcl_CreateHashEntry(&(klass->hashtable), meth->name, &newEntry); Tcl_SetHashValue(hashentry, (ClientData)meth->method); } } } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ SWIGEXPORT int SWIG_init(Tcl_Interp *interp) { size_t i; if (interp == 0) return TCL_ERROR; #ifdef USE_TCL_STUBS /* (char*) cast is required to avoid compiler warning/error for Tcl < 8.4. */ if (Tcl_InitStubs(interp, (char*)SWIG_TCL_STUBS_VERSION, 0) == NULL) { return TCL_ERROR; } #endif #ifdef USE_TK_STUBS /* (char*) cast is required to avoid compiler warning/error. */ if (Tk_InitStubs(interp, (char*)SWIG_TCL_STUBS_VERSION, 0) == NULL) { return TCL_ERROR; } #endif Tcl_PkgProvide(interp, (char*)SWIG_name, (char*)SWIG_version); #ifdef SWIG_namespace Tcl_Eval(interp, "namespace eval " SWIG_namespace " { }"); #endif SWIG_InitializeModule((void *) interp); SWIG_PropagateClientData(); for (i = 0; swig_commands[i].name; i++) { Tcl_CreateObjCommand(interp, (char *) swig_commands[i].name, (swig_wrapper_func) swig_commands[i].wrapper, swig_commands[i].clientdata, NULL); } for (i = 0; swig_variables[i].name; i++) { Tcl_SetVar(interp, (char *) swig_variables[i].name, (char *) "", TCL_GLOBAL_ONLY); Tcl_TraceVar(interp, (char *) swig_variables[i].name, TCL_TRACE_READS | TCL_GLOBAL_ONLY, (Tcl_VarTraceProc *) swig_variables[i].get, (ClientData) swig_variables[i].addr); Tcl_TraceVar(interp, (char *) swig_variables[i].name, TCL_TRACE_WRITES | TCL_GLOBAL_ONLY, (Tcl_VarTraceProc *) swig_variables[i].set, (ClientData) swig_variables[i].addr); } SWIG_Tcl_InstallConstants(interp, swig_constants); SWIG_Tcl_InstallMethodLookupTables(); %} /* Note: the initialization function is closed after all code is generated */ swig-4.0.2/Lib/tcl/tclapi.swg0000644000175000017500000000604213667507523015652 0ustar williamwilliam/* ----------------------------------------------------------------------------- * SWIG API. Portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_TCL_POINTER 4 #define SWIG_TCL_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; const char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; typedef int (*swig_wrapper)(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); typedef int (*swig_wrapper_func)(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); typedef char *(*swig_variable_func)(ClientData, Tcl_Interp *, char *, char *, int); typedef void (*swig_delete_func)(ClientData); typedef struct swig_method { const char *name; swig_wrapper method; } swig_method; typedef struct swig_attribute { const char *name; swig_wrapper getmethod; swig_wrapper setmethod; } swig_attribute; typedef struct swig_class { const char *name; swig_type_info **type; swig_wrapper constructor; void (*destructor)(void *); swig_method *methods; swig_attribute *attributes; struct swig_class **bases; const char **base_names; swig_module_info *module; Tcl_HashTable hashtable; } swig_class; typedef struct swig_instance { Tcl_Obj *thisptr; void *thisvalue; swig_class *classptr; int destroy; Tcl_Command cmdtok; } swig_instance; /* Structure for command table */ typedef struct { const char *name; int (*wrapper)(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); ClientData clientdata; } swig_command_info; /* Structure for variable linking table */ typedef struct { const char *name; void *addr; char * (*get)(ClientData, Tcl_Interp *, char *, char *, int); char * (*set)(ClientData, Tcl_Interp *, char *, char *, int); } swig_var_info; /* -----------------------------------------------------------------------------* * Install a constant object * -----------------------------------------------------------------------------*/ static Tcl_HashTable swigconstTable; static int swigconstTableinit = 0; SWIGINTERN void SWIG_Tcl_SetConstantObj(Tcl_Interp *interp, const char* name, Tcl_Obj *obj) { int newobj; Tcl_ObjSetVar2(interp,Tcl_NewStringObj(name,-1), NULL, obj, TCL_GLOBAL_ONLY); Tcl_SetHashValue(Tcl_CreateHashEntry(&swigconstTable, name, &newobj), (ClientData) obj); } SWIGINTERN Tcl_Obj * SWIG_Tcl_GetConstantObj(const char *key) { Tcl_HashEntry *entryPtr; if (!swigconstTableinit) return 0; entryPtr = Tcl_FindHashEntry(&swigconstTable, key); if (entryPtr) { return (Tcl_Obj *) Tcl_GetHashValue(entryPtr); } return 0; } #ifdef __cplusplus } #endif swig-4.0.2/Lib/tcl/carrays.i0000644000175000017500000000004313667507523015465 0ustar williamwilliam%include swig-4.0.2/Lib/tcl/std_pair.i0000644000175000017500000000140013667507523015624 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * Typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.2/Lib/tcl/tcltypemaps.swg0000644000175000017500000000543713667507523016752 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Tcl * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* In Tcl we need to pass the interp value, so we define the decl/call macros as needed. */ #define SWIG_AS_DECL_ARGS SWIG_TCL_DECL_ARGS_2 #define SWIG_AS_CALL_ARGS SWIG_TCL_CALL_ARGS_2 /* Include fundamental fragment definitions */ %include /* Look for user fragments file. */ %include /* Tcl fragments for primitive types */ %include /* Tcl fragments for char* strings */ %include /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* No director support in Tcl */ #ifdef SWIG_DIRECTOR_TYPEMAPS #undef SWIG_DIRECTOR_TYPEMAPS #endif /* Tcl types */ #define SWIG_Object Tcl_Obj * /* Overload of the output/constant/exception handling */ /* output */ #define %set_output(obj) Tcl_SetObjResult(interp,obj) /* append output */ #define %append_output(obj) Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),obj) /* set constant */ #define SWIG_SetConstant(name, obj) SWIG_Tcl_SetConstantObj(interp, name, obj) /* raise */ #define SWIG_Raise(obj,type,desc) SWIG_Tcl_SetErrorObj(interp,type,obj) /* Include the unified typemap library */ %include /* ------------------------------------------------------------ * Tcl extra typemaps / typemap overrides * ------------------------------------------------------------ */ #if 1 // Old 1.3.25 typemaps needed to avoid premature object deletion %typemap(out,noblock=1) SWIGTYPE *INSTANCE, SWIGTYPE &INSTANCE, SWIGTYPE &&INSTANCE, SWIGTYPE INSTANCE[] { Tcl_SetObjResult(interp, SWIG_NewInstanceObj( %as_voidptr($1), $1_descriptor,0)); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,%as_voidptrptr(&$1)); Tcl_SetObjResult(interp,SWIG_NewInstanceObj(%as_voidptr($1), ty,0)); } #endif %typemap(throws,noblock=1) SWIGTYPE CLASS { SWIG_set_result(SWIG_NewInstanceObj(%as_voidptr(SWIG_new_copy($1, $1_ltype)), $&1_descriptor, 1)); SWIG_fail; } %typemap(out) SWIGTYPE = SWIGTYPE INSTANCE; %typemap(out) SWIGTYPE * = SWIGTYPE *INSTANCE; %typemap(out) SWIGTYPE *const = SWIGTYPE *; %typemap(out) SWIGTYPE & = SWIGTYPE &INSTANCE; %typemap(out) SWIGTYPE && = SWIGTYPE &&INSTANCE; %typemap(out) SWIGTYPE [] = SWIGTYPE INSTANCE[]; %typemap(varout) SWIGTYPE = SWIGTYPE INSTANCE; swig-4.0.2/Lib/tcl/tclerrors.swg0000644000175000017500000000323713667507523016420 0ustar williamwilliam/* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGINTERN const char* SWIG_Tcl_ErrorType(int code) { const char* type = 0; switch(code) { case SWIG_MemoryError: type = "MemoryError"; break; case SWIG_IOError: type = "IOError"; break; case SWIG_RuntimeError: type = "RuntimeError"; break; case SWIG_IndexError: type = "IndexError"; break; case SWIG_TypeError: type = "TypeError"; break; case SWIG_DivisionByZero: type = "ZeroDivisionError"; break; case SWIG_OverflowError: type = "OverflowError"; break; case SWIG_SyntaxError: type = "SyntaxError"; break; case SWIG_ValueError: type = "ValueError"; break; case SWIG_SystemError: type = "SystemError"; break; case SWIG_AttributeError: type = "AttributeError"; break; default: type = "RuntimeError"; } return type; } SWIGINTERN void SWIG_Tcl_SetErrorObj(Tcl_Interp *interp, const char *ctype, Tcl_Obj *obj) { Tcl_ResetResult(interp); Tcl_SetObjResult(interp, obj); Tcl_SetErrorCode(interp, "SWIG", ctype, NULL); } SWIGINTERN void SWIG_Tcl_SetErrorMsg(Tcl_Interp *interp, const char *ctype, const char *mesg) { Tcl_ResetResult(interp); Tcl_SetErrorCode(interp, "SWIG", ctype, NULL); Tcl_AppendResult(interp, ctype, " ", mesg, NULL); /* Tcl_AddErrorInfo(interp, ctype); Tcl_AddErrorInfo(interp, " "); Tcl_AddErrorInfo(interp, mesg); */ } SWIGINTERNINLINE void SWIG_Tcl_AddErrorMsg(Tcl_Interp *interp, const char* mesg) { Tcl_AddErrorInfo(interp, mesg); } swig-4.0.2/Lib/tcl/wish.i0000644000175000017500000000655413667507523015010 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wish.i * * SWIG File for making wish * ----------------------------------------------------------------------------- */ #ifdef AUTODOC %subsection "wish.i" %text %{ This module provides the Tk_AppInit() function needed to build a new version of the wish executable. Like tclsh.i, this file should not be used with dynamic loading. To make an interface file work with both static and dynamic loading, put something like this in your interface file : #ifdef STATIC %include #endif A startup file may be specified by defining the symbol SWIG_RcFileName as follows (this should be included in a code-block) : #define SWIG_RcFileName "~/.mywishrc" %} #endif %{ /* Initialization code for wish */ #include #ifndef SWIG_RcFileName char *SWIG_RcFileName = "~/.wishrc"; #endif #ifdef MAC_TCL extern int MacintoshInit _ANSI_ARGS_((void)); extern int SetupMainInterp _ANSI_ARGS_((Tcl_Interp *interp)); #endif /* *---------------------------------------------------------------------- * * Tcl_AppInit -- * * This procedure performs application-specific initialization. * Most applications, especially those that incorporate additional * packages, will have their own version of this procedure. * * Results: * Returns a standard Tcl completion code, and leaves an error * message in interp->result if an error occurs. * * Side effects: * Depends on the startup script. * *---------------------------------------------------------------------- */ int Tcl_AppInit(Tcl_Interp *interp) { #ifndef MAC_TCL Tk_Window main; main = Tk_MainWindow(interp); #endif /* * Call the init procedures for included packages. Each call should * look like this: * * if (Mod_Init(interp) == TCL_ERROR) { * return TCL_ERROR; * } * * where "Mod" is the name of the module. */ if (Tcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } if (Tk_Init(interp) == TCL_ERROR) { return TCL_ERROR; } /* * Call Tcl_CreateCommand for application-specific commands, if * they weren't already created by the init procedures called above. */ if (SWIG_init(interp) == TCL_ERROR) { return TCL_ERROR; } #ifdef MAC_TCL SetupMainInterp(interp); #endif /* * Specify a user-specific startup file to invoke if the application * is run interactively. Typically the startup file is "~/.apprc" * where "app" is the name of the application. If this line is deleted * then no user-specific startup file will be run under any conditions. */ #if TCL_MAJOR_VERSION >= 8 || TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION >= 5 Tcl_SetVar(interp, (char *) "tcl_rcFileName",SWIG_RcFileName,TCL_GLOBAL_ONLY); #else tcl_RcFileName = SWIG_RcFileName; #endif /* For Macintosh might also want this */ #ifdef MAC_TCL #ifdef SWIG_RcRsrcName Tcl_SetVar(interp, (char *) "tcl_rcRsrcName",SWIG_RcRsrcName,TCL_GLOBAL_ONLY); #endif #endif return TCL_OK; } #if TK_MAJOR_VERSION >= 4 int main(int argc, char **argv) { #ifdef MAC_TCL char *newArgv[2]; if (MacintoshInit() != TCL_OK) { Tcl_Exit(1); } argc = 1; newArgv[0] = "Wish"; newArgv[1] = NULL; argv = newArgv; #endif Tk_Main(argc, argv, Tcl_AppInit); return(0); } #else extern int main(); #endif %} swig-4.0.2/Lib/tcl/stl.i0000644000175000017500000000044313667507523014627 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/tcl/tcluserdir.swg0000644000175000017500000000030313667507523016550 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Special user directives * ----------------------------------------------------------------------------- */ swig-4.0.2/Lib/tcl/exception.i0000644000175000017500000000022113667507523016015 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg); return TCL_ERROR;)) } swig-4.0.2/Lib/tcl/tclwstrings.swg0000644000175000017500000000345413667507523016765 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclwstrings.wg * * Utility methods for wchar strings * ----------------------------------------------------------------------------- */ %{ #include %} %fragment("SWIG_AsWCharPtrAndSize","header") { SWIGINTERN int SWIG_AsWCharPtrAndSize(Tcl_Obj *obj, wchar_t** cptr, size_t* psize, int *alloc) { int len = 0; Tcl_UniChar *ustr = Tcl_GetUnicodeFromObj(obj, &len); if (ustr) { if (cptr) { Tcl_Encoding encoding = NULL; char *src = (char *) ustr; int srcLen = (len)*sizeof(Tcl_UniChar); int dstLen = sizeof(wchar_t)*(len + 1); char *dst = %new_array(dstLen, char); int flags = 0; Tcl_EncodingState *statePtr = 0; int srcRead = 0; int dstWrote = 0; int dstChars = 0; Tcl_UtfToExternal(0, encoding, src, srcLen, flags, statePtr, dst, dstLen, &srcRead, &dstWrote, &dstChars); if (alloc) *alloc = SWIG_NEWOBJ; } if (psize) *psize = len + 1; return SWIG_OK; } return SWIG_TypeError; } } %fragment("SWIG_FromWCharPtrAndSize","header") { SWIGINTERNINLINE Tcl_Obj * SWIG_FromWCharPtrAndSize(const wchar_t* carray, size_t size) { Tcl_Obj *res = NULL; if (size < INT_MAX) { Tcl_Encoding encoding = NULL; char *src = (char *) carray; int srcLen = (int)(size*sizeof(wchar_t)); int dstLen = (int)(size*sizeof(Tcl_UniChar)); char *dst = %new_array(dstLen, char); int flags = 0; Tcl_EncodingState *statePtr = 0; int srcRead = 0; int dstWrote = 0; int dstChars = 0; Tcl_ExternalToUtf(0, encoding, src, srcLen, flags, statePtr, dst, dstLen, &srcRead, &dstWrote, &dstChars); res = Tcl_NewUnicodeObj((Tcl_UniChar*)dst, (int)size); %delete_array(dst); } return res; } } swig-4.0.2/Lib/tcl/cdata.i0000644000175000017500000000003613667507523015077 0ustar williamwilliam%include swig-4.0.2/Lib/tcl/std_string.i0000644000175000017500000000004413667507523016202 0ustar williamwilliam%include swig-4.0.2/Lib/tcl/std_map.i0000644000175000017500000000464213667507523015461 0ustar williamwilliam// // SWIG typemaps for std::map // // Common implementation %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.2/Lib/tcl/cstring.i0000644000175000017500000000004013667507523015467 0ustar williamwilliam%include swig-4.0.2/Lib/tcl/factory.i0000644000175000017500000000004013667507523015465 0ustar williamwilliam%include swig-4.0.2/Lib/pointer.i0000644000175000017500000000044613667507523014726 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pointer.i * ----------------------------------------------------------------------------- */ %echo "pointer.i is deprecated. Use cpointer.i instead." %echo "See http://www.swig.org/Doc3.0/Library.html" swig-4.0.2/Lib/go/0000755000175000017500000000000013667507523013475 5ustar williamwilliamswig-4.0.2/Lib/go/std_deque.i0000644000175000017500000000003413667507523015621 0ustar williamwilliam%include swig-4.0.2/Lib/go/gostring.swg0000644000175000017500000000152313667507523016054 0ustar williamwilliam/* ------------------------------------------------------------ * gostring.swg * * Support for returning strings from C to Go. * ------------------------------------------------------------ */ // C/C++ code to convert a memory buffer into a Go string allocated in // C/C++ memory. %fragment("AllocateString", "runtime") %{ static _gostring_ Swig_AllocateString(const char *p, size_t l) { _gostring_ ret; ret.p = (char*)malloc(l); memcpy(ret.p, p, l); ret.n = l; return ret; } %} // Go code to convert a string allocated in C++ memory to one // allocated in Go memory. %fragment("CopyString", "go_runtime") %{ type swig_gostring struct { p uintptr; n int } func swigCopyString(s string) string { p := *(*swig_gostring)(unsafe.Pointer(&s)) r := string((*[0x7fffffff]byte)(unsafe.Pointer(p.p))[:p.n]) Swig_free(p.p) return r } %} swig-4.0.2/Lib/go/director.swg0000644000175000017500000000274713667507523016044 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Go proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #include #include namespace Swig { class DirectorException : public std::exception { }; } /* Handle memory management for directors. */ namespace { struct GCItem { virtual ~GCItem() {} }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem* operator->() { return _item; } private: GCItem *_item; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; } class Swig_memory { public: template void swig_acquire_pointer(Type* vptr) { if (vptr) { swig_owner[vptr] = new GCItem_T(vptr); } } private: typedef std::map swig_ownership_map; swig_ownership_map swig_owner; }; template static void swig_acquire_pointer(Swig_memory** pmem, Type* ptr) { if (!pmem) { *pmem = new Swig_memory; } (*pmem)->swig_acquire_pointer(ptr); } swig-4.0.2/Lib/go/std_vector.i0000644000175000017500000000552513667507523016032 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef bool value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef bool const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i /* Code insertion directives */ #define %go_import(...) %insert(go_imports) %{__VA_ARGS__%} /* Basic types */ %typemap(gotype) bool, const bool & "bool" %typemap(gotype) char, const char & "byte" %typemap(gotype) signed char, const signed char & "int8" %typemap(gotype) unsigned char, const unsigned char & "byte" %typemap(gotype) short, const short & "int16" %typemap(gotype) unsigned short, const unsigned short & "uint16" %typemap(gotype) int, const int & "int" %typemap(gotype) unsigned int, const unsigned int & "uint" %typemap(gotype) long, const long & "int64" %typemap(gotype) unsigned long, const unsigned long & "uint64" %typemap(gotype) long long, const long long & "int64" %typemap(gotype) unsigned long long, const unsigned long long & "uint64" %typemap(gotype) float, const float & "float32" %typemap(gotype) double, const double & "float64" %typemap(in) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $1 = ($1_ltype)$input; %} %typemap(in) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long long &, const unsigned long long &, const float &, const double & %{ $1 = ($1_ltype)&$input; %} %typemap(in) const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = ($1_ltype)&temp; %} %typemap(out) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $result = $1; %} %typemap(goout) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double "" %typemap(out) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & %{ $result = ($*1_ltype)*$1; %} %typemap(goout) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & "" %typemap(out) void "" %typemap(goout) void "" %typemap(directorin) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $input = ($1_ltype)$1; %} %typemap(godirectorin) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double "" %typemap(directorin) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & %{ $input = ($*1_ltype)$1; %} %typemap(godirectorin) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & "" %typemap(directorout) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $result = ($1_ltype)$input; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & %{ $result = new $*1_ltype($input); swig_acquire_pointer(&swig_mem, $result); %} /* The size_t type. */ %typemap(gotype) size_t, const size_t & %{int64%} %typemap(in) size_t %{ $1 = (size_t)$input; %} %typemap(in) const size_t & %{ $1 = ($1_ltype)&$input; %} %typemap(out) size_t %{ $result = $1; %} %typemap(goout) size_t "" %typemap(out) const size_t & %{ $result = ($*1_ltype)*$1; %} %typemap(goout) const size_t & "" %typemap(directorin) size_t %{ $input = (size_t)$1; %} %typemap(godirectorin) size_t "" %typemap(directorin) const size_t & %{ $input = ($*1_ltype)$1; %} %typemap(godirectorin) const size_t & "" %typemap(directorout) size_t %{ $result = ($1_ltype)$input; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) const size_t & %{ $result = new $*1_ltype($input); swig_acquire_pointer(&swig_mem, $result); %} /* Member pointers. */ %typemap(gotype) SWIGTYPE (CLASS::*) %{$gotypename%} %typemap(in) SWIGTYPE (CLASS::*) %{ $1 = *($&1_ltype)$input; %} %typemap(out) SWIGTYPE (CLASS::*) %{ struct swig_out_type { intgo size; void* val; } *swig_out; swig_out = (struct swig_out_type*)malloc(sizeof(*swig_out)); if (swig_out) { swig_out->size = sizeof($1_ltype); swig_out->val = malloc(swig_out->size); if (swig_out->val) { *($&1_ltype)(swig_out->val) = $1; } } $result = swig_out; %} %typemap(goout) SWIGTYPE (CLASS::*) %{ { type swig_out_type struct { size int; val uintptr } p := (*swig_out_type)(unsafe.Pointer($1)) if p == nil || p.val == 0 { $result = nil } else { m := make([]byte, p.size) a := (*[1024]byte)(unsafe.Pointer(p.val))[:p.size] copy(m, a) Swig_free(p.val) Swig_free(uintptr(unsafe.Pointer(p))) $result = &m[0] } } %} %typemap(directorin) SWIGTYPE (CLASS::*) %{ $input = *($&1_ltype)$1; %} %typemap(godirectorin) SWIGTYPE (CLASS::*) "" %typemap(directorout) SWIGTYPE (CLASS::*) %{ $result = new $1_ltype($input); swig_acquire_pointer(&swig_mem, $result); %} /* Pointers. */ /* We can't translate pointers using a typemap, so that is handled in the C++ code. */ %typemap(gotype) SWIGTYPE * %{$gotypename%} %typemap(in) SWIGTYPE * %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE * %{ *($&1_ltype)&$result = ($1_ltype)$1; %} %typemap(goout) SWIGTYPE * "" %typemap(directorin) SWIGTYPE * %{ *($&1_ltype)&$input = ($1_ltype)$1; %} %typemap(godirectorin) SWIGTYPE * "" %typemap(directorout) SWIGTYPE * %{ $result = *($&1_ltype)&$input; %} /* Pointer references. */ %typemap(gotype) SWIGTYPE *const& %{$gotypename%} %typemap(in) SWIGTYPE *const& ($*1_ltype temp = 0) %{ temp = *($1_ltype)&$input; $1 = ($1_ltype)&temp; %} %typemap(out) SWIGTYPE *const& %{ *($1_ltype)&$result = *$1; %} %typemap(goout) SWIGTYPE *const& "" /* References. */ /* Converting a C++ reference to Go has to be handled in the C++ code. */ %typemap(gotype) SWIGTYPE & %{$gotypename%} %typemap(in) SWIGTYPE & %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE & %{ *($&1_ltype)&$result = $1; %} %typemap(goout) SWIGTYPE & "" %typemap(directorin) SWIGTYPE & %{ $input = ($1_ltype)&$1; %} %typemap(godirectorin) SWIGTYPE & "" %typemap(directorout) SWIGTYPE & %{ *($&1_ltype)&$result = $input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE *const& %{ static $*1_ltype swig_temp; swig_temp = *($1_ltype)&$input; $result = &swig_temp; %} %typemap(gotype) SWIGTYPE && %{$gotypename%} %typemap(in) SWIGTYPE && %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE && %{ *($&1_ltype)&$result = $1; %} %typemap(goout) SWIGTYPE && "" %typemap(directorin) SWIGTYPE && %{ $input = ($1_ltype)&$1_name; %} %typemap(godirectorin) SWIGTYPE && "" %typemap(directorout) SWIGTYPE && %{ *($&1_ltype)&$result = $input; %} /* C arrays turn into Go pointers. If we know the length we can use a slice. */ %typemap(gotype) SWIGTYPE [] %{$gotypename%} %typemap(in) SWIGTYPE [] %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE [] %{ *($&1_ltype)&$result = $1; %} %typemap(goout) SWIGTYPE [] "" %typemap(directorin) SWIGTYPE [] %{ $input = *($1_ltype)&$1; %} %typemap(godirectorin) SWIGTYPE [] "" %typemap(directorout) SWIGTYPE [] %{ *($&1_ltype)&$result = $input; %} /* Strings. */ %typemap(gotype) char *, char *&, char[ANY], char[] "string" /* Needed to avoid confusion with the way the go module handles references. */ %typemap(gotype) char&, unsigned char& "*byte" %typemap(gotype) signed char& "*int8" %typemap(in) char *, char[ANY], char[] %{ $1 = ($1_ltype)malloc($input.n + 1); memcpy($1, $input.p, $input.n); $1[$input.n] = '\0'; %} %typemap(in) char *& (char *temp) %{ temp = (char *)malloc($input.n + 1); memcpy(temp, $input.p, $input.n); temp[$input.n] = '\0'; $1 = ($1_ltype)&temp; %} %typemap(freearg) char *, char *&, char[ANY], char[] %{ free($1); %} %typemap(out,fragment="AllocateString") char *, char *&, char[ANY], char[] %{ $result = Swig_AllocateString((char*)$1, $1 ? strlen((char*)$1) : 0); %} %typemap(goout,fragment="CopyString") char *, char *&, char[ANY], char[] %{ $result = swigCopyString($1) %} %typemap(directorin,fragment="AllocateString") char *, char *&, char[ANY], char[] %{ $input = Swig_AllocateString((char*)$1, $1 ? strlen((char*)$1) : 0); %} %typemap(godirectorin,fragment="CopyString") char *, char *&, char[ANY], char[] %{ $result = swigCopyString($input) %} %typemap(godirectorout) char *, char *&, char[ANY], char[] %{ { p := Swig_malloc(len($input) + 1) s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input) + 1] copy(s, $input) s[len($input)] = 0 $result = *(*string)(unsafe.Pointer(&s)) } %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) char *, char *&, char[ANY], char[] %{ $result = ($1_ltype)$input.p; %} /* String & length */ %typemap(gotype) (char *STRING, size_t LENGTH) "string" %typemap(in) (char *STRING, size_t LENGTH) %{ $1 = ($1_ltype)$input.p; $2 = ($2_ltype)$input.n; %} %typemap(out,fragment="AllocateString") (char *STRING, size_t LENGTH) %{ $result = Swig_AllocateString((char*)$1, (size_t)$2); %} %typemap(goout,fragment="CopyString") (char *STRING, size_t LENGTH) %{ $result = swigCopyString($1) %} %typemap(directorin,fragment="AllocateString") (char *STRING, size_t LENGTH) %{ $input = Swig_AllocateString((char*)$1, $2); %} %typemap(godirectorin,fragment="CopyString") (char *STRING, size_t LENGTH) %{ $result = swigCopyString($input) %} %typemap(directorout) (char *STRING, size_t LENGTH) %{ $1 = ($1_ltype)$input.p; $2 = ($2_ltype)$input.n; %} /* Enums. We can't do the right thing for enums in typemap(gotype) so we deliberately don't define them. The right thing would be to capitalize the name. This is instead done in go.cxx. */ %typemap(gotype) enum SWIGTYPE %{$gotypename%} %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (intgo)$1; %} %typemap(goout) enum SWIGTYPE "" %typemap(directorin) enum SWIGTYPE %{ $input = (intgo)$1; %} %typemap(godirectorin) enum SWIGTYPE "" %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE & (intgo e) %{ e = (intgo)$1; $input = ($1_ltype)&e; %} %typemap(godirectorin) enum SWIGTYPE & "" %typemap(directorout) enum SWIGTYPE & %{ $*1_ltype f = ($*1_ltype)*$input; $result = ($1_ltype)&f; %} /* Arbitrary type. This is a type passed by value in the C/C++ code. We convert it to a pointer for the Go code. Note that all basic types are explicitly handled above. */ %typemap(gotype) SWIGTYPE %{$gotypename%} %typemap(in) SWIGTYPE ($&1_type argp) %{ argp = ($&1_ltype)$input; if (argp == NULL) { _swig_gopanic("Attempt to dereference null $1_type"); } $1 = ($1_ltype)*argp; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{ *($&1_ltype*)&$result = new $1_ltype($1); %} #else { $&1_ltype $1ptr = ($&1_ltype)malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); *($&1_ltype*)&$result = $1ptr; } #endif %typemap(goout) SWIGTYPE "" %typemap(directorin) SWIGTYPE %{ $input = new $1_ltype((const $1_ltype &)$1); %} %typemap(godirectorin) SWIGTYPE "" %typemap(directorout) SWIGTYPE %{ $result = *($&1_ltype)$input; %} /* Exception handling */ %typemap(throws) char * %{ _swig_gopanic($1); %} %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] %{ (void)$1; _swig_gopanic("C++ $1_type exception thrown"); %} /* Typecheck typemaps. The purpose of these is merely to issue a warning for overloaded C++ functions that cannot be overloaded in Go as more than one C++ type maps to a single Go type. */ %typecheck(SWIG_TYPECHECK_BOOL) /* Go bool */ bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) /* Go byte */ char, const char &, unsigned char, const unsigned char & "" %typecheck(SWIG_TYPECHECK_INT8) /* Go int8 */ signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_INT16) /* Go int16 */ short, const short & "" %typecheck(SWIG_TYPECHECK_INT16) /* Go uint16 */ unsigned short, const unsigned short & "" %typecheck(SWIG_TYPECHECK_INT32) /* Go int */ int, const int & "" %typecheck(SWIG_TYPECHECK_INT32) /* Go uint */ unsigned int, const unsigned int & "" %typecheck(SWIG_TYPECHECK_INT64) /* Go int64 */ long, const long &, long long, const long long & "" %typecheck(SWIG_TYPECHECK_INT64) /* Go uint64 */ unsigned long, const unsigned long &, unsigned long long, const unsigned long long & "" %typecheck(SWIG_TYPECHECK_FLOAT) /* Go float32 */ float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) /* Go float64 */ double, const double & "" %typecheck(SWIG_TYPECHECK_STRING) /* Go string */ char *, char *&, char[ANY], char [], signed char *, signed char *&, signed char[ANY], signed char [], unsigned char *, unsigned char *&, unsigned char[ANY], unsigned char [] "" %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *const&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* Go keywords. */ %include %include swig-4.0.2/Lib/go/std_common.i0000644000175000017500000000014513667507523016011 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.2/Lib/go/std_except.i0000644000175000017500000000241113667507523016007 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * Typemaps used by the STL wrappers that throw exceptions. * These typemaps are used when methods are declared with an STL exception specification, such as * size_t at() const throw (std::out_of_range); * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws) std::bad_cast %{_swig_gopanic($1.what());%} %typemap(throws) std::bad_exception %{_swig_gopanic($1.what());%} %typemap(throws) std::domain_error %{_swig_gopanic($1.what());%} %typemap(throws) std::exception %{_swig_gopanic($1.what());%} %typemap(throws) std::invalid_argument %{_swig_gopanic($1.what());%} %typemap(throws) std::length_error %{_swig_gopanic($1.what());%} %typemap(throws) std::logic_error %{_swig_gopanic($1.what());%} %typemap(throws) std::out_of_range %{_swig_gopanic($1.what());%} %typemap(throws) std::overflow_error %{_swig_gopanic($1.what());%} %typemap(throws) std::range_error %{_swig_gopanic($1.what());%} %typemap(throws) std::runtime_error %{_swig_gopanic($1.what());%} %typemap(throws) std::underflow_error %{_swig_gopanic($1.what());%} swig-4.0.2/Lib/go/typemaps.i0000644000175000017500000002333513667507523015517 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* INPUT typemaps -------------- These typemaps remap a C pointer or C++ reference to be an "INPUT" value which is passed by value instead of reference. The following typemaps can be applied to turn a pointer or reference into a simple input value. That is, instead of passing a pointer or reference to an object, you would use a real value instead. bool *INPUT, bool &INPUT signed char *INPUT, signed char &INPUT unsigned char *INPUT, unsigned char &INPUT short *INPUT, short &INPUT unsigned short *INPUT, unsigned short &INPUT int *INPUT, int &INPUT unsigned int *INPUT, unsigned int &INPUT long *INPUT, long &INPUT unsigned long *INPUT, unsigned long &INPUT long long *INPUT, long long &INPUT unsigned long long *INPUT, unsigned long long &INPUT float *INPUT, float &INPUT double *INPUT, double &INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); In Go you could then use it like this: answer := modulename.Fadd(10.0, 20.0) There are no char *INPUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *INPUT {char *input}; void f(char *input); */ %define INPUT_TYPEMAP(TYPE, GOTYPE) %typemap(gotype) TYPE *INPUT, TYPE &INPUT "GOTYPE" %typemap(in) TYPE *INPUT, TYPE &INPUT %{ $1 = ($1_ltype)&$input; %} %typemap(out) TYPE *INPUT, TYPE &INPUT "" %typemap(goout) TYPE *INPUT, TYPE &INPUT "" %typemap(freearg) TYPE *INPUT, TYPE &INPUT "" %typemap(argout) TYPE *INPUT, TYPE &INPUT "" // %typemap(typecheck) TYPE *INPUT = TYPE; // %typemap(typecheck) TYPE &INPUT = TYPE; %enddef INPUT_TYPEMAP(bool, bool); INPUT_TYPEMAP(signed char, int8); INPUT_TYPEMAP(char, byte); INPUT_TYPEMAP(unsigned char, byte); INPUT_TYPEMAP(short, int16); INPUT_TYPEMAP(unsigned short, uint16); INPUT_TYPEMAP(int, int); INPUT_TYPEMAP(unsigned int, uint); INPUT_TYPEMAP(long, int64); INPUT_TYPEMAP(unsigned long, uint64); INPUT_TYPEMAP(long long, int64); INPUT_TYPEMAP(unsigned long long, uint64); INPUT_TYPEMAP(float, float32); INPUT_TYPEMAP(double, float64); #undef INPUT_TYPEMAP // OUTPUT typemaps. These typemaps are used for parameters that // are output only. An array replaces the c pointer or reference parameter. // The output value is returned in this array passed in. /* OUTPUT typemaps --------------- The following typemaps can be applied to turn a pointer or reference into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. This works by a Go slice being passed as a parameter where a c pointer or reference is required. As with any Go function, the array is passed by reference so that any modifications to the array will be picked up in the calling function. Note that the array passed in MUST have at least one element, but as the c function does not require any input, the value can be set to anything. bool *OUTPUT, bool &OUTPUT signed char *OUTPUT, signed char &OUTPUT unsigned char *OUTPUT, unsigned char &OUTPUT short *OUTPUT, short &OUTPUT unsigned short *OUTPUT, unsigned short &OUTPUT int *OUTPUT, int &OUTPUT unsigned int *OUTPUT, unsigned int &OUTPUT long *OUTPUT, long &OUTPUT unsigned long *OUTPUT, unsigned long &OUTPUT long long *OUTPUT, long long &OUTPUT unsigned long long *OUTPUT, unsigned long long &OUTPUT float *OUTPUT, float &OUTPUT double *OUTPUT, double &OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters): double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Go output of the function would be the function return value and the value in the single element array. In Go you would use it like this: ptr := []float64{0.0} fraction := modulename.Modf(5.0,ptr) There are no char *OUTPUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *OUTPUT {char *output}; void f(char *output); */ %define OUTPUT_TYPEMAP(TYPE, GOTYPE) %typemap(gotype) TYPE *OUTPUT, TYPE &OUTPUT %{[]GOTYPE%} %typemap(in) TYPE *OUTPUT($*1_ltype temp), TYPE &OUTPUT($*1_ltype temp) { if ($input.len == 0) { _swig_gopanic("array must contain at least 1 element"); } $1 = &temp; } %typemap(out) TYPE *OUTPUT, TYPE &OUTPUT "" %typemap(goout) TYPE *INPUT, TYPE &INPUT "" %typemap(freearg) TYPE *OUTPUT, TYPE &OUTPUT "" %typemap(argout) TYPE *OUTPUT, TYPE &OUTPUT { TYPE* a = (TYPE *) $input.array; a[0] = temp$argnum; } %enddef OUTPUT_TYPEMAP(bool, bool); OUTPUT_TYPEMAP(signed char, int8); OUTPUT_TYPEMAP(char, byte); OUTPUT_TYPEMAP(unsigned char, byte); OUTPUT_TYPEMAP(short, int16); OUTPUT_TYPEMAP(unsigned short, uint16); OUTPUT_TYPEMAP(int, int); OUTPUT_TYPEMAP(unsigned int, uint); OUTPUT_TYPEMAP(long, int64); OUTPUT_TYPEMAP(unsigned long, uint64); OUTPUT_TYPEMAP(long long, int64); OUTPUT_TYPEMAP(unsigned long long, uint64); OUTPUT_TYPEMAP(float, float32); OUTPUT_TYPEMAP(double, float64); #undef OUTPUT_TYPEMAP /* INOUT typemaps -------------- Mappings for a parameter that is both an input and an output parameter The following typemaps can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" typemaps described earlier. Output values are returned as an element in a Go slice. bool *INOUT, bool &INOUT signed char *INOUT, signed char &INOUT unsigned char *INOUT, unsigned char &INOUT short *INOUT, short &INOUT unsigned short *INOUT, unsigned short &INOUT int *INOUT, int &INOUT unsigned int *INOUT, unsigned int &INOUT long *INOUT, long &INOUT unsigned long *INOUT, unsigned long &INOUT long long *INOUT, long long &INOUT unsigned long long *INOUT, unsigned long long &INOUT float *INOUT, float &INOUT double *INOUT, double &INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); This works similarly to C in that the mapping directly modifies the input value - the input must be an array with a minimum of one element. The element in the array is the input and the output is the element in the array. x := []float64{5.0} Neg(x); The implementation of the OUTPUT and INOUT typemaps is different to other languages in that other languages will return the output value as part of the function return value. This difference is due to Go being a typed language. There are no char *INOUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *INOUT {char *inout}; void f(char *inout); */ %define INOUT_TYPEMAP(TYPE, GOTYPE) %typemap(gotype) TYPE *INOUT, TYPE &INOUT %{[]GOTYPE%} %typemap(in) TYPE *INOUT, TYPE &INOUT { if ($input.len == 0) { _swig_gopanic("array must contain at least 1 element"); } $1 = ($1_ltype) $input.array; } %typemap(out) TYPE *INOUT, TYPE &INOUT "" %typemap(goout) TYPE *INOUT, TYPE &INOUT "" %typemap(freearg) TYPE *INOUT, TYPE &INOUT "" %typemap(argout) TYPE *INOUT, TYPE &INOUT "" %enddef INOUT_TYPEMAP(bool, bool); INOUT_TYPEMAP(signed char, int8); INOUT_TYPEMAP(char, byte); INOUT_TYPEMAP(unsigned char, byte); INOUT_TYPEMAP(short, int16); INOUT_TYPEMAP(unsigned short, uint16); INOUT_TYPEMAP(int, int); INOUT_TYPEMAP(unsigned int, uint); INOUT_TYPEMAP(long, int64); INOUT_TYPEMAP(unsigned long, uint64); INOUT_TYPEMAP(long long, int64); INOUT_TYPEMAP(unsigned long long, uint64); INOUT_TYPEMAP(float, float32); INOUT_TYPEMAP(double, float64); #undef INOUT_TYPEMAP swig-4.0.2/Lib/go/std_pair.i0000644000175000017500000000140513667507523015454 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.2/Lib/go/stl.i0000644000175000017500000000044313667507523014452 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/go/goruntime.swg0000644000175000017500000002114413667507523016232 0ustar williamwilliam/* ------------------------------------------------------------ * goruntime.swg * * Go runtime code for the various generated files. * ------------------------------------------------------------ */ %inline %{ static void Swig_free(void* p) { free(p); } static void* Swig_malloc(int c) { return malloc(c); } %} %insert(runtime) %{ #include #include #include #include #include %} #if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ #include %} #endif #if SWIGGO_INTGO_SIZE == 32 %insert(runtime) %{ typedef int intgo; typedef unsigned int uintgo; %} #if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef int intgo; typedef unsigned int uintgo; %} #endif #elif SWIGGO_INTGO_SIZE == 64 %insert(runtime) %{ typedef long long intgo; typedef unsigned long long uintgo; %} #if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef long long intgo; typedef unsigned long long uintgo; %} #endif #else %insert(runtime) %{ typedef ptrdiff_t intgo; typedef size_t uintgo; %} #if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef ptrdiff_t intgo; typedef size_t uintgo; %} #endif #endif #ifndef SWIGGO_GCCGO // Set the host compiler struct attribute that will be // used to match gc's struct layout. For example, on 386 Windows, // gcc wants to 8-align int64s, but gc does not. // Use __gcc_struct__ to work around http://gcc.gnu.org/PR52991 on x86, // and https://golang.org/issue/5603. // See: https://github.com/golang/go/blob/fcbf04f9b93b4cd8addd05c2ed784118eb50a46c/src/cmd/cgo/out.go#L663 %insert(runtime) %{ # if !defined(__clang__) && (defined(__i386__) || defined(__x86_64__)) # define SWIGSTRUCTPACKED __attribute__((__packed__, __gcc_struct__)) # else # define SWIGSTRUCTPACKED __attribute__((__packed__)) # endif %} #else # define SWIGSTRUCTPACKED #endif %insert(runtime) %{ typedef struct { char *p; intgo n; } _gostring_; typedef struct { void* array; intgo len; intgo cap; } _goslice_; %} #ifdef SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef struct { char *p; intgo n; } _gostring_; typedef struct { void* array; intgo len; intgo cap; } _goslice_; %} #endif #ifndef SWIGGO_GCCGO /* Boilerplate for C/C++ code when using 6g/8g. This code is compiled with gcc. */ %insert(runtime) %{ #define swiggo_size_assert_eq(x, y, name) typedef char name[(x-y)*(x-y)*-2+1]; #define swiggo_size_assert(t, n) swiggo_size_assert_eq(sizeof(t), n, swiggo_sizeof_##t##_is_not_##n) swiggo_size_assert(char, 1) swiggo_size_assert(short, 2) swiggo_size_assert(int, 4) typedef long long swiggo_long_long; swiggo_size_assert(swiggo_long_long, 8) swiggo_size_assert(float, 4) swiggo_size_assert(double, 8) #ifdef __cplusplus extern "C" { #endif extern void crosscall2(void (*fn)(void *, int), void *, int); extern char* _cgo_topofstack(void) __attribute__ ((weak)); extern void _cgo_allocate(void *, int); extern void _cgo_panic(void *, int); #ifdef __cplusplus } #endif static char *_swig_topofstack() { if (_cgo_topofstack) { return _cgo_topofstack(); } else { return 0; } } static void _swig_gopanic(const char *p) { struct { const char *p; } SWIGSTRUCTPACKED a; a.p = p; crosscall2(_cgo_panic, &a, (int) sizeof a); } %} #if !SWIGGO_CGO /* This is here for backward compatibility, but it will not work with Go 1.5 or later. Do not use it in new code. */ %insert(runtime) %{ static void *_swig_goallocate(size_t len) { struct { size_t len; void *ret; } SWIGSTRUCTPACKED a; a.len = len; crosscall2(_cgo_allocate, &a, (int) sizeof a); return a.ret; } %} #endif #if !SWIGGO_CGO /* Boilerplate for C code when using 6g/8g. This code is compiled with 6c/8c. */ %insert(gc_header) %{ #include "runtime.h" #include "cgocall.h" #pragma dataflag 16 static void *cgocall = runtime·cgocall; #pragma dataflag 16 void *·_cgo_runtime_cgocall = &cgocall; %} #endif #else /* Boilerplate for C/C++ code when using gccgo. */ %insert(runtime) %{ #define SWIGGO_GCCGO #ifdef __cplusplus extern "C" { #endif extern void *_cgo_allocate(size_t); extern void _cgo_panic(const char *); #ifdef __cplusplus } #endif #define _swig_goallocate _cgo_allocate #define _swig_gopanic _cgo_panic %} #if !SWIGGO_CGO %insert(runtime) %{ /* Implementations of SwigCgocall and friends for different versions of gccgo. The Go code will call these functions using C names with a prefix of the module name. The implementations here call the routine in libgo. The routines to call vary depending on the gccgo version. We assume that the version of gcc used to compile this file is the same as the version of gccgo. */ #ifdef __cplusplus extern "C" { #endif #define SWIG_GCC_VERSION \ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #if SWIG_GCC_VERSION < 40700 #define SwigDoCgocall() #define SwigDoCgocallDone() #define SwigDoCgocallBack() #define SwigDoCgocallBackDone() #elif SWIG_GCC_VERSION == 40700 void SwigDoCgocall(void) __asm__("libgo_syscall.syscall.Entersyscall"); void SwigDoCgocallDone(void) __asm__("libgo_syscall.syscall.Exitsyscall"); void SwigDoCgocallBack(void) __asm__("libgo_syscall.syscall.Exitsyscall"); void SwigDoCgocallBackDone(void) __asm__("libgo_syscall.syscall.Entersyscall"); #else void SwigDoCgocall(void) __asm__("syscall.Cgocall"); void SwigDoCgocallDone(void) __asm__("syscall.CgocallDone"); void SwigDoCgocallBack(void) __asm__("syscall.CgocallBack"); void SwigDoCgocallBackDone(void) __asm__("syscall.CgocallBackDone"); #endif #define SWIGSTRINGIFY2(s) #s #define SWIGSTRINGIFY(s) SWIGSTRINGIFY2(s) void SwigCgocall() __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocall"); void SwigCgocall() { SwigDoCgocall(); } void SwigCgocallDone() __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocallDone"); void SwigCgocallDone() { SwigDoCgocallDone(); } void SwigCgocallBack() __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocallBack"); void SwigCgocallBack() { SwigDoCgocallBack(); } void SwigCgocallBackDone() __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocallBackDone"); void SwigCgocallBackDone() { SwigDoCgocallBackDone(); } #undef SWIGSTRINGIFY #undef SWIGSTRINGIFY2 #ifdef __cplusplus } #endif %} #endif #endif #if !SWIGGO_CGO %insert(runtime) %{ /* This is here for backward compatibility, but it will not work with Go 1.5 or later. Do not use it in new code. */ static _gostring_ _swig_makegostring(const char *p, size_t l) { _gostring_ ret; ret.p = (char*)_swig_goallocate(l + 1); memcpy(ret.p, p, l); ret.n = l; return ret; } %} #endif %insert(runtime) %{ #define SWIG_contract_assert(expr, msg) \ if (!(expr)) { _swig_gopanic(msg); } else %} #ifndef SWIGGO_GCCGO %go_import("unsafe", _ "runtime/cgo") #if !SWIGGO_CGO %insert(go_header) %{ var _cgo_runtime_cgocall func(unsafe.Pointer, uintptr) %} #endif #else %go_import("syscall", "unsafe") %insert(go_header) %{ type _ syscall.Sockaddr %} #endif %insert(go_header) %{ type _ unsafe.Pointer %} /* Swig_always_false is used to conditionally assign parameters to Swig_escape_val so that the compiler thinks that they escape. We only assign them if Swig_always_false is true, which it never is. We export the variable so that the compiler doesn't realize that it is never set. */ %insert(go_header) %{ var Swig_escape_always_false bool var Swig_escape_val interface{} %} /* Function pointers are translated by the code in go.cxx into _swig_fnptr. Member pointers are translated to _swig_memberptr. */ %insert(go_header) %{ type _swig_fnptr *byte type _swig_memberptr *byte %} /* For directors we need C++ to track a Go pointer. Since we can't pass a Go pointer into C++, we use a map to track the pointers on the Go side. */ %go_import("sync") %insert(go_header) %{ type _ sync.Mutex %} %insert(go_director) %{ var swigDirectorTrack struct { sync.Mutex m map[int]interface{} c int } func swigDirectorAdd(v interface{}) int { swigDirectorTrack.Lock() defer swigDirectorTrack.Unlock() if swigDirectorTrack.m == nil { swigDirectorTrack.m = make(map[int]interface{}) } swigDirectorTrack.c++ ret := swigDirectorTrack.c swigDirectorTrack.m[ret] = v return ret } func swigDirectorLookup(c int) interface{} { swigDirectorTrack.Lock() defer swigDirectorTrack.Unlock() ret := swigDirectorTrack.m[c] if ret == nil { panic("C++ director pointer not found (possible use-after-free)") } return ret } func swigDirectorDelete(c int) { swigDirectorTrack.Lock() defer swigDirectorTrack.Unlock() if swigDirectorTrack.m[c] == nil { if c > swigDirectorTrack.c { panic("C++ director pointer invalid (possible memory corruption") } else { panic("C++ director pointer not found (possible use-after-free)") } } delete(swigDirectorTrack.m, c) } %} swig-4.0.2/Lib/go/exception.i0000644000175000017500000000025513667507523015647 0ustar williamwilliam%typemap(throws,noblock=1) (...) { SWIG_exception(SWIG_RuntimeError,"unknown exception"); } %insert("runtime") %{ #define SWIG_exception(code, msg) _swig_gopanic(msg) %} swig-4.0.2/Lib/go/std_list.i0000644000175000017500000000164013667507523015475 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { template class list { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; list(); list(const list& other); size_type size() const; bool empty() const; %rename(isEmpty) empty; void clear(); void push_front(const value_type& x); void pop_front(); void push_back(const value_type& x); void pop_back(); void remove(value_type x); void reverse(); void unique(); void sort(); void merge(list& x); }; } swig-4.0.2/Lib/go/cdata.i0000644000175000017500000000444013667507523014725 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cdata.i * * SWIG library file containing macros for manipulating raw C data as strings. * ----------------------------------------------------------------------------- */ %{ typedef struct SWIGCDATA { char *data; intgo len; } SWIGCDATA; %} %fragment("cdata", "header") %{ struct swigcdata { intgo size; void *data; }; %} %typemap(gotype) SWIGCDATA "[]byte" %typemap(imtype) SWIGCDATA "uint64" %typemap(out, fragment="cdata") SWIGCDATA(struct swigcdata *swig_out) %{ swig_out = (struct swigcdata *)malloc(sizeof(*swig_out)); if (swig_out) { swig_out->size = $1.len; swig_out->data = malloc(swig_out->size); if (swig_out->data) { memcpy(swig_out->data, $1.data, swig_out->size); } } $result = *(long long *)(void **)&swig_out; %} %typemap(goout) SWIGCDATA %{ { type swigcdata struct { size int; data uintptr } p := (*swigcdata)(unsafe.Pointer(uintptr($1))) if p == nil || p.data == 0 { $result = nil } else { b := make([]byte, p.size) a := (*[0x7fffffff]byte)(unsafe.Pointer(p.data))[:p.size] copy(b, a) Swig_free(p.data) Swig_free(uintptr(unsafe.Pointer(p))) $result = b } } %} /* ----------------------------------------------------------------------------- * %cdata(TYPE [, NAME]) * * Convert raw C data to a binary string. * ----------------------------------------------------------------------------- */ %define %cdata(TYPE,NAME...) %insert("header") { #if #NAME == "" static SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements) { #else static SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements) { #endif SWIGCDATA d; d.data = (char *) ptr; #if #TYPE != "void" d.len = nelements*sizeof(TYPE); #else d.len = nelements; #endif return d; } } %typemap(default) int nelements "$1 = 1;" #if #NAME == "" SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements); #else SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements); #endif %enddef %typemap(default) int nelements; %rename(cdata) ::cdata_void(void *ptr, int nelements); %cdata(void); /* Memory move function. Due to multi-argument typemaps this appears to be wrapped as void memmove(void *data, const char *s); */ void memmove(void *data, char *indata, int inlen); swig-4.0.2/Lib/go/std_string.i0000644000175000017500000000433413667507523016033 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * Typemaps for std::string and const std::string& * These are mapped to a Go string and are passed around by value. * * To use non-const std::string references use the following %apply. Note * that they are passed by value. * %apply const std::string & {std::string &}; * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; class string; %typemap(gotype) string, const string & "string" %typemap(in) string %{ $1.assign($input.p, $input.n); %} %typemap(godirectorout) string %{ { p := Swig_malloc(len($input)) s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input)] copy(s, $input) $result = *(*string)(unsafe.Pointer(&s)) } %} %typemap(directorout) string %{ $result.assign($input.p, $input.n); free($input.p); %} %typemap(out,fragment="AllocateString") string %{ $result = Swig_AllocateString($1.data(), $1.length()); %} %typemap(goout,fragment="CopyString") string %{ $result = swigCopyString($1) %} %typemap(directorin,fragment="AllocateString") string %{ $input = Swig_AllocateString($1.data(), $1.length()); %} %typemap(godirectorin,fragment="CopyString") string %{ $result = swigCopyString($input) %} %typemap(in) const string & %{ $*1_ltype $1_str($input.p, $input.n); $1 = &$1_str; %} %typemap(godirectorout) const string & %{ { p := Swig_malloc(len($input)) s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input)] copy(s, $input) $result = *(*string)(unsafe.Pointer(&s)) } %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string & %{ static $*1_ltype $1_str; $1_str.assign($input.p, $input.n); free($input.p); $result = &$1_str; %} %typemap(out,fragment="AllocateString") const string & %{ $result = Swig_AllocateString((*$1).data(), (*$1).length()); %} %typemap(goout,fragment="CopyString") const string & %{ $result = swigCopyString($1) %} %typemap(directorin,fragment="AllocateString") const string & %{ $input = Swig_AllocateString($1.data(), $1.length()); %} %typemap(godirectorin,fragment="CopyString") const string & %{ $result = swigCopyString($input) %} } swig-4.0.2/Lib/go/std_map.i0000644000175000017500000000374713667507523015311 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; } swig-4.0.2/Lib/typemaps/0000755000175000017500000000000013667507523014732 5ustar williamwilliamswig-4.0.2/Lib/typemaps/swigtypemaps.swg0000644000175000017500000001157413667507523020220 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigtypemaps.swg * * Unified Typemap Library frontend * ----------------------------------------------------------------------------- */ /* This file provides the frontend to the Unified Typemap Library. When using this library in a SWIG target language, you need to define a minimum set of fragments, specialize a couple of macros, and then include this file. Typically you will create a 'mytypemaps.swg' file in each target language, where you will have the following sections: === mytypemaps.swg === // Fragment section %include // Unified typemap section %include // Local typemap section === mytypemaps.swg === While we add more docs, please take a look at the following cases to see how you specialized the unified typemap library for a new target language: Lib/python/pytypemaps.swg Lib/tcl/tcltypemaps.swg Lib/ruby/rubytypemaps.swg Lib/perl5/perltypemaps.swg */ #define SWIGUTL SWIGUTL /* ----------------------------------------------------------------------------- * Language specialization section. * * Tune these macros for each language as needed. * ----------------------------------------------------------------------------- */ /* The SWIG target language object must be provided. For example in python you define: #define SWIG_Object PyObject * */ #if !defined(SWIG_Object) #error "SWIG_Object must be defined as the SWIG target language object" #endif /*==== flags for new/convert methods ====*/ #ifndef %convertptr_flags %define %convertptr_flags 0 %enddef #endif #ifndef %newpointer_flags %define %newpointer_flags 0 %enddef #endif #ifndef %newinstance_flags %define %newinstance_flags 0 %enddef #endif /*==== set output ====*/ #ifndef %set_output /* simple set output operation */ #define %set_output(obj) $result = obj #endif /*==== set variable output ====*/ #ifndef %set_varoutput /* simple set varoutput operation */ #define %set_varoutput(obj) $result = obj #endif /*==== append output ====*/ #ifndef %append_output #if defined(SWIG_AppendOutput) /* simple append operation */ #define %append_output(obj) $result = SWIG_AppendOutput($result,obj) #else #error "Language must define SWIG_AppendOutput or %append_output" #endif #endif /*==== set constant ====*/ #ifndef %set_constant #if defined(SWIG_SetConstant) /* simple set constant operation */ #define %set_constant(name,value) SWIG_SetConstant(name,value) #else #error "Language must define SWIG_SetConstant or %set_constant" #endif #endif /*==== raise an exception ====*/ #ifndef %raise #if defined(SWIG_Raise) /* simple raise operation */ #define %raise(obj, type, desc) SWIG_Raise(obj, type, desc); SWIG_fail #else #error "Language must define SWIG_Raise or %raise" #endif #endif /*==== director output exception ====*/ #if defined(SWIG_DIRECTOR_TYPEMAPS) #ifndef SWIG_DirOutFail #define SWIG_DirOutFail(code, msg) Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(code), msg) #endif #endif /* ----------------------------------------------------------------------------- * Language independent definitions * ----------------------------------------------------------------------------- */ #define %error_block(Block...) %block(Block) #define %default_code(code) SWIG_ArgError(code) #define %argument_fail(code, type, name, argn) SWIG_exception_fail(%default_code(code), %argfail_fmt(type, name, argn)) #define %argument_nullref(type, name, argn) SWIG_exception_fail(SWIG_ValueError, %argnullref_fmt(type, name, argn)) #define %variable_fail(code, type, name) SWIG_exception_fail(%default_code(code), %varfail_fmt(type, name)) #define %variable_nullref(type, name) SWIG_exception_fail(SWIG_ValueError, %varnullref_fmt(type, name)) #if defined(SWIG_DIRECTOR_TYPEMAPS) #define %dirout_fail(code, type) SWIG_DirOutFail(%default_code(code), %outfail_fmt(type)) #define %dirout_nullref(type) SWIG_DirOutFail(SWIG_ValueError, %outnullref_fmt(type)) #endif /* ----------------------------------------------------------------------------- * All the typemaps * ----------------------------------------------------------------------------- */ %include %include %include %include %include %include %include %include %include %include %include %include swig-4.0.2/Lib/typemaps/cstring.swg0000644000175000017500000000024713667507523017130 0ustar williamwilliam%include %typemaps_cstring(%cstring, char, SWIG_AsCharPtr, SWIG_AsCharPtrAndSize, SWIG_FromCharPtr, SWIG_FromCharPtrAndSize); swig-4.0.2/Lib/typemaps/primtypes.swg0000644000175000017500000002377013667507523017521 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive type fragments and macros * ------------------------------------------------------------ */ /* This file provide fragments and macros for the C/C++ primitive types. The file defines default fragments for the following types: bool signed char unsigned char signed wchar_t // in C++ unsigned wchar_t // in C++ short unsigned short int unsigned int float size_t ptrdiff_t which can always be redefined in the swig target language if needed. The fragments for the following types, however, always need to be defined in the target language: long unsigned long long long unsigned long long double If they are not provided, an #error directive will appear in the wrapped code. -------------------------------------------------------------------- This file provides the macro %typemaps_primitive(CheckCode, Type) which generates the typemaps for a primitive type with a given checkcode. It is assumed that the primitive type is 'normalized' and the corresponding SWIG_AsVal(Type) and SWIG_From(Type) methods are provided via fragments. The following auxiliary macros (explained with bash pseudo code) are also defined: %apply_ctypes(Macro) for i in C Type do Macro($i) done %apply_cpptypes(Macro) for i in C++ Type do Macro($i) done %apply_ctypes_2(Macro2) for i in C Type do for j in C Type do Macro_2($i, $j) done done %apply_cpptypes_2(Macro2) for i in C++ Type do for j in C++ Type do Macro_2($i, $j) done done %apply_checkctypes(Macro2) for i in Check Type do Macro2(%checkcode($i), $i) done */ /* ------------------------------------------------------------ * Primitive type fragments * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header",fragment=SWIG_From_frag(long)) { SWIGINTERN SWIG_Object SWIG_From_dec(bool)(bool value) { return SWIG_From(long)(value ? 1 : 0); } } %fragment(SWIG_AsVal_frag(bool),"header",fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(SWIG_Object obj, bool *val) { long v; int res = SWIG_AsVal(long)(obj, val ? &v : 0); if (SWIG_IsOK(res)) { if (val) *val = v ? true : false; return res; } return SWIG_TypeError; } } /* signed/unsigned char */ %numeric_slong(signed char, "", SCHAR_MIN, SCHAR_MAX) %numeric_ulong(unsigned char, "", UCHAR_MAX) /* short/unsigned short */ %numeric_slong(short, "", SHRT_MIN, SHRT_MAX) %numeric_ulong(unsigned short, "", USHRT_MAX) /* int/unsigned int */ %numeric_slong(int, "", INT_MIN, INT_MAX) %numeric_ulong(unsigned int, "", UINT_MAX) /* signed/unsigned wchar_t */ #ifdef __cplusplus %numeric_slong(signed wchar_t, "", WCHAR_MIN, WCHAR_MAX) %numeric_ulong(unsigned wchar_t, "", UWCHAR_MAX) #endif /* float */ %numeric_float(float, "SWIG_Float_Overflow_Check", SWIG_Float_Overflow_Check(v)) /* long/unsigned long */ %ensure_type_fragments(long) %ensure_type_fragments(unsigned long) /* long long/unsigned long long */ %fragment("SWIG_LongLongAvailable","header", fragment="") %{ #if defined(LLONG_MAX) && !defined(SWIG_LONG_LONG_AVAILABLE) # define SWIG_LONG_LONG_AVAILABLE #endif %} %ensure_type_fragments(long long) %ensure_type_fragments(unsigned long long) /* double */ %ensure_type_fragments(double) /* size_t */ %fragment(SWIG_From_frag(size_t),"header",fragment=SWIG_From_frag(unsigned long),fragment=SWIG_From_frag(unsigned long long)) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(size_t)(size_t value) { %#ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(size_t) <= sizeof(unsigned long)) { %#endif return SWIG_From(unsigned long)(%numeric_cast(value, unsigned long)); %#ifdef SWIG_LONG_LONG_AVAILABLE } else { /* assume sizeof(size_t) <= sizeof(unsigned long long) */ return SWIG_From(unsigned long long)(%numeric_cast(value, unsigned long long)); } %#endif } } %fragment(SWIG_AsVal_frag(size_t),"header",fragment=SWIG_AsVal_frag(unsigned long),fragment=SWIG_AsVal_frag(unsigned long long)) { SWIGINTERNINLINE int SWIG_AsVal_dec(size_t)(SWIG_Object obj, size_t *val) { int res = SWIG_TypeError; %#ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(size_t) <= sizeof(unsigned long)) { %#endif unsigned long v; res = SWIG_AsVal(unsigned long)(obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = %numeric_cast(v, size_t); %#ifdef SWIG_LONG_LONG_AVAILABLE } else if (sizeof(size_t) <= sizeof(unsigned long long)) { unsigned long long v; res = SWIG_AsVal(unsigned long long)(obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = %numeric_cast(v, size_t); } %#endif return res; } } /* ptrdiff_t */ %fragment(SWIG_From_frag(ptrdiff_t),"header",fragment=SWIG_From_frag(long),fragment=SWIG_From_frag(long long)) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(ptrdiff_t)(ptrdiff_t value) { %#ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(ptrdiff_t) <= sizeof(long)) { %#endif return SWIG_From(long)(%numeric_cast(value, long)); %#ifdef SWIG_LONG_LONG_AVAILABLE } else { /* assume sizeof(ptrdiff_t) <= sizeof(long long) */ return SWIG_From(long long)(%numeric_cast(value, long long)); } %#endif } } %fragment(SWIG_AsVal_frag(ptrdiff_t),"header",fragment=SWIG_AsVal_frag(long),fragment=SWIG_AsVal_frag(long long)) { SWIGINTERNINLINE int SWIG_AsVal_dec(ptrdiff_t)(SWIG_Object obj, ptrdiff_t *val) { int res = SWIG_TypeError; %#ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(ptrdiff_t) <= sizeof(long)) { %#endif long v; res = SWIG_AsVal(long)(obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = %numeric_cast(v, ptrdiff_t); %#ifdef SWIG_LONG_LONG_AVAILABLE } else if (sizeof(ptrdiff_t) <= sizeof(long long)) { long long v; res = SWIG_AsVal(long long)(obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = %numeric_cast(v, ptrdiff_t); } %#endif return res; } } %fragment("SWIG_CanCastAsInteger","header", fragment=SWIG_AsVal_frag(double), fragment="", fragment="") { SWIGINTERNINLINE int SWIG_CanCastAsInteger(double *d, double min, double max) { double x = *d; if ((min <= x && x <= max)) { double fx = floor(x); double cx = ceil(x); double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ if ((errno == EDOM) || (errno == ERANGE)) { errno = 0; } else { double summ, reps, diff; if (rd < x) { diff = x - rd; } else if (rd > x) { diff = rd - x; } else { return 1; } summ = rd + x; reps = diff/summ; if (reps < 8*DBL_EPSILON) { *d = rd; return 1; } } } return 0; } } /* ------------------------------------------------------------ * Generate the typemaps for primitive type * ------------------------------------------------------------ */ #define %typemaps_primitive(Code, Type) %typemaps_asvalfromn(%arg(Code), Type) /* ------------------------------------------------------------ * Primitive Type Macros * ------------------------------------------------------------ */ /* useful macros to derive typemap declarations from primitive types */ %define _apply_macro(macro, arg2, arg1...) #if #arg1 != "" macro(%arg(arg1),arg2); #else macro(arg2); #endif %enddef /* Apply macro to the C-types */ %define %apply_ctypes(Macro, Arg2...) _apply_macro(Macro, bool , Arg2); _apply_macro(Macro, signed char , Arg2); _apply_macro(Macro, unsigned char , Arg2); _apply_macro(Macro, short , Arg2); _apply_macro(Macro, unsigned short , Arg2); _apply_macro(Macro, int , Arg2); _apply_macro(Macro, unsigned int , Arg2); _apply_macro(Macro, long , Arg2); _apply_macro(Macro, unsigned long , Arg2); _apply_macro(Macro, long long , Arg2); _apply_macro(Macro, unsigned long long , Arg2); _apply_macro(Macro, float , Arg2); _apply_macro(Macro, double , Arg2); _apply_macro(Macro, char , Arg2); _apply_macro(Macro, wchar_t , Arg2); _apply_macro(Macro, size_t , Arg2); _apply_macro(Macro, ptrdiff_t , Arg2); %enddef /* apply the Macro2(Type1, Type2) to all C types */ #define %apply_ctypes_2(Macro2) %apply_ctypes(%apply_ctypes, Macro2) /* apply the Macro(Type) to all C++ types */ %define %apply_cpptypes(Macro, Arg2...) %apply_ctypes(Macro, Arg2) _apply_macro(Macro, std::size_t, Arg2); _apply_macro(Macro, std::ptrdiff_t, Arg2); _apply_macro(Macro, std::string, Arg2); _apply_macro(Macro, std::wstring, Arg2); _apply_macro(Macro, std::complex, Arg2); _apply_macro(Macro, std::complex, Arg2); %enddef /* apply the Macro2(Type1, Type2) to all C++ types */ #define %apply_cpptypes_2(Macro2) %apply_cpptypes(%apply_cpptypes, Macro2) /* apply the Macro2(CheckCode,Type) to all Checked Types */ %define %apply_checkctypes(Macro2) Macro2(%checkcode(BOOL), bool); Macro2(%checkcode(INT8), signed char); Macro2(%checkcode(UINT8), unsigned char); Macro2(%checkcode(INT16), short); Macro2(%checkcode(UINT16), unsigned short); Macro2(%checkcode(INT32), int); Macro2(%checkcode(UINT32), unsigned int); Macro2(%checkcode(INT64), long); Macro2(%checkcode(UINT64), unsigned long); Macro2(%checkcode(INT128), long long); Macro2(%checkcode(UINT128), unsigned long long); Macro2(%checkcode(FLOAT), float); Macro2(%checkcode(DOUBLE), double); Macro2(%checkcode(CHAR), char); Macro2(%checkcode(UNICHAR), wchar_t); Macro2(%checkcode(SIZE), size_t); Macro2(%checkcode(PTRDIFF), ptrdiff_t); %enddef /* ------------------------------------------------------------ * Generate the typemaps for all the primitive types with checkcode * ------------------------------------------------------------ */ %apply_checkctypes(%typemaps_primitive); swig-4.0.2/Lib/typemaps/carrays.swg0000644000175000017500000000517613667507523017131 0ustar williamwilliam/* ----------------------------------------------------------------------------- * carrays.swg * * This library file contains macros that can be used to manipulate simple * pointers as arrays. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %array_functions(TYPE,NAME) * * Generates functions for creating and accessing elements of a C array * (as pointers). Creates the following functions: * * TYPE *new_NAME(int nelements) * void delete_NAME(TYPE *); * TYPE NAME_getitem(TYPE *, int index); * void NAME_setitem(TYPE *, int index, TYPE value); * * ----------------------------------------------------------------------------- */ %define %array_functions(TYPE,NAME) %{ static TYPE *new_##NAME(size_t nelements) { return %new_array(nelements, TYPE); } static void delete_##NAME(TYPE *ary) { %delete_array(ary); } static TYPE NAME##_getitem(TYPE *ary, size_t index) { return ary[index]; } static void NAME##_setitem(TYPE *ary, size_t index, TYPE value) { ary[index] = value; } %} TYPE *new_##NAME(size_t nelements); void delete_##NAME(TYPE *ary); TYPE NAME##_getitem(TYPE *ary, size_t index); void NAME##_setitem(TYPE *ary, size_t index, TYPE value); %enddef /* ----------------------------------------------------------------------------- * %array_class(TYPE,NAME) * * Generates a class wrapper around a C array. The class has the following * interface: * * struct NAME { * NAME(int nelements); * ~NAME(); * TYPE getitem(int index); * void setitem(int index, TYPE value); * TYPE * cast(); * static NAME *frompointer(TYPE *t); * } * * Use * * %array_class_wrap(TYPE,NAME,GET,SET) * * if you want different names for the get/set methods. * ----------------------------------------------------------------------------- */ %define %array_class_wrap(TYPE,NAME,getitem,setitem) %{ typedef TYPE NAME; %} typedef struct { } NAME; %extend NAME { NAME(size_t nelements) { return %new_array(nelements, TYPE); } ~NAME() { %delete_array(self); } TYPE getitem(size_t index) { return self[index]; } void setitem(size_t index, TYPE value) { self[index] = value; } TYPE * cast() { return self; } static NAME *frompointer(TYPE *t) { return %static_cast(t, NAME *); } }; %types(NAME = TYPE); %enddef #ifndef %array_class %define %array_class(TYPE,NAME) %array_class_wrap(TYPE,NAME,getitem,setitem) %enddef #endif swig-4.0.2/Lib/typemaps/std_strings.swg0000644000175000017500000000366513667507523020031 0ustar williamwilliam /* defining the String asptr/from methods */ %define %std_string_asptr(String, Char, SWIG_AsCharPtrAndSize, Frag) %fragment(SWIG_AsPtr_frag(String),"header",fragment=Frag) { SWIGINTERN int SWIG_AsPtr_dec(String)(SWIG_Object obj, String **val) { Char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ; if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) { if (buf) { if (val) *val = new String(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } else { if (val) *val = 0; return SWIG_OLDOBJ; } } else { static int init = 0; static swig_type_info* descriptor = 0; if (!init) { descriptor = SWIG_TypeQuery(#String " *"); init = 1; } if (descriptor) { String *vptr; int res = SWIG_ConvertPtr(obj, (void**)&vptr, descriptor, 0); if (SWIG_IsOK(res) && val) *val = vptr; return res; } } return SWIG_ERROR; } } %enddef %define %std_string_from(String, SWIG_FromCharPtrAndSize, Frag) %fragment(SWIG_From_frag(String),"header",fragment=Frag) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(String)(const String& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } } %enddef %define %std_string_asval(String) %fragment(SWIG_AsVal_frag(String),"header", fragment=SWIG_AsPtr_frag(String)) { SWIGINTERN int SWIG_AsVal_dec(String)(SWIG_Object obj, String *val) { String* v = (String *) 0; int res = SWIG_AsPtr(String)(obj, &v); if (!SWIG_IsOK(res)) return res; if (v) { if (val) *val = *v; if (SWIG_IsNewObj(res)) { %delete(v); res = SWIG_DelNewMask(res); } return res; } return SWIG_ERROR; } } %enddef %define %typemaps_std_string(String, Char, AsPtrMethod, FromMethod, CheckCode) %std_string_asptr(String, Char, AsPtrMethod, #AsPtrMethod) %std_string_asval(String) %std_string_from(String, FromMethod, #FromMethod) %typemaps_asptrfromn(%arg(CheckCode), String); %enddef swig-4.0.2/Lib/typemaps/cwstring.swg0000644000175000017500000000031713667507523017315 0ustar williamwilliam%include %include %typemaps_cstring(%cwstring, wchar_t, SWIG_AsWCharPtr, SWIG_AsWCharPtrAndSize, SWIG_FromWCharPtr, SWIG_FromWCharPtrAndSize); swig-4.0.2/Lib/typemaps/factory.swg0000644000175000017500000000461113667507523017125 0ustar williamwilliam/* Implement a more natural wrap for factory methods, for example, if you have: ---- geometry.h -------- struct Geometry { enum GeomType{ POINT, CIRCLE }; virtual ~Geometry() {} virtual int draw() = 0; // // Factory method for all the Geometry objects // static Geometry *create(GeomType i); }; struct Point : Geometry { int draw() { return 1; } double width() { return 1.0; } }; struct Circle : Geometry { int draw() { return 2; } double radius() { return 1.5; } }; // // Factory method for all the Geometry objects // Geometry *Geometry::create(GeomType type) { switch (type) { case POINT: return new Point(); case CIRCLE: return new Circle(); default: return 0; } } ---- geometry.h -------- You can use the %factory with the Geometry::create method as follows: %newobject Geometry::create; %factory(Geometry *Geometry::create, Point, Circle); %include "geometry.h" and Geometry::create will return a 'Point' or 'Circle' instance instead of the plain 'Geometry' type. For example, in python: circle = Geometry.create(Geometry.CIRCLE) r = circle.radius() where circle is a Circle proxy instance. NOTES: remember to fully qualify all the type names and don't use %factory inside a namespace declaration, ie, instead of namespace Foo { %factory(Geometry *Geometry::create, Point, Circle); } use %factory(Foo::Geometry *Foo::Geometry::create, Foo::Point, Foo::Circle); */ %define %_factory_dispatch(Type) if (!dcast) { Type *dobj = dynamic_cast($1); if (dobj) { dcast = 1; %set_output(SWIG_NewPointerObj(%as_voidptr(dobj),$descriptor(Type *), $owner | %newpointer_flags)); } }%enddef %define %factory(Method,Types...) %typemap(out) Method { int dcast = 0; %formacro(%_factory_dispatch, Types) if (!dcast) { %set_output(SWIG_NewPointerObj(%as_voidptr($1),$descriptor, $owner | %newpointer_flags)); } }%enddef swig-4.0.2/Lib/typemaps/ptrtypes.swg0000644000175000017500000001470013667507523017350 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ptrtypes.swg * * Value typemaps (Type, const Type&) for "Ptr" types, such as swig * wrapped classes, that define the AsPtr/From methods * * To apply them, just use one of the following macros: * * %typemaps_asptr(CheckCode, AsPtrMeth, AsPtrFrag, Type) * %typemaps_asptrfrom(CheckCode, AsPtrMeth, FromMeth, AsPtrFrag, FromFrag, Type) * * or the simpler and normalize form: * * %typemaps_asptrfromn(CheckCode, Type) * * Also, you can use the individual typemap definitions: * * %ptr_in_typemap(asptr_meth,frag,Type) * %ptr_varin_typemap(asptr_meth,frag,Type) * %ptr_typecheck_typemap(check,asptr_meth,frag,Type) * %ptr_directorout_typemap(asptr_meth,frag,Type) * ----------------------------------------------------------------------------- */ %include /* in */ %define %ptr_in_typemap(asptr_meth,frag,Type...) %typemap(in,fragment=frag) Type { Type *ptr = (Type *)0; int res = asptr_meth($input, &ptr); if (!SWIG_IsOK(res) || !ptr) { %argument_fail((ptr ? res : SWIG_TypeError), "$type", $symname, $argnum); } $1 = *ptr; if (SWIG_IsNewObj(res)) %delete(ptr); } %typemap(freearg) Type ""; %typemap(in,fragment=frag) const Type & (int res = SWIG_OLDOBJ) { Type *ptr = (Type *)0; res = asptr_meth($input, &ptr); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } if (!ptr) { %argument_nullref("$type",$symname, $argnum); } $1 = ptr; } %typemap(freearg,noblock=1) const Type & { if (SWIG_IsNewObj(res$argnum)) %delete($1); } %enddef /* varin */ %define %ptr_varin_typemap(asptr_meth,frag,Type...) %typemap(varin,fragment=frag) Type { Type *ptr = (Type *)0; int res = asptr_meth($input, &ptr); if (!SWIG_IsOK(res) || !ptr) { %variable_fail((ptr ? res : SWIG_TypeError), "$type", "$name"); } $1 = *ptr; if (SWIG_IsNewObj(res)) %delete(ptr); } %enddef #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorout */ %define %ptr_directorout_typemap(asptr_meth,frag,Type...) %typemap(directorargout,noblock=1,fragment=frag) Type *DIRECTOROUT ($*ltype temp, int swig_ores) { Type *swig_optr = 0; swig_ores = $result ? asptr_meth($result, &swig_optr) : 0; if (!SWIG_IsOK(swig_ores) || !swig_optr) { %dirout_fail((swig_optr ? swig_ores : SWIG_TypeError),"$type"); } temp = *swig_optr; $1 = &temp; if (SWIG_IsNewObj(swig_ores)) %delete(swig_optr); } %typemap(directorout,noblock=1,fragment=frag) Type { Type *swig_optr = 0; int swig_ores = asptr_meth($input, &swig_optr); if (!SWIG_IsOK(swig_ores) || !swig_optr) { %dirout_fail((swig_optr ? swig_ores : SWIG_TypeError),"$type"); } $result = *swig_optr; if (SWIG_IsNewObj(swig_ores)) %delete(swig_optr); } %typemap(directorout,noblock=1,fragment=frag,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Type* { Type *swig_optr = 0; int swig_ores = asptr_meth($input, &swig_optr); if (!SWIG_IsOK(swig_ores)) { %dirout_fail(swig_ores,"$type"); } $result = swig_optr; if (SWIG_IsNewObj(swig_ores)) { swig_acquire_ownership(swig_optr); } } %typemap(directorfree,noblock=1) Type* { if (director) { director->swig_release_ownership(%as_voidptr($input)); } } %typemap(directorout,noblock=1,fragment=frag,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Type& { Type *swig_optr = 0; int swig_ores = asptr_meth($input, &swig_optr); if (!SWIG_IsOK(swig_ores)) { %dirout_fail(swig_ores,"$type"); } else { if (!swig_optr) { %dirout_nullref("$type"); } } $result = swig_optr; if (SWIG_IsNewObj(swig_ores)) { swig_acquire_ownership(swig_optr); } } %typemap(directorfree,noblock=1) Type& { if (director) { director->swig_release_ownership(%as_voidptr($input)); } } %typemap(directorout,fragment=frag) Type &DIRECTOROUT = Type %enddef #else #define %ptr_directorout_typemap(asptr_meth,frag,Type...) #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* typecheck */ %define %ptr_typecheck_typemap(check,asptr_meth,frag,Type...) %typemap(typecheck,noblock=1,precedence=check,fragment=frag) Type * { int res = asptr_meth($input, (Type**)(0)); $1 = SWIG_CheckState(res); } %typemap(typecheck,noblock=1,precedence=check,fragment=frag) Type, const Type& { int res = asptr_meth($input, (Type**)(0)); $1 = SWIG_CheckState(res); } %enddef /*--------------------------------------------------------------------- * typemap definition for types with asptr method *---------------------------------------------------------------------*/ %define %typemaps_asptr(CheckCode, AsPtrMeth, AsPtrFrag, Type...) %fragment(SWIG_AsVal_frag(Type),"header",fragment=SWIG_AsPtr_frag(Type)) { SWIGINTERNINLINE int SWIG_AsVal(Type)(SWIG_Object obj, Type *val) { Type *v = (Type *)0; int res = SWIG_AsPtr(Type)(obj, &v); if (!SWIG_IsOK(res)) return res; if (v) { if (val) *val = *v; if (SWIG_IsNewObj(res)) { %delete(v); res = SWIG_DelNewMask(res); } return res; } return SWIG_ERROR; } } %ptr_in_typemap(%arg(AsPtrMeth), %arg(AsPtrFrag), Type); %ptr_varin_typemap(%arg(AsPtrMeth), %arg(AsPtrFrag), Type); %ptr_directorout_typemap(%arg(AsPtrMeth), %arg(AsPtrFrag), Type); %ptr_typecheck_typemap(%arg(CheckCode), %arg(AsPtrMeth),%arg(AsPtrFrag), Type); %ptr_input_typemap(%arg(CheckCode),%arg(AsPtrMeth),%arg(AsPtrFrag),Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with asptr/from methods *---------------------------------------------------------------------*/ %define %typemaps_asptrfrom(CheckCode, AsPtrMeth, FromMeth, AsPtrFrag, FromFrag, Type...) %typemaps_asptr(%arg(CheckCode), %arg(AsPtrMeth), %arg(AsPtrFrag), Type) %typemaps_from(%arg(FromMeth), %arg(FromFrag), Type); %value_output_typemap(%arg(FromMeth), %arg(FromFrag), Type); %ptr_inout_typemap(Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with for 'normalized' asptr/from methods *---------------------------------------------------------------------*/ %define %typemaps_asptrfromn(CheckCode, Type...) %typemaps_asptrfrom(%arg(CheckCode), %arg(SWIG_AsPtr(Type)), %arg(SWIG_From(Type)), %arg(SWIG_AsPtr_frag(Type)), %arg(SWIG_From_frag(Type)), Type); %enddef swig-4.0.2/Lib/typemaps/cpointer.swg0000644000175000017500000000627513667507523017311 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cpointer.swg * * This library file contains macros that can be used to manipulate simple * pointer objects. * * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %pointer_class(type,name) * * Places a simple proxy around a simple type like 'int', 'float', or whatever. * The proxy provides this interface: * * class type { * public: * type(); * ~type(); * type value(); * void assign(type value); * }; * * Example: * * %pointer_class(int, intp); * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = intp() * >>> a.assign(10) * >>> a.value() * 10 * >>> b = intp() * >>> b.assign(20) * >>> print add(a,b) * 30 * * As a general rule, this macro should not be used on class/structures that * are already defined in the interface. * ----------------------------------------------------------------------------- */ %define %pointer_class(TYPE, NAME) %{ typedef TYPE NAME; %} typedef struct { } NAME; %extend NAME { NAME() { return %new_instance(TYPE); } ~NAME() { if ($self) %delete($self); } } %extend NAME { void assign(TYPE value) { *$self = value; } TYPE value() { return *$self; } TYPE * cast() { return $self; } static NAME * frompointer(TYPE *t) { return (NAME *) t; } } %types(NAME = TYPE); %enddef /* ----------------------------------------------------------------------------- * %pointer_functions(type,name) * * Create functions for allocating/deallocating pointers. This can be used * if you don't want to create a proxy class or if the pointer is complex. * * %pointer_functions(int, intp) * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = copy_intp(10) * >>> intp_value(a) * 10 * >>> b = new_intp() * >>> intp_assign(b,20) * >>> print add(a,b) * 30 * >>> delete_intp(a) * >>> delete_intp(b) * * ----------------------------------------------------------------------------- */ %define %pointer_functions(TYPE,NAME) %{ static TYPE *new_##NAME() { return %new_instance(TYPE); } static TYPE *copy_##NAME(TYPE value) { return %new_copy(value, TYPE); } static void delete_##NAME(TYPE *obj) { if (obj) %delete(obj); } static void NAME ##_assign(TYPE *obj, TYPE value) { *obj = value; } static TYPE NAME ##_value(TYPE *obj) { return *obj; } %} TYPE *new_##NAME(); TYPE *copy_##NAME(TYPE value); void delete_##NAME(TYPE *obj); void NAME##_assign(TYPE *obj, TYPE value); TYPE NAME##_value(TYPE *obj); %enddef /* ----------------------------------------------------------------------------- * %pointer_cast(type1,type2,name) * * Generates a pointer casting function. * ----------------------------------------------------------------------------- */ %define %pointer_cast(TYPE1,TYPE2,NAME) %inline %{ TYPE2 NAME(TYPE1 x) { return %static_cast(x, TYPE2); } %} %enddef swig-4.0.2/Lib/typemaps/void.swg0000644000175000017500000000403013667507523016412 0ustar williamwilliam/* ------------------------------------------------------------ * Void * - Accepts any kind of pointer * ------------------------------------------------------------ */ /* in */ %typemap(in,noblock=1) void * (int res) { res = SWIG_ConvertPtr($input,%as_voidptrptr(&$1), 0, $disown); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } } %typemap(freearg) void * ""; %typemap(in,noblock=1) void * const& ($*ltype temp = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&temp), 0, $disown); if (!SWIG_IsOK(res)) { %argument_fail(res, "Stype", $symname, $argnum); } $1 = &temp; } %typemap(freearg) void * const& ""; /* out */ #if defined(VOID_Object) %typemap(out,noblock=1) void { $result = VOID_Object; } #else %typemap(out,noblock=1) void {} #endif /* varin */ %typemap(varin) void * { void *temp = 0; int res = SWIG_ConvertPtr($input, &temp, 0, SWIG_POINTER_DISOWN); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = ($1_ltype) temp; } /* typecheck */ %typecheck(SWIG_TYPECHECK_VOIDPTR, noblock=1) void * { void *ptr = 0; int res = SWIG_ConvertPtr($input, &ptr, 0, 0); $1 = SWIG_CheckState(res); } #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1) void *, void const*, void *const, void const *const, void const *&, void *const &, void const *const & { $input = SWIG_NewPointerObj(%as_voidptr($1), $descriptor, %newpointer_flags); } /* directorout */ %typemap(directorout,noblock=1) void * (void *argp, int res) { res = SWIG_ConvertPtr($input, &argp, 0, 0); if (!SWIG_IsOK(res)) { %dirout_fail(res,"$type"); } $result = %reinterpret_cast(argp, $ltype); } %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) void * const& (void *argp, int res) { res = SWIG_ConvertPtr($input, &argp, 0, $disown); if (!SWIG_IsOK(res)) { %dirout_fail(res,"$type"); } static $*ltype temp = %reinterpret_cast(argp, $*ltype); $result = &temp; } #endif /* SWIG_DIRECTOR_TYPEMAPS */ swig-4.0.2/Lib/typemaps/cmalloc.swg0000644000175000017500000000460613667507523017074 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cmalloc.swg * * This library file contains macros that can be used to create objects using * the C malloc function. * ----------------------------------------------------------------------------- */ %{ #include %} /* %malloc(TYPE [, NAME = TYPE]) %calloc(TYPE [, NAME = TYPE]) %realloc(TYPE [, NAME = TYPE]) %free(TYPE [, NAME = TYPE]) %allocators(TYPE [,NAME = TYPE]) Creates functions for allocating/reallocating memory. TYPE *malloc_NAME(size_t nbytes = sizeof(TYPE); TYPE *calloc_NAME(size_t nobj=1, size_t size=sizeof(TYPE)); TYPE *realloc_NAME(TYPE *ptr, size_t nbytes); void free_NAME(TYPE *ptr); */ %define %malloc(TYPE,NAME...) #if #NAME != "" %rename(malloc_##NAME) ::malloc(size_t nbytes); #else %rename(malloc_##TYPE) ::malloc(size_t nbytes); #endif #if #TYPE != "void" %typemap(default) size_t nbytes "$1 = (size_t) sizeof(TYPE);" #endif TYPE *malloc(size_t nbytes); %typemap(default) size_t nbytes; %enddef %define %calloc(TYPE,NAME...) #if #NAME != "" %rename(calloc_##NAME) ::calloc(size_t nobj, size_t sz); #else %rename(calloc_##TYPE) ::calloc(size_t nobj, size_t sz); #endif #if #TYPE != "void" %typemap(default) size_t sz "$1 = (size_t) sizeof(TYPE);" #else %typemap(default) size_t sz "$1 = 1;" #endif %typemap(default) size_t nobj "$1 = 1;" TYPE *calloc(size_t nobj, size_t sz); %typemap(default) size_t sz; %typemap(default) size_t nobj; %enddef %define %realloc(TYPE,NAME...) %insert("header") { #if #NAME != "" TYPE *realloc_##NAME(TYPE *ptr, size_t nitems) #else TYPE *realloc_##TYPE(TYPE *ptr, size_t nitems) #endif { #if #TYPE != "void" return (TYPE *) realloc(ptr, nitems*sizeof(TYPE)); #else return (TYPE *) realloc(ptr, nitems); #endif } } #if #NAME != "" TYPE *realloc_##NAME(TYPE *ptr, size_t nitems); #else TYPE *realloc_##TYPE(TYPE *ptr, size_t nitems); #endif %enddef %define %free(TYPE,NAME...) #if #NAME != "" %rename(free_##NAME) ::free(TYPE *ptr); #else %rename(free_##TYPE) ::free(TYPE *ptr); #endif void free(TYPE *ptr); %enddef %define %sizeof(TYPE,NAME...) #if #NAME != "" %constant size_t sizeof_##NAME = sizeof(TYPE); #else %constant size_t sizeof_##TYPE = sizeof(TYPE); #endif %enddef %define %allocators(TYPE,NAME...) %malloc(TYPE,NAME) %calloc(TYPE,NAME) %realloc(TYPE,NAME) %free(TYPE,NAME) #if #TYPE != "void" %sizeof(TYPE,NAME) #endif %enddef swig-4.0.2/Lib/typemaps/swigmacros.swg0000644000175000017500000001727013667507523017641 0ustar williamwilliam/* ----------------------------------------------------------------------------- * SWIG API. Portion only visible from SWIG * ----------------------------------------------------------------------------- */ /* This file implements the internal macros of the 'SWIG API', which are useful to implement all the SWIG target languages. Basic preprocessor macros: -------------------------- %arg(Arg) Safe argument wrap %str(Arg) Stringify the argument %begin_block Begin an execution block %end_block End an execution block %block(Block) Execute Block as an execution block %define_as(Def, Val) Define 'Def' as 'Val', expanding Def and Val first %ifcplusplus(V1, V2) if C++ Mode; then V1; else V2; fi Casting Operations: ------------------- SWIG provides the following casting macros, which implement the corresponding C++ casting operations: %const_cast(a, Type) const_cast(a) %static_cast(a, Type) static_cast(a) %reinterpret_cast(a, Type) reinterpret_cast(a) %numeric_cast(a, Type) static_cast(a) %as_voidptr(a) const_cast(static_cast(a)) %as_voidptrptr(a) reinterpret_cast(a) or their C unsafe versions. In C++ we use the safe version unless SWIG_NO_CPLUSPLUS_CAST is defined Memory allocation: ------------------ These allocation/freeing macros are safe to use in C or C++ and dispatch the proper new/delete/delete[] or free/malloc calls as needed. %new_instance(Type) Allocate a new instance of given Type %new_copy(value,Type) Allocate and initialize a new instance with 'value' %new_array(size,Type) Allocate a new array with given size and Type and zero initialize %new_copy_array(cptr,size,Type) Allocate and initialize a new array from 'cptr' %delete(cptr) Delete an instance %delete_array(cptr) Delete an array Auxiliary loop macros: ---------------------- %formacro(Macro, Args...) or %formacro_1(Macro, Args...) for i in Args do Macro($i) done %formacro_2(Macro2, Args...) for i,j in Args do Macro2($i, $j) done Flags and conditional macros: ----------------------------- %mark_flag(flag) flag := True %evalif(flag,expr) if flag; then expr fi %evalif_2(flag1 flag2,expr) if flag1 and flag2; then expr fi */ /* ----------------------------------------------------------------------------- * Basic preprocessor macros * ----------------------------------------------------------------------------- */ #define %arg(Arg...) Arg #define %str(Arg) `Arg` #ifndef %begin_block # define %begin_block do { #endif #ifndef %end_block # define %end_block } while(0) #endif #define %block(Block...) %begin_block Block; %end_block /* define a new macro */ %define %define_as(Def, Val...)%#define Def Val %enddef /* include C++ or else value */ %define %ifcplusplus(cppval, nocppval) #ifdef __cplusplus cppval #else nocppval #endif %enddef /* insert the SWIGVERSION in the interface and the wrapper code */ #if SWIG_VERSION %insert("header") { %define_as(SWIGVERSION, SWIG_VERSION) %#define SWIG_VERSION SWIGVERSION } #endif /* ----------------------------------------------------------------------------- * Casting operators * ----------------------------------------------------------------------------- */ #if defined(__cplusplus) && !defined(SWIG_NO_CPLUSPLUS_CAST) # define %const_cast(a,Type...) const_cast< Type >(a) # define %static_cast(a,Type...) static_cast< Type >(a) # define %reinterpret_cast(a,Type...) reinterpret_cast< Type >(a) # define %numeric_cast(a,Type...) static_cast< Type >(a) #else /* C case */ # define %const_cast(a,Type...) (Type)(a) # define %static_cast(a,Type...) (Type)(a) # define %reinterpret_cast(a,Type...) (Type)(a) # define %numeric_cast(a,Type...) (Type)(a) #endif /* __cplusplus */ #define %as_voidptr(a) SWIG_as_voidptr(a) #define %as_voidptrptr(a) SWIG_as_voidptrptr(a) %insert("header") { %define_as(SWIG_as_voidptr(a), %const_cast(%static_cast(a,const void *), void *)) %define_as(SWIG_as_voidptrptr(a), ((void)%as_voidptr(*a),%reinterpret_cast(a, void**))) } /* ----------------------------------------------------------------------------- * Allocating/freeing elements * ----------------------------------------------------------------------------- */ #if defined(__cplusplus) # define %new_instance(Type...) (new Type()) # define %new_copy(val,Type...) (new Type(%static_cast(val, const Type&))) # define %new_array(size,Type...) (new Type[size]()) # define %new_copy_array(ptr,size,Type...) %reinterpret_cast(memcpy(new Type[size], ptr, sizeof(Type)*(size)), Type*) # define %delete(cptr) delete cptr # define %delete_array(cptr) delete[] cptr #else /* C case */ # define %new_instance(Type...) (Type *)calloc(1,sizeof(Type)) # define %new_copy(val,Type...) (Type *)memcpy(%new_instance(Type),&val,sizeof(Type)) # define %new_array(size,Type...) (Type *)calloc(size, sizeof(Type)) # define %new_copy_array(ptr,size,Type...) (Type *)memcpy(malloc((size)*sizeof(Type)), ptr, sizeof(Type)*(size)) # define %delete(cptr) free((char*)cptr) # define %delete_array(cptr) free((char*)cptr) #endif /* __cplusplus */ /* ----------------------------------------------------------------------------- * SWIG names and mangling * ----------------------------------------------------------------------------- */ #define %mangle(Type...) #@Type #define %descriptor(Type...) SWIGTYPE_ ## #@Type #define %string_name(Name) "SWIG_" %str(Name) #define %symbol_name(Name, Type...) SWIG_ ## Name ## _ #@Type #define %checkcode(Code) SWIG_TYPECHECK_ ## Code /* ----------------------------------------------------------------------------- * Auxiliary loop macros * ----------------------------------------------------------------------------- */ /* for loop for macro with one argument */ %define %_formacro_1(macro, arg1,...)macro(arg1) #if #__VA_ARGS__ != "__fordone__" %_formacro_1(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with one argument */ %define %formacro_1(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef %define %formacro(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef /* for loop for macro with two arguments */ %define %_formacro_2(macro, arg1, arg2, ...)macro(arg1, arg2) #if #__VA_ARGS__ != "__fordone__" %_formacro_2(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with two arguments */ %define %formacro_2(macro,...)%_formacro_2(macro, __VA_ARGS__, __fordone__)%enddef /* ----------------------------------------------------------------------------- * SWIG flags * ----------------------------------------------------------------------------- */ /* mark a flag, ie, define a macro name but ignore it in the interface. the flag can be later used with %evalif */ %define %mark_flag(x) %define x 1 %enddef %enddef /* %evalif and %evalif_2 are use to evaluate or process an expression if the given predicate is 'true' (1). */ %define %_evalif(_x,_expr) #if _x == 1 _expr #endif %enddef %define %_evalif_2(_x,_y,_expr) #if _x == 1 && _y == 1 _expr #endif %enddef %define %evalif(_x,_expr...) %_evalif(%arg(_x),%arg(_expr)) %enddef %define %evalif_2(_x,_y,_expr...) %_evalif_2(%arg(_x),%arg(_y),%arg(_expr)) %enddef swig-4.0.2/Lib/typemaps/std_wstring.swg0000644000175000017500000000062013667507523020021 0ustar williamwilliam%include #ifndef SWIG_STD_BASIC_STRING #define SWIG_STD_WSTRING %include %{ #include %} %fragment(""); namespace std { %naturalvar wstring; class wstring; } %typemaps_std_string(std::wstring, wchar_t, SWIG_AsWCharPtrAndSize, SWIG_FromWCharPtrAndSize, %checkcode(STDUNISTRING)); #else %include #endif swig-4.0.2/Lib/typemaps/enumint.swg0000644000175000017500000000236413667507523017140 0ustar williamwilliam/* ------------------------------------------------------------ * Enums mapped as integer values * ------------------------------------------------------------ */ %apply int { enum SWIGTYPE }; %apply const int& { const enum SWIGTYPE & }; %apply const int& { const enum SWIGTYPE && }; %typemap(in,fragment=SWIG_AsVal_frag(int),noblock=1) const enum SWIGTYPE & (int val, int ecode, $basetype temp) { ecode = SWIG_AsVal(int)($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$type", $symname, $argnum); } else { temp = %static_cast(val,$basetype); $1 = &temp; } } %typemap(in,fragment=SWIG_AsVal_frag(int),noblock=1) const enum SWIGTYPE && (int val, int ecode, $basetype temp) { ecode = SWIG_AsVal(int)($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$type", $symname, $argnum); } else { temp = %static_cast(val,$basetype); $1 = &temp; } } %typemap(varin,fragment=SWIG_AsVal_frag(int),noblock=1) enum SWIGTYPE { if (sizeof(int) != sizeof($1)) { %variable_fail(SWIG_AttributeError,"$type", "arch, read-only $name"); } else { int ecode = SWIG_AsVal(int)($input, %reinterpret_cast(&$1,int*)); if (!SWIG_IsOK(ecode)) { %variable_fail(ecode, "$type", "$name"); } } } swig-4.0.2/Lib/typemaps/strings.swg0000644000175000017500000004456613667507523017164 0ustar williamwilliam// // Use the macro SWIG_PRESERVE_CARRAY_SIZE if you prefer to preserve // the size of char arrays, ie // ------------------------------------------ // C Side => Language Side // ------------------------------------------ // char name[5] = "hola" => 'hola\0' // // the default behaviour is // // char name[5] = "hola" => 'hola' // // //#define SWIG_PRESERVE_CARRAY_SIZE /* ------------------------------------------------------------ * String typemaps for type Char (char or wchar_t) * ------------------------------------------------------------ */ %define %_typemap_string(StringCode, Char, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_AsCharPtr, SWIG_FromCharPtr, SWIG_AsCharArray, SWIG_NewCopyCharArray, SWIG_DeleteCharArray) /* in */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtr) Char * (int res, Char *buf = 0, int alloc = 0), const Char * (int res, Char *buf = 0, int alloc = 0) { res = SWIG_AsCharPtr($input, &buf, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = %reinterpret_cast(buf, $1_ltype); } %typemap(freearg,noblock=1,match="in") Char *, const Char * { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } %typemap(in,noblock=1,fragment=#SWIG_AsCharPtr) Char const*& (int res, Char *buf = 0, int alloc = 0) { res = SWIG_AsCharPtr($input, &buf, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = &buf; } %typemap(freearg, noblock=1,match="in") Char const*& { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* out */ %typemap(out,noblock=1,fragment=#SWIG_FromCharPtr) Char *, const Char * { %set_output(SWIG_FromCharPtr((const Char *)$1)); } %typemap(out,noblock=1,fragment=#SWIG_FromCharPtr) Char const*& { %set_output(SWIG_FromCharPtr(*$1)); } %typemap(newfree,noblock=1) Char * { SWIG_DeleteCharArray($1); } /* varin */ %typemap(varin,fragment=#SWIG_AsCharPtrAndSize) Char * { Char *cptr = 0; size_t csize = 0; int alloc = SWIG_NEWOBJ; int res = SWIG_AsCharPtrAndSize($input, &cptr, &csize, &alloc); if (!SWIG_IsOK(res)) { %variable_fail(res,"$type","$name"); } if ($1) SWIG_DeleteCharArray($1); if (alloc == SWIG_NEWOBJ) { $1 = cptr; } else { $1 = csize ? ($1_type)SWIG_NewCopyCharArray(cptr, csize, Char) : 0; } } %typemap(varin,fragment=#SWIG_AsCharPtrAndSize,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const Char * { Char *cptr = 0; size_t csize = 0; int alloc = SWIG_NEWOBJ; int res = SWIG_AsCharPtrAndSize($input, &cptr, &csize, &alloc); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (alloc == SWIG_NEWOBJ) { $1 = cptr; } else { $1 = csize ? ($1_type)SWIG_NewCopyCharArray(cptr, csize, Char) : 0; } } /* varout */ %typemap(varout,noblock=1,fragment=#SWIG_FromCharPtr) Char *, const Char * { %set_varoutput(SWIG_FromCharPtr($1)); } /* memberin */ %typemap(memberin,noblock=1) Char * { if ($1) SWIG_DeleteCharArray($1); if ($input) { size_t size = SWIG_CharPtrLen(%reinterpret_cast($input, const Char *)) + 1; $1 = ($1_type)SWIG_NewCopyCharArray(%reinterpret_cast($input, const Char *), size, Char); } else { $1 = 0; } } %typemap(memberin,noblock=1,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const Char * { if ($input) { size_t size = SWIG_CharPtrLen(%reinterpret_cast(%reinterpret_cast($input, const Char *), const Char *)) + 1; $1 = ($1_type)SWIG_NewCopyCharArray($input, size, Char); } else { $1 = 0; } } /* globalin */ %typemap(globalin,noblock=1) Char * { if ($1) SWIG_DeleteCharArray($1); if ($input) { size_t size = SWIG_CharPtrLen(%reinterpret_cast(%reinterpret_cast($input, const Char *), const Char *)) + 1; $1 = ($1_type)SWIG_NewCopyCharArray($input, size, Char); } else { $1 = 0; } } %typemap(globalin,noblock=1,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const Char * { if ($input) { size_t size = SWIG_CharPtrLen($input) + 1; $1 = ($1_type)SWIG_NewCopyCharArray($input, size, Char); } else { $1 = 0; } } /* constant */ %typemap(constcode,noblock=1,fragment=#SWIG_FromCharPtr) Char *, Char const*, Char * const, Char const* const { %set_constant("$symname", SWIG_FromCharPtr($value)); } #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1,fragment=#SWIG_FromCharPtr) Char *, Char const*, Char *const, Char const *const, Char const *&, Char *const &, Char const *const & { $input = SWIG_FromCharPtr((const Char *)$1); } /* directorout */ %typemap(directorout,noblock=1,fragment=#SWIG_AsCharPtr,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Char * (int res, Char *buf = 0, int alloc = SWIG_NEWOBJ) { res = SWIG_AsCharPtr($input, &buf, &alloc); if (!SWIG_IsOK(res)) { %dirout_fail(res, "$type"); } if (alloc == SWIG_NEWOBJ) { swig_acquire_ownership_array(buf); } $result = %reinterpret_cast(buf, $1_ltype); } %typemap(directorfree,noblock=1) Char * { if (director) { director->swig_release_ownership(%as_voidptr($input)); } } %typemap(directorout,noblock=1,fragment=#SWIG_AsCharPtr,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Char *const& (int res, Char *buf = 0, int alloc = SWIG_NEWOBJ), Char const*const& (int res, Char *buf = 0, int alloc = SWIG_NEWOBJ) { res = SWIG_AsCharPtr($input, &buf, &alloc); if (!SWIG_IsOK(res)) { %dirout_fail(res, "$type"); } static $*1_ltype tmp = buf; $result = &tmp; if (alloc == SWIG_NEWOBJ) { swig_acquire_ownership_array(buf); } } %typemap(directorfree,noblock=1) Char * const&, Char const* const& { if (director) { director->swig_release_ownership(%as_voidptr(*$input)); } } #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* typecheck */ %typemap(typecheck,noblock=1,precedence=StringCode, fragment=#SWIG_AsCharPtr) Char *, const Char *, Char const*& { int res = SWIG_AsCharPtr($input, 0, 0); $1 = SWIG_CheckState(res); } /* throws */ %typemap(throws,noblock=1,fragment=#SWIG_FromCharPtr) Char * { %raise(SWIG_FromCharPtr($1), "$type", 0); } /* ------------------------------------------------------------ * Unknown size const Character array Char[ANY] handling * ------------------------------------------------------------ */ %apply Char * { Char [] }; %apply const Char * { const Char [] }; %typemap(varin,noblock=1,warning="462:Unable to set variable of type Char []") Char [] { %variable_fail(SWIG_AttributeError, "$type", "read-only $name"); } /* ------------------------------------------------------------ * Fixed size Character array Char[ANY] handling * ------------------------------------------------------------ */ /* memberin and globalin typemaps */ %typemap(memberin,noblock=1) Char [ANY] { if ($input) memcpy($1,$input,$1_dim0*sizeof(Char)); else memset($1,0,$1_dim0*sizeof(Char)); } %typemap(globalin,noblock=1) Char [ANY] { if ($input) memcpy($1,$input,$1_dim0*sizeof(Char)); else memset($1,0,$1_dim0*sizeof(Char)); } /* in */ %typemap(in,noblock=1,fragment=#SWIG_AsCharArray) Char [ANY] (Char temp[$1_dim0], int res), const Char [ANY](Char temp[$1_dim0], int res) { res = SWIG_AsCharArray($input, temp, $1_dim0); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = %reinterpret_cast(temp, $1_ltype); } %typemap(freearg) Char [ANY], const Char [ANY] ""; %typemap(in,noblock=1,fragment=#SWIG_AsCharArray) const Char (&)[ANY] (Char temp[$1_dim0], int res) { res = SWIG_AsCharArray($input, temp, $1_dim0); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = &temp; } %typemap(freearg) const Char (&)[ANY] ""; %typemap(out,fragment=#SWIG_FromCharPtrAndSize,fragment=#SWIG_CharBufLen) Char [ANY], const Char[ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $1_dim0; %#endif %set_output(SWIG_FromCharPtrAndSize($1, size)); } /* varin */ %typemap(varin,fragment=#SWIG_AsCharArray) Char [ANY] { int res = SWIG_AsCharArray($input, $1, $1_dim0); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } } /* varout */ %typemap(varout,fragment=#SWIG_CharBufLen) Char [ANY], const Char [ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $1_dim0; %#endif %set_varoutput(SWIG_FromCharPtrAndSize($1, size)); } /* constant */ %typemap(constcode,fragment=#SWIG_CharBufLen) Char [ANY], const Char [ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $value_dim0; %#endif %set_constant("$symname", SWIG_FromCharPtrAndSize($value,size)); } #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,fragment=#SWIG_CharBufLen) Char [ANY], const Char [ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $1_dim0; %#endif $input = SWIG_FromCharPtrAndSize($1, size); } /* directorout */ %typemap(directorout,noblock=1,fragment=#SWIG_AsCharArray) Char [ANY] (Char temp[$result_dim0]), const Char [ANY] (Char temp[$result_dim0], int res) { res = SWIG_AsCharArray($input, temp, $result_dim0); if (!SWIG_IsOK(res)) { %dirout_fail(res, "$type"); } $result = temp; } #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* typecheck */ %typemap(typecheck,noblock=1,precedence=StringCode, fragment=#SWIG_AsCharArray) Char [ANY], const Char[ANY] { int res = SWIG_AsCharArray($input, (Char *)0, $1_dim0); $1 = SWIG_CheckState(res); } /* throws */ %typemap(throws,fragment=#SWIG_CharBufLen) Char [ANY], const Char[ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $1_dim0; %#endif %raise(SWIG_FromCharPtrAndSize($1, size), "$type", 0); } /* ------------------------------------------------------------------- * --- Really fix size Char arrays, including '\0'chars at the end --- * ------------------------------------------------------------------- */ %typemap(varout,noblock=1,fragment=#SWIG_FromCharPtrAndSize) Char FIXSIZE[ANY], const Char FIXSIZE[ANY] { %set_varoutput(SWIG_FromCharPtrAndSize($1, $1_dim0)); } %typemap(out,noblock=1,fragment=#SWIG_FromCharPtrAndSize) Char FIXSIZE[ANY], const Char FIXSIZE[ANY] { %set_output(SWIG_FromCharPtrAndSize($1, $1_dim0)); } #if defined(SWIG_DIRECTOR_TYPEMAPS) %typemap(directorin,noblock=1,fragment=#SWIG_FromCharPtrAndSize) Char FIXSIZE[ANY], const Char FIXSIZE[ANY] { $input = SWIG_FromCharPtrAndSize($1, $1_dim0); } #endif /* SWIG_DIRECTOR_TYPEMAPS */ %typemap(throws,noblock=1,fragment=#SWIG_FromCharPtrAndSize) Char FIXSIZE[ANY], const Char FIXSIZE[ANY] { %raise(SWIG_FromCharPtrAndSize($1, $1_dim0), "$type", 0); } /* ------------------------------------------------------------ * --- String & length --- * ------------------------------------------------------------ */ /* Here len doesn't include the '0' terminator */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (Char *STRING, size_t LENGTH) (int res, Char *buf = 0, size_t size = 0, int alloc = 0), (const Char *STRING, size_t LENGTH) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = %reinterpret_cast(buf, $1_ltype); $2 = %numeric_cast(size - 1, $2_ltype); } %typemap(freearg,noblock=1,match="in") (Char *STRING, size_t LENGTH) { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* old 'int' form */ %typemap(in) (Char *STRING, int LENGTH) = (Char *STRING, size_t LENGTH); %typemap(freearg) (Char *STRING, int LENGTH) = (Char *STRING, size_t LENGTH); /* Here size includes the '0' terminator */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (Char *STRING, size_t SIZE) (int res, Char *buf = 0, size_t size = 0, int alloc = 0), (const Char *STRING, size_t SIZE) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = %reinterpret_cast(buf, $1_ltype); $2 = %numeric_cast(size, $2_ltype); } %typemap(freearg,noblock=1,match="in") (Char *STRING, size_t SIZE) { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* old 'int' form */ %typemap(in) (Char *STRING, int SIZE) = (Char *STRING, size_t SIZE); %typemap(freearg) (Char *STRING, int SIZE) = (Char *STRING, size_t SIZE); /* reverse order versions */ /* Here len doesn't include the '0' terminator */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (size_t LENGTH, Char *STRING) (int res, Char *buf = 0, size_t size = 0, int alloc = 0), (size_t LENGTH, const Char *STRING) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $2 = %reinterpret_cast(buf, $2_ltype) ; $1 = %numeric_cast(size - 1, $1_ltype) ; } %typemap(freearg, noblock=1, match="in") (size_t LENGTH, Char *STRING) { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* old 'int' form */ %typemap(in) (int LENGTH, Char *STRING) = (size_t LENGTH, Char *STRING); %typemap(freearg) (int LENGTH, Char *STRING) = (size_t LENGTH, Char *STRING); /* Here size includes the '0' terminator */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (size_t SIZE, Char *STRING) (int res, Char *buf = 0, size_t size = 0, int alloc = 0), (size_t SIZE, const Char *STRING) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type",$symname, $argnum); } $2 = %reinterpret_cast(buf, $2_ltype) ; $1 = %numeric_cast(size, $1_ltype) ; } %typemap(freearg, noblock=1, match="in") (size_t SIZE, Char *STRING) { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* old 'int' form */ %typemap(in) (int SIZE, Char *STRING) = (size_t SIZE, Char *STRING); %typemap(freearg) (int SIZE, Char *STRING) = (size_t SIZE, Char *STRING); %enddef /* ------------------------------------------------------------ * --- String fragment methods --- * ------------------------------------------------------------ */ #ifndef %_typemap2_string %define %_typemap2_string(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_NewCopyCharArray, SWIG_DeleteCharArray, FragLimits, CHAR_MIN, CHAR_MAX) %fragment("SWIG_From"#CharName"Ptr","header",fragment=#SWIG_FromCharPtrAndSize) { SWIGINTERNINLINE SWIG_Object SWIG_From##CharName##Ptr(const Char *cptr) { return SWIG_FromCharPtrAndSize(cptr, (cptr ? SWIG_CharPtrLen(cptr) : 0)); } } %fragment("SWIG_From"#CharName"Array","header",fragment=#SWIG_FromCharPtrAndSize) { SWIGINTERNINLINE SWIG_Object SWIG_From##CharName##Array(const Char *cptr, size_t size) { return SWIG_FromCharPtrAndSize(cptr, size); } } %fragment("SWIG_As" #CharName "Ptr","header",fragment=#SWIG_AsCharPtrAndSize) { %define_as(SWIG_As##CharName##Ptr(obj, val, alloc), SWIG_AsCharPtrAndSize(obj, val, NULL, alloc)) } %fragment("SWIG_As" #CharName "Array","header",fragment=#SWIG_AsCharPtrAndSize) { SWIGINTERN int SWIG_As##CharName##Array(SWIG_Object obj, Char *val, size_t size) { Char* cptr = 0; size_t csize = 0; int alloc = SWIG_OLDOBJ; int res = SWIG_AsCharPtrAndSize(obj, &cptr, &csize, &alloc); if (SWIG_IsOK(res)) { /* special case of single char conversion when we don't need space for NUL */ if (size == 1 && csize == 2 && cptr && !cptr[1]) --csize; if (csize <= size) { if (val) { if (csize) memcpy(val, cptr, csize*sizeof(Char)); if (csize < size) memset(val + csize, 0, (size - csize)*sizeof(Char)); } if (alloc == SWIG_NEWOBJ) { SWIG_DeleteCharArray(cptr); res = SWIG_DelNewMask(res); } return res; } if (alloc == SWIG_NEWOBJ) SWIG_DeleteCharArray(cptr); } return SWIG_TypeError; } } /* Char */ %fragment(SWIG_From_frag(Char),"header",fragment=#SWIG_FromCharPtrAndSize) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(Char)(Char c) { return SWIG_FromCharPtrAndSize(&c,1); } } %fragment(SWIG_AsVal_frag(Char),"header", fragment="SWIG_As"#CharName"Array", fragment=FragLimits, fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(Char)(SWIG_Object obj, Char *val) { int res = SWIG_As##CharName##Array(obj, val, 1); if (!SWIG_IsOK(res)) { long v; res = SWIG_AddCast(SWIG_AsVal(long)(obj, &v)); if (SWIG_IsOK(res)) { if ((CHAR_MIN <= v) && (v <= CHAR_MAX)) { if (val) *val = %numeric_cast(v, Char); } else { res = SWIG_OverflowError; } } } return res; } } %_typemap_string(StringCode, Char, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_As##CharName##Ptr, SWIG_From##CharName##Ptr, SWIG_As##CharName##Array, SWIG_NewCopyCharArray, SWIG_DeleteCharArray) %enddef #endif /* ------------------------------------------------------------ * String typemaps and fragments, with default allocators * ------------------------------------------------------------ */ %define %typemaps_string(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, FragLimits, CHAR_MIN, CHAR_MAX) %_typemap2_string(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, %new_copy_array, %delete_array, FragLimits, CHAR_MIN, CHAR_MAX) %enddef /* ------------------------------------------------------------ * String typemaps and fragments, with custom allocators * ------------------------------------------------------------ */ %define %typemaps_string_alloc(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_NewCopyCharArray, SWIG_DeleteCharArray, FragLimits, CHAR_MIN, CHAR_MAX) %_typemap2_string(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_NewCopyCharArray, SWIG_DeleteCharArray, FragLimits, CHAR_MIN, CHAR_MAX) %enddef swig-4.0.2/Lib/typemaps/valtypes.swg0000644000175000017500000001574313667507523017335 0ustar williamwilliam/*--------------------------------------------------------------------- * Value typemaps (Type, const Type&) for value types, such as * fundamental types (int, double), that define the AsVal/From * methods. * * To apply them, just use one of the following macros: * * %typemaps_from(FromMeth, FromFrag, Type) * %typemaps_asval(CheckCode, AsValMeth, AsValFrag, Type) * %typemaps_asvalfrom(CheckCode, AsValMeth, FromMeth, AsValFrag, FromFrag, Type) * * or the simpler and normalize form: * * %typemaps_asvalfromn(CheckCode, Type) * * Also, you can use the individual typemap definitions: * * %value_in_typemap(asval_meth,frag,Type) * %value_varin_typemap(asval_meth,frag,Type) * %value_typecheck_typemap(checkcode,asval_meth,frag,Type) * %value_directorout_typemap(asval_meth,frag,Type) * * %value_out_typemap(from_meth,frag,Type) * %value_varout_typemap(from_meth,frag,Type) * %value_constcode_typemap(from_meth,frag,Type) * %value_directorin_typemap(from_meth,frag,Type) * %value_throws_typemap(from_meth,frag,Type) * *---------------------------------------------------------------------*/ /* in */ %define %value_in_typemap(asval_meth,frag,Type...) %typemap(in,noblock=1,fragment=frag) Type (Type val, int ecode = 0) { ecode = asval_meth($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$ltype", $symname, $argnum); } $1 = %static_cast(val,$ltype); } %typemap(freearg) Type ""; %typemap(in,noblock=1,fragment=frag) const Type & ($*ltype temp, Type val, int ecode = 0) { ecode = asval_meth($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$*ltype", $symname, $argnum); } temp = %static_cast(val, $*ltype); $1 = &temp; } %typemap(freearg) const Type& ""; %enddef /* out */ %define %value_out_typemap(from_meth,frag,Type...) %typemap(out,noblock=1,fragment=frag) Type, const Type { %set_output(from_meth(%static_cast($1,Type))); } %typemap(out,noblock=1,fragment=frag) const Type& { %set_output(from_meth(%static_cast(*$1,Type))); } %enddef /* varin */ %define %value_varin_typemap(asval_meth,frag,Type...) %typemap(varin,fragment=frag) Type { Type val; int res = asval_meth($input, &val); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = %static_cast(val,$ltype); } %enddef /* varout */ %define %value_varout_typemap(from_meth,frag,Type...) %typemap(varout,noblock=1,fragment=frag) Type, const Type& { %set_varoutput(from_meth(%static_cast($1,Type))); } %enddef /* constant installation code */ %define %value_constcode_typemap(from_meth,frag,Type...) %typemap(constcode,noblock=1,fragment=frag) Type { %set_constant("$symname", from_meth(%static_cast($value,Type))); } %enddef #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %define %value_directorin_typemap(from_meth,frag,Type...) %typemap(directorin,noblock=1,fragment=frag) Type *DIRECTORIN { $input = from_meth(%static_cast(*$1,Type)); } %typemap(directorin,noblock=1,fragment=frag) Type, const Type& { $input = from_meth(%static_cast($1,Type)); } %enddef /* directorout */ %define %value_directorout_typemap(asval_meth,frag,Type...) %typemap(directorargout,noblock=1,fragment=frag) Type *DIRECTOROUT(Type swig_val, int swig_res) { swig_res = asval_meth($result, &swig_val); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } *$1 = swig_val; } %typemap(directorout,noblock=1,fragment=frag) Type { Type swig_val; int swig_res = asval_meth($input, &swig_val); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } $result = %static_cast(swig_val,$type); } %typemap(directorout,noblock=1,fragment=frag,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) const Type& { Type swig_val; int swig_res = asval_meth($input, &swig_val); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } $basetype *temp = new $basetype(($basetype)swig_val); swig_acquire_ownership(temp); $result = temp; } %typemap(directorfree,noblock=1) const Type & { if (director) { director->swig_release_ownership(%as_voidptr($input)); } } %typemap(directorout,fragment=frag) Type &DIRECTOROUT = Type %enddef #else #define %value_directorin_typemap(from_meth,frag,Type...) #define %value_directorout_typemap(asval_meth,frag,Type...) #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* throws */ %define %value_throws_typemap(from_meth,frag,Type...) %typemap(throws,noblock=1,fragment=frag) Type { %raise(from_meth(%static_cast($1,Type)), "$type", 0); } %enddef /* typecheck */ %define %value_typecheck_typemap(check,asval_meth,frag,Type...) %typemap(typecheck,precedence=check,fragment=frag) Type, const Type& { int res = asval_meth($input, NULL); $1 = SWIG_CheckState(res); } %enddef /*--------------------------------------------------------------------- * typemap definition for types with AsVal methods *---------------------------------------------------------------------*/ %define %typemaps_asval(CheckCode, AsValMeth, AsValFrag, Type...) %value_in_typemap(%arg(AsValMeth), %arg(AsValFrag), Type); %value_varin_typemap(%arg(AsValMeth), %arg(AsValFrag), Type); %value_directorout_typemap(%arg(AsValMeth), %arg(AsValFrag), Type); %value_typecheck_typemap(%arg(CheckCode), %arg(AsValMeth), %arg(AsValFrag), Type); %value_input_typemap(%arg(CheckCode), %arg(AsValMeth), %arg(AsValFrag), Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with from method *---------------------------------------------------------------------*/ %define %typemaps_from(FromMeth, FromFrag, Type...) %value_out_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_varout_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_constcode_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_directorin_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_throws_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_output_typemap(%arg(FromMeth), %arg(FromFrag), Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with alval/from method *---------------------------------------------------------------------*/ %define %typemaps_asvalfrom(CheckCode, AsValMeth, FromMeth, AsValFrag, FromFrag, Type...) %typemaps_asval(%arg(CheckCode), %arg(AsValMeth), %arg(AsValFrag), Type); %typemaps_from(%arg(FromMeth), %arg(FromFrag), Type); %value_inout_typemap(Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with for 'normalized' asval/from methods *---------------------------------------------------------------------*/ %define %typemaps_asvalfromn(CheckCode, Type...) %typemaps_asvalfrom(%arg(CheckCode), SWIG_AsVal(Type), SWIG_From(Type), %arg(SWIG_AsVal_frag(Type)), %arg(SWIG_From_frag(Type)), Type); %enddef swig-4.0.2/Lib/typemaps/misctypes.swg0000644000175000017500000000072313667507523017476 0ustar williamwilliam /* ------------------------------------------------------------ * --- ANSI/Posix C/C++ types --- * ------------------------------------------------------------ */ #ifdef __cplusplus %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; %apply ptrdiff_t { std::ptrdiff_t }; %apply const ptrdiff_t& { const std::ptrdiff_t& }; #ifndef SWIG_INOUT_NODEF %apply size_t& { std::size_t& }; %apply ptrdiff_t& { std::ptrdiff_t& }; #endif #endif swig-4.0.2/Lib/typemaps/string.swg0000644000175000017500000000141113667507523016757 0ustar williamwilliam%ensure_fragment(SWIG_AsCharPtrAndSize) %ensure_fragment(SWIG_FromCharPtrAndSize) %types(char *); %fragment("SWIG_pchar_descriptor","header") { SWIGINTERN swig_type_info* SWIG_pchar_descriptor(void) { static int init = 0; static swig_type_info* info = 0; if (!init) { info = SWIG_TypeQuery("_p_char"); init = 1; } return info; } } %fragment("SWIG_strnlen","header",fragment="SWIG_FromCharPtrAndSize") { SWIGINTERN size_t SWIG_strnlen(const char* s, size_t maxlen) { const char *p; for (p = s; maxlen-- && *p; p++) ; return p - s; } } %include %typemaps_string(%checkcode(STRING), %checkcode(CHAR), char, Char, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, strlen, SWIG_strnlen, "", CHAR_MIN, CHAR_MAX) swig-4.0.2/Lib/typemaps/std_except.swg0000644000175000017500000000233413667507523017620 0ustar williamwilliam%include /* Mark all of std exception classes as "exception classes" via the "exceptionclass" feature. If needed, you can disable it by using %noexceptionclass. */ %define %std_exception_map(Exception, Code) %exceptionclass Exception; #if !defined(SWIG_STD_EXCEPTIONS_AS_CLASSES) %typemap(throws,noblock=1) Exception { SWIG_exception_fail(Code, $1.what()); } %ignore Exception; struct Exception { }; #endif %enddef namespace std { %std_exception_map(bad_cast, SWIG_TypeError); %std_exception_map(bad_exception, SWIG_SystemError); %std_exception_map(domain_error, SWIG_ValueError); %std_exception_map(exception, SWIG_SystemError); %std_exception_map(invalid_argument, SWIG_ValueError); %std_exception_map(length_error, SWIG_IndexError); %std_exception_map(logic_error, SWIG_RuntimeError); %std_exception_map(out_of_range, SWIG_IndexError); %std_exception_map(overflow_error, SWIG_OverflowError); %std_exception_map(range_error, SWIG_OverflowError); %std_exception_map(runtime_error, SWIG_RuntimeError); %std_exception_map(underflow_error, SWIG_OverflowError); } %include swig-4.0.2/Lib/typemaps/implicit.swg0000644000175000017500000001156213667507523017273 0ustar williamwilliam/* The %implicit macro allows a SwigType (Class) to be accepted as an input parameter and use its implicit constructors when needed. For example: %implicit(A, int, double, B); %inline { struct B { }; struct A { int ii; A(int i) { ii = 1; } A(double d) { ii = 2; } A(const B& b) { ii = 3; } }; int get(A a) { return a.ii; } } Here, you can call 'get' as get(1) ==> get(A(1)) get(2.0) ==> get(A(2.0)) get(B()) ==> get(A(B())) and swig will construct an 'A' temporal variable using the corresponding implicit constructor. The plain implicit macro takes care of simple type list. If it doesn't work because you are passing template types with commas, then use the %implicit_{1,2,3} versions and/or the %arg macro. */ %define %implicit_type(Type...) %traits_swigtype(Type); %enddef %define %implicit_frag(Type...) ,fragment=SWIG_Traits_frag(Type) %enddef %define %implicit_code(Type...) { Type _v; int res = swig::asval(obj, &_v); if (SWIG_IsOK(res)) { if (val) *val = new value_type(static_cast(_v)); return SWIG_AddNewMask(res); } } %enddef /* implicit */ %define %implicit(Type, ...) %formacro_1(%implicit_type,__VA_ARGS__); %fragment(SWIG_Traits_frag(Type),"header", fragment="StdTraits" %formacro_1(%implicit_frag,__VA_ARGS__)) %{ namespace swig { template <> struct traits { typedef pointer_category category; static const char* type_name() { return "Type"; } }; template <> struct traits_asptr< Type > { typedef Type value_type; static int asptr(SWIG_Object obj, value_type **val) { Type *vptr; static swig_type_info* descriptor = SWIG_TypeQuery("Type *"); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&vptr, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = vptr; return res; } else { %formacro_1(%implicit_code,__VA_ARGS__) } return SWIG_TypeError; } }; } %} %typemap_traits_ptr(%checkcode(POINTER),Type); %enddef /* implicit_1 */ %define %implicit_1(Type, Imp1) %traits_swigtype(Imp1); %fragment(SWIG_Traits_frag(Type),"header", fragment="StdTraits", fragment=SWIG_Traits_frag(Imp1)) %{ namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return "Type"; } }; template <> struct traits_asptr< Type > { typedef Type value_type; static int asptr(SWIG_Object obj, value_type **val) { Type *vptr; static swig_type_info* descriptor = SWIG_TypeQuery("Type *"); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&vptr, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = vptr; return res; } else { %implicit_code(Imp1); } return SWIG_TypeError; } }; } %} %typemap_traits_ptr(%checkcode(POINTER),Type); %enddef /* implicit_2 */ %define %implicit_2(Type, Imp1, Imp2) %traits_swigtype(Imp1); %traits_swigtype(Imp2); %fragment(SWIG_Traits_frag(Type),"header", fragment="StdTraits", fragment=SWIG_Traits_frag(Imp1), fragment=SWIG_Traits_frag(Imp2)) %{ namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return "Type"; } }; template <> struct traits_asptr< Type > { typedef Type value_type; static int asptr(SWIG_Object obj, value_type **val) { Type *vptr; static swig_type_info* descriptor = SWIG_TypeQuery("Type *"); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&vptr, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { %implicit_code(Imp1); %implicit_code(Imp2); } return SWIG_TypeError; } }; } %} %typemap_traits_ptr(%checkcode(POINTER),Type); %enddef /* implicit_3 */ %define %implicit_3(Type, Imp1, Imp2, Imp3) %traits_swigtype(Imp1); %traits_swigtype(Imp2); %traits_swigtype(Imp3); %fragment(SWIG_Traits_frag(Type),"header", fragment="StdTraits", fragment=SWIG_Traits_frag(Imp1), fragment=SWIG_Traits_frag(Imp2), fragment=SWIG_Traits_frag(Imp3)) %{ namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return "Type"; } }; template <> struct traits_asptr< Type > { typedef Type value_type; static int asptr(SWIG_Object obj, value_type **val) { Type *vptr; static swig_type_info* descriptor = SWIG_TypeQuery("Type *"); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&vptr, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = vptr; return res; } else { %implicit_code(Imp1); %implicit_code(Imp2); %implicit_code(Imp3); } return SWIG_TypeError; } }; } %} %typemap_traits_ptr(%checkcode(POINTER),Type); %enddef swig-4.0.2/Lib/typemaps/swigobject.swg0000644000175000017500000000157613667507523017625 0ustar williamwilliam/* ------------------------------------------------------------ * Language Object * - Just pass straight through unmodified * ------------------------------------------------------------ */ %typemap(in) SWIG_Object "$1 = $input;"; %typemap(in,noblock=1) SWIG_Object const & ($*ltype temp) { temp = %static_cast($input, $*ltype); $1 = &temp; } %typemap(out,noblock=1) SWIG_Object { %set_output($1); } %typemap(out,noblock=1) SWIG_Object const & { %set_output(*$1); } %typecheck(SWIG_TYPECHECK_SWIGOBJECT) SWIG_Object "$1 = ($input != 0);"; %typemap(throws,noblock=1) SWIG_Object { %raise($1, "$type", 0); } %typemap(constcode,noblock=1) SWIG_Object { %set_constant("$symname", $value); } #if defined(SWIG_DIRECTOR_TYPEMAPS) %typemap(directorin) SWIG_Object "$input = $1;"; %typemap(directorout) SWIG_Object "$result = $input;"; #endif /* SWIG_DIRECTOR_TYPEMAPS */ swig-4.0.2/Lib/typemaps/cdata.swg0000644000175000017500000000352013667507523016530 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cdata.swg * * This library file contains macros for manipulating raw C data as strings. * ----------------------------------------------------------------------------- */ %{ typedef struct SWIGCDATA { char *data; size_t len; } SWIGCDATA; %} /* ----------------------------------------------------------------------------- * Typemaps for returning binary data * ----------------------------------------------------------------------------- */ %typemap(out,noblock=1,fragment="SWIG_FromCharPtrAndSize") SWIGCDATA { %set_output(SWIG_FromCharPtrAndSize($1.data,$1.len)); } %typemap(in) (const void *indata, size_t inlen) = (char *STRING, size_t SIZE); /* ----------------------------------------------------------------------------- * %cdata(TYPE [, NAME]) * * Convert raw C data to a binary string. * ----------------------------------------------------------------------------- */ %define %cdata(TYPE,NAME...) %insert("header") { #ifdef __cplusplus extern "C" { #endif #if #NAME == "" static SWIGCDATA cdata_##TYPE(TYPE *ptr, size_t nelements) #else static SWIGCDATA cdata_##NAME(TYPE *ptr, size_t nelements) #endif { SWIGCDATA d; d.data = (char *) ptr; #if #TYPE != "void" d.len = nelements*sizeof(TYPE); #else d.len = nelements; #endif return d; } #ifdef __cplusplus } #endif } #ifdef __cplusplus extern "C" #endif #if #NAME == "" SWIGCDATA cdata_##TYPE(TYPE *ptr, size_t nelements = 1); #else SWIGCDATA cdata_##NAME(TYPE *ptr, size_t nelements = 1); #endif %enddef %rename(cdata) ::cdata_void(void *ptr, size_t nelements = 1); %cdata(void); /* Memory move function. Due to multi-argument typemaps this appears to be wrapped as void memmove(void *data, const char *s); */ void memmove(void *data, const void *indata, size_t inlen); swig-4.0.2/Lib/typemaps/inoutlist.swg0000644000175000017500000002241113667507523017506 0ustar williamwilliam/* ------------------------------------------------------------ * * Define the IN/OUTPUT typemaps assuming the output parameters are * returned in a list, i.e., they are not directly modified. * * The user should provide the %append_output(result, obj) method, * via a macro, which append a particular object to the result. * * * In Tcl, for example, the file is used as: * * #define %append_output(obj) Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),obj); * %include * * while in Python it is used as: * * #define %append_output(obj) $result = SWIG_Python_AppendResult($result, obj) * %include * * where the method SWIG_Python_AppendResult is defined inside the * %append_output fragment. * * If you forget to define %append_output, this file will generate * an error. * * ------------------------------------------------------------ */ // // Uncomment the following definition if you don't want the in/out // typemaps by default, ie, you prefer to use typemaps.i. // //#define SWIG_INOUT_NODEF // // Use the following definition to enable the INPUT parameters to // accept both 'by value' and 'pointer' objects. // #define SWIG_INPUT_ACCEPT_PTRS // ------------------------------------------------------------------------ // Pointer handling // // These mappings provide support for input/output arguments and common // uses for C/C++ pointers. // ------------------------------------------------------------------------ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ #if defined(SWIG_INPUT_ACCEPT_PTRS) #define %check_input_ptr(input,arg,desc,disown) (SWIG_IsOK((res = SWIG_ConvertPtr(input,%as_voidptrptr(arg),desc,disown)))) #else #define %check_input_ptr(input,arg,desc,disown) (SWIG_IsOK((res = SWIG_ERROR))) #endif %define %_value_input_typemap(code, asval_meth, asval_frag, Type) %typemap(in,noblock=1,fragment=asval_frag) Type *INPUT ($*ltype temp, int res = 0) { if (!%check_input_ptr($input,&$1,$descriptor,$disown)) { Type val; int ecode = asval_meth($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$*ltype",$symname, $argnum); } temp = %static_cast(val, $*ltype); $1 = &temp; res = SWIG_AddTmpMask(ecode); } } %typemap(in,noblock=1,fragment=asval_frag) Type &INPUT($*ltype temp, int res = 0) { if (!%check_input_ptr($input,&$1,$descriptor,$disown)) { Type val; int ecode = asval_meth($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$*ltype",$symname, $argnum); } temp = %static_cast(val, $*ltype); $1 = &temp; res = SWIG_AddTmpMask(ecode); } } %typemap(freearg,noblock=1,match="in") Type *INPUT, Type &INPUT { if (SWIG_IsNewObj(res$argnum)) %delete($1); } %typemap(typecheck,noblock=1,precedence=code,fragment=asval_frag) Type *INPUT, Type &INPUT { void *ptr = 0; int res = asval_meth($input, 0); $1 = SWIG_CheckState(res); if (!$1) { $1 = %check_input_ptr($input,&ptr,$1_descriptor,0); } } %enddef %define %_ptr_input_typemap(code,asptr_meth,asptr_frag,Type) %typemap(in,noblock=1,fragment=asptr_frag) Type *INPUT(int res = 0) { res = asptr_meth($input, &$1); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } res = SWIG_AddTmpMask(res); } %typemap(in,noblock=1,fragment=asptr_frag) Type &INPUT(int res = 0) { res = asptr_meth($input, &$1); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } if (!$1) { %argument_nullref("$type",$symname, $argnum); } res = SWIG_AddTmpMask(res); } %typemap(freearg,noblock=1,match="in") Type *INPUT, Type &INPUT { if (SWIG_IsNewObj(res$argnum)) %delete($1); } %typemap(typecheck,noblock=1,precedence=code,fragment=asptr_frag) Type *INPUT, Type &INPUT { int res = asptr_meth($input, (Type**)0); $1 = SWIG_CheckState(res); } %enddef // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a list. For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters): double modf(double x, double *ip); You could wrap it with SWIG as follows : double modf(double x, double *OUTPUT); or you can use the %apply directive : %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The output of the function would be a list containing both output values. */ %define %_value_output_typemap(from_meth, from_frag, Type) %typemap(in,numinputs=0,noblock=1) Type *OUTPUT ($*1_ltype temp, int res = SWIG_TMPOBJ), Type &OUTPUT ($*1_ltype temp, int res = SWIG_TMPOBJ) { $1 = &temp; } %typemap(argout,noblock=1,fragment=from_frag) Type *OUTPUT, Type &OUTPUT { if (SWIG_IsTmpObj(res$argnum)) { %append_output(from_meth((*$1))); } else { int new_flags = SWIG_IsNewObj(res$argnum) ? (SWIG_POINTER_OWN | %newpointer_flags) : %newpointer_flags; %append_output(SWIG_NewPointerObj((void*)($1), $1_descriptor, new_flags)); } } %enddef // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a list. For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : void neg(double *INOUT); or you can use the %apply directive : %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value. Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %define %_value_inout_typemap(Type) %typemap(in) Type *INOUT = Type *INPUT; %typemap(in) Type &INOUT = Type &INPUT; %typemap(typecheck) Type *INOUT = Type *INPUT; %typemap(typecheck) Type &INOUT = Type &INPUT; %typemap(argout) Type *INOUT = Type *OUTPUT; %typemap(argout) Type &INOUT = Type &OUTPUT; %enddef %define %_ptr_inout_typemap(Type) %_value_inout_typemap(%arg(Type)) %typemap(typecheck) Type *INOUT = Type *INPUT; %typemap(typecheck) Type &INOUT = Type &INPUT; %typemap(freearg) Type *INOUT = Type *INPUT; %typemap(freearg) Type &INOUT = Type &INPUT; %enddef #ifndef SWIG_INOUT_NODEF %define %value_input_typemap(code,asval_meth, asval_frag, Type...) %_value_input_typemap(%arg(code),%arg(asval_meth),%arg(asval_frag),%arg(Type)) %enddef %define %ptr_input_typemap(code,asval_meth,asval_frag,Type...) %_ptr_input_typemap(%arg(code),%arg(asval_meth),%arg(asval_frag),%arg(Type)) %enddef %define %value_output_typemap(from_meth,from_frag,Type...) %_value_output_typemap(%arg(from_meth),%arg(from_frag),%arg(Type)) %enddef #define %value_inout_typemap(Type...) %_value_inout_typemap(%arg(Type)) #define %ptr_inout_typemap(Type...) %_ptr_inout_typemap(%arg(Type)) #else /* You need to include typemaps.i */ #define %value_output_typemap(Type...) #define %value_input_typemap(Type...) #define %value_inout_typemap(Type...) #define %ptr_input_typemap(Type...) #define %ptr_inout_typemap(Type...) #endif /* SWIG_INOUT_DEFAULT */ /*---------------------------------------------------------------------- Front ends. use the following macros to define your own IN/OUTPUT/INOUT typemaps ------------------------------------------------------------------------*/ %define %typemaps_inout(Code, AsValMeth, FromMeth, AsValFrag, FromFrag, Type...) %_value_input_typemap(%arg(Code), %arg(AsValMeth), %arg(AsValFrag), %arg(Type)); %_value_output_typemap(%arg(FromMeth), %arg(FromFrag), %arg(Type)); %_value_inout_typemap(%arg(Type)); %enddef %define %typemaps_inoutn(Code,Type...) %typemaps_inout(%arg(Code), %arg(SWIG_AsVal(Type)), %arg(SWIG_From(Type)), %arg(SWIG_AsVal_frag(Type)), %arg(SWIG_From_frag(Type)), %arg(Type)); %enddef swig-4.0.2/Lib/typemaps/swigtype.swg0000644000175000017500000005646413667507523017346 0ustar williamwilliam/* ----------------------------------------------------------------------------- * --- Input arguments --- * ----------------------------------------------------------------------------- */ /* Pointers and arrays */ %typemap(in, noblock=1) SWIGTYPE *(void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp,$descriptor, $disown | %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg) SWIGTYPE * ""; %typemap(in, noblock=1) SWIGTYPE [] (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp,$descriptor, $disown | %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg) SWIGTYPE [] ""; %typemap(in, noblock=1) SWIGTYPE *const& (void *argp = 0, int res = 0, $*1_ltype temp) { res = SWIG_ConvertPtr($input, &argp, $*descriptor, $disown | %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$*ltype", $symname, $argnum); } temp = %reinterpret_cast(argp, $*ltype); $1 = %reinterpret_cast(&temp, $1_ltype); } %typemap(freearg) SWIGTYPE *const& ""; /* Reference */ %typemap(in, noblock=1) SWIGTYPE & (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg) SWIGTYPE & ""; #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(in,noblock=1,implicitconv=1) const SWIGTYPE & (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg,noblock=1,match="in",implicitconv=1) const SWIGTYPE & { if (SWIG_IsNewObj(res$argnum)) %delete($1); } #else %typemap(in,noblock=1) const SWIGTYPE & (void *argp, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } #endif /* Rvalue reference */ %typemap(in, noblock=1) SWIGTYPE && (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg) SWIGTYPE && ""; #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(in,noblock=1,implicitconv=1) const SWIGTYPE && (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg,noblock=1,match="in",implicitconv=1) const SWIGTYPE && { if (SWIG_IsNewObj(res$argnum)) %delete($1); } #else %typemap(in,noblock=1) const SWIGTYPE && (void *argp, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } #endif /* By value */ #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(in,implicitconv=1) SWIGTYPE (void *argp, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $&descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $<ype temp = %reinterpret_cast(argp, $<ype); $1 = *temp; if (SWIG_IsNewObj(res)) %delete(temp); } } #else %typemap(in) SWIGTYPE (void *argp, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $&descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, $<ype)); } } #endif /* ----------------------------------------------------------------------------- * --- Output arguments --- * ----------------------------------------------------------------------------- */ /* Pointers, references */ %typemap(out,noblock=1) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE[] { %set_output(SWIG_NewPointerObj(%as_voidptr($1), $descriptor, $owner | %newpointer_flags)); } %typemap(out, noblock=1) SWIGTYPE *const& { %set_output(SWIG_NewPointerObj(%as_voidptr(*$1), $*descriptor, $owner | %newpointer_flags)); } /* Return by value */ %typemap(out, noblock=1) SWIGTYPE { %set_output(SWIG_NewPointerObj(%new_copy($1, $ltype), $&descriptor, SWIG_POINTER_OWN | %newpointer_flags)); } /* ----------------------------------------------------------------------------- * --- Variable input --- * ----------------------------------------------------------------------------- */ /* memberin/globalin/varin, for fix arrays. */ %typemap(memberin) SWIGTYPE [ANY] { if ($input) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) *($1_basetype *)&$1[ii] = *(($1_basetype *)$input + ii); } else { %variable_nullref("$type","$name"); } } %typemap(globalin) SWIGTYPE [ANY] { if ($input) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) *($1_basetype *)&$1[ii] = *(($1_basetype *)$input + ii); } else { %variable_nullref("$type","$name"); } } %typemap(varin) SWIGTYPE [ANY] { $basetype *inp = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&inp), $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } else if (inp) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) *($1_basetype *)&$1[ii] = *(($1_basetype *)inp + ii); } else { %variable_nullref("$type", "$name"); } } /* memberin/globalin/varin, for fix double arrays. */ %typemap(memberin) SWIGTYPE [ANY][ANY] { if ($input) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) { if ($input[ii]) { size_t jj = 0; for (; jj < (size_t)$1_dim1; ++jj) $1[ii][jj] = $input[ii][jj]; } else { %variable_nullref("$type","$name"); } } } else { %variable_nullref("$type","$name"); } } %typemap(globalin) SWIGTYPE [ANY][ANY] { if ($input) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) { if ($input[ii]) { size_t jj = 0; for (; jj < (size_t)$1_dim1; ++jj) $1[ii][jj] = $input[ii][jj]; } else { %variable_nullref("$type","$name"); } } } else { %variable_nullref("$type","$name"); } } %typemap(varin) SWIGTYPE [ANY][ANY] { $basetype (*inp)[$1_dim1] = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&inp), $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } else if (inp) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) { if (inp[ii]) { size_t jj = 0; for (; jj < (size_t)$1_dim1; ++jj) $1[ii][jj] = inp[ii][jj]; } else { %variable_nullref("$type", "$name"); } } } else { %variable_nullref("$type", "$name"); } } /* Pointers, references, and variable size arrays */ %typemap(varin,warning=SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) SWIGTYPE * { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(varin,noblock=1,warning="462:Unable to set dimensionless array variable") SWIGTYPE [] { %variable_fail(SWIG_AttributeError, "$type", "read-only $name"); } %typemap(varin,warning=SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) SWIGTYPE & { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } $1 = *(%reinterpret_cast(argp, $ltype)); } %typemap(varin,warning=SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) SWIGTYPE && { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } $1 = *(%reinterpret_cast(argp, $ltype)); } #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(varin,implicitconv=1) SWIGTYPE { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $&descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $&type temp; temp = %reinterpret_cast(argp, $&type); $1 = *temp; if (SWIG_IsNewObj(res)) %delete(temp); } } #else %typemap(varin) SWIGTYPE { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $&descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, $&type)); } } #endif /* ----------------------------------------------------------------------------- * --- Variable output --- * ----------------------------------------------------------------------------- */ /* Pointers and arrays */ %typemap(varout, noblock=1) SWIGTYPE * { %set_varoutput(SWIG_NewPointerObj(%as_voidptr($1), $descriptor, %newpointer_flags)); } %typemap(varout, noblock=1) SWIGTYPE [] { %set_varoutput(SWIG_NewPointerObj(%as_voidptr($1), $descriptor, %newpointer_flags)); } /* References */ %typemap(varout, noblock=1) SWIGTYPE & { %set_varoutput(SWIG_NewPointerObj(%as_voidptr(&$1), $descriptor, %newpointer_flags)); } %typemap(varout, noblock=1) SWIGTYPE && { %set_varoutput(SWIG_NewPointerObj(%as_voidptr(&$1), $descriptor, %newpointer_flags)); } /* Value */ %typemap(varout, noblock=1) SWIGTYPE { %set_varoutput(SWIG_NewPointerObj(%as_voidptr(&$1), $&descriptor, %newpointer_flags)); } /* ------------------------------------------------------------ * --- Typechecking rules --- * ------------------------------------------------------------ */ %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE * { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, 0); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE *const& { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $*descriptor, 0); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE & { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE && { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1,implicitconv=1) const SWIGTYPE & { int res = SWIG_ConvertPtr($input, 0, $descriptor, SWIG_POINTER_NO_NULL | %implicitconv_flag); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1,implicitconv=1) const SWIGTYPE && { int res = SWIG_ConvertPtr($input, 0, $descriptor, SWIG_POINTER_NO_NULL | %implicitconv_flag); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1,implicitconv=1) SWIGTYPE { int res = SWIG_ConvertPtr($input, 0, $&descriptor, SWIG_POINTER_NO_NULL | %implicitconv_flag); $1 = SWIG_CheckState(res); } #else %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) const SWIGTYPE & { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) const SWIGTYPE && { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $&descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } #endif /* ----------------------------------------------------------------------------- * --- Director typemaps --- * * ----------------------------------------------------------------------------- */ #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1) SWIGTYPE { $input = SWIG_NewPointerObj(%as_voidptr(new $1_ltype((const $1_ltype &)$1)), $&descriptor, SWIG_POINTER_OWN | %newpointer_flags); } %typemap(directorin,noblock=1) SWIGTYPE * { $input = SWIG_NewPointerObj(%as_voidptr($1), $descriptor, %newpointer_flags); } %typemap(directorin,noblock=1) SWIGTYPE *const& { $input = SWIG_NewPointerObj(%as_voidptr($1), $*descriptor, %newpointer_flags); } %typemap(directorin,noblock=1) SWIGTYPE & { $input = SWIG_NewPointerObj(%as_voidptr(&$1), $descriptor, %newpointer_flags); } %typemap(directorin,noblock=1) SWIGTYPE && { $input = SWIG_NewPointerObj(%as_voidptr(&$1_name), $descriptor, %newpointer_flags); } /* directorout */ #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(directorout,noblock=1,implicitconv=1) SWIGTYPE (void * swig_argp, int swig_res = 0) { swig_res = SWIG_ConvertPtr($input,&swig_argp,$&descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } $result = *(%reinterpret_cast(swig_argp, $<ype)); if (SWIG_IsNewObj(swig_res)) %delete(%reinterpret_cast(swig_argp, $<ype)); } #else %typemap(directorout,noblock=1) SWIGTYPE (void * swig_argp, int swig_res = 0) { swig_res = SWIG_ConvertPtr($input,&swig_argp,$&descriptor, %convertptr_flags); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } $result = *(%reinterpret_cast(swig_argp, $<ype)); } #endif %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE *(void *swig_argp, int swig_res, swig_owntype own) { swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor, %convertptr_flags | SWIG_POINTER_DISOWN, &own); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } $result = %reinterpret_cast(swig_argp, $ltype); swig_acquire_ownership_obj(%as_voidptr($result), own /* & TODO: SWIG_POINTER_OWN */); } %typemap(directorfree,noblock=1,match="directorout") SWIGTYPE * { if (director) { SWIG_AcquirePtr($result, director->swig_release_ownership(%as_voidptr($input))); } } %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE *const&(void *swig_argp, int swig_res, swig_owntype own) { swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $*descriptor, %convertptr_flags | SWIG_POINTER_DISOWN, &own); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } $1_ltype swig_temp = new $*1_ltype(($*1_ltype)swig_argp); swig_acquire_ownership(swig_temp); $result = swig_temp; } %typemap(directorfree,noblock=1,match="directorout") SWIGTYPE *const& { if (director) { SWIG_AcquirePtr($result, director->swig_release_ownership(%as_voidptr(*$input))); } } %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE &(void *swig_argp, int swig_res, swig_owntype own) { swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor, %convertptr_flags | SWIG_POINTER_DISOWN, &own); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } if (!swig_argp) { %dirout_nullref("$type"); } $result = %reinterpret_cast(swig_argp, $ltype); swig_acquire_ownership_obj(%as_voidptr($result), own /* & TODO: SWIG_POINTER_OWN */); } %typemap(directorfree,noblock=1,match="directorout") SWIGTYPE & { if (director) { SWIG_AcquirePtr($result, director->swig_release_ownership(%as_voidptr($input))); } } %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE &&(void *swig_argp, int swig_res, swig_owntype own) { swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor, %convertptr_flags | SWIG_POINTER_DISOWN, &own); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } if (!swig_argp) { %dirout_nullref("$type"); } $result = %reinterpret_cast(swig_argp, $ltype); swig_acquire_ownership_obj(%as_voidptr($result), own /* & TODO: SWIG_POINTER_OWN */); } %typemap(directorfree,noblock=1,match="directorout") SWIGTYPE && { if (director) { SWIG_AcquirePtr($result, director->swig_release_ownership(%as_voidptr($input))); } } #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* ------------------------------------------------------------ * --- Constants --- * ------------------------------------------------------------ */ %typemap(constcode,noblock=1) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { %set_constant("$symname", SWIG_NewPointerObj(%as_voidptr($value),$descriptor,%newpointer_flags)); } %typemap(constcode,noblock=1) SWIGTYPE { %set_constant("$symname", SWIG_NewPointerObj(%as_voidptr(&$value),$&descriptor,%newpointer_flags)); } /* ------------------------------------------------------------ * --- Exception handling --- * ------------------------------------------------------------ */ %typemap(throws,noblock=1) SWIGTYPE { %raise(SWIG_NewPointerObj(%new_copy($1, $ltype),$&descriptor,SWIG_POINTER_OWN), "$type", $&descriptor); } %typemap(throws,noblock=1) SWIGTYPE * { %raise(SWIG_NewPointerObj(%as_voidptr($1),$descriptor,0), "$type", $descriptor); } %typemap(throws,noblock=1) SWIGTYPE [ANY] { %raise(SWIG_NewPointerObj(%as_voidptr($1),$descriptor,0), "$type", $descriptor); } %typemap(throws,noblock=1) SWIGTYPE & { %raise(SWIG_NewPointerObj(%as_voidptr(&$1),$descriptor,0), "$type", $descriptor); } %typemap(throws,noblock=1) SWIGTYPE && { %raise(SWIG_NewPointerObj(%as_voidptr(&$1),$descriptor,0), "$type", $descriptor); } %typemap(throws,noblock=1) (...) { SWIG_exception_fail(SWIG_RuntimeError,"unknown exception"); } /* ------------------------------------------------------------ * --- CLASS::* typemaps --- * ------------------------------------------------------------ */ %typemap(in) SWIGTYPE (CLASS::*) { int res = SWIG_ConvertMember($input, %as_voidptr(&$1), sizeof($type),$descriptor); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } } %typemap(out,noblock=1) SWIGTYPE (CLASS::*) { %set_output(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); } %typemap(varin) SWIGTYPE (CLASS::*) { int res = SWIG_ConvertMember($input,%as_voidptr(&$1), sizeof($type), $descriptor); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } } %typemap(varout,noblock=1) SWIGTYPE (CLASS::*) { %set_varoutput(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); } %typemap(constcode,noblock=1) SWIGTYPE (CLASS::*) { %set_constant("$symname", SWIG_NewMemberObj(%as_voidptr(&$value), sizeof($type), $descriptor)); } #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1) SWIGTYPE (CLASS::*) { $input = SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor); } /* directorout */ %typemap(directorout) SWIGTYPE (CLASS::*) { int swig_res = SWIG_ConvertMember($input,%as_voidptr(&$result), sizeof($type), $descriptor); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } } #endif %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* ------------------------------------------------------------ * --- function ptr typemaps --- * ------------------------------------------------------------ */ /* ISO C++ doesn't allow direct casting of a function ptr to a object ptr. So, maybe the ptr sizes are not the same, and we need to take some providences. */ %typemap(in) SWIGTYPE ((*)(ANY)) { int res = SWIG_ConvertFunctionPtr($input, (void**)(&$1), $descriptor); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } } %typecheck(SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE ((*)(ANY)) { void *ptr = 0; int res = SWIG_ConvertFunctionPtr($input, &ptr, $descriptor); $1 = SWIG_CheckState(res); } %typemap(out, noblock=1) SWIGTYPE ((*)(ANY)) { %set_output(SWIG_NewFunctionPtrObj((void *)($1), $descriptor)); } %typemap(varin) SWIGTYPE ((*)(ANY)) { int res = SWIG_ConvertFunctionPtr($input, (void**)(&$1), $descriptor); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } } %typemap(varout,noblock=1) SWIGTYPE ((*)(ANY)) { %set_varoutput(SWIG_NewFunctionPtrObj((void *)($1), $descriptor)); } %typemap(constcode, noblock=1) SWIGTYPE ((*)(ANY)){ %set_constant("$symname", SWIG_NewFunctionPtrObj((void *)$value, $descriptor)); } %typemap(constcode) SWIGTYPE ((* const)(ANY)) = SWIGTYPE ((*)(ANY)); #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1) SWIGTYPE ((*)(ANY)) { $input = SWIG_NewFunctionPtrObj((void*)($1), $descriptor); } /* directorout */ %typemap(directorout) SWIGTYPE ((*)(ANY)) { int swig_res = SWIG_ConvertFunctionPtr($input,(void**)(&$result),$descriptor); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } } #endif %apply SWIGTYPE ((*)(ANY)) { SWIGTYPE ((* const)(ANY)) } %apply SWIGTYPE * { SWIGTYPE *const } /* ------------------------------------------------------------ * --- Special typemaps --- * ------------------------------------------------------------ */ /* DISOWN typemap */ %typemap(in, noblock=1) SWIGTYPE *DISOWN (int res = 0) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&$1), $descriptor, SWIG_POINTER_DISOWN | %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type", $symname, $argnum); } } %typemap(varin) SWIGTYPE *DISOWN { void *temp = 0; int res = SWIG_ConvertPtr($input, &temp, $descriptor, SWIG_POINTER_DISOWN | %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = ($ltype) temp; } /* DYNAMIC typemap */ %typemap(out,noblock=1) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { %set_output(SWIG_NewPointerObj(%as_voidptr($1), SWIG_TypeDynamicCast($descriptor, %as_voidptrptr(&$1)), $owner | %newpointer_flags)); } /* INSTANCE typemap */ %typemap(out,noblock=1) SWIGTYPE INSTANCE { %set_output(SWIG_NewInstanceObj(%new_copy($1, $1_ltype), $&1_descriptor, SWIG_POINTER_OWN | %newinstance_flags)); } %typemap(out,noblock=1) SWIGTYPE *INSTANCE, SWIGTYPE &INSTANCE, SWIGTYPE INSTANCE[] { %set_output(SWIG_NewInstanceObj(%as_voidptr($1), $1_descriptor, $owner | %newinstance_flags)); } %typemap(varout,noblock=1) SWIGTYPE *INSTANCE, SWIGTYPE INSTANCE[] { %set_varoutput(SWIG_NewInstanceObj(%as_voidptr($1), $1_descriptor, %newinstance_flags)); } %typemap(varout,noblock=1) SWIGTYPE &INSTANCE { %set_varoutput(SWIG_NewInstanceObj(%as_voidptr($1), $1_descriptor, %newinstance_flags)); } %typemap(varout,noblock=1) SWIGTYPE INSTANCE { %set_varoutput(SWIG_NewInstanceObj(%as_voidptr(&$1), $&1_descriptor, %newinstance_flags)); } swig-4.0.2/Lib/typemaps/attribute.swg0000644000175000017500000002301613667507523017461 0ustar williamwilliam/* ----------------------------------------------------------------------------- * attribute.swg * * Attribute implementation * ----------------------------------------------------------------------------- */ /* The following macros convert a pair of set/get methods into a "native" attribute. Use %attribute when you have a pair of get/set methods to a primitive type like in: %attribute(A, int, a, get_a, set_a); struct A { int get_a() const; void set_a(int aa); }; If you don't provide a 'set' method, a 'read-only' attribute is generated, ie, like in: %attribute(A, int, c, get_c); Use %attributeref when you have const/non-const reference access methods for primitive types or class/structs, like in: %attributeref(A, int, b); struct A { const int& b() const; int& b(); }; %attributeref(B, int, c); struct B { int& c(); }; You can also use %attributeref(Class, AttributeType, AttributeName, AccessorMethod) if the internal C++ reference methods have a different name from the attribute you want, so %attributeref(B, int, d, c); is the same as the last example, but instead of the attribute 'c' being called 'c', it is called 'd'. Now you can use the attributes like so: x = A() x.a = 3 # calls A::set_a print x.a # calls A::get_a x.b = 3 # calls A::b() print x.b # calls A::b() const Use %attribute2 instead of %attribute to indicate that reference-pointer translation is required. You use %attribute2 instead of %attribute in cases like this: %attribute2(MyClass, MyFoo, Foo, GetFoo, SetFoo); %inline %{ struct MyFoo { int x; }; class MyClass { MyFoo foo; public: MyFoo& GetFoo() { return foo; } void SetFoo(const MyFoo& other) { foo = other; } }; %} Here, the data type of the property is a wrapped type (MyFoo) and on the C++ side it is passed by reference. The problem is that the SWIG wrapper will pass around a pointer (MyFoo *) which is not compatible with the reference type of the accessors (MyFoo &). Therefore, if you use %attribute, you'll get an error from your C/C++ compiler. %attribute2 translates between a pointer and a reference to eliminate the error. In case you're confused, let's make it simple: just use %attribute at first, but if the C/C++ compiler gives an error while compiling the wrapper, try %attribute2 instead. NOTE: remember that if the type contains commas, such as 'std::pair', you need to use the macro like: %attributeref(A, %arg(std::pair), pval); where %arg() 'normalizes' the type to be understood as a single argument, otherwise the macro will get confused by the comma. The %attributeval is the same as %attribute, but should be used when the type is a class/struct (ie a non-primitive type) and when the get and set methods return/pass by value. The following is very similar to the above example, but note that the access is by value rather than reference. %attributeval(MyClassVal, MyFoo, ReadWriteFoo, GetFoo, SetFoo); %attributeval(MyClassVal, MyFoo, ReadOnlyFoo, GetFoo); %inline %{ class MyClassVal { MyFoo foo; public: MyFoo GetFoo() { return foo; } void SetFoo(MyFoo other) { foo = other; } }; %} The %attributestring is the same as %attributeval, but should be used for string class types, which are unusual as they are a class on the C++ side, but normally an immutable/primitive type in the target language. Example usage for std::string: %include %attributestring(MyStringyClass, std::string, ReadWriteString, GetString, SetString); %attributestring(MyStringyClass, std::string, ReadOnlyString, GetString); %inline %{ class MyStringyClass { std::string str; public: MyStringyClass(const std::string &val) : str(val) {} std::string GetString() { return str; } void SetString(std::string other) { str = other; } }; %} The %attributestring also works for class types that have %naturalvar turned on and so is also useful for shared_ptr which has %naturalvar turned on in %shared_ptr. */ // // Define SWIG_ATTRIBUTE_TEMPLATE if you want to use templates instead of macros for the C++ get and set wrapper methods // Does not always generate compilable code, use at your peril! // //#define SWIG_ATTRIBUTE_TEMPLATE %define %attribute_custom(Class, AttributeType, AttributeName, GetMethod, SetMethod, GetMethodCall, SetMethodCall) %ignore Class::GetMethod(); %ignore Class::GetMethod() const; #if #SetMethod != #AttributeName %ignore Class::SetMethod; #endif %extend Class { AttributeType AttributeName; } #if defined(__cplusplus) && defined(SWIG_ATTRIBUTE_TEMPLATE) %{ template < class C > inline AttributeType %mangle(Class) ##_## AttributeName ## _get(const C* self_) { return GetMethodCall; } template < class C > inline AttributeType %mangle(Class) ##_## AttributeName ## _get(C* self_) { return GetMethodCall; } template < class C > inline void %mangle(Class) ##_## AttributeName ## _set(C* self_, AttributeType val_) { SetMethodCall; } %} #else %{ #define %mangle(Class) ##_## AttributeName ## _get(self_) GetMethodCall #define %mangle(Class) ##_## AttributeName ## _set(self_, val_) SetMethodCall %} #endif %enddef %define %attribute_readonly(Class, AttributeType, AttributeName, GetMethod, GetMethodCall) %ignore Class::GetMethod(); %ignore Class::GetMethod() const; %immutable Class::AttributeName; %extend Class { AttributeType AttributeName; } #if defined(__cplusplus) && defined(SWIG_ATTRIBUTE_TEMPLATE) %{ template < class C > inline AttributeType %mangle(Class) ##_## AttributeName ## _get(const C* self_) { return GetMethodCall; } template < class C > inline AttributeType %mangle(Class) ##_## AttributeName ## _get(C* self_) { return GetMethodCall; } %} #else %{ #define %mangle(Class) ##_## AttributeName ## _get(self_) GetMethodCall %} #endif %enddef // User macros %define %attribute(Class, AttributeType, AttributeName, GetMethod, SetMethod...) #if #SetMethod != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, GetMethod, SetMethod, self_->GetMethod(), self_->SetMethod(val_)) #else %attribute_readonly(%arg(Class), %arg(AttributeType), AttributeName, GetMethod, self_->GetMethod()) #endif %enddef %define %attribute2(Class, AttributeType, AttributeName, GetMethod, SetMethod...) #if #SetMethod != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, GetMethod, SetMethod, &self_->GetMethod(), self_->SetMethod(*val_)) #else %attribute_readonly(%arg(Class), %arg(AttributeType), AttributeName, GetMethod, &self_->GetMethod()) #endif %enddef %define %attributeref(Class, AttributeType, AttributeName, AccessorMethod...) #if #AccessorMethod != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AccessorMethod, AccessorMethod, self_->AccessorMethod(), self_->AccessorMethod() = val_) #else %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AttributeName, AttributeName, self_->AttributeName(), self_->AttributeName() = val_) #endif %enddef %define %attribute2ref(Class, AttributeType, AttributeName, AccessorMethod...) #if #AccessorMethod != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AccessorMethod, AccessorMethod, &self_->AccessorMethod(), self_->AccessorMethod() = *val_) #else %attribute_custom(%arg(Class), %arg(AttributeType), AccessorName, AccessorName, AccessorName, &self_->AccessorName(), self_->AccessorName() = *val_) #endif %enddef // deprecated (same as %attributeref, but there is an argument order inconsistency) %define %attribute_ref(Class, AttributeType, AccessorMethod, AttributeName...) #if #AttributeName != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AccessorMethod, AccessorMethod, self_->AccessorMethod(), self_->AccessorMethod() = val_) #else %attribute_custom(%arg(Class), %arg(AttributeType), AccessorMethod, AccessorMethod, AccessorMethod, self_->AccessorMethod(), self_->AccessorMethod() = val_) #endif %enddef %define %attributeval(Class, AttributeType, AttributeName, GetMethod, SetMethod...) %{ #define %mangle(Class) ##_## AttributeName ## _get(self_) new AttributeType(self_->GetMethod()) %} #if #SetMethod != "" %{ #define %mangle(Class) ##_## AttributeName ## _set(self_, val_) self_->SetMethod(*val_) %} #if #SetMethod != #AttributeName %ignore Class::SetMethod; #endif #else %immutable Class::AttributeName; #endif %ignore Class::GetMethod(); %ignore Class::GetMethod() const; %newobject Class::AttributeName; %extend Class { AttributeType AttributeName; } %enddef %define %attributestring(Class, AttributeType, AttributeName, GetMethod, SetMethod...) %{ #define %mangle(Class) ##_## AttributeName ## _get(self_) *new AttributeType(self_->GetMethod()) %} #if #SetMethod != "" %{ #define %mangle(Class) ##_## AttributeName ## _set(self_, val_) self_->SetMethod(val_) %} #if #SetMethod != #AttributeName %ignore Class::SetMethod; #endif #else %immutable Class::AttributeName; #endif %ignore Class::GetMethod(); %ignore Class::GetMethod() const; %newobject Class::AttributeName; %typemap(newfree) const AttributeType &AttributeName "delete $1;" %extend Class { AttributeType AttributeName; } %enddef swig-4.0.2/Lib/typemaps/std_string.swg0000644000175000017500000000053313667507523017635 0ustar williamwilliam// // String // #ifndef SWIG_STD_BASIC_STRING #define SWIG_STD_STRING %include %fragment(""); namespace std { %naturalvar string; class string; } %typemaps_std_string(std::string, char, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, %checkcode(STDSTRING)); #else %include #endif swig-4.0.2/Lib/typemaps/typemaps.swg0000644000175000017500000001072413667507523017322 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.swg * * Tcl Pointer handling * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Tcl tuple. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Tcl output of the function would be a tuple containing both output values. */ // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Tcl tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Tcl). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Tcl variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ #if defined(SWIG_INOUT_NODEF) %apply_checkctypes(%typemaps_inoutn) %apply size_t& { std::size_t& }; %apply ptrdiff_t& { std::ptrdiff_t& }; #endif swig-4.0.2/Lib/typemaps/exception.swg0000644000175000017500000000522713667507523017460 0ustar williamwilliam/* ----------------------------------------------------------------------------- * exceptions.swg * * This SWIG library file provides language independent exception handling * ----------------------------------------------------------------------------- */ %include /* macros for error manipulation */ #define %nullref_fmt() "invalid null reference " #define %varfail_fmt(_type,_name) "in variable '"`_name`"' of type '"`_type`"'" #ifndef %argfail_fmt #define %argfail_fmt(_type,_name,_argn) "in method '" `_name` "', argument " `_argn`" of type '" `_type`"'" #endif #define %outfail_fmt(_type) "in output value of type '"_type"'" #ifndef %argnullref_fmt #define %argnullref_fmt(_type,_name,_argn) %nullref_fmt() %argfail_fmt(_type, _name, _argn) #endif #define %varnullref_fmt(_type,_name) %nullref_fmt() %varfail_fmt(_type, _name) #define %outnullref_fmt(_type) %nullref_fmt() %outfail_fmt(_type) /* setting an error */ #define %error(code,msg...) SWIG_Error(code, msg) #define %type_error(msg...) SWIG_Error(SWIG_TypeError, msg) %insert("runtime") { %define_as(SWIG_exception_fail(code, msg), %block(%error(code, msg); SWIG_fail)) %define_as(SWIG_contract_assert(expr, msg), if (!(expr)) { %error(SWIG_RuntimeError, msg); SWIG_fail; } else) } #ifdef __cplusplus /* You can use the SWIG_CATCH_STDEXCEPT macro with the %exception directive as follows: %exception { try { $action } catch (my_except& e) { ... } SWIG_CATCH_STDEXCEPT // catch std::exception catch (...) { SWIG_exception_fail(SWIG_UnknownError, "Unknown exception"); } } */ %fragment(""); %define SWIG_CATCH_STDEXCEPT /* catching std::exception */ catch (std::invalid_argument& e) { SWIG_exception_fail(SWIG_ValueError, e.what() ); } catch (std::domain_error& e) { SWIG_exception_fail(SWIG_ValueError, e.what() ); } catch (std::overflow_error& e) { SWIG_exception_fail(SWIG_OverflowError, e.what() ); } catch (std::out_of_range& e) { SWIG_exception_fail(SWIG_IndexError, e.what() ); } catch (std::length_error& e) { SWIG_exception_fail(SWIG_IndexError, e.what() ); } catch (std::runtime_error& e) { SWIG_exception_fail(SWIG_RuntimeError, e.what() ); } catch (std::exception& e) { SWIG_exception_fail(SWIG_SystemError, e.what() ); } %enddef %define SWIG_CATCH_UNKNOWN catch (std::exception& e) { SWIG_exception_fail(SWIG_SystemError, e.what() ); } catch (...) { SWIG_exception_fail(SWIG_UnknownError, "unknown exception"); } %enddef #endif /* __cplusplus */ swig-4.0.2/Lib/typemaps/README0000644000175000017500000000372513667507523015621 0ustar williamwilliamStill in development, but if you are interested into looking around, start with swigtypemaps.swg which is the head file. Also read the docs for %fragments in fragments.swg and follow the definitions in one of the supported languages: python, perl, ruby, tcl /* ----------------------------------------------------------------------------- * Internal typemap specializations * ----------------------------------------------------------------------------- */ carrays.swg Implement the carrays.i library cdata.swg Implement the cdata.i library cmalloc.swg Implement the cmalloc.i library cpointer.swg Implement the cpointer.i library cstring.swg Implement the cstring.i library typemaps for char * cwstring.swg Implement the cstring.i library typemaps for wchar_t * exception.swg Implement the exception.i library implicit.swg Allow the use of implicit C++ constructors string.swg Typemaps for char * string wstring.swg Typemaps for wchar_t * string std_string.swg Typemaps for std::string std_wstring.swg Typemaps for std::wstring swigtype.swg Typemaps for the SWIGTYPE type void.swg Typemaps for the 'void' type enumint.swg Typemaps for enums treated as 'int' swigobject.swg Typemaps for the SWIG_Object as in PyObject, Tcl_Obj, etc. misctypes.swg Typemaps for miscellaneos types (size_t, ptrdiff_t, etc) ptrtypes.swg Typemaps for types with a 'ptr' behavior valtypes.swg Typemaps for 'by value' types inoutlist.swg IN/OUTPUT/INOUT typemaps, where the OUTPUT values are returned in a list primtypes.swg Common macros to manage primitive types (short,int,double,etc) cstrings.swg Common macros to implemented the cstring/cwstring libraries std_strings.swg Common macros to implemented the std::string/std::wstring typemaps strings.swg Common macros and typemaps for string and wstring (char *, wchar_t *) swigmacros.swg Basic macros fragments.swg Macros for fragment manipulations typemaps.swg The old typemaps.i library, not needed anymore swig-4.0.2/Lib/typemaps/wstring.swg0000644000175000017500000000144513667507523017155 0ustar williamwilliam%ensure_fragment(SWIG_AsWCharPtrAndSize) %ensure_fragment(SWIG_FromWCharPtrAndSize) %types(wchar_t *); %fragment("SWIG_pwchar_descriptor","header") { SWIGINTERN swig_type_info* SWIG_pwchar_descriptor() { static int init = 0; static swig_type_info* info = 0; if (!init) { info = SWIG_TypeQuery("_p_wchar_t"); init = 1; } return info; } } %fragment("SWIG_wcsnlen","header",fragment="SWIG_FromWCharPtrAndSize") { SWIGINTERN size_t SWIG_wcsnlen(const wchar_t* s, size_t maxlen) { const wchar_t *p; for (p = s; maxlen-- && *p; p++) ; return p - s; } } %include %typemaps_string(%checkcode(UNISTRING), %checkcode(UNICHAR), wchar_t, WChar, SWIG_AsWCharPtrAndSize, SWIG_FromWCharPtrAndSize, wcslen, SWIG_wcsnlen, "", WCHAR_MIN, WCHAR_MAX) swig-4.0.2/Lib/typemaps/fragments.swg0000644000175000017500000001662513667507523017454 0ustar williamwilliam/* Fragments ========= See the "Typemap fragments" section in the documentation for understanding fragments. Below is some info on how fragments and automatic type specialization is used. Macros that make the automatic generation of typemaps easier are provided. Consider the following code: %fragment(SWIG_From_frag(bool), "header") { static PyObject* SWIG_From_dec(bool)(bool value) { PyObject *obj = value ? Py_True : Py_False; Py_INCREF(obj); return obj; } } %typemap(out, fragment=SWIG_From_frag(bool)) bool { $result = SWIG_From(bool)($1)); } Here the macros SWIG_From_frag => fragment SWIG_From_dec => declaration SWIG_From => call allow you to define/include a fragment, and declare and call the 'from-bool' method as needed. In the simpler case, these macros just return something like SWIG_From_frag(bool) => "SWIG_From_bool" SWIG_From_dec(bool) => SWIG_From_bool SWIG_From(bool) => SWIG_From_bool But they are specialized for the different languages requirements, such as perl or tcl that requires passing the interpreter pointer, and also they can manage C++ ugly types, for example: SWIG_From_frag(std::complex) => "SWIG_From_std_complex_Sl_double_Sg_" SWIG_From_dec(std::complex) => SWIG_From_std_complex_Sl_double_Sg_ SWIG_From(std::complex) => SWIG_From_std_complex_Sl_double_Sg_ Hence, to declare methods to use with typemaps, always use the SWIG_From* macros. In the same way, the SWIG_AsVal* and SWIG_AsPtr* set of macros are provided. */ /* ----------------------------------------------------------------------------- * Define the basic macros to 'normalize' the type fragments * ----------------------------------------------------------------------------- */ #ifndef SWIG_AS_DECL_ARGS #define SWIG_AS_DECL_ARGS #endif #ifndef SWIG_FROM_DECL_ARGS #define SWIG_FROM_DECL_ARGS #endif #ifndef SWIG_AS_CALL_ARGS #define SWIG_AS_CALL_ARGS #endif #ifndef SWIG_FROM_CALL_ARGS #define SWIG_FROM_CALL_ARGS #endif #define %fragment_name(Name, Type...) %string_name(Name) "_" {Type} #define SWIG_Traits_frag(Type...) %fragment_name(Traits, Type) #define SWIG_AsPtr_frag(Type...) %fragment_name(AsPtr, Type) #define SWIG_AsVal_frag(Type...) %fragment_name(AsVal, Type) #define SWIG_From_frag(Type...) %fragment_name(From, Type) #define SWIG_AsVal_name(Type...) %symbol_name(AsVal, Type) #define SWIG_AsPtr_name(Type...) %symbol_name(AsPtr, Type) #define SWIG_From_name(Type...) %symbol_name(From, Type) #define SWIG_AsVal_dec(Type...) SWIG_AsVal_name(Type) SWIG_AS_DECL_ARGS #define SWIG_AsPtr_dec(Type...) SWIG_AsPtr_name(Type) SWIG_AS_DECL_ARGS #define SWIG_From_dec(Type...) SWIG_From_name(Type) SWIG_FROM_DECL_ARGS #define SWIG_AsVal(Type...) SWIG_AsVal_name(Type) SWIG_AS_CALL_ARGS #define SWIG_AsPtr(Type...) SWIG_AsPtr_name(Type) SWIG_AS_CALL_ARGS #define SWIG_From(Type...) SWIG_From_name(Type) SWIG_FROM_CALL_ARGS /* ------------------------------------------------------------ * common fragments * ------------------------------------------------------------ */ %fragment("SWIG_isfinite","header",fragment=",") %{ /* Getting isfinite working pre C99 across multiple platforms is non-trivial. Users can provide SWIG_isfinite on older platforms. */ #ifndef SWIG_isfinite /* isfinite() is a macro for C99 */ # if defined(isfinite) # define SWIG_isfinite(X) (isfinite(X)) # elif defined(__cplusplus) && __cplusplus >= 201103L /* Use a template so that this works whether isfinite() is std::isfinite() or * in the global namespace. The reality seems to vary between compiler * versions. * * Make sure namespace std exists to avoid compiler warnings. * * extern "C++" is required as this fragment can end up inside an extern "C" { } block */ namespace std { } extern "C++" template inline int SWIG_isfinite_func(T x) { using namespace std; return isfinite(x); } # define SWIG_isfinite(X) (SWIG_isfinite_func(X)) # elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) # define SWIG_isfinite(X) (__builtin_isfinite(X)) # elif defined(__clang__) && defined(__has_builtin) # if __has_builtin(__builtin_isfinite) # define SWIG_isfinite(X) (__builtin_isfinite(X)) # endif # elif defined(_MSC_VER) # define SWIG_isfinite(X) (_finite(X)) # elif defined(__sun) && defined(__SVR4) # include # define SWIG_isfinite(X) (finite(X)) # endif #endif %} %fragment("SWIG_Float_Overflow_Check","header",fragment=",SWIG_isfinite") %{ /* Accept infinite as a valid float value unless we are unable to check if a value is finite */ #ifdef SWIG_isfinite # define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX) && SWIG_isfinite(X)) #else # define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX)) #endif %} /* ----------------------------------------------------------------------------- * special macros for fragments * ----------------------------------------------------------------------------- */ /* Macros to derive numeric types */ %define %numeric_type_from(Type, Base) %fragment(SWIG_From_frag(Type),"header", fragment=SWIG_From_frag(Base)) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(Type)(Type value) { return SWIG_From(Base)(value); } } %enddef %define %numeric_type_asval(Type, Base, Frag, OverflowCond) %fragment(SWIG_AsVal_frag(Type),"header", fragment=Frag, fragment=SWIG_AsVal_frag(Base)) { SWIGINTERN int SWIG_AsVal_dec(Type)(SWIG_Object obj, Type *val) { Base v; int res = SWIG_AsVal(Base)(obj, &v); if (SWIG_IsOK(res)) { if (OverflowCond) { return SWIG_OverflowError; } else { if (val) *val = %numeric_cast(v, Type); } } return res; } } %enddef #define %numeric_signed_type_asval(Type, Base, Frag, Min, Max) \ %numeric_type_asval(Type, Base, Frag, (v < Min || v > Max)) #define %numeric_unsigned_type_asval(Type, Base, Frag, Max) \ %numeric_type_asval(Type, Base, Frag, (v > Max)) /* Macro for 'signed long' derived types */ %define %numeric_slong(Type, Frag, Min, Max) %numeric_type_from(Type, long) %numeric_signed_type_asval(Type, long, Frag , Min, Max) %enddef /* Macro for 'unsigned long' derived types */ %define %numeric_ulong(Type, Frag, Max) %numeric_type_from(Type, unsigned long) %numeric_unsigned_type_asval(Type, unsigned long, Frag, Max) %enddef /* Macro for floating point derived types (original macro) */ %define %numeric_double(Type, Frag, Min, Max) %numeric_type_from(Type, double) %numeric_signed_type_asval(Type, double, Frag , Min, Max) %enddef /* Macro for floating point derived types */ %define %numeric_float(Type, Frag, OverflowCond) %numeric_type_from(Type, double) %numeric_type_asval(Type, double, Frag, OverflowCond) %enddef /* Macros for missing fragments */ %define %ensure_fragment(Fragment) %fragment(`Fragment`,"header") { %#error "SWIG language implementation must provide the Fragment fragment" } %enddef %define %ensure_type_fragments(Type) %fragment(SWIG_From_frag(Type),"header") { %#error "SWIG language implementation must provide a SWIG_From_frag(Type) fragment" } %fragment(SWIG_AsVal_frag(Type),"header") { %#error "SWIG language implementation must provide a SWIG_AsVal_frag(Type) fragment" } %enddef swig-4.0.2/Lib/typemaps/cstrings.swg0000644000175000017500000002004213667507523017306 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cstrings.swg * * This file provides typemaps and macros for dealing with various forms * of C character string handling. The primary use of this module * is in returning character data that has been allocated or changed in * some way. * ----------------------------------------------------------------------------- */ %define %typemaps_cstring(Name, Char, SWIG_AsCharPtr, SWIG_AsCharPtrAndSize, SWIG_FromCharPtr, SWIG_FromCharPtrAndSize) /* %cstring_input_binary(TYPEMAP, SIZE) * * Macro makes a function accept binary string data along with * a size. For example: * * %cstring_input_binary(Char *buff, int size); * void foo(Char *buff, int size) { * } * */ %define Name ## _input_binary(TYPEMAP, SIZE) %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (TYPEMAP, SIZE) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); } $1 = ($1_ltype) buf; $2 = ($2_ltype) size - 1; } %typemap(freearg,noblock=1,match="in") (TYPEMAP, SIZE) { if (alloc$argnum == SWIG_NEWOBJ) %delete_array(buf$argnum); } %enddef /* * %cstring_bounded_output(TYPEMAP, MAX) * * This macro is used to return a NULL-terminated output string of * some maximum length. For example: * * %cstring_bounded_output(Char *outx, 512); * void foo(Char *outx) { * sprintf(outx,"blah blah\n"); * } * */ %define Name ## _bounded_output(TYPEMAP,MAX) %typemap(in,noblock=1,numinputs=0) TYPEMAP (Char temp[MAX+1]) { $1 = ($1_ltype) temp; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment= #SWIG_FromCharPtr ) TYPEMAP { $1[MAX] = 0; %append_output(SWIG_FromCharPtr($1)); } %enddef /* * %cstring_chunk_output(TYPEMAP, SIZE) * * This macro is used to return a chunk of binary string data. * Embedded NULLs are okay. For example: * * %cstring_chunk_output(Char *outx, 512); * void foo(Char *outx) { * memmove(outx, somedata, 512); * } * */ %define Name ## _chunk_output(TYPEMAP,SIZE) %typemap(in,noblock=1,numinputs=0) TYPEMAP(Char temp[SIZE]) { $1 = ($1_ltype) temp; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment= #SWIG_FromCharPtrAndSize) TYPEMAP { %append_output(SWIG_FromCharPtrAndSize($1,SIZE)); } %enddef /* * %cstring_bounded_mutable(TYPEMAP, SIZE) * * This macro is used to wrap a string that's going to mutate. * * %cstring_bounded_mutable(Char *in, 512); * void foo(in *x) { * while (*x) { * *x = toupper(*x); * x++; * } * } * */ %define Name ## _bounded_mutable(TYPEMAP,MAX) %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) TYPEMAP (int res,Char temp[MAX+1], Char *t = 0, size_t n = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &t, &n, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res, "TYPEMAP", $symname, $argnum); } if ( n > (size_t) MAX ) n = (size_t) MAX; memcpy(temp, t, sizeof(Char)*n); if (alloc == SWIG_NEWOBJ) %delete_array(t); temp[n - 1] = 0; $1 = ($1_ltype) temp; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtr) TYPEMAP { $1[MAX] = 0; %append_output(SWIG_FromCharPtr($1)); } %enddef /* * %cstring_mutable(TYPEMAP [, expansion]) * * This macro is used to wrap a string that will mutate in place. * It may change size up to a user-defined expansion. * * %cstring_mutable(Char *in); * void foo(in *x) { * while (*x) { * *x = toupper(*x); * x++; * } * } * */ %define Name ## _mutable(TYPEMAP,EXP...) %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) TYPEMAP (int res, Char *t = 0, size_t n = 0, int alloc = 0, size_t expansion = 0) { #if #EXP != "" expansion += EXP; #endif res = SWIG_AsCharPtrAndSize($input, &t, &n, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res, "TYPEMAP", $symname, $argnum); } $1 = %new_array(n+expansion, $*1_ltype); memcpy($1,t,sizeof(Char)*n); if (alloc == SWIG_NEWOBJ) %delete_array(t); $1[n-1] = 0; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtr) TYPEMAP { %append_output(SWIG_FromCharPtr($1)); %delete_array($1); } %enddef /* * %cstring_output_maxsize(TYPEMAP, SIZE) * * This macro returns data in a string of some user-defined size. * * %cstring_output_maxsize(Char *outx, int max) { * void foo(Char *outx, int max) { * sprintf(outx,"blah blah\n"); * } */ %define Name ## _output_maxsize(TYPEMAP, SIZE) %typemap(in,noblock=1,fragment=SWIG_AsVal_frag(size_t)) (TYPEMAP, SIZE) (int res, size_t size, Char *buff = 0) { res = SWIG_AsVal(size_t)($input, &size); if (!SWIG_IsOK(res)) { %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); } buff= %new_array(size+1, Char); $2 = %numeric_cast(size, $2_ltype); $1 = %static_cast(buff, $1_ltype); } %typemap(freearg,noblock=1,match="in") (TYPEMAP,SIZE) { if (buff$argnum) %delete_array(buff$argnum); } %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtr) (TYPEMAP,SIZE) { %append_output(SWIG_FromCharPtr($1)); } %enddef /* * %cstring_output_withsize(TYPEMAP, SIZE) * * This macro is used to return Character data along with a size * parameter. * * %cstring_output_withsize(Char *outx, int *max) { * void foo(Char *outx, int *max) { * sprintf(outx,"blah blah\n"); * *max = strlen(outx); * } */ %define Name ## _output_withsize(TYPEMAP, SIZE) %typemap(in,noblock=1,fragment=SWIG_AsVal_frag(size_t)) (TYPEMAP, SIZE) (int res, size_t n, Char *buff = 0, $*2_ltype size) { res = SWIG_AsVal(size_t)($input, &n); if (!SWIG_IsOK(res)) { %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); } buff= %new_array(n+1, Char); $1 = %static_cast(buff, $1_ltype); size = %numeric_cast(n,$*2_ltype); $2 = &size; } %typemap(freearg,noblock=1,match="in")(TYPEMAP,SIZE) { if (buff$argnum) %delete_array(buff$argnum); } %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtrAndSize) (TYPEMAP,SIZE) { %append_output(SWIG_FromCharPtrAndSize($1,*$2)); } %enddef /* * %cstring_output_allocate(TYPEMAP, RELEASE) * * This macro is used to return Character data that was * allocated with new or malloc. * * %cstring_output_allocate(Char **outx, free($1)); * void foo(Char **outx) { * *outx = (Char *) malloc(512); * sprintf(outx,"blah blah\n"); * } */ %define Name ## _output_allocate(TYPEMAP, RELEASE) %typemap(in,noblock=1,numinputs=0) TYPEMAP($*1_ltype temp = 0) { $1 = &temp; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtr) TYPEMAP { if (*$1) { %append_output(SWIG_FromCharPtr(*$1)); RELEASE; } } %enddef /* * %cstring_output_allocate_size(TYPEMAP, SIZE, RELEASE) * * This macro is used to return Character data that was * allocated with new or malloc. * * %cstring_output_allocate_size(Char **outx, int *sz, free($1)); * void foo(Char **outx, int *sz) { * *outx = (Char *) malloc(512); * sprintf(outx,"blah blah\n"); * *sz = strlen(outx); * } */ %define Name ## _output_allocate_size(TYPEMAP, SIZE, RELEASE) %typemap(in,noblock=1,numinputs=0) (TYPEMAP, SIZE) ($*1_ltype temp = 0, $*2_ltype tempn) { $1 = &temp; $2 = &tempn; } %typemap(freearg,match="in") (TYPEMAP,SIZE) ""; %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtrAndSize)(TYPEMAP,SIZE) { if (*$1) { %append_output(SWIG_FromCharPtrAndSize(*$1,*$2)); RELEASE; } } %enddef %enddef swig-4.0.2/Lib/cwstring.i0000644000175000017500000000041113667507523015076 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cwstring.i * ----------------------------------------------------------------------------- */ %echo "cwstring.i not implemented for this target" #define SWIG_CWSTRING_UNIMPL swig-4.0.2/Lib/constraints.i0000644000175000017500000001560713667507523015622 0ustar williamwilliam/* ----------------------------------------------------------------------------- * constraints.i * * SWIG constraints library. * * SWIG library file containing typemaps for implementing various kinds of * constraints. Depends upon the SWIG exception library for generating * errors in a language-independent manner. * ----------------------------------------------------------------------------- */ #ifdef AUTODOC %text %{ %include This library provides support for applying constraints to function arguments. Using a constraint, you can restrict arguments to be positive numbers, non-NULL pointers, and so on. The following constraints are available : Number POSITIVE - Positive number (not zero) Number NEGATIVE - Negative number (not zero) Number NONZERO - Nonzero number Number NONNEGATIVE - Positive number (including zero) Number NONPOSITIVE - Negative number (including zero) Pointer NONNULL - Non-NULL pointer Pointer ALIGN8 - 8-byte aligned pointer Pointer ALIGN4 - 4-byte aligned pointer Pointer ALIGN2 - 2-byte aligned pointer To use the constraints, you need to "apply" them to specific function arguments in your code. This is done using the %apply directive. For example : %apply Number NONNEGATIVE { double nonneg }; double sqrt(double nonneg); // Name of argument must match %apply Pointer NONNULL { void *ptr }; void *malloc(int POSITIVE); // May return a NULL pointer void free(void *ptr); // May not accept a NULL pointer Any function argument of the type you specify with the %apply directive will be checked with the appropriate constraint. Multiple types may be specified as follows : %apply Pointer NONNULL { void *, Vector *, List *, double *}; In this case, all of the types listed would be checked for non-NULL pointers. The common datatypes of int, short, long, unsigned int, unsigned long, unsigned short, unsigned char, signed char, float, and double can be checked without using the %apply directive by simply using the constraint name as the parameter name. For example : double sqrt(double NONNEGATIVE); double log(double POSITIVE); If you have used typedef to change type-names, you can also do this : %apply double { Real }; // Make everything defined for doubles // work for Reals. Real sqrt(Real NONNEGATIVE); Real log(Real POSITIVE); %} #endif %include #ifdef SWIGCSHARP // Required attribute for C# exception handling #define SWIGCSHARPCANTHROW , canthrow=1 #else #define SWIGCSHARPCANTHROW #endif // Positive numbers %typemap(check SWIGCSHARPCANTHROW) int POSITIVE, short POSITIVE, long POSITIVE, unsigned int POSITIVE, unsigned short POSITIVE, unsigned long POSITIVE, signed char POSITIVE, unsigned char POSITIVE, float POSITIVE, double POSITIVE, Number POSITIVE { if ($1 <= 0) { SWIG_exception(SWIG_ValueError,"Expected a positive value."); } } // Negative numbers %typemap(check SWIGCSHARPCANTHROW) int NEGATIVE, short NEGATIVE, long NEGATIVE, unsigned int NEGATIVE, unsigned short NEGATIVE, unsigned long NEGATIVE, signed char NEGATIVE, unsigned char NEGATIVE, float NEGATIVE, double NEGATIVE, Number NEGATIVE { if ($1 >= 0) { SWIG_exception(SWIG_ValueError,"Expected a negative value."); } } // Nonzero numbers %typemap(check SWIGCSHARPCANTHROW) int NONZERO, short NONZERO, long NONZERO, unsigned int NONZERO, unsigned short NONZERO, unsigned long NONZERO, signed char NONZERO, unsigned char NONZERO, float NONZERO, double NONZERO, Number NONZERO { if ($1 == 0) { SWIG_exception(SWIG_ValueError,"Expected a nonzero value."); } } // Nonnegative numbers %typemap(check SWIGCSHARPCANTHROW) int NONNEGATIVE, short NONNEGATIVE, long NONNEGATIVE, unsigned int NONNEGATIVE, unsigned short NONNEGATIVE, unsigned long NONNEGATIVE, signed char NONNEGATIVE, unsigned char NONNEGATIVE, float NONNEGATIVE, double NONNEGATIVE, Number NONNEGATIVE { if ($1 < 0) { SWIG_exception(SWIG_ValueError,"Expected a non-negative value."); } } // Nonpositive numbers %typemap(check SWIGCSHARPCANTHROW) int NONPOSITIVE, short NONPOSITIVE, long NONPOSITIVE, unsigned int NONPOSITIVE, unsigned short NONPOSITIVE, unsigned long NONPOSITIVE, signed char NONPOSITIVE, unsigned char NONPOSITIVE, float NONPOSITIVE, double NONPOSITIVE, Number NONPOSITIVE { if ($1 > 0) { SWIG_exception(SWIG_ValueError,"Expected a non-positive value."); } } // Non-NULL pointer %typemap(check SWIGCSHARPCANTHROW) void * NONNULL, Pointer NONNULL { if (!$1) { SWIG_exception(SWIG_ValueError,"Received a NULL pointer."); } } // Aligned pointers %typemap(check SWIGCSHARPCANTHROW) void * ALIGN8, Pointer ALIGN8 { unsigned long long tmp; tmp = (unsigned long long) $1; if (tmp & 7) { SWIG_exception(SWIG_ValueError,"Pointer must be 8-byte aligned."); } } %typemap(check SWIGCSHARPCANTHROW) void * ALIGN4, Pointer ALIGN4 { unsigned long long tmp; tmp = (unsigned long long) $1; if (tmp & 3) { SWIG_exception(SWIG_ValueError,"Pointer must be 4-byte aligned."); } } %typemap(check SWIGCSHARPCANTHROW) void * ALIGN2, Pointer ALIGN2 { unsigned long long tmp; tmp = (unsigned long long) $1; if (tmp & 1) { SWIG_exception(SWIG_ValueError,"Pointer must be 2-byte aligned."); } } swig-4.0.2/Lib/swigwarnings.swg0000644000175000017500000001566613667507523016352 0ustar williamwilliam/* Include the internal swig macro codes. These macros correspond to the one found in Source/Include/swigwarn.h plus the 'SWIG' prefix. For example, in the include file 'swigwarn.h' you will find #define WARN_TYPEMAP_CHARLEAK ... and in the 'swigwarn.swg' interface, you will see %define SWIGWARN_TYPEMAP_CHARLEAK ... This code can be used in warning filters as follows: %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK); Warnings messages used in typemaps. Message names will be the same as those in Lib/swigwarn.swg but with the suffix _MSG. For example, for the code SWIGWARN_TYPEMAP_CHARLEAK, once you use %typemapmsg(CHARLEAK,); you use the message in your typemap as %typemap(varin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) char * while you suppress the warning using %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK); as described above. */ /* ----------------------------------------------------------------------------- * SWIG warning codes * ----------------------------------------------------------------------------- */ %include /* ----------------------------------------------------------------------------- * Auxiliary macros * ----------------------------------------------------------------------------- */ /* Macro to define warning messages */ #define %_warningmsg(Val, Msg...) `Val`":"Msg #define %warningmsg(Val, Msg...) %_warningmsg(Val, Msg) /* ----------------------------------------------------------------------------- * Typemap related warning messages * ----------------------------------------------------------------------------- */ %define SWIGWARN_TYPEMAP_CHARLEAK_MSG "451:Setting a const char * variable may leak memory." %enddef %define SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG "454:Setting a pointer/reference variable may leak memory." %enddef %define SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG "470:Thread/reentrant unsafe wrapping, consider returning by value instead." %enddef %define SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG "473:Returning a pointer or reference in a director method is not recommended." %enddef %define SWIGWARN_TYPEMAP_INITIALIZER_LIST_MSG "476:Initialization using std::initializer_list." %enddef /* ----------------------------------------------------------------------------- * Operator related warning messages * ----------------------------------------------------------------------------- */ %define SWIGWARN_IGNORE_OPERATOR_NEW_MSG "350:operator new ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_DELETE_MSG "351:operator delete ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_PLUS_MSG "352:operator+ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MINUS_MSG "353:operator- ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MUL_MSG "354:operator* ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_DIV_MSG "355:operator/ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MOD_MSG "356:operator% ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_XOR_MSG "357:operator^ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_AND_MSG "358:operator& ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_OR_MSG "359:operator| ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_NOT_MSG "360:operator~ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LNOT_MSG "361:operator! ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_EQ_MSG "362:operator= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LT_MSG "363:operator< ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_GT_MSG "364:operator> ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_PLUSEQ_MSG "365:operator+= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MINUSEQ_MSG "366:operator-= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MULEQ_MSG "367:operator*= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_DIVEQ_MSG "368:operator/= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MODEQ_MSG "369:operator%= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_XOREQ_MSG "370:operator^= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_ANDEQ_MSG "371:operator&= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_OREQ_MSG "372:operator|= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LSHIFT_MSG "373:operator<< ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_RSHIFT_MSG "374:operator>> ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LSHIFTEQ_MSG "375:operator<<= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_RSHIFTEQ_MSG "376:operator>>= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_EQUALTO_MSG "377:operator== ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_NOTEQUAL_MSG "378:operator!= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LTEQUAL_MSG "379:operator<= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_GTEQUAL_MSG "380:operator>= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LAND_MSG "381:operator&& ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LOR_MSG "382:operator|| ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_PLUSPLUS_MSG "383:operator++ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MINUSMINUS_MSG "384:operator-- ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_COMMA_MSG "385:operator-- ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_ARROWSTAR_MSG "386:operator->* ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_ARROW_MSG "387:operator-> ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_CALL_MSG "388:operator() ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_INDEX_MSG "389:operator[] ignored (consider using %%extend)" %enddef %define SWIGWARN_IGNORE_OPERATOR_UPLUS_MSG "390:operator+ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_UMINUS_MSG "391:operator- ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_UMUL_MSG "392:operator* ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_UAND_MSG "393:operator& ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_NEWARR_MSG "394:operator new[] ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_DELARR_MSG "395:operator delete[] ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_REF_MSG "396:operator*() ignored" %enddef #define %ignoreoperator(Oper) %ignorewarn(SWIGWARN_IGNORE_OPERATOR_##Oper##_MSG) /* ----------------------------------------------------------------------------- * Macros for keyword and built-in names * ----------------------------------------------------------------------------- */ #define %keywordwarn(msg...) %namewarn(%warningmsg(SWIGWARN_PARSE_KEYWORD, msg)) #define %builtinwarn(msg...) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, msg), %$isfunction) /* ----------------------------------------------------------------------------- * Warning filter feature * ----------------------------------------------------------------------------- */ #define %_warnfilter(filter...) %feature("warnfilter",`filter`) #define %warnfilter(filter...) %_warnfilter(filter) swig-4.0.2/Lib/allkw.swg0000644000175000017500000000131513667507523014724 0ustar williamwilliam#ifndef __Lib_allkw_swg__ #define __Lib_allkw_swg__ /* Include all the known keyword warnings. Very useful for adding test files to the test-suite, or checking if your own library is ok for all the swig supported languages. Use as swig -Wallkw ... If you add a new language, remember to create a separate languagekw.swg file, and add it here. */ %include %include %include %include %include %include %include %include %include %include %include %include #endif //__Lib_allkw_swg__ swig-4.0.2/Lib/runtime.swg0000644000175000017500000000232413667507523015276 0ustar williamwilliam/* -----------------------------------------------------------------------------* Standard SWIG API for use inside user code. Don't include this file directly, run the command swig -python -external-runtime Also, read the Modules chapter of the SWIG Manual. * -----------------------------------------------------------------------------*/ #ifdef SWIG_MODULE_CLIENTDATA_TYPE SWIGRUNTIMEINLINE swig_type_info * SWIG_TypeQuery(SWIG_MODULE_CLIENTDATA_TYPE clientdata, const char *name) { swig_module_info *module = SWIG_GetModule(clientdata); return SWIG_TypeQueryModule(module, module, name); } SWIGRUNTIMEINLINE swig_type_info * SWIG_MangledTypeQuery(SWIG_MODULE_CLIENTDATA_TYPE clientdata, const char *name) { swig_module_info *module = SWIG_GetModule(clientdata); return SWIG_MangledTypeQueryModule(module, module, name); } #else SWIGRUNTIMEINLINE swig_type_info * SWIG_TypeQuery(const char *name) { swig_module_info *module = SWIG_GetModule(NULL); return SWIG_TypeQueryModule(module, module, name); } SWIGRUNTIMEINLINE swig_type_info * SWIG_MangledTypeQuery(const char *name) { swig_module_info *module = SWIG_GetModule(NULL); return SWIG_MangledTypeQueryModule(module, module, name); } #endif swig-4.0.2/Lib/attribute.i0000644000175000017500000000076013667507523015250 0ustar williamwilliam/* ----------------------------------------------------------------------------- * attribute.i * * SWIG library file for implementing attributes. * ----------------------------------------------------------------------------- */ /* we use a simple exception warning here */ %{ #include %} #define %attribute_exception(code,msg) printf("%s\n",msg) #ifndef %arg #define %arg(x...) x #endif #ifndef %mangle #define %mangle(Type...) #@Type #endif %include swig-4.0.2/Lib/perl5/0000755000175000017500000000000013667507523014117 5ustar williamwilliamswig-4.0.2/Lib/perl5/std_deque.i0000644000175000017500000000003413667507523016243 0ustar williamwilliam%include swig-4.0.2/Lib/perl5/perl5.swg0000644000175000017500000000270413667507523015673 0ustar williamwilliam/* ------------------------------------------------------------ * perl.swg * * Perl configuration module. * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Inner macros * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The runtime part * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Special user directives * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Typemap specializations * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Warnings for Perl keywords * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Perl initialization function * ------------------------------------------------------------ */ %include swig-4.0.2/Lib/perl5/director.swg0000644000175000017500000001613313667507523016460 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Perl proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #ifndef SWIG_DIRECTOR_PERL_HEADER_ #define SWIG_DIRECTOR_PERL_HEADER_ #include #include #include #include #include /* Use -DSWIG_DIRECTOR_NORTTI if you prefer to avoid the use of the native C++ RTTI and dynamic_cast<>. But be aware that directors could stop working when using this option. */ #ifdef SWIG_DIRECTOR_NORTTI /* When we don't use the native C++ RTTI, we implement a minimal one only for Directors. */ # ifndef SWIG_DIRECTOR_RTDIR # define SWIG_DIRECTOR_RTDIR namespace Swig { class Director; SWIGINTERN std::map& get_rtdir_map() { static std::map rtdir_map; return rtdir_map; } SWIGINTERNINLINE void set_rtdir(void *vptr, Director *rtdir) { get_rtdir_map()[vptr] = rtdir; } SWIGINTERNINLINE Director *get_rtdir(void *vptr) { std::map::const_iterator pos = get_rtdir_map().find(vptr); Director *rtdir = (pos != get_rtdir_map().end()) ? pos->second : 0; return rtdir; } } # endif /* SWIG_DIRECTOR_RTDIR */ # define SWIG_DIRECTOR_CAST(ARG) Swig::get_rtdir(static_cast(ARG)) # define SWIG_DIRECTOR_RGTR(ARG1, ARG2) Swig::set_rtdir(static_cast(ARG1), ARG2) #else # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) # define SWIG_DIRECTOR_RGTR(ARG1, ARG2) #endif /* SWIG_DIRECTOR_NORTTI */ extern "C" { struct swig_type_info; } namespace Swig { /* memory handler */ struct GCItem { virtual ~GCItem() {} virtual int get_own() const { return 0; } }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem *operator->() const { return _item; } private: GCItem *_item; }; struct GCItem_Object : GCItem { GCItem_Object(int own) : _own(own) { } virtual ~GCItem_Object() { } int get_own() const { return _own; } private: int _own; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; template struct GCArray_T : GCItem { GCArray_T(Type *ptr) : _ptr(ptr) { } virtual ~GCArray_T() { delete[] _ptr; } private: Type *_ptr; }; /* base class for director exceptions */ class DirectorException : public std::exception { public: virtual SV *getNative() const = 0; }; /* exceptions emitted by Perl */ class DirectorMethodException : public DirectorException { protected: SV *err; public: DirectorMethodException(SV *sv = sv_mortalcopy(ERRSV)) : err(sv) { SvREFCNT_inc(err); } const char *what() const throw() { return SvPV_nolen(err); } SV *getNative() const { return sv_2mortal(newSVsv(err)); } static void raise(SV *sv) { throw DirectorMethodException(sv); } }; /* exceptions emitted by wrap code */ class DirectorWrapException : public DirectorException { protected: std::string msg; DirectorWrapException(const char *str) : msg(str) { } public: virtual ~DirectorWrapException() throw() { } const char *what() const throw() { return msg.c_str(); } virtual SV *getNative() const { return sv_2mortal(newSVpvn(msg.data(), msg.size())); } }; class DirectorTypeMismatchException : public DirectorWrapException { public: DirectorTypeMismatchException(const char *str) : DirectorWrapException(str) { } static void raise(const char *type, const char *msg) { std::string err = std::string(type); err += ": "; err += msg; throw DirectorTypeMismatchException(err.c_str()); } }; class DirectorPureVirtualException : public DirectorWrapException { public: DirectorPureVirtualException(const char *name) : DirectorWrapException("SWIG director pure virtual method called: ") { msg += name; } static void raise(const char *name) { throw DirectorPureVirtualException(name); } }; /* director base class */ class Director { private: /* pointer to the wrapped perl object */ SV *swig_self; /* class of wrapped perl object */ std::string swig_class; /* flag indicating whether the object is owned by perl or c++ */ mutable bool swig_disown_flag; /* decrement the reference count of the wrapped perl object */ void swig_decref() const { if (swig_disown_flag) { SvREFCNT_dec(swig_self); } } public: /* wrap a Perl object. */ Director(SV *pkg) : swig_disown_flag(false) { STRLEN len; char *str = SvPV(pkg, len); swig_class = std::string(str, len); swig_self = newRV_inc((SV *)newHV()); } /* discard our reference at destruction */ virtual ~Director() { swig_decref(); } /* return a pointer to the wrapped Perl object */ SV *swig_get_self() const { return swig_self; } const char *swig_get_class() const { return swig_class.c_str(); } /* acquire ownership of the wrapped Perl object (the sense of "disown" is from perl) */ void swig_disown() const { if (!swig_disown_flag) { swig_disown_flag=true; swig_incref(); } } /* increase the reference count of the wrapped Perl object */ void swig_incref() const { if (swig_disown_flag) { SvREFCNT_inc(swig_self); } } /* methods to implement pseudo protected director members */ virtual bool swig_get_inner(const char * /* swig_protected_method_name */) const { return true; } virtual void swig_set_inner(const char * /* swig_protected_method_name */, bool /* swig_val */) const { } /* ownership management */ private: typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; public: template void swig_acquire_ownership_array(Type *vptr) const { if (vptr) { swig_owner[vptr] = new GCArray_T(vptr); } } template void swig_acquire_ownership(Type *vptr) const { if (vptr) { swig_owner[vptr] = new GCItem_T(vptr); } } void swig_acquire_ownership_obj(void *vptr, int own) const { if (vptr && own) { swig_owner[vptr] = new GCItem_Object(own); } } int swig_release_ownership(void *vptr) const { int own = 0; if (vptr) { swig_ownership_map::iterator iter = swig_owner.find(vptr); if (iter != swig_owner.end()) { own = iter->second->get_own(); swig_owner.erase(iter); } } return own; } }; } #endif swig-4.0.2/Lib/perl5/cpointer.i0000644000175000017500000000004113667507523016107 0ustar williamwilliam%include swig-4.0.2/Lib/perl5/perlruntime.swg0000644000175000017500000000050613667507523017210 0ustar williamwilliam %runtime "swigrun.swg" // Common C API type-checking code %runtime "swigerrors.swg" // SWIG errors %runtime "perlhead.swg" // Perl includes and fixes %runtime "perlerrors.swg" // Perl errors %runtime "perlrun.swg" // Perl runtime functions %runtime "noembed.h" // undefine Perl5 macros swig-4.0.2/Lib/perl5/perlprimtypes.swg0000644000175000017500000002023413667507523017561 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* bool */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE SV * SWIG_From_dec(bool)(bool value) { return boolSV(value); } } %fragment(SWIG_AsVal_frag(bool),"header") { SWIGINTERN int SWIG_AsVal_dec(bool)(SV *obj, bool* val) { if (obj == &PL_sv_yes) { if (val) *val = true; return SWIG_OK; } else if (obj == &PL_sv_no) { if (val) *val = false; return SWIG_OK; } else { if (val) *val = SvTRUE(obj) ? true : false; return SWIG_AddCast(SWIG_OK); } } } /* long */ %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE SV * SWIG_From_dec(long)(long value) { SV *sv; if (IVSIZE >= sizeof(value) || (value >= IV_MIN && value <= IV_MAX)) sv = newSViv(value); else sv = newSVpvf("%ld", value); return sv_2mortal(sv); } } %fragment(SWIG_AsVal_frag(long),"header", fragment="", fragment="", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(long)(SV *obj, long* val) { if (SvUOK(obj)) { UV v = SvUV(obj); if (UVSIZE < sizeof(*val) || v <= LONG_MAX) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else if (SvIOK(obj)) { IV v = SvIV(obj); if (IVSIZE <= sizeof(*val) || (v >= LONG_MIN && v <= LONG_MAX)) { if(val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; long v; errno = 0; v = strtol(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } return SWIG_TypeError; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header") { SWIGINTERNINLINE SV * SWIG_From_dec(unsigned long)(unsigned long value) { SV *sv; if (UVSIZE >= sizeof(value) || value <= UV_MAX) sv = newSVuv(value); else sv = newSVpvf("%lu", value); return sv_2mortal(sv); } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="", fragment="", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(SV *obj, unsigned long *val) { if (SvUOK(obj)) { UV v = SvUV(obj); if (UVSIZE <= sizeof(*val) || v <= ULONG_MAX) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else if (SvIOK(obj)) { IV v = SvIV(obj); if (v >= 0 && (IVSIZE <= sizeof(*val) || v <= ULONG_MAX)) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; unsigned long v; errno = 0; v = strtoul(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { if (val) *val = (unsigned long)(d); return res; } } } return SWIG_TypeError; } } /* long long */ %fragment(SWIG_From_frag(long long),"header", fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE SV * SWIG_From_dec(long long)(long long value) { SV *sv; if (IVSIZE >= sizeof(value) || (value >= IV_MIN && value <= IV_MAX)) sv = newSViv((IV)(value)); else { //sv = newSVpvf("%lld", value); doesn't work in non 64bit Perl char temp[256]; sprintf(temp, "%lld", value); sv = newSVpv(temp, 0); } return sv_2mortal(sv); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_LongLongAvailable", fragment="", fragment="SWIG_CanCastAsInteger") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(SV *obj, long long *val) { if (SvUOK(obj)) { UV v = SvUV(obj); /* pretty sure this could allow v == LLONG MAX */ if (UVSIZE < sizeof(*val) || v < LLONG_MAX) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else if (SvIOK(obj)) { IV v = SvIV(obj); if (IVSIZE <= sizeof(*val) || (v >= LLONG_MIN && v <= LLONG_MAX)) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; long long v; errno = 0; v = strtoll(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } if (!dispatch) { const double mant_max = 1LL << DBL_MANT_DIG; const double mant_min = -mant_max; double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) { if (val) *val = (long long)(d); return res; } } } return SWIG_TypeError; } %#endif } /* unsigned long long */ %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE SV * SWIG_From_dec(unsigned long long)(unsigned long long value) { SV *sv; if (UVSIZE >= sizeof(value) || value <= UV_MAX) sv = newSVuv((UV)(value)); else { //sv = newSVpvf("%llu", value); doesn't work in non 64bit Perl char temp[256]; sprintf(temp, "%llu", value); sv = newSVpv(temp, 0); } return sv_2mortal(sv); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable", fragment="", fragment="SWIG_CanCastAsInteger") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(SV *obj, unsigned long long *val) { if (SvUOK(obj)) { /* pretty sure this should be conditional on * (UVSIZE <= sizeof(*val) || v <= ULLONG_MAX) */ if (val) *val = SvUV(obj); return SWIG_OK; } else if (SvIOK(obj)) { IV v = SvIV(obj); if (v >= 0 && (IVSIZE <= sizeof(*val) || v <= ULLONG_MAX)) { if (val) *val = v; return SWIG_OK; } else { return SWIG_OverflowError; } } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; unsigned long long v; errno = 0; v = strtoull(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } if (!dispatch) { const double mant_max = 1LL << DBL_MANT_DIG; double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) { if (val) *val = (unsigned long long)(d); return res; } } } return SWIG_TypeError; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { SWIGINTERNINLINE SV * SWIG_From_dec(double)(double value) { return sv_2mortal(newSVnv(value)); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(SV *obj, double *val) { if (SvNIOK(obj)) { if (val) *val = SvNV(obj); return SWIG_OK; } else if (SvIOK(obj)) { if (val) *val = (double) SvIV(obj); return SWIG_AddCast(SWIG_OK); } else { const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; double v; errno = 0; v = strtod(nptr, &endptr); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } } return SWIG_TypeError; } } swig-4.0.2/Lib/perl5/std_vector.i0000644000175000017500000005550213667507523016454 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector types * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // Perl as much as possible, namely, to allow the user to pass and // be returned Perl arrays. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&), f(const std::vector*): // the parameter being read-only, either a Perl sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(): // the vector is returned by copy; therefore, a Perl sequence of T:s // is returned which is most easily used in other Perl functions // -- std::vector& f(), std::vector* f(), const std::vector& f(), // const std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template class vector { %typemap(in) vector (std::vector* v) { if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,1) != -1) { $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i& (std::vector temp, std::vector* v), const vector* (std::vector temp, std::vector* v) { if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,1) != -1) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i { size_t len = $1.size(); SV **svs = new SV*[len]; for (size_t i=0; i { { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* obj; SV **tv = av_fetch(av, 0, 0); if (SWIG_ConvertPtr(*tv, (void **)&obj, $descriptor(T *),0) != -1) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* obj; SV **tv = av_fetch(av, 0, 0); if (SWIG_ConvertPtr(*tv, (void **)&obj, $descriptor(T *),0) != -1) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(const T& x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T& get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { %typemap(in) vector (std::vector* v) { int res = SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,0); if (SWIG_IsOK(res)){ $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); I32 len = av_len(av) + 1; for (int i=0; i& (std::vector temp,std::vector* v), const vector* (std::vector temp,std::vector* v) { int res = SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0); if (SWIG_IsOK(res)) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); I32 len = av_len(av) + 1; for (int i=0; i { size_t len = $1.size(); SV **svs = new SV*[len]; for (size_t i=0; i { { /* wrapped vector? */ std::vector< T *>* v; int res = SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,0); if (SWIG_IsOK(res)) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ void *v; SV **tv = av_fetch(av, 0, 0); int res = SWIG_ConvertPtr(*tv, &v, $descriptor(T *),0); if (SWIG_IsOK(res)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&,const vector* { { /* wrapped vector? */ std::vector< T *> *v; int res = SWIG_ConvertPtr($input,%as_voidptrptr(&v), $1_descriptor,0); if (SWIG_IsOK(res)) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ void *v; SV **tv = av_fetch(av, 0, 0); int res = SWIG_ConvertPtr(*tv, &v, $descriptor(T *),0); if (SWIG_IsOK(res)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T* value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, T *value); vector(const vector& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(T *x); %extend { T *pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T *x = self->back(); self->pop_back(); return x; } T *get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { %typemap(in) vector (std::vector* v) { if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,1) != -1){ $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; for (int i=0; i& (std::vector temp, std::vector* v), const vector* (std::vector temp, std::vector* v) { if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,1) != -1) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; for (int i=0; i { size_t len = $1.size(); SV **svs = new SV*[len]; for (size_t i=0; i { { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SV **tv = av_fetch(av, 0, 0); if (CHECK_T(*tv)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SV **tv = av_fetch(av, 0, 0); if (CHECK_T(*tv)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, T value); vector(const vector& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(T x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i SWIGRUNTIME const char * SWIG_Perl_TypeProxyName(const swig_type_info *type) { if (!type) return NULL; if (type->clientdata != NULL) { return (const char*) type->clientdata; } else { return type->name; } } /* Identical to SWIG_TypeCheck, except for strcmp comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (strcmp(SWIG_Perl_TypeProxyName(iter->type), c) == 0) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Acquire a pointer value */ SWIGRUNTIME int SWIG_Perl_AcquirePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, int own) { /* TODO */ return 0; } /* Function for getting a pointer value */ SWIGRUNTIME int SWIG_Perl_ConvertPtrAndOwn(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags, int *own) { swig_cast_info *tc; void *voidptr = (void *)0; SV *tsv = 0; if (own) *own = 0; /* If magical, apply more magic */ if (SvGMAGICAL(sv)) mg_get(sv); /* Check to see if this is an object */ if (sv_isobject(sv)) { IV tmp = 0; tsv = (SV*) SvRV(sv); if ((SvTYPE(tsv) == SVt_PVHV)) { MAGIC *mg; if (SvMAGICAL(tsv)) { mg = mg_find(tsv,'P'); if (mg) { sv = mg->mg_obj; if (sv_isobject(sv)) { tsv = (SV*)SvRV(sv); tmp = SvIV(tsv); } } } else { return SWIG_ERROR; } } else { tmp = SvIV(tsv); } voidptr = INT2PTR(void *,tmp); } else if (! SvOK(sv)) { /* Check for undef */ *(ptr) = (void *) 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } else if (SvTYPE(sv) == SVt_RV) { /* Check for NULL pointer */ if (!SvROK(sv)) { /* In Perl 5.12 and later, SVt_RV == SVt_IV, so sv could be a valid integer value. */ if (SvIOK(sv)) { return SWIG_ERROR; } else { /* NULL pointer (reference to undef). */ *(ptr) = (void *) 0; return SWIG_OK; } } else { return SWIG_ERROR; } } else { /* Don't know what it is */ return SWIG_ERROR; } if (_t) { /* Now see if the types match */ char *_c = HvNAME(SvSTASH(SvRV(sv))); tc = SWIG_TypeProxyCheck(_c,_t); #ifdef SWIG_DIRECTORS if (!tc && !sv_derived_from(sv,SWIG_Perl_TypeProxyName(_t))) { #else if (!tc) { #endif return SWIG_ERROR; } { int newmemory = 0; *ptr = SWIG_TypeCast(tc,voidptr,&newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) *own = *own | SWIG_CAST_NEW_MEMORY; } } } else { *ptr = voidptr; } /* * DISOWN implementation: we need a perl guru to check this one. */ if (tsv && (flags & SWIG_POINTER_DISOWN)) { /* * almost copy paste code from below SWIG_POINTER_OWN setting */ SV *obj = sv; HV *stash = SvSTASH(SvRV(obj)); GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE); if (isGV(gv)) { HV *hv = GvHVn(gv); /* * To set ownership (see below), a newSViv(1) entry is added. * Hence, to remove ownership, we delete the entry. */ if (hv_exists_ent(hv, obj, 0)) { hv_delete_ent(hv, obj, 0, 0); } } } return SWIG_OK; } SWIGRUNTIME int SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) { return SWIG_Perl_ConvertPtrAndOwn(sv, ptr, _t, flags, 0); } SWIGRUNTIME void SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) { if (ptr && (flags & (SWIG_SHADOW | SWIG_POINTER_OWN))) { SV *self; SV *obj=newSV(0); HV *hash=newHV(); HV *stash; sv_setref_pv(obj, SWIG_Perl_TypeProxyName(t), ptr); stash=SvSTASH(SvRV(obj)); if (flags & SWIG_POINTER_OWN) { HV *hv; GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE); if (!isGV(gv)) gv_init(gv, stash, "OWNER", 5, FALSE); hv=GvHVn(gv); hv_store_ent(hv, obj, newSViv(1), 0); } sv_magic((SV *)hash, (SV *)obj, 'P', Nullch, 0); SvREFCNT_dec(obj); self=newRV_noinc((SV *)hash); sv_setsv(sv, self); SvREFCNT_dec((SV *)self); sv_bless(sv, stash); } else { sv_setref_pv(sv, SWIG_Perl_TypeProxyName(t), ptr); } } SWIGRUNTIMEINLINE SV * SWIG_Perl_NewPointerObj(SWIG_MAYBE_PERL_OBJECT void *ptr, swig_type_info *t, int flags) { SV *result = sv_newmortal(); SWIG_MakePtr(result, ptr, t, flags); return result; } SWIGRUNTIME void SWIG_Perl_MakePackedObj(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(SWIG_Perl_TypeProxyName(type))) > 1000) return; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); strcpy(r,SWIG_Perl_TypeProxyName(type)); sv_setpv(sv, result); } SWIGRUNTIME SV * SWIG_Perl_NewPackedObj(SWIG_MAYBE_PERL_OBJECT void *ptr, int sz, swig_type_info *type) { SV *result = sv_newmortal(); SWIG_Perl_MakePackedObj(result, ptr, sz, type); return result; } /* Convert a packed pointer value */ SWIGRUNTIME int SWIG_Perl_ConvertPacked(SWIG_MAYBE_PERL_OBJECT SV *obj, void *ptr, int sz, swig_type_info *ty) { swig_cast_info *tc; const char *c = 0; if ((!obj) || (!SvOK(obj))) return SWIG_ERROR; c = SvPV_nolen(obj); /* Pointer values must start with leading underscore */ if (*c != '_') return SWIG_ERROR; c++; c = SWIG_UnpackData(c,ptr,sz); if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) return SWIG_ERROR; } return SWIG_OK; } /* Macros for low-level exception handling */ #define SWIG_croak(x) { SWIG_Error(SWIG_RuntimeError, x); SWIG_fail; } typedef XSPROTO(SwigPerlWrapper); typedef SwigPerlWrapper *SwigPerlWrapperPtr; /* Structure for command table */ typedef struct { const char *name; SwigPerlWrapperPtr wrapper; } swig_command_info; /* Information for constant table */ #define SWIG_INT 1 #define SWIG_FLOAT 2 #define SWIG_STRING 3 #define SWIG_POINTER 4 #define SWIG_BINARY 5 /* Constant information structure */ typedef struct swig_constant_info { int type; const char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_constant_info; /* Structure for variable table */ typedef struct { const char *name; SwigMagicFunc set; SwigMagicFunc get; swig_type_info **type; } swig_variable_info; /* Magic variable code */ #ifndef PERL_OBJECT # ifdef __cplusplus # define swig_create_magic(s,a,b,c) _swig_create_magic(s,const_cast(a),b,c) # else # define swig_create_magic(s,a,b,c) _swig_create_magic(s,(char*)(a),b,c) # endif # ifndef MULTIPLICITY SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(SV *, MAGIC *), int (*get)(SV *,MAGIC *)) # else SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(struct interpreter*, SV *, MAGIC *), int (*get)(struct interpreter*, SV *,MAGIC *)) # endif #else # define swig_create_magic(s,a,b,c) _swig_create_magic(pPerl,s,a,b,c) SWIGRUNTIME void _swig_create_magic(CPerlObj *pPerl, SV *sv, const char *name, int (CPerlObj::*set)(SV *, MAGIC *), int (CPerlObj::*get)(SV *, MAGIC *)) #endif { MAGIC *mg; sv_magic(sv,sv,'U',name,strlen(name)); mg = mg_find(sv,'U'); mg->mg_virtual = (MGVTBL *) malloc(sizeof(MGVTBL)); mg->mg_virtual->svt_get = (SwigMagicFunc) get; mg->mg_virtual->svt_set = (SwigMagicFunc) set; mg->mg_virtual->svt_len = 0; mg->mg_virtual->svt_clear = 0; mg->mg_virtual->svt_free = 0; } SWIGRUNTIME swig_module_info * SWIG_Perl_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; SV *pointer; /* first check if pointer already created */ if (!type_pointer) { pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, FALSE | GV_ADDMULTI); if (pointer && SvOK(pointer)) { type_pointer = INT2PTR(swig_type_info **, SvIV(pointer)); } } return (swig_module_info *) type_pointer; } SWIGRUNTIME void SWIG_Perl_SetModule(swig_module_info *module) { SV *pointer; /* create a new pointer */ pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TRUE | GV_ADDMULTI); sv_setiv(pointer, PTR2IV(module)); } #ifdef __cplusplus } #endif swig-4.0.2/Lib/perl5/Makefile.in0000644000175000017500000000664413667507523016176 0ustar williamwilliam# --------------------------------------------------------------- # SWIG Perl5 Makefile # # This file can be used to build various Perl5 extensions with SWIG. # By default this file is set up for dynamic loading, but it can # be easily customized for static extensions by modifying various # portions of the file. # # SRCS = C source files # CXXSRCS = C++ source files # OBJCSRCS = Objective-C source files # OBJS = Additional .o files (compiled previously) # INTERFACE = SWIG interface file # TARGET = Name of target module or executable # # Many portions of this file were created by the SWIG configure # script and should already reflect your machine. #---------------------------------------------------------------- SRCS = CXXSRCS = OBJCSRCS = OBJS = INTERFACE = WRAPFILE = $(INTERFACE:.i=_wrap.c) WRAPOBJ = $(INTERFACE:.i=_wrap.o) TARGET = module@SO@ # Use this kind of target for dynamic loading #TARGET = myperl # Use this target for static linking prefix = @prefix@ exec_prefix = @exec_prefix@ CC = @CC@ CXX = @CXX@ OBJC = @CC@ -Wno-import # -Wno-import needed for gcc CFLAGS = INCLUDES = LIBS = # SWIG Options # SWIG = location of the SWIG executable # SWIGOPT = SWIG compiler options # SWIGCC = Compiler used to compile the wrapper file SWIG = $(exec_prefix)/bin/swig SWIGOPT = -perl5 SWIGCC = $(CC) # SWIG Library files. Uncomment this to statically rebuild Perl #SWIGLIBS = -static -lperlmain.i # Rules for creating .o files from source. COBJS = $(SRCS:.c=.o) CXXOBJS = $(CXXSRCS:.cxx=.o) OBJCOBJS = $(OBJCSRCS:.m=.o) ALLOBJS = $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(OBJS) # Command that will be used to build the final extension. BUILD = $(SWIGCC) # Uncomment the following if you are using dynamic loading CCSHARED = @CCSHARED@ BUILD = @LDSHARED@ # Uncomment the following if you are using dynamic loading with C++ and # need to provide additional link libraries (this is not always required). #DLL_LIBS = -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.5.1/2.7.2 \ -L/usr/local/lib -lg++ -lstdc++ -lgcc # Perl installation PERL_INCLUDE = -I@PERL5EXT@ PERL_LIB = -L@PERL5EXT@ -lperl PERL_FLAGS = -Dbool=char -Dexplicit= # Build libraries (needed for static builds) LIBM = @LIBM@ LIBC = @LIBC@ SYSLIBS = $(LIBM) $(LIBC) @LIBS@ # Build options BUILD_LIBS = $(LIBS) # Dynamic loading # Compilation rules for non-SWIG components .SUFFIXES: .c .cxx .m .c.o: $(CC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< .cxx.o: $(CXX) $(CCSHARED) $(CXXFLAGS) $(INCLUDES) -c $< .m.o: $(OBJC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< # ---------------------------------------------------------------------- # Rules for building the extension # ---------------------------------------------------------------------- all: $(TARGET) # Convert the wrapper file into an object file $(WRAPOBJ) : $(WRAPFILE) $(SWIGCC) -c $(CCSHARED) $(CFLAGS) $(INCLUDES) $(PERL_INCLUDE) $(PERL_FLAGS) $(WRAPFILE) $(WRAPFILE) : $(INTERFACE) $(SWIG) $(SWIGOPT) -o $(WRAPFILE) $(SWIGLIBS) $(INTERFACE) $(TARGET): $(WRAPOBJ) $(ALLOBJS) $(BUILD) $(WRAPOBJ) $(ALLOBJS) $(BUILD_LIBS) -o $(TARGET) clean: rm -f $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(WRAPOBJ) $(WRAPFILE) $(TARGET) swig-4.0.2/Lib/perl5/Makefile.pl0000644000175000017500000000126013667507523016170 0ustar williamwilliam# File : Makefile.pl # MakeMaker file for a SWIG module. Use this file if you are # producing a module for general use or distribution. # # 1. Modify the file as appropriate. Replace $module with the # real name of your module and wrapper file. # 2. Run perl as 'perl Makefile.pl' # 3. Type 'make' to build your module # 4. Type 'make install' to install your module. # # See "Programming Perl", 2nd. Ed, for more gory details than # you ever wanted to know. use ExtUtils::MakeMaker; WriteMakefile( 'NAME' => '$module', # Name of your module 'LIBS' => [''], # Custom libraries (if any) 'OBJECT' => '$module_wrap.o' # Object files ); swig-4.0.2/Lib/perl5/perlmain.i0000644000175000017500000000370213667507523016102 0ustar williamwilliam/* ----------------------------------------------------------------------------- * perlmain.i * * Code to statically rebuild perl5. * ----------------------------------------------------------------------------- */ #ifdef AUTODOC %subsection "perlmain.i" %text %{ This module provides support for building a new version of the Perl executable. This will be necessary on systems that do not support shared libraries and may be necessary with C++ extensions. This module may only build a stripped down version of the Perl executable. Thus, it may be necessary (or desirable) to hand-edit this file for your particular application. To do this, simply copy this file from swig_lib/perl5/perlmain.i to your working directory and make the appropriate modifications. This library file works with Perl 5.003. It may work with earlier versions, but it hasn't been tested. As far as I know, this library is C++ safe. %} #endif %{ static void xs_init _((pTHX)); static PerlInterpreter *my_perl; int perl_eval(char *string) { char *argv[2]; argv[0] = string; argv[1] = (char *) 0; return perl_call_argv("eval",0,argv); } int main(int argc, char **argv, char **env) { int exitstatus; my_perl = perl_alloc(); if (!my_perl) exit(1); perl_construct( my_perl ); exitstatus = perl_parse( my_perl, xs_init, argc, argv, (char **) NULL ); if (exitstatus) exit( exitstatus ); /* Initialize all of the module variables */ exitstatus = perl_run( my_perl ); perl_destruct( my_perl ); perl_free( my_perl ); exit( exitstatus ); } /* Register any extra external extensions */ /* Do not delete this line--writemain depends on it */ /* EXTERN_C void boot_DynaLoader _((CV* cv)); */ static void xs_init(pTHX) { /* dXSUB_SYS; */ char *file = __FILE__; { /* newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); */ newXS(SWIG_name, SWIG_init, file); #ifdef SWIGMODINIT SWIGMODINIT #endif } } %} swig-4.0.2/Lib/perl5/perlhead.swg0000644000175000017500000000506613667507523016434 0ustar williamwilliam#ifdef __cplusplus /* Needed on some windows machines---since MS plays funny games with the header files under C++ */ #include #include extern "C" { #endif #include "EXTERN.h" #include "perl.h" #include "XSUB.h" /* Add in functionality missing in older versions of Perl. Much of this is based on Devel-PPPort on cpan. */ /* Add PERL_REVISION, PERL_VERSION, PERL_SUBVERSION if missing */ #ifndef PERL_REVISION # if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) # define PERL_PATCHLEVEL_H_IMPLICIT # include # endif # if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) # include # endif # ifndef PERL_REVISION # define PERL_REVISION (5) # define PERL_VERSION PATCHLEVEL # define PERL_SUBVERSION SUBVERSION # endif #endif #if defined(WIN32) && defined(PERL_OBJECT) && !defined(PerlIO_exportFILE) #define PerlIO_exportFILE(fh,fl) (FILE*)(fh) #endif #ifndef SvIOK_UV # define SvIOK_UV(sv) (SvIOK(sv) && (SvUVX(sv) == SvIVX(sv))) #endif #ifndef SvUOK # define SvUOK(sv) SvIOK_UV(sv) #endif #if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))) # define PL_sv_undef sv_undef # define PL_na na # define PL_errgv errgv # define PL_sv_no sv_no # define PL_sv_yes sv_yes # define PL_markstack_ptr markstack_ptr #endif #ifndef IVSIZE # ifdef LONGSIZE # define IVSIZE LONGSIZE # else # define IVSIZE 4 /* A bold guess, but the best we can make. */ # endif #endif #ifndef INT2PTR # if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) # define PTRV UV # define INT2PTR(any,d) (any)(d) # else # if PTRSIZE == LONGSIZE # define PTRV unsigned long # else # define PTRV unsigned # endif # define INT2PTR(any,d) (any)(PTRV)(d) # endif # define NUM2PTR(any,d) (any)(PTRV)(d) # define PTR2IV(p) INT2PTR(IV,p) # define PTR2UV(p) INT2PTR(UV,p) # define PTR2NV(p) NUM2PTR(NV,p) # if PTRSIZE == LONGSIZE # define PTR2ul(p) (unsigned long)(p) # else # define PTR2ul(p) INT2PTR(unsigned long,p) # endif #endif /* !INT2PTR */ #ifndef SvPV_nolen # define SvPV_nolen(x) SvPV(x,PL_na) #endif #ifndef get_sv # define get_sv perl_get_sv #endif #ifndef ERRSV # define ERRSV get_sv("@",FALSE) #endif #ifndef pTHX_ #define pTHX_ #endif #include #ifdef __cplusplus } #endif swig-4.0.2/Lib/perl5/perlfragments.swg0000644000175000017500000000105413667507523017512 0ustar williamwilliam/* Create a file with this name, 'perlfragments.swg', in your working directory and add all the %fragments you want to take precedence over the ones defined by default by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(PyObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-4.0.2/Lib/perl5/perlstrings.swg0000644000175000017500000000262113667507523017216 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_AsCharPtrAndSize(SV *obj, char** cptr, size_t* psize, int *alloc) { if (SvMAGICAL(obj)) { SV *tmp = sv_newmortal(); SvSetSV(tmp, obj); obj = tmp; } if (SvPOK(obj)) { STRLEN len = 0; char *cstr = SvPV(obj, len); size_t size = len + 1; if (cptr) { if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = %new_copy_array(cstr, size, char); } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } } if (psize) *psize = size; return SWIG_OK; } else { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { char* vptr = 0; if (SWIG_ConvertPtr(obj, (void**)&vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = vptr; if (psize) *psize = vptr ? (strlen(vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } } %fragment("SWIG_FromCharPtrAndSize","header") { SWIGINTERNINLINE SV * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { SV *obj = sv_newmortal(); if (carray) { sv_setpvn(obj, carray, size); } else { sv_setsv(obj, &PL_sv_undef); } return obj; } } swig-4.0.2/Lib/perl5/attribute.i0000644000175000017500000000004213667507523016270 0ustar williamwilliam%include swig-4.0.2/Lib/perl5/noembed.h0000644000175000017500000000311413667507523015700 0ustar williamwilliam/* Workaround perl5 global namespace pollution. Note that undefining library * functions like fopen will not solve the problem on all platforms as fopen * might be a macro on Windows but not necessarily on other operating systems. */ #ifdef do_open #undef do_open #endif #ifdef do_close #undef do_close #endif #ifdef do_exec #undef do_exec #endif #ifdef scalar #undef scalar #endif #ifdef list #undef list #endif #ifdef apply #undef apply #endif #ifdef convert #undef convert #endif #ifdef Error #undef Error #endif #ifdef form #undef form #endif #ifdef vform #undef vform #endif #ifdef LABEL #undef LABEL #endif #ifdef METHOD #undef METHOD #endif #ifdef Move #undef Move #endif #ifdef yylex #undef yylex #endif #ifdef yyparse #undef yyparse #endif #ifdef yyerror #undef yyerror #endif #ifdef invert #undef invert #endif #ifdef ref #undef ref #endif #ifdef read #undef read #endif #ifdef write #undef write #endif #ifdef eof #undef eof #endif #ifdef close #undef close #endif #ifdef rewind #undef rewind #endif #ifdef free #undef free #endif #ifdef malloc #undef malloc #endif #ifdef calloc #undef calloc #endif #ifdef Stat #undef Stat #endif #ifdef check #undef check #endif #ifdef seekdir #undef seekdir #endif #ifdef open #undef open #endif #ifdef readdir #undef readdir #endif #ifdef bind #undef bind #endif #ifdef access #undef access #endif #ifdef stat #undef stat #endif #ifdef seed #undef seed #endif #ifdef bool /* Leave if macro is from C99 stdbool.h */ #ifndef __bool_true_false_are_defined #undef bool #endif #endif swig-4.0.2/Lib/perl5/perlmacros.swg0000644000175000017500000000004413667507523017006 0ustar williamwilliam%include swig-4.0.2/Lib/perl5/cmalloc.i0000644000175000017500000000004013667507523015675 0ustar williamwilliam%include swig-4.0.2/Lib/perl5/extra-install.list0000644000175000017500000000006213667507523017601 0ustar williamwilliam# see top-level Makefile.in Makefile.pl noembed.h swig-4.0.2/Lib/perl5/std_common.i0000644000175000017500000000121613667507523016433 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; %fragment(""); %{ SWIGINTERN double SwigSvToNumber(SV* sv) { return SvIOK(sv) ? double(SvIVX(sv)) : SvNVX(sv); } SWIGINTERN std::string SwigSvToString(SV* sv) { STRLEN len; char *ptr = SvPV(sv, len); return std::string(ptr, len); } SWIGINTERN void SwigSvFromString(SV* sv, const std::string& s) { sv_setpvn(sv,s.data(),s.size()); } %} swig-4.0.2/Lib/perl5/perlinit.swg0000644000175000017500000000376113667507523016476 0ustar williamwilliam /* Export the SWIG initialization function */ %header %{ #ifdef __cplusplus extern "C" #endif #ifndef PERL_OBJECT #ifndef MULTIPLICITY SWIGEXPORT void SWIG_init (CV* cv); #else SWIGEXPORT void SWIG_init (pTHXo_ CV* cv); #endif #else SWIGEXPORT void SWIG_init (CV *cv, CPerlObj *); #endif %} /* Module initialization function */ %insert(init) "swiginit.swg" %init %{ #if defined(__cplusplus) && ! defined(XSPROTO) extern "C" #endif XS(SWIG_init) { dXSARGS; int i; (void)items; SWIG_InitializeModule(0); /* Install commands */ for (i = 0; swig_commands[i].name; i++) { /* Casts only needed for Perl < 5.10. */ #ifdef __cplusplus newXS(const_cast(swig_commands[i].name), swig_commands[i].wrapper, const_cast(__FILE__)); #else newXS((char*)swig_commands[i].name, swig_commands[i].wrapper, (char*)__FILE__); #endif } /* Install variables */ for (i = 0; swig_variables[i].name; i++) { SV *sv; sv = get_sv(swig_variables[i].name, TRUE | 0x2 | GV_ADDMULTI); if (swig_variables[i].type) { SWIG_MakePtr(sv,(void *)1, *swig_variables[i].type,0); } else { sv_setiv(sv,(IV) 0); } swig_create_magic(sv, swig_variables[i].name, swig_variables[i].set, swig_variables[i].get); } /* Install constant */ for (i = 0; swig_constants[i].type; i++) { SV *sv; sv = get_sv(swig_constants[i].name, TRUE | 0x2 | GV_ADDMULTI); switch(swig_constants[i].type) { case SWIG_INT: sv_setiv(sv, (IV) swig_constants[i].lvalue); break; case SWIG_FLOAT: sv_setnv(sv, (double) swig_constants[i].dvalue); break; case SWIG_STRING: sv_setpv(sv, (const char *) swig_constants[i].pvalue); break; case SWIG_POINTER: SWIG_MakePtr(sv, swig_constants[i].pvalue, *(swig_constants[i].ptype),0); break; case SWIG_BINARY: SWIG_MakePackedObj(sv, swig_constants[i].pvalue, swig_constants[i].lvalue, *(swig_constants[i].ptype)); break; default: break; } SvREADONLY_on(sv); } %} swig-4.0.2/Lib/perl5/std_except.i0000644000175000017500000000004313667507523016430 0ustar williamwilliam%include swig-4.0.2/Lib/perl5/reference.i0000644000175000017500000001611713667507523016235 0ustar williamwilliam/* ----------------------------------------------------------------------------- * reference.i * * Accept Perl references as pointers * ----------------------------------------------------------------------------- */ /* The following methods make Perl references work like simple C pointers. References can only be used for simple input/output values, not C arrays however. It should also be noted that REFERENCES are specific to Perl and not supported in other scripting languages at this time. int *REFERENCE short *REFERENCE long *REFERENCE unsigned int *REFERENCE unsigned short *REFERENCE unsigned long *REFERENCE unsigned char *REFERENCE float *REFERENCE double *REFERENCE For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include reference.i void neg(double *REFERENCE); or you can use the %apply directive : %include reference.i %apply double *REFERENCE { double *x }; void neg(double *x); Unlike the INOUT mapping described in typemaps.i, this approach directly modifies the value of a Perl reference. Thus, you could use it as follows : $x = 3; neg(\$x); print "$x\n"; # Should print out -3. */ %typemap(in) double *REFERENCE (double dvalue), double &REFERENCE(double dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if ((!SvNOK(tempsv)) && (!SvIOK(tempsv))) { printf("Received %d\n", SvTYPE(tempsv)); SWIG_croak("Expected a double reference."); } dvalue = SvNV(tempsv); $1 = &dvalue; } %typemap(in) float *REFERENCE (float dvalue), float &REFERENCE(float dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if ((!SvNOK(tempsv)) && (!SvIOK(tempsv))) { SWIG_croak("expected a double reference"); } dvalue = (float) SvNV(tempsv); $1 = &dvalue; } %typemap(in) int *REFERENCE (int dvalue), int &REFERENCE (int dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = SvIV(tempsv); $1 = &dvalue; } %typemap(in) short *REFERENCE (short dvalue), short &REFERENCE(short dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (short) SvIV(tempsv); $1 = &dvalue; } %typemap(in) long *REFERENCE (long dvalue), long &REFERENCE(long dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (long) SvIV(tempsv); $1 = &dvalue; } %typemap(in) unsigned int *REFERENCE (unsigned int dvalue), unsigned int &REFERENCE(unsigned int dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (unsigned int) SvUV(tempsv); $1 = &dvalue; } %typemap(in) unsigned short *REFERENCE (unsigned short dvalue), unsigned short &REFERENCE(unsigned short dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (unsigned short) SvUV(tempsv); $1 = &dvalue; } %typemap(in) unsigned long *REFERENCE (unsigned long dvalue), unsigned long &REFERENCE(unsigned long dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (unsigned long) SvUV(tempsv); $1 = &dvalue; } %typemap(in) unsigned char *REFERENCE (unsigned char dvalue), unsigned char &REFERENCE(unsigned char dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (unsigned char) SvUV(tempsv); $1 = &dvalue; } %typemap(in) signed char *REFERENCE (signed char dvalue), signed char &REFERENCE(signed char dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (signed char) SvIV(tempsv); $1 = &dvalue; } %typemap(in) bool *REFERENCE (bool dvalue), bool &REFERENCE(bool dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = SvIV(tempsv) ? true : false; $1 = &dvalue; } %typemap(typecheck) int *REFERENCE, int &REFERENCE, short *REFERENCE, short &REFERENCE, long *REFERENCE, long &REFERENCE, signed char *REFERENCE, signed char &REFERENCE, bool *REFERENCE, bool &REFERENCE { $1 = SvROK($input) && SvIOK(SvRV($input)); } %typemap(typecheck) double *REFERENCE, double &REFERENCE, float *REFERENCE, float &REFERENCE { $1 = SvROK($input); if($1) { SV *tmpsv = SvRV($input); $1 = SvNOK(tmpsv) || SvIOK(tmpsv); } } %typemap(typecheck) unsigned int *REFERENCE, unsigned int &REFERENCE, unsigned short *REFERENCE, unsigned short &REFERENCE, unsigned long *REFERENCE, unsigned long &REFERENCE, unsigned char *REFERENCE, unsigned char &REFERENCE { $1 = SvROK($input); if($1) { SV *tmpsv = SvRV($input); $1 = SvUOK(tmpsv) || SvIOK(tmpsv); } } %typemap(argout) double *REFERENCE, double &REFERENCE, float *REFERENCE, float &REFERENCE { SV *tempsv; tempsv = SvRV($arg); if (!$1) SWIG_croak("expected a reference"); sv_setnv(tempsv, (double) *$1); } %typemap(argout) int *REFERENCE, int &REFERENCE, short *REFERENCE, short &REFERENCE, long *REFERENCE, long &REFERENCE, signed char *REFERENCE, signed char &REFERENCE, bool *REFERENCE, bool &REFERENCE { SV *tempsv; tempsv = SvRV($input); if (!$1) SWIG_croak("expected a reference"); sv_setiv(tempsv, (IV) *$1); } %typemap(argout) unsigned int *REFERENCE, unsigned int &REFERENCE, unsigned short *REFERENCE, unsigned short &REFERENCE, unsigned long *REFERENCE, unsigned long &REFERENCE, unsigned char *REFERENCE, unsigned char &REFERENCE { SV *tempsv; tempsv = SvRV($input); if (!$1) SWIG_croak("expected a reference"); sv_setuv(tempsv, (UV) *$1); } swig-4.0.2/Lib/perl5/typemaps.i0000644000175000017500000003102213667507523016131 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * The SWIG typemap library provides a language independent mechanism for * supporting output arguments, input values, and other C function * calling mechanisms. The primary use of the library is to provide a * better interface to certain C function--especially those involving * pointers. * ----------------------------------------------------------------------------- */ #if !defined(SWIG_USE_OLD_TYPEMAPS) %include #else // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include typemaps.i double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include typemaps.i %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ %define INPUT_TYPEMAP(type, converter) %typemap(in) type *INPUT(type temp), type &INPUT(type temp) { temp = (type) converter($input); $1 = &temp; } %typemap(typecheck) type *INPUT = type; %typemap(typecheck) type &INPUT = type; %enddef INPUT_TYPEMAP(float, SvNV); INPUT_TYPEMAP(double, SvNV); INPUT_TYPEMAP(int, SvIV); INPUT_TYPEMAP(long, SvIV); INPUT_TYPEMAP(short, SvIV); INPUT_TYPEMAP(signed char, SvIV); INPUT_TYPEMAP(unsigned int, SvUV); INPUT_TYPEMAP(unsigned long, SvUV); INPUT_TYPEMAP(unsigned short, SvUV); INPUT_TYPEMAP(unsigned char, SvUV); %typemap(in) bool *INPUT(bool temp), bool &INPUT(bool temp) { temp = SvIV($input) ? true : false; $1 = &temp; } %typemap(typecheck) bool *INPUT = bool; %typemap(typecheck) bool &INPUT = bool; %typemap(in) long long *INPUT($*1_ltype temp), long long &INPUT($*1_ltype temp) { temp = strtoll(SvPV_nolen($input), 0, 0); $1 = &temp; } %typemap(typecheck) long long *INPUT = long long; %typemap(typecheck) long long &INPUT = long long; %typemap(in) unsigned long long *INPUT($*1_ltype temp), unsigned long long &INPUT($*1_ltype temp) { temp = strtoull(SvPV_nolen($input), 0, 0); $1 = &temp; } %typemap(typecheck) unsigned long long *INPUT = unsigned long long; %typemap(typecheck) unsigned long long &INPUT = unsigned long long; #undef INPUT_TYPEMAP // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, functions will return a Perl array. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include typemaps.i double modf(double x, double *OUTPUT); or you can use the %apply directive : %include typemaps.i %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Perl output of the function would be an array containing both output values. */ // Force the argument to be ignored. %typemap(in,numinputs=0) int *OUTPUT(int temp), int &OUTPUT(int temp), short *OUTPUT(short temp), short &OUTPUT(short temp), long *OUTPUT(long temp), long &OUTPUT(long temp), unsigned int *OUTPUT(unsigned int temp), unsigned int &OUTPUT(unsigned int temp), unsigned short *OUTPUT(unsigned short temp), unsigned short &OUTPUT(unsigned short temp), unsigned long *OUTPUT(unsigned long temp), unsigned long &OUTPUT(unsigned long temp), unsigned char *OUTPUT(unsigned char temp), unsigned char &OUTPUT(unsigned char temp), signed char *OUTPUT(signed char temp), signed char &OUTPUT(signed char temp), bool *OUTPUT(bool temp), bool &OUTPUT(bool temp), float *OUTPUT(float temp), float &OUTPUT(float temp), double *OUTPUT(double temp), double &OUTPUT(double temp), long long *OUTPUT($*1_ltype temp), long long &OUTPUT($*1_ltype temp), unsigned long long *OUTPUT($*1_ltype temp), unsigned long long &OUTPUT($*1_ltype temp) "$1 = &temp;"; %typemap(argout) int *OUTPUT, int &OUTPUT, short *OUTPUT, short &OUTPUT, long *OUTPUT, long &OUTPUT, signed char *OUTPUT, signed char &OUTPUT, bool *OUTPUT, bool &OUTPUT { if (argvi >= items) { EXTEND(sp, argvi+1); } $result = sv_newmortal(); sv_setiv($result,(IV) *($1)); argvi++; } %typemap(argout) unsigned int *OUTPUT, unsigned int &OUTPUT, unsigned short *OUTPUT, unsigned short &OUTPUT, unsigned long *OUTPUT, unsigned long &OUTPUT, unsigned char *OUTPUT, unsigned char &OUTPUT { if (argvi >= items) { EXTEND(sp, argvi+1); } $result = sv_newmortal(); sv_setuv($result,(UV) *($1)); argvi++; } %typemap(argout) float *OUTPUT, float &OUTPUT, double *OUTPUT, double &OUTPUT { if (argvi >= items) { EXTEND(sp, argvi+1); } $result = sv_newmortal(); sv_setnv($result,(double) *($1)); argvi++; } %typemap(argout) long long *OUTPUT, long long &OUTPUT { char temp[256]; if (argvi >= items) { EXTEND(sp, argvi+1); } sprintf(temp,"%lld", (long long)*($1)); $result = sv_newmortal(); sv_setpv($result,temp); argvi++; } %typemap(argout) unsigned long long *OUTPUT, unsigned long long &OUTPUT { char temp[256]; if (argvi >= items) { EXTEND(sp, argvi+1); } sprintf(temp,"%llu", (unsigned long long)*($1)); $result = sv_newmortal(); sv_setpv($result,temp); argvi++; } // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Perl array. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include typemaps.i void neg(double *INOUT); or you can use the %apply directive : %include typemaps.i %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value. Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Perl variable you might do this : $x = neg($x); */ %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) signed char *INOUT = signed char *INPUT; %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) int &INOUT = int &INPUT; %typemap(in) short &INOUT = short &INPUT; %typemap(in) long &INOUT = long &INPUT; %typemap(in) unsigned &INOUT = unsigned &INPUT; %typemap(in) unsigned short &INOUT = unsigned short &INPUT; %typemap(in) unsigned long &INOUT = unsigned long &INPUT; %typemap(in) unsigned char &INOUT = unsigned char &INPUT; %typemap(in) signed char &INOUT = signed char &INPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(in) float &INOUT = float &INPUT; %typemap(in) double &INOUT = double &INPUT; %typemap(in) long long &INOUT = long long &INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT = long *OUTPUT; %typemap(argout) unsigned *INOUT = unsigned *OUTPUT; %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) signed char *INOUT = signed char *OUTPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT = double *OUTPUT; %typemap(argout) long long *INOUT = long long *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) int &INOUT = int &OUTPUT; %typemap(argout) short &INOUT = short &OUTPUT; %typemap(argout) long &INOUT = long &OUTPUT; %typemap(argout) unsigned &INOUT = unsigned &OUTPUT; %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; %typemap(argout) signed char &INOUT = signed char &OUTPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; %typemap(argout) float &INOUT = float &OUTPUT; %typemap(argout) double &INOUT = double &OUTPUT; %typemap(argout) long long &INOUT = long long &OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; /* Overloading information */ %typemap(typecheck) double *INOUT = double; %typemap(typecheck) bool *INOUT = bool; %typemap(typecheck) signed char *INOUT = signed char; %typemap(typecheck) unsigned char *INOUT = unsigned char; %typemap(typecheck) unsigned long *INOUT = unsigned long; %typemap(typecheck) unsigned short *INOUT = unsigned short; %typemap(typecheck) unsigned int *INOUT = unsigned int; %typemap(typecheck) long *INOUT = long; %typemap(typecheck) short *INOUT = short; %typemap(typecheck) int *INOUT = int; %typemap(typecheck) float *INOUT = float; %typemap(typecheck) long long *INOUT = long long; %typemap(typecheck) unsigned long long *INOUT = unsigned long long; %typemap(typecheck) double &INOUT = double; %typemap(typecheck) bool &INOUT = bool; %typemap(typecheck) signed char &INOUT = signed char; %typemap(typecheck) unsigned char &INOUT = unsigned char; %typemap(typecheck) unsigned long &INOUT = unsigned long; %typemap(typecheck) unsigned short &INOUT = unsigned short; %typemap(typecheck) unsigned int &INOUT = unsigned int; %typemap(typecheck) long &INOUT = long; %typemap(typecheck) short &INOUT = short; %typemap(typecheck) int &INOUT = int; %typemap(typecheck) float &INOUT = float; %typemap(typecheck) long long &INOUT = long long; %typemap(typecheck) unsigned long long &INOUT = unsigned long long; #endif // -------------------------------------------------------------------- // Special types // -------------------------------------------------------------------- %include swig-4.0.2/Lib/perl5/perluserdir.swg0000644000175000017500000000004413667507523017177 0ustar williamwilliam#define %perlcode %insert("perl") swig-4.0.2/Lib/perl5/carrays.i0000644000175000017500000000004113667507523015730 0ustar williamwilliam%include swig-4.0.2/Lib/perl5/std_pair.i0000644000175000017500000000140513667507523016076 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.2/Lib/perl5/stl.i0000644000175000017500000000044313667507523015074 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/perl5/exception.i0000644000175000017500000000021213667507523016262 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg); SWIG_fail; )) } swig-4.0.2/Lib/perl5/std_list.i0000644000175000017500000003435313667507523016126 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * * SWIG typemaps for std::list types * ----------------------------------------------------------------------------- */ %include %include // containers // ------------------------------------------------------------------------ // std::list // // The aim of all that follows would be to integrate std::list with // Perl as much as possible, namely, to allow the user to pass and // be returned Perl arrays. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::list), f(const std::list&), f(const std::list*): // the parameter being read-only, either a Perl sequence or a // previously wrapped std::list can be passed. // -- f(std::list&), f(std::list*): // the parameter must be modified; therefore, only a wrapped std::list // can be passed. // -- std::list f(): // the list is returned by copy; therefore, a Perl sequence of T:s // is returned which is most easily used in other Perl functions // -- std::list& f(), std::list* f(), const std::list& f(), // const std::list* f(): // the list is returned by reference; therefore, a wrapped std::list // is returned // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template class list { %typemap(in) list (std::list* v) { if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,1) != -1) { $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i& (std::list temp, std::list* v), const list* (std::list temp, std::list* v) { if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,1) != -1) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i { std::list< T >::const_iterator i; unsigned int j; int len = $1.size(); SV **svs = new SV*[len]; for (i=$1.begin(), j=0; i!=$1.end(); i++, j++) { T* ptr = new T(*i); svs[j] = sv_newmortal(); SWIG_MakePtr(svs[j], (void*) ptr, $descriptor(T *), $shadow|$owner); } AV *myav = av_make(len, svs); delete[] svs; $result = newRV_noinc((SV*) myav); sv_2mortal($result); argvi++; } %typecheck(SWIG_TYPECHECK_LIST) list { { /* wrapped list? */ std::list< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_&descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { SV **tv; I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* obj; tv = av_fetch(av, 0, 0); if (SWIG_ConvertPtr(*tv, (void **)&obj, $descriptor(T *),0) != -1) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_LIST) const list&, const list* { { /* wrapped list? */ std::list< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { SV **tv; I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* obj; tv = av_fetch(av, 0, 0); if (SWIG_ConvertPtr(*tv, (void **)&obj, $descriptor(T *),0) != -1) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; list(); list(const list& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(const T& x); }; // specializations for built-ins %define specialize_std_list(T,CHECK_T,TO_T,FROM_T) template<> class list { %typemap(in) list (std::list* v) { if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,1) != -1){ $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; for (int i=0; i& (std::list temp, std::list* v), const list* (std::list temp, std::list* v) { if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,1) != -1) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i { std::list< T >::const_iterator i; unsigned int j; int len = $1.size(); SV **svs = new SV*[len]; for (i=$1.begin(), j=0; i!=$1.end(); i++, j++) { svs[j] = sv_newmortal(); FROM_T(svs[j], *i); } AV *myav = av_make(len, svs); delete[] svs; $result = newRV_noinc((SV*) myav); sv_2mortal($result); argvi++; } %typecheck(SWIG_TYPECHECK_LIST) list { { /* wrapped list? */ std::list< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_&descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { SV **tv; I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ tv = av_fetch(av, 0, 0); if (CHECK_T(*tv)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_LIST) const list&, const list* { { /* wrapped list? */ std::list< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { SV **tv; I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ tv = av_fetch(av, 0, 0); if (CHECK_T(*tv)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef T value_type; typedef const value_type& const_reference; list(); list(const list& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(T x); }; %enddef specialize_std_list(bool,SvIOK,SvIVX,sv_setiv); specialize_std_list(char,SvIOK,SvIVX,sv_setiv); specialize_std_list(int,SvIOK,SvIVX,sv_setiv); specialize_std_list(short,SvIOK,SvIVX,sv_setiv); specialize_std_list(long,SvIOK,SvIVX,sv_setiv); specialize_std_list(unsigned char,SvIOK,SvIVX,sv_setiv); specialize_std_list(unsigned int,SvIOK,SvIVX,sv_setiv); specialize_std_list(unsigned short,SvIOK,SvIVX,sv_setiv); specialize_std_list(unsigned long,SvIOK,SvIVX,sv_setiv); specialize_std_list(float,SvNIOK,SwigSvToNumber,sv_setnv); specialize_std_list(double,SvNIOK,SwigSvToNumber,sv_setnv); specialize_std_list(std::string,SvPOK,SvPVX,SwigSvFromString); } swig-4.0.2/Lib/perl5/perltypemaps.swg0000644000175000017500000000577213667507523017401 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Perl * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* in Perl we need to pass the CPerlObj value, sometimes, so, we define the decl/call macros as needed. */ #define SWIG_AS_DECL_ARGS SWIG_PERL_DECL_ARGS_2 #define SWIG_AS_CALL_ARGS SWIG_PERL_CALL_ARGS_2 #define SWIG_FROM_DECL_ARGS SWIG_PERL_DECL_ARGS_1 #define SWIG_FROM_CALL_ARGS SWIG_PERL_CALL_ARGS_1 /* Include fundamental fragment definitions */ %include /* Look for user fragments file. */ %include /* Perl fragments for primitive types */ %include /* Perl fragments for char* strings */ %include /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* director support in Perl is experimental */ #ifndef SWIG_DIRECTOR_TYPEMAPS #define SWIG_DIRECTOR_TYPEMAPS #endif /* Perl types */ #define SWIG_Object SV * #define VOID_Object &PL_sv_undef /* Perl $shadow flag */ #define %newpointer_flags $shadow #define %newinstance_flags $shadow /* Complete overload of the output/constant/exception macros */ /* output */ %define %set_output(obj) $result = obj; argvi++ %enddef /* append output */ %define %append_output(obj) if (argvi >= items) EXTEND(sp, argvi+1); %set_output(obj) %enddef /* variable output */ %define %set_varoutput(obj) sv_setsv($result,obj) %enddef /* constant */ %define %set_constant(name, obj) %begin_block SV *sv = get_sv((char*) SWIG_prefix name, TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, obj); SvREADONLY_on(sv); %end_block %enddef /* raise exception */ %define %raise(obj, type, desc) sv_setsv(get_sv("@", GV_ADD), obj); SWIG_fail %enddef /* For directors to raise/throw the original exception */ %typemap(throws) Swig::DirectorException %{ sv_setsv(ERRSV, $1.getNative()); SWIG_fail; %} /* Include the unified typemap library */ %include /* ------------------------------------------------------------ * Perl extra typemaps / typemap overrides * ------------------------------------------------------------ */ %typemap(varout,type="$1_descriptor") SWIGTYPE *, SWIGTYPE [] "sv_setiv(SvRV($result),PTR2IV($1));"; %typemap(varout,type="$1_descriptor") SWIGTYPE & "sv_setiv(SvRV($result),PTR2IV(&$1));"; %typemap(varout,type="$1_descriptor") SWIGTYPE && "sv_setiv(SvRV($result),PTR2IV(&$1));"; %typemap(varout,type="$&1_descriptor") SWIGTYPE "sv_setiv(SvRV($result), PTR2IV(&$1));"; %typemap(varout,type="$1_descriptor") SWIGTYPE (CLASS::*) { SWIG_MakePackedObj($result, (void *) &$1, sizeof($1_type), $1_descriptor); } %typemap(varout) SWIGTYPE *const = SWIGTYPE *; swig-4.0.2/Lib/perl5/perlerrors.swg0000644000175000017500000000154713667507523017047 0ustar williamwilliam/* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGINTERN const char* SWIG_Perl_ErrorType(int code) { switch(code) { case SWIG_MemoryError: return "MemoryError"; case SWIG_IOError: return "IOError"; case SWIG_RuntimeError: return "RuntimeError"; case SWIG_IndexError: return "IndexError"; case SWIG_TypeError: return "TypeError"; case SWIG_DivisionByZero: return "ZeroDivisionError"; case SWIG_OverflowError: return "OverflowError"; case SWIG_SyntaxError: return "SyntaxError"; case SWIG_ValueError: return "ValueError"; case SWIG_SystemError: return "SystemError"; case SWIG_AttributeError: return "AttributeError"; default: return "RuntimeError"; } } swig-4.0.2/Lib/perl5/perlkw.swg0000644000175000017500000000743613667507523016157 0ustar williamwilliam/* Warnings for Perl keywords */ #define PERLKW(x) %keywordwarn("'" `x` "' is a perl keyword") `x` #define PERLBN(x) %builtinwarn("'" `x` "' conflicts with a built-in name in perl") "::" `x` /* From http://www.rocketaware.com/perl/perlfunc/ */ /* Functions for SCALARs or strings*/ PERLBN(chomp); PERLBN(chop); PERLBN(chr); PERLBN(crypt); PERLBN(hex); PERLBN(index); PERLBN(lc); PERLBN(lcfirst); PERLBN(length); PERLBN(oct); PERLBN(ord); PERLBN(pack); PERLBN(reverse); PERLBN(rindex); PERLBN(sprintf); PERLBN(substr); PERLBN(uc); PERLBN(ucfirst); /* Regular expressions and pattern matching */ PERLBN(m); PERLBN(pos); PERLBN(quotemeta); PERLBN(split); PERLBN(study); /* Numeric functions */ PERLBN(abs); PERLBN(atan2); PERLBN(cos); PERLBN(exp); PERLBN(hex); PERLBN(int); PERLBN(log); PERLBN(oct); PERLBN(rand); PERLBN(sin); PERLBN(sqrt); PERLBN(srand); /* Functions for real @ARRAYs*/ PERLBN(pop); PERLBN(push); PERLBN(shift); PERLBN(splice); PERLBN(unshift); /* Functions for list data*/ PERLBN(grep); PERLBN(join); PERLBN(map); PERLBN(qw); PERLBN(reverse); PERLBN(sort); PERLBN(unpack); /* Functions for real %HASHes*/ PERLBN(delete); PERLBN(each); PERLBN(exists); PERLBN(keys); PERLBN(values); /* Input and output functions*/ PERLBN(binmode); PERLBN(close); PERLBN(closedir); PERLBN(dbmclose); PERLBN(dbmopen); PERLBN(die); PERLBN(eof); PERLBN(fileno); PERLBN(flock); PERLBN(format); PERLBN(getc); PERLBN(print); PERLBN(printf); PERLBN(read); PERLBN(readdir); PERLBN(rewinddir); PERLBN(seek); PERLBN(seekdir); PERLBN(select); PERLBN(syscall); PERLBN(sysread); PERLBN(sysseek); PERLBN(syswrite); PERLBN(tell); PERLBN(telldir); PERLBN(truncate); PERLBN(warn); PERLBN(write); /* Functions for fixed length data or records*/ PERLBN(pack); PERLBN(read); PERLBN(syscall); PERLBN(sysread); PERLBN(syswrite); PERLBN(unpack); PERLBN(vec); /* Functions for filehandles, files, or directories */ PERLBN(chdir); PERLBN(chmod); PERLBN(chown); PERLBN(chroot); PERLBN(fcntl); PERLBN(glob); PERLBN(ioctl); PERLBN(link); PERLBN(lstat); PERLBN(mkdir); PERLBN(open); PERLBN(opendir); PERLBN(readlink); PERLBN(rename); PERLBN(rmdir); PERLBN(stat); PERLBN(symlink); PERLBN(umask); PERLBN(unlink); PERLBN(utime); /* Keywords related to the control flow of your perl program */ PERLKW(caller); PERLKW(continue); PERLKW(die); PERLKW(do); PERLKW(dump); PERLKW(eval); PERLKW(exit); PERLKW(goto); PERLKW(last); PERLKW(next); PERLKW(redo); PERLKW(return); PERLKW(sub); PERLKW(wantarray); /* Keywords related to scoping */ PERLKW(caller); PERLKW(import); PERLKW(local); PERLKW(my); PERLKW(package); PERLKW(use); /* Miscellaneous functions */ PERLBN("defined"); PERLBN(dump); PERLBN(eval); PERLBN(formline); PERLBN(local); PERLBN(my); PERLBN(reset); PERLBN(scalar); PERLBN(undef); PERLBN(wantarray); /* Functions for processes and process groups */ PERLBN(alarm); PERLBN(exec); PERLBN(fork); PERLBN(getpgrp); PERLBN(getppid); PERLBN(getpriority); PERLBN(kill); PERLBN(pipe); PERLBN(setpgrp); PERLBN(setpriority); PERLBN(sleep); PERLBN(system); PERLBN(times); PERLBN(wait); PERLBN(waitpid); /* Keywords related to perl modules */ PERLKW(do); PERLKW(import); PERLKW(no); PERLKW(package); PERLKW(require); PERLKW(use); /* Keywords related to classes and object-orientedness */ PERLKW(bless); PERLKW(dbmclose); PERLKW(dbmopen); PERLKW(package); PERLKW(ref); PERLKW(tie); PERLKW(tied); PERLKW(untie); PERLKW(use); /* Functions new in perl5 */ PERLBN(abs); PERLBN(bless); PERLBN(chomp); PERLBN(chr); PERLBN(exists); PERLBN(formline); PERLBN(glob); PERLBN(import); PERLBN(lc); PERLBN(lcfirst); PERLBN(map); PERLBN(my); PERLBN(no); PERLBN(prototype); PERLBN(qx); PERLBN(qw); PERLBN(readline); PERLBN(readpipe); PERLBN(ref); PERLBN(sub); PERLBN(sysopen); PERLBN(tie); PERLBN(tied); PERLBN(uc); PERLBN(ucfirst); PERLBN(untie); PERLBN(use); #undef PERLKW #undef PERLBN swig-4.0.2/Lib/perl5/cdata.i0000644000175000017500000000003613667507523015344 0ustar williamwilliam%include swig-4.0.2/Lib/perl5/std_string.i0000644000175000017500000000007613667507523016454 0ustar williamwilliam%include %include swig-4.0.2/Lib/perl5/std_map.i0000644000175000017500000000507013667507523015722 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.2/Lib/perl5/cstring.i0000644000175000017500000000004013667507523015734 0ustar williamwilliam%include swig-4.0.2/Lib/perl5/perlopers.swg0000644000175000017500000000352013667507523016654 0ustar williamwilliam/* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus // These are auto-supported by the Perl-module %rename(__plusplus__) *::operator++; %rename(__minmin__) *::operator--; %rename(__add__) *::operator+; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-(); %rename(__neg__) *::operator-() const; %rename(__mul__) *::operator*; %rename(__div__) *::operator/; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; %rename(__mod__) *::operator%; %rename(__gt__) *::operator>; %rename(__lt__) *::operator<; %rename(__not__) *::operator!; %rename(__le__) *::operator<=; %rename(__ge__) *::operator>=; %rename(__and__) *::operator&; %rename(__or__) *::operator|; %rename(__iadd__) *::operator+=; %rename(__isub__) *::operator-=; // These are renamed, but no test exists in operator_overload_runme.pl %ignoreoperator(EQ) operator=; // These are renamed, but no 'use overload...' is added %rename(__lshift__) *::operator<<; %rename(__rshift__) *::operator>>; %rename(__xor__) *::operator^; %rename(__invert__) *::operator~; %rename(__call__) *::operator(); /* Ignored operators */ %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; %ignoreoperator(MULEQ) operator*=; %ignoreoperator(DIVEQ) operator/=; %ignoreoperator(MODEQ) operator%=; %ignoreoperator(LSHIFTEQ) operator<<=; %ignoreoperator(RSHIFTEQ) operator>>=; %ignoreoperator(ANDEQ) operator&=; %ignoreoperator(OREQ) operator|=; %ignoreoperator(XOREQ) operator^=; %ignoreoperator(ARROWSTAR) operator->*; %ignoreoperator(INDEX) operator[]; #endif /* __cplusplus */ swig-4.0.2/Lib/perl5/factory.i0000644000175000017500000000004013667507523015732 0ustar williamwilliam%include swig-4.0.2/Lib/math.i0000644000175000017500000000404613667507523014177 0ustar williamwilliam/* ----------------------------------------------------------------------------- * math.i * * SWIG library file for floating point operations. * ----------------------------------------------------------------------------- */ %module math %{ #include %} extern double cos(double x); /* Cosine of x */ extern double sin(double x); /* Sine of x */ extern double tan(double x); /* Tangent of x */ extern double acos(double x); /* Inverse cosine in range [-PI/2,PI/2], x in [-1,1]. */ extern double asin(double x); /* Inverse sine in range [0,PI], x in [-1,1]. */ extern double atan(double x); /* Inverse tangent in range [-PI/2,PI/2]. */ extern double atan2(double y, double x); /* Inverse tangent of y/x in range [-PI,PI]. */ extern double cosh(double x); /* Hyperbolic cosine of x */ extern double sinh(double x); /* Hyperbolic sine of x */ extern double tanh(double x); /* Hyperbolic tangent of x */ extern double exp(double x); /* Natural exponential function e^x */ extern double log(double x); /* Natural logarithm ln(x), x > 0 */ extern double log10(double x); /* Base 10 logarithm, x > 0 */ extern double pow(double x, double y); /* Power function x^y. */ extern double sqrt(double x); /* Square root. x >= 0 */ extern double fabs(double x); /* Absolute value of x */ extern double ceil(double x); /* Smallest integer not less than x, as a double */ extern double floor(double x); /* Largest integer not greater than x, as a double */ extern double fmod(double x, double y); /* Floating-point remainder of x/y, with the same sign as x. */ #define M_E 2.7182818284590452354 #define M_LOG2E 1.4426950408889634074 #define M_LOG10E 0.43429448190325182765 #define M_LN2 0.69314718055994530942 #define M_LN10 2.30258509299404568402 #define M_PI 3.14159265358979323846 #define M_PI_2 1.57079632679489661923 #define M_PI_4 0.78539816339744830962 #define M_1_PI 0.31830988618379067154 #define M_2_PI 0.63661977236758134308 #define M_2_SQRTPI 1.12837916709551257390 #define M_SQRT2 1.41421356237309504880 #define M_SQRT1_2 0.70710678118654752440 swig-4.0.2/Lib/cmalloc.i0000644000175000017500000000446213667507523014662 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cmalloc.i * * SWIG library file containing macros that can be used to create objects using * the C malloc function. * ----------------------------------------------------------------------------- */ %{ #include %} /* %malloc(TYPE [, NAME = TYPE]) %calloc(TYPE [, NAME = TYPE]) %realloc(TYPE [, NAME = TYPE]) %free(TYPE [, NAME = TYPE]) %allocators(TYPE [,NAME = TYPE]) Creates functions for allocating/reallocating memory. TYPE *malloc_NAME(int nbytes = sizeof(TYPE); TYPE *calloc_NAME(int nobj=1, int size=sizeof(TYPE)); TYPE *realloc_NAME(TYPE *ptr, int nbytes); void free_NAME(TYPE *ptr); */ %define %malloc(TYPE,NAME...) #if #NAME != "" %rename(malloc_##NAME) ::malloc(int nbytes); #else %rename(malloc_##TYPE) ::malloc(int nbytes); #endif #if #TYPE != "void" %typemap(default) int nbytes "$1 = (int) sizeof(TYPE);" #endif TYPE *malloc(int nbytes); %typemap(default) int nbytes; %enddef %define %calloc(TYPE,NAME...) #if #NAME != "" %rename(calloc_##NAME) ::calloc(int nobj, int sz); #else %rename(calloc_##TYPE) ::calloc(int nobj, int sz); #endif #if #TYPE != "void" %typemap(default) int sz "$1 = (int) sizeof(TYPE);" #else %typemap(default) int sz "$1 = 1;" #endif %typemap(default) int nobj "$1 = 1;" TYPE *calloc(int nobj, int sz); %typemap(default) int sz; %typemap(default) int nobj; %enddef %define %realloc(TYPE,NAME...) %insert("header") { #if #NAME != "" TYPE *realloc_##NAME(TYPE *ptr, int nitems) #else TYPE *realloc_##TYPE(TYPE *ptr, int nitems) #endif { #if #TYPE != "void" return (TYPE *) realloc(ptr, nitems*sizeof(TYPE)); #else return (TYPE *) realloc(ptr, nitems); #endif } } #if #NAME != "" TYPE *realloc_##NAME(TYPE *ptr, int nitems); #else TYPE *realloc_##TYPE(TYPE *ptr, int nitems); #endif %enddef %define %free(TYPE,NAME...) #if #NAME != "" %rename(free_##NAME) ::free(TYPE *ptr); #else %rename(free_##TYPE) ::free(TYPE *ptr); #endif void free(TYPE *ptr); %enddef %define %sizeof(TYPE,NAME...) #if #NAME != "" %constant int sizeof_##NAME = sizeof(TYPE); #else %constant int sizeof_##TYPE = sizeof(TYPE); #endif %enddef %define %allocators(TYPE,NAME...) %malloc(TYPE,NAME) %calloc(TYPE,NAME) %realloc(TYPE,NAME) %free(TYPE,NAME) #if #TYPE != "void" %sizeof(TYPE,NAME) #endif %enddef swig-4.0.2/Lib/lua/0000755000175000017500000000000013667507523013651 5ustar williamwilliamswig-4.0.2/Lib/lua/std_deque.i0000644000175000017500000000003413667507523015775 0ustar williamwilliam%include swig-4.0.2/Lib/lua/luaruntime.swg0000644000175000017500000000600413667507523016560 0ustar williamwilliam/* ----------------------------------------------------------------------------- * luaruntime.swg * * all the runtime code for . * ----------------------------------------------------------------------------- */ %runtime "swigrun.swg" /* Common C API type-checking code */ %runtime "swigerrors.swg" /* SWIG errors */ %runtime "luarun.swg" /* Lua runtime stuff */ %insert(initbeforefunc) "swiginit.swg" %insert(initbeforefunc) %{ /* Forward declaration of where the user's %init{} gets inserted */ void SWIG_init_user(lua_State* L ); #ifdef __cplusplus extern "C" { #endif /* this is the initialization function added at the very end of the code the function is always called SWIG_init, but an earlier #define will rename it */ #if ((SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC)) LUALIB_API int SWIG_init(lua_State* L) #else SWIGEXPORT int SWIG_init(lua_State* L) /* default Lua action */ #endif { #if (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC) /* valid for both Lua and eLua */ int i; int globalRegister = 0; /* start with global table */ lua_pushglobaltable (L); /* SWIG's internal initialisation */ SWIG_InitializeModule((void*)L); SWIG_PropagateClientData(); #endif #if ((SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUA) && (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC)) || defined(SWIG_LUA_ELUA_EMULATE) /* add a global fn */ SWIG_Lua_add_function(L,"swig_type",SWIG_Lua_type); SWIG_Lua_add_function(L,"swig_equals",SWIG_Lua_class_equal); #endif #if (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC) /* set up base class pointers (the hierarchy) */ for (i = 0; swig_types[i]; i++){ if (swig_types[i]->clientdata){ SWIG_Lua_init_base_class(L,(swig_lua_class*)(swig_types[i]->clientdata)); } } #ifdef SWIG_LUA_MODULE_GLOBAL globalRegister = 1; #endif #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) SWIG_Lua_namespace_register(L,&swig_SwigModule, globalRegister); #endif #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) for (i = 0; swig_types[i]; i++){ if (swig_types[i]->clientdata){ SWIG_Lua_elua_class_register_instance(L,(swig_lua_class*)(swig_types[i]->clientdata)); } } #endif #if defined(SWIG_LUA_ELUA_EMULATE) lua_newtable(L); SWIG_Lua_elua_emulate_register(L,swig_SwigModule.ns_methods); SWIG_Lua_elua_emulate_register_clear(L); if(globalRegister) { lua_pushstring(L,swig_SwigModule.name); lua_pushvalue(L,-2); lua_rawset(L,-4); } #endif #endif #if (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC) /* invoke user-specific initialization */ SWIG_init_user(L); /* end module */ /* Note: We do not clean up the stack here (Lua will do this for us). At this point, we have the globals table and out module table on the stack. Returning one value makes the module table the result of the require command. */ return 1; #else return 0; #endif } #ifdef __cplusplus } #endif %} /* Note: the initialization function is closed after all code is generated */ swig-4.0.2/Lib/lua/wchar.i0000644000175000017500000000210613667507523015126 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wchar.i * * Typemaps for the wchar_t type * These are mapped to a Lua string and are passed around by value. * ----------------------------------------------------------------------------- */ // note: only support for pointer right now, not fixed length strings // TODO: determine how long a const wchar_t* is so we can write wstr2str() // & do the output typemap %{ #include wchar_t* str2wstr(const char *str, int len) { wchar_t* p; if (str==0 || len<1) return 0; p=(wchar_t *)malloc((len+1)*sizeof(wchar_t)); if (p==0) return 0; if (mbstowcs(p, str, len)==(size_t)-1) { free(p); return 0; } p[len]=0; return p; } %} %typemap(in, checkfn="SWIG_lua_isnilstring", fragment="SWIG_lua_isnilstring") wchar_t * %{ $1 = str2wstr(lua_tostring( L, $input ),lua_rawlen( L, $input )); if ($1==0) {SWIG_Lua_pushferrstring(L,"Error in converting to wchar (arg %d)",$input);goto fail;} %} %typemap(freearg) wchar_t * %{ free($1); %} %typemap(typecheck) wchar_t * = char *; swig-4.0.2/Lib/lua/lua_fnptr.i0000644000175000017500000001020413667507523016012 0ustar williamwilliam/* ----------------------------------------------------------------------------- * lua_fnptr.i * * SWIG Library file containing the main typemap code to support Lua modules. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Basic function pointer support * ----------------------------------------------------------------------------- */ /* The structure: SWIGLUA_FN provides a simple (local only) wrapping for a function. For example if you wanted to have a C/C++ function take a lua function as a parameter. You could declare it as: int my_func(int a, int b, SWIGLUA_FN fn); note: it should be passed by value, not byref or as a pointer. The SWIGLUA_FN holds a pointer to the lua_State, and the stack index where the function is held. The macro SWIGLUA_FN_GET() will put a copy of the lua function at the top of the stack. After that its fairly simple to write the rest of the code (assuming know how to use lua), just push the parameters, call the function and return the result. int my_func(int a, int b, SWIGLUA_FN fn) { SWIGLUA_FN_GET(fn); lua_pushnumber(fn.L,a); lua_pushnumber(fn.L,b); lua_call(fn.L,2,1); // 2 in, 1 out return luaL_checknumber(fn.L,-1); } SWIG will automatically performs the wrapping of the arguments in and out. However: if you wish to store the function between calls, look to the SWIGLUA_REF below. */ // this is for the C code only, we don't want SWIG to wrapper it for us. %{ typedef struct{ lua_State* L; /* the state */ int idx; /* the index on the stack */ }SWIGLUA_FN; #define SWIGLUA_FN_GET(fn) {lua_pushvalue(fn.L,fn.idx);} %} // the actual typemap %typemap(in,checkfn="lua_isfunction") SWIGLUA_FN %{ $1.L=L; $1.idx=$input; %} /* ----------------------------------------------------------------------------- * Storing lua object support * ----------------------------------------------------------------------------- */ /* The structure: SWIGLUA_REF provides a mechanism to store object (usually functions) between calls to the interpreter. For example if you wanted to have a C/C++ function take a lua function as a parameter. Then call it later, You could declare it as: SWIGLUA_REF myref; void set_func(SWIGLUA_REF ref); SWIGLUA_REF get_func(); void call_func(int val); note: it should be passed by value, not byref or as a pointer. The SWIGLUA_REF holds a pointer to the lua_State, and an integer reference to the object. Because it holds a permanent ref to an object, the SWIGLUA_REF must be handled with a bit more care. It should be initialised to {0,0}. The function swiglua_ref_set() should be used to set it. swiglua_ref_clear() should be used to clear it when not in use, and swiglua_ref_get() to get the data back. Note: the typemap does not check that the object is in fact a function, if you need that you must add it yourself. int my_func(int a, int b, SWIGLUA_FN fn) { SWIGLUA_FN_GET(fn); lua_pushnumber(fn.L,a); lua_pushnumber(fn.L,b); lua_call(fn.L,2,1); // 2 in, 1 out return luaL_checknumber(fn.L,-1); } SWIG will automatically performs the wrapping of the arguments in and out. However: if you wish to store the function between calls, look to the SWIGLUA_REF below. */ %{ typedef struct{ lua_State* L; /* the state */ int ref; /* a ref in the lua global index */ }SWIGLUA_REF; void swiglua_ref_clear(SWIGLUA_REF* pref){ if (pref->L!=0 && pref->ref!=LUA_NOREF && pref->ref!=LUA_REFNIL){ luaL_unref(pref->L,LUA_REGISTRYINDEX,pref->ref); } pref->L=0; pref->ref=0; } void swiglua_ref_set(SWIGLUA_REF* pref,lua_State* L,int idx){ pref->L=L; lua_pushvalue(L,idx); /* copy obj to top */ pref->ref=luaL_ref(L,LUA_REGISTRYINDEX); /* remove obj from top & put into registry */ } void swiglua_ref_get(SWIGLUA_REF* pref){ if (pref->L!=0) lua_rawgeti(pref->L,LUA_REGISTRYINDEX,pref->ref); } %} %typemap(in) SWIGLUA_REF %{ swiglua_ref_set(&$1,L,$input); %} %typemap(out) SWIGLUA_REF %{ if ($1.L!=0) {swiglua_ref_get(&$1);} else {lua_pushnil(L);} SWIG_arg++; %} swig-4.0.2/Lib/lua/std_vector.i0000644000175000017500000000645513667507523016211 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * std::vector typemaps for LUA * ----------------------------------------------------------------------------- */ %{ #include %} %include // the general exceptions /* A really cut down version of the vector class. Note: this does not match the true std::vector class but instead is an approximate, so that SWIG knows how to wrapper it. (Eg, all access is by value, not ref, as SWIG turns refs to pointers) And no support for iterators & insert/erase It would be useful to have a vector<->Lua table conversion routine */ namespace std { template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(); vector(unsigned int); vector(const vector& other); vector(unsigned int,T); unsigned int size() const; unsigned int max_size() const; bool empty() const; void clear(); void push_back(T val); void pop_back(); T front()const; // only read front & back T back()const; // not write to them // operator [] given later: %extend // this is a extra bit of SWIG code { // [] is replaced by __getitem__ & __setitem__ // simply throws a string, which causes a lua error T __getitem__(unsigned int idx) throw (std::out_of_range) { if (idx>=self->size()) throw std::out_of_range("in vector::__getitem__()"); return (*self)[idx]; } void __setitem__(unsigned int idx,T val) throw (std::out_of_range) { if (idx>=self->size()) throw std::out_of_range("in vector::__setitem__()"); (*self)[idx]=val; } }; }; } /* Vector<->LuaTable fns These look a bit like the array<->LuaTable fns but are templated, not %defined (you must have template support for STL) */ /* %{ // reads a table into a vector of numbers // lua numbers will be cast into the type required (rounding may occur) // return 0 if non numbers found in the table // returns new'ed ptr if ok template std::vector* SWIG_read_number_vector(lua_State* L,int index) { int i=0; std::vector* vec=new std::vector(); while(1) { lua_rawgeti(L,index,i+1); if (!lua_isnil(L,-1)) { lua_pop(L,1); break; // finished } if (!lua_isnumber(L,-1)) { lua_pop(L,1); delete vec; return 0; // error } vec->push_back((T)lua_tonumber(L,-1)); lua_pop(L,1); ++i; } return vec; // ok } // writes a vector of numbers out as a lua table template int SWIG_write_number_vector(lua_State* L,std::vector *vec) { lua_newtable(L); for(int i=0;isize();++i) { lua_pushnumber(L,(double)((*vec)[i])); lua_rawseti(L,-2,i+1);// -1 is the number, -2 is the table } } %} // then the typemaps %define SWIG_TYPEMAP_NUM_VECTOR(T) // in %typemap(in) std::vector *INPUT %{ $1 = SWIG_read_number_vector(L,$input); if (!$1) SWIG_fail;%} %typemap(freearg) std::vector *INPUT %{ delete $1;%} // out %typemap(argout) std::vector *OUTPUT %{ SWIG_write_number_vector(L,$1); SWIG_arg++; %} %enddef */ swig-4.0.2/Lib/lua/luarun.swg0000644000175000017500000020236613667507523015712 0ustar williamwilliam/* ----------------------------------------------------------------------------- * luarun.swg * * This file contains the runtime support for Lua modules * and includes code for managing global variables and pointer * type checking. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #include "lua.h" #include "lauxlib.h" #include /* for malloc */ #include /* for a few sanity tests */ /* ----------------------------------------------------------------------------- * Lua flavors * ----------------------------------------------------------------------------- */ #define SWIG_LUA_FLAVOR_LUA 1 #define SWIG_LUA_FLAVOR_ELUA 2 #define SWIG_LUA_FLAVOR_ELUAC 3 #if !defined(SWIG_LUA_TARGET) # error SWIG_LUA_TARGET not defined #endif #if defined(SWIG_LUA_ELUA_EMULATE) struct swig_elua_entry; typedef struct swig_elua_key { int type; union { const char* strkey; lua_Number numkey; } key; } swig_elua_key; typedef struct swig_elua_val { int type; union { lua_Number number; const struct swig_elua_entry *table; const char *string; lua_CFunction function; struct { char member; long lvalue; void *pvalue; swig_type_info **ptype; } userdata; } value; } swig_elua_val; typedef struct swig_elua_entry { swig_elua_key key; swig_elua_val value; } swig_elua_entry; #define LSTRKEY(x) {LUA_TSTRING, {.strkey = x} } #define LNUMKEY(x) {LUA_TNUMBER, {.numkey = x} } #define LNILKEY {LUA_TNIL, {.strkey = 0} } #define LNUMVAL(x) {LUA_TNUMBER, {.number = x} } #define LFUNCVAL(x) {LUA_TFUNCTION, {.function = x} } #define LROVAL(x) {LUA_TTABLE, {.table = x} } #define LNILVAL {LUA_TNIL, {.string = 0} } #define LSTRVAL(x) {LUA_TSTRING, {.string = x} } #define LUA_REG_TYPE swig_elua_entry #define SWIG_LUA_ELUA_EMUL_METATABLE_KEY "__metatable" #define lua_pushrotable(L,p)\ lua_newtable(L);\ assert(p);\ SWIG_Lua_elua_emulate_register(L,(swig_elua_entry*)(p)); #define SWIG_LUA_CONSTTAB_POINTER(B,C,D)\ LSTRKEY(B), {LUA_TUSERDATA, { .userdata={0,0,(void*)(C),&D} } } #define SWIG_LUA_CONSTTAB_BINARY(B,S,C,D)\ LSTRKEY(B), {LUA_TUSERDATA, { .userdata={1,S,(void*)(C),&D} } } #endif #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) # define SWIG_LUA_CONSTTAB_INT(B, C) LSTRKEY(B), LNUMVAL(C) # define SWIG_LUA_CONSTTAB_FLOAT(B, C) LSTRKEY(B), LNUMVAL(C) # define SWIG_LUA_CONSTTAB_STRING(B, C) LSTRKEY(B), LSTRVAL(C) # define SWIG_LUA_CONSTTAB_CHAR(B, C) LSTRKEY(B), LNUMVAL(C) /* Those two types of constants are not supported in elua */ #ifndef SWIG_LUA_CONSTTAB_POINTER #warning eLua does not support pointers as constants. By default, nil will be used as value #define SWIG_LUA_CONSTTAB_POINTER(B,C,D) LSTRKEY(B), LNILVAL #endif #ifndef SWIG_LUA_CONSTTAB_BINARY #warning eLua does not support pointers to member as constants. By default, nil will be used as value #define SWIG_LUA_CONSTTAB_BINARY(B, S, C, D) LSTRKEY(B), LNILVAL #endif #else /* SWIG_LUA_FLAVOR_LUA */ # define SWIG_LUA_CONSTTAB_INT(B, C) SWIG_LUA_INT, (char *)B, (long)C, 0, 0, 0 # define SWIG_LUA_CONSTTAB_FLOAT(B, C) SWIG_LUA_FLOAT, (char *)B, 0, (double)C, 0, 0 # define SWIG_LUA_CONSTTAB_STRING(B, C) SWIG_LUA_STRING, (char *)B, 0, 0, (void *)C, 0 # define SWIG_LUA_CONSTTAB_CHAR(B, C) SWIG_LUA_CHAR, (char *)B, (long)C, 0, 0, 0 # define SWIG_LUA_CONSTTAB_POINTER(B,C,D)\ SWIG_LUA_POINTER, (char *)B, 0, 0, (void *)C, &D # define SWIG_LUA_CONSTTAB_BINARY(B, S, C, D)\ SWIG_LUA_BINARY, (char *)B, S, 0, (void *)C, &D #endif #ifndef SWIG_LUA_ELUA_EMULATE #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) # define LRO_STRVAL(v) {{.p = (char *) v}, LUA_TSTRING} # define LSTRVAL LRO_STRVAL #endif #endif /* SWIG_LUA_ELUA_EMULATE*/ #ifndef SWIG_LUA_ELUA_EMULATE #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) #ifndef MIN_OPT_LEVEL #define MIN_OPT_LEVEL 2 #endif #include "lrodefs.h" #include "lrotable.h" #endif #endif /* SWIG_LUA_ELUA_EMULATE*/ /* ----------------------------------------------------------------------------- * compatibility defines * ----------------------------------------------------------------------------- */ /* History of Lua C API length functions: In Lua 5.0 (and before?) there was "lua_strlen". In Lua 5.1, this was renamed "lua_objlen", but a compatibility define of "lua_strlen" was added. In Lua 5.2, this function was again renamed, to "lua_rawlen" (to emphasize that it doesn't call the "__len" metamethod), and the compatibility define of lua_strlen was removed. All SWIG uses have been updated to "lua_rawlen", and we add our own defines of that here for older versions of Lua. */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 501 # define lua_rawlen lua_strlen #elif LUA_VERSION_NUM == 501 # define lua_rawlen lua_objlen #endif /* lua_pushglobaltable is the recommended "future-proof" way to get the global table for Lua 5.2 and later. Here we define lua_pushglobaltable ourselves for Lua versions before 5.2. */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 502 # define lua_pushglobaltable(L) lua_pushvalue(L, LUA_GLOBALSINDEX) #endif /* lua_absindex was introduced in Lua 5.2 */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 502 # define lua_absindex(L,i) ((i)>0 || (i) <= LUA_REGISTRYINDEX ? (i) : lua_gettop(L) + (i) + 1) #endif /* lua_rawsetp was introduced in Lua 5.2 */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 502 #define lua_rawsetp(L,index,ptr)\ lua_pushlightuserdata(L,(void*)(ptr));\ lua_insert(L,-2);\ lua_rawset(L,index); #define lua_rawgetp(L,index,ptr)\ lua_pushlightuserdata(L,(void*)(ptr));\ lua_rawget(L,index); #endif /* -------------------------------------------------------------------------- * Helper functions for error handling * -------------------------------------------------------------------------- */ /* Push the string STR on the Lua stack, like lua_pushstring, but prefixed with the location of the innermost Lua call-point (as formatted by luaL_where). */ SWIGRUNTIME void SWIG_Lua_pusherrstring (lua_State *L, const char *str) { luaL_where (L, 1); lua_pushstring (L, str); lua_concat (L, 2); } /* Push a formatted string generated from FMT and following args on the Lua stack, like lua_pushfstring, but prefixed with the location of the innermost Lua call-point (as formatted by luaL_where). */ SWIGRUNTIME void SWIG_Lua_pushferrstring (lua_State *L, const char *fmt, ...) { va_list argp; va_start(argp, fmt); luaL_where(L, 1); lua_pushvfstring(L, fmt, argp); va_end(argp); lua_concat(L, 2); } /* ----------------------------------------------------------------------------- * global swig types * ----------------------------------------------------------------------------- */ /* Constant table */ #define SWIG_LUA_INT 1 #define SWIG_LUA_FLOAT 2 #define SWIG_LUA_STRING 3 #define SWIG_LUA_POINTER 4 #define SWIG_LUA_BINARY 5 #define SWIG_LUA_CHAR 6 /* Structure for variable linking table */ typedef struct { const char *name; lua_CFunction get; lua_CFunction set; } swig_lua_var_info; #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) typedef const LUA_REG_TYPE swig_lua_method; typedef const LUA_REG_TYPE swig_lua_const_info; #else /* Normal lua */ typedef luaL_Reg swig_lua_method; /* Constant information structure */ typedef struct { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_lua_const_info; #endif typedef struct { const char *name; lua_CFunction getmethod; lua_CFunction setmethod; } swig_lua_attribute; struct swig_lua_class; /* Can be used to create namespaces. Currently used to wrap class static methods/variables/constants */ typedef struct swig_lua_namespace { const char *name; swig_lua_method *ns_methods; swig_lua_attribute *ns_attributes; swig_lua_const_info *ns_constants; struct swig_lua_class **ns_classes; struct swig_lua_namespace **ns_namespaces; } swig_lua_namespace; typedef struct swig_lua_class { const char *name; /* Name that this class has in Lua */ const char *fqname; /* Fully qualified name - Scope + class name */ swig_type_info **type; lua_CFunction constructor; void (*destructor)(void *); swig_lua_method *methods; swig_lua_attribute *attributes; swig_lua_namespace *cls_static; swig_lua_method *metatable; /* 0 for -eluac */ struct swig_lua_class **bases; const char **base_names; } swig_lua_class; /* this is the struct for wrapping all pointers in SwigLua */ typedef struct { swig_type_info *type; int own; /* 1 if owned & must be destroyed */ void *ptr; } swig_lua_userdata; /* this is the struct for wrapping arbitrary packed binary data (currently it is only used for member function pointers) the data ordering is similar to swig_lua_userdata, but it is currently not possible to tell the two structures apart within SWIG, other than by looking at the type */ typedef struct { swig_type_info *type; int own; /* 1 if owned & must be destroyed */ char data[1]; /* arbitrary amount of data */ } swig_lua_rawdata; /* Common SWIG API */ #define SWIG_NewPointerObj(L, ptr, type, owner) SWIG_Lua_NewPointerObj(L, (void *)ptr, type, owner) #define SWIG_ConvertPtr(L,idx, ptr, type, flags) SWIG_Lua_ConvertPtr(L,idx,ptr,type,flags) #define SWIG_MustGetPtr(L,idx, type,flags, argnum,fnname) SWIG_Lua_MustGetPtr(L,idx, type,flags, argnum,fnname) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(L, idx, ptr, sz, ty) SWIG_Lua_ConvertPacked(L, idx, ptr, sz, ty) #define SWIG_NewMemberObj(L, ptr, sz, type) SWIG_Lua_NewPackedObj(L, ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Lua_GetModule((lua_State*)(clientdata)) #define SWIG_SetModule(clientdata, pointer) SWIG_Lua_SetModule((lua_State*) (clientdata), pointer) #define SWIG_MODULE_CLIENTDATA_TYPE lua_State* /* Contract support */ #define SWIG_contract_assert(expr, msg) \ if (!(expr)) { SWIG_Lua_pusherrstring(L, (char *) msg); goto fail; } else /* helper #defines */ #define SWIG_fail {goto fail;} #define SWIG_fail_arg(func_name,argnum,type) \ {SWIG_Lua_pushferrstring(L,"Error in %s (arg %d), expected '%s' got '%s'",\ func_name,argnum,type,SWIG_Lua_typename(L,argnum));\ goto fail;} #define SWIG_fail_ptr(func_name,argnum,type) \ SWIG_fail_arg(func_name,argnum,(type && type->str)?type->str:"void*") #define SWIG_check_num_args(func_name,a,b) \ if (lua_gettop(L)b) \ {SWIG_Lua_pushferrstring(L,"Error in %s expected %d..%d args, got %d",func_name,a,b,lua_gettop(L));\ goto fail;} #define SWIG_Lua_get_table(L,n) \ (lua_pushstring(L, n), lua_rawget(L,-2)) #define SWIG_Lua_add_function(L,n,f) \ (lua_pushstring(L, n), \ lua_pushcfunction(L, f), \ lua_rawset(L,-3)) #define SWIG_Lua_add_boolean(L,n,b) \ (lua_pushstring(L, n), \ lua_pushboolean(L, b), \ lua_rawset(L,-3)) /* special helper for allowing 'nil' for usertypes */ #define SWIG_isptrtype(L,I) (lua_isuserdata(L,I) || lua_isnil(L,I)) #ifdef __cplusplus /* Special helper for member function pointers it gets the address, casts it, then dereferences it */ /*#define SWIG_mem_fn_as_voidptr(a) (*((char**)&(a))) */ #endif /* storing/access of swig_module_info */ SWIGRUNTIME swig_module_info * SWIG_Lua_GetModule(lua_State *L) { swig_module_info *ret = 0; lua_pushstring(L,"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); lua_rawget(L,LUA_REGISTRYINDEX); if (lua_islightuserdata(L,-1)) ret=(swig_module_info*)lua_touserdata(L,-1); lua_pop(L,1); /* tidy */ return ret; } SWIGRUNTIME void SWIG_Lua_SetModule(lua_State *L, swig_module_info *module) { /* add this all into the Lua registry: */ lua_pushstring(L,"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); lua_pushlightuserdata(L,(void*)module); lua_rawset(L,LUA_REGISTRYINDEX); } /* ----------------------------------------------------------------------------- * global variable support code: modules * ----------------------------------------------------------------------------- */ /* this function is called when trying to set an immutable. default action is to print an error. This can removed with a compile flag SWIGLUA_IGNORE_SET_IMMUTABLE */ SWIGINTERN int SWIG_Lua_set_immutable(lua_State *L) { /* there should be 1 param passed in: the new value */ #ifndef SWIGLUA_IGNORE_SET_IMMUTABLE lua_pop(L,1); /* remove it */ luaL_error(L,"This variable is immutable"); #endif return 0; /* should not return anything */ } #ifdef SWIG_LUA_ELUA_EMULATE SWIGRUNTIME void SWIG_Lua_NewPointerObj(lua_State *L,void *ptr,swig_type_info *type, int own); SWIGRUNTIME void SWIG_Lua_NewPackedObj(lua_State *L,void *ptr,size_t size,swig_type_info *type); static int swig_lua_elua_emulate_unique_key; /* This function emulates eLua rotables behaviour. It loads a rotable definition into the usual lua table. */ SWIGINTERN void SWIG_Lua_elua_emulate_register(lua_State *L, const swig_elua_entry *table) { int i, table_parsed, parsed_tables_array, target_table; assert(lua_istable(L,-1)); target_table = lua_gettop(L); /* Get the registry where we put all parsed tables to avoid loops */ lua_rawgetp(L, LUA_REGISTRYINDEX, &swig_lua_elua_emulate_unique_key); if(lua_isnil(L,-1)) { lua_pop(L,1); lua_newtable(L); lua_pushvalue(L,-1); lua_rawsetp(L,LUA_REGISTRYINDEX,(void*)(&swig_lua_elua_emulate_unique_key)); } parsed_tables_array = lua_gettop(L); lua_pushvalue(L,target_table); lua_rawsetp(L, parsed_tables_array, table); table_parsed = 0; const int SWIGUNUSED pairs_start = lua_gettop(L); for(i = 0;table[i].key.type != LUA_TNIL || table[i].value.type != LUA_TNIL;i++) { const swig_elua_entry *entry = table + i; int is_metatable = 0; switch(entry->key.type) { case LUA_TSTRING: lua_pushstring(L,entry->key.key.strkey); if(strcmp(entry->key.key.strkey, SWIG_LUA_ELUA_EMUL_METATABLE_KEY) == 0) is_metatable = 1; break; case LUA_TNUMBER: lua_pushnumber(L,entry->key.key.numkey); break; case LUA_TNIL: lua_pushnil(L); break; default: assert(0); } switch(entry->value.type) { case LUA_TSTRING: lua_pushstring(L,entry->value.value.string); break; case LUA_TNUMBER: lua_pushnumber(L,entry->value.value.number); break; case LUA_TFUNCTION: lua_pushcfunction(L,entry->value.value.function); break; case LUA_TTABLE: lua_rawgetp(L,parsed_tables_array, entry->value.value.table); table_parsed = !lua_isnil(L,-1); if(!table_parsed) { lua_pop(L,1); /*remove nil */ lua_newtable(L); SWIG_Lua_elua_emulate_register(L,entry->value.value.table); } if(is_metatable) { assert(lua_istable(L,-1)); lua_pushvalue(L,-1); lua_setmetatable(L,target_table); } break; case LUA_TUSERDATA: if(entry->value.value.userdata.member) SWIG_NewMemberObj(L,entry->value.value.userdata.pvalue, entry->value.value.userdata.lvalue, *(entry->value.value.userdata.ptype)); else SWIG_NewPointerObj(L,entry->value.value.userdata.pvalue, *(entry->value.value.userdata.ptype),0); break; case LUA_TNIL: lua_pushnil(L); break; default: assert(0); } assert(lua_gettop(L) == pairs_start + 2); lua_rawset(L,target_table); } lua_pop(L,1); /* Removing parsed tables storage */ assert(lua_gettop(L) == target_table); } SWIGINTERN void SWIG_Lua_elua_emulate_register_clear(lua_State *L) { lua_pushnil(L); lua_rawsetp(L, LUA_REGISTRYINDEX, &swig_lua_elua_emulate_unique_key); } SWIGINTERN void SWIG_Lua_get_class_registry(lua_State *L); SWIGINTERN int SWIG_Lua_emulate_elua_getmetatable(lua_State *L) { SWIG_check_num_args("getmetatable(SWIG eLua emulation)", 1, 1); SWIG_Lua_get_class_registry(L); lua_getfield(L,-1,"lua_getmetatable"); lua_remove(L,-2); /* remove the registry*/ assert(!lua_isnil(L,-1)); lua_pushvalue(L,1); assert(lua_gettop(L) == 3); /* object | function | object again */ lua_call(L,1,1); if(!lua_isnil(L,-1)) /*There is an ordinary metatable */ return 1; /*if it is a table, then emulate elua behaviour - check for __metatable attribute of a table*/ assert(lua_gettop(L) == 2); if(lua_istable(L,-2)) { lua_pop(L,1); /*remove the nil*/ lua_getfield(L,-1, SWIG_LUA_ELUA_EMUL_METATABLE_KEY); } assert(lua_gettop(L) == 2); return 1; fail: lua_error(L); return 0; } SWIGINTERN void SWIG_Lua_emulate_elua_swap_getmetatable(lua_State *L) { SWIG_Lua_get_class_registry(L); lua_pushglobaltable(L); lua_pushstring(L,"lua_getmetatable"); lua_getfield(L,-2,"getmetatable"); assert(!lua_isnil(L,-1)); lua_rawset(L,-4); lua_pushstring(L, "getmetatable"); lua_pushcfunction(L, SWIG_Lua_emulate_elua_getmetatable); lua_rawset(L,-3); lua_pop(L,2); } /* END OF REMOVE */ #endif /* ----------------------------------------------------------------------------- * global variable support code: namespaces and modules (which are the same thing) * ----------------------------------------------------------------------------- */ SWIGINTERN int SWIG_Lua_namespace_get(lua_State *L) { /* there should be 2 params passed in (1) table (not the meta table) (2) string name of the attribute */ assert(lua_istable(L,-2)); /* just in case */ lua_getmetatable(L,-2); assert(lua_istable(L,-1)); SWIG_Lua_get_table(L,".get"); /* find the .get table */ assert(lua_istable(L,-1)); /* look for the key in the .get table */ lua_pushvalue(L,2); /* key */ lua_rawget(L,-2); lua_remove(L,-2); /* stack tidy, remove .get table */ if (lua_iscfunction(L,-1)) { /* found it so call the fn & return its value */ lua_call(L,0,1); /* 1 value in (userdata),1 out (result) */ lua_remove(L,-2); /* stack tidy, remove metatable */ return 1; } lua_pop(L,1); /* remove whatever was there */ /* ok, so try the .fn table */ SWIG_Lua_get_table(L,".fn"); /* find the .get table */ assert(lua_istable(L,-1)); /* just in case */ lua_pushvalue(L,2); /* key */ lua_rawget(L,-2); /* look for the fn */ lua_remove(L,-2); /* stack tidy, remove .fn table */ if (lua_isfunction(L,-1)) /* note: whether it's a C function or lua function */ { /* found it so return the fn & let lua call it */ lua_remove(L,-2); /* stack tidy, remove metatable */ return 1; } lua_pop(L,1); /* remove whatever was there */ return 0; } SWIGINTERN int SWIG_Lua_namespace_set(lua_State *L) { /* there should be 3 params passed in (1) table (not the meta table) (2) string name of the attribute (3) any for the new value */ assert(lua_istable(L,1)); lua_getmetatable(L,1); /* get the meta table */ assert(lua_istable(L,-1)); SWIG_Lua_get_table(L,".set"); /* find the .set table */ if (lua_istable(L,-1)) { /* look for the key in the .set table */ lua_pushvalue(L,2); /* key */ lua_rawget(L,-2); if (lua_iscfunction(L,-1)) { /* found it so call the fn & return its value */ lua_pushvalue(L,3); /* value */ lua_call(L,1,0); return 0; } lua_pop(L,1); /* remove the value */ } lua_pop(L,1); /* remove the value .set table */ lua_pop(L,1); /* remote metatable */ lua_rawset(L,-3); return 0; } #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* In elua this is useless */ SWIGINTERN void SWIG_Lua_InstallConstants(lua_State *L, swig_lua_const_info constants[]); /* forward declaration */ SWIGINTERN void SWIG_Lua_add_variable(lua_State *L,const char *name,lua_CFunction getFn,lua_CFunction setFn); /* forward declaration */ SWIGINTERN void SWIG_Lua_class_register(lua_State *L,swig_lua_class *clss); /* helper function - register namespace methods and attributes into namespace */ SWIGINTERN int SWIG_Lua_add_namespace_details(lua_State *L, swig_lua_namespace *ns) { int i; /* There must be namespace table (not metatable) at the top of the stack */ assert(lua_istable(L,-1)); SWIG_Lua_InstallConstants(L, ns->ns_constants); /* add methods to the namespace/module table */ for(i=0;ns->ns_methods[i].name;i++){ SWIG_Lua_add_function(L,ns->ns_methods[i].name,ns->ns_methods[i].func); } lua_getmetatable(L,-1); /* add fns */ for(i=0;ns->ns_attributes[i].name;i++){ SWIG_Lua_add_variable(L,ns->ns_attributes[i].name,ns->ns_attributes[i].getmethod,ns->ns_attributes[i].setmethod); } /* clear stack - remove metatble */ lua_pop(L,1); return 0; } /* Register all classes in the namespace */ SWIGINTERN void SWIG_Lua_add_namespace_classes(lua_State *L, swig_lua_namespace *ns) { swig_lua_class **classes; /* There must be a module/namespace table at the top of the stack */ assert(lua_istable(L,-1)); classes = ns->ns_classes; if( classes != 0 ) { while(*classes != 0) { SWIG_Lua_class_register(L, *classes); classes++; } } } /* Helper function. Creates namespace table and adds it to module table if 'reg' is true, then will register namespace table to parent one (must be on top of the stack when function is called). Function always returns newly registered table on top of the stack. */ SWIGINTERN void SWIG_Lua_namespace_register(lua_State *L, swig_lua_namespace *ns, int reg) { swig_lua_namespace **sub_namespace; /* 1 argument - table on the top of the stack */ const int SWIGUNUSED begin = lua_gettop(L); assert(lua_istable(L,-1)); /* just in case. This is supposed to be module table or parent namespace table */ lua_checkstack(L,5); lua_newtable(L); /* namespace itself */ lua_newtable(L); /* metatable for namespace */ /* add a table called ".get" */ lua_pushstring(L,".get"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".set" */ lua_pushstring(L,".set"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".fn" */ lua_pushstring(L,".fn"); lua_newtable(L); lua_rawset(L,-3); /* add accessor fns for using the .get,.set&.fn */ SWIG_Lua_add_function(L,"__index",SWIG_Lua_namespace_get); SWIG_Lua_add_function(L,"__newindex",SWIG_Lua_namespace_set); lua_setmetatable(L,-2); /* set metatable */ /* Register all functions, variables etc */ SWIG_Lua_add_namespace_details(L,ns); /* Register classes */ SWIG_Lua_add_namespace_classes(L,ns); sub_namespace = ns->ns_namespaces; if( sub_namespace != 0) { while(*sub_namespace != 0) { SWIG_Lua_namespace_register(L, *sub_namespace, 1); lua_pop(L,1); /* removing sub-namespace table */ sub_namespace++; } } if (reg) { lua_pushstring(L,ns->name); lua_pushvalue(L,-2); lua_rawset(L,-4); /* add namespace to module table */ } assert(lua_gettop(L) == begin+1); } #endif /* SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA */ /* ----------------------------------------------------------------------------- * global variable support code: classes * ----------------------------------------------------------------------------- */ SWIGINTERN void SWIG_Lua_get_class_metatable(lua_State *L,const char *cname); typedef int (*swig_lua_base_iterator_func)(lua_State*,swig_type_info*, int, int *ret); SWIGINTERN int SWIG_Lua_iterate_bases(lua_State *L, swig_type_info * SWIGUNUSED swig_type, int first_arg, swig_lua_base_iterator_func func, int *const ret) { /* first_arg - position of the object in stack. Everything that is above are arguments * and is passed to every evocation of the func */ int last_arg = lua_gettop(L);/* position of last argument */ int original_metatable = last_arg + 1; size_t bases_count; int result = SWIG_ERROR; int bases_table; (void)swig_type; lua_getmetatable(L,first_arg); /* initialise base search */ #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) SWIG_Lua_get_table(L,".bases"); assert(lua_istable(L,-1)); bases_count = lua_rawlen(L,-1); bases_table = lua_gettop(L); #else /* In elua .bases table doesn't exist. Use table from swig_lua_class */ (void)bases_table; assert(swig_type!=0); swig_module_info *module=SWIG_GetModule(L); swig_lua_class **bases= ((swig_lua_class*)(swig_type->clientdata))->bases; const char **base_names= ((swig_lua_class*)(swig_type->clientdata))->base_names; bases_count = 0; for(;base_names[bases_count]; bases_count++);/* get length of bases */ #endif if(ret) *ret = 0; if(bases_count>0) { int to_remove; size_t i; int j; int subcall_last_arg; int subcall_first_arg = lua_gettop(L) + 1;/* Here a copy of first_arg and arguments begin */ int valid = 1; swig_type_info *base_swig_type = 0; for(j=first_arg;j<=last_arg;j++) lua_pushvalue(L,j); subcall_last_arg = lua_gettop(L); /* Trick: temporarily replacing original metatable with metatable for base class and call getter */ for(i=0;ifqname); base_swig_type = SWIG_TypeQueryModule(module,module,base_names[i]); assert(base_swig_type != 0); } #endif if(!valid) continue; assert(lua_isuserdata(L, subcall_first_arg)); assert(lua_istable(L,-1)); lua_setmetatable(L,subcall_first_arg); /* Set new metatable */ assert(lua_gettop(L) == subcall_last_arg); result = func(L, base_swig_type,subcall_first_arg, ret); /* Forward call */ if(result != SWIG_ERROR) { break; } } /* Restore original metatable */ lua_pushvalue(L,original_metatable); lua_setmetatable(L,first_arg); /* Clear - remove everything between last_arg and subcall_last_arg including */ to_remove = subcall_last_arg - last_arg; for(j=0;jtype; result = SWIG_Lua_class_do_get(L,type,1,&ret); if(result == SWIG_OK) return ret; result = SWIG_Lua_class_do_get_item(L,type,1,&ret); if(result == SWIG_OK) return ret; return 0; } /* helper for the class.set method, performs the lookup of class attributes * It returns error code. Number of function return values is passed inside 'ret' */ SWIGINTERN int SWIG_Lua_class_do_set(lua_State *L, swig_type_info *type, int first_arg, int *ret) { /* there should be 3 params passed in (1) table (not the meta table) (2) string name of the attribute (3) any for the new value */ int bases_search_result; int substack_start = lua_gettop(L) - 3; lua_checkstack(L,5); assert(lua_isuserdata(L,substack_start+1)); /* just in case */ lua_getmetatable(L,substack_start+1); /* get the meta table */ assert(lua_istable(L,-1)); /* just in case */ if(ret) *ret = 0; /* it is setter - number of return values is always 0 */ SWIG_Lua_get_table(L,".set"); /* find the .set table */ if (lua_istable(L,-1)) { /* look for the key in the .set table */ lua_pushvalue(L,substack_start+2); /* key */ lua_rawget(L,-2); lua_remove(L,-2); /* tidy stack, remove .set table */ if (lua_iscfunction(L,-1)) { /* found it so call the fn & return its value */ lua_pushvalue(L,substack_start+1); /* userdata */ lua_pushvalue(L,substack_start+3); /* value */ lua_call(L,2,0); lua_remove(L,substack_start+4); /*remove metatable*/ return SWIG_OK; } lua_pop(L,1); /* remove the value */ } else { lua_pop(L,1); /* remove the answer for .set table request*/ } /* NEW: looks for the __setitem() fn this is a user provided set fn */ SWIG_Lua_get_table(L,"__setitem"); /* find the fn */ if (lua_iscfunction(L,-1)) /* if its there */ { /* found it so call the fn & return its value */ lua_pushvalue(L,substack_start+1); /* the userdata */ lua_pushvalue(L,substack_start+2); /* the parameter */ lua_pushvalue(L,substack_start+3); /* the value */ lua_call(L,3,0); /* 3 values in ,0 out */ lua_remove(L,-2); /* stack tidy, remove metatable */ return SWIG_OK; } lua_pop(L,1); /* remove value */ lua_pop(L,1); /* remove metatable */ /* Search among bases */ bases_search_result = SWIG_Lua_iterate_bases(L,type,first_arg,SWIG_Lua_class_do_set,ret); if(ret) assert(*ret == 0); assert(lua_gettop(L) == substack_start + 3); return bases_search_result; } /* This is the actual method exported to Lua. It calls SWIG_Lua_class_do_set and correctly * handles return values. */ SWIGINTERN int SWIG_Lua_class_set(lua_State *L) { /* There should be 3 params passed in (1) table (not the meta table) (2) string name of the attribute (3) any for the new value */ int ret = 0; int result; swig_lua_userdata *usr; swig_type_info *type; assert(lua_isuserdata(L,1)); usr=(swig_lua_userdata*)lua_touserdata(L,1); /* get data */ type = usr->type; result = SWIG_Lua_class_do_set(L,type,1,&ret); if(result != SWIG_OK) { SWIG_Lua_pushferrstring(L,"Assignment not possible. No setter/member with this name. For custom assignments implement __setitem method."); lua_error(L); } else { assert(ret==0); } return 0; } /* the class.destruct method called by the interpreter */ SWIGINTERN int SWIG_Lua_class_destruct(lua_State *L) { /* there should be 1 params passed in (1) userdata (not the meta table) */ swig_lua_userdata *usr; swig_lua_class *clss; assert(lua_isuserdata(L,-1)); /* just in case */ usr=(swig_lua_userdata*)lua_touserdata(L,-1); /* get it */ /* if must be destroyed & has a destructor */ if (usr->own) /* if must be destroyed */ { clss=(swig_lua_class*)usr->type->clientdata; /* get the class */ if (clss && clss->destructor) /* there is a destroy fn */ { clss->destructor(usr->ptr); /* bye bye */ } } return 0; } /* the class.__tostring method called by the interpreter and print */ SWIGINTERN int SWIG_Lua_class_tostring(lua_State *L) { /* there should be 1 param passed in (1) userdata (not the metatable) */ swig_lua_userdata* userData; assert(lua_isuserdata(L,1)); /* just in case */ userData = (swig_lua_userdata*)lua_touserdata(L,1); /* get the userdata address */ lua_pushfstring(L, "", userData->type->str, userData->ptr); return 1; } /* to manually disown some userdata */ SWIGINTERN int SWIG_Lua_class_disown(lua_State *L) { /* there should be 1 params passed in (1) userdata (not the meta table) */ swig_lua_userdata *usr; assert(lua_isuserdata(L,-1)); /* just in case */ usr=(swig_lua_userdata*)lua_touserdata(L,-1); /* get it */ usr->own = 0; /* clear our ownership */ return 0; } /* lua callable function to compare userdata's value the issue is that two userdata may point to the same thing but to lua, they are different objects */ SWIGRUNTIME int SWIG_Lua_class_equal(lua_State *L) { int result; swig_lua_userdata *usr1,*usr2; if (!lua_isuserdata(L,1) || !lua_isuserdata(L,2)) /* just in case */ return 0; /* nil reply */ usr1=(swig_lua_userdata*)lua_touserdata(L,1); /* get data */ usr2=(swig_lua_userdata*)lua_touserdata(L,2); /* get data */ /*result=(usr1->ptr==usr2->ptr && usr1->type==usr2->type); only works if type is the same*/ result=(usr1->ptr==usr2->ptr); lua_pushboolean(L,result); return 1; } /* populate table at the top of the stack with metamethods that ought to be inherited */ SWIGINTERN void SWIG_Lua_populate_inheritable_metamethods(lua_State *L) { SWIG_Lua_add_boolean(L, "__add", 1); SWIG_Lua_add_boolean(L, "__sub", 1); SWIG_Lua_add_boolean(L, "__mul", 1); SWIG_Lua_add_boolean(L, "__div", 1); SWIG_Lua_add_boolean(L, "__mod", 1); SWIG_Lua_add_boolean(L, "__pow", 1); SWIG_Lua_add_boolean(L, "__unm", 1); SWIG_Lua_add_boolean(L, "__len", 1 ); SWIG_Lua_add_boolean(L, "__concat", 1 ); SWIG_Lua_add_boolean(L, "__eq", 1); SWIG_Lua_add_boolean(L, "__lt", 1); SWIG_Lua_add_boolean(L, "__le", 1); SWIG_Lua_add_boolean(L, "__call", 1); SWIG_Lua_add_boolean(L, "__tostring", 1); SWIG_Lua_add_boolean(L, "__gc", 0); } /* creates the swig registry */ SWIGINTERN void SWIG_Lua_create_class_registry(lua_State *L) { /* create main SWIG registry table */ lua_pushstring(L,"SWIG"); lua_newtable(L); /* populate it with some predefined data */ /* .library table. Placeholder */ lua_pushstring(L,".library"); lua_newtable(L); { /* list of metamethods that class inherits from its bases */ lua_pushstring(L,"inheritable_metamethods"); lua_newtable(L); /* populate with list of metamethods */ SWIG_Lua_populate_inheritable_metamethods(L); lua_rawset(L,-3); } lua_rawset(L,-3); lua_rawset(L,LUA_REGISTRYINDEX); } /* gets the swig registry (or creates it) */ SWIGINTERN void SWIG_Lua_get_class_registry(lua_State *L) { /* add this all into the swig registry: */ lua_pushstring(L,"SWIG"); lua_rawget(L,LUA_REGISTRYINDEX); /* get the registry */ if (!lua_istable(L,-1)) /* not there */ { /* must be first time, so add it */ lua_pop(L,1); /* remove the result */ SWIG_Lua_create_class_registry(L); /* then get it */ lua_pushstring(L,"SWIG"); lua_rawget(L,LUA_REGISTRYINDEX); } } SWIGINTERN void SWIG_Lua_get_inheritable_metamethods(lua_State *L) { SWIG_Lua_get_class_registry(L); lua_pushstring(L, ".library"); lua_rawget(L,-2); assert( !lua_isnil(L,-1) ); lua_pushstring(L, "inheritable_metamethods"); lua_rawget(L,-2); /* Remove class registry and library table */ lua_remove(L,-2); lua_remove(L,-2); } /* Helper function to get the classes metatable from the register */ SWIGINTERN void SWIG_Lua_get_class_metatable(lua_State *L,const char *cname) { SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,cname); /* get the name */ lua_rawget(L,-2); /* get it */ lua_remove(L,-2); /* tidy up (remove registry) */ } /* Set up the base classes pointers. Each class structure has a list of pointers to the base class structures. This function fills them. It cannot be done at compile time, as this will not work with hireachies spread over more than one swig file. Therefore it must be done at runtime, querying the SWIG type system. */ SWIGINTERN void SWIG_Lua_init_base_class(lua_State *L,swig_lua_class *clss) { int i=0; swig_module_info *module=SWIG_GetModule(L); for(i=0;clss->base_names[i];i++) { if (clss->bases[i]==0) /* not found yet */ { /* lookup and cache the base class */ swig_type_info *info = SWIG_TypeQueryModule(module,module,clss->base_names[i]); if (info) clss->bases[i] = (swig_lua_class *) info->clientdata; } } } #if defined(SWIG_LUA_SQUASH_BASES) && (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* Merges two tables */ SWIGINTERN void SWIG_Lua_merge_tables_by_index(lua_State *L, int target, int source) { /* iterating */ lua_pushnil(L); while (lua_next(L,source) != 0) { /* -1 - value, -2 - index */ /* have to copy to assign */ lua_pushvalue(L,-2); /* copy of index */ lua_pushvalue(L,-2); /* copy of value */ lua_rawset(L, target); lua_pop(L,1); /* only key is left */ } } /* Merges two tables with given name. original - index of target metatable, base - index of source metatable */ SWIGINTERN void SWIG_Lua_merge_tables(lua_State *L, const char* name, int original, int base) { /* push original[name], then base[name] */ lua_pushstring(L,name); lua_rawget(L,original); int original_table = lua_gettop(L); lua_pushstring(L,name); lua_rawget(L,base); int base_table = lua_gettop(L); SWIG_Lua_merge_tables_by_index(L, original_table, base_table); /* clearing stack */ lua_pop(L,2); } /* Function takes all symbols from base and adds it to derived class. It's just a helper. */ SWIGINTERN void SWIG_Lua_class_squash_base(lua_State *L, swig_lua_class *base_cls) { /* There is one parameter - original, i.e. 'derived' class metatable */ assert(lua_istable(L,-1)); int original = lua_gettop(L); SWIG_Lua_get_class_metatable(L,base_cls->fqname); int base = lua_gettop(L); SWIG_Lua_merge_tables(L, ".fn", original, base ); SWIG_Lua_merge_tables(L, ".set", original, base ); SWIG_Lua_merge_tables(L, ".get", original, base ); lua_pop(L,1); } /* Function squashes all symbols from 'clss' bases into itself */ SWIGINTERN void SWIG_Lua_class_squash_bases(lua_State *L, swig_lua_class *clss) { int i; SWIG_Lua_get_class_metatable(L,clss->fqname); for(i=0;clss->base_names[i];i++) { if (clss->bases[i]==0) /* Somehow it's not found. Skip it */ continue; /* Thing is: all bases are already registered. Thus they have already executed * this function. So we just need to squash them into us, because their bases * are already squashed into them. No need for recursion here! */ SWIG_Lua_class_squash_base(L, clss->bases[i]); } lua_pop(L,1); /*tidy stack*/ } #endif #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* In elua this is useless */ /* helper add a variable to a registered class */ SWIGINTERN void SWIG_Lua_add_variable(lua_State *L,const char *name,lua_CFunction getFn,lua_CFunction setFn) { assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_get_table(L,".get"); /* find the .get table */ assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_add_function(L,name,getFn); lua_pop(L,1); /* tidy stack (remove table) */ if (setFn) { SWIG_Lua_get_table(L,".set"); /* find the .set table */ assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_add_function(L,name,setFn); lua_pop(L,1); /* tidy stack (remove table) */ } } /* helper to recursively add class static details (static attributes, operations and constants) */ SWIGINTERN void SWIG_Lua_add_class_static_details(lua_State *L, swig_lua_class *clss) { int i = 0; /* The class namespace table must be on the top of the stack */ assert(lua_istable(L,-1)); /* call all the base classes first: we can then override these later: */ for(i=0;clss->bases[i];i++) { SWIG_Lua_add_class_static_details(L,clss->bases[i]); } SWIG_Lua_add_namespace_details(L, clss->cls_static); } SWIGINTERN void SWIG_Lua_add_class_user_metamethods(lua_State *L, swig_lua_class *clss); /* forward declaration */ /* helper to recursively add class details (attributes & operations) */ SWIGINTERN void SWIG_Lua_add_class_instance_details(lua_State *L, swig_lua_class *clss) { int i; size_t bases_count = 0; /* Add bases to .bases table */ SWIG_Lua_get_table(L,".bases"); assert(lua_istable(L,-1)); /* just in case */ for(i=0;clss->bases[i];i++) { SWIG_Lua_get_class_metatable(L,clss->bases[i]->fqname); /* Base class must be already registered */ assert(lua_istable(L,-1)); lua_rawseti(L,-2,i+1); /* In lua indexing starts from 1 */ bases_count++; } assert(lua_rawlen(L,-1) == bases_count); lua_pop(L,1); /* remove .bases table */ /* add attributes */ for(i=0;clss->attributes[i].name;i++){ SWIG_Lua_add_variable(L,clss->attributes[i].name,clss->attributes[i].getmethod,clss->attributes[i].setmethod); } /* add methods to the metatable */ SWIG_Lua_get_table(L,".fn"); /* find the .fn table */ assert(lua_istable(L,-1)); /* just in case */ for(i=0;clss->methods[i].name;i++){ SWIG_Lua_add_function(L,clss->methods[i].name,clss->methods[i].func); } lua_pop(L,1); /* tidy stack (remove table) */ /* add operator overloads This adds methods from metatable array to metatable. Can mess up garbage collectind if someone defines __gc method */ if(clss->metatable) { for(i=0;clss->metatable[i].name;i++) { SWIG_Lua_add_function(L,clss->metatable[i].name,clss->metatable[i].func); } } #if !defined(SWIG_LUA_SQUASH_BASES) /* Adding metamethods that are defined in base classes. If bases were squashed * then it is obviously unnecessary */ SWIG_Lua_add_class_user_metamethods(L, clss); #endif } /* Helpers to add user defined class metamedhods - __add, __sub etc. The helpers are needed for the following issue: Lua runtime checks for metamethod existence with rawget function ignoring our SWIG-provided __index and __newindex functions. Thus our inheritance-aware method search algorithm doesn't work in such case. (Not to say that Lua runtime queries metamethod directly in metatable and not in object). Current solution is this: if somewhere in hierarchy metamethod __x is defined, then all descendants are automatically given a special proxy __x that calls the real __x method. Obvious idea - to copy __x instead of creating __x-proxy is wrong because if someone changes __x in runtime, those changes must be reflected in all descendants. */ SWIGRUNTIME int SWIG_Lua_resolve_metamethod(lua_State *L); /*forward declaration*/ /* The real function that resolves a metamethod. * Function searches given class and all it's bases(recursively) for first instance of something that is * not equal to SWIG_Lua_resolve_metatmethod. (Almost always this 'something' is actual metamethod implementation * and it is a SWIG-generated C function.). It returns value on the top of the L and there is no garbage below the * answer. * Returns 1 if found, 0 otherwise. * clss is class which metatable we will search for method * metamethod_name_idx is index in L where metamethod name (as string) lies * skip_check allows to skip searching metamethod in givel clss and immideatelly go to searching in bases. skip_check * is not caried to subsequent recursive calls - false is always passed. It is set to true only at first call from * SWIG_Lua_resolve_metamethod * */ SWIGINTERN int SWIG_Lua_do_resolve_metamethod(lua_State *L, const swig_lua_class *clss, int metamethod_name_idx, int skip_check) { /* This function is called recursively */ int result = 0; int i = 0; if (!skip_check) { SWIG_Lua_get_class_metatable(L, clss->fqname); lua_pushvalue(L, metamethod_name_idx); lua_rawget(L,-2); /* If this is cfunction and it is equal to SWIG_Lua_resolve_metamethod then * this isn't the function we are looking for :) * lua_tocfunction will return NULL if not cfunction */ if (!lua_isnil(L,-1) && lua_tocfunction(L,-1) != SWIG_Lua_resolve_metamethod ) { lua_remove(L,-2); /* removing class metatable */ return 1; } lua_pop(L,2); /* remove class metatable and query result */ } /* Forwarding calls to bases */ for(i=0;clss->bases[i];i++) { result = SWIG_Lua_do_resolve_metamethod(L, clss->bases[i], metamethod_name_idx, 0); if (result) break; } return result; } /* The proxy function for metamethod. All parameters are passed as cclosure. Searches for actual method * and calls it */ SWIGRUNTIME int SWIG_Lua_resolve_metamethod(lua_State *L) { int numargs; int metamethod_name_idx; const swig_lua_class* clss; int result; lua_checkstack(L,5); numargs = lua_gettop(L); /* number of arguments to pass to actual metamethod */ /* Get upvalues from closure */ lua_pushvalue(L, lua_upvalueindex(1)); /*Get function name*/ metamethod_name_idx = lua_gettop(L); lua_pushvalue(L, lua_upvalueindex(2)); clss = (const swig_lua_class*)(lua_touserdata(L,-1)); lua_pop(L,1); /* remove lightuserdata with clss from stack */ /* Actual work */ result = SWIG_Lua_do_resolve_metamethod(L, clss, metamethod_name_idx, 1); if (!result) { SWIG_Lua_pushferrstring(L,"The metamethod proxy is set, but it failed to find actual metamethod. Memory corruption is most likely explanation."); lua_error(L); return 0; } lua_remove(L,-2); /* remove metamethod key */ lua_insert(L,1); /* move function to correct position */ lua_call(L, numargs, LUA_MULTRET); return lua_gettop(L); /* return all results */ } /* If given metamethod must be present in given class, then creates appropriate proxy * Returns 1 if successfully added, 0 if not added because no base class has it, -1 * if method is defined in the class metatable itself */ SWIGINTERN int SWIG_Lua_add_class_user_metamethod(lua_State *L, swig_lua_class *clss, const int metatable_index) { int key_index; int success = 0; int i = 0; /* metamethod name - on the top of the stack */ assert(lua_isstring(L,-1)); key_index = lua_gettop(L); /* Check whether method is already defined in metatable */ lua_pushvalue(L,key_index); /* copy of the key */ lua_gettable(L,metatable_index); if( !lua_isnil(L,-1) ) { lua_pop(L,1); return -1; } lua_pop(L,1); /* Iterating over immediate bases */ for(i=0;clss->bases[i];i++) { const swig_lua_class *base = clss->bases[i]; SWIG_Lua_get_class_metatable(L, base->fqname); lua_pushvalue(L, key_index); lua_rawget(L, -2); if( !lua_isnil(L,-1) ) { lua_pushvalue(L, key_index); /* Add proxy function */ lua_pushvalue(L, key_index); /* first closure value is function name */ lua_pushlightuserdata(L, clss); /* second closure value is swig_lua_class structure */ lua_pushcclosure(L, SWIG_Lua_resolve_metamethod, 2); lua_rawset(L, metatable_index); success = 1; } lua_pop(L,1); /* remove function or nil */ lua_pop(L,1); /* remove base class metatable */ if( success ) break; } return success; } SWIGINTERN void SWIG_Lua_add_class_user_metamethods(lua_State *L, swig_lua_class *clss) { int metatable_index; int metamethods_info_index; int tostring_undefined; int eq_undefined = 0; SWIG_Lua_get_class_metatable(L, clss->fqname); metatable_index = lua_gettop(L); SWIG_Lua_get_inheritable_metamethods(L); assert(lua_istable(L,-1)); metamethods_info_index = lua_gettop(L); lua_pushnil(L); /* first key */ while(lua_next(L, metamethods_info_index) != 0 ) { /* key at index -2, value at index -1 */ const int is_inheritable = lua_toboolean(L,-2); lua_pop(L,1); /* remove value - we don't need it anymore */ if(is_inheritable) { /* if metamethod is inheritable */ SWIG_Lua_add_class_user_metamethod(L,clss,metatable_index); } } lua_pop(L,1); /* remove inheritable metatmethods table */ /* Special handling for __tostring method */ lua_pushstring(L, "__tostring"); lua_pushvalue(L,-1); lua_rawget(L,metatable_index); tostring_undefined = lua_isnil(L,-1); lua_pop(L,1); if( tostring_undefined ) { lua_pushcfunction(L, SWIG_Lua_class_tostring); lua_rawset(L, metatable_index); } else { lua_pop(L,1); /* remove copy of the key */ } /* Special handling for __eq method */ lua_pushstring(L, "__eq"); lua_pushvalue(L,-1); lua_rawget(L,metatable_index); eq_undefined = lua_isnil(L,-1); lua_pop(L,1); if( eq_undefined ) { lua_pushcfunction(L, SWIG_Lua_class_equal); lua_rawset(L, metatable_index); } else { lua_pop(L,1); /* remove copy of the key */ } /* Warning: __index and __newindex are SWIG-defined. For user-defined operator[] * a __getitem/__setitem method should be defined */ lua_pop(L,1); /* pop class metatable */ } /* Register class static methods,attributes etc as well as constructor proxy */ SWIGINTERN void SWIG_Lua_class_register_static(lua_State *L, swig_lua_class *clss) { const int SWIGUNUSED begin = lua_gettop(L); lua_checkstack(L,5); /* just in case */ assert(lua_istable(L,-1)); /* just in case */ assert(strcmp(clss->name, clss->cls_static->name) == 0); /* in class those 2 must be equal */ SWIG_Lua_namespace_register(L,clss->cls_static, 1); assert(lua_istable(L,-1)); /* just in case */ /* add its constructor to module with the name of the class so you can do MyClass(...) as well as new_MyClass(...) BUT only if a constructor is defined (this overcomes the problem of pure virtual classes without constructors)*/ if (clss->constructor) { lua_getmetatable(L,-1); assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_add_function(L,"__call", clss->constructor); lua_pop(L,1); } assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_add_class_static_details(L, clss); /* clear stack */ lua_pop(L,1); assert( lua_gettop(L) == begin ); } /* Performs the instance (non-static) class registration process. Metatable for class is created * and added to the class registry. */ SWIGINTERN void SWIG_Lua_class_register_instance(lua_State *L,swig_lua_class *clss) { const int SWIGUNUSED begin = lua_gettop(L); int i; /* if name already there (class is already registered) then do nothing */ SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,clss->fqname); /* get the name */ lua_rawget(L,-2); if(!lua_isnil(L,-1)) { lua_pop(L,2); assert(lua_gettop(L)==begin); return; } lua_pop(L,2); /* tidy stack */ /* Recursively initialize all bases */ for(i=0;clss->bases[i];i++) { SWIG_Lua_class_register_instance(L,clss->bases[i]); } /* Again, get registry and push name */ SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,clss->fqname); /* get the name */ lua_newtable(L); /* create the metatable */ #if defined(SWIG_LUA_SQUASH_BASES) && (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* If squashing is requested, then merges all bases metatable into this one. * It would get us all special methods: __getitem, __add etc. * This would set .fn, .type, and other .xxx incorrectly, but we will overwrite it right away */ { int new_metatable_index = lua_absindex(L,-1); for(i=0;clss->bases[i];i++) { int base_metatable; SWIG_Lua_get_class_metatable(L,clss->bases[i]->fqname); base_metatable = lua_absindex(L,-1); SWIG_Lua_merge_tables_by_index(L,new_metatable_index, base_metatable); lua_pop(L,1); } } /* And now we will overwrite all incorrectly set data */ #endif /* add string of class name called ".type" */ lua_pushstring(L,".type"); lua_pushstring(L,clss->fqname); lua_rawset(L,-3); /* add a table called bases */ lua_pushstring(L,".bases"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".get" */ lua_pushstring(L,".get"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".set" */ lua_pushstring(L,".set"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".fn" */ lua_pushstring(L,".fn"); lua_newtable(L); /* add manual disown method */ SWIG_Lua_add_function(L,"__disown",SWIG_Lua_class_disown); lua_rawset(L,-3); /* add accessor fns for using the .get,.set&.fn */ SWIG_Lua_add_function(L,"__index",SWIG_Lua_class_get); SWIG_Lua_add_function(L,"__newindex",SWIG_Lua_class_set); SWIG_Lua_add_function(L,"__gc",SWIG_Lua_class_destruct); /* add it */ lua_rawset(L,-3); /* metatable into registry */ lua_pop(L,1); /* tidy stack (remove registry) */ assert(lua_gettop(L) == begin); #if defined(SWIG_LUA_SQUASH_BASES) && (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* Now merge all symbols from .fn, .set, .get etc from bases to our tables */ SWIG_Lua_class_squash_bases(L,clss); #endif SWIG_Lua_get_class_metatable(L,clss->fqname); SWIG_Lua_add_class_instance_details(L,clss); /* recursive adding of details (atts & ops) */ lua_pop(L,1); /* tidy stack (remove class metatable) */ assert( lua_gettop(L) == begin ); } SWIGINTERN void SWIG_Lua_class_register(lua_State *L,swig_lua_class *clss) { int SWIGUNUSED begin; assert(lua_istable(L,-1)); /* This is a table (module or namespace) where classes will be added */ SWIG_Lua_class_register_instance(L,clss); SWIG_Lua_class_register_static(L,clss); /* Add links from static part to instance part and vice versa */ /* [SWIG registry] [Module] * "MyClass" ----> [MyClass metatable] <===== "MyClass" -+> [static part] * ".get" ----> ... | | getmetatable()----| * ".set" ----> ... | | | * ".static" --------------)----------------/ [static part metatable] * | ".get" --> ... * | ".set" --> .... * |=============================== ".instance" */ begin = lua_gettop(L); lua_pushstring(L,clss->cls_static->name); lua_rawget(L,-2); /* get class static table */ assert(lua_istable(L,-1)); lua_getmetatable(L,-1); assert(lua_istable(L,-1)); /* get class static metatable */ lua_pushstring(L,".instance"); /* prepare key */ SWIG_Lua_get_class_metatable(L,clss->fqname); /* get class metatable */ assert(lua_istable(L,-1)); lua_pushstring(L,".static"); /* prepare key */ lua_pushvalue(L, -4); /* push static class TABLE */ assert(lua_istable(L,-1)); lua_rawset(L,-3); /* assign static class table(!NOT metatable) as ".static" member of class metatable */ lua_rawset(L,-3); /* assign class metatable as ".instance" member of class static METATABLE */ lua_pop(L,2); assert(lua_gettop(L) == begin); } #endif /* SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA */ #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) SWIGINTERN void SWIG_Lua_elua_class_register_instance(lua_State *L, swig_lua_class *clss) { const int SWIGUNUSED begin = lua_gettop(L); int i; /* if name already there (class is already registered) then do nothing */ SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,clss->fqname); /* get the name */ lua_rawget(L,-2); if(!lua_isnil(L,-1)) { lua_pop(L,2); assert(lua_gettop(L)==begin); return; } lua_pop(L,2); /* tidy stack */ /* Recursively initialize all bases */ for(i=0;clss->bases[i];i++) { SWIG_Lua_elua_class_register_instance(L,clss->bases[i]); } /* Again, get registry and push name */ SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,clss->fqname); /* get the name */ assert(clss->metatable); lua_pushrotable(L, (void*)(clss->metatable)); /* create the metatable */ lua_rawset(L,-3); lua_pop(L,1); assert(lua_gettop(L) == begin); } #endif /* elua && eluac */ /* ----------------------------------------------------------------------------- * Class/structure conversion fns * ----------------------------------------------------------------------------- */ /* helper to add metatable to new lua object */ SWIGINTERN void SWIG_Lua_AddMetatable(lua_State *L,swig_type_info *type) { if (type->clientdata) /* there is clientdata: so add the metatable */ { SWIG_Lua_get_class_metatable(L,((swig_lua_class*)(type->clientdata))->fqname); if (lua_istable(L,-1)) { lua_setmetatable(L,-2); } else { lua_pop(L,1); } } } /* pushes a new object into the lua stack */ SWIGRUNTIME void SWIG_Lua_NewPointerObj(lua_State *L,void *ptr,swig_type_info *type, int own) { swig_lua_userdata *usr; if (!ptr){ lua_pushnil(L); return; } usr=(swig_lua_userdata*)lua_newuserdata(L,sizeof(swig_lua_userdata)); /* get data */ usr->ptr=ptr; /* set the ptr */ usr->type=type; usr->own=own; #if (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC) SWIG_Lua_AddMetatable(L,type); /* add metatable */ #endif } /* takes a object from the lua stack & converts it into an object of the correct type (if possible) */ SWIGRUNTIME int SWIG_Lua_ConvertPtr(lua_State *L,int index,void **ptr,swig_type_info *type,int flags) { swig_lua_userdata *usr; swig_cast_info *cast; /* special case: lua nil => NULL pointer */ if (lua_isnil(L,index)) { *ptr=0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } if (lua_islightuserdata(L,index)) { *ptr=lua_touserdata(L,index); return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } usr=(swig_lua_userdata*)lua_touserdata(L,index); /* get data */ if (usr) { if (flags & SWIG_POINTER_DISOWN) /* must disown the object */ { usr->own=0; } if (!type) /* special cast void*, no casting fn */ { *ptr=usr->ptr; return SWIG_OK; /* ok */ } cast=SWIG_TypeCheckStruct(usr->type,type); /* performs normal type checking */ if (cast) { int newmemory = 0; *ptr=SWIG_TypeCast(cast,usr->ptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return SWIG_OK; /* ok */ } } return SWIG_ERROR; /* error */ } SWIGRUNTIME void* SWIG_Lua_MustGetPtr(lua_State *L,int index,swig_type_info *type,int flags, int argnum,const char *func_name){ void *result; if (!SWIG_IsOK(SWIG_ConvertPtr(L,index,&result,type,flags))){ luaL_error (L,"Error in %s, expected a %s at argument number %d\n", func_name,(type && type->str)?type->str:"void*",argnum); } return result; } /* pushes a packed userdata. user for member fn pointers only */ SWIGRUNTIME void SWIG_Lua_NewPackedObj(lua_State *L,void *ptr,size_t size,swig_type_info *type) { swig_lua_rawdata *raw; assert(ptr); /* not acceptable to pass in a NULL value */ raw=(swig_lua_rawdata*)lua_newuserdata(L,sizeof(swig_lua_rawdata)-1+size); /* alloc data */ raw->type=type; raw->own=0; memcpy(raw->data,ptr,size); /* copy the data */ SWIG_Lua_AddMetatable(L,type); /* add metatable */ } /* converts a packed userdata. user for member fn pointers only */ SWIGRUNTIME int SWIG_Lua_ConvertPacked(lua_State *L,int index,void *ptr,size_t size,swig_type_info *type) { swig_lua_rawdata *raw; raw=(swig_lua_rawdata*)lua_touserdata(L,index); /* get data */ if (!raw) return SWIG_ERROR; /* error */ if (type==0 || type==raw->type) /* void* or identical type */ { memcpy(ptr,raw->data,size); /* copy it */ return SWIG_OK; /* ok */ } return SWIG_ERROR; /* error */ } /* a function to get the typestring of a piece of data */ SWIGRUNTIME const char *SWIG_Lua_typename(lua_State *L, int tp) { swig_lua_userdata *usr; if (lua_isuserdata(L,tp)) { usr=(swig_lua_userdata*)lua_touserdata(L,tp); /* get data */ if (usr && usr->type && usr->type->str) return usr->type->str; return "userdata (unknown type)"; } return lua_typename(L,lua_type(L,tp)); } /* lua callable function to get the userdata's type */ SWIGRUNTIME int SWIG_Lua_type(lua_State *L) { lua_pushstring(L,SWIG_Lua_typename(L,1)); return 1; } /* ----------------------------------------------------------------------------- * global variable support code: class/struct typemap functions * ----------------------------------------------------------------------------- */ #if ((SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUA) && (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC)) /* Install Constants */ SWIGINTERN void SWIG_Lua_InstallConstants(lua_State *L, swig_lua_const_info constants[]) { int i; for (i = 0; constants[i].type; i++) { switch(constants[i].type) { case SWIG_LUA_INT: lua_pushstring(L,constants[i].name); lua_pushinteger(L,(lua_Integer)constants[i].lvalue); lua_rawset(L,-3); break; case SWIG_LUA_FLOAT: lua_pushstring(L,constants[i].name); lua_pushnumber(L,(lua_Number)constants[i].dvalue); lua_rawset(L,-3); break; case SWIG_LUA_CHAR: lua_pushstring(L,constants[i].name); { char c = (char)constants[i].lvalue; lua_pushlstring(L,&c,1); } lua_rawset(L,-3); break; case SWIG_LUA_STRING: lua_pushstring(L,constants[i].name); lua_pushstring(L,(char *) constants[i].pvalue); lua_rawset(L,-3); break; case SWIG_LUA_POINTER: lua_pushstring(L,constants[i].name); SWIG_NewPointerObj(L,constants[i].pvalue, *(constants[i]).ptype,0); lua_rawset(L,-3); break; case SWIG_LUA_BINARY: lua_pushstring(L,constants[i].name); SWIG_NewMemberObj(L,constants[i].pvalue,constants[i].lvalue,*(constants[i]).ptype); lua_rawset(L,-3); break; default: break; } } } #endif /* ----------------------------------------------------------------------------- * executing lua code from within the wrapper * ----------------------------------------------------------------------------- */ #ifndef SWIG_DOSTRING_FAIL /* Allows redefining of error function */ #define SWIG_DOSTRING_FAIL(S) fprintf(stderr,"%s\n",S) #endif /* Executes a C string in Lua which is a really simple way of calling lua from C Unfortunately lua keeps changing its APIs, so we need a conditional compile In lua 5.0.X it's lua_dostring() In lua 5.1.X it's luaL_dostring() */ SWIGINTERN int SWIG_Lua_dostring(lua_State *L, const char *str) { int ok,top; if (str==0 || str[0]==0) return 0; /* nothing to do */ top=lua_gettop(L); /* save stack */ #if (defined(LUA_VERSION_NUM) && (LUA_VERSION_NUM>=501)) ok=luaL_dostring(L,str); /* looks like this is lua 5.1.X or later, good */ #else ok=lua_dostring(L,str); /* might be lua 5.0.x, using lua_dostring */ #endif if (ok!=0) { SWIG_DOSTRING_FAIL(lua_tostring(L,-1)); } lua_settop(L,top); /* restore the stack */ return ok; } #ifdef __cplusplus } #endif /* ------------------------------ end luarun.swg ------------------------------ */ swig-4.0.2/Lib/lua/luakw.swg0000644000175000017500000000230413667507523015515 0ustar williamwilliam/* Warnings for Lua keywords, built-in names and bad names. */ #define LUAKW(x) %keywordwarn("'" `x` "' is a Lua keyword, renaming to 'c_" `x` "'", rename="c_%s") `x` #define LUABN(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "'" `x` "' conflicts with a basic function in Lua"), %$not %$ismember) `x` /* Warnings for Lua keywords http://www.lua.org/manual/5.2/manual.html#3.1 */ LUAKW(and); LUAKW(break); LUAKW(do); LUAKW(else); LUAKW(elseif); LUAKW(end); LUAKW(false); LUAKW(for); LUAKW(function); LUAKW(goto); LUAKW(if); LUAKW(in); LUAKW(local); LUAKW(nil); LUAKW(not); LUAKW(or); LUAKW(repeat); LUAKW(return); LUAKW(then); LUAKW(true); LUAKW(until); LUAKW(while); /* Basic functions http://www.lua.org/manual/5.2/manual.html#6.1 */ LUABN(assert); LUABN(collectgarbage); LUABN(dofile); LUABN(error); LUABN(_G); // Not actually a function LUABN(getmetatable); LUABN(ipairs); LUABN(load); LUABN(loadfile); LUABN(next); LUABN(pairs); LUABN(pcall); LUABN(print); LUABN(rawequal); LUABN(rawget); LUABN(rawlen); LUABN(rawset); LUABN(select); LUABN(setmetatable); LUABN(tonumber); LUABN(tostring); LUABN(type); LUABN(_VERSION); // Not actually a function LUABN(xpcall); #undef LUABN #undef LUAKW swig-4.0.2/Lib/lua/std_common.i0000644000175000017500000000014613667507523016166 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.2/Lib/lua/std_except.i0000644000175000017500000000370013667507523016165 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Typemaps used by the STL wrappers that throw exceptions. * These typemaps are used when methods are declared with an STL exception * specification, such as: * size_t at() const throw (std::out_of_range); * * std_except.i * ----------------------------------------------------------------------------- */ %{ #include #include %} %include namespace std { %ignore exception; // not sure if I should ignore this... class exception { public: exception() throw() { } virtual ~exception() throw(); virtual const char* what() const throw(); }; } // normally objects which are thrown are returned to the interpreter as errors // (which potentially may have problems if they are not copied) // therefore all classes based upon std::exception are converted to their strings & returned as errors %typemap(throws) std::bad_cast "SWIG_exception(SWIG_TypeError, $1.what());" %typemap(throws) std::bad_exception "SWIG_exception(SWIG_RuntimeError, $1.what());" %typemap(throws) std::domain_error "SWIG_exception(SWIG_ValueError, $1.what());" %typemap(throws) std::exception "SWIG_exception(SWIG_SystemError, $1.what());" %typemap(throws) std::invalid_argument "SWIG_exception(SWIG_ValueError, $1.what());" %typemap(throws) std::length_error "SWIG_exception(SWIG_IndexError, $1.what());" %typemap(throws) std::logic_error "SWIG_exception(SWIG_RuntimeError, $1.what());" %typemap(throws) std::out_of_range "SWIG_exception(SWIG_IndexError, $1.what());" %typemap(throws) std::overflow_error "SWIG_exception(SWIG_OverflowError, $1.what());" %typemap(throws) std::range_error "SWIG_exception(SWIG_IndexError, $1.what());" %typemap(throws) std::runtime_error "SWIG_exception(SWIG_RuntimeError, $1.what());" %typemap(throws) std::underflow_error "SWIG_exception(SWIG_RuntimeError, $1.what());" swig-4.0.2/Lib/lua/typemaps.i0000644000175000017500000004575413667507523015704 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.swg * * SWIG Library file containing the main typemap code to support Lua modules. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Basic inout typemaps * ----------------------------------------------------------------------------- */ /* These provide the basic ability for passing in & out of standard numeric data types (int,long,float,double, etc) The basic code looks like this: %typemap(in,checkfn="lua_isnumber") int *INPUT(int temp), int &INPUT(int temp) %{ temp = (int)lua_tonumber(L,$input); $1 = &temp; %} %typemap(in, numinputs=0) int *OUTPUT (int temp) %{ $1 = &temp; %} %typemap(argout) int *OUTPUT %{ lua_pushnumber(L, (double) *$1); SWIG_arg++;%} %typemap(in) int *INOUT = int *INPUT; %typemap(argout) int *INOUT = int *OUTPUT; However the code below is a mixture of #defines & such, so nowhere as easy to read To make you code work correctly its not just a matter of %including this file You also have to give SWIG the hints on which to use where eg extern int add_pointer(int* a1,int* a2); // a1 & a2 are pointer values to be added extern void swap(int* s1, int* s2); // does the swap You will need to either change the argument names extern int add_pointer(int* INPUT,int* INPUT); or provide a %apply statement %apply int* INOUT{ int *s1, int *s2 }; // if SWIG sees int* s1, int* s2, assume they are inout params */ %define SWIG_NUMBER_TYPEMAP(TYPE) %typemap(in,checkfn="lua_isnumber") TYPE *INPUT($*ltype temp), TYPE &INPUT($*ltype temp) %{ temp = ($*ltype)lua_tonumber(L,$input); $1 = &temp; %} %typemap(in, numinputs=0) TYPE *OUTPUT ($*ltype temp) %{ $1 = &temp; %} %typemap(argout) TYPE *OUTPUT %{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%} %typemap(in) TYPE *INOUT = TYPE *INPUT; %typemap(argout) TYPE *INOUT = TYPE *OUTPUT; %typemap(in) TYPE &OUTPUT = TYPE *OUTPUT; %typemap(argout) TYPE &OUTPUT = TYPE *OUTPUT; %typemap(in) TYPE &INOUT = TYPE *INPUT; %typemap(argout) TYPE &INOUT = TYPE *OUTPUT; // const version (the $*ltype is the basic number without ptr or const's) %typemap(in,checkfn="lua_isnumber") const TYPE *INPUT($*ltype temp) %{ temp = ($*ltype)lua_tonumber(L,$input); $1 = &temp; %} %enddef // now the code SWIG_NUMBER_TYPEMAP(unsigned char); SWIG_NUMBER_TYPEMAP(signed char); SWIG_NUMBER_TYPEMAP(short); SWIG_NUMBER_TYPEMAP(unsigned short); SWIG_NUMBER_TYPEMAP(signed short); SWIG_NUMBER_TYPEMAP(int); SWIG_NUMBER_TYPEMAP(unsigned int); SWIG_NUMBER_TYPEMAP(signed int); SWIG_NUMBER_TYPEMAP(long); SWIG_NUMBER_TYPEMAP(unsigned long); SWIG_NUMBER_TYPEMAP(signed long); SWIG_NUMBER_TYPEMAP(float); SWIG_NUMBER_TYPEMAP(double); SWIG_NUMBER_TYPEMAP(enum SWIGTYPE); // also for long longs's SWIG_NUMBER_TYPEMAP(long long); SWIG_NUMBER_TYPEMAP(unsigned long long); SWIG_NUMBER_TYPEMAP(signed long long); // note we dont do char, as a char* is probably a string not a ptr to a single char // similar for booleans %typemap(in,checkfn="lua_isboolean") bool *INPUT(bool temp), bool &INPUT(bool temp) %{ temp = (lua_toboolean(L,$input)!=0); $1 = &temp; %} %typemap(in, numinputs=0) bool *OUTPUT (bool temp),bool &OUTPUT (bool temp) %{ $1 = &temp; %} %typemap(argout) bool *OUTPUT,bool &OUTPUT %{ lua_pushboolean(L, (int)((*$1)!=0)); SWIG_arg++;%} %typemap(in) bool *INOUT = bool *INPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; /* ----------------------------------------------------------------------------- * Basic Array typemaps * ----------------------------------------------------------------------------- */ /* I have no idea why this kind of code does not exist in SWIG as standard, but here is it. This code will convert to/from 1D numeric arrays. In order to reduce code bloat, there are a few macros and quite a few functions defined (unfortunately this makes it a lot less clear) assuming we have functions void process_array(int arr[3]); // nice fixed size array void process_var_array(float arr[],int len); // variable sized array void process_var_array_inout(double* arr,int len); // variable sized array // data passed in & out void process_enum_inout_array_var(enum Days *arrinout, int len); // using enums void return_array_5(int arrout[5]); // out array only in order to wrap them correctly requires a typemap // inform SWIG of the correct typemap // For fixed length, you must specify it as INPUT[ANY] %apply (int INPUT[ANY]) {(int arr[3])}; // variable length arrays are just the same %apply (float INPUT[],int) {(float arr[],int len)}; // it is also ok, to map the TYPE* instead of a TYPE[] %apply (double *INOUT,int) {(double arr*,int len)}; // for the enum's you must use enum SWIGTYPE %apply (enum SWIGTYPE *INOUT,int) {(enum Days *arrinout, int len)}; // fixed length out if also fine %apply (int OUTPUT[ANY]) {(int arrout[5])}; Generally, you could use %typemap(...)=... but the %apply is neater & easier a few things of note: * all Lua tables are indexed from 1, all C/C++ arrays are indexed from 0 therefore t={6,5,3} -- t[1]==6, t[2]==5, t[3]==3 when passed to process_array(int arr[3]) becomes arr[0]==6, arr[1]==5, arr[2]==3 * for OUTPUT arrays, no array need be passed in, the fn will return a Lua table so for the above mentioned return_array_5() would look like arr=return_array_5() -- no parameters passed in * for INOUT arrays, a table must be passed in, and a new table will be returned (this is consistent with the way that numbers are processed) if you want just use arr={...} arr=process_var_array_inout(arr) -- arr is replaced by the new version The following are not yet supported: * variable length output only array (inout works ok) * multidimensional arrays * arrays of objects/structs * arrays of pointers */ /* The internals of the array management stuff helper fns/macros SWIG_ALLOC_ARRAY(TYPE,LEN) // returns a typed array TYPE[LEN] SWIG_FREE_ARRAY(PTR) // delete the ptr (if not zero) // counts the specified table & gets the size // integer version int SWIG_itable_size(lua_State* L, int index); // other version int SWIG_table_size(lua_State* L, int index); SWIG_DECLARE_TYPEMAP_ARR_FN(NAME,TYPE) // this fn declares up 4 functions for helping to read/write tables // these can then be called by the macros ... // all assume the table is an integer indexes from 1 // but the C array is a indexed from 0 // created a fixed size array, reads the specified table // and then fills the array with numbers // returns ptr to the array if ok, or 0 for error // (also pushes a error message to the stack) TYPE* SWIG_get_NAME_num_array_fixed(lua_State* L, int index, int size); // as per SWIG_get_NAME_num_array_fixed() // but reads the entire table & creates an array of the correct size // (if the table is empty, it returns an error rather than a zero length array) TYPE* SWIG_get_NAME_num_array_var(lua_State* L, int index, int* size); // writes a table to Lua with all the specified numbers void SWIG_write_NAME_num_array(lua_State* L,TYPE *array,int size); // read the specified table, and fills the array with numbers // returns 1 of ok (only fails if it doesn't find numbers) // helper fn (called by SWIG_get_NAME_num_array_*() fns) int SWIG_read_NAME_num_array(lua_State* L,int index,TYPE *array,int size); */ /* Reported that you don't need to check for NULL for delete & free There probably is some compiler that its not true for, so the code is left here just in case. #ifdef __cplusplus #define SWIG_ALLOC_ARRAY(TYPE,LEN) new TYPE[LEN] #define SWIG_FREE_ARRAY(PTR) if(PTR){delete[] PTR;} #else #define SWIG_ALLOC_ARRAY(TYPE,LEN) (TYPE *)malloc(LEN*sizeof(TYPE)) #define SWIG_FREE_ARRAY(PTR) if(PTR){free(PTR);} #endif */ %{ #ifdef __cplusplus /* generic alloc/dealloc fns*/ #define SWIG_ALLOC_ARRAY(TYPE,LEN) new TYPE[LEN] #define SWIG_FREE_ARRAY(PTR) delete[] PTR #else #define SWIG_ALLOC_ARRAY(TYPE,LEN) (TYPE *)malloc(LEN*sizeof(TYPE)) #define SWIG_FREE_ARRAY(PTR) free(PTR) #endif /* counting the size of arrays:*/ SWIGINTERN int SWIG_itable_size(lua_State* L, int index) { int n=0; while(1){ lua_rawgeti(L,index,n+1); if (lua_isnil(L,-1))break; ++n; lua_pop(L,1); } lua_pop(L,1); return n; } SWIGINTERN int SWIG_table_size(lua_State* L, int index) { int n=0; lua_pushnil(L); /* first key*/ while (lua_next(L, index) != 0) { ++n; lua_pop(L, 1); /* removes `value'; keeps `key' for next iteration*/ } return n; } /* super macro to declare array typemap helper fns */ #define SWIG_DECLARE_TYPEMAP_ARR_FN(NAME,TYPE)\ SWIGINTERN int SWIG_read_##NAME##_num_array(lua_State* L,int index,TYPE *array,int size){\ int i;\ for (i = 0; i < size; i++) {\ lua_rawgeti(L,index,i+1);\ if (lua_isnumber(L,-1)){\ array[i] = (TYPE)lua_tonumber(L,-1);\ } else {\ lua_pop(L,1);\ return 0;\ }\ lua_pop(L,1);\ }\ return 1;\ }\ SWIGINTERN TYPE* SWIG_get_##NAME##_num_array_fixed(lua_State* L, int index, int size){\ TYPE *array;\ if (!lua_istable(L,index) || SWIG_itable_size(L,index) != size) {\ SWIG_Lua_pushferrstring(L,"expected a table of size %d",size);\ return 0;\ }\ array=SWIG_ALLOC_ARRAY(TYPE,size);\ if (!SWIG_read_##NAME##_num_array(L,index,array,size)){\ SWIG_Lua_pusherrstring(L,"table must contain numbers");\ SWIG_FREE_ARRAY(array);\ return 0;\ }\ return array;\ }\ SWIGINTERN TYPE* SWIG_get_##NAME##_num_array_var(lua_State* L, int index, int* size)\ {\ TYPE *array;\ if (!lua_istable(L,index)) {\ SWIG_Lua_pusherrstring(L,"expected a table");\ return 0;\ }\ *size=SWIG_itable_size(L,index);\ if (*size<1){\ SWIG_Lua_pusherrstring(L,"table appears to be empty");\ return 0;\ }\ array=SWIG_ALLOC_ARRAY(TYPE,*size);\ if (!SWIG_read_##NAME##_num_array(L,index,array,*size)){\ SWIG_Lua_pusherrstring(L,"table must contain numbers");\ SWIG_FREE_ARRAY(array);\ return 0;\ }\ return array;\ }\ SWIGINTERN void SWIG_write_##NAME##_num_array(lua_State* L,TYPE *array,int size){\ int i;\ lua_newtable(L);\ for (i = 0; i < size; i++){\ lua_pushnumber(L,(lua_Number)array[i]);\ lua_rawseti(L,-2,i+1);/* -1 is the number, -2 is the table*/ \ }\ } %} /* This is one giant macro to define the typemaps & the helpers for array handling */ %define SWIG_TYPEMAP_NUM_ARR(NAME,TYPE) %{SWIG_DECLARE_TYPEMAP_ARR_FN(NAME,TYPE)%} // fixed size array's %typemap(in) TYPE INPUT[ANY] %{ $1 = SWIG_get_##NAME##_num_array_fixed(L,$input,$1_dim0); if (!$1) SWIG_fail;%} %typemap(freearg) TYPE INPUT[ANY] %{ SWIG_FREE_ARRAY($1);%} // variable size array's %typemap(in) (TYPE *INPUT,int) %{ $1 = SWIG_get_##NAME##_num_array_var(L,$input,&$2); if (!$1) SWIG_fail;%} %typemap(freearg) (TYPE *INPUT,int) %{ SWIG_FREE_ARRAY($1);%} // out fixed arrays %typemap(in,numinputs=0) TYPE OUTPUT[ANY] %{ $1 = SWIG_ALLOC_ARRAY(TYPE,$1_dim0); %} %typemap(argout) TYPE OUTPUT[ANY] %{ SWIG_write_##NAME##_num_array(L,$1,$1_dim0); SWIG_arg++; %} %typemap(freearg) TYPE OUTPUT[ANY] %{ SWIG_FREE_ARRAY($1); %} // inout fixed arrays %typemap(in) TYPE INOUT[ANY]=TYPE INPUT[ANY]; %typemap(argout) TYPE INOUT[ANY]=TYPE OUTPUT[ANY]; %typemap(freearg) TYPE INOUT[ANY]=TYPE INPUT[ANY]; // inout variable arrays %typemap(in) (TYPE *INOUT,int)=(TYPE *INPUT,int); %typemap(argout) (TYPE *INOUT,int) %{ SWIG_write_##NAME##_num_array(L,$1,$2); SWIG_arg++; %} %typemap(freearg) (TYPE *INOUT,int)=(TYPE *INPUT,int); // TODO out variable arrays (is there a standard form for such things?) // referencing so that (int *INPUT,int) and (int INPUT[],int) are the same %typemap(in) (TYPE INPUT[],int)=(TYPE *INPUT,int); %typemap(freearg) (TYPE INPUT[],int)=(TYPE *INPUT,int); %enddef // the following line of code // declares the C helper fns for the array typemaps // as well as defining typemaps for // fixed len arrays in & out, & variable length arrays in SWIG_TYPEMAP_NUM_ARR(schar,signed char); SWIG_TYPEMAP_NUM_ARR(uchar,unsigned char); SWIG_TYPEMAP_NUM_ARR(int,int); SWIG_TYPEMAP_NUM_ARR(uint,unsigned int); SWIG_TYPEMAP_NUM_ARR(short,short); SWIG_TYPEMAP_NUM_ARR(ushort,unsigned short); SWIG_TYPEMAP_NUM_ARR(long,long); SWIG_TYPEMAP_NUM_ARR(ulong,unsigned long); SWIG_TYPEMAP_NUM_ARR(float,float); SWIG_TYPEMAP_NUM_ARR(double,double); // again enums are a problem so they need their own type // we use the int conversion routine & recast it %typemap(in) enum SWIGTYPE INPUT[ANY] %{ $1 = ($ltype)SWIG_get_int_num_array_fixed(L,$input,$1_dim0); if (!$1) SWIG_fail;%} %typemap(freearg) enum SWIGTYPE INPUT[ANY] %{ SWIG_FREE_ARRAY($1);%} // variable size arrays %typemap(in) (enum SWIGTYPE *INPUT,int) %{ $1 = ($ltype)SWIG_get_int_num_array_var(L,$input,&$2); if (!$1) SWIG_fail;%} %typemap(freearg) (enum SWIGTYPE *INPUT,int) %{ SWIG_FREE_ARRAY($1);%} // out fixed arrays %typemap(in,numinputs=0) enum SWIGTYPE OUTPUT[ANY] %{ $1 = SWIG_ALLOC_ARRAY(enum SWIGTYPE,$1_dim0); %} %typemap(argout) enum SWIGTYPE OUTPUT[ANY] %{ SWIG_write_int_num_array(L,(int*)$1,$1_dim0); SWIG_arg++; %} %typemap(freearg) enum SWIGTYPE OUTPUT[ANY] %{ SWIG_FREE_ARRAY($1); %} // inout fixed arrays %typemap(in) enum SWIGTYPE INOUT[ANY]=enum SWIGTYPE INPUT[ANY]; %typemap(argout) enum SWIGTYPE INOUT[ANY]=enum SWIGTYPE OUTPUT[ANY]; %typemap(freearg) enum SWIGTYPE INOUT[ANY]=enum SWIGTYPE INPUT[ANY]; // inout variable arrays %typemap(in) (enum SWIGTYPE *INOUT,int)=(enum SWIGTYPE *INPUT,int); %typemap(argout) (enum SWIGTYPE *INOUT,int) %{ SWIG_write_int_num_array(L,(int*)$1,$2); SWIG_arg++; %} %typemap(freearg) (enum SWIGTYPE *INOUT,int)=(enum SWIGTYPE *INPUT,int); /* Surprisingly pointer arrays are easier: this is because all ptr arrays become void** so only a few fns are needed & a few casts The function defined are // created a fixed size array, reads the specified table // and then fills the array with pointers (checking the type) // returns ptr to the array if ok, or 0 for error // (also pushes a error message to the stack) void** SWIG_get_ptr_array_fixed(lua_State* L, int index, int size,swig_type_info *type); // as per SWIG_get_ptr_array_fixed() // but reads the entire table & creates an array of the correct size // (if the table is empty, it returns an error rather than a zero length array) void** SWIG_get_ptr_array_var(lua_State* L, int index, int* size,swig_type_info *type); // writes a table to Lua with all the specified pointers // all pointers have the ownership value 'own' (normally 0) void SWIG_write_ptr_array(lua_State* L,void **array,int size,int own); // read the specified table, and fills the array with ptrs // returns 1 of ok (only fails if it doesn't find correct type of ptrs) // helper fn (called by SWIG_get_ptr_array_*() fns) int SWIG_read_ptr_array(lua_State* L,int index,void **array,int size,swig_type_info *type); The key thing to remember is that it is assumed that there is no modification of pointers ownership in the arrays eg A fn: void pointers_in(TYPE* arr[],int len); will make copies of the pointer into a temp array and then pass it into the fn Lua does not remember that this fn held the pointers, so it is not safe to keep these pointers until later eg A fn: void pointers_out(TYPE* arr[3]); will return a table containing three pointers however these pointers are NOT owned by Lua, merely borrowed so if the C/C++ frees then Lua is not aware */ %{ SWIGINTERN int SWIG_read_ptr_array(lua_State* L,int index,void **array,int size,swig_type_info *type){ int i; for (i = 0; i < size; i++) { lua_rawgeti(L,index,i+1); if (!lua_isuserdata(L,-1) || SWIG_ConvertPtr(L,-1,&array[i],type,0)==-1){ lua_pop(L,1); return 0; } lua_pop(L,1); } return 1; } SWIGINTERN void** SWIG_get_ptr_array_fixed(lua_State* L, int index, int size,swig_type_info *type){ void **array; if (!lua_istable(L,index) || SWIG_itable_size(L,index) != size) { SWIG_Lua_pushferrstring(L,"expected a table of size %d",size); return 0; } array=SWIG_ALLOC_ARRAY(void*,size); if (!SWIG_read_ptr_array(L,index,array,size,type)){ SWIG_Lua_pushferrstring(L,"table must contain pointers of type %s",type->name); SWIG_FREE_ARRAY(array); return 0; } return array; } SWIGINTERN void** SWIG_get_ptr_array_var(lua_State* L, int index, int* size,swig_type_info *type){ void **array; if (!lua_istable(L,index)) { SWIG_Lua_pusherrstring(L,"expected a table"); return 0; } *size=SWIG_itable_size(L,index); if (*size<1){ SWIG_Lua_pusherrstring(L,"table appears to be empty"); return 0; } array=SWIG_ALLOC_ARRAY(void*,*size); if (!SWIG_read_ptr_array(L,index,array,*size,type)){ SWIG_Lua_pushferrstring(L,"table must contain pointers of type %s",type->name); SWIG_FREE_ARRAY(array); return 0; } return array; } SWIGINTERN void SWIG_write_ptr_array(lua_State* L,void **array,int size,swig_type_info *type,int own){ int i; lua_newtable(L); for (i = 0; i < size; i++){ SWIG_NewPointerObj(L,array[i],type,own); lua_rawseti(L,-2,i+1);/* -1 is the number, -2 is the table*/ } } %} // fixed size array's %typemap(in) SWIGTYPE* INPUT[ANY] %{ $1 = ($ltype)SWIG_get_ptr_array_fixed(L,$input,$1_dim0,$*1_descriptor); if (!$1) SWIG_fail;%} %typemap(freearg) SWIGTYPE* INPUT[ANY] %{ SWIG_FREE_ARRAY($1);%} // variable size array's %typemap(in) (SWIGTYPE **INPUT,int) %{ $1 = ($ltype)SWIG_get_ptr_array_var(L,$input,&$2,$*1_descriptor); if (!$1) SWIG_fail;%} %typemap(freearg) (SWIGTYPE **INPUT,int) %{ SWIG_FREE_ARRAY($1);%} // out fixed arrays %typemap(in,numinputs=0) SWIGTYPE* OUTPUT[ANY] %{ $1 = SWIG_ALLOC_ARRAY($*1_type,$1_dim0); %} %typemap(argout) SWIGTYPE* OUTPUT[ANY] %{ SWIG_write_ptr_array(L,(void**)$1,$1_dim0,$*1_descriptor,0); SWIG_arg++; %} %typemap(freearg) SWIGTYPE* OUTPUT[ANY] %{ SWIG_FREE_ARRAY($1); %} // inout fixed arrays %typemap(in) SWIGTYPE* INOUT[ANY]=SWIGTYPE* INPUT[ANY]; %typemap(argout) SWIGTYPE* INOUT[ANY]=SWIGTYPE* OUTPUT[ANY]; %typemap(freearg) SWIGTYPE* INOUT[ANY]=SWIGTYPE* INPUT[ANY]; // inout variable arrays %typemap(in) (SWIGTYPE** INOUT,int)=(SWIGTYPE** INPUT,int); %typemap(argout) (SWIGTYPE** INOUT,int) %{ SWIG_write_ptr_array(L,(void**)$1,$2,$*1_descriptor,0); SWIG_arg++; %} %typemap(freearg) (SWIGTYPE**INOUT,int)=(SWIGTYPE**INPUT,int); /* ----------------------------------------------------------------------------- * Pointer-Pointer typemaps * ----------------------------------------------------------------------------- */ /* This code is to deal with the issue for pointer-pointer's In particular for factory methods. for example take the following code segment: struct iMath; // some structure int Create_Math(iMath** pptr); // its factory (assume it mallocs) to use it you might have the following C code: iMath* ptr; int ok; ok=Create_Math(&ptr); // do things with ptr //... free(ptr); With the following SWIG code %apply SWIGTYPE** OUTPUT{iMath **pptr }; You can get natural wrapping in Lua as follows: ok,ptr=Create_Math() -- ptr is a iMath* which is returned with the int ptr=nil -- the iMath* will be GC'ed as normal */ %typemap(in,numinputs=0) SWIGTYPE** OUTPUT ($*ltype temp) %{ temp = ($*ltype)0; $1 = &temp; %} %typemap(argout) SWIGTYPE** OUTPUT %{SWIG_NewPointerObj(L,*$1,$*descriptor,1); SWIG_arg++; %} swig-4.0.2/Lib/lua/carrays.i0000644000175000017500000000040013667507523015461 0ustar williamwilliam/* Small change to the standard carrays.i renaming the field to __getitem & __setitem for operator[] access */ %rename(__getitem) *::getitem; // the v=X[i] (get operator) %rename(__setitem) *::setitem; // the X[i]=v (set operator) %include <../carrays.i> swig-4.0.2/Lib/lua/_std_common.i0000644000175000017500000000477213667507523016336 0ustar williamwilliam/* ----------------------------------------------------------------------------- * _std_common.i * * std::helpers for LUA * ----------------------------------------------------------------------------- */ %include // the general exceptions /* The basic idea here, is instead of trying to feed SWIG all the horribly templated STL code, to give it a neatened version. These %defines cover some of the more common methods so the class declarations become just a set of %defines */ /* #define for basic container features note: I allow front(), back() & pop_back() to throw exceptions upon empty containers, rather than coredump (as we haven't defined the methods, we can use %extend to add with new features) */ %define %STD_CONTAINER_METHODS(CLASS,T) public: CLASS(); CLASS(const CLASS&); unsigned int size() const; unsigned int max_size() const; bool empty() const; void clear(); %extend { // the extra stuff which must be checked T front()const throw (std::out_of_range){ // only read front & back if (self->empty()) throw std::out_of_range("in "#CLASS"::front()"); return self->front(); } T back()const throw (std::out_of_range){ // not write to them if (self->empty()) throw std::out_of_range("in "#CLASS"::back()"); return self->back(); } } %enddef /* push/pop for front/back also note: front & back are read only methods, not used for writing */ %define %STD_FRONT_ACCESS_METHODS(CLASS,T) public: void push_front(const T& val); %extend { // must check this void pop_front() throw (std::out_of_range){ if (self->empty()) throw std::out_of_range("in "#CLASS"::pop_front()"); self->pop_back(); } } %enddef %define %STD_BACK_ACCESS_METHODS(CLASS,T) public: void push_back(const T& val); %extend { // must check this void pop_back() throw (std::out_of_range){ if (self->empty()) throw std::out_of_range("in "#CLASS"::pop_back()"); self->pop_back(); } } %enddef /* Random access methods */ %define %STD_RANDOM_ACCESS_METHODS(CLASS,T) %extend // this is a extra bit of SWIG code { // [] is replaced by __getitem__ & __setitem__ // simply throws a string, which causes a lua error T __getitem__(unsigned int idx) throw (std::out_of_range){ if (idx>=self->size()) throw std::out_of_range("in "#CLASS"::__getitem__()"); return (*self)[idx]; } void __setitem__(unsigned int idx,const T& val) throw (std::out_of_range){ if (idx>=self->size()) throw std::out_of_range("in "#CLASS"::__setitem__()"); (*self)[idx]=val; } }; %enddef swig-4.0.2/Lib/lua/std_pair.i0000644000175000017500000000104313667507523015626 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * std::pair typemaps for LUA * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); T first; U second; }; template pair make_pair(const T& first, const U& second); } swig-4.0.2/Lib/lua/stl.i0000644000175000017500000000044313667507523014626 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/lua/lua.swg0000644000175000017500000002133213667507523015155 0ustar williamwilliam/* ----------------------------------------------------------------------------- * lua.swg * * SWIG Configuration File for Lua. * This file is parsed by SWIG before reading any other interface file. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * includes * ----------------------------------------------------------------------------- */ %include /* The typemaps */ %include /* The runtime stuff */ %include /* Warnings for Lua keywords */ //%include /* ----------------------------------------------------------------------------- * constants typemaps * ----------------------------------------------------------------------------- */ // this basically adds to a table of constants %typemap(consttab) int, unsigned int, short, unsigned short, long, unsigned long, unsigned char, signed char, bool, enum SWIGTYPE {SWIG_LUA_CONSTTAB_INT("$symname", $value)} %typemap(consttab) float, double {SWIG_LUA_CONSTTAB_FLOAT("$symname", $value)} %typemap(consttab) long long, unsigned long long, signed long long {SWIG_LUA_CONSTTAB_FLOAT("$symname", $value)} %typemap(consttab) const long long&, const unsigned long long&, const signed long long& {SWIG_LUA_CONSTTAB_FLOAT("$symname", *$value)} %typemap(consttab) char *, const char *, char [], const char [] {SWIG_LUA_CONSTTAB_STRING("$symname", $value)} // note: char is treated as a separate special type // signed char & unsigned char are numbers %typemap(consttab) char {SWIG_LUA_CONSTTAB_CHAR("$symname", $value)} %typemap(consttab) long long, unsigned long long {SWIG_LUA_CONSTTAB_STRING("$symname", "$value")} %typemap(consttab) SWIGTYPE *, SWIGTYPE *const, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { SWIG_LUA_CONSTTAB_POINTER("$symname",$value, $1_descriptor) } %typemap(consttab) SWIGTYPE { SWIG_LUA_CONSTTAB_POINTER("$symname",&$value, $&1_descriptor) } // member function pointers %typemap(consttab) SWIGTYPE (CLASS::*) { SWIG_LUA_CONSTTAB_BINARY("$symname", sizeof($type),&$value, $1_descriptor) } /* ----------------------------------------------------------------------------- * Overloaded operator support * ----------------------------------------------------------------------------- */ // lua calls the + operator '__add' // python likes to call it '__add__' // Assuming most SWIGers will probably use the __add__ if they extend their classes // we have two sets of renames // one to rename the operator+() to __add() // (this lets SWIG rename the operator overloads) // another is to rename __add__() to __add() // (this means that people who wrote SWIG code to do that add will also work) #ifdef __cplusplus // this is extra renaming for lua // not all operators are supported, so only those that are, are listed %rename(__add) *::operator+; %rename(__sub) *::operator-; %rename(__mul) *::operator*; %rename(__div) *::operator/; %rename(__unm) *::operator-(); %rename(__unm) *::operator-() const; %rename(__eq) *::operator==; %ignore *::operator!=; // note: Lua does not have a notequal operator // it just uses 'not (a==b)' %rename(__lt) *::operator<; %ignore *::operator>; // ditto less than vs greater than %rename(__le) *::operator<=; %ignore *::operator>=; // ditto less than vs greater than %ignore *::operator!; // does not support not %rename(__call) *::operator(); // the fn call operator // lua does not support overloading of: // logical/bitwise operators // assign operator // +=,-=,*=, etc // therefore ignoring them for now // it also doesn't support non class operators // eg friends or XX operator+(XX,XX) // also ignoring // note: some of these might be better to rename, but not doing that for now %ignore *::operator&&; %ignore operator&&; %ignore *::operator||; %ignore operator||; %ignore *::operator+=; %ignore *::operator-=; %ignore *::operator*=; %ignore *::operator/=; %ignore *::operator%=; %ignore *::operator++; %ignore *::operator--; %ignore *::operator=; // note: this might be better to rename to assign() or similar %ignore operator+; %ignore operator-; %ignore operator*; %ignore operator/; %ignore operator%; %ignore operator[]; %ignore operator>; %ignore operator>=; %ignore operator<; %ignore operator<=; %ignore operator==; %ignore operator!=; // renaming the python operators to be compatible with lua // this means that if a developer has written a fn __add__() // it will be used for the lua + %rename(__add) *::__add__; %rename(__sub) *::__sub__; %rename(__mul) *::__mul__; %rename(__div) *::__div__; %rename(__unm) *::__neg__; // lua calls unary minus,'unm' not 'neg' %rename(__tostring) *::__str__; // both map to __tostring %rename(__tostring) *::__repr__; // both map to __tostring %rename(__pow) *::__pow__; // lua power '^' operator %rename(__concat) *::__concat__; // lua concat '..' operator %rename(__eq) *::__eq__; %rename(__lt) *::__lt__; %rename(__le) *::__le__; %rename(__call) *::__call__; // the fn call operator() // the [] operator has two parts, the get & the set %rename(__getitem) *::__getitem__; // the v=X[i] (get operator) %rename(__setitem) *::__setitem__; // the X[i]=v (set operator) #endif /* ------------------------------------------------------------ * Exceptions * ------------------------------------------------------------ */ /* Confession: I don't really like C++ exceptions The python/lua ones are great, but C++ ones I don't like (mainly because I cannot get the stack trace out of it) Therefore I have not bothered to try doing much in this Therefore currently its just enough to get a few test cases running ok note: if you wish to throw anything related to std::exception use %include instead */ // number as number+error %typemap(throws) int,unsigned int,signed int, long,unsigned long,signed long, short,unsigned short,signed short, float,double, long long,unsigned long long, unsigned char, signed char, int&,unsigned int&,signed int&, long&,unsigned long&,signed long&, short&,unsigned short&,signed short&, float&,double&, long long&,unsigned long long&, unsigned char&, signed char& %{lua_pushnumber(L,(lua_Number)$1);SWIG_fail; %} %typemap(throws) bool,bool& %{lua_pushboolean(L,(int)($1==true));SWIG_fail; %} // enum as number+error %typemap(throws) enum SWIGTYPE %{lua_pushnumber(L,(lua_Number)(int)$1);SWIG_fail; %} // strings are just sent as errors %typemap(throws) char *, const char * %{lua_pushstring(L,$1);SWIG_fail;%} // char is changed to a string %typemap(throws) char %{lua_pushlstring(L,&$1,1);SWIG_fail;%} /* Throwing object is a serious problem: Assuming some code throws a 'FooBar' There are a few options: - return a pointer to it: but its unclear how long this will last for. - return a copy of it: but not all objects are copyable (see exception_partial_info in the test suite for a case where you cannot do this) - convert to a string & throw that it's not so useful, but it works (this is more lua like). The third option (though not nice) is used For a more useful solution: see std_except for more details */ // basic typemap for structs, classes, pointers & references // convert to string and error %typemap(throws) SWIGTYPE %{(void)$1; /* ignore it */ lua_pushfstring(L,"object exception:%s",SWIG_TypePrettyName($1_descriptor)); SWIG_fail;%} // code to make a copy of the object and return this // if you have a function which throws a FooBar & you want SWIG to return a copy of the object as its error // then use one of the below // %apply SWIGTYPE EXCEPTION_BY_VAL {FooBar}; // %apply SWIGTYPE& EXCEPTION_BY_VAL {FooBar&}; // note: need & twice %typemap(throws) SWIGTYPE EXCEPTION_BY_VAL %{SWIG_NewPointerObj(L,(void *)new $1_ltype(($1_ltype &) $1),$&1_descriptor,1); SWIG_fail;%} // similar for object reference // note: swig typemaps seem a little confused around here, therefore we use $basetype %typemap(throws) SWIGTYPE& EXCEPTION_BY_VAL %{SWIG_NewPointerObj(L,(void *)new $basetype($1),$1_descriptor,1); SWIG_fail;%} // note: no support for object pointers // its not clear how long the pointer is valid for, therefore not supporting it /* ----------------------------------------------------------------------------- * extras * ----------------------------------------------------------------------------- */ // this %define is to allow insertion of lua source code into the wrapper file #define %luacode %insert("luacode") /* ------------------------------ end lua.swg ------------------------------ */ swig-4.0.2/Lib/lua/std_string.i0000644000175000017500000000622413667507523016207 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * std::string typemaps for LUA * ----------------------------------------------------------------------------- */ %{ #include %} /* Only std::string and const std::string& are typemapped they are converted to the Lua strings automatically std::string& and std::string* are not they must be explicitly managed (see below) eg. std::string test_value(std::string x) { return x; } can be used as s="hello world" s2=test_value(s) assert(s==s2) */ namespace std { %naturalvar string; /* Bug report #1526022: Lua strings and std::string can contain embedded zero bytes Therefore a standard out typemap should not be: lua_pushstring(L,$1.c_str()); but lua_pushlstring(L,$1.data(),$1.size()); Similarly for getting the string $1 = (char*)lua_tostring(L, $input); becomes $1.assign(lua_tostring(L,$input),lua_rawlen(L,$input)); Not using: lua_tolstring() as this is only found in Lua 5.1 & not 5.0.2 */ %typemap(in,checkfn="lua_isstring") string %{$1.assign(lua_tostring(L,$input),lua_rawlen(L,$input));%} %typemap(out) string %{ lua_pushlstring(L,$1.data(),$1.size()); SWIG_arg++;%} %typemap(in,checkfn="lua_isstring") const string& ($*1_ltype temp) %{temp.assign(lua_tostring(L,$input),lua_rawlen(L,$input)); $1=&temp;%} %typemap(out) const string& %{ lua_pushlstring(L,$1->data(),$1->size()); SWIG_arg++;%} // for throwing of any kind of string, string ref's and string pointers // we convert all to lua strings %typemap(throws) string, string&, const string& %{ lua_pushlstring(L,$1.data(),$1.size()); SWIG_fail;%} %typemap(throws) string*, const string* %{ lua_pushlstring(L,$1->data(),$1->size()); SWIG_fail;%} %typecheck(SWIG_TYPECHECK_STRING) string, const string& { $1 = lua_isstring(L,$input); } /* std::string& can be wrapped, but you must inform SWIG if it is in or out eg: void fn(std::string& str); Is this an in/out/inout value? Therefore you need the usual %apply (std::string& INOUT) {std::string& str}; or %apply std::string& INOUT {std::string& str}; typemaps to tell SWIG what to do. */ %typemap(in) string &INPUT=const string &; %typemap(in, numinputs=0) string &OUTPUT ($*1_ltype temp) %{ $1 = &temp; %} %typemap(argout) string &OUTPUT %{ lua_pushlstring(L,$1->data(),$1->size()); SWIG_arg++;%} %typemap(in) string &INOUT =const string &; %typemap(argout) string &INOUT = string &OUTPUT; /* A really cut down version of the string class This provides basic mapping of lua strings <-> std::string and little else (the std::string has a lot of unneeded functions anyway) note: no fn's taking the const string& as this is overloaded by the const char* version */ class string { public: string(); string(const char*); unsigned int size() const; unsigned int length() const; bool empty() const; // no support for operator[] const char* c_str()const; const char* data()const; // assign does not return a copy of this object // (no point in a scripting language) void assign(const char*); // no support for all the other features // it's probably better to do it in lua }; } swig-4.0.2/Lib/lua/luatypemaps.swg0000644000175000017500000003406013667507523016742 0ustar williamwilliam/* ----------------------------------------------------------------------------- * luatypemaps.swg * * basic typemaps for Lua. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * standard typemaps * ----------------------------------------------------------------------------- */ /* NEW LANGUAGE NOTE: the 'checkfn' param is something that I added for typemap(in) it is an optional fn call to check the type of the lua object the fn call must be of the form int checkfn(lua_State *L, int index); and return 1/0 depending upon if this is the correct type For the typemap(out), an additional SWIG_arg parameter must be incremented to reflect the number of values returned (normally SWIG_arg++; will do) */ // numbers %typemap(in,checkfn="lua_isnumber") int, short, long, signed char, float, double %{$1 = ($type)lua_tonumber(L, $input);%} // additional check for unsigned numbers, to not permit negative input %typemap(in,checkfn="lua_isnumber") unsigned int, unsigned short, unsigned long, unsigned char %{SWIG_contract_assert((lua_tonumber(L,$input)>=0),"number must not be negative") $1 = ($type)lua_tonumber(L, $input);%} %typemap(out) int,short,long, unsigned int,unsigned short,unsigned long, signed char,unsigned char, float,double %{ lua_pushnumber(L, (lua_Number) $1); SWIG_arg++;%} // we must also provide typemaps for primitives by const reference: // given a function: // int intbyref(const int& i); // SWIG assumes that this code will need a pointer to int to be passed in // (this might be ok for objects by const ref, but not for numeric primitives) // therefore we add a set of typemaps to fix this (for both in & out) %typemap(in,checkfn="lua_isnumber") const int&($basetype temp) %{ temp=($basetype)lua_tonumber(L,$input); $1=&temp;%} %typemap(in,checkfn="lua_isnumber") const unsigned int&($basetype temp) %{SWIG_contract_assert((lua_tonumber(L,$input)>=0),"number must not be negative") temp=($basetype)lua_tonumber(L,$input); $1=&temp;%} %typemap(out) const int&, const unsigned int& %{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%} // for the other numbers we can just use an apply statement to cover them %apply const int & {const short&,const long&,const signed char&, const float&,const double&}; %apply const unsigned int & {const unsigned short&,const unsigned long&, const unsigned char&}; /* enums have to be handled slightly differently VC++ .net will not allow a cast from lua_Number(double) to enum directly. */ %typemap(in,checkfn="lua_isnumber") enum SWIGTYPE %{$1 = ($type)(int)lua_tonumber(L, $input);%} %typemap(out) enum SWIGTYPE %{ lua_pushnumber(L, (lua_Number)(int)($1)); SWIG_arg++;%} // and const refs %typemap(in,checkfn="lua_isnumber") const enum SWIGTYPE &($basetype temp) %{ temp=($basetype)(int)lua_tonumber(L,$input); $1=&temp;%} %typemap(in,checkfn="lua_isnumber") const enum SWIGTYPE &&($basetype temp) %{ temp=($basetype)(int)lua_tonumber(L,$input); $1=&temp;%} %typemap(out) const enum SWIGTYPE & %{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%} %typemap(out) const enum SWIGTYPE && %{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%} // boolean (which is a special type in lua) // note: lua_toboolean() returns 1 or 0 // note: 1 & 0 are not booleans in lua, only true & false %typemap(in,checkfn="lua_isboolean") bool %{$1 = (lua_toboolean(L, $input)!=0);%} %typemap(out) bool %{ lua_pushboolean(L,(int)($1!=0)); SWIG_arg++;%} // for const bool&, SWIG treats this as a const bool* so we must dereference it %typemap(in,checkfn="lua_isboolean") const bool& (bool temp) %{temp=(lua_toboolean(L, $input)!=0); $1=&temp;%} %typemap(out) const bool& %{ lua_pushboolean(L,(int)((*$1)!=0)); SWIG_arg++;%} // strings (char * and char[]) %fragment("SWIG_lua_isnilstring", "header") { SWIGINTERN int SWIG_lua_isnilstring(lua_State *L, int idx) { int ret = lua_isstring(L, idx); if (!ret) ret = lua_isnil(L, idx); return ret; } } %typemap(in,checkfn="SWIG_lua_isnilstring",fragment="SWIG_lua_isnilstring") const char *, char * %{$1 = ($ltype)lua_tostring(L, $input);%} %typemap(in,checkfn="SWIG_lua_isnilstring",fragment="SWIG_lua_isnilstring") const char[ANY], char[ANY] %{$1 = ($ltype)lua_tostring(L, $input);%} %typemap(out) const char *, char * %{ lua_pushstring(L,(const char *)$1); SWIG_arg++;%} %typemap(out) const char[ANY], char[ANY] %{ lua_pushstring(L,(const char *)$1); SWIG_arg++;%} // char's // currently treating chars as small strings, not as numbers // (however signed & unsigned char's are numbers...) %typemap(in,checkfn="SWIG_lua_isnilstring",fragment="SWIG_lua_isnilstring") char %{$1 = (lua_tostring(L, $input))[0];%} %typemap(out) char %{ lua_pushlstring(L, &$1, 1); SWIG_arg++;%} // by const ref %typemap(in,checkfn="SWIG_lua_isnilstring",fragment="SWIG_lua_isnilstring") const char& (char temp) %{temp = (lua_tostring(L, $input))[0]; $1=&temp;%} %typemap(out) const char& %{ lua_pushlstring(L, $1, 1); SWIG_arg++;%} // pointers and references // under SWIG rules, it is ok, to have a pass in a lua nil, // it should be converted to a SWIG NULL. // This will only be allowed for pointers & arrays, not refs or by value // the checkfn lua_isuserdata will only work for userdata // the checkfn SWIG_isptrtype will work for both userdata and nil %typemap(in,checkfn="SWIG_isptrtype") SWIGTYPE*,SWIGTYPE[] %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&$1,$descriptor,$disown))){ SWIG_fail_ptr("$symname",$argnum,$descriptor); } %} %typemap(in,checkfn="lua_isuserdata") SWIGTYPE& %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&$1,$descriptor,$disown))){ SWIG_fail_ptr("$symname",$argnum,$descriptor); } %} %typemap(in,checkfn="lua_isuserdata") SWIGTYPE&& %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&$1,$descriptor,$disown))){ SWIG_fail_ptr("$symname",$argnum,$descriptor); } %} // out is simple %typemap(out) SWIGTYPE*,SWIGTYPE& %{SWIG_NewPointerObj(L,$1,$descriptor,$owner); SWIG_arg++; %} %typemap(out) SWIGTYPE*,SWIGTYPE&& %{SWIG_NewPointerObj(L,$1,$descriptor,$owner); SWIG_arg++; %} // dynamic casts // this uses the SWIG_TypeDynamicCast() which relies on RTTI to find out what the pointer really is // the we return it as the correct type %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1); SWIG_NewPointerObj(L,(void*)$1,ty,$owner); SWIG_arg++; } // passing objects by value // SWIG_ConvertPtr wants an object pointer (the $<ype argp) // then dereferences it to get the object %typemap(in,checkfn="lua_isuserdata") SWIGTYPE ($<ype argp) %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&argp,$&descriptor,0))){ SWIG_fail_ptr("$symname",$argnum,$&descriptor); } $1 = *argp; %} // Also needed for object ptrs by const ref // eg A* const& ref_pointer(A* const& a); // found in mixed_types.i %typemap(in,checkfn="SWIG_isptrtype") SWIGTYPE *const&($*ltype temp) %{temp=($*ltype)SWIG_MustGetPtr(L,$input,$*descriptor,0,$argnum,"$symname"); $1=($1_ltype)&temp;%} %typemap(out) SWIGTYPE *const& %{SWIG_NewPointerObj(L,*$1,$*descriptor,$owner); SWIG_arg++; %} // DISOWN-ing typemaps // if you have an object pointer which must be disowned, use this typemap // eg. for void destroy_foo(Foo* toDie); // use %apply SWIGTYPE* DISOWN {Foo* toDie}; // you could just use %delobject, but this is more flexible %typemap(in,checkfn="SWIG_isptrtype") SWIGTYPE* DISOWN,SWIGTYPE DISOWN[] %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&$1,$descriptor,SWIG_POINTER_DISOWN))){ SWIG_fail_ptr("$symname",$argnum,$descriptor); } %} // Primitive types--return by value // must make a new object, copy the data & return the new object // Note: the brackets are {...} and not %{..%}, because we want them to be included in the wrapper // this is because typemap(out) does not support local variables, like in typemap(in) does // and we need the $&1_ltype resultptr; to be declared #ifdef __cplusplus %typemap(out) SWIGTYPE { $&1_ltype resultptr = new $1_ltype((const $1_ltype &) $1); SWIG_NewPointerObj(L,(void *) resultptr,$&1_descriptor,1); SWIG_arg++; } #else %typemap(out) SWIGTYPE { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); SWIG_NewPointerObj(L,(void *) resultptr,$&1_descriptor,1); SWIG_arg++; } #endif // member function pointer // a member fn ptr is not 4 bytes like a normal pointer, but 8 bytes (at least on mingw) // so the standard wrapping cannot be done // nor can you cast a member function pointer to a void* (obviously) // therefore a special wrapping functions SWIG_ConvertMember() & SWIG_NewMemberObj() were written %typemap(in,checkfn="lua_isuserdata") SWIGTYPE (CLASS::*) %{ if (!SWIG_IsOK(SWIG_ConvertMember(L,$input,(void*)(&$1),sizeof($type),$descriptor))) SWIG_fail_ptr("$symname",$argnum,$descriptor); %} %typemap(out) SWIGTYPE (CLASS::*) %{ SWIG_NewMemberObj(L,(void*)(&$1),sizeof($type),$descriptor); SWIG_arg++; %} // void (must be empty without the SWIG_arg++) %typemap(out) void ""; /* void* is a special case A function void fn(void*) should take any kind of pointer as a parameter (just like C/C++ does) but if its an output, then it should be wrapped like any other SWIG object (using default typemap) */ %typemap(in,checkfn="SWIG_isptrtype") void* %{$1=($1_ltype)SWIG_MustGetPtr(L,$input,0,0,$argnum,"$symname");%} /* long long is another special case: as lua only supports one numeric type (lua_Number), we will just cast it to that & accept the loss of precision. An alternative solution would be a long long struct or class with the relevant operators. */ %apply long {long long, signed long long, unsigned long long}; %apply const long& {const long long&, const signed long long&, const unsigned long long&}; /* It is possible to also pass a lua_State* into a function, so void fn(int a, float b, lua_State* s) is wrappable as > fn(1,4.3) -- note: the state is implicitly passed in */ %typemap(in, numinputs=0) lua_State* %{$1 = L;%} /* ----------------------------------------------------------------------------- * typecheck rules * ----------------------------------------------------------------------------- */ /* These are needed for the overloaded functions These define the detection routines which will spot what parameters match which function */ // unfortunately lua only considers one type of number // so all numbers (int,float,double) match // you could add an advanced fn to get type & check if its integral %typecheck(SWIG_TYPECHECK_INTEGER) int, short, long, unsigned int, unsigned short, unsigned long, signed char, unsigned char, long long, unsigned long long, signed long long, const int &, const short &, const long &, const unsigned int &, const unsigned short &, const unsigned long &, const signed char&, const unsigned char&, const long long &, const unsigned long long &, enum SWIGTYPE, const enum SWIGTYPE&, const enum SWIGTYPE &&, float, double, const float &, const double& { $1 = lua_isnumber(L,$input); } %typecheck(SWIG_TYPECHECK_BOOL) bool, const bool & { $1 = lua_isboolean(L,$input); } // special check for a char (string of length 1) %typecheck(SWIG_TYPECHECK_CHAR,fragment="SWIG_lua_isnilstring") char, const char& { $1 = SWIG_lua_isnilstring(L,$input) && (lua_rawlen(L,$input)==1); } %typecheck(SWIG_TYPECHECK_STRING,fragment="SWIG_lua_isnilstring") char *, char[] { $1 = SWIG_lua_isnilstring(L,$input); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [] { void *ptr; if (SWIG_isptrtype(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $1_descriptor, 0)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE & { void *ptr; if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $1_descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE && { void *ptr; if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $1_descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $&1_descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; if (SWIG_isptrtype(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, 0, 0)) { $1 = 0; } else { $1 = 1; } } // Also needed for object pointers by const ref // eg const A* ref_pointer(A* const& a); // found in mixed_types.i %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *const& { void *ptr; if (SWIG_isptrtype(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $*descriptor, 0)) { $1 = 0; } else { $1 = 1; } } /* ----------------------------------------------------------------------------- * Others * ----------------------------------------------------------------------------- */ // Array reference typemaps %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } // size_t (which is just a unsigned long) %apply unsigned long { size_t }; %apply const unsigned long & { const size_t & }; /* ----------------------------------------------------------------------------- * Specials * ----------------------------------------------------------------------------- */ // swig::LANGUAGE_OBJ was added to allow containers of native objects // however its rather difficult to do this in lua, as you cannot hold pointers // to native objects (they are held in the interpreter) // therefore for now: just ignoring this feature #ifdef __cplusplus %ignore swig::LANGUAGE_OBJ; //%inline %{ %{ namespace swig { typedef struct{} LANGUAGE_OBJ; } %} #endif // __cplusplus swig-4.0.2/Lib/lua/std_map.i0000644000175000017500000000374713667507523015465 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; } swig-4.0.2/Lib/lua/factory.i0000644000175000017500000000100713667507523015470 0ustar williamwilliam/* A modification of factory.swg from the generic UTL library. */ %include %define %_factory_dispatch(Type) if (!dcast) { Type *dobj = dynamic_cast($1); if (dobj) { dcast = 1; SWIG_NewPointerObj(L, dobj, $descriptor(Type *), $owner); SWIG_arg++; } }%enddef %define %factory(Method,Types...) %typemap(out) Method { int dcast = 0; %formacro(%_factory_dispatch, Types) if (!dcast) { SWIG_NewPointerObj(L, $1, $descriptor, $owner); SWIG_arg++; } }%enddef swig-4.0.2/Lib/csharp/0000755000175000017500000000000013667507523014350 5ustar williamwilliamswig-4.0.2/Lib/csharp/std_complex.i0000644000175000017500000000525013667507523017045 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_complex.i * * Typemaps for handling std::complex and std::complex as a .NET * System.Numerics.Complex type. Requires .NET 4 minimum. * ----------------------------------------------------------------------------- */ %{ #include %} %fragment("SwigSystemNumericsComplex", "header") { extern "C" { // Identical to the layout of System.Numerics.Complex, but does assume that it is // LayoutKind.Sequential on the managed side struct SwigSystemNumericsComplex { double real; double imag; }; } SWIGINTERN SwigSystemNumericsComplex SwigCreateSystemNumericsComplex(double real, double imag) { SwigSystemNumericsComplex cpx; cpx.real = real; cpx.imag = imag; return cpx; } } namespace std { %naturalvar complex; template class complex { public: complex(T re = T(), T im = T()); }; } %define SWIG_COMPLEX_TYPEMAPS(T) %typemap(ctype, fragment="SwigSystemNumericsComplex") std::complex, const std::complex & "SwigSystemNumericsComplex" %typemap(imtype) std::complex, const std::complex & "System.Numerics.Complex" %typemap(cstype) std::complex, const std::complex & "System.Numerics.Complex" %typemap(in) std::complex %{$1 = std::complex< double >($input.real, $input.imag);%} %typemap(in) const std::complex &($*1_ltype temp) %{temp = std::complex< T >((T)$input.real, (T)$input.imag); $1 = &temp;%} %typemap(out, null="SwigCreateSystemNumericsComplex(0.0, 0.0)") std::complex %{$result = SwigCreateSystemNumericsComplex($1.real(), $1.imag());%} %typemap(out, null="SwigCreateSystemNumericsComplex(0.0, 0.0)") const std::complex & %{$result = SwigCreateSystemNumericsComplex($1->real(), $1->imag());%} %typemap(cstype) std::complex, const std::complex & "System.Numerics.Complex" %typemap(csin) std::complex, const std::complex & "$csinput" %typemap(csout, excode=SWIGEXCODE) std::complex, const std::complex & { System.Numerics.Complex ret = $imcall;$excode return ret; } %typemap(csvarin, excode=SWIGEXCODE2) const std::complex & %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) const std::complex & %{ get { System.Numerics.Complex ret = $imcall;$excode return ret; } %} %template() std::complex; %enddef // By default, typemaps for both std::complex and std::complex // are defined, but one of them can be disabled by predefining the // corresponding symbol before including this file. #ifndef SWIG_NO_STD_COMPLEX_DOUBLE SWIG_COMPLEX_TYPEMAPS(double) #endif #ifndef SWIG_NO_STD_COMPLEX_FLOAT SWIG_COMPLEX_TYPEMAPS(float) #endif swig-4.0.2/Lib/csharp/std_deque.i0000644000175000017500000000003413667507523016474 0ustar williamwilliam%include swig-4.0.2/Lib/csharp/director.swg0000644000175000017500000000236013667507523016706 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that C# proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #if defined(DEBUG_DIRECTOR_OWNED) #include #endif #include #include namespace Swig { /* Director base class - not currently used in C# directors */ class Director { }; /* Base class for director exceptions */ class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(const char *msg) : swig_msg(msg) { } DirectorException(const std::string &msg) : swig_msg(msg) { } virtual ~DirectorException() throw() { } const char *what() const throw() { return swig_msg.c_str(); } }; /* Pure virtual method exception */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg) : DirectorException(std::string("Attempt to invoke pure virtual method ") + msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; } swig-4.0.2/Lib/csharp/wchar.i0000644000175000017500000000705113667507523015631 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wchar.i * * Typemaps for the wchar_t type * These are mapped to a C# String and are passed around by value. * * Support code for wide strings can be turned off by defining SWIG_CSHARP_NO_WSTRING_HELPER * * ----------------------------------------------------------------------------- */ #if !defined(SWIG_CSHARP_NO_WSTRING_HELPER) #if !defined(SWIG_CSHARP_WSTRING_HELPER_) #define SWIG_CSHARP_WSTRING_HELPER_ %insert(runtime) %{ /* Callback for returning strings to C# without leaking memory */ typedef void * (SWIGSTDCALL* SWIG_CSharpWStringHelperCallback)(const wchar_t *); static SWIG_CSharpWStringHelperCallback SWIG_csharp_wstring_callback = NULL; %} %pragma(csharp) imclasscode=%{ protected class SWIGWStringHelper { [return: global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)] public delegate string SWIGWStringDelegate(global::System.IntPtr message); static SWIGWStringDelegate wstringDelegate = new SWIGWStringDelegate(CreateWString); [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="SWIGRegisterWStringCallback_$module")] public static extern void SWIGRegisterWStringCallback_$module(SWIGWStringDelegate wstringDelegate); static string CreateWString([global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]global::System.IntPtr cString) { return global::System.Runtime.InteropServices.Marshal.PtrToStringUni(cString); } static SWIGWStringHelper() { SWIGRegisterWStringCallback_$module(wstringDelegate); } } static protected SWIGWStringHelper swigWStringHelper = new SWIGWStringHelper(); %} %insert(runtime) %{ #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterWStringCallback_$module(SWIG_CSharpWStringHelperCallback callback) { SWIG_csharp_wstring_callback = callback; } %} #endif // SWIG_CSHARP_WSTRING_HELPER_ #endif // SWIG_CSHARP_NO_WSTRING_HELPER // wchar_t %typemap(ctype) wchar_t "wchar_t" %typemap(imtype) wchar_t "char" // Requires adding CharSet=CharSet.Unicode to the DllImport to correctly marshal Unicode characters %typemap(cstype) wchar_t "char" %typemap(csin) wchar_t "$csinput" %typemap(csout, excode=SWIGEXCODE) wchar_t { char ret = $imcall;$excode return ret; } %typemap(csvarin, excode=SWIGEXCODE2) wchar_t %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) wchar_t %{ get { char ret = $imcall;$excode return ret; } %} %typemap(in) wchar_t %{ $1 = ($1_ltype)$input; %} %typemap(out) wchar_t %{ $result = (wchar_t)$1; %} %typemap(typecheck) wchar_t = char; // wchar_t * %typemap(ctype) wchar_t * "wchar_t *" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]", out="global::System.IntPtr" ) wchar_t * "string" %typemap(cstype) wchar_t * "string" %typemap(csin) wchar_t * "$csinput" %typemap(csout, excode=SWIGEXCODE) wchar_t * { string ret = global::System.Runtime.InteropServices.Marshal.PtrToStringUni($imcall);$excode return ret; } %typemap(csvarin, excode=SWIGEXCODE2) wchar_t * %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) wchar_t * %{ get { string ret = $imcall;$excode return ret; } %} %typemap(in) wchar_t * %{ $1 = ($1_ltype)$input; %} %typemap(out) wchar_t * %{ $result = (wchar_t *)$1; %} %typemap(typecheck) wchar_t * = char *; swig-4.0.2/Lib/csharp/std_shared_ptr.i0000644000175000017500000000010413667507523017522 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.2/Lib/csharp/std_vector.i0000644000175000017500000003505213667507523016703 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector * C# implementation * The C# wrapper is made to look and feel like a C# System.Collections.Generic.List<> collection. * * Note that IEnumerable<> is implemented in the proxy class which is useful for using LINQ with * C++ std::vector wrappers. The IList<> interface is also implemented to provide enhanced functionality * whenever we are confident that the required C++ operator== is available. This is the case for when * T is a primitive type or a pointer. If T does define an operator==, then use the SWIG_STD_VECTOR_ENHANCED * macro to obtain this enhanced functionality, for example: * * SWIG_STD_VECTOR_ENHANCED(SomeNamespace::Klass) * %template(VectKlass) std::vector; * ----------------------------------------------------------------------------- */ %include // MACRO for use within the std::vector class body %define SWIG_STD_VECTOR_MINIMUM_INTERNAL(CSINTERFACE, CONST_REFERENCE, CTYPE...) %typemap(csinterfaces) std::vector< CTYPE > "global::System.IDisposable, global::System.Collections.IEnumerable, global::System.Collections.Generic.CSINTERFACE<$typemap(cstype, CTYPE)>\n"; %proxycode %{ public $csclassname(global::System.Collections.IEnumerable c) : this() { if (c == null) throw new global::System.ArgumentNullException("c"); foreach ($typemap(cstype, CTYPE) element in c) { this.Add(element); } } public $csclassname(global::System.Collections.Generic.IEnumerable<$typemap(cstype, CTYPE)> c) : this() { if (c == null) throw new global::System.ArgumentNullException("c"); foreach ($typemap(cstype, CTYPE) element in c) { this.Add(element); } } public bool IsFixedSize { get { return false; } } public bool IsReadOnly { get { return false; } } public $typemap(cstype, CTYPE) this[int index] { get { return getitem(index); } set { setitem(index, value); } } public int Capacity { get { return (int)capacity(); } set { if (value < size()) throw new global::System.ArgumentOutOfRangeException("Capacity"); reserve(($typemap(cstype, size_t))value); } } public int Count { get { return (int)size(); } } public bool IsSynchronized { get { return false; } } public void CopyTo($typemap(cstype, CTYPE)[] array) { CopyTo(0, array, 0, this.Count); } public void CopyTo($typemap(cstype, CTYPE)[] array, int arrayIndex) { CopyTo(0, array, arrayIndex, this.Count); } public void CopyTo(int index, $typemap(cstype, CTYPE)[] array, int arrayIndex, int count) { if (array == null) throw new global::System.ArgumentNullException("array"); if (index < 0) throw new global::System.ArgumentOutOfRangeException("index", "Value is less than zero"); if (arrayIndex < 0) throw new global::System.ArgumentOutOfRangeException("arrayIndex", "Value is less than zero"); if (count < 0) throw new global::System.ArgumentOutOfRangeException("count", "Value is less than zero"); if (array.Rank > 1) throw new global::System.ArgumentException("Multi dimensional array.", "array"); if (index+count > this.Count || arrayIndex+count > array.Length) throw new global::System.ArgumentException("Number of elements to copy is too large."); for (int i=0; i global::System.Collections.Generic.IEnumerable<$typemap(cstype, CTYPE)>.GetEnumerator() { return new $csclassnameEnumerator(this); } global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return new $csclassnameEnumerator(this); } public $csclassnameEnumerator GetEnumerator() { return new $csclassnameEnumerator(this); } // Type-safe enumerator /// Note that the IEnumerator documentation requires an InvalidOperationException to be thrown /// whenever the collection is modified. This has been done for changes in the size of the /// collection but not when one of the elements of the collection is modified as it is a bit /// tricky to detect unmanaged code that modifies the collection under our feet. public sealed class $csclassnameEnumerator : global::System.Collections.IEnumerator , global::System.Collections.Generic.IEnumerator<$typemap(cstype, CTYPE)> { private $csclassname collectionRef; private int currentIndex; private object currentObject; private int currentSize; public $csclassnameEnumerator($csclassname collection) { collectionRef = collection; currentIndex = -1; currentObject = null; currentSize = collectionRef.Count; } // Type-safe iterator Current public $typemap(cstype, CTYPE) Current { get { if (currentIndex == -1) throw new global::System.InvalidOperationException("Enumeration not started."); if (currentIndex > currentSize - 1) throw new global::System.InvalidOperationException("Enumeration finished."); if (currentObject == null) throw new global::System.InvalidOperationException("Collection modified."); return ($typemap(cstype, CTYPE))currentObject; } } // Type-unsafe IEnumerator.Current object global::System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { int size = collectionRef.Count; bool moveOkay = (currentIndex+1 < size) && (size == currentSize); if (moveOkay) { currentIndex++; currentObject = collectionRef[currentIndex]; } else { currentObject = null; } return moveOkay; } public void Reset() { currentIndex = -1; currentObject = null; if (collectionRef.Count != currentSize) { throw new global::System.InvalidOperationException("Collection modified."); } } public void Dispose() { currentIndex = -1; currentObject = null; } } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef CTYPE value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef CONST_REFERENCE const_reference; %rename(Clear) clear; void clear(); %rename(Add) push_back; void push_back(CTYPE const& x); size_type size() const; size_type capacity() const; void reserve(size_type n); %newobject GetRange(int index, int count); %newobject Repeat(CTYPE const& value, int count); vector(); vector(const vector &other); %extend { vector(int capacity) throw (std::out_of_range) { std::vector< CTYPE >* pv = 0; if (capacity >= 0) { pv = new std::vector< CTYPE >(); pv->reserve(capacity); } else { throw std::out_of_range("capacity"); } return pv; } CTYPE getitemcopy(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) return (*$self)[index]; else throw std::out_of_range("index"); } CONST_REFERENCE getitem(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) return (*$self)[index]; else throw std::out_of_range("index"); } void setitem(int index, CTYPE const& val) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) (*$self)[index] = val; else throw std::out_of_range("index"); } // Takes a deep copy of the elements unlike ArrayList.AddRange void AddRange(const std::vector< CTYPE >& values) { $self->insert($self->end(), values.begin(), values.end()); } // Takes a deep copy of the elements unlike ArrayList.GetRange std::vector< CTYPE > *GetRange(int index, int count) throw (std::out_of_range, std::invalid_argument) { if (index < 0) throw std::out_of_range("index"); if (count < 0) throw std::out_of_range("count"); if (index >= (int)$self->size()+1 || index+count > (int)$self->size()) throw std::invalid_argument("invalid range"); return new std::vector< CTYPE >($self->begin()+index, $self->begin()+index+count); } void Insert(int index, CTYPE const& x) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()+1) $self->insert($self->begin()+index, x); else throw std::out_of_range("index"); } // Takes a deep copy of the elements unlike ArrayList.InsertRange void InsertRange(int index, const std::vector< CTYPE >& values) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()+1) $self->insert($self->begin()+index, values.begin(), values.end()); else throw std::out_of_range("index"); } void RemoveAt(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) $self->erase($self->begin() + index); else throw std::out_of_range("index"); } void RemoveRange(int index, int count) throw (std::out_of_range, std::invalid_argument) { if (index < 0) throw std::out_of_range("index"); if (count < 0) throw std::out_of_range("count"); if (index >= (int)$self->size()+1 || index+count > (int)$self->size()) throw std::invalid_argument("invalid range"); $self->erase($self->begin()+index, $self->begin()+index+count); } static std::vector< CTYPE > *Repeat(CTYPE const& value, int count) throw (std::out_of_range) { if (count < 0) throw std::out_of_range("count"); return new std::vector< CTYPE >(count, value); } void Reverse() { std::reverse($self->begin(), $self->end()); } void Reverse(int index, int count) throw (std::out_of_range, std::invalid_argument) { if (index < 0) throw std::out_of_range("index"); if (count < 0) throw std::out_of_range("count"); if (index >= (int)$self->size()+1 || index+count > (int)$self->size()) throw std::invalid_argument("invalid range"); std::reverse($self->begin()+index, $self->begin()+index+count); } // Takes a deep copy of the elements unlike ArrayList.SetRange void SetRange(int index, const std::vector< CTYPE >& values) throw (std::out_of_range) { if (index < 0) throw std::out_of_range("index"); if (index+values.size() > $self->size()) throw std::out_of_range("index"); std::copy(values.begin(), values.end(), $self->begin()+index); } } %enddef // Extra methods added to the collection class if operator== is defined for the class being wrapped // The class will then implement IList<>, which adds extra functionality %define SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(CTYPE...) %extend { bool Contains(CTYPE const& value) { return std::find($self->begin(), $self->end(), value) != $self->end(); } int IndexOf(CTYPE const& value) { int index = -1; std::vector< CTYPE >::iterator it = std::find($self->begin(), $self->end(), value); if (it != $self->end()) index = (int)(it - $self->begin()); return index; } int LastIndexOf(CTYPE const& value) { int index = -1; std::vector< CTYPE >::reverse_iterator rit = std::find($self->rbegin(), $self->rend(), value); if (rit != $self->rend()) index = (int)($self->rend() - 1 - rit); return index; } bool Remove(CTYPE const& value) { std::vector< CTYPE >::iterator it = std::find($self->begin(), $self->end(), value); if (it != $self->end()) { $self->erase(it); return true; } return false; } } %enddef // Macros for std::vector class specializations/enhancements %define SWIG_STD_VECTOR_ENHANCED(CTYPE...) namespace std { template<> class vector< CTYPE > { SWIG_STD_VECTOR_MINIMUM_INTERNAL(IList, const value_type&, %arg(CTYPE)) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(CTYPE) }; } %enddef // Legacy macros %define SWIG_STD_VECTOR_SPECIALIZE(CSTYPE, CTYPE...) #warning SWIG_STD_VECTOR_SPECIALIZE macro deprecated, please see csharp/std_vector.i and switch to SWIG_STD_VECTOR_ENHANCED SWIG_STD_VECTOR_ENHANCED(CTYPE) %enddef %define SWIG_STD_VECTOR_SPECIALIZE_MINIMUM(CSTYPE, CTYPE...) #warning SWIG_STD_VECTOR_SPECIALIZE_MINIMUM macro deprecated, it is no longer required %enddef %{ #include #include #include %} %csmethodmodifiers std::vector::getitemcopy "private" %csmethodmodifiers std::vector::getitem "private" %csmethodmodifiers std::vector::setitem "private" %csmethodmodifiers std::vector::size "private" %csmethodmodifiers std::vector::capacity "private" %csmethodmodifiers std::vector::reserve "private" namespace std { // primary (unspecialized) class template for std::vector // does not require operator== to be defined template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(IEnumerable, const value_type&, T) }; // specialization for pointers template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(IList, const value_type&, T *) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(T *) }; // bool is specialized in the C++ standard - const_reference in particular template<> class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(IList, bool, bool) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(bool) }; } // template specializations for std::vector // these provide extra collections methods as operator== is defined SWIG_STD_VECTOR_ENHANCED(char) SWIG_STD_VECTOR_ENHANCED(signed char) SWIG_STD_VECTOR_ENHANCED(unsigned char) SWIG_STD_VECTOR_ENHANCED(short) SWIG_STD_VECTOR_ENHANCED(unsigned short) SWIG_STD_VECTOR_ENHANCED(int) SWIG_STD_VECTOR_ENHANCED(unsigned int) SWIG_STD_VECTOR_ENHANCED(long) SWIG_STD_VECTOR_ENHANCED(unsigned long) SWIG_STD_VECTOR_ENHANCED(long long) SWIG_STD_VECTOR_ENHANCED(unsigned long long) SWIG_STD_VECTOR_ENHANCED(float) SWIG_STD_VECTOR_ENHANCED(double) SWIG_STD_VECTOR_ENHANCED(std::string) // also requires a %include SWIG_STD_VECTOR_ENHANCED(std::wstring) // also requires a %include swig-4.0.2/Lib/csharp/csharpkw.swg0000644000175000017500000000350213667507523016714 0ustar williamwilliam#ifndef CSHARP_CSHARPKW_SWG_ #define CSHARP_CSHARPKW_SWG_ /* Warnings for C# keywords */ #define CSHARPKW(x) %keywordwarn("'" `x` "' is a C# keyword, renaming to '" `x` "_'",rename="%s_") `x` #define CSHARPCLASSKW(x) %keywordwarn("'" `x` "' is a special method name used in the C# wrapper classes, class renamed to '" `x` "_'",%$isclass,rename="%s_") `x` /* from http://www.jaggersoft.com/csharp_grammar.html#1.7%20Keywords */ CSHARPKW(abstract); CSHARPKW(as); CSHARPKW(base); CSHARPKW(bool); CSHARPKW(break); CSHARPKW(byte); CSHARPKW(case); CSHARPKW(catch); CSHARPKW(char); CSHARPKW(checked); CSHARPKW(class); CSHARPKW(const); CSHARPKW(continue); CSHARPKW(decimal); CSHARPKW(default); CSHARPKW(delegate); CSHARPKW(do); CSHARPKW(double); CSHARPKW(else); CSHARPKW(enum); CSHARPKW(event); CSHARPKW(explicit); CSHARPKW(extern); CSHARPKW(false); CSHARPKW(finally); CSHARPKW(fixed); CSHARPKW(float); CSHARPKW(for); CSHARPKW(foreach); CSHARPKW(goto); CSHARPKW(if); CSHARPKW(implicit); CSHARPKW(in); CSHARPKW(int); CSHARPKW(interface); CSHARPKW(internal); CSHARPKW(is); CSHARPKW(lock); CSHARPKW(long); CSHARPKW(namespace); CSHARPKW(new); CSHARPKW(null); CSHARPKW(object); CSHARPKW(operator); CSHARPKW(out); CSHARPKW(override); CSHARPKW(params); CSHARPKW(private); CSHARPKW(protected); CSHARPKW(public); CSHARPKW(readonly); CSHARPKW(ref); CSHARPKW(return); CSHARPKW(sbyte); CSHARPKW(sealed); CSHARPKW(short); CSHARPKW(sizeof); CSHARPKW(stackalloc); CSHARPKW(static); CSHARPKW(struct); CSHARPKW(string); CSHARPKW(switch); CSHARPKW(this); CSHARPKW(throw); CSHARPKW(true); CSHARPKW(try); CSHARPKW(typeof); CSHARPKW(uint); CSHARPKW(ulong); CSHARPKW(unchecked); CSHARPKW(unsafe); CSHARPKW(ushort); CSHARPKW(using); CSHARPKW(virtual); CSHARPKW(void); CSHARPKW(volatile); CSHARPKW(while); CSHARPCLASSKW(delete); #undef CSHARPKW #endif //CSHARP_CSHARPKW_SWG_ swig-4.0.2/Lib/csharp/std_set.i0000644000175000017500000002301713667507523016172 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_set.i * * SWIG typemaps for std::set. * * Note that ISet<> used here requires .NET 4 or later. * * The C# wrapper implements ISet<> interface and shares performance * characteristics of C# System.Collections.Generic.SortedSet<> class, but * doesn't provide quite all of its methods. * ----------------------------------------------------------------------------- */ %{ #include #include #include %} %csmethodmodifiers std::set::size "private" %csmethodmodifiers std::set::getitem "private" %csmethodmodifiers std::set::create_iterator_begin "private" %csmethodmodifiers std::set::get_next "private" %csmethodmodifiers std::set::destroy_iterator "private" namespace std { // TODO: Add support for comparator and allocator template parameters. template class set { %typemap(csinterfaces) std::set "global::System.IDisposable, global::System.Collections.Generic.ISet<$typemap(cstype, T)>\n"; %proxycode %{ void global::System.Collections.Generic.ICollection<$typemap(cstype, T)>.Add($typemap(cstype, T) item) { ((global::System.Collections.Generic.ISet<$typemap(cstype, T)>)this).Add(item); } public bool TryGetValue($typemap(cstype, T) equalValue, out $typemap(cstype, T) actualValue) { try { actualValue = getitem(equalValue); return true; } catch { actualValue = default($typemap(cstype, T)); return false; } } public int Count { get { return (int)size(); } } public bool IsReadOnly { get { return false; } } public void CopyTo($typemap(cstype, T)[] array) { CopyTo(array, 0); } public void CopyTo($typemap(cstype, T)[] array, int arrayIndex) { if (array == null) throw new global::System.ArgumentNullException("array"); if (arrayIndex < 0) throw new global::System.ArgumentOutOfRangeException("arrayIndex", "Value is less than zero"); if (array.Rank > 1) throw new global::System.ArgumentException("Multi dimensional array.", "array"); if (arrayIndex+this.Count > array.Length) throw new global::System.ArgumentException("Number of elements to copy is too large."); foreach ($typemap(cstype, T) item in this) { array.SetValue(item, arrayIndex++); } } public void ExceptWith(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { foreach ($typemap(cstype, T) item in other) { Remove(item); } } public void IntersectWith(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { $csclassname old = new $csclassname(this); Clear(); foreach ($typemap(cstype, T) item in other) { if (old.Contains(item)) Add(item); } } private static int count_enum(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { int count = 0; foreach ($typemap(cstype, T) item in other) { count++; } return count; } public bool IsProperSubsetOf(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { return IsSubsetOf(other) && Count < count_enum(other); } public bool IsProperSupersetOf(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { return IsSupersetOf(other) && Count > count_enum(other); } public bool IsSubsetOf(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { int countContained = 0; foreach ($typemap(cstype, T) item in other) { if (Contains(item)) countContained++; } return countContained == Count; } public bool IsSupersetOf(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { foreach ($typemap(cstype, T) item in other) { if (!Contains(item)) return false; } return true; } public bool Overlaps(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { foreach ($typemap(cstype, T) item in other) { if (Contains(item)) return true; } return false; } public bool SetEquals(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { return IsSupersetOf(other) && Count == count_enum(other); } public void SymmetricExceptWith(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { foreach ($typemap(cstype, T) item in other) { if (!Remove(item)) Add(item); } } public void UnionWith(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { foreach ($typemap(cstype, T) item in other) { Add(item); } } private global::System.Collections.Generic.ICollection<$typemap(cstype, T)> Items { get { global::System.Collections.Generic.ICollection<$typemap(cstype, T)> items = new global::System.Collections.Generic.List<$typemap(cstype, T)>(); int size = this.Count; if (size > 0) { global::System.IntPtr iter = create_iterator_begin(); for (int i = 0; i < size; i++) { items.Add(get_next(iter)); } destroy_iterator(iter); } return items; } } global::System.Collections.Generic.IEnumerator<$typemap(cstype, T)> global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)>.GetEnumerator() { return new $csclassnameEnumerator(this); } global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return new $csclassnameEnumerator(this); } public $csclassnameEnumerator GetEnumerator() { return new $csclassnameEnumerator(this); } // Type-safe enumerator /// Note that the IEnumerator documentation requires an InvalidOperationException to be thrown /// whenever the collection is modified. This has been done for changes in the size of the /// collection but not when one of the elements of the collection is modified as it is a bit /// tricky to detect unmanaged code that modifies the collection under our feet. public sealed class $csclassnameEnumerator : global::System.Collections.IEnumerator, global::System.Collections.Generic.IEnumerator<$typemap(cstype, T)> { private $csclassname collectionRef; private global::System.Collections.Generic.IList<$typemap(cstype, T)> ItemsCollection; private int currentIndex; private object currentObject; private int currentSize; public $csclassnameEnumerator($csclassname collection) { collectionRef = collection; ItemsCollection = new global::System.Collections.Generic.List<$typemap(cstype, T)>(collection.Items); currentIndex = -1; currentObject = null; currentSize = collectionRef.Count; } // Type-safe iterator Current public $typemap(cstype, T) Current { get { if (currentIndex == -1) throw new global::System.InvalidOperationException("Enumeration not started."); if (currentIndex > currentSize - 1) throw new global::System.InvalidOperationException("Enumeration finished."); if (currentObject == null) throw new global::System.InvalidOperationException("Collection modified."); return ($typemap(cstype, T))currentObject; } } // Type-unsafe IEnumerator.Current object global::System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { int size = collectionRef.Count; bool moveOkay = (currentIndex+1 < size) && (size == currentSize); if (moveOkay) { currentIndex++; currentObject = ItemsCollection[currentIndex]; } else { currentObject = null; } return moveOkay; } public void Reset() { currentIndex = -1; currentObject = null; if (collectionRef.Count != currentSize) { throw new global::System.InvalidOperationException("Collection modified."); } } public void Dispose() { currentIndex = -1; currentObject = null; } } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T key_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; set(); set(const set& other); size_type size() const; bool empty() const; %rename(Clear) clear; void clear(); %extend { bool Add(const value_type& item) { return $self->insert(item).second; } bool Contains(const value_type& item) { return $self->count(item) != 0; } bool Remove(const value_type& item) { return $self->erase(item) != 0; } const value_type& getitem(const value_type& item) throw (std::out_of_range) { std::set::iterator iter = $self->find(item); if (iter == $self->end()) throw std::out_of_range("item not found"); return *iter; } // create_iterator_begin(), get_next() and destroy_iterator work together to provide a collection of items to C# %apply void *VOID_INT_PTR { std::set::iterator *create_iterator_begin } %apply void *VOID_INT_PTR { std::set::iterator *swigiterator } std::set::iterator *create_iterator_begin() { return new std::set::iterator($self->begin()); } const key_type& get_next(std::set::iterator *swigiterator) { std::set::iterator iter = *swigiterator; (*swigiterator)++; return *iter; } void destroy_iterator(std::set::iterator *swigiterator) { delete swigiterator; } } }; } swig-4.0.2/Lib/csharp/std_wstring.i0000644000175000017500000000760613667507523017102 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_wstring.i * * Typemaps for std::wstring and const std::wstring& * These are mapped to a C# String and are passed around by value. * * To use non-const std::wstring references use the following %apply. Note * that they are passed by value. * %apply const std::wstring & {std::wstring &}; * ----------------------------------------------------------------------------- */ %include %{ #include %} namespace std { %naturalvar wstring; class wstring; // wstring %typemap(ctype, out="void *") wstring "wchar_t *" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]", outattributes="[return: global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]" ) wstring "string" %typemap(cstype) wstring "string" %typemap(csdirectorin) wstring "$iminput" %typemap(csdirectorout) wstring "$cscall" %typemap(in, canthrow=1) wstring %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); return $null; } $1.assign($input); %} %typemap(out) wstring %{ $result = SWIG_csharp_wstring_callback($1.c_str()); %} %typemap(directorout, canthrow=1) wstring %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); return $null; } $result.assign($input); %} %typemap(directorin) wstring %{ $input = SWIG_csharp_wstring_callback($1.c_str()); %} %typemap(csin) wstring "$csinput" %typemap(csout, excode=SWIGEXCODE) wstring { string ret = $imcall;$excode return ret; } %typemap(typecheck) wstring = wchar_t *; %typemap(throws, canthrow=1) wstring %{ std::string message($1.begin(), $1.end()); SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, message.c_str()); return $null; %} // const wstring & %typemap(ctype, out="void *") const wstring & "wchar_t *" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]", outattributes="[return: global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]" ) const wstring & "string" %typemap(cstype) const wstring & "string" %typemap(csdirectorin) const wstring & "$iminput" %typemap(csdirectorout) const wstring & "$cscall" %typemap(in, canthrow=1) const wstring & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); return $null; } std::wstring $1_str($input); $1 = &$1_str; %} %typemap(out) const wstring & %{ $result = SWIG_csharp_wstring_callback($1->c_str()); %} %typemap(csin) const wstring & "$csinput" %typemap(csout, excode=SWIGEXCODE) const wstring & { string ret = $imcall;$excode return ret; } %typemap(directorout, canthrow=1, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const wstring & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); return $null; } /* possible thread/reentrant code problem */ static std::wstring $1_str; $1_str = $input; $result = &$1_str; %} %typemap(directorin) const wstring & %{ $input = SWIG_csharp_wstring_callback($1.c_str()); %} %typemap(csvarin, excode=SWIGEXCODE2) const wstring & %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) const wstring & %{ get { string ret = $imcall;$excode return ret; } %} %typemap(typecheck) const wstring & = wchar_t *; %typemap(throws, canthrow=1) const wstring & %{ std::string message($1.begin(), $1.end()); SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, message.c_str()); return $null; %} } swig-4.0.2/Lib/csharp/boost_intrusive_ptr.i0000644000175000017500000005702513667507523020656 0ustar williamwilliam// Users can provide their own SWIG_INTRUSIVE_PTR_TYPEMAPS or SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP macros before including this file to change the // visibility of the constructor and getCPtr method if desired to public if using multiple modules. #ifndef SWIG_INTRUSIVE_PTR_TYPEMAPS #define SWIG_INTRUSIVE_PTR_TYPEMAPS(CONST, TYPE...) SWIG_INTRUSIVE_PTR_TYPEMAPS_IMPLEMENTATION(internal, internal, CONST, TYPE) #endif #ifndef SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP #define SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(CONST, TYPE...) SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP_IMPLEMENTATION(internal, internal, CONST, TYPE) #endif %include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_INTRUSIVE_PTR_TYPEMAPS_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE "(void)arg1; delete smartarg1;" // Typemap customisations... %typemap(in, canthrow=1) CONST TYPE ($&1_type argp = 0) %{ // plain value argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } $1 = *argp; %} %typemap(out, fragment="SWIG_intrusive_deleter") CONST TYPE %{ //plain value(out) $1_ltype* resultp = new $1_ltype(($1_ltype &)$1); intrusive_ptr_add_ref(resultp); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(resultp, SWIG_intrusive_deleter< CONST TYPE >()); %} %typemap(in, canthrow=1) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain pointer smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE * %{ //plain pointer(out) #if ($owner) if ($1) { intrusive_ptr_add_ref($1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; #endif %} %typemap(in, canthrow=1) CONST TYPE & %{ // plain reference $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if(!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type reference is null", 0); return $null; } %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE & %{ //plain reference(out) #if ($owner) if ($1) { intrusive_ptr_add_ref($1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; #endif %} %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ // plain pointer by reference temp = ($*1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") TYPE *CONST& %{ // plain pointer by reference(out) #if ($owner) if (*$1) { intrusive_ptr_add_ref(*$1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_0); #endif %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by value smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; if (smartarg) { $1 = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); } %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > %{ if ($1) { intrusive_ptr_add_ref($1.get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1.get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast ($&1_type smartarg) %{ // shared_ptr by value smartarg = *($&1_ltype*)&$input; if (smartarg) $1 = *smartarg; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ANY_TYPE_SWIGSharedPtrUpcast %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & ($*1_ltype tempnull, $*1_ltype temp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by reference if ( $input ) { smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); $1 = &temp; } else { $1 = &tempnull; } %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ delete &($1); if ($self) { SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * temp = new SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(*$input); $1 = *temp; } %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ if (*$1) { intrusive_ptr_add_ref($1->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * ($*1_ltype tempnull, $*1_ltype temp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by pointer if ( $input ) { smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); $1 = &temp; } else { $1 = &tempnull; } %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ delete $1; if ($self) $1 = new SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(*$input); %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ if ($1 && *$1) { intrusive_ptr_add_ref($1->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } if ($owner) delete $1; %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& (SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > temp, $*1_ltype tempp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by pointer reference smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; if ($input) { temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); } tempp = &temp; $1 = &tempp; %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ if ($self) $1 = *$input; %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ if (*$1 && **$1) { intrusive_ptr_add_ref((*$1)->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >((*$1)->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (ctype) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "void *" %typemap (imtype, out="global::System.IntPtr") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "global::System.Runtime.InteropServices.HandleRef" %typemap (cstype) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "$typemap(cstype, TYPE)" %typemap(csin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "$typemap(cstype, TYPE).getCPtr($csinput)" %typemap(csout, excode=SWIGEXCODE) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > %{ get { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >& %{ get { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >* %{ get { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %} %typemap(csout, excode=SWIGEXCODE) CONST TYPE { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE & { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE * { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) TYPE *CONST& { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } // Base proxy classes %typemap(csbody) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnBase; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} // Derived proxy classes %typemap(csbody_derived) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnDerived; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGSmartPtrUpcast(cPtr), true) { swigCMemOwnDerived = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %typemap(csdisposing, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnBase) { swigCMemOwnBase = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } } } %typemap(csdisposing_derived, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } base.Dispose(disposing); } } // CONST version needed ???? also for C# %typemap(imtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast "global::System.Runtime.InteropServices.HandleRef" %typemap(imtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast "global::System.Runtime.InteropServices.HandleRef" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %template() SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >; %enddef ///////////////////////////////////////////////////////////////////// %include %define SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor mods %feature("unref") TYPE "(void)arg1; delete smartarg1;" // plain value %typemap(in, canthrow=1) CONST TYPE ($&1_type argp = 0) %{ argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} // plain pointer %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} // plain reference %typemap(in, canthrow=1) CONST TYPE & %{ $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if (!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type reference is null", 0); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast ($&1_type smartarg) %{ // shared_ptr by value smartarg = *($&1_ltype*)&$input; if (smartarg) $1 = *smartarg; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ANY_TYPE_SWIGSharedPtrUpcast %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (ctype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "void *" %typemap (imtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "void *" %typemap (cstype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(cstype, TYPE)" %typemap (csin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(cstype, TYPE).getCPtr($csinput)" %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { global::System.IntPtr cPtr = $imcall; return (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true); } %typemap(csout, excode=SWIGEXCODE) CONST TYPE { return new $typemap(cstype, TYPE)($imcall, true); } %typemap(csout, excode=SWIGEXCODE) CONST TYPE & { return new $typemap(cstype, TYPE)($imcall, true); } %typemap(csout, excode=SWIGEXCODE) CONST TYPE * { global::System.IntPtr cPtr = $imcall; return (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true); } %typemap(csout, excode=SWIGEXCODE) TYPE *CONST& { global::System.IntPtr cPtr = $imcall; return (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true); } // Base proxy classes %typemap(csbody) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnBase; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} // Derived proxy classes %typemap(csbody_derived) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnDerived; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGSmartPtrUpcast(cPtr), true) { swigCMemOwnDerived = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %typemap(csdisposing, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnBase) { swigCMemOwnBase = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } } } %typemap(csdisposing_derived, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } base.Dispose(disposing); } } // CONST version needed ???? also for C# %typemap(imtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast "global::System.Runtime.InteropServices.HandleRef" %typemap(imtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast "global::System.Runtime.InteropServices.HandleRef" // Typecheck typemaps %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *") TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.2/Lib/csharp/std_common.i0000644000175000017500000000014613667507523016665 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.2/Lib/csharp/std_except.i0000644000175000017500000000436113667507523016670 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * Typemaps used by the STL wrappers that throw exceptions. These typemaps are * used when methods are declared with an STL exception specification, such as * size_t at() const throw (std::out_of_range); * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws, canthrow=1) std::bad_cast "SWIG_CSharpSetPendingException(SWIG_CSharpInvalidCastException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::bad_exception "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::domain_error "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::exception "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::invalid_argument "SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, $1.what(), \"\");\n return $null;" %typemap(throws, canthrow=1) std::length_error "SWIG_CSharpSetPendingException(SWIG_CSharpIndexOutOfRangeException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::logic_error "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::out_of_range "SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException, 0, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::overflow_error "SWIG_CSharpSetPendingException(SWIG_CSharpOverflowException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::range_error "SWIG_CSharpSetPendingException(SWIG_CSharpIndexOutOfRangeException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::runtime_error "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::underflow_error "SWIG_CSharpSetPendingException(SWIG_CSharpOverflowException, $1.what());\n return $null;" swig-4.0.2/Lib/csharp/complex.i0000644000175000017500000000015513667507523016172 0ustar williamwilliam#ifdef __cplusplus %include #else #error C# module only supports complex in C++ mode. #endif swig-4.0.2/Lib/csharp/enumtypesafe.swg0000644000175000017500000001127613667507523017606 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumtypesafe.swg * * Include this file in order for C/C++ enums to be wrapped by the so called * typesafe enum pattern. Each enum has an equivalent C# class named after the * enum and each enum item is a static instance of this class. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(ctype) const enum SWIGTYPE & "int" %typemap(imtype) const enum SWIGTYPE & "int" %typemap(cstype) const enum SWIGTYPE & "$*csclassname" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (int)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin) const enum SWIGTYPE & "$input = (int)$1;" %typemap(csdirectorin) const enum SWIGTYPE & "$*csclassname.swigToEnum($iminput)" %typemap(csdirectorout) const enum SWIGTYPE & "$cscall.swigValue" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(throws, canthrow=1) const enum SWIGTYPE & %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) const enum SWIGTYPE & "$csinput.swigValue" %typemap(csout, excode=SWIGEXCODE) const enum SWIGTYPE & { $*csclassname ret = $*csclassname.swigToEnum($imcall);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) const enum SWIGTYPE & %{ get { $*csclassname ret = $*csclassname.swigToEnum($imcall);$excode return ret; } %} // enum SWIGTYPE typemaps %typemap(ctype) enum SWIGTYPE "int" %typemap(imtype) enum SWIGTYPE "int" %typemap(cstype) enum SWIGTYPE "$csclassname" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (int)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE "$input = (int)$1;" %typemap(csdirectorin) enum SWIGTYPE "$csclassname.swigToEnum($iminput)" %typemap(csdirectorout) enum SWIGTYPE "$cscall.swigValue" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(throws, canthrow=1) enum SWIGTYPE %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) enum SWIGTYPE "$csinput.swigValue" %typemap(csout, excode=SWIGEXCODE) enum SWIGTYPE { $csclassname ret = $csclassname.swigToEnum($imcall);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) enum SWIGTYPE %{ get { $csclassname ret = $csclassname.swigToEnum($imcall);$excode return ret; } %} %typemap(csbase) enum SWIGTYPE "" %typemap(csclassmodifiers) enum SWIGTYPE "public sealed class" %typemap(cscode) enum SWIGTYPE "" %typemap(csimports) enum SWIGTYPE "" %typemap(csinterfaces) enum SWIGTYPE "" /* * The swigToEnum method is used to find the C# enum from a C++ enum integer value. The default one here takes * advantage of the fact that most enums do not have initial values specified, so the lookup is fast. If initial * values are specified then a lengthy linear search through all possible enums might occur. Specific typemaps could be * written to possibly optimise this lookup by taking advantage of characteristics peculiar to the targeted enum. * The special variable, $enumvalues, is replaced with a comma separated list of all the enum values. */ %typemap(csbody) enum SWIGTYPE %{ public readonly int swigValue; public static $csclassname swigToEnum(int swigValue) { if (swigValue < swigValues.Length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) return swigValues[swigValue]; for (int i = 0; i < swigValues.Length; i++) if (swigValues[i].swigValue == swigValue) return swigValues[i]; throw new global::System.ArgumentOutOfRangeException("No enum $csclassname with value " + swigValue); } public override string ToString() { return swigName; } private $csclassname(string swigName) { this.swigName = swigName; this.swigValue = swigNext++; } private $csclassname(string swigName, int swigValue) { this.swigName = swigName; this.swigValue = swigValue; swigNext = swigValue+1; } private $csclassname(string swigName, $csclassname swigEnum) { this.swigName = swigName; this.swigValue = swigEnum.swigValue; swigNext = this.swigValue+1; } private static $csclassname[] swigValues = { $enumvalues }; private static int swigNext = 0; private readonly string swigName; %} %csenum(typesafe); swig-4.0.2/Lib/csharp/typemaps.i0000644000175000017500000002472313667507523016374 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* INPUT typemaps -------------- These typemaps are used for pointer/reference parameters that are input only and are mapped to a C# input parameter. The following typemaps can be applied to turn a pointer or reference into a simple input value. That is, instead of passing a pointer or reference to an object, you would use a real value instead. bool *INPUT, bool &INPUT signed char *INPUT, signed char &INPUT unsigned char *INPUT, unsigned char &INPUT short *INPUT, short &INPUT unsigned short *INPUT, unsigned short &INPUT int *INPUT, int &INPUT unsigned int *INPUT, unsigned int &INPUT long *INPUT, long &INPUT unsigned long *INPUT, unsigned long &INPUT long long *INPUT, long long &INPUT unsigned long long *INPUT, unsigned long long &INPUT float *INPUT, float &INPUT double *INPUT, double &INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); In C# you could then use it like this: double answer = modulename.fadd(10.0, 20.0); */ %define INPUT_TYPEMAP(TYPE, CTYPE, CSTYPE) %typemap(ctype, out="void *") TYPE *INPUT, TYPE &INPUT "CTYPE" %typemap(imtype, out="global::System.IntPtr") TYPE *INPUT, TYPE &INPUT "CSTYPE" %typemap(cstype, out="$csclassname") TYPE *INPUT, TYPE &INPUT "CSTYPE" %typemap(csin) TYPE *INPUT, TYPE &INPUT "$csinput" %typemap(in) TYPE *INPUT, TYPE &INPUT %{ $1 = ($1_ltype)&$input; %} %typemap(typecheck) TYPE *INPUT = TYPE; %typemap(typecheck) TYPE &INPUT = TYPE; %enddef INPUT_TYPEMAP(bool, unsigned int, bool) //INPUT_TYPEMAP(char, char, char) INPUT_TYPEMAP(signed char, signed char, sbyte) INPUT_TYPEMAP(unsigned char, unsigned char, byte) INPUT_TYPEMAP(short, short, short) INPUT_TYPEMAP(unsigned short, unsigned short, ushort) INPUT_TYPEMAP(int, int, int) INPUT_TYPEMAP(unsigned int, unsigned int, uint) INPUT_TYPEMAP(long, long, int) INPUT_TYPEMAP(unsigned long, unsigned long, uint) INPUT_TYPEMAP(long long, long long, long) INPUT_TYPEMAP(unsigned long long, unsigned long long, ulong) INPUT_TYPEMAP(float, float, float) INPUT_TYPEMAP(double, double, double) #undef INPUT_TYPEMAP /* OUTPUT typemaps --------------- These typemaps are used for pointer/reference parameters that are output only and are mapped to a C# output parameter. The following typemaps can be applied to turn a pointer or reference into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In C#, the 'out' keyword is used when passing the parameter to a function that takes an output parameter. bool *OUTPUT, bool &OUTPUT signed char *OUTPUT, signed char &OUTPUT unsigned char *OUTPUT, unsigned char &OUTPUT short *OUTPUT, short &OUTPUT unsigned short *OUTPUT, unsigned short &OUTPUT int *OUTPUT, int &OUTPUT unsigned int *OUTPUT, unsigned int &OUTPUT long *OUTPUT, long &OUTPUT unsigned long *OUTPUT, unsigned long &OUTPUT long long *OUTPUT, long long &OUTPUT unsigned long long *OUTPUT, unsigned long long &OUTPUT float *OUTPUT, float &OUTPUT double *OUTPUT, double &OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters): double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The C# output of the function would be the function return value and the value returned in the second output parameter. In C# you would use it like this: double dptr; double fraction = modulename.modf(5, out dptr); */ %define OUTPUT_TYPEMAP(TYPE, CTYPE, CSTYPE, TYPECHECKPRECEDENCE) %typemap(ctype, out="void *") TYPE *OUTPUT, TYPE &OUTPUT "CTYPE *" %typemap(imtype, out="global::System.IntPtr") TYPE *OUTPUT, TYPE &OUTPUT "out CSTYPE" %typemap(cstype, out="$csclassname") TYPE *OUTPUT, TYPE &OUTPUT "out CSTYPE" %typemap(csin) TYPE *OUTPUT, TYPE &OUTPUT "out $csinput" %typemap(in) TYPE *OUTPUT, TYPE &OUTPUT %{ $1 = ($1_ltype)$input; %} %typecheck(SWIG_TYPECHECK_##TYPECHECKPRECEDENCE) TYPE *OUTPUT, TYPE &OUTPUT "" %enddef OUTPUT_TYPEMAP(bool, unsigned int, bool, BOOL_PTR) //OUTPUT_TYPEMAP(char, char, char, CHAR_PTR) OUTPUT_TYPEMAP(signed char, signed char, sbyte, INT8_PTR) OUTPUT_TYPEMAP(unsigned char, unsigned char, byte, UINT8_PTR) OUTPUT_TYPEMAP(short, short, short, INT16_PTR) OUTPUT_TYPEMAP(unsigned short, unsigned short, ushort, UINT16_PTR) OUTPUT_TYPEMAP(int, int, int, INT32_PTR) OUTPUT_TYPEMAP(unsigned int, unsigned int, uint, UINT32_PTR) OUTPUT_TYPEMAP(long, long, int, INT32_PTR) OUTPUT_TYPEMAP(unsigned long, unsigned long, uint, UINT32_PTR) OUTPUT_TYPEMAP(long long, long long, long, INT64_PTR) OUTPUT_TYPEMAP(unsigned long long, unsigned long long, ulong, UINT64_PTR) OUTPUT_TYPEMAP(float, float, float, FLOAT_PTR) OUTPUT_TYPEMAP(double, double, double, DOUBLE_PTR) #undef OUTPUT_TYPEMAP %typemap(in) bool *OUTPUT, bool &OUTPUT %{ *$input = 0; $1 = ($1_ltype)$input; %} /* INOUT typemaps -------------- These typemaps are for pointer/reference parameters that are both input and output and are mapped to a C# reference parameter. The following typemaps can be applied to turn a pointer or reference into a reference parameters, that is the parameter is both an input and an output. In C#, the 'ref' keyword is used for reference parameters. bool *INOUT, bool &INOUT signed char *INOUT, signed char &INOUT unsigned char *INOUT, unsigned char &INOUT short *INOUT, short &INOUT unsigned short *INOUT, unsigned short &INOUT int *INOUT, int &INOUT unsigned int *INOUT, unsigned int &INOUT long *INOUT, long &INOUT unsigned long *INOUT, unsigned long &INOUT long long *INOUT, long long &INOUT unsigned long long *INOUT, unsigned long long &INOUT float *INOUT, float &INOUT double *INOUT, double &INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); The C# output of the function would be the new value returned by the reference parameter. In C# you would use it like this: double x = 5.0; neg(ref x); The implementation of the OUTPUT and INOUT typemaps is different to the scripting languages in that the scripting languages will return the output value as part of the function return value. */ %define INOUT_TYPEMAP(TYPE, CTYPE, CSTYPE, TYPECHECKPRECEDENCE) %typemap(ctype, out="void *") TYPE *INOUT, TYPE &INOUT "CTYPE *" %typemap(imtype, out="global::System.IntPtr") TYPE *INOUT, TYPE &INOUT "ref CSTYPE" %typemap(cstype, out="$csclassname") TYPE *INOUT, TYPE &INOUT "ref CSTYPE" %typemap(csin) TYPE *INOUT, TYPE &INOUT "ref $csinput" %typemap(in) TYPE *INOUT, TYPE &INOUT %{ $1 = ($1_ltype)$input; %} %typecheck(SWIG_TYPECHECK_##TYPECHECKPRECEDENCE) TYPE *INOUT, TYPE &INOUT "" %enddef INOUT_TYPEMAP(bool, unsigned int, bool, BOOL_PTR) //INOUT_TYPEMAP(char, char, char, CHAR_PTR) INOUT_TYPEMAP(signed char, signed char, sbyte, INT8_PTR) INOUT_TYPEMAP(unsigned char, unsigned char, byte, UINT8_PTR) INOUT_TYPEMAP(short, short, short, INT16_PTR) INOUT_TYPEMAP(unsigned short, unsigned short, ushort, UINT16_PTR) INOUT_TYPEMAP(int, int, int, INT32_PTR) INOUT_TYPEMAP(unsigned int, unsigned int, uint, UINT32_PTR) INOUT_TYPEMAP(long, long, int, INT32_PTR) INOUT_TYPEMAP(unsigned long, unsigned long, uint, UINT32_PTR) INOUT_TYPEMAP(long long, long long, long, INT64_PTR) INOUT_TYPEMAP(unsigned long long, unsigned long long, ulong, UINT64_PTR) INOUT_TYPEMAP(float, float, float, FLOAT_PTR) INOUT_TYPEMAP(double, double, double, DOUBLE_PTR) #undef INOUT_TYPEMAP swig-4.0.2/Lib/csharp/std_array.i0000644000175000017500000001572613667507523016525 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_array.i * * SWIG typemaps for std::array * C# implementation * The C# wrapper is made to look and feel like a C# System.Collections.Generic.IReadOnlyList<> collection. * ----------------------------------------------------------------------------- */ %{ #include #include #include %} %include %define SWIG_STD_ARRAY_INTERNAL(T, N) %typemap(csinterfaces) std::array< T, N > "global::System.IDisposable, global::System.Collections.IEnumerable\n , global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)>\n"; %proxycode %{ public $csclassname(global::System.Collections.ICollection c) : this() { if (c == null) throw new global::System.ArgumentNullException("c"); int end = global::System.Math.Min(this.Count, c.Count); int i = 0; foreach ($typemap(cstype, T) elem in c) { if (i >= end) break; this[i++] = elem; } } public int Count { get { return (int)size(); } } public $typemap(cstype, T) this[int index] { get { return getitem(index); } set { setitem(index, value); } } public bool IsEmpty { get { return empty(); } } public void CopyTo($typemap(cstype, T)[] array) { CopyTo(0, array, 0, this.Count); } public void CopyTo($typemap(cstype, T)[] array, int arrayIndex) { CopyTo(0, array, arrayIndex, this.Count); } public void CopyTo(int index, $typemap(cstype, T)[] array, int arrayIndex, int count) { if (array == null) throw new global::System.ArgumentNullException("array"); if (index < 0) throw new global::System.ArgumentOutOfRangeException("index", "Value is less than zero"); if (arrayIndex < 0) throw new global::System.ArgumentOutOfRangeException("arrayIndex", "Value is less than zero"); if (count < 0) throw new global::System.ArgumentOutOfRangeException("count", "Value is less than zero"); if (array.Rank > 1) throw new global::System.ArgumentException("Multi dimensional array.", "array"); if (index+count > this.Count || arrayIndex+count > array.Length) throw new global::System.ArgumentException("Number of elements to copy is too large."); for (int i=0; i global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)>.GetEnumerator() { return new $csclassnameEnumerator(this); } global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return new $csclassnameEnumerator(this); } public $csclassnameEnumerator GetEnumerator() { return new $csclassnameEnumerator(this); } // Type-safe enumerator /// Note that the IEnumerator documentation requires an InvalidOperationException to be thrown /// whenever the collection is modified. This has been done for changes in the size of the /// collection but not when one of the elements of the collection is modified as it is a bit /// tricky to detect unmanaged code that modifies the collection under our feet. public sealed class $csclassnameEnumerator : global::System.Collections.IEnumerator , global::System.Collections.Generic.IEnumerator<$typemap(cstype, T)> { private $csclassname collectionRef; private int currentIndex; private object currentObject; private int currentSize; public $csclassnameEnumerator($csclassname collection) { collectionRef = collection; currentIndex = -1; currentObject = null; currentSize = collectionRef.Count; } // Type-safe iterator Current public $typemap(cstype, T) Current { get { if (currentIndex == -1) throw new global::System.InvalidOperationException("Enumeration not started."); if (currentIndex > currentSize - 1) throw new global::System.InvalidOperationException("Enumeration finished."); if (currentObject == null) throw new global::System.InvalidOperationException("Collection modified."); return ($typemap(cstype, T))currentObject; } } // Type-unsafe IEnumerator.Current object global::System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { int size = collectionRef.Count; bool moveOkay = (currentIndex+1 < size) && (size == currentSize); if (moveOkay) { currentIndex++; currentObject = collectionRef[currentIndex]; } else { currentObject = null; } return moveOkay; } public void Reset() { currentIndex = -1; currentObject = null; if (collectionRef.Count != currentSize) { throw new global::System.InvalidOperationException("Collection modified."); } } public void Dispose() { currentIndex = -1; currentObject = null; } } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; array(); array(const array &other); size_type size() const; bool empty() const; %rename(Fill) fill; void fill(const value_type& value); %rename(Swap) swap; void swap(array& other); %extend { T getitemcopy(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) return (*$self)[index]; else throw std::out_of_range("index"); } const_reference getitem(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) return (*$self)[index]; else throw std::out_of_range("index"); } void setitem(int index, const_reference val) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) (*$self)[index] = val; else throw std::out_of_range("index"); } void Reverse() { std::reverse($self->begin(), $self->end()); } void Reverse(int index, int count) throw (std::out_of_range, std::invalid_argument) { if (index < 0) throw std::out_of_range("index"); if (count < 0) throw std::out_of_range("count"); if (index >= (int)$self->size()+1 || index+count > (int)$self->size()) throw std::invalid_argument("invalid range"); std::reverse($self->begin()+index, $self->begin()+index+count); } } %enddef %csmethodmodifiers std::array::empty "private" %csmethodmodifiers std::array::getitemcopy "private" %csmethodmodifiers std::array::getitem "private" %csmethodmodifiers std::array::setitem "private" %csmethodmodifiers std::array::size "private" namespace std { template class array { SWIG_STD_ARRAY_INTERNAL(T, N) }; } swig-4.0.2/Lib/csharp/arrays_csharp.i0000644000175000017500000001623613667507523017373 0ustar williamwilliam/* ----------------------------------------------------------------------------- * arrays_csharp.i * * This file contains a two approaches to marshaling arrays. The first uses * default p/invoke marshaling and the second uses pinning of the arrays. * * Default marshaling approach * ---------------------------- * Array typemaps using default p/invoke marshaling. The data is copied to a separately * allocated buffer when passing over the managed-native boundary. * * There are separate typemaps for in, out and inout arrays to enable avoiding * unnecessary copying. * * Example usage: * * %include "arrays_csharp.i" * %apply int INPUT[] { int* sourceArray } * %apply int OUTPUT[] { int* targetArray } * void myArrayCopy( int* sourceArray, int* targetArray, int nitems ); * * %apply int INOUT[] { int* array1, int *array2 } * void myArraySwap( int* array1, int* array2, int nitems ); * * If handling large arrays you should consider using the pinning array typemaps * described next. * * Pinning approach * ---------------- * Array typemaps using pinning. These typemaps pin the managed array given * as parameter and pass a pointer to it to the c/c++ side. This is very * efficient as no copying is done (unlike in the default array marshaling), * but it makes garbage collection more difficult. When considering using * these typemaps, think carefully whether you have callbacks that may cause * the control to re-enter the managed side from within the call (and produce * garbage for the gc) or whether other threads may produce enough garbage to * trigger gc while the call is being executed. In those cases it may be * wiser to use the default marshaling typemaps. * * Please note that when using fixed arrays, you have to mark your corresponding * module class method unsafe using * %csmethodmodifiers "public unsafe" * (the visibility of the method is up to you). * * Example usage: * * %include "arrays_csharp.i" * %apply int FIXED[] { int* sourceArray, int *targetArray } * %csmethodmodifiers myArrayCopy "public unsafe"; * void myArrayCopy( int *sourceArray, int* targetArray, int nitems ); * * ----------------------------------------------------------------------------- */ %define CSHARP_ARRAYS( CTYPE, CSTYPE ) // input only arrays %typemap(ctype) CTYPE INPUT[] "CTYPE*" %typemap(cstype) CTYPE INPUT[] "CSTYPE[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray)]") CTYPE INPUT[] "CSTYPE[]" %typemap(csin) CTYPE INPUT[] "$csinput" %typemap(in) CTYPE INPUT[] "$1 = $input;" %typemap(freearg) CTYPE INPUT[] "" %typemap(argout) CTYPE INPUT[] "" // output only arrays %typemap(ctype) CTYPE OUTPUT[] "CTYPE*" %typemap(cstype) CTYPE OUTPUT[] "CSTYPE[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray)]") CTYPE OUTPUT[] "CSTYPE[]" %typemap(csin) CTYPE OUTPUT[] "$csinput" %typemap(in) CTYPE OUTPUT[] "$1 = $input;" %typemap(freearg) CTYPE OUTPUT[] "" %typemap(argout) CTYPE OUTPUT[] "" // inout arrays %typemap(ctype) CTYPE INOUT[] "CTYPE*" %typemap(cstype) CTYPE INOUT[] "CSTYPE[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray)]") CTYPE INOUT[] "CSTYPE[]" %typemap(csin) CTYPE INOUT[] "$csinput" %typemap(in) CTYPE INOUT[] "$1 = $input;" %typemap(freearg) CTYPE INOUT[] "" %typemap(argout) CTYPE INOUT[] "" %enddef // CSHARP_ARRAYS CSHARP_ARRAYS(signed char, sbyte) CSHARP_ARRAYS(unsigned char, byte) CSHARP_ARRAYS(short, short) CSHARP_ARRAYS(unsigned short, ushort) CSHARP_ARRAYS(int, int) CSHARP_ARRAYS(unsigned int, uint) // FIXME - on Unix 64 bit, long is 8 bytes but is 4 bytes on Windows 64 bit. // How can this be handled sensibly? // See e.g. http://www.xml.com/ldd/chapter/book/ch10.html CSHARP_ARRAYS(long, int) CSHARP_ARRAYS(unsigned long, uint) CSHARP_ARRAYS(long long, long) CSHARP_ARRAYS(unsigned long long, ulong) CSHARP_ARRAYS(float, float) CSHARP_ARRAYS(double, double) // By default C# will marshal bools as 4 bytes // UnmanagedType.I1 will change this to 1 byte // FIXME - When running on mono ArraySubType appears to be ignored and bools will be marshalled as 4-byte // https://github.com/mono/mono/issues/15592 // input only arrays %typemap(ctype) bool INPUT[] "bool*" %typemap(cstype) bool INPUT[] "bool[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray,ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]") bool INPUT[] "bool[]" %typemap(csin) bool INPUT[] "$csinput" %typemap(in) bool INPUT[] %{ $1 = $input; %} %typemap(freearg) bool INPUT[] "" %typemap(argout) bool INPUT[] "" // output only arrays %typemap(ctype) bool OUTPUT[] "bool*" %typemap(cstype) bool OUTPUT[] "bool[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray,ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]") bool OUTPUT[] "bool[]" %typemap(csin) bool OUTPUT[] "$csinput" %typemap(in) bool OUTPUT[] %{ $1 = $input; %} %typemap(freearg) bool OUTPUT[] "" %typemap(argout) bool OUTPUT[] "" // inout arrays %typemap(ctype) bool INOUT[] "bool*" %typemap(cstype) bool INOUT[] "bool[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray,ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]") bool INOUT[] "bool[]" %typemap(csin) bool INOUT[] "$csinput" %typemap(in) bool INOUT[] %{ $1 = $input; %} %typemap(freearg) bool INOUT[] "" %typemap(argout) bool INOUT[] "" %define CSHARP_ARRAYS_FIXED( CTYPE, CSTYPE ) %typemap(ctype) CTYPE FIXED[] "CTYPE*" %typemap(imtype) CTYPE FIXED[] "global::System.IntPtr" %typemap(cstype) CTYPE FIXED[] "CSTYPE[]" %typemap(csin, pre= " fixed ( CSTYPE* swig_ptrTo_$csinput = $csinput ) {", terminator=" }") CTYPE FIXED[] "(global::System.IntPtr)swig_ptrTo_$csinput" %typemap(in) CTYPE FIXED[] "$1 = $input;" %typemap(freearg) CTYPE FIXED[] "" %typemap(argout) CTYPE FIXED[] "" %enddef // CSHARP_ARRAYS_FIXED CSHARP_ARRAYS_FIXED(signed char, sbyte) CSHARP_ARRAYS_FIXED(unsigned char, byte) CSHARP_ARRAYS_FIXED(short, short) CSHARP_ARRAYS_FIXED(unsigned short, ushort) CSHARP_ARRAYS_FIXED(int, int) CSHARP_ARRAYS_FIXED(unsigned int, uint) CSHARP_ARRAYS_FIXED(long, int) CSHARP_ARRAYS_FIXED(unsigned long, uint) CSHARP_ARRAYS_FIXED(long long, long) CSHARP_ARRAYS_FIXED(unsigned long long, ulong) CSHARP_ARRAYS_FIXED(float, float) CSHARP_ARRAYS_FIXED(double, double) CSHARP_ARRAYS_FIXED(bool, bool) swig-4.0.2/Lib/csharp/swigtype_inout.i0000644000175000017500000000267613667507523017626 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigtype_inout.i * * Pointer pointer and pointer reference handling typemap library for non-primitive types * * These mappings provide support for input/output arguments and common * uses for C/C++ pointer references and pointer to pointers. * * These are named typemaps (OUTPUT) and can be used like any named typemap. * Alternatively they can be made the default by using %apply: * %apply SWIGTYPE *& OUTPUT { SWIGTYPE *& } * ----------------------------------------------------------------------------- */ /* * OUTPUT typemaps. Example usage wrapping: * * void f(XXX *& x) { x = new XXX(111); } * * would be: * * XXX x = null; * f(out x); * // use x * x.Dispose(); // manually clear memory or otherwise leave out and leave it to the garbage collector */ %typemap(ctype) SWIGTYPE *& OUTPUT "void **" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE *& OUTPUT "out global::System.IntPtr" %typemap(cstype) SWIGTYPE *& OUTPUT "out $*csclassname" %typemap(csin, pre=" global::System.IntPtr cPtr_$csinput = global::System.IntPtr.Zero;", post=" $csinput = (cPtr_$csinput == global::System.IntPtr.Zero) ? null : new $*csclassname(cPtr_$csinput, true);", cshin="out $csinput") SWIGTYPE *& OUTPUT "out cPtr_$csinput" %typemap(in) SWIGTYPE *& OUTPUT %{ $1 = ($1_ltype)$input; %} %typemap(freearg) SWIGTYPE *& OUTPUT "" swig-4.0.2/Lib/csharp/csharp.swg0000644000175000017500000011752513667507523016365 0ustar williamwilliam/* ----------------------------------------------------------------------------- * csharp.swg * * C# typemaps * ----------------------------------------------------------------------------- */ %include /* The ctype, imtype and cstype typemaps work together and so there should be one of each. * The ctype typemap contains the PInvoke type used in the PInvoke (C/C++) code. * The imtype typemap contains the C# type used in the intermediary class. * The cstype typemap contains the C# type used in the C# proxy classes, type wrapper classes and module class. */ /* SWIG 3 no longer inserts using directives into generated C# code. For backwards compatibility, the SWIG2_CSHARP macro can be defined to have SWIG 3 generate using directives similar to those generated by SWIG 2. */ #ifdef SWIG2_CSHARP %typemap(csimports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "\nusing global::System;\nusing global::System.Runtime.InteropServices;\n" %pragma(csharp) moduleimports=%{ using global::System; using global::System.Runtime.InteropServices; %} %pragma(csharp) imclassimports=%{ using global::System; using global::System.Runtime.InteropServices; %} #endif /* Fragments */ %fragment("SWIG_PackData", "header") { /* Pack binary data into a string */ SWIGINTERN char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } } %fragment("SWIG_UnPackData", "header") { /* Unpack binary data from a string */ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } } /* Primitive types */ %typemap(ctype) bool, const bool & "unsigned int" %typemap(ctype) char, const char & "char" %typemap(ctype) signed char, const signed char & "signed char" %typemap(ctype) unsigned char, const unsigned char & "unsigned char" %typemap(ctype) short, const short & "short" %typemap(ctype) unsigned short, const unsigned short & "unsigned short" %typemap(ctype) int, const int & "int" %typemap(ctype) unsigned int, const unsigned int & "unsigned int" %typemap(ctype) long, const long & "long" %typemap(ctype) unsigned long, const unsigned long & "unsigned long" %typemap(ctype) long long, const long long & "long long" %typemap(ctype) unsigned long long, const unsigned long long & "unsigned long long" %typemap(ctype) float, const float & "float" %typemap(ctype) double, const double & "double" %typemap(ctype) void "void" %typemap(imtype) bool, const bool & "bool" %typemap(imtype) char, const char & "char" %typemap(imtype) signed char, const signed char & "sbyte" %typemap(imtype) unsigned char, const unsigned char & "byte" %typemap(imtype) short, const short & "short" %typemap(imtype) unsigned short, const unsigned short & "ushort" %typemap(imtype) int, const int & "int" %typemap(imtype) unsigned int, const unsigned int & "uint" %typemap(imtype) long, const long & "int" %typemap(imtype) unsigned long, const unsigned long & "uint" %typemap(imtype) long long, const long long & "long" %typemap(imtype) unsigned long long, const unsigned long long & "ulong" %typemap(imtype) float, const float & "float" %typemap(imtype) double, const double & "double" %typemap(imtype) void "void" %typemap(cstype) bool, const bool & "bool" %typemap(cstype) char, const char & "char" %typemap(cstype) signed char, const signed char & "sbyte" %typemap(cstype) unsigned char, const unsigned char & "byte" %typemap(cstype) short, const short & "short" %typemap(cstype) unsigned short, const unsigned short & "ushort" %typemap(cstype) int, const int & "int" %typemap(cstype) unsigned int, const unsigned int & "uint" %typemap(cstype) long, const long & "int" %typemap(cstype) unsigned long, const unsigned long & "uint" %typemap(cstype) long long, const long long & "long" %typemap(cstype) unsigned long long, const unsigned long long & "ulong" %typemap(cstype) float, const float & "float" %typemap(cstype) double, const double & "double" %typemap(cstype) void "void" %typemap(ctype) char *, char *&, char[ANY], char[] "char *" %typemap(imtype) char *, char *&, char[ANY], char[] "string" %typemap(cstype) char *, char *&, char[ANY], char[] "string" /* Non primitive types */ %typemap(ctype) SWIGTYPE "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE "$&csclassname" %typemap(ctype) SWIGTYPE [] "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE [] "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE [] "$csclassname" %typemap(ctype) SWIGTYPE * "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE * "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE * "$csclassname" %typemap(ctype) SWIGTYPE & "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE & "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE & "$csclassname" %typemap(ctype) SWIGTYPE && "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE && "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE && "$csclassname" /* pointer to a class member */ %typemap(ctype) SWIGTYPE (CLASS::*) "char *" %typemap(imtype) SWIGTYPE (CLASS::*) "string" %typemap(cstype) SWIGTYPE (CLASS::*) "$csclassname" /* The following are the in and out typemaps. These are the PInvoke code generating typemaps for converting from C# to C and visa versa. */ /* primitive types */ %typemap(in) bool %{ $1 = $input ? true : false; %} %typemap(directorout) bool %{ $result = $input ? true : false; %} %typemap(csdirectorin) bool "$iminput" %typemap(csdirectorout) bool "$cscall" %typemap(in) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $1 = ($1_ltype)$input; %} %typemap(directorout) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $result = ($1_ltype)$input; %} %typemap(directorin) bool "$input = $1;" %typemap(directorin) char "$input = $1;" %typemap(directorin) signed char "$input = $1;" %typemap(directorin) unsigned char "$input = $1;" %typemap(directorin) short "$input = $1;" %typemap(directorin) unsigned short "$input = $1;" %typemap(directorin) int "$input = $1;" %typemap(directorin) unsigned int "$input = $1;" %typemap(directorin) long "$input = $1;" %typemap(directorin) unsigned long "$input = (unsigned long)$1;" %typemap(directorin) long long "$input = $1;" %typemap(directorin) unsigned long long "$input = $1;" %typemap(directorin) float "$input = $1;" %typemap(directorin) double "$input = $1;" %typemap(csdirectorin) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double "$iminput" %typemap(csdirectorout) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double "$cscall" %typemap(out) bool %{ $result = $1; %} %typemap(out) char %{ $result = $1; %} %typemap(out) signed char %{ $result = $1; %} %typemap(out) unsigned char %{ $result = $1; %} %typemap(out) short %{ $result = $1; %} %typemap(out) unsigned short %{ $result = $1; %} %typemap(out) int %{ $result = $1; %} %typemap(out) unsigned int %{ $result = $1; %} %typemap(out) long %{ $result = $1; %} %typemap(out) unsigned long %{ $result = (unsigned long)$1; %} %typemap(out) long long %{ $result = $1; %} %typemap(out) unsigned long long %{ $result = $1; %} %typemap(out) float %{ $result = $1; %} %typemap(out) double %{ $result = $1; %} /* char * - treat as String */ %typemap(in) char * %{ $1 = ($1_ltype)$input; %} %typemap(out) char * %{ $result = SWIG_csharp_string_callback((const char *)$1); %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) char * %{ $result = ($1_ltype)$input; %} %typemap(directorin) char * %{ $input = SWIG_csharp_string_callback((const char *)$1); %} %typemap(csdirectorin) char * "$iminput" %typemap(csdirectorout) char * "$cscall" /* char *& - treat as String */ %typemap(in) char *& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) char *& %{ if ($1) $result = SWIG_csharp_string_callback((const char *)*$1); %} %typemap(out, null="") void "" %typemap(csdirectorin) void "$iminput" %typemap(csdirectorout) void "$cscall" %typemap(directorin) void "" /* primitive types by const reference */ %typemap(in) const bool & ($*1_ltype temp) %{ temp = $input ? true : false; $1 = &temp; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const bool & %{ static $*1_ltype temp; temp = $input ? true : false; $result = &temp; %} %typemap(csdirectorin) const bool & "$iminput" %typemap(csdirectorout) const bool & "$cscall" %typemap(in) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & %{ static $*1_ltype temp; temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin) const bool & "$input = $1;" %typemap(directorin) const char & "$input = $1;" %typemap(directorin) const signed char & "$input = $1;" %typemap(directorin) const unsigned char & "$input = $1;" %typemap(directorin) const short & "$input = $1;" %typemap(directorin) const unsigned short & "$input = $1;" %typemap(directorin) const int & "$input = $1;" %typemap(directorin) const unsigned int & "$input = $1;" %typemap(directorin) const long & "$input = $1;" %typemap(directorin) const unsigned long & "$input = $1;" %typemap(directorin) const long long & "$input = $1;" %typemap(directorin) const unsigned long long & "$input = $1;" %typemap(directorin) const float & "$input = $1;" %typemap(directorin) const double & "$input = $1;" %typemap(csdirectorin) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) "$iminput" %typemap(csdirectorout) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) "$cscall" %typemap(out) const bool & %{ $result = *$1; %} %typemap(out) const char & %{ $result = *$1; %} %typemap(out) const signed char & %{ $result = *$1; %} %typemap(out) const unsigned char & %{ $result = *$1; %} %typemap(out) const short & %{ $result = *$1; %} %typemap(out) const unsigned short & %{ $result = *$1; %} %typemap(out) const int & %{ $result = *$1; %} %typemap(out) const unsigned int & %{ $result = *$1; %} %typemap(out) const long & %{ $result = *$1; %} %typemap(out) const unsigned long & %{ $result = (unsigned long)*$1; %} %typemap(out) const long long & %{ $result = *$1; %} %typemap(out) const unsigned long long & %{ $result = *$1; %} %typemap(out) const float & %{ $result = *$1; %} %typemap(out) const double & %{ $result = *$1; %} /* Default handling. Object passed by value. Convert to a pointer */ %typemap(in, canthrow=1) SWIGTYPE ($&1_type argp) %{ argp = ($&1_ltype)$input; if (!argp) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } $1 = *argp; %} %typemap(directorout) SWIGTYPE %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Unexpected null return for type $1_type", 0); return $null; } $result = *($&1_ltype)$input; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{ $result = new $1_ltype((const $1_ltype &)$1); %} #else { $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); $result = $1ptr; } #endif %typemap(directorin) SWIGTYPE %{ $input = (void *)new $1_ltype((const $1_ltype &)$1); %} %typemap(csdirectorin) SWIGTYPE "new $&csclassname($iminput, true)" %typemap(csdirectorout) SWIGTYPE "$&csclassname.getCPtr($cscall).Handle" /* Generic pointers and references */ %typemap(in) SWIGTYPE * %{ $1 = ($1_ltype)$input; %} %typemap(in, fragment="SWIG_UnPackData") SWIGTYPE (CLASS::*) %{ SWIG_UnpackData($input, (void *)&$1, sizeof($1)); %} %typemap(in, canthrow=1) SWIGTYPE & %{ $1 = ($1_ltype)$input; if (!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type type is null", 0); return $null; } %} %typemap(in, canthrow=1) SWIGTYPE && %{ $1 = ($1_ltype)$input; if (!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type type is null", 0); return $null; } %} %typemap(out) SWIGTYPE * %{ $result = (void *)$1; %} %typemap(out, fragment="SWIG_PackData") SWIGTYPE (CLASS::*) %{ char buf[128]; char *data = SWIG_PackData(buf, (void *)&$1, sizeof($1)); *data = '\0'; $result = SWIG_csharp_string_callback(buf); %} %typemap(out) SWIGTYPE & %{ $result = (void *)$1; %} %typemap(out) SWIGTYPE && %{ $result = (void *)$1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE * %{ $result = ($1_ltype)$input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE (CLASS::*) %{ $result = ($1_ltype)$input; %} %typemap(directorin) SWIGTYPE * %{ $input = (void *) $1; %} %typemap(directorin) SWIGTYPE (CLASS::*) %{ $input = (void *) $1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Unexpected null return for type $1_type", 0); return $null; } $result = ($1_ltype)$input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE && %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Unexpected null return for type $1_type", 0); return $null; } $result = ($1_ltype)$input; %} %typemap(directorin) SWIGTYPE & %{ $input = ($1_ltype) &$1; %} %typemap(directorin) SWIGTYPE && %{ $input = ($1_ltype) &$1; %} %typemap(csdirectorin) SWIGTYPE *, SWIGTYPE (CLASS::*) "($iminput == global::System.IntPtr.Zero) ? null : new $csclassname($iminput, false)" %typemap(csdirectorin) SWIGTYPE & "new $csclassname($iminput, false)" %typemap(csdirectorin) SWIGTYPE && "new $csclassname($iminput, false)" %typemap(csdirectorout) SWIGTYPE *, SWIGTYPE (CLASS::*), SWIGTYPE &, SWIGTYPE && "$csclassname.getCPtr($cscall).Handle" /* Default array handling */ %typemap(in) SWIGTYPE [] %{ $1 = ($1_ltype)$input; %} %typemap(out) SWIGTYPE [] %{ $result = $1; %} /* char arrays - treat as String */ %typemap(in) char[ANY], char[] %{ $1 = ($1_ltype)$input; %} %typemap(out) char[ANY], char[] %{ $result = SWIG_csharp_string_callback((const char *)$1); %} %typemap(directorout) char[ANY], char[] %{ $result = ($1_ltype)$input; %} %typemap(directorin) char[ANY], char[] %{ $input = SWIG_csharp_string_callback((const char *)$1); %} %typemap(csdirectorin) char[ANY], char[] "$iminput" %typemap(csdirectorout) char[ANY], char[] "$cscall" /* Typecheck typemaps - The purpose of these is merely to issue a warning for overloaded C++ functions * that cannot be overloaded in C# as more than one C++ type maps to a single C# type */ %typecheck(SWIG_TYPECHECK_BOOL) bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) char, const char & "" %typecheck(SWIG_TYPECHECK_INT8) signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_UINT8) unsigned char, const unsigned char & "" %typecheck(SWIG_TYPECHECK_INT16) short, const short & "" %typecheck(SWIG_TYPECHECK_UINT16) unsigned short, const unsigned short & "" %typecheck(SWIG_TYPECHECK_INT32) int, long, const int &, const long & "" %typecheck(SWIG_TYPECHECK_UINT32) unsigned int, unsigned long, const unsigned int &, const unsigned long & "" %typecheck(SWIG_TYPECHECK_INT64) long long, const long long & "" %typecheck(SWIG_TYPECHECK_UINT64) unsigned long long, const unsigned long long & "" %typecheck(SWIG_TYPECHECK_FLOAT) float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) double, const double & "" %typecheck(SWIG_TYPECHECK_STRING) char *, char *&, char[ANY], char[] "" %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *const&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" /* Exception handling */ %typemap(throws, canthrow=1) int, long, short, unsigned int, unsigned long, unsigned short %{ char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, error_msg); return $null; %} %typemap(throws, canthrow=1) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [ANY] %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(throws, canthrow=1) char * %{ SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1); return $null; %} /* Typemaps for code generation in proxy classes and C# type wrapper classes */ /* The csin typemap is used for converting function parameter types from the type * used in the proxy, module or type wrapper class to the type used in the PInvoke class. */ %typemap(csin) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double & "$csinput" %typemap(csin) char *, char *&, char[ANY], char[] "$csinput" %typemap(csin) SWIGTYPE "$&csclassname.getCPtr($csinput)" %typemap(csin) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "$csclassname.getCPtr($csinput)" %typemap(csin) SWIGTYPE (CLASS::*) "$csclassname.getCMemberPtr($csinput)" /* The csout typemap is used for converting function return types from the return type * used in the PInvoke class to the type returned by the proxy, module or type wrapper class. * The $excode special variable is replaced by the excode typemap attribute code if the * method can throw any exceptions from unmanaged code, otherwise replaced by nothing. */ // Macro used by the $excode special variable %define SWIGEXCODE "\n if ($imclassname.SWIGPendingException.Pending) throw $imclassname.SWIGPendingException.Retrieve();" %enddef %define SWIGEXCODE2 "\n if ($imclassname.SWIGPendingException.Pending) throw $imclassname.SWIGPendingException.Retrieve();" %enddef %typemap(csout, excode=SWIGEXCODE) bool, const bool & { bool ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) char, const char & { char ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) signed char, const signed char & { sbyte ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned char, const unsigned char & { byte ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) short, const short & { short ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned short, const unsigned short & { ushort ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) int, const int & { int ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned int, const unsigned int & { uint ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) long, const long & { int ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned long, const unsigned long & { uint ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) long long, const long long & { long ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned long long, const unsigned long long & { ulong ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) float, const float & { float ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) double, const double & { double ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) char *, char *&, char[ANY], char[] { string ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) void { $imcall;$excode } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE { $&csclassname ret = new $&csclassname($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE & { $csclassname ret = new $csclassname($imcall, $owner);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE && { $csclassname ret = new $csclassname($imcall, $owner);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE *, SWIGTYPE [] { global::System.IntPtr cPtr = $imcall; $csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $csclassname(cPtr, $owner);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE (CLASS::*) { string cMemberPtr = $imcall; $csclassname ret = (cMemberPtr == null) ? null : new $csclassname(cMemberPtr, $owner);$excode return ret; } /* Properties */ %typemap(csvarin, excode=SWIGEXCODE2) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ set { $imcall;$excode } %} %typemap(csvarin, excode=SWIGEXCODE2) char *, char *&, char[ANY], char[] %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) bool, const bool & %{ get { bool ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) char, const char & %{ get { char ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) signed char, const signed char & %{ get { sbyte ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned char, const unsigned char & %{ get { byte ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) short, const short & %{ get { short ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned short, const unsigned short & %{ get { ushort ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) int, const int & %{ get { int ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned int, const unsigned int & %{ get { uint ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) long, const long & %{ get { int ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned long, const unsigned long & %{ get { uint ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) long long, const long long & %{ get { long ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned long long, const unsigned long long & %{ get { ulong ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) float, const float & %{ get { float ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) double, const double & %{ get { double ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) char *, char *&, char[ANY], char[] %{ get { string ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) void %{ get { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE %{ get { $&csclassname ret = new $&csclassname($imcall, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE & %{ get { $csclassname ret = new $csclassname($imcall, $owner);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE && %{ get { $csclassname ret = new $csclassname($imcall, $owner);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE *, SWIGTYPE [] %{ get { global::System.IntPtr cPtr = $imcall; $csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $csclassname(cPtr, $owner);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE (CLASS::*) %{ get { string cMemberPtr = $imcall; $csclassname ret = (cMemberPtr == null) ? null : new $csclassname(cMemberPtr, $owner);$excode return ret; } %} /* Pointer reference typemaps */ %typemap(ctype) SWIGTYPE *const& "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE *const& "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE *const& "$*csclassname" %typemap(csin) SWIGTYPE *const& "$*csclassname.getCPtr($csinput)" %typemap(csout, excode=SWIGEXCODE) SWIGTYPE *const& { global::System.IntPtr cPtr = $imcall; $*csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $*csclassname(cPtr, $owner);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE) SWIGTYPE *const& %{ get { global::System.IntPtr cPtr = $imcall; $*csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $*csclassname(cPtr, $owner);$excode return ret; } %} %typemap(in) SWIGTYPE *const& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)$input; $1 = ($1_ltype)&temp; %} %typemap(out) SWIGTYPE *const& %{ $result = (void *)*$1; %} %typemap(directorin) SWIGTYPE *const& %{ $input = (void *) $1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) SWIGTYPE *const& %{ static $*1_ltype swig_temp; swig_temp = ($*1_ltype)$input; $result = &swig_temp; %} %typemap(csdirectorin) SWIGTYPE *const& "($iminput == global::System.IntPtr.Zero) ? null : new $*csclassname($iminput, false)" %typemap(csdirectorout) SWIGTYPE *const& "$*csclassname.getCPtr($cscall).Handle" /* Marshal C/C++ pointer to global::System.IntPtr */ %typemap(ctype) void *VOID_INT_PTR "void *" %typemap(imtype) void *VOID_INT_PTR "global::System.IntPtr" %typemap(cstype) void *VOID_INT_PTR "global::System.IntPtr" %typemap(in) void *VOID_INT_PTR %{ $1 = ($1_ltype)$input; %} %typemap(out) void *VOID_INT_PTR %{ $result = (void *)$1; %} %typemap(csin) void *VOID_INT_PTR "$csinput" %typemap(csout, excode=SWIGEXCODE) void *VOID_INT_PTR { global::System.IntPtr ret = $imcall;$excode return ret; } %typemap(csdirectorin) void *VOID_INT_PTR "$iminput" %typemap(csdirectorout) void *VOID_INT_PTR "$cscall" /* Typemaps used for the generation of proxy and type wrapper class code */ %typemap(csbase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(csclassmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public class" %typemap(cscode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(csinterfaces) SWIGTYPE "global::System.IDisposable" %typemap(csinterfaces) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(csinterfaces_derived) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" // csbody typemaps... these are in macros so that the visibility of the methods can be easily changed by users. %define SWIG_CSBODY_PROXY(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) // Proxy classes (base classes, ie, not derived classes) %typemap(csbody) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; protected bool swigCMemOwn; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} // Derived proxy classes %typemap(csbody_derived) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %enddef %define SWIG_CSBODY_TYPEWRAPPER(PTRCTOR_VISIBILITY, DEFAULTCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) // Typewrapper classes %typemap(csbody) TYPE *, TYPE &, TYPE &&, TYPE [] %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool futureUse) { swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } DEFAULTCTOR_VISIBILITY $csclassname() { swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %typemap(csbody) TYPE (CLASS::*) %{ private string swigCMemberPtr; PTRCTOR_VISIBILITY $csclassname(string cMemberPtr, bool futureUse) { swigCMemberPtr = cMemberPtr; } DEFAULTCTOR_VISIBILITY $csclassname() { swigCMemberPtr = null; } CPTR_VISIBILITY static string getCMemberPtr($csclassname obj) { return obj.swigCMemberPtr; } %} %enddef /* Set the default csbody typemaps to use internal visibility. Use the macros to change to public if using multiple modules. */ SWIG_CSBODY_PROXY(internal, internal, SWIGTYPE) SWIG_CSBODY_TYPEWRAPPER(internal, protected, internal, SWIGTYPE) %typemap(csdispose) SWIGTYPE %{ ~$csclassname() { Dispose(false); } public void Dispose() { Dispose(true); global::System.GC.SuppressFinalize(this); } %} %typemap(csdispose_derived) SWIGTYPE "" %typemap(csconstruct, excode=SWIGEXCODE,directorconnect="\n SwigDirectorConnect();") SWIGTYPE %{: this($imcall, true) {$excode$directorconnect } %} %typemap(csdisposing, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") SWIGTYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } } } %typemap(csdisposing_derived, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") SWIGTYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } base.Dispose(disposing); } } %typemap(directordisconnect, methodname="swigDirectorDisconnect") SWIGTYPE %{ protected void $methodname() { swigCMemOwn = false; $imcall; } %} /* C# specific directives */ #define %csconst(flag) %feature("cs:const","flag") #define %csconstvalue(value) %feature("cs:constvalue",value) #define %csenum(wrapapproach) %feature("cs:enum","wrapapproach") #define %csmethodmodifiers %feature("cs:methodmodifiers") #define %csnothrowexception %feature("except") #define %csattributes %feature("cs:attributes") #define %proxycode %insert("proxycode") %pragma(csharp) imclassclassmodifiers="class" %pragma(csharp) moduleclassmodifiers="public class" /* Some ANSI C typemaps */ %apply unsigned long { size_t }; %apply const unsigned long & { const size_t & }; /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* csharp keywords */ %include // Default enum handling %include // For vararg handling in macros, from swigmacros.swg #define %arg(X...) X /* // Alternative char * typemaps. %pragma(csharp) imclasscode=%{ public class SWIGStringMarshal : global::System.IDisposable { public readonly global::System.Runtime.InteropServices.HandleRef swigCPtr; public SWIGStringMarshal(string str) { swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, global::System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(str)); } public virtual void Dispose() { global::System.Runtime.InteropServices.Marshal.FreeHGlobal(swigCPtr.Handle); global::System.GC.SuppressFinalize(this); } } %} %typemap(imtype, out="global::System.IntPtr") char *, char[ANY], char[] "global::System.Runtime.InteropServices.HandleRef" %typemap(out) char *, char[ANY], char[] %{ $result = $1; %} %typemap(csin) char *, char[ANY], char[] "new $imclassname.SWIGStringMarshal($csinput).swigCPtr" %typemap(csout, excode=SWIGEXCODE) char *, char[ANY], char[] { string ret = global::System.Runtime.InteropServices.Marshal.PtrToStringAnsi($imcall);$excode return ret; } %typemap(csvarin, excode=SWIGEXCODE2) char *, char[ANY], char[] %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) char *, char[ANY], char[] %{ get { string ret = global::System.Runtime.InteropServices.Marshal.PtrToStringAnsi($imcall);$excode return ret; } %} */ swig-4.0.2/Lib/csharp/std_pair.i0000644000175000017500000000140513667507523016327 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.2/Lib/csharp/enumsimple.swg0000644000175000017500000000550513667507523017255 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumsimple.swg * * This file provides backwards compatible enum wrapping. SWIG versions 1.3.21 * and earlier wrapped global enums with constant integers in the module * class. Enums declared within a C++ class were wrapped by constant integers * in the C# proxy class. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(ctype) const enum SWIGTYPE & "int" %typemap(imtype) const enum SWIGTYPE & "int" %typemap(cstype) const enum SWIGTYPE & "int" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (int)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin) const enum SWIGTYPE & "$input = (int)$1;" %typemap(csdirectorin) const enum SWIGTYPE & "$iminput" %typemap(csdirectorout) const enum SWIGTYPE & "$cscall" %typecheck(SWIG_TYPECHECK_INT32) const enum SWIGTYPE & "" %typemap(throws, canthrow=1) const enum SWIGTYPE & %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) const enum SWIGTYPE & "$csinput" %typemap(csout, excode=SWIGEXCODE) const enum SWIGTYPE & { int ret = $imcall;$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) const enum SWIGTYPE & %{ get { int ret = $imcall;$excode return ret; } %} // enum SWIGTYPE typemaps %typemap(ctype) enum SWIGTYPE "int" %typemap(imtype) enum SWIGTYPE "int" %typemap(cstype) enum SWIGTYPE "int" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (int)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE "$input = (int)$1;" %typemap(csdirectorin) enum SWIGTYPE "$iminput" %typemap(csdirectorout) enum SWIGTYPE "$cscall" %typecheck(SWIG_TYPECHECK_INT32) enum SWIGTYPE "" %typemap(throws, canthrow=1) enum SWIGTYPE %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) enum SWIGTYPE "$csinput" %typemap(csout, excode=SWIGEXCODE) enum SWIGTYPE { int ret = $imcall;$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) enum SWIGTYPE %{ get { int ret = $imcall;$excode return ret; } %} %typemap(csbase) enum SWIGTYPE "" %typemap(csclassmodifiers) enum SWIGTYPE "" %typemap(cscode) enum SWIGTYPE "" %typemap(csimports) enum SWIGTYPE "" %typemap(csinterfaces) enum SWIGTYPE "" %typemap(csbody) enum SWIGTYPE "" %csenum(simple); swig-4.0.2/Lib/csharp/enums.swg0000644000175000017500000000557613667507523016236 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enums.swg * * Include this file in order for C/C++ enums to be wrapped by proper C# enums. * Note that the PINVOKE layer handles the enum as an int. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(ctype) const enum SWIGTYPE & "int" %typemap(imtype) const enum SWIGTYPE & "int" %typemap(cstype) const enum SWIGTYPE & "$*csclassname" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (int)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin) const enum SWIGTYPE & "$input = (int)$1;" %typemap(csdirectorin) const enum SWIGTYPE & "($*csclassname)$iminput" %typemap(csdirectorout) const enum SWIGTYPE & "(int)$cscall" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(throws, canthrow=1) const enum SWIGTYPE & %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) const enum SWIGTYPE & "(int)$csinput" %typemap(csout, excode=SWIGEXCODE) const enum SWIGTYPE & { $*csclassname ret = ($*csclassname)$imcall;$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) const enum SWIGTYPE & %{ get { $*csclassname ret = ($*csclassname)$imcall;$excode return ret; } %} // enum SWIGTYPE typemaps %typemap(ctype) enum SWIGTYPE "int" %typemap(imtype) enum SWIGTYPE "int" %typemap(cstype) enum SWIGTYPE "$csclassname" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (int)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE "$input = (int)$1;" %typemap(csdirectorin) enum SWIGTYPE "($csclassname)$iminput" %typemap(csdirectorout) enum SWIGTYPE "(int)$cscall" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(throws, canthrow=1) enum SWIGTYPE %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) enum SWIGTYPE "(int)$csinput" %typemap(csout, excode=SWIGEXCODE) enum SWIGTYPE { $csclassname ret = ($csclassname)$imcall;$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) enum SWIGTYPE %{ get { $csclassname ret = ($csclassname)$imcall;$excode return ret; } %} %typemap(csbase) enum SWIGTYPE "" %typemap(csclassmodifiers) enum SWIGTYPE "public enum" %typemap(cscode) enum SWIGTYPE "" %typemap(csimports) enum SWIGTYPE "" %typemap(csinterfaces) enum SWIGTYPE "" %typemap(csbody) enum SWIGTYPE "" %csenum(proper); swig-4.0.2/Lib/csharp/std_auto_ptr.i0000644000175000017500000000164013667507523017232 0ustar williamwilliam/* The typemaps here allow to handle functions returning std::auto_ptr<>, which is the most common use of this type. If you have functions taking it as parameter, these typemaps can't be used for them and you need to do something else (e.g. use shared_ptr<> which SWIG supports fully). */ %define %auto_ptr(TYPE) %typemap (ctype) std::auto_ptr "void *" %typemap (imtype, out="System.IntPtr") std::auto_ptr "HandleRef" %typemap (cstype) std::auto_ptr "$typemap(cstype, TYPE)" %typemap (out) std::auto_ptr %{ $result = (void *)$1.release(); %} %typemap(csout, excode=SWIGEXCODE) std::auto_ptr { System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %template() std::auto_ptr; %enddef namespace std { template class auto_ptr {}; } swig-4.0.2/Lib/csharp/stl.i0000644000175000017500000000044313667507523015325 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/csharp/std_list.i0000644000175000017500000003653313667507523016361 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * * SWIG typemaps for std::list * C# implementation * The C# wrapper is made to look and feel like a C# System.Collections.Generic.LinkedList<> collection. * * Note that IEnumerable<> is implemented in the proxy class which is useful for using LINQ with * C++ std::list wrappers. The ICollection<> interface is also implemented to provide enhanced functionality * whenever we are confident that the required C++ operator== is available. This is the case for when * T is a primitive type or a pointer. If T does define an operator==, then use the SWIG_STD_LIST_ENHANCED * macro to obtain this enhanced functionality, for example: * * SWIG_STD_LIST_ENHANCED(SomeNamespace::Klass) * %template(ListKlass) std::list; * ----------------------------------------------------------------------------- */ %include // MACRO for use within the std::list class body %define SWIG_STD_LIST_MINIMUM_INTERNAL(CSINTERFACE, CTYPE...) %typemap(csinterfaces) std::list< CTYPE > "global::System.IDisposable, global::System.Collections.IEnumerable, global::System.Collections.Generic.CSINTERFACE<$typemap(cstype, CTYPE)>\n"; %apply void *VOID_INT_PTR { std::list< CTYPE >::iterator * }; %proxycode %{ public $csclassname(global::System.Collections.IEnumerable c) : this() { if (c == null) throw new global::System.ArgumentNullException("c"); foreach ($typemap(cstype, CTYPE) element in c) { this.AddLast(element); } } public bool IsReadOnly { get { return false; } } public int Count { get { return (int)size(); } } public $csclassnameNode First { get { if (Count == 0) return null; return new $csclassnameNode(getFirstIter(), this); } } public $csclassnameNode Last { get { if (Count == 0) return null; return new $csclassnameNode(getLastIter(), this); } } public $csclassnameNode AddFirst($typemap(cstype, CTYPE) value) { push_front(value); return new $csclassnameNode(getFirstIter(), this); } public void AddFirst($csclassnameNode newNode) { ValidateNewNode(newNode); if (!newNode.inlist) { push_front(newNode.csharpvalue); newNode.iter = getFirstIter(); newNode.inlist = true; } else { throw new global::System.InvalidOperationException("The " + newNode.GetType().Name + " node already belongs to a " + this.GetType().Name); } } public $csclassnameNode AddLast($typemap(cstype, CTYPE) value) { push_back(value); return new $csclassnameNode(getLastIter(), this); } public void AddLast($csclassnameNode newNode) { ValidateNewNode(newNode); if (!newNode.inlist) { push_back(newNode.csharpvalue); newNode.iter = getLastIter(); newNode.inlist = true; } else { throw new global::System.InvalidOperationException("The " + newNode.GetType().Name + " node already belongs to a " + this.GetType().Name); } } public $csclassnameNode AddBefore($csclassnameNode node, $typemap(cstype, CTYPE) value) { return new $csclassnameNode(insertNode(node.iter, value), this); } public void AddBefore($csclassnameNode node, $csclassnameNode newNode) { ValidateNode(node); ValidateNewNode(newNode); if (!newNode.inlist) { newNode.iter = insertNode(node.iter, newNode.csharpvalue); newNode.inlist = true; } else { throw new global::System.InvalidOperationException("The " + newNode.GetType().Name + " node already belongs to a " + this.GetType().Name); } } public $csclassnameNode AddAfter($csclassnameNode node, $typemap(cstype, CTYPE) value) { node = node.Next; return new $csclassnameNode(insertNode(node.iter, value), this); } public void AddAfter($csclassnameNode node, $csclassnameNode newNode) { ValidateNode(node); ValidateNewNode(newNode); if (!newNode.inlist) { if (node == this.Last) AddLast(newNode); else { node = node.Next; newNode.iter = insertNode(node.iter, newNode.csharpvalue); newNode.inlist = true; } } else { throw new global::System.InvalidOperationException("The " + newNode.GetType().Name + " node already belongs to a " + this.GetType().Name); } } public void Add($typemap(cstype, CTYPE) value) { AddLast(value); } public void Remove($csclassnameNode node) { ValidateNode(node); eraseIter(node.iter); } public void CopyTo($typemap(cstype, CTYPE)[] array, int index) { if (array == null) throw new global::System.ArgumentNullException("array"); if (index < 0 || index > array.Length) throw new global::System.ArgumentOutOfRangeException("index", "Value is less than zero"); if (array.Rank > 1) throw new global::System.ArgumentException("Multi dimensional array.", "array"); $csclassnameNode node = this.First; if (node != null) { do { array[index++] = node.Value; node = node.Next; } while (node != null); } } internal void ValidateNode($csclassnameNode node) { if (node == null) { throw new System.ArgumentNullException("node"); } if (!node.inlist || node.list != this) { throw new System.InvalidOperationException("node"); } } internal void ValidateNewNode($csclassnameNode node) { if (node == null) { throw new System.ArgumentNullException("node"); } } global::System.Collections.Generic.IEnumerator<$typemap(cstype, CTYPE)> global::System.Collections.Generic.IEnumerable<$typemap(cstype, CTYPE)>.GetEnumerator() { return new $csclassnameEnumerator(this); } global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return new $csclassnameEnumerator(this); } public $csclassnameEnumerator GetEnumerator() { return new $csclassnameEnumerator(this); } public sealed class $csclassnameEnumerator : global::System.Collections.IEnumerator, global::System.Collections.Generic.IEnumerator<$typemap(cstype, CTYPE)> { private $csclassname collectionRef; private $csclassnameNode currentNode; private int currentIndex; private object currentObject; private int currentSize; public $csclassnameEnumerator($csclassname collection) { collectionRef = collection; currentNode = collection.First; currentIndex = 0; currentObject = null; currentSize = collectionRef.Count; } // Type-safe iterator Current public $typemap(cstype, CTYPE) Current { get { if (currentIndex == -1) throw new global::System.InvalidOperationException("Enumeration not started."); if (currentIndex > currentSize) throw new global::System.InvalidOperationException("Enumeration finished."); if (currentObject == null) throw new global::System.InvalidOperationException("Collection modified."); return ($typemap(cstype, CTYPE))currentObject; } } // Type-unsafe IEnumerator.Current object global::System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { if (currentNode == null) { currentIndex = collectionRef.Count + 1; return false; } ++currentIndex; currentObject = currentNode.Value; currentNode = currentNode.Next; return true; } public void Reset() { currentIndex = -1; currentObject = null; if (collectionRef.Count != currentSize) { throw new global::System.InvalidOperationException("Collection modified."); } } public void Dispose() { currentIndex = -1; currentObject = null; } } public sealed class $csclassnameNode { internal $csclassname list; internal System.IntPtr iter; internal $typemap(cstype, CTYPE) csharpvalue; internal bool inlist; public $csclassnameNode($typemap(cstype, CTYPE) value) { csharpvalue = value; inlist = false; } internal $csclassnameNode(System.IntPtr iter, $csclassname list) { this.list = list; this.iter = iter; inlist = true; } public $csclassname List { get { return this.list; } } public $csclassnameNode Next { get { if (list.getNextIter(iter) == System.IntPtr.Zero) return null; return new $csclassnameNode(list.getNextIter(iter), list); } } public $csclassnameNode Previous { get { if (list.getPrevIter(iter) == System.IntPtr.Zero) return null; return new $csclassnameNode(list.getPrevIter(iter), list); } } public $typemap(cstype, CTYPE) Value { get { return list.getItem(this.iter); } set { list.setItem(this.iter, value); } } public static bool operator==($csclassnameNode node1, $csclassnameNode node2) { if (object.ReferenceEquals(node1, null) && object.ReferenceEquals(node2, null)) return true; if (object.ReferenceEquals(node1, null) || object.ReferenceEquals(node2, null)) return false; return node1.Equals(node2); } public static bool operator!=($csclassnameNode node1, $csclassnameNode node2) { if (node1 == null && node2 == null) return false; if (node1 == null || node2 == null) return true; return !node1.Equals(node2); } public bool Equals($csclassnameNode node) { if (node == null) return false; if (!node.inlist || !this.inlist) return object.ReferenceEquals(this, node); return list.equals(this.iter, node.iter); } public override bool Equals(object node) { return Equals(($csclassnameNode)node); } public override int GetHashCode() { int hash = 13; if (inlist) { hash = (hash * 7) + this.list.GetHashCode(); hash = (hash * 7) + this.Value.GetHashCode(); hash = (hash * 7) + this.list.getNextIter(this.iter).GetHashCode(); hash = (hash * 7) + this.list.getPrevIter(this.iter).GetHashCode(); } else { hash = (hash * 7) + this.csharpvalue.GetHashCode(); } return hash; } public void Dispose() { list.deleteIter(this.iter); } } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef CTYPE value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; class iterator; void push_front(CTYPE const& x); void push_back(CTYPE const& x); %rename(RemoveFirst) pop_front; void pop_front(); %rename(RemoveLast) pop_back; void pop_back(); size_type size() const; %rename(Clear) clear; void clear(); %extend { const_reference getItem(iterator *iter) { return **iter; } void setItem(iterator *iter, CTYPE const& val) { *(*iter) = val; } iterator *getFirstIter() { if ($self->size() == 0) return NULL; return new std::list< CTYPE >::iterator($self->begin()); } iterator *getLastIter() { if ($self->size() == 0) return NULL; return new std::list< CTYPE >::iterator(--$self->end()); } iterator *getNextIter(iterator *iter) { std::list< CTYPE >::iterator it = *iter; if (std::distance(it, --$self->end()) != 0) { std::list< CTYPE >::iterator* itnext = new std::list< CTYPE >::iterator(++it); return itnext; } return NULL; } iterator *getPrevIter(iterator *iter) { std::list< CTYPE >::iterator it = *iter; if (std::distance($self->begin(), it) != 0) { std::list< CTYPE >::iterator* itprev = new std::list< CTYPE >::iterator(--it); return itprev; } return NULL; } iterator *insertNode(iterator *iter, CTYPE const& value) { std::list< CTYPE >::iterator it = $self->insert(*iter, value); return new std::list< CTYPE >::iterator(it); } void eraseIter(iterator *iter) { std::list< CTYPE >::iterator it = *iter; $self->erase(it); } void deleteIter(iterator *iter) { delete iter; } bool equals(iterator *iter1, iterator *iter2) { if (iter1 == NULL && iter2 == NULL) return true; std::list< CTYPE >::iterator it1 = *iter1; std::list< CTYPE >::iterator it2 = *iter2; return it1 == it2; } } %enddef // Extra methods added to the collection class if operator== is defined for the class being wrapped // The class will then implement ICollection<>, which adds extra functionality %define SWIG_STD_LIST_EXTRA_OP_EQUALS_EQUALS(CTYPE...) %extend { bool Contains(CTYPE const& value) { return std::find($self->begin(), $self->end(), value) != $self->end(); } bool Remove(CTYPE const& value) { std::list< CTYPE >::iterator it = std::find($self->begin(), $self->end(), value); if (it != $self->end()) { $self->erase(it); return true; } return false; } iterator *find(CTYPE const& value) { if (std::find($self->begin(), $self->end(), value) != $self->end()) { return new std::list< CTYPE >::iterator(std::find($self->begin(), $self->end(), value)); } return NULL; } } %proxycode %{ public $csclassnameNode Find($typemap(cstype, CTYPE) value) { System.IntPtr tmp = find(value); if (tmp != System.IntPtr.Zero) { return new $csclassnameNode(tmp, this); } return null; } %} %enddef // Macros for std::list class specializations/enhancements %define SWIG_STD_LIST_ENHANCED(CTYPE...) namespace std { template<> class list< CTYPE > { SWIG_STD_LIST_MINIMUM_INTERNAL(ICollection, %arg(CTYPE)); SWIG_STD_LIST_EXTRA_OP_EQUALS_EQUALS(CTYPE) }; } %enddef %{ #include #include #include %} %csmethodmodifiers std::list::size "private" %csmethodmodifiers std::list::getItem "private" %csmethodmodifiers std::list::setItem "private" %csmethodmodifiers std::list::push_front "private" %csmethodmodifiers std::list::push_back "private" %csmethodmodifiers std::list::getFirstIter "private" %csmethodmodifiers std::list::getNextIter "private" %csmethodmodifiers std::list::getPrevIter "private" %csmethodmodifiers std::list::getLastIter "private" %csmethodmodifiers std::list::find "private" %csmethodmodifiers std::list::deleteIter "private" namespace std { // primary (unspecialized) class template for std::list // does not require operator== to be defined template class list { SWIG_STD_LIST_MINIMUM_INTERNAL(IEnumerable, T) }; // specialization for pointers template class list { SWIG_STD_LIST_MINIMUM_INTERNAL(ICollection, T *) SWIG_STD_LIST_EXTRA_OP_EQUALS_EQUALS(T *) }; } // template specializations for std::list // these provide extra collections methods as operator== is defined SWIG_STD_LIST_ENHANCED(char) SWIG_STD_LIST_ENHANCED(signed char) SWIG_STD_LIST_ENHANCED(unsigned char) SWIG_STD_LIST_ENHANCED(short) SWIG_STD_LIST_ENHANCED(unsigned short) SWIG_STD_LIST_ENHANCED(int) SWIG_STD_LIST_ENHANCED(unsigned int) SWIG_STD_LIST_ENHANCED(long) SWIG_STD_LIST_ENHANCED(unsigned long) SWIG_STD_LIST_ENHANCED(long long) SWIG_STD_LIST_ENHANCED(unsigned long long) SWIG_STD_LIST_ENHANCED(float) SWIG_STD_LIST_ENHANCED(double) SWIG_STD_LIST_ENHANCED(std::string) // also requires a %include SWIG_STD_LIST_ENHANCED(std::wstring) // also requires a %include swig-4.0.2/Lib/csharp/csharphead.swg0000644000175000017500000003776413667507523017215 0ustar williamwilliam/* ----------------------------------------------------------------------------- * csharphead.swg * * Support code for exceptions if the SWIG_CSHARP_NO_EXCEPTION_HELPER is not defined * Support code for strings if the SWIG_CSHARP_NO_STRING_HELPER is not defined * ----------------------------------------------------------------------------- */ %insert(runtime) %{ #include #include #include %} #if !defined(SWIG_CSHARP_NO_EXCEPTION_HELPER) %insert(runtime) %{ /* Support for throwing C# exceptions from C/C++. There are two types: * Exceptions that take a message and ArgumentExceptions that take a message and a parameter name. */ typedef enum { SWIG_CSharpApplicationException, SWIG_CSharpArithmeticException, SWIG_CSharpDivideByZeroException, SWIG_CSharpIndexOutOfRangeException, SWIG_CSharpInvalidCastException, SWIG_CSharpInvalidOperationException, SWIG_CSharpIOException, SWIG_CSharpNullReferenceException, SWIG_CSharpOutOfMemoryException, SWIG_CSharpOverflowException, SWIG_CSharpSystemException } SWIG_CSharpExceptionCodes; typedef enum { SWIG_CSharpArgumentException, SWIG_CSharpArgumentNullException, SWIG_CSharpArgumentOutOfRangeException } SWIG_CSharpExceptionArgumentCodes; typedef void (SWIGSTDCALL* SWIG_CSharpExceptionCallback_t)(const char *); typedef void (SWIGSTDCALL* SWIG_CSharpExceptionArgumentCallback_t)(const char *, const char *); typedef struct { SWIG_CSharpExceptionCodes code; SWIG_CSharpExceptionCallback_t callback; } SWIG_CSharpException_t; typedef struct { SWIG_CSharpExceptionArgumentCodes code; SWIG_CSharpExceptionArgumentCallback_t callback; } SWIG_CSharpExceptionArgument_t; static SWIG_CSharpException_t SWIG_csharp_exceptions[] = { { SWIG_CSharpApplicationException, NULL }, { SWIG_CSharpArithmeticException, NULL }, { SWIG_CSharpDivideByZeroException, NULL }, { SWIG_CSharpIndexOutOfRangeException, NULL }, { SWIG_CSharpInvalidCastException, NULL }, { SWIG_CSharpInvalidOperationException, NULL }, { SWIG_CSharpIOException, NULL }, { SWIG_CSharpNullReferenceException, NULL }, { SWIG_CSharpOutOfMemoryException, NULL }, { SWIG_CSharpOverflowException, NULL }, { SWIG_CSharpSystemException, NULL } }; static SWIG_CSharpExceptionArgument_t SWIG_csharp_exceptions_argument[] = { { SWIG_CSharpArgumentException, NULL }, { SWIG_CSharpArgumentNullException, NULL }, { SWIG_CSharpArgumentOutOfRangeException, NULL } }; static void SWIGUNUSED SWIG_CSharpSetPendingException(SWIG_CSharpExceptionCodes code, const char *msg) { SWIG_CSharpExceptionCallback_t callback = SWIG_csharp_exceptions[SWIG_CSharpApplicationException].callback; if ((size_t)code < sizeof(SWIG_csharp_exceptions)/sizeof(SWIG_CSharpException_t)) { callback = SWIG_csharp_exceptions[code].callback; } callback(msg); } static void SWIGUNUSED SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpExceptionArgumentCodes code, const char *msg, const char *param_name) { SWIG_CSharpExceptionArgumentCallback_t callback = SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentException].callback; if ((size_t)code < sizeof(SWIG_csharp_exceptions_argument)/sizeof(SWIG_CSharpExceptionArgument_t)) { callback = SWIG_csharp_exceptions_argument[code].callback; } callback(msg, param_name); } %} %insert(runtime) %{ #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterExceptionCallbacks_$module( SWIG_CSharpExceptionCallback_t applicationCallback, SWIG_CSharpExceptionCallback_t arithmeticCallback, SWIG_CSharpExceptionCallback_t divideByZeroCallback, SWIG_CSharpExceptionCallback_t indexOutOfRangeCallback, SWIG_CSharpExceptionCallback_t invalidCastCallback, SWIG_CSharpExceptionCallback_t invalidOperationCallback, SWIG_CSharpExceptionCallback_t ioCallback, SWIG_CSharpExceptionCallback_t nullReferenceCallback, SWIG_CSharpExceptionCallback_t outOfMemoryCallback, SWIG_CSharpExceptionCallback_t overflowCallback, SWIG_CSharpExceptionCallback_t systemCallback) { SWIG_csharp_exceptions[SWIG_CSharpApplicationException].callback = applicationCallback; SWIG_csharp_exceptions[SWIG_CSharpArithmeticException].callback = arithmeticCallback; SWIG_csharp_exceptions[SWIG_CSharpDivideByZeroException].callback = divideByZeroCallback; SWIG_csharp_exceptions[SWIG_CSharpIndexOutOfRangeException].callback = indexOutOfRangeCallback; SWIG_csharp_exceptions[SWIG_CSharpInvalidCastException].callback = invalidCastCallback; SWIG_csharp_exceptions[SWIG_CSharpInvalidOperationException].callback = invalidOperationCallback; SWIG_csharp_exceptions[SWIG_CSharpIOException].callback = ioCallback; SWIG_csharp_exceptions[SWIG_CSharpNullReferenceException].callback = nullReferenceCallback; SWIG_csharp_exceptions[SWIG_CSharpOutOfMemoryException].callback = outOfMemoryCallback; SWIG_csharp_exceptions[SWIG_CSharpOverflowException].callback = overflowCallback; SWIG_csharp_exceptions[SWIG_CSharpSystemException].callback = systemCallback; } #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterExceptionArgumentCallbacks_$module( SWIG_CSharpExceptionArgumentCallback_t argumentCallback, SWIG_CSharpExceptionArgumentCallback_t argumentNullCallback, SWIG_CSharpExceptionArgumentCallback_t argumentOutOfRangeCallback) { SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentException].callback = argumentCallback; SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentNullException].callback = argumentNullCallback; SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentOutOfRangeException].callback = argumentOutOfRangeCallback; } %} %pragma(csharp) imclasscode=%{ protected class SWIGExceptionHelper { public delegate void ExceptionDelegate(string message); public delegate void ExceptionArgumentDelegate(string message, string paramName); static ExceptionDelegate applicationDelegate = new ExceptionDelegate(SetPendingApplicationException); static ExceptionDelegate arithmeticDelegate = new ExceptionDelegate(SetPendingArithmeticException); static ExceptionDelegate divideByZeroDelegate = new ExceptionDelegate(SetPendingDivideByZeroException); static ExceptionDelegate indexOutOfRangeDelegate = new ExceptionDelegate(SetPendingIndexOutOfRangeException); static ExceptionDelegate invalidCastDelegate = new ExceptionDelegate(SetPendingInvalidCastException); static ExceptionDelegate invalidOperationDelegate = new ExceptionDelegate(SetPendingInvalidOperationException); static ExceptionDelegate ioDelegate = new ExceptionDelegate(SetPendingIOException); static ExceptionDelegate nullReferenceDelegate = new ExceptionDelegate(SetPendingNullReferenceException); static ExceptionDelegate outOfMemoryDelegate = new ExceptionDelegate(SetPendingOutOfMemoryException); static ExceptionDelegate overflowDelegate = new ExceptionDelegate(SetPendingOverflowException); static ExceptionDelegate systemDelegate = new ExceptionDelegate(SetPendingSystemException); static ExceptionArgumentDelegate argumentDelegate = new ExceptionArgumentDelegate(SetPendingArgumentException); static ExceptionArgumentDelegate argumentNullDelegate = new ExceptionArgumentDelegate(SetPendingArgumentNullException); static ExceptionArgumentDelegate argumentOutOfRangeDelegate = new ExceptionArgumentDelegate(SetPendingArgumentOutOfRangeException); [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="SWIGRegisterExceptionCallbacks_$module")] public static extern void SWIGRegisterExceptionCallbacks_$module( ExceptionDelegate applicationDelegate, ExceptionDelegate arithmeticDelegate, ExceptionDelegate divideByZeroDelegate, ExceptionDelegate indexOutOfRangeDelegate, ExceptionDelegate invalidCastDelegate, ExceptionDelegate invalidOperationDelegate, ExceptionDelegate ioDelegate, ExceptionDelegate nullReferenceDelegate, ExceptionDelegate outOfMemoryDelegate, ExceptionDelegate overflowDelegate, ExceptionDelegate systemExceptionDelegate); [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="SWIGRegisterExceptionArgumentCallbacks_$module")] public static extern void SWIGRegisterExceptionCallbacksArgument_$module( ExceptionArgumentDelegate argumentDelegate, ExceptionArgumentDelegate argumentNullDelegate, ExceptionArgumentDelegate argumentOutOfRangeDelegate); static void SetPendingApplicationException(string message) { SWIGPendingException.Set(new global::System.ApplicationException(message, SWIGPendingException.Retrieve())); } static void SetPendingArithmeticException(string message) { SWIGPendingException.Set(new global::System.ArithmeticException(message, SWIGPendingException.Retrieve())); } static void SetPendingDivideByZeroException(string message) { SWIGPendingException.Set(new global::System.DivideByZeroException(message, SWIGPendingException.Retrieve())); } static void SetPendingIndexOutOfRangeException(string message) { SWIGPendingException.Set(new global::System.IndexOutOfRangeException(message, SWIGPendingException.Retrieve())); } static void SetPendingInvalidCastException(string message) { SWIGPendingException.Set(new global::System.InvalidCastException(message, SWIGPendingException.Retrieve())); } static void SetPendingInvalidOperationException(string message) { SWIGPendingException.Set(new global::System.InvalidOperationException(message, SWIGPendingException.Retrieve())); } static void SetPendingIOException(string message) { SWIGPendingException.Set(new global::System.IO.IOException(message, SWIGPendingException.Retrieve())); } static void SetPendingNullReferenceException(string message) { SWIGPendingException.Set(new global::System.NullReferenceException(message, SWIGPendingException.Retrieve())); } static void SetPendingOutOfMemoryException(string message) { SWIGPendingException.Set(new global::System.OutOfMemoryException(message, SWIGPendingException.Retrieve())); } static void SetPendingOverflowException(string message) { SWIGPendingException.Set(new global::System.OverflowException(message, SWIGPendingException.Retrieve())); } static void SetPendingSystemException(string message) { SWIGPendingException.Set(new global::System.SystemException(message, SWIGPendingException.Retrieve())); } static void SetPendingArgumentException(string message, string paramName) { SWIGPendingException.Set(new global::System.ArgumentException(message, paramName, SWIGPendingException.Retrieve())); } static void SetPendingArgumentNullException(string message, string paramName) { global::System.Exception e = SWIGPendingException.Retrieve(); if (e != null) message = message + " Inner Exception: " + e.Message; SWIGPendingException.Set(new global::System.ArgumentNullException(paramName, message)); } static void SetPendingArgumentOutOfRangeException(string message, string paramName) { global::System.Exception e = SWIGPendingException.Retrieve(); if (e != null) message = message + " Inner Exception: " + e.Message; SWIGPendingException.Set(new global::System.ArgumentOutOfRangeException(paramName, message)); } static SWIGExceptionHelper() { SWIGRegisterExceptionCallbacks_$module( applicationDelegate, arithmeticDelegate, divideByZeroDelegate, indexOutOfRangeDelegate, invalidCastDelegate, invalidOperationDelegate, ioDelegate, nullReferenceDelegate, outOfMemoryDelegate, overflowDelegate, systemDelegate); SWIGRegisterExceptionCallbacksArgument_$module( argumentDelegate, argumentNullDelegate, argumentOutOfRangeDelegate); } } protected static SWIGExceptionHelper swigExceptionHelper = new SWIGExceptionHelper(); public class SWIGPendingException { [global::System.ThreadStatic] private static global::System.Exception pendingException = null; private static int numExceptionsPending = 0; private static global::System.Object exceptionsLock = null; public static bool Pending { get { bool pending = false; if (numExceptionsPending > 0) if (pendingException != null) pending = true; return pending; } } public static void Set(global::System.Exception e) { if (pendingException != null) throw new global::System.ApplicationException("FATAL: An earlier pending exception from unmanaged code was missed and thus not thrown (" + pendingException.ToString() + ")", e); pendingException = e; lock(exceptionsLock) { numExceptionsPending++; } } public static global::System.Exception Retrieve() { global::System.Exception e = null; if (numExceptionsPending > 0) { if (pendingException != null) { e = pendingException; pendingException = null; lock(exceptionsLock) { numExceptionsPending--; } } } return e; } static SWIGPendingException() { exceptionsLock = new global::System.Object(); } } %} #endif // SWIG_CSHARP_NO_EXCEPTION_HELPER #if !defined(SWIG_CSHARP_NO_STRING_HELPER) %insert(runtime) %{ /* Callback for returning strings to C# without leaking memory */ typedef char * (SWIGSTDCALL* SWIG_CSharpStringHelperCallback)(const char *); static SWIG_CSharpStringHelperCallback SWIG_csharp_string_callback = NULL; %} %pragma(csharp) imclasscode=%{ protected class SWIGStringHelper { public delegate string SWIGStringDelegate(string message); static SWIGStringDelegate stringDelegate = new SWIGStringDelegate(CreateString); [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="SWIGRegisterStringCallback_$module")] public static extern void SWIGRegisterStringCallback_$module(SWIGStringDelegate stringDelegate); static string CreateString(string cString) { return cString; } static SWIGStringHelper() { SWIGRegisterStringCallback_$module(stringDelegate); } } static protected SWIGStringHelper swigStringHelper = new SWIGStringHelper(); %} %insert(runtime) %{ #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterStringCallback_$module(SWIG_CSharpStringHelperCallback callback) { SWIG_csharp_string_callback = callback; } %} #endif // SWIG_CSHARP_NO_STRING_HELPER #if !defined(SWIG_CSHARP_NO_IMCLASS_STATIC_CONSTRUCTOR) // Ensure the class is not marked beforefieldinit %pragma(csharp) imclasscode=%{ static $imclassname() { } %} #endif %insert(runtime) %{ /* Contract support */ #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException, msg, ""); return nullreturn; } else %} swig-4.0.2/Lib/csharp/std_string.i0000644000175000017500000000614713667507523016712 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * Typemaps for std::string and const std::string& * These are mapped to a C# String and are passed around by value. * * To use non-const std::string references use the following %apply. Note * that they are passed by value. * %apply const std::string & {std::string &}; * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; class string; // string %typemap(ctype) string "char *" %typemap(imtype) string "string" %typemap(cstype) string "string" %typemap(csdirectorin) string "$iminput" %typemap(csdirectorout) string "$cscall" %typemap(in, canthrow=1) string %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); return $null; } $1.assign($input); %} %typemap(out) string %{ $result = SWIG_csharp_string_callback($1.c_str()); %} %typemap(directorout, canthrow=1) string %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); return $null; } $result.assign($input); %} %typemap(directorin) string %{ $input = SWIG_csharp_string_callback($1.c_str()); %} %typemap(csin) string "$csinput" %typemap(csout, excode=SWIGEXCODE) string { string ret = $imcall;$excode return ret; } %typemap(typecheck) string = char *; %typemap(throws, canthrow=1) string %{ SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.c_str()); return $null; %} // const string & %typemap(ctype) const string & "char *" %typemap(imtype) const string & "string" %typemap(cstype) const string & "string" %typemap(csdirectorin) const string & "$iminput" %typemap(csdirectorout) const string & "$cscall" %typemap(in, canthrow=1) const string & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); return $null; } $*1_ltype $1_str($input); $1 = &$1_str; %} %typemap(out) const string & %{ $result = SWIG_csharp_string_callback($1->c_str()); %} %typemap(csin) const string & "$csinput" %typemap(csout, excode=SWIGEXCODE) const string & { string ret = $imcall;$excode return ret; } %typemap(directorout, canthrow=1, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); return $null; } /* possible thread/reentrant code problem */ static $*1_ltype $1_str; $1_str = $input; $result = &$1_str; %} %typemap(directorin) const string & %{ $input = SWIG_csharp_string_callback($1.c_str()); %} %typemap(csvarin, excode=SWIGEXCODE2) const string & %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) const string & %{ get { string ret = $imcall;$excode return ret; } %} %typemap(typecheck) const string & = char *; %typemap(throws, canthrow=1) const string & %{ SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.c_str()); return $null; %} } swig-4.0.2/Lib/csharp/std_map.i0000644000175000017500000002551213667507523016156 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map< K, T, C > * * The C# wrapper is made to look and feel like a C# System.Collections.Generic.IDictionary<>. * * Using this wrapper is fairly simple. For example, to create a map from integers to doubles use: * * %include * %template(MapIntDouble) std::map * * Notes: * 1) IEnumerable<> is implemented in the proxy class which is useful for using LINQ with * C++ std::map wrappers. * * Warning: heavy macro usage in this file. Use swig -E to get a sane view on the real file contents! * ----------------------------------------------------------------------------- */ %{ #include #include #include %} /* K is the C++ key type, T is the C++ value type */ %define SWIG_STD_MAP_INTERNAL(K, T, C) %typemap(csinterfaces) std::map< K, T, C > "global::System.IDisposable \n , global::System.Collections.Generic.IDictionary<$typemap(cstype, K), $typemap(cstype, T)>\n"; %proxycode %{ public $typemap(cstype, T) this[$typemap(cstype, K) key] { get { return getitem(key); } set { setitem(key, value); } } public bool TryGetValue($typemap(cstype, K) key, out $typemap(cstype, T) value) { if (this.ContainsKey(key)) { value = this[key]; return true; } value = default($typemap(cstype, T)); return false; } public int Count { get { return (int)size(); } } public bool IsReadOnly { get { return false; } } public global::System.Collections.Generic.ICollection<$typemap(cstype, K)> Keys { get { global::System.Collections.Generic.ICollection<$typemap(cstype, K)> keys = new global::System.Collections.Generic.List<$typemap(cstype, K)>(); int size = this.Count; if (size > 0) { global::System.IntPtr iter = create_iterator_begin(); for (int i = 0; i < size; i++) { keys.Add(get_next_key(iter)); } destroy_iterator(iter); } return keys; } } public global::System.Collections.Generic.ICollection<$typemap(cstype, T)> Values { get { global::System.Collections.Generic.ICollection<$typemap(cstype, T)> vals = new global::System.Collections.Generic.List<$typemap(cstype, T)>(); foreach (global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> pair in this) { vals.Add(pair.Value); } return vals; } } public void Add(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> item) { Add(item.Key, item.Value); } public bool Remove(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> item) { if (Contains(item)) { return Remove(item.Key); } else { return false; } } public bool Contains(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> item) { if (this[item.Key] == item.Value) { return true; } else { return false; } } public void CopyTo(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>[] array) { CopyTo(array, 0); } public void CopyTo(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>[] array, int arrayIndex) { if (array == null) throw new global::System.ArgumentNullException("array"); if (arrayIndex < 0) throw new global::System.ArgumentOutOfRangeException("arrayIndex", "Value is less than zero"); if (array.Rank > 1) throw new global::System.ArgumentException("Multi dimensional array.", "array"); if (arrayIndex+this.Count > array.Length) throw new global::System.ArgumentException("Number of elements to copy is too large."); global::System.Collections.Generic.IList<$typemap(cstype, K)> keyList = new global::System.Collections.Generic.List<$typemap(cstype, K)>(this.Keys); for (int i = 0; i < keyList.Count; i++) { $typemap(cstype, K) currentKey = keyList[i]; array.SetValue(new global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>(currentKey, this[currentKey]), arrayIndex+i); } } global::System.Collections.Generic.IEnumerator> global::System.Collections.Generic.IEnumerable>.GetEnumerator() { return new $csclassnameEnumerator(this); } global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return new $csclassnameEnumerator(this); } public $csclassnameEnumerator GetEnumerator() { return new $csclassnameEnumerator(this); } // Type-safe enumerator /// Note that the IEnumerator documentation requires an InvalidOperationException to be thrown /// whenever the collection is modified. This has been done for changes in the size of the /// collection but not when one of the elements of the collection is modified as it is a bit /// tricky to detect unmanaged code that modifies the collection under our feet. public sealed class $csclassnameEnumerator : global::System.Collections.IEnumerator, global::System.Collections.Generic.IEnumerator> { private $csclassname collectionRef; private global::System.Collections.Generic.IList<$typemap(cstype, K)> keyCollection; private int currentIndex; private object currentObject; private int currentSize; public $csclassnameEnumerator($csclassname collection) { collectionRef = collection; keyCollection = new global::System.Collections.Generic.List<$typemap(cstype, K)>(collection.Keys); currentIndex = -1; currentObject = null; currentSize = collectionRef.Count; } // Type-safe iterator Current public global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> Current { get { if (currentIndex == -1) throw new global::System.InvalidOperationException("Enumeration not started."); if (currentIndex > currentSize - 1) throw new global::System.InvalidOperationException("Enumeration finished."); if (currentObject == null) throw new global::System.InvalidOperationException("Collection modified."); return (global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>)currentObject; } } // Type-unsafe IEnumerator.Current object global::System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { int size = collectionRef.Count; bool moveOkay = (currentIndex+1 < size) && (size == currentSize); if (moveOkay) { currentIndex++; $typemap(cstype, K) currentKey = keyCollection[currentIndex]; currentObject = new global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>(currentKey, collectionRef[currentKey]); } else { currentObject = null; } return moveOkay; } public void Reset() { currentIndex = -1; currentObject = null; if (collectionRef.Count != currentSize) { throw new global::System.InvalidOperationException("Collection modified."); } } public void Dispose() { currentIndex = -1; currentObject = null; } } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); size_type size() const; bool empty() const; %rename(Clear) clear; void clear(); %extend { const mapped_type& getitem(const key_type& key) throw (std::out_of_range) { std::map< K, T, C >::iterator iter = $self->find(key); if (iter != $self->end()) return iter->second; else throw std::out_of_range("key not found"); } void setitem(const key_type& key, const mapped_type& x) { (*$self)[key] = x; } bool ContainsKey(const key_type& key) { std::map< K, T, C >::iterator iter = $self->find(key); return iter != $self->end(); } void Add(const key_type& key, const mapped_type& value) throw (std::out_of_range) { std::map< K, T, C >::iterator iter = $self->find(key); if (iter != $self->end()) throw std::out_of_range("key already exists"); $self->insert(std::pair< K, T >(key, value)); } bool Remove(const key_type& key) { std::map< K, T, C >::iterator iter = $self->find(key); if (iter != $self->end()) { $self->erase(iter); return true; } return false; } // create_iterator_begin(), get_next_key() and destroy_iterator work together to provide a collection of keys to C# %apply void *VOID_INT_PTR { std::map< K, T, C >::iterator *create_iterator_begin } %apply void *VOID_INT_PTR { std::map< K, T, C >::iterator *swigiterator } std::map< K, T, C >::iterator *create_iterator_begin() { return new std::map< K, T, C >::iterator($self->begin()); } const key_type& get_next_key(std::map< K, T, C >::iterator *swigiterator) { std::map< K, T, C >::iterator iter = *swigiterator; (*swigiterator)++; return (*iter).first; } void destroy_iterator(std::map< K, T, C >::iterator *swigiterator) { delete swigiterator; } } %enddef %csmethodmodifiers std::map::size "private" %csmethodmodifiers std::map::getitem "private" %csmethodmodifiers std::map::setitem "private" %csmethodmodifiers std::map::create_iterator_begin "private" %csmethodmodifiers std::map::get_next_key "private" %csmethodmodifiers std::map::destroy_iterator "private" // Default implementation namespace std { template > class map { SWIG_STD_MAP_INTERNAL(K, T, C) }; } // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef swig-4.0.2/Lib/csharp/swiginterface.i0000644000175000017500000000606513667507523017363 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swiginterface.i * * SWIG interface feature and typemaps implementation providing: * %interface * %interface_impl * %interface_custom * ----------------------------------------------------------------------------- */ %define INTERFACE_TYPEMAPS(CTYPE...) %typemap(cstype) CTYPE "$&csinterfacename" %typemap(cstype) CTYPE *, CTYPE [], CTYPE & "$csinterfacename" %typemap(cstype) CTYPE *const& "$*csinterfacename" %typemap(csin) CTYPE, CTYPE & "$csinput.GetInterfaceCPtr()" %typemap(csin) CTYPE *, CTYPE *const&, CTYPE [] "$csinput == null ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : $csinput.GetInterfaceCPtr()" %typemap(csout, excode=SWIGEXCODE) CTYPE { $&csclassname ret = new $&csclassname($imcall, true);$excode return ($&csinterfacename)ret; } %typemap(csout, excode=SWIGEXCODE) CTYPE & { $csclassname ret = new $csclassname($imcall, $owner);$excode return ($csinterfacename)ret; } %typemap(csout, excode=SWIGEXCODE) CTYPE *, CTYPE [] { global::System.IntPtr cPtr = $imcall; $csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $csclassname(cPtr, $owner);$excode return ($csinterfacename)ret; } %typemap(csout, excode=SWIGEXCODE) CTYPE *const& { global::System.IntPtr cPtr = $imcall; $*csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $*csclassname(cPtr, $owner);$excode return ($*csinterfacename)ret; } %typemap(csdirectorin) CTYPE "($&csinterfacename)new $&csclassname($iminput, true)" %typemap(csdirectorin) CTYPE & "($csinterfacename)new $csclassname($iminput, false)" %typemap(csdirectorin) CTYPE *, CTYPE [] "($iminput == global::System.IntPtr.Zero) ? null : ($csinterfacename)new $csclassname($iminput, false)" %typemap(csdirectorin) CTYPE *const& "($iminput == global::System.IntPtr.Zero) ? null : ($*csinterfacename)new $*csclassname($iminput, false)" %typemap(csdirectorout) CTYPE, CTYPE *, CTYPE *const&, CTYPE [], CTYPE & "$cscall.GetInterfaceCPtr()" %typemap(csinterfacecode, declaration=" [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]\n global::System.Runtime.InteropServices.HandleRef GetInterfaceCPtr();\n", cptrmethod="$interfacename_GetInterfaceCPtr") CTYPE %{ [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] global::System.Runtime.InteropServices.HandleRef $interfacename.GetInterfaceCPtr() { return new global::System.Runtime.InteropServices.HandleRef(this, $imclassname.$csclazzname$interfacename_GetInterfaceCPtr(swigCPtr.Handle)); } %} %enddef %define %interface(CTYPE...) %feature("interface", name="%sSwigInterface") CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef %define %interface_impl(CTYPE...) %rename("%sSwigImpl") CTYPE; %feature("interface", name="%(rstrip:[SwigImpl])s") CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef %define %interface_custom(PROXY, INTERFACE, CTYPE...) %rename(PROXY) CTYPE; %feature("interface", name=INTERFACE) CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef swig-4.0.2/Lib/csharp/boost_shared_ptr.i0000644000175000017500000003513513667507523020072 0ustar williamwilliam// Users can provide their own SWIG_SHARED_PTR_TYPEMAPS macro before including this file to change the // visibility of the constructor and getCPtr method if desired to public if using multiple modules. #ifndef SWIG_SHARED_PTR_TYPEMAPS #define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(internal, internal, CONST, TYPE) #endif %include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor mods %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in, canthrow=1) CONST TYPE ($&1_type argp = 0) %{ argp = ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0; if (!argp) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} %typemap(directorin) CONST TYPE %{ $input = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (new $1_ltype((const $1_ltype &)$1)); %} %typemap(directorout) CONST TYPE %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $result = *smartarg->get(); %} // plain pointer %typemap(in, canthrow=1) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ $result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} %typemap(directorin) CONST TYPE * %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %} %typemap(directorout) CONST TYPE * %{ #error "typemaps for $1_type not available" %} // plain reference %typemap(in, canthrow=1) CONST TYPE & %{ $1 = ($1_ltype)(((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0); if (!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type reference is null", 0); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(directorin) CONST TYPE & %{ $input = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (&$1 SWIG_NO_NULL_DELETER_0); %} %typemap(directorout) CONST TYPE & %{ #error "typemaps for $1_type not available" %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = (TYPE *)(((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(directorin) TYPE *CONST& %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %} %typemap(directorout) TYPE *CONST& %{ #error "typemaps for $1_type not available" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ if ($input) $1 = *($&1_ltype)$input; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ $result = $1 ? new $1_ltype($1) : 0; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ if ($input) { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $result = *smartarg; } %} // shared_ptr by reference %typemap(in, canthrow=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & ($*1_ltype tempnull) %{ $1 = $input ? ($1_ltype)$input : &tempnull; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ $result = *$1 ? new $*1_ltype(*$1) : 0; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "typemaps for $1_type not available" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * ($*1_ltype tempnull) %{ $1 = $input ? ($1_ltype)$input : &tempnull; %} %typemap(out, fragment="SWIG_null_deleter") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ $result = ($1 && *$1) ? new $*1_ltype(*($1_ltype)$1) : 0; if ($owner) delete $1; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ $input = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "typemaps for $1_type not available" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempnull, $*1_ltype temp = 0) %{ temp = $input ? *($1_ltype)&$input : &tempnull; $1 = &temp; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ *($1_ltype)&$result = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ $input = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "typemaps for $1_type not available" %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (ctype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "void *" %typemap (imtype, out="global::System.IntPtr") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "global::System.Runtime.InteropServices.HandleRef" %typemap (cstype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(cstype, TYPE)" %typemap(csin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(cstype, TYPE).getCPtr($csinput)" %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE & { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE * { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) TYPE *CONST& { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) CONST TYPE & %{ get { $csclassname ret = new $csclassname($imcall, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) CONST TYPE * %{ get { global::System.IntPtr cPtr = $imcall; $csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $csclassname(cPtr, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ get { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ get { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %} %typemap(csdirectorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(cstype, TYPE).getCPtr($cscall).Handle" %typemap(csdirectorin) CONST TYPE, CONST TYPE *, CONST TYPE &, TYPE *CONST& "($iminput == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)($iminput, true)" %typemap(csdirectorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "($iminput == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)($iminput, true)" // Proxy classes (base classes, ie, not derived classes) %typemap(csbody) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnBase; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} // Derived proxy classes %typemap(csbody_derived) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnDerived; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGSmartPtrUpcast(cPtr), true) { swigCMemOwnDerived = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %typemap(csdisposing, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnBase) { swigCMemOwnBase = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } } } %typemap(csdisposing_derived, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } base.Dispose(disposing); } } // Typecheck typemaps %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *") TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.2/Lib/linkruntime.c0000644000175000017500000000100013667507523015564 0ustar williamwilliam#ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif static void *ptr = 0; SWIGEXPORT void * SWIG_ReturnGlobalTypeList(void *t) { if (!ptr && !t) ptr = t; return ptr; } swig-4.0.2/Lib/guile/0000755000175000017500000000000013667507523014175 5ustar williamwilliamswig-4.0.2/Lib/guile/std_deque.i0000644000175000017500000000003413667507523016321 0ustar williamwilliam%include swig-4.0.2/Lib/guile/common.scm0000644000175000017500000000452013667507523016172 0ustar williamwilliam;;;************************************************************************ ;;;*common.scm ;;;* ;;;* This file contains generic SWIG GOOPS classes for generated ;;;* GOOPS file support ;;;************************************************************************ (define-module (Swig swigrun)) (define-module (Swig common) #:use-module (oop goops) #:use-module (Swig swigrun)) (define-class () (new-function #:init-value #f)) (define-method (initialize (class ) initargs) (slot-set! class 'new-function (get-keyword #:new-function initargs #f)) (next-method)) (define-class () (swig-smob #:init-value #f) #:metaclass ) (define-method (initialize (obj ) initargs) (next-method) (slot-set! obj 'swig-smob (let ((arg (get-keyword #:init-smob initargs #f))) (if arg arg (let ((ret (apply (slot-ref (class-of obj) 'new-function) (get-keyword #:args initargs '())))) ;; if the class is registered with runtime environment, ;; new-Function will return a goops class. In that case, extract the smob ;; from that goops class and set it as the current smob. (if (slot-exists? ret 'swig-smob) (slot-ref ret 'swig-smob) ret)))))) (define (display-address o file) (display (number->string (object-address o) 16) file)) (define (display-pointer-address o file) ;; Don't fail if the function SWIG-PointerAddress is not present. (let ((address (false-if-exception (SWIG-PointerAddress o)))) (if address (begin (display " @ " file) (display (number->string address 16) file))))) (define-method (write (o ) file) ;; We display _two_ addresses to show the object's identity: ;; * first the address of the GOOPS proxy object, ;; * second the pointer address. ;; The reason is that proxy objects are created and discarded on the ;; fly, so different proxy objects for the same C object will appear. (let ((class (class-of o))) (if (slot-bound? class 'name) (begin (display "#<" file) (display (class-name class) file) (display #\space file) (display-address o file) (display-pointer-address o file) (display ">" file)) (next-method)))) (export ) ;;; common.scm ends here swig-4.0.2/Lib/guile/std_vector.i0000644000175000017500000004176413667507523016537 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // Guile as much as possible, namely, to allow the user to pass and // be returned Guile vectors or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&), f(const std::vector*): // the parameter being read-only, either a Guile sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(): // the vector is returned by copy; therefore, a Guile vector of T:s // is returned which is most easily used in other Guile functions // -- std::vector& f(), std::vector* f(), const std::vector& f(), // const std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class vector { %typemap(in) vector { if (scm_is_vector($input)) { unsigned long size = scm_c_vector_length($input); $1 = std::vector< T >(size); for (unsigned long i=0; i(); } else if (scm_is_pair($input)) { SCM head, tail; $1 = std::vector< T >(); tail = $input; while (!scm_is_null(tail)) { head = SCM_CAR(tail); tail = SCM_CDR(tail); $1.push_back(*((T*)SWIG_MustGetPtr(head, $descriptor(T *), $argnum, 0))); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const vector& (std::vector temp), const vector* (std::vector temp) { if (scm_is_vector($input)) { unsigned long size = scm_c_vector_length($input); temp = std::vector< T >(size); $1 = &temp; for (unsigned long i=0; i(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::vector< T >(); $1 = &temp; SCM head, tail; tail = $input; while (!scm_is_null(tail)) { head = SCM_CAR(tail); tail = SCM_CDR(tail); temp.push_back(*((T*) SWIG_MustGetPtr(head, $descriptor(T *), $argnum, 0))); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) vector { $result = scm_make_vector(scm_from_long($1.size()),SCM_UNSPECIFIED); for (unsigned int i=0; i<$1.size(); i++) { T* x = new T((($1_type &)$1)[i]); scm_vector_set_x($result,scm_from_long(i), SWIG_NewPointerObj(x, $descriptor(T *), 1)); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector { /* native sequence? */ if (scm_is_vector($input)) { unsigned int size = scm_c_vector_length($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SCM o = scm_vector_ref($input,scm_from_ulong(0)); T* x; if (SWIG_ConvertPtr(o,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } } else if (scm_is_null($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ T* x; SCM head = SCM_CAR($input); if (SWIG_ConvertPtr(head,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { /* native sequence? */ if (scm_is_vector($input)) { unsigned int size = scm_c_vector_length($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; SCM o = scm_vector_ref($input,scm_from_ulong(0)); if (SWIG_ConvertPtr(o,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } } else if (scm_is_null($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ T* x; SCM head = SCM_CAR($input); if (SWIG_ConvertPtr(head,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); %rename(length) size; unsigned int size() const; %rename("empty?") empty; bool empty() const; %rename("clear!") clear; void clear(); %rename("set!") set; %rename("pop!") pop; %rename("push!") push_back; void push_back(const T& x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } const T& ref(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { %typemap(in) vector { if (scm_is_vector($input)) { unsigned long size = scm_c_vector_length($input); $1 = std::vector< T >(size); for (unsigned long i=0; i(); } else if (scm_is_pair($input)) { SCM v = scm_vector($input); unsigned long size = scm_c_vector_length(v); $1 = std::vector< T >(size); for (unsigned long i=0; i& (std::vector temp), const vector* (std::vector temp) { if (scm_is_vector($input)) { unsigned long size = scm_c_vector_length($input); temp = std::vector< T >(size); $1 = &temp; for (unsigned long i=0; i(); $1 = &temp; } else if (scm_is_pair($input)) { SCM v = scm_vector($input); unsigned long size = scm_c_vector_length(v); temp = std::vector< T >(size); $1 = &temp; for (unsigned long i=0; i { $result = scm_make_vector(scm_from_long($1.size()),SCM_UNSPECIFIED); for (unsigned int i=0; i<$1.size(); i++) { SCM x = CONVERT_TO((($1_type &)$1)[i]); scm_vector_set_x($result,scm_from_long(i),x); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector { /* native sequence? */ if (scm_is_vector($input)) { unsigned int size = scm_c_vector_length($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SCM o = scm_vector_ref($input,scm_from_ulong(0)); $1 = CHECK(o) ? 1 : 0; } } else if (scm_is_null($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ SCM head = SCM_CAR($input); $1 = CHECK(head) ? 1 : 0; } else { /* wrapped vector? */ std::vector< T >* v; $1 = (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor, 0) != -1) ? 1 : 0; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { /* native sequence? */ if (scm_is_vector($input)) { unsigned int size = scm_c_vector_length($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SCM o = scm_vector_ref($input,scm_from_ulong(0)); $1 = CHECK(o) ? 1 : 0; } } else if (scm_is_null($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ SCM head = SCM_CAR($input); $1 = CHECK(head) ? 1 : 0; } else { /* wrapped vector? */ std::vector< T >* v; $1 = (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor, 0) != -1) ? 1 : 0; } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); %rename(length) size; unsigned int size() const; %rename("empty?") empty; bool empty() const; %rename("clear!") clear; void clear(); %rename("set!") set; %rename("pop!") pop; %rename("push!") push_back; void push_back(T x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T ref(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* In the code below, use guile 2.0 compatible functions where possible. Functions that don't exist in older versions will be mapped to a deprecated equivalent for those versions only */ #if defined (SCM_MAJOR_VERSION) && (SCM_MAJOR_VERSION < 2) static SCM scm_module_variable (SCM module, SCM sym) { return scm_sym2var (sym, scm_module_lookup_closure (module), SCM_BOOL_F); } #define scm_to_utf8_string scm_to_locale_string #define scm_from_utf8_string scm_from_locale_string #endif #if SCM_MAJOR_VERSION >= 2 /* scm_c_define_gsubr takes a different parameter type depending on the guile version */ typedef scm_t_subr swig_guile_proc; #else typedef SCM (*swig_guile_proc)(); #endif typedef SCM (*guile_destructor)(SCM); typedef struct swig_guile_clientdata { guile_destructor destroy; SCM goops_class; } swig_guile_clientdata; #define SWIG_scm2str(s) \ SWIG_Guile_scm2newstr(s, NULL) #define SWIG_str02scm(str) \ str ? scm_from_utf8_string(str) : SCM_BOOL_F # define SWIG_malloc(size) \ scm_malloc(size) # define SWIG_free(mem) \ free(mem) #define SWIG_ConvertPtr(s, result, type, flags) \ SWIG_Guile_ConvertPtr(s, result, type, flags) #define SWIG_MustGetPtr(s, type, argnum, flags) \ SWIG_Guile_MustGetPtr(s, type, argnum, flags, FUNC_NAME) #define SWIG_NewPointerObj(ptr, type, owner) \ SWIG_Guile_NewPointerObj((void*)ptr, type, owner) #define SWIG_PointerAddress(object) \ SWIG_Guile_PointerAddress(object) #define SWIG_PointerType(object) \ SWIG_Guile_PointerType(object) #define SWIG_IsPointerOfType(object, type) \ SWIG_Guile_IsPointerOfType(object, type) #define SWIG_IsPointer(object) \ SWIG_Guile_IsPointer(object) #define SWIG_contract_assert(expr, msg) \ if (!(expr)) \ scm_error(scm_from_locale_symbol("swig-contract-assertion-failed"), \ (char *) FUNC_NAME, (char *) msg, \ SCM_EOL, SCM_BOOL_F); else /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) \ SWIG_Guile_ConvertMember(obj, ptr, sz, ty, FUNC_NAME) #define SWIG_NewMemberObj(ptr, sz, type) \ SWIG_Guile_NewMemberObj(ptr, sz, type, FUNC_NAME) /* Runtime API */ static swig_module_info *SWIG_Guile_GetModule(void *SWIGUNUSEDPARM(clientdata)); #define SWIG_GetModule(clientdata) SWIG_Guile_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Guile_SetModule(pointer) SWIGINTERN char * SWIG_Guile_scm2newstr(SCM str, size_t *len) { #define FUNC_NAME "SWIG_Guile_scm2newstr" char *ret; SCM_ASSERT (scm_is_string(str), str, 1, FUNC_NAME); ret = scm_to_utf8_string(str); if (!ret) return NULL; if (len) *len = strlen(ret) - 1; return ret; #undef FUNC_NAME } static int swig_initialized = 0; static scm_t_bits swig_tag = 0; static scm_t_bits swig_collectable_tag = 0; static scm_t_bits swig_finalized_tag = 0; static scm_t_bits swig_destroyed_tag = 0; static scm_t_bits swig_member_function_tag = 0; static SCM swig_make_func = SCM_EOL; static SCM swig_keyword = SCM_EOL; static SCM swig_symbol = SCM_EOL; #define SWIG_Guile_GetSmob(x) \ ( !scm_is_null(x) && SCM_INSTANCEP(x) && scm_is_true(scm_slot_exists_p(x, swig_symbol)) \ ? scm_slot_ref(x, swig_symbol) : (x) ) SWIGINTERN SCM SWIG_Guile_NewPointerObj(void *ptr, swig_type_info *type, int owner) { if (ptr == NULL) return SCM_EOL; else { SCM smob; swig_guile_clientdata *cdata = (swig_guile_clientdata *) type->clientdata; if (owner) SCM_NEWSMOB2(smob, swig_collectable_tag, ptr, (void *) type); else SCM_NEWSMOB2(smob, swig_tag, ptr, (void *) type); if (!cdata || SCM_NULLP(cdata->goops_class) || swig_make_func == SCM_EOL ) { return smob; } else { /* the scm_make() C function only handles the creation of gf, methods and classes (no instances) the (make ...) function is later redefined in goops.scm. So we need to call that Scheme function. */ return scm_apply(swig_make_func, scm_list_3(cdata->goops_class, swig_keyword, smob), SCM_EOL); } } } SWIGINTERN unsigned long SWIG_Guile_PointerAddress(SCM object) { SCM smob = SWIG_Guile_GetSmob(object); if (SCM_NULLP(smob)) return 0; else if (SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob) || SCM_SMOB_PREDICATE(swig_destroyed_tag, smob)) { return (unsigned long) (void *) SCM_CELL_WORD_1(smob); } else scm_wrong_type_arg("SWIG-Guile-PointerAddress", 1, object); } SWIGINTERN swig_type_info * SWIG_Guile_PointerType(SCM object) { SCM smob = SWIG_Guile_GetSmob(object); if (SCM_NULLP(smob)) return NULL; else if (SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob) || SCM_SMOB_PREDICATE(swig_destroyed_tag, smob)) { return (swig_type_info *) SCM_CELL_WORD_2(smob); } else scm_wrong_type_arg("SWIG-Guile-PointerType", 1, object); } SWIGINTERN int SWIG_Guile_IsValidSmob(SCM smob) { /* We do not accept smobs representing destroyed pointers, but we have to allow finalized smobs because Guile >= 2.0.12 sets all smob instances to the 'finalized' type before calling their 'free' function. This change was introduced to Guile in commit 8dff3af087c6eaa83ae0d72aa8b22aef5c65d65d */ return SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob) || SCM_SMOB_PREDICATE(swig_finalized_tag, smob); } SWIGINTERN int SWIG_Guile_ConvertPtr(SCM s, void **result, swig_type_info *type, int flags) { swig_cast_info *cast; swig_type_info *from; SCM smob = SWIG_Guile_GetSmob(s); if (SCM_NULLP(smob)) { *result = NULL; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; #if SCM_MAJOR_VERSION >= 2 } else if (SCM_POINTER_P(s)) { *result = SCM_POINTER_VALUE(s); return SWIG_OK; #endif /* if SCM_MAJOR_VERSION >= 2 */ } else if (SWIG_Guile_IsValidSmob(smob)) { from = (swig_type_info *) SCM_CELL_WORD_2(smob); if (!from) return SWIG_ERROR; if (type) { cast = SWIG_TypeCheckStruct(from, type); if (cast) { int newmemory = 0; *result = SWIG_TypeCast(cast, (void *) SCM_CELL_WORD_1(smob), &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return SWIG_OK; } else { return SWIG_ERROR; } } else { *result = (void *) SCM_CELL_WORD_1(smob); return SWIG_OK; } } return SWIG_ERROR; } SWIGINTERNINLINE void * SWIG_Guile_MustGetPtr (SCM s, swig_type_info *type, int argnum, int flags, const char *func_name) { void *result; int res = SWIG_Guile_ConvertPtr(s, &result, type, flags); if (!SWIG_IsOK(res)) { /* type mismatch */ scm_wrong_type_arg((char *) func_name, argnum, s); } return result; } SWIGINTERNINLINE int SWIG_Guile_IsPointerOfType (SCM s, swig_type_info *type) { void *result; if (SWIG_Guile_ConvertPtr(s, &result, type, 0)) { /* type mismatch */ return 0; } else return 1; } SWIGINTERNINLINE int SWIG_Guile_IsPointer (SCM s) { /* module might not be initialized yet, so initialize it */ SWIG_GetModule(0); return SWIG_Guile_IsPointerOfType (s, NULL); } /* Mark a pointer object non-collectable */ SWIGINTERN void SWIG_Guile_MarkPointerNoncollectable(SCM s) { SCM smob = SWIG_Guile_GetSmob(s); if (!SCM_NULLP(smob)) { if (SWIG_Guile_IsValidSmob(smob)) { SCM_SET_CELL_TYPE(smob, swig_tag); } else scm_wrong_type_arg(NULL, 0, s); } } /* Mark a pointer object destroyed */ SWIGINTERN void SWIG_Guile_MarkPointerDestroyed(SCM s) { SCM smob = SWIG_Guile_GetSmob(s); if (!SCM_NULLP(smob)) { if (SWIG_Guile_IsValidSmob(smob)) { SCM_SET_CELL_TYPE(smob, swig_destroyed_tag); } else scm_wrong_type_arg(NULL, 0, s); } } /* Member functions */ SWIGINTERN SCM SWIG_Guile_NewMemberObj(void *ptr, size_t sz, swig_type_info *type, const char *func_name) { SCM smob; void *copy = malloc(sz); memcpy(copy, ptr, sz); SCM_NEWSMOB2(smob, swig_member_function_tag, copy, (void *) type); return smob; } SWIGINTERN int SWIG_Guile_ConvertMember(SCM smob, void *ptr, size_t sz, swig_type_info *type, const char *func_name) { swig_cast_info *cast; swig_type_info *from; if (SCM_SMOB_PREDICATE(swig_member_function_tag, smob)) { from = (swig_type_info *) SCM_CELL_WORD_2(smob); if (!from) return SWIG_ERROR; if (type) { cast = SWIG_TypeCheckStruct(from, type); if (!cast) return SWIG_ERROR; } memcpy(ptr, (void *) SCM_CELL_WORD_1(smob), sz); return SWIG_OK; } return SWIG_ERROR; } /* Init */ SWIGINTERN int print_swig_aux (SCM swig_smob, SCM port, scm_print_state *pstate, const char *attribute) { swig_type_info *type; type = (swig_type_info *) SCM_CELL_WORD_2(swig_smob); if (type) { scm_puts((char *) "#<", port); scm_puts((char *) attribute, port); scm_puts((char *) "swig-pointer ", port); scm_puts((char *) SWIG_TypePrettyName(type), port); scm_puts((char *) " ", port); scm_intprint((long) SCM_CELL_WORD_1(swig_smob), 16, port); scm_puts((char *) ">", port); /* non-zero means success */ return 1; } else { return 0; } } SWIGINTERN int print_swig (SCM swig_smob, SCM port, scm_print_state *pstate) { return print_swig_aux(swig_smob, port, pstate, ""); } SWIGINTERN int print_collectable_swig (SCM swig_smob, SCM port, scm_print_state *pstate) { return print_swig_aux(swig_smob, port, pstate, "collectable-"); } SWIGINTERN int print_destroyed_swig (SCM swig_smob, SCM port, scm_print_state *pstate) { return print_swig_aux(swig_smob, port, pstate, "destroyed-"); } SWIGINTERN int print_member_function_swig (SCM swig_smob, SCM port, scm_print_state *pstate) { swig_type_info *type; type = (swig_type_info *) SCM_CELL_WORD_2(swig_smob); if (type) { scm_puts((char *) "#<", port); scm_puts((char *) "swig-member-function-pointer ", port); scm_puts((char *) SWIG_TypePrettyName(type), port); scm_puts((char *) " >", port); /* non-zero means success */ return 1; } else { return 0; } } SWIGINTERN SCM equalp_swig (SCM A, SCM B) { if (SCM_CELL_WORD_0(A) == SCM_CELL_WORD_0(B) && SCM_CELL_WORD_1(A) == SCM_CELL_WORD_1(B) && SCM_CELL_WORD_2(A) == SCM_CELL_WORD_2(B)) return SCM_BOOL_T; else return SCM_BOOL_F; } SWIGINTERN size_t free_swig(SCM A) { swig_type_info *type = (swig_type_info *) SCM_CELL_WORD_2(A); if (type) { if (type->clientdata && ((swig_guile_clientdata *)type->clientdata)->destroy) ((swig_guile_clientdata *)type->clientdata)->destroy(A); } return 0; } SWIGINTERN size_t free_swig_member_function(SCM A) { free((swig_type_info *) SCM_CELL_WORD_1(A)); return 0; } SWIGINTERN int ensure_smob_tag(SCM swig_module, scm_t_bits *tag_variable, const char *smob_name, const char *scheme_variable_name) { SCM variable = scm_module_variable(swig_module, scm_from_locale_symbol(scheme_variable_name)); if (scm_is_false(variable)) { *tag_variable = scm_make_smob_type((char*)scheme_variable_name, 0); scm_c_module_define(swig_module, scheme_variable_name, scm_from_ulong(*tag_variable)); return 1; } else { *tag_variable = scm_to_ulong(SCM_VARIABLE_REF(variable)); return 0; } } SWIGINTERN SCM SWIG_Guile_Init () { static SCM swig_module; if (swig_initialized) return swig_module; swig_initialized = 1; swig_module = scm_c_resolve_module("Swig swigrun"); if (ensure_smob_tag(swig_module, &swig_tag, "swig-pointer", "swig-pointer-tag")) { scm_set_smob_print(swig_tag, print_swig); scm_set_smob_equalp(swig_tag, equalp_swig); } if (ensure_smob_tag(swig_module, &swig_collectable_tag, "collectable-swig-pointer", "collectable-swig-pointer-tag")) { scm_set_smob_print(swig_collectable_tag, print_collectable_swig); scm_set_smob_equalp(swig_collectable_tag, equalp_swig); scm_set_smob_free(swig_collectable_tag, free_swig); /* For Guile >= 2.0.12. See libguile/smob.c:clear_smobnum */ swig_finalized_tag = swig_collectable_tag & ~0xff00; } if (ensure_smob_tag(swig_module, &swig_destroyed_tag, "destroyed-swig-pointer", "destroyed-swig-pointer-tag")) { scm_set_smob_print(swig_destroyed_tag, print_destroyed_swig); scm_set_smob_equalp(swig_destroyed_tag, equalp_swig); } if (ensure_smob_tag(swig_module, &swig_member_function_tag, "swig-member-function-pointer", "swig-member-function-pointer-tag")) { scm_set_smob_print(swig_member_function_tag, print_member_function_swig); scm_set_smob_free(swig_member_function_tag, free_swig_member_function); } swig_make_func = scm_permanent_object( scm_variable_ref(scm_c_module_lookup(scm_c_resolve_module("oop goops"), "make"))); swig_keyword = scm_permanent_object(scm_from_locale_keyword((char*) "init-smob")); swig_symbol = scm_permanent_object(scm_from_locale_symbol("swig-smob")); #ifdef SWIG_INIT_RUNTIME_MODULE SWIG_INIT_RUNTIME_MODULE #endif return swig_module; } SWIGINTERN swig_module_info * SWIG_Guile_GetModule(void *SWIGUNUSEDPARM(clientdata)) { SCM module = SWIG_Guile_Init(); SCM variable = scm_module_variable(module, scm_from_locale_symbol("swig-type-list-address" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME)); if (scm_is_false(variable)) { return NULL; } else { return (swig_module_info *) scm_to_ulong(SCM_VARIABLE_REF(variable)); } } SWIGINTERN void SWIG_Guile_SetModule(swig_module_info *swig_module) { SCM module = SWIG_Guile_Init(); scm_module_define(module, scm_from_locale_symbol("swig-type-list-address" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME), scm_from_ulong((unsigned long) swig_module)); } SWIGINTERN int SWIG_Guile_GetArgs (SCM *dest, SCM rest, int reqargs, int optargs, const char *procname) { int i; int num_args_passed = 0; for (i = 0; i 0) { $1_ltype i; $2 = (C_TYPE *) SWIG_malloc(sizeof(C_TYPE) * $1); for (i = 0; i<$1; i++) { SCM swig_scm_value = scm_vector_ref($input, scm_from_long(i)); $2[i] = SCM_TO_C_EXPR; } } else $2 = NULL; } %typemap(in, doc="$NAME is a list of " #SCM_TYPE " values") (int LISTLENINPUT, C_TYPE *LISTINPUT), (size_t LISTLENINPUT, C_TYPE *LISTINPUT) { SCM_VALIDATE_LIST($argnum, $input); $1 = scm_to_ulong(scm_length($input)); if ($1 > 0) { $1_ltype i; SCM rest; $2 = (C_TYPE *) SWIG_malloc(sizeof(C_TYPE) * $1); for (i = 0, rest = $input; i<$1; i++, rest = SCM_CDR(rest)) { SCM swig_scm_value = SCM_CAR(rest); $2[i] = SCM_TO_C_EXPR; } } else $2 = NULL; } /* Do not check for NULL pointers (override checks). */ %typemap(check) (int VECTORLENINPUT, C_TYPE *VECTORINPUT), (size_t VECTORLENINPUT, C_TYPE *VECTORINPUT), (int LISTLENINPUT, C_TYPE *LISTINPUT), (size_t LISTLENINPUT, C_TYPE *LISTINPUT) "/* no check for NULL pointer */"; /* Discard the temporary array after the call. */ %typemap(freearg) (int VECTORLENINPUT, C_TYPE *VECTORINPUT), (size_t VECTORLENINPUT, C_TYPE *VECTORINPUT), (int LISTLENINPUT, C_TYPE *LISTINPUT), (size_t LISTLENINPUT, C_TYPE *LISTINPUT) {if ($2!=NULL) SWIG_free($2);} %enddef /* output */ %define TYPEMAP_LIST_VECTOR_OUTPUT_WITH_EXPR(C_TYPE, C_TO_SCM_EXPR, SCM_TYPE) /* First we make temporary variables ARRAYLENTEMP and ARRAYTEMP, whose addresses we pass to the C function. We ignore both arguments for Scheme. */ %typemap(in,numinputs=0) (int *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT) (int arraylentemp, C_TYPE *arraytemp), (int *LISTLENOUTPUT, C_TYPE **LISTOUTPUT) (int arraylentemp, C_TYPE *arraytemp), (size_t *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT) (size_t arraylentemp, C_TYPE *arraytemp), (size_t *LISTLENOUTPUT, C_TYPE **LISTOUTPUT) (size_t arraylentemp, C_TYPE *arraytemp) %{ $1 = &arraylentemp; $2 = &arraytemp; %} /* In the ARGOUT typemaps, we convert the array into a vector or a list and append it to the results. */ %typemap(argout, doc="$NAME (a vector of " #SCM_TYPE " values)") (int *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT), (size_t *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT) { $*1_ltype i; SCM res = scm_make_vector(scm_from_long(*$1), SCM_BOOL_F); for (i = 0; i<*$1; i++) { C_TYPE swig_c_value = (*$2)[i]; SCM elt = C_TO_SCM_EXPR; scm_vector_set_x(res, scm_from_long(i), elt); } SWIG_APPEND_VALUE(res); } %typemap(argout, doc="$NAME (a list of " #SCM_TYPE " values)") (int *LISTLENOUTPUT, C_TYPE **LISTOUTPUT), (size_t *LISTLENOUTPUT, C_TYPE **LISTOUTPUT) { int i; SCM res = SCM_EOL; for (i = ((int)(*$1)) - 1; i>=0; i--) { C_TYPE swig_c_value = (*$2)[i]; SCM elt = C_TO_SCM_EXPR; res = scm_cons(elt, res); } SWIG_APPEND_VALUE(res); } /* In the FREEARG typemaps, get rid of the C vector. (This can be overridden if you want to keep the C vector.) */ %typemap(freearg) (int *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT), (size_t *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT), (int *LISTLENOUTPUT, C_TYPE **LISTOUTPUT), (size_t *LISTLENOUTPUT, C_TYPE **LISTOUTPUT) { if ((*$2)!=NULL) free(*$2); } %enddef %define TYPEMAP_LIST_VECTOR_INPUT_OUTPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, C_TO_SCM_EXPR, SCM_TYPE) TYPEMAP_LIST_VECTOR_INPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, SCM_TYPE) TYPEMAP_LIST_VECTOR_OUTPUT_WITH_EXPR(C_TYPE, C_TO_SCM_EXPR, SCM_TYPE) %enddef %define TYPEMAP_LIST_VECTOR_INPUT(C_TYPE, SCM_TO_C, SCM_TYPE) TYPEMAP_LIST_VECTOR_INPUT_WITH_EXPR (C_TYPE, SCM_TO_C(swig_scm_value), SCM_TYPE) %enddef %define TYPEMAP_LIST_VECTOR_OUTPUT(C_TYPE, C_TO_SCM, SCM_TYPE) TYPEMAP_LIST_VECTOR_OUTPUT_WITH_EXPR (C_TYPE, C_TO_SCM(swig_c_value), SCM_TYPE) %enddef %define TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(C_TYPE, SCM_TO_C, C_TO_SCM, SCM_TYPE) TYPEMAP_LIST_VECTOR_INPUT_OUTPUT_WITH_EXPR (C_TYPE, SCM_TO_C(swig_scm_value), C_TO_SCM(swig_c_value), SCM_TYPE) %enddef /* We use the macro to define typemaps for some standard types. */ TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(bool, scm_is_true, scm_from_bool, boolean); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(char, SCM_CHAR, SCM_MAKE_CHAR, char); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(unsigned char, SCM_CHAR, SCM_MAKE_CHAR, char); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(int, scm_to_int, scm_from_long, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(short, scm_to_int, scm_from_long, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(long, scm_to_long, scm_from_long, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(ptrdiff_t, scm_to_long, scm_from_long, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(unsigned int, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(unsigned short, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(unsigned long, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(size_t, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(float, scm_to_double, scm_from_double, real); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(double, scm_to_double, scm_from_double, real); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(char *, SWIG_scm2str, SWIG_str02scm, string); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(const char *, SWIG_scm2str, SWIG_str02scm, string); /* For the char *, free all strings after converting */ %typemap(freearg) (int *VECTORLENOUTPUT, char ***VECTOROUTPUT), (size_t *VECTORLENOUTPUT, char ***VECTOROUTPUT), (int *LISTLENOUTPUT, char ***LISTOUTPUT), (size_t *LISTLENOUTPUT, char ***LISTOUTPUT), (int *VECTORLENOUTPUT, const char ***VECTOROUTPUT), (size_t *VECTORLENOUTPUT, const char ***VECTOROUTPUT), (int *LISTLENOUTPUT, const char ***LISTOUTPUT), (size_t *LISTLENOUTPUT, const char ***LISTOUTPUT) { if ((*$2)!=NULL) { int i; for (i = 0; i < *$1; i++) { if ((*$2)[i] != NULL) free((*$2)[i]); } free(*$2); } } %typemap(freearg) (int VECTORLENINPUT, char **VECTORINPUT), (size_t VECTORLENINPUT, char **VECTORINPUT), (int LISTLENINPUT, char **LISTINPUT), (size_t LISTLENINPUT, char **LISTINPUT), (int VECTORLENINPUT, const char **VECTORINPUT), (size_t VECTORLENINPUT, const char **VECTORINPUT), (int LISTLENINPUT, const char **LISTINPUT), (size_t LISTLENINPUT, const char **LISTINPUT) { if (($2)!=NULL) { int i; for (i = 0; i< $1; i++) if (($2)[i] != NULL) free(($2)[i]); free($2); } } /* Following is a macro that emits typemaps that are much more flexible. (They are also messier.) It supports multiple parallel lists and vectors (sharing one length argument each). TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(C_TYPE, SCM_TO_C, C_TO_SCM, SCM_TYPE) Supported calling conventions: func(int PARALLEL_VECTORLENINPUT, [const] C_TYPE *PARALLEL_VECTORINPUT, ...) or func([const] C_TYPE *PARALLEL_VECTORINPUT, ..., int PARALLEL_VECTORLENINPUT) func(int PARALLEL_LISTLENINPUT, [const] C_TYPE *PARALLEL_LISTINPUT, ...) or func([const] C_TYPE *PARALLEL_LISTINPUT, ..., int PARALLEL_LISTLENINPUT) func(int *PARALLEL_VECTORLENOUTPUT, C_TYPE **PARALLEL_VECTOROUTPUT, ...) or func(C_TYPE **PARALLEL_VECTOROUTPUT, int *PARALLEL_VECTORLENOUTPUT, ...) func(int *PARALLEL_LISTLENOUTPUT, C_TYPE **PARALLEL_LISTOUTPUT) or func(C_TYPE **PARALLEL_LISTOUTPUT, int *PARALLEL_LISTLENOUTPUT) It is also allowed to use "size_t PARALLEL_LISTLENINPUT" rather than "int PARALLEL_LISTLENINPUT". */ %define TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, SCM_TYPE) /* input */ /* Passing data is a little complicated here; just remember: IGNORE typemaps come first, then IN, then CHECK. But if IGNORE is given, IN won't be used for this type. We need to "ignore" one of the parameters because there shall be only one argument on the Scheme side. Here we only initialize the array length to 0 but save its address for a later change. */ %typemap(in,numinputs=0) int PARALLEL_VECTORLENINPUT (int *_global_vector_length), size_t PARALLEL_VECTORLENINPUT (size_t *_global_vector_length) { $1 = 0; _global_vector_length = &$1; } %typemap(in,numinputs=0) int PARALLEL_LISTLENINPUT (int *_global_list_length), size_t PARALLEL_LISTLENINPUT (size_t *_global_list_length) { $1 = 0; _global_list_length = &$1; } /* All the work is done in IN. */ %typemap(in, doc="$NAME is a vector of " #SCM_TYPE " values") C_TYPE *PARALLEL_VECTORINPUT, const C_TYPE *PARALLEL_VECTORINPUT { SCM_VALIDATE_VECTOR($argnum, $input); *_global_vector_length = scm_c_vector_length($input); if (*_global_vector_length > 0) { int i; $1 = (C_TYPE *) SWIG_malloc(sizeof(C_TYPE) * (*_global_vector_length)); for (i = 0; i<*_global_vector_length; i++) { SCM swig_scm_value = scm_vector_ref($input, scm_from_long(i)); $1[i] = SCM_TO_C_EXPR; } } else $1 = NULL; } %typemap(in, doc="$NAME is a list of " #SCM_TYPE " values") C_TYPE *PARALLEL_LISTINPUT, const C_TYPE *PARALLEL_LISTINPUT { SCM_VALIDATE_LIST($argnum, $input); *_global_list_length = scm_to_ulong(scm_length($input)); if (*_global_list_length > 0) { int i; SCM rest; $1 = (C_TYPE *) SWIG_malloc(sizeof(C_TYPE) * (*_global_list_length)); for (i = 0, rest = $input; i<*_global_list_length; i++, rest = SCM_CDR(rest)) { SCM swig_scm_value = SCM_CAR(rest); $1[i] = SCM_TO_C_EXPR; } } else $1 = NULL; } /* Don't check for NULL pointers (override checks). */ %typemap(check) C_TYPE *PARALLEL_VECTORINPUT, const C_TYPE *PARALLEL_VECTORINPUT, C_TYPE *PARALLEL_LISTINPUT, const C_TYPE *PARALLEL_LISTINPUT "/* no check for NULL pointer */"; /* Discard the temporary array after the call. */ %typemap(freearg) C_TYPE *PARALLEL_VECTORINPUT, const C_TYPE *PARALLEL_VECTORINPUT, C_TYPE *PARALLEL_LISTINPUT, const C_TYPE *PARALLEL_LISTINPUT {if ($1!=NULL) SWIG_free($1);} %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_OUTPUT_WITH_EXPR(C_TYPE, C_TO_SCM_EXPR, SCM_TYPE) /* output */ /* First we make a temporary variable ARRAYLENTEMP, use its address as the ...LENOUTPUT argument for the C function and "ignore" the ...LENOUTPUT argument for Scheme. */ %typemap(in,numinputs=0) int *PARALLEL_VECTORLENOUTPUT (int _global_arraylentemp), size_t *PARALLEL_VECTORLENOUTPUT (size_t _global_arraylentemp), int *PARALLEL_LISTLENOUTPUT (int _global_arraylentemp), size_t *PARALLEL_LISTLENOUTPUT (size_t _global_arraylentemp) "$1 = &_global_arraylentemp;"; /* We also need to ignore the ...OUTPUT argument. */ %typemap(in,numinputs=0) C_TYPE **PARALLEL_VECTOROUTPUT (C_TYPE *arraytemp), C_TYPE **PARALLEL_LISTOUTPUT (C_TYPE *arraytemp) "$1 = &arraytemp;"; /* In the ARGOUT typemaps, we convert the array into a vector or a list and append it to the results. */ %typemap(argout, doc="$NAME (a vector of " #SCM_TYPE " values)") C_TYPE **PARALLEL_VECTOROUTPUT { int i; SCM res = scm_make_vector(scm_from_long(_global_arraylentemp), SCM_BOOL_F); for (i = 0; i<_global_arraylentemp; i++) { C_TYPE swig_c_value = (*$1)[i]; SCM elt = C_TO_SCM_EXPR; scm_vector_set_x(res, scm_from_long(i), elt); } SWIG_APPEND_VALUE(res); } %typemap(argout, doc="$NAME (a list of " #SCM_TYPE " values)") C_TYPE **PARALLEL_LISTOUTPUT { int i; SCM res = SCM_EOL; if (_global_arraylentemp > 0) { for (i = _global_arraylentemp - 1; i>=0; i--) { C_TYPE swig_c_value = (*$1)[i]; SCM elt = C_TO_SCM_EXPR; res = scm_cons(elt, res); } } SWIG_APPEND_VALUE(res); } /* In the FREEARG typemaps, get rid of the C vector. (This can be overridden if you want to keep the C vector.) */ %typemap(freearg) C_TYPE **PARALLEL_VECTOROUTPUT, C_TYPE **PARALLEL_LISTOUTPUT { if ((*$1)!=NULL) free(*$1); } %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, C_TO_SCM_EXPR, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_OUTPUT_WITH_EXPR(C_TYPE, C_TO_SCM_EXPR, SCM_TYPE) %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_INPUT(C_TYPE, SCM_TO_C, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_WITH_EXPR (C_TYPE, SCM_TO_C(swig_scm_value), SCM_TYPE) %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_OUTPUT(C_TYPE, C_TO_SCM, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_OUTPUT_WITH_EXPR (C_TYPE, C_TO_SCM(swig_c_value), SCM_TYPE) %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(C_TYPE, SCM_TO_C, C_TO_SCM, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT_WITH_EXPR (C_TYPE, SCM_TO_C(swig_scm_value), C_TO_SCM(swig_c_value), SCM_TYPE) %enddef /* We use the macro to define typemaps for some standard types. */ TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(bool, scm_is_true, scm_from_bool, boolean); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(char, SCM_CHAR, SCM_MAKE_CHAR, char); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(unsigned char, SCM_CHAR, SCM_MAKE_CHAR, char); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(int, scm_to_int, scm_from_long, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(short, scm_to_int, scm_from_long, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(long, scm_to_long, scm_from_long, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(ptrdiff_t, scm_to_long, scm_from_long, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(unsigned int, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(unsigned short, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(unsigned long, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(size_t, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(float, scm_to_double, scm_from_double, real); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(double, scm_to_double, scm_from_double, real); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(char *, SWIG_scm2str, SWIG_str02scm, string); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(const char *, SWIG_scm2str, SWIG_str02scm, string); %typemap(freearg) char **PARALLEL_LISTINPUT, char **PARALLEL_VECTORINPUT, const char **PARALLEL_LISTINPUT, const char **PARALLEL_VECTORINPUT { if (($1)!=NULL) { int i; for (i = 0; i<*_global_list_length; i++) if (($1)[i] != NULL) SWIG_free(($1)[i]); SWIG_free($1); } } %typemap(freearg) char ***PARALLEL_LISTOUTPUT, char ***PARALLEL_VECTOROUTPUT, const char ***PARALLEL_LISTOUTPUT, const char ***PARALLEL_VECTOROUTPUT { if ((*$1)!=NULL) { int i; for (i = 0; i<_global_arraylentemp; i++) if ((*$1)[i] != NULL) free((*$1)[i]); free(*$1); } } swig-4.0.2/Lib/guile/guile.i0000644000175000017500000000206413667507523015456 0ustar williamwilliam/* ----------------------------------------------------------------------------- * guile.i * * SWIG Configuration File for Guile. * ----------------------------------------------------------------------------- */ /* Macro for inserting Scheme code into the stub */ #define %scheme %insert("scheme") #define %goops %insert("goops") /* Return-styles */ %pragma(guile) return_nothing_doc = "Returns unspecified." %pragma(guile) return_one_doc = "Returns $values." %define %values_as_list %pragma(guile) beforereturn = "" %pragma(guile) return_multi_doc = "Returns a list of $num_values values: $values." %enddef %values_as_list /* the default style */ %define %values_as_vector %pragma(guile) beforereturn = "GUILE_MAYBE_VECTOR" %pragma(guile) return_multi_doc = "Returns a vector of $num_values values: $values." %enddef %define %multiple_values %pragma(guile) beforereturn = "GUILE_MAYBE_VALUES" %pragma(guile) return_multi_doc = "Returns $num_values values: $values." %enddef #define GUILE_APPEND_RESULT SWIG_APPEND_VALUE %include swig-4.0.2/Lib/guile/Makefile0000644000175000017500000000003513667507523015633 0ustar williamwilliam co: co RCS/*.i* RCS/*.swg* swig-4.0.2/Lib/guile/extra-install.list0000644000175000017500000000004713667507523017662 0ustar williamwilliam# see top-level Makefile.in common.scm swig-4.0.2/Lib/guile/std_common.i0000644000175000017500000000111413667507523016506 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; #define SWIG_bool2scm(b) scm_from_bool(b ? 1 : 0) #define SWIG_string2scm(s) SWIG_str02scm(s.c_str()) %{ #include SWIGINTERNINLINE std::string SWIG_scm2string(SCM x) { char* temp; temp = SWIG_scm2str(x); std::string s(temp); if (temp) SWIG_free(temp); return s; } %} swig-4.0.2/Lib/guile/guile_scm.swg0000644000175000017500000000235713667507523016675 0ustar williamwilliam/* ----------------------------------------------------------------------------- * guile_scm.swg * * This SWIG interface file is processed if the Guile module is run * with SCM_ flavor. * ----------------------------------------------------------------------------- */ #define SWIGGUILE_SCM %runtime "swigrun.swg" // Common C API type-checking code %runtime "swigerrors.swg" // SWIG errors %runtime "guile_scm_run.swg" %include %runtime %{ #define GUILE_MAYBE_VALUES \ if (gswig_list_p) gswig_result = scm_values(gswig_result); #define GUILE_MAYBE_VECTOR \ if (gswig_list_p) gswig_result = scm_vector(gswig_result); #define SWIG_APPEND_VALUE(object) \ if (gswig_result == SCM_UNSPECIFIED) \ gswig_result = object; \ else { \ if (!gswig_list_p) { \ gswig_list_p = 1; \ gswig_result = scm_list_n(gswig_result, object, SCM_UNDEFINED); \ } \ else \ gswig_result = scm_append(scm_list_n(gswig_result, scm_list_n(object, SCM_UNDEFINED), SCM_UNDEFINED)); \ } %} %insert(init) "swiginit.swg" %init %{ SWIG_GUILE_INIT_STATIC void SWIG_init(void) { SWIG_InitializeModule(0); SWIG_PropagateClientData(); %} swig-4.0.2/Lib/guile/swigrun.i0000644000175000017500000000170513667507523016050 0ustar williamwilliam/* -*- mode: c -*- */ %module swigrun #ifdef SWIGGUILE_SCM /* Hook the runtime module initialization into the shared initialization function SWIG_Guile_Init. */ %runtime %{ /* Hook the runtime module initialization into the shared initialization function SWIG_Guile_Init. */ #include #ifdef __cplusplus extern "C" #endif SCM scm_init_Swig_swigrun_module (void); #define SWIG_INIT_RUNTIME_MODULE scm_init_Swig_swigrun_module(); %} /* The runtime type system from common.swg */ typedef struct swig_type_info swig_type_info; const char * SWIG_TypeName(const swig_type_info *type); const char * SWIG_TypePrettyName(const swig_type_info *type); swig_type_info * SWIG_TypeQuery(const char *); /* Language-specific stuff */ %apply bool { int }; int SWIG_IsPointer(SCM object); int SWIG_IsPointerOfType(SCM object, swig_type_info *type); unsigned long SWIG_PointerAddress(SCM object); swig_type_info * SWIG_PointerType(SCM object); #endif swig-4.0.2/Lib/guile/std_except.i0000644000175000017500000000031213667507523016505 0ustar williamwilliam// TODO: STL exception handling // Note that the generic std_except.i file did not work %{ #include #include %} namespace std { %ignore exception; struct exception { }; } swig-4.0.2/Lib/guile/guilemain.i0000644000175000017500000000161213667507523016321 0ustar williamwilliam/* ----------------------------------------------------------------------------- * guilemain.i * * The main functions for a user augmented guile * version that can handle wrapped calls as generated by SWIG * ----------------------------------------------------------------------------- */ %{ #include #ifdef __cplusplus extern "C" { #endif static void inner_main(void *closure, int argc, char **argv) { #ifdef SWIGINIT SWIGINIT #else SWIG_init(); /* SWIG init function */ #endif scm_shell(argc, argv); /* scheme interpreter */ /* never reached: scm_shell will perform an exit */ } #ifdef __cplusplus } #endif int main(int argc, char **argv) { /* put any default initialisation code here: e.g. exit handlers */ scm_boot_guile(argc, argv, inner_main, 0); /* make a stack entry for the garbage collector */ return 0; /* never reached, but avoids a warning */ } %} swig-4.0.2/Lib/guile/typemaps.i0000644000175000017500000003727513667507523016227 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Guile-specific typemaps * ----------------------------------------------------------------------------- */ /* Pointers */ %typemap(in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, 0); } %typemap(freearg) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] ""; %typemap(in) void * { $1 = ($1_ltype)SWIG_MustGetPtr($input, NULL, $argnum, 0); } %typemap(freearg) void * ""; %typemap(varin) SWIGTYPE * { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0); } %typemap(varin) SWIGTYPE & { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE && { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE [] { scm_wrong_type_arg((char *) FUNC_NAME, 1, $input); } %typemap(varin) SWIGTYPE [ANY] { void *temp; int ii; $1_basetype *b = 0; temp = SWIG_MustGetPtr($input, $1_descriptor, 1, 0); b = ($1_basetype *) $1; for (ii = 0; ii < $1_size; ii++) b[ii] = *(($1_basetype *) temp + ii); } %typemap(varin) void * { $1 = SWIG_MustGetPtr($input, NULL, 1, 0); } %typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); $result = SWIG_NewPointerObj ($1, ty, $owner); } %typemap(varout) SWIGTYPE *, SWIGTYPE [] { $result = SWIG_NewPointerObj ($1, $descriptor, 0); } %typemap(varout) SWIGTYPE & { $result = SWIG_NewPointerObj((void *) &$1, $1_descriptor, 0); } %typemap(varout) SWIGTYPE && { $result = SWIG_NewPointerObj((void *) &$1, $1_descriptor, 0); } %typemap(throws) SWIGTYPE { $<ype temp = new $ltype($1); scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(SWIG_NewPointerObj(temp, $&descriptor, 1), SCM_UNDEFINED)); } %typemap(throws) SWIGTYPE & { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(SWIG_NewPointerObj(&$1, $descriptor, 1), SCM_UNDEFINED)); } %typemap(throws) SWIGTYPE && { scm_throw(gh_symbol2scm((char *) "swig-exception"), gh_list(SWIG_NewPointerObj(&$1, $descriptor, 1), SCM_UNDEFINED)); } %typemap(throws) SWIGTYPE * { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(SWIG_NewPointerObj($1, $descriptor, 1), SCM_UNDEFINED)); } %typemap(throws) SWIGTYPE [] { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(SWIG_NewPointerObj($1, $descriptor, 1), SCM_UNDEFINED)); } /* Change of object ownership, and interaction of destructor-like functions and the garbage-collector */ %typemap(in, doc="$NAME is of type <$type> and gets destroyed by the function") SWIGTYPE *DESTROYED { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, 0); } %typemap(freearg) SWIGTYPE *DESTROYED { SWIG_Guile_MarkPointerDestroyed($input); } %typemap(in, doc="$NAME is of type <$type> and is consumed by the function") SWIGTYPE *CONSUMED { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, 0); SWIG_Guile_MarkPointerNoncollectable($input); } /* Pass-by-value */ %typemap(in) SWIGTYPE($&1_ltype argp) { argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, $argnum, 0); $1 = *argp; } %typemap(varin) SWIGTYPE { $&1_ltype argp; argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, 1, 0); $1 = *argp; } %typemap(out) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype((const $1_ltype &) $1); $result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 1); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); } #endif %typemap(varout) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype((const $1_ltype&) $1); $result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 0); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); } #endif /* Enums */ %typemap(in) enum SWIGTYPE { $1 = ($1_type) scm_to_int($input); } /* The complicated construction below needed to deal with anonymous enums, which cannot be cast to. */ %typemap(varin) enum SWIGTYPE { if (sizeof(int) != sizeof($1)) { scm_error(scm_from_locale_symbol("swig-error"), (char *) FUNC_NAME, (char *) "enum variable '$name' cannot be set", SCM_EOL, SCM_BOOL_F); } * (int *) &($1) = scm_to_int($input); } %typemap(out) enum SWIGTYPE { $result = scm_from_long((int)$1); } %typemap(varout) enum SWIGTYPE { $result = scm_from_long((int)$1); } %typemap(throws) enum SWIGTYPE { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(scm_from_long((int)$1), SCM_UNDEFINED)); } /* The SIMPLE_MAP_WITH_EXPR macro below defines the whole set of typemaps needed for simple types. -- SCM_TO_C_EXPR is a C expression that translates the Scheme value "swig_scm_value" to a C value. -- C_TO_SCM_EXPR is a C expression that translates the C value "swig_c_value" to a Scheme value. */ %define SIMPLE_MAP_WITH_EXPR(C_NAME, SCM_TO_C_EXPR, C_TO_SCM_EXPR, SCM_NAME) %typemap (in, doc="$NAME is of type <" #SCM_NAME ">") C_NAME { SCM swig_scm_value = $input; $1 = SCM_TO_C_EXPR; } %typemap (varin, doc="NEW-VALUE is of type <" #SCM_NAME ">") C_NAME { SCM swig_scm_value = $input; $1 = SCM_TO_C_EXPR; } %typemap (out, doc="<" #SCM_NAME ">") C_NAME { C_NAME swig_c_value = $1; $result = C_TO_SCM_EXPR; } %typemap (varout, doc="<" #SCM_NAME ">") C_NAME { C_NAME swig_c_value = $1; $result = C_TO_SCM_EXPR; } /* INPUT and OUTPUT */ %typemap (in, doc="$NAME is of type <" #SCM_NAME ">)") C_NAME *INPUT(C_NAME temp) { SCM swig_scm_value = $input; temp = (C_NAME) SCM_TO_C_EXPR; $1 = &temp; } %typemap (in,numinputs=0) C_NAME *OUTPUT (C_NAME temp) {$1 = &temp;} %typemap (argout,doc="$name (of type <" #SCM_NAME ">)") C_NAME *OUTPUT { C_NAME swig_c_value = *$1; SWIG_APPEND_VALUE(C_TO_SCM_EXPR); } %typemap (in) C_NAME *BOTH = C_NAME *INPUT; %typemap (argout) C_NAME *BOTH = C_NAME *OUTPUT; %typemap (in) C_NAME *INOUT = C_NAME *INPUT; %typemap (argout) C_NAME *INOUT = C_NAME *OUTPUT; /* Const primitive references. Passed by value */ %typemap(in, doc="$NAME is of type <" #SCM_NAME ">") const C_NAME & (C_NAME temp) { SCM swig_scm_value = $input; temp = SCM_TO_C_EXPR; $1 = &temp; } %typemap(out, doc="<" #SCM_NAME ">") const C_NAME & { C_NAME swig_c_value = *$1; $result = C_TO_SCM_EXPR; } /* Throw typemap */ %typemap(throws) C_NAME { C_NAME swig_c_value = $1; scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(C_TO_SCM_EXPR, SCM_UNDEFINED)); } %enddef /* The SIMPLE_MAP macro below defines the whole set of typemaps needed for simple types. It generates slightly simpler code than the macro above, but it is only suitable for very simple conversion expressions. */ %define SIMPLE_MAP(C_NAME, SCM_TO_C, C_TO_SCM, SCM_NAME) %typemap (in, doc="$NAME is of type <" #SCM_NAME ">") C_NAME {$1 = ($1_ltype) SCM_TO_C($input);} %typemap (varin, doc="NEW-VALUE is of type <" #SCM_NAME ">") C_NAME {$1 = ($1_ltype) SCM_TO_C($input);} %typemap (out, doc="<" #SCM_NAME ">") C_NAME {$result = C_TO_SCM($1);} %typemap (varout, doc="<" #SCM_NAME ">") C_NAME {$result = C_TO_SCM($1);} /* INPUT and OUTPUT */ %typemap (in, doc="$NAME is of type <" #SCM_NAME ">)") C_NAME *INPUT(C_NAME temp), C_NAME &INPUT(C_NAME temp) { temp = (C_NAME) SCM_TO_C($input); $1 = &temp; } %typemap (in,numinputs=0) C_NAME *OUTPUT (C_NAME temp), C_NAME &OUTPUT(C_NAME temp) {$1 = &temp;} %typemap (argout,doc="$name (of type <" #SCM_NAME ">)") C_NAME *OUTPUT, C_NAME &OUTPUT {SWIG_APPEND_VALUE(C_TO_SCM(*$1));} %typemap (in) C_NAME *BOTH = C_NAME *INPUT; %typemap (argout) C_NAME *BOTH = C_NAME *OUTPUT; %typemap (in) C_NAME *INOUT = C_NAME *INPUT; %typemap (argout) C_NAME *INOUT = C_NAME *OUTPUT; %typemap (in) C_NAME &INOUT = C_NAME &INPUT; %typemap (argout) C_NAME &INOUT = C_NAME &OUTPUT; /* Const primitive references. Passed by value */ %typemap(in, doc="$NAME is of type <" #SCM_NAME ">") const C_NAME & (C_NAME temp) { temp = SCM_TO_C($input); $1 = ($1_ltype) &temp; } %typemap(out, doc="<" #SCM_NAME ">") const C_NAME & { $result = C_TO_SCM(*$1); } /* Throw typemap */ %typemap(throws) C_NAME { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(C_TO_SCM($1), SCM_UNDEFINED)); } %enddef SIMPLE_MAP(bool, scm_is_true, scm_from_bool, boolean); SIMPLE_MAP(char, SCM_CHAR, SCM_MAKE_CHAR, char); SIMPLE_MAP(unsigned char, SCM_CHAR, SCM_MAKE_CHAR, char); SIMPLE_MAP(signed char, SCM_CHAR, SCM_MAKE_CHAR, char); SIMPLE_MAP(int, scm_to_int, scm_from_long, integer); SIMPLE_MAP(short, scm_to_short, scm_from_long, integer); SIMPLE_MAP(long, scm_to_long, scm_from_long, integer); SIMPLE_MAP(ptrdiff_t, scm_to_long, scm_from_long, integer); SIMPLE_MAP(unsigned int, scm_to_uint, scm_from_ulong, integer); SIMPLE_MAP(unsigned short, scm_to_ushort, scm_from_ulong, integer); SIMPLE_MAP(unsigned long, scm_to_ulong, scm_from_ulong, integer); SIMPLE_MAP(size_t, scm_to_ulong, scm_from_ulong, integer); SIMPLE_MAP(float, scm_to_double, scm_from_double, real); SIMPLE_MAP(double, scm_to_double, scm_from_double, real); // SIMPLE_MAP(char *, SWIG_scm2str, SWIG_str02scm, string); // SIMPLE_MAP(const char *, SWIG_scm2str, SWIG_str02scm, string); /* Define long long typemaps -- uses functions that are only defined in recent versions of Guile, availability also depends on Guile's configuration. */ SIMPLE_MAP(long long, scm_to_long_long, scm_from_long_long, integer); SIMPLE_MAP(unsigned long long, scm_to_ulong_long, scm_from_ulong_long, integer); /* Strings */ %typemap (in, doc="$NAME is a string") char *(int must_free = 0) { $1 = ($1_ltype)SWIG_scm2str($input); must_free = 1; } %typemap (varin, doc="NEW-VALUE is a string") char * {$1 = ($1_ltype)SWIG_scm2str($input);} %typemap (out, doc="") char * {$result = SWIG_str02scm((const char *)$1);} %typemap (varout, doc="") char * {$result = SWIG_str02scm($1);} %typemap (in, doc="$NAME is a string") char **INPUT(char * temp, int must_free = 0) { temp = (char *) SWIG_scm2str($input); $1 = &temp; must_free = 1; } %typemap (in,numinputs=0) char **OUTPUT (char * temp) {$1 = &temp;} %typemap (argout,doc="$NAME (a string)") char **OUTPUT {SWIG_APPEND_VALUE(SWIG_str02scm(*$1));} %typemap (in) char **BOTH = char **INPUT; %typemap (argout) char **BOTH = char **OUTPUT; %typemap (in) char **INOUT = char **INPUT; %typemap (argout) char **INOUT = char **OUTPUT; /* SWIG_scm2str makes a malloc'ed copy of the string, so get rid of it after the function call. */ %typemap (freearg) char * "if (must_free$argnum && $1) SWIG_free($1);"; %typemap (freearg) char **INPUT, char **BOTH "if (must_free$argnum && (*$1)) SWIG_free(*$1);" %typemap (freearg) char **OUTPUT "SWIG_free(*$1);" /* But this shall not apply if we try to pass a single char by reference. */ %typemap (freearg) char *OUTPUT, char *BOTH ""; /* If we set a string variable, delete the old result first, unless const. */ %typemap (varin) char * { if ($1) free($1); $1 = ($1_ltype) SWIG_scm2str($input); } %typemap (varin) const char * { $1 = ($1_ltype) SWIG_scm2str($input); } %typemap(throws) char * { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(SWIG_str02scm($1), SCM_UNDEFINED)); } /* Void */ %typemap (out,doc="") void "gswig_result = SCM_UNSPECIFIED;"; /* SCM is passed through */ typedef unsigned long SCM; %typemap (in) SCM "$1=$input;"; %typemap (out) SCM "$result=$1;"; %typecheck(SWIG_TYPECHECK_POINTER) SCM "$1=1;"; /* ------------------------------------------------------------ * String & length * ------------------------------------------------------------ */ %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { size_t temp; $1 = ($1_ltype) SWIG_Guile_scm2newstr($input, &temp); $2 = ($2_ltype) temp; } /* ------------------------------------------------------------ * CLASS::* (member function pointer) typemaps * taken from typemaps/swigtype.swg * ------------------------------------------------------------ */ #define %set_output(obj) $result = obj #define %set_varoutput(obj) $result = obj #define %argument_fail(code, type, name, argn) scm_wrong_type_arg((char *) FUNC_NAME, argn, $input); #define %as_voidptr(ptr) (void*)(ptr) %typemap(in) SWIGTYPE (CLASS::*) { int res = SWIG_ConvertMember($input, %as_voidptr(&$1), sizeof($type),$descriptor); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } } %typemap(out,noblock=1) SWIGTYPE (CLASS::*) { %set_output(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); } %typemap(varin) SWIGTYPE (CLASS::*) { int res = SWIG_ConvertMember($input,%as_voidptr(&$1), sizeof($type), $descriptor); if (!SWIG_IsOK(res)) { scm_wrong_type_arg((char *) FUNC_NAME, 1, $input); } } %typemap(varout,noblock=1) SWIGTYPE (CLASS::*) { %set_varoutput(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); } /* ------------------------------------------------------------ * Typechecking rules * ------------------------------------------------------------ */ /* adapted from python.swg */ %typecheck(SWIG_TYPECHECK_INTEGER) int, short, long, unsigned int, unsigned short, unsigned long, signed char, unsigned char, long long, unsigned long long, size_t, ptrdiff_t, std::size_t, std::ptrdiff_t, const int &, const short &, const long &, const unsigned int &, const unsigned short &, const unsigned long &, const long long &, const unsigned long long &, const size_t &, const ptrdiff_t &, const std::size_t &, const std::ptrdiff_t &, enum SWIGTYPE { $1 = scm_is_true(scm_integer_p($input)) && scm_is_true(scm_exact_p($input))? 1 : 0; } %typecheck(SWIG_TYPECHECK_BOOL) bool, bool&, const bool& { $1 = SCM_BOOLP($input) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_DOUBLE) float, double, const float &, const double & { $1 = scm_is_true(scm_real_p($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = SCM_CHARP($input) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = scm_is_string($input) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [] { void *ptr; int res = SWIG_ConvertPtr($input, &ptr, $1_descriptor, 0); $1 = SWIG_CheckState(res); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE &, SWIGTYPE && { void *ptr; int res = SWIG_ConvertPtr($input, &ptr, $1_descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; int res = SWIG_ConvertPtr($input, &ptr, $&descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; int res = SWIG_ConvertPtr($input, &ptr, 0, 0); $1 = SWIG_CheckState(res); } /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* typemaps.i ends here */ swig-4.0.2/Lib/guile/ports.i0000644000175000017500000000247013667507523015521 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ports.i * * Guile typemaps for handling ports * ----------------------------------------------------------------------------- */ %{ #ifndef _POSIX_SOURCE /* This is needed on Solaris for fdopen(). */ # define _POSIX_SOURCE 199506L #endif #include #include #include %} /* This typemap for FILE * accepts (1) FILE * pointer objects, (2) Scheme file ports. In this case, it creates a temporary C stream which reads or writes from a dup'ed file descriptor. */ %typemap(in, doc="$NAME is a file port or a FILE * pointer") FILE * { if (SWIG_ConvertPtr($input, (void**) &($1), $1_descriptor, 0) != 0) { if (!(SCM_FPORTP($input))) { scm_wrong_type_arg("$symname", $argnum, $input); } else { int fd; if (SCM_OUTPUT_PORT_P($input)) { scm_force_output($input); } fd=dup(SCM_FPORT_FDES($input)); if (fd==-1) { scm_misc_error("$symname", strerror(errno), SCM_EOL); } $1=fdopen(fd, SCM_OUTPUT_PORT_P($input) ? (SCM_INPUT_PORT_P($input) ? "r+" : "w") : "r"); if ($1==NULL) { scm_misc_error("$symname", strerror(errno), SCM_EOL); } } } } %typemap(freearg) FILE* { if ($1) { fclose($1); } } swig-4.0.2/Lib/guile/std_pair.i0000644000175000017500000011767013667507523016170 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // // See std_vector.i for the rationale of typemap application // ------------------------------------------------------------------------ %{ #include %} // exported class namespace std { template struct pair { %typemap(in) pair %{ if (scm_is_pair($input)) { T* x; U* y; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); $1 = std::make_pair(*x,*y); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } %} %typemap(in) const pair& (std::pair *temp = 0), const pair* (std::pair *temp = 0) %{ if (scm_is_pair($input)) { T* x; U* y; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); temp = new std::pair< T, U >(*x,*y); $1 = temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } %} %typemap(freearg) const pair&, const pair* %{ delete temp$argnum; %} %typemap(out) pair { T* x = new T($1.first); U* y = new U($1.second); SCM first = SWIG_NewPointerObj(x,$descriptor(T *), 1); SCM second = SWIG_NewPointerObj(y,$descriptor(U *), 1); $result = scm_cons(first,second); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (scm_is_pair($input)) { T* x; U* y; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) == 0 && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) == 0) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (scm_is_pair($input)) { T* x; U* y; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) == 0 && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) == 0) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // specializations for built-ins %define specialize_std_pair_on_first(T,CHECK,CONVERT_FROM,CONVERT_TO) template struct pair { %typemap(in) pair %{ if (scm_is_pair($input)) { U* y; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); if (!CHECK(first)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); $1 = std::make_pair(CONVERT_FROM(first),*y); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } %} %typemap(in) const pair& (std::pair *temp = 0), const pair* (std::pair *temp = 0) %{ if (scm_is_pair($input)) { U* y; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); if (!CHECK(first)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); temp = new std::pair< T, U >(CONVERT_FROM(first),*y); $1 = temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } %} %typemap(freearg) const pair&, const pair* %{ delete temp$argnum; %} %typemap(out) pair { U* y = new U($1.second); SCM second = SWIG_NewPointerObj(y,$descriptor(U *), 1); $result = scm_cons(CONVERT_TO($1.first),second); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (scm_is_pair($input)) { U* y; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (CHECK(first) && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) == 0) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (scm_is_pair($input)) { U* y; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (CHECK(first) && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) == 0) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; %enddef %define specialize_std_pair_on_second(U,CHECK,CONVERT_FROM,CONVERT_TO) template struct pair { %typemap(in) pair %{ if (scm_is_pair($input)) { T* x; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); $1 = std::make_pair(*x,CONVERT_FROM(second)); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } %} %typemap(in) const pair& (std::pair *temp = 0), const pair* (std::pair *temp = 0) %{ if (scm_is_pair($input)) { T* x; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); temp = new std::pair< T, U >(*x,CONVERT_FROM(second)); $1 = temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } %} %typemap(freearg) const pair&, const pair* %{ delete temp$argnum; %} %typemap(out) pair { T* x = new T($1.first); SCM first = SWIG_NewPointerObj(x,$descriptor(T *), 1); $result = scm_cons(first,CONVERT_TO($1.second)); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (scm_is_pair($input)) { T* x; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) == 0 && CHECK(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (scm_is_pair($input)) { T* x; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) == 0 && CHECK(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; %enddef %define specialize_std_pair_on_both(T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO, U,CHECK_U,CONVERT_U_FROM,CONVERT_U_TO) template<> struct pair { %typemap(in) pair %{ if (scm_is_pair($input)) { SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); if (!CHECK_T(first) || !CHECK_U(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); $1 = std::make_pair(CONVERT_T_FROM(first), CONVERT_U_FROM(second)); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } %} %typemap(in) const pair& (std::pair *temp = 0), const pair* (std::pair *temp = 0) %{ if (scm_is_pair($input)) { SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); if (!CHECK_T(first) || !CHECK_U(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); temp = new std::pair< T, U >(CONVERT_T_FROM(first), CONVERT_U_FROM(second)); $1 = temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } %} %typemap(freearg) const pair&, const pair* %{ delete temp$argnum; %} %typemap(out) pair { $result = scm_cons(CONVERT_T_TO($1.first), CONVERT_U_TO($1.second)); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (scm_is_pair($input)) { SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (CHECK_T(first) && CHECK_U(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (scm_is_pair($input)) { SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (CHECK_T(first) && CHECK_U(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; %enddef specialize_std_pair_on_first(bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_first(int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_first(short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_first(long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_first(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_first(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_first(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_first(double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_first(float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_first(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_second(bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_second(int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_second(short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_second(long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_second(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_second(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_second(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_second(double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_second(float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_second(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); } swig-4.0.2/Lib/guile/stl.i0000644000175000017500000000044313667507523015152 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/guile/cplusplus.i0000644000175000017500000000136313667507523016404 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cplusplus.i * * SWIG typemaps for C++ * ----------------------------------------------------------------------------- */ %typemap(guile,out) string, std::string { $result = SWIG_str02scm(const_cast($1.c_str())); } %typemap(guile,in) string, std::string { $1 = SWIG_scm2str($input); } %typemap(guile,out) complex, complex, std::complex { $result = scm_make_rectangular( scm_from_double ($1.real ()), scm_from_double ($1.imag ()) ); } %typemap(guile,in) complex, complex, std::complex { $1 = std::complex( scm_to_double (scm_real_part ($input)), scm_to_double (scm_imag_part ($input)) ); } swig-4.0.2/Lib/guile/pointer-in-out.i0000644000175000017500000000637513667507523017253 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pointer-in-out.i * * Guile typemaps for passing pointers indirectly * ----------------------------------------------------------------------------- */ /* Here is a macro that will define typemaps for passing C pointers indirectly. TYPEMAP_POINTER_INPUT_OUTPUT(PTRTYPE, SCM_TYPE) Supported calling conventions (in this example, PTRTYPE is int *): func(int **INPUT) Scheme wrapper will take one argument, a wrapped C pointer. The address of a variable containing this pointer will be passed to the function. func(int **INPUT_CONSUMED) Likewise, but mark the pointer object as not garbage collectable. func(int **INPUT_DESTROYED) Likewise, but mark the pointer object as destroyed. func(int **OUTPUT) Scheme wrapper will take no arguments. The address of an int * variable will be passed to the function. The function is expected to modify the variable; its value is wrapped and becomes an extra return value. (See the documentation on how to deal with multiple values.) func(int **OUTPUT_NONCOLLECTABLE) Likewise, but make the pointer object not garbage collectable. func(int **BOTH) func(int **INOUT) This annotation combines INPUT and OUTPUT. */ %define TYPEMAP_POINTER_INPUT_OUTPUT(PTRTYPE, SCM_TYPE) %typemap(in, doc="$NAME is of type <" #SCM_TYPE ">") PTRTYPE *INPUT(PTRTYPE temp) { if (SWIG_ConvertPtr($input, (void **) &temp, $*descriptor, 0)) { scm_wrong_type_arg(FUNC_NAME, $argnum, $input); } $1 = &temp; } %typemap(in, doc="$NAME is of type <" #SCM_TYPE "> and is consumed by the function") PTRTYPE *INPUT_CONSUMED(PTRTYPE temp) { if (SWIG_ConvertPtr($input, (void **) &temp, $*descriptor, 0)) { scm_wrong_type_arg(FUNC_NAME, $argnum, $input); } SWIG_Guile_MarkPointerNoncollectable($input); $1 = &temp; } %typemap(in, doc="$NAME is of type <" #SCM_TYPE "> and is consumed by the function") PTRTYPE *INPUT_DESTROYED(PTRTYPE temp) { if (SWIG_ConvertPtr($input, (void **) &temp, $*descriptor, 0)) { scm_wrong_type_arg(FUNC_NAME, $argnum, $input); } SWIG_Guile_MarkPointerDestroyed($input); $1 = &temp; } %typemap(in, numinputs=0) PTRTYPE *OUTPUT(PTRTYPE temp), PTRTYPE *OUTPUT_NONCOLLECTABLE(PTRTYPE temp) "$1 = &temp;"; %typemap(argout, doc="<" #SCM_TYPE ">") PTRTYPE *OUTPUT "SWIG_APPEND_VALUE(SWIG_NewPointerObj(*$1, $*descriptor, 1));"; %typemap(argout, doc="<" #SCM_TYPE ">") PTRTYPE *OUTPUT_NONCOLLECTABLE "SWIG_APPEND_VALUE(SWIG_NewPointerObj(*$1, $*descriptor, 0));"; %typemap(in) PTRTYPE *BOTH = PTRTYPE *INPUT; %typemap(argout) PTRTYPE *BOTH = PTRTYPE *OUTPUT; %typemap(in) PTRTYPE *INOUT = PTRTYPE *INPUT; %typemap(argout) PTRTYPE *INOUT = PTRTYPE *OUTPUT; /* As a special convenience measure, also attach docs involving SCM_TYPE to the standard pointer typemaps */ %typemap(in, doc="$NAME is of type <" #SCM_TYPE ">") PTRTYPE { if (SWIG_ConvertPtr($input, (void **) &$1, $descriptor, 0)) scm_wrong_type_arg(FUNC_NAME, $argnum, $input); } %typemap(out, doc="<" #SCM_TYPE ">") PTRTYPE { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } %enddef swig-4.0.2/Lib/guile/std_string.i0000644000175000017500000000444113667507523016532 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ %include %{ #include %} namespace std { %naturalvar string; class string; %typemap(typecheck) string = char *; %typemap(typecheck) const string & = char *; %typemap(in) string (char * tempptr) { if (scm_is_string($input)) { tempptr = SWIG_scm2str($input); $1.assign(tempptr); if (tempptr) SWIG_free(tempptr); } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(in) const string & ($*1_ltype temp, char *tempptr) { if (scm_is_string($input)) { tempptr = SWIG_scm2str($input); temp.assign(tempptr); if (tempptr) SWIG_free(tempptr); $1 = &temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(in) string * (char *tempptr) { if (scm_is_string($input)) { tempptr = SWIG_scm2str($input); $1 = new $*1_ltype(tempptr); if (tempptr) SWIG_free(tempptr); } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(out) string { $result = SWIG_str02scm($1.c_str()); } %typemap(out) const string & { $result = SWIG_str02scm($1->c_str()); } %typemap(out) string * { $result = SWIG_str02scm($1->c_str()); } %typemap(varin) string { if (scm_is_string($input)) { char *tempptr = SWIG_scm2str($input); $1.assign(tempptr); if (tempptr) SWIG_free(tempptr); } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(varout) string { $result = SWIG_str02scm($1.c_str()); } } swig-4.0.2/Lib/guile/std_map.i0000644000175000017500000017104613667507523016007 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // // The aim of all that follows would be to integrate std::map with // Guile as much as possible, namely, to allow the user to pass and // be returned Scheme association lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::map), f(const std::map&), f(const std::map*): // the parameter being read-only, either a Scheme alist or a // previously wrapped std::map can be passed. // -- f(std::map&), f(std::map*): // the parameter must be modified; therefore, only a wrapped std::map // can be passed. // -- std::map f(): // the map is returned by copy; therefore, a Scheme alist // is returned which is most easily used in other Scheme functions // -- std::map& f(), std::map* f(), const std::map& f(), // const std::map* f(): // the map is returned by reference; therefore, a wrapped std::map // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { %typemap(in) map< K, T, C > { if (scm_is_null($input)) { $1 = std::map< K, T, C >(); } else if (scm_is_pair($input)) { $1 = std::map< K, T, C >(); SCM alist = $input; while (!scm_is_null(alist)) { K* k; T* x; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != 0) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } (($1_type &)$1)[*k] = *x; alist = SCM_CDR(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp), const map< K, T, C >* (std::map< K, T, C > temp) { if (scm_is_null($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::map< K, T, C >(); $1 = &temp; SCM alist = $input; while (!scm_is_null(alist)) { K* k; T* x; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != 0) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } temp[*k] = *x; alist = SCM_CDR(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { SCM alist = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { K* key = new K(i->first); T* val = new T(i->second); SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1); SCM x = SWIG_NewPointerObj(val,$descriptor(T *), 1); SCM entry = scm_cons(k,x); alist = scm_cons(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { /* native sequence? */ if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ K* k; T* x; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (SWIG_ConvertPtr(key,(void**) &k, $descriptor(K *), 0) != 0) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { /* wrapped map? */ std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { /* native sequence? */ if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ K* k; T* x; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (SWIG_ConvertPtr(key,(void**) &k, $descriptor(K *), 0) != 0) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { /* wrapped map? */ std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& __getitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(const K& key, const T& x) { (*self)[key] = x; } void __delitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } SCM keys() { SCM result = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { K* key = new K(i->first); SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1); result = scm_cons(k,result); } return result; } } }; // specializations for built-ins %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) template class map< K, T, C > { %typemap(in) map< K, T, C > { if (scm_is_null($input)) { $1 = std::map< K, T, C >(); } else if (scm_is_pair($input)) { $1 = std::map< K, T, C >(); SCM alist = $input; while (!scm_is_null(alist)) { T* x; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); if (!CHECK(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != 0) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } (($1_type &)$1)[CONVERT_FROM(key)] = *x; alist = SCM_CDR(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp), const map< K, T, C >* (std::map< K, T, C > temp) { if (scm_is_null($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::map< K, T, C >(); $1 = &temp; SCM alist = $input; while (!scm_is_null(alist)) { T* x; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); if (!CHECK(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != 0) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } temp[CONVERT_FROM(key)] = *x; alist = SCM_CDR(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { SCM alist = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { T* val = new T(i->second); SCM k = CONVERT_TO(i->first); SCM x = SWIG_NewPointerObj(val,$descriptor(T *), 1); SCM entry = scm_cons(k,x); alist = scm_cons(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only T* x; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (!CHECK(key)) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only T* x; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (!CHECK(key)) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T& __getitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(K key, const T& x) { (*self)[key] = x; } void __delitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(K key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } SCM keys() { SCM result = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { SCM k = CONVERT_TO(i->first); result = scm_cons(k,result); } return result; } } }; %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) template class map< K, T, C > { %typemap(in) map< K, T, C > { if (scm_is_null($input)) { $1 = std::map< K, T, C >(); } else if (scm_is_pair($input)) { $1 = std::map< K, T, C >(); SCM alist = $input; while (!scm_is_null(alist)) { K* k; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (!CHECK(val)) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); if (!CHECK(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } (($1_type &)$1)[*k] = CONVERT_FROM(val); alist = SCM_CDR(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp), const map< K, T, C >* (std::map< K, T, C > temp) { if (scm_is_null($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::map< K, T, C >(); $1 = &temp; SCM alist = $input; while (!scm_is_null(alist)) { K* k; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (!CHECK(val)) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); if (!CHECK(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } temp[*k] = CONVERT_FROM(val); alist = SCM_CDR(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { SCM alist = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { K* key = new K(i->first); SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1); SCM x = CONVERT_TO(i->second); SCM entry = scm_cons(k,x); alist = scm_cons(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only K* k; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM val = SCM_CDR(head); if (SWIG_ConvertPtr(val,(void **) &k, $descriptor(K *), 0) != 0) { $1 = 0; } else { if (CHECK(val)) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (CHECK(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only K* k; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM val = SCM_CDR(head); if (SWIG_ConvertPtr(val,(void **) &k, $descriptor(K *), 0) != 0) { $1 = 0; } else { if (CHECK(val)) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (CHECK(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T __getitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(const K& key, T x) { (*self)[key] = x; } void __delitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } SCM keys() { SCM result = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { K* key = new K(i->first); SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1); result = scm_cons(k,result); } return result; } } }; %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) template<> class map< K, T, C > { %typemap(in) map< K, T, C > { if (scm_is_null($input)) { $1 = std::map< K, T, C >(); } else if (scm_is_pair($input)) { $1 = std::map< K, T, C >(); SCM alist = $input; while (!scm_is_null(alist)) { SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); if (!CHECK_K(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (!CHECK_T(val)) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); if (!CHECK_T(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } (($1_type &)$1)[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val); alist = SCM_CDR(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp), const map< K, T, C >* (std::map< K, T, C > temp) { if (scm_is_null($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::map< K, T, C >(); $1 = &temp; SCM alist = $input; while (!scm_is_null(alist)) { SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); if (!CHECK_K(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (!CHECK_T(val)) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); if (!CHECK_T(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } temp[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val); alist = SCM_CDR(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { SCM alist = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { SCM k = CONVERT_K_TO(i->first); SCM x = CONVERT_T_TO(i->second); SCM entry = scm_cons(k,x); alist = scm_cons(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (!CHECK_K(key)) { $1 = 0; } else { if (CHECK_T(val)) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (CHECK_T(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (!CHECK_K(key)) { $1 = 0; } else { if (CHECK_T(val)) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (CHECK_T(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T __getitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(K key, T x) { (*self)[key] = x; } void __delitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(K key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } SCM keys() { SCM result = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { SCM k = CONVERT_K_TO(i->first); result = scm_cons(k,result); } return result; } } }; %enddef specialize_std_map_on_key(bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_key(int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_key(short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_key(long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_key(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_key(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_key(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_key(double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_key(float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_key(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_value(bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_value(int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_value(short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_value(long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_value(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_value(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_value(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_value(double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_value(float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_value(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); } swig-4.0.2/Lib/guile/interpreter.i0000644000175000017500000000261513667507523016716 0ustar williamwilliam/* ----------------------------------------------------------------------------- * interpreter.i * * SWIG file for a simple Guile interpreter * ----------------------------------------------------------------------------- */ %{ #include GSCM_status guile_init(); int main(int argc, char **argv) { GSCM_status status; GSCM_top_level toplev; char *eval_answer; char input_str[16384]; int done; /* start a scheme interpreter */ status = gscm_run_scm(argc, argv, 0, stdout, stderr, guile_init, 0, "#t"); if (status != GSCM_OK) { fputs(gscm_error_msg(status), stderr); fputc('\n', stderr); printf("Error in startup.\n"); exit(1); } /* create the top level environment */ status = gscm_create_top_level(&toplev); if (status != GSCM_OK) { fputs(gscm_error_msg(status), stderr); fputc('\n', stderr); exit(1); } /* now sit in a scheme eval loop: I input the expressions, have guile * evaluate them, and then get another expression. */ done = 0; fprintf(stdout,"Guile > "); while (!done) { if (fgets(input_str,16384,stdin) == NULL) { exit(1); } else { if (strncmp(input_str,"quit",4) == 0) exit(1); status = gscm_eval_str(&eval_answer, toplev, input_str); fprintf(stdout,"%s\n", eval_answer); fprintf(stdout,"Guile > "); } } /* now clean up and quit */ gscm_destroy_top_level(toplev); } %} swig-4.0.2/Lib/director_common.swg0000644000175000017500000000100013667507523016764 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director_common.swg * * This file contains support for director classes which is common between * languages. * ----------------------------------------------------------------------------- */ /* Use -DSWIG_DIRECTOR_STATIC if you prefer to avoid the use of the 'Swig' namespace. This could be useful for multi-modules projects. */ #ifdef SWIG_DIRECTOR_STATIC /* Force anonymous (static) namespace */ #define Swig #endif swig-4.0.2/Lib/swigfragments.swg0000644000175000017500000000402013667507523016466 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigfragments.swg * * Common fragments * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Fragments for C header files * ----------------------------------------------------------------------------- */ %fragment("", "header") %{ #include %} /* Default compiler options for gcc allow long_long but not LLONG_MAX. * Define SWIG_NO_LLONG_MAX if this added limits support is not wanted. */ %fragment("", "header") %{ #include #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX - 1LL) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) # endif #endif %} %fragment("", "header") %{ #include %} %fragment("", "header") %{ #include %} %fragment("", "header") %{ #include #if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__BORLANDC__) || defined(_WATCOM) # ifndef snprintf # define snprintf _snprintf # endif #endif %} %fragment("", "header") %{ #include #ifdef _MSC_VER # ifndef strtoull # define strtoull _strtoui64 # endif # ifndef strtoll # define strtoll _strtoi64 # endif #endif %} %fragment("", "header") %{ #include #include #ifndef WCHAR_MIN # define WCHAR_MIN 0 #endif #ifndef WCHAR_MAX # define WCHAR_MAX 65535 #endif %} /* ----------------------------------------------------------------------------- * Fragments for C++ header files * ----------------------------------------------------------------------------- */ %fragment("", "header") %{ #include %} %fragment("", "header") %{ #include %} %fragment("", "header") %{ #include %} %fragment("", "header") %{ #include %} swig-4.0.2/Lib/swigrun.i0000644000175000017500000000040013667507523014732 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigrun.i * * Empty module (for now). Placeholder for runtime libs * ----------------------------------------------------------------------------- */ %module swigrun swig-4.0.2/Lib/shared_ptr.i0000644000175000017500000000505613667507523015403 0ustar williamwilliam// This is a helper file for shared_ptr and should not be included directly. // The main implementation detail in using this smart pointer of a type is to customise the code generated // to use a pointer to the smart pointer of the type, rather than the usual pointer to the underlying type. // So for some type T, shared_ptr * is used rather than T *. // Another key part of the implementation is the smartptr feature: // %feature("smartptr") T { shared_ptr } // This feature marks the class T as having a smartptr to it (the shared_ptr type). This is then used to // support smart pointers and inheritance. Say class D derives from base B, then shared_ptr is marked // with a fake inheritance from shared_ptr in the type system if the "smartptr" feature is used on both // B and D. This is to emulate the conversion of shared_ptr to shared_ptr in the target language. // shared_ptr namespaces could be boost or std or std::tr1 // For example for std::tr1, use: // #define SWIG_SHARED_PTR_NAMESPACE std // #define SWIG_SHARED_PTR_SUBNAMESPACE tr1 #if !defined(SWIG_SHARED_PTR_NAMESPACE) # define SWIG_SHARED_PTR_NAMESPACE boost #endif #if defined(SWIG_SHARED_PTR_SUBNAMESPACE) # define SWIG_SHARED_PTR_QNAMESPACE SWIG_SHARED_PTR_NAMESPACE::SWIG_SHARED_PTR_SUBNAMESPACE #else # define SWIG_SHARED_PTR_QNAMESPACE SWIG_SHARED_PTR_NAMESPACE #endif namespace SWIG_SHARED_PTR_NAMESPACE { #if defined(SWIG_SHARED_PTR_SUBNAMESPACE) namespace SWIG_SHARED_PTR_SUBNAMESPACE { #endif template class shared_ptr { }; #if defined(SWIG_SHARED_PTR_SUBNAMESPACE) } #endif } %fragment("SWIG_null_deleter", "header") { struct SWIG_null_deleter { void operator() (void const *) const { } }; %#define SWIG_NO_NULL_DELETER_0 , SWIG_null_deleter() %#define SWIG_NO_NULL_DELETER_1 %#define SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW %#define SWIG_NO_NULL_DELETER_SWIG_POINTER_OWN } // Main user macro for defining shared_ptr typemaps for both const and non-const pointer types %define %shared_ptr(TYPE...) %feature("smartptr", noblock=1) TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > } SWIG_SHARED_PTR_TYPEMAPS(, TYPE) SWIG_SHARED_PTR_TYPEMAPS(const, TYPE) %enddef // Legacy macros %define SWIG_SHARED_PTR(PROXYCLASS, TYPE...) #warning "SWIG_SHARED_PTR(PROXYCLASS, TYPE) is deprecated. Please use %shared_ptr(TYPE) instead." %shared_ptr(TYPE) %enddef %define SWIG_SHARED_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE...) #warning "SWIG_SHARED_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) is deprecated. Please use %shared_ptr(TYPE) instead." %shared_ptr(TYPE) %enddef swig-4.0.2/Lib/swig.swg0000644000175000017500000006046413667507523014575 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swig.swg * * Common macro definitions for various SWIG directives. This file is always * included at the top of each input file. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * User Directives * ----------------------------------------------------------------------------- */ /* Deprecated SWIG-1.1 directives */ #define %disabledoc %warn "104:%disabledoc is deprecated" #define %enabledoc %warn "105:%enabledoc is deprecated" #define %doconly %warn "106:%doconly is deprecated" #define %style %warn "107:%style is deprecated" /##/ #define %localstyle %warn "108:%localstyle is deprecated" /##/ #define %title %warn "109:%title is deprecated" /##/ #define %section %warn "110:%section is deprecated" /##/ #define %subsection %warn "111:%subsection is deprecated" /##/ #define %subsubsection %warn "112:%subsubsection is deprecated" /##/ #define %new %warn "117:%new is deprecated. Use %newobject" #define %text %insert("null") /* Code insertion directives such as %wrapper %{ ... %} */ #define %begin %insert("begin") #define %runtime %insert("runtime") #define %header %insert("header") #define %wrapper %insert("wrapper") #define %init %insert("init") /* Class extension */ #define %addmethods %warn "113:%addmethods is now %extend" %extend /* %ignore directive */ #define %ignore %rename($ignore) #define %ignorewarn(x) %rename("$ignore:" x) /* Access control directives */ #define %readonly %warn "114:%readonly is deprecated. Use %immutable; " %feature("immutable"); #define %readwrite %warn "115:%readwrite is deprecated. Use %mutable; " %feature("immutable",""); #define %immutable %feature("immutable") #define %noimmutable %feature("immutable","0") #define %clearimmutable %feature("immutable","") #define %mutable %clearimmutable /* Generation of default constructors/destructors (old form, don't use) */ #define %nodefault %feature("nodefault","1") #define %default %feature("nodefault","0") #define %clearnodefault %feature("nodefault","") #define %makedefault %clearnodefault /* Disable the generation of implicit default constructor */ #define %nodefaultctor %feature("nodefaultctor","1") #define %defaultctor %feature("nodefaultctor","0") #define %clearnodefaultctor %feature("nodefaultctor","") /* Disable the generation of implicit default destructor (dangerous) */ #define %nodefaultdtor %feature("nodefaultdtor","1") #define %defaultdtor %feature("nodefaultdtor","0") #define %clearnodefaultdtor %feature("nodefaultdtor","") /* Enable the generation of copy constructor */ #define %copyctor %feature("copyctor","1") #define %nocopyctor %feature("copyctor","0") #define %clearcopyctor %feature("copyctor","") /* Force the old nodefault behavior, ie disable both constructor and destructor */ #define %oldnodefault %feature("oldnodefault","1") #define %nooldnodefault %feature("oldnodefault","0") #define %clearoldnodefault %feature("oldnodefault","") /* the %exception directive */ #if defined(SWIGCSHARP) || defined(SWIGD) #define %exception %feature("except", canthrow=1) #else #define %exception %feature("except") #endif #define %noexception %feature("except","0") #define %clearexception %feature("except","") /* the %allowexception directive allows the %exception feature to be applied to set/get variable methods */ #define %allowexception %feature("allowexcept") #define %noallowexception %feature("allowexcept","0") #define %clearallowexception %feature("allowexcept","") /* the %exceptionvar directive, as %exception but it is only applied to set/get variable methods. You don't need to use the %allowexception directive when using %exceptionvar. */ #if defined(SWIGCSHARP) || defined(SWIGD) #define %exceptionvar %feature("exceptvar", canthrow=1) #else #define %exceptionvar %feature("exceptvar") #endif #define %noexceptionvar %feature("exceptvar","0") #define %clearexceptionvar %feature("exceptvar","") /* the %catches directive */ #define %catches(tlist...) %feature("catches","("`tlist`")") #define %clearcatches %feature("catches","") /* the %exceptionclass directive */ #define %exceptionclass %feature("exceptionclass") #define %noexceptionclass %feature("exceptionclass","0") #define %clearexceptionclass %feature("exceptionclass","") /* the %newobject directive */ #define %newobject %feature("new") #define %nonewobject %feature("new","0") #define %clearnewobject %feature("new","") /* the %delobject directive */ #define %delobject %feature("del") #define %nodelobject %feature("del","0") #define %cleardelobject %feature("del","") /* the %refobject/%unrefobject directives */ #define %refobject %feature("ref") #define %norefobject %feature("ref","0") #define %clearrefobject %feature("ref","") #define %unrefobject %feature("unref") #define %nounrefobject %feature("unref","0") #define %clearunrefobject %feature("unref","") /* Directives for callback functions (experimental) */ #define %callback(x) %feature("callback",`x`) #define %nocallback %feature("callback","0") #define %clearcallback %feature("callback","") /* the %nestedworkaround directive (deprecated) */ #define %nestedworkaround %feature("nestedworkaround") #define %nonestedworkaround %feature("nestedworkaround","0") #define %clearnestedworkaround %feature("nestedworkaround","") /* the %flatnested directive */ #define %flatnested %feature("flatnested") #define %noflatnested %feature("flatnested","0") #define %clearflatnested %feature("flatnested","") /* the %fastdispatch directive */ #define %fastdispatch %feature("fastdispatch") #define %nofastdispatch %feature("fastdispatch","0") #define %clearfastdispatch %feature("fastdispatch","") /* directors directives */ #define %director %feature("director") #define %nodirector %feature("director","0") #define %cleardirector %feature("director","") /* naturalvar directives */ #define %naturalvar %feature("naturalvar") #define %nonaturalvar %feature("naturalvar","0") #define %clearnaturalvar %feature("naturalvar","") /* nspace directives */ #define %nspace %feature("nspace") #define %nonspace %feature("nspace","0") #define %clearnspace %feature("nspace","") /* valuewrapper directives */ #define %valuewrapper %feature("valuewrapper") #define %clearvaluewrapper %feature("valuewrapper","") #define %novaluewrapper %feature("novaluewrapper") #define %clearnovaluewrapper %feature("novaluewrapper","") /* Contract support - Experimental and undocumented */ #define %contract %feature("contract") #define %nocontract %feature("contract","0") #define %clearcontract %feature("contract","") /* Macro for setting a dynamic cast function */ %define DYNAMIC_CAST(mangle,func) %init %{ mangle->dcast = (swig_dycast_func) func; %} %enddef /* aggregation support */ /* This macro performs constant aggregation. Basically the idea of constant aggregation is that you can group a collection of constants together. For example, suppose you have some code like this: #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 Now, suppose you had a function like this: int move(int direction) In this case, you might want to restrict the direction argument to one of the supplied constant names. To do this, you could write some typemap code by hand. Alternatively, you can use the %aggregate_check macro defined here to create a simple check function for you. Here is an example: %aggregate_check(int, check_direction, UP, DOWN, LEFT, RIGHT); Now, using a typemap %typemap(check) int direction { if (!check_direction($1)) SWIG_exception(SWIG_ValueError,"Bad direction."); } or a contract (better) %contract move(int x) { require: check_direction(x); } */ %define %aggregate_check(TYPE, NAME, FIRST, ...) %wrapper %{ static int NAME(TYPE x) { static TYPE values[] = { FIRST, ##__VA_ARGS__ }; static int size = sizeof(values); int i,j; for (i = 0, j = 0; i < size; i+=sizeof(TYPE),j++) { if (x == values[j]) return 1; } return 0; } %} %enddef /* ----------------------------------------------------------------------------- * %rename predicates * ----------------------------------------------------------------------------- */ /* Predicates to be used with %rename, for example: - to rename all the functions: %rename("%(utitle)s", %$isfunction) ""; - to rename only the member methods: %rename("m_%(utitle)s", %$isfunction, %$ismember) ""; - to rename only the global functions: %rename("m_%(utitle)s", %$isfunction, %$not %$ismember) ""; or %rename("g_%(utitle)s", %$isfunction, %$isglobal) ""; - to ignore the enumitems in a given class: %rename("$ignore", %$isenumitem, %$classname="MyClass") ""; we use the prefix '%$' to avoid clashes with other swig macros/directives. */ %define %$not "not" %enddef %define %$isenum "match"="enum" %enddef %define %$isenumitem "match"="enumitem" %enddef %define %$isaccess "match"="access" %enddef %define %$isclass "match"="class","notmatch$template$templatetype"="class" %enddef %define %$isextend "match"="extend" %enddef %define %$isconstructor "match"="constructor" %enddef %define %$isdestructor "match"="destructor" %enddef %define %$isnamespace "match"="namespace" %enddef %define %$istemplate "match"="template" %enddef %define %$isconstant "match"="constant" %enddef /* %constant definition */ %define %$isunion "match$kind"="union" %enddef %define %$isfunction "match$kind"="function" %enddef %define %$isvariable "match$kind"="variable" %enddef %define %$isimmutable "match$feature:immutable"="1" %enddef %define %$hasconsttype "match$hasconsttype"="1" %enddef %define %$hasvalue "match$hasvalue"="1" %enddef %define %$isextension "match$isextension"="1" %enddef %define %$isstatic "match$storage"="static" %enddef %define %$isfriend "match$storage"="friend" %enddef %define %$istypedef "match$storage"="typedef" %enddef %define %$isvirtual "match$storage"="virtual" %enddef %define %$isexplicit "match$storage"="explicit" %enddef %define %$isextern "match$storage"="extern" %enddef %define %$ismember "match$ismember"="1" %enddef %define %$isglobal %$not %$ismember %enddef %define %$isextendmember "match$isextendmember"="1" %enddef %define %$innamespace "match$parentNode$nodeType"="namespace" %enddef %define %$ispublic "match$access"="public" %enddef %define %$isprotected "match$access"="protected" %enddef %define %$isprivate "match$access"="private" %enddef %define %$ismemberget "match$memberget"="1" %enddef %define %$ismemberset "match$memberset"="1" %enddef %define %$classname %$ismember,"match$parentNode$name" %enddef %define %$isnested "match$nested"="1" %enddef /* ----------------------------------------------------------------------------- * Common includes for warning labels, macros, fragments etc * ----------------------------------------------------------------------------- */ %include %include /* ----------------------------------------------------------------------------- * Overloading support * ----------------------------------------------------------------------------- */ /* * Function/method overloading support. This is done through typemaps, * but also involves a precedence level. */ /* Macro for overload resolution */ %define %typecheck(_x...) %typemap(typecheck, precedence=_x) %enddef /* Macros for precedence levels */ %define SWIG_TYPECHECK_POINTER 0 %enddef %define SWIG_TYPECHECK_ITERATOR 5 %enddef %define SWIG_TYPECHECK_VOIDPTR 10 %enddef %define SWIG_TYPECHECK_BOOL 15 %enddef %define SWIG_TYPECHECK_UINT8 20 %enddef %define SWIG_TYPECHECK_INT8 25 %enddef %define SWIG_TYPECHECK_UINT16 30 %enddef %define SWIG_TYPECHECK_INT16 35 %enddef %define SWIG_TYPECHECK_UINT32 40 %enddef %define SWIG_TYPECHECK_INT32 45 %enddef %define SWIG_TYPECHECK_SIZE 47 %enddef %define SWIG_TYPECHECK_PTRDIFF 48 %enddef %define SWIG_TYPECHECK_UINT64 50 %enddef %define SWIG_TYPECHECK_INT64 55 %enddef %define SWIG_TYPECHECK_UINT128 60 %enddef %define SWIG_TYPECHECK_INT128 65 %enddef %define SWIG_TYPECHECK_INTEGER 70 %enddef %define SWIG_TYPECHECK_FLOAT 80 %enddef %define SWIG_TYPECHECK_DOUBLE 90 %enddef %define SWIG_TYPECHECK_CPLXFLT 95 %enddef %define SWIG_TYPECHECK_CPLXDBL 100 %enddef %define SWIG_TYPECHECK_COMPLEX 105 %enddef %define SWIG_TYPECHECK_UNICHAR 110 %enddef %define SWIG_TYPECHECK_STDUNISTRING 115 %enddef %define SWIG_TYPECHECK_UNISTRING 120 %enddef %define SWIG_TYPECHECK_CHAR 130 %enddef %define SWIG_TYPECHECK_STDSTRING 135 %enddef %define SWIG_TYPECHECK_STRING 140 %enddef %define SWIG_TYPECHECK_PAIR 150 %enddef %define SWIG_TYPECHECK_STDARRAY 155 %enddef %define SWIG_TYPECHECK_VECTOR 160 %enddef %define SWIG_TYPECHECK_DEQUE 170 %enddef %define SWIG_TYPECHECK_LIST 180 %enddef %define SWIG_TYPECHECK_SET 190 %enddef %define SWIG_TYPECHECK_MULTISET 200 %enddef %define SWIG_TYPECHECK_MAP 210 %enddef %define SWIG_TYPECHECK_MULTIMAP 220 %enddef %define SWIG_TYPECHECK_STACK 230 %enddef %define SWIG_TYPECHECK_QUEUE 240 %enddef %define SWIG_TYPECHECK_BOOL_ARRAY 1015 %enddef %define SWIG_TYPECHECK_INT8_ARRAY 1025 %enddef %define SWIG_TYPECHECK_INT16_ARRAY 1035 %enddef %define SWIG_TYPECHECK_INT32_ARRAY 1045 %enddef %define SWIG_TYPECHECK_INT64_ARRAY 1055 %enddef %define SWIG_TYPECHECK_INT128_ARRAY 1065 %enddef %define SWIG_TYPECHECK_FLOAT_ARRAY 1080 %enddef %define SWIG_TYPECHECK_DOUBLE_ARRAY 1090 %enddef %define SWIG_TYPECHECK_CHAR_ARRAY 1130 %enddef %define SWIG_TYPECHECK_STRING_ARRAY 1140 %enddef %define SWIG_TYPECHECK_OBJECT_ARRAY 1150 %enddef %define SWIG_TYPECHECK_BOOL_PTR 2015 %enddef %define SWIG_TYPECHECK_UINT8_PTR 2020 %enddef %define SWIG_TYPECHECK_INT8_PTR 2025 %enddef %define SWIG_TYPECHECK_UINT16_PTR 2030 %enddef %define SWIG_TYPECHECK_INT16_PTR 2035 %enddef %define SWIG_TYPECHECK_UINT32_PTR 2040 %enddef %define SWIG_TYPECHECK_INT32_PTR 2045 %enddef %define SWIG_TYPECHECK_UINT64_PTR 2050 %enddef %define SWIG_TYPECHECK_INT64_PTR 2055 %enddef %define SWIG_TYPECHECK_FLOAT_PTR 2080 %enddef %define SWIG_TYPECHECK_DOUBLE_PTR 2090 %enddef %define SWIG_TYPECHECK_CHAR_PTR 2130 %enddef %define SWIG_TYPECHECK_SWIGOBJECT 5000 %enddef /* ----------------------------------------------------------------------------- * Default handling of certain overloaded operators * ----------------------------------------------------------------------------- */ #ifdef __cplusplus %ignoreoperator(NEW) operator new; %ignoreoperator(DELETE) operator delete; %ignoreoperator(NEWARR) operator new[]; %ignoreoperator(DELARR) operator delete[]; /* add C++ operator aliases */ %rename("operator &&") operator and; // `and' `&&' %rename("operator ||") operator or; // `or' `||' %rename("operator !") operator not; // `not' `!' %rename("operator &=") operator and_eq; // `and_eq' `&=' %rename("operator &") operator bitand; // `bitand' `&' %rename("operator |") operator bitor; // `bitor' `|' %rename("operator ~") operator compl; // `compl' `~' %rename("operator !=") operator not_eq; // `not_eq' `!=' %rename("operator |=") operator or_eq; // `or_eq' `|=' %rename("operator ^") operator xor; // `xor' `^' %rename("operator ^=") operator xor_eq; // `xor_eq' `^=' /* Smart pointer handling */ %rename(__deref__) *::operator->; %rename(__ref__) *::operator*(); %rename(__ref__) *::operator*() const; /* Define std namespace */ namespace std { /* Warn about std::initializer_list usage. The constructor/method where used should probably be ignored. See docs. */ template class initializer_list {}; %typemap(in, warning=SWIGWARN_TYPEMAP_INITIALIZER_LIST_MSG) initializer_list "" %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) initializer_list "" } #endif /* ----------------------------------------------------------------------------- * Default char * and C array typemaps * ----------------------------------------------------------------------------- */ /* Set up the typemap for handling new return strings */ #ifdef __cplusplus %typemap(newfree) char * "delete [] $1;"; #else %typemap(newfree) char * "free($1);"; #endif /* Default typemap for handling char * members */ #ifdef __cplusplus %typemap(memberin) char * { delete [] $1; if ($input) { $1 = ($1_type) (new char[strlen((const char *)$input)+1]); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(memberin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { if ($input) { $1 = ($1_type) (new char[strlen((const char *)$input)+1]); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(globalin) char * { delete [] $1; if ($input) { $1 = ($1_type) (new char[strlen((const char *)$input)+1]); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(globalin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { if ($input) { $1 = ($1_type) (new char[strlen((const char *)$input)+1]); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } #else %typemap(memberin) char * { free($1); if ($input) { $1 = ($1_type) malloc(strlen((const char *)$input)+1); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(memberin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { if ($input) { $1 = ($1_type) malloc(strlen((const char *)$input)+1); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(globalin) char * { free($1); if ($input) { $1 = ($1_type) malloc(strlen((const char *)$input)+1); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(globalin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { if ($input) { $1 = ($1_type) malloc(strlen((const char *)$input)+1); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } #endif /* Character array handling */ %typemap(memberin) char [ANY] { if($input) { strncpy((char*)$1, (const char *)$input, $1_dim0-1); $1[$1_dim0-1] = 0; } else { $1[0] = 0; } } %typemap(globalin) char [ANY] { if($input) { strncpy((char*)$1, (const char *)$input, $1_dim0-1); $1[$1_dim0-1] = 0; } else { $1[0] = 0; } } %typemap(memberin) char [] { if ($input) strcpy((char *)$1, (const char *)$input); else $1[0] = 0; } %typemap(globalin) char [] { if ($input) strcpy((char *)$1, (const char *)$input); else $1[0] = 0; } /* memberin/globalin typemap for arrays. */ %typemap(memberin) SWIGTYPE [ANY] { size_t ii; $1_basetype *b = ($1_basetype *) $1; for (ii = 0; ii < (size_t)$1_size; ii++) b[ii] = *(($1_basetype *) $input + ii); } %typemap(globalin) SWIGTYPE [ANY] { size_t ii; $1_basetype *b = ($1_basetype *) $1; for (ii = 0; ii < (size_t)$1_size; ii++) b[ii] = *(($1_basetype *) $input + ii); } /* memberin/globalin typemap for double arrays. */ %typemap(memberin) SWIGTYPE [ANY][ANY] { $basetype (*inp)[$1_dim1] = ($basetype (*)[$1_dim1])($input); $basetype (*dest)[$1_dim1] = ($basetype (*)[$1_dim1])($1); size_t ii = 0; for (; ii < $1_dim0; ++ii) { $basetype *ip = inp[ii]; $basetype *dp = dest[ii]; size_t jj = 0; for (; jj < $1_dim1; ++jj) dp[jj] = ip[jj]; } } %typemap(globalin) SWIGTYPE [ANY][ANY] { $basetype (*inp)[$1_dim1] = ($basetype (*)[$1_dim1])($input); $basetype (*dest)[$1_dim1] = ($basetype (*)[$1_dim1])($1); size_t ii = 0; for (; ii < $1_dim0; ++ii) { $basetype *ip = inp[ii]; $basetype *dp = dest[ii]; size_t jj = 0; for (; jj < $1_dim1; ++jj) dp[jj] = ip[jj]; } } /* ----------------------------------------------------------------------------- * Runtime code * ----------------------------------------------------------------------------- */ /* The SwigValueWrapper class */ /* * This template wrapper is used to handle C++ objects that are passed or * returned by value. This is necessary to handle objects that define * no default-constructor (making it difficult for SWIG to properly declare * local variables). * * The wrapper is used as follows. First consider a function like this: * * Vector cross_product(Vector a, Vector b) * * Now, if Vector is defined as a C++ class with no default constructor, * code is generated as follows: * * Vector *wrap_cross_product(Vector *inarg1, Vector *inarg2) { * SwigValueWrapper arg1; * SwigValueWrapper arg2; * SwigValueWrapper result; * * arg1 = *inarg1; * arg2 = *inarg2; * ... * result = cross_product(arg1,arg2); * ... * return new Vector(result); * } * * In the wrappers, the template SwigValueWrapper simply provides a thin * layer around a Vector *. However, it does this in a way that allows * the object to be bound after the variable declaration (which is not possible * with the bare object when it lacks a default constructor). * * An observant reader will notice that the code after the variable declarations * is *identical* to the code used for classes that do define default constructors. * Thus, this neat trick allows us to fix this special case without having to * make massive changes to typemaps and other parts of the SWIG code generator. * * Note: this code is not included when SWIG runs in C-mode, when classes * define default constructors, or when pointers and references are used. * SWIG tries to avoid doing this except in very special circumstances. * * Note: This solution suffers from making a large number of copies * of the underlying object. However, this is needed in the interest of * safety and in order to cover all of the possible ways in which a value * might be assigned. For example: * * arg1 = *inarg1; // Assignment from a pointer * arg1 = Vector(1,2,3); // Assignment from a value * * The class offers a strong guarantee of exception safety. * With regards to the implementation, the private SwigMovePointer nested class is * a simple smart pointer with move semantics, much like std::auto_ptr. * * This wrapping technique was suggested by William Fulton and is henceforth * known as the "Fulton Transform" :-). */ #ifdef __cplusplus %insert("runtime") %{ #ifdef __cplusplus /* SwigValueWrapper is described in swig.swg */ template class SwigValueWrapper { struct SwigMovePointer { T *ptr; SwigMovePointer(T *p) : ptr(p) { } ~SwigMovePointer() { delete ptr; } SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } } pointer; SwigValueWrapper& operator=(const SwigValueWrapper& rhs); SwigValueWrapper(const SwigValueWrapper& rhs); public: SwigValueWrapper() : pointer(0) { } SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } operator T&() const { return *pointer.ptr; } T *operator&() { return pointer.ptr; } };%} /* * SwigValueInit() is a generic initialisation solution as the following approach: * * T c_result = T(); * * doesn't compile for all types for example: * * unsigned int c_result = unsigned int(); */ %insert("runtime") %{ template T SwigValueInit() { return T(); } #endif %} #endif /* The swiglabels */ %insert("runtime") "swiglabels.swg" swig-4.0.2/Lib/std_except.i0000644000175000017500000000406313667507523015407 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * SWIG library file with typemaps to handle and throw STD exceptions in a * language and STL independent way, i.e., the target language doesn't * require to support STL but only the 'exception.i' mechanism. * * These typemaps are used when methods are declared with an STD * exception specification, such as * * size_t at() const throw (std::out_of_range); * * The typemaps here are based on the language independent * 'exception.i' library. If that is working in your target language, * this file will work. * * If the target language doesn't implement a robust 'exception.i' * mechanism, or you prefer other ways to map the STD exceptions, write * a new std_except.i file in the target library directory. * ----------------------------------------------------------------------------- */ #if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGGUILE) || defined(SWIGUTL) || defined(SWIGD) || defined(SWIGOCAML) #error "This version of std_except.i should not be used" #endif %{ #include #include %} %include %define %std_exception_map(Exception, Code) %typemap(throws,noblock=1) Exception { SWIG_exception(Code, $1.what()); } %ignore Exception; struct Exception { }; %enddef namespace std { %std_exception_map(bad_cast, SWIG_TypeError); %std_exception_map(bad_exception, SWIG_SystemError); %std_exception_map(domain_error, SWIG_ValueError); %std_exception_map(exception, SWIG_SystemError); %std_exception_map(invalid_argument, SWIG_ValueError); %std_exception_map(length_error, SWIG_IndexError); %std_exception_map(logic_error, SWIG_RuntimeError); %std_exception_map(out_of_range, SWIG_IndexError); %std_exception_map(overflow_error, SWIG_OverflowError); %std_exception_map(range_error, SWIG_OverflowError); %std_exception_map(runtime_error, SWIG_RuntimeError); %std_exception_map(underflow_error, SWIG_OverflowError); } swig-4.0.2/Lib/swigwarn.swg0000644000175000017500000003517513667507562015471 0ustar williamwilliam/* SWIG warning codes - generated from swigwarn.h - do not edit */ %define SWIGWARN_NONE 0 %enddef /* -- Deprecated features -- */ %define SWIGWARN_DEPRECATED_EXTERN 101 %enddef %define SWIGWARN_DEPRECATED_VAL 102 %enddef %define SWIGWARN_DEPRECATED_OUT 103 %enddef %define SWIGWARN_DEPRECATED_DISABLEDOC 104 %enddef %define SWIGWARN_DEPRECATED_ENABLEDOC 105 %enddef %define SWIGWARN_DEPRECATED_DOCONLY 106 %enddef %define SWIGWARN_DEPRECATED_STYLE 107 %enddef %define SWIGWARN_DEPRECATED_LOCALSTYLE 108 %enddef %define SWIGWARN_DEPRECATED_TITLE 109 %enddef %define SWIGWARN_DEPRECATED_SECTION 110 %enddef %define SWIGWARN_DEPRECATED_SUBSECTION 111 %enddef %define SWIGWARN_DEPRECATED_SUBSUBSECTION 112 %enddef %define SWIGWARN_DEPRECATED_ADDMETHODS 113 %enddef %define SWIGWARN_DEPRECATED_READONLY 114 %enddef %define SWIGWARN_DEPRECATED_READWRITE 115 %enddef %define SWIGWARN_DEPRECATED_EXCEPT 116 %enddef %define SWIGWARN_DEPRECATED_NEW 117 %enddef %define SWIGWARN_DEPRECATED_EXCEPT_TM 118 %enddef %define SWIGWARN_DEPRECATED_IGNORE_TM 119 %enddef %define SWIGWARN_DEPRECATED_OPTC 120 %enddef %define SWIGWARN_DEPRECATED_NAME 121 %enddef %define SWIGWARN_DEPRECATED_NOEXTERN 122 %enddef %define SWIGWARN_DEPRECATED_NODEFAULT 123 %enddef %define SWIGWARN_DEPRECATED_TYPEMAP_LANG 124 %enddef %define SWIGWARN_DEPRECATED_INPUT_FILE 125 %enddef %define SWIGWARN_DEPRECATED_NESTED_WORKAROUND 126 %enddef /* -- Preprocessor -- */ %define SWIGWARN_PP_MISSING_FILE 201 %enddef %define SWIGWARN_PP_EVALUATION 202 %enddef %define SWIGWARN_PP_INCLUDEALL_IMPORTALL 203 %enddef %define SWIGWARN_PP_CPP_WARNING 204 %enddef %define SWIGWARN_PP_CPP_ERROR 205 %enddef %define SWIGWARN_PP_UNEXPECTED_TOKENS 206 %enddef /* -- C/C++ Parser -- */ %define SWIGWARN_PARSE_CLASS_KEYWORD 301 %enddef %define SWIGWARN_PARSE_REDEFINED 302 %enddef %define SWIGWARN_PARSE_EXTEND_UNDEF 303 %enddef %define SWIGWARN_PARSE_UNSUPPORTED_VALUE 304 %enddef %define SWIGWARN_PARSE_BAD_VALUE 305 %enddef %define SWIGWARN_PARSE_PRIVATE 306 %enddef %define SWIGWARN_PARSE_BAD_DEFAULT 307 %enddef %define SWIGWARN_PARSE_NAMESPACE_ALIAS 308 %enddef %define SWIGWARN_PARSE_PRIVATE_INHERIT 309 %enddef %define SWIGWARN_PARSE_TEMPLATE_REPEAT 310 %enddef %define SWIGWARN_PARSE_TEMPLATE_PARTIAL 311 %enddef %define SWIGWARN_PARSE_UNNAMED_NESTED_CLASS 312 %enddef %define SWIGWARN_PARSE_UNDEFINED_EXTERN 313 %enddef %define SWIGWARN_PARSE_KEYWORD 314 %enddef %define SWIGWARN_PARSE_USING_UNDEF 315 %enddef %define SWIGWARN_PARSE_MODULE_REPEAT 316 %enddef %define SWIGWARN_PARSE_TEMPLATE_SP_UNDEF 317 %enddef %define SWIGWARN_PARSE_TEMPLATE_AMBIG 318 %enddef %define SWIGWARN_PARSE_NO_ACCESS 319 %enddef %define SWIGWARN_PARSE_EXPLICIT_TEMPLATE 320 %enddef %define SWIGWARN_PARSE_BUILTIN_NAME 321 %enddef %define SWIGWARN_PARSE_REDUNDANT 322 %enddef %define SWIGWARN_PARSE_REC_INHERITANCE 323 %enddef %define SWIGWARN_PARSE_NESTED_TEMPLATE 324 %enddef %define SWIGWARN_PARSE_NAMED_NESTED_CLASS 325 %enddef %define SWIGWARN_PARSE_EXTEND_NAME 326 %enddef %define SWIGWARN_CPP11_LAMBDA 340 %enddef %define SWIGWARN_CPP11_ALIAS_DECLARATION 341 %enddef /* redundant now */ %define SWIGWARN_CPP11_ALIAS_TEMPLATE 342 %enddef /* redundant now */ %define SWIGWARN_CPP11_VARIADIC_TEMPLATE 343 %enddef %define SWIGWARN_IGNORE_OPERATOR_NEW 350 %enddef /* new */ %define SWIGWARN_IGNORE_OPERATOR_DELETE 351 %enddef /* delete */ %define SWIGWARN_IGNORE_OPERATOR_PLUS 352 %enddef /* + */ %define SWIGWARN_IGNORE_OPERATOR_MINUS 353 %enddef /* - */ %define SWIGWARN_IGNORE_OPERATOR_MUL 354 %enddef /* * */ %define SWIGWARN_IGNORE_OPERATOR_DIV 355 %enddef /* / */ %define SWIGWARN_IGNORE_OPERATOR_MOD 356 %enddef /* % */ %define SWIGWARN_IGNORE_OPERATOR_XOR 357 %enddef /* ^ */ %define SWIGWARN_IGNORE_OPERATOR_AND 358 %enddef /* & */ %define SWIGWARN_IGNORE_OPERATOR_OR 359 %enddef /* | */ %define SWIGWARN_IGNORE_OPERATOR_NOT 360 %enddef /* ~ */ %define SWIGWARN_IGNORE_OPERATOR_LNOT 361 %enddef /* ! */ %define SWIGWARN_IGNORE_OPERATOR_EQ 362 %enddef /* = */ %define SWIGWARN_IGNORE_OPERATOR_LT 363 %enddef /* < */ %define SWIGWARN_IGNORE_OPERATOR_GT 364 %enddef /* > */ %define SWIGWARN_IGNORE_OPERATOR_PLUSEQ 365 %enddef /* += */ %define SWIGWARN_IGNORE_OPERATOR_MINUSEQ 366 %enddef /* -= */ %define SWIGWARN_IGNORE_OPERATOR_MULEQ 367 %enddef /* *= */ %define SWIGWARN_IGNORE_OPERATOR_DIVEQ 368 %enddef /* /= */ %define SWIGWARN_IGNORE_OPERATOR_MODEQ 369 %enddef /* %= */ %define SWIGWARN_IGNORE_OPERATOR_XOREQ 370 %enddef /* ^= */ %define SWIGWARN_IGNORE_OPERATOR_ANDEQ 371 %enddef /* &= */ %define SWIGWARN_IGNORE_OPERATOR_OREQ 372 %enddef /* |= */ %define SWIGWARN_IGNORE_OPERATOR_LSHIFT 373 %enddef /* << */ %define SWIGWARN_IGNORE_OPERATOR_RSHIFT 374 %enddef /* >> */ %define SWIGWARN_IGNORE_OPERATOR_LSHIFTEQ 375 %enddef /* <<= */ %define SWIGWARN_IGNORE_OPERATOR_RSHIFTEQ 376 %enddef /* >>= */ %define SWIGWARN_IGNORE_OPERATOR_EQUALTO 377 %enddef /* == */ %define SWIGWARN_IGNORE_OPERATOR_NOTEQUAL 378 %enddef /* != */ %define SWIGWARN_IGNORE_OPERATOR_LTEQUAL 379 %enddef /* <= */ %define SWIGWARN_IGNORE_OPERATOR_GTEQUAL 380 %enddef /* >= */ %define SWIGWARN_IGNORE_OPERATOR_LAND 381 %enddef /* && */ %define SWIGWARN_IGNORE_OPERATOR_LOR 382 %enddef /* || */ %define SWIGWARN_IGNORE_OPERATOR_PLUSPLUS 383 %enddef /* ++ */ %define SWIGWARN_IGNORE_OPERATOR_MINUSMINUS 384 %enddef /* -- */ %define SWIGWARN_IGNORE_OPERATOR_COMMA 385 %enddef /* , */ %define SWIGWARN_IGNORE_OPERATOR_ARROWSTAR 386 %enddef /* ->* */ %define SWIGWARN_IGNORE_OPERATOR_ARROW 387 %enddef /* -> */ %define SWIGWARN_IGNORE_OPERATOR_CALL 388 %enddef /* () */ %define SWIGWARN_IGNORE_OPERATOR_INDEX 389 %enddef /* [] */ %define SWIGWARN_IGNORE_OPERATOR_UPLUS 390 %enddef /* + */ %define SWIGWARN_IGNORE_OPERATOR_UMINUS 391 %enddef /* - */ %define SWIGWARN_IGNORE_OPERATOR_UMUL 392 %enddef /* * */ %define SWIGWARN_IGNORE_OPERATOR_UAND 393 %enddef /* & */ %define SWIGWARN_IGNORE_OPERATOR_NEWARR 394 %enddef /* new [] */ %define SWIGWARN_IGNORE_OPERATOR_DELARR 395 %enddef /* delete [] */ %define SWIGWARN_IGNORE_OPERATOR_REF 396 %enddef /* operator *() */ /* 394-399 are reserved */ /* -- Type system and typemaps -- */ %define SWIGWARN_TYPE_UNDEFINED_CLASS 401 %enddef %define SWIGWARN_TYPE_INCOMPLETE 402 %enddef %define SWIGWARN_TYPE_ABSTRACT 403 %enddef %define SWIGWARN_TYPE_REDEFINED 404 %enddef %define SWIGWARN_TYPE_RVALUE_REF_QUALIFIER_IGNORED 405 %enddef %define SWIGWARN_TYPEMAP_SOURCETARGET 450 %enddef %define SWIGWARN_TYPEMAP_CHARLEAK 451 %enddef %define SWIGWARN_TYPEMAP_SWIGTYPE 452 %enddef %define SWIGWARN_TYPEMAP_APPLY_UNDEF 453 %enddef %define SWIGWARN_TYPEMAP_SWIGTYPELEAK 454 %enddef %define SWIGWARN_TYPEMAP_IN_UNDEF 460 %enddef %define SWIGWARN_TYPEMAP_OUT_UNDEF 461 %enddef %define SWIGWARN_TYPEMAP_VARIN_UNDEF 462 %enddef %define SWIGWARN_TYPEMAP_VAROUT_UNDEF 463 %enddef %define SWIGWARN_TYPEMAP_CONST_UNDEF 464 %enddef %define SWIGWARN_TYPEMAP_UNDEF 465 %enddef %define SWIGWARN_TYPEMAP_VAR_UNDEF 466 %enddef %define SWIGWARN_TYPEMAP_TYPECHECK 467 %enddef %define SWIGWARN_TYPEMAP_THROW 468 %enddef %define SWIGWARN_TYPEMAP_DIRECTORIN_UNDEF 469 %enddef %define SWIGWARN_TYPEMAP_THREAD_UNSAFE 470 %enddef /* mostly used in directorout typemaps */ %define SWIGWARN_TYPEMAP_DIRECTOROUT_UNDEF 471 %enddef %define SWIGWARN_TYPEMAP_TYPECHECK_UNDEF 472 %enddef %define SWIGWARN_TYPEMAP_DIRECTOROUT_PTR 473 %enddef %define SWIGWARN_TYPEMAP_OUT_OPTIMAL_IGNORED 474 %enddef %define SWIGWARN_TYPEMAP_OUT_OPTIMAL_MULTIPLE 475 %enddef %define SWIGWARN_TYPEMAP_INITIALIZER_LIST 476 %enddef %define SWIGWARN_TYPEMAP_DIRECTORTHROWS_UNDEF 477 %enddef /* -- Fragments -- */ %define SWIGWARN_FRAGMENT_NOT_FOUND 490 %enddef /* -- General code generation -- */ %define SWIGWARN_LANG_OVERLOAD_DECL 501 %enddef %define SWIGWARN_LANG_OVERLOAD_CONSTRUCT 502 %enddef %define SWIGWARN_LANG_IDENTIFIER 503 %enddef %define SWIGWARN_LANG_RETURN_TYPE 504 %enddef %define SWIGWARN_LANG_VARARGS 505 %enddef %define SWIGWARN_LANG_VARARGS_KEYWORD 506 %enddef %define SWIGWARN_LANG_NATIVE_UNIMPL 507 %enddef %define SWIGWARN_LANG_DEREF_SHADOW 508 %enddef %define SWIGWARN_LANG_OVERLOAD_SHADOW 509 %enddef %define SWIGWARN_LANG_FRIEND_IGNORE 510 %enddef %define SWIGWARN_LANG_OVERLOAD_KEYWORD 511 %enddef %define SWIGWARN_LANG_OVERLOAD_CONST 512 %enddef %define SWIGWARN_LANG_CLASS_UNNAMED 513 %enddef %define SWIGWARN_LANG_DIRECTOR_VDESTRUCT 514 %enddef %define SWIGWARN_LANG_DISCARD_CONST 515 %enddef %define SWIGWARN_LANG_OVERLOAD_IGNORED 516 %enddef %define SWIGWARN_LANG_DIRECTOR_ABSTRACT 517 %enddef %define SWIGWARN_LANG_PORTABILITY_FILENAME 518 %enddef %define SWIGWARN_LANG_TEMPLATE_METHOD_IGNORE 519 %enddef %define SWIGWARN_LANG_SMARTPTR_MISSING 520 %enddef %define SWIGWARN_LANG_ILLEGAL_DESTRUCTOR 521 %enddef %define SWIGWARN_LANG_EXTEND_CONSTRUCTOR 522 %enddef %define SWIGWARN_LANG_EXTEND_DESTRUCTOR 523 %enddef %define SWIGWARN_LANG_EXPERIMENTAL 524 %enddef %define SWIGWARN_LANG_DIRECTOR_FINAL 525 %enddef /* -- Doxygen comments -- */ %define SWIGWARN_DOXYGEN_UNKNOWN_COMMAND 560 %enddef %define SWIGWARN_DOXYGEN_UNEXPECTED_END_OF_COMMENT 561 %enddef %define SWIGWARN_DOXYGEN_COMMAND_EXPECTED 562 %enddef %define SWIGWARN_DOXYGEN_HTML_ERROR 563 %enddef %define SWIGWARN_DOXYGEN_COMMAND_ERROR 564 %enddef %define SWIGWARN_DOXYGEN_UNKNOWN_CHARACTER 565 %enddef %define SWIGWARN_DOXYGEN_UNEXPECTED_ITERATOR_VALUE 566 %enddef /* -- Reserved (600-799) -- */ /* -- Language module specific warnings (700 - 899) -- */ %define SWIGWARN_D_TYPEMAP_CTYPE_UNDEF 700 %enddef %define SWIGWARN_D_TYPEMAP_IMTYPE_UNDEF 701 %enddef %define SWIGWARN_D_TYPEMAP_DTYPE_UNDEF 702 %enddef %define SWIGWARN_D_MULTIPLE_INHERITANCE 703 %enddef %define SWIGWARN_D_TYPEMAP_CLASSMOD_UNDEF 704 %enddef %define SWIGWARN_D_TYPEMAP_DBODY_UNDEF 705 %enddef %define SWIGWARN_D_TYPEMAP_DOUT_UNDEF 706 %enddef %define SWIGWARN_D_TYPEMAP_DIN_UNDEF 707 %enddef %define SWIGWARN_D_TYPEMAP_DDIRECTORIN_UNDEF 708 %enddef %define SWIGWARN_D_TYPEMAP_DCONSTRUCTOR_UNDEF 709 %enddef %define SWIGWARN_D_EXCODE_MISSING 710 %enddef %define SWIGWARN_D_CANTHROW_MISSING 711 %enddef %define SWIGWARN_D_NO_DIRECTORCONNECT_ATTR 712 %enddef %define SWIGWARN_D_NAME_COLLISION 713 %enddef /* please leave 700-719 free for D */ %define SWIGWARN_SCILAB_TRUNCATED_NAME 720 %enddef /* please leave 720-739 free for Scilab */ %define SWIGWARN_PYTHON_INDENT_MISMATCH 740 %enddef /* please leave 740-759 free for Python */ %define SWIGWARN_RUBY_WRONG_NAME 801 %enddef %define SWIGWARN_RUBY_MULTIPLE_INHERITANCE 802 %enddef /* please leave 800-809 free for Ruby */ %define SWIGWARN_JAVA_TYPEMAP_JNI_UNDEF 810 %enddef %define SWIGWARN_JAVA_TYPEMAP_JTYPE_UNDEF 811 %enddef %define SWIGWARN_JAVA_TYPEMAP_JSTYPE_UNDEF 812 %enddef %define SWIGWARN_JAVA_MULTIPLE_INHERITANCE 813 %enddef %define SWIGWARN_JAVA_TYPEMAP_GETCPTR_UNDEF 814 %enddef %define SWIGWARN_JAVA_TYPEMAP_CLASSMOD_UNDEF 815 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVABODY_UNDEF 816 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVAOUT_UNDEF 817 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVAIN_UNDEF 818 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF 819 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVADIRECTOROUT_UNDEF 820 %enddef %define SWIGWARN_JAVA_TYPEMAP_INTERFACECODE_UNDEF 821 %enddef %define SWIGWARN_JAVA_COVARIANT_RET 822 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVACONSTRUCT_UNDEF 823 %enddef %define SWIGWARN_JAVA_TYPEMAP_DIRECTORIN_NODESC 824 %enddef %define SWIGWARN_JAVA_NO_DIRECTORCONNECT_ATTR 825 %enddef %define SWIGWARN_JAVA_NSPACE_WITHOUT_PACKAGE 826 %enddef /* please leave 810-829 free for Java */ %define SWIGWARN_CSHARP_TYPEMAP_CTYPE_UNDEF 830 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSTYPE_UNDEF 831 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF 832 %enddef %define SWIGWARN_CSHARP_MULTIPLE_INHERITANCE 833 %enddef %define SWIGWARN_CSHARP_TYPEMAP_GETCPTR_UNDEF 834 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF 835 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSBODY_UNDEF 836 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSOUT_UNDEF 837 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSIN_UNDEF 838 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSDIRECTORIN_UNDEF 839 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSDIRECTOROUT_UNDEF 840 %enddef %define SWIGWARN_CSHARP_TYPEMAP_INTERFACECODE_UNDEF 841 %enddef %define SWIGWARN_CSHARP_COVARIANT_RET 842 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSCONSTRUCT_UNDEF 843 %enddef %define SWIGWARN_CSHARP_EXCODE 844 %enddef %define SWIGWARN_CSHARP_CANTHROW 845 %enddef %define SWIGWARN_CSHARP_NO_DIRECTORCONNECT_ATTR 846 %enddef /* please leave 830-849 free for C# */ %define SWIGWARN_MODULA3_TYPEMAP_TYPE_UNDEF 850 %enddef %define SWIGWARN_MODULA3_TYPEMAP_GETCPTR_UNDEF 851 %enddef %define SWIGWARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF 852 %enddef %define SWIGWARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF 853 %enddef %define SWIGWARN_MODULA3_TYPEMAP_MULTIPLE_RETURN 854 %enddef %define SWIGWARN_MODULA3_MULTIPLE_INHERITANCE 855 %enddef %define SWIGWARN_MODULA3_TYPECONSTRUCTOR_UNKNOWN 856 %enddef %define SWIGWARN_MODULA3_UNKNOWN_PRAGMA 857 %enddef %define SWIGWARN_MODULA3_BAD_ENUMERATION 858 %enddef %define SWIGWARN_MODULA3_DOUBLE_ID 859 %enddef %define SWIGWARN_MODULA3_BAD_IMPORT 860 %enddef /* please leave 850-869 free for Modula 3 */ %define SWIGWARN_PHP_MULTIPLE_INHERITANCE 870 %enddef %define SWIGWARN_PHP_UNKNOWN_PRAGMA 871 %enddef %define SWIGWARN_PHP_PUBLIC_BASE 872 %enddef /* please leave 870-889 free for PHP */ %define SWIGWARN_GO_NAME_CONFLICT 890 %enddef /* please leave 890-899 free for Go */ /* -- User defined warnings (900 - 999) -- */ swig-4.0.2/Lib/modula3/0000755000175000017500000000000013667507523014434 5ustar williamwilliamswig-4.0.2/Lib/modula3/modula3.swg0000644000175000017500000010601513667507523016525 0ustar williamwilliam/* ----------------------------------------------------------------------------- * modula3.swg * * Modula3 typemaps * ----------------------------------------------------------------------------- */ %include /* The ctype, m3rawtype and m3wraptype typemaps work together and so there should be one of each. * The ctype typemap contains the C type used in the signature of C wrappers for C++ functions. * The m3rawtype typemap contains the M3 type used in the raw interface. * The m3rawintype typemap contains the M3 type used as function argument. * The m3rawrettype typemap contains the M3 type used as return value. * The m3wraptype typemap contains the M3 type used in the M3 type wrapper classes and module class. */ /* Primitive types */ %typemap(ctype) bool, const bool & "bool" %typemap(ctype) char, const char & "char" %typemap(ctype) signed char, const signed char & "signed char" %typemap(ctype) unsigned char, const unsigned char & "unsigned short" %typemap(ctype) short, const short & "short" %typemap(ctype) unsigned short, const unsigned short & "unsigned short" %typemap(ctype) int, const int & "int" %typemap(ctype) unsigned int, const unsigned int & "unsigned int" %typemap(ctype) long, const long & "long" %typemap(ctype) unsigned long, const unsigned long & "unsigned long" %typemap(ctype) long long, const long long & "long long" %typemap(ctype) unsigned long long, const unsigned long long & "unsigned long long" %typemap(ctype) float, const float & "float" %typemap(ctype) double, const double & "double" %typemap(ctype) char * "char *" %typemap(ctype) void "void" %typemap(m3rawtype) bool, const bool & "BOOLEAN" %typemap(m3rawtype) char, const char & "C.char" %typemap(m3rawtype) signed char, const signed char & "C.signed_char" %typemap(m3rawtype) unsigned char, const unsigned char & "C.unsigned_char" %typemap(m3rawtype) short, const short & "C.short" %typemap(m3rawtype) unsigned short, const unsigned short & "C.unsigned_short" %typemap(m3rawtype) int, const int & "C.int" %typemap(m3rawtype) unsigned int, const unsigned int & "C.unsigned_int" %typemap(m3rawtype) long, const long & "C.long" %typemap(m3rawtype) unsigned long, const unsigned long & "C.unsigned_long" %typemap(m3rawtype) long long, const long long & "C.long_long" %typemap(m3rawtype) unsigned long long, const unsigned long long & "C.unsigned_long_long" %typemap(m3rawtype) float, const float & "C.float" %typemap(m3rawtype) double, const double & "C.double" %typemap(m3rawtype) long double, const long double & "C.long_double" %typemap(m3rawtype) char * "C.char_star" %typemap(m3rawtype) void "" %typemap(m3rawtype) FILE "Cstdio.FILE"; %typemap(m3rawtype) FILE * "Cstdio.FILE_star"; %typemap(m3rawintype) bool *, bool &, bool "BOOLEAN" %typemap(m3rawintype) char *, char &, char "C.char" %typemap(m3rawintype) signed char *, signed char &, signed char "C.signed_char" %typemap(m3rawintype) unsigned char *, unsigned char &, unsigned char "C.unsigned_char" %typemap(m3rawintype) short *, short &, short "C.short" %typemap(m3rawintype) unsigned short *, unsigned short &, unsigned short "C.unsigned_short" %typemap(m3rawintype) int *, int &, int "C.int" %typemap(m3rawintype) unsigned int *, unsigned int &, unsigned int "C.unsigned_int" %typemap(m3rawintype) long *, long &, long "C.long" %typemap(m3rawintype) unsigned long *, unsigned long &, unsigned long "C.unsigned_long" %typemap(m3rawintype) long long *, long long &, long long "C.long_long" %typemap(m3rawintype) unsigned long long *, unsigned long long &, unsigned long long "C.unsigned_long_long" %typemap(m3rawintype) float *, float &, float "C.float" %typemap(m3rawintype) double *, double &, double "C.double" %typemap(m3rawintype) long double *, long double &, long double "C.long_double" %typemap(m3rawintype) char * "C.char_star" %typemap(m3rawintype) void "" %typemap(m3rawintype) void * "ADDRESS" %typemap(m3rawintype) FILE "Cstdio.FILE"; %typemap(m3rawintype) FILE * "Cstdio.FILE_star"; %typemap(m3rawinmode) char *, void *, FILE * "" %typemap(m3rawrettype) bool, const bool & "BOOLEAN" %typemap(m3rawrettype) char, const char & "C.char" %typemap(m3rawrettype) signed char, const signed char & "C.signed_char" %typemap(m3rawrettype) unsigned char, const unsigned char & "C.unsigned_char" %typemap(m3rawrettype) short, const short & "C.short" %typemap(m3rawrettype) unsigned short, const unsigned short & "C.unsigned_short" %typemap(m3rawrettype) int, const int & "C.int" %typemap(m3rawrettype) unsigned int, const unsigned int & "C.unsigned_int" %typemap(m3rawrettype) long, const long & "C.long" %typemap(m3rawrettype) unsigned long, const unsigned long & "C.unsigned_long" %typemap(m3rawrettype) long long, const long long & "C.long_long" %typemap(m3rawrettype) unsigned long long, const unsigned long long & "C.unsigned_long_long" %typemap(m3rawrettype) float, const float & "C.float" %typemap(m3rawrettype) double, const double & "C.double" %typemap(m3rawrettype) long double, const long double & "C.long_double" %typemap(m3rawrettype) char * "C.char_star" %typemap(m3rawrettype) void "" %typemap(m3rawrettype) void * "ADDRESS" %typemap(m3rawrettype) FILE "Cstdio.FILE"; %typemap(m3rawrettype) FILE * "Cstdio.FILE_star"; %typemap("m3rawtype:import") char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, long double, const long double &, char * "Ctypes AS C" %typemap("m3rawintype:import") char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, long double, const long double &, char * "Ctypes AS C" %typemap("m3rawrettype:import") char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, long double, const long double &, char * "Ctypes AS C" %typemap("m3rawtype:import") FILE, FILE * "Cstdio"; %typemap("m3rawintype:import") FILE, FILE * "Cstdio"; %typemap("m3rawrettype:import") FILE, FILE * "Cstdio"; %typemap(m3wraptype) bool, const bool & "BOOLEAN" %typemap(m3wraptype) char, const char & "CHAR" %typemap(m3wraptype) signed char, const signed char & "CHAR" %typemap(m3wraptype) unsigned char, const unsigned char & "CHAR" %typemap(m3wraptype) short, const short & "Integer16.T" %typemap(m3wraptype) unsigned short, const unsigned short & "Cardinal16.T" %typemap(m3wraptype) int, const int & "INTEGER" %typemap(m3wraptype) unsigned int, const unsigned int & "CARDINAL" %typemap(m3wraptype) long, const long & "Integer32.T" %typemap(m3wraptype) unsigned long, const unsigned long & "Cardinal32.T" %typemap(m3wraptype) long long, const long long & "Integer64.T" %typemap(m3wraptype) unsigned long long, const unsigned long long & "Cardinal64.T" %typemap(m3wraptype) float, const float & "REAL" %typemap(m3wraptype) double, const double & "LONGREAL" %typemap(m3wraptype) long double, const long double & "EXTENDED" %typemap(m3wraptype) char * "TEXT" %typemap(m3wraptype) void "" %typemap(m3wraptype) FILE "Cstdio.FILE"; %typemap(m3wraptype) FILE * "Cstdio.FILE_star"; %typemap(m3wrapintype) bool, const bool *, const bool & "BOOLEAN" %typemap(m3wrapintype) char, const char *, const char & "CHAR" %typemap(m3wrapintype) signed char, const signed char *, const signed char & "CHAR" %typemap(m3wrapintype) unsigned char, const unsigned char *, const unsigned char & "CHAR" %typemap(m3wrapintype) short, const short *, const short & "INTEGER" %typemap(m3wrapintype) unsigned short, const unsigned short *, const unsigned short & "CARDINAL" %typemap(m3wrapintype) int, const int *, const int & "INTEGER" %typemap(m3wrapintype) unsigned int, const unsigned int *, const unsigned int & "CARDINAL" %typemap(m3wrapintype) long, const long *, const long & "INTEGER" %typemap(m3wrapintype) unsigned long, const unsigned long *, const unsigned long & "CARDINAL" %typemap(m3wrapintype) long long, const long long *, const long long & "INTEGER" %typemap(m3wrapintype) unsigned long long, const unsigned long long *, const unsigned long long & "CARDINAL" %typemap(m3wrapintype) float, const float *, const float & "REAL" %typemap(m3wrapintype) double, const double *, const double & "LONGREAL" %typemap(m3wrapintype) long double, const long double *, const long double & "EXTENDED" %typemap(m3wrapintype) const char *, const char [] "TEXT" %typemap(m3wrapintype,numinputs=0) void "" %typemap(m3wrapintype) FILE "Cstdio.FILE"; %typemap(m3wrapintype) FILE * "Cstdio.FILE_star"; %typemap(m3wrapouttype) bool, bool *, bool & "BOOLEAN" %typemap(m3wrapouttype) char, char *, char & "CHAR" %typemap(m3wrapouttype) signed char, signed char *, signed char & "CHAR" %typemap(m3wrapouttype) unsigned char, unsigned char *, unsigned char & "CHAR" %typemap(m3wrapouttype) short, short *, short & "INTEGER" %typemap(m3wrapouttype) unsigned short, unsigned short *, unsigned short & "CARDINAL" %typemap(m3wrapouttype) int, int *, int & "INTEGER" %typemap(m3wrapouttype) unsigned int, unsigned int *, unsigned int & "CARDINAL" %typemap(m3wrapouttype) long, long *, long & "INTEGER" %typemap(m3wrapouttype) unsigned long, unsigned long *, unsigned long & "CARDINAL" %typemap(m3wrapouttype) long long, long long *, long long & "INTEGER" %typemap(m3wrapouttype) unsigned long long, unsigned long long *, unsigned long long & "CARDINAL" %typemap(m3wrapouttype) float, float *, float & "REAL" %typemap(m3wrapouttype) double, double *, double & "LONGREAL" %typemap(m3wrapouttype) long double, long double *, long double & "EXTENDED" %typemap(m3wrapouttype) char *, char [] "TEXT" %typemap(m3wrapouttype,numinputs=0) void "" %typemap(m3wraprettype) bool, const bool & "BOOLEAN" %typemap(m3wraprettype) char, const char & "CHAR" %typemap(m3wraprettype) signed char, const signed char & "CHAR" %typemap(m3wraprettype) unsigned char, const unsigned char & "CHAR" %typemap(m3wraprettype) short, const short & "INTEGER" %typemap(m3wraprettype) unsigned short, const unsigned short & "CARDINAL" %typemap(m3wraprettype) int, const int & "INTEGER" %typemap(m3wraprettype) unsigned int, const unsigned int & "CARDINAL" %typemap(m3wraprettype) long, const long & "INTEGER" %typemap(m3wraprettype) unsigned long, const unsigned long & "CARDINAL" %typemap(m3wraprettype) long long, const long long & "INTEGER" %typemap(m3wraprettype) unsigned long long, const unsigned long long & "CARDINAL" %typemap(m3wraprettype) float, const float & "REAL" %typemap(m3wraprettype) double, const double & "LONGREAL" %typemap(m3wraprettype) long double, const long double & "EXTENDED" %typemap(m3wraprettype) char * "TEXT" %typemap(m3wraprettype) void "" %typemap(m3wraprettype) FILE "Cstdio.FILE"; %typemap(m3wraprettype) FILE * "Cstdio.FILE_star"; %typemap(ctype) char[ANY] "char *" %typemap(m3rawtype) char[ANY] "C.char_star" %typemap(m3rawintype) char[ANY] "C.char_star" %typemap(m3rawrettype) char[ANY] "C.char_star" %typemap(m3wraptype) char[ANY] "TEXT" %typemap(m3wrapintype) char[ANY] "TEXT" %typemap(m3wrapouttype) char[ANY] "TEXT" %typemap(m3wraprettype) char[ANY] "TEXT" %typemap(m3wrapinmode) const char * %{%} %typemap(m3wrapargvar) const char * %{$1 : C.char_star;%} %typemap(m3wrapinconv) const char * %{$1 := M3toC.SharedTtoS($1_name);%} %typemap(m3wrapfreearg) const char * %{M3toC.FreeSharedS($1_name,$1);%} %typemap(m3wrapargraw) const char * %{$1%} %typemap("m3wrapargvar:import") const char * "Ctypes AS C" %typemap("m3wrapinconv:import") const char * "M3toC" %typemap("m3wrapfreearg:import") const char * "M3toC" %typemap(m3wrapretvar) char * %{result : C.char_star;%} %typemap(m3wrapretraw) char * %{result%} %typemap(m3wrapretconv) char * %{M3toC.CopyStoT(result)%} %typemap("m3wrapretvar:import") char * "Ctypes AS C" %typemap("m3wrapretconv:import") char * "M3toC" %typemap(m3wrapinmode) FILE * %{%} %typemap("m3wraptype:import") FILE, FILE * "Cstdio"; %typemap("m3wrapintype:import") FILE, FILE * "Cstdio"; %typemap("m3wraprettype:import") FILE, FILE * "Cstdio"; /* Composed types */ %typemap(ctype) SWIGTYPE "$1_type" %typemap(m3rawtype) SWIGTYPE "$1_basetype" %typemap(m3rawrettype) SWIGTYPE "UNTRACED REF $1_basetype" %typemap(m3wraptype) SWIGTYPE "$1_basetype" %typemap(m3wrapintype) SWIGTYPE "$1_basetype" %typemap(m3wrapouttype) SWIGTYPE "$1_basetype" %typemap(m3wraprettype) SWIGTYPE "$1_basetype" %typemap(ctype) SWIGTYPE [] "$1_type" %typemap(m3rawtype) const SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" %typemap(m3rawtype) SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" %typemap(m3rawintype) const SWIGTYPE [] "(*ARRAY OF*) $1_basetype" %typemap(m3rawinmode) const SWIGTYPE [] "READONLY" %typemap(m3rawintype) SWIGTYPE [] "(*ARRAY OF*) $1_basetype" %typemap(m3rawinmode) SWIGTYPE [] "VAR" %typemap(m3rawrettype) const SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" %typemap(m3rawrettype) SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" %typemap(m3wraptype) SWIGTYPE [] "$1_basetype" %typemap(m3wrapintype) const SWIGTYPE [] "ARRAY OF $1_basetype" %typemap(m3wrapinmode) const SWIGTYPE [] "READONLY" %typemap(m3wrapintype) SWIGTYPE [] "ARRAY OF $1_basetype" %typemap(m3wrapinmode) SWIGTYPE [] "VAR" %typemap(m3wrapouttype) SWIGTYPE [] "ARRAY OF $1_basetype" %typemap(m3wraprettype) SWIGTYPE [] "REF ARRAY OF $1_basetype" %typemap(ctype) SWIGTYPE * "$1_type" %typemap(m3rawtype) const SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(m3rawtype) SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(m3rawintype) const SWIGTYPE * "$1_basetype" %typemap(m3rawinmode) const SWIGTYPE * "READONLY" %typemap(m3rawintype) SWIGTYPE * "$1_basetype" %typemap(m3rawinmode) SWIGTYPE * "VAR" %typemap(m3rawrettype) const SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(m3rawrettype) SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(m3wraptype) SWIGTYPE * "$1_basetype" %typemap(m3wrapintype) const SWIGTYPE * "$1_basetype" %typemap(m3wrapinmode) const SWIGTYPE * "READONLY" %typemap(m3wrapintype) SWIGTYPE * "$1_basetype" %typemap(m3wrapinmode) SWIGTYPE * "VAR" %typemap(m3wrapouttype) SWIGTYPE * "$1_basetype" %typemap(m3wraprettype) SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(ctype) SWIGTYPE & "$1_type" %typemap(m3rawtype) const SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(m3rawtype) SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(m3rawintype) const SWIGTYPE & "$1_basetype" %typemap(m3rawinmode) const SWIGTYPE & "READONLY" %typemap(m3rawintype) SWIGTYPE & "$1_basetype" %typemap(m3rawinmode) SWIGTYPE & "VAR" %typemap(m3rawrettype) const SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(m3rawrettype) SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(m3wraptype) SWIGTYPE & "$1_basetype" %typemap(m3wrapintype) const SWIGTYPE & "$1_basetype" %typemap(m3wrapinmode) const SWIGTYPE & "READONLY" %typemap(m3wrapintype) SWIGTYPE & "$1_basetype" %typemap(m3wrapinmode) SWIGTYPE & "VAR" %typemap(m3wrapouttype) SWIGTYPE & "$1_basetype" %typemap(m3wraprettype) SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(ctype) SWIGTYPE && "$1_type" %typemap(m3rawtype) const SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(m3rawtype) SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(m3rawintype) const SWIGTYPE && "$1_basetype" %typemap(m3rawinmode) const SWIGTYPE && "READONLY" %typemap(m3rawintype) SWIGTYPE && "$1_basetype" %typemap(m3rawinmode) SWIGTYPE && "VAR" %typemap(m3rawrettype) const SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(m3rawrettype) SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(m3wraptype) SWIGTYPE && "$1_basetype" %typemap(m3wrapintype) const SWIGTYPE && "$1_basetype" %typemap(m3wrapinmode) const SWIGTYPE && "READONLY" %typemap(m3wrapintype) SWIGTYPE && "$1_basetype" %typemap(m3wrapinmode) SWIGTYPE && "VAR" %typemap(m3wrapouttype) SWIGTYPE && "$1_basetype" %typemap(m3wraprettype) SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(ctype) enum SWIGTYPE "$1_type" %typemap(m3rawtype) enum SWIGTYPE "C.int" %typemap(m3rawintype) enum SWIGTYPE "C.int (* $1_type *)" %typemap(m3rawrettype) enum SWIGTYPE "C.int" %typemap(m3wraptype) enum SWIGTYPE "$*1_type" %typemap(m3wrapintype) enum SWIGTYPE "$1_type" %typemap(m3wrapouttype) enum SWIGTYPE "$1_type" %typemap(m3wraprettype) enum SWIGTYPE "$*1_type" /* pointer to a class member */ %typemap(ctype) SWIGTYPE (CLASS::*) "$1_type" %typemap(m3rawtype) SWIGTYPE (CLASS::*) "REFANY" %typemap(m3wraptype) SWIGTYPE (CLASS::*) "$1_basetype" /* The following are the in, out, freearg, argout typemaps. These are the PInvoke code generating typemaps for converting from C# to C and visa versa. */ /* primitive types */ %typemap(in) bool %{ $1 = $input ? true : false; %} %typemap(in) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double, enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) bool %{ $result = $1; %} %typemap(out) char %{ $result = $1; %} %typemap(out) signed char %{ $result = $1; %} %typemap(out) unsigned char %{ $result = $1; %} %typemap(out) short %{ $result = $1; %} %typemap(out) unsigned short %{ $result = $1; %} %typemap(out) int %{ $result = $1; %} %typemap(out) unsigned int %{ $result = $1; %} %typemap(out) long %{ $result = $1; %} %typemap(out) unsigned long %{ $result = $1; %} %typemap(out) long long %{ $result = $1; %} %typemap(out) unsigned long long %{ $result = $1; %} %typemap(out) float %{ $result = $1; %} %typemap(out) double %{ $result = $1; %} %typemap(out) enum SWIGTYPE %{ $result = $1; %} /* char * - treat as String */ %typemap(in) char * { $1 = $input; } //%typemap(freearg) char * { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, $1); } //%typemap(out) char * { if($1) $result = JCALL1(NewStringUTF, jenv, $1); } %typemap(out) void "" /* primitive types by const reference */ %typemap(in) const bool & (bool temp) %{ temp = $input ? true : false; $1 = &temp; %} %typemap(in) const char & (char temp), const signed char & (signed char temp), const unsigned char & (unsigned char temp), const short & (short temp), const unsigned short & (unsigned short temp), const int & (int temp), const unsigned int & (unsigned int temp), const long & (long temp), const unsigned long & (unsigned long temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const float & (float temp), const double & (double temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const bool & %{ $result = *$1; %} %typemap(out) const char & %{ $result = *$1; %} %typemap(out) const signed char & %{ $result = *$1; %} %typemap(out) const unsigned char & %{ $result = *$1; %} %typemap(out) const short & %{ $result = *$1; %} %typemap(out) const unsigned short & %{ $result = *$1; %} %typemap(out) const int & %{ $result = *$1; %} %typemap(out) const unsigned int & %{ $result = *$1; %} %typemap(out) const long & %{ $result = *$1; %} %typemap(out) const unsigned long & %{ $result = *$1; %} %typemap(out) const long long & %{ $result = *$1; %} %typemap(out) const unsigned long long & %{ $result = *$1; %} %typemap(out) const float & %{ $result = *$1; %} %typemap(out) const double & %{ $result = *$1; %} /* Default handling. Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_type argp) %{ argp = *($&1_ltype*)&$input; if (!argp) { // SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); RETURN $null; } $1 = *argp; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{*($&1_ltype*)&$result = new $1_ltype((const $1_ltype &)$1); %} #else { $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); *($&1_ltype*)&$result = $1ptr; } #endif /* Generic pointers and references */ %typemap(in) SWIGTYPE *, SWIGTYPE (CLASS::*) %{ $1 = *($&1_ltype)&$input; %} %typemap(in) SWIGTYPE & %{ $1 = *($&1_ltype)&$input; if(!$1) { //SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); RETURN $null; } %} %typemap(in) SWIGTYPE && %{ $1 = *($&1_ltype)&$input; if(!$1) { //SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); RETURN $null; } %} %typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE (CLASS::*) %{ *($&1_ltype)&$result = $1; %} /* Default array handling */ %typemap(in) SWIGTYPE [] %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE [] %{ *($&1_ltype)&$result = $1; %} /* char[ANY] - treat as String */ %typemap(in) char[ANY] { $1 = $input; } %typemap(argout) char[ANY] "" %typemap(freearg) char[ANY] ""//{ if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, $1); } %typemap(out) char[ANY] { if($1) $result = $1; } /* Typecheck typemaps - The purpose of these is merely to issue a warning for overloaded C++ functions * that cannot be overloaded in C# as more than one C++ type maps to a single C# type */ %typecheck(SWIG_TYPECHECK_BOOL) /* Java boolean */ bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) /* Java char */ char, const char & "" %typecheck(SWIG_TYPECHECK_INT8) /* Java byte */ signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_INT16) /* Java short */ unsigned char, short, const unsigned char &, const short & "" %typecheck(SWIG_TYPECHECK_INT32) /* Java int */ unsigned short, int, long, const unsigned short &, const int &, const long &, enum SWIGTYPE "" %typecheck(SWIG_TYPECHECK_INT64) /* Java long */ unsigned int, unsigned long, long long, const unsigned int &, const unsigned long &, const long long & "" %typecheck(SWIG_TYPECHECK_INT128) /* Java BigInteger */ unsigned long long "" %typecheck(SWIG_TYPECHECK_FLOAT) /* Java float */ float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) /* Java double */ double, const double & "" %typecheck(SWIG_TYPECHECK_STRING) /* Java String */ char *, char[ANY] "" %typecheck(SWIG_TYPECHECK_POINTER) /* Default */ SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" /* Exception handling */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short { char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, error_msg); RETURN $null; } %typemap(throws) SWIGTYPE { (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); RETURN $null; } %typemap(throws) char * { SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1); RETURN $null; } /* Typemaps for code generation in proxy classes and C# type wrapper classes */ /* The in typemap is used for converting function parameter types from the type * used in the proxy, module or type wrapper class to the type used in the PInvoke class. */ %typemap(m3in) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, char *, char[ANY], enum SWIGTYPE "$input" %typemap(m3in) SWIGTYPE "$&*1_type.getCPtr($input)" %typemap(m3in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "$1_basetype.getCPtr($input)" /* The m3out typemap is used for converting function return types from the return type * used in the PInvoke class to the type returned by the proxy, module or type wrapper class. */ %typemap(m3out) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, char *, char[ANY], enum SWIGTYPE %{$imcall%} %typemap(m3out) void %{$imcall%} %typemap(m3out) SWIGTYPE %{ RETURN NEW(REF $1_basetype, $imcall); %} %typemap(m3out) SWIGTYPE & %{ RETURN NEW($1_basetype, $imcall, $owner); %} %typemap(m3out) SWIGTYPE && %{ RETURN NEW($1_basetype, $imcall, $owner); %} %typemap(m3out) SWIGTYPE *, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ cPtr := $imcall; RETURN (cPtr = IntPtr.Zero) ? null : NEW($1_basetype, cPtr, $owner); %} /* Properties */ %typemap(m3varin) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ PROCEDURE Set$var (value: $vartype) = BEGIN $imcall; END Set$var; %} %typemap(m3varout) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, char *, char[ANY], enum SWIGTYPE %{ PROCEDURE Get$var (): $vartype = BEGIN RETURN $imcall; END Get$var; %} %typemap(m3varout) void %{ get { $imcall; } %} %typemap(m3varout) SWIGTYPE %{ get { RETURN new $&*1_mangle($imcall, true); } %} %typemap(m3varout) SWIGTYPE & %{ get { RETURN new $1_basetype($imcall, $owner); } %} %typemap(m3varout) SWIGTYPE && %{ get { RETURN new $1_basetype($imcall, $owner); } %} %typemap(m3varout) SWIGTYPE *, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ get { IntPtr cPtr = $imcall; RETURN (cPtr == IntPtr.Zero) ? null : new $1_basetype(cPtr, $owner); } %} /* Typemaps used for the generation of proxy and type wrapper class code */ %typemap(m3base) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(m3classmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public" %typemap(m3code) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(m3imports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "using System;" %typemap(m3interfaces) SWIGTYPE "IDisposable" %typemap(m3interfaces_derived) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(m3ptrconstructormodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "internal" %typemap(m3finalize) SWIGTYPE %{ ~$1_basetype() { Dispose(); } %} %typemap(m3destruct, methodname="Dispose") SWIGTYPE { if(swigCPtr != IntPtr.Zero && swigCMemOwn) { $imcall; swigCMemOwn = false; } swigCPtr = IntPtr.Zero; GC.SuppressFinalize(this); } %typemap(m3destruct_derived, methodname="Dispose") SWIGTYPE { if(swigCPtr != IntPtr.Zero && swigCMemOwn) { $imcall; swigCMemOwn = false; } swigCPtr = IntPtr.Zero; GC.SuppressFinalize(this); base.Dispose(); } %typemap(m3getcptr) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ internal static IntPtr getCPtr($1_basetype obj) { RETURN (obj == null) ? IntPtr.Zero : obj.swigCPtr; } %} /* M3 specific directives */ #define %m3multiretval %feature("modula3:multiretval") #define %constnumeric(num) %feature("constnumeric","num") %pragma(modula3) moduleimports=%{ IMPORT BlaBla; %} %pragma(modula3) imclassimports=%{ FROM BlaBla IMPORT Bla; %} /* Some ANSI C typemaps */ %apply unsigned long { size_t }; /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } swig-4.0.2/Lib/modula3/modula3head.swg0000644000175000017500000000374613667507523017356 0ustar williamwilliam/* ----------------------------------------------------------------------------- * modula3head.swg * * Modula3 support code * ----------------------------------------------------------------------------- */ %insert(runtime) %{ #include #include #include %} #if 0 %insert(runtime) %{ /* Support for throwing Modula3 exceptions */ typedef enum { SWIG_JavaOutOfMemoryError = 1, SWIG_JavaIOException, SWIG_JavaRuntimeException, SWIG_JavaIndexOutOfBoundsException, SWIG_JavaArithmeticException, SWIG_JavaIllegalArgumentException, SWIG_JavaNullPointerException, SWIG_JavaUnknownError } SWIG_JavaExceptionCodes; typedef struct { SWIG_JavaExceptionCodes code; const char *java_exception; } SWIG_JavaExceptions_t; #if defined(SWIG_NOINCLUDE) void SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg); #else %} %insert(runtime) { void SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg) { jclass excep; static const SWIG_JavaExceptions_t java_exceptions[] = { { SWIG_JavaOutOfMemoryError, "java/lang/OutOfMemoryError" }, { SWIG_JavaIOException, "java/io/IOException" }, { SWIG_JavaRuntimeException, "java/lang/RuntimeException" }, { SWIG_JavaIndexOutOfBoundsException, "java/lang/IndexOutOfBoundsException" }, { SWIG_JavaArithmeticException, "java/lang/ArithmeticException" }, { SWIG_JavaIllegalArgumentException, "java/lang/IllegalArgumentException" }, { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, { SWIG_JavaUnknownError, "java/lang/UnknownError" }, { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } }; const SWIG_JavaExceptions_t *except_ptr = java_exceptions; while (except_ptr->code != code && except_ptr->code) except_ptr++; JCALL0(ExceptionClear, jenv); excep = JCALL1(FindClass, jenv, except_ptr->java_exception); if (excep) JCALL2(ThrowNew, jenv, excep, msg); } } %insert(runtime) %{ #endif %} #endif swig-4.0.2/Lib/modula3/typemaps.i0000644000175000017500000001032113667507523016445 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* These typemaps will eventually probably maybe make their way into named typemaps * OUTPUT * and OUTPUT & as they currently break functions that return a pointer or * reference. */ %typemap(ctype) bool *, bool & "bool *" %typemap(ctype) char & "char *" %typemap(ctype) signed char *, signed char & "signed char *" %typemap(ctype) unsigned char *, unsigned char & "unsigned short *" %typemap(ctype) short *, short & "short *" %typemap(ctype) unsigned short *, unsigned short & "unsigned short *" %typemap(ctype) int *, int & "int *" %typemap(ctype) unsigned int *, unsigned int & "unsigned int *" %typemap(ctype) long *, long & "long *" %typemap(ctype) unsigned long *, unsigned long & "unsigned long *" %typemap(ctype) long long *, long long & "long long *" %typemap(ctype) unsigned long long *, unsigned long long & "unsigned long long *" %typemap(ctype) float *, float & "float *" %typemap(ctype) double *, double & "double *" %typemap(imtype) bool *, bool & "ref bool" %typemap(imtype) char & "ref char" %typemap(imtype) signed char *, signed char & "ref sbyte" %typemap(imtype) unsigned char *, unsigned char & "ref byte" %typemap(imtype) short *, short & "ref short" %typemap(imtype) unsigned short *, unsigned short & "ref ushort" %typemap(imtype) int *, int & "ref int" %typemap(imtype) unsigned int *, unsigned int & "ref uint" %typemap(imtype) long *, long & "ref int" %typemap(imtype) unsigned long *, unsigned long & "ref uint" %typemap(imtype) long long *, long long & "ref long" %typemap(imtype) unsigned long long *, unsigned long long & "ref ulong" %typemap(imtype) float *, float & "ref float" %typemap(imtype) double *, double & "ref double" %typemap(cstype) bool *, bool & "ref bool" %typemap(cstype) char & "ref char" %typemap(cstype) signed char *, signed char & "ref sbyte" %typemap(cstype) unsigned char *, unsigned char & "ref byte" %typemap(cstype) short *, short & "ref short" %typemap(cstype) unsigned short *, unsigned short & "ref ushort" %typemap(cstype) int *, int & "ref int" %typemap(cstype) unsigned int *, unsigned int & "ref uint" %typemap(cstype) long *, long & "ref int" %typemap(cstype) unsigned long *, unsigned long & "ref uint" %typemap(cstype) long long *, long long & "ref long" %typemap(cstype) unsigned long long *, unsigned long long & "ref ulong" %typemap(cstype) float *, float & "ref float" %typemap(cstype) double *, double & "ref double" %typemap(csin) bool *, bool &, char &, signed char *, signed char &, unsigned char *, unsigned char &, short *, short &, unsigned short *, unsigned short &, int *, int &, unsigned int *, unsigned int &, long *, long &, unsigned long *, unsigned long &, long long *, long long &, unsigned long long *, unsigned long long &, float *, float &, double *, double & "ref $csinput" swig-4.0.2/Lib/std/0000755000175000017500000000000013667507523013662 5ustar williamwilliamswig-4.0.2/Lib/std/std_wiostream.i0000644000175000017500000000014413667507523016717 0ustar williamwilliam/* Provide 'std_iostream.i' with wchar support. */ %include %include swig-4.0.2/Lib/std/std_deque.i0000644000175000017500000000664613667507523016025 0ustar williamwilliam// // std::deque %include // Deque %define %std_deque_methods(deque...) %std_sequence_methods(deque) void pop_front(); void push_front(const value_type& x); %enddef %define %std_deque_methods_val(deque...) %std_sequence_methods_val(deque) void pop_front(); void push_front(value_type x); %enddef // ------------------------------------------------------------------------ // std::deque // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::deque), f(const std::deque&): // the parameter being read-only, either a sequence or a // previously wrapped std::deque can be passed. // -- f(std::deque&), f(std::deque*): // the parameter may be modified; therefore, only a wrapped std::deque // can be passed. // -- std::deque f(), const std::deque& f(): // the deque is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::deque& f(), std::deque* f(): // the deque is returned by reference; therefore, a wrapped std::deque // is returned // -- const std::deque* f(), f(const std::deque*): // for consistency, they expect and return a plain deque pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class deque { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::deque< _Tp, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdDequeTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::deque<" #_Tp " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_DEQUE, std::deque< _Tp, _Alloc >); #ifdef %swig_deque_methods // Add swig/language extra methods %swig_deque_methods(std::deque< _Tp, _Alloc >); #endif %std_deque_methods(deque); }; template class deque< _Tp*, _Alloc > { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type reference; typedef value_type const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::deque< _Tp*, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdDequeTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::deque<" #_Tp " * >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_DEQUE, std::deque< _Tp*, _Alloc >); #ifdef %swig_deque_methods_val // Add swig/language extra methods %swig_deque_methods_val(std::deque< _Tp*, _Alloc >); #endif %std_deque_methods_val(deque); }; } swig-4.0.2/Lib/std/std_multiset.i0000644000175000017500000000476013667507523016563 0ustar williamwilliam// // std::multiset // %include // Multiset %define %std_multiset_methods(multiset...) %std_set_methods_common(multiset); %enddef // ------------------------------------------------------------------------ // std::multiset // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::multiset), f(const std::multiset&): // the parameter being read-only, either a sequence or a // previously wrapped std::multiset can be passed. // -- f(std::multiset&), f(std::multiset*): // the parameter may be modified; therefore, only a wrapped std::multiset // can be passed. // -- std::multiset f(), const std::multiset& f(): // the set is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::multiset& f(), std::multiset* f(): // the set is returned by reference; therefore, a wrapped std::multiset // is returned // -- const std::multiset* f(), f(const std::multiset*): // for consistency, they expect and return a plain set pointer. // ------------------------------------------------------------------------ // exported classes namespace std { //multiset template , class _Alloc = allocator< _Key > > class multiset { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key value_type; typedef _Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %fragment(SWIG_Traits_frag(std::multiset< _Key, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(_Key), fragment="StdMultisetTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::multiset<" #_Key "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MULTISET, std::multiset< _Key, _Compare, _Alloc >); multiset(const _Compare& other); #ifdef %swig_multiset_methods // Add swig/language extra methods %swig_multiset_methods(std::multiset< _Key, _Compare, _Alloc >); #endif %std_multiset_methods(multiset); }; } swig-4.0.2/Lib/std/std_multimap.i0000644000175000017500000000627513667507523016550 0ustar williamwilliam// // std::multimap // %include %define %std_multimap_methods(mmap...) %std_map_methods_common(mmap); #ifdef SWIG_EXPORT_ITERATOR_METHODS std::pair equal_range(const key_type& x); std::pair equal_range(const key_type& x) const; #endif %enddef // ------------------------------------------------------------------------ // std::multimap // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::multimap), f(const std::multimap&): // the parameter being read-only, either a sequence or a // previously wrapped std::multimap can be passed. // -- f(std::multimap&), f(std::multimap*): // the parameter may be modified; therefore, only a wrapped std::multimap // can be passed. // -- std::multimap f(), const std::multimap& f(): // the map is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::multimap& f(), std::multimap* f(): // the map is returned by reference; therefore, a wrapped std::multimap // is returned // -- const std::multimap* f(), f(const std::multimap*): // for consistency, they expect and return a plain map pointer. // ------------------------------------------------------------------------ // exported class namespace std { template, class _Alloc = allocator > > class multimap { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key key_type; typedef _Tp mapped_type; typedef std::pair< const _Key, _Tp > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::pair< _Key, _Tp >), "header", fragment=SWIG_Traits_frag(_Key), fragment=SWIG_Traits_frag(_Tp), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #_Key "," #_Tp " >"; } }; } } %fragment(SWIG_Traits_frag(std::multimap< _Key, _Tp, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(std::pair< _Key, _Tp >), fragment="StdMultimapTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::multimap<" #_Key "," #_Tp "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MULTIMAP, std::multimap< _Key, _Tp, _Compare, _Alloc >); multimap(const _Compare& other); #ifdef %swig_multimap_methods // Add swig/language extra methods %swig_multimap_methods(std::multimap< _Key, _Tp, _Compare, _Alloc >); #endif %std_multimap_methods(multimap); }; } swig-4.0.2/Lib/std/std_unordered_multiset.i0000644000175000017500000000572013667507523020627 0ustar williamwilliam// // std::unordered_multiset // %include // Unordered Multiset %define %std_unordered_multiset_methods(unordered_multiset...) %std_unordered_set_methods_common(unordered_multiset); %enddef // ------------------------------------------------------------------------ // std::unordered_multiset // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::unordered_multiset), f(const std::unordered_multiset&): // the parameter being read-only, either a sequence or a // previously wrapped std::unordered_multiset can be passed. // -- f(std::unordered_multiset&), f(std::unordered_multiset*): // the parameter may be modified; therefore, only a wrapped std::unordered_multiset // can be passed. // -- std::unordered_multiset f(), const std::unordered_multiset& f(): // the set is returned by copy; therefore, a sequence of Key:s // is returned which is most easily used in other functions // -- std::unordered_multiset& f(), std::unordered_multiset* f(): // the set is returned by reference; therefore, a wrapped std::unordered_multiset // is returned // -- const std::unordered_multiset* f(), f(const std::unordered_multiset*): // for consistency, they expect and return a plain set pointer. // ------------------------------------------------------------------------ // exported classes namespace std { //unordered_multiset template , class _Compare = std::equal_to< _Key >, class _Alloc = allocator< _Key > > class unordered_multiset { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key value_type; typedef _Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Hash hasher; typedef _Compare key_equal; typedef _Alloc allocator_type; %traits_swigtype(_Key); %fragment(SWIG_Traits_frag(std::unordered_multiset< _Key, _Hash, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(_Key), fragment="StdUnorderedMultisetTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::unordered_multiset<" #_Key "," #_Hash "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MULTISET, std::unordered_multiset< _Key, _Hash, _Compare, _Alloc >); #ifdef %swig_unordered_multiset_methods // Add swig/language extra methods %swig_unordered_multiset_methods(std::unordered_multiset< _Key, _Hash, _Compare, _Alloc >); #endif %std_unordered_multiset_methods(unordered_multiset); }; } swig-4.0.2/Lib/std/std_vector.i0000644000175000017500000001404413667507523016213 0ustar williamwilliam// // std::vector // %include // Vector %define %std_vector_methods(vector...) %std_sequence_methods(vector) void reserve(size_type n); size_type capacity() const; %enddef %define %std_vector_methods_val(vector...) %std_sequence_methods_val(vector) void reserve(size_type n); size_type capacity() const; %enddef // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // as much as possible, namely, to allow the user to pass and // be returned tuples or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&): // the parameter being read-only, either a sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter may be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(), const std::vector& f(): // the vector is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::vector& f(), std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // -- const std::vector* f(), f(const std::vector*): // for consistency, they expect and return a plain vector pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %traits_enum(_Tp); %fragment(SWIG_Traits_frag(std::vector< _Tp, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdVectorTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::vector<" #_Tp "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector< _Tp, _Alloc >); #ifdef %swig_vector_methods // Add swig/language extra methods %swig_vector_methods(std::vector< _Tp, _Alloc >); #endif %std_vector_methods(vector); }; // *** // This specialization should disappear or get simplified when // a 'const SWIGTYPE*&' can be defined // *** template class vector< _Tp*, _Alloc > { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::vector< _Tp*, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdVectorTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::vector<" #_Tp " *," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector< _Tp*, _Alloc >); #ifdef %swig_vector_methods_val // Add swig/language extra methods %swig_vector_methods_val(std::vector< _Tp*, _Alloc >); #endif %std_vector_methods_val(vector); }; // *** // const pointer specialization // *** template class vector< _Tp const *, _Alloc > { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp const * value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::vector< _Tp const*, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdVectorTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::vector<" #_Tp " const*," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector< _Tp const*, _Alloc >); #ifdef %swig_vector_methods_val // Add swig/language extra methods %swig_vector_methods_val(std::vector< _Tp const*, _Alloc >); #endif %std_vector_methods_val(vector); }; // *** // bool specialization // *** template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef bool value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef bool const_reference; typedef _Alloc allocator_type; %traits_swigtype(bool); %fragment(SWIG_Traits_frag(std::vector), "header", fragment=SWIG_Traits_frag(bool), fragment="StdVectorTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::vector"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); #ifdef %swig_vector_methods_val // Add swig/language extra methods %swig_vector_methods_val(std::vector); #endif %std_vector_methods_val(vector); #if defined(SWIG_STD_MODERN_STL) && !defined(SWIG_STD_NOMODERN_STL) void flip(); #endif }; } swig-4.0.2/Lib/std/std_carray.swg0000644000175000017500000000262413667507523016543 0ustar williamwilliam%{ #include %} // // std::carray - is really an extension to the 'std' namespace. // // A simple fix C array wrapper, more or less as presented in // // "The C++ Standarf Library", by Nicolai M. Josuttis // // which is also derived from the example in // // "The C++ Programming Language", by Bjarne Stroustup. // %inline %{ namespace std { template class carray { public: typedef _Type value_type; typedef size_t size_type; typedef _Type * iterator; typedef const _Type * const_iterator; carray() { } carray(const carray& other) { std::copy(other.v, other.v + size(), v); } template carray(_Iterator first, _Iterator last) { assign(first, last); } iterator begin() { return v; } iterator end() { return v + _Size; } const_iterator begin() const { return v; } const_iterator end() const { return v + _Size; } _Type& operator[](size_t i) { return v[i]; } const _Type& operator[](size_t i) const { return v[i]; } static size_t size() { return _Size; } template void assign(_Iterator first, _Iterator last) { if (std::distance(first,last) == size()) { std::copy(first, last, v); } else { throw std::length_error("bad range length"); } } private: _Type v[_Size]; }; } %} swig-4.0.2/Lib/std/std_alloc.i0000644000175000017500000000375313667507523016010 0ustar williamwilliamnamespace std { /** * @brief The "standard" allocator, as per [20.4]. * * The private _Alloc is "SGI" style. (See comments at the top * of stl_alloc.h.) * * The underlying allocator behaves as follows. * - __default_alloc_template is used via two typedefs * - "__single_client_alloc" typedef does no locking for threads * - "__alloc" typedef is threadsafe via the locks * - __new_alloc is used for memory requests * * (See @link Allocators allocators info @endlink for more.) */ template class allocator { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* pointer; typedef const _Tp* const_pointer; typedef _Tp& reference; typedef const _Tp& const_reference; typedef _Tp value_type; template struct rebind; allocator() throw(); allocator(const allocator& other) throw(); template allocator(const allocator<_Tp1>& other) throw(); ~allocator() throw(); pointer address(reference __x) const; const_pointer address(const_reference __x) const; // NB: __n is permitted to be 0. The C++ standard says nothing // about what the return value is when __n == 0. _Tp* allocate(size_type __n, const void* = 0); // __p is not permitted to be a null pointer. void deallocate(pointer __p, size_type __n); size_type max_size() const throw(); void construct(pointer __p, const _Tp& __val); void destroy(pointer __p); }; template<> class allocator { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef void* pointer; typedef const void* const_pointer; typedef void value_type; template struct rebind; }; } // namespace std swig-4.0.2/Lib/std/std_set.i0000644000175000017500000000645213667507523015510 0ustar williamwilliam// // std::set // %include %include // Set %define %std_set_methods_common(set...) set(); set(const set& other); bool empty() const; size_type size() const; void clear(); void swap(set& v); size_type erase(const key_type& x); size_type count(const key_type& x) const; #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; class reverse_iterator; iterator begin(); iterator end(); reverse_iterator rbegin(); reverse_iterator rend(); %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 void erase(iterator pos) { $self->erase(pos); } void erase(iterator first, iterator last) { $self->erase(first, last); } } iterator find(const key_type& x); iterator lower_bound(const key_type& x); iterator upper_bound(const key_type& x); std::pair equal_range(const key_type& x); #endif %enddef %define %std_set_methods(set...) %std_set_methods_common(set); #ifdef SWIG_EXPORT_ITERATOR_METHODS std::pair insert(const value_type& __x); #endif %enddef // ------------------------------------------------------------------------ // std::set // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::set), f(const std::set&): // the parameter being read-only, either a sequence or a // previously wrapped std::set can be passed. // -- f(std::set&), f(std::set*): // the parameter may be modified; therefore, only a wrapped std::set // can be passed. // -- std::set f(), const std::set& f(): // the set is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::set& f(), std::set* f(): // the set is returned by reference; therefore, a wrapped std::set // is returned // -- const std::set* f(), f(const std::set*): // for consistency, they expect and return a plain set pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template , class _Alloc = allocator< _Key > > class set { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key value_type; typedef _Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %fragment(SWIG_Traits_frag(std::set< _Key, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(_Key), fragment="StdSetTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::set<" #_Key "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_SET, std::set< _Key, _Compare, _Alloc >); set(const _Compare& other); #ifdef %swig_set_methods // Add swig/language extra methods %swig_set_methods(std::set< _Key, _Compare, _Alloc >); #endif %std_set_methods(set); }; } swig-4.0.2/Lib/std/std_container.i0000644000175000017500000001031713667507523016672 0ustar williamwilliam%include %include %include %{ #include %} // Common non-resizable container methods %define %std_container_methods_non_resizable(container...) container(); container(const container& other); bool empty() const; size_type size() const; void swap(container& v); %enddef %define %std_container_methods_forward_iterators(container...) #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; class const_iterator; iterator begin(); iterator end(); #endif %enddef %define %std_container_methods_reverse_iterators(container...) #ifdef SWIG_EXPORT_ITERATOR_METHODS class reverse_iterator; class const_reverse_iterator; reverse_iterator rbegin(); reverse_iterator rend(); #endif %enddef // Common container methods %define %std_container_methods(container...) %std_container_methods_non_resizable(%arg(container)) %std_container_methods_forward_iterators(%arg(container)) %std_container_methods_reverse_iterators(%arg(container)) void clear(); allocator_type get_allocator() const; %enddef %define %std_container_methods_without_reverse_iterators(container...) %std_container_methods_non_resizable(%arg(container)) %std_container_methods_forward_iterators(%arg(container)) void clear(); allocator_type get_allocator() const; %enddef // Common sequence %define %std_sequence_methods_common(sequence) %std_container_methods(%arg(sequence)); sequence(size_type size); void pop_back(); void resize(size_type new_size); #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 iterator erase(iterator pos) { return $self->erase(pos); } iterator erase(iterator first, iterator last) { return $self->erase(first, last); } } #endif %enddef %define %std_sequence_methods_non_resizable(sequence) %std_container_methods_non_resizable(%arg(sequence)) %std_container_methods_forward_iterators(%arg(container)) %std_container_methods_reverse_iterators(%arg(container)) const value_type& front() const; const value_type& back() const; %enddef %define %std_sequence_methods(sequence) %std_sequence_methods_common(%arg(sequence)); sequence(size_type size, const value_type& value); void push_back(const value_type& x); const value_type& front() const; const value_type& back() const; void assign(size_type n, const value_type& x); void resize(size_type new_size, const value_type& x); #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 iterator insert(iterator pos, const value_type& x) { return $self->insert(pos, x); } void insert(iterator pos, size_type n, const value_type& x) { $self->insert(pos, n, x); } } #endif %enddef %define %std_sequence_methods_non_resizable_val(sequence...) %std_container_methods_non_resizable(%arg(sequence)) %std_container_methods_forward_iterators(%arg(container)) %std_container_methods_reverse_iterators(%arg(container)) value_type front() const; value_type back() const; #endif %enddef %define %std_sequence_methods_val(sequence...) %std_sequence_methods_common(%arg(sequence)); sequence(size_type size, value_type value); void push_back(value_type x); value_type front() const; value_type back() const; void assign(size_type n, value_type x); void resize(size_type new_size, value_type x); #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 iterator insert(iterator pos, value_type x) { return $self->insert(pos, x); } void insert(iterator pos, size_type n, value_type x) { $self->insert(pos, n, x); } } #endif %enddef // // Ignore member methods for Type with no default constructor // %define %std_nodefconst_type(Type...) %feature("ignore") std::vector< Type >::vector(size_type size); %feature("ignore") std::vector< Type >::resize(size_type size); %feature("ignore") std::deque< Type >::deque(size_type size); %feature("ignore") std::deque< Type >::resize(size_type size); %feature("ignore") std::list< Type >::list(size_type size); %feature("ignore") std::list< Type >::resize(size_type size); %enddef swig-4.0.2/Lib/std/std_wstring.i0000644000175000017500000000037113667507523016404 0ustar williamwilliam%include %include /* wide strings */ namespace std { %std_comp_methods(basic_string); %naturalvar wstring; typedef basic_string wstring; } %template(wstring) std::basic_string; swig-4.0.2/Lib/std/std_unordered_map.i0000644000175000017500000000775313667507523017546 0ustar williamwilliam// // std::unordered_map // %include %include %define %std_unordered_map_methods_common(unordered_map...) %std_container_methods_without_reverse_iterators(unordered_map); size_type erase(const key_type& x); size_type count(const key_type& x) const; #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 void erase(iterator position) { $self->erase(position); } void erase(iterator first, iterator last) { $self->erase(first, last); } } iterator find(const key_type& x); #endif %enddef %define %std_unordered_map_methods(unordered_map...) %std_unordered_map_methods_common(unordered_map); #ifdef SWIG_EXPORT_ITERATOR_METHODS // iterator insert(const value_type& x); #endif %enddef // ------------------------------------------------------------------------ // std::unordered_map // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::unordered_map), f(const std::unordered_map&): // the parameter being read-only, either a sequence or a // previously wrapped std::unordered_map can be passed. // -- f(std::unordered_map&), f(std::unordered_map*): // the parameter may be modified; therefore, only a wrapped std::unordered_map // can be passed. // -- std::unordered_map f(), const std::unordered_map& f(): // the unordered_map is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::unordered_map& f(), std::unordered_map* f(): // the unordered_map is returned by reference; therefore, a wrapped std::unordered_map // is returned // -- const std::unordered_map* f(), f(const std::unordered_map*): // for consistency, they expect and return a plain unordered_map pointer. // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template, class _Pred = std::equal_to< _Key >, class _Alloc = allocator > > class unordered_map { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key key_type; typedef _Tp mapped_type; typedef std::pair< const _Key, _Tp > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Hash hasher; typedef _Compare key_equal; typedef _Alloc allocator_type; %traits_swigtype(_Key); %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::pair< _Key, _Tp >), "header", fragment=SWIG_Traits_frag(_Key), fragment=SWIG_Traits_frag(_Tp), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #_Key "," #_Tp " >"; } }; } } %fragment(SWIG_Traits_frag(std::unordered_map< _Key, _Tp, _Hash, _Pred, _Alloc >), "header", fragment=SWIG_Traits_frag(std::pair< _Key, _Tp >), fragment="StdUnorderedMapTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::unordered_map<" #_Key "," #_Tp "," #_Hash "," #_Pred "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MAP, std::unordered_map< _Key, _Tp, _Hash, _Pred, _Alloc >); #ifdef %swig_unordered_map_methods // Add swig/language extra methods %swig_unordered_map_methods(std::unordered_map< _Key, _Tp, _Hash, _Pred, _Alloc >); #endif %std_unordered_map_methods(unordered_map); }; } swig-4.0.2/Lib/std/std_sstream.i0000644000175000017500000001231313667507523016364 0ustar williamwilliam/* For wchar support, you need to include the wchar.i file before this file, ie: %include %include or equivalently, just include %include */ %include %include %include %include #if defined(SWIG_WCHAR) %include #endif %include %include %{ #include %} namespace std { template, typename _Alloc = allocator<_CharT> > class basic_stringbuf : public basic_streambuf<_CharT, _Traits> { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; // 251. basic_stringbuf missing allocator_type typedef _Alloc allocator_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: // Constructors: explicit basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out); explicit basic_stringbuf(const basic_string<_CharT, _Traits, _Alloc>& __str, ios_base::openmode __mode = ios_base::in | ios_base::out); // Get and set: basic_string<_CharT, _Traits, _Alloc> str() const; void str(const basic_string<_CharT, _Traits, _Alloc>& __s); }; // 27.7.2 Template class basic_istringstream template, typename _Alloc = allocator<_CharT> > class basic_istringstream : public basic_istream<_CharT, _Traits> { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; // 251. basic_stringbuf missing allocator_type typedef _Alloc allocator_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: // Constructors: explicit basic_istringstream(ios_base::openmode __mode = ios_base::in); explicit basic_istringstream(const basic_string<_CharT, _Traits, _Alloc>& __str, ios_base::openmode __mode = ios_base::in); ~basic_istringstream(); // Members: basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const; basic_string<_CharT, _Traits, _Alloc> str() const; void str(const basic_string<_CharT, _Traits, _Alloc>& __s); }; // 27.7.3 Template class basic_ostringstream template, typename _Alloc = allocator<_CharT> > class basic_ostringstream : public basic_ostream<_CharT, _Traits> { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; // 251. basic_stringbuf missing allocator_type typedef _Alloc allocator_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: // Constructors/destructor: explicit basic_ostringstream(ios_base::openmode __mode = ios_base::out); explicit basic_ostringstream(const basic_string<_CharT, _Traits, _Alloc>& __str, ios_base::openmode __mode = ios_base::out); ~basic_ostringstream(); // Members: basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const; basic_string<_CharT, _Traits, _Alloc> str() const; #if 0 void str(const basic_string<_CharT, _Traits, _Alloc>& __s); #endif }; // 27.7.4 Template class basic_stringstream template, typename _Alloc = allocator<_CharT> > class basic_stringstream : public basic_iostream<_CharT, _Traits> { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; // 251. basic_stringbuf missing allocator_type typedef _Alloc allocator_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: // Constructors/destructors explicit basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in); explicit basic_stringstream(const basic_string<_CharT, _Traits, _Alloc>& __str, ios_base::openmode __m = ios_base::out | ios_base::in); ~basic_stringstream(); // Members: basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const; basic_string<_CharT, _Traits, _Alloc> str() const; void str(const basic_string<_CharT, _Traits, _Alloc>& __s); }; } // namespace std namespace std { %template(istringstream) basic_istringstream; %template(ostringstream) basic_ostringstream; %template(stringstream) basic_stringstream; #if defined(SWIG_WCHAR) %template(wistringstream) basic_istringstream; %template(wostringstream) basic_ostringstream; %template(wstringstream) basic_stringstream; #endif } swig-4.0.2/Lib/std/std_unordered_multimap.i0000644000175000017500000000623113667507523020607 0ustar williamwilliam// // std::unordered_multimap // %include %define %std_unordered_multimap_methods(mmap...) %std_unordered_map_methods_common(mmap); #ifdef SWIG_EXPORT_ITERATOR_METHODS std::pair equal_range(const key_type& x); std::pair equal_range(const key_type& x) const; #endif %enddef // ------------------------------------------------------------------------ // std::unordered_multimap // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::unordered_multimap), f(const std::unordered_multimap&): // the parameter being read-only, either a sequence or a // previously wrapped std::unordered_multimap can be passed. // -- f(std::unordered_multimap&), f(std::unordered_multimap*): // the parameter may be modified; therefore, only a wrapped std::unordered_multimap // can be passed. // -- std::unordered_multimap f(), const std::unordered_multimap& f(): // the map is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::unordered_multimap& f(), std::unordered_multimap* f(): // the map is returned by reference; therefore, a wrapped std::unordered_multimap // is returned // -- const std::unordered_multimap* f(), f(const std::unordered_multimap*): // for consistency, they expect and return a plain map pointer. // ------------------------------------------------------------------------ // exported class namespace std { template, class _Pred = std::equal_to< _Key >, class _Alloc = allocator > > class unordered_multimap { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key key_type; typedef _Tp mapped_type; typedef std::pair< const _Key, _Tp > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Hash hasher; typedef _Compare key_equal; typedef _Alloc allocator_type; %traits_swigtype(_Key); %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::unordered_multimap< _Key, _Tp, _Hash, _Pred, _Alloc >), "header", fragment=SWIG_Traits_frag(std::pair< _Key, _Tp >), fragment="StdUnorderedMultimapTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::unordered_multimap<" #_Key "," #_Tp "," #_Hash "," #_Pred "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MULTIMAP, std::unordered_multimap< _Key, _Tp, _Hash, _Pred, _Alloc >); #ifdef %swig_unordered_multimap_methods // Add swig/language extra methods %swig_unordered_multimap_methods(std::unordered_multimap< _Key, _Tp, _Hash, _Pred, _Alloc >); #endif %std_unordered_multimap_methods(unordered_multimap); }; } swig-4.0.2/Lib/std/std_unordered_set.i0000644000175000017500000000726713667507523017564 0ustar williamwilliam// // std::unordered_set // %include %include // Unordered Set %define %std_unordered_set_methods_common(unordered_set...) unordered_set(); unordered_set(const unordered_set& other); bool empty() const; size_type size() const; void clear(); void swap(unordered_set& v); size_type erase(const key_type& x); size_type count(const key_type& x) const; #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; iterator begin(); iterator end(); %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 void erase(iterator pos) { $self->erase(pos); } void erase(iterator first, iterator last) { $self->erase(first, last); } } iterator find(const key_type& x); std::pair equal_range(const key_type& x); #endif %enddef %define %std_unordered_set_methods(unordered_set...) %std_unordered_set_methods_common(unordered_set); #ifdef SWIG_EXPORT_ITERATOR_METHODS std::pair insert(const value_type& __x); #endif %enddef // ------------------------------------------------------------------------ // std::unordered_set // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::unordered_set), f(const std::unordered_set&): // the parameter being read-only, either a sequence or a // previously wrapped std::unordered_set can be passed. // -- f(std::unordered_set&), f(std::unordered_set*): // the parameter may be modified; therefore, only a wrapped std::unordered_set // can be passed. // -- std::unordered_set f(), const std::unordered_set& f(): // the unordered_set is returned by copy; therefore, a sequence of Key:s // is returned which is most easily used in other functions // -- std::unordered_set& f(), std::unordered_set* f(): // the unordered_set is returned by reference; therefore, a wrapped std::unordered_set // is returned // -- const std::unordered_set* f(), f(const std::unordered_set*): // for consistency, they expect and return a plain unordered_set pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template , class _Compare = std::equal_to< _Key >, class _Alloc = allocator< _Key > > class unordered_set { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key value_type; typedef _Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Hash hasher; typedef _Compare key_equal; typedef _Alloc allocator_type; %traits_swigtype(_Key); %fragment(SWIG_Traits_frag(std::unordered_set< _Key, _Hash, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(_Key), fragment="StdUnorderedSetTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::unordered_set<" #_Key "," #_Hash "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_SET, std::unordered_set< _Key, _Hash, _Compare, _Alloc >); #ifdef %swig_unordered_set_methods // Add swig/language extra methods %swig_unordered_set_methods(std::unordered_set< _Key, _Hash, _Compare, _Alloc >); #endif %std_unordered_set_methods(unordered_set); }; } swig-4.0.2/Lib/std/std_basic_string.i0000644000175000017500000001454413667507523017365 0ustar williamwilliam%include %include %include %include %fragment(""); namespace std { %naturalvar basic_string; } namespace std { template , typename _Alloc = allocator<_CharT> > class basic_string { #if !defined(SWIG_STD_MODERN_STL) || defined(SWIG_STD_NOMODERN_STL) %ignore push_back; %ignore clear; %ignore compare; %ignore append; #endif public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _CharT value_type; typedef value_type reference; typedef value_type const_reference; typedef _Alloc allocator_type; static const size_type npos; #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; #endif %traits_swigtype(_CharT); %fragment(SWIG_Traits_frag(_CharT)); basic_string(const _CharT* __s, size_type __n); // Capacity: size_type length() const; size_type max_size() const; size_type capacity() const; void reserve(size_type __res_arg = 0); // Modifiers: basic_string& append(const basic_string& __str); basic_string& append(const basic_string& __str, size_type __pos, size_type __n); basic_string& append(const _CharT* __s, size_type __n); basic_string& append(size_type __n, _CharT __c); basic_string& assign(const basic_string& __str); basic_string& assign(const basic_string& __str, size_type __pos, size_type __n); basic_string& assign(const _CharT* __s, size_type __n); basic_string& insert(size_type __pos1, const basic_string& __str); basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n); basic_string& insert(size_type __pos, const _CharT* __s, size_type __n); basic_string& insert(size_type __pos, size_type __n, _CharT __c); basic_string& erase(size_type __pos = 0, size_type __n = npos); basic_string& replace(size_type __pos, size_type __n, const basic_string& __str); basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2); basic_string& replace(size_type __pos, size_type __n1, const _CharT* __s, size_type __n2); basic_string& replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c); size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const; // String operations: const _CharT* c_str() const; size_type find(const _CharT* __s, size_type __pos, size_type __n) const; size_type find(const basic_string& __str, size_type __pos = 0) const; size_type find(_CharT __c, size_type __pos = 0) const; size_type rfind(const basic_string& __str, size_type __pos = npos) const; size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const; size_type rfind(_CharT __c, size_type __pos = npos) const; size_type find_first_of(const basic_string& __str, size_type __pos = 0) const; size_type find_first_of(const _CharT* __s, size_type __pos, size_type __n) const; size_type find_first_of(_CharT __c, size_type __pos = 0) const; size_type find_last_of(const basic_string& __str, size_type __pos = npos) const; size_type find_last_of(const _CharT* __s, size_type __pos, size_type __n) const; size_type find_last_of(_CharT __c, size_type __pos = npos) const; size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const; size_type find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const; size_type find_first_not_of(_CharT __c, size_type __pos = 0) const; size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const; size_type find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const; size_type find_last_not_of(_CharT __c, size_type __pos = npos) const; basic_string substr(size_type __pos = 0, size_type __n = npos) const; int compare(const basic_string& __str) const; int compare(size_type __pos, size_type __n, const basic_string& __str) const; int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2) const; %ignore pop_back(); %ignore front() const; %ignore back() const; %ignore basic_string(size_type n); %std_sequence_methods_val(basic_string); %ignore pop(); #ifdef %swig_basic_string // Add swig/language extra methods %swig_basic_string(std::basic_string< _CharT, _Traits, _Alloc >); #endif #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; void insert(iterator __p, size_type __n, _CharT __c); basic_string& replace(iterator __i1, iterator __i2, const basic_string& __str); basic_string& replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n); basic_string& replace(iterator __i1, iterator __i2, size_type __n, _CharT __c); basic_string& replace(iterator __i1, iterator __i2, const _CharT* __k1, const _CharT* __k2); basic_string& replace(iterator __i1, iterator __i2, const_iterator __k1, const_iterator __k2); #endif basic_string& operator +=(const basic_string& v); %newobject __add__; %newobject __radd__; %extend { std::basic_string< _CharT,_Traits,_Alloc >* __add__(const basic_string& v) { std::basic_string< _CharT,_Traits,_Alloc >* res = new std::basic_string< _CharT,_Traits,_Alloc >(*self); *res += v; return res; } std::basic_string< _CharT,_Traits,_Alloc >* __radd__(const basic_string& v) { std::basic_string< _CharT,_Traits,_Alloc >* res = new std::basic_string< _CharT,_Traits,_Alloc >(v); *res += *self; return res; } std::basic_string< _CharT,_Traits,_Alloc > __str__() { return *self; } std::basic_ostream<_CharT, std::char_traits<_CharT> >& __rlshift__(std::basic_ostream<_CharT, std::char_traits<_CharT> >& out) { out << *self; return out; } } }; } swig-4.0.2/Lib/std/std_stack.i0000644000175000017500000000662713667507523016026 0ustar williamwilliam/** * @file std_stack.i * @date Sun May 6 01:48:07 2007 * * @brief A wrapping of std::stack for Ruby. * * */ %include // Stack %define %std_stack_methods(stack...) stack(); stack(const _Sequence& other); bool empty() const; size_type size() const; const value_type& top() const; void pop(); void push(const value_type& value); %enddef %define %std_stack_methods_val(stack...) %std_stack_methods(stack) %enddef // ------------------------------------------------------------------------ // std::stack // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::stack), f(const std::stack&): // the parameter being read-only, either a sequence or a // previously wrapped std::stack can be passed. // -- f(std::stack&), f(std::stack*): // the parameter may be modified; therefore, only a wrapped std::stack // can be passed. // -- std::stack f(), const std::stack& f(): // the stack is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::stack& f(), std::stack* f(): // the stack is returned by reference; therefore, a wrapped std::stack // is returned // -- const std::stack* f(), f(const std::stack*): // for consistency, they expect and return a plain stack pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class stack { public: typedef size_t size_type; typedef _Tp value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef _Sequence container_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::stack< _Tp, _Sequence >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdStackTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::stack<" #_Tp "," #_Sequence " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_STACK, std::stack< _Tp, _Sequence >); #ifdef %swig_stack_methods // Add swig/language extra methods %swig_stack_methods(std::stack< _Tp, _Sequence >); #endif %std_stack_methods(stack); }; template class stack< _Tp*, _Sequence > { public: typedef size_t size_type; typedef _Sequence::value_type value_type; typedef value_type reference; typedef value_type const_reference; typedef _Sequence container_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::stack< _Tp*, _Sequence >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdStackTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::stack<" #_Tp "," #_Sequence " * >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_STACK, std::stack< _Tp*, _Sequence >); #ifdef %swig_stack_methods_val // Add swig/language extra methods %swig_stack_methods_val(std::stack< _Tp*, _Sequence >); #endif %std_stack_methods_val(stack); }; } swig-4.0.2/Lib/std/std_streambuf.i0000644000175000017500000000332313667507523016677 0ustar williamwilliam%include %{ #ifndef SWIG_STD_NOMODERN_STL #include #else #include #endif %} namespace std { template > class basic_streambuf { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: virtual ~basic_streambuf(); // Locales: locale pubimbue(const locale &__loc); locale getloc() const; // Buffer and positioning: basic_streambuf<_CharT, _Traits>* pubsetbuf(char_type* __s, streamsize __n); pos_type pubseekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode = std::ios_base::in | std::ios_base::out); pos_type pubseekpos(pos_type __sp, ios_base::openmode __mode = std::ios_base::in | std::ios_base::out); int pubsync() ; // Get and put areas: // Get area: streamsize in_avail(); int_type snextc(); int_type sbumpc(); int_type sgetc(); streamsize sgetn(char_type* __s, streamsize __n); // Putback: int_type sputbackc(char_type __c); int_type sungetc(); // Put area: int_type sputc(char_type __c); streamsize sputn(const char_type* __s, streamsize __n); protected: basic_streambuf(); private: basic_streambuf(const basic_streambuf& other); }; } namespace std { %template(streambuf) basic_streambuf; #if defined(SWIG_WCHAR) %template(wstreambuf) basic_streambuf; #endif } swig-4.0.2/Lib/std/std_common.i0000644000175000017500000001242113667507523016176 0ustar williamwilliam%include // // Use the following macro with modern STL implementations // //#define SWIG_STD_MODERN_STL // // Use this to deactivate the previous definition, when using gcc-2.95 // or similar old compilers. // //#define SWIG_STD_NOMODERN_STL // Here, we identify compilers we know have problems with STL. %{ #if defined(__GNUC__) # if __GNUC__ == 2 && __GNUC_MINOR <= 96 # define SWIG_STD_NOMODERN_STL # endif #endif %} // // Common code for supporting the C++ std namespace // %fragment(""); %fragment(""); %fragment(""); %fragment("StdIteratorTraits","header",fragment="") %{ #if defined(__SUNPRO_CC) && defined(_RWSTD_VER) # if !defined(SWIG_NO_STD_NOITERATOR_TRAITS_STL) # define SWIG_STD_NOITERATOR_TRAITS_STL # endif #endif #if !defined(SWIG_STD_NOITERATOR_TRAITS_STL) #include #else namespace std { template struct iterator_traits { typedef ptrdiff_t difference_type; typedef typename Iterator::value_type value_type; }; template struct iterator_traits<__reverse_bi_iterator > { typedef Distance difference_type; typedef T value_type; }; template struct iterator_traits { typedef T value_type; typedef ptrdiff_t difference_type; }; template inline typename iterator_traits<_InputIterator>::difference_type distance(_InputIterator __first, _InputIterator __last) { typename iterator_traits<_InputIterator>::difference_type __n = 0; while (__first != __last) { ++__first; ++__n; } return __n; } } #endif %} %fragment("StdTraitsCommon","header",fragment="") %{ namespace swig { template struct noconst_traits { typedef Type noconst_type; }; template struct noconst_traits { typedef Type noconst_type; }; /* type categories */ struct pointer_category { }; struct value_category { }; /* General traits that provides type_name and type_info */ template struct traits { }; template inline const char* type_name() { return traits::noconst_type >::type_name(); } template struct traits_info { static swig_type_info *type_query(std::string name) { name += " *"; return SWIG_TypeQuery(name.c_str()); } static swig_type_info *type_info() { static swig_type_info *info = type_query(type_name()); return info; } }; /* Partial specialization for pointers (traits_info) */ template struct traits_info { static swig_type_info *type_query(std::string name) { name += " *"; return SWIG_TypeQuery(name.c_str()); } static swig_type_info *type_info() { static swig_type_info *info = type_query(type_name()); return info; } }; template inline swig_type_info *type_info() { return traits_info::type_info(); } /* Partial specialization for pointers (traits) */ template struct traits { typedef pointer_category category; static std::string make_ptr_name(const char* name) { std::string ptrname = name; ptrname += " *"; return ptrname; } static const char* type_name() { static std::string name = make_ptr_name(swig::type_name()); return name.c_str(); } }; template struct traits_as { }; template struct traits_check { }; } %} /* Generate the traits for a swigtype */ %define %traits_swigtype(Type...) %fragment(SWIG_Traits_frag(Type),"header",fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return #Type; } }; } } %enddef /* Generate the typemaps for a class that has 'value' traits */ %define %typemap_traits(Code,Type...) %typemaps_asvalfrom(%arg(Code), %arg(swig::asval< Type >), %arg(swig::from), %arg(SWIG_Traits_frag(Type)), %arg(SWIG_Traits_frag(Type)), Type); %enddef /* Generate the typemaps for a class that behaves more like a 'pointer' or plain wrapped Swigtype. */ %define %typemap_traits_ptr(Code,Type...) %typemaps_asptrfrom(%arg(Code), %arg(swig::asptr), %arg(swig::from), %arg(SWIG_Traits_frag(Type)), %arg(SWIG_Traits_frag(Type)), Type); %enddef /* Equality methods */ %define %std_equal_methods(Type...) %extend Type { bool operator == (const Type& v) { return *self == v; } bool operator != (const Type& v) { return *self != v; } } %enddef /* Order methods */ %define %std_order_methods(Type...) %extend Type { bool operator > (const Type& v) { return *self > v; } bool operator < (const Type& v) { return *self < v; } bool operator >= (const Type& v) { return *self >= v; } bool operator <= (const Type& v) { return *self <= v; } } %enddef /* Comparison methods */ %define %std_comp_methods(Type...) %std_equal_methods(Type ) %std_order_methods(Type ) %enddef swig-4.0.2/Lib/std/std_wstreambuf.i0000644000175000017500000000014613667507523017066 0ustar williamwilliam/* Provide 'std_streambuf.i' with wchar support. */ %include %include swig-4.0.2/Lib/std/std_wsstream.i0000644000175000017500000000014213667507523016550 0ustar williamwilliam/* Provide 'std_sstream.i' with wchar support. */ %include %include swig-4.0.2/Lib/std/std_except.i0000644000175000017500000000224713667507523016203 0ustar williamwilliam#if defined(SWIGJAVA) || defined(SWIGCSHARP) #error "do not use this version of std_except.i" #endif %{ #include #include %} #if defined(SWIG_STD_EXCEPTIONS_AS_CLASSES) namespace std { struct exception { virtual ~exception() throw(); virtual const char* what() const throw(); }; struct bad_cast : exception { }; struct bad_exception : exception { }; struct logic_error : exception { logic_error(const string& msg); }; struct domain_error : logic_error { domain_error(const string& msg); }; struct invalid_argument : logic_error { invalid_argument(const string& msg); }; struct length_error : logic_error { length_error(const string& msg); }; struct out_of_range : logic_error { out_of_range(const string& msg); }; struct runtime_error : exception { runtime_error(const string& msg); }; struct range_error : runtime_error { range_error(const string& msg); }; struct overflow_error : runtime_error { overflow_error(const string& msg); }; struct underflow_error : runtime_error { underflow_error(const string& msg); }; } #endif swig-4.0.2/Lib/std/std_queue.i0000644000175000017500000000666113667507523016043 0ustar williamwilliam/** * @file std_queue.i * @date Sun May 6 01:48:07 2007 * * @brief A wrapping of std::queue for Ruby. * * */ %include // Queue %define %std_queue_methods(queue...) queue(); queue(const _Sequence& other); bool empty() const; size_type size() const; const value_type& front() const; const value_type& back() const; void pop(); void push(const value_type& value); %enddef %define %std_queue_methods_val(queue...) %std_queue_methods(queue) %enddef // ------------------------------------------------------------------------ // std::queue // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::queue), f(const std::queue&): // the parameter being read-only, either a sequence or a // previously wrapped std::queue can be passed. // -- f(std::queue&), f(std::queue*): // the parameter may be modified; therefore, only a wrapped std::queue // can be passed. // -- std::queue f(), const std::queue& f(): // the queue is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::queue& f(), std::queue* f(): // the queue is returned by reference; therefore, a wrapped std::queue // is returned // -- const std::queue* f(), f(const std::queue*): // for consistency, they expect and return a plain queue pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class queue { public: typedef size_t size_type; typedef _Tp value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef _Sequence container_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::queue< _Tp, _Sequence >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdQueueTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::queue<" #_Tp "," #_Sequence " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_QUEUE, std::queue< _Tp, _Sequence >); #ifdef %swig_queue_methods // Add swig/language extra methods %swig_queue_methods(std::queue< _Tp, _Sequence >); #endif %std_queue_methods(queue); }; template class queue< _Tp*, _Sequence > { public: typedef size_t size_type; typedef _Tp value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef _Sequence container_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::queue< _Tp*, _Sequence >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdQueueTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::queue<" #_Tp "," #_Sequence " * >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_QUEUE, std::queue< _Tp*, _Sequence >); #ifdef %swig_queue_methods_val // Add swig/language extra methods %swig_queue_methods_val(std::queue< _Tp*, _Sequence >); #endif %std_queue_methods_val(queue); }; } swig-4.0.2/Lib/std/std_array.i0000644000175000017500000000504613667507523016031 0ustar williamwilliam// // std::array // %include %define %std_array_methods(array...) %std_sequence_methods_non_resizable(array) void fill(const value_type& u); %enddef %define %std_array_methods_val(array...) %std_sequence_methods_non_resizable_val(array) void fill(const value_type& u); %enddef // ------------------------------------------------------------------------ // std::array // // The aim of all that follows would be to integrate std::array with // as much as possible, namely, to allow the user to pass and // be returned tuples or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::array), f(const std::array&): // the parameter being read-only, either a sequence or a // previously wrapped std::array can be passed. // -- f(std::array&), f(std::array*): // the parameter may be modified; therefore, only a wrapped std::array // can be passed. // -- std::array f(), const std::array& f(): // the array is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::array& f(), std::array* f(): // the array is returned by reference; therefore, a wrapped std::array // is returned // -- const std::array* f(), f(const std::array*): // for consistency, they expect and return a plain array pointer. // ------------------------------------------------------------------------ // exported classes namespace std { template class array { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; %traits_swigtype(_Tp); %traits_enum(_Tp); %fragment(SWIG_Traits_frag(std::array< _Tp, _Nm >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdArrayTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::array<" #_Tp "," #_Nm " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_STDARRAY, std::array< _Tp, _Nm >); #ifdef %swig_array_methods // Add swig/language extra methods %swig_array_methods(std::array< _Tp, _Nm >); #endif %std_array_methods(array); }; } swig-4.0.2/Lib/std/std_pair.i0000644000175000017500000000723513667507523015650 0ustar williamwilliam%include %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; %traits_swigtype(T); %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair< T, U >), "header", fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #T "," #U " >"; } }; } } #ifndef SWIG_STD_PAIR_ASVAL %typemap_traits_ptr(SWIG_TYPECHECK_PAIR, std::pair< T, U >); #else %typemap_traits(SWIG_TYPECHECK_PAIR, std::pair< T, U >); #endif pair(); pair(T first, U second); pair(const pair& other); template pair(const pair< U1, U2 > &other); T first; U second; #ifdef %swig_pair_methods // Add swig/language extra methods %swig_pair_methods(std::pair< T, U >) #endif }; // *** // The following specializations should disappear or get // simplified when a 'const SWIGTYPE*&' can be defined // *** template struct pair< T, U* > { typedef T first_type; typedef U* second_type; %traits_swigtype(T); %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair< T, U* >), "header", fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #T "," #U " * >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_PAIR, std::pair< T, U* >); pair(); pair(T first, U* second); pair(const pair& other); T first; U* second; #ifdef %swig_pair_methods // Add swig/language extra methods %swig_pair_methods(std::pair< T, U* >) #endif }; template struct pair< T*, U > { typedef T* first_type; typedef U second_type; %traits_swigtype(T); %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair< T*, U >), "header", fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #T " *," #U " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_PAIR, std::pair< T*, U >); pair(); pair(T* first, U second); pair(const pair& other); T* first; U second; #ifdef %swig_pair_methods // Add swig/language extra methods %swig_pair_methods(std::pair< T*, U >) #endif }; template struct pair< T*, U* > { typedef T* first_type; typedef U* second_type; %traits_swigtype(T); %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair< T*, U* >), "header", fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #T " *," #U " * >"; } }; } } %typemap_traits(SWIG_TYPECHECK_PAIR, std::pair< T*, U* >); pair(); pair(T* first, U* second); pair(const pair& other); T* first; U* second; #ifdef %swig_pair_methods // Add swig/language extra methods %swig_pair_methods(std::pair< T*, U* >) #endif }; } swig-4.0.2/Lib/std/_std_deque.i0000644000175000017500000001052513667507523016153 0ustar williamwilliam/* ----------------------------------------------------------------------------- * _std_deque.i * * This file contains a generic definition of std::deque along with * some helper functions. Specific language modules should include * this file to generate wrappers. * ----------------------------------------------------------------------------- */ %include %{ #include #include %} /* This macro defines all of the standard methods for a deque. This is defined as a macro to simplify the task of specialization. For example, template<> class deque { public: %std_deque_methods(int); }; */ %define %std_deque_methods_noempty(T...) typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; deque(); deque(unsigned int size, const T& value=T()); deque(const deque< T > &); ~deque(); void assign(unsigned int n, const T& value); void swap(deque< T > &x); unsigned int size() const; unsigned int max_size() const; void resize(unsigned int n, T c = T()); const_reference front(); const_reference back(); void push_front(const T& x); void push_back(const T& x); void pop_front(); void pop_back(); void clear(); /* Some useful extensions */ %extend { const_reference getitem(int i) throw (std::out_of_range) { int size = int(self->size()); if (i<0) i += size; if (i>=0 && isize()); if (i<0) i+= size; if (i>=0 && isize()); if (i<0) i+= size; if (i>=0 && ierase(self->begin()+i); } else { throw std::out_of_range("deque index out of range"); } } std::deque< T > getslice(int i, int j) { int size = int(self->size()); if (i<0) i = size+i; if (j<0) j = size+j; if (i<0) i = 0; if (j>size) j = size; std::deque< T > tmp(j-i); std::copy(self->begin()+i,self->begin()+j,tmp.begin()); return tmp; } void setslice(int i, int j, const std::deque< T >& v) { int size = int(self->size()); if (i<0) i = size+i; if (j<0) j = size+j; if (i<0) i = 0; if (j>size) j = size; if (int(v.size()) == j-i) { std::copy(v.begin(),v.end(),self->begin()+i); } else { self->erase(self->begin()+i,self->begin()+j); if (i+1 <= size) self->insert(self->begin()+i+1,v.begin(),v.end()); else self->insert(self->end(),v.begin(),v.end()); } } void delslice(int i, int j) { int size = int(self->size()); if (i<0) i = size+i; if (j<0) j = size+j; if (i<0) i = 0; if (j>size) j = size; self->erase(self->begin()+i,self->begin()+j); } }; %enddef #ifdef SWIGPHP %define %std_deque_methods(T...) %extend { bool is_empty() const { return self->empty(); } }; %std_deque_methods_noempty(T) %enddef #else %define %std_deque_methods(T...) bool empty() const; %std_deque_methods_noempty(T) %enddef #endif namespace std { template class deque { public: %std_deque_methods(T); }; } swig-4.0.2/Lib/std/std_wios.i0000644000175000017500000000013213667507523015663 0ustar williamwilliam/* Provide 'std_ios.i' with wchar support. */ %include %include swig-4.0.2/Lib/std/std_char_traits.i0000644000175000017500000000616613667507523017222 0ustar williamwilliam%include #if defined(SWIG_WCHAR) %include #endif namespace std { /// 21.1.2 Basis for explicit _Traits specialization /// NB: That for any given actual character type this definition is /// probably wrong. template struct char_traits { }; /// 21.1.4 char_traits specializations template<> struct char_traits { typedef char char_type; typedef int int_type; typedef streampos pos_type; typedef streamoff off_type; typedef mbstate_t state_type; static void assign(char_type& __c1, const char_type& __c2); static bool eq(const char_type& __c1, const char_type& __c2); static bool lt(const char_type& __c1, const char_type& __c2); static int compare(const char_type* __s1, const char_type* __s2, size_t __n); static size_t length(const char_type* __s); static const char_type* find(const char_type* __s, size_t __n, const char_type& __a); static char_type* move(char_type* __s1, const char_type* __s2, size_t __n); static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n); static char_type* assign(char_type* __s, size_t __n, char_type __a); static char_type to_char_type(const int_type& __c); // To keep both the byte 0xff and the eof symbol 0xffffffff // from ending up as 0xffffffff. static int_type to_int_type(const char_type& __c); static bool eq_int_type(const int_type& __c1, const int_type& __c2); static int_type eof() ; static int_type not_eof(const int_type& __c); }; #if defined(SWIG_WCHAR) template<> struct char_traits { typedef wchar_t char_type; typedef wint_t int_type; typedef streamoff off_type; typedef wstreampos pos_type; typedef mbstate_t state_type; static void assign(char_type& __c1, const char_type& __c2); static bool eq(const char_type& __c1, const char_type& __c2); static bool lt(const char_type& __c1, const char_type& __c2); static int compare(const char_type* __s1, const char_type* __s2, size_t __n); static size_t length(const char_type* __s); static const char_type* find(const char_type* __s, size_t __n, const char_type& __a); static char_type* move(char_type* __s1, const char_type* __s2, int_type __n); static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n); static char_type* assign(char_type* __s, size_t __n, char_type __a); static char_type to_char_type(const int_type& __c) ; static int_type to_int_type(const char_type& __c) ; static bool eq_int_type(const int_type& __c1, const int_type& __c2); static int_type eof() ; static int_type not_eof(const int_type& __c); }; #endif } namespace std { #ifndef SWIG_STL_WRAP_TRAITS %template() char_traits; #if defined(SWIG_WCHAR) %template() char_traits; #endif #else %template(char_traits_c) char_traits; #if defined(SWIG_WCHAR) %template(char_traits_w) char_traits; #endif #endif } swig-4.0.2/Lib/std/README0000644000175000017500000000117213667507523014543 0ustar williamwilliam/* ----------------------------------------------------------------------------- * C++ STD + STL * ----------------------------------------------------------------------------- */ std_common.i general common code std_container.i general container code std_basic_string.i basic string std_char_traits.i char traits std_complex.i complex std_deque.i deque std_except.i exceptions std_ios.i ios std_iostream.i istream/ostream std_list.i list std_map.i map std_multimap.i multimap std_multiset.i multiset std_pair.i pair std_set.i set std_streambuf.i streambuf std_vector.i vector std_vectora.i vector + allocator swig-4.0.2/Lib/std/std_list.i0000644000175000017500000000745613667507523015675 0ustar williamwilliam// // std::list // %include // List %define %std_list_methods(list...) %std_sequence_methods(list) void pop_front(); void push_front(const value_type& x); void reverse(); %enddef %define %std_list_methods_val(list...) %std_sequence_methods_val(list) void pop_front(); void push_front(value_type x); void remove(value_type x); void unique(); void reverse(); void sort(); void merge(list& x); %enddef // ------------------------------------------------------------------------ // std::list // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::list), f(const std::list&): // the parameter being read-only, either a sequence or a // previously wrapped std::list can be passed. // -- f(std::list&), f(std::list*): // the parameter may be modified; therefore, only a wrapped std::list // can be passed. // -- std::list f(), const std::list& f(): // the list is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::list& f(), std::list* f(): // the list is returned by reference; therefore, a wrapped std::list // is returned // -- const std::list* f(), f(const std::list*): // for consistency, they expect and return a plain list pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class list { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::list< _Tp, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdListTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::list<" #_Tp ", " #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_LIST, std::list< _Tp, _Alloc >); #ifdef %swig_list_methods // Add swig/language extra methods %swig_list_methods(std::list< _Tp, _Alloc >); #endif %std_list_methods(list); }; template class list< _Tp*, _Alloc> { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::list< _Tp*, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdListTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::list<" #_Tp " *," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_LIST, std::list< _Tp*, _Alloc >); #ifdef %swig_list_methods_val // Add swig/language extra methods %swig_list_methods_val(std::list< _Tp*, _Alloc >); #endif %std_list_methods_val(list); }; } %define %std_extequal_list(...) %extend std::list< __VA_ARGS__ > { void remove(const value_type& x) { self->remove(x); } void merge(std::list< __VA_ARGS__ >& x){ self->merge(x); } void unique() { self->unique(); } void sort() { self->sort(); } } %enddef swig-4.0.2/Lib/std/std_iostream.i0000644000175000017500000002124713667507523016537 0ustar williamwilliam/* For wchar support, you need to include the wchar.i file before this file, ie: %include %include or equivalently, just include %include */ %include %include %include #if defined(SWIG_WCHAR) %include #endif %{ #include %} namespace std { // 27.6.2.1 Template class basic_ostream template > class basic_ostream : virtual public basic_ios<_CharT, _Traits> { public: // Types (inherited from basic_ios (27.4.4)): typedef _CharT char_type; typedef typename _Traits::int_type int_type; typedef typename _Traits::pos_type pos_type; typedef typename _Traits::off_type off_type; typedef _Traits traits_type; // 27.6.2.2 Constructor/destructor: explicit basic_ostream(basic_streambuf<_CharT, _Traits>* __sb); virtual ~basic_ostream(); // 27.6.2.5 Formatted output: // 27.6.2.5.3 basic_ostream::operator<< basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& (*__pf)(basic_ostream<_CharT, _Traits>&)); basic_ostream<_CharT, _Traits>& operator<<(basic_ios<_CharT, _Traits>& (*__pf)(basic_ios<_CharT, _Traits>&)); basic_ostream<_CharT, _Traits>& operator<<(ios_base& (*__pf) (ios_base&)); // 27.6.2.5.2 Arithmetic Inserters basic_ostream<_CharT, _Traits>& operator<<(long __n); basic_ostream<_CharT, _Traits>& operator<<(unsigned long __n); basic_ostream<_CharT, _Traits>& operator<<(bool __n); basic_ostream<_CharT, _Traits>& operator<<(short __n); basic_ostream<_CharT, _Traits>& operator<<(unsigned short __n); basic_ostream<_CharT, _Traits>& operator<<(int __n); basic_ostream<_CharT, _Traits>& operator<<(unsigned int __n); basic_ostream<_CharT, _Traits>& operator<<(long long __n); basic_ostream<_CharT, _Traits>& operator<<(unsigned long long __n); basic_ostream<_CharT, _Traits>& operator<<(double __f); basic_ostream<_CharT, _Traits>& operator<<(float __f); basic_ostream<_CharT, _Traits>& operator<<(long double __f); basic_ostream<_CharT, _Traits>& operator<<(const void* __p); basic_ostream<_CharT, _Traits>& operator<<(basic_streambuf<_CharT, _Traits>* __sb); %extend { std::basic_ostream<_CharT, _Traits >& operator<<(const std::basic_string<_CharT,_Traits, std::allocator<_CharT> >& s) { *self << s; return *self; } } // Unformatted output: basic_ostream<_CharT, _Traits>& put(char_type __c); basic_ostream<_CharT, _Traits>& write(const char_type* __s, streamsize __n); basic_ostream<_CharT, _Traits>& flush(); // Seeks: pos_type tellp(); basic_ostream<_CharT, _Traits>& seekp(pos_type); basic_ostream<_CharT, _Traits>& seekp(off_type, ios_base::seekdir); }; // 27.6.1.1 Template class basic_istream template > class basic_istream : virtual public basic_ios<_CharT, _Traits> { public: // Types (inherited from basic_ios (27.4.4)): typedef _CharT char_type; typedef typename _Traits::int_type int_type; typedef typename _Traits::pos_type pos_type; typedef typename _Traits::off_type off_type; typedef _Traits traits_type; public: // 27.6.1.1.1 Constructor/destructor: explicit basic_istream(basic_streambuf<_CharT, _Traits>* __sb); virtual ~basic_istream(); // 27.6.1.2.3 basic_istream::operator>> basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& (*__pf)(basic_istream<_CharT, _Traits>&)); basic_istream<_CharT, _Traits>& operator>>(basic_ios<_CharT, _Traits>& (*__pf)(basic_ios<_CharT, _Traits>&)); basic_istream<_CharT, _Traits>& operator>>(ios_base& (*__pf)(ios_base&)); // 27.6.1.2.2 Arithmetic Extractors basic_istream<_CharT, _Traits>& operator>>(bool& __n); basic_istream<_CharT, _Traits>& operator>>(short& __n); basic_istream<_CharT, _Traits>& operator>>(unsigned short& __n); basic_istream<_CharT, _Traits>& operator>>(int& __n); basic_istream<_CharT, _Traits>& operator>>(unsigned int& __n); basic_istream<_CharT, _Traits>& operator>>(long& __n); basic_istream<_CharT, _Traits>& operator>>(unsigned long& __n); basic_istream<_CharT, _Traits>& operator>>(long long& __n); basic_istream<_CharT, _Traits>& operator>>(unsigned long long& __n); basic_istream<_CharT, _Traits>& operator>>(float& __f); basic_istream<_CharT, _Traits>& operator>>(double& __f); basic_istream<_CharT, _Traits>& operator>>(long double& __f); basic_istream<_CharT, _Traits>& operator>>(void*& __p); basic_istream<_CharT, _Traits>& operator>>(basic_streambuf<_CharT, _Traits>* __sb); // 27.6.1.3 Unformatted input: inline streamsize gcount(void) const; int_type get(void); basic_istream<_CharT, _Traits>& get(char_type& __c); basic_istream<_CharT, _Traits>& get(char_type* __s, streamsize __n, char_type __delim); inline basic_istream<_CharT, _Traits>& get(char_type* __s, streamsize __n); basic_istream<_CharT, _Traits>& get(basic_streambuf<_CharT, _Traits>& __sb, char_type __delim); inline basic_istream<_CharT, _Traits>& get(basic_streambuf<_CharT, _Traits>& __sb); basic_istream<_CharT, _Traits>& getline(char_type* __s, streamsize __n, char_type __delim); inline basic_istream<_CharT, _Traits>& getline(char_type* __s, streamsize __n); basic_istream<_CharT, _Traits>& ignore(streamsize __n = 1, int_type __delim = _Traits::eof()); int_type peek(void); basic_istream<_CharT, _Traits>& read(char_type* __s, streamsize __n); streamsize readsome(char_type* __s, streamsize __n); basic_istream<_CharT, _Traits>& putback(char_type __c); basic_istream<_CharT, _Traits>& unget(void); int sync(void); pos_type tellg(void); basic_istream<_CharT, _Traits>& seekg(pos_type); basic_istream<_CharT, _Traits>& seekg(off_type, ios_base::seekdir); }; // 27.6.1.5 Template class basic_iostream template > class basic_iostream : public basic_istream<_CharT, _Traits>, public basic_ostream<_CharT, _Traits> { public: typedef _CharT char_type; typedef typename _Traits::int_type int_type; typedef typename _Traits::pos_type pos_type; typedef typename _Traits::off_type off_type; typedef _Traits traits_type; explicit basic_iostream(basic_streambuf<_CharT, _Traits>* __sb); virtual ~basic_iostream(); }; typedef basic_ostream ostream ; typedef basic_istream istream; typedef basic_iostream iostream; extern istream cin; extern ostream cout; extern ostream cerr; extern ostream clog; #if defined(SWIG_WCHAR) typedef basic_ostream wostream; typedef basic_istream wistream; typedef basic_iostream wiostream; extern wistream wcin; extern wostream wcout; extern wostream wcerr; extern wostream wclog; #endif template > std::basic_ostream<_CharT, _Traits>& endl(std::basic_ostream<_CharT, _Traits>& value); template > std::basic_ostream<_CharT, _Traits>& ends(std::basic_ostream<_CharT, _Traits>& value); template > std::basic_ostream<_CharT, _Traits>& flush(std::basic_ostream<_CharT, _Traits>& value); } namespace std { %template(ostream) basic_ostream; %template(istream) basic_istream; %template(iostream) basic_iostream; %template(endl) endl >; %template(ends) ends >; %template(flush) flush >; #if defined(SWIG_WCHAR) %template(wostream) basic_ostream; %template(wistream) basic_istream; %template(wiostream) basic_iostream; %template(wendl) endl >; %template(wends) ends >; %template(wflush) flush >; #endif } swig-4.0.2/Lib/std/std_vectora.i0000644000175000017500000000022313667507523016346 0ustar williamwilliam// // We keep this file only for backward compatibility, since std_vector.i // now uses the std::allocator parameter. // %include swig-4.0.2/Lib/std/std_string.i0000644000175000017500000000033313667507523016213 0ustar williamwilliam%include /* plain strings */ namespace std { %std_comp_methods(basic_string); %naturalvar string; typedef basic_string string; } %template(string) std::basic_string; swig-4.0.2/Lib/std/std_ios.i0000644000175000017500000001216613667507523015506 0ustar williamwilliam%include %include %include %{ #ifndef SWIG_STD_NOMODERN_STL # include #else # include #endif %} namespace std { template > class basic_streambuf; template > class basic_istream; template > class basic_ostream; // 27.4.2 Class ios_base typedef size_t streamsize; class locale; class ios_base { public: #ifdef SWIG_NESTED_CLASSES // 27.4.2.1.1 Class ios_base::failure class failure : public exception { public: explicit failure(const string& __str) throw(); }; #endif // 27.4.2.1.2 Type ios_base::fmtflags typedef int fmtflags; // 27.4.2.1.2 Type fmtflags static const fmtflags boolalpha ; static const fmtflags dec ; static const fmtflags fixed ; static const fmtflags hex ; static const fmtflags internal ; static const fmtflags left ; static const fmtflags oct ; static const fmtflags right ; static const fmtflags scientific ; static const fmtflags showbase ; static const fmtflags showpoint ; static const fmtflags showpos ; static const fmtflags skipws ; static const fmtflags unitbuf ; static const fmtflags uppercase ; static const fmtflags adjustfield ; static const fmtflags basefield ; static const fmtflags floatfield ; // 27.4.2.1.3 Type ios_base::iostate typedef int iostate; static const iostate badbit ; static const iostate eofbit ; static const iostate failbit ; static const iostate goodbit ; // 27.4.2.1.4 Type openmode typedef int openmode; static const openmode app ; static const openmode ate ; static const openmode binary ; static const openmode in ; static const openmode out ; static const openmode trunc ; // 27.4.2.1.5 Type seekdir typedef int seekdir; static const seekdir beg ; static const seekdir cur ; static const seekdir end ; // Callbacks; enum event { erase_event, imbue_event, copyfmt_event }; typedef void (*event_callback) (event, ios_base&, int); void register_callback(event_callback __fn, int __index); // Fmtflags state: inline fmtflags flags() const ; inline fmtflags flags(fmtflags __fmtfl); inline fmtflags setf(fmtflags __fmtfl); inline fmtflags setf(fmtflags __fmtfl, fmtflags __mask); inline void unsetf(fmtflags __mask) ; inline streamsize precision() const ; inline streamsize precision(streamsize __prec); inline streamsize width() const ; inline streamsize width(streamsize __wide); static bool sync_with_stdio(bool __sync = true); // Locales: locale imbue(const locale& __loc); inline locale getloc() const { return _M_ios_locale; } // Storage: static int xalloc() throw(); inline long& iword(int __ix); inline void*& pword(int __ix); // Destructor ~ios_base(); protected: ios_base(); //50. Copy constructor and assignment operator of ios_base private: ios_base(const ios_base& other); ios_base& operator=(const ios_base& other); }; template > class basic_ios : public ios_base { public: // Types: typedef _CharT char_type; typedef typename _Traits::int_type int_type; typedef typename _Traits::pos_type pos_type; typedef typename _Traits::off_type off_type; typedef _Traits traits_type; public: iostate rdstate() const; void clear(iostate __state = goodbit); void setstate(iostate __state); bool good() const; bool eof() const; bool fail() const; bool bad() const; iostate exceptions() const; void exceptions(iostate __except); // Constructor/destructor: explicit basic_ios(basic_streambuf<_CharT, _Traits>* __sb) : ios_base(); virtual ~basic_ios() ; // Members: basic_ostream<_CharT, _Traits>* tie() const; basic_ostream<_CharT, _Traits>* tie(basic_ostream<_CharT, _Traits>* __tiestr); basic_streambuf<_CharT, _Traits>* rdbuf() const; basic_streambuf<_CharT, _Traits>* rdbuf(basic_streambuf<_CharT, _Traits>* __sb); basic_ios& copyfmt(const basic_ios& __rhs); char_type fill() const; char_type fill(char_type __ch); // Locales: locale imbue(const locale& __loc); char narrow(char_type __c, char __dfault) const; char_type widen(char __c) const; protected: // 27.4.5.1 basic_ios constructors basic_ios(); private: basic_ios(const basic_ios& other); basic_ios& operator=(const basic_ios& other); }; } namespace std { typedef basic_ios ios; %template(ios) basic_ios; #if defined(SWIG_WCHAR) typedef basic_ios wios; %template(wios) basic_ios; #endif } swig-4.0.2/Lib/std/std_map.i0000644000175000017500000000714313667507523015470 0ustar williamwilliam// // std::map // %include %include %define %std_map_methods_common(map...) %std_container_methods(map); size_type erase(const key_type& x); size_type count(const key_type& x) const; #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 void erase(iterator position) { $self->erase(position); } void erase(iterator first, iterator last) { $self->erase(first, last); } } iterator find(const key_type& x); iterator lower_bound(const key_type& x); iterator upper_bound(const key_type& x); #endif %enddef %define %std_map_methods(map...) %std_map_methods_common(map); #ifdef SWIG_EXPORT_ITERATOR_METHODS // iterator insert(const value_type& x); #endif %enddef // ------------------------------------------------------------------------ // std::map // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::map), f(const std::map&): // the parameter being read-only, either a sequence or a // previously wrapped std::map can be passed. // -- f(std::map&), f(std::map*): // the parameter may be modified; therefore, only a wrapped std::map // can be passed. // -- std::map f(), const std::map& f(): // the map is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::map& f(), std::map* f(): // the map is returned by reference; therefore, a wrapped std::map // is returned // -- const std::map* f(), f(const std::map*): // for consistency, they expect and return a plain map pointer. // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template, class _Alloc = allocator > > class map { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key key_type; typedef _Tp mapped_type; typedef std::pair< const _Key, _Tp > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::pair< _Key, _Tp >), "header", fragment=SWIG_Traits_frag(_Key), fragment=SWIG_Traits_frag(_Tp), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #_Key "," #_Tp " >"; } }; } } %fragment(SWIG_Traits_frag(std::map< _Key, _Tp, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(std::pair< _Key, _Tp >), fragment="StdMapTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::map<" #_Key "," #_Tp "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MAP, std::map< _Key, _Tp, _Compare, _Alloc >); map(const _Compare& other); #ifdef %swig_map_methods // Add swig/language extra methods %swig_map_methods(std::map< _Key, _Tp, _Compare, _Alloc >); #endif %std_map_methods(map); }; } swig-4.0.2/Lib/uffi/0000755000175000017500000000000013667507523014021 5ustar williamwilliamswig-4.0.2/Lib/uffi/uffi.swg0000644000175000017500000000621613667507523015501 0ustar williamwilliam/* Define a C preprocessor symbol that can be used in interface files to distinguish between the SWIG language modules. */ #define SWIG_UFFI /* Typespecs for basic types. */ %typemap(ffitype) char ":char"; %typemap(ffitype) unsigned char ":unsigned-char"; %typemap(ffitype) signed char ":char"; %typemap(ffitype) short ":short"; %typemap(ffitype) signed short ":short"; %typemap(ffitype) unsigned short ":unsigned-short"; %typemap(ffitype) int ":int"; %typemap(ffitype) signed int ":int"; %typemap(ffitype) unsigned int ":unsigned-int"; %typemap(ffitype) long ":long"; %typemap(ffitype) signed long ":long"; %typemap(ffitype) unsigned long ":unsigned-long"; %typemap(ffitype) float ":float"; %typemap(ffitype) double ":double"; %typemap(ffitype) char * ":cstring"; %typemap(ffitype) void * ":pointer-void"; %typemap(ffitype) void ":void"; // FIXME: This is guesswork typedef long size_t; %wrapper %{ (eval-when (compile eval) ;;; You can define your own identifier converter if you want. ;;; Use the -identifier-converter command line argument to ;;; specify its name. (defun identifier-convert-null (id &key type) (declare (ignore type)) (read-from-string id)) (defun identifier-convert-lispify (cname &key type) (assert (stringp cname)) (if (eq type :constant) (setf cname (format nil "*~A*" cname))) (setf cname (replace-regexp cname "_" "-")) (let ((lastcase :other) newcase char res) (dotimes (n (length cname)) (setf char (schar cname n)) (if* (alpha-char-p char) then (setf newcase (if (upper-case-p char) :upper :lower)) (when (or (and (eq lastcase :upper) (eq newcase :lower)) (and (eq lastcase :lower) (eq newcase :upper))) ;; case change... add a dash (push #\- res) (setf newcase :other)) (push (char-downcase char) res) (setf lastcase newcase) else (push char res) (setf lastcase :other))) (read-from-string (coerce (nreverse res) 'string)))) (defun identifier-convert-low-level (cname &key type) (assert (stringp cname)) (if (eq type :constant) (setf cname (format nil "+~A+" cname))) (setf cname (substitute #\- #\_ cname)) (if (eq type :operator) (setf cname (format nil "%~A" cname))) (if (eq type :constant-function) nil) (read-from-string cname)) (defmacro swig-defconstant (string value &key (export T)) (let ((symbol (funcall *swig-identifier-converter* string :type :constant))) `(eval-when (compile load eval) (uffi:def-constant ,symbol ,value ,export)))) (defmacro swig-defun (name &rest rest) (let ((symbol (funcall *swig-identifier-converter* name :type :operator))) `(eval-when (compile load eval) (uffi:def-function (,name ,symbol) ,@rest) (export (quote ,symbol))))) (defmacro swig-def-struct (name &rest fields) "Declare a struct object" (let ((symbol (funcall *swig-identifier-converter* name :type :type))) `(eval-when (compile load eval) (uffi:def-struct ,symbol ,@fields) (export (quote ,symbol))))) ) ;; eval-when %} swig-4.0.2/Lib/cffi/0000755000175000017500000000000013667507523013777 5ustar williamwilliamswig-4.0.2/Lib/cffi/cffi.swg0000644000175000017500000002323413667507523015434 0ustar williamwilliam/* Define a C preprocessor symbol that can be used in interface files to distinguish between the SWIG language modules. */ #define SWIG_CFFI /* Typespecs for basic types. */ %typemap(cin) void ":void"; %typemap(cin) char ":char"; %typemap(cin) char * ":string"; %typemap(cin) unsigned char ":unsigned-char"; %typemap(cin) signed char ":char"; %typemap(cin) short ":short"; %typemap(cin) signed short ":short"; %typemap(cin) unsigned short ":unsigned-short"; %typemap(cin) int ":int"; %typemap(cin) signed int ":int"; %typemap(cin) unsigned int ":unsigned-int"; %typemap(cin) long ":long"; %typemap(cin) signed long ":long"; %typemap(cin) unsigned long ":unsigned-long"; %typemap(cin) long long ":long-long"; %typemap(cin) signed long long ":long-long"; %typemap(cin) unsigned long long ":unsigned-long-long"; %typemap(cin) float ":float"; %typemap(cin) double ":double"; %typemap(cin) SWIGTYPE ":pointer"; %typemap(cout) void ":void"; %typemap(cout) char ":char"; %typemap(cout) char * ":string"; %typemap(cout) unsigned char ":unsigned-char"; %typemap(cout) signed char ":char"; %typemap(cout) short ":short"; %typemap(cout) signed short ":short"; %typemap(cout) unsigned short ":unsigned-short"; %typemap(cout) int ":int"; %typemap(cout) signed int ":int"; %typemap(cout) unsigned int ":unsigned-int"; %typemap(cout) long ":long"; %typemap(cout) signed long ":long"; %typemap(cout) unsigned long ":unsigned-long"; %typemap(cout) long long ":long-long"; %typemap(cout) signed long long ":long-long"; %typemap(cout) unsigned long long ":unsigned-long-long"; %typemap(cout) float ":float"; %typemap(cout) double ":double"; %typemap(cout) SWIGTYPE ":pointer"; %typemap(ctype) bool "int"; %typemap(ctype) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$1_ltype"; %typemap(ctype) SWIGTYPE "$&1_type"; %typemap(in) bool "$1 = (bool)$input;"; %typemap(in) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$1 = $input;"; %typemap(in) SWIGTYPE "$1 = *$input;"; %typemap(out) void ""; %typemap(out) bool "$result = (int)$1;"; %typemap(out) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$result = $1;"; #ifdef __cplusplus %typemap(out) SWIGTYPE "$result = new $1_type($1);"; #else %typemap(out) SWIGTYPE { $result = ($&1_ltype) malloc(sizeof($1_type)); memmove($result, &$1, sizeof($1_type)); } #endif %typecheck(SWIG_TYPECHECK_BOOL) bool { $1 = 1; }; %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = 1; }; %typecheck(SWIG_TYPECHECK_FLOAT) float { $1 = 1; }; %typecheck(SWIG_TYPECHECK_DOUBLE) double { $1 = 1; }; %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = 1; }; %typecheck(SWIG_TYPECHECK_INTEGER) unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, enum SWIGTYPE { $1 = 1; }; %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE[ANY], SWIGTYPE { $1 = 1; }; /* This maps C/C++ types to Lisp classes for overload dispatch */ %typemap(lisptype) bool "cl:boolean"; %typemap(lisptype) char "cl:character"; %typemap(lisptype) unsigned char "cl:integer"; %typemap(lisptype) signed char "cl:integer"; %typemap(lispclass) bool "t"; %typemap(lispclass) char "cl:character"; %typemap(lispclass) unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, enum SWIGTYPE "cl:integer"; /* CLOS methods can't be specialized on single-float or double-float */ %typemap(lispclass) float "cl:number"; %typemap(lispclass) double "cl:number"; %typemap(lispclass) char * "cl:string"; /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } %{ #ifdef __cplusplus # define EXTERN extern "C" #else # define EXTERN extern #endif #define EXPORT EXTERN SWIGEXPORT #include %} %insert("swiglisp") %{ ;;;SWIG wrapper code starts here (cl:defmacro defanonenum (cl:&body enums) "Converts anonymous enums to defconstants." `(cl:progn ,@(cl:loop for value in enums for index = 0 then (cl:1+ index) when (cl:listp value) do (cl:setf index (cl:second value) value (cl:first value)) collect `(cl:defconstant ,value ,index)))) (cl:eval-when (:compile-toplevel :load-toplevel) (cl:unless (cl:fboundp 'swig-lispify) (cl:defun swig-lispify (name flag cl:&optional (package cl:*package*)) (cl:labels ((helper (lst last rest cl:&aux (c (cl:car lst))) (cl:cond ((cl:null lst) rest) ((cl:upper-case-p c) (helper (cl:cdr lst) 'upper (cl:case last ((lower digit) (cl:list* c #\- rest)) (cl:t (cl:cons c rest))))) ((cl:lower-case-p c) (helper (cl:cdr lst) 'lower (cl:cons (cl:char-upcase c) rest))) ((cl:digit-char-p c) (helper (cl:cdr lst) 'digit (cl:case last ((upper lower) (cl:list* c #\- rest)) (cl:t (cl:cons c rest))))) ((cl:char-equal c #\_) (helper (cl:cdr lst) '_ (cl:cons #\- rest))) (cl:t (cl:error "Invalid character: ~A" c))))) (cl:let ((fix (cl:case flag ((constant enumvalue) "+") (variable "*") (cl:t "")))) (cl:intern (cl:concatenate 'cl:string fix (cl:nreverse (helper (cl:concatenate 'cl:list name) cl:nil cl:nil)) fix) package)))))) ;;;SWIG wrapper code ends here %} #ifdef __cplusplus %typemap(out) SWIGTYPE "$result = new $1_type($1);"; #else %typemap(out) SWIGTYPE { $result = ($&1_ltype) malloc(sizeof($1_type)); memmove($result, &$1, sizeof($1_type)); } #endif ////////////////////////////////////////////////////////////// /* name conversion for overloaded operators. */ #ifdef __cplusplus %rename(__add__) *::operator+; %rename(__pos__) *::operator+(); %rename(__pos__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-() const; %rename(__neg__) *::operator-(); %rename(__mul__) *::operator*; %rename(__deref__) *::operator*(); %rename(__deref__) *::operator*() const; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__logxor__) *::operator^; %rename(__logand__) *::operator&; %rename(__logior__) *::operator|; %rename(__lognot__) *::operator~(); %rename(__lognot__) *::operator~() const; %rename(__not__) *::operator!(); %rename(__not__) *::operator!() const; %rename(__assign__) *::operator=; %rename(__add_assign__) *::operator+=; %rename(__sub_assign__) *::operator-=; %rename(__mul_assign__) *::operator*=; %rename(__div_assign__) *::operator/=; %rename(__mod_assign__) *::operator%=; %rename(__logxor_assign__) *::operator^=; %rename(__logand_assign__) *::operator&=; %rename(__logior_assign__) *::operator|=; %rename(__lshift__) *::operator<<; %rename(__lshift_assign__) *::operator<<=; %rename(__rshift__) *::operator>>; %rename(__rshift_assign__) *::operator>>=; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; %rename(__lt__) *::operator<; %rename(__gt__) *::operator>; %rename(__lte__) *::operator<=; %rename(__gte__) *::operator>=; %rename(__and__) *::operator&&; %rename(__or__) *::operator||; %rename(__preincr__) *::operator++(); %rename(__postincr__) *::operator++(int); %rename(__predecr__) *::operator--(); %rename(__postdecr__) *::operator--(int); %rename(__comma__) *::operator,(); %rename(__comma__) *::operator,() const; %rename(__member_ref__) *::operator->; %rename(__member_func_ref__) *::operator->*; %rename(__funcall__) *::operator(); %rename(__aref__) *::operator[]; #endif %{ #ifdef __cplusplus # define EXTERN extern "C" #else # define EXTERN extern #endif #define EXPORT EXTERN SWIGEXPORT #include #include %} swig-4.0.2/Lib/r/0000755000175000017500000000000013667507523013331 5ustar williamwilliamswig-4.0.2/Lib/r/std_deque.i0000644000175000017500000000003113667507523015452 0ustar williamwilliam%includeswig-4.0.2/Lib/r/rtype.swg0000644000175000017500000002027013667507523015217 0ustar williamwilliam /* These map the primitive C types to the appropriate R type for use in class representations. */ %typemap("rtype") int, int *, int & "integer"; %typemap("rtype") long, long *, long & "integer"; %typemap("rtype") float, float*, float & "numeric"; %typemap("rtype") double, double*, double & "numeric"; %typemap("rtype") char *, char ** "character"; %typemap("rtype") char "character"; %typemap("rtype") string, string *, string & "character"; %typemap("rtype") std::string, std::string *, std::string & "character"; %typemap("rtype") bool, bool * "logical"; %typemap("rtype") enum SWIGTYPE "character"; %typemap("rtype") enum SWIGTYPE * "character"; %typemap("rtype") enum SWIGTYPE *const "character"; %typemap("rtype") enum SWIGTYPE & "character"; %typemap("rtype") const enum SWIGTYPE & "character"; %typemap("rtype") enum SWIGTYPE && "character"; %typemap("rtype") SWIGTYPE * "$R_class"; %typemap("rtype") SWIGTYPE *const "$R_class"; %typemap("rtype") SWIGTYPE & "$R_class"; %typemap("rtype") SWIGTYPE && "$R_class"; %typemap("rtype") SWIGTYPE "$&R_class"; %typemap("rtypecheck") int, int &, long, long & %{ (is.integer($arg) || is.numeric($arg)) && length($arg) == 1 %} %typemap("rtypecheck") int *, long * %{ is.integer($arg) || is.numeric($arg) %} %typemap("rtypecheck") float, double %{ is.numeric($arg) && length($arg) == 1 %} %typemap("rtypecheck") float *, double * %{ is.numeric($arg) %} %typemap("rtypecheck") bool, bool & %{ is.logical($arg) && length($arg) == 1 %} %typemap("rtypecheck") bool * %{ is.logical($arg) %} /* Set up type checks to insure overloading precedence. We would like non pointer items to shadow pointer items, so that they get called if length = 1 */ %typecheck(SWIG_TYPECHECK_BOOL) bool {} %typecheck(SWIG_TYPECHECK_UINT32) unsigned int {} %typecheck(SWIG_TYPECHECK_INTEGER) int {} %typecheck(SWIG_TYPECHECK_FLOAT) float {} %typecheck(SWIG_TYPECHECK_DOUBLE) double {} %typecheck(SWIG_TYPECHECK_BOOL_PTR) bool * {} %typecheck(SWIG_TYPECHECK_INT32_PTR) int * {} %typecheck(SWIG_TYPECHECK_FLOAT_PTR) float * {} %typecheck(SWIG_TYPECHECK_DOUBLE_PTR) double * {} %typecheck(SWIG_TYPECHECK_CHAR_PTR) char * {} %typecheck(SWIG_TYPECHECK_INT32_ARRAY) int[ANY] {} %typecheck(SWIG_TYPECHECK_FLOAT_ARRAY) float[ANY] {} %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY) double [ANY] {} /* Have to be careful that as(x, "numeric") is different from as.numeric(x). The latter makes a REALSXP, whereas the former leaves an INTSXP as an INTSXP. */ /* Force coercion of integer, since by default R sets all constants to numeric, which means that you can't directly call a function with an integer using an R numercal literal */ %typemap(scoercein) int, int *, int & %{ $input = as.integer($input); %} %typemap(scoercein) long, long *, long & %{ $input = as.integer($input); %} %typemap(scoercein) float, float*, float &, double, double *, double & %{ %} %typemap(scoercein) char, char *, char & %{ $input = as($input, "character"); %} %typemap(scoercein) string, string *, string & %{ $input = as($input, "character"); %} %typemap(scoercein) std::string, std::string *, std::string & %{ $input = as($input, "character"); %} %typemap(scoercein) enum SWIGTYPE %{ $input = enumToInteger($input, "$R_class"); %} %typemap(scoercein) enum SWIGTYPE & %{ $input = enumToInteger($input, "$*R_class"); %} %typemap(scoercein) enum SWIGTYPE * %{ $input = enumToInteger($input, "$R_class"); %} %typemap(scoercein) enum SWIGTYPE *const %{ $input = enumToInteger($input, "$R_class"); %} %typemap(scoercein) SWIGTYPE, SWIGTYPE *, SWIGTYPE *const, SWIGTYPE &, SWIGTYPE && %{ if (inherits($input, "ExternalReference")) $input = slot($input,"ref"); %} /* %typemap(scoercein) SWIGTYPE *, SWIGTYPE *const %{ $input = coerceIfNotSubclass($input, "$R_class"); %} %typemap(scoercein) SWIGTYPE & %{ $input = coerceIfNotSubclass($input, "$R_class"); %} %typemap(scoercein) SWIGTYPE && %{ $input = coerceIfNotSubclass($input, "$R_class"); %} %typemap(scoercein) SWIGTYPE %{ $input = coerceIfNotSubclass($input, "$&R_class"); %} */ %typemap(scoercein) SWIGTYPE[ANY] %{ if(is.list($input)) assert(all(sapply($input, class) == "$R_class")); %} /* **************************************************************** */ %typemap(scoercein) bool, bool *, bool & "$input = as.logical($input);"; %typemap(scoercein) int, int *, int &, long, long *, long & "$input = as.integer($input);"; %typemap(scoercein) char *, string, std::string, string &, std::string & %{ $input = as($input, "character"); %} %typemap(scoerceout) enum SWIGTYPE %{ $result = enumFromInteger($result, "$R_class"); %} %typemap(scoerceout) enum SWIGTYPE & %{ $result = enumFromInteger($result, "$*R_class"); %} %typemap(scoerceout) enum SWIGTYPE && %{ $result = enumFromInteger($result, "$R_class"); %} %typemap(scoerceout) enum SWIGTYPE * %{ $result = enumToInteger($result, "$R_class"); %} %typemap(scoerceout) enum SWIGTYPE *const %{ $result = enumToInteger($result, "$R_class"); %} %typemap(scoerceout) SEXP %{ %} %typemap(scoerceout) SWIGTYPE %{ $result <- if (is.null($result)) $result else new("$&R_class", ref=$result); %} %typemap(scoerceout) SWIGTYPE & %{ $result <- if (is.null($result)) $result else new("$R_class", ref=$result); %} %typemap(scoerceout) SWIGTYPE && %{ $result <- if (is.null($result)) $result else new("$R_class", ref=$result); %} %typemap(scoerceout) SWIGTYPE * %{ $result <- if (is.null($result)) $result else new("$R_class", ref=$result); %} %typemap(scoerceout) SWIGTYPE *const %{ $result <- if (is.null($result)) $result else new("$R_class", ref=$result); %} /* Override the SWIGTYPE * above. */ %typemap(scoerceout) char, char *, char &, float, double, float*, double*, float &, double &, int, int &, long, long &, bool, bool &, string, std::string, string &, std::string &, void, signed int, signed int &, unsigned int, unsigned int &, short, short &, unsigned short, unsigned short &, long long, signed long long, signed long long &, unsigned long long, unsigned long long &, signed long, signed long &, unsigned long, unsigned long &, signed char, signed char &, unsigned char, unsigned char & %{ %} %apply int {size_t, std::size_t, ptrdiff_t, std::ptrdiff_t, signed int, unsigned int, short, unsigned short, signed char, unsigned char} %apply int* {size_t[], std::size_t[], ptrdiff_t[], std::ptrdiff_t[], signed int[], unsigned int[], short[], unsigned short[], signed char[], unsigned char[]} %apply int* {size_t[ANY], std::size_t[ANY], ptrdiff_t[ANY], std::ptrdiff_t[ANY], signed int[ANY], unsigned int[ANY], short[ANY], unsigned short[ANY], signed char[ANY], unsigned char[ANY]} %apply int* {size_t*, std::size_t*, ptrdiff_t*, std::ptrdiff_t*, signed int*, unsigned int*, short*, unsigned short*, signed char*, unsigned char*} %apply long { long long, signed long long, unsigned long long, signed long, unsigned long} %apply long* { long long*, signed long long*, unsigned long long*, signed long*, unsigned long*, long long[], signed long long[], unsigned long long[], signed long[], unsigned long[], long long[ANY], signed long long[ANY], unsigned long long[ANY], signed long[ANY], unsigned long[ANY]} %apply float* { float[], float[ANY] } %apply double * { double[], double[ANY] } %apply bool* { bool[], bool[ANY] } #if 0 Just examining the values for a SWIGTYPE. %typemap(scoerceout) SWIGTYPE %{ name = $1_name type = $1_type ltype = $1_ltype mangle = $1_mangle descriptor = $1_descriptor pointer type = $*1_type pointer ltype = $*1_ltype pointer descriptor = $*1_descriptor basetype = $*_basetype %} #endif swig-4.0.2/Lib/r/srun.swg0000644000175000017500000000750513667507523015051 0ustar williamwilliam# srun.swg # # # This is the basic code that is needed at run time within R to # provide and define the relevant classes. It is included # automatically in the generated code by copying the contents of # srun.swg into the newly created binding code. # This could be provided as a separate run-time library but this # approach allows the code to be included directly into the # generated bindings and so removes the need to have and install an # additional library. We may however end up with multiple copies of # this and some confusion at run-time as to which class to use. This # is an issue when we use NAMESPACES as we may need to export certain # classes. ###################################################################### if(length(getClassDef("RSWIGStruct")) == 0) setClass("RSWIGStruct", representation("VIRTUAL")) if(length(getClassDef("ExternalReference")) == 0) # Should be virtual but this means it loses its slots currently #representation("VIRTUAL") setClass("ExternalReference", representation( ref = "externalptr")) if(length(getClassDef("NativeRoutinePointer")) == 0) setClass("NativeRoutinePointer", representation(parameterTypes = "character", returnType = "character", "VIRTUAL"), contains = "ExternalReference") if(length(getClassDef("CRoutinePointer")) == 0) setClass("CRoutinePointer", contains = "NativeRoutinePointer") if(length(getClassDef("EnumerationValue")) == 0) setClass("EnumerationValue", contains = "integer") if(!isGeneric("copyToR")) setGeneric("copyToR", function(value, obj = new(gsub("Ref$", "", class(value)))) standardGeneric("copyToR" )) setGeneric("delete", function(obj) standardGeneric("delete")) SWIG_createNewRef = function(className, ..., append = TRUE) { f = get(paste("new", className, sep = "_"), mode = "function") f(...) } if(!isGeneric("copyToC")) setGeneric("copyToC", function(value, obj = SWIG_createNewRef(class(value))) standardGeneric("copyToC" )) # defineEnumeration = function(name, .values, where = topenv(parent.frame()), suffix = "Value") { # Mirror the class definitions via the E analogous to .__C__ defName = paste(".__E__", name, sep = "") delayedAssign(defName, .values, assign.env = where) if(nchar(suffix)) name = paste(name, suffix, sep = "") setClass(name, contains = "EnumerationValue", where = where) } enumToInteger <- function(name,type) { if (is.character(name)) { ans <- as.integer(get(paste(".__E__", type, sep = ""))[name]) if (is.na(ans)) {warning("enum not found ", name, " ", type)} ans } } enumFromInteger = function(i,type) { itemlist <- get(paste(".__E__", type, sep="")) names(itemlist)[match(i, itemlist)] } coerceIfNotSubclass = function(obj, type) { if(!is(obj, type)) {as(obj, type)} else obj } setClass("SWIGArray", representation(dims = "integer"), contains = "ExternalReference") setMethod("length", "SWIGArray", function(x) x@dims[1]) defineEnumeration("SCopyReferences", .values = c( "FALSE" = 0, "TRUE" = 1, "DEEP" = 2)) assert = function(condition, message = "") { if(!condition) stop(message) TRUE } if(FALSE) { print.SWIGFunction = function(x, ...) { } } ####################################################################### R_SWIG_getCallbackFunctionStack = function() { # No PACKAGE argument as we don't know what the DLL is. .Call("R_SWIG_debug_getCallbackFunctionData") } R_SWIG_addCallbackFunctionStack = function(fun, userData = NULL) { # No PACKAGE argument as we don't know what the DLL is. .Call("R_SWIG_R_pushCallbackFunctionData", fun, userData) } ####################################################################### swig-4.0.2/Lib/r/std_shared_ptr.i0000644000175000017500000000010413667507523016503 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.2/Lib/r/std_vector.i0000644000175000017500000011365013667507523015665 0ustar williamwilliam// R specific swig components /* Vectors */ %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { // vectors of doubles template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(REALSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { NUMERIC_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of floats template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(REALSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { NUMERIC_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of unsigned 8bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 8bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of unsigned 16bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 16bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 32 bit unsigned int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 32bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 64 bit unsigned int #if defined(SWIGWORDSIZE64) template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 64 bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; #else template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 64 bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; #endif // vectors of bool template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(LGLSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { LOGICAL_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of strings template <> struct traits_from_ptr > > { static SEXP from (std::vector > *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(STRSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { CHARACTER_POINTER(result)[pos] = Rf_mkChar(((*val)[pos]).c_str()); } UNPROTECT(1); return(result); } }; // catch all that does everything with vectors template struct traits_from_ptr< std::vector< T > > { static SEXP from (std::vector< T > *val, int owner = 0) { return SWIG_R_NewPointerObj(val, type_info< std::vector< T > >(), owner); } }; ///////////////////////////////////////////////// template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); double *S = NUMERIC_POINTER(obj); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); double *S = NUMERIC_POINTER(obj); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; // 8 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; // 16 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; // 32 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; #if defined(SWIGWORDSIZE64) // 64 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; #else // 64 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; #endif template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, LGLSXP)); int *S = LOGICAL_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > > { static int asptr(SEXP obj, std::vector > **val) { std::vector > *p; // R character vectors are STRSXP containing CHARSXP // access a CHARSXP using STRING_ELT int sexpsz = Rf_length(obj); p = new std::vector >(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, STRSXP)); //SEXP *S = CHARACTER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { const char * thecstring = CHAR(STRING_ELT(coerced, pos)); (*p)[pos] = std::basic_string(thecstring); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; // catchall for R to vector conversion template struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; int res = SWIG_R_ConvertPtr(obj, (void**)&p, type_info< std::vector >(), 0); if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; // now for vectors of vectors. These will be represented as lists of vectors on the // catch all that does everything with vectors template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(INTSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { INTEGER_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(INTSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { INTEGER_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(REALSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { NUMERIC_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(REALSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { NUMERIC_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(LGLSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { LOGICAL_POINTER(VECTOR_ELT(result, pos))[vpos] = (val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template struct traits_from_ptr< std::vector < std::vector< T > > > { static SEXP from (std::vector < std::vector< T > > *val, int owner = 0) { return SWIG_R_NewPointerObj(val, type_info< std::vector < std::vector< T > > >(), owner); } }; ///////////////////////////////////////////////////////////////// // R side template <> struct traits_asptr < std::vector< std::vector > > { static int asptr(SEXP obj, std::vector< std::vector > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(INTEGER_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< int> > > { static int asptr(SEXP obj, std::vector< std::vector< int> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< int> > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(INTEGER_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< float> > > { static int asptr(SEXP obj, std::vector< std::vector< float> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< float> > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(NUMERIC_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< double> > > { static int asptr(SEXP obj, std::vector< std::vector< double> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< double> > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(NUMERIC_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< bool > > > { static int asptr(SEXP obj, std::vector< std::vector< bool> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< bool > > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(LOGICAL_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; // catchall template struct traits_asptr < std::vector< std::vector > > { static int asptr(SEXP obj, std::vector< std::vector > **val) { std::vector< std::vector > *p; Rprintf("vector of vectors - unsupported content\n"); int res = SWIG_R_ConvertPtr(obj, (void**)&p, type_info< std::vector< std::vector > > (), 0); if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %define %traits_type_name(Type...) %fragment(SWIG_Traits_frag(Type), "header", fragment="StdTraits",fragment="StdVectorTraits") { namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return #Type; } }; } } %enddef %include %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector) %traits_type_name(std::vector) %typemap("rtypecheck") std::vector, std::vector *, std::vector & %{ is.numeric($arg) %} %typemap("rtype") std::vector "numeric" %typemap("scoercein") std::vector, std::vector *, std::vector & "$input = as.numeric($input);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector) %traits_type_name(std::vector) // reuse these for float %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap("rtypecheck") std::vector, std::vector *, std::vector & %{ is.logical($arg) %} %typemap("rtype") std::vector "logical" %typemap("scoercein") std::vector , std::vector & "$input = as.logical($input);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap("rtypecheck") std::vector, std::vector *, std::vector & %{ is.integer($arg) || is.numeric($arg) %} %typemap("rtype") std::vector "integer" %typemap("scoercein") std::vector , std::vector *, std::vector & "$input = as.integer($input);"; // strings %typemap("rtype") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & "character" %typemap("rtypecheck") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & %{ is.character($arg) %} %typemap("scoercein") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & "$input = as.character($input);"; %typemap("scoerceout") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & %{ %} %apply std::vector< std::basic_string > { std::vector< std::string> }; // all the related integer vectors // signed %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #if defined(SWIGWORDSIZE64) %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #else %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #endif // unsigned %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #if defined(SWIGWORDSIZE64) %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #else %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #endif // These R side typemaps are common for integer types // but we can't use %apply as it will copy the C side ones too // Also note that we don't seem to be able to use types like // int_least8_t here. %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; #if defined(SWIGWORDSIZE64) %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; #else %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; #endif %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; #if defined(SWIGWORDSIZE64) %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; #else %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; #endif %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; #if defined(SWIGWORDSIZE64) %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; #else %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; #endif /////////////////////////////////////////////////////////////// %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.integer);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.integer);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.numeric);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.numeric);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.logical);"; // we don't want these to be given R classes as they // have already been turned into R vectors. %typemap(scoerceout) std::vector, std::vector*, std::vector&, std::vector , std::vector*, std::vector , std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, // vectors of vectors std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >&, std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >&, std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >&, std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >&, std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >& %{ %} #if defined(SWIGWORDSIZE64) %typemap(scoerceout) std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector& %{ %} #else %typemap(scoerceout) std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector& %{ %} #endif swig-4.0.2/Lib/r/std_alloc.i0000644000175000017500000000003213667507523015442 0ustar williamwilliam%include swig-4.0.2/Lib/r/std_container.i0000644000175000017500000000007113667507523016335 0ustar williamwilliam%include %include swig-4.0.2/Lib/r/ropers.swg0000644000175000017500000000165313667507523015372 0ustar williamwilliam#ifdef __cplusplus %rename(Equal) operator =; %rename(PlusEqual) operator +=; %rename(MinusEqual) operator -=; %rename(MultiplyEqual) operator *=; %rename(DivideEqual) operator /=; %rename(PercentEqual) operator %=; %rename(Plus) operator +; %rename(Minus) operator -; %rename(Multiply) operator *; %rename(Divide) operator /; %rename(Percent) operator %; %rename(Not) operator !; %rename(IndexIntoConst) operator[](unsigned idx) const; %rename(IndexInto) operator[](unsigned idx); %rename(Functor) operator (); %rename(EqualEqual) operator ==; %rename(NotEqual) operator !=; %rename(LessThan) operator <; %rename(LessThanEqual) operator <=; %rename(GreaterThan) operator >; %rename(GreaterThanEqual) operator >=; %rename(And) operator &&; %rename(Or) operator ||; %rename(PlusPlusPrefix) operator++(); %rename(PlusPlusPostfix) operator++(int); %rename(MinusMinusPrefix) operator--(); %rename(MinusMinusPostfix) operator--(int); #endif swig-4.0.2/Lib/r/std_common.i0000644000175000017500000000433613667507523015653 0ustar williamwilliam%include /* Generate the traits for a 'primitive' type, such as 'double', for which the SWIG_AsVal and SWIG_From methods are already defined. */ %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(SEXP obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static SEXP from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(SEXP obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static SEXP from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-4.0.2/Lib/r/std_except.i0000644000175000017500000000004313667507523015642 0ustar williamwilliam%include swig-4.0.2/Lib/r/typemaps.i0000644000175000017500000000004113667507523015340 0ustar williamwilliam%include swig-4.0.2/Lib/r/rkw.swg0000644000175000017500000000125213667507523014656 0ustar williamwilliam/* Warnings for R keywords, built-in names and bad names. */ #define RKW(x) %keywordwarn("'" `x` "' is a R keyword, renaming to '_" `x`"'", rename="_%s") `x` #define RSWIGKW(x) %keywordwarn("'" `x` "' is a SWIG R reserved parameter name, renaming to '_" `x`"'", rename="_%s") `x` /* Warnings for R reserved words taken from http://cran.r-project.org/doc/manuals/R-lang.html#Reserved-words */ RKW(if); RKW(else); RKW(repeat); RKW(while); RKW(function); RKW(for); RKW(in); RKW(next); RKW(break); RKW(TRUE); RKW(FALSE); RKW(NULL); RKW(Inf); RKW(NaN); RKW(NA); RKW(NA_integer_); RKW(NA_real_); RKW(NA_complex_); RKW(NA_character_); RSWIGKW(self); #undef RKW #undef RSWIGKW swig-4.0.2/Lib/r/rfragments.swg0000644000175000017500000001137013667507523016225 0ustar williamwilliam/* for raw pointers */ #define SWIG_ConvertPtr(oc, ptr, ty, flags) SWIG_R_ConvertPtr(oc, ptr, ty, flags) #define SWIG_ConvertFunctionPtr(oc, ptr, ty) SWIG_R_ConvertPtr(oc, ptr, ty, 0) #define SWIG_NewPointerObj(ptr, ty, flags) SWIG_R_NewPointerObj(ptr, ty, flags) #define SWIG_NewFunctionPtrObj(ptr, ty) SWIG_R_NewPointerObj(ptr, ty, 0) /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_R_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, ty) SWIG_R_NewPackedObj(ptr, sz, ty) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, ty, flags) SWIG_ConvertPtr(obj, pptr, ty, flags) #define SWIG_NewInstanceObj(ptr, ty, flags) SWIG_NewPointerObj(ptr, ty, flags) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_R_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, ty) SWIG_R_NewPackedObj(ptr, sz, ty) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_R_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_R_SetModule(pointer) %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE SEXP SWIG_From_dec(long)(long value) { return Rf_ScalarInteger((int)value); } } %fragment(SWIG_AsVal_frag(long),"header") { SWIGINTERNINLINE int SWIG_AsVal_dec(long)(SEXP obj, long *val) { if (val) *val = Rf_asInteger(obj); return SWIG_OK; } } %fragment(SWIG_From_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE SEXP SWIG_From_dec(long long)(long long value) { return Rf_ScalarInteger((int)value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE int SWIG_AsVal_dec(long long)(SEXP obj, long long *val) { if (val) *val = Rf_asInteger(obj); return SWIG_OK; } %#endif } %fragment(SWIG_From_frag(unsigned long),"header") { SWIGINTERNINLINE SEXP SWIG_From_dec(unsigned long)(unsigned long value) { return Rf_ScalarInteger((int)value); } } %fragment(SWIG_AsVal_frag(unsigned long),"header") { SWIGINTERNINLINE int SWIG_AsVal_dec(unsigned long)(SEXP obj, unsigned long *val) { if (val) *val = Rf_asInteger(obj); return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE SEXP SWIG_From_dec(unsigned long long)(unsigned long long value) { return Rf_ScalarInteger((int)value); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE int SWIG_AsVal_dec(unsigned long long)(SEXP obj, unsigned long long *val) { if (val) *val = Rf_asInteger(obj); return SWIG_OK; } %#endif } %fragment(SWIG_From_frag(double),"header") { SWIGINTERNINLINE SEXP SWIG_From_dec(double)(double value) { return Rf_ScalarReal(value); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERNINLINE int SWIG_AsVal_dec(double)(SEXP obj, double *val) { if (val) *val = Rf_asReal(obj); return SWIG_OK; } } %fragment("SWIG_AsCharPtrAndSize", "header") { SWIGINTERN int SWIG_AsCharPtrAndSize(SEXP obj, char** cptr, size_t* psize, int *alloc) { if (cptr && Rf_isString(obj)) { char *cstr = %const_cast(CHAR(STRING_ELT(obj, 0)), char *); int len = strlen(cstr); if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = %new_copy_array(cstr, len + 1, char); *alloc = SWIG_NEWOBJ; } else { *cptr = cstr; } } else { *cptr = %reinterpret_cast(malloc(len + 1), char *); *cptr = strcpy(*cptr, cstr); } if (psize) *psize = len + 1; return SWIG_OK; } return SWIG_TypeError; } } %fragment("SWIG_strdup","header") { SWIGINTERN char * SWIG_strdup(const char *str) { char *newstr = %reinterpret_cast(malloc(strlen(str) + 1), char *); return strcpy(newstr, str); } } //# This is modified from the R header files %fragment("SWIG_FromCharPtrAndSize","header") { SWIGINTERN SEXP SWIG_FromCharPtrAndSize(const char* carray, size_t size) { SEXP t, c; if (!carray) return R_NilValue; /* See R internals document 1.10. MkCharLen was introduced in 2.7.0. Use that instead of hand creating vector. Starting in 2.8.0 creating strings via vectors was deprecated in order to allow for use of CHARSXP caches. */ Rf_protect(t = Rf_allocVector(STRSXP, 1)); %#if R_VERSION >= R_Version(2,7,0) c = Rf_mkCharLen(carray, size); %#else c = Rf_allocVector(CHARSXP, size); strncpy((char *)CHAR(c), carray, size); %#endif SET_STRING_ELT(t, 0, c); Rf_unprotect(1); return t; } } swig-4.0.2/Lib/r/std_pair.i0000644000175000017500000000010413667507523015303 0ustar williamwilliam%fragment("StdPairTraits","header") %{ %} %include swig-4.0.2/Lib/r/rrun.swg0000644000175000017500000002375413667507523015054 0ustar williamwilliam/* Remove global namespace pollution */ #if !defined(SWIG_NO_R_NO_REMAP) # define R_NO_REMAP #endif #if !defined(SWIG_NO_STRICT_R_HEADERS) # define STRICT_R_HEADERS #endif #include #include #ifdef __cplusplus #include extern "C" { #endif /* for raw pointer */ #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_R_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_R_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_R_NewPointerObj(ptr, type, flags) #include #include #include #include #if R_VERSION >= R_Version(2,6,0) #define VMAXTYPE void * #else #define VMAXTYPE char * #endif /* Last error */ static int SWIG_lasterror_code = 0; static char SWIG_lasterror_msg[1024]; SWIGRUNTIME void SWIG_Error(int code, const char *format, ...) { va_list arg; SWIG_lasterror_code = code; va_start(arg, format); vsnprintf(SWIG_lasterror_msg, sizeof(SWIG_lasterror_msg), format, arg); va_end(arg); } SWIGRUNTIME const char *SWIG_ErrorType(int code) { switch (code) { case SWIG_MemoryError: return "SWIG:MemoryError"; case SWIG_IOError: return "SWIG:IOError"; case SWIG_RuntimeError: return "SWIG:RuntimeError"; case SWIG_IndexError: return "SWIG:IndexError"; case SWIG_TypeError: return "SWIG:TypeError"; case SWIG_DivisionByZero: return "SWIG:DivisionByZero"; case SWIG_OverflowError: return "SWIG:OverflowError"; case SWIG_SyntaxError: return "SWIG:SyntaxError"; case SWIG_ValueError: return "SWIG:ValueError"; case SWIG_SystemError: return "SWIG:SystemError"; case SWIG_AttributeError: return "SWIG:AttributeError"; } return "SWIG:UnknownError"; } #define SWIG_fail goto fail /* This is mainly a way to avoid having lots of local variables that may conflict with those in the routine. Change name to R_SWIG_Callb.... */ typedef struct RCallbackFunctionData { SEXP fun; SEXP userData; SEXP expr; SEXP retValue; int errorOccurred; SEXP el; /* Temporary pointer used in the construction of the expression to call the R function. */ struct RCallbackFunctionData *previous; /* Stack */ } RCallbackFunctionData; static RCallbackFunctionData *callbackFunctionDataStack; SWIGRUNTIME SEXP R_SWIG_debug_getCallbackFunctionData() { int n, i; SEXP ans; RCallbackFunctionData *p = callbackFunctionDataStack; n = 0; while(p) { n++; p = p->previous; } Rf_protect(ans = Rf_allocVector(VECSXP, n)); for(p = callbackFunctionDataStack, i = 0; i < n; p = p->previous, i++) SET_VECTOR_ELT(ans, i, p->fun); Rf_unprotect(1); return(ans); } SWIGRUNTIME RCallbackFunctionData * R_SWIG_pushCallbackFunctionData(SEXP fun, SEXP userData) { RCallbackFunctionData *el; el = (RCallbackFunctionData *) calloc(1, sizeof(RCallbackFunctionData)); el->fun = fun; el->userData = userData; el->previous = callbackFunctionDataStack; callbackFunctionDataStack = el; return(el); } SWIGRUNTIME SEXP R_SWIG_R_pushCallbackFunctionData(SEXP fun, SEXP userData) { R_SWIG_pushCallbackFunctionData(fun, userData); return R_NilValue; } SWIGRUNTIME RCallbackFunctionData * R_SWIG_getCallbackFunctionData() { if(!callbackFunctionDataStack) { Rf_error("Supposedly impossible error occurred in the SWIG callback mechanism." " No callback function data set."); } return callbackFunctionDataStack; } SWIGRUNTIME void R_SWIG_popCallbackFunctionData(int doFree) { RCallbackFunctionData *el = NULL; if(!callbackFunctionDataStack) return ; /* Error !!! */ el = callbackFunctionDataStack ; callbackFunctionDataStack = callbackFunctionDataStack->previous; if(doFree) free(el); } /* Interface to S function is(obj, type) which is to be used to determine if an external pointer inherits from the right class. Ideally, we would like to be able to do this without an explicit call to the is() function. When the S4 class system uses its own SEXP types, then we will hopefully be able to do this in the C code. Should we make the expression static and preserve it to avoid the overhead of allocating each time. */ SWIGRUNTIME int R_SWIG_checkInherits(SEXP obj, SEXP tag, const char *type) { SEXP e, val; int check_err = 0; Rf_protect(e = Rf_allocVector(LANGSXP, 3)); SETCAR(e, Rf_install("extends")); SETCAR(CDR(e), Rf_mkString(CHAR(PRINTNAME(tag)))); SETCAR(CDR(CDR(e)), Rf_mkString(type)); val = R_tryEval(e, R_GlobalEnv, &check_err); Rf_unprotect(1); if(check_err) return(0); return(LOGICAL(val)[0]); } SWIGRUNTIME void * R_SWIG_resolveExternalRef(SEXP arg, const char * const type, const char * const argName, Rboolean nullOk) { void *ptr; SEXP orig = arg; if(TYPEOF(arg) != EXTPTRSXP) arg = GET_SLOT(arg, Rf_mkString("ref")); if(TYPEOF(arg) != EXTPTRSXP) { Rf_error("argument %s must be an external pointer (from an ExternalReference)", argName); } ptr = R_ExternalPtrAddr(arg); if(ptr == NULL && nullOk == (Rboolean) FALSE) { Rf_error("the external pointer (of type %s) for argument %s has value NULL", argName, type); } if(type[0] && R_ExternalPtrTag(arg) != Rf_install(type) && strcmp(type, "voidRef") && !R_SWIG_checkInherits(orig, R_ExternalPtrTag(arg), type)) { Rf_error("the external pointer for argument %s has tag %s, not the expected value %s", argName, CHAR(PRINTNAME(R_ExternalPtrTag(arg))), type); } return(ptr); } SWIGRUNTIME void R_SWIG_ReferenceFinalizer(SEXP el) { void *ptr = R_SWIG_resolveExternalRef(el, "", "", (Rboolean) 1); fprintf(stderr, "In R_SWIG_ReferenceFinalizer for %p\n", ptr); Rf_PrintValue(el); if(ptr) { if(TYPEOF(el) != EXTPTRSXP) el = GET_SLOT(el, Rf_mkString("ref")); if(TYPEOF(el) == EXTPTRSXP) R_ClearExternalPtr(el); free(ptr); } return; } SWIGRUNTIME SEXP SWIG_MakePtr(void *ptr, const char *typeName, int flags) { SEXP external, r_obj; Rf_protect(external = R_MakeExternalPtr(ptr, Rf_install(typeName), R_NilValue)); Rf_protect(r_obj = NEW_OBJECT(MAKE_CLASS((char *) typeName))); if (flags & SWIG_POINTER_OWN) R_RegisterCFinalizer(external, R_SWIG_ReferenceFinalizer); r_obj = SET_SLOT(r_obj, Rf_mkString((char *) "ref"), external); SET_S4_OBJECT(r_obj); Rf_unprotect(2); return(r_obj); } SWIGRUNTIME SEXP R_SWIG_create_SWIG_R_Array(const char *typeName, SEXP ref, int len) { SEXP arr; /*XXX remove the char * cast when we can. MAKE_CLASS should be declared appropriately. */ Rf_protect(arr = NEW_OBJECT(MAKE_CLASS((char *) typeName))); Rf_protect(arr = R_do_slot_assign(arr, Rf_mkString("ref"), ref)); Rf_protect(arr = R_do_slot_assign(arr, Rf_mkString("dims"), Rf_ScalarInteger(len))); Rf_unprotect(3); SET_S4_OBJECT(arr); return arr; } #define ADD_OUTPUT_ARG(result, pos, value, name) r_ans = AddOutputArgToReturn(pos, value, name, OutputValues); SWIGRUNTIME SEXP AddOutputArgToReturn(int pos, SEXP value, const char *name, SEXP output) { SET_VECTOR_ELT(output, pos, value); return(output); } /* Create a new pointer object */ SWIGRUNTIMEINLINE SEXP SWIG_R_NewPointerObj(void *ptr, swig_type_info *type, int flags) { SEXP rptr; if (!ptr) { return R_NilValue; } rptr = R_MakeExternalPtr(ptr, R_MakeExternalPtr(type, R_NilValue, R_NilValue), R_NilValue); SET_S4_OBJECT(rptr); return rptr; } /* Convert a pointer value */ SWIGRUNTIMEINLINE int SWIG_R_ConvertPtr(SEXP obj, void **ptr, swig_type_info *ty, int flags) { void *vptr; if (!obj) return SWIG_ERROR; if (obj == R_NilValue) { if (ptr) *ptr = NULL; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } vptr = R_ExternalPtrAddr(obj); if (ty) { swig_type_info *to = (swig_type_info*) R_ExternalPtrAddr(R_ExternalPtrTag(obj)); if (to == ty) { if (ptr) *ptr = vptr; } else { swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); int newmemory = 0; if (ptr) *ptr = SWIG_TypeCast(tc,vptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } } else { if (ptr) *ptr = vptr; } return SWIG_OK; } SWIGRUNTIME swig_module_info * SWIG_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; return (swig_module_info *) type_pointer; } SWIGRUNTIME void SWIG_SetModule(void *v, swig_module_info *swig_module) { } typedef struct { void *pack; swig_type_info *ty; size_t size; } RSwigPacked; /* Create a new packed object */ SWIGRUNTIMEINLINE SEXP RSwigPacked_New(void *ptr, size_t sz, swig_type_info *ty) { SEXP rptr; RSwigPacked *sobj = (RSwigPacked*) malloc(sizeof(RSwigPacked)); if (sobj) { void *pack = malloc(sz); if (pack) { memcpy(pack, ptr, sz); sobj->pack = pack; sobj->ty = ty; sobj->size = sz; } else { sobj = 0; } } rptr = R_MakeExternalPtr(sobj, R_NilValue, R_NilValue); return rptr; } SWIGRUNTIME swig_type_info * RSwigPacked_UnpackData(SEXP obj, void *ptr, size_t size) { RSwigPacked *sobj = (RSwigPacked *)R_ExternalPtrAddr(obj); if (sobj->size != size) return 0; memcpy(ptr, sobj->pack, size); return sobj->ty; } SWIGRUNTIMEINLINE SEXP SWIG_R_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return ptr ? RSwigPacked_New((void *) ptr, sz, type) : R_NilValue; } /* Convert a packed pointer value */ SWIGRUNTIME int SWIG_R_ConvertPacked(SEXP obj, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = RSwigPacked_UnpackData(obj, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } #ifdef __cplusplus #define SWIG_exception_noreturn(code, msg) do { throw std::runtime_error(msg); } while(0) #else #define SWIG_exception_noreturn(code, msg) do { return result; } while(0) #endif #ifdef __cplusplus } #endif swig-4.0.2/Lib/r/stl.i0000644000175000017500000000041613667507523014306 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include swig-4.0.2/Lib/r/exception.i0000644000175000017500000000034113667507523015477 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(switch (code) {case SWIG_IndexError: return Rf_ScalarLogical(NA_LOGICAL); default: %error(code, msg); SWIG_fail;} )) } swig-4.0.2/Lib/r/std_list.i0000644000175000017500000000024713667507523015333 0ustar williamwilliam#define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/r/rstdcommon.swg0000644000175000017500000001172313667507523016244 0ustar williamwilliam%fragment("StdTraits","header",fragment="StdTraitsCommon") { namespace swig { /* Traits that provides the from method */ template struct traits_from_ptr { static SWIG_Object from(Type *val, int owner = 0) { return SWIG_NewPointerObj(val, type_info(), owner); } }; template struct traits_from { static SWIG_Object from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static SWIG_Object from(Type* val) { return traits_from_ptr::from(val, 0); } }; template inline SWIG_Object from(const Type& val) { return traits_from::from(val); } template inline SWIG_Object from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } /* Traits that provides the asval/as/check method */ template struct traits_asptr { static int asptr(SWIG_Object obj, Type **val) { Type *p = 0; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(SWIG_Object obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(SWIG_Object obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(SWIG_Object obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(SWIG_Object obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(SWIG_Object obj) { Type v; int res = asval(obj, &v); if (!obj || !SWIG_IsOK(res)) { throw std::invalid_argument("bad type"); } return v; } }; template struct traits_as { static Type as(SWIG_Object obj) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type* as(SWIG_Object obj, bool throw_error) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res)) { return v; } else { if (throw_error) throw std::invalid_argument("bad type"); return 0; } } }; template inline Type as(SWIG_Object obj) { return traits_as::category>::as(obj); } template struct traits_check { static bool check(SWIG_Object obj) { int res = obj ? asval(obj, (Type *)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(SWIG_Object obj) { int res = obj ? asptr(obj, (Type **)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template inline bool check(SWIG_Object obj) { return traits_check::category>::check(obj); } } } %define %specialize_std_container(Type,Check,As,From) %{ namespace swig { template <> struct traits_asval { typedef Type value_type; static int asval(SWIG_Object obj, value_type *val) { if (Check(obj)) { if (val) *val = As(obj); return SWIG_OK; } return SWIG_ERROR; } }; template <> struct traits_from { typedef Type value_type; static SWIG_Object from(const value_type& val) { return From(val); } }; template <> struct traits_check { static int check(SWIG_Object obj) { int res = Check(obj); return obj && res ? res : 0; } }; } %} %enddef swig-4.0.2/Lib/r/r.swg0000644000175000017500000001442213667507523014317 0ustar williamwilliam/* */ %insert("header") "swiglabels.swg" %insert("init") "swiginit.swg" %insert("runtime") "swigrun.swg" %insert("runtime") "swigerrors.swg" %insert("runtime") "rrun.swg" %init %{ SWIGEXPORT void SWIG_init(void) { %} %include #define %Rruntime %insert("s") #define SWIG_Object SEXP #define VOID_Object R_NilValue #define %append_output(obj) SET_VECTOR_ELT($result, $n, obj) %define %set_constant(name, obj) %begin_block SEXP _obj = obj; assign(name, _obj); %end_block %enddef %define %raise(obj,type,desc) return R_NilValue; %enddef %insert("sinit") "srun.swg" %insert("sinitroutine") %{ SWIG_init(); SWIG_InitializeModule(0); %} %include %typemap(in) (double *x, int len) %{ $1 = REAL(x); $2 = Rf_length(x); %} /* XXX Need to worry about inheritance, e.g. if B extends A and we are looking for an A[], then B elements are okay. */ %typemap(scheck) SWIGTYPE[ANY] %{ # assert(length($input) > $1_dim0) assert(all(sapply($input, class) == "$R_class")); %} %typemap(out) void ""; %typemap(in) int *, int[ANY], signed int *, signed int[ANY], unsigned int *, unsigned int[ANY], short *, short[ANY], signed short *, signed short[ANY], unsigned short *, unsigned short[ANY], long *, long[ANY], signed long *, signed long[ANY], unsigned long *, unsigned long[ANY], long long *, long long[ANY], signed long long *, signed long long[ANY], unsigned long long *, unsigned long long[ANY] { { int _rswigi; int _rswiglen = LENGTH($input); $1 = %static_cast(calloc(sizeof($1_basetype), _rswiglen), $1_ltype); for (_rswigi=0; _rswigi< _rswiglen; _rswigi++) { $1[_rswigi] = INTEGER($input)[_rswigi]; } } } %typemap(in) float *, float[ANY], double *, double[ANY] { { int _rswigi; int _rswiglen = LENGTH($input); $1 = %static_cast(calloc(sizeof($1_basetype), _rswiglen), $1_ltype); for (_rswigi=0; _rswigi<_rswiglen; _rswigi++) { $1[_rswigi] = REAL($input)[_rswigi]; } } } %typemap(freearg,noblock=1) int *, int[ANY], signed int *, signed int[ANY], unsigned int *, unsigned int[ANY], short *, short[ANY], signed short *, signed short[ANY], unsigned short *, unsigned short[ANY], long *, long[ANY], signed long *, signed long[ANY], unsigned long *, unsigned long[ANY], long long *, long long[ANY], signed long long *, signed long long[ANY], unsigned long long *, unsigned long long[ANY], float *, float[ANY], double *, double[ANY] %{ free($1); %} %typemap(freearg, noblock=1) int *OUTPUT, signed int *OUTPUT, unsigned int *OUTPUT, short *OUTPUT, signed short *OUTPUT, unsigned short *OUTPUT, long *OUTPUT, signed long *OUTPUT, unsigned long *OUTPUT, long long *OUTPUT, signed long long *OUTPUT, unsigned long long *OUTPUT, float *OUTPUT, double *OUTPUT, char *OUTPUT, signed char *OUTPUT, unsigned char *OUTPUT {} /* Should we recycle to make the length correct. And warn if length() > the dimension. */ %typemap(scheck) SWIGTYPE [ANY] %{ # assert(length($input) >= $1_dim0) %} /* Handling vector case to avoid warnings, although we just use the first one. */ %typemap(scheck) unsigned int %{ assert(length($input) == 1 && $input >= 0, "All values must be non-negative"); %} %typemap(scheck) int, long %{ if(length($input) > 1) { warning("using only the first element of $input"); }; %} %include %include %include %include %include %typemap(in,noblock=1) enum SWIGTYPE[ANY] { $1 = %reinterpret_cast(INTEGER($input), $1_ltype); } %typemap(in,noblock=1,fragment="SWIG_strdup") char * { $1 = %reinterpret_cast(SWIG_strdup(CHAR(STRING_ELT($input, 0))), $1_ltype); } %typemap(freearg,noblock=1) char * { free($1); } %typemap(in,noblock=1,fragment="SWIG_strdup") char *[ANY] { $1 = %reinterpret_cast(SWIG_strdup(CHAR(STRING_ELT($input, 0))), $1_ltype); } %typemap(freearg,noblock=1) char *[ANY] { free($1); } %typemap(in,noblock=1,fragment="SWIG_strdup") char[ANY] { $1 = SWIG_strdup(CHAR(STRING_ELT($input, 0))); } %typemap(freearg,noblock=1) char[ANY] { free($1); } %typemap(in,noblock=1,fragment="SWIG_strdup") char[] { $1 = SWIG_strdup(CHAR(STRING_ELT($input, 0))); } %typemap(freearg,noblock=1) char[] { free($1); } %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)INTEGER($input)[0]; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = Rf_ScalarInteger((int)*$1); %} %typemap(memberin) char[] %{ if ($input) strcpy($1, $input); else strcpy($1, ""); %} %typemap(globalin) char[] %{ if ($input) strcpy($1, $input); else strcpy($1, ""); %} %typemap(out,noblock=1) char * { $result = $1 ? Rf_mkString(%reinterpret_cast($1,char *)) : R_NilValue; } %typemap(in,noblock=1) char { $1 = %static_cast(CHAR(STRING_ELT($input, 0))[0],$1_ltype); } %typemap(out) char { char tmp[2] = "x"; tmp[0] = $1; $result = Rf_mkString(tmp); } %typemap(in,noblock=1) int, long { $1 = %static_cast(INTEGER($input)[0], $1_ltype); } %typemap(out,noblock=1) int, long "$result = Rf_ScalarInteger($1);"; %typemap(in,noblock=1) bool "$1 = LOGICAL($input)[0] ? true : false;"; %typemap(out,noblock=1) bool "$result = Rf_ScalarLogical($1);"; %typemap(in,noblock=1) float, double { $1 = %static_cast(REAL($input)[0], $1_ltype); } /* Why is this here ? */ /* %typemap(out,noblock=1) unsigned int * "$result = ScalarReal(*($1));"; */ %Rruntime %{ setMethod('[', "ExternalReference", function(x,i,j, ..., drop=TRUE) if (!is.null(x$"__getitem__")) sapply(i, function(n) x$"__getitem__"(i=as.integer(n-1)))) setMethod('[<-' , "ExternalReference", function(x,i,j, ..., value) if (!is.null(x$"__setitem__")) { sapply(1:length(i), function(n) x$"__setitem__"(i=as.integer(i[n]-1), x=value[n])) x }) setAs('ExternalReference', 'character', function(from) {if (!is.null(from$"__str__")) from$"__str__"()}) suppressMessages(suppressWarnings(setMethod('print', 'ExternalReference', function(x) {print(as(x, "character"))}))) %} swig-4.0.2/Lib/r/cdata.i0000644000175000017500000000003613667507523014556 0ustar williamwilliam%include swig-4.0.2/Lib/r/std_string.i0000644000175000017500000000004313667507523015660 0ustar williamwilliam%include swig-4.0.2/Lib/r/rcontainer.swg0000644000175000017500000001260013667507523016216 0ustar williamwilliam // // Common fragments // /**** The python container methods ****/ %fragment("StdSequenceTraits","header",fragment="") { %#include namespace swig { inline size_t check_index(ptrdiff_t i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } inline size_t slice_index(ptrdiff_t i, size_t size) { if ( i < 0 ) { if ((size_t) (-i) <= size) { return (size_t) (i + size); } else { throw std::out_of_range("index out of range"); } } else { return ( (size_t) i < size ) ? ((size_t) i) : size; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline Sequence* getslice(const Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::const_iterator vb = self->begin(); typename Sequence::const_iterator ve = self->begin(); std::advance(vb,ii); std::advance(ve,jj); return new Sequence(vb, ve); } else { return new Sequence(); } } template inline void setslice(Sequence* self, Difference i, Difference j, const InputSeq& v) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj < ii) jj = ii; size_t ssize = jj - ii; if (ssize <= v.size()) { typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator vmid = v.begin(); std::advance(sb,ii); std::advance(vmid, jj - ii); self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end()); } else { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); self->insert(sb, v.begin(), v.end()); } } template inline void delslice(Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); } } } } %define %swig_container_methods(Container...) %newobject __getslice__; %extend { bool __nonzero__() const { return !(self->empty()); } size_type __len__() const { return self->size(); } } %enddef %define %swig_sequence_methods_common(Sequence...) // %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) %fragment("StdSequenceTraits"); %extend { value_type pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty container"); Sequence::value_type x = self->back(); self->pop_back(); return x; } Sequence* __getslice__(difference_type i, difference_type j) throw (std::out_of_range) { return swig::getslice(self, i, j); } void __setslice__(difference_type i, difference_type j, const Sequence& v) throw (std::out_of_range, std::invalid_argument) { swig::setslice(self, i, j, v); } void __delslice__(difference_type i, difference_type j) throw (std::out_of_range) { swig::delslice(self, i, j); } void __delitem__(difference_type i) throw (std::out_of_range) { self->erase(swig::getpos(self,i)); } } %enddef %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %extend { const value_type& __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __setitem__(difference_type i, const value_type& x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } void append(const value_type& x) { self->push_back(x); } } %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %extend { value_type __getitem__(difference_type i) throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __setitem__(difference_type i, value_type x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } void append(value_type x) { self->push_back(x); } } %enddef swig-4.0.2/Lib/r/std_map.i0000644000175000017500000000010313667507523015124 0ustar williamwilliam%fragment("StdMapTraits","header") %{ %} %include swig-4.0.2/Lib/r/boost_shared_ptr.i0000644000175000017500000005160213667507523017050 0ustar williamwilliam%include // Set SHARED_PTR_DISOWN to $disown if required, for example // #define SHARED_PTR_DISOWN $disown #if !defined(SHARED_PTR_DISOWN) #define SHARED_PTR_DISOWN 0 #endif // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) CONST TYPE (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (!swig_argp) { %dirout_nullref("$type"); } else { $result = *(%reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } // plain pointer // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE * %{ #error "directorout typemap for plain pointer not implemented" %} // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE & %{ #error "directorout typemap for plain reference not implemented" %} // plain pointer by reference // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") TYPE *CONST& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) TYPE *CONST& %{ #error "directorout typemap for plain pointer by reference not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { int newmem = 0; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (swig_argp) { $result = *(%reinterpret_cast(swig_argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, $<ype); } } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "directorout typemap for shared_ptr ref not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "directorout typemap for pointer to shared_ptr not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "directorout typemap for pointer ref to shared_ptr not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *", noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.2/Lib/chicken/0000755000175000017500000000000013667507523014474 5ustar williamwilliamswig-4.0.2/Lib/chicken/extra-install.list0000644000175000017500000000010213667507523020151 0ustar williamwilliamswigclosprefix.scm multi-generic.scm tinyclos-multi-generic.patch swig-4.0.2/Lib/chicken/multi-generic.scm0000644000175000017500000001361413667507523017751 0ustar williamwilliam;; This file is no longer necessary with Chicken versions above 1.92 ;; ;; This file overrides two functions inside TinyCLOS to provide support ;; for multi-argument generics. There are many ways of linking this file ;; into your code... all that needs to happen is this file must be ;; executed after loading TinyCLOS but before any SWIG modules are loaded ;; ;; something like the following ;; (require 'tinyclos) ;; (load "multi-generic") ;; (declare (uses swigmod)) ;; ;; An alternative to loading this scheme code directly is to add a ;; (declare (unit multi-generic)) to the top of this file, and then ;; compile this into the final executable or something. Or compile ;; this into an extension. ;; Lastly, to override TinyCLOS method creation, two functions are ;; overridden: see the end of this file for which two are overridden. ;; You might want to remove those two lines and then exert more control over ;; which functions are used when. ;; Comments, bugs, suggestions: send either to chicken-users@nongnu.org or to ;; Most code copied from TinyCLOS (define (make 'name "multi-generic" 'direct-supers (list ) 'direct-slots '())) (letrec ([applicable? (lambda (c arg) (memq c (class-cpl (class-of arg))))] [more-specific? (lambda (c1 c2 arg) (memq c2 (memq c1 (class-cpl (class-of arg)))))] [filter-in (lambda (f l) (if (null? l) '() (let ([h (##sys#slot l 0)] [r (##sys#slot l 1)] ) (if (f h) (cons h (filter-in f r)) (filter-in f r) ) ) ) )]) (add-method compute-apply-generic (make-method (list ) (lambda (call-next-method generic) (lambda args (let ([cam (let ([x (compute-apply-methods generic)] [y ((compute-methods generic) args)] ) (lambda (args) (x y args)) ) ] ) (cam args) ) ) ) ) ) (add-method compute-methods (make-method (list ) (lambda (call-next-method generic) (lambda (args) (let ([applicable (filter-in (lambda (method) (let check-applicable ([list1 (method-specializers method)] [list2 args]) (cond ((null? list1) #t) ((null? list2) #f) (else (and (applicable? (##sys#slot list1 0) (##sys#slot list2 0)) (check-applicable (##sys#slot list1 1) (##sys#slot list2 1))))))) (generic-methods generic) ) ] ) (if (or (null? applicable) (null? (##sys#slot applicable 1))) applicable (let ([cmms (compute-method-more-specific? generic)]) (sort applicable (lambda (m1 m2) (cmms m1 m2 args))) ) ) ) ) ) ) ) (add-method compute-method-more-specific? (make-method (list ) (lambda (call-next-method generic) (lambda (m1 m2 args) (let loop ((specls1 (method-specializers m1)) (specls2 (method-specializers m2)) (args args)) (cond-expand [unsafe (let ((c1 (##sys#slot specls1 0)) (c2 (##sys#slot specls2 0)) (arg (##sys#slot args 0))) (if (eq? c1 c2) (loop (##sys#slot specls1 1) (##sys#slot specls2 1) (##sys#slot args 1)) (more-specific? c1 c2 arg))) ] [else (cond ((and (null? specls1) (null? specls2)) (##sys#error "two methods are equally specific" generic)) ;((or (null? specls1) (null? specls2)) ; (##sys#error "two methods have different number of specializers" generic)) ((null? specls1) #f) ((null? specls2) #t) ((null? args) (##sys#error "fewer arguments than specializers" generic)) (else (let ((c1 (##sys#slot specls1 0)) (c2 (##sys#slot specls2 0)) (arg (##sys#slot args 0))) (if (eq? c1 c2) (loop (##sys#slot specls1 1) (##sys#slot specls2 1) (##sys#slot args 1)) (more-specific? c1 c2 arg)))) ) ] ) ) ) ) ) ) ) ;; end of letrec (define multi-add-method (lambda (generic method) (slot-set! generic 'methods (let filter-in-method ([methods (slot-ref generic 'methods)]) (if (null? methods) (list method) (let ([l1 (length (method-specializers method))] [l2 (length (method-specializers (##sys#slot methods 0)))]) (cond ((> l1 l2) (cons (##sys#slot methods 0) (filter-in-method (##sys#slot methods 1)))) ((< l1 l2) (cons method methods)) (else (let check-method ([ms1 (method-specializers method)] [ms2 (method-specializers (##sys#slot methods 0))]) (cond ((and (null? ms1) (null? ms2)) (cons method (##sys#slot methods 1))) ;; skip the method already in the generic ((eq? (##sys#slot ms1 0) (##sys#slot ms2 0)) (check-method (##sys#slot ms1 1) (##sys#slot ms2 1))) (else (cons (##sys#slot methods 0) (filter-in-method (##sys#slot methods 1)))))))))))) (##sys#setslot (##sys#slot generic (- (##sys#size generic) 2)) 1 (compute-apply-generic generic)) )) (define (multi-add-global-method val sym specializers proc) (let ((generic (if (procedure? val) val (make 'name (##sys#symbol->string sym))))) (multi-add-method generic (make-method specializers proc)) generic)) ;; Might want to remove these, or perhaps do something like ;; (define old-add-method ##tinyclos#add-method) ;; and then you can switch between creating multi-generics and TinyCLOS generics. (set! ##tinyclos#add-method multi-add-method) (set! ##tinyclos#add-global-method multi-add-global-method) swig-4.0.2/Lib/chicken/typemaps.i0000644000175000017500000002700313667507523016512 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * * These mappings provide support for input/output arguments and * common uses for C/C++ pointers. INOUT mappings allow for C/C++ * pointer variables in addition to input/output arguments. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Scheme list. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); */ //---------------------------------------------------------------------- // // T_OUTPUT typemap (and helper function) to return multiple argouts as // a tuple instead of a list. // //---------------------------------------------------------------------- // Simple types %define INOUT_TYPEMAP(type_, from_scheme, to_scheme, checker, convtype, storage_) %typemap(in) type_ *INPUT($*1_ltype temp), type_ &INPUT($*1_ltype temp) %{ if (!checker ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'type_'"); } temp = ($*1_ltype) from_scheme ($input); $1 = &temp; %} %typemap(typecheck) type_ *INPUT = type_; %typemap(typecheck) type_ &INPUT = type_; %typemap(in, numinputs=0) type_ *OUTPUT($*1_ltype temp), type_ &OUTPUT($*1_ltype temp) " $1 = &temp;" #if "storage_" == "0" %typemap(argout) type_ *OUTPUT, type_ &OUTPUT %{ if ($1 == NULL) { swig_barf (SWIG_BARF1_ARGUMENT_NULL, "Argument #$argnum must be non-null"); } SWIG_APPEND_VALUE(to_scheme (convtype (*$1))); %} #else %typemap(argout) type_ *OUTPUT, type_ &OUTPUT %{ { C_word *known_space = C_alloc(storage_); if ($1 == NULL) { swig_barf (SWIG_BARF1_ARGUMENT_NULL, "Variable '$1' must be non-null"); } SWIG_APPEND_VALUE(to_scheme (&known_space, convtype (*$1))); } %} #endif %enddef INOUT_TYPEMAP(int, C_num_to_int, C_fix, C_swig_is_number, (int), 0); INOUT_TYPEMAP(enum SWIGTYPE, C_num_to_int, C_fix, C_swig_is_number, (int), 0); INOUT_TYPEMAP(short, C_num_to_int, C_fix, C_swig_is_number, (int), 0); INOUT_TYPEMAP(long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); INOUT_TYPEMAP(long long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); INOUT_TYPEMAP(unsigned int, C_num_to_unsigned_int, C_unsigned_int_to_num, C_swig_is_number, (int), C_SIZEOF_FLONUM); INOUT_TYPEMAP(unsigned short, C_num_to_unsigned_int, C_fix, C_swig_is_number, (unsigned int), 0); INOUT_TYPEMAP(unsigned long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); INOUT_TYPEMAP(unsigned long long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); INOUT_TYPEMAP(unsigned char, C_character_code, C_make_character, C_swig_is_char, (unsigned int), 0); INOUT_TYPEMAP(signed char, C_character_code, C_make_character, C_swig_is_char, (int), 0); INOUT_TYPEMAP(char, C_character_code, C_make_character, C_swig_is_char, (char), 0); INOUT_TYPEMAP(bool, C_truep, C_mk_bool, C_swig_is_bool, (bool), 0); INOUT_TYPEMAP(float, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); INOUT_TYPEMAP(double, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a CHICKEN tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); As well, you can wrap variables with : %include %apply double *INOUT { double *y }; extern double *y; Unlike C, this mapping does not directly modify the input value (since this makes no sense in CHICKEN). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a CHICKEN variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %typemap(in) int *INOUT = int *INPUT; %typemap(in) enum SWIGTYPE *INOUT = enum SWIGTYPE *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) char *INOUT = char *INPUT; %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) int &INOUT = int &INPUT; %typemap(in) enum SWIGTYPE &INOUT = enum SWIGTYPE &INPUT; %typemap(in) short &INOUT = short &INPUT; %typemap(in) long &INOUT = long &INPUT; %typemap(in) long long &INOUT = long long &INPUT; %typemap(in) unsigned &INOUT = unsigned &INPUT; %typemap(in) unsigned short &INOUT = unsigned short &INPUT; %typemap(in) unsigned long &INOUT = unsigned long &INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; %typemap(in) unsigned char &INOUT = unsigned char &INPUT; %typemap(in) char &INOUT = char &INPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(in) float &INOUT = float &INPUT; %typemap(in) double &INOUT = double &INPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) enum SWIGTYPE *INOUT = enum SWIGTYPE *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT = long *OUTPUT; %typemap(argout) long long *INOUT = long long *OUTPUT; %typemap(argout) unsigned *INOUT = unsigned *OUTPUT; %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT = double *OUTPUT; %typemap(argout) int &INOUT = int &OUTPUT; %typemap(argout) enum SWIGTYPE &INOUT = enum SWIGTYPE &OUTPUT; %typemap(argout) short &INOUT = short &OUTPUT; %typemap(argout) long &INOUT = long &OUTPUT; %typemap(argout) long long &INOUT = long long &OUTPUT; %typemap(argout) unsigned &INOUT = unsigned &OUTPUT; %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; %typemap(argout) char &INOUT = char &OUTPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; %typemap(argout) float &INOUT = float &OUTPUT; %typemap(argout) double &INOUT = double &OUTPUT; /* Overloading information */ %typemap(typecheck) double *INOUT = double; %typemap(typecheck) bool *INOUT = bool; %typemap(typecheck) char *INOUT = char; %typemap(typecheck) signed char *INOUT = signed char; %typemap(typecheck) unsigned char *INOUT = unsigned char; %typemap(typecheck) unsigned long *INOUT = unsigned long; %typemap(typecheck) unsigned long long *INOUT = unsigned long long; %typemap(typecheck) unsigned short *INOUT = unsigned short; %typemap(typecheck) unsigned int *INOUT = unsigned int; %typemap(typecheck) long *INOUT = long; %typemap(typecheck) long long *INOUT = long long; %typemap(typecheck) short *INOUT = short; %typemap(typecheck) int *INOUT = int; %typemap(typecheck) enum SWIGTYPE *INOUT = enum SWIGTYPE; %typemap(typecheck) float *INOUT = float; %typemap(typecheck) double &INOUT = double; %typemap(typecheck) bool &INOUT = bool; %typemap(typecheck) char &INOUT = char; %typemap(typecheck) signed char &INOUT = signed char; %typemap(typecheck) unsigned char &INOUT = unsigned char; %typemap(typecheck) unsigned long &INOUT = unsigned long; %typemap(typecheck) unsigned long long &INOUT = unsigned long long; %typemap(typecheck) unsigned short &INOUT = unsigned short; %typemap(typecheck) unsigned int &INOUT = unsigned int; %typemap(typecheck) long &INOUT = long; %typemap(typecheck) long long &INOUT = long long; %typemap(typecheck) short &INOUT = short; %typemap(typecheck) int &INOUT = int; %typemap(typecheck) enum SWIGTYPE &INOUT = enum SWIGTYPE; %typemap(typecheck) float &INOUT = float; swig-4.0.2/Lib/chicken/chickenrun.swg0000644000175000017500000002563613667507523017363 0ustar williamwilliam/* ----------------------------------------------------------------------------- * chickenrun.swg * ----------------------------------------------------------------------------- */ #include #include #include #include #include #if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__BORLANDC__) || defined(_WATCOM) # ifndef snprintf # define snprintf _snprintf # endif #endif #ifdef __cplusplus extern "C" { #endif #define SWIG_malloc(size) \ malloc(size) #define SWIG_free(mem) \ free(mem) #define SWIG_MakeString(c) \ SWIG_Chicken_MakeString(c) #define SWIG_ConvertPtr(s, result, type, flags) \ SWIG_Chicken_ConvertPtr(s, result, type, flags) #define SWIG_MustGetPtr(s, type, argnum, flags) \ SWIG_Chicken_MustGetPtr(s, type, argnum, flags) #define SWIG_NewPointerObj(ptr, type, owner) \ SWIG_Chicken_NewPointerObj((void*)ptr, type, owner, &known_space) #define swig_barf SWIG_Chicken_Barf #define SWIG_ThrowException(val) SWIG_Chicken_ThrowException(val) #define SWIG_contract_assert(expr, message) if (!(expr)) { \ SWIG_Chicken_Barf(SWIG_BARF1_CONTRACT_ASSERT, C_text(message)); } else /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Chicken_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Chicken_SetModule(pointer) #define C_swig_is_bool(x) C_truep (C_booleanp (x)) #define C_swig_is_char(x) C_truep (C_charp (x)) #define C_swig_is_fixnum(x) C_truep (C_fixnump (x)) #define C_swig_is_flonum(x) (C_truep (C_blockp (x)) && C_truep (C_flonump (x))) #define C_swig_is_string(x) (C_truep (C_blockp (x)) && C_truep (C_stringp (x))) #define C_swig_is_vector(x) (C_truep (C_blockp (x)) && C_truep (C_vectorp (x))) #define C_swig_is_list(x) (C_truep (C_i_listp (x))) #define C_swig_is_pair(x) (C_truep (C_blockp(x)) && C_truep (C_pairp(x))) #define C_swig_is_ptr(x) (C_truep (C_blockp (x)) && C_truep (C_pointerp (x))) #define C_swig_is_swigpointer(x) (C_truep (C_blockp(x)) && C_truep (C_swigpointerp(x))) #define C_swig_is_closurep(x) (C_truep (C_blockp(x)) && C_truep(C_closurep(x))) #define C_swig_is_number(x) (C_swig_is_fixnum(x) || C_swig_is_flonum(x)) #define C_swig_is_long(x) C_swig_is_number(x) #define C_swig_sizeof_closure(num) (num+1) #define SWIG_Chicken_SetupArgout { \ C_word *a = C_alloc(C_swig_sizeof_closure(2)); \ C_word *closure = a; \ *(a++)=C_CLOSURE_TYPE|2; \ *(a++)=(C_word)SWIG_Chicken_ApplyResults; \ *(a++)=continuation; \ continuation=(C_word)closure; \ } #define SWIG_APPEND_VALUE(obj) { \ C_word val = (C_word)(obj); \ if (val != C_SCHEME_UNDEFINED) { \ C_word *a = C_alloc(C_swig_sizeof_closure(3)); \ C_word *closure = a; \ *(a++)=C_CLOSURE_TYPE|3; \ *(a++)=(C_word)SWIG_Chicken_MultiResultBuild; \ *(a++)=(C_word)continuation; \ *(a++)=val; \ continuation=(C_word)closure; \ } } #define SWIG_Chicken_FindCreateProxy(func,obj) \ if (C_swig_is_swigpointer(obj)) { \ swig_type_info *t = (swig_type_info *) C_block_item(obj, 1); \ if (t && t->clientdata && ((swig_chicken_clientdata *)t->clientdata)->gc_proxy_create) { \ func = CHICKEN_gc_root_ref( ((swig_chicken_clientdata *)t->clientdata)->gc_proxy_create); \ } else { \ func = C_SCHEME_FALSE; \ } \ } else { \ func = C_SCHEME_FALSE; \ } enum { SWIG_BARF1_BAD_ARGUMENT_TYPE /* 1 arg */, SWIG_BARF1_ARGUMENT_NULL /* 1 arg */, SWIG_BARF1_CONTRACT_ASSERT /* 1 arg */, }; typedef C_word (*swig_chicken_destructor)(C_word,C_word,C_word,C_word); typedef struct swig_chicken_clientdata { void *gc_proxy_create; swig_chicken_destructor destroy; } swig_chicken_clientdata; static char * SWIG_Chicken_MakeString(C_word str) { char *ret; size_t l; l = C_header_size(str); ret = (char *) SWIG_malloc( (l + 1) * sizeof(char)); if (!ret) return NULL; memcpy(ret, C_c_string(str), l); ret[l] = '\0'; return ret; } static C_word SWIG_Chicken_LookupSymbol(char *name, C_SYMBOL_TABLE *stable) { C_word *a = C_alloc(C_SIZEOF_STRING (strlen (name))); C_word n = C_string2(&a, name); C_word sym = C_find_symbol(n, stable); if (C_truep(sym)) { return C_symbol_value(sym); } else { return C_SCHEME_FALSE; } } /* Just a helper function. Do not export it */ static void SWIG_Chicken_Panic (C_char *) C_noret; static void SWIG_Chicken_Panic (C_char *msg) { C_word *a = C_alloc (C_SIZEOF_STRING (strlen (msg))); C_word scmmsg = C_string2 (&a, msg); C_halt (scmmsg); exit (5); /* should never get here */ } static void SWIG_Chicken_Barf(int code, C_char *msg, ...) C_noret; static void SWIG_Chicken_Barf(int code, C_char *msg, ...) { char *errorhook = C_text("\003syserror-hook"); C_word *a = C_alloc (C_SIZEOF_STRING (strlen (errorhook))); C_word err = C_intern2 (&a, errorhook); int c = -1; int i, barfval; va_list v; C_temporary_stack = C_temporary_stack_bottom; err = C_block_item(err, 0); if(C_immediatep (err)) SWIG_Chicken_Panic (C_text ("`##sys#error-hook' is not defined")); switch (code) { case SWIG_BARF1_BAD_ARGUMENT_TYPE: barfval = C_BAD_ARGUMENT_TYPE_ERROR; c = 1; break; case SWIG_BARF1_ARGUMENT_NULL: barfval = C_BAD_ARGUMENT_TYPE_ERROR; c = 1; break; case SWIG_BARF1_CONTRACT_ASSERT: barfval = C_BAD_ARGUMENT_TYPE_ERROR; c = 1; break; default: SWIG_Chicken_Panic (C_text (msg)); }; if(c > 0 && !C_immediatep (err)) { C_save (C_fix (barfval)); i = c; if (i) { C_word *b = C_alloc (C_SIZEOF_STRING (strlen (msg))); C_word scmmsg = C_string2 (&b, msg); C_save (scmmsg); i--; } va_start (v, msg); while(i--) C_save (va_arg (v, C_word)); va_end (v); C_do_apply (c + 1, err, C_SCHEME_UNDEFINED); /* <- no continuation is passed: '##sys#error-hook' may not return! */ } else if (msg) { SWIG_Chicken_Panic (msg); } else { SWIG_Chicken_Panic (C_text ("unspecified panic")); } } static void SWIG_Chicken_ThrowException(C_word value) C_noret; static void SWIG_Chicken_ThrowException(C_word value) { char *aborthook = C_text("\003sysabort"); C_word *a = C_alloc(C_SIZEOF_STRING(strlen(aborthook))); C_word abort = C_intern2(&a, aborthook); abort = C_block_item(abort, 0); if (C_immediatep(abort)) SWIG_Chicken_Panic(C_text("`##sys#abort' is not defined")); C_save(value); C_do_apply(1, abort, C_SCHEME_UNDEFINED); } static void SWIG_Chicken_Finalizer(C_word argc, C_word closure, C_word continuation, C_word s) { swig_type_info *type; swig_chicken_clientdata *cdata; if (argc == 3 && s != C_SCHEME_FALSE && C_swig_is_swigpointer(s)) { type = (swig_type_info *) C_block_item(s, 1); if (type) { cdata = (swig_chicken_clientdata *) type->clientdata; if (cdata && cdata->destroy) { /* this will not return, but will continue correctly */ cdata->destroy(3,closure,continuation,s); } } } C_kontinue(continuation, C_SCHEME_UNDEFINED); } static C_word finalizer_obj[2] = {(C_word) (C_CLOSURE_TYPE|1), (C_word) SWIG_Chicken_Finalizer}; static C_word SWIG_Chicken_NewPointerObj(void *ptr, swig_type_info *type, int owner, C_word **data) { swig_chicken_clientdata *cdata = (swig_chicken_clientdata *) type->clientdata; if (ptr == NULL) return C_SCHEME_FALSE; else { C_word cptr = C_swigmpointer(data, ptr, type); /* add finalizer to object */ #ifndef SWIG_CHICKEN_NO_COLLECTION if (owner) C_do_register_finalizer(cptr, (C_word) finalizer_obj); #endif return cptr; } } /* Return 0 if successful. */ static int SWIG_Chicken_ConvertPtr(C_word s, void **result, swig_type_info *type, int flags) { swig_cast_info *cast; swig_type_info *from; if (s == C_SCHEME_FALSE) { *result = NULL; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } else if (C_swig_is_swigpointer(s)) { /* try and convert type */ from = (swig_type_info *) C_block_item(s, 1); if (!from) return 1; if (type) { cast = SWIG_TypeCheckStruct(from, type); if (cast) { int newmemory = 0; *result = SWIG_TypeCast(cast, (void *) C_block_item(s, 0), &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } else { return 1; } } else { *result = (void *) C_block_item(s, 0); } /* check if we are disowning this object */ if (flags & SWIG_POINTER_DISOWN) { C_do_unregister_finalizer(s); } } else { return 1; } return 0; } static SWIGINLINE void * SWIG_Chicken_MustGetPtr (C_word s, swig_type_info *type, int argnum, int flags) { void *result; char err_msg[256]; if (SWIG_Chicken_ConvertPtr(s, &result, type, flags)) { /* type mismatch */ snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", argnum, (type->str ? type->str : type->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } return result; } static char *chicken_runtimevar_name = "type_pointer" SWIG_TYPE_TABLE_NAME; static swig_module_info * SWIG_Chicken_GetModule(void *SWIGUNUSEDPARM(clientdata)) { swig_module_info *ret = 0; C_word sym; /* lookup the type pointer... it is stored in its own symbol table */ C_SYMBOL_TABLE *stable = C_find_symbol_table("swig_runtime_data" SWIG_RUNTIME_VERSION); if (stable != NULL) { sym = SWIG_Chicken_LookupSymbol(chicken_runtimevar_name, stable); if (C_truep(sym) && C_swig_is_ptr(sym)) { ret = (swig_module_info *) C_block_item(sym, 0); } } return ret; } static void SWIG_Chicken_SetModule(swig_module_info *module) { C_word *a; C_SYMBOL_TABLE *stable; C_word sym; C_word pointer; static C_word *space = 0; /* type pointer is stored in its own symbol table */ stable = C_find_symbol_table("swig_runtime_data" SWIG_RUNTIME_VERSION); if (stable == NULL) { stable = C_new_symbol_table("swig_runtime_data" SWIG_RUNTIME_VERSION, 16); } if (!space) { space = (C_word *) C_malloc((C_SIZEOF_POINTER + C_SIZEOF_INTERNED_SYMBOL(C_strlen(chicken_runtimevar_name))) * sizeof(C_word)); } a = space; pointer = C_mpointer(&a, (void *) module); sym = C_intern_in(&a, C_strlen(chicken_runtimevar_name), chicken_runtimevar_name, stable); C_set_block_item(sym, 0, pointer); } static C_word SWIG_Chicken_MultiResultBuild(C_word num, C_word closure, C_word lst) { C_word cont = C_block_item(closure,1); C_word obj = C_block_item(closure,2); C_word func; SWIG_Chicken_FindCreateProxy(func,obj); if (C_swig_is_closurep(func)) { ((C_proc4)(void *)C_block_item(func, 0))(4,func,cont,obj,lst); } else { C_word *a = C_alloc(C_SIZEOF_PAIR); C_kontinue(cont,C_pair(&a,obj,lst)); } return C_SCHEME_UNDEFINED; /* never reached */ } static C_word SWIG_Chicken_ApplyResults(C_word num, C_word closure, C_word result) { C_apply_values(3,C_SCHEME_UNDEFINED,C_block_item(closure,1),result); return C_SCHEME_UNDEFINED; /* never reached */ } #ifdef __cplusplus } #endif swig-4.0.2/Lib/chicken/chickenkw.swg0000644000175000017500000000124613667507523017167 0ustar williamwilliam#ifndef CHICKEN_CHICKENKW_SWG_ #define CHICKEN_CHICKENKW_SWG_ /* Warnings for certain CHICKEN keywords. From Section 7.1.1 of Revised^5 Report on the Algorithmic Language Scheme */ #define CHICKENKW(x) %namewarn("314: '" #x "' is a R^5RS syntatic keyword") #x CHICKENKW(else); CHICKENKW(=>); CHICKENKW(define); CHICKENKW(unquote); CHICKENKW(unquote-splicing); CHICKENKW(quote); CHICKENKW(lambda); CHICKENKW(if); CHICKENKW(set!); CHICKENKW(begin); CHICKENKW(cond); CHICKENKW(and); CHICKENKW(or); CHICKENKW(case); CHICKENKW(let); CHICKENKW(let*); CHICKENKW(letrec); CHICKENKW(do); CHICKENKW(delay); CHICKENKW(quasiquote); #undef CHICKENKW #endif //CHICKEN_CHICKENKW_SWG_ swig-4.0.2/Lib/chicken/chicken.swg0000644000175000017500000005514613667507523016635 0ustar williamwilliam/* ----------------------------------------------------------------------------- * chicken.swg * * CHICKEN configuration module. * ----------------------------------------------------------------------------- */ /* chicken.h has to appear first. */ %insert(runtime) %{ #include #include %} %insert(runtime) "swigrun.swg" // Common C API type-checking code %insert(runtime) "swigerrors.swg" // SWIG errors %insert(runtime) "chickenrun.swg" // CHICKEN run-time code /* ----------------------------------------------------------------------------- * standard typemaps * ----------------------------------------------------------------------------- */ /* CHICKEN: C ---------- fixnum: int, short, unsigned int, unsigned short, unsigned char, signed char char: char bool: bool flonum: float, double, long, long long, unsigned long, unsigned long long */ /* --- Primitive types --- */ %define SIMPLE_TYPEMAP(type_, from_scheme, to_scheme, checker, convtype, storage_) %typemap(in) type_ %{ if (!checker ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'type_'"); } $1 = ($1_ltype) from_scheme ($input); %} /* Const primitive references. Passed by value */ %typemap(in) const type_ & ($*1_ltype temp) %{ if (!checker ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'type_'"); } temp = ($*1_ltype) from_scheme ($input); $1 = &temp; %} /* --- Variable input --- */ %typemap(varin) type_ %{ if (!checker ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Cannot use '$1_ltype' for variable '$name' of type 'type_'"); } $1 = ($1_ltype) from_scheme ($input); %} #if "storage_" == "0" %typemap(out) type_ %{ $result = to_scheme (convtype ($1)); %} /* References to primitive types. Return by value */ %typemap(out) const type_ & %{ $result = to_scheme (convtype (*$1)); %} /* --- Variable output --- */ %typemap(varout) type_ %{ $result = to_scheme (convtype ($varname)); %} %typemap(throws) type_ %{ SWIG_Chicken_ThrowException(to_scheme ( convtype ($1))); %} #else %typemap(out) type_ %{ { C_word *space = C_alloc(storage_); $result = to_scheme (&space, convtype ($1)); } %} /* References to primitive types. Return by value */ %typemap(out) const type_ & %{ { C_word *space = C_alloc(storage_); $result = to_scheme (&space, convtype (*$1)); } %} /* --- Variable output --- */ %typemap(varout) type_ %{ { C_word *space = C_alloc(storage_); $result = to_scheme (&space, convtype ($varname)); } %} %typemap(throws) type_ %{ { C_word *space = C_alloc(storage_); SWIG_Chicken_ThrowException(to_scheme (&space, convtype ($1))); } %} #endif /* --- Constants --- */ %typemap(constcode) type_ "static const $1_type $result = $value;" %enddef SIMPLE_TYPEMAP(int, C_num_to_int, C_fix, C_swig_is_number, (int), 0); //SIMPLE_TYPEMAP(enum SWIGTYPE, C_unfix, C_fix, C_swig_is_fixnum, (int), 0); SIMPLE_TYPEMAP(short, C_num_to_int, C_fix, C_swig_is_number, (int), 0); SIMPLE_TYPEMAP(long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(long long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(unsigned int, C_num_to_unsigned_int, C_unsigned_int_to_num, C_swig_is_number, (unsigned int), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(unsigned short, C_num_to_unsigned_int, C_fix, C_swig_is_number, (unsigned int), 0); SIMPLE_TYPEMAP(unsigned long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(unsigned long long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(unsigned char, C_character_code, C_make_character, C_swig_is_char, (unsigned int), 0); SIMPLE_TYPEMAP(signed char, C_character_code, C_make_character, C_swig_is_char, (int), 0); SIMPLE_TYPEMAP(char, C_character_code, C_make_character, C_swig_is_char, (char), 0); SIMPLE_TYPEMAP(bool, C_truep, C_mk_bool, C_swig_is_bool, (bool), 0); SIMPLE_TYPEMAP(float, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(double, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); /* enum SWIGTYPE */ %apply int { enum SWIGTYPE }; %apply const int& { const enum SWIGTYPE& }; %apply const int& { const enum SWIGTYPE&& }; %typemap(varin) enum SWIGTYPE { if (!C_swig_is_fixnum($input) && sizeof(int) != sizeof($1)) { swig_barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, "enum variable '$name' can not be set"); } *((int *)(void *)&$1) = C_unfix($input); } /* --- Input arguments --- */ /* Strings */ %typemap(in) char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else { if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'char *'"); } $1 = ($ltype) SWIG_MakeString ($input); } } %typemap(freearg) char * "if ($1 != NULL) { free ($1); }" /* Pointers, references, and arrays */ %typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, $disown); } %typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE *DISOWN { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, SWIG_POINTER_DISOWN); } /* Void pointer. Accepts any kind of pointer */ %typemap(in) void * { $1 = ($1_ltype)SWIG_MustGetPtr($input, NULL, $argnum, 0); } %typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE * { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, SWIG_POINTER_DISOWN); } %typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE & { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE && { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE [] { SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, "Type error"); } %typemap(varin) SWIGTYPE [ANY] { void *temp; int ii; $1_basetype *b = 0; temp = SWIG_MustGetPtr($input, $1_descriptor, 1, 0); b = ($1_basetype *) $1; for (ii = 0; ii < $1_size; ii++) b[ii] = *(($1_basetype *) temp + ii); } %typemap(varin) void * { $1 = SWIG_MustGetPtr($input, NULL, 1, 0); } %typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); $result = SWIG_NewPointerObj($1, $descriptor, $owner); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); $result = SWIG_NewPointerObj($1, ty, $owner); } %typemap(varout) SWIGTYPE *, SWIGTYPE [] { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); $result = SWIG_NewPointerObj($varname, $descriptor, 0); } %typemap(varout) SWIGTYPE & { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); $result = SWIG_NewPointerObj((void *) &$varname, $1_descriptor, 0); } %typemap(varout) SWIGTYPE && { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); $result = SWIG_NewPointerObj((void *) &$varname, $1_descriptor, 0); } /* special typemaps for class pointers */ %typemap(in) SWIGTYPE (CLASS::*) { char err_msg[256]; if (C_swig_is_pair($input)) { /* try and convert pointer object */ void *result; if (!SWIG_ConvertPtr(C_block_item($input,1), &result, $descriptor, 0)) { C_word ptr = C_block_item($input,0); if (C_swig_is_string(ptr)) { SWIG_UnpackData(C_c_string(ptr), (void *) &$1, sizeof($type)); } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } %typemap(out) SWIGTYPE (CLASS::*) { size_t ptr_size = sizeof($type); C_word *known_space = C_alloc(C_SIZEOF_PAIR + C_SIZEOF_STRING(2*ptr_size) + C_SIZEOF_SWIG_POINTER); char *temp = (char *)malloc(2*ptr_size); C_word ptr = SWIG_NewPointerObj((void *) known_space, $descriptor, 0); SWIG_PackData(temp, (void *) &$1, ptr_size); $result = C_pair(&known_space, C_string(&known_space, 2*ptr_size, temp), ptr); free(temp); } %typemap(varin) SWIGTYPE (CLASS::*) { char err_msg[256]; if (C_swig_is_pair($input)) { /* try and convert pointer object */ void *result; if (!SWIG_ConvertPtr(C_block_item($input,1), &result, $descriptor, 0)) { C_word ptr = C_block_item($input,0); if (C_swig_is_string(ptr)) { SWIG_UnpackData(C_c_string(ptr), (void *) &$1, sizeof($type)); } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", 1, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", 1, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", 1, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } %typemap(varout) SWIGTYPE (CLASS::*) { size_t ptr_size = sizeof($type); C_word *known_space = C_alloc(C_SIZEOF_PAIR + C_SIZEOF_STRING(2*ptr_size) + C_SIZEOF_SWIG_POINTER); char *temp = (char *)malloc(2*ptr_size); C_word ptr = SWIG_NewPointerObj((void *) known_space, $descriptor, 0); SWIG_PackData(temp, (void *) &$varname, ptr_size); $result = C_pair(&known_space, C_string(&known_space, 2*ptr_size, temp), ptr); free(temp); } /* Pass-by-value */ %typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE($&1_ltype argp) { argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, $argnum, 0); $1 = *argp; } %typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE { $&1_ltype argp; argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, 1, 0); $1 = *argp; } %typemap(out) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); resultptr = new $1_ltype((const $1_ltype &) $1); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); } #else { $&1_ltype resultptr; C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); } #endif %typemap(varout) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); resultptr = new $1_ltype((const $1_ltype&) $1); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); } #else { $&1_ltype resultptr; C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); } #endif /* --- Output values --- */ /* Strings */ %typemap(out) char * { char *s = (char*) $1; if ($1 == NULL) { $result = C_SCHEME_FALSE; } else { int string_len = strlen ((char *) ($1)); C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); $result = C_string (&string_space, string_len, s); } } %typemap(varout) char * { char *s = (char*) $varname; if ($varname == NULL) { $result = C_SCHEME_FALSE; } else { int string_len = strlen ($varname); C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); $result = C_string (&string_space, string_len, s); } } %typemap(throws) char * { if ($1 == NULL) { SWIG_Chicken_ThrowException(C_SCHEME_FALSE); } else { int string_len = strlen($1); C_word *string_space = C_alloc(C_SIZEOF_STRING(string_len)); SWIG_Chicken_ThrowException(C_string(&string_space, string_len, (char *) $1)); } } /* Void */ %typemap(out) void %{ $result = C_SCHEME_UNDEFINED; %} /* Special typemap for character array return values */ %typemap(out) char [ANY], const char [ANY] %{ if ($1 == NULL) { $result = C_SCHEME_FALSE; } else { const int string_len = strlen ($1); C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); $result = C_string (&string_space, string_len, $1); } %} /* Primitive types--return by value */ /* --- Variable input --- */ /* A string */ #ifdef __cplusplus %typemap(varin) char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); int len = C_header_size ($input); if ($1) delete [] $1; $1 = ($type) new char[len+1]; strncpy((char*)$1, temp, len); ((char*)$1) [len] = 0; } } %typemap(varin,warning="451:Setting const char * variable may leak memory") const char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); int len = C_header_size ($input); $1 = ($type) new char[len+1]; strncpy((char*)$1,temp,len); ((char*)$1) [len] = 0; } } #else %typemap(varin) char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); int len = C_header_size ($input); if ($1) free((char*) $1); $1 = ($type) malloc(len+1); strncpy((char*)$1,temp,len); ((char*)$1) [len] = 0; } } %typemap(varin,warning="451:Setting const char * variable may leak memory") const char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); int len = C_header_size ($input); $1 = ($type) malloc(len+1); strncpy((char*)$1,temp,len); ((char*)$1) [len] = 0; } } #endif %typemap(varin) char [] { swig_barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, "C/C++ variable '$name' is read-only"); } /* Special case for string array variables */ %typemap(varin) char [ANY] { if ($input == C_SCHEME_FALSE) { memset($1,0,$1_dim0*sizeof(char)); } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); strncpy($1,temp,$1_dim0*sizeof(char)); } } /* --- Variable output --- */ /* Void */ %typemap(varout) void "$result = C_SCHEME_UNDEFINED;"; /* Special typemap for character array return values */ %typemap(varout) char [ANY], const char [ANY] %{ if ($varname == NULL) { $result = C_SCHEME_FALSE; } else { const int string_len = strlen ($varname); C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); $result = C_string (&string_space, string_len, (char *) $varname); } %} /* --- Constants --- */ %typemap(constcode) char * "static const char *$result = $value;" %typemap(constcode) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "static const void *$result = (void*) $value;" /* ------------------------------------------------------------ * String & length * ------------------------------------------------------------ */ %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { if ($input == C_SCHEME_FALSE) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Cannot use a null/#f string for a char*, int arguments"); } else if (C_swig_is_string ($input)) { $1 = ($1_ltype) C_c_string ($input); $2 = ($2_ltype) C_header_size ($input); } else { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'string'"); } } /* ------------------------------------------------------------ * CHICKEN types * ------------------------------------------------------------ */ %typemap(in) C_word "$1 = $input;"; %typemap(out) C_word "$result = $1;"; /* ------------------------------------------------------------ * Typechecking rules * ------------------------------------------------------------ */ %typecheck(SWIG_TYPECHECK_INTEGER) bool, const bool & { $1 = C_swig_is_bool ($input); } %typecheck(SWIG_TYPECHECK_INTEGER) int, short, unsigned int, unsigned short, signed char, unsigned char, const int &, const short &, const unsigned int &, const unsigned short &, enum SWIGTYPE { $1 = C_swig_is_fixnum ($input); } %typecheck(SWIG_TYPECHECK_INTEGER) long, unsigned long, long long, unsigned long long, const long &, const unsigned long &, const long long &, const unsigned long long & { $1 = (C_swig_is_bool ($input) || C_swig_is_fixnum ($input) || C_swig_is_flonum ($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_DOUBLE) float, double, const float &, const double & { $1 = C_swig_is_flonum ($input); } %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = C_swig_is_string ($input); } %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = C_swig_is_string ($input); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [] { void *ptr; $1 = !SWIG_ConvertPtr($input, &ptr, $1_descriptor, 0); } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; $1 = !SWIG_ConvertPtr($input, &ptr, 0, 0); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE & { void *ptr = 0; if (SWIG_ConvertPtr($input, &ptr, $descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE && { void *ptr = 0; if (SWIG_ConvertPtr($input, &ptr, $descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr = 0; if (SWIG_ConvertPtr($input, &ptr, $&descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } /* ------------------------------------------------------------ * Exception handling * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * --- Exception handling --- * ------------------------------------------------------------ */ %typemap(throws) SWIGTYPE { $<ype temp = new $ltype($1); C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj(temp, $&descriptor,1); SWIG_Chicken_ThrowException(ptr); } %typemap(throws) SWIGTYPE * { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj((void *) $1, $descriptor, 0); SWIG_Chicken_ThrowException(ptr); } %typemap(throws) SWIGTYPE [ANY] { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj((void *) $1, $descriptor, 0); SWIG_Chicken_ThrowException(ptr); } %typemap(throws) SWIGTYPE & { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj((void *)&($1),$descriptor,0); SWIG_Chicken_ThrowException(ptr); } %typemap(throws) SWIGTYPE && { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj((void *)&($1),$descriptor,0); SWIG_Chicken_ThrowException(ptr); } /* ------------------------------------------------------------ * ANSI C typemaps * ------------------------------------------------------------ */ %apply unsigned long { size_t }; /* ------------------------------------------------------------ * Various * ------------------------------------------------------------ */ /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus %rename(__add__) *::operator+; %rename(__pos__) *::operator+(); %rename(__pos__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-(); %rename(__neg__) *::operator-() const; %rename(__mul__) *::operator*; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__lshift__) *::operator<<; %rename(__rshift__) *::operator>>; %rename(__and__) *::operator&; %rename(__or__) *::operator|; %rename(__xor__) *::operator^; %rename(__invert__) *::operator~; %rename(__iadd__) *::operator+=; %rename(__isub__) *::operator-=; %rename(__imul__) *::operator*=; %rename(__idiv__) *::operator/=; %rename(__imod__) *::operator%=; %rename(__ilshift__) *::operator<<=; %rename(__irshift__) *::operator>>=; %rename(__iand__) *::operator&=; %rename(__ior__) *::operator|=; %rename(__ixor__) *::operator^=; %rename(__lt__) *::operator<; %rename(__le__) *::operator<=; %rename(__gt__) *::operator>; %rename(__ge__) *::operator>=; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; /* Special cases */ %rename(__call__) *::operator(); #endif /* Warnings for certain CHICKEN keywords */ %include /* TinyCLOS <--> Low-level CHICKEN */ %typemap("clos_in") SIMPLE_CLOS_OBJECT * "(slot-ref $input (quote this))" %typemap("clos_out") SIMPLE_CLOS_OBJECT * "(make $class (quote this) $1)" %insert(header) %{ #ifdef __cplusplus extern "C" { #endif /* Chicken initialization function */ SWIGEXPORT void SWIG_init(C_word, C_word, C_word) C_noret; #ifdef __cplusplus } #endif %} %insert(closprefix) "swigclosprefix.scm" %insert(init) "swiginit.swg" %insert(init) %{ /* CHICKEN initialization function */ #ifdef __cplusplus extern "C" { #endif SWIGEXPORT void SWIG_init(C_word argc, C_word closure, C_word continuation) { int i; C_word sym; C_word tmp; C_word *a; C_word ret; C_word *return_vec; SWIG_InitializeModule(0); SWIG_PropagateClientData(); ret = C_SCHEME_TRUE; #if $veclength return_vec = C_alloc(C_SIZEOF_VECTOR($veclength)); ret = (C_word) return_vec; *(return_vec++) = C_VECTOR_TYPE | $veclength; #endif a = C_alloc(2*$nummethods$symsize); %} swig-4.0.2/Lib/chicken/tinyclos-multi-generic.patch0000644000175000017500000001311313667507523022122 0ustar williamwilliam# This patch is against chicken 1.92, but it should work just fine # with older versions of chicken. It adds support for mulit-argument # generics, that is, generics now correctly handle adding methods # with different lengths of specializer lists # This patch has been committed into the CHICKEN darcs repository, # so chicken versions above 1.92 work fine. # Comments, bugs, suggestions send to chicken-users@nongnu.org # Patch written by John Lenz --- tinyclos.scm.old 2005-04-05 01:13:56.000000000 -0500 +++ tinyclos.scm 2005-04-11 16:37:23.746181489 -0500 @@ -37,8 +37,10 @@ (include "parameters") +(cond-expand [(not chicken-compile-shared) (declare (unit tinyclos))] + [else] ) + (declare - (unit tinyclos) (uses extras) (usual-integrations) (fixnum) @@ -234,7 +236,10 @@ y = C_block_item(y, 1); } } - return(C_block_item(v, i + 1)); + if (x == C_SCHEME_END_OF_LIST && y == C_SCHEME_END_OF_LIST) + return(C_block_item(v, i + 1)); + else + goto mismatch; } else if(free_index == -1) free_index = i; mismatch: @@ -438,7 +443,7 @@ (define hash-arg-list (foreign-lambda* unsigned-int ((scheme-object args) (scheme-object svector)) " C_word tag, h, x; - int n, i, j; + int n, i, j, len = 0; for(i = 0; args != C_SCHEME_END_OF_LIST; args = C_block_item(args, 1)) { x = C_block_item(args, 0); if(C_immediatep(x)) { @@ -481,8 +486,9 @@ default: i += 255; } } + ++len; } - return(i & (C_METHOD_CACHE_SIZE - 1));") ) + return((i + len) & (C_METHOD_CACHE_SIZE - 1));") ) ; @@ -868,13 +874,27 @@ (##tinyclos#slot-set! generic 'methods - (cons method - (filter-in - (lambda (m) - (let ([ms1 (method-specializers m)] - [ms2 (method-specializers method)] ) - (not (every2 (lambda (x y) (eq? x y)) ms1 ms2) ) ) ) - (##tinyclos#slot-ref generic 'methods)))) + (let* ([ms1 (method-specializers method)] + [l1 (length ms1)] ) + (let filter-in-method ([methods (##tinyclos#slot-ref generic 'methods)]) + (if (null? methods) + (list method) + (let* ([mm (##sys#slot methods 0)] + [ms2 (method-specializers mm)] + [l2 (length ms2)]) + (cond ((> l1 l2) + (cons mm (filter-in-method (##sys#slot methods 1)))) + ((< l1 l2) + (cons method methods)) + (else + (let check-method ([ms1 ms1] + [ms2 ms2]) + (cond ((and (null? ms1) (null? ms2)) + (cons method (##sys#slot methods 1))) ;; skip the method already in the generic + ((eq? (##sys#slot ms1 0) (##sys#slot ms2 0)) + (check-method (##sys#slot ms1 1) (##sys#slot ms2 1))) + (else + (cons mm (filter-in-method (##sys#slot methods 1))))))))))))) (if (memq generic generic-invocation-generics) (set! method-cache-tag (vector)) (%entity-cache-set! generic #f) ) @@ -925,11 +945,13 @@ (memq (car args) generic-invocation-generics)) (let ([proc (method-procedure + ; select the first method of one argument (let lp ([lis (generic-methods generic)]) - (let ([tail (##sys#slot lis 1)]) - (if (null? tail) - (##sys#slot lis 0) - (lp tail)) ) ) ) ] ) + (if (null? lis) + (##sys#error "Unable to find original compute-apply-generic") + (if (= (length (method-specializers (##sys#slot lis 0))) 1) + (##sys#slot lis 0) + (lp (##sys#slot lis 1)))))) ] ) (lambda (args) (apply proc #f args)) ) (let ([x (compute-apply-methods generic)] [y ((compute-methods generic) args)] ) @@ -946,9 +968,13 @@ (lambda (args) (let ([applicable (filter-in (lambda (method) - (every2 applicable? - (method-specializers method) - args)) + (let check-applicable ([list1 (method-specializers method)] + [list2 args]) + (cond ((null? list1) #t) + ((null? list2) #f) + (else + (and (applicable? (##sys#slot list1 0) (##sys#slot list2 0)) + (check-applicable (##sys#slot list1 1) (##sys#slot list2 1))))))) (generic-methods generic) ) ] ) (if (or (null? applicable) (null? (##sys#slot applicable 1))) applicable @@ -975,8 +1001,10 @@ [else (cond ((and (null? specls1) (null? specls2)) (##sys#error "two methods are equally specific" generic)) - ((or (null? specls1) (null? specls2)) - (##sys#error "two methods have different number of specializers" generic)) + ;((or (null? specls1) (null? specls2)) + ; (##sys#error "two methods have different number of specializers" generic)) + ((null? specls1) #f) + ((null? specls2) #t) ((null? args) (##sys#error "fewer arguments than specializers" generic)) (else @@ -1210,7 +1238,7 @@ (define (make-primitive-class "structure")) (define (make-primitive-class "procedure" )) (define (make-primitive-class "end-of-file")) -(define (make-primitive-class "environment" )) ; (Benedikt insisted on this) +(define (make-primitive-class "environment" )) (define (make-primitive-class "hash-table" )) (define (make-primitive-class "promise" )) (define (make-primitive-class "queue" )) swig-4.0.2/Lib/chicken/std_string.i0000644000175000017500000000452713667507523017036 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; %insert(closprefix) %{ (declare (hide )) %} %nodefault string; %rename("std-string") string; class string { public: ~string() {} }; %extend string { char *str; } %{ #define std_string_str_get(s) ((char *)((s)->c_str())) #define std_string_str_set(s,v) (s->assign((char *)(v))) %} %typemap(typecheck) string = char *; %typemap(typecheck) const string & = char *; %typemap(in) string (char * tempptr) { if ($input == C_SCHEME_FALSE) { $1.resize(0); } else { if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not a string"); } tempptr = SWIG_MakeString($input); $1.assign(tempptr); if (tempptr) SWIG_free(tempptr); } } %typemap(in) const string& ($*1_ltype temp, char *tempptr) { if ($input == C_SCHEME_FALSE) { temp.resize(0); $1 = &temp; } else { if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not a string"); } tempptr = SWIG_MakeString($input); temp.assign(tempptr); if (tempptr) SWIG_free(tempptr); $1 = &temp; } } %typemap(out) string { int size = $1.size(); C_word *space = C_alloc (C_SIZEOF_STRING (size)); $result = C_string (&space, size, (char *) $1.c_str()); } %typemap(out) const string& { int size = $1->size(); C_word *space = C_alloc (C_SIZEOF_STRING (size)); $result = C_string (&space, size, (char *) $1->c_str()); } %typemap(varin) string { if ($input == C_SCHEME_FALSE) { $1.resize(0); } else { char *tempptr; if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not a string"); } tempptr = SWIG_MakeString($input); $1.assign(tempptr); if (tempptr) SWIG_free(tempptr); } } %typemap(varout) string { int size = $1.size(); C_word *space = C_alloc (C_SIZEOF_STRING (size)); $result = C_string (&space, size, (char *) $1.c_str()); } } swig-4.0.2/Lib/chicken/swigclosprefix.scm0000644000175000017500000000221613667507523020251 0ustar williamwilliam(declare (hide swig-initialize)) (define (swig-initialize obj initargs create) (slot-set! obj 'swig-this (if (memq 'swig-this initargs) (cadr initargs) (let ((ret (apply create initargs))) (if (instance? ret) (slot-ref ret 'swig-this) ret))))) (define-class () (void)) (define-method (compute-getter-and-setter (class ) slot allocator) (if (not (memq ':swig-virtual slot)) (call-next-method) (let ((getter (let search-get ((lst slot)) (if (null? lst) #f (if (eq? (car lst) ':swig-get) (cadr lst) (search-get (cdr lst)))))) (setter (let search-set ((lst slot)) (if (null? lst) #f (if (eq? (car lst) ':swig-set) (cadr lst) (search-set (cdr lst))))))) (values (lambda (o) (getter (slot-ref o 'swig-this))) (lambda (o new) (setter (slot-ref o 'swig-this) new) new))))) swig-4.0.2/Lib/carrays.i0000644000175000017500000000512613667507523014712 0ustar williamwilliam/* ----------------------------------------------------------------------------- * carrays.i * * SWIG library file containing macros that can be used to manipulate simple * pointers as arrays. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %array_functions(TYPE,NAME) * * Generates functions for creating and accessing elements of a C array * (as pointers). Creates the following functions: * * TYPE *new_NAME(int nelements) * void delete_NAME(TYPE *); * TYPE NAME_getitem(TYPE *, int index); * void NAME_setitem(TYPE *, int index, TYPE value); * * ----------------------------------------------------------------------------- */ %define %array_functions(TYPE,NAME) %{ static TYPE *new_##NAME(int nelements) { %} #ifdef __cplusplus %{ return new TYPE[nelements](); %} #else %{ return (TYPE *) calloc(nelements,sizeof(TYPE)); %} #endif %{} static void delete_##NAME(TYPE *ary) { %} #ifdef __cplusplus %{ delete [] ary; %} #else %{ free(ary); %} #endif %{} static TYPE NAME##_getitem(TYPE *ary, int index) { return ary[index]; } static void NAME##_setitem(TYPE *ary, int index, TYPE value) { ary[index] = value; } %} TYPE *new_##NAME(int nelements); void delete_##NAME(TYPE *ary); TYPE NAME##_getitem(TYPE *ary, int index); void NAME##_setitem(TYPE *ary, int index, TYPE value); %enddef /* ----------------------------------------------------------------------------- * %array_class(TYPE,NAME) * * Generates a class wrapper around a C array. The class has the following * interface: * * struct NAME { * NAME(int nelements); * ~NAME(); * TYPE getitem(int index); * void setitem(int index, TYPE value); * TYPE * cast(); * static NAME *frompointer(TYPE *t); * } * * ----------------------------------------------------------------------------- */ %define %array_class(TYPE,NAME) %{ typedef TYPE NAME; %} typedef struct { /* Put language specific enhancements here */ } NAME; %extend NAME { #ifdef __cplusplus NAME(int nelements) { return new TYPE[nelements](); } ~NAME() { delete [] self; } #else NAME(int nelements) { return (TYPE *) calloc(nelements,sizeof(TYPE)); } ~NAME() { free(self); } #endif TYPE getitem(int index) { return self[index]; } void setitem(int index, TYPE value) { self[index] = value; } TYPE * cast() { return self; } static NAME *frompointer(TYPE *t) { return (NAME *) t; } }; %types(NAME = TYPE); %enddef swig-4.0.2/Lib/swigarch.i0000644000175000017500000000305413667507523015053 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigarch.i * * SWIG library file for 32bit/64bit code specialization and checking. * * Use only in extreme cases, when no arch. independent code can be * generated * * To activate architecture specific code, use * * swig -DSWIGWORDSIZE32 * * or * * swig -DSWIGWORDSIZE64 * * Note that extra checking code will be added to the wrapped code, * which will prevent the compilation in a different architecture. * * If you don't specify the SWIGWORDSIZE (the default case), swig will * generate architecture independent and/or 32bits code, with no extra * checking code added. * ----------------------------------------------------------------------------- */ #if !defined(SWIGWORDSIZE32) && !defined(SWIGWORDSIZE64) # if (__WORDSIZE == 32) # define SWIGWORDSIZE32 # endif #endif #if !defined(SWIGWORDSIZE64) && !defined(SWIGWORDSIZE32) # if defined(__x86_64) || defined(__x86_64__) || (__WORDSIZE == 64) # define SWIGWORDSIZE64 # endif #endif #ifdef SWIGWORDSIZE32 %{ #define SWIGWORDSIZE32 #ifndef LONG_MAX #include #endif #if (__WORDSIZE == 64) || (LONG_MAX != INT_MAX) # error "SWIG wrapped code invalid in 64 bit architecture, regenerate code using -DSWIGWORDSIZE64" #endif %} #endif #ifdef SWIGWORDSIZE64 %{ #define SWIGWORDSIZE64 #ifndef LONG_MAX #include #endif #if (__WORDSIZE == 32) || (LONG_MAX == INT_MAX) # error "SWIG wrapped code invalid in 32 bit architecture, regenerate code using -DSWIGWORDSIZE32" #endif %} #endif swig-4.0.2/Lib/allegrocl/0000755000175000017500000000000013667507523015034 5ustar williamwilliamswig-4.0.2/Lib/allegrocl/allegrocl.swg0000644000175000017500000005765113667507523017540 0ustar williamwilliam/* Define a C preprocessor symbol that can be used in interface files to distinguish between the SWIG language modules. */ #define SWIG_ALLEGRO_CL #define %ffargs(...) %feature("ffargs", "1", ##__VA_ARGS__) %ffargs(strings_convert="t"); /* typemaps for argument and result type conversions. */ %typemap(lin,numinputs=1) SWIGTYPE "(cl::let (($out $in))\n $body)"; %typemap(lout) bool, char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, enum SWIGTYPE "(cl::setq ACL_ffresult $body)"; %typemap(lout) void "$body"; #ifdef __cplusplus %typemap(lout) SWIGTYPE[ANY], SWIGTYPE *, SWIGTYPE &, SWIGTYPE && %{ (cl:let* ((address $body) (new-inst (cl:make-instance '$lclass :foreign-address address))) (cl:when (cl:and $owner (cl:not (cl:zerop address))) (excl:schedule-finalization new-inst #'$ldestructor)) (cl:setq ACL_ffresult new-inst)) %} %typemap(lout) SWIGTYPE "(cl::let* ((address $body)\n (new-inst (cl::make-instance '$lclass :foreign-address address)))\n (cl::unless (cl::zerop address)\n (excl:schedule-finalization new-inst #'$ldestructor))\n (cl::setq ACL_ffresult new-inst))"; #else %typemap(lout) SWIGTYPE[ANY], SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE %{ (cl:let* ((address $body) (new-inst (cl:make-instance '$lclass :foreign-address address))) (cl:setq ACL_ffresult new-inst)) %} #endif %typemap(lisptype) bool, const bool "cl:boolean"; %typemap(lisptype) char, const char "cl:character"; %typemap(lisptype) unsigned char, const unsigned char "cl:integer"; %typemap(lisptype) signed char, const signed char "cl:integer"; %typemap(ffitype) bool, const bool ":int"; %typemap(ffitype) char, const char, signed char, const signed char ":char"; %typemap(ffitype) unsigned char, const unsigned char ":unsigned-char"; %typemap(ffitype) short, const short, signed short, const signed short ":short"; %typemap(ffitype) unsigned short, const unsigned short ":unsigned-short"; %typemap(ffitype) int, const int, signed int, const signed int ":int"; %typemap(ffitype) unsigned int, const unsigned int ":unsigned-int"; %typemap(ffitype) long, const long, signed long, const signed long ":long"; %typemap(ffitype) unsigned long, const unsigned long ":unsigned-long"; %typemap(ffitype) float, const float ":float"; %typemap(ffitype) double, const double ":double"; %typemap(ffitype) char *, const char *, signed char *, const signed char *, signed char &, const signed char & "(* :char)"; %typemap(ffitype) unsigned char *, const unsigned char *, unsigned char &, const unsigned char & "(* :unsigned-char)"; %typemap(ffitype) short *, const short *, short &, const short & "(* :short)"; %typemap(ffitype) unsigned short *, const unsigned short *, unsigned short &, const unsigned short & "(* :unsigned-short)"; %typemap(ffitype) int *, const int *, int &, const int & "(* :int)"; %typemap(ffitype) unsigned int *, const unsigned int *, unsigned int &, const unsigned int & "(* :unsigned-int)"; %typemap(ffitype) void * "(* :void)"; %typemap(ffitype) void ":void"; %typemap(ffitype) enum SWIGTYPE ":int"; %typemap(ffitype) SWIGTYPE & "(* :void)"; %typemap(ffitype) SWIGTYPE && "(* :void)"; /* const typemaps idea: marshall all primitive c types to their respective lisp types to maintain const corretness. For pointers/references, all bets are off if you try to modify them. idea: add a constant-p slot to the base foreign-pointer class. For constant pointer/references check this value when setting (around method?) and error if a setf operation is performed on the address of this object. */ /* %exception %{ try { $action } catch (...) { return $null; } %} */ // %typemap(throws) SWIGTYPE { // (void)$1; // SWIG_fail; // } %typemap(ctype) bool, const bool "int"; %typemap(ctype) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[], SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE &&, const SWIGTYPE "$1_ltype"; %typemap(ctype) SWIGTYPE "$&1_type"; %typemap(in) bool "$1 = (bool)$input;"; %typemap(in) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[], SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$1 = $input;"; %typemap(in) SWIGTYPE "$1 = *$input;"; /* We don't need to do any actual C-side typechecking, but need to use the precedence values to choose which overloaded function interfaces to generate when conflicts arise. */ /* predefined precedence values Symbolic Name Precedence Value ------------------------------ ------------------ SWIG_TYPECHECK_POINTER 0 SWIG_TYPECHECK_VOIDPTR 10 SWIG_TYPECHECK_BOOL 15 SWIG_TYPECHECK_UINT8 20 SWIG_TYPECHECK_INT8 25 SWIG_TYPECHECK_UINT16 30 SWIG_TYPECHECK_INT16 35 SWIG_TYPECHECK_UINT32 40 SWIG_TYPECHECK_INT32 45 SWIG_TYPECHECK_UINT64 50 SWIG_TYPECHECK_INT64 55 SWIG_TYPECHECK_UINT128 60 SWIG_TYPECHECK_INT128 65 SWIG_TYPECHECK_INTEGER 70 SWIG_TYPECHECK_FLOAT 80 SWIG_TYPECHECK_DOUBLE 90 SWIG_TYPECHECK_COMPLEX 100 SWIG_TYPECHECK_UNICHAR 110 SWIG_TYPECHECK_UNISTRING 120 SWIG_TYPECHECK_CHAR 130 SWIG_TYPECHECK_STRING 140 SWIG_TYPECHECK_BOOL_ARRAY 1015 SWIG_TYPECHECK_INT8_ARRAY 1025 SWIG_TYPECHECK_INT16_ARRAY 1035 SWIG_TYPECHECK_INT32_ARRAY 1045 SWIG_TYPECHECK_INT64_ARRAY 1055 SWIG_TYPECHECK_INT128_ARRAY 1065 SWIG_TYPECHECK_FLOAT_ARRAY 1080 SWIG_TYPECHECK_DOUBLE_ARRAY 1090 SWIG_TYPECHECK_CHAR_ARRAY 1130 SWIG_TYPECHECK_STRING_ARRAY 1140 */ %typecheck(SWIG_TYPECHECK_BOOL) bool { $1 = 1; }; %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = 1; }; %typecheck(SWIG_TYPECHECK_FLOAT) float { $1 = 1; }; %typecheck(SWIG_TYPECHECK_DOUBLE) double { $1 = 1; }; %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = 1; }; %typecheck(SWIG_TYPECHECK_INTEGER) unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, enum SWIGTYPE { $1 = 1; }; %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE[], SWIGTYPE[ANY], SWIGTYPE { $1 = 1; }; /* This maps C/C++ types to Lisp classes for overload dispatch */ %typemap(lispclass) bool "t"; %typemap(lispclass) char "cl:character"; %typemap(lispclass) unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, enum SWIGTYPE "cl:integer"; %typemap(lispclass) float "cl:single-float"; %typemap(lispclass) double "cl:double-float"; %typemap(lispclass) char * "cl:string"; %typemap(out) void ""; %typemap(out) bool "$result = (int)$1;"; %typemap(out) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$result = $1;"; #ifdef __cplusplus %typemap(out) SWIGTYPE "$result = new $1_ltype($1);"; #else %typemap(out) SWIGTYPE { $result = ($&1_ltype) malloc(sizeof($1_type)); memmove($result, &$1, sizeof($1_type)); } #endif ////////////////////////////////////////////////////////////// // UCS-2 string conversion // should this be SWIG_TYPECHECK_CHAR? %typecheck(SWIG_TYPECHECK_UNICHAR) wchar_t { $1 = 1; }; %typemap(in) wchar_t "$1 = $input;"; %typemap(lin,numinputs=1) wchar_t "(cl::let (($out (cl:char-code $in)))\n $body)"; %typemap(lin,numinputs=1) wchar_t * "(excl:with-native-string ($out $in :external-format #+little-endian :fat-le #-little-endian :fat)\n $body)" %typemap(out) wchar_t "$result = $1;"; %typemap(lout) wchar_t "(cl::setq ACL_ffresult (cl::code-char $body))"; %typemap(lout) wchar_t * "(cl::setq ACL_ffresult (excl:native-to-string $body :external-format #+little-endian :fat-le #-little-endian :fat))"; %typemap(ffitype) wchar_t ":unsigned-short"; %typemap(lisptype) wchar_t ""; %typemap(ctype) wchar_t "wchar_t"; %typemap(lispclass) wchar_t "cl:character"; %typemap(lispclass) wchar_t * "cl:string"; ////////////////////////////////////////////////////////////// /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* name conversion for overloaded operators. */ #ifdef __cplusplus %rename(__add__) *::operator+; %rename(__pos__) *::operator+(); %rename(__pos__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-() const; %rename(__neg__) *::operator-(); %rename(__mul__) *::operator*; %rename(__deref__) *::operator*(); %rename(__deref__) *::operator*() const; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__logxor__) *::operator^; %rename(__logand__) *::operator&; %rename(__logior__) *::operator|; %rename(__lognot__) *::operator~(); %rename(__lognot__) *::operator~() const; %rename(__not__) *::operator!(); %rename(__not__) *::operator!() const; %rename(__assign__) *::operator=; %rename(__add_assign__) *::operator+=; %rename(__sub_assign__) *::operator-=; %rename(__mul_assign__) *::operator*=; %rename(__div_assign__) *::operator/=; %rename(__mod_assign__) *::operator%=; %rename(__logxor_assign__) *::operator^=; %rename(__logand_assign__) *::operator&=; %rename(__logior_assign__) *::operator|=; %rename(__lshift__) *::operator<<; %rename(__lshift_assign__) *::operator<<=; %rename(__rshift__) *::operator>>; %rename(__rshift_assign__) *::operator>>=; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; %rename(__lt__) *::operator<; %rename(__gt__) *::operator>; %rename(__lte__) *::operator<=; %rename(__gte__) *::operator>=; %rename(__and__) *::operator&&; %rename(__or__) *::operator||; %rename(__preincr__) *::operator++(); %rename(__postincr__) *::operator++(int); %rename(__predecr__) *::operator--(); %rename(__postdecr__) *::operator--(int); %rename(__comma__) *::operator,(); %rename(__comma__) *::operator,() const; %rename(__member_ref__) *::operator->; %rename(__member_func_ref__) *::operator->*; %rename(__funcall__) *::operator(); %rename(__aref__) *::operator[]; %rename(__bool__) *::operator bool(); %rename(__bool__) *::operator bool() const; #endif %insert("lisphead") %{ (eval-when (:compile-toplevel :load-toplevel :execute) ;; avoid compiling ef-templates at runtime (excl:find-external-format :fat) (excl:find-external-format :fat-le) ;;; You can define your own identifier converter if you want. ;;; Use the -identifier-converter command line argument to ;;; specify its name. (eval-when (:compile-toplevel :load-toplevel :execute) (cl::defparameter *swig-export-list* nil)) (cl::defconstant *void* :..void..) ;; parsers to aid in finding SWIG definitions in files. (cl::defun scm-p1 (form) (let* ((info (cl::second form)) (id (car info)) (id-args (if (eq (cl::car form) 'swig-dispatcher) (cl::cdr info) (cl::cddr info)))) (cl::apply *swig-identifier-converter* id (cl::progn (cl::when (cl::eq (cl::car form) 'swig-dispatcher) (cl::remf id-args :arities)) id-args)))) (cl::defmacro defswig1 (name (&rest args) &body body) `(cl::progn (cl::defmacro ,name ,args ,@body) (excl::define-simple-parser ,name scm-p1)) ) (cl::defmacro defswig2 (name (&rest args) &body body) `(cl::progn (cl::defmacro ,name ,args ,@body) (excl::define-simple-parser ,name second))) (defun read-symbol-from-string (string) (cl::multiple-value-bind (result position) (cl::read-from-string string nil "eof" :preserve-whitespace t) (cl::if (cl::and (cl::symbolp result) (cl::eql position (cl::length string))) result (cl::multiple-value-bind (sym) (cl::intern string) sym)))) (cl::defun full-name (id type arity class) ; We need some kind of a hack here to handle template classes ; and other synonym types right. We need the original name. (let*( (sym (read-symbol-from-string (if (eq *swig-identifier-converter* 'identifier-convert-lispify) (string-lispify id) id))) (sym-class (find-class sym nil)) (id (cond ( (not sym-class) id ) ( (and sym-class (not (eq (class-name sym-class) sym))) (class-name sym-class) ) ( t id ))) ) (cl::case type (:getter (cl::format nil "~@[~A_~]~A" class id)) (:constructor (cl::format nil "new_~A~@[~A~]" id arity)) (:destructor (cl::format nil "delete_~A" id)) (:type (cl::format nil "ff_~A" id)) (:slot id) (:ff-operator (cl::format nil "ffi_~A" id)) (otherwise (cl::format nil "~@[~A_~]~A~@[~A~]" class id arity))))) (cl::defun identifier-convert-null (id &key type class arity) (cl::if (cl::eq type :setter) `(cl::setf ,(identifier-convert-null id :type :getter :class class :arity arity)) (read-symbol-from-string (full-name id type arity class)))) (cl::defun string-lispify (str) (cl::let ( (cname (excl::replace-regexp str "_" "-")) (lastcase :other) newcase char res ) (cl::dotimes (n (cl::length cname)) (cl::setf char (cl::schar cname n)) (excl::if* (cl::alpha-char-p char) then (cl::setf newcase (cl::if (cl::upper-case-p char) :upper :lower)) (cl::when (cl::and (cl::eq lastcase :lower) (cl::eq newcase :upper)) ;; case change... add a dash (cl::push #\- res) (cl::setf newcase :other)) (cl::push (cl::char-downcase char) res) (cl::setf lastcase newcase) else (cl::push char res) (cl::setf lastcase :other))) (cl::coerce (cl::nreverse res) 'string))) (cl::defun identifier-convert-lispify (cname &key type class arity) (cl::assert (cl::stringp cname)) (cl::when (cl::eq type :setter) (cl::return-from identifier-convert-lispify `(cl::setf ,(identifier-convert-lispify cname :type :getter :class class :arity arity)))) (cl::setq cname (full-name cname type arity class)) (cl::if (cl::eq type :constant) (cl::setf cname (cl::format nil "*~A*" cname))) (read-symbol-from-string (string-lispify cname))) (cl::defun id-convert-and-export (name &rest kwargs) (cl::multiple-value-bind (symbol package) (cl::apply *swig-identifier-converter* name kwargs) (cl::let ((args (cl::list (cl::if (cl::consp symbol) (cl::cadr symbol) symbol) (cl::or package cl::*package*)))) (cl::apply #'cl::export args) (cl::pushnew args *swig-export-list*)) symbol)) (cl::defmacro swig-insert-id (name namespace &key (type :type) class) `(cl::let ((cl::*package* (cl::find-package ,(package-name-for-namespace namespace)))) (id-convert-and-export ,name :type ,type :class ,class))) (defswig2 swig-defconstant (string value) (cl::let ((symbol (id-convert-and-export string :type :constant))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::defconstant ,symbol ,value)))) (cl::defun maybe-reorder-args (funcname arglist) ;; in the foreign setter function the new value will be the last argument ;; in Lisp it needs to be the first (cl::if (cl::consp funcname) (cl::append (cl::last arglist) (cl::butlast arglist)) arglist)) (cl::defun maybe-return-value (funcname arglist) ;; setf functions should return the new value (cl::when (cl::consp funcname) `(,(cl::if (cl::consp (cl::car arglist)) (cl::caar arglist) (cl::car arglist))))) (cl::defun swig-anyvarargs-p (arglist) (cl::member :SWIG__varargs_ arglist)) (defswig1 swig-defun ((name &optional (mangled-name name) &key (type :operator) class arity) arglist kwargs &body body) (cl::let* ((symbol (id-convert-and-export name :type type :arity arity :class class)) (mangle (excl::if* (cl::string-equal name mangled-name) then (id-convert-and-export (cl::cond ((cl::eq type :setter) (cl::format nil "~A-set" name)) ((cl::eq type :getter) (cl::format nil "~A-get" name)) (t name)) :type :ff-operator :arity arity :class class) else (cl::intern mangled-name))) (defun-args (maybe-reorder-args symbol (cl::mapcar #'cl::car (cl::and (cl::not (cl::equal arglist '(:void))) (cl::loop as i in arglist when (cl::eq (cl::car i) :p+) collect (cl::cdr i)))))) (ffargs (cl::if (cl::equal arglist '(:void)) arglist (cl::mapcar #'cl::cdr arglist))) ) (cl::when (swig-anyvarargs-p ffargs) (cl::setq ffargs '())) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (excl::compiler-let ((*record-xref-info* nil)) (ff:def-foreign-call (,mangle ,mangled-name) ,ffargs ,@kwargs)) (cl::macrolet ((swig-ff-call (&rest args) (cl::cons ',mangle args))) (cl::defun ,symbol ,defun-args ,@body ,@(maybe-return-value symbol defun-args)))))) (defswig1 swig-defmethod ((name &optional (mangled-name name) &key (type :operator) class arity) ffargs kwargs &body body) (cl::let* ((symbol (id-convert-and-export name :type type :arity arity :class class)) (mangle (cl::intern mangled-name)) (defmethod-args (maybe-reorder-args symbol (cl::unless (cl::equal ffargs '(:void)) (cl::loop for (lisparg name dispatch) in ffargs when (eq lisparg :p+) collect `(,name ,dispatch))))) (ffargs (cl::if (cl::equal ffargs '(:void)) ffargs (cl::loop for (nil name nil . ffi) in ffargs collect `(,name ,@ffi))))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (excl::compiler-let ((*record-xref-info* nil)) (ff:def-foreign-call (,mangle ,mangled-name) ,ffargs ,@kwargs)) (cl::macrolet ((swig-ff-call (&rest args) (cl::cons ',mangle args))) (cl::defmethod ,symbol ,defmethod-args ,@body ,@(maybe-return-value symbol defmethod-args)))))) (defswig1 swig-dispatcher ((name &key (type :operator) class arities)) (cl::let ((symbol (id-convert-and-export name :type type :class class))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::defun ,symbol (&rest args) (cl::case (cl::length args) ,@(cl::loop for arity in arities for symbol-n = (id-convert-and-export name :type type :class class :arity arity) collect `(,arity (cl::apply #',symbol-n args))) (t (cl::error "No applicable wrapper-methods for foreign call ~a with args ~a of classes ~a" ',symbol args (cl::mapcar #'(cl::lambda (x) (cl::class-name (cl::class-of x))) args))) ))))) (defswig2 swig-def-foreign-stub (name) (cl::let ((lsymbol (id-convert-and-export name :type :class)) (symbol (id-convert-and-export name :type :type))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-type ,symbol (:class )) (cl::defclass ,lsymbol (ff:foreign-pointer) ())))) (defswig2 swig-def-foreign-class (name supers &rest rest) (cl::let ((lsymbol (id-convert-and-export name :type :class)) (symbol (id-convert-and-export name :type :type))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-type ,symbol ,@rest) (cl::defclass ,lsymbol ,supers ((foreign-type :initform ',symbol :initarg :foreign-type :accessor foreign-pointer-type)))))) (defswig2 swig-def-foreign-type (name &rest rest) (cl::let ((symbol (id-convert-and-export name :type :type))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-type ,symbol ,@rest)))) (defswig2 swig-def-synonym-type (synonym of ff-synonym) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::setf (cl::find-class ',synonym) (cl::find-class ',of)) (ff:def-foreign-type ,ff-synonym (:struct )))) (cl::defun package-name-for-namespace (namespace) (excl::list-to-delimited-string (cl::cons *swig-module-name* (cl::mapcar #'(cl::lambda (name) (cl::string (cl::funcall *swig-identifier-converter* name :type :namespace))) namespace)) ".")) (cl::defmacro swig-defpackage (namespace) (cl::let* ((parent-namespaces (cl::maplist #'cl::reverse (cl::cdr (cl::reverse namespace)))) (parent-strings (cl::mapcar #'package-name-for-namespace parent-namespaces)) (string (package-name-for-namespace namespace))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::defpackage ,string (:use :swig :ff #+ignore '(:common-lisp :ff :excl) ,@parent-strings ,*swig-module-name*) (:import-from :cl :* :nil :t))))) (cl::defmacro swig-in-package (namespace) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::in-package ,(package-name-for-namespace namespace)))) (defswig2 swig-defvar (name mangled-name &key type (ftype :unsigned-natural)) (cl::let ((symbol (id-convert-and-export name :type type))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-variable (,symbol ,mangled-name) :type ,ftype)))) ) ;; eval-when (cl::eval-when (:compile-toplevel :execute) (cl::flet ((starts-with-p (str prefix) (cl::and (cl::>= (cl::length str) (cl::length prefix)) (cl::string= str prefix :end1 (cl::length prefix))))) (cl::export (cl::loop for sym being each present-symbol of cl::*package* when (cl::or (starts-with-p (cl::symbol-name sym) (cl::symbol-name :swig-)) (starts-with-p (cl::symbol-name sym) (cl::symbol-name :identifier-convert-))) collect sym)))) %} typedef void *__SWIGACL_FwdReference; %{ #ifdef __cplusplus # define EXTERN extern "C" #else # define EXTERN extern #endif #define EXPORT EXTERN SWIGEXPORT typedef void *__SWIGACL_FwdReference; #include #include %} swig-4.0.2/Lib/allegrocl/typemaps.i0000644000175000017500000000012713667507523017050 0ustar williamwilliam/* Unused for Allegro CL module */ %include "inout_typemaps.i" %include "longlongs.i" swig-4.0.2/Lib/allegrocl/inout_typemaps.i0000644000175000017500000001053313667507523020270 0ustar williamwilliam/* inout_typemaps.i Support for INPUT, OUTPUT, and INOUT typemaps. OUTPUT variables are returned as multiple values. */ /* Note that this macro automatically adds a pointer to the type passed in. As a result, INOUT typemaps for char are for 'char *'. The definition of typemaps for 'char' takes advantage of this, believing that it's more likely to see an INOUT argument for strings, than a single char. */ %define INOUT_TYPEMAP(type_, OUTresult_, INbind_) // OUTPUT map. %typemap(lin,numinputs=0) type_ *OUTPUT, type_ &OUTPUT %{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c))) $body OUTresult_ (ff:free-fobject $out)) %} // INPUT map. %typemap(in) type_ *INPUT, type_ &INPUT %{ $1 = &$input; %} %typemap(ctype) type_ *INPUT, type_ &INPUT "$*1_ltype"; // INOUT map. // careful here. the input string is converted to a C string // with length equal to the input string. This should be large // enough to contain whatever OUTPUT value will be stored in it. %typemap(lin,numinputs=1) type_ *INOUT, type_ &INOUT %{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c))) INbind_ $body OUTresult_ (ff:free-fobject $out)) %} %enddef // $in, $out, $lclass, // $in_fftype, $*in_fftype INOUT_TYPEMAP(int, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(short, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(long, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(unsigned int, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(unsigned short, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(unsigned long, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); // char * mapping for passing strings. didn't quite work // INOUT_TYPEMAP(char, // (cl::push (excl:native-to-string $out) ACL_result), // (cl::setf (ff:fslot-value-typed (cl::quote $in_fftype) :c $out) // (excl:string-to-native $in))) INOUT_TYPEMAP(float, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(double, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(bool, (cl::push (not (zerop (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out))) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) (if $in 1 0))); %typemap(lisptype) bool *INPUT, bool &INPUT "boolean"; // long long support not yet complete // INOUT_TYPEMAP(long long); // INOUT_TYPEMAP(unsigned long long); // char *OUTPUT map. // for this to work, swig needs to know how large an array to allocate. // you can fake this by // %typemap(ffitype) char *myarg "(:array :char 30)"; // %apply char *OUTPUT { char *myarg }; %typemap(lin,numinputs=0) char *OUTPUT, char &OUTPUT %{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c))) $body (cl::push (excl:native-to-string $out) ACL_result) (ff:free-fobject $out)) %} // char *INPUT map. %typemap(in) char *INPUT, char &INPUT %{ $1 = &$input; %} %typemap(ctype) char *INPUT, char &INPUT "$*1_ltype"; // char *INOUT map. %typemap(lin,numinputs=1) char *INOUT, char &INOUT %{(cl::let (($out (excl:string-to-native $in))) $body (cl::push (excl:native-to-string $out) ACL_result) (ff:free-fobject $out)) %} // uncomment this if you want INOUT mappings for chars instead of strings. // INOUT_TYPEMAP(char, // (cl::push (code-char (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out)) // ACL_result), // (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); swig-4.0.2/Lib/allegrocl/longlongs.i0000644000175000017500000000312513667507523017211 0ustar williamwilliam/* ----------------------------------------------------------------------------- * longlongs.i * * Typemap addition for support of 'long long' type and 'unsigned long long * Makes use of swig-def-foreign-class, so this header should be loaded * after allegrocl.swg and after any custom user identifier-conversion * functions have been defined. * ----------------------------------------------------------------------------- */ #ifdef Acl64Bit %typemap(ctype) long long, unsigned long long "$1_ltype"; %typemap(out) long long, unsigned long long "$result = $1;"; %typemap(ffitype) long long ":nat"; %typemap(ffitype) unsigned long long ":unsigned-nat"; %typemap(lout) long long, unsigned long long " #+64bit (cl::setq ACL_ffresult $body)"; #else %typemap(out) long long, unsigned long long "$result = &$1;"; %typemap(ffitype) long long "(:struct (l1 :long) (l2 :long))"; %typemap(ffitype) unsigned long long "(:struct (l1 :unsigned-long) (l2 :unsigned-long))"; %typemap(lout) long long " (cl::setq ACL_ffresult (make-instance '#.(swig-insert-id \"longlong\" () :type :class) :foreign-address $body))"; %typemap(lout) unsigned long long " (cl:setq ACL_ffresult (make-instance '#.(swig-insert-id \"ulonglong\" () :type :class) :foreign-address $body))"; #endif %typemap(in) long long, unsigned long long "$1 = $input;"; %insert("lisphead") %{ #-64bit (swig-def-foreign-class "longlong" (ff:foreign-pointer) (:struct (l1 :long) (l2 :long))) #-64bit (swig-def-foreign-class "ulonglong" (ff:foreign-pointer) (:struct (l1 :unsigned-long) (l2 :unsigned-long))) %} swig-4.0.2/Lib/allegrocl/std_list.i0000644000175000017500000001163613667507523017042 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * * SWIG typemaps for std::list types * * To use, add: * * %include "std_list.i" * * to your interface file. You will also need to include a template directive * for each instance of the list container you want to use in your application. * e.g. * * %template (intlist) std::list; * %template (floatlist) std::list; * ----------------------------------------------------------------------------- */ %module std_list %warnfilter(468) std::list; %{ #include #include %} namespace std{ template class list { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef T &iterator; typedef const T& const_iterator; list(); list(unsigned int size, const T& value = T()); list(const list& other); void assign(unsigned int n, const T& value); void swap(list &x); const_reference front(); const_reference back(); const_iterator begin(); const_iterator end(); void resize(unsigned int n, T c = T()); bool empty() const; void push_front(const T& INPUT); void push_back(const T& INPUT); void pop_front(); void pop_back(); void clear(); unsigned int size() const; unsigned int max_size() const; void resize(unsigned int n, const T& INPUT); void remove(const T& INPUT); void unique(); void reverse(); void sort(); %extend { %typemap(lout) T &__getitem__ "(cl::setq ACL_ffresult (ff:fslot-value-typed '$*out_fftype :c $body))"; %typemap(lout) T *__getitem__ "(cl::setq ACL_ffresult (make-instance '$lclass :foreign-address $body))"; const_reference __getitem__(int i) throw (std::out_of_range) { std::list::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && i::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && i::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && ierase(first); } else throw std::out_of_range("list index out of range"); } std::list __getslice__(int i,int j) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; if (i>=j) i=j; if (i>=0 && i=0) { for (int k=0;k tmp(j-i); if (j>i) std::copy(first,end,tmp.begin()); return tmp; } else throw std::out_of_range("list index out of range"); } void __delslice__(int i,int j) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; for (int k=0;kerase(first,end); } void __setslice__(int i,int j, const std::list& v) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; for (int k=0;kerase(first,end); if (i+1 <= int(self->size())) { first = self->begin(); for (int k=0;kinsert(first,v.begin(),v.end()); } else self->insert(self->end(),v.begin(),v.end()); } } unsigned int __len__() { return self->size(); } bool __nonzero__() { return !(self->empty()); } void append(const T& INPUT) { self->push_back(INPUT); } void pop() { self->pop_back(); } } }; } swig-4.0.2/Lib/allegrocl/std_string.i0000644000175000017500000001502213667507523017366 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ // %include %warnfilter(404) std::string; %warnfilter(404) std::wstring; %{ #include %} // %include // %naturalvar std::string; // %naturalvar std::wstring; namespace std { typedef unsigned long size_t; typedef signed long ptrdiff_t; template class basic_string { public: typedef charT *pointer; typedef charT &reference; typedef const charT &const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; basic_string(); basic_string( charT *str ); size_type size(); charT operator []( int pos ) const; charT *c_str() const; basic_string &operator = ( const basic_string &ws ); basic_string &operator = ( const charT *str ); basic_string &append( const basic_string &other ); basic_string &append( const charT *str ); void push_back( charT c ); void clear(); void reserve( size_type t ); void resize( size_type n, charT c = charT() ); int compare( const basic_string &other ) const; int compare( const charT *str ) const; basic_string &insert( size_type pos, const basic_string &str ); size_type find( const basic_string &other, int pos = 0 ) const; size_type find( charT c, int pos = 0 ) const; %extend { bool operator == ( const basic_string &other ) const { return self->compare( other ) == 0; } bool operator != ( const basic_string &other ) const { return self->compare( other ) != 0; } bool operator < ( const basic_string &other ) const { return self->compare( other ) == -1; } bool operator > ( const basic_string &other ) const { return self->compare( other ) == 1; } bool operator <= ( const basic_string &other ) const { return self->compare( other ) != 1; } bool operator >= ( const basic_string &other ) const { return self->compare( other ) != -1; } } }; %template(string) basic_string; %template(wstring) basic_string; %apply char * { string }; %apply wchar_t * { wstring }; typedef basic_string string; typedef basic_string wstring; // automatically convert constant std::strings to cl:strings %typemap(ctype) string "char *"; %typemap(in) string "$1.assign($input);"; %typemap(out) string "$result = (char *)(&$1)->c_str();"; %typemap(lisptype) string "cl:string"; %typemap(lout) string "(cl::setq ACL_ffresult $body)"; %typemap(ctype) const string *"char *"; %typemap(in) const string * "$1.assign($input);"; %typemap(out) const string * "$result = (char *)($1)->c_str();"; %typemap(lisptype) const string * "cl:string"; %typemap(lout) const string * "(cl::setq ACL_ffresult $body)"; %typemap(ctype) wstring "wchar_t *"; %typemap(in) wstring "$1.assign($input);"; %typemap(out) wstring "$result = (wchar_t *)(&$1)->c_str();"; %typemap(lisptype) wstring "cl:string"; %typemap(lout) wstring "(cl::setq ACL_ffresult (excl:native-to-string $body :external-format #+little-endian :fat-le #-little-endian :fat))"; %typemap(ctype) const wstring *"char *"; %typemap(in) const wstring * "$1.assign($input);"; %typemap(out) const wstring * "$result = (char *)($1)->c_str();"; %typemap(lisptype) const wstring * "cl:string"; %typemap(lout) const wstring * "(cl::setq ACL_ffresult $body)"; /* Overloading check */ // %typemap(in) string { // if (caml_ptr_check($input)) // $1.assign((char *)caml_ptr_val($input,0), // caml_string_len($input)); // else // SWIG_exception(SWIG_TypeError, "string expected"); // } // %typemap(in) const string & ($*1_ltype temp) { // if (caml_ptr_check($input)) { // temp.assign((char *)caml_ptr_val($input,0), // caml_string_len($input)); // $1 = &temp; // } else { // SWIG_exception(SWIG_TypeError, "string expected"); // } // } // %typemap(in) string & ($*1_ltype temp) { // if (caml_ptr_check($input)) { // temp.assign((char *)caml_ptr_val($input,0), // caml_string_len($input)); // $1 = &temp; // } else { // SWIG_exception(SWIG_TypeError, "string expected"); // } // } // %typemap(in) string * ($*1_ltype *temp) { // if (caml_ptr_check($input)) { // temp = new $*1_ltype((char *)caml_ptr_val($input,0), // caml_string_len($input)); // $1 = temp; // } else { // SWIG_exception(SWIG_TypeError, "string expected"); // } // } // %typemap(free) string * ($*1_ltype *temp) { // delete temp; // } // %typemap(argout) string & { // caml_list_append(swig_result,caml_val_string_len((*$1).c_str(), // (*$1).size())); // } // %typemap(directorout) string { // $result.assign((char *)caml_ptr_val($input,0), // caml_string_len($input)); // } // %typemap(out) string { // $result = caml_val_string_len($1.c_str(),$1.size()); // } // %typemap(out) string * { // $result = caml_val_string_len((*$1).c_str(),(*$1).size()); // } } // #ifdef ENABLE_CHARPTR_ARRAY // char **c_charptr_array( const std::vector &str_v ); // %{ // SWIGEXT char **c_charptr_array( const std::vector &str_v ) { // char **out = new char *[str_v.size() + 1]; // out[str_v.size()] = 0; // for( int i = 0; i < str_v.size(); i++ ) { // out[i] = (char *)str_v[i].c_str(); // } // return out; // } // %} // #endif // #ifdef ENABLE_STRING_VECTOR // %template (StringVector) std::vector; // %insert(ml) %{ // (* Some STL convenience items *) // let string_array_to_vector sa = // let nv = _new_StringVector C_void in // array_to_vector nv (fun x -> C_string x) sa ; nv // let c_string_array ar = // _c_charptr_array (string_array_to_vector ar) // %} // %insert(mli) %{ // val c_string_array: string array -> c_obj // %} // #endif swig-4.0.2/Lib/d/0000755000175000017500000000000013667507523013313 5ustar williamwilliamswig-4.0.2/Lib/d/std_deque.i0000644000175000017500000000003413667507523015437 0ustar williamwilliam%include swig-4.0.2/Lib/d/director.swg0000644000175000017500000000237113667507523015653 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that D proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #if defined(DEBUG_DIRECTOR_OWNED) #include #endif #include #include namespace Swig { // Director base class – not used in D directors. class Director { }; // Base class for director exceptions. class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(const std::string &msg) : swig_msg(msg) { } virtual ~DirectorException() throw() { } const char *what() const throw() { return swig_msg.c_str(); } }; // Exception which is thrown when attempting to call a pure virtual method // from D code through the director layer. class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg) : DirectorException(std::string("Attempted to invoke pure virtual method ") + msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; } swig-4.0.2/Lib/d/dstrings.swg0000644000175000017500000000501113667507523015667 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dstrings.swg * * Typemaps for wrapping pointers to/arrays of C chars as D strings. * ----------------------------------------------------------------------------- */ %define SWIGD_STRING_TYPEMAPS(DW_STRING_TYPE, DP_STRING_TYPE, FROM_STRINGZ, TO_STRINGZ) %typemap(ctype) char *, char *&, char[ANY], char[] "char *" %typemap(imtype) char *, char *&, char[ANY], char[] #DW_STRING_TYPE %typemap(dtype) char *, char *&, char[ANY], char[] #DP_STRING_TYPE /* * char* typemaps. */ %typemap(in) char * %{ $1 = ($1_ltype)$input; %} %typemap(out) char * %{ $result = SWIG_d_string_callback((const char *)$1); %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) char * %{ $result = ($1_ltype)$input; %} %typemap(directorin) char * %{ $input = SWIG_d_string_callback((const char *)$1); %} %typemap(ddirectorin) char * "FROM_STRINGZ($winput)" %typemap(ddirectorout) char * "TO_STRINGZ($dcall)" /* * char*& typemaps. */ %typemap(in) char *& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) char *& %{ if ($1) $result = SWIG_d_string_callback((const char *)*$1); %} /* * char array typemaps. */ %typemap(in) char[ANY], char[] %{ $1 = ($1_ltype)$input; %} %typemap(out) char[ANY], char[] %{ $result = SWIG_d_string_callback((const char *)$1); %} %typemap(directorout) char[ANY], char[] %{ $result = ($1_ltype)$input; %} %typemap(directorin) char[ANY], char[] %{ $input = SWIG_d_string_callback((const char *)$1); %} %typemap(ddirectorin) char[ANY], char[] "$winput" %typemap(ddirectorout) char[ANY], char[] "$dcall" %typemap(din) char *, char *&, char[ANY], char[] "($dinput ? TO_STRINGZ($dinput) : null)" %typemap(dout, excode=SWIGEXCODE) char *, char *&, char[ANY], char[] { DP_STRING_TYPE ret = FROM_STRINGZ ## ($imcall);$excode return ret; } %typecheck(SWIG_TYPECHECK_STRING) char *, char *&, char[ANY], char[] "" %enddef // We need to have the \0-terminated string conversion functions available in // the D proxy modules. #if (SWIG_D_VERSION == 1) // Could be easily extended to support Phobos as well. SWIGD_STRING_TYPEMAPS(char*, char[], tango.stdc.stringz.fromStringz, tango.stdc.stringz.toStringz) %pragma(d) globalproxyimports = "static import tango.stdc.stringz;"; #else SWIGD_STRING_TYPEMAPS(const(char)*, string, std.conv.to!string, std.string.toStringz) %pragma(d) globalproxyimports = %{ static import std.conv; static import std.string; %} #endif #undef SWIGD_STRING_TYPEMAPS swig-4.0.2/Lib/d/cpointer.i0000644000175000017500000000663213667507523015317 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cpointer.i * * D-specific version of ../cpointer.i. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %pointer_class(type,name) * * Places a simple proxy around a simple type like 'int', 'float', or whatever. * The proxy provides this interface: * * class type { * public: * type(); * ~type(); * type value(); * void assign(type value); * }; * * Example: * * %pointer_class(int, intp); * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = intp() * >>> a.assign(10) * >>> a.value() * 10 * >>> b = intp() * >>> b.assign(20) * >>> print add(a,b) * 30 * * As a general rule, this macro should not be used on class/structures that * are already defined in the interface. * ----------------------------------------------------------------------------- */ %define %pointer_class(TYPE, NAME) %{ typedef TYPE NAME; %} typedef struct { } NAME; %extend NAME { #ifdef __cplusplus NAME() { return new TYPE(); } ~NAME() { if (self) delete self; } #else NAME() { return (TYPE *) calloc(1,sizeof(TYPE)); } ~NAME() { if (self) free(self); } #endif } %extend NAME { void assign(TYPE value) { *self = value; } TYPE value() { return *self; } TYPE * ptr() { return self; } static NAME * frompointer(TYPE *t) { return (NAME *) t; } } %types(NAME = TYPE); %enddef /* ----------------------------------------------------------------------------- * %pointer_functions(type,name) * * Create functions for allocating/deallocating pointers. This can be used * if you don't want to create a proxy class or if the pointer is complex. * * %pointer_functions(int, intp) * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = copy_intp(10) * >>> intp_value(a) * 10 * >>> b = new_intp() * >>> intp_assign(b,20) * >>> print add(a,b) * 30 * >>> delete_intp(a) * >>> delete_intp(b) * * ----------------------------------------------------------------------------- */ %define %pointer_functions(TYPE,NAME) %{ static TYPE *new_##NAME() { %} #ifdef __cplusplus %{ return new TYPE(); %} #else %{ return (TYPE *) calloc(1,sizeof(TYPE)); %} #endif %{} static TYPE *copy_##NAME(TYPE value) { %} #ifdef __cplusplus %{ return new TYPE(value); %} #else %{ TYPE *self = (TYPE *) calloc(1,sizeof(TYPE)); *self = value; return self; %} #endif %{} static void delete_##NAME(TYPE *self) { %} #ifdef __cplusplus %{ if (self) delete self; %} #else %{ if (self) free(self); %} #endif %{} static void NAME ##_assign(TYPE *self, TYPE value) { *self = value; } static TYPE NAME ##_value(TYPE *self) { return *self; } %} TYPE *new_##NAME(); TYPE *copy_##NAME(TYPE value); void delete_##NAME(TYPE *self); void NAME##_assign(TYPE *self, TYPE value); TYPE NAME##_value(TYPE *self); %enddef /* ----------------------------------------------------------------------------- * %pointer_cast(type1,type2,name) * * Generates a pointer casting function. * ----------------------------------------------------------------------------- */ %define %pointer_cast(TYPE1,TYPE2,NAME) %inline %{ TYPE2 NAME(TYPE1 x) { return (TYPE2) x; } %} %enddef swig-4.0.2/Lib/d/std_shared_ptr.i0000644000175000017500000000010413667507523016465 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.2/Lib/d/dmemberfunctionpointers.swg0000644000175000017500000000533313667507523021006 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dmemberfunctionpointers.swg * * Typemaps for member function pointers. * ----------------------------------------------------------------------------- */ %typemap(ctype) SWIGTYPE (CLASS::*) "char *" %typemap(imtype) SWIGTYPE (CLASS::*) "char*" %typemap(dtype) SWIGTYPE (CLASS::*) "$dclassname" %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE (CLASS::*) "" /* * Conversion generation typemaps. */ %typemap(in, fragment="SWIG_UnPackData") SWIGTYPE (CLASS::*) %{ SWIG_UnpackData($input, (void *)&$1, sizeof($1)); %} %typemap(out, fragment="SWIG_PackData") SWIGTYPE (CLASS::*) %{ char buf[128]; char *data = SWIG_PackData(buf, (void *)&$1, sizeof($1)); *data = '\0'; $result = SWIG_d_string_callback(buf); %} %typemap(directorin) SWIGTYPE (CLASS::*) "$input = (void *) $1;" %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE (CLASS::*) "$result = ($1_ltype)$input;" %typemap(ddirectorin) SWIGTYPE (CLASS::*) "($winput is null) ? null : new $dclassname($winput, false)" %typemap(ddirectorout) SWIGTYPE (CLASS::*) "$dclassname.swigGetCPtr($dcall)" %typemap(din) SWIGTYPE (CLASS::*) "$dclassname.swigGetCMemberPtr($dinput)" %typemap(dout, excode=SWIGEXCODE) SWIGTYPE (CLASS::*) { char* cMemberPtr = $imcall; $dclassname ret = (cMemberPtr is null) ? null : new $dclassname(cMemberPtr, $owner);$excode return ret; } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* * Helper functions to pack/unpack arbitrary binary data (member function * pointers in this case) into a string. */ %fragment("SWIG_PackData", "header") { /* Pack binary data into a string */ SWIGINTERN char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } } %fragment("SWIG_UnPackData", "header") { /* Unpack binary data from a string */ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } } swig-4.0.2/Lib/d/std_vector.i0000644000175000017500000004052513667507523015647 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector, D implementation. * * The D wrapper is made to loosely resemble a tango.util.container.more.Vector * and to provide built-in array-like access. * * If T does define an operator==, then use the SWIG_STD_VECTOR_ENHANCED * macro to obtain enhanced functionality (none yet), for example: * * SWIG_STD_VECTOR_ENHANCED(SomeNamespace::Klass) * %template(VectKlass) std::vector; * * Warning: heavy macro usage in this file. Use swig -E to get a sane view on * the real file contents! * ----------------------------------------------------------------------------- */ // Warning: Use the typemaps here in the expectation that the macros they are in will change name. %include // MACRO for use within the std::vector class body %define SWIG_STD_VECTOR_MINIMUM_INTERNAL(CONST_REFERENCE, CTYPE...) #if (SWIG_D_VERSION == 1) %typemap(dimports) std::vector< CTYPE > "static import tango.core.Exception;" %proxycode %{ public this($typemap(dtype, CTYPE)[] values) { this(); append(values); } alias push_back add; alias push_back push; alias push_back opCatAssign; alias size length; alias opSlice slice; public $typemap(dtype, CTYPE) opIndexAssign($typemap(dtype, CTYPE) value, size_t index) { if (index >= size()) { throw new tango.core.Exception.NoSuchElementException("Tried to assign to element out of vector bounds."); } setElement(index, value); return value; } public $typemap(dtype, CTYPE) opIndex(size_t index) { if (index >= size()) { throw new tango.core.Exception.NoSuchElementException("Tried to read from element out of vector bounds."); } return getElement(index); } public void append($typemap(dtype, CTYPE)[] value...) { foreach (v; value) { add(v); } } public $typemap(dtype, CTYPE)[] opSlice() { $typemap(dtype, CTYPE)[] array = new $typemap(dtype, CTYPE)[size()]; foreach (i, ref value; array) { value = getElement(i); } return array; } public int opApply(int delegate(ref $typemap(dtype, CTYPE) value) dg) { int result; size_t currentSize = size(); for (size_t i = 0; i < currentSize; ++i) { auto value = getElement(i); result = dg(value); setElement(i, value); } return result; } public int opApply(int delegate(ref size_t index, ref $typemap(dtype, CTYPE) value) dg) { int result; size_t currentSize = size(); for (size_t i = 0; i < currentSize; ++i) { auto value = getElement(i); // Workaround for http://d.puremagic.com/issues/show_bug.cgi?id=2443. auto index = i; result = dg(index, value); setElement(i, value); } return result; } public void capacity(size_t value) { if (value < size()) { throw new tango.core.Exception.IllegalArgumentException("Tried to make the capacity of a vector smaller than its size."); } reserve(value); } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef CTYPE value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef CONST_REFERENCE const_reference; void clear(); void push_back(CTYPE const& x); size_type size() const; size_type capacity() const; void reserve(size_type n) throw (std::length_error); vector(); vector(const vector &other); %extend { vector(size_type capacity) throw (std::length_error) { std::vector< CTYPE >* pv = 0; pv = new std::vector< CTYPE >(); // Might throw std::length_error. pv->reserve(capacity); return pv; } size_type unused() const { return $self->capacity() - $self->size(); } const_reference remove() throw (std::out_of_range) { if ($self->empty()) { throw std::out_of_range("Tried to remove last element from empty vector."); } std::vector< CTYPE >::const_reference value = $self->back(); $self->pop_back(); return value; } const_reference remove(size_type index) throw (std::out_of_range) { if (index >= $self->size()) { throw std::out_of_range("Tried to remove element with invalid index."); } std::vector< CTYPE >::iterator it = $self->begin() + index; std::vector< CTYPE >::const_reference value = *it; $self->erase(it); return value; } } // Wrappers for setting/getting items with the possibly thrown exception // specified (important for SWIG wrapper generation). %extend { const_reference getElement(size_type index) throw (std::out_of_range) { if ((index < 0) || ($self->size() <= index)) { throw std::out_of_range("Tried to get value of element with invalid index."); } return (*$self)[index]; } } // Use CTYPE const& instead of const_reference to work around SWIG code // generation issue when using const pointers as vector elements (like // std::vector< const int* >). %extend { void setElement(size_type index, CTYPE const& val) throw (std::out_of_range) { if ((index < 0) || ($self->size() <= index)) { throw std::out_of_range("Tried to set value of element with invalid index."); } (*$self)[index] = val; } } %dmethodmodifiers std::vector::getElement "private" %dmethodmodifiers std::vector::setElement "private" %dmethodmodifiers std::vector::reserve "private" #else %typemap(dimports) std::vector< CTYPE > %{ static import std.algorithm; static import std.exception; static import std.range; static import std.traits; %} %proxycode %{ alias size_t KeyType; alias $typemap(dtype, CTYPE) ValueType; this(ValueType[] values...) { this(); reserve(values.length); foreach (e; values) { this ~= e; } } struct Range { private $typemap(dtype, std::vector< CTYPE >) _outer; private size_t _a, _b; this($typemap(dtype, std::vector< CTYPE >) data, size_t a, size_t b) { _outer = data; _a = a; _b = b; } @property bool empty() const { assert((cast($typemap(dtype, std::vector< CTYPE >))_outer).length >= _b); return _a >= _b; } @property Range save() { return this; } @property ValueType front() { std.exception.enforce(!empty); return _outer[_a]; } @property void front(ValueType value) { std.exception.enforce(!empty); _outer[_a] = std.algorithm.move(value); } void popFront() { std.exception.enforce(!empty); ++_a; } void opIndexAssign(ValueType value, size_t i) { i += _a; std.exception.enforce(i < _b && _b <= _outer.length); _outer[i] = value; } void opIndexOpAssign(string op)(ValueType value, size_t i) { std.exception.enforce(_outer && _a + i < _b && _b <= _outer.length); auto element = _outer[i]; mixin("element "~op~"= value;"); _outer[i] = element; } } // TODO: dup? Range opSlice() { return Range(this, 0, length); } Range opSlice(size_t a, size_t b) { std.exception.enforce(a <= b && b <= length); return Range(this, a, b); } size_t opDollar() const { return length; } @property ValueType front() { std.exception.enforce(!empty); return getElement(0); } @property void front(ValueType value) { std.exception.enforce(!empty); setElement(0, value); } @property ValueType back() { std.exception.enforce(!empty); return getElement(length - 1); } @property void back(ValueType value) { std.exception.enforce(!empty); setElement(length - 1, value); } ValueType opIndex(size_t i) { return getElement(i); } void opIndexAssign(ValueType value, size_t i) { setElement(i, value); } void opIndexOpAssign(string op)(ValueType value, size_t i) { auto element = this[i]; mixin("element "~op~"= value;"); this[i] = element; } ValueType[] opBinary(string op, Stuff)(Stuff stuff) if (op == "~") { ValueType[] result; result ~= this[]; assert(result.length == length); result ~= stuff[]; return result; } void opOpAssign(string op, Stuff)(Stuff stuff) if (op == "~") { static if (is(typeof(insertBack(stuff)))) { insertBack(stuff); } else if (is(typeof(insertBack(stuff[])))) { insertBack(stuff[]); } else { static assert(false, "Cannot append " ~ Stuff.stringof ~ " to " ~ typeof(this).stringof); } } alias size length; alias remove removeAny; alias removeAny stableRemoveAny; size_t insertBack(Stuff)(Stuff stuff) if (std.traits.isImplicitlyConvertible!(Stuff, ValueType)){ push_back(stuff); return 1; } size_t insertBack(Stuff)(Stuff stuff) if (std.range.isInputRange!Stuff && std.traits.isImplicitlyConvertible!(std.range.ElementType!Stuff, ValueType)) { size_t itemCount; foreach(item; stuff) { insertBack(item); ++itemCount; } return itemCount; } alias insertBack insert; alias pop_back removeBack; alias pop_back stableRemoveBack; size_t insertBefore(Stuff)(Range r, Stuff stuff) if (std.traits.isImplicitlyConvertible!(Stuff, ValueType)) { std.exception.enforce(r._outer.swigCPtr == swigCPtr && r._a < length); insertAt(r._a, stuff); return 1; } size_t insertBefore(Stuff)(Range r, Stuff stuff) if (std.range.isInputRange!Stuff && std.traits.isImplicitlyConvertible!(ElementType!Stuff, ValueType)) { std.exception.enforce(r._outer.swigCPtr == swigCPtr && r._a <= length); size_t insertCount; foreach(i, item; stuff) { insertAt(r._a + i, item); ++insertCount; } return insertCount; } size_t insertAfter(Stuff)(Range r, Stuff stuff) { // TODO: optimize immutable offset = r._a + r.length; std.exception.enforce(offset <= length); auto result = insertBack(stuff); std.algorithm.bringToFront(this[offset .. length - result], this[length - result .. length]); return result; } size_t replace(Stuff)(Range r, Stuff stuff) if (std.range.isInputRange!Stuff && std.traits.isImplicitlyConvertible!(ElementType!Stuff, ValueType)) { immutable offset = r._a; std.exception.enforce(offset <= length); size_t result; for (; !stuff.empty; stuff.popFront()) { if (r.empty) { // append the rest return result + insertBack(stuff); } r.front = stuff.front; r.popFront(); ++result; } // Remove remaining stuff in r remove(r); return result; } size_t replace(Stuff)(Range r, Stuff stuff) if (std.traits.isImplicitlyConvertible!(Stuff, ValueType)) { if (r.empty) { insertBefore(r, stuff); } else { r.front = stuff; r.popFront(); remove(r); } return 1; } Range linearRemove(Range r) { std.exception.enforce(r._a <= r._b && r._b <= length); immutable tailLength = length - r._b; linearRemove(r._a, r._b); return this[length - tailLength .. length]; } alias remove stableLinearRemove; int opApply(int delegate(ref $typemap(dtype, CTYPE) value) dg) { int result; size_t currentSize = size(); for (size_t i = 0; i < currentSize; ++i) { auto value = getElement(i); result = dg(value); setElement(i, value); } return result; } int opApply(int delegate(ref size_t index, ref $typemap(dtype, CTYPE) value) dg) { int result; size_t currentSize = size(); for (size_t i = 0; i < currentSize; ++i) { auto value = getElement(i); // Workaround for http://d.puremagic.com/issues/show_bug.cgi?id=2443. auto index = i; result = dg(index, value); setElement(i, value); } return result; } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef CTYPE value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef CONST_REFERENCE const_reference; bool empty() const; void clear(); void push_back(CTYPE const& x); void pop_back(); size_type size() const; size_type capacity() const; void reserve(size_type n) throw (std::length_error); vector(); vector(const vector &other); %extend { vector(size_type capacity) throw (std::length_error) { std::vector< CTYPE >* pv = 0; pv = new std::vector< CTYPE >(); // Might throw std::length_error. pv->reserve(capacity); return pv; } const_reference remove() throw (std::out_of_range) { if ($self->empty()) { throw std::out_of_range("Tried to remove last element from empty vector."); } std::vector< CTYPE >::const_reference value = $self->back(); $self->pop_back(); return value; } const_reference remove(size_type index) throw (std::out_of_range) { if (index >= $self->size()) { throw std::out_of_range("Tried to remove element with invalid index."); } std::vector< CTYPE >::iterator it = $self->begin() + index; std::vector< CTYPE >::const_reference value = *it; $self->erase(it); return value; } void removeBack(size_type how_many) throw (std::out_of_range) { std::vector< CTYPE >::iterator end = $self->end(); std::vector< CTYPE >::iterator start = end - how_many; $self->erase(start, end); } void linearRemove(size_type start_index, size_type end_index) throw (std::out_of_range) { std::vector< CTYPE >::iterator start = $self->begin() + start_index; std::vector< CTYPE >::iterator end = $self->begin() + end_index; $self->erase(start, end); } void insertAt(size_type index, CTYPE const& x) throw (std::out_of_range) { std::vector< CTYPE >::iterator it = $self->begin() + index; $self->insert(it, x); } } // Wrappers for setting/getting items with the possibly thrown exception // specified (important for SWIG wrapper generation). %extend { const_reference getElement(size_type index) throw (std::out_of_range) { if ((index < 0) || ($self->size() <= index)) { throw std::out_of_range("Tried to get value of element with invalid index."); } return (*$self)[index]; } } // Use CTYPE const& instead of const_reference to work around SWIG code // generation issue when using const pointers as vector elements (like // std::vector< const int* >). %extend { void setElement(size_type index, CTYPE const& val) throw (std::out_of_range) { if ((index < 0) || ($self->size() <= index)) { throw std::out_of_range("Tried to set value of element with invalid index."); } (*$self)[index] = val; } } %dmethodmodifiers std::vector::getElement "private" %dmethodmodifiers std::vector::setElement "private" #endif %enddef // Extra methods added to the collection class if operator== is defined for the class being wrapped // The class will then implement IList<>, which adds extra functionality %define SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(CTYPE...) %extend { } %enddef // For vararg handling in macros, from swigmacros.swg #define %arg(X...) X // Macros for std::vector class specializations/enhancements %define SWIG_STD_VECTOR_ENHANCED(CTYPE...) namespace std { template<> class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(const value_type&, %arg(CTYPE)) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(CTYPE) }; } %enddef %{ #include #include %} namespace std { // primary (unspecialized) class template for std::vector // does not require operator== to be defined template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(const value_type&, T) }; // specializations for pointers template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(const value_type&, T *) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(T *) }; // bool is a bit different in the C++ standard - const_reference in particular template<> class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(bool, bool) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(bool) }; } // template specializations for std::vector // these provide extra collections methods as operator== is defined SWIG_STD_VECTOR_ENHANCED(char) SWIG_STD_VECTOR_ENHANCED(signed char) SWIG_STD_VECTOR_ENHANCED(unsigned char) SWIG_STD_VECTOR_ENHANCED(short) SWIG_STD_VECTOR_ENHANCED(unsigned short) SWIG_STD_VECTOR_ENHANCED(int) SWIG_STD_VECTOR_ENHANCED(unsigned int) SWIG_STD_VECTOR_ENHANCED(long) SWIG_STD_VECTOR_ENHANCED(unsigned long) SWIG_STD_VECTOR_ENHANCED(long long) SWIG_STD_VECTOR_ENHANCED(unsigned long long) SWIG_STD_VECTOR_ENHANCED(float) SWIG_STD_VECTOR_ENHANCED(double) SWIG_STD_VECTOR_ENHANCED(std::string) // also requires a %include swig-4.0.2/Lib/d/ddirectives.swg0000644000175000017500000000101313667507523016335 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ddirectives.swg * * D-specifiv directives. * ----------------------------------------------------------------------------- */ #define %dmanifestconst %feature("d:manifestconst") #define %dconstvalue(value) %feature("d:constvalue",value) #define %dmethodmodifiers %feature("d:methodmodifiers") #define %dnothrowexception %feature("except") #define %proxycode %insert("proxycode") swig-4.0.2/Lib/d/doperators.swg0000644000175000017500000001767013667507523016232 0ustar williamwilliam/* ----------------------------------------------------------------------------- * doperators.swg * * Mapping of C++ operator overloading methods to D. * ----------------------------------------------------------------------------- */ #if (SWIG_D_VERSION == 1) %pragma(d) imdmodulecode=%{ template SwigOperatorDefinitions() { public override int opEquals(Object o) { if (auto rhs = cast(typeof(this))o) { if (swigCPtr == rhs.swigCPtr) return 1; static if (is(typeof(swigOpEquals(rhs)))) { return swigOpEquals(rhs) ? 1 : 0; } else { return 0; } } return super.opEquals(o); } %} // opEquals is emitted in pure C mode as well to define two proxy classes // pointing to the same struct as equal. #ifdef __cplusplus %rename(opPos) *::operator+(); %rename(opPos) *::operator+() const; %rename(opNeg) *::operator-(); %rename(opNeg) *::operator-() const; %rename(opCom) *::operator~(); %rename(opCom) *::operator~() const; %rename(opAdd) *::operator+; %rename(opAddAssign) *::operator+=; %rename(opSub) *::operator-; %rename(opSubAssign) *::operator-=; %rename(opMul) *::operator*; %rename(opMulAssign) *::operator*=; %rename(opDiv) *::operator/; %rename(opDivAssign) *::operator/=; %rename(opMod) *::operator%; %rename(opModAssign) *::operator%=; %rename(opAnd) *::operator&; %rename(opAndAssign) *::operator&=; %rename(opOr) *::operator|; %rename(opOrAssign) *::operator|=; %rename(opXor) *::operator^; %rename(opXorAssign) *::operator^=; %rename(opShl) *::operator<<; %rename(opShlAssign) *::operator<<=; %rename(opShr) *::operator>>; %rename(opShrAssign) *::operator>>=; %rename(opIndex) *::operator[](unsigned) const; // opIndexAssign is not currently generated, it needs more extensive support // mechanisms. %rename(opCall) *::operator(); // !a is not overrideable in D1. %ignoreoperator(LNOT) operator!; // opCmp is used in D. %rename(swigOpEquals) *::operator==; %rename(swigOpLt) *::operator<; %rename(swigOpLtEquals) *::operator<=; %rename(swigOpGt) *::operator>; %rename(swigOpGtEquals) *::operator>=; // a != b is rewritten as !a.opEquals(b) in D. %ignoreoperator(NOTEQUAL) operator!=; // The logic operators are not overrideable in D. %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; // ++/--a is rewritten as a +/-= 1 in D1,so ignore the prefix operators. %ignoreoperator(PLUSPLUS) *::operator++(); %ignoreoperator(MINUSMINUS) *::operator--(); %rename(swigOpInc) *::operator++(int); %rename(swigOpDec) *::operator--(int); // The C++ assignment operator does not translate well to D where the proxy // classes have reference semantics. %ignoreoperator(EQ) operator=; %pragma(d) imdmodulecode=%{ public override int opCmp(Object o) { static if (is(typeof(swigOpLt(typeof(this).init) && swigOpEquals(typeof(this).init)))) { if (auto rhs = cast(typeof(this))o) { if (swigOpLt(rhs)) { return -1; } else if (swigOpEquals(rhs)) { return 0; } else { return 1; } } } return super.opCmp(o); } public typeof(this) opPostInc(T = int)(T unused = 0) { static assert( is(typeof(swigOpInc(int.init))), "opPostInc called on " ~ typeof(this).stringof ~ ", but no postfix " ~ "increment operator exists in the corresponding C++ class." ); return swigOpInc(int.init); } public typeof(this) opPostDec(T = int)(T unused = 0) { static assert( is(typeof(swigOpDec(int.init))), "opPostInc called on " ~ typeof(this).stringof ~ ", but no postfix " ~ "decrement operator exists in the corresponding C++ class." ); return swigOpDec(int.init); } %} #endif %pragma(d) imdmodulecode=%{ } %} #else %pragma(d) imdmodulecode=%{ mixin template SwigOperatorDefinitions() { public override bool opEquals(Object o) { if (auto rhs = cast(typeof(this))o) { if (swigCPtr == rhs.swigCPtr) return true; static if (is(typeof(swigOpEquals(rhs)))) { return swigOpEquals(rhs); } else { return false; } } return super.opEquals(o); } %} // opEquals is emitted in pure C mode as well to define two proxy classes // pointing to the same struct as equal. #ifdef __cplusplus %rename(swigOpPos) *::operator+(); %rename(swigOpPos) *::operator+() const; %rename(swigOpNeg) *::operator-(); %rename(swigOpNeg) *::operator-() const; %rename(swigOpCom) *::operator~(); %rename(swigOpCom) *::operator~() const; %rename(swigOpInc) *::operator++(); %rename(swigOpDec) *::operator--(); %ignoreoperator(PLUSPLUS) *::operator++(int); %ignoreoperator(MINUSMINUS) *::operator--(int); // The postfix increment/decrement operators are ignored because they are // rewritten to (auto t = e, ++e, t) in D2. The unary * operator (used for // pointer dereferencing in C/C++) isn't mapped to opUnary("*") by default, // despite this would be possible in D2 – the difference in member access // semantics would only lead to confusion in most cases. %rename(swigOpAdd) *::operator+; %rename(swigOpSub) *::operator-; %rename(swigOpMul) *::operator*; %rename(swigOpDiv) *::operator/; %rename(swigOpMod) *::operator%; %rename(swigOpAnd) *::operator&; %rename(swigOpOr) *::operator|; %rename(swigOpXor) *::operator^; %rename(swigOpShl) *::operator<<; %rename(swigOpShr) *::operator>>; %rename(swigOpAddAssign) *::operator+=; %rename(swigOpSubAssign) *::operator-=; %rename(swigOpMulAssign) *::operator*=; %rename(swigOpDivAssign) *::operator/=; %rename(swigOpModAssign) *::operator%=; %rename(swigOpAndAssign) *::operator&=; %rename(swigOpOrAssign) *::operator|=; %rename(swigOpXorAssign) *::operator^=; %rename(swigOpShlAssign) *::operator<<=; %rename(swigOpShrAssign) *::operator>>=; %rename(opIndex) *::operator[]; // opIndexAssign is not currently generated, it needs more extensive support // mechanisms. %rename(opCall) *::operator(); %rename(swigOpEquals) *::operator==; %rename(swigOpLt) *::operator<; %rename(swigOpLtEquals) *::operator<=; %rename(swigOpGt) *::operator>; %rename(swigOpGtEquals) *::operator>=; // a != b is rewritten as !a.opEquals(b) in D. %ignoreoperator(NOTEQUAL) operator!=; // The logic operators are not overrideable in D. %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; // The C++ assignment operator does not translate well to D where the proxy // classes have reference semantics. %ignoreoperator(EQ) operator=; %pragma(d) imdmodulecode=%{ public override int opCmp(Object o) { static if (__traits(compiles, swigOpLt(typeof(this).init) && swigOpEquals(typeof(this).init))) { if (auto rhs = cast(typeof(this))o) { if (swigOpLt(rhs)) { return -1; } else if (swigOpEquals(rhs)) { return 0; } else { return 1; } } } return super.opCmp(o); } private template swigOpBinary(string operator, string name) { enum swigOpBinary = `public void opOpAssign(string op, T)(T rhs) if (op == "` ~ operator ~ `" && __traits(compiles, swigOp` ~ name ~ `Assign(rhs))) { swigOp` ~ name ~ `Assign(rhs);}` ~ `public auto opBinary(string op, T)(T rhs) if (op == "` ~ operator ~ `" && __traits(compiles, swigOp` ~ name ~ `(rhs))) { return swigOp` ~ name ~ `(rhs);}`; } mixin(swigOpBinary!("+", "Add")); mixin(swigOpBinary!("-", "Sub")); mixin(swigOpBinary!("*", "Mul")); mixin(swigOpBinary!("/", "Div")); mixin(swigOpBinary!("%", "Mod")); mixin(swigOpBinary!("&", "And")); mixin(swigOpBinary!("|", "Or")); mixin(swigOpBinary!("^", "Xor")); mixin(swigOpBinary!("<<", "Shl")); mixin(swigOpBinary!(">>", "Shr")); private template swigOpUnary(string operator, string name) { enum swigOpUnary = `public auto opUnary(string op)() if (op == "` ~ operator ~ `" && __traits(compiles, swigOp` ~ name ~ `())) { return swigOp` ~ name ~ `();}`; } mixin(swigOpUnary!("+", "Pos")); mixin(swigOpUnary!("-", "Neg")); mixin(swigOpUnary!("~", "Com")); mixin(swigOpUnary!("++", "Inc")); mixin(swigOpUnary!("--", "Dec")); %} #endif %pragma(d) imdmodulecode=%{ } %} #endif swig-4.0.2/Lib/d/dkw.swg0000644000175000017500000000456513667507523014634 0ustar williamwilliam#ifndef D_DKW_SWG_ #define D_DKW_SWG_ /* Warnings for D keywords */ #define DKEYWORD(x) %keywordwarn("'" `x` "' is a D keyword, renaming to '_" `x` "'",rename="_%s") `x` // Source: http://www.digitalmars.com/d/{1.0,2.0}/lex.html and DKEYWORD(Error); DKEYWORD(Exception); DKEYWORD(Object); DKEYWORD(__FILE__); DKEYWORD(__LINE__); DKEYWORD(__gshared); DKEYWORD(__thread); DKEYWORD(__traits); DKEYWORD(abstract); DKEYWORD(alias); DKEYWORD(align); DKEYWORD(asm); DKEYWORD(assert); DKEYWORD(auto); DKEYWORD(body); DKEYWORD(bool); DKEYWORD(break); DKEYWORD(byte); DKEYWORD(case); DKEYWORD(cast); DKEYWORD(catch); DKEYWORD(cdouble); DKEYWORD(cent); DKEYWORD(cfloat); DKEYWORD(char); DKEYWORD(class); DKEYWORD(const); DKEYWORD(continue); DKEYWORD(creal); DKEYWORD(dchar); DKEYWORD(debug); DKEYWORD(default); DKEYWORD(delegate); DKEYWORD(delete); DKEYWORD(deprecated); DKEYWORD(do); DKEYWORD(double); DKEYWORD(dstring); DKEYWORD(else); DKEYWORD(enum); DKEYWORD(export); DKEYWORD(extern); DKEYWORD(false); DKEYWORD(final); DKEYWORD(finally); DKEYWORD(float); DKEYWORD(for); DKEYWORD(foreach); DKEYWORD(foreach_reverse); DKEYWORD(function); DKEYWORD(goto); DKEYWORD(idouble); DKEYWORD(if); DKEYWORD(ifloat); DKEYWORD(immutable); DKEYWORD(import); DKEYWORD(in); DKEYWORD(inout); DKEYWORD(int); DKEYWORD(interface); DKEYWORD(invariant); DKEYWORD(ireal); DKEYWORD(is); DKEYWORD(lazy); DKEYWORD(long); DKEYWORD(macro); DKEYWORD(mixin); DKEYWORD(module); DKEYWORD(new); DKEYWORD(nothrow); DKEYWORD(null); DKEYWORD(out); DKEYWORD(override); DKEYWORD(package); DKEYWORD(pragma); DKEYWORD(private); DKEYWORD(protected); DKEYWORD(public); DKEYWORD(pure); DKEYWORD(real); DKEYWORD(ref); DKEYWORD(return); DKEYWORD(scope); DKEYWORD(shared); DKEYWORD(short); DKEYWORD(static); DKEYWORD(string); DKEYWORD(struct); DKEYWORD(super); DKEYWORD(switch); DKEYWORD(synchronized); DKEYWORD(template); DKEYWORD(this); DKEYWORD(throw); DKEYWORD(true); DKEYWORD(try); DKEYWORD(typedef); DKEYWORD(typeid); DKEYWORD(typeof); DKEYWORD(ubyte); DKEYWORD(ucent); DKEYWORD(uint); DKEYWORD(ulong); DKEYWORD(union); DKEYWORD(unittest); DKEYWORD(ushort); DKEYWORD(version); DKEYWORD(void); DKEYWORD(volatile); DKEYWORD(wchar); DKEYWORD(while); DKEYWORD(with); DKEYWORD(wstring); // Not really a keyword, but dispose() methods are generated in proxy classes // and it's a special method name for D1/Tango. DKEYWORD(dispose); #undef DKEYWORD #endif //D_DKW_SWG_ swig-4.0.2/Lib/d/std_common.i0000644000175000017500000000014613667507523015630 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.2/Lib/d/dclassgen.swg0000644000175000017500000000710113667507523015777 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dclassgen.swg * * Typemaps containing D code used when generating D proxy classes. * ----------------------------------------------------------------------------- */ %typemap(dbase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(dclassmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "class" %typemap(dcode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(dimports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(dinterfaces) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(dinterfaces_derived) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" // See . %typemap(dclassmodifiers) enum SWIGTYPE "enum" %typemap(dcode) enum SWIGTYPE "" /* * Proxy classes. */ %typemap(dconstructor, excode=SWIGEXCODE,directorconnect="\n swigDirectorConnect();") SWIGTYPE { this($imcall, true);$excode$directorconnect } %typemap(ddestructor) SWIGTYPE %{ ~this() { dispose(); } %} // We do not use »override« attribute for generated dispose() methods to stay // somewhat compatible to Phobos and older Tango versions where Object.dispose() // does not exist. %typemap(ddispose, methodname="dispose", methodmodifiers="public", parameters="") SWIGTYPE { synchronized(this) { if (swigCPtr !is null) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = null; } } } %typemap(ddispose_derived, methodname="dispose", methodmodifiers="public", parameters="") SWIGTYPE { synchronized(this) { if (swigCPtr !is null) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = null; super.dispose(); } } } // Unfortunately, the »package« visibility attribute does not work in D when the // module in question is in the root package (happens if no -package is specified // at the SWIG command line), so we are stuck with public visibility for // swigGetCPtr(). %typemap(dbody) SWIGTYPE %{ private void* swigCPtr; protected bool swigCMemOwn; public this(void* cObject, bool ownCObject) { swigCPtr = cObject; swigCMemOwn = ownCObject; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } mixin $imdmodule.SwigOperatorDefinitions; %} %typemap(dbody_derived) SWIGTYPE %{ private void* swigCPtr; public this(void* cObject, bool ownCObject) { super($imdmodule.$dclazznameUpcast(cObject), ownCObject); swigCPtr = cObject; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } mixin $imdmodule.SwigOperatorDefinitions; %} /* * Type wrapper classes. */ %typemap(dbody) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] %{ private void* swigCPtr; public this(void* cObject, bool futureUse) { swigCPtr = cObject; } protected this() { swigCPtr = null; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } mixin $imdmodule.SwigOperatorDefinitions; %} /* * Member function pointer wrapper classes (see ). */ %typemap(dbody) SWIGTYPE (CLASS::*) %{ private char* swigCPtr; public this(char* cMemberPtr, bool futureUse) { swigCPtr = cMemberPtr; } protected this() { swigCPtr = null; } package static char* swigGetCMemberPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } mixin $imdmodule.SwigOperatorDefinitions; %} swig-4.0.2/Lib/d/std_except.i0000644000175000017500000000377613667507523015644 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * Typemaps used by the STL wrappers that throw exceptions. These typemaps are * used when methods are declared with an STL exception specification, such as * size_t at() const throw (std::out_of_range); * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws, canthrow=1) std::bad_cast "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::bad_exception "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::domain_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::exception "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::invalid_argument "SWIG_DSetPendingException(SWIG_DIllegalArgumentException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::length_error "SWIG_DSetPendingException(SWIG_DNoSuchElementException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::logic_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::out_of_range "SWIG_DSetPendingException(SWIG_DNoSuchElementException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::overflow_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::range_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::runtime_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::underflow_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" swig-4.0.2/Lib/d/dswigtype.swg0000644000175000017500000001314613667507523016061 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dswigtype.swg * * Typemaps for non-primitive types (C/C++ classes and structs). * ----------------------------------------------------------------------------- */ %typemap(ctype) SWIGTYPE "void *" %typemap(imtype) SWIGTYPE "void*" %typemap(dtype) SWIGTYPE "$&dclassname" %typemap(ctype) SWIGTYPE [] "void *" %typemap(imtype) SWIGTYPE [] "void*" %typemap(dtype) SWIGTYPE [] "$dclassname" %typemap(ctype) SWIGTYPE * "void *" %typemap(imtype) SWIGTYPE * "void*" %typemap(dtype, nativepointer="$dtype") SWIGTYPE * "$dclassname" %typemap(ctype) SWIGTYPE & "void *" %typemap(imtype) SWIGTYPE & "void*" %typemap(dtype, nativepointer="$dtype") SWIGTYPE & "$dclassname" %typemap(ctype) SWIGTYPE *const& "void *" %typemap(imtype) SWIGTYPE *const& "void*" %typemap(dtype) SWIGTYPE *const& "$*dclassname" %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE *const& "" /* * By-value conversion typemaps (parameter is converted to a pointer). */ %typemap(in, canthrow=1) SWIGTYPE ($&1_type argp) %{ argp = ($&1_ltype)$input; if (!argp) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{ $result = new $1_ltype((const $1_ltype &)$1); %} #else { $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); $result = $1ptr; } #endif %typemap(directorin) SWIGTYPE "$input = (void *)new $1_ltype((const $1_ltype &)$1);" %typemap(directorout) SWIGTYPE %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Unexpected null return for type $1_type"); return $null; } $result = *($&1_ltype)$input; %} %typemap(ddirectorin) SWIGTYPE "new $&dclassname($winput, true)" %typemap(ddirectorout) SWIGTYPE "$&dclassname.swigGetCPtr($dcall)" %typemap(din) SWIGTYPE "$&dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE) SWIGTYPE { $&dclassname ret = new $&dclassname($imcall, true);$excode return ret; } /* * Pointer conversion typemaps. */ %typemap(in) SWIGTYPE * "$1 = ($1_ltype)$input;" %typemap(out) SWIGTYPE * "$result = (void *)$1;" %typemap(directorin) SWIGTYPE * "$input = (void *) $1;" %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE * "$result = ($1_ltype)$input;" %typemap(ddirectorin, nativepointer="cast($dtype)$winput" ) SWIGTYPE * "($winput is null) ? null : new $dclassname($winput, false)" %typemap(ddirectorout, nativepointer="cast(void*)$dcall" ) SWIGTYPE * "$dclassname.swigGetCPtr($dcall)" %typemap(din, nativepointer="cast(void*)$dinput" ) SWIGTYPE * "$dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE, nativepointer="{\n auto ret = cast($dtype)$imcall;$excode\n return ret;\n}" ) SWIGTYPE * { void* cPtr = $imcall; $dclassname ret = (cPtr is null) ? null : new $dclassname(cPtr, $owner);$excode return ret; } // Use the same typemaps for const pointers. %apply SWIGTYPE * { SWIGTYPE *const } /* * Reference conversion typemaps. */ %typemap(in, canthrow=1) SWIGTYPE & %{ $1 = ($1_ltype)$input; if (!$1) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "$1_type type is null"); return $null; } %} %typemap(out) SWIGTYPE & "$result = (void *)$1;" %typemap(directorin) SWIGTYPE & "$input = ($1_ltype) &$1;" %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE & %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Unexpected null return for type $1_type"); return $null; } $result = ($1_ltype)$input; %} %typemap(ddirectorin, nativepointer="cast($dtype)$winput" ) SWIGTYPE & "new $dclassname($winput, false)" %typemap(ddirectorout, nativepointer="cast(void*)$dcall" ) SWIGTYPE & "$dclassname.swigGetCPtr($dcall)" %typemap(din, nativepointer="cast(void*)$dinput" ) SWIGTYPE & "$dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE, nativepointer="{\n auto ret = cast($dtype)$imcall;$excode\n return ret;\n}") SWIGTYPE & { $dclassname ret = new $dclassname($imcall, $owner);$excode return ret; } /* * Array conversion typemaps. */ %typemap(in) SWIGTYPE [] %{ $1 = ($1_ltype)$input; %} %typemap(out) SWIGTYPE [] %{ $result = $1; %} %typemap(din) SWIGTYPE [] "$dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE) SWIGTYPE [] { void* cPtr = $imcall; $dclassname ret = (cPtr is null) ? null : new $dclassname(cPtr, $owner);$excode return ret; } // Treat references to arrays like references to a single element. %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } /* * Pointer reference conversion typemaps. */ %typemap(in) SWIGTYPE *const& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)$input; $1 = ($1_ltype)&temp; %} %typemap(out) SWIGTYPE *const& %{ $result = (void *)*$1; %} %typemap(din) SWIGTYPE *const& "$*dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE) SWIGTYPE *const& { void* cPtr = $imcall; $*dclassname ret = (cPtr is null) ? null : new $*dclassname(cPtr, $owner);$excode return ret; } %typemap(directorin) SWIGTYPE *const& "$input = (void *) $1;" %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE *const& %{ static $*1_ltype swig_temp; swig_temp = ($*1_ltype)$input; $result = &swig_temp; %} %typemap(ddirectorin, nativepointer="cast($dtype)$winput" ) SWIGTYPE *const& "($winput is null) ? null : new $*dclassname($winput, false)" %typemap(ddirectorout, nativepointer="cast(void*)$dcall" ) SWIGTYPE *const& "$*dclassname.swigGetCPtr($dcall)" swig-4.0.2/Lib/d/typemaps.i0000644000175000017500000002547713667507523015346 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* INPUT typemaps -------------- These typemaps are used for pointer/reference parameters that are input only and are mapped to a D input parameter. The following typemaps can be applied to turn a pointer or reference into a simple input value. That is, instead of passing a pointer or reference to an object, you would use a real value instead. bool *INPUT, bool &INPUT signed char *INPUT, signed char &INPUT unsigned char *INPUT, unsigned char &INPUT short *INPUT, short &INPUT unsigned short *INPUT, unsigned short &INPUT int *INPUT, int &INPUT unsigned int *INPUT, unsigned int &INPUT long *INPUT, long &INPUT unsigned long *INPUT, unsigned long &INPUT long long *INPUT, long long &INPUT unsigned long long *INPUT, unsigned long long &INPUT float *INPUT, float &INPUT double *INPUT, double &INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); In D you could then use it like this: double answer = fadd(10.0, 20.0); */ %define INPUT_TYPEMAP(TYPE, CTYPE, DTYPE) %typemap(ctype, out="void *") TYPE *INPUT, TYPE &INPUT "CTYPE" %typemap(imtype, out="void*") TYPE *INPUT, TYPE &INPUT "DTYPE" %typemap(dtype, out="DTYPE*") TYPE *INPUT, TYPE &INPUT "DTYPE" %typemap(din) TYPE *INPUT, TYPE &INPUT "$dinput" %typemap(in) TYPE *INPUT, TYPE &INPUT %{ $1 = ($1_ltype)&$input; %} %typemap(typecheck) TYPE *INPUT = TYPE; %typemap(typecheck) TYPE &INPUT = TYPE; %enddef INPUT_TYPEMAP(bool, unsigned int, bool) //INPUT_TYPEMAP(char, char, char) // Why was this commented out? INPUT_TYPEMAP(signed char, signed char, byte) INPUT_TYPEMAP(unsigned char, unsigned char, ubyte) INPUT_TYPEMAP(short, short, short) INPUT_TYPEMAP(unsigned short, unsigned short, ushort) INPUT_TYPEMAP(int, int, int) INPUT_TYPEMAP(unsigned int, unsigned int, uint) INPUT_TYPEMAP(long, long, SWIG_LONG_DTYPE) INPUT_TYPEMAP(unsigned long, unsigned long, SWIG_ULONG_DTYPE) INPUT_TYPEMAP(long long, long long, long) INPUT_TYPEMAP(unsigned long long, unsigned long long, ulong) INPUT_TYPEMAP(float, float, float) INPUT_TYPEMAP(double, double, double) INPUT_TYPEMAP(enum SWIGTYPE, unsigned int, int) %typemap(dtype) enum SWIGTYPE *INPUT, enum SWIGTYPE &INPUT "$*dclassname" #undef INPUT_TYPEMAP /* OUTPUT typemaps --------------- These typemaps are used for pointer/reference parameters that are output only and are mapped to a D output parameter. The following typemaps can be applied to turn a pointer or reference into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In D, the 'out' keyword is used when passing the parameter to a function that takes an output parameter. bool *OUTPUT, bool &OUTPUT signed char *OUTPUT, signed char &OUTPUT unsigned char *OUTPUT, unsigned char &OUTPUT short *OUTPUT, short &OUTPUT unsigned short *OUTPUT, unsigned short &OUTPUT int *OUTPUT, int &OUTPUT unsigned int *OUTPUT, unsigned int &OUTPUT long *OUTPUT, long &OUTPUT unsigned long *OUTPUT, unsigned long &OUTPUT long long *OUTPUT, long long &OUTPUT unsigned long long *OUTPUT, unsigned long long &OUTPUT float *OUTPUT, float &OUTPUT double *OUTPUT, double &OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters): double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The D output of the function would be the function return value and the value returned in the second output parameter. In D you would use it like this: double dptr; double fraction = modf(5, dptr); */ %define OUTPUT_TYPEMAP(TYPE, CTYPE, DTYPE, TYPECHECKPRECEDENCE) %typemap(ctype, out="void *") TYPE *OUTPUT, TYPE &OUTPUT "CTYPE *" %typemap(imtype, out="void*") TYPE *OUTPUT, TYPE &OUTPUT "out DTYPE" %typemap(dtype, out="DTYPE*") TYPE *OUTPUT, TYPE &OUTPUT "out DTYPE" %typemap(din) TYPE *OUTPUT, TYPE &OUTPUT "$dinput" %typemap(in) TYPE *OUTPUT, TYPE &OUTPUT %{ $1 = ($1_ltype)$input; %} %typecheck(SWIG_TYPECHECK_##TYPECHECKPRECEDENCE) TYPE *OUTPUT, TYPE &OUTPUT "" %enddef OUTPUT_TYPEMAP(bool, unsigned int, bool, BOOL_PTR) //OUTPUT_TYPEMAP(char, char, char, CHAR_PTR) // Why was this commented out? OUTPUT_TYPEMAP(signed char, signed char, byte, INT8_PTR) OUTPUT_TYPEMAP(unsigned char, unsigned char, ubyte, UINT8_PTR) OUTPUT_TYPEMAP(short, short, short, INT16_PTR) OUTPUT_TYPEMAP(unsigned short, unsigned short, ushort, UINT16_PTR) OUTPUT_TYPEMAP(int, int, int, INT32_PTR) OUTPUT_TYPEMAP(unsigned int, unsigned int, uint, UINT32_PTR) OUTPUT_TYPEMAP(long, long, SWIG_LONG_DTYPE,INT32_PTR) OUTPUT_TYPEMAP(unsigned long, unsigned long, SWIG_ULONG_DTYPE,UINT32_PTR) OUTPUT_TYPEMAP(long long, long long, long, INT64_PTR) OUTPUT_TYPEMAP(unsigned long long, unsigned long long, ulong, UINT64_PTR) OUTPUT_TYPEMAP(float, float, float, FLOAT_PTR) OUTPUT_TYPEMAP(double, double, double, DOUBLE_PTR) OUTPUT_TYPEMAP(enum SWIGTYPE, unsigned int, int, INT32_PTR) %typemap(dtype) enum SWIGTYPE *OUTPUT, enum SWIGTYPE &OUTPUT "out $*dclassname" #undef OUTPUT_TYPEMAP %typemap(in) bool *OUTPUT, bool &OUTPUT %{ *$input = 0; $1 = ($1_ltype)$input; %} /* INOUT typemaps -------------- These typemaps are for pointer/reference parameters that are both input and output and are mapped to a D reference parameter. The following typemaps can be applied to turn a pointer or reference into a reference parameters, that is the parameter is both an input and an output. In D, the 'ref' keyword is used for reference parameters. bool *INOUT, bool &INOUT signed char *INOUT, signed char &INOUT unsigned char *INOUT, unsigned char &INOUT short *INOUT, short &INOUT unsigned short *INOUT, unsigned short &INOUT int *INOUT, int &INOUT unsigned int *INOUT, unsigned int &INOUT long *INOUT, long &INOUT unsigned long *INOUT, unsigned long &INOUT long long *INOUT, long long &INOUT unsigned long long *INOUT, unsigned long long &INOUT float *INOUT, float &INOUT double *INOUT, double &INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); The D output of the function would be the new value returned by the reference parameter. In D you would use it like this: double x = 5.0; neg(x); The implementation of the OUTPUT and INOUT typemaps is different to the scripting languages in that the scripting languages will return the output value as part of the function return value. */ %define INOUT_TYPEMAP(TYPE, CTYPE, DTYPE, TYPECHECKPRECEDENCE) %typemap(ctype, out="void *") TYPE *INOUT, TYPE &INOUT "CTYPE *" %typemap(imtype, out="void*") TYPE *INOUT, TYPE &INOUT "ref DTYPE" %typemap(dtype, out="DTYPE*") TYPE *INOUT, TYPE &INOUT "ref DTYPE" %typemap(din) TYPE *INOUT, TYPE &INOUT "$dinput" %typemap(in) TYPE *INOUT, TYPE &INOUT %{ $1 = ($1_ltype)$input; %} %typecheck(SWIG_TYPECHECK_##TYPECHECKPRECEDENCE) TYPE *INOUT, TYPE &INOUT "" %enddef INOUT_TYPEMAP(bool, unsigned int, bool, BOOL_PTR) //INOUT_TYPEMAP(char, char, char, CHAR_PTR) INOUT_TYPEMAP(signed char, signed char, byte, INT8_PTR) INOUT_TYPEMAP(unsigned char, unsigned char, ubyte, UINT8_PTR) INOUT_TYPEMAP(short, short, short, INT16_PTR) INOUT_TYPEMAP(unsigned short, unsigned short, ushort, UINT16_PTR) INOUT_TYPEMAP(int, int, int, INT32_PTR) INOUT_TYPEMAP(unsigned int, unsigned int, uint, UINT32_PTR) INOUT_TYPEMAP(long, long, SWIG_LONG_DTYPE,INT32_PTR) INOUT_TYPEMAP(unsigned long, unsigned long, SWIG_ULONG_DTYPE,UINT32_PTR) INOUT_TYPEMAP(long long, long long, long, INT64_PTR) INOUT_TYPEMAP(unsigned long long, unsigned long long, ulong, UINT64_PTR) INOUT_TYPEMAP(float, float, float, FLOAT_PTR) INOUT_TYPEMAP(double, double, double, DOUBLE_PTR) INOUT_TYPEMAP(enum SWIGTYPE, unsigned int, int, INT32_PTR) %typemap(dtype) enum SWIGTYPE *INOUT, enum SWIGTYPE &INOUT "ref $*dclassname" #undef INOUT_TYPEMAP swig-4.0.2/Lib/d/wrapperloader.swg0000644000175000017500000001735113667507523016713 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wrapperloader.swg * * Support code for dynamically linking the C wrapper library from the D * wrapper module. * * The loading code was adapted from the Derelict project and is used with * permission from Michael Parker, the original author. * ----------------------------------------------------------------------------- */ %pragma(d) wrapperloadercode = %{ private { version(linux) { version = Nix; } else version(darwin) { version = Nix; } else version(OSX) { version = Nix; } else version(FreeBSD) { version = Nix; version = freebsd; } else version(freebsd) { version = Nix; } else version(Unix) { version = Nix; } else version(Posix) { version = Nix; } version(Tango) { static import tango.stdc.string; static import tango.stdc.stringz; version (PhobosCompatibility) { } else { alias char[] string; alias wchar[] wstring; alias dchar[] dstring; } } else { version(D_Version2) { static import std.conv; } else { static import std.c.string; } static import std.string; } version(D_Version2) { mixin("alias const(char)* CCPTR;"); } else { alias char* CCPTR; } CCPTR swigToCString(string str) { version(Tango) { return tango.stdc.stringz.toStringz(str); } else { return std.string.toStringz(str); } } string swigToDString(CCPTR cstr) { version(Tango) { return tango.stdc.stringz.fromStringz(cstr); } else { version(D_Version2) { mixin("return std.conv.to!string(cstr);"); } else { return std.c.string.toString(cstr); } } } } class SwigSwigSharedLibLoadException : Exception { this(in string[] libNames, in string[] reasons) { string msg = "Failed to load one or more shared libraries:"; foreach(i, n; libNames) { msg ~= "\n\t" ~ n ~ " - "; if(i < reasons.length) msg ~= reasons[i]; else msg ~= "Unknown"; } super(msg); } } class SwigSymbolLoadException : Exception { this(string SwigSharedLibName, string symbolName) { super("Failed to load symbol " ~ symbolName ~ " from shared library " ~ SwigSharedLibName); _symbolName = symbolName; } string symbolName() { return _symbolName; } private: string _symbolName; } private { version(Nix) { version(freebsd) { // the dl* functions are in libc on FreeBSD } else { pragma(lib, "dl"); } version(Tango) { import tango.sys.Common; } else version(linux) { import core.sys.posix.dlfcn; } else { extern(C) { const RTLD_NOW = 2; void *dlopen(CCPTR file, int mode); int dlclose(void* handle); void *dlsym(void* handle, CCPTR name); CCPTR dlerror(); } } alias void* SwigSharedLibHandle; SwigSharedLibHandle swigLoadSharedLib(string libName) { return dlopen(swigToCString(libName), RTLD_NOW); } void swigUnloadSharedLib(SwigSharedLibHandle hlib) { dlclose(hlib); } void* swigGetSymbol(SwigSharedLibHandle hlib, string symbolName) { return dlsym(hlib, swigToCString(symbolName)); } string swigGetErrorStr() { CCPTR err = dlerror(); if (err is null) { return "Unknown Error"; } return swigToDString(err); } } else version(Windows) { alias ushort WORD; alias uint DWORD; alias CCPTR LPCSTR; alias void* HMODULE; alias void* HLOCAL; alias int function() FARPROC; struct VA_LIST {} extern (Windows) { HMODULE LoadLibraryA(LPCSTR); FARPROC GetProcAddress(HMODULE, LPCSTR); void FreeLibrary(HMODULE); DWORD GetLastError(); DWORD FormatMessageA(DWORD, in void*, DWORD, DWORD, LPCSTR, DWORD, VA_LIST*); HLOCAL LocalFree(HLOCAL); } DWORD MAKELANGID(WORD p, WORD s) { return (((cast(WORD)s) << 10) | cast(WORD)p); } enum { LANG_NEUTRAL = 0, SUBLANG_DEFAULT = 1, FORMAT_MESSAGE_ALLOCATE_BUFFER = 256, FORMAT_MESSAGE_IGNORE_INSERTS = 512, FORMAT_MESSAGE_FROM_SYSTEM = 4096 } alias HMODULE SwigSharedLibHandle; SwigSharedLibHandle swigLoadSharedLib(string libName) { return LoadLibraryA(swigToCString(libName)); } void swigUnloadSharedLib(SwigSharedLibHandle hlib) { FreeLibrary(hlib); } void* swigGetSymbol(SwigSharedLibHandle hlib, string symbolName) { return GetProcAddress(hlib, swigToCString(symbolName)); } string swigGetErrorStr() { DWORD errcode = GetLastError(); LPCSTR msgBuf; DWORD i = FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, null, errcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), cast(LPCSTR)&msgBuf, 0, null); string text = swigToDString(msgBuf); LocalFree(cast(HLOCAL)msgBuf); if (i >= 2) { i -= 2; } return text[0 .. i]; } } else { static assert(0, "Operating system not supported by the wrapper loading code."); } final class SwigSharedLib { void load(string[] names) { if (_hlib !is null) return; string[] failedLibs; string[] reasons; foreach(n; names) { _hlib = swigLoadSharedLib(n); if (_hlib is null) { failedLibs ~= n; reasons ~= swigGetErrorStr(); continue; } _name = n; break; } if (_hlib is null) { throw new SwigSwigSharedLibLoadException(failedLibs, reasons); } } void* loadSymbol(string symbolName, bool doThrow = true) { void* sym = swigGetSymbol(_hlib, symbolName); if(doThrow && (sym is null)) { throw new SwigSymbolLoadException(_name, symbolName); } return sym; } void unload() { if(_hlib !is null) { swigUnloadSharedLib(_hlib); _hlib = null; } } private: string _name; SwigSharedLibHandle _hlib; } } static this() { string[] possibleFileNames; version (Posix) { version (OSX) { possibleFileNames ~= ["lib$wraplibrary.dylib", "lib$wraplibrary.bundle"]; } possibleFileNames ~= ["lib$wraplibrary.so"]; } else version (Windows) { possibleFileNames ~= ["$wraplibrary.dll", "lib$wraplibrary.so"]; } else { static assert(false, "Operating system not supported by the wrapper loading code."); } auto library = new SwigSharedLib; library.load(possibleFileNames); string bindCode(string functionPointer, string symbol) { return functionPointer ~ " = cast(typeof(" ~ functionPointer ~ "))library.loadSymbol(`" ~ symbol ~ "`);"; } //#if !defined(SWIG_D_NO_EXCEPTION_HELPER) mixin(bindCode("swigRegisterExceptionCallbacks$module", "SWIGRegisterExceptionCallbacks_$module")); //#endif // SWIG_D_NO_EXCEPTION_HELPER //#if !defined(SWIG_D_NO_STRING_HELPER) mixin(bindCode("swigRegisterStringCallback$module", "SWIGRegisterStringCallback_$module")); //#endif // SWIG_D_NO_STRING_HELPER $wrapperloaderbindcode } //#if !defined(SWIG_D_NO_EXCEPTION_HELPER) extern(C) void function( SwigExceptionCallback exceptionCallback, SwigExceptionCallback illegalArgumentCallback, SwigExceptionCallback illegalElementCallback, SwigExceptionCallback ioCallback, SwigExceptionCallback noSuchElementCallback) swigRegisterExceptionCallbacks$module; //#endif // SWIG_D_NO_EXCEPTION_HELPER //#if !defined(SWIG_D_NO_STRING_HELPER) extern(C) void function(SwigStringCallback callback) swigRegisterStringCallback$module; //#endif // SWIG_D_NO_STRING_HELPER %} %pragma(d) wrapperloaderbindcommand = %{ mixin(bindCode("$function", "$symbol"));%} swig-4.0.2/Lib/d/carrays.i0000644000175000017500000000502313667507523015131 0ustar williamwilliam/* ----------------------------------------------------------------------------- * carrays.i * * D-specific version of ../carrays.i. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %array_functions(TYPE,NAME) * * Generates functions for creating and accessing elements of a C array * (as pointers). Creates the following functions: * * TYPE *new_NAME(int nelements) * void delete_NAME(TYPE *); * TYPE NAME_getitem(TYPE *, int index); * void NAME_setitem(TYPE *, int index, TYPE value); * * ----------------------------------------------------------------------------- */ %define %array_functions(TYPE,NAME) %{ static TYPE *new_##NAME(int nelements) { %} #ifdef __cplusplus %{ return new TYPE[nelements](); %} #else %{ return (TYPE *) calloc(nelements,sizeof(TYPE)); %} #endif %{} static void delete_##NAME(TYPE *ary) { %} #ifdef __cplusplus %{ delete [] ary; %} #else %{ free(ary); %} #endif %{} static TYPE NAME##_getitem(TYPE *ary, int index) { return ary[index]; } static void NAME##_setitem(TYPE *ary, int index, TYPE value) { ary[index] = value; } %} TYPE *new_##NAME(int nelements); void delete_##NAME(TYPE *ary); TYPE NAME##_getitem(TYPE *ary, int index); void NAME##_setitem(TYPE *ary, int index, TYPE value); %enddef /* ----------------------------------------------------------------------------- * %array_class(TYPE,NAME) * * Generates a class wrapper around a C array. The class has the following * interface: * * struct NAME { * NAME(int nelements); * ~NAME(); * TYPE getitem(int index); * void setitem(int index, TYPE value); * TYPE * ptr(); * static NAME *frompointer(TYPE *t); * } * * ----------------------------------------------------------------------------- */ %define %array_class(TYPE,NAME) %{ typedef TYPE NAME; %} typedef struct {} NAME; %extend NAME { #ifdef __cplusplus NAME(int nelements) { return new TYPE[nelements](); } ~NAME() { delete [] self; } #else NAME(int nelements) { return (TYPE *) calloc(nelements,sizeof(TYPE)); } ~NAME() { free(self); } #endif TYPE getitem(int index) { return self[index]; } void setitem(int index, TYPE value) { self[index] = value; } TYPE * ptr() { return self; } static NAME *frompointer(TYPE *t) { return (NAME *) t; } }; %types(NAME = TYPE); %enddef swig-4.0.2/Lib/d/std_pair.i0000644000175000017500000000140513667507523015272 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.2/Lib/d/dhead.swg0000644000175000017500000002064013667507523015104 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dhead.swg * * Support code for exceptions if the SWIG_D_NO_EXCEPTION_HELPER is not defined * Support code for strings if the SWIG_D_NO_STRING_HELPER is not defined * * Support code for function pointers. ----------------------------------------------------------------------------- */ %insert(runtime) %{ #include #include #include /* Contract support. */ #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_DSetPendingException(SWIG_DException, msg); return nullreturn; } else %} /* * Exception support code. */ #if !defined(SWIG_D_NO_EXCEPTION_HELPER) %insert(runtime) %{ // Support for throwing D exceptions from C/C++. typedef enum { SWIG_DException = 0, SWIG_DIllegalArgumentException, SWIG_DIllegalElementException, SWIG_DIOException, SWIG_DNoSuchElementException } SWIG_DExceptionCodes; typedef void (* SWIG_DExceptionCallback_t)(const char *); typedef struct { SWIG_DExceptionCodes code; SWIG_DExceptionCallback_t callback; } SWIG_DException_t; static SWIG_DException_t SWIG_d_exceptions[] = { { SWIG_DException, NULL }, { SWIG_DIllegalArgumentException, NULL }, { SWIG_DIllegalElementException, NULL }, { SWIG_DIOException, NULL }, { SWIG_DNoSuchElementException, NULL } }; static void SWIGUNUSED SWIG_DSetPendingException(SWIG_DExceptionCodes code, const char *msg) { if ((size_t)code < sizeof(SWIG_d_exceptions)/sizeof(SWIG_DException_t)) { SWIG_d_exceptions[code].callback(msg); } else { SWIG_d_exceptions[SWIG_DException].callback(msg); } } #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGRegisterExceptionCallbacks_$module( SWIG_DExceptionCallback_t exceptionCallback, SWIG_DExceptionCallback_t illegalArgumentCallback, SWIG_DExceptionCallback_t illegalElementCallback, SWIG_DExceptionCallback_t ioCallback, SWIG_DExceptionCallback_t noSuchElementCallback) { SWIG_d_exceptions[SWIG_DException].callback = exceptionCallback; SWIG_d_exceptions[SWIG_DIllegalArgumentException].callback = illegalArgumentCallback; SWIG_d_exceptions[SWIG_DIllegalElementException].callback = illegalElementCallback; SWIG_d_exceptions[SWIG_DIOException].callback = ioCallback; SWIG_d_exceptions[SWIG_DNoSuchElementException].callback = noSuchElementCallback; } %} #if (SWIG_D_VERSION == 1) %pragma(d) imdmoduleimports=%{ // Exception throwing support currently requires Tango, but there is no reason // why it could not support Phobos. static import tango.core.Exception; static import tango.core.Thread; static import tango.stdc.stringz; %} %pragma(d) imdmodulecode=%{ private class SwigExceptionHelper { static this() { swigRegisterExceptionCallbacks$module( &setException, &setIllegalArgumentException, &setIllegalElementException, &setIOException, &setNoSuchElementException); } static void setException(char* message) { auto exception = new object.Exception(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } static void setIllegalArgumentException(char* message) { auto exception = new tango.core.Exception.IllegalArgumentException(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } static void setIllegalElementException(char* message) { auto exception = new tango.core.Exception.IllegalElementException(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } static void setIOException(char* message) { auto exception = new tango.core.Exception.IOException(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } static void setNoSuchElementException(char* message) { auto exception = new tango.core.Exception.NoSuchElementException(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } } package class SwigPendingException { public: static this() { m_sPendingException = new ThreadLocalData(null); } static bool isPending() { return m_sPendingException.val !is null; } static void set(object.Exception e) { auto pending = m_sPendingException.val; if (pending !is null) { e.next = pending; throw new object.Exception("FATAL: An earlier pending exception from C/C++ " ~ "code was missed and thus not thrown (" ~ pending.classinfo.name ~ ": " ~ pending.msg ~ ")!", e); } m_sPendingException.val = e; } static object.Exception retrieve() { auto e = m_sPendingException.val; m_sPendingException.val = null; return e; } private: // The reference to the pending exception (if any) is stored thread-local. alias tango.core.Thread.ThreadLocal!(object.Exception) ThreadLocalData; static ThreadLocalData m_sPendingException; } alias void function(char* message) SwigExceptionCallback; %} #else %pragma(d) imdmoduleimports=%{ static import std.conv; %} %pragma(d) imdmodulecode=%{ private class SwigExceptionHelper { static this() { // The D1/Tango version maps C++ exceptions to multiple exception types. swigRegisterExceptionCallbacks$module( &setException, &setException, &setException, &setException, &setException ); } static void setException(const char* message) { auto exception = new object.Exception(std.conv.to!string(message)); SwigPendingException.set(exception); } } package struct SwigPendingException { public: static this() { m_sPendingException = null; } static bool isPending() { return m_sPendingException !is null; } static void set(object.Exception e) { if (m_sPendingException !is null) { e.next = m_sPendingException; throw new object.Exception("FATAL: An earlier pending exception from C/C++ code " ~ "was missed and thus not thrown (" ~ m_sPendingException.classinfo.name ~ ": " ~ m_sPendingException.msg ~ ")!", e); } m_sPendingException = e; } static object.Exception retrieve() { auto e = m_sPendingException; m_sPendingException = null; return e; } private: // The reference to the pending exception (if any) is stored thread-local. static object.Exception m_sPendingException; } alias void function(const char* message) SwigExceptionCallback; %} #endif // Callback registering function in wrapperloader.swg. #endif // SWIG_D_NO_EXCEPTION_HELPER /* * String support code. */ #if !defined(SWIG_D_NO_STRING_HELPER) %insert(runtime) %{ // Callback for returning strings to D without leaking memory. typedef char * (* SWIG_DStringHelperCallback)(const char *); static SWIG_DStringHelperCallback SWIG_d_string_callback = NULL; #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGRegisterStringCallback_$module(SWIG_DStringHelperCallback callback) { SWIG_d_string_callback = callback; } %} #if (SWIG_D_VERSION == 1) %pragma(d) imdmoduleimports = "static import tango.stdc.stringz;"; %pragma(d) imdmodulecode = %{ private class SwigStringHelper { static this() { swigRegisterStringCallback$module(&createString); } static char* createString(char* cString) { // We are effectively dup'ing the string here. return tango.stdc.stringz.toStringz(tango.stdc.stringz.fromStringz(cString)); } } alias char* function(char* cString) SwigStringCallback; %} #else %pragma(d) imdmoduleimports = %{ static import std.conv; static import std.string; %} %pragma(d) imdmodulecode = %{ private class SwigStringHelper { static this() { swigRegisterStringCallback$module(&createString); } static const(char)* createString(const(char*) cString) { // We are effectively dup'ing the string here. // TODO: Is this also correct for D2/Phobos? return std.string.toStringz(std.conv.to!string(cString)); } } alias const(char)* function(const(char*) cString) SwigStringCallback; %} #endif // Callback registering function in wrapperloader.swg. #endif // SWIG_D_NO_STRING_HELPER /* * Function pointer support code. */ #if (SWIG_D_VERSION == 1) %pragma(d) imdmodulecode = %{ template SwigExternC(T) { static if (is(typeof(*(T.init)) R == return)) { static if (is(typeof(*(T.init)) P == function)) { alias extern(C) R function(P) SwigExternC; } } } %} #else %pragma(d) imdmodulecode = %{ template SwigExternC(T) if (is(typeof(*(T.init)) P == function)) { static if (is(typeof(*(T.init)) R == return)) { static if (is(typeof(*(T.init)) P == function)) { alias extern(C) R function(P) SwigExternC; } } } %} #endif swig-4.0.2/Lib/d/stl.i0000644000175000017500000000044313667507523014270 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/d/dvoid.swg0000644000175000017500000000105713667507523015145 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dvoid.swg * * Typemaps for handling void function return types and empty parameter lists. * ----------------------------------------------------------------------------- */ %typemap(ctype) void "void" %typemap(imtype) void "void" %typemap(dtype, cprimitive="1") void "void" %typemap(out, null="") void "" %typemap(ddirectorin) void "$winput" %typemap(ddirectorout) void "$dcall" %typemap(directorin) void "" %typemap(dout, excode=SWIGEXCODE) void { $imcall;$excode } swig-4.0.2/Lib/d/dexception.swg0000644000175000017500000000222613667507523016201 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dexception.swg * * Typemaps used for propagating C++ exceptions to D. * ----------------------------------------------------------------------------- */ // Code which is inserted into the dout typemaps and class constructors via // excode if exceptions can be thrown. %define SWIGEXCODE "\n if ($imdmodule.SwigPendingException.isPending) throw $imdmodule.SwigPendingException.retrieve();" %enddef %typemap(throws, canthrow=1) int, long, short, unsigned int, unsigned long, unsigned short %{ char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_DSetPendingException(SWIG_DException, error_msg); return $null; %} %typemap(throws, canthrow=1) SWIGTYPE, SWIGTYPE &, SWIGTYPE *, SWIGTYPE [ANY], enum SWIGTYPE, const enum SWIGTYPE & %{ (void)$1; SWIG_DSetPendingException(SWIG_DException, "C++ $1_type exception thrown"); return $null; %} %typemap(throws, canthrow=1) char * %{ SWIG_DSetPendingException(SWIG_DException, $1); return $null; %} swig-4.0.2/Lib/d/d.swg0000644000175000017500000000250513667507523014262 0ustar williamwilliam/* ----------------------------------------------------------------------------- * d.swg * * Main library file for the D language module. See the D chapter in the SWIG * manual for explanation on the typemaps, pragmas, etc. used. * ----------------------------------------------------------------------------- */ // Typemaps for exception handling. %include // Typemaps for primitive types. %include // Typemaps for non-primitive types (C/C++ classes and structs). %include // Typemaps for enumeration types. %include // Typemaps for member function pointers. %include // Typemaps for wrapping pointers to/arrays of C chars as D strings. %include // Typemaps for handling void function return types and empty parameter lists. %include // Typemaps containing D code used when generating D proxy classes. %include // Mapping of C++ operator overloading methods to D. %include // Helper code string and exception handling. %include // Wrapper loader code for dynamically linking the C wrapper library from the D // wrapper module. %include // List of all reserved D keywords. %include // D-specific directives. %include swig-4.0.2/Lib/d/std_string.i0000644000175000017500000000604513667507523015652 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * Typemaps for std::string and const std::string& * These are mapped to a D char[] and are passed around by value. * * To use non-const std::string references, use the following %apply. Note * that they are passed by value. * %apply const std::string & {std::string &}; * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; class string; %define SWIGD_STD_STRING_TYPEMAPS(DW_STRING_TYPE, DP_STRING_TYPE, FROM_STRINGZ, TO_STRINGZ) // string %typemap(ctype) string, const string & "char *" %typemap(imtype) string, const string & #DW_STRING_TYPE %typemap(dtype) string, const string & #DP_STRING_TYPE %typemap(in, canthrow=1) string, const string & %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "null string"); return $null; } $1.assign($input); %} %typemap(in, canthrow=1) const string & %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "null string"); return $null; } $*1_ltype $1_str($input); $1 = &$1_str; %} %typemap(out) string %{ $result = SWIG_d_string_callback($1.c_str()); %} %typemap(out) const string & %{ $result = SWIG_d_string_callback($1->c_str()); %} %typemap(din) string, const string & "($dinput ? TO_STRINGZ($dinput) : null)" %typemap(dout, excode=SWIGEXCODE) string, const string & { DP_STRING_TYPE ret = FROM_STRINGZ($imcall);$excode return ret; } %typemap(directorin) string, const string & %{ $input = SWIG_d_string_callback($1.c_str()); %} %typemap(directorout, canthrow=1) string %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "null string"); return $null; } $result.assign($input); %} %typemap(directorout, canthrow=1, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string & %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "null string"); return $null; } /* possible thread/reentrant code problem */ static $*1_ltype $1_str; $1_str = $input; $result = &$1_str; %} %typemap(ddirectorin) string, const string & "FROM_STRINGZ($winput)" %typemap(ddirectorout) string, const string & "TO_STRINGZ($dcall)" %typemap(throws, canthrow=1) string, const string & %{ SWIG_DSetPendingException(SWIG_DException, $1.c_str()); return $null; %} %typemap(typecheck) string, const string & = char *; %enddef // We need to have the \0-terminated string conversion functions available in // the D proxy modules. #if (SWIG_D_VERSION == 1) // Could be easily extended to support Phobos as well. SWIGD_STD_STRING_TYPEMAPS(char*, char[], tango.stdc.stringz.fromStringz, tango.stdc.stringz.toStringz) %pragma(d) globalproxyimports = "static import tango.stdc.stringz;"; #else SWIGD_STD_STRING_TYPEMAPS(const(char)*, string, std.conv.to!string, std.string.toStringz) %pragma(d) globalproxyimports = %{ static import std.conv; static import std.string; %} #endif #undef SWIGD_STD_STRING_TYPEMAPS } // namespace std swig-4.0.2/Lib/d/dprimitives.swg0000644000175000017500000001077513667507523016406 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dprimitves.swg * * Typemaps for primitive types. * ----------------------------------------------------------------------------- */ // C long/ulong width depends on the target arch, use stdlib aliases for them. #if (SWIG_D_VERSION == 1) %pragma(d) imdmoduleimports = "static import tango.stdc.config;" %pragma(d) globalproxyimports = "static import tango.stdc.config;" #define SWIG_LONG_DTYPE tango.stdc.config.c_long #define SWIG_ULONG_DTYPE tango.stdc.config.c_ulong #else %pragma(d) imdmoduleimports = "static import core.stdc.config;" %pragma(d) globalproxyimports = "static import core.stdc.config;" #define SWIG_LONG_DTYPE core.stdc.config.c_long #define SWIG_ULONG_DTYPE core.stdc.config.c_ulong #endif /* * The SWIG_D_PRIMITIVE macro is used to define the typemaps for the primitive * types, because are more or less the same for all of them. The few special * cases are handled below. */ %define SWIG_D_PRIMITIVE(TYPE, DTYPE) %typemap(ctype) TYPE, const TYPE & "TYPE" %typemap(imtype) TYPE, const TYPE & "DTYPE" %typemap(dtype, cprimitive="1") TYPE, const TYPE & "DTYPE" %typemap(in) TYPE "$1 = ($1_ltype)$input;" %typemap(out) TYPE "$result = $1;" %typemap(directorin) TYPE "$input = $1;" %typemap(directorout) TYPE "$result = ($1_ltype)$input;" %typemap(ddirectorin) TYPE "$winput" %typemap(ddirectorout) TYPE "$dcall" %typemap(in) const TYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const TYPE & "$result = *$1;" %typemap(directorin) const TYPE & "$input = $1;" %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const TYPE & %{ static $*1_ltype temp; temp = ($*1_ltype)$input; $result = &temp; %} %typemap(ddirectorin) const TYPE & "$winput" %typemap(ddirectorout) const TYPE & "$dcall" %typemap(din) TYPE, const TYPE & "$dinput" %typemap(dout, excode=SWIGEXCODE) TYPE, const TYPE & { auto ret = $imcall;$excode return ret; } %enddef SWIG_D_PRIMITIVE(bool, bool) SWIG_D_PRIMITIVE(char, char) SWIG_D_PRIMITIVE(signed char, byte) SWIG_D_PRIMITIVE(unsigned char, ubyte) SWIG_D_PRIMITIVE(short, short) SWIG_D_PRIMITIVE(unsigned short, ushort) SWIG_D_PRIMITIVE(int, int) SWIG_D_PRIMITIVE(unsigned int, uint) SWIG_D_PRIMITIVE(long, SWIG_LONG_DTYPE) SWIG_D_PRIMITIVE(unsigned long, SWIG_ULONG_DTYPE) SWIG_D_PRIMITIVE(size_t, size_t) SWIG_D_PRIMITIVE(long long, long) SWIG_D_PRIMITIVE(unsigned long long, ulong) SWIG_D_PRIMITIVE(float, float) SWIG_D_PRIMITIVE(double, double) // The C++ boolean type needs some special casing since it is not part of the // C standard and is thus represented as unsigned int in the C wrapper layer. %typemap(ctype) bool, const bool & "unsigned int" %typemap(imtype) bool, const bool & "uint" %typemap(in) bool "$1 = $input ? true : false;" %typemap(in) const bool & ($*1_ltype temp) %{ temp = $input ? true : false; $1 = &temp; %} %typemap(directorout) bool "$result = $input ? true : false;" %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const bool & %{ static $*1_ltype temp; temp = $input ? true : false; $result = &temp; %} %typemap(ddirectorin) bool "($winput ? true : false)" %typemap(dout, excode=SWIGEXCODE) bool, const bool & { bool ret = $imcall ? true : false;$excode return ret; } // Judging from the history of the C# module, the explicit casts are needed for // certain versions of VC++. %typemap(out) unsigned long "$result = (unsigned long)$1;" %typemap(out) const unsigned long & "$result = (unsigned long)*$1;" /* * Typecheck typemaps. */ %typecheck(SWIG_TYPECHECK_BOOL) bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) char, const char & "" %typecheck(SWIG_TYPECHECK_INT8) signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_UINT8) unsigned char, const unsigned char & "" %typecheck(SWIG_TYPECHECK_INT16) short, const short & "" %typecheck(SWIG_TYPECHECK_UINT16) unsigned short, const unsigned short & "" %typecheck(SWIG_TYPECHECK_INT32) int, long, const int &, const long & "" %typecheck(SWIG_TYPECHECK_UINT32) unsigned int, unsigned long, const unsigned int &, const unsigned long & "" %typecheck(SWIG_TYPECHECK_INT64) long long, const long long & "" %typecheck(SWIG_TYPECHECK_UINT64) unsigned long long, const unsigned long long & "" %typecheck(SWIG_TYPECHECK_FLOAT) float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) double, const double & "" swig-4.0.2/Lib/d/denums.swg0000644000175000017500000000362113667507523015332 0ustar williamwilliam/* ----------------------------------------------------------------------------- * denums.swg * * Typemaps for enumerations. * ----------------------------------------------------------------------------- */ /* * Typemaps for enumeration types. */ %typemap(ctype) enum SWIGTYPE "int" %typemap(imtype) enum SWIGTYPE "int" %typemap(dtype, cprimitive="1") enum SWIGTYPE "$dclassname" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (int)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE "$input = (int)$1;" %typemap(ddirectorin) enum SWIGTYPE "cast($dclassname)$winput" %typemap(ddirectorout) enum SWIGTYPE "cast(int)$dcall" %typemap(din) enum SWIGTYPE "cast(int)$dinput" %typemap(dout, excode=SWIGEXCODE) enum SWIGTYPE { $dclassname ret = cast($dclassname)$imcall;$excode return ret; } /* * Typemaps for (const) references to enumeration types. */ %typemap(ctype) const enum SWIGTYPE & "int" %typemap(imtype) const enum SWIGTYPE & "int" %typemap(dtype) const enum SWIGTYPE & "$*dclassname" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (int)*$1; %} %typemap(directorin) const enum SWIGTYPE & "$input = (int)$1;" %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(ddirectorin) const enum SWIGTYPE & "cast($*dclassname)$winput" %typemap(ddirectorout) const enum SWIGTYPE & "cast(int)$dcall" %typemap(din) const enum SWIGTYPE & "cast(int)$dinput" %typemap(dout, excode=SWIGEXCODE) const enum SWIGTYPE & { $*dclassname ret = cast($*dclassname)$imcall;$excode return ret; } swig-4.0.2/Lib/d/std_map.i0000644000175000017500000000342213667507523015115 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} namespace std { template > class map { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; } swig-4.0.2/Lib/d/boost_shared_ptr.i0000644000175000017500000002720013667507523017027 0ustar williamwilliam%include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor mods %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ((*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\"))) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in, canthrow=1) CONST TYPE ($&1_type argp = 0) %{ argp = ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0; if (!argp) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} %typemap(directorin) CONST TYPE %{ $input = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (new $1_ltype((const $1_ltype &)$1)); %} %typemap(directorout) CONST TYPE %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Attempt to dereference null $1_type"); return $null; } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $result = *smartarg->get(); %} // plain pointer %typemap(in, canthrow=1) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ $result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} %typemap(directorin) CONST TYPE * %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %} %typemap(directorout) CONST TYPE * %{ #error "typemaps for $1_type not available" %} // plain reference %typemap(in, canthrow=1) CONST TYPE & %{ $1 = ($1_ltype)(((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0); if (!$1) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "$1_type reference is null"); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(directorin) CONST TYPE & %{ $input = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (&$1 SWIG_NO_NULL_DELETER_0); %} %typemap(directorout) CONST TYPE & %{ #error "typemaps for $1_type not available" %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = (TYPE *)(((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(directorin) TYPE *CONST& %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %} %typemap(directorout) TYPE *CONST& %{ #error "typemaps for $1_type not available" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ if ($input) $1 = *($&1_ltype)$input; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ $result = $1 ? new $1_ltype($1) : 0; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ if ($input) { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $result = *smartarg; } %} // shared_ptr by reference %typemap(in, canthrow=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & ($*1_ltype tempnull) %{ $1 = $input ? ($1_ltype)$input : &tempnull; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ $result = *$1 ? new $*1_ltype(*$1) : 0; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "typemaps for $1_type not available" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * ($*1_ltype tempnull) %{ $1 = $input ? ($1_ltype)$input : &tempnull; %} %typemap(out, fragment="SWIG_null_deleter") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ $result = ($1 && *$1) ? new $*1_ltype(*($1_ltype)$1) : 0; if ($owner) delete $1; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ $input = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "typemaps for $1_type not available" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempnull, $*1_ltype temp = 0) %{ temp = $input ? *($1_ltype)&$input : &tempnull; $1 = &temp; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ *($1_ltype)&$result = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ $input = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "typemaps for $1_type not available" %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (ctype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "void *" %typemap (imtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "void*" %typemap (dtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(dtype, TYPE)" %typemap(din) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(dtype, TYPE).swigGetCPtr($dinput)" %typemap(ddirectorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(dtype, TYPE).swigGetCPtr($dcall)" %typemap(ddirectorin) CONST TYPE, CONST TYPE *, CONST TYPE &, TYPE *CONST& "($winput is null) ? null : new $typemap(dtype, TYPE)($winput, true)" %typemap(ddirectorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "($winput is null) ? null : new $typemap(dtype, TYPE)($winput, true)" %typemap(dout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) CONST TYPE { auto ret = new $typemap(dtype, TYPE)($imcall, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) CONST TYPE & { auto ret = new $typemap(dtype, TYPE)($imcall, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) CONST TYPE * { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) TYPE *CONST& { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } // Proxy classes (base classes, ie, not derived classes) %typemap(dbody) SWIGTYPE %{ private void* swigCPtr; private bool swigCMemOwn; public this(void* cObject, bool ownCObject) { swigCPtr = cObject; swigCMemOwn = ownCObject; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } %} // Derived proxy classes %typemap(dbody_derived) SWIGTYPE %{ private void* swigCPtr; private bool swigCMemOwn; public this(void* cObject, bool ownCObject) { super($imdmodule.$dclazznameSmartPtrUpcast(cObject), ownCObject); swigCPtr = cObject; swigCMemOwn = ownCObject; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } %} %typemap(ddispose, methodname="dispose", methodmodifiers="public") TYPE { synchronized(this) { if (swigCPtr !is null) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = null; } } } %typemap(ddispose_derived, methodname="dispose", methodmodifiers="public") TYPE { synchronized(this) { if (swigCPtr !is null) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = null; super.dispose(); } } } // Typecheck typemaps %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *") TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.2/Lib/swigerrors.swg0000644000175000017500000000076313667507523016026 0ustar williamwilliam/* Errors in SWIG */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 #define SWIG_IndexError -4 #define SWIG_TypeError -5 #define SWIG_DivisionByZero -6 #define SWIG_OverflowError -7 #define SWIG_SyntaxError -8 #define SWIG_ValueError -9 #define SWIG_SystemError -10 #define SWIG_AttributeError -11 #define SWIG_MemoryError -12 #define SWIG_NullReferenceError -13 swig-4.0.2/Lib/octave/0000755000175000017500000000000013667507523014351 5ustar williamwilliamswig-4.0.2/Lib/octave/octcontainer.swg0000644000175000017500000003744313667507523017576 0ustar williamwilliam/* ----------------------------------------------------------------------------- * octcontainer.swg * * Octave cell <-> C++ container wrapper * * This wrapper, and its iterator, allows a general use (and reuse) of * the mapping between C++ and Octave, thanks to the C++ templates. * * Of course, it needs the C++ compiler to support templates, but * since we will use this wrapper with the STL containers, that should * be the case. * ----------------------------------------------------------------------------- */ #if !defined(SWIG_NO_EXPORT_ITERATOR_METHODS) # if !defined(SWIG_EXPORT_ITERATOR_METHODS) # define SWIG_EXPORT_ITERATOR_METHODS SWIG_EXPORT_ITERATOR_METHODS # endif #endif %include // The Octave C++ Wrap %fragment(""); %include %fragment(SWIG_Traits_frag(octave_value),"header",fragment="StdTraits") { namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "octave_value"; } }; template <> struct traits_from { typedef octave_value value_type; static octave_value from(const value_type& val) { return val; } }; template <> struct traits_check { static bool check(const octave_value&) { return true; } }; template <> struct traits_asval { typedef octave_value value_type; static int asval(const octave_value& obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; } } %fragment("OctSequence_Base","header",fragment="") { namespace std { template <> struct less { bool operator()(const octave_value& v, const octave_value& w) const { octave_value res = do_binary_op(octave_value::op_le,v,w); return res.is_true(); } }; } namespace swig { inline size_t check_index(ptrdiff_t i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } inline size_t slice_index(ptrdiff_t i, size_t size) { if ( i < 0 ) { if ((size_t) (-i) <= size) { return (size_t) (i + size); } else { throw std::out_of_range("index out of range"); } } else { return ( (size_t) i < size ) ? ((size_t) i) : size; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline Sequence* getslice(const Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::const_iterator vb = self->begin(); typename Sequence::const_iterator ve = self->begin(); std::advance(vb,ii); std::advance(ve,jj); return new Sequence(vb, ve); } else { return new Sequence(); } } template inline void setslice(Sequence* self, Difference i, Difference j, const InputSeq& v) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj < ii) jj = ii; size_t ssize = jj - ii; if (ssize <= v.size()) { typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator vmid = v.begin(); std::advance(sb,ii); std::advance(vmid, jj - ii); self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end()); } else { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); self->insert(sb, v.begin(), v.end()); } } template inline void delslice(Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); } } } } %fragment("OctSequence_Cont","header", fragment="StdTraits", fragment="OctSequence_Base", fragment="OctSwigIterator_T") { namespace swig { template struct OctSequence_Ref // * octave can't support these, because of how assignment works { OctSequence_Ref(const octave_value& seq, int index) : _seq(seq), _index(index) { } operator T () const { // swig::SwigVar_PyObject item = OctSequence_GetItem(_seq, _index); octave_value item; // * todo try { return swig::as(item); } catch (const std::exception& e) { char msg[1024]; sprintf(msg, "in sequence element %d ", _index); if (!Octave_Error_Occurred()) { %type_error(swig::type_name()); } SWIG_Octave_AddErrorMsg(msg); SWIG_Octave_AddErrorMsg(e.what()); throw; } } OctSequence_Ref& operator=(const T& v) { // OctSequence_SetItem(_seq, _index, swig::from(v)); // * todo return *this; } private: octave_value _seq; int _index; }; template struct OctSequence_ArrowProxy { OctSequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; template struct OctSequence_InputIterator { typedef OctSequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef int difference_type; OctSequence_InputIterator() { } OctSequence_InputIterator(const octave_value& seq, int index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } OctSequence_ArrowProxy operator->() const { return OctSequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: octave_value _seq; difference_type _index; }; template struct OctSequence_Cont { typedef OctSequence_Ref reference; typedef const OctSequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef int difference_type; typedef int size_type; typedef const pointer const_pointer; typedef OctSequence_InputIterator iterator; typedef OctSequence_InputIterator const_iterator; OctSequence_Cont(const octave_value& seq) : _seq(seq) { // * assert that we have map type etc. /* if (!OctSequence_Check(seq)) { throw std::invalid_argument("a sequence is expected"); } _seq = seq; Py_INCREF(_seq); */ } ~OctSequence_Cont() { } size_type size() const { // return static_cast(OctSequence_Size(_seq)); return 0; // * todo } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } bool check() const { int s = size(); for (int i = 0; i < s; ++i) { // swig::SwigVar_PyObject item = OctSequence_GetItem(_seq, i); octave_value item; // * todo if (!swig::check(item)) return false; } return true; } private: octave_value _seq; }; } } %define %swig_sequence_iterator(Sequence...) #if defined(SWIG_EXPORT_ITERATOR_METHODS) class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; %typemap(out,noblock=1,fragment="OctSequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { $result = SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &)), swig::OctSwigIterator::descriptor(),SWIG_POINTER_OWN); } %typemap(out,fragment="OctSequence_Cont") std::pair, std::pair { octave_value_list tmpc; tmpc.append(SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).first), swig::OctSwigIterator::descriptor(),SWIG_POINTER_OWN)); tmpc.append(SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).second), swig::OctSwigIterator::descriptor(),SWIG_POINTER_OWN)); $result = Cell(tmpc); } %fragment("SwigPyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="OctSequence_Cont") {} %typemap(out,fragment="OctPairBoolOutputIterator") std::pair, std::pair { octave_value_list tmpc; tmpc.append(SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).first), swig::OctSwigIterator::descriptor(),SWIG_POINTER_OWN)); tmpc.append(SWIG_From(bool)(%static_cast($1,const $type &).second)); $result = Cell(tmpc); } %typemap(in,noblock=1,fragment="OctSequence_Cont") iterator(swig::OctSwigIterator *iter = 0, int res), reverse_iterator(swig::OctSwigIterator *iter = 0, int res), const_iterator(swig::OctSwigIterator *iter = 0, int res), const_reverse_iterator(swig::OctSwigIterator *iter = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::OctSwigIterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::OctSwigIterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="OctSequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { swig::OctSwigIterator *iter = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::OctSwigIterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %fragment("OctSequence_Cont"); #endif //SWIG_EXPORT_ITERATOR_METHODS %enddef // The octave container methods %define %swig_container_methods(Container...) %enddef %define %swig_sequence_methods_common(Sequence...) %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) %fragment("OctSequence_Base"); %extend { value_type pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty container"); Sequence::value_type x = self->back(); self->pop_back(); return x; } value_type __paren__(difference_type i) throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __paren_asgn__(difference_type i, value_type x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } void append(value_type x) { self->push_back(x); } } %enddef %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %enddef // // Common fragments // %fragment("StdSequenceTraits","header", fragment="StdTraits", fragment="OctSequence_Cont") { namespace swig { template inline void assign(const OctSeq& octseq, Seq* seq) { %#ifdef SWIG_STD_NOASSIGN_STL typedef typename OctSeq::value_type value_type; typename OctSeq::const_iterator it = octseq.begin(); for (;it != octseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } %#else seq->assign(octseq.begin(), octseq.end()); %#endif } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(const octave_value& obj, sequence **seq) { if (!obj.is_defined() || Swig::swig_value_deref(obj)) { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } %#if SWIG_OCTAVE_PREREQ(4,4,0) } else if (obj.iscell()) { %#else } else if (obj.is_cell()) { %#endif try { OctSequence_Cont octseq(obj); if (seq) { sequence *pseq = new sequence(); assign(octseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return octseq.check() ? SWIG_OK : SWIG_ERROR; } } catch (std::exception& e) { if (seq&&!error_state) error("swig type error: %s",e.what()); return SWIG_ERROR; } } return SWIG_ERROR; } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static octave_value from(const sequence& seq) { #ifdef SWIG_OCTAVE_EXTRA_NATIVE_CONTAINERS swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN); } #endif size_type size = seq.size(); if (size <= (size_type)INT_MAX) { Cell c(size,1); int i = 0; for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) { c(i) = swig::from(*it); } return c; } else { error("swig overflow error: sequence size not valid in octave"); return octave_value(); } return octave_value(); } }; } } swig-4.0.2/Lib/octave/std_complex.i0000644000175000017500000000111013667507523017035 0ustar williamwilliam/* * STD C++ complex typemaps */ %include namespace std { %naturalvar complex; template class complex; %template() complex; %template() complex; } /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-4.0.2/Lib/octave/std_deque.i0000644000175000017500000000124613667507523016503 0ustar williamwilliam// Deques %fragment("StdDequeTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(octave_value obj, std::deque **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static octave_value from(const std::deque& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_deque_methods(Type...) %swig_sequence_methods(Type) #define %swig_deque_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/octave/octstdcommon.swg0000644000175000017500000001351413667507523017610 0ustar williamwilliam%fragment("StdTraits","header",fragment="StdTraitsCommon") { namespace swig { // Traits that provides the from method template struct traits_from_ptr { static octave_value from(Type *val, int owner = 0) { return SWIG_NewPointerObj(val, type_info(), owner); } }; template struct traits_from { static octave_value from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static octave_value from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static octave_value from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline octave_value from(const Type& val) { return traits_from::from(val); } template inline octave_value from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } // Traits that provides the asval/as/check method template struct traits_asptr { static int asptr(const octave_value& obj, Type **val) { Type *p = 0; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(const octave_value& obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(const octave_value& obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(const octave_value& obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(const octave_value& obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(const octave_value& obj) { Type v; int res = asval(obj, &v); if (!obj.is_defined() || !SWIG_IsOK(res)) { if (!Octave_Error_Occurred()) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } return v; } }; template struct traits_as { static Type as(const octave_value& obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { if (!Octave_Error_Occurred()) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type* as(const octave_value& obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res)) { return v; } else { if (!Octave_Error_Occurred()) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template inline Type as(const octave_value& obj) { return traits_as::category>::as(obj); } template struct traits_check { static bool check(const octave_value& obj) { int res = asval(obj, (Type *)(0)); return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(const octave_value& obj) { int res = asptr(obj, (Type **)(0)); return SWIG_IsOK(res) ? true : false; } }; template inline bool check(const octave_value& obj) { return traits_check::category>::check(obj); } } } %define %specialize_std_container(Type,Check,As,From) %{ namespace swig { template <> struct traits_asval { typedef Type value_type; static int asval(const octave_value& obj, value_type *val) { if (Check(obj)) { if (val) *val = As(obj); return SWIG_OK; } return SWIG_ERROR; } }; template <> struct traits_from { typedef Type value_type; static octave_value from(const value_type& val) { return From(val); } }; template <> struct traits_check { static int check(const octave_value& obj) { int res = Check(obj); return obj && res ? res : 0; } }; } %} %enddef #define specialize_std_vector(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_list(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_deque(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_set(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_multiset(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) swig-4.0.2/Lib/octave/director.swg0000644000175000017500000000650713667507523016716 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Octave proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) namespace Swig { class Director { octave_swig_type *self; bool swig_disowned; Director(const Director &x); Director &operator=(const Director &rhs); public: Director(void *vptr):self(0), swig_disowned(false) { set_rtdir(vptr, this); } ~Director() { swig_director_destroyed(self, this); if (swig_disowned) self->decref(); } void swig_set_self(octave_swig_type *new_self) { assert(!swig_disowned); self = new_self; } octave_swig_type *swig_get_self() const { return self; } void swig_disown() { if (swig_disowned) return; swig_disowned = true; self->incref(); } }; // Base class for director exceptions. class DirectorException : public std::exception { public: static void raise(const char *msg) { // ... todo throw DirectorException(); } static void raise(const octave_value &ov, const char *msg) { // ... todo raise(msg); } }; class DirectorTypeMismatchException : public DirectorException { public: static void raise(const char *msg) { // ... todo throw DirectorTypeMismatchException(); } static void raise(const octave_value &ov, const char *msg) { // ... todo raise(msg); } }; class DirectorPureVirtualException : public DirectorException { public: static void raise(const char *msg) { // ... todo throw DirectorPureVirtualException(); } static void raise(const octave_value &ov, const char *msg) { // ... todo raise(msg); } }; SWIGINTERN rtdir_map *get_rtdir_map() { static swig_module_info *module = 0; if (!module) module = SWIG_GetModule(0); if (!module) return 0; if (!module->clientdata) module->clientdata = new rtdir_map; return (rtdir_map *) module->clientdata; } SWIGINTERNINLINE void set_rtdir(void *vptr, Director *d) { rtdir_map *rm = get_rtdir_map(); if (rm) (*rm)[vptr] = d; } SWIGINTERNINLINE void erase_rtdir(void *vptr) { rtdir_map *rm = get_rtdir_map(); if (rm) (*rm).erase(vptr); } SWIGINTERNINLINE Director *get_rtdir(void *vptr) { rtdir_map *rm = get_rtdir_map(); if (!rm) return 0; rtdir_map::const_iterator pos = rm->find(vptr); Director *rtdir = (pos != rm->end())? pos->second : 0; return rtdir; } SWIGRUNTIME void swig_director_destroyed(octave_swig_type *self, Director *d) { self->director_destroyed(d); } SWIGRUNTIME octave_swig_type *swig_director_get_self(Director *d) { return d->swig_get_self(); } SWIGRUNTIME void swig_director_set_self(Director *d, octave_swig_type *self) { d->swig_set_self(self); } } SWIGRUNTIME void swig_acquire_ownership(void *vptr) { // assert(0); // ... todo } SWIGRUNTIME void swig_acquire_ownership_array(void *vptr) { // assert(0); // ... todo } SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own) { // assert(0); // ... todo } swig-4.0.2/Lib/octave/std_shared_ptr.i0000644000175000017500000000010413667507523017523 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.2/Lib/octave/octopers.swg0000644000175000017500000000510113667507523016726 0ustar williamwilliam/* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus // operators supported in Octave, and the methods they are routed to // __brace__ a{args} // __brace_asgn__ a{args} = rhs // __paren__ a(args) // __paren_asgn__ a(args) = rhs // __str__ generates string rep // __not__ !a // __uplus__ +a // __uminus__ -a // __transpose__ a.' // __hermitian__ a' // __incr__ a++ // __decr__ a-- // __add__ a + b // __sub__ a - b // __mul__ a * b // __div__ a / b // __pow__ a ^ b // __ldiv__ a \ b // __lt__ a < b // __le__ a <= b // __eq__ a == b // __ge__ a >= b // __gt__ a > b // __ne__ a != b // __el_mul__ a .* b // __el_div__ a ./ b // __el_pow__ a .^ b // __el_ldiv__ a .\ b // __el_and__ a & b // __el_or__ a | b // operators supported in C++, and the methods that route to them %rename(__add__) *::operator+; %rename(__add__) *::operator+(); %rename(__add__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__uminus__) *::operator-(); %rename(__uminus__) *::operator-() const; %rename(__mul__) *::operator*; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__el_and__) *::operator&&; %rename(__el_or__) *::operator||; %rename(__xor__) *::operator^; %rename(__invert__) *::operator~; %rename(__lt__) *::operator<; %rename(__le__) *::operator<=; %rename(__gt__) *::operator>; %rename(__ge__) *::operator>=; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; %rename(__not__) *::operator!; %rename(__incr__) *::operator++; %rename(__decr__) *::operator--; %rename(__paren__) *::operator(); %rename(__brace__) *::operator[]; // Ignored inplace operators %ignoreoperator(PLUSEQ) operator+=; %ignoreoperator(MINUSEQ) operator-=; %ignoreoperator(MULEQ) operator*=; %ignoreoperator(DIVEQ) operator/=; %ignoreoperator(MODEQ) operator%=; %ignoreoperator(LSHIFTEQ) operator<<=; %ignoreoperator(RSHIFTEQ) operator>>=; %ignoreoperator(ANDEQ) operator&=; %ignoreoperator(OREQ) operator|=; %ignoreoperator(XOREQ) operator^=; // Ignored operators %ignoreoperator(EQ) operator=; %ignoreoperator(ARROWSTAR) operator->*; %ignoreoperator(LSHIFT) operator<<; %ignoreoperator(RSHIFT) operator>>; #endif /* __cplusplus */ swig-4.0.2/Lib/octave/std_vector.i0000644000175000017500000000127413667507523016703 0ustar williamwilliam// Vectors %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const octave_value& obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static octave_value from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/octave/octave.swg0000644000175000017500000000033613667507523016356 0ustar williamwilliam%include %include %include %include %include %include %define %docstring %feature("docstring") %enddef swig-4.0.2/Lib/octave/std_alloc.i0000644000175000017500000000003313667507523016463 0ustar williamwilliam%include swig-4.0.2/Lib/octave/octfragments.swg0000644000175000017500000000000113667507523017556 0ustar williamwilliam swig-4.0.2/Lib/octave/std_container.i0000644000175000017500000000007313667507523017357 0ustar williamwilliam%include %include swig-4.0.2/Lib/octave/std_carray.i0000644000175000017500000000000013667507523016644 0ustar williamwilliamswig-4.0.2/Lib/octave/std_wstring.i0000644000175000017500000000004313667507523017067 0ustar williamwilliam%include swig-4.0.2/Lib/octave/attribute.i0000644000175000017500000000004213667507523016522 0ustar williamwilliam%include swig-4.0.2/Lib/octave/cmalloc.i0000644000175000017500000000004013667507523016127 0ustar williamwilliam%include swig-4.0.2/Lib/octave/std_basic_string.i0000644000175000017500000000315513667507523020050 0ustar williamwilliam#if !defined(SWIG_STD_STRING) #define SWIG_STD_BASIC_STRING #define SWIG_STD_MODERN_STL %include #define %swig_basic_string(Type...) %swig_sequence_methods_val(Type) %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(octave_value obj, std::string **val) { if (obj.is_string()) { if (val) *val = new std::string(obj.string_value()); return SWIG_NEWOBJ; } return SWIG_ERROR; } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromCharPtrAndSize") { SWIGINTERNINLINE octave_value SWIG_From(std::basic_string)(const std::string& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } } %ignore std::basic_string::operator +=; %include %typemaps_asptrfromn(%checkcode(STRING), std::basic_string); #endif #if !defined(SWIG_STD_WSTRING) %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsWCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(octave_value obj, std::wstring **val) { if (obj.is_string()) { if (val) *val = new std::wstring(obj.string_value()); return SWIG_NEWOBJ; } return SWIG_ERROR; } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromWCharPtrAndSize") { SWIGINTERNINLINE PyObject* SWIG_From(std::basic_string)(const std::wstring& s) { return SWIG_FromWCharPtrAndSize(s.data(), s.size()); } } %typemaps_asptrfromn(%checkcode(UNISTRING), std::basic_string); #endif swig-4.0.2/Lib/octave/octiterators.swg0000644000175000017500000002164113667507523017621 0ustar williamwilliam/* ----------------------------------------------------------------------------- * octiterators.swg * * Users can derive form the OctSwigIterator to implement their * own iterators. As an example (real one since we use it for STL/STD * containers), the template OctSwigIterator_T does the * implementation for generic C++ iterators. * ----------------------------------------------------------------------------- */ %include %fragment("OctSwigIterator","header",fragment="") { namespace swig { struct stop_iteration { }; struct OctSwigIterator { private: octave_value _seq; protected: OctSwigIterator(octave_value seq) : _seq(seq) { } public: virtual ~OctSwigIterator() {} virtual octave_value value() const = 0; virtual OctSwigIterator *incr(size_t n = 1) = 0; virtual OctSwigIterator *decr(size_t n = 1) { throw stop_iteration(); } virtual ptrdiff_t distance(const OctSwigIterator &x) const { throw std::invalid_argument("operation not supported"); } virtual bool equal (const OctSwigIterator &x) const { throw std::invalid_argument("operation not supported"); } virtual OctSwigIterator *copy() const = 0; octave_value next() { octave_value obj = value(); incr(); return obj; } octave_value previous() { decr(); return value(); } OctSwigIterator *advance(ptrdiff_t n) { return (n > 0) ? incr(n) : decr(-n); } bool operator == (const OctSwigIterator& x) const { return equal(x); } bool operator != (const OctSwigIterator& x) const { return ! operator==(x); } OctSwigIterator* operator ++ () { incr(); return this; } OctSwigIterator* operator -- () { decr(); return this; } OctSwigIterator* operator + (ptrdiff_t n) const { return copy()->advance(n); } OctSwigIterator* operator - (ptrdiff_t n) const { return copy()->advance(-n); } ptrdiff_t operator - (const OctSwigIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::OctSwigIterator *"); init = 1; } return desc; } }; } } %fragment("OctSwigIterator_T","header",fragment="",fragment="OctSwigIterator",fragment="StdTraits",fragment="StdIteratorTraits") { namespace swig { template class OctSwigIterator_T : public OctSwigIterator { public: typedef OutIterator out_iterator; typedef typename std::iterator_traits::value_type value_type; typedef OctSwigIterator_T self_type; OctSwigIterator_T(out_iterator curr, octave_value seq) : OctSwigIterator(seq), current(curr) { } const out_iterator& get_current() const { return current; } bool equal (const OctSwigIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } ptrdiff_t distance(const OctSwigIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } protected: out_iterator current; }; template struct from_oper { typedef const ValueType& argument_type; typedef octave_value result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; template::value_type, typename FromOper = from_oper > class OctSwigIteratorOpen_T : public OctSwigIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef OctSwigIterator_T base; typedef OctSwigIteratorOpen_T self_type; OctSwigIteratorOpen_T(out_iterator curr, octave_value seq) : OctSwigIterator_T(curr, seq) { } octave_value value() const { return from(static_cast(*(base::current))); } OctSwigIterator *copy() const { return new self_type(*this); } OctSwigIterator *incr(size_t n = 1) { while (n--) { ++base::current; } return this; } OctSwigIterator *decr(size_t n = 1) { while (n--) { --base::current; } return this; } }; template::value_type, typename FromOper = from_oper > class OctSwigIteratorClosed_T : public OctSwigIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef OctSwigIterator_T base; typedef OctSwigIteratorClosed_T self_type; OctSwigIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, octave_value seq) : OctSwigIterator_T(curr, seq), begin(first), end(last) { } octave_value value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } OctSwigIterator *copy() const { return new self_type(*this); } OctSwigIterator *incr(size_t n = 1) { while (n--) { if (base::current == end) { throw stop_iteration(); } else { ++base::current; } } return this; } OctSwigIterator *decr(size_t n = 1) { while (n--) { if (base::current == begin) { throw stop_iteration(); } else { --base::current; } } return this; } private: out_iterator begin; out_iterator end; }; template inline OctSwigIterator* make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, octave_value seq = octave_value()) { return new OctSwigIteratorClosed_T(current, begin, end, seq); } template inline OctSwigIterator* make_output_iterator(const OutIter& current, octave_value seq = octave_value()) { return new OctSwigIteratorOpen_T(current, seq); } } } %fragment("OctSwigIterator"); namespace swig { // Throw a StopIteration exception %ignore stop_iteration; struct stop_iteration {}; %typemap(throws) stop_iteration { error("stop_iteration exception"); SWIG_fail; } // Mark methods that return new objects %newobject OctSwigIterator::copy; %newobject OctSwigIterator::operator + (ptrdiff_t n) const; %newobject OctSwigIterator::operator - (ptrdiff_t n) const; %nodirector OctSwigIterator; %catches(swig::stop_iteration) OctSwigIterator::value() const; %catches(swig::stop_iteration) OctSwigIterator::incr(size_t n = 1); %catches(swig::stop_iteration) OctSwigIterator::decr(size_t n = 1); %catches(std::invalid_argument) OctSwigIterator::distance(const OctSwigIterator &x) const; %catches(std::invalid_argument) OctSwigIterator::equal (const OctSwigIterator &x) const; %catches(swig::stop_iteration) OctSwigIterator::next(); %catches(swig::stop_iteration) OctSwigIterator::previous(); %catches(swig::stop_iteration) OctSwigIterator::advance(ptrdiff_t n); %catches(swig::stop_iteration) OctSwigIterator::operator += (ptrdiff_t n); %catches(swig::stop_iteration) OctSwigIterator::operator -= (ptrdiff_t n); %catches(swig::stop_iteration) OctSwigIterator::operator + (ptrdiff_t n) const; %catches(swig::stop_iteration) OctSwigIterator::operator - (ptrdiff_t n) const; struct OctSwigIterator { protected: OctSwigIterator(octave_value seq); public: virtual ~OctSwigIterator(); virtual octave_value value() const = 0; virtual OctSwigIterator *incr(size_t n = 1) = 0; virtual OctSwigIterator *decr(size_t n = 1); virtual ptrdiff_t distance(const OctSwigIterator &x) const; virtual bool equal (const OctSwigIterator &x) const; virtual OctSwigIterator *copy() const = 0; octave_value next(); octave_value previous(); OctSwigIterator *advance(ptrdiff_t n); bool operator == (const OctSwigIterator& x) const; bool operator != (const OctSwigIterator& x) const; OctSwigIterator* operator ++ (); OctSwigIterator* operator -- (); OctSwigIterator* operator + (ptrdiff_t n) const; OctSwigIterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const OctSwigIterator& x) const; }; } swig-4.0.2/Lib/octave/extra-install.list0000644000175000017500000000005313667507523020033 0ustar williamwilliam# see top-level Makefile.in octheaders.hpp swig-4.0.2/Lib/octave/implicit.i0000644000175000017500000000043713667507523016341 0ustar williamwilliam%include %include #warning "This file provides the %implicit directive, which is an old and fragile" #warning "way to implement the C++ implicit conversion mechanism." #warning "Try using the more robust '%implicitconv Type;' directive instead." swig-4.0.2/Lib/octave/std_common.i0000644000175000017500000000443013667507523016666 0ustar williamwilliam%include %include // Generate the traits for a 'primitive' type, such as 'double', // for which the SWIG_AsVal and SWIG_From methods are already defined. %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(octave_value obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static octave_value from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(octave_value obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static octave_value from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-4.0.2/Lib/octave/std_except.i0000644000175000017500000000004313667507523016662 0ustar williamwilliam%include swig-4.0.2/Lib/octave/octprimtypes.swg0000644000175000017500000001344713667507523017646 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ // boolean %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE octave_value SWIG_From_dec(bool)(bool value) { return octave_value(value); } } %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(const octave_value& ov, bool *val) { %#if SWIG_OCTAVE_PREREQ(4,4,0) if (!ov.islogical()) %#else if (!ov.is_bool_type()) %#endif return SWIG_ERROR; if (val) *val = ov.bool_value(); return SWIG_OK; } } // long %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE octave_value SWIG_From_dec(long) (long value) { return octave_value(value); } } %fragment(SWIG_AsVal_frag(long),"header") { SWIGINTERN int SWIG_AsVal_dec(long)(const octave_value& ov, long* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (ov.is_double_type()||ov.is_single_type()) { double v=ov.double_value(); if (v!=floor(v)) return SWIG_TypeError; } if (val) *val = ov.long_value(); return SWIG_OK; } } // unsigned long %fragment(SWIG_From_frag(unsigned long),"header") { SWIGINTERNINLINE octave_value SWIG_From_dec(unsigned long) (unsigned long value) { return octave_value(value); } } %fragment(SWIG_AsVal_frag(unsigned long),"header") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(const octave_value& ov, unsigned long* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (ov.is_double_type()||ov.is_single_type()) { double v=ov.double_value(); if (v<0) return SWIG_OverflowError; if (v!=floor(v)) return SWIG_TypeError; } if (ov.is_int8_type()||ov.is_int16_type()|| ov.is_int32_type()) { long v=ov.long_value(); if (v<0) return SWIG_OverflowError; } if (ov.is_int64_type()) { long long v=ov.int64_scalar_value().value(); if (v<0) return SWIG_OverflowError; } if (val) *val = ov.ulong_value(); return SWIG_OK; } } // long long %fragment(SWIG_From_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE octave_value SWIG_From_dec(long long) (long long value) { return octave_int64(value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(const octave_value& ov, long long* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (ov.is_double_type()||ov.is_single_type()) { double v=ov.double_value(); if (v!=floor(v)) return SWIG_TypeError; } if (val) { if (ov.is_int64_type()) *val = ov.int64_scalar_value().value(); else if (ov.is_uint64_type()) *val = ov.uint64_scalar_value().value(); else *val = ov.long_value(); } return SWIG_OK; } %#endif } %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE octave_value SWIG_From_dec(unsigned long long) (unsigned long long value) { return octave_uint64(value); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(const octave_value& ov, unsigned long long* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (ov.is_double_type()||ov.is_single_type()) { double v=ov.double_value(); if (v<0) return SWIG_OverflowError; if (v!=floor(v)) return SWIG_TypeError; } if (ov.is_int8_type()||ov.is_int16_type()|| ov.is_int32_type()) { long v=ov.long_value(); if (v<0) return SWIG_OverflowError; } if (ov.is_int64_type()) { long long v=ov.int64_scalar_value().value(); if (v<0) return SWIG_OverflowError; } if (val) { if (ov.is_int64_type()) *val = ov.int64_scalar_value().value(); else if (ov.is_uint64_type()) *val = ov.uint64_scalar_value().value(); else *val = ov.long_value(); } return SWIG_OK; } %#endif } // double %fragment(SWIG_From_frag(double),"header") { SWIGINTERNINLINE octave_value SWIG_From_dec(double) (double value) { return octave_value(value); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(const octave_value& ov, double* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (val) *val = ov.double_value(); return SWIG_OK; } } // const char* (strings) %fragment("SWIG_AsCharPtrAndSize","header") { SWIGINTERN int SWIG_AsCharPtrAndSize(octave_value ov, char** cptr, size_t* psize, int *alloc) { if ( %#if SWIG_OCTAVE_PREREQ(4,4,0) ov.iscell() %#else ov.is_cell() %#endif && ov.rows() == 1 && ov.columns() == 1) ov = ov.cell_value()(0); if (!ov.is_string()) return SWIG_TypeError; std::string str=ov.string_value(); size_t len=str.size(); char* cstr=(char*)str.c_str(); if (alloc) { *cptr = %new_copy_array(cstr, len + 1, char); *alloc = SWIG_NEWOBJ; } else if (cptr) *cptr = cstr; if (psize) *psize = len + 1; return SWIG_OK; } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE octave_value SWIG_FromCharPtrAndSize(const char* carray, size_t size) { return std::string(carray,carray+size); } } swig-4.0.2/Lib/octave/typemaps.i0000644000175000017500000000004113667507523016360 0ustar williamwilliam%include swig-4.0.2/Lib/octave/octcomplex.swg0000644000175000017500000000450013667507523017247 0ustar williamwilliam/* Defines the As/From conversors for double/float complex, you need to provide complex Type, the Name you want to use in the conversors, the complex Constructor method, and the Real and Imag complex accesor methods. See the std_complex.i and ccomplex.i for concrete examples. */ /* the common from conversor */ %define %swig_fromcplx_conv(Type, OctConstructor, Real, Imag) %fragment(SWIG_From_frag(Type),"header") { SWIGINTERNINLINE octave_value SWIG_From(Type)(const Type& c) { return octave_value(OctConstructor(Real(c), Imag(c))); } } %enddef // the double case %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal(Type) (const octave_value& ov, Type* val) { if (ov.is_complex_scalar()) { if (val) { Complex c(ov.complex_value()); *val=Constructor(c.real(),c.imag()); } return SWIG_OK; } else { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(ov, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Complex, Real, Imag); %enddef // the float case %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float)) { SWIGINTERN int SWIG_AsVal(Type) (const octave_value& ov, Type* val) { if (ov.is_complex_scalar()) { if (val) { Complex c(ov.complex_value()); double re = c.real(); double im = c.imag(); if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else return SWIG_OverflowError; } } else { float d; int res = SWIG_AddCast(SWIG_AsVal(float)(ov, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, FloatComplex, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-4.0.2/Lib/octave/carrays.i0000644000175000017500000000020113667507523016160 0ustar williamwilliam%define %array_class(TYPE,NAME) %array_class_wrap(TYPE,NAME,__paren__,__paren_asgn__) %enddef %include swig-4.0.2/Lib/octave/std_pair.i0000644000175000017500000000666413667507523016344 0ustar williamwilliam// Pairs %include //#define SWIG_STD_PAIR_ASVAL %fragment("StdPairTraits","header",fragment="StdTraits") { namespace swig { #ifdef SWIG_STD_PAIR_ASVAL template struct traits_asval > { typedef std::pair value_type; static int get_pair(const octave_value& first, octave_value second, std::pair *val) { if (val) { T *pfirst = &(val->first); int res1 = swig::asval(first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = &(val->second); int res2 = swig::asval(second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } else { T *pfirst = 0; int res1 = swig::asval(first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asval(const octave_value& obj, std::pair *val) { if ( %#if SWIG_OCTAVE_PREREQ(4,4,0) obj.iscell() %#else obj.is_cell() %#endif ) { Cell c=obj.cell_value(); if (c.numel()<2) { error("pair from Cell array requires at least two elements"); return SWIG_ERROR; } return get_pair(c(0),c(1),val); } else { value_type *p; swig_type_info *descriptor = swig::type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = *p; return res; } return SWIG_ERROR; } }; #else template struct traits_asptr > { typedef std::pair value_type; static int get_pair(const octave_value& first, octave_value second, std::pair **val) { if (val) { value_type *vp = %new_instance(std::pair); T *pfirst = &(vp->first); int res1 = swig::asval(first, pfirst); if (!SWIG_IsOK(res1)) { %delete(vp); return res1; } U *psecond = &(vp->second); int res2 = swig::asval(second, psecond); if (!SWIG_IsOK(res2)) { %delete(vp); return res2; } *val = vp; return SWIG_AddNewMask(res1 > res2 ? res1 : res2); } else { T *pfirst = 0; int res1 = swig::asval(first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval(second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } return SWIG_ERROR; } static int asptr(const octave_value& obj, std::pair **val) { if ( %#if SWIG_OCTAVE_PREREQ(4,4,0) obj.iscell() %#else obj.is_cell() %#endif ) { Cell c=obj.cell_value(); if (c.numel()<2) { error("pair from Cell array requires at least two elements"); return SWIG_ERROR; } return get_pair(c(0),c(1),val); } else { value_type *p; swig_type_info *descriptor = swig::type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; return res; } return SWIG_ERROR; } }; #endif template struct traits_from > { static octave_value from(const std::pair& val) { Cell c(1,2); c(0)=swig::from(val.first); c(1)=swig::from(val.second); return c; } }; } } %define %swig_pair_methods(pair...) %enddef %include swig-4.0.2/Lib/octave/std_char_traits.i0000644000175000017500000000004113667507523017673 0ustar williamwilliam%include swig-4.0.2/Lib/octave/octuserdir.swg0000644000175000017500000000342613667507523017263 0ustar williamwilliam/* ------------------------------------------------------------------------- * Special user directives * ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* Implicit Conversion using the C++ constructor mechanism */ #define %implicitconv %feature("implicitconv") #define %noimplicitconv %feature("implicitconv", "0") #define %clearimplicitconv %feature("implicitconv", "") /* ------------------------------------------------------------------------- */ /* %extend_smart_pointer extend the smart pointer support. For example, if you have a smart pointer as: template class RCPtr { public: ... RCPtr(Type *p); Type * operator->() const; ... }; you use the %extend_smart_pointer directive as: %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; then, if you have something like: RCPtr make_ptr(); int foo(A *); you can do the following: a = make_ptr(); b = foo(a); ie, swig will accept a RCPtr object where a 'A *' is expected. Also, when using vectors %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; %template(vector_A) std::vector >; you can type a = A(); v = vector_A(2) v[0] = a ie, an 'A *' object is accepted, via implicit conversion, where a RCPtr object is expected. Additionally x = v[0] returns (and sets 'x' as) a copy of v[0], making reference counting possible and consistent. */ %define %extend_smart_pointer(Type...) %implicitconv Type; %apply const SWIGTYPE& SMARTPOINTER { const Type& }; %apply SWIGTYPE SMARTPOINTER { Type }; %enddef swig-4.0.2/Lib/octave/stl.i0000644000175000017500000000044313667507523015326 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/octave/octheaders.hpp0000644000175000017500000000772213667507523017213 0ustar williamwilliam// // This header includes all C++ headers required for generated Octave wrapper code. // Using a single header file allows pre-compilation of Octave headers, as follows: // * Check out this header file: // swig -octave -co octheaders.hpp // * Pre-compile header file into octheaders.hpp.gch: // g++ -c ... octheaders.hpp // * Use pre-compiled header file: // g++ -c -include octheaders.hpp ... // #if !defined(_SWIG_OCTAVE_OCTHEADERS_HPP) #define _SWIG_OCTAVE_OCTHEADERS_HPP // Required C++ headers #include #include #include #include #include #include #include #include #include // Minimal headers to define Octave version #include #include // Macro for enabling features which require Octave version >= major.minor.patch // - Use (OCTAVE_PATCH_VERSION + 0) to handle both '' (released) and '+' (in development) patch numbers #define SWIG_OCTAVE_PREREQ(major, minor, patch) \ ( (OCTAVE_MAJOR_VERSION<<16) + (OCTAVE_MINOR_VERSION<<8) + (OCTAVE_PATCH_VERSION + 0) >= ((major)<<16) + ((minor)<<8) + (patch) ) // Reconstruct Octave major, minor, and patch versions for releases prior to 3.8.1 #if !defined(OCTAVE_MAJOR_VERSION) # if !defined(OCTAVE_API_VERSION_NUMBER) // Hack to distinguish between Octave 3.8.0, which removed OCTAVE_API_VERSION_NUMBER but did not yet // introduce OCTAVE_MAJOR_VERSION, and Octave <= 3.2, which did not define OCTAVE_API_VERSION_NUMBER # include # if defined(octave_ov_h) # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 8 # define OCTAVE_PATCH_VERSION 0 # else // Hack to distinguish between Octave 3.2 and earlier versions, before OCTAVE_API_VERSION_NUMBER existed # define ComplexLU __ignore # include # undef ComplexLU # if defined(octave_Complex_LU_h) // We know only that this version is prior to Octave 3.2, i.e. OCTAVE_API_VERSION_NUMBER < 37 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 1 # define OCTAVE_PATCH_VERSION 99 # else // OCTAVE_API_VERSION_NUMBER == 37 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 2 # define OCTAVE_PATCH_VERSION 0 # endif // defined(octave_Complex_LU_h) # endif // defined(octave_ov_h) // Correlation between Octave API and version numbers extracted from Octave's // ChangeLogs; version is the *earliest* released Octave with that API number # elif OCTAVE_API_VERSION_NUMBER >= 48 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 6 # define OCTAVE_PATCH_VERSION 0 # elif OCTAVE_API_VERSION_NUMBER >= 45 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 4 # define OCTAVE_PATCH_VERSION 1 # elif OCTAVE_API_VERSION_NUMBER >= 42 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 54 # elif OCTAVE_API_VERSION_NUMBER >= 41 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 53 # elif OCTAVE_API_VERSION_NUMBER >= 40 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 52 # elif OCTAVE_API_VERSION_NUMBER >= 39 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 51 # else // OCTAVE_API_VERSION_NUMBER == 38 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 50 # endif // !defined(OCTAVE_API_VERSION_NUMBER) #endif // !defined(OCTAVE_MAJOR_VERSION) // Required Octave headers #include #include #include #include #include #include #include #if SWIG_OCTAVE_PREREQ(4,2,0) #include #else #include #endif #include #if SWIG_OCTAVE_PREREQ(4,2,0) #include #endif #endif // !defined(_SWIG_OCTAVE_OCTHEADERS_HPP) swig-4.0.2/Lib/octave/octrun.swg0000644000175000017500000014123513667507523016413 0ustar williamwilliam#if !SWIG_OCTAVE_PREREQ(3,2,0) #define SWIG_DEFUN(cname, wname, doc) DEFUNX_DLD(#cname, wname, FS ## cname, args, nargout, doc) #else #define SWIG_DEFUN(cname, wname, doc) DEFUNX_DLD(#cname, wname, G ## cname, args, nargout, doc) #endif SWIGRUNTIME bool SWIG_check_num_args(const char *func_name, int num_args, int max_args, int min_args, int varargs) { if (num_args > max_args && !varargs) error("function %s takes at most %i arguments", func_name, max_args); else if (num_args < min_args) error("function %s requires at least %i arguments", func_name, min_args); else return true; return false; } SWIGRUNTIME octave_value_list *SWIG_Octave_AppendOutput(octave_value_list *ovl, const octave_value &ov) { ovl->append(ov); return ovl; } SWIGRUNTIME octave_value SWIG_ErrorType(int code) { switch (code) { case SWIG_MemoryError: return "SWIG_MemoryError"; case SWIG_IOError: return "SWIG_IOError"; case SWIG_RuntimeError: return "SWIG_RuntimeError"; case SWIG_IndexError: return "SWIG_IndexError"; case SWIG_TypeError: return "SWIG_TypeError"; case SWIG_DivisionByZero: return "SWIG_DivisionByZero"; case SWIG_OverflowError: return "SWIG_OverflowError"; case SWIG_SyntaxError: return "SWIG_SyntaxError"; case SWIG_ValueError: return "SWIG_ValueError"; case SWIG_SystemError: return "SWIG_SystemError"; case SWIG_AttributeError: return "SWIG_AttributeError"; } return "SWIG unknown error"; } SWIGRUNTIME octave_value SWIG_Error(int code, const char *msg) { octave_value type(SWIG_ErrorType(code)); std::string r = msg; r += " (" + type.string_value() + ")"; error("%s", r.c_str()); return octave_value(r); } #define SWIG_fail goto fail #define SWIG_Octave_ConvertPtr(obj, pptr, type, flags) SWIG_Octave_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Octave_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Octave_ConvertPtrAndOwn(obj, pptr, type, flags, own) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Octave_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Octave_NewPointerObj(ptr, type, flags) #define swig_owntype int #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Octave_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Octave_NewPackedObj(ptr, sz, type) #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Octave_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Octave_NewPackedObj(ptr, sz, type) #define SWIG_GetModule(clientdata) SWIG_Octave_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Octave_SetModule(clientdata,pointer); #define SWIG_MODULE_CLIENTDATA_TYPE void* #define Octave_Error_Occurred() 0 #define SWIG_Octave_AddErrorMsg(msg) {;} SWIGRUNTIME swig_module_info *SWIG_Octave_GetModule(void *clientdata); SWIGRUNTIME void SWIG_Octave_SetModule(void *clientdata, swig_module_info *pointer); // For backward compatibility only #define SWIG_POINTER_EXCEPTION 0 #define SWIG_arg_fail(arg) 0 // Runtime API implementation typedef octave_value_list(*octave_func) (const octave_value_list &, int); class octave_swig_type; namespace Swig { #ifdef SWIG_DIRECTORS class Director; typedef std::map < void *, Director * > rtdir_map; SWIGINTERN rtdir_map* get_rtdir_map(); SWIGINTERNINLINE void set_rtdir(void *vptr, Director *d); SWIGINTERNINLINE void erase_rtdir(void *vptr); SWIGINTERNINLINE Director *get_rtdir(void *vptr); SWIGRUNTIME void swig_director_destroyed(octave_swig_type *self, Director *d); SWIGRUNTIME octave_swig_type *swig_director_get_self(Director *d); SWIGRUNTIME void swig_director_set_self(Director *d, octave_swig_type *self); #endif SWIGRUNTIME octave_base_value *swig_value_ref(octave_swig_type *ost); SWIGRUNTIME octave_swig_type *swig_value_deref(octave_value ov); SWIGRUNTIME octave_swig_type *swig_value_deref(const octave_base_value &ov); } #ifdef SWIG_DIRECTORS SWIGRUNTIME void swig_acquire_ownership(void *vptr); SWIGRUNTIME void swig_acquire_ownership_array(void *vptr); SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); #endif struct swig_octave_member { const char *name; octave_func method; octave_func get_method; octave_func set_method; int flags; // 1 static, 2 global const char *doc; bool is_static() const { return flags &1; } bool is_global() const { return flags &2; } }; struct swig_octave_class { const char *name; swig_type_info **type; int director; octave_func constructor; const char *constructor_doc; octave_func destructor; const swig_octave_member *members; const char **base_names; const swig_type_info **base; }; #if SWIG_OCTAVE_PREREQ(4,4,0) // in Octave 4.4 behaviour of octave_builtin() appears to have changed and 'self' argument is no longer passed // to function (maybe because this is now a 'method'??) so need to create our own octave_function subclass #define SWIG_OCTAVE_BOUND_FUNC(func, args) octave_value(new octave_swig_bound_func(func, args)) class octave_swig_bound_func : public octave_function { public: octave_swig_bound_func(void) : octave_function(), method(0), first_args() { } octave_swig_bound_func(octave_function* _method, octave_value_list _first_args) : octave_function("", ""), method(_method), first_args(_first_args) { } octave_swig_bound_func(const octave_swig_bound_func& f) = delete; octave_swig_bound_func& operator= (const octave_swig_bound_func& f) = delete; ~octave_swig_bound_func(void) = default; bool is_function(void) const { return true; } octave_function* function_value(bool = false) { return this; } octave_value_list call(octave::tree_evaluator& tw, int nargout = 0, const octave_value_list& args = octave_value_list()) { octave_value_list all_args; all_args.append(first_args); all_args.append(args); return method->call(tw, nargout, all_args); } octave_value subsref(const std::string &ops, const std::list < octave_value_list > &idx) { octave_value_list ovl = subsref(ops, idx, 1); return ovl.length() ? ovl(0) : octave_value(); } octave_value_list subsref(const std::string &ops, const std::list < octave_value_list > &idx, int nargout) { assert(ops.size() > 0); assert(ops.size() == idx.size()); if (ops != "(") error("invalid function call"); octave::tree_evaluator& tw = octave::interpreter::the_interpreter()->get_evaluator(); return call(tw, nargout, *idx.begin()); } protected: octave_function* method; octave_value_list first_args; std::set dispatch_classes; }; #else #define SWIG_OCTAVE_BOUND_FUNC(func, args) octave_value(func) #endif // octave_swig_type plays the role of both the shadow class and the class // representation within Octave, since there is no support for classes. // // These should really be decoupled, with the class support added to Octave // and the shadow class given by an m-file script. That would dramatically // reduce the runtime complexity, and be more in line w/ other modules. class octave_swig_type:public octave_base_value { struct cpp_ptr { void *ptr; bool destroyed; cpp_ptr(void *_ptr):ptr(_ptr), destroyed(false) { }}; typedef std::pair < const swig_type_info *, cpp_ptr > type_ptr_pair; mutable swig_module_info *module; const swig_type_info *construct_type; // type of special type object std::vector < type_ptr_pair > types; // our c++ base classes int own; // whether we call c++ destructors when we die typedef std::pair < const swig_octave_member *, octave_value > member_value_pair; typedef std::map < std::string, member_value_pair > member_map; member_map members; bool always_static; const swig_octave_member *find_member(const swig_type_info *type, const std::string &name) { if (!type->clientdata) return 0; swig_octave_class *c = (swig_octave_class *) type->clientdata; const swig_octave_member *m; for (m = c->members; m->name; ++m) if (m->name == name) return m; for (int j = 0; c->base_names[j]; ++j) { if (!c->base[j]) { if (!module) module = SWIG_GetModule(0); assert(module); c->base[j] = SWIG_MangledTypeQueryModule(module, module, c->base_names[j]); } if (!c->base[j]) return 0; if ((m = find_member(c->base[j], name))) return m; } return 0; } member_value_pair *find_member(const std::string &name, bool insert_if_not_found) { member_map::iterator it = members.find(name); if (it != members.end()) return &it->second; const swig_octave_member *m; for (unsigned int j = 0; j < types.size(); ++j) if ((m = find_member(types[j].first, name))) return &members.insert(std::make_pair(name, std::make_pair(m, octave_value()))).first->second; if (!insert_if_not_found) return 0; return &members[name]; } const swig_type_info *find_base(const std::string &name, const swig_type_info *base) { if (!base) { for (unsigned int j = 0; j < types.size(); ++j) { assert(types[j].first->clientdata); swig_octave_class *cj = (swig_octave_class *) types[j].first->clientdata; if (cj->name == name) return types[j].first; } return 0; } assert(base->clientdata); swig_octave_class *c = (swig_octave_class *) base->clientdata; for (int j = 0; c->base_names[j]; ++j) { if (!c->base[j]) { if (!module) module = SWIG_GetModule(0); assert(module); c->base[j] = SWIG_MangledTypeQueryModule(module, module, c->base_names[j]); } if (!c->base[j]) return 0; assert(c->base[j]->clientdata); swig_octave_class *cj = (swig_octave_class *) c->base[j]->clientdata; if (cj->name == name) return c->base[j]; } return 0; } void load_members(const swig_octave_class* c,member_map& out) const { for (const swig_octave_member *m = c->members; m->name; ++m) { if (out.find(m->name) == out.end()) out.insert(std::make_pair(m->name, std::make_pair(m, octave_value()))); } for (int j = 0; c->base_names[j]; ++j) { if (!c->base[j]) { if (!module) module = SWIG_GetModule(0); assert(module); c->base[j] = SWIG_MangledTypeQueryModule(module, module, c->base_names[j]); } if (!c->base[j]) continue; assert(c->base[j]->clientdata); const swig_octave_class *cj = (const swig_octave_class *) c->base[j]->clientdata; load_members(cj,out); } } void load_members(member_map& out) const { out=members; for (unsigned int j = 0; j < types.size(); ++j) if (types[j].first->clientdata) load_members((const swig_octave_class *) types[j].first->clientdata, out); } octave_value_list member_invoke(member_value_pair *m, const octave_value_list &args, int nargout) { if (m->second.is_defined()) return m->second.subsref("(", std::list < octave_value_list > (1, args), nargout); else if (m->first && m->first->method) return m->first->method(args, nargout); error("member not defined or not invocable"); return octave_value_list(); } bool dispatch_unary_op(const std::string &symbol, octave_value &ret) const { octave_swig_type *nc_this = const_cast < octave_swig_type *>(this); member_value_pair *m = nc_this->find_member(symbol, false); if (!m || m->first->is_static() || m->first->is_global()) return false; octave_value_list args; args.append(nc_this->as_value()); octave_value_list argout(nc_this->member_invoke(m, args, 1)); if (argout.length() < 1) return false; ret = argout(0); return true; } bool dispatch_binary_op(const std::string &symbol, const octave_base_value &rhs, octave_value &ret) const { octave_swig_type *nc_this = const_cast < octave_swig_type *>(this); member_value_pair *m = nc_this->find_member(symbol, false); if (!m || m->first->is_static() || m->first->is_global()) return false; octave_value_list args; args.append(nc_this->as_value()); args.append(make_value_hack(rhs)); octave_value_list argout(nc_this->member_invoke(m, args, 1)); if (argout.length() < 1) return false; ret = argout(0); return true; } bool dispatch_index_op(const std::string &symbol, const octave_value_list &rhs, octave_value_list &ret) const { octave_swig_type *nc_this = const_cast < octave_swig_type *>(this); member_value_pair *m = nc_this->find_member(symbol, false); if (!m || m->first->is_static() || m->first->is_global()) return false; octave_value_list args; args.append(nc_this->as_value()); args.append(rhs); octave_value_list argout(nc_this->member_invoke(m, args, 1)); if (argout.length() >= 1) ret = argout(0); return true; } octave_value_list member_deref(member_value_pair *m, const octave_value_list &args) { if (m->second.is_defined()) { if (m->second.is_function() || m->second.is_function_handle()) { return SWIG_OCTAVE_BOUND_FUNC(m->second.function_value(), args); } else { return m->second; } } else if (m->first) { if (m->first->get_method) return m->first->get_method(args, 1); else if (m->first->method) return SWIG_OCTAVE_BOUND_FUNC(new octave_builtin(m->first->method), args); } error("undefined member"); return octave_value_list(); } static octave_value make_value_hack(const octave_base_value &x) { ((octave_swig_type &) x).count++; return octave_value((octave_base_value *) &x); } octave_swig_type(const octave_swig_type &x); octave_swig_type &operator=(const octave_swig_type &rhs); public: octave_swig_type(void *_ptr = 0, const swig_type_info *_type = 0, int _own = 0, bool _always_static = false) : module(0), construct_type(_ptr ? 0 : _type), own(_own), always_static(_always_static) { if (_type || _ptr) types.push_back(std::make_pair(_type, _ptr)); #ifdef SWIG_DIRECTORS if (_ptr) { Swig::Director *d = Swig::get_rtdir(_ptr); if (d) Swig::swig_director_set_self(d, this); } #endif } ~octave_swig_type() { if (own) { ++count; for (unsigned int j = 0; j < types.size(); ++j) { if (!types[j].first || !types[j].first->clientdata) continue; swig_octave_class *c = (swig_octave_class *) types[j].first->clientdata; if (c->destructor && !types[j].second.destroyed && types[j].second.ptr) { c->destructor(as_value(), 0); } } } #ifdef SWIG_DIRECTORS for (unsigned int j = 0; j < types.size(); ++j) Swig::erase_rtdir(types[j].second.ptr); #endif } dim_vector dims(void) const { octave_value out; if (!dispatch_unary_op("__dims__", out)) return dim_vector(1,1); // Return value should be cell or matrix of integers #if SWIG_OCTAVE_PREREQ(4,4,0) if (out.iscell()) { #else if (out.is_cell()) { #endif const Cell & c=out.cell_value(); int ndim = c.rows(); if (ndim==1 && c.columns()!=1) ndim = c.columns(); dim_vector d; d.resize(ndim < 2 ? 2 : ndim); d(0) = d(1) = 1; // Fill in dim_vector for (int k=0;k a = out.int_vector_value(); if (error_state) return dim_vector(1,1); dim_vector d; d.resize(a.numel() < 2 ? 2 : a.numel()); d(0) = d(1) = 1; for (int k=0;kclientdata) return 0; swig_octave_class *c = (swig_octave_class *) types[0].first->clientdata; return c->constructor_doc; } std::string swig_type_name() const { // * need some way to manually name subclasses. // * eg optional first arg to subclass(), or named_subclass() std::string ret; for (unsigned int j = 0; j < types.size(); ++j) { if (j) ret += "_"; if (types[j].first->clientdata) { swig_octave_class *c = (swig_octave_class *) types[j].first->clientdata; ret += c->name; } else ret += types[j].first->name; } return ret; } void merge(octave_swig_type &rhs) { rhs.own = 0; for (unsigned int j = 0; j < rhs.types.size(); ++j) { assert(!rhs.types[j].second.destroyed); #ifdef SWIG_DIRECTORS Swig::Director *d = Swig::get_rtdir(rhs.types[j].second.ptr); if (d) Swig::swig_director_set_self(d, this); #endif } types.insert(types.end(), rhs.types.begin(), rhs.types.end()); members.insert(rhs.members.begin(), rhs.members.end()); #if SWIG_OCTAVE_PREREQ(4,4,0) assign(rhs.swig_type_name(), rhs.as_value()); #else rhs.types.clear(); rhs.members.clear(); #endif } typedef member_map::const_iterator swig_member_const_iterator; swig_member_const_iterator swig_members_begin() { return members.begin(); } swig_member_const_iterator swig_members_end() { return members.end(); } int cast(void **vptr, swig_type_info *type, int *_own, int flags) { int res = SWIG_ERROR; if (_own) *_own = own; if (flags &SWIG_POINTER_DISOWN) own = 0; if (!type && types.size()) { if(vptr) *vptr = types[0].second.ptr; return SWIG_OK; } for (unsigned int j = 0; j < types.size(); ++j) if (type == types[j].first) { if(vptr) *vptr = types[j].second.ptr; return SWIG_OK; } for (unsigned int j = 0; j < types.size(); ++j) { swig_cast_info *tc = SWIG_TypeCheck(types[j].first->name, type); if (!tc) continue; if(vptr) { int newmemory = 0; *vptr = SWIG_TypeCast(tc, types[j].second.ptr, &newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(_own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (_own) *_own = *_own | SWIG_CAST_NEW_MEMORY; } } res = SWIG_OK; break; } return res; } bool is_owned() const { return own; } #ifdef SWIG_DIRECTORS void director_destroyed(Swig::Director *d) { bool found = false; for (unsigned int j = 0; j < types.size(); ++j) { Swig::Director *dj = Swig::get_rtdir(types[j].second.ptr); if (dj == d) { types[j].second.destroyed = true; found = true; } } assert(found); } #endif void assign(const std::string &name, const octave_value &ov) { members[name] = std::make_pair((const swig_octave_member *) 0, ov); } void assign(const std::string &name, const swig_octave_member *m) { members[name] = std::make_pair(m, octave_value()); } octave_base_value *clone() const { // pass-by-value is probably not desired, and is harder; // requires calling copy constructors of contained types etc. assert(0); *(int *) 0 = 0; return 0; } octave_base_value *empty_clone() const { return new octave_swig_type(); } bool is_defined() const { return true; } virtual bool is_map() const { return true; } virtual octave_value subsref(const std::string &ops, const std::list < octave_value_list > &idx) { octave_value_list ovl = subsref(ops, idx, 1); return ovl.length()? ovl(0) : octave_value(); } virtual octave_value_list subsref(const std::string &ops, const std::list < octave_value_list > &idx, int nargout) { assert(ops.size() > 0); assert(ops.size() == idx.size()); std::list < octave_value_list >::const_iterator idx_it = idx.begin(); int skip = 0; octave_value_list sub_ovl; // constructor invocation if (ops[skip] == '(' && construct_type) { assert(construct_type->clientdata); swig_octave_class *c = (swig_octave_class *) construct_type->clientdata; if (!c->constructor) { error("cannot create instance"); return octave_value_list(); } octave_value_list args; if (c->director) args.append(Swig::swig_value_ref(new octave_swig_type(this, 0, 0))); args.append(*idx_it++); ++skip; sub_ovl = c->constructor(args, nargout); } // member dereference or invocation else if (ops[skip] == '.') { std::string subname; const swig_type_info *base = 0; // eg, a.base.base_cpp_mem for (;;) { octave_value_list subname_ovl(*idx_it++); ++skip; assert(subname_ovl.length() == 1 && subname_ovl(0).is_string()); subname = subname_ovl(0).string_value(); const swig_type_info *next_base = find_base(subname, base); if (!next_base || skip >= (int) ops.size() || ops[skip] != '.') break; base = next_base; } member_value_pair tmp, *m = &tmp; if (!base || !(m->first = find_member(base, subname))) m = find_member(subname, false); if (!m) { error("member not found"); return octave_value_list(); } octave_value_list args; if (!always_static && (!m->first || (!m->first->is_static() && !m->first->is_global()))) args.append(as_value()); if (skip < (int) ops.size() && ops[skip] == '(' && ((m->first && m->first->method) || m->second.is_function() || m->second.is_function_handle())) { args.append(*idx_it++); ++skip; sub_ovl = member_invoke(m, args, nargout); } else { sub_ovl = member_deref(m, args); } } // index operator else { if (ops[skip] == '(' || ops[skip] == '{') { const char *op_name = ops[skip] == '(' ? "__paren__" : "__brace__"; octave_value_list args; args.append(*idx_it++); ++skip; if (!dispatch_index_op(op_name, args, sub_ovl)) { error("error evaluating index operator"); return octave_value_list(); } } else { error("unsupported subsref"); return octave_value_list(); } } if (skip >= (int) ops.size()) return sub_ovl; if (sub_ovl.length() < 1) { error("bad subs ref"); return octave_value_list(); } return sub_ovl(0).next_subsref(nargout, ops, idx, skip); } octave_value subsasgn(const std::string &ops, const std::list < octave_value_list > &idx, const octave_value &rhs) { assert(ops.size() > 0); assert(ops.size() == idx.size()); std::list < octave_value_list >::const_iterator idx_it = idx.begin(); int skip = 0; if (ops.size() > 1) { std::list < octave_value_list >::const_iterator last = idx.end(); --last; std::list < octave_value_list > next_idx(idx.begin(), last); octave_value next_ov = subsref(ops.substr(0, ops.size() - 1), next_idx); next_ov.subsasgn(ops.substr(ops.size() - 1), std::list < octave_value_list > (1, *last), rhs); } else if (ops[skip] == '(' || ops[skip] == '{') { const char *op_name = ops[skip] == '(' ? "__paren_asgn__" : "__brace_asgn__"; member_value_pair *m = find_member(op_name, false); if (m) { octave_value_list args; args.append(as_value()); args.append(*idx_it); args.append(rhs); member_invoke(m, args, 1); } else error("%s member not found", op_name); } else if (ops[skip] == '.') { octave_value_list subname_ovl(*idx_it++); ++skip; assert(subname_ovl.length() == 1 &&subname_ovl(0).is_string()); std::string subname = subname_ovl(0).string_value(); member_value_pair *m = find_member(subname, true); if (!m->first || !m->first->set_method) { m->first = 0; m->second = rhs; } else if (m->first->set_method) { octave_value_list args; if (!m->first->is_static() && !m->first->is_global()) args.append(as_value()); args.append(rhs); m->first->set_method(args, 1); } else error("member not assignable"); } else error("unsupported subsasgn"); return as_value(); } virtual bool is_object() const { return true; } virtual bool is_string() const { octave_swig_type *nc_this = const_cast < octave_swig_type *>(this); return !!nc_this->find_member("__str__", false); } virtual std::string string_value(bool force = false) const { octave_value ret; if (!dispatch_unary_op("__str__", ret)) { error("__str__ method not defined"); return std::string(); } if (!ret.is_string()) { error("__str__ method did not return a string"); return std::string(); } return ret.string_value(); } virtual double scalar_value(bool frc_str_conv = false) const { octave_value ret; if (!dispatch_unary_op("__float__", ret)) { error("__float__ method not defined"); } return ret.scalar_value(); } #if SWIG_OCTAVE_PREREQ(4,2,0) virtual octave_value as_double(void) const { octave_value ret; if (!dispatch_unary_op("__float__", ret)) { error("__float__ method not defined"); } return ret.as_double(); } virtual octave_value as_single(void) const { octave_value ret; if (!dispatch_unary_op("__float__", ret)) { error("__float__ method not defined"); } return ret.as_single(); } #endif #if SWIG_OCTAVE_PREREQ(3,8,0) virtual octave_value map(octave_base_value::unary_mapper_t umap) const { const std::string opname = std::string("__") + octave_base_value::get_umap_name(umap) + std::string("__"); octave_value ret; if (!dispatch_unary_op(opname, ret)) { error("%s", (opname + std::string(" method not found")).c_str()); return octave_value(); } return ret; } #endif #if SWIG_OCTAVE_PREREQ(3,3,52) virtual octave_map map_value() const { return octave_map(); } #else virtual Octave_map map_value() const { return Octave_map(); } #endif virtual string_vector map_keys() const { member_map tmp; load_members(tmp); string_vector keys(tmp.size()); int k = 0; for (member_map::iterator it = tmp.begin(); it != tmp.end(); ++it) keys(k++) = it->first; return keys; } virtual bool save_ascii (std::ostream& os) { return true; } virtual bool load_ascii (std::istream& is) { return true; } virtual bool save_binary (std::ostream& os, bool& save_as_floats) { return true; } virtual bool load_binary (std::istream& is, bool swap, oct_mach_info::float_format fmt) { return true; } #if defined (HAVE_HDF5) # if SWIG_OCTAVE_PREREQ(4,0,0) virtual bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool save_as_floats) { return true; } virtual bool load_hdf5 (octave_hdf5_id loc_id, const char *name, bool have_h5giterate_bug) { return true; } # else virtual bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) { return true; } virtual bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug) { return true; } # endif #endif virtual octave_value convert_to_str(bool pad = false, bool force = false, char type = '"') const { return string_value(); } virtual octave_value convert_to_str_internal(bool pad, bool force, char type) const { return string_value(); } static bool dispatch_global_op(const std::string &symbol, const octave_value_list &args, octave_value &ret) { // we assume that SWIG_op_prefix-prefixed functions are installed in global namespace // (rather than any module namespace). octave_function *fcn = is_valid_function(symbol, std::string(), false); if (!fcn) return false; #if SWIG_OCTAVE_PREREQ(4,4,0) octave::tree_evaluator& tw = octave::interpreter::the_interpreter()->get_evaluator(); octave_value_list retval = fcn->call(tw, 1, args); if (retval.length() == 1) ret = retval(0); #else ret = fcn->do_multi_index_op(1, args)(0); #endif return true; } static octave_value dispatch_unary_op(const octave_base_value &x, const char *op_name) { octave_swig_type *ost = Swig::swig_value_deref(x); assert(ost); octave_value ret; if (ost->dispatch_unary_op(std::string("__") + op_name + std::string("__"), ret)) return ret; std::string symbol = SWIG_op_prefix + ost->swig_type_name() + "_" + op_name; octave_value_list args; args.append(make_value_hack(x)); if (dispatch_global_op(symbol, args, ret)) return ret; error("could not dispatch unary operator"); return octave_value(); } static octave_value dispatch_binary_op(const octave_base_value &lhs, const octave_base_value &rhs, const char *op_name) { octave_swig_type *lhs_ost = Swig::swig_value_deref(lhs); octave_swig_type *rhs_ost = Swig::swig_value_deref(rhs); octave_value ret; if (lhs_ost && lhs_ost->dispatch_binary_op(std::string("__") + op_name + std::string("__"), rhs, ret)) return ret; if (rhs_ost) { if (strlen(op_name) == 2 && (op_name[1] == 't' || op_name[1] == 'e')) { if (op_name[0] == 'l' && rhs_ost->dispatch_binary_op(std::string("__g") + op_name[1] + std::string("__"), lhs, ret)) return ret; if (op_name[0] == 'g' && rhs_ost->dispatch_binary_op(std::string("__l") + op_name[1] + std::string("__"), lhs, ret)) return ret; } if (rhs_ost->dispatch_binary_op(std::string("__r") + op_name + std::string("__"), lhs, ret)) return ret; } std::string symbol; octave_value_list args; args.append(make_value_hack(lhs)); args.append(make_value_hack(rhs)); symbol = SWIG_op_prefix; symbol += lhs_ost ? lhs_ost->swig_type_name() : lhs.type_name(); symbol += "_"; symbol += op_name; symbol += "_"; symbol += rhs_ost ? rhs_ost->swig_type_name() : rhs.type_name(); if (dispatch_global_op(symbol, args, ret)) return ret; symbol = SWIG_op_prefix; symbol += lhs_ost ? lhs_ost->swig_type_name() : lhs.type_name(); symbol += "_"; symbol += op_name; symbol += "_"; symbol += "any"; if (dispatch_global_op(symbol, args, ret)) return ret; symbol = SWIG_op_prefix; symbol += "any"; symbol += "_"; symbol += op_name; symbol += "_"; symbol += rhs_ost ? rhs_ost->swig_type_name() : rhs.type_name(); if (dispatch_global_op(symbol, args, ret)) return ret; error("could not dispatch binary operator"); return octave_value(); } #if SWIG_OCTAVE_PREREQ(4,0,0) void print(std::ostream &os, bool pr_as_read_syntax = false) #else void print(std::ostream &os, bool pr_as_read_syntax = false) const #endif { if (is_string()) { os << string_value(); return; } member_map tmp; load_members(tmp); indent(os); os << "{"; newline(os); increment_indent_level(); for (unsigned int j = 0; j < types.size(); ++j) { indent(os); if (types[j].first->clientdata) { const swig_octave_class *c = (const swig_octave_class *) types[j].first->clientdata; os << c->name << ", ptr = " << types[j].second.ptr; newline(os); } else { os << types[j].first->name << ", ptr = " << types[j].second.ptr; newline(os); } } for (member_map::const_iterator it = tmp.begin(); it != tmp.end(); ++it) { indent(os); if (it->second.first) { const char *objtype = it->second.first->method ? "method" : "variable"; const char *modifier = (it->second.first->flags &1) ? "static " : (it->second.first->flags &2) ? "global " : ""; os << it->second.first->name << " (" << modifier << objtype << ")"; newline(os); assert(it->second.first->name == it->first); } else { os << it->first; newline(os); } } decrement_indent_level(); indent(os); os << "}"; newline(os); } }; // Octave tries hard to preserve pass-by-value semantics. Eg, assignments // will call clone() via make_unique() if there is more than one outstanding // reference to the lhs, and forces the clone's reference count to 1 // (so you can't just increment your own count and return this). // // One way to fix this (without modifying Octave) is to add a level of // indirection such that clone copies ref-counted pointer and we keep // pass-by-ref semantics (which are more natural/expected for C++ bindings). // // Supporting both pass-by-{ref,value} and toggling via %feature/option // might be nice. class octave_swig_ref:public octave_base_value { octave_swig_type *ptr; public: octave_swig_ref(octave_swig_type *_ptr = 0) :ptr(_ptr) { // Ensure type_id() is set correctly if (t_id == -1) { t_id = octave_swig_ref::static_type_id(); } } ~octave_swig_ref() { if (ptr) ptr->decref(); } octave_swig_type *get_ptr() const { return ptr; } octave_base_value *clone() const { if (ptr) ptr->incref(); return new octave_swig_ref(ptr); } octave_base_value *empty_clone() const { return new octave_swig_ref(0); } dim_vector dims(void) const { return ptr->dims(); } bool is_defined() const { return ptr->is_defined(); } virtual bool is_map() const { return ptr->is_map(); } virtual octave_value subsref(const std::string &ops, const std::list < octave_value_list > &idx) { return ptr->subsref(ops, idx); } virtual octave_value_list subsref(const std::string &ops, const std::list < octave_value_list > &idx, int nargout) { return ptr->subsref(ops, idx, nargout); } octave_value subsasgn(const std::string &ops, const std::list < octave_value_list > &idx, const octave_value &rhs) { return ptr->subsasgn(ops, idx, rhs); } virtual bool is_object() const { return ptr->is_object(); } virtual bool is_string() const { return ptr->is_string(); } virtual std::string string_value(bool force = false) const { return ptr->string_value(force); } virtual double scalar_value(bool frc_str_conv = false) const { return ptr->scalar_value(frc_str_conv); } #if SWIG_OCTAVE_PREREQ(4,2,0) virtual octave_value as_double(void) const { return ptr->as_double(); } virtual octave_value as_single(void) const { return ptr->as_single(); } #endif #if SWIG_OCTAVE_PREREQ(3,8,0) virtual octave_value map(octave_base_value::unary_mapper_t umap) const { return ptr->map(umap); } #endif #if SWIG_OCTAVE_PREREQ(3,3,52) virtual octave_map map_value() const { return ptr->map_value(); } #else virtual Octave_map map_value() const { return ptr->map_value(); } #endif virtual string_vector map_keys() const { return ptr->map_keys(); } virtual bool save_ascii (std::ostream& os) { return ptr->save_ascii(os); } virtual bool load_ascii (std::istream& is) { return ptr->load_ascii(is); } virtual bool save_binary (std::ostream& os, bool& save_as_floats) { return ptr->save_binary(os, save_as_floats); } virtual bool load_binary (std::istream& is, bool swap, oct_mach_info::float_format fmt) { return ptr->load_binary(is, swap, fmt); } #if defined (HAVE_HDF5) # if SWIG_OCTAVE_PREREQ(4,0,0) virtual bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool save_as_floats) { return ptr->save_hdf5(loc_id, name, save_as_floats); } virtual bool load_hdf5 (octave_hdf5_id loc_id, const char *name, bool have_h5giterate_bug) { return ptr->load_hdf5(loc_id, name, have_h5giterate_bug); } # else virtual bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) { return ptr->save_hdf5(loc_id, name, save_as_floats); } virtual bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug) { return ptr->load_hdf5(loc_id, name, have_h5giterate_bug); } # endif #endif virtual octave_value convert_to_str(bool pad = false, bool force = false, char type = '"') const { return ptr->convert_to_str(pad, force, type); } virtual octave_value convert_to_str_internal(bool pad, bool force, char type) const { return ptr->convert_to_str_internal(pad, force, type); } #if SWIG_OCTAVE_PREREQ(4,0,0) void print(std::ostream &os, bool pr_as_read_syntax = false) #else void print(std::ostream &os, bool pr_as_read_syntax = false) const #endif { return ptr->print(os, pr_as_read_syntax); } virtual type_conv_info numeric_conversion_function(void) const { return octave_base_value::type_conv_info (default_numeric_conversion_function, octave_scalar::static_type_id ()); } private: static octave_base_value *default_numeric_conversion_function (const octave_base_value& a) { const octave_swig_ref& v = dynamic_cast(a); return new octave_scalar(v.scalar_value()); } #if !SWIG_OCTAVE_PREREQ(4,0,0) DECLARE_OCTAVE_ALLOCATOR; #endif DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA; }; #if !SWIG_OCTAVE_PREREQ(4,0,0) DEFINE_OCTAVE_ALLOCATOR(octave_swig_ref); #endif DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(octave_swig_ref, "swig_ref", "swig_ref"); class octave_swig_packed:public octave_base_value { swig_type_info *type; std::vector < char > buf; public: octave_swig_packed(swig_type_info *_type = 0, const void *_buf = 0, size_t _buf_len = 0) : type(_type), buf((const char*)_buf, (const char*)_buf + _buf_len) { // Ensure type_id() is set correctly if (t_id == -1) { t_id = octave_swig_packed::static_type_id(); } } bool copy(swig_type_info *outtype, void *ptr, size_t sz) const { if (outtype && outtype != type) return false; assert(sz <= buf.size()); std::copy(buf.begin(), buf.begin()+sz, (char*)ptr); return true; } octave_base_value *clone() const { return new octave_swig_packed(*this); } octave_base_value *empty_clone() const { return new octave_swig_packed(); } bool is_defined() const { return true; } #if SWIG_OCTAVE_PREREQ(4,0,0) void print(std::ostream &os, bool pr_as_read_syntax = false) #else void print(std::ostream &os, bool pr_as_read_syntax = false) const #endif { indent(os); os << "swig packed type: name = " << (type ? type->name : std::string()) << ", len = " << buf.size(); newline(os); } virtual bool save_ascii (std::ostream& os) { return true; } virtual bool load_ascii (std::istream& is) { return true; } virtual bool save_binary (std::ostream& os, bool& save_as_floats) { return true; } virtual bool load_binary (std::istream& is, bool swap, oct_mach_info::float_format fmt) { return true; } #if defined (HAVE_HDF5) # if SWIG_OCTAVE_PREREQ(4,0,0) virtual bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool save_as_floats) { return true; } virtual bool load_hdf5 (octave_hdf5_id loc_id, const char *name, bool have_h5giterate_bug) { return true; } # else virtual bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) { return true; } virtual bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug) { return true; } # endif #endif private: #if !SWIG_OCTAVE_PREREQ(4,0,0) DECLARE_OCTAVE_ALLOCATOR; #endif DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA; }; #if !SWIG_OCTAVE_PREREQ(4,0,0) DEFINE_OCTAVE_ALLOCATOR(octave_swig_packed); #endif DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(octave_swig_packed, "swig_packed", "swig_packed"); SWIGRUNTIME octave_value_list octave_set_immutable(const octave_value_list &args, int nargout) { error("attempt to set immutable member variable"); return octave_value_list(); } struct octave_value_ref { const octave_value_list &ovl; int j; octave_value_ref(const octave_value_list &_ovl, int _j) :ovl(_ovl), j(_j) { } operator octave_value() const { return ovl(j); } octave_value operator*() const { return ovl(j); } }; namespace Swig { SWIGRUNTIME octave_base_value *swig_value_ref(octave_swig_type *ost) { return new octave_swig_ref(ost); } SWIGRUNTIME octave_swig_type *swig_value_deref(octave_value ov) { if ( #if SWIG_OCTAVE_PREREQ(4,4,0) ov.iscell() #else ov.is_cell() #endif && ov.rows() == 1 && ov.columns() == 1) ov = ov.cell_value()(0); return swig_value_deref(*ov.internal_rep()); } SWIGRUNTIME octave_swig_type *swig_value_deref(const octave_base_value &ov) { if (ov.type_id() != octave_swig_ref::static_type_id()) return 0; const octave_swig_ref *osr = static_cast < const octave_swig_ref *>(&ov); return osr->get_ptr(); } } #define swig_unary_op(name) \ SWIGRUNTIME octave_value swig_unary_op_##name(const octave_base_value &x) { \ return octave_swig_type::dispatch_unary_op(x,#name); \ } #define swig_binary_op(name) \ SWIGRUNTIME octave_value swig_binary_op_##name(const octave_base_value&lhs,const octave_base_value &rhs) { \ return octave_swig_type::dispatch_binary_op(lhs,rhs,#name); \ } #if SWIG_OCTAVE_PREREQ(4,4,0) #define swigreg_unary_op(name) \ if (!octave_value_typeinfo::lookup_unary_op(octave_value::op_##name,tid)) \ typeinfo.register_unary_op(octave_value::op_##name,tid,swig_unary_op_##name); #else #define swigreg_unary_op(name) \ if (!octave_value_typeinfo::lookup_unary_op(octave_value::op_##name,tid)) \ octave_value_typeinfo::register_unary_op(octave_value::op_##name,tid,swig_unary_op_##name); #endif #if SWIG_OCTAVE_PREREQ(4,4,0) #define swigreg_binary_op(name) \ if (!octave_value_typeinfo::lookup_binary_op(octave_value::op_##name,tid1,tid2)) \ typeinfo.register_binary_op(octave_value::op_##name,tid1,tid2,swig_binary_op_##name); #else #define swigreg_binary_op(name) \ if (!octave_value_typeinfo::lookup_binary_op(octave_value::op_##name,tid1,tid2)) \ octave_value_typeinfo::register_binary_op(octave_value::op_##name,tid1,tid2,swig_binary_op_##name); #endif swig_unary_op(not); swig_unary_op(uplus); swig_unary_op(uminus); swig_unary_op(transpose); swig_unary_op(hermitian); swig_unary_op(incr); swig_unary_op(decr); swig_binary_op(add); swig_binary_op(sub); swig_binary_op(mul); swig_binary_op(div); swig_binary_op(pow); swig_binary_op(ldiv); #if !SWIG_OCTAVE_PREREQ(4,2,0) swig_binary_op(lshift); swig_binary_op(rshift); #endif swig_binary_op(lt); swig_binary_op(le); swig_binary_op(eq); swig_binary_op(ge); swig_binary_op(gt); swig_binary_op(ne); swig_binary_op(el_mul); swig_binary_op(el_div); swig_binary_op(el_pow); swig_binary_op(el_ldiv); swig_binary_op(el_and); swig_binary_op(el_or); SWIGRUNTIME void SWIG_InstallUnaryOps(int tid) { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info(); #endif swigreg_unary_op(not); swigreg_unary_op(uplus); swigreg_unary_op(uminus); swigreg_unary_op(transpose); swigreg_unary_op(hermitian); swigreg_unary_op(incr); swigreg_unary_op(decr); } SWIGRUNTIME void SWIG_InstallBinaryOps(int tid1, int tid2) { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info(); #endif swigreg_binary_op(add); swigreg_binary_op(sub); swigreg_binary_op(mul); swigreg_binary_op(div); swigreg_binary_op(pow); swigreg_binary_op(ldiv); #if !SWIG_OCTAVE_PREREQ(4,2,0) swigreg_binary_op(lshift); swigreg_binary_op(rshift); #endif swigreg_binary_op(lt); swigreg_binary_op(le); swigreg_binary_op(eq); swigreg_binary_op(ge); swigreg_binary_op(gt); swigreg_binary_op(ne); swigreg_binary_op(el_mul); swigreg_binary_op(el_div); swigreg_binary_op(el_pow); swigreg_binary_op(el_ldiv); swigreg_binary_op(el_and); swigreg_binary_op(el_or); } SWIGRUNTIME void SWIG_InstallOps(int tid) { // here we assume that tid are conseq integers increasing from zero, and // that our tid is the last one. might be better to have explicit string // list of types we should bind to, and use lookup_type to resolve their tid. SWIG_InstallUnaryOps(tid); SWIG_InstallBinaryOps(tid, tid); for (int j = 0; j < tid; ++j) { SWIG_InstallBinaryOps(j, tid); SWIG_InstallBinaryOps(tid, j); } } SWIGRUNTIME octave_value SWIG_Octave_NewPointerObj(void *ptr, swig_type_info *type, int flags) { int own = (flags &SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; #ifdef SWIG_DIRECTORS Swig::Director *d = Swig::get_rtdir(ptr); if (d && Swig::swig_director_get_self(d)) return Swig::swig_director_get_self(d)->as_value(); #endif return Swig::swig_value_ref(new octave_swig_type(ptr, type, own)); } SWIGRUNTIME int SWIG_Octave_ConvertPtrAndOwn(octave_value ov, void **ptr, swig_type_info *type, int flags, int *own) { if ( #if SWIG_OCTAVE_PREREQ(4,4,0) ov.iscell() #else ov.is_cell() #endif && ov.rows() == 1 && ov.columns() == 1) ov = ov.cell_value()(0); if (!ov.is_defined() || (ov.is_matrix_type() && ov.rows() == 0 && ov.columns() == 0) ) { if (ptr) *ptr = 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } if (ov.type_id() != octave_swig_ref::static_type_id()) return SWIG_ERROR; octave_swig_ref *osr = static_cast < octave_swig_ref *>(ov.internal_rep()); octave_swig_type *ost = osr->get_ptr(); return ost->cast(ptr, type, own, flags); } SWIGRUNTIME octave_value SWIG_Octave_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return new octave_swig_packed(type, (char *) ptr, sz); } SWIGRUNTIME int SWIG_Octave_ConvertPacked(const octave_value &ov, void *ptr, size_t sz, swig_type_info *type) { if (!ov.is_defined()) return SWIG_ERROR; if (ov.type_id() != octave_swig_packed::static_type_id()) return SWIG_ERROR; octave_swig_packed *ost = static_cast < octave_swig_packed *>(ov.internal_rep()); return ost->copy(type, (char *) ptr, sz) ? SWIG_OK : SWIG_ERROR; } SWIGRUNTIMEINLINE void SWIG_Octave_SetConstant(octave_swig_type *module_ns, const std::string &name, const octave_value &ov) { module_ns->assign(name, ov); } SWIGRUNTIMEINLINE octave_value SWIG_Octave_GetGlobalValue(std::string name) { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table(); return symtab.global_varval(name); #else return get_global_value(name, true); #endif } SWIGRUNTIME void SWIG_Octave_SetGlobalValue(std::string name, const octave_value& value) { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table(); symtab.global_assign(name, value); #else set_global_value(name, value); #endif } SWIGRUNTIME void SWIG_Octave_LinkGlobalValue(std::string name) { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table(); octave::symbol_scope symscope = octave::interpreter::the_interpreter()->get_current_scope(); symscope.assign(name, symtab.global_varval(name)); symscope.mark_global(name); #else #if !SWIG_OCTAVE_PREREQ(3,2,0) link_to_global_variable(curr_sym_tab->lookup(name, true)); #else #if !SWIG_OCTAVE_PREREQ(3,8,0) symbol_table::varref(name); #endif symbol_table::mark_global(name); #endif #endif } SWIGRUNTIME swig_module_info *SWIG_Octave_GetModule(void *clientdata) { octave_value ov = SWIG_Octave_GetGlobalValue("__SWIG_MODULE__" SWIG_TYPE_TABLE_NAME SWIG_RUNTIME_VERSION); if (!ov.is_defined() || ov.type_id() != octave_swig_packed::static_type_id()) return 0; const octave_swig_packed* osp = static_cast < const octave_swig_packed *> (ov.internal_rep()); swig_module_info *pointer = 0; osp->copy(0, &pointer, sizeof(swig_module_info *)); return pointer; } SWIGRUNTIME void SWIG_Octave_SetModule(void *clientdata, swig_module_info *pointer) { octave_value ov = new octave_swig_packed(0, &pointer, sizeof(swig_module_info *)); SWIG_Octave_SetGlobalValue("__SWIG_MODULE__" SWIG_TYPE_TABLE_NAME SWIG_RUNTIME_VERSION, ov); } swig-4.0.2/Lib/octave/exception.i0000644000175000017500000000065313667507523016525 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg); SWIG_fail; )) } %define SWIG_RETHROW_OCTAVE_EXCEPTIONS /* rethrow any exceptions thrown by Octave */ %#if SWIG_OCTAVE_PREREQ(4,2,0) catch (octave::execution_exception& _e) { throw; } catch (octave::exit_exception& _e) { throw; } catch (octave::interrupt_exception& _e) { throw; } %#endif %enddef swig-4.0.2/Lib/octave/std_list.i0000644000175000017500000000124413667507523016351 0ustar williamwilliam// Lists %fragment("StdListTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const octave_value& obj, std::list **lis) { return traits_asptr_stdseq >::asptr(obj, lis); } }; template struct traits_from > { static octave_value *from(const std::list& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/octave/cdata.i0000644000175000017500000000003613667507523015576 0ustar williamwilliam%include swig-4.0.2/Lib/octave/octruntime.swg0000644000175000017500000003432613667507523017274 0ustar williamwilliam#ifdef SWIG_OCTAVE_EXTERNAL_OCTHEADERS %insert(runtime) %{ #include "octheaders.hpp" %} #else %insert(runtime) "octheaders.hpp"; #endif %insert(runtime) "swigrun.swg"; %insert(runtime) "swigerrors.swg"; %insert(runtime) "octrun.swg"; %insert(initbeforefunc) "swiginit.swg" %insert(initbeforefunc) %{ static bool SWIG_init_user(octave_swig_type* module_ns); SWIGINTERN bool SWIG_Octave_LoadModule(std::string name) { bool retn = false; { #if SWIG_OCTAVE_PREREQ(4,2,0) octave::unwind_protect frame; frame.protect_var(discard_error_messages); discard_error_messages = true; frame.protect_var(discard_warning_messages); discard_warning_messages = true; #elif SWIG_OCTAVE_PREREQ(3,3,50) unwind_protect frame; frame.protect_var(error_state); error_state = 0; frame.protect_var(warning_state); warning_state = 0; frame.protect_var(discard_error_messages); discard_error_messages = true; frame.protect_var(discard_warning_messages); discard_warning_messages = true; #else unwind_protect::begin_frame("SWIG_Octave_LoadModule"); unwind_protect_int(error_state); error_state = 0; unwind_protect_int(warning_state); warning_state = 0; unwind_protect_bool(discard_error_messages); discard_error_messages = true; unwind_protect_bool(discard_warning_messages); discard_warning_messages = true; #endif #if SWIG_OCTAVE_PREREQ(4,2,0) try { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::feval(name, octave_value_list(), 0); #else feval(name, octave_value_list(), 0); #endif retn = true; } catch (octave::execution_exception&) { } #else feval(name, octave_value_list(), 0); retn = (error_state == 0); #endif #if !SWIG_OCTAVE_PREREQ(3,3,50) unwind_protect::run_frame("SWIG_Octave_LoadModule"); #endif } if (!retn) { error(SWIG_name_d ": could not load module `%s'", name.c_str()); } return retn; } SWIGINTERN bool SWIG_Octave_InstallFunction(octave_function *octloadfcn, std::string name) { bool retn = false; { #if SWIG_OCTAVE_PREREQ(4,2,0) octave::unwind_protect frame; frame.protect_var(discard_error_messages); discard_error_messages = true; frame.protect_var(discard_warning_messages); discard_warning_messages = true; #elif SWIG_OCTAVE_PREREQ(3,3,50) unwind_protect frame; frame.protect_var(error_state); error_state = 0; frame.protect_var(warning_state); warning_state = 0; frame.protect_var(discard_error_messages); discard_error_messages = true; frame.protect_var(discard_warning_messages); discard_warning_messages = true; #else unwind_protect::begin_frame("SWIG_Octave_InstallFunction"); unwind_protect_int(error_state); error_state = 0; unwind_protect_int(warning_state); warning_state = 0; unwind_protect_bool(discard_error_messages); discard_error_messages = true; unwind_protect_bool(discard_warning_messages); discard_warning_messages = true; #endif octave_value_list args; args.append(name); args.append(octloadfcn->fcn_file_name()); #if SWIG_OCTAVE_PREREQ(4,2,0) try { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::feval("autoload", args, 0); #else feval("autoload", args, 0); #endif retn = true; } catch (octave::execution_exception&) { } #else feval("autoload", args, 0); retn = (error_state == 0); #endif #if !SWIG_OCTAVE_PREREQ(3,3,50) unwind_protect::run_frame("SWIG_Octave_InstallFunction"); #endif } if (!retn) { error(SWIG_name_d ": could not load function `%s'", name.c_str()); } return retn; } static const char *const subclass_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} subclass()\n\ @deftypefnx{Loadable Function} {} subclass(@var{swigclass}, @var{name}, @var{fcn}, @dots{})\n\ Subclass a C++ class from within Octave, and provide implementations of its virtual methods.\n\ \n\ See the SWIG manual for usage examples.\n\ @end deftypefn"; DEFUN_DLD( subclass, args, nargout, subclass_usage ) { octave_swig_type *top = new octave_swig_type; for (int j = 0; j < args.length(); ++j) { if (args(j).type_id() == octave_swig_ref::static_type_id()) { octave_swig_ref *osr = static_cast < octave_swig_ref *>(args(j).internal_rep()); octave_swig_type *ost = osr->get_ptr(); if (!ost->is_owned()) { error("subclass: cannot subclass object not constructed on octave side"); return octave_value_list(); } top->merge(*ost); } else if (args(j).is_function_handle()) { top->assign(args(j).fcn_handle_value()->fcn_name(), args(j)); } else if (args(j).is_string()) { if (j + 1 >= args.length()) { error("subclass: member assignments must be of string,value form"); return octave_value_list(); } top->assign(args(j).string_value(), args(j + 1)); ++j; } else { error("subclass: invalid arguments to subclass()"); return octave_value_list(); } } return octave_value(Swig::swig_value_ref(top)); } static const char *const swig_type_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} swig_type(@var{swigref})\n\ Return the underlying C/C++ type name of a SWIG-wrapped object.\n\ @end deftypefn"; DEFUN_DLD( swig_type, args, nargout, swig_type_usage ) { if (args.length() != 1) { error("swig_type: must be called with only a single object"); return octave_value_list(); } octave_swig_type *ost = Swig::swig_value_deref(args(0)); if (!ost) { error("swig_type: object is not a swig_ref"); return octave_value_list(); } return octave_value(ost->swig_type_name()); } static const char *const swig_typequery_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} swig_typequery(@var{string})\n\ Return @var{string} if it is a recognised SWIG-wrapped C/C++ type name;\n\ otherwise return `'.\n\ @end deftypefn"; DEFUN_DLD( swig_typequery, args, nargout, swig_typequery_usage ) { if (args.length() != 1 || !args(0).is_string()) { error("swig_typequery: must be called with single string argument"); return octave_value_list(); } swig_module_info *module = SWIG_GetModule(0); swig_type_info *type = SWIG_TypeQueryModule(module, module, args(0).string_value().c_str()); if (!type) return octave_value(""); return octave_value(type->name); } static const char *const swig_this_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} swig_this(@var{swigref})\n\ Return the underlying C/C++ pointer of a SWIG-wrapped object.\n\ @end deftypefn"; DEFUN_DLD( swig_this, args, nargout, swig_this_usage ) { if (args.length() != 1) { error("swig_this: must be called with only a single object"); return octave_value_list(); } if (args(0).is_matrix_type() && args(0).rows() == 0 && args(0).columns() == 0) return octave_value(octave_uint64(0)); octave_swig_type *ost = Swig::swig_value_deref(args(0)); if (!ost) { error("swig_this: object is not a swig_ref"); return octave_value_list(); } return octave_value(octave_uint64((unsigned long long) ost->swig_this())); } static const char *const swig_octave_prereq_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} swig_octave_prereq(@var{major}, @var{minor}, @var{patch})\n\ Return true if the version of Octave is at least @var{major}.@var{minor}.@var{patch}.\n\ @end deftypefn"; DEFUN_DLD( swig_octave_prereq, args, nargout, swig_octave_prereq_usage ) { if (args.length() != 3) { error("swig_octave_prereq: must be called with 3 arguments"); return octave_value_list(); } const int major = args(0).int_value(); const int minor = args(1).int_value(); const int patch = args(2).int_value(); const bool prereq = SWIG_OCTAVE_PREREQ(major, minor, patch); return octave_value(prereq); } static const char *const swig_exit_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} swig_exit([@var{exit_status}])\n\ Exit Octave without performing any memory cleanup.\n\ @end deftypefn"; DEFUN_DLD( swig_exit, args, nargout, swig_exit_usage ) { if (args.length() > 1) { error("swig_exit: must be called with at most one arguments"); return octave_value_list(); } int exit_status = 0; if (args.length() == 1) { exit_status = args(0).int_value(); } ::_Exit(exit_status); return octave_value(); } static const char *const SWIG_name_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Module} {} " SWIG_name_d "\n\ Loads the SWIG-generated module `" SWIG_name_d "'.\n\ @end deftypefn"; DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) { static octave_swig_type* module_ns = 0; // workaround to prevent octave seg-faulting on exit: set Octave exit function // octave_exit to _Exit, which exits immediately without trying to cleanup memory. // definitely affected version 3.2.*, not sure about 3.3.*, seems to be fixed in // version 3.4.*, reappeared in 4.2.*, hack not possible in 4.4.* or later due to // removal of octave_exit, so turn on for all versions between 3.2.*. and 4.4.*. // can be turned off with macro definition. #ifndef SWIG_OCTAVE_NO_SEGFAULT_HACK #if !SWIG_OCTAVE_PREREQ(4,4,0) #if SWIG_OCTAVE_PREREQ(3,2,0) octave_exit = ::_Exit; #endif #endif #endif // check for no input and output args if (args.length() != 0 || nargout != 0) { print_usage(); return octave_value_list(); } // create module on first function call if (!module_ns) { // workaround bug in octave where installing global variable of custom type and then // exiting without explicitly clearing the variable causes octave to segfault. #if SWIG_OCTAVE_PREREQ(3,2,0) octave_value_list eval_args; eval_args.append("base"); eval_args.append("function __swig_atexit__; " " if mislocked() " " clear -all; " " else " " mlock(); " " endif; " "endfunction; " "__swig_atexit__; " "atexit(\"__swig_atexit__\", false); " "atexit(\"__swig_atexit__\")"); #if SWIG_OCTAVE_PREREQ(4,4,0) octave::feval("evalin", eval_args, 0); #else feval("evalin", eval_args, 0); #endif #endif #if SWIG_OCTAVE_PREREQ(4,4,0) { octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info(); string_vector types = typeinfo.installed_type_names(); bool register_octave_swig_ref = true; bool register_octave_swig_packed = true; for (int i = 0; i < types.numel(); ++i) { if (types(i) == octave_swig_ref::static_type_name()) { register_octave_swig_ref = false; } if (types(i) == octave_swig_packed::static_type_name()) { register_octave_swig_packed = false; } } if (register_octave_swig_ref) { octave_swig_ref::register_type(); } if (register_octave_swig_packed) { octave_swig_packed::register_type(); } } #else octave_swig_ref::register_type(); octave_swig_packed::register_type(); #endif SWIG_InitializeModule(0); SWIG_PropagateClientData(); #if SWIG_OCTAVE_PREREQ(4,4,0) octave::call_stack& stack = octave::interpreter::the_interpreter()->get_call_stack(); octave_function *me = stack.current(); #else octave_function *me = octave_call_stack::current(); #endif if (!SWIG_Octave_InstallFunction(me, "subclass")) { return octave_value_list(); } if (!SWIG_Octave_InstallFunction(me, "swig_type")) { return octave_value_list(); } if (!SWIG_Octave_InstallFunction(me, "swig_typequery")) { return octave_value_list(); } if (!SWIG_Octave_InstallFunction(me, "swig_this")) { return octave_value_list(); } if (!SWIG_Octave_InstallFunction(me, "swig_octave_prereq")) { return octave_value_list(); } if (!SWIG_Octave_InstallFunction(me, "swig_exit")) { return octave_value_list(); } octave_swig_type* cvar_ns=0; if (std::string(SWIG_global_name) != ".") { cvar_ns=new octave_swig_type; for (int j=0;swig_globals[j].name;++j) if (swig_globals[j].get_method) cvar_ns->assign(swig_globals[j].name,&swig_globals[j]); } module_ns=new octave_swig_type(0, 0, 0, true); if (std::string(SWIG_global_name) != ".") { module_ns->assign(SWIG_global_name,Swig::swig_value_ref(cvar_ns)); } else { for (int j=0;swig_globals[j].name;++j) if (swig_globals[j].get_method) module_ns->assign(swig_globals[j].name,&swig_globals[j]); } for (int j=0;swig_globals[j].name;++j) if (swig_globals[j].method) module_ns->assign(swig_globals[j].name,&swig_globals[j]); // * need better solution here; swig_type -> octave_class mapping is // * really n-to-1, in some cases such as template partial spec, etc. // * see failing tests. for (int j=0;swig_types[j];++j) if (swig_types[j]->clientdata) { swig_octave_class* c=(swig_octave_class*)swig_types[j]->clientdata; module_ns->assign(c->name, Swig::swig_value_ref (new octave_swig_type(0,swig_types[j]))); } if (!SWIG_init_user(module_ns)) { delete module_ns; module_ns=0; return octave_value_list(); } SWIG_InstallOps(octave_swig_ref::static_type_id()); octave_swig_type::swig_member_const_iterator mb; for (mb = module_ns->swig_members_begin(); mb != module_ns->swig_members_end(); ++mb) { if (mb->second.first && mb->second.first->method) { if (!SWIG_Octave_InstallFunction(me, mb->first)) { return octave_value_list(); } } } #if SWIG_OCTAVE_PREREQ(4,4,0) octave::interpreter::the_interpreter()->mlock(); #elif SWIG_OCTAVE_PREREQ(3,2,0) mlock(); #else mlock(me->name()); #endif } octave_swig_type::swig_member_const_iterator mb; for (mb = module_ns->swig_members_begin(); mb != module_ns->swig_members_end(); ++mb) { if (mb->second.second.is_defined()) { SWIG_Octave_SetGlobalValue(mb->first, mb->second.second); SWIG_Octave_LinkGlobalValue(mb->first); } } SWIG_Octave_SetGlobalValue(SWIG_name_d, module_ns->as_value()); SWIG_Octave_LinkGlobalValue(SWIG_name_d); return octave_value_list(); } %} swig-4.0.2/Lib/octave/std_string.i0000644000175000017500000000004313667507523016700 0ustar williamwilliam%include swig-4.0.2/Lib/octave/std_map.i0000644000175000017500000001116013667507523016151 0ustar williamwilliam// Maps %include %fragment("StdMapCommonTraits","header",fragment="StdSequenceTraits") { namespace swig { template struct from_key_oper { typedef const ValueType& argument_type; typedef octave_value result_type; result_type operator()(argument_type v) const { return swig::from(v.first); } }; template struct from_value_oper { typedef const ValueType& argument_type; typedef octave_value result_type; result_type operator()(argument_type v) const { return swig::from(v.second); } }; template struct OctMapIterator_T : OctSwigIteratorClosed_T { OctMapIterator_T(OutIterator curr, OutIterator first, OutIterator last, octave_value seq) : OctSwigIteratorClosed_T(curr, first, last, seq) { } }; template > struct OctMapKeyIterator_T : OctMapIterator_T { OctMapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, octave_value seq) : OctMapIterator_T(curr, first, last, seq) { } }; template inline OctSwigIterator* make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, octave_value seq = octave_value()) { return new OctMapKeyIterator_T(current, begin, end, seq); } template > struct OctMapValueIterator_T : OctMapIterator_T { OctMapValueIterator_T(OutIterator curr, OutIterator first, OutIterator last, octave_value seq) : OctMapIterator_T(curr, first, last, seq) { } }; template inline OctSwigIterator* make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, octave_value seq = 0) { return new OctMapValueIterator_T(current, begin, end, seq); } } } %fragment("StdMapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const OctSeq& octseq, std::map *map) { typedef typename std::map::value_type value_type; typename OctSeq::const_iterator it = octseq.begin(); for (;it != octseq.end(); ++it) { map->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::map map_type; static int asptr(octave_value obj, map_type **val) { /* int res = SWIG_ERROR; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { map_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; */ return SWIG_ERROR; } }; template struct traits_from > { typedef std::map map_type; typedef typename map_type::const_iterator const_iterator; typedef typename map_type::size_type size_type; static octave_value from(const map_type& map) { /* swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN); } else { size_type size = map.size(); int pysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (pysize < 0) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } return obj; } */ return octave_value(); } }; } } %define %swig_map_common(Map...) %swig_sequence_iterator(Map); %swig_container_methods(Map); %enddef %define %swig_map_methods(Map...) %swig_map_common(Map) %enddef %include swig-4.0.2/Lib/octave/octtypemaps.swg0000644000175000017500000000463213667507523017450 0ustar williamwilliam // Include fundamental fragment definitions %include // Look for user fragments file. %include // Octave fragments for primitive types %include // Octave fragments for char* strings //%include #ifndef SWIG_DIRECTOR_TYPEMAPS #define SWIG_DIRECTOR_TYPEMAPS #endif // Octave types #define SWIG_Object octave_value #define VOID_Object octave_value() /* // Octave allows implicit conversion #define %implicitconv_flag $implicitconv */ // append output #define SWIG_AppendOutput(result, obj) SWIG_Octave_AppendOutput(result, obj) // set constant #define SWIG_SetConstant(name, obj) SWIG_Octave_SetConstant(module_ns,name,obj) // raise #define SWIG_Octave_Raise(OBJ, TYPE, DESC) error("C++ side threw an exception of type " TYPE) #define SWIG_Raise(obj, type, desc) SWIG_Octave_Raise(obj, type, desc) // Include the unified typemap library %include %typecheck(SWIG_TYPECHECK_SWIGOBJECT) SWIG_Object "$1 = (*$input).is_defined();"; %typecheck(SWIG_TYPECHECK_SWIGOBJECT) octave_value_list "$1 = true;"; %typemap(in) (octave_value_list varargs,...) { for (int j=$argnum-1;jappend($1); } %typemap(out,noblock=1) octave_map, Octave_map { $result=$1; } %typemap(out,noblock=1) NDArray { $result=$1; } %typemap(out,noblock=1) Cell { $result=$1; } /* // Smart Pointers %typemap(out,noblock=1) const SWIGTYPE & SMARTPOINTER { $result = SWIG_NewPointerObj(%new_copy(*$1, $*ltype), $descriptor, SWIG_POINTER_OWN | %newpointer_flags); } %typemap(ret) const SWIGTYPE & SMARTPOINTER, SWIGTYPE SMARTPOINTER { octave_swig_type* lobj=Swig::swig_value_deref($result); if (lobj) { std::list idx; idx.push_back(octave_value("__deref__")); idx.push_back(octave_value_list()); octave_value_list ovl(lobj->subsref(".(",idx)); octave_swig_type* robj=ovl.length()>=1?Swig::swig_value_deref(ovl(0)):0; if (robj && !error_state) lobj->append(robj); } } */ swig-4.0.2/Lib/octave/factory.i0000644000175000017500000000004013667507523016164 0ustar williamwilliam%include swig-4.0.2/Lib/octave/boost_shared_ptr.i0000644000175000017500000005160213667507523020070 0ustar williamwilliam%include // Set SHARED_PTR_DISOWN to $disown if required, for example // #define SHARED_PTR_DISOWN $disown #if !defined(SHARED_PTR_DISOWN) #define SHARED_PTR_DISOWN 0 #endif // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) CONST TYPE (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (!swig_argp) { %dirout_nullref("$type"); } else { $result = *(%reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } // plain pointer // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE * %{ #error "directorout typemap for plain pointer not implemented" %} // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE & %{ #error "directorout typemap for plain reference not implemented" %} // plain pointer by reference // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") TYPE *CONST& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) TYPE *CONST& %{ #error "directorout typemap for plain pointer by reference not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { int newmem = 0; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (swig_argp) { $result = *(%reinterpret_cast(swig_argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, $<ype); } } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "directorout typemap for shared_ptr ref not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "directorout typemap for pointer to shared_ptr not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "directorout typemap for pointer ref to shared_ptr not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *", noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.2/Lib/intrusive_ptr.i0000644000175000017500000000524113667507523016161 0ustar williamwilliam// Allow for different namespaces for shared_ptr / intrusive_ptr - they could be boost or std or std::tr1 // For example for std::tr1, use: // #define SWIG_SHARED_PTR_NAMESPACE std // #define SWIG_SHARED_PTR_SUBNAMESPACE tr1 // #define SWIG_INTRUSIVE_PTR_NAMESPACE boost // #define SWIG_INTRUSIVE_PTR_SUBNAMESPACE #if !defined(SWIG_INTRUSIVE_PTR_NAMESPACE) # define SWIG_INTRUSIVE_PTR_NAMESPACE boost #endif #if defined(SWIG_INTRUSIVE_PTR_SUBNAMESPACE) # define SWIG_INTRUSIVE_PTR_QNAMESPACE SWIG_INTRUSIVE_PTR_NAMESPACE::SWIG_INTRUSIVE_PTR_SUBNAMESPACE #else # define SWIG_INTRUSIVE_PTR_QNAMESPACE SWIG_INTRUSIVE_PTR_NAMESPACE #endif namespace SWIG_INTRUSIVE_PTR_NAMESPACE { #if defined(SWIG_INTRUSIVE_PTR_SUBNAMESPACE) namespace SWIG_INTRUSIVE_PTR_SUBNAMESPACE { #endif template class intrusive_ptr { }; #if defined(SWIG_INTRUSIVE_PTR_SUBNAMESPACE) } #endif } %fragment("SWIG_intrusive_deleter", "header") { template struct SWIG_intrusive_deleter { void operator()(T *p) { if (p) intrusive_ptr_release(p); } }; } %fragment("SWIG_null_deleter", "header") { struct SWIG_null_deleter { void operator() (void const *) const { } }; %#define SWIG_NO_NULL_DELETER_0 , SWIG_null_deleter() %#define SWIG_NO_NULL_DELETER_1 } // Main user macro for defining intrusive_ptr typemaps for both const and non-const pointer types %define %intrusive_ptr(TYPE...) %feature("smartptr", noblock=1) TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > } SWIG_INTRUSIVE_PTR_TYPEMAPS(, TYPE) SWIG_INTRUSIVE_PTR_TYPEMAPS(const, TYPE) %enddef %define %intrusive_ptr_no_wrap(TYPE...) %feature("smartptr", noblock=1) TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > } SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(, TYPE) SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(const, TYPE) %enddef // Legacy macros %define SWIG_INTRUSIVE_PTR(PROXYCLASS, TYPE...) #warning "SWIG_INTRUSIVE_PTR(PROXYCLASS, TYPE) is deprecated. Please use %intrusive_ptr(TYPE) instead." %intrusive_ptr(TYPE) %enddef %define SWIG_INTRUSIVE_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE...) #warning "SWIG_INTRUSIVE_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) is deprecated. Please use %intrusive_ptr(TYPE) instead." %intrusive_ptr(TYPE) %enddef %define SWIG_INTRUSIVE_PTR_NO_WRAP(PROXYCLASS, TYPE...) #warning "SWIG_INTRUSIVE_PTR_NO_WRAP(PROXYCLASS, TYPE) is deprecated. Please use %intrusive_ptr_no_wrap(TYPE) instead." %intrusive_ptr_no_wrap(TYPE) %enddef %define SWIG_INTRUSIVE_PTR_DERIVED_NO_WRAP(PROXYCLASS, BASECLASSTYPE, TYPE...) #warning "SWIG_INTRUSIVE_PTR_DERIVED_NO_WRAP(PROXYCLASS, BASECLASSTYPE, TYPE) is deprecated. Please use %intrusive_ptr_no_wrap(TYPE) instead." %intrusive_ptr_no_wrap(TYPE) %enddef swig-4.0.2/Lib/ruby/0000755000175000017500000000000013667507523014051 5ustar williamwilliamswig-4.0.2/Lib/ruby/std_complex.i0000644000175000017500000000114413667507523016544 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} namespace std { %naturalvar complex; template class complex; %template() complex; %template() complex; } /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-4.0.2/Lib/ruby/std_deque.i0000644000175000017500000000133313667507523016200 0ustar williamwilliam/* Deques */ %fragment("StdDequeTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::deque **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::deque& vec) { return traits_from_stdseq >::from(vec); } }; } %} %ignore std::deque::push_back; %ignore std::deque::pop_back; #define %swig_deque_methods(Type...) %swig_sequence_methods(Type) #define %swig_deque_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/ruby/rubyautodoc.swg0000644000175000017500000001041713667507523017136 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubyautodoc.swg * * This file implements autodoc typemaps for some common ruby methods. * ----------------------------------------------------------------------------- */ %define AUTODOC(func, str) %feature("autodoc", str) func; %enddef AUTODOC(to_i, "Convert $class to an Integer"); AUTODOC(to_f, "Convert $class to a Float"); AUTODOC(coerce, "Coerce class to a number"); AUTODOC(to_a, "Convert $class to an Array"); AUTODOC(to_s, "Convert class to a String representation"); AUTODOC(inspect, "Inspect class and its contents"); AUTODOC(at, "Return element at a certain index"); AUTODOC(__getitem__, "Element accessor/slicing"); AUTODOC(__setitem__, "Element setter/slicing"); AUTODOC(slice, "Return a slice (portion of) the $class"); AUTODOC(push, "Add an element at the end of the $class"); AUTODOC(pop, "Remove and return element at the end of the $class"); AUTODOC(shift, "Remove and return element at the beginning of the $class"); AUTODOC(unshift, "Add one or more elements at the beginning of the $class"); AUTODOC(first, "Return the first element in $class"); AUTODOC(last, "Return the last element in $class"); // // Common Object methods // AUTODOC(hash, "Hashing function for class"); AUTODOC(dup, "Create a duplicate of the class and unfreeze it if needed"); AUTODOC(clone, "Create a duplicate of the class"); // // Container methods // AUTODOC(empty, "Check if $class is empty"); AUTODOC(size, "Size or Length of the $class"); AUTODOC(insert, "Insert one or more new elements in the $class"); // // Iterator methods (block) // AUTODOC(each, "Iterate thru each element in the $class. A block must be provided"); AUTODOC(find, "Find an element in the class"); AUTODOC(each_key, "Iterate thru each key element in the $class. A block must be provided"); AUTODOC(each_value, "Iterate thru each key element in the $class. A block must be provided"); AUTODOC(reject, "Iterate thru each element in the $class and reject those that fail a condition returning a new $class. A block must be provided"); AUTODOC(reject_bang, "Iterate thru each element in the $class and reject those that fail a condition. A block must be provided. $class is modified in place"); AUTODOC(select, "Iterate thru each element in the $class and select those that match a condition. A block must be provided"); AUTODOC(delete_at, "Delete an element at a certain index"); AUTODOC(__delete__, "Delete a matching element"); // // Hash methods // AUTODOC(keys, "Return an Array of key elements"); AUTODOC(values, "Return an Array of value elements"); AUTODOC(values_at, "Return an Array of value elements matching the conditions"); // // Operators // #ifdef __cplusplus AUTODOC(operator==, "Equality comparison operator"); AUTODOC(operator<=, "Lower or equal comparison operator"); AUTODOC(operator>=, "Higher or equal comparison operator"); AUTODOC(operator<, "Lower than comparison operator"); AUTODOC(operator>, "Higher than comparison operator"); AUTODOC(operator<<, "Left shifting or appending operator"); AUTODOC(operator>>, "Right shifting operator or extracting operator"); AUTODOC(operator+, "Add operator"); AUTODOC(operator-, "Substraction operator"); AUTODOC(operator+(), "Positive operator"); AUTODOC(operator-(), "Negation operator"); AUTODOC(operator&, "AND operator"); AUTODOC(operator|, "OR operator"); AUTODOC(operator^, "XOR operator"); AUTODOC(operator~, "Invert operator"); #endif AUTODOC(__eq__, "Equality comparison operator"); AUTODOC(__le__, "Lower or equal comparison operator"); AUTODOC(__ge__, "Higher or equal comparison operator"); AUTODOC(__lt__, "Lower than comparison operator"); AUTODOC(__gt__, "Higher than comparison operator"); AUTODOC(__lshift__, "Left shifting or appending operator"); AUTODOC(__rshift__, "Right shifting operator or extracting operator"); AUTODOC(__add___, "Add operator"); AUTODOC(__sub__, "Substraction operator"); AUTODOC(__pos__, "Positive operator"); AUTODOC(__neg__, "Negation operator"); AUTODOC(__and__, "AND operator"); AUTODOC(__or__, "OR operator"); AUTODOC(__xor__, "XOR operator"); AUTODOC(__negate__, "Invert operator"); AUTODOC(__pow__, "Exponential operator"); AUTODOC(__divmod__, "Modulo of division"); AUTODOC(__cmp__, "Comparison operator. Returns < 0 for less than, 0 for equal or > 1 for higher than."); swig-4.0.2/Lib/ruby/rubyhead.swg0000644000175000017500000001137013667507523016400 0ustar williamwilliam#include /* Ruby 1.9.1 has a "memoisation optimisation" when compiling with GCC which * breaks using rb_intern as an lvalue, as SWIG does. We work around this * issue for now by disabling this. * https://sourceforge.net/tracker/?func=detail&aid=2859614&group_id=1645&atid=101645 */ #ifdef rb_intern # undef rb_intern #endif /* Remove global macros defined in Ruby's win32.h */ #ifdef write # undef write #endif #ifdef read # undef read #endif #ifdef bind # undef bind #endif #ifdef close # undef close #endif #ifdef connect # undef connect #endif /* Ruby 1.7 defines NUM2LL(), LL2NUM() and ULL2NUM() macros */ #ifndef NUM2LL #define NUM2LL(x) NUM2LONG((x)) #endif #ifndef LL2NUM #define LL2NUM(x) INT2NUM((long) (x)) #endif #ifndef ULL2NUM #define ULL2NUM(x) UINT2NUM((unsigned long) (x)) #endif /* Ruby 1.7 doesn't (yet) define NUM2ULL() */ #ifndef NUM2ULL #ifdef HAVE_LONG_LONG #define NUM2ULL(x) rb_num2ull((x)) #else #define NUM2ULL(x) NUM2ULONG(x) #endif #endif /* RSTRING_LEN, etc are new in Ruby 1.9, but ->ptr and ->len no longer work */ /* Define these for older versions so we can just write code the new way */ #ifndef RSTRING_LEN # define RSTRING_LEN(x) RSTRING(x)->len #endif #ifndef RSTRING_PTR # define RSTRING_PTR(x) RSTRING(x)->ptr #endif #ifndef RSTRING_END # define RSTRING_END(x) (RSTRING_PTR(x) + RSTRING_LEN(x)) #endif #ifndef RARRAY_LEN # define RARRAY_LEN(x) RARRAY(x)->len #endif #ifndef RARRAY_PTR # define RARRAY_PTR(x) RARRAY(x)->ptr #endif #ifndef RFLOAT_VALUE # define RFLOAT_VALUE(x) RFLOAT(x)->value #endif #ifndef DOUBLE2NUM # define DOUBLE2NUM(x) rb_float_new(x) #endif #ifndef RHASH_TBL # define RHASH_TBL(x) (RHASH(x)->tbl) #endif #ifndef RHASH_ITER_LEV # define RHASH_ITER_LEV(x) (RHASH(x)->iter_lev) #endif #ifndef RHASH_IFNONE # define RHASH_IFNONE(x) (RHASH(x)->ifnone) #endif #ifndef RHASH_SIZE # define RHASH_SIZE(x) (RHASH(x)->tbl->num_entries) #endif #ifndef RHASH_EMPTY_P # define RHASH_EMPTY_P(x) (RHASH_SIZE(x) == 0) #endif #ifndef RSTRUCT_LEN # define RSTRUCT_LEN(x) RSTRUCT(x)->len #endif #ifndef RSTRUCT_PTR # define RSTRUCT_PTR(x) RSTRUCT(x)->ptr #endif #ifndef RTYPEDDATA_P # define RTYPEDDATA_P(x) (TYPE(x) != T_DATA) #endif /* * The following macros are used for providing the correct type of a * function pointer to the Ruby C API. * Starting with Ruby 2.7 (corresponding to RB_METHOD_DEFINITION_DECL being * defined) these macros act transparently due to Ruby's moving away from * ANYARGS and instead employing strict function signatures. * * Note: In case of C (not C++) the macros are transparent even before * Ruby 2.7 due to the fact that the Ruby C API used function declarators * with empty parentheses, which allows for an unspecified number of * arguments. * * PROTECTFUNC(f) is used for the function pointer argument of the Ruby * C API function rb_protect(). * * VALUEFUNC(f) is used for the function pointer argument(s) of Ruby C API * functions like rb_define_method() and rb_define_singleton_method(). * * VOIDFUNC(f) is used to typecast a C function that implements either * the "mark" or "free" stuff for a Ruby Data object, so that it can be * passed as an argument to Ruby C API functions like Data_Wrap_Struct() * and Data_Make_Struct(). * * SWIG_RUBY_VOID_ANYARGS_FUNC(f) is used for the function pointer * argument(s) of Ruby C API functions like rb_define_virtual_variable(). * * SWIG_RUBY_INT_ANYARGS_FUNC(f) is used for the function pointer * argument(s) of Ruby C API functions like st_foreach(). */ #if defined(__cplusplus) && !defined(RB_METHOD_DEFINITION_DECL) # define PROTECTFUNC(f) ((VALUE (*)(VALUE)) f) # define VALUEFUNC(f) ((VALUE (*)(ANYARGS)) f) # define VOIDFUNC(f) ((RUBY_DATA_FUNC) f) # define SWIG_RUBY_VOID_ANYARGS_FUNC(f) ((void (*)(ANYARGS))(f)) # define SWIG_RUBY_INT_ANYARGS_FUNC(f) ((int (*)(ANYARGS))(f)) #else # define PROTECTFUNC(f) (f) # define VALUEFUNC(f) (f) # define VOIDFUNC(f) (f) # define SWIG_RUBY_VOID_ANYARGS_FUNC(f) (f) # define SWIG_RUBY_INT_ANYARGS_FUNC(f) (f) #endif /* Don't use for expressions have side effect */ #ifndef RB_STRING_VALUE #define RB_STRING_VALUE(s) (TYPE(s) == T_STRING ? (s) : (*(volatile VALUE *)&(s) = rb_str_to_str(s))) #endif #ifndef StringValue #define StringValue(s) RB_STRING_VALUE(s) #endif #ifndef StringValuePtr #define StringValuePtr(s) RSTRING_PTR(RB_STRING_VALUE(s)) #endif #ifndef StringValueLen #define StringValueLen(s) RSTRING_LEN(RB_STRING_VALUE(s)) #endif #ifndef SafeStringValue #define SafeStringValue(v) do {\ StringValue(v);\ rb_check_safe_str(v);\ } while (0) #endif #ifndef HAVE_RB_DEFINE_ALLOC_FUNC #define rb_define_alloc_func(klass, func) rb_define_singleton_method((klass), "new", VALUEFUNC((func)), -1) #define rb_undef_alloc_func(klass) rb_undef_method(CLASS_OF((klass)), "new") #endif static VALUE _mSWIG = Qnil; swig-4.0.2/Lib/ruby/std_multiset.i0000644000175000017500000000263513667507523016751 0ustar williamwilliam/* Multisets */ %include %fragment("StdMultisetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const RubySeq& rubyseq, std::multiset* seq) { // seq->insert(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(VALUE obj, std::multiset **m) { return traits_asptr_stdseq >::asptr(obj, m); } }; template struct traits_from > { static VALUE from(const std::multiset& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_multiset_methods(Set...) %swig_set_methods(Set) %mixin std::multiset "Enumerable"; %rename("delete") std::multiset::__delete__; %rename("reject!") std::multiset::reject_bang; %rename("map!") std::multiset::map_bang; %rename("empty?") std::multiset::empty; %rename("include?" ) std::multiset::__contains__ const; %rename("has_key?" ) std::multiset::has_key const; %alias std::multiset::push "<<"; %include swig-4.0.2/Lib/ruby/rubyruntime.swg0000644000175000017500000000064713667507523017167 0ustar williamwilliam %runtime "swiglabels.swg" /* Common C API type-checking code */ %runtime "swigrun.swg" /* Common C API type-checking code */ %runtime "swigerrors.swg" /* SWIG errors */ %runtime "rubyhead.swg" /* Ruby includes and fixes */ %runtime "rubyerrors.swg" /* Ruby errors */ %runtime "rubytracking.swg" /* API for tracking C++ classes to Ruby objects */ %runtime "rubyapi.swg" %runtime "rubyrun.swg" swig-4.0.2/Lib/ruby/rubytracking.swg0000644000175000017500000001124213667507523017277 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubytracking.swg * * This file contains support for tracking mappings from * Ruby objects to C++ objects. This functionality is needed * to implement mark functions for Ruby's mark and sweep * garbage collector. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #if !defined(ST_DATA_T_DEFINED) /* Needs to be explicitly included for Ruby 1.8 and earlier */ #include #endif /* Ruby 1.8 actually assumes the first case. */ #if SIZEOF_VOIDP == SIZEOF_LONG # define SWIG2NUM(v) LONG2NUM((unsigned long)v) # define NUM2SWIG(x) (unsigned long)NUM2LONG(x) #elif SIZEOF_VOIDP == SIZEOF_LONG_LONG # define SWIG2NUM(v) LL2NUM((unsigned long long)v) # define NUM2SWIG(x) (unsigned long long)NUM2LL(x) #else # error sizeof(void*) is not the same as long or long long #endif /* Global hash table to store Trackings from C/C++ structs to Ruby Objects. */ static st_table* swig_ruby_trackings = NULL; static VALUE swig_ruby_trackings_count(ID id, VALUE *var) { return SWIG2NUM(swig_ruby_trackings->num_entries); } /* Setup a hash table to store Trackings */ SWIGRUNTIME void SWIG_RubyInitializeTrackings(void) { /* Create a hash table to store Trackings from C++ objects to Ruby objects. */ /* Try to see if some other .so has already created a tracking hash table, which we keep hidden in an instance var in the SWIG module. This is done to allow multiple DSOs to share the same tracking table. */ VALUE trackings_value = Qnil; /* change the variable name so that we can mix modules compiled with older SWIG's - this used to be called "@__trackings__" */ ID trackings_id = rb_intern( "@__safetrackings__" ); VALUE verbose = rb_gv_get("VERBOSE"); rb_gv_set("VERBOSE", Qfalse); trackings_value = rb_ivar_get( _mSWIG, trackings_id ); rb_gv_set("VERBOSE", verbose); /* The trick here is that we have to store the hash table pointer in a Ruby variable. We do not want Ruby's GC to treat this pointer as a Ruby object, so we convert it to a Ruby numeric value. */ if (trackings_value == Qnil) { /* No, it hasn't. Create one ourselves */ swig_ruby_trackings = st_init_numtable(); rb_ivar_set( _mSWIG, trackings_id, SWIG2NUM(swig_ruby_trackings) ); } else { swig_ruby_trackings = (st_table*)NUM2SWIG(trackings_value); } rb_define_virtual_variable("SWIG_TRACKINGS_COUNT", VALUEFUNC(swig_ruby_trackings_count), SWIG_RUBY_VOID_ANYARGS_FUNC((rb_gvar_setter_t*)NULL)); } /* Add a Tracking from a C/C++ struct to a Ruby object */ SWIGRUNTIME void SWIG_RubyAddTracking(void* ptr, VALUE object) { /* Store the mapping to the global hash table. */ st_insert(swig_ruby_trackings, (st_data_t)ptr, object); } /* Get the Ruby object that owns the specified C/C++ struct */ SWIGRUNTIME VALUE SWIG_RubyInstanceFor(void* ptr) { /* Now lookup the value stored in the global hash table */ VALUE value; if (st_lookup(swig_ruby_trackings, (st_data_t)ptr, &value)) { return value; } else { return Qnil; } } /* Remove a Tracking from a C/C++ struct to a Ruby object. It is very important to remove objects once they are destroyed since the same memory address may be reused later to create a new object. */ SWIGRUNTIME void SWIG_RubyRemoveTracking(void* ptr) { /* Delete the object from the hash table */ st_delete(swig_ruby_trackings, (st_data_t *)&ptr, NULL); } /* This is a helper method that unlinks a Ruby object from its underlying C++ object. This is needed if the lifetime of the Ruby object is longer than the C++ object. */ SWIGRUNTIME void SWIG_RubyUnlinkObjects(void* ptr) { VALUE object = SWIG_RubyInstanceFor(ptr); if (object != Qnil) { // object might have the T_ZOMBIE type, but that's just // because the GC has flagged it as such for a deferred // destruction. Until then, it's still a T_DATA object. DATA_PTR(object) = 0; } } /* This is a helper method that iterates over all the trackings passing the C++ object pointer and its related Ruby object to the passed callback function. */ /* Proxy method to abstract the internal trackings datatype */ static int swig_ruby_internal_iterate_callback(st_data_t ptr, st_data_t obj, st_data_t meth) { ((void (*) (void *, VALUE))meth)((void *)ptr, (VALUE)obj); return ST_CONTINUE; } SWIGRUNTIME void SWIG_RubyIterateTrackings( void(*meth)(void* ptr, VALUE obj) ) { st_foreach(swig_ruby_trackings, SWIG_RUBY_INT_ANYARGS_FUNC(swig_ruby_internal_iterate_callback), (st_data_t)meth); } #ifdef __cplusplus } #endif swig-4.0.2/Lib/ruby/director.swg0000644000175000017500000001564613667507523016422 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Ruby proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ /* Use -DSWIG_DIRECTOR_NOUEH if you prefer to avoid the use of the Undefined Exception Handler provided by swig. */ #ifndef SWIG_DIRECTOR_NOUEH #ifndef SWIG_DIRECTOR_UEH #define SWIG_DIRECTOR_UEH #endif #endif #include #include #include #include # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) namespace Swig { /* memory handler */ struct GCItem { virtual ~GCItem() { } virtual swig_ruby_owntype get_own() const { swig_ruby_owntype own = {0, 0}; return own; } }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem *operator->() const { return _item; } private: GCItem *_item; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; struct GCItem_Object : GCItem { GCItem_Object(swig_ruby_owntype own) : _own(own) { } virtual ~GCItem_Object() { } swig_ruby_owntype get_own() const { return _own; } private: swig_ruby_owntype _own; }; template struct GCArray_T : GCItem { GCArray_T(Type *ptr) : _ptr(ptr) { } virtual ~GCArray_T() { delete[] _ptr; } private: Type *_ptr; }; /* body args */ struct body_args { VALUE recv; ID id; int argc; VALUE *argv; }; /* Base class for director exceptions */ class DirectorException : public std::exception { protected: VALUE swig_error; std::string swig_msg; protected: DirectorException(VALUE error) : swig_error(error) { } DirectorException(VALUE error, const char *hdr, const char *msg ="") : swig_error(error), swig_msg(hdr) { if (msg[0]) { swig_msg += " "; swig_msg += msg; } if (swig_msg.size()) { VALUE str = rb_str_new(swig_msg.data(), swig_msg.size()); swig_error = rb_exc_new3(error, str); } else { swig_error = error; } } public: virtual ~DirectorException() throw() { } VALUE getType() const { return CLASS_OF(swig_error); } VALUE getError() const { return swig_error; } /* Deprecated, use what() instead */ const std::string& getMessage() const { return swig_msg; } const char *what() const throw() { return swig_msg.c_str(); } }; /* Type mismatch in the return value from a Ruby method call */ class DirectorTypeMismatchException : public DirectorException { public: DirectorTypeMismatchException(VALUE error, const char *msg="") : DirectorException(error, "SWIG director type mismatch", msg) { } DirectorTypeMismatchException(const char *msg="") : DirectorException(rb_eTypeError, "SWIG director type mismatch", msg) { } static void raise(VALUE error, const char *msg) { throw DirectorTypeMismatchException(error, msg); } static void raise(const char *msg) { throw DirectorTypeMismatchException(msg); } }; /* Any Ruby exception that occurs during a director method call */ class DirectorMethodException : public DirectorException { public: DirectorMethodException(VALUE error) : DirectorException(error) { } DirectorMethodException(const char *msg = "") : DirectorException(rb_eRuntimeError, "SWIG director method error.", msg) { } static void raise(VALUE error) { throw DirectorMethodException(error); } }; /* Attempted to call a pure virtual method via a director method */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg = "") : DirectorException(rb_eRuntimeError, "SWIG director pure virtual method called", msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; /* Simple thread abstraction for pthreads on win32 */ #ifdef __THREAD__ # define __PTHREAD__ # if defined(_WIN32) || defined(__WIN32__) # define pthread_mutex_lock EnterCriticalSection # define pthread_mutex_unlock LeaveCriticalSection # define pthread_mutex_t CRITICAL_SECTION # define SWIG_MUTEX_INIT(var) var # else # include # define SWIG_MUTEX_INIT(var) var = PTHREAD_MUTEX_INITIALIZER # endif #endif #ifdef __PTHREAD__ struct Guard { pthread_mutex_t *_mutex; Guard(pthread_mutex_t &mutex) : _mutex(&mutex) { pthread_mutex_lock(_mutex); } ~Guard() { pthread_mutex_unlock(_mutex); } }; # define SWIG_GUARD(mutex) Guard _guard(mutex) #else # define SWIG_GUARD(mutex) #endif /* director base class */ class Director { private: /* pointer to the wrapped Ruby object */ VALUE swig_self; /* flag indicating whether the object is owned by Ruby or c++ */ mutable bool swig_disown_flag; public: /* wrap a Ruby object. */ Director(VALUE self) : swig_self(self), swig_disown_flag(false) { } /* discard our reference at destruction */ virtual ~Director() { } /* return a pointer to the wrapped Ruby object */ VALUE swig_get_self() const { return swig_self; } /* acquire ownership of the wrapped Ruby object (the sense of "disown" is from Ruby) */ void swig_disown() const { if (!swig_disown_flag) { swig_disown_flag = true; } } /* ownership management */ private: typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; #ifdef __PTHREAD__ static pthread_mutex_t swig_mutex_own; #endif public: template void swig_acquire_ownership_array(Type *vptr) const { if (vptr) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCArray_T(vptr); } } template void swig_acquire_ownership(Type *vptr) const { if (vptr) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCItem_T(vptr); } } void swig_acquire_ownership_obj(void *vptr, swig_ruby_owntype own) const { if (vptr && own.datafree) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCItem_Object(own); } } swig_ruby_owntype swig_release_ownership(void *vptr) const { swig_ruby_owntype own = {0, 0}; if (vptr) { SWIG_GUARD(swig_mutex_own); swig_ownership_map::iterator iter = swig_owner.find(vptr); if (iter != swig_owner.end()) { own.datafree = iter->second->get_own().datafree; swig_owner.erase(iter); } } return own; } }; } swig-4.0.2/Lib/ruby/rubyiterators.swg0000644000175000017500000005445013667507523017521 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubyiterators.swg * * Implement a C++ 'output' iterator for Ruby. * * Users can derive form the Iterator to implement their * own iterators. As an example (real one since we use it for STL/STD * containers), the template Iterator_T does the * implementation for generic C++ iterators. * ----------------------------------------------------------------------------- */ %include %fragment("ConstIterator","header",fragment="",fragment="GC_VALUE_definition") { namespace swig { struct stop_iteration { }; /** * Abstract base class used to represent all iterators of STL containers. */ struct ConstIterator { public: typedef ConstIterator self_type; protected: GC_VALUE _seq; protected: ConstIterator(VALUE seq) : _seq(seq) { } // Random access iterator methods, but not required in Ruby virtual ptrdiff_t distance(const ConstIterator &x) const { throw std::invalid_argument("distance not supported"); } virtual bool equal (const ConstIterator &x) const { throw std::invalid_argument("equal not supported"); } virtual self_type* advance(ptrdiff_t n) { throw std::invalid_argument("advance not supported"); } public: virtual ~ConstIterator() {} // Access iterator method, required by Ruby virtual VALUE value() const { throw std::invalid_argument("value not supported"); return Qnil; }; virtual VALUE setValue( const VALUE& v ) { throw std::invalid_argument("value= not supported"); return Qnil; } virtual self_type* next( size_t n = 1 ) { return this->advance( n ); } virtual self_type* previous( size_t n = 1 ) { ptrdiff_t nn = n; return this->advance( -nn ); } virtual VALUE to_s() const { throw std::invalid_argument("to_s not supported"); return Qnil; } virtual VALUE inspect() const { throw std::invalid_argument("inspect not supported"); return Qnil; } virtual ConstIterator *dup() const { throw std::invalid_argument("dup not supported"); return NULL; } // // C++ common/needed methods. We emulate a bidirectional // operator, to be compatible with all the STL. // The iterator traits will then tell the STL what type of // iterator we really are. // ConstIterator() : _seq( Qnil ) { } ConstIterator( const self_type& b ) : _seq( b._seq ) { } self_type& operator=( const self_type& b ) { _seq = b._seq; return *this; } bool operator == (const ConstIterator& x) const { return equal(x); } bool operator != (const ConstIterator& x) const { return ! operator==(x); } // Pre-decrement operator self_type& operator--() { return *previous(); } // Pre-increment operator self_type& operator++() { return *next(); } // Post-decrement operator self_type operator--(int) { self_type r = *this; previous(); return r; } // Post-increment operator self_type operator++(int) { self_type r = *this; next(); return r; } ConstIterator& operator += (ptrdiff_t n) { return *advance(n); } ConstIterator& operator -= (ptrdiff_t n) { return *advance(-n); } ConstIterator* operator + (ptrdiff_t n) const { return dup()->advance(n); } ConstIterator* operator - (ptrdiff_t n) const { return dup()->advance(-n); } ptrdiff_t operator - (const ConstIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::ConstIterator *"); init = 1; } return desc; } }; /** * Abstract base class used to represent all non-const iterators of STL containers. * */ struct Iterator : public ConstIterator { public: typedef Iterator self_type; protected: Iterator(VALUE seq) : ConstIterator(seq) { } virtual self_type* advance(ptrdiff_t n) { throw std::invalid_argument("operation not supported"); } public: static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::Iterator *"); init = 1; } return desc; } virtual Iterator *dup() const { throw std::invalid_argument("dup not supported"); return NULL; } virtual self_type* next( size_t n = 1 ) { return this->advance( n ); } virtual self_type* previous( size_t n = 1 ) { ptrdiff_t nn = n; return this->advance( -nn ); } bool operator == (const ConstIterator& x) const { return equal(x); } bool operator != (const Iterator& x) const { return ! operator==(x); } Iterator& operator += (ptrdiff_t n) { return *advance(n); } Iterator& operator -= (ptrdiff_t n) { return *advance(-n); } Iterator* operator + (ptrdiff_t n) const { return dup()->advance(n); } Iterator* operator - (ptrdiff_t n) const { return dup()->advance(-n); } ptrdiff_t operator - (const Iterator& x) const { return x.distance(*this); } }; } } %fragment("ConstIterator_T","header",fragment="",fragment="ConstIterator",fragment="StdTraits",fragment="StdIteratorTraits") { namespace swig { /** * Templated base classes for all custom const_iterators. * */ template class ConstIterator_T : public ConstIterator { public: typedef OutConstIterator const_iter; typedef typename std::iterator_traits::value_type value_type; typedef ConstIterator_T self_type; protected: virtual bool equal (const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual ptrdiff_t distance(const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual ConstIterator* advance(ptrdiff_t n) { std::advance( current, n ); return this; } public: ConstIterator_T() : ConstIterator(Qnil) { } ConstIterator_T(const_iter curr, VALUE seq = Qnil) : ConstIterator(seq), current(curr) { } const const_iter& get_current() const { return current; } const value_type& operator*() const { return *current; } virtual VALUE inspect() const { VALUE ret = rb_str_new2("#<"); ret = rb_str_cat2( ret, rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::const_iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_inspect(cur) ); ret = rb_str_cat2( ret, ">" ); return ret; } virtual VALUE to_s() const { VALUE ret = rb_str_new2( rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::const_iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_obj_as_string(cur) ); return ret; } protected: const_iter current; }; /** * Templated base classes for all custom non-const iterators. * */ template class Iterator_T : public Iterator { public: typedef InOutIterator nonconst_iter; // Make this class iterator STL compatible, by using iterator_traits typedef typename std::iterator_traits::iterator_category iterator_category; typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::difference_type difference_type; typedef typename std::iterator_traits::pointer pointer; typedef typename std::iterator_traits::reference reference; typedef Iterator base; typedef Iterator_T< nonconst_iter > self_type; protected: virtual bool equal (const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual ptrdiff_t distance(const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual Iterator* advance(ptrdiff_t n) { std::advance( current, n ); return this; } public: Iterator_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator(seq), current(curr) { } const nonconst_iter& get_current() const { return current; } self_type& operator=( const self_type& b ) { base::operator=( b ); return *this; } self_type& operator=( const value_type& b ) { *current = b; return *this; } const value_type& operator*() const { return *current; } value_type& operator*() { return *current; } virtual VALUE inspect() const { VALUE ret = rb_str_new2("#<"); ret = rb_str_cat2( ret, rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_inspect(cur) ); ret = rb_str_cat2( ret, ">" ); return ret; } virtual VALUE to_s() const { VALUE ret = rb_str_new2( rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_obj_as_string(cur) ); return ret; } protected: nonconst_iter current; }; /** * Auxiliary functor to store the value of a ruby object inside * a reference of a compatible C++ type. ie: Ruby -> C++ * */ template struct asval_oper { typedef ValueType value_type; typedef bool result_type; bool operator()(VALUE obj, value_type& v) const { return ( swig::asval< value_type >(obj, &v) == SWIG_OK ); } }; /** * Auxiliary functor to return a ruby object from a C++ type. * ie: C++ -> Ruby * */ template struct from_oper { typedef const ValueType& argument_type; typedef VALUE result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; /** * ConstIterator class for a const_iterator with no end() boundaries. * */ template::value_type, typename FromOper = from_oper > class ConstIteratorOpen_T : public ConstIterator_T { public: FromOper from; typedef OutConstIterator const_iter; typedef ValueType value_type; typedef ConstIterator_T base; typedef ConstIteratorOpen_T self_type; ConstIteratorOpen_T(const_iter curr, VALUE seq = Qnil) : ConstIterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } ConstIterator *dup() const { return new self_type(*this); } }; /** * Iterator class for an iterator with no end() boundaries. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class IteratorOpen_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef IteratorOpen_T self_type; public: IteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } virtual VALUE setValue( const VALUE& v ) { value_type& dst = *base::current; if ( asval(v, dst) ) return v; return Qnil; } Iterator *dup() const { return new self_type(*this); } }; /** * ConstIterator class for a const_iterator where begin() and end() boundaries are known. * */ template::value_type, typename FromOper = from_oper > class ConstIteratorClosed_T : public ConstIterator_T { public: FromOper from; typedef OutConstIterator const_iter; typedef ValueType value_type; typedef ConstIterator_T base; typedef ConstIteratorClosed_T self_type; protected: virtual ConstIterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: ConstIteratorClosed_T(const_iter curr, const_iter first, const_iter last, VALUE seq = Qnil) : ConstIterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } ConstIterator *dup() const { return new self_type(*this); } private: const_iter begin; const_iter end; }; /** * Iterator class for a iterator where begin() and end() boundaries are known. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class IteratorClosed_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef IteratorClosed_T self_type; protected: virtual Iterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: IteratorClosed_T(nonconst_iter curr, nonconst_iter first, nonconst_iter last, VALUE seq = Qnil) : Iterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } // Iterator setter method, required by Ruby virtual VALUE setValue( const VALUE& v ) { if (base::current == end) throw stop_iteration(); value_type& dst = *base::current; if ( asval( v, dst ) ) return v; return Qnil; } Iterator *dup() const { return new self_type(*this); } private: nonconst_iter begin; nonconst_iter end; }; /* Partial specialization for bools which don't allow de-referencing */ template< typename InOutIterator, typename FromOper, typename AsvalOper > class IteratorOpen_T< InOutIterator, bool, FromOper, AsvalOper > : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef bool value_type; typedef Iterator_T base; typedef IteratorOpen_T self_type; IteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } virtual VALUE setValue( const VALUE& v ) { bool tmp = *base::current; if ( asval( v, tmp ) ) { *base::current = tmp; return v; } return Qnil; } Iterator *dup() const { return new self_type(*this); } }; /* Partial specialization for bools which don't allow de-referencing */ template< typename InOutIterator, typename FromOper, typename AsvalOper > class IteratorClosed_T< InOutIterator, bool, FromOper, AsvalOper > : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef bool value_type; typedef Iterator_T base; typedef IteratorClosed_T self_type; protected: virtual Iterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: IteratorClosed_T(nonconst_iter curr, nonconst_iter first, nonconst_iter last, VALUE seq = Qnil) : Iterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } virtual VALUE setValue( const VALUE& v ) { if (base::current == end) throw stop_iteration(); bool tmp = *base::current; if ( asval( v, tmp ) ) { *base::current = tmp; return v; } return Qnil; } Iterator *dup() const { return new self_type(*this); } private: nonconst_iter begin; nonconst_iter end; }; /** * Helper function used to wrap a bounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline Iterator* make_nonconst_iterator(const InOutIter& current, const InOutIter& begin, const InOutIter& end, VALUE seq = Qnil) { return new IteratorClosed_T(current, begin, end, seq); } /** * Helper function used to wrap an unbounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline Iterator* make_nonconst_iterator(const InOutIter& current, VALUE seq = Qnil) { return new IteratorOpen_T(current, seq); } /** * Helper function used to wrap a bounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline ConstIterator* make_const_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, VALUE seq = Qnil) { return new ConstIteratorClosed_T(current, begin, end, seq); } /** * Helper function used to wrap an unbounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline ConstIterator* make_const_iterator(const OutIter& current, VALUE seq = Qnil) { return new ConstIteratorOpen_T(current, seq); } } } %fragment("ConstIterator"); // // This part is just so SWIG is aware of the base abstract iterator class. // namespace swig { /* Throw a StopIteration exception */ %ignore stop_iteration; struct stop_iteration {}; %typemap(throws) stop_iteration { (void)$1; SWIG_Ruby_ExceptionType(NULL, Qnil); SWIG_fail; } /* Mark methods that return new objects */ %newobject ConstIterator::dup; %newobject ConstIterator::operator + (ptrdiff_t n) const; %newobject ConstIterator::operator - (ptrdiff_t n) const; %nodirector ConstIterator; %catches(swig::stop_iteration) ConstIterator::value() const; %catches(swig::stop_iteration) ConstIterator::incr(size_t n = 1); %catches(swig::stop_iteration) ConstIterator::decr(size_t n = 1); %catches(std::invalid_argument) ConstIterator::distance(const ConstIterator &x) const; %catches(std::invalid_argument) ConstIterator::equal (const ConstIterator &x) const; %catches(swig::stop_iteration) ConstIterator::next(); %catches(swig::stop_iteration) ConstIterator::previous(); %catches(swig::stop_iteration) ConstIterator::advance(ptrdiff_t n); %catches(swig::stop_iteration) ConstIterator::operator += (ptrdiff_t n); %catches(swig::stop_iteration) ConstIterator::operator -= (ptrdiff_t n); %catches(swig::stop_iteration) ConstIterator::operator + (ptrdiff_t n) const; %catches(swig::stop_iteration) ConstIterator::operator - (ptrdiff_t n) const; struct ConstIterator { protected: ConstIterator(VALUE seq); public: virtual ~ConstIterator(); // Access iterator method, required by Ruby virtual VALUE value() const; // C++ common/needed methods virtual ConstIterator *dup() const; virtual VALUE inspect() const; virtual VALUE to_s() const; virtual ConstIterator* next(size_t n = 1); virtual ConstIterator* previous(size_t n = 1); bool operator == (const ConstIterator& x) const; ConstIterator* operator + (ptrdiff_t n) const; ConstIterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const ConstIterator& x) const; }; struct Iterator : public ConstIterator { %rename("value=") setValue( const VALUE& v ); virtual VALUE setValue( const VALUE& v ); virtual Iterator *dup() const; virtual Iterator* next(size_t n = 1); virtual Iterator* previous(size_t n = 1); virtual VALUE inspect() const; virtual VALUE to_s() const; bool operator == (const Iterator& x) const; Iterator* operator + (ptrdiff_t n) const; Iterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const Iterator& x) const; }; } swig-4.0.2/Lib/ruby/rubyerrors.swg0000644000175000017500000000720213667507523017012 0ustar williamwilliam/* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ /* Define some additional error types */ #define SWIG_ObjectPreviouslyDeletedError -100 /* Define custom exceptions for errors that do not map to existing Ruby exceptions. Note this only works for C++ since a global cannot be initialized by a function in C. For C, fallback to rb_eRuntimeError.*/ SWIGINTERN VALUE getNullReferenceError(void) { static int init = 0; static VALUE rb_eNullReferenceError ; if (!init) { init = 1; rb_eNullReferenceError = rb_define_class("NullReferenceError", rb_eRuntimeError); } return rb_eNullReferenceError; } SWIGINTERN VALUE getObjectPreviouslyDeletedError(void) { static int init = 0; static VALUE rb_eObjectPreviouslyDeleted ; if (!init) { init = 1; rb_eObjectPreviouslyDeleted = rb_define_class("ObjectPreviouslyDeleted", rb_eRuntimeError); } return rb_eObjectPreviouslyDeleted; } SWIGINTERN VALUE SWIG_Ruby_ErrorType(int SWIG_code) { VALUE type; switch (SWIG_code) { case SWIG_MemoryError: type = rb_eNoMemError; break; case SWIG_IOError: type = rb_eIOError; break; case SWIG_RuntimeError: type = rb_eRuntimeError; break; case SWIG_IndexError: type = rb_eIndexError; break; case SWIG_TypeError: type = rb_eTypeError; break; case SWIG_DivisionByZero: type = rb_eZeroDivError; break; case SWIG_OverflowError: type = rb_eRangeError; break; case SWIG_SyntaxError: type = rb_eSyntaxError; break; case SWIG_ValueError: type = rb_eArgError; break; case SWIG_SystemError: type = rb_eFatal; break; case SWIG_AttributeError: type = rb_eRuntimeError; break; case SWIG_NullReferenceError: type = getNullReferenceError(); break; case SWIG_ObjectPreviouslyDeletedError: type = getObjectPreviouslyDeletedError(); break; case SWIG_UnknownError: type = rb_eRuntimeError; break; default: type = rb_eRuntimeError; } return type; } /* This function is called when a user inputs a wrong argument to a method. */ SWIGINTERN const char* Ruby_Format_TypeError( const char* msg, const char* type, const char* name, const int argn, VALUE input ) { char buf[128]; VALUE str; VALUE asStr; if ( msg && *msg ) { str = rb_str_new2(msg); } else { str = rb_str_new(NULL, 0); } str = rb_str_cat2( str, "Expected argument " ); sprintf( buf, "%d of type ", argn-1 ); str = rb_str_cat2( str, buf ); str = rb_str_cat2( str, type ); str = rb_str_cat2( str, ", but got " ); str = rb_str_cat2( str, rb_obj_classname(input) ); str = rb_str_cat2( str, " " ); asStr = rb_inspect(input); if ( RSTRING_LEN(asStr) > 30 ) { str = rb_str_cat( str, StringValuePtr(asStr), 30 ); str = rb_str_cat2( str, "..." ); } else { str = rb_str_append( str, asStr ); } if ( name ) { str = rb_str_cat2( str, "\n\tin SWIG method '" ); str = rb_str_cat2( str, name ); str = rb_str_cat2( str, "'" ); } return StringValuePtr( str ); } /* This function is called when an overloaded method fails */ SWIGINTERN void Ruby_Format_OverloadedError( const int argc, const int maxargs, const char* method, const char* prototypes ) { const char* msg = "Wrong # of arguments"; if ( argc <= maxargs ) msg = "Wrong arguments"; rb_raise(rb_eArgError,"%s for overloaded method '%s'.\n" "Possible C/C++ prototypes are:\n%s", msg, method, prototypes); } swig-4.0.2/Lib/ruby/cpointer.i0000644000175000017500000000004113667507523016041 0ustar williamwilliam%include swig-4.0.2/Lib/ruby/std_shared_ptr.i0000644000175000017500000001056313667507523017235 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include %include %fragment("StdSharedPtrTraits","header",fragment="StdTraitsForwardDeclaration",fragment="") { namespace swig { /* Template specialization for functions defined in rubystdcommon.swg. Special handling for shared_ptr is required as, shared_ptr * is used rather than the usual T *, see shared_ptr.i. */ template struct traits_asptr > { static int asptr(VALUE obj, std::shared_ptr **val) { int res = SWIG_ERROR; swig_type_info *descriptor = type_info >(); if (val) { std::shared_ptr *p = 0; swig_ruby_owntype newmem = {0, 0}; res = descriptor ? SWIG_ConvertPtrAndOwn(obj, (void **)&p, descriptor, 0, &newmem) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (*val) { **val = p ? *p : std::shared_ptr(); } else { *val = p; if (newmem.own & SWIG_CAST_NEW_MEMORY) { // Upcast for pointers to shared_ptr in this generic framework has not been implemented res = SWIG_ERROR; } } if (newmem.own & SWIG_CAST_NEW_MEMORY) delete p; } } else { res = descriptor ? SWIG_ConvertPtr(obj, 0, descriptor, 0) : SWIG_ERROR; } return res; } }; template struct traits_asval > { static int asval(VALUE obj, std::shared_ptr *val) { if (val) { std::shared_ptr ret; std::shared_ptr *p = &ret; int res = traits_asptr >::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; *val = ret; return SWIG_OK; } else { return traits_asptr >::asptr(obj, (std::shared_ptr **)(0)); } } }; template struct traits_asval *> { static int asval(VALUE obj, std::shared_ptr **val) { if (val) { typedef typename noconst_traits >::noconst_type noconst_type; if (*val) { noconst_type ret; noconst_type *p = &ret; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) **(const_cast(val)) = ret; return res; } else { noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) *val = p; return res; } } else { return traits_asptr >::asptr(obj, (std::shared_ptr **)(0)); } } }; template struct traits_as, pointer_category> { static std::shared_ptr as(VALUE obj) { std::shared_ptr ret; std::shared_ptr *v = &ret; int res = traits_asptr >::asptr(obj, &v); if (SWIG_IsOK(res)) { return ret; } else { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) SWIG_Error(SWIG_TypeError, swig::type_name >()); throw std::invalid_argument("bad type"); } } }; template struct traits_as *, pointer_category> { static std::shared_ptr * as(VALUE obj) { std::shared_ptr *p = 0; int res = traits_asptr >::asptr(obj, &p); if (SWIG_IsOK(res)) { return p; } else { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) SWIG_Error(SWIG_TypeError, swig::type_name *>()); throw std::invalid_argument("bad type"); } } }; template struct traits_from_ptr > { static VALUE from(std::shared_ptr *val, int owner = 0) { if (val && *val) { return SWIG_NewPointerObj(val, type_info >(), owner); } else { return Qnil; } } }; /* The descriptors in the shared_ptr typemaps remove the const qualifier for the SWIG type system. Remove const likewise here, otherwise SWIG_TypeQuery("std::shared_ptr") will return NULL. */ template struct traits_from > { static VALUE from(const std::shared_ptr& val) { std::shared_ptr p = std::const_pointer_cast(val); return swig::from(p); } }; } } %fragment("StdSharedPtrTraits"); swig-4.0.2/Lib/ruby/timeval.i0000644000175000017500000000223413667507523015665 0ustar williamwilliam/* struct timeval * time_t Ruby has builtin class Time. INPUT/OUTPUT typemap for timeval and time_t is provided. */ %{ #ifdef __cplusplus extern "C" { #endif #ifdef HAVE_SYS_TIME_H # include struct timeval rb_time_timeval(VALUE); #endif #ifdef __cplusplus } #endif %} %typemap(in) struct timeval *INPUT (struct timeval temp) { if (NIL_P($input)) $1 = NULL; else { temp = rb_time_timeval($input); $1 = &temp; } } %typemap(in,numinputs=0) struct timeval *OUTPUT(struct timeval temp) { $1 = &temp; } %typemap(argout) struct timeval *OUTPUT { $result = rb_time_new($1->tv_sec, $1->tv_usec); } %typemap(out) struct timeval * { $result = rb_time_new($1->tv_sec, $1->tv_usec); } %typemap(out) struct timespec * { $result = rb_time_new($1->tv_sec, $1->tv_nsec / 1000); } // time_t %typemap(in) time_t { if (NIL_P($input)) $1 = (time_t)-1; else $1 = NUM2LONG(rb_funcall($input, rb_intern("tv_sec"), 0)); } %typemap(typecheck) time_t { $1 = (NIL_P($input) || TYPE(rb_funcall($input, rb_intern("respond_to?"), 1, ID2SYM(rb_intern("tv_sec")))) == T_TRUE); } %typemap(out) time_t { $result = rb_time_new($1, 0); } swig-4.0.2/Lib/ruby/std_multimap.i0000644000175000017500000001375013667507523016733 0ustar williamwilliam/* Multimaps */ %include %fragment("StdMultimapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const RubySeq& rubyseq, std::multimap *multimap) { typedef typename std::multimap::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { multimap->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::multimap multimap_type; static int asptr(VALUE obj, std::multimap **val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_HASH ) { static ID id_to_a = rb_intern("to_a"); VALUE items = rb_funcall(obj, id_to_a, 0); return traits_asptr_stdseq, std::pair >::asptr(items, val); } else { multimap_type *p; res = SWIG_ConvertPtr(obj,(void**)&p,swig::type_info(),0); if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::multimap multimap_type; typedef typename multimap_type::const_iterator const_iterator; typedef typename multimap_type::size_type size_type; static VALUE from(const multimap_type& multimap) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new multimap_type(multimap), desc, SWIG_POINTER_OWN); } else { size_type size = multimap.size(); int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "multimap size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE obj = rb_hash_new(); for (const_iterator i= multimap.begin(); i!= multimap.end(); ++i) { VALUE key = swig::from(i->first); VALUE val = swig::from(i->second); VALUE oldval = rb_hash_aref( obj, key ); if ( oldval == Qnil ) rb_hash_aset(obj, key, val); else { // Multiple values for this key, create array if needed // and add a new element to it. VALUE ary; if ( TYPE(oldval) == T_ARRAY ) ary = oldval; else { ary = rb_ary_new2(2); rb_ary_push( ary, oldval ); rb_hash_aset( obj, key, ary ); } rb_ary_push( ary, val ); } } return obj; } } }; } } %define %swig_multimap_methods(MultiMap...) %swig_map_common(%arg(MultiMap)); %extend { VALUE __getitem__(const key_type& key) const { std::pair r = $self->equal_range(key); if ( r.first != r.second ) { VALUE ary = rb_ary_new(); for (MultiMap::const_iterator i = r.first ; i != r.second; ++i ) { rb_ary_push( ary, swig::from( i->second ) ); } if ( RARRAY_LEN(ary) == 1 ) return RARRAY_PTR(ary)[0]; return ary; } else return Qnil; } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { self->insert(MultiMap::value_type(key,x)); } VALUE inspect() { MultiMap::iterator i = $self->begin(); MultiMap::iterator e = $self->end(); const char *type_name = swig::type_name< MultiMap >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " {" ); VALUE tmp; while ( i != e ) { const MultiMap::key_type& key = i->first; const MultiMap::key_type& oldkey = key; tmp = swig::from( key ); str = rb_str_buf_append( str, rb_inspect(tmp) ); str = rb_str_cat2( str, "=>" ); VALUE vals = rb_ary_new(); for ( ; i != e && key == oldkey; ++i ) { const MultiMap::mapped_type& val = i->second; tmp = swig::from( val ); rb_ary_push( vals, tmp ); } if ( RARRAY_LEN(vals) == 1 ) { str = rb_str_buf_append( str, rb_inspect(tmp) ); } else { str = rb_str_buf_append( str, rb_inspect(vals) ); } } str = rb_str_cat2( str, "}" ); return str; } VALUE to_a() { MultiMap::const_iterator i = $self->begin(); MultiMap::const_iterator e = $self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; while ( i != e ) { const MultiMap::key_type& key = i->first; const MultiMap::key_type& oldkey = key; tmp = swig::from( key ); rb_ary_push( ary, tmp ); VALUE vals = rb_ary_new(); for ( ; i != e && key == oldkey; ++i ) { const MultiMap::mapped_type& val = i->second; tmp = swig::from( val ); rb_ary_push( vals, tmp ); } if ( RARRAY_LEN(vals) == 1 ) { rb_ary_push( ary, tmp ); } else { rb_ary_push( ary, vals ); } } return ary; } VALUE to_s() { MultiMap::iterator i = $self->begin(); MultiMap::iterator e = $self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; while ( i != e ) { const MultiMap::key_type& key = i->first; const MultiMap::key_type& oldkey = key; tmp = swig::from( key ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); VALUE vals = rb_ary_new(); for ( ; i != e && key == oldkey; ++i ) { const MultiMap::mapped_type& val = i->second; tmp = swig::from( val ); rb_ary_push( vals, tmp ); } tmp = rb_obj_as_string( vals ); str = rb_str_buf_append( str, tmp ); } return str; } } %enddef %mixin std::multimap "Enumerable"; %rename("delete") std::multimap::__delete__; %rename("reject!") std::multimap::reject_bang; %rename("map!") std::multimap::map_bang; %rename("empty?") std::multimap::empty; %rename("include?" ) std::multimap::__contains__ const; %rename("has_key?" ) std::multimap::has_key const; %alias std::multimap::push "<<"; %include swig-4.0.2/Lib/ruby/rubytypemaps.swg0000644000175000017500000000342013667507523017336 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Ruby * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* bool is dangerous in Ruby, change precedence */ #undef SWIG_TYPECHECK_BOOL %define SWIG_TYPECHECK_BOOL 10000 %enddef /* Include fundamental fragment definitions */ %include /* Look for user fragments file. */ %include /* Ruby fragments for primitive types */ %include /* Ruby fragments for char* strings */ %include /* Backward compatibility output helper */ %fragment("output_helper","header") %{ #define output_helper SWIG_Ruby_AppendOutput %} /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* Directors are supported in Ruby */ #ifndef SWIG_DIRECTOR_TYPEMAPS #define SWIG_DIRECTOR_TYPEMAPS #endif /* Ruby types */ #define SWIG_Object VALUE #define VOID_Object Qnil /* Overload of the output/constant/exception handling */ /* append output */ #define SWIG_AppendOutput(result,obj) SWIG_Ruby_AppendOutput(result, obj) /* set constant */ #define SWIG_SetConstant(name, obj) rb_define_const($module, name, obj) /* raise */ #define SWIG_Raise(obj, type, desc) rb_exc_raise(SWIG_Ruby_ExceptionType(desc, obj)) /* Get the address of the 'Ruby self' object */ %typemap(in,numinputs=0,noblock=1) VALUE* RUBY_SELF { $1 = &self; } /* Include the unified typemap library */ %include swig-4.0.2/Lib/ruby/std_unordered_multiset.i0000644000175000017500000000356613667507523021024 0ustar williamwilliam/* Multisets */ %include %fragment("StdUnorderedMultisetTraits","header",fragment="StdUnorderedSetTraits") %{ namespace swig { template inline void assign(const RubySeq& rubyseq, std::unordered_multiset* seq) { // seq->insert(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(VALUE obj, std::unordered_multiset **m) { return traits_asptr_stdseq >::asptr(obj, m); } }; template struct traits_from > { static VALUE from(const std::unordered_multiset& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_unordered_multiset_methods(Set...) %swig_unordered_set_methods(Set) %mixin std::unordered_multiset "Enumerable"; %rename("delete") std::unordered_multiset::__delete__; %rename("reject!") std::unordered_multiset::reject_bang; %rename("map!") std::unordered_multiset::map_bang; %rename("empty?") std::unordered_multiset::empty; %rename("include?") std::unordered_multiset::__contains__ const; %rename("has_key?") std::unordered_multiset::has_key const; %alias std::unordered_multiset::push "<<"; %include swig-4.0.2/Lib/ruby/std_vector.i0000644000175000017500000000230213667507523016374 0ustar williamwilliam/* Vectors */ %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } %} %define %swig_vector_methods(Type...) %swig_sequence_methods(Type) %swig_sequence_front_inserters(Type); %enddef %define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %swig_sequence_front_inserters(Type); %enddef %mixin std::vector "Enumerable"; %ignore std::vector::push_back; %ignore std::vector::pop_back; %rename("delete") std::vector::__delete__; %rename("reject!") std::vector::reject_bang; %rename("map!") std::vector::map_bang; %rename("empty?") std::vector::empty; %rename("include?" ) std::vector::__contains__ const; %rename("has_key?" ) std::vector::has_key const; %alias std::vector::push "<<"; %include swig-4.0.2/Lib/ruby/Makefile.swig0000644000175000017500000000165613667507523016471 0ustar williamwilliam# File : Makefile.swig # Makefile for a SWIG module. Use this file if you are # producing a Ruby extension for general use or distribution. # # 1. Prepare extconf.rb. # 2. Modify this file as appropriate. # 3. Type 'make -f Makefile.swig' to generate wrapper code and Makefile. # 4. Type 'make' to build your extension. # 5. Type 'make install' to install your extension. # MODULE = yourmodule FEATURE = $(MODULE) INTERFACE = $(MODULE).i RUBY = ruby SWIG = swig # for C extension SWIGOPT = -ruby WRAPPER = $(MODULE)_wrap.c ## for C++ extension #SWIGOPT = -ruby -c++ #WRAPPER = $(MODULE)_wrap.cc swigall: $(WRAPPER) Makefile $(WRAPPER): $(INTERFACE) $(SWIG) $(SWIGOPT) -o $@ $(INTERFACE) Makefile: extconf.rb $(RUBY) extconf.rb @if [ -f Makefile ] ; then\ echo "include Makefile.swig" >> Makefile;\ fi swigclean: @if [ -f Makefile ] ; then\ make -f Makefile clean;\ fi rm -f Makefile $(WRAPPER) swig-4.0.2/Lib/ruby/std_alloc.i0000644000175000017500000000003313667507523016163 0ustar williamwilliam%include swig-4.0.2/Lib/ruby/rubystrings.swg0000644000175000017500000000304113667507523017164 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_AsCharPtrAndSize(VALUE obj, char** cptr, size_t* psize, int *alloc) { if (TYPE(obj) == T_STRING) { char *cstr = StringValuePtr(obj); size_t size = RSTRING_LEN(obj) + 1; if (cptr) { if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = %new_copy_array(cstr, size, char); } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } } if (psize) *psize = size; return SWIG_OK; } else { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *)vptr; if (psize) *psize = vptr ? (strlen((char*)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE VALUE SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > LONG_MAX) { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); return pchar_descriptor ? SWIG_NewPointerObj(%const_cast(carray,char *), pchar_descriptor, 0) : Qnil; } else { return rb_str_new(carray, %numeric_cast(size,long)); } } else { return Qnil; } } } swig-4.0.2/Lib/ruby/rubystdautodoc.swg0000644000175000017500000000343313667507523017651 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubystdautodoc.swg * * This file contains autodocs for standard STL functions. * ----------------------------------------------------------------------------- */ // // For STL autodocumentation // AUTODOC(c_str, "Convert class to a String representation"); AUTODOC(begin, "Return an iterator to the beginning of the $class"); AUTODOC(end, "Return an iterator to past the end of the $class"); AUTODOC(rbegin, "Return a reverse iterator to the beginning (the end) of the $class"); AUTODOC(rend, "Return a reverse iterator to past the end (past the beginning) of the $class"); AUTODOC(length, "Size or Length of the $class"); AUTODOC(replace, "Replace all or a portion of the $class"); AUTODOC(resize, "Resize the size of the $class"); AUTODOC(capacity, "Reserved capacity of the $class"); AUTODOC(reserve, "Reserve memory in the $class for a number of elements"); AUTODOC(erase, "Delete a portion of the $class"); AUTODOC(max_size, "Maximum size of elements allowed in the $class"); AUTODOC(iterator, "Return an iterator to the $class"); AUTODOC(empty, "Check if the $class is empty or not"); AUTODOC(rfind, "Find an element in reverse usually starting from the end of the $class"); AUTODOC(assign, "Assign a new $class or portion of it"); AUTODOC(front, "Return the first element in $class"); AUTODOC(back, "Return the last element in $class"); AUTODOC(second, "Return the second element in $class"); AUTODOC(push_front, "Add an element at the beginning of the $class"); AUTODOC(push_back, "Add an element at the end of the $class"); AUTODOC(pop_front, "Remove and return element at the beginning of the $class"); AUTODOC(pop_back, "Remove and return an element at the end of the $class"); AUTODOC(clear, "Clear $class contents"); swig-4.0.2/Lib/ruby/std_set.i0000644000175000017500000001460313667507523015674 0ustar williamwilliam/* Sets */ %fragment("StdSetTraits","header",fragment="",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const RubySeq& rubyseq, std::set* seq) { // seq->insert(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(VALUE obj, std::set **s) { return traits_asptr_stdseq >::asptr(obj, s); } }; template struct traits_from > { static VALUE from(const std::set& vec) { return traits_from_stdseq >::from(vec); } }; /** * Set Iterator class for an iterator with no end() boundaries. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class SetIteratorOpen_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef SetIteratorOpen_T self_type; public: SetIteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } // no setValue allowed Iterator *dup() const { return new self_type(*this); } }; /** * Set Iterator class for a iterator where begin() and end() boundaries are known. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class SetIteratorClosed_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef SetIteratorClosed_T self_type; protected: virtual Iterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: SetIteratorClosed_T(nonconst_iter curr, nonconst_iter first, nonconst_iter last, VALUE seq = Qnil) : Iterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } // no setValue allowed Iterator *dup() const { return new self_type(*this); } private: nonconst_iter begin; nonconst_iter end; }; // Template specialization to construct a closed iterator for sets // this turns a nonconst iterator into a const one for ruby to avoid // allowing the user to change the value template< typename InOutIter > inline Iterator* make_set_nonconst_iterator(const InOutIter& current, const InOutIter& begin, const InOutIter& end, VALUE seq = Qnil) { return new SetIteratorClosed_T< InOutIter >(current, begin, end, seq); } // Template specialization to construct an open iterator for sets // this turns a nonconst iterator into a const one for ruby to avoid // allowing the user to change the value template< typename InOutIter > inline Iterator* make_set_nonconst_iterator(const InOutIter& current, VALUE seq = Qnil) { return new SetIteratorOpen_T< InOutIter >(current, seq); } } %} %define %swig_sequence_methods_extra_set(Sequence...) %extend { %alias reject_bang "delete_if"; Sequence* reject_bang() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); for ( Sequence::iterator i = $self->begin(); i != $self->end(); ) { VALUE r = swig::from< Sequence::value_type >(*i); Sequence::iterator current = i++; if ( RTEST( rb_yield(r) ) ) $self->erase(current); } return self; } } %enddef %define %swig_set_methods(set...) %swig_sequence_methods_common(%arg(set)); %swig_sequence_methods_extra_set(%arg(set)); %fragment("RubyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="RubySequence_Cont") {} // Redefine std::set iterator/reverse_iterator typemap %typemap(out,noblock=1) iterator, reverse_iterator { $result = SWIG_NewPointerObj(swig::make_set_nonconst_iterator(%static_cast($1,const $type &), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); } // Redefine std::set std::pair typemap %typemap(out,noblock=1,fragment="RubyPairBoolOutputIterator") std::pair { $result = rb_ary_new2(2); rb_ary_push($result, SWIG_NewPointerObj(swig::make_set_nonconst_iterator(%static_cast($1,$type &).first), swig::Iterator::descriptor(),SWIG_POINTER_OWN)); rb_ary_push($result, SWIG_From(bool)(%static_cast($1,const $type &).second)); } %extend { %alias push "<<"; value_type push(const value_type& x) { self->insert(x); return x; } bool __contains__(const value_type& x) { return self->find(x) != self->end(); } value_type __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } }; %enddef %mixin std::set "Enumerable"; %rename("delete") std::set::__delete__; %rename("reject!") std::set::reject_bang; %rename("map!") std::set::map_bang; %rename("empty?") std::set::empty; %rename("include?" ) std::set::__contains__ const; %rename("has_key?" ) std::set::has_key const; %alias std::set::push "<<"; %include swig-4.0.2/Lib/ruby/rubydef.swg0000644000175000017500000000005213667507523016230 0ustar williamwilliam/* empty file added for backward comp. */ swig-4.0.2/Lib/ruby/std_container.i0000644000175000017500000000007413667507523017060 0ustar williamwilliam%include %include swig-4.0.2/Lib/ruby/rubystdcommon.swg0000644000175000017500000001147013667507523017503 0ustar williamwilliam /* ------------------------------------------------------------ * The Ruby classes, for C++ * ------------------------------------------------------------ */ %include %include %fragment("StdTraits","header",fragment="StdTraitsCommon",fragment="StdTraitsForwardDeclaration") { namespace swig { /* Traits that provides the from method */ template struct traits_from_ptr { static VALUE from(Type *val, int owner = 0) { return SWIG_NewPointerObj(val, type_info(), owner); } }; template struct traits_from { static VALUE from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static VALUE from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static VALUE from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline VALUE from(const Type& val) { return traits_from::from(val); } template inline VALUE from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } /* Traits that provides the asval/as/check method */ template struct traits_asptr { static int asptr(VALUE obj, Type **val) { Type *p = 0; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(VALUE obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(VALUE obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(VALUE obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(VALUE obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(VALUE obj) { Type v; int res = asval(obj, &v); if (!SWIG_IsOK(res)) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } return v; } }; template struct traits_as { static Type as(VALUE obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type* as(VALUE obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res)) { return v; } else { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template inline Type as(VALUE obj) { return traits_as< Type, typename traits< Type >::category >::as(obj); } template struct traits_check { static bool check(VALUE obj) { int res = asval(obj, (Type *)(0)); return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(VALUE obj) { int res = asptr(obj, (Type **)(0)); return SWIG_IsOK(res) ? true : false; } }; template inline bool check(VALUE obj) { return traits_check::category>::check(obj); } } } swig-4.0.2/Lib/ruby/std_wstring.i0000644000175000017500000000305413667507523016574 0ustar williamwilliam%{ #if defined(__linux__) #include #if BYTE_ORDER == LITTLE_ENDIAN #define SWIG_RUBY_ENDIAN "LE" #elif BYTE_ORDER == BIG_ENDIAN #define SWIG_RUBY_ENDIAN "BE" #endif #else #define SWIG_RUBY_ENDIAN "LE" #endif #ifdef __cplusplus extern "C" { #endif #ifdef HAVE_RUBY_ENCODING_H #include "ruby/encoding.h" #endif /** * The internal encoding of std::wstring is defined based on * the size of wchar_t. If it is not appropriate for your library, * SWIG_RUBY_WSTRING_ENCODING must be given when compiling. */ #ifndef SWIG_RUBY_WSTRING_ENCODING #if WCHAR_MAX == 0x7fff || WCHAR_MAX == 0xffff #define SWIG_RUBY_WSTRING_ENCODING "UTF-16" SWIG_RUBY_ENDIAN #elif WCHAR_MAX == 0x7fffffff || WCHAR_MAX == 0xffffffff #define SWIG_RUBY_WSTRING_ENCODING "UTF-32" SWIG_RUBY_ENDIAN #else #error unsupported wchar_t size. SWIG_RUBY_WSTRING_ENCODING must be given. #endif #endif /** * If Encoding.default_internal is nil, this encoding will be used * when converting from std::wstring to String object in Ruby. */ #ifndef SWIG_RUBY_INTERNAL_ENCODING #define SWIG_RUBY_INTERNAL_ENCODING "UTF-8" #endif static rb_encoding *swig_ruby_wstring_encoding; static rb_encoding *swig_ruby_internal_encoding; #ifdef __cplusplus } #endif %} %fragment("SWIG_ruby_wstring_encoding_init", "init") { swig_ruby_wstring_encoding = rb_enc_find( SWIG_RUBY_WSTRING_ENCODING ); swig_ruby_internal_encoding = rb_enc_find( SWIG_RUBY_INTERNAL_ENCODING ); } %warnfilter(SWIGWARN_RUBY_WRONG_NAME) std::basic_string; %include %include swig-4.0.2/Lib/ruby/file.i0000644000175000017500000000120213667507523015135 0ustar williamwilliam// FILE * %{ #ifdef __cplusplus extern "C" { #endif /* Ruby 1.9 changed the file name of this header */ #ifdef HAVE_RUBY_IO_H #include "ruby/io.h" #else #include "rubyio.h" #endif #ifdef __cplusplus } #endif %} %typemap(in) FILE *READ { OpenFile *of; GetOpenFile($input, of); rb_io_check_readable(of); $1 = GetReadFile(of); rb_read_check($1); } %typemap(in) FILE *READ_NOCHECK { OpenFile *of; GetOpenFile($input, of); rb_io_check_readable(of); $1 = GetReadFile(of); } %typemap(in) FILE *WRITE { OpenFile *of; GetOpenFile($input, of); rb_io_check_writable(of); $1 = GetWriteFile(of); } swig-4.0.2/Lib/ruby/std_unordered_map.i0000644000175000017500000000566013667507523017730 0ustar williamwilliam// // Maps // %include %fragment("StdUnorderedMapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const RubySeq& rubyseq, std::unordered_map *map) { typedef typename std::unordered_map::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { map->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::unordered_map map_type; static int asptr(VALUE obj, map_type **val) { int res = SWIG_ERROR; if (TYPE(obj) == T_HASH) { static ID id_to_a = rb_intern("to_a"); VALUE items = rb_funcall(obj, id_to_a, 0); res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { map_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::unordered_map map_type; typedef typename map_type::const_iterator const_iterator; typedef typename map_type::size_type size_type; static VALUE from(const map_type& map) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN); } else { size_type size = map.size(); int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE obj = rb_hash_new(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { VALUE key = swig::from(i->first); VALUE val = swig::from(i->second); rb_hash_aset(obj, key, val); } return obj; } } }; } } #define %swig_unordered_map_common(Map...) %swig_map_common(Map) #define %swig_unordered_map_methods(Map...) %swig_map_methods(Map) %rename("delete") std::unordered_map::__delete__; %rename("reject!") std::unordered_map::reject_bang; %rename("map!") std::unordered_map::map_bang; %rename("empty?") std::unordered_map::empty; %rename("include?") std::unordered_map::__contains__ const; %rename("has_key?") std::unordered_map::has_key const; %mixin std::unordered_map "Enumerable"; %alias std::unordered_map::push "<<"; %include swig-4.0.2/Lib/ruby/extconf.rb0000644000175000017500000000035213667507523016044 0ustar williamwilliamrequire 'mkmf' dir_config('yourlib') if have_header('yourlib.h') and have_library('yourlib', 'yourlib_init') # If you use swig -c option, you may have to link libswigrb. # have_library('swigrb') create_makefile('yourlib') end swig-4.0.2/Lib/ruby/ruby.swg0000644000175000017500000000513613667507523015561 0ustar williamwilliam/* ------------------------------------------------------------ * ruby.swg * * Ruby configuration module. * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * The Ruby auto rename rules * ------------------------------------------------------------ */ #if defined(SWIG_RUBY_AUTORENAME) /* Class names are CamelCase */ %rename("%(camelcase)s", %$isclass) ""; /* Constants created by %constant or #define are UPPER_CASE */ %rename("%(uppercase)s", %$isconstant) ""; /* SWIG only considers static class members with inline initializers to be constants. For examples of what is and isn't considered a constant by SWIG see naming.i in the Ruby test suite. */ %rename("%(uppercase)s", %$ismember, %$isvariable,%$isimmutable,%$isstatic,%$hasvalue,%$hasconsttype) ""; /* Enums are mapped to constants but all we do is make sure the first letter is uppercase */ %rename("%(firstuppercase)s", %$isenumitem) ""; /* Method names should be lower_case_with_underscores */ %rename("%(undercase)s", %$isfunction, %$not %$ismemberget, %$not %$ismemberset) ""; #endif /* ------------------------------------------------------------ * Inner macros * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The runtime part * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Special user directives * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Typemap specializations * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Warnings for Ruby keywords * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Documentation for common Ruby methods * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Ruby initialization function * ------------------------------------------------------------ */ %include swig-4.0.2/Lib/ruby/std_sstream.i0000644000175000017500000000003613667507523016552 0ustar williamwilliam %include swig-4.0.2/Lib/ruby/std_unordered_multimap.i0000644000175000017500000000674713667507523021012 0ustar williamwilliam/* Multimaps */ %include %fragment("StdUnorderedMultimapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const RubySeq& rubyseq, std::unordered_multimap *multimap) { typedef typename std::unordered_multimap::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { multimap->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::unordered_multimap multimap_type; static int asptr(VALUE obj, std::unordered_multimap **val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_HASH ) { static ID id_to_a = rb_intern("to_a"); VALUE items = rb_funcall(obj, id_to_a, 0); return traits_asptr_stdseq, std::pair >::asptr(items, val); } else { multimap_type *p; res = SWIG_ConvertPtr(obj,(void**)&p,swig::type_info(),0); if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::unordered_multimap multimap_type; typedef typename multimap_type::const_iterator const_iterator; typedef typename multimap_type::size_type size_type; static VALUE from(const multimap_type& multimap) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new multimap_type(multimap), desc, SWIG_POINTER_OWN); } else { size_type size = multimap.size(); int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "multimap_ size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE obj = rb_hash_new(); for (const_iterator i= multimap.begin(); i!= multimap.end(); ++i) { VALUE key = swig::from(i->first); VALUE val = swig::from(i->second); VALUE oldval = rb_hash_aref(obj, key); if (oldval == Qnil) { rb_hash_aset(obj, key, val); } else { // Multiple values for this key, create array if needed // and add a new element to it. VALUE ary; if (TYPE(oldval) == T_ARRAY) { ary = oldval; } else { ary = rb_ary_new2(2); rb_ary_push(ary, oldval); rb_hash_aset(obj, key, ary); } rb_ary_push(ary, val); } } return obj; } } }; } } #define %swig_unordered_multimap_methods(MultiMap...) %swig_multimap_methods(MultiMap) %mixin std::unordered_multimap "Enumerable"; %rename("delete") std::unordered_multimap::__delete__; %rename("reject!") std::unordered_multimap::reject_bang; %rename("map!") std::unordered_multimap::map_bang; %rename("empty?") std::unordered_multimap::empty; %rename("include?" ) std::unordered_multimap::__contains__ const; %rename("has_key?" ) std::unordered_multimap::has_key const; %alias std::unordered_multimap::push "<<"; %include swig-4.0.2/Lib/ruby/attribute.i0000644000175000017500000000004213667507523016222 0ustar williamwilliam%include swig-4.0.2/Lib/ruby/std_unordered_set.i0000644000175000017500000000342213667507523017740 0ustar williamwilliam/* Sets */ %include %fragment("StdUnorderedSetTraits","header",fragment="",fragment="StdSetTraits") %{ namespace swig { template inline void assign(const RubySeq& rubyseq, std::unordered_set* seq) { // seq->insert(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(VALUE obj, std::unordered_set **s) { return traits_asptr_stdseq >::asptr(obj, s); } }; template struct traits_from > { static VALUE from(const std::unordered_set& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_unordered_set_methods(set...) %swig_set_methods(set) %mixin std::unordered_set "Enumerable"; %rename("delete") std::unordered_set::__delete__; %rename("reject!") std::unordered_set::reject_bang; %rename("map!") std::unordered_set::map_bang; %rename("empty?") std::unordered_set::empty; %rename("include?" ) std::unordered_set::__contains__ const; %rename("has_key?" ) std::unordered_set::has_key const; %alias std::unordered_set::push "<<"; %include swig-4.0.2/Lib/ruby/rubyrun.swg0000644000175000017500000003345413667507523016312 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubyrun.swg * * This file contains the runtime support for Ruby modules * and includes code for managing global variables and pointer * type checking. * ----------------------------------------------------------------------------- */ /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 /* for raw pointers */ #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Ruby_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Ruby_ConvertPtrAndOwn(obj, pptr, type, flags, own) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Ruby_NewPointerObj(ptr, type, flags) #define SWIG_AcquirePtr(ptr, own) SWIG_Ruby_AcquirePtr(ptr, own) #define swig_owntype swig_ruby_owntype /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty, flags) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Ruby_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Ruby_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Ruby_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Ruby_SetModule(pointer) /* Error manipulation */ #define SWIG_ErrorType(code) SWIG_Ruby_ErrorType(code) #define SWIG_Error(code, msg) rb_raise(SWIG_Ruby_ErrorType(code), "%s", msg) #define SWIG_fail goto fail /* Ruby-specific SWIG API */ #define SWIG_InitRuntime() SWIG_Ruby_InitRuntime() #define SWIG_define_class(ty) SWIG_Ruby_define_class(ty) #define SWIG_NewClassInstance(value, ty) SWIG_Ruby_NewClassInstance(value, ty) #define SWIG_MangleStr(value) SWIG_Ruby_MangleStr(value) #define SWIG_CheckConvert(value, ty) SWIG_Ruby_CheckConvert(value, ty) #include "assert.h" /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif typedef struct { VALUE klass; VALUE mImpl; void (*mark)(void *); void (*destroy)(void *); int trackObjects; } swig_class; /* Global pointer used to keep some internal SWIG stuff */ static VALUE _cSWIG_Pointer = Qnil; static VALUE swig_runtime_data_type_pointer = Qnil; /* Global IDs used to keep some internal SWIG stuff */ static ID swig_arity_id = 0; static ID swig_call_id = 0; /* If your swig extension is to be run within an embedded ruby and has director callbacks, you should set -DRUBY_EMBEDDED during compilation. This will reset ruby's stack frame on each entry point from the main program the first time a virtual director function is invoked (in a non-recursive way). If this is not done, you run the risk of Ruby trashing the stack. */ #ifdef RUBY_EMBEDDED # define SWIG_INIT_STACK \ if ( !swig_virtual_calls ) { RUBY_INIT_STACK } \ ++swig_virtual_calls; # define SWIG_RELEASE_STACK --swig_virtual_calls; # define Ruby_DirectorTypeMismatchException(x) \ rb_raise( rb_eTypeError, "%s", x ); return c_result; static unsigned int swig_virtual_calls = 0; #else /* normal non-embedded extension */ # define SWIG_INIT_STACK # define SWIG_RELEASE_STACK # define Ruby_DirectorTypeMismatchException(x) \ throw Swig::DirectorTypeMismatchException( x ); #endif /* RUBY_EMBEDDED */ SWIGRUNTIME VALUE getExceptionClass(void) { static int init = 0; static VALUE rubyExceptionClass ; if (!init) { init = 1; rubyExceptionClass = rb_const_get(_mSWIG, rb_intern("Exception")); } return rubyExceptionClass; } /* This code checks to see if the Ruby object being raised as part of an exception inherits from the Ruby class Exception. If so, the object is simply returned. If not, then a new Ruby exception object is created and that will be returned to Ruby.*/ SWIGRUNTIME VALUE SWIG_Ruby_ExceptionType(swig_type_info *desc, VALUE obj) { VALUE exceptionClass = getExceptionClass(); if (rb_obj_is_kind_of(obj, exceptionClass)) { return obj; } else { return rb_exc_new3(rb_eRuntimeError, rb_obj_as_string(obj)); } } /* Initialize Ruby runtime support */ SWIGRUNTIME void SWIG_Ruby_InitRuntime(void) { if (_mSWIG == Qnil) { _mSWIG = rb_define_module("SWIG"); swig_call_id = rb_intern("call"); swig_arity_id = rb_intern("arity"); } } /* Define Ruby class for C type */ SWIGRUNTIME void SWIG_Ruby_define_class(swig_type_info *type) { char *klass_name = (char *) malloc(4 + strlen(type->name) + 1); sprintf(klass_name, "TYPE%s", type->name); if (NIL_P(_cSWIG_Pointer)) { _cSWIG_Pointer = rb_define_class_under(_mSWIG, "Pointer", rb_cObject); rb_undef_method(CLASS_OF(_cSWIG_Pointer), "new"); } rb_define_class_under(_mSWIG, klass_name, _cSWIG_Pointer); free((void *) klass_name); } /* Create a new pointer object */ SWIGRUNTIME VALUE SWIG_Ruby_NewPointerObj(void *ptr, swig_type_info *type, int flags) { int own = flags & SWIG_POINTER_OWN; int track; char *klass_name; swig_class *sklass; VALUE klass; VALUE obj; if (!ptr) return Qnil; assert(type); if (type->clientdata) { sklass = (swig_class *) type->clientdata; /* Are we tracking this class and have we already returned this Ruby object? */ track = sklass->trackObjects; if (track) { obj = SWIG_RubyInstanceFor(ptr); /* Check the object's type and make sure it has the correct type. It might not in cases where methods do things like downcast methods. */ if (obj != Qnil) { VALUE value = rb_iv_get(obj, "@__swigtype__"); const char* type_name = RSTRING_PTR(value); if (strcmp(type->name, type_name) == 0) { return obj; } } } /* Create a new Ruby object */ obj = Data_Wrap_Struct(sklass->klass, VOIDFUNC(sklass->mark), ( own ? VOIDFUNC(sklass->destroy) : (track ? VOIDFUNC(SWIG_RubyRemoveTracking) : 0 ) ), ptr); /* If tracking is on for this class then track this object. */ if (track) { SWIG_RubyAddTracking(ptr, obj); } } else { klass_name = (char *) malloc(4 + strlen(type->name) + 1); sprintf(klass_name, "TYPE%s", type->name); klass = rb_const_get(_mSWIG, rb_intern(klass_name)); free((void *) klass_name); obj = Data_Wrap_Struct(klass, 0, 0, ptr); } rb_iv_set(obj, "@__swigtype__", rb_str_new2(type->name)); return obj; } /* Create a new class instance (always owned) */ SWIGRUNTIME VALUE SWIG_Ruby_NewClassInstance(VALUE klass, swig_type_info *type) { VALUE obj; swig_class *sklass = (swig_class *) type->clientdata; obj = Data_Wrap_Struct(klass, VOIDFUNC(sklass->mark), VOIDFUNC(sklass->destroy), 0); rb_iv_set(obj, "@__swigtype__", rb_str_new2(type->name)); return obj; } /* Get type mangle from class name */ SWIGRUNTIMEINLINE char * SWIG_Ruby_MangleStr(VALUE obj) { VALUE stype = rb_iv_get(obj, "@__swigtype__"); if (NIL_P(stype)) return NULL; return StringValuePtr(stype); } /* Acquire a pointer value */ typedef struct { void (*datafree)(void *); int own; } swig_ruby_owntype; SWIGRUNTIME swig_ruby_owntype SWIG_Ruby_AcquirePtr(VALUE obj, swig_ruby_owntype own) { swig_ruby_owntype oldown = {0, 0}; if (TYPE(obj) == T_DATA && !RTYPEDDATA_P(obj)) { oldown.datafree = RDATA(obj)->dfree; RDATA(obj)->dfree = own.datafree; } return oldown; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Ruby_ConvertPtrAndOwn(VALUE obj, void **ptr, swig_type_info *ty, int flags, swig_ruby_owntype *own) { char *c; swig_cast_info *tc; void *vptr = 0; /* Grab the pointer */ if (NIL_P(obj)) { if (ptr) *ptr = 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } else { if (TYPE(obj) != T_DATA || (TYPE(obj) == T_DATA && RTYPEDDATA_P(obj))) { return SWIG_ERROR; } Data_Get_Struct(obj, void, vptr); } if (own) { own->datafree = RDATA(obj)->dfree; own->own = 0; } /* Check to see if the input object is giving up ownership of the underlying C struct or C++ object. If so then we need to reset the destructor since the Ruby object no longer owns the underlying C++ object.*/ if (flags & SWIG_POINTER_DISOWN) { /* Is tracking on for this class? */ int track = 0; if (ty && ty->clientdata) { swig_class *sklass = (swig_class *) ty->clientdata; track = sklass->trackObjects; } if (track) { /* We are tracking objects for this class. Thus we change the destructor * to SWIG_RubyRemoveTracking. This allows us to * remove the mapping from the C++ to Ruby object * when the Ruby object is garbage collected. If we don't * do this, then it is possible we will return a reference * to a Ruby object that no longer exists thereby crashing Ruby. */ RDATA(obj)->dfree = SWIG_RubyRemoveTracking; } else { RDATA(obj)->dfree = 0; } } /* Do type-checking if type info was provided */ if (ty) { if (ty->clientdata) { if (rb_obj_is_kind_of(obj, ((swig_class *) (ty->clientdata))->klass)) { if (vptr == 0) { /* The object has already been deleted */ return SWIG_ObjectPreviouslyDeletedError; } } } if ((c = SWIG_MangleStr(obj)) == NULL) { return SWIG_ERROR; } tc = SWIG_TypeCheck(c, ty); if (!tc) { return SWIG_ERROR; } else { if (ptr) { if (tc->type == ty) { *ptr = vptr; } else { int newmemory = 0; *ptr = SWIG_TypeCast(tc, vptr, &newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) own->own = own->own | SWIG_CAST_NEW_MEMORY; } } } } } else { if (ptr) *ptr = vptr; } return SWIG_OK; } /* Check convert */ SWIGRUNTIMEINLINE int SWIG_Ruby_CheckConvert(VALUE obj, swig_type_info *ty) { char *c = SWIG_MangleStr(obj); if (!c) return 0; return SWIG_TypeCheck(c,ty) != 0; } SWIGRUNTIME VALUE SWIG_Ruby_NewPackedObj(void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(type->name)) > 1000) return 0; *(r++) = '_'; r = SWIG_PackData(r, ptr, sz); strcpy(r, type->name); return rb_str_new2(result); } /* Convert a packed pointer value */ SWIGRUNTIME int SWIG_Ruby_ConvertPacked(VALUE obj, void *ptr, int sz, swig_type_info *ty) { swig_cast_info *tc; const char *c; if (TYPE(obj) != T_STRING) goto type_error; c = StringValuePtr(obj); /* Pointer values must start with leading underscore */ if (*c != '_') goto type_error; c++; c = SWIG_UnpackData(c, ptr, sz); if (ty) { tc = SWIG_TypeCheck(c, ty); if (!tc) goto type_error; } return SWIG_OK; type_error: return SWIG_ERROR; } SWIGRUNTIME swig_module_info * SWIG_Ruby_GetModule(void *SWIGUNUSEDPARM(clientdata)) { VALUE pointer; swig_module_info *ret = 0; VALUE verbose = rb_gv_get("VERBOSE"); /* temporarily disable warnings, since the pointer check causes warnings with 'ruby -w' */ rb_gv_set("VERBOSE", Qfalse); /* first check if pointer already created */ pointer = rb_gv_get("$swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); if (pointer != Qnil) { Data_Get_Struct(pointer, swig_module_info, ret); } /* reinstate warnings */ rb_gv_set("VERBOSE", verbose); return ret; } SWIGRUNTIME void SWIG_Ruby_SetModule(swig_module_info *pointer) { /* register a new class */ VALUE cl = rb_define_class("swig_runtime_data", rb_cObject); /* create and store the structure pointer to a global variable */ swig_runtime_data_type_pointer = Data_Wrap_Struct(cl, 0, 0, pointer); rb_define_readonly_variable("$swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, &swig_runtime_data_type_pointer); } /* This function can be used to check whether a proc or method or similarly callable function has been passed. Usually used in a %typecheck, like: %typecheck(c_callback_t, precedence=SWIG_TYPECHECK_POINTER) { $result = SWIG_Ruby_isCallable( $input ); } */ SWIGINTERN int SWIG_Ruby_isCallable( VALUE proc ) { if ( rb_respond_to( proc, swig_call_id ) ) return 1; return 0; } /* This function can be used to check the arity (number of arguments) a proc or method can take. Usually used in a %typecheck. Valid arities will be that equal to minimal or those < 0 which indicate a variable number of parameters at the end. */ SWIGINTERN int SWIG_Ruby_arity( VALUE proc, int minimal ) { if ( rb_respond_to( proc, swig_arity_id ) ) { VALUE num = rb_funcall( proc, swig_arity_id, 0 ); int arity = NUM2INT(num); if ( arity < 0 && (arity+1) < -minimal ) return 1; if ( arity == minimal ) return 1; return 1; } return 0; } #ifdef __cplusplus } #endif swig-4.0.2/Lib/ruby/rubystdcommon_forward.swg0000644000175000017500000000103613667507523021224 0ustar williamwilliam%fragment("StdTraitsForwardDeclaration","header") { namespace swig { template struct traits_asptr; template struct traits_asval; struct pointer_category; template struct traits_as; template struct traits_from; template struct traits_from_ptr; template struct noconst_traits; template swig_type_info* type_info(); template const char* type_name(); template VALUE from(const Type& val); } } swig-4.0.2/Lib/ruby/cmalloc.i0000644000175000017500000000004013667507523015627 0ustar williamwilliam%include swig-4.0.2/Lib/ruby/progargcargv.i0000644000175000017500000000140213667507523016704 0ustar williamwilliam/* int PROG_ARGC char **PROG_ARGV Some C function receive argc and argv from C main function. This typemap provides ignore typemap which pass Ruby ARGV contents as argc and argv to C function. */ // argc and argv %typemap(in,numinputs=0) int PROG_ARGC { $1 = RARRAY_LEN(rb_argv) + 1; } %typemap(in,numinputs=0) char **PROG_ARGV { int i, n; VALUE ary = rb_eval_string("[$0] + ARGV"); n = RARRAY_LEN(ary); $1 = (char **)malloc(n + 1); for (i = 0; i < n; i++) { VALUE v = rb_obj_as_string(RARRAY_PTR(ary)[i]); $1[i] = (char *)malloc(RSTRING_LEN(v) + 1); strcpy($1[i], RSTRING_PTR(v)); } } %typemap(freearg) char **PROG_ARGV { int i, n = RARRAY_LEN(rb_argv) + 1; for (i = 0; i < n; i++) free($1[i]); free($1); } swig-4.0.2/Lib/ruby/std_basic_string.i0000644000175000017500000000514413667507523017550 0ustar williamwilliam#if !defined(SWIG_STD_STRING) #define SWIG_STD_BASIC_STRING %include #define %swig_basic_string(Type...) %swig_sequence_methods_val(Type) %traits_swigtype(std::basic_string); %fragment(SWIG_Traits_frag(std::basic_string)); %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(VALUE obj, std::string **val) { static swig_type_info* string_info = SWIG_TypeQuery("std::basic_string *"); std::string *vptr; if (SWIG_IsOK(SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0))) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { char* buf = 0 ; size_t size = 0; int alloc = 0; if (SWIG_IsOK(SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc))) { if (buf) { if (val) *val = new std::string(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } } return SWIG_ERROR; } } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromCharPtrAndSize") { SWIGINTERNINLINE VALUE SWIG_From(std::basic_string)(const std::string& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } } %ignore std::basic_string::operator!=; %ignore std::basic_string::operator+=; %include %typemaps_asptrfromn(%checkcode(STRING), std::basic_string); #endif #if !defined(SWIG_STD_WSTRING) %traits_swigtype(std::basic_string); %fragment(SWIG_Traits_frag(std::basic_string)); %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsWCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(VALUE obj, std::wstring **val) { static swig_type_info* string_info = SWIG_TypeQuery("std::basic_string *"); std::wstring *vptr; if (SWIG_IsOK(SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0))) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { wchar_t *buf = 0 ; size_t size = 0; int alloc = 0; if (SWIG_IsOK(SWIG_AsWCharPtrAndSize(obj, &buf, &size, &alloc))) { if (buf) { if (val) *val = new std::wstring(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } } return SWIG_ERROR; } } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromWCharPtrAndSize") { SWIGINTERNINLINE VALUE SWIG_From(std::basic_string)(const std::wstring& s) { return SWIG_FromWCharPtrAndSize(s.data(), s.size()); } } %typemaps_asptrfromn(%checkcode(UNISTRING), std::basic_string); #endif swig-4.0.2/Lib/ruby/extra-install.list0000644000175000017500000000006513667507523017536 0ustar williamwilliam# see top-level Makefile.in Makefile.swig extconf.rb swig-4.0.2/Lib/ruby/std_stack.i0000644000175000017500000000152413667507523016204 0ustar williamwilliam/* Stacks */ %fragment("StdStackTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::stack **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::stack& vec) { return traits_from_stdseq >::from(vec); } }; } %} %rename("delete") std::stack::__delete__; %rename("reject!") std::stack::reject_bang; %rename("map!") std::stack::map_bang; %rename("empty?") std::stack::empty; %rename("include?" ) std::stack::__contains__ const; %rename("has_key?" ) std::stack::has_key const; %alias std::stack::push "<<"; %include swig-4.0.2/Lib/ruby/argcargv.i0000644000175000017500000000231313667507523016016 0ustar williamwilliam/* ------------------------------------------------------------ * --- Argc & Argv --- * ------------------------------------------------------------ */ /* ------------------------------------------------------------ Use it as follow: %apply (int ARGC, char **ARGV) { (size_t argc, const char **argv) } %inline %{ int mainApp(size_t argc, const char **argv) { return argc; } then in the ruby side: args = ["asdf", "asdf2"] mainApp(args); * ------------------------------------------------------------ */ %typemap(in) (int ARGC, char **ARGV) { if (rb_obj_is_kind_of($input,rb_cArray)) { int i; int size = RARRAY_LEN($input); $1 = ($1_ltype) size; $2 = (char **) malloc((size+1)*sizeof(char *)); VALUE *ptr = RARRAY_PTR($input); for (i=0; i < size; i++, ptr++) { $2[i]= StringValuePtr(*ptr); } $2[i]=NULL; } else { $1 = 0; $2 = 0; %argument_fail(SWIG_TypeError, "int ARGC, char **ARGV", $symname, $argnum); } } %typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { $1 = rb_obj_is_kind_of($input,rb_cArray); } %typemap(freearg) (int ARGC, char **ARGV) { free((char *) $2); } swig-4.0.2/Lib/ruby/std_streambuf.i0000644000175000017500000000003713667507523017065 0ustar williamwilliam%include swig-4.0.2/Lib/ruby/std_common.i0000644000175000017500000000443613667507523016374 0ustar williamwilliam%include %include %include /* Generate the traits for a 'primitive' type, such as 'double', for which the SWIG_AsVal and SWIG_From methods are already defined. */ %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(VALUE obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static VALUE from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(VALUE obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static VALUE from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-4.0.2/Lib/ruby/std_except.i0000644000175000017500000000004313667507523016362 0ustar williamwilliam%include swig-4.0.2/Lib/ruby/rubywstrings.swg0000644000175000017500000000404113667507523017354 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubywstrings.swg * * utility methods for wchar_t strings * ------------------------------------------------------------ */ %fragment("SWIG_AsWCharPtrAndSize","header",fragment="",fragment="SWIG_pwchar_descriptor",fragment="SWIG_AsCharPtrAndSize",fragment="SWIG_ruby_wstring_encoding_init") { SWIGINTERN int SWIG_AsWCharPtrAndSize(VALUE obj, wchar_t **cptr, size_t *psize, int *alloc) { rb_encoding* wstr_enc = swig_ruby_wstring_encoding; if (TYPE(obj) == T_STRING) { VALUE rstr = rb_str_conv_enc(obj, rb_enc_get(obj), wstr_enc); wchar_t* cstr = (wchar_t*) StringValuePtr(rstr); size_t size = RSTRING_LEN(rstr) / sizeof(wchar_t) + 1; if ( RSTRING_LEN(rstr) % sizeof(wchar_t) != 0 ) { rb_raise(rb_eRuntimeError, "The length of the byte sequence of converted string is not a multiplier of sizeof(wchar_t). Invalid byte sequence is given. Or invalid SWIG_RUBY_WSTRING_ENCODING is given when compiling this binding."); } if (cptr && alloc) { *alloc = SWIG_NEWOBJ; *cptr = %new_array(size, wchar_t); memmove(*cptr, cstr, RSTRING_LEN(rstr)); } if (psize) *psize = size; return SWIG_OK; } else { return SWIG_TypeError; } } } %fragment("SWIG_FromWCharPtrAndSize","header",fragment="",fragment="SWIG_pwchar_descriptor",fragment="SWIG_FromCharPtrAndSize",fragment="SWIG_ruby_wstring_encoding_init") { SWIGINTERNINLINE VALUE SWIG_FromWCharPtrAndSize(const wchar_t * carray, size_t size) { rb_encoding* wstr_enc = swig_ruby_wstring_encoding; rb_encoding* rb_enc = swig_ruby_internal_encoding; if (carray && size <= LONG_MAX/sizeof(wchar_t)) { VALUE rstr = rb_str_new( (const char*)carray, %numeric_cast(size*sizeof(wchar_t),long) ); rb_encoding* new_enc = rb_default_internal_encoding(); rb_enc_associate(rstr, wstr_enc); if ( !new_enc ) { new_enc = rb_enc; } return rb_str_conv_enc(rstr, wstr_enc, new_enc); } else { return Qnil; } } } swig-4.0.2/Lib/ruby/rubycomplex.swg0000644000175000017500000000742413667507523017153 0ustar williamwilliam/* Defines the As/From conversors for double/float complex, you need to provide complex Type, the Name you want to use in the converters, the complex Constructor method, and the Real and Imag complex accessor methods. See the std_complex.i and ccomplex.i for concrete examples. */ %fragment("rb_complex_new","header") { %#if !defined(T_COMPLEX) /* Ruby versions prior to 1.9 did not have native complex numbers. They were an extension in the STD library. */ SWIGINTERN VALUE rb_complex_new(VALUE x, VALUE y) { static ID new_id = rb_intern("new"); static VALUE cComplex = rb_const_get(rb_cObject, rb_intern("Complex")); return rb_funcall(cComplex, new_id, 2, x, y); } %#endif } %fragment("SWIG_Complex_Numbers","header") { %#if !defined(T_COMPLEX) SWIGINTERN int SWIG_Is_Complex( VALUE obj ) { static ID real_id = rb_intern("real"); static ID imag_id = rb_intern("imag"); return ( (rb_respond_to( obj, real_id ) ) && (rb_respond_to( obj, imag_id ) ) ); } %#else SWIGINTERN int SWIG_Is_Complex( VALUE obj ) { return TYPE(obj) == T_COMPLEX; } %#endif SWIGINTERN VALUE SWIG_Complex_Real(VALUE obj) { static ID real_id = rb_intern("real"); return rb_funcall(obj, real_id, 0); } SWIGINTERN VALUE SWIG_Complex_Imaginary(VALUE obj) { static ID imag_id = rb_intern("imag"); return rb_funcall(obj, imag_id, 0); } } %init { %#if !defined(T_COMPLEX) rb_require("complex"); %#endif } /* the common from converter */ %define %swig_fromcplx_conv(Type, Real, Imag) %fragment(SWIG_From_frag(Type),"header",fragment="rb_complex_new") { SWIGINTERNINLINE VALUE SWIG_From(Type)(%ifcplusplus(const Type&, Type) c) { VALUE re = rb_float_new(Real(c)); VALUE im = rb_float_new(Imag(c)); return rb_complex_new(re, im); } } %enddef /* the double case */ %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double), fragment="SWIG_Complex_Numbers") { SWIGINTERN int SWIG_AsVal(Type) (VALUE o, Type* val) { if ( SWIG_Is_Complex( o ) ) { if (val) { VALUE real = SWIG_Complex_Real(o); VALUE imag = SWIG_Complex_Imaginary(o); double re = 0; SWIG_AsVal_double( real, &re ); double im = 0; SWIG_AsVal_double( imag, &im ); *val = Constructor(re, im); } return SWIG_OK; } else { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef /* the float case */ %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float), fragment=SWIG_AsVal_frag(double), fragment="SWIG_Complex_Numbers") { SWIGINTERN int SWIG_AsVal(Type)(VALUE o, Type *val) { if ( SWIG_Is_Complex( o ) ) { VALUE real = SWIG_Complex_Real(o); VALUE imag = SWIG_Complex_Imaginary(o); double re = 0; SWIG_AsVal_double( real, &re ); double im = 0; SWIG_AsVal_double( imag, &im ); if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else { return SWIG_OverflowError; } } else { float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(re, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-4.0.2/Lib/ruby/typemaps.i0000644000175000017500000002606213667507523016073 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * * These mappings provide support for input/output arguments and * common uses for C/C++ pointers. INOUT mappings allow for C/C++ * pointer variables in addition to input/output arguments. * ----------------------------------------------------------------------------- */ #if !defined(SWIG_USE_OLD_TYPEMAPS) %include #else /* The SWIG typemap library provides a language independent mechanism for supporting output arguments, input values, and other C function calling mechanisms. The primary use of the library is to provide a better interface to certain C function--especially those involving pointers. */ // ------------------------------------------------------------------------ // Pointer handling // // These mappings provide support for input/output arguments and common // uses for C/C++ pointers. // ------------------------------------------------------------------------ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include typemaps.i double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include typemaps.i %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ %define INPUT_TYPEMAP(type, converter) %typemap(in) type *INPUT($*1_ltype temp), type &INPUT($*1_ltype temp) { temp = ($*1_ltype) converter($input); $1 = &temp; } %typemap(typecheck) type *INPUT = type; %typemap(typecheck) type &INPUT = type; %enddef INPUT_TYPEMAP(float, NUM2DBL); INPUT_TYPEMAP(double, NUM2DBL); INPUT_TYPEMAP(int, NUM2INT); INPUT_TYPEMAP(short, NUM2SHRT); INPUT_TYPEMAP(long, NUM2LONG); INPUT_TYPEMAP(long long, NUM2LL); INPUT_TYPEMAP(unsigned int, NUM2UINT); INPUT_TYPEMAP(unsigned short, NUM2USHRT); INPUT_TYPEMAP(unsigned long, NUM2ULONG); INPUT_TYPEMAP(unsigned long long, NUM2ULL); INPUT_TYPEMAP(unsigned char, NUM2UINT); INPUT_TYPEMAP(signed char, NUM2INT); INPUT_TYPEMAP(bool, RTEST); #undef INPUT_TYPEMAP // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a array element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Ruby Array. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include typemaps.i double modf(double x, double *OUTPUT); or you can use the %apply directive : %include typemaps.i %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Ruby output of the function would be a Array containing both output values. */ %define OUTPUT_TYPEMAP(type, converter, convtype) %typemap(in,numinputs=0) type *OUTPUT($*1_ltype temp), type &OUTPUT($*1_ltype temp) "$1 = &temp;"; %typemap(argout, fragment="output_helper") type *OUTPUT, type &OUTPUT { VALUE o = converter(convtype (*$1)); $result = output_helper($result, o); } %enddef OUTPUT_TYPEMAP(int, INT2NUM, (int)); OUTPUT_TYPEMAP(short, INT2NUM, (int)); OUTPUT_TYPEMAP(long, INT2NUM, (long)); OUTPUT_TYPEMAP(long long, LL2NUM, (long long)); OUTPUT_TYPEMAP(unsigned int, UINT2NUM, (unsigned int)); OUTPUT_TYPEMAP(unsigned short, UINT2NUM, (unsigned int)); OUTPUT_TYPEMAP(unsigned long, UINT2NUM, (unsigned long)); OUTPUT_TYPEMAP(unsigned long long, ULL2NUM, (unsigned long long)); OUTPUT_TYPEMAP(unsigned char, UINT2NUM, (unsigned int)); OUTPUT_TYPEMAP(signed char, INT2NUM, (int)); OUTPUT_TYPEMAP(float, rb_float_new, (double)); OUTPUT_TYPEMAP(double, rb_float_new, (double)); #undef OUTPUT_TYPEMAP %typemap(in,numinputs=0) bool *OUTPUT(bool temp), bool &OUTPUT(bool temp) "$1 = &temp;"; %typemap(argout, fragment="output_helper") bool *OUTPUT, bool &OUTPUT { VALUE o = (*$1) ? Qtrue : Qfalse; $result = output_helper($result, o); } // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Ruby array. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include typemaps.i void neg(double *INOUT); or you can use the %apply directive : %include typemaps.i %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Ruby). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Ruby variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) signed char *INOUT = signed char *INPUT; %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) int &INOUT = int &INPUT; %typemap(in) short &INOUT = short &INPUT; %typemap(in) long &INOUT = long &INPUT; %typemap(in) long long &INOUT = long long &INPUT; %typemap(in) unsigned &INOUT = unsigned &INPUT; %typemap(in) unsigned short &INOUT = unsigned short &INPUT; %typemap(in) unsigned long &INOUT = unsigned long &INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; %typemap(in) unsigned char &INOUT = unsigned char &INPUT; %typemap(in) signed char &INOUT = signed char &INPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(in) float &INOUT = float &INPUT; %typemap(in) double &INOUT = double &INPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT = long *OUTPUT; %typemap(argout) long long *INOUT = long long *OUTPUT; %typemap(argout) unsigned *INOUT = unsigned *OUTPUT; %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) signed char *INOUT = signed char *OUTPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT = double *OUTPUT; %typemap(argout) int &INOUT = int &OUTPUT; %typemap(argout) short &INOUT = short &OUTPUT; %typemap(argout) long &INOUT = long &OUTPUT; %typemap(argout) long long &INOUT = long long &OUTPUT; %typemap(argout) unsigned &INOUT = unsigned &OUTPUT; %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; %typemap(argout) signed char &INOUT = signed char &OUTPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; %typemap(argout) float &INOUT = float &OUTPUT; %typemap(argout) double &INOUT = double &OUTPUT; /* Overloading information */ %typemap(typecheck) double *INOUT = double; %typemap(typecheck) signed char *INOUT = signed char; %typemap(typecheck) unsigned char *INOUT = unsigned char; %typemap(typecheck) unsigned long *INOUT = unsigned long; %typemap(typecheck) unsigned long long *INOUT = unsigned long long; %typemap(typecheck) unsigned short *INOUT = unsigned short; %typemap(typecheck) unsigned int *INOUT = unsigned int; %typemap(typecheck) long *INOUT = long; %typemap(typecheck) long long *INOUT = long long; %typemap(typecheck) short *INOUT = short; %typemap(typecheck) int *INOUT = int; %typemap(typecheck) float *INOUT = float; %typemap(typecheck) double &INOUT = double; %typemap(typecheck) signed char &INOUT = signed char; %typemap(typecheck) unsigned char &INOUT = unsigned char; %typemap(typecheck) unsigned long &INOUT = unsigned long; %typemap(typecheck) unsigned long long &INOUT = unsigned long long; %typemap(typecheck) unsigned short &INOUT = unsigned short; %typemap(typecheck) unsigned int &INOUT = unsigned int; %typemap(typecheck) long &INOUT = long; %typemap(typecheck) long long &INOUT = long long; %typemap(typecheck) short &INOUT = short; %typemap(typecheck) int &INOUT = int; %typemap(typecheck) float &INOUT = float; #endif // -------------------------------------------------------------------- // Special types // -------------------------------------------------------------------- %include %include %include swig-4.0.2/Lib/ruby/std_queue.i0000644000175000017500000000152213667507523016221 0ustar williamwilliam/* Queues */ %fragment("StdQueueTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::queue **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::queue& vec) { return traits_from_stdseq >::from(vec); } }; } %} %rename("delete") std::queue::__delete__; %rename("reject!") std::queue::reject_bang; %rename("map!") std::queue::map_bang; %rename("empty?") std::queue::empty; %rename("include?" ) std::queue::__contains__ const; %rename("has_key?" ) std::queue::has_key const; %alias std::queue::push "<<"; %include swig-4.0.2/Lib/ruby/rubystdfunctors.swg0000644000175000017500000000773113667507523020063 0ustar williamwilliam/** * @file rubystdfunctors.swg * @date Sun May 6 00:44:33 2007 * * @brief This file provides unary and binary functors for STL * containers, that will invoke a Ruby proc or method to do * their operation. * * You can use them in a swig file like: * * %include * %include * * %template< IntSet > std::set< int, swig::BinaryPredicate<> >; * * * which will then allow calling them from Ruby either like: * * # order of set is defined by C++ default * a = IntSet.new * * # sort order defined by Ruby proc * b = IntSet.new( proc { |a,b| a > b } ) * */ %include rubyclasses.swg namespace swig { %apply GC_VALUE { UnaryPredicate, BinaryPredicate, UnaryFunction, BinaryFunction }; %typecheck(SWIG_TYPECHECK_POINTER,noblock=1) UnaryPredicate, UnaryPredicate&, UnaryFunction, UnaryFunction& { $1 = SWIG_Ruby_isCallable($input) && SWIG_Ruby_arity($input, 1); } %typecheck(SWIG_TYPECHECK_POINTER,noblock=1) BinaryPredicate, BinaryPredicate&, BinaryFunction, BinaryFunction& { $1 = SWIG_Ruby_isCallable($input) && SWIG_Ruby_arity($input, 2); } %typemap(in,noblock=1) BinaryFunction&, BinaryFunction { $1 = new swig::BinaryFunction< >($input); } %typemap(in,noblock=1) UnaryFunction&, UnaryFunction { $1 = new swig::UnaryFunction< >($input); } %typemap(in,noblock=1) BinaryPredicate&, BinaryPredicate { $1 = new swig::BinaryPredicate<>($input); } %typemap(in,noblock=1) UnaryPredicate&, UnaryPredicate { $1 = new swig::UnaryPredicate< >($input); } %ignore BinaryFunction; template< class _T = GC_VALUE > struct BinaryFunction { }; %ignore UnaryFunction; template< class _T = GC_VALUE > struct UnaryFunction { }; %ignore BinaryPredicate; template< class _T = GC_VALUE > struct BinaryPredicate { }; %ignore UnaryPredicate; template< class _T = GC_VALUE > struct UnaryPredicate { }; } %fragment("StdFunctors","header",fragment="StdTraits",fragment="GC_VALUE_definition") { namespace swig { static ID call_id = rb_intern("call"); template > struct BinaryPredicate : GC_VALUE { BinaryPredicate(VALUE obj = Qnil) : GC_VALUE(obj) { } bool operator()(_T a, _T b) const { if (_obj != Qnil) { SWIG_RUBY_THREAD_BEGIN_BLOCK; VALUE arg1 = swig::from(a); VALUE arg2 = swig::from(b); VALUE res = rb_funcall( _obj, swig::call_id, 2, arg1, arg2); SWIG_RUBY_THREAD_END_BLOCK; return RTEST(res); } else { return _DefaultFunc()(a, b); } } }; template > struct BinaryFunction : GC_VALUE { BinaryFunction(VALUE obj = Qnil) : GC_VALUE(obj) { } _T operator()(_T a, _T b) const { if (_obj != Qnil) { SWIG_RUBY_THREAD_BEGIN_BLOCK; VALUE arg1 = swig::from(a); VALUE arg2 = swig::from(b); VALUE res = rb_funcall( _obj, swig::call_id, 2, arg1, arg2); SWIG_RUBY_THREAD_END_BLOCK; return swig::as<_T >(res); } else { return _DefaultFunc()(a, b); } } }; template< class _T = GC_VALUE > struct UnaryPredicate : GC_VALUE { UnaryPredicate(VALUE obj = Qnil) : GC_VALUE(obj) { } bool operator()(_T a) const { SWIG_RUBY_THREAD_BEGIN_BLOCK; VALUE arg1 = swig::from<_T >(a); VALUE res = rb_funcall( _obj, swig::call_id, 1, arg1); SWIG_RUBY_THREAD_END_BLOCK; return RTEST(res); } }; template< class _T = GC_VALUE > struct UnaryFunction : GC_VALUE { UnaryFunction(VALUE obj = Qnil) : GC_VALUE(obj) { } _T operator()(_T a) const { SWIG_RUBY_THREAD_BEGIN_BLOCK; VALUE arg1 = swig::from(a); VALUE res = rb_funcall( _obj, swig::call_id, 1, VALUE(arg1)); SWIG_RUBY_THREAD_END_BLOCK; return swig::as< _T >(res); } }; } // namespace swig } swig-4.0.2/Lib/ruby/rubyapi.swg0000644000175000017500000000144113667507523016246 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Ruby API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif SWIGINTERN VALUE SWIG_Ruby_AppendOutput(VALUE target, VALUE o) { if (NIL_P(target)) { target = o; } else { if (TYPE(target) != T_ARRAY) { VALUE o2 = target; target = rb_ary_new(); rb_ary_push(target, o2); } rb_ary_push(target, o); } return target; } /* For ruby1.8.4 and earlier. */ #ifndef RUBY_INIT_STACK RUBY_EXTERN void Init_stack(VALUE* addr); # define RUBY_INIT_STACK \ VALUE variable_in_this_stack_frame; \ Init_stack(&variable_in_this_stack_frame); #endif #ifdef __cplusplus } #endif swig-4.0.2/Lib/ruby/rubymacros.swg0000644000175000017500000000071013667507523016757 0ustar williamwilliam // Redefine these macros so argument index for ruby is done properly, // ignoring self and we get some more info about the input. #define %argfail_fmt(_type,_name,_argn) Ruby_Format_TypeError( "", _type, #_name, _argn, $input ) #define %argnullref_fmt(_type,_name,_argn) Ruby_Format_TypeError(%nullref_fmt(), _type, #_name, _argn, $input) %{ #define SWIG_RUBY_THREAD_BEGIN_BLOCK #define SWIG_RUBY_THREAD_END_BLOCK %} %include swig-4.0.2/Lib/ruby/std_array.i0000644000175000017500000000671513667507523016224 0ustar williamwilliam/* std::array */ %fragment("StdArrayTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::array **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::array& vec) { return traits_from_stdseq >::from(vec); } }; template inline void assign(const RubySeq& rubyseq, std::array* seq) { if (rubyseq.size() < seq->size()) throw std::invalid_argument("std::array cannot be expanded in size"); else if (rubyseq.size() > seq->size()) throw std::invalid_argument("std::array cannot be reduced in size"); std::copy(rubyseq.begin(), rubyseq.end(), seq->begin()); } template inline void resize(std::array *seq, typename std::array::size_type n, typename std::array::value_type x) { throw std::invalid_argument("std::array is a fixed size container and does not support resizing"); } // Only limited slicing is supported as std::array is fixed in size template inline std::array* getslice(const std::array* self, Difference i, Difference j) { typedef std::array Sequence; typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, (i == size && j == size)); typename Sequence::size_type jj = swig::slice_index(j, size); if (ii == 0 && jj == size) { Sequence *sequence = new Sequence(); std::copy(self->begin(), self->end(), sequence->begin()); return sequence; } else { throw std::invalid_argument("std::array object only supports getting a slice that is the size of the array"); } } template inline void setslice(std::array* self, Difference i, Difference j, const InputSeq& v) { typedef std::array Sequence; typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (ii == 0 && jj == size) { std::copy(v.begin(), v.end(), self->begin()); } else { throw std::invalid_argument("std::array object only supports setting a slice that is the size of the array"); } } template inline void delslice(std::array* self, Difference i, Difference j) { throw std::invalid_argument("std::array object does not support item deletion"); } } %} %define %swig_array_methods(Type...) %swig_sequence_methods_non_resizable(Type) %enddef %define %swig_array_methods_val(Type...) %swig_sequence_methods_non_resizable_val(Type); %enddef %mixin std::array "Enumerable"; %ignore std::array::push_back; %ignore std::array::pop_back; %rename("delete") std::array::__delete__; %rename("reject!") std::array::reject_bang; %rename("map!") std::array::map_bang; %rename("empty?") std::array::empty; %rename("include?" ) std::array::__contains__ const; %rename("has_key?" ) std::array::has_key const; %include swig-4.0.2/Lib/ruby/rubyprimtypes.swg0000644000175000017500000001253513667507523017537 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubyprimtypes.swg * ----------------------------------------------------------------------------- */ /* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* auxiliary ruby fail method */ %fragment("SWIG_ruby_failed","header") { SWIGINTERN VALUE SWIG_ruby_failed(VALUE SWIGUNUSEDPARM(arg1), VALUE SWIGUNUSEDPARM(arg2)) { return Qnil; } } %define %ruby_aux_method(Type, Method, Action) SWIGINTERN VALUE SWIG_AUX_##Method##(VALUE arg) { VALUE *args = (VALUE *)arg; VALUE obj = args[0]; VALUE type = TYPE(obj); Type *res = (Type *)(args[1]); *res = Action; return obj; } %enddef /* boolean */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE VALUE SWIG_From_dec(bool)(bool value) { return value ? Qtrue : Qfalse; } } %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(int)) { SWIGINTERN int SWIG_AsVal_dec(bool)(VALUE obj, bool *val) { if (obj == Qtrue) { if (val) *val = true; return SWIG_OK; } else if (obj == Qfalse) { if (val) *val = false; return SWIG_OK; } else { int res = 0; if (SWIG_AsVal(int)(obj, &res) == SWIG_OK) { if (val) *val = res ? true : false; return SWIG_OK; } } return SWIG_TypeError; } } /* long */ %fragment(SWIG_From_frag(long),"header", fragment="") { %define_as(SWIG_From_dec(long), LONG2NUM) } %fragment(SWIG_AsVal_frag(long),"header",fragment="SWIG_ruby_failed") { %ruby_aux_method(long, NUM2LONG, type == T_FIXNUM ? NUM2LONG(obj) : rb_big2long(obj)) SWIGINTERN int SWIG_AsVal_dec(long)(VALUE obj, long* val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2LONG), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long)) { SWIGINTERNINLINE VALUE SWIG_From_dec(unsigned long)(unsigned long value) { return ULONG2NUM(value); } } %fragment(SWIG_AsVal_frag(unsigned long),"header",fragment="SWIG_ruby_failed") { %ruby_aux_method(unsigned long, NUM2ULONG, type == T_FIXNUM ? NUM2ULONG(obj) : rb_big2ulong(obj)) SWIGINTERN int SWIG_AsVal_dec(unsigned long)(VALUE obj, unsigned long *val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { unsigned long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2ULONG), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } } /* long long */ %fragment(SWIG_From_frag(long long),"header", fragment=SWIG_From_frag(long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE VALUE SWIG_From_dec(long long)(long long value) { return LL2NUM(value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_ruby_failed", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE %ruby_aux_method(long long, NUM2LL, type == T_FIXNUM ? NUM2LL(obj) : rb_big2ll(obj)) SWIGINTERN int SWIG_AsVal_dec(long long)(VALUE obj, long long *val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { long long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2LL), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } %#endif } /* unsigned long long */ %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE VALUE SWIG_From_dec(unsigned long long)(unsigned long long value) { return ULL2NUM(value); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment="SWIG_ruby_failed", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE %ruby_aux_method(long long, NUM2ULL, type == T_FIXNUM ? NUM2ULL(obj) : rb_big2ull(obj)) SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(VALUE obj, unsigned long long *val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { unsigned long long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2ULL), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { %define_as(SWIG_From_dec(double), rb_float_new) } %fragment(SWIG_AsVal_frag(double),"header",fragment="SWIG_ruby_failed") { %ruby_aux_method(double, NUM2DBL, NUM2DBL(obj); (void)type) SWIGINTERN int SWIG_AsVal_dec(double)(VALUE obj, double *val) { VALUE type = TYPE(obj); if ((type == T_FLOAT) || (type == T_FIXNUM) || (type == T_BIGNUM)) { double v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2DBL), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } } swig-4.0.2/Lib/ruby/embed.i0000644000175000017500000000025113667507523015275 0ustar williamwilliam%wrapper %{ #include int main(argc, argv) int argc; char **argv; { ruby_init(); ruby_options(argc, argv); ruby_run(); return 0; } %} swig-4.0.2/Lib/ruby/carrays.i0000644000175000017500000000020113667507523015660 0ustar williamwilliam%define %array_class(TYPE,NAME) %array_class_wrap(TYPE,NAME,__getitem__,__setitem__) %enddef %include swig-4.0.2/Lib/ruby/std_functors.i0000644000175000017500000000140013667507523016733 0ustar williamwilliam/** * @file std_functors.i * @date Sun May 6 00:44:33 2007 * * @brief This file provides unary and binary functors for STL * containers, that will invoke a Ruby proc or method to do * their operation. * * You can use them in a swig file like: * * %include * %include * * %template< IntSet > std::set< int, swig::BinaryPredicate >; * * * which will then allow calling them from Ruby either like: * * # order of set is defined by C++ default * a = IntSet.new * * # sort order defined by Ruby proc * b = IntSet.new( proc { |a,b| a > b } ) * */ %include %fragment("StdFunctors"); swig-4.0.2/Lib/ruby/std_pair.i0000644000175000017500000001263713667507523016041 0ustar williamwilliam/* Pairs */ %include //#define SWIG_STD_PAIR_ASVAL %fragment("StdPairTraits","header",fragment="StdTraits") { namespace swig { template struct traits_asval > { typedef std::pair value_type; static int get_pair(VALUE first, VALUE second, std::pair *val) { if (val) { T *pfirst = &(val->first); int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = &(val->second); int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } else { T *pfirst = 0; int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asval(VALUE obj, std::pair *val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_ARRAY ) { if (RARRAY_LEN(obj) == 2) { VALUE first = rb_ary_entry(obj,0); VALUE second = rb_ary_entry(obj,1); res = get_pair(first, second, val); } } else { value_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = *p; } return res; } }; template struct traits_asptr > { typedef std::pair value_type; static int get_pair(VALUE first, VALUE second, std::pair **val) { if (val) { value_type *vp = %new_instance(std::pair); T *pfirst = &(vp->first); int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) { %delete(vp); return res1; } U *psecond = &(vp->second); int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) { %delete(vp); return res2; } *val = vp; return SWIG_AddNewMask(res1 > res2 ? res1 : res2); } else { T *pfirst = 0; int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asptr(VALUE obj, std::pair **val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_ARRAY ) { if ( RARRAY_LEN(obj) == 2) { VALUE first = rb_ary_entry(obj,0); VALUE second = rb_ary_entry(obj,1); res = get_pair(first, second, val); } } else { value_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { static VALUE _wrap_pair_second( VALUE self ) { std::pair< typename swig::noconst_traits::noconst_type,U>* p = NULL; swig::asptr( self, &p ); return swig::from( p->second ); } static VALUE _wrap_pair_second_eq( VALUE self, VALUE arg ) { std::pair< typename swig::noconst_traits::noconst_type,U>* p = NULL; swig::asptr( self, &p ); return swig::from( p->second ); } static VALUE from(const std::pair& val) { VALUE obj = rb_ary_new2(2); rb_ary_push(obj, swig::from::noconst_type>(val.first)); rb_ary_push(obj, swig::from(val.second)); rb_define_singleton_method(obj, "second", VALUEFUNC(_wrap_pair_second), 0 ); rb_define_singleton_method(obj, "second=", VALUEFUNC(_wrap_pair_second_eq), 1 ); rb_obj_freeze(obj); // treat as immutable tuple return obj; } }; } } // Missing typemap %typemap(in) std::pair* (int res) { res = swig::asptr( $input, &$1 ); if (!SWIG_IsOK(res)) %argument_fail(res, "$1_type", $symname, $argnum); } %define %swig_pair_methods(pair...) %extend { VALUE inspect() const { VALUE tmp; const char *type_name = swig::type_name< pair >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " (" ); tmp = swig::from( $self->first ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "," ); tmp = swig::from( $self->second ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, ")" ); return str; } VALUE to_s() const { VALUE tmp; VALUE str = rb_str_new2( "(" ); tmp = swig::from( $self->first ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "," ); tmp = swig::from( $self->second ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, ")" ); return str; } VALUE __getitem__( int index ) { if (( index % 2 ) == 0 ) return swig::from( $self->first ); else return swig::from( $self->second ); } VALUE __setitem__( int index, VALUE obj ) { int res; if (( index % 2 ) == 0 ) { res = swig::asval( obj, &($self->first) ); } else { res = swig::asval(obj, &($self->second) ); } if (!SWIG_IsOK(res)) rb_raise( rb_eArgError, "invalid item for " #pair ); return obj; } } // extend %enddef %include swig-4.0.2/Lib/ruby/rubykw.swg0000644000175000017500000000223113667507523016114 0ustar williamwilliam#ifndef RUBY_RUBYKW_SWG_ #define RUBY_RUBYKW_SWG_ /* Warnings for Ruby keywords */ #define RUBYKW(x) %keywordwarn("'" `x` "' is a ruby keyword, renaming to 'C_" `x` "'",rename="C_%s",fullname=1) `x` /* from http://www.rubycentral.com/book/language.html */ RUBYKW(BEGIN); RUBYKW(END); RUBYKW(alias); RUBYKW(and); RUBYKW(begin); RUBYKW(break); RUBYKW(case); RUBYKW(class); RUBYKW(def); RUBYKW("defined"); RUBYKW(do); RUBYKW(else); RUBYKW(elsif); RUBYKW(end); RUBYKW(ensure); RUBYKW(false); RUBYKW(fatal); RUBYKW(for); RUBYKW(if); RUBYKW(in); RUBYKW(module); RUBYKW(next); RUBYKW(nil); RUBYKW(not); RUBYKW(or); RUBYKW(redo); RUBYKW(rescue); RUBYKW(retry); RUBYKW(return); RUBYKW(self); RUBYKW(super); RUBYKW(then); RUBYKW(true); RUBYKW(undef); RUBYKW(unless); RUBYKW(until); RUBYKW(when); RUBYKW(while); RUBYKW(yield); // RUBYKW(FalseClass); // RUBYKW(TrueClass); // RUBYKW(Numeric); // RUBYKW(Integer); // RUBYKW(Fixnum); // RUBYKW(Float); // RUBYKW(Range); // RUBYKW(Array); // RUBYKW(String); // RUBYKW(IO); // RUBYKW(File); // RUBYKW(FileUtils); // RUBYKW(Find); // RUBYKW(Struct); // RUBYKW(OpenStruct); // RUBYKW(Regexp); #undef RUBYKW #endif //RUBY_RUBYKW_SWG_ swig-4.0.2/Lib/ruby/rubyclasses.swg0000644000175000017500000002612513667507523017140 0ustar williamwilliam#ifdef __cplusplus /* GC_VALUE is used as a replacement of Ruby's VALUE. GC_VALUE automatically handles registering and unregistering of the underlying Ruby object with the GC. It can be used if you want to create STL containers of VALUEs, such as: std::vector< GC_VALUE >; or as a member variable: struct A { GC_VALUE _obj; A(VALUE o) : _obj(o) { } }; or as a input/output value (not much use for this, as VALUE works just as well here, thou): GC_VALUE func(GC_VALUE obj) { GC_VALUE out = rb_obj_classname(obj); return out; } GC_VALUE is 'visible' at the wrapped side, so you can do: %template(RubyVector) std::vector; and all the proper typemaps will be used. */ %fragment("GC_VALUE_definition","header") { namespace swig { class SwigGCReferences { VALUE _hash; SwigGCReferences() : _hash(Qnil) { } ~SwigGCReferences() { if (_hash != Qnil) rb_gc_unregister_address(&_hash); } static void EndProcHandler(VALUE) { // Ruby interpreter ending - _hash can no longer be accessed. SwigGCReferences &s_references = instance(); s_references._hash = Qnil; } public: static SwigGCReferences& instance() { // Hash of all GC_VALUE's currently in use static SwigGCReferences s_references; return s_references; } static void initialize() { SwigGCReferences &s_references = instance(); if (s_references._hash == Qnil) { rb_set_end_proc(&EndProcHandler, Qnil); s_references._hash = rb_hash_new(); rb_gc_register_address(&s_references._hash); } } void GC_register(VALUE& obj) { if (FIXNUM_P(obj) || SPECIAL_CONST_P(obj) || SYMBOL_P(obj)) return; if (_hash != Qnil) { VALUE val = rb_hash_aref(_hash, obj); unsigned n = FIXNUM_P(val) ? NUM2UINT(val) : 0; ++n; rb_hash_aset(_hash, obj, INT2NUM(n)); } } void GC_unregister(const VALUE& obj) { if (FIXNUM_P(obj) || SPECIAL_CONST_P(obj) || SYMBOL_P(obj)) return; // this test should not be needed but I've noticed some very erratic // behavior of none being unregistered in some very rare situations. if (BUILTIN_TYPE(obj) == T_NONE) return; if (_hash != Qnil) { VALUE val = rb_hash_aref(_hash, obj); unsigned n = FIXNUM_P(val) ? NUM2UINT(val) : 1; --n; if (n) rb_hash_aset(_hash, obj, INT2NUM(n)); else rb_hash_delete(_hash, obj); } } }; class GC_VALUE { protected: VALUE _obj; static ID hash_id; static ID lt_id; static ID gt_id; static ID eq_id; static ID le_id; static ID ge_id; static ID pos_id; static ID neg_id; static ID inv_id; static ID add_id; static ID sub_id; static ID mul_id; static ID div_id; static ID mod_id; static ID and_id; static ID or_id; static ID xor_id; static ID lshift_id; static ID rshift_id; struct OpArgs { VALUE src; ID id; int nargs; VALUE target; }; public: GC_VALUE() : _obj(Qnil) { } GC_VALUE(const GC_VALUE& item) : _obj(item._obj) { SwigGCReferences::instance().GC_register(_obj); } GC_VALUE(VALUE obj) :_obj(obj) { SwigGCReferences::instance().GC_register(_obj); } ~GC_VALUE() { SwigGCReferences::instance().GC_unregister(_obj); } GC_VALUE & operator=(const GC_VALUE& item) { SwigGCReferences::instance().GC_unregister(_obj); _obj = item._obj; SwigGCReferences::instance().GC_register(_obj); return *this; } operator VALUE() const { return _obj; } VALUE inspect() const { return rb_inspect(_obj); } VALUE to_s() const { return rb_inspect(_obj); } static VALUE swig_rescue_swallow(VALUE, VALUE) { /* VALUE errstr = rb_obj_as_string(rb_errinfo()); printf("Swallowing error: '%s'\n", RSTRING_PTR(StringValue(errstr))); */ return Qnil; /* Swallow Ruby exception */ } static VALUE swig_rescue_funcall(VALUE p) { OpArgs* args = (OpArgs*) p; return rb_funcall(args->src, args->id, args->nargs, args->target); } bool relational_equal_op(const GC_VALUE& other, const ID& op_id, bool (*op_func)(const VALUE& a, const VALUE& b)) const { if (FIXNUM_P(_obj) && FIXNUM_P(other._obj)) { return op_func(_obj, other._obj); } bool res = false; VALUE ret = Qnil; SWIG_RUBY_THREAD_BEGIN_BLOCK; if (rb_respond_to(_obj, op_id)) { OpArgs args; args.src = _obj; args.id = op_id; args.nargs = 1; args.target = VALUE(other); ret = rb_rescue(VALUEFUNC(swig_rescue_funcall), VALUE(&args), (VALUEFUNC(swig_rescue_swallow)), Qnil); } if (ret == Qnil) { VALUE a = rb_funcall( _obj, hash_id, 0 ); VALUE b = rb_funcall( VALUE(other), hash_id, 0 ); res = op_func(a, b); } else { res = RTEST(ret); } SWIG_RUBY_THREAD_END_BLOCK; return res; } static bool operator_eq(const VALUE& a, const VALUE& b) { return a == b; } static bool operator_lt(const VALUE& a, const VALUE& b) { return a < b; } static bool operator_le(const VALUE& a, const VALUE& b) { return a <= b; } static bool operator_gt(const VALUE& a, const VALUE& b) { return a > b; } static bool operator_ge(const VALUE& a, const VALUE& b) { return a >= b; } bool operator==(const GC_VALUE& other) const { return relational_equal_op(other, eq_id, operator_eq); } bool operator<(const GC_VALUE& other) const { return relational_equal_op(other, lt_id, operator_lt); } bool operator<=(const GC_VALUE& other) const { return relational_equal_op(other, le_id, operator_le); } bool operator>(const GC_VALUE& other) const { return relational_equal_op(other, gt_id, operator_gt); } bool operator>=(const GC_VALUE& other) const { return relational_equal_op(other, ge_id, operator_ge); } bool operator!=(const GC_VALUE& other) const { return !(this->operator==(other)); } GC_VALUE unary_op(const ID& op_id) const { VALUE ret = Qnil; SWIG_RUBY_THREAD_BEGIN_BLOCK; OpArgs args; args.src = _obj; args.id = op_id; args.nargs = 0; args.target = Qnil; ret = rb_rescue(VALUEFUNC(swig_rescue_funcall), VALUE(&args), (VALUEFUNC(swig_rescue_swallow)), Qnil); SWIG_RUBY_THREAD_END_BLOCK; return ret; } GC_VALUE operator+() const { return unary_op(pos_id); } GC_VALUE operator-() const { return unary_op(neg_id); } GC_VALUE operator~() const { return unary_op(inv_id); } GC_VALUE binary_op(const GC_VALUE& other, const ID& op_id) const { VALUE ret = Qnil; SWIG_RUBY_THREAD_BEGIN_BLOCK; OpArgs args; args.src = _obj; args.id = op_id; args.nargs = 1; args.target = VALUE(other); ret = rb_rescue(VALUEFUNC(swig_rescue_funcall), VALUE(&args), (VALUEFUNC(swig_rescue_swallow)), Qnil); SWIG_RUBY_THREAD_END_BLOCK; return GC_VALUE(ret); } GC_VALUE operator+(const GC_VALUE& other) const { return binary_op(other, add_id); } GC_VALUE operator-(const GC_VALUE& other) const { return binary_op(other, sub_id); } GC_VALUE operator*(const GC_VALUE& other) const { return binary_op(other, mul_id); } GC_VALUE operator/(const GC_VALUE& other) const { return binary_op(other, div_id); } GC_VALUE operator%(const GC_VALUE& other) const { return binary_op(other, mod_id); } GC_VALUE operator&(const GC_VALUE& other) const { return binary_op(other, and_id); } GC_VALUE operator^(const GC_VALUE& other) const { return binary_op(other, xor_id); } GC_VALUE operator|(const GC_VALUE& other) const { return binary_op(other, or_id); } GC_VALUE operator<<(const GC_VALUE& other) const { return binary_op(other, lshift_id); } GC_VALUE operator>>(const GC_VALUE& other) const { return binary_op(other, rshift_id); } }; ID GC_VALUE::hash_id = rb_intern("hash"); ID GC_VALUE::lt_id = rb_intern("<"); ID GC_VALUE::gt_id = rb_intern(">"); ID GC_VALUE::eq_id = rb_intern("=="); ID GC_VALUE::le_id = rb_intern("<="); ID GC_VALUE::ge_id = rb_intern(">="); ID GC_VALUE::pos_id = rb_intern("+@"); ID GC_VALUE::neg_id = rb_intern("-@"); ID GC_VALUE::inv_id = rb_intern("~"); ID GC_VALUE::add_id = rb_intern("+"); ID GC_VALUE::sub_id = rb_intern("-"); ID GC_VALUE::mul_id = rb_intern("*"); ID GC_VALUE::div_id = rb_intern("/"); ID GC_VALUE::mod_id = rb_intern("%"); ID GC_VALUE::and_id = rb_intern("&"); ID GC_VALUE::or_id = rb_intern("|"); ID GC_VALUE::xor_id = rb_intern("^"); ID GC_VALUE::lshift_id = rb_intern("<<"); ID GC_VALUE::rshift_id = rb_intern(">>"); typedef GC_VALUE LANGUAGE_OBJ; } // namespace swig } // %fragment(GC_VALUE_definition) namespace swig { %apply VALUE {GC_VALUE}; // Make sure this is the last typecheck done %typecheck(999999,fragment="GC_VALUE_definition",noblock=1) GC_VALUE, GC_VALUE&, const GC_VALUE& { $1 = 1; }; /* For input */ %typemap(in,fragment="GC_VALUE_definition",noblock=1) GC_VALUE* (GC_VALUE r), GC_VALUE& (GC_VALUE r) { r = $input; $1 = &r; } /* For output */ %typemap(out,fragment="GC_VALUE_definition",noblock=1) GC_VALUE { $result = (VALUE)$1; } %typemap(out,fragment="GC_VALUE_definition",noblock=1) GC_VALUE*, GC_VALUE const & { $result = (VALUE)*$1; } %nodirector GC_VALUE; // We ignore the constructor so that user can never create a GC_VALUE // manually %ignore GC_VALUE::GC_VALUE; struct GC_VALUE { VALUE inspect() const; VALUE to_s() const; GC_VALUE(); protected: GC_VALUE(const GC_VALUE&); ~GC_VALUE(); }; %exception GC_VALUE {}; %ignore LANGUAGE_OBJ; typedef GC_VALUE LANGUAGE_OBJ; } %init { swig::SwigGCReferences::initialize(); } // // Fragment that contains traits to properly deal with GC_VALUE. // These functions may be invoked as a need of the from(), asval(), // asptr() and as() template functors, usually used in %typemaps. // %fragment(SWIG_Traits_frag(swig::GC_VALUE),"header",fragment="StdTraits",fragment="GC_VALUE_definition") { namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "GC_VALUE"; } }; template <> struct traits_from { typedef GC_VALUE value_type; static VALUE from(const value_type& val) { return static_cast(val); } }; template <> struct traits_check { static bool check(GC_VALUE) { return true; } }; template <> struct traits_asval { typedef GC_VALUE value_type; static int asval(VALUE obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; } // swig } // %fragment(traits for swig::GC_VALUE) #endif // __cplusplus swig-4.0.2/Lib/ruby/rubycontainer.swg0000644000175000017500000007026513667507523017471 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubycontainer.swg * * Ruby sequence <-> C++ container wrapper * * This wrapper, and its iterator, allows a general use (and reuse) of * the mapping between C++ and Ruby, thanks to the C++ templates. * * Of course, it needs the C++ compiler to support templates, but * since we will use this wrapper with the STL containers, that should * be the case. * ----------------------------------------------------------------------------- */ %{ #include %} #if !defined(SWIG_NO_EXPORT_ITERATOR_METHODS) # if !defined(SWIG_EXPORT_ITERATOR_METHODS) # define SWIG_EXPORT_ITERATOR_METHODS SWIG_EXPORT_ITERATOR_METHODS # endif #endif %include /**** The RubySequence C++ Wrap ***/ %fragment(""); %include %fragment("RubySequence_Base","header") { %#include namespace swig { template < class T > struct yield { bool operator()( const T& v ) const { return RTEST( rb_yield( swig::from< T >(v) ) ); } }; inline size_t check_index(ptrdiff_t i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } inline size_t slice_index(ptrdiff_t i, size_t size) { if ( i < 0 ) { if ((size_t) (-i) <= size) { return (size_t) (i + size); } else { throw std::out_of_range("index out of range"); } } else { return ( (size_t) i < size ) ? ((size_t) i) : size; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline void resize(Sequence *seq, typename Sequence::size_type n, typename Sequence::value_type x) { seq->resize(n, x); } template inline Sequence* getslice(const Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, (i == size && j == size)); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::const_iterator vb = self->begin(); typename Sequence::const_iterator ve = self->begin(); std::advance(vb,ii); std::advance(ve,jj); return new Sequence(vb, ve); } else { return new Sequence(); } } template inline void setslice(Sequence* self, Difference i, Difference j, const InputSeq& v) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj < ii) jj = ii; size_t ssize = jj - ii; if (ssize <= v.size()) { typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator vmid = v.begin(); std::advance(sb,ii); std::advance(vmid, jj - ii); self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end()); } else { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); self->insert(sb, v.begin(), v.end()); } } template inline void delslice(Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); } } } } %fragment("RubySequence_Cont","header", fragment="", fragment="StdTraits", fragment="RubySequence_Base", fragment="ConstIterator_T") { namespace swig { /** * This class is a proxy class for references, used to return and set values * of an element of a Ruby Array of stuff. * It can be used by RubySequence_InputIterator to make it work with STL * algorithms. */ template struct RubySequence_Ref { RubySequence_Ref(VALUE seq, int index) : _seq(seq), _index(index) { } operator T () const { VALUE item = rb_ary_entry(_seq, _index ); try { return swig::as(item); } catch (const std::invalid_argument& e) { char msg[1024]; sprintf(msg, "in sequence element %d ", _index); VALUE lastErr = rb_gv_get("$!"); if ( lastErr == Qnil ) { %type_error(swig::type_name()); } VALUE str = rb_str_new2(msg); str = rb_str_cat2( str, e.what() ); SWIG_Ruby_ExceptionType( NULL, str ); throw; } } RubySequence_Ref& operator=(const T& v) { rb_ary_set(_seq, _index, swig::from< T >(v)); return *this; } private: VALUE _seq; int _index; }; /** * This class is a proxy to return a pointer to a class, usually * RubySequence_Ref. * It can be used by RubySequence_InputIterator to make it work with STL * algorithms. */ template struct RubySequence_ArrowProxy { RubySequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; /** * Input Iterator. This adapator class is a random access iterator that * allows you to use STL algorithms with a Ruby class (a Ruby Array by default). */ template > struct RubySequence_InputIterator { typedef RubySequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef ptrdiff_t difference_type; RubySequence_InputIterator() { } RubySequence_InputIterator(VALUE seq, int index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } RubySequence_ArrowProxy operator->() const { return RubySequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index) && (_seq == ri._seq); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: VALUE _seq; difference_type _index; }; /** * This adaptor class allows you to use a Ruby Array as if it was an STL * container, giving it begin(), end(), and iterators. */ template struct RubySequence_Cont { typedef RubySequence_Ref reference; typedef const RubySequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef int difference_type; typedef int size_type; typedef const pointer const_pointer; typedef RubySequence_InputIterator iterator; typedef RubySequence_InputIterator const_iterator; RubySequence_Cont(VALUE seq) : _seq(0) { if (!rb_obj_is_kind_of(seq, rb_cArray)) { throw std::invalid_argument("an Array is expected"); } _seq = seq; } ~RubySequence_Cont() { } size_type size() const { return RARRAY_LEN(_seq); } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } bool check() const { int s = (int) size(); for (int i = 0; i < s; ++i) { VALUE item = rb_ary_entry(_seq, i ); if (!swig::check(item)) return false; } return true; } private: VALUE _seq; }; } } /** * Macros used to typemap an STL iterator -> SWIGIterator conversion. */ %define %swig_sequence_iterator(Sequence...) #if defined(SWIG_EXPORT_ITERATOR_METHODS) %typemap(out,noblock=1,fragment="RubySequence_Cont") const_iterator, const_reverse_iterator { $result = SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &), self), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN); } %typemap(out,noblock=1,fragment="RubySequence_Cont") iterator, reverse_iterator { $result = SWIG_NewPointerObj(swig::make_nonconst_iterator(%static_cast($1,const $type &), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); } %typemap(out,noblock=1,fragment="RubySequence_Cont") std::pair { $result = rb_ary_new2(2); rb_ary_push($result, SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &).first), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN)); rb_ary_push($result, SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &).second), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN)); } // std::map/multimap/set allow returning std::pair< iterator, iterator > from // equal_range, but we cannot still modify the key, so the iterator is // const. %typemap(out,noblock=1,fragment="RubySequence_Cont") std::pair { $result = rb_ary_new2(2); rb_ary_push($result, SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &).first), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN)); rb_ary_push($result, SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &).second), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN)); } %typemap(in,noblock=1,fragment="RubySequence_Cont") const_iterator(swig::ConstIterator *iter = 0, int res), const_reverse_iterator(swig::ConstIterator *iter = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::ConstIterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::ConstIterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typemap(in,noblock=1,fragment="RubySequence_Cont") iterator(swig::Iterator *iter = 0, int res), reverse_iterator(swig::Iterator *iter = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::Iterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="RubySequence_Cont") const_iterator, const_reverse_iterator { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::ConstIterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="RubySequence_Cont") iterator, reverse_iterator { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %fragment("RubySequence_Cont"); // %newobject iterator; // %newobject const_iterator; // %extend { // swig::Iterator* iterator(VALUE* RUBY_SELF) { // return swig::make_nonconst_iterator($self->begin(), $self->begin(), // $self->end(), *RUBY_SELF); // } // swig::ConstIterator* const_iterator(VALUE* RUBY_SELF) { // return swig::make_const_iterator($self->begin(), $self->begin(), // $self->end(), *RUBY_SELF); // } // } #endif //SWIG_EXPORT_ITERATOR_METHODS %enddef /**** The Ruby container methods ****/ %define %swig_container_methods(Container...) %extend { %newobject dup; Container* dup() { return new Container(*$self); } } %enddef /** * Macro used to define common Ruby printing methods for STL container */ %define %swig_sequence_printing_methods(Sequence...) %extend { VALUE inspect() { Sequence::const_iterator i = $self->begin(); Sequence::const_iterator e = $self->end(); const char *type_name = swig::type_name< Sequence >(); VALUE str = rb_str_new2(type_name); str = rb_str_cat2( str, " [" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< Sequence::value_type >( *i ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "]" ); return str; } VALUE to_a() { Sequence::const_iterator i = $self->begin(); Sequence::const_iterator e = $self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< Sequence::value_type >( *i ); rb_ary_push( ary, tmp ); } return ary; } VALUE to_s() { Sequence::iterator i = $self->begin(); Sequence::iterator e = $self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< Sequence::value_type >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } } %enddef /** * Macro used to add common methods to all STL sequence-type containers */ %define %swig_sequence_methods_non_resizable_common(Sequence...) %swig_container_methods(%arg(Sequence)) %swig_sequence_iterator(%arg(Sequence)) %swig_sequence_printing_methods(%arg(Sequence)) %fragment("RubySequence_Base"); %extend { VALUE slice( difference_type i, difference_type length ) throw (std::invalid_argument) { if ( length < 0 ) return Qnil; std::size_t len = $self->size(); if ( i < 0 ) { if ( i + static_cast(len) < 0 ) return Qnil; else i = len + i; } Sequence::difference_type j = length + i; if ( j > static_cast(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const Sequence* >( swig::getslice(self, i, j) ); } catch( const std::out_of_range& ) { } return r; } Sequence* each() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; Sequence::const_iterator i = self->begin(); Sequence::const_iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from< Sequence::value_type >(*i); rb_yield(r); } return self; } VALUE __delete2__(const value_type& i) { VALUE r = Qnil; return r; } } %enddef %define %swig_sequence_methods_resizable_common(Sequence...) %extend { %newobject select; Sequence* select() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); Sequence* r = new Sequence(); Sequence::const_iterator i = $self->begin(); Sequence::const_iterator e = $self->end(); for ( ; i != e; ++i ) { VALUE v = swig::from< Sequence::value_type >(*i); if ( RTEST( rb_yield(v) ) ) $self->insert( r->end(), *i); } return r; } VALUE delete_at(difference_type i) { VALUE r = Qnil; try { Sequence::iterator at = swig::getpos(self, i); r = swig::from< Sequence::value_type >( *(at) ); $self->erase(at); } catch (const std::out_of_range&) { } return r; } } %enddef %define %swig_sequence_methods_common(Sequence...) %swig_sequence_methods_non_resizable_common(%arg(Sequence)) %swig_sequence_methods_resizable_common(%arg(Sequence)) %enddef /** * Macro used to add functions for back insertion of values in * STL sequence containers */ %define %swig_sequence_back_inserters( Sequence... ) %extend { VALUE pop() { if ($self->empty()) return Qnil; Sequence::value_type x = self->back(); $self->pop_back(); return swig::from< Sequence::value_type >( x ); } %alias push "<<"; const value_type push( const value_type& e ) { $self->push_back( e ); return e; } %newobject reject; Sequence* reject() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); Sequence* r = new Sequence(); std::remove_copy_if( $self->begin(), $self->end(), std::back_inserter(*r), swig::yield< Sequence::value_type >() ); return r; } } %enddef %define %swig_sequence_methods_extra(Sequence...) %extend { %alias reject_bang "delete_if"; Sequence* reject_bang() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); $self->erase( std::remove_if( $self->begin(), $self->end(), swig::yield< Sequence::value_type >() ), $self->end() ); return $self; } } %enddef %define %swig_sequence_methods_non_resizable_accessors(Sequence...) %extend { VALUE at(difference_type i) const { VALUE r = Qnil; try { r = swig::from< Sequence::value_type >( *(swig::cgetpos(self, i)) ); } catch( const std::out_of_range& ) { } return r; } VALUE __getitem__(difference_type i, difference_type length) const throw (std::invalid_argument) { if ( length < 0 ) return Qnil; std::size_t len = $self->size(); if ( i < 0 ) { if ( i + static_cast(len) < 0 ) return Qnil; else i = len + i; } Sequence::difference_type j = length + i; if ( j > static_cast(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const Sequence* >( swig::getslice(self, i, j) ); } catch( const std::out_of_range& ) { } return r; } VALUE __getitem__(difference_type i) const { VALUE r = Qnil; try { r = swig::from< Sequence::value_type >( *(swig::cgetpos(self, i)) ); } catch( const std::out_of_range& ) { } return r; } VALUE __getitem__(VALUE i) const throw (std::invalid_argument) { if ( rb_obj_is_kind_of( i, rb_cRange ) == Qfalse ) { rb_raise( rb_eTypeError, "not a valid index or range" ); } static ID id_end = rb_intern("end"); static ID id_start = rb_intern("begin"); static ID id_noend = rb_intern("exclude_end?"); VALUE start = rb_funcall( i, id_start, 0 ); VALUE end = rb_funcall( i, id_end, 0 ); bool noend = ( rb_funcall( i, id_noend, 0 ) == Qtrue ); int len = $self->size(); int s = NUM2INT( start ); if ( s < 0 ) { s = len + s; if ( s < 0 ) return Qnil; } else if ( s > len ) return Qnil; int e = NUM2INT( end ); if ( e < 0 ) e = len + e; if ( noend ) e -= 1; if ( e < 0 ) e = -1; if ( e >= len ) e = len - 1; if ( s == len ) e = len - 1; return swig::from< Sequence* >( swig::getslice(self, s, e+1) ); } VALUE __setitem__(difference_type i, const value_type& x) throw (std::invalid_argument, std::out_of_range) { if ( i >= static_cast( $self->size()) ) swig::resize( $self, i+1, x ); else *(swig::getpos($self, i)) = x; return swig::from< Sequence::value_type >( x ); } VALUE __setitem__(difference_type i, difference_type length, const Sequence& v) throw (std::invalid_argument) { if ( length < 0 ) return Qnil; std::size_t len = $self->size(); if ( i < 0 ) { if ( i + static_cast(len) < 0 ) return Qnil; else i = len + i; } Sequence::difference_type j = length + i; if ( j > static_cast(len) ) { swig::resize( $self, j, *(v.begin()) ); } VALUE r = Qnil; swig::setslice($self, i, j, v); r = swig::from< const Sequence* >( &v ); return r; } } %enddef /** * Macro used to add functions for non resizable sequences */ %define %swig_sequence_methods_non_resizable(Sequence...) %swig_sequence_methods_non_resizable_common(%arg(Sequence)) %swig_sequence_methods_non_resizable_accessors(%arg(Sequence)) %enddef /** * Macro used to add functions for sequences */ %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_non_resizable_common(%arg(Sequence)) %swig_sequence_methods_resizable_common(%arg(Sequence)) %swig_sequence_methods_non_resizable_accessors(%arg(Sequence)) %swig_sequence_methods_extra(%arg(Sequence)); %swig_sequence_back_inserters(%arg(Sequence)); %enddef %define %swig_sequence_methods_non_resizable_val(Sequence...) %swig_sequence_methods_non_resizable(%arg(Sequence)) %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods(%arg(Sequence)) %enddef /** * Macro used to add functions for front insertion of * elements in STL sequence containers that support it. */ %define %swig_sequence_front_inserters( Sequence... ) %extend { VALUE shift() { if ($self->empty()) return Qnil; Sequence::value_type x = self->front(); $self->erase( $self->begin() ); return swig::from< Sequence::value_type >( x ); } %typemap(in) (int argc, VALUE* argv) { $1 = argc - 1; $2 = argv + 1; } Sequence* insert( difference_type pos, int argc, VALUE* argv, ... ) { std::size_t len = $self->size(); std::size_t i = swig::check_index( pos, len, true ); Sequence::iterator start; VALUE elem = argv[0]; int idx = 0; try { Sequence::value_type val = swig::as( elem ); if ( i >= len ) { $self->resize(i-1, val); return $self; } start = $self->begin(); std::advance( start, i ); $self->insert( start++, val ); for ( ++idx; idx < argc; ++idx ) { elem = argv[idx]; val = swig::as( elem ); $self->insert( start++, val ); } } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name(), __FUNCTION__, idx+2, elem )); } return $self; } %typemap(in) (int argc, VALUE* argv) { $1 = argc; $2 = argv; } Sequence* unshift( int argc, VALUE* argv, ... ) { for ( int idx = argc-1; idx >= 0; --idx ) { Sequence::iterator start = $self->begin(); VALUE elem = argv[idx]; try { Sequence::value_type val = swig::as( elem ); $self->insert( start, val ); } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name(), __FUNCTION__, idx+2, elem )); } } return $self; } } %enddef // // Common fragments // %fragment("StdSequenceTraits","header", fragment="StdTraits", fragment="RubySequence_Cont", fragment="GC_VALUE_definition") { namespace swig { template inline void assign(const RubySeq& rubyseq, Seq* seq) { // seq->assign(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(VALUE obj, sequence **seq) { if (rb_obj_is_kind_of(obj, rb_cArray) == Qtrue) { try { RubySequence_Cont rubyseq(obj); if (seq) { sequence *pseq = new sequence(); assign(rubyseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return rubyseq.check() ? SWIG_OK : SWIG_ERROR; } } catch (const std::exception& e) { if (seq) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { rb_raise(rb_eTypeError, "%s", e.what()); } } return SWIG_ERROR; } } else { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } } return SWIG_ERROR; } }; // Partial specialization for GC_VALUE's. No need to typecheck each // element. template< class Seq > struct traits_asptr_stdseq< Seq, swig::GC_VALUE > { typedef Seq sequence; typedef swig::GC_VALUE value_type; static int asptr(VALUE obj, sequence **seq) { if (rb_obj_is_kind_of(obj, rb_cArray) == Qtrue) { try { if (seq) { RubySequence_Cont rubyseq(obj); sequence *pseq = new sequence(); assign(rubyseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return true; } } catch (const std::exception& e) { if (seq) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { rb_raise(rb_eTypeError, "%s", e.what()); } } return SWIG_ERROR; } } else { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } } return SWIG_ERROR; } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static VALUE from(const sequence& seq) { #ifdef SWIG_RUBY_EXTRA_NATIVE_CONTAINERS swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN); } #endif size_type size = seq.size(); if (size <= (size_type)INT_MAX) { VALUE obj = rb_ary_new2((int)size); int i = 0; for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) { rb_ary_push(obj, swig::from< value_type >(*it)); } rb_obj_freeze(obj); // treat as immutable result return obj; } else { rb_raise(rb_eRangeError,"sequence size not valid in ruby"); return Qnil; } } }; } } %include swig-4.0.2/Lib/ruby/std_auto_ptr.i0000644000175000017500000000111013667507523016723 0ustar williamwilliam/* The typemaps here allow to handle functions returning std::auto_ptr<>, which is the most common use of this type. If you have functions taking it as parameter, these typemaps can't be used for them and you need to do something else (e.g. use shared_ptr<> which SWIG supports fully). */ %define %auto_ptr(TYPE) %typemap (out) std::auto_ptr %{ %set_output(SWIG_NewPointerObj($1.release(), $descriptor(TYPE *), SWIG_POINTER_OWN | %newpointer_flags)); %} %template() std::auto_ptr; %enddef namespace std { template class auto_ptr {}; } swig-4.0.2/Lib/ruby/std_char_traits.i0000644000175000017500000000004113667507523017373 0ustar williamwilliam%include swig-4.0.2/Lib/ruby/stl.i0000644000175000017500000000044313667507523015026 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/ruby/rubyinit.swg0000644000175000017500000000004713667507523016441 0ustar williamwilliam%insert(initbeforefunc) "swiginit.swg" swig-4.0.2/Lib/ruby/rubyopers.swg0000644000175000017500000000347413667507523016635 0ustar williamwilliam/* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus %rename(__add__) *::operator+; %rename(__pos__) *::operator+(); %rename(__pos__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-(); %rename(__neg__) *::operator-() const; %rename(__mul__) *::operator*; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__lshift__) *::operator<<; %rename(__rshift__) *::operator>>; %rename(__and__) *::operator&; %rename(__or__) *::operator|; %rename(__xor__) *::operator^; %rename(__invert__) *::operator~; %rename(__lt__) *::operator<; %rename(__le__) *::operator<=; %rename(__gt__) *::operator>; %rename(__ge__) *::operator>=; %rename(__eq__) *::operator==; /* Special cases */ %rename(__call__) *::operator(); /* Ignored inplace operators */ %ignoreoperator(NOTEQUAL) operator!=; %ignoreoperator(PLUSEQ) operator+=; %ignoreoperator(MINUSEQ) operator-=; %ignoreoperator(MULEQ) operator*=; %ignoreoperator(DIVEQ) operator/=; %ignoreoperator(MODEQ) operator%=; %ignoreoperator(LSHIFTEQ) operator<<=; %ignoreoperator(RSHIFTEQ) operator>>=; %ignoreoperator(ANDEQ) operator&=; %ignoreoperator(OREQ) operator|=; %ignoreoperator(XOREQ) operator^=; /* Ignored operators */ %ignoreoperator(LNOT) operator!; %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; %ignoreoperator(EQ) operator=; %ignoreoperator(PLUSPLUS) operator++; %ignoreoperator(MINUSMINUS) operator--; %ignoreoperator(ARROWSTAR) operator->*; %ignoreoperator(INDEX) operator[]; #endif /* __cplusplus */ swig-4.0.2/Lib/ruby/rubycontainer_extended.swg0000644000175000017500000000672213667507523021346 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubycontainer_extended.swg * * This file contains additional functions that make containers * behave closer to ruby primitive types. * However, some of these functions place some restrictions on * the underlying object inside of the container and the iterator * (that it has to have an == comparison function, that it has to have * an = assignment operator, etc). * ----------------------------------------------------------------------------- */ /** * Macro used to add extend functions that require operator== in object. * * @param Container STL container * @param Type class inside container * */ %define %swig_container_with_equal_operator( Container, Type ) VALUE __delete__( const Type& val ) { VALUE r = Qnil; Container::iterator e = $self->end(); Container::iterator i = std::remove( $self->begin(), e, val ); // remove dangling elements now $self->erase( i, e ); if ( i != e ) r = swig::from< Type >( val ); else if ( rb_block_given_p() ) r = rb_yield(Qnil); return r; } %enddef // end of %swig_container_with_equal_operator /** * Macro used to add extend functions that require the assignment * operator (ie. = ) of contained class * * @param Container STL container * @param Type class inside container * */ %define %swig_container_with_assignment( Container, Type ) // // map! -- the equivalent of std::transform // Container< Type >* map_bang() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "No block given" ); VALUE r = Qnil; Container< Type >::iterator i = $self->begin(); Container< Type >::iterator e = $self->end(); try { for ( ; i != e; ++i ) { r = swig::from< Type >( *i ); r = rb_yield( r ); *i = swig::as< Type >( r ); } } catch (const std::invalid_argument&) { rb_raise(rb_eTypeError, "Yield block did not return a valid element for " "Container"); } return $self; } %enddef // end of %swig_container_with_assignment /** * Macro used to add all extended functions to a container * * @param Container STL container * @param Type class inside container * */ %define %swig_container_extend( Container, Type ) %extend Container< Type > { %swig_container_with_assignment( %arg(Container), Type ); %swig_container_with_equal_operator( %arg(Container), Type ); } %enddef /** * Private macro used to add all extended functions to C/C++ * primitive types * * @param Container an STL container, like std::vector (with no class template) * */ %define %__swig_container_extend_primtypes( Container ) %swig_container_extend( %arg( Container ), bool ); %swig_container_extend( %arg( Container ), char ); %swig_container_extend( %arg( Container ), short ); %swig_container_extend( %arg( Container ), int ); %swig_container_extend( %arg( Container ), unsigned short ); %swig_container_extend( %arg( Container ), unsigned int ); %swig_container_extend( %arg( Container ), float ); %swig_container_extend( %arg( Container ), double ); %swig_container_extend( %arg( Container ), std::complex ); %swig_container_extend( %arg( Container ), std::string ); %swig_container_extend( %arg( Container ), swig::GC_VALUE ); %enddef %__swig_container_extend_primtypes( std::vector ); %__swig_container_extend_primtypes( std::deque ); %__swig_container_extend_primtypes( std::list ); swig-4.0.2/Lib/ruby/exception.i0000644000175000017500000000017613667507523016225 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg);)) } swig-4.0.2/Lib/ruby/std_list.i0000644000175000017500000000205313667507523016050 0ustar williamwilliam/* Lists */ %fragment("StdListTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::list **lis) { return traits_asptr_stdseq >::asptr(obj, lis); } }; template struct traits_from > { static VALUE from(const std::list& vec) { return traits_from_stdseq >::from(vec); } }; } %} %ignore std::list::push_back; %ignore std::list::pop_back; #define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %mixin std::list "Enumerable"; %rename("delete") std::list::__delete__; %rename("reject!") std::list::reject_bang; %rename("map!") std::list::map_bang; %rename("empty?") std::list::empty; %rename("include?" ) std::list::__contains__ const; %rename("has_key?" ) std::list::has_key const; %alias std::list::push "<<"; %include swig-4.0.2/Lib/ruby/rubyuserdir.swg0000644000175000017500000000122113667507523017146 0ustar williamwilliam#define %alias %feature("alias") #define %freefunc %feature("freefunc") #define %markfunc %feature("markfunc") #define %mixin %feature("mixin") #define %predicate %feature("predicate", "1") #define %bang %feature("bang", "1") #define %trackobjects %feature("trackobjects") #define %nooutput %feature("outputs","0") #define %initstack %feature("initstack", "1") #define %ignorestack %feature("initstack", "0") /* ------------------------------------------------------------------------- */ /* Enable keywords parameters */ #define %kwargs %feature("kwargs") #define %nokwargs %feature("kwargs", "0") #define %clearkwargs %feature("kwargs", "") swig-4.0.2/Lib/ruby/std_iostream.i0000644000175000017500000000034313667507523016720 0ustar williamwilliamnamespace std { %callback("%s") endl; %callback("%s") ends; %callback("%s") flush; } %warnfilter(365) operator+=; %warnfilter(802) std::basic_iostream; // turn off multiple inheritance warning %include swig-4.0.2/Lib/ruby/cdata.i0000644000175000017500000000003613667507523015276 0ustar williamwilliam%include swig-4.0.2/Lib/ruby/std_vectora.i0000644000175000017500000000166613667507523016551 0ustar williamwilliam/* Vectors + allocators */ %fragment("StdVectorATraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { typedef std::vector vector_type; typedef T value_type; static int asptr(VALUE obj, vector_type **vec) { return traits_asptr_stdseq::asptr(obj, vec); } }; template struct traits_from > { typedef std::vector vector_type; static VALUE from(const vector_type& vec) { return traits_from_stdseq::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %mixin std::vector "Enumerable"; %ignore std::vector::push_back; %ignore std::vector::pop_back; %alias std::vector::push "<<"; %include swig-4.0.2/Lib/ruby/std_string.i0000644000175000017500000000023113667507523016377 0ustar williamwilliam %warnfilter(SWIGWARN_RUBY_WRONG_NAME) std::basic_string; AUTODOC(substr, "Return a portion of the String"); %include swig-4.0.2/Lib/ruby/std_ios.i0000644000175000017500000000057413667507523015675 0ustar williamwilliam #pragma SWIG nowarn=801 %rename(ios_base_in) std::ios_base::in; AUTODOC(cerr, "Standard C++ error stream"); AUTODOC(cout, "Standard C++ output stream"); AUTODOC(cin, "Standard C++ input stream"); AUTODOC(clog, "Standard C++ logging stream"); AUTODOC(endl, "Add an end line to stream"); AUTODOC(ends, "Ends stream"); AUTODOC(flush, "Flush stream"); %include swig-4.0.2/Lib/ruby/std_map.i0000644000175000017500000002607213667507523015661 0ustar williamwilliam// // Maps // %fragment("StdMapCommonTraits","header",fragment="StdSequenceTraits") { namespace swig { template struct from_key_oper { typedef const ValueType& argument_type; typedef VALUE result_type; result_type operator()(argument_type v) const { return swig::from(v.first); } }; template struct from_value_oper { typedef const ValueType& argument_type; typedef VALUE result_type; result_type operator()(argument_type v) const { return swig::from(v.second); } }; template struct MapIterator_T : ConstIteratorClosed_T { MapIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq) : ConstIteratorClosed_T(curr, first, last, seq) { } }; template > struct MapKeyIterator_T : MapIterator_T { MapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq) : MapIterator_T(curr, first, last, seq) { } }; template inline ConstIterator* make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, VALUE seq = 0) { return new MapKeyIterator_T(current, begin, end, seq); } template > struct MapValueIterator_T : MapIterator_T { MapValueIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq) : MapIterator_T(curr, first, last, seq) { } }; template inline ConstIterator* make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, VALUE seq = 0) { return new MapValueIterator_T(current, begin, end, seq); } } } %fragment("StdMapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const RubySeq& rubyseq, std::map *map) { typedef typename std::map::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { map->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::map map_type; static int asptr(VALUE obj, map_type **val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_HASH ) { static ID id_to_a = rb_intern("to_a"); VALUE items = rb_funcall(obj, id_to_a, 0); res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { map_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::map map_type; typedef typename map_type::const_iterator const_iterator; typedef typename map_type::size_type size_type; static VALUE from(const map_type& map) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN); } else { size_type size = map.size(); int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise( rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE obj = rb_hash_new(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { VALUE key = swig::from(i->first); VALUE val = swig::from(i->second); rb_hash_aset(obj, key, val); } return obj; } } }; } } %define %swig_map_common(Map...) %swig_container_methods(%arg(Map)); // %swig_sequence_iterator(%arg(Map)); %extend { VALUE __delete__(const key_type& key) { Map::iterator i = self->find(key); if (i != self->end()) { self->erase(i); return swig::from( key ); } else { return Qnil; } } bool has_key(const key_type& key) const { Map::const_iterator i = self->find(key); return i != self->end(); } VALUE keys() { Map::size_type size = self->size(); int rubysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); Map::const_iterator i = self->begin(); Map::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->first) ); } return ary; } Map* each() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE k, v; Map::iterator i = self->begin(); Map::iterator e = self->end(); for ( ; i != e; ++i ) { const Map::key_type& key = i->first; const Map::mapped_type& val = i->second; k = swig::from(key); v = swig::from(val); rb_yield_values(2, k, v); } return self; } %newobject select; Map* select() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); Map* r = new Map; Map::iterator i = $self->begin(); Map::iterator e = $self->end(); for ( ; i != e; ++i ) { VALUE k = swig::from(i->first); VALUE v = swig::from(i->second); if ( RTEST( rb_yield_values(2, k, v) ) ) $self->insert(r->end(), *i); } return r; } %typemap(in) (int argc, VALUE* argv) { $1 = argc; $2 = argv; } VALUE values_at(int argc, VALUE* argv, ...) { VALUE r = rb_ary_new(); ID id = rb_intern("[]"); swig_type_info* type = swig::type_info< Map >(); VALUE me = SWIG_NewPointerObj( $self, type, 0 ); for ( int i = 0; i < argc; ++i ) { VALUE key = argv[i]; VALUE tmp = rb_funcall( me, id, 1, key ); rb_ary_push( r, tmp ); } return r; } Map* each_key() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; Map::iterator i = self->begin(); Map::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->first ); rb_yield(r); } return self; } VALUE values() { Map::size_type size = self->size(); int rubysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); Map::const_iterator i = self->begin(); Map::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->second) ); } return ary; } Map* each_value() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; Map::iterator i = self->begin(); Map::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->second ); rb_yield(r); } return self; } VALUE entries() { Map::size_type size = self->size(); int rubysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); Map::const_iterator i = self->begin(); Map::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from >(*i) ); } return ary; } bool __contains__(const key_type& key) { return self->find(key) != self->end(); } %newobject key_iterator(VALUE *RUBY_SELF); swig::ConstIterator* key_iterator(VALUE *RUBY_SELF) { return swig::make_output_key_iterator($self->begin(), $self->begin(), $self->end(), *RUBY_SELF); } %newobject value_iterator(VALUE *RUBY_SELF); swig::ConstIterator* value_iterator(VALUE *RUBY_SELF) { return swig::make_output_value_iterator($self->begin(), $self->begin(), $self->end(), *RUBY_SELF); } } %enddef %define %swig_map_methods(Map...) %swig_map_common(Map) %extend { VALUE __getitem__(const key_type& key) const { Map::const_iterator i = self->find(key); if ( i != self->end() ) return swig::from( i->second ); else return Qnil; } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { (*self)[key] = x; } VALUE inspect() { Map::const_iterator i = $self->begin(); Map::const_iterator e = $self->end(); const char *type_name = swig::type_name< Map >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " {" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< Map::key_type >( i->first ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "=>" ); tmp = swig::from< Map::mapped_type >( i->second ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "}" ); return str; } VALUE to_a() { Map::const_iterator i = $self->begin(); Map::const_iterator e = $self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair >( *i ); rb_ary_push( ary, tmp ); } return ary; } VALUE to_s() { Map::iterator i = $self->begin(); Map::iterator e = $self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } } %enddef %mixin std::map "Enumerable"; %rename("delete") std::map::__delete__; %rename("reject!") std::map::reject_bang; %rename("map!") std::map::map_bang; %rename("empty?") std::map::empty; %rename("include?" ) std::map::__contains__ const; %rename("has_key?" ) std::map::has_key const; %alias std::map::push "<<"; %include swig-4.0.2/Lib/ruby/cstring.i0000644000175000017500000000004013667507523015666 0ustar williamwilliam%include swig-4.0.2/Lib/ruby/rubyfragments.swg0000644000175000017500000000105013667507523017457 0ustar williamwilliam/* Create a file with this name, 'rubyfragments.swg', in your working directory and add all the %fragments you want to take precedence over the ones defined by default by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(VALUE obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-4.0.2/Lib/ruby/factory.i0000644000175000017500000000004013667507523015664 0ustar williamwilliam%include swig-4.0.2/Lib/ruby/boost_shared_ptr.i0000644000175000017500000005167213667507523017577 0ustar williamwilliam%include // Set SHARED_PTR_DISOWN to $disown if required, for example // #define SHARED_PTR_DISOWN $disown #if !defined(SHARED_PTR_DISOWN) #define SHARED_PTR_DISOWN 0 #endif // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE %{(void)arg1; delete reinterpret_cast< SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > * >(self);%} // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; swig_ruby_owntype newmem = {0, 0}; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) CONST TYPE (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE (void *swig_argp, int swig_res = 0) { swig_ruby_owntype newmem = {0, 0}; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (!swig_argp) { %dirout_nullref("$type"); } else { $result = *(%reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } // plain pointer // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; swig_ruby_owntype newmem = {0, 0}; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE * %{ #error "directorout typemap for plain pointer not implemented" %} // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; swig_ruby_owntype newmem = {0, 0}; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE & %{ #error "directorout typemap for plain reference not implemented" %} // plain pointer by reference // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") TYPE *CONST& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) TYPE *CONST& %{ #error "directorout typemap for plain pointer by reference not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { swig_ruby_owntype newmem = {0, 0}; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *swig_argp, int swig_res = 0) { swig_ruby_owntype newmem = {0, 0}; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (swig_argp) { $result = *(%reinterpret_cast(swig_argp, $<ype)); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, $<ype); } } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "directorout typemap for shared_ptr ref not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "directorout typemap for pointer to shared_ptr not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "directorout typemap for pointer ref to shared_ptr not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *", noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.2/Lib/python/0000755000175000017500000000000013667507523014411 5ustar williamwilliamswig-4.0.2/Lib/python/std_wiostream.i0000644000175000017500000000024613667507523017451 0ustar williamwilliamnamespace std { %callback(1) wendl; %callback(1) wends; %callback(1) wflush; } %include %include %include swig-4.0.2/Lib/python/std_complex.i0000644000175000017500000000114013667507523017100 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} namespace std { %naturalvar complex; template class complex; %template() complex; %template() complex; } /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-4.0.2/Lib/python/std_deque.i0000644000175000017500000000124513667507523016542 0ustar williamwilliam/* Deques */ %fragment("StdDequeTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(PyObject *obj, std::deque **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static PyObject *from(const std::deque& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_deque_methods(Type...) %swig_sequence_methods(Type) #define %swig_deque_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/python/pythreads.swg0000644000175000017500000000531313667507523017140 0ustar williamwilliam#if defined(SWIG_PYTHON_NO_THREADS) # if defined(SWIG_PYTHON_THREADS) # undef SWIG_PYTHON_THREADS # endif #endif #if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ # if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) # define SWIG_PYTHON_USE_GIL # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ # ifndef SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() # endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { bool status; PyGILState_STATE state; public: void end() { if (status) { PyGILState_Release(state); status = false;} } SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} ~SWIG_Python_Thread_Block() { end(); } }; class SWIG_Python_Thread_Allow { bool status; PyThreadState *save; public: void end() { if (status) { PyEval_RestoreThread(save); status = false; }} SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} ~SWIG_Python_Thread_Allow() { end(); } }; # define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block # define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() # define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow # define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() # else /* C code */ # define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() # define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() # define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) # endif # else /* Old thread way, not implemented, user must provide it */ # if !defined(SWIG_PYTHON_INITIALIZE_THREADS) # define SWIG_PYTHON_INITIALIZE_THREADS # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_END_BLOCK) # define SWIG_PYTHON_THREAD_END_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # endif # if !defined(SWIG_PYTHON_THREAD_END_ALLOW) # define SWIG_PYTHON_THREAD_END_ALLOW # endif # endif #else /* No thread support */ # define SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # define SWIG_PYTHON_THREAD_END_BLOCK # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # define SWIG_PYTHON_THREAD_END_ALLOW #endif swig-4.0.2/Lib/python/std_multiset.i0000644000175000017500000000207513667507523017307 0ustar williamwilliam/* Multisets */ %include %fragment("StdMultisetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::multiset* seq) { // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(PyObject *obj, std::multiset **m) { return traits_asptr_stdseq >::asptr(obj, m); } }; template struct traits_from > { static PyObject *from(const std::multiset& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_multiset_methods(Set...) %swig_set_methods(Set) %include swig-4.0.2/Lib/python/pyinit.swg0000644000175000017500000003715413667507523016461 0ustar williamwilliam/* ------------------------------------------------------------ * The start of the Python initialization function * ------------------------------------------------------------ */ %insert(init) "swiginit.swg" #if defined(SWIGPYTHON_BUILTIN) %fragment(""); // For offsetof #endif %insert(runtime) %{ #ifdef __cplusplus extern "C" { #endif /* Method creation and docstring support functions */ SWIGINTERN PyMethodDef *SWIG_PythonGetProxyDoc(const char *name); SWIGINTERN PyObject *SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func); SWIGINTERN PyObject *SWIG_PyStaticMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func); #ifdef __cplusplus } #endif %} %init %{ #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(void); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; SWIGINTERN PyObject * swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_InternFromString(""); #else return PyString_FromString(""); #endif } SWIGINTERN PyObject * swig_varlink_str(swig_varlinkobject *v) { #if PY_VERSION_HEX >= 0x03000000 PyObject *str = PyUnicode_InternFromString("("); PyObject *tail; PyObject *joined; swig_globalvar *var; for (var = v->vars; var; var=var->next) { tail = PyUnicode_FromString(var->name); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; if (var->next) { tail = PyUnicode_InternFromString(", "); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; } } tail = PyUnicode_InternFromString(")"); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; #else PyObject *str = PyString_FromString("("); swig_globalvar *var; for (var = v->vars; var; var=var->next) { PyString_ConcatAndDel(&str,PyString_FromString(var->name)); if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); } PyString_ConcatAndDel(&str,PyString_FromString(")")); #endif return str; } SWIGINTERN void swig_varlink_dealloc(swig_varlinkobject *v) { swig_globalvar *var = v->vars; while (var) { swig_globalvar *n = var->next; free(var->name); free(var); var = n; } } SWIGINTERN PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { PyObject *res = NULL; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->get_attr)(); break; } var = var->next; } if (res == NULL && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { int res = 1; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->set_attr)(p); break; } var = var->next; } if (res == 1 && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN PyTypeObject* swig_varlink_type(void) { static char varlink__doc__[] = "Swig var link object"; static PyTypeObject varlink_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif "swigvarlink", /* tp_name */ sizeof(swig_varlinkobject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) swig_varlink_dealloc, /* tp_dealloc */ 0, /* tp_print */ (getattrfunc) swig_varlink_getattr, /* tp_getattr */ (setattrfunc) swig_varlink_setattr, /* tp_setattr */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ (reprfunc) swig_varlink_str, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ varlink__doc__, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ 0, /* tp_del */ 0, /* tp_version_tag */ #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #if PY_VERSION_HEX >= 0x03080000 0, /* tp_vectorcall */ #endif #if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) 0, /* tp_print */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ 0, /* tp_prev */ 0 /* tp_next */ #endif }; varlink_type = tmp; type_init = 1; if (PyType_Ready(&varlink_type) < 0) return NULL; } return &varlink_type; } /* Create a variable linking object for use later */ SWIGINTERN PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); if (result) { result->vars = 0; } return ((PyObject*) result); } SWIGINTERN void SWIG_Python_addvarlink(PyObject *p, const char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v = (swig_varlinkobject *) p; swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); if (gv) { size_t size = strlen(name)+1; gv->name = (char *)malloc(size); if (gv->name) { memcpy(gv->name, name, size); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; } } v->vars = gv; } SWIGINTERN PyObject * SWIG_globals(void) { static PyObject *globals = 0; if (!globals) { globals = SWIG_newvarlink(); } return globals; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ SWIGINTERN void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; ++i) { switch(constants[i].type) { case SWIG_PY_POINTER: obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d, constants[i].name, obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ SWIGINTERN void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { const char *c = methods[i].ml_doc; if (!c) continue; c = strstr(c, "swig_ptr: "); if (c) { int j; swig_const_info *ci = 0; const char *name = c + 10; for (j = 0; const_table[j].type; ++j) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; if (ptr) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); if (ndoc) { char *buff = ndoc; memcpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; memcpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } } } /* ----------------------------------------------------------------------------- * Method creation and docstring support functions * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Function to find the method definition with the correct docstring for the * proxy module as opposed to the low-level API * ----------------------------------------------------------------------------- */ SWIGINTERN PyMethodDef *SWIG_PythonGetProxyDoc(const char *name) { /* Find the function in the modified method table */ size_t offset = 0; int found = 0; while (SwigMethods_proxydocs[offset].ml_meth != NULL) { if (strcmp(SwigMethods_proxydocs[offset].ml_name, name) == 0) { found = 1; break; } offset++; } /* Use the copy with the modified docstring if available */ return found ? &SwigMethods_proxydocs[offset] : NULL; } /* ----------------------------------------------------------------------------- * Wrapper of PyInstanceMethod_New() used in Python 3 * It is exported to the generated module, used for -fastproxy * ----------------------------------------------------------------------------- */ SWIGINTERN PyObject *SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) { if (PyCFunction_Check(func)) { PyCFunctionObject *funcobj = (PyCFunctionObject *)func; PyMethodDef *ml = SWIG_PythonGetProxyDoc(funcobj->m_ml->ml_name); if (ml) func = PyCFunction_NewEx(ml, funcobj->m_self, funcobj->m_module); } #if PY_VERSION_HEX >= 0x03000000 return PyInstanceMethod_New(func); #else return PyMethod_New(func, NULL, NULL); #endif } /* ----------------------------------------------------------------------------- * Wrapper of PyStaticMethod_New() * It is exported to the generated module, used for -fastproxy * ----------------------------------------------------------------------------- */ SWIGINTERN PyObject *SWIG_PyStaticMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) { if (PyCFunction_Check(func)) { PyCFunctionObject *funcobj = (PyCFunctionObject *)func; PyMethodDef *ml = SWIG_PythonGetProxyDoc(funcobj->m_ml->ml_name); if (ml) func = PyCFunction_NewEx(ml, funcobj->m_self, funcobj->m_module); } return PyStaticMethod_New(func); } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" #endif SWIGEXPORT #if PY_VERSION_HEX >= 0x03000000 PyObject* #else void #endif SWIG_init(void) { PyObject *m, *d, *md, *globals; #if PY_VERSION_HEX >= 0x03000000 static struct PyModuleDef SWIG_module = { PyModuleDef_HEAD_INIT, SWIG_name, NULL, -1, SwigMethods, NULL, NULL, NULL, NULL }; #endif #if defined(SWIGPYTHON_BUILTIN) static SwigPyClientData SwigPyObject_clientdata = {0, 0, 0, 0, 0, 0, 0}; static PyGetSetDef this_getset_def = { (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL }; static SwigPyGetSet thisown_getset_closure = { SwigPyObject_own, SwigPyObject_own }; static PyGetSetDef thisown_getset_def = { (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure }; PyTypeObject *builtin_pytype; int builtin_base_count; swig_type_info *builtin_basetype; PyObject *tuple; PyGetSetDescrObject *static_getset; PyTypeObject *metatype; PyTypeObject *swigpyobject; SwigPyClientData *cd; PyObject *public_interface, *public_symbol; PyObject *this_descr; PyObject *thisown_descr; PyObject *self = 0; int i; (void)builtin_pytype; (void)builtin_base_count; (void)builtin_basetype; (void)tuple; (void)static_getset; (void)self; /* Metaclass is used to implement static member variables */ metatype = SwigPyObjectType(); assert(metatype); #endif (void)globals; /* Create singletons now to avoid potential deadlocks with multi-threaded usage after module initialization */ SWIG_This(); SWIG_Python_TypeCache(); SwigPyPacked_type(); #ifndef SWIGPYTHON_BUILTIN SwigPyObject_type(); #endif /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); #if PY_VERSION_HEX >= 0x03000000 m = PyModule_Create(&SWIG_module); #else m = Py_InitModule(SWIG_name, SwigMethods); #endif md = d = PyModule_GetDict(m); (void)md; SWIG_InitializeModule(0); #ifdef SWIGPYTHON_BUILTIN swigpyobject = SwigPyObject_TypeOnce(); SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject"); assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; if (!cd) { SwigPyObject_stype->clientdata = &SwigPyObject_clientdata; SwigPyObject_clientdata.pytype = swigpyobject; } else if (swigpyobject->tp_basicsize != cd->pytype->tp_basicsize) { PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules."); # if PY_VERSION_HEX >= 0x03000000 return NULL; # else return; # endif } /* All objects have a 'this' attribute */ this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def); (void)this_descr; /* All objects have a 'thisown' attribute */ thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def); (void)thisown_descr; public_interface = PyList_New(0); public_symbol = 0; (void)public_symbol; PyDict_SetItemString(md, "__all__", public_interface); Py_DECREF(public_interface); for (i = 0; SwigMethods[i].ml_name != NULL; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name); for (i = 0; swig_const_table[i].name != 0; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name); #endif SWIG_InstallConstants(d,swig_const_table); %} swig-4.0.2/Lib/python/director.swg0000644000175000017500000002226113667507523016751 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Python proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #ifndef SWIG_DIRECTOR_PYTHON_HEADER_ #define SWIG_DIRECTOR_PYTHON_HEADER_ #include #include #include #include #include /* Use -DSWIG_PYTHON_DIRECTOR_NO_VTABLE if you don't want to generate a 'virtual table', and avoid multiple GetAttr calls to retrieve the python methods. */ #ifndef SWIG_PYTHON_DIRECTOR_NO_VTABLE #ifndef SWIG_PYTHON_DIRECTOR_VTABLE #define SWIG_PYTHON_DIRECTOR_VTABLE #endif #endif /* Use -DSWIG_DIRECTOR_NO_UEH if you prefer to avoid the use of the Undefined Exception Handler provided by swig. */ #ifndef SWIG_DIRECTOR_NO_UEH #ifndef SWIG_DIRECTOR_UEH #define SWIG_DIRECTOR_UEH #endif #endif /* Use -DSWIG_DIRECTOR_NORTTI if you prefer to avoid the use of the native C++ RTTI and dynamic_cast<>. But be aware that directors could stop working when using this option. */ #ifdef SWIG_DIRECTOR_NORTTI /* When we don't use the native C++ RTTI, we implement a minimal one only for Directors. */ # ifndef SWIG_DIRECTOR_RTDIR # define SWIG_DIRECTOR_RTDIR namespace Swig { class Director; SWIGINTERN std::map& get_rtdir_map() { static std::map rtdir_map; return rtdir_map; } SWIGINTERNINLINE void set_rtdir(void *vptr, Director *rtdir) { get_rtdir_map()[vptr] = rtdir; } SWIGINTERNINLINE Director *get_rtdir(void *vptr) { std::map::const_iterator pos = get_rtdir_map().find(vptr); Director *rtdir = (pos != get_rtdir_map().end()) ? pos->second : 0; return rtdir; } } # endif /* SWIG_DIRECTOR_RTDIR */ # define SWIG_DIRECTOR_CAST(ARG) Swig::get_rtdir(static_cast(ARG)) # define SWIG_DIRECTOR_RGTR(ARG1, ARG2) Swig::set_rtdir(static_cast(ARG1), ARG2) #else # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) # define SWIG_DIRECTOR_RGTR(ARG1, ARG2) #endif /* SWIG_DIRECTOR_NORTTI */ extern "C" { struct swig_type_info; } namespace Swig { /* memory handler */ struct GCItem { virtual ~GCItem() {} virtual int get_own() const { return 0; } }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem * operator->() const { return _item; } private: GCItem *_item; }; struct GCItem_Object : GCItem { GCItem_Object(int own) : _own(own) { } virtual ~GCItem_Object() { } int get_own() const { return _own; } private: int _own; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; template struct GCArray_T : GCItem { GCArray_T(Type *ptr) : _ptr(ptr) { } virtual ~GCArray_T() { delete[] _ptr; } private: Type *_ptr; }; /* base class for director exceptions */ class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(PyObject *error, const char *hdr ="", const char *msg ="") : swig_msg(hdr) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (msg[0]) { swig_msg += " "; swig_msg += msg; } if (!PyErr_Occurred()) { PyErr_SetString(error, what()); } SWIG_PYTHON_THREAD_END_BLOCK; } virtual ~DirectorException() throw() { } /* Deprecated, use what() instead */ const char *getMessage() const { return what(); } const char *what() const throw() { return swig_msg.c_str(); } static void raise(PyObject *error, const char *msg) { throw DirectorException(error, msg); } static void raise(const char *msg) { raise(PyExc_RuntimeError, msg); } }; /* type mismatch in the return value from a python method call */ class DirectorTypeMismatchException : public DirectorException { public: DirectorTypeMismatchException(PyObject *error, const char *msg="") : DirectorException(error, "SWIG director type mismatch", msg) { } DirectorTypeMismatchException(const char *msg="") : DirectorException(PyExc_TypeError, "SWIG director type mismatch", msg) { } static void raise(PyObject *error, const char *msg) { throw DirectorTypeMismatchException(error, msg); } static void raise(const char *msg) { throw DirectorTypeMismatchException(msg); } }; /* any python exception that occurs during a director method call */ class DirectorMethodException : public DirectorException { public: DirectorMethodException(const char *msg = "") : DirectorException(PyExc_RuntimeError, "SWIG director method error.", msg) { } static void raise(const char *msg) { throw DirectorMethodException(msg); } }; /* attempt to call a pure virtual method via a director method */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg = "") : DirectorException(PyExc_RuntimeError, "SWIG director pure virtual method called", msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; #if defined(SWIG_PYTHON_THREADS) /* __THREAD__ is the old macro to activate some thread support */ # if !defined(__THREAD__) # define __THREAD__ 1 # endif #endif #ifdef __THREAD__ # include "pythread.h" class Guard { PyThread_type_lock &mutex_; public: Guard(PyThread_type_lock & mutex) : mutex_(mutex) { PyThread_acquire_lock(mutex_, WAIT_LOCK); } ~Guard() { PyThread_release_lock(mutex_); } }; # define SWIG_GUARD(mutex) Guard _guard(mutex) #else # define SWIG_GUARD(mutex) #endif /* director base class */ class Director { private: /* pointer to the wrapped python object */ PyObject *swig_self; /* flag indicating whether the object is owned by python or c++ */ mutable bool swig_disown_flag; /* decrement the reference count of the wrapped python object */ void swig_decref() const { if (swig_disown_flag) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_DECREF(swig_self); SWIG_PYTHON_THREAD_END_BLOCK; } } public: /* wrap a python object. */ Director(PyObject *self) : swig_self(self), swig_disown_flag(false) { } /* discard our reference at destruction */ virtual ~Director() { swig_decref(); } /* return a pointer to the wrapped python object */ PyObject *swig_get_self() const { return swig_self; } /* acquire ownership of the wrapped python object (the sense of "disown" is from python) */ void swig_disown() const { if (!swig_disown_flag) { swig_disown_flag=true; swig_incref(); } } /* increase the reference count of the wrapped python object */ void swig_incref() const { if (swig_disown_flag) { Py_INCREF(swig_self); } } /* methods to implement pseudo protected director members */ virtual bool swig_get_inner(const char * /* swig_protected_method_name */) const { return true; } virtual void swig_set_inner(const char * /* swig_protected_method_name */, bool /* swig_val */) const { } /* ownership management */ private: typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; #ifdef __THREAD__ static PyThread_type_lock swig_mutex_own; #endif public: template void swig_acquire_ownership_array(Type *vptr) const { if (vptr) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCArray_T(vptr); } } template void swig_acquire_ownership(Type *vptr) const { if (vptr) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCItem_T(vptr); } } void swig_acquire_ownership_obj(void *vptr, int own) const { if (vptr && own) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCItem_Object(own); } } int swig_release_ownership(void *vptr) const { int own = 0; if (vptr) { SWIG_GUARD(swig_mutex_own); swig_ownership_map::iterator iter = swig_owner.find(vptr); if (iter != swig_owner.end()) { own = iter->second->get_own(); swig_owner.erase(iter); } } return own; } template static PyObject *swig_pyobj_disown(PyObject *pyobj, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)pyobj; sobj->own = 0; Director *d = SWIG_DIRECTOR_CAST(reinterpret_cast(sobj->ptr)); if (d) d->swig_disown(); return PyWeakref_NewProxy(pyobj, NULL); } }; #ifdef __THREAD__ PyThread_type_lock Director::swig_mutex_own = PyThread_allocate_lock(); #endif } #endif swig-4.0.2/Lib/python/cpointer.i0000644000175000017500000000004113667507523016401 0ustar williamwilliam%include swig-4.0.2/Lib/python/wchar.i0000644000175000017500000000027213667507523015670 0ustar williamwilliam#ifdef __cplusplus %{ #include %} #else %{ #include %} #endif %types(wchar_t *); %include /* Enable swig wchar support. */ #define SWIG_WCHAR swig-4.0.2/Lib/python/std_shared_ptr.i0000644000175000017500000000010413667507523017563 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.2/Lib/python/std_multimap.i0000644000175000017500000000577113667507523017277 0ustar williamwilliam/* Multimaps */ %include %fragment("StdMultimapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::multimap *multimap) { typedef typename std::multimap::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { multimap->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::multimap multimap_type; static int asptr(PyObject *obj, std::multimap **val) { int res = SWIG_ERROR; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); %#if PY_VERSION_HEX >= 0x03000000 /* In Python 3.x the ".items()" method returns a dict_items object */ items = PySequence_Fast(items, ".items() didn't return a sequence!"); %#endif res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { multimap_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::multimap multimap_type; typedef typename multimap_type::const_iterator const_iterator; typedef typename multimap_type::size_type size_type; static PyObject *from(const multimap_type& multimap) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new multimap_type(multimap), desc, SWIG_POINTER_OWN); } else { size_type size = multimap.size(); Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "multimap size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= multimap.begin(); i!= multimap.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } return obj; } } }; } } %define %swig_multimap_methods(Type...) %swig_map_common(Type); #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_ass_subscript", functype="objobjargproc") __setitem__; #endif %extend { // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(const key_type& key) { self->erase(key); } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { self->insert(Type::value_type(key,x)); } } %enddef %include swig-4.0.2/Lib/python/std_unordered_multiset.i0000644000175000017500000000343713667507523021361 0ustar williamwilliam/* Unordered Multisets */ %include %fragment("StdUnorderedMultisetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::unordered_multiset* seq) { // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_reserve > { static void reserve(std::unordered_multiset &seq, typename std::unordered_multiset::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { static int asptr(PyObject *obj, std::unordered_multiset **m) { return traits_asptr_stdseq >::asptr(obj, m); } }; template struct traits_from > { static PyObject *from(const std::unordered_multiset& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_unordered_multiset_methods(Set...) %swig_unordered_set_methods(Set) %include swig-4.0.2/Lib/python/std_vector.i0000644000175000017500000000156613667507523016747 0ustar williamwilliam/* Vectors */ %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_reserve > { static void reserve(std::vector &seq, typename std::vector::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { static int asptr(PyObject *obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static PyObject *from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/python/Makefile.in0000644000175000017500000000656013667507523016465 0ustar williamwilliam# --------------------------------------------------------------- # SWIG Python Makefile # # This file can be used to build various Python extensions with SWIG. # By default this file is set up for dynamic loading, but it can # be easily customized for static extensions by modifying various # portions of the file. # # SRCS = C source files # CXXSRCS = C++ source files # OBJCSRCS = Objective-C source files # OBJS = Additional .o files (compiled previously) # INTERFACE = SWIG interface file # TARGET = Name of target module or executable # # Many portions of this file were created by the SWIG configure # script and should already reflect your machine. #---------------------------------------------------------------- SRCS = CXXSRCS = OBJCSRCS = OBJS = INTERFACE = WRAPFILE = $(INTERFACE:.i=_wrap.c) WRAPOBJ = $(INTERFACE:.i=_wrap.o) TARGET = module@SO@ # Use this kind of target for dynamic loading #TARGET = mypython # Use this target for static linking prefix = @prefix@ exec_prefix = @exec_prefix@ CC = @CC@ CXX = @CXX@ OBJC = @CC@ -Wno-import # -Wno-import needed for gcc CFLAGS = INCLUDES = LIBS = # SWIG Options # SWIG = location of the SWIG executable # SWIGOPT = SWIG compiler options # SWIGCC = Compiler used to compile the wrapper file SWIG = $(exec_prefix)/bin/swig SWIGOPT = -python SWIGCC = $(CC) # SWIG Library files. Uncomment if rebuilding the Python interpreter #SWIGLIBS = -lembed.i # Rules for creating .o files from source. COBJS = $(SRCS:.c=.o) CXXOBJS = $(CXXSRCS:.cxx=.o) OBJCOBJS = $(OBJCSRCS:.m=.o) ALLOBJS = $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(OBJS) # Command that will be used to build the final extension. BUILD = $(SWIGCC) # Uncomment the following if you are using dynamic loading CCSHARED = @CCSHARED@ BUILD = @LDSHARED@ # Uncomment the following if you are using dynamic loading with C++ and # need to provide additional link libraries (this is not always required). #DLL_LIBS = -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.5.1/2.7.2 \ -L/usr/local/lib -lg++ -lstdc++ -lgcc # Python installation PY_INCLUDE = -DHAVE_CONFIG_H @PYINCLUDE@ PY_LIB = @PYLIB@ # Build libraries (needed for static builds) LIBM = @LIBM@ LIBC = @LIBC@ SYSLIBS = $(LIBM) $(LIBC) @LIBS@ # Build options BUILD_LIBS = $(LIBS) # Dynamic loading # Compilation rules for non-SWIG components .SUFFIXES: .c .cxx .m .c.o: $(CC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< .cxx.o: $(CXX) $(CCSHARED) $(CXXFLAGS) $(INCLUDES) -c $< .m.o: $(OBJC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< # ---------------------------------------------------------------------- # Rules for building the extension # ---------------------------------------------------------------------- all: $(TARGET) # Convert the wrapper file into an object file $(WRAPOBJ) : $(WRAPFILE) $(SWIGCC) -c $(CCSHARED) $(CFLAGS) $(WRAPFILE) $(INCLUDES) $(PY_INCLUDE) $(WRAPFILE) : $(INTERFACE) $(SWIG) $(SWIGOPT) -o $(WRAPFILE) $(SWIGLIBS) $(INTERFACE) $(TARGET): $(WRAPOBJ) $(ALLOBJS) $(BUILD) $(WRAPOBJ) $(ALLOBJS) $(BUILD_LIBS) -o $(TARGET) clean: rm -f $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(WRAPOBJ) $(WRAPFILE) $(TARGET) swig-4.0.2/Lib/python/pyruntime.swg0000644000175000017500000000175413667507523017176 0ustar williamwilliam%insert(runtime) %{ #if defined(__GNUC__) && defined(_WIN32) && !defined(SWIG_PYTHON_NO_HYPOT_WORKAROUND) /* Workaround for '::hypot' has not been declared', see https://bugs.python.org/issue11566 */ # include #endif #if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) /* Use debug wrappers with the Python release dll */ # undef _DEBUG # include # define _DEBUG 1 #else # include #endif %} %insert(runtime) "swigrun.swg"; /* SWIG API */ %insert(runtime) "swigerrors.swg"; /* SWIG errors */ %insert(runtime) "pyhead.swg"; /* Python includes and fixes */ %insert(runtime) "pyerrors.swg"; /* Python errors */ %insert(runtime) "pythreads.swg"; /* Python thread code */ %insert(runtime) "pyapi.swg"; /* Python API */ %insert(runtime) "pyrun.swg"; /* Python run-time code */ #if defined(SWIGPYTHON_BUILTIN) %insert(runtime) "builtin.swg"; /* Specialization for classes with single inheritance */ #endif swig-4.0.2/Lib/python/std_alloc.i0000644000175000017500000000003313667507523016523 0ustar williamwilliam%include swig-4.0.2/Lib/python/pyiterators.swg0000644000175000017500000003047413667507523017530 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pyiterators.swg * * Implement a python 'output' iterator for Python 2.2 or higher. * * Users can derive form the SwigPyIterator to implement their * own iterators. As an example (real one since we use it for STL/STD * containers), the template SwigPyIterator_T does the * implementation for generic C++ iterators. * ----------------------------------------------------------------------------- */ %include %fragment("SwigPyIterator","header",fragment="") { namespace swig { struct stop_iteration { }; struct SwigPyIterator { private: SwigPtr_PyObject _seq; protected: SwigPyIterator(PyObject *seq) : _seq(seq) { } public: virtual ~SwigPyIterator() {} // Access iterator method, required by Python virtual PyObject *value() const = 0; // Forward iterator method, required by Python virtual SwigPyIterator *incr(size_t n = 1) = 0; // Backward iterator method, very common in C++, but not required in Python virtual SwigPyIterator *decr(size_t /*n*/ = 1) { throw stop_iteration(); } // Random access iterator methods, but not required in Python virtual ptrdiff_t distance(const SwigPyIterator &/*x*/) const { throw std::invalid_argument("operation not supported"); } virtual bool equal (const SwigPyIterator &/*x*/) const { throw std::invalid_argument("operation not supported"); } // C++ common/needed methods virtual SwigPyIterator *copy() const = 0; PyObject *next() { SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads PyObject *obj = value(); incr(); SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads return obj; } /* Make an alias for Python 3.x */ PyObject *__next__() { return next(); } PyObject *previous() { SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads decr(); PyObject *obj = value(); SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads return obj; } SwigPyIterator *advance(ptrdiff_t n) { return (n > 0) ? incr(n) : decr(-n); } bool operator == (const SwigPyIterator& x) const { return equal(x); } bool operator != (const SwigPyIterator& x) const { return ! operator==(x); } SwigPyIterator& operator += (ptrdiff_t n) { return *advance(n); } SwigPyIterator& operator -= (ptrdiff_t n) { return *advance(-n); } SwigPyIterator* operator + (ptrdiff_t n) const { return copy()->advance(n); } SwigPyIterator* operator - (ptrdiff_t n) const { return copy()->advance(-n); } ptrdiff_t operator - (const SwigPyIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::SwigPyIterator *"); init = 1; } return desc; } }; %#if defined(SWIGPYTHON_BUILTIN) inline PyObject* make_output_iterator_builtin (PyObject *pyself) { Py_INCREF(pyself); return pyself; } %#endif } } %fragment("SwigPyIterator_T","header",fragment="",fragment="SwigPyIterator",fragment="StdTraits",fragment="StdIteratorTraits") { namespace swig { template class SwigPyIterator_T : public SwigPyIterator { public: typedef OutIterator out_iterator; typedef typename std::iterator_traits::value_type value_type; typedef SwigPyIterator_T self_type; SwigPyIterator_T(out_iterator curr, PyObject *seq) : SwigPyIterator(seq), current(curr) { } const out_iterator& get_current() const { return current; } bool equal (const SwigPyIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } ptrdiff_t distance(const SwigPyIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } protected: out_iterator current; }; template struct from_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; template::value_type, typename FromOper = from_oper > class SwigPyForwardIteratorOpen_T : public SwigPyIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyForwardIteratorOpen_T self_type; SwigPyForwardIteratorOpen_T(out_iterator curr, PyObject *seq) : SwigPyIterator_T(curr, seq) { } PyObject *value() const { return from(static_cast(*(base::current))); } SwigPyIterator *copy() const { return new self_type(*this); } SwigPyIterator *incr(size_t n = 1) { while (n--) { ++base::current; } return this; } }; template::value_type, typename FromOper = from_oper > class SwigPyIteratorOpen_T : public SwigPyForwardIteratorOpen_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyIteratorOpen_T self_type; SwigPyIteratorOpen_T(out_iterator curr, PyObject *seq) : SwigPyForwardIteratorOpen_T(curr, seq) { } SwigPyIterator *decr(size_t n = 1) { while (n--) { --base::current; } return this; } }; template::value_type, typename FromOper = from_oper > class SwigPyForwardIteratorClosed_T : public SwigPyIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyForwardIteratorClosed_T self_type; SwigPyForwardIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq) : SwigPyIterator_T(curr, seq), begin(first), end(last) { } PyObject *value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } SwigPyIterator *copy() const { return new self_type(*this); } SwigPyIterator *incr(size_t n = 1) { while (n--) { if (base::current == end) { throw stop_iteration(); } else { ++base::current; } } return this; } protected: out_iterator begin; out_iterator end; }; template::value_type, typename FromOper = from_oper > class SwigPyIteratorClosed_T : public SwigPyForwardIteratorClosed_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyForwardIteratorClosed_T base0; typedef SwigPyIteratorClosed_T self_type; SwigPyIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq) : SwigPyForwardIteratorClosed_T(curr, first, last, seq) { } SwigPyIterator *decr(size_t n = 1) { while (n--) { if (base::current == base0::begin) { throw stop_iteration(); } else { --base::current; } } return this; } }; template inline SwigPyIterator* make_output_forward_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0) { return new SwigPyForwardIteratorClosed_T(current, begin, end, seq); } template inline SwigPyIterator* make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0) { return new SwigPyIteratorClosed_T(current, begin, end, seq); } template inline SwigPyIterator* make_output_forward_iterator(const OutIter& current, PyObject *seq = 0) { return new SwigPyForwardIteratorOpen_T(current, seq); } template inline SwigPyIterator* make_output_iterator(const OutIter& current, PyObject *seq = 0) { return new SwigPyIteratorOpen_T(current, seq); } } } %fragment("SwigPyIterator"); namespace swig { /* Throw a StopIteration exception */ %ignore stop_iteration; struct stop_iteration {}; %typemap(throws) stop_iteration { (void)$1; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } /* Mark methods that return new objects */ %newobject SwigPyIterator::copy; %newobject SwigPyIterator::operator + (ptrdiff_t n) const; %newobject SwigPyIterator::operator - (ptrdiff_t n) const; %nodirector SwigPyIterator; #if defined(SWIGPYTHON_BUILTIN) %feature("python:tp_iter") SwigPyIterator "&swig::make_output_iterator_builtin"; %feature("python:slot", "tp_iternext", functype="iternextfunc") SwigPyIterator::__next__; #else %extend SwigPyIterator { %pythoncode %{def __iter__(self): return self%} } #endif %catches(swig::stop_iteration) SwigPyIterator::value() const; %catches(swig::stop_iteration) SwigPyIterator::incr(size_t n = 1); %catches(swig::stop_iteration) SwigPyIterator::decr(size_t n = 1); %catches(std::invalid_argument) SwigPyIterator::distance(const SwigPyIterator &x) const; %catches(std::invalid_argument) SwigPyIterator::equal (const SwigPyIterator &x) const; %catches(swig::stop_iteration) SwigPyIterator::__next__(); %catches(swig::stop_iteration) SwigPyIterator::next(); %catches(swig::stop_iteration) SwigPyIterator::previous(); %catches(swig::stop_iteration) SwigPyIterator::advance(ptrdiff_t n); %catches(swig::stop_iteration) SwigPyIterator::operator += (ptrdiff_t n); %catches(swig::stop_iteration) SwigPyIterator::operator -= (ptrdiff_t n); %catches(swig::stop_iteration) SwigPyIterator::operator + (ptrdiff_t n) const; %catches(swig::stop_iteration) SwigPyIterator::operator - (ptrdiff_t n) const; struct SwigPyIterator { protected: SwigPyIterator(PyObject *seq); public: virtual ~SwigPyIterator(); // Access iterator method, required by Python virtual PyObject *value() const = 0; // Forward iterator method, required by Python virtual SwigPyIterator *incr(size_t n = 1) = 0; // Backward iterator method, very common in C++, but not required in Python virtual SwigPyIterator *decr(size_t n = 1); // Random access iterator methods, but not required in Python virtual ptrdiff_t distance(const SwigPyIterator &x) const; virtual bool equal (const SwigPyIterator &x) const; // C++ common/needed methods virtual SwigPyIterator *copy() const = 0; PyObject *next(); PyObject *__next__(); PyObject *previous(); SwigPyIterator *advance(ptrdiff_t n); bool operator == (const SwigPyIterator& x) const; bool operator != (const SwigPyIterator& x) const; SwigPyIterator& operator += (ptrdiff_t n); SwigPyIterator& operator -= (ptrdiff_t n); SwigPyIterator* operator + (ptrdiff_t n) const; SwigPyIterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const SwigPyIterator& x) const; }; } swig-4.0.2/Lib/python/cwstring.i0000644000175000017500000000007413667507523016424 0ustar williamwilliam%include %include swig-4.0.2/Lib/python/std_set.i0000644000175000017500000000322313667507523016230 0ustar williamwilliam/* Sets */ %fragment("StdSetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::set* seq) { // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(PyObject *obj, std::set **s) { return traits_asptr_stdseq >::asptr(obj, s); } }; template struct traits_from > { static PyObject *from(const std::set& vec) { return traits_from_stdseq >::from(vec); } }; } %} %define %swig_set_methods(set...) %swig_sequence_iterator(set); %swig_container_methods(set); #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__; %feature("python:slot", "sq_contains", functype="objobjproc") __contains__; #endif %extend { void append(value_type x) { self->insert(x); } bool __contains__(value_type x) { return self->find(x) != self->end(); } value_type __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void add(value_type x) { self->insert(x); } void discard(value_type x) { self->erase(x); } } %enddef %include swig-4.0.2/Lib/python/defarg.swg0000644000175000017500000000220513667507523016362 0ustar williamwilliam/* This file defines an internal function for processing default arguments with proxy classes. There seems to be no straightforward way to write proxy functions involving default arguments. For example : def foo(arg1,arg2,*args): proxyc.foo(arg1,arg2,args) This fails because args is now a tuple and SWIG doesn't know what to do with it. This file allows a different approach : def foo(arg1,arg2,*args): proxyc.__call_defarg(proxyc.foo,(arg1,arg2,)+args) Basically, we form a new tuple from the object, call this special __call_defarg method and it passes control to the real wrapper function. An ugly hack, but it works. */ SWIGINTERN PyObject *swig_call_defargs(PyObject *self, PyObject *args) { PyObject *func; PyObject *parms; if (!PyArg_ParseTuple(args, "OO", &func, &parms)) return NULL; if (!PyCallable_Check(func)) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_TypeError, "__call_defarg : Need a callable object!"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } return PyEval_CallObject(func,parms); } swig-4.0.2/Lib/python/pytuplehlp.swg0000644000175000017500000000046413667507523017345 0ustar williamwilliam/* Helper function to return output types, now we need to use a list instead of a tuple since all the other types (std::pair,std::vector,std::list,etc) return tuples. */ #warning "Deprecated file: Don't use t_output_helper anymore," #warning "use SWIG_Python_AppendOutput or %append_output instead." swig-4.0.2/Lib/python/std_container.i0000644000175000017500000000007213667507523017416 0ustar williamwilliam%include %include swig-4.0.2/Lib/python/pyrun.swg0000644000175000017500000013470113667507523016316 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * ----------------------------------------------------------------------------- */ #if PY_VERSION_HEX < 0x02070000 /* 2.7.0 */ # error "This version of SWIG only supports Python >= 2.7" #endif #if PY_VERSION_HEX >= 0x03000000 && PY_VERSION_HEX < 0x03020000 # error "This version of SWIG only supports Python 3 >= 3.2" #endif /* Common SWIG API */ /* for raw pointers */ #define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) #ifdef SWIGPYTHON_BUILTIN #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(self, ptr, type, flags) #else #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #endif #define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) #define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) #define swig_owntype int /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(NULL, ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Python_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) #define SWIG_NewClientData(obj) SwigPyClientData_New(obj) #define SWIG_SetErrorObj SWIG_Python_SetErrorObj #define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg #define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) #define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) #define SWIG_fail goto fail /* Runtime API implementation */ /* Error manipulation */ SWIGINTERN void SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetObject(errtype, obj); Py_DECREF(obj); SWIG_PYTHON_THREAD_END_BLOCK; } SWIGINTERN void SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(errtype, msg); SWIG_PYTHON_THREAD_END_BLOCK; } #define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) /* Set a constant value */ #if defined(SWIGPYTHON_BUILTIN) SWIGINTERN void SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) { PyObject *s = PyString_InternFromString(key); PyList_Append(seq, s); Py_DECREF(s); } SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) { PyDict_SetItemString(d, name, obj); Py_DECREF(obj); if (public_interface) SwigPyBuiltin_AddPublicSymbol(public_interface, name); } #else SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { PyDict_SetItemString(d, name, obj); Py_DECREF(obj); } #endif /* Append a value to the result obj */ SWIGINTERN PyObject* SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyList_Check(result)) { PyObject *o2 = result; result = PyList_New(1); PyList_SetItem(result, 0, o2); } PyList_Append(result,obj); Py_DECREF(obj); } return result; } /* Unpack the argument tuple */ SWIGINTERN Py_ssize_t SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) { if (!args) { if (!min && !max) { return 1; } else { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", name, (min == max ? "" : "at least "), (int)min); return 0; } } if (!PyTuple_Check(args)) { if (min <= 1 && max >= 1) { Py_ssize_t i; objs[0] = args; for (i = 1; i < max; ++i) { objs[i] = 0; } return 2; } PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); return 0; } else { Py_ssize_t l = PyTuple_GET_SIZE(args); if (l < min) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at least "), (int)min, (int)l); return 0; } else if (l > max) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at most "), (int)max, (int)l); return 0; } else { Py_ssize_t i; for (i = 0; i < l; ++i) { objs[i] = PyTuple_GET_ITEM(args, i); } for (; l < max; ++l) { objs[l] = 0; } return i + 1; } } } SWIGINTERN int SWIG_Python_CheckNoKeywords(PyObject *kwargs, const char *name) { int no_kwargs = 1; if (kwargs) { assert(PyDict_Check(kwargs)); if (PyDict_Size(kwargs) > 0) { PyErr_Format(PyExc_TypeError, "%s() does not take keyword arguments", name); no_kwargs = 0; } } return no_kwargs; } /* A functor is a function object with one single object argument */ #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); /* Helper for static pointer initialization for both C and C++ code, for example static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); */ #ifdef __cplusplus #define SWIG_STATIC_POINTER(var) var #else #define SWIG_STATIC_POINTER(var) var = 0; if (!var) var #endif /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Flags for new pointer objects */ #define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) #define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) #define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) #define SWIG_BUILTIN_TP_INIT (SWIG_POINTER_OWN << 2) #define SWIG_BUILTIN_INIT (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN) #ifdef __cplusplus extern "C" { #endif /* The python void return value */ SWIGRUNTIMEINLINE PyObject * SWIG_Py_Void(void) { PyObject *none = Py_None; Py_INCREF(none); return none; } /* SwigPyClientData */ typedef struct { PyObject *klass; PyObject *newraw; PyObject *newargs; PyObject *destroy; int delargs; int implicitconv; PyTypeObject *pytype; } SwigPyClientData; SWIGRUNTIMEINLINE int SWIG_Python_CheckImplicit(swig_type_info *ty) { SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; int fail = data ? data->implicitconv : 0; if (fail) PyErr_SetString(PyExc_TypeError, "Implicit conversion is prohibited for explicit constructors."); return fail; } SWIGRUNTIMEINLINE PyObject * SWIG_Python_ExceptionType(swig_type_info *desc) { SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; PyObject *klass = data ? data->klass : 0; return (klass ? klass : PyExc_RuntimeError); } SWIGRUNTIME SwigPyClientData * SwigPyClientData_New(PyObject* obj) { if (!obj) { return 0; } else { SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); /* the klass element */ data->klass = obj; Py_INCREF(data->klass); /* the newraw method and newargs arguments used to create a new raw instance */ if (PyClass_Check(obj)) { data->newraw = 0; data->newargs = obj; Py_INCREF(obj); } else { data->newraw = PyObject_GetAttrString(data->klass, "__new__"); if (data->newraw) { Py_INCREF(data->newraw); data->newargs = PyTuple_New(1); PyTuple_SetItem(data->newargs, 0, obj); } else { data->newargs = obj; } Py_INCREF(data->newargs); } /* the destroy method, aka as the C++ delete method */ data->destroy = PyObject_GetAttrString(data->klass, "__swig_destroy__"); if (PyErr_Occurred()) { PyErr_Clear(); data->destroy = 0; } if (data->destroy) { int flags; Py_INCREF(data->destroy); flags = PyCFunction_GET_FLAGS(data->destroy); data->delargs = !(flags & (METH_O)); } else { data->delargs = 0; } data->implicitconv = 0; data->pytype = 0; return data; } } SWIGRUNTIME void SwigPyClientData_Del(SwigPyClientData *data) { Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); } /* =============== SwigPyObject =====================*/ typedef struct { PyObject_HEAD void *ptr; swig_type_info *ty; int own; PyObject *next; #ifdef SWIGPYTHON_BUILTIN PyObject *dict; #endif } SwigPyObject; #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME PyObject * SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; if (!sobj->dict) sobj->dict = PyDict_New(); Py_INCREF(sobj->dict); return sobj->dict; } #endif SWIGRUNTIME PyObject * SwigPyObject_long(SwigPyObject *v) { return PyLong_FromVoidPtr(v->ptr); } SWIGRUNTIME PyObject * SwigPyObject_format(const char* fmt, SwigPyObject *v) { PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { PyObject *ofmt = SWIG_Python_str_FromChar(fmt); if (ofmt) { #if PY_VERSION_HEX >= 0x03000000 res = PyUnicode_Format(ofmt,args); #else res = PyString_Format(ofmt,args); #endif Py_DECREF(ofmt); } Py_DECREF(args); } } return res; } SWIGRUNTIME PyObject * SwigPyObject_oct(SwigPyObject *v) { return SwigPyObject_format("%o",v); } SWIGRUNTIME PyObject * SwigPyObject_hex(SwigPyObject *v) { return SwigPyObject_format("%x",v); } SWIGRUNTIME PyObject * SwigPyObject_repr(SwigPyObject *v) { const char *name = SWIG_TypePrettyName(v->ty); PyObject *repr = SWIG_Python_str_FromFormat("", (name ? name : "unknown"), (void *)v); if (v->next) { PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); # if PY_VERSION_HEX >= 0x03000000 PyObject *joined = PyUnicode_Concat(repr, nrep); Py_DecRef(repr); Py_DecRef(nrep); repr = joined; # else PyString_ConcatAndDel(&repr,nrep); # endif } return repr; } /* We need a version taking two PyObject* parameters so it's a valid * PyCFunction to use in swigobject_methods[]. */ SWIGRUNTIME PyObject * SwigPyObject_repr2(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) { return SwigPyObject_repr((SwigPyObject*)v); } SWIGRUNTIME int SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : ((i > j) ? 1 : 0); } /* Added for Python 3.x, would it also be useful for Python 2.x? */ SWIGRUNTIME PyObject* SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) { PyObject* res; if( op != Py_EQ && op != Py_NE ) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); return res; } SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void); #ifdef SWIGPYTHON_BUILTIN static swig_type_info *SwigPyObject_stype = 0; SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { SwigPyClientData *cd; assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; assert(cd); assert(cd->pytype); return cd->pytype; } #else SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce(); return type; } #endif SWIGRUNTIMEINLINE int SwigPyObject_Check(PyObject *op) { #ifdef SWIGPYTHON_BUILTIN PyTypeObject *target_tp = SwigPyObject_type(); if (PyType_IsSubtype(op->ob_type, target_tp)) return 1; return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0); #else return (Py_TYPE(op) == SwigPyObject_type()) || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); #endif } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own); SWIGRUNTIME void SwigPyObject_dealloc(PyObject *v) { SwigPyObject *sobj = (SwigPyObject *) v; PyObject *next = sobj->next; if (sobj->own == SWIG_POINTER_OWN) { swig_type_info *ty = sobj->ty; SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; PyObject *destroy = data ? data->destroy : 0; if (destroy) { /* destroy is always a VARARGS method */ PyObject *res; /* PyObject_CallFunction() has the potential to silently drop the active exception. In cases of unnamed temporary variable or where we just finished iterating over a generator StopIteration will be active right now, and this needs to remain true upon return from SwigPyObject_dealloc. So save and restore. */ PyObject *type = NULL, *value = NULL, *traceback = NULL; PyErr_Fetch(&type, &value, &traceback); if (data->delargs) { /* we need to create a temporary object to carry the destroy operation */ PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); res = SWIG_Python_CallFunctor(destroy, tmp); Py_DECREF(tmp); } else { PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy); res = ((*meth)(mself, v)); } if (!res) PyErr_WriteUnraisable(destroy); PyErr_Restore(type, value, traceback); Py_XDECREF(res); } #if !defined(SWIG_PYTHON_SILENT_MEMLEAK) else { const char *name = SWIG_TypePrettyName(ty); printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); } #endif } Py_XDECREF(next); PyObject_DEL(v); } SWIGRUNTIME PyObject* SwigPyObject_append(PyObject* v, PyObject* next) { SwigPyObject *sobj = (SwigPyObject *) v; if (!SwigPyObject_Check(next)) { PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject"); return NULL; } sobj->next = next; Py_INCREF(next); return SWIG_Py_Void(); } SWIGRUNTIME PyObject* SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *) v; if (sobj->next) { Py_INCREF(sobj->next); return sobj->next; } else { return SWIG_Py_Void(); } } SWIGINTERN PyObject* SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = 0; return SWIG_Py_Void(); } SWIGINTERN PyObject* SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = SWIG_POINTER_OWN; return SWIG_Py_Void(); } SWIGINTERN PyObject* SwigPyObject_own(PyObject *v, PyObject *args) { PyObject *val = 0; if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) { return NULL; } else { SwigPyObject *sobj = (SwigPyObject *)v; PyObject *obj = PyBool_FromLong(sobj->own); if (val) { if (PyObject_IsTrue(val)) { SwigPyObject_acquire(v,args); } else { SwigPyObject_disown(v,args); } } return obj; } } static PyMethodDef swigobject_methods[] = { {"disown", SwigPyObject_disown, METH_NOARGS, "releases ownership of the pointer"}, {"acquire", SwigPyObject_acquire, METH_NOARGS, "acquires ownership of the pointer"}, {"own", SwigPyObject_own, METH_VARARGS, "returns/sets ownership of the pointer"}, {"append", SwigPyObject_append, METH_O, "appends another 'this' object"}, {"next", SwigPyObject_next, METH_NOARGS, "returns the next 'this' object"}, {"__repr__",SwigPyObject_repr2, METH_NOARGS, "returns object representation"}, {0, 0, 0, 0} }; SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void) { static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods SwigPyObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ /* nb_divide removed in Python 3 */ #if PY_VERSION_HEX < 0x03000000 (binaryfunc)0, /*nb_divide*/ #endif (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_VERSION_HEX < 0x03000000 0, /*nb_coerce*/ #endif (unaryfunc)SwigPyObject_long, /*nb_int*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_long, /*nb_long*/ #else 0, /*nb_reserved*/ #endif (unaryfunc)0, /*nb_float*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_oct, /*nb_oct*/ (unaryfunc)SwigPyObject_hex, /*nb_hex*/ #endif #if PY_VERSION_HEX >= 0x03050000 /* 3.5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_matrix_multiply */ #elif PY_VERSION_HEX >= 0x03000000 /* 3.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ #else 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ #endif }; static PyTypeObject swigpyobject_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif "SwigPyObject", /* tp_name */ sizeof(SwigPyObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyObject_dealloc, /* tp_dealloc */ 0, /* tp_print */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX >= 0x03000000 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */ #else (cmpfunc)SwigPyObject_compare, /* tp_compare */ #endif (reprfunc)SwigPyObject_repr, /* tp_repr */ &SwigPyObject_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigobject_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ swigobject_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0, /* tp_del */ 0, /* tp_version_tag */ #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #if PY_VERSION_HEX >= 0x03080000 0, /* tp_vectorcall */ #endif #if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) 0, /* tp_print */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ 0, /* tp_prev */ 0 /* tp_next */ #endif }; swigpyobject_type = tmp; type_init = 1; if (PyType_Ready(&swigpyobject_type) < 0) return NULL; } return &swigpyobject_type; } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own) { SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); if (sobj) { sobj->ptr = ptr; sobj->ty = ty; sobj->own = own; sobj->next = 0; } return (PyObject *)sobj; } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; swig_type_info *ty; size_t size; } SwigPyPacked; SWIGRUNTIME PyObject * SwigPyPacked_repr(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return SWIG_Python_str_FromFormat("", result, v->ty->name); } else { return SWIG_Python_str_FromFormat("", v->ty->name); } } SWIGRUNTIME PyObject * SwigPyPacked_str(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); } else { return SWIG_Python_str_FromChar(v->ty->name); } } SWIGRUNTIME int SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : ((i > j) ? 1 : 0); return s ? s : strncmp((const char *)v->pack, (const char *)w->pack, 2*v->size); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void); SWIGRUNTIME PyTypeObject* SwigPyPacked_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce(); return type; } SWIGRUNTIMEINLINE int SwigPyPacked_Check(PyObject *op) { return ((op)->ob_type == SwigPyPacked_TypeOnce()) || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); } SWIGRUNTIME void SwigPyPacked_dealloc(PyObject *v) { if (SwigPyPacked_Check(v)) { SwigPyPacked *sobj = (SwigPyPacked *) v; free(sobj->pack); } PyObject_DEL(v); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void) { static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; static PyTypeObject swigpypacked_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX>=0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif "SwigPyPacked", /* tp_name */ sizeof(SwigPyPacked), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ 0, /* tp_print */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX>=0x03000000 0, /* tp_reserved in 3.0.1 */ #else (cmpfunc)SwigPyPacked_compare, /* tp_compare */ #endif (reprfunc)SwigPyPacked_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ (reprfunc)SwigPyPacked_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigpacked_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0, /* tp_del */ 0, /* tp_version_tag */ #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #if PY_VERSION_HEX >= 0x03080000 0, /* tp_vectorcall */ #endif #if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) 0, /* tp_print */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ 0, /* tp_prev */ 0 /* tp_next */ #endif }; swigpypacked_type = tmp; type_init = 1; if (PyType_Ready(&swigpypacked_type) < 0) return NULL; } return &swigpypacked_type; } SWIGRUNTIME PyObject * SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) { SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); if (sobj) { void *pack = malloc(size); if (pack) { memcpy(pack, ptr, size); sobj->pack = pack; sobj->ty = ty; sobj->size = size; } else { PyObject_DEL((PyObject *) sobj); sobj = 0; } } return (PyObject *) sobj; } SWIGRUNTIME swig_type_info * SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { if (SwigPyPacked_Check(obj)) { SwigPyPacked *sobj = (SwigPyPacked *)obj; if (sobj->size != size) return 0; memcpy(ptr, sobj->pack, size); return sobj->ty; } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ static PyObject *Swig_This_global = NULL; SWIGRUNTIME PyObject * SWIG_This(void) { if (Swig_This_global == NULL) Swig_This_global = SWIG_Python_str_FromChar("this"); return Swig_This_global; } /* #define SWIG_PYTHON_SLOW_GETSET_THIS */ /* TODO: I don't know how to implement the fast getset in Python 3 right now */ #if PY_VERSION_HEX>=0x03000000 #define SWIG_PYTHON_SLOW_GETSET_THIS #endif SWIGRUNTIME SwigPyObject * SWIG_Python_GetSwigThis(PyObject *pyobj) { PyObject *obj; if (SwigPyObject_Check(pyobj)) return (SwigPyObject *) pyobj; #ifdef SWIGPYTHON_BUILTIN (void)obj; # ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { pyobj = PyWeakref_GET_OBJECT(pyobj); if (pyobj && SwigPyObject_Check(pyobj)) return (SwigPyObject*) pyobj; } # endif return NULL; #else obj = 0; #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) if (PyInstance_Check(pyobj)) { obj = _PyInstance_Lookup(pyobj, SWIG_This()); } else { PyObject **dictptr = _PyObject_GetDictPtr(pyobj); if (dictptr != NULL) { PyObject *dict = *dictptr; obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; } else { #ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; } #endif obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } } } #else obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } #endif if (obj && !SwigPyObject_Check(obj)) { /* a PyObject is called 'this', try to get the 'real this' SwigPyObject from it */ return SWIG_Python_GetSwigThis(obj); } return (SwigPyObject *)obj; #endif } /* Acquire a pointer value */ SWIGRUNTIME int SWIG_Python_AcquirePtr(PyObject *obj, int own) { if (own == SWIG_POINTER_OWN) { SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); if (sobj) { int oldown = sobj->own; sobj->own = own; return oldown; } } return 0; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { int res; SwigPyObject *sobj; int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0; if (!obj) return SWIG_ERROR; if (obj == Py_None && !implicit_conv) { if (ptr) *ptr = 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } res = SWIG_ERROR; sobj = SWIG_Python_GetSwigThis(obj); if (own) *own = 0; while (sobj) { void *vptr = sobj->ptr; if (ty) { swig_type_info *to = sobj->ty; if (to == ty) { /* no type cast needed */ if (ptr) *ptr = vptr; break; } else { swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) { sobj = (SwigPyObject *)sobj->next; } else { if (ptr) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) *own = *own | SWIG_CAST_NEW_MEMORY; } } break; } } } else { if (ptr) *ptr = vptr; break; } } if (sobj) { if (own) *own = *own | sobj->own; if (flags & SWIG_POINTER_DISOWN) { sobj->own = 0; } res = SWIG_OK; } else { if (implicit_conv) { SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; if (data && !data->implicitconv) { PyObject *klass = data->klass; if (klass) { PyObject *impconv; data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ impconv = SWIG_Python_CallFunctor(klass, obj); data->implicitconv = 0; if (PyErr_Occurred()) { PyErr_Clear(); impconv = 0; } if (impconv) { SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); if (iobj) { void *vptr; res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); if (SWIG_IsOK(res)) { if (ptr) { *ptr = vptr; /* transfer the ownership to 'ptr' */ iobj->own = 0; res = SWIG_AddCast(res); res = SWIG_AddNewMask(res); } else { res = SWIG_AddCast(res); } } } Py_DECREF(impconv); } } } if (!SWIG_IsOK(res) && obj == Py_None) { if (ptr) *ptr = 0; if (PyErr_Occurred()) PyErr_Clear(); res = SWIG_OK; } } } return res; } /* Convert a function ptr value */ SWIGRUNTIME int SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { if (!PyCFunction_Check(obj)) { return SWIG_ConvertPtr(obj, ptr, ty, 0); } else { void *vptr = 0; swig_cast_info *tc; /* here we get the method pointer for callbacks */ const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; if (desc) desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; if (!desc) return SWIG_ERROR; tc = SWIG_TypeCheck(desc,ty); if (tc) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } else { return SWIG_ERROR; } return SWIG_OK; } } /* Convert a packed pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } /* ----------------------------------------------------------------------------- * Create a new pointer object * ----------------------------------------------------------------------------- */ /* Create a new instance object, without calling __init__, and set the 'this' attribute. */ SWIGRUNTIME PyObject* SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) { PyObject *inst = 0; PyObject *newraw = data->newraw; if (newraw) { inst = PyObject_Call(newraw, data->newargs, NULL); if (inst) { #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { PyObject *dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; PyDict_SetItem(dict, SWIG_This(), swig_this); } } #else if (PyObject_SetAttr(inst, SWIG_This(), swig_this) == -1) { Py_DECREF(inst); inst = 0; } #endif } } else { #if PY_VERSION_HEX >= 0x03000000 PyObject *empty_args = PyTuple_New(0); if (empty_args) { PyObject *empty_kwargs = PyDict_New(); if (empty_kwargs) { inst = ((PyTypeObject *)data->newargs)->tp_new((PyTypeObject *)data->newargs, empty_args, empty_kwargs); Py_DECREF(empty_kwargs); if (inst) { if (PyObject_SetAttr(inst, SWIG_This(), swig_this) == -1) { Py_DECREF(inst); inst = 0; } else { Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; } } } Py_DECREF(empty_args); } #else PyObject *dict = PyDict_New(); if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } #endif } return inst; } SWIGRUNTIME int SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) { #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { PyObject *dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; } return PyDict_SetItem(dict, SWIG_This(), swig_this); } #endif return PyObject_SetAttr(inst, SWIG_This(), swig_this); } SWIGINTERN PyObject * SWIG_Python_InitShadowInstance(PyObject *args) { PyObject *obj[2]; if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) { return NULL; } else { SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); if (sthis) { SwigPyObject_append((PyObject*) sthis, obj[1]); } else { if (SWIG_Python_SetSwigThis(obj[0], obj[1]) != 0) return NULL; } return SWIG_Py_Void(); } } /* Create a new pointer object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) { SwigPyClientData *clientdata; PyObject * robj; int own; if (!ptr) return SWIG_Py_Void(); clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; if (clientdata && clientdata->pytype) { SwigPyObject *newobj; if (flags & SWIG_BUILTIN_TP_INIT) { newobj = (SwigPyObject*) self; if (newobj->ptr) { PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0); while (newobj->next) newobj = (SwigPyObject *) newobj->next; newobj->next = next_self; newobj = (SwigPyObject *)next_self; #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } } else { newobj = PyObject_New(SwigPyObject, clientdata->pytype); #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } if (newobj) { newobj->ptr = ptr; newobj->ty = type; newobj->own = own; newobj->next = 0; return (PyObject*) newobj; } return SWIG_Py_Void(); } assert(!(flags & SWIG_BUILTIN_TP_INIT)); robj = SwigPyObject_New(ptr, type, own); if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); Py_DECREF(robj); robj = inst; } return robj; } /* Create a new packed object */ SWIGRUNTIMEINLINE PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_module_info * SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } #endif } return (swig_module_info *) type_pointer; } SWIGRUNTIME void SWIG_Python_DestroyModule(PyObject *obj) { swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); swig_type_info **types = swig_module->types; size_t i; for (i =0; i < swig_module->size; ++i) { swig_type_info *ty = types[i]; if (ty->owndata) { SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; if (data) SwigPyClientData_Del(data); } } Py_DECREF(SWIG_This()); Swig_This_global = NULL; } SWIGRUNTIME void SWIG_Python_SetModule(swig_module_info *swig_module) { #if PY_VERSION_HEX >= 0x03000000 /* Add a dummy module object into sys.modules */ PyObject *module = PyImport_AddModule("swig_runtime_data" SWIG_RUNTIME_VERSION); #else static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */ PyObject *module = Py_InitModule("swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); #endif PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, "type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } } /* The python cached type query */ SWIGRUNTIME PyObject * SWIG_Python_TypeCache(void) { static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); return cache; } SWIGRUNTIME swig_type_info * SWIG_Python_TypeQuery(const char *type) { PyObject *cache = SWIG_Python_TypeCache(); PyObject *key = SWIG_Python_str_FromChar(type); PyObject *obj = PyDict_GetItem(cache, key); swig_type_info *descriptor; if (obj) { descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL); } else { swig_module_info *swig_module = SWIG_GetModule(0); descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); if (descriptor) { obj = PyCapsule_New((void*) descriptor, NULL, NULL); PyDict_SetItem(cache, key, obj); Py_DECREF(obj); } } Py_DECREF(key); return descriptor; } /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); const char *tmp = SWIG_Python_str_AsChar(old_str); const char *errmesg = tmp ? tmp : "Invalid error message"; Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, errmesg); } else { PyErr_Format(type, "%s %s", errmesg, mesg); } SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } SWIGRUNTIMEINLINE const char * SwigPyObject_GetDesc(PyObject *self) { SwigPyObject *v = (SwigPyObject *)self; swig_type_info *ty = v ? v->ty : 0; return ty ? ty->str : ""; } SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (obj && SwigPyObject_Check(obj)) { const char *otype = (const char *) SwigPyObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); SWIG_Python_str_DelForPy3(cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_XDECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); #if SWIG_POINTER_EXCEPTION if (flags) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } #endif } return result; } #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME int SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { PyTypeObject *tp = obj->ob_type; PyObject *descr; PyObject *encoded_name; descrsetfunc f; int res = -1; # ifdef Py_USING_UNICODE if (PyString_Check(name)) { name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL); if (!name) return -1; } else if (!PyUnicode_Check(name)) # else if (!PyString_Check(name)) # endif { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name); return -1; } else { Py_INCREF(name); } if (!tp->tp_dict) { if (PyType_Ready(tp) < 0) goto done; } descr = _PyType_Lookup(tp, name); f = NULL; if (descr != NULL) f = descr->ob_type->tp_descr_set; if (!f) { if (PyString_Check(name)) { encoded_name = name; Py_INCREF(name); } else { encoded_name = PyUnicode_AsUTF8String(name); if (!encoded_name) return -1; } PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); Py_DECREF(encoded_name); } else { res = f(descr, obj, value); } done: Py_DECREF(name); return res; } #endif #ifdef __cplusplus } #endif swig-4.0.2/Lib/python/std_carray.i0000644000175000017500000000305713667507523016723 0ustar williamwilliam%include %fragment("StdCarrayTraits","header",fragment="StdSequenceTraits") { namespace swig { template struct traits_asptr > { static int asptr(PyObject *obj, std::carray **array) { return traits_asptr_stdseq >::asptr(obj, array); } }; } } %warnfilter(SWIGWARN_IGNORE_OPERATOR_INDEX) std::carray::operator[]; %extend std::carray { %fragment(SWIG_Traits_frag(std::carray<_Type, _Size >), "header", fragment="SwigPyIterator_T", fragment=SWIG_Traits_frag(_Type), fragment="StdCarrayTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::carray<" #_Type "," #_Size " >"; } }; } } %typemaps_asptr(SWIG_TYPECHECK_VECTOR, swig::asptr, SWIG_Traits_frag(std::carray<_Type, _Size >), std::carray<_Type, _Size >); %typemap(out,noblock=1) iterator, const_iterator { $result = SWIG_NewPointerObj(swig::make_output_iterator((const $type &)$1), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); } inline size_t __len__() const { return self->size(); } inline const _Type& __getitem__(size_t i) const { return (*self)[i]; } inline void __setitem__(size_t i, const _Type& v) { (*self)[i] = v; } swig::SwigPyIterator* __iter__(PyObject **PYTHON_SELF) { return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } %include swig-4.0.2/Lib/python/ccomplex.i0000644000175000017500000000137313667507523016401 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ccomplex.i * * C complex typemaps * ISO C99: 7.3 Complex arithmetic * ----------------------------------------------------------------------------- */ %include %{ #include %} /* C complex constructor */ #define CCplxConst(r, i) ((r) + I*(i)) %swig_cplxflt_convn(float complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(double complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(complex, CCplxConst, creal, cimag); /* declaring the typemaps */ %typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, complex); swig-4.0.2/Lib/python/python.swg0000644000175000017500000000376313667507523016465 0ustar williamwilliam/* ------------------------------------------------------------ * python.swg * * Python configuration module. * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Inner macros * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The runtime part * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Special user directives * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Typemap specializations * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Warnings for Python keywords * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Python autodoc support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Python classes, for C++ * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Python initialization function * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * For backward compatibility * ------------------------------------------------------------ */ %include swig-4.0.2/Lib/python/std_wstring.i0000644000175000017500000000007713667507523017136 0ustar williamwilliam%include %include swig-4.0.2/Lib/python/file.i0000644000175000017500000000201313667507523015476 0ustar williamwilliam/* ----------------------------------------------------------------------------- * file.i * * Typemaps for FILE* * ----------------------------------------------------------------------------- */ %types(FILE *); /* defining basic methods */ %fragment("SWIG_AsValFilePtr","header") { SWIGINTERN int SWIG_AsValFilePtr(PyObject *obj, FILE **val) { static swig_type_info* desc = 0; void *vptr = 0; if (!desc) desc = SWIG_TypeQuery("FILE *"); if ((SWIG_ConvertPtr(obj, &vptr, desc, 0)) == SWIG_OK) { if (val) *val = (FILE *)vptr; return SWIG_OK; } %#if PY_VERSION_HEX < 0x03000000 if (PyFile_Check(obj)) { if (val) *val = PyFile_AsFile(obj); return SWIG_OK; } %#endif return SWIG_TypeError; } } %fragment("SWIG_AsFilePtr","header",fragment="SWIG_AsValFilePtr") { SWIGINTERNINLINE FILE* SWIG_AsFilePtr(PyObject *obj) { FILE *val = 0; SWIG_AsValFilePtr(obj, &val); return val; } } /* defining the typemaps */ %typemaps_asval(%checkcode(POINTER), SWIG_AsValFilePtr, "SWIG_AsValFilePtr", FILE*); swig-4.0.2/Lib/python/std_unordered_map.i0000644000175000017500000002430513667507523020265 0ustar williamwilliam/* Unordered Maps */ %include %fragment("StdUnorderedMapForwardIteratorTraits","header") { namespace swig { template struct SwigPyMapForwardIterator_T : SwigPyForwardIteratorClosed_T { SwigPyMapForwardIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyForwardIteratorClosed_T(curr, first, last, seq) { } }; template > struct SwigPyMapKeyForwardIterator_T : SwigPyMapForwardIterator_T { SwigPyMapKeyForwardIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapForwardIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_key_forward_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapKeyForwardIterator_T(current, begin, end, seq); } template > struct SwigPyMapValueForwardIterator_T : SwigPyMapForwardIterator_T { SwigPyMapValueForwardIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapForwardIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_value_forward_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapValueForwardIterator_T(current, begin, end, seq); } } } %fragment("StdUnorderedMapTraits","header",fragment="StdMapCommonTraits",fragment="StdUnorderedMapForwardIteratorTraits") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::unordered_map *unordered_map) { typedef typename std::unordered_map::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { unordered_map->insert(value_type(it->first, it->second)); } } template struct traits_reserve > { static void reserve(std::unordered_map &seq, typename std::unordered_map::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { typedef std::unordered_map unordered_map_type; static int asptr(PyObject *obj, unordered_map_type **val) { int res = SWIG_ERROR; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); %#if PY_VERSION_HEX >= 0x03000000 /* In Python 3.x the ".items()" method returns a dict_items object */ items = PySequence_Fast(items, ".items() didn't return a sequence!"); %#endif res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { unordered_map_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } SWIG_PYTHON_THREAD_END_BLOCK; return res; } }; template struct traits_from > { typedef std::unordered_map unordered_map_type; typedef typename unordered_map_type::const_iterator const_iterator; typedef typename unordered_map_type::size_type size_type; static PyObject *asdict(const unordered_map_type& map) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; size_type size = map.size(); Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } SWIG_PYTHON_THREAD_END_BLOCK; return obj; } static PyObject *from(const unordered_map_type& map) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new unordered_map_type(map), desc, SWIG_POINTER_OWN); } else { return asdict(map); } } }; } } %define %swig_unordered_map_common(Map...) %swig_sequence_forward_iterator(Map); %swig_container_methods(Map) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_length", functype="lenfunc") __len__; %feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__; %feature("python:slot", "tp_iter", functype="getiterfunc") key_iterator; %feature("python:slot", "sq_contains", functype="objobjproc") __contains__; %extend { %newobject iterkeys(PyObject **PYTHON_SELF); swig::SwigPyIterator* iterkeys(PyObject **PYTHON_SELF) { return swig::make_output_key_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject itervalues(PyObject **PYTHON_SELF); swig::SwigPyIterator* itervalues(PyObject **PYTHON_SELF) { return swig::make_output_value_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject iteritems(PyObject **PYTHON_SELF); swig::SwigPyIterator* iteritems(PyObject **PYTHON_SELF) { return swig::make_output_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } #else %extend { %pythoncode %{def __iter__(self): return self.key_iterator()%} %pythoncode %{def iterkeys(self): return self.key_iterator()%} %pythoncode %{def itervalues(self): return self.value_iterator()%} %pythoncode %{def iteritems(self): return self.iterator()%} } #endif %extend { mapped_type const & __getitem__(const key_type& key) throw (std::out_of_range) { Map::const_iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __delitem__(const key_type& key) throw (std::out_of_range) { Map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const key_type& key) const { Map::const_iterator i = self->find(key); return i != self->end(); } PyObject* keys() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* keyList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(keyList, j, swig::from(i->first)); } SWIG_PYTHON_THREAD_END_BLOCK; return keyList; } PyObject* values() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* valList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(valList, j, swig::from(i->second)); } SWIG_PYTHON_THREAD_END_BLOCK; return valList; } PyObject* items() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* itemList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(itemList, j, swig::from(*i)); } SWIG_PYTHON_THREAD_END_BLOCK; return itemList; } bool __contains__(const key_type& key) { return self->find(key) != self->end(); } %newobject key_iterator(PyObject **PYTHON_SELF); swig::SwigPyIterator* key_iterator(PyObject **PYTHON_SELF) { return swig::make_output_key_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject value_iterator(PyObject **PYTHON_SELF); swig::SwigPyIterator* value_iterator(PyObject **PYTHON_SELF) { return swig::make_output_value_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } %enddef %define %swig_unordered_map_methods(Map...) %swig_unordered_map_common(Map) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_ass_subscript", functype="objobjargproc") __setitem__; #endif %extend { // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(const key_type& key) { self->erase(key); } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { (*self)[key] = x; } PyObject* asdict() { return swig::traits_from< Map >::asdict(*self); } } %enddef %include swig-4.0.2/Lib/python/pywstrings.swg0000644000175000017500000000461013667507523017365 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for wchar_t strings * ------------------------------------------------------------ */ %{ #if PY_VERSION_HEX >= 0x03020000 # define SWIGPY_UNICODE_ARG(obj) ((PyObject*) (obj)) #else # define SWIGPY_UNICODE_ARG(obj) ((PyUnicodeObject*) (obj)) #endif %} %fragment("SWIG_AsWCharPtrAndSize","header",fragment="",fragment="SWIG_pwchar_descriptor") { SWIGINTERN int SWIG_AsWCharPtrAndSize(PyObject *obj, wchar_t **cptr, size_t *psize, int *alloc) { PyObject *tmp = 0; int isunicode = PyUnicode_Check(obj); %#if PY_VERSION_HEX < 0x03000000 && !defined(SWIG_PYTHON_STRICT_UNICODE_WCHAR) if (!isunicode && PyString_Check(obj)) { tmp = PyUnicode_FromObject(obj); if (tmp) { isunicode = 1; obj = tmp; } else { PyErr_Clear(); return SWIG_TypeError; } } %#endif if (isunicode) { %#if PY_VERSION_HEX >= 0x03030000 Py_ssize_t len = PyUnicode_GetLength(obj); %#else Py_ssize_t len = PyUnicode_GetSize(obj); %#endif if (cptr) { Py_ssize_t length; *cptr = %new_array(len + 1, wchar_t); length = PyUnicode_AsWideChar(SWIGPY_UNICODE_ARG(obj), *cptr, len); if (length == -1) { PyErr_Clear(); Py_XDECREF(tmp); return SWIG_TypeError; } (*cptr)[length] = 0; } if (psize) *psize = (size_t) len + 1; if (alloc) *alloc = cptr ? SWIG_NEWOBJ : 0; Py_XDECREF(tmp); return SWIG_OK; } else { swig_type_info* pwchar_descriptor = SWIG_pwchar_descriptor(); if (pwchar_descriptor) { void * vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pwchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (wchar_t *)vptr; if (psize) *psize = vptr ? (wcslen((wchar_t *)vptr) + 1) : 0; return SWIG_OK; } } } return SWIG_TypeError; } } %fragment("SWIG_FromWCharPtrAndSize","header",fragment="",fragment="SWIG_pwchar_descriptor") { SWIGINTERNINLINE PyObject * SWIG_FromWCharPtrAndSize(const wchar_t * carray, size_t size) { if (carray) { if (size > INT_MAX) { swig_type_info* pwchar_descriptor = SWIG_pwchar_descriptor(); return pwchar_descriptor ? SWIG_InternalNewPointerObj(%const_cast(carray,wchar_t *), pwchar_descriptor, 0) : SWIG_Py_Void(); } else { return PyUnicode_FromWideChar(carray, %numeric_cast(size, Py_ssize_t)); } } else { return SWIG_Py_Void(); } } } swig-4.0.2/Lib/python/std_sstream.i0000644000175000017500000000003513667507523017111 0ustar williamwilliam%include swig-4.0.2/Lib/python/std_unordered_multimap.i0000644000175000017500000000770313667507523021343 0ustar williamwilliam/* Unordered Multimaps */ %include %fragment("StdUnorderedMultimapTraits","header",fragment="StdMapCommonTraits",fragment="StdUnorderedMapForwardIteratorTraits") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::unordered_multimap *unordered_multimap) { typedef typename std::unordered_multimap::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { unordered_multimap->insert(value_type(it->first, it->second)); } } template struct traits_reserve > { static void reserve(std::unordered_multimap &seq, typename std::unordered_multimap::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { typedef std::unordered_multimap unordered_multimap_type; static int asptr(PyObject *obj, std::unordered_multimap **val) { int res = SWIG_ERROR; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); %#if PY_VERSION_HEX >= 0x03000000 /* In Python 3.x the ".items()" method returns a dict_items object */ items = PySequence_Fast(items, ".items() didn't return a sequence!"); %#endif res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { unordered_multimap_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::unordered_multimap unordered_multimap_type; typedef typename unordered_multimap_type::const_iterator const_iterator; typedef typename unordered_multimap_type::size_type size_type; static PyObject *from(const unordered_multimap_type& unordered_multimap) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new unordered_multimap_type(unordered_multimap), desc, SWIG_POINTER_OWN); } else { size_type size = unordered_multimap.size(); Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "unordered_multimap size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= unordered_multimap.begin(); i!= unordered_multimap.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } return obj; } } }; } } %define %swig_unordered_multimap_methods(Type...) %swig_unordered_map_common(Type); #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_ass_subscript", functype="objobjargproc") __setitem__; #endif %extend { // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(const key_type& key) { self->erase(key); } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { self->insert(Type::value_type(key,x)); } } %enddef %include swig-4.0.2/Lib/python/attribute.i0000644000175000017500000000004213667507523016562 0ustar williamwilliam%include swig-4.0.2/Lib/python/pyclasses.swg0000644000175000017500000000662213667507523017147 0ustar williamwilliam#ifdef __cplusplus /* SwigPtr_PyObject is used as a replacement of PyObject *, where the INCREF/DECREF are applied as needed. You can use SwigPtr_PyObject in a container, such as std::vector; or as a member variable: struct A { SwigPtr_PyObject obj; A(PyObject *o) : _obj(o) { } }; or as a input/output value SwigPtr_PyObject func(SwigPtr_PyObject obj) { SwigPtr_PyObject out = PyString_FromFormat("hello %s", PyObject_AsString(obj)); Py_DECREF(out); return out; } just remember to pair the object creation with the proper DECREF, the same as with plain PyObject *ptr, since SwigPtr_PyObject always add one reference at construction. SwigPtr_PyObject is 'visible' at the wrapped side, so you can do: %template(pyvector) std::vector; and all the proper typemaps will be used. */ namespace swig { %ignore SwigPtr_PyObject; struct SwigPtr_PyObject {}; %apply PyObject * {SwigPtr_PyObject}; %apply PyObject * const& {SwigPtr_PyObject const&}; %typemap(typecheck,precedence=SWIG_TYPECHECK_SWIGOBJECT,noblock=1) SwigPtr_PyObject const& "$1 = ($input != 0);"; /* For output */ %typemap(out,noblock=1) SwigPtr_PyObject { $result = (PyObject *)$1; Py_INCREF($result); } %typemap(out,noblock=1) SwigPtr_PyObject const & { $result = (PyObject *)*$1; Py_INCREF($result); } } %{ namespace swig { class SwigPtr_PyObject { protected: PyObject *_obj; public: SwigPtr_PyObject() :_obj(0) { } SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XINCREF(_obj); SWIG_PYTHON_THREAD_END_BLOCK; } SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj) { if (initial_ref) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XINCREF(_obj); SWIG_PYTHON_THREAD_END_BLOCK; } } SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XINCREF(item._obj); Py_XDECREF(_obj); _obj = item._obj; SWIG_PYTHON_THREAD_END_BLOCK; return *this; } ~SwigPtr_PyObject() { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XDECREF(_obj); SWIG_PYTHON_THREAD_END_BLOCK; } operator PyObject *() const { return _obj; } PyObject *operator->() const { return _obj; } }; } %} /* SwigVar_PyObject is used to manage 'in the scope' PyObject * variables, as in int func () { SwigVar_PyObject obj = PyString_FromString("hello"); } ie, 'obj' is created and destructed in the same scope from a python object that carries at least one reference value. SwigVar_PyObject just take care of applying the proper Py_DECREF. Hence, this class is purely internal and not visible at the wrapped side. */ namespace swig { %ignore SwigVar_PyObject; struct SwigVar_PyObject {}; %apply PyObject * {SwigVar_PyObject}; %apply PyObject * const& {SwigVar_PyObject const&}; } %{ namespace swig { struct SwigVar_PyObject : SwigPtr_PyObject { SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { } SwigVar_PyObject & operator = (PyObject* obj) { Py_XDECREF(_obj); _obj = obj; return *this; } }; } %} #endif swig-4.0.2/Lib/python/std_unordered_set.i0000644000175000017500000000437213667507523020305 0ustar williamwilliam/* Unordered Sets */ %fragment("StdUnorderedSetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::unordered_set* seq) { // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_reserve > { static void reserve(std::unordered_set &seq, typename std::unordered_set::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { static int asptr(PyObject *obj, std::unordered_set **s) { return traits_asptr_stdseq >::asptr(obj, s); } }; template struct traits_from > { static PyObject *from(const std::unordered_set& vec) { return traits_from_stdseq >::from(vec); } }; } %} %define %swig_unordered_set_methods(unordered_set...) %swig_sequence_forward_iterator(unordered_set); %swig_container_methods(unordered_set); #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "sq_contains", functype="objobjproc") __contains__; %feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__; #endif %extend { void append(value_type x) { self->insert(x); } bool __contains__(value_type x) { return self->find(x) != self->end(); } value_type __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } } %enddef %include swig-4.0.2/Lib/python/cmalloc.i0000644000175000017500000000004013667507523016167 0ustar williamwilliam%include swig-4.0.2/Lib/python/pyerrors.swg0000644000175000017500000000513613667507523017025 0ustar williamwilliam/* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME PyObject* SWIG_Python_ErrorType(int code) { PyObject* type = 0; switch(code) { case SWIG_MemoryError: type = PyExc_MemoryError; break; case SWIG_IOError: type = PyExc_IOError; break; case SWIG_RuntimeError: type = PyExc_RuntimeError; break; case SWIG_IndexError: type = PyExc_IndexError; break; case SWIG_TypeError: type = PyExc_TypeError; break; case SWIG_DivisionByZero: type = PyExc_ZeroDivisionError; break; case SWIG_OverflowError: type = PyExc_OverflowError; break; case SWIG_SyntaxError: type = PyExc_SyntaxError; break; case SWIG_ValueError: type = PyExc_ValueError; break; case SWIG_SystemError: type = PyExc_SystemError; break; case SWIG_AttributeError: type = PyExc_AttributeError; break; default: type = PyExc_RuntimeError; } return type; } SWIGRUNTIME void SWIG_Python_AddErrorMsg(const char* mesg) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); const char *tmp = SWIG_Python_str_AsChar(old_str); PyErr_Clear(); Py_XINCREF(type); if (tmp) PyErr_Format(type, "%s %s", tmp, mesg); else PyErr_Format(type, "%s", mesg); SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); Py_DECREF(value); } else { PyErr_SetString(PyExc_RuntimeError, mesg); } } SWIGRUNTIME int SWIG_Python_TypeErrorOccurred(PyObject *obj) { PyObject *error; if (obj) return 0; error = PyErr_Occurred(); return error && PyErr_GivenExceptionMatches(error, PyExc_TypeError); } SWIGRUNTIME void SWIG_Python_RaiseOrModifyTypeError(const char *message) { if (SWIG_Python_TypeErrorOccurred(NULL)) { /* Use existing TypeError to preserve stacktrace and enhance with given message */ PyObject *newvalue; PyObject *type = NULL, *value = NULL, *traceback = NULL; PyErr_Fetch(&type, &value, &traceback); #if PY_VERSION_HEX >= 0x03000000 newvalue = PyUnicode_FromFormat("%S\nAdditional information:\n%s", value, message); #else newvalue = PyString_FromFormat("%s\nAdditional information:\n%s", PyString_AsString(value), message); #endif Py_XDECREF(value); PyErr_Restore(type, newvalue, traceback); } else { /* Raise TypeError using given message */ PyErr_SetString(PyExc_TypeError, message); } } swig-4.0.2/Lib/python/std_basic_string.i0000644000175000017500000000501113667507523020101 0ustar williamwilliam#if !defined(SWIG_STD_STRING) #define SWIG_STD_BASIC_STRING %include #define %swig_basic_string(Type...) %swig_sequence_methods_val(Type) %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(PyObject* obj, std::string **val) { static swig_type_info* string_info = SWIG_TypeQuery("std::basic_string *"); std::string *vptr; if (SWIG_IsOK(SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0))) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { PyErr_Clear(); char* buf = 0 ; size_t size = 0; int alloc = 0; if (SWIG_IsOK(SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc))) { if (buf) { if (val) *val = new std::string(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } else { if (val) *val = 0; return SWIG_OLDOBJ; } } return SWIG_ERROR; } } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromCharPtrAndSize") { SWIGINTERNINLINE PyObject* SWIG_From(std::basic_string)(const std::string& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } } %include %typemaps_asptrfromn(%checkcode(STRING), std::basic_string); #endif #if !defined(SWIG_STD_WSTRING) %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsWCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(PyObject* obj, std::wstring **val) { static swig_type_info* string_info = SWIG_TypeQuery("std::basic_string *"); std::wstring *vptr; if (SWIG_IsOK(SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0))) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { PyErr_Clear(); wchar_t *buf = 0 ; size_t size = 0; int alloc = 0; if (SWIG_IsOK(SWIG_AsWCharPtrAndSize(obj, &buf, &size, &alloc))) { if (buf) { if (val) *val = new std::wstring(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } else { if (val) *val = 0; return SWIG_OLDOBJ; } } return SWIG_ERROR; } } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromWCharPtrAndSize") { SWIGINTERNINLINE PyObject* SWIG_From(std::basic_string)(const std::wstring& s) { return SWIG_FromWCharPtrAndSize(s.data(), s.size()); } } %typemaps_asptrfromn(%checkcode(UNISTRING), std::basic_string); #endif swig-4.0.2/Lib/python/pycontainer.swg0000644000175000017500000007601713667507523017501 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pycontainer.swg * * Python sequence <-> C++ container wrapper * * This wrapper, and its iterator, allows a general use (and reuse) of * the mapping between C++ and Python, thanks to the C++ templates. * * Of course, it needs the C++ compiler to support templates, but * since we will use this wrapper with the STL containers, that should * be the case. * ----------------------------------------------------------------------------- */ %{ #include #if PY_VERSION_HEX >= 0x03020000 # define SWIGPY_SLICE_ARG(obj) ((PyObject*) (obj)) #else # define SWIGPY_SLICE_ARG(obj) ((PySliceObject*) (obj)) #endif %} #if !defined(SWIG_NO_EXPORT_ITERATOR_METHODS) # if !defined(SWIG_EXPORT_ITERATOR_METHODS) # define SWIG_EXPORT_ITERATOR_METHODS SWIG_EXPORT_ITERATOR_METHODS # endif #endif %include /**** The PySequence C++ Wrap ***/ %fragment(""); %include %fragment("container_owner_attribute_init", "init") { // thread safe initialization swig::container_owner_attribute(); } %fragment("reference_container_owner", "header", fragment="container_owner_attribute_init") { namespace swig { static PyObject* container_owner_attribute() { static PyObject* attr = SWIG_Python_str_FromChar("__swig_container"); return attr; } template struct container_owner { // By default, do not add the back-reference (for value types) // Specialization below will check the reference for pointer types. static bool back_reference(PyObject* /*child*/, PyObject* /*owner*/) { return false; } }; template <> struct container_owner { /* * Call to add a back-reference to the owning object when returning a * reference from a container. Will only set the reference if child * is a SWIG wrapper object that does not own the pointer. * * returns whether the reference was set or not */ static bool back_reference(PyObject* child, PyObject* owner) { SwigPyObject* swigThis = SWIG_Python_GetSwigThis(child); if (swigThis && (swigThis->own & SWIG_POINTER_OWN) != SWIG_POINTER_OWN) { return PyObject_SetAttr(child, container_owner_attribute(), owner) != -1; } return false; } }; } } %fragment(SWIG_Traits_frag(swig::SwigPtr_PyObject),"header",fragment="StdTraits") { namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "SwigPtr_PyObject"; } }; template <> struct traits_from { typedef SwigPtr_PyObject value_type; static PyObject *from(const value_type& val) { PyObject *obj = static_cast(val); Py_XINCREF(obj); return obj; } }; template <> struct traits_check { static bool check(SwigPtr_PyObject) { return true; } }; template <> struct traits_asval { typedef SwigPtr_PyObject value_type; static int asval(PyObject *obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; } } %fragment(SWIG_Traits_frag(swig::SwigVar_PyObject),"header",fragment="StdTraits") { namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "SwigVar_PyObject"; } }; template <> struct traits_from { typedef SwigVar_PyObject value_type; static PyObject *from(const value_type& val) { PyObject *obj = static_cast(val); Py_XINCREF(obj); return obj; } }; template <> struct traits_check { static bool check(SwigVar_PyObject) { return true; } }; template <> struct traits_asval { typedef SwigVar_PyObject value_type; static int asval(PyObject *obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; } } %fragment("SwigPySequence_Base","header",fragment="",fragment="StdTraits") { %#include namespace std { template <> struct less { bool operator()(PyObject * v, PyObject *w) const { bool res; SWIG_PYTHON_THREAD_BEGIN_BLOCK; res = PyObject_RichCompareBool(v, w, Py_LT) ? true : false; /* This may fall into a case of inconsistent eg. ObjA > ObjX > ObjB but ObjA < ObjB */ if( PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_TypeError) ) { /* Objects can't be compared, this mostly occurred in Python 3.0 */ /* Compare their ptr directly for a workaround */ res = (v < w); PyErr_Clear(); } SWIG_PYTHON_THREAD_END_BLOCK; return res; } }; template <> struct less { bool operator()(const swig::SwigPtr_PyObject& v, const swig::SwigPtr_PyObject& w) const { return std::less()(v, w); } }; template <> struct less { bool operator()(const swig::SwigVar_PyObject& v, const swig::SwigVar_PyObject& w) const { return std::less()(v, w); } }; } namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "PyObject *"; } }; template <> struct traits_asval { typedef PyObject * value_type; static int asval(PyObject *obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; template <> struct traits_check { static bool check(PyObject *) { return true; } }; template <> struct traits_from { typedef PyObject * value_type; static PyObject *from(const value_type& val) { Py_XINCREF(val); return val; } }; } namespace swig { template inline size_t check_index(Difference i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } template void slice_adjust(Difference i, Difference j, Py_ssize_t step, size_t size, Difference &ii, Difference &jj, bool insert = false) { if (step == 0) { throw std::invalid_argument("slice step cannot be zero"); } else if (step > 0) { // Required range: 0 <= i < size, 0 <= j < size, i <= j if (i < 0) { ii = 0; } else if (i < (Difference)size) { ii = i; } else if (insert && (i >= (Difference)size)) { ii = (Difference)size; } if (j < 0) { jj = 0; } else { jj = (j < (Difference)size) ? j : (Difference)size; } if (jj < ii) jj = ii; } else { // Required range: -1 <= i < size-1, -1 <= j < size-1, i >= j if (i < -1) { ii = -1; } else if (i < (Difference) size) { ii = i; } else if (i >= (Difference)(size-1)) { ii = (Difference)(size-1); } if (j < -1) { jj = -1; } else { jj = (j < (Difference)size ) ? j : (Difference)(size-1); } if (ii < jj) ii = jj; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline void erase(Sequence* seq, const typename Sequence::iterator& position) { seq->erase(position); } template struct traits_reserve { static void reserve(Sequence & /*seq*/, typename Sequence::size_type /*n*/) { // This should be specialized for types that support reserve } }; template inline Sequence* getslice(const Sequence* self, Difference i, Difference j, Py_ssize_t step) { typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj); if (step > 0) { typename Sequence::const_iterator sb = self->begin(); typename Sequence::const_iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); if (step == 1) { return new Sequence(sb, se); } else { Sequence *sequence = new Sequence(); swig::traits_reserve::reserve(*sequence, (jj - ii + step - 1) / step); typename Sequence::const_iterator it = sb; while (it!=se) { sequence->push_back(*it); for (Py_ssize_t c=0; c::reserve(*sequence, (ii - jj - step - 1) / -step); typename Sequence::const_reverse_iterator sb = self->rbegin(); typename Sequence::const_reverse_iterator se = self->rbegin(); std::advance(sb,size-ii-1); std::advance(se,size-jj-1); typename Sequence::const_reverse_iterator it = sb; while (it!=se) { sequence->push_back(*it); for (Py_ssize_t c=0; c<-step && it!=se; ++c) it++; } return sequence; } } template inline void setslice(Sequence* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) { typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj, true); if (step > 0) { if (step == 1) { size_t ssize = jj - ii; if (ssize <= is.size()) { // expanding/staying the same size swig::traits_reserve::reserve(*self, self->size() - ssize + is.size()); typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator isit = is.begin(); std::advance(sb,ii); std::advance(isit, jj - ii); self->insert(std::copy(is.begin(), isit, sb), isit, is.end()); } else { // shrinking typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); sb = self->begin(); std::advance(sb,ii); self->insert(sb, is.begin(), is.end()); } } else { size_t replacecount = (jj - ii + step - 1) / step; if (is.size() != replacecount) { char msg[1024]; sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount); throw std::invalid_argument(msg); } typename Sequence::const_iterator isit = is.begin(); typename Sequence::iterator it = self->begin(); std::advance(it,ii); for (size_t rc=0; rcend(); ++rc) { *it++ = *isit++; for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c) it++; } } } else { size_t replacecount = (ii - jj - step - 1) / -step; if (is.size() != replacecount) { char msg[1024]; sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount); throw std::invalid_argument(msg); } typename Sequence::const_iterator isit = is.begin(); typename Sequence::reverse_iterator it = self->rbegin(); std::advance(it,size-ii-1); for (size_t rc=0; rcrend(); ++rc) { *it++ = *isit++; for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c) it++; } } } template inline void delslice(Sequence* self, Difference i, Difference j, Py_ssize_t step) { typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj, true); if (step > 0) { typename Sequence::iterator sb = self->begin(); std::advance(sb,ii); if (step == 1) { typename Sequence::iterator se = self->begin(); std::advance(se,jj); self->erase(sb,se); } else { typename Sequence::iterator it = sb; size_t delcount = (jj - ii + step - 1) / step; while (delcount) { it = self->erase(it); for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c) it++; delcount--; } } } else { typename Sequence::reverse_iterator sb = self->rbegin(); std::advance(sb,size-ii-1); typename Sequence::reverse_iterator it = sb; size_t delcount = (ii - jj - step - 1) / -step; while (delcount) { it = typename Sequence::reverse_iterator(self->erase((++it).base())); for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c) it++; delcount--; } } } } } %fragment("SwigPySequence_Cont","header", fragment="StdTraits", fragment="SwigPySequence_Base", fragment="SwigPyIterator_T") { namespace swig { template struct SwigPySequence_Ref { SwigPySequence_Ref(PyObject* seq, Py_ssize_t index) : _seq(seq), _index(index) { } operator T () const { swig::SwigVar_PyObject item = PySequence_GetItem(_seq, _index); try { return swig::as(item); } catch (const std::invalid_argument& e) { char msg[1024]; sprintf(msg, "in sequence element %d ", (int)_index); if (!PyErr_Occurred()) { ::%type_error(swig::type_name()); } SWIG_Python_AddErrorMsg(msg); SWIG_Python_AddErrorMsg(e.what()); throw; } } SwigPySequence_Ref& operator=(const T& v) { PySequence_SetItem(_seq, _index, swig::from(v)); return *this; } private: PyObject* _seq; Py_ssize_t _index; }; template struct SwigPySequence_ArrowProxy { SwigPySequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; template struct SwigPySequence_InputIterator { typedef SwigPySequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef Py_ssize_t difference_type; SwigPySequence_InputIterator() { } SwigPySequence_InputIterator(PyObject* seq, Py_ssize_t index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } SwigPySequence_ArrowProxy operator->() const { return SwigPySequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index) && (_seq == ri._seq); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: PyObject* _seq; difference_type _index; }; // STL container wrapper around a Python sequence template struct SwigPySequence_Cont { typedef SwigPySequence_Ref reference; typedef const SwigPySequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef Py_ssize_t difference_type; typedef size_t size_type; typedef const pointer const_pointer; typedef SwigPySequence_InputIterator iterator; typedef SwigPySequence_InputIterator const_iterator; SwigPySequence_Cont(PyObject* seq) : _seq(0) { if (!PySequence_Check(seq)) { throw std::invalid_argument("a sequence is expected"); } _seq = seq; Py_INCREF(_seq); } ~SwigPySequence_Cont() { Py_XDECREF(_seq); } size_type size() const { return static_cast(PySequence_Size(_seq)); } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } bool check() const { Py_ssize_t s = size(); for (Py_ssize_t i = 0; i < s; ++i) { swig::SwigVar_PyObject item = PySequence_GetItem(_seq, i); if (!swig::check(item)) return false; } return true; } private: PyObject* _seq; }; } } %define %swig_sequence_iterator(Sequence...) %swig_sequence_iterator_with_making_function(swig::make_output_iterator,Sequence...) %enddef %define %swig_sequence_forward_iterator(Sequence...) %swig_sequence_iterator_with_making_function(swig::make_output_forward_iterator,Sequence...) %enddef %define %swig_sequence_iterator_with_making_function(Make_output_iterator,Sequence...) #if defined(SWIG_EXPORT_ITERATOR_METHODS) class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; %typemap(out,noblock=1,fragment="SwigPySequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { $result = SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); } %typemap(out,noblock=1,fragment="SwigPySequence_Cont") std::pair, std::pair { $result = PyTuple_New(2); PyTuple_SetItem($result,0,SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &).first), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); PyTuple_SetItem($result,1,SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &).second), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); } %fragment("SwigPyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="SwigPySequence_Cont") {} %typemap(out,noblock=1,fragment="SwigPyPairBoolOutputIterator") std::pair, std::pair { $result = PyTuple_New(2); PyTuple_SetItem($result,0,SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &).first), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); PyTuple_SetItem($result,1,SWIG_From(bool)(%static_cast($1,const $type &).second)); } %typemap(in,noblock=1,fragment="SwigPySequence_Cont") iterator(swig::SwigPyIterator *iter = 0, int res), reverse_iterator(swig::SwigPyIterator *iter = 0, int res), const_iterator(swig::SwigPyIterator *iter = 0, int res), const_reverse_iterator(swig::SwigPyIterator *iter = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::SwigPyIterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="SwigPySequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %fragment("SwigPySequence_Cont"); %newobject iterator(PyObject **PYTHON_SELF); %extend { swig::SwigPyIterator* iterator(PyObject **PYTHON_SELF) { return Make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "tp_iter", functype="getiterfunc") iterator; #else %pythoncode %{def __iter__(self): return self.iterator()%} #endif } #endif //SWIG_EXPORT_ITERATOR_METHODS %enddef /**** The python container methods ****/ %define %swig_container_methods(Container...) /* deprecated in Python 2 */ #if 1 %newobject __getslice__; #endif %newobject __getitem__(PySliceObject *slice); #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "nb_nonzero", functype="inquiry") __nonzero__; %feature("python:slot", "sq_length", functype="lenfunc") __len__; #endif // SWIGPYTHON_BUILTIN %extend { bool __nonzero__() const { return !(self->empty()); } /* Alias for Python 3 compatibility */ bool __bool__() const { return !(self->empty()); } size_type __len__() const { return self->size(); } // Although __getitem__, front, back actually use a const value_type& return type, the typemaps below // use non-const so that they can be easily overridden by users if necessary. %typemap(ret, fragment="reference_container_owner", noblock=1) value_type& __getitem__, value_type& front, value_type& back { (void)swig::container_owner::category>::back_reference($result, $self); } } %enddef %define %swig_sequence_methods_common(Sequence...) %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) %fragment("SwigPySequence_Base"); #if defined(SWIGPYTHON_BUILTIN) //%feature("python:slot", "sq_item", functype="ssizeargfunc") __getitem__; //%feature("python:slot", "sq_slice", functype="ssizessizeargfunc") __getslice__; //%feature("python:slot", "sq_ass_item", functype="ssizeobjargproc") __setitem__; //%feature("python:slot", "sq_ass_slice", functype="ssizessizeobjargproc") __setslice__; %feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__; %feature("python:slot", "mp_ass_subscript", functype="objobjargproc") __setitem__; #endif // SWIGPYTHON_BUILTIN %extend { /* typemap for slice object support */ %typemap(in) PySliceObject* { if (!PySlice_Check($input)) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } $1 = (PySliceObject *) $input; } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER) PySliceObject* { $1 = PySlice_Check($input); } /* deprecated in Python 2 */ #if 1 Sequence* __getslice__(difference_type i, difference_type j) throw (std::out_of_range, std::invalid_argument) { return swig::getslice(self, i, j, 1); } void __setslice__(difference_type i, difference_type j) throw (std::out_of_range, std::invalid_argument) { swig::setslice(self, i, j, 1, Sequence()); } void __setslice__(difference_type i, difference_type j, const Sequence& v) throw (std::out_of_range, std::invalid_argument) { swig::setslice(self, i, j, 1, v); } void __delslice__(difference_type i, difference_type j) throw (std::out_of_range, std::invalid_argument) { swig::delslice(self, i, j, 1); } #endif void __delitem__(difference_type i) throw (std::out_of_range, std::invalid_argument) { swig::erase(self, swig::getpos(self, i)); } /* Overloaded methods for Python 3 compatibility * (Also useful in Python 2.x) */ Sequence* __getitem__(PySliceObject *slice) throw (std::out_of_range, std::invalid_argument) { Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return NULL; } PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); Sequence::difference_type id = i; Sequence::difference_type jd = j; return swig::getslice(self, id, jd, step); } void __setitem__(PySliceObject *slice, const Sequence& v) throw (std::out_of_range, std::invalid_argument) { Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); Sequence::difference_type id = i; Sequence::difference_type jd = j; swig::setslice(self, id, jd, step, v); } void __setitem__(PySliceObject *slice) throw (std::out_of_range, std::invalid_argument) { Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); Sequence::difference_type id = i; Sequence::difference_type jd = j; swig::delslice(self, id, jd, step); } void __delitem__(PySliceObject *slice) throw (std::out_of_range, std::invalid_argument) { Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); Sequence::difference_type id = i; Sequence::difference_type jd = j; swig::delslice(self, id, jd, step); } } %enddef %define %swig_sequence_methods_non_resizable(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %extend { const value_type& __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __setitem__(difference_type i, const value_type& x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } #if defined(SWIGPYTHON_BUILTIN) // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(difference_type i) throw (std::out_of_range, std::invalid_argument) { swig::erase(self, swig::getpos(self, i)); } #endif } %enddef %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_non_resizable(%arg(Sequence)) %extend { value_type pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty container"); Sequence::value_type x = self->back(); self->pop_back(); return x; } void append(const value_type& x) { self->push_back(x); } } %enddef %define %swig_sequence_methods_non_resizable_val(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %extend { value_type __getitem__(difference_type i) throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __setitem__(difference_type i, value_type x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } #if defined(SWIGPYTHON_BUILTIN) // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(difference_type i) throw (std::out_of_range, std::invalid_argument) { swig::erase(self, swig::getpos(self, i)); } #endif } %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods_non_resizable_val(%arg(Sequence)) %extend { value_type pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty container"); Sequence::value_type x = self->back(); self->pop_back(); return x; } void append(value_type x) { self->push_back(x); } } %enddef // // Common fragments // %fragment("StdSequenceTraits","header", fragment="StdTraits", fragment="SwigPySequence_Cont") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, Seq* seq) { // seq->assign(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(PyObject *obj, sequence **seq) { if (obj == Py_None || SWIG_Python_GetSwigThis(obj)) { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(::SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } } else if (PySequence_Check(obj)) { try { SwigPySequence_Cont swigpyseq(obj); if (seq) { sequence *pseq = new sequence(); assign(swigpyseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return swigpyseq.check() ? SWIG_OK : SWIG_ERROR; } } catch (std::exception& e) { if (seq) { if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, e.what()); } } return SWIG_ERROR; } } return SWIG_ERROR; } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static PyObject *from(const sequence& seq) { %#ifdef SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN); } %#endif size_type size = seq.size(); if (size <= (size_type)INT_MAX) { PyObject *obj = PyTuple_New((Py_ssize_t)size); Py_ssize_t i = 0; for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) { PyTuple_SetItem(obj,i,swig::from(*it)); } return obj; } else { PyErr_SetString(PyExc_OverflowError,"sequence size not valid in python"); return NULL; } } }; } } swig-4.0.2/Lib/python/pyuserdir.swg0000644000175000017500000001410313667507523017160 0ustar williamwilliam/* ------------------------------------------------------------------------- * Special user directives * ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* shadow code */ #define %shadow %insert("shadow") #define %pythoncode %insert("python") #define %pythonbegin %insert("pythonbegin") /* ------------------------------------------------------------------------- */ /* Use the "nondynamic" feature to make a wrapped class behave as a "nondynamic" one, ie, a python class that doesn't dynamically add new attributes. For example, for the class %pythonnondynamic A; struct A { int a; int b; }; you will get: aa = A() aa.a = 1 # Ok aa.b = 1 # Ok aa.c = 3 # error Since nondynamic is a feature, if you use it like %pythonnondynamic; it will make all the wrapped classes nondynamic ones. The implementation is based on this recipe: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252158 */ #define %pythonnondynamic %feature("python:nondynamic", "1") #define %nopythonnondynamic %feature("python:nondynamic", "0") #define %clearpythonnondynamic %feature("python:nondynamic", "") #define %pythondynamic %nopythonnondynamic /* ------------------------------------------------------------------------- */ /* Use %pythonmaybecall to flag a method like __add__ or __radd__. These don't produce an error when called, they just return NotImplemented. These methods "may be called" if needed. */ #define %pythonmaybecall %feature("python:maybecall", "1") #define %nopythonmaybecall %feature("python:maybecall", "0") #define %clearpythonmaybecall %feature("python:maybecall", "") /* ------------------------------------------------------------------------- */ /* The %pythoncallback feature produce a more natural callback wrapper than the %callback mechanism, ie, it uses the original name for the callback and callable objects. Just use it as %pythoncallback(1) foo; int foo(int a); %pythoncallback(1) A::foo; struct A { static int foo(int a); }; int bar(int, int (*pf)(int)); then, you can use it as: a = foo(1) b = bar(2, foo) c = A.foo(3) d = bar(4, A.foo) If you use it with a member method %pythoncallback(1) A::foom; struct A { int foom(int a); }; then you can use it as r = a.foom(3) # eval the method mptr = A.foom_cb_ptr # returns the callback pointer where the '_cb_ptr' suffix is added for the callback pointer. */ #define %pythoncallback %feature("python:callback") #define %nopythoncallback %feature("python:callback","0") #define %clearpythoncallback %feature("python:callback","") /* ------------------------------------------------------------------------- */ /* Support for the old %callback directive name */ #ifdef %callback #undef %callback #endif #ifdef %nocallback #undef %nocallback #endif #ifdef %clearcallback #undef %clearcallback #endif #define %callback(x) %feature("python:callback",`x`) #define %nocallback %nopythoncallback #define %clearcallback %clearpythoncallback /* ------------------------------------------------------------------------- */ /* Thread support - Advance control */ #define %nothread %feature("nothread") #define %thread %feature("nothread","0") #define %clearnothread %feature("nothread","") #define %nothreadblock %feature("nothreadblock") #define %threadblock %feature("nothreadblock","0") #define %clearnothreadblock %feature("nothreadblock","") #define %nothreadallow %feature("nothreadallow") #define %threadallow %feature("nothreadallow","0") #define %clearnothreadallow %feature("nothreadallow","") /* ------------------------------------------------------------------------- */ /* Implicit Conversion using the C++ constructor mechanism */ #define %implicitconv %feature("implicitconv") #define %noimplicitconv %feature("implicitconv", "0") #define %clearimplicitconv %feature("implicitconv", "") /* ------------------------------------------------------------------------- */ /* Enable keywords parameters */ #define %kwargs %feature("kwargs") #define %nokwargs %feature("kwargs", "0") #define %clearkwargs %feature("kwargs", "") /* ------------------------------------------------------------------------- */ /* Add python code to the proxy/shadow code %pythonprepend - Add code before the C++ function is called %pythonappend - Add code after the C++ function is called */ #define %pythonprepend %feature("pythonprepend") #define %clearpythonprepend %feature("pythonprepend","") #define %pythonappend %feature("pythonappend") #define %clearpythonappend %feature("pythonappend","") /* ------------------------------------------------------------------------- */ /* %extend_smart_pointer extend the smart pointer support. For example, if you have a smart pointer as: template class RCPtr { public: ... RCPtr(Type *p); Type * operator->() const; ... }; you use the %extend_smart_pointer directive as: %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; then, if you have something like: RCPtr make_ptr(); int foo(A *); you can do the following: a = make_ptr(); b = foo(a); ie, swig will accept a RCPtr object where a 'A *' is expected. Also, when using vectors %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; %template(vector_A) std::vector >; you can type a = A(); v = vector_A(2) v[0] = a ie, an 'A *' object is accepted, via implicit conversion, where a RCPtr object is expected. Additionally x = v[0] returns (and sets 'x' as) a copy of v[0], making reference counting possible and consistent. */ %define %extend_smart_pointer(Type...) %implicitconv Type; %apply const SWIGTYPE& SMARTPOINTER { const Type& }; %apply SWIGTYPE SMARTPOINTER { Type }; %enddef swig-4.0.2/Lib/python/argcargv.i0000644000175000017500000000512213667507523016357 0ustar williamwilliam/* ------------------------------------------------------------ * --- Argc & Argv --- * ------------------------------------------------------------ */ %fragment("SWIG_AsArgcArgv","header",fragment="SWIG_AsCharPtrAndSize") { SWIGINTERN int SWIG_AsArgcArgv(PyObject *input, swig_type_info *ppchar_info, size_t *argc, char ***argv, int *owner) { void *vptr; int res = SWIG_ConvertPtr(input, &vptr, ppchar_info, 0); if (!SWIG_IsOK(res)) { int list = 0; PyErr_Clear(); list = PyList_Check(input); if (list || PyTuple_Check(input)) { size_t i = 0; size_t size = list ? PyList_Size(input) : PyTuple_Size(input); if (argc) *argc = size; if (argv) { *argv = %new_array(size + 1, char*); for (; i < size; ++i) { PyObject *obj = list ? PyList_GetItem(input,i) : PyTuple_GetItem(input,i); char *cptr = 0; size_t sz = 0; int alloc = 0; res = SWIG_AsCharPtrAndSize(obj, &cptr, &sz, &alloc); if (SWIG_IsOK(res)) { if (cptr && sz) { (*argv)[i] = (alloc == SWIG_NEWOBJ) ? cptr : %new_copy_array(cptr, sz, char); } else { (*argv)[i] = 0; } } else { return SWIG_TypeError; } } (*argv)[i] = 0; if (owner) *owner = 1; } else { for (; i < size; ++i) { PyObject *obj = list ? PyList_GetItem(input,i) : PyTuple_GetItem(input,i); res = SWIG_AsCharPtrAndSize(obj, 0, 0, 0); if (!SWIG_IsOK(res)) return SWIG_TypeError; } if (owner) *owner = 0; } return SWIG_OK; } else { return SWIG_TypeError; } } else { /* seems dangerous, but the user asked for it... */ size_t i = 0; if (argv) { while (*argv[i] != 0) ++i;} if (argc) *argc = i; if (owner) *owner = 0; return SWIG_OK; } } } /* This typemap works with either a char **, a python list or a python tuple */ %typemap(in,noblock=0,fragment="SWIG_AsArgcArgv") (int ARGC, char **ARGV) (int res,char **argv = 0, size_t argc = 0, int owner= 0) { res = SWIG_AsArgcArgv($input, $descriptor(char**), &argc, &argv, &owner); if (!SWIG_IsOK(res)) { $1 = 0; $2 = 0; %argument_fail(SWIG_TypeError, "int ARGC, char **ARGV", $symname, $argnum); } else { $1 = %static_cast(argc,$1_ltype); $2 = %static_cast(argv, $2_ltype); } } %typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { int res = SWIG_AsArgcArgv($input, $descriptor(char**), 0, 0, 0); $1 = SWIG_IsOK(res); } %typemap(freearg,noblock=1) (int ARGC, char **ARGV) { if (owner$argnum) { size_t i = argc$argnum; while (i) { %delete_array(argv$argnum[--i]); } %delete_array(argv$argnum); } } swig-4.0.2/Lib/python/implicit.i0000644000175000017500000000043713667507523016401 0ustar williamwilliam%include %include #warning "This file provides the %implicit directive, which is an old and fragile" #warning "way to implement the C++ implicit conversion mechanism." #warning "Try using the more robust '%implicitconv Type;' directive instead." swig-4.0.2/Lib/python/std_streambuf.i0000644000175000017500000000003713667507523017425 0ustar williamwilliam%include swig-4.0.2/Lib/python/std_common.i0000644000175000017500000000441713667507523016733 0ustar williamwilliam%include %include /* Generate the traits for a 'primitive' type, such as 'double', for which the SWIG_AsVal and SWIG_From methods are already defined. */ %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(PyObject *obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static PyObject *from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(PyObject *obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static PyObject *from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-4.0.2/Lib/python/std_wstreambuf.i0000644000175000017500000000004013667507523017606 0ustar williamwilliam%include swig-4.0.2/Lib/python/pytypemaps.swg0000644000175000017500000000620113667507523017345 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Python * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ #ifdef SWIG_PYTHON_LEGACY_BOOL // Default prior to SWIG 3.0.0 #undef SWIG_TYPECHECK_BOOL %define SWIG_TYPECHECK_BOOL 10000 %enddef #endif /* Include fundamental fragment definitions */ %include /* Look for user fragments file. */ %include /* Python fragments for fundamental types */ %include /* Python fragments for char* strings */ %include /* Backward compatibility output helper */ %fragment("t_output_helper","header") %{ #define t_output_helper SWIG_Python_AppendOutput %} /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* directors are supported in Python */ #ifndef SWIG_DIRECTOR_TYPEMAPS #define SWIG_DIRECTOR_TYPEMAPS #endif /* Python types */ #define SWIG_Object PyObject * #define VOID_Object SWIG_Py_Void() /* Python allows implicit conversion */ #define %implicitconv_flag $implicitconv /* Overload of the output/constant/exception/dirout handling */ /* append output */ #define SWIG_AppendOutput(result, obj) SWIG_Python_AppendOutput(result, obj) /* set constant */ #if defined(SWIGPYTHON_BUILTIN) #define SWIG_SetConstant(name, obj) SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, name,obj) #else #define SWIG_SetConstant(name, obj) SWIG_Python_SetConstant(d, name,obj) #endif /* raise */ #define SWIG_Raise(obj, type, desc) SWIG_Python_Raise(obj, type, desc) /* Include the unified typemap library */ %include /* ------------------------------------------------------------ * Python extra typemaps / typemap overrides * ------------------------------------------------------------ */ /* Get the address of the 'python self' object */ %typemap(in,numinputs=0,noblock=1) PyObject **PYTHON_SELF { $1 = &$self; } /* Consttab, needed for callbacks, it should be removed later */ %typemap(consttab) SWIGTYPE ((*)(ANY)) { SWIG_PY_POINTER, "$symname", 0, 0, (void *)($value), &$descriptor } %typemap(consttab) SWIGTYPE ((* const)(ANY)) = SWIGTYPE ((*)(ANY)); %typemap(constcode) SWIGTYPE ((*)(ANY)) ""; %typemap(constcode) SWIGTYPE ((* const)(ANY)) = SWIGTYPE ((*)(ANY)); /* Smart Pointers */ %typemap(out,noblock=1) const SWIGTYPE & SMARTPOINTER { $result = SWIG_NewPointerObj(%new_copy(*$1, $*ltype), $descriptor, SWIG_POINTER_OWN | %newpointer_flags); } %typemap(ret,noblock=1) const SWIGTYPE & SMARTPOINTER, SWIGTYPE SMARTPOINTER { if ($result) { PyObject *robj = PyObject_CallMethod($result, (char *)"__deref__", NULL); if (robj && !PyErr_Occurred()) { SwigPyObject_append((PyObject *) SWIG_Python_GetSwigThis($result), (PyObject *) SWIG_Python_GetSwigThis(robj)); Py_DECREF(robj); } } } swig-4.0.2/Lib/python/std_wsstream.i0000644000175000017500000000003613667507523017301 0ustar williamwilliam%include swig-4.0.2/Lib/python/std_except.i0000644000175000017500000000004313667507523016722 0ustar williamwilliam%include swig-4.0.2/Lib/python/complex.i0000644000175000017500000000012013667507523016223 0ustar williamwilliam#ifdef __cplusplus %include #else %include #endif swig-4.0.2/Lib/python/pybackward.swg0000644000175000017500000000221213667507523017257 0ustar williamwilliam/* adding backward compatibility macros */ #define SWIG_arg(x...) %arg(x) #define SWIG_Mangle(x...) %mangle(x) #define SWIG_As_frag(Type...) %fragment_name(As, Type) #define SWIG_As_name(Type...) %symbol_name(As, Type) #define SWIG_As(Type...) SWIG_As_name(Type) SWIG_AS_CALL_ARGS #define SWIG_Check_frag(Type...) %fragment_name(Check, Type) #define SWIG_Check_name(Type...) %symbol_name(Check, Type) #define SWIG_Check(Type...) SWIG_Check_name(Type) SWIG_AS_CALL_ARGS %define %ascheck_methods(Code, Type...) %fragment(SWIG_As_frag(Type),"header", fragment=SWIG_AsVal_frag(Type)) { SWIGINTERNINLINE Type SWIG_As(Type)(PyObject* obj) { Type v; int res = SWIG_AsVal(Type)(obj, &v); if (!SWIG_IsOK(res)) { /* this is needed to make valgrind/purify happier. */ memset((void*)&v, 0, sizeof(Type)); SWIG_Error(res, ""); } return v; } } %fragment(SWIG_Check_frag(Type),"header",fragment=SWIG_AsVal_frag(Type)) { SWIGINTERNINLINE int SWIG_Check(Type)(PyObject* obj) { int res = SWIG_AsVal(Type)(obj, (Type*)0); return SWIG_IsOK(res); } } %enddef %apply_checkctypes(%ascheck_methods) swig-4.0.2/Lib/python/typemaps.i0000644000175000017500000001054513667507523016432 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * These mappings provide support for input/output arguments and common * uses for C/C++ pointers. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Python tuple. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Python output of the function would be a tuple containing both output values. */ // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Python tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Python). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Python variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %include swig-4.0.2/Lib/python/pyprimtypes.swg0000644000175000017500000001760613667507523017552 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE PyObject* SWIG_From_dec(bool)(bool value) { return PyBool_FromLong(value ? 1 : 0); } } #ifdef SWIG_PYTHON_LEGACY_BOOL // Default prior to SWIG 3.0.0 %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(PyObject *obj, bool *val) { int r = PyObject_IsTrue(obj); if (r == -1) return SWIG_ERROR; if (val) *val = r ? true : false; return SWIG_OK; } } #else %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(PyObject *obj, bool *val) { int r; if (!PyBool_Check(obj)) return SWIG_ERROR; r = PyObject_IsTrue(obj); if (r == -1) return SWIG_ERROR; if (val) *val = r ? true : false; return SWIG_OK; } } #endif /* int */ %fragment(SWIG_From_frag(int),"header") { SWIGINTERNINLINE PyObject* SWIG_From_dec(int)(int value) { return PyInt_FromLong((long) value); } } /* unsigned int */ %fragment(SWIG_From_frag(unsigned int),"header") { SWIGINTERNINLINE PyObject* SWIG_From_dec(unsigned int)(unsigned int value) { return PyInt_FromSize_t((size_t) value); } } /* long */ %fragment(SWIG_From_frag(long),"header") { %define_as(SWIG_From_dec(long), PyInt_FromLong) } %fragment(SWIG_AsVal_frag(long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(long)(PyObject *obj, long* val) { %#if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else %#endif if (PyLong_Check(obj)) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); return SWIG_OverflowError; } } %#ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; long v = PyInt_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } %#endif return SWIG_TypeError; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long)) { SWIGINTERNINLINE PyObject* SWIG_From_dec(unsigned long)(unsigned long value) { return (value > LONG_MAX) ? PyLong_FromUnsignedLong(value) : PyInt_FromLong(%numeric_cast(value,long)); } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(PyObject *obj, unsigned long *val) { %#if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(obj)) { long v = PyInt_AsLong(obj); if (v >= 0) { if (val) *val = v; return SWIG_OK; } else { return SWIG_OverflowError; } } else %#endif if (PyLong_Check(obj)) { unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); return SWIG_OverflowError; } } %#ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { if (val) *val = (unsigned long)(d); return res; } } } %#endif return SWIG_TypeError; } } /* long long */ %fragment(SWIG_From_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE PyObject* SWIG_From_dec(long long)(long long value) { return ((value < LONG_MIN) || (value > LONG_MAX)) ? PyLong_FromLongLong(value) : PyInt_FromLong(%numeric_cast(value,long)); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment=SWIG_AsVal_frag(long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(PyObject *obj, long long *val) { int res = SWIG_TypeError; if (PyLong_Check(obj)) { long long v = PyLong_AsLongLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); res = SWIG_OverflowError; } } else { long v; res = SWIG_AsVal(long)(obj,&v); if (SWIG_IsOK(res)) { if (val) *val = v; return res; } } %#ifdef SWIG_PYTHON_CAST_MODE { const double mant_max = 1LL << DBL_MANT_DIG; const double mant_min = -mant_max; double d; res = SWIG_AsVal(double)(obj,&d); if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, mant_min, mant_max)) return SWIG_OverflowError; if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) { if (val) *val = (long long)(d); return SWIG_AddCast(res); } res = SWIG_TypeError; } %#endif return res; } %#endif } /* unsigned long long */ %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE PyObject* SWIG_From_dec(unsigned long long)(unsigned long long value) { return (value > LONG_MAX) ? PyLong_FromUnsignedLongLong(value) : PyInt_FromLong(%numeric_cast(value,long)); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment=SWIG_AsVal_frag(unsigned long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(PyObject *obj, unsigned long long *val) { int res = SWIG_TypeError; if (PyLong_Check(obj)) { unsigned long long v = PyLong_AsUnsignedLongLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); res = SWIG_OverflowError; } } else { unsigned long v; res = SWIG_AsVal(unsigned long)(obj,&v); if (SWIG_IsOK(res)) { if (val) *val = v; return res; } } %#ifdef SWIG_PYTHON_CAST_MODE { const double mant_max = 1LL << DBL_MANT_DIG; double d; res = SWIG_AsVal(double)(obj,&d); if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, 0, mant_max)) return SWIG_OverflowError; if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) { if (val) *val = (unsigned long long)(d); return SWIG_AddCast(res); } res = SWIG_TypeError; } %#endif return res; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { %define_as(SWIG_From_dec(double), PyFloat_FromDouble) } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(PyObject *obj, double *val) { int res = SWIG_TypeError; if (PyFloat_Check(obj)) { if (val) *val = PyFloat_AsDouble(obj); return SWIG_OK; %#if PY_VERSION_HEX < 0x03000000 } else if (PyInt_Check(obj)) { if (val) *val = (double) PyInt_AsLong(obj); return SWIG_OK; %#endif } else if (PyLong_Check(obj)) { double v = PyLong_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } %#ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; double d = PyFloat_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = d; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); } else { PyErr_Clear(); } } } %#endif return res; } } swig-4.0.2/Lib/python/pyopers.swg0000644000175000017500000002375713667507523016652 0ustar williamwilliam/* ------------------------------------------------------------ * Overloaded operator support The directives in this file apply whether or not you use the -builtin option to SWIG, but operator overloads are particularly attractive when using -builtin, because they are much faster than named methods. If you're using the -builtin option to SWIG, and you want to define python operator overloads beyond the defaults defined in this file, here's what you need to know: There are two ways to define a python slot function: dispatch to a statically defined function; or dispatch to a method defined on the operand. To dispatch to a statically defined function, use %feature("python:"), where is the name of a field in a PyTypeObject, PyNumberMethods, PyMappingMethods, PySequenceMethods, or PyBufferProcs. For example: %feature("python:tp_hash") MyClass "myHashFunc"; class MyClass { public: ... }; %{ // Note: Py_hash_t was introduced in Python 3.2 static Py_hash_t myHashFunc(PyObject *pyobj) { MyClass *cobj; // Convert pyobj to cobj return (cobj->field1 * (cobj->field2 << 7)); } %} NOTE: It is the responsibility of the programmer (that's you) to ensure that a statically defined slot function has the correct signature. If, instead, you want to dispatch to an instance method, you can use %feature("python:slot"). For example: %feature("python:slot", "tp_hash", functype="hashfunc") MyClass::myHashFunc; class MyClass { public: Py_hash_t myHashFunc () const; ... }; NOTE: Some python slots use a method signature which does not match the signature of SWIG-wrapped methods. For those slots, SWIG will automatically generate a "closure" function to re-marshall the arguments before dispatching to the wrapped method. Setting the "functype" attribute of the feature enables SWIG to generate a correct closure function. -------------------------------------------------------------- The tp_richcompare slot is a special case: SWIG automatically generates a rich compare function for all wrapped types. If a type defines C++ operator overloads for comparison (operator==, operator<, etc.), they will be called from the generated rich compare function. If you want to explicitly choose a method to handle a certain comparison operation, you may use a different feature, %feature("python:compare") like this: %feature("python:compare", "Py_LT") MyClass::lessThan; class MyClass { public: bool lessThan(const MyClass& other) const; ... }; ... where "Py_LT" is one of the rich comparison opcodes defined in the python header file object.h. If there's no method defined to handle a particular comparison operation, the default behavior is to compare pointer values of the wrapped C++ objects. -------------------------------------------------------------- For more information about python slots, including their names and signatures, you may refer to the python documentation : http://docs.python.org/c-api/typeobj.html * ------------------------------------------------------------ */ #ifdef __cplusplus #if defined(SWIGPYTHON_BUILTIN) #define %pybinoperator(pyname,oper,functp,slt) %rename(pyname) oper; %pythonmaybecall oper; %feature("python:slot", #slt, functype=#functp) oper; %feature("python:slot", #slt, functype=#functp) pyname; #define %pycompare(pyname,oper,comptype) %rename(pyname) oper; %pythonmaybecall oper; %feature("python:compare", #comptype) oper; %feature("python:compare", #comptype) pyname; #else #define %pybinoperator(pyname,oper,functp,slt) %rename(pyname) oper; %pythonmaybecall oper #define %pycompare(pyname,oper,comptype) %pybinoperator(pyname,oper,,comptype) #endif %pybinoperator(__add__, *::operator+, binaryfunc, nb_add); %pybinoperator(__pos__, *::operator+(), unaryfunc, nb_positive); %pybinoperator(__pos__, *::operator+() const, unaryfunc, nb_positive); %pybinoperator(__sub__, *::operator-, binaryfunc, nb_subtract); %pybinoperator(__neg__, *::operator-(), unaryfunc, nb_negative); %pybinoperator(__neg__, *::operator-() const, unaryfunc, nb_negative); %pybinoperator(__mul__, *::operator*, binaryfunc, nb_multiply); %pybinoperator(__mod__, *::operator%, binaryfunc, nb_remainder); %pybinoperator(__lshift__, *::operator<<, binaryfunc, nb_lshift); %pybinoperator(__rshift__, *::operator>>, binaryfunc, nb_rshift); %pybinoperator(__and__, *::operator&, binaryfunc, nb_and); %pybinoperator(__or__, *::operator|, binaryfunc, nb_or); %pybinoperator(__xor__, *::operator^, binaryfunc, nb_xor); %pycompare(__lt__, *::operator<, Py_LT); %pycompare(__le__, *::operator<=, Py_LE); %pycompare(__gt__, *::operator>, Py_GT); %pycompare(__ge__, *::operator>=, Py_GE); %pycompare(__eq__, *::operator==, Py_EQ); %pycompare(__ne__, *::operator!=, Py_NE); /* Special cases */ %rename(__invert__) *::operator~; %feature("python:slot", "nb_invert", functype="unaryfunc") *::operator~; %rename(__call__) *::operator(); %feature("python:slot", "tp_call", functype="ternarycallfunc") *::operator(); #if defined(SWIGPYTHON_BUILTIN) %pybinoperator(__nonzero__, *::operator bool, inquiry, nb_nonzero); %pybinoperator(__truediv__, *::operator/ , binaryfunc, nb_divide); #else %feature("shadow") *::operator bool %{ def __nonzero__(self): return $action(self) __bool__ = __nonzero__ %}; %rename(__nonzero__) *::operator bool; %feature("shadow") *::operator/ %{ def __truediv__(self, *args): return $action(self, *args) __div__ = __truediv__ %}; %rename(__truediv__) *::operator/; %pythonmaybecall *::operator/; #endif /* Ignored operators */ %ignoreoperator(LNOT) operator!; %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; %ignoreoperator(EQ) *::operator=; %ignoreoperator(PLUSPLUS) *::operator++; %ignoreoperator(MINUSMINUS) *::operator--; %ignoreoperator(ARROWSTAR) *::operator->*; %ignoreoperator(INDEX) *::operator[]; /* Inplace operator declarations. They translate the inplace C++ operators (+=, -=, ...) into the corresponding python equivalents(__iadd__,__isub__), etc, disabling the ownership of the input 'this' pointer, and assigning it to the returning object: %feature("del") *::Operator; // disables ownership by generating SWIG_POINTER_DISOWN %feature("new") *::Operator; // claims ownership by generating SWIG_POINTER_OWN This makes the most common case safe, ie: A& A::operator+=(int i) { ...; return *this; } ^^^^ ^^^^^^ will work fine, even when the resulting python object shares the 'this' pointer with the input one. The input object is usually deleted after the operation, including the shared 'this' pointer, producing 'strange' seg faults, as reported by Lucriz (lucriz@sitilandia.it). If you have an interface that already takes care of that, ie, you already are using inplace operators and you are not getting seg. faults, with the new scheme you could end with 'free' elements that never get deleted (maybe, not sure, it depends). But if that is the case, you could recover the old behaviour using %feature("del","0") A::operator+=; %feature("new","0") A::operator+=; which recovers the old behaviour for the class 'A', or if you are 100% sure your entire system works fine in the old way, use: %feature("del","") *::operator+=; %feature("new","") *::operator+=; The default behaviour assumes that the 'this' pointer's memory is already owned by the SWIG object; it relinquishes ownership then takes it back. This may not be the case though as the SWIG object might be owned by memory managed elsewhere, eg after calling a function that returns a C++ reference. In such case you will need to use the features above to recover the old behaviour too. */ #if defined(SWIGPYTHON_BUILTIN) #define %pyinplaceoper(SwigPyOper, Oper, functp, slt) %delobject Oper; %newobject Oper; %feature("python:slot", #slt, functype=#functp) Oper; %rename(SwigPyOper) Oper #else #define %pyinplaceoper(SwigPyOper, Oper, functp, slt) %delobject Oper; %newobject Oper; %rename(SwigPyOper) Oper #endif %pyinplaceoper(__iadd__ , *::operator +=, binaryfunc, nb_inplace_add); %pyinplaceoper(__isub__ , *::operator -=, binaryfunc, nb_inplace_subtract); %pyinplaceoper(__imul__ , *::operator *=, binaryfunc, nb_inplace_multiply); %pyinplaceoper(__imod__ , *::operator %=, binaryfunc, nb_inplace_remainder); %pyinplaceoper(__iand__ , *::operator &=, binaryfunc, nb_inplace_and); %pyinplaceoper(__ior__ , *::operator |=, binaryfunc, nb_inplace_or); %pyinplaceoper(__ixor__ , *::operator ^=, binaryfunc, nb_inplace_xor); %pyinplaceoper(__ilshift__, *::operator <<=, binaryfunc, nb_inplace_lshift); %pyinplaceoper(__irshift__, *::operator >>=, binaryfunc, nb_inplace_rshift); /* Special cases */ #if defined(SWIGPYTHON_BUILTIN) %pyinplaceoper(__itruediv__ , *::operator /=, binaryfunc, nb_inplace_divide); #else %delobject *::operator /=; %newobject *::operator /=; %feature("shadow") *::operator /= %{ def __itruediv__(self, *args): return $action(self, *args) __idiv__ = __itruediv__ %}; %rename(__itruediv__) *::operator /=; #endif /* Finally, in python we need to mark the binary operations to fail as 'maybecall' methods */ #define %pybinopermaybecall(oper) %pythonmaybecall __ ## oper ## __; %pythonmaybecall __r ## oper ## __ %pybinopermaybecall(add); %pybinopermaybecall(pos); %pybinopermaybecall(pos); %pybinopermaybecall(sub); %pybinopermaybecall(neg); %pybinopermaybecall(neg); %pybinopermaybecall(mul); %pybinopermaybecall(div); %pybinopermaybecall(truediv); %pybinopermaybecall(mod); %pybinopermaybecall(lshift); %pybinopermaybecall(rshift); %pybinopermaybecall(and); %pybinopermaybecall(or); %pybinopermaybecall(xor); %pybinopermaybecall(lt); %pybinopermaybecall(le); %pybinopermaybecall(gt); %pybinopermaybecall(ge); %pybinopermaybecall(eq); %pybinopermaybecall(ne); #endif swig-4.0.2/Lib/python/std_array.i0000644000175000017500000000715513667507523016563 0ustar williamwilliam/* std::array */ %fragment("StdArrayTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(PyObject *obj, std::array **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static PyObject *from(const std::array& vec) { return traits_from_stdseq >::from(vec); } }; template inline void assign(const SwigPySeq& swigpyseq, std::array* seq) { if (swigpyseq.size() < seq->size()) throw std::invalid_argument("std::array cannot be expanded in size"); else if (swigpyseq.size() > seq->size()) throw std::invalid_argument("std::array cannot be reduced in size"); std::copy(swigpyseq.begin(), swigpyseq.end(), seq->begin()); } template inline void erase(std::array* SWIGUNUSEDPARM(seq), const typename std::array::iterator& SWIGUNUSEDPARM(position)) { throw std::invalid_argument("std::array object does not support item deletion"); } // Only limited slicing is supported as std::array is fixed in size template inline std::array* getslice(const std::array* self, Difference i, Difference j, Py_ssize_t step) { typedef std::array Sequence; typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj); if (step == 1 && ii == 0 && static_cast(jj) == size) { Sequence *sequence = new Sequence(); std::copy(self->begin(), self->end(), sequence->begin()); return sequence; } else if (step == -1 && static_cast(ii) == (size - 1) && jj == -1) { Sequence *sequence = new Sequence(); std::copy(self->rbegin(), self->rend(), sequence->begin()); return sequence; } else { throw std::invalid_argument("std::array object only supports getting a slice that is the size of the array"); } } template inline void setslice(std::array* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) { typedef std::array Sequence; typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj, true); if (step == 1 && ii == 0 && static_cast(jj) == size) { std::copy(is.begin(), is.end(), self->begin()); } else if (step == -1 && static_cast(ii) == (size - 1) && jj == -1) { std::copy(is.rbegin(), is.rend(), self->begin()); } else { throw std::invalid_argument("std::array object only supports setting a slice that is the size of the array"); } } template inline void delslice(std::array* SWIGUNUSEDPARM(self), Difference SWIGUNUSEDPARM(i), Difference SWIGUNUSEDPARM(j), Py_ssize_t SWIGUNUSEDPARM(step)) { throw std::invalid_argument("std::array object does not support item deletion"); } } %} #define %swig_array_methods(Type...) %swig_sequence_methods_non_resizable(Type) #define %swig_array_methods_val(Type...) %swig_sequence_methods_non_resizable_val(Type); %include swig-4.0.2/Lib/python/embed.i0000644000175000017500000000474213667507523015646 0ustar williamwilliam// // embed.i // SWIG file embedding the Python interpreter in something else. // This file is deprecated and no longer actively maintained, but it still // seems to work with Python 2.7. Status with Python 3 is unknown. // // This file makes it possible to extend Python and all of its // built-in functions without having to hack its setup script. // #ifdef AUTODOC %subsection "embed.i" %text %{ This module provides support for building a new version of the Python executable. This will be necessary on systems that do not support shared libraries and may be necessary with C++ extensions. This file contains everything you need to build a new version of Python from include files and libraries normally installed with the Python language. This module will automatically grab all of the Python modules present in your current Python executable (including any special purpose modules you have enabled such as Tkinter). Thus, you may need to provide additional link libraries when compiling. As far as I know, this module is C++ safe. %} #endif %wrapper %{ #include #ifdef __cplusplus extern "C" #endif void SWIG_init(); /* Forward reference */ #define _PyImport_Inittab swig_inittab /* Grab Python's inittab[] structure */ #ifdef __cplusplus extern "C" { #endif #include #undef _PyImport_Inittab /* Now define our own version of it. Hopefully someone does not have more than 1000 built-in modules */ struct _inittab SWIG_Import_Inittab[1000]; static int swig_num_modules = 0; /* Function for adding modules to Python */ static void swig_add_module(char *name, void (*initfunc)()) { SWIG_Import_Inittab[swig_num_modules].name = name; SWIG_Import_Inittab[swig_num_modules].initfunc = initfunc; swig_num_modules++; SWIG_Import_Inittab[swig_num_modules].name = (char *) 0; SWIG_Import_Inittab[swig_num_modules].initfunc = 0; } /* Function to add all of Python's built-in modules to our interpreter */ static void swig_add_builtin() { int i = 0; while (swig_inittab[i].name) { swig_add_module(swig_inittab[i].name, swig_inittab[i].initfunc); i++; } #ifdef SWIGMODINIT SWIGMODINIT #endif /* Add SWIG builtin function */ swig_add_module(SWIG_name, SWIG_init); } #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif extern int Py_Main(int, char **); #ifdef __cplusplus } #endif extern struct _inittab *PyImport_Inittab; int main(int argc, char **argv) { swig_add_builtin(); PyImport_Inittab = SWIG_Import_Inittab; return Py_Main(argc,argv); } %} swig-4.0.2/Lib/python/carrays.i0000644000175000017500000000052213667507523016226 0ustar williamwilliam%define %array_class(TYPE,NAME) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "sq_item", functype="ssizeargfunc") NAME::__getitem__; %feature("python:slot", "sq_ass_item", functype="ssizeobjargproc") NAME::__setitem__; #endif %array_class_wrap(TYPE,NAME,__getitem__,__setitem__) %enddef %include swig-4.0.2/Lib/python/pystdcommon.swg0000644000175000017500000001566413667507523017523 0ustar williamwilliam%fragment("StdTraits","header",fragment="StdTraitsCommon") { namespace swig { /* Traits that provides the from method */ template struct traits_from_ptr { static PyObject *from(Type *val, int owner = 0) { return SWIG_InternalNewPointerObj(val, type_info(), owner); } }; template struct traits_from { static PyObject *from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static PyObject *from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static PyObject *from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline PyObject *from(const Type& val) { return traits_from::from(val); } template inline PyObject *from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } /* Traits that provides the asval/as/check method */ template struct traits_asptr { static int asptr(PyObject *obj, Type **val) { int res = SWIG_ERROR; swig_type_info *descriptor = type_info(); if (val) { Type *p = 0; int newmem = 0; res = descriptor ? SWIG_ConvertPtrAndOwn(obj, (void **)&p, descriptor, 0, &newmem) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (newmem & SWIG_CAST_NEW_MEMORY) { res |= SWIG_NEWOBJMASK; } *val = p; } } else { res = descriptor ? SWIG_ConvertPtr(obj, 0, descriptor, 0) : SWIG_ERROR; } return res; } }; template inline int asptr(PyObject *obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(PyObject *obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(PyObject *obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(PyObject *obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(PyObject *obj) { Type v; int res = asval(obj, &v); if (!obj || !SWIG_IsOK(res)) { if (!PyErr_Occurred()) { ::%type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } return v; } }; template struct traits_as { static Type as(PyObject *obj) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { if (!PyErr_Occurred()) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type* as(PyObject *obj) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res)) { return v; } else { if (!PyErr_Occurred()) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template inline Type as(PyObject *obj) { return traits_as::category>::as(obj); } template struct traits_check { static bool check(PyObject *obj) { int res = obj ? asval(obj, (Type *)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(PyObject *obj) { int res = obj ? asptr(obj, (Type **)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template inline bool check(PyObject *obj) { return traits_check::category>::check(obj); } } } // // Backward compatibility // #ifdef SWIG_PYTHON_BACKWARD_COMP %fragment(""); %{ PyObject* SwigInt_FromBool(bool b) { return PyInt_FromLong(b ? 1L : 0L); } double SwigNumber_Check(PyObject* o) { return PyFloat_Check(o) || PyInt_Check(o) || PyLong_Check(o); } double SwigNumber_AsDouble(PyObject* o) { return PyFloat_Check(o) ? PyFloat_AsDouble(o) : (PyInt_Check(o) ? double(PyInt_AsLong(o)) : double(PyLong_AsLong(o))); } PyObject* SwigString_FromString(const std::string& s) { return PyString_FromStringAndSize(s.data(),s.size()); } std::string SwigString_AsString(PyObject* o) { return std::string(PyString_AsString(o)); } %} #endif %define %specialize_std_container(Type,Check,As,From) %{ namespace swig { template <> struct traits_asval { typedef Type value_type; static int asval(PyObject *obj, value_type *val) { if (Check(obj)) { if (val) *val = As(obj); return SWIG_OK; } return SWIG_ERROR; } }; template <> struct traits_from { typedef Type value_type; static PyObject *from(const value_type& val) { return From(val); } }; template <> struct traits_check { static int check(PyObject *obj) { int res = Check(obj); return obj && res ? res : 0; } }; } %} %enddef #define specialize_std_vector(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_list(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_deque(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_set(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_multiset(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_unordered_set(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_unordered_multiset(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) swig-4.0.2/Lib/python/pymacros.swg0000644000175000017500000000004613667507523016770 0ustar williamwilliam%include swig-4.0.2/Lib/python/std_pair.i0000644000175000017500000001403713667507523016375 0ustar williamwilliam/* Pairs */ %include //#define SWIG_STD_PAIR_ASVAL %fragment("StdPairTraits","header",fragment="StdTraits") { namespace swig { #ifdef SWIG_STD_PAIR_ASVAL template struct traits_asval > { typedef std::pair value_type; static int get_pair(PyObject* first, PyObject* second, std::pair *val) { if (val) { T *pfirst = &(val->first); int res1 = swig::asval((PyObject*)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = &(val->second); int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } else { T *pfirst = 0; int res1 = swig::asval((PyObject*)first, 0); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asval(PyObject *obj, std::pair *val) { int res = SWIG_ERROR; if (PyTuple_Check(obj)) { if (PyTuple_GET_SIZE(obj) == 2) { res = get_pair(PyTuple_GET_ITEM(obj,0),PyTuple_GET_ITEM(obj,1), val); } } else if (PySequence_Check(obj)) { if (PySequence_Size(obj) == 2) { swig::SwigVar_PyObject first = PySequence_GetItem(obj,0); swig::SwigVar_PyObject second = PySequence_GetItem(obj,1); res = get_pair(first, second, val); } } else { value_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = *p; } return res; } }; #else template struct traits_asptr > { typedef std::pair value_type; static int get_pair(PyObject* first, PyObject* second, std::pair **val) { if (val) { value_type *vp = %new_instance(std::pair); T *pfirst = &(vp->first); int res1 = swig::asval((PyObject*)first, pfirst); if (!SWIG_IsOK(res1)) { %delete(vp); return res1; } U *psecond = &(vp->second); int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) { %delete(vp); return res2; } *val = vp; return SWIG_AddNewMask(res1 > res2 ? res1 : res2); } else { T *pfirst = 0; int res1 = swig::asval((PyObject*)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asptr(PyObject *obj, std::pair **val) { int res = SWIG_ERROR; if (PyTuple_Check(obj)) { if (PyTuple_GET_SIZE(obj) == 2) { res = get_pair(PyTuple_GET_ITEM(obj,0),PyTuple_GET_ITEM(obj,1), val); } } else if (PySequence_Check(obj)) { if (PySequence_Size(obj) == 2) { swig::SwigVar_PyObject first = PySequence_GetItem(obj,0); swig::SwigVar_PyObject second = PySequence_GetItem(obj,1); res = get_pair(first, second, val); } } else { value_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; #endif template struct traits_from > { static PyObject *from(const std::pair& val) { PyObject* obj = PyTuple_New(2); PyTuple_SetItem(obj,0,swig::from(val.first)); PyTuple_SetItem(obj,1,swig::from(val.second)); return obj; } }; } #if defined(SWIGPYTHON_BUILTIN) SWIGINTERN Py_ssize_t SwigPython_std_pair_len (PyObject *a) { return 2; } SWIGINTERN PyObject* SwigPython_std_pair_repr (PyObject *o) { PyObject *tuple = PyTuple_New(2); assert(tuple); PyTuple_SET_ITEM(tuple, 0, PyObject_GetAttrString(o, (char*) "first")); PyTuple_SET_ITEM(tuple, 1, PyObject_GetAttrString(o, (char*) "second")); PyObject *result = PyObject_Repr(tuple); Py_DECREF(tuple); return result; } SWIGINTERN PyObject* SwigPython_std_pair_getitem (PyObject *a, Py_ssize_t b) { PyObject *result = PyObject_GetAttrString(a, b % 2 ? (char*) "second" : (char*) "first"); return result; } SWIGINTERN int SwigPython_std_pair_setitem (PyObject *a, Py_ssize_t b, PyObject *c) { int result = PyObject_SetAttrString(a, b % 2 ? (char*) "second" : (char*) "first", c); return result; } #endif } %feature("python:sq_length") std::pair "SwigPython_std_pair_len"; %feature("python:sq_length") std::pair "SwigPython_std_pair_len"; %feature("python:sq_length") std::pair "SwigPython_std_pair_len"; %feature("python:sq_length") std::pair "SwigPython_std_pair_len"; %feature("python:tp_repr") std::pair "SwigPython_std_pair_repr"; %feature("python:tp_repr") std::pair "SwigPython_std_pair_repr"; %feature("python:tp_repr") std::pair "SwigPython_std_pair_repr"; %feature("python:tp_repr") std::pair "SwigPython_std_pair_repr"; %feature("python:sq_item") std::pair "SwigPython_std_pair_getitem"; %feature("python:sq_item") std::pair "SwigPython_std_pair_getitem"; %feature("python:sq_item") std::pair "SwigPython_std_pair_getitem"; %feature("python:sq_item") std::pair "SwigPython_std_pair_getitem"; %feature("python:sq_ass_item") std::pair "SwigPython_std_pair_setitem"; %feature("python:sq_ass_item") std::pair "SwigPython_std_pair_setitem"; %feature("python:sq_ass_item") std::pair "SwigPython_std_pair_setitem"; %feature("python:sq_ass_item") std::pair "SwigPython_std_pair_setitem"; %define %swig_pair_methods(pair...) #if !defined(SWIGPYTHON_BUILTIN) %extend { %pythoncode %{def __len__(self): return 2 def __repr__(self): return str((self.first, self.second)) def __getitem__(self, index): if not (index % 2): return self.first else: return self.second def __setitem__(self, index, val): if not (index % 2): self.first = val else: self.second = val%} } #endif %enddef %include swig-4.0.2/Lib/python/std_wios.i0000644000175000017500000000003213667507523016411 0ustar williamwilliam%include swig-4.0.2/Lib/python/std_auto_ptr.i0000644000175000017500000000111113667507523017264 0ustar williamwilliam/* The typemaps here allow to handle functions returning std::auto_ptr<>, which is the most common use of this type. If you have functions taking it as parameter, these typemaps can't be used for them and you need to do something else (e.g. use shared_ptr<> which SWIG supports fully). */ %define %auto_ptr(TYPE) %typemap (out) std::auto_ptr %{ %set_output(SWIG_NewPointerObj($1.release(), $descriptor(TYPE *), SWIG_POINTER_OWN | %newpointer_flags)); %} %template() std::auto_ptr; %enddef namespace std { template class auto_ptr {}; } swig-4.0.2/Lib/python/pydocs.swg0000644000175000017500000000332513667507523016437 0ustar williamwilliam // Documentation for use with the autodoc feature. #ifdef SWIG_DOC_DOXYGEN_STYLE %typemap(doc) SWIGTYPE "@param $1_name $1_type"; %typemap(doc) SWIGTYPE * "@param $1_name $1_type"; %typemap(doc) const SWIGTYPE & "@param $1_name $1_type"; %typemap(doc) const SWIGTYPE && "@param $1_name $1_type"; %typemap(doc) enum SWIGTYPE "@param $1_name enum $1_type"; %typemap(doc) SWIGTYPE *INOUT, SWIGTYPE &INOUT "@param $1_name $1_type (input/output)"; %typemap(doc) SWIGTYPE *INPUT, SWIGTYPE &INPUT "@param $1_name $1_type (input)"; %typemap(doc) SWIGTYPE *OUTPUT, SWIGTYPE &OUTPUT "@param $1_name $1_type (output)"; #else %typemap(doc) SWIGTYPE "$1_name: $1_type"; %typemap(doc) SWIGTYPE * "$1_name: $1_type"; %typemap(doc) const SWIGTYPE & "$1_name: $1_type"; %typemap(doc) const SWIGTYPE && "$1_name: $1_type"; %typemap(doc) enum SWIGTYPE "$1_name: enum $1_type"; %typemap(doc) SWIGTYPE *INOUT, SWIGTYPE &INOUT "$1_name: $1_type (input/output)"; %typemap(doc) SWIGTYPE *INPUT, SWIGTYPE &INPUT "$1_name: $1_type (input)"; %typemap(doc) SWIGTYPE *OUTPUT, SWIGTYPE &OUTPUT "$1_name: $1_type (output)"; #endif // Types to use in Python documentation for the parameters of the given C++ type. %typemap(doctype) bool "boolean"; %define int_doctype_for_cppint_type(cppint_type) %typemap(doctype) cppint_type, unsigned cppint_type "int"; %enddef %formacro(int_doctype_for_cppint_type, short, int, long, long long) %typemap(doctype) size_t "int"; %typemap(doctype) enum SWIGTYPE "int"; %typemap(doctype) float, double, long double "float"; %typemap(doctype) char*, std::string "string"; %typemap(doctype) SWIGTYPE "$1_basetype" %typemap(doctype) SWIGTYPE * "$typemap(doctype, $*1_ltype)" %typemap(doctype) SWIGTYPE & "$typemap(doctype, $*1_ltype)" swig-4.0.2/Lib/python/std_char_traits.i0000644000175000017500000000004113667507523017733 0ustar williamwilliam%include swig-4.0.2/Lib/python/pystrings.swg0000644000175000017500000000760613667507523017206 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) { %#if PY_VERSION_HEX>=0x03000000 %#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) if (PyBytes_Check(obj)) %#else if (PyUnicode_Check(obj)) %#endif %#else if (PyString_Check(obj)) %#endif { char *cstr; Py_ssize_t len; int ret = SWIG_OK; %#if PY_VERSION_HEX>=0x03000000 %#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) if (!alloc && cptr) { /* We can't allow converting without allocation, since the internal representation of string in Python 3 is UCS-2/UCS-4 but we require a UTF-8 representation. TODO(bhy) More detailed explanation */ return SWIG_RuntimeError; } obj = PyUnicode_AsUTF8String(obj); if (!obj) return SWIG_TypeError; if (alloc) *alloc = SWIG_NEWOBJ; %#endif if (PyBytes_AsStringAndSize(obj, &cstr, &len) == -1) return SWIG_TypeError; %#else if (PyString_AsStringAndSize(obj, &cstr, &len) == -1) return SWIG_TypeError; %#endif if (cptr) { if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = %new_copy_array(cstr, len + 1, char); *alloc = SWIG_NEWOBJ; } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } else { %#if PY_VERSION_HEX>=0x03000000 %#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) *cptr = PyBytes_AsString(obj); %#else assert(0); /* Should never reach here with Unicode strings in Python 3 */ %#endif %#else *cptr = SWIG_Python_str_AsChar(obj); if (!*cptr) ret = SWIG_TypeError; %#endif } } if (psize) *psize = len + 1; %#if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) Py_XDECREF(obj); %#endif return ret; } else { %#if defined(SWIG_PYTHON_2_UNICODE) %#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) %#error "Cannot use both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at once" %#endif %#if PY_VERSION_HEX<0x03000000 if (PyUnicode_Check(obj)) { char *cstr; Py_ssize_t len; if (!alloc && cptr) { return SWIG_RuntimeError; } obj = PyUnicode_AsUTF8String(obj); if (!obj) return SWIG_TypeError; if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) { if (cptr) { if (alloc) *alloc = SWIG_NEWOBJ; *cptr = %new_copy_array(cstr, len + 1, char); } if (psize) *psize = len + 1; Py_XDECREF(obj); return SWIG_OK; } else { Py_XDECREF(obj); } } %#endif %#endif swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE PyObject * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); return pchar_descriptor ? SWIG_InternalNewPointerObj(%const_cast(carray,char *), pchar_descriptor, 0) : SWIG_Py_Void(); } else { %#if PY_VERSION_HEX >= 0x03000000 %#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) return PyBytes_FromStringAndSize(carray, %numeric_cast(size, Py_ssize_t)); %#else return PyUnicode_DecodeUTF8(carray, %numeric_cast(size, Py_ssize_t), "surrogateescape"); %#endif %#else return PyString_FromStringAndSize(carray, %numeric_cast(size, Py_ssize_t)); %#endif } } else { return SWIG_Py_Void(); } } } swig-4.0.2/Lib/python/pyfragments.swg0000644000175000017500000000104713667507523017474 0ustar williamwilliam/* Create a file with this name, 'pyfragments.swg', in your working directory and add all the %fragments you want to take precedence over the default ones defined by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(PyObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-4.0.2/Lib/python/pyhead.swg0000644000175000017500000000507113667507523016410 0ustar williamwilliam/* Compatibility macros for Python 3 */ #if PY_VERSION_HEX >= 0x03000000 #define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) #define PyInt_Check(x) PyLong_Check(x) #define PyInt_AsLong(x) PyLong_AsLong(x) #define PyInt_FromLong(x) PyLong_FromLong(x) #define PyInt_FromSize_t(x) PyLong_FromSize_t(x) #define PyString_Check(name) PyBytes_Check(name) #define PyString_FromString(x) PyUnicode_FromString(x) #define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) #define PyString_AsString(str) PyBytes_AsString(str) #define PyString_Size(str) PyBytes_Size(str) #define PyString_InternFromString(key) PyUnicode_InternFromString(key) #define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE #define PyString_AS_STRING(x) PyUnicode_AS_STRING(x) #define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) #endif #ifndef Py_TYPE # define Py_TYPE(op) ((op)->ob_type) #endif /* SWIG APIs for compatibility of both Python 2 & 3 */ #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_FromFormat PyUnicode_FromFormat #else # define SWIG_Python_str_FromFormat PyString_FromFormat #endif /* Warning: This function will allocate a new string in Python 3, * so please call SWIG_Python_str_DelForPy3(x) to free the space. */ SWIGINTERN char* SWIG_Python_str_AsChar(PyObject *str) { #if PY_VERSION_HEX >= 0x03030000 return (char *)PyUnicode_AsUTF8(str); #elif PY_VERSION_HEX >= 0x03000000 char *newstr = 0; str = PyUnicode_AsUTF8String(str); if (str) { char *cstr; Py_ssize_t len; if (PyBytes_AsStringAndSize(str, &cstr, &len) != -1) { newstr = (char *) malloc(len+1); if (newstr) memcpy(newstr, cstr, len+1); } Py_XDECREF(str); } return newstr; #else return PyString_AsString(str); #endif } #if PY_VERSION_HEX >= 0x03030000 || PY_VERSION_HEX < 0x03000000 # define SWIG_Python_str_DelForPy3(x) #else # define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) #endif SWIGINTERN PyObject* SWIG_Python_str_FromChar(const char *c) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_FromString(c); #else return PyString_FromString(c); #endif } #ifndef PyObject_DEL # define PyObject_DEL PyObject_Del #endif // SWIGPY_USE_CAPSULE is no longer used within SWIG itself, but some user // interface files check for it. # define SWIGPY_USE_CAPSULE # define SWIGPY_CAPSULE_NAME ("swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) #if PY_VERSION_HEX < 0x03020000 #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) #define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) #define Py_hash_t long #endif swig-4.0.2/Lib/python/stl.i0000644000175000017500000000044313667507523015366 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/python/pythonkw.swg0000644000175000017500000000452513667507523017024 0ustar williamwilliam/* Warnings for Python keywords, built-in names and bad names. */ #define PYTHONKW(x) %keywordwarn("'" `x` "' is a python keyword, renaming to '_" `x` "'", rename="_%s") `x` #define PYTHONBN(x) %builtinwarn("'" `x` "' conflicts with a built-in name in python") `x` /* Warnings for Python keywords https://docs.python.org/2/reference/lexical_analysis.html#keywords */ PYTHONKW(and); PYTHONKW(as); PYTHONKW(assert); PYTHONKW(async); PYTHONKW(await); PYTHONKW(break); PYTHONKW(class); PYTHONKW(continue); PYTHONKW(def); PYTHONKW(del); PYTHONKW(elif); PYTHONKW(else); PYTHONKW(except); PYTHONKW(exec); PYTHONKW(finally); PYTHONKW(for); PYTHONKW(from); PYTHONKW(global); PYTHONKW(if); PYTHONKW(import); PYTHONKW(in); PYTHONKW(is); PYTHONKW(lambda); PYTHONKW(not); PYTHONKW(or); PYTHONKW(pass); PYTHONKW(print); PYTHONKW(raise); PYTHONKW(return); PYTHONKW(try); PYTHONKW(while); PYTHONKW(with); PYTHONKW(yield); /* built-in functions https://docs.python.org/2/library/functions.html */ PYTHONBN(abs); PYTHONBN(apply); PYTHONBN(bool); PYTHONBN(buffer); PYTHONBN(callable); PYTHONBN(chr); PYTHONBN(classmethod); PYTHONBN(cmp); PYTHONBN(coerce); PYTHONBN(compile); PYTHONBN(complex); PYTHONBN(delattr); PYTHONBN(dict); PYTHONBN(dir); PYTHONBN(divmod); PYTHONBN(enumerate); PYTHONBN(eval); PYTHONBN(execfile); PYTHONBN(file); PYTHONBN(filter); PYTHONBN(float); PYTHONBN(frozenset); PYTHONBN(getattr); PYTHONBN(globals); PYTHONBN(hasattr); PYTHONBN(hash); PYTHONBN(hex); PYTHONBN(id); PYTHONBN(input); PYTHONBN(int); PYTHONBN(intern); PYTHONBN(isinstance); PYTHONBN(issubclass); PYTHONBN(iter); PYTHONBN(len); PYTHONBN(list); PYTHONBN(locals); PYTHONBN(long); PYTHONBN(map); PYTHONBN(max); PYTHONBN(min); PYTHONBN(object); PYTHONBN(oct); PYTHONBN(open); PYTHONBN(ord); PYTHONBN(pow); PYTHONBN(property); PYTHONBN(range); PYTHONBN(raw_input); PYTHONBN(reduce); PYTHONBN(reload); PYTHONBN(repr); PYTHONBN(reversed); PYTHONBN(round); PYTHONBN(set); PYTHONBN(setattr); PYTHONBN(slice); PYTHONBN(sorted); PYTHONBN(staticmethod); PYTHONBN(str); PYTHONBN(sum); PYTHONBN(super); PYTHONBN(tuple); PYTHONBN(type); PYTHONBN(unichr); PYTHONBN(unicode); PYTHONBN(vars); PYTHONBN(xrange); PYTHONBN(zip); /* built-in names boolean type and None */ PYTHONBN(True); PYTHONBN(False); PYTHONKW(None); /* 'self' is also a bad Name */ PYTHONKW(self); #undef PYTHONBN #undef PYTHONKW swig-4.0.2/Lib/python/pyabc.i0000644000175000017500000000067613667507523015672 0ustar williamwilliam%define %pythonabc(Type, Abc) %feature("python:abc", #Abc) Type; %enddef %pythoncode %{import collections.abc%} %pythonabc(std::vector, collections.abc.MutableSequence); %pythonabc(std::list, collections.abc.MutableSequence); %pythonabc(std::map, collections.abc.MutableMapping); %pythonabc(std::multimap, collections.abc.MutableMapping); %pythonabc(std::set, collections.abc.MutableSet); %pythonabc(std::multiset, collections.abc.MutableSet); swig-4.0.2/Lib/python/README0000644000175000017500000000756013667507523015301 0ustar williamwilliam/* ----------------------------------------------------------------------------- * * User interfaces: include these ones as needed * * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Special types and user helpers * ----------------------------------------------------------------------------- */ argcargv.i Handler for (int argc, char **argv) attribute.i Convert a pair of set/get methods into a "native" python attribute ccomplex.i C99 complex type complex.i C99 or C++ complex type cstring.i Various forms of C character string handling cwstring.i Various forms of C wchar_t string handling embed.i embedding the Python interpreter in something else file.i FILE C type implicit.i Allow the use of implicit C++ constructors wchar.i wchar_t C type /* ----------------------------------------------------------------------------- * C++ STD + STL * ----------------------------------------------------------------------------- */ std_alloc.i allocator std_basic_string.i basic string std_char_traits.i char traits std_complex.i complex std_deque.i deque std_except.i exceptions std_ios.i ios std_iostream.i istream/ostream std_list.i list std_map.i map std_multimap.i multimap std_multiset.i multiset std_pair.i pair std_set.i set std_sstream.i string stream std_streambuf.i streambuf std_string.i string std_vector.i vector std_wios.i wios std_wiostream.i wistream/wostream std_wsstream.i wstring stream std_wstreambuf.i wstreambuf std_wstring.i wstring /* ----------------------------------------------------------------------------- /* * Implementation files: don't look at them unless you are really drunk * * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Basic files * ----------------------------------------------------------------------------- */ python.swg Main language file, it just includes what is needed. pyuserdir.swg User visible directives (%pythonnondynamic, etc) pymacros.swg Internal macros used for typemaps pyfragments.swg Allow the user to overload the default fragments pyopers.swg Python operations (+=, *=, etc) pythonkw.swg Python keywords and special names pyinit.swg Python Init method /* ----------------------------------------------------------------------------- * The runtime part * ----------------------------------------------------------------------------- */ pyruntime.swg Main runtime file definition pyapi.swg SWIG/Python API declarations pyrun.swg Python run-time code /* ----------------------------------------------------------------------------- * Internal typemap specializations * ----------------------------------------------------------------------------- */ pyswigtype.swg SWIGTYPE pystrings.swg Char strings (char *) pywstrings.swg Wchar Strings (wchar_t *) pyprimtypes.swg Primitive types (shot,int,double,etc) pycomplex.swg PyComplex and helper for C/C++ complex types pydocs.swg Typemaps documentation /* ----------------------------------------------------------------------------- * C++ STD + STL * ----------------------------------------------------------------------------- */ pycontainer.swg python container iterators std_common.i general common code for the STD/STL implementation std_container.i general common code for the STD/STL containers /*----------------------------------------------------------------------------- * Backward compatibility and deprecated * ----------------------------------------------------------------------------- */ std_vectora.i vector + allocator (allocators are now supported in STD/STL) typemaps.i old in/out typemaps (doesn't need to be included) defarg.swg for processing default arguments with shadow classes swig-4.0.2/Lib/python/exception.i0000644000175000017500000000021313667507523016555 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg); SWIG_fail; )) } swig-4.0.2/Lib/python/pybuffer.i0000644000175000017500000000573613667507523016420 0ustar williamwilliam/* Implementing buffer protocol typemaps */ /* %pybuffer_mutable_binary(TYPEMAP, SIZE) * * Macro for functions accept mutable buffer pointer with a size. * This can be used for both input and output. For example: * * %pybuffer_mutable_binary(char *buff, int size); * void foo(char *buff, int size) { * for(int i=0; i struct traits_asptr > { static int asptr(PyObject *obj, std::list **lis) { return traits_asptr_stdseq >::asptr(obj, lis); } }; template struct traits_from > { static PyObject *from(const std::list& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/python/pycomplex.swg0000644000175000017500000000430313667507523017153 0ustar williamwilliam/* Defines the As/From converters for double/float complex, you need to provide complex Type, the Name you want to use in the converters, the complex Constructor method, and the Real and Imag complex accessor methods. See the std_complex.i and ccomplex.i for concrete examples. */ /* the common from converter */ %define %swig_fromcplx_conv(Type, Real, Imag) %fragment(SWIG_From_frag(Type),"header") { SWIGINTERNINLINE PyObject* SWIG_From(Type)(%ifcplusplus(const Type&, Type) c) { return PyComplex_FromDoubles(Real(c), Imag(c)); } } %enddef /* the double case */ %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal(Type) (PyObject *o, Type* val) { if (PyComplex_Check(o)) { if (val) *val = Constructor(PyComplex_RealAsDouble(o), PyComplex_ImagAsDouble(o)); return SWIG_OK; } else { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef /* the float case */ %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float)) { SWIGINTERN int SWIG_AsVal(Type)(PyObject *o, Type *val) { if (PyComplex_Check(o)) { double re = PyComplex_RealAsDouble(o); double im = PyComplex_ImagAsDouble(o); if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else { return SWIG_OverflowError; } } else { float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(re, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-4.0.2/Lib/python/builtin.swg0000644000175000017500000006310213667507523016603 0ustar williamwilliam#ifdef __cplusplus extern "C" { #endif SWIGINTERN Py_hash_t SwigPyObject_hash(PyObject *obj) { SwigPyObject *sobj = (SwigPyObject *)obj; void *ptr = sobj->ptr; return (Py_hash_t)ptr; } SWIGINTERN Py_hash_t SWIG_PyNumber_AsPyHash(PyObject *obj) { Py_hash_t result = -1; #if PY_VERSION_HEX < 0x03020000 if (PyInt_Check(obj)) result = PyInt_AsLong(obj); else if (PyLong_Check(obj)) result = PyLong_AsLong(obj); #else if (PyNumber_Check(obj)) result = PyNumber_AsSsize_t(obj, NULL); #endif else PyErr_Format(PyExc_TypeError, "Wrong type for hash function"); return PyErr_Occurred() ? -1 : result; } SWIGINTERN int SwigPyBuiltin_BadInit(PyObject *self, PyObject *SWIGUNUSEDPARM(args), PyObject *SWIGUNUSEDPARM(kwds)) { PyErr_Format(PyExc_TypeError, "Cannot create new instances of type '%.300s'", self->ob_type->tp_name); return -1; } SWIGINTERN void SwigPyBuiltin_BadDealloc(PyObject *obj) { SwigPyObject *sobj = (SwigPyObject *)obj; if (sobj->own) { PyErr_Format(PyExc_TypeError, "Swig detected a memory leak in type '%.300s': no callable destructor found.", obj->ob_type->tp_name); } } typedef struct { PyCFunction get; PyCFunction set; } SwigPyGetSet; SWIGINTERN PyObject * SwigPyBuiltin_GetterClosure (PyObject *obj, void *closure) { SwigPyGetSet *getset; PyObject *tuple, *result; if (!closure) return SWIG_Py_Void(); getset = (SwigPyGetSet *)closure; if (!getset->get) return SWIG_Py_Void(); tuple = PyTuple_New(0); assert(tuple); result = (*getset->get)(obj, tuple); Py_DECREF(tuple); return result; } SWIGINTERN PyObject * SwigPyBuiltin_FunpackGetterClosure (PyObject *obj, void *closure) { SwigPyGetSet *getset; PyObject *result; if (!closure) return SWIG_Py_Void(); getset = (SwigPyGetSet *)closure; if (!getset->get) return SWIG_Py_Void(); result = (*getset->get)(obj, NULL); return result; } SWIGINTERN int SwigPyBuiltin_SetterClosure (PyObject *obj, PyObject *val, void *closure) { SwigPyGetSet *getset; PyObject *tuple, *result; if (!closure) { PyErr_Format(PyExc_TypeError, "Missing getset closure"); return -1; } getset = (SwigPyGetSet *)closure; if (!getset->set) { PyErr_Format(PyExc_TypeError, "Illegal member variable assignment in type '%.300s'", obj->ob_type->tp_name); return -1; } tuple = PyTuple_New(1); assert(tuple); Py_INCREF(val); PyTuple_SET_ITEM(tuple, 0, val); result = (*getset->set)(obj, tuple); Py_DECREF(tuple); Py_XDECREF(result); return result ? 0 : -1; } SWIGINTERN int SwigPyBuiltin_FunpackSetterClosure (PyObject *obj, PyObject *val, void *closure) { SwigPyGetSet *getset; PyObject *result; if (!closure) { PyErr_Format(PyExc_TypeError, "Missing getset closure"); return -1; } getset = (SwigPyGetSet *)closure; if (!getset->set) { PyErr_Format(PyExc_TypeError, "Illegal member variable assignment in type '%.300s'", obj->ob_type->tp_name); return -1; } result = (*getset->set)(obj, val); Py_XDECREF(result); return result ? 0 : -1; } SWIGINTERN void SwigPyStaticVar_dealloc(PyDescrObject *descr) { PyObject_GC_UnTrack(descr); Py_XDECREF(PyDescr_TYPE(descr)); Py_XDECREF(PyDescr_NAME(descr)); PyObject_GC_Del(descr); } SWIGINTERN PyObject * SwigPyStaticVar_repr(PyGetSetDescrObject *descr) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_FromFormat("", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name); #else return PyString_FromFormat("", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name); #endif } SWIGINTERN int SwigPyStaticVar_traverse(PyObject *self, visitproc visit, void *arg) { PyDescrObject *descr; descr = (PyDescrObject *)self; Py_VISIT((PyObject*) PyDescr_TYPE(descr)); return 0; } SWIGINTERN PyObject * SwigPyStaticVar_get(PyGetSetDescrObject *descr, PyObject *obj, PyObject *SWIGUNUSEDPARM(type)) { if (descr->d_getset->get != NULL) return descr->d_getset->get(obj, descr->d_getset->closure); #if PY_VERSION_HEX >= 0x03000000 PyErr_Format(PyExc_AttributeError, "attribute '%.300S' of '%.100s' objects is not readable", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name); #else PyErr_Format(PyExc_AttributeError, "attribute '%.300s' of '%.100s' objects is not readable", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name); #endif return NULL; } SWIGINTERN int SwigPyStaticVar_set(PyGetSetDescrObject *descr, PyObject *obj, PyObject *value) { if (descr->d_getset->set != NULL) return descr->d_getset->set(obj, value, descr->d_getset->closure); #if PY_VERSION_HEX >= 0x03000000 PyErr_Format(PyExc_AttributeError, "attribute '%.300S' of '%.100s' objects is not writable", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name); #else PyErr_Format(PyExc_AttributeError, "attribute '%.300s' of '%.100s' objects is not writable", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name); #endif return -1; } SWIGINTERN int SwigPyObjectType_setattro(PyObject *typeobject, PyObject *name, PyObject *value) { PyObject *attribute; PyTypeObject *type; descrsetfunc local_set; assert(PyType_Check(typeobject)); type = (PyTypeObject *)typeobject; attribute = _PyType_Lookup(type, name); if (attribute != NULL) { /* Implement descriptor functionality, if any */ local_set = attribute->ob_type->tp_descr_set; if (local_set != NULL) return local_set(attribute, (PyObject *)type, value); #if PY_VERSION_HEX >= 0x03000000 PyErr_Format(PyExc_AttributeError, "cannot modify read-only attribute '%.50s.%.400S'", type->tp_name, name); #else PyErr_Format(PyExc_AttributeError, "cannot modify read-only attribute '%.50s.%.400s'", type->tp_name, PyString_AS_STRING(name)); #endif } else { #if PY_VERSION_HEX >= 0x03000000 PyErr_Format(PyExc_AttributeError, "type '%.50s' has no attribute '%.400S'", type->tp_name, name); #else PyErr_Format(PyExc_AttributeError, "type '%.50s' has no attribute '%.400s'", type->tp_name, PyString_AS_STRING(name)); #endif } return -1; } SWIGINTERN PyTypeObject* SwigPyStaticVar_Type(void) { static PyTypeObject staticvar_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(&PyType_Type, 0) #else PyObject_HEAD_INIT(&PyType_Type) 0, /* ob_size */ #endif "swig_static_var_getset_descriptor", /* tp_name */ sizeof(PyGetSetDescrObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyStaticVar_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ (reprfunc)SwigPyStaticVar_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_CLASS, /* tp_flags */ 0, /* tp_doc */ SwigPyStaticVar_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ (descrgetfunc)SwigPyStaticVar_get, /* tp_descr_get */ (descrsetfunc)SwigPyStaticVar_set, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0, /* tp_del */ 0, /* tp_version_tag */ #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #if PY_VERSION_HEX >= 0x03080000 0, /* tp_vectorcall */ #endif #if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) 0, /* tp_print */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ 0, /* tp_prev */ 0 /* tp_next */ #endif }; staticvar_type = tmp; type_init = 1; if (PyType_Ready(&staticvar_type) < 0) return NULL; } return &staticvar_type; } SWIGINTERN PyTypeObject* SwigPyObjectType(void) { static char swigpyobjecttype_doc[] = "Metaclass for SWIG wrapped types"; static PyTypeObject swigpyobjecttype_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(&PyType_Type, 0) #else PyObject_HEAD_INIT(&PyType_Type) 0, /* ob_size */ #endif "SwigPyObjectType", /* tp_name */ PyType_Type.tp_basicsize, /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ SwigPyObjectType_setattro, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_CLASS, /* tp_flags */ swigpyobjecttype_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0, /* tp_del */ 0, /* tp_version_tag */ #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #if PY_VERSION_HEX >= 0x03080000 0, /* tp_vectorcall */ #endif #if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) 0, /* tp_print */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ 0, /* tp_prev */ 0 /* tp_next */ #endif }; swigpyobjecttype_type = tmp; type_init = 1; swigpyobjecttype_type.tp_base = &PyType_Type; if (PyType_Ready(&swigpyobjecttype_type) < 0) return NULL; } return &swigpyobjecttype_type; } SWIGINTERN PyGetSetDescrObject * SwigPyStaticVar_new_getset(PyTypeObject *type, PyGetSetDef *getset) { PyGetSetDescrObject *descr; descr = (PyGetSetDescrObject *)PyType_GenericAlloc(SwigPyStaticVar_Type(), 0); assert(descr); Py_XINCREF(type); PyDescr_TYPE(descr) = type; PyDescr_NAME(descr) = PyString_InternFromString(getset->name); descr->d_getset = getset; if (PyDescr_NAME(descr) == NULL) { Py_DECREF(descr); descr = NULL; } return descr; } SWIGINTERN void SwigPyBuiltin_InitBases (PyTypeObject *type, PyTypeObject **bases) { Py_ssize_t base_count = 0; PyTypeObject **b; PyObject *tuple; Py_ssize_t i; if (!bases[0]) { bases[0] = SwigPyObject_type(); bases[1] = NULL; } type->tp_base = bases[0]; Py_INCREF((PyObject *)bases[0]); for (b = bases; *b != NULL; ++b) ++base_count; tuple = PyTuple_New(base_count); for (i = 0; i < base_count; ++i) { Py_INCREF((PyObject *)bases[i]); PyTuple_SET_ITEM(tuple, i, (PyObject *)bases[i]); } type->tp_bases = tuple; } SWIGINTERN PyObject * SwigPyBuiltin_ThisClosure (PyObject *self, void *SWIGUNUSEDPARM(closure)) { PyObject *result; result = (PyObject *)SWIG_Python_GetSwigThis(self); Py_XINCREF(result); return result; } SWIGINTERN void SwigPyBuiltin_SetMetaType (PyTypeObject *type, PyTypeObject *metatype) { #if PY_VERSION_HEX >= 0x03000000 type->ob_base.ob_base.ob_type = metatype; #else type->ob_type = metatype; #endif } /* Start of callback function macros for use in PyTypeObject */ typedef PyObject *(*SwigPyWrapperFunction)(PyObject *, PyObject *); #define SWIGPY_UNARYFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_unaryfunc_closure(PyObject *a) { \ return SwigPyBuiltin_unaryfunc_closure(wrapper, a); \ } SWIGINTERN PyObject * SwigPyBuiltin_unaryfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { return wrapper(a, NULL); } #define SWIGPY_DESTRUCTOR_CLOSURE(wrapper) \ SWIGINTERN void \ wrapper##_destructor_closure(PyObject *a) { \ SwigPyBuiltin_destructor_closure(wrapper, #wrapper, a); \ } SWIGINTERN void SwigPyBuiltin_destructor_closure(SwigPyWrapperFunction wrapper, const char *wrappername, PyObject *a) { SwigPyObject *sobj; sobj = (SwigPyObject *)a; Py_XDECREF(sobj->dict); if (sobj->own) { PyObject *o; PyObject *type = 0, *value = 0, *traceback = 0; PyErr_Fetch(&type, &value, &traceback); o = wrapper(a, NULL); if (!o) { PyObject *deallocname = PyString_FromString(wrappername); PyErr_WriteUnraisable(deallocname); Py_DECREF(deallocname); } PyErr_Restore(type, value, traceback); Py_XDECREF(o); } if (PyType_IS_GC(a->ob_type)) { PyObject_GC_Del(a); } else { PyObject_Del(a); } } #define SWIGPY_INQUIRY_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_inquiry_closure(PyObject *a) { \ return SwigPyBuiltin_inquiry_closure(wrapper, a); \ } SWIGINTERN int SwigPyBuiltin_inquiry_closure(SwigPyWrapperFunction wrapper, PyObject *a) { PyObject *pyresult; int result; pyresult = wrapper(a, NULL); result = pyresult && PyObject_IsTrue(pyresult) ? 1 : 0; Py_XDECREF(pyresult); return result; } #define SWIGPY_GETITERFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_getiterfunc_closure(PyObject *a) { \ return SwigPyBuiltin_getiterfunc_closure(wrapper, a); \ } SWIGINTERN PyObject * SwigPyBuiltin_getiterfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { return wrapper(a, NULL); } #define SWIGPY_BINARYFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_binaryfunc_closure(PyObject *a, PyObject *b) { \ return SwigPyBuiltin_binaryfunc_closure(wrapper, a, b); \ } SWIGINTERN PyObject * SwigPyBuiltin_binaryfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b) { PyObject *tuple, *result; tuple = PyTuple_New(1); assert(tuple); Py_INCREF(b); PyTuple_SET_ITEM(tuple, 0, b); result = wrapper(a, tuple); Py_DECREF(tuple); return result; } typedef ternaryfunc ternarycallfunc; #define SWIGPY_TERNARYFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ternaryfunc_closure(PyObject *a, PyObject *b, PyObject *c) { \ return SwigPyBuiltin_ternaryfunc_closure(wrapper, a, b, c); \ } SWIGINTERN PyObject * SwigPyBuiltin_ternaryfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b, PyObject *c) { PyObject *tuple, *result; tuple = PyTuple_New(2); assert(tuple); Py_INCREF(b); PyTuple_SET_ITEM(tuple, 0, b); Py_INCREF(c); PyTuple_SET_ITEM(tuple, 1, c); result = wrapper(a, tuple); Py_DECREF(tuple); return result; } #define SWIGPY_TERNARYCALLFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ternarycallfunc_closure(PyObject *a, PyObject *b, PyObject *c) { \ return SwigPyBuiltin_ternarycallfunc_closure(wrapper, a, b, c); \ } SWIGINTERN PyObject * SwigPyBuiltin_ternarycallfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b, PyObject *c) { (void) c; return wrapper(a, b); } #define SWIGPY_LENFUNC_CLOSURE(wrapper) \ SWIGINTERN Py_ssize_t \ wrapper##_lenfunc_closure(PyObject *a) { \ return SwigPyBuiltin_lenfunc_closure(wrapper, a); \ } SWIGINTERN Py_ssize_t SwigPyBuiltin_lenfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { PyObject *resultobj; Py_ssize_t result; resultobj = wrapper(a, NULL); result = PyNumber_AsSsize_t(resultobj, NULL); Py_DECREF(resultobj); return result; } #define SWIGPY_SSIZESSIZEARGFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ssizessizeargfunc_closure(PyObject *a, Py_ssize_t b, Py_ssize_t c) { \ return SwigPyBuiltin_ssizessizeargfunc_closure(wrapper, a, b, c); \ } SWIGINTERN PyObject * SwigPyBuiltin_ssizessizeargfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b, Py_ssize_t c) { PyObject *tuple, *result; tuple = PyTuple_New(2); assert(tuple); PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b)); PyTuple_SET_ITEM(tuple, 1, _PyLong_FromSsize_t(c)); result = wrapper(a, tuple); Py_DECREF(tuple); return result; } #define SWIGPY_SSIZESSIZEOBJARGPROC_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_ssizessizeobjargproc_closure(PyObject *a, Py_ssize_t b, Py_ssize_t c, PyObject *d) { \ return SwigPyBuiltin_ssizessizeobjargproc_closure(wrapper, a, b, c, d); \ } SWIGINTERN int SwigPyBuiltin_ssizessizeobjargproc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b, Py_ssize_t c, PyObject *d) { PyObject *tuple, *resultobj; int result; tuple = PyTuple_New(d ? 3 : 2); assert(tuple); PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b)); PyTuple_SET_ITEM(tuple, 1, _PyLong_FromSsize_t(c)); if (d) { Py_INCREF(d); PyTuple_SET_ITEM(tuple, 2, d); } resultobj = wrapper(a, tuple); result = resultobj ? 0 : -1; Py_DECREF(tuple); Py_XDECREF(resultobj); return result; } #define SWIGPY_SSIZEARGFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ssizeargfunc_closure(PyObject *a, Py_ssize_t b) { \ return SwigPyBuiltin_funpack_ssizeargfunc_closure(wrapper, a, b); \ } SWIGINTERN PyObject * SwigPyBuiltin_funpack_ssizeargfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b) { PyObject *tuple, *result; tuple = PyTuple_New(1); assert(tuple); PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b)); result = wrapper(a, tuple); Py_DECREF(tuple); return result; } #define SWIGPY_FUNPACK_SSIZEARGFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ssizeargfunc_closure(PyObject *a, Py_ssize_t b) { \ return SwigPyBuiltin_ssizeargfunc_closure(wrapper, a, b); \ } SWIGINTERN PyObject * SwigPyBuiltin_ssizeargfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b) { PyObject *arg, *result; arg = _PyLong_FromSsize_t(b); result = wrapper(a, arg); Py_DECREF(arg); return result; } #define SWIGPY_SSIZEOBJARGPROC_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_ssizeobjargproc_closure(PyObject *a, Py_ssize_t b, PyObject *c) { \ return SwigPyBuiltin_ssizeobjargproc_closure(wrapper, a, b, c); \ } SWIGINTERN int SwigPyBuiltin_ssizeobjargproc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b, PyObject *c) { PyObject *tuple, *resultobj; int result; tuple = PyTuple_New(2); assert(tuple); PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b)); Py_INCREF(c); PyTuple_SET_ITEM(tuple, 1, c); resultobj = wrapper(a, tuple); result = resultobj ? 0 : -1; Py_XDECREF(resultobj); Py_DECREF(tuple); return result; } #define SWIGPY_OBJOBJPROC_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_objobjproc_closure(PyObject *a, PyObject *b) { \ return SwigPyBuiltin_objobjproc_closure(wrapper, a, b); \ } SWIGINTERN int SwigPyBuiltin_objobjproc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b) { int result; PyObject *pyresult; PyObject *tuple; tuple = PyTuple_New(1); assert(tuple); Py_INCREF(b); PyTuple_SET_ITEM(tuple, 0, b); pyresult = wrapper(a, tuple); result = pyresult ? (PyObject_IsTrue(pyresult) ? 1 : 0) : -1; Py_XDECREF(pyresult); Py_DECREF(tuple); return result; } #define SWIGPY_FUNPACK_OBJOBJPROC_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_objobjproc_closure(PyObject *a, PyObject *b) { \ return SwigPyBuiltin_funpack_objobjproc_closure(wrapper, a, b); \ } SWIGINTERN int SwigPyBuiltin_funpack_objobjproc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b) { int result; PyObject *pyresult; pyresult = wrapper(a, b); result = pyresult ? (PyObject_IsTrue(pyresult) ? 1 : 0) : -1; Py_XDECREF(pyresult); return result; } #define SWIGPY_OBJOBJARGPROC_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_objobjargproc_closure(PyObject *a, PyObject *b, PyObject *c) { \ return SwigPyBuiltin_objobjargproc_closure(wrapper, a, b, c); \ } SWIGINTERN int SwigPyBuiltin_objobjargproc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b, PyObject *c) { PyObject *tuple, *resultobj; int result; tuple = PyTuple_New(c ? 2 : 1); assert(tuple); Py_INCREF(b); PyTuple_SET_ITEM(tuple, 0, b); if (c) { Py_INCREF(c); PyTuple_SET_ITEM(tuple, 1, c); } resultobj = wrapper(a, tuple); result = resultobj ? 0 : -1; Py_XDECREF(resultobj); Py_DECREF(tuple); return result; } #define SWIGPY_REPRFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_reprfunc_closure(PyObject *a) { \ return SwigPyBuiltin_reprfunc_closure(wrapper, a); \ } SWIGINTERN PyObject * SwigPyBuiltin_reprfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { return wrapper(a, NULL); } #define SWIGPY_HASHFUNC_CLOSURE(wrapper) \ SWIGINTERN Py_hash_t \ wrapper##_hashfunc_closure(PyObject *a) { \ return SwigPyBuiltin_hashfunc_closure(wrapper, a); \ } SWIGINTERN Py_hash_t SwigPyBuiltin_hashfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { PyObject *pyresult; Py_hash_t result; pyresult = wrapper(a, NULL); if (!pyresult) return -1; result = SWIG_PyNumber_AsPyHash(pyresult); Py_DECREF(pyresult); return result; } #define SWIGPY_ITERNEXTFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_iternextfunc_closure(PyObject *a) { \ return SwigPyBuiltin_iternextfunc_closure(wrapper, a);\ } SWIGINTERN PyObject * SwigPyBuiltin_iternextfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { return wrapper(a, NULL); } /* End of callback function macros for use in PyTypeObject */ #ifdef __cplusplus } #endif swig-4.0.2/Lib/python/std_iostream.i0000644000175000017500000000015313667507523017257 0ustar williamwilliamnamespace std { %callback(1) endl; %callback(1) ends; %callback(1) flush; } %include swig-4.0.2/Lib/python/pyname_compat.i0000644000175000017500000000775613667507523017436 0ustar williamwilliam/* * From SWIG 1.3.37 we deprecated all SWIG symbols that start with Py, * since they are inappropriate and discouraged in Python documentation * (from http://www.python.org/doc/2.5.2/api/includes.html): * * "All user visible names defined by Python.h (except those defined by the included * standard headers) have one of the prefixes "Py" or "_Py". Names beginning with * "_Py" are for internal use by the Python implementation and should not be used * by extension writers. Structure member names do not have a reserved prefix. * * Important: user code should never define names that begin with "Py" or "_Py". * This confuses the reader, and jeopardizes the portability of the user code to * future Python versions, which may define additional names beginning with one * of these prefixes." * * This file defined macros to provide backward compatibility for these deprecated * symbols. In the case you have these symbols in your interface file, you can simply * include this file at beginning of it. * * However, this file may be removed in future release of SWIG, so using this file to * keep these inappropriate names in your SWIG interface file is also not recommended. * Instead, we provide a simple tool for converting your interface files to * the new naming convention. You can get the tool from the SWIG distribution: * Tools/pyname_patch.py */ %fragment("PySequence_Base", "header", fragment="SwigPySequence_Base") {} %fragment("PySequence_Cont", "header", fragment="SwigPySequence_Cont") {} %fragment("PySwigIterator_T", "header", fragment="SwigPyIterator_T") {} %fragment("PyPairBoolOutputIterator", "header", fragment="SwigPyPairBoolOutputIterator") {} %fragment("PySwigIterator", "header", fragment="SwigPyIterator") {} %fragment("PySwigIterator_T", "header", fragment="SwigPyIterator_T") {} %inline %{ #define PyMapIterator_T SwigPyMapIterator_T #define PyMapKeyIterator_T SwigPyMapKeyIterator_T #define PyMapValueIterator_T SwigPyMapValueIterator_T #define PyObject_ptr SwigPtr_PyObject #define PyObject_var SwigVar_PyObject #define PyOper SwigPyOper #define PySeq SwigPySeq #define PySequence_ArrowProxy SwigPySequence_ArrowProxy #define PySequence_Cont SwigPySequence_Cont #define PySequence_InputIterator SwigPySequence_InputIterator #define PySequence_Ref SwigPySequence_Ref #define PySwigClientData SwigPyClientData #define PySwigClientData_Del SwigPyClientData_Del #define PySwigClientData_New SwigPyClientData_New #define PySwigIterator SwigPyIterator #define PySwigIteratorClosed_T SwigPyIteratorClosed_T #define PySwigIteratorOpen_T SwigPyIteratorOpen_T #define PySwigIterator_T SwigPyIterator_T #define PySwigObject SwigPyObject #define PySwigObject_Check SwigPyObject_Check #define PySwigObject_GetDesc SwigPyObject_GetDesc #define PySwigObject_New SwigPyObject_New #define PySwigObject_acquire SwigPyObject_acquire #define PySwigObject_append SwigPyObject_append #define PySwigObject_as_number SwigPyObject_as_number #define PySwigObject_compare SwigPyObject_compare #define PySwigObject_dealloc SwigPyObject_dealloc #define PySwigObject_disown SwigPyObject_disown #define PySwigObject_format SwigPyObject_format #define PySwigObject_getattr SwigPyObject_getattr #define PySwigObject_hex SwigPyObject_hex #define PySwigObject_long SwigPyObject_long #define PySwigObject_next SwigPyObject_next #define PySwigObject_oct SwigPyObject_oct #define PySwigObject_own SwigPyObject_own #define PySwigObject_repr SwigPyObject_repr #define PySwigObject_richcompare SwigPyObject_richcompare #define PySwigObject_type SwigPyObject_type #define PySwigPacked SwigPyPacked #define PySwigPacked_Check SwigPyPacked_Check #define PySwigPacked_New SwigPyPacked_New #define PySwigPacked_UnpackData SwigPyPacked_UnpackData #define PySwigPacked_compare SwigPyPacked_compare #define PySwigPacked_dealloc SwigPyPacked_dealloc #define PySwigPacked_repr SwigPyPacked_repr #define PySwigPacked_str SwigPyPacked_str #define PySwigPacked_type SwigPyPacked_type #define pyseq swigpyseq #define pyswigobject_type swigpyobject_type #define pyswigpacked_type swigpypacked_type %} swig-4.0.2/Lib/python/cdata.i0000644000175000017500000000003613667507523015636 0ustar williamwilliam%include swig-4.0.2/Lib/python/pyapi.swg0000644000175000017500000000135313667507523016257 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Python API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; const char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; #ifdef __cplusplus } #endif swig-4.0.2/Lib/python/std_vectora.i0000644000175000017500000000147513667507523017107 0ustar williamwilliam/* Vectors + allocators */ %fragment("StdVectorATraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { typedef std::vector vector_type; typedef T value_type; static int asptr(PyObject *obj, vector_type **vec) { return traits_asptr_stdseq::asptr(obj, vec); } }; template struct traits_from > { typedef std::vector vector_type; static PyObject *from(const vector_type& vec) { return traits_from_stdseq::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/python/std_string.i0000644000175000017500000000004313667507523016740 0ustar williamwilliam%include swig-4.0.2/Lib/python/std_ios.i0000644000175000017500000000010213667507523016220 0ustar williamwilliam%rename(ios_base_in) std::ios_base::in; %include swig-4.0.2/Lib/python/std_map.i0000644000175000017500000002345713667507523016225 0ustar williamwilliam/* Maps */ %fragment("StdMapCommonTraits","header",fragment="StdSequenceTraits") { namespace swig { template struct from_key_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v.first); } }; template struct from_value_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v.second); } }; template struct SwigPyMapIterator_T : SwigPyIteratorClosed_T { SwigPyMapIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyIteratorClosed_T(curr, first, last, seq) { } }; template > struct SwigPyMapKeyIterator_T : SwigPyMapIterator_T { SwigPyMapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapKeyIterator_T(current, begin, end, seq); } template > struct SwigPyMapValueIterator_T : SwigPyMapIterator_T { SwigPyMapValueIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapValueIterator_T(current, begin, end, seq); } } } %fragment("StdMapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::map *map) { typedef typename std::map::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { map->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::map map_type; static int asptr(PyObject *obj, map_type **val) { int res = SWIG_ERROR; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); %#if PY_VERSION_HEX >= 0x03000000 /* In Python 3.x the ".items()" method returns a dict_items object */ items = PySequence_Fast(items, ".items() didn't return a sequence!"); %#endif res = traits_asptr_stdseq >::asptr(items, val); } else { map_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } SWIG_PYTHON_THREAD_END_BLOCK; return res; } }; template struct traits_from > { typedef std::map map_type; typedef typename map_type::const_iterator const_iterator; typedef typename map_type::size_type size_type; static PyObject *asdict(const map_type& map) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; size_type size = map.size(); Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } SWIG_PYTHON_THREAD_END_BLOCK; return obj; } static PyObject *from(const map_type& map) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN); } else { return asdict(map); } } }; } } %define %swig_map_common(Map...) %swig_sequence_iterator(Map); %swig_container_methods(Map) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_length", functype="lenfunc") __len__; %feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__; %feature("python:slot", "tp_iter", functype="getiterfunc") key_iterator; %feature("python:slot", "sq_contains", functype="objobjproc") __contains__; %extend { %newobject iterkeys(PyObject **PYTHON_SELF); swig::SwigPyIterator* iterkeys(PyObject **PYTHON_SELF) { return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject itervalues(PyObject **PYTHON_SELF); swig::SwigPyIterator* itervalues(PyObject **PYTHON_SELF) { return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject iteritems(PyObject **PYTHON_SELF); swig::SwigPyIterator* iteritems(PyObject **PYTHON_SELF) { return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } #else %extend { %pythoncode %{def __iter__(self): return self.key_iterator()%} %pythoncode %{def iterkeys(self): return self.key_iterator()%} %pythoncode %{def itervalues(self): return self.value_iterator()%} %pythoncode %{def iteritems(self): return self.iterator()%} } #endif %extend { mapped_type const & __getitem__(const key_type& key) throw (std::out_of_range) { Map::const_iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __delitem__(const key_type& key) throw (std::out_of_range) { Map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const key_type& key) const { Map::const_iterator i = self->find(key); return i != self->end(); } PyObject* keys() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* keyList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(keyList, j, swig::from(i->first)); } SWIG_PYTHON_THREAD_END_BLOCK; return keyList; } PyObject* values() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* valList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(valList, j, swig::from(i->second)); } SWIG_PYTHON_THREAD_END_BLOCK; return valList; } PyObject* items() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* itemList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(itemList, j, swig::from(*i)); } SWIG_PYTHON_THREAD_END_BLOCK; return itemList; } bool __contains__(const key_type& key) { return self->find(key) != self->end(); } %newobject key_iterator(PyObject **PYTHON_SELF); swig::SwigPyIterator* key_iterator(PyObject **PYTHON_SELF) { return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject value_iterator(PyObject **PYTHON_SELF); swig::SwigPyIterator* value_iterator(PyObject **PYTHON_SELF) { return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } %enddef %define %swig_map_methods(Map...) %swig_map_common(Map) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_ass_subscript", functype="objobjargproc") __setitem__; #endif %extend { // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(const key_type& key) { self->erase(key); } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { (*self)[key] = x; } PyObject* asdict() { return swig::traits_from< Map >::asdict(*self); } } %enddef %include swig-4.0.2/Lib/python/cstring.i0000644000175000017500000000004013667507523016226 0ustar williamwilliam%include swig-4.0.2/Lib/python/factory.i0000644000175000017500000000004013667507523016224 0ustar williamwilliam%include swig-4.0.2/Lib/python/boost_shared_ptr.i0000644000175000017500000005255713667507523020142 0ustar williamwilliam%include // Set SHARED_PTR_DISOWN to $disown if required, for example // #define SHARED_PTR_DISOWN $disown #if !defined(SHARED_PTR_DISOWN) #define SHARED_PTR_DISOWN 0 #endif %fragment("SWIG_null_deleter_python", "header", fragment="SWIG_null_deleter") { %#define SWIG_NO_NULL_DELETER_SWIG_BUILTIN_INIT } // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) CONST TYPE (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (!swig_argp) { %dirout_nullref("$type"); } else { $result = *(%reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } // plain pointer // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter_python") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter_python") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter_python") CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE * %{ #error "directorout typemap for plain pointer not implemented" %} // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter_python") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter_python") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter_python") CONST TYPE & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE & %{ #error "directorout typemap for plain reference not implemented" %} // plain pointer by reference // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter_python") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1, fragment="SWIG_null_deleter_python") TYPE *CONST& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) TYPE *CONST& %{ #error "directorout typemap for plain pointer by reference not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { int newmem = 0; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (swig_argp) { $result = *(%reinterpret_cast(swig_argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, $<ype); } } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "directorout typemap for shared_ptr ref not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "directorout typemap for pointer to shared_ptr not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "directorout typemap for pointer ref to shared_ptr not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *", noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(doctype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{TYPE%} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.2/Lib/stl.i0000644000175000017500000000037113667507523014045 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ #warning "stl.i not implemented for this target" #define SWIG_STL_UNIMPL swig-4.0.2/Lib/mzscheme/0000755000175000017500000000000013667507523014703 5ustar williamwilliamswig-4.0.2/Lib/mzscheme/std_deque.i0000644000175000017500000000003413667507523017027 0ustar williamwilliam%include swig-4.0.2/Lib/mzscheme/std_vector.i0000644000175000017500000004372313667507523017242 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // MzScheme as much as possible, namely, to allow the user to pass and // be returned MzScheme vectors or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&), f(const std::vector*): // the parameter being read-only, either a MzScheme sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(): // the vector is returned by copy; therefore, a MzScheme vector of T:s // is returned which is most easily used in other MzScheme functions // -- std::vector& f(), std::vector* f(), const std::vector& f(), // const std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class vector { %typemap(in) vector { if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); $1 = std::vector(size); Scheme_Object** items = SCHEME_VEC_ELS($input); for (unsigned int i=0; i(); } else if (SCHEME_PAIRP($input)) { Scheme_Object *head, *tail; $1 = std::vector(); tail = $input; while (!SCHEME_NULLP(tail)) { head = scheme_car(tail); tail = scheme_cdr(tail); $1.push_back(*((T*)SWIG_MustGetPtr(head, $descriptor(T *), $argnum, 0))); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const vector& (std::vector temp), const vector* (std::vector temp) { if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); temp = std::vector(size); $1 = &temp; Scheme_Object** items = SCHEME_VEC_ELS($input); for (unsigned int i=0; i(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::vector(); $1 = &temp; Scheme_Object *head, *tail; tail = $input; while (!SCHEME_NULLP(tail)) { head = scheme_car(tail); tail = scheme_cdr(tail); temp.push_back(*((T*) SWIG_MustGetPtr(head, $descriptor(T *), $argnum, 0))); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) vector { $result = scheme_make_vector($1.size(),scheme_undefined); Scheme_Object** els = SCHEME_VEC_ELS($result); for (unsigned int i=0; i<$1.size(); i++) { T* x = new T((($1_type &)$1)[i]); els[i] = SWIG_NewPointerObj(x,$descriptor(T *), 1); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector { /* native sequence? */ if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; Scheme_Object** items = SCHEME_VEC_ELS($input); if (SWIG_ConvertPtr(items[0],(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } } else if (SCHEME_NULLP($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ T* x; Scheme_Object *head = scheme_car($input); if (SWIG_ConvertPtr(head,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { /* wrapped vector? */ std::vector* v; if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { /* native sequence? */ if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; Scheme_Object** items = SCHEME_VEC_ELS($input); if (SWIG_ConvertPtr(items[0],(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } } else if (SCHEME_NULLP($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ T* x; Scheme_Object *head = scheme_car($input); if (SWIG_ConvertPtr(head,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { /* wrapped vector? */ std::vector* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); %rename(length) size; unsigned int size() const; %rename("empty?") empty; bool empty() const; %rename("clear!") clear; void clear(); %rename("set!") set; %rename("pop!") pop; %rename("push!") push_back; void push_back(const T& x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T& ref(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { %typemap(in) vector { if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); $1 = std::vector(size); Scheme_Object** items = SCHEME_VEC_ELS($input); for (unsigned int i=0; i", $argnum - 1, argc, argv); } } else if (SCHEME_NULLP($input)) { $1 = std::vector(); } else if (SCHEME_PAIRP($input)) { Scheme_Object *head, *tail; $1 = std::vector(); tail = $input; while (!SCHEME_NULLP(tail)) { head = scheme_car(tail); tail = scheme_cdr(tail); if (CHECK(head)) $1.push_back((T)(CONVERT_FROM(head))); else scheme_wrong_type(FUNC_NAME, "vector<" #T ">", $argnum - 1, argc, argv); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const vector& (std::vector temp), const vector* (std::vector temp) { if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); temp = std::vector(size); $1 = &temp; Scheme_Object** items = SCHEME_VEC_ELS($input); for (unsigned int i=0; i", $argnum - 1, argc, argv); } } else if (SCHEME_NULLP($input)) { temp = std::vector(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::vector(); $1 = &temp; Scheme_Object *head, *tail; tail = $input; while (!SCHEME_NULLP(tail)) { head = scheme_car(tail); tail = scheme_cdr(tail); if (CHECK(head)) temp.push_back((T)(CONVERT_FROM(head))); else scheme_wrong_type(FUNC_NAME, "vector<" #T ">", $argnum - 1, argc, argv); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum - 1, 0); } } %typemap(out) vector { $result = scheme_make_vector($1.size(),scheme_undefined); Scheme_Object** els = SCHEME_VEC_ELS($result); for (unsigned int i=0; i<$1.size(); i++) els[i] = CONVERT_TO((($1_type &)$1)[i]); } %typecheck(SWIG_TYPECHECK_VECTOR) vector { /* native sequence? */ if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; Scheme_Object** items = SCHEME_VEC_ELS($input); $1 = CHECK(items[0]) ? 1 : 0; } } else if (SCHEME_NULLP($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ T* x; Scheme_Object *head = scheme_car($input); $1 = CHECK(head) ? 1 : 0; } else { /* wrapped vector? */ std::vector* v; $1 = (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor, 0) != -1) ? 1 : 0; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { /* native sequence? */ if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; Scheme_Object** items = SCHEME_VEC_ELS($input); $1 = CHECK(items[0]) ? 1 : 0; } } else if (SCHEME_NULLP($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ T* x; Scheme_Object *head = scheme_car($input); $1 = CHECK(head) ? 1 : 0; } else { /* wrapped vector? */ std::vector* v; $1 = (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor, 0) != -1) ? 1 : 0; } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); %rename(length) size; unsigned int size() const; %rename("empty?") empty; bool empty() const; %rename("clear!") clear; void clear(); %rename("set!") set; %rename("pop!") pop; %rename("push!") push_back; void push_back(T x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T ref(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* Common SWIG API */ #define SWIG_ConvertPtr(s, result, type, flags) \ SWIG_MzScheme_ConvertPtr(s, result, type, flags) #define SWIG_NewPointerObj(ptr, type, owner) \ SWIG_MzScheme_NewPointerObj((void *)ptr, type, owner) #define SWIG_MustGetPtr(s, type, argnum, flags) \ SWIG_MzScheme_MustGetPtr(s, type, argnum, flags, FUNC_NAME, argc, argv) #define SWIG_contract_assert(expr,msg) \ if (!(expr)) { \ char *m=(char *) scheme_malloc(strlen(msg)+1000); \ sprintf(m,"SWIG contract, assertion failed: function=%s, message=%s", \ (char *) FUNC_NAME,(char *) msg); \ scheme_signal_error(m); \ } /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_MzScheme_GetModule((Scheme_Env *)(clientdata)) #define SWIG_SetModule(clientdata, pointer) SWIG_MzScheme_SetModule((Scheme_Env *) (clientdata), pointer) #define SWIG_MODULE_CLIENTDATA_TYPE Scheme_Env * /* MzScheme-specific SWIG API */ #define SWIG_malloc(size) SWIG_MzScheme_Malloc(size, FUNC_NAME) #define SWIG_free(mem) free(mem) #define SWIG_NewStructFromPtr(ptr,type) \ _swig_convert_struct_##type##(ptr) #define MAXVALUES 6 #define swig_make_boolean(b) (b ? scheme_true : scheme_false) static long SWIG_convert_integer(Scheme_Object *o, long lower_bound, long upper_bound, const char *func_name, int argnum, int argc, Scheme_Object **argv) { long value; int status = scheme_get_int_val(o, &value); if (!status) scheme_wrong_type(func_name, "integer", argnum, argc, argv); if (value < lower_bound || value > upper_bound) scheme_wrong_type(func_name, "integer", argnum, argc, argv); return value; } static int SWIG_is_integer(Scheme_Object *o) { long value; return scheme_get_int_val(o, &value); } static unsigned long SWIG_convert_unsigned_integer(Scheme_Object *o, unsigned long lower_bound, unsigned long upper_bound, const char *func_name, int argnum, int argc, Scheme_Object **argv) { unsigned long value; int status = scheme_get_unsigned_int_val(o, &value); if (!status) scheme_wrong_type(func_name, "integer", argnum, argc, argv); if (value < lower_bound || value > upper_bound) scheme_wrong_type(func_name, "integer", argnum, argc, argv); return value; } static int SWIG_is_unsigned_integer(Scheme_Object *o) { unsigned long value; return scheme_get_unsigned_int_val(o, &value); } /* ----------------------------------------------------------------------- * mzscheme 30X support code * ----------------------------------------------------------------------- */ #ifndef SCHEME_STR_VAL #define MZSCHEME30X 1 #endif #ifdef MZSCHEME30X /* * This is MZSCHEME 299.100 or higher (30x). From version 299.100 of * mzscheme upwards, strings are in unicode. These functions convert * to and from utf8 encodings of these strings. NB! strlen(s) will be * the size in bytes of the string, not the actual length. */ #define SCHEME_STR_VAL(obj) SCHEME_BYTE_STR_VAL(scheme_char_string_to_byte_string(obj)) #define SCHEME_STRLEN_VAL(obj) SCHEME_BYTE_STRLEN_VAL(scheme_char_string_to_byte_string(obj)) #define SCHEME_STRINGP(obj) SCHEME_CHAR_STRINGP(obj) #define scheme_make_string(s) scheme_make_utf8_string(s) #define scheme_make_sized_string(s,l) scheme_make_sized_utf8_string(s,l) #define scheme_make_sized_offset_string(s,d,l) \ scheme_make_sized_offset_utf8_string(s,d,l) #define SCHEME_MAKE_STRING(s) scheme_make_utf8_string(s) #else #define SCHEME_MAKE_STRING(s) scheme_make_string_without_copying(s) #endif /* ----------------------------------------------------------------------- * End of mzscheme 30X support code * ----------------------------------------------------------------------- */ struct swig_mz_proxy { Scheme_Type mztype; swig_type_info *type; void *object; }; static Scheme_Type swig_type; static void mz_free_swig(void *p, void *data) { struct swig_mz_proxy *proxy = (struct swig_mz_proxy *) p; if (SCHEME_NULLP((Scheme_Object*)p) || SCHEME_TYPE((Scheme_Object*)p) != swig_type) return; if (proxy->type) { if (proxy->type->clientdata) { ((Scheme_Prim *)proxy->type->clientdata)(1, (Scheme_Object **)&proxy); } } } static Scheme_Object * SWIG_MzScheme_NewPointerObj(void *ptr, swig_type_info *type, int owner) { struct swig_mz_proxy *new_proxy; new_proxy = (struct swig_mz_proxy *) scheme_malloc(sizeof(struct swig_mz_proxy)); new_proxy->mztype = swig_type; new_proxy->type = type; new_proxy->object = ptr; if (owner) { scheme_add_finalizer(new_proxy, mz_free_swig, NULL); } return (Scheme_Object *) new_proxy; } static int SWIG_MzScheme_ConvertPtr(Scheme_Object *s, void **result, swig_type_info *type, int flags) { swig_cast_info *cast; if (SCHEME_NULLP(s)) { *result = NULL; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } else if (SCHEME_TYPE(s) == swig_type) { struct swig_mz_proxy *proxy = (struct swig_mz_proxy *) s; if (type) { cast = SWIG_TypeCheckStruct(proxy->type, type); if (cast) { int newmemory = 0; *result = SWIG_TypeCast(cast, proxy->object, &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return 0; } else { return 1; } } else { *result = proxy->object; return 0; } } return 1; } static SWIGINLINE void * SWIG_MzScheme_MustGetPtr(Scheme_Object *s, swig_type_info *type, int argnum, int flags, const char *func_name, int argc, Scheme_Object **argv) { void *result; if (SWIG_MzScheme_ConvertPtr(s, &result, type, flags)) { scheme_wrong_type(func_name, type->str ? type->str : "void *", argnum - 1, argc, argv); } return result; } static SWIGINLINE void * SWIG_MzScheme_Malloc(size_t size, const char *func_name) { void *p = malloc(size); if (p == NULL) { scheme_signal_error("swig-memory-error"); } else return p; } static Scheme_Object * SWIG_MzScheme_PackageValues(int num, Scheme_Object **values) { /* ignore first value if void */ if (num > 0 && SCHEME_VOIDP(values[0])) num--, values++; if (num == 0) return scheme_void; else if (num == 1) return values[0]; else return scheme_values(num, values); } #ifndef scheme_make_inspector #define scheme_make_inspector(x,y) \ _scheme_apply(scheme_builtin_value("make-inspector"), x, y) #endif /* Function to create a new struct. */ static Scheme_Object * SWIG_MzScheme_new_scheme_struct (Scheme_Env* env, const char* basename, int num_fields, char** field_names) { Scheme_Object *new_type; int count_out, i; Scheme_Object **struct_names; Scheme_Object **vals; Scheme_Object **a = (Scheme_Object**) \ scheme_malloc(num_fields*sizeof(Scheme_Object*)); for (i=0; i #else #include #endif static char **mz_dlopen_libraries=NULL; static void **mz_libraries=NULL; static char **mz_dynload_libpaths=NULL; static void mz_set_dlopen_libraries(const char *_libs) { int i,k,n; int mz_dynload_debug=(1==0); char *extra_paths[1000]; char *EP; { char *dbg=getenv("MZ_DYNLOAD_DEBUG"); if (dbg!=NULL) { mz_dynload_debug=atoi(dbg); } } { char *ep=getenv("MZ_DYNLOAD_LIBPATH"); int i,k,j; k=0; if (ep!=NULL) { EP=strdup(ep); for(i=0,j=0;EP[i]!='\0';i++) { if (EP[i]==':') { EP[i]='\0'; extra_paths[k++]=&EP[j]; j=i+1; } } if (j!=i) { extra_paths[k++]=&EP[j]; } } else { EP=strdup(""); } extra_paths[k]=NULL; k+=1; if (mz_dynload_debug) { fprintf(stderr,"SWIG:mzscheme:MZ_DYNLOAD_LIBPATH=%s\n",(ep==NULL) ? "(null)" : ep); fprintf(stderr,"SWIG:mzscheme:extra_paths[%d]\n",k-1); for(i=0;i %p\n",libp,mz_libraries[i]); } free(libp); } } } } { int i; void *func=NULL; for(i=0;mz_dlopen_libraries[i]!=NULL && func==NULL;i++) { if (mz_libraries[i]!=NULL) { #ifdef __OS_WIN32 func=GetProcAddress(mz_libraries[i],function); #else func=dlsym(mz_libraries[i],function); #endif } if (mz_dynload_debug) { fprintf(stderr, "SWIG:mzscheme:library:%s;dlopen=%p,function=%s,func=%p\n", mz_dlopen_libraries[i],mz_libraries[i],function,func ); } } return func; } } } /* The interpreter will store a pointer to this structure in a global variable called swig-runtime-data-type-pointer. The instance of this struct is only used if no other module has yet been loaded */ struct swig_mzscheme_runtime_data { swig_module_info *module_head; Scheme_Type type; }; static struct swig_mzscheme_runtime_data swig_mzscheme_runtime_data; static swig_module_info * SWIG_MzScheme_GetModule(Scheme_Env *env) { Scheme_Object *pointer, *symbol; struct swig_mzscheme_runtime_data *data; /* first check if pointer already created */ symbol = scheme_intern_symbol("swig-runtime-data-type-pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); pointer = scheme_lookup_global(symbol, env); if (pointer && SCHEME_CPTRP(pointer)) { data = (struct swig_mzscheme_runtime_data *) SCHEME_CPTR_VAL(pointer); swig_type = data->type; return data->module_head; } else { return NULL; } } static void SWIG_MzScheme_SetModule(Scheme_Env *env, swig_module_info *module) { Scheme_Object *pointer, *symbol; struct swig_mzscheme_runtime_data *data; /* first check if pointer already created */ symbol = scheme_intern_symbol("swig-runtime-data-type-pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); pointer = scheme_lookup_global(symbol, env); if (pointer && SCHEME_CPTRP(pointer)) { data = (struct swig_mzscheme_runtime_data *) SCHEME_CPTR_VAL(pointer); swig_type = data->type; data->module_head = module; } else { /* create a new type for wrapped pointer values */ swig_type = scheme_make_type((char *)"swig"); swig_mzscheme_runtime_data.module_head = module; swig_mzscheme_runtime_data.type = swig_type; /* create a new pointer */ #ifndef MZSCHEME30X pointer = scheme_make_cptr((void *) &swig_mzscheme_runtime_data, "swig_mzscheme_runtime_data"); #else pointer = scheme_make_cptr((void *) &swig_mzscheme_runtime_data, scheme_make_byte_string("swig_mzscheme_runtime_data")); #endif scheme_add_global_symbol(symbol, pointer, env); } } #ifdef __cplusplus } #endif swig-4.0.2/Lib/mzscheme/Makefile0000644000175000017500000000003513667507523016341 0ustar williamwilliam co: co RCS/*.i* RCS/*.swg* swig-4.0.2/Lib/mzscheme/std_common.i0000644000175000017500000000104213667507523017214 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; %{ #include SWIGINTERNINLINE std::string swig_scm_to_string(Scheme_Object *x) { return std::string(SCHEME_STR_VAL(x)); } SWIGINTERNINLINE Scheme_Object *swig_make_string(const std::string &s) { return scheme_make_string(s.c_str()); } %} swig-4.0.2/Lib/mzscheme/typemaps.i0000644000175000017500000002463113667507523016725 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * ----------------------------------------------------------------------------- */ /* The MzScheme module handles all types uniformly via typemaps. Here are the definitions. */ /* Pointers */ %typemap(in) SWIGTYPE * { $1 = ($ltype) SWIG_MustGetPtr($input, $descriptor, $argnum, 0); } %typemap(in) void * { $1 = SWIG_MustGetPtr($input, NULL, $argnum, 0); } %typemap(varin) SWIGTYPE * { $1 = ($ltype) SWIG_MustGetPtr($input, $descriptor, 1, 0); } %typemap(varin) SWIGTYPE & { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE && { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE [ANY] { void *temp; int ii; $1_basetype *b = 0; temp = SWIG_MustGetPtr($input, $1_descriptor, 1, 0); b = ($1_basetype *) $1; for (ii = 0; ii < $1_size; ii++) b[ii] = *(($1_basetype *) temp + ii); } %typemap(varin) void * { $1 = SWIG_MustGetPtr($input, NULL, 1, 0); } %typemap(out) SWIGTYPE * { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } %typemap(out) SWIGTYPE *DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); $result = SWIG_NewPointerObj ($1, ty, $owner); } %typemap(varout) SWIGTYPE *, SWIGTYPE [] { $result = SWIG_NewPointerObj ($1, $descriptor, 0); } %typemap(varout) SWIGTYPE & { $result = SWIG_NewPointerObj((void *) &$1, $1_descriptor, 0); } %typemap(varout) SWIGTYPE && { $result = SWIG_NewPointerObj((void *) &$1, $1_descriptor, 0); } /* C++ References */ #ifdef __cplusplus %typemap(in) SWIGTYPE &, SWIGTYPE && { $1 = ($ltype) SWIG_MustGetPtr($input, $descriptor, $argnum, 0); if ($1 == NULL) scheme_signal_error("swig-type-error (null reference)"); } %typemap(out) SWIGTYPE &, SWIGTYPE && { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } %typemap(out) SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); $result = SWIG_NewPointerObj ($1, ty, $owner); } #endif /* Arrays */ %typemap(in) SWIGTYPE[] { $1 = ($ltype) SWIG_MustGetPtr($input, $descriptor, $argnum, 0); } %typemap(out) SWIGTYPE[] { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } /* Enums */ %typemap(in) enum SWIGTYPE { if (!SWIG_is_integer($input)) scheme_wrong_type(FUNC_NAME, "integer", $argnum - 1, argc, argv); $1 = ($1_type) SWIG_convert_int($input); } %typemap(varin) enum SWIGTYPE { if (!SWIG_is_integer($input)) scheme_wrong_type(FUNC_NAME, "integer", 0, argc, argv); $1 = ($1_type) SWIG_convert_int($input); } %typemap(out) enum SWIGTYPE "$result = scheme_make_integer_value($1);"; %typemap(varout) enum SWIGTYPE "$result = scheme_make_integer_value($1);"; /* Pass-by-value */ %typemap(in) SWIGTYPE($&1_ltype argp) { argp = ($&1_ltype) SWIG_MustGetPtr($input, $&1_descriptor, $argnum, 0); $1 = *argp; } %typemap(varin) SWIGTYPE { $&1_ltype argp; argp = ($&1_ltype) SWIG_MustGetPtr($input, $&1_descriptor, 1, 0); $1 = *argp; } %typemap(out) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype(($1_ltype &) $1); $result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 1); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); } #endif %typemap(varout) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype(($1_ltype &) $1); $result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 0); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); } #endif /* The SIMPLE_MAP macro below defines the whole set of typemaps needed for simple types. */ %define SIMPLE_MAP(C_NAME, MZ_PREDICATE, MZ_TO_C, C_TO_MZ, MZ_NAME) %typemap(in) C_NAME { if (!MZ_PREDICATE($input)) scheme_wrong_type(FUNC_NAME, #MZ_NAME, $argnum - 1, argc, argv); $1 = MZ_TO_C($input); } %typemap(varin) C_NAME { if (!MZ_PREDICATE($input)) scheme_wrong_type(FUNC_NAME, #MZ_NAME, 0, argc, argv); $1 = MZ_TO_C($input); } %typemap(out) C_NAME { $result = C_TO_MZ($1); } %typemap(varout) C_NAME { $result = C_TO_MZ($1); } %typemap(in) C_NAME *INPUT (C_NAME temp) { temp = (C_NAME) MZ_TO_C($input); $1 = &temp; } %typemap(in,numinputs=0) C_NAME *OUTPUT (C_NAME temp) { $1 = &temp; } %typemap(argout) C_NAME *OUTPUT { Scheme_Object *s; s = C_TO_MZ(*$1); SWIG_APPEND_VALUE(s); } %typemap(in) C_NAME *BOTH = C_NAME *INPUT; %typemap(argout) C_NAME *BOTH = C_NAME *OUTPUT; %typemap(in) C_NAME *INOUT = C_NAME *INPUT; %typemap(argout) C_NAME *INOUT = C_NAME *OUTPUT; %enddef SIMPLE_MAP(bool, SCHEME_BOOLP, SCHEME_TRUEP, swig_make_boolean, boolean); SIMPLE_MAP(char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); SIMPLE_MAP(unsigned char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); SIMPLE_MAP(int, SWIG_is_integer, SWIG_convert_int, scheme_make_integer_value, integer); SIMPLE_MAP(short, SWIG_is_integer, SWIG_convert_short, scheme_make_integer_value, integer); SIMPLE_MAP(long, SWIG_is_integer, SWIG_convert_long, scheme_make_integer_value, integer); SIMPLE_MAP(ptrdiff_t, SWIG_is_integer, SWIG_convert_long, scheme_make_integer_value, integer); SIMPLE_MAP(unsigned int, SWIG_is_unsigned_integer, SWIG_convert_unsigned_int, scheme_make_integer_value_from_unsigned, integer); SIMPLE_MAP(unsigned short, SWIG_is_unsigned_integer, SWIG_convert_unsigned_short, scheme_make_integer_value_from_unsigned, integer); SIMPLE_MAP(unsigned long, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long, scheme_make_integer_value_from_unsigned, integer); SIMPLE_MAP(size_t, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long, scheme_make_integer_value_from_unsigned, integer); SIMPLE_MAP(float, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); SIMPLE_MAP(double, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); SIMPLE_MAP(char *, SCHEME_STRINGP, SCHEME_STR_VAL, SCHEME_MAKE_STRING, string); SIMPLE_MAP(const char *, SCHEME_STRINGP, SCHEME_STR_VAL, SCHEME_MAKE_STRING, string); /* For MzScheme 30x: Use these typemaps if you are not going to use UTF8 encodings in your C code. SIMPLE_MAP(char *,SCHEME_BYTE_STRINGP, SCHEME_BYTE_STR_VAL, scheme_make_byte_string_without_copying,bytestring); SIMPLE_MAP(const char *,SCHEME_BYTE_STRINGP, SCHEME_BYTE_STR_VAL, scheme_make_byte_string_without_copying,bytestring); */ /* Const primitive references. Passed by value */ %define REF_MAP(C_NAME, MZ_PREDICATE, MZ_TO_C, C_TO_MZ, MZ_NAME) %typemap(in) const C_NAME & (C_NAME temp) { if (!MZ_PREDICATE($input)) scheme_wrong_type(FUNC_NAME, #MZ_NAME, $argnum - 1, argc, argv); temp = MZ_TO_C($input); $1 = &temp; } %typemap(out) const C_NAME & { $result = C_TO_MZ(*$1); } %enddef REF_MAP(bool, SCHEME_BOOLP, SCHEME_TRUEP, swig_make_boolean, boolean); REF_MAP(char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); REF_MAP(unsigned char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); REF_MAP(int, SWIG_is_integer, SWIG_convert_int, scheme_make_integer_value, integer); REF_MAP(short, SWIG_is_integer, SWIG_convert_short, scheme_make_integer_value, integer); REF_MAP(long, SWIG_is_integer, SWIG_convert_long, scheme_make_integer_value, integer); REF_MAP(unsigned int, SWIG_is_unsigned_integer, SWIG_convert_unsigned_int, scheme_make_integer_value_from_unsigned, integer); REF_MAP(unsigned short, SWIG_is_unsigned_integer, SWIG_convert_unsigned_short, scheme_make_integer_value_from_unsigned, integer); REF_MAP(unsigned long, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long, scheme_make_integer_value_from_unsigned, integer); REF_MAP(float, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); REF_MAP(double, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); /* Void */ %typemap(out) void "$result = scheme_void;"; /* Pass through Scheme_Object * */ %typemap (in) Scheme_Object * "$1=$input;"; %typemap (out) Scheme_Object * "$result=$1;"; %typecheck(SWIG_TYPECHECK_POINTER) Scheme_Object * "$1=1;"; /* ------------------------------------------------------------ * String & length * ------------------------------------------------------------ */ //%typemap(in) (char *STRING, int LENGTH) { // int temp; // $1 = ($1_ltype) SWIG_Guile_scm2newstr($input, &temp); // $2 = ($2_ltype) temp; //} /* ------------------------------------------------------------ * Typechecking rules * ------------------------------------------------------------ */ %typecheck(SWIG_TYPECHECK_INTEGER) int, short, long, unsigned int, unsigned short, unsigned long, signed char, unsigned char, long long, unsigned long long, const int &, const short &, const long &, const unsigned int &, const unsigned short &, const unsigned long &, const long long &, const unsigned long long &, enum SWIGTYPE { $1 = (SWIG_is_integer($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_BOOL) bool, bool &, const bool & { $1 = (SCHEME_BOOLP($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_DOUBLE) float, double, const float &, const double & { $1 = (SCHEME_REALP($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_STRING) char { $1 = (SCHEME_STRINGP($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = (SCHEME_STRINGP($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [] { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, $1_descriptor, 0)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE &, SWIGTYPE && { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, $1_descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, $&1_descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, 0, 0)) { $1 = 0; } else { $1 = 1; } } /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } swig-4.0.2/Lib/mzscheme/std_pair.i0000644000175000017500000012555213667507523016674 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // // See std_vector.i for the rationale of typemap application // ------------------------------------------------------------------------ %{ #include %} // exported class namespace std { template struct pair { %typemap(in) pair (std::pair* m) { if (SCHEME_PAIRP($input)) { T* x; U* y; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); $1 = std::make_pair(*x,*y); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const pair& (std::pair temp, std::pair* m), const pair* (std::pair temp, std::pair* m) { if (SCHEME_PAIRP($input)) { T* x; U* y; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); temp = std::make_pair(*x,*y); $1 = &temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) pair { T* x = new T($1.first); U* y = new U($1.second); Scheme_Object* first = SWIG_NewPointerObj(x,$descriptor(T *), 1); Scheme_Object* second = SWIG_NewPointerObj(y,$descriptor(U *), 1); $result = scheme_make_pair(first,second); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (SCHEME_PAIRP($input)) { T* x; U* y; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) != -1 && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) != -1) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (SCHEME_PAIRP($input)) { T* x; U* y; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) != -1 && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) != -1) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // specializations for built-ins %define specialize_std_pair_on_first(T,CHECK,CONVERT_FROM,CONVERT_TO) template struct pair { %typemap(in) pair (std::pair* m) { if (SCHEME_PAIRP($input)) { U* y; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); if (!CHECK(first)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); $1 = std::make_pair(CONVERT_FROM(first),*y); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const pair& (std::pair temp, std::pair* m), const pair* (std::pair temp, std::pair* m) { if (SCHEME_PAIRP($input)) { U* y; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); if (!CHECK(first)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); temp = std::make_pair(CONVERT_FROM(first),*y); $1 = &temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) pair { U* y = new U($1.second); Scheme_Object* second = SWIG_NewPointerObj(y,$descriptor(U *), 1); $result = scheme_make_pair(CONVERT_TO($1.first),second); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (SCHEME_PAIRP($input)) { U* y; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (CHECK(first) && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) != -1) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (SCHEME_PAIRP($input)) { U* y; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (CHECK(first) && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) != -1) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; %enddef %define specialize_std_pair_on_second(U,CHECK,CONVERT_FROM,CONVERT_TO) template struct pair { %typemap(in) pair (std::pair* m) { if (SCHEME_PAIRP($input)) { T* x; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); $1 = std::make_pair(*x,CONVERT_FROM(second)); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const pair& (std::pair temp, std::pair* m), const pair* (std::pair temp, std::pair* m) { if (SCHEME_PAIRP($input)) { T* x; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); temp = std::make_pair(*x,CONVERT_FROM(second)); $1 = &temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) pair { T* x = new T($1.first); Scheme_Object* first = SWIG_NewPointerObj(x,$descriptor(T *), 1); $result = scheme_make_pair(first,CONVERT_TO($1.second)); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (SCHEME_PAIRP($input)) { T* x; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) != -1 && CHECK(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (SCHEME_PAIRP($input)) { T* x; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) != -1 && CHECK(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; %enddef %define specialize_std_pair_on_both(T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO, U,CHECK_U,CONVERT_U_FROM,CONVERT_U_TO) template<> struct pair { %typemap(in) pair (std::pair* m) { if (SCHEME_PAIRP($input)) { Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); if (!CHECK_T(first) || !CHECK_U(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); $1 = make_pair(CONVERT_T_FROM(first), CONVERT_U_FROM(second)); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const pair& (std::pair temp, std::pair* m), const pair* (std::pair temp, std::pair* m) { if (SCHEME_PAIRP($input)) { Scheme_Object *first, *second; T *x; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK_T(first) || !CHECK_U(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); temp = make_pair(CONVERT_T_FROM(first), CONVERT_U_FROM(second)); $1 = &temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) pair { $result = scheme_make_pair(CONVERT_T_TO($1.first), CONVERT_U_TO($1.second)); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (SCHEME_PAIRP($input)) { Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (CHECK_T(first) && CHECK_U(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (SCHEME_PAIRP($input)) { Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (CHECK_T(first) && CHECK_U(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; %enddef specialize_std_pair_on_first(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_first(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_first(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_first(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_second(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_second(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_second(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_second(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); } swig-4.0.2/Lib/mzscheme/mzscheme.swg0000644000175000017500000000353613667507523017247 0ustar williamwilliam/* ----------------------------------------------------------------------------- * mzscheme.swg * * SWIG Configuration File for MzScheme. * This file is parsed by SWIG before reading any other interface file. * ----------------------------------------------------------------------------- */ /* Include headers */ %runtime "swigrun.swg" // Common C API type-checking code %runtime "swigerrors.swg" // SWIG errors %runtime "mzrun.swg" %define SWIG_APPEND_VALUE(value) values[lenv++] = value %enddef /* Definitions */ #define SWIG_malloc(size) swig_malloc(size, FUNC_NAME) #define SWIG_free(mem) free(mem) #define SWIG_convert_short(o) \ SWIG_convert_integer(o, - (1 << (8 * sizeof(short) - 1)), \ (1 << (8 * sizeof(short) - 1)) - 1, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_int(o) \ SWIG_convert_integer(o, INT_MIN, INT_MAX, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_long(o) \ SWIG_convert_integer(o, LONG_MIN, LONG_MAX, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_unsigned_short(o) \ SWIG_convert_unsigned_integer(o, 0, \ (1 << (8 * sizeof(short))) - 1, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_unsigned_int(o) \ SWIG_convert_unsigned_integer(o, 0, UINT_MAX, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_unsigned_long(o) \ SWIG_convert_unsigned_integer(o, 0, ULONG_MAX, \ FUNC_NAME, $argnum-1, argc, argv) /* Guile compatibility kludges */ #define SCM_VALIDATE_VECTOR(argnum, value) (void)0 #define SCM_VALIDATE_LIST(argnum, value) (void)0 /* Read in standard typemaps. */ %include %insert(init) "swiginit.swg" %init %{ Scheme_Object *scheme_reload(Scheme_Env *env) { Scheme_Env *menv = SWIG_MZSCHEME_CREATE_MENV(env); SWIG_InitializeModule((void *) env); %} swig-4.0.2/Lib/mzscheme/stl.i0000644000175000017500000000044313667507523015660 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/mzscheme/std_string.i0000644000175000017500000000263313667507523017241 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string types * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ %include %{ #include %} namespace std { %naturalvar string; class string; /* Overloading check */ %typemap(typecheck) string = char *; %typemap(typecheck) const string & = char *; %typemap(in) string { if (SCHEME_STRINGP($input)) $1.assign(SCHEME_STR_VAL($input)); else SWIG_exception(SWIG_TypeError, "string expected"); } %typemap(in) const string & ($*1_ltype temp) { if (SCHEME_STRINGP($input)) { temp.assign(SCHEME_STR_VAL($input)); $1 = &temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(out) string { $result = scheme_make_string($1.c_str()); } %typemap(out) const string & { $result = scheme_make_string($1->c_str()); } } swig-4.0.2/Lib/mzscheme/std_map.i0000644000175000017500000020200713667507523016505 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // // The aim of all that follows would be to integrate std::map with // MzScheme as much as possible, namely, to allow the user to pass and // be returned Scheme association lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::map), f(const std::map&), f(const std::map*): // the parameter being read-only, either a Scheme alist or a // previously wrapped std::map can be passed. // -- f(std::map&), f(std::map*): // the parameter must be modified; therefore, only a wrapped std::map // can be passed. // -- std::map f(): // the map is returned by copy; therefore, a Scheme alist // is returned which is most easily used in other Scheme functions // -- std::map& f(), std::map* f(), const std::map& f(), // const std::map* f(): // the map is returned by reference; therefore, a wrapped std::map // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { %typemap(in) map< K, T, C > (std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { $1 = std::map< K, T, C >(); } else if (SCHEME_PAIRP($input)) { $1 = std::map< K, T, C >(); Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { K* k; T* x; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == -1) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } (($1_type &)$1)[*k] = *x; alist = scheme_cdr(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp, std::map< K, T, C >* m), const map< K, T, C >* (std::map< K, T, C > temp, std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::map< K, T, C >(); $1 = &temp; Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { K* k; T* x; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == -1) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } temp[*k] = *x; alist = scheme_cdr(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { Scheme_Object* alist = scheme_null; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { K* key = new K(i->first); T* val = new T(i->second); Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1); Scheme_Object* x = SWIG_NewPointerObj(val,$descriptor(T *), 1); Scheme_Object* entry = scheme_make_pair(k,x); alist = scheme_make_pair(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { /* native sequence? */ if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ K* k; T* x; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (SWIG_ConvertPtr(key,(void**) &k, $descriptor(K *), 0) == -1) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { /* wrapped map? */ std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { /* native sequence? */ if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ K* k; T* x; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (SWIG_ConvertPtr(key,(void**) &k, $descriptor(K *), 0) == -1) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { /* wrapped map? */ std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T& __getitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(const K& key, const T& x) { (*self)[key] = x; } void __delitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } Scheme_Object* keys() { Scheme_Object* result = scheme_null; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { K* key = new K(i->first); Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1); result = scheme_make_pair(k,result); } return result; } } }; // specializations for built-ins %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) template class map< K, T, C > { %typemap(in) map< K, T, C > (std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { $1 = std::map< K, T, C >(); } else if (SCHEME_PAIRP($input)) { $1 = std::map< K, T, C >(); Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { T* x; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); if (!CHECK(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == -1) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } (($1_type &)$1)[CONVERT_FROM(key)] = *x; alist = scheme_cdr(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp, std::map< K, T, C >* m), const map< K, T, C >* (std::map< K, T, C > temp, std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::map< K, T, C >(); $1 = &temp; Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { T* x; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); if (!CHECK(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == -1) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } temp[CONVERT_FROM(key)] = *x; alist = scheme_cdr(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { Scheme_Object* alist = scheme_null; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { T* val = new T(i->second); Scheme_Object* k = CONVERT_TO(i->first); Scheme_Object* x = SWIG_NewPointerObj(val,$descriptor(T *), 1); Scheme_Object* entry = scheme_make_pair(k,x); alist = scheme_make_pair(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only T* x; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (!CHECK(key)) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only T* x; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (!CHECK(key)) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T& __getitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(K key, const T& x) { (*self)[key] = x; } void __delitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(K key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } Scheme_Object* keys() { Scheme_Object* result = scheme_null; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { Scheme_Object* k = CONVERT_TO(i->first); result = scheme_make_pair(k,result); } return result; } } }; %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) template class map< K, T, C > { %typemap(in) map< K, T, C > (std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { $1 = std::map< K, T, C >(); } else if (SCHEME_PAIRP($input)) { $1 = std::map< K, T, C >(); Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { K* k; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (!CHECK(val)) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); if (!CHECK(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } (($1_type &)$1)[*k] = CONVERT_FROM(val); alist = scheme_cdr(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp, std::map< K, T, C >* m), const map< K, T, C >* (std::map< K, T, C > temp, std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::map< K, T, C >(); $1 = &temp; Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { K* k; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (!CHECK(val)) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); if (!CHECK(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } temp[*k] = CONVERT_FROM(val); alist = scheme_cdr(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { Scheme_Object* alist = scheme_null; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { K* key = new K(i->first); Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1); Scheme_Object* x = CONVERT_TO(i->second); Scheme_Object* entry = scheme_make_pair(k,x); alist = scheme_make_pair(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only K* k; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (SWIG_ConvertPtr(val,(void **) &k, $descriptor(K *), 0) == -1) { $1 = 0; } else { if (CHECK(val)) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (CHECK(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only K* k; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (SWIG_ConvertPtr(val,(void **) &k, $descriptor(K *), 0) == -1) { $1 = 0; } else { if (CHECK(val)) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (CHECK(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T __getitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(const K& key, T x) { (*self)[key] = x; } void __delitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } Scheme_Object* keys() { Scheme_Object* result = scheme_null; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { K* key = new K(i->first); Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1); result = scheme_make_pair(k,result); } return result; } } }; %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) template<> class map< K, T, C > { %typemap(in) map< K, T, C > (std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { $1 = std::map< K, T, C >(); } else if (SCHEME_PAIRP($input)) { $1 = std::map< K, T, C >(); Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); if (!CHECK_K(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (!CHECK_T(val)) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); if (!CHECK_T(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } (($1_type &)$1)[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val); alist = scheme_cdr(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp, std::map< K, T, C >* m), const map< K, T, C >* (std::map< K, T, C > temp, std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::map< K, T, C >(); $1 = &temp; Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); if (!CHECK_K(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (!CHECK_T(val)) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); if (!CHECK_T(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } temp[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val); alist = scheme_cdr(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { Scheme_Object* alist = scheme_null; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { Scheme_Object* k = CONVERT_K_TO(i->first); Scheme_Object* x = CONVERT_T_TO(i->second); Scheme_Object* entry = scheme_make_pair(k,x); alist = scheme_make_pair(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (!CHECK_K(key)) { $1 = 0; } else { if (CHECK_T(val)) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (CHECK_T(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (!CHECK_K(key)) { $1 = 0; } else { if (CHECK_T(val)) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (CHECK_T(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T __getitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(K key, T x) { (*self)[key] = x; } void __delitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(K key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } Scheme_Object* keys() { Scheme_Object* result = scheme_null; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { Scheme_Object* k = CONVERT_K_TO(i->first); result = scheme_make_pair(k,result); } return result; } } }; %enddef specialize_std_map_on_key(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_key(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_key(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_key(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_value(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_value(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_value(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_value(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); } swig-4.0.2/Lib/scilab/0000755000175000017500000000000013667507523014325 5ustar williamwilliamswig-4.0.2/Lib/scilab/std_deque.i0000644000175000017500000000144213667507523016455 0ustar williamwilliam/* * * C++ type : STL deque * Scilab type : matrix (for primitive types) or list (for pointer types) * */ %fragment("StdDequeTraits", "header", fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const SwigSciObject &obj, std::deque **deq) { return traits_asptr_stdseq >::asptr(obj, deq); } }; template struct traits_from > { static SwigSciObject from(const std::deque& deq) { return traits_from_stdseq >::from(deq); } }; } %} #define %swig_deque_methods(Type...) %swig_sequence_methods(Type) #define %swig_deque_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/scilab/scistdcommon.swg0000644000175000017500000001340213667507523017551 0ustar williamwilliam%fragment("StdTraits","header",fragment="StdTraitsCommon") { namespace swig { // Traits that provides the from method template struct traits_from_ptr { static SwigSciObject from(Type *val, int owner = 0) { return SWIG_OK; //SWIG_NewPointerObj(val, type_info(), owner); } }; template struct traits_from { static SwigSciObject from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static SwigSciObject from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static SwigSciObject from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline SwigSciObject from(const Type& val) { return traits_from::from(val); } template inline SwigSciObject from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } // Traits that provides the asval/as/check method template struct traits_asptr { static int asptr(const SwigSciObject& obj, Type **val) { Type *p = 0; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(const SwigSciObject& obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(const SwigSciObject& obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(const SwigSciObject& obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(const SwigSciObject& obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(const SwigSciObject& obj) { Type v; int res = asval(obj, &v); if (SWIG_IsOK(res)) { return v; } else { %type_error(swig::type_name()); throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type as(const SwigSciObject& obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { %type_error(swig::type_name()); throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type* as(const SwigSciObject& obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res)) { return v; } else { %type_error(swig::type_name()); throw std::invalid_argument("bad type"); } } }; template inline Type as(const SwigSciObject& obj) { return traits_as::category>::as(obj); } template struct traits_check { static bool check(const SwigSciObject& obj) { int res = asval(obj, (Type *)(0)); return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(const SwigSciObject& obj) { int res = asptr(obj, (Type **)(0)); return SWIG_IsOK(res) ? true : false; } }; template inline bool check(const SwigSciObject& obj) { return traits_check::category>::check(obj); } } } %define %specialize_std_container(Type,Check,As,From) %{ namespace swig { template <> struct traits_asval { typedef Type value_type; static int asval(const SwigSciObject& obj, value_type *val) { if (Check(obj)) { if (val) *val = As(obj); return SWIG_OK; } return SWIG_ERROR; } }; template <> struct traits_from { typedef Type value_type; static SwigSciObject from(const value_type& val) { return From(val); } }; template <> struct traits_check { static int check(const SwigSciObject& obj) { int res = Check(obj); return obj && res ? res : 0; } }; } %} %enddef #define specialize_std_vector(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_list(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_deque(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_set(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_multiset(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) swig-4.0.2/Lib/scilab/scifloat.swg0000644000175000017500000000425213667507523016656 0ustar williamwilliam/* * FLOAT SCALAR */ %fragment(SWIG_AsVal_frag(float), "header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal_dec(float)(SwigSciObject iVar, float *pfValue) { double dblValue = 0.0; if(SWIG_AsVal_dec(double)(iVar, &dblValue) != SWIG_OK) { return SWIG_ERROR; } if (pfValue) *pfValue = (float) dblValue; return SWIG_OK; } } %fragment(SWIG_From_frag(float), "header") { SWIGINTERN int SWIG_From_dec(float)(float flValue) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition(), (double)flValue)) return SWIG_ERROR; return SWIG_OK; } } %fragment("SWIG_SciDouble_AsFloatArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_AsFloatArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, float **pfValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; double *pdValue = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isDoubleType(pvApiCtx, piAddrVar) && !isVarComplex(pvApiCtx, piAddrVar)) { int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } *pfValue = (float *) malloc((*iRows) * (*iCols) * sizeof(float)); for (i=0; i < (*iRows) * (*iCols); i++) (*pfValue)[i] = (float) pdValue[i]; return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), fname, iVar); return SWIG_ERROR; } } } %fragment("SWIG_SciDouble_FromFloatArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromFloatArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, float *pfValue) { SciErr sciErr; double *pdValue; int i; pdValue = (double *) malloc(iRows * iCols * sizeof(double)); for (i = 0; i < iRows * iCols; i++) pdValue[i] = pfValue[i]; sciErr = createMatrixOfDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, pdValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } free(pdValue); return SWIG_OK; } } swig-4.0.2/Lib/scilab/scipointer.swg0000644000175000017500000000262613667507523017234 0ustar williamwilliam/* * POINTER */ %fragment("SWIG_ConvertPtr", "header") { #define SWIG_ConvertPtr(scilabValue, voidPointer, pointerDescriptor, flags) SwigScilabPtrToObject(pvApiCtx, scilabValue, voidPointer, pointerDescriptor, flags, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_NewPointerObj", "header") { #define SWIG_NewPointerObj(pointer, pointerDescriptor, flags) SwigScilabPtrFromObject(pvApiCtx, SWIG_Scilab_GetOutputPosition(), pointer, pointerDescriptor, flags, NULL) } /* * FUNCTION POINTER */ %fragment("SWIG_ConvertFunctionPtr", "header") { #define SWIG_ConvertFunctionPtr(scilabValue, voidPointer, pointerDescriptor) SwigScilabPtrToObject(pvApiCtx, scilabValue, voidPointer, pointerDescriptor, 0, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_NewFunctionPtrObj", "header") { #define SWIG_NewFunctionPtrObj(pointer, pointerDescriptor) SwigScilabPtrFromObject(pvApiCtx, SWIG_Scilab_GetOutputPosition(), pointer, pointerDescriptor, 0, NULL) } // No fragment used here, the functions "SwigScilabPtrToObject" and "SwigScilabPtrFromObject" are defined in sciruntime.swg /* * C++ member pointers, ie, member methods */ %fragment("SWIG_NewMemberObj", "header") { #define SWIG_NewMemberObj(ptr, sz, tp) SWIG_Scilab_NewMemberObj(pvApiCtx, $result, ptr, sz, tp) } %fragment("SWIG_ConvertMember", "header") { #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Scilab_ConvertPacked(pvApiCtx, obj, ptr, sz, ty, SWIG_Scilab_GetFuncName()) } swig-4.0.2/Lib/scilab/scidouble.swg0000644000175000017500000000636013667507523017025 0ustar williamwilliam/* * DOUBLE SCALAR */ %fragment(SWIG_AsVal_frag(double), "header", fragment="SWIG_SciDouble_AsDouble") { %#define SWIG_AsVal_double(scilabValue, valuePointer) SWIG_SciDouble_AsDouble(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_AsDouble", "header") { SWIGINTERN int SWIG_SciDouble_AsDouble(void *pvApiCtx, SwigSciObject iVar, double *pdblValue, char *fname) { SciErr sciErr; int iRet = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (!isDoubleType(pvApiCtx, piAddrVar) || isVarComplex(pvApiCtx, piAddrVar)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A real expected.\n"), fname, iVar); return SWIG_ERROR; } if (!isScalar(pvApiCtx, piAddrVar)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A real expected.\n"), fname, iVar); return SWIG_ERROR; } iRet = getScalarDouble(pvApiCtx, piAddrVar, pdblValue); if (iRet) { return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_From_frag(double), "header", fragment="SWIG_SciDouble_FromDouble") { %#define SWIG_From_double(scilabValue) SWIG_SciDouble_FromDouble(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromDouble", "header") { SWIGINTERN int SWIG_SciDouble_FromDouble(void *pvApiCtx, int iVarOut, double dblValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, dblValue)) return SWIG_ERROR; return SWIG_OK; } } /* * DOUBLE ARRAY */ %fragment("SWIG_SciDouble_AsDoubleArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_AsDoubleArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, double **pdValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isDoubleType(pvApiCtx, piAddrVar) && !isVarComplex(pvApiCtx, piAddrVar)) { sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, pdValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromDoubleArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromDoubleArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, double *pdblValue) { SciErr sciErr; sciErr = createMatrixOfDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, pdblValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_CreateScilabVariable_frag(double), "wrapper") { SWIGINTERN int SWIG_CreateScilabVariable_dec(double)(void *pvApiCtx, const char* psVariableName, const double dVariableValue) { SciErr sciErr; sciErr = createNamedMatrixOfDouble(pvApiCtx, psVariableName, 1, 1, &dVariableValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } swig-4.0.2/Lib/scilab/std_multiset.i0000644000175000017500000000152613667507523017223 0ustar williamwilliam/* * * C++ type : STL multiset * Scilab type : matrix (for primitive types) or list (for pointer types) * */ %fragment("StdMultisetTraits", "header", fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const SwigSciObject &obj, std::multiset **multiset) { return traits_asptr_stdseq >::asptr(obj, multiset); } }; template struct traits_from > { static SwigSciObject from(const std::multiset& multiset) { return traits_from_stdseq >::from(multiset); } }; } %} #define %swig_multiset_methods(Set...) %swig_sequence_methods(Type) #define %swig_multiset_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/scilab/sciexception.swg0000644000175000017500000000354413667507523017552 0ustar williamwilliam/* * Exception typemaps (throws) */ %include %typemap(throws, noblock=1) int, unsigned int, signed int, int&,unsigned int&, signed int&, long, unsigned long, signed long, short, unsigned short,signed short, long long, unsigned long long, unsigned char, signed char, long&, unsigned long&, signed long&, short&, unsigned short&, signed short&, long long&, unsigned long long&, unsigned char&, signed char&, size_t, size_t&, ptrdiff_t, ptrdiff_t& { char obj[20]; sprintf(obj, "%d", (int)$1); SWIG_Scilab_Raise_Ex(obj, "$type", $descriptor); } %typemap(throws, noblock=1) enum SWIGTYPE { char obj[20]; sprintf(obj, "%d", (int)$1); SWIG_Scilab_Raise_Ex(obj, "$type", $descriptor); } %typemap(throws, noblock=1) float, double, float&, double& { char obj[20]; sprintf(obj, "%5.3f", (double)$1); SWIG_Scilab_Raise_Ex(obj, "$type", $descriptor); } %typemap(throws, noblock=1) bool, bool& { SWIG_Scilab_Raise_Ex($1 ? "true" : "false", "$type", $descriptor); } %typemap(throws, noblock=1) char*, char[ANY] { SWIG_Scilab_Raise_Ex($1, "$type", $descriptor); } %typemap(throws, noblock=1) char, char& { char obj[2]; sprintf(obj, "%c", (char)$1); SWIG_Scilab_Raise_Ex(obj, "$type", $descriptor); } %typemap(throws, noblock=1) SWIGTYPE, SWIGTYPE*, SWIGTYPE [ANY], SWIGTYPE & { SWIG_Scilab_Raise_Ex((char*)NULL, "$type", $descriptor); } %typemap(throws, noblock=1) (...) { SWIG_exception(SWIG_RuntimeError, "unknown exception"); } swig-4.0.2/Lib/scilab/scirun.swg0000644000175000017500000003501713667507523016360 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Scilab support runtime * -----------------------------------------------------------------------------*/ /* Scilab version macro */ #include "version.h" #define SWIG_SCILAB_VERSION (SCI_VERSION_MAJOR * 100) + (SCI_VERSION_MINOR * 10) + SCI_VERSION_MAINTENANCE /* Scilab standard headers */ #ifdef __cplusplus extern "C" { #endif #include "api_scilab.h" #if SWIG_SCILAB_VERSION < 540 #define __USE_DEPRECATED_STACK_FUNCTIONS__ #include "stack-c.h" #endif #if SWIG_SCILAB_VERSION < 600 #include "MALLOC.h" #endif #include "Scierror.h" #include "localization.h" #include "freeArrayOfString.h" #include #include #ifdef __cplusplus } #endif /* Gateway signature */ #if SWIG_SCILAB_VERSION >= 600 #define SWIG_GatewayParameters char* fname, void *pvApiCtx #define SWIG_GatewayArguments fname, pvApiCtx #else #define SWIG_GatewayParameters char* fname, unsigned long fname_len #define SWIG_GatewayArguments fname, fname_len #endif /* Function name management functions */ #include static char *SwigFuncName = NULL; static char *SWIG_Scilab_GetFuncName(void) { return SwigFuncName; } static void SWIG_Scilab_SetFuncName(char *funcName) { if (SwigFuncName != NULL) { free(SwigFuncName); SwigFuncName = NULL; } if (funcName) { SwigFuncName = (char *)malloc(strlen(funcName) + 1); if (SwigFuncName) strcpy(SwigFuncName, funcName); } } /* Api context management functions */ #if SWIG_SCILAB_VERSION >= 600 static void *pvApiCtx = NULL; static void SWIG_Scilab_SetApiContext(void *apiCtx) { pvApiCtx = apiCtx; } #else #define SWIG_Scilab_SetApiContext(apiCtx) #endif /* Argument management functions */ #if SWIG_SCILAB_VERSION >= 540 #define SWIG_CheckInputArgument(pvApiCtx, minInputArgument, maxInputArgument) CheckInputArgument(pvApiCtx, minInputArgument, maxInputArgument) #define SWIG_CheckInputArgumentAtLeast(pvApiCtx, minInputArgument) CheckInputArgumentAtLeast(pvApiCtx, minInputArgument) #define SWIG_CheckOutputArgument(pvApiCtx, minOutputArgument, maxOutputArgument) CheckOutputArgument(pvApiCtx, minOutputArgument, maxOutputArgument) #define SWIG_NbInputArgument(pvApiCtx) nbInputArgument(pvApiCtx) #define SWIG_AssignOutputArgument(pvApiCtx, outputArgumentPos, argumentPos) AssignOutputVariable(pvApiCtx, outputArgumentPos) = argumentPos #else #define SWIG_CheckInputArgument(pvApiCtx, minInputArgument, maxInputArgument) CheckRhs(minInputArgument, maxInputArgument) #define SWIG_CheckInputArgumentAtLeast(pvApiCtx, minInputArgument) CheckRhs(minInputArgument, 256) #define SWIG_CheckOutputArgument(pvApiCtx, minOutputArgument, maxOutputArgument) CheckLhs(minOutputArgument, maxOutputArgument) #define SWIG_NbInputArgument(pvApiCtx) Rhs #define SWIG_AssignOutputArgument(pvApiCtx, outputArgumentPos, argumentPos) LhsVar(outputArgumentPos) = argumentPos #endif typedef int SwigSciObject; static int SwigOutputPosition = -1; static int SWIG_Scilab_GetOutputPosition(void) { return SwigOutputPosition; } static void SWIG_Scilab_SetOutputPosition(int outputPosition) { SwigOutputPosition = outputPosition; } SWIGRUNTIME int SWIG_Scilab_SetOutput(void *pvApiCtx, SwigSciObject output) { int outputPosition = SWIG_Scilab_GetOutputPosition(); if (outputPosition < 0) return SWIG_ERROR; SWIG_AssignOutputArgument(pvApiCtx, outputPosition, SWIG_NbInputArgument(pvApiCtx) + outputPosition); return SWIG_OK; } /* Error functions */ #define SCILAB_API_ARGUMENT_ERROR 999 SWIGINTERN const char* SWIG_Scilab_ErrorType(int code) { switch(code) { case SWIG_MemoryError: return "MemoryError"; case SWIG_IOError: return "IOError"; case SWIG_RuntimeError: return "RuntimeError"; case SWIG_IndexError: return "IndexError"; case SWIG_TypeError: return "TypeError"; case SWIG_DivisionByZero: return "ZeroDivisionError"; case SWIG_OverflowError: return "OverflowError"; case SWIG_SyntaxError: return "SyntaxError"; case SWIG_ValueError: return "ValueError"; case SWIG_SystemError: return "SystemError"; case SWIG_AttributeError: return "AttributeError"; default: return "RuntimeError"; } } #define SWIG_ErrorType(code) SWIG_Scilab_ErrorType(code) #ifndef SWIG_SCILAB_ERROR #define SWIG_SCILAB_ERROR 20000 #endif SWIGINTERN void SWIG_Scilab_Error(int code, const char *msg) { Scierror(SWIG_SCILAB_ERROR - code, _("SWIG/Scilab: %s: %s\n"), SWIG_Scilab_ErrorType(code), msg); } #define SWIG_Error(code, msg) SWIG_Scilab_Error(code, msg) #define SWIG_fail return SWIG_ERROR; SWIGRUNTIME void SWIG_Scilab_Raise_Ex(const char *obj, const char *type, swig_type_info *descriptor) { if (type) { if (obj) Scierror(SWIG_SCILAB_ERROR, "SWIG/Scilab: Exception (%s) occurred: %s\n", type, obj); else Scierror(SWIG_SCILAB_ERROR, "SWIG/Scilab: Exception (%s) occurred.\n", type); } } SWIGRUNTIME void SWIG_Scilab_Raise(const int obj, const char *type, swig_type_info *descriptor) { Scierror(SWIG_SCILAB_ERROR, "SWIG/Scilab: Exception (%s) occurred.\n", type); } /* Module initialization */ static int swig_module_initialized = 0; SWIGRUNTIME int SWIG_Module_Initialized() { return swig_module_initialized; } /* Pointer conversion functions */ SWIGRUNTIME swig_type_info * SWIG_Scilab_TypeQuery(const char *name); SWIGINTERN int SwigScilabCheckPtr(void *pvApiCtx, int iVar, swig_type_info *descriptor, char *fname) { SciErr sciErr; int *piAddrVar = NULL; int iType = 0; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_mlist) { int iItemCount = 0; void *pvTypeinfo = NULL; sciErr = getListItemNumber(pvApiCtx, piAddrVar, &iItemCount); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iItemCount < 3) { return SWIG_ERROR; } sciErr = getPointerInList(pvApiCtx, piAddrVar, 2, &pvTypeinfo); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (descriptor) { swig_cast_info *cast = SWIG_TypeCheck(SWIG_TypeName((swig_type_info*)pvTypeinfo), descriptor); return (cast != NULL); } else { return SWIG_ERROR; } } else { return (iType == sci_pointer); } } SWIGINTERN int SwigScilabPtrToObject(void *pvApiCtx, int iVar, void **pvObj, swig_type_info *descriptor, int flags, char *fname) { SciErr sciErr; int *piAddrVar = NULL; int iType = 0; void *pvPtr = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_mlist) { int iItemCount = 0; void *pvTypeinfo = NULL; sciErr = getListItemNumber(pvApiCtx, piAddrVar, &iItemCount); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iItemCount < 3) { return SWIG_ERROR; } sciErr = getPointerInList(pvApiCtx, piAddrVar, 2, &pvTypeinfo); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getPointerInList(pvApiCtx, piAddrVar, 3, &pvPtr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (pvPtr) { if (descriptor) { swig_cast_info *cast = SWIG_TypeCheck(SWIG_TypeName((swig_type_info *)pvTypeinfo), descriptor); if (cast) { int newmemory = 0; pvPtr = SWIG_TypeCast(cast, pvPtr, &newmemory); // TODO newmemory } else { return SWIG_ERROR; } } } } else if (iType == sci_pointer) { sciErr = getPointer(pvApiCtx, piAddrVar, &pvPtr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { return SWIG_ERROR; } if (pvObj) { *pvObj = pvPtr; if (pvPtr) return SWIG_OK; else return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } else { return SWIG_ERROR; } } SWIGRUNTIMEINLINE int SwigScilabPtrFromObject(void *pvApiCtx, int iVarOut, void *pvObj, swig_type_info *descriptor, int flags, const char *pstTypeName) { SciErr sciErr; if (descriptor) { int *piMListAddr = NULL; sciErr = createMList(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, 3, &piMListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (pstTypeName == NULL) { pstTypeName = SWIG_TypeName(descriptor); } sciErr = createMatrixOfStringInList(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, piMListAddr, 1, 1, 1, &pstTypeName); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = createPointerInList(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, piMListAddr, 2, descriptor); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = createPointerInList(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, piMListAddr, 3, pvObj); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { sciErr = createPointer(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, pvObj); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } return SWIG_OK; } /* Pointer argument conversions */ SWIGRUNTIME int SWIG_Scilab_ConvertPacked(void *pvApiCtx, int iVar, void *ptr, int sz, swig_type_info *ty, char *fname) { swig_cast_info *tc; int *piAddrVar = NULL; char *pstString = NULL; char *pstStringPtr = NULL; SciErr sciErr; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (getAllocatedSingleString(pvApiCtx, piAddrVar, &pstString)) { return SWIG_ERROR; } /* Pointer values must start with leading underscore */ if (*pstString != '_') { freeAllocatedSingleString(pstString); return SWIG_ERROR; } pstStringPtr = pstString; pstStringPtr++; pstStringPtr = (char*)SWIG_UnpackData(pstStringPtr, ptr, sz); if (ty) { if (!pstStringPtr) { freeAllocatedSingleString(pstString); return SWIG_ERROR; } tc = SWIG_TypeCheck(pstStringPtr, ty); if (!tc) { freeAllocatedSingleString(pstString); return SWIG_ERROR; } } freeAllocatedSingleString(pstString); return SWIG_OK; } SWIGRUNTIME int SWIG_Scilab_NewMemberObj(void *pvApiCtx, int iVarOut, void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(type->name)) > 1000) { return SWIG_ERROR; } *(r++) = '_'; r = SWIG_PackData(r, ptr, sz); strcpy(r, type->name); if (createSingleString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, &result[0])) return SWIG_ERROR; return SWIG_OK; } /* * Pointer utility functions */ #include #ifdef __cplusplus extern "C" #endif int SWIG_this(SWIG_GatewayParameters) { void *ptrValue = NULL; if (SwigScilabPtrToObject(pvApiCtx, 1, &ptrValue, NULL, 0, fname) == SWIG_OK) { SWIG_Scilab_SetOutputPosition(1); return SWIG_Scilab_SetOutput(pvApiCtx, createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + 1, (double)(uintptr_t)ptrValue)); } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The value is not a pointer.\n"), fname, 1); return SWIG_ERROR; } } #ifdef __cplusplus extern "C" #endif int SWIG_ptr(SWIG_GatewayParameters) { if (SWIG_NbInputArgument(pvApiCtx) > 0) { SciErr sciErr; int *piAddrVar1 = NULL; int iTypeVar1 = 0; char *pstInputPtrTypeName = NULL; char *pstOutputMListTypeName = NULL; if (SWIG_NbInputArgument(pvApiCtx) > 2) { int *piAddrVar2 = NULL; int *piAddrVar3 = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddrVar2); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (getAllocatedSingleString(pvApiCtx, piAddrVar2, &pstInputPtrTypeName)) { return SWIG_ERROR; } sciErr = getVarAddressFromPosition(pvApiCtx, 3, &piAddrVar3); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (getAllocatedSingleString(pvApiCtx, piAddrVar3, &pstOutputMListTypeName)) { return SWIG_ERROR; } } sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddrVar1); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar1, &iTypeVar1); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if ((iTypeVar1 == sci_pointer) || (iTypeVar1 == sci_mlist)) { void *ptrValue = NULL; if (SwigScilabPtrToObject(pvApiCtx, 1, &ptrValue, SWIG_Scilab_TypeQuery(pstInputPtrTypeName), 0, (char *) "SWIG_ptr") == SWIG_OK) { SWIG_Scilab_SetOutputPosition(1); return SWIG_Scilab_SetOutput(pvApiCtx, SwigScilabPtrFromObject(pvApiCtx, 1, ptrValue, SWIG_Scilab_TypeQuery(pstInputPtrTypeName), 0, pstOutputMListTypeName)); } else { return SWIG_ERROR; } } else if (iTypeVar1 == sci_matrix) { double dValue = 0; if (getScalarDouble(pvApiCtx, piAddrVar1, &dValue) == 0) { if (dValue != (uintptr_t)dValue) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a pointer.\n"), fname, 1); return SWIG_ValueError; } if ((dValue < 0) || (dValue > ULONG_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a pointer.\n"), fname, 1); return SWIG_OverflowError; } SWIG_Scilab_SetOutputPosition(1); return SWIG_Scilab_SetOutput(pvApiCtx, SwigScilabPtrFromObject(pvApiCtx, 1, (void *) (uintptr_t)dValue, SWIG_Scilab_TypeQuery(pstInputPtrTypeName), 0, pstOutputMListTypeName)); } else { return SWIG_TypeError; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A mlist, pointer or a double expected.\n"), (char *) "SWIG_ptr", 1); return SWIG_TypeError; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: A mlist, pointer, or a double expected.\n"), "SWIG_ptr", 1); return SWIG_TypeError; } } swig-4.0.2/Lib/scilab/scimatrixdouble.swg0000644000175000017500000001075513667507523020255 0ustar williamwilliam/* * C-type: double array * Scilab type: double matrix */ %include // in (double *IN, int IN_ROWCOUNT, int IN_COLCOUNT) %typemap(in, noblock=1, fragment="SWIG_SciDouble_AsDoubleArrayAndSize") (double *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, $input, &$2, &$3, &$1, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int IN_ROWCOUNT, int IN_COLCOUNT, double *IN) %typemap(in, noblock=1, fragment="SWIG_SciDouble_AsDoubleArrayAndSize") (int IN_ROWCOUNT, int IN_COLCOUNT, double *IN) { if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, $input, &$1, &$2, &$3, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (double *IN, int IN_SIZE) %typemap(in, noblock=1, fragment="SWIG_SciDouble_AsDoubleArrayAndSize") (double *IN, int IN_SIZE) (int rowCount, int colCount) { if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$1, fname) == SWIG_OK) { $2 = rowCount * colCount; } else { return SWIG_ERROR; } } // in (int IN_SIZE, double *IN) %typemap(in, noblock=1, fragment="SWIG_SciDouble_AsDoubleArrayAndSize") (int IN_SIZE, double *IN) (int rowCount, int colCount) { if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$2, fname) == SWIG_OK) { $1 = rowCount * colCount; } else { return SWIG_ERROR; } } // out (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) %typemap(in, noblock=1, numinputs=0) (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { } %typemap(arginit, noblock=1) (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { $1 = (double**) malloc(sizeof(double*)); $2 = (int*) malloc(sizeof(int)); $3 = (int*) malloc(sizeof(int)); } %typemap(freearg, noblock=1) (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { free(*$1); free($1); free($2); free($3); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromDoubleArrayAndSize") (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { if (SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$3, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } // out (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, double **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, double **OUT) { } %typemap(arginit, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, double **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (int*) malloc(sizeof(int)); $3 = (double**) malloc(sizeof(double*)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromDoubleArrayAndSize") (int *IN_ROWCOUNT, int *IN_COLCOUNT, double **OUT) { if (SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2, *$3) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, double **OUT) { free($1); free($2); free(*$3); free($3); } // out (double **OUT, int *OUT_SIZE) %typemap(in, noblock=1, numinputs=0) (double **OUT, int *OUT_SIZE) { } %typemap(arginit, noblock=1) (double **OUT, int *OUT_SIZE) { $1 = (double**) malloc(sizeof(double*)); $2 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromDoubleArrayAndSize") (double **OUT, int *OUT_SIZE) { if (SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$2, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (double **OUT, int *OUT_SIZE) { free(*$1); free($1); free($2); } // out (int *OUT_SIZE, double **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_SIZE, double **OUT) { } %typemap(arginit, noblock=1) (int *OUT_SIZE, double **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (double**) malloc(sizeof(double*)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromDoubleArrayAndSize") (int *OUT_SIZE, double **OUT) { if (SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$1, *$2) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_SIZE, double **OUT) { free($1); free(*$2); free($2); } swig-4.0.2/Lib/scilab/cpointer.i0000644000175000017500000000004113667507523016315 0ustar williamwilliam%include swig-4.0.2/Lib/scilab/std_shared_ptr.i0000644000175000017500000000010413667507523017477 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.2/Lib/scilab/scisignedchar.swg0000644000175000017500000001354213667507523017662 0ustar williamwilliam/* * C-type: signed char * Scilab type: double or int8 */ %fragment(SWIG_AsVal_frag(signed char), "header", fragment="SWIG_SciDoubleOrInt8_AsSignedChar", fragment="") { #define SWIG_AsVal_signed_SS_char(scilabValue, valuePointer) SWIG_SciDoubleOrInt8_AsSignedChar(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDoubleOrInt8_AsSignedChar", "header") { SWIGINTERN int SWIG_SciDoubleOrInt8_AsSignedChar(void *pvApiCtx, int iVar, signed char *pscValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { char *pcData = NULL; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT8) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } sciErr = getMatrixOfInteger8(pvApiCtx, piAddrVar, &iRows, &iCols, &pcData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 8-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } *pscValue = *pcData; } else if (iType == sci_matrix) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 8-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 8-bit signed integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < SCHAR_MIN) || (dValue > SCHAR_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 8-bit signed integer.\n"), fname, iVar); return SWIG_OverflowError; } *pscValue = (signed char) dValue; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } return SWIG_OK; } } %fragment(SWIG_From_frag(signed char), "header", fragment="SWIG_SciDouble_FromSignedChar") { #define SWIG_From_signed_SS_char(scilabValue) SWIG_SciDouble_FromSignedChar(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue) } %fragment("SWIG_SciDouble_FromSignedChar", "header") { SWIGINTERN int SWIG_SciDouble_FromSignedChar(void *pvApiCtx, int iVarOut, signed char scValue) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) scValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: signed char[] * Scilab type: double or int8 matrix */ %fragment("SWIG_SciDoubleOrInt8_AsSignedCharArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrInt8_AsSignedCharArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, signed char **pscValue, char *fname) { SciErr sciErr; int iType = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *pscValue = (signed char*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*pscValue)[i] = (signed char) pdData[i]; } else if (iType == sci_ints) { int iPrec = 0; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT8) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfInteger8(pvApiCtx, piAddrVar, iRows, iCols, (char **)pscValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromSignedCharArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromSignedCharArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const signed char *pscValue) { SciErr sciErr; int i; double *pdValues = NULL; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i struct traits_asptr > { static int asptr(const SwigSciObject &obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static SwigSciObject from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/scilab/sciarray.swg0000644000175000017500000000730613667507523016672 0ustar williamwilliam/* -------------------------------------------------------------------------- * * Arrays typemaps * * --------------------------------------------------------------------------*/ %{ #include %} %define %scilab_asarray_withallocatecopy(TYPEMAPTYPE, FRAGMENTNAME, CTYPE, TEMPDATATYPE) %typemap(TYPEMAPTYPE, fragment="FRAGMENTNAME") CTYPE { size_t i = 0; int iRows = 0; int iCols = 0; TEMPDATATYPE *pTempData = NULL; if (FRAGMENTNAME(pvApiCtx, $input, &iRows, &iCols, &pTempData, fname)) { return SWIG_ERROR; } $1 = ($1_ltype)MALLOC(sizeof($*1_ltype) * iRows * iCols); for (i = 0; i < iRows * iCols; i++) { $1[i] = ($*1_ltype) pTempData[i]; } } %enddef %define %scilab_asarrayandsize_withcopy(TYPEMAPTYPE, FRAGMENTNAME, CTYPE, TEMPDATATYPE) %typemap(TYPEMAPTYPE, fragment="FRAGMENTNAME") CTYPE { int iRows = 0; int iCols = 0; TEMPDATATYPE *pTempData = NULL; if (FRAGMENTNAME(pvApiCtx, $input, &iRows, &iCols, &pTempData, fname)) { return SWIG_ERROR; } if (iRows*iCols <= $1_dim0) { size_t i; for (i = 0; i < $1_dim0; i++) { $1[i] = ($*1_ltype) pTempData[i]; } } else { char errmsg[100]; sprintf(errmsg, "Size of input data (%d) is too big (maximum is %d)", iRows*iCols, $1_dim0); SWIG_exception_fail(SWIG_OverflowError, errmsg); } } %enddef %define %scilab_fromarrayandsize(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { %set_output(FRAGMENTNAME(pvApiCtx, $result, 1, $1_dim0, $1)); } %enddef %define %scilab_array_typemaps(CTYPE, ASARRAY_FRAGMENT, FROMARRAY_FRAGMENT, TEMPDATATYPE) %scilab_asarrayandsize_withcopy(varin, ASARRAY_FRAGMENT, CTYPE[ANY], TEMPDATATYPE); %scilab_asarray_withallocatecopy(in, ASARRAY_FRAGMENT, CTYPE[ANY], TEMPDATATYPE); %scilab_fromarrayandsize(varout, FROMARRAY_FRAGMENT, CTYPE[ANY]); %scilab_fromarrayandsize(out, FROMARRAY_FRAGMENT, CTYPE[ANY]); %apply SWIGTYPE[] { CTYPE[] }; %scilab_asarray_withallocatecopy(in, ASARRAY_FRAGMENT, CTYPE[], TEMPDATATYPE); %enddef // Double %scilab_array_typemaps(double, SWIG_SciDouble_AsDoubleArrayAndSize, SWIG_SciDouble_FromDoubleArrayAndSize, double); // Signed char %scilab_array_typemaps(signed char, SWIG_SciDoubleOrInt8_AsSignedCharArrayAndSize, SWIG_SciDouble_FromSignedCharArrayAndSize, signed char); // Unsigned char %scilab_array_typemaps(unsigned char, SWIG_SciDoubleOrUint8_AsUnsignedCharArrayAndSize, SWIG_SciDouble_FromUnsignedCharArrayAndSize, unsigned char); // Short %scilab_array_typemaps(short, SWIG_SciDoubleOrInt16_AsShortArrayAndSize, SWIG_SciDouble_FromShortArrayAndSize, short); // Unsigned short %scilab_array_typemaps(unsigned short, SWIG_SciDoubleOrUint16_AsUnsignedShortArrayAndSize, SWIG_SciDouble_FromUnsignedShortArrayAndSize, unsigned short); // Int %scilab_array_typemaps(int, SWIG_SciDoubleOrInt32_AsIntArrayAndSize, SWIG_SciDouble_FromIntArrayAndSize, int); // Unsigned int %scilab_array_typemaps(unsigned int, SWIG_SciDoubleOrUint32_AsUnsignedIntArrayAndSize, SWIG_SciDouble_FromUnsignedIntArrayAndSize, unsigned int); // Long %scilab_array_typemaps(long, SWIG_SciDoubleOrInt32_AsIntArrayAndSize, SWIG_SciDouble_FromLongArrayAndSize, int); // Unsigned long %scilab_array_typemaps(unsigned long, SWIG_SciDoubleOrUint32_AsUnsignedIntArrayAndSize, SWIG_SciDouble_FromUnsignedLongArrayAndSize, unsigned int); // Float %scilab_array_typemaps(float, SWIG_SciDouble_AsFloatArrayAndSize, SWIG_SciDouble_FromFloatArrayAndSize, float); // Bool %scilab_array_typemaps(bool, SWIG_SciBoolean_AsIntArrayAndSize, SWIG_SciBoolean_FromBoolArrayAndSize, int); // Char * %scilab_array_typemaps(char *, SWIG_SciString_AsCharPtrArrayAndSize, SWIG_SciString_FromCharPtrArrayAndSize, char *); swig-4.0.2/Lib/scilab/std_alloc.i0000644000175000017500000000003413667507523016440 0ustar williamwilliam%include swig-4.0.2/Lib/scilab/scisequenceint.swg0000644000175000017500000000552713667507523020102 0ustar williamwilliam/* * * Scilab matrix of int <-> C++ int container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(int), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(int)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; int iType = 0; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if ((iType == sci_matrix) || (iType == sci_ints)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: An integer is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(int), "header", fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(int)(SwigSciObject obj, int **pSequence) { int iMatrixRowCount; int iMatrixColCount; return (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(int), "header", fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(int)(SwigSciObject obj, int *piSize) { int *piMatrix; int iMatrixRowCount; int iMatrixColCount; if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, &piMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { if ((iMatrixRowCount > 1) && (iMatrixColCount > 1)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: An integer vector is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } *piSize = iMatrixRowCount * iMatrixColCount; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(int), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(int)(int size, int **pSequence) { *pSequence = new int[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(int), "header", fragment="SWIG_SciDouble_FromIntArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(int)(int size, int *pSequence) { SwigSciObject obj = SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (int *)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(int), "header") { SWIGINTERN int SWIG_AsVal_SequenceItem_dec(int)(SwigSciObject obj, int *pSequence, int iItemIndex) { return pSequence[iItemIndex]; } } %fragment(SWIG_From_SequenceItem_frag(int), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(int)(int *pSequence, int iItemIndex, int itemValue) { pSequence[iItemIndex] = itemValue; return SWIG_OK; } } swig-4.0.2/Lib/scilab/scilong.swg0000644000175000017500000000775013667507523016516 0ustar williamwilliam/* * C-type: long * Scilab type: double or int32 */ %fragment(SWIG_AsVal_frag(long), "header", fragment="SWIG_SciDoubleOrInt32_AsLong", fragment="") { %#define SWIG_AsVal_long(scilabValue, valuePointer) SWIG_SciDoubleOrInt32_AsLong(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()); } %fragment("SWIG_SciDoubleOrInt32_AsLong", "header") { SWIGINTERN int SWIG_SciDoubleOrInt32_AsLong(void *pvApiCtx, SwigSciObject iVar, long *plValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { int iPrec = 0; int *piData = NULL; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } sciErr = getMatrixOfInteger32(pvApiCtx, piAddrVar, &iRows, &iCols, &piData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } *plValue = (long) *piData; } else if (iType == sci_matrix) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < LONG_MIN) || (dValue > LONG_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar); return SWIG_OverflowError; } *plValue = (long) dValue; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } return SWIG_OK; } } %fragment(SWIG_From_frag(long), "header", fragment="SWIG_SciDouble_FromLong") { %#define SWIG_From_long(scilabValue) SWIG_SciDouble_FromLong(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromLong", "header") { SWIGINTERN int SWIG_SciDouble_FromLong(void *pvApiCtx, int iVarOut, long lValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) lValue)) return SWIG_ERROR; return SWIG_OK; } } %fragment("SWIG_SciDouble_FromLongArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromLongArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const long *plData) { SciErr sciErr; int i; double *pdValues = NULL; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i // in (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT) %typemap(in, noblock=1, fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, $input, &$2, &$3, &$1, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int IN_ROWCOUNT, int IN_COLCOUNT, int *IN) %typemap(in, noblock=1, fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") (int IN_ROWCOUNT, int IN_COLCOUNT, int *IN) { if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, $input, &$1, &$2, &$3, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int *IN, int IN_SIZE) %typemap(in, noblock=1, fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") (int *IN, int IN_SIZE) (int rowCount, int colCount) { if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$1, fname) == SWIG_OK) { $2 = rowCount * colCount; } else { return SWIG_ERROR; } } // in (int IN_SIZE, int *IN) %typemap(in, noblock=1, fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") (int IN_SIZE, int *IN) (int rowCount, int colCount) { if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$2, fname) == SWIG_OK) { $1 = rowCount * colCount; } else { return SWIG_ERROR; } } // out (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) %typemap(in, noblock=1, numinputs=0) (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { } %typemap(arginit, noblock=1) (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { $1 = (int**) malloc(sizeof(int*)); $2 = (int*) malloc(sizeof(int)); $3 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromIntArrayAndSize") (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { if (SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$3, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { free(*$1); free($1); free($2); free($3); } // out (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) { } %typemap(arginit, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (int*) malloc(sizeof(int)); $3 = (int**) malloc(sizeof(int*)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromIntArrayAndSize") (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) { if (SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2, *$3) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) { free($1); free($2); free(*$3); free($3); } // out (int **OUT, int *OUT_SIZE) %typemap(in, noblock=1, numinputs=0) (int **OUT, int *OUT_SIZE) { } %typemap(arginit) (int **OUT, int *OUT_SIZE) { $1 = (int**) malloc(sizeof(int*)); $2 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromIntArrayAndSize") (int **OUT, int *OUT_SIZE) { if (SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$2, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int **OUT, int *OUT_SIZE) { free(*$1); free($1); free($2); } // out (int *OUT_SIZE, int **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_SIZE, int **OUT) { } %typemap(arginit, noblock=1) (int *OUT_SIZE, int **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (int**) malloc(sizeof(int*)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromIntArrayAndSize") (int *OUT_SIZE, int **OUT) { if (SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$1, *$2) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *IN_SIZE, int **OUT) { free($1); free(*$2); free($2); } swig-4.0.2/Lib/scilab/std_set.i0000644000175000017500000000141613667507523016146 0ustar williamwilliam/* * * C++ type : STL set * Scilab type : matrix (for primitive types) or list (for pointer types) * */ %fragment("StdSetTraits", "header", fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const SwigSciObject &obj, std::set **set) { return traits_asptr_stdseq >::asptr(obj, set); } }; template struct traits_from > { static SwigSciObject from(const std::set& set) { return traits_from_stdseq >::from(set); } }; } %} #define %swig_set_methods(Type...) %swig_sequence_methods(Type) #define %swig_set_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/scilab/scimacros.swg0000644000175000017500000000041213667507523017027 0ustar williamwilliam #define %scilabconst(flag) %feature("scilab:const","flag") // Create Scilab variable #define SWIG_CreateScilabVariable_frag(Type...) %fragment_name(CreateScilabVariable, Type) #define SWIG_CreateScilabVariable_dec(Type...) %symbol_name(CreateScilabVariable, Type) swig-4.0.2/Lib/scilab/std_container.i0000644000175000017500000000007413667507523017334 0ustar williamwilliam%include %include swig-4.0.2/Lib/scilab/sciiterators.swg0000644000175000017500000002211513667507523017563 0ustar williamwilliam/* ----------------------------------------------------------------------------- * sciiterators.swg * * Users can derive form the SciSwigIterator to implement their * own iterators. As an example (real one since we use it for STL/STD * containers), the template SwigSciIterator_T does the * implementation for generic C++ iterators. * ----------------------------------------------------------------------------- */ %include %fragment("SciSwigIterator","header",fragment="") { namespace swig { struct stop_iteration { }; struct SciSwigIterator { private: SwigSciObject _seq; protected: SciSwigIterator(SwigSciObject seq) : _seq(seq) { } public: virtual ~SciSwigIterator() {} virtual SwigSciObject value() const = 0; virtual SciSwigIterator *incr(size_t n = 1) = 0; virtual SciSwigIterator *decr(size_t n = 1) { throw stop_iteration(); } virtual ptrdiff_t distance(const SciSwigIterator &x) const { throw std::invalid_argument("operation not supported"); } virtual bool equal (const SciSwigIterator &x) const { throw std::invalid_argument("operation not supported"); } virtual SciSwigIterator *copy() const = 0; SwigSciObject next() { SwigSciObject obj = value(); incr(); return obj; } SwigSciObject previous() { decr(); return value(); } SciSwigIterator *advance(ptrdiff_t n) { return (n > 0) ? incr(n) : decr(-n); } bool operator == (const SciSwigIterator& x) const { return equal(x); } bool operator != (const SciSwigIterator& x) const { return ! operator==(x); } SciSwigIterator* operator ++ () { incr(); return this; } SciSwigIterator* operator -- () { decr(); return this; } SciSwigIterator* operator + (ptrdiff_t n) const { return copy()->advance(n); } SciSwigIterator* operator - (ptrdiff_t n) const { return copy()->advance(-n); } ptrdiff_t operator - (const SciSwigIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::SciSwigIterator *"); init = 1; } return desc; } }; } } %fragment("SwigSciIterator_T","header",fragment="",fragment="SciSwigIterator",fragment="StdTraits",fragment="StdIteratorTraits") { namespace swig { template class SwigSciIterator_T : public SciSwigIterator { public: typedef OutIterator out_iterator; typedef typename std::iterator_traits::value_type value_type; typedef SwigSciIterator_T self_type; SwigSciIterator_T(out_iterator curr, SwigSciObject seq) : SciSwigIterator(seq), current(curr) { } const out_iterator& get_current() const { return current; } bool equal (const SciSwigIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } ptrdiff_t distance(const SciSwigIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } protected: out_iterator current; }; template struct from_oper { typedef const ValueType& argument_type; typedef SwigSciObject result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; template::value_type, typename FromOper = from_oper > class SciSwigIteratorOpen_T : public SwigSciIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigSciIterator_T base; typedef SciSwigIteratorOpen_T self_type; SciSwigIteratorOpen_T(out_iterator curr, SwigSciObject seq) : SwigSciIterator_T(curr, seq) { } SwigSciObject value() const { return from(static_cast(*(base::current))); } SciSwigIterator *copy() const { return new self_type(*this); } SciSwigIterator *incr(size_t n = 1) { while (n--) { ++base::current; } return this; } SciSwigIterator *decr(size_t n = 1) { while (n--) { --base::current; } return this; } }; template::value_type, typename FromOper = from_oper > class SciSwigIteratorClosed_T : public SwigSciIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigSciIterator_T base; typedef SciSwigIteratorClosed_T self_type; SciSwigIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, SwigSciObject seq) : SwigSciIterator_T(curr, seq), begin(first), end(last) { } SwigSciObject value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } SciSwigIterator *copy() const { return new self_type(*this); } SciSwigIterator *incr(size_t n = 1) { while (n--) { if (base::current == end) { throw stop_iteration(); } else { ++base::current; } } return this; } SciSwigIterator *decr(size_t n = 1) { while (n--) { if (base::current == begin) { throw stop_iteration(); } else { --base::current; } } return this; } private: out_iterator begin; out_iterator end; }; template inline SciSwigIterator* make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, SwigSciObject seq = SwigSciObject()) { return new SciSwigIteratorClosed_T(current, begin, end, seq); } template inline SciSwigIterator* make_output_iterator(const OutIter& current, SwigSciObject seq = SwigSciObject()) { return new SciSwigIteratorOpen_T(current, seq); } } } %fragment("SciSwigIterator"); namespace swig { // Throw a StopIteration exception %ignore stop_iteration; struct stop_iteration {}; %typemap(throws, noblock=1) stop_iteration { SWIG_Scilab_Raise(0, "stop_iteration", NULL); return SWIG_ERROR; } // Mark methods that return new objects %newobject SciSwigIterator::copy; %newobject SciSwigIterator::operator + (ptrdiff_t n) const; %newobject SciSwigIterator::operator - (ptrdiff_t n) const; %nodirector SciSwigIterator; %catches(swig::stop_iteration) SciSwigIterator::value() const; %catches(swig::stop_iteration) SciSwigIterator::incr(size_t n = 1); %catches(swig::stop_iteration) SciSwigIterator::decr(size_t n = 1); %catches(std::invalid_argument) SciSwigIterator::distance(const SciSwigIterator &x) const; %catches(std::invalid_argument) SciSwigIterator::equal (const SciSwigIterator &x) const; %catches(swig::stop_iteration) SciSwigIterator::next(); %catches(swig::stop_iteration) SciSwigIterator::previous(); %catches(swig::stop_iteration) SciSwigIterator::advance(ptrdiff_t n); %catches(swig::stop_iteration) SciSwigIterator::operator += (ptrdiff_t n); %catches(swig::stop_iteration) SciSwigIterator::operator -= (ptrdiff_t n); %catches(swig::stop_iteration) SciSwigIterator::operator + (ptrdiff_t n) const; %catches(swig::stop_iteration) SciSwigIterator::operator - (ptrdiff_t n) const; %ignore SciSwigIterator::operator==; %ignore SciSwigIterator::operator!=; %ignore SciSwigIterator::operator++; %ignore SciSwigIterator::operator--; %ignore SciSwigIterator::operator+; %ignore SciSwigIterator::operator-; struct SciSwigIterator { protected: SciSwigIterator(SwigSciObject seq); public: virtual ~SciSwigIterator(); virtual SwigSciObject value() const = 0; virtual SciSwigIterator *incr(size_t n = 1) = 0; virtual SciSwigIterator *decr(size_t n = 1); virtual ptrdiff_t distance(const SciSwigIterator &x) const; virtual bool equal (const SciSwigIterator &x) const; virtual SciSwigIterator *copy() const = 0; SwigSciObject next(); SwigSciObject previous(); SciSwigIterator *advance(ptrdiff_t n); bool operator == (const SciSwigIterator& x) const; bool operator != (const SciSwigIterator& x) const; SciSwigIterator* operator ++ (); SciSwigIterator* operator -- (); SciSwigIterator* operator + (ptrdiff_t n) const; SciSwigIterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const SciSwigIterator& x) const; }; } swig-4.0.2/Lib/scilab/scisequencefloat.swg0000644000175000017500000000534013667507523020406 0ustar williamwilliam/* * * Scilab matrix of float <-> C++ float container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(float), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(float)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isDoubleType(pvApiCtx, piAddrVar)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A double is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(float), "header", fragment="SWIG_SciDouble_AsFloatArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(float)(SwigSciObject obj, float **pSequence) { int iMatrixRowCount; int iMatrixColCount; return (SWIG_SciDouble_AsFloatArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(float), "header", fragment="SWIG_SciDouble_AsFloatArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(float)(SwigSciObject obj, int *piSize) { float *pdblMatrix; int iMatrixRowCount; int iMatrixColCount; if (SWIG_SciDouble_AsFloatArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, &pdblMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { if ((iMatrixRowCount > 1) && (iMatrixColCount > 1)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A float vector is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } *piSize = iMatrixRowCount * iMatrixColCount; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(float), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(float)(int size, float **pSequence) { *pSequence = new float[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(float), "header", fragment="SWIG_SciDouble_FromFloatArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(float)(int size, float *pSequence) { SwigSciObject obj = SWIG_SciDouble_FromFloatArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (float *)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(float), "header") { SWIGINTERN float SWIG_AsVal_SequenceItem_dec(float)(SwigSciObject obj, float *pSequence, int iItemIndex) { return pSequence[iItemIndex]; } } %fragment(SWIG_From_SequenceItem_frag(float), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(float)(float *pSequence, int iItemIndex, float itemValue) { pSequence[iItemIndex] = itemValue; return SWIG_OK; } } swig-4.0.2/Lib/scilab/sciprimtypes.swg0000644000175000017500000000062613667507523017606 0ustar williamwilliam%include %include %include %include %include %include %include %include %include %include %include %include %include %include %include swig-4.0.2/Lib/scilab/cmalloc.i0000644000175000017500000000004013667507523016103 0ustar williamwilliam%include swig-4.0.2/Lib/scilab/std_basic_string.i0000644000175000017500000000224513667507523020023 0ustar williamwilliam/* * C++: basic_string * Scilab: string */ #define %swig_basic_string(Type...) %swig_sequence_methods_val(Type) %fragment(SWIG_AsPtr_frag(std::basic_string), "header", fragment="SWIG_SciString_AsCharPtrAndLength") { SWIGINTERN int SWIG_AsPtr_dec(std::basic_string)(int _iVar, std::basic_string **_pstValue) { char* buf = 0; size_t len = 0; int alloc = SWIG_OLDOBJ; if (SWIG_IsOK((SWIG_SciString_AsCharPtrAndSize(pvApiCtx, _iVar, &buf, &len, &alloc, SWIG_Scilab_GetFuncName())))) { if (buf) { if (_pstValue) { *_pstValue = new std::string(buf, len - 1); } if (alloc == SWIG_NEWOBJ) { delete[] buf; } return SWIG_NEWOBJ; } else { if (_pstValue) { *_pstValue = NULL; } return SWIG_OLDOBJ; } } else { return SWIG_ERROR; } } } %fragment(SWIG_From_frag(std::basic_string), "header", fragment="SWIG_SciString_FromCharPtr") { SWIGINTERN int SWIG_From_dec(std::basic_string)(std::basic_string _pstValue) { return SWIG_SciString_FromCharPtr(pvApiCtx, SWIG_Scilab_GetOutputPosition(), _pstValue.c_str()); } } %include swig-4.0.2/Lib/scilab/scisequencebool.swg0000644000175000017500000000527713667507523020245 0ustar williamwilliam/* * * Scilab matrix of bool <-> C++ bool container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(bool), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(bool)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isBooleanType(pvApiCtx, piAddrVar)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A boolean is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(bool), "header", fragment="SWIG_SciBoolean_AsIntArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(bool)(SwigSciObject obj, int **pSequence) { int iMatrixRowCount; int iMatrixColCount; return (SWIG_SciBoolean_AsIntArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(bool), "header", fragment="SWIG_SciBoolean_AsIntArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(bool)(SwigSciObject obj, int *piSize) { int *piMatrix; int iMatrixRowCount; int iMatrixColCount; if (SWIG_SciBoolean_AsIntArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, &piMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { if ((iMatrixRowCount > 1) && (iMatrixColCount > 1)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: An integer vector is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } *piSize = iMatrixRowCount * iMatrixColCount; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(bool), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(bool)(int size, int **pSequence) { *pSequence = new int[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(bool), "header", fragment="SWIG_SciBoolean_FromIntArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(bool)(int size, int *pSequence) { SwigSciObject obj = SWIG_SciBoolean_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (int *)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(bool), "header") { SWIGINTERN bool SWIG_AsVal_SequenceItem_dec(bool)(SwigSciObject obj, int *pSequence, int iItemIndex) { return (bool) pSequence[iItemIndex]; } } %fragment(SWIG_From_SequenceItem_frag(bool), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(bool)(int *pSequence, int iItemIndex, bool itemValue) { pSequence[iItemIndex] = itemValue; return SWIG_OK; } } swig-4.0.2/Lib/scilab/std_common.i0000644000175000017500000000443413667507523016646 0ustar williamwilliam%include %include // Generate the traits for a 'primitive' type, such as 'double', // for which the SWIG_AsVal and SWIG_From methods are already defined. %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(SwigSciObject obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static SwigSciObject from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(SwigSciObject obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static SwigSciObject from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-4.0.2/Lib/scilab/std_except.i0000644000175000017500000000004313667507523016636 0ustar williamwilliam%include swig-4.0.2/Lib/scilab/sciunsignedlong.swg0000644000175000017500000000357513667507523020254 0ustar williamwilliam/* * C-type: unsigned long * Scilab type: see unsigned int */ %fragment(SWIG_AsVal_frag(unsigned long), "header", fragment="SWIG_UnsignedInt_AsUnsignedLong") { #define SWIG_AsVal_unsigned_SS_long(scilabValue, valuePointer) SWIG_UnsignedInt_AsUnsignedLong(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_UnsignedInt_AsUnsignedLong", "header", fragment=SWIG_AsVal_frag(unsigned int)) { SWIGINTERN int SWIG_UnsignedInt_AsUnsignedLong(void *pvApiCtx, SwigSciObject iVar, unsigned long *pulValue, char *fname) { unsigned int uiValue = 0; if(SWIG_AsVal_unsigned_SS_int(iVar, &uiValue) != SWIG_OK) { return SWIG_ERROR; } *pulValue = (unsigned long) uiValue; return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned long), "header", fragment="SWIG_UnsignedInt_FromUnsignedLong") { #define SWIG_From_unsigned_SS_long(scilabValue) SWIG_UnsignedInt_FromUnsignedLong(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_UnsignedInt_FromUnsignedLong", "header", fragment=SWIG_From_frag(unsigned int)) { SWIGINTERN int SWIG_UnsignedInt_FromUnsignedLong(void *pvApiCtx, int iVarOut, unsigned long ulValue, char *fname) { return SWIG_From_unsigned_SS_int((unsigned int)ulValue); } } %fragment("SWIG_SciDouble_FromUnsignedLongArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedLongArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const unsigned long *pulValues) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i %include %include %include %include swig-4.0.2/Lib/scilab/typemaps.i0000644000175000017500000000315313667507523016343 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * ----------------------------------------------------------------------------- */ // INPUT typemaps %define %scilab_input_typemap(Type) %typemap(in, noblock=1, fragment=SWIG_AsVal_frag(Type)) Type *INPUT(Type temp)(int ecode), Type &INPUT(Type temp)(int ecode) { ecode = SWIG_AsVal_dec(Type)($input, &temp); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$type", $symname, $argnum); } $1 = &temp; } %typemap(freearg, noblock=1) Type *INPUT, Type &INPUT { } %typemap(typecheck) Type *INPUT, Type &INPUT { } %enddef // OUTPUT typemaps %define %scilab_output_typemap(Type) %typemap(argout, noblock=1, fragment=SWIG_From_frag(Type)) Type *OUTPUT, Type &OUTPUT { %set_output(SWIG_From_dec(Type)(*$1)); } %enddef // INOUT typemaps %define %scilab_inout_typemap(Type) %typemap(in) Type *INOUT = Type *INPUT; %typemap(in) Type &INOUT = Type &INPUT; %typemap(argout) Type *INOUT = Type *OUTPUT; %typemap(argout) Type &INOUT = Type &OUTPUT; %enddef %define %scilab_inout_typemaps(Type) %scilab_input_typemap(%arg(Type)) %scilab_output_typemap(%arg(Type)) %scilab_inout_typemap(%arg(Type)) %enddef %scilab_inout_typemaps(double); %scilab_inout_typemaps(signed char); %scilab_inout_typemaps(unsigned char); %scilab_inout_typemaps(short); %scilab_inout_typemaps(unsigned short); %scilab_inout_typemaps(int); %scilab_inout_typemaps(unsigned int); %scilab_inout_typemaps(long); %scilab_inout_typemaps(unsigned long); %scilab_inout_typemaps(bool); %scilab_inout_typemaps(float); //%apply_ctypes(%scilab_inout_typemaps); swig-4.0.2/Lib/scilab/scisequencestring.swg0000644000175000017500000000516113667507523020610 0ustar williamwilliam/* * * Scilab matrix of string <-> C++ std::string container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(std::string), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(std::string)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isStringType(pvApiCtx, piAddrVar)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A string is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(std::string), "header", fragment="SWIG_SciString_AsCharPtrArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(std::string)(SwigSciObject obj, char ***pSequence) { int iRows = 0; int iCols = 0; return (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, obj, &iRows, &iCols, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(std::string), "header", fragment="SWIG_SciString_AsCharPtrArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(std::string)(SwigSciObject obj, int *piSize) { char **pstMatrix; int iCols = 0; int iRows = 0; if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, obj, &iRows, &iCols, &pstMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { *piSize = iRows * iCols; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(std::string), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(std::string)(int size, char ***pSequence) { *pSequence = new char*[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(std::string), "header", fragment="SWIG_SciString_FromCharPtrArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(std::string)(int size, char **pSequence) { SwigSciObject obj = SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (char **)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(std::string), "header") { SWIGINTERN std::string SWIG_AsVal_SequenceItem_dec(std::string)(SwigSciObject obj, char **pSequence, int iItemIndex) { return std::string(pSequence[iItemIndex]); } } %fragment(SWIG_From_SequenceItem_frag(std::string), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(std::string)(char **pSequence, int iItemIndex, std::string itemValue) { char *pChar = new char((int) itemValue.size() + 1); strcpy(pChar, itemValue.c_str()); pSequence[iItemIndex] = pChar; return SWIG_OK; } } swig-4.0.2/Lib/scilab/scilist.swg0000644000175000017500000000344213667507523016524 0ustar williamwilliam/* * Scilab list related functions * */ %fragment("SWIG_ScilabList", "header") { SWIGINTERN int SWIG_GetScilabList(SwigSciObject obj, int **piListAddr) { SciErr sciErr; sciErr = getVarAddressFromPosition(pvApiCtx, obj, piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } SWIGINTERN int SWIG_GetScilabListSize(SwigSciObject obj, int *piListSize) { SciErr sciErr; int *piListAddr; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getListItemNumber(pvApiCtx, piListAddr, piListSize); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } SWIGINTERN int SWIG_GetScilabListAndSize(SwigSciObject obj, int **piListAddr, int *piListSize) { SciErr sciErr; sciErr = getVarAddressFromPosition(pvApiCtx, obj, piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getListItemNumber(pvApiCtx, *piListAddr, piListSize); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } SWIGINTERN int SWIG_CheckScilabList(SwigSciObject obj) { SciErr sciErr; int *piListAddr; int iType; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piListAddr, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if ((iType != sci_list) && (iType != sci_tlist) && (iType != sci_mlist)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A list is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } return SWIG_OK; } } swig-4.0.2/Lib/scilab/sciunsignedint.swg0000644000175000017500000001473413667507523020106 0ustar williamwilliam/* * C-type: unsigned int * Scilab type: double or uint32 */ %fragment(SWIG_AsVal_frag(unsigned int), "header", fragment="SWIG_SciDoubleOrUint32_AsUnsignedInt", fragment="") { %#define SWIG_AsVal_unsigned_SS_int(scilabValue, valuePointer) SWIG_SciDoubleOrUint32_AsUnsignedInt(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDoubleOrUint32_AsUnsignedInt", "header") { SWIGINTERN int SWIG_SciDoubleOrUint32_AsUnsignedInt(void *pvApiCtx, int iVar, unsigned int *puiValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int iPrec = 0; int *piAddrVar = NULL; unsigned int *puiData = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { if (puiValue) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger32(pvApiCtx, piAddrVar, &iRows, &iCols, &puiData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } *puiValue = *puiData; } } else if (iType == sci_matrix) { if (puiValue) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 32-bit unsigned integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < 0) || (dValue > UINT_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 32-bit unsigned integer.\n"), fname, iVar); return SWIG_OverflowError; } *puiValue = (unsigned int) dValue; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned int), "header", fragment="SWIG_SciDouble_FromUnsignedInt") { %#define SWIG_From_unsigned_SS_int(scilabValue) SWIG_SciDouble_FromUnsignedInt(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromUnsignedInt", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedInt(void *pvApiCtx, int iVarOut, unsigned int uiValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) uiValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: unsigned int[] * Scilab type: uint32 vector */ %fragment("SWIG_SciDoubleOrUint32_AsUnsignedIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrUint32_AsUnsignedIntArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, unsigned int **puiValue, char *fname) { SciErr sciErr; int iType = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *puiValue = (unsigned int*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*puiValue)[i] = (unsigned int) pdData[i]; } else if (iType == sci_ints) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger32(pvApiCtx, piAddrVar, iRows, iCols, puiValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromUnsignedIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedIntArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, unsigned int *puiValues) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i UCHAR_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 8-bit unsigned integer.\n"), fname, iVar); return SWIG_OverflowError; } *pucValue = (unsigned char) dValue; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned char), "header", fragment="SWIG_SciDouble_FromUnsignedChar") { #define SWIG_From_unsigned_SS_char(value) SWIG_SciDouble_FromUnsignedChar(pvApiCtx, SWIG_Scilab_GetOutputPosition(), value) } %fragment("SWIG_SciDouble_FromUnsignedChar", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedChar(void *pvApiCtx, int iVarOut, unsigned char ucValue) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) ucValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: unsigned char[] * Scilab type: double or uint8 matrix */ %fragment("SWIG_SciDoubleOrUint8_AsUnsignedCharArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrUint8_AsUnsignedCharArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, unsigned char **pucValue, char *fname) { SciErr sciErr; int iType = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *pucValue = (unsigned char*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*pucValue)[i] = (unsigned char) pdData[i]; } else if (iType == sci_ints) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT8) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger8(pvApiCtx, piAddrVar, iRows, iCols, pucValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromUnsignedCharArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedCharArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const unsigned char *pucValues) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i swig-4.0.2/Lib/scilab/scilonglong.swg0000644000175000017500000000446213667507523017373 0ustar williamwilliam/* * C-type: long long * Scilab 5 type: NONE * Scilab 6 type: int64 */ %fragment(SWIG_AsVal_frag(long long), "header", fragment="SWIG_SciInt64_ToLongLong") { %#define SWIG_AsVal_long_SS_long(scilabValue, valuePointer) SWIG_SciInt64_ToLongLong(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciInt64_ToLongLong", "header") { SWIGINTERN int SWIG_SciInt64_ToLongLong(void *pvApiCtx, int iVar, long long *pllValue, char *fname) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Scilab 5.X does not manage '%s' data type.\n"), "SWIG_SciInt64_ToLongLong", "int64"); return SWIG_ERROR; } } %fragment(SWIG_From_frag(long long), "header", fragment="SWIG_SciInt64_FromLongLong") { #define SWIG_From_long_SS_long(value) SWIG_SciInt64_FromLongLong(pvApiCtx, $result, value) } %fragment("SWIG_SciInt64_FromLongLong", "header") { SWIGINTERN int SWIG_SciInt64_FromLongLong(void *pvApiCtx, int iVarOut, long long llValue) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Scilab 5.X does not manage '%s' data type.\n"), "SWIG_SciInt64_ToLongLong", "int64"); return SWIG_ERROR; } } /* * C-type: unsigned long long * Scilab 5 type: NONE * Scilab 6 type: uint64 */ %fragment(SWIG_AsVal_frag(unsigned long long), "header", fragment="SWIG_SciUint64_ToUnsignedLongLong") { #define SWIG_AsVal_unsigned_SS_long_SS_long(scilabValue, valuePointer) SWIG_SciUint64_ToUnsignedLongLong(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciUint64_ToUnsignedLongLong", "header") { SWIGINTERN int SWIG_SciUint64_ToUnsignedLongLong(void *pvApiCtx, int iVar, unsigned long long *pullValue, char *fname) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Scilab 5.X does not manage '%s' data type.\n"), "SWIG_SciUint64_ToLongLong", "uint64"); return SWIG_ERROR; } } %fragment(SWIG_From_frag(unsigned long long), "header", fragment="SWIG_SciUint64_FromUnsignedLongLong") { #define SWIG_From_unsigned_SS_long_SS_long(value) SWIG_SciUint64_FromUnsignedLongLong(pvApiCtx, $result, value) } %fragment("SWIG_SciUint64_FromUnsignedLongLong", "header") { SWIGINTERN int SWIG_SciUint64_FromUnsignedLongLong(void *pvApiCtx, int iVarOut, unsigned long long llValue) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Scilab 5.X does not manage '%s' data type.\n"), "SWIG_SciUint64_ToLongLong", "uint64"); return SWIG_ERROR; } } swig-4.0.2/Lib/scilab/std_pair.i0000644000175000017500000000140013667507523016277 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * Typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.2/Lib/scilab/scimatrixbool.swg0000644000175000017500000001055013667507523017727 0ustar williamwilliam/* * C-type: bool array * Scilab type: bool matrix */ %include // in (bool *IN, int IN_ROWCOUNT, int IN_COLCOUNT) %typemap(in, noblock=1, fragment="SWIG_SciBoolean_AsBoolArrayAndSize") (bool *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { if (SWIG_SciBoolean_AsBoolArrayAndSize(pvApiCtx, $input, &$2, &$3, &$1, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int IN_ROWCOUNT, int IN_COLCOUNT, bool *IN) %typemap(in, noblock=1, fragment="SWIG_SciBoolean_AsBoolArrayAndSize") (int IN_ROWCOUNT, int IN_COLCOUNT, bool *IN) { if (SWIG_SciBoolean_AsBoolArrayAndSize(pvApiCtx, $input, &$1, &$2, &$3, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (bool *IN, int IN_SIZE) %typemap(in, noblock=1, fragment="SWIG_SciBoolean_AsBoolArrayAndSize") (bool *IN, int IN_SIZE) (int rowCount, int colCount) { if (SWIG_SciBoolean_AsBoolArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$1, fname) == SWIG_OK) { $2 = rowCount * colCount; } else { return SWIG_ERROR; } } // in (int IN_SIZE, bool *IN) %typemap(in, noblock=1) (int IN_SIZE, bool *IN) (int rowCount, int colCount) { if (SWIG_SciBoolean_AsBoolArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$2, fname) == SWIG_OK) { $1 = rowCount * colCount; } else { return SWIG_ERROR; } } // out (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) %typemap(in, noblock=1, numinputs=0) (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { } %typemap(arginit, noblock=1) (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { $1 = (bool**) malloc(sizeof(bool*)); $2 = (int*) malloc(sizeof(int)); $3 = (int*) malloc(sizeof(int)); } %typemap(freearg, noblock=1) (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { free(*$1); free($1); free($2); free($3); } %typemap(argout, noblock=1, fragment="SWIG_SciBoolean_FromBoolArrayAndSize") (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { if (SWIG_SciBoolean_FromBoolArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$3, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } // out (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) { } %typemap(arginit, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (int*) malloc(sizeof(int)); $3 = (bool**) malloc(sizeof(bool*)); } %typemap(argout, noblock=1, fragment="SWIG_SciBoolean_FromBoolArrayAndSize") (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) { if (SWIG_SciBoolean_FromBoolArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2, *$3) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) { free($1); free($2); free(*$3); free($3); } // out (bool **OUT, int *OUT_SIZE) %typemap(in, noblock=1, numinputs=0) (bool **OUT, int *OUT_SIZE) { } %typemap(arginit, noblock=1) (bool **OUT, int *OUT_SIZE) { $1 = (bool**) malloc(sizeof(bool*)); $2 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciBoolean_FromBoolArrayAndSize") (bool **OUT, int *OUT_SIZE) { if (SWIG_SciBoolean_FromBoolArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$2, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (bool **OUT, int *OUT_SIZE) { free(*$1); free($1); free($2); } // out (int *OUT_SIZE, bool **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_SIZE, bool **OUT) { } %typemap(arginit, noblock=1) (int *OUT_SIZE, bool **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (bool**) malloc(sizeof(bool*)); } %typemap(argout, noblock=1, fragment="SWIG_SciBoolean_FromBoolArrayAndSize") (int *OUT_SIZE, bool **OUT) { if (SWIG_SciBoolean_FromBoolArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$1, *$2) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_SIZE, bool **OUT) { free($1); free(*$2); free($2); } swig-4.0.2/Lib/scilab/scibool.swg0000644000175000017500000000775413667507523016516 0ustar williamwilliam/* * C-type: bool * Scilab type: boolean scalar */ %fragment(SWIG_AsVal_frag(bool), "header") { SWIGINTERN int SWIG_AsVal_dec(bool)(SwigSciObject iVar, bool *pbValue) { SciErr sciErr; int iRet = 0; int *piAddrVar = NULL; int iTempValue = 0; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (!isBooleanType(pvApiCtx, piAddrVar)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A boolean expected.\n"), SWIG_Scilab_GetFuncName(), iVar); return SWIG_ERROR; } if (!isScalar(pvApiCtx, piAddrVar)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A boolean expected.\n"), SWIG_Scilab_GetFuncName(), iVar); return SWIG_ERROR; } iRet = getScalarBoolean(pvApiCtx, piAddrVar, &iTempValue); if (iRet) { return SWIG_ERROR; } *pbValue = iTempValue; return SWIG_OK; } } %fragment(SWIG_From_frag(bool), "header") { SWIGINTERN int SWIG_From_dec(bool)(bool bValue) { if (createScalarBoolean(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition(), bValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: bool[] * Scilab type: boolean matrix */ %fragment("SWIG_SciBoolean_AsBoolArrayAndSize", "header") { SWIGINTERN int SWIG_SciBoolean_AsBoolArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, bool **pbValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; int *piValue = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isBooleanType(pvApiCtx, piAddrVar)) { int i; sciErr = getMatrixOfBoolean(pvApiCtx, piAddrVar, iRows, iCols, &piValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } *pbValue = (bool*) malloc((*iRows) * (*iCols) * sizeof(bool)); for (i = 0; i < (*iRows) * (*iCols); i++) (*pbValue)[i] = piValue[i] != 0; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A boolean matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciBoolean_FromBoolArrayAndSize", "header") { SWIGINTERN int SWIG_SciBoolean_FromBoolArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, bool *pbValue) { SciErr sciErr; int *piValue = NULL; int i; piValue = (int*) malloc(iRows * iCols * sizeof(int)); for (i = 0; i < iRows * iCols; i++) piValue[i] = pbValue[i]; sciErr = createMatrixOfBoolean(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, piValue); if(sciErr.iErr) { printError(&sciErr, 0); free(piValue); return SWIG_ERROR; } free(piValue); return SWIG_OK; } } /* * C-type: int[] * Scilab type: boolean matrix */ %fragment("SWIG_SciBoolean_AsIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciBoolean_AsIntArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, int **piValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isBooleanType(pvApiCtx, piAddrVar)) { sciErr = getMatrixOfBoolean(pvApiCtx, piAddrVar, iRows, iCols, piValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A boolean matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciBoolean_FromIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciBoolean_FromIntArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, int *piValue) { SciErr sciErr; sciErr = createMatrixOfBoolean(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, piValue); if(sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } swig-4.0.2/Lib/scilab/scisequence.swg0000644000175000017500000001622213667507523017361 0ustar williamwilliam/* * * Scilab sequence conversions * */ #define SWIG_Traits_Sequence_frag(Type) %fragment_name(AsVal_Traits_Sequence, Type) #define SWIG_AsCheck_Sequence_frag(Type...) %fragment_name(AsCheck_Sequence, Type) #define SWIG_AsCheck_Sequence_dec(Type...) %symbol_name(AsCheck_Sequence, Type) #define SWIG_AsGet_Sequence_frag(Type...) %fragment_name(AsGet_Sequence, Type) #define SWIG_AsGet_Sequence_dec(Type...) %symbol_name(AsGet_Sequence, Type) #define SWIG_AsSize_Sequence_frag(Type...) %fragment_name(AsSize_Sequence, Type) #define SWIG_AsSize_Sequence_dec(Type...) %symbol_name(AsSize_Sequence, Type) #define SWIG_FromCreate_Sequence_frag(Type...) %fragment_name(FromCreate_Sequence, Type) #define SWIG_FromCreate_Sequence_dec(Type...) %symbol_name(FromCreate_Sequence, Type) #define SWIG_FromSet_Sequence_frag(Type...) %fragment_name(FromSet_Sequence, Type) #define SWIG_FromSet_Sequence_dec(Type...) %symbol_name(FromSet_Sequence, Type) #define SWIG_Traits_SequenceItem_frag(Type) %fragment_name(AsVal_Traits_SequenceItem, Type) #define SWIG_AsVal_SequenceItem_frag(Type...) %fragment_name(AsVal_SequenceItem, Type) #define SWIG_AsVal_SequenceItem_dec(Type...) %symbol_name(AsVal_SequenceItem, Type) #define SWIG_From_SequenceItem_frag(Type...) %fragment_name(From_SequenceItem, Type) #define SWIG_From_SequenceItem_dec(Type...) %symbol_name(From_SequenceItem, Type) %include %include %include %include %include %include // // Sequence conversion // %fragment(SWIG_Traits_Sequence_frag(ptr), "header", fragment=SWIG_AsCheck_Sequence_frag(ptr), fragment=SWIG_AsGet_Sequence_frag(ptr), fragment=SWIG_AsSize_Sequence_frag(ptr), fragment=SWIG_FromCreate_Sequence_frag(ptr), fragment=SWIG_FromSet_Sequence_frag(ptr), fragment="StdTraits", fragment="") { namespace swig { // Error returned for sequence containers of default item type template struct traits_as_sequence { static int check(SwigSciObject obj) { throw std::invalid_argument("The container data type is not supported."); } static int get(SwigSciObject obj, void **sequence) { throw std::invalid_argument("The container data type is not supported."); } static int size(SwigSciObject obj, int *size) { throw std::invalid_argument("The container data type is not supported."); } }; template struct traits_from_sequence { static int create(int size, void **sequence) { throw std::invalid_argument("The container data type is not supported."); } static SwigSciObject set(int size, void *sequence) { throw std::invalid_argument("The container data type is not supported."); } }; // Support sequence containers of pointers template struct traits_as_sequence { static int check(SwigSciObject obj) { return SWIG_AsCheck_Sequence_dec(ptr)(obj); } static int get(SwigSciObject obj, void **sequence) { return SWIG_AsGet_Sequence_dec(ptr)(obj, (int **)sequence); } static int size(SwigSciObject obj, int *size) { return SWIG_AsSize_Sequence_dec(ptr)(obj, size); } }; template struct traits_from_sequence { static int create(int size, void **sequence) { return SWIG_FromCreate_Sequence_dec(ptr)(size, (uintptr_t **)sequence); } static SwigSciObject set(int size, void *sequence) { return SWIG_FromSet_Sequence_dec(ptr)(size, (uintptr_t *)sequence); } }; } } %define %traits_sequence(CppType, ScilabType) %fragment(SWIG_Traits_Sequence_frag(CppType), "header", fragment=SWIG_Traits_Sequence_frag(ptr), fragment=SWIG_AsCheck_Sequence_frag(CppType), fragment=SWIG_AsGet_Sequence_frag(CppType), fragment=SWIG_AsSize_Sequence_frag(CppType), fragment=SWIG_FromCreate_Sequence_frag(CppType), fragment=SWIG_FromSet_Sequence_frag(CppType)) { namespace swig { template <> struct traits_as_sequence { static int check(SwigSciObject obj) { return SWIG_AsCheck_Sequence_dec(CppType)(obj); } static int get(SwigSciObject obj, void **sequence) { return SWIG_AsGet_Sequence_dec(CppType)(obj, (ScilabType **)sequence); } static int size(SwigSciObject obj, int *size) { return SWIG_AsSize_Sequence_dec(CppType)(obj, size); } }; template <> struct traits_from_sequence { static int create(int size, void **sequence) { return SWIG_FromCreate_Sequence_dec(CppType)(size, (ScilabType **)sequence); } static SwigSciObject set(int size, void *sequence) { return SWIG_FromSet_Sequence_dec(CppType)(size, (ScilabType *)sequence); } }; } } %enddef // // Sequence item conversion // %fragment(SWIG_Traits_SequenceItem_frag(ptr), "header", fragment=SWIG_AsVal_SequenceItem_frag(ptr), fragment=SWIG_From_SequenceItem_frag(ptr), fragment="StdTraits", fragment="") { namespace swig { // Error returned for sequence containers of default item type template struct traits_asval_sequenceitem { static T asval(SwigSciObject obj, void *pSequence, int iItemIndex) { throw std::invalid_argument("The container data type is not supported."); } }; template struct traits_from_sequenceitem { static int from(void *pSequence, int iItemIndex, T itemValue) { throw std::invalid_argument("The container data type is not supported."); } }; // Support sequence containers of pointers template struct traits_asval_sequenceitem { static T* asval(SwigSciObject obj, void *pSequence, int iItemIndex) { return static_cast(SWIG_AsVal_SequenceItem_dec(ptr)(obj, (int *)pSequence, iItemIndex)); } }; template struct traits_from_sequenceitem { static int from(void *pSequence, int iItemIndex, T *itemValue) { return SWIG_From_SequenceItem_dec(ptr)((uintptr_t *)pSequence, iItemIndex, (uintptr_t) itemValue); } }; } } %define %traits_sequenceitem(CppType, ScilabType) %fragment(SWIG_Traits_SequenceItem_frag(CppType), "header", fragment=SWIG_Traits_SequenceItem_frag(ptr), fragment=SWIG_AsVal_SequenceItem_frag(CppType), fragment=SWIG_From_SequenceItem_frag(CppType)) { namespace swig { template <> struct traits_asval_sequenceitem { static CppType asval(SwigSciObject obj, void *pSequence, int iItemIndex) { return SWIG_AsVal_SequenceItem_dec(CppType)(obj, (ScilabType *)pSequence, iItemIndex); } }; template <> struct traits_from_sequenceitem { static int from(void *pSequence, int iItemIndex, CppType itemValue) { return SWIG_From_SequenceItem_dec(CppType)((ScilabType *)pSequence, iItemIndex, itemValue); } }; } } %enddef %define %add_traits_sequence(CppType, ScilabType) %traits_sequence(CppType, ScilabType); %fragment(SWIG_Traits_Sequence_frag(CppType)); %traits_sequenceitem(CppType, ScilabType); %fragment(SWIG_Traits_SequenceItem_frag(CppType)); %enddef %add_traits_sequence(int, int); %add_traits_sequence(double, double); %add_traits_sequence(float, float); %add_traits_sequence(std::string, char*); %add_traits_sequence(bool, int); swig-4.0.2/Lib/scilab/sciint.swg0000644000175000017500000001432613667507523016346 0ustar williamwilliam/* * C-type: int * Scilab type: double or int32 */ %fragment(SWIG_AsVal_frag(int), "header", fragment="SWIG_SciDoubleOrInt32_AsInt", fragment="") { %#define SWIG_AsVal_int(scilabValue, valuePointer) SWIG_SciDoubleOrInt32_AsInt(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDoubleOrInt32_AsInt", "header") { SWIGINTERN int SWIG_SciDoubleOrInt32_AsInt(void *pvApiCtx, SwigSciObject iVar, int *piValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { if (piValue) { int iPrec = 0; int *piData = NULL; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } sciErr = getMatrixOfInteger32(pvApiCtx, piAddrVar, &iRows, &iCols, &piData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } *piValue = *piData; } } else if (iType == sci_matrix) { if (piValue) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < INT_MIN) || (dValue > INT_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar); return SWIG_OverflowError; } *piValue = (int) dValue; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } return SWIG_OK; } } %fragment(SWIG_From_frag(int), "header", fragment="SWIG_SciDouble_FromInt") { %#define SWIG_From_int(scilabValue) SWIG_SciDouble_FromInt(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromInt", "header") { SWIGINTERN int SWIG_SciDouble_FromInt(void *pvApiCtx, int iVarOut, int iValue, char *fname){ if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) iValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: int[] * Scilab type: double or int32 matrix */ %fragment("SWIG_SciDoubleOrInt32_AsIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrInt32_AsIntArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, int **piValue, char *fname) { SciErr sciErr; int iType = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *piValue = (int*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*piValue)[i] = (int) pdData[i]; } else if (iType == sci_ints) { int iPrec = 0; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfInteger32(pvApiCtx, piAddrVar, iRows, iCols, piValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromIntArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const int *piData) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i SHRT_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 16-bit signed integer.\n"), fname, iVar); return SWIG_OverflowError; } *psValue = (short) dValue; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } return SWIG_OK; } } %fragment(SWIG_From_frag(short), "header", fragment="SWIG_SciDouble_FromShort") { #define SWIG_From_short(scilabValue) SWIG_SciDouble_FromShort(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromShort", "header") { SWIGINTERN int SWIG_SciDouble_FromShort(void *pvApiCtx, int iVarOut, short sValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) sValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: short[] * Scilab type: double or int16 matrix */ %fragment("SWIG_SciDoubleOrInt16_AsShortArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrInt16_AsShortArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, short **psValue, char *fname) { SciErr sciErr; int iType = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *psValue = (short*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*psValue)[i] = (short) pdData[i]; } else if (iType == sci_ints) { int iPrec = 0; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT16) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfInteger16(pvApiCtx, piAddrVar, iRows, iCols, psValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromShortArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromShortArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, short *psValue) { SciErr sciErr; int i; double *pdValues = NULL; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i swig-4.0.2/Lib/scilab/matrix.i0000644000175000017500000000022513667507523016002 0ustar williamwilliam/* * Matrix typemaps * */ %include %include %include %include swig-4.0.2/Lib/scilab/scichar.swg0000644000175000017500000001741213667507523016470 0ustar williamwilliam/* * C-type: char or char* * Scilab type: string */ /* * CHAR */ %fragment(SWIG_AsVal_frag(char), "header", fragment="SWIG_SciString_AsChar") { #define SWIG_AsVal_char(scilabValue, valuePointer) SWIG_SciString_AsChar(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciString_AsChar", "header") { SWIGINTERN int SWIG_SciString_AsChar(void *pvApiCtx, int iVar, char *pcValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; char *pstValue = NULL; int iRet; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isStringType(pvApiCtx, piAddrVar) == 0) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A single string expected.\n"), fname, iVar); return SWIG_TypeError; } iRet = getAllocatedSingleString(pvApiCtx, piAddrVar, &pstValue); if (iRet) { return SWIG_ERROR; } if (pcValue != NULL) { *pcValue = pstValue[0]; } freeAllocatedSingleString(pstValue); return SWIG_OK; } } %fragment(SWIG_From_frag(char), "header", fragment="SWIG_SciString_FromChar") { #define SWIG_From_char(value) SWIG_SciString_FromChar(pvApiCtx, SWIG_Scilab_GetOutputPosition(), value) } %fragment("SWIG_SciString_FromChar", "header") { SWIGINTERN int SWIG_SciString_FromChar(void *pvApiCtx, int iVarOut, char chValue) { char *pchValue = (char*)malloc(sizeof(char) * 2); pchValue[0] = chValue; pchValue[1] = '\0'; if (createSingleString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, pchValue)) return SWIG_ERROR; free(pchValue); return SWIG_OK; } } /* * CHAR * */ %fragment("SWIG_AsCharArray", "header", fragment = "SWIG_SciString_AsCharPtr") { #define SWIG_AsCharArray(scilabValue, charPtrPointer, charPtrLength) SWIG_SciString_AsCharPtr(pvApiCtx, scilabValue, charPtrPointer, charPtrLength, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciString_AsCharPtr", "header") { SWIGINTERN int SWIG_SciString_AsCharPtr(void *pvApiCtx, int iVar, char *pcValue, int iLength, char *fname) { SciErr sciErr; int *piAddrVar = NULL; char* pcTmpValue = NULL; int iRet; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } iRet = getAllocatedSingleString(pvApiCtx, piAddrVar, &pcTmpValue); if (iRet) { return SWIG_ERROR; } if (pcValue != NULL) { strncpy(pcValue, pcTmpValue, iLength); } freeAllocatedSingleString(pcTmpValue); return SWIG_OK; } } %fragment("SWIG_AsCharPtrAndSize", "header", fragment = "SWIG_SciString_AsCharPtrAndSize") { #define SWIG_AsCharPtrAndSize(scilabValue, charPtrPointer, charPtrLength, allocMemory) SWIG_SciString_AsCharPtrAndSize(pvApiCtx, scilabValue, charPtrPointer, charPtrLength, allocMemory, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciString_AsCharPtrAndSize", "header") { SWIGINTERN int SWIG_SciString_AsCharPtrAndSize(void *pvApiCtx, int iVar, char **pcValue, size_t *piLength, int *alloc, char *fname) { SciErr sciErr; int *piAddrVar = NULL; char *pstString = NULL; int iRows = 0; int iCols = 0; int iLen = 0; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isScalar(pvApiCtx, piAddrVar) == 0 || isStringType(pvApiCtx, piAddrVar) == 0) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A single string expected.\n"), fname, iVar); return SWIG_TypeError; } sciErr = getMatrixOfString(pvApiCtx, piAddrVar, &iRows, &iCols, &iLen, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } pstString = %new_array(iLen + 1, char); sciErr = getMatrixOfString(pvApiCtx, piAddrVar, &iRows, &iCols, &iLen, &pstString); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } // TODO: return SWIG_ERROR if pcValue NULL (now returning SWIG_ERROR fails some typechecks) if (pcValue) { *pcValue = pstString; } if (alloc != NULL) { *alloc = SWIG_NEWOBJ; } if (piLength != NULL) { *piLength = strlen(pstString); } return SWIG_OK; } } %fragment("SWIG_FromCharPtr", "header", fragment = "SWIG_SciString_FromCharPtr") { #define SWIG_FromCharPtr(charPtr) SWIG_SciString_FromCharPtr(pvApiCtx, SWIG_Scilab_GetOutputPosition(), charPtr) } %fragment("SWIG_SciString_FromCharPtr", "header") { SWIGINTERN int SWIG_SciString_FromCharPtr(void *pvApiCtx, int iVarOut, const char *pchValue) { if (pchValue) { SciErr sciErr; const char* pstStrings[1]; pstStrings[0] = pchValue; sciErr = createMatrixOfString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, 1, 1, pstStrings); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { int iRet = createEmptyMatrix(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut); if (iRet) { return SWIG_ERROR; } } return SWIG_OK; } } /* * CHAR * ARRAY */ %fragment("SWIG_SciString_AsCharPtrArrayAndSize", "header") { SWIGINTERN int SWIG_SciString_AsCharPtrArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, char ***charPtrArray, char *fname) { SciErr sciErr; int i = 0; int *piAddrVar = NULL; int* piLength = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getMatrixOfString(pvApiCtx, piAddrVar, iRows, iCols, NULL, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } piLength = (int*) malloc((*iRows) * (*iCols) * sizeof(int)); sciErr = getMatrixOfString(pvApiCtx, piAddrVar, iRows, iCols, piLength, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } *charPtrArray = (char**) malloc((*iRows) * (*iCols) * sizeof(char*)); for(i = 0 ; i < (*iRows) * (*iCols); i++) { (*charPtrArray)[i] = (char*) malloc(sizeof(char) * (piLength[i] + 1)); } sciErr = getMatrixOfString(pvApiCtx, piAddrVar, iRows, iCols, piLength, *charPtrArray); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } free(piLength); return SWIG_OK; } } %fragment("SWIG_SciString_FromCharPtrArrayAndSize", "header") { SWIGINTERN int SWIG_SciString_FromCharPtrArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, char **charPtrArray) { SciErr sciErr; sciErr = createMatrixOfString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, (const char* const*) charPtrArray); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_FromCharPtrAndSize", "header", fragment = "SWIG_SciString_FromCharPtr") { #define SWIG_FromCharPtrAndSize(charPtr, charPtrLength) SWIG_SciString_FromCharPtr(pvApiCtx, SWIG_Scilab_GetOutputPosition(), charPtr) } /* * Char* Scilab variable */ %fragment(SWIG_CreateScilabVariable_frag(char), "wrapper") { SWIGINTERN int SWIG_CreateScilabVariable_dec(char)(void *pvApiCtx, const char* psVariableName, const char cVariableValue) { SciErr sciErr; char sValue[2]; const char* psStrings[1]; sValue[0] = cVariableValue; sValue[1] = '\0'; psStrings[0] = sValue; sciErr = createNamedMatrixOfString(pvApiCtx, psVariableName, 1, 1, psStrings); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_CreateScilabVariable_frag(charptr), "wrapper") { SWIGINTERN int SWIG_CreateScilabVariable_dec(charptr)(void *pvApiCtx, const char* psVariableName, const char* psVariableValue) { SciErr sciErr; const char* psStrings[1]; psStrings[0] = psVariableValue; sciErr = createNamedMatrixOfString(pvApiCtx, psVariableName, 1, 1, psStrings); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } swig-4.0.2/Lib/scilab/stl.i0000644000175000017500000000044313667507523015302 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/scilab/scicontainer.swg0000644000175000017500000002507413667507523017540 0ustar williamwilliam/* ----------------------------------------------------------------------------- * scicontainer.swg * * Scilab list <-> C++ container wrapper * * This wrapper, and its iterator, allows a general use (and reuse) of * the mapping between C++ and Scilab, thanks to the C++ templates. * * Of course, it needs the C++ compiler to support templates, but * since we will use this wrapper with the STL containers, that should * be the case. * ----------------------------------------------------------------------------- */ %{ #include %} #if !defined(SWIG_NO_EXPORT_ITERATOR_METHODS) # if !defined(SWIG_EXPORT_ITERATOR_METHODS) # define SWIG_EXPORT_ITERATOR_METHODS SWIG_EXPORT_ITERATOR_METHODS # endif #endif // #define (SWIG_SCILAB_EXTRA_NATIVE_CONTAINERS) // if defined: sequences in return are converted from/to Scilab lists or matrices // if not defined: sequences are passed from/to Scilab as pointers %{ #define SWIG_STD_NOASSIGN_STL %} %include %include %{ #include %} %include %include %fragment("SciSequence_Cont", "header", fragment="StdTraits", fragment="SwigSciIterator_T", fragment=SWIG_Traits_Sequence_frag(ptr), fragment=SWIG_Traits_SequenceItem_frag(ptr)) { namespace swig { template struct SciSequence_Ref { SciSequence_Ref(const SwigSciObject& seq, int index) : _seq(seq), _index(index) { if (traits_as_sequence::get(_seq, &piSeqAddr) != SWIG_OK) { throw std::invalid_argument("Cannot get sequence data."); } } operator T () const { return traits_asval_sequenceitem::asval(_seq, piSeqAddr, _index); } SciSequence_Ref& operator=(const T& v) { // TODO return *this; } private: SwigSciObject _seq; int _index; void *piSeqAddr; }; template struct SciSequence_ArrowProxy { SciSequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; template struct SwigSciSequence_InputIterator { typedef SwigSciSequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef int difference_type; SwigSciSequence_InputIterator() { } SwigSciSequence_InputIterator(const SwigSciObject& seq, int index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } SciSequence_ArrowProxy operator->() const { return SciSequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: SwigSciObject _seq; difference_type _index; }; template struct SciSequence_Cont { typedef SciSequence_Ref reference; typedef const SciSequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef int difference_type; typedef int size_type; typedef const pointer const_pointer; typedef SwigSciSequence_InputIterator iterator; typedef SwigSciSequence_InputIterator const_iterator; SciSequence_Cont(const SwigSciObject& seq) : _seq(seq) { } ~SciSequence_Cont() { } size_type size() const { int iSeqSize; if (traits_as_sequence::size(_seq, &iSeqSize) == SWIG_OK) { return iSeqSize; } else { return SWIG_ERROR; } } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } private: SwigSciObject _seq; }; } } %define %swig_sequence_iterator(Sequence...) #if defined(SWIG_EXPORT_ITERATOR_METHODS) class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; %typemap(out,noblock=1,fragment="SciSequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { %set_output(SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &)), swig::SciSwigIterator::descriptor(),SWIG_POINTER_OWN)); } %typemap(out,fragment="SciSequence_Cont") std::pair, std::pair { // TODO: return a Scilab list from the pair (see code for Octave) } %fragment("SciSwigPairBoolOutputIterator", "header", fragment=SWIG_From_frag(bool), fragment="SciSequence_Cont") {} %typemap(out,fragment="SciSwigPairBoolOutputIterator") std::pair, std::pair { // TODO: return a Scilab list from the pair (see code for Octave) } %typemap(in,noblock=1,fragment="SciSequence_Cont") iterator(swig::SciSwigIterator *iter = 0, int res), reverse_iterator(swig::SciSwigIterator *iter = 0, int res), const_iterator(swig::SciSwigIterator *iter = 0, int res), const_reverse_iterator(swig::SciSwigIterator *iter = 0, int res) { res = SWIG_ConvertPtr((SwigSciObject)$input, %as_voidptrptr(&iter), swig::SciSwigIterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::SwigSciIterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="SciSequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { swig::SciSwigIterator *iter = 0; int res = SWIG_ConvertPtr((SwigSciObject)$input, %as_voidptrptr(&iter), swig::SciSwigIterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %fragment("SciSequence_Cont"); #endif //SWIG_EXPORT_ITERATOR_METHODS %enddef // The Scilab container methods %define %swig_container_methods(Container...) %enddef %define %swig_sequence_methods_common(Sequence...) %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) %enddef %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %enddef // // Common fragments // %fragment("StdSequenceTraits","header", fragment="StdTraits", fragment="SciSequence_Cont") { namespace swig { template inline void assign(const SciSeq& sciSeq, Seq* seq) { %#ifdef SWIG_STD_NOASSIGN_STL typedef typename SciSeq::value_type value_type; typename SciSeq::const_iterator it = sciSeq.begin(); for (;it != sciSeq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } %#else seq->assign(sciSeq.begin(), sciSeq.end()); %#endif } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(const SwigSciObject& obj, sequence **seq) { swig_type_info *typeInfo = swig::type_info(); if (typeInfo) { sequence *p; if (SWIG_ConvertPtr(obj, (void**)&p, typeInfo, 0) == SWIG_OK) { if (seq) *seq = p; return SWIG_OLDOBJ; } } if (traits_as_sequence::check(obj) == SWIG_OK) { try { SciSequence_Cont sciSeq(obj); if (seq) { *seq = new sequence(); assign(sciSeq, *seq); return SWIG_NEWOBJ; } else { return SWIG_ERROR; } } catch (std::exception& e) { SWIG_exception(SWIG_RuntimeError, e.what()); return SWIG_ERROR; } } else { return SWIG_ERROR; } } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static SwigSciObject from(const sequence& seq) { %#ifdef SWIG_SCILAB_EXTRA_NATIVE_CONTAINERS swig_type_info *typeInfo = swig::type_info(); if (typeInfo) { return SWIG_NewPointerObj(new sequence(seq), typeInfo, SWIG_POINTER_OWN); } %#endif try { void *data; size_type size = seq.size(); if (traits_from_sequence::create(size, &data) == SWIG_OK) { const_iterator it; int index = 0; for (it = seq.begin(); it != seq.end(); ++it) { traits_from_sequenceitem::from(data, index, *it); index++; } return traits_from_sequence::set(size, data); } return SWIG_OK; } catch (std::exception& e) { SWIG_exception(SWIG_RuntimeError, e.what()); return SWIG_ERROR; } } }; } } swig-4.0.2/Lib/scilab/scisequencepointer.swg0000644000175000017500000000551713667507523020767 0ustar williamwilliam/* * * Scilab list of pointer <-> C++ pointer container * */ %include %fragment("", "header") { %#include } %fragment(SWIG_AsCheck_Sequence_frag(ptr), "header", fragment="SWIG_ScilabList") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(ptr)(SwigSciObject obj) { return SWIG_CheckScilabList(obj); } } %fragment(SWIG_AsGet_Sequence_frag(ptr), "header", fragment="SWIG_ScilabList") { SWIGINTERN int SWIG_AsGet_Sequence_dec(ptr)(SwigSciObject obj, int **piSequence) { return SWIG_GetScilabList(obj, piSequence); } } %fragment(SWIG_AsSize_Sequence_frag(ptr), "header", fragment="SWIG_ScilabList") { SWIGINTERN int SWIG_AsSize_Sequence_dec(ptr)(SwigSciObject obj, int *piSize) { return SWIG_GetScilabListSize(obj, piSize); } } %fragment(SWIG_FromCreate_Sequence_frag(ptr), "header", fragment="") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(ptr)(int size, uintptr_t **pSequence) { *pSequence = new uintptr_t[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(ptr), "header", fragment="") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(ptr)(int size, uintptr_t *pSequence) { SciErr sciErr; int *piListAddr; int iVarOut = SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition(); sciErr = createList(pvApiCtx, iVarOut, size, &piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } for (int i=0; i C++ double container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(double), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(double)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isDoubleType(pvApiCtx, piAddrVar)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A double is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(double), "header", fragment="SWIG_SciDouble_AsDoubleArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(double)(SwigSciObject obj, double **pSequence) { int iMatrixRowCount; int iMatrixColCount; return (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(double), "header", fragment="SWIG_SciDouble_AsDoubleArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(double)(SwigSciObject obj, int *piSize) { double *pdblMatrix; int iMatrixRowCount; int iMatrixColCount; if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, &pdblMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { if ((iMatrixRowCount > 1) && (iMatrixColCount > 1)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A double vector is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } *piSize = iMatrixRowCount * iMatrixColCount; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(double), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(double)(int size, double **pSequence) { *pSequence = new double[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(double), "header", fragment="SWIG_SciDouble_FromDoubleArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(double)(int size, double *pSequence) { SwigSciObject obj = SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (double *)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(double), "header") { SWIGINTERN double SWIG_AsVal_SequenceItem_dec(double)(SwigSciObject obj, double *pSequence, int iItemIndex) { return pSequence[iItemIndex]; } } %fragment(SWIG_From_SequenceItem_frag(double), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(double)(double *pSequence, int iItemIndex, double itemValue) { pSequence[iItemIndex] = itemValue; return SWIG_OK; } } swig-4.0.2/Lib/scilab/exception.i0000644000175000017500000000020213667507523016467 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), SWIG_Scilab_Error(code, msg);) } swig-4.0.2/Lib/scilab/std_list.i0000644000175000017500000000141713667507523016327 0ustar williamwilliam/* * * C++ type : STL list * Scilab type : matrix (for primitive types) or list (for pointer types) * */ %fragment("StdListTraits", "header", fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(SwigSciObject obj, std::list **lis) { return traits_asptr_stdseq >::asptr(obj, lis); } }; template struct traits_from > { static SwigSciObject from(const std::list &lis) { return traits_from_stdseq >::from(lis); } }; } %} #define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.2/Lib/scilab/scimisctypes.swg0000644000175000017500000000417113667507523017571 0ustar williamwilliam// Other primitive such as size_t and ptrdiff_t /* * C-type: size_t * Scilab type: double or int32 */ %fragment(SWIG_AsVal_frag(size_t), "header", fragment="SWIG_Int_AsSize") { %#define SWIG_AsVal_size_t(scilabValue, valuePointer) SWIG_Int_AsSize(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_Int_AsSize", "header", fragment=SWIG_AsVal_frag(int)) { SWIGINTERN int SWIG_Int_AsSize(void *pvApiCtx, SwigSciObject iVar, size_t *piValue, char *fname) { int iValue = 0; if (SWIG_AsVal_dec(int)(iVar, &iValue) != SWIG_OK) return SWIG_ERROR; if (piValue) *piValue = (size_t) iValue; return SWIG_OK; } } %fragment(SWIG_From_frag(size_t), "header", fragment="SWIG_Int_FromSize") { %#define SWIG_From_size_t(scilabValue) SWIG_Int_FromSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_Int_FromSize", "header", fragment=SWIG_From_frag(int)) { SWIGINTERN int SWIG_Int_FromSize(void *pvApiCtx, int iVarOut, size_t iValue, char *fname) { return SWIG_From_dec(int)((int)iValue); } } /* * C-type: ptrdiff_t * Scilab type: double or int32 */ %fragment(SWIG_AsVal_frag(ptrdiff_t), "header", fragment="SWIG_Int_AsPtrDiff") { %#define SWIG_AsVal_ptrdiff_t(scilabValue, valuePointer) SWIG_Int_AsPtrDiff(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_Int_AsPtrDiff", "header", fragment=SWIG_AsVal_frag(int)) { SWIGINTERN int SWIG_Int_AsPtrDiff(void *pvApiCtx, SwigSciObject iVar, ptrdiff_t *piValue, char *fname) { int iValue = 0; if (SWIG_AsVal_dec(int)(iVar, &iValue) != SWIG_OK) return SWIG_ERROR; if (piValue) *piValue = (ptrdiff_t) iValue; return SWIG_OK; } } %fragment(SWIG_From_frag(ptrdiff_t), "header", fragment="SWIG_Int_FromPtrDiff") { %#define SWIG_From_ptrdiff_t(scilabValue) SWIG_Int_FromPtrDiff(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_Int_FromPtrDiff", "header", fragment=SWIG_From_frag(int)) { SWIGINTERN int SWIG_Int_FromPtrDiff(void *pvApiCtx, int iVarOut, ptrdiff_t iValue, char *fname) { return SWIG_From_dec(int)((int)iValue); } } swig-4.0.2/Lib/scilab/scimatrixchar.swg0000644000175000017500000001201313667507523017705 0ustar williamwilliam/* * C-type: char* * Scilab type: string matrix */ %include // in (char **IN, int IN_ROWCOUNT, int IN_COLCOUNT) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (char **IN, int IN_ROWCOUNT, int IN_COLCOUNT) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &$2, &$3, &$1, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int IN_ROWCOUNT, int IN_COLCOUNT, char **IN) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (int IN_ROWCOUNT, int IN_COLCOUNT, char **IN) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &$1, &$2, &$3, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (char **IN, int IN_SIZE) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (char **IN, int IN_SIZE) (int rowCount, int colCount) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$1, fname) == SWIG_OK) { $2 = rowCount * colCount; } else { return SWIG_ERROR; } } // in (int IN_SIZE, char **IN) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (int IN_SIZE, char **IN) (int rowCount, int colCount) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$2, fname) == SWIG_OK) { $1 = rowCount * colCount; } else { return SWIG_ERROR; } } // out (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) %typemap(in, noblock=1, numinputs=0) (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { } %typemap(arginit, noblock=1) (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { $1 = (char***) malloc(sizeof(char**)); $2 = (int*) malloc(sizeof(int)); $3 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$3, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { { int i; for (i = 0; i < (*$2) * (*$3); i++) free((*$1)[i]); } free(*$1); free($1); free($2); free($3); } // out (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) { } %typemap(arginit, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) { $1 = (char***) malloc(sizeof(char**)); $2 = (int*) malloc(sizeof(int)); $3 = (int**) malloc(sizeof(int*)); } %typemap(argout, noblock=1, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) { if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2, *$3) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) { free($1); free($2); { int i; for (i = 0; i < (*$1) * (*$2); i++) free((*$3)[i]); } free(*$3); free($3); } // out (char ***OUT, int *OUT_SIZE) %typemap(in, noblock=1, numinputs=0) (char ***OUT, int *OUT_SIZE) { } %typemap(arginit, noblock=1) (char ***OUT, int *OUT_SIZE) { $1 = (char***) malloc(sizeof(char**)); $2 = (int*) malloc(sizeof(int)); } %typemap(freearg, noblock=1) (char ***OUT, int *OUT_SIZE) { { int i; for (i = 0; i < *$2; i++) free((*$1)[i]); } free(*$1); free($1); free($2); } %typemap(argout, noblock=1, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (char ***OUT, int *OUT_SIZE) { if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$2, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } // in (int IN_SIZE, char **IN) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (int IN_SIZE, char **IN) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, 1, &$1, &$2, fname) != SWIG_OK) { return SWIG_ERROR; } } // out (int *OUT_SIZE, char ***OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_SIZE, char ***OUT) { } %typemap(arginit, noblock=1) (int *OUT_SIZE, char ***OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (char***) malloc(sizeof(char**)); } %typemap(argout, noblock=1, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (int *OUT_SIZE, char ***OUT) { if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$1, *$2) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_SIZE, char ***OUT) { free($1); { int i; for (i = 0; i < *$1; i++) free((*$2)[i]); } free(*$2); free($2); } swig-4.0.2/Lib/scilab/sciunsignedshort.swg0000644000175000017500000001416313667507523020447 0ustar williamwilliam/* * C-type: unsigned short * Scilab type: double or uint16 */ %fragment(SWIG_AsVal_frag(unsigned short), "header", fragment="SWIG_SciDoubleOrUint16_AsUnsignedShort", fragment="") { %#define SWIG_AsVal_unsigned_SS_short(scilabValue, valuePointer) SWIG_SciDoubleOrUint16_AsUnsignedShort(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDoubleOrUint16_AsUnsignedShort", "header") { SWIGINTERN int SWIG_SciDoubleOrUint16_AsUnsignedShort(void *pvApiCtx, int iVar, unsigned short *pusValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int iPrec = 0; int *piAddrVar = NULL; unsigned short *pusData = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { if (pusValue) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT16) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger16(pvApiCtx, piAddrVar, &iRows, &iCols, &pusData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 16-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } *pusValue = *pusData; } } else if (iType == sci_matrix) { if (pusValue) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 16-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 16-bit unsigned integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < 0) || (dValue > USHRT_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 16-bit unsigned integer.\n"), fname, iVar); return SWIG_OverflowError; } *pusValue = (unsigned short) dValue; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned short), "header", fragment="SWIG_SciDouble_FromUnsignedShort") { %#define SWIG_From_unsigned_SS_short(scilabValue) SWIG_SciDouble_FromUnsignedShort(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromUnsignedShort", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedShort(void *pvApiCtx, int iVarOut, unsigned short usValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) usValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: unsigned short[] * Scilab type: uint16 vector */ %fragment("SWIG_SciDoubleOrUint16_AsUnsignedShortArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrUint16_AsUnsignedShortArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, unsigned short **pusValue, char *fname) { SciErr sciErr; int iType = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *pusValue = (unsigned short*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*pusValue)[i] = (unsigned short) pdData[i]; } else if (iType == sci_ints) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT16) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger16(pvApiCtx, piAddrVar, iRows, iCols, pusValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromUnsignedShortArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedShortArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, unsigned short *pusValues) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i swig-4.0.2/Lib/scilab/sciruntime.swg0000644000175000017500000000170213667507523017231 0ustar williamwilliam%insert(runtime) "swigrun.swg"; %insert(runtime) "swigerrors.swg"; %insert(runtime) "scirun.swg"; %insert(init) %{ /* Module management functions */ #define SWIG_GetModule(clientdata) SWIG_Scilab_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_Scilab_SetModule(pointer) SWIGRUNTIME swig_module_info* SWIG_Scilab_GetModule(void) { return NULL; } SWIGRUNTIME void SWIG_Scilab_SetModule(swig_module_info *swig_module) { } %} %insert(init) "swiginit.swg" %insert(init) %{ SWIGRUNTIME swig_type_info * SWIG_Scilab_TypeQuery(const char *name) { if (SWIG_Module_Initialized()) { if (name) { return SWIG_TypeQuery(name); } } else { SWIG_Error(SWIG_RuntimeError, "the module is not initialized"); } return NULL; } %} %insert(init) %{ #ifdef __cplusplus extern "C" #endif int _Init(SWIG_GatewayParameters) { SWIG_InitializeModule(NULL); SWIG_CreateScilabVariables(pvApiCtx); swig_module_initialized = 1; %} swig-4.0.2/Lib/scilab/std_map.i0000644000175000017500000000463013667507523016131 0ustar williamwilliam// // SWIG typemaps for std::map // // Common implementation %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.2/Lib/scilab/scitypemaps.swg0000644000175000017500000002372213667507523017416 0ustar williamwilliam// Scilab fragments for primitive types %include %include // Scilab object type #define SWIG_Object int #define %append_output(obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR #define %set_constant(name, obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR // Name is managed by the function name #define %raise(obj, type, desc) SWIG_Scilab_Raise(obj, type, desc) #define %set_output(obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR #define %set_varoutput(obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR #define %set_argoutput(obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR // Include the unified typemap library %include /* ---------------------------------------------------------------------------*/ /* Generic typmemaps */ /* */ /* This typemap is used when Scilab does not store this type directly */ /* For example, a 'float' is stored in Scilab as a 'double' */ /* So we read a 'double' in Scilab and cast it to a 'float' */ /* ---------------------------------------------------------------------------*/ %define %scilab_in_typemap_withcast(TYPEMAPTYPE, FRAGMENTNAME, CTYPE, TEMPTYPE, TEMPINIT) %typemap(TYPEMAPTYPE, fragment="FRAGMENTNAME") CTYPE { TEMPTYPE tempValue = TEMPINIT; if(FRAGMENTNAME(pvApiCtx, $input, &tempValue, SWIG_Scilab_GetFuncName()) != SWIG_OK) { return SWIG_ERROR; } $1 = (CTYPE) tempValue; } %enddef %define %scilab_inptr_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $input, %as_voidptrptr(&$1), SWIG_Scilab_GetFuncName()) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_out_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $result, $1) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_outptr_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $result, %as_voidptr($1)) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_varout_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $result, $value) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_varoutptr_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $result, %as_voidptr($value)) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_in_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $input, &$1, SWIG_Scilab_GetFuncName()) != SWIG_OK) { return SWIG_ERROR; } } %enddef /* ---------------------------------------------------------------------------*/ /* Array typmemaps */ /* ---------------------------------------------------------------------------*/ %include /* ---------------------------------------------------------------------------*/ /* Enum typemaps */ /* ---------------------------------------------------------------------------*/ %typemap(in, noblock=1, fragment=SWIG_AsVal_frag(Enum)) enum SWIGTYPE (int val) { if (SWIG_AsVal_dec(Enum)($input, &val) != SWIG_OK) { return SWIG_ERROR; } $1 = %static_cast(val, $1_ltype); } %typemap(out, fragment=SWIG_From_frag(Enum)) enum SWIGTYPE { if (SWIG_From_dec(Enum)($1) != SWIG_OK) { return SWIG_ERROR; } } /* ---------------------------------------------------------------------------*/ /* Typecheck typemaps */ /* ---------------------------------------------------------------------------*/ %define %scilab_typecheck_generic(PRECEDENCE, TYPE_CHECK_FUNCTION, TYPE) %typecheck(PRECEDENCE) TYPE { int *piAddrVar = NULL; SciErr sciErr = getVarAddressFromPosition(pvApiCtx, $input, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } $1 = TYPE_CHECK_FUNCTION(pvApiCtx, piAddrVar); } %enddef %fragment("SWIG_Check_SciDoubleOrInt", "header") { SWIGINTERN int SWIG_Check_SciDoubleOrInt(void *pvApiCtx, SwigSciObject iVar, int iIntegerType) { int *piAddrVar = NULL; int ret = 0; SciErr sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } ret = isIntegerType(pvApiCtx, piAddrVar); if (ret == 1) { int iPrec = 0; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } ret = (iPrec == iIntegerType) ? 1 : 0; } else { ret = isDoubleType(pvApiCtx, piAddrVar); } return ret; } } /* Scilab equivalent for C integers can be sci_intXX or sci_matrix */ %define %scilab_typecheck_integer(PRECEDENCE, INTTYPE, TYPE) %typecheck(PRECEDENCE, fragment="SWIG_Check_SciDoubleOrInt") TYPE { $1 = SWIG_Check_SciDoubleOrInt(pvApiCtx, $input, INTTYPE); } %enddef %define %scilab_typecheck_pointer(PRECEDENCE, TYPE) %typecheck(PRECEDENCE) TYPE { $1 = SwigScilabCheckPtr(pvApiCtx, $input, $descriptor, SWIG_Scilab_GetFuncName()); } %enddef // Double (and Float) have priority over before Integer type. // Primitive types %scilab_typecheck_pointer(SWIG_TYPECHECK_VOIDPTR, SWIGTYPE *) %scilab_typecheck_pointer(SWIG_TYPECHECK_POINTER, SWIGTYPE *) %scilab_typecheck_generic(SWIG_TYPECHECK_BOOL, isBooleanType, bool) %scilab_typecheck_generic(16, isDoubleType, double) %scilab_typecheck_generic(17, isDoubleType, float) %scilab_typecheck_integer(SWIG_TYPECHECK_INT8, SCI_INT8, signed char) %scilab_typecheck_integer(SWIG_TYPECHECK_UINT8, SCI_UINT8, unsigned char) %scilab_typecheck_integer(SWIG_TYPECHECK_INT16, SCI_INT16, short) %scilab_typecheck_integer(SWIG_TYPECHECK_UINT16, SCI_UINT16, unsigned short) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32, SCI_INT32, int) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32, SCI_INT32, long) %scilab_typecheck_integer(SWIG_TYPECHECK_UINT32, SCI_UINT32, unsigned int) %scilab_typecheck_integer(SWIG_TYPECHECK_UINT32, SCI_UINT32, unsigned long) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32, SCI_INT32, enum SWIGTYPE) %scilab_typecheck_generic(SWIG_TYPECHECK_CHAR, isStringType, char) // Arrays %scilab_typecheck_generic(SWIG_TYPECHECK_BOOL_ARRAY, isBooleanType, bool) %scilab_typecheck_generic(1016, isDoubleType, double [ANY]) %scilab_typecheck_generic(1017, isDoubleType, float [ANY]) %scilab_typecheck_integer(SWIG_TYPECHECK_INT8_ARRAY, SCI_INT8, signed char [ANY]) %scilab_typecheck_integer(1026, SCI_UINT8, unsigned char [ANY]) %scilab_typecheck_integer(SWIG_TYPECHECK_INT16_ARRAY, SCI_INT16, short [ANY]) %scilab_typecheck_integer(1036, SCI_UINT16, unsigned short [ANY]) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32_ARRAY, SCI_INT32, int [ANY]) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32_ARRAY, SCI_INT32, long [ANY]) %scilab_typecheck_integer(1046, SCI_UINT32, unsigned int [ANY]) %scilab_typecheck_integer(1046, SCI_UINT32, unsigned long [ANY]) %scilab_typecheck_generic(SWIG_TYPECHECK_CHAR_ARRAY, isStringType, char [ANY]) %scilab_typecheck_generic(SWIG_TYPECHECK_STRING_ARRAY, isStringType, char *[ANY]) %scilab_typecheck_generic(SWIG_TYPECHECK_STRING_ARRAY, isStringType, char **) /* ---------------------------------------------------------------------------*/ /* %scilabconstcode() feature typemaps */ /* ---------------------------------------------------------------------------*/ %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(double)) double %{ if (SWIG_CreateScilabVariable_double(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(int)) int %{ if (SWIG_CreateScilabVariable_int(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(uint)) unsigned int %{ if (SWIG_CreateScilabVariable_uint(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(int)) long %{ if (SWIG_CreateScilabVariable_int(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(uint)) unsigned long %{ if (SWIG_CreateScilabVariable_uint(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(char)) char %{ if (SWIG_CreateScilabVariable_char(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(charptr)) char * %{ if (SWIG_CreateScilabVariable_charptr(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(double)) enum SWIGTYPE %{ if (SWIG_CreateScilabVariable_double(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} /* ---------------------------------------------------------------------------*/ /* Exception typmemaps */ /* ---------------------------------------------------------------------------*/ %include swig-4.0.2/Lib/scilab/boost_shared_ptr.i0000644000175000017500000005160213667507523020044 0ustar williamwilliam%include // Set SHARED_PTR_DISOWN to $disown if required, for example // #define SHARED_PTR_DISOWN $disown #if !defined(SHARED_PTR_DISOWN) #define SHARED_PTR_DISOWN 0 #endif // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) CONST TYPE (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (!swig_argp) { %dirout_nullref("$type"); } else { $result = *(%reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } // plain pointer // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE * %{ #error "directorout typemap for plain pointer not implemented" %} // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE & %{ #error "directorout typemap for plain reference not implemented" %} // plain pointer by reference // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") TYPE *CONST& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) TYPE *CONST& %{ #error "directorout typemap for plain pointer by reference not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { int newmem = 0; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (swig_argp) { $result = *(%reinterpret_cast(swig_argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, $<ype); } } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "directorout typemap for shared_ptr ref not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "directorout typemap for pointer to shared_ptr not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "directorout typemap for pointer ref to shared_ptr not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *", noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.2/Lib/inttypes.i0000644000175000017500000000451413667507523015125 0ustar williamwilliam/* ----------------------------------------------------------------------------- * inttypes.i * * SWIG library file for ISO C99 types: 7.8 Format conversion of integer types * ----------------------------------------------------------------------------- */ %{ #include %} %include %include #ifdef __cplusplus extern "C" { #endif #ifdef SWIGWORDSIZE64 /* We have to define the `uintmax_t' type using `ldiv_t'. */ typedef struct { long int quot; /* Quotient. */ long int rem; /* Remainder. */ } imaxdiv_t; #else /* We have to define the `uintmax_t' type using `lldiv_t'. */ typedef struct { long long int quot; /* Quotient. */ long long int rem; /* Remainder. */ } imaxdiv_t; #endif /* Compute absolute value of N. */ extern intmax_t imaxabs (intmax_t n); /* Return the `imaxdiv_t' representation of the value of NUMER over DENOM. */ extern imaxdiv_t imaxdiv (intmax_t numer, intmax_t denom); #ifdef SWIG_WCHAR /* Like `wcstol' but convert to `intmax_t'. */ extern intmax_t wcstoimax (const wchar_t *nptr, wchar_t **endptr, int base); /* Like `wcstoul' but convert to `uintmax_t'. */ extern uintmax_t wcstoumax (const wchar_t *nptr, wchar_t ** endptr, int base); #endif #ifdef SWIGWORDSIZE64 /* Like `strtol' but convert to `intmax_t'. */ extern intmax_t strtoimax (const char *nptr, char **endptr, int base); /* Like `strtoul' but convert to `uintmax_t'. */ extern uintmax_t strtoumax (const char *nptr, char **endptr,int base); #ifdef SWIG_WCHAR /* Like `wcstol' but convert to `intmax_t'. */ extern intmax_t wcstoimax (const wchar_t *nptr, wchar_t **endptr, int base); /* Like `wcstoul' but convert to `uintmax_t'. */ extern uintmax_t wcstoumax (const wchar_t *nptr, wchar_t **endptr, int base); #endif #else /* SWIGWORDSIZE32 */ /* Like `strtol' but convert to `intmax_t'. */ extern intmax_t strtoimax (const char *nptr, char **endptr, int base); /* Like `strtoul' but convert to `uintmax_t'. */ extern uintmax_t strtoumax (const char *nptr, char **endptr, int base); #ifdef SWIG_WCHAR /* Like `wcstol' but convert to `intmax_t'. */ extern uintmax_t wcstoumax (const wchar_t *nptr, wchar_t **endptr, int base); #endif #endif /* SWIGWORDSIZE64 */ #ifdef __cplusplus } #endif swig-4.0.2/Lib/exception.i0000644000175000017500000002051113667507523015237 0ustar williamwilliam/* ----------------------------------------------------------------------------- * exception.i * * SWIG library file providing language independent exception handling * ----------------------------------------------------------------------------- */ #if defined(SWIGUTL) #error "This version of exception.i should not be used" #endif %insert("runtime") "swigerrors.swg" #ifdef SWIGPHP7 %{ #include "zend_exceptions.h" #define SWIG_exception(code, msg) do { zend_throw_exception(NULL, (char*)msg, code); goto thrown; } while (0) %} #endif #ifdef SWIGGUILE %{ SWIGINTERN void SWIG_exception_ (int code, const char *msg, const char *subr) { #define ERROR(scmerr) \ scm_error(scm_from_locale_string((char *) (scmerr)), \ (char *) subr, (char *) msg, \ SCM_EOL, SCM_BOOL_F) #define MAP(swigerr, scmerr) \ case swigerr: \ ERROR(scmerr); \ break switch (code) { MAP(SWIG_MemoryError, "swig-memory-error"); MAP(SWIG_IOError, "swig-io-error"); MAP(SWIG_RuntimeError, "swig-runtime-error"); MAP(SWIG_IndexError, "swig-index-error"); MAP(SWIG_TypeError, "swig-type-error"); MAP(SWIG_DivisionByZero, "swig-division-by-zero"); MAP(SWIG_OverflowError, "swig-overflow-error"); MAP(SWIG_SyntaxError, "swig-syntax-error"); MAP(SWIG_ValueError, "swig-value-error"); MAP(SWIG_SystemError, "swig-system-error"); default: ERROR("swig-error"); } #undef ERROR #undef MAP } #define SWIG_exception(a,b) SWIG_exception_(a, b, FUNC_NAME) %} #endif #ifdef SWIGMZSCHEME %{ SWIGINTERN void SWIG_exception_ (int code, const char *msg) { #define ERROR(errname) \ scheme_signal_error(errname " (%s)", msg); #define MAP(swigerr, errname) \ case swigerr: \ ERROR(errname); \ break switch (code) { MAP(SWIG_MemoryError, "swig-memory-error"); MAP(SWIG_IOError, "swig-io-error"); MAP(SWIG_RuntimeError, "swig-runtime-error"); MAP(SWIG_IndexError, "swig-index-error"); MAP(SWIG_TypeError, "swig-type-error"); MAP(SWIG_DivisionByZero, "swig-division-by-zero"); MAP(SWIG_OverflowError, "swig-overflow-error"); MAP(SWIG_SyntaxError, "swig-syntax-error"); MAP(SWIG_ValueError, "swig-value-error"); MAP(SWIG_SystemError, "swig-system-error"); default: ERROR("swig-error"); } #undef ERROR #undef MAP } #define SWIG_exception(a,b) SWIG_exception_(a, b) %} #endif #ifdef SWIGJAVA %{ SWIGINTERN void SWIG_JavaException(JNIEnv *jenv, int code, const char *msg) { SWIG_JavaExceptionCodes exception_code = SWIG_JavaUnknownError; switch(code) { case SWIG_MemoryError: exception_code = SWIG_JavaOutOfMemoryError; break; case SWIG_IOError: exception_code = SWIG_JavaIOException; break; case SWIG_SystemError: case SWIG_RuntimeError: exception_code = SWIG_JavaRuntimeException; break; case SWIG_OverflowError: case SWIG_IndexError: exception_code = SWIG_JavaIndexOutOfBoundsException; break; case SWIG_DivisionByZero: exception_code = SWIG_JavaArithmeticException; break; case SWIG_SyntaxError: case SWIG_ValueError: case SWIG_TypeError: exception_code = SWIG_JavaIllegalArgumentException; break; case SWIG_UnknownError: default: exception_code = SWIG_JavaUnknownError; break; } SWIG_JavaThrowException(jenv, exception_code, msg); } %} #define SWIG_exception(code, msg)\ { SWIG_JavaException(jenv, code, msg); return $null; } #endif // SWIGJAVA #ifdef SWIGOCAML %{ SWIGINTERN void SWIG_OCamlException(int code, const char *msg) { CAMLparam0(); SWIG_OCamlExceptionCodes exception_code = SWIG_OCamlUnknownError; switch (code) { case SWIG_DivisionByZero: exception_code = SWIG_OCamlArithmeticException; break; case SWIG_IndexError: exception_code = SWIG_OCamlIndexOutOfBoundsException; break; case SWIG_IOError: case SWIG_SystemError: exception_code = SWIG_OCamlSystemException; break; case SWIG_MemoryError: exception_code = SWIG_OCamlOutOfMemoryError; break; case SWIG_OverflowError: exception_code = SWIG_OCamlOverflowException; break; case SWIG_RuntimeError: exception_code = SWIG_OCamlRuntimeException; break; case SWIG_SyntaxError: case SWIG_TypeError: case SWIG_ValueError: exception_code = SWIG_OCamlIllegalArgumentException; break; case SWIG_UnknownError: default: exception_code = SWIG_OCamlUnknownError; break; } SWIG_OCamlThrowException(exception_code, msg); CAMLreturn0; } #define SWIG_exception(code, msg) SWIG_OCamlException(code, msg) %} #endif #ifdef SWIGCSHARP %{ SWIGINTERN void SWIG_CSharpException(int code, const char *msg) { if (code == SWIG_ValueError) { SWIG_CSharpExceptionArgumentCodes exception_code = SWIG_CSharpArgumentOutOfRangeException; SWIG_CSharpSetPendingExceptionArgument(exception_code, msg, 0); } else { SWIG_CSharpExceptionCodes exception_code = SWIG_CSharpApplicationException; switch(code) { case SWIG_MemoryError: exception_code = SWIG_CSharpOutOfMemoryException; break; case SWIG_IndexError: exception_code = SWIG_CSharpIndexOutOfRangeException; break; case SWIG_DivisionByZero: exception_code = SWIG_CSharpDivideByZeroException; break; case SWIG_IOError: exception_code = SWIG_CSharpIOException; break; case SWIG_OverflowError: exception_code = SWIG_CSharpOverflowException; break; case SWIG_RuntimeError: case SWIG_TypeError: case SWIG_SyntaxError: case SWIG_SystemError: case SWIG_UnknownError: default: exception_code = SWIG_CSharpApplicationException; break; } SWIG_CSharpSetPendingException(exception_code, msg); } } %} #define SWIG_exception(code, msg)\ { SWIG_CSharpException(code, msg); return $null; } #endif // SWIGCSHARP #ifdef SWIGLUA %{ #define SWIG_exception(a,b)\ { lua_pushfstring(L,"%s:%s",#a,b);SWIG_fail; } %} #endif // SWIGLUA #ifdef SWIGD %{ SWIGINTERN void SWIG_DThrowException(int code, const char *msg) { SWIG_DExceptionCodes exception_code; switch(code) { case SWIG_IndexError: exception_code = SWIG_DNoSuchElementException; break; case SWIG_IOError: exception_code = SWIG_DIOException; break; case SWIG_ValueError: exception_code = SWIG_DIllegalArgumentException; break; case SWIG_DivisionByZero: case SWIG_MemoryError: case SWIG_OverflowError: case SWIG_RuntimeError: case SWIG_TypeError: case SWIG_SyntaxError: case SWIG_SystemError: case SWIG_UnknownError: default: exception_code = SWIG_DException; break; } SWIG_DSetPendingException(exception_code, msg); } %} #define SWIG_exception(code, msg)\ { SWIG_DThrowException(code, msg); return $null; } #endif // SWIGD #ifdef __cplusplus /* You can use the SWIG_CATCH_STDEXCEPT macro with the %exception directive as follows: %exception { try { $action } catch (my_except& e) { ... } SWIG_CATCH_STDEXCEPT // catch std::exception catch (...) { SWIG_exception(SWIG_UnknownError, "Unknown exception"); } } */ %{ #include #include %} %define SWIG_CATCH_STDEXCEPT /* catching std::exception */ catch (std::invalid_argument& e) { SWIG_exception(SWIG_ValueError, e.what() ); } catch (std::domain_error& e) { SWIG_exception(SWIG_ValueError, e.what() ); } catch (std::overflow_error& e) { SWIG_exception(SWIG_OverflowError, e.what() ); } catch (std::out_of_range& e) { SWIG_exception(SWIG_IndexError, e.what() ); } catch (std::length_error& e) { SWIG_exception(SWIG_IndexError, e.what() ); } catch (std::runtime_error& e) { SWIG_exception(SWIG_RuntimeError, e.what() ); } catch (std::bad_cast& e) { SWIG_exception(SWIG_TypeError, e.what() ); } catch (std::exception& e) { SWIG_exception(SWIG_SystemError, e.what() ); } %enddef %define SWIG_CATCH_UNKNOWN catch (std::exception& e) { SWIG_exception(SWIG_SystemError, e.what() ); } catch (...) { SWIG_exception(SWIG_UnknownError, "unknown exception"); } %enddef /* rethrow the unknown exception */ #if defined(SWIGCSHARP) || defined(SWIGD) %typemap(throws,noblock=1, canthrow=1) (...) { SWIG_exception(SWIG_RuntimeError,"unknown exception"); } #else %typemap(throws,noblock=1) (...) { SWIG_exception(SWIG_RuntimeError,"unknown exception"); } #endif #endif /* __cplusplus */ /* exception.i ends here */ swig-4.0.2/Lib/ocaml/0000755000175000017500000000000013667507523014163 5ustar williamwilliamswig-4.0.2/Lib/ocaml/std_complex.i0000644000175000017500000000301413667507523016654 0ustar williamwilliam// -*- C++ -*- #ifndef SWIG_STD_COMPLEX_I_ #define SWIG_STD_COMPLEX_I_ #ifdef SWIG %{ #include %} namespace std { template class complex; %define specialize_std_complex(T) %typemap(in) complex { if (PyComplex_Check($input)) { $1 = std::complex(PyComplex_RealAsDouble($input), PyComplex_ImagAsDouble($input)); } else if (PyFloat_Check($input)) { $1 = std::complex(PyFloat_AsDouble($input), 0); } else if (PyInt_Check($input)) { $1 = std::complex(PyInt_AsLong($input), 0); } else { PyErr_SetString(PyExc_TypeError,"Expected a complex"); SWIG_fail; } } %typemap(in) const complex& (std::complex temp) { if (PyComplex_Check($input)) { temp = std::complex(PyComplex_RealAsDouble($input), PyComplex_ImagAsDouble($input)); $1 = &temp; } else if (PyFloat_Check($input)) { temp = std::complex(PyFloat_AsDouble($input), 0); $1 = &temp; } else if (PyInt_Check($input)) { temp = std::complex(PyInt_AsLong($input), 0); $1 = &temp; } else { PyErr_SetString(PyExc_TypeError,"Expected a complex"); SWIG_fail; } } %typemap(out) complex { $result = PyComplex_FromDoubles($1.real(), $1.imag()); } %typemap(out) const complex & { $result = PyComplex_FromDoubles($1->real(), $1->imag()); } %enddef specialize_std_complex(double); specialize_std_complex(float); } #endif // SWIG #endif //SWIG_STD_COMPLEX_I_ swig-4.0.2/Lib/ocaml/std_deque.i0000644000175000017500000000132213667507523016310 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_deque.i * * Default std_deque wrapper * ----------------------------------------------------------------------------- */ %module std_deque %rename(__getitem__) std::deque::getitem; %rename(__setitem__) std::deque::setitem; %rename(__delitem__) std::deque::delitem; %rename(__getslice__) std::deque::getslice; %rename(__setslice__) std::deque::setslice; %rename(__delslice__) std::deque::delslice; %extend std::deque { int __len__() { return (int) self->size(); } int __nonzero__() { return ! self->empty(); } void append(const T &x) { self->push_back(x); } }; %include swig-4.0.2/Lib/ocaml/ocamlrundec.swg0000644000175000017500000001445313667507523017210 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ocamlrundec.swg * * Ocaml runtime code -- declarations * ----------------------------------------------------------------------------- */ #include #include #include #ifdef __cplusplus #define SWIGEXT extern "C" SWIGEXT { #else #define SWIGEXT #endif #define value caml_value_t #define CAML_VALUE caml_value_t #define CAML_NAME_SPACE #include #include #include #include #include #include #include #if defined(CAMLassert) /* Both this macro and version.h were introduced in version 4.02.0 */ #include #else #define OCAML_VERSION 0 /* Unknown, but < 40200 */ #endif #define caml_array_set swig_caml_array_set /* Adapted from memory.h and mlvalues.h */ #define SWIG_CAMLlocal1(x) \ caml_value_t x = 0; \ CAMLxparam1 (x) #define SWIG_CAMLlocal2(x, y) \ caml_value_t x = 0, y = 0; \ CAMLxparam2 (x, y) #define SWIG_CAMLlocal3(x, y, z) \ caml_value_t x = 0, y = 0, z = 0; \ CAMLxparam3 (x, y, z) #define SWIG_CAMLlocal4(x, y, z, t) \ caml_value_t x = 0, y = 0, z = 0, t = 0; \ CAMLxparam4 (x, y, z, t) #define SWIG_CAMLlocal5(x, y, z, t, u) \ caml_value_t x = 0, y = 0, z = 0, t = 0, u = 0; \ CAMLxparam5 (x, y, z, t, u) #define SWIG_CAMLlocalN(x, size) \ caml_value_t x [(size)] = { 0, /* 0, 0, ... */ }; \ CAMLxparamN (x, (size)) #define SWIG_Field(x, i) (((caml_value_t *)(x)) [i]) /* Also an l-value. */ #define SWIG_Store_field(block, offset, val) do{ \ mlsize_t caml__temp_offset = (offset); \ caml_value_t caml__temp_val = (val); \ caml_modify (&SWIG_Field ((block), caml__temp_offset), caml__temp_val); \ }while(0) #define SWIG_Data_custom_val(v) ((void *) &SWIG_Field((v), 1)) #ifdef ARCH_BIG_ENDIAN #define SWIG_Tag_val(val) (((unsigned char *) (val)) [-1]) /* Also an l-value. */ #define SWIG_Tag_hp(hp) (((unsigned char *) (hp)) [sizeof(caml_value_t)-1]) /* Also an l-value. */ #else #define SWIG_Tag_val(val) (((unsigned char *) (val)) [-sizeof(caml_value_t)]) /* Also an l-value. */ #define SWIG_Tag_hp(hp) (((unsigned char *) (hp)) [0]) /* Also an l-value. */ #endif #ifdef CAMLreturn0 #undef CAMLreturn0 #endif #define CAMLreturn0 do{ \ caml_local_roots = caml__frame; \ return; \ }while (0) #ifdef CAMLreturn #undef CAMLreturn #endif #define CAMLreturn(result) do{ \ caml_value_t caml__temp_result = (result); \ caml_local_roots = caml__frame; \ return (caml__temp_result); \ }while(0) #define CAMLreturn_type(result) do{ \ caml_local_roots = caml__frame; \ return result; \ }while(0) #ifdef CAMLnoreturn #undef CAMLnoreturn #endif #define CAMLnoreturn ((void) caml__frame) #ifndef ARCH_ALIGN_INT64 #if OCAML_VERSION >= 40300 #define SWIG_Int64_val(v) (*((int64_t *) SWIG_Data_custom_val(v))) #else #define SWIG_Int64_val(v) (*((int64 *) SWIG_Data_custom_val(v))) #endif #else #if OCAML_VERSION >= 40300 CAMLextern int64_t Int64_val(caml_value_t v); #else CAMLextern int64 Int64_val(caml_value_t v); #endif #define SWIG_Int64_val(v) Int64_val(v) #endif #define SWIG_NewPointerObj(p,type,flags) caml_val_ptr(p,type) #define SWIG_GetModule(clientdata) SWIG_Ocaml_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Ocaml_SetModule(pointer) typedef enum { SWIG_OCamlArithmeticException, SWIG_OCamlDirectorPureVirtual, SWIG_OCamlOutOfMemoryError, SWIG_OCamlOverflowException, SWIG_OCamlIllegalArgumentException, SWIG_OCamlIndexOutOfBoundsException, SWIG_OCamlRuntimeException, SWIG_OCamlSystemException, SWIG_OCamlUnknownError } SWIG_OCamlExceptionCodes; SWIGINTERN void SWIG_OCamlThrowException(SWIG_OCamlExceptionCodes code, const char *msg) { CAMLparam0(); SWIG_CAMLlocal1(str); switch (code) { case SWIG_OCamlIllegalArgumentException: caml_invalid_argument(msg); break; case SWIG_OCamlSystemException: str = caml_copy_string(msg); caml_raise_sys_error(str); break; case SWIG_OCamlArithmeticException: case SWIG_OCamlIndexOutOfBoundsException: case SWIG_OCamlOutOfMemoryError: case SWIG_OCamlOverflowException: case SWIG_OCamlRuntimeException: case SWIG_OCamlUnknownError: default: caml_failwith(msg); break; } CAMLreturn0; } #define SWIG_contract_assert(expr, msg) if(!(expr)) {SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, msg);} SWIGINTERN int SWIG_GetPtr(void *source, void **result, swig_type_info *type, swig_type_info *result_type); SWIGINTERN CAML_VALUE caml_list_nth( CAML_VALUE lst, int n ); SWIGINTERN CAML_VALUE caml_list_append( CAML_VALUE lst, CAML_VALUE elt ); SWIGINTERN int caml_list_length( CAML_VALUE lst ); SWIGINTERN CAML_VALUE caml_array_new( int n ); SWIGINTERN void caml_array_set( CAML_VALUE arr, int n, CAML_VALUE item ); SWIGINTERN CAML_VALUE caml_array_nth( CAML_VALUE arr, int n ); SWIGINTERN int caml_array_len( CAML_VALUE arr ); SWIGINTERN CAML_VALUE caml_val_char( char c ); SWIGINTERN CAML_VALUE caml_val_uchar( unsigned char c ); SWIGINTERN CAML_VALUE caml_val_short( short s ); SWIGINTERN CAML_VALUE caml_val_ushort( unsigned short s ); SWIGINTERN CAML_VALUE caml_val_int( int x ); SWIGINTERN CAML_VALUE caml_val_uint( unsigned int x ); SWIGINTERN CAML_VALUE caml_val_long( long x ); SWIGINTERN CAML_VALUE caml_val_ulong( unsigned long x ); SWIGINTERN CAML_VALUE caml_val_float( float f ); SWIGINTERN CAML_VALUE caml_val_double( double d ); SWIGINTERN CAML_VALUE caml_val_ptr( void *p, swig_type_info *descriptor ); SWIGINTERN CAML_VALUE caml_val_string( const char *str ); SWIGINTERN CAML_VALUE caml_val_string_len( const char *str, int len ); SWIGINTERN long caml_long_val( CAML_VALUE v ); SWIGINTERN double caml_double_val( CAML_VALUE v ); SWIGINTERN int caml_ptr_val_internal( CAML_VALUE v, void **out, swig_type_info *descriptor ); SWIGINTERN void *caml_ptr_val( CAML_VALUE v, swig_type_info *descriptor ); SWIGINTERN char *caml_string_val( CAML_VALUE v ); SWIGINTERN int caml_string_len( CAML_VALUE v ); #ifdef __cplusplus } #endif swig-4.0.2/Lib/ocaml/director.swg0000644000175000017500000000572313667507523016527 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Ocaml proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #include #include # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) namespace Swig { /* base class for director exceptions */ class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(const char *msg="") : swig_msg(msg) { } virtual ~DirectorException() throw() { } const char *what() const throw() { return swig_msg.c_str(); } }; /* type mismatch in the return value from a Ocaml method call */ class DirectorTypeMismatchException : public DirectorException { public: DirectorTypeMismatchException(const char *msg="") : DirectorException(msg) { } }; /* any Ocaml exception that occurs during a director method call */ class DirectorMethodException : public DirectorException {}; /* attempt to call a pure virtual method via a director method */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg="") : DirectorException(msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; /* simple thread abstraction for pthreads on win32 */ #ifdef __THREAD__ #define __PTHREAD__ #if defined(_WIN32) || defined(__WIN32__) #define pthread_mutex_lock EnterCriticalSection #define pthread_mutex_unlock LeaveCriticalSection #define pthread_mutex_t CRITICAL_SECTION #define MUTEX_INIT(var) CRITICAL_SECTION var #else #include #define MUTEX_INIT(var) pthread_mutex_t var = PTHREAD_MUTEX_INITIALIZER #endif #endif /* director base class */ class Director { private: /* pointer to the wrapped ocaml object */ CAML_VALUE swig_self; /* flag indicating whether the object is owned by ocaml or c++ */ mutable bool swig_disown_flag; public: /* wrap a ocaml object. */ Director(CAML_VALUE self) : swig_self(self), swig_disown_flag(false) { caml_register_global_root(&swig_self); } /* discard our reference at destruction */ virtual ~Director() { caml_remove_global_root(&swig_self); swig_disown(); // Disown is safe here because we're just divorcing a reference that points to us. } /* return a pointer to the wrapped ocaml object */ CAML_VALUE swig_get_self() const { return swig_self; } /* acquire ownership of the wrapped ocaml object (the sense of "disown" is from ocaml) */ void swig_disown() const { if (!swig_disown_flag) { swig_disown_flag=true; caml_callback(*caml_named_value("caml_obj_disown"),swig_self); } } }; } swig-4.0.2/Lib/ocaml/std_vector.i0000644000175000017500000000575313667507523016523 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector types * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // Python as much as possible, namely, to allow the user to pass and // be returned Python tuples or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&), f(const std::vector*): // the parameter being read-only, either a Python sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(): // the vector is returned by copy; therefore, a Python sequence of T:s // is returned which is most easily used in other Python functions // -- std::vector& f(), std::vector* f(), const std::vector& f(), // const std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); unsigned int size() const; bool empty() const; void clear(); void push_back(const T& x); T operator [] ( int f ); vector &operator = ( vector &other ); %extend { void set( int i, const T &x ) { self->resize(i+1); (*self)[i] = x; } }; %extend { T *to_array() { T *array = new T[self->size() + 1]; for( int i = 0; i < self->size(); i++ ) array[i] = (*self)[i]; return array; } }; }; }; %insert(ml) %{ let array_to_vector v argcons array = for i = 0 to (Array.length array) - 1 do ignore ((invoke v) "set" (C_list [ C_int i ; (argcons array.(i)) ])) done ; v let vector_to_array v argcons array = for i = 0; to (get_int ((invoke v) "size" C_void)) - 1 do array.(i) <- argcons ((invoke v) "[]" (C_int i)) done ; v %} %insert(mli) %{ val array_to_vector : c_obj -> ('a -> c_obj) -> 'a array -> c_obj val vector_to_array : c_obj -> (c_obj -> 'a) -> 'a array -> c_obj %} swig-4.0.2/Lib/ocaml/ocaml.swg0000644000175000017500000002055713667507523016011 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ocaml.swg * * The Ocaml module handles all types uniformly via typemaps. Here * are the definitions. * ----------------------------------------------------------------------------- */ /* Pointers */ %typemap(in) void "" %typemap(out) void "$result = Val_int(0);" %typemap(in) void * { $1 = caml_ptr_val($input,$descriptor); } %typemap(varin) void * { $1 = ($ltype)caml_ptr_val($input,$descriptor); } %typemap(out) void * { $result = caml_val_ptr($1,$descriptor); } %typemap(varout) void * { $result = caml_val_ptr($1,$descriptor); } %typemap(in) char *& (char *temp) { temp = (char*)caml_val_ptr($1,$descriptor); $1 = &temp; } %typemap(argout) char *& { swig_result = caml_list_append(swig_result,caml_val_string_len(*$1, strlen(*$1))); } %typemap(in) SWIGTYPE & { $1 = ($ltype) caml_ptr_val($input,$1_descriptor); } %typemap(in) SWIGTYPE && { $1 = ($ltype) caml_ptr_val($input,$1_descriptor); } %typemap(varin) SWIGTYPE & { $1 = *(($ltype) caml_ptr_val($input,$1_descriptor)); } %typemap(varin) SWIGTYPE && { $1 = *(($ltype) caml_ptr_val($input,$1_descriptor)); } %typemap(varout) SWIGTYPE &, SWIGTYPE && { $result = SWIG_Ocaml_ptr_to_val("create_$ntype_from_ptr", (void *)&$1, $1_descriptor); } %typemap(out) SWIGTYPE &, SWIGTYPE && { $result = SWIG_Ocaml_ptr_to_val("create_$ntype_from_ptr", (void *)$1, $1_descriptor); } #if 0 %typemap(argout) SWIGTYPE & { const CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); if( fromval ) { swig_result = caml_list_append(swig_result, caml_callback(*fromval,caml_val_ptr((void *) $1, $1_descriptor))); } else { swig_result = caml_list_append(swig_result, caml_val_ptr ((void *) $1,$1_descriptor)); } } %typemap(argout) SWIGTYPE && { const CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); if( fromval ) { swig_result = caml_list_append(swig_result, caml_callback(*fromval,caml_val_ptr((void *) $1, $1_descriptor))); } else { swig_result = caml_list_append(swig_result, caml_val_ptr ((void *) $1,$1_descriptor)); } } #endif %typemap(in) SWIGTYPE { $1 = *(($&1_ltype) caml_ptr_val($input,$&1_descriptor)) ; } #ifdef __cplusplus %typemap(out) SWIGTYPE { $&1_ltype temp = new $ltype((const $1_ltype &) $1); $result = SWIG_Ocaml_ptr_to_val("create_$ntype_from_ptr", (void *)temp, $&1_descriptor); } #else %typemap(out) SWIGTYPE { void *temp = calloc(1,sizeof($ltype)); memmove(temp, &$1, sizeof($1_type)); $result = SWIG_Ocaml_ptr_to_val("create_$ntype_from_ptr", temp, $&1_descriptor); } #endif %typemap(directorin) SWIGTYPE { $<ype temp = new $ltype((const $ltype &)$1); swig_result = SWIG_Ocaml_ptr_to_val("create_$ltype_from_ptr", (void *)temp, $&1_descriptor); args = caml_list_append(args, swig_result); } %typemap(directorin) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && { swig_result = SWIG_Ocaml_ptr_to_val("create_$ltype_from_ptr", (void *)&$1, $&1_descriptor); args = caml_list_append(args, swig_result); } /* The SIMPLE_MAP macro below defines the whole set of typemaps needed for simple types. */ %define SIMPLE_MAP(C_NAME, C_TO_OCAML, OCAML_TO_C) /* In */ %typemap(in) C_NAME { $1 = OCAML_TO_C($input); } %typemap(varin) C_NAME { $1 = OCAML_TO_C($input); } %typemap(in) const C_NAME & ($*1_ltype temp) { temp = ($*1_ltype) OCAML_TO_C($input); $1 = &temp; } %typemap(varin) const C_NAME & { $1 = OCAML_TO_C($input); } %typemap(directorout) C_NAME { $1 = OCAML_TO_C($input); } /* Out */ %typemap(out) C_NAME { $result = C_TO_OCAML($1); } %typemap(varout) C_NAME { $result = C_TO_OCAML($1); } %typemap(varout) const C_NAME & { $result = C_TO_OCAML($1); } %typemap(out) const C_NAME & { $result = C_TO_OCAML(*$1); } %typemap(directorin) C_NAME { args = caml_list_append(args, C_TO_OCAML($1)); } %enddef SIMPLE_MAP(bool, caml_val_bool, caml_long_val); SIMPLE_MAP(char, caml_val_char, caml_long_val); SIMPLE_MAP(signed char, caml_val_char, caml_long_val); SIMPLE_MAP(unsigned char, caml_val_uchar, caml_long_val); SIMPLE_MAP(int, caml_val_int, caml_long_val); SIMPLE_MAP(short, caml_val_short, caml_long_val); SIMPLE_MAP(wchar_t, caml_val_short, caml_long_val); SIMPLE_MAP(long, caml_val_long, caml_long_val); SIMPLE_MAP(ptrdiff_t, caml_val_int, caml_long_val); SIMPLE_MAP(unsigned int, caml_val_uint, caml_long_val); SIMPLE_MAP(unsigned short, caml_val_ushort, caml_long_val); SIMPLE_MAP(unsigned long, caml_val_ulong, caml_long_val); SIMPLE_MAP(size_t, caml_val_int, caml_long_val); SIMPLE_MAP(float, caml_val_float, caml_double_val); SIMPLE_MAP(double, caml_val_double, caml_double_val); SIMPLE_MAP(long long,caml_val_ulong,caml_long_val); SIMPLE_MAP(unsigned long long,caml_val_ulong,caml_long_val); /* Void */ %typemap(out) void "$result = Val_unit;"; /* Pass through value */ %typemap (in) CAML_VALUE "$1=$input;"; %typemap (out) CAML_VALUE "$result=$1;"; #if 0 %include #endif /* Handle char arrays as strings */ %define %char_ptr_in(how) %typemap(how) char *, signed char *, unsigned char * { $1 = ($ltype)caml_string_val($input); } /* Again work around the empty array bound bug */ %typemap(how) char [ANY], signed char [ANY], unsigned char [ANY] { char *temp = caml_string_val($input); strcpy((char *)$1,temp); } %enddef %char_ptr_in(in); %char_ptr_in(varin); %char_ptr_in(directorout); %define %char_ptr_out(how) %typemap(how) char *, signed char *, unsigned char *, const char *, const signed char *, const unsigned char * { $result = caml_val_string((char *)$1); } /* I'd like to use the length here but can't because it might be empty */ %typemap(how) char [ANY], signed char [ANY], unsigned char [ANY], const char [ANY], const signed char [ANY], const unsigned char [ANY] { $result = caml_val_string((char *)$1); } %enddef %char_ptr_out(out); %char_ptr_out(varout); %char_ptr_out(directorin); %define %swigtype_ptr_in(how) %typemap(how) SWIGTYPE * { $1 = ($ltype)caml_ptr_val($input,$1_descriptor); } %typemap(how) SWIGTYPE (CLASS::*) { void *v = caml_ptr_val($input,$1_descriptor); memcpy(& $1, &v, sizeof(v)); } %enddef %typemap(out) SWIGTYPE * { $result = SWIG_Ocaml_ptr_to_val("create_$ntype_from_ptr", (void *)$1, $1_descriptor); } %define %swigtype_ptr_out(how) %typemap(how) SWIGTYPE (CLASS::*) { void *v; memcpy(&v,& $1, sizeof(void *)); $result = caml_val_ptr (v,$1_descriptor); } %enddef %swigtype_ptr_in(in); %swigtype_ptr_in(varin); %swigtype_ptr_in(directorout); %swigtype_ptr_out(out); %swigtype_ptr_out(varout); %swigtype_ptr_out(directorin); %define %swigtype_array_fail(how,msg) %typemap(how) SWIGTYPE [] { caml_failwith(msg); } %enddef %swigtype_array_fail(in,"Array arguments for arbitrary types need a typemap"); %swigtype_array_fail(varin,"Assignment to global arrays for arbitrary types need a typemap"); %swigtype_array_fail(out,"Array arguments for arbitrary types need a typemap"); %swigtype_array_fail(varout,"Array variables need a typemap"); %swigtype_array_fail(directorin,"Array results with arbitrary types need a typemap"); %swigtype_array_fail(directorout,"Array arguments with arbitrary types need a typemap"); /* C++ References */ /* Enums */ %define %swig_enum_in(how) %typemap(how) enum SWIGTYPE { $1 = ($type)caml_long_val_full($input,"$type_marker"); } %enddef %define %swig_enum_out(how) %typemap(how) enum SWIGTYPE { $result = caml_callback2(*caml_named_value(SWIG_MODULE "_int_to_enum"),*caml_named_value("$type_marker"),Val_int((int)$1)); } %enddef %swig_enum_in(in) %swig_enum_in(varin) %swig_enum_in(directorout) %swig_enum_out(out) %swig_enum_out(varout) %swig_enum_out(directorin) %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { $1 = ($1_ltype) caml_string_val($input); $2 = ($2_ltype) caml_string_len($input); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **)&$1); $result = SWIG_Ocaml_ptr_to_val("create_$ntype_from_ptr", (void *)$1, ty); } /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } swig-4.0.2/Lib/ocaml/preamble.swg0000644000175000017500000000073113667507523016475 0ustar williamwilliam%insert(mli) %{ exception BadArgs of string exception BadMethodName of c_obj * string * string exception NotObject of c_obj exception NotEnumType of c_obj exception LabelNotFromThisEnum of c_obj exception InvalidDirectorCall of c_obj %} %insert(ml) %{ exception BadArgs of string exception BadMethodName of c_obj * string * string exception NotObject of c_obj exception NotEnumType of c_obj exception LabelNotFromThisEnum of c_obj exception InvalidDirectorCall of c_obj %}swig-4.0.2/Lib/ocaml/ocamlrun.swg0000644000175000017500000003516013667507523016532 0ustar williamwilliam/* -*-c-*- */ /* SWIG pointer structure */ #include #include #ifdef __cplusplus extern "C" { #endif #define C_bool 0 #define C_char 1 #define C_uchar 2 #define C_short 3 #define C_ushort 4 #define C_int 5 #define C_uint 6 #define C_int32 7 #define C_int64 8 #define C_float 9 #define C_double 10 #define C_ptr 11 #define C_array 12 #define C_list 13 #define C_obj 14 #define C_string 15 #define C_enum 16 #define C_director_core 17 /* Cast a pointer if possible; returns 1 if successful */ SWIGINTERN int SWIG_Cast (void *source, swig_type_info *source_type, void **ptr, swig_type_info *dest_type) { if( !source ) { /* Special case for NULL. This is a popular question for other modules on the list, so I want an easy way out... */ *ptr = 0; return 0; } #ifdef TYPE_CAST_VERBOSE fprintf( stderr, "Trying to cast %s to %s\n", source_type ? source_type->str : "", dest_type ? dest_type->str : "" ); #endif if (dest_type != source_type) { /* We have a type mismatch. Will have to look through our type mapping table to figure out whether or not we can accept this datatype. -- Ignore typechecks for void *. Allow any conversion. */ if( !dest_type || !source_type || !strcmp(dest_type->name,"_p_void") || !strcmp(source_type->name,"_p_void") ) { *ptr = source; return 0; } else { swig_cast_info *tc = SWIG_TypeCheckStruct(source_type, dest_type ); #ifdef TYPE_CAST_VERBOSE fprintf( stderr, "Typecheck -> %s\n", tc ? tc->type->str : "" ); #endif if( tc ) { int newmemory = 0; *ptr = SWIG_TypeCast(tc, source, &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return 0; } else return -1; } } else { *ptr = source; return 0; } } /* Return 0 if successful. */ SWIGINTERN int SWIG_GetPtr(void *inptr, void **outptr, swig_type_info *intype, swig_type_info *outtype) { if (intype) { return SWIG_Cast(inptr, intype, outptr, outtype) == -1; } else { *outptr = inptr; return 0; } } SWIGINTERN void caml_print_list( CAML_VALUE v ); SWIGINTERN void caml_print_val( CAML_VALUE v ) { switch( SWIG_Tag_val(v) ) { case C_bool: if( Bool_val(SWIG_Field(v,0)) ) fprintf( stderr, "true " ); else fprintf( stderr, "false " ); break; case C_char: case C_uchar: fprintf( stderr, "'%c' (\\%03d) ", (Int_val(SWIG_Field(v,0)) >= ' ' && Int_val(SWIG_Field(v,0)) < 127) ? Int_val(SWIG_Field(v,0)) : '.', Int_val(SWIG_Field(v,0)) ); break; case C_short: case C_ushort: case C_int: fprintf( stderr, "%d ", (int)caml_long_val(v) ); break; case C_uint: case C_int32: fprintf( stderr, "%ud ", (unsigned int)caml_long_val(v) ); break; case C_int64: fprintf( stderr, "%ld ", caml_long_val(v) ); break; case C_float: case C_double: fprintf( stderr, "%f ", caml_double_val(v) ); break; case C_ptr: { void *vout = 0; swig_type_info *ty = (swig_type_info *)(long)SWIG_Int64_val(SWIG_Field(v,1)); caml_ptr_val_internal(v,&vout,0); fprintf( stderr, "PTR(%p,%s) ", vout, ty ? ty->name : "(null)" ); } break; case C_array: { unsigned int i; for( i = 0; i < Wosize_val( SWIG_Field(v,0) ); i++ ) caml_print_val( SWIG_Field(SWIG_Field(v,0),i) ); } break; case C_list: caml_print_list( SWIG_Field(v,0) ); break; case C_obj: fprintf( stderr, "OBJ(%p) ", (void *)SWIG_Field(v,0) ); break; case C_string: { void *cout; caml_ptr_val_internal(v,&cout,0); fprintf( stderr, "'%s' ", (char *)cout ); } break; } } SWIGINTERN void caml_print_list( CAML_VALUE v ) { CAMLparam1(v); while( v && Is_block(v) ) { fprintf( stderr, "[ " ); caml_print_val( SWIG_Field(v,0) ); fprintf( stderr, "]\n" ); v = SWIG_Field(v,1); } CAMLreturn0; } SWIGINTERN CAML_VALUE caml_list_nth( CAML_VALUE lst, int n ) { CAMLparam1(lst); int i = 0; while( i < n && lst && Is_block(lst) ) { i++; lst = SWIG_Field(lst,1); } if( lst == Val_unit ) CAMLreturn(Val_unit); else CAMLreturn(SWIG_Field(lst,0)); } SWIGINTERN CAML_VALUE caml_list_append( CAML_VALUE lst, CAML_VALUE elt ) { CAMLparam2(lst,elt); SWIG_CAMLlocal3(v,vt,lh); lh = Val_unit; v = Val_unit; /* Appending C_void should have no effect */ if( !Is_block(elt) ) return lst; while( lst && Is_block(lst) ) { if( v && v != Val_unit ) { vt = caml_alloc_tuple(2); SWIG_Store_field(v,1,vt); v = vt; } else { v = lh = caml_alloc_tuple(2); } SWIG_Store_field(v,0,SWIG_Field(lst,0)); lst = SWIG_Field(lst,1); } if( v && Is_block(v) ) { vt = caml_alloc_tuple(2); SWIG_Store_field(v,1,vt); v = vt; } else { v = lh = caml_alloc_tuple(2); } SWIG_Store_field(v,0,elt); SWIG_Store_field(v,1,Val_unit); CAMLreturn(lh); } SWIGINTERN int caml_list_length( CAML_VALUE lst ) { CAMLparam1(lst); int i = 0; while( lst && Is_block(lst) ) { i++; lst = SWIG_Field(lst,1); } CAMLreturn(i); } SWIGINTERN void caml_array_set( CAML_VALUE arr, int n, CAML_VALUE item ) { CAMLparam2(arr,item); SWIG_Store_field(SWIG_Field(arr,0),n,item); CAMLreturn0; } SWIGINTERN value caml_array_nth( CAML_VALUE arr, int n ) { CAMLparam1(arr); if( SWIG_Tag_val(arr) == C_array ) CAMLreturn(SWIG_Field(SWIG_Field(arr,0),n)); else if( SWIG_Tag_val(arr) == C_list ) CAMLreturn(caml_list_nth(arr,0)); else caml_failwith("Need array or list"); } SWIGINTERN int caml_array_len( CAML_VALUE arr ) { CAMLparam1(arr); if( SWIG_Tag_val(arr) == C_array ) CAMLreturn(Wosize_val(SWIG_Field(arr,0))); else if( SWIG_Tag_val(arr) == C_list ) CAMLreturn(caml_list_length(arr)); else caml_failwith("Need array or list"); } SWIGINTERN CAML_VALUE caml_swig_alloc(int x,int y) { return caml_alloc(x,y); } SWIGINTERN value caml_array_new( int n ) { CAMLparam0(); SWIG_CAMLlocal1(vv); vv = caml_swig_alloc(1,C_array); SWIG_Store_field(vv,0,caml_alloc_tuple(n)); CAMLreturn(vv); } SWIGINTERN CAML_VALUE caml_val_bool( int b ) { CAMLparam0(); SWIG_CAMLlocal1(bv); bv = caml_swig_alloc(1,C_bool); SWIG_Store_field(bv,0,Val_bool(b)); CAMLreturn(bv); } SWIGINTERN CAML_VALUE caml_val_char( char c ) { CAMLparam0(); SWIG_CAMLlocal1(cv); cv = caml_swig_alloc(1,C_char); SWIG_Store_field(cv,0,Val_int(c)); CAMLreturn(cv); } SWIGINTERN CAML_VALUE caml_val_uchar( unsigned char uc ) { CAMLparam0(); SWIG_CAMLlocal1(ucv); ucv = caml_swig_alloc(1,C_uchar); SWIG_Store_field(ucv,0,Val_int(uc)); CAMLreturn(ucv); } SWIGINTERN CAML_VALUE caml_val_short( short s ) { CAMLparam0(); SWIG_CAMLlocal1(sv); sv = caml_swig_alloc(1,C_short); SWIG_Store_field(sv,0,Val_int(s)); CAMLreturn(sv); } SWIGINTERN CAML_VALUE caml_val_ushort( unsigned short us ) { CAMLparam0(); SWIG_CAMLlocal1(usv); usv = caml_swig_alloc(1,C_ushort); SWIG_Store_field(usv,0,Val_int(us)); CAMLreturn(usv); } SWIGINTERN CAML_VALUE caml_val_int( int i ) { CAMLparam0(); SWIG_CAMLlocal1(iv); iv = caml_swig_alloc(1,C_int); SWIG_Store_field(iv,0,Val_int(i)); CAMLreturn(iv); } SWIGINTERN CAML_VALUE caml_val_uint( unsigned int ui ) { CAMLparam0(); SWIG_CAMLlocal1(uiv); uiv = caml_swig_alloc(1,C_int); SWIG_Store_field(uiv,0,Val_int(ui)); CAMLreturn(uiv); } SWIGINTERN CAML_VALUE caml_val_long( long l ) { CAMLparam0(); SWIG_CAMLlocal1(lv); lv = caml_swig_alloc(1,C_int64); SWIG_Store_field(lv,0,caml_copy_int64(l)); CAMLreturn(lv); } SWIGINTERN CAML_VALUE caml_val_ulong( unsigned long ul ) { CAMLparam0(); SWIG_CAMLlocal1(ulv); ulv = caml_swig_alloc(1,C_int64); SWIG_Store_field(ulv,0,caml_copy_int64(ul)); CAMLreturn(ulv); } SWIGINTERN CAML_VALUE caml_val_float( float f ) { CAMLparam0(); SWIG_CAMLlocal1(fv); fv = caml_swig_alloc(1,C_float); SWIG_Store_field(fv,0,caml_copy_double((double)f)); CAMLreturn(fv); } SWIGINTERN CAML_VALUE caml_val_double( double d ) { CAMLparam0(); SWIG_CAMLlocal1(fv); fv = caml_swig_alloc(1,C_double); SWIG_Store_field(fv,0,caml_copy_double(d)); CAMLreturn(fv); } SWIGINTERN CAML_VALUE caml_val_ptr( void *p, swig_type_info *info ) { CAMLparam0(); SWIG_CAMLlocal1(vv); vv = caml_swig_alloc(2,C_ptr); SWIG_Store_field(vv,0,caml_copy_int64((long)p)); SWIG_Store_field(vv,1,caml_copy_int64((long)info)); CAMLreturn(vv); } SWIGINTERN CAML_VALUE caml_val_string( const char *p ) { CAMLparam0(); SWIG_CAMLlocal1(vv); if( !p ) CAMLreturn(caml_val_ptr( (void *)p, 0 )); vv = caml_swig_alloc(1,C_string); SWIG_Store_field(vv,0,caml_copy_string(p)); CAMLreturn(vv); } SWIGINTERN CAML_VALUE caml_val_string_len( const char *p, int len ) { CAMLparam0(); SWIG_CAMLlocal1(vv); if( !p || len < 0 ) CAMLreturn(caml_val_ptr( (void *)p, 0 )); vv = caml_swig_alloc(1,C_string); SWIG_Store_field(vv,0,caml_alloc_string(len)); memcpy(String_val(SWIG_Field(vv,0)),p,len); CAMLreturn(vv); } #define caml_val_obj(v, name) caml_val_obj_helper(v, SWIG_TypeQuery((name)), name) SWIGINTERN CAML_VALUE caml_val_obj_helper( void *v, swig_type_info *type, char *name) { CAMLparam0(); CAMLreturn(caml_callback2(*caml_named_value("caml_create_object_fn"), caml_val_ptr(v,type), caml_copy_string(name))); } SWIGINTERN long caml_long_val_full( CAML_VALUE v, const char *name ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_bool: case C_char: case C_uchar: case C_short: case C_ushort: case C_int: CAMLreturn(Int_val(SWIG_Field(v,0))); case C_uint: case C_int32: CAMLreturn(Int32_val(SWIG_Field(v,0))); case C_int64: CAMLreturn((long)SWIG_Int64_val(SWIG_Field(v,0))); case C_float: case C_double: CAMLreturn((long)Double_val(SWIG_Field(v,0))); case C_string: CAMLreturn((long)String_val(SWIG_Field(v,0))); case C_ptr: CAMLreturn((long)SWIG_Int64_val(SWIG_Field(SWIG_Field(v,0),0))); case C_enum: { SWIG_CAMLlocal1(ret); const CAML_VALUE *enum_to_int = caml_named_value(SWIG_MODULE "_enum_to_int"); if( !name ) caml_failwith( "Not an enum conversion" ); ret = caml_callback2(*enum_to_int,*caml_named_value(name),v); CAMLreturn(caml_long_val(ret)); } default: caml_failwith("No conversion to int"); } } SWIGINTERN long caml_long_val( CAML_VALUE v ) { return caml_long_val_full(v,0); } SWIGINTERN double caml_double_val( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0.0; switch( SWIG_Tag_val(v) ) { case C_bool: case C_char: case C_uchar: case C_short: case C_ushort: case C_int: CAMLreturn_type(Int_val(SWIG_Field(v,0))); case C_uint: case C_int32: CAMLreturn_type(Int32_val(SWIG_Field(v,0))); case C_int64: CAMLreturn_type(SWIG_Int64_val(SWIG_Field(v,0))); case C_float: case C_double: CAMLreturn_type(Double_val(SWIG_Field(v,0))); default: fprintf( stderr, "Unknown block tag %d\n", SWIG_Tag_val(v) ); caml_failwith("No conversion to double"); } } SWIGINTERN int caml_ptr_val_internal( CAML_VALUE v, void **out, swig_type_info *descriptor ) { CAMLparam1(v); void *outptr = NULL; swig_type_info *outdescr = NULL; static const CAML_VALUE *func_val = NULL; if( v == Val_unit ) { *out = 0; CAMLreturn_type(0); } if( !Is_block(v) ) return -1; switch( SWIG_Tag_val(v) ) { case C_obj: if (!func_val) { func_val = caml_named_value("caml_obj_ptr"); } CAMLreturn_type(caml_ptr_val_internal(caml_callback(*func_val, v), out, descriptor)); case C_string: outptr = (void *)String_val(SWIG_Field(v,0)); break; case C_ptr: outptr = (void *)(long)SWIG_Int64_val(SWIG_Field(v,0)); outdescr = (swig_type_info *)(long)SWIG_Int64_val(SWIG_Field(v,1)); break; default: *out = 0; CAMLreturn_type(1); break; } CAMLreturn_type(SWIG_GetPtr(outptr, out, outdescr, descriptor)); } SWIGINTERN void *caml_ptr_val( CAML_VALUE v, swig_type_info *descriptor ) { CAMLparam0(); #ifdef TYPE_CAST_VERBOSE caml_print_val( v ); #endif void *out = NULL; if( !caml_ptr_val_internal( v, &out, descriptor ) ) CAMLreturn_type(out); else caml_failwith( "No appropriate conversion found." ); } SWIGINTERN char *caml_string_val( CAML_VALUE v ) { return (char *)caml_ptr_val( v, 0 ); } SWIGINTERN int caml_string_len( CAML_VALUE v ) { switch( SWIG_Tag_val(v) ) { case C_string: return caml_string_length(SWIG_Field(v,0)); default: return strlen((char *)caml_ptr_val(v,0)); } } SWIGINTERN int caml_bool_check( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_bool: case C_ptr: case C_string: CAMLreturn(1); default: CAMLreturn(0); } } SWIGINTERN int caml_int_check( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_char: case C_uchar: case C_short: case C_ushort: case C_int: case C_uint: case C_int32: case C_int64: CAMLreturn(1); default: CAMLreturn(0); } } SWIGINTERN int caml_float_check( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_float: case C_double: CAMLreturn(1); default: CAMLreturn(0); } } SWIGINTERN int caml_ptr_check( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_string: case C_ptr: case C_int64: CAMLreturn(1); default: CAMLreturn(0); } } SWIGINTERN CAML_VALUE SWIG_Ocaml_ptr_to_val(const char *name, void *ptr, swig_type_info *descriptor) { CAMLparam0(); SWIG_CAMLlocal1(result); const CAML_VALUE *fromval = caml_named_value(name); if (fromval) { result = caml_callback(*fromval, caml_val_ptr(ptr, descriptor)); } else { result = caml_val_ptr(ptr, descriptor); } CAMLreturn(result); } static swig_module_info *SWIG_Ocaml_GetModule(void *SWIGUNUSEDPARM(clientdata)) { CAML_VALUE pointer; pointer = caml_callback(*caml_named_value("swig_find_type_info"), caml_val_int(0)); if (Is_block(pointer) && SWIG_Tag_val(pointer) == C_ptr) { return (swig_module_info *)(void *)(long)SWIG_Int64_val(SWIG_Field(pointer,0)); } return 0; } static void SWIG_Ocaml_SetModule(swig_module_info *pointer) { CAML_VALUE mod_pointer; mod_pointer = caml_val_ptr(pointer, NULL); caml_callback(*caml_named_value("swig_set_type_info"), mod_pointer); } #ifdef __cplusplus } #endif #undef value swig-4.0.2/Lib/ocaml/swig.ml0000644000175000017500000001136513667507523015474 0ustar williamwilliam(* -*- tuareg -*- *) open Int32 open Int64 type enum = [ `Int of int ] type 'a c_obj_t = C_void | C_bool of bool | C_char of char | C_uchar of char | C_short of int | C_ushort of int | C_int of int | C_uint of int32 | C_int32 of int32 | C_int64 of int64 | C_float of float | C_double of float | C_ptr of int64 * int64 | C_array of 'a c_obj_t array | C_list of 'a c_obj_t list | C_obj of (string -> 'a c_obj_t -> 'a c_obj_t) | C_string of string | C_enum of 'a | C_director_core of 'a c_obj_t * 'a c_obj_t option ref type c_obj = enum c_obj_t exception BadArgs of string exception BadMethodName of string * string exception NotObject of c_obj exception NotEnumType of c_obj exception LabelNotFromThisEnum of c_obj exception InvalidDirectorCall of c_obj exception NoSuchClass of string let rec invoke obj = match obj with C_obj o -> o | C_director_core (o,r) -> invoke o | _ -> raise (NotObject (Obj.magic obj)) let _ = Callback.register "swig_runmethod" invoke let fnhelper arg = match arg with C_list l -> l | C_void -> [] | _ -> [ arg ] let director_core_helper fnargs = try match List.hd fnargs with | C_director_core (o,r) -> fnargs | _ -> C_void :: fnargs with Failure _ -> C_void :: fnargs let rec get_int x = match x with C_bool b -> if b then 1 else 0 | C_char c | C_uchar c -> (int_of_char c) | C_short s | C_ushort s | C_int s -> s | C_uint u | C_int32 u -> (Int32.to_int u) | C_int64 u -> (Int64.to_int u) | C_float f -> (int_of_float f) | C_double d -> (int_of_float d) | C_ptr (p,q) -> (Int64.to_int p) | C_obj o -> (try (get_int (o "int" C_void)) with _ -> (get_int (o "&" C_void))) | _ -> raise (Failure "Can't convert to int") let rec get_float x = match x with C_char c | C_uchar c -> (float_of_int (int_of_char c)) | C_short s -> (float_of_int s) | C_ushort s -> (float_of_int s) | C_int s -> (float_of_int s) | C_uint u | C_int32 u -> (float_of_int (Int32.to_int u)) | C_int64 u -> (float_of_int (Int64.to_int u)) | C_float f -> f | C_double d -> d | C_obj o -> (try (get_float (o "float" C_void)) with _ -> (get_float (o "double" C_void))) | _ -> raise (Failure "Can't convert to float") let rec get_char x = (char_of_int (get_int x)) let rec get_string x = match x with C_string str -> str | _ -> raise (Failure "Can't convert to string") let rec get_bool x = match x with C_bool b -> b | _ -> (try if get_int x != 0 then true else false with _ -> raise (Failure "Can't convert to bool")) let disown_object obj = match obj with C_director_core (o,r) -> r := None | _ -> raise (Failure "Not a director core object") let _ = Callback.register "caml_obj_disown" disown_object let addr_of obj = match obj with C_obj _ -> (invoke obj) "&" C_void | C_director_core (self,r) -> (invoke self) "&" C_void | C_ptr _ -> obj | _ -> raise (Failure "Not a pointer.") let _ = Callback.register "caml_obj_ptr" addr_of let make_float f = C_float f let make_double f = C_double f let make_string s = C_string s let make_bool b = C_bool b let make_char c = C_char c let make_char_i c = C_char (char_of_int c) let make_uchar c = C_uchar c let make_uchar_i c = C_uchar (char_of_int c) let make_short i = C_short i let make_ushort i = C_ushort i let make_int i = C_int i let make_uint i = C_uint (Int32.of_int i) let make_int32 i = C_int32 (Int32.of_int i) let make_int64 i = C_int64 (Int64.of_int i) let new_derived_object cfun x_class args = begin let get_object ob = match !ob with None -> raise (NotObject C_void) | Some o -> o in let ob_ref = ref None in let class_fun class_f ob_r = (fun meth args -> class_f (get_object ob_r) meth args) in let new_class = class_fun x_class ob_ref in let dircore = C_director_core (C_obj new_class,ob_ref) in let obj = cfun (match args with C_list argl -> (C_list ((dircore :: argl))) | C_void -> (C_list [ dircore ]) | a -> (C_list [ dircore ; a ])) in ob_ref := Some obj ; obj end let swig_current_type_info = ref C_void let find_type_info obj = !swig_current_type_info let _ = Callback.register "swig_find_type_info" find_type_info let set_type_info obj = match obj with C_ptr _ -> swig_current_type_info := obj ; obj | _ -> raise (Failure "Internal error: passed non pointer to set_type_info") let _ = Callback.register "swig_set_type_info" set_type_info let class_master_list = Hashtbl.create 20 let register_class_byname nm co = Hashtbl.replace class_master_list nm (Obj.magic co) let create_class nm = try (Obj.magic (Hashtbl.find class_master_list nm)) with _ -> raise (NoSuchClass nm) swig-4.0.2/Lib/ocaml/extra-install.list0000644000175000017500000000006713667507523017652 0ustar williamwilliam# see top-level Makefile.in swigp4.ml swig.mli swig.ml swig-4.0.2/Lib/ocaml/std_common.i0000644000175000017500000000112513667507523016476 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; %{ #include SWIGINTERNINLINE CAML_VALUE SwigString_FromString(const std::string &s) { return caml_val_string((char *)s.c_str()); } SWIGINTERNINLINE std::string SwigString_AsString(CAML_VALUE o) { return std::string((char *)caml_ptr_val(o,0)); } %} swig-4.0.2/Lib/ocaml/std_except.i0000644000175000017500000000263413667507523016504 0ustar williamwilliam%{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws) std::bad_cast "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());" %typemap(throws) std::bad_exception "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());" %typemap(throws) std::domain_error "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());" %typemap(throws) std::exception "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());" %typemap(throws) std::invalid_argument "SWIG_OCamlThrowException(SWIG_OCamlIllegalArgumentException, $1.what());" %typemap(throws) std::length_error "SWIG_OCamlThrowException(SWIG_OCamlIndexOutOfBoundsException, $1.what());" %typemap(throws) std::logic_error "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());" %typemap(throws) std::out_of_range "SWIG_OCamlThrowException(SWIG_OCamlIndexOutOfBoundsException, $1.what());" %typemap(throws) std::overflow_error "SWIG_OCamlThrowException(SWIG_OCamlArithmeticException, $1.what());" %typemap(throws) std::range_error "SWIG_OCamlThrowException(SWIG_OCamlIndexOutOfBoundsException, $1.what());" %typemap(throws) std::runtime_error "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());" %typemap(throws) std::underflow_error "SWIG_OCamlThrowException(SWIG_OCamlArithmeticException, $1.what());" swig-4.0.2/Lib/ocaml/typemaps.i0000644000175000017500000000376313667507523016210 0ustar williamwilliam/* ---------------------------------------------------------------------------- * typemaps.i * * These typemaps provide support for input/output arguments for C/C++ pointers * and C++ references. * ---------------------------------------------------------------------------- */ %define INPUT_OUTPUT_INOUT_TYPEMAPS(type, c_to_ocaml, ocaml_to_c) %typemap(in) type *INPUT(type temp), type &INPUT(type temp) { temp = (type)ocaml_to_c($input); $1 = &temp; } %typemap(typecheck) type *INPUT = type; %typemap(typecheck) type &INPUT = type; %typemap(in, numinputs=0) type *OUTPUT($*1_ltype temp), type &OUTPUT($*1_ltype temp) "$1 = &temp;" %typemap(argout) type *OUTPUT, type &OUTPUT { swig_result = caml_list_append(swig_result, c_to_ocaml(*$1)); } %typemap(in) type *INOUT = type *INPUT; %typemap(in) type &INOUT = type &INPUT; %typemap(argout) type *INOUT = type *OUTPUT; %typemap(argout) type &INOUT = type &OUTPUT; %typemap(typecheck) type *INOUT = type; %typemap(typecheck) type &INOUT = type; %enddef INPUT_OUTPUT_INOUT_TYPEMAPS(bool, caml_val_bool, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(int, caml_val_int, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(long, caml_val_long, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(short, caml_val_int, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(char, caml_val_char, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(signed char, caml_val_char, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(float, caml_val_float, caml_double_val); INPUT_OUTPUT_INOUT_TYPEMAPS(double, caml_val_double, caml_double_val); INPUT_OUTPUT_INOUT_TYPEMAPS(unsigned int, caml_val_uint, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(unsigned long, caml_val_ulong, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(unsigned short, caml_val_ushort, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(unsigned char, caml_val_uchar, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(long long, caml_val_long, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(unsigned long long, caml_val_ulong, caml_long_val); #undef INPUT_OUTPUT_INOUT_TYPEMAPS swig-4.0.2/Lib/ocaml/typeregister.swg0000644000175000017500000000006713667507523017436 0ustar williamwilliamSWIGEXT void SWIG_init() { SWIG_InitializeModule(0); swig-4.0.2/Lib/ocaml/std_pair.i0000644000175000017500000000140513667507523016142 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.2/Lib/ocaml/ocamlkw.swg0000644000175000017500000000224213667507523016342 0ustar williamwilliam#ifndef OCAML_OCAMLKW_SWG_ #define OCAML_OCAMLKW_SWG_ /* Warnings for Ocaml keywords */ #define OCAMLKW(x) %namewarn("314: '" #x "' is an ocaml keyword and it will be appropriately renamed") #x /* from https://caml.inria.fr/pub/docs/manual-ocaml/lex.html */ OCAMLKW(and); OCAMLKW(as); OCAMLKW(asr); OCAMLKW(assert); OCAMLKW(begin); OCAMLKW(class); OCAMLKW(constraint); OCAMLKW(do); OCAMLKW(done); OCAMLKW(downto); OCAMLKW(else); OCAMLKW(end); OCAMLKW(exception); OCAMLKW(external); OCAMLKW(false); OCAMLKW(for); OCAMLKW(fun); OCAMLKW(function); OCAMLKW(functor); OCAMLKW(if); OCAMLKW(in); OCAMLKW(include); OCAMLKW(inherit); OCAMLKW(initializer); OCAMLKW(land); OCAMLKW(lazy); OCAMLKW(let); OCAMLKW(lor); OCAMLKW(lsl); OCAMLKW(lsr); OCAMLKW(lxor); OCAMLKW(match); OCAMLKW(method); OCAMLKW(mod); OCAMLKW(module); OCAMLKW(mutable); OCAMLKW(new); OCAMLKW(nonrec); OCAMLKW(object); OCAMLKW(of); OCAMLKW(open); OCAMLKW(or); OCAMLKW(private); OCAMLKW(rec); OCAMLKW(sig); OCAMLKW(struct); OCAMLKW(then); OCAMLKW(to); OCAMLKW(true); OCAMLKW(try); OCAMLKW(type); OCAMLKW(val); OCAMLKW(virtual); OCAMLKW(when); OCAMLKW(while); OCAMLKW(with); #undef OCAMLKW #endif //OCAML_OCAMLKW_SWG_ swig-4.0.2/Lib/ocaml/class.swg0000644000175000017500000000337313667507523016020 0ustar williamwilliam(*Stream:class_ctors*) let create_$classname_from_ptr raw_ptr = C_obj begin let h = Hashtbl.create 20 in List.iter (fun (nm,fn) -> Hashtbl.replace h nm fn) [ "nop", (fun args -> C_void) ; $classbody "&", (fun args -> raw_ptr) ; ":parents", (fun args -> C_list (let out = ref [] in Hashtbl.iter (fun x y -> out := (x,y) :: !out) h ; (List.map (fun (x,y) -> C_string (String.sub x 2 ((String.length x) - 2))) (List.filter (fun (x,y) -> ((String.length x) > 2) && x.[0] == ':' && x.[1] == ':') !out)))) ; ":classof", (fun args -> C_string "$realname") ; ":methods", (fun args -> C_list (let out = ref [] in Hashtbl.iter (fun x y -> out := (C_string x) :: !out) h ; !out)) ] ; let rec invoke_inner raw_ptr mth arg = begin try let application = Hashtbl.find h mth in application (match arg with C_list l -> (C_list (raw_ptr :: l)) | C_void -> (C_list [ raw_ptr ]) | v -> (C_list [ raw_ptr ; v ])) with Not_found -> (* Try parent classes *) begin let parent_classes = [ $baselist ] in let rec try_parent plist raw_ptr = match plist with p :: tl -> begin try (invoke (p raw_ptr)) mth arg with (BadMethodName (p,m,s)) -> try_parent tl raw_ptr end | [] -> raise (BadMethodName (raw_ptr,mth,"$realname")) in try_parent parent_classes raw_ptr end end in (fun mth arg -> invoke_inner raw_ptr mth arg) end let _ = register_class_byname "$realname" create_$classname_from_ptr let _ = Callback.register "create_$normalized_from_ptr" create_$classname_from_ptr (*Stream:mli*) val create_$classname_from_ptr : c_obj -> c_obj swig-4.0.2/Lib/ocaml/stl.i0000644000175000017500000000044313667507523015140 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/ocaml/carray.i0000644000175000017500000000614513667507523015624 0ustar williamwilliam%insert(mli) %{ type _value = c_obj %} %insert(ml) %{ type _value = c_obj %} %define %array_tmap_out(type,what,out_f) %typemap(type) what [ANY] { int i; $result = caml_array_new($1_dim0); for( i = 0; i < $1_dim0; i++ ) { caml_array_set($result,i,out_f($1[i])); } } %enddef %define %array_tmap_in(type,what,in_f) %typemap(type) what [ANY] { int i; $1 = ($*1_type *)malloc( $1_size ); for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { $1[i] = in_f(caml_array_nth($input,i)); } } %typemap(free) what [ANY] { free( (void *)$1 ); } %enddef %define %make_simple_array_typemap(type,out_f,in_f) %array_tmap_out(out,type,out_f); %array_tmap_out(varout,type,out_f); %array_tmap_out(directorin,type,out_f); %array_tmap_in(in,type,in_f); %array_tmap_in(varin,type,in_f); %array_tmap_in(directorout,type,in_f); %enddef %make_simple_array_typemap(bool,caml_val_bool,caml_long_val); %make_simple_array_typemap(short,caml_val_short,caml_long_val); %make_simple_array_typemap(unsigned short,caml_val_ushort,caml_long_val); %make_simple_array_typemap(int,caml_val_int,caml_long_val); %make_simple_array_typemap(unsigned int,caml_val_uint,caml_long_val); %make_simple_array_typemap(long,caml_val_long,caml_long_val); %make_simple_array_typemap(unsigned long,caml_val_ulong,caml_long_val); %make_simple_array_typemap(size_t,caml_val_int,caml_long_val); %make_simple_array_typemap(float,caml_val_float,caml_double_val); %make_simple_array_typemap(double,caml_val_double,caml_double_val); #ifdef __cplusplus %typemap(in) SWIGTYPE [] { int i; $1 = new $*1_type [$1_dim0]; for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { $1[i] = *(($*1_ltype *) caml_ptr_val(caml_array_nth($input,i), $*1_descriptor)) ; } } #else %typemap(in) SWIGTYPE [] { int i; $1 = ($*1_type *)malloc( $1_size ); for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { $1[i] = *(($*1_ltype) caml_ptr_val(caml_array_nth($input), $*1_descriptor)); } } #endif %typemap(out) SWIGTYPE [] { int i; const CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); $result = caml_array_new($1_dim0); for( i = 0; i < $1_dim0; i++ ) { if( fromval ) { caml_array_set ($result, i, caml_callback(*fromval,caml_val_ptr((void *)&$1[i],$*1_descriptor))); } else { caml_array_set ($result, i, caml_val_ptr ((void *)&$1[i],$&1_descriptor)); } } } %typemap(in) enum SWIGTYPE [] { int i; $1 = ($*1_type *)malloc( $1_size ); for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { $1[i] = ($type) caml_long_val_full(caml_array_nth($input), "$type_marker"); } } %typemap(out) enum SWIGTYPE [] { int i; $result = caml_array_new($1_dim0); for( i = 0; i < $1_dim0; i++ ) { caml_array_set ($result, i, caml_callback2(*caml_named_value(SWIG_MODULE "_int_to_enum"), *caml_named_value("$type_marker"), Val_int($1[i]))); } } #ifdef __cplusplus %typemap(freearg) SWIGTYPE [ANY] { delete [] $1; } #else %typemap(freearg) SWIGTYPE [ANY] { free( (void *)$1 ); } #endif swig-4.0.2/Lib/ocaml/std_list.i0000644000175000017500000001052113667507523016161 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * * SWIG typemaps for std::list types * ----------------------------------------------------------------------------- */ %include %module std_list %{ #include #include %} namespace std { template class list { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef T &iterator; typedef const T& const_iterator; list(); list(unsigned int size, const T& value = T()); list(const list& other); void assign(unsigned int n, const T& value); void swap(list &x); const_reference front(); const_reference back(); const_iterator begin(); const_iterator end(); void resize(unsigned int n, T c = T()); bool empty() const; void push_front(const T& x); void push_back(const T& x); void pop_front(); void pop_back(); void clear(); unsigned int size() const; unsigned int max_size() const; void resize(unsigned int n, const T& value); void remove(const T& value); void unique(); void reverse(); void sort(); %extend { const_reference __getitem__(int i) throw (std::out_of_range) { std::list::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && i::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && i::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && ierase(first); } else throw std::out_of_range("list index out of range"); } std::list __getslice__(int i,int j) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; if (i>=j) i=j; if (i>=0 && i=0) { for (int k=0;k tmp(j-i); if (j>i) std::copy(first,end,tmp.begin()); return tmp; } else throw std::out_of_range("list index out of range"); } void __delslice__(int i,int j) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; for (int k=0;kerase(first,end); } void __setslice__(int i,int j, const std::list& v) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; for (int k=0;kerase(first,end); if (i+1 <= int(self->size())) { first = self->begin(); for (int k=0;kinsert(first,v.begin(),v.end()); } else self->insert(self->end(),v.begin(),v.end()); } } unsigned int __len__() { return self->size(); } bool __nonzero__() { return !(self->empty()); } void append(const T& x) { self->push_back(x); } void pop() { self->pop_back(); } } }; } swig-4.0.2/Lib/ocaml/swigp4.ml0000644000175000017500000001477413667507523015747 0ustar williamwilliamopen Camlp4 module Id : Sig.Id = struct let name = "swigp4" let version = "0.1" end module Make (Syntax : Sig.Camlp4Syntax) = struct open Sig include Syntax let _loc = Loc.ghost let lap x y = x :: y let c_ify e loc = match e with <:expr< $int:_$ >> -> <:expr< (C_int $e$) >> | <:expr< $str:_$ >> -> <:expr< (C_string $e$) >> | <:expr< $chr:_$ >> -> <:expr< (C_char $e$) >> | <:expr< $flo:_$ >> -> <:expr< (C_double $e$) >> | <:expr< True >> -> <:expr< (C_bool $e$) >> | <:expr< False >> -> <:expr< (C_bool $e$) >> | _ -> <:expr< $e$ >> let mk_list args loc f = let rec mk_list_inner args loc f = match args with [] -> <:expr< [] >> | x :: xs -> (let loc = Ast.loc_of_expr x in <:expr< [ ($f x _loc$) ] @ ($mk_list_inner xs loc f$) >>) in match args with [] -> <:expr< (Obj.magic C_void) >> | [ a ] -> <:expr< (Obj.magic $f a _loc$) >> | _ -> <:expr< (Obj.magic (C_list ($mk_list_inner args loc f$))) >> ;; EXTEND Gram GLOBAL: expr; expr: LEVEL "top" [ [ e1 = expr ; "'" ; "[" ; e2 = expr ; "]" -> <:expr< (invoke $e1$) "[]" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "->" ; l = LIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) $str:l$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "->" ; u = UIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) $str:u$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "->" ; s = expr LEVEL "simple" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) $s$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "." ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) "()" ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "->" ; l = LIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke ((invoke $e1$) "->" C_void)) $str:l$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "->" ; u = UIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke ((invoke $e1$) "->" C_void)) $str:u$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "->" ; s = expr LEVEL "simple" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke ((invoke $e1$) "->" C_void)) $s$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "++" -> <:expr< (invoke $e1$) "++" C_void >> | e1 = expr ; "'" ; "--" -> <:expr< (invoke $e1$) "--" C_void >> | e1 = expr ; "'" ; "-" ; e2 = expr -> <:expr< (invoke $e1$) "-" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "+" ; e2 = expr -> <:expr< (invoke $e1$) "+" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "*" ; e2 = expr -> <:expr< (invoke $e1$) "*" (C_list [ $c_ify e2 _loc$ ]) >> | "'" ; "&" ; e1 = expr -> <:expr< (invoke $e1$) "&" C_void >> | "'" ; "!" ; e1 = expr -> <:expr< (invoke $e1$) "!" C_void >> | "'" ; "~" ; e1 = expr -> <:expr< (invoke $e1$) "~" C_void >> | e1 = expr ; "'" ; "/" ; e2 = expr -> <:expr< (invoke $e1$) "/" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "%" ; e2 = expr -> <:expr< (invoke $e1$) "%" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "lsl" ; e2 = expr -> <:expr< (invoke $e1$) ("<" ^ "<") (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "lsr" ; e2 = expr -> <:expr< (invoke $e1$) (">" ^ ">") (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "<" ; e2 = expr -> <:expr< (invoke $e1$) "<" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "<=" ; e2 = expr -> <:expr< (invoke $e1$) "<=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; ">" ; e2 = expr -> <:expr< (invoke $e1$) ">" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; ">=" ; e2 = expr -> <:expr< (invoke $e1$) ">=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "==" ; e2 = expr -> <:expr< (invoke $e1$) "==" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "!=" ; e2 = expr -> <:expr< (invoke $e1$) "!=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "&" ; e2 = expr -> <:expr< (invoke $e1$) "&" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "^" ; e2 = expr -> <:expr< (invoke $e1$) "^" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "|" ; e2 = expr -> <:expr< (invoke $e1$) "|" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "&&" ; e2 = expr -> <:expr< (invoke $e1$) "&&" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "||" ; e2 = expr -> <:expr< (invoke $e1$) "||" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "=" ; e2 = expr -> <:expr< (invoke $e1$) "=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "+=" ; e2 = expr -> <:expr< (invoke $e1$) "+=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "-=" ; e2 = expr -> <:expr< (invoke $e1$) "-=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "*=" ; e2 = expr -> <:expr< (invoke $e1$) "*=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "/=" ; e2 = expr -> <:expr< (invoke $e1$) "/=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "%=" ; e2 = expr -> <:expr< (invoke $e1$) "%=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "lsl" ; "=" ; e2 = expr -> <:expr< (invoke $e1$) ("<" ^ "<=") (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "lsr" ; "=" ; e2 = expr -> <:expr< (invoke $e1$) (">" ^ ">=") (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "&=" ; e2 = expr -> <:expr< (invoke $e1$) "&=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "^=" ; e2 = expr -> <:expr< (invoke $e1$) "^=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "|=" ; e2 = expr -> <:expr< (invoke $e1$) "|=" (C_list [ $c_ify e2 _loc$ ]) >> | "'" ; e = expr -> c_ify e _loc | c = expr ; "as" ; id = LIDENT -> <:expr< $lid:"get_" ^ id$ $c$ >> | c = expr ; "to" ; id = LIDENT -> <:expr< $uid:"C_" ^ id$ $c$ >> | "`" ; "`" ; l = LIDENT -> <:expr< C_enum `$lid:l$ >> | "`" ; "`" ; u = UIDENT -> <:expr< C_enum `$uid:u$ >> | f = expr ; "'" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< $f$ ($mk_list args _loc c_ify$) >> ] ] ; END ;; end module M = Register.OCamlSyntaxExtension(Id)(Make) swig-4.0.2/Lib/ocaml/std_string.i0000644000175000017500000000612013667507523016514 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ %{ #include #include %} %include %include namespace std { %naturalvar string; %naturalvar wstring; class string; class wstring; /* Overloading check */ %typemap(in) string { if (caml_ptr_check($input)) $1.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); else SWIG_exception(SWIG_TypeError, "string expected"); } %typemap(in) const string & ($*1_ltype temp) { if (caml_ptr_check($input)) { temp.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); $1 = &temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(in) string & ($*1_ltype temp) { if (caml_ptr_check($input)) { temp.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); $1 = &temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(in) string * ($*1_ltype *temp) { if (caml_ptr_check($input)) { temp = new $*1_ltype((char *)caml_ptr_val($input,0), caml_string_len($input)); $1 = temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(free) string * ($*1_ltype *temp) { delete temp; } %typemap(argout) string & { swig_result = caml_list_append(swig_result,caml_val_string_len((*$1).c_str(), (*$1).size())); } %typemap(directorin) string { swig_result = caml_val_string_len($1.c_str(), $1.size()); args = caml_list_append(args, swig_result); } %typemap(directorout) string { $result.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); } %typemap(out) string { $result = caml_val_string_len($1.c_str(),$1.size()); } %typemap(out) string * { $result = caml_val_string_len((*$1).c_str(),(*$1).size()); } %typemap(typecheck) string, const string & = char *; } #ifdef ENABLE_CHARPTR_ARRAY char **c_charptr_array( const std::vector &str_v ); %{ SWIGEXT char **c_charptr_array( const std::vector &str_v ) { char **out = new char *[str_v.size() + 1]; out[str_v.size()] = 0; for( int i = 0; i < str_v.size(); i++ ) { out[i] = (char *)str_v[i].c_str(); } return out; } %} #endif #ifdef ENABLE_STRING_VECTOR %template (StringVector) std::vector; %insert(ml) %{ (* Some STL convenience items *) let string_array_to_vector sa = let nv = _new_StringVector C_void in ignore (array_to_vector nv (fun x -> C_string x) sa) ; nv let c_string_array ar = _c_charptr_array (string_array_to_vector ar) %} %insert(mli) %{ val c_string_array: string array -> c_obj %} #endif swig-4.0.2/Lib/ocaml/std_map.i0000644000175000017500000000505513667507523015771 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.2/Lib/ocaml/cstring.i0000644000175000017500000001367413667507523016021 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cstring.i * * This file provides typemaps and macros for dealing with various forms * of C character string handling. The primary use of this module * is in returning character data that has been allocated or changed in * some way. * ----------------------------------------------------------------------------- */ /* %cstring_input_binary(TYPEMAP, SIZE) * * Macro makes a function accept binary string data along with * a size. */ %define %cstring_input_binary(TYPEMAP, SIZE) %apply (char *STRING, int LENGTH) { (TYPEMAP, SIZE) }; %enddef /* * %cstring_bounded_output(TYPEMAP, MAX) * * This macro is used to return a NULL-terminated output string of * some maximum length. For example: * * %cstring_bounded_output(char *outx, 512); * void foo(char *outx) { * sprintf(outx,"blah blah\n"); * } * */ %define %cstring_bounded_output(TYPEMAP,MAX) %typemap(ignore) TYPEMAP(char temp[MAX+1]) { $1 = ($1_ltype) temp; } %typemap(argout) TYPEMAP { $1[MAX] = 0; $result = caml_list_append($result,caml_val_string(str)); } %enddef /* * %cstring_chunk_output(TYPEMAP, SIZE) * * This macro is used to return a chunk of binary string data. * Embedded NULLs are okay. For example: * * %cstring_chunk_output(char *outx, 512); * void foo(char *outx) { * memmove(outx, somedata, 512); * } * */ %define %cstring_chunk_output(TYPEMAP,SIZE) %typemap(ignore) TYPEMAP(char temp[SIZE]) { $1 = ($1_ltype) temp; } %typemap(argout) TYPEMAP { $result = caml_list_append($result,caml_val_string_len($1,SIZE)); } %enddef /* * %cstring_bounded_mutable(TYPEMAP, SIZE) * * This macro is used to wrap a string that's going to mutate. * * %cstring_bounded_mutable(char *in, 512); * void foo(in *x) { * while (*x) { * *x = toupper(*x); * x++; * } * } * */ %define %cstring_bounded_mutable(TYPEMAP,MAX) %typemap(in) TYPEMAP(char temp[MAX+1]) { char *t = (char *)caml_ptr_val($input); strncpy(temp,t,MAX); $1 = ($1_ltype) temp; } %typemap(argout) TYPEMAP { $result = caml_list_append($result,caml_val_string_len($1,MAX)); } %enddef /* * %cstring_mutable(TYPEMAP [, expansion]) * * This macro is used to wrap a string that will mutate in place. * It may change size up to a user-defined expansion. * * %cstring_mutable(char *in); * void foo(in *x) { * while (*x) { * *x = toupper(*x); * x++; * } * } * */ %define %cstring_mutable(TYPEMAP,...) %typemap(in) TYPEMAP { char *t = String_val($input); int n = caml_string_length($input); $1 = ($1_ltype) t; #if #__VA_ARGS__ == "" #ifdef __cplusplus $1 = ($1_ltype) new char[n+1]; #else $1 = ($1_ltype) malloc(n+1); #endif #else #ifdef __cplusplus $1 = ($1_ltype) new char[n+1+__VA_ARGS__]; #else $1 = ($1_ltype) malloc(n+1+__VA_ARGS__); #endif #endif memmove($1,t,n); $1[n] = 0; } %typemap(argout) TYPEMAP { $result = caml_list_append($result,caml_val_string($1)); #ifdef __cplusplus delete[] $1; #else free($1); #endif } %enddef /* * %cstring_output_maxsize(TYPEMAP, SIZE) * * This macro returns data in a string of some user-defined size. * * %cstring_output_maxsize(char *outx, int max) { * void foo(char *outx, int max) { * sprintf(outx,"blah blah\n"); * } */ %define %cstring_output_maxsize(TYPEMAP, SIZE) %typemap(in) (TYPEMAP, SIZE) { $2 = caml_val_long($input); #ifdef __cplusplus $1 = ($1_ltype) new char[$2+1]; #else $1 = ($1_ltype) malloc($2+1); #endif } %typemap(argout) (TYPEMAP,SIZE) { $result = caml_list_append($result,caml_val_string($1)); #ifdef __cplusplus delete [] $1; #else free($1); #endif } %enddef /* * %cstring_output_withsize(TYPEMAP, SIZE) * * This macro is used to return character data along with a size * parameter. * * %cstring_output_maxsize(char *outx, int *max) { * void foo(char *outx, int *max) { * sprintf(outx,"blah blah\n"); * *max = strlen(outx); * } */ %define %cstring_output_withsize(TYPEMAP, SIZE) %typemap(in) (TYPEMAP, SIZE) { int n = caml_val_long($input); #ifdef __cplusplus $1 = ($1_ltype) new char[n+1]; $2 = ($2_ltype) new $*1_ltype; #else $1 = ($1_ltype) malloc(n+1); $2 = ($2_ltype) malloc(sizeof($*1_ltype)); #endif *$2 = n; } %typemap(argout) (TYPEMAP,SIZE) { $result = caml_list_append($result,caml_val_string_len($1,$2)); #ifdef __cplusplus delete [] $1; delete $2; #else free($1); free($2); #endif } %enddef /* * %cstring_output_allocate(TYPEMAP, RELEASE) * * This macro is used to return character data that was * allocated with new or malloc. * * %cstring_output_allocated(char **outx, free($1)); * void foo(char **outx) { * *outx = (char *) malloc(512); * sprintf(outx,"blah blah\n"); * } */ %define %cstring_output_allocate(TYPEMAP, RELEASE) %typemap(ignore) TYPEMAP($*1_ltype temp = 0) { $1 = &temp; } %typemap(argout) TYPEMAP { if (*$1) { $result = caml_list_append($result,caml_val_string($1)); RELEASE; } else { $result = caml_list_append($result,caml_val_ptr($1)); } } %enddef /* * %cstring_output_allocate_size(TYPEMAP, SIZE, RELEASE) * * This macro is used to return character data that was * allocated with new or malloc. * * %cstring_output_allocated(char **outx, int *sz, free($1)); * void foo(char **outx, int *sz) { * *outx = (char *) malloc(512); * sprintf(outx,"blah blah\n"); * *sz = strlen(outx); * } */ %define %cstring_output_allocate_size(TYPEMAP, SIZE, RELEASE) %typemap(ignore) (TYPEMAP, SIZE) ($*1_ltype temp = 0, $*2_ltype tempn) { $1 = &temp; $2 = &tempn; } %typemap(argout)(TYPEMAP,SIZE) { if (*$1) { $result = caml_list_append($result,caml_val_string_len($1,$2)); RELEASE; } else $result = caml_list_append($result,caml_val_ptr($1)); } %enddef swig-4.0.2/Lib/ocaml/typecheck.i0000644000175000017500000001233413667507523016317 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typecheck.i * * Typechecking rules * ----------------------------------------------------------------------------- */ %typecheck(SWIG_TYPECHECK_INT8) char, signed char, const char &, const signed char & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_char: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_UINT8) unsigned char, const unsigned char & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_uchar: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_INT16) short, signed short, const short &, const signed short &, wchar_t { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_short: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_UINT16) unsigned short, const unsigned short & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_ushort: $1 = 1; break; default: $1 = 0; break; } } } // XXX arty // Will move enum SWIGTYPE later when I figure out what to do with it... %typecheck(SWIG_TYPECHECK_INT32) int, signed int, const int &, const signed int &, enum SWIGTYPE { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_int: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_UINT32) unsigned int, const unsigned int & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_uint: $1 = 1; break; case C_int32: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_INT64) long, signed long, unsigned long, long long, signed long long, unsigned long long, const long &, const signed long &, const unsigned long &, const long long &, const signed long long &, const unsigned long long &, size_t, const size_t & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_int64: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_BOOL) bool, const bool & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_bool: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_FLOAT) float, const float & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_float: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_DOUBLE) double, const double & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_double: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_STRING) char * { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_string: $1 = 1; break; case C_ptr: { swig_type_info *typeinfo = (swig_type_info *)(long)SWIG_Int64_val(SWIG_Field($input,1)); $1 = SWIG_TypeCheck("char *",typeinfo) || SWIG_TypeCheck("signed char *",typeinfo) || SWIG_TypeCheck("unsigned char *",typeinfo) || SWIG_TypeCheck("const char *",typeinfo) || SWIG_TypeCheck("const signed char *",typeinfo) || SWIG_TypeCheck("const unsigned char *",typeinfo) || SWIG_TypeCheck("std::string",typeinfo); } break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { if (!Is_block($input) || !(SWIG_Tag_val($input) == C_obj || SWIG_Tag_val($input) == C_ptr)) { $1 = 0; } else { void *ptr; $1 = !caml_ptr_val_internal($input, &ptr, $descriptor); } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { swig_type_info *typeinfo; if (!Is_block($input)) { $1 = 0; } else { switch (SWIG_Tag_val($input)) { case C_obj: { void *ptr; $1 = !caml_ptr_val_internal($input, &ptr, $&1_descriptor); break; } case C_ptr: { typeinfo = (swig_type_info *)SWIG_Int64_val(SWIG_Field($input, 1)); $1 = SWIG_TypeCheck("$1_type", typeinfo) != NULL; break; } default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; $1 = !caml_ptr_val_internal($input, &ptr, 0); } %typecheck(SWIG_TYPECHECK_SWIGOBJECT) CAML_VALUE "$1 = 1;" /* ------------------------------------------------------------ * Exception handling * ------------------------------------------------------------ */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short { char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, error_msg); } %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] { (void)$1; SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, "C++ $1_type exception thrown"); } %typemap(throws) char * { SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1); } swig-4.0.2/Lib/ocaml/ocaml.i0000644000175000017500000000243213667507523015431 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ocaml.i * * SWIG Configuration File for Ocaml * ----------------------------------------------------------------------------- */ /* Insert common stuff */ %insert(runtime) "swigrun.swg" /* Include headers */ %insert(runtime) "ocamlrundec.swg" /* Type registration */ %insert(init) "swiginit.swg" %insert(init) "typeregister.swg" %insert(mlitail) %{ val swig_val : c_enum_type -> c_obj -> Swig.c_obj %} %insert(mltail) %{ let rec swig_val t v = match v with C_enum e -> enum_to_int t v | C_list l -> Swig.C_list (List.map (swig_val t) l) | C_array a -> Swig.C_array (Array.map (swig_val t) a) | _ -> Obj.magic v %} /*#ifndef SWIG_NOINCLUDE*/ %insert(runtime) "ocamlrun.swg" /*#endif*/ %insert(classtemplate) "class.swg" /* Read in standard typemaps. */ %include %include %include %include %include /* ocaml keywords */ /* There's no need to use this, because of my rewriting machinery. C++ * words never collide with ocaml keywords */ /* still we include the file, but the warning says that the offending name will be properly renamed. Just to let the user to know about it. */ %include swig-4.0.2/Lib/ocaml/swig.mli0000644000175000017500000000333613667507523015644 0ustar williamwilliam(* -*- tuareg -*- *) type enum = [ `Int of int ] type 'a c_obj_t = C_void | C_bool of bool | C_char of char | C_uchar of char | C_short of int | C_ushort of int | C_int of int | C_uint of int32 | C_int32 of int32 | C_int64 of int64 | C_float of float | C_double of float | C_ptr of int64 * int64 | C_array of 'a c_obj_t array | C_list of 'a c_obj_t list | C_obj of (string -> 'a c_obj_t -> 'a c_obj_t) | C_string of string | C_enum of 'a | C_director_core of 'a c_obj_t * 'a c_obj_t option ref type c_obj = enum c_obj_t exception InvalidDirectorCall of c_obj exception NoSuchClass of string val invoke : ('a c_obj_t) -> (string -> 'a c_obj_t -> 'a c_obj_t) val fnhelper : 'a c_obj_t -> 'a c_obj_t list val director_core_helper : 'a c_obj_t list -> 'a c_obj_t list val get_int : 'a c_obj_t -> int val get_float : 'a c_obj_t -> float val get_string : 'a c_obj_t -> string val get_char : 'a c_obj_t -> char val get_bool : 'a c_obj_t -> bool val make_float : float -> 'a c_obj_t val make_double : float -> 'a c_obj_t val make_string : string -> 'a c_obj_t val make_bool : bool -> 'a c_obj_t val make_char : char -> 'a c_obj_t val make_char_i : int -> 'a c_obj_t val make_uchar : char -> 'a c_obj_t val make_uchar_i : int -> 'a c_obj_t val make_short : int -> 'a c_obj_t val make_ushort : int -> 'a c_obj_t val make_int : int -> 'a c_obj_t val make_uint : int -> 'a c_obj_t val make_int32 : int -> 'a c_obj_t val make_int64 : int -> 'a c_obj_t val new_derived_object: ('a c_obj_t -> 'a c_obj_t) -> ('a c_obj_t -> string -> 'a c_obj_t -> 'a c_obj_t) -> 'a c_obj_t -> 'a c_obj_t val register_class_byname : string -> ('a c_obj_t -> 'a c_obj_t) -> unit val create_class : string -> 'a c_obj_t -> 'a c_obj_t swig-4.0.2/Lib/xml/0000755000175000017500000000000013667507523013670 5ustar williamwilliamswig-4.0.2/Lib/xml/xml.swg0000644000175000017500000000002513667507523015207 0ustar williamwilliam/* nothing special */swig-4.0.2/Lib/xml/typemaps.i0000644000175000017500000000026313667507523015705 0ustar williamwilliam// -------------------------------------------------------------------- // Empty file for %include to work // -------------------------------------------------------------------- swig-4.0.2/Lib/swiginit.swg0000644000175000017500000001752513667507523015461 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Type initialization: * This problem is tough by the requirement that no dynamic * memory is used. Also, since swig_type_info structures store pointers to * swig_cast_info structures and swig_cast_info structures store pointers back * to swig_type_info structures, we need some lookup code at initialization. * The idea is that swig generates all the structures that are needed. * The runtime then collects these partially filled structures. * The SWIG_InitializeModule function takes these initial arrays out of * swig_module, and does all the lookup, filling in the swig_module.types * array with the correct data and linking the correct swig_cast_info * structures together. * * The generated swig_type_info structures are assigned statically to an initial * array. We just loop through that array, and handle each type individually. * First we lookup if this type has been already loaded, and if so, use the * loaded structure instead of the generated one. Then we have to fill in the * cast linked list. The cast data is initially stored in something like a * two-dimensional array. Each row corresponds to a type (there are the same * number of rows as there are in the swig_type_initial array). Each entry in * a column is one of the swig_cast_info structures for that type. * The cast_initial array is actually an array of arrays, because each row has * a variable number of columns. So to actually build the cast linked list, * we find the array of casts associated with the type, and loop through it * adding the casts to the list. The one last trick we need to do is making * sure the type pointer in the swig_cast_info struct is correct. * * First off, we lookup the cast->type name to see if it is already loaded. * There are three cases to handle: * 1) If the cast->type has already been loaded AND the type we are adding * casting info to has not been loaded (it is in this module), THEN we * replace the cast->type pointer with the type pointer that has already * been loaded. * 2) If BOTH types (the one we are adding casting info to, and the * cast->type) are loaded, THEN the cast info has already been loaded by * the previous module so we just ignore it. * 3) Finally, if cast->type has not already been loaded, then we add that * swig_cast_info to the linked list (because the cast->type) pointer will * be correct. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* c-mode */ #endif #endif #if 0 #define SWIGRUNTIME_DEBUG #endif SWIGRUNTIME void SWIG_InitializeModule(void *clientdata) { size_t i; swig_module_info *module_head, *iter; int init; /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { /* Initialize the swig_module */ swig_module.type_initial = swig_type_initial; swig_module.cast_initial = swig_cast_initial; swig_module.next = &swig_module; init = 1; } else { init = 0; } /* Try and load any already created modules */ module_head = SWIG_GetModule(clientdata); if (!module_head) { /* This is the first module loaded for this interpreter */ /* so set the swig module into the interpreter */ SWIG_SetModule(clientdata, &swig_module); } else { /* the interpreter has loaded a SWIG module, but has it loaded this one? */ iter=module_head; do { if (iter==&swig_module) { /* Our module is already in the list, so there's nothing more to do. */ return; } iter=iter->next; } while (iter!= module_head); /* otherwise we must add our module into the list */ swig_module.next = module_head->next; module_head->next = &swig_module; } /* When multiple interpreters are used, a module could have already been initialized in a different interpreter, but not yet have a pointer in this interpreter. In this case, we do not want to continue adding types... everything should be set up already */ if (init == 0) return; /* Now work on filling in swig_module.types */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: size %lu\n", (unsigned long)swig_module.size); #endif for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = 0; swig_type_info *ret; swig_cast_info *cast; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: type %lu %s\n", (unsigned long)i, swig_module.type_initial[i]->name); #endif /* if there is another module already loaded */ if (swig_module.next != &swig_module) { type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); } if (type) { /* Overwrite clientdata field */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found type %s\n", type->name); #endif if (swig_module.type_initial[i]->clientdata) { type->clientdata = swig_module.type_initial[i]->clientdata; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); #endif } } else { type = swig_module.type_initial[i]; } /* Insert casting types */ cast = swig_module.cast_initial[i]; while (cast->type) { /* Don't need to add information already in the list */ ret = 0; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); #endif if (swig_module.next != &swig_module) { ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); #ifdef SWIGRUNTIME_DEBUG if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); #endif } if (ret) { if (type == swig_module.type_initial[i]) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: skip old type %s\n", ret->name); #endif cast->type = ret; ret = 0; } else { /* Check for casting already in the list */ swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); #ifdef SWIGRUNTIME_DEBUG if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); #endif if (!ocast) ret = 0; } } if (!ret) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); #endif if (type->cast) { type->cast->prev = cast; cast->next = type->cast; } type->cast = cast; } cast++; } /* Set entry in modules->types array equal to the type */ swig_module.types[i] = type; } swig_module.types[i] = 0; #ifdef SWIGRUNTIME_DEBUG printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { int j = 0; swig_cast_info *cast = swig_module.cast_initial[i]; printf("SWIG_InitializeModule: type %lu %s\n", (unsigned long)i, swig_module.type_initial[i]->name); while (cast->type) { printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); cast++; ++j; } printf("---- Total casts: %d\n",j); } printf("**** SWIG_InitializeModule: Cast List ******\n"); #endif } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientData(void) { size_t i; swig_cast_info *equiv; static int init_run = 0; if (init_run) return; init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { if (equiv->type && !equiv->type->clientdata) SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); } equiv = equiv->next; } } } } #ifdef __cplusplus #if 0 { /* c-mode */ #endif } #endif swig-4.0.2/Lib/javascript/0000755000175000017500000000000013667507523015236 5ustar williamwilliamswig-4.0.2/Lib/javascript/v8/0000755000175000017500000000000013667507523015573 5ustar williamwilliamswig-4.0.2/Lib/javascript/v8/javascriptprimtypes.swg0000644000175000017500000001056413667507523022446 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE v8::Handle SWIG_From_dec(bool)(bool value) { return SWIGV8_BOOLEAN_NEW(value); } } %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(v8::Handle obj, bool *val) { if(!obj->IsBoolean()) { return SWIG_ERROR; } if (val) *val = SWIGV8_BOOLEAN_VALUE(obj); return SWIG_OK; } } /* int */ %fragment(SWIG_From_frag(int),"header") { SWIGINTERNINLINE v8::Handle SWIG_From_dec(int)(int value) { return SWIGV8_INT32_NEW(value); } } %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERN int SWIG_AsVal_dec(int)(v8::Handle valRef, int* val) { if (!valRef->IsNumber()) { return SWIG_TypeError; } if(val) *val = SWIGV8_INTEGER_VALUE(valRef); return SWIG_OK; } } /* long */ %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE v8::Handle SWIG_From_dec(long)(long value) { return SWIGV8_NUMBER_NEW(value); } } %fragment(SWIG_AsVal_frag(long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(long)(v8::Handle obj, long* val) { if (!obj->IsNumber()) { return SWIG_TypeError; } if(val) *val = (long) SWIGV8_INTEGER_VALUE(obj); return SWIG_OK; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long)) { SWIGINTERNINLINE v8::Handle SWIG_From_dec(unsigned long)(unsigned long value) { return (value > LONG_MAX) ? SWIGV8_INTEGER_NEW_UNS(value) : SWIGV8_INTEGER_NEW(%numeric_cast(value,long)); } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(v8::Handle obj, unsigned long *val) { if(!obj->IsNumber()) { return SWIG_TypeError; } long longVal = (long) SWIGV8_NUMBER_VALUE(obj); if(longVal < 0) { return SWIG_OverflowError; } if(val) *val = longVal; return SWIG_OK; } } /* long long */ // Note: these are copied from 'long' and probably need fixing %fragment(SWIG_From_frag(long long),"header", fragment=SWIG_From_frag(long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE v8::Handle SWIG_From_dec(long long)(long long value) { return SWIGV8_NUMBER_NEW(value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment=SWIG_AsVal_frag(long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(v8::Handle obj, long long* val) { if (!obj->IsNumber()) { return SWIG_TypeError; } if(val) *val = (long long) SWIGV8_INTEGER_VALUE(obj); return SWIG_OK; } %#endif } /* unsigned long long */ // Note: these are copied from 'unsigned long' and probably need fixing %fragment(SWIG_From_frag(unsigned long long),"header", fragment=SWIG_From_frag(long long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE v8::Handle SWIG_From_dec(unsigned long long)(unsigned long long value) { return (value > LONG_MAX) ? SWIGV8_INTEGER_NEW_UNS(value) : SWIGV8_INTEGER_NEW(%numeric_cast(value,long)); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment=SWIG_AsVal_frag(unsigned long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(v8::Handle obj, unsigned long long *val) { if(!obj->IsNumber()) { return SWIG_TypeError; } long long longVal = (long long) SWIGV8_NUMBER_VALUE(obj); if(longVal < 0) { return SWIG_OverflowError; } if(val) *val = longVal; return SWIG_OK; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { SWIGINTERN v8::Handle SWIG_From_dec(double) (double val) { return SWIGV8_NUMBER_NEW(val); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(v8::Handle obj, double *val) { if(!obj->IsNumber()) { return SWIG_TypeError; } if(val) *val = SWIGV8_NUMBER_VALUE(obj); return SWIG_OK; } } swig-4.0.2/Lib/javascript/v8/std_complex.i0000644000175000017500000000114713667507523020271 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} namespace std { %naturalvar complex; template class complex; %template() complex; %template() complex; } /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-4.0.2/Lib/javascript/v8/std_deque.i0000644000175000017500000000003413667507523017717 0ustar williamwilliam%include swig-4.0.2/Lib/javascript/v8/javascripthelpers.swg0000644000175000017500000001051413667507523022047 0ustar williamwilliam%insert(runtime) %{ // Note: since 3.19 there are new CallBack types, since 03.21.9 the old ones have been removed #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) typedef v8::InvocationCallback SwigV8FunctionCallback; typedef v8::AccessorGetter SwigV8AccessorGetterCallback; typedef v8::AccessorSetter SwigV8AccessorSetterCallback; typedef v8::AccessorInfo SwigV8PropertyCallbackInfoVoid; #elif (V8_MAJOR_VERSION-0) < 5 typedef v8::FunctionCallback SwigV8FunctionCallback; typedef v8::AccessorGetterCallback SwigV8AccessorGetterCallback; typedef v8::AccessorSetterCallback SwigV8AccessorSetterCallback; typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfoVoid; #else typedef v8::FunctionCallback SwigV8FunctionCallback; typedef v8::AccessorNameGetterCallback SwigV8AccessorGetterCallback; typedef v8::AccessorNameSetterCallback SwigV8AccessorSetterCallback; typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfoVoid; #endif /** * Creates a class template for a class with specified initialization function. */ SWIGRUNTIME v8::Handle SWIGV8_CreateClassTemplate(const char* symbol) { SWIGV8_HANDLESCOPE_ESC(); v8::Local class_templ = SWIGV8_FUNCTEMPLATE_NEW_VOID(); class_templ->SetClassName(SWIGV8_SYMBOL_NEW(symbol)); v8::Handle inst_templ = class_templ->InstanceTemplate(); inst_templ->SetInternalFieldCount(1); v8::Handle equals_templ = class_templ->PrototypeTemplate(); equals_templ->Set(SWIGV8_SYMBOL_NEW("equals"), SWIGV8_FUNCTEMPLATE_NEW(_SWIGV8_wrap_equals)); v8::Handle cptr_templ = class_templ->PrototypeTemplate(); cptr_templ->Set(SWIGV8_SYMBOL_NEW("getCPtr"), SWIGV8_FUNCTEMPLATE_NEW(_wrap_getCPtr)); SWIGV8_ESCAPE(class_templ); } /** * Registers a class method with given name for a given class template. */ SWIGRUNTIME void SWIGV8_AddMemberFunction(v8::Handle class_templ, const char* symbol, SwigV8FunctionCallback _func) { v8::Handle proto_templ = class_templ->PrototypeTemplate(); proto_templ->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)); } /** * Registers a class property with given name for a given class template. */ SWIGRUNTIME void SWIGV8_AddMemberVariable(v8::Handle class_templ, const char* symbol, SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) { v8::Handle proto_templ = class_templ->InstanceTemplate(); proto_templ->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter); } /** * Registers a class method with given name for a given object. */ SWIGRUNTIME void SWIGV8_AddStaticFunction(v8::Handle obj, const char* symbol, const SwigV8FunctionCallback& _func) { obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction()); } /** * Registers a class method with given name for a given object. */ SWIGRUNTIME void SWIGV8_AddStaticVariable(v8::Handle obj, const char* symbol, SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) { #if (V8_MAJOR_VERSION-0) < 5 obj->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter); #else obj->SetAccessor(SWIGV8_CURRENT_CONTEXT(), SWIGV8_SYMBOL_NEW(symbol), getter, setter); #endif } #if (V8_MAJOR_VERSION-0) < 5 SWIGRUNTIME void JS_veto_set_variable(v8::Local property, v8::Local value, const SwigV8PropertyCallbackInfoVoid& info) #else SWIGRUNTIME void JS_veto_set_variable(v8::Local property, v8::Local value, const SwigV8PropertyCallbackInfoVoid& info) #endif { char buffer[256]; char msg[512]; int res; #if (V8_MAJOR_VERSION-0) < 5 property->WriteUtf8(buffer, 256); res = sprintf(msg, "Tried to write read-only variable: %s.", buffer); #else v8::Local sproperty; if (property->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocal(&sproperty)) { SWIGV8_WRITE_UTF8(sproperty, buffer, 256); res = sprintf(msg, "Tried to write read-only variable: %s.", buffer); } else { res = -1; } #endif if(res<0) { SWIG_exception(SWIG_ERROR, "Tried to write read-only variable."); } else { SWIG_exception(SWIG_ERROR, msg); } fail: ; } %} // v8_helper_functions swig-4.0.2/Lib/javascript/v8/javascript.swg0000644000175000017500000000066713667507523020474 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javascript.swg * * Javascript typemaps * ----------------------------------------------------------------------------- */ %include %include %include %include %include %include %include swig-4.0.2/Lib/javascript/v8/javascriptruntime.swg0000644000175000017500000000332013667507523022065 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javascriptruntime.swg * * ----------------------------------------------------------------------------- */ // V8 Version Macro // ---------------- // // v8 added version macros V8_MAJOR_VERSION, V8_MINOR_VERSION, V8_BUILD_NUMBER // and V8_PATCH_LEVEL in version 4.3.0. SWIG generated code uses these if // they are defined - to support earlier versions you can specify the V8 version // in use via the command line when you run SWIG: // // swig -c++ -javascript -v8 -DV8_VERSION=0x032530 example.i // // Or code in the interface file using SWIG_V8_VERSION: // // %begin %{#define SWIG_V8_VERSION 0x031110%} // // This is specified as a hex constant, but the constant is read as pairs of // decimal digits, so for V8 3.25.30 use constant 0x032530. This scheme can't // represent components > 99, but this constant is only useful for V8 < 4.3.0, // and no V8 versions from that era had a component > 99. %define %swig_v8_define_version(version) %insert("runtime") %{ #ifndef SWIG_V8_VERSION #define SWIG_V8_VERSION version #endif %} %enddef #ifdef V8_VERSION %swig_v8_define_version(V8_VERSION) #else // HACK: defining a default version %swig_v8_define_version(0x031110) #endif // Node support // ------------ #ifdef BUILDING_NODE_EXTENSION %insert("runtime") %{ #include //Older version of node.h does not include this #include %} #endif // V8 runtime // ---------- %insert(runtime) %{ #include #include #include #include %} %insert(runtime) "swigrun.swg"; /* SWIG API */ %insert(runtime) "swigerrors.swg"; /* SWIG errors */ %insert(runtime) "javascriptrun.swg" swig-4.0.2/Lib/javascript/v8/javascriptrun.swg0000644000175000017500000006307713667507523021225 0ustar williamwilliam/* --------------------------------------------------------------------------- * These typedefs and defines are used to deal with v8 API changes * * ---------------------------------------------------------------------------*/ // First v8 version that uses "SetWeak" and not "MakeWeak" #define SWIGV8_SETWEAK_VERSION 0x032224 #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031803) #define SWIGV8_STRING_NEW2(cstr, len) v8::String::New(cstr, len) #else #define SWIGV8_STRING_NEW2(cstr, len) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), cstr, v8::String::kNormalString, len) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) typedef v8::Handle SwigV8ReturnValue; typedef v8::Arguments SwigV8Arguments; typedef v8::AccessorInfo SwigV8PropertyCallbackInfo; #define SWIGV8_RETURN(val) return scope.Close(val) #define SWIGV8_RETURN_INFO(val, info) return scope.Close(val) #else typedef void SwigV8ReturnValue; typedef v8::FunctionCallbackInfo SwigV8Arguments; typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo; #define SWIGV8_RETURN(val) args.GetReturnValue().Set(val); return #define SWIGV8_RETURN_INFO(val, info) info.GetReturnValue().Set(val); return #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032117) #define SWIGV8_HANDLESCOPE() v8::HandleScope scope #define SWIGV8_HANDLESCOPE_ESC() v8::HandleScope scope #define SWIGV8_ESCAPE(val) return scope.Close(val) #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032224) #define SWIGV8_HANDLESCOPE() v8::HandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_HANDLESCOPE_ESC() v8::HandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_ESCAPE(val) return scope.Close(val) #else #define SWIGV8_HANDLESCOPE() v8::HandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_HANDLESCOPE_ESC() v8::EscapableHandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_ESCAPE(val) return scope.Escape(val) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032224) #define SWIGV8_ADJUST_MEMORY(size) v8::V8::AdjustAmountOfExternalAllocatedMemory(size) #define SWIGV8_CURRENT_CONTEXT() v8::Context::GetCurrent() #define SWIGV8_THROW_EXCEPTION(err) v8::ThrowException(err) #define SWIGV8_STRING_NEW(str) v8::String::New(str) #define SWIGV8_SYMBOL_NEW(sym) v8::String::NewSymbol(sym) #else #define SWIGV8_ADJUST_MEMORY(size) v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(size) #define SWIGV8_CURRENT_CONTEXT() v8::Isolate::GetCurrent()->GetCurrentContext() #define SWIGV8_THROW_EXCEPTION(err) v8::Isolate::GetCurrent()->ThrowException(err) #define SWIGV8_STRING_NEW(str) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), str) #define SWIGV8_SYMBOL_NEW(sym) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032318) #define SWIGV8_ARRAY_NEW() v8::Array::New() #define SWIGV8_BOOLEAN_NEW(bool) v8::Boolean::New(bool) #define SWIGV8_EXTERNAL_NEW(val) v8::External::New(val) #define SWIGV8_FUNCTEMPLATE_NEW(func) v8::FunctionTemplate::New(func) #define SWIGV8_FUNCTEMPLATE_NEW_VOID() v8::FunctionTemplate::New() #define SWIGV8_INT32_NEW(num) v8::Int32::New(num) #define SWIGV8_INTEGER_NEW(num) v8::Integer::New(num) #define SWIGV8_INTEGER_NEW_UNS(num) v8::Integer::NewFromUnsigned(num) #define SWIGV8_NUMBER_NEW(num) v8::Number::New(num) #define SWIGV8_OBJECT_NEW() v8::Object::New() #define SWIGV8_UNDEFINED() v8::Undefined() #define SWIGV8_NULL() v8::Null() #else #define SWIGV8_ARRAY_NEW() v8::Array::New(v8::Isolate::GetCurrent()) #define SWIGV8_BOOLEAN_NEW(bool) v8::Boolean::New(v8::Isolate::GetCurrent(), bool) #define SWIGV8_EXTERNAL_NEW(val) v8::External::New(v8::Isolate::GetCurrent(), val) #define SWIGV8_FUNCTEMPLATE_NEW(func) v8::FunctionTemplate::New(v8::Isolate::GetCurrent(), func) #define SWIGV8_FUNCTEMPLATE_NEW_VOID() v8::FunctionTemplate::New(v8::Isolate::GetCurrent()) #define SWIGV8_INT32_NEW(num) v8::Int32::New(v8::Isolate::GetCurrent(), num) #define SWIGV8_INTEGER_NEW(num) v8::Integer::New(v8::Isolate::GetCurrent(), num) #define SWIGV8_INTEGER_NEW_UNS(num) v8::Integer::NewFromUnsigned(v8::Isolate::GetCurrent(), num) #define SWIGV8_NUMBER_NEW(num) v8::Number::New(v8::Isolate::GetCurrent(), num) #define SWIGV8_OBJECT_NEW() v8::Object::New(v8::Isolate::GetCurrent()) #define SWIGV8_UNDEFINED() v8::Undefined(v8::Isolate::GetCurrent()) #define SWIGV8_NULL() v8::Null(v8::Isolate::GetCurrent()) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) #define SWIGV8_SET_CLASS_TEMPL(class_templ, class) class_templ = v8::Persistent::New(class); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) #define SWIGV8_SET_CLASS_TEMPL(class_templ, class) class_templ = v8::Persistent::New(v8::Isolate::GetCurrent(), class); #else #define SWIGV8_SET_CLASS_TEMPL(class_templ, class) class_templ.Reset(v8::Isolate::GetCurrent(), class); #endif #ifdef NODE_VERSION #if NODE_VERSION_AT_LEAST(10, 12, 0) #define SWIG_NODE_AT_LEAST_1012 #endif #endif //Necessary to check Node.js version because V8 API changes are backported in Node.js #if (defined(NODE_VERSION) && !defined(SWIG_NODE_AT_LEAST_1012)) || \ (!defined(NODE_VERSION) && (V8_MAJOR_VERSION-0) < 7) #define SWIGV8_TO_OBJECT(handle) (handle)->ToObject() #define SWIGV8_TO_STRING(handle) (handle)->ToString() #define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue() #define SWIGV8_INTEGER_VALUE(handle) (handle)->IntegerValue() #define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue() #define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(buffer, len) #define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length() #else #define SWIGV8_TO_OBJECT(handle) (handle)->ToObject(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked() #define SWIGV8_TO_STRING(handle) (handle)->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked() #define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue(SWIGV8_CURRENT_CONTEXT()).ToChecked() #define SWIGV8_INTEGER_VALUE(handle) (handle)->IntegerValue(SWIGV8_CURRENT_CONTEXT()).ToChecked() #define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue(SWIGV8_CURRENT_CONTEXT()).ToChecked() #define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(v8::Isolate::GetCurrent(), buffer, len) #define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length(v8::Isolate::GetCurrent()) #endif /* --------------------------------------------------------------------------- * Error handling * * ---------------------------------------------------------------------------*/ #define SWIG_Error(code, msg) SWIGV8_ErrorHandler.error(code, msg) #define SWIG_exception(code, msg) do { SWIGV8_ErrorHandler.error(code, msg); SWIG_fail; } while (0) #define SWIG_fail goto fail #define SWIGV8_OVERLOAD false SWIGINTERN void SWIG_V8_Raise(const char *msg) { SWIGV8_THROW_EXCEPTION(v8::Exception::Error(SWIGV8_STRING_NEW(msg))); } /* Note: There are two contexts for handling errors. A static V8ErrorHandler is used in not overloaded methods. For overloaded methods the throwing type checking mechanism is used during dispatching. As V8 exceptions can not be reset properly the trick is to use a dynamic ErrorHandler with same local name as the global one. - See definition of SWIG_Error above. - See code templates 'JS_function_dispatcher', 'JS_functionwrapper_overload', and 'JS_function_dispatch_case' in javascriptcode.swg */ class V8ErrorHandler { public: virtual ~V8ErrorHandler() {} virtual void error(int code, const char *msg) { SWIG_V8_Raise(msg); } }; // this is used in usually SWIGRUNTIME V8ErrorHandler SWIGV8_ErrorHandler; // instances of this are used in overloaded functions class OverloadErrorHandler: public V8ErrorHandler { public: virtual void error(int code, const char *msg) { err = v8::Exception::Error(SWIGV8_STRING_NEW(msg)); if(code != SWIG_TypeError) { SWIGV8_THROW_EXCEPTION(err); } } v8::Handle err; }; /* --------------------------------------------------------------------------- * Basic Proxy object * * ---------------------------------------------------------------------------*/ // Note: to trigger the v8 gc more often one can tell v8 about the memory consumption // TODO: we could add a v8 specific parameter to control this value #define SWIGV8_AVG_OBJ_SIZE 1000 class SWIGV8_Proxy { public: SWIGV8_Proxy(): swigCMemOwn(false), swigCObject(0), info(0) { SWIGV8_ADJUST_MEMORY(SWIGV8_AVG_OBJ_SIZE); }; ~SWIGV8_Proxy() { #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) handle.ClearWeak(); handle.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) handle.ClearWeak(v8::Isolate::GetCurrent()); handle.Dispose(v8::Isolate::GetCurrent()); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) handle.ClearWeak(); handle.Dispose(); #else handle.ClearWeak(); handle.Reset(); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) handle.Clear(); #endif SWIGV8_ADJUST_MEMORY(-SWIGV8_AVG_OBJ_SIZE); } bool swigCMemOwn; void *swigCObject; swig_type_info *info; v8::Persistent handle; }; class SWIGV8_ClientData { public: v8::Persistent class_templ; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) void (*dtor) (v8::Persistent< v8::Value> object, void *parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) void (*dtor) (v8::Isolate *isolate, v8::Persistent< v8::Value> object, void *parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) void (*dtor) (v8::Isolate *isolate, v8::Persistent< v8::Object > *object, SWIGV8_Proxy *proxy); #elif (V8_MAJOR_VERSION-0) < 5 void (*dtor) (const v8::WeakCallbackData &data); #else void (*dtor) (const v8::WeakCallbackInfo &data); #endif }; SWIGRUNTIME v8::Persistent SWIGV8_SWIGTYPE_Proxy_class_templ; SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(v8::Handle objRef, void **ptr, swig_type_info *info, int flags) { SWIGV8_HANDLESCOPE(); if(objRef->InternalFieldCount() < 1) return SWIG_ERROR; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) v8::Handle cdataRef = objRef->GetInternalField(0); SWIGV8_Proxy *cdata = static_cast(v8::External::Unwrap(cdataRef)); #else SWIGV8_Proxy *cdata = static_cast(objRef->GetAlignedPointerFromInternalField(0)); #endif if(cdata == NULL) { return SWIG_ERROR; } if(cdata->info != info) { swig_cast_info *tc = SWIG_TypeCheckStruct(cdata->info, info); if (!tc && cdata->info->name) { tc = SWIG_TypeCheck(cdata->info->name, info); } bool type_valid = tc != 0; if(!type_valid) { return SWIG_TypeError; } } *ptr = cdata->swigCObject; if(flags & SWIG_POINTER_DISOWN) { cdata->swigCMemOwn = false; } return SWIG_OK; } #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(v8::Persistent< v8::Value > object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(v8::Isolate *, v8::Persistent< v8::Value > object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(v8::Isolate *, v8::Persistent< v8::Object > *object, SWIGV8_Proxy *proxy) { #elif (V8_MAJOR_VERSION-0) < 5 SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(const v8::WeakCallbackData &data) { SWIGV8_Proxy *proxy = data.GetParameter(); #else SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(const v8::WeakCallbackInfo &data) { SWIGV8_Proxy *proxy = data.GetParameter(); #endif delete proxy; } SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle valRef, void **ptr) { if(!valRef->IsObject()) { return SWIG_TypeError; } v8::Handle objRef = SWIGV8_TO_OBJECT(valRef); if(objRef->InternalFieldCount() < 1) return SWIG_ERROR; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) v8::Handle cdataRef = objRef->GetInternalField(0); SWIGV8_Proxy *cdata = static_cast(v8::External::Unwrap(cdataRef)); #else SWIGV8_Proxy *cdata = static_cast(objRef->GetAlignedPointerFromInternalField(0)); #endif if(cdata == NULL) { return SWIG_ERROR; } *ptr = cdata->swigCObject; return SWIG_OK; } SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle obj, void *ptr, swig_type_info *info, int flags) { SWIGV8_Proxy *cdata = new SWIGV8_Proxy(); cdata->swigCObject = ptr; cdata->swigCMemOwn = (flags & SWIG_POINTER_OWN) ? 1 : 0; cdata->info = info; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) obj->SetPointerInInternalField(0, cdata); #else obj->SetAlignedPointerInInternalField(0, cdata); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle = v8::Persistent::New(obj); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) cdata->handle = v8::Persistent::New(v8::Isolate::GetCurrent(), obj); #else cdata->handle.Reset(v8::Isolate::GetCurrent(), obj); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) // clientdata must be set for owned data as we need to register the dtor if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.MakeWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor); } else { cdata->handle.MakeWeak(cdata, SWIGV8_Proxy_DefaultDtor); } #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031918) if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.MakeWeak(v8::Isolate::GetCurrent(), cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor); } else { cdata->handle.MakeWeak(v8::Isolate::GetCurrent(), cdata, SWIGV8_Proxy_DefaultDtor); } #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.MakeWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor); } else { cdata->handle.MakeWeak(cdata, SWIGV8_Proxy_DefaultDtor); } #elif (V8_MAJOR_VERSION-0) < 5 if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.SetWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor); } else { cdata->handle.SetWeak(cdata, SWIGV8_Proxy_DefaultDtor); } #else if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.SetWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor, v8::WeakCallbackType::kParameter); } else { cdata->handle.SetWeak(cdata, SWIGV8_Proxy_DefaultDtor, v8::WeakCallbackType::kParameter); } #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle.MarkIndependent(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) cdata->handle.MarkIndependent(v8::Isolate::GetCurrent()); #else cdata->handle.MarkIndependent(); #endif } SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle valRef, void **ptr, swig_type_info *info, int flags) { SWIGV8_HANDLESCOPE(); /* special case: JavaScript null => C NULL pointer */ if(valRef->IsNull()) { *ptr=0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } if(!valRef->IsObject()) { return SWIG_TypeError; } v8::Handle objRef = SWIGV8_TO_OBJECT(valRef); return SWIG_V8_ConvertInstancePtr(objRef, ptr, info, flags); } SWIGRUNTIME v8::Handle SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) { SWIGV8_HANDLESCOPE_ESC(); v8::Handle class_templ; if (ptr == NULL) { #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) SWIGV8_ESCAPE(SWIGV8_NULL()); #else v8::Local result = SWIGV8_NULL(); SWIGV8_ESCAPE(result); #endif } #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) if(info->clientdata != 0) { class_templ = ((SWIGV8_ClientData*) info->clientdata)->class_templ; } else { class_templ = SWIGV8_SWIGTYPE_Proxy_class_templ; } #else v8::Isolate *isolate = v8::Isolate::GetCurrent(); if(info->clientdata != 0) { class_templ = v8::Local::New(isolate, ((SWIGV8_ClientData*) info->clientdata)->class_templ); } else { class_templ = v8::Local::New(isolate, SWIGV8_SWIGTYPE_Proxy_class_templ); } #endif // v8::Handle result = class_templ->InstanceTemplate()->NewInstance(); v8::Local result = class_templ->InstanceTemplate()->NewInstance(); SWIGV8_SetPrivateData(result, ptr, info, flags); SWIGV8_ESCAPE(result); } #define SWIG_ConvertPtr(obj, ptr, info, flags) SWIG_V8_ConvertPtr(obj, ptr, info, flags) #define SWIG_NewPointerObj(ptr, info, flags) SWIG_V8_NewPointerObj(ptr, info, flags) #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_V8_ConvertInstancePtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(thisvalue, type, flags) SWIG_V8_NewPointerObj(thisvalue, type, flags) #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_V8_ConvertPtr(obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_V8_NewPointerObj(ptr, type, 0) #define SWIG_GetInstancePtr(obj, ptr) SWIG_V8_GetInstancePtr(obj, ptr) SWIGRUNTIME SwigV8ReturnValue _SWIGV8_wrap_equals(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; void *arg1 = (void *) 0 ; void *arg2 = (void *) 0 ; bool result; int res1; int res2; if(args.Length() != 1) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for equals."); res1 = SWIG_GetInstancePtr(args.Holder(), &arg1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ERROR, "Could not get pointer from 'this' object for equals."); } res2 = SWIG_GetInstancePtr(args[0], &arg2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "equals" "', argument " "1"" of type '" "void *""'"); } result = (bool)(arg1 == arg2); jsresult = SWIGV8_BOOLEAN_NEW(result); SWIGV8_RETURN(jsresult); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } SWIGRUNTIME SwigV8ReturnValue _wrap_getCPtr(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; void *arg1 = (void *) 0 ; long result; int res1; res1 = SWIG_GetInstancePtr(args.Holder(), &arg1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "getCPtr" "', argument " "1"" of type '" "void *""'"); } result = (long)arg1; jsresult = SWIGV8_NUMBER_NEW(result); SWIGV8_RETURN(jsresult); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } /* --------------------------------------------------------------------------- * PackedData object * * ---------------------------------------------------------------------------*/ class SwigV8PackedData { public: SwigV8PackedData(void *data, size_t size, swig_type_info *type): data(data), size(size), type(type) {}; ~SwigV8PackedData() { }; void *data; size_t size; swig_type_info *type; v8::Persistent handle; }; SWIGRUNTIMEINLINE int SwigV8Packed_Check(v8::Handle valRef) { SWIGV8_HANDLESCOPE(); v8::Handle objRef = SWIGV8_TO_OBJECT(valRef); if(objRef->InternalFieldCount() < 1) return false; #if (V8_MAJOR_VERSION-0) < 5 v8::Handle flag = objRef->GetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__")); #else v8::Local privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), SWIGV8_STRING_NEW("__swig__packed_data__")); v8::Local flag; if (!objRef->GetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey).ToLocal(&flag)) return false; #endif return (flag->IsBoolean() && SWIGV8_BOOLEAN_VALUE(flag)); } SWIGRUNTIME swig_type_info *SwigV8Packed_UnpackData(v8::Handle valRef, void *ptr, size_t size) { if (SwigV8Packed_Check(valRef)) { SWIGV8_HANDLESCOPE(); SwigV8PackedData *sobj; v8::Handle objRef = SWIGV8_TO_OBJECT(valRef); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) v8::Handle cdataRef = objRef->GetInternalField(0); sobj = static_cast(v8::External::Unwrap(cdataRef)); #else sobj = static_cast(objRef->GetAlignedPointerFromInternalField(0)); #endif if (sobj == NULL || sobj->size != size) return 0; memcpy(ptr, sobj->data, size); return sobj->type; } else { return 0; } } SWIGRUNTIME int SWIGV8_ConvertPacked(v8::Handle valRef, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigV8Packed_UnpackData(valRef, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) SWIGRUNTIME void _wrap_SwigV8PackedData_delete(v8::Persistent< v8::Value > object, void *parameter) { SwigV8PackedData *cdata = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) SWIGRUNTIME void _wrap_SwigV8PackedData_delete(v8::Isolate *isolate, v8::Persistent object, void *parameter) { SwigV8PackedData *cdata = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) SWIGRUNTIME void _wrap_SwigV8PackedData_delete(v8::Isolate *isolate, v8::Persistent *object, SwigV8PackedData *cdata) { #elif (V8_MAJOR_VERSION-0) < 5 SWIGRUNTIME void _wrap_SwigV8PackedData_delete(const v8::WeakCallbackData &data) { v8::Local object = data.GetValue(); SwigV8PackedData *cdata = data.GetParameter(); #else SWIGRUNTIME void _wrap_SwigV8PackedData_delete(const v8::WeakCallbackInfo &data) { SwigV8PackedData *cdata = data.GetParameter(); #endif delete cdata; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) object.Clear(); object.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) object.Clear(); object.Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) object->Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) object->Dispose(); #elif (V8_MAJOR_VERSION-0) < 5 object.Clear(); #endif } SWIGRUNTIME v8::Handle SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) { SWIGV8_HANDLESCOPE_ESC(); SwigV8PackedData *cdata = new SwigV8PackedData(data, size, type); // v8::Handle obj = SWIGV8_OBJECT_NEW(); v8::Local obj = SWIGV8_OBJECT_NEW(); #if (V8_MAJOR_VERSION-0) < 5 obj->SetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__"), SWIGV8_BOOLEAN_NEW(true)); #else v8::Local privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), SWIGV8_STRING_NEW("__swig__packed_data__")); obj->SetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey, SWIGV8_BOOLEAN_NEW(true)); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) obj->SetPointerInInternalField(0, cdata); #else obj->SetAlignedPointerInInternalField(0, cdata); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle = v8::Persistent::New(obj); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) cdata->handle = v8::Persistent::New(v8::Isolate::GetCurrent(), obj); #else cdata->handle.Reset(v8::Isolate::GetCurrent(), obj); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle.MakeWeak(cdata, _wrap_SwigV8PackedData_delete); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031918) cdata->handle.MakeWeak(v8::Isolate::GetCurrent(), cdata, _wrap_SwigV8PackedData_delete); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) cdata->handle.MakeWeak(cdata, _wrap_SwigV8PackedData_delete); #elif (V8_MAJOR_VERSION-0) < 5 cdata->handle.SetWeak(cdata, _wrap_SwigV8PackedData_delete); // v8::V8::SetWeak(&cdata->handle, cdata, _wrap_SwigV8PackedData_delete); #else cdata->handle.SetWeak(cdata, _wrap_SwigV8PackedData_delete, v8::WeakCallbackType::kParameter); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle.MarkIndependent(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) cdata->handle.MarkIndependent(v8::Isolate::GetCurrent()); #else cdata->handle.MarkIndependent(); #endif SWIGV8_ESCAPE(obj); } #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIGV8_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIGV8_NewPackedObj(ptr, sz, type) /* --------------------------------------------------------------------------- * Support for IN/OUTPUT typemaps (see Lib/typemaps/inoutlist.swg) * * ---------------------------------------------------------------------------*/ SWIGRUNTIME #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) v8::Handle SWIGV8_AppendOutput(v8::Handle result, v8::Handle obj) { #else v8::Handle SWIGV8_AppendOutput(v8::Local result, v8::Handle obj) { #endif SWIGV8_HANDLESCOPE_ESC(); if (result->IsUndefined()) { result = SWIGV8_ARRAY_NEW(); } #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) v8::Handle arr = v8::Handle::Cast(result); #else v8::Local arr = v8::Local::Cast(result); #endif arr->Set(arr->Length(), obj); SWIGV8_ESCAPE(arr); } swig-4.0.2/Lib/javascript/v8/std_vector.i0000644000175000017500000000574713667507523020136 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %include %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef bool value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef bool const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i self = args.Holder(); $jslocals if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode SWIGV8_SetPrivateData(self, result, SWIGTYPE_$jsmangledtype, SWIG_POINTER_OWN); SWIGV8_RETURN(self); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_veto_ctor: a vetoing ctor for abstract classes * - $jswrapper: name of wrapper * - $jsname: class name * ----------------------------------------------------------------------------- */ %fragment ("js_veto_ctor", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); SWIG_exception(SWIG_ERROR, "Class $jsname can not be instantiated"); fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_ctor_dispatcher: dispatcher for overloaded constructors * - $jswrapper: name of wrapper * - $jsname: class name * - $jsdispatchcases: part containing code for dispatching * ----------------------------------------------------------------------------- */ %fragment ("js_ctor_dispatcher", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); OverloadErrorHandler errorHandler; v8::Handle self; // switch all cases by means of series of if-returns. $jsdispatchcases // default: SWIG_exception_fail(SWIG_ERROR, "Illegal arguments for construction of $jsmangledname"); fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_overloaded_ctor: template for wrapping a ctor. * - $jswrapper: wrapper of called ctor * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * - $jsargcount: number of arguments * - $jsmangledtype: mangled type of class * ----------------------------------------------------------------------------- */ %fragment("js_overloaded_ctor", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler &SWIGV8_ErrorHandler) { SWIGV8_HANDLESCOPE(); v8::Handle self = args.Holder(); $jslocals if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode SWIGV8_SetPrivateData(self, result, SWIGTYPE_$jsmangledtype, SWIG_POINTER_OWN); SWIGV8_RETURN(self); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_ctor_dispatch_case: template for a dispatch case for calling an overloaded ctor. * - $jsargcount: number of arguments of called ctor * - $jswrapper: wrapper of called ctor * * Note: a try-catch-like mechanism is used to switch cases * ----------------------------------------------------------------------------- */ %fragment ("js_ctor_dispatch_case", "templates") %{ if(args.Length() == $jsargcount) { errorHandler.err.Clear(); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) self = $jswrapper(args, errorHandler); if(errorHandler.err.IsEmpty()) { SWIGV8_ESCAPE(self); } #else $jswrapper(args, errorHandler); if(errorHandler.err.IsEmpty()) { return; } #endif } %} /* ----------------------------------------------------------------------------- * js_dtor: template for a destructor wrapper * - $jsmangledname: mangled class name * - $jstype: class type * ----------------------------------------------------------------------------- */ %fragment ("js_dtor", "templates") %{ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) static void $jswrapper(v8::Persistent< v8::Value > object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) static void $jswrapper(v8::Isolate *isolate, v8::Persistent object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) static void $jswrapper(v8::Isolate *isolate, v8::Persistent *object, SWIGV8_Proxy *proxy) { #elif (V8_MAJOR_VERSION-0) < 5 static void $jswrapper(const v8::WeakCallbackData &data) { v8::Local object = data.GetValue(); SWIGV8_Proxy *proxy = data.GetParameter(); #else static void $jswrapper(const v8::WeakCallbackInfo &data) { SWIGV8_Proxy *proxy = data.GetParameter(); #endif if(proxy->swigCMemOwn && proxy->swigCObject) { #ifdef SWIGRUNTIME_DEBUG printf("Deleting wrapped instance: %s\n", proxy->info->name); #endif $jsfree proxy->swigCObject; } delete proxy; #if (V8_MAJOR_VERSION-0) < 5 object.Clear(); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) object.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) object.Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) object->Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 5 object->Dispose(); #endif } %} /* ----------------------------------------------------------------------------- * js_dtoroverride: template for a destructor wrapper * - $jsmangledname: mangled class name * - $jstype: class type * - ${destructor_action}: The custom destructor action to invoke. * ----------------------------------------------------------------------------- */ %fragment ("js_dtoroverride", "templates") %{ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) static void $jswrapper(v8::Persistent object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) static void $jswrapper(v8::Isolate *isolate, v8::Persistent object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) static void $jswrapper(v8::Isolate *isolate, v8::Persistent< v8::Object> *object, SWIGV8_Proxy *proxy) { #elif (V8_MAJOR_VERSION-0) < 5 static void $jswrapper(const v8::WeakCallbackData &data) { v8::Local object = data.GetValue(); SWIGV8_Proxy *proxy = data.GetParameter(); #else static void $jswrapper(const v8::WeakCallbackInfo &data) { SWIGV8_Proxy *proxy = data.GetParameter(); #endif if(proxy->swigCMemOwn && proxy->swigCObject) { $jstype arg1 = ($jstype)proxy->swigCObject; ${destructor_action} } delete proxy; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) object.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) object.Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) object->Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) object->Dispose(); #elif (V8_MAJOR_VERSION-0) < 5 object.Clear(); #endif } %} /* ----------------------------------------------------------------------------- * js_getter: template for getter function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment("js_getter", "templates") %{ #if (V8_MAJOR_VERSION-0) < 5 static SwigV8ReturnValue $jswrapper(v8::Local property, const SwigV8PropertyCallbackInfo &info) { #else static SwigV8ReturnValue $jswrapper(v8::Local property, const SwigV8PropertyCallbackInfo &info) { #endif SWIGV8_HANDLESCOPE(); v8::Handle jsresult; $jslocals $jscode SWIGV8_RETURN_INFO(jsresult, info); goto fail; fail: SWIGV8_RETURN_INFO(SWIGV8_UNDEFINED(), info); } %} /* ----------------------------------------------------------------------------- * js_setter: template for setter function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment("js_setter", "templates") %{ #if (V8_MAJOR_VERSION-0) < 5 static void $jswrapper(v8::Local property, v8::Local value, const SwigV8PropertyCallbackInfoVoid &info) { #else static void $jswrapper(v8::Local property, v8::Local value, const SwigV8PropertyCallbackInfoVoid &info) { #endif SWIGV8_HANDLESCOPE(); $jslocals $jscode goto fail; fail: return; } %} /* ----------------------------------------------------------------------------- * js_function: template for function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment("js_function", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; $jslocals if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode SWIGV8_RETURN(jsresult); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_function_dispatcher: template for a function dispatcher for overloaded functions * - $jswrapper: wrapper function name * - $jsname: name of the wrapped function * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment("js_function_dispatcher", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; OverloadErrorHandler errorHandler; $jscode SWIG_exception_fail(SWIG_ERROR, "Illegal arguments for function $jsname."); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_overloaded_function: template for a overloaded function * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_overloaded_function", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler &SWIGV8_ErrorHandler) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; $jslocals $jscode SWIGV8_RETURN(jsresult); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_function_dispatch_case: template for a case used in the function dispatcher * - $jswrapper: wrapper function name * - $jsargcount: number of arguments of overloaded function * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_function_dispatch_case", "templates") %{ if(args.Length() == $jsargcount) { errorHandler.err.Clear(); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) jsresult = $jswrapper(args, errorHandler); if(errorHandler.err.IsEmpty()) { SWIGV8_ESCAPE(jsresult); } #else $jswrapper(args, errorHandler); if(errorHandler.err.IsEmpty()) { return; } #endif } %} /* ----------------------------------------------------------------------------- * jsv8_declare_class_template: template for a class template declaration. * - $jsmangledname: mangled class name * ----------------------------------------------------------------------------- */ %fragment("jsv8_declare_class_template", "templates") %{ SWIGV8_ClientData $jsmangledname_clientData; %} /* ----------------------------------------------------------------------------- * jsv8_define_class_template: template for a class template definition. * - $jsmangledname: mangled class name * - $jsmangledtype: mangled class type * - $jsdtor: the dtor wrapper * ----------------------------------------------------------------------------- */ %fragment("jsv8_define_class_template", "templates") %{ /* Name: $jsmangledname, Type: $jsmangledtype, Dtor: $jsdtor */ v8::Handle $jsmangledname_class = SWIGV8_CreateClassTemplate("$jsmangledname"); SWIGV8_SET_CLASS_TEMPL($jsmangledname_clientData.class_templ, $jsmangledname_class); $jsmangledname_clientData.dtor = $jsdtor; if (SWIGTYPE_$jsmangledtype->clientdata == 0) { SWIGTYPE_$jsmangledtype->clientdata = &$jsmangledname_clientData; } %} /* ----------------------------------------------------------------------------- * jsv8_inherit: template for an class inherit statement. * - $jsmangledname: mangled class name * - $jsbaseclass: mangled name of the base class * ----------------------------------------------------------------------------- */ %fragment("jsv8_inherit", "templates") %{ if (SWIGTYPE_p$jsbaseclass->clientdata && !(static_cast(SWIGTYPE_p$jsbaseclass->clientdata)->class_templ.IsEmpty())) { #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) $jsmangledname_class->Inherit(static_cast(SWIGTYPE_p$jsbaseclass->clientdata)->class_templ); #else $jsmangledname_class->Inherit( v8::Local::New( v8::Isolate::GetCurrent(), static_cast(SWIGTYPE_p$jsbaseclass->clientdata)->class_templ) ); #endif #ifdef SWIGRUNTIME_DEBUG printf("Inheritance successful $jsmangledname $jsbaseclass\n"); #endif } else { #ifdef SWIGRUNTIME_DEBUG printf("Unable to inherit baseclass, it didn't exist $jsmangledname $jsbaseclass\n"); #endif } %} /* ----------------------------------------------------------------------------- * jsv8_create_class_instance: template for creating an class object. * - $jsname: class name * - $jsmangledname: mangled class name * ----------------------------------------------------------------------------- */ %fragment("jsv8_create_class_instance", "templates") %{ /* Class: $jsname ($jsmangledname) */ v8::Handle $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname"); $jsmangledname_class_0->SetCallHandler($jsctor); $jsmangledname_class_0->Inherit($jsmangledname_class); $jsmangledname_class_0->SetHiddenPrototype(true); v8::Handle $jsmangledname_obj = $jsmangledname_class_0->GetFunction(); %} /* ----------------------------------------------------------------------------- * jsv8_register_class: template for a statement that registers a class in a parent namespace. * - $jsname: class name * - $jsmangledname: mangled class name * - $jsparent: mangled name of parent namespace * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_class", "templates") %{ $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj); %} /* ----------------------------------------------------------------------------- * jsv8_create_namespace: template for a statement that creates a namespace object. * - $jsmangledname: mangled namespace name * ----------------------------------------------------------------------------- */ %fragment("jsv8_create_namespace", "templates") %{ v8::Handle $jsmangledname_obj = SWIGV8_OBJECT_NEW(); %} /* ----------------------------------------------------------------------------- * jsv8_register_namespace: template for a statement that registers a namespace in a parent namespace. * - $jsname: name of namespace * - $jsmangledname: mangled name of namespace * - $jsparent: mangled name of parent namespace * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_namespace", "templates") %{ $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj); %} /* ----------------------------------------------------------------------------- * jsv8_register_member_function: template for a statement that registers a member function. * - $jsmangledname: mangled class name * - $jsname: name of the function * - $jswrapper: wrapper of the member function * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_member_function", "templates") %{ SWIGV8_AddMemberFunction($jsmangledname_class, "$jsname", $jswrapper); %} /* ----------------------------------------------------------------------------- * jsv8_register_member_variable: template for a statement that registers a member variable. * - $jsmangledname: mangled class name * - $jsname: name of the function * - $jsgetter: wrapper of the getter function * - $jssetter: wrapper of the setter function * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_member_variable", "templates") %{ SWIGV8_AddMemberVariable($jsmangledname_class, "$jsname", $jsgetter, $jssetter); %} /* ----------------------------------------------------------------------------- * jsv8_register_static_function: template for a statement that registers a static class function. * - $jsname: function name * - $jswrapper: wrapper of the function * - $jsparent: mangled name of parent namespace * * Note: this template is also used for global functions. * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_static_function", "templates") %{ SWIGV8_AddStaticFunction($jsparent_obj, "$jsname", $jswrapper); %} /* ----------------------------------------------------------------------------- * jsv8_register_static_variable: template for a statement that registers a static variable. * - $jsname: variable name * - $jsparent: mangled name of parent namespace * - $jsgetter: wrapper of the getter function * - $jssetter: wrapper of the setter function * * Note: this template is also used for global variables. * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_static_variable", "templates") %{ SWIGV8_AddStaticVariable($jsparent_obj, "$jsname", $jsgetter, $jssetter); %} swig-4.0.2/Lib/javascript/v8/javascriptkw.swg0000644000175000017500000000176713667507523021040 0ustar williamwilliam#ifndef JAVASCRIPT_JAVASCRIPTKW_SWG_ #define JAVASCRIPT_JAVASCRIPTKW_SWG_ /* Warnings for Java keywords */ #define JAVASCRIPTKW(x) %keywordwarn("'" `x` "' is a javascript keyword, renaming to '_"`x`"'",rename="_%s") `x` /* Taken from https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Reserved_Words */ JAVASCRIPTKW(break); JAVASCRIPTKW(case); JAVASCRIPTKW(catch); JAVASCRIPTKW(continue); JAVASCRIPTKW(default); JAVASCRIPTKW(delete); JAVASCRIPTKW(do); JAVASCRIPTKW(else); JAVASCRIPTKW(finally); JAVASCRIPTKW(for); JAVASCRIPTKW(function); JAVASCRIPTKW(if); JAVASCRIPTKW(in); JAVASCRIPTKW(instanceof); JAVASCRIPTKW(new); JAVASCRIPTKW(return); JAVASCRIPTKW(switch); JAVASCRIPTKW(this); JAVASCRIPTKW(throw); JAVASCRIPTKW(try); JAVASCRIPTKW(typeof); JAVASCRIPTKW(var); JAVASCRIPTKW(void); JAVASCRIPTKW(while); JAVASCRIPTKW(with); /* others bad names if any*/ // for example %namewarn("321:clone() is a javascript bad method name") *::clone(); #undef JAVASCRIPTKW #endif //JAVASCRIPT_JAVASCRIPTKW_SWG_ swig-4.0.2/Lib/javascript/v8/ccomplex.i0000644000175000017500000000140213667507523017554 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ccomplex.i * * C complex typemaps * ISO C99: 7.3 Complex arithmetic * ----------------------------------------------------------------------------- */ %include %{ #include %} /* C complex constructor */ #define CCplxConst(r, i) ((r) + I*(i)) %swig_cplxflt_convn(float complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(double complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(complex, CCplxConst, creal, cimag); /* declaring the typemaps */ %typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, complex); swig-4.0.2/Lib/javascript/v8/javascripttypemaps.swg0000644000175000017500000000244313667507523022251 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Javascript * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* Include fundamental fragemt definitions */ %include /* Look for user fragments file. */ %include /* Javascript fragments for fundamental types */ %include /* Javascript fragments for char* strings */ %include /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* Javascript types */ #define SWIG_Object v8::Handle #define VOID_Object SWIGV8_UNDEFINED() /* Overload of the output/constant/exception/dirout handling */ /* append output */ #define SWIG_AppendOutput(result, obj) SWIGV8_AppendOutput(result, obj) /* set constant */ #define SWIG_SetConstant(name, obj) /* raise */ #define SWIG_Raise(obj, type, desc) SWIG_V8_Raise(type) /* Include the unified typemap library */ %include swig-4.0.2/Lib/javascript/v8/std_common.i0000644000175000017500000000014613667507523020110 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.2/Lib/javascript/v8/std_except.i0000644000175000017500000000004313667507523020104 0ustar williamwilliam%include swig-4.0.2/Lib/javascript/v8/complex.i0000644000175000017500000000012013667507523017405 0ustar williamwilliam#ifdef __cplusplus %include #else %include #endif swig-4.0.2/Lib/javascript/v8/typemaps.i0000644000175000017500000001047613667507523017617 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * These mappings provide support for input/output arguments and common * uses for C/C++ pointers. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Python tuple. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Python output of the function would be a tuple containing both output values. */ // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Python tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Python). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Python variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %include swig-4.0.2/Lib/javascript/v8/javascriptstrings.swg0000644000175000017500000000336313667507523022102 0ustar williamwilliam /* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize", "header", fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize, int *alloc) { if(valRef->IsString()) { v8::Handle js_str = SWIGV8_TO_STRING(valRef); size_t len = SWIGV8_UTF8_LENGTH(js_str) + 1; char* cstr = new char[len]; SWIGV8_WRITE_UTF8(js_str, cstr, len); if(alloc) *alloc = SWIG_NEWOBJ; if(psize) *psize = len; if(cptr) *cptr = cstr; return SWIG_OK; } else { if(valRef->IsObject()) { v8::Handle obj = SWIGV8_TO_OBJECT(valRef); // try if the object is a wrapped char[] swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } return SWIG_TypeError; } else { return SWIG_TypeError; } } } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE v8::Handle SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { // TODO: handle extra long strings return SWIGV8_UNDEFINED(); } else { v8::Handle js_str = SWIGV8_STRING_NEW2(carray, size); return js_str; } } else { return SWIGV8_UNDEFINED(); } } } swig-4.0.2/Lib/javascript/v8/javascriptinit.swg0000644000175000017500000001015413667507523021350 0ustar williamwilliam%insert(header) %{ #include %} %insert(init) %{ SWIGRUNTIME void SWIG_V8_SetModule(void *, swig_module_info *swig_module) { v8::Local global_obj = SWIGV8_CURRENT_CONTEXT()->Global(); v8::Local mod = SWIGV8_EXTERNAL_NEW(swig_module); assert(!mod.IsEmpty()); #if (V8_MAJOR_VERSION-0) < 5 global_obj->SetHiddenValue(SWIGV8_STRING_NEW("swig_module_info_data"), mod); #else v8::Local privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), SWIGV8_STRING_NEW("swig_module_info_data")); global_obj->SetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey, mod); #endif } SWIGRUNTIME swig_module_info * SWIG_V8_GetModule(void *) { v8::Local global_obj = SWIGV8_CURRENT_CONTEXT()->Global(); #if (V8_MAJOR_VERSION-0) < 5 v8::Local moduleinfo = global_obj->GetHiddenValue(SWIGV8_STRING_NEW("swig_module_info_data")); #else v8::Local privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), SWIGV8_STRING_NEW("swig_module_info_data")); v8::Local moduleinfo; if (!global_obj->GetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey).ToLocal(&moduleinfo)) return 0; #endif if (moduleinfo.IsEmpty() || moduleinfo->IsNull() || moduleinfo->IsUndefined()) { // It's not yet loaded return 0; } v8::Local moduleinfo_extern = v8::Local::Cast(moduleinfo); if (moduleinfo_extern.IsEmpty() || moduleinfo_extern->IsNull() || moduleinfo_extern->IsUndefined()) { // Something's not right return 0; } void *ptr = moduleinfo_extern->Value(); assert(ptr); swig_module_info *retptr = static_cast(ptr); assert(retptr); return retptr; } #define SWIG_GetModule(clientdata) SWIG_V8_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_V8_SetModule(clientdata, pointer) %} %insert(init) "swiginit.swg" // Open the initializer function definition here %fragment ("js_initializer_define", "templates") %{ #define SWIGV8_INIT $jsname_initialize %} %insert(init) %{ // Note: 'extern "C"'' disables name mangling which makes it easier to load the symbol manually // TODO: is it ok to do that? extern "C" #if (NODE_MODULE_VERSION < 0x000C) void SWIGV8_INIT (v8::Handle exports) #else void SWIGV8_INIT (v8::Handle exports, v8::Handle /*module*/) #endif { SWIG_InitializeModule(static_cast(&exports)); SWIGV8_HANDLESCOPE(); v8::Handle exports_obj = exports; %} /* ----------------------------------------------------------------------------- * js_initializer: template for the module initializer function * - $jsname: module name * - $jsv8nspaces: part with code creating namespace objects * - $jsv8classtemplates: part with code creating class templates * - $jsv8wrappers: part with code that registers wrapper functions * - $jsv8inheritance: part with inherit statements * - $jsv8classinstances: part with code creating class objects * - $jsv8staticwrappers: part with code adding static functions to class objects * - $jsv8registerclasses: part with code that registers class objects in namespaces * - $jsv8registernspaces: part with code that registers namespaces in parent namespaces * ----------------------------------------------------------------------------- */ %fragment("js_initializer", "templates") %{ // a class template for creating proxies of undefined types SWIGV8_SET_CLASS_TEMPL(SWIGV8_SWIGTYPE_Proxy_class_templ, SWIGV8_CreateClassTemplate("SwigProxy")); /* create objects for namespaces */ $jsv8nspaces /* create class templates */ $jsv8classtemplates /* register wrapper functions */ $jsv8wrappers /* setup inheritances */ $jsv8inheritance /* class instances */ $jsv8classinstances /* add static class functions and variables */ $jsv8staticwrappers /* register classes */ $jsv8registerclasses /* create and register namespace objects */ $jsv8registernspaces } #if defined(BUILDING_NODE_EXTENSION) NODE_MODULE($jsname, $jsname_initialize) #endif %} swig-4.0.2/Lib/javascript/v8/std_pair.i0000644000175000017500000000135613667507523017557 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.2/Lib/javascript/v8/stl.i0000644000175000017500000000044313667507523016550 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/javascript/v8/exception.i0000644000175000017500000000004213667507523017737 0ustar williamwilliam%include swig-4.0.2/Lib/javascript/v8/javascriptfragments.swg0000644000175000017500000000105713667507523022375 0ustar williamwilliam/* Create a file with this name, 'javascriptfragments.swg', in your working directory and add all the %fragments you want to take precedence over the default ones defined by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(PyObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-4.0.2/Lib/javascript/v8/cdata.i0000644000175000017500000000003613667507523017020 0ustar williamwilliam%include swig-4.0.2/Lib/javascript/v8/javascriptcomplex.swg0000644000175000017500000000637713667507523022070 0ustar williamwilliam/* Defines the As/From converters for double/float complex, you need to provide complex Type, the Name you want to use in the converters, the complex Constructor method, and the Real and Imag complex accessor methods. See the std_complex.i and ccomplex.i for concrete examples. */ /* the common from converter */ %define %swig_fromcplx_conv(Type, Real, Imag) %fragment(SWIG_From_frag(Type),"header", fragment=SWIG_From_frag(double)) { SWIGINTERNINLINE v8::Handle SWIG_From_dec(Type)(%ifcplusplus(const Type&, Type) c) { SWIGV8_HANDLESCOPE_ESC(); v8::Local vals = SWIGV8_ARRAY_NEW(); vals->Set(0, SWIG_From(double)(Real(c))); vals->Set(1, SWIG_From(double)(Imag(c))); SWIGV8_ESCAPE(vals); } } %enddef /* the double case */ %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal_dec(Type) (v8::Handle o, Type* val) { SWIGV8_HANDLESCOPE(); if (o->IsArray()) { v8::Handle array = v8::Handle::Cast(o); if(array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2]."); double re, im; int res; res = SWIG_AsVal(double)(array->Get(0), &re); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } res = SWIG_AsVal(double)(array->Get(1), &im); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } if (val) *val = Constructor(re, im); return SWIG_OK; } else if(o->IsNumber()){ double d; int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef /* the float case */ %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float)) { SWIGINTERN int SWIG_AsVal_dec(Type) (v8::Handle o, Type* val) { SWIGV8_HANDLESCOPE(); if (o->IsArray()) { v8::Handle array = v8::Handle::Cast(o); if(array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2]."); double re, im; int res; res = SWIG_AsVal(double)(array->Get(0), &re); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } res = SWIG_AsVal(double)(array->Get(1), &im); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else { return SWIG_OverflowError; } } else if(o->IsNumber()){ float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(re, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-4.0.2/Lib/javascript/v8/std_string.i0000644000175000017500000000004313667507523020122 0ustar williamwilliam%include swig-4.0.2/Lib/javascript/v8/std_map.i0000644000175000017500000000505613667507523017402 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.2/Lib/javascript/v8/arrays_javascript.i0000644000175000017500000000626313667507523021503 0ustar williamwilliam/* ----------------------------------------------------------------------------- * arrays_javascript.i * * These typemaps give more natural support for arrays. The typemaps are not efficient * as there is a lot of copying of the array values whenever the array is passed to C/C++ * from JavaScript and vice versa. The JavaScript array is expected to be the same size as the C array. * An exception is thrown if they are not. * * Example usage: * Wrapping: * * %include * %inline %{ * extern int FiddleSticks[3]; * %} * * Use from JavaScript like this: * * var fs = [10, 11, 12]; * example.FiddleSticks = fs; * fs = example.FiddleSticks; * ----------------------------------------------------------------------------- */ %fragment("SWIG_JSCGetIntProperty", "header", fragment=SWIG_AsVal_frag(int)) {} %fragment("SWIG_JSCGetNumberProperty", "header", fragment=SWIG_AsVal_frag(double)) {} %typemap(in, fragment="SWIG_JSCGetIntProperty") int[], int[ANY] (int length = 0, v8::Local array, v8::Local jsvalue, int i = 0, int res = 0, $*1_ltype temp) { if ($input->IsArray()) { // Convert into Array array = v8::Local::Cast($input); length = $1_dim0; $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array for (i = 0; i < length; i++) { jsvalue = array->Get(i); // Get primitive value from JSObject res = SWIG_AsVal(int)(jsvalue, &temp); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } } else { SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); } } %typemap(freearg) int[], int[ANY] { free($1); } %typemap(out, fragment=SWIG_From_frag(int)) int[], int[ANY] (int length = 0, int i = 0) { length = $1_dim0; v8::Local array = v8::Array::New(length); for (i = 0; i < length; i++) { array->Set(i, SWIG_From(int)($1[i])); } $result = array; } %typemap(in, fragment="SWIG_JSCGetNumberProperty") double[], double[ANY] (int length = 0, v8::Local array, v8::Local jsvalue, int i = 0, int res = 0, $*1_ltype temp) { if ($input->IsArray()) { // Convert into Array array = v8::Local::Cast($input); length = $1_dim0; $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array for (i = 0; i < length; i++) { jsvalue = array->Get(i); // Get primitive value from JSObject res = SWIG_AsVal(double)(jsvalue, &temp); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } } else { SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); } } %typemap(freearg) double[], double[ANY] { free($1); } %typemap(out, fragment=SWIG_From_frag(double)) double[], double[ANY] (int length = 0, int i = 0) { length = $1_dim0; v8::Local array = v8::Array::New(length); for (i = 0; i < length; i++) { array->Set(i, SWIG_From(double)($1[i])); } $result = array; } swig-4.0.2/Lib/javascript/jsc/0000755000175000017500000000000013667507523016015 5ustar williamwilliamswig-4.0.2/Lib/javascript/jsc/javascriptprimtypes.swg0000644000175000017500000001032413667507523022662 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE JSValueRef SWIG_From_dec(bool)(bool value) { return JSValueMakeBoolean(context, value); } } %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(JSValueRef obj, bool *val) { if(!JSValueIsBoolean(context, obj)) { return SWIG_ERROR; } if (val) *val = JSValueToBoolean(context, obj); return SWIG_OK; } } /* int */ %fragment(SWIG_From_frag(int),"header") { SWIGINTERNINLINE JSValueRef SWIG_From_dec(int)(int value) { return JSValueMakeNumber(context, value); } } /* long */ %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE JSValueRef SWIG_From_dec(long)(long value) { return JSValueMakeNumber(context, value); } } %fragment(SWIG_AsVal_frag(long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(long)(JSValueRef obj, long* val) { if (!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } if(val) *val = (long) JSValueToNumber(context, obj, NULL); return SWIG_OK; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long)) { SWIGINTERNINLINE JSValueRef SWIG_From_dec(unsigned long)(unsigned long value) { return (value > LONG_MAX) ? JSValueMakeNumber(context, value) : JSValueMakeNumber(context, %numeric_cast(value,long)); } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(JSValueRef obj, unsigned long *val) { long longVal; if(!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } longVal = (long) JSValueToNumber(context, obj, NULL); if(longVal < 0) { return SWIG_OverflowError; } if(val) *val = longVal; return SWIG_OK; } } /* long long */ // Note: these are copied from 'long' and probably need fixing %fragment(SWIG_From_frag(long long),"header", fragment=SWIG_From_frag(long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE JSValueRef SWIG_From_dec(long long)(long long value) { return JSValueMakeNumber(context, value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment=SWIG_AsVal_frag(long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(JSValueRef obj, long long* val) { if (!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } if(val) *val = (long long) JSValueToNumber(context, obj, NULL); return SWIG_OK; } %#endif } /* unsigned long long */ // Note: these are copied from 'unsigned long' and probably need fixing %fragment(SWIG_From_frag(unsigned long long),"header", fragment=SWIG_From_frag(long long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN JSValueRef SWIG_From_dec(unsigned long long)(unsigned long long value) { return (value > LONG_MAX) ? JSValueMakeNumber(context, value) : JSValueMakeNumber(context, %numeric_cast(value,long)); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment=SWIG_AsVal_frag(unsigned long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(JSValueRef obj, unsigned long long *val) { long long longVal; if(!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } longVal = (unsigned long long) JSValueToNumber(context, obj, NULL); if(longVal < 0) { return SWIG_OverflowError; } if(val) *val = longVal; return SWIG_OK; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { SWIGINTERN JSValueRef SWIG_From_dec(double) (double val) { return JSValueMakeNumber(context, val); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(JSValueRef obj, double *val) { if(!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } if(val) *val = JSValueToNumber(context, obj, NULL); return SWIG_OK; } } swig-4.0.2/Lib/javascript/jsc/std_complex.i0000644000175000017500000000114713667507523020513 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} namespace std { %naturalvar complex; template class complex; %template() complex; %template() complex; } /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-4.0.2/Lib/javascript/jsc/std_deque.i0000644000175000017500000000003413667507523020141 0ustar williamwilliam%include swig-4.0.2/Lib/javascript/jsc/javascripthelpers.swg0000644000175000017500000000451113667507523022271 0ustar williamwilliam%insert(wrapper) %{ SWIGINTERN bool JS_registerClass(JSGlobalContextRef context, JSObjectRef parentObject, const char* className, JSClassDefinition* definition) { JSStringRef js_className = JSStringCreateWithUTF8CString(className); JSObjectRef classObject = JSObjectMake(context, JSClassCreate(definition), NULL); JSObjectSetProperty(context, parentObject, js_className, classObject, kJSPropertyAttributeNone, NULL); JSStringRelease(js_className); return true; } SWIGINTERN bool JS_registerNamespace(JSGlobalContextRef context, JSObjectRef namespaceObj, JSObjectRef parentNamespace, const char* name) { JSStringRef js_name = JSStringCreateWithUTF8CString(name); JSObjectSetProperty(context, parentNamespace, js_name, namespaceObj, kJSPropertyAttributeNone, NULL); JSStringRelease(js_name); return true; } SWIGINTERN bool JS_registerFunction(JSGlobalContextRef context, JSObjectRef object, const char* functionName, JSObjectCallAsFunctionCallback callback) { JSStringRef js_functionName = JSStringCreateWithUTF8CString(functionName); JSObjectSetProperty(context, object, js_functionName, JSObjectMakeFunctionWithCallback(context, js_functionName, callback), kJSPropertyAttributeNone, NULL); JSStringRelease(js_functionName); return true; } SWIGINTERN bool JS_veto_set_variable(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef value, JSValueRef* exception) { char buffer[256]; char msg[512]; int res; JSStringGetUTF8CString(propertyName, buffer, 256); res = sprintf(msg, "Tried to write read-only variable: %s.", buffer); if(res<0) { SWIG_exception(SWIG_ERROR, "Tried to write read-only variable."); } else { SWIG_exception(SWIG_ERROR, msg); } fail: return false; } SWIGINTERN JSValueRef JS_CharPtrToJSValue(JSContextRef context, char* cstr) { JSValueRef val; JSStringRef jsstring = JSStringCreateWithUTF8CString((char*) cstr); val = JSValueMakeString(context, jsstring); JSStringRelease(jsstring); return val; } %} swig-4.0.2/Lib/javascript/jsc/javascript.swg0000644000175000017500000000066713667507523020716 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javascript.swg * * Javascript typemaps * ----------------------------------------------------------------------------- */ %include %include %include %include %include %include %include swig-4.0.2/Lib/javascript/jsc/javascriptruntime.swg0000644000175000017500000000105513667507523022312 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javascriptruntime.swg * * Javascript support code * ----------------------------------------------------------------------------- */ %insert(runtime) %{ #include #include #include #include #include #include %} %insert(runtime) "swigrun.swg"; /* SWIG API */ %insert(runtime) "swigerrors.swg"; /* SWIG errors */ %insert(runtime) "javascriptrun.swg"; /* SWIG errors */ swig-4.0.2/Lib/javascript/jsc/javascriptrun.swg0000644000175000017500000002406513667507523021441 0ustar williamwilliam/* ---------------------------------------------------------------------------- * Errors and exceptions * * ---------------------------------------------------------------------------*/ #define SWIG_Error(code, msg) SWIG_JSC_exception(context, exception, code, msg) #define SWIG_exception(code, msg) do { SWIG_JSC_exception(context, exception, code, msg); SWIG_fail; } while (0) #define SWIG_fail goto fail SWIGRUNTIME void SWIG_Javascript_Raise(JSContextRef context, JSValueRef *exception, const char* type) { JSStringRef message = JSStringCreateWithUTF8CString(type); JSValueRef error_arguments[1]; JSObjectRef exception_object; JSValueRef exception_value; exception_value = JSValueMakeString(context, message); /* Converting the result to an object will let JavascriptCore add "sourceURL" (file) and "line" (number) and "message" to the exception, instead of just returning a raw string. This is extremely important for debugging your errors. Using JSObjectMakeError is better than JSValueToObject because the latter only populates "sourceURL" and "line", but not "message" or any others I don't know about. */ error_arguments[0] = exception_value; exception_object = JSObjectMakeError(context, 1, error_arguments, NULL); /* Return the exception_object */ *exception = exception_object; JSStringRelease(message); } SWIGRUNTIME void SWIG_JSC_exception(JSContextRef context, JSValueRef *exception, int code, const char* msg) { SWIG_Javascript_Raise(context, exception, msg); } /* ---------------------------------------------------------------------------- * The parent class of all Proxies * * ---------------------------------------------------------------------------*/ typedef struct { bool swigCMemOwn; void *swigCObject; swig_type_info *info; } SwigPrivData; SWIGRUNTIME JSValueRef _wrap_SwigObject_disown(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { JSValueRef jsresult; JSObjectRef obj = JSValueToObject(context, thisObject, NULL); SwigPrivData *cdata = (SwigPrivData *) JSObjectGetPrivate(obj); cdata->swigCMemOwn = false; jsresult = JSValueMakeUndefined(context); return jsresult; } SWIGRUNTIME JSValueRef _wrap_SwigObject_getCPtr(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { JSValueRef jsresult; long result; JSObjectRef obj = JSValueToObject(context, thisObject, NULL); SwigPrivData *cdata = (SwigPrivData*) JSObjectGetPrivate(obj); result = (long) cdata->swigCObject; jsresult = JSValueMakeNumber(context, result); return jsresult; } SWIGRUNTIME JSValueRef _wrap_SwigObject_equals(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { JSValueRef jsresult; bool result; JSObjectRef obj = JSValueToObject(context, thisObject, NULL); SwigPrivData *cdata = (SwigPrivData*) JSObjectGetPrivate(obj); JSObjectRef obj2 = JSValueToObject(context, argv[0], NULL); SwigPrivData *cdata2 = (SwigPrivData*) JSObjectGetPrivate(obj2); result = (cdata->swigCObject == cdata2->swigCObject); jsresult = JSValueMakeBoolean(context, result); return jsresult; } SWIGRUNTIME JSStaticValue _SwigObject_values[] = { { 0, 0, 0, 0 } }; SWIGRUNTIME JSStaticFunction _SwigObject_functions[] = { { "disown",_wrap_SwigObject_disown, kJSPropertyAttributeNone }, { "equals",_wrap_SwigObject_equals, kJSPropertyAttributeNone }, { "getCPtr",_wrap_SwigObject_getCPtr, kJSPropertyAttributeNone }, { 0, 0, 0 } }; SWIGRUNTIME JSClassDefinition _SwigObject_objectDefinition; SWIGRUNTIME JSClassRef _SwigObject_classRef; SWIGRUNTIME int SWIG_JSC_ConvertInstancePtr(JSContextRef context, JSObjectRef objRef, void** ptr, swig_type_info *info, int flags) { SwigPrivData *cdata; cdata = (SwigPrivData *) JSObjectGetPrivate(objRef); if(cdata == NULL) { return SWIG_ERROR; } if(cdata->info != info) { bool type_valid = false; swig_cast_info *t = info->cast; while(t != NULL) { if(t->type == cdata->info) { type_valid = true; break; } t = t->next; } if(!type_valid) { return SWIG_TypeError; } } *ptr = cdata->swigCObject; if(flags & SWIG_POINTER_DISOWN) { cdata->swigCMemOwn = false; } return SWIG_OK; } SWIGRUNTIME int SWIG_JSC_ConvertPtr(JSContextRef context, JSValueRef valRef, void** ptr, swig_type_info *info, int flags) { JSObjectRef objRef; /* special case: JavaScript null => C NULL pointer */ if(JSValueIsNull(context, valRef)) { *ptr=0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } if(!JSValueIsObject(context, valRef)) { return SWIG_TypeError; } objRef = JSValueToObject(context, valRef, NULL); if(objRef == NULL) { return SWIG_ERROR; } return SWIG_JSC_ConvertInstancePtr(context, objRef, ptr, info, flags); } SWIGRUNTIME JSObjectRef SWIG_JSC_NewPointerObj(JSContextRef context, void *ptr, swig_type_info *info, int flags) { JSClassRef classRef; JSObjectRef result; SwigPrivData *cdata; if (ptr == NULL) { // HACK: it is not possible to use JSValueToObject (causing seg-fault) // This static cast turned out to be a workaround // In future, we should change the interface of this method // to return JSValueRef instead of JSObjectRef. return (JSObjectRef) JSValueMakeNull(context); } if(info->clientdata == NULL) { classRef = _SwigObject_classRef; } else { classRef = (JSClassRef) info->clientdata; } result = JSObjectMake(context, classRef, NULL); cdata = (SwigPrivData*) malloc(sizeof(SwigPrivData)); cdata->swigCObject = ptr; cdata->swigCMemOwn = (flags & SWIG_POINTER_OWN) ? 1 : 0; cdata->info = info; JSObjectSetPrivate(result, cdata); return result; } #define SWIG_ConvertPtr(obj, ptr, info, flags) SWIG_JSC_ConvertPtr(context, obj, ptr, info, flags) #define SWIG_NewPointerObj(ptr, info, flags) SWIG_JSC_NewPointerObj(context, ptr, info, flags) #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_JSC_ConvertInstancePtr(context, obj, pptr, type, flags) #define SWIG_NewInstanceObj(thisvalue, type, flags) SWIG_JSC_NewPointerObj(context, thisvalue, type, flags) #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_JSC_ConvertPtr(context, obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_JSC_NewPointerObj(context, ptr, type, 0) /* ---------------------------------------------------------------------------- * A class for packed data * * ---------------------------------------------------------------------------*/ typedef struct { void *data; size_t size; swig_type_info *type; } SwigPackedData; SWIGRUNTIME JSStaticValue _SwigPackedData_values[] = { { 0, 0, 0, 0 } }; SWIGRUNTIME JSStaticFunction _SwigPackedData_functions[] = { { 0, 0, 0 } }; SWIGRUNTIME JSClassDefinition _SwigPackedData_objectDefinition; SWIGRUNTIME JSClassRef _SwigPackedData_classRef; SWIGRUNTIMEINLINE int SwigJSCPacked_Check(JSContextRef context, JSValueRef valRef) { return JSValueIsObjectOfClass(context, valRef, _SwigPackedData_classRef); } SWIGRUNTIME swig_type_info* SwigJSCPacked_UnpackData(JSContextRef context, JSValueRef valRef, void *ptr, size_t size) { if (SwigJSCPacked_Check(context, valRef)) { JSObjectRef objRef = JSValueToObject(context, valRef, NULL); SwigPackedData *sobj = (SwigPackedData *) JSObjectGetPrivate(objRef); if (sobj->size != size) return 0; memcpy(ptr, sobj->data, size); return sobj->type; } else { return 0; } } SWIGRUNTIME int SWIG_JSC_ConvertPacked(JSContextRef context, JSValueRef valRef, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigJSCPacked_UnpackData(context, valRef, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } SWIGRUNTIME JSValueRef SWIG_JSC_NewPackedObj(JSContextRef context, void *data, size_t size, swig_type_info *type) { JSClassRef classRef = _SwigObject_classRef; JSObjectRef result = JSObjectMake(context, classRef, NULL); SwigPackedData* cdata = (SwigPackedData*) malloc(sizeof(SwigPackedData)); cdata->data = data; cdata->size = size; cdata->type = type; JSObjectSetPrivate(result, cdata); return result; } /* SwigPackedData wrappers */ SWIGRUNTIME void _wrap_SwigPackedData_delete(JSObjectRef obj) { SwigPackedData* cdata = (SwigPackedData*) JSObjectGetPrivate(obj); if (cdata) { free(cdata->data); } } /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_JSC_ConvertPacked(context, obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_JSC_NewPackedObj(context, ptr, sz, type) /* --------------------------------------------------------------------------- * Support for IN/OUTPUT typemaps (see Lib/typemaps/inoutlist.swg) * * ---------------------------------------------------------------------------*/ SWIGRUNTIME unsigned int SWIGJSC_ArrayLength(JSContextRef context, JSObjectRef arr) { static JSStringRef LENGTH = 0; JSValueRef exception = NULL; JSValueRef js_length; double length; if (LENGTH == 0) { LENGTH = JSStringCreateWithUTF8CString("length"); } js_length = JSObjectGetProperty(context, arr, LENGTH, &exception); if (exception == 0 && JSValueIsNumber(context, js_length)) { length = JSValueToNumber(context, js_length, 0); return (unsigned int) length; } else { return 0; } } SWIGRUNTIME JSValueRef SWIGJSC_AppendOutput(JSContextRef context, JSValueRef value, JSValueRef obj) { JSObjectRef arr; unsigned int length; if (JSValueIsUndefined(context, value)) { arr = JSObjectMakeArray(context, 0, 0, 0); } else { arr = JSValueToObject(context, value, 0); } length = SWIGJSC_ArrayLength(context, arr); JSObjectSetPropertyAtIndex(context, arr, length, obj, 0); return arr; } swig-4.0.2/Lib/javascript/jsc/std_vector.i0000644000175000017500000000574713667507523020360 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %include %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef bool value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef bool const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && iswigCMemOwn) { free (($jstype)t->swigCObject); } JSObjectSetPrivate(thisObject, NULL); free(t); } } %} /* ----------------------------------------------------------------------------- * js_dtor: template for a destructor wrapper * - $jsmangledname: mangled class name * - $jstype: class type * - ${destructor_action}: The custom destructor action to invoke. * ----------------------------------------------------------------------------- */ %fragment ("js_dtoroverride", "templates") %{ static void $jswrapper(JSObjectRef thisObject) { SwigPrivData* t = (SwigPrivData*) JSObjectGetPrivate(thisObject); if(t) { if (t->swigCMemOwn) { $jstype arg1 = ($jstype)t->swigCObject; ${destructor_action} } /* remove the private data to make sure that it isn't accessed elsewhere */ JSObjectSetPrivate(thisObject, NULL); free(t); } } %} /* ----------------------------------------------------------------------------- * js_getter: template for getter function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_getter", "templates") %{ static JSValueRef $jswrapper(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception) { $jslocals JSValueRef jsresult; $jscode return jsresult; goto fail; fail: return JSValueMakeUndefined(context); } %} /* ----------------------------------------------------------------------------- * js_setter: template for setter function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_setter", "templates") %{ static bool $jswrapper(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef value, JSValueRef* exception) { $jslocals $jscode return true; goto fail; fail: return false; } %} /* ----------------------------------------------------------------------------- * js_function: template for function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_function", "templates") %{ static JSValueRef $jswrapper(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { $jslocals JSValueRef jsresult; if(argc != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode return jsresult; goto fail; fail: return JSValueMakeUndefined(context); } %} /* ----------------------------------------------------------------------------- * js_function_dispatcher: template for a function dispatcher for overloaded functions * - $jswrapper: wrapper function name * - $jsname: name of the wrapped function * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_function_dispatcher", "templates") %{ static JSValueRef $jswrapper(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { $jslocals JSValueRef jsresult; int res; $jscode SWIG_exception_fail(SWIG_ERROR, "Illegal arguments for function $jsname."); return jsresult; goto fail; fail: return JSValueMakeUndefined(context); } %} /* ----------------------------------------------------------------------------- * js_overloaded_function: template for a overloaded function * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_overloaded_function", "templates") %{ static int $jswrapper(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception, JSValueRef* p_result) { $jslocals JSValueRef jsresult; if(argc != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode *p_result = jsresult; return SWIG_OK; goto fail; fail: return SWIG_TypeError; } %} /* ----------------------------------------------------------------------------- * js_function_dispatch_case: template for a case used in the function dispatcher * - $jswrapper: wrapper function name * - $jsargcount: number of arguments of overloaded function * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_function_dispatch_case", "templates") %{ if(argc == $jsargcount) { res = $jswrapper(context, function, thisObject, argc, argv, exception, &jsresult); if(res == SWIG_OK) { *exception = 0; return jsresult; } } %} /* ----------------------------------------------------------------------------- * jsc_variable_declaration: template for a variable table entry * - $jsname: name of the variable * - $jsgetter: wrapper of getter function * - $jssetter: wrapper of setter function * ----------------------------------------------------------------------------- */ %fragment ("jsc_variable_declaration", "templates") %{ {"$jsname", $jsgetter, $jssetter, kJSPropertyAttributeNone}, %} /* ----------------------------------------------------------------------------- * jsc_function_declaration: template for a function table entry * - $jsname: name of the variable * - $jswrapper: wrapper function * ----------------------------------------------------------------------------- */ %fragment ("jsc_function_declaration", "templates") %{ {"$jsname", $jswrapper, kJSPropertyAttributeNone}, %} /* ----------------------------------------------------------------------------- * jsc_classtemplate_declaration: template for a namespace declaration * - $jsmangledname: mangled class name * ----------------------------------------------------------------------------- */ %fragment ("jsc_class_declaration", "templates") %{ static JSClassDefinition $jsmangledname_classDefinition; static JSClassDefinition $jsmangledname_objectDefinition; static JSClassRef $jsmangledname_classRef; %} /* ----------------------------------------------------------------------------- * jsc_class_tables: template for a namespace declaration * - $jsmangledname: mangled class name * - $jsstaticclassvariables: list of static variable entries * - $jsstaticclassfunctions: list of static function entries * - $jsclassvariables: list of member variable entries * - $jsclassfunctions: list of member function entries * ----------------------------------------------------------------------------- */ %fragment ("jsc_class_tables", "templates") %{ static JSStaticValue $jsmangledname_staticValues[] = { $jsstaticclassvariables { 0, 0, 0, 0 } }; static JSStaticFunction $jsmangledname_staticFunctions[] = { $jsstaticclassfunctions { 0, 0, 0 } }; static JSStaticValue $jsmangledname_values[] = { $jsclassvariables { 0, 0, 0, 0 } }; static JSStaticFunction $jsmangledname_functions[] = { $jsclassfunctions { 0, 0, 0 } }; %} /* ----------------------------------------------------------------------------- * jsc_define_class_template: template for defining a class template * - $jsmangledname: mangled class name * - $jsmangledtype: mangled class type * - $jsctor: wrapper of ctor * - $jsbaseclass: mangled name of base class * ----------------------------------------------------------------------------- */ %fragment ("jsc_class_definition", "templates") %{ $jsmangledname_classDefinition.staticFunctions = $jsmangledname_staticFunctions; $jsmangledname_classDefinition.staticValues = $jsmangledname_staticValues; $jsmangledname_classDefinition.callAsConstructor = $jsctor; $jsmangledname_objectDefinition.finalize = $jsdtor; $jsmangledname_objectDefinition.staticValues = $jsmangledname_values; $jsmangledname_objectDefinition.staticFunctions = $jsmangledname_functions; $jsclass_inheritance $jsmangledname_classRef = JSClassCreate(&$jsmangledname_objectDefinition); SWIGTYPE_$jsmangledtype->clientdata = $jsmangledname_classRef; %} %fragment ("jsc_class_inherit", templates) %{ if (SWIGTYPE_p$jsbaseclassmangled != NULL) { $jsmangledname_objectDefinition.parentClass = (JSClassRef) SWIGTYPE_p$jsbaseclassmangled->clientdata; } %} %fragment ("jsc_class_noinherit", templates) %{ $jsmangledname_objectDefinition.parentClass = _SwigObject_classRef; %} /* ----------------------------------------------------------------------------- * jsc_register_class: template for registration of a class * - $jsname: class name * - $jsmangledname: mangled class name * - $jsnspace: mangled name of namespace * ----------------------------------------------------------------------------- */ %fragment ("jsc_class_registration", "templates") %{ JS_registerClass(context, $jsnspace_object, "$jsname", &$jsmangledname_classDefinition); %} /* ----------------------------------------------------------------------------- * jsc_nspace_declaration: template for a namespace declaration * - $jsnspace: mangled name of the namespace * - $jsglobalvariables: list of variable entries * - $jsglobalfunctions: list of function entries * ----------------------------------------------------------------------------- */ %fragment ("jsc_nspace_declaration", "templates") %{ static JSStaticValue $jsnspace_values[] = { $jsglobalvariables { 0, 0, 0, 0 } }; static JSStaticFunction $jsnspace_functions[] = { $jsglobalfunctions { 0, 0, 0 } }; static JSClassDefinition $jsnspace_classDefinition; static JSObjectRef $jsmangledname_object; %} /* ----------------------------------------------------------------------------- * jsc_nspace_definition: template for definition of a namespace object * - $jsmangledname: mangled name of namespace * ----------------------------------------------------------------------------- */ %fragment ("jsc_nspace_definition", "templates") %{ $jsmangledname_classDefinition.staticFunctions = $jsmangledname_functions; $jsmangledname_classDefinition.staticValues = $jsmangledname_values; $jsmangledname_object = JSObjectMake(context, JSClassCreate(&$jsmangledname_classDefinition), NULL); %} /* ----------------------------------------------------------------------------- * jsc_nspace_registration: template for registration of a namespace object * - $jsname: name of namespace * - $jsmangledname: mangled name of namespace * - $jsparent: mangled name of parent namespace * ----------------------------------------------------------------------------- */ %fragment ("jsc_nspace_registration", "templates") %{ JS_registerNamespace(context, $jsmangledname_object, $jsparent_object, "$jsname"); %} swig-4.0.2/Lib/javascript/jsc/javascriptkw.swg0000644000175000017500000000176713667507523021262 0ustar williamwilliam#ifndef JAVASCRIPT_JAVASCRIPTKW_SWG_ #define JAVASCRIPT_JAVASCRIPTKW_SWG_ /* Warnings for Java keywords */ #define JAVASCRIPTKW(x) %keywordwarn("'" `x` "' is a javascript keyword, renaming to '_"`x`"'",rename="_%s") `x` /* Taken from https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Reserved_Words */ JAVASCRIPTKW(break); JAVASCRIPTKW(case); JAVASCRIPTKW(catch); JAVASCRIPTKW(continue); JAVASCRIPTKW(default); JAVASCRIPTKW(delete); JAVASCRIPTKW(do); JAVASCRIPTKW(else); JAVASCRIPTKW(finally); JAVASCRIPTKW(for); JAVASCRIPTKW(function); JAVASCRIPTKW(if); JAVASCRIPTKW(in); JAVASCRIPTKW(instanceof); JAVASCRIPTKW(new); JAVASCRIPTKW(return); JAVASCRIPTKW(switch); JAVASCRIPTKW(this); JAVASCRIPTKW(throw); JAVASCRIPTKW(try); JAVASCRIPTKW(typeof); JAVASCRIPTKW(var); JAVASCRIPTKW(void); JAVASCRIPTKW(while); JAVASCRIPTKW(with); /* others bad names if any*/ // for example %namewarn("321:clone() is a javascript bad method name") *::clone(); #undef JAVASCRIPTKW #endif //JAVASCRIPT_JAVASCRIPTKW_SWG_ swig-4.0.2/Lib/javascript/jsc/ccomplex.i0000644000175000017500000000140313667507523017777 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ccomplex.i * * C complex typemaps * ISO C99: 7.3 Complex arithmetic * ----------------------------------------------------------------------------- */ %include %{ #include %} /* C complex constructor */ #define CCplxConst(r, i) ((r) + I*(i)) %swig_cplxflt_convn(float complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(double complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(complex, CCplxConst, creal, cimag); /* declaring the typemaps */ %typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, complex); swig-4.0.2/Lib/javascript/jsc/javascripttypemaps.swg0000644000175000017500000000367413667507523022502 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Javascript * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* These macros are necessary to provide an extra parameter to SWIG_AsVal_dec functions (JSContextRef context). They must be defined before including `typemaps/fragments.swg` */ #define SWIG_FROM_DECL_ARGS SWIG_JSC_FROM_DECL_ARGS #define SWIG_FROM_CALL_ARGS SWIG_JSC_FROM_CALL_ARGS #define SWIG_AS_DECL_ARGS SWIG_JSC_AS_DECL_ARGS #define SWIG_AS_CALL_ARGS SWIG_JSC_AS_CALL_ARGS /* Include fundamental fragemt definitions */ %include /* Look for user fragments file. */ %include /* Javascript fragments for fundamental types */ %include /* Javascript fragments for char* strings */ %include /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ #define SWIG_Object JSValueRef #define VOID_Object JSValueMakeUndefined(context) /* append output */ #define SWIG_AppendOutput(result, obj) SWIGJSC_AppendOutput(context, result, obj) /* set constant */ #define SWIG_SetConstant(name, obj) /* raise */ #define SWIG_Raise(obj, type, desc) SWIG_Javascript_Raise(context, exception, type) %insert("runtime") %{ #define SWIG_JSC_FROM_DECL_ARGS(arg1) (JSContextRef context, arg1) #define SWIG_JSC_FROM_CALL_ARGS(arg1) (context, arg1) #define SWIG_JSC_AS_DECL_ARGS(arg1, arg2) (JSContextRef context, arg1, arg2) #define SWIG_JSC_AS_CALL_ARGS(arg1, arg2) (context, arg1, arg2) %} /* Include the unified typemap library */ %include swig-4.0.2/Lib/javascript/jsc/std_common.i0000644000175000017500000000014613667507523020332 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.2/Lib/javascript/jsc/std_except.i0000644000175000017500000000004313667507523020326 0ustar williamwilliam%include swig-4.0.2/Lib/javascript/jsc/complex.i0000644000175000017500000000012013667507523017627 0ustar williamwilliam#ifdef __cplusplus %include #else %include #endif swig-4.0.2/Lib/javascript/jsc/typemaps.i0000644000175000017500000001047613667507523020041 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * These mappings provide support for input/output arguments and common * uses for C/C++ pointers. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Python tuple. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Python output of the function would be a tuple containing both output values. */ // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Python tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Python). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Python variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %include swig-4.0.2/Lib/javascript/jsc/javascriptstrings.swg0000644000175000017500000001350013667507523022316 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_JSC_AsCharPtrAndSize(JSContextRef context, JSValueRef valRef, char** cptr, size_t* psize, int *alloc) { if(JSValueIsString(context, valRef)) { JSStringRef js_str = JSValueToStringCopy(context, valRef, NULL); size_t len = JSStringGetMaximumUTF8CStringSize(js_str); char* cstr = (char*) %new_array(len, char); /* JSStringGetUTF8CString returns the length including 0-terminator */ len = JSStringGetUTF8CString(js_str, cstr, len); if(alloc) *alloc = SWIG_NEWOBJ; if(psize) *psize = len; if(cptr) *cptr = cstr; return SWIG_OK; } else { if(JSValueIsObject(context, valRef)) { JSObjectRef obj = JSValueToObject(context, valRef, NULL); // try if the object is a wrapped char[] swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } return SWIG_TypeError; } else { return SWIG_TypeError; } } } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE JSValueRef SWIG_JSC_FromCharPtrAndSize(JSContextRef context, const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { // TODO: handle extra long strings //swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); //return pchar_descriptor ? // SWIG_InternalNewPointerObj(%const_cast(carray,char *), pchar_descriptor, 0) : SWIG_Py_Void(); return JSValueMakeUndefined(context); } else { JSStringRef jsstring; JSValueRef result; if(size < 2) { char c[2]; int i; for(i=0;i %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.2/Lib/javascript/jsc/stl.i0000644000175000017500000000044313667507523016772 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/javascript/jsc/exception.i0000644000175000017500000000004213667507523020161 0ustar williamwilliam%include swig-4.0.2/Lib/javascript/jsc/javascriptfragments.swg0000644000175000017500000000105713667507523022617 0ustar williamwilliam/* Create a file with this name, 'javascriptfragments.swg', in your working directory and add all the %fragments you want to take precedence over the default ones defined by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(PyObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-4.0.2/Lib/javascript/jsc/cdata.i0000644000175000017500000000003613667507523017242 0ustar williamwilliam%include swig-4.0.2/Lib/javascript/jsc/javascriptcomplex.swg0000644000175000017500000000721613667507523022303 0ustar williamwilliam/* Defines the As/From converters for double/float complex, you need to provide complex Type, the Name you want to use in the converters, the complex Constructor method, and the Real and Imag complex accessor methods. See the std_complex.i and ccomplex.i for concrete examples. */ /* the common from converter */ %define %swig_fromcplx_conv(Type, Real, Imag) %fragment(SWIG_From_frag(Type),"header", fragment=SWIG_From_frag(double)) { SWIGINTERNINLINE JSObjectRef SWIG_From_dec(Type)(%ifcplusplus(const Type&, Type) c) { JSValueRef vals[2]; vals[0] = SWIG_From(double)(Real(c)); vals[1] = SWIG_From(double)(Imag(c)); return JSObjectMakeArray(context, 2, vals, NULL); } } %enddef /* the double case */ %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal_dec(Type) (JSValueRef o, Type* val) { if (JSValueIsObject(context, o)) { JSObjectRef array; JSValueRef exception, js_re, js_im; double re, im; int res; exception = 0; res = 0; array = JSValueToObject(context, o, &exception); if(exception != 0) return SWIG_TypeError; js_re = JSObjectGetPropertyAtIndex(context, array, 0, &exception); if(exception != 0) return SWIG_TypeError; js_im = JSObjectGetPropertyAtIndex(context, array, 1, &exception); if(exception != 0) return SWIG_TypeError; res = SWIG_AsVal(double)(js_re, &re); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } res = SWIG_AsVal(double)(js_im, &im); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } if (val) *val = Constructor(re, im); return SWIG_OK; } else { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef /* the float case */ %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float)) { SWIGINTERN int SWIG_AsVal_dec(Type)(JSValueRef o, Type *val) { if (JSValueIsObject(context, o)) { JSObjectRef array; JSValueRef exception, js_re, js_im; double re, im; int res; exception = 0; res = 0; array = JSValueToObject(context, o, &exception); if(exception != 0) return SWIG_TypeError; js_re = JSObjectGetPropertyAtIndex(context, array, 0, &exception); if(exception != 0) return SWIG_TypeError; js_im = JSObjectGetPropertyAtIndex(context, array, 1, &exception); if(exception != 0) return SWIG_TypeError; res = SWIG_AsVal(double)(js_re, &re); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } res = SWIG_AsVal(double)(js_im, &im); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else { return SWIG_OverflowError; } } else { float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(re, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-4.0.2/Lib/javascript/jsc/std_string.i0000644000175000017500000000004313667507523020344 0ustar williamwilliam%include swig-4.0.2/Lib/javascript/jsc/std_map.i0000644000175000017500000000505713667507523017625 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.2/Lib/javascript/jsc/arrays_javascript.i0000644000175000017500000000643113667507523021722 0ustar williamwilliam/* ----------------------------------------------------------------------------- * arrays_javascript.i * * These typemaps give more natural support for arrays. The typemaps are not efficient * as there is a lot of copying of the array values whenever the array is passed to C/C++ * from JavaScript and vice versa. The JavaScript array is expected to be the same size as the C array. * An exception is thrown if they are not. * * Example usage: * Wrapping: * * %include * %inline %{ * extern int FiddleSticks[3]; * %} * * Use from JavaScript like this: * * var fs = [10, 11, 12]; * example.FiddleSticks = fs; * fs = example.FiddleSticks; * ----------------------------------------------------------------------------- */ %fragment("SWIG_JSCGetIntProperty", "header", fragment=SWIG_AsVal_frag(int)) {} %fragment("SWIG_JSCGetNumberProperty", "header", fragment=SWIG_AsVal_frag(double)) {} %typemap(in, fragment="SWIG_JSCGetIntProperty") int[], int[ANY] (int length = 0, JSObjectRef array, JSValueRef jsvalue, int i = 0, int res = 0, $*1_ltype temp) { if (JSValueIsObject(context, $input)) { // Convert into Array array = JSValueToObject(context, $input, NULL); length = $1_dim0; $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array for (i = 0; i < length; i++) { jsvalue = JSObjectGetPropertyAtIndex(context, array, i, NULL); // Get primitive value from JSObject res = SWIG_AsVal(int)(jsvalue, &temp); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } } else { SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); } } %typemap(freearg) int[], int[ANY] { free($1); } %typemap(out, fragment=SWIG_From_frag(int)) int[], int[ANY] (int length = 0, int i = 0) { length = $1_dim0; JSValueRef values[length]; for (i = 0; i < length; i++) { values[i] = SWIG_From(int)($1[i]); } $result = JSObjectMakeArray(context, length, values, NULL); } %typemap(in, fragment="SWIG_JSCGetNumberProperty") double[], double[ANY] (int length = 0, JSObjectRef array, JSValueRef jsvalue, int i = 0, int res = 0, $*1_ltype temp) { if (JSValueIsObject(context, $input)) { // Convert into Array array = JSValueToObject(context, $input, NULL); length = $1_dim0; $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array for (i = 0; i < length; i++) { jsvalue = JSObjectGetPropertyAtIndex(context, array, i, NULL); // Get primitive value from JSObject res = SWIG_AsVal(double)(jsvalue, &temp); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } } else { SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); } } %typemap(freearg) double[], double[ANY] { free($1); } %typemap(out, fragment=SWIG_From_frag(double)) double[], double[ANY] (int length = 0, int i = 0) { length = $1_dim0; JSValueRef values[length]; for (i = 0; i < length; i++) { values[i] = SWIG_From(double)($1[i]); } $result = JSObjectMakeArray(context, length, values, NULL); } swig-4.0.2/Lib/java/0000755000175000017500000000000013667507523014011 5ustar williamwilliamswig-4.0.2/Lib/java/std_deque.i0000644000175000017500000000003413667507523016135 0ustar williamwilliam%include swig-4.0.2/Lib/java/javakw.swg0000644000175000017500000000236613667507523016025 0ustar williamwilliam#ifndef JAVA_JAVAKW_SWG_ #define JAVA_JAVAKW_SWG_ /* Warnings for Java keywords */ #define JAVAKW(x) %keywordwarn("'" `x` "' is a java keyword, renaming to '_"`x`"'",rename="_%s") `x` /* from http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html */ JAVAKW(abstract); JAVAKW(double); JAVAKW(int); JAVAKW(strictfp); JAVAKW(boolean); JAVAKW(else); JAVAKW(interface); JAVAKW(super); JAVAKW(break); JAVAKW(extends); JAVAKW(long); JAVAKW(switch); JAVAKW(byte); JAVAKW(final); JAVAKW(native); JAVAKW(synchronized); JAVAKW(case); JAVAKW(finally); JAVAKW(new); JAVAKW(this); JAVAKW(catch); JAVAKW(float); JAVAKW(package); JAVAKW(throw); JAVAKW(char); JAVAKW(for); JAVAKW(private); JAVAKW(throws); JAVAKW(class); JAVAKW(goto); JAVAKW(protected); JAVAKW(transient); JAVAKW(const); JAVAKW(if); JAVAKW(public); JAVAKW(try); JAVAKW(continue); JAVAKW(implements); JAVAKW(return); JAVAKW(void); JAVAKW(default); JAVAKW(import); JAVAKW(short); JAVAKW(volatile); JAVAKW(do); JAVAKW(instanceof); JAVAKW(static); JAVAKW(while); /* others bad names */ /* Note here that only *::clone() is bad, and *::clone(int) is ok */ %namewarn("321:clone() is a java bad method name") *::clone(); #undef JAVAKW #endif //JAVA_JAVAKW_SWG_ swig-4.0.2/Lib/java/director.swg0000644000175000017500000003732313667507523016356 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Java proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #if defined(DEBUG_DIRECTOR_OWNED) || defined(DEBUG_DIRECTOR_EXCEPTION) || defined(DEBUG_DIRECTOR_THREAD_NAME) #include #endif #include #if defined(SWIG_JAVA_USE_THREAD_NAME) #if !defined(SWIG_JAVA_GET_THREAD_NAME) namespace Swig { SWIGINTERN int GetThreadName(char *name, size_t len); } #if defined(__linux__) #include SWIGINTERN int Swig::GetThreadName(char *name, size_t len) { (void)len; #if defined(PR_GET_NAME) return prctl(PR_GET_NAME, (unsigned long)name, 0, 0, 0); #else (void)name; return 1; #endif } #elif defined(__unix__) || defined(__APPLE__) #include SWIGINTERN int Swig::GetThreadName(char *name, size_t len) { return pthread_getname_np(pthread_self(), name, len); } #else SWIGINTERN int Swig::GetThreadName(char *name, size_t len) { (void)len; (void)name; return 1; } #endif #endif #endif namespace Swig { /* Java object wrapper */ class JObjectWrapper { public: JObjectWrapper() : jthis_(NULL), weak_global_(true) { } ~JObjectWrapper() { jthis_ = NULL; weak_global_ = true; } bool set(JNIEnv *jenv, jobject jobj, bool mem_own, bool weak_global) { if (!jthis_) { weak_global_ = weak_global || !mem_own; // hold as weak global if explicitly requested or not owned if (jobj) jthis_ = weak_global_ ? jenv->NewWeakGlobalRef(jobj) : jenv->NewGlobalRef(jobj); #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> " << jthis_ << std::endl; #endif return true; } else { #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> already set" << std::endl; #endif return false; } } jobject get(JNIEnv *jenv) const { #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "JObjectWrapper::get("; if (jthis_) std::cout << jthis_; else std::cout << "null"; std::cout << ") -> return new local ref" << std::endl; #endif return (jthis_ ? jenv->NewLocalRef(jthis_) : jthis_); } void release(JNIEnv *jenv) { #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "JObjectWrapper::release(" << jthis_ << "): " << (weak_global_ ? "weak global ref" : "global ref") << std::endl; #endif if (jthis_) { if (weak_global_) { if (jenv->IsSameObject(jthis_, NULL) == JNI_FALSE) jenv->DeleteWeakGlobalRef((jweak)jthis_); } else jenv->DeleteGlobalRef(jthis_); } jthis_ = NULL; weak_global_ = true; } /* Only call peek if you know what you are doing wrt to weak/global references */ jobject peek() { return jthis_; } /* Java proxy releases ownership of C++ object, C++ object is now responsible for destruction (creates NewGlobalRef to pin Java proxy) */ void java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) { if (take_or_release) { /* Java takes ownership of C++ object's lifetime. */ if (!weak_global_) { jenv->DeleteGlobalRef(jthis_); jthis_ = jenv->NewWeakGlobalRef(jself); weak_global_ = true; } } else { /* Java releases ownership of C++ object's lifetime */ if (weak_global_) { jenv->DeleteWeakGlobalRef((jweak)jthis_); jthis_ = jenv->NewGlobalRef(jself); weak_global_ = false; } } } private: /* pointer to Java object */ jobject jthis_; /* Local or global reference flag */ bool weak_global_; }; /* Local JNI reference deleter */ class LocalRefGuard { JNIEnv *jenv_; jobject jobj_; // non-copyable LocalRefGuard(const LocalRefGuard &); LocalRefGuard &operator=(const LocalRefGuard &); public: LocalRefGuard(JNIEnv *jenv, jobject jobj): jenv_(jenv), jobj_(jobj) {} ~LocalRefGuard() { if (jobj_) jenv_->DeleteLocalRef(jobj_); } }; /* director base class */ class Director { /* pointer to Java virtual machine */ JavaVM *swig_jvm_; protected: #if defined (_MSC_VER) && (_MSC_VER<1300) class JNIEnvWrapper; friend class JNIEnvWrapper; #endif /* Utility class for managing the JNI environment */ class JNIEnvWrapper { const Director *director_; JNIEnv *jenv_; int env_status; public: JNIEnvWrapper(const Director *director) : director_(director), jenv_(0), env_status(0) { #if defined(__ANDROID__) JNIEnv **jenv = &jenv_; #else void **jenv = (void **)&jenv_; #endif env_status = director_->swig_jvm_->GetEnv((void **)&jenv_, JNI_VERSION_1_2); JavaVMAttachArgs args; args.version = JNI_VERSION_1_2; args.group = NULL; args.name = NULL; #if defined(SWIG_JAVA_USE_THREAD_NAME) char thread_name[64]; // MAX_TASK_COMM_LEN=16 is hard-coded in the Linux kernel and MacOS has MAXTHREADNAMESIZE=64. if (Swig::GetThreadName(thread_name, sizeof(thread_name)) == 0) { args.name = thread_name; #if defined(DEBUG_DIRECTOR_THREAD_NAME) std::cout << "JNIEnvWrapper: thread name: " << thread_name << std::endl; } else { std::cout << "JNIEnvWrapper: Couldn't set Java thread name" << std::endl; #endif } #endif #if defined(SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON) // Attach a daemon thread to the JVM. Useful when the JVM should not wait for // the thread to exit upon shutdown. Only for jdk-1.4 and later. director_->swig_jvm_->AttachCurrentThreadAsDaemon(jenv, &args); #else director_->swig_jvm_->AttachCurrentThread(jenv, &args); #endif } ~JNIEnvWrapper() { #if !defined(SWIG_JAVA_NO_DETACH_CURRENT_THREAD) // Some JVMs, eg jdk-1.4.2 and lower on Solaris have a bug and crash with the DetachCurrentThread call. // However, without this call, the JVM hangs on exit when the thread was not created by the JVM and creates a memory leak. if (env_status == JNI_EDETACHED) director_->swig_jvm_->DetachCurrentThread(); #endif } JNIEnv *getJNIEnv() const { return jenv_; } }; /* Java object wrapper */ JObjectWrapper swig_self_; /* Disconnect director from Java object */ void swig_disconnect_director_self(const char *disconn_method) { JNIEnvWrapper jnienv(this) ; JNIEnv *jenv = jnienv.getJNIEnv() ; jobject jobj = swig_self_.get(jenv); LocalRefGuard ref_deleter(jenv, jobj); #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "Swig::Director::disconnect_director_self(" << jobj << ")" << std::endl; #endif if (jobj && jenv->IsSameObject(jobj, NULL) == JNI_FALSE) { jmethodID disconn_meth = jenv->GetMethodID(jenv->GetObjectClass(jobj), disconn_method, "()V"); if (disconn_meth) { #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "Swig::Director::disconnect_director_self upcall to " << disconn_method << std::endl; #endif jenv->CallVoidMethod(jobj, disconn_meth); } } } public: Director(JNIEnv *jenv) : swig_jvm_((JavaVM *) NULL), swig_self_() { /* Acquire the Java VM pointer */ jenv->GetJavaVM(&swig_jvm_); } virtual ~Director() { JNIEnvWrapper jnienv(this) ; JNIEnv *jenv = jnienv.getJNIEnv() ; swig_self_.release(jenv); } bool swig_set_self(JNIEnv *jenv, jobject jself, bool mem_own, bool weak_global) { return swig_self_.set(jenv, jself, mem_own, weak_global); } jobject swig_get_self(JNIEnv *jenv) const { return swig_self_.get(jenv); } // Change C++ object's ownership, relative to Java void swig_java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) { swig_self_.java_change_ownership(jenv, jself, take_or_release); } }; // Zero initialized bool array template class BoolArray { bool array_[N]; public: BoolArray() { memset(array_, 0, sizeof(array_)); } bool& operator[](size_t n) { return array_[n]; } bool operator[](size_t n) const { return array_[n]; } }; // Utility classes and functions for exception handling. // Simple holder for a Java string during exception handling, providing access to a c-style string class JavaString { public: JavaString(JNIEnv *jenv, jstring jstr) : jenv_(jenv), jstr_(jstr), cstr_(0) { if (jenv_ && jstr_) cstr_ = (const char *) jenv_->GetStringUTFChars(jstr_, NULL); } ~JavaString() { if (jenv_ && jstr_ && cstr_) jenv_->ReleaseStringUTFChars(jstr_, cstr_); } const char *c_str(const char *null_string = "null JavaString") const { return cstr_ ? cstr_ : null_string; } private: // non-copyable JavaString(const JavaString &); JavaString &operator=(const JavaString &); JNIEnv *jenv_; jstring jstr_; const char *cstr_; }; // Helper class to extract the exception message from a Java throwable class JavaExceptionMessage { public: JavaExceptionMessage(JNIEnv *jenv, jthrowable throwable) : message_(jenv, exceptionMessageFromThrowable(jenv, throwable)) { } // Return a C string of the exception message in the jthrowable passed in the constructor // If no message is available, null_string is return instead const char *message(const char *null_string = "Could not get exception message in JavaExceptionMessage") const { return message_.c_str(null_string); } private: // non-copyable JavaExceptionMessage(const JavaExceptionMessage &); JavaExceptionMessage &operator=(const JavaExceptionMessage &); // Get exception message by calling Java method Throwable.getMessage() static jstring exceptionMessageFromThrowable(JNIEnv *jenv, jthrowable throwable) { jstring jmsg = NULL; if (jenv && throwable) { jenv->ExceptionClear(); // Cannot invoke methods with any pending exceptions jclass throwclz = jenv->GetObjectClass(throwable); if (throwclz) { // All Throwable classes have a getMessage() method, so call it to extract the exception message jmethodID getMessageMethodID = jenv->GetMethodID(throwclz, "getMessage", "()Ljava/lang/String;"); if (getMessageMethodID) jmsg = (jstring)jenv->CallObjectMethod(throwable, getMessageMethodID); } if (jmsg == NULL && jenv->ExceptionCheck()) jenv->ExceptionClear(); } return jmsg; } JavaString message_; }; // C++ Exception class for handling Java exceptions thrown during a director method Java upcall class DirectorException : public std::exception { public: // Construct exception from a Java throwable DirectorException(JNIEnv *jenv, jthrowable throwable) : jenv_(jenv), throwable_(throwable), classname_(0), msg_(0) { // Call Java method Object.getClass().getName() to obtain the throwable's class name (delimited by '/') if (jenv && throwable) { jenv->ExceptionClear(); // Cannot invoke methods with any pending exceptions jclass throwclz = jenv->GetObjectClass(throwable); if (throwclz) { jclass clzclz = jenv->GetObjectClass(throwclz); if (clzclz) { jmethodID getNameMethodID = jenv->GetMethodID(clzclz, "getName", "()Ljava/lang/String;"); if (getNameMethodID) { jstring jstr_classname = (jstring)(jenv->CallObjectMethod(throwclz, getNameMethodID)); // Copy strings, since there is no guarantee that jenv will be active when handled if (jstr_classname) { JavaString jsclassname(jenv, jstr_classname); const char *classname = jsclassname.c_str(0); if (classname) classname_ = copypath(classname); } } } } } JavaExceptionMessage exceptionmsg(jenv, throwable); msg_ = copystr(exceptionmsg.message(0)); } // More general constructor for handling as a java.lang.RuntimeException DirectorException(const char *msg) : jenv_(0), throwable_(0), classname_(0), msg_(msg ? copystr(msg) : 0) { } ~DirectorException() throw() { delete[] classname_; delete[] msg_; } const char *what() const throw() { return msg_ ? msg_ : "Unspecified DirectorException message"; } // Reconstruct and raise/throw the Java Exception that caused the DirectorException // Note that any error in the JNI exception handling results in a Java RuntimeException void throwException(JNIEnv *jenv) const { if (jenv) { if (jenv == jenv_ && throwable_) { // Throw original exception if not already pending jthrowable throwable = jenv->ExceptionOccurred(); if (throwable && jenv->IsSameObject(throwable, throwable_) == JNI_FALSE) { jenv->ExceptionClear(); throwable = 0; } if (!throwable) jenv->Throw(throwable_); } else { // Try and reconstruct original exception, but original stacktrace is not reconstructed jenv->ExceptionClear(); jmethodID ctorMethodID = 0; jclass throwableclass = 0; if (classname_) { throwableclass = jenv->FindClass(classname_); if (throwableclass) ctorMethodID = jenv->GetMethodID(throwableclass, "", "(Ljava/lang/String;)V"); } if (ctorMethodID) { jenv->ThrowNew(throwableclass, what()); } else { SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, what()); } } } } // Deprecated - use throwException void raiseJavaException(JNIEnv *jenv) const { throwException(jenv); } // Create and throw the DirectorException static void raise(JNIEnv *jenv, jthrowable throwable) { throw DirectorException(jenv, throwable); } private: static char *copypath(const char *srcmsg) { char *target = copystr(srcmsg); for (char *c=target; *c; ++c) { if ('.' == *c) *c = '/'; } return target; } static char *copystr(const char *srcmsg) { char *target = 0; if (srcmsg) { size_t msglen = strlen(srcmsg) + 1; target = new char[msglen]; strncpy(target, srcmsg, msglen); } return target; } JNIEnv *jenv_; jthrowable throwable_; const char *classname_; const char *msg_; }; // Helper method to determine if a Java throwable matches a particular Java class type // Note side effect of clearing any pending exceptions SWIGINTERN bool ExceptionMatches(JNIEnv *jenv, jthrowable throwable, const char *classname) { bool matches = false; if (throwable && jenv && classname) { // Exceptions need to be cleared for correct behavior. // The caller of ExceptionMatches should restore pending exceptions if desired - // the caller already has the throwable. jenv->ExceptionClear(); jclass clz = jenv->FindClass(classname); if (clz) { jclass classclz = jenv->GetObjectClass(clz); jmethodID isInstanceMethodID = jenv->GetMethodID(classclz, "isInstance", "(Ljava/lang/Object;)Z"); if (isInstanceMethodID) { matches = jenv->CallBooleanMethod(clz, isInstanceMethodID, throwable) != 0; } } #if defined(DEBUG_DIRECTOR_EXCEPTION) if (jenv->ExceptionCheck()) { // Typically occurs when an invalid classname argument is passed resulting in a ClassNotFoundException JavaExceptionMessage exc(jenv, jenv->ExceptionOccurred()); std::cout << "Error: ExceptionMatches: class '" << classname << "' : " << exc.message() << std::endl; } #endif } return matches; } } swig-4.0.2/Lib/java/std_shared_ptr.i0000644000175000017500000000010413667507523017163 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.2/Lib/java/arrays_java.i0000644000175000017500000003260513667507523016473 0ustar williamwilliam/* ----------------------------------------------------------------------------- * arrays_java.i * * These typemaps give more natural support for arrays. The typemaps are not efficient * as there is a lot of copying of the array values whenever the array is passed to C/C++ * from Java and vice versa. The Java array is expected to be the same size as the C array. * An exception is thrown if they are not. * * Example usage: * Wrapping: * * %include * %inline %{ * short FiddleSticks[3]; * %} * * Use from Java like this: * * short[] fs = new short[] {10, 11, 12}; * example.setFiddleSticks(fs); * fs = example.getFiddleSticks(); * ----------------------------------------------------------------------------- */ /* Primitive array support is a combination of SWIG macros and functions in order to reduce * code bloat and aid maintainability. The SWIG preprocessor expands the macros into functions * for inclusion in the generated code. */ /* Array support functions declarations macro */ %define JAVA_ARRAYS_DECL(CTYPE, JNITYPE, JAVATYPE, JFUNCNAME) %{ static int SWIG_JavaArrayIn##JFUNCNAME (JNIEnv *jenv, JNITYPE **jarr, CTYPE **carr, JNITYPE##Array input); static void SWIG_JavaArrayArgout##JFUNCNAME (JNIEnv *jenv, JNITYPE *jarr, CTYPE *carr, JNITYPE##Array input); static JNITYPE##Array SWIG_JavaArrayOut##JFUNCNAME (JNIEnv *jenv, CTYPE *result, jsize sz); %} %enddef /* Array support functions macro */ %define JAVA_ARRAYS_IMPL(CTYPE, JNITYPE, JAVATYPE, JFUNCNAME) %{ /* CTYPE[] support */ static int SWIG_JavaArrayIn##JFUNCNAME (JNIEnv *jenv, JNITYPE **jarr, CTYPE **carr, JNITYPE##Array input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = JCALL1(GetArrayLength, jenv, input); *jarr = JCALL2(Get##JAVATYPE##ArrayElements, jenv, input, 0); if (!*jarr) return 0; %} #ifdef __cplusplus %{ *carr = new CTYPE[sz]; %} #else %{ *carr = (CTYPE*) malloc(sz * sizeof(CTYPE)); %} #endif %{ if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; i %{ #include #include %} %fragment("SWIG_VectorSize", "header", fragment="SWIG_JavaIntFromSize_t") { SWIGINTERN jint SWIG_VectorSize(size_t size) { jint sz = SWIG_JavaIntFromSize_t(size); if (sz == -1) throw std::out_of_range("vector size is too large to fit into a Java int"); return sz; } } %define SWIG_STD_VECTOR_MINIMUM_INTERNAL(CTYPE, CONST_REFERENCE) %typemap(javabase) std::vector< CTYPE > "java.util.AbstractList<$typemap(jboxtype, CTYPE)>" %typemap(javainterfaces) std::vector< CTYPE > "java.util.RandomAccess" %proxycode %{ public $javaclassname($typemap(jstype, CTYPE)[] initialElements) { this(); reserve(initialElements.length); for ($typemap(jstype, CTYPE) element : initialElements) { add(element); } } public $javaclassname(Iterable<$typemap(jboxtype, CTYPE)> initialElements) { this(); for ($typemap(jstype, CTYPE) element : initialElements) { add(element); } } public $typemap(jboxtype, CTYPE) get(int index) { return doGet(index); } public $typemap(jboxtype, CTYPE) set(int index, $typemap(jboxtype, CTYPE) e) { return doSet(index, e); } public boolean add($typemap(jboxtype, CTYPE) e) { modCount++; doAdd(e); return true; } public void add(int index, $typemap(jboxtype, CTYPE) e) { modCount++; doAdd(index, e); } public $typemap(jboxtype, CTYPE) remove(int index) { modCount++; return doRemove(index); } protected void removeRange(int fromIndex, int toIndex) { modCount++; doRemoveRange(fromIndex, toIndex); } public int size() { return doSize(); } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef CTYPE value_type; typedef CTYPE *pointer; typedef CTYPE const *const_pointer; typedef CTYPE &reference; typedef CONST_REFERENCE const_reference; vector(); vector(const vector &other); size_type capacity() const; void reserve(size_type n) throw (std::length_error); %rename(isEmpty) empty; bool empty() const; void clear(); %extend { %fragment("SWIG_VectorSize"); vector(jint count, const CTYPE &value) throw (std::out_of_range) { if (count < 0) throw std::out_of_range("vector count must be positive"); return new std::vector< CTYPE >(static_cast::size_type>(count), value); } jint doSize() const throw (std::out_of_range) { return SWIG_VectorSize(self->size()); } void doAdd(const value_type& x) { self->push_back(x); } void doAdd(jint index, const value_type& x) throw (std::out_of_range) { jint size = static_cast(self->size()); if (0 <= index && index <= size) { self->insert(self->begin() + index, x); } else { throw std::out_of_range("vector index out of range"); } } value_type doRemove(jint index) throw (std::out_of_range) { jint size = static_cast(self->size()); if (0 <= index && index < size) { CTYPE const old_value = (*self)[index]; self->erase(self->begin() + index); return old_value; } else { throw std::out_of_range("vector index out of range"); } } CONST_REFERENCE doGet(jint index) throw (std::out_of_range) { jint size = static_cast(self->size()); if (index >= 0 && index < size) return (*self)[index]; else throw std::out_of_range("vector index out of range"); } value_type doSet(jint index, const value_type& val) throw (std::out_of_range) { jint size = static_cast(self->size()); if (index >= 0 && index < size) { CTYPE const old_value = (*self)[index]; (*self)[index] = val; return old_value; } else throw std::out_of_range("vector index out of range"); } void doRemoveRange(jint fromIndex, jint toIndex) throw (std::out_of_range) { jint size = static_cast(self->size()); if (0 <= fromIndex && fromIndex <= toIndex && toIndex <= size) { self->erase(self->begin() + fromIndex, self->begin() + toIndex); } else { throw std::out_of_range("vector index out of range"); } } } %enddef %javamethodmodifiers std::vector::doSize "private"; %javamethodmodifiers std::vector::doAdd "private"; %javamethodmodifiers std::vector::doGet "private"; %javamethodmodifiers std::vector::doSet "private"; %javamethodmodifiers std::vector::doRemove "private"; %javamethodmodifiers std::vector::doRemoveRange "private"; namespace std { template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(T, const value_type&) }; // bool specialization template<> class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(bool, bool) }; } %define specialize_std_vector(T) #warning "specialize_std_vector - specialization for type T no longer needed" %enddef swig-4.0.2/Lib/java/std_set.i0000644000175000017500000001221613667507523015632 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_set.i * * SWIG typemaps for std::set * The Java proxy class extends java.util.AbstractSet. The std::set * container looks and feels much like a java.util.HashSet from Java. * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::set // ------------------------------------------------------------------------ %{ #include #include %} %fragment("SWIG_SetSize", "header", fragment="SWIG_JavaIntFromSize_t") { SWIGINTERN jint SWIG_SetSize(size_t size) { jint sz = SWIG_JavaIntFromSize_t(size); if (sz == -1) { throw std::out_of_range("set size is too large to fit into a Java int"); } return sz; } } %javamethodmodifiers std::set::sizeImpl "private"; %javamethodmodifiers std::set::containsImpl "private"; %javamethodmodifiers std::set::removeImpl "private"; %javamethodmodifiers std::set::hasNextImpl "private"; %javamethodmodifiers std::set::begin "private"; %javamethodmodifiers std::set::end "private"; %rename(Iterator) std::set::iterator; %nodefaultctor std::set::iterator; %javamethodmodifiers std::set::iterator::incrementUnchecked "private"; %javamethodmodifiers std::set::iterator::derefUnchecked "private"; %javamethodmodifiers std::set::iterator::isNot "private"; namespace std { template class set { %typemap(javabase) std::set "java.util.AbstractSet<$typemap(jboxtype, T)>" %proxycode %{ public $javaclassname(java.util.Collection collection) { this(); addAll(collection); } public int size() { return sizeImpl(); } public boolean add($typemap(jboxtype, T) key) { return addImpl(key); } public boolean addAll(java.util.Collection collection) { boolean didAddElement = false; for (java.lang.Object object : collection) { didAddElement |= add(($typemap(jboxtype, T))object); } return didAddElement; } public java.util.Iterator<$typemap(jboxtype, T)> iterator() { return new java.util.Iterator<$typemap(jboxtype, T)>() { private Iterator curr; private Iterator end; private java.util.Iterator<$typemap(jboxtype, T)> init() { curr = $javaclassname.this.begin(); end = $javaclassname.this.end(); return this; } public $typemap(jboxtype, T) next() { if (!hasNext()) { throw new java.util.NoSuchElementException(); } // Save the current position, increment it, // then return the value at the position before the increment. final $typemap(jboxtype, T) currValue = curr.derefUnchecked(); curr.incrementUnchecked(); return currValue; } public boolean hasNext() { return curr.isNot(end); } }.init(); } public boolean containsAll(java.util.Collection collection) { for (java.lang.Object object : collection) { if (!contains(object)) { return false; } } return true; } public boolean contains(java.lang.Object object) { if (!(object instanceof $typemap(jboxtype, T))) { return false; } return containsImpl(($typemap(jboxtype, T))object); } public boolean removeAll(java.util.Collection collection) { boolean didRemoveElement = false; for (java.lang.Object object : collection) { didRemoveElement |= remove(object); } return didRemoveElement; } public boolean remove(java.lang.Object object) { if (!(object instanceof $typemap(jboxtype, T))) { return false; } return removeImpl(($typemap(jboxtype, T))object); } %} public: struct iterator { %typemap(javaclassmodifiers) iterator "protected class" %extend { void incrementUnchecked() { ++(*$self); } T derefUnchecked() const { return **$self; } bool isNot(iterator other) const { return (*$self != other); } } }; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T key_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; set(); set(const set& other); %rename(isEmpty) empty; bool empty() const; void clear(); iterator begin(); iterator end(); %extend { %fragment("SWIG_SetSize"); // Returns whether item was inserted. bool addImpl(const T& key) { return self->insert(key).second; } // Returns whether set contains key. bool containsImpl(const T& key) { return (self->count(key) > 0); } // Returns whether the item was erased. bool removeImpl(const T& key) { return (self->erase(key) > 0); } jint sizeImpl() const throw (std::out_of_range) { return SWIG_SetSize(self->size()); } bool hasNextImpl(const iterator& itr) const { return (itr != $self->end()); } } }; } swig-4.0.2/Lib/java/std_wstring.i0000644000175000017500000001170313667507523016534 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_wstring.i * * Typemaps for std::wstring and const std::wstring& * * These are mapped to a Java String and are passed around by value. * Warning: Unicode / multibyte characters are handled differently on different * OSs so the std::wstring typemaps may not always work as intended. * * To use non-const std::wstring references use the following %apply. Note * that they are passed by value. * %apply const std::wstring & {std::wstring &}; * ----------------------------------------------------------------------------- */ namespace std { %naturalvar wstring; class wstring; // wstring %typemap(jni) wstring "jstring" %typemap(jtype) wstring "String" %typemap(jstype) wstring "String" %typemap(javadirectorin) wstring "$jniinput" %typemap(javadirectorout) wstring "$javacall" %typemap(in) wstring %{if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::wstring"); return $null; } const jchar *$1_pstr = jenv->GetStringChars($input, 0); if (!$1_pstr) return $null; jsize $1_len = jenv->GetStringLength($input); if ($1_len) { $1.reserve($1_len); for (jsize i = 0; i < $1_len; ++i) { $1.push_back((wchar_t)$1_pstr[i]); } } jenv->ReleaseStringChars($input, $1_pstr); %} %typemap(directorout) wstring %{if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::wstring"); return $null; } const jchar *$1_pstr = jenv->GetStringChars($input, 0); if (!$1_pstr) return $null; jsize $1_len = jenv->GetStringLength($input); if ($1_len) { $result.reserve($1_len); for (jsize i = 0; i < $1_len; ++i) { $result.push_back((wchar_t)$1_pstr[i]); } } jenv->ReleaseStringChars($input, $1_pstr); %} %typemap(directorin,descriptor="Ljava/lang/String;") wstring %{ jsize $1_len = $1.length(); jchar *$1_conv_buf = new jchar[$1_len]; for (jsize i = 0; i < $1_len; ++i) { $1_conv_buf[i] = (jchar)$1[i]; } $input = jenv->NewString($1_conv_buf, $1_len); Swig::LocalRefGuard $1_refguard(jenv, $input); delete [] $1_conv_buf; %} %typemap(out) wstring %{jsize $1_len = $1.length(); jchar *conv_buf = new jchar[$1_len]; for (jsize i = 0; i < $1_len; ++i) { conv_buf[i] = (jchar)$1[i]; } $result = jenv->NewString(conv_buf, $1_len); delete [] conv_buf; %} %typemap(javain) wstring "$javainput" %typemap(javaout) wstring { return $jnicall; } //%typemap(typecheck) wstring = wchar_t *; %typemap(throws) wstring %{ std::string message($1.begin(), $1.end()); SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, message.c_str()); return $null; %} // const wstring & %typemap(jni) const wstring & "jstring" %typemap(jtype) const wstring & "String" %typemap(jstype) const wstring & "String" %typemap(javadirectorin) const wstring & "$jniinput" %typemap(javadirectorout) const wstring & "$javacall" %typemap(in) const wstring & %{if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::wstring"); return $null; } const jchar *$1_pstr = jenv->GetStringChars($input, 0); if (!$1_pstr) return $null; jsize $1_len = jenv->GetStringLength($input); std::wstring $1_str; if ($1_len) { $1_str.reserve($1_len); for (jsize i = 0; i < $1_len; ++i) { $1_str.push_back((wchar_t)$1_pstr[i]); } } $1 = &$1_str; jenv->ReleaseStringChars($input, $1_pstr); %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const wstring & %{if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::wstring"); return $null; } const jchar *$1_pstr = jenv->GetStringChars($input, 0); if (!$1_pstr) return $null; jsize $1_len = jenv->GetStringLength($input); /* possible thread/reentrant code problem */ static std::wstring $1_str; if ($1_len) { $1_str.reserve($1_len); for (jsize i = 0; i < $1_len; ++i) { $1_str.push_back((wchar_t)$1_pstr[i]); } } $result = &$1_str; jenv->ReleaseStringChars($input, $1_pstr); %} %typemap(directorin,descriptor="Ljava/lang/String;") const wstring & %{ jsize $1_len = $1.length(); jchar *$1_conv_buf = new jchar[$1_len]; for (jsize i = 0; i < $1_len; ++i) { $1_conv_buf[i] = (jchar)($1)[i]; } $input = jenv->NewString($1_conv_buf, $1_len); Swig::LocalRefGuard $1_refguard(jenv, $input); delete [] $1_conv_buf; %} %typemap(out) const wstring & %{jsize $1_len = $1->length(); jchar *conv_buf = new jchar[$1_len]; for (jsize i = 0; i < $1_len; ++i) { conv_buf[i] = (jchar)(*$1)[i]; } $result = jenv->NewString(conv_buf, $1_len); delete [] conv_buf; %} %typemap(javain) const wstring & "$javainput" %typemap(javaout) const wstring & { return $jnicall; } //%typemap(typecheck) const wstring & = wchar_t *; %typemap(throws) const wstring & %{ std::string message($1.begin(), $1.end()); SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, message.c_str()); return $null; %} } swig-4.0.2/Lib/java/std_unordered_map.i0000644000175000017500000001357713667507523017676 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_unordered_map.i * * SWIG typemaps for std::unordered_map * The Java proxy class extends java.util.AbstractMap. The std::unordered_map * container looks and feels much like a java.util.HashMap from Java. * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::unordered_map // ------------------------------------------------------------------------ %{ #include #include %} %fragment("SWIG_MapSize", "header", fragment="SWIG_JavaIntFromSize_t") { SWIGINTERN jint SWIG_MapSize(size_t size) { jint sz = SWIG_JavaIntFromSize_t(size); if (sz == -1) { throw std::out_of_range("map size is too large to fit into a Java int"); } return sz; } } %javamethodmodifiers std::unordered_map::sizeImpl "private"; %javamethodmodifiers std::unordered_map::containsImpl "private"; %javamethodmodifiers std::unordered_map::putUnchecked "private"; %javamethodmodifiers std::unordered_map::removeUnchecked "private"; %javamethodmodifiers std::unordered_map::find "private"; %javamethodmodifiers std::unordered_map::begin "private"; %javamethodmodifiers std::unordered_map::end "private"; %rename(Iterator) std::unordered_map::iterator; %nodefaultctor std::unordered_map::iterator; %javamethodmodifiers std::unordered_map::iterator::getNextUnchecked "private"; %javamethodmodifiers std::unordered_map::iterator::isNot "private"; %javamethodmodifiers std::unordered_map::iterator::getKey "private"; %javamethodmodifiers std::unordered_map::iterator::getValue "private"; %javamethodmodifiers std::unordered_map::iterator::setValue "private"; namespace std { template class unordered_map { %typemap(javabase) std::unordered_map "java.util.AbstractMap<$typemap(jboxtype, K), $typemap(jboxtype, T)>" %proxycode %{ public int size() { return sizeImpl(); } public boolean containsKey(java.lang.Object key) { if (!(key instanceof $typemap(jboxtype, K))) { return false; } return containsImpl(($typemap(jboxtype, K))key); } public $typemap(jboxtype, T) get(java.lang.Object key) { if (!(key instanceof $typemap(jboxtype, K))) { return null; } Iterator itr = find(($typemap(jboxtype, K)) key); if (itr.isNot(end())) { return itr.getValue(); } return null; } public $typemap(jboxtype, T) put($typemap(jboxtype, K) key, $typemap(jboxtype, T) value) { Iterator itr = find(($typemap(jboxtype, K)) key); if (itr.isNot(end())) { $typemap(jboxtype, T) oldValue = itr.getValue(); itr.setValue(value); return oldValue; } else { putUnchecked(key, value); return null; } } public $typemap(jboxtype, T) remove(java.lang.Object key) { if (!(key instanceof $typemap(jboxtype, K))) { return null; } Iterator itr = find(($typemap(jboxtype, K)) key); if (itr.isNot(end())) { $typemap(jboxtype, T) oldValue = itr.getValue(); removeUnchecked(itr); return oldValue; } else { return null; } } public java.util.Set> entrySet() { java.util.Set> setToReturn = new java.util.HashSet>(); Iterator itr = begin(); final Iterator end = end(); while (itr.isNot(end)) { setToReturn.add(new Entry<$typemap(jboxtype, K), $typemap(jboxtype, T)>() { private Iterator iterator; private Entry<$typemap(jboxtype, K), $typemap(jboxtype, T)> init(Iterator iterator) { this.iterator = iterator; return this; } public $typemap(jboxtype, K) getKey() { return iterator.getKey(); } public $typemap(jboxtype, T) getValue() { return iterator.getValue(); } public $typemap(jboxtype, T) setValue($typemap(jboxtype, T) newValue) { $typemap(jboxtype, T) oldValue = iterator.getValue(); iterator.setValue(newValue); return oldValue; } }.init(itr)); itr = itr.getNextUnchecked(); } return setToReturn; } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; unordered_map(); unordered_map(const unordered_map& other); struct iterator { %typemap(javaclassmodifiers) iterator "protected class" %extend { std::unordered_map< K, T >::iterator getNextUnchecked() { std::unordered_map< K, T >::iterator copy = (*$self); return ++copy; } bool isNot(iterator other) const { return (*$self != other); } K getKey() const { return (*$self)->first; } T getValue() const { return (*$self)->second; } void setValue(const T& newValue) { (*$self)->second = newValue; } } }; %rename(isEmpty) empty; bool empty() const; void clear(); iterator find(const K& key); iterator begin(); iterator end(); %extend { %fragment("SWIG_MapSize"); jint sizeImpl() const throw (std::out_of_range) { return SWIG_MapSize(self->size()); } bool containsImpl(const K& key) { return (self->count(key) > 0); } void putUnchecked(const K& key, const T& value) { (*self)[key] = value; } void removeUnchecked(const std::unordered_map< K, T >::iterator itr) { self->erase(itr); } } }; } swig-4.0.2/Lib/java/std_unordered_set.i0000644000175000017500000001254413667507523017705 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_unordered_set.i * * SWIG typemaps for std::unordered_set * The Java proxy class extends java.util.AbstractSet. The std::unordered_set * container looks and feels much like a java.util.HashSet from Java. * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::unordered_set // ------------------------------------------------------------------------ %{ #include #include %} %fragment("SWIG_UnorderedSetSize", "header", fragment="SWIG_JavaIntFromSize_t") { SWIGINTERN jint SWIG_UnorderedSetSize(size_t size) { jint sz = SWIG_JavaIntFromSize_t(size); if (sz == -1) { throw std::out_of_range("unordered_set size is too large to fit into a Java int"); } return sz; } } %javamethodmodifiers std::unordered_set::sizeImpl "private"; %javamethodmodifiers std::unordered_set::containsImpl "private"; %javamethodmodifiers std::unordered_set::removeImpl "private"; %javamethodmodifiers std::unordered_set::hasNextImpl "private"; %javamethodmodifiers std::unordered_set::begin "private"; %javamethodmodifiers std::unordered_set::end "private"; %rename(Iterator) std::unordered_set::iterator; %nodefaultctor std::unordered_set::iterator; %javamethodmodifiers std::unordered_set::iterator::incrementUnchecked "private"; %javamethodmodifiers std::unordered_set::iterator::derefUnchecked "private"; %javamethodmodifiers std::unordered_set::iterator::isNot "private"; namespace std { template class unordered_set { %typemap(javabase) std::unordered_set "java.util.AbstractSet<$typemap(jboxtype, Key)>" %proxycode %{ public $javaclassname(java.util.Collection collection) { this(); addAll(collection); } public int size() { return sizeImpl(); } public boolean addAll(java.util.Collection collection) { boolean didAddElement = false; for (java.lang.Object object : collection) { didAddElement |= add(($typemap(jboxtype, Key))object); } return didAddElement; } public java.util.Iterator<$typemap(jboxtype, Key)> iterator() { return new java.util.Iterator<$typemap(jboxtype, Key)>() { private Iterator curr; private Iterator end; private java.util.Iterator<$typemap(jboxtype, Key)> init() { curr = $javaclassname.this.begin(); end = $javaclassname.this.end(); return this; } public $typemap(jboxtype, Key) next() { if (!hasNext()) { throw new java.util.NoSuchElementException(); } // Save the current position, increment it, // then return the value at the position before the increment. final $typemap(jboxtype, Key) currValue = curr.derefUnchecked(); curr.incrementUnchecked(); return currValue; } public boolean hasNext() { return curr.isNot(end); } }.init(); } public boolean containsAll(java.util.Collection collection) { for (java.lang.Object object : collection) { if (!contains(object)) { return false; } } return true; } public boolean contains(java.lang.Object object) { if (!(object instanceof $typemap(jboxtype, Key))) { return false; } return containsImpl(($typemap(jboxtype, Key))object); } public boolean removeAll(java.util.Collection collection) { boolean didRemoveElement = false; for (java.lang.Object object : collection) { didRemoveElement |= remove(object); } return didRemoveElement; } public boolean remove(java.lang.Object object) { if (!(object instanceof $typemap(jboxtype, Key))) { return false; } return removeImpl(($typemap(jboxtype, Key))object); } %} public: struct iterator { %typemap(javaclassmodifiers) iterator "protected class" %extend { void incrementUnchecked() { ++(*$self); } Key derefUnchecked() const { return **$self; } bool isNot(iterator other) const { return (*$self != other); } } }; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef Key value_type; typedef Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; unordered_set(); unordered_set(const unordered_set& other); %rename(isEmpty) empty; bool empty() const; void clear(); iterator begin(); iterator end(); %extend { %fragment("SWIG_UnorderedSetSize"); // Returns whether item was inserted. bool add(const Key& key) { return self->insert(key).second; } // Returns whether set contains key. bool containsImpl(const Key& key) { return (self->count(key) > 0); } // Returns whether the item was erased. bool removeImpl(const Key& key) { return (self->erase(key) > 0); } jint sizeImpl() const throw (std::out_of_range) { return SWIG_UnorderedSetSize(self->size()); } bool hasNextImpl(const iterator& itr) const { return (itr != $self->end()); } } }; } swig-4.0.2/Lib/java/enumtypeunsafe.swg0000644000175000017500000000524313667507523017607 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumtypeunsafe.swg * * Include this file in order for C/C++ enums to be wrapped by integers values. * Each enum has an equivalent class named after the enum and the enum items are * wrapped by constant integers within this class. The enum items are not * typesafe as they are all integers. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(jni) const enum SWIGTYPE & "jint" %typemap(jtype) const enum SWIGTYPE & "int" %typemap(jstype) const enum SWIGTYPE & "int" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (jint)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="I") const enum SWIGTYPE & "$input = (jint)$1;" %typemap(javadirectorin) const enum SWIGTYPE & "$jniinput" %typemap(javadirectorout) const enum SWIGTYPE & "$javacall" %typecheck(SWIG_TYPECHECK_INT32) const enum SWIGTYPE & "" %typemap(throws) const enum SWIGTYPE & %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) const enum SWIGTYPE & "$javainput" %typemap(javaout) const enum SWIGTYPE & { return $jnicall; } // enum SWIGTYPE typemaps %typemap(jni) enum SWIGTYPE "jint" %typemap(jtype) enum SWIGTYPE "int" %typemap(jstype) enum SWIGTYPE "int" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (jint)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="I") enum SWIGTYPE "$input = (jint) $1;" %typemap(javadirectorin) enum SWIGTYPE "$jniinput" %typemap(javadirectorout) enum SWIGTYPE "$javacall" %typecheck(SWIG_TYPECHECK_INT32) enum SWIGTYPE "" %typemap(throws) enum SWIGTYPE %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) enum SWIGTYPE "$javainput" %typemap(javaout) enum SWIGTYPE { return $jnicall; } // '$static' will be replaced with either 'static' or nothing depending on whether the enum is an inner Java class or not %typemap(javaclassmodifiers) enum SWIGTYPE "public final $static class" %typemap(javabase) enum SWIGTYPE "" %typemap(javacode) enum SWIGTYPE "" %typemap(javaimports) enum SWIGTYPE "" %typemap(javainterfaces) enum SWIGTYPE "" %typemap(javabody) enum SWIGTYPE "" %javaenum(typeunsafe); swig-4.0.2/Lib/java/boost_intrusive_ptr.i0000644000175000017500000005015413667507523020313 0ustar williamwilliam// Users can provide their own SWIG_INTRUSIVE_PTR_TYPEMAPS or SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP macros before including this file to change the // visibility of the constructor and getCPtr method if desired to public if using multiple modules. #ifndef SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP #define SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(CONST, TYPE...) SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP_IMPLEMENTATION(protected, protected, CONST, TYPE) #endif #ifndef SWIG_INTRUSIVE_PTR_TYPEMAPS #define SWIG_INTRUSIVE_PTR_TYPEMAPS(CONST, TYPE...) SWIG_INTRUSIVE_PTR_TYPEMAPS_IMPLEMENTATION(protected, protected, CONST, TYPE) #endif %include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_INTRUSIVE_PTR_TYPEMAPS_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE "(void)arg1; delete smartarg1;" // Typemap customisations... %typemap(in) CONST TYPE ($&1_type argp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain value argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out, fragment="SWIG_intrusive_deleter") CONST TYPE %{ //plain value(out) $1_ltype* resultp = new $1_ltype(($1_ltype &)$1); intrusive_ptr_add_ref(resultp); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(resultp, SWIG_intrusive_deleter< CONST TYPE >()); %} %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain pointer smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE * %{ //plain pointer(out) #if ($owner) if ($1) { intrusive_ptr_add_ref($1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; #endif %} %typemap(in) CONST TYPE & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain reference $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if(!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE & %{ //plain reference(out) #if ($owner) if ($1) { intrusive_ptr_add_ref($1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; #endif %} %typemap(in) TYPE *CONST& ($*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain pointer by reference temp = ($*1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") TYPE *CONST& %{ // plain pointer by reference(out) #if ($owner) if (*$1) { intrusive_ptr_add_ref(*$1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_0); #endif %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > ($&1_type argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by value smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; if (smartarg) { $1 = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); } %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > %{ if ($1) { intrusive_ptr_add_ref(result.get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(result.get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast ($&1_type smartarg) %{ // shared_ptr by value smartarg = *($&1_ltype*)&$input; if (smartarg) $1 = *smartarg; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ANY_TYPE_SWIGSharedPtrUpcast %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & ($*1_ltype tempnull, $*1_ltype temp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by reference if ( $input ) { smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); $1 = &temp; } else { $1 = &tempnull; } %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ delete &($1); if ($self) { SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * temp = new SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(*$input); $1 = *temp; } %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ if (*$1) { intrusive_ptr_add_ref($1->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * ($*1_ltype tempnull, $*1_ltype temp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by pointer if ( $input ) { smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); $1 = &temp; } else { $1 = &tempnull; } %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ delete $1; if ($self) $1 = new SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(*$input); %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ if ($1 && *$1) { intrusive_ptr_add_ref($1->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } if ($owner) delete $1; %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& (SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > temp, $*1_ltype tempp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by pointer reference smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; if ($input) { temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); } tempp = &temp; $1 = &tempp; %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ if ($self) $1 = *$input; %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ if (*$1 && **$1) { intrusive_ptr_add_ref((*$1)->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >((*$1)->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (jni) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "jlong" %typemap (jtype) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "long" %typemap (jstype) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "$typemap(jstype, TYPE)" %typemap(javain) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "$typemap(jstype, TYPE).getCPtr($javainput)" %typemap(javaout) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) CONST TYPE { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE & { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) TYPE *CONST& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } // Base proxy classes %typemap(javabody) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnBase; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} // Derived proxy classes %typemap(javabody_derived) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnDerived; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { super($imclassname.$javaclazznameSWIGSmartPtrUpcast(cPtr), true); swigCMemOwnDerived = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized") TYPE { if(swigCPtr != 0 && swigCMemOwnBase) { swigCMemOwnBase = false; $jnicall; } swigCPtr = 0; } %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized") TYPE { if(swigCPtr != 0 && swigCMemOwnDerived) { swigCMemOwnDerived = false; $jnicall; } swigCPtr = 0; super.delete(); } // CONST version needed ???? also for C# %typemap(jtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast "long" %typemap(jtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast "long" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %template() SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >; %enddef ///////////////////////////////////////////////////////////////////// %include %define SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor mods %feature("unref") TYPE "(void)arg1; delete smartarg1;" // plain value %typemap(in) CONST TYPE ($&1_type argp = 0) %{ argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} // plain pointer %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} // plain reference %typemap(in) CONST TYPE & %{ $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if (!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast ($&1_type smartarg) %{ // shared_ptr by value smartarg = *($&1_ltype*)&$input; if (smartarg) $1 = *smartarg; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ANY_TYPE_SWIGSharedPtrUpcast %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (jni) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "jlong" %typemap (jtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "long" %typemap (jstype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(jstype, TYPE)" %typemap (javain) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(jstype, TYPE).getCPtr($javainput)" %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) CONST TYPE { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE & { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) TYPE *CONST& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } // Base proxy classes %typemap(javabody) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnBase; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} // Derived proxy classes %typemap(javabody_derived) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnDerived; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { super($imclassname.$javaclazznameSWIGSmartPtrUpcast(cPtr), true); swigCMemOwnDerived = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized") TYPE { if (swigCPtr != 0) { if (swigCMemOwnBase) { swigCMemOwnBase = false; $jnicall; } swigCPtr = 0; } } %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized") TYPE { if (swigCPtr != 0) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $jnicall; } swigCPtr = 0; } super.delete(); } // CONST version needed ???? also for C# %typemap(jtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast "long" %typemap(jtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast "long" // Typecheck typemaps %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *") TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.2/Lib/java/std_common.i0000644000175000017500000000014613667507523016326 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.2/Lib/java/std_except.i0000644000175000017500000000402713667507523016330 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * Typemaps used by the STL wrappers that throw exceptions. * These typemaps are used when methods are declared with an STL exception specification, such as * size_t at() const throw (std::out_of_range); * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws) std::bad_cast "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::bad_exception "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::domain_error "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::exception "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::invalid_argument "SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, $1.what());\n return $null;" %typemap(throws) std::length_error "SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, $1.what());\n return $null;" %typemap(throws) std::logic_error "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::out_of_range "SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, $1.what());\n return $null;" %typemap(throws) std::overflow_error "SWIG_JavaThrowException(jenv, SWIG_JavaArithmeticException, $1.what());\n return $null;" %typemap(throws) std::range_error "SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, $1.what());\n return $null;" %typemap(throws) std::runtime_error "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::underflow_error "SWIG_JavaThrowException(jenv, SWIG_JavaArithmeticException, $1.what());\n return $null;" swig-4.0.2/Lib/java/enumtypesafe.swg0000644000175000017500000001103113667507523017234 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumtypesafe.swg * * Include this file in order for C/C++ enums to be wrapped by the so called * typesafe enum pattern. Each enum has an equivalent Java class named after the * enum and each enum item is a static instance of this class. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(jni) const enum SWIGTYPE & "jint" %typemap(jtype) const enum SWIGTYPE & "int" %typemap(jstype) const enum SWIGTYPE & "$*javaclassname" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (jint)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="L$packagepath/$*javaclassname;") const enum SWIGTYPE & "$input = (jint)$1;" %typemap(javadirectorin) const enum SWIGTYPE & "$*javaclassname.swigToEnum($jniinput)" %typemap(javadirectorout) const enum SWIGTYPE & "($javacall).swigValue()" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(throws) const enum SWIGTYPE & %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) const enum SWIGTYPE & "$javainput.swigValue()" %typemap(javaout) const enum SWIGTYPE & { return $*javaclassname.swigToEnum($jnicall); } // enum SWIGTYPE typemaps %typemap(jni) enum SWIGTYPE "jint" %typemap(jtype) enum SWIGTYPE "int" %typemap(jstype) enum SWIGTYPE "$javaclassname" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (jint)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="L$packagepath/$javaclassname;") enum SWIGTYPE "$input = (jint) $1;" %typemap(javadirectorin) enum SWIGTYPE "$javaclassname.swigToEnum($jniinput)" %typemap(javadirectorout) enum SWIGTYPE "($javacall).swigValue()" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(throws) enum SWIGTYPE %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) enum SWIGTYPE "$javainput.swigValue()" %typemap(javaout) enum SWIGTYPE { return $javaclassname.swigToEnum($jnicall); } // '$static' will be replaced with either 'static' or nothing depending on whether the enum is an inner Java class or not %typemap(javaclassmodifiers) enum SWIGTYPE "public final $static class" %typemap(javabase) enum SWIGTYPE "" %typemap(javacode) enum SWIGTYPE "" %typemap(javaimports) enum SWIGTYPE "" %typemap(javainterfaces) enum SWIGTYPE "" /* * The swigToEnum method is used to find the Java enum from a C++ enum integer value. The default one here takes * advantage of the fact that most enums do not have initial values specified, so the lookup is fast. If initial * values are specified then a lengthy linear search through all possible enums might occur. Specific typemaps could be * written to possibly optimise this lookup by taking advantage of characteristics peculiar to the targeted enum. * The special variable, $enumvalues, is replaced with a comma separated list of all the enum values. */ %typemap(javabody) enum SWIGTYPE %{ public final int swigValue() { return swigValue; } public String toString() { return swigName; } public static $javaclassname swigToEnum(int swigValue) { if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) return swigValues[swigValue]; for (int i = 0; i < swigValues.length; i++) if (swigValues[i].swigValue == swigValue) return swigValues[i]; throw new IllegalArgumentException("No enum " + $javaclassname.class + " with value " + swigValue); } private $javaclassname(String swigName) { this.swigName = swigName; this.swigValue = swigNext++; } private $javaclassname(String swigName, int swigValue) { this.swigName = swigName; this.swigValue = swigValue; swigNext = swigValue+1; } private $javaclassname(String swigName, $javaclassname swigEnum) { this.swigName = swigName; this.swigValue = swigEnum.swigValue; swigNext = this.swigValue+1; } private static $javaclassname[] swigValues = { $enumvalues }; private static int swigNext = 0; private final int swigValue; private final String swigName; %} %javaenum(typesafe); swig-4.0.2/Lib/java/java.swg0000644000175000017500000014457213667507523015471 0ustar williamwilliam/* ----------------------------------------------------------------------------- * java.swg * * Java typemaps * ----------------------------------------------------------------------------- */ %include /* The jni, jtype and jstype typemaps work together and so there should be one of each. * The jni typemap contains the JNI type used in the JNI (C/C++) code. * The jtype typemap contains the Java type used in the JNI intermediary class. * The jstype typemap contains the Java type used in the Java proxy classes, type wrapper classes and module class. */ /* Fragments */ %fragment("SWIG_PackData", "header") { /* Pack binary data into a string */ SWIGINTERN char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } } %fragment("SWIG_UnPackData", "header") { /* Unpack binary data from a string */ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } } %fragment("SWIG_JavaIntFromSize_t", "header") { /* Check for overflow converting to Java int (always signed 32-bit) from (unsigned variable-bit) size_t */ SWIGINTERN jint SWIG_JavaIntFromSize_t(size_t size) { static const jint JINT_MAX = 0x7FFFFFFF; return (size > (size_t)JINT_MAX) ? -1 : (jint)size; } } /* Primitive types */ %typemap(jni) bool, const bool & "jboolean" %typemap(jni) char, const char & "jchar" %typemap(jni) signed char, const signed char & "jbyte" %typemap(jni) unsigned char, const unsigned char & "jshort" %typemap(jni) short, const short & "jshort" %typemap(jni) unsigned short, const unsigned short & "jint" %typemap(jni) int, const int & "jint" %typemap(jni) unsigned int, const unsigned int & "jlong" %typemap(jni) long, const long & "jint" %typemap(jni) unsigned long, const unsigned long & "jlong" %typemap(jni) long long, const long long & "jlong" %typemap(jni) unsigned long long, const unsigned long long & "jobject" %typemap(jni) float, const float & "jfloat" %typemap(jni) double, const double & "jdouble" %typemap(jni) void "void" %typemap(jtype) bool, const bool & "boolean" %typemap(jtype) char, const char & "char" %typemap(jtype) signed char, const signed char & "byte" %typemap(jtype) unsigned char, const unsigned char & "short" %typemap(jtype) short, const short & "short" %typemap(jtype) unsigned short, const unsigned short & "int" %typemap(jtype) int, const int & "int" %typemap(jtype) unsigned int, const unsigned int & "long" %typemap(jtype) long, const long & "int" %typemap(jtype) unsigned long, const unsigned long & "long" %typemap(jtype) long long, const long long & "long" %typemap(jtype) unsigned long long, const unsigned long long & "java.math.BigInteger" %typemap(jtype) float, const float & "float" %typemap(jtype) double, const double & "double" %typemap(jtype) void "void" %typemap(jstype) bool, const bool & "boolean" %typemap(jstype) char, const char & "char" %typemap(jstype) signed char, const signed char & "byte" %typemap(jstype) unsigned char, const unsigned char & "short" %typemap(jstype) short, const short & "short" %typemap(jstype) unsigned short, const unsigned short & "int" %typemap(jstype) int, const int & "int" %typemap(jstype) unsigned int, const unsigned int & "long" %typemap(jstype) long, const long & "int" %typemap(jstype) unsigned long, const unsigned long & "long" %typemap(jstype) long long, const long long & "long" %typemap(jstype) unsigned long long, const unsigned long long & "java.math.BigInteger" %typemap(jstype) float, const float & "float" %typemap(jstype) double, const double & "double" %typemap(jstype) void "void" %typemap(jboxtype) bool, const bool & "Boolean" %typemap(jboxtype) char, const char & "Character" %typemap(jboxtype) signed char, const signed char & "Byte" %typemap(jboxtype) unsigned char, const unsigned char & "Short" %typemap(jboxtype) short, const short & "Short" %typemap(jboxtype) unsigned short, const unsigned short & "Integer" %typemap(jboxtype) int, const int & "Integer" %typemap(jboxtype) unsigned int, const unsigned int & "Long" %typemap(jboxtype) long, const long & "Integer" %typemap(jboxtype) unsigned long, const unsigned long & "Long" %typemap(jboxtype) long long, const long long & "Long" %typemap(jboxtype) unsigned long long, const unsigned long long & "java.math.BigInteger" %typemap(jboxtype) float, const float & "Float" %typemap(jboxtype) double, const double & "Double" %typemap(jni) char *, char *&, char[ANY], char[] "jstring" %typemap(jtype) char *, char *&, char[ANY], char[] "String" %typemap(jstype) char *, char *&, char[ANY], char[] "String" /* JNI types */ %typemap(jni) jboolean "jboolean" %typemap(jni) jchar "jchar" %typemap(jni) jbyte "jbyte" %typemap(jni) jshort "jshort" %typemap(jni) jint "jint" %typemap(jni) jlong "jlong" %typemap(jni) jfloat "jfloat" %typemap(jni) jdouble "jdouble" %typemap(jni) jstring "jstring" %typemap(jni) jobject "jobject" %typemap(jni) jbooleanArray "jbooleanArray" %typemap(jni) jcharArray "jcharArray" %typemap(jni) jbyteArray "jbyteArray" %typemap(jni) jshortArray "jshortArray" %typemap(jni) jintArray "jintArray" %typemap(jni) jlongArray "jlongArray" %typemap(jni) jfloatArray "jfloatArray" %typemap(jni) jdoubleArray "jdoubleArray" %typemap(jni) jobjectArray "jobjectArray" %typemap(jtype) jboolean "boolean" %typemap(jtype) jchar "char" %typemap(jtype) jbyte "byte" %typemap(jtype) jshort "short" %typemap(jtype) jint "int" %typemap(jtype) jlong "long" %typemap(jtype) jfloat "float" %typemap(jtype) jdouble "double" %typemap(jtype) jstring "String" %typemap(jtype) jobject "java.lang.Object" %typemap(jtype) jbooleanArray "boolean[]" %typemap(jtype) jcharArray "char[]" %typemap(jtype) jbyteArray "byte[]" %typemap(jtype) jshortArray "short[]" %typemap(jtype) jintArray "int[]" %typemap(jtype) jlongArray "long[]" %typemap(jtype) jfloatArray "float[]" %typemap(jtype) jdoubleArray "double[]" %typemap(jtype) jobjectArray "java.lang.Object[]" %typemap(jstype) jboolean "boolean" %typemap(jstype) jchar "char" %typemap(jstype) jbyte "byte" %typemap(jstype) jshort "short" %typemap(jstype) jint "int" %typemap(jstype) jlong "long" %typemap(jstype) jfloat "float" %typemap(jstype) jdouble "double" %typemap(jstype) jstring "String" %typemap(jstype) jobject "java.lang.Object" %typemap(jstype) jbooleanArray "boolean[]" %typemap(jstype) jcharArray "char[]" %typemap(jstype) jbyteArray "byte[]" %typemap(jstype) jshortArray "short[]" %typemap(jstype) jintArray "int[]" %typemap(jstype) jlongArray "long[]" %typemap(jstype) jfloatArray "float[]" %typemap(jstype) jdoubleArray "double[]" %typemap(jstype) jobjectArray "java.lang.Object[]" /* Non primitive types */ %typemap(jni) SWIGTYPE "jlong" %typemap(jtype) SWIGTYPE "long" %typemap(jstype) SWIGTYPE "$&javaclassname" %typemap(jboxtype) SWIGTYPE "$typemap(jstype, $1_type)" %typemap(jni) SWIGTYPE [] "jlong" %typemap(jtype) SWIGTYPE [] "long" %typemap(jstype) SWIGTYPE [] "$javaclassname" %typemap(jni) SWIGTYPE * "jlong" %typemap(jtype) SWIGTYPE * "long" %typemap(jstype) SWIGTYPE * "$javaclassname" %typemap(jni) SWIGTYPE & "jlong" %typemap(jtype) SWIGTYPE & "long" %typemap(jstype) SWIGTYPE & "$javaclassname" %typemap(jni) SWIGTYPE && "jlong" %typemap(jtype) SWIGTYPE && "long" %typemap(jstype) SWIGTYPE && "$javaclassname" /* pointer to a class member */ %typemap(jni) SWIGTYPE (CLASS::*) "jstring" %typemap(jtype) SWIGTYPE (CLASS::*) "String" %typemap(jstype) SWIGTYPE (CLASS::*) "$javaclassname" /* The following are the in, out, freearg, argout typemaps. These are the JNI code generating typemaps for converting from Java to C and visa versa. */ /* primitive types */ %typemap(in) bool %{ $1 = $input ? true : false; %} %typemap(directorout) bool %{ $result = $input ? true : false; %} %typemap(javadirectorin) bool "$jniinput" %typemap(javadirectorout) bool "$javacall" %typemap(in) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, float, double %{ $1 = ($1_ltype)$input; %} %typemap(directorout) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, float, double %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="Z") bool "$input = (jboolean) $1;" %typemap(directorin, descriptor="C") char "$input = (jint) $1;" %typemap(directorin, descriptor="B") signed char "$input = (jbyte) $1;" %typemap(directorin, descriptor="S") unsigned char "$input = (jshort) $1;" %typemap(directorin, descriptor="S") short "$input = (jshort) $1;" %typemap(directorin, descriptor="I") unsigned short "$input = (jint) $1;" %typemap(directorin, descriptor="I") int "$input = (jint) $1;" %typemap(directorin, descriptor="J") unsigned int "$input = (jlong) $1;" %typemap(directorin, descriptor="I") long "$input = (jint) $1;" %typemap(directorin, descriptor="J") unsigned long "$input = (jlong) $1;" %typemap(directorin, descriptor="J") long long "$input = (jlong) $1;" %typemap(directorin, descriptor="F") float "$input = (jfloat) $1;" %typemap(directorin, descriptor="D") double "$input = (jdouble) $1;" %typemap(javadirectorin) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, float, double "$jniinput" %typemap(javadirectorout) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, float, double "$javacall" %typemap(out) bool %{ $result = (jboolean)$1; %} %typemap(out) char %{ $result = (jchar)$1; %} %typemap(out) signed char %{ $result = (jbyte)$1; %} %typemap(out) unsigned char %{ $result = (jshort)$1; %} %typemap(out) short %{ $result = (jshort)$1; %} %typemap(out) unsigned short %{ $result = (jint)$1; %} %typemap(out) int %{ $result = (jint)$1; %} %typemap(out) unsigned int %{ $result = (jlong)$1; %} %typemap(out) long %{ $result = (jint)$1; %} %typemap(out) unsigned long %{ $result = (jlong)$1; %} %typemap(out) long long %{ $result = (jlong)$1; %} %typemap(out) float %{ $result = (jfloat)$1; %} %typemap(out) double %{ $result = (jdouble)$1; %} /* unsigned long long */ /* Convert from BigInteger using the toByteArray member function */ %typemap(in) unsigned long long { jclass clazz; jmethodID mid; jbyteArray ba; jbyte* bae; jsize sz; int i; if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "BigInteger null"); return $null; } clazz = JCALL1(GetObjectClass, jenv, $input); mid = JCALL3(GetMethodID, jenv, clazz, "toByteArray", "()[B"); ba = (jbyteArray)JCALL2(CallObjectMethod, jenv, $input, mid); bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); $1 = 0; if (sz > 0) { $1 = ($1_type)(signed char)bae[0]; for(i=1; i 0) { $result = ($1_type)(signed char)bae[0]; for(i=1; i", "([B)V"); jobject bigint; int i; bae[0] = 0; for(i=1; i<9; i++ ) { bae[i] = (jbyte)($1>>8*(8-i)); } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); bigint = JCALL3(NewObject, jenv, clazz, mid, ba); JCALL1(DeleteLocalRef, jenv, ba); $result = bigint; } /* Convert to BigInteger (see out typemap) */ %typemap(directorin, descriptor="Ljava/math/BigInteger;", noblock=1) unsigned long long, const unsigned long long & { { jbyteArray ba = JCALL1(NewByteArray, jenv, 9); jbyte* bae = JCALL2(GetByteArrayElements, jenv, ba, 0); jclass clazz = JCALL1(FindClass, jenv, "java/math/BigInteger"); jmethodID mid = JCALL3(GetMethodID, jenv, clazz, "", "([B)V"); jobject bigint; int swig_i; bae[0] = 0; for(swig_i=1; swig_i<9; swig_i++ ) { bae[swig_i] = (jbyte)($1>>8*(8-swig_i)); } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); bigint = JCALL3(NewObject, jenv, clazz, mid, ba); JCALL1(DeleteLocalRef, jenv, ba); $input = bigint; } Swig::LocalRefGuard $1_refguard(jenv, $input); } %typemap(javadirectorin) unsigned long long "$jniinput" %typemap(javadirectorout) unsigned long long "$javacall" /* char * - treat as String */ %typemap(in, noblock=1) char * { $1 = 0; if ($input) { $1 = ($1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!$1) return $null; } } %typemap(directorout, noblock=1, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) char * { $1 = 0; if ($input) { $result = ($1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!$result) return $null; } } %typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * { $input = 0; if ($1) { $input = JCALL1(NewStringUTF, jenv, (const char *)$1); if (!$input) return $null; } Swig::LocalRefGuard $1_refguard(jenv, $input); } %typemap(freearg, noblock=1) char * { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)$1); } %typemap(out, noblock=1) char * { if ($1) $result = JCALL1(NewStringUTF, jenv, (const char *)$1); } %typemap(javadirectorin) char * "$jniinput" %typemap(javadirectorout) char * "$javacall" /* char *& - treat as String */ %typemap(in, noblock=1) char *& ($*1_ltype temp = 0) { $1 = 0; if ($input) { temp = ($*1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!temp) return $null; } $1 = &temp; } %typemap(freearg, noblock=1) char *& { if ($1 && *$1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)*$1); } %typemap(out, noblock=1) char *& { if (*$1) $result = JCALL1(NewStringUTF, jenv, (const char *)*$1); } %typemap(out) void "" %typemap(javadirectorin) void "$jniinput" %typemap(javadirectorout) void "$javacall" %typemap(directorin, descriptor="V") void "" /* primitive types by reference */ %typemap(in) const bool & ($*1_ltype temp) %{ temp = $input ? true : false; $1 = &temp; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const bool & %{ static $*1_ltype temp; temp = $input ? true : false; $result = &temp; %} %typemap(javadirectorin) const bool & "$jniinput" %typemap(javadirectorout) const bool & "$javacall" %typemap(in) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const float &, const double & %{ static $*1_ltype temp; temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="Z") const bool & "$input = (jboolean)$1;" %typemap(directorin, descriptor="C") const char & "$input = (jchar)$1;" %typemap(directorin, descriptor="B") const signed char & "$input = (jbyte)$1;" %typemap(directorin, descriptor="S") const unsigned char & "$input = (jshort)$1;" %typemap(directorin, descriptor="S") const short & "$input = (jshort)$1;" %typemap(directorin, descriptor="I") const unsigned short & "$input = (jint)$1;" %typemap(directorin, descriptor="I") const int & "$input = (jint)$1;" %typemap(directorin, descriptor="J") const unsigned int & "$input = (jlong)$1;" %typemap(directorin, descriptor="I") const long & "$input = (jint)$1;" %typemap(directorin, descriptor="J") const unsigned long & "$input = (jlong)$1;" %typemap(directorin, descriptor="J") const long long & "$input = (jlong)$1;" %typemap(directorin, descriptor="F") const float & "$input = (jfloat)$1;" %typemap(directorin, descriptor="D") const double & "$input = (jdouble)$1;" %typemap(javadirectorin) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) "$jniinput" %typemap(javadirectorout) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) "$javacall" %typemap(out) const bool & %{ $result = (jboolean)*$1; %} %typemap(out) const char & %{ $result = (jchar)*$1; %} %typemap(out) const signed char & %{ $result = (jbyte)*$1; %} %typemap(out) const unsigned char & %{ $result = (jshort)*$1; %} %typemap(out) const short & %{ $result = (jshort)*$1; %} %typemap(out) const unsigned short & %{ $result = (jint)*$1; %} %typemap(out) const int & %{ $result = (jint)*$1; %} %typemap(out) const unsigned int & %{ $result = (jlong)*$1; %} %typemap(out) const long & %{ $result = (jint)*$1; %} %typemap(out) const unsigned long & %{ $result = (jlong)*$1; %} %typemap(out) const long long & %{ $result = (jlong)*$1; %} %typemap(out) const float & %{ $result = (jfloat)*$1; %} %typemap(out) const double & %{ $result = (jdouble)*$1; %} /* const unsigned long long & */ /* Similar to unsigned long long */ %typemap(in) const unsigned long long & ($*1_ltype temp) { jclass clazz; jmethodID mid; jbyteArray ba; jbyte* bae; jsize sz; int i; if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "BigInteger null"); return $null; } clazz = JCALL1(GetObjectClass, jenv, $input); mid = JCALL3(GetMethodID, jenv, clazz, "toByteArray", "()[B"); ba = (jbyteArray)JCALL2(CallObjectMethod, jenv, $input, mid); bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); $1 = &temp; temp = 0; if (sz > 0) { temp = ($*1_ltype)(signed char)bae[0]; for(i=1; i 0) { temp = ($*1_ltype)(signed char)bae[0]; for(i=1; i", "([B)V"); jobject bigint; int i; bae[0] = 0; for(i=1; i<9; i++ ) { bae[i] = (jbyte)(*$1>>8*(8-i)); } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); bigint = JCALL3(NewObject, jenv, clazz, mid, ba); JCALL1(DeleteLocalRef, jenv, ba); $result = bigint; } %typemap(javadirectorin) const unsigned long long & "$jniinput" %typemap(javadirectorout) const unsigned long long & "$javacall" /* Default handling. Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_type argp) %{ argp = *($&1_ltype*)&$input; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(directorout) SWIGTYPE ($&1_type argp) %{ argp = *($&1_ltype*)&$input; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Unexpected null return for type $1_type"); return $null; } $result = *argp; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{ *($&1_ltype*)&$result = new $1_ltype((const $1_ltype &)$1); %} #else { $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); *($&1_ltype*)&$result = $1ptr; } #endif %typemap(directorin,descriptor="L$packagepath/$&javaclassname;") SWIGTYPE %{ $input = 0; *(($&1_ltype*)&$input) = new $1_ltype((const $1_ltype &)$1); %} %typemap(javadirectorin) SWIGTYPE "new $&javaclassname($jniinput, true)" %typemap(javadirectorout) SWIGTYPE "$&javaclassname.getCPtr($javacall)" /* Generic pointers and references */ %typemap(in) SWIGTYPE * %{ $1 = *($&1_ltype)&$input; %} %typemap(in, fragment="SWIG_UnPackData") SWIGTYPE (CLASS::*) { const char *temp = 0; if ($input) { temp = JCALL2(GetStringUTFChars, jenv, $input, 0); if (!temp) return $null; } SWIG_UnpackData(temp, (void *)&$1, sizeof($1)); } %typemap(in) SWIGTYPE & %{ $1 = *($&1_ltype)&$input; if (!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(in) SWIGTYPE && %{ $1 = *($&1_ltype)&$input; if (!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(out) SWIGTYPE * %{ *($&1_ltype)&$result = $1; %} %typemap(out, fragment="SWIG_PackData", noblock=1) SWIGTYPE (CLASS::*) { char buf[128]; char *data = SWIG_PackData(buf, (void *)&$1, sizeof($1)); *data = '\0'; $result = JCALL1(NewStringUTF, jenv, buf); } %typemap(out) SWIGTYPE & %{ *($&1_ltype)&$result = $1; %} %typemap(out) SWIGTYPE && %{ *($&1_ltype)&$result = $1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE * %{ $result = *($&1_ltype)&$input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE (CLASS::*) %{ $result = *($&1_ltype)&$input; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") SWIGTYPE * %{ *(($&1_ltype)&$input) = ($1_ltype) $1; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") SWIGTYPE (CLASS::*) %{ *(($&1_ltype)&$input) = ($1_ltype) $1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE & %{ if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Unexpected null return for type $1_type"); return $null; } $result = *($&1_ltype)&$input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE && %{ if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Unexpected null return for type $1_type"); return $null; } $result = *($&1_ltype)&$input; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") SWIGTYPE & %{ *($&1_ltype)&$input = ($1_ltype) &$1; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") SWIGTYPE && %{ *($&1_ltype)&$input = ($1_ltype) &$1; %} %typemap(javadirectorin) SWIGTYPE *, SWIGTYPE (CLASS::*) "($jniinput == 0) ? null : new $javaclassname($jniinput, false)" %typemap(javadirectorin) SWIGTYPE & "new $javaclassname($jniinput, false)" %typemap(javadirectorin) SWIGTYPE && "new $javaclassname($jniinput, false)" %typemap(javadirectorout) SWIGTYPE *, SWIGTYPE (CLASS::*), SWIGTYPE &, SWIGTYPE && "$javaclassname.getCPtr($javacall)" /* Default array handling */ %typemap(in) SWIGTYPE [] %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE [] %{ *($&1_ltype)&$result = $1; %} %typemap(freearg) SWIGTYPE [ANY], SWIGTYPE [] "" /* char arrays - treat as String */ %typemap(in, noblock=1) char[ANY], char[] { $1 = 0; if ($input) { $1 = ($1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!$1) return $null; } } %typemap(directorout, noblock=1) char[ANY], char[] { $1 = 0; if ($input) { $result = ($1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!$result) return $null; } } %typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char[ANY], char[] { $input = 0; if ($1) { $input = JCALL1(NewStringUTF, jenv, (const char *)$1); if (!$input) return $null; } Swig::LocalRefGuard $1_refguard(jenv, $input); } %typemap(argout) char[ANY], char[] "" %typemap(freearg, noblock=1) char[ANY], char[] { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)$1); } %typemap(out, noblock=1) char[ANY], char[] { if ($1) $result = JCALL1(NewStringUTF, jenv, (const char *)$1); } %typemap(javadirectorin) char[ANY], char[] "$jniinput" %typemap(javadirectorout) char[ANY], char[] "$javacall" /* JNI types */ %typemap(in) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray %{ $1 = $input; %} %typemap(directorout) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray %{ $result = $input; %} %typemap(out) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray %{ $result = $1; %} %typemap(directorin,descriptor="Z") jboolean "$input = $1;" %typemap(directorin,descriptor="C") jchar "$input = $1;" %typemap(directorin,descriptor="B") jbyte "$input = $1;" %typemap(directorin,descriptor="S") jshort "$input = $1;" %typemap(directorin,descriptor="I") jint "$input = $1;" %typemap(directorin,descriptor="J") jlong "$input = $1;" %typemap(directorin,descriptor="F") jfloat "$input = $1;" %typemap(directorin,descriptor="D") jdouble "$input = $1;" %typemap(directorin,descriptor="Ljava/lang/String;") jstring "$input = $1;" %typemap(directorin,descriptor="Ljava/lang/Object;",nouse="1") jobject "$input = $1;" %typemap(directorin,descriptor="[Z") jbooleanArray "$input = $1;" %typemap(directorin,descriptor="[C") jcharArray "$input = $1;" %typemap(directorin,descriptor="[B") jbyteArray "$input = $1;" %typemap(directorin,descriptor="[S") jshortArray "$input = $1;" %typemap(directorin,descriptor="[I") jintArray "$input = $1;" %typemap(directorin,descriptor="[J") jlongArray "$input = $1;" %typemap(directorin,descriptor="[F") jfloatArray "$input = $1;" %typemap(directorin,descriptor="[D") jdoubleArray "$input = $1;" %typemap(directorin,descriptor="[Ljava/lang/Object;",nouse="1") jobjectArray "$input = $1;" %typemap(javadirectorin) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray "$jniinput" %typemap(javadirectorout) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray "$javacall" /* Typecheck typemaps - The purpose of these is merely to issue a warning for overloaded C++ functions * that cannot be overloaded in Java as more than one C++ type maps to a single Java type */ %typecheck(SWIG_TYPECHECK_BOOL) /* Java boolean */ jboolean, bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) /* Java char */ jchar, char, const char & "" %typecheck(SWIG_TYPECHECK_INT8) /* Java byte */ jbyte, signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_INT16) /* Java short */ jshort, unsigned char, short, const unsigned char &, const short & "" %typecheck(SWIG_TYPECHECK_INT32) /* Java int */ jint, unsigned short, int, long, const unsigned short &, const int &, const long & "" %typecheck(SWIG_TYPECHECK_INT64) /* Java long */ jlong, unsigned int, unsigned long, long long, const unsigned int &, const unsigned long &, const long long & "" %typecheck(SWIG_TYPECHECK_INT128) /* Java BigInteger */ unsigned long long, const unsigned long long & "" %typecheck(SWIG_TYPECHECK_FLOAT) /* Java float */ jfloat, float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) /* Java double */ jdouble, double, const double & "" %typecheck(SWIG_TYPECHECK_STRING) /* Java String */ jstring, char *, char *&, char[ANY], char [] "" %typecheck(SWIG_TYPECHECK_BOOL_ARRAY) /* Java boolean[] */ jbooleanArray "" %typecheck(SWIG_TYPECHECK_CHAR_ARRAY) /* Java char[] */ jcharArray "" %typecheck(SWIG_TYPECHECK_INT8_ARRAY) /* Java byte[] */ jbyteArray "" %typecheck(SWIG_TYPECHECK_INT16_ARRAY) /* Java short[] */ jshortArray "" %typecheck(SWIG_TYPECHECK_INT32_ARRAY) /* Java int[] */ jintArray "" %typecheck(SWIG_TYPECHECK_INT64_ARRAY) /* Java long[] */ jlongArray "" %typecheck(SWIG_TYPECHECK_FLOAT_ARRAY) /* Java float[] */ jfloatArray "" %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY) /* Java double[] */ jdoubleArray "" %typecheck(SWIG_TYPECHECK_OBJECT_ARRAY) /* Java jobject[] */ jobjectArray "" %typecheck(SWIG_TYPECHECK_POINTER) /* Default */ SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *const&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" /* Exception handling */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short %{ char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, error_msg); return $null; %} %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); return $null; %} %typemap(throws) char * %{ SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1); return $null; %} /* For methods to raise/throw the original Java exception thrown in a director method */ %typemap(throws) Swig::DirectorException %{ $1.throwException(jenv); return $null; %} /* Java to C++ DirectorException should already be handled. Suppress warning and do nothing in the event a user specifies a global: %catches(Swig::DirectorException); */ %typemap(directorthrows) Swig::DirectorException "" /* Typemaps for code generation in proxy classes and Java type wrapper classes */ /* The javain typemap is used for converting function parameter types from the type * used in the proxy, module or type wrapper class to the type used in the JNI class. */ %typemap(javain) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double & "$javainput" %typemap(javain) char *, char *&, char[ANY], char[] "$javainput" %typemap(javain) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray "$javainput" %typemap(javain) SWIGTYPE "$&javaclassname.getCPtr($javainput)" %typemap(javain) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "$javaclassname.getCPtr($javainput)" %typemap(javain) SWIGTYPE (CLASS::*) "$javaclassname.getCMemberPtr($javainput)" /* The javaout typemap is used for converting function return types from the return type * used in the JNI class to the type returned by the proxy, module or type wrapper class. */ %typemap(javaout) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double & { return $jnicall; } %typemap(javaout) char *, char *&, char[ANY], char[] { return $jnicall; } %typemap(javaout) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray { return $jnicall; } %typemap(javaout) void { $jnicall; } %typemap(javaout) SWIGTYPE { return new $&javaclassname($jnicall, true); } %typemap(javaout) SWIGTYPE & { return new $javaclassname($jnicall, $owner); } %typemap(javaout) SWIGTYPE && { return new $javaclassname($jnicall, $owner); } %typemap(javaout) SWIGTYPE *, SWIGTYPE [] { long cPtr = $jnicall; return (cPtr == 0) ? null : new $javaclassname(cPtr, $owner); } %typemap(javaout) SWIGTYPE (CLASS::*) { String cMemberPtr = $jnicall; return (cMemberPtr == null) ? null : new $javaclassname(cMemberPtr, $owner); } /* Pointer reference typemaps */ %typemap(jni) SWIGTYPE *const& "jlong" %typemap(jtype) SWIGTYPE *const& "long" %typemap(jstype) SWIGTYPE *const& "$*javaclassname" %typemap(javain) SWIGTYPE *const& "$*javaclassname.getCPtr($javainput)" %typemap(javaout) SWIGTYPE *const& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $*javaclassname(cPtr, $owner); } %typemap(in) SWIGTYPE *const& ($*1_ltype temp = 0) %{ temp = *($1_ltype)&$input; $1 = ($1_ltype)&temp; %} %typemap(out) SWIGTYPE *const& %{ *($1_ltype)&$result = *$1; %} %typemap(directorin,descriptor="L$packagepath/$*javaclassname;") SWIGTYPE *const& %{ *(($1_ltype)&$input) = ($*1_ltype) $1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) SWIGTYPE *const& %{ static $*1_ltype swig_temp; swig_temp = *($1_ltype)&$input; $result = &swig_temp; %} %typemap(javadirectorin) SWIGTYPE *const& "($jniinput == 0) ? null : new $*javaclassname($jniinput, false)" %typemap(javadirectorout) SWIGTYPE *const& "$*javaclassname.getCPtr($javacall)" /* Typemaps used for the generation of proxy and type wrapper class code */ %typemap(javabase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(javaclassmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public class" %typemap(javacode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(javaimports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(javainterfaces) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" /* javabody typemaps */ %define SWIG_JAVABODY_METHODS(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) SWIG_JAVABODY_PROXY(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE) %enddef // legacy name %define SWIG_JAVABODY_PROXY(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) // Base proxy classes %typemap(javabody) TYPE %{ private transient long swigCPtr; protected transient boolean swigCMemOwn; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} // Derived proxy classes %typemap(javabody_derived) TYPE %{ private transient long swigCPtr; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { super($imclassname.$javaclazznameSWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %enddef %define SWIG_JAVABODY_TYPEWRAPPER(PTRCTOR_VISIBILITY, DEFAULTCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) // Typewrapper classes %typemap(javabody) TYPE *, TYPE &, TYPE &&, TYPE [] %{ private transient long swigCPtr; PTRCTOR_VISIBILITY $javaclassname(long cPtr, @SuppressWarnings("unused") boolean futureUse) { swigCPtr = cPtr; } DEFAULTCTOR_VISIBILITY $javaclassname() { swigCPtr = 0; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %typemap(javabody) TYPE (CLASS::*) %{ private transient String swigCMemberPtr; PTRCTOR_VISIBILITY $javaclassname(String cMemberPtr, @SuppressWarnings("unused") boolean futureUse) { swigCMemberPtr = cMemberPtr; } DEFAULTCTOR_VISIBILITY $javaclassname() { swigCMemberPtr = null; } CPTR_VISIBILITY static String getCMemberPtr($javaclassname obj) { return obj.swigCMemberPtr; } %} %enddef /* Set the default javabody typemaps to use protected visibility. Use the macros to change to public if using multiple modules. */ SWIG_JAVABODY_PROXY(protected, protected, SWIGTYPE) SWIG_JAVABODY_TYPEWRAPPER(protected, protected, protected, SWIGTYPE) %typemap(javafinalize) SWIGTYPE %{ @SuppressWarnings("deprecation") protected void finalize() { delete(); } %} /* * Java constructor typemaps: * * The javaconstruct typemap is inserted when a proxy class's constructor is generated. * This typemap allows control over what code is executed in the constructor as * well as specifying who owns the underlying C/C++ object. Normally, Java has * ownership and the underlying C/C++ object is deallocated when the Java object * is finalized (swigCMemOwn is true.) If swigCMemOwn is false, C/C++ is * ultimately responsible for deallocating the underlying object's memory. * * The SWIG_PROXY_CONSTRUCTOR macro defines the javaconstruct typemap for a proxy * class for a particular TYPENAME. OWNERSHIP is passed as the value of * swigCMemOwn to the pointer constructor method. WEAKREF determines which kind * of Java object reference will be used by the C++ director class (WeakGlobalRef * vs. GlobalRef.) * * The SWIG_DIRECTOR_OWNED macro sets the ownership of director-based proxy * classes and the weak reference flag to false, meaning that the underlying C++ * object will be reclaimed by C++. */ %define SWIG_PROXY_CONSTRUCTOR(OWNERSHIP, WEAKREF, TYPENAME...) %typemap(javaconstruct,directorconnect="\n $imclassname.$javaclazznamedirector_connect(this, swigCPtr, OWNERSHIP, WEAKREF);") TYPENAME { this($imcall, OWNERSHIP);$directorconnect } %enddef %define SWIG_DIRECTOR_OWNED(TYPENAME...) SWIG_PROXY_CONSTRUCTOR(true, false, TYPENAME) %enddef // Set the default for SWIGTYPE: Java owns the C/C++ object. SWIG_PROXY_CONSTRUCTOR(true, true, SWIGTYPE) %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized", parameters="") SWIGTYPE { if (swigCPtr != 0) { if (swigCMemOwn) { swigCMemOwn = false; $jnicall; } swigCPtr = 0; } } %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized", parameters="") SWIGTYPE { if (swigCPtr != 0) { if (swigCMemOwn) { swigCMemOwn = false; $jnicall; } swigCPtr = 0; } super.delete(); } %typemap(directordisconnect, methodname="swigDirectorDisconnect") SWIGTYPE %{ protected void $methodname() { swigCMemOwn = false; $jnicall; } %} %typemap(directorowner_release, methodname="swigReleaseOwnership") SWIGTYPE %{ public void $methodname() { swigCMemOwn = false; $jnicall; } %} %typemap(directorowner_take, methodname="swigTakeOwnership") SWIGTYPE %{ public void $methodname() { swigCMemOwn = true; $jnicall; } %} /* Java specific directives */ #define %javaconst(flag) %feature("java:const","flag") #define %javaconstvalue(value) %feature("java:constvalue",value) #define %javaenum(wrapapproach) %feature("java:enum","wrapapproach") #define %javamethodmodifiers %feature("java:methodmodifiers") #define %javaexception(exceptionclasses) %feature("except",throws=exceptionclasses) #define %nojavaexception %feature("except","0",throws="") #define %clearjavaexception %feature("except","",throws="") #define %proxycode %insert("proxycode") %pragma(java) jniclassclassmodifiers="public class" %pragma(java) moduleclassmodifiers="public class" /* Some ANSI C typemaps */ %apply unsigned long { size_t }; %apply const unsigned long & { const size_t & }; /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* String & length */ %typemap(jni) (const char *STRING, size_t LENGTH) "jbyteArray" %typemap(jtype) (const char *STRING, size_t LENGTH) "byte[]" %typemap(jstype) (const char *STRING, size_t LENGTH) "byte[]" %typemap(javain) (const char *STRING, size_t LENGTH) "$javainput" %typemap(freearg) (const char *STRING, size_t LENGTH) "" %typemap(in) (const char *STRING, size_t LENGTH) { if ($input) { $1 = ($1_ltype) JCALL2(GetByteArrayElements, jenv, $input, 0); $2 = ($2_type) JCALL1(GetArrayLength, jenv, $input); } else { $1 = 0; $2 = 0; } } %typemap(argout) (const char *STRING, size_t LENGTH) { if ($input) JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *)$1, JNI_ABORT); } %typemap(directorin, descriptor="[B", noblock=1) (const char *STRING, size_t LENGTH) { $input = 0; if ($1) { $input = JCALL1(NewByteArray, jenv, (jsize)$2); if (!$input) return $null; JCALL4(SetByteArrayRegion, jenv, $input, 0, (jsize)$2, (jbyte *)$1); } Swig::LocalRefGuard $1_refguard(jenv, $input); } %typemap(javadirectorin, descriptor="[B") (const char *STRING, size_t LENGTH) "$jniinput" %apply (const char *STRING, size_t LENGTH) { (char *STRING, size_t LENGTH) } /* Enable write-back for non-const version */ %typemap(argout) (char *STRING, size_t LENGTH) { if ($input) JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *)$1, 0); } %typemap(directorargout, noblock=1) (char *STRING, size_t LENGTH) { if ($input && $1) JCALL4(GetByteArrayRegion, jenv, $input, 0, (jsize)$2, (jbyte *)$1); } %apply (char *STRING, size_t LENGTH) { (char *STRING, int LENGTH) } /* java keywords */ %include // Default enum handling %include swig-4.0.2/Lib/java/typemaps.i0000644000175000017500000004567113667507523016042 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* INPUT typemaps -------------- These typemaps remap a C pointer or C++ reference to be an "INPUT" value which is passed by value instead of reference. The following typemaps can be applied to turn a pointer or reference into a simple input value. That is, instead of passing a pointer or reference to an object, you would use a real value instead. bool *INPUT, bool &INPUT signed char *INPUT, signed char &INPUT unsigned char *INPUT, unsigned char &INPUT short *INPUT, short &INPUT unsigned short *INPUT, unsigned short &INPUT int *INPUT, int &INPUT unsigned int *INPUT, unsigned int &INPUT long *INPUT, long &INPUT unsigned long *INPUT, unsigned long &INPUT long long *INPUT, long long &INPUT unsigned long long *INPUT, unsigned long long &INPUT float *INPUT, float &INPUT double *INPUT, double &INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); In Java you could then use it like this: double answer = modulename.fadd(10.0, 20.0); There are no char *INPUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *INPUT {char *input}; void f(char *input); */ %define INPUT_TYPEMAP(TYPE, JNITYPE, JTYPE, JNIDESC) %typemap(jni) TYPE *INPUT, TYPE &INPUT "JNITYPE" %typemap(jtype) TYPE *INPUT, TYPE &INPUT "JTYPE" %typemap(jstype) TYPE *INPUT, TYPE &INPUT "JTYPE" %typemap(javain) TYPE *INPUT, TYPE &INPUT "$javainput" %typemap(in) TYPE *INPUT, TYPE &INPUT %{ $1 = ($1_ltype)&$input; %} %typemap(freearg) TYPE *INPUT, TYPE &INPUT "" %typemap(typecheck) TYPE *INPUT = TYPE; %typemap(typecheck) TYPE &INPUT = TYPE; %enddef INPUT_TYPEMAP(bool, jboolean, boolean, "Z"); INPUT_TYPEMAP(signed char, jbyte, byte, "B"); INPUT_TYPEMAP(unsigned char, jshort, short, "S"); INPUT_TYPEMAP(short, jshort, short, "S"); INPUT_TYPEMAP(unsigned short, jint, int, "I"); INPUT_TYPEMAP(int, jint, int, "I"); INPUT_TYPEMAP(unsigned int, jlong, long, "J"); INPUT_TYPEMAP(long, jint, int, "I"); INPUT_TYPEMAP(unsigned long, jlong, long, "J"); INPUT_TYPEMAP(long long, jlong, long, "J"); INPUT_TYPEMAP(unsigned long long, jobject, java.math.BigInteger, "Ljava/math/BigInteger;"); INPUT_TYPEMAP(float, jfloat, float, "F"); INPUT_TYPEMAP(double, jdouble, double, "D"); #undef INPUT_TYPEMAP /* Convert from BigInteger using the toByteArray member function */ /* Overrides the typemap in the INPUT_TYPEMAP macro */ %typemap(in) unsigned long long *INPUT($*1_ltype temp), unsigned long long &INPUT($*1_ltype temp) { jclass clazz; jmethodID mid; jbyteArray ba; jbyte* bae; jsize sz; int i; if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "BigInteger null"); return $null; } clazz = JCALL1(GetObjectClass, jenv, $input); mid = JCALL3(GetMethodID, jenv, clazz, "toByteArray", "()[B"); ba = (jbyteArray)JCALL2(CallObjectMethod, jenv, $input, mid); bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); temp = 0; if (sz > 0) { temp = ($*1_ltype)(signed char)bae[0]; for(i=1; i double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Java output of the function would be the function return value and the value in the single element array. In Java you would use it like this: double[] ptr = {0.0}; double fraction = modulename.modf(5.0,ptr); There are no char *OUTPUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *OUTPUT {char *output}; void f(char *output); */ /* Java BigInteger[] */ %typecheck(SWIG_TYPECHECK_INT128_ARRAY) SWIGBIGINTEGERARRAY "" %define OUTPUT_TYPEMAP(TYPE, JNITYPE, JTYPE, JAVATYPE, JNIDESC, TYPECHECKTYPE) %typemap(jni) TYPE *OUTPUT, TYPE &OUTPUT %{JNITYPE##Array%} %typemap(jtype) TYPE *OUTPUT, TYPE &OUTPUT "JTYPE[]" %typemap(jstype) TYPE *OUTPUT, TYPE &OUTPUT "JTYPE[]" %typemap(javain) TYPE *OUTPUT, TYPE &OUTPUT "$javainput" %typemap(javadirectorin) TYPE *OUTPUT, TYPE &OUTPUT "$jniinput" %typemap(javadirectorout) TYPE *OUTPUT, TYPE &OUTPUT "$javacall" %typemap(in) TYPE *OUTPUT($*1_ltype temp), TYPE &OUTPUT($*1_ltype temp) { if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } temp = ($*1_ltype)0; $1 = &temp; } %typemap(freearg) TYPE *OUTPUT, TYPE &OUTPUT "" %typemap(argout) TYPE *OUTPUT, TYPE &OUTPUT { JNITYPE jvalue = (JNITYPE)temp$argnum; JCALL4(Set##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &jvalue); } %typemap(directorin,descriptor=JNIDESC) TYPE &OUTPUT %{ $input = JCALL1(New##JAVATYPE##Array, jenv, 1); if (!$input) return $null; Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(directorin,descriptor=JNIDESC) TYPE *OUTPUT %{ if ($1) { $input = JCALL1(New##JAVATYPE##Array, jenv, 1); if (!$input) return $null; } Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(directorargout, noblock=1) TYPE &OUTPUT { JNITYPE $1_jvalue; JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); $result = ($*1_ltype)$1_jvalue; } %typemap(directorargout, noblock=1) TYPE *OUTPUT { if ($result) { JNITYPE $1_jvalue; JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); *$result = ($*1_ltype)$1_jvalue; } } %typemap(typecheck) TYPE *OUTPUT = TYPECHECKTYPE; %typemap(typecheck) TYPE &OUTPUT = TYPECHECKTYPE; %enddef OUTPUT_TYPEMAP(bool, jboolean, boolean, Boolean, "[Z", jbooleanArray); OUTPUT_TYPEMAP(signed char, jbyte, byte, Byte, "[B", jbyteArray); OUTPUT_TYPEMAP(unsigned char, jshort, short, Short, "[S", jshortArray); OUTPUT_TYPEMAP(short, jshort, short, Short, "[S", jshortArray); OUTPUT_TYPEMAP(unsigned short, jint, int, Int, "[I", jintArray); OUTPUT_TYPEMAP(int, jint, int, Int, "[I", jintArray); OUTPUT_TYPEMAP(unsigned int, jlong, long, Long, "[J", jlongArray); OUTPUT_TYPEMAP(long, jint, int, Int, "[I", jintArray); OUTPUT_TYPEMAP(unsigned long, jlong, long, Long, "[J", jlongArray); OUTPUT_TYPEMAP(long long, jlong, long, Long, "[J", jlongArray); OUTPUT_TYPEMAP(unsigned long long, jobject, java.math.BigInteger, Object, "[Ljava/math/BigInteger;", jobjectArray); OUTPUT_TYPEMAP(float, jfloat, float, Float, "[F", jfloatArray); OUTPUT_TYPEMAP(double, jdouble, double, Double, "[D", jdoubleArray); #undef OUTPUT_TYPEMAP %typemap(in) bool *OUTPUT($*1_ltype temp), bool &OUTPUT($*1_ltype temp) { if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } temp = false; $1 = &temp; } %typemap(directorargout, noblock=1) bool &OUTPUT { jboolean $1_jvalue; JCALL4(GetBooleanArrayRegion, jenv, $input, 0, 1, &$1_jvalue); $result = $1_jvalue ? true : false; } %typemap(directorargout, noblock=1) bool *OUTPUT { if ($result) { jboolean $1_jvalue; JCALL4(GetBooleanArrayRegion, jenv, $input, 0, 1, &$1_jvalue); *$result = $1_jvalue ? true : false; } } /* Convert to BigInteger - byte array holds number in 2's complement big endian format */ /* Use first element in BigInteger array for output */ /* Overrides the typemap in the OUTPUT_TYPEMAP macro */ %typemap(argout) unsigned long long *OUTPUT, unsigned long long &OUTPUT { jbyteArray ba = JCALL1(NewByteArray, jenv, 9); jbyte* bae = JCALL2(GetByteArrayElements, jenv, ba, 0); jclass clazz = JCALL1(FindClass, jenv, "java/math/BigInteger"); jmethodID mid = JCALL3(GetMethodID, jenv, clazz, "", "([B)V"); jobject bigint; int i; bae[0] = 0; for(i=1; i<9; i++ ) { bae[i] = (jbyte)(temp$argnum>>8*(8-i)); } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); bigint = JCALL3(NewObject, jenv, clazz, mid, ba); JCALL1(DeleteLocalRef, jenv, ba); JCALL3(SetObjectArrayElement, jenv, $input, 0, bigint); } /* INOUT typemaps -------------- Mappings for a parameter that is both an input and an output parameter The following typemaps can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" typemaps described earlier. Output values are returned as an element in a Java array. bool *INOUT, bool &INOUT signed char *INOUT, signed char &INOUT unsigned char *INOUT, unsigned char &INOUT short *INOUT, short &INOUT unsigned short *INOUT, unsigned short &INOUT int *INOUT, int &INOUT unsigned int *INOUT, unsigned int &INOUT long *INOUT, long &INOUT unsigned long *INOUT, unsigned long &INOUT long long *INOUT, long long &INOUT unsigned long long *INOUT, unsigned long long &INOUT float *INOUT, float &INOUT double *INOUT, double &INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); This works similarly to C in that the mapping directly modifies the input value - the input must be an array with a minimum of one element. The element in the array is the input and the output is the element in the array. double x[] = {5.0}; neg(x); The implementation of the OUTPUT and INOUT typemaps is different to other languages in that other languages will return the output value as part of the function return value. This difference is due to Java being a typed language. There are no char *INOUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *INOUT {char *inout}; void f(char *inout); */ %define INOUT_TYPEMAP(TYPE, JNITYPE, JTYPE, JAVATYPE, JNIDESC, TYPECHECKTYPE) %typemap(jni) TYPE *INOUT, TYPE &INOUT %{JNITYPE##Array%} %typemap(jtype) TYPE *INOUT, TYPE &INOUT "JTYPE[]" %typemap(jstype) TYPE *INOUT, TYPE &INOUT "JTYPE[]" %typemap(javain) TYPE *INOUT, TYPE &INOUT "$javainput" %typemap(javadirectorin) TYPE *INOUT, TYPE &INOUT "$jniinput" %typemap(javadirectorout) TYPE *INOUT, TYPE &INOUT "$javacall" %typemap(in) TYPE *INOUT, TYPE &INOUT { if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } $1 = ($1_ltype) JCALL2(Get##JAVATYPE##ArrayElements, jenv, $input, 0); } %typemap(freearg) TYPE *INOUT, TYPE &INOUT "" %typemap(argout) TYPE *INOUT, TYPE &INOUT { JCALL3(Release##JAVATYPE##ArrayElements, jenv, $input, (JNITYPE *)$1, 0); } %typemap(directorin,descriptor=JNIDESC) TYPE &INOUT %{ $input = JCALL1(New##JAVATYPE##Array, jenv, 1); if (!$input) return $null; JNITYPE $1_jvalue = (JNITYPE)$1; JCALL4(Set##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(directorin,descriptor=JNIDESC) TYPE *INOUT %{ if ($1) { $input = JCALL1(New##JAVATYPE##Array, jenv, 1); if (!$input) return $null; JNITYPE $1_jvalue = (JNITYPE)*$1; JCALL4(Set##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); } Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(directorargout, noblock=1) TYPE &INOUT { JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); $result = ($*1_ltype)$1_jvalue; } %typemap(directorargout, noblock=1) TYPE *INOUT { if ($result) { JNITYPE $1_jvalue; JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); *$result = ($*1_ltype)$1_jvalue; } } %typemap(typecheck) TYPE *INOUT = TYPECHECKTYPE; %typemap(typecheck) TYPE &INOUT = TYPECHECKTYPE; %enddef INOUT_TYPEMAP(bool, jboolean, boolean, Boolean, "[Z", jbooleanArray); INOUT_TYPEMAP(signed char, jbyte, byte, Byte, "[B", jbyteArray); INOUT_TYPEMAP(unsigned char, jshort, short, Short, "[S", jshortArray); INOUT_TYPEMAP(short, jshort, short, Short, "[S", jshortArray); INOUT_TYPEMAP(unsigned short, jint, int, Int, "[I", jintArray); INOUT_TYPEMAP(int, jint, int, Int, "[I", jintArray); INOUT_TYPEMAP(unsigned int, jlong, long, Long, "[J", jlongArray); INOUT_TYPEMAP(long, jint, int, Int, "[I", jintArray); INOUT_TYPEMAP(unsigned long, jlong, long, Long, "[J", jlongArray); INOUT_TYPEMAP(long long, jlong, long, Long, "[J", jlongArray); INOUT_TYPEMAP(unsigned long long, jobject, java.math.BigInteger, Object, "[java/math/BigInteger;", jobjectArray); INOUT_TYPEMAP(float, jfloat, float, Float, "[F", jfloatArray); INOUT_TYPEMAP(double, jdouble, double, Double, "[D", jdoubleArray); #undef INOUT_TYPEMAP /* Override typemaps in the INOUT_TYPEMAP macro for booleans to fix casts as a jboolean isn't always the same size as a bool */ %typemap(in) bool *INOUT (bool btemp, jboolean *jbtemp), bool &INOUT (bool btemp, jboolean *jbtemp) { if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } jbtemp = JCALL2(GetBooleanArrayElements, jenv, $input, 0); btemp = (*jbtemp) ? true : false; $1 = &btemp; } %typemap(argout) bool *INOUT, bool &INOUT { *jbtemp$argnum = btemp$argnum ? (jboolean)1 : (jboolean)0; JCALL3(ReleaseBooleanArrayElements, jenv, $input , (jboolean *)jbtemp$argnum, 0); } %typemap(directorargout, noblock=1) bool &INOUT { JCALL4(GetBooleanArrayRegion, jenv, $input, 0, 1, &$1_jvalue); $result = $1_jvalue ? true : false; } %typemap(directorargout, noblock=1) bool *INOUT { if ($result) { jboolean $1_jvalue; JCALL4(GetBooleanArrayRegion, jenv, $input, 0, 1, &$1_jvalue); *$result = $1_jvalue ? true : false; } } /* Override the typemap in the INOUT_TYPEMAP macro for unsigned long long */ %typemap(in) unsigned long long *INOUT ($*1_ltype temp), unsigned long long &INOUT ($*1_ltype temp) { jobject bigint; jclass clazz; jmethodID mid; jbyteArray ba; jbyte* bae; jsize sz; int i; if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } bigint = JCALL2(GetObjectArrayElement, jenv, $input, 0); if (!bigint) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array element null"); return $null; } clazz = JCALL1(GetObjectClass, jenv, bigint); mid = JCALL3(GetMethodID, jenv, clazz, "toByteArray", "()[B"); ba = (jbyteArray)JCALL2(CallObjectMethod, jenv, bigint, mid); bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); temp = 0; if (sz > 0) { temp = ($*1_ltype)(signed char)bae[0]; for(i=1; i namespace std { template class array { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; array(); array(const array& other); size_type size() const; %rename(isEmpty) empty; bool empty() const; void fill(const T& u); %extend { const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.2/Lib/java/enumsimple.swg0000644000175000017500000000501713667507523016714 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumsimple.swg * * This file provides backwards compatible enum wrapping. SWIG versions 1.3.21 * and earlier wrapped global enums with constant integers in the module class * or Constants interface. Enums declared within a C++ class were wrapped by * constant integers in the Java proxy class. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(jni) const enum SWIGTYPE & "jint" %typemap(jtype) const enum SWIGTYPE & "int" %typemap(jstype) const enum SWIGTYPE & "int" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (jint)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="I") const enum SWIGTYPE & "$input = (jint)$1;" %typemap(javadirectorin) const enum SWIGTYPE & "$jniinput" %typemap(javadirectorout) const enum SWIGTYPE & "$javacall" %typecheck(SWIG_TYPECHECK_INT32) const enum SWIGTYPE & "" %typemap(throws) const enum SWIGTYPE & %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) const enum SWIGTYPE & "$javainput" %typemap(javaout) const enum SWIGTYPE & { return $jnicall; } // enum SWIGTYPE typemaps %typemap(jni) enum SWIGTYPE "jint" %typemap(jtype) enum SWIGTYPE "int" %typemap(jstype) enum SWIGTYPE "int" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (jint)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="I") enum SWIGTYPE "$input = (jint) $1;" %typemap(javadirectorin) enum SWIGTYPE "$jniinput" %typemap(javadirectorout) enum SWIGTYPE "$javacall" %typecheck(SWIG_TYPECHECK_INT32) enum SWIGTYPE "" %typemap(throws) enum SWIGTYPE %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) enum SWIGTYPE "$javainput" %typemap(javaout) enum SWIGTYPE { return $jnicall; } %typemap(javaclassmodifiers) enum SWIGTYPE "" %typemap(javabase) enum SWIGTYPE "" %typemap(javacode) enum SWIGTYPE "" %typemap(javaimports) enum SWIGTYPE "" %typemap(javainterfaces) enum SWIGTYPE "" %typemap(javabody) enum SWIGTYPE "" %javaenum(simple); swig-4.0.2/Lib/java/enums.swg0000644000175000017500000001065313667507523015667 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enums.swg * * Include this file in order for C/C++ enums to be wrapped by proper Java enums. * Note that the JNI layer handles the enum as an int. The Java enum has extra * code generated to store the C++ int value. This is required for C++ enums that * specify a value for the enum item, as native Java enums do not support this. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(jni) const enum SWIGTYPE & "jint" %typemap(jtype) const enum SWIGTYPE & "int" %typemap(jstype) const enum SWIGTYPE & "$*javaclassname" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (jint)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="L$packagepath/$*javaclassname;") const enum SWIGTYPE & "$input = (jint)$1;" %typemap(javadirectorin) const enum SWIGTYPE & "$*javaclassname.swigToEnum($jniinput)" %typemap(javadirectorout) const enum SWIGTYPE & "($javacall).swigValue()" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(throws) const enum SWIGTYPE & %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) const enum SWIGTYPE & "$javainput.swigValue()" %typemap(javaout) const enum SWIGTYPE & { return $*javaclassname.swigToEnum($jnicall); } // enum SWIGTYPE typemaps %typemap(jni) enum SWIGTYPE "jint" %typemap(jtype) enum SWIGTYPE "int" %typemap(jstype) enum SWIGTYPE "$javaclassname" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (jint)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="L$packagepath/$javaclassname;") enum SWIGTYPE "$input = (jint) $1;" %typemap(javadirectorin) enum SWIGTYPE "$javaclassname.swigToEnum($jniinput)" %typemap(javadirectorout) enum SWIGTYPE "($javacall).swigValue()" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(throws) enum SWIGTYPE %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) enum SWIGTYPE "$javainput.swigValue()" %typemap(javaout) enum SWIGTYPE { return $javaclassname.swigToEnum($jnicall); } %typemap(javaclassmodifiers) enum SWIGTYPE "public enum" %typemap(javabase) enum SWIGTYPE "" %typemap(javacode) enum SWIGTYPE "" %typemap(javaimports) enum SWIGTYPE "" %typemap(javainterfaces) enum SWIGTYPE "" /* * SwigNext static inner class used instead of a static int as static fields cannot be accessed from enum initialisers. * The swigToEnum method is used to find the Java enum from a C++ enum integer value. The default one here takes * advantage of the fact that most enums do not have initial values specified, so the lookup is fast. If initial * values are specified then a lengthy linear search through all possible enums might occur. Specific typemaps could be * written to possibly optimise this lookup by taking advantage of characteristics peculiar to the targeted enum. */ %typemap(javabody) enum SWIGTYPE %{ public final int swigValue() { return swigValue; } public static $javaclassname swigToEnum(int swigValue) { $javaclassname[] swigValues = $javaclassname.class.getEnumConstants(); if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) return swigValues[swigValue]; for ($javaclassname swigEnum : swigValues) if (swigEnum.swigValue == swigValue) return swigEnum; throw new IllegalArgumentException("No enum " + $javaclassname.class + " with value " + swigValue); } @SuppressWarnings("unused") private $javaclassname() { this.swigValue = SwigNext.next++; } @SuppressWarnings("unused") private $javaclassname(int swigValue) { this.swigValue = swigValue; SwigNext.next = swigValue+1; } @SuppressWarnings("unused") private $javaclassname($javaclassname swigEnum) { this.swigValue = swigEnum.swigValue; SwigNext.next = this.swigValue+1; } private final int swigValue; private static class SwigNext { private static int next = 0; } %} %javaenum(proper); swig-4.0.2/Lib/java/std_auto_ptr.i0000644000175000017500000000151613667507523016675 0ustar williamwilliam/* The typemaps here allow to handle functions returning std::auto_ptr<>, which is the most common use of this type. If you have functions taking it as parameter, these typemaps can't be used for them and you need to do something else (e.g. use shared_ptr<> which SWIG supports fully). */ %define %auto_ptr(TYPE) %typemap (jni) std::auto_ptr "jlong" %typemap (jtype) std::auto_ptr "long" %typemap (jstype) std::auto_ptr "$typemap(jstype, TYPE)" %typemap (out) std::auto_ptr %{ jlong lpp = 0; *(TYPE**) &lpp = $1.release(); $result = lpp; %} %typemap(javaout) std::auto_ptr { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %template() std::auto_ptr; %enddef namespace std { template class auto_ptr {}; } swig-4.0.2/Lib/java/javahead.swg0000644000175000017500000001027713667507523016305 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javahead.swg * * Java support code * ----------------------------------------------------------------------------- */ /* JNI function calls require different calling conventions for C and C++. These JCALL macros are used so * that the same typemaps can be used for generating code for both C and C++. The SWIG preprocessor can expand * the macros thereby generating the correct calling convention. It is thus essential that all typemaps that * use the macros are not within %{ %} brackets as they won't be run through the SWIG preprocessor. */ #ifdef __cplusplus # define JCALL0(func, jenv) jenv->func() # define JCALL1(func, jenv, ar1) jenv->func(ar1) # define JCALL2(func, jenv, ar1, ar2) jenv->func(ar1, ar2) # define JCALL3(func, jenv, ar1, ar2, ar3) jenv->func(ar1, ar2, ar3) # define JCALL4(func, jenv, ar1, ar2, ar3, ar4) jenv->func(ar1, ar2, ar3, ar4) # define JCALL5(func, jenv, ar1, ar2, ar3, ar4, ar5) jenv->func(ar1, ar2, ar3, ar4, ar5) # define JCALL6(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6) jenv->func(ar1, ar2, ar3, ar4, ar5, ar6) # define JCALL7(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) jenv->func(ar1, ar2, ar3, ar4, ar5, ar6, ar7) #else # define JCALL0(func, jenv) (*jenv)->func(jenv) # define JCALL1(func, jenv, ar1) (*jenv)->func(jenv, ar1) # define JCALL2(func, jenv, ar1, ar2) (*jenv)->func(jenv, ar1, ar2) # define JCALL3(func, jenv, ar1, ar2, ar3) (*jenv)->func(jenv, ar1, ar2, ar3) # define JCALL4(func, jenv, ar1, ar2, ar3, ar4) (*jenv)->func(jenv, ar1, ar2, ar3, ar4) # define JCALL5(func, jenv, ar1, ar2, ar3, ar4, ar5) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5) # define JCALL6(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5, ar6) # define JCALL7(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) #endif %insert(runtime) %{ /* Fix for jlong on some versions of gcc on Windows */ #if defined(__GNUC__) && !defined(__INTEL_COMPILER) typedef long long __int64; #endif /* Fix for jlong on 64-bit x86 Solaris */ #if defined(__x86_64) # ifdef _LP64 # undef _LP64 # endif #endif #include #include #include %} %insert(runtime) %{ /* Support for throwing Java exceptions */ typedef enum { SWIG_JavaOutOfMemoryError = 1, SWIG_JavaIOException, SWIG_JavaRuntimeException, SWIG_JavaIndexOutOfBoundsException, SWIG_JavaArithmeticException, SWIG_JavaIllegalArgumentException, SWIG_JavaNullPointerException, SWIG_JavaDirectorPureVirtual, SWIG_JavaUnknownError, SWIG_JavaIllegalStateException, } SWIG_JavaExceptionCodes; typedef struct { SWIG_JavaExceptionCodes code; const char *java_exception; } SWIG_JavaExceptions_t; %} %insert(runtime) { static void SWIGUNUSED SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg) { jclass excep; static const SWIG_JavaExceptions_t java_exceptions[] = { { SWIG_JavaOutOfMemoryError, "java/lang/OutOfMemoryError" }, { SWIG_JavaIOException, "java/io/IOException" }, { SWIG_JavaRuntimeException, "java/lang/RuntimeException" }, { SWIG_JavaIndexOutOfBoundsException, "java/lang/IndexOutOfBoundsException" }, { SWIG_JavaArithmeticException, "java/lang/ArithmeticException" }, { SWIG_JavaIllegalArgumentException, "java/lang/IllegalArgumentException" }, { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, { SWIG_JavaDirectorPureVirtual, "java/lang/RuntimeException" }, { SWIG_JavaUnknownError, "java/lang/UnknownError" }, { SWIG_JavaIllegalStateException, "java/lang/IllegalStateException" }, { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } }; const SWIG_JavaExceptions_t *except_ptr = java_exceptions; while (except_ptr->code != code && except_ptr->code) except_ptr++; JCALL0(ExceptionClear, jenv); excep = JCALL1(FindClass, jenv, except_ptr->java_exception); if (excep) JCALL2(ThrowNew, jenv, excep, msg); } } %insert(runtime) %{ /* Contract support */ #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, msg); return nullreturn; } else %} swig-4.0.2/Lib/java/stl.i0000644000175000017500000000044313667507523014766 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.2/Lib/java/std_list.i0000644000175000017500000001475513667507523016024 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * * SWIG typemaps for std::list. * The Java proxy class extends java.util.AbstractSequentialList. The std::list * container looks and feels much like a java.util.LinkedList from Java. * ----------------------------------------------------------------------------- */ %include %{ #include #include %} %fragment("SWIG_ListSize", "header", fragment="SWIG_JavaIntFromSize_t") { SWIGINTERN jint SWIG_ListSize(size_t size) { jint sz = SWIG_JavaIntFromSize_t(size); if (sz == -1) throw std::out_of_range("list size is too large to fit into a Java int"); return sz; } } %javamethodmodifiers std::list::begin "private"; %javamethodmodifiers std::list::insert "private"; %javamethodmodifiers std::list::doSize "private"; %javamethodmodifiers std::list::doPreviousIndex "private"; %javamethodmodifiers std::list::doNextIndex "private"; %javamethodmodifiers std::list::doHasNext "private"; // Match Java style better: %rename(Iterator) std::list::iterator; %nodefaultctor std::list::iterator; namespace std { template class list { %typemap(javabase) std::list "java.util.AbstractSequentialList<$typemap(jboxtype, T)>" %proxycode %{ public $javaclassname(java.util.Collection c) { this(); java.util.ListIterator<$typemap(jboxtype, T)> it = listIterator(0); // Special case the "copy constructor" here to avoid lots of cross-language calls for (java.lang.Object o : c) { it.add(($typemap(jboxtype, T))o); } } public int size() { return doSize(); } public boolean add($typemap(jboxtype, T) value) { addLast(value); return true; } public java.util.ListIterator<$typemap(jboxtype, T)> listIterator(int index) { return new java.util.ListIterator<$typemap(jboxtype, T)>() { private Iterator pos; private Iterator last; private java.util.ListIterator<$typemap(jboxtype, T)> init(int index) { if (index < 0 || index > $javaclassname.this.size()) throw new IndexOutOfBoundsException("Index: " + index); pos = $javaclassname.this.begin(); pos = pos.advance_unchecked(index); return this; } public void add($typemap(jboxtype, T) v) { // Technically we can invalidate last here, but this makes more sense last = $javaclassname.this.insert(pos, v); } public void set($typemap(jboxtype, T) v) { if (null == last) { throw new IllegalStateException(); } last.set_unchecked(v); } public void remove() { if (null == last) { throw new IllegalStateException(); } $javaclassname.this.remove(last); last = null; } public int previousIndex() { return $javaclassname.this.doPreviousIndex(pos); } public int nextIndex() { return $javaclassname.this.doNextIndex(pos); } public $typemap(jboxtype, T) previous() { if (previousIndex() < 0) { throw new java.util.NoSuchElementException(); } last = pos; pos = pos.previous_unchecked(); return last.deref_unchecked(); } public $typemap(jboxtype, T) next() { if (!hasNext()) { throw new java.util.NoSuchElementException(); } last = pos; pos = pos.next_unchecked(); return last.deref_unchecked(); } public boolean hasPrevious() { // This call to previousIndex() will be much slower than the hasNext() implementation, but it's simpler like this with C++ forward iterators return previousIndex() != -1; } public boolean hasNext() { return $javaclassname.this.doHasNext(pos); } }.init(index); } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; /* * We'd actually be better off having the nested class *not* be static in the wrapper * output, but this doesn't actually remove the $static from the nested class still. * (This would allow us to somewhat simplify the implementation of the ListIterator * interface and give "natural" semantics to Java users of the C++ iterator) */ //%typemap(javaclassmodifiers) iterator "public class" //%typemap(javainterfaces) iterator "java.util.ListIterator<$typemap(jboxtype, T)>" struct iterator { %extend { void set_unchecked(const T &v) { **$self = v; } iterator next_unchecked() const { std::list::iterator ret = *$self; ++ret; return ret; } iterator previous_unchecked() const { std::list::iterator ret = *$self; --ret; return ret; } T deref_unchecked() const { return **$self; } iterator advance_unchecked(size_type index) const { std::list::iterator ret = *$self; std::advance(ret, index); return ret; } } }; list(); list(const list& other); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(remove) erase; iterator erase(iterator pos); %rename(removeLast) pop_back; void pop_back(); %rename(removeFirst) pop_front; void pop_front(); %rename(addLast) push_back; void push_back(const T &value); %rename(addFirst) push_front; void push_front(const T &value); iterator begin(); iterator end(); iterator insert(iterator pos, const T &value); %extend { %fragment("SWIG_ListSize"); list(jint count, const T &value) throw (std::out_of_range) { if (count < 0) throw std::out_of_range("list count must be positive"); return new std::list(static_cast::size_type>(count), value); } jint doSize() const throw (std::out_of_range) { return SWIG_ListSize(self->size()); } jint doPreviousIndex(const iterator &pos) const throw (std::out_of_range) { return pos == self->begin() ? -1 : SWIG_ListSize(std::distance(self->begin(), static_cast::const_iterator>(pos))); } jint doNextIndex(const iterator &pos) const throw (std::out_of_range) { return pos == self->end() ? SWIG_ListSize(self->size()) : SWIG_ListSize(std::distance(self->begin(), static_cast::const_iterator>(pos))); } bool doHasNext(const iterator &pos) const { return pos != $self->end(); } } }; } swig-4.0.2/Lib/java/various.i0000644000175000017500000001335713667507523015664 0ustar williamwilliam/* ----------------------------------------------------------------------------- * various.i * * SWIG Typemap library for Java. * Various useful typemaps. * ----------------------------------------------------------------------------- */ /* * char **STRING_ARRAY typemaps. * These typemaps are for C String arrays which are NULL terminated. * char *values[] = { "one", "two", "three", NULL }; // note NULL * char ** is mapped to a Java String[]. * * Example usage wrapping: * %apply char **STRING_ARRAY { char **input }; * char ** foo(char **input); * * Java usage: * String numbers[] = { "one", "two", "three" }; * String[] ret = modulename.foo( numbers }; */ %typemap(jni) char **STRING_ARRAY "jobjectArray" %typemap(jtype) char **STRING_ARRAY "String[]" %typemap(jstype) char **STRING_ARRAY "String[]" %typemap(in) char **STRING_ARRAY (jint size) { int i = 0; if ($input) { size = JCALL1(GetArrayLength, jenv, $input); #ifdef __cplusplus $1 = new char*[size+1]; #else $1 = (char **)malloc((size+1) * sizeof(char *)); #endif for (i = 0; i %} namespace std { %naturalvar string; class string; // string %typemap(jni) string "jstring" %typemap(jtype) string "String" %typemap(jstype) string "String" %typemap(javadirectorin) string "$jniinput" %typemap(javadirectorout) string "$javacall" %typemap(in) string %{ if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string"); return $null; } const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0); if (!$1_pstr) return $null; $1.assign($1_pstr); jenv->ReleaseStringUTFChars($input, $1_pstr); %} %typemap(directorout) string %{ if(!$input) { if (!jenv->ExceptionCheck()) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string"); } return $null; } const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0); if (!$1_pstr) return $null; $result.assign($1_pstr); jenv->ReleaseStringUTFChars($input, $1_pstr); %} %typemap(directorin,descriptor="Ljava/lang/String;") string %{ $input = jenv->NewStringUTF($1.c_str()); Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(out) string %{ $result = jenv->NewStringUTF($1.c_str()); %} %typemap(javain) string "$javainput" %typemap(javaout) string { return $jnicall; } %typemap(typecheck) string = char *; %typemap(throws) string %{ SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.c_str()); return $null; %} // const string & %typemap(jni) const string & "jstring" %typemap(jtype) const string & "String" %typemap(jstype) const string & "String" %typemap(javadirectorin) const string & "$jniinput" %typemap(javadirectorout) const string & "$javacall" %typemap(in) const string & %{ if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string"); return $null; } const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0); if (!$1_pstr) return $null; $*1_ltype $1_str($1_pstr); $1 = &$1_str; jenv->ReleaseStringUTFChars($input, $1_pstr); %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string & %{ if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string"); return $null; } const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0); if (!$1_pstr) return $null; /* possible thread/reentrant code problem */ static $*1_ltype $1_str; $1_str = $1_pstr; $result = &$1_str; jenv->ReleaseStringUTFChars($input, $1_pstr); %} %typemap(directorin,descriptor="Ljava/lang/String;") const string & %{ $input = jenv->NewStringUTF($1.c_str()); Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(out) const string & %{ $result = jenv->NewStringUTF($1->c_str()); %} %typemap(javain) const string & "$javainput" %typemap(javaout) const string & { return $jnicall; } %typemap(typecheck) const string & = char *; %typemap(throws) const string & %{ SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.c_str()); return $null; %} } swig-4.0.2/Lib/java/std_map.i0000644000175000017500000001433713667507523015622 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * The Java proxy class extends java.util.AbstractMap. The std::map * container looks and feels much like a java.util.HashMap from Java. * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include %} %fragment("SWIG_MapSize", "header", fragment="SWIG_JavaIntFromSize_t") { SWIGINTERN jint SWIG_MapSize(size_t size) { jint sz = SWIG_JavaIntFromSize_t(size); if (sz == -1) { throw std::out_of_range("map size is too large to fit into a Java int"); } return sz; } } %javamethodmodifiers std::map::sizeImpl "private"; %javamethodmodifiers std::map::containsImpl "private"; %javamethodmodifiers std::map::putUnchecked "private"; %javamethodmodifiers std::map::removeUnchecked "private"; %javamethodmodifiers std::map::find "private"; %javamethodmodifiers std::map::begin "private"; %javamethodmodifiers std::map::end "private"; %rename(Iterator) std::map::iterator; %nodefaultctor std::map::iterator; %javamethodmodifiers std::map::iterator::getNextUnchecked "private"; %javamethodmodifiers std::map::iterator::isNot "private"; %javamethodmodifiers std::map::iterator::getKey "private"; %javamethodmodifiers std::map::iterator::getValue "private"; %javamethodmodifiers std::map::iterator::setValue "private"; namespace std { template > class map { %typemap(javabase) std::map< K, T, C > "java.util.AbstractMap<$typemap(jboxtype, K), $typemap(jboxtype, T)>" %proxycode %{ public int size() { return sizeImpl(); } public boolean containsKey(java.lang.Object key) { if (!(key instanceof $typemap(jboxtype, K))) { return false; } return containsImpl(($typemap(jboxtype, K))key); } public $typemap(jboxtype, T) get(java.lang.Object key) { if (!(key instanceof $typemap(jboxtype, K))) { return null; } Iterator itr = find(($typemap(jboxtype, K)) key); if (itr.isNot(end())) { return itr.getValue(); } return null; } public $typemap(jboxtype, T) put($typemap(jboxtype, K) key, $typemap(jboxtype, T) value) { Iterator itr = find(($typemap(jboxtype, K)) key); if (itr.isNot(end())) { $typemap(jboxtype, T) oldValue = itr.getValue(); itr.setValue(value); return oldValue; } else { putUnchecked(key, value); return null; } } public $typemap(jboxtype, T) remove(java.lang.Object key) { if (!(key instanceof $typemap(jboxtype, K))) { return null; } Iterator itr = find(($typemap(jboxtype, K)) key); if (itr.isNot(end())) { $typemap(jboxtype, T) oldValue = itr.getValue(); removeUnchecked(itr); return oldValue; } else { return null; } } public java.util.Set> entrySet() { java.util.Set> setToReturn = new java.util.HashSet>(); Iterator itr = begin(); final Iterator end = end(); while (itr.isNot(end)) { setToReturn.add(new Entry<$typemap(jboxtype, K), $typemap(jboxtype, T)>() { private Iterator iterator; private Entry<$typemap(jboxtype, K), $typemap(jboxtype, T)> init(Iterator iterator) { this.iterator = iterator; return this; } public $typemap(jboxtype, K) getKey() { return iterator.getKey(); } public $typemap(jboxtype, T) getValue() { return iterator.getValue(); } public $typemap(jboxtype, T) setValue($typemap(jboxtype, T) newValue) { $typemap(jboxtype, T) oldValue = iterator.getValue(); iterator.setValue(newValue); return oldValue; } }.init(itr)); itr = itr.getNextUnchecked(); } return setToReturn; } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); struct iterator { %typemap(javaclassmodifiers) iterator "protected class" %extend { std::map< K, T, C >::iterator getNextUnchecked() { std::map< K, T, C >::iterator copy = (*$self); return ++copy; } bool isNot(iterator other) const { return (*$self != other); } K getKey() const { return (*$self)->first; } T getValue() const { return (*$self)->second; } void setValue(const T& newValue) { (*$self)->second = newValue; } } }; %rename(isEmpty) empty; bool empty() const; void clear(); iterator find(const K& key); iterator begin(); iterator end(); %extend { %fragment("SWIG_MapSize"); jint sizeImpl() const throw (std::out_of_range) { return SWIG_MapSize(self->size()); } bool containsImpl(const K& key) { return (self->count(key) > 0); } void putUnchecked(const K& key, const T& value) { (*self)[key] = value; } void removeUnchecked(const std::map< K, T, C >::iterator itr) { self->erase(itr); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.2/Lib/java/swiginterface.i0000644000175000017500000000651513667507523017024 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swiginterface.i * * SWIG interface feature and typemaps implementation providing: * %interface * %interface_impl * %interface_custom * ----------------------------------------------------------------------------- */ %define INTERFACE_TYPEMAPS(CTYPE...) %typemap(jtype) CTYPE, CTYPE *, CTYPE *const&, CTYPE [], CTYPE & "long" %typemap(jstype) CTYPE "$&javainterfacename" %typemap(jstype) CTYPE *, CTYPE [], CTYPE & "$javainterfacename" %typemap(jstype) CTYPE *const& "$*javainterfacename" %typemap(javain) CTYPE "$javainput.$&interfacename_GetInterfaceCPtr()" %typemap(javain) CTYPE & "$javainput.$interfacename_GetInterfaceCPtr()" %typemap(javain) CTYPE *, CTYPE [] "($javainput == null) ? 0 : $javainput.$interfacename_GetInterfaceCPtr()" %typemap(javain) CTYPE *const& "($javainput == null) ? 0 : $javainput.$*interfacename_GetInterfaceCPtr()" %typemap(javaout) CTYPE { return ($&javainterfacename)new $&javaclassname($jnicall, true); } %typemap(javaout) CTYPE & { return ($javainterfacename)new $javaclassname($jnicall, $owner); } %typemap(javaout) CTYPE *, CTYPE [] { long cPtr = $jnicall; return (cPtr == 0) ? null : ($javainterfacename)new $javaclassname(cPtr, $owner); } %typemap(javaout) CTYPE *const& { long cPtr = $jnicall; return (cPtr == 0) ? null : ($javainterfacename)new $javaclassname(cPtr, $owner); } %typemap(javadirectorin) CTYPE "($&javainterfacename)new $&javaclassname($jniinput, true)" %typemap(javadirectorin) CTYPE & "($javainterfacename)new $javaclassname($jniinput, false)" %typemap(javadirectorin) CTYPE *, CTYPE [] "($jniinput == 0) ? null : ($javainterfacename)new $javaclassname($jniinput, false)" %typemap(javadirectorin) CTYPE *const& "($jniinput == 0) ? null : ($*javainterfacename)new $*javaclassname($jniinput, false)" %typemap(javadirectorout) CTYPE "$javacall.$&interfacename_GetInterfaceCPtr()" %typemap(javadirectorout) CTYPE *, CTYPE [], CTYPE & "$javacall.$interfacename_GetInterfaceCPtr()" %typemap(javadirectorout) CTYPE *const& "$javacall.$*interfacename_GetInterfaceCPtr()" %typemap(directorin,descriptor="L$packagepath/$&javainterfacename;") CTYPE %{ $input = 0; *(($&1_ltype*)&$input) = new $1_ltype((const $1_ltype &)$1); %} %typemap(directorin,descriptor="L$packagepath/$javainterfacename;") CTYPE *, CTYPE [] %{ *(($&1_ltype)&$input) = ($1_ltype) $1; %} %typemap(directorin,descriptor="L$packagepath/$javainterfacename;") CTYPE & %{ *($&1_ltype)&$input = ($1_ltype) &$1; %} %typemap(directorin,descriptor="L$packagepath/$*javainterfacename;") CTYPE *const& %{ *($&1_ltype)&$input = ($1_ltype) &$1; %} %typemap(javainterfacecode, declaration=" long $interfacename_GetInterfaceCPtr();\n", cptrmethod="$interfacename_GetInterfaceCPtr") CTYPE %{ public long $interfacename_GetInterfaceCPtr() { return $imclassname.$javaclazzname$interfacename_GetInterfaceCPtr(swigCPtr); } %} %enddef %define %interface(CTYPE...) %feature("interface", name="%sSwigInterface") CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef %define %interface_impl(CTYPE...) %rename("%sSwigImpl") CTYPE; %feature("interface", name="%(rstrip:[SwigImpl])s") CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef %define %interface_custom(PROXY, INTERFACE, CTYPE...) %rename(PROXY) CTYPE; %feature("interface", name=INTERFACE) CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef swig-4.0.2/Lib/java/boost_shared_ptr.i0000644000175000017500000003340213667507523017526 0ustar williamwilliam// Users can provide their own SWIG_SHARED_PTR_TYPEMAPS macro before including this file to change the // visibility of the constructor and getCPtr method if desired to public if using multiple modules. #ifndef SWIG_SHARED_PTR_TYPEMAPS #define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(protected, protected, CONST, TYPE) #endif %include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE ($&1_type argp = 0) %{ argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} %typemap(directorin,descriptor="L$packagepath/$&javaclassname;") CONST TYPE %{ $input = 0; *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (new $1_ltype((const $1_ltype &)$1)); %} %typemap(directorout) CONST TYPE %{ if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $result = *smartarg->get(); %} // plain pointer %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") CONST TYPE * %{ $input = 0; if ($1) { *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ($1 SWIG_NO_NULL_DELETER_0); } %} %typemap(directorout) CONST TYPE * %{ #error "typemaps for $1_type not available" %} // plain reference %typemap(in) CONST TYPE & %{ $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if (!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") CONST TYPE & %{ $input = 0; *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (&$1 SWIG_NO_NULL_DELETER_0); %} %typemap(directorout) CONST TYPE & %{ #error "typemaps for $1_type not available" %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = (TYPE *)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(directorin,descriptor="L$packagepath/$*javaclassname;") TYPE *CONST& %{ $input = 0; if ($1) { *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ($1 SWIG_NO_NULL_DELETER_0); } %} %typemap(directorout) TYPE *CONST& %{ #error "typemaps for $1_type not available" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ($&1_type argp) %{ argp = *($&1_ltype*)&$input; if (argp) $1 = *argp; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} %typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ $input = 0; if ($1) { *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1); } %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ if ($input) { $&1_type smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $result = *smartarg; } %} // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & ($*1_ltype tempnull) %{ $1 = $input ? *($&1_ltype)&$input : &tempnull; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ *($&1_ltype)&$result = *$1 ? new $*1_ltype(*$1) : 0; %} %typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ $input = 0; if ($1) { *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1); } %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "typemaps for $1_type not available" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * ($*1_ltype tempnull) %{ $1 = $input ? *($&1_ltype)&$input : &tempnull; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ *($&1_ltype)&$result = ($1 && *$1) ? new $*1_ltype(*$1) : 0; if ($owner) delete $1; %} %typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ $input = 0; if ($1 && *$1) { *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1); } %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "typemaps for $1_type not available" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempnull, $*1_ltype temp = 0) %{ temp = $input ? *($1_ltype)&$input : &tempnull; $1 = &temp; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ *($1_ltype)&$result = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %} %typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ $input = 0; if ($1 && *$1) { *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1); } %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "typemaps for $1_type not available" %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (jni) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "jlong" %typemap (jtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "long" %typemap (jstype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(jstype, TYPE)" %typemap(javain) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(jstype, TYPE).getCPtr($javainput)" %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) CONST TYPE { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE & { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) TYPE *CONST& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javadirectorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(jstype, TYPE).getCPtr($javacall)" %typemap(javadirectorin) CONST TYPE, CONST TYPE *, CONST TYPE &, TYPE *CONST& "($jniinput == 0) ? null : new $typemap(jstype, TYPE)($jniinput, true)" %typemap(javadirectorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "($jniinput == 0) ? null : new $typemap(jstype, TYPE)($jniinput, true)" // Base proxy classes %typemap(javabody) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwn; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } CPTR_VISIBILITY void swigSetCMemOwn(boolean own) { swigCMemOwn = own; } %} // Derived proxy classes %typemap(javabody_derived) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnDerived; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { super($imclassname.$javaclazznameSWIGSmartPtrUpcast(cPtr), true); swigCMemOwnDerived = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } CPTR_VISIBILITY void swigSetCMemOwn(boolean own) { swigCMemOwnDerived = own; super.swigSetCMemOwn(own); } %} %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized") TYPE { if (swigCPtr != 0) { if (swigCMemOwn) { swigCMemOwn = false; $jnicall; } swigCPtr = 0; } } %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized") TYPE { if (swigCPtr != 0) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $jnicall; } swigCPtr = 0; } super.delete(); } %typemap(directordisconnect, methodname="swigDirectorDisconnect") TYPE %{ protected void $methodname() { swigSetCMemOwn(false); $jnicall; } %} %typemap(directorowner_release, methodname="swigReleaseOwnership") TYPE %{ public void $methodname() { swigSetCMemOwn(false); $jnicall; } %} %typemap(directorowner_take, methodname="swigTakeOwnership") TYPE %{ public void $methodname() { swigSetCMemOwn(true); $jnicall; } %} // Typecheck typemaps %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *") TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.2/Lib/stdint.i0000644000175000017500000000450013667507523014546 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stdint.i * * SWIG library file for ISO C99 types: 7.18 Integer types * ----------------------------------------------------------------------------- */ %{ #include // Use the C99 official header %} %include /* Exact integral types. */ /* Signed. */ typedef signed char int8_t; typedef short int int16_t; typedef int int32_t; #if defined(SWIGWORDSIZE64) typedef long int int64_t; #else typedef long long int int64_t; #endif /* Unsigned. */ typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; #if defined(SWIGWORDSIZE64) typedef unsigned long int uint64_t; #else typedef unsigned long long int uint64_t; #endif /* Small types. */ /* Signed. */ typedef signed char int_least8_t; typedef short int int_least16_t; typedef int int_least32_t; #if defined(SWIGWORDSIZE64) typedef long int int_least64_t; #else typedef long long int int_least64_t; #endif /* Unsigned. */ typedef unsigned char uint_least8_t; typedef unsigned short int uint_least16_t; typedef unsigned int uint_least32_t; #if defined(SWIGWORDSIZE64) typedef unsigned long int uint_least64_t; #else typedef unsigned long long int uint_least64_t; #endif /* Fast types. */ /* Signed. */ typedef signed char int_fast8_t; #if defined(SWIGWORDSIZE64) typedef long int int_fast16_t; typedef long int int_fast32_t; typedef long int int_fast64_t; #else typedef int int_fast16_t; typedef int int_fast32_t; typedef long long int int_fast64_t; #endif /* Unsigned. */ typedef unsigned char uint_fast8_t; #if defined(SWIGWORDSIZE64) typedef unsigned long int uint_fast16_t; typedef unsigned long int uint_fast32_t; typedef unsigned long int uint_fast64_t; #else typedef unsigned int uint_fast16_t; typedef unsigned int uint_fast32_t; typedef unsigned long long int uint_fast64_t; #endif /* Types for `void *' pointers. */ #if defined(SWIGWORDSIZE64) typedef long int intptr_t; typedef unsigned long int uintptr_t; #else typedef int intptr_t; typedef unsigned int uintptr_t; #endif /* Largest integral types. */ #if defined(SWIGWORDSIZE64) typedef long int intmax_t; typedef unsigned long int uintmax_t; #else typedef long long int intmax_t; typedef unsigned long long int uintmax_t; #endif swig-4.0.2/Lib/swigrun.swg0000644000175000017500000004047513667507523015322 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigrun.swg * * This file contains generic C API SWIG runtime support for pointer * type checking. * ----------------------------------------------------------------------------- */ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "4" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE # define SWIG_QUOTE_STRING(x) #x # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else # define SWIG_TYPE_TABLE_NAME #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the SWIG runtime code. In 99.9% of the cases, SWIG just needs to declare them as 'static'. But only do this if strictly necessary, ie, if you have problems with your compiler or suchlike. */ #ifndef SWIGRUNTIME # define SWIGRUNTIME SWIGINTERN #endif #ifndef SWIGRUNTIMEINLINE # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif /* Generic buffer size */ #ifndef SWIG_BUFFER_SIZE # define SWIG_BUFFER_SIZE 1024 #endif /* Flags for pointer conversions */ #define SWIG_POINTER_DISOWN 0x1 #define SWIG_CAST_NEW_MEMORY 0x2 #define SWIG_POINTER_NO_NULL 0x4 /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 /* Flags/methods for returning states. The SWIG conversion methods, as ConvertPtr, return an integer that tells if the conversion was successful or not. And if not, an error code can be returned (see swigerrors.swg for the codes). Use the following macros/flags to set or process the returning states. In old versions of SWIG, code such as the following was usually written: if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { // success code } else { //fail code } Now you can be more explicit: int res = SWIG_ConvertPtr(obj,vptr,ty.flags); if (SWIG_IsOK(res)) { // success code } else { // fail code } which is the same really, but now you can also do Type *ptr; int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); if (SWIG_IsOK(res)) { // success code if (SWIG_IsNewObj(res) { ... delete *ptr; } else { ... } } else { // fail code } I.e., now SWIG_ConvertPtr can return new objects and you can identify the case and take care of the deallocation. Of course that also requires SWIG_ConvertPtr to return new result values, such as int SWIG_ConvertPtr(obj, ptr,...) { if () { if () { *ptr = ; return SWIG_NEWOBJ; } else { *ptr = ; return SWIG_OLDOBJ; } } else { return SWIG_BADOBJ; } } Of course, returning the plain '0(success)/-1(fail)' still works, but you can be more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the SWIG errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code allows to return the 'cast rank', for example, if you have this int food(double) int fooi(int); and you call food(1) // cast rank '1' (1 -> 1.0) fooi(1) // cast rank '0' just use the SWIG_AddCast()/SWIG_CheckState() */ #define SWIG_OK (0) #define SWIG_ERROR (-1) #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) /* The CastRankLimit says how many bits are used for the cast rank */ #define SWIG_CASTRANKLIMIT (1 << 8) /* The NewMask denotes the object was created (using new/malloc) */ #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) /* The TmpMask is for in/out typemaps that use temporal objects */ #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) /* Simple returning values */ #define SWIG_BADOBJ (SWIG_ERROR) #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) /* Check, add and del mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) #define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) #define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) #define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) /* Cast-Rank Mode */ #if defined(SWIG_CASTRANK_MODE) # ifndef SWIG_TypeRank # define SWIG_TypeRank unsigned long # endif # ifndef SWIG_MAXCASTRANK /* Default cast allowed */ # define SWIG_MAXCASTRANK (2) # endif # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) SWIGINTERNINLINE int SWIG_AddCast(int r) { return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; } SWIGINTERNINLINE int SWIG_CheckState(int r) { return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; } #else /* no cast-rank mode */ # define SWIG_AddCast(r) (r) # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) #endif #include #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *, int *); typedef struct swig_type_info *(*swig_dycast_func)(void **); /* Structure to store information on one type */ typedef struct swig_type_info { const char *name; /* mangled name of this type */ const char *str; /* human readable name of this type */ swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ struct swig_cast_info *cast; /* linked list of types that can cast into this type */ void *clientdata; /* language specific type data */ int owndata; /* flag if the structure owns the clientdata */ } swig_type_info; /* Structure to store a type and conversion function used for casting */ typedef struct swig_cast_info { swig_type_info *type; /* pointer to type that is equivalent to this type */ swig_converter_func converter; /* function to cast the void pointers */ struct swig_cast_info *next; /* pointer to next cast in linked list */ struct swig_cast_info *prev; /* pointer to the previous cast */ } swig_cast_info; /* Structure used to store module information * Each module generates one structure like this, and the runtime collects * all of these structures and stores them in a circularly linked list.*/ typedef struct swig_module_info { swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ size_t size; /* Number of types in this module */ struct swig_module_info *next; /* Pointer to next element in circularly linked list */ swig_type_info **type_initial; /* Array of initially generated type structures */ swig_cast_info **cast_initial; /* Array of initially generated casting structures */ void *clientdata; /* Language specific module data */ } swig_module_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; } return (int)((l1 - f1) - (l2 - f2)); } /* Check type equivalence in a name list like ||... Return 0 if equal, -1 if nb < tb, 1 if nb > tb */ SWIGRUNTIME int SWIG_TypeCmp(const char *nb, const char *tb) { int equiv = 1; const char* te = tb + strlen(tb); const char* ne = nb; while (equiv != 0 && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te); if (*ne) ++ne; } return equiv; } /* Check type equivalence in a name list like ||... Return 0 if not equal, 1 if equal */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0; } /* Check the typename */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (strcmp(iter->type->name, c) == 0) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (iter->type == from) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { swig_cast_info *cast = ti->cast; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; while (cast) { if (!cast->converter) { swig_type_info *tc = cast->type; if (!tc->clientdata) { SWIG_TypeClientData(tc, clientdata); } } cast = cast->next; } } SWIGRUNTIME void SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientData(ti, clientdata); ti->owndata = 1; } /* Search for a swig_type_info structure only by mangled name Search is a O(log #types) We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_MangledTypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { swig_module_info *iter = start; do { if (iter->size) { size_t l = 0; size_t r = iter->size - 1; do { /* since l+r >= 0, we can (>> 1) instead (/ 2) */ size_t i = (l + r) >> 1; const char *iname = iter->types[i]->name; if (iname) { int compare = strcmp(name, iname); if (compare == 0) { return iter->types[i]; } else if (compare < 0) { if (i) { r = i - 1; } else { break; } } else if (compare > 0) { l = i + 1; } } else { break; /* should never happen */ } } while (l <= r); } iter = iter->next; } while (iter != end); return 0; } /* Search for a swig_type_info structure for either a mangled name or a human readable name. It first searches the mangled names of the types, which is a O(log #types) If a type is not found it then searches the human readable names, which is O(#types). We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { /* STEP 1: Search the name field using binary search */ swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); if (ret) { return ret; } else { /* STEP 2: If the type hasn't been found, do a complete search of the str field (the human readable name) */ swig_module_info *iter = start; do { size_t i = 0; for (; i < iter->size; ++i) { if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) return iter->types[i]; } iter = iter->next; } while (iter != end); } /* neither found a match */ return 0; } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = (unsigned char)((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = (unsigned char)((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (unsigned char)(d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (unsigned char)(d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif swig-4.0.2/Lib/cdata.i0000644000175000017500000000533413667507523014323 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cdata.i * * SWIG library file containing macros for manipulating raw C data as strings. * ----------------------------------------------------------------------------- */ %{ typedef struct SWIGCDATA { char *data; int len; } SWIGCDATA; %} /* ----------------------------------------------------------------------------- * Typemaps for returning binary data * ----------------------------------------------------------------------------- */ #if SWIGGUILE %typemap(out) SWIGCDATA { $result = scm_from_locale_stringn($1.data,$1.len); } %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); #elif SWIGPHP7 %typemap(out) SWIGCDATA { ZVAL_STRINGL($result, $1.data, $1.len); } %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); #elif SWIGJAVA %apply (char *STRING, int LENGTH) { (const void *indata, int inlen) } %typemap(jni) SWIGCDATA "jbyteArray" %typemap(jtype) SWIGCDATA "byte[]" %typemap(jstype) SWIGCDATA "byte[]" %fragment("SWIG_JavaArrayOutCDATA", "header") { static jbyteArray SWIG_JavaArrayOutCDATA(JNIEnv *jenv, char *result, jsize sz) { jbyte *arr; int i; jbyteArray jresult = JCALL1(NewByteArray, jenv, sz); if (!jresult) return NULL; arr = JCALL2(GetByteArrayElements, jenv, jresult, 0); if (!arr) return NULL; for (i=0; i Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 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 . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . swig-4.0.2/CHANGES.current0000644000175000017500000001504413667507523015042 0ustar williamwilliamBelow are the changes for the current release. See the CHANGES file for changes in older releases. See the RELEASENOTES file for a summary of changes in each release. Issue # numbers mentioned below can be found on Github. For more details, add the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.0.2 (8 Jun 2020) ========================== 2020-06-07 vigsterkr [Ruby] #1717 Nil fix mangling strings 2020-06-07 vadz #1748 Fix doxygen comments quoting issue 2020-06-07 munoah #1800 Escape spaces in file paths for dependencies (-M -MM etc) 2020-06-06 andreas-schwab [Ruby] #1801 Fix encoding on big endian systems when wrapping std::wstring. 2020-05-31 kwwette [Octave] #1789 error handling improvements and return error code on exit for SWIG wrapped modules. 2020-05-30 msteinbeck [D] #1593 Replace broken imports when using newer versions of D. 2020-05-29: ZackerySpytz [Python] #1716 Performance improvements converting strings when using Python >= 3.3. 2020-05-28: ZackerySpytz #1776 Quite dramatically decrease run times when generating very large interface files by changing some internal memory pool sizes. 2020-05-28: mcfarljm #1788 Fix handling of Doxygen \endlink command. 2020-05-24: vapier [Javascript] #1796 Fix pkg-config invocation in configure. 2020-04-30: kwwette [Octave] Fix exception raising for newer Octave versions Since (at least) Octave 5.1.0, the Octave error() function now raises a C++ exception, which if uncaught immediately exits a SWIG wrapper function, bypassing any cleanup code that may appear after a "fail:" label. This patch adds a "try { ... } catch(...) { }" block around the contents of SWIG wrapper functions to first execute the cleanup code before rethrowing any exception raised. It is backward compatible with earlier versions of Octave where error() does not raise an exception, which will still branch to the "fail:" block to execute cleanup code if an error is encountered. Note that the new "try { ... } catch(...) { }" block will localise any local variables used in typemaps that were NOT declared through SWIG's %typemap(...) syntax, so it's possible this could break existing SWIG wrappers which were implicitly sharing local variables between typemaps. This can be fixed, however, by declaring local variables which need to be shared between typemaps through SWIG's %typemap(...) syntax. 2020-02-18: ryannevell [Lua] #1728 Add support for LUA lightuserdata to SWIG_Lua_ConvertPtr. 2020-02-18: dmach [Ruby] #1725 Fix gcc -Wcatch-value warnings. 2020-02-14: treitmayr #1724 Fix wrapping of abstract user-defined conversion operators. 2020-02-13: ddurham2 [Python] #1512 Fix memleak when using STL containers of shared_ptr objects. 2020-02-06: wsfulton [Python] #1673 #1674 Fix setting 'this' when extending a proxy class with __slots__. 2020-01-31: vadz [Ruby] #1651 Add std::auto_ptr<> typemaps. 2020-01-31: ZackerySpytz [Python] #1700 More robust error checking for failures in calls to Python C API: PyBytes_AsStringAndSize() and PyString_AsStringAndSize(). 2020-01-31: vadz [Python] #1710 Fix crash parsing empty docstrings. 2020-01-30: Alzathar [R] #910 #914 Fix R memory leak on exception. 2020-01-30: richardbeare [R] #1511 Fix bug wrapping functions. These were previously incorrectly wrapped as if they were variables. This happened when 'get' or 'set' was in the name of the function or method, but sometimes also in some other circumstances. If you were using R attribute syntax to access these methods, you'll need to switch to calling them as R methods. *** POTENTIAL INCOMPATIBILITY *** 2020-01-24: etse-dignitas, wsfulton [C#, D, Java] #1533 Fix upcasting for shared_ptr's of templated types. 2020-01-16: mcfarljm #1643 #1654 When using -doxygen, fix segfault when nameless parameters or vararg parameters are used. 2020-01-16: mcfarljm #1632 #1659 Fix newline handling for doxygen "///" comments. 2020-01-14: mcfarljm #1647 #1656 Fix crash handling empty doxygen comments. 2020-01-14: mcfarljm #1608 Improve doxygen support. - Add support for \param[] commands such as: \param[in]. - Optional arguments are marked as 'optional' in pydoc. - Improve support for \code commands so that other languages are supported as code blocks. Support added for java, c and py. For example Python: \code{.py} ... \endcode - Fix doxygen handling of \em and \p tags for Python. 2020-01-13: wsfulton [Python] #1595 Python -builtin constructors silently ignored keyword arguments. Instead of silenty ignoring them, now a "TypeError: f() takes no keyword arguments" exception is thrown if keyword arguments are used. Hence constructors and normal methods/ functions behave in the same way. Note, -keyword should be used with -builtin to obtain keyword argument support. 2020-01-05: jschueller shadchin [Python] #1670 #1696 Add missing field initializers introduced in python 3.8: tp_vectorcall and tp_print. 2020-01-05: friedrichatgc [Octave] #1688 Change swig_this() to use size_t instead of long for compatibility with Windows 64 bit. 2020-01-05: treitmayr [Ruby] #1692 #1689 Add support for Ruby 2.7 2019-12-30: treitmayr [Ruby] #1653 #1668 Fix code generated when using -globalmodule option. 2019-12-29: ZackerySpytz [OCaml] #1686 Fix compilation errors with OCaml 4.09.0. 2019-12-10: wsfulton #1679 Fix parsing of C++11 identifiers with special meaning (final and override) when they are used as part of the scope name of an identifier, such as a namespace name. 2019-11-26: wsfulton [C#] #1628 'out' or 'ref' used in a cstype typemap was not always stripped out in parts of director code generation. 2019-11-01: wsfulton [Python] #1595 Fix bug in support for keyword arguments (kwargs feature or -keyword) when using -builtin. The fix is in the argument error checking when wrapping zero argument constructors only. swig-4.0.2/.travis.yml0000644000175000017500000003445613667507523014507 0ustar williamwilliamlanguage: cpp matrix: include: - compiler: clang os: linux env: SWIGLANG= sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG= sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.4 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.6 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.7 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.8 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.9 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=6 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=7 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=8 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=9 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=csharp sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=d VER=2.066.0 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=d VER=2.086.1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=go VER=1.3 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=go VER=1.8 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=go VER=1.12 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=guile sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=java sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node VER=0.10 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node VER=4 CPP11=1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node VER=6 CPP11=1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node VER=8 CPP11=1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node VER=10 CPP11=1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=jsc sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=v8 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=lua sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=lua VER=5.3 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=mzscheme sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ocaml sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=octave SWIGJOBS=-j2 sudo: required dist: xenial # Octave v4.0.0 - compiler: gcc os: linux env: SWIGLANG=octave SWIGJOBS=-j2 CPP11=1 sudo: required dist: bionic # Octave v4.2.2 - compiler: gcc os: linux env: SWIGLANG=perl5 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=php VER=7.0 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=php VER=7.1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=php VER=7.2 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=php VER=7.3 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python # 2.7 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.2 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.3 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.4 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.5 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.6 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.7 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.8 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES="-builtin -O" sudo: required dist: xenial - os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin GCC=6 CPP11=1 sudo: required dist: xenial - os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin GCC=6 CPP11=1 PY3=3 VER=3.8 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.4 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.5 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.7 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.8 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES="-builtin -O" PY3=3 VER=3.8 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.8 SWIGOPTPY3= sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-O sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-O PY3=3 VER=3.8 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=r sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=1.9 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.0 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.2 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.3 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.4 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.5 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.6 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.7 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=scilab sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=tcl sudo: required dist: xenial - os: linux env: SWIGLANG=csharp CPP11=1 sudo: required dist: xenial - os: linux env: SWIGLANG=go VER=1.6 CPP11=1 sudo: required dist: xenial - os: linux env: SWIGLANG=java CPP11=1 sudo: required dist: xenial - os: linux env: SWIGLANG=python CPP11=1 sudo: required dist: xenial - os: linux env: SWIGLANG=r CPP11=1 # Note: making 'R CMD SHLIB' use a different compiler is non-trivial sudo: required dist: xenial - os: linux env: SWIGLANG=ruby CPP11=1 sudo: required dist: xenial - os: linux env: SWIGLANG=tcl CPP11=1 sudo: required dist: xenial - os: linux env: SWIGLANG=csharp GCC=6 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=go VER=1.6 GCC=6 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=java GCC=6 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=python GCC=6 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=ruby GCC=6 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=tcl GCC=6 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=java GCC=7 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=python GCC=7 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=csharp GCC=8 CPP17=1 sudo: required dist: xenial - os: linux env: SWIGLANG=java GCC=8 CPP17=1 sudo: required dist: xenial - os: linux env: SWIGLANG=python GCC=8 CPP17=1 PY3=3 VER=3.8 sudo: required dist: xenial - os: linux env: SWIGLANG=csharp GCC=9 CPP17=1 sudo: required dist: xenial - os: linux env: SWIGLANG=java GCC=9 CPP17=1 sudo: required dist: xenial - os: linux env: SWIGLANG=python GCC=9 CPP17=1 PY3=3 VER=3.8 sudo: required dist: xenial - os: linux arch: s390x env: SWIGLANG=ruby CPP11=1 sudo: required dist: xenial - compiler: gcc os: osx env: SWIGLANG= - compiler: clang os: osx env: SWIGLANG= - compiler: clang os: osx env: SWIGLANG=csharp - compiler: clang os: osx env: SWIGLANG=go - compiler: clang os: osx env: SWIGLANG=guile CSTD=c11 - compiler: clang os: osx env: SWIGLANG=java - compiler: clang os: osx env: SWIGLANG=lua - compiler: clang os: osx env: SWIGLANG=octave SWIGJOBS=-j2 CPP11=1 - compiler: clang os: osx env: SWIGLANG=perl5 - compiler: clang os: osx env: SWIGLANG=python - compiler: clang os: osx env: SWIGLANG=python PY3=3 - compiler: clang os: osx env: SWIGLANG=ruby - compiler: clang os: osx env: SWIGLANG=tcl - compiler: clang os: osx env: SWIGLANG=java CPP17=1 osx_image: xcode10.2 - compiler: clang os: osx env: SWIGLANG=python PY3=3 CPP17=1 osx_image: xcode10.2 allow_failures: # Newer version of D not yet working/supported - compiler: gcc os: linux env: SWIGLANG=d VER=2.086.1 sudo: required dist: xenial # seg fault in director_basic testcase - compiler: gcc os: linux env: SWIGLANG=php VER=7.2 sudo: required dist: xenial # Experimental languages - compiler: gcc os: linux env: SWIGLANG=mzscheme sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ocaml sudo: required dist: xenial before_install: - date -u - uname -a - if test "$TRAVIS_OS_NAME" = "linux"; then lscpu; grep "model name" /proc/cpuinfo || echo 'Unknown CPU model'; grep "MemTotal" /proc/meminfo || echo 'Unknown system memory amount'; fi - if test "$TRAVIS_OS_NAME" = "osx"; then sysctl -a | grep brand_string; fi # Travis overrides CC environment with compiler predefined values - if test -n "$GCC"; then export CC="gcc-$GCC" && export CXX="g++-$GCC"; fi install: - if test "$TRAVIS_OS_NAME" = "linux"; then source Tools/travis-linux-install.sh; fi - if test "$TRAVIS_OS_NAME" = "osx"; then source Tools/travis-osx-install.sh; fi - ls -la $(which $CC) $(which $CXX) && $CC --version && $CXX --version script: - echo 'Configuring...' && echo -en 'travis_fold:start:script.1\\r' - if test -n "$CPP11"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++11 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++11; fi - if test -n "$CPP14"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++14 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++14; fi - if test -n "$CPP17"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++17 -Wall -Wextra" "CFLAGS=-std=c17 -Wall -Wextra") && export CSTD=c17 && export CPPSTD=c++17; fi - if test -n "$SWIGLANG"; then CONFIGOPTS+=(--without-alllang --with-$WITHLANG); fi - echo "${CONFIGOPTS[@]}" - ./autogen.sh && mkdir -p build/build && cd build/build && ../../configure "${CONFIGOPTS[@]}" - echo -en 'travis_fold:end:script.1\\r' - make -s $SWIGJOBS - ./swig -version && ./swig -pcreversion - if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-ccache; fi - if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-errors-test-suite; fi - echo 'Installing...' && echo -en 'travis_fold:start:script.2\\r' - if test -z "$SWIGLANG"; then sudo make -s install && swig -version && ccache-swig -V; fi - echo -en 'travis_fold:end:script.2\\r' # Stricter compile flags for examples. Various headers and SWIG generated code prevents full use of -pedantic. - if test -n "$SWIGLANG"; then cflags=$($TRAVIS_BUILD_DIR/Tools/testflags.py --language $SWIGLANG --cflags --std=$CSTD --compiler=$CC) && echo $cflags; fi - if test -n "$SWIGLANG"; then cxxflags=$($TRAVIS_BUILD_DIR/Tools/testflags.py --language $SWIGLANG --cxxflags --std=$CPPSTD --compiler=$CC) && echo $cxxflags; fi - if test -n "$SWIGLANG"; then make -s check-$SWIGLANG-version; fi - if test -n "$SWIGLANG"; then make check-$SWIGLANG-enabled; fi - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-examples CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-test-suite CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi - echo 'Cleaning...' && echo -en 'travis_fold:start:script.3\\r' - make check-maintainer-clean && ../../configure $CONFIGOPTS - echo -en 'travis_fold:end:script.3\\r' swig-4.0.2/preinst-swig.in0000644000175000017500000000035613667507523015351 0ustar williamwilliam#!/bin/sh # Convenience script for running SWIG before it is installed. # Intended for ad-hoc usage and not by the test-suite or examples. builddir=`dirname "$0"` SWIG_LIB='@SWIG_LIB_PREINST@' export SWIG_LIB exec "$builddir/swig" "$@" swig-4.0.2/CHANGES0000644000175000017500000403017513667507523013367 0ustar williamwilliamSWIG (Simplified Wrapper and Interface Generator) See the CHANGES.current file for changes in the current version. See the RELEASENOTES file for a summary of changes in each release. Issue # numbers mentioned below can be found on Github. For more details, add the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.0.1 (21 Aug 2019) =========================== 2019-08-20: TekuConcept [Javascript] #1535 Add %native support to Javascript. 2019-08-20: bkotzz [Java] #1616 Add SWIG_JavaIllegalStateException to support throwing java.lang.IllegalStateException from JNI code. 2019-08-19: sjml [Lua] #1596 tostring output changes to show the underlying C/C++ pointer. 2019-08-08: rokups [C#, Java] #1601 Fix invalid code generated for "%constant enum EnumType. 2019-08-07: wsfulton [Python] Fix method overloading of methods that take STL containers of different types. The following usage (using std::vector) would fail when using -builtin: %include %include %inline %{ struct X {}; %} %template(VectorX) std::vector; %template(VectorInt) std::vector; %inline %{ using namespace std; string VectorOverload(vector v); string VectorOverload(vector v); %} The following would incorrectly fail: s = VectorOverload([1, 2, 3]) With: Traceback (most recent call last): File "runme3.py", line 20, in ret = VectorOverload([1, 2, 3]) TypeError: Wrong number or type of arguments for overloaded function 'VectorOverload'. Possible C/C++ prototypes are: VectorOverload(std::vector< Number,std::allocator< Number > >) VectorOverload(std::vector< int,std::allocator< int > >) The problem was due to some error handling that was not cleared during typehecking. In this case an error was not cleared when the elements in the list failed the typecheck for converting to X. Only occurs in Python 3+. In some combinations of overloaded methods, the following type of error message would occur: RuntimeError: in sequence element 0 The above exception was the direct cause of the following exception: Traceback (most recent call last): File "runme3.py", line 23, in check(VectorOverload(v), "vector") SystemError: returned a result with an error set 2019-08-01: wsfulton #1602 Fix regression in 4.0.0 where a template function containing a parameter with the same name as the function name led to the parameter name used in the target language being incorrectly modified. 2019-07-29: wsfulton Remove all generated files on error. Previously generated files were not removed, potentially breaking Makefiles using file dependencies, especially when -Werror (warnings as errors) was used. 2019-07-23: smithx [C#] #1530 #1532 Fix marshalling of std::wstring to C#. 2019-07-18: gicmo [Python] #1587 Python 3.8 support - remove use of deprecated PyObject_GC_UnTrack. 2019-07-18: cher-nov [Python] #1573 Generated Python code uses consistent string quoting style - double quotes. 2019-07-16: geefr [C#] #616 #1576 Fix C# bool INPUT[], bool OUTPUT[], bool INOUT[] typemaps to marshall as 1-byte. 2019-07-12: vadz [C#, Java] #1568 #1583 Fix std::set<> typemaps for primitive types. 2019-07-12: vadz #1566 #1584 Regression in 4.0.0 - fix missing value for first item of enums with trailing comma. 2019-07-11: mcfarljm #1548 #1578 Fix segfault in Doxygen parser parsing empty lines in some commands like \code. 2019-07-09: IsaacPascual [C#, Java] #1570 Fix name of generated C#/Java classes for %interface macros in swiginterface.i when wrapping nested C++ classes. 2019-07-05: wsfulton [Python] #1547 Whitespace fixes in Doxygen translated comments into pydoc comments for Sphinx compatibility. 2019-06-28: wsfulton [MzScheme, OCaml] #1559 $arg and $input were incorrectly substituted in the argout typemap when two or more arguments were present. 2019-06-24: wsfulton [Python, Ruby] #1538 Remove the UnknownExceptionHandler class in order to be C++17 compliant as it uses std::unexpected_handler which was removed in C++17. This class was intended for director exception handling but was never used by SWIG and was never documented. *** POTENTIAL INCOMPATIBILITY *** 2019-06-06: bkotzz [Java] #1552 Improve performance in Java std::vector constructor wrapper that takes a native Java array as input. 2019-06-03: olly [Python] Fix regression in implicit_conv handling of tuples, introduced in SWIG 4.0.0. Fixes #1553, reported by Alexandre Duret-Lutz. 2019-05-24: wsfulton [Octave] Fix detection of Octave on MacOS. 2019-05-24: opoplawski [Octave] #1522 Adapt OCTAVE_LDFLAGS for Octave 5.1. 2019-05-22: ferdynator [PHP] #1528 Don't add a closing '?>' PHP tag to generated files. PSR-2 says it MUST be omitted for files containing only PHP. Version 4.0.0 (27 Apr 2019) =========================== 2019-04-24: vadz #1517 Fix crash if "@return" Doxygen tag was used on a node without any return type. 2019-04-24: vadz #1515 Fix parsing of enums with trailing comma when using -doxygen. 2019-04-19: ianlancetaylor [Go] #1055 When generating Go code, make -cgo the default. Add new -no-cgo option to disable the default. 2019-04-19: pbecherer [Tcl] #1508 Fix Visual Studio 2015 and later compilation errors due to snprintf macro definition. 2019-04-09: wsfulton [C#] Fix FxCop warning CA2002 in SWIGPendingException - a lock on a reference of type 'Type'. 2019-03-30: wsfulton [Java, D] Add the parameters typemap attribute to the javadestruct, javadestruct_derived, ddispose, ddispose_derived typemaps to mirror enhanced flexibility in the csdisposing and csdisposing_derived (C#) typemaps. If provided the contents are generated as the delete/dispose method's parameters declaration. 2019-03-30: wsfulton [C#] #421 Fix FxCop warning CA1063 by implementing the recommended Dispose methods for the IDisposable interface. Previously just the Dispose() method was generated. Now the Dispose() and Dispose(bool disposing) methods are generated. Changes are required if custom "csfinalize", "csdestruct" or "csdestruct_derived" typemaps are being used. Details in #421 on Github. SWIG will error out if one of the "csfinalize, "csdestruct" or "csdestruct_derived" typemaps are found. Example error message: foo.h:60: Error: A deprecated csfinalize typemap was found for Foo, please remove it and replace all csdestruct, csdestruct_derived and csfinalize typemaps by the csdispose, csdispose_derived, csdisposing and csdisposing_derived typemaps. *** POTENTIAL INCOMPATIBILITY *** 2019-03-25: Liryna [C#] #1143 Add std_list.i for std::list support. The C# std::list wrappers are made to look and feel like a C# System.Collections.Generic.LinkedList<> collection. The IEnumerable<> interface is implemented in the proxy class. The ICollection<> interface can also be implemented to provide enhanced functionality whenever a C++ operator== is available. This is the case for when T is a primitive type or a pointer. If T does define an operator==, then use the SWIG_STD_LIST_ENHANCED macro to obtain this enhanced functionality, for example: SWIG_STD_LIST_ENHANCED(SomeNamespace::Klass) %template(ListKlass) std::list; 2019-03-18: richardbeare [R] #1328 Non-trivial enums are working now. The enum values are now obtained from the C/C++ layer. const reference enums and C++11 enum classes are also now working. 2019-03-14: mochizk [Javascript] #1500 Fix compilation errors due to deprecating V8 API in Node.js. New V8 API is used if node.js >= v10.12, or if V8 >= v7.0. 2019-03-12: vadz [C#] #1495 Add std_set.i for std::set support. 2019-03-11: dirteat,opoplawski [Octave] Fix compilation errors in Octave 5.1. error: format not a string literal and no format arguments [-Werror=format-security] 2019-02-28: wsfulton [Java] std::vector improvements for types that do not have a default constructor. The std::vector wrappers have been changed to work by default for elements that are not default insertable, i.e. have no default constructor. This has been achieved by not wrapping: vector(size_type n); Previously the above had to be ignored via %ignore. If the above constructor is still required it can be added back in again via %extend: %extend std::vector { vector(size_type count) { return new std::vector< T >(count); } } Alternatively, the following wrapped constructor could be used as it provides near-enough equivalent functionality: vector(jint count, const value_type& value); *** POTENTIAL INCOMPATIBILITY *** 2019-02-25: wsfulton [Python] Fix compile errors wrapping overloaded functions/constructors where a vararg function is declared after a non-vararg function. 2019-02-23: zphensley42 Use fully qualified name 'java.lang.Object' instead of 'Object' in generated code to avoid clashes with wrapped C++ classes called 'Object'. 2019-02-23: gtbX [Java] #1035 Add (const char *STRING, size_t LENGTH) typemaps in addition to the non-const typemaps (char *STRING, size_t LENGTH) which does not attempt to write back to the const string. 2019-02-22: tamuratak [Ruby] #984 Add support for RTypedData introduced in Ruby 1.9.3. 2019-02-22: ZackerySpytz #1483 Fix compilation failures when a director class has final methods. 2019-02-21: wsfulton [Java] #1240 Suppress Java 9 deprecation warnings on finalize method. 2019-02-21: ZackerySpytz #1480 Fix some rejections of valid floating-point literals. 2019-02-19: wsfulton #1475 Fix regression parsing gcc preprocessor linemarkers in the form: # linenum filename flags 2019-02-18: jakecobb [Python] #945 #1234 Elements in std::vector memory access fix. Accessing an element in a std::vector obtains a reference to the element via an iterator pointing to the element in the container. If the vector is garbage collected, the SWIG wrapper containing the pointer to the element becomes invalid. The fix is to obtain a back-reference to the container by the wrapper to the element in the Python layer to prevent the garbage collector from destroying the underlying container. 2019-02-17: wsfulton Fix typemap matching to expand template parameters when the name contains template parameters. In the %typemap below the type is T and the name is X::make and the name now expands correctly to X< int >::make template struct X { %typemap(out) T X::make "..." T make(); }; %template(Xint) X; 2019-02-16: wsfulton Fix parser error containing multiple #define statements inside an enum. The second #define fails to parse: enum FooEnum { ENUM1 = 0, ENUM2 = 1, #define MACRO_DEF1 "Hello" #define MACRO_DEF2 "World!" ENUM3 = 2, ENUM4 = 3, }; Bug mentioned at https://sourceforge.net/p/swig/patches/333/ 2019-02-14: wsfulton Add some missing copy constructors into STL containers. 2019-02-14: bkotzz [Java] #1356 Add STL containers: std::unordered_map std::unordered_set std::set 2019-02-14: bkotzz [Java] #1356 std::map wrappers have been modified. Now the Java proxy class extends java.util.AbstractMap. The std::map container looks and feels much like a java.util.HashMap from Java. A few members have changed their names. If the old method signatures are needed, then copy std_map.i from swig-3.0.12 and use that instead. Alternatively, add the old missing methods to the new methods by using the following %proxycode: %extend std::map { %proxycode %{ // Old API public boolean empty() { return isEmpty(); } public void set($typemap(jboxtype, K) key, $typemap(jboxtype, T) x) { put(key, x); } public void del($typemap(jboxtype, K) key) { remove(key); } public boolean has_key($typemap(jboxtype, K) key) { return containsKey(key); } %} } *** POTENTIAL INCOMPATIBILITY *** 2019-02-13: ZackerySpytz #1469 Add support for C++17 hexadecimal floating literals. 2019-02-11: wsfulton [OCaml] #1437 OCaml has been give the 'Experimental' language status. The examples work and most of the test-suite is also working, so it is quite close to being a 'Supported' language. 2019-02-10: ZackerySpytz #1464 Add support for C++14 binary integer literals. 2019-02-10: ZackerySpytz #1450 Add support for C++11 UCS-2 and UCS-4 character literals. Also, add support for C++17 UTF-8 character literals. 2019-02-10: wsfulton [MzScheme] #1437 MzScheme/Racket is now an 'Experimental' language. The examples work and a large portion of the test-suite is also working. 2019-02-10: wsfulton [MzScheme] Destructor wrappers were not being generated. 2019-02-10: wsfulton [MzScheme] Static variable wrappers fixed - $argnum was not expanded. 2019-02-10: sethrj #1452 Fix %apply for anonymous template instantiations 2019-02-09: olly [PHP] Fix access to already released memory during PHP module shutdown, which often didn't cause visible problems, but could result in segmentation faults, bus errors, etc. Fixes #1170, reported by Jitka Plesníková. 2019-02-09: olly [PHP] A renamed constructor is now wrapped as a static method in PHP. 2019-02-08: olly [PHP] Don't generate code which references $r when $r hasn't been defined. This could happen in overloaded methods which returned void and took at least one const std::string& parameter. 2019-02-08: olly [PHP] The generated code is now compatible with PHP 7.3, and the testsuite now runs cleanly with this version too. 2019-02-05: wsfulton #1437 SWIG now classifies the status of target languages into either 'Experimental' or 'Supported'. This status is provided to indicate the level of maturity to expect when using a particular target language as not all target languages are fully developed. Details are in the Introduction.html chapter of the documentation. 2019-02-04: wsfulton [CFFI] #1447 Common Lisp CFFI has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [Allegrocl] #1447 Allegro Common Lisp has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [Chicken] #1447 CHICKEN has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [CLISP] #1447 GNU Common Lisp has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [S-EXP] #1447 Common Lisp S-Exp has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [UFFI] #1447 Common Lisp UFFI has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [Pike] #1447 Pike has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [Modula3] #1447 Modula3 has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-02: ahnolds [Python] Documentation enhancements for Python: #728 Fixed the handling of autodoc when using -fastproxy. #1367 Added documentation to wrapped member variables using the property(... doc="...") construct. Only show a single documentation entry for functions with default arguments when using autodoc. Fixed a bug where a cached doxygen docstring could be deleted while still in use, causing swig to segfault. 2019-01-31: olly SWIG now requires a target language to be specified instead of defaulting to wrapping for Tcl. Specifying swig --help without a target language now just shows the generic help. The -nolang option has been removed. 2019-01-28: ZackerySpytz [OCaml] #1429 Remove support for OCaml versions < 3.12.0. *** POTENTIAL INCOMPATIBILITY *** 2019-01-22: vadz [Ruby, Octave] #1424 Improve autodoc parameter naming. 2019-01-22: vadz [Python] #1271 #1423 Always include default parameter values in autodoc strings. 2019-01-19: vadz #1272, #1421 When a function's parameter is a keyword, the name of the paramater is no longer simply changed to argN, where N is the argument number. Instead the parameter name is changed to the renaming rules for keywords that normally apply to symbols such as classes/functions etc. Note that unlike other symbol renaming, parameter renaming does not issue a warning when the parameter is renamed. This change only affects languages where the parameter names are actually used, for example, Java function parameter lists in the proxy class or Python documentation comments. 2019-01-18: wsfulton #1420 Fix gdb debugger functions 'swigprint' and 'locswigprint' from swig.gdb to work with newer versions of gdb-8. Fixes errors when debugging SWIG source with gdb: (gdb) swigprint n Undefined command: "Printf". Try "help". 2019-01-16: wsfulton Python static method wrapper changes - Static method wrappers were using the 'fastproxy' approach by default. This is inconsistent with instance method wrappers. The fastproxy approach is now turned off by default to be consistent with instance methods. Static method wrappers can now also be controlled using the -fastproxy and -olddefs options. Example: struct Klass { static int statmethod(int a = 2); }; generates by default: class Klass(object): ... @staticmethod def statmethod(a=2): return _example.Klass_statmethod(a) instead of the following (which can be restored by using -fastproxy): class Klass(object): ... statmethod = staticmethod(_example.Klass_statmethod) - Modernise wrappers for static methods to use decorator syntax - @staticmethod. - Add missing runtime test for static class methods and using the actual class method. 2019-01-12: ZackerySpytz [OCaml] #1403 #1194 Fix compilation problems for OCaml >= 4.03.0 due to OCaml using int64_t instead of int64. 2019-01-11: ZackerySpytz [OCaml] #1400 Fix the getters and setters of non-static member variables. 2019-01-07: wsfulton #358 Add VOID to windows.i 2019-01-05: wsfulton #948 #1019 #1273 Fix for C++11 raw strings where the delimiters were mistakenly left in the string contents in situations where the string was copied into generated code. For example, %constant, the "docstring" feature and for C#/Java/D constants turned on with %javaconst/%csconst/%dmanifestconst. 2019-01-05: wsfulton [Ruby] #538. Fix Ruby support for %feature("docstring"). 2019-01-03: wsfulton #1202 Fix overloading of non-pointer class types in scripting languages when overloaded with a pointer and a NULL scripting language equivalent is used, eg None in Python. The implementation changes the SWIGTYPE, SWIGTYPE& and SWIGTYPE&& typecheck typemaps to prevent accepting a conversion to a NULL pointer. 2019-01-03: ZackerySpytz [OCaml] #1386 Fix the OCaml examples and test suite for out-of-source builds. 2019-01-01: wsfulton [Python] #639 remove duplicate proxy method definitions for global function wrappers. Global functions previously generated two definitions, eg: def foo(): return _example.foo() foo = _example.foo The first definition is replaced by the second definition and so the second definition is the one used when the method is actually called. Now just the first definition is generated by default and if the -fastproxy command line option is used, just the second definition is generated. The second definition is faster as it avoids the proxy Python method as it calls the low-level C wrapper directly. Using both -fastproxy and -olddefs command line options will restore the previously generated code as it will generate both method definitions. With this change, the wrappers for global C/C++ functions and C++ class methods now work in the same way wrt to generating just a proxy method by default and control via -fastproxy/-olddefs options. 2018-12-20: hasinoff,wsfulton [Java] #1334 Set Java thread name to native thread name when using directors. Default is to use name "Thread-XXX" and is still works like this by default. However, adding the following will turn on the thread name setting (works for more recent versions of Linux and MacOS): %begin %{ #define SWIG_JAVA_USE_THREAD_NAME %} 2018-12-20: chlandsi [Python] #1357. Fix overriding __new__ in Python 3.6. Fixes SystemError: Objects/tupleobject.c:81: bad argument to internal function" 2018-12-16: wsfulton [Python] #848 #1343 The module import logic has changed to stop obfuscating real ImportError problems. Only one import of the low-level C/C++ module from the pure Python module is attempted now. Previously a second import of the low-level C/C++ module was attempted after an ImportError occurred and was done to support 'split modules'. A 'split module' is a configuration where the pure Python module is a module within a Python package and the low-level C/C++ module is a global Python module. Now a 'split module' configuration is no longer supported by default. This configuration can be supported with a simple customization, such as: %module(package="mypackage", moduleimport="import $module") foo or if using -builtin: %module(package="mypackage", moduleimport="from $module import *") foo instead of %module(package="mypackage") foo See the updated Python chapter titled "Location of modules" in the documentation. 2018-12-11: tlby [Perl] #1374 repair EXTEND() handling in typemaps 2018-12-06: vadz #1359 #1364 Add missing nested class destructor wrapper when the nested class is inside a template. Removes associated bogus 'Illegal destructor name' warning. Only occurred when the nested class' destructor is explicitly specified. 2018-12-04: adr26 [Python] #1368 #1369 Access Violation in tp_print caused by mismatched Python/extension CRT usage Remove all use of tp_print, as this API uses a FILE*, which can be mismatched when modules are built with different C libraries from the main python executable. This change also brings consistent output between Python 2 and 3 for the 'cvar' SWIG object (that contains the global variables) and SWIG packed objects (such as callback constants). 2018-12-04: wsfulton [Python] #1282 Fix running 'python -m' when using 'swig -builtin' Similar to the earlier PEP 366 conforming fix for non-builtin. 2018-11-29: adr26 [Python] #1360 Leak of SWIG var link object Fix reference counting on _SWIG_globals to allow var link to be freed on module unload. 2018-11-28: wsfulton [Python] When using -builtin, the two step C-extension module import is now one step and the wrapped API is only available once and not in an underlying module attribute like it is without -builtin. To understand this, consider a module named 'example' (using: %module example). The C-extension is compiled into a Python module called '_example' and a pure Python module provides the actual API from the module called 'example'. It was previously possible to additionally access the API from the module attribute 'example._example'. The latter was an implementation detail and is no longer available. It shouldn't have been used, but if necessary it can be resurrected using the moduleimport attribute described in the Python chapter of the documentation. If both modules are provided in a Python package, try: %module(moduleimport="from . import _example\nfrom ._example import *") example or more generically: %module(moduleimport="from . import $module\nfrom .$module import *") example and if both are provided as global modules, try: %module(moduleimport="import _example\nfrom _example import *") example or more generically: %module(moduleimport="import $module\nfrom $module import *") example The module import code shown will appear in the example.py file. 2018-11-24: vadz #1358 Fix handling of abstract base classes nested inside templates Correct detecting of whether a derived class method overrides a pure virtual base class method when both classes are nested inside a template class: this notably didn't work correctly for methods taking parameters of the base class type. 2018-11-22: rupertnash [Python] #1282 Make generated module runnable via python -m (PEP 366 conforming) Previously any SWIG generated modules in a package would fail with an ImportError when using 'python -m' for example 'python -m mypkg.mymodule'. This fix also allows the SWIG generated module to be placed into a directory and then renamed __init__.py to convert the module into a package again. This ability stopped working in swig-3.0.9. However, only Python 2.7 or 3.3 and later work. If Python 3.2 support is needed, use moduleimport in %module to customise the import code. 2018-11-13: wsfulton #1340 Remove -cppcast and -nocppcast command line options (this was an option available to the scripting language targets). The -cppcast option is still turned on by default. The -nocppcast option to turn off the use of c++ casts (const_cast, static_cast etc) has been removed. However, defining SWIG_NO_CPLUSPLUS_CAST will still generate C casts instead of C++ casts for C++ wrappers. *** POTENTIAL INCOMPATIBILITY *** 2018-11-13: wsfulton [Python] #1340 Remove -outputtuple and -nooutputtuple command line options. Both the command line and %module options of the same name have been removed. These were undocumented. The -outputtuple option returned a Python tuple instead of a list, mostly typically in the OUTPUT typemap implementations. It unclear why a tuple instead of a list return type is needed and hence this option has been removed as part of the simplification of the SWIG Python command line options for SWIG 4. 2018-11-13: wsfulton [Python] #1340 Remove -noproxyimport command line option. This option turned off the insertion of Python import statements derived from a %import directive. For example given: %module module_b %import "module_a.i" then module_b.py will contain: import module_a *** POTENTIAL INCOMPATIBILITY *** 2018-10-29: AlexanderGabriel [PHP] The following PHP7 reserved keywords are now only renamed by SWIG when used as function names in the API being wrapper: __halt_compiler array die echo empty eval exit include include_once isset list print require require_once return unset 2018-10-22: olly,wsfulton [Python] #1261 #1340 Turn on many optimisation options by default and rationalise the number of command line options. There were an unnecessary number of command line options and many of these have now been removed in a drive for simplification. Some were needed to support older versions of Python (2.6 and earlier). Many of the options could be turned on individually and when using -O. Previously -O resulted in turning on a set of options: -modern -fastdispatch -nosafecstrings -fvirtual -noproxydel -fastproxy -fastinit -fastunpack -fastquery -modernargs -nobuildnone Now -O results in turning on this reduced set: -fastdispatch -fastproxy -fvirtual The following options are now on by default, a deprecated warning is displayed if they are used: -fastinit Class initialisation code done in C/C++ rather than in Python code. -fastquery Python dictionary used for lookup of types. -fastunpack Faster unpacking of function arguments in C/C++ wrappers. -modern Use Python 2.3 features such as object and property. -modernargs Use Python 2.3 C APIs for unpacking arguments in tuples. -noproxydel Stop generating a proxy __del__ method for backwards compatiblity. -safecstrings No discernable difference The following options have been removed altogether: -aliasobj0 -buildnone -classptr -new_repr -newrepr -noaliasobj0 -nobuildnone -nocastmode -nodirvtable -noextranative -nofastinit -nofastproxy -nofastquery -nomodern -nomodernargs -nooutputtuple -nosafecstrings -old_repr -oldrepr -proxydel -new_vwm is no longer supported. Use the -newvwm alias instead. *** POTENTIAL INCOMPATIBILITY *** 2018-10-22: olly [Python] #1261 Remove command line option no longer needed as Python 2.3 and earlier are no longer supported: -classic 2018-10-09: wsfulton [D, Go, Guile, Lua, Mzscheme, Ocaml, Perl5, Php, Scilab, Tcl] Allow wrapping of std::map using non-default comparison function. 2018-10-09: vadz [Java] #1274 Allow wrapping of std::map using non-default comparison function. 2018-10-04: wsfulton [Python] #1126 Fix C default arguments with -builtin and -fastunpack and -modernargs. Problem occurred when there is just one (defaulted) parameter in the parameter list. 2018-09-24: wsfulton [Python] #1319 C++11 hash tables implementation is finished now (including for -builtin): std::unordered_map std::unordered_set std::unordered_multimap std::unordered_multiset 2018-09-21: wsfulton [Python] Fix when using -builtin and wrapping std::map, std::set, std::unordered_map or std::unordered_set to ensure __contains__ is called. This is a wrapper for the STL container's find method. Without it, Python will do its own slower sequence search. 2018-09-19: wsfulton [Python] Fix functors (wrapped as __call__) when using -builtin -modern -fastunpack. 2018-09-02: andreas.gaeer,tkrasnukha [Python] #1321 Fix assert in PyTuple_GET_SIZE in debug interpreter builds of python-3.7 when calling tp_new. 2018-09-01: ChristopherHogan [Guile] #1288 Fix garbage collection for guile >= 2.0.12. 2018-08-31: wsfulton [Python] #1319 C++11 hash tables support: std::unordered_map std::unordered_set std::unordered_multimap std::unordered_multiset is now compiling and working (sorting using -builtin not fully functional yet though). 2018-08-20: wkalinin #1305 Fix nested structure symbol tables in C mode to fix member name conflicts in different structs with the same nested struct member name. 2018-08-18: wsfulton [Python] #688 Fix makefile recursion when running python test-suite. 2018-08-18: wsfulton [Python] #1310 Re-implement Python -fastproxy option. The previous implementation failed with Python 3 and abstract base clases. The new implementation replaces the Python 2 implementation using new.instancemethod with the C API PyMethod_New to match the equivalent Python 3 implementation which uses PyInstanceMethod_New. The new approach runs slightly faster. See #1310. 2018-08-12: gmazzamuto [Python] #1283 Update pybuffer.i library to use new-style Python buffer C API. 2018-08-12: brianhatwood,wsfulton [Java] #1303 #1304 Fix crash in directors when using OUTPUT and INOUT typemaps in typemaps.i and passing NULL pointers in C++ to director method overloaded and implemented in Java. 2018-08-10: wsfulton [Python] #1293 Improve TypeError message inconsistencies between default and fastdispatch mode when handling overloaded C++ functions. Previously the error message did not always display the possible C/C++ prototypes in fastdispatch mode. 2018-08-02: furylynx,jacobwgillespie,p2k [Javascript] #1290, #968. Add support for NodeJS versions 2-10. 2018-07-31: wsfulton [Python] #1293 Overloaded C++ function wrappers now raise a TypeError instead of NotImplementedError when the types passed are incorrect. This change means there is now consistency with non-overloaded function wrappers which have always raised TypeError when the incorrect types are passed. The error message remains the same and is for example now: TypeError: Wrong number or type of arguments for overloaded function 'f'. Possible C/C++ prototypes are: f(int) f(char const *) instead of: NotImplementedError: Wrong number or type of arguments for overloaded function 'f'. Possible C/C++ prototypes are: f(int) f(char const *) *** POTENTIAL INCOMPATIBILITY *** 2018-06-23: wsfulton [Python] #718 Fix pythonnondynamic feature for modern classes Fixes nondynamic mode when an instance variable is set with the same name as a class variable in a class derived from a SWIG proxy class. This corner case set an instance variable instead of raising an AttributeError. Also fix %pythonnondynamic in Python 3 with -modern. The metaclass containing the implementation was previously not being applied in Python 3. 2018-07-17: petrmitrichev,wsfulton [Python] #1275 #1279 Initialize function-local statics (singletons) that call Python code during Python module initialization in order to avoid deadlocks with subsequent multi-threaded usage. 2018-06-15: wsfulton [Python] Fix seg fault using Python 2 when passing a Python string, containing invalid utf-8 content, to a wstring or wchar * parameter. A TypeError is thrown instead, eg: %include void instring(const std::wstring& s); instring(b"h\xe9llooo") # Python 2018-06-15: wsfulton [Python] Python 3.7 support: Replace use of deprecated PyUnicode_GetSize with PyUnicode_GetLength to remove deprecated warnings compiling the C/C++ wrappers. 2018-06-12: wsfulton [Python] Python 3.7 support: The %pythonabc feature in pyabc.i now uses base classes collections.abc.MutableSequence collections.abc.MutableMapping collections.abc.MutableSet instead of collections.MutableSequence collections.MutableMapping collections.MutableSet as the latter are deprecated in Python 3.7 and are due to be removed in Python 3.8. The classes in collections.abc.* are available from Python 3.3 onwards. If you require support for Python 3.2, then copy the pyabc.i file and modify by removing the few instances of the .abc sub-module. *** POTENTIAL INCOMPATIBILITY *** 2018-06-12: olly,wsfulton [Python] #701 Remove support for Python versions < 2.7 and 3.0 and 3.1. *** POTENTIAL INCOMPATIBILITY *** 2018-06-11: olly [Python] Fix new GCC8 warnings in generated code by avoiding casts between incompatible function types where possible, and by suppressing the warning when it's due to the design of Python's C API. Fixes #1259. 2018-06-08: philippkraft [Python] Stop exposing _swigregister to Python. It's not useful for user Python code to call this, and it just clutters the API unnecessarily. Fixes #1225. 2018-06-07: cmfoil, kabbi, Jamie Kirkpatrick, markok314, vadz, wsfulton, Yann Diorcet #170 Doxygen documentation support added. This allows translation of Doxygen comments into JavaDoc and PyDoc documentation. It is enabled via the -doxygen command line option. See the Doxygen.html chapter in the documentation for further information. 2018-06-07: olly [PHP] We've finally removed support for %pragma(php4) which was deprecated back in 2008. Use %pragma(php) instead, which has been supported since at least 2005. *** POTENTIAL INCOMPATIBILITY *** 2018-06-07: olly [PHP5] Support for PHP5 has been removed. PHP5 is no longer actively supported by the PHP developers and security support for it ends completely at the end of 2018, so it doesn't make sense to include support for it in the upcoming SWIG 4.0.0 release. *** POTENTIAL INCOMPATIBILITY *** 2018-06-06: olly [Lua] Improve configure probes for Lua headers and libs used in testsuite. 2018-05-15: kwwette [Octave] add support for version 4.4 - Should not introduce any user-visible incompatibilities 2018-05-15: wsfulton [C#, D, Java] Fix lookup of csconstruct, dconstruct and javaconstruct typemaps. The C++ namespace was previously ignored when looking up the typemap. 2018-05-15: wsfulton [Javascript] Fix generated C++ code when using %nspace on namespaces that are more than two levels deep. 2018-05-14: wsfulton Issue #1251 Add support for C++17 nested namespace definitions, for example: namespace A::B { ... } 2018-05-11: wsfulton [C#, D, Java] Add support so that the %csmethodmodifiers, %dmethodmodifiers, %javamethodmodifiers can modify the method modifiers for the destructor wrappers in the proxy class: dispose, Dispose, delete. With this feature, it is now possible to make a C# proxy class sealed, eg when wrapping a class X, the virtual method modifiers can be removed using: %typemap(csclassmodifiers) X "public sealed class" %csmethodmodifiers X::~X "public /*virtual*/"; 2018-04-18: olly [Python] Suppress new pycodestyle warning: E252 missing whitespace around parameter equals 2018-04-07: goatshriek [Ruby] #1213 Fix ruby %alias directive for global C/C++ functions. 2018-04-03: olly [Ruby] Fix to pass Qnil instead of NULL to rb_funcall(), which silences GCC -Wconversion-null warning (on by default with recent GCC). 2018-03-09: wsfulton [Java] #1184 Fix swigReleaseOwnership() and swigTakeOwnership() regression for non-director classes. Restores a dynamic_cast which was previously removed. 2018-03-07: llongi Github PR #1166 - Fix preprocessor handling of macros with commas in a // comment. 2018-02-18: JPEWdev Patch #1164 - Add support for a command-line options file, also sometimes called a response file. This is useful if the command-line options exceed the system command-line length limit. To use, put the command-line options into a file, then provide the file name prefixed with @, for example using a file called args.txt: swig @args.txt 2018-02-11: wsfulton [Javascript] #1187 Fix compilation error wrapping std::complex via std_complex.i. 2018-01-30: smarchetto [Scilab] add type name argument in SWIG_ptr() function to cast from pointer address to typed pointers 2018-01-16: wsfulton Expressions following a preprocessor directive must now be separated by whitespace or non-numeric characters. This syntax change makes the SWIG preprocessor work like the C preprocessor in this area. For example, the following code used be accepted as valid syntax: #if1 #define ABC 123 #endif Now you get an error: example.h:1: Error: Unknown SWIG preprocessor directive: if1 (if this is a block of target language code, delimit it with %{ and %}) example.h:3: Error: Extraneous #endif. The following is the correct syntax: #if 1 #define ABC 123 #endif The following of course also works: #if(1) #define ABC 123 #endif *** POTENTIAL INCOMPATIBILITY *** 2018-01-15: wsfulton Fix issue #1183. Floating point exception evaluating preprocessor expressions resulting in division by zero. 2018-01-14: wsfulton Fix issue #1172. Seg fault parsing invalid exponents in the preprocessor. 2018-01-12: Liryna [C#] Patch #1128. Add ToArray function to std::vector wrappers. 2018-01-12: wsfulton [Java] Fix issue #1156. Add missing throws clause for interfaces when using the %interface family of macros. 2018-01-05: wsfulton Fix default arguments using expressions containing -> syntax error. Problem reported on swig-user mailing list. 2017-12-30: wsfulton [Python] Replace pep8 with pycodestyle for checking the Python code style when running Python tests. 2017-12-30: davedissian Fixed a symbol lookup issue when encountering a typedef of a symbol from the tag namespace to the global namespace when the names are identical, such as 'typedef struct Foo Foo;'. 2017-12-13: wsfulton [Perl] add missing support for directorfree typemaps. 2017-12-13: wsfulton Issue #1167 Fix directorout typemaps which were causing undefined behaviour when returning pointers by reference. 2017-12-08: olly [PHP] Use ZEND_MODULE_GLOBALS_ACCESSOR to access globals so the generated code builds when PHP was built with ZTS enabled. 2017-12-04: wsfulton [Python] Add missing checks for failures in calls to PyUnicode_AsUTF8String. Previously a seg fault could occur when passing invalid UTF8 strings (low surrogates), eg passing u"\udcff" to the C layer (Python 3). 2017-11-24: joequant [R] Fix #1124 and return R_NilValue for null pointers 2017-11-29: wsfulton [Java] director exception handling improvements. When a director method throws an exception and it is caught by DirectorException and passed back to Java using Swig::DirectorException::throwException, the Java stack trace now contains the original source line that threw the exception. Deprecate Swig::DirectorException::raiseJavaException, please replace usage with Swig::DirectorException::throwException. *** POTENTIAL INCOMPATIBILITY *** 2017-10-26: wsfulton Add support for C++11 ref-qualifiers when using directors. 2017-10-26: wsfulton Fix generated code when using directors and methods returning const ref pointers. 2017-10-26: wsfulton [C#, D, Java, Octave, R, Scilab] Port director typemaps to these additional languages. Issue #700. 2017-10-26: radarsat1 [Ruby Python] Patch #1029 - Correct handling of null using directors and shared_ptr. 2017-10-10: joequant [R] pass enum expressions to R. This will generate incorrect files when there is an arithmetic expression in the enum, but this is better than silently generating incorrect code 2017-10-09: olly [PHP] Fix incorrect wrapper code generated when there's a combination of overloading, parameters with a default value and %newobject. Fixes https://sourceforge.net/p/swig/bugs/1350/ 2017-10-09: olly Remove GCJ support. It isn't in a good state and doesn't seem to be used, and GCC7 dropped GCJ. Closes https://sourceforge.net/p/swig/bugs/823/ 2017-10-07: olly Fix preprocessor handling of empty macro arguments to match that of C/C++ compilers. Fixes issue #1111 and https://sourceforge.net/p/swig/bugs/826/ 2017-10-06: wsfulton [Python] Issue #1108. Fix platform inconsistency in Python default argument handling. 32 bit and 64 bit compiled versions of SWIG generated different Python files when default arguments were outside the range of 32 bit signed integers. The default arguments specified in Python are now only those that are in the range of a 32 bit signed integer, otherwise the default is obtained from C/C++ code. 2017-10-02: wsfulton [C#] Fix std::complex types passed by value. 2017-10-02: wsfulton [Javascript, Python, Ruby] Issue #732 - Missing type information for std::complex in std_complex.i meant that previously std::complex always had to be fully qualified in order to be wrapped with the appropriate typemaps. 2017-10-01: joequant allow R package names with docs allowing multiple get accessors in R fix smart-pointer and NAMESPACE support constructors now returning smart pointers (if class declared as such) smart-pointer classes deriving from parent smart-pointers 2017-09-29: wsfulton Issue #1100 - Allow an instantiated template to have the same name in the target language as the C++ template name, for example, this is now possible: template struct X { ... }; %template(X) X; 2017-09-23: wsfulton Issue #1098. Fix overloading of shared_ptr with underlying pointer types, eg: void m(std::shared_ptr p); void m(T &p); void m(T *p); Only the first method is wrapped and the others are ignored/shadowed. The implementation is done via a new attribute in the 'typecheck' typemap called 'equivalent'. If specified, it must contain the equivalent pointer type for overloading and can only be used for the special SWIG_TYPECHECK_POINTER precedence level. The shared_ptr 'typecheck' typemaps have been modified accordingly. Here is a simplified version: %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="T *") T, T CONST &, T CONST *, T *CONST&, std::shared_ptr< T >, std::shared_ptr< T > &, std::shared_ptr< T > *, std::shared_ptr< T > *& { ... } Overloading with any of these types will result in SWIG ignoring all but the first overloaded method by default. Without the 'equivalent' attribute, wrapping the overloaded methods resulted in types being shadowed (scripting languages) or code that did not compile (statically typed languages). 2017-09-19: futatuki [Python] #1003 Add --with-2to3=/path/to/2to3 option to configure. 2017-09-18: wsfulton Fix type promotion wrapping constant expressions of the form: # define EXPR_MIXED1 (0x80 + 11.1) - 1 This was previously an integral type instead of a floating point type. 2017-09-17: wsfulton Fix generated code for constant expressions containing wchar_t L literals such as: # define __WCHAR_MAX (0x7fffffff + L'\0') # define __WCHAR_MIN (-__WCHAR_MAX - 1) 2017-09-10: mlamarre [Python] Patch #1083. Define_DEBUG to 1 to do exactly like Visual Studio /LDd, /MDd or /MTd compiler options. 2017-08-25: wsfulton Issue #1059. Add support for C++11 ref-qualifiers on non-static member functions. Members with lvalue ref-qualifiers such as: struct RQ { void m1(int x) &; void m2(int x) const &; }; are wrapped like any other member function. Member functions with rvalue ref-qualifiers are ignored by default, such as: struct RQ { void m3(int x) &&; void m4(int x) const &&; }; example.i:7: Warning 405: Method with rvalue ref-qualifier m3(int) && ignored. example.i:8: Warning 405: Method with rvalue ref-qualifier m4(int) const && ignored. These can be unignored and exposed to the target language, see further documentation in CPlusPlus11.html. 2017-08-16: wsfulton Fix #1063. Add using declarations to templates into typedef table. Using declarations to templates were missing in SWIG's internal typedef tables. This led to a few problems, such as, templates that did not instantiate and generated C++ code that did not compile as SWIG did not know what scope the template was in. This happened mostly when a using declaration was used on a template type in a completely unrelated namespace. 2017-08-16: wsfulton Fix type lookup in the presence of using directives and using declarations. Fix some cases of type lookup failure via a combination of both using directives and using declarations resulting in C++ code that did not compile as the generated type was not fully qualified for use in the global namespace. Example below: namespace Space5 { namespace SubSpace5 { namespace SubSubSpace5 { struct F {}; } } using namespace SubSpace5; using SubSubSpace5::F; void func(SubSubSpace5::F f); } 2017-08-16: wsfulton Issue #1051. %template scope enforcement and class definition fixes. The scoping rules around %template have been specified and enforced. The %template directive for a class template is the equivalent to an explicit instantiation of a C++ class template. The scope for a valid %template instantiation is now the same as the scope required for a valid explicit instantiation of a C++ template. A definition of the template for the explicit instantiation must be in scope where the instantiation is declared and must not be enclosed within a different namespace. For example, a few %template and C++ explicit instantiations of std::vector are shown below: // valid namespace std { %template(vin) vector; template class vector; } // valid using namespace std; %template(vin) vector; template class vector; // valid using std::vector; %template(vin) vector; template class vector; // ill-formed namespace unrelated { using std::vector; %template(vin) vector; template class vector; } // ill-formed namespace unrelated { using namespace std; %template(vin) vector; template class vector; } // ill-formed namespace unrelated { namespace std { %template(vin) vector; template class vector; } } // ill-formed namespace unrelated { %template(vin) std::vector; template class std::vector; } When the scope is incorrect, an error now occurs such as: cpp_template_scope.i:34: Error: 'vector' resolves to 'std::vector' and was incorrectly instantiated in scope 'unrelated' instead of within scope 'std'. Previously SWIG accepted the ill-formed examples above but this led to numerous subtle template scope problems especially in the presence of using declarations and using directives as well as with %feature and %typemap. Actually, a valid instantiation is one which conforms to the C++03 standard as C++11 made a change to disallow using declarations and using directives to find a template. // valid C++03, ill-formed C++11 using std::vector; template class vector; Similar fixes for defining classes using forward class references have also been put in place. For example: namespace Space1 { struct A; } namespace Space2 { struct Space1::A { void x(); } } will now error out with: cpp_class_definition.i:5: Error: 'Space1::A' resolves to 'Space1::A' and was incorrectly instantiated in scope 'Space2' instead of within scope 'Space1'. Previously some symbols would have been instantiated in the wrong scope and led to lots of scope problems involving SWIG typemaps, features, renames etc. You will need to correct the scope used in other SWIG directives which do not support 'using declarations' and 'using directives'. For example, if you previously had: %rename(Zap) vector::clear; using namespace std; %template(VectorInt) vector; Prior versions of SWIG incorrectly instantiated vector in the global namespace and so the %rename matched. Now the template is instantiated in the correct namespace, so is fully qualified as std::vector. The other SWIG directives need correcting as they do not follow 'using declarations' and 'using directives'. Change it to: %rename(Zap) std::vector::clear; using namespace std; %template(vin) vector; *** POTENTIAL INCOMPATIBILITY *** 2017-08-16: wsfulton Fix scope lookup for template parameters containing unary scope operators. Fixes cases like: namespace Alloc { template struct Rebind { typedef int Integer; }; } %template(RebindBucket) Alloc::Rebind< Bucket >; OR %template(RebindBucket) Alloc::Rebind< ::Bucket >; Alloc::Rebind< Bucket >::Integer Bucket1(); Alloc::Rebind< ::Bucket >::Integer Bucket2(); Alloc::Rebind<::template TemplateBucket>::Integer Bucket3(); 2017-08-16: wsfulton For templates only, the template parameters are fully resolved when handling typemaps. Without this, it is too hard to have decent rules to apply typemaps when parameter types are typedef'd and template parameters have default values. Fixes %clear for typedefs in templates, eg: %typemap("in") XXX::Long "..." template typename struct XXX { typedef long Long; }; %clear XXX::Long; as the typemap was previously incorrectly stored as a typemap for long instead of XXX::Long. 2017-08-05: olly [C++11] Allow static_assert at the top level (and disallow it right after template). Fixes issue 1031 reported by Artem V L. 2017-08-02: wsfulton Fix incorrectly shown warning when an empty template instantiation was used on a class used as a base class and that base class was explicitly ignored with %ignore. Example of the warning which will no longer appear: Warning 401: Base class 'Functor< int,int >' has no name as it is an empty template instantiated with '%template()'. Ignored. 2017-07-17: fflexo [Java] #674 Add std_list.i to add support for std::list containers. The Java proxy extends java.util.AbstractSequentialList and makes the C++ std::list container look and feel much like a java.util.LinkedList from Java. 2017-07-07: wsfulton [Python] Fix display of documented template types when using the autodoc feature. For example when wrapping: %feature("autodoc"); template struct T {}; %template(TInteger) T; the generated documentation contains: """Proxy of C++ T< int > class.""" instead of: """Proxy of C++ T<(int)> class.""" and """__init__(TInteger self) -> TInteger""" instead of """__init__(T<(int)> self) -> TInteger""" 2017-06-27: nihaln [PHP] Update the OUTPUT Typemap to add return statement to the PHP Wrapper. 2017-06-27: nihaln [PHP] Update the enum and value examples to use the OO wrappers rather than the flat functions produced with -noproxy. There's not been a good reason to use -noproxy for since PHP5 OO wrapping was fixed back in 2005. 2017-06-23: m7thon [Python] fix and improve default argument handling: 1. Fix negative octals. Currently not handled correctly by `-py3` (unusual case, but incorrect). 2. Fix arguments of type "octal + something" (e.g. `0640 | 04`). Currently drops everything after the first octal. Nasty! 3. Fix bool arguments "0 + something" (e.g. `0 | 1`) are always "False" (unusual case, but incorrect). 4. Remove special handling of "TRUE" and "FALSE" from `convertValue` since there's no reason these have to match "true" and "false". 5. Remove the Python 2 vs. Python 3 distinction based on the `-py3` flag. Now the same python code is produced for default arguments for Python 2 and Python 3. For this, octal default arguments, e.g. 0644, are now wrapped as `int('644', 8)`. This is required, as Python 2 and Python 3 have incompatible syntax for octal literals. Fixes #707 2017-06-21: futatuki #1004 - Fix ccache-swig executable name to respect configure's --program-prefix and --program-suffix values if used. 2017-06-21: tamuratak [Ruby] #911 - Add std::wstring support. 2017-06-19: wsfulton [Python] Fix handling of rich comparisons when wrapping overloaded operators: operator< operator<= operator> operator>= operator== operator!= Previously a TypeError was always thrown if the type was not correct. NotImplemented is now returned from these wrapped functions if the type being compared with is not correct. The subsequent behaviour varies between different versions of Python and the comparison function being used, but is now consistent with normal Python behaviour. For example, for the first 4 operator overloads above, a TypeError 'unorderable types' is thrown in Python 3, but Python 2 will return True or False. NotImplemented should be returned when the comparison cannot be done, see PEP 207 and https://docs.python.org/3/library/constants.html#NotImplemented Note that the bug was only present when overloaded operators did not also have a function overload. Fixes SF bug #1208 (3441262) and SF patch #303. *** POTENTIAL INCOMPATIBILITY *** 2017-06-17: fabrice102 [Go] Fix Go callback example. Fixes github #600, #955, #1000. 2017-06-16: wsfulton Make sure warning and error messages are not split up by other processes writing to stdout at the same time. 2017-06-16: wsfulton [R] Fix wrapping function pointers containing rvalue and lvalue reference parameters. 2017-06-13: olly [Perl] Fix testsuite to work without . in @INC - it was removed in Perl 5.26 for security reasons, and has also been removed from older versions in some distros. Fixes #997 reported by lfam. 2017-06-03: wsfulton Fix %import on a file containing a file scope %fragment forced inclusion to not generate the fragment contents as %import should not result in code being generated. The behaviour is now the same as importing code insertion blocks. Wrapping FileC.i in the following example will result in no generated code, whereas previously "#include " was generated: // FileA.i %fragment("", "header") %{ #include %} %{ #include %} %fragment(""); // FileC.i %import "FileA.i" *** POTENTIAL INCOMPATIBILITY *** 2017-05-26: Volker Diels-Grabsch, vadz [Java] #842 Extend from java.util.AbstractList<> and implement java.util.RandomAccess for std::vector wrappers. This notably allows to iterate over wrapped vectors in a natural way. Note that boxed types are now used in the Java layer when wrapping vector of C primitive types, for example. This may introduce some subtle incompatibilities due to some differences in how Java converts boxed types and unboxed types. For example, int i=0; double d1 = i; // ok Double d2 = i; // error: incompatible types: int cannot be converted to Double This can be a problem when calling the add and set functions. A suggested backwards compatible workaround is to use something like (shown for std::vector: #if defined(SWIGJAVA) // Add in old api that uses non-boxed types %extend std::vector { %proxycode %{ public void add(double x) { add(Double.valueOf(x)); } public void set(int i, double val) { set(i, Double.valueOf(val)); } %} } #endif %include "std_vector.i" %template(VectorDouble) std::vector; *** POTENTIAL INCOMPATIBILITY *** 2017-05-30: davidcl [Scilab] #994 Undefined symbol error when loading in Scilab 6 2017-05-25: asibross [Java] #370 #417 Missing smart pointer handling in Java director extra methods swigReleaseOwnership() and swigTakeOwnership(). 2017-05-23: wsfulton [Java] #230 #759 Fix Java shared_ptr and directors for derived classes java compilation error. For shared_ptr proxy proxy classes, add a protected method swigSetCMemOwn for modifying the swigCMemOwn and swigCMemOwnDerived member variables which are used by various other methods for controlling memory ownership. 2017-05-21: Sghirate [Java, C#, D] #449 Remove unnecessary use of dynamic_cast in directors to enable non-RTTI compilation. 2017-05-21: wsfulton [Python] #993 Fix handling of default -ve unsigned values, such as: void f(unsigned = -1U); 2017-05-20: jschueller [Python] #991 Fix E731 PEP8 warning: do not assign a lambda expression 2017-05-16: nihal95 [PHP] Add %pragma version directive to allow the version of the extension to be set. Patch #970, fixes #360. 2017-05-13: yag00 Patch #975 - Add support for noexcept on director methods. 2017-04-27: redbrain Issue #974, Patch #976 - Fix preprocessor handling of macros with commas in a comment. 2017-04-25: jleveque [Lua] #959 - Fix Visual Studio C4244 conversion warnings in Lua wrappers. 2017-04-21: tamuratak [Ruby] #964 - Add shared_ptr director typemaps. 2017-04-20: wsfulton [Ruby] #586, #935 Add assert for invalid NULL type parameter when calling SWIG_Ruby_NewPointerObj. 2017-04-20: tamuratak [Ruby] #930, #937 - Fix containers of std::shared_ptr. Upcasting, const types (eg vector>) and NULL/nullptr support added. 2017-04-12: smarchetto [Scilab] New parameter targetversion to specify the Scilab target version (5, 6, ..) for code generation With Scilab 6 target specified, identifier names truncation is disabled (no longer necessary) 2017-03-24: tamuratak [Ruby] Fix #939 - Wrapping std::vector fix due to incorrect null checks on VALUE obj. 2017-03-17: vadz [C#] #947 Add support for std::complex 2017-03-17: wsfulton [Go] Fix handling of typedef'd function pointers and typedef'd member function pointers such as: typedef int (*FnPtr_td)(int, int); int do_op(int x, int y, FnPtr_td op); 2017-03-16: wsfulton Add support for member const function pointers such as: int fn(short (Funcs::* parm)(bool)) const; Also fix parsing of references/pointers and qualifiers to member pointers such as: int fn(short (Funcs::* const parm)(bool)); int fn(short (Funcs::* & parm)(bool)); 2017-03-10: wsfulton Extend C++11 alternate function syntax parsing to support const and noexcept, such as: auto sum1(int x, int y) const -> int { return x + y; } auto sum2(int x, int y) noexcept -> int { return x + y; } 2017-02-29: tamuratak [Ruby] #917 - Add Enumerable module to all container class wrappers. It was missing for std::list, std::multiset, std::unordered_multiset and std::unordered_map. 2017-02-27: assambar [C++11] Extend parser to support throw specifier in combination with override and/or final. 2017-02-10: tamuratak [Ruby] #883 - Add support for C++11 hash tables: std::unordered_map std::unordered_set std::unordered_multimap std::unordered_multiset 2017-02-08: jcsharp [C#] #887 Improve std::vector wrapper constructors - Replace constructor taking ICollection with IEnumerable and also add IEnumerable constructor to avoid the boxing and unboxing overhead of the original constructor, when the type parameter is a value type. Version 3.0.12 (27 Jan 2017) ============================ 2017-01-27: wsfulton [C#] #882 Fix missing filename in error messages when there is a problem writing out C# files. 2017-01-27: briancaine [Guile] #744 Fix compilation errors in Guile wrappers - regression introduced in swig-3.0.11. 2017-01-24: andrey-starodubtsev [Java] Apply #704 - director typemap improvements. Memory leak fixes, add support for "directorargout" typemap and add director support to typemaps.i. 2017-01-24: wsfulton Enhance %extend to extend a class with template constructors, eg: struct Foo { %extend { template Foo(int a, T b) { ... } } }; %template(Foo) Foo::Foo; 2017-01-22: wsfulton Issue #876 Enhance %extend to extend a class with template methods, eg: struct Foo { %extend { template void do_stuff(int a, T b) { ... } } }; %template(do_stuff_inst) Foo::do_stuff; Similarly for static template methods. 2017-01-22: kwwette [Octave] add support for version 4.2 - The Octave API now uses some C++11 features. It is recommended to use the mkoctfile program supplied by Octave to compile the SWIG-generated wrapper code, as mkoctfile will ensure the correct C++ compiler/options are used. Otherwise, the value of `mkoctfile -p CXX` should be parsed for any -std=* flags which might be present. - Octave has dropped support for << and >> operators, so SWIG now ignores them. - The Octave error() function now raises C++ exceptions to propagate Octave errors, so %exception directives may need to be modified. For convenience the SWIG_RETHROW_OCTAVE_EXCEPTIONS macro can be used to rethrow any Octave exceptions for Octave itself to handle, e.g.: try { $action // may call error() } SWIG_RETHROW_OCTAVE_EXCEPTIONS // error() exceptions are rethrown catch(...) { ... // all other exceptions } *** POTENTIAL INCOMPATIBILITY *** 2017-01-16: wkalinin [C#] Fix #733 regression introduced in swig-3.0.9. Missing virtual function override in C# layer when using %import. 2017-01-16: fschlimb Fix #813 template symbol name lookup bug when typedef names are the same but in different namespaces. 2017-01-15: wsfulton [C# D Java] The SWIG library no longer uses the javatype, dtype or cstype typemaps, thereby completely freeing them up for users to use without having to replicate the library code that they previously added. The code previously generated by these typemaps has been replaced by the new %proxycode directive. Their use in the library code was fairly minimal: C# cstype: std_array.i std_map.i std_vector.i D dtype: std_vector.i Java javatype: arrays_java.i 2017-01-14: wsfulton The %extend directive can now optionally support one of the 'class', 'struct' or 'union' keywords before the identifier name, for example: struct X { ... }; %extend struct X { ... } Previously this had to specified as: struct X { ... }; %extend X { ... } 2017-01-13: wsfulton [C# D Java] Add new %proxycode directive which is a macro for %insert("proxycode"). This is a way of adding pure C#/D/Java code into the appropriate proxy class, eg: %extend Proxy2 { %proxycode %{ public int proxycode2(int i) { return i+2; } %} } %inline %{ struct Proxy2 {}; %} There will then be a pure Java/C#/D method called proxycode2 in the Proxy2 class. 2016-12-31: ajrheading1 Issue #860 - Remove use of std::unary_function and std::binary_function which is deprecated in C++11. 2016-12-30: olly [PHP7] Register internal 'swig_runtime_data_type_pointer' constant as "CONST_PERSISTENT" to avoid segmentation fault on module unload. Fixes #859 reported by Timotheus Pokorra. Thanks also to Javier Torres for a minimal reproducer. Version 3.0.11 (29 Dec 2016) ============================ 2016-12-24: wsfulton [C#] Add %feature("csdirectordelegatemodifiers") to enable customization of the delegate access modifiers generated in director classes. Fixes issue #748. 2016-12-23: wsfulton [Python] Fix builtin "python:slot" feature failing for tp_hash when using hashfunc closure with a "Wrong type for hash function" for Python 2. Issue #843. 2016-12-21: joequamt Changed generation of functions so that only functions that end in _set generate accessor functions rather than looking for "set". Change generation of operators to not have underscores to start in R. Users need to provide custom names for these operator overloads. 2016-12-21: olly Fix isfinite() checks to work with all C++11 compilers. Fixes issues #615, #788 and #849. 2016-12-20: wsfulton %namewarn unnecessarily caused keyword warnings for non-instantiated template classes and duplicate warnings for instantiated template classes when keywords were used. Issue #845. 2016-12-18: ezralanglois [Python, Ruby, Octave] Memory leak fix on error in std::pair wrappers. Issue #851. 2016-12-18: wsfulton Zero initialize arrays when using %array_class and %array_functions. 2016-12-18: t-ikegami [Python] Fix #446 Python %array_class of carrays.i failed with -builtin option. 2016-12-16: briancaine [Guile] Patch #744 Added support for Guile's native pointer functionality 2016-12-01: wsfulton [Python] Issue #769. Add optional moduleimport attribute to %module so that the default module import code can be overridden. See the "Searching for the wrapper module" documentation in Python.html. Example: %module(moduleimport="import _foo") foo $module also expands to the low-level C/C++ module name, so the following is the same as above %module(moduleimport="import $module") foo 2016-11-30: olly [PHP] Add support for PHP7. PHP5's C extension API has changed substantially so you need to use -php7 to specify you want PHP7 compatible wrappers. The default extension for generated wrappers is now .cxx (to match SWIG's default for every other language - to generate foo_wrap.cpp you can run SWIG with -cppext cpp). Fixes issue #571. As part of this change, the language subdirectory for PHP5 has changed from "php" to "php5" - if you are making use of the search path feature where the language subdirectory of each directory is also searched, you'll need to update your bindings. A simple fix which works for older and newer SWIG is to add a symlink: ln -s php php5 *** POTENTIAL INCOMPATIBILITY *** 2016-11-30: olly [PHP] Only emit one copy of each distinct arginfo. Previously we emitted a separate one for every wrapped function, but typically many functions have the same number of parameters and combinations of parameters passed by reference or not. This change significantly reduces both the size of the generated wrapper, and of the compiled PHP extension module (e.g. by ~6% for the stripped extension module for Xapian's PHP7 bindings). 2016-11-28: wsfulton Fix %rename override of wildcard %rename for templates. For example: %rename(GlobalIntOperator) *::operator bool; // wildcard %rename %rename(XIntOperator) X::operator bool; // fix now overrides first %rename above OR %rename(XIntOperator) X::operator bool; // fix now overrides first %rename above template struct X { operator bool(); ... }; %template(Xint) X; This also fixes %rename override of global %rename for templates. For example: // Global rename to make all functions start with a lower case letter %rename("%(firstlowercase)s", %$isfunction ) ""; %rename(woohoo) W::Woo; // fix now overrides above %rename template struct W { W Woo(); ... }; %template(Wint) W; The above also introduces a possibly unexpected change. Many of the STL containers provided by SWIG use %rename to rename some methods, eg in std::vector, push_back is renamed to add in Java. Previously this intended rename did not happen when using using global %rename rules and the method would remain as push_back, but is now renamed to add. Some more info in issue #856. *** POTENTIAL INCOMPATIBILITY *** 2016-11-26: m7thon [Python] Issue #709 - improved wrapping of division operators 'from __future__ import division' now works in Python 2 whether or not the -py3 flag is used. 2016-11-12: joequant [R] Issue #697 - fix comma issue with overload methods 2016-11-12: joequant [R] Issue #555 - R runtime needs stdio.h 2016-11-02: wsfulton [Python] Issue #816 - fix compilation error when using -extranative and -builtin. 2016-11-02: liorgold Patch #741 - Add support for C++11 alias templates, see updated CPlusPlus11.html documentation. 2016-10-30: myd7349 [C#] Patch #740 Add std_array.i for C# for wrapping std::array. Patch also enhances std::vector C# wrappers with additional functions (Contains, IndexOf, LastIndexOf and Remove). 2016-10-30: tobilau [Java] Fix wrappers for wstring parameters in director methods to cleanup local ref after director callback has finished. 2016-10-23: wsfulton [C#] Add missing csdirectorin VOID_INT_PTR and csdirectorout VOID_INT_PTR typemaps. 2016-10-23: jiulongw Patch #781 - Fix wrapping of C compound expressions containing char constants in quotes such as: #define H_SUPPRESS_SCALING_MAGIC (('s'<<24) | ('u'<<16) | ('p'<<8) | 'p') enum DifferentTypes { typecharcompound='A'+1, typecharcompound2='B' << 2 }; 2016-10-13: wsfulton [Python] Issue #808 - fix Python pickling and metaclass for builtin wrappers. The metaclass (SwigPyObjectType) for SWIG objects was not defined in a way that let importlib successfully import the Python wrappers. The pickle module previously failed to pickle objects because it couldn't determine what module the SWIG wrapped objects were in. 2016-09-29: wsfulton [Allegrocl, CFFI, GO, Javascript, Ocaml, R, Scilab] Add missing support for the "ret" typemap in a few target languages. The documentation also now has info on the "ret" typemap. 2016-09-27: ahmed-usman [xml] Handle template parameters correctly. 2016-09-27: dontpanic92 [Go] Fix argument names in inherited functions taking more than 8 parameters. Fixes #795. 2016-09-26: smarchetto [Scilab] mlists that map pointers can be given a custom type name. 2016-09-25: wsfulton Patch #793 from q-p to expand exception handling to include std::bad_cast in std_except.i. 2016-09-24: olly [PHP] Fix code generated for feature("director:except") - previously the return value of call_user_function() was ignored and we checked an uninitialised value instead. Fixes #627. Based on patch from Sergey Seroshtan. 2016-09-22: wsfulton [Python] More flexible python builtin slots for overloaded C++ function. The closure names used for builtin slots are mangled with their functype so that overloaded C++ method names can be used for multiple slots. For example: %feature("python:slot", "mp_subscript", functype="binaryfunc") SimpleArray::__getitem__; %feature("python:slot", "sq_item", functype="ssizeargfunc") SimpleArray::__getitem__(Py_ssize_t n); will generate closures: SWIGPY_SSIZEARGFUNC_CLOSURE(_wrap_SimpleArray___getitem__) /* defines _wrap_SimpleArray___getitem___ssizeargfunc_closure */ SWIGPY_BINARYFUNC_CLOSURE(_wrap_SimpleArray___getitem__) /* defines _wrap_SimpleArray___getitem___binaryfunc_closure */ Previously only one name was defined: _wrap_SimpleArray___getitem___closure. Hence the overloaded __getitem__ method can be used to support both mp_subscript and sq_item slots. 2016-09-17: wsfulton [Python] Fix iterators for containers of NULL pointers (or Python None) when using -builtin. Previously iteration would stop at the first element that was NULL. 2016-09-16: olly [Javascript] Fix SWIG_exception() macro to return from the current function. Fixes #789, reported by Julien Dutriaux. 2016-09-16: olly [PHP] Fix SWIG_exception() macro to return from the current function. Fixes #240, reported by Sergey Seroshtan. 2016-09-12: xypron [C#] Patch #786 Keyword rename to be CLS compliant by adding an underscore suffix instead of an underscore prefix to the C symbol name. Please use an explicit %rename to rename the symbol with a _ prefix if you want the old symbol name. *** POTENTIAL INCOMPATIBILITY *** 2016-09-09: olly [Python] Fix import handling for Python 2.6 to work in a frozen application. Fixes #145, reported by Thomas Kluyver. 2016-09-02: smarchetto [Scilab] Pointers are mapped to mlist instead of tlist (mlist better for scilab overloading) 2016-09-02: olly [PHP] Fix "out" typemap for member function pointers and "in" typemap for char INPUT[ANY]. 2016-09-01: wsfulton [Python] More efficient Python slicing. Call reserve for container types that support it to avoid repeated memory reallocations for new slices or slices that grow in size. 2016-09-01: wsfulton [Python] #771 - Make builtin types hashable by default. Default hash is the underlying C/C++ pointer. This matches up with testing for equivalence (Py_EQ in SwigPyObject_richcompare) which compares the pointers. 2016-08-22: wsfulton [Python] The following builtin slots can be customized like other slots via the "python:" and "python:slot" features where is the appropriate slot name: tp_allocs tp_bases tp_basicsize tp_cache tp_del tp_dealloc tp_flags tp_frees tp_getset tp_is_gc tp_maxalloc tp_methods tp_mro tp_new tp_next tp_prev tp_richcompare tp_subclasses tp_weaklist was_sq_ass_slice was_sq_slice A few documentation improvements for slot customization. 2016-08-09: joequant [R] Patch #765 Fix extern "C" header includes for C++ code. 2016-08-05: olly [xml] Fix how the output filename is built to avoid problems when it contains the embedded strings ".c", ".cpp" or ".cxx". Fixes #540 reported by djack42. 2016-07-01: wsfulton Fix corner case of wrapping std::vector of T pointers where a pointer to a pointer of T also exists in the wrapped code. SF Bug 2359417 (967). 2016-06-26: wkalinin [Java, C#] Patch #681 Fix seg fault when ignoring nested classes. 2016-06-25: mromberg [Python] #711 Fix -castmode and conversion of signed and unsigned integer types. See 2015-12-23 CHANGES entry for details of these improvements when they were implemented for the default options (ie not using -castmode). 2016-06-25: ahnolds Patch #730 - Fix %implicitconv for overloaded functions when using -castmode or -fastdispatch options. The result is that in all overload cases where there are multiple possibilities with the same number of arguments, the dispatch function will first check for exact (aka non implicit) matches, and then subsequently check for implicit casting matches. This was already happening in the normal dispatch situation, and in the -fastdispatch case two passes through the candidates were happening, just with SWIG_POINTER_IMPLICIT_CONV always set. After this patch, it is not set on the first pass, and then set on the second pass. 2016-06-25: liorgold Patch #727 - Add support for C++11 type aliasing. Version 3.0.10 (12 Jun 2016) ============================ 2016-06-06: mromberg [Python] Patch #698. Add support for -relativeimport for python 2.7, so -py3 is no longer also required for relative import support. 2016-06-05: mromberg [Python] Patch #694 - Fix package import regressions introduced in swig-3.0.9. 1) The code in 3.0.9 did not fall back to 'import _foo' if 'import bar._foo' failed (assuming bar.foo was the main module). Every place _foo is imported now first tries it from the package where foo was found and if that fails tries _foo as a global module. 2) The separate block of Python code that injected code to pull in the attributes from _foo when -builtin is used made use of the -py3 switch to either do 'from ._foo import *' or "from _foo import *". This block of code no longer does this and instead checks the Python version at runtime to switch between the two syntaxes. In summary, swig-3.0.10 has been modified to ease the creation of wrapper modules that can be fully made part of a Python package. SWIG no longer assumes the dynamically linked C module is a global module. The dynamic module can now be placed into either the same package as the pure Python module or as a global module. Both locations are used by the Python wrapper to locate the C module. However, this could cause a backwards incompatibility with some code that was relying on the ability of "from package import _module" to pull attributes out of the package directly. If your code populates a module (which is also a package) with attributes that are SWIG generated modules which were not loaded in a conventional way, swig-3.0.8 and earlier may have worked due to 'from package import _module' bypassing a real import and pulling your module in as an attribute. This will no longer work. Since this is not a common (or even recommended) practice, most folk should not be affected. *** POTENTIAL INCOMPATIBILITY *** 2016-05-31: wsfulton Fix #690 - Smart pointer to %ignored class doesn't expose inherited methods. Regression introduced in swig-3.0.9. Version 3.0.9 (29 May 2016) =========================== 2016-05-24: mromberg [Python] Patch #612 - Add support for Python's implicit namespace packages. 2016-05-23: wsfulton [Ruby] Fix #602 - Error handling regression of opaque pointers introduced in swig-3.0.8 when C functions explicitly reset a pointer using 'DATA_PTR(self) = 0'. An ObjectPreviouslyDeleted error was incorrectly thrown when the pointer was used as a parameter. 2016-05-17: tamuratak [Ruby] Patch #651 - Correct overloaded function error message when function is using %newobject. 2016-05-17: aurelj [Ruby] Patch #582 - add support for docstring option in %module() 2016-05-14: wsfulton Fix #434 - Passing classes by value as parameters in director methods did not create a copy of the argument leading to invalid memory accesses if the object was used after the upcall into the target language. Passing arguments by value shouldn't give rise to these sorts of memory problems and so the objects are now copied and ownership of their lifetime is controlled by the target language. 2016-05-07: wsfulton Fix #611. Fix assertion handling defaultargs when using %extend for a template class and the extended methods contain default arguments. 2016-05-05: ejulian [Python] Patch #617. Fix operator/ wrappers. 2016-05-02: wsfulton Fix #669. Don't issue warning about ignoring base classes when the derived class is itself ignored. 2016-04-18: ianlancetaylor [Go] Fix use of goout typemap when calling base method by forcing the "type" attribute to the value we need. 2016-04-17: ianlancetaylor [Go] Fixes for Go 1.6: avoid returning Go pointers from directors that return string values; add a trailing 0 byte when treating Go string as C char*. 2016-04-06: smarchetto [Scilab] #552 Make Scilab runtime keep track of pointer types Instead of a Scilab pointer which has no type, SWIG Scilab maps a pointer to a structure tlist containing the pointer adress and its type. 2016-04-02: ahnolds [Python] Apply #598. Fix misleading error message when attempting to read a non-existent attribute. The previous cryptic error message: AttributeError: type object 'object' has no attribute '__getattr__' is now replaced with one mentioning the attribute name, eg: AttributeError: 'Foo' object has no attribute 'bar' 2016-04-02: derkuci [Python] Patch #610 to fix #607. Fix single arguments when using python -builtin -O with %feature("compactdefaultargs") 2016-03-31: wsfulton Fixes #594. Fix assertion for some languages when wrapping a C++11 enum class that is private in a class. Also don't wrap private enums for a few languages that attempted to do so. 2016-03-31: wsfulton [Java] unsigned long long marshalling improvements when a negative number is passed from Java to C. A cast to signed long long in the C layer will now result in the expected value. No change for positive numbers passed to C. Fixes #623. 2016-03-22: alexwarg [Lua] #398 Fix lua __getitem + inheritance The new handling of classes in Lua (not merging methods into the derived classes) breaks for classes that provide a __getitem function. The __getitem function prevents method calls to any method defined in a base class. This fix calls __getitem only if the member is not found using recursive lookup. 2016-03-18: ptomulik [Python] #563 Stop generating unnecessary _swigconstant helpers. 2016-03-16: richardbeare [R] #636 Add extra std::vector numeric types 2016-03-14: wsfulton [Java] Add std_array.i for C++11 std::array support. 2016-03-12: wsfulton [Java, C#, D] Fix static const char member variables wrappers with %javaconst(1) %csconst(1) or %dmanifestconst. This fixes the case when an integer is used as the initializer, such as: struct W { static const char w = 100; }; Fix generated code parsing enum values using char escape sequences when these values appear in the Java code (usually when using %javaconst(1)) such as: enum X { x1 = '\n', x2 = '\1' }; Similarly for static const member char variables such as: struct Y { static const char y = '\n'; } Likewise for D and %dmanifestconstant. For C# and %csconst(1), char values in C# are now hex escaped as C# doesn't support C octal escaping. 2016-03-11: wsfulton [Java C#] Add support for treating C++ base classes as Java interfaces instead of Java proxy classes. This enable some sort of support for multiple inheritance. The implementation is in swiginterface.i and provides additional macros (see Java.html for full documentation): %interface(CTYPE) %interface_impl(CTYPE) %interface_custom("PROXY", "INTERFACE", CTYPE) 2016-03-01: wsfulton Add rstrip encoder for use in %rename. This is like the strip encoder but strips the symbol's suffix instead of the prefix. The example below will rename SomeThingCls to SomeThing and AnotherThingCls to AnotherThing: %rename("%(rstrip:[Cls])s") ""; class SomeThingCls {}; struct AnotherThingCls {}; 2016-03-01: olly Fix isfinite() check to work with GCC6. Fixes issue #615 reported by jplesnik. 2016-02-17: olly [Python] Add missing keywords 'as' and 'with' to pythonkw.swg. 2016-02-07: kwwette [Octave] recognise various unary functions * Use __float__() for numeric conversions, e.g. when calling double() * Map various unary functions, e.g. abs() to __abs__(), see full list in section 32.3.10 of manual; only available in Octave 3.8.0 or later 2016-02-07: kwwette [Octave] export function swig_octave_prereq() for testing Octave version 2016-02-06: pjohangustavsson [C#] Fix duplicate symbol problems when linking the source generated from multiple SWIG modules into one shared library for the -namespace option. The namespace is now mangled into the global PInvoke function names. *** POTENTIAL INCOMPATIBILITY *** 2016-01-27: ahnolds [Python] Added support for differentiating between Python Bytes and Unicode objects using by defining SWIG_PYTHON_STRICT_BYTE_CHAR and SWIG_PYTHON_STRICT_UNICODE_WCHAR. 2016-01-27: steeve [Go] Ensure structs are properly packed between gc and GCC/clang. 2016-01-25: ahnolds [Python] Support the full Python test suite in -classic mode * Convert long/unsigned long/long long/unsigned long long to PyInt rather than PyLong when possible. Certain python functions like len() require a PyInt when operating on old-style classes. * Add support for static methods in classic mode, including support for pythonappend, pythonprepend, and docstrings. * Removing the use of __swig_getmethods__ for static member methods since they will always be found by the standard argument lookup * Fix a bug where the wrong type of exception was caught when checking for new-style class support 2016-01-23: ahnolds [Go] Enable support for the Go test-suite on OSX: * The linker on OSX requires that all symbols (even weak symbols) are defined at link time. Because the function _cgo_topofstack is only defined starting in Go version 1.4, we explicitly mark it as undefined for older versions of Go on OSX. * Avoid writing empty swigargs structs, since empty structs are not allowed in extern "C" blocks. 2016-01-12: olly [Javascript] Look for "nodejs" as well as "node", as it's packaged as the former on Debian. 2016-01-12: olly [Javascript] For v8 >= 4.3.0, use V8_MAJOR_VERSION. Fixes issue 561. 2016-01-10: ahnolds Improved size_t and ptrdiff_t typemaps to support large values on platforms where sizeof(size_t) > sizeof(unsigned long) and sizeof(ptrdiff_t) > sizeof(long). Version 3.0.8 (31 Dec 2015) =========================== 2015-12-30: wsfulton The pdf documentation is now generated by wkhtmltopdf and has colour for the code snippets just like the html documentation! 2015-12-23: ahnolds [Python] Fixes for conversion of signed and unsigned integer types: No longer check for PyInt objects in Python3. Because PyInt_Check and friends are #defined to the corresponding PyLong methods, this had caused errors in Python3 where values greater than what could be stored in a long were incorrectly interpreted as the value -1 with the Python error indicator set to OverflowError. This applies to both the conversions PyLong->long and PyLong->double. Conversion from PyLong to long, unsigned long, long long, and unsigned long long now raise OverflowError instead of TypeError in both Python2 and Python3 for PyLong values outside the range expressible by the corresponding C type. This matches the existing behavior for other integral types (signed and unsigned ints, shorts, and chars), as well as the conversion for PyInt to all numeric types. This also indirectly applies to the size_t and ptrdiff_t types, which depend on the conversions for unsigned long and long. 2015-12-19: wsfulton [Python] Python 2 Unicode UTF-8 strings can be used as inputs to char * or std::string types if the generated C/C++ code has SWIG_PYTHON_2_UNICODE defined. 2015-12-17: wsfulton Issues #286, #128 Remove ccache-swig.1 man page - please use the CCache.html docs instead. The yodl2man and yodl2html tools are no longer used and so SWIG no longer has a dependency on these packages which were required when building from git. 2015-12-16: zturner/coleb [Python] Fix Python3.5 interpreter assertions when objects are being deleted due to an existing exception. Most notably in generators which terminate using a StopIteration exception. Fixes #559 #560 #573. If a further exception is raised during an object destruction, PyErr_WriteUnraisable is used on this second exception and the original exception bubbles through. 2015-12-14: ahnolds/wsfulton [Python] Add in missing initializers for tp_finalize, nb_matrix_multiply, nb_inplace_matrix_multiply, ht_qualname ht_cached_keys and tp_prev. 2015-12-12: wsfulton Fix STL wrappers to not generate <: digraphs. For example std::vector<::X::Y> was sometimes generated, now corrected to std::vector< ::X::Y >. 2015-11-25: wsfulton [Ruby] STL ranges and slices fixes. Ruby STL container setting slices fixes: Setting an STL container wrapper slice better matches the way Ruby arrays work. The behaviour is now the same as Ruby arrays. The only exception is the default value used when expanding a container cannot be nil as this is not a valid type/value for C++ container elements. Obtaining a Ruby STL container ranges and slices fixes: Access via ranges and slices now behave identically to Ruby arrays. The fixes are mostly for out of range indices and lengths. - Zero length slice requests return an empty container instead of nil. - Slices which request a length greater than the size of the container no longer chop off the last element. - Ranges which used to return nil now return an empty array when the the start element is a valid index. Ruby STL container negative indexing support improved. Using negative indexes to set values works the same as Ruby arrays, eg %template(IntVector) std::vector; iv = IntVector.new([1,2,3,4]) iv[-4] = 9 # => [1,2,3,9] iv[-5] = 9 # => IndexError 2015-11-21: wsfulton [Ruby, Python] Add std::array container wrappers. These work much like any of the other STL containers except Python/Ruby slicing is somewhat limited because the array is a fixed size. Only slices of the full size are supported. 2015-10-10: wsfulton [Python] #539 - Support Python 3.5 and -builtin. PyAsyncMethods is a new member in PyHeapTypeObject. 2015-10-06: ianlancetaylor [Go] Don't emit a constructor function for a director class with an abstract method, since the function will always panic. 2015-10-01: wsfulton Fix %shared_ptr support for private and protected inheritance. - Remove unnecessary Warning 520: Derived class 'Derived' of 'Base' is not similarly marked as a smart pointer - Do not generate code that attempts to cast up the inheritance chain in the type system runtime in such cases as it doesn't compile and can't be used. Remove unnecessary warning 520 for %shared_ptr when the base class is ignored. 2015-10-01: vkalinin Fix #508: Fix segfault parsing anonymous typedef nested classes. 2015-09-26: wsfulton [Ruby] Add shared_ptr support 2015-09-13: kkaempf [Ruby] Resolve tracking bug - issue #225. The bug is that the tracking code uses a ruby hash and thus may allocate objects (Bignum) while running the GC. This was tolerated in 1.8 but is invalid (raises an exception) in 1.9. The patch uses a C hash (also used by ruby) instead. 2015-09-09: lyze [CFFI] Extend the "export" feature in the CFFI module to support exporting to a specified package. 2015-09-04: olly [Python] Fix docstrings for %callback functions. 2015-09-03: demi-rluddy [Go] Removed golang stringing for signed/unsigned char Changed default handling of signed char* and unsigned char* to be opaque pointers rather than strings, similarly to how other languages work. Any existing code relying on treating signed char* or unsigned char* as a string can restore the old behavior with typemaps.i by using %apply to copy the [unchanged] char* behavior. *** POTENTIAL INCOMPATIBILITY *** 2015-08-07: talby [Perl] tidy -Wtautological-constant-out-of-range-compare warnings when building generated code under clang 2015-08-07: xantares [Python] pep257 & numpydoc conforming docstrings: - Mono-line module docsstring - Rewrite autodoc parameters section in numpydoc style: https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt - One line summary should end with "." - Adds a blank line after class docstring 2015-08-05: vadz [Java] Make (char* STRING, size_t LENGTH) typemaps usable for strings of other types, e.g. "unsigned char*". Version 3.0.7 (3 Aug 2015) ========================== 2015-08-02: wsfulton [Java] Fix potential security exploit in generated Java classes. The swigCPtr and swigCMemOwn member variables in the generated Java classes are now declared 'transient' by default. Further details of the exploit in Android is being published in an academic paper as part of USENIX WOOT '15: https://www.usenix.org/conference/woot15/workshop-program/presentation/peles. In the unlikely event that you are relying on these members being serializable, then you will need to override the default javabody and javabody_derived typemaps to generate the old generated code. The relevant typemaps are in the Lib directory in the java.swg, boost_shared_ptr.i and boost_intrusive_ptr.i files. Copy the relevant default typemaps into your interface file and remove the 'transient' keyword. *** POTENTIAL INCOMPATIBILITY *** 2015-08-01: vadz Make configure --without-alllang option more useful: it can now be overridden by the following --with-xxx options, allowing to easily enable just one or two languages. 2015-07-30: wsfulton Fix #440 - Initialise all newly created arrays when using %array_functions and %array_class in the carrays.i library - bug is only relevant when using C++. 2015-07-29: wsfulton [Python] Improve indentation warning and error messages for code in the following directives: %pythonprepend %pythonappend %pythoncode %pythonbegin %feature("shadow") Old error example: Error: Line indented less than expected (line 3 of pythoncode) New error example: Error: Line indented less than expected (line 3 of %pythoncode or %insert("python") block) as no line should be indented less than the indentation in line 1 Old warning example: Warning 740: Whitespace prefix doesn't match (line 2 of %pythoncode or %insert("python") block) New warning example: Warning 740: Whitespace indentation is inconsistent compared to earlier lines (line 3 of %pythoncode or %insert("python") block) 2015-07-28: wsfulton [Python] Fix #475. Improve docstring indentation handling. SWIG-3.0.5 and earlier sometimes truncated text provided in the docstring feature. This occurred when the indentation (whitespace) in the docstring was less in the second or later lines when compared to the first line. SWIG-3.0.6 gave a 'Line indented less than expected' error instead of truncating the docstring text. Now the indentation for the 'docstring' feature is smarter and is appropriately adjusted so that no truncation occurs. 2015-07-22: wsfulton Support for special variable expansion in typemap attributes. Example usage expansion in the 'out' attribute (C# specific): %typemap(ctype, out="$*1_ltype") unsigned int& "$*1_ltype" is equivalent to the following as $*1_ltype expands to 'unsigned int': %typemap(ctype, out="unsigned int") unsigned int& "unsigned int" Special variables can be used within special variable macros too. Example usage expansion: %typemap(cstype) unsigned int "uint" %typemap(cstype, out="$typemap(cstype, $*1_ltype)") unsigned int& "$typemap(cstype, $*1_ltype)" Special variables are expanded first and hence the above is equivalent to: %typemap(cstype, out="$typemap(cstype, unsigned int)") unsigned int& "$typemap(cstype, unsigned int)" which then expands to: %typemap(cstype, out="uint") unsigned int& "uint" 2015-07-22: lindleyf Apply patch #439 - support for $typemap() (aka embedded typemaps or special variable macros) in typemap attributes. A simple example where $typemap() is expanded in the 'out' attribute (C# specific): %typemap(cstype) unsigned int "uint" %typemap(cstype, out="$typemap(cstype, unsigned int)") unsigned int& "$typemap(cstype, unsigned int)" is equivalent to: %typemap(cstype, out="uint") unsigned int& "uint" 2015-07-18: m7thon [Python] Docstrings provided via %feature("docstring") are now quoted and added to the tp_doc slot when using python builtin classes (-builtin). When no docstring is provided, the tp_doc slot is set to the fully qualified C/C++ class name. Github issues #445 and #461. 2015-07-17: kwwette [octave] Support Octave version 4.0.0 (thanks to patches from Orion Poplawski). 2015-07-07: wsfulton SWIG no longer generates a wrapper for a class' constructor if that class has any base class with a private destructor. This is because your compiler should not allow a class to be instantiated if a base has a private destructor. Some compilers do, so if you need the old behaviour, use the "notabstract" feature, eg: %feature("notabstract") Derived; class Base { ~Base() {} }; struct Derived : Base {}; Version 3.0.6 (5 Jul 2015) ========================== 2015-07-02: wsfulton Fix syntax error when the template keyword is used in types, eg: std::template vector v; 2015-07-02: ngladitz [Lua] Push characters as unformatted 1-character strings to avoid unprintable characters such as (char)127 being converted to "<\127>" with Lua 5.3 and later. (github PR #452) 2015-06-29: olly [Python] Improve handling of whitespace in %pythoncode. Previously SWIG looked at the indentation of the first line and removed that many characters from each subsequent line, regardless of what those characters were. This was made worse because SWIG's preprocessor removes any whitespace before a '#'. Fixes github issue #379, reported by Joe Orton. 2015-06-12: wsfulton [R] Fix #430 - call to SWIG_createNewRef in copyToC was incorrectly named. 2015-06-11: sghirate [C#] Patch #427 adds in new command line option -outfile to combine all the generated C# code into a single file. 2015-06-09: wsfulton Fix seg fault processing C++11 type aliasing. Issue #424. 2015-05-28: wsfulton [Python] Add new feature "python:cdefaultargs" to control default argument code generation. By default, SWIG attempts to convert C/C++ default argument values into Python values and generates code into the Python layer with these values. Recent versions of SWIG are able to convert more of these values, however, the new behaviour can be circumvented if desired via this new feature, such that the default argument values are obtained from the C layer and not the Python layer. For example: struct CDA { int fff(int a = 1, bool b = false); }; The default code generation in the Python layer is: class CDA(_object): ... def fff(self, a=1, b=False): return _default_args.CDA_fff(self, a, b) Adding the feature: %feature("python:cdefaultargs") CDA::fff; Results in: class CDA(_object): ... def fff(self, *args): return _default_args.CDA_fff(self, *args) Some code generation modes, eg -builtin and -fastproxy, are unaffected by this as the default values are always obtained from the C layer. 2015-05-27: wsfulton [Python] Deal with an integer as the default value of a typedef to bool parameter in the C++ prototype. See #327. Regression from 3.0.0 onwards. 2015-05-19: olly [Python] Fix warning when compiling generated code with MSVC. (Fixes https://sourceforge.net/p/swig/patches/351/ reported by Mateusz Szyma¿ski). 2015-05-14: wsfulton Fix seg fault wrapping shared_ptr of classes with private constructors and destructors. This also fixes the "unref" feature when used on classes with private destructors. 2015-05-10: wsfulton [Java] Fix multi-argument typemaps (char *STRING, size_t LENGTH) so that they can be applied to a wider range of types. Fixes #385. 2015-05-07: olly [Python] Deal with an integer as the default value of a bool parameter in the C++ prototype. Fixes github #327, reported by Greg Allen. 2015-05-07: LindleyF [Java] Allow feature("director") and feature("ref") to be used together. Github PR#403. 2015-05-05: olly Suppress warning 325 "Nested class not currently supported (Foo ignored)" when Foo has already been explicitly ignored with "%ignore". 2015-05-04: wsfulton Add support for friend templates, including operator overloading - fixes #196. Considering the example below, previously the operator gave a syntax error and friendfunc incorrectly warned with: "Warning 503: Can't wrap 'friendfunc<(Type)>' unless renamed to a valid identifier." template class MyClass { friend int friendfunc (double is, MyClass & x); friend int operator<< (double un, const MyClass &x); }; The following also previously incorrectly warned with: "Warning 302: Identifier 'template_friend' redefined (ignored)," template T template_friend(T); struct MyTemplate { template friend T template_friend(T); }; 2015-05-01: wsfulton Fix handling of conversion operators where the operator is split over multiple lines or has comments within the operator type. Fixes #401. Also fix similar problem with normal operators which gave a syntax error if split over multiple lines or had a comment within the operator declaration. 2015-04-30: olly Ignore unknown preprocessor directives which are inside an inactive conditional (github issue #394, reported by Dan Wilcox). Regression introduced in 3.0.3. 2015-04-27: vadz [Python] Fix "default" typemap used after an argument with "numinputs=0" (#377). 2015-04-24: wsfulton [Python] Fix #256. Code generated with '-builtin -modernargs' segfaults for any method taking zero arguments. Also fixes: "SystemError: error return without exception set" during error checking when using just -builtin and the incorrect number of arguments is passed to a class method expecting zero arguments. 2015-04-23: wsfulton [Java] Bug #386 - Memory leak fix in (char *STRING, size_t LENGTH) typemaps. 2015-04-23: vadz [Python] Make "default" typemap work again (#330, #377). 2015-04-23: vadz [Python] Fix the use of default values for the pointer types (#365, #376). 2015-04-23: wsfulton Fix 'make check-ccache' which is part of 'make check' when one of the CCACHE_ environment variables, for example CCACHE_DISABLE, is set. 2015-04-14: wsfulton Clearer warning message for badly constructed typecheck typemaps. For example, was: example.i:3: Warning 467: Overloaded foo(int) not supported (no type checking rule for 'int'). Now: example.i:3: Warning 467: Overloaded foo(int) not supported (incomplete type checking rule - no precedence level in typecheck typemap for 'int'). 2015-04-11: wsfulton [Java] Fix #353 - Linker multiple definition of 'ExceptionMatches' when using directors and multiple modules. 2015-04-11: wsfulton Merge #320 - Make __dict__ accessible for Python builtin classes. 2015-04-07: wsfulton Fix #375 - parsing of extern "C" and typedef for example: extern "C" typedef void (*Hook2_t)(int, const char *); extern "C" typedef int Integer; 2015-03-12: olly -DSWIG_DIRECTOR_STATIC is now supported for all languages with director support, not only Python and PHP. 2015-03-02: ianlancetaylor [Go] Add -cgo option, required for Go versions 1.5 and later. 2015-02-26: olly Fix segmentation fault when top==NULL, introduced by nested class handling (reported in issue#346 by Pawe¿ Tomulik). 2015-02-09: wsfulton [Guile] Fix generated code for static const char member variables when defined and declared inline. 2015-02-09: mishas [Go] Fix %import of files in sub directories. 2015-02-05: ianlancetaylor [Go] Ignore Go specific type maps (goin, goout, etc.) if they are empty. 2015-02-05: ianlancetaylor [Go] Generated Go code no longer calls _swig_goallocate or _swig_makegostring, as they will no longer work as of Go 1.5. Version 3.0.5 (31 Jan 2015) =========================== 2015-01-30: wsfulton [Python] Fix Python -classic and property setting. Setting properties on classic classes was broken in swig-3.0.3 by attempting to use __setattr__. This regression is fixed now by using __dict__ again when using -classic. Fixes patch #232. 2015-01-27: smarchetto [Scilab] Support for the Scilab language has been added 2015-01-23: olly [PHP] When wrapping a returned resource as an object, check if all cases wrap it in the same class, and if so eliminate the pointless switch statement wrapper we previously generated. 2015-01-22: wsfulton [Octave] Merge patch #297 for SF bug #1277 - Octave shared_ptr support 2015-01-15: wsfulton [Python] Merge patch #250 - Fixes for using %constant and objects (non-primitive types) 2015-01-15: wsfulton [C# Go] Merge patch #308 and fix #307 - C++11 strongly typed enum support in directors 2015-01-15: wsfulton [Python] Second fix for #294 #296 - Regression introduced in SWIG-3.0.3 when wrapping functions with default arguments, this time when using kwargs. Version 3.0.4 (14 Jan 2015) =========================== 2015-01-12: olly [PHP] Fix segfault in director upcall check when using PHP built with ZTS enabled. Fixes #155, reported by Pierre Labastie. 2015-01-12: vadz [Python] Fix #294 #296 - Regression introduced in SWIG-3.0.3 when wrapping functions with default arguments. Invalid or missing default arguments were sometimes being generated into the python layer. 2015-01-08: olly Allow C++11 "explicit constexpr". Fixes github issue #284 reported by Pawel Tomulik. Also handle "constexpr explicit" and "constexpr static". 2015-01-08: olly When reporting an error for a construct which hasn't been terminated when the end of the file is reached, report it at the start line rather than "EOF" as then tools like editors and IDEs will take you to a generally more useful place for fixing the problem. 2015-01-08: olly Improve error messages for a few cases which previously gave the one of the cryptic catch-all errors "Syntax error in input". 2015-01-08: olly Provide -cppext as a general command line option for setting the extension used for generated C++ files (previously it was specific to the PHP backend). Deprecate the equivalent -suffix option provided by the Ocaml backend, but continue to support that for now. Version 3.0.3 (30 Dec 2014) =========================== 2014-12-27: wsfulton Fix #280 - abort using all default template parameters within other template parameters. 2014-12-27: talby [Perl] Issue #282 perl5 archlib vs archlibexp [Perl] tidy "warning: duplicate 'extern' declaration specifier" when building generated code under clang 2014-12-18: wsfulton Add support for %constant and structs/classes - issue #272 2014-12-09: wsfulton Fix #245 - regression (since swig-3.0.0) in templated constructors. Templated constructors could not be instantiated - they were incorrectly ignored with a warning 504: "Function: xyz must have a return type. Ignored." 2014-12-07: wsfulton Add support for C++11 strongly typed enumerations. 2014-11-21: wsfulton [Java C#] Fix multiply defined error when using %rename of enum items when using the "simple enum" wrappers. 2014-10-28: vadz [Python] Patch #201 The generated .py file no longer uses *args for all Python parameters. Instead, the parameters are named using the C++ parameter names. "compactdefaultargs" feature can be enabled to restore the old behaviour. *** POTENTIAL INCOMPATIBILITY *** 2014-10-24: timotheecour [D] Patch #204 Use core.atomic.atomicOp to mutate shared variables 2014-10-21: wsfulton Fix issue #242 - Use of the "kwargs" feature no longer automatically turns on the "compactdefaultargs" feature if the target language does not support kwargs. This change affects all languages except Python and Ruby. *** POTENTIAL INCOMPATIBILITY *** 2014-10-10: diorcety [Python] Patch #232 Fix property access using directors 2014-10-06: wsfulton [Python] Fixes when using -builtin and std::vector/std::list wrappers to allow deletion of single elements, such as 'del vec[0]'. 2014-09-30: oliverb [Javascript] Merge patch #216 by Richie765 - Added support for many versions of v8 javascript. 2014-09-30: oliverb [Javascript] Merge patch #195 by zittix - Fixed JSClassRef declaration not using the static one. 2014-09-30: ianlancetaylor [Go] In configure script, require Go 1.1 or later. 2014-09-30: wsfulton [Python] Patch #207 - Fix No module error with -relativeimport when using single header file import. 2014-09-27: wsfulton Patch #208 - Initialise newly created array when using array_functions in the carrays.i library (C++ usage). 2014-09-27: wsfulton [Ruby] Patch #187 - Fix crash on shutdown of the Ruby interpreter if more than one module was loaded at a time when data is being shared between modules. 2014-09-27: wsfulton [Java] Patch #168 - Fix leak in Java director string handling after the Java upcall when called from a native thread. 2014-09-25: ianlancetaylor [Go] Adjust generated code to work with upcoming Go 1.4 release. 2014-09-23: wsfulton [Python] Add patch from Thomas Maslach to fix crash in wrappers when using -threads in the STL iterators (SwigPyIterator destructor). 2014-09-17: wsfulton [C#] Merge patch #229 from contre - Add bool array types to arrays_csharp.i 2014-09-12: olly [PHP] Add support for specifying any PHP interfaces a wrapped class implements, e.g.: %typemap("phpinterfaces") MyIterator "Iterator"; 2014-09-11: olly [PHP] Fix throwing a PHP exception through C++ from a subclassed director method - PHP NULL gets returned by the subclassed method in this case, so the directorout typemap needs to allow that (at least if an exception is active). 2014-09-09: ianlancetaylor [Go] Add goargout typemap. 2014-09-09: olly [PHP] Fix segmentation faults with directors in PHP >= 5.4, and reenable runme tests for director_basic testcase. Fix from pavel-charvat in issue#164. 2014-09-05: ianlancetaylor [Go] Add imtype, goin, goout, godirectorin, and godirectorout typemaps, to support writing Go code to convert between types. 2014-09-02: olly [Python] Fix regression in indentation of python code produced with -modern, introduced by changes in #188. Reported by fabiencastan in #218. 2014-09-01: olly Issue an error for unknown SWIG preprocessor directives, rather than quietly ignoring them. Reported by jrhelsey in issue#217. *** POTENTIAL INCOMPATIBILITY *** 2014-08-15: talby [Perl] Include guard fix for nested modules from Anthony Heading (SF Patch #350). 2014-08-04: wsfulton [C#] Merge patch #200 from gpetrou - Changed CSharp license header to include auto-generated tag so that StyleCop ignores the files. 2014-08-04: wsfulton [Java] Merge patch #198 from Yuval Kashtan - Support for java.nio.ByteBuffer mapping to unsigned char * in various.i in NIOBUFFER typemaps. 2014-07-14: ianlancetaylor [Go] Change struct definition to use void *, not uint8, so that the type is recorded as possibly containing pointers. This ensures that the 1.3 garbage collector does not collect pointers passed to C++ code. 2014-07-01: wsfulton Fix SF Bug #1375 - Expansion of the $parentclassname special variable incorrectly contains brackets in the expanded name. Version 3.0.2 (4 Jun 2014) ========================== 2014-06-02: v-for-vandal [Lua] Pull request #176: If class has no __eq implemented, then default __eq is generated. Default __eq compares actual pointers stored inside Lua userdata. 2014-06-02: vkalinin Fix #183 - %extend and unnamed nested structs 2014-05-28: kwwette Fix install failure when using an 'out of source' build using the shipped tarball - regression introduced in swig-3.0.1. 2014-05-24: kwwette [Octave] Remove deprecated -global/-noglobal command-line arguments *** POTENTIAL INCOMPATIBILITY *** Version 3.0.1 (27 May 2014) =========================== 2014-05-25: hfalcic [Python] Python 3 byte string output: use errors="surrogateescape" if available on the version of Python that's in use. This allows obtaining the original byte string (and potentially trying a fallback encoding) if the bytes can't be decoded as UTF-8. Previously, a UnicodeDecodeError would be raised with no way to treat the data as bytes or try another codec. 2014-05-18: vkalinin Bug #175 - Restore %extend to work for unnamed nested structures by using a C symbol comprising the outer structure name and unnamed variable instance name. 2014-05-15: kwwette Add #166 - 'make check' now works out of source. This required the examples to build out of source. The main languages have been tested - C#, Go, Guile, Java, Javascript, Lua, Octave, Perl, PHP, Python, Ruby and Tcl. 2014-05-01: Oliver Buchtala Javascript support added, see Javascript chapter in the documentation. 2014-05-01: olly [PHP] The generated __isset() method now returns true for read-only properties. 2014-04-24: kwwette [Go] Fix go ./configure parsing of gccgo --version, and goruntime.swg typo in __GNUC_PATCHLEVEL__ (SF Bug #1298) 2014-04-24: kwwette Fix {python|perl5|ruby|tcl}/java examples In Lib/gcj/cni.i, for compatibility with newer gcj versions: - remove JvAllocObject() which gcj no longer defines, from gcj Changelog: 2004-04-16 Bryce McKinlay * gcj/cni.h (JvAllocObject): Remove these obsolete, undocumented CNI calls. - change JvCreateJavaVM() argument from void* to JvVMInitArgs*, from gcj Changelog: 2005-02-23 Thomas Fitzsimmons PR libgcj/16923 ... (JvCreateJavaVM): Declare vm_args as JvVMInitArgs* rather than void*. *** POTENTIAL INCOMPATIBILITY *** 2014-04-08: wsfulton SF Bug #1366 - Remove duplicate declarations of strtoimax and strtoumax in inttypes.i 2014-04-08: wsfulton [Java C#] Enums which have been ignored via %ignore and are subsequently used are handled slightly differently. Type wrapper classes are now generated which are effectively a wrapper of an empty enum. Previously in Java uncompilable code was generated and in C# an int was used. 2014-04-04: wsfulton Fix regression in 3.0.0 where legal code following an operator<< definition might give a syntax error. SF Bug #1365. 2014-04-03: olly [PHP] Fix wrapping director constructors with default parameters with a ZTS-enabled build of PHP. 2014-04-02: olly [PHP] Pass the ZTS context we already have to avoid needing to call TSRMLS_FETCH, which is relatively expensive. 2014-04-02: olly [PHP] Pass ZTS context through to t_output_helper() so it works with a ZTS-enabled build of PHP. Reported by Pierre Labastie in github PR#155. 2014-03-28: wsfulton [Java C# D Go] Fixes for C enums used in an API and the definition of the enum has not been parsed. For D, this fixes a segfault in SWIG. The other languages now produce code that compiles, although the definition of the enum is needed in order to use the enum properly from the target language. 2014-03-23: v-for-vandal [Lua] Fix for usage of snprintf in Lua runtime which Visual Studio does not have. Version 3.0.0 (16 Mar 2014) =========================== 2014-03-16: wsfulton C++11 support initially developed as C++0x support by Matevz Jekovec as a Google Summer of Code project has been further extended. The C++11 support is comprehensive, but by no means complete or without limitations. Full details for each new feature in C++11 is covered in the CPlusPlus11.html chapter in the documentation which is included in SWIG and also available online at http://www.swig.org/Doc3.0/CPlusPlus11.html. 2014-03-14: v-for-vandal [Lua] Numerous Lua improvements: 1. %nspace support has been added. Namespaces are mapped to tables in the module, with the same name as the C++ namespace. 2. Inheritance is now handled differently. Each class metatable keeps a list of class bases instead of merging all members of all bases into the derived class. 3. The new metatables result in differences in accessing class members. For example: %module example struct Test { enum { TEST1 = 10, TEST2 = 20 }; static const int ICONST = 12; }; Now this can be used as follows: print(example.Test.TEST1) print(example.Test.ICONST) The old way was: print(example.Test_TEST1) print(example.Test_ICONST) 4. The special class metatable member ".constructor" was removed. Now SWIG generates the proxy function by itself and assigns it directly to the class table "__call" method. 5. eLua should also now support inheritance. 6. 'const' subtable in eLua is considered deprecated. Changes in behaviour: a. You can no longer assign to non-existing class members in classes without a __setitem__ method. It will cause a Lua error. b. You can no longer iterate over a module table and copy everything into the global namespace. Actually, this was never the case, but it is now explicitly prohibited. c. Now changing a base class will immediately affect all derived classes. d. There might be some issues with inheritance. Although the bases iteration scheme is the same as was used for merging base classes into derived one, some unknown issues may arise. The old metatable behaviour can be restored by using the -no-old-metatable-bindings option. *** POTENTIAL INCOMPATIBILITY *** 2014-03-06: wsfulton [Python] Change in default behaviour wrapping C++ bool. Only a Python True or False will now work for C++ bool parameters. This fixes overloading bool with other types. Python 2.3 minimum is now required for wrapping bool. When wrapping: const char* overloaded(bool value) { return "bool"; } const char* overloaded(int value) { return "int"; } Previous behaviour: >>> overloaded(False) 'int' >>> overloaded(True) 'int' >>> overloaded(0) 'int' Now we get the expected behaviour: >>> overloaded(False) 'bool' >>> overloaded(0) 'int' The consequence is when wrapping bool in non-overloaded functions: const char* boolfunction(bool value) { return value ? "true" : "false"; } The previous behaviour was very Pythonic: >>> boolfunction("") 'false' >>> boolfunction("hi") 'true' >>> boolfunction(12.34) 'true' >>> boolfunction(0) 'false' >>> boolfunction(1) 'true' Now the new behaviour more along the lines of C++ due to stricter type checking. The above calls result in an exception and need to be explicitly converted into a bool as follows: >>> boolfunction(0) Traceback (most recent call last): File "", line 1, in TypeError: in method 'boolfunction', argument 1 of type 'bool' >>> boolfunction(bool(0)) 'false' The old behaviour can be resurrected by passing the -DSWIG_PYTHON_LEGACY_BOOL command line parameter when executing SWIG. Typemaps can of course be written to customise the behaviour for specific parameters. *** POTENTIAL INCOMPATIBILITY *** 2014-03-06: wsfulton Fix SF Bug #1363 - Problem with method overloading when some methods are added by %extend and others are real methods and using template default parameters with smart pointers. This is noticeable as a regression since 2.0.12 when using the default smart pointer handling for some languages when the smart pointer wraps std::map and other STL containers. 2014-03-02: wsfulton [Python] SF Patch #346 from Jens Krueger. Correct exception thrown attempting to access a non-existent C/C++ global variable on the 'cvar' object. The exception thrown used to be a NameError. However, as this access is via a primary, an AttributeError is more correct and so the exception thrown now is an AttributeError. Reference: http://docs.python.org/2/reference/expressions.html#attribute-references *** POTENTIAL INCOMPATIBILITY *** 2014-03-01: wsfulton [Python] Patch #143 Fix type shown when using type() to include the module and package name when using -builtin. 2014-03-01: wsfulton [Python] SF patch #347 Fix missing argument count checking with -modern. Fixes regression introduced when builtin changes were introduced in SWIG-2.0.3. 2014-02-21: wsfulton [PHP] Fix warning suppression using %warnfilter for PHP reserved class names. 2014-02-19: olly [Lua] Add keyword warnings for Lua keywords and Basic Functions. 2014-02-19: olly -Wallkw now includes keywords for all languages with keyword warnings (previously Go and R were missing). 2014-02-19: olly [PHP] Update the lists of PHP keywords with new ones from PHP 5.4 and newer (and some missing ones from 5.3). Reserved PHP constants names are now checked against enum values and constants, instead of against function and method names. Built-in PHP function names no longer match methods added by %extend. Functions and methods named '__sleep', '__wakeup', 'not', 'parent', or 'virtual' are no longer needlessly renamed. 2014-02-15: wsfulton Fix the %$ismember %rename predicates to also apply to members added via %extend. Add %$isextendmember for %rename of members added via %extend. This can be used to distinguish between normal class/struct members and %extend members. For example '%$ismember, %$not %$isextendmember' will now identify just class/struct members. *** POTENTIAL INCOMPATIBILITY *** 2014-02-16: hfalcic [Python] Patch #137 - fix crashes/exceptions in exception handling in Python 3.3 2014-02-15: wsfulton [Java] Add support for the cdata library. 2014-02-08: vkalinin Nested class support added. This primarily allows SWIG to properly parse nested classes and keep the nested class information in the parse tree. Java and C# have utilised this information wrapping the C++ nested classes as Java/C# nested classes. The remaining target languages ignore nested classes as in previous versions. Help is needed by users of these remaining languages to design how C++ nested classes can be best wrapped. Please talk to us on the swig-devel mailing list if you think you can help. Previously, there was limited nested class support. Nested classes were treated as opaque pointers. However, the "nestedworkaround" feature provided a way to wrap a nested class as if it was a global class. This feature no longer exists and is replaced by the new "flatnested" feature. This effectively does the same thing with less manual code to be written. Please see the 'Nested classes' section in the documentation in SWIGPlus.html if you were previously using this feature. SWIG now parses the contents of nested classes where previously it did not. You may find that you will need to make adjustments to your interface file as effectively extra code is being wrapped. *** POTENTIAL INCOMPATIBILITY *** 2014-02-06: gjanssens [Guile] Patch #133. Make scm to string conversion work with non-ascii strings. Guile 2 has a completely rewritten string implementation. SWIG made some assumptions that are no longer valid as to the internals of guile's string representation. 2014-01-30: wsfulton [C#] Add new swigtype_inout.i library containing SWIGTYPE *& OUTPUT typemaps. Example usage wrapping: void f(XXX *& x) { x = new XXX(111); } would be: XXX x = null; f(out x); // use x x.Dispose(); // manually clear memory or otherwise leave out and leave it to the garbage collector 2014-01-21: ianlancetaylor [Go] Add %go_import directive. 2014-01-21: ianlancetaylor [Go] Add support for Go 1.3, not yet released. 2014-01-20: wsfulton Director exceptions (Swig::DirectorException) now derive from std::exception and hence provide the what() method. In Python and Ruby, this replaces the now deprecated DirectorException::getMessage() method. 2014-01-14: diorcety Patch #112 - Fix symbol resolution involving scopes that have multiple levels of typedefs - fixes some template resolutions as well as some typemap searches. 2014-01-11: wsfulton Fix and document the naturalvar feature override behaviour - the naturalvar feature attached to a variable name has precedence over the naturalvar feature attached to the variable's type. The overriding was not working when turning the feature off on the variable's name. Fix so that any use of the naturalvar feature will override the global setting. Previously when set globally by -naturalvar or %module(naturalvar=1), use of the naturalvar feature was not always honoured. 2014-01-06: ianlancetaylor [Go] Fix bug that broke using directors from a thread not created by Go. 2013-12-24: ptomulik [Python] SF Bug #1297 Resolve several issues related to python imports. For example, it's now possible to import modules having the same module names, but belonging in different packages. From the user's viewpoint, this patch gives a little bit more control on import statements generated by SWIG. The user may choose to use relative or absolute imports. Some details: - we (still) generate import statements in the form 'import a.b.c' which corresponds to absolute imports in python3 and (the only available) ambiguous one in python2. - added -relativeimport option to use explicit relative import syntax (python3), The "Python Packages" section in the documentation discusses how to work with importing packages including the new -relativeimport command line option. 2013-12-23: vadz [Octave, Perl, Python, R, Ruby, Tcl] Change the length of strings created from fixed-size char buffers in C code. This is a potential backwards compatibility break: a "char buf[5]" containing "ho\0la" was returned as a string of length 5 before, but is returned as a string of length 2 now. Also, it was possible to assign a (non-NUL-terminated) string "hello" to such a buffer before but now this fails and only "helo" can fit. Apply "char FIXSIZE[ANY]" typemaps to explicitly choose the old behaviour. *** POTENTIAL INCOMPATIBILITY *** 2013-12-23: talby [Perl] Add support for directors. 2013-12-18: ianlancetaylor [Go] Don't require that Go environment variables be set when running examples or testsuite when using Go 1 or later. 2013-12-17: ianlancetaylor [Go] Remove -longsize option (for backward compatibility, ignore it if seen). 2013-12-17: ianlancetaylor [Go] Add -go-pkgpath option. 2013-12-16: ianlancetaylor [Go] Update for Go 1.2 release. Add support for linking SWIG code directly into executable, rather than using a shared library. 2013-12-13: ianlancetaylor [Go] Add SWIG source file name as comments in generated files. This can be used by Go documentation tools. 2013-12-12: jleveque [Lua] Fix typo (wchar instead of wchar_t) which made wchar.i for Lua useless. 2013-12-12: vmiklos [PHP] PHP's peculiar call-time pass-by-reference feature was deprecated in PHP 5.3 and removed in PHP 5.4, so update the REF typemaps in phppointers.i to specify pass-by-reference in the function definition. Examples/php/pointer has been updated accordingly. 2013-12-12: olly [PHP] The usage of $input in PHP directorout typemaps has been changed to be consistent with other languages. The typemaps provided by SWIG have been updated accordingly, but if you have written your own directorout typemaps, you'll need to update $input to &$input (or make equivalent changes). *** POTENTIAL INCOMPATIBILITY *** 2013-11-27: vadz [C#, Java, Python] Add std_auto_ptr.i defining typemaps for returning std::auto_ptr<>. 2013-11-09: wsfulton [C#] Apply patch #79 from Brant Kyser - Remove using directives from the generated C# code and fully qualify the use of all .NET framework types in order to minimize potential name collisions from input files defining types, namespace, etc with the same name as .NET framework members. - Globally qualify the use of .NET framework types in the System namespace - Remove .NET 1.1 support, .NET 2 is the minimum for the C# module This is a potential backwards compatibility break if code has been added relying on these using statements that used to be generated: using System; using System.Runtime.InteropServices; The quick fix to add these back in is to add the -DSWIG2_CSHARP command line option when executing SWIG. See CSharp.html documentation for more info. *** POTENTIAL INCOMPATIBILITY *** 2013-11-05: wsfulton [Java] Fix some corner cases for the $packagepath/$javaclassname special variable substitution. 2013-11-05: wsfulton [Java] Apply patch #91 from Marvin Greenberg - Add director:except feature for improved exception handling in director methods for Java. 2013-10-15: vadz Allow using \l, \L, \u, \U and \E in the substitution part of %(regex:/pattern/subst/) inside %rename to change the case of the text being replaced. 2013-10-12: wsfulton [CFFI] Apply #96 - superclass not lispify 2013-10-12: wsfulton Merge in C++11 support from the gsoc2009-matevz branch where Matevz Jekovec first started the C++0x additions. Documentation of the C++11 features supported is in a new Chapter of the documentation, "SWIG and C++11" in Doc/Manual/CPlusPlus11.html. 2013-10-04: wsfulton Fix %naturalvar not having any affect on templated classes instantiated with an enum as the template parameter type. Problem reported by Vadim Zeitlin. 2013-09-20: wsfulton [Java] Fix a memory leak for the java char **STRING_ARRAY typemaps. Version 2.0.12 (9 Feb 2014) =========================== 2014-01-16: wsfulton [PHP] Fix compilation error in ZTS mode (64 bit windows) due to incorrect placement of TSRMLS_FETCH() in SWIG_Php_GetModule() as reported by Mark Dawson-Butterworth. 2014-01-13: kwwette [Octave] update support to Octave version 3.8.0 - Octave 3.8.0 no longer defines OCTAVE_API_VERSION_NUMBER, but 3.8.1 will define OCTAVE_{MAJOR,MINOR,PATCH}_VERSION instead: see http://hg.savannah.gnu.org/hgweb/octave/rev/b6b6e0dc700e So we now use a new macro SWIG_OCTAVE_PREREQ(major,minor,patch) to enable features requiring Octave version major.minor.patch or later. For Octave versions prior to 3.8.1, we reconstruct values for OCTAVE_{MAJOR,MINOR,PATCH}_VERSION based on OCTAVE_API_VERSION_NUMBER, extracted from Octave's ChangeLogs. An additional hack is needed to distinguish between Octave <= 3.2.x and 3.8.0, neither of which define OCTAVE_API_VERSION_NUMBER. - Octave 3.8.0 deprecates symbol_table::varref(), so remove its use for this and future versions of Octave. - Octave 3.8.0 removes octave_value::is_real_nd_array(), used in octave_swig_type::dims(). Its use is not required here, so remove it. - Retested against Octave versions 3.0.5, 3.2.4, 3.4.3, 3.6.4, and 3.8.0. - Updated Octave documentation with tested Octave versions, and added a warning against using versions <= 3.x.x, which are no longer tested. 2013-12-22: wsfulton C++11 support for new versions of erase and insert in the STL containers. The erase and insert methods in the containers use const_iterator instead of iterator in C++11. There are times when the methods wrapped must match the parameters exactly. Specifically when full type information for template types is missing or SWIG fails to look up the type correctly, for example: %include typedef float Real; %template(RealVector) std::vector; SWIG does not find std::vector::iterator because %template using typedefs does not always work and so SWIG doesn't know if the type is copyable and so uses SwigValueWrapper which does not support conversion to another type (const_iterator). This resulted in compilation errors when using the C++11 version of the containers. Closes #73 2013-10-17: wsfulton [R] Fix SF #1340 - Visual Studio compile error in C++ wrappers due to #include within extern "C" block. 2013-10-17: wsfulton [Python] Fix SF #1345 - Missing #include for offsetof when using -builtin. 2013-10-12: wsfulton [Lua] Apply #92 - missing return statements for SWIG_Lua_add_namespace_details() and SWIG_Lua_namespace_register(). Version 2.0.11 (15 Sep 2013) ============================ 2013-09-15: wsfulton [R] Fix attempt to free a non-heap object in OUTPUT typemaps for: unsigned short *OUTPUT unsigned long *OUTPUT signed long long *OUTPUT char *OUTPUT signed char*OUTPUT unsigned char*OUTPUT 2013-09-12: wsfulton [Lua] Pull Git patch #62. 1) Static members and static functions inside class can be accessed as ModuleName.ClassName.FunctionName (MemberName respectively). Old way such as ModuleName.ClassName_FunctionName still works. 2) Same goes for enums inside classes: ModuleName.ClassName.EnumValue1 etc. 2013-09-12: wsfulton [UTL] Infinity is now by default an acceptable value for type 'float'. This fix makes the handling of type 'float' and 'double' the same. The implementation requires the C99 isfinite() macro, or otherwise some platform dependent equivalents, to be available. Users requiring the old behaviour of not accepting infinity, can define a 'check' typemap wherever a float is used, such as: %typemap(check,fragment="") float, const float & %{ if ($1 < -FLT_MAX || $1 > FLT_MAX) { SWIG_exception_fail(SWIG_TypeError, "Overflow in type float"); } %} *** POTENTIAL INCOMPATIBILITY *** 2013-08-30: wsfulton [Lua] Pull Git patch #81: Include Lua error locus in SWIG error messages. This is standard information in Lua error messages, and makes it much easier to find bugs. 2013-08-29: wsfulton Pull Git patch #75: Handle UTF-8 files with BOM at beginning of file. Was giving an 'Illegal token' syntax error. 2013-08-29: wsfulton [C#] Pull Git patch #77: Allow exporting std::map using non-default comparison function. 2013-08-28: wsfulton [Python] %implicitconv is improved for overloaded functions. Like in C++, the methods with the actual types are considered before trying implicit conversions. Example: %implicitconv A; struct A { A(int i); }; class CCC { public: int xx(int i) { return 11; } int xx(const A& i) { return 22; } }; The following python code: CCC().xx(-1) will now return 11 instead of 22 - the implicit conversion is not done. 2013-08-23: olly [Python] Fix clang++ warning in generated wrapper code. 2013-08-16: wsfulton [Python] %implicitconv will now accept None where the implicit conversion takes a C/C++ pointer. Problem highlighted by Bo Peng. Closes SF patch #230. 2013-08-07: wsfulton [Python] SF Patch #326 from Kris Thielemans - Remove SwigPyObject_print and SwigPyObject_str and make the generated wrapper use the default python implementations, which will fall back to repr (for -builtin option). Advantages: - it avoids the swig user having to jump through hoops to get print to work as expected when redefining repr/str slots. - typing the name of a variable on the python prompt now prints the result of a (possibly redefined) repr, without the swig user having to do any extra work. - when redefining repr, the swig user doesn't necessarily have to redefine str as it will call the redefined repr - the behaviour is exactly the same as without the -builtin option while requiring no extra work by the user (aside from adding the %feature("python:slot...) statements of course) Disadvantage: - default str() will give different (but clearer?) output on swigged classes 2013-07-30: wsfulton [Python, Ruby] Fix #64 #65: Missing code in std::multimap wrappers. Previously an instantiation of a std::map was erroneously required in addition to an instantiation of std::multimap with the same template parameters to prevent compilation errors for the wrappers of a std::multimap. 2013-07-14: joequant [R] Change types file to allow for SEXP return values 2013-07-05: wsfulton [Python] Add %pythonbegin directive which works like %pythoncode, except the specified code is added at the beginning of the generated .py file. This is primarily needed for importing from __future__ statements required to be at the very beginning of the file. Example: %pythonbegin %{ from __future__ import print_function print("Loading", "Whizz", "Bang", sep=' ... ') %} 2013-07-01: wsfulton [Python] Apply SF patch #340 - Uninitialized variable fix in SWIG_Python_NonDynamicSetAttr when using -builtin. 2013-07-01: wsfulton [Python, Ruby, Ocaml] Apply SF patch #341 - fix a const_cast in generated code that was generating a <:: digraph when using the unary scope operator (::) (global scope) in a template type. 2013-07-01: wsfulton [Python] Add SF patch #342 from Christian Delbaere to fix some director classes crashing on object deletion when using -builtin. Fixes SF bug #1301. 2013-06-11: wsfulton [Python] Add SWIG_PYTHON_INTERPRETER_NO_DEBUG macro which can be defined to use the Release version of the Python interpreter in Debug builds of the wrappers. The Visual Studio .dsp example files have been modified to use this so that Debug builds will now work without having to install or build a Debug build of the interpreter. 2013-06-07: wsfulton [Ruby] Git issue #52. Fix regression with missing rb_complex_new function for Ruby versions prior to 1.9 using std::complex wrappers if just using std::complex as an output type. Also fix the Complex helper functions external visibility (to static by default). 2013-06-04: olly [PHP] Fix SWIG_ZTS_ConvertResourcePtr() not to dereference NULL if the type lookup fails. Version 2.0.10 (27 May 2013) ============================ 2013-05-25: wsfulton [Python] Fix Python 3 inconsistency when negative numbers are passed where a parameter expects an unsigned C type. An OverFlow error is now consistently thrown instead of a TypeError. 2013-05-25: Artem Serebriyskiy SVN Patch ticket #338 - fixes to %attribute macros for template usage with %arg. 2013-05-19: wsfulton Fix ccache-swig internal error bug due to premature file cleanup. Fixes SF bug 1319 which shows up as a failure in the ccache tests on Debian 64 bit Wheezy, possibly because ENABLE_ZLIB is defined. This is a corner case which will be hit when the maximum number of files in the cache is set to be quite low (-F option), resulting in a cache miss. 2013-05-09: kwwette [Octave] Fix bugs in Octave module loading: - fix a memory leak in setting of global variables - install functions only once, to speed up module loads 2013-04-28: gjanssens [Guile] Updates in guile module: - Add support for guile 2.0 - Drop support for guile 1.6 - Drop support for generating wrappers using guile's gh interface. All generated wrappers will use the scm interface from now on. - Deprecate -gh and -scm options. They are no longer needed. A warning will be issued when these options are still used. - Fix all tests and examples to have a successful travis test 2013-04-18: wsfulton Apply Patch #36 from Jesus Lopez to add support for $descriptor() special variable macro expansion in fragments. For example: %fragment("nameDescriptor", "header") %{ static const char *nameDescriptor = "$descriptor(Name)"; %} which will generate into the wrapper if the fragment is used: static const char *nameDescriptor = "SWIGTYPE_Name"; 2013-04-18: wsfulton Fix SF Bug #428 - Syntax error when preprocessor macros are defined inside of enum lists, such as: typedef enum { eZero = 0 #define ONE 1 } EFoo; The macros are silently ignored. 2013-04-17: wsfulton [C#] Pull patch #34 from BrantKyser to fix smart pointers in conjunction with directors. 2013-04-15: kwwette [Octave] Fix bugs in output of cleanup code. - Cleanup code is now written also after the "fail:" label, so it will be called if a SWIG_exception is raised by the wrapping function, consistent with other modules. - Octave module now also recognises the "$cleanup" special variable, if needed. 2013-04-08: kwwette Add -MP option to SWIG for generating phony targets for all dependencies. - Prevents make from complaining if header files have been deleted before the dependency file has been updated. - Modelled on similar option in GCC. 2013-04-09: olly [PHP] Add missing directorin typemap for char* and char[] which fixes director_string testcase failure. 2013-04-05: wsfulton [Ruby] SF Bug #1292 - Runtime fixes for Proc changes in ruby-1.9 when using STL wrappers that override the default predicate, such as: %template(Map) std::map >; 2013-04-05: wsfulton [Ruby] SF Bug #1159 - Correctly check rb_respond_to call return values to fix some further 1.9 problems with functors and use of Complex wrappers. 2013-04-02: wsfulton [Ruby] Runtime fixes for std::complex wrappers for ruby-1.9 - new native Ruby complex numbers are used. 2013-03-30: wsfulton [Ruby] Fix seg fault when using STL containers of generic Ruby types, GC_VALUE or LANGUAGE_OBJECT, on exit of the Ruby interpreter. More frequently observed in ruby-1.9. 2013-03-29: wsfulton [Ruby] Fix delete_if (reject!) for the STL container wrappers which previously would sometimes seg fault or not work. 2013-03-25: wsfulton [Python] Fix some undefined behaviour deleting slices in the STL containers. 2013-03-19: wsfulton [C#, Java, D] Fix seg fault in SWIG using directors when class and virtual method names are the same except being in different namespaces when the %nspace feature is not being used. 2013-02-19: kwwette Fix bug in SWIG's handling of qualified (e.g. const) variables of array type. Given the typedef a(7).q(volatile).double myarray // typedef volatile double[7] myarray; the type q(const).myarray // const myarray becomes a(7).q(const volatile).double // const volatile double[7] Previously, SwigType_typedef_resolve() produces the type q(const).a(7).q(volatile).double // non-sensical type which would never match %typemap declarations, whose types were parsed correctly. Add typemap_array_qualifiers.i to the test suite which checks for the correct behaviour. 2013-02-18: wsfulton Deprecate typedef names used as constructor and destructor names in %extend. The real class/struct name should be used. typedef struct tagEStruct { int ivar; } EStruct; %extend tagEStruct { EStruct() // illegal name, should be tagEStruct() { EStruct *s = new EStruct(); s->ivar = ivar0; return s; } ~EStruct() // illegal name, should be ~tagEStruct() { delete $self; } } For now these trigger a warning: extend_constructor_destructor.i:107: Warning 522: Use of an illegal constructor name 'EStruct' in %extend is deprecated, the constructor name should be 'tagEStruct'. extend_constructor_destructor.i:111: Warning 523: Use of an illegal destructor name 'EStruct' in %extend is deprecated, the destructor name should be 'tagEStruct'. These %extend destructor and constructor names were valid up to swig-2.0.4, however swig-2.0.5 ignored them altogether for C code as reported in SF bug #1306. The old behaviour of using them has been restored for now, but is officially deprecated. This does not apply to anonymously defined typedef classes/structs such as: typedef struct {...} X; 2013-02-17: kwwette When generating functions provided by %extend, use "(void)" for no-argument functions instead of "()". This prevents warnings when compiling with "gcc -Wstrict-prototypes". 2013-02-17: kwwette [Octave] Minor fix to autodoc generation: get the right type for functions returning structs. 2013-02-15: wsfulton Deprecate typedef names used in %extend that are not the real class/struct name. For example: typedef struct StructBName { int myint; } StructB; %extend StructB { void method() {} } will now trigger a warning: swig_extend.i:19: Warning 326: Deprecated %extend name used - the struct name StructBName should be used instead of the typedef name StructB. This is only partially working anyway (the %extend only worked if placed after the class definition). 2013-02-09: wsfulton [CFFI] Apply patch #22 - Fix missing package before &body 2013-01-29: wsfulton [Java] Ensure 'javapackage' typemap is used as it stopped working from version 2.0.5. 2013-01-28: wsfulton [Python] Apply patch SF #334 - Fix default value conversions "TRUE"->True, "FALSE"->False. 2013-01-28: wsfulton [Java] Apply patch SF #335 - Truly ignore constructors in directors with %ignore. 2013-01-18: Brant Kyser [Java] Patch #15 - Allow the use of the nspace feature without the -package commandline option. This works as long and the new jniclasspackage pragma is used to place the JNI intermediate class into a package and the nspace feature is used to place all exposed types into a package. 2013-01-15: wsfulton Fix Visual Studio examples to work when SWIG is unzipped into a directory containing spaces. 2013-01-15: wsfulton [C#] Fix cstype typemap lookup for member variables so that a fully qualified variable name matches. For example: %typemap(cstype) bool MVar::mvar "MyBool" struct MVar { bool mvar; }; 2013-01-11: Brant Kyser [Java, C#, D] SF Bug #1299 - Fix generated names for when %nspace is used on classes with the same name in two different namespaces. 2013-01-11: Vladimir Kalinin [C#] Add support for csdirectorin 'pre', 'post' and 'terminator' attributes. 2013-01-08: olly [PHP] Fix to work with a ZTS build of PHP (broken in 2.0.7). 2013-01-07: olly Fix bashism in configure, introduced in 2.0.9. 2013-01-06: wsfulton Pull patch #4 from ptomulik to fix SF Bug #1296 - Fix incorrect warning for virtual destructors in templates, such as: Warning 521: Illegal destructor name B< A >::~B(). Ignored. 2013-01-05: wsfulton [Python] Pull patch #3 from ptomulik to fix SF Bug #1295 - standard exceptions as classes using the SWIG_STD_EXCEPTIONS_AS_CLASSES macro. 2013-01-04: wsfulton [Java] Pull patch #2 from BrantKyser to fix SF Bug #1283 - fix smart pointers in conjuction with directors. 2013-01-03: wsfulton [Java] Pull patch #1 from BrantKyser to fix SF Bug #1278 - fix directors and nspace feature when multilevel namespaces are used. Version 2.0.9 (16 December 2012) ================================ 2012-12-16: wsfulton Fix garbage line number / empty file name reporting for some missing '}' or ')' error messages. 2012-12-15: kkaempf [Ruby] Apply patch 3530444, Class#methods and Class#constants returns array of symbols in Ruby 1.9+ 2012-12-14: kkaempf [Ruby] Apply patch 3530439 and finally replace all occurrences of the STR2CSTR() macro with StringValuePtr(). STR2CSTR was deprecated since years and got removed in Ruby 1.9 2012-12-14: kkaempf [Ruby] Applied patches #3530442 and 3530443 to adapt compile and runtime include paths to match Ruby 1.9+ 2012-12-14: wsfulton [CFFI] Fix #3161614 - Some string constants are incorrect 2012-12-13: wsfulton [CFFI] Fix #3529690 - Fix incorrect constant names. 2012-12-12: drjoe [R] add fix to finalizer that was missed earlier 2012-12-11: wsfulton [Python] Apply patch #3590522 - fully qualified package paths for Python 3 even if a module is in the same package. 2012-12-08: wsfulton [Python] Bug #3563647 - PyInt_FromSize_t unavailable prior to Python 2.5 for unsigned int types. 2012-12-08: wsfulton [Perl] Fix bug #3571361 - C++ comment in C wrappers. 2012-12-07: wsfulton [C#] Apply patch #3571029 which adds missing director support for const unsigned long long &. 2012-11-28: kwwette [Octave] Simplified module loading: now just the syntax $ example; is accepted, which loads functions globally but constants and variables relative to the current scope. This make module loading behaviour reliably consistent, and reduces problems when loading modules which depend on other modules which may not have been previously loaded. 2012-11-27: wsfulton [cffi] Fix junk output when wrapping single character literal constants. 2012-11-17: wsfulton [Tcl, Modula3] Add missing support for -outdir. 2012-11-17: wsfulton Fix segfaults when using filename paths greater than 1024 characters in length. 2012-11-14: wsfulton [ccache-swig] Apply patch #3586392 from Frederik Deweerdt to fix some error cases - incorrectly using memory after it has been deleted. 2012-11-09: vzeitlin [Python] Fix overflow when passing values greater than LONG_MAX from Python 3 for parameters with unsigned long C type. 2012-11-09: wsfulton Fix some feature matching issues for implicit destructors and implicit constructors and implicit copy constructors added with %copyctor. Previously a feature for these had to be fully qualified in order to match. Now the following will also match: %feature("xyz") ~XXX(); struct XXX {}; 2012-11-09: wsfulton Further consistency in named output typemap lookups for implicit constructors and destructors and implicit copy constructors added with %copyctor. Previously only the fully qualified name was being used, now the unqualified name will also be used. For example, previously: example.i:38: Searching for a suitable 'out' typemap for: void Space::More::~More Looking for: void Space::More::~More Looking for: void Now the unqualified name is also used: example.i:38: Searching for a suitable 'out' typemap for: void Space::More::~More Looking for: void Space::More::~More Looking for: void ~More Looking for: void 2012-11-02: wsfulton Fix some subtle named output typemap lookup misses, the fully qualified name was not always being used for variables, for example: struct Glob { int MyVar; }; Previously the search rules (as shown by -debug-tmsearch) for the getter wrapper were: example.i:44: Searching for a suitable 'out' typemap for: int MyVar Looking for: int MyVar Looking for: int Now the scope is named correctly: example.i:44: Searching for a suitable 'out' typemap for: int Glob::MyVar Looking for: int Glob::MyVar Looking for: int MyVar Looking for: int 2012-10-26: wsfulton Fix director typemap searching so that a typemap specified with a name will be correctly matched. Previously the name was ignored during the typemap search. Applies to the following list of typemaps: directorout, csdirectorout, cstype, imtype, ctype, ddirectorout, dtype, gotype, jtype, jni, javadirectorout. 2012-10-11: wsfulton Most of the special variables available for use in %exception are now also available for expansion in %extend blocks. These are: $name $symname $overname $decl $fulldecl $parentclassname $parentclasssymname, see docs on "Class extension" in SWIGPlus.html. Patch based on submission from Kris Thielemans. 2012-10-10: wsfulton Additional new special variables in %exception are expanded as follows: $parentclassname - The parent class name (if any) for a method. $parentclasssymname - The target language parent class name (if any) for a method. 2012-10-08: iant [Go] Generating Go code now requires using the -intgosize option to indicate the size of the 'int' type in Go. This is because the size of the type is changing from Go 1.0 to Go 1.1 for x86_64. 2012-09-14: wsfulton Add new warning if the empty template instantiation is used as a base class, for example: template class Base {}; %template() Base; class Derived : public Base {}; gives the following warning instead of silently ignoring the base: cpp_inherit.i:52: Warning 401: Base class 'Base< int >' has no name as it is an empty template instantiated with '%template()'. Ignored. cpp_inherit.i:51: Warning 401: The %template directive must be written before 'Base< int >' is used as a base class and be declared with a name. 2012-09-11: wsfulton [Java] Fix #3535304 - Direct use of a weak global reference in directors sometimes causing seg faults especially on Android. 2012-09-06: wsfulton [Java] Fix (char *STRING, size_t LENGTH) typemaps to accept NULL string. 2012-08-26: drjoe [R] make ExternalReference slot ref to contain reference 2012-08-26: drjoe [R] fix Examples/Makefile to use C in $(CC) rather than $(CXX) Version 2.0.8 (20 August 2012) ============================== 2012-08-15: wsfulton [Perl] Add size_type, value_type, const_reference to the STL containers. 2012-08-15: wsfulton [Python] Add discard and add methods to std::set wrappers so that pyabc.i can be used ensuring MutableSet is a valid abstract base class for std::set. As reported by Alexey Sokolov. Similarly for std::multiset. 2012-08-15: wsfulton [Python] Fix #3541744 - Missing PyInt_FromSize_t calls for Python 3. 2012-08-13: wsfulton [Java] Patch from David Baum to add the assumeoverride feature for Java directors to improve performance when all overridden methods can be assumed to be overridden. 2012-08-05: wsfulton [Python] #3530021 Fix unused variable warning. 2012-08-05: wsfulton [C#] Fix #3536360 - Invalid code sometimes being generated for director methods with many arguments. 2012-08-05: wsfulton [Perl] #3545877 - Don't undefine bool if defined by C99 stdbool.h - problem using Perl 5.16 and later. 2012-08-04: wsfulton Remove incorrect warning (314) about target language keywords which were triggered by using declarations and using directives. For example 'string' is a keyword in C#: namespace std { class string; } using std::string; 2012-07-21: wsfulton Fix display of pointers in various places on 64 bit systems - only 32 bits were being shown. 2012-07-21: wsfulton Fix gdb debugger functions 'swigprint' and 'locswigprint' to display to the gdb output window rather than stdout. This fixes display problems in gdbtui and the ensures the output appears where expected in other gdb based debuggers such as Eclipse CDT. 2012-07-20: kwwette [Octave] segfault-on-exit prevention hack now preserves exit status, and uses C99 _Exit(). 2012-07-02: wsfulton Fix Debian bug http://bugs.debian.org/672035, typemap copy failure - regression introduced in swig-2.0.5: %include using std::pair; %template(StrPair) pair; 2012-07-02: wsfulton Fix using declarations combined with using directives with forward class declarations so that types are correctly found in scope for templates. Example: namespace Outer2 { namespace Space2 { template class Thing2; } } using namespace Outer2; using Space2::Thing2; template class Thing2 {}; // STILL BROKEN void useit2(Thing2 t) {} void useit2a(Outer2::Space2::Thing2 t) {} void useit2b(::Outer2::Space2::Thing2 t) {} void useit2c(Space2::Thing2 t) {} namespace Outer2 { void useit2d(Space2::Thing2 t) {} } %template(Thing2Int) Thing2; 2012-06-30: wsfulton Fix template namespace problems for symbols declared with a forward class declarations, such as: namespace Space1 { namespace Space2 { template struct YYY; } template struct Space2::YYY { T yyy(T h) { return h; } }; void testYYY1(Space1::Space2::YYY yy) {} void testYYY2(Space2::YYY yy) {} void testYYY3(::Space1::Space2::YYY yy) {} } %template(YYYInt) Space1::Space2::YYY; 2012-06-30: wsfulton Fix namespace problems for symbols declared with a forward class declarations, such as: namespace Space1 { namespace Space2 { struct XXX; struct YYY; } struct Space2::YYY {}; struct Space1::Space2::XXX {}; void testXXX2(Space2::XXX xx) {} void testYYY2(Space2::YYY yy) {} } where xx and yy were not recognised as the proxy classes XXX and YYY. 2012-06-30: wsfulton Fix using declarations combined with using directives with forward class declarations so that types are correctly found in scope. namespace Outer2 { namespace Space2 { class Thing2; } } using namespace Outer2; using Space2::Thing2; class Thing2 {}; // None of the methods below correctly used the Thing2 proxy class void useit2(Thing2 t) {} void useit2a(Outer2::Space2::Thing2 t) {} void useit2b(::Outer2::Space2::Thing2 t) {} void useit2c(Space2::Thing2 t) {} namespace Outer2 { void useit2d(Space2::Thing2 t) {} } 2012-06-25: wsfulton Fix using declarations combined with using directives so that types are correctly found in scope. Example: namespace Outer2 { namespace Space2 { class Thing2 {}; } } using namespace Outer2; // using directive using Space2::Thing2; // using declaration void useit2(Thing2 t) {} Similarly for templated classes. 2012-05-29: wsfulton Fix #3529601 - seg fault when a protected method has the "director" feature but the parent class does not. Also fix similar problems with the allprotected feature. 2012-05-28: wsfulton Fix seg fault when attempting to warn about an illegal destructor - #3530055, 3530078 and #3530118. Version 2.0.7 (26 May 2012) =========================== 2012-05-26: wsfulton std::string typemap modifications so they can be used with %apply for other string classes. 2012-05-25: wsfulton [Lua] Fixes for -external-runtime to work again. 2012-05-22: szager [python] Disambiguate SWIG_From_unsigned_SS_int and SWIG_From_unsigned_SS_long. 2012-05-18: olly [PHP] Fix getters for template members. (SF#3428833, SF#3528035) 2012-05-14: wsfulton Fix some language's std::map wrappers to recognise difference_type, size_type, key_type and mapped_type. 2012-05-14: kwwette (signed off by xavier98) [Octave] Prevent Octave from seg-faulting at exit when SWIG modules are loaded, due to bugs in Octave's cleanup code: * Wrapping functions now declared with Octave DEFUN_DLD macro, and loaded through Octave's dynamic module loader * Global variables of swigref type are now assigned a new() copy of the swigref class, to prevent double-free errors * SWIG module at-exit cleanup function now created in Octave through eval(), so not dependent on loaded .oct library * For Octave versions 3.1.* to 3.3.*, register C-level at-exit function which terminates Octave immediately (with correct status code) without performing memory cleanup. This function can be controlled with macros in Lib/octave/octruntime.swg [Octave] New syntax for determing whether SWIG module should be loaded globally or non-globally. To load module "example" globally, type the module name $ example; as before; to load module non-globally, assign it to a variable: $ example = example; or $ ex = example; for a shorter (local) module name. -global/-noglobal command-line options and module command line are deprecated. Added usage info to module, so typing $ help example or incorrect usage should display proper usage, with examples. *** POTENTIAL INCOMPATIBILITY *** 2012-05-12: olly [PHP] Fix memory leak in code generated for a callback. Patch from SF bug #3510806. 2012-05-12: olly [PHP] Avoid using zend_error_noreturn() as it doesn't work with all builds of PHP (SF bug #3166423). Instead we now wrap it in a SWIG_FAIL() function which we annotate as "noreturn" for GCC to avoids warnings. This also reduces the size of the compiled wrapper (e.g. the stripped size is reduced by 6% for Xapian's PHP bindings). 2012-05-11: wsfulton [Java] SF patch #3522855 Fix unintended uninitialised memory access in OUTPUT typemaps. 2012-05-11: wsfulton [Java] SF patch #3522674 Fix possible uninitialised memory access in char **STRING_OUT typemap. 2012-05-11: wsfulton [Java] SF patch #3522611 Fix uninitialised size regression in char **STRING_ARRAY introduced in swig-2.0.6. 2012-05-11: wsfulton SF bug #3525050 - Fix regression introduced in swig-2.0.5 whereby defining one typemap method such as an 'out' typemap may hide another typemap method such as an 'in' typemap - only occurs when the type is a template type where the template parameters are the same via a typedef. 2012-05-10: olly [PHP] Fix the constant typemaps for SWIGTYPE, etc - previously these used the wrong name for renamed constants. Add autodoc_runme.php to the testsuite as a regression test for this. 2012-05-02: ianlancetaylor [Go] Remove compatibility support for gccgo 4.6. Using SWIG with gccgo will now require gccgo 4.7. Using SWIG with the more commonly used gc compiler is unaffected. 2012-05-01: wsfulton Fix generated code for C forward enum declarations in some languages. Version 2.0.6 (30 April 2012) ============================= 2012-04-25: wsfulton [Lua] Fix uninitialised variable in SWIGTYPE **OUTPUT typemaps as reported by Jim Anderson. 2012-04-28: wsfulton [Python] Fix compilation errors when wrapping STL containers on Mac OS X and possibly other systems. 2012-04-28: wsfulton [Java] Patch 3521811 from Leo Davis - char **STRING_ARRAY typemaps fixed to handle null pointers. Version 2.0.5 (19 April 2012) ============================= 2012-04-14: wsfulton [Lua] Apply patch #3517435 from Miles Bader - prefer to use Lua_pushglobaltable 2012-04-14: wsfulton [Ruby] Apply patch #3517769 from Robin Stocker to fix compile error on MacRuby using RSTRING_PTR. 2012-04-13: wsfulton Apply patch #3511009 from Leif Middelschulte for slightly optimised char * variable wrappers. 2012-04-13: wsfulton [Lua] Apply #3219676 from Shane Liesegang which adds: - support for %factory - a __tostring method - a __disown method 2012-04-13: wsfulton [Xml] Apply #3513569 which adds a catchlist to the xml output. 2012-04-05: olly [Lua] Add support for Lua 5.2 (patch SF#3514593 from Miles Bader) 2012-03-26: xavier98 [octave] Apply patch #3425993 from jgillis: add extra logic to the octave_swig_type::dims(void) method: it checks if the user has defined a __dims__ method and uses this in stead of returning (1,1) [octave] Apply patch #3424833 from jgillis: make is_object return true for swig types 2012-03-24: wsfulton [D] Apply #3502431 to fix duplicate symbols in multiple modules. 2012-03-21: wsfulton Fix #3494791 - %$isglobal for %rename matching. 2012-03-20: wsfulton Fix #3487706 and #3391906 - missing stddef.h include for ptrdiff_t when using %import for STL containers and compiling with g++-4.6. An include of stddef.h is now only generated when SWIG generates STL helper templates which require ptrdiff_t. If you were previously relying on "#include " always being generated when using a %include of an STL header, you may now need to add this in manually. 2012-03-16: wsfulton Apply patch #3392264 from Sebastien Bine to parse (unsigned) long long types in enum value assignment. 2012-03-16: wsfulton Apply patch #3505530 from Karl Wette to allow custom allocators in STL string classes for the UTL languages. 2012-03-13: wsfulton Apply patch #3468362 from Karl Wette to fix %include inside %define. 2012-03-13: wsfulton [Python, Ruby, Octave, R] Fix #3475492 - iterating through std::vector wrappers of enumerations. 2012-02-27: xavier98 (patches from Karl Wette) [Octave] Use -globals . to load global variables in module namespace [Octave] Comment declaration of unimplemented function swig_register_director [Octave] Fix OCTAVE_PATH in octave Makefiles [Octave] Add support for std::list - fix li_std_containers_int test [Octave] Fix imports test 2012-02-16: wsfulton [Java] Make generated support functions in arrays_java.i static so that generated code from multiple instances of SWIG can be compiled and linked together - problem reported by Evan Krause. 2012-01-24: wsfulton Fix crash with bad regex - bug #3474250. 2012-01-24: wsfulton [Python] Add Python stepped slicing support to the STL wrappers (std::vector, std::list). Assigning to a slice, reading a slice and deleting a slice with steps now work. For example: %template(vector_i) std::vector vi = vector_i(range(10)) print list(vi) vi[1:4:2] = [111, 333] print list(vi) del vi[3:10:3] print list(vi) print list(vi[::-1]) gives (same behaviour as native Python sequences such as list): [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 111, 2, 333, 4, 5, 6, 7, 8, 9] [0, 111, 2, 4, 5, 7, 8] [8, 7, 5, 4, 2, 111, 0] 2012-01-23: klickverbot [D] Correctly annotate function pointers with C linkage. [D] Exception and Error have become blessed names; removed d_exception_name test case. 2012-01-20: wsfulton [Python] Fix some indexing bugs in Python STL wrappers when the index is negative, eg: %template(vector_i) std::vector iv=vector_i([0,1,2,3,4,5]) iv[-7:] now returns [0, 1, 2, 3, 4, 5] instead of [5]. vv[7:9] = [22,33] now returns [0, 1, 2, 3, 4, 5, 22, 33] instead of "index out range" error. Also fix some segfaults when replacing ranges, eg when il is a std::list wrapper: il[0:2] = [11] 2012-01-17: wsfulton [Go] Fix forward class declaration within a class when used as a base. 2012-01-07: wsfulton [C#] Add support for %nspace when using directors. 2012-01-06: wsfulton [Java] Patch #3452560 from Brant Kyser - add support for %nspace when using directors. 2011-12-21: wsfulton The 'directorin' typemap now accepts $1, $2 etc expansions instead of having to use workarounds - $1_name, $2_name etc. 2011-12-20: wsfulton [Java] Add (char *STRING, size_t LENGTH) director typemaps. 2011-12-20: wsfulton [C#, Go, Java, D] Add support for the 'directorargout' typemap. 2011-12-20: wsfulton [Ocaml, Octave, PHP, Python, Ruby] Correct special variables in 'directorargout' typemap. This change will break any 'directorargout' typemaps you may have written. Please change: $result to $1 $input to $result Also fix the named 'directorargout' DIRECTOROUT typemaps for these languages which didn't previously compile and add in $1, $2 etc expansion. *** POTENTIAL INCOMPATIBILITY *** 2011-12-10: talby [perl5] SWIG_error() now gets decorated with perl source file/line number. [perl5] error handling now conforms to public XS api (fixes perl v5.14 issue). 2011-12-10: wsfulton [Android/Java] Fix directors to compile on Android. Added documentation and examples for Android. 2011-12-08: vadz Bug fix: Handle methods renamed or ignored in the base class correctly in the derived classes (they could be sometimes mysteriously not renamed or ignored there before). 2011-12-03: klickverbot [D] Fix exception glue code for newer DMD 2 versions. [D] Do not default to 32 bit glue code for DMD anymore. [D] Use stdc.config.c_long/c_ulong to represent C long types. 2011-12-01: szager [python] Fixed bug 3447426: memory leak in vector.__getitem__. 2011-11-30: wsfulton [R] Remove C++ comments from generated C code. 2011-11-27: olly [Python] Fix some warnings when compiling generated wrappers with certain GCC warning options (Debian bug #650246). 2011-11-28: wsfulton Fix #3433541 %typemap(in, numinputs=0) with 10+ arguments. 2011-11-28: olly [Perl] Fix warnings when compiling generated wrappers with certain GCC warning options (Debian bug #436711). 2011-11-28: olly [PHP] Update keyword list to include keywords added in PHP releases up to 5.3. 2011-11-25: wsfulton [C#] Provide an easy way to override the default visibility for the proxy class pointer constructors and getCPtr() method. The visibility is 'internal' by default and if multiple SWIG modules are being used and compiled into different assemblies, then they need to be 'public' in order to use the constructor or getCPtr() method from a different assembly. Use the following macros to change the visibilities in the proxy and type wrapper class: SWIG_CSBODY_PROXY(public, public, SWIGTYPE) SWIG_CSBODY_TYPEWRAPPER(public, public, public, SWIGTYPE) [Java] Provide an easy way to override the default visibility for the proxy class pointer constructors and getCPtr() method. The visibility is 'protected' by default and if multiple SWIG modules are being used and compiled into different packages, then they need to be 'public' in order to use the constructor or getCPtr() method from a different package. Use the following macros to change the visibilities in the proxy and type wrapper class: SWIG_JAVABODY_PROXY(public, public, SWIGTYPE) SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE) The default for Java has changed from public to protected for the proxy classes. Use the SWIG_JAVABODY_PROXY macro above to restore to the previous visibilities. *** POTENTIAL INCOMPATIBILITY *** 2011-11-22: szager [python] Bug 3440044: #ifdef out SWIG_Python_NonDynamicSetAttr if -builtin isn't being used, to avoid unnecessary binary incompatibilities between python installations. 2011-11-17: wsfulton Bug fix: Remove root directory from directory search list in Windows. 2011-11-13: wsfulton [Ruby] Apply patch #3421876 from Robin Stocker to fix #3416818 - same class name in different namespaces confusion when using multiple modules. 2011-11-11: wsfulton Fix pcre-build.sh to work with non-compressed tarballs - problem reported by Adrian Blakely. 2011-11-03: wsfulton Expand special variables in typemap warnings, eg: %typemap(in, warning="1000:Test warning for 'in' typemap for $1_type $1_name") int "..." 2011-11-01: wsfulton Fix named output typemaps not being used when the symbol uses a qualifier and contains a number, eg: %typemap(out) double ABC::m1 "..." 2011-10-24: talby [perl5] SF bug #3423119 - overload dispatch stack corruption fix. Better, but more research is needed on a stable path for tail calls in XS. Also, fix for large long longs in 32 bit perl. 2011-10-13: xavier98 [octave] Allow Octave modules to be re-loaded after a "clear all". 2011-09-19: wsfulton Fix regression introduced in swig-2.0.1 reported by Teemu Ikonone leading to uncompilable code when using typedef and function pointer references, for example: typedef int FN(const int &a, int b); void *typedef_call1(FN *& precallback, FN * postcallback); 2011-09-14: wsfulton [Lua] Patch #3408012 from Raman Gopalan - add support for embedded Lua (eLua) including options for targeting Lua Tiny RAM (LTR). 2011-09-14: wsfulton [C#] Add boost_intrusive_ptr.i library contribution from patch #3401571. 2011-09-13: wsfulton Add warnings for badly named destructors, eg: struct KStruct { ~NOT_KStruct() {} }; cpp_extend_destructors.i:92: Warning 521: Illegal destructor name ~NOT_KStruct. Ignored. 2011-09-13: wsfulton Fix %extend and destructors for templates. The destructor in %extend was not always wrapped, for example: %extend FooT { ~FooT() { delete $self; } // was not wrapped as expected }; template class FooT {}; %template(FooTi) FooT; 2011-09-13: wsfulton Fix special variables such as "$decl" and "$fulldecl" in destructors to include the ~ character. 2011-09-10: talby [perl5] SF bug #1481958 - Improve range checking for integer types. Enhance li_typemaps_runme.pl 2011-09-08: wsfulton Fix %extend on typedef classes in a namespace using the typedef name, for example: namespace Space { %extend CStruct { ... } typedef struct tagCStruct { ... } CStruct; } 2011-08-31: xavier98 [octave] patches from Karl Wette: improvements to module loading behavior; added example of friend operator to operator example; fixed octave panic/crash in 3.0.5; documentation improvements 2011-08-30: szager [python] Bug 3400486, fix error signalling for built-in constructors. 2011-08-26: wsfulton [Go] Fix file/line number display for "gotype" when using typemap debugging options -tmsearch and -tmused. 2011-08-26: wsfulton [C#, D] Fix %callback which was generating uncompilable code. 2011-08-25: wsfulton Fix constructors in named typedef class declarations as reported by Gregory Bronner: typedef struct A { A(){} // Constructor which was not accepted by SWIG B(){} // NOT a constructor --illegal, but was accepted by SWIG } B; For C code, the fix now results in the use of 'struct A *' instead of just 'B *' in the generated code when wrapping members in A, but ultimately this does not matter, as they are the same thing. 2011-08-23: wsfulton Fix %newobject when used in conjunction with %feature("ref") as reported by Jan Becker. The code from the "ref" feature was not always being generated for the function specified by %newobject. Documentation for "ref" and "unref" moved from Python to the C++ chapter. 2011-08-22: szager [python] Fixed memory leak with --builtin option (bug 3385089). 2011-08-22: wsfulton [Lua] SF patch #3394339 from Torsten Landschoff - new option -nomoduleglobal to disable installing the module table into the global namespace. Require call also returns the module table instead of a string. 2011-08-09: xavier98 Fix bug 3387394; Octave patches for 3.4.0 compatibility, etc. (from Karl Wette) 2011-08-04: wsfulton Add in $symname expansion for director methods. 2011-07-29: olly [PHP] Don't generate "return $r;" in cases where $r hasn't been set. This was basically harmless, except it generated a PHP E_NOTICE if the calling code had enabled them. 2011-07-26: wsfulton Fix scoping of forward class declarations nested within a class (for C++). Previously the symbol was incorrectly put into the outer namespace, eg namespace std { template struct map { class iterator; }; } iterator was scoped as std::iterator, but now it is correctly std::map::iterator; Also fixed is %template and template parameters that are a typedef when the template contains default template parameters, eg: namespace Std { template struct Map { typedef Key key_type; typedef T mapped_type; }; } typedef double DOUBLE; %template(MM) Std::Map; All symbols within Map will be resolved correctly, eg key_type and mapped_type no matter if the wrapped code uses Std::Map or std::Map or Std::Map Also fixes bug #3378145 - regression introduced in 2.0.4 - %template using traits. 2011-07-20 szager [python] Fix closure for tp_call slot. 2011-07-16: wsfulton [python] Fix director typemap using PyObject *. 2011-07-13: szager [python] SF patch #3365908 - Add all template parameters to map support code in std_map.i 2011-07-13: szager [python] Fix for bug 3324753: %rename member variables with -builtin. 2011-07-01: wsfulton Fix some scope and symbol lookup problems when template default parameters are being used with typedef. For example: template struct Foo { typedef XX X; typedef TT T; }; template struct UsesFoo { void x(typename Foo::T, typename Foo::X); }; Also fixes use of std::vector::size_type for Python as reported by Aubrey Barnard. 2011-06-23: olly [PHP] Fix director code to work when PHP is built with ZTS enabled, which is the standard configuration on Microsoft Windows. 2011-06-21: mutandiz [allegrocl] - various small tweaks and bug fixes. - Avoid name conflicts between smart pointer wrappers and the wrappers for the actual class. - Fix default typemaps for C bindings, which were incorrectly attempting to call non-existent destructors on user-defined types. - New feature, feature:aclmixins, for adding superclass to the foreign class wrappers. - Improve longlong typemaps. 2011-06-19: wsfulton Fix incorrect typemaps being used for a symbol within a templated type, eg: A::value_type would incorrectly use a typemap for type A. 2011-06-18: olly [Tcl] Fix variable declarations in middle of blocks which isn't permitted in C90 (issue probably introduced in 2.0.3 by patch #3224663). Reported by Paul Obermeier in SF#3288586. 2011-06-17: wsfulton [Java] SF #3312505 - slightly easier to wrap char[] or char[ANY] with a Java byte[] using arrays_java.i. 2011-06-13: wsfulton [Ruby, Octave] SF #3310528 Autodoc fixes similar to those described below for Python. 2011-06-10: wsfulton [Python] Few subtle bugfixes in autodoc documentation generation, - Unnamed argument names fix for autodoc levels > 0. - Display of template types fixed for autodoc levels > 1. - Fix SF #3310528 - display of typedef structs for autodoc levels > 1. - Add missing type for self for autodoc levels 1 and 3. - autodoc levels 2 and 3 documented. - Minor tweaks to autodoc style to conform with PEP8. 2011-05-30: olly [PHP] Fix handling of directors when -prefix is used. 2011-05-24: olly [PHP] Fix handling of methods of classes with a virtual base class (SF#3124665). Version 2.0.4 (21 May 2011) =========================== 2011-05-19: wsfulton [Guile] Patch #3191625 fixing overloading of integer types. 2011-05-19: wsfulton [Perl] Patch #3260265 fixing overloading of non-primitive types and integers in Perl 5.12 and later. 2011-05-19: wsfulton [Ruby] Fix %import where one of the imported files %include one of the STL include files such as std_vector.i. 2011-05-17: wsfulton [Java] Apply #3289851 from Alan Harder to fix memory leak in directors when checking for pending exceptions. 2011-05-17: wsfulton [Tcl] Apply #3300072 from Christian Delbaere to fix multiple module loading not always sharing variables across modules. 2011-05-16: xavier98 [octave] Fix an incompatibility with never versions of Octave. Case on Octave API >= 40 to handle rename of Octave_map to octave_map. [octave] Add support for y.__rop__(x) operators when x.__op__(y) doesn't exist. [octave] Allow global operators to be defined by SWIG-wrapped functions. [octave] Fix several bugs around module namespaces; add -global, -noglobal, -globals command line options to the module. 2011-05-14: wsfulton %varargs when used with a numeric argument used to create an additional argument which was intended to provide a guaranteed sentinel value. This never worked and now the additional argument is not generated. 2011-05-13: wsfulton [python] Additional fixes for python3.2 support. 2011-05-07: szager [python] Fixed PyGetSetDescr for python3.2. 2011-05-05: wsfulton [Lua, Python, Tcl] C/C++ prototypes shown in error message when calling an overloaded method with incorrect arguments improved to show always show fully qualified name and if a const method. Also fixed other Lua error messages in generated code which weren't consistently using the fully qualified C++ name - requested by Gedalia Pasternak. 2011-04-29: szager Bug 2635919: Convenience method to convert std::map to a python dict. 2011-04-29: szager [Python] Fixed bug 2811549: return non-const iterators from STL methods begin(), end(), rbegin(), rend(). 2011-04-25: szager [Python] Fixed bug 1498929: Access to member fields in map elements 2011-04-23: klickverbot [D] nspace: Correctly generate identifiers for base classes when not in split proxy mode. 2011-04-13: szager Fixed bug 3286333: infinite recursion with mutual 'using namespace' clauses. 2011-04-12: szager Fixed bug 1163440: vararg typemaps. 2011-04-12: szager Fixed bug #3285386: parse error from 'operator T*&()'. Added operator_pointer_ref test case to demonstrate. 2011-04-11: szager [Python] Fixed PyVarObject_HEAD_INIT to eliminate VC++ compiler errors about static initialization of struct members with pointers. 2011-04-11: wsfulton [Tcl] Apply patch #3284326 from Colin McDonald to fix some compiler warnings. 2011-04-11: szager [Python] Fixed PyVarObject_HEAD_INIT to eliminate VC++ compiler errors about static initialization of struct members with pointers. 2011-04-10: klickverbot [D] Fixed wrapping of enums that are type char, for example: enum { X = 'X'; } (this was already in 2.0.3 for C# and Java) 2011-04-10: klickverbot [D] nspace: Fixed referencing types in the root namespace when not in split proxy mode. 2011-04-09: szager [Python] Applied patch #1932484: migrate PyCObject to PyCapsule. 2011-04-09: szager [Python] Added preprocessor guards for python functions PyUnicode_AsWideChar and PySlice_GetIndices, which changed signatures in python3.2. 2011-04-07: wsfulton Fix wrapping of const array typedefs which were generating uncompilable code as reported by Karl Wette. 2011-04-03: szager [Python] Fixed the behavior of %pythonnondynamic to conform to the spec in Lib/pyuserdir.swg. 2011-04-03: szager [Python] Merged in the szager-python-builtin branch, adding the -builtin feature for python. The -builtin option may provide a significant performance gain in python wrappers. For full details and limitations, refer to Doc/Manual/Python.html. A small test suite designed to demonstrate the performance gain is in Examples/python/performance. 2011-04-01: wsfulton Add in missing wrappers for friend functions for some target languages, mostly the non-scripting languages like Java and C#. Version 2.0.3 (29 March 2011) ============================= 2011-03-29: wsfulton [R] Apply patch #3239076 from Marie White fixing strings for R >= 2.7.0 2011-03-29: wsfulton [Tcl] Apply patch #3248280 from Christian Delbaere which adds better error messages when the incorrect number or type of arguments are passed to overloaded methods. 2011-03-29: wsfulton [Tcl] Apply patch #3224663 from Christian Delbaere. 1. Fix when function returns a NULL value, a "NULL" command will be created in the Tcl interpreter and calling this command will cause a segmentation fault. 2. Previous implementation searches for class methods using a linear search causing performance issues in wrappers for classes with many member functions. The patch adds a method hash table to classes and changes method name lookup to use the hash table instead of doing a linear search. 2011-03-26: wsfulton [C#, Java] SF bug #3195112 - fix wrapping of enums that are type char, for example: enum { X = 'X'; } 2011-03-21: vadz Allow setting PCRE_CFLAGS and PCRE_LIBS during configuration to override the values returned by pcre-config, e.g. to allow using a static version of PCRE library. 2011-03-17: wsfulton [UTL] Add missing headers in generated STL wrappers to fix compilation with gcc-4.6. 2011-03-17: wsfulton Fix regression introduced in swig-2.0.2 where filenames with spaces were not found when used with %include and %import. Reported by Shane Liesegang. 2011-03-15: wsfulton [UTL] Fix overloading when using const char[], problem reported by David Maxwell. Similarly for char[ANY] and const char[ANY]. 2011-03-15: wsfulton [C#] Apply patch #3212624 fixing std::map Keys property. 2011-03-14: olly [PHP] Fix handling of overloaded methods/functions where some return void and others don't - whether this worked or not depended on the order they were encountered in (SF#3208299). 2011-03-13: klickverbot [D] Extended support for C++ namespaces (nspace feature). 2011-03-12: olly [PHP] Fix sharing of type information between multiple SWIG-wrapped modules (SF#3202463). 2011-03-09: wsfulton [Python] Fix SF #3194294 - corner case bug when 'NULL' is used as the default value for a primitive type parameter in a method declaration. 2011-03-07: olly [PHP] Don't use zend_error_noreturn() for cases where the function returns void - now this issue can only matter if you have a function or method which is directed and returns non-void. 2011-03-06: olly [PHP] Add casts to the typemaps for long long and unsigned long long to avoid issues when they are used with shorter types via %apply. 2011-03-02: wsfulton Templated smart pointers overloaded with both const and non const operator-> generated uncompilable code when the pointee was a class with either public member variables or static methods. Regression in 2.0.x reported as working in 1.3.40 by xantares on swig-user mailing list. Version 2.0.2 (20 February 2011) ================================ 2011-02-19: wsfulton [PHP] Add missing INPUT, OUTPUT and INOUT typemaps in the typemaps.i library for primitive reference types as well as signed char * and bool *. 2011-02-19: olly [PHP] Address bug in PHP on some platforms/architectures which results in zend_error_noreturn() not being available using SWIG_ZEND_ERROR_NORETURN which defaults to zend_error_noreturn but can be overridden when building the module by passing -DSWIG_ZEND_ERROR_NORETURN=zend_error to the compiler. This may result in compiler warnings, but should at least allow a module to be built on those platforms/architectures (SF#3166423). 2011-02-18: wsfulton Fix #3184549 - vararg functions and function overloading when using the -fastdispatch option. 2011-02-18: olly [PHP] An overloaded method which can return an object or a primitive type no longer causes SWIG to segfault. Reported by Paul Colby in SF#3168531. 2011-02-18: olly [PHP] Fix invalid erase during iteration of std::map in generated director code. Reported by Cory Bennett in SF#3175820. 2011-02-17: wsfulton Preprocessing now warns if extra tokens appear after #else and #end. 2011-02-16: wsfulton Fix #1653092 Preprocessor does not error out when #elif is missing an expression. This and other cases of missing preprocessor expressions now result in an error. 2011-02-14: wsfulton [Ocaml] Apply patch #3151788 from Joel Reymont. Brings Ocaml support up to date (ver 3.11 and 3.12), including std::string. 2011-02-13: wsfulton [Ruby] Apply patch #3176274 from James Masters - typecheck typemap for time_t. 2011-02-13: wsfulton Apply patch #3171793 from szager - protected director methods failing when -fvirtual is used. 2011-02-13: wsfulton Fix #1927852 - #include directives don't preprocess the file passed to it. The fix is for #include with -importall or -includeall, %include and %import, for example: #define FILENAME "abc.h" %include FILENAME 2011-02-12: wsfulton Fix #1940536, overactive preprocessor which was expanding defined(...) outside of #if and #elif preprocessor directives. 2011-02-05: wsfulton [MzScheme] SF #2942899 Add user supplied documentation to help getting started with MzScheme. Update chapter name to MzScheme/Racket accounting for the rename of MzScheme to Racket. 2011-02-05: wsfulton [C#] SF #3085906 - Possible fix running test-suite on Mac OS X. 2011-02-05: wsfulton SF #3173367 Better information during configure about Boost prerequisite for running the test-suite. 2011-02-05: wsfulton SF #3127633 Fix infinite loop in recursive typedef resolution. 2011-02-04: wsfulton [R] SF #3168676 Fix %rename not working for member variables and methods. 2011-02-04: wsfulton [clisp] SF #3148200 Fix segfault parsing nested unions. 2011-02-01: wsfulton [C#] Directors - a call to a method being defined in the base class, not overridden in a subclass, but again overridden in a class derived from the first subclass was not being dispatched correctly to the most derived class. See director_alternating.i for an example. 2011-02-01: wsfulton [C#, Java] Any 'using' statements in the protected section of a class were previously ignored with director protected (dirprot) mode. 2011-01-30: wsfulton Fix overloading with const pointer reference (SWIGTYPE *const&) parameters for a number of scripting languages. 2011-01-17: wsfulton New warning for smart pointers if only some of the classes in the inheritance chain are marked as smart pointer, eg, %shared_ptr should be used for all classes in an inheritance hierarchy, so this new warning highlights code where this is not the case. example.i:12: Warning 520: Base class 'A' of 'B' is not similarly marked as a smart pointer. example.i:16: Warning 520: Derived class 'C' of 'B' is not similarly marked as a smart pointer. 2011-01-14: wsfulton Added some missing multi-argument typemaps: (char *STRING, size_t LENGTH) and (char *STRING, int LENGTH). Documentation for this updated. Java patch from Volker Grabsch. 2011-01-11: iant Require Go version 7077 or later. 2010-12-30: klickverbot [C#, D, Java] Check for collision of parameter names with target language keywords when generating the director glue code. The situation in which the generated could would previously be invalid is illustrated in the new 'director_keywords' test case. 2010-12-23: wsfulton [C#] Fix $csinput special variable not being expanded for csvarin typemaps when used for global variables. Reported by Vadim Zeitlin. 2010-12-14: wsfulton Fix $basemangle expansion in array typemaps. For example if type is int *[3], $basemangle expands to _p_int. 2010-12-07: iant Check that we are using a sufficiently new version of the 6g or 8g Go compiler during configure time. If not, disable Go. Minimum version is now 6707. *** POTENTIAL INCOMPATIBILITY *** 2010-12-06: wsfulton Fix #3127394 - use of network paths on Windows/MSys. 2010-11-18: klickverbot [D] Added the D language module. 2010-11-12: vadz Fix handling of multiple regex-using %renames attached to the same declaration. For example, now %rename("%(regex:/^Set(.*)/put\\1/)s") ""; %rename("%(regex:/^Get(.*)/get\\1/)s") ""; works as expected whereas before only the last anonymous rename was taken into account. 2010-10-17: drjoe [R] Fix failure in overloaded functions which was breaking QuantLib-SWIG 2010-10-14: olly [PHP] Allow compilation on non-conforming Microsoft C++ compilers which don't accept: return function_returning_void(); Reported by Frank Vanden Berghen on the SWIG mailing list. 2010-10-12: wsfulton Fix unary scope operator (::) (global scope) regression introduced in 2.0.0, reported by Ben Walker. The mangled symbol names were incorrect, sometimes resulting in types being incorrectly treated as opaque types. Also fixes #2958781 and some other type problems due to better typedef resolution, eg std::vector::value_type didn't resolve to T * when it should have. The mangled type was incorrectly SWIGTYPE_std__vectorT_Test_p_std__allocatorT_Test_p_t_t__value_type and now it is correctly SWIGTYPE_p_Test. Version 2.0.1 (4 October 2010) ============================== 2010-10-03: wsfulton Apply patch #3066958 from Mikael Johansson to fix default smart pointer handling when the smart pointer contains both a const and non-const operator->. 2010-10-01: wsfulton Add -pcreversion option to display PCRE version information. 2010-10-01: olly [Ruby] Avoid segfault when a method node has no parentNode (SF#3034054). 2010-10-01: olly [Python] Allow reinitialisation to work with an embedded Python interpreter (patch from Jim Carroll in SF#3075178). 2010-09-28: wsfulton [C#] Apply patch from Tomas Dirvanauskas for std::map wrappers to avoid throwing exceptions with normal usage of iterators. 2010-09-27: olly [Python] Improve error message given when a parameter of the wrong type is passed to an overloaded method (SF#3027355). 2010-09-25: wsfulton Apply SF patch #3075150 - Java directors using static variables in named namespace. 2010-09-24: wsfulton More file and line error/warning reporting fixes where SWIG macros are used within {} braces (where the preprocessor expands macros), for example macros within %inline {...} and %fragment(...) {...} and nested structs. 2010-09-18: wsfulton More file and line error/warning reporting fixes for various inherited class problems. 2010-09-15: wsfulton A much improved debugging of SWIG source experience is now available and documented in the "Debugging SWIG" section in the Doc/Devel/internals.html file, including a swig.dbg support file for the gdb debugger. 2010-09-11: wsfulton Fix incorrect line number reporting in errors/warnings when a macro definition ends with '/' and it is not the end of a C comment. 2010-09-11: wsfulton Fix incorrect line number reporting in errors/warnings after parsing macro invocations with parameters given over more than one line. 2010-09-10: wsfulton Remove extraneous extra line in preprocessed output after including files which would sometimes lead to error/warning messages two lines after the end of the file. 2010-09-10: wsfulton Fix #2149523 - Incorrect line number reporting in errors after parsing macros containing C++ comments. 2010-09-08: olly [PHP] Fix handling of OUTPUT typemaps (Patch from Ryan in SF#3058394). 2010-09-03: wsfulton Fix erroneous line numbers in error messages for macro expansions, for example, the error message now points to instantiation of the macro, ie the last line here: #define MACRO2(a, b) #define MACRO1(NAME) MACRO2(NAME,2,3) MACRO1(abc) 2010-09-02: wsfulton Fix line numbers in error and warning messages for preprocessor messages within %inline, for example: %inline %{ #define FOOBAR 1 #define FOOBAR "hi" %} 2010-09-02: wsfulton Fix line numbers in error and warning messages which were cumulatively one less than they should have been after parsing each %include/%import - bug introduced in swig-1.3.32. Also fix line numbers in error and warning messages when new line characters appear between the %include / %import statement and the filename. 2010-08-30: wsfulton Fix line number and file name reporting for some macro preprocessor warnings. The line number of the macro argument has been corrected and the line number of the start of the macro instead of one past the end of the macro is used. Some examples: file.h:11: Error: Illegal macro argument name '..' file.h:19: Error: Macro 'DUPLICATE' redefined, file.h:15: Error: previous definition of 'DUPLICATE'. file.h:25: Error: Variable-length macro argument must be last parameter file.h:32: Error: Illegal character in macro argument name file.i:37: Error: Macro 'SIT' expects 2 arguments 2010-08-26: wsfulton Fix __LINE__ and __FILE__ expansion reported by Camille Gillot. Mostly this did not work at all. Also fixes SF #2822822. 2010-08-17: wsfulton [Perl] Fix corner case marshalling of doubles - errno was not being correctly set before calling strtod - patch from Justin Vallon - SF Bug #3038936. 2010-08-17: wsfulton Fix make distclean when some of the more obscure languages are detected by configure - fixes from Torsten Landschoff. 2010-07-28: wsfulton Restore configuring out of source for the test-suite since it broke in 1.3.37. As previously, if running 'make check-test-suite' out of source, it needs to be done by invoking configure with a relative path. Invoking configure with an absolute path will not work. Running the full 'make check' still needs to be done in the source tree. 2010-07-16: wsfulton Fix wrapping of function pointers and member function pointers when the function returns by reference. 2010-07-13: vadz Removed support for the old experimental "rxspencer" encoder and "[not]rxsmatch" in %rename (see the 01/16/2006 entry). The new and officially supported "regex" encoder and "[not]regexmatch" checks should be used instead (see the two previous entries). Please replace "%(rxspencer:[pat][subst])s" with "%(regex:/pat/subst/)s" when upgrading. Notice that you will also need to replace the back- references of form "@1" with the more standard "\\1" and may need to adjust your regular expressions syntax as the new regex encoder uses Perl-compatible syntax and not (extended) POSIX syntax as the old one. *** POTENTIAL INCOMPATIBILITY *** 2010-07-13: vadz Add "regexmatch", "regextarget" and "notregexmatch" which can be used to apply %rename directives to the declarations matching the specified regular expression only. The first two can be used interchangeably, both of the %renames below do the same thing: %rename("$ignore", regexmatch$name="Old$") ""; %rename("$ignore", regextarget=1) "Old$"; (namely ignore the declarations having "Old" suffix). "notregexmatch" restricts the match to only the declarations which do not match the regular expression, e.g. here is how to rename to lower case versions all declarations except those consisting from capital letters only: %rename("$(lowercase)s", notregexmatch$name="^[A-Z]+$") ""; 2010-07-13: vadz Add the new "regex" encoder that can be used in %rename, e.g. %rename("regex:/(\\w+)_(.*)/\\2/") ""; to remove any alphabetical prefix from all identifiers. The syntax of the regular expressions is Perl-like and PCRE library (http://www.pcre.org/) is used to implement this feature but notice that backslashes need to be escaped as usual inside C strings. Original patch from Torsten Landschoff. 2010-07-08: wsfulton Fix #3024875 - shared_ptr of classes with non-public destructors. This also fixes the "unref" feature when used on classes with non-public destructors. 2010-06-17: ianlancetaylor [Go] Add the Go language module. 2010-06-10: wsfulton [Lua] Fix SWIG_lua_isnilstring multiply defined when using multiple modules and wrapping strings. Patch from 'Number Cruncher'. 2010-06-10: olly [PHP] Fix directors to correctly call a method with has a different name in PHP to C++ (we were always using the C++ name in this case). 2010-06-03: wsfulton Fix uncompilable code when %rename results in two enum items with the same name. Reported by Vadim Zeitlin. Version 2.0.0 (2 June 2010) =========================== 2010-06-02: wsfulton [C#] Fix SWIG_STD_VECTOR_ENHANCED macro used in std::vector to work with types containing commas, for example: SWIG_STD_VECTOR_ENHANCED(std::pair< double, std::string >) 2010-06-01: wsfulton Add in std_shared_ptr.i for wrapping std::shared_ptr. Requires the %shared_ptr macro like in the boost_shared_ptr.i library. std::tr1::shared_ptr can also be wrapped if the following macro is defined: #define SWIG_SHARED_PTR_SUBNAMESPACE tr1 %include shared_ptr is also documented in Library.html now. 2010-05-27: wsfulton Add the ability for $typemap special variable macros to call other $typemap special variable macros, for example: %typemap(cstype) CC "CC" %typemap(cstype) BB "$typemap(cstype, CC)" %typemap(cstype) AA "$typemap(cstype, BB)" void hah(AA aa); This also fixes C# std::vector containers of shared_ptr and %shared_ptr. Also added diagnostics for $typemap with -debug-tmsearch, for example, the above displays additional diagnostic lines starting "Containing: ": example.i:34: Searching for a suitable 'cstype' typemap for: AA aa Looking for: AA aa Looking for: AA Using: %typemap(cstype) AA Containing: $typemap(cstype, BB) example.i:31: Searching for a suitable 'cstype' typemap for: BB Looking for: BB Using: %typemap(cstype) BB Containing: $typemap(cstype, CC) example.i:29: Searching for a suitable 'cstype' typemap for: CC Looking for: CC Using: %typemap(cstype) CC 2010-05-26: olly Fix %attribute2ref not to produce a syntax error if the last argument (AccessorMethod) is omitted. Patch from David Piepgras in SF#2235756. 2010-05-26: olly [PHP] When using %throws or %catches, SWIG-generated PHP5 wrappers now throw PHP Exception objects instead of giving a PHP error of type E_ERROR. This change shouldn't cause incompatibility issues, since you can't set an error handler for E_ERROR, so previously PHP would just exit which also happens for unhandled exceptions. The benefit is you can now catch them if you want to. Fixes SF#2545578 and SF#2955522. 2010-05-25: olly [PHP] Add missing directorin typemap for const std::string &. Fixes SF#3006404 reported by t-Legiaw. 2010-05-23: wsfulton [C#] Fix #2957375 - SWIGStringHelper and SWIGExceptionHelper not always being initialized before use in .NET 4 as the classes were not marked beforefieldinit. A static constructor has been added to the intermediary class like this: %pragma(csharp) imclasscode=%{ static $imclassname() { } %} If you had added your own custom static constructor to the intermediary class in the same way as above, you will have to modify your approach to use static variable initialization or define SWIG_CSHARP_NO_IMCLASS_STATIC_CONSTRUCTOR - See csharphead.swg. *** POTENTIAL INCOMPATIBILITY *** 2010-05-23: wsfulton Fix #2408232. Improve shared_ptr and intrusive_ptr wrappers for classes in an inheritance hierarchy. No special treatment is needed for derived classes. The proxy class also no longer needs to be specified, it is automatically deduced. The following macros are deprecated: SWIG_SHARED_PTR(PROXYCLASS, TYPE) SWIG_SHARED_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) and have been replaced by %shared_ptr(TYPE) Similarly for intrusive_ptr wrappers, the following macro is deprecated: SWIG_INTRUSIVE_PTR(PROXYCLASS, TYPE) SWIG_INTRUSIVE_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) and have been replaced by %intrusive_ptr(TYPE) 2010-05-21: olly [PHP] Stop generating a bogus line of code in certain constructors. This was mostly harmless, but caused a PHP notice to be issued, if enabled (SF#2985684). 2010-05-18: wsfulton [Java] Fix member pointers on 64 bit platforms. 2010-05-14: wsfulton Fix wrapping of C++ enum boolean values reported by Torsten Landschoff: typedef enum { PLAY = true, STOP = false } play_state; 2010-05-14: olly [PHP] Fix wrapping of global variables which was producing uncompilable code in some cases. 2010-05-12: drjoe [R] Add two more changes from Wil Nolan. Get garbage collection to work. Implement newfree 2010-05-09: drjoe Fix bug reported by Wil Nolan change creation of string so that R 2.7.0+ can use char hashes 2010-05-07: wsfulton Apply patch #2955146 from Sergey Satskiy to fix expressions containing divide by operator in constructor initialization lists. 2010-05-05: wsfulton [R] Memory leak fix handling const std::string & inputs, reported by Will Nolan. 2010-05-01: wsfulton Typemap matching enhancement for non-default typemaps. Previously all qualifiers were stripped in one step, now they are stripped one at a time starting with the left most qualifier. For example, int const*const is first stripped to int *const then int *. *** POTENTIAL INCOMPATIBILITY *** 2010-04-25: bhy [Python] Fix #2985655 - broken constructor renaming. 2010-04-14: wsfulton Typemap fragments are now official and documented in Typemaps.html. 2010-04-09: wsfulton [Ruby] Fix #2048064 and #2408020. Apply Ubuntu patch to fix Ruby and std::vector wrappers with -minherit. https://bugs.launchpad.net/ubuntu/+source/swig1.3/+bug/522874 2010-04-09: wsfulton [Mzscheme] Apply Ubuntu patch to fix std::map wrappers: https://bugs.launchpad.net/ubuntu/+source/swig1.3/+bug/203876 2010-04-09: wsfulton [Python] Apply patch #2952374 - fix directors and the -nortti option. 2010-04-09: wsfulton [Lua] Fix #2887254 and #2946032 - SWIG_Lua_typename using wrong stack index. 2010-04-03: wsfulton [Python] Fix exceptions being thrown with the -threads option based on patch from Arto Vuori. Fixes bug #2818499. 2010-04-03: wsfulton Fix Makefile targets: distclean and maintainer-clean 2010-04-02: wsfulton [Lua] Fix char pointers, wchar_t pointers and char arrays so that nil can be passed as a valid value. Bug reported by Gedalia Pasternak. 2010-04-01: wsfulton Numerous subtle typemap matching rule fixes when using the default type. The typemap matching rules are to take a type and find the best default typemap (SWIGTYPE, SWIGTYPE* etc), then look for the next best match by reducing the chosen default type. The type deduction now follows C++ class template partial specialization matching rules. Below are the set of changes made showing the default type deduction along with the old reduced type and the new version of the reduced type: SWIGTYPE const &[ANY] new: SWIGTYPE const &[] old: SWIGTYPE (&)[ANY] SWIGTYPE *const [ANY] new: SWIGTYPE const [ANY] old: SWIGTYPE *[ANY] SWIGTYPE const *const [ANY] new: SWIGTYPE *const [ANY] old: SWIGTYPE const *[ANY] SWIGTYPE const *const & new: SWIGTYPE *const & old: SWIGTYPE const *& SWIGTYPE *const * new: SWIGTYPE const * old: SWIGTYPE ** SWIGTYPE *const & new: SWIGTYPE const & old: SWIGTYPE *& Additionally, a const SWIGTYPE lookup is used now for any constant type. Some examples, where T is some reduced type, eg int, struct Foo: T const new: SWIGTYPE const old: SWIGTYPE T *const new: SWIGTYPE *const old: SWIGTYPE * T const[] new: SWIGTYPE const[] old: SWIGTYPE[] enum T const new: enum SWIGTYPE const old: enum SWIGTYPE T (*const )[] new: SWIGTYPE (*const )[] old: SWIGTYPE (*)[] Reminder: the typemap matching rules can now be seen for any types being wrapped by using either the -debug-tmsearch or -debug-tmused options. In practice this leads to some subtle matching rule changes and the majority of users won't notice any changes, except in the prime area of motivation for this change: Improve STL containers of const pointers and passing const pointers by reference. This is fixed because many of the STL containers use a type 'T const&' as parameters and when T is a const pointer, for example, 'K const*', then the full type is 'K const*const&'. This means that the 'SWIGTYPE *const&' typemaps now match when T is either a non-const or const pointer. Furthermore, some target languages incorrectly had 'SWIGTYPE *&' typemaps when these should have been 'SWIGTYPE *const&'. These have been corrected (Java, C#, Lua, PHP). *** POTENTIAL INCOMPATIBILITY *** 2010-03-13: wsfulton [Java] Some very old deprecated pragma warnings are now errors. 2010-03-13: wsfulton Improve handling of file names and directories containing double/multiple path separators. 2010-03-10: mutandiz (Mikel Bancroft) [allegrocl] Use fully qualified symbol name of cl::identity in emit_defun(). 2010-03-06: wsfulton [Java] The intermediary JNI class modifiers are now public by default meaning these intermediary low level functions are now accessible by default from outside any package used. The proxy class pointer constructor and getCPtr() methods are also now public. These are needed in order for the nspace option to work without any other mods. The previous default of protected access can be restored using: SWIG_JAVABODY_METHODS(protected, protected, SWIGTYPE) %pragma(java) jniclassclassmodifiers = "class" 2010-03-06: wsfulton [C#] Added the nspace feature for C#. Documentation for the nspace feature is now available. 2010-03-04: wsfulton Added the nspace feature. This adds some improved namespace support. Currently only Java is supported for target languages, where C++ namespaces are automatically translated into Java packages. The feature only applies to classes,struct,unions and enums declared within a namespace. Methods and variables declared in namespaces still effectively have their namespaces flattened. Example usage: %feature(nspace) Outer::Inner1::Color; %feature(nspace) Outer::Inner2::Color; namespace Outer { namespace Inner1 { struct Color { ... }; } namespace Inner2 { struct Color { ... }; } } For Java, the -package option is also required when using the nspace feature. Say we use -package com.myco, the two classes can then be accessed as follows from Java: com.myco.Outer.Inner1.Color and com.myco.Outer.Inner2.Color. 2010-02-27: wsfulton [Python] Remove -dirvtable from the optimizations included by -O as it this option currently leads to memory leaks as reported by Johan Blake. 2010-02-27: wsfulton License code changes: SWIG Source is GPL-v3 and library code license is now clearer and is provided under a very permissive license. See http://www.swig.org/legal.html. 2010-02-13: wsfulton [Ruby] A few fixes for compiling under ruby-1.9.x including patch from 'Nibble'. 2010-02-13: wsfulton [Ruby] Apply patch from Patrick Bennett to fix RARRAY_LEN and RARRAY_PTR usage for Ruby 1.9.x used in various STL wrappers. 2010-02-13: wsfulton [C#, Java] Fix incorrect multiply defined symbol name error when an enum item and class name have the same name, as reported by Nathan Krieger. Example: class Vector {}; namespace Text { enum Preference { Vector }; } This also fixes other incorrect corner case target language symbol name clashes. 2010-02-11: wsfulton Add the -debug-lsymbols option for displaying the target language layer symbols. 2010-02-09: wsfulton Fix -MM and -MMD options on Windows. They were not omitting files in the SWIG library as they should be. 2010-02-08: wsfulton Fix #1807329 - When Makefile dependencies are being generated using the -M family of options on Windows, the file paths have been corrected to use single backslashes rather than double backslashes as path separators. 2010-02-06: wsfulton Fix #2918902 - language specific files not being generated in correct directory on Windows when using forward slashes for -o, for example: swig -python -c++ -o subdirectory/theinterface_wrap.cpp subdirectory/theinterface.i 2010-02-05: wsfulton Fix #2894405 - assertion when using -xmlout. 2010-01-28: wsfulton Fix typemap matching bug when a templated type has a typemap both specialized and not specialized. For example: template struct XX { ... }; %typemap(in) const XX & "..." %typemap(in) const XX< int > & "..." resulted in the 2nd typemap being applied for all T in XX< T >. 2010-01-22: wsfulton Fix #2933129 - typemaps not being found when the unary scope operator (::) is used to denote global scope, the typemap is now used in situations like this: struct X {}; %typemap(in) const X & "..." void m(const ::X &); and this: struct X {}; %typemap(in) const ::X & "..." void m(const X &); 2010-01-20: wsfulton Fix some unary scope operator (::) denoting global scope problems in the types generated into the C++ layer. Previously the unary scope operator was dropped in the generated code if the type had any sort of qualifier, for example when using pointers, references, like ::foo*, ::foo&, bar< ::foo* >. 2010-01-13: olly [PHP] Add datetime to the list of PHP predefined classes (patch from David Fletcher in SF#2931042). 2010-01-11: wsfulton Slight change to warning, error and diagnostic reporting. The warning number is no longer shown within brackets. This is to help default parsing of warning messages by other tools, vim on Unix in particular. Example original display using -Fstandard: example.i:20: Warning(401): Nothing known about base class 'B'. Ignored. New display: example.i:20: Warning 401: Nothing known about base class 'B'. Ignored. Also subtle fix to -Fmicrosoft format adding in missing space. Example original display: example.i(20): Warning(401): Nothing known about base class 'Base'. Ignored. New display: example.i(20) : Warning 401: Nothing known about base class 'Base'. Ignored. 2010-01-10: wsfulton Fix a few inconsistencies in reporting of file/line numberings including modifying the overload warnings 509, 512, 516, 474, 475 to now be two line warnings. 2010-01-10: wsfulton Modify -debug-tags output to use standard file name/line reporting so that editors can easily navigate to the appropriate lines. Was typically: . top . include . include (/usr/share/swig/temp/trunk/Lib/swig.swg:312) . top . include . include . include (/usr/share/swig/temp/trunk/Lib/swigwarnings.swg:39) now: /usr/share/swig/temp/trunk/Lib/swig.swg:312: . top . include . include /usr/share/swig/temp/trunk/Lib/swigwarnings.swg:39: . top . include . include . include 2010-01-03: wsfulton Fix missing file/line numbers for typemap warnings and in output from the -debug-tmsearch/-debug-tmused options. 2010-01-03: wsfulton Add typemaps used debugging option (-debug-tmused). When used each line displays the typemap used for each type for which code is being generated including the file and line number related to the type. This is effectively a condensed form of the -debug-tmsearch option. Documented in Typemaps.html. 2009-12-23: wsfulton Fix for %javaexception and directors so that all the appropriate throws clauses are generated. Problem reported by Peter Greenwood. 2009-12-20: wsfulton Add -debug-tmsearch option for debugging the typemap pattern matching rules. Documented in Typemaps.html. 2009-12-12: wsfulton [Octave] Remove the -api option and use the new OCTAVE_API_VERSION_NUMBER macro provided in the octave headers for determining the api version instead. 2009-12-04: olly [Ruby] Improve support for Ruby 1.9 under GCC. Addresses part of SF#2859614. 2009-12-04: olly Fix handling of modulo operator (%) in constant expressions (SF#2818562). 2009-12-04: olly [PHP] "empty" is a reserved word in PHP, so rename empty() method on STL classes to "is_empty()" (previously this was automatically renamed to "c_empty()"). *** POTENTIAL INCOMPATIBILITY *** 2009-12-03: olly [PHP] Add typemaps for long long and unsigned long long, and for pointer to method. 2009-12-02: olly [PHP] Fix warning and rename of reserved class name to be case insensitive. 2009-12-01: wsfulton Revert support for %extend and memberin typemaps added in swig-1.3.39. The memberin typemaps are ignored again for member variables within a %extend block. Documentation inconsistency reported by Torsten Landschoff. 2009-11-29: wsfulton [Java, C#] Fix generated quoting when using %javaconst(1)/%csconst(1) for static const char member variables. %javaconst(1) A; %csconst(1) A; struct X { static const char A = 'A'; }; 2009-11-26: wsfulton [Java, C#] Fix %javaconst(1)/%csconst(1) for static const member variables to use the actual constant value if it is specified, rather than the C++ code to access the member. %javaconst(1) EN; %csconst(1) EN; struct X { static const int EN = 2; }; 2009-11-23: wsfulton C++ nested typedef classes can now be handled too, for example: struct Outer { typedef Foo { } FooTypedef1, FooTypedef2; }; 2009-11-18: wsfulton The wrappers for C nested structs are now generated in the same order as declared in the parsed code. 2009-11-18: wsfulton Fix #491476 - multiple declarations of nested structs, for example: struct Outer { struct { int val; } inner1, inner2, *inner3, inner4[1]; } outer; 2009-11-17: wsfulton Fix parsing of enum declaration and initialization, for example: enum ABC { a, b, c } A = a, *pC = &C, array[3] = {a, b, c}; 2009-11-17: wsfulton Fix parsing of struct declaration and initialization, for example: struct S { int x; } instance = { 10 }; 2009-11-15: wsfulton Fix #1960977 - Syntax error parsing derived nested class declaration and member variable instance. 2009-11-14: wsfulton Fix #2310483 - function pointer typedef within extern "C" block. 2009-11-13: wsfulton Fix usage of nested template classes within templated classes so that compilable code is generated. 2009-11-13: olly [php] Fix place where class prefix (as specified with -prefix) wasn't being used. Patch from gverbruggen in SF#2892647. 2009-11-12: wsfulton Fix usage of nested template classes so that compilable code is generated - the nested template class is now treated like a normal nested classes, that is, as an opaque type unless the nestedworkaround feature is used. 2009-11-12: wsfulton Replace SWIGWARN_PARSE_NESTED_CLASS with SWIGWARN_PARSE_NAMED_NESTED_CLASS and SWIGWARN_PARSE_UNNAMED_NESTED_CLASS for named and unnamed nested classes respectively. Named nested class ignored warnings can now be suppressed by name using %warnfilter, eg: %warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) Outer::Inner; but clearly unnamed nested classes cannot and the global suppression is still required, eg: #pragma SWIG nowarn=SWIGWARN_PARSE_UNNAMED_NESTED_CLASS 2009-11-11: wsfulton Added the nestedworkaround feature as a way to use the full functionality of a nested class (C++ mode only). It removes the nested class from SWIG's type information so it is as if SWIG had never parsed the nested class. The documented nested class workarounds using a global fake class stopped working when SWIG treated the nested class as an opaque pointer, and this feature reverts this behaviour. The documentation has been updated with details of how to use and implement it, see the "Nested classes" section in SWIGPlus.html. 2009-11-11: wsfulton There were a number of C++ cases where nested classes/structs/unions were being handled as if C code was being parsed which would oftentimes lead to uncompilable code as an attempt was made to wrap the nested structs like it is documented for C code. Now all nested structs/classes/unions are ignored in C++ mode, as was always documented. However, there is an improvement as usage of nested structs/classes/unions is now always treated as an opaque type by default, resulting in generated code that should always compile. *** POTENTIAL INCOMPATIBILITY *** 2009-11-09: drjoe Fix R for -fcompact and add std_map.i 2009-11-08: wsfulton Fix inconsistency for nested structs/unions/classes. Uncompilable code was being generated when inner struct and union declarations were used as types within the inner struct. The inner struct/union is now treated as a forward declaration making the behaviour the same as an inner class. (C++ code), eg: struct Outer { struct InnerStruct { int x; }; InnerStruct* getInnerStruct(); }; 2009-11-08: wsfulton Ignored nested class/struct warnings now display the name of the ignored class/struct. 2009-11-07: wsfulton Bug #1514681 - Fix nested template classes within a namespace generated uncompilable code and introduced strange side effects to other wrapper code especially code after the nested template class. Note that nested template classes are still ignored. 2009-11-07: wsfulton Add new debug options: -debug-symtabs - Display symbol tables information -debug-symbols - Display target language symbols in the symbol tables -debug-csymbols - Display C symbols in the symbol tables 2009-11-03: wsfulton Fix some usage of unary scope operator (::) denoting global scope, for example: namespace AA { /* ... */ } using namespace ::AA; and bug #1816802 - SwigValueWrapper should be used: struct CC { CC(int); // no default constructor }; ::CC x(); and in template parameter specializations: struct S {}; template struct X { void a() {} }; template <> struct X { void b() {} }; %template(MyTConcrete) X< ::S >; plus probably some other corner case usage of ::. 2009-11-02: olly [Python] Fix potential memory leak in initialisation code for the generated module. 2009-10-23: wsfulton Fix seg fault when using a named nested template instantiation using %template(name) within a class. A warning that these are not supported is now issued plus processing continues as if no name was given. 2009-10-20: wsfulton [Python] Fix std::vector. This would previously compile, but not run correctly. 2009-10-20: wsfulton Fixed previously fairly poor template partial specialization and explicit specialization support. Numerous bugs in this area have been fixed including: - Template argument deduction implemented for template type arguments, eg this now works: template class X {}; template class X {}; %template(X1) X; // Chooses T * specialization and more complex cases with multiple parameters and a mix of template argument deduction and explicitly specialised parameters, eg: template struct TwoParm { void a() {} }; template struct TwoParm { void e() {} }; %template(E) TwoParm; Note that the primary template must now be in scope, like in C++, when an explicit or partial specialization is instantiated with %template. *** POTENTIAL INCOMPATIBILITY *** 2009-09-14: wsfulton [C#] Add %csattributes for adding C# attributes to enum values, see docs for example. 2009-09-11: wsfulton Fix memmove regression in cdata.i as reported by Adriaan Renting. 2009-09-07: wsfulton Fix constant expressions containing <= or >=. 2009-09-02: wsfulton The following operators in constant expressions now result in type bool for C++ wrappers and remain as type int for C wrappers, as per each standard: && || == != < > <= >= (Actually the last 4 are still broken). For example: #define A 10 #define B 10 #define A_EQ_B A == B // now wrapped as type bool for C++ #define A_AND_B A && B // now wrapped as type bool for C++ 2009-09-02: wsfulton Fix #2845746. true and false are now recognised keywords (only when wrapping C++). Constants such as the following are now wrapped (as type bool): #define FOO true #define BAR FOO && false Version 1.3.40 (18 August 2009) =============================== 2009-08-17: olly [Perl] Add "#undef do_exec" to our clean up of Perl global namespace pollution. 2009-08-17: olly [PHP] Fix to wrap a resource returned by __get() in a PHP object (SF#2549217). 2009-08-17: wsfulton Fix #2797485 After doing a 'make clean', install fails if yodl2man or yodl2html is not available. 2009-08-16: wsfulton [Octave] Caught exceptions display the type of the C++ exception instead of the generic "c++-side threw an exception" message. 2009-08-16: wsfulton [Java] When %catches is used, fix so that any classes specified in the "throws" attribute of the "throws" typemap are generated into the Java method's throws clause. 2009-08-16: wsfulton [C#] Fix exception handling when %catches is used, reported by Juan Manuel Alvarez. 2009-08-15: wsfulton Fix %template seg fault on some cases of overloading the templated method. Bug reported by Jan Kupec. 2009-08-15: wsfulton [Ruby] Add numerous missing wrapped methods for std::vector specialization as reported by Youssef Jones. 2009-08-14: wsfulton [Perl] Add SWIG_ConvertPtrAndOwn() method into the runtime for smart pointer memory ownership control. shared_ptr support still to be added. Patch from David Fletcher. 2009-08-14: olly [PHP] PHP5 now wraps static member variables as documented. 2009-08-14: olly [PHP] Update the PHP "class" example to work with PHP5 and use modern wrapping features. 2009-08-13: wsfulton [PHP] std::vector wrappers overhaul. They no longer require the specialize_std_vector() macro. Added wrappers for capacity() and reserve(). 2009-08-13: wsfulton [PHP] Add const reference typemaps. const reference primitive types are now passed by value rather than pointer like the other target languages. Fixes SF#2524029. 2009-08-08: wsfulton [Python] More user friendly AttributeError is raised when there are no constructors generated for the proxy class in the event that the class is abstract - the error message is now "No constructor defined - class is abstract" whereas if there are no public constructors for any other reason and the class is not abstract, the message remains "No constructor defined". [tcl] Similarly for tcl when using -itcl. 2009-08-04: olly [PHP] Fix generated code to work with PHP 5.3. 2009-08-04: vmiklos [PHP] Various mathematical functions (which would conflict with the built-in PHP ones) are now automatically handled by adding a 'c_' prefix. 2009-08-03: wsfulton [C#] The std::vector implementation is improved and now uses $typemap such that the proxy class for T no longer has to be specified in some macros for correct C# compilation; the following macros are deprecated, where CSTYPE was the C# type for the C++ class CTYPE: SWIG_STD_VECTOR_SPECIALIZE_MINIMUM(CSTYPE, CTYPE) usage should be removed altogether SWIG_STD_VECTOR_SPECIALIZE(CSTYPE, CTYPE) should be replaced with: SWIG_STD_VECTOR_ENHANCED(CTYPE) Some more details in csharp/std_vector.i *** POTENTIAL INCOMPATIBILITY *** 2009-07-31: olly [Python] Fix indentation so that we give a useful error if the module can't be loaded. Patch from Gaetan Lehmann in SF#2829853. 2009-07-29: wsfulton Add $typemap(method, typelist) special variable macro. This allows the contents of a typemap to be inserted within another typemap. Fully documented in Typemaps.html. 2009-07-29: vmiklos [PHP] Static member variables are now prefixed with the class name. This allows static member variables with the same name in different classes. 2009-07-29: olly [Python] Add missing locks to std::map wrappers. Patch from Paul Hampson in SF#2813836. 2009-07-29: olly [PHP] Fix memory leak in PHP OUTPUT typemaps. Reported by Hitoshi Amano in SF#2826322. 2009-07-29: olly [PHP] Fix memory leak in PHP resource destructor for classes without a destructor and non-class types. Patch from Hitoshi Amano in SF#2825303. 2009-07-28: olly [PHP] Update warnings about clashes between identifiers and PHP keywords and automatic renaming to work with the PHP5 class wrappers. Fixes SF#1613679. 2009-07-28: vmiklos [PHP] If a member function is not public but it has a base which is public, then now a warning is issued and the member function will be public, as PHP requires this. 2009-07-21: vmiklos [PHP] Director support added. 2009-07-15: olly [Perl] Don't specify Perl prototype "()" for a constructor with a different name to the class, as such constructors can still take parameters. 2009-07-12: xavier98 [Octave] Add support for Octave 3.2 API 2009-07-05: olly [PHP] Update the list of PHP keywords - "cfunction" is no longer a keyword in PHP5 and PHP 5.3 added "goto", "namespace", "__DIR__", and "__NAMESPACE__". 2009-07-03: olly [Tcl] To complement USE_TCL_STUBS, add support for USE_TK_STUBS and SWIG_TCL_STUBS_VERSION. Document all three in the Tcl chapter of the manual. Based on patch from SF#2810380 by Christian Gollwitzer. 2009-07-02: vmiklos [PHP] Added factory.i for PHP, see the li_factory testcase for more info on how to use it. 2009-07-02: wsfulton Fix -Wallkw option as reported by Solomon Gibbs. 2009-07-02: wsfulton Fix syntax error when a nested struct contains a comment containing a * followed eventually by a /. Regression from 1.3.37, reported by Solomon Gibbs. 2009-07-01: vmiklos [PHP] Unknown properties are no longer ignored in proxy classes. 2009-07-01: vmiklos [PHP] Fixed %newobject behaviour, previously any method marked with %newobject was handled as a constructor. 2009-06-30: olly [Ruby] Undefine close and connect macros defined by Ruby API headers as we don't need them and they can clash with C++ methods being wrapped. Patch from Vit Ondruch in SF#2814430. 2009-06-26: olly [Ruby] Fix to handle FIXNUM values greater than MAXINT passed for a double parameter. 2009-06-24: wsfulton Fix wrapping methods with default arguments and the compactdefaultargs feature where a class is passed by value and is assigned a default value. The SwigValueWrapper template workaround for a missing default constructor is no longer used as the code generated does not call the default constructor. 2009-06-16: wsfulton [Java,C#] Fix enum marshalling when %ignore is used on one of the enum items. Incorrect enum values were being passed to the C++ layer or compilation errors resulted. 2009-06-02: talby [Perl] Resolved reference.i overload support problem identified by John Potowsky. 2009-05-26: wsfulton [C#] Improved std::map wrappers based on patch from Yuval Baror. The C# proxy now implements System.Collections.Generic.IDictionary<>. These std:map wrappers have a non-backwards compatible overhaul to make them like a .NET IDictionary. Some method names have changed as following: set -> setitem (use this[] property now) get -> getitem (use this[] property now) has_key -> ContainsKey del -> Remove clear -> Clear The following macros used for std::map wrappers are deprecated and will no longer work: specialize_std_map_on_key specialize_std_map_on_value specialize_std_map_on_both *** POTENTIAL INCOMPATIBILITY *** 2009-05-20: vmiklos [PHP] Add the 'thisown' member to classes. The usage of it is the same as the Python thisown one: it's 1 by default and you can set it to 0 if you want to prevent freeing it. (For example to prevent a double free.) 2009-05-14: bhy [Python] Fix the wrong pointer value returned by SwigPyObject_repr(). 2009-05-13: mutandiz (Mikel Bancroft) [allegrocl] Minor tweak when wrapping in -nocwrap mode. 2009-05-11: wsfulton [C#] Improved std::vector wrappers on the C# proxy side from Yuval Baror. These implement IList<> instead of IEnumerable<> where possible. 2009-04-29: wsfulton [Java, C#] Add the 'notderived' attribute to the javabase and csbase typemaps. When this attribute is set, the typemap will not apply to classes that are derived from a C++ base class, eg %typemap(csbase, notderived="1") SWIGTYPE "CommonBase" 2009-04-29: olly [Python] Don't attempt to acquire the GIL in situations where we know that it will already be locked. This avoids some dead-locks with mod_python (due to mod_python bugs which are apparently unlikely to ever be fixed), and results in smaller wrappers which run a little faster (in tests with Xapian on x86-64 Ubuntu 9.04, the stripped wrapper library was 11% smaller and ran 2.7% faster). 2009-04-21: wsfulton [C#] Fix #2753469 - bool &OUTPUT and bool *OUTPUT typemaps initialisation. 2009-04-09: wsfulton Fix #2746858 - C macro expression using floating point numbers 2009-03-30: olly [PHP] The default out typemap for char[ANY] now returns the string up to a zero byte, or the end of the array if there is no zero byte. This is the same as Python does, and seems more generally useful than the previous behaviour of returning the whole contents of the array including any zero bytes. If you want the old behaviour, you can provide your own typemap to do this: %typemap(out) char [ANY] %{ RETVAL_STRINGL($1, $1_dim0, 1); %} Version 1.3.39 (21 March 2009) ============================== 2009-03-19: bhy [Python] Fix the memory leak related to Python 3 unicode and C char* conversion, which can be shown in the following example before this fix: from li_cstring import * i=0 while True: i += 1 n = str(i)*10 test3(n) This fix affected SWIG_AsCharPtrAndSize() so you cannot call this function with a null alloc and non-null cptr argument in Python 3, otherwise a runtime error will be raised. 2009-03-18: wsfulton [C#] std::vector wrapper improvements for .NET 2 and also providing the necessary machinery to use the std::vector wrappers with more advanced features such as LINQ - the C# proxy class now derives from IEnumerable<>. The default is now to generate code requiring .NET 2 as a minimum, although the C# code can be compiled for .NET 1 by defining the SWIG_DOTNET_1 C# preprocessor constant. See the std_vector.i file for more details. *** POTENTIAL INCOMPATIBILITY *** 2009-03-12: wsfulton [Ruby] Fix #2676738 SWIG generated symbol name clashes. 2009-03-01: bhy [Python] Some fixes for Python 3.0.1 and higher support. In 3.0.1, the C API function PyObject_Compare is removed, so PyObject_RichCompareBool is used for replacement. Struct initilization of SwigPyObject and SwigPyObject_as_number changed to reflect the drop of tp_compare and nb_long. 2009-03-01: bhy [Python] Fix SF#2583160. Now the importer in Python shadow wrapper take care of the case that module already imported at other place. 2009-02-28: bhy [Python] Fix SF#2637352. Move struct declaration of SWIG_module in pyinit.swg before the method calls, since some C compiler don't allow declaration in middle of function body. 2009-02-21: wsfulton [Allegrocl] Fix seg fault wrapping some constant variable (%constant) types. 2009-02-20: wsfulton [CFFI] Fix seg faults when for %extend and using statements. 2009-02-20: wsfulton Fix SF #2605955: -co option which broke in 1.3.37. 2009-02-20: wsfulton New %insert("begin") section added. Also can be used as %begin. This is a new code section reserved entirely for users and the code within the section is generated at the top of the C/C++ wrapper file and so provides a means to put custom code into the wrapper file before anything else that SWIG generates. 2009-02-17: wsfulton 'make clean-test-suite' will now run clean on ALL languages. Previously it only ran the correctly configured languages. This way it is now possible to clean up properly after running 'make partialcheck-test-suite'. 2009-02-14: wsfulton Extend attribute library support for structs/classes and the accessor functions use pass/return by value semantics. Two new macros are available and usage is identical to %attribute. These are %attributeval for structs/classes and %attributestring for string classes, like std::string. See attribute.swg for more details. 2009-02-13: wsfulton Add support for %extend and memberin typemaps. Previously the memberin typemaps were ignored for member variables within a %extend block. 2009-02-12: wsfulton Remove unnecessary temporary variable when wrapping return values that are references. Example of generated code for wrapping: struct XYZ { std::string& refReturn(); }; used to be: std::string *result = 0 ; ... { std::string &_result_ref = (arg1)->refReturn(); result = (std::string *) &_result_ref; } Now it is: std::string *result = 0 ; ... result = (std::string *) &(arg1)->refReturn(); 2009-02-08: bhy Change the SIZE mapped by %pybuffer_mutable_binary and %pybuffer_binary in pybuffer.i from the length of the buffer to the number of items in the buffer. 2009-02-08: wsfulton Fix %feature not working for conversion operators, reported by Matt Sprague, for example: %feature("cs:methodmodifiers") operator bool "protected"; 2009-02-07: wsfulton [MzScheme] Apply #2081967 configure changes for examples to build with recent PLT versions. Also fixes Makefile errors building SWIG executable when mzscheme package is installed (version 3.72 approx and later). 2009-02-04: talby [Perl] Fix SF#2564192 reported by David Kolovratnk. SWIG_AsCharPtrAndSize() now handles "get" magic. Version 1.3.38 (31 January 2009) ================================ 2009-01-31: bhy [Python] Fix SF#2552488 reported by Gaetan Lehmann. Now %pythonprepend and %pythonappend have correct indentation. 2009-01-31: bhy [Python] Fix SF#2552048 reported by Gaetan Lehmann. The parameter list of static member function in generated proxy code should not have the 'self' parameter. 2009-01-29: wsfulton Fix regression introduced in 1.3.37 where the default output directory for target language specific files (in the absence of -outdir) was no longer the same directory as the generated c/c++ file. 2009-01-28: wsfulton [Java, C#] Fix proxy class not being used when the global scope operator was used for parameters passed by value. Reported by David Piepgrass. 2009-01-15: wsfulton [Perl] Fix seg fault when running with -v option, reported by John Ky. Version 1.3.37 (13 January 2009) ================================ 2009-01-13: mgossage [Lua] Added contract support for requiring that unsigned numbers are >=0 Rewrote much of Examples/Lua/embed3. Added a lot to the Lua documentation. 2009-01-13: wsfulton Fix compilation error when using directors on protected virtual overloaded methods reported by Sam Hendley. 2009-01-12: drjoe [R] Fixed handling of integer arrays 2009-01-10: drjoe [R] Fix integer handling in r to deal correctly with signed and unsigned issues 2009-01-10: wsfulton Patch #1992756 from Colin McDonald - %contract not working for classes in namespace 2009-01-05: olly Mark SWIGPERL5, SWIGPHP5, and SWIGTCL8 as deprecated in the source code and remove documentation of them. 2008-12-30: wsfulton Bug #2430756. All the languages now define a macro in the generated C/C++ wrapper file indicating which language is being wrapped. The macro name is the same as those defined when SWIG is run, eg SWIGJAVA, SWIGOCTAVE, SWIGCSHARP etc and are listed in the "Conditional Compilation" section in the documentation. 2008-12-23: wsfulton [Java] Fix #2153773 - %nojavaexception was clearing the exception feature instead of disabling it. Clearing checked Java exceptions also didn't work. The new %clearjavaexception can be used for clearing the exception feature. 2008-12-22: wsfulton Fix #2432801 - Make SwigValueWrapper exception safe for when copy constructors throw exceptions. 2008-12-21: wsfulton Apply patch #2440046 which fixes possible seg faults for member and global variable char arrays when the strings are larger than the string array size. 2008-12-20: wsfulton The ccache compiler cache has been adapted to work with SWIG and named ccache-swig. It now works with C/C++ compilers as well as SWIG and can result in impressive speedups when used to recompile unchanged code with either a C/C++ compiler or SWIG. Documentation is in CCache.html or the installed ccache-swig man page. 2008-12-12: wsfulton Apply patch from Kalyanov Dmitry which fixes parsing of nested structs containing comments. 2008-12-12: wsfulton Fix error message in some nested struct and %inline parsing error situations such as unterminated strings and comments. 2008-12-07: olly [PHP] Fix warnings when compiling generated wrapper with GCC 4.3. 2008-12-06: wsfulton [PHP] Deprecate %pragma(php4). Please use %pragma(php) instead. The following two warnings have been renamed: WARN_PHP4_MULTIPLE_INHERITANCE -> WARN_PHP_MULTIPLE_INHERITANCE WARN_PHP4_UNKNOWN_PRAGMA -> WARN_PHP_UNKNOWN_PRAGMA *** POTENTIAL INCOMPATIBILITY *** 2008-12-04: bhy [Python] Applied patch SF#2158938: all the SWIG symbol names started with Py are changed, since they are inappropriate and discouraged in Python documentation (from http://www.python.org/doc/2.5.2/api/includes.html): "All user visible names defined by Python.h (except those defined by the included standard headers) have one of the prefixes "Py" or "_Py". Names beginning with "_Py" are for internal use by the Python implementation and should not be used by extension writers. Structure member names do not have a reserved prefix. Important: user code should never define names that begin with "Py" or "_Py". This confuses the reader, and jeopardizes the portability of the user code to future Python versions, which may define additional names beginning with one of these prefixes." Here is a brief list of what changed: PySwig* -> SwigPy* PyObject_ptr -> SwigPtr_PyObject PyObject_var -> SwigVar_PyObject PySequence_Base, PySequence_Cont, PySequence_Ref -> SwigPySequence_Base, SwigPySequence_Cont, SwigPySequence_Ref PyMap* -> SwigPyMap* We provided a pyname_compat.i for backward compatibility. Users whose code having these symbols and do not want to change it could simply include this file at front of your code. A better solution is to run the converting tool on your code, which has been put in SWIG's SVN trunk (Tools/pyname_patch.py) and you can download it here: https://swig.svn.sourceforge.net/svnroot/swig/trunk/Tools/pyname_patch.py *** POTENTIAL INCOMPATIBILITY *** 2008-12-02: wsfulton [Python] Apply patch #2143727 from Serge Monkewitz to fix importing base classes when the package option is specified in %module and that module is %import'ed. 2008-11-28: wsfulton [UTL] Fix #2080497. Some incorrect acceptance of types in the STL, eg a double * element passed into a vector constructor would be accepted, but the ensuing behaviour was undefined. Now the type conversion correctly raises an exception. 2008-11-24: wsfulton Add -outcurrentdir option. This sets the default output directory to the current directory instead of the path specified by the input file. This option enables behaviour similar to c/c++ compilers. Note that this controls the output directory, but only in the absence of the -o and/or -outdir options. 2008-11-23: wsfulton [ruby] Apply patch #2263850 to fix ruby/file.i ... rubyio.h filename change in ruby 1.9. 2008-11-23: wsfulton Apply patch #2319790 from Johan Hake to fix shared_ptr usage in std::tr1 namespace. 2008-11-21: wsfulton The use of the include path to find the input file is now deprecated. This makes the behaviour of SWIG the same as C/C++ compilers in preparation for use with ccache. 2008-11-16: wsfulton Fix -nopreprocess option to: - correctly report file names in warning and error messages. - use the original input filename that created the preprocessed output when determining the C++ wrapper file name (in the absence of -o). Previously the name of the input file containing the preprocessed output was used. 2008-11-11: wsfulton [Java] Add patch #2152691 from MATSUURA Takanori which fixes compiles using the Intel compiler 2008-11-01: wsfulton Add patch #2128249 from Anatoly Techtonik which corrects the C/C++ proxy class being reported for Python docstrings when %rename is used. 2008-11-01: wsfulton Add the strip encoder patch from Anatoly Techtonik #2130016. This enables an easy way to rename symbols by stripping a commonly used prefix in all the function/struct names. It works in the same way as the other encoders, such as title, lower, command etc outlined in CHANGES file dated 12/30/2005. Example below will rename wxAnotherWidget to AnotherWidget and wxDoSomething to DoSomething: %rename("%(strip:[wx])s") ""; struct wxAnotherWidget { void wxDoSomething(); }; 2008-09-26: mutandiz [allegrocl] Lots of test-suite work. - Fix ordering of wrapper output and %{ %} header output. - Fix declarations of local vars in C wrappers. - Fix declaration of defined constants in C wrappers. - Fix declaration of EnumValues in C wrappers. - add some const typemaps to allegrocl.swg - add rename for operator bool() overloads. 2008-09-25: olly [PHP5] Fill in typemaps for SWIGTYPE and void * (SF#2095186). 2008-09-22: mutandiz (Mikel Bancroft) [allegrocl] - Support wrapping of types whose definitions are not seen by SWIG. They are treated as forward-referenced classes and if a definition is not seen are treated as (* :void). - Don't wrap the contents of unnamed namespaces. - More code cleanup. Removed some extraneous warnings. - start work on having the allegrocl mod pass the cpp test-suite. 2008-09-19: olly [PHP5] Add typemaps for long long and unsigned long long. 2008-09-18: wsfulton [C#] Added C# array typemaps provided by Antti Karanta. The arrays provide a way to use MarshalAs(UnmanagedType.LPArray) and pinning the array using 'fixed'. See arrays_csharp.i library file for details. 2008-09-18: wsfulton Document the optional module attribute in the %import directive, see Modules.html. Add a warning for Python wrappers when the module name for an imported base class is missing, requiring the module attribute to be added to %import, eg %import(module="FooModule") foo.h 2008-09-18: olly [PHP5] Change the default input typemap for char * to turn PHP Null into C NULL (previously it was converted to an empty string). The new behaviour is consistent with how the corresponding output typemap works (SF#2025719). If you want to keep the old behaviour, add the following typemap to your interface file (PHP's convert_to_string_ex() function does the converting from PHP Null to an empty string): %typemap(in) char * { convert_to_string_ex($input); $1 = Z_STRVAL_PP($input); } 2008-09-18: olly [PHP5] Fix extra code added to proxy class constructors in the case where the only constructor takes no arguments. 2008-09-18: olly [PHP5] Fix wrapping of a renamed enumerated value of an enum class member (SF#2095273). 2008-09-17: mutandiz (Mikel Bancroft) [allegrocl] - Fix how forward reference typedefs are handled, so as not to conflict with other legit typedefs. - Don't (for now) perform an ffitype typemap lookup when trying to when calling compose_foreign_type(). This is actually a useful thing to do in certain cases, the test cases for which I can't currently locate :/. It's breaking some wrapping behavior that is more commonly seen, however. I'll readd in a more appropriate way when I can recreate the needed test case, or a user complains (which means they probably have a test case). - document the -isolate command-line arg in the 'swig -help' output. It was in the html docs, but not there. - small amount of code cleanup, removed some unused code. - some minor aesthetic changes. 2008-09-12: bhy [Python] Python 3.0 support branch merged into SWIG trunk. Thanks to Google Summer of Code 2008 for supporting this project! By default SWIG will generate interface files compatible with both Python 2.x and 3.0. And there's also some Python 3 new features that can be enabled by passing a "-py3" command line option to SWIG. These features are: - Function annotation support Also, the parameter list of proxy function will be generated, even without the "-py3" option. However, the parameter list will fallback to *args if the function (or method) is overloaded. - Buffer interface support - Abstract base class support For details of Python 3 support and these features, please see the "Python 3 Support" section in the "SWIG and Python" chapter of the SWIG documentation. The "-apply" command line option and support of generating codes using apply() is removed. Since this is only required by very old Python. This merge also patched SWIG's parser to solve a bug. By this patch, SWIG features able to be correctly applied on C++ conversion operator, such like this: %feature("shadow") *::operator bool %{ ... %} 2008-09-02: richardb [Python] Commit patch #2089149: Director exception handling mangles returned exception. Exceptions raised by Python code in directors are now passed through to the caller without change. Also, remove the ": " prefix which used to be added to other director exceptions (eg, those due to incorrect return types). 2008-09-02: wsfulton [Python] Commit patch #1988296 GCItem multiple module linking issue when using directors. 2008-09-02: wsfulton [C#] Support for 'using' and 'fixed' blocks in the 'csin' typemap is now possible through the use of the pre attribute and the new terminator attribute, eg %typemap(csin, pre=" using (CDate temp$csinput = new CDate($csinput)) {", terminator=" } // terminate temp$csinput using block", ) const CDate & "$csclassname.getCPtr(temp$csinput)" See CSharp.html for more info. 2008-09-01: wsfulton [CFFI] Commit patch #2079381 submitted by Boris Smilga - constant exprs put into no-eval context in DEFCENUM 2008-08-02: wuzzeb [Chicken,Allegro] Commit Patch 2019314 Fixes a build error in chicken, and several build errors and other errors in Allegro CL 2008-07-19: wsfulton Fix building of Tcl examples/test-suite on Mac OS X reported by Gideon Simpson. 2008-07-17: wsfulton Fix SF #2019156 Configuring with --without-octave or --without-alllang did not disable octave. 2008-07-14: wsfulton [Java, C#] Fix director typemaps for pointers so that NULL pointers are correctly marshalled to C#/Java null in director methods. 2008-07-04: olly [PHP] For std_vector.i and std_map.i, rename empty() to is_empty() since "empty" is a PHP reserved word. Based on patch from Mark Klein in SF#1943417. 2008-07-04: olly [PHP] The deprecated command line option "-make" has been removed. Searches on Google codesearch suggest that nobody is using it now anyway. 2008-07-04: olly [PHP] The SWIG cdata.i library module is now supported. 2008-07-03: olly [PHP] The deprecated command line option "-phpfull" has been removed. We recommend building your extension as a dynamically loadable module. 2008-07-02: olly [PHP4] Support for PHP4 has been removed. The PHP developers are no longer making new PHP4 releases, and won't even be providing patches for critical security issues after 2008-08-08. 2008-07-02: olly [Python] Import the C extension differently for Python 2.6 and later so that an implicit relative import doesn't produce a deprecation warning for 2.6 and a failure for 2.7 and later. Patch from Richard Boulton in SF#2008229, plus follow-up patches from Richard and Haoyu Bai. Version 1.3.36 (24 June 2008) ============================= 06/24/2008: wsfulton Remove deprecated -c commandline option (runtime library generation). 06/24/2008: olly [PHP] Fix assertion failure when handling %typemap(in,numinputs=0) (testcase ignore_parameter). 06/24/2008: olly [PHP] Fix segfault when wrapping a non-class function marked with %newobject (testcase char_strings). 06/22/2008: wsfulton [Java] Add a way to use AttachCurrentThreadAsDaemon instead of AttachCurrentThread in director code. Define the SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON macro, see Lib/java/director.swg. 06/21/2008: wsfulton [Ruby] Fix crashing in the STL wrappers (reject! and delete_if methods) 06/19/2008: wsfulton [Java, C#] C# and Java keywords will be renamed instead of just issuing a warning and then generating uncompilable code. Warning 314 gives the new name when a keyword is found. 06/19/2008: wsfulton [R] Keyword handling added. R Keywords will be renamed as necessary. Warning 314 gives the new name when a keyword is found. 06/17/2008: mgossage [Lua] Added missing support for bool& and bool*. Added runtest for li_typemaps testcase. (Bug #1938142) 06/07/2008: bhy Added test case keyword_rename, then made the keyword renaming works properly by fixing Swig_name_make() for a incomplete condition checking. 06/02/2008: wsfulton [Java, C#] Fix enum wrappers when using -noproxy. 05/30/2008: bhy Added std::wstring into Lib/typemaps/primtypes.swg, since it is also a primitive type in SWIG - fixed SF #1976978. 05/29/2008: wsfulton [Java, C#] Fix variable wrappers when using -noproxy. 05/29/2008: bhy [Python] Fixed a typo of %#ifdef in Lib/python/pycontainer.swg, which is related to -extranative SWIG option - SF #1971977. 05/20/2008: wsfulton New partialcheck makefile targets for partial testing of the test-suite. These just invoke SWIG, ie no compilation and no runtime testing. It can be faster when developing by just doing a directory diff of the files SWIG generates against those from a previous run. Example usage from the top level directory: make partialcheck-test-suite make partialcheck-java-test-suite This change also encompasses more flexibility in running the test-suite, eg it is possible to prefix the command line which runs any target language test with a tool. See the RUNTOOL, COMPILETOOL and SWIGTOOL targets in the common.mk file and makefiles in the test-suite directory. For example it is possible to run the runtime tests through valgrind using: make check RUNTOOL="valgrind --leak-check=full" or invoke SWIG under valgrind using: make check SWIGTOOL="valgrind --tool=memcheck" 05/19/2008: drjoe [R] Fixed define that was breaking pre-2.7. Checked in patch from Soren Sonnenburg that creates strings in version independent way 05/15/2008: wsfulton [Java] Fix variable name clash in directors - SF #1963316 reported by Tristan. 05/14/2008: wsfulton Add an optimisation for functions that return objects by value, reducing the number of copies of the object that are made. Implemented using an optional attribute in the "out" typemap called "optimal". Details in Typemaps.html. 05/11/2008: olly [PHP] Check for %feature("notabstract") when generating PHP5 class wrapper. 05/11/2008: wsfulton Fix SF #1943608 - $self substitution in %contract, patch submitted by Toon Verstraelen. 05/09/2008: olly [PHP] Fix char * typemaps to work when applied to signed char * and unsigned char * (uncovered by testcase apply_strings). 05/09/2008: wsfulton Fix wrapping of char * member variables when using allprotected mode. Bug reported by Warren Wang. 05/09/2008: olly [PHP] Fix bad PHP code generated when wrapping an enum in a namespace (uncovered by testcase arrays_scope). 05/09/2008: olly [PHP] SWIG now runs the PHP testsuite using PHP5, not PHP4. PHP4 is essentially obsolete now, so we care much more about solid PHP5 support. 05/07/2008: wsfulton STL fixes when using %import rather than %include and the Solaris Workshop compiler and the Roguewave STL. 05/07/2008: wsfulton Fix wrapping of overloaded protected methods when using allprotected mode. Bug reported by Warren Wang. 05/03/2008: wsfulton Commit patch #1956607 to add -MT support from Richard Boulton. This patch mirrors the gcc -MT option which allows one to change the default Makefile target being generated when generating makefiles with the -M family of options. For example: $ swig -java -MM -MT overriddenname -c++ example.i overriddenname: \ example.i \ example.h 04/30/2008: mgossage [Lua] Removed generation of _wrap_delete_XXXXX (wrappered destructor) which was unused and causing warning with g++ -Wall. Removed other unused warning in typemaps.i and other places. Added Examples/lua/embed3, and run tests a few test cases. 04/24/2008: olly [Python] Fix generated code for IBM's C++ compiler on AIX (patch from Goeran Uddeborg in SF#1928048). 04/24/2008: olly Rename BSIZE in Examples/test-suite/arrays_scope.i to BBSIZE to avoid a clash with BSIZE defined by headers on AIX with Perl (reported in SF#1928048). 04/20/2008: wsfulton Add the ability to wrap all protected members when using directors. Previously only the virtual methods were available to the target language. Now all protected members, (static and non-static variables, non-virtual methods and static methods) are wrapped when using the allprotected mode. The allprotected mode is turned on in the module declaration: %module(directors="1", allprotected="1") modulename Version 1.3.35 (7 April 2008) ============================= 04/07/2008: wsfulton [Lua] Add missing pointer reference typemaps 04/06/2008: wsfulton Fix stack overflow when using typemap warning suppression, eg %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK_MSG) 04/05/2008: wsfulton [Python] Fix shared_ptr typemaps so that %pythonnondynamic can be used. Also corrects display of the proxy class type. Reported by Robert Lupton. 04/04/2008: olly [Python] Add %newobject reference to python memory management subsection of manual (patch from mdbeachy in SF#1894610). 03/27/2008: wsfulton [Python] Fix shared_ptr typemaps where the pointer type is a templated type with with more than one parameter. Reported by Robert Lupton. 03/27/2008: mgossage [Lua] Added a typemap DISOWN for SWIGTYPE* and SWIGTYPE[], and support for %delobject feature. Added Examples/lua/owner which demonstrates the use of the memory management. 03/26/2008: wsfulton [Java] Apply patch #1844301 from Monty Taylor to suppress enum constructor unused warnings. 03/26/2008: wsfulton [Python] Apply patch #1924524 from Casey Raymondson which ensures the "No constructor defined" message is displayed when attempting to call a constructor on a class that doesn't have a constructor wrapper, eg if the C++ class is abstract. 03/26/2008: wsfulton [Python] Apply patch #1925702 from Casey Raymondson which removes warning 512 for std::vector wrappers. 03/26/2008: olly [Python] Apply GCC 4.3 warnings patch from Philipp Thomas (SF#1925122). 03/21/2008: wsfulton [Python] Thread safety patch for STL iterators from Abhinandan Jain. 03/17/2008: mgossage [Lua] Added %luacode feature to add source code into wrappers. Updated documentation to document this. Added Examples/lua/arrays to show its use (and typemaps) 03/17/2008: olly Fix nonportable sed usage which failed on Mac OS X (and probably other platforms). Fixes SF#1903612. 03/17/2008: olly Fix memory leak in SWIG's parser (based on patch from Russell Bryant in SF#1914023). 03/12/2008: wsfulton Fix bug #1878285 - unnecessary cast for C struct creation wrappers. 03/12/2008: wsfulton [Python] Remove debugging info when using shared_ptr support 03/06/2008: mgossage [Lua] Updated documentation for Lua exceptions. Added Examples/lua/exception and Examples/lua/embed2. Small updates to the typemaps. 03/04/2008: wsfulton [Java, C#] Add char *& typemaps. 03/04/2008: wsfulton Fix occasional seg fault when attempting to report overloaded methods as being ignored. 02/29/2008: wsfulton [Perl] Fix #1904537 Swig causes a Perl warning "x used only once" in Perl 5.10 reported by Ari Jolma 02/29/2008: wsfulton [Python] Add shared_ptr varin/varout typemaps for wrapping global variables. 02/25/2008: wsfulton Fix $wrapname to work in %exception (fixes some wrap:name assertions) Version 1.3.34 (27 February 2008) ================================= 02/13/2008: wsfulton [R] Fix wrapping of global function pointer variables. 02/13/2008: wsfulton Add new special variables for use within %exception: $wrapname - language specific wrapper name $overname - if a method is overloaded this contains the extra mangling used on the overloaded method $decl - the fully qualified C/C++ declaration of the method being wrapped without the return type $fulldecl - the fully qualified C/C++ declaration of the method being wrapped including the return type 02/12/2008: drjoe [R] Now setting S4 flag in SWIG created objects. This fixes R-SWIG for 2.6 and warning for 2.6 failure has been removed. 02/11/2008: mgossage [Lua] Added a patch by Torsten Landschoff to fix the unary minus issue Ran 'astyle --style=kr -2' across lua.cxx to neaten it up 02/10/2008: wsfulton Bump SWIG_RUNTIME_VERSION to 4. This is because of the recently introduced API change in the conversion functions, ie change in definition of swig_converter_func. Anyone calling SWIG_TypeCast must pass in a valid value for the new additional (third) parameter and then handle the newly created memory if the returned value is set to SWIG_CAST_NEW_MEMORY else a memory leak will ensue. 02/09/2008: wsfulton [Python] Experimental shared_ptr typemaps added. Usage is the same as the recently added Java and C# shared_ptr typemaps. Two macros are available, although these may well change in a future version: For base classes or classes not in an inheritance chain: SWIG_SHARED_PTR(PROXYCLASS, TYPE) For derived classes: SWIG_SHARED_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) The PROXYCLASS is the name of the proxy class, but is only required for Java/C#. Example usage: %include "boost_shared_ptr.i" SWIG_SHARED_PTR(Klass, Space::Klass) SWIG_SHARED_PTR_DERIVED(KlassDerived, Space::Klass, Space::KlassDerived) namespace Space { struct Klass { ... }; struct KlassDerived : Klass { ... }; } Further details to follow in future documentation, but the following features should be noted: - Not restricted to boost::shared_ptr, eg std::tr1::shared_ptr can also be used. - Available typemap groups: (a) Typemaps for shared_ptr passed by value, reference, pointer and pointer reference. - (b) Typemaps for passing by raw value, raw pointer, raw reference, raw pointer reference. - The code being wrapped does not even have to use shared_ptr, SWIG can use shared_ptr as the underlying storage mechanism instead of a raw pointer due to the typemaps in group (b) above. - No array support as shared_ptr does not support arrays. - This works quite differently to the usual SWIG smart pointer support when operator-> is parsed by SWIG: - An additional smart pointer class is not generated reducing code bloat in the wrappers. - Using smart pointers and raw pointers can be mixed seamlessly. - Missing constructors for the smart pointers is no longer a problem and so separate factory type functions do not have to be written and wrapped. - The implicit C++ shared_ptr< derived class > to shared_ptr< base class > cast also works in the target language. This negates the necessity to write an explicit helper cast function providing the upcast which would need calling prior to passing a derived class to a method taking a shared_ptr to a base class. 02/09/2008: wsfulton [Python] Add support for overriding the class registration function via a new "smartptr" feature. This is a very low level of customisation most users would never need to know. The feature will typically be used for intrusive smart pointers along with additional typemaps. Example usage of the feature: %feature("smartptr", noblock=1) Foo { boost::shared_ptr< Foo > } class Foo {}; The generated Foo_swigregister function will then register boost::shared < Foo > (SWIGTYPE_p_boost__shared_ptrTFoo_t instead of SWIGTYPE_p_Foo) as the underlying type for instantiations of Foo. 02/09/2008: wsfulton Features now supports the optional 'noblock' attribute for all usage of %feature. When specified, the { } braces are removed from the feature code. This is identical in behaviour to usage of 'noblock' in typemaps and is used when the preprocessor is required to operate on the code in the feature and the enclosing { } braces are not required. Example: #define FOO foo %feature("smartptr", noblock="1") { FOO::bar } The preprocessor then reduces this as if this had been used instead: %feature("smartptr") "foo::bar" 02/01/2008: olly [Python] Fix format string bug (SF#1882220). 01/31/2008: wsfulton Additions to the %types directive. Now the conversion / casting code can be overridden to some custom code in the %types directive, like so: %types(fromtype = totype) %{ ... code to convert fromtype to totype and return ... %} The special variable $from will be replaced by the name of the parameter of the type being converted from. The code must return the totype cast to void *. Example: class Time; class Date; Date &Time::dateFromTime(); %types(Time = Date) %{ Time *t = (Time *)$from; Date &d = t->dateFromTime(); return (void *) &d; %} resulting in the conversion / casting code looking something like: static void *_p_TimeTo_p_Date(void *x) { Time *t = (Time *)x; Date &d = t->dateFromTime(); return (void *) &d; } This is advanced usage, please use only if you understand the runtime type system. 01/30/2008: mgossage Small update to documentation in Typemaps.html, to warn about use of local variables in typemaps for multiple types. 01/25/2008: wsfulton [Java] Fix bug reported by Kevin Mills in ARRAYSOFCLASSES typemaps where any changes made to an array element passed from Java to C are not reflected back into Java. 01/24/2008: mgossage More updates to the configure script for detecting lua. Also looks in /usr/include/lua* Also changed typemaps.i not to check for NULL before freeing a pointer 01/21/2008: wsfulton [Python] For STL containers, SWIG no longer attempts to convert from one STL container to another, eg from std::vector to std::vector or std::list to std::vector or even std::vector to std::vector as it previously did. In fact SWIG no longer attempts to convert any SWIG wrapped C++ proxy class that is also a Python sequence, whereas previously it would. Any non-SWIG Python sequence will still be accepted wherever an STL container is accepted. Overloaded methods using containers should be faster. 01/18/2008: wsfulton [C#] Add 'directorinattributes' and 'directoroutattributes' typemap attributes for the imtype typemap. These should contain C# attributes which will be generated into the C# director delegate methods. 01/18/2008: olly Fix handling of byte value 255 in input files on platforms where char is signed (it was getting mapped to EOF). Fixes SF#1518219. 01/16/2008: wsfulton Fix template member variables wrapped by a smart pointer. Bug reported by Robert Lupton. 01/14/2008: mgossage Substantial changes to configure script for detecting lua. Code can now link to liblua.a, liblua50.a or liblua51.a It's also a lot neater now. 12/16/2007: wsfulton [Perl] Backed out #1798728 - numbers can be passed to functions taking char * 12/16/2007: wsfulton Fix #1832613 - Templates and some typedefs involving pointers or function pointers 12/12/2007: wsfulton [Java] Fix #1632625 - Compilation errors on Visual C++ 6 when using directors. 12/12/2007: wsfulton [Perl] Fix #1798728 - numbers can be passed to functions taking char *. 12/12/2007: wsfulton Fix #1819847 %template with just one default template parameter template class Foo {...}; %template(FooDefault) Foo<>; 12/12/2007: mgossage [Lua] Small correction on Lua.html 12/09/2007: wsfulton Apply patch #1838248 from Monty Taylor for vpath builds of SWIG. 12/08/2007: wsfulton [Lua] Fixes to remove gcc-4.2 warnings 12/06/2007: wsfulton Fix #1734415 - template template parameters with default arguments such as: template class t_alloc = pfc::alloc_fast > class list_t : public list_impl_t > { ... }; 12/04/2007: mgossage [lua] Fix a bug in the class hierachy code, where the methods were not propagated, if the name ordering was in a certain order. Added new example programs (dual, embed) and runtime tests for test-suite. 11/30/2007: wsfulton Fix using statements using a base class method where the methods were overloaded. Depending on the order of the using statements and method declarations, these were previously generating uncompilable wrappers, eg: struct Derived : Base { virtual void funk(); using Base::funk; }; Version 1.3.33 (November 23, 2007) ================================== 11/21/2007: mikel [allegrocl] omit private slot type info in the classes/types defined on the lisp side. Fix bug in mapping of C/++ types to lisp types. Fix typo in modules generated defpackage form. Have std::string *'s automatically marshalled between foreign and lisp strings. 11/20/2007: olly [Python] Fill in Python Dictionary functions list (patch from Jelmer Vernooij posted to swig-devel). 11/20/2007: beazley Fixed a bug in the C scanner related to backslash characters. 11/19/2007: wsfulton [Perl] Fix broken compilation of C++ wrappers on some compilers. 11/16/2007: olly [Python] Don't pass Py_ssize_t for a %d printf-like format as that's undefined behaviour when sizeof(Py_ssize_t) != sizeof(int). Version 1.3.32 (November 15, 2007) ================================== 11/14/2007: wsfulton [R] Package name and dll name is now the same as the SWIG module name. It used to be the module name with _wrap as a suffix. The package and dll names can be modified using the -package and -dll commandline options. *** POTENTIAL INCOMPATIBILITY *** 11/11/2007: wsfulton [R] Add support for Windows (Visual C++ 8 tested) 11/10/2007: olly [php] Fix makefile generated by -make (SF#1633679). Update documentation to mark "-make" as deprecated (none of the other SWIG backends seem to offer such a feature, it can't realistically generate a fully portable makefile, and the commands to build an extension are easy enough to write for the user's preferred build tool). Also recommend against the use of "-phpfull" (it's only really useful when static linking, and a dynamically loadable module is virtually always the better approach). 11/09/2007: olly Fix --help output to note that `export SWIG_FEATURES' is required. 10/29/2007: wsfulton [R] Fix seg fault on Windows [R] Examples R scripts are now platform independent 10/30/2007: mgossage [lua] fixed bug in template classes which cases template_default2 and template_specialization_defarg to fail. Added several warning filters into the overload's test cases. Added runtime tests for several codes. You can now make check-lua-test-suite with no errors and only a few warnings. 10/30/2007: olly [guile] Fix the configure test to put GUILELINK in LIBS not LDFLAGS (SF#1822430). 10/30/2007: olly [guile] Fix the guile examples on 64-bit platforms. 10/29/2007: wsfulton [C#] Fix member pointers on 64 bit platforms. 10/28/2007: olly [lua] Fix swig_lua_class instances to be static to allow multiple SWIG wrappers to be compiled into the same executable statically. Patch from Andreas Fredriksson (posted to the swig mailing list). 10/28/2007: olly [lua] Fix Examples/lua to pass SRCS for C tests rather than CXXSRCS. The code as it was happened to work on x86, but broke on x86_64 (and probably any other platforms which require -fPIC). 10/28/2007: wsfulton [Java, C#] New approach for fixing uninitialised variable usage on error in director methods using the new templated initialisation function SwigValueInit(). 10/28/2007: wsfulton [Perl] Use more efficient SvPV_nolen(x) instead of SvPV(x,PL_na) if SvPV_nolen is supported. 10/26/2007: wuzzeb [Chicken] Fix global variables of class member function pointers. Other minor fixes, so all tests in the chicken test suite now pass 10/25/2007: olly Fix UTL typecheck macro for a function taking char[] or const char[] (SF#1820132). 10/22/2007: mkoeppe [Guile] Filter out -ansi -pedantic from CFLAGS while compiling test programs for Guile in configure. This enables running the test suite for Guile if it is installed and usable. 10/22/2007: mkoeppe [Guile -scm] Fix testcases apply_signed_char and apply_strings by adding explicit casts to the appropriate $ltype. 10/22/2007: wsfulton [Java, C#] Fix uninitialised variable usage on error in director methods. 10/19/2007: wsfulton [Java, C#] Bug #1794247 - fix generated code for derived classes when csbase or javabase typemaps are used with the replace="1" attribute. 10/19/2007: wsfulton [Python] Docs updated to suggest using distutils. Patch #1796681 from Christopher Barker. 10/19/2007: olly [perl5] Clear errno before calls to strtol(), strtoul(), strtoll() and strtoull() which we check errno after to avoid seeing a junk value of errno if there isn't an error in the call. 10/16/2007: wsfulton Deprecate %attribute_ref and replace with %attributeref. There is just an argument order change in order to maintain consistency with %attribute, from: %attribute_ref(Class, AttributeType, AccessorMethod, AttributeName) to %attributeref(Class, AttributeType, AttributeName, AccessorMethod) 10/16/2007: olly [Tcl] Fix several occurrences of "warning: deprecated conversion from string constant to 'char*'" from GCC 4.2 in generated C/C++ code. 10/16/2007: olly [PHP] Fix many occurrences of "warning: deprecated conversion from string constant to 'char*'" from GCC 4.2 in generated C/C++ code when compiling with a new enough version of PHP 5 (tested with PHP 5.2.3, but PHP 5.2.1 is probably the minimum requirement). 10/15/2007: wsfulton Patch #1797133 from David Piepgrass fixes %attribute when the getter has the same name as the attribute name and no longer generate non-functional setter for read-only attributes. 10/15/2007: olly [Tcl] Prevent SWIG_Tcl_ConvertPtr from calling the unknown proc. Add Examples/tcl/std_vector/ which this change fixes. Patch is from "Cliff C" in SF#1809819. 10/12/2007: wsfulton [Java] Add DetachCurrentThread back in for directors. See entry dated 08/11/2006 and search for DetachCurrentThread on the mailing lists for details. The crashes on Solaris seem to be only present in jdk-1.4.2 and lower (jdk-1.5.0 and jdk-1.6.0 are okay), so anyone using directors should use a recent jdk on Solaris, or define (see director.swg) SWIG_JAVA_NO_DETACH_CURRENT_THREAD to the C++ compiler to get old behaviour. 10/12/2007: wsfulton [Java] Ensure the premature garbage collection prevention parameter (pgcpp) is generated when there are C comments in the jtype and jstype typemaps. 10/12/2007: wuzzeb Added a testsuite entry for Bug #1735931 10/09/2007: olly Automatically rerun autogen.sh if configure.in is modified. 10/09/2007: olly Enhance check-%-test-suite rule and friends to give a more helpful error message if you try them for a language which doesn't exist (e.g. "make check-php-test-suite" rather than the correct "make check-php4-test-suite"). 10/09/2007: olly Add make rule to regenerate Makefile from Makefile.in if it has changed. 10/09/2007: olly [php] Fix long-standing memory leak in wrapped constructors and wrapped functions/methods which return an object. 10/08/2007: olly Fix Makefile.in to read check.list files correctly in a VPATH build. 10/07/2007: wsfulton [C#, Java] Experimental shared_ptr typemaps added 09/27/2007: mgossage [lua] added more verbose error messages for incorrect typechecks. Added a routine which checks the exact number of parameters passed to a function (breaks operator_overloading for unary minus operator, currently disabled). Reorganised the luatypemaps.swg to tidy it up. Added a lot of %ignores on the operators not supported by lua. Added support for constant member function pointers & runtest for member_pointer.i Added first version of wchar.i 09/25/2007: wsfulton [C#, Java] throws typemaps for std::wstring using C# patch #1799064 from David Piepgrass 09/24/2007: wsfulton [Tcl] Apply #1771313 to fix bug #1650229 - fixes long long and unsigned long long handling. 09/20/2007: olly [Java] Eliminate some unnecessary uses of a temporary buffer allocated using new[]. SF#1796609. 09/19/2007: wsfulton [C#] The $csinput special variable can be used in the csvarin typemap where it is always expanded to 'value'. 09/19/2007: wsfulton [C#] Fix bug reported by Glenn A Watson and #1795260 where the cstype typemap used the 'ref' keyword in the typemap body, it produced uncompilable C# properties (variable wrappers). The type for the property now correctly comes from the 'out' attribute in the cstype typemap. 09/19/2007: wsfulton [Java] Fix const std::wstring& typemaps 09/19/2007: wsfulton [Java] Ensure the premature garbage collection prevention parameter (pgcpp) is generated where a parameter is passed by pointer reference, eg in the std::vector wrappers. The pgcpp is also generated now when user's custom typemaps use a proxy class in the jstype typemap and a 'long' in the jtype typemap. 09/18/2007: olly [php] Add typemaps for handling parameters of type std::string & which are modified by the wrapped function. 09/17/2007: olly [python] Split potentially long string literals to avoid hitting MSVC's low fixed limit on string literal length - patch from SF#1723770, also reported as SF#1630855. 09/17/2007: olly [ocaml] Fix renaming of overloaded methods in the method_table - my patch from SF#940399. 09/17/2007: olly [python] Simpler code for SWIG_AsVal_bool() which fixes a "strict aliasing" warning from GCC - patch from SF#1724581 by Andrew Baumann. 09/17/2007: olly [perl5] Use sv_setpvn() to set a scalar from a pointer and length - patch from SF#174460 by "matsubaray". 09/17/2007: olly When wrapping C++ code, generate code which uses std::string::assign(PTR, LEN) rather than assigning std::string(PTR, LEN). Using assign generates more efficient code (tested with GCC 4.1.2). 09/07/2007: wsfulton Fix %ignore on constructors which are not explicitly declared [SF #1777712] 09/05/2007: wuzzeb (John Lenz) - Change r_ltype in typesys.c to store a hashtable instead of a single value. several very subtle bugs were being caused by multiple ltypes being mapped to a single mangled type, mostly when using typedefed template parameters. Now, r_ltype stores a hashtable of possible ltypes, and when generating the type table, all the ltypes are added into the swig_type_info structure. 08/31/2007: wsfulton SF #1754967 from James Bigler. - Fix bug in turning on warnings that were turned off by default. Eg 'swig -w+309' will now turn on the normally suppressed warning 309. - New -Wextra commandline option which enables the extra warning numbers: 202,309,403,512,321,322 (this is the list of warnings that have always been suppressed by default). By specifying -Wextra, all warnings will be turned on, but unlike -Wall, warnings can still be selectively turned on/off using %warnfilter, #pragma SWIG nowarn or further -w commandline options, eg: swig -Wextra -w309 will turn on all warnings except 309. 08/28/2007: wsfulton - New debugging options, -debug-module and -debug-top to display the parse tree at various stages, where is a comma separated list of stages 1-4.For example, to display top of parse tree at stages 1 and 3: swig -debug-top 1,3 - Deprecate the following options which have equivalents below: -dump_parse_module => -debug-module 1 -dump_module => -debug-module 4 -dump_parse_top => -debug-top 1 -dump_top => -debug-top 4 - Renamed some commandline options for naming consistency across all options: -debug_template => -debug-template -debug_typemap => -debug-typemap -dump_classes => -debug-classes -dump_tags => -debug-tags -dump_typedef => -debug-typedef -dump_memory => -debug-memory 08/25/2007: olly [PHP5] Fix handling of double or float parameters with an integer default value. 08/25/2007: olly [PHP5] Generate __isset() methods for setters for PHP 5.1 and later. 08/20/2007: wsfulton [Java C#] Fix director bug #1776651 reported by Stephane Routelous which occurred when the director class name is the same as the start of some other symbols used within the director class. 08/17/2007: wsfulton Correct behaviour for templated methods used with %rename or %ignore and the empty template declaration - %template(). A warning is issued if the method has not been renamed. 08/16/2007: mutandiz (Mikel Bancroft) [allegrocl] Name generated cl file based on input file rather than by module name. It was possible to end up with a mypackage.cl and a test_wrap.c when parsing a test.i input file. Confusing. Also, include external-format templates for :fat and :fat-le automatically to avoid these being compiled at runtime. 08/15/2007: efuzzyone [cffi] Apply patch #1766076 from Leigh Smith adding support for newly introduced in cffi :long-long and :unsigned-long-long. 08/10/2007: wsfulton [Java] Add documentation patch #1743573 from Jeffrey Sorensen. It contains a neat idea with respect to better memory management by the JVM of C++ allocated memory. 08/10/2007: wsfulton [Perl] Apply patch #1771410 from Wade Brainerd to fix typedef XS(SwigPerlWrapper) in perlrun.swg for ActiveState Perl build 822 and Perl 5.8.9 and 5.10 branches. 08/10/2007: wsfulton [Lua] const enum reference typemaps fixed. 08/09/2007: wsfulton [C#] Added missing support for C++ class member pointers. 08/09/2007: wsfulton [C#, Java] Add support for $owner in the "out" typemaps like in the scripting language modules. Note that $owner has always been supported in the "javaout" / "csout" typemaps. 08/01/2007: wsfulton Fix smart pointer handling for classes that have templated methods within the smart pointer type. Problem reported by craigdo at ee.washington.edu. 07/31/2007: efuzzyone [cffi] fixed memory access after being freed bug. thanks to Martin Percossi. package name clos changed to cl. thanks to Ralf Mattes 07/24/2007: wsfulton Parallel make support added for the examples and test-suite for developers who have more than one CPU. Now parallel make can be used for checking in addition to building the SWIG executable. Some typical checking examples: make -j8 -k check make -j4 check-java-test-suite make -j2 check-java-examples 07/19/2007: mgossage Fixed bug that stopped configure working on mingw (applied dos2unix to configure.in) 07/10/2007: mgossage [lua] Extra compatibility with Lua 5.1 (updated SWIG_init, docs, examples, test suite) Removed name clash for static link of multiple modules 07/05/2007: mgossage [lua] Fix a bug in SWIG_ALLOC_ARRAY() improved the error messages for incorrect arguments. Changed the output of swig_type() to use the human readable form of the type, rather than the raw swig type. 07/03/2007: wsfulton [C#] Fix directors for some overloaded methods where the imtype resulted in identical methods being generated in the C# director class, eg void foo(int *) and void foo(double *) used to generated two of these: private void SwigDirectorfoo(IntPtr p) { ... } 06/25/2007: wsfulton [Java, C#] Some parameter name changes in std_vector.i allowing better targeting of typemaps for method parameters (for memory management of containers of pointers). 06/07/2007: mutandiz (Mikel Bancroft) [allegrocl] fix foreign-type constructor to properly look for ffitype typemap bindings. fix inout_typemaps.i for strings. 06/06/2007: olly [Ruby] Use whichever of "long" or "long long" is the same size as "void*" to hold pointers as integers, rather than whichever matches off_t. Fixes compilation on OS X and GCC warnings on platforms where sizeof(void*) < sizeof(off_t) (SF patch #1731979). 06/06/2007: olly [PHP5] Fix handling of a particular case involving overloaded functions with default parameters. 06/05/2007: mutandiz (Mikel Bancroft) [allegrocl] Fix case where we'd pass fully qualified identifiers (i.e. NS1::NS2::FOO) to swig-insert-id. All namespaces should be stripped. Fix bug in TypedefHandler introduced by last fix. 06/05/2007: olly Fix reporting of filenames in errors after %include (patch from Leigh Smith in #1731040; also reported as #1699940). 05/31/2007: olly [Python] Fix "missing initialiser" warning when compiling generated C/C++ wrapper code with Python 2.5 with warnings enabled (patch from bug#1727668 from Luke Moore). 05/29/2007: olly [Python] Split docstrings into separate string literals at each newline when generating C/C++ wrapper code (the C/C++ compiler will just combine them back into a single string literal). This avoids MSVC complaining that the strings are too long (problem reported by Bo Peng on the mailing list). 05/28/2007: olly [Python] Escape backslashes in docstrings. 05/26/2007: olly [Python] Fix autodoc generation of enums to be more consistent with how the enums are wrapped - patch #1697226 from Josh Cherry. 05/26/2007: olly [PHP5] Fix wrapping of methods and functions which return a pointer to a class (bug#1700788) and those which have overloaded forms returning both classes and non-classes (bug#1712717, thanks to Simon Berthiaume for the patch). 05/25/2007: wsfulton Fixed %rename inconsistency in conversion operators as reported by Zhong Ren. The matching is now done on the operator name in the same way as it is done for parameters. For example: %rename(opABC) Space::ABC::operator ABC() const; %rename(methodABC) Space::ABC::method(ABC a) const; namespace Space { class ABC { public: void method(ABC a) const {} operator ABC() const { ABC a; return a; } }; } Note that qualifying the conversion operator previously may or may not have matched. Now it definitely won't, so this will not match: %rename(opABC) Space::ABC::operator Space::ABC() const; in the same way that this does not match: %rename(methodABC) Space::ABC::method(Space::ABC a) const; The documentation has been improved with respect to %rename, namespaces and templates. Conversion operators documentation too. *** POTENTIAL INCOMPATIBILITY *** 05/16/2007: mutandiz [allegrocl] Fix bad generation of local var ltype's in functionWrapper(). Try to work better with the backward order in which swig unrolls nested class definitions. cleaned up a little unnecessary code/debug printf's. Remove warning when replacing $ldestructor for ff:foreign-pointer 05/12/2007: olly [Python] swig -python -threads now generates C/C++ code which uses Python's own threading abstraction (from pythread.h) rather than OS specific code. The old code failed to compile on MS Windows. (See SF patch tracker #1710341). 05/04/2007: gga [Ruby] Changed STL renames to be global renames. This fixes STL functions not being renamed when autorename is on. This is a not a totally perfect work-around, but better. Someone really needs to fix the template renaming code. (See bug #1545634) 05/04/2007 gga [All] Changed %rename("%(undercase)s") a little so that single numbers at the end of a function are not undercased. That is: getSomething -> get_something get2D -> get_2d get234 -> get_234 BUT: asFloat2 -> as_float2 (Bug #1699714) 05/03/2007: gga [Ruby] Made __swigtype__ => @__swigtype__ so it can be accessed from the scripting language (and follows Ruby's official documentation, just in case). Made tracking => @__trackings__ for same reason. Currently storing ivars without the @ seems valid, but the PickAxe says this is not correct, so just in case... 05/03/2007: gga [Ruby] Applied patch for -minherit bug and exception classes. This issue should be revisited more closely, as Multiple Inheritance in Ruby is still problematic. (patch/bug #1604878) 05/03/2007: gga [Ruby] Overloaded functions in ruby will now report to the user the possible prototypes when the user mistypes the number or type of a parameter. 05/03/2007: gga [Ruby] Forgot to document the bug fixing of an old bug regarding exceptions. (bug #1458247) 05/03/2007: gga [Ruby] Fixed Ruby documentation to use the proper css styles for each section. Added autodoc section to Ruby's docs to document the features supported by Ruby in documenting its modules. Made rdoc documentation spit out the full name of the class + method name. Albeit this will make the current rdoc not recognize the method, this is still needed to disambiguate between different classes with similar methods (rdoc was created to document the ruby source which only contains one class per c file, unlike swig) I have patched rdoc to make it more friendly to swig. This patch needs to be merged in the ruby std library now. 05/03/2007: gga [Ruby] Changed flag -feature to be -init_name to better reflect its purpose and avoid confusion with -features. 05/03/2007: gga [Ruby] Improved autodoc generation. Added autodoc .swg files to Ruby library for easily adding documentation to common Ruby methods and STL methods. Fixed autodoc documenting of getters and setters and module. Made test suite always generate autodocs. 05/03/2007: gga [Ruby] Removed some warnings from STL and test suite. 05/02/2007: mgossage [Lua] Fixed issues with C++ classes and hierachies across multiple source files. Fixed imports test case & added run test. Added Examples/imports. Added typename for raw lua_State* Added documentation on native functions. 05/02/2007: gga [Ruby] Docstrings are now supported. %feature("autodoc") and %feature("docstring") are now properly supported in Ruby. These features will generate a _wrap.cxx file with rdoc comments in them. 05/02/2007: gga [Ruby] STL files have been upgraded to follow the new swig/python Lib/std conventions. This means std::vector, std::set, std::map, set::multimap, std::multiset, std::deque and std::string are now properly supported, including their iterators, support for containing ruby objects (swig::GC_VALUE) and several other ruby enhancements. std::complex, std::ios, std::iostream, std::iostreambuf and std::sstream are now also supported. std::wstring, std::wios, std::wiostream, std::wiostreambuf and std::wsstream are supported verbatim with no unicode conversion. std_vector.i now mimics the behavior of Ruby Arrays much more closely, supporting slicing, shifting, unshifting, multiple indexing and proper return values on assignment. COMPATABILITY NOTE: this changes the older api a little bit in that improper indexing would previously (incorrectly) raise exceptions. Now, nil is returned instead, following ruby's standard Array behavior. 05/02/2007: gga [Ruby] Changed the value of SWIG_TYPECHECK_BOOL to be 10000 (ie. higher than that of all integers). This is because Ruby allows typecasting integers down to booleans which can make overloaded functions on bools and integers to fail. (bug# 1488142) 05/02/2007: gga [Ruby] Fixed a subtle bug in multiple argouts that could get triggered if the user returned two or more arguments and the first one was an array. 05/01/2007: gga [Ruby] Improved the documentation to document the new features added, add directorin/out/argout typemaps, etc. 05/01/2007: gga [Ruby] Added %initstack and %ignorestack directives for director functions. These allow you to control whether a director function should re-init the Ruby stack. This is sometimes needed for an embedded Ruby where the director method is used as a C++ callback and not called by the user from ruby code. Explanation: Ruby's GC needs to be aware of the running OS stack in order to mark any VALUE (Ruby objects) it finds there to avoid collection of them. This allows the ruby API to be very simple and allows you to write code like "VALUE a = sth" anywhere without needing to do things like refcounting like python. By default, the start of the stack is set when ruby_init() is called. If ruby is inited within main(), as it usually is the case with the main ruby executable, ruby will be able to calculate its stack properly. However, when this is not possible, as when ruby is embedded as a plugin to an application where main is not available, ruby_init() will be called in the wrong place, and ruby will be incorrectly tracking the stack from the function that called ruby_init() forwards only, which can lead to all sorts of weird crashes or to ruby thinking it has run out of stack space incorrectly. To avoid this, director (callback) functions can now be tagged to try to reset the ruby stack, which will solve the issues. NOTE: ruby1.8.6 still contains a bug in it in that its function to reset the stack will not always do so. This bug is triggered very rarely, when ruby is called from two very distinct places in memory, like a branch of main() and another dso. This bug has now been reported to ruby-core and is pending further investigation. (bug #1700535 and patch #1702907) 04/30/2007: wsfulton Fix #1707582 - Restore building from read-only source directories. 04/30/2007: gga [Ruby] Ruby will now report the parameter index properly on type errors as well as the class and value of the incorrect argument passed. (feature request #1699670) 04/30/2007: gga [Ruby] Ruby no longer creates the free_Class function if the class contains its own user defined free function (%freefunc). (bug #1702882) 04/30/2007: gga [Ruby] Made directors raise a ruby exception for incorrect argout returned values if RUBY_EMBEDDED is set, instead of throwing an actual SwigDirector exception. This will prevent crashes when ruby is embedded and unaware of the SwigDirector exception. 04/30/2007: gga [Ruby] Removed the need for -DSWIGEXTERN. Changed swig_ruby_trackings to be a static variable, but also be kept within a hidden instance variable in the SWIG module. This allows properly dealing with trackings across multiple DSOs, which was previously broken. (bug #1700535 and improvement to patch #1702907) 04/29/2007: gga [Ruby] Fixed GC memory issues with trackings that could lead to segfaults when dealing, mainly, with static variables. (bug #1700535 and patch #1702907) 04/29/2007: gga [Ruby] Fixed String conversion using old ruby1.6 macros. Now StringValuePtr() is used if available. This removes warnings when converting strings with \0 in them. (bug #1700535 and patch #1702907) 04/29/2007: gga [Ruby] Fixed the argout count in directors for Ruby. Previously, ignored or "numinputs=0" typemaps would incorrectly not get counted towards the argout count. (bug/patch #1545585) 04/29/2007: gga [Ruby] Upgraded Ruby converter to recognize "numinputs=0". Previously, only the old "ignore" flag was checked (which would currently still work properly, but is deprecated). 04/29/2007: gga [Ruby - but should be made generic] %feature("numoutputs","0") added. This feature allows you to ignore the output of a function so that it is not added to a list of output values ( ie. argouts ). This should also become a feature of %typemap(directorout) as "numoutputs"=0, just like "numinputs"=0 exists. %feature("directors"=1) %include %feature("numoutputs","0") { Class::member_function1 }; %typemap(out) MStatus { // some code, like check mstatus // and raise exception if wrong }; %inline %{ typedef int MStatus; class Class { // one argument returned, but director out code added // MStatus is discarded as a return (out) parameter. virtual MStatus member_function1( int& OUTPUT ); // two arguments returned, director out code added // MStatus is not discarded virtual MStatus member_function2( int& OUTPUT ); }; %} 04/21/2007: olly Fix parsing of float constants with an exponent (e.g. 1e-02f) (bug #1699646). 04/20/2007: olly [Python] Fix lack of generation of docstrings when -O is used. Also, fix generation of docstrings containing a double quote character. Patch from Richard Boulton in bug#1700146. 04/17/2007: wsfulton [Java, C#] Support for adding in Java/C# code before and after the intermediary call, specifically related to the marshalling of the proxy type to the intermediary type. The javain/csin typemap now supports the 'pre' and 'post' attributes to achieve this. The javain typemap also supports an optional 'pgcppname' attribute for premature garbage collection prevention parameter naming and the csin typemap supports an optional 'cshin' attribute for the parameter type used in a constructor helper generated when the type is used in a constructor. Details in the Java.html and CSharp.html documentation. 04/16/2007: olly Don't treat `restrict' as a reserved identifier in C++ mode (bug#1685534). 04/16/2007: olly [PHP5] Fix how zend_throw_exception() is called (bug #1700785). 04/10/2007: olly Define SWIGTEMPLATEDISAMBIGUATOR to template for aCC (reported on swig-user that this is needed). 04/04/2007: olly [PHP5] If ZTS is enabled, release _globals_id in MSHUTDOWN to avoid PHP interpreter crash on shutdown. This solution was suggested here: http://bugs.php.net/bug.php?id=40985 04/03/2007: olly [PHP4] Add missing ZTS annotations to generated C++ wrapper code to fix compilation failures when using ZTS enabled SWIG (Linux distributions tend to disable ZTS, but notably the Windows build uses it by default). 04/01/2007: efuzzyone [CFFI] Patch #1684261: fixes handling of unsigned int literals, thanks Leigh Smith. Also, improved documentation. 03/30/2007: olly Avoid generating '<:' token when using SwigValueWrapper<> on a type which starts with '::' (patch #1690948). 03/25/2007: wuzzeb (John Lenz) [perl5] Add SWIG_fail to the SWIG_exception macro. Fixes a few problems reported on the mailing list. 03/23/2007: wsfulton String copying patch from Josh Cherry reducing memory consumption by about 25%. 03/21/2007: wsfulton [Java] Apply patch #1631987 from Ulrik Peterson - bool INOUT typemaps fail on big endian machines. 03/16/2007: wsfulton Fix seg fault given dodgy C++ code: namespace abc::def { } 03/16/2007: wsfulton [Java] Fixes so that ARRAYSOFCLASSES and ARRAYSOFENUMS in arrays_java.i can be applied to pointer types. 03/03/2007: olly [PHP5] When we know the literal numeric value for a constant, use that to initialise the const member in the PHP wrapper class. 03/02/2007: olly [PHP5] Fix PHP wrapper code generated for certain cases of overloaded forms with default arguments. 02/26/2007: efuzzyone [CFFI] Patch #1656395: fixed hex and octal values bug, thanks to Arthur Smyles. 02/22/2007: mgossage [Lua] Fixed bug in typemaps which caused derived_byvalue and rname test cases to fail. Updated derived_byvalue.i to explain how to find and fix the problem 01/25/2007: wsfulton Fix #1538522 and #1338527, forward templated class declarations without a name for the templated class parameters, such as: template class X; 01/23/2007: mgossage [Lua] Patch #1640862: replaced by Patch #1598063 Typo in typemaps.i 01/22/2007: mgossage [Lua] Added a lua specific carrays.i which adds the operator[] support. modified the main code to make it not emit all the class member functions & accessors Note: C structs are created using new_XXX() while C++ classes use XXX() (should be standardised) Updated test case: li_carrays Updated the documentation. 01/12/2007: wsfulton [Php] Add support for newfree typemaps (sometimes used by %newobject) 01/12/2007: beazley New command line option -macroerrors. When supplied, this will force the C scanner/parser to report proper location information for code contained inside SWIG macros (defined with %define). By default, SWIG merely reports errors on the line at which a macro is used. With this option, you can expand the error back to its source---something which may simplify debugging. 01/12/2007: beazley [Internals] Major overhaul of C/C++ scanning implementation. For quite some time, SWIG contained two completely independent C/C++ tokenizers-- the legacy scanner in CParse/cscanner.c and a general purpose scanner in Swig/scanner.c. SWIG still has two scanning modules, but the C parser scanner (CParse/cscanner.c) now relies upon the general purpose scanner found in Swig/scanner.c. As a result, it is much smaller and less complicated. This change also makes it possible to maintain all of the low-level C tokenizing in one central location instead of two places as before. ***POTENTIAL FLAKINESS*** This change may cause problems with accurate line number reporting as well as error reporting more generally. I have tried to resolve this as much as possible, but there might be some corner cases. 01/12/2007: mgossage [Lua] Added typemap throws for std::string*, typemap for SWIGTYPE DYNAMIC, changed the existing throws typemap to throw a string instead of making a copy of the object (updating a few test cases to deal with the change). fixed test case: dynamic_casts, exception_partial_info, li_std_string, size_t 01/03/2007: beazley [Internals]. Use of swigkeys.c/.h variables is revoked. Please use simple strings for attribute names. 12/30/2006: beazley Internal API functions HashGetAttr() and HashCheckAttr() have been revoked. Please use Getattr() to retrieve attributes. The function Checkattr() can be used to check attributes. Note: These functions have been revoked because they only added a marginal performance improvement at the expense code clarity. 12/26/2006: mgossage [Lua] Added more STL (more exceptions, map, size_t), fixed test case: conversion_ns_template. 12/21/2006: mgossage [Lua] Update to throw errors when setting immutables, and allowing user addition of module variables. 12/20/2006: wsfulton Fix typedef'd variable wrappers that use %naturalvar, eg, std::string. 12/14/2006: wsfulton [C#] Add std::wstring and wchar_t typemaps 12/14/2006: olly [php] Fix bug #1613673 (bad PHP5 code generated for getters and setters). 12/02/2006: wsfulton, John Lenz, Dave Beazley Move from cvs to Subversion for source control 11/30/2006: beazley Cleaned up swigwarnings.swg file not to use nested macro definitions. 11/12/2006: wsfulton [Java, C#] Fix for %extend to work for static member variables. Version 1.3.31 (November 20, 2006) ================================== 11/12/2006: Luigi Ballabio [Python] Alternate fix for Python exceptions bug #1578346 (the previous one broke Python properties in modern classes) 11/12/2006: wsfulton -fakeversion commandline option now generates the fake version into the generated wrappers as well as displaying it when the -version commandline option is used. 14/11/2006: mgossage [lua] update to typemap for object by value, to make it c89 compliant Version 1.3.30 (November 13, 2006) ================================== 11/12/2006: wsfulton [java] Remove DetachCurrentThread patch from 08/11/2006 - it causes segfaults on some systems. 11/12/2006: wsfulton [python] Fix #1578346 - Python exceptions with -modern 11/10/2006: wsfulton Fix #1593291 - Smart pointers and inheriting from templates 11/09/2006: wsfulton Fix director operator pointer/reference casts - #1592173. 11/07/2006: wsfulton Add $self special variable for %extend methods. Please use this instead of just 'self' as the C++ 'this' pointer. 11/07/2006: mutandiz [allegrocl] allegrocl.swg: swig-defvar updated to allow specifying of non-default foreign type (via :ftype keyword arg). allegrocl.cxx: Specify proper access type for enum values. 11/03/2006: wsfulton [Java/C#] Fix const std::string& return types for directors as reported by Mark Donselzmann 10/29/2006: wsfulton [Java] Remove DeleteLocalRef from end of director methods for now as it is causing a seg fault when run on Solaris 8. 10/29/2006: wuzzeb (John Lenz) [Guile] Patch from Chris Shoemaker to clean up some warnings in the generated code. 10/29/2006: wsfulton [Java] Important fix to prevent early garbage collection of the Java proxy class while it is being used in a native method. The finalizer could destroy the underlying C++ object while it was being used. The problem occurs when the proxy class is no longer strongly reachable after a native call. The problem seems to occur in memory stress situations on some JVMs. It does not seem to occur on the Sun client JVM up to jdk 1.5. However the 1.6 client jdk has a more aggressive garbage collector and so the problem does occur. It does occur on the Sun server JVMs (certainly 1.4 onwards). The fix entails passing the proxy class into the native method in addition to the C++ pointer in the long parameter, as Java classes are not collected when they are passed into JNI methods. The extra parameter can be suppressed by setting the nopgcpp attribute in the jtype typemap to "1" or using the new -nopgcpp commandline option. See Java.html#java_pgcpp for further details on this topic. 10/24/2006: wsfulton [C#] Fix smart pointer wrappers. The virtual/override/new keyword is not generated for each method as the smart pointer class does not mirror the underlying pointer class inheritance hierarchy. SF #1496535 10/24/2006: mgossage [lua] added support for native methods & member function pointers. fixed test cases arrays_dimensionless & cpp_basic. Added new example (functor). tidied up a little of the code (around classHandler). 10/17/2006: wsfulton [C#, Java] directorout typemap changes to fall in line with the other director languages. $result is now used where $1 used to be used. Please change your typemaps if you have a custom directorout typemap. 10/18/2006: wsfulton Some fixes for applying the char array typemaps to unsigned char arrays. 10/17/2006: wsfulton [C#, Java] Add in const size_t& and const std::size_t& typemaps. 10/15/2006: efuzzyone [CFFI] Suppress generating defctype for enums, thanks to Arthur Smyles. Patch 1560983. 10/14/2006: wuzzeb (John Lenz) [Chicken] Minor fix to make SWIG work with the (as yet unreleased) chicken 2.5 [Guile,Chicken] Fix SF Bug 1573892. Added an ext_test to the test suite to test this bug, but this test can not really be made generic because the external code must plug into the target language interpreter directly. See Examples/test-suite/chicken/ext_test.i and ext_test_external.cxx Added a %.externaltest to common.mk, and any interested language modules can copy and slightly modify either the chicken or the guile ext_test.i 10/14/2006: mgossage [Lua] added OUTPUT& for all number types, added a long long type fixed several test cases. update: changed typemaps to use SWIG_ConvertPtr rather than SWIG_MustGetPointer started spliting lua.swg into smaller parts to make it neater 10/13/2006: wsfulton [C#, Java] Marginally better support for multiple inheritance only in that you can control what the base class is. This is done using the new 'replace' attribute in the javabase/csbase typemap, eg in the following, 'Me' will be the base class, no matter what Foo is really derived from in the C++ layer. %typemap(javabase, replace="1") Foo "Me"; %typemap(csbase, replace="1") Foo "Me"; Previously it was not possible for the javabase/csbase typemaps to override the C++ base. 10/12/2006: wsfulton [Java] Remove potential race condition on the proxy class' delete() method (it is now a synchronized method, but is now customisable by changing the methodmodifiers attribute in the javadestruct or javadestruct_derived typemap) [C#] Remove potential race condition on the proxy class' Dispose() method, similar to Java's delete() above. *** POTENTIAL INCOMPATIBILITY *** 10/12/2006: wsfulton [Ruby, Python] Remove redundant director code in %extend methods (%extend methods cannot be director methods) 10/12/2006: wsfulton [Ruby, Python] Fix #1505594 - director objects not returned as director objects in %extend methods. 10/11/2006: wsfulton [Java] Fix #1238798 - Directors using unsigned long long or any other type marshalled across the JNI boundary using a Java class (where the jni typemap contains jobject). 10/06/2006: wsfulton Fix #1162194 - #include/%include within a structure 10/06/2006: wsfulton Fix #1450661, string truncation in String_seek truncating Java/C# enums. 10/06/2006: mgossage [Lua] Fix #1569587. The name is now correct. 10/04/2006: wsfulton Director fixes for virtual conversion operators 10/04/2006: olly [php] Fix #1569587 for PHP. Don't use sizeof() except with string literals. Change some "//" comments to "/* */" for portability. 10/04/2006: mgossage [Lua] Partial Fix #1569587. The type is now correct, but the name is still not correct. 10/03/2006: wsfulton [Ruby] Fix #1527885 - Overloaded director virtual methods sometimes produced uncompilable code when used with the director:except feature. 10/03/2006: wsfulton Directors: Directors are output in the order in which they are declared in the C++ class rather than in some pseudo-random order. 10/03/2006: mmatus Fix #1486281 and #1471039. 10/03/2006: olly [Perl] Fix for handling strings with zero bytes from Stephen Hutsal. 09/30/2006: efuzzyone [CFFI] Bitfield support and vararg support due to Arthur Smyles. C expression to Lisp conversion, thanks to Arthur Smyles for the initial idea, it now supports conversion for a whole range of C expressions. 09/28/2006: wsfulton Fix #1508327 - Overloaded methods are hidden when using -fvirtual optimisation. Overloaded methods are no longer candidates for elimination - this mimics C++ behaviour where all overloaded methods must be defined and implemented in a derived class in order for them to be available. 09/25/2006: wsfulton [Ruby, Python, Ocaml] Fix #1505591 Throwing exceptions in extended directors 09/25/2006: wsfulton Fix #1056100 - virtual operators. 09/24/2006: olly Don't accidentally create a "<:" token (which is the same as "[" in C++). Fixes bug # 1521788. 09/23/2006: olly [Ruby] Support building with recent versions of the Ruby 1.9 development branch. Fixes bug #1560092. 09/23/2006: olly Templates can now be instantiated using negative numbers and constant expressions, e.g.: template class x {}; %template(x_minus1) x<-1>; %template(x_1plus2) x<1+2>; Also, constant expressions can now include comparisons (>, <, >=, <=, !=, ==), modulus (%), and ternary conditionals (a ? b : c). Fixes bugs #646275, #925555, #956282, #994301. 09/22/2006: wsfulton Fix %ignore on director methods - Bugs #1546254, #1543533 09/20/2006: wsfulton Fix %ignore on director constructors 09/20/2006: wsfulton Fix seg faults and asserts when director methods are ignored (#1543533) 09/20/2006: wsfulton Fix out of source builds - bug #1544718 09/20/2006: olly Treat a nested class definition as a forward declaration rather than ignoring it completely, so that we generate correct code for passing opaque pointers to the nested class (fixes SF bug #909387). 09/20/2006: olly *** POTENTIAL INCOMPATIBILITY *** [php] Overload resolution now works. However to allow this, SWIG generated wrappers no longer coerce PHP types (which reverts a change made in 1.3.26). So for example, if a method takes a string, you can no longer pass a number without explicitly converting it to a string in PHP using: (string)x 09/18/2006: mgossage [ALL] fix on swiginit.swg, has been reported to crash on several test cases found and fixed problem in imports under python (mingw) 09/16/2006: wsfulton [Python] Patch from Michal Marek for Python 2.5 to fix 64 bit array indexes on 64 bit machines. 09/13/2006: wsfulton The explicitcall feature has been scrapped. This feature was introduced primarily to solve recursive director method calls. Director upcall improvements made instead: [Python, Ruby, Ocaml] The swig_up flag is no longer used. The required mutexes wrapping this flag are also no longer needed. The recursive calls going from C++ to the target language and back again etc are now avoided by a subtlely different approach. Instead of using the swig_up flag in each director method to indicate whether the explicit C++ call to the appropriate base class method or a normal polymorphic C++ call should be made, the new approach makes one of these calls directly from the wrapper method. [Java, C#] The recursive call problem when calling a C++ base class method from Java/C# is now fixed. The implementation is slightly different to the other languages as the detection as to whether the explicit call or a normal polymorphic call is made in the Java/C# layer rather than in the C++ layer. 09/11/2006: mgossage [ALL] updated swiginit.swg to allow multiple interpreters to use multiple swig modules at once. This has been tested in Lua (mingw & linux), perl5 & python (linux) only. 09/11/2006: mgossage [lua] added support for passing function pointers as well as native lua object into wrappered function. Added example funcptr3 to demonstrate this feature 09/05/2006: olly [php] Rename ErrorCode and ErrorMsg #define-s to SWIG_ErrorCode and SWIG_ErrorMsg to avoid clashes with code the user might be wrapping (patch from Darren Warner in SF bug #1466086). Any user typemaps which use ErrorCode and/or ErrorMsg directly will need adjusting - you can easily fix them to work with both old and new SWIG by changing to use SWIG_ErrorMsg and adding: #ifndef SWIG_ErrorMsg #define SWIG_ErrorMsg() ErrorMsg() #endif 08/29/2006: olly [php] Move constant initialisation from RINIT to MINIT to fix a warning when using Apache and mod_php. We only need to create PHP constants once when we're first initialised, not for every HTTP request. 08/21/2006: mgossage [Lua] Bugfix #1542466 added code to allow mapping Lua nil's <-> C/C++ NULL's updated various typemaps to work correctly with the changes added voidtest_runme.lua to show the features working 08/19/2006: wuzzeb (John Lenz) [Guile] Add feature:constasvar to export constants as variables instead of functions that return the constant value. 08/11/2006: wsfulton [Java] DetachCurrentThread calls have been added so that natively created threads no longer prevent the JVM from exiting. Bug reported by Thomas Dudziak and Paul Noll. 08/10/2006: wsfulton [C#] Fix director protected methods so they work 07/25/2006: mutandiz [allegrocl] more additions to std::string, some tweaks and small bug fixes -nocwrap mode. 07/21/2006: mgossage [Lua] Bugfix #1526022 pdated std::string to support strings with '\0' inside them updated typemaps.i to add support for pointer to pointers 07/19/2006: mutandiz [allegrocl] - Add std_string.i support. - Add newobject patch submitted by mkoeppe (thanks!) - Fix type name mismatch issue for nested type definitions. specifically typedefs in templated class defns. 07/18/2006: mgossage Bugfix #1522858 updated lua.cxx to support -external-runtime command 07/14/2006: wuzzeb (John Lenz) Increment the SWIG_RUNTIME_VERSION to 3, because of the addition of the owndata member in swig_type_info. Reported by: Prabhu Ramachandran 07/05/2006: wsfulton Search path fixes: - Fix search path for library files to behave as documented in Library.html. - Fix mingw/msys builds which did not find the SWIG library when installed. - Windows builds also output the mingw/msys install location when running swig -swiglib. - The non-existent and undocumented config directory in the search path has been removed. 07/05/2006: wsfulton Fix $symname special variable expansion. 07/04/2006: wuzzeb (John Lenz) [Chicken] Add %feature("constasvar"), which instead of exporting a constant as a scheme function, exports the constant as a scheme variable. Update the documentation as well. 07/04/2006: wsfulton [See entry of 09/13/2006 - explicitcall feature and documentation to it removed] New explicitcall feature which generates additional wrappers for virtual methods that call the method explicitly, not relying on polymorphism to make the method call. The feature is a feature flag and is enabled like any other feature flag. It also recognises an attribute, "suffix" for mangling the feature name, see SWIGPlus.html#SWIGPlus_explicitcall documentation for more details. [Java, C#] The explicitcall feature is also a workaround for solving the recursive calls problem when a director method makes a call to a base class method. See Java.html#java_directors_explicitcall for updated documentation. 06/28/2006: joe (Joseph Wang) [r] Initial support for R 06/20/2006: wuzzeb (John Lenz) [Chicken] Minor fixes to get apply_strings.i testsuite to pass Remove integers_runme.scm from the testsuite, because SWIG and Chicken does handle overflows. 06/19/2005: olly [php] Add support for generating PHP5 class wrappers for C++ classes (use "swig -php5"). 06/17/2006: olly [php] Added some missing keywords to the PHP4 keyword list, and fixed __LINE__ and __FILE__ which were in the wrong category. Also added all the keywords new in PHP5, and added comments noting the PHP4 keywords which aren't keywords in PHP5. 06/17/2006: olly [php] Don't segfault if PHP Null is passed as this pointer (e.g. Class_method(Null)) - give a PHP Error instead. 06/15/2006: mutandiz [allegrocl] Add initial support for std::list container class. Fix a few bugs in helper functions. 05/13/2006: wsfulton [Java] Replace JNIEXPORT with SWIGEXPORT, thereby enabling the possibility of using gcc -fvisibility=hidden for potentially smaller faster loading wrappers. 05/13/2006: wsfulton Fix for Makefiles for autoconf-2.60 beta 05/13/2006: wsfulton Vladimir Menshakov patch for compiling wrappers with python-2.5 alpha. 05/12/2006: wsfulton Fix buffer overflow error when using large %feature(docstring) reported by Joseph Winston. 05/12/2006: wsfulton [Perl] Operator overload fix from Daniel Moore. 05/25/2006: mutandiz [allegrocl] Fix bug in generation of CLOS type declarations for unions and equivalent types. 05/24/2006: mutandiz [allegrocl] Don't require a full class definition to generate a CLOS wrapper. 05/20/2006: olly [php] GCC Visibility support now works with PHP. 05/19/2006: olly [php] Removed support for -dlname (use -module instead). Fixed naming of PHP extension module to be consistent with PHP conventions (no "php_" prefix on Unix; on PHP >= 4.3.0, handle Unix platforms which use something other than ".so" as the extension.) 05/13/2006: wsfulton [C#] Director support added 05/07/2006: olly [php] Don't segfault if PHP Null is passed where a C++ reference is wanted. 05/05/2006: olly [php] Fix wrappers generated for global 'char' variables to not include a terminating zero byte in the PHP string. 05/03/2006: wsfulton Modify typemaps so that char * can be applied to unsigned char * or signed char * types and visa versa. 05/03/2006: efuzzyone [cffi]Thanks to Luke J Crook for this idea. - a struct/enum/union is replaced with :pointer only if that slot is actually a pointer to that type. So,: struct a_struct { int x; } and struct b_struct { a_struct struct_1; }; will be converted as: (cffi:defcstruct b_struct (struct_1 a_struct)) - Other minor fixes in lispifying names. 05/02/2006: wsfulton Fix possible redefinition of _CRT_SECURE_NO_DEPRECATE for VC++. 04/14/2006: efuzzyone [cffi] Thanks to Thomas Weidner for the patch. - when feature export is set (export 'foo) is generated for every symbol - when feature inline is set (declaim (inline foo)) is generated before every function definition - when feature intern_function is set #.(value-of-intern-function "name" "nodeType" package) is emitted instead of the plain symbol. A sample swig-lispify is provided. - every symbol is prefixed by it's package. 04/13/2006: efuzzyone [cffi] Fixed the generation of wrappers for global variables. Added the option [no]swig-lisp which turns on/off generation of code for swig helper lisp macro, functions, etc. Version 1.3.29 (March 21, 2006) =============================== 04/05/2006: mutandiz [allegrocl] Fix output typemap of char so it produces a character instead of an integer. Also adds input/output typemaps for 'char *'. add command-line argument -isolate to generate an interface file that won't interfere with other SWIG generated files that may be used in the same application. 03/20/2005: mutandiz [allegrocl] More tweaks to INPUT/OUTPUT typemaps for bool. Fix constantWrapper for char and string literals. find-definition keybindings should work in ELI/SLIME. Output (in-package ) to lisp wrapper instead of (in-package #.*swig-module-name*). slight rework of multiple return values. doc updates. 03/17/2005: mutandiz [allegrocl] mangle names of constants generated via constantWrapper. When using OUTPUT typemaps and the function has a non-void return value, it should be first in the values-list, followed by the OUTPUT mapped values. Fix bug with boolean parameters, which needed to be passed in as int values, rather than T or NIL. 03/15/2006: mutandiz [allegrocl] Generate wrappers for constants when in C++ or -cwrap mode. Make -cwrap the default, since it is most correct. Users can use the -nocwrap option to avoid the creation of a .cxx file when interfacing to C code. When in -nocwrap mode, improve the handling of converting infix literals to prefix notation for lisp. This is very basic and not likely to be improved upon since this only applies to the -nocwrap case. Literals we can't figure out will result in a warning and be included in the generated code. validIdentifier now more closely approximates what may be a legal common lisp symbol. Fix typemap error in allegrocl.swg 03/12/2006: mutandiz [allegrocl] fix up INPUT/OUTPUT typemaps for bool. Generate c++ style wrapper functions for struct/union members when -cwrap option specified. 03/10/2006: mutandiz [allegrocl] Fix bug in C wrapper generation introduced by last allegrocl commit. 03/10/2006: wsfulton [Java] Commit #1447337 - Delete LocalRefs at the end of director methods to fix potential leak 03/10/2006: wsfulton Fix #1444949 - configure does not honor --program-prefix. Removed non-standard configure option --with-release-suffix. Fix the autoconf standard options --program-prefix and --program-suffix which were being shown in the help, but were being ignored. Use --program-suffix instead of --with-release-suffix now. 03/10/2006: wsfulton [Java] Fix #1446319 with patch from andreasth - more than one wstring parameter in director methods 03/07/2006: mkoeppe [Guile] Fix for module names containing a "-" in non-"shadow" mode. Patch from Aaron VanDevender (#1441474). 03/04/2006: mmatus - Add -O to the main program, which now enables -fastdispatch [Python] - Add the -fastinit option to enable faster __init__ methods. Setting 'this' as 'self.this.append(this)' in the python code confuses PyLucene. Now the initialization is done in the the C++ side, as reported by Andi and Robin. - Add the -fastquery option to enable faster SWIG_TypeQuery via a python dict cache, as proposed by Andi Vajda - Avoid to call PyObject_GetAttr inside SWIG_Python_GetSwigThis, since this confuses PyLucene, as reported by Andi Vajda. 03/02/2006: wsfulton [Java] Removed extra (void *) cast when casting pointers to and from jlong as this was suppressing gcc's "dereferencing type-punned pointer will break strict-aliasing rules" warning. This warning could be ignored in versions of gcc prior to 4.0, but now the warning is useful as gcc -O2 and higher optimisation levels includes -fstrict-aliasing which generates code that doesn't work with these casts. The assignment is simply never made. Please use -fno-strict-aliasing to both suppress the warning and fix the bad assembly code generated. Note that the warning is only generated by the C compiler, but not the C++ compiler, yet the C++ compiler will also generate broken code. Alternatively use -Wno-strict-aliasing to suppress the warning for gcc-3.x. The typemaps affected are the "in" and "out" typemaps in java.swg and arrays_java.swg. Users ought to fix their own typemaps to do the same. Note that removal of the void * cast simply prevents suppression of the warning for the C compiler and nothing else. Typical change: From: %typemap(in) SWIGTYPE * %{ $1 = *($&1_ltype)(void *)&$input; %} To: %typemap(in) SWIGTYPE * %{ $1 = *($&1_ltype)&$input; %} From: %typemap(out) SWIGTYPE * %{ *($&1_ltype)(void *)&$result = $1; %} To: %typemap(out) SWIGTYPE * %{ *($&1_ltype)&$result = $1; %} 03/02/2006: mkoeppe [Guile -scm] Add typemaps for "long long"; whether the generated code compiles, however, depends on the version and configuration of Guile. 03/02/2006: wsfulton [C#] Add support for inner exceptions. If any of the delegates are called which construct a pending exception and there is already a pending exception, it will create the new exception with the pending exception as an inner exception. 03/02/2006: wsfulton [Php] Added support for Php5 exceptions if compiling against Php5 (patch from Olly Betts). 03/01/2006: mmatus Use the GCC visibility attribute in SWIGEXPORT. Now you can compile (with gcc 3.4 or later) using CFLAGS="-fvisibility=hidden". Check the difference for the 'std_containers.i' python test case: Sizes: 3305432 _std_containers.so 2383992 _std_containers.so.hidden Exported symbols (nm -D .so | wc -l): 6146 _std_containers.so 174 _std_containers.so.hidden Execution times: real 0m0.050s user 0m0.039s sys 0m0.005s _std_containers.so real 0m0.039s user 0m0.026s sys 0m0.007s _std_containers.so.hidden Read http://gcc.gnu.org/wiki/Visibility for more details. 02/27/2006: mutandiz [allegrocl] Add support for INPUT, OUTPUT, and INOUT typemaps. For OUTPUT variables, the lisp wrapper returns multiple values. 02/26/2006: mmatus [Ruby] add argcargv.i library file. Use it as follow: %include argcargv.i %apply (int ARGC, char **ARGV) { (size_t argc, const char **argv) } %inline { int mainApp(size_t argc, const char **argv) { return argc; } } then in the ruby side: args = ["asdf", "asdf2"] n = mainApp(args); This is the similar to the python version Lib/python/argcargv.i 02/24/2006: mgossage Small update Lua documents on troubleshooting problems 02/22/2006: mmatus Fix all the errors reported for 1.3.28. - fix bug #1158178 - fix bug #1060789 - fix bug #1263457 - fix 'const char*&' typemap in the UTL, reported by Geoff Hutchison - fixes for python 2.1 and the runtime library - fix copyctor + template bug #1432125 - fix [ 1432152 ] %rename friend operators in namespace - fix gcc warning reported by R. Bernstein - avoid assert when finding a recursive scope inheritance, emit a warning in the worst case, reported by Nitro - fix premature object deletion reported by Paul in tcl3d - fix warning reported by Nitro in VC7 - more fixes for old Solaris compiler - fix for python 2.3 and gc_refs issue reported by Luigi - fix fastproxy for methods using kwargs - fix overload + protected member issue reported by Colin McDonald - fix seterrormsg as reported by Colin McDonald - fix directors, now the test-suite runs again using -directors - fix for friend operator and Visual studio and bug 1432152 - fix bug #1435090 - fix using + %extend as reported by William - fix bug #1094964 - fix for Py_NotImplemented as reported by Olly and Amaury - fix nested namespace issue reported by Charlie and also: - allow director protected members by default - delete extra new lines in swigmacros[UTL] - cosmetic for generated python code - add the factory.i library for UTL - add swigregister proxy method and move __repr__ to a single global module [python] 02/22/2006: mmatus When using directors, now swig will emit all the virtual protected methods by default. In previous releases, you needed to use the 'dirprot' option to achieve the same. If you want, you can disable the new default behaviour, use the 'nodirprot' option: swig -nodirprot ... and/or the %nodirector feature for specific methods, i.e.: %nodirector Foo::bar; struct Foo { virtual ~Foo(); protected: virtual void bar(); }; As before, pure abstract protected members are allways emitted, independent of the 'dirprot/nodirprot' options. 02/22/2006: mmatus Add the factory.i library for languages using the UTL (python,tcl,ruby,perl). factory.i implements a more natural wrap for factory methods. For example, if you have: ---- geometry.h -------- struct Geometry { enum GeomType{ POINT, CIRCLE }; virtual ~Geometry() {} virtual int draw() = 0; // // Factory method for all the Geometry objects // static Geometry *create(GeomType i); }; struct Point : Geometry { int draw() { return 1; } double width() { return 1.0; } }; struct Circle : Geometry { int draw() { return 2; } double radius() { return 1.5; } }; // // Factory method for all the Geometry objects // Geometry *Geometry::create(GeomType type) { switch (type) { case POINT: return new Point(); case CIRCLE: return new Circle(); default: return 0; } } ---- geometry.h -------- You can use the %factory with the Geometry::create method as follows: %newobject Geometry::create; %factory(Geometry *Geometry::create, Point, Circle); %include "geometry.h" and Geometry::create will return a 'Point' or 'Circle' instance instead of the plain 'Geometry' type. For example, in python: circle = Geometry.create(Geometry.CIRCLE) r = circle.radius() where 'circle' now is a Circle proxy instance. 02/17/2006: mkoeppe [MzScheme] Typemaps for all integral types now accept the full range of integral values, and they signal an error when a value outside the valid range is passed. [Guile] Typemaps for all integral types now signal an error when a value outside the valid range is passed. 02/13/2006: mgossage [Documents] updated the extending documents to give a skeleton swigging code with a few typemaps. [Lua] added an extra typemap for void* [in], so a function which requires a void* can take any kind of pointer Version 1.3.28 (February 12, 2006) ================================== 02/11/2006: mmatus Fix many issues with line counting and error reports. 02/11/2006: mmatus [Python] Better static data member support, if you have struct Foo { static int bar; }; then now is valid to access the static data member, ie: f = Foo() f.bar = 3 just as in C++. 02/11/2006: wsfulton [Perl] Fixed code generation to work again with old versions of Perl (5.004 and later tested) 02/04/2006: mmatus [Python] Add the %extend_smart_pointer() directive to extend SWIG smart pointer support in python. For example, if you have a smart pointer as: template class RCPtr { public: ... RCPtr(Type *p); Type * operator->() const; ... }; you use the %extend_smart_pointer directive as: %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; then, if you have something like: RCPtr make_ptr(); int foo(A *); you can do the following: a = make_ptr(); b = foo(a); ie, swig will accept a RCPtr object where a 'A *' is expected. Also, when using vectors %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; %template(vector_A) std::vector >; you can type a = A(); v = vector_A(2) v[0] = a ie, an 'A *' object is accepted, via implicit conversion, where a RCPtr object is expected. Additionally x = v[0] returns (and sets 'x' as) a copy of v[0], making reference counting possible and consistent. %extend_smart_pointer is just a collections of new/old tricks, including %typemaps and the new %implicitconv directive. 02/02/2006: mgossage bugfix #1356577, changed double=>lua_number in a few places. added the std::pair wrapping 01/30/2006: wsfulton std::string and std::wstring member variables and global variables now use %naturalvar by default, meaning they will now be wrapped as expected in all languages. Previously these were wrapped as a pointer rather than a target language string. It is no longer necessary to add the following workaround to wrap these as strings: %apply const std::string & { std::string *} *** POTENTIAL INCOMPATIBILITY *** 01/28/2006: mkoeppe [Guile -scm] Add typemaps for handling of member function pointers. 01/24/2006: mmatus - Better support for the %naturalvar directive, now it works with the scripting languages as well as Java/C#. Now, it can also be applied to class types: %naturalvar std::string; %include that will tell swig to use the 'natural' wrapping mechanism to all std::string global and member variables. - Add support for the %allowexcept feature along the scripting languages, which allows the %exception feature to be applied to the variable access methods. Also, add the %exceptionvar directive to specify a distintic exception mechanism only for variables. - Add more docs for the %delobject directive to mark a method as a destructor, 'disowning' the first argument. For example: %newobject create_foo; %delobject destroy_foo; Foo *create_foo() { return new Foo(); } void destroy_foo(Foo *foo) { delete foo; } or in a member method as: %delobject Foo::destroy; class Foo { public: void destroy() { delete this;} private: ~Foo(); }; 01/24/2006: mgossage [Lua] - Removed the type swig_lua_command_info & replace with luaL_reg (which then broke the code), fixed this - added an additional cast in the typemaps for enum's due to the issue that VC.Net will not allow casting of a double to an enum directly. Therefore cast to int then to enum (thanks to Jason Rego for this observation) 01/16/2006: mmatus (Change disabled... will be back in CVS soon) Add initial support for regexp via the external library RxSpencer. SWIG doesn't require this library to compile and/or run. But if you specify --with-rxspencer, and the library is found during installation, then swig will use it in three places: - In %renames rules, via the new rxsmatch rules, for example: %rename("%(lowercase)",rxsmatch$name="GSL_.*") ""; %rename("%(lowercase)",rxsmatch$nodeType="enum GSL_.*") ""; rxsmatch is similar to the match rule, it just uses the RxSpencer regexp library to decide if there is a match with the provided regexp. As with the match rule, you can also use the negate rule notrxsmatch. - In the %rename target name via the rxstarget option, for example: %rename("%(lowercase)",rxstarget=1) "GSL_.*"; where the target name "GSL.*" is now understood as a regexp to be matched. - In the new encoder "rxspencer", which looks like: %(rxspencer:[regexp][replace])s where "regexp" is the regular expression and "replace" is a string used as a replacement, where the @0,@1,...,@9 pseudo arguments are used to represent the corresponding matching items in the reg expression. For example: %(rxspencer:[GSL.*][@0])s <- Hello -> %(rxspencer:[GSL.*][@0])s <- GSLHello -> GSLHello %(rxspencer:[GSL(.*)][@1])s <- GSLHello -> Hello %(rxspencer:[GSL(.*)][gsl@1])s <- GSLHello -> gslHello Another example could be: %rename("%(lowercase)s",sourcefmt="%(rxspencer:[GSL_(.*)][@1])s",%$isfunction) ""; which take out the prefix "GSL_" and returns all the function names in lower cases, as following: void GSL_Hello(); -> hello(); void GSL_Hi(); -> hi(); const int GSL_MAX; -> GSL_MAX; // no change, is not a function We use the RxSpencer as an initial test bed to implemention while we decide which library will be finally added to swig. You can obtain the RxSpencer library from http://arglist.com/regex (Unix) or http://gnuwin32.sourceforge.net/packages.html (Windows) Once installed, use "man rxspencer" to get more info about the regexp format, or just google rxspencer. Since now you can enable the rxsmatch rules (see above), the simple or '|' support for the match rules (01/12/2006: mmatus) is disabled. Still, if you have problems with the rxspencer library, you can re-enable the simple 'match or' support using -DSWIG_USE_SIMPLE_MATCHOR. 01/16/2006: mmatus Change the %rename predicates to use the prefix '%$', as in: %rename("%(utitle)s",%$isfunction,%$ismember) ""; to avoid clashes with other swig macros/directives. 01/14/2006: cfisavage [Ruby] Added support for Ruby bang! methods via a new %bang feature. Bang methods end in exclamation points and indicate that the object being processed will be modified in-place as opposed to being copied. 01/12/2006: cfisavage [Ruby] Updated the Ruby module to automatically convert method names to lower_case_with_underscores using the new %rename functionality. 01/12/2006: mmatus - Add aliases for 'case' encoders used with %rename/%namewarn %(uppercase)s hello_world -> HELLO_WORLD %(lowercase)s HelloWorld -> helloworld %(camelcase)s hello_world -> HelloWorld %(undercase)s HelloWorld -> hello_world 01/12/2006: mmatus - Add the -dump_parse_module and -dump_parse_top options, which are similar to -dump_module and -dump_top, but they dump the node trees just after parsing, showing only the attributes visible at the parsing stage, and not the added later in typemap.cxx, allocate.cxx, lang.cxx or elsewhere. Besides debugging porpuses, these options are very useful if you plan to use %rename in an "advance way", since it shows only and all the node's attributes you can use inside the match rules. 01/12/2006: mmatus - Add predicates to %rename, so, you don't need to remember, for example, how to match a member function. Now it is easy, for example to use the 'utitle' encoder in all the member methods, you type: %rename("%(utitle)s",%isfunction,%ismember) ""; or to ignore all the enumitems in a given class: %rename("$ignore", %isenumitem, %classname="MyClass") ""; Available predicates are (see swig.swg): %isenum %isenumitem %isaccess %isclass %isextend %isextend %isconstructor %isdestructor %isnamespace %istemplate %isconstant %isunion %isfunction %isvariable %isimmutable %isstatic %isfriend %istypedef %isvirtual %isexplicit %isextern %ismember %isglobal %innamespace %ispublic %isprotected %isprivate %classname These predicates correspond to specific 'match' declarations, which sometimes are not as evident as the predicates names. - Add the or '|' operation in %rename match, for example to capitalize all the constants (%constant or const cdecl): %rename("%(upper)s",match="cdecl|constant",%isimmutable) ""; 01/12/2006: mgossage - Partial fixed of errors under C89, bug #1356574 (converted C++ style comments to C style) - Added patches from neomantra@users.sf.net #1379988 and #1388343 missing a 'return' statement for error conditions also updated the %init block bug #1356586 01/10/2006: mmatus - Add the 'utitle' encoder, as an example of how to add your own encoder. I added the encoder method in misc.c but developers can add others, the same way, inside any target language. Well, 'utitle' is the reverse of 'ctitle', ie: %rename("%(ctitle)s") camel_case; -> CamelCase; %rename("%(utitle)s") CamelCase; -> camel_case; 01/10/2006: cfisavage [Ruby] Updated Ruby Exception handling. Classes that are specified in throws clauses, or are marked as %exceptionclass, are now inherited from rb_eRuntimeError. This allows instances of these classes to be returned to Ruby as exceptions. Thus if a C++ method throws an instance of MyException, the calling Ruby method will get back a MyException object. To see an example, look at ruby/examples/exception_class. 01/10/2006: mmatus - Add the %catches directive, which complements the %exception directive in a more automatic way. For example, if you have int foo() throw(E1); swig generates the proper try/catch code to dispatch E1. But if you have: int barfoo(int i) { if (i == 1) { throw E1(); } else { throw E2(); } return 0; } ie, where there is no explicit exception specification in the decl, you end up doing: %exception barfoo { try { $action } catch(E1) { ... } } catch(E2) { ... } } which is very tedious. Well, the %catches directive defines the list of exceptions to catch, and from swig: %catches(E1,E2) barfoo(int i); int barfoo(int i); is equivalent to int barfoo(int i) throw(E1,E2); Note, however, that the %catches list doesn't have to correspond to the C++ exception specification. For example, if you have: struct E {}; struct E1 : E {}; struct E2 : E {}; int barfoo(int i) throw(E1,E2); you can define %catches(E) barfoo(int i); and swig will generate an action code equivalent to try { $action } catch(E &_e) { ; } Of course, you still have to satisfy the C++ restrictions, and the catches list must be compatible (not the same) as the original list of types in the exception specification. Also, you can now specify that you want to catch the unknown exception '...', for example: %catches(E1,E2,...) barfoo(int); In any case, the %catches directive will emit the code to convert into the target language error/exception using the 'throws' typemap. For the '...' case to work, you need to write the proper typemap in your target language. In the UTL, this looks like: %typemap(throws) (...) { SWIG_exception(SWIG_RuntimeError,"unknown exception"); } 01/09/2006: mutandiz [Allegrocl] Fixes a number of SEGVs primarily in the handling of various anonymous types. Found in a pass through the swig test-suite. Still more to do here, but this is a good checkpoint. Adds -cwrap and -nocwrap as an allegrocl specific command-line argument. Controls generating of a C wrapper file when wrapping C code. By default only a lisp file is created for C code wrapping. Doc updates for the command-line arguments and fixes as pointed out on swig-devel 01/05/2006: wsfulton [Java] Fix unsigned long long and const unsigned long long & typemaps - Bug #1398394 with patch from Dries Decock 01/06/2006: mmatus Add 'named' warning codes, now in addition to: %warnfilter(813); you can use %warnfilter(SWIGWARN_JAVA_MULTIPLE_INHERITANCE); just use the same code name found in Source/Include/swigwarn.h plus the 'SWIG' prefix. If a developer adds a new warning code, the Lib/swigwarn.swg file will be generated when running the top level make. 01/05/2006: cfisavage [Ruby] Reimplemented object tracking for Ruby. The new implementation works by expanding the swig_class structure for Ruby by adding a trackObjects field. This field can be set/unset via %trackobjects as explained in the Ruby documentation. The new implementation is more robust and takes less code to implement. 01/05/2006: wsfulton Fix for %extend and static const integral types, eg: class Foo { public: %extend { static const int bar = 42; } }; 12/30/2005: mmatus - Add info for old and new debug options: -dump_top - Print information of the entire node tree, including system nodes -dump_module - Print information of the module node tree, avoiding system nodes -dump_classes - Print information about the classes found in the interface -dump_typedef - Print information about the types and typedefs found in the interface -dump_tags - Print information about the tags found in the interface -debug_typemap - Print information for debugging typemaps -debug_template - Print information for debugging templates - Add the fakeversion. If you have a project that uses configure/setup.py, or another automatic building system and requires a specific swig version, let say 1.3.22 you can use: SWIG_FEATURES="-fakeversion 1.3.22" or swig -fakeversion 1.3.22 and then swig -version will report 1.3.22 instead of the current version. Typical use would be SWIG_FEATURES="-fakeversion 1.3.22" ./configure 12/30/2005: mmatus - Add option/format support to %rename and %namewarn. Now %namewarn can force renaming, for example: %namewarn("314: import is a keyword",rename="_%s") "import"; and rename can also support format forms: %rename("swig_%s") import; Now, since the format is processed via swig Printf, you can use encoders as follows: %rename("%(title)s") import; -> Import %rename("%(upper)s") import; -> IMPORT %rename("%(lower)s") Import; -> import %rename("%(ctitle)s") camel_case; -> CamelCase This will allow us to add more encoders, as the expected one for regular expressions. - Add the above 'ctitle' encoder, which does the camel case: camel_case -> CamelCase - Also, while we get the regexp support, add the 'command' encoder, you can use it as follows %rename("%(command:sed -e 's/\([a-z]\)/\U\\1/' <<< )s") import; then swig will popen the command "sed -e 's/\([a-z]\)/\U\\1/' <<< import" see below for anonymous renames for better examples. - The rename directive now also allows: - simple match: only apply the rename if a type match happen, for example %rename(%(title)s,match="enumitem") hello; enum Hello { hi, hello -> hi, Hello }; int hello() -> hello; - extended match: only apply the rename if the 'extended attribute' match occurred, for example: // same as simple match %rename(%(title)s,match$nodeType="enumitem") hello; enum Hello { hi, hello -> hi, Hello }; Note that the symbol '$' is used to define the attribute name in a 'recursive' way, for example: // match only hello in 'enum Hello' %rename(%(title)s,match$parentNode$type="enum Hello") hello; enum Hello { hi, hello -> hi, Hello // match }; enum Hi { hi, hello -> hi, hello // no match }; here, for Hello::hi, the "parentNode" is "Hello", and its "type" is "enum Hello". - Anonymous renames: you can use 'anonymous' rename directives, for example: // rename all the enum items in Hello %rename(%(title)s,match$parentNode$type="enum Hello") ""; enum Hello { hi, hello -> Hi, Hello // match both }; enum Hi { hi, hello -> hi, hello // no match }; // rename all the enum items %rename(%(title)s,match$nodeType="enumitem") ""; // rename all the items in given command (sloooow, but...) %rename(%(command:)s) ""; Anonymous renames with commands can be very powerful, since you can 'outsource' all the renaming mechanism (or part of it) to an external program: // Uppercase all (and only) the names that start with 'i' %rename("%(command:awk '/^i/{print toupper($1)}' <<<)s") ""; int imported() -> IMPORTED; int hello() -> hello Note that if the 'command' encoder returns an empty string, swig understands that no rename is necessary. Also note that %rename 'passes' the matched name. For example, in this case namespace ns1 { int foo(); } namespace ns2 { int bar(); } the external program only receives "foo" and "bar". If needed, however, you can request the 'fullname' %rename("%(command:awk 'awk '/ns1::/{l=split($1,a,"::"); print toupper(a[l])}'' <<<)s",fullname=1) ""; ns1::foo -> FOO ns2::bar -> bar - Mixing encoders and matching: of course, you can do mix commands and match fields, for example: %rename("%()",match="cdecl") ""; %rename("%()",match="enumitem") ""; %rename("%()",match="enumitem", match$parentNode$parentNode$nodeType="class") ""; Use "swig -dump_parse_module" to see the attribute names you can use to match a specific case. - 'sourcefmt' and 'targetfmt': sometimes you need to process the 'source' name before comparing, for example %namewarn("314: empty is a keyword",sourcefmt="%(lower)s") "empty"; then if you have int Empty(); // "Empty" is the source you will get the keyword warning since 'Empty' will be lower cased, via the sourcefmt="%(lower)s" option, before been compared to the 'target' "empty". There is an additional 'targetfmt' option to process the 'target' before comparing. - complementing 'match': you can use 'notmatch', for example %namewarn("314: empty is a keyword",sourcefmt="%(lower)s",notmatch="namespace") "empty"; here, the name warning will be applied to all the symbols except namespaces. 12/30/2005: mmatus - Add initial support for gcj and Java -> mechanism. See examples in: Examples/python/java Examples/ruby/java Examples/tcl/java to see how to use gcj+swig to export java classes into python/ruby/tcl. The idea is to put all the common code for gcj inside Lib/gcj and localize specific types such as jstring, as can be found in Lib/python/jstring.i Lib/ruby/jstring.i Lib/tcl/jstring.i Using the UTL, this is very easy, and the perl version for jstring.i will be next. 12/29/2005: mmatus - Add the copyctor feature/directive/option to enable the automatic generation of copy constructors. Use as in: %copyctor A; struct A { }; then this will work a1 = A(); a2 = A(a1); Also, since it is a feature, if you just type %copyctor; that will enable the automatic generation for all the classes. It is also equivalent to swig -copyctor -c++ ... Notes: 1.- The feature only works in C++ mode. 2.- The automatic creation of the copy constructor will usually produce overloading. Hence, if the target language doesn't support overloading, a special name will be used (A_copy). 3.- For the overloading reasons above, it is probably not a good idea to use the flag when, for example, you are using keywords in Python. 4.- The copyctor automatic mechanism follows more or less the same rules as the default constructor mechanism, i.e., a copy constructor will not be added if the class is abstract or if there is a pertinent non-public copy ctor in the class or its hierarchy. Hence, it might be necessary for you to complete the class declaration with the proper non-public copy ctor to avoid a wrong constructor addition. - Fix features/rename for templates ctor/dtor and other things around while adding the copyctor mechanism. 12/27/2005: mmatus - Add the 'match' option to typemaps. Assume you have: %typemap(in) SWIGTYPE * (int res) {..} %typemap(freearg) SWIGTYPE * { if (res$argnum) ...} then if you do %typemap(in) A * {...} swig will 'overload the 'in' typemap, but the 'freearg' typemap will be also applied, even when this is wrong. The old solutions is to write: %typemap(in) A * {...} %typemap(freeag) A * ""; overload 'freearg' with an empty definition. The problem is, however, there is no way to know you need to do that until you start getting broken C++ code, or worse, broken runtime code. The same applies to the infamous 'typecheck' typemap, which always confuses people, since the first thing you do is to just write the 'in' typemap. The 'match' option solves the problem, and if instead you write: %typemap(in) SWIGTYPE * (int res) {..} %typemap(freearg,match="in") SWIGTYPE * { if (res$argnum) ...} %typemap(typecheck,match="in",precedence...) SWIGTYPE * {...} it will tell swig to apply the 'freearg/typecheck' typemaps only if they 'match' the type of the 'in' typemap. The same can be done with other typemaps as: %typemap(directorout) SWIGTYPE * {...} %typemap(directorfree,match="directorout") SWIGTYPE * {...} 12/27/2005: mmatus - Add the 'naturalvar' option/mode/feature to treat member variables in a more natural way, ie, similar to the global variable behavior. You can use it in a global way via the command line swig -naturalvar ... or the module mode option %module(naturalvar=1) both forms make swig treat all the member variables in the same way it treats global variables. Also, you can use it in a case by case approach for specific member variables using the directive form: %naturalvar Bar::s; Then, in the following case for example: std::string s; struct Bar { std::string s; }; you can do: b = Bar() b.s ="hello" cvar.s = "hello" if (b.s != cvar.s): raise RuntimeError This is valid for all the languages, and the implementation is based on forcing the use of the const SWIGTYPE& (C++)/SWIGTYPE (C) typemaps for the get/set methods instead of the SWIGTYPE * typemaps. Hence, for 'naturalvar' to work, each target language must implement 'typemap(in/out) const Type&' properly. The 'naturalvar' option replaces or makes workarounds such as: %apply const std::string & { std::string *} unnecessary. Note1: If your interface has other kinds of workarounds to deal with the old 'unnatural' way to deal with member variables (returning/expecting pointers), the 'naturalvar' option could break them. Note2: the option has no effect on unnamed types, such as unnamed nested unions. 12/27/2005: mmatus - Add more 'expressive' result states for the typemap libraries. In the past, for scripting languages, you would do checking something like: if (ConvertPtr(obj,&vptr,ty,flags) != -1) { // success } else { // error } Now the result state can carry more information, including: - Error state: like the old -1/0, but with error codes from swigerrors.swg. int res = ConvertPtr(obj,&vptr,ty,flags); if (SWIG_IsOK(res)) { // success code } else { SWIG_Error(res); // res carries the error code } - Cast rank: when returning a simple successful conversion, you just return SWIG_OK, but if you need to do a 'cast', you can add the casting rank, ie: if (PyFloat_Check(obj)) { value = PyFloat_AsDouble(obj); return SWIG_OK; } else if (PyInt_Check(obj)) { value = (double) PyInt_AsLong(obj); return SWIG_AddCast(SWIG_OK); } later, the casting rank is used to properly dispatch the overloaded function, for example. This of course requires your language to support and use the new dispatch cast/rank mechanism (Now mainly supported in perl and python, and easily expandable to ruby and tcl). - [UTL] Add support for the new 'expressive' result states. 12/27/2005: mmatus - Add support for the C++ implicit conversion mechanism, which required some modifications in parser.y (to recognize 'explicit') and overload.cxx (to replace $implicitconv as needed). Still, real support in each target language requires each target language to be modified. Python provides an example, see below. - Add support for native C++ implicit conversions, ie, if you have %implicitconv A; struct A { int ii; A() {ii = 1;} A(int) {ii = 2;} A(double) {ii = 3;} explicit A(char *s) {ii = 4;} }; int get(const A& a) {return a.ii;} you can call: a = A() ai = A(1) ad = A(1.0) as = A("hello") # old forms get(a) -> 1 get(ai) -> 2 get(ad) -> 3 get(as) -> 4 #implicit conversions get(1) -> 2 get(1.0) -> 3 get("hello") -> Error, explicit constructor Also, as in C++, now implicit conversions are supported in variable assigments, and if you have: A ga; struct Bar { A a; }; you can do: cvar.ga = A(1) cvar.ga = 1 cvar.ga = 1.0 cvar.ga = A("hello") cvar.ga = "hello" -> error, explicit constructor b = Bar() b.a = A("hello") b.a = 1 b.a = 1.0 b.a = "hello" -> error, explicit constructor Note that the last case, assigning a member var directly, also requires the 'naturalvar' option. This support now makes the old '%implicit' macro, which was found in 'implicit.i' and it was fragile in many ways, obsolete, and you should use the new '%implicitconv' directive instead. Note that we follow the C++ conventions, ie, in the following the implicit conversion is allowed: int get(A a) {return a.ii;} int get(const A& a) {return a.ii;} but not in these cases: int get(A *a) {return a->ii;} int get(A& a) {return a.ii;} Also, it works for director methods that return a by value result, ie, the following will work: virtual A get_a() = 0; def get_a(self): return 1 but not in this case: virtual const A& get_a() = 0; virtual A& get_a() = 0; virtual A* get_a() = 0; Notes: - the implicitconv mechanism is implemented by directly calling/dispatching the python constructor, triggering a call to the __init__method. Hence, if you expanded the __init__ method, like in: class A: def __init__(self,args): then 'my code' will also be executed. - Since the %implicitconv directive is a SWIG feature, if you type: %implicitconv; that will enable implicit conversion for all the classes in your module. But if you are worried about performance, maybe that will be too much, especially if you have overloaded methods, since to resolve the dispatching problem, python will efectively try to call all the implicit constructors as needed. - For the same reason, it is highly recommended that you use the new 'castmode' when mixing implicit conversion and overloading. - [python] The %implicit directive is declared obsolete, and you should use %implicitconv instead. If you include the implicit.i file, a warning will remind you of this. Note: Since %implicit is fragile, just replacing it by %implicitconv could lead to different behavior. Hence, we don't automatically switch from to the other, and the user must migrate to the new %implicitconv directive manually. 12/26/2005: wsfulton [C#] Modify std::vector wrappers to use std::vector::value_type as this is closer to the real STL declarations for some methods, eg for push_back(). Fixes some compilation errors for some compilers eg when the templated type is a pointer. [Java] std::vector improvements - a few more methods are wrapped and specializations are no longer required. The specialize_std_vector macro is no longer needed (a warning is issued if an attempt is made to use it). 12/26/2005: wsfulton [Java, C#] Add in pointer reference typemaps. This also enables one to easily wrap std::vector where T is a pointer. 12/24/2005: efuzzyone [CFFI] The cffi module for SWIG: - Fully supports C, but provides limited supports for C++, in particular C++ support for templates and overloading needs to be worked upon. 12/23/2005: mmatus [python] Add the castmode that allows the python type casting to occur. For example, if you have 'int foo(int)', now class Ai(): def __init__(self,x): self.x = x def __int__(self): return self.x foo(1) // Ok foo(1.0) // Ok foo(1.3) // Error a = Ai(4) foo(ai) // Ok The castmode, which can be enabled either with the '-castmode' option or the %module("castmode") option, uses the new cast/rank dispatch mechanism. Hence, now if you have 'int foo(int); int foo(double);', the following works as expected: foo(1) -> foo(int) foo(1.0) -> foo(double) ai = Ai(4) foo(ai) -> foo(int) Note1: the 'castmode' could disrupt some specialized typemaps. In particular, the "implicit.i" library seems to have problem with the castmode. But besides that one, the entire test-suite compiles fine with and without the castmode. Note2: the cast mode can't be combined with the fast dispatch mode, ie, the -fastdispatch option has no effect when the cast mode is selected. The penalties, however, are minimum since the cast dispatch code is already based on the same fast dispatch mechanism. See the file overload_dispatch_cast_runme.py file for new cases and examples. 12/22/2005: mmatus Add the cast and rank mechanism to dispatch overloading functions. The UTF supports it now, but for each language it must be decided how to implement and/or when to use it. [perl] Now perl uses the new cast and rank dispatch mechanism, which solves all the past problems known in perl, such as the old '+ 1' problem: int foo(int); $n = 1 $n = $n + 1 $r = foo(n) also works: foo(1); foo("1"); foo(1.0); foo("1.0"); but fails foo("l"); and when overloading foo(int) and foo(double); foo(1) -> foo(int) foo(1.0) -> foo(double) foo("1") -> foo(int) foo("1.0") -> foo(double) foo("l") -> error foo($n) -> foo(int) for good perl versions foo($n) -> foo(double) for old bad perl versions when overloading foo(int), foo(char*) and foo(double): foo(1) -> foo(int) foo(1.0) -> foo(double) foo("1") -> foo(char*) foo("1.0") -> foo(char*) foo("l") -> foo(char*) Note: In perl the old dispatch mechanism was broken, so, we don't provide an option to enable the old one since, again, it was really really broken. See 'overload_simple_runme.pl' for more cases and tests. PS: all the old known issues are declared resolved, any new "problem" that could be discovered is declared, a priori, as "features" of the new dispatch mechanism (until we find another solution at least). *** POTENTIAL INCOMPATIBILITY *** As with the introduction of the UTF, some things could now start to work as expected, and people used to deal or workaround previous bugs related to the dispatch mechanism, could see now a difference in perl behavior. 12/21/2005: mmatus - The '-nodefault' flag (pragma and feature) now generates a warning, and recommends to use the explicit -nodefaultctor and -nodefaultdtor options. The reason to split the 'nodefault' behavior is that, in general, ignoring the default destructor generates memory leaks in the target language. Hence, is too risky just to disable both the default constructor and destructor at the same time. If you need to disable the default destructor, it is also recommended you use the directive form: %nodefaultdtor MyVerySpecialClass; for specific classes, and always avoid using the global -nodefault and -nodefaultdtor options. 12/21/2005: wsfulton [Java, C#] Fix incorrect code generation when the intermediary classname is changed in the module directive from its default. For example: %module(jniclassname="myimclassnewname") "mymodule" // Java %module(imclassname="myimclassnewname") "mymodule" // C# Add in new special variable $imclassname. See docs. 12/17/2005: mmatus [Python] - Add the -aliasobj0/-noaliasobj0 options to use with -fastunpack and/or -O and old typemaps that use 'obj0' directly. So, if you compile your code using -O and get errors about the undeclared 'obj0' variable, run again using swig -O -aliasobj0 -python .... For new typemaps, never use 'obj0' directly, if needed, use the '$self' name that will be properly expanded to 'obj0' (nofastunpack) or 'swig_obj[0]' (fastunpack). If you have no idea what I am talking about, better, that means you have no typemap with this problem. 12/14/2005: mmatus [Python] - Add the -fastunpack/-nofastunpack options to enable/disable the use of the internal UnpackTuple method, instead of calling the one from the python C API. The option -O now also implies -fastunpack. 12/11/2005: mmatus [Python] - Add the -proxydel/-noproxydel options to enable/disable the generation of proxy/shadow __del__ methods, even when now they are redundant, since they are empty. However, old interfaces could rely on calling them. The default behavior is to generate the __del__ methods as in 1.3.27 or older swig versions. The option -O now also implies -noproxydel. 12/10/2005: mmatus [UTF] - Fix unnecessary calls to SWIG_TypeQuery for 'char *' and 'wchar_t *', problem found by Clay Culver while profiling the PyOgre project. [Python] - Add the -dirvtable/-nodirvtable to enable/disable a pseudo virtual table used for directors, avoiding the need to resolve the python method at each call. - Add the -safecstrings/-nosafecstrings options to enable/disable the use of safe conversions from PyString to char *. Python requires you to never change the internal buffer directly, and hence 'safectrings' warranties that but returning a copy of the internal python string buffer. The default, as in previous releases, is to return a pointer to the buffer (nosafecstrings), so, it is the user's responsibility to avoid its modification. - Add the -O option to enable all the optimization options at once, initially equivalent to -modern -fastdispatch -dirvtable -nosafecstrings -fvirtual 12/08/2005: mmatus - Add the -fastdispatch option (fastdispatch feature). This enables the "fast dispatch" mechanism for overloaded methods provided by Salvador Fandi~no Garc'ia (#930586). The resulting code is smaller and faster since less type checking is performed. However, the error messages you get when the overloading is not resolved could be different from what the traditional method returns. With the old method you always get an error such as "No matching function for overloaded ..." with the new method you can also get errors such as "Type error in argument 1 of type ..." See bug report #930586 for more details. So, this optimization must be explicitly enabled by users. The new mechanism can be used as: swig -fastdispatch or using the feature form %feature("fastdispatch") method; or %fastdispatch method; 12/06/2005: mmatus - Several memory and speed improvements, specially for templates. Now swig is up to 20 faster than before for large template interfaces, such as the std_containers.i and template_matrix.i files in the python test-suite. Memory footprint is also reduced in consideration of small pcs/architectures. - add commandline options -cpperraswarn and -nocpperraswarn" to force the swig preprocessor to treat the #error directive as a #warning. the pragmas #pragma SWIG cpperraswarn=1 #pragma SWIG cpperraswarn=0 are equivalent to the command line options, respectively. 12/06/2005: mmatus [Python] The generated code is now more portable, especially for Windows. Following http://www.python.org/doc/faq/windows.html Py_None is never accessed as a structure, plus other tricks mentioned there. 12/06/2005: mmatus [Python] Added initial support for threads based in the proposal by Joseph Winston. The user interface is as follows: 1.- the module thread support is enable via the "threads" module option, i.e. %module("threads"=1) 2.- Equivalent to that, is the new '-threads' swig option swig -threads -python ... 3.- You can partially disable thread support for a given method using: %feature("nothread") method; or %nothread method; also, you can disable sections of the thread support, for example %feature("nothreadblock") method; or %nothreadblock method; %feature("nothreadallow") method; or %nothreadallow method; the first disables the C++/python thread protection, and the second disables the python/C++ thread protection. 4.- The current thread support is based in the PyGIL extension present in python version 2.3 or later, but you can provide the thread code for older versions by defining the macros in pythreads.swg. If you get a working implementation for older versions, please send us a patch. For the curious about performance, here are some numbers for the profiletest.i test, which is used to check the speed of the wrapped code: nothread 9.6s (no thread code) nothreadblock 12.2s (only 'allow' code) nothreadallow 13.6s (only 'block' code) full thread 15.5s ('allow' + 'block' code) i.e., full thread code decreases the wrapping performance by around 60%. If that is important to your application, you can tune each method using the different 'nothread', 'nothreadblock' or 'nothreadallow' features as needed. Note that for some methods deactivating the 'thread block' or 'thread allow' code is not an option, so, be careful. 11/26/2005: wsfulton SWIG library files use system angle brackets everywhere for %include, eg %include "std_common.i" becomes %include 11/26/2005: wsfulton [Java, C#] Typesafe enums and proper enums have an extra constructor so that enum item values that are initialised by another enum item value can be wrapped without having to use %javaconstvalue/ %csconstvalue for when using %javaconst(1)/%csconst(1). Suggestion by Bob Marinier/Douglas Pearson. For example: typedef enum { xyz, last = xyz } repeat; 11/21/2005: mmatus [ruby + python] Fixes for directors + pointers. This is an ugly problem without an easy solution. Before we identified this case as problematic: virtual const MyClass& my_method(); but it turns out that all the cases where a pointer, array or reference is returned, are problematic, even for primitive types (as int, double, char*, etc). To try to fix the issue, a new typemap was added, 'directorfree', which is used to 'free' the resources allocated during the 'directorout' phase. At the same time, a primitive garbage collector engine was added to deal with orphaned addresses, when needed. The situation is much better now, but still it is possible to have memory exhaustation if recursion is used. So, still you need to avoid returning pointers, arrays or references when using director methods. - Added stdint.i - typemaps for latest C99 integral types found in stdint.h. 11/14/2005: wsfulton More types added to windows.i, eg UINT8, WORD, BYTE etc. Including windows.i will also enable SWIG to parse the __declspec Microsoft extension, eg __declspec(dllimport). Also other Windows calling conventions such as __stdcall. 11/10/2005: wsfulton New library file for Windows - windows.i. This file will contain useful type information for users who include windows.h. Initial support is for the non ISO integral types: __int8, __int16, __int32, __int64 and unsigned versions. The unsigned versions previously could not be parsed by SWIG. SF #872013. 11/09/2005: wsfulton [Java, C#] Portability warning for files which will overwrite each other on case insensitive file systems such as FAT32/NTFS. This will occur, for example, when two class names are the same barring case. The warning is issued on all platforms and can be suppressed with the usual warning suppression techniques. SF bug #1084507. 11/09/2005: wsfulton ./configure --with-python --with-ruby --with-perl5 etc enable these languages, ie the --with-xxxx options, where no path is specified, work the same as if the option was not specified at all. Based on patches #1335042 #1329048 #1329047. 11/09/2005: dancy [Allegrocl] Add C++ support to the Allegrocl module. Further enhances the C support as well. Some of the features: - MUCH better generation of foreign types based on the C/C++ types for use in defining the FFI on the lisp side. We don't pass everything as a (* :void) any longer. - Uses typemaps for better control of type conversions and code generation in the generated lisp and c++ wrapper code. - CLOS wrapping of pointers returned from foreign space makes it easier to differentiate pointers in user code. The wrapping objects can be passed directly to FF calls. - Defun wrapping of FF calls, allowing for more lispy interface. Conversion, GCing, of lisp objects to foreign objects can be done in the wrapping defun via the use of typemaps. - overload dispatching implemented on the lisp side using generic functions. - Templates and synonymous types supported. 11/07/2005: mmatus [Python] Adding proper support for multi-inheritance in the python side, ie, if you have two C++ wrapped class, Foo and Bar, now: class MyPythonClass(Foo,Bar): .... will properly work, even with directors, and the deallocation of Foo.this and Bar.this will follow correctly. Before, a class could only have one 'this' instance (unlike C++), only the last base class was properly deleted, or detected with directors. Now 'self.this' can be a list, which will contain the C++ instance pointers for all the base classes. Also, swig.this is responsible for deallocating the C++ instance(s), and the __del__ method is not emitted unless the user preppend/append some code to it. - Swig can now detect memory leaks, ie, if you still don't use proxy/shadow classes, and type something like import _example f = _example.new_Foo() and forget to call _example.delete_Foo(f), then swig will tell you that there is a memory leak. Otherwise, if you always use the proxy classes, you probably you will never ever see this warning unless there is something wrong inside the swig wrapping code. *** POTENTIAL INCOMPATIBILITY *** If you overloaded the __del__ method, and call the base one without a try block, as in class MyClass(SwigClass): def __del__(self): SwigClass.__del__(self) python could complain that the method SwigClass.__del__ is undefined. Try to use instead: def __del__(self): try: SwigClass.__del__(self) except: pass or simply def __del__(self): 11/02/2005: mmatus [Python] Adding more fun to STL/STD containers, now you can do %template(pyset) std::set; %template(pyvector) std::vector; %template() std::pair; %template(pyvector) std::map; .... The same applies to std::list, std::deque, std::multiset, etc. Then, at the python side you can do now: # C++ std::vector as native python sequence v = pyvector([1,"hello",(1,2)]) print v[1] >> 'hello' print v[2] >> (1,2) # C++ std::set as native python sequence s = pyset() s.insert((1,2)) s.insert(1) s.insert("hello") sum=() for i in s: sum +=(i,) print sum >>> (1, 'hello', (1, 2)) # C++ std::map as native python sequence m = pymap() m["foo"] = "hello" m[1] = (1,2) pm = {} for k in m: pm[k] = m[k] print pm >>> {1: (1, 2), 'foo': 'hello'} ie, the STD/STL containers work as real native python container, with arbitrary item types and so. But since normal C++ containers do not properly ref/unref their items, you should use the safer versions: %template(pyset) std::set; %template(pyvector) std::vector; %template() std::pair; %template(pyvector) std::map; .... where swig::PyObject_ptr is a PyObject * envelope class provided to safely incref/decref the python object. So, now you can use all the STL/STD containers as native Python containers. Note 1: std::map, std::set and the other 'ordered' containers will properly use PyObject_Compare for sorting, when needed. Note 2: all the STL/STD containers have a limit size of SIZE_MAX, ie, you can have manage containers larger than INT_MAX, the python limit. 11/02/2005: mmatus [Python] - add 'iterator()' method for all sequences and additionally 'key_iterator()' for maps. 'iterator()' will always return the native C++ iterator. Additionally, in maps, 'key_iterator()' will return a python iterator using only the map keys. In general the sequence method __iter__ will call 'iterator()', returning the native C++ iterator, but in maps it will call 'key_iterator()', maintaining backward compatibility. Hence, for std::maps, you can play then with the native C++ iterator, which value is a (key, value) pair, by calling map.iterator(), as with map.begin(), map.end(), etc. The difference is that map.iterator() returns a safe 'closed' iterator, while map.begin() and map.end() are 'open' iterators. A 'closed' iterator knows the begin and the end of the sequence, and it never can seg. fault. An 'open' iterator, as in C++, can seg. fault at the C++ side. # a closed iterator is safe in the following example. # the next() method will throw a StopIteration # exception as needed i = seq.iterator() try: while True: sum += i.next() except: pass # an open iterator always need to be checked, # or it will crash at the C++ side current = seq.begin() end = seq.end() while (current != end): sum += current.next() [Python] - Finally, when we call f = Foo() the construction is 'one-way'. Before construction was done something like Foo() (python) -> _new_Foo() (C++) new_Foo() (C++) -> FooPtr() (python) FooPtr() (python) -> Foo() (python) and returning a pointer was done like NewPointerObj() (C++) -> FooPtr() (python) FooPtr(python) -> Foo() (python) ie, we when going back and forward between the C++ and python side. Now since there is no FooPtr the construction process is Foo() (python) -> _new_Foo() (C++) _new_Foo() (C++) -> NewPointerObj() (C++) (no shadow class) and returning a pointer is done NewPointerObj() (C++) (with shadow class) -> NewInstaceObj() (C++) where NewInstanceObj creates a new instance without calling __init__ and it doesn't go 'back' to python, is 'pure' C API. - With this change, and the other ones in the PySwigObject type, which now carries the thisown and swig_type_info pointer, the generated code should be as fast as boost::Python and/or the other python wrappers based in pure Python/C API calls. As a reference, the profiletest_runme.py example, which does a simple call function many times, such as this code: import profiletest a = profiletest.A() b = profiletest.B() for i in range(0,1000000) a = b.fn(a) where fn is defined as 'A* B::fn(A *a) {return a;}', produces the following times nomodern modern swig-1.3.26 19.70s 5.98s swig-CVS 0.99s 0.98s Clearly, there is a large improvement for the python 'nomodern' mode. Still, the 'modern' mode is around 6 times faster than before. For the same test, but using the non-shadow version of the module, we get _profiletest (non-shadow) swig-1.3.26 0.80s swig-CVS 0.60s Hence, now for practical purposes, the proxy overhead is insignificant. Note that the performance numbers we are showing is for a simple module (two types) and a simple function (one argument). For real situations, for modules with many more types and/or functions with many more parameters, you will see even better results. 10/31/2005: mmatus [Python] - Finally, no more ClassPtr proxy classes. You will see only a clean Class proxy class in the .py file. - No more 'real' thisown attribute either, the PySwigObject now carries the ownership info. You can also do something like print self.this.own() >>> True self.this.disown() self.this.own(0) print self.this.own() >>> False self.this.acquire() self.this.own(1) print self.this.own() >>> True Still the old way, print self.thisown >>> True self.thisown = 0 print self.thisown >>> False self.thisown = 1 print self.thisown >>> True is supported, and python dispatches the proper method calls as needed. - Support for iterators in STL/STD containers, for example, if you have %template std::set; you can use the C++ iterators as: s = set_string() s.append("c") s.append("a") s.append("b") b = s.begin() e = s.end() sum = "" while (b != e): sum += b.next() print sum >>> "abc" advance the iterator as in C++ current = s.begin() current += 1 print current.value() >>> "b" now using the reverse operators b = s.rbegin() e = s.rend() sum = "" while (b != e): sum += b.next() print sum >>> "cba" or the 'previous' method b = s.begin() e = s.end() sum = "" while (b != e): sum += e.previous() print sum >>> "cba" or just as in a python fashion for i in s: sum += i Note 1: Iterators in C++ are very powerful, but dangerous too. And in python you can shoot yourself in the foot just like in C++, so, be careful. Note 2: the iterators are 'light', ie, they do not convert sequence elements until you request to do so, via next(), value() or previous(). If you just increment/decrement one no conversion is performed, for example: b = s.begin() b += 1 b.incr() b.incr(2) b.decr(2) b.decr() b -= 1 only the iterator is modified, and not value wrapper is generated. Other typical C++ operations are also available, such as: print s.end() - s.begin() >>> 3 f = s.begin() + 1 print f.value() >>> "b" l = s.end() - 1 print l.value() >>> "c" etc. Of course, the 'find', 'insert', 'erase', and so on methods also supports iterators now, ie: i = s.begin() i += 1 s.erase(i) for i in s: sum += i print sum >>> "ac" *** POTENTIAL INCOMPATIBILITY *** There is no more 'thisown' attribute. If you use it, python will translate the following code as follows: if (self.thisown): ==> if (self.this.own()): self.thisown = 1 ==> self.this.own(1) self.thisown = 0 ==> self.this.own(0) Still, maybe in some unusual cases the translation will not be 100% correct, so if you have a problem, please report it and/or use the new 'self.this.own()' accessor. *** POTENTIAL INCOMPATIBILITY *** There is no more ClassPtr classes in the python code. Hence, if in the past you needed to resort to some kind of trickery with them, or overcome their presence, it is no longer required, but the extra code you added could now break things. If needed, you can use the option -classptr, i.e., swig -classptr -python ... to generate the old ClassPtr classes. 10/30/2005: mkoeppe [Guile] Make declared and defined linkage of SWIG_init consistent. Reported by Steven G. Johnson (SF patch 1315498). 10/26/2005: mmatus - Added the attribute.i file to the global library director. Now it can be used from other languages that do not use the unified typemap library as well. So, if you have something like: %include attribute.i %attribute(A, int, a, get_a, set_a); struct A { int get_a() const; void set_a(int aa); }; %attribute_ref(B, int, c); struct B { int& c(); }; then in the target language the 'A.a' and 'B.c' attributes will be visible, ie, you can access them as plain variables: f = A() f.a = 3 g = B() g.c = 3 h = f.a + g.c and the proper get/set methods will be dispatched. See attribute.i for more info. - More cleanups around and adding more test-cases. The DISOWN typemap now is tested and working in all the languages that use the unified typemap library, ie, tcl, ruby, perl and python. 10/25/2005: mmatus - Perl, complete the DISOWN typemap. - added the attribute.i file to the unified typemap library (before was only usable from python). - unify the names for the setter and getter methods in perl,tcl,ruby and python, so, the attribute.i library can work across them. - see the li_attribute.i test-case or the library file Lib/typemaps/attribute.swg for more info about how to use it. 10/24/2005: mmatus - Perl now uses the unified typemap library. - Changes in ruby to use the $track option in typemaps. - Changes in the unified typemap library to follow the convention that all macros that are not used in the C/C++ side starts with %, such as %delete %new_array etc. - Documenting fragments, see fragments.swg. - Cleaner way to use the unified typemap library, include just . Check some of the supported languages: perl, tcl, ruby, python. Always start with the head file, such as python/python.swg tcl/tcl8.swg ruby/ruby.swg perl5/perl5.swg and the principal file that invokes the unified library, such as python/pytypemaps.swg tcl/tcltypemaps.swg ruby/rubytypemaps.swg perl/perltypemaps.swg The file that provide the specialization for each language are the one that provides the basic types: python/pyprimtypes.swg ruby/rubyprimtypes.swg tcl/tclprimtypes.swg perl5/perlprimtypes.swg and the string manipulation: python/pystrings.swg ruby/rubystrings.swg tcl/tclstrings.swg perl5/perlstrings.swg The rest of the files, such as carray.i, are mostly one line files that include the proper typemap library version. *** POTENTIAL INCOMPATIBILITY in Perl *** Some missing/wrong typemaps could start working properly, and change the old expected behavior in Perl. 10/23/2005: wuzzeb Chicken: + pointers to member functions finally work properly + add test of member function pointers to cpp_basic.i 10/20/2005: dancy [allegrocl] Added C++ support. Large update, many changes. See newly added Allegro Common Lisp section in lisp.html 10/20/2005: mmatus Ruby, Tcl, Python: - Uniform way to fail (label fail:), now finally SWIG_exception works across the three languages and all the typemaps. - Add proper cleanup code to ruby - More valgrind fixes - Simplify the inline use, it seems a small interface of 20,000 lines (plus many many templates) can break gcc -O3 easily. - Finalize the typemaps library. All the old *.i files (carray.i, cpointer.i, exception.i) had been implemented in the new typemaps library. 10/19/2005: wuzzeb Update the Runtime Typemap documentation in Typemaps.html 10/18/2005: wuzzeb Chicken: - Correctly handle %ignored classes - Correctly convert long, long long, unsigned long, etc to chicken primitives. (Thanks to Felix Winkelmann) - Using argout parameters when the return value was a wrapped pointer caused a memory corruption. The chicken garbage collector moved a pointer out from under us. This is now fixed by running all the proxy creation functions as continuations after the wrapper function returns. As part of this, we no longer need the chickenfastproxy flag on output typemaps. - using -proxy and -nocollection together works now Before, it was not exporting the destructor in the proxy wrapper. 10/18/2005: mmatus Added the Unified Typemap Library (UTL). It unifies the typemaps for python, ruby, tcl and in the process, fixes several problems in each of the three languages to work in a "canonical" way now established in the typemap library SWIG/Lib/typempas The current status of the unification is that everything compiles and runs inside the test-suite and examples directories. And for the first time we have three languages than pass the primitive_types.i case. Also, we have a uniform way to treat the errors, for example if you do something like >>> from primitive_types import * >>> print val_uchar(10) 10 >>> print val_uchar(1000) Traceback (most recent call last): File "", line 1, in ? OverflowError: in argument 1 of type 'unsigned char' you get the same exception in all the three languages. And well, many more good things will come from this unification, for example, proper support of the STL/STD classes for all the languages, and hopefully, we can keep adding other languages. The hardest part, writing a common typemap library that suites the three different languages, is done, and adding another language should now be easy. Still the global unification is not complete, the STL/STD part is next, and probably as well as adding one or two more languages. If you are curious, look at the python, ruby and/or tcl directories to see what is needed to support the new common typemaps library. Still, the final way to integrate a new language could change as we move to integrate the STD/STL. *** POTENTIAL INCOMPATIBILITY in Ruby/Tcl *** Some missing/wrong typemaps could start working properly, and change the old behavior, specially in ruby and tcl. Version 1.3.27 (October 15, 2005) ================================= 10/15/2005: wsfulton [Java] Fix for typesafe enum wrapping so that it is possible to overload a method with 2 different enum types. 10/15/2005: wsfulton Fix for %feature("immutable","0") attempting to generate setters for constants. Restored %immutable and %makedefault to clear the feature as it behaved in SWIG-1.3.25 and earlier. 10/14/2005: mmatus Fix bug in anonymous typedef structures which was leading to strange behaviour. 10/13/2005: mmatus Several minor changes: - Improve the wchar_t type support - Add a warning for when you define the 'in' typemap but you don't define the 'typecheck' one. Very common mistake. - Add proper default rule for function pointers, now you can define a typemap such as: %typemap(in) SWIGTYPE ((*)(ANY)) {...} That will apply to all the pointer to functions. The rule in C++ also apply to the function 'reference', ie, in both cases typedef int (*fptr)(int a); typedef int (func)(int a); This was needed since it seems to be 'illegal' in C++ to do something like: void *ptr = static_cast(fptr); and probably, as for member functions, it is not warrantied that the pointer sizes will match. - Add the #error/#warning directives to swig's cpp. - Add the noblock option for typemaps, which is used as follows: supposed you a typemap, like this %typemap(in,noblock=1) Hello { .... } then the typemap will be inserted without the block imposed by the brackets, similar to %typemap(in) Hello "..."; So, why you don't just use the quote style?, because: 1.- The quote style doesn't get preprocessed, for example %typemap(in) Hello "$1= SWIG_macro($1);"; here, SWIG_macro doesn't get expanded 2.- Inside a quote typemap, you have to use quotes carefully %typemap(in) Hello "$1 = \"hello\" "; 3.- You can't make emacs and/or other editors to indent inside a string!. So, why do you want to remove the block?, because an extra block when not needed (no local variables in it): 1.- makes the code harder to read 2.- makes the code larger 3.- or in short, for the same reason we have the quote style. Version 1.3.26 (October 9, 2005) ================================ 10/08/2005: wsfulton [Php] Added 'throws' typemaps. 10/08/2005: wsfulton Fixes for languages that don't support multiple inheritance. The first non-ignored class in the public base class list is used for inheritance. by the proxy class. Previously, if the first class in the list was ignored, then the proxy class wouldn't have any base classes. 10/07/2005: mmatus Update more features to follow new convention, including: callback ref/unref except All of them use not only the feature as a flag, but also as code value. To deal with those features, we use now GetFlagAttr, which is similar to GetFlag, but instead or returning 1 or 0, it returns the attr value, if happens to be different of "0" of course. Now there are also more uniform directive names for the ones based in features, for example, for the old %newobject directive now we have tree directives defined: #define %newobject %feature("new") #define %nonewobject %feature("new","0") #define %clearnewobject %feature("new","") and so on for all the other feature directives. *** POTENTIAL INCOMPATIBILITY *** 09/30/2005: wsfulton Subtle change to some features. Previously it was not possible to disable many features once they had been enabled. This was for most features that behave as flags. These features now work as follows: %feature("name") // enables the feature %feature("name", "1") // enables the feature %feature("name", "0") // disables the feature %feature("name", "") // clears the feature In fact any non-empty value other than "0" will enable the feature (like C boolean logic). Previously "1", "0" or any other non-empty value would enable the feature and it would only be possible to disable the feature by clearing it (assuming there was no global enable). The following features are affected: allowexcept compactdefaultargs classic (Python) cs:const (C#) director exceptionclass (Python) ignore immutable java:const (Java) java:downcast (Java) kwargs modern (Python) new noautodoc (Python) nodefault nodirector noref notabstract nounref novaluewrapper python:maybecall (Python) python:nondynamic (Python) modula3:multiretval (Modula3) predicate (Ruby) trackobjects (Ruby) valuewrapper It is now possible, for example to ignore all methods/classes in a header file, except for a few targetted methods, for example: %feature("ignore"); // ignore all methods/classes %feature("ignore","0") some_function(int, double); // do not ignore this function %feature("ignore","0") SomeClass; // do not ignore this Class %feature("ignore","0") SomeClass::method; // do not ignore this method %include "bigheader.h" Removed %pythondynamic - it never worked properly. Use %pythonnondynamic instead. Removed %feature("nokwargs") - it wasn't fully implemented - use %feature("kwargs","0") instead. *** POTENTIAL INCOMPATIBILITY *** 09/25/2005: mkoeppe [Guile] Add "throws" typemaps. 09/24/2005: cfisavage [Ruby] Adds new %trackobjects functionality that maps C++ objects to Ruby objects. This functionality makes it much easier to implement mark functions for the garbage collector. For more information refer to the update documentation and examples. 09/20/2005: wsfulton [Perl] Patch 1116431 from Josh Cherry. Fixes non member functions inadvertently being called instead of member functions. 09/20/2005: wsfulton [Lua] Patch from Mark Gossage to add support for Lua-5.1, std::string, std::vector, std::exception and documentation. 09/14/2005: mmatus [Python] Add -nocppcast. Now the default behavior is to always use the cppcast operators. Before that was the case only when you used the -cppcast option. If this seems to break your code... your welcome!, it means it was broken before, and you never notice. If you thing the error is due to one of the SWIG typemaps, send us an example. Use -nocppcast only with very old C++ compilers that do not support the cppcast operations. So, here applies: This change doesn't break compatibility, it was broken before. 09/13/2005: wsfulton [Java] Fix for director methods when a class is passed by value as a parameter. 09/11/2005: mmatus Adding the module option to the %import directive. Now you can use it as %import(module="BigModule") foo.i where subfile could (or not) define the module name via the %module directive. The module option take precedence and it has the same effects than having the directive %module BigModule inside the imported file foo.i. You can use the option in mainly two cases: 1.- You used the -module option when you generated the module to be imported, and hence the module name in the imported %module directive is not really useful. 2.- The module you want to import is very large, and it has several .i/.h files. Then, if you just one to import a class or so from the module, says 'foo', and not the entire module via importing the main BigModule.i file, then you just do: %import(module="BigModule") foo.h or %import(module="BigModule") foo.i where foo.i contains the 'foo' declaration and maybe a couple of extra %include directives, as needed. 09/11/2005: mmatus Fix bug #1282637, about the -module option not having effect in places where it was needed. 09/11/2005: wsfulton When wrapping variables, ensure that none of the typemaps used for the set wrappers are used when generating the get wrappers. I doubt this was a problem for any languages except for the recently introduced null attribute in the out typemap (C# only). 09/08/2005: wsfulton More descriptive error messages when files fail to open. 09/06/2005: mmatus Allow a %define a macro inside another %define macro, for example %define hello(name, Type) %define name ## a(Type) %typemap(in) Type "hello;"; %enddef %enddef To learn how to use this new features in your own typemaps library, see python/cstring.i, python/cwstring.i and python/cwstrbase.i. [Python] Normalize the cstring.i implementation to use fragments, and add cwstring.i, which implements the same typemaps but for wchar_t strings. [Python] Bug fixed: 1247477, 1245591, 1249878 and others. 08/18/2005: wsfulton [Ruby] Implement support for SWIGTYPE* DISOWN typemap (like in Python) for better control of memory management, eg when adding an object created in Ruby to a C++ container. Patch #1261692 from Charlie Savage. 08/18/2005: wsfulton [Tcl] 64 bit platform fixes for the varargs handling in SWIG_GetArgs. This is an improved fix for bug #1011604 as suggested by Jeremy Lin. 08/18/2005: wsfulton [Tcl] Bug #1240469 - %newobject support for Tcl. Patch from Bob Marinier. 08/16/2005: wsfulton [Perl] Bug #1254494 - Fix for global namespace pollution by perl header files (bool define) prevented STL headers from being used on some systems, eg Windows with Visual Studio. 08/16/2005: wsfulton [Java] Bug #1240937 - Redefinition of __int64 typedef for Intel compilers. 08/15/2005: wsfulton [Xml] Bug #1251832 - C++ template may generate invalid XML file 08/15/2005: wsfulton [Lua] Support added for Lua. Patch #1242772 from Mark Gossage. It supports most C/C++ features (functions, struct, classes, arrays, pointers, exceptions), as well as lots of documentation and a few test cases & examples. 08/14/2005: wsfulton [Xml] Fix incorrect xml escaping in base class name when base class is a template. 08/13/2005: efuzzyone [CLISP] Added support for handling enums. Does not adds the return type declaration to the function definition, if a function returns void. 08/09/2005: mkoeppe New language module, Common Lisp with UFFI, from Utz-Uwe Haus. 08/09/2005: mkoeppe Fix the Lisp s-expression output module; it no longer complains about "unknown targets". 07/27/2005: wsfulton Modifications to STL wrappers so that it is possible for a user's %exception directive to be applied to the STL wrapper methods. Previously the following global %exception directive would not be used on the wrapper methods: %exception { try { $action } catch (...) { // handle uncaught exceptions } } This has been implemented by replacing %exception directives for specific STL wrapper methods with an exception specification declared on the wrapper methods. throws typemaps are now supplied for handling the STL exception specification. These can also be easily overridden, for example the std::out_of_range exception, which is used a lot in the STL wrappers, can be customised easily: %include "std_vector.i" %typemap(throws) std::out_of_range { // custom exception handler } %template(VectInt) std::vector; 07/22/2005: efuzzyone [CLISP] The clisp module for SWIG: - It can only handle C, clisp currently does not supports ffi bindings to C++. - It has two options, (a) -extern-all this will generate wrappers for all functions and variablestions, (b) -generate-typedef this will generate wrappers "def-c-type" wrappers for typedefs - Can handle pointers to functions, complex types such as n-dimensional arrays of pointers of depth d - Generates wrappers for constants as well as variables - Correctly distinguishes between the declaration of variables in structures and functions - Creates a defpackage "declaration" with the module name as the package name, the created package exports both functions and variables - tries to guess when should a pointer variable be declared as c-ptr or c-pointer 07/22/2005: wsfulton [C#] Changes to support C# structs returned by value. The changes required are: - Using an optional 'null' attribute in the out typemap. If this attribute is specified, then it is used for the $null special variable substitution. - The ctype used in the C/C++ wrappers is no longer initialised to 0 on declaration. Both of these changes fix the situations where an attempt was made to assign 0 to the returned struct. Marshalling structs as value types still requires user defined typemaps. See documentation for an example. 07/22/2005: wsfulton [C#, Java] Fix SWIG_exception usage to work with compilers that don't support empty macro arguments. Unfortunately this fix will stop usage of SWIG_exception being used within typemaps that use "" or %{ %} delimiters, but continues to work with typemaps using {} delimiters. Please use the SWIG_CSharpSetPendingExceptionArgument or SWIG_JavaThrowException methods instead as SWIG_exception is really intended as a platform independent macro for the SWIG library writers. 07/16/2005: mkoeppe [Allegro CL] Use specific foreign types rather than (* :void). Use *swig-identifier-converter*. 06/27/2005: wsfulton Functions declared as 'extern' no longer have an additional function declaration added to the wrapper files. There are some cases where SWIG does not get this right, eg bug #1205859 (extern functions with default arguments declared in a namespace). Also SWIG cannot get non-standard calling conventions correct, eg Windows calling conventions are usually handled like this: %{ #define DLLIMPORT __declspec(dllimport) #define STDCALL __stdcall %} #define DLLIMPORT #define STDCALL %inline %{ DLLIMPORT extern STDCALL void function(int); %} SWIG incorrectly generates: extern void function(int); To which there is no solution as SWIG doesn't handle non-standard calling conventions. The extra 'extern' function that SWIG generates is superfluous unless a user has forgotten to add the function declaration into the wrappers. The -noextern commandline argument is now redundant and a new commandline argument -addextern can be used to obtain the original behaviour. This shouldn't be necessary unless the header file containing the function declaration was inadvertently not added to the wrappers. To fix this add the function declaration into your wrappers, For example, replace: extern void foo(int); with: %inline %{ extern void foo(int); %} *** POTENTIAL INCOMPATIBILITY *** 06/22/2005: wsfulton [C#, Java, Modula3, Ocaml] The intermediary function names have been changed when wrapping variables to match the other language modules so that %extend for a member variable works uniformly across all language modules, eg: %extend ExtendMe { Var; }; %{ void ExtendMe_Var_set(ExtendMe *, double) {...} double ExtendMe_Var_get(ExtendMe *) {...} %} The methods implementing the get/set used to be: %{ void set_ExtendMe_Var(ExtendMe *, double) {...} double get_ExtendMe_Var(ExtendMe *) {...} %} This also changes the name of variable wrapper functions when using -noproxy. The original names can be generated with the -oldvarnames commandline option. *** POTENTIAL INCOMPATIBILITY *** Version 1.3.25 (June 11, 2005) ============================== 06/11/2006: mkoeppe [Guile] Fix handling of anonymous-enum variables. 06/10/2005: mkoeppe [Guile] Fix for function arguments that are passed by copy-of-value. Fix for global "const char *" variables. Fix testcases arrays_dimensionless, arrays_global. 06/08/2005: wsfulton Fix for when a base class defines a symbol as a member variable and a derived class defines the same symbol as a member method. 06/08/2005: wsfulton [C#] More fixes for virtual/new/override modifiers - when a method has protected access in base and public access in derived class. 06/02/2005: wsfulton Fix #1066363 - Follow convention of release tarball name matching directory name. 06/02/2005: wsfulton [C#, Java] Fix #1211353 - typesafe enums (and Java proper enums) wrappers when enum value is negative. 05/27/2005: wsfulton Modernised and tidied up Windows macros --> SWIGEXPORT, SWIGSTDCALL. They can be overridden by users via -D compiler directives if need be. 05/26/2005: wsfulton %csmethodmodifiers can be applied to variables as well as methods now. In addition to the default 'public' modifier that SWIG generates, %csmethodmodifiers will also replace the virtual/new/override modifiers that SWIG thinks is appropriate. This feature is useful for some obscure cases where SWIG might get the modifiers incorrect, for example with multiple inheritance and overriding a method in the base class. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 05/25/2005: wsfulton Added missing constructors to std::pair wrappers (std_pair.i) for all languages. 05/25/2005: wsfulton [C#] Added std::pair wrappers in std_pair.i 05/25/2005: wsfulton [C#] The C# 'new' and 'override' modifiers will be generated when a C++ class inherits methods via a C++ 'using' declaration. 05/25/2005: wsfulton Fix for exception specifications previously being ignored in classes that inherited methods from 'using' declarations, eg calls to Derived::bar below will convert C++ exceptions into a target language exception/error, like it always has done for Base::Bar. class Base { virtual bar() throw (std::string); }; class Derived : public Base { using Base::bar; }; 05/23/2005: wsfulton Fixes for detecting virtual methods in %extend for the -fvirtual option and C# override and new method modifiers. 05/23/2005: wsfulton [C#] The 'new' modifier is now generated on the proxy method when a method in a derived class is not polymorphic and the same method exists in the derived class (ie it hides the base class' non-virtual method). 05/23/2005: wsfulton [Java, C#] Fixes to detection of covariant return types - when the class hierarchy is more than 2 classes deep. 05/21/2005: wsfulton [Java] std::wstring typemaps moved from std_string.i to std_wstring.i 05/21/2005: wsfulton Fix for crash in DohStrstr, bug #1190921 05/21/2005: wsfulton [TCL] Fix for methods with similar names when showing list of names on error - bug #1191828. Patch from Jeroen Dobbelaere. 05/21/2005: wsfulton [TCL] long long overloading fix - bug #1191835, patch from Jeroen Dobbelaere. 05/21/2005: wsfulton Fix bug #1196755 to remove debug from swigtcl8.swg. 05/19/2005: wsfulton [C# and -fvirtual option] Fix for the override key not being generated in the derived class when a virtual method's return type was a typedef in either the base or derived class. Also ensures the method is eliminated when using the -fvirtual option. For example, Derived.method now has the C# override keyword generated: typedef int* IntegerPtr; struct Base { virtual IntegerPtr method(); }; struct Derived : Base { int * method() const; }; [C#] Fix for the override key being incorrectly generated for virtual methods when a base class is ignored with %ignore. 05/13/2005: wsfulton [Java] Fixes to remove "dereferencing type-punned pointer will break strict-aliasing rules" warnings in C wrappers when compiling C code with 'gcc -Wall -fstrict-aliasing'. Patch from Michael Cahill. This modifies many of the casts slightly, for example arg1 = *(DB_ENV **)&jarg1; to arg1 = *(DB_ENV **)(void *)&jarg1; 05/12/2005: wsfulton [C#] Support for C# attributes. C# attributes can be generated: 1) On a C/C++ type basis by specifying an inattributes and/or outattributes typemap attribute in the imtype or cstype typemaps (for C# return type or C# parameter type attributes). 2) On a wrapped method or variable by specifying a csattributes feature (%feature). 3) On a wrapped proxy class or enum by specifying a csattributes typemap. Examples are in the C# documentation (CSharp.html). 04/29/2005: wsfulton New configure option to turn off the default maximum compiler warning as they couldn't be removed even when overriding CFLAGS and CXXFLAGS with configure (./configure CFLAGS= CXXFLAGS=). To turn the maximum warnings off, run: ./configure --without-maximum-compile-warnings 04/28/2005: wsfulton Patch from Scott Michel which reworks the Java constructor and finalize/destructor typemaps, for directors to reduce the number of overall Java typemaps. Added the director_take and director_release typemaps to emulate other modules' __disown__ functionality. *** POTENTIAL INCOMPATIBILITY FOR JAVA DIRECTORS *** 04/28/2005: wsfulton [C#] Fixed problems due to the over eager garbage collector. Occasionally the garbage collector would collect a C# proxy class instance while it was being used in unmanaged code if the object was passed as a parameter to a wrapped function. Needless to say this caused havoc as the C# proxy class calls the C++ destructor when it is collected. Proxy classes and type wrapper classes now use a HandleRef, which holds an IntPtr, instead of a plain IntPtr to marshal the C++ pointer to unmanaged code. There doesn't appear to be any performance degradation as a result of this modification. The changes are in the proxy and type wrapper classes. The swigCPtr is now of type HandleRef instead of IntPtr and consequently the getCPtr method return type has also changed. The net effect is that any custom written typemaps might have to be modified to suite. Affected users should note that the implementation uses the new 'out' attribute in the imtype typemap as the input type is now a HandleRef and the output type is still an IntPtr. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 04/28/2005: wsfulton [C#] Support for asymmetric type marshalling added. Sometimes the output type needs to be different to the input type. Support for this comes in the form of a new optional 'out' attribute for the ctype, imtype and cstype typemaps. If this typemap attribute is not specified, then the type used for both input and output is the type specified in the typemap, as has always previously been the case. If this typemap attribute is specified, then the type specified in the attribute is used for output types and the type specified in the typemap itself is used for the input type. An output type is a return value from a wrapped method or wrapped constant and an input type is a parameter in a wrapped method. An example shows that char * could be marshalled in different ways, %typemap(imtype, out="IntPtr") char * "string" char * function(char *); The output type is thus IntPtr and the input type is string. The resulting intermediary C# code is: public static extern IntPtr function(string jarg1); 04/22/2005: mkoeppe (Matthias Koeppe) [Guile] Fix generation of "define-method" for methods of classes with a constructor. Reported by Luigi Ballabio. 04/15/2005: wuzzeb (John Lenz) [Chicken] For wrapped functions that return multiple values (using argout), SWIG CHICKEN now returns them as multiple values instead of as a list. They can then be accessed using (call-with-values). 04/14/2005: wuzzeb (John Lenz) [Chicken] + Added a whole bunch of new _runme scripts into the chicken test suite. Also fix some bugs these new scripts turned up. + Added optimization when returning a wrapped proxy class. Before, a minor garbage collection was invoked every time a function returned. + All the chicken Examples should now run correctly 04/14/2005: wsfulton [C#] More fixes for typemap matching when wrapping variables, in particular std::string, so that std::string variables can be easily marshalled with a C# string property using: %include "std_string.i" %apply const std::string & { std::string *variable_name }; std::string variable_name; (Recall that all class variables are wrapped using pointers) 04/05/2005: wuzzeb (John Lenz) [Chicken] + Added Examples/chicken/egg, an example on how to build a chicken extension library in the form of an egg. Also updated the documentation on the different linking options. + chicken test-suite now has support to check SWIG with the -proxy argument if there exists a _proxy_runme.ss file. + More fixes for overloaded functions and -proxy 03/31/2005: wsfulton Turned on extra template features for all languages which were previously only available to Python. This enables typemaps defined within a templated class to be used as expected. Requires %template on the templated class, %template() will also pick up the typemaps. Example: template struct Foo { ... %typemap(in) Foo "in typemap for Foo " or %typemap(in) Foo "in typemap for Foo " }; %template(Foo_i) Foo; %template() Foo; will generate the proper 'in' typemaps wherever Foo and Foo are used. 03/30/2005: mkoeppe (Matthias Koeppe) [MzScheme] Patch from Hans Oesterholt for supporting MzScheme 30x. 03/29/2005: wuzzeb (John Lenz) [Chicken] + Reallow older versions of chicken (1.40 to 1.89) by passing -nocollection argument to SWIG + %import now works correctly with tinyclos. (declare (uses ...)) will be exported correctly. + TinyCLOS proxy classes now work correctly with overloaded functions and constructors. 03/29/2005: wsfulton [Java] Patch from Scott Michel for directorout typemaps. Java directors require the directorout typemaps like the other languages now. The new typemaps provide fixes for methods where the return type is returned by reference (this cannot automatically be made thread safe though). 03/22/2005: wsfulton Enum casting fixes. Visual C++ didn't like the C type casting SWIG produced when wrapping C++ enum references, as reported by Admire Kandawasvika. 03/21/2005: wsfulton [Perl] SF #1124490. Fix Perl macro clashes when using Visual Studio's STL string, so now projects can #include . 03/21/2005: wsfulton Fixed %varargs which got broken with the recent default argument changes. Also works for Java and C# for the first time now. 03/17/2005: wuzzeb (John Lenz) [Chicken] + Fix a whole bunch of bugs in the chicken module. The entire test suite now compiles, with the exception of the tests that require std_vector.i, std_deque.i, and so on, which chicken does not have yet. + Add support for %exception and %typemap(exceptions). Exceptions are thrown with a call to (abort) and can be handled by (handle-exceptions) 03/15/2005: wsfulton [Java] Patch from Scott Michel for directors. Modifications to the typemaps giving users fine control over memory ownership and lifetime of director classes. Director classes no longer live forever by default as they are now collectable by the GC. 03/15/2005: wuzzeb (John Lenz) [Chicken] Add support for adding finalizers garbage collected objects. Functions that return new objects should be marked with %newobject and input arguments which consume (or take ownership) of a pointer should be marked with the DISOWN typemap. Also add support for correctly checking the number of arguments passed to a function, and raising an error if the wrong number are passed. 03/14/2005: wuzzeb (John Lenz) Add --without-alllang option to configure.in, which is the same as passing all the --without-python --without-perl5 etc... that Matthias added. 03/09/2005: wsfulton [Php] Memory leak fix for functions returning classes/structs by value. 03/08/2005: wsfulton [Perl] Fix for Perl incorrectly taking memory ownership for return types that are typedefs to a struct/class pointer. Reported by Josh Cherry. 03/07/2005: wsfulton [C#] Various exception changes for the std::vector wrappers. These now more accurately mirror the same exceptions that System.Collections.ArrayList throw. 03/07/2005: wsfulton [C#] Fix undefined behaviour after any of the std::vector methods throw an exception. 03/07/2005: wsfulton [C#] When null is passed for a C++ reference or value parameter, the exception thrown has been corrected to an ArgumentNullException instead of NullReferenceException as recommended in the .NET Framework documentation. The default throws typemaps turn a C++ exception into an ApplicationException, not a SystemException now. 03/07/2005: wsfulton [C#] Numerous changes in C# exception handling have been made over the past few weeks. A summary follows: The way in which C++ exceptions are mapped to C# exceptions is quite different. The change is to fix C# exceptions so that the C++ exception stack is correctly unwound as previously C++ exceptions were being thrown across the C PInvoke layer into the managed world. New typemap attributes (canthrow and excode) have been introduced to control the mapping of C++ to C# exceptions. Essentially a callback into the unmanaged world is made to set a pending exception. The exception to throw is stored in thread local storage (so the approach is thread-safe). The typemaps are expected to return from unmanaged code as soon as the pending exception is set. Any pending exceptions are checked for and thrown once managed code starts executing. There should be minimal impact on execution speed during normal behaviour. Full details will be documented in CSharp.html. The SWIG_CSharpThrowException() function has been removed and replaced with the SWIG_CSharpSetPendingExceptionArgument() and SWIG_CSharpSetPendingException() functions. The original name has been deliberately changed to break old code as the old approach was somewhat flawed. Any user defined exceptions that follow the same pattern as the old approach should also be fixed. Numerous new .NET framework exceptions are now available for easy throwing from unmanaged code. The complete list is: ApplicationException, ArithmeticException, DivideByZeroException, IndexOutOfRangeException, InvalidOperationException, IOException, NullReferenceException, OutOfMemoryException, OverflowException, SystemException, ArgumentException, ArgumentNullException and ArgumentOutOfRangeException. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 05/05/2005: mmatus Fix several memory leaks around. Even when we survive knowning swig is a memory leak factory, it was a little out of control. To run std_containers.i in the python test-suite, swig was using ~260MB, now it uses 'only' ~40MB, which is the same ammount that g++ uses, so, is not that bad. In the process, I found a couple of extra Deletes, which in some cases could trigger seg. faults and/or DOH/asserts. [python] Better support for directors + exception. More verbose errors and added an unexpected exception handler. [python] Fix memory leak for the std::vector > case,reported by Bo Peng. [python] Fix SwigPyObject compare problem reporte by Cameron Patrick. [python] Fix several warnings in the generated code for gnu-gcc, Intel and VC7.1 compilers. 02/25/2005: wuzzeb (John Lenz) Update documentation to use CSS and
    instead of
    I used a script to convert the docs, and it set all the box classes to be "code". There are actually 4 different classes, "shell", "code", "targetlang", and "diagram". We need to go through and convert the divs depending on what they contain. 02/23/2005: mmatus [Python] Added option -nortti to disable the use of native C++ RTTI with directors (dynamic_cast<> is not used). Add more code for directors to detect and report errors in the python side. Extend the use of SWIGINTERN whenever is possible. Remove template warnings reported by VC7.1. Remove warnings reported by gcc/g++. Finally you can compile using g++ -W -Wall -c mymodule_wrap.cxx and no spurious errors will be generated in the wrapper code. 02/23/2005: wuzzeb (John Lenz) Added -external-runtime argument. This argument is used to dump out all the code needed for external access to the runtime system, and it replaces including the files directly. This change adds two new virtual functions to the Language class, which are used to find the language specific runtime code. I also updated all languages that use the runtime to implement these two functions. 02/22/2005: mmatus Fix %template + private error SF#1099976. 02/21/2005: mmatus Fix swigrun.swg warnings reported when using "gcc -W -Wall" (static/inline not used in front of a function declaration), and add SWIGUNUSED attribute to avoid unused warnings elsewhere. Fix unused variable warnings. [Python] Use new SWIGUNUSED attribute to avoid warnings in SWIGINTERN methods. [Python] Fix PyOS_snprintf for python versions < 2.2 (SF #1104919). [Python] Fix map/multimap to allow empty maps (reported by Philippe Hetroy). [Docs] Add some documentation to Python.html and SWIGPlus.html, including for example the fact that 'friends' are now supported. 02/21/2005: wsfulton [PHP] Patch from Olly Betts, so that wrappers compile with Zend thread safety enabled. 02/17/2005: wsfulton Memory leak fix in some of the scripting language modules when using default arguments in constructors. The scripting language was not taking ownership of the C++ object memory when any of the constructors that use default arguments was called. 02/16/2005: wsfulton SF #1115055: Failed make install. Patch from Rob Stone. 02/16/2005: wsfulton [Java] SF #1123416 from Paul Moore. Correct memory allocation for STRINGARRAY typemaps in various.i. 02/15/2005: wsfulton Disabled typemap search changes for now (see entry 19/12/2004). It breaks old typemaps, lengthens the execution time by about 25% and introduces inconsistencies. 02/15/2005: wsfulton swig -help follows other software by printing to stdout instead of stderr now. swig -version also displays to stdout instead of stderr now. Behaviour reported by Torsten Landschoff. 02/15/2005: wsfulton [Ruby] Fix for the less commonly used ordering of %include and #include, so that the generated code compiles. Bug reported by reported by Max Bowsher. %include foo.h %{ #include foo.h %} 02/15/2005: wsfulton [C#, Java] SWIG_exception macro will now return from unmanaged code / native code as soon as it is called. Fixes possible JVM crashes and other code unexpectedly being executed. Note SWIG_exception is only occasionally used by SWIG library writers, and is best avoided by SWIG users. 02/15/2005: wsfulton [C#, Java] Typemaps can now be targeted at global variable names and static member variable names. Previously the typemaps for the setters were ignored, for example: %typemap(in) int globalint "..." int globalint; 02/13/2005: mkoeppe (Matthias Koeppe) [Guile] Add %typecheck for SWIGTYPE, add %typecheck for ptrdiff_t, fix typemaps for size_t. [Pike] Merge patch from Torsten Landschoff for improved Pike configuration. 02/12/2005: mkoeppe (Matthias Koeppe) New configure switches --without-tcl, --without-python etc. allow to disable the search for installed languages. 01/31/2005: wuzzeb (John Lenz) - Add DohSortList to DOH - Improve the runtime type system: + Speed. Type loading is now O(n log n) instead of O(N^2), which for large modules is a huge improvement. + A whole bunch of functions in swigrun.swg no longer need the swig_type_list_handle passed to them. The only one left is TypeQuery. This also makes runtime.swg a lot smaller. + Split up swig_type_info structure into two structures (swig_type_info and swig_cast_info) + Store a pointer to a swig_type_info rather than just the type name string in the linked list of casts. First off, this makes the guile module a little faster, and second, the SWIG_TypeClientData() function is faster too. + Add the idea of a module into the type system. Before, all the types were stored in one huge linked list. Now, another level is added, and the type system stores a linked list of modules, each of which stores an array of types associated with it. + For more information of how the runtime type system now works, please see Doc/Manual/typemaps.html and Doc/Devel/runtime.txt - Update all language modules to use the new type system. The changes to each language module are minor. All languages are now able to use runtime.swg for external access to the type system. Before only python and perl did. - [guile, mzscheme, ocaml, and php4] These languages opened up the init function inside the .cxx code, and any code in the .swg files in the init section was inside this function. This was a problem for swiginit.swg, which needs to be inserted before the SWIG_init function is opened. Thus I changed these languages to be like python or perl, where the init function is declared in the .swg file. - [Ruby] Instead of moving the init function to the .swg file, I added a new section initbeforefunc, and then added %insert(initbeforefunc) "swiginit.swg" - [MzScheme] Fix enums and fix Examples/Makefile.in so that if multiple -I arguments are specified in the INCLUDES variable, each gets a ++ccf. - [Guile GH] Update Guile GH to use the new type system. See Doc/Manual/Guile.html for how smobs are now used. 01/11/2005: wsfulton [C#] New typemap called 'csconstruct'. The code in this typemaps was previously hard coded and could not be customised by a user. This typemap contains the code that is generated into a proxy class's constructor. [Java] New typemap called 'javaconstruct'. The code in this typemaps was previously hard coded and could not be customised by a user. This typemap contains the code that is generated into a proxy class's constructor. Another typemap named 'javaconstruct_director' is used instead when the proxy class is a director class. [C#, Java] If a C++ class did not have a default constructor, a protected default constructor was automatically generated by SWIG. This seems is unnecessary and has been removed and thereby giving the user almost complete control over the generated code along with the new typemaps above. 19/12/2004: mmatus [Disabled, see entry 02/15/2004] - Fix typemap search, now the "out" typemap search is done as follows int *Foo::foo(int bar) -> int *Foo::foo(int bar) -> int *Foo::foo -> int *foo(int bar) -> int *foo -> int * then, now you can be more specific, and define /* apply only for 'Foo::foo' method */ %typemap(out) int * Foo::foo(int *bar) ...; /* apply for all 'foo' functions/methods */ %typemap(out) int * foo(int *bar) ...; %inline { struct Foo { int *foo(int *bar); }; } 15/12/2004: mmatus - More fixes for templates and template default args. See template_default.i for scary cases that now are supported, besides the already ugly STL/std cases. - Cosmetics and more use of 'const' where it was implicit. - Other fixes for OSS, which is now working again with 1.3.25. Version 1.3.24 (December 14, 2004) ================================== 12/12/2004: wuzzeb (John Lenz) [Chicken] Fix a bunch of bugs relating to -proxy support + non-class variables now export properly using -proxy + static member functions now export properly using -proxy + member class variables now export properly using -proxy + added a -nounit argument, which does not export the (declare (unit ...)) + correctly install swigclosprefix.scm + constants (enums, defines) now correcly export when using -proxy 12/11/2004: wsfulton configure fix for when more than one version of jni_md.h is found in the Java include directory (was generating lots of sed error messages). 12/08/2004: wsfulton [Java] Fixes to arrays_java.i so that one can apply the array typemaps to functions taking pointers as input, eg %include "arrays_java.i" %apply int[] {int*}; void foo(int *a); 12/05/2004: wsfulton [Java] Director mods contributed by Scott Michel. New typemaps directordisconnect and directordisconnect_derived for the swigDirectorDisconnect() method. Also fix to get the javapackage typemap working again. 12/05/2004: mmatus - Finishing the fixes for templates + default template args + specializations. - [Python] Now we use the new templates + default template args in the std/STL library. That means the internal swig files are getting uglier since we now support the original declarations: template > class vector { .... }; template, class _Alloc = std::allocator > > class map { .... }; and the user can use the %template directive as %template() std::vector; %template() std::vector >; %template() std::vector >; Now we are closer to the cleaning/rewriting of the python std/STL support, such that we recover support for MSVC++ 6.0, and we can add support for other languages too. 12/02/2004: wsfulton [Java] Fix for directors when wrapping methods using a member enum and typesafe/proper enums enabled. 12/01/2004: mmatus - Fix typemaps to work with templates and default template args, ie template struct Foo { }; %typemap(in) Foo *{...} %typemap(out) Foo *{...} Foo * foo( Foo *f1, Foo *f2); now 'f1', 'f2' and the return value resolve the provided typemaps properly. This is highly needed for proper STL support, see new std_basic_string.i, std_sstream.i, etc. - Added std_sstream.i, and fix std_basic_string.i to use the new typemaps + template def. arg mechanism. Also, added the needed std_alloc.i. Now, all the containers can be modified to support std::allocator, like in: template > class vector { public: .... }; This change is only completed by now for basic_string. - Fix for smart pointers + members + extensions: %extend Foo { int extension(int i, int j) { return i; } int extension() { return 1; } } %inline %{ class Foo { public: int y; static const int z; }; class Bar { Foo *f; public: Bar(Foo *f) : f(f) { } Foo *operator->() { return f; } }; now you can f = Foo() f.y = 3 a = f.z f->extension() b = Bar(f) b.y = 3 a = b.z b->extension() - Other small errors fixes, mostly python. 11/25/2004: wsfulton [Java] Numerous director bug fixes so that the correct java types and canonicalized types in the JNI code are emitted. Use of the $javaclassname special variables in the director typemaps now consistent with the non-director typemaps. The types used for typemap lookups are also corrected in a few places. If you previously had your own director typemaps, ensure they are using the correct C++ type. *** POTENTIAL INCOMPATIBILITY FOR JAVA DIRECTORS *** 11/25/2004: wsfulton const enum SWIGTYPE & typemaps added. These wrap const enum references as if they were passed by value. Const enum references thus work the same as const reference primitive types such as const double &, const int & etc. Typemaps added for Java, C#, Ruby, Tcl, Perl and Pike. 11/25/2004: wsfulton [Java, C#] New special variable: $*javaclassname, similar to $javaclassname and $&javaclassname. The new one removes a pointer from the C type before obtaining the Java class name. One or more of $javaclassname, $&javaclassname or $*javaclassname may now appear in a typemap. Likewise for C# using csclassname instead of javaclassname. 11/25/2004: wsfulton The last vestiges of enums being handled as integers removed from the internals. The wrapper methods use the enum type rather than an int now. The net result is added type safety for enums when handled as pointers, references etc. Previously in situations such as a method taking a pointer to an enum, a pointer to an int or a pointer to an enum of some other type could inadvertantly be passed to the method. This is now fixed as the descriptor for an enum is no longer based on an int, but the enum type instead. Anonymous enums are still handled as integers. The consequence for scripting language users in correct usage of enums should not be noticeable. There is no change for any of the languages where enums are passed by value - most of the scripting languages will still accept an integer for an enum value and the strongly typed languages still use either typesafe enums, integers or proper enums depending on what the user configures. For Java and C# users a change in the typewrapper class name has occurred (for enum pointers, references etc). For example: enum Numbers { one=1, two }; enum Numbers* number(); In Java and C# this must now be coded as SWIGTYPE_p_Numbers n = modulename.number(); rather than SWIGTYPE_p_int n = modulename.number(); *** POTENTIAL INCOMPATIBILITY *** 11/21/2004: wsfulton/mmatus Added missing deprecated warning for %name and remove remaining %name usage in the SWIG libraries. 11/21/04: mmatus - [Python] Adding the PySwigObject to be used for carrying the instance C/C++ pointers. This is used instead of string and PyCObjects. The new PySwigObject is even safer than PyCObject, and more friendly than plain strings: now you can do print a.this print str(a.this) _00691608_p_A print long(a.this) 135686400 print "%s 0x%x" % (a.this, a.this) _00691608_p_A 0x8166900 the last one is very useful when debugging the C/C++ side, since is the pointer value you will usually get from the debugger. Also, if you have some old code that uses the string representation "_00691608_p_A", you can use it now again using 'str(ptr)', or by calling 'str = PyObject_Str(obj)' in the C/C++ side. This change is mainly for nostalgic swig users that miss the string representation, but also allows to say again if a.this == b.this: return "a is b" and well, since the change were really simple, maybe in the future we will be able to do next = a.this + 1 or add native python iteration over native C/C++ arrays, ie, no need to create/copy new tuples when returning and array or vector. Also, a PySwigPacked object was adding to carry a member method pointer, but this is probably a temporal solution until a more general object for methods is added. Be aware that to simplify maintaining and compatibility with other tools, the old string and PyCObjects representation could disappear very soon, and the SWIG_COBJECTS_TYPES or SWIG_NO_OBJECT_TYPES macros will have no effect at compilation time. Still, the three mechanisms are present in the code just for testing, debugging and comparison purposes. 11/21/04: mmatus - [Python] Adding back support for using the swig runtime code inside the user code. We just allow the user to include the minimal code needed to implement the runtime mechanism statically, just as in done in the swig modules. To use the swig runtime code, for example with python, the user needs include the following: #include // or using your favorite language #include #include // or using your favorite language #include the files swigrun.swg, pyrun.swg and runtime.swg can be checked out by using swig -co, or they can simply be found by adding the swig lib directory to the compiler include directory list, for example SWIGLIB=`swig -swiglib` c++ -I${SWIGLIB} .. of better, using the CPPFLAGS, but that depends on your environment. This change can be ported to the other languages too, you just need to isolate the needed runtime code in a single file like 'pyrun.swg', and provide the SWIG_Runtime_GetTypeList() method. Look at the Lib/python/pyrun.swg file and the Examples/python/swigrun example. 11/15/04: mmatus - Fix mixed_types.i + gcc-3.4, ie, arrays + references + typedefs - Fix multidim arrays + typedefs,ie typedef char character[1]; typedef character word[64]; - Process protected/private bases in the same way before we process protected/private members, ie, we check for constructors, operator new, virtual members, etc. - Fix Ruby/Java to work (or ignore) multi-inheritance + directors. Allow other languages to define if it is supported or not. - Now you can run SWIG_FEATURES="-directors -dirprot" make check-ruby-test-suite make check-python-test-suite make check-java-test-suite make check-ocaml-test-suite and you will get only 'real' errors. ruby and python compile with no errors, java shows some problems. Version 1.3.23 (November 11, 2004) ================================== 11/05/2004: wsfulton Patch #982753 from Fabrice Salvaire: Adds dependencies generation for constructing makefiles. New command line options -MF -MD -MMD to work with the current options -M and -MM. These options are named the same and work the same as in gcc. 11/05/2004: wsfulton %ignore/%rename changes for methods with default arguments to mirror %feature behaviour. See previous entry. *** POTENTIAL INCOMPATIBILITY *** 11/04/2004: wsfulton %feature improvements for fine tuning when wrapping methods with default arguments. Any %feature targeting a method with default arguments will apply to all the extra overloaded methods that SWIG generates if the default arguments are specified in the feature. If the default arguments are not specified in the feature, then the feature will match that exact wrapper method only and not the extra overloaded methods that SWIG generates. For example: %feature("except") hello(int i=0, double d=0.0); void hello(int i=0, double d=0.0); will apply the feature to all three wrapper methods, that is: void hello(int i, double d); void hello(int i); void hello(); If the default arguments are not specified in the feature: %feature("except") hello(int i, double d); void hello(int i=0, double d=0.0); then the feature will only apply to this wrapper method: void hello(int i, double d); and not these wrapper methods: void hello(int i); void hello(); This has been introduced to make %feature more powerful to ease the migration to new default arguments wrapping approach. *** POTENTIAL INCOMPATIBILITY *** If you previously had a %feature and didn't specify the default arguments, you will have to add them in now or you can obtain the original behaviour by using %feature("compactdefaultargs"). 11/04/2004: wsfulton [C#] Typemaps for std::vector added into std_vector.i. The proxy classes generated are modelled on the .NET ArrayList class. This isn't quite ready for general consumption yet, but will work with vectors of primitive types and some classes. 10/3/2004: wuzzeb (John Lenz) [GUILE] The -scm interface is now the default. The old GH interface can still be enabled by passing -gh to SWIG. 10/2/2004: mmatus - More fixes for namespace + class declarations. As an extra bonus, we get %template support for static/members class methods, ie, now you can say: namespace space { struct A { template static void fooT(Y y) { } }; } struct B { template void barT(Y y) {} }; %template(foo) space::A::fooT; %template(foo) space::A::fooT; %template(foo) space::A::fooT; %template(bar) B::barT; %template(bar) B::barT; %template(bar) B::barT; and call A.foo(1) b = B() b.bar(1) note the methods are emitted inside the classes, and hence, the %template name refers to the 'member' method name, not a global namespace name. 10/31/2004: mmatus - Solve namespace + class declarations, as in namespace foo { struct Bar; struct Foo { }; } struct foo::Bar : Foo { }; see namespace_class.i for more examples. - Fix %template directive to properly use namespaces, including the case: namespace one { template struct Ptr {}; } namespace one { struct Obj1 {}; typedef Ptr Obj1_ptr; %template(Obj1_ptr) Ptr; } namespace two { struct Obj2 {}; typedef one::Ptr Obj2_ptr; %template(Obj2_ptr) one::Ptr; } this is done by using the namespace name 'one' to create a namespace node to emit the template instantiation, just as before, but the template parameters are resolved and qualified in the current namespace ('one' or 'two'). This is same way that typedef works. This resolve the smart_pointer_namespace2.i case, and at the same time, several other ones where before swig was generating the "Can't instantiate template 'xx' inside namespace 'yy'" error message. In fact, that error doesn't exist anymore. You can only get an error if you use a bad namespace name or so. 10/30/2004: mmatus - [ruby] Directors fixes: - enums and std::strings are working now (several reports in bug track system) - added patch 1025861 for director + exceptions *** Attention ***: ruby with directors + protected members work with version 1.7+. Older versions seems to have a broken signature for'rb_protect'. If you need to use an old version, look at http://excruby.sourceforge.net/docs/html/ruby__hacks_8hpp-source.html for workarounds. - [ruby] Fix memory allocation problem in typemap (bug 1037259) - [tcl] Fix (enums|constants) + namespace option (reported by jason.m.surprise@intel.com). - [perl] Add patch 962168 for multiple inheretance - Fix 'defined' as variable name. 10/29/2004: wsfulton Seg fault fix for global scope operator used for friend methods: class B { friend void ::globalscope(); ... }; 10/28/2004:mmatus - Added module and swig option "templatereduce" to force swig to reduce any type needed with templates, ie, in these cases %module("templatereduce") test template struct A { }; typedef int Int; %template(A_Int) A ==> %template(A_Int) A typedef B* Bp; %template(A_Bp) A ==> %template(A_Bp) A swig reduces the types Int and Bp to their primitives int and B*. This is closer to the usual compiler resolution mechanism, and it is really needed sometimes when you mix templates + typedefs + specializations. Don't use it if you don't have any problem already, since the type reduction can interfere with some user typemaps, specially if you defined something like typedef int Int; %typemap(in) Int ...; in this case, when you use the "templatereduce" option, swig will ignore the user typemap, since the "typedef int Int" will take precedence, and the usual "int" typemap will be applied. Note that the previous case is not common, and should be avoided, ie, is not recommended to use a typedef and a typemap at the same time, specially if you are going to use templates + specializations. - Directors: virtual destructor is always emitted now, this doesn't cause any harm, and could solve some nasty and mysterious errors, like the one mentioned by Scott. also the destructor is not in-lined, so, that can solve some other mysterious errors when mixing directors + imports + embedded applications + some specific compilers. 10/27/2004: wsfulton [C#] typemaps.i library file with INPUT, OUTPUT and INOUT typemaps added. 10/27/2004: wsfulton [Java] std::wstring typemap fixes in std_string.i from Russell Keith-Magee. 10/25/2004: mmatus - Using + namespace is working now (using_namespace.i). - Derived + nested classes is working now (deriver_nested.i), but of course, we are still waiting for the nested class support. - Directors: - unnamed parameters support, - protected constructor support (automatic and with dirprot mode), - detection of really needed protected declarations (members and constructors) now is done automatically. Even if you don't use the 'dirprot' mode, swig will wrap what is minimally needed (and protected) for the code to compile. what is public, as usual, is always wrapped, and if you use the 'dirport' - Final fixes for the OSS to compile with SWIG 1.3.23 (my very very ugly C++ + templates + everything mounters wrap). 10/25/2004: wsfulton [C#] New commandline option -dllimport. This enables one to specify the name of the DLL for the DllImport attribute. Normally this name comes from the module name, so now it is possible to override this: swig -csharp -dllimport xyz example.i will generate for all the wrapped PInvoke methods: [DllImport("xyz", EntryPoint="...")] public static extern ... The wrappers from many different SWIG invocations can thus be compiled into one DLL. A new special variable $dllimport can also be used in typemaps, pragmas, features etc. This will get translated into the value specified by -dllimport if specified, otherwise the module name. 10/22/2004: wsfulton [Java] Patch #1049496 from Scott Michel fixes directors methods with enums when wrapped with typesafe or proper Java enums. 10/21/2004: wsfulton Fixes for default arguments in director constructors (Python, Ruby, Ocaml). 10/21/2004: mmatus - [Python] Add the '-cpluscast' option to enable the 'new' C++ casting operators, such as 'static_cast', inside the typemaps. By default swig use the old C cast style, even when parsing C++. - [Python] Add the '-new_vwm' option to enable the new SwigValueWrapper mode. Now this is mainly for testing that the typemaps are really safe for any future solution, but you can use it if you have a very strange error with default cosntructors missing + %apply + %typemap, and if everything else fails (see valuwrapper_opaque.i for alternative and current solutions). If you are a user that don't know what is SwigValueWrapper, don't even try it. - [Python] Add the '-noh' option to be used with directors and when you prefer to disable the generation of the director header file. If not used, swig will work as usual generating both the wrap.cxx and wrap.h files. If you use it, swig will only generate wrap.cxx. 10/21/2004: wuzzeb (John Lenz) - If you define SWIG_TYPE_TABLE when compiling a wrapper file, the runtime types will be stored in the given type table name. Using this, you can seperate different modules to share their own type systems. -DSWIG_TYPE_TABLE=Mytable - [Python] If you define SWIG_STATIC_RUNTIME then the type information will be static to this wrapper. Nothing will be shared with any other modules - [Python] If you define SWIG_LINK_RUNTIME, then instead of using the new way of sharing type information, the wrapper will expect to be linked against the Lib/linkruntime.c file. Any modules compiled with SWIG_LINK_RUNTIME and linked against linkruntime.c will all share type information. 10/20/2004: mmatus - [Python] Initial fix for python/import example. Please update the Makefile (autoconf, configure, etc, expert), since now probably is only working with g++, icc and a few other compilers that have the -shared option. We need to create additional shared libraries for the virtual destructors. Old and usually forgotten C++ requirement. Same fix need to be used in perl, I think. - [Python] Fix generation of header file for directors, now directors.swg is also included, so, it can be really used from C++, and it solves some problem with compiler that require that, even with the simple swig inclusion. - [Python] Reordering the methods and moving some bodies outside the class declaration. This is needed due to some gcc-2.96 internal compiler errors. It seems the PYTHON class is getting too large to been declared and defined at the same time. - Add the -oh option to change the output header file name if needed: swig -c++ -python test.i -o test.CC -oh test.HH this is mainly needed when using directors, and if the current default header file name is not good for you, which is generated as follow: swig -c++ -python test.i => test_wrap.h swig -c++ -python test.i -o test.CC => test.h 10/20/2004: wsfulton 1) Compact default arguments feature added. This feature allows one to use the default argument code generation that was used in SWIG-1.3.22 and earlier versions. It produces more compact wrappers as only one wrapper method is generated for any method with default arguments. So the advantage is it generates less code but has the original limitations, like it it does not work with all default arguments and default arguments cannot be taken advantage of in the strongly typed languages (C# and Java). It is implemented via the usual %feature mechanism: %feature("compactdefaultargs"); 2) Keyword arguments (kwargs) are working again for default arguments in the languages that support it, ie, Python and Ruby. The new default argument wrapping approach using overloaded methods cannot support kwargs so the compact default argument feature is automatically turned on when kwargs are specified, by %feature("kwargs"). 3) Compact default arguments are also automatically turned on when wrapping C (not C++) code. This is to support the bizarre notion of default arguments for C code. 10/20/2004: wsfulton Overloaded templated functions in namespaces also working now. Templated functions with default arguments in namespaces too. 10/19/2004: mmatus - Allow to disable the new SwigValueWrapper mechanism, if you add the following line in your language main. /* Turn on safe value wrapper use mode */ Swig_value_wrapper_mode(1); Now is only active in python. All the other languages are using the old resolution, but they can also use the "valuewrapper"/"novaluewrapper" features to fix some of the old broken cases. Note, however, that not all the broken cases can be solved in that way. The new mechanism seems to be working fine in perl, ruby and tcl, but failing in some typemaps in java. Hence, is upto the language maintainer to test it, and decide to enable it or not. Look at the valuewrapper_opaque.i for examples. - Fix more SwigValueWrapper cases when the new mechanism is active. Now it also check for local typemap variables, see valuewrapper_opaque.i for an example when this is needed. But again, this extra checking will only be activated when using the new value wrapper mode. - [Python] Fix variable wrapping of classes with private assign operators. It should be easy to fix in all the other modules, instead of checking if (!Getattr(n,"immutable")) ... you need to verify if (is_assignable(n)) ... Look at the private_assign.i for an example. 10/18/2004: mmatus - %features "director"/"nodirector" now work as expected. - General fixes in %feature to resolve function decl properly, %feature("hello") foo(); char foo() -> f() // was working char *foo() -> f().p // it wasn't - Template + specialization + default template args now is working, (don't confuse with template + default arg values, that was solved before), now this ugly case is working: template > struct Vector { Vector(T a){} }; template <> struct Vector { Vector(){} int foo() { return 0; } }; %template(V_c) Vector >; %template(V_i) Vector; // picks Vector > %template(V_d) Vector; // picks the specialization this is needed for automatic STL support (later will be). - Fix the template + typedef errors in test-suite, which probably will fix another group of strange template + namespaces + typedefs errors. - %warnfilter is working better now, parser.y tries to use them when needed. - **** New default type resolution method (stype.c) ***** It preserves the original mixed types, then it goes 'backward' first deleting the qualifier, then the inner types, for example: typedef A *Aptr; const Aptr&; r.q(const).Aptr -> r.q(const).p.SWIGTYPE r.q(const).p.SWIGTYPE -> r.p.SWIGTYPE r.p.SWIGTYPE -> r.SWIGTYPE r.SWIGTYPE -> SWIGTYPE enum Hello {}; const Hello& hi; r.q(const).Hello -> r.q(const).enum SWIGTYPE r.q(const).enum SWIGTYPE -> r.enum SWIGTYPE r.enum SWIGTYPE -> r.SWIGTYPE r.SWIGTYPE -> SWIGTYPE int a[2][4]; a(2).a(4).int -> a(ANY).a(ANY).SWIGTYPE a(ANY).a(ANY).SWIGTYPE -> a(ANY).a().SWIGTYPE a(ANY).a().SWIGTYPE -> a(ANY).p.SWIGTYPE a(ANY).p.SWIGTYPE -> a(ANY).SWIGTYPE a(ANY).SWIGTYPE -> a().SWIGTYPE a().SWIGTYPE -> p.SWIGTYPE p.SWIGTYPE -> SWIGTYPE before it always stops after finding ref/pointer/enum/array/etc. Now, then, you can define (use and apply) 'higher' typemaps such as: %typemap(in) SWIGTYPE* const& %typemap(out) char FIXSIZE[ANY] %typemap(in) SWIGTYPE* const& %typemap(in) const enum SWIGTYPE& %typemap(in) SWIGTYPE[ANY][ANY] %typemap(in) const char (&)[ANY] It is possible with this change that previous typemaps that were defined (but ignored), now will start to work. Also, it is necessary check for the '%typemap(varin) SWIGTYPE[]', before it was usually not defined (but char[] was), and that can produce some inconsistencies. *** POTENTIAL INCOMPATIBILITY *** This change was needed for STL, since std::vector std::vector, etc, will always generate methods that mix const references with the vector type. Now that is working, all the std::container specialization will not be needed anymore, well, in theory. In the practice, everythin is working as before until the proper mixed types are defined and the libraries simplified to use them. - Change the behavior of extern "java"/"fortran"/"etc", now swig produces a warning, and use extern "C" instead. The warning can also be disable with the "-w 313" flag. (WARN_PARSE_UNDEFINED_EXTERN). - SwigValueWrapper is now more selective (lang.cxx). [Perl/Tcl] - Fix some typemaps (perl/tcl) to work properly with SwigValueWrapper. This was not a problem with SwigValueWrapper, but with the typemaps that now are safe to use with %apply. [Python] - Fix %callback/%pythoncallback work now as before after the def args changes. Also, %callback now is an alias for %pythoncallback, so, they do the same. [Python/Ruby] - %callback is more usable and uniform: %callback("%s_cb") foo(); // for both, python/ruby %callback("%s_cb"); // for both, python/ruby %callback(1) foo(); // only in python. 10/17/2004: arty [OCAML] - Tweak to enum typing for soundness in the presence of multiple modules. - global functions are now unambiguous in multiple loaded modules. - Fixed test case code to build multimodule test cases correctly. - There is no way to share overload resolution across modules because of soundness issues. If the user wants to call some function foo from an arbitrary module bar, they will have to use Bar._foo to call it correctly. Later I will fix the camlp4 module to do something clever in this case. - Promided performance overhaul of class mechanism. - Removed symbol hack for ocaml-3.07 and below which is not needed for ocaml-3.08 and above. 10/16/2004: wuzzeb (John Lenz) [CHICKEN] - Completly change how chicken.cxx handles CLOS and generic code. chicken no longer exports -clos.scm and -generic.scm. The clos code is exported directly into the module.scm file if -proxy is passed. - The code now always exports a unit. Running the test-suite is now majorly broken, and needs to be fixed. - CLOS now generates virtual slots for member variables similar to how GOOPS support works in the guile module. - chicken no longer prefixes symbols by the module name, and no longer forces all names to lower case. It now has -useclassprefix and -closprefix similar to how guile handles GOOPS names. 10/16/2004: wsfulton Templated functions with default arguments working with new default argument wrapping approach. The new approach no longer fails with the following default argument pattern (previously failed with some primitive types, like unsigned primitive types): template int foo(const T& u = T()); %template(foo) foo; This relies on the templated function overloading support just added, so all the combinations of overloading by template parameters and normal parameters as well as overloading with default parameters works. 10/16/2004: wsfulton Added support for the large range of templated function overloading that C++ supports. - Overloaded templated functions, eg template int overload(T t); template int overload(T t, const T &r); - Fixes where the templated type is not used in the parameter list, eg template void xyz(); template<> void xyz(); - Fixes for overloading of plain functions by a templated function: void abc(double d); template void abc(T t); - Overloading by templated parameters fixed: template void foo(T t) {} template void foo(T t, U u) {} %template(foo) foo; - All combinations of the above also working including specializations, eg: void abc(double d); template void abc(T t); template<> void abc(double t); template<> void abc(int t); 10/16/2004: wuzzeb (John Lenz) - Remove the ability to share type information by using c linking. All type sharing happens through a global variable in the target language. + Remove SWIG_NOIMPORT, SWIG_RUNTIME, and related defines. + Deprecate -runtime, -noruntime command line options + Update test-suite common.mk to correctly build multicpptest + Remove reference to precommon.swg + Update the guile_gh interface to share data by a global var instead of c linkage. - Remove Advanced.html, since everything in it is now obsolete 10/09/2004: mmatus - Split the python std/STL C++ library files, now all the language independent definitions are under the directory Lib/std and hence, can be used from other languages. - Add more documentation to the Python STL, and clean unnecessary code. - Add initial C99 complex support, and some fixes for long double. 10/08/2004: mmatus - Fix the SwigValueWrapper for opaque types, now it is applied for opaque templates and classes, for which we don't know if there is or not a default constructor, ie struct A { A(int); }; Still, if you know that you class has a default constructor, and for some very very particular reason you want to avoid the SwigValueWrapper, and you don't want or can't expose the class to swig, now you can say %feature("novaluewrapper") A; class A; or the other way around, if the class has a default constructor, but you want to use the value wrapper, you can say %feature("valuewrapper") A; struct A { A(); .... }; - Fix for char > 128, ie const char tilde_a = '\341'; - Add patch 1041858 for $lextype, which carries the literal type of a symbol. See lextype.i in the test-suite for more details. 10/07/2004: wsfulton {Ruby, Java] Fix director + 'empty' throws struct A { A() throw(); virtual ~A() throw(); int foo() throw(); }; 10/06/2004: wuzzeb (John Lenz) [TCL] - Fix bug reported by William A. Hoffman propagating clientdata between modules. Added clientdata_prop.multicpptest to check for this bug. The fix involved the following changes: + SwigType_clientdata_collect does not need to check types in r_resolved because we only want to propagate clientdata to typedefed classes, and r_mangled already takes care of typedefs. + SWIG_TypeRegister now copies the clientdata field correctly + Move SWIG_Guile_PropagateClientData function from guile module into common.swg, because we need to call it from both guile and tcl. + Add base_names to swig_class to delay the lookup of bases. SWIG now exports the base names and only when the base swig_class is needed is SWIG_TypeQuery(name)->clientdata looked up. - conversion_ns_template testsuite test was failing because the name of the wrapped constructor function was not calculated correctly for structs. Fixed. 10/06/2004: wsfulton Fixes for default arguments used in directors - in virtual methods and director constructors. 10/06/2004: mmatus Fix the __cplusplus macro, and bug 1041170. Now it is working as supposed, ie, you can safely use #ifdef __cplusplus ... all over swig, including inside %defines and %{ %} bodies. *** POTENTIAL INCOMPATIBILITY *** The old trick of using #if __cplusplus doesn't work any more. So, if you have your own typemaps using that syntax, you will need to migrate them to use "#ifdef __cplusplus". 10/05/2004: wuzzeb (John Lenz) - Reorganize how runtime type information is stored and shared between modules. For chicken and mzscheme, I removed the ability to use runtime libraries, while perl, tcl, python, and ruby default to using the new method but can go back to the old method by declaring SWIG_ALLOW_RUNTIME. - line 582 in mzscheme.cxx was generating a segfault on imports.multicpptest, so I fixed it. 10/05/2004: wsfulton Fixes for %extend and overloaded static methods with default arguments. 10/05/2004: mmatus - [python] Fix director + method with 'empty' throw, ie struct A { virtual int foo() throw(); }; other languages should also easy to fix, look for Getattr(n,"throw") in python.cxx. - Fix director + destructor with 'empty' throw struct A { virtual ~A() throw(); }; - Now SWIG_FEATURES parse all and the same options you can pass to swig in the command line. - New command line flag: -features , as in swig -features autodoc=3,director ie, any global feature can be initialized from the command line. This is mainly for testing, but users can also take advantage of it. 10/04/2004: mmatus - Properly qualify type in syntax as 'long(2)' or 'Foo()', this solve old problem with default args, and probably other problems around. However, the default arg problem was also already solved by William (see below). - Fix feature_set and feature_get methods. Before they look from particular to general and keep the first feature found. This didn't work well with templates. Now the methods look from general to particular, and override any found feature. - Previously a feature could not be applied to constructors or destructors that weren't explicitly declared in the class. This is now fixed, for example: %feature("featurename") Foo() "..." %feature("featurename") ~Foo() "..." class Foo { // implicit Foo() and ~Foo() }; - Fix missing features for default const/dest, by really 'creating' the methods and applying the features. - Fix return_const_value.i case by adding SwigValueWrapper specialization. - Fix %extend + overload, including overloading actual class methods. - Adding more cases in related files in the test-suite. 10/04/2004: wsfulton Changes to the way default arguments are wrapped. Previously a single method was generated for each method that had default arguments. If a method had 5 arguments, say, of which 1 had a default argument then the call to the wrapped method would pass 5 arguments. The default value was copied into the wrapper method and used if the scripting language passed just 4 arguments. However, this was flawed as the default argument sometimes does not have global access, for example SWIG would generate code that couldn't compile when wrapping: class Tricky { public: void foo(int val = privatevalue); void bar(int val = Tricky::getDefault()); private: static int getDefault(); enum { privatevalue = 200 }; }; Also bugs in resolving symbols generated code that wouldn't compile, for example (probably fixable though): namespace Space { class Klass { }; Klass constructorcall(const Klass& k = Klass()); } The approach also does not work for statically typed languages (C# and Java) as these languages do not allow methods to have variable number of arguments. Although C# has a mechanism to pass a variable number of arguments they must be of the same type and are more like varargs. The new approach solves the above problems and wraps methods with default arguments as if the method was overloaded. So SWIG will now treat void foo(int val=0); as if it had parsed: void foo(int); void foo(); The code generated is then exactly the same as if SWIG had parsed the two overloaded methods. The scripting languages count the arguments passed and call the appropriate method, just like overloaded methods. C# and Java are now able to properly wrap methods with default arguments by generating extra methods, again as if the method was overloaded, so for: void bar(string s="hello", double d=10.0, int i=0); the following proxy methods are generated: void bar(string s, double d, int i); void bar(string s, double d); void bar(string s); void bar(); The new approach comes with a couple of minor knock on effects. 1) SWIG support for default arguments for C (not C++) code no longer works. Previously you could have this interface: %{ void foo(int val); %} void foo(int val=0); and call the wrapped method from a scripting language and pass no arguments whereupon the default of 0 was used. You can get the same behaviour for C code by using the "default" typemap: %typemap(default) int val "$1 = 0;"; %{ void foo(int val); %} void foo(int val); or you could of course compile your code as C++ if you want C++ features :) : %{ void foo(int val=0); %} void foo(int val=0); A couple of SWIG's libraries used this C extension and these have been modified to use the "default" typemap. The "default" typemap is thus unchanged (and still is not and is not fully supported by C# and Java, and is likely to remain so). 2) All features (%feature, %rename, %ignore etc) no longer work as if the method with default arguments is just one method. For example, previously %ignore foo(int); would have ignored the method completely. Now it will only ignore foo(int) but not the extra foo() method. Instead use: %ignore foo; to ignore them all. or %ignore foo(int); %ignore foo(); This of course allows one to fine tune the wrapping, for example one could use: %rename(fooint) foo(int); %rename(foodefaults) foo(); void foo(int val=0); and call them from any language like so: fooint(200) foodefaults() or for example ignore the extra overloaded method, so the defaults cannot be used: %ignore foo(); void foo(int val=0); *** POTENTIAL INCOMPATIBILITY *** 10/2/2004: mmatus [Python] - More cleaning up and uniformation on the Python Lib - Added Robin's docstring patch, plus some fixes, plus some extensions, see autodoc.i example in the test-suite, and try using %feature("autodoc","extended"). This patch is not a complete solution for the documentation problem, just enough to inform python about the parameter list. The expected swig documentation support is far far away yet. 10/1/2004: mmatus - Fix the %callback feature (only used in ruby and python examples, by now, but it should be generic), now member callbacks are working again - Fix wrapping of functions pointers like std::ostream& std::endl(std::ostream&); ie, the ones that return references or enums. [Python] Add the %pythoncallback directive, which is an improved version of %callback, ie, %pythoncallback(1) foo; %pythoncallback(1) A::bar; %pythoncallback(1) A::barm; int foo(int a) { return a; } struct A { static int bar(int a); int barm(int a); }; int foobar(int a, int (*pf)(int a)); in python you can use foo(2) foobar(2,foo) A.bar(2) foobar(2,A.bar) ie, no additional pointer elements are created, and the original 'foo' and 'A.bar' can be used as parameters. In the case of member function however, still you need to use the special variable Class::_cb_ptr, ie: foobarm(3, a, A.barm_cb_ptr) we will try to fix this situation also, but later. [Python] Add more elements from the STL library, now you can use import std std.cout << "hello " << 123 << std.endl [Python] Fix in/out return mechanism, now swig will behave as 1.3.21 but using a python list when needed. The problem is that the types std::pair,std::vector,etc, use tuples, and they interfer with the previous inout tuple type. By using lists we solve the conflicts, swig acts as before, but returns a list when more than one parameter are using the OUT typemap. See the new inout.i example in the test-suite. *** POTENTIAL INCOMPATIBILITY FOR PYTHON MODULE *** [Python] Much better error messages for bad arguments, now you always get the argument number where the error occurred. 09/27/2004: wsfulton Patch from Bill Clarke - 1) Warning emitted when -importall and -includeall is used together, with -includeall taking precedence. 2) Ensure SWIGIMPORTED is always defined when a file is being imported with %import. Note that this is not the same as SWIGIMPORT, which gets defined in all generated wrapper files. 09/26/2004: mmatus - add %feature("exceptionclass") to identify a class used as exception. Before swig identified and marked a class using the "cplus:exceptionclass" attribute. However, the class needed to appear on an throw() statement. Now swig keeps trying to identify the exception classes, as before, but it also allows the user to mark a class by using the %feature explicitly. (mostly relevant for python and chicken) [Python] - fix -modern option + exceptions, which mix old class style with the new one. So, we always need to emit the "nonmodern" python code. - add the "python:nondynamic" feature and its handler now if you have %pythonnondynamic A; struct A { int a; int b; }; then, in the python side aa = A() aa.a = 1 # ok aa.b = 2 # ok aa.c = 3 # error, the class can not be extended dynamically. Since this is a feature, you can use %pythonnondynamic; or %pythondynamic; [ Note: %pythondynamic since deprecated ] to force all the wrapped classes to be "nondynamic" ones. The default, as in regular python, is that all the wrapped classes are dynamics. So, careful with your spelling. 09/14/2004: mmatus - Support the -I- option. - Differentiate between %include and %include "file". This fix several corner cases. [Python] Several patches: - Normalize the Lib file names: *.swg internal files, *.i user files. - Fix Char[ANY] typemaps, so they also delete any extra '\0' chars, now they behave as before (1.3.21). Still, you can use the SWIG_PRESERVE_CARRAY_SIZE macro if you need to preserve the original size (see pystrbase.swg). - Add the Char FIXSIZE[ANY] typemaps, to preserve the original C array sizes (see above). Though, you can't use them yet since %apply and arrays are not working together. - Add pyfragments.swg, now the user can add fragments to override the default ones. 09/10/2004: wsfulton Patch from Bill Clarke which fixes spurious preprocessor bug which shows on Solaris and gcc, eg: Warning(202): Could not evaluate '!defined(SWIGJAVA) && !(defined(SWIGCSHARP)' Also fixes a bug where '#if "a" == "b" == 1' wouldn't have worked 09/10/2004: wsfulton Restored multiple build directories for the test-suite. Patch from Bill Clarke. 09/06/2004: wsfulton Added the missing runtime.dsp Visual Studio project files for the import examples to work. Version 1.3.22 (September 4, 2004) ================================== 09/03/2004: wsfulton The swig.m4 macro for use with the Autoconf/Automake/Libtool has been removed and is no longer installed. Please use the new and better maintained version derived from swig.m4 in the Autoconf macro archive. See http://www.gnu.org/software/ac-archive/htmldoc/ac_pkg_swig.html and http://www.gnu.org/software/ac-archive/htmldoc/ac_python_devel.html. 09/01/2004: wsfulton [Perl] Applied patch #1019669 from Christoph Flamm. Adds support for %feature("shadow") in the same way as it works in Python. This enables one to override the generated shadow/proxy methods, including constructors and destructors. For example: /* Let's make the constructor of the class Square more verbose */ %feature("shadow") Square(double w) %{ sub new { my $pkg = shift; my $self = examplec::new_Square(@_); print STDERR "Constructed an @{[ref($self)]}\n"; bless $self, $pkg if defined($self); } %} class Square { public: Square(double w); ... }; 08/31/2004: mmatus [Python] Incompatibility reported by Bill Clarke (llib@computer.org): If you are using Sun Studio 8 (and possibly earlier versions) to compile the output produced by swig 1.3.22rc1, and you are using C++ and STL templates then you need to use either "-runtime" or "-noruntime". If you use neither of these options then you will probably get compiler errors when trying to compile the wrapper file; the error message will be like this: The name SWIG_Python_ConvertPtr[...] is unusable in static swigpy::traits_asptr[...] If you get this error message, you need to regenerate your wrapper file using 'swig -runtime' or 'swig -noruntime'. You shouldn't get this problem with Sun Studio 9. *** POTENTIAL INCOMPATIBILITY FOR PYTHON MODULE *** 08/26/2004: wsfulton [Perl] Applied #932333 from Ikegami Tsutomu. Fixes long long *OUTPUT and unsigned long long *OUTPUT typemaps in typemaps.i. 08/26/2004: wsfulton Applied patch #857344 from Art Yerkes. Workaround for autoconf bug when running 'make install'. 08/26/2004: wsfulton [Perl] Part of patch #982753 applied. This implements a %perlcode directive. It allows one to add Perl code to the generated .pm file. Works the same as %pythoncode. 08/26/2004: wsfulton [Java] Fix for directors when wrapping virtual methods with exception specifications that were not simple types. Previously code was generated that didn't compile, for example when the exception specification was a pointer. 08/25/2004: wsfulton [C#] Typemap fix for methods that return char *. The CLR would incorrectly delete the memory pointed to by char *. Also applied the same correction to the char array typemaps. 08/24/2004: wsfulton Fixes for -fmicrosoft error/warning message display: - End of file (EOF) warning messages not displaying in correct format - Some messages containing a file path were displaying a double backslash instead of a single backslash 08/23/2004: wsfulton Applied patch #1011604 submitted by Charles Schwieters. Fix for 64 bit tcl interpreters. 08/23/2004: wsfulton Fix for bug #875583 - enum forward declarations previously gave a syntax error. 08/23/2004: mkoeppe [Allegro CL] Use typemaps "ffitype" and "lisptype" to determine the FFI type specifiers from the C type. This makes it possible, for instance, to control whether a C "char" argument takes a Lisp character or a Lisp integer value. The default (taking Lisp characters) is done by these built-in typemaps: %typemap(ffitype) char ":char"; %typemap(lisptype) char "character"; If char means an integer instead, use these typemaps: %typemap(ffitype) char ":char"; %typemap(lisptype) char "integer"; 08/22/2004: wsfulton As discussed in bug #772453, the SWIG library directory is now installed into a different default directory. The library used to be installed to /usr/local/lib/swig1.3. It is now in the more usual architecture independent directory and I have additionally used a version specific subdirectory as the library will rarely work with older versions of SWIG. This release will thus use /usr/local/share/swig/1.3.22 by default, which can be tailored as before using './configure --swiglibdir'. 08/17/2004: mkoeppe [MzScheme] Add support to create native MzScheme structures from C structures. To convert a C structure to an MzScheme structure, use the new runtime macro SWIG_NewStructFromPtr in a typemap. Patch from Dmitriy Zavin. 08/12/2004: wsfulton Patch #837715 from Ben Reser to correctly detect Python lib directory on 64 bit systems. 08/12/2004: wsfulton [C# and Java] Prevent memory leaks in the case of early return from wrapper methods using const std::string & parameters. Modified Mark Traudt patch #951565. 08/12/2004: wsfulton Bug #943783 with patch fixes php char * out typemap NULL values. 08/03/2004: Ahmon Dancy [allegrocl] Additional case mode fixes. Also, make sure foreign types are exported. 07/24/2004: mkoeppe [Guile] In -scm mode, SWIG modules now exchange their pointer type information via the Guile interpreter. It is no longer necessary to build a runtime library or to use -noruntime and -runtime etc. The module (Swig swigrun) which was introduced in the change of 05/17/2004 is no longer automatically built. If you need it, run SWIG on the interface file swigrun.i. 07/23/2004: wsfulton [C#] Bug #917601 Mapping C++ bool fix from Mark Traudt 07/23/2004: wsfulton RPM fixes for latest CVS version including removal of runtime library. 07/23/2004: wsfulton Patch #908955 from Robert H De Vries. RPM file generation fix for Fedore Core 1 and Redhat AS2.1. 07/12/2004: wsfulton Patch #864689 from Robin Dunn: This patch corrects two problems in the XML output of SWIG: 1. There were often extra '/>\n' in the output. 2. value attributes were output with '\n' in them but since that is not technically legal most (all?) XML parsers will strip them out. Replacing the '\n' with the ' ' entity reference solves this as that is legal and XML parsers will convert it to a '\n' when reading the values back in. This patch also adds a new global command line option that will allow the parse tree to be written out in XML *after* some other language module has been run, in order to be able to get extra info that the language module puts in the tree. In this way the XML is a post-processed version of the tree rather than a pre-processed version. Command line option is -dump_xml or -xmlout 07/12/2004: wsfulton [Java] Patch from Scott Michel to fix typesafe enums and proper enums with directors. 07/12/2004: wsfulton HTML documentation (makechap.py) file generator missing end of line patch #908951 from Robert de Vries. 07/08/2004: wsfulton The deprecated runtime library build has been removed. This also removes the dependency on Libtool. Libtool is no longer required to build SWIG. The associated -ldflags SWIG commandline option has also been removed. The examples and test-suite testcases that used the runtime library have been updated to use the replacement approach to using SWIG across multiple modules, that is they use the -noruntime and -runtime commandline options, see Modules.html. Effectively they build their own runtime libraries using -runtime. The examples are import and import_template. The test cases are in the imports and template_typedef_import directories. Anyone who wants the original runtime libraries can either run the test-suite or build the examples and use the appropriate shared object/DLL that is generated with the -runtime commandline option. For example libimports_runtime.so (Python calls it lib_imports_runtime.so) is generated after running the 'make imports.multicpptest' testcase in the Examples/test-suite/ directory. Or use libruntime.so / runtime.dll after building the import examples in Examples//import. 07/07/2004: mkoeppe [Allegro CL] Convert character and string literals in constants to CL syntax. Fix FF:DEF-FOREIGN-CALL for mixed-case C functions. 06/27/2004: wsfulton [Java] New feature for Java exceptions with format %javaexception(exceptionclasses). This feature is a slight enhancement to %exception and the only difference is the addition of the exception classes which are generated into a throws clause. The 'exceptionclasses' is a comma separated list of classes which will be added to the associated proxy method's throws clause. The 'exceptionclasses' are specified like the exception classes in the 'throws' attribute in the typemaps. This feature should be used for correctly handling checked exceptions thrown from JNI code. For example: %javaexception("java.lang.Exception") throwException %{ ... convert a std::logic_error into a java.lang.Exception using JNI code ... %} #include void throwException() { throw std::logic_error("Logic error!"); } will generate a method with a throws clause in the module class: public static void throwException() throws java.lang.Exception { ... } 06/27/2004: wsfulton [C#] New %csconstvalue(value) feature directive for use with constants and enums. This works the same way as %javaconstvalue. For C#, this directive is the only way that one can fix wrapping of C/C++ enums with proper C# enums if the enum item's initialiser cannot compile as C# code. This is because Java enums can use a call into C code to initialise the enum item, whereas in C#, the enum value must be a compile time constant. That is, using %csconst(0) cannot be used in C# to initialise the C# enum item via a PINVOKE call. 06/27/2004: wsfulton [Java] New %javaconstvalue(value) feature directive for use with constants and enums. Sometimes the use of %javaconst(1) will produce code that won't compile under Java. If a compile time constant is required, %javaconst(0) is not an option. The %javaconstvalue directive achieves this goal and the value specified is generated as Java code to initialise the constant. For example: %javaconst(1); %javaconstvalue(1000) BIG; %javaconstvalue("new java.math.BigInteger(\"2000\")") LARGE; %javaconstvalue(10) bar; %{ const int bar = 10; %} %inline %{ #define BIG 1000LL #define LARGE 2000ULL enum Foo { BAR = ::bar }; %} Generates: public interface exampleConstants { public final static long BIG = 1000; public final static java.math.BigInteger LARGE = new java.math.BigInteger("2000"); } public final class Foo { public final static Foo BAR = new Foo("BAR", 10); ... } Previously, none of BIG, LARGE or BAR would have produced compilable code when using %javaconst(1). 06/27/2004: wsfulton %feature enhancements. Features can now take an unlimited number of attributes in addition to the feature name and feature value. The attributes are optional and are much the same as the typemap attributes. For example, the following specifies two optional attributes, attrib1 and attrib2: %feature(featurename, attrib1="attribval1", attrib2="attribval2") name "val"; %feature(featurename, val, attrib1="attribval1", attrib2="attribval2") name; 06/27/2004: wsfulton %feature improvements for the syntax that takes the feature value within the %feature() brackets. The value specified is no longer restricted to being just a string. It can be a string or a number. For example, this is now acceptable syntax: %feature("featurename",20.0); whereas previously it would have to have been: %feature("featurename","20.0"); Useful for features that are implemented as a macro, for example: #define %somefeature(value) %feature("somefeature",value) These will now work accepting either a string or a number: %somefeature("Fred"); %somefeature(4); 06/06/2004: wuzzeb (John Lenz) [Chicken, Guile] - Created the Examples/test-suite/schemerunme directory, which holds all the runme scripts for guile and chicken (and possibly mzscheme...). The guile and chicken _runme files then (load "../schemerunme/foo.scm"). - In chicken module, fix a few bugs invlolving dynamic casts. 06/03/2004: wsfulton Patch to fix wrapping of templated methods. ISO compliant compilers, like Comeau and GCC-3.4.0, don't like the template specifier that SWIG was generating when calling the method. This fix may break some non standard compliant compilers, for example, Sun workshop compilers prior to version 6.2.p2. Patch submitted by Bill Clarke. 06/03/2004: wsfulton [Java, C#] Undocumented special variable $imclassname removed. New special variable $module is replaced by the module name, as specified by %module or -module commandline option. $imclassname can be created from $module. 06/03/2004: wsfulton [C#] Same as for Java below. The new typemaps are named differently, namely, csbody and csbody_derived. The deprecated typemaps are csgetcptr and csptrconstructormodifiers. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 06/03/2004: wsfulton [Java] Typemap changes for the Java proxy / typewrapper and enum classes. A new typemap called javabody contains the essential support code for generation into the body of these classes. There is also a new javabody_derived typemap which is used instead for wrapped classes that have a wrapped base class. The code is basically, the getCPtr() method and swigCPtr and swigCMemOwn member variables. These used to be hard coded with no way to modify the code. The introduction of this typemap makes it possible for the user to tailor nearly every aspect of the code generation. The exception now is the code for director classes. The javagetcptr and javaptrconstructormodifiers typemaps are deprecated and are no longer used as the code that these generated can be put in the more flexible javabody and javabody_derived typemaps. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** The following macros contributed by Scott Michel may help you upgrade if you have used the javagetcptr typemap: /* Utility macro for manipulating the Java body code method attributes */ %define SWIGJAVA_ATTRIBS(TYPENAME, CTOR_ATTRIB, GETCPTR_ATTRIB) %typemap(javabody) TYPENAME %{ private long swigCPtr; protected boolean swigCMemOwn; CTOR_ATTRIB $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } GETCPTR_ATTRIB static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %typemap(javabody_derived) TYPENAME %{ private long swigCPtr; CTOR_ATTRIB $javaclassname(long cPtr, boolean cMemoryOwn) { super($moduleJNI.SWIG$javaclassnameUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } GETCPTR_ATTRIB static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %enddef /* The default is protected getCPtr, protected constructor */ SWIGJAVA_ATTRIBS(SWIGTYPE, protected, protected) /* Public getCPtr method, protected constructor */ %define PUBLIC_GETCPTR(TYPENAME) SWIGJAVA_ATTRIBS(TYPENAME, protected, public) %enddef /* Public getCPtr method, public constructor */ %define PUBLIC_BODYMETHODS(TYPENAME) SWIGJAVA_ATTRIBS(TYPENAME, public, public) %enddef 06/03/2004: wsfulton [Java, C#] The contents of the class modifier typemaps and pragmas have changed. They must now include the class type. Previously 'class' was hard coded. This change enables flexibility into what type of class is generated, for example the proxy class could be an interface instead of a class. For Java this affects the javaclassmodifiers typemap and the jniclassclassmodifiers and moduleclassmodifiers pragmas. For C# this affects the csclassmodifiers typemap and the imclassclassmodifiers and moduleclassmodifiers pragmas. Unless you have overridden the default versions of these typemaps or pragmas, you shouldn't be affected. However, if you have, upgrading is easy, for example class Foo {}; %typemap(javaclassmodifiers) Foo "public final" must now be: class Foo {}; %typemap(javaclassmodifiers) Foo "public final class" *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 05/31/2004: wsfulton Fix for C++ exception specifications that are references. Problem reported by Oren Miller. Also improves the generated exception declarations in the catch handler for pointers - a pointer is used instead of a reference to a pointer. Added default throws typemaps for SWIGTYPE &, SWIGTYPE * and SWIGTYPE[ANY] (Java and C#). 05/31/2004: wsfulton [Java, C#] Some minor typesafe enum improvements, including storing the name of the enum item. The toSring() / ToString() methods are overridden to return this name. 05/30/2004: wuzzeb (John Lenz) [Chicken] - Update how examples and the test suite are built. - Symbol names are no longer converted to lower case - Added union_runme.ss, which was copied and modified from the guile module 05/26/2004: lballabio (Luigi Ballabio) Committed on behalf of Marcelo (who still has problems with the SourceForge CVS.) Added Python typemaps for FILE* with (Python-only) test. 5/24/2004: dancy * Allegro CL module: Now using some macros (defined in Lib/allegrocl/allegrocl.swg), swig-defconstant and swig-defun, for defining constants and foreign functions. This makes the generated file a bit neater. Now strips a layer of parenthesis from constants. Uses (* :void) instead of :foreign-address now. 05/20/2004: wsfulton Unnamed enum global variables are now supported in addition to the recently added support for unnamed enum member variables. For example: struct Foo { enum { enum1, enum2 } MemberInstance; }; enum { enum3, enum4 } GlobalInstance; The int typemaps are used for wrapping the get/set accessor methods. If the sizeof an enum is not the same size as an int then setting the variable will silently do nothing as the casts cannot be easily and portably generated. If you need to solve this highly obscure situation, write the assignment using the %exception feature. 05/20/2004: wsfulton [C#] C# enum wrapping mods. Similar to the Java module, enums can be wrapped using one of 3 approaches: 1) Proper C# enums - use %include "enums.swg" 2) Typesafe enums - use %include "enumtypesafe.swg" 3) Simple constant integers (original approach) - use %include "enumsimple.swg" See each of these files for further details. Each of these files use typemaps and a new feature to control the generated code. The feature is: %csenum(wrapapproach); where wrapapproach should be one of: "proper", "typesafe", "typeunsafe" or "simple". [No implementation deemed necessary for type unsafe enums]. The default approach is proper C# enums. Anonymous enums are always wrapped by constant integers. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 05/20/2004: wsfulton [Java] Java enum support added. There are now 4 ways in which enums can be wrapped: 1) Proper Java enums - use %include "enums.swg" 2) Typesafe enums - use %include "enumtypesafe.swg" 3) Type unsafe enums (constant integers) - use %include "enumtypeunsafe.swg" 4) Simple constant integers (original approach) - use %include "enumsimple.swg" See each of these files for further details. Each of these files use typemaps and a new feature to control the generated code. The feature is: %javaenum(wrapapproach); where wrapapproach should be one of: "proper", "typesafe", "typeunsafe" or "simple". The default typemaps will handle enums that may or may not have specified initial values, for example ten is specified: enum Numbers { zero, ten(10) }; However, the amount of generated Java code can be cut down, by modifying these typemaps if none of the enums have initial values (proper Java enums and typesafe enums approach). The default approach is typesafe enums. Anonymous enums are always wrapped by constant integers. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 05/11/2004: wsfulton [Java, C#] Fix bug using %rename on enum items and when using %javaconst(1) / %csconst(1) For example, the following used to generate code that wouldn't compile: %rename(Obj) Object; enum Grammar { Subject, Object }; 04/28/2004: wsfulton [Java, C#] Minor fixes when using combinations of the javainterfaces, javabase, csinterfaces and csbase typemaps. 05/18/2004: wsfulton [Java] JVM link failure on some systems fixed when using std_vector.i. Also adds default vector constructor for use from Java. 05/17/2004: mkoeppe (Matthias Koeppe) [Guile] New runtime functions SWIG_PointerAddress, SWIG_PointerType, SWIG_IsPointerOfType, SWIG_IsPointer. [Guile] In -scm mode, wrap several SWIG runtime functions and export them into the module (Swig swigrun). The runtime module is now built with "module" linkage. [Guile] GOOPS proxy objects now also print the pointer address of the C object. 05/14/2004: lyle Added Kou's patch for the Ruby %import directive so that modules with "nested" names are handled properly. Consider an interface file foo.i that has this %module declaration at its top: %module "misc::text::foo" Now consider another interface file spam.i that imports foo.i: %import foo.i Before this patch, this would result in the following code being generated for spam_wrap.c: rb_require("misc::text::foo"); With this patch, however, you'll get the correct path name for the call to rb_require(), e.g. rb_require("misc/text/foo"); See SourceForge Bug #928299. 05/12/2004: wsfulton Patch for emitting directors when %feature("director") specified for a class with no virtual methods, but does have a virtual destructor. Submitted by Kevin Smith. 05/06/2004: mkoeppe (Matthias Koeppe) New SWIG runtime function SWIG_TypePrettyName, which returns an unmangled type name for a swig_type_info object. [Guile]: Use it for printing pointer objects. 05/03/2004: dancy (Ahmon Dancy) * Lib/allegrocl/allegrocl.swg: Updated comments about identifer conversion. * Sources/Modules/allegrocl.cxx: Register /dev/null for "header" target. Also, disregard "const" qualifiers during type conversion. 05/02/2004: wuzzeb (John Lenz) [Chicken] Fix bug 782468. To fix this bug, the runtime code has been rewritten, and pointers are now represented as a C_SWIG_POINTER_TYPE. Chicken version > 1.40 is now required! * Typemap incompatibility: typemaps no longer use chicken_words. If a typemap needs some space, it should just call C_alloc * argout typemaps no longer use the /* if ONE */ construct to build an output list. A SWIG_APPEND_VALUE macro, exactly like guile and mzscheme is now used. 04/25/2004: mkoeppe (Matthias Koeppe) [Guile] In the generated GOOPS code, don't create methods that would not specialize any arguments; simply re-export the primitive functions. (This is a performance optimization which reduces load time and execution time.) [Guile] In -gh mode, fix the "too many initializers" error which was caused by an incompatible swig_type_info layout. [Guile] The typemap for FILE * in ports.i now also accepts a regular FILE * pointer object. Also a bug with Scheme file ports that are open for input and output has been fixed. 04/25/2004: wsfulton Change entry 03/21/2004 revoked. The change introduced another inconsistency (reference typemaps beings used instead of pointer typemaps for member variables as well as static member variables and global variables for some languages, but only for C++ and not C). This would break user's current typemaps and introduce further inconsistencies. Alternative solution required and being discussed. 04/10/2004: mmatus (Marcelo Matus) Added the -directors flag. This enables the director mode for the interface and all the classes that don't set the "feature:nodirector" explicitly. You can use this in your module if you want to use the director feature in all your classes, but it is most intended for testing purposes, like: make check-python-test-suite SWIG="../../../swig -directors" make check-ruby-test-suite SWIG="../../../swig -directors" make check-java-test-suite SWIG="../../../../swig -directors" These commands will run the entire test-suite using directors, and not only the specific 'directors_*' cases. This should be done from time to time. 04/10/2004: mmatus (Marcelo Matus) [python] Added support for std::wstring and wchar_t, for compiler and python versions that support them. When needed, use %inlcude std_string.i // 'char' strings %inlcude std_wstring.i // 'wchar_t' strings 04/10/2004: mmatus (Marcelo Matus) [python] Fix the default behaviour (seg. fault) when an inplace operator (+=,-=,...) was wrapped, as reported by Lucriz (lucriz@sitilandia.it), when the most common form was used: A& A::operator+=(int i) { ...; return *this; } ^^^^ ^^^^^^ ie, an object is returned and its contains the same 'this' value than the input object, which is deleted after the operation "a += b", leaving the result with no real object, but a seg. fault. To fix it, we needed to introduce a new feature and use an old one: %feature("self:disown") A::operator+=; %feature("new") A::operator+=; here, "self:disown" disable the ownership of the 'self' or input object, and the "new" feature transfers the ownership to the result object. The feature/solution could also be used in other languages that use gc and implement the inplace operators, or other operators, in a similar way. *** POTENTIAL INCOMPATIBILITY FOR Python MODULE *** If you already are using the inplace operators in python, and you implemented some kind of workaround to the problem fixed here, it is possible you could end with 'free' objects that never get deleted. If that is the case, and you want to disable the current fix, use: %feature("self:disown","") A::operator+=; %feature("new","") A::operator+=; 04/07/2004: cheetah (William Fulton) [C#] C++ enums are no longer wrapped by integers, they are now wrapped by C# enums. For Example, given C++: enum AnEnum { foo, bar }; typedef AnEnum AnEnumeration; void something(AnEnum e, AnEnumeration f); The following is generated: public enum AnEnum { foo, bar } public static void something(AnEnum e, AnEnum f) {...} Note that a global enum like AnEnum above is generated into its own file called AnEnum.cs. Enums defined within a C++ class are defined within the C# proxy class. Some of the typemaps for modifying C# proxy classes also work for enums. For example global enums can use %typemap(csimports) to add in extra using statements. Global enums and class enums can use %typemap(csclassmodifiers) to make the enum private, public etc. %typemap(csbase) to change the underlying enum type (enum base) If we add this for the above example: %typemap(csclassmodifiers) AnEnum "protected" %typemap(csbase) AnEnum "long" the following is generated: protected enum AnEnum : long { foo, bar } *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 04/07/2004: cheetah (William Fulton) Seg fault fix for empty enums, like enum Foo {}; 03/21/2004: mmatus [Note: this change revoked on 04/25/2004] [Python] Makes the following 'var' cases more uniform: std::string ga; struct A { static std::string sa; std::string ma; }; now the three variables (ga, sa, ma) can be assigned as: cvar.ga = "hello"; A.sa = "hello"; a.ma = "hello"; ie, now 'ma' will also use a std::string typemap 'in' if defined, before it was only accepting a 'p_std_string' pointer. Note, however, that 'ma' will not use the 'varin/varout' typemaps (that probably could be more natural), but it will pick up the 'in' typemap for const std::string& (which is easier). The changes in cwrap.c and lang.cxx will probably fix the behaviour in other languages that do not overload the membervarHandler method "too much". 03/21/2004: mmatus [Python] Disabling the default instantiations like: %template() std::pair; for all the primitive types and STL containers/classes. They are expensive, specially for pair and map, and the previous behaviour also requires the user to perform manual instantiations. Still, if the speed difference is not important, it can be re-enabled by defining the macro SWIG_STD_DEFAULT_INSTANTIATION (see std_common.i). Also, normalizing the INPUT/OUTPUT/INOUT typemaps. Now they use the same conversors than the rest of the typemaps, and you can use them for std::pair, std::string and all the other STL types, like in: void p_inoutd(std::pair *INOUT); Added the attribute.i and implicit.i files with macros to transform functions pairs like 'set_x'/'get_x' (or 'T& x()'/'const T& x() const') into an attribute, and allowing the use of implicit constructors in typemaps (see the files for more details). 03/21/2004: mkoeppe [Guile] Fix the documentation strings of functions with anonymous arguments. 03/18/2004: mmatus [Python] More general std_string.i interface. Now you can wrap it using %template(string) std::basic_string; and use the std::string as a base class: struct A : std::string { }; But more important, swig will recognize both std::basic_string and std::string as the same type. 03/16/2004: mmatus Previously added, but not mentioned before: - friend declaration support, swig now emits a global function in the same class scope. - ref/unref features: to mix ref counting C++ classes and native script ref counting mechanisms (like in python). Use it like: %feature("ref") RCObj "$this->ref();" %feature("unref") RCObj "$this->unref();" And the class RCObj, and all the derived ones, will perform the right ref/unref calls when a new pointer is returned to the target language, or when the target language attempts to delete the object. See the refcount.i file in the test-suite for more details. 03/16/2004: mmatus [Python] Using the new %fragment support, major rewrote of the python swig library, including: - Almost automatic template/typemap instantiation for the STL components. For example, now you can write: %template(vector_i) std::vector; and a specialized vector_i class is emitted with all the needed typemaps. No need to use the old 'specialize_vector' macros. Note you can also define %template(matrix_i) std::vector >; %template(vector_pii) std::vector >; - The empty template instantiation %template() std::vector; defines the vector typemaps, but no proxy class. For all the fundamental types, the empty template instantiation are defined, so, you can say %include std_vector int func(const std::vector& a); where the proper typemap is applied to 'a', but no std::vector proxy is generated. - All the STL containers present a more uniform behavior and more complete interface declaration. The following are now supported: std::vector std::list std::deque std::set std::multiset std::map std::multimap not a container, but also supported: std::pair also, more typemaps are defined for all of them, including varin, varout, typecheck, etc. - Initial attempt to implement the STL containers considering allocators, ie: std::vector it is partially working, but it is just a workaround while swig improves its template type support. Please test with your particular setup. It seems to be working with g++ 3.2.2, g++ 2.96, Intel icc and SGI CC compilers, plus python 1.5.2, 2.0 and 2.3, but since we are using templates, there is a chance you can find some problems when using with an old C++ compiler. 03/16/2004: mmatus - Allowing the empty %template directive, such as %template() std::vector; to process the class "typedef"s and "typemap"s. Before only the internal "typedef"s were processed. This makes possible to emit the default in/out typemaps without the need of wrapping an specialized vector instance. - Adding the preprocessor extension #@ which mangles the following macro argument, like in: #define macro(X) #@X macro(int) -> int macro(std::string) -> std_s_s_string - Fragments can now be "type specialized", as the typemaps. The syntax is as follows %fragment("name","header") { /* a type independent fragment (old syntax) */ } %fragment("name" {Type}, "header") { /* the fragment is type dependent */} Now fragments can also be used inside templates: template struct A { %fragment("incode"{A},"header") { /* 'incode' specialized fragment */ } %typemap(in,fragment="incode"{A}) { /* here we use the 'type specialized' fragment "incode"{A} */ } }; 03/11/2004: cheetah (William Fulton) [Java] Director bug which meant that some virtual functions overridden in Java were not being called on some operating systems. Bug reported and fixed by Robert de Vries and Scott Michel. 03/02/2004: mkoeppe (Matthias Koeppe) [Guile] In -scm mode, don't forget to check the type of string arguments. 02/24/2004: cheetah (William Fulton) [C#] New commandline option -namespace . This allows one to specify a C# namespace into which all C# classes are generated. 02/23/2004: mkoeppe (Matthias Koeppe) [MzScheme] Use FUNC_NAME rather than a bogus typemap variable for signalling errors. Call scheme_wrong_type with a zero-based argument number. Reported by Ondrej Pacovsky, SF #902621. [Guile] Define FUNC_NAME also in the dispatch wrapper for overloaded functions. Patch by John Lenz, SF #896255. 02/22/2004: mkoeppe (Matthias Koeppe) [Guile] In -scm mode, don't try to invoke a null destructor function. 02/20/2004: cheetah (William Fulton) Fixes so that the SWIG source will compile using the Digital Mars Compiler (formerly Symantic compiler) on Windows. Submitted by Scott Michel. 02/13/2004: mkoeppe (Matthias Koeppe) [MzScheme] New command-line argument -noinit. Use it for building the runtime library, where we don't want to define the functions scheme_initialize etc. Reported by Tim Brown, SF #891754. [MzScheme] Don't produce invalid C code when invoked with the -declaremodule option. Reported by Tim Brown, SF #891108. [Guile] Build the runtime library with passive linkage, to rename the SWIG_init function uniquely. 02/12/2004: cheetah (William Fulton) [Java, C#] Patch submitted by Bill Hoffman which prevents SWIG from crashing when a file for the typewrapper class cannot be opened. 02/11/2004: cheetah (William Fulton) [Java, C#] Overloading changes: - Methods which are overloaded in const only no longer generate Java code that won't compile - the first method parsed is used and a warning is displayed. Note that this behaviour is slightly different to the scripting languages which always uses the non-const method. - Warning messages 509 and 512 replaced by new warning number 516, which is more relevant to these statically typed languages as the overloaded methods aren't 'shadowed', they are ignored. 01/23/2004: mkoeppe (Matthias Koeppe) [Guile] Replace the "known_classes" hash table by a node attribute. Methods of classes in C++ namespaces now get the proper specializer in the GOOPS declaration. Reported by rm@mh-freiburg.de. 01/23/2004: mkoeppe (Matthias Koeppe) [Guile] Uniquify the argument names in GOOPS shadow method declarations. Reported by rm@mh-freiburg.de. 01/21/2004: sunshine (Eric Sunshine) Revived the NextStep port of SWIG. Fixed fatal problem in DohStrstr() caused by difference in strstr() implementation which made %apply become entirely dysfunctional. On NextStep, strstr("foo","") evaluates to NULL; whereas, on modern platforms, it evaluates to "foo". %apply relies extensively upon strstr("foo","") evaluating to non-NULL, therefore it failed catastrophically when faced with NextStep's strstr(). Added `bool' check to configure.in since NextStep's C++ compiler does not supply this type. swig.h now fakes up `bool' if needed. Worked around NextStep C++ compiler bug in which C++ code is disallowed inside extern "C" functions. This problem affected all language modules, since they publish hook functions of the form: extern "C" Language *swig_foo(void) { return new FOO(); } Fixed by creating a C++ wrapper: static Language *new_swig_foo() { return new FOO(); } extern "C" Language *swig_foo(void) { return new_swig_foo(); } Ensured that Swig_copy_string() is used in place of strdup() since NextStep does not supply strdup(). Fixed detection of Ruby library name and location in configure.in. Problem 1: Assumed that library always resided in Ruby's "archdir", which was correct for Ruby 1.6.x, but which is incorrect for Ruby 1.8.x, in which case the library normally resides in Ruby's "libdir". Problem 2: Assumed that the library could always be linked via "-l"+RUBY_INSTALL_NAME (where RUBY_INSTALL_NAME typically is "ruby"), however this failed for platforms, such as NextStep, which do not support shared libraries. In this case, the static library name in 1.8.x is libruby-static.a, thus -lruby-static is required. The new logic works correctly for static and shared libraries for 1.6.x and 1.8.x. Fixed detection of Perl CFLAGS in configure.in for NextStep. Detection code extracted CFLAGS from Perl's %Config hash but neglected to add a newline to the value before passing it through `sed'. NextStep's ancient `sed' discards input which is not terminated with a newline, thus Perl CFLAGS always evaluated to the empty string. 01/16/2004: cheetah (William Fulton) Tidy up in the exception handling code that is generated when C++ exception specifications are wrapped with the throws typemap. This redundant code is no longer generated: catch(...) { throw; } 01/12/2004: wsfulton on behalf of mmatus (marcelo matus) if a method uses %exception and the method requires the use of the throws typemap, the code in a throws typemap will be generated inside the try body. For example: %exception method { try { // method action $action } catch (int i) { // method int catch handler } catch (...) { // method generic catch handler } } %typemap(throws) Except %{ // throws typemap Except catch handler %} %inline %{ class Except {}; void method(int i) throw (Except); Will generate: { try { // method action try { method(arg1); } catch(Except &_e) { // throws typemap Except catch handler } } catch (int i) { // method int catch handler } catch (...) { // method generic catch handler } } As can be seen, the inner try catch block is for the throws typemaps. Previously, this was reversed so that the inner try catch block was the %exception code. In the example above, it would have been impossible to catch Except as the catch all (...) would catch the exception instead. Version 1.3.21 (January 11, 2004) ================================= 01/10/2004: cheetah (William Fulton) The output format for both warnings and errors can be selected for integration with your favourite IDE/editor. Editors and IDEs can usually parse error messages and if in the appropriate format will easily take you directly to the source of the error. The standard format is used by default except on Windows where the Microsoft format is used by default. These can be overridden using command line options, for example: $ swig -python -Fstandard example.i example.i:4: Syntax error in input. $ swig -python -Fmicrosoft example.i example.i(4): Syntax error in input. 01/09/2004: beazley Fixed [ 871909 ] simple namespace problem. This was a problem using anonymous structures in a namespace. For example: namespace ns { typedef struct { int n; } S; }; Reported by Josh Cherry. 01/09/2004: beazley Fixed some broken Perl examples. 12/28/2003: cheetah (William Fulton) [Java and C#] Fixes for wrapping covariant (polymorphic) return types. For example: struct Base { virtual ~Base(); virtual Base* copy() const = 0; }; struct Derived : Base { virtual Derived* copy() const; }; The Derived::copy proxy method returns Base not Derived. A warning is issued about this. Previously the pointer used by the proxy class was incorrectly treated as a Base* instead of a Derived*. 12/18/2003: cheetah (William Fulton) Fix so that Windows paths are displayed correctly when reporting errors. An error previously would have been shown something like: .?xample.i:14: Syntax error in input. instead of: .\example.i:14: Syntax error in input. Version 1.3.20 (December 17, 2003) ================================== 12/17/2003: beazley Last minute modifications. Perl5 module now generates shadow classes by default like all of the other modules. PHP4 wrappers no longer include "config.h". 12/14/2003: beazley Weakened warning message related to constructor names so that an unusual nested-class wrapping technique would work again (apparently it worked in some older SWIG releases). For example: class Scope { class ClassA; class ClassB; }; class Scope::ClassA { ... }; class Scope::ClassB { ... } Note: There is still some odd interaction with the SWIG symbol table/type system that will need to be looked at in a future release. Reported by Gustavo Niemeyer. 12/11/2003: cheetah (William Fulton) [Java] Protected class methods are wrapped as protected Java methods when using the dirprot director feature. This can be changed using %javamethodmodifiers to something else should the need arise, for example, private or package access. 12/11/2003: cheetah (William Fulton) [Java, C#] %javamethodmodifiers (Java) and %csmethodmodifiers (C#) operate slightly differently. Previously this feature had to be present to set the method modifiers. Now it is only used if it exists for the method being wrapped. The default is "public" as previous however, when wrapping protected director methods it is "protected". This change will not affect existing use of the %javamethodmodifiers or %csmethodmodifiers. 12/11/2003: mmatus (Marcelo Matus) This fix some recurring reports about keywords not been properly identified and warned, and it solves the problem of how to add a test file to the test-suite such that it doesn't use any keyword of all the supported languages (and doing it without compiling the test for all the supported languages, thing that is not always possible, and without requiring you to know all the supported language keywords, thing that is always impossible). So these are the changes globally speaking: - Uniform the definition of the keyword warnings through the supported languages: all the languages has now a separate file that defines the keywords or bad names: python/pythonkw.swg chicken/chickenkw.swg .... - Added keyword list for most of the languages that didn't have one (using the new separated file). - Added the "All keywords" warning support: -Wallkw option. This option allows you to include all the known keywords for all the supported languages, and can be used as: swig -Wallkw .... This will help to the process of adding a test-suite file that can be compiled in all the swig supported languages, and it will be also helpful for users who want to create multi-language libraries. And these are the detailed changes (mostly file addition): - For the languages that already have some sort of keyword warning list, move it to an external languagekw.swg file, ie: move keywords from python.swg -> pythonkw.swg move keywords from chicken.swg -> chickenkw.swg move keywords from tcl8.swg -> tclkw.swg and re-include languagekw.swg from language.swg. - For the language that didn't have a keyword list, and for the ones that I could find a list, add the languagekw.swg file, ie: csharp/csharpkw.swg java/javakw.swg php4/phpkw.swg pike/pikekw.swg ruby/rubykw.swg also add a line in language.swg to include languagekw.swg, but now it is commented!!!, like in java.swg: /* java keywords */ /* please test and activate */ //%include "javakw.swg" ie, there will be no change in how swig runs normally until the language maintainer test and uncomment that line. So, please check each languagekw.swg file (I left the link to the keyword list source for checking), and after testing, uncomment the %include line. - Added the file allkw.swg, which includes all the languagekw.swg files. For the languages that has no languagekw.swg file right now, and if they need one, add the file into the language directory, and add the corresponding include line into the allkw.swg file. - Added the -Wallkw that includes the allkw.swg file. Note that the old -lallkw.swg option couldn't be used since it include the file after it would be needed. Hopefully, the -Wallkw option will be added to the default rules in the related test-suite Makefiles, so, when creating a new test, or adding a new swig library file (like _std_deque.i), swig will warn you if you are using a bad name, considering all the language where it needs to run. Right now you can test it by using: make check-python-test-suite SWIG="swig -Wallkw" or using your favorite target language, it doesn't matter. And yes, there are several examples that are using reserved keywords, specially from csharp. *** Remember ****: the new keyword warning lists are not included by default in any of language that before didn't have one. To enable the keyword warnings as the default behavior, the inclusion of the languagekw.swg file has to be uncommented at each language.swg file. So, all the language maintainers, please check the keywords list. Also, you can add buit-in names, and not only keywords, like 'True/False' in python. Remember that you can be more specific and refer only to member names, like *::configure or *::cget (see an example in the tcl8/tcl8kw.swg file), or only global names, like ::range (see an example in the python/pythonkw.swg file. Just to be consistent, use the following codes: - Use code 314 for keyword and/or fatal bad names. - Use code 321 for buit-in and/or not fatal bad names. so, they can't be disabled/enabled independently (see python/pyhtonkw.swg for examples). **** And don't add any new test file without checking it with the -Wallkw option!! (that includes me) *****. 12/11/2003: cheetah (William Fulton) SF bug #854634 Added support for accepting the Unix directory separator '/' on Windows and the Mac in addition to the native one ( '\' on Windows). This can be used in %import, %include and commandline options taking a path, for example -I. On Cygwin, both the Windows and Unix directory separator can now be used (was '/' only). 12/10/2003: mmatus (Marcelo Matus) [python] Implementing the runtime "reprotected" director members, if you have: %feature("director") B; class Bar { public: virtual ~Bar(); virtual int hello() { return do_hello();) protected: virtual int do_hi() {return 0;} virtual int do_hello() {return 0;} }; then, at the python side import my_module class Foo(my_module.Bar): def do_hello(self): return 1 pass b = Bar() # Pure C++ Director class f = Foo() # C++ Director + python methods b.hello() # Ok, and it calls C++ Bar::do_hello() f.hello() # Ok, and it calls Python Foo::do_hello() b.do_hi() # RuntimeError, do_hi() is protected!! f.do_hi() # RuntimeError, do_hi() is protected!! b.do_hello() # RuntimeError, do_hello() is protected!! f.do_hello() # Ok, since it its redefined in python. Here Bar.do_hello is always protected, but Foo.do_hello is "public", because it is redefined in python. Before, all the 'do_hello' methods were public. This seems to be a good compromise between C++ and python philosophies, ie, all the director protected methods keep protected at the user side (C++ way) until they are redefined (python way, were all defined methods are always public). And this is not only a good compromise, it also seems to be the only way to do it :). Now ruby has native director protected members, and python pure runtime support. I guess these are the two possible extreme cases. And hopefully, they could be used as templates to modify the other languages that support directors, so they can "reprotect" the protected director members at the target language side. This finished the director protected support for the python language. Ocalm will need to add the "reprotection" later. 12/10/2003: mmatus (Marcelo Matus) The following case (reported by Lyle Johnson) was fixed: %rename(x) Foo::y(); class Foo { public: void y(); protected: int x; }; swig warned that the symbol 'x' was already defined, and the renaming fails. 'x' was not emitted, since it is protected, but it was kept in the symbol table with too much information. Now swig works for all the cases (plain, director and dirprot) again. This was fixed by allowing the parser.y to decide much closer what to do with 'x'. Before all the discarding or generation was resolved at the lang.cxx stage. Also the changes in parser.y to implement the director protected mode are now much more encapsulated, and they get disabled if the mode is not enabled. Before the deactivation was done at the generation stage (lang.cxx). By the other hand, if the director mode is enabled, and %rename is done, reusing a protected member name, there is a pathological case: %rename(x) Foo::y(); class Foo : public A { public: void y(); protected: int x; /* works */ static int x; /* works */ static void x(); /* works */ typedef void x(); /* works */ virtual void x(); /* always fails, as it should, since Foo::x() will be emitted in the director */ void x(); /* always fails, but sometimes it shouldn't, since the Foo::x() will not be emitted if it is not virtual */ }; The last case is not always right because at the parser.py stage it is not possible to decide if the protected member Foo::x() could or not conflict with the renamed Foo::y(), since Foo::x() could be virtual by inheritance. I guess this just an intrinsic limitation, and no much can be done about it without resorting into larger changes to postpone, under certain conditions, the multiply symbol detection (lang.cxx stage). So, by now, it is just considered a well known "feature" in the director protected mode. The good news is that it seems to be a rare case, and it can be avoided by the user by hiding 'x' before renaming 'y': %rename(_x) Foo::x(); %rename(x) Foo::y(); 12/08/2003: mmatus (Marcelo Matus) The virtual method detections now properly treats the following cases: namespace foo { typedef int Int; } struct A {}; typedef A B; struct Foo { virtual ~Foo() {} virtual Foo* cloner() = 0; virtual int get_value() = 0; virtual A* get_class() = 0; virtual void just_do_it() = 0; }; struct Bar : Foo { Bar* cloner(); foo::Int get_value(); B* get_class(); void just_do_it(); }; All the Foo and Bar methods are virtual. A new attribute "virtual:type" record the base polymorphic type. In the previous cases we have: type : Bar virtual:type : Foo type : foo::Int virtual:type : int type : B virtual:type : A type : void virtual:type : void This attribute is useful in languages (java+directors) that could have problems redefining Bar* Bar::cloner(). If you never had code like the above, you will see no effects. But if you have some code like that, you will see some effects since some methods that before were not properly treated as virtual, will start to act like that. This could enlarge your director classes. 12/08/2003: mmatus (Marcelo Matus) The director protected member support (dirprot) is disabled by default. It can be enable by using '-dirprot' or by adding the option to the module declaration, like: %module(directors="1",dirprot="1") my_module This module option was added to properly compile the director_protected.i and director_nested.i examples. The feature has been tested with python[2.2,2.3] and ruby[1.6.7], both at compilation and runtime, and java[j2sdk1.4.1_01], but only at compilation (my java installation doesn't run any of the director examples, olds nor news). Please test for ocaml and java. The errors reported by William and Scott were fixed, except for a warning about SWIG_JavaThrowExecption() multiply defined. I can't reproduce this error with my examples. We will wait for Scott to send us a minimal case. 12/07/2003: mmatus (Marcelo Matus) The director protected member support has been completly moved out from python.cxx, and now resides in the common lang.cxx, emit.cxx and allocate.cxx files. This means it should work for all the other languages that currently support directors, ie, python, java, ocalm and ruby. The change has been tested with python (compilation+runtime) and java (just compilation). Please add runtime tests for the missing languages and test it. The '-nodirprot' option was moved to the principal main, and can be used from all the languages. 12/07/2003: cheetah (William Fulton) [Java] Fixed and improved error checking of STRING_OUT typemaps in various.i. 12/04/2003: mmatus (Marcelo Matus) - Now the virtual members with no explicit declarator are properly identified: struct A { virtual int f() = 0; }; struct B : A { int f(); }; Here, B::f() is virtual, and the director and the virtual elimination mechanism now recognize that. - [C#] This fix also fixes the problem where 'override' was not being used on any overridden virtual method, so for struct B above, this C# code is generated: public class B : A { ... public override int f() { ... } ... } - Initial support for protected virtual methods. They are now properly emitted when using with director (python only by now). %feature("director") A; struct A { protected: virtual int f1() = 0; }; %feature("director") B; struct B : A{ protected: int f1(); virtual f2(); }; This can be dissabled by using the '-nodirprot' option. - The feature 'nodirector' is working now at the top level, so, it must work for all the languages: %feature("director") A; %feature("nodirector") A::f2; struct A { virtual int f1(); virtual int f2(); }; in this case, only 'f1' is exported to the director class. - Added director support for const TYPE& arguments (python). 12/02/2003: cheetah (William Fulton) [Java] Fix for INOUT and OUTPUT typemaps in typemaps.i for when the JNI type is bigger than the C type. For example, unsigned long (32bits on most systems) is mapped to jlong (64bits). Returned value was incorrect. Bug reported by Brian Hawley. 12/02/2003: cheetah (William Fulton) [C# and Java] Better fix for entry dated 05/11/2003. Fixes the following typemaps: Java: javabase, javainterfaces, javaimports, javaclassmodifiers, javaptrconstructormodifiers, javafinalize, javagetcptr & javacode. C#: csbase, csinterfaces, csimports, csclassmodifiers, csptrconstructormodifiers, csfinalize, csgetcptr & cscode. It also fixes bug in using arrays of C structs with arrays_java.i as reported Scott Michel. 12/02/2003: beazley [Perl] Fixed [ 852119 ] recursive inheritance in output .pm, perl5. Reported by William Dowling. 12/02/2003: beazley [Tcl] Fixed [ 755382 ] calling func(const vector& p) evaluates p[0] in interp. The Tcl type checker was improperly handling the interpreter result when type violations were supposed to be ignored. Reported by Flaviu Popp-Nowak. 11/30/2003: cheetah (William Fulton) Fixed [ 545058 ] configure's --with-tclincl has no effect 11/30/2003: cheetah (William Fulton) [Java] Fixed [ 766409 ] missing symbol SWIG_JavaThrowException during module load SWIG's internal functions are all static as there is no need for different SWIG generated modules to share any code at runtime. 11/30/2003: beazley [Tcl] Added support for C++ pointers to members. 11/28/2003: cheetah (William Fulton) Fixed [ 848335 ] Directors: #include wrapper .h file - was incorrectly adding a directory to the generated #include "foo_wrap.h" statement in some situations. 11/28/2003: cheetah (William Fulton) [Java] Fixed [ 849064 ] JAVA : Access modifier for derived class wrong. The delete() method is always public now. It used to be protected whenever a destructor was non public. An UnsupportedOperationException runtime exception is thrown instead of making delete() protected now. 11/28/2003: beazley [Perl5] Added support for C++ pointers to members. 11/28/2003: beazley Fixed [ 850151 ] PYVERSION with python2.3 in configure of SWIG 1.3.19 (Maybe). 11/28/2003: beazley Fixed [ 850666 ] #include extra line added. This should fix some problems with getting correct line numbers on error messages. 11/26/2003: beazley Fixed another one of Marcelo's evil template bugs (infinite recursion). [ 849504 ] template and typedef -> inf. recursion. 11/26/2003: beazley Fixed parsing problem with declarations like this: int *x = &somearray[0]; 11/25/2003: beazley Fixed [ 756552 ] missing default argument class scope with "|". This is really only a band-aid fix for use of class-enums in expressions. For example: class A { public: enum Flag { flag1 = 0x1, flag2 = 0x2 }; void foo(int x = flag1 | flag2); }; Note: there are still some (more subtle) cases that are broken, but hard to fix due to an issue with template expansion. Will address later. Reported by Dmitry Mironov. 11/25/2003: beazley Incorporated [ 840878 ] support for %inline { ... } (PATCH). This adds support for the following: %inline { ... some code ... } The difference between this and %inline %{ ... %} is that the enclosed text is processed by the SWIG preprocessor. This allows special macros and other processing to be used in conjunction with %inline. Contributed by Salvador Fandino Garcia. 11/25/2003: beazley Fixed [ 836903 ] C++ inconsistency (with void arguments). SWIG was having difficulty with f() vs f(void) in C++ programs. For instance: class A { public: virtual void f(void) = 0; }; class B { public: virtual void f(); // Not matched to f(void) correctly }; The parser now normalizes all declarations of the form f(void) in C++ classes to f(). This should fix a variety of subtle problems with inheritance, optimizations, overloading, etc. Problem reported by Partho Bhowmick. 11/25/2003: beazley [Perl5] Incorporated [ 841074 ] better croaking (PATCH). This fixes some problems with strings and provides some new error functions. Contributed by Salvador Fandino Garcia. 11/25/2003: beazley Fixed [ 791835 ] Default argument with cast: txt = (char *)"txt" syntax Error. The parser should now accept things like this: void foo(char *s = (char *) "Hello"); Problem reported by Claudius Schnorr. 11/24/2003: beazley [Tcl] Fixed problem with cross module linking. Previously modules referred to base classes through a global variable. Now, the module looks up base classes through the type system itself---avoiding the need to link to a global like before. Caveat: modules with base classes must be loaded before modules with derived classes. 11/24/2003: mkoeppe (Matthias Koeppe) [Guile] In -scm mode, use () to represent null pointers, as it is done in -gh mode. 11/23/2003: mkoeppe (Matthias Koeppe) Add a generated script "preinst-swig", which can be used to invoke SWIG before it has been installed. It arranges that the runtime libraries from the source directory are used. 11/23/2003: mkoeppe (Matthias Koeppe) [Guile] In -gh mode, don't forget to call SWIG_Guile_Init. Add a SWIG_contract_assert macro. 11/23/2003: mkoeppe (Matthias Koeppe) [MzScheme] Update the configure check for the dynext object to work with MzScheme 205. 11/20/2003: mmatus Fixed the include/import error reported by Kerim Borchaev, where two files with names like 'dir1/hello.i' 'dir2/hello.i' can not be include at the same time. Swig was including just the first one, assuming the second one was not a different one, since it was checking/keeping just the basename 'hello.i'. 11/19/2003: beazley Changes to the SWIG runtime library support. - The -c command line option has been renamed to -noruntime - New command line option: -runtime. When supplied, this inserts the symbol SWIG_GLOBAL into the wrapper code. This, in turn, makes all of the runtime support functions globally visible. - New library file: swigrun.i. Used to create modules for runtime library (if needed). 11/18/2003: cheetah (William Fulton) 'make srcrpm' rpmbuild fix - patch from Joe Cooper 11/18/2003: mkoeppe (Matthias Koeppe) [Guile] Change meaning of configure option --with-guile to the name of the Guile executable. The new option --with-guile-prefix can be used to specify the tree where Guile is installed. (However, usually it suffices to use the single option --with-guile-config.) When running the run tests test-suite, make sure to use the version of Guile that SWIG was configured for. 11/17/2003: mkoeppe (Matthias Koeppe) [Guile] Improvements to object-ownership management in "-scm" mode. (They do not apply to the default "-gh" mode.) * Renamed the smob type that indicates that the object can be garbage collected from "collected swig" to "collectable swig", which is more precise. * Export the destructor functions again. It is now allowed to explicitly call destructors, even for garbage-collected pointer objects. A pointer object that has been passed to a destructor is marked in a special way using a new smob type, "destroyed swig". (This helps avoid nasty memory bugs, where references to dead C objects are still held in Scheme. Moreover, the garbage collector will not try to free a destroyed object once more.) * Destructor-like functions can also mark their arguments as destroyed by applying the typemap SWIGTYPE *DESTROYED. (It calls the function SWIG_Guile_MarkPointerDestroyed.) * Functions that "consume" their objects (or that "own" them after the call) can mark their arguments as not garbage collectable. This can be done by applying the typemap SWIGTYPE *CONSUMED. (It calls the function SWIG_Guile_MarkPointerNoncollectable.) * The macro TYPEMAP_POINTER_INPUT_OUTPUT from library pointer-in-out.i creates additional typemaps PTRTYPE *INPUT_CONSUMED, PTRTYPE *INPUT_DESTROYED. They mark the passed pointer object likewise. The typemap PTRTYPE *OUTPUT creates a garbage-collectable pointer object, like %newobject does for a returned pointer. Use the new typemap PTRTYPE *OUTPUT_NONCOLLECTABLE to create a pointer object that will not be garbage collected. 11/17/2003: mkoeppe (Matthias Koeppe) [Guile] Handle $input in "freearg" typemaps. Never qualify GOOPS slot names with the class name. Handle optional arguments properly in the GOOPS methods. 11/16/2003: cheetah (William Fulton) Fixes for installation to work with the upcoming Automake-1.8. mkinstalldirs was being used by a non-Automake makefile. mkinstalldirs is being phased out and so was not being created by Automake. install-sh used instead. 11/16/2003: cheetah (William Fulton) [Java] Numerous director improvements, tweaks and bug fixes since the initial implementation have been contributed by Scott Michel. 11/12/2003: beazley [Python] When %feature("shadow") is used to add code to shadow classes, the special variable $action expands to the name of the underlying wrapper function that would have been called normally. 11/12/2003: beazley [Python] When generating proxy class code, SWIG emits a few default methods for __repr__() and other Python special methods. Some of these methods are emitted after all of the contents of a class. However, this makes it hard to override the methods using %pythoncode and some other directives that allow code to be inserted into a class. These special methods are now emitted into the code *before* all of the other methods. Suggested by Eric Jones. 11/11/2003: beazley Preprocessor enhancement. For include statements like this: %include "foo/bar.i" the directory "foo" is now added to the search path while processing the contents of bar.i. Thus, if bar.i includes other files in the same directory, they will be found. Previously, you would have to add additional directories using -I to make this work correctly. Note: the C preprocessor seems to behave in an identical manner on many (most? all?) systems. Suggested by Kerim Borchaev. 11/11/2003: beazley Configuration changes to make SWIG work on Mac OS X 10.3.x (Panther). Tested with Python, Tcl, Perl, and Ruby---all of which seem to work. 11/08/2003: cheetah (William Fulton) [Java] Fixed the typemaps in various.i which were mostly broken. char **STRING_IN and char **STRING_RET typemaps replaced with STRING_ARRAY. float *FLOAT_ARRAY_RETURN typemap removed. 11/08/2003: beazley [Tcl] Tcl module now emits a safe module initialization function by default. It can be removed by running 'swig -nosafe'. 11/04/2003: mkoeppe (Matthias Koeppe) [Guile] Only use the SCM_ API when the function `scm_slot_exists_p' exists (needed for GOOPS support). This function was renamed during the Guile 1.5 series from `scm_slots_exists_p'. Report the right runtime library when invoked with -scm -ldflags. 11/03/2003: mkoeppe (Matthias Koeppe) [Chicken] Fix #782052. The --with-chickencfg configure option (and others) were not accepted. 11/02/2003: mkoeppe (Matthias Koeppe) [Guile] Merge new set of GOOPS changes by John Lenz. GOOPS objects are now manipulated directly by the C code. Some fixes to typemap-GOOPS interaction. 11/02/2003: mkoeppe (Matthias Koeppe) [Guile] Remove the file argument to -scmstub and -goops. The Scheme files are now always called MODULE.scm or MODULE-primitive.scm, where MODULE is the module name and "primitive" can be changed by the -primsuffix option. The Scheme files are now placed in the directory given by the -outdir option, or the current directory. (Patch by John Lenz, slightly modified.) *** INCOMPATIBILITY [Guile] *** 11/02/2003: mkoeppe (Matthias Koeppe) Unify the pointer-conversion runtime API. The standard functions are: * SWIG_NewPointerObj (POINTER, TYPE, FLAGS) -- Create an scripting object that represents a typed pointer. FLAGS are language specific. * SWIG_ConvertPtr (INPUT, RESULT, TYPE, FLAGS) -- Get a pointer from the scripting object INPUT and store it in the place RESULT. When a type mismatch occurs, return nonzero. * SWIG_MustGetPtr (INPUT, TYPE, ARGNUM, FLAGS) -- Get a pointer from the scripting object INPUT and return it. When a type mismatch occurs, throw an exception. If ARGNUM > 0, report it as the argument number that has the type mismatch. [Guile]: No changes. [MzScheme]: No changes. [Perl]: Add the function SWIG_NewPointerObj. The function SWIG_MakePtr is kept. The function SWIG_MustGetPtr is currently not supported. [Python]: Add the function SWIG_MustGetPtr. [Ruby]: Add the function SWIG_MustGetPtr. [Tcl]: Remove the "interp" argument of SWIG_NewInstanceObj, SWIG_ConvertPtr, SWIG_ConvertPacked, and SWIG_ConvertPtrFromString. The function SWIG_MustGetPtr is currently not supported. No changes to Pike because its pointer conversion code did not look complete. No changes to PHP4, because I did not understand its runtime code. No changes to Chicken because major changes are expected soon anyway. No changes to Java, OCaml, C# because they do not seem to have a pointer-conversion runtime API. *** INCOMPATIBILITY [Tcl] *** 11/02/2003: mkoeppe (Matthias Koeppe) [Perl5, PHP4, Pike, Python, Ruby, Tcl]: Use the preprocessor to rename external functions of the SWIG runtime API to follow the naming convention SWIG__. This should allow linking more than one interpreter into a program. 10/31/2003: cheetah (William Fulton) [C#] Fix since introducing the exception and std::string delegates. The fix overcomes linker errors when using more than one SWIG module. Problem reported by Andreas Schörk. 10/31/2003: beazley Incorporated patch: [ 823302 ] Incr Tcl support. Contributed by Alexey Dyachenko. Note: needs documentation. 10/31/2003: beazley Incorporated patch: [ 829325 ] new Python Module options and features. Robin Dunn writes: This patch makes a number of changes to the SWIG python module. 1. Add -apply option, and change the default code output to use the foo(*args, **kw) calling syntax instead of using apply(). If the -apply option is given then code is generated as before. This is very similar to Patch #737281 but the new -modern option makes the second half of that patch unnecessary so it is not included here. 2. Add -new_repr option. This is the same as my Patch #797002 which I will mark as closed since it is no longer needed. When this new option is used then the __repr__ methods that are generated for proxy classes will be more informative and give details about the python class and the C++ class. 3. Add %feature("addtofunc"). It allows you to insert one or more lines of code inside the shadow method or function that is already generated, instead of replacing the whole thing like %feature("shadow") does. For __init__ it goes at the end, for __del__ it goes at the begining and for all others the code generated is expanded out to be like def Bar(*args, **kwargs): val = _module.Foo_Bar(*args, **kwargs) return val and the "addtofunc" code is inserted just before the return statement. If the feature is not used for a particular method or function then the shorter code is generated just like before. 4. A little bit of refactoring to make implementing addtofunc a little easier. 5. Added a -modern command-line flag that will cause SWIG to omit the cruft in the proxy modules that allows it to work with versions of Python prior to 2.2. The result is a simpler, cleaner and faster python proxy module, but one that requires Python 2.2 or greater. 10/31/2003: beazley Incorporated patch: [ 829319 ] XML module tweaks. This adds a new command line option -xmllite that greatly reduces the amount of emitted XML code by eliminating some fields mostly used in SWIG's internal processing. Contributed by Robin Dunn. 10/31/2003: beazley Incorporated patch: [ 829317 ] Adds DohSplitLines function. Contributed by Robin Dunn. 10/29/2003: beazley Fixed [ 827907 ] argout objects not being wrapped properly (PATH). Patch contributed by Salvador Fandiño García. 10/29/2003: beazley Fixed [ 826996 ] perl type checking ignores perl subclasses. This enhancement makes it so wrapped classes and structs can be subclassed in Perl and used normally. Patch contributed by Salvador Fandiño García. 10/16/2003: cheetah (William Fulton) [C#] IntPtr marshalled with a void* instead of int in C function declarations. The casts thus look more conventional, for example: // old DllExport double SWIGSTDCALL CSharp_get_Shape_x(int jarg1) { ... Shape *arg1 = (Shape *) 0 ; arg1 = *(Shape **)&jarg1; ... } // new DllExport double SWIGSTDCALL CSharp_get_Shape_x(void * jarg1) { ... Shape *arg1 = (Shape *) 0 ; arg1 = (Shape *)jarg1; ... } 10/14/2003: beazley Fixed a subtle problem with overloaded methods and smart pointers. If a class has overloaded methods like this: class Foo { public: int bar(int x); static int bar(int x, int y); }; and the class is used as a smart pointer: class FooPtr { public: Foo *operator->(); }; The SWIG would try to expose the static member Foo::bar through FooPtr---resulting bogus wrapper code and a compiler error. Due to the way in which overloading is handled, it is extremely difficult to eliminate the static method in this case. Therefore, it is still exposed. However, the generated code now compiles and works. 10/05/2003: mkoeppe (Matthias Koeppe) [Guile, MzScheme, Chicken]: Remove symbol clashes between the runtime libraries by renaming all extern common.swg functions with the preprocessor. 10/05/2003: mkoeppe (Matthias Koeppe) [Guile] Added basic GOOPS support, contributed by John Lenz. See the documentation for details. *** NEW FEATURE *** 10/04/2003: mkoeppe (Matthias Koeppe) [Guile] New option, -only-setters, which disables traditional getter and setter procedures for structure slots. 10/03/2003: mkoeppe (Matthias Koeppe) [Guile] Added run test for reference_global_vars by John Lenz. 09/30/2003: beazley Partial solution to [ 792180 ] C++ smart-pointer/namespace mixup revisited. The problem is not easy to fix (at least it doesn't seem so), but is related to the instantiation of qualified templates inside of other namespaces. SWIG now generates an error message in this case rather than generating broken wrappers. 09/30/2003: beazley Fixed [ 800012 ] ENTER macro from CORE/scope.h clashes with libc search.h. Reported by Britton Leo Kerin. 09/30/2003: beazley Fixed [ 811518 ] Casting ints to doubles (w/ solution?) Addresses a problem with overloading in the Perl module. Reported by Gerald Dalley. 09/28/2003: mkoeppe [Guile with -scm option] Fix typo in generated code for procedures-with-setters. Reported by John Lenz. 09/26/2003: beazley Fixed [ 812528 ] externs not correct when throw is in signature. Reported by Joseph Winston. 09/23/2003: cheetah (William Fulton) SWIG was generating a number of symbols that didn't comply with the ISO C/C++ standard, in particular ISO/IEC 14882:1998(E) 17.4.3.1.2 where double underscores are forbidden as well as symbols starting with an underscore followed by an upper case letter. Most of these have been rooted out. See new section added to internals.html development manual 'Symbol Naming Guidelines for Generated C/C++ Code'. 09/23/2003: cheetah (William Fulton) Director typemap name changes: inv => directorin outv => directorout argoutv => directorargout *** POTENTIAL INCOMPATIBILITY *** 09/19/2003: mrose (Mark Rose) [Python] Director constructors now default to __disown = 0, which is the intended behavior and fixes the director_finalizer test case under python. 09/12/2003: cheetah (William Fulton) [C#] - Typemaps added for std::string and const std::string &. - New delegate for creating a C# string given a char *. It can be used by calling SWIG_csharp_string_callback as shown in the std::string 'out' typemap. Useful if the return type is mapped to a C# string and the calling function is responsible for cleaning up memory as the C# garbage collector doesn't free the memory created in C/C++ and then returned as a C# string. - The exception delegates have moved into an inner class in the intermediate class, thereby freeing up the static constructor. 09/11/2003: beazley (Internals) Major refactoring of iteration over lists and hashes. The DOH library now uses iterators. They work like this: List *l = (some list); Iterator i; for (i = First(l); i.item; i = Next(i)) { // i.item contains the actual list item. // i.item is NULL at end of list ... } Hash *h = (some hash); Iterator j; for (j = First(h); j.item; j = Next(j)) { // j.item contains hash table item // j.key contains hash table key // Both j.item and j.key are NULL at end ... } The old iteration functions Firstitem(), Nextitem(), Firstkey(), and Nextkey() are gone. The new iterators are simpler, result in better memory use, and may be faster. Also, there are no longer any problems iterating over the same list/hash in multiple places at the same time. For example, this is fine: Iterator i,j; for (i = First(l); i.item; i = Next(i)) { for (j = First(l); j.item; j = Next(j)) { ... } } (This never worked in previous versions). *** POTENTIAL INCOMPATIBILITY ***. This will probably break third party extensions to SWIG (or give them further encouragement to join the SWIG CVS-tree :-). 09/10/2003: mkoeppe (Matthias Koeppe) [Guile] Fix memory leaks in the "list-vector.i" typemaps. 09/09/2003: mkoeppe (Matthias Koeppe) [Chicken] Use C_mk_bool rather than C_mkbool. This fixes the wrapping of boolean values for Chicken 1.10 and newer. Reported by Dave / Felix Winkelmann . 09/05/2003: cheetah (William Fulton) [Java] Directors implemented for Java. In summary this is a big new feature which supports upcalls from C++ to Java. Code is generated to support C++ callbacks to call into Java and true polymorphic behaviour for Java classes derived from C++ classes. See java.html for details. Contributed by Scott Michel. 09/05/2003: Tiger Created contract example directory at /SWIG/Examples/contract Added simple contract examples (simple_c & simple_cxx) Modified contract module's output format *** NEW FEATURE *** 09/01/2003: cheetah (William Fulton) Test-suite build improvements: - Multiple build directories working for the test suite, so it is now possible to run configure in multiple subdirectories and run the test suite in each of these sub directories. - 'make distclean' fixed so it doesn't bomb out on the Examples directory when using multiple subdiretory builds. Required the following directories to be moved: Examples/GIFPlot/Perl -> Examples/GIFPlot/Perl5 Examples/GIFPlot/Php -> Examples/GIFPlot/Php4 These new directories used to be symbolic links to the old directory. Also the Examples/test-suite/Perl symbolic link has been removed. - Running the test-suite, other than from the root directory, say in Examples/test-suite/python will now display all the code being executed. - The following 3 C# compilers are detected during configure and work with the test-suite: Mono, Portable.NET and Microsoft. 09/01/2003: Tiger Added inheritance support for design by contract feature. 09/01/2003: beazley Fixed [ 794914 ] Wrong types in template specialization. SWIG was not handling arguments correctly in template partial specialization. For example, template class Foo { public: T *blah(); }; %template(FooInt) Foo; in this class, the return type of blah was set to 'int **', but it should really be 'int *'. This has been fixed, but it will affect all prior uses of partial specialization. 09/01/2003: beazley Fixed [ 786394 ] Patch for generated perl code does not compile under RedHat9. Reported by Scott Finneran. 09/01/2003: beazley Fixed [ 791579 ] (unsigned) long long handled incorrectly (Tcl). This was an error in the Tcl typemaps.i file. Reported by Kjell Wooding. 09/01/2003: beazley Fixed [ 797573 ] no way to rename classes coming from C structures. This problem relates to renaming of anonymous structures with a typedef. For example: %rename(Bar) Foo; typedef struct { ... } Foo; Reported by Britton Leo Kerin. 09/01/2003: beazley Fixed [ 797576 ] -help seems to imply that only tcl-specific options exist. Added a comment to alert user to other options. Reported by Britton Leo Kerin. 09/01/2003: beazley Fixed [ 798205 ] Segfault in SWIG_ConvertPtr. Reported by Prabhu Ramachandran. 08/30/2003: mrose (Mark Rose) Modified the director typemaps in python/std_complex.i to use the new-style macro and conversion functions, which eliminated some redundant code. Fixed a few bugs in these typemaps as well, although more testing is needed. 08/29/2003: mrose (Mark Rose) Completed initial support for wrapping abstract classes with directors. Constructor wrappers will be generated for abstract classes that have directors, and instances of the director classes will be created regardless of whether the proxy class has been subclassed in the target language. No checks are made during construction to ensure that all pure virtual methods are implemented in the target language. Instead, calls to unimplemented methods will throw SWIG_DIRECTOR_PURE_VIRTUAL_EXCEPTION exceptions in C++. Integrated Prabhu Ramachandran's typemap patches, which provide director typemap support for enums and std::size_t, and fix a couple bugs in the director std::vector<> typemaps. 08/29/2003: cheetah (William Fulton) [C#] Implemented exception handling for throwing C# exceptions from C/C++ code. A few delegate functions are available for calling which then throw the C# exception. Use the SWIG_CSharpThrowException function from C/C++ typemaps. See the generated wrapper code or csharphead.swg for all available exceptions. Example: SWIG_CSharpThrowException(SWIG_CSharpException, "exception description"); The 'throws' typemaps are also now implemented, so code is automatically generated to convert any C++ exception into a C# System.Exception when the C++ method declares an exception specification such as: int foo() throw(Bar); Also any parameters that are references to a C++ class or a class passed by value and are passed as a C# null will now throw a C# NullReferenceException. 08/29/2003: cheetah (William Fulton) [C#] Fix to match the calling convention of all pinvoke methods so that they match the calling convention used by default in the C# 'static extern' declarations (__stdcall is used on Windows). 08/19/2003: cheetah (William Fulton) [Java] Reworked std::string typemaps. Fixes a number of string in std namespace problems. For example %template vector. The templated class' get method wasn't returning a Java String, but a SWIGTYPE_p_string. Reported by Zach Baum. 08/15/2003: beazley Fixed [ 763522 ] 1.3.19 segfault in SwigType_add_pointer/DohInsertitem. Related to problem with unnamed class handling in Perl module. 08/15/2003: beazley Fixed [ 763563 ] Missing indication of optional arguments. Tcl module. Reported by Krzysztof Kozminski. 08/15/2003: beazley Fixed [ 787432 ] long param handled as int. Tcl module now uses Tcl_GetLongFromObj to convert integer values. 08/11/2003: beazley Fixed [ 775989 ] numeric template parameters. There were some errors in template expansion related to the use of arrays where the array dimension was a template parameter. It should work now. Reported by Bryan Green. 08/10/2003: mrose (Mark Rose) Added a director typemap (outv) for return by value and cleaned up up a few of the commented director typemaps. 08/10/2003: mrose (Mark Rose) Fixed constructor generation for director classes to ignore private constructors. Protected constructors are also ignored for now, pending a solution to the problem of wrapping classes that only define protected constructors. 08/07/2003: cheetah (William Fulton) New commandline option -outdir to specify where the language specific files are to be generated. This is useful for target languages like Python, Java etc which generate proxy files in the appropriate language. This option does not apply to the C/C++ wrapper file. 08/07/2003: cheetah (William Fulton) On Windows the generated files (other than the _wrap.c or _wrap.cxx files) were sometimes incorrectly being generated into the current directory unless the input file used the Unix path separator. The Windows path separator should now be used. Bug reported by Robert Davies. 08/07/2003: beazley Added array variable set typemap to Perl module. 08/07/2003: beazley Fixed [ 775677 ] Array init causes codegen bug.. 08/07/2003: beazley Fixed [ 779062 ] Class"\n"::foo not supported. SWIG should now correctly handle whitespace in between namespace qualifiers. For example "A :: Foo :: Bar". 07/31/2003: cheetah (William Fulton) Fixes for parameters which are classes that are passed by value and have a default value. A copy constructor for SwigValueWrapper is required (SF #780056). Also fixed memory leak in these circumstances. These mods also fix SF #780054. 07/28/2003: beazley Improved run-time error message for pointers in Python module. Contributed by Zooko. 07/10/2003: ballabio (Luigi Ballabio) [Almost all languages] Wrappers for std::pair added. Typemaps for Python, Ruby, Guile and MzScheme. 07/01/2003: mkoeppe (Matthias Koeppe) [Chicken] Handle the case of more than one argout typemap per function. 06/29/2003: cheetah (William Fulton) [Java, C#] SF #670949 request. The destructor wrapper function name is now configurable. A new attribute called methodname in the javadestruct/javadestruct_derived (Java) or csdestruct/csdestruct_derived (C#) typemaps specifies the method name. For example in Java the destructor is wrapped by default with the delete method: %typemap(javadestruct, methodname="delete") SWIGTYPE {...} 06/27/2003: cheetah (William Fulton) [Java, C#] The throws attribute for adding exception classes to the throws clause also now works with the following typemaps: newfree javain, javaout (Java) csin, csout (C#) For example, the 'AnException' will be added to the throws clause in the proxy function: %typemap(javaout, throws="AnException") int { int returnValue=$jnicall; if (returnValue==0) throw new AnException("Value must not be zero"); return returnValue; } 06/25/2003: mrose (Mark Rose) [Python] Director typemap marshalling checks for null pointers when walking the parameter list instead of relying soley on the parameter count. Cures a segfault that occurred for multiple argument inv typemaps. Someone with more Swig experience should probably review this code. 06/24/2003: mkoeppe (Matthias Koeppe) [Chicken] Don't emit calls to "C_check_for_interrupt", which may result in an endless loop. Patch by felix@proxima-mt.de. 06/20/2003: cheetah (William Fulton) [C#] Finalizers now use destructor syntax as the override which was used in the Finalize method is not in the ECMA standards, spotted by the MS compiler. 06/10/2003: cheetah (William Fulton) [C#] A number of changes have been made to remove the Java naming that was used in the C# module. Typemap name changes: jni -> ctype jtype -> imtype jstype -> cstype javain -> csin javaout -> csout javainterfaces -> csinterfaces javabase -> csbase javaclassmodifiers -> csclassmodifiers javacode -> cscode javaimports -> csimports javaptrconstructormodifiers -> csptrconstructormodifiers javagetcptr -> csgetcptr javafinalize -> csfinalize Feature name changes: javaconst -> csconst javamethodmodifiers -> csmethodmodifiers Pragma changes: pragma(java) -> pragma(csharp) jniclassbase -> imclassbase jniclassclassmodifiers -> imclassclassmodifiers jniclasscode -> imclasscode jniclassimports -> imclassimports jniclassinterfaces -> imclassinterfaces Special variable name changes: $javaclassname -> $csclassname $javainput -> $csinput $jnicall -> $imcall This will break SWIG interface files that use these typemaps, features and pragmas. Please update your code or use macros for backwards compatibility. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 06/10/2003: mkoeppe (Matthias Koeppe) [MzScheme] Applied MzScheme module updates contributed by John Lenz . - Updated mzscheme to use SWIG's common runtime type system from common.swg. - The Lib/mzscheme directory has been reorganized to standardize names across the language modules: mzscheme.i was moved to mzscheme.swg, mzscheme.swg and mzschemedec.swg have been removed, mzrun.swg (which contains the runtime code) has been added. - The swig_proxy structure was renamed to swig_mz_proxy. swig_mz_proxy now contains a pointer to a swig_type_info structure. - Added varin and varout typemaps for SWIGTYPE [] and SWIGTYPE &. - Garbage collection by calling scheme_add_finalizer() has been added. *** NEW FEATURE [MzScheme] *** 06/10/2003: cheetah (William Fulton) [Java] New typemaps: javadestruct and javadestruct_derived for the C++ destructor wrapper. The javadestruct version gets used by classes at the top of an inheritance chain and the javadestruct_derived version gets used by other classes. [C#] cildispose and cildisposeoverride typemaps replaced by csdestruct and csdestruct_derived typemaps. The delete() method has been removed and its functionality put into these typemaps designed for the Dispose() method. - New typemaps csinterfaces and csinterfaces_derived replace the javainterfaces typemap. Also fixes the peculiarity of all classes in an inheritance chain individually deriving from the IDisposable interface. - New typemap csfinalize for finalizers. C++ destructors are now called by garbage collector during finalization. Problem reported by Andreas Schörk. 06/10/2003: Tiger Modified contract code for error message output. Contract code can now print out simple error message. Modified contract code to prepare for inheritance 06/03/2003: mkoeppe [Guile] Applied Guile module updates contributed by John Lenz . - SWIG currently uses Guile's gh_ API, which is marked as deprecated in Guile 1.6 and will be removed in Guile 1.9. This change introduces a command-line flag "-scm" which causes SWIG to generate wrappers that use Guile's SCM API instead; this requires Guile >= 1.6. - The Lib/guile directory has been reorganized to standardize names across language modules: guiledec.swg and guile.swg have been moved into guile_gh_run.swg, guile.i has been moved to guile_gh.swg, guile_scm.swg and guile_scm_run.swg which contain the SCM API stuff have been added - ghinterface.i, which contains the defines from the gh_ functions to the scm_functions has been added - The API for dealing with pointer objects is now SWIG_ConvertPtr, SWIG_MustGetPtr, SWIG_NewPointerObj. - Added varin and varout typemaps for SWIGTYPE [] and SWIGTYPE & - Garbage collection has been added. *** NEW FEATURE [Guile] *** 06/01/2003: cheetah (William Fulton) Dimensionless arrays such as int foo[] = {1, 2}; extern int bar[]; produce a warning that the variable is read-only. Depending on the target language, this used to cause compile errors or generate a setter that generated a runtime error. A setter cannot be automatically generated because the array size cannot be determined by SWIG. A varin, globalin or memberin typemap (depending on the target language) must be written by the user. 05/29/2003: beazley Refinement to default typemap matching and arrays. When an array is declared like this: int foo[4]; The default typemap now resolves to SWIGTYPE [ANY] If no match is found for that, it then resolves to SWIGTYPE [] If no array dimension is specified in the original declaration, the SWIGTYPE [] is used right away. Note: This change has been made to resolve problems related to arrays with and without dimensions. For example, sometimes SWIG was generating setter functions for array variables with no dimensions (an error). Likewise, SWIG sometimes made arrays with dimensions read-only (also an error). This fixes the arrays_global test problem. 05/28/2003: beazley Fixed subtle type handling bug with references and pointers. If you had functions like this: typedef Foo Bar; Foo *func1(); void func2(Bar &x); Then func2() wouldn't accept objects returned by func1() because of a type error. It should work now. Reported by Brian Yang. 05/21/2003: cheetah (William Fulton) Fixes to some of the Visual C++ example project files which would not work with spaces in the paths held in the environment variables used to point to the target language's library / include directory. SF bug #740769 05/21/2003: songyanf (Tiger) Added -contracts option. First try of the idea of "Wrap by Contract": build up realiable cross-language module by wrapping with SWIG. Implemented basic assertion (preassertion & postassertion & invariant) for simple C/C++ functions. Current format of contracts are: %contract class_name :: func_name (paras...) { require: boolean exprs; exprs; ensure: boolean expr; exprs; invariant: boolean expr; exprs; } *** NEW FEATURE *** 05/19/2003: cheetah (William Fulton) Build tweaks. There were a few preprocessor definitions which were specified in the Makefile for passing on the commandline when compiling. These are now all defined in swigconfig.h. Autoconf doesn't normally allow installation directories to be defined in this config header file, but an autoconf archive macro enables this. This macro along with future autoconf macros are going to be put in the Tools/config directory. 'swig -version' now reports the target build platform. 05/11/2003: cheetah (William Fulton) [C# and Java] Fix to the following typemaps: javabase, javainterfaces, javaimports, javaclassmodifiers, javaptrconstructormodifiers, javafinalize, javagetcptr & javacode. These are the typemaps for modifying/generating proxy classes. Previously the typemaps would use the proxy class name and not the C++ type, which was inconsistent with all other typemaps. In most circumstances the proxy class name and the C++ class name/type is the same except for classes in namespace, templated classes etc. so this shouldn't affect most cases. *** POTENTIAL INCOMPATIBILITY FOR JAVA and C# MODULES *** 05/09/2003: cheetah (William Fulton) Visual C++ Project files have been added so that the runtime libraries can be built on Windows (for Tcl, Perl, Python and Ruby). 05/01/2003: beazley Fixed problem with return by value, const, and private constructors. For example: class B { private: B(); public: B(const B&); }; class A { ... const B returnB() const; ... }; Problem and patch suggestion reported by Bill Hoffman. 04/29/2003: cheetah (William Fulton) Build changes: - Single autoconf invocation - autoconf in the Tools directory has gone. - Libtool bootstrapped when running autogen.sh. This requires anyone using the cvs version of SWIG to have libtool installed on their machine. Suggest version 1.4.2 or higher, preferably the latest - 1.5. - Automake is now used to build the runtime libraries in conjunction with libtool. - Runtime libraries are now successfully built as DLLs on Cygwin. - Skipping languages is no longer just determined in the top level makefile but in configure.in. This info is used for building the runtime libraries and for running the examples and test-suite. - These changes have fixed multiple build directory builds, that is building from directories other than the top level directory. Installation from multiple build directories also working. An initial configure in the top level directory is no longer needed as described in 04/02/2003 entry. A 'make distclean' will be needed before building in a directory other than the top level directory if the autotools have been run from this top level directory at some point, but autoconf will tell you this. Note that 'make check' only works from the top level directory at the moment. 04/28/2003: beazley Fixed [ 723471 ] Wrapper_print() fails with preprocessor directives. 04/28/2003: beazley Minor refinement of const static member variable handling described in CHANGES 08/11/2002. Previously, SWIG merely checked to see if there was an initializer in the declaration. Now, SWIG additionally checks to make sure the static member is const. 04/25/2003: ljohnson (Lyle Johnson) [Ruby] Added a kind of limited support for multiple inheritance, activated using the -minherit command-line option. I've also updated the "C++ Inheritance" section of the Ruby documentation to discuss how this works, and its limitations. Also also modified the minherit.i test case to run against this. 04/25/2003: ljohnson (Lyle Johnson) [Ruby] Added the -globalmodule command-line option for the Ruby module, for wrapping stuff into the global module (Kernel) instead of a nested module. Updated documentation accordingly. 04/23/2003: mrose (Mark Rose) Fixed symname error in director calls to Python methods that extend C++ operators. Stopped director destructor wrappers from calling __set_up, which was leaving the director flag in an inconsistent state. 04/23/2003: beazley Fixed problem with namespace resolution and nested namespaces. Reported by Alfred Lorber (and Marcelo Matus). 04/16/2003: cheetah (William Fulton) Patch for Java examples and test-suite to run on Mac OS X. 04/15/2003: ljohnson (Lyle Johnson) [Ruby] Incorporated Nobu Nakada's patches for supporting the Ruby 1.8 allocation framework. 04/15/2003: ljohnson (Lyle Johnson) [Ruby] Replaced all uses of the deprecated STR2CSTR() macro with the safer StringValuePtr() macro. For more information, see ruby-talk:67059 and follow-ups to that post. 04/11/2003: beazley Fixed problem with preprocessor macro expansion. For example: #define min(x,y) ((x) < (y)) ? (x) : (y) int f(int min); Reported by Sebastien Recio. 04/10/2003: cheetah (William Fulton) [Java] Added a runtime check to typemaps in arrays_java.i library to check that the Java array passed in is the same size as the C array and throw an exception if not. Also fix to use delete instead of free for arrays created using new. 04/07/2003: cheetah (William Fulton) Remove GCC3 warning when compiling the examples and test-suite: cc1plus: warning: changing search order for system directory "/usr/include" cc1plus: warning: as it has already been specified as a non-system directory See SF patch #715531 submitted by Gerald Williams 04/03/2003: cheetah (William Fulton) [C#] Improved wrapping of enums and constants. These were previously wrapped as C# variables rather than constants. Either these are wrapped as readonly (runtime) constants or compile time constants, depending on the %javaconst directive (The directive is likely to change name soon). For example wrapping: %javaconst(0); #define ABC 22 %javaconst(1) XYZ; #define XYZ 33 is now: public static readonly int ABC = examplePINVOKE.get_ABC(); public const int XYZ = 33; 04/03/2003: cheetah (William Fulton) [Java] Global constants and enums are put in their own interface called xxxConstants, where xxx is the module name. This is an improvement as it is possible to derive (implement) a Java class from the xxxConstants interface to improve the syntax; namely when wrapping: enum {ONE=1, TWO, THREE}; accessing these from a Java class implementing xxxConstants is neater: int number = ONE; than the previous: int number = xxx.ONE; Patch submitted by Dave Dribin. 04/02/2003: cheetah (William Fulton) Build improvements for multiple builds. This allows one to build the SWIG executable and runtime libraries for different platforms/compilers etc by running configure in different directories. This isn't 100% just yet and won't be until libtool is better configured... a 'configure' and 'make distclean' needs to be run in the root directory before it all works. For example: $ ./configure $ make distclean $ mkdir config1; cd config1; ../configure CC=gcc CXX=g++; make; cd .. $ mkdir config2; cd config2; ../configure CC=cc CXX=c++; make; cd .. To be improved. A 'make check' does not work yet either. 04/01/2003: beazley Fixed template partial specialization argument expansion bug. This showed up when trying to use std_vector.i with vectors of pointers. 03/31/2003: cheetah (William Fulton) Fix for parallel make builds of SWIG, for example make -j 4 Build failure reported by Bill Clarke. 03/28/2003: beazley Released 1.3.19. Version 1.3.19 (March 28, 2003) =============================== 03/28/2003: beazley Variety of minor bug fixes to the 1.3.18 release including: - Segmentation fault with %extend directive. - Typemap variable substitution bug. - Expression evaluation bug. - Large memory leak with template expansion. Version 1.3.18 (March 23, 2003) =============================== 03/21/2003: beazley Fixed two problems with the %extend directive, overloading, and template expansion. See the 'template_extend_overload' and 'template_extend_overload_2' tests in Examples/test-suite for details. 03/20/2003: cheetah (William Fulton) [C#] Added some typemaps as suggested by Andreas Schoerk for handling parameters that are passed as pointers or by reference. These have been put in typemaps.i. 03/20/2003: beazley Fixed a C++ scoping bug related to code like this: class Foo { public: int Foo::bar(); }; Previously, SWIG just tossed out the Foo::bar() declaration. Now, the declaration is wrapped provided that the prefix is exactly the same as the current scope (including any enclosing namespaces). Reported by Bruce Lowery. 03/20/2003: beazley Incorporated [ 696516 ] Enabling exception processing for data member access. In some compilers, attribute access can generate exceptions. However, SWIG ordinarily assumes that no exceptions will be raised. To disable this, use the %feature("allowexcept"). For example: %feature("allowexcept") Foo::x; ... class Foo { public: int x; /* Exception handling enabled */ ... }; Patch contributed by Yakov Markovitch. 03/20/2003: beazley Incorporated Patch. [ 701860 ] Improve Performance (python proxies). Gives a performance boost to proxy class code and the management of the .this and .thisown attributes. Contributed by Mike Romberg. 03/19/2003: cheetah (William Fulton) [C# and Java] Added missing vararg support. 03/18/2003: mrose (Mark Rose) Removed code related to tagging individual methods for directors. The concept of having directors for some but not all virtual methods of a class is deeply flawed. The %feature("nodirector") tag is also gone. Directors are off by default. To enable them for a class, issue %feature("director") classname; which will create director methods for every virtual method in the hierarchy of the class. 03/17/2003: beazley Fixed a subtle problem with passing arguments of type function. For example: int foo(int x(int, int)); or typedef int binop_t(int, int); int foo(binop_t x); In old versions, this would produce code that wouldn't compile. Now, SWIG merely adds an extra pointer, making these declarations the same as: int foo(int (*x)(int, int)); typedef int binop_t(int, int); int foo(binop_t *x); Reported by Garth Bushell. 03/17/2003: mrose (Mark Rose) Fixed the return statement for director base class calls that have no return value. 03/15/2003: beazley Fixed a problem with const smart-pointer wrapping. For example: class Foo { public: int x; void bar() const; void spam(); }; class Blah { ... const Foo *operator->(); ... }; In this case, only "x" and "bar" are visible from Blah (since application of spam violates constness). Moreover, access to "x" is read-only. 03/15/2003: mrose (Mark Rose) Cleaned up two signed versus unsigned comparisons in python/std_vector.i. 03/15/2003: cheetah (William Fulton) [C#] Global variables are wrapped using properties instead of get and set methods. Member variable wrapping bug fixes, for example wrapping pointers work now. Typemaps are used for all variable wrapping to generate the property code. 03/13/2003: mrose (Mark Rose) Fixed a bug in the virtual method unrolling for directors. The order of unrolling is now from base to derived, to ensure that the most derived implementation of a director method is found. Director methods for pure virtual methods now throw DIRECTOR_PURE_VIRTUAL_EXCEPTION if _up is set. 03/12/2003: cheetah (William Fulton) [C#] Polymorphism fix: virtual functions now use the appropriate keyword in the C# proxy class, virtual or override. Some 'using System;' statement fixes needed by the Mono compiler. 03/11/2003: beazley Fixed subtle bug in the application of SwigValueWrapper<> to template classes with default constructors. Reported by Bruce Lowery. 03/11/2003: beazley The $descriptor(type) variable is now expanded in code supplied to %extend. This is useful for certain kinds of advanced wrapping (especially container classes). 03/11/2003: luigi Support for std::map. (a) Integration with scripting language (a la std::vector) for Python, Ruby, MzScheme, and Guile; (b) Simple wrapper for other languages 03/10/2003: beazley Fixed problem with escape sequences in string and character constants. SWIG wasn't parsing certain octal codes correctly. 03/07/2003: beazley Fixed a variety of subtle preprocessor problems reported by Sebastien Recio. (a) Empty preprocessor values no longer generate "bad constant value" errors. For example: #define FOO #define FOO BAR (b) Macro names can now span multiple lines (technically valid, although questionable practice). For example: #define A_LONG_MACRO_\ NAME 42 (c) Whitespace is no longer required before certain macro values. For example: #define FOO"Hello" #define BAR\ "Hello" 03/07/2003: ljohnson (Lyle Johnson) [Ruby] Added missing long long and unsigned long long typemaps in the Lib/ruby/typemaps.i library file. 03/07/2003: mrose (Mark Rose) Added Examples/python/callback to demostrate how directors can be used to implement callbacks in Python Added Examples/python/extend to demonstrate virtual method calls from C++ to Python (really the same as the callback example, just a different context). Added four tests for very basic director functionality. These have runtime tests under python. The Python module now emits #define SWIG_DIRECTORS near the top of the output file if directors are enabled. This is useful for disabling parts of tests in target languages that don't support directors. 03/06/2003: mrose (Mark Rose) Added a section to Doc/Manual/Python.html on cross language polymorphism (directors). 03/06/2003: mrose (Mark Rose) The short-lived "-fdirectors" command line option has been removed. To enable directors, instead use the extended %module directive as follows: %module(directors="1") modulename 03/06/2003: cheetah (William Fulton) The long long typemaps have been rewritten so that they can be more easily used with non ISO compilers, like Visual C++. For example if you are wrapping the Windows 64 bit type __int64 the long long typemaps can be used with %apply: %apply long long { __int64 }; __int64 value1(__int64 x); __int64 will now appear in the generated code instead of long long. 03/06/2003: beazley *** DEVELOPER CHANGE *** Swig module mutation has been changed slightly. When a language class method wants to save node attributes, it now uses one of the following functions: Swig_require() Swig_save() The first argument to these functions is a namespace in which saved attributes are placed. For example,this code Node *n; Swig_save("cDeclaration",n,"type","parms","name",NIL); saves the attributes as "cDeclaration:type", "cDeclaration:parms", and so forth. If necessary, a language module can refer to old values by using this special namespace qualifier. In addition to this, a special attribute "view" contains the name of the last namespace used to save attributes. In the above example, "view" would have the value "cDeclaration". The value of "cDeclaration:view" would have the previous view and so forth. Swig_restore(n) restores a node to the state before the last Swig_require() or Swig_save() call. Note: This change makes it easier for language modules to refer to old values of attributes. 03/06/2003: mrose (Mark Rose) Merged the cross-language polymorphism patch. When enabled, C++ "proxy" classes (called directors) are generated for each specified C++ class. Directors pass method calls from C++ to Python, similar to the way the usual proxy (shadow) classes pass method calls from Python to C++. Together, these two types of proxies allow C++ classes that are extended in Python to behave just like ordinary C++ classes and be used in C++ like native objects. This feature is still very experimental and is disabled by default. To enable director support, specify '-fdirectors' on the SWIG command line or in the SWIG_FEATURES environment variable. In the interface file, add %feature("director") to generate directors for all classes that have virtual methods. See http://stm.lbl.gov/~tm2/swig/ProxyDoc.html for more details. 03/03/2003: beazley Fixed a small glitch in typemap local variable replacement. If you had a typemap like this: %typemap(in) type ($1_type temp) { ... temp = ...; ... } and no occurrence of "$1_type" appeared in the body, then the local variable type wouldn't be substituted. 03/03/2003: cheetah (William Fulton) [C#] New version of the CSharp module which is typemap based. It also uses ECMA C# and no longer uses Microsoft Visual C++.NET glue. This means that it will work on non-Windows platforms. Contributed by Neil Cawse. 02/27/2003: beazley Fixed [ 653548 ] error parsing casting operator definition. SWIG now ignores casting operators declared outside of a class. For example: inline A::operator char *() { ... } Bug reported by Martin Casado. 02/27/2003: beazley Added support for anonymous bit-fields. For example: struct Foo { int x : 4; int : 4; int y : 8; }; Anonymous bit-fields are ignored by SWIG. Problem reported by Franz Höpfinger. 02/26/2003: cheetah (William Fulton) [Java] Better typemaps in the Examples/java/typemap example and also fixes subtle bug when using the StringBuffer typemaps more than once. 02/26/2003: beazley Fixed [ 642112 ] Constants char bug. 02/26/2003: beazley Fixed [ 675337 ] Partial template specialization not entirely working. There was a subtle problem related to the naming and ordering of template partial specialization arguments. Matching worked okay, the resulting templates weren't expanded correctly. 02/25/2003: beazley Fixed problem with parsing (and generating code) for references to arrays. For example: int foo(int (&x)[10]); 02/25/2003: beazley Fixed [ 635347 ] Compilation warning from libpy.c. Reported by Daniel L. Rall. 02/25/2003: beazley Fixed a subtle problem with virtual method implementation checking and typedef. typedef int *intptr; struct A { virtual int *foo() = 0; }; struct B : public A { virtual intptr foo() { }; }; SWIG was treating these declarations as different even though they are the same (via typedef). 02/25/2003: ljohnson (Lyle Johnson) [Ruby] Added range checking for the NUM2USHRT macro, per [ 675353 ]. 02/24/2003: beazley Fixed a subtle problem with the code that determined if a class is abstract and can be instantiated. If you had classes like this: struct A { virtual int foo(int) = 0; }; struct B : virtual A { virtual int foo(int); }; struct C : virtual A { }; /* Note order of base classes */ struct D : B, C { }; /* Ok */ struct E : C, B { }; /* Broken */ then SWIG determined that it could instantiate D(), but not E(). This inconsistency arose from the depth-first search of the inheritance hierarchy to locate the implementations of virtual methods. This problem should now be fixed---SWIG will attempt to locate any valid implementation of a virtual method by traversing over the entire hierarchy. 02/22/2003: cheetah (William Fulton) [Java] Fix for using enum typemaps. The Java final static variable type can be set using the jstype typemap, enabling enums to be mapped to something other than int. Bug reported by Heiner Petith. 02/21/2003: songyanf (Tiger) Added CSharp (C#) module prototype i.e. csharp.cxx & csharp.h at Source/Modules/. They are for test usage only now and need improvement. The interface also need to be modified. *** NEW FEATURE *** 02/20/2003: songyanf (Tiger) Fixed problem with typedef with -fvirtual. Similar as beazley's modification today. 02/20/2003: beazley Added support for gcc-style variadic preprocessor macros. Patch [ 623258 ] GCC-style vararg macro support. Contributed by Joe Mason. 02/20/2003: beazley Fixed [ 605162 ] Typemap local variables. Reported by Lyle Johnson. 02/20/2003: beazley Fixed problem with abstract classes and typedef. For example: class Foo { public: virtual void foo(int x) = 0; }; typedef int Integer; class Bar : public Foo { public: virtual void foo(Integer x); }; SWIG was getting confused about the latter method---making Bar abstract. Reported by Marcelo Matus. 02/19/2003: cheetah (William Fulton) [Java] %javaconst(flag) can also be used on enums as well as constants. This feature enables true Java compiler constants so that they can be used in Java switch statements. Thanks to Heiner Petith for patches. 02/19/2003: songyanf (Tiger) Modified -fcompact feature to deal with PP lines 02/18/2003: beazley Fixed [ 689040 ] Missing return value in std_vector.i. Reported by Robert H. de Vries. 02/18/2003: beazley Fixed a few evil scoping problems with templates, namespaces, and the %extend directive. Problem reported by Luigi Ballabio. 02/18/2003: cheetah (William Fulton) [Ruby] Improved support for Visual C++ and other native Windows compilers. It is no longer necessary to specify "/EXPORT:Init_", where is the swig module name when linking using these native Windows compilers. 02/15/2003: songyanf (Tiger) Added -fvirtual option. Reduce the lines and size of the wrapper file by omitting redifined virtual function in children classes. Modified -compact option to -fcompact option Added -small option. -small = -fvirtual -fcompact And it can be extended by future feature options, which are used to reduce wrapper file szie. Added SWIG_FEATURES environment variable check. To dynamically set the feature options such as -fcompact & -fvirtual *** NEW FEATURE *** 02/13/2003: lenz Updated Doc/Manual/Perl5.html to talk about C++ compile problems configure.in now checks for PERL5_CCFLAGS Runtime/Makefile.in and Example/Makefile.in now use PERL5_CCFLAGS Added Lib/perl5/noembed.h which contains all the known macro conflicts 02/12/2003: beazley Fixed [ 685410 ] C++ Explicit template instantiation causes SWIG to exit. Fixes a syntax error with declarations similar to this: template class std::vector; SWIG now ignores the instantiation and generates a warning message. We might do more later. Reported by Thomas Williamson. 02/11/2003: cheetah (William Fulton) Rewrote bool typemaps to remove performance warning for compiling generated code under Visual C++. 02/11/2003: cheetah (William Fulton) Fix for wrapping reference variables (const non-primitive and all non-const types) for example: int& i; Class& c; const Class& c; 02/11/2003: beazley Fixed more very subtle preprocessor corner cases related to recursive macro expansion. For example: #define cat(x,y) x ## y cat(cat(1,2),3) // Produces: cat(1,2)3 #define xcat(x,y) cat(x,y) xcat(xcat(1,2),3) // Produces 123 See K&R, 2nd Ed. p. 231. 02/10/2003: cheetah (William Fulton) Fixed [ 683882 ] - patch submitted by F. Postma for SWIG to compile on HP-UX. 02/10/2003: beazley Fixed subtle preprocessor argument expansion bug. Reported by Marcelo Matus. 02/10/2003: songyanf Added -compact option. Reduce the lines and size of the wrapper file by omitting comments and combining short lines. *** NEW FEATURE *** 02/07/2003: beazley Fixed [ 651355 ] Syntax error with cstring.i Reported by Omri Barel. 02/07/2003: beazley Fixed [ 663632 ] incompatibility with standard cpp. This is a refinement that fixes this problem: // Some macro with an argument #define FOO(x) x int FOO; /* Not a macro---no arguments */ 02/05/2003: beazley Fixed [ 675491 ] parse error with global namespace qualification. Submitted by Jeremy Yallop. 02/04/2003: beazley Fixed bug in varargs processing introduced by the numinputs typemap parameter. 01/08/2003: ttn [xml] Fix string-replacement ordering buglet. Thanks to Gary Herron. 12/23/2002: cheetah (William Fulton) Further build changes: - The SWIG executable is now built using a single Makefile. - This makefile is generated by Automake (Source/Makefile.am). - Dependency tracking and tags support are in this makefile. - Automake 1.7.2 and Autoconf 2.54 minimum versions are needed to build SWIG from CVS. - Running ./autogen.sh now installs Autoconf/Automake support files into Tools/config and these files are no longer stored in CVS. - Bug fixes in 'make install' for systems using .exe executable extension and ./configure --with-release-suffix=whatever 12/16/2002: cheetah (William Fulton) More build changes: - Autoconf's AC_CANONICAL_HOST replaces proprietary approach for detecting build host. - Autoconf support files moved to Tools/config. 12/16/2002: cheetah (William Fulton) Modifications to run on MacOS, submitted by Bernard Desgraupes. Mainly ensuring generated files are output in the appropriate directory for some modules. 12/11/2002: cheetah (William Fulton) Various build modifications and bug fixes: - Simplification of version string. Use autoconf's PACKAGE_VERSION instead. - Build time removed from SWIG version. - Using standard autoconf config header generation. - Updated old autoconf macros as reported by autoupdate. - Removed $prefix in autoconf from search paths as autoconf won't expand them. - Subtle bug fix where 'make prefix=/somewhere; make clean; make prefix=/somwhere/else' produced an executable using the incorrect library directories. - Added -ldflags commandline option for MzScheme, Ocaml, Pike and PHP. - Fixed reporting of compiler used when using -version commandline option. - SWIG web address added to -version commandline option. 12/11/2002: beazley Minor fix to Tcl dynamic cast typemaps. Reported by Kristopher Blom. 12/10/2002: beazley Fixed subtle template argument replace bug. Reported by Chris Flatley. 12/10/2002: beazley Reverted CHANGES 09/03/2002, preprocessor argument evaluation. Arguments are not evaluated during collection, K&R, p. 230. 12/06/2002: beazley Fixed [ 649022 ] Compilation problems with KAI/KCC 12/02/2002: beazley SWIG 'rel-1-3' CVS branch merged back into the main branch. Version 1.3.17 (November 22, 2002) ================================== 11/19/2002: beazley Fixed [ 613922 ] preprocessor errors with HAVE_LONG_LONG. 11/19/2002: beazley Fixed [ 615480 ] mzscheme SWIG_MustGetPtr_. 11/19/2002: beazley Fixed [ 635119 ] SWIG_croak causes compiler warning. 11/16/2002: cheetah (William Fulton) [Java] Added typemaps for pointers to class members. 11/15/2002: cheetah (William Fulton) [Java] Bug fix: Overloaded C++ functions which cannot be overloaded in Java once again issue a warning. 11/14/2002: cheetah (William Fulton) [Java] Handling of NULL pointers is improved. A java null object will now be translated to and from a NULL C/C++ pointer by default. Previously when wrapping: class SomeClass {...}; void foo(SomeClass *s); and it was called from Java with null: modulename.foo(null) a Java NullPointerException was thrown. Extra typemaps had to be written in order to obtain a NULL pointer to pass to functions like this one. Now the default wrapping will detect 'null' and translate it into a NULL pointer. Also if a function returns a NULL pointer, eg: SomeClass *bar() { return NULL; } Then this used to be wrapped with a SomeClass proxy class holding a NULL pointer. Now null is returned instead. These changes are subtle but useful. The original behaviour can be obtained by using the original typemaps: %typemap(javaout) SWIGTYPE { return new $&javaclassname($jnicall, true); } %typemap(javaout) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] { return new $javaclassname($jnicall, $owner); } %typemap(javagetcptr) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] %{ protected static long getCPtr($javaclassname obj) { return obj.swigCPtr; } %} *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 11/12/2002: beazley Fixed problem with abstract methods and signatures. For example: class abstract_foo { public: virtual int meth(int meth_param) = 0; }; class abstract_bar : public abstract_foo { public: int meth(int meth_param_1, int meth_param_2) { return 0; } }; In this case, abstract_bar is still abstract. Fixes [ 628438 ] Derived abstract class not abstract. Reported and patched by Scott Michel. 11/11/2002: beazley Fixed a matching problem with typemaps and array dimensions. For example, if you had this: typedef char blah[20]; and a typemap: %typemap() char [ANY] { ... $1_dim0 ... } then $1_dim* variables weren't be expanded properly. It should work now. Problem reported by Pankaj Kumar Goel. 11/07/2002: mkoeppe Added an experimental new module that dumps SWIG's parse tree as (Common) Lisp s-expressions. The module is invoked with SWIG's -sexp command-line switch. The output can be read into Common Lisp. There is (prototype) example Lisp code that generates Foreign Function Interface definitions for use with Kevin Rosenberg's UFFI. *** EXPERIMENTAL NEW FEATURE *** 11/07/2002: mkoeppe Removed duplicate declaration of "cpp_template_decl" in parser.y; bison 1.75 complained. 11/06/2002: cheetah (William Fulton) [Java] Default primitive array handling has changed like arrays of classes. C primitive arrays are no longer wrapped by a Java array but with a pointer (type wrapper class). Again the changes have been made for efficiency reasons. The original typemaps have been moved into arrays_java.i, so the original behaviour can be obtained merely including this file: %include "arrays_java.i" The array support functions are no longer generated by default. They are only generated when including this file, thus this often unused code is only generated when specifically requiring this type of array support. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 11/05/2002: ljohnson (Lyle Johnson) [Ruby] Added support for nested module declarations (as was previously added for the Perl module). So a %module directive of the form: %module "Outer::Inner::Foo" will nest everything as (in Ruby code): module Outer module Inner module Foo # stuff goes here end end end 11/05/2002: mkoeppe [MzScheme] Add an argument (-declaremodule) that generates code to correctly declare a primitive module extension. Patch submitted by Bruce Butterfield. 11/02/2002: cheetah (William Fulton) [Java] Added patch submitted by Michael Cahill to remove unused parameter warnings for the jenv and cls parameters. This patch also also allows one to use "void" in the jni typemap for any type without code being generated attempting to return a value. 10/29/2002: cheetah (William Fulton) [Java] Array handling is different. Arrays of classes are no longer wrapped with proxy arrays, eg wrapping class X {...}; X foo[10]; used to be wrapped with these Java getters and setters: public static void setFoo(X[] value) {...} public static X[] getFoo() {...} This approach is very inefficient as the entire array is copied numerous times on each invocation of the getter or setter. These arrays are now wrapped with a pointer so it is only possible to access the first array element using a proxy class: public static void setFoo(X value) {...} public static X getFoo() {...} Arrays of enums have also been similarly changed. This behaviour is now like the other SWIG language's implementation and the array library should be used to access the other elements. The original behaviour can be achieved using the macros and typemaps in arrays_java.i, for example: %include "arrays_java.i" JAVA_ARRAYSOFCLASSES(X) class X {...}; X foo[10]; *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 10/29/2002: cheetah (William Fulton) [Java] Two new typemaps javain and javaout for generating the proxy class and type wrapper class method calls to the JNI class. The new typemaps are really used for transforming the jstype (used in proxy class and type wrapper classes) to the jtype (used in the JNI class) and visa versa. A javain typemap is required whenever an in typemap is written and similarly javaout for an out typemap. An example is probably best to show them working: %typemap(javain) Class "Class.getCPtr($javainput)" %typemap(javain) unsigned short "$javainput" %typemap(javaout) Class * { return new Class($jnicall, $owner); } %inline %{ class Class {}; Class * bar(Class cls, unsigned short ush) { return new Class(); }; %} The generated proxy code is then: public static Class bar(Class cls, int ush) { return new Class(exampleJNI.bar(Class.getCPtr(cls), ush), false); } Some new special variables have been introduced in order to use these typemaps. Here $javainput has been replaced by 'cls' and 'ush'. $jnicall has been replaced by the native method call, 'exampleJNI.bar(...)' and $owner has been replaced by 'false'. $javainput is analogous to the $input special variable. It is replaced by the parameter name. $jnicall is analogous to $action in %exception. It is replaced by the call to the native method in the JNI class. $owner is replaced by either true if %newobject has been used otherwise false. The java.swg file contains default javain and javout typemaps which will produce the same code as previously. This change is only of concern to those who have written their own typemaps as you will then most likely have to write your own javain and javaout typemaps. The javaout typemap also makes it possible to use a Java downcast to be used on abstract proxy base classes. See the Java documentation on dynamic_cast. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 10/24/2002: ttn [Methodology] Upgaded to libtool 1.4.3, presumably w/ better support for newish platforms (like MacOS X). 10/21/2002: ttn Fixed Runtime/Makefile.in bug -- thanks to Richard Calmbach. 10/18/2002: ttn Fixed typo in doh.h -- thanks to Max Horn. Version 1.3.16 (October 14, 2002) ================================= 10/13/2002: beazley Fixed bug with %extend directive and %feature reported by William Fulton. 10/13/2002: beazley Added OpenVMS build directory (vms). Contributed by Jean-François Pieronne. 10/09/2002: cheetah (William Fulton) [Java] Added throws clause to the native functions in the JNI class. The throws clause is the same as the one generated for proxy functions and module class functions. 09/27/2002: beazley Fixed some problems with the %import directive and classes that were defined but not wrapped. Problem reported by Leslie Brooks, Gerry Woods, and others. 09/23/2002: cheetah (William Fulton) [Java] Some error checking added: 1) OutOfMemoryException check in the char * typemaps. 2) As SWIG treats pointers, references and passing by value all the same, it is possible to pass a NULL pointer to a function that expects an object passed by value or by reference. A NullPointerException is now thrown under this scenario. 09/20/2002: ttn [Methodology] Reworked "make clean" and "make install" to be more table driven. [Docs] Explain how to extend "make install" w/ extra-install.list. 09/15/2002: beazley Deprecation of the "ignore" typemap. The "ignore" typemap has been deprecated in favor of a generalization of the "in" typemap. To ignore an argument, use something like this instead: %typemap(in,numinputs=0) int *output (int temp) { $1 = &temp; } This change fixes a number of subtle bugs related to the interaction of the "in" and "ignore" typemaps (which were supposed to be mutually exclusive). The use of the numinputs argument is reserved for future expansion. Currently, values >1 will generate an error. However, future releases of SWIG may utilize that to support multi-input typemaps. %typemap(ignore) still works, but generates a warning message and is translated to %typemap(in,numinputs=0). *** POTENTIAL INCOMPATIBILITY *** *** NEW FEATURE *** 09/15/2002: beazley Fixed segmentation fault for unnamed structures. For example: typedef struct { } *blah; Reported by Roger Gibson. Note: we might be able to generate wrappers in special cases. 09/13/2002: beazley Minor modification to generated wrapper functions. Pointer arguments are now always set to an initial value of 0. Simplifies typemap writing and cleanup code (since you can rely on zero-value initialization). This also greatly reduces the need to ever write an "arginit" typemap. 09/12/2002: beazley Minor enhancement to smart-pointer support. If operator->() is part of an ignored base class like this, %ignore Bar; class Foo { public: int blah(); }; class Bar { /* Ignored */ public: ... Foo *operator->(); ... }; class Spam : public Bar { }; then methods from Foo are still available. For example, >>> s = Spam() >>> s.blah() 0 >>> The only catch is that the operator->() itself is not available (since it wasn't wrapped). Therefore, there won't be any __deref__() operation unless it is explicitly added to Spam (either using %extend or just placing operator->() in the definition of Spam). 09/11/2002: ttn [Methodology] Reworked "make check" to be more table driven. [Docs] Docuemented methodology in Manual/Extending.html. 09/11/2002: ttn [Docs] Prefixed Manual/*.html with "" to pander dotingly to (over-)sensitive editors. 09/10/2002: ttn [Guile] Converted Examples/guile/simple "make check" behavior to actually check execution results. Reduced iteration counts so that the test doesn't take too long. 09/10/2002: beazley SWIG-1.3.15 released. Version 1.3.15 (September 9, 2002) ================================== 09/09/2002: beazley Fixed nasty runtime type checking bug with subtypes and inheritance and templates. 09/09/2002: cheetah (William Fulton) [Java] Java exception classes for a method's throws clause can be generated by specifying them in a comma separated list in the throws attribute in any one of the following typemaps: in, out, check, freearg, argout and throws. A classic example would be to convert C++ exceptions into a standard Java exception: %typemap(throws, throws="java.io.IOException") file_exception { jclass excep = jenv->FindClass("java/io/IOException"); if (excep) jenv->ThrowNew(excep, $1.what()); return $null; // or use SWIG_fail } class file_exception {...}; void open(const char *filename) throw(file_exception); The Java method will then be declared with a throws clause: public static void open(String filename) throws java.io.IOException {...} 09/08/2002: mkoeppe * [Guile] Improved the documentation system. The arglist no longer gets cluttered with type specification, making it more readable. (Also the ILISP function C-u M-x `arglist-lisp' RET works better this way.) The types of arguments are explained in an extra sentence after the arglist. There are now two documentation-related typemap arguments: %typemap(in, doc="$NAME is a vector of integers", arglist="$name") int *VECTOR { ... } The "arglist" texts of all arguments of a function make up its arglist in the documentation. The "doc" texts of all arguments are collected to make a sentence that describes the types of the arguments. Reasonable defaults are provided. As usual, $name is substituted by the name of the argument. The new typemap variable $NAME is like $name, but marked-up as a variable. This means that it is upper-cased; in TeXinfo mode ("-procdocformat texinfo") it comes out as @var{name}. The directives %values_as_list, %values_as_vector, %multiple_values now also have an effect on the documentation. (This is achieved via the new pragmas return_nothing_doc, return_one_doc, return_multi_doc.) Documentation has also improved for variables that are wrapped as procedures-with-setters (command-line switch "-emit-setters"). * [Guile] Emit constants as _immutable_ variables. (This was broken recently.) 09/07/2002: mkoeppe [Guile] Updated the typemaps in list-vector.i. 09/07/2002: mkoeppe Short-circuit the typechecks for overloaded functions. (The changes in code generation are visible in the new testcase "overload_complicated".) 09/06/2002: cheetah (William Fulton) [Java] Solution for [ 596413 ] New typemap so that the Java proxy classes and type wrapper classes wrapper constructor modifier can be tailored by users. The default value is protected. Normally SWIG generates a constructor like this which can only be accessed within one package: protected Bar(long cPtr, boolean cMemoryOwn) { ... } If you are using SWIG across multiple packages or want to use this constructor anyway, it can now be accessed outside the package. To modify use for example: %typemap(javaptrconstructormodifiers) SWIGTYPE "public" to change to public for all proxy classes and similarly for all type wrapper classes: %typemap(javaptrconstructormodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] "public" 09/06/2002: cheetah (William Fulton) [Java] Added throws typemaps for the Java module. C++ exceptions get converted into java.lang.RuntimeException Java exceptions. Warning: This may change from java.lang.Runtime exception in the future. 09/05/2002: cheetah (William Fulton) [Java] Fix for variables declared as references. 09/05/2002: beazley Fixed [ 605162 ] Typemap local variables. Reported by Lyle Johnson. 09/05/2002: ljohnson (Lyle Johnson) [Ruby] More updates to the Ruby module documentation, including a new typemap example that demonstrates how to collect key-value pairs from an argument list into a Hash. 09/05/2002: beazley Fixed bug with template expansion and constructors. template class Foo { public: Foo() { } }; The extra in the constructor was carried through in the name--causing runtime problems in generated modules. Reported by Jordi Arnabat Benedicto. 09/05/2002: mkoeppe [Guile] Support overloading. 09/04/2002: ljohnson (Lyle Johnson) [Ruby] Updated typemaps for long long and unsigned long long types to use Ruby 1.7 support for these types when available. 09/04/2002: ljohnson (Lyle Johnson) [Ruby] Added output typemaps for const reference to primitive types. 09/04/2002: mkoeppe [Guile] Fix pass-by-value typemaps. Reported by Arno Peters via Debian bugtracking (#156902), patch by Torsten Landschoff . 09/03/2002: samjam (Sam Liddicott) Better reference support. Functions that want a void** can take a NULL by reference and the void* will be made for you and then passed-by-reference Also all integer-class native types can be passed by reference where an int* or int& etc is needed 09/03/2002: beazley Changed the evaluation order of preprocessor macro arguments. Arguments are now expanded by the preprocessor *before* they are passed to macro expansion. This fixes a subtle expansion bug reported by Anthony Heading. 09/03/2002: beazley Fixed the file include order (again, apparently). See 2/27/99. 09/02/2002: beazley [Perl] Better exception handling support. Since Perl error handling relies on setjmp/longjmp, wrapper functions have been modified slightly to provide an extra block scope: XS(foo) { char _swigmsg[SWIG_MAX_ERRMSG] = ""; const char *_swigerr = _swigmsg; { /* Normal wrapper function here */ ... SWIG_croak("An error occurred\n"); ... XSRETURN(argvi); /* Successful return */ fail: /* cleanup code */ } croak(_swig_err); } The macro SWIG_croak(x) sets the value of _swigerr to x and executes a "goto fail". The whole wrapper function is enclosed block scope to provide proper cleanup of C++ objects. Since croak executes a longjmp(), there is no way to properly reclaim resources if this executes in the same scope as the wrapper function. The _swigmsg[] variable is normally unused, but can be used to store small error messages using sprintf or snprintf. It has a capacity of at least 256 bytes (SWIG_MAX_ERRMSG). 09/02/2002: beazley [Tcl] Added better support for exceptions. Instead of returning TCL_ERROR, use the macro SWIG_fail to return with an error. This ensures that arguments are properly cleaned up. Exception specifiers are now handled by default. 09/02/2002: ljohnson (Lyle Johnson) [Ruby] The type-checking system for the Ruby module has had a flaw in that some types which should be considered equivalent weren't. This bug was best demonstrated by the inherit_missing.i test suite case, which defines a base class "Foo" that is subclassed by "Bar". The "Foo" class isn't actually wrapped (i.e. it's not directly accessible from Ruby) but we'd still like to be able to pass "Bar" instances to functions expecting Foos and have that work; it wasn't. The revised implementation (similar to that used for some other language modules) adds a new instance variable (__swigtype__) to each object that indicates its SWIG type; that is, each "Bar" instance will now have a string instance variable called "__swigtype__" whose value is "_p_Bar". Unless developers were taking advantage of this low-level implementation detail, they shouldn't notice any compatibility problems; nevertheless, I'm marking it as a "potential incompatibility". *** POTENTIAL INCOMPATIBILITY *** 09/01/2002: ljohnson (Lyle Johnson) [Ruby] Fixed SF Bug #603199. 08/08/2002: cheetah (William Fulton) [Java] Added OUTPUT, INPUT and INOUT typemaps in typemaps.i for C++ references. 08/27/2002: mkoeppe [Guile] Fixed error in "lib_std_vector" testcase and compiler warning in "lib_cdata" testcase. 08/27/2002: ljohnson (Lyle Johnson) [Ruby] Added the "%mixin" directive, which allows the user to specify a comma-separated list of module names to mix-in to a class. So, for example, if you'd like to specify that Ruby's Enumerable module should be mixed-in to your class Foo, you'd write: %mixin Foo "Enumerable"; or to specify that the modules Fee, Fie and Fo should be mixed in to Foo: %mixin Foo "Fee,Fie,Fo"; *** NEW FEATURE *** 08/27/2002: ljohnson (Lyle Johnson) [Ruby] Modified the %alias directive so that multiple aliases can be specified for an instance method by using a comma-separated list of aliases. 08/27/2002: ljohnson (Lyle Johnson) [Ruby] Added "throw" typemaps for the Ruby module. 08/26/2002: beazley Two new command line options for printing dependencies. 'swig -M' lists all file dependencies. 'swig -MM' lists dependencies, but excludes files in the SWIG library. Example: % swig -M -python example.i example_wrap.cxx: \ /u0/beazley/Projects/lib/swig1.3/swig.swg \ /u0/beazley/Projects/lib/swig1.3/python/python.swg \ example.i \ example.h % swig -MM -python example.i example_wrap.cxx: \ example.i \ example.h *** NEW FEATURE *** 08/26/2002: beazley Fixed [ 597599 ] union in class: incorrect scope. Reported by Art Yerkes. 08/26/2002: beazley Fixed [ 600132 ] Default argument with namespace. Reported by Shibukawa Yoshiki. 08/24/2002: beazley Automatic C++ exception handling enabled for all language modules. This is pretty simple. If you have a class like this: class Foo { }; class Bar { public: void blah() throw(Foo); } then the generated wrapper code looks like this: wrap_Bar_blah() { ... try { arg1->blah(); } catch (Foo &_e) { /* "throw" typemap code inserted. $1 = _e */ } catch (...) { throw; } } The "throw" typemap can be used to raise an error in the target language. It can do anything. Here is a very simple example: %typemap("throw") Foo { PyErr_SetString(PyExc_RuntimeError, "Foo exception"); return NULL; } To make this work in each language module, simply define a few default "throw" typemaps for SWIGTYPE, SWIGTYPE *, int, const char *, and a few common exception types. That's all there is to it. Automatic exception handling can be disabled using -noexcept or setting the NoExcept global variable to 1. *** NEW FEATURE *** 08/23/2002: beazley [ Python ] Automatic translation of C++ exception specifications into error handling code. For example: class Foo { }; class Bar { public: void blah() throw(Foo); } In this case, Foo is wrapped as a classic-style class (compatible with exception handling). Furthermore, you can write Python code like this: b = Bar() try: b.blah(); except Foo,e: # Note use of exception class here! # Handle Foo error ... The object "e" in the exception handler is just a wrapped Foo object. Access it like a normal object. If an exception is not wrapped as a class, a RuntimeError exception is raised. The argument to this exception is the exception object. For example: class Bar { public: void blah() throw(int); } b = Bar() try: b.blah(); except RuntimeError,e: print e.args[0] # Integer exception value Comments: - If a class is used as an exception, it *must* be wrapped as a Python classic-style class (new classes don't work). - Automatic exception handling is compatible with %exception. - Use -noexcept to turn off this feature. - The newly introduced "throw" typemap is used to raise Python errors (naturally). *** EXPERIMENTAL NEW FEATURE *** 08/23/2002: beazley Information from throw() specifiers is now stored in the parse tree. For example: class Foo { public: int blah() throw(spam,bar); } The stored information is fully corrected for namespaces and works with templates. Uses will follow. 08/22/2002: beazley Exception handling code is no longer applied to member access function. For example, in this code %exception { try { $action } catch(whatever) { ... } } class Foo { public: int x; ... } The exception handling code is not applied to accessor functions for Foo::x. This should reduce the amount of extra code generated. Caveat: Exception handling code *is* used when attributes are accessed through a smart-pointer or a synthesized attributed added with %extend is used. 08/22/2002: beazley Made more patches to hopefully eliminate problems when compiling SWIG as a 64-bit executable. 08/22/2002: beazley Fixed a bug with const reference members, variables, and static members. For example: class Foo { public: static const int &ref; }; SWIG was trying to generate "set" functions which wouldn't compile. 08/21/2002: beazley Made the warning message for "Class X might abstract" off by default. Enable with -Wall. 08/21/2002: beazley Refined handling of const and non-const overloaded methods. If a class defines a method like this: class Foo { public: int bar(int); int bar(int) const; } Then the non-const method is *always* selected in overloading and the const method silently discarded. If running with -Wall, a warning message will be generated. 08/19/2002: beazley Better support for using declarations and inheritance. Consider this: class Foo { public: int blah(int x); }; class Bar { public: double blah(double x); }; class FooBar : public Foo, public Bar { public: char *blah(char *x); using Foo::blah; using Bar::blah; }; Now SWIG wraps FooBar::blah as an overloaded method that uses all accessible versions of blah(). See section 15.2.2 in Stroustrup, 3rd Ed. SWIG also supports access change through using declarations. For example: class Foo { protected: int x; int blah(int x); }; class Bar : public Foo { public: using Foo::x; using Foo::blah; }; Caveat: SWIG does not actually check to see if declarations imported via 'using' are in the inheritance hierarchy. If this occurs, the wrapper code won't compile anyways---not sure it's worth worrying about. 08/18/2002: beazley Modified overloading dispatch to not include nodes with an "error" attribute. A language module can set this if a node couldn't be wrapped and you don't want it included in the dispatch function. 08/18/2002: beazley Enhancement to overloaded function dispatch. The dispatcher is now aware of inheritance relationships. For example: class Foo { }; class Bar : public Foo { }; void spam(Foo *f); void spam(Bar *b); In this case, the dispatcher re-orders the functions so that spam(Bar *b) is checked first---it is more specific than spam(Foo *f). 08/17/2002: beazley Added -Werror command line option. If supplied, warning messages are treated as errors and SWIG will return a non-zero exit code. 08/17/2002: beazley Fixed [ 596135 ] Typedef of reference can't compile. For example: typedef int &IntRef; void foo(IntRef i); SWIG-1.3.14 generated code that wouldn't compile. Version 1.3.14 (August 12, 2002) ================================ 08/11/2002: mmatus Static const members initialized during declaration, and only them, ie: struct A { static const int a = 1 ; // this one static const int b; // not this one }; are emitted like constants (equivalent to enums or explicit %constant). This is because they cannot be added directly to 'cvar' since they lack the needed reference (well, you can force them to have a real reference, but in an ugly way which goes completely again the original purpose of initialize them during declaration, you also have to deal with extra linking matters, and it take a while to figure out what is the problem and how to solve it). Please test it with your preferred target language, and not only the code generation, but really run the example in the test-suite (static-const-member-2.i) because the problem and the solution cannot be "fully" appreciated until you try to load the module and run it. In some target languages (python specially), this can produces a difference in the way that the static constant members 'a' and 'b' are internally wrapped. Hopefully, they still can be accessed in the same way. 08/11/2002: mmatus [python] Now static const members can be accessed in a more natural way, ie, if you have struct A { typedef unsigned int viewflags; static const viewflags forward_field = 0; static const viewflags backward_field; }; now you can do: print A.backward_field and also a = A() print a.forward_field Note that if the static const members don't have an initializer (like backward_field), still you can access them in the same way in the python side, but the implementation is a quite different: backward_field will still appear in the cvar entity, and also, you are responsible to initialize it in some code unit, and link it properly. forward_field, by the other hand, will not appear in the cvar entity but only as a A member, similar to what happen with enum or %constant members. 08/11/2002: mmatus [python] Common code in the __setattr__/__getattr__ now goes to two "free" methods at the beginning of the proxy file, from where each class use it. This change reduces the size of the proxy file, specially if you wrap a lot of small classes in one module (up to 33% in some cases), making it faster to load too. 08/09/2002: beazley [Perl5] If a function that returns char * returns NULL, undef is returned to the Perl interpreter. 08/09/2002: beazley Fix to conversion operators and namespaces. For example: namespace ns { struct Foo { }; struct Bar { operator Foo*(); }; } In the wrapper code, SWIG was using ->operator Foo*() when it should have been using ->operator ns::Foo*(). Note: if using %rename with a conversion operator, you might have to do this: %rename(toFooPtr) ns::operator ns::Foo*(); // ^^^^ note extra qualifier namespace ns { ... 08/09/2002: beazley [Python] Minor enhancement to 'const' variable declarations. Normally const declarations are wrapped as read-only variables accessible only through the cvar attribute (see SWIG.html for a discussion of why). However, in many programs, "const" declarations may just be constants---making the cvar. access awkward. To fix this, "const" declarations are now available both through cvar. and as a simple name. For example: const int FOO = 42; In Python: >>> print example.cvar.FOO 42 >>> print example.FOO 42 Note: There are cases where the value of a "const" variable might change. For example: char *const BAR = "Hello World"; In this case, the pointer itself can not change, but the data being pointed to could be modified. In these situations, cvar.BAR should be accessed to obtained the current value. 08/08/2002: beazley [Python] Fixed generation of the proxy code (.py files) to more closely follow the order of declarations as they appear in the .i file. In the past, all of the class wrappers appeared first, followed by function stubs, inserted Python code, and other details. 08/08/2002: cheetah (William Fulton) [Java] Proxy method _delete() changed to delete(). There shouldn't ever be a wrapped function called delete() as it is a C++ keyword and there is no such thing as a member function in C. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** Backwards compatibility can be achieved by adding the function back in for all proxy classes: %typemap(javacode) SWIGTYPE %{ public void _delete() { delete(); } %} Java backwards compatibility summary ------------------------------------ There are a number of changes that have been made in improving the Java module for ver 1.3.14. If at all possible change your code to take advantages of the improvements. If you were using proxy classes you may not notice any backwards compatibility issues. Here is an example which will help with most backwards compatibility problems where it is not possible to modify the code that uses the generated output: Replace: %module modulename With: %module (jniclassname="modulename") modulename; %typemap(javacode) SWIGTYPE %{ public long getCPtr$javaclassname() { return swigCPtr; } public void _delete() { delete(); } %} %pragma(java) jniclassclassmodifiers="public"; The proxy constructors that took parameters (long cPtr, boolean cMemoryOwn) were public and are now protected. If you were making use of these then you'll have to modify your code and the best solution would be to use the new type wrapper classes. The other main areas are the pragmas and global variable wrapping. Replace the pragmas with one of the new directives or typemaps mentioned below and use %rename on the variables. If you were not using proxy classes, you will have to define a jstype typemap as well as a jtype typemap. 08/08/2002: cheetah (William Fulton) [Java] Fix for wrapping two dimension array variables. 08/07/2002: beazley [Python,Tcl] Object management now has a much better sense of ownership. Ownership bits is changed whenever an object is stored in a global variable or structure member. For example: struct Foo { int val; Foo *next; }; Now in Python >>> f = Foo() >>> f.thisown 1 >>> g = Foo() >>> g.next = f # Assign a pointer >>> f.thisown # Notice ownership change 0 >>> This scheme is mostly a conservative heuristic designed to provide segmentation faults. It could cause a memory leak if ownership is changed unnecessarily. In this case, you can either write a typemap (that doesn't change ownership), or manually set the thisown attribute back to 1. 08/07/2002: beazley [Tcl] Major usability improvements to the object interface. Suppose you had code like this: struct Foo { int x; int spam(); }; void blah(Foo *f); In past versions of SWIG, you could create objects and use them like this: % Foo f % f configure -x 3 % f spam 37 The only problem is that if you tried to call blah(), it didn't work: % blah f Type Error. Expected _p_Foo % Instead, you had to do this: % blah [f cget -this] SWIG now automatically extracts the -this pointer, avoiding this problem. This means that saying "blah f" is perfectly legal and everything will still work normally. Caveat: Since pointer strings start with a leading underscore (_), don't use this in object names. For example: % Foo _f % blah _f # Potential crash Objects now have a -thisown attribute that shows the ownership. This builds upon the CHANGES 11/24/2001 entry. 08/07/2002: samjam, Sam Liddicott Properly implemented pointer system using php resources. Still need to work out whether or not to let script-users call destructors directly 08/06/2002: beazley Upgraded mzscheme module to support version 201 and added overloading support. 08/05/2002: beazley Added parsing support for extra grouping (in very limited cases). For example: typedef int (FuncPtr)(int, double); *** EXPERIMENTAL *** 08/03/2002: ljohnson (Lyle Johnson) [Ruby] Updates to typemaps.i as those done previously for Perl, Python and Tcl modules. Now supports reference types with INPUT, OUTPUT and INOUT typemaps. 08/02/2002: beazley New library file cstring.i added. Provides macros for manipulating char * data. 08/02/2002: beazley Deprecated the %new directive. Use %newobject instead. For example: %newobject foo; ... char *foo(); %newobject follows the same rules as %rename, %ignore, %feature, etc. *** POTENTIAL INCOMPATIBILITY *** 08/01/2002: cheetah (William Fulton) [Java] New attribute 'jniclassname' for the module directive allows a way of changing the JNI class name from the default which uses the modulename with JNI appended after it. %module (jniclassname="name") modulename If 'name' is the same as 'modulename' then the module class name gets changed from 'modulename' to modulenameModule. 08/01/2002: beazley Fixed problem with file include order. Language specific directories should take precedence over generic directories. For example: "swig_lib/python/foo.i" should be loaded before "swig_lib/foo.i". I thought this was the case already, but apparently it has been broken for quite some time. 08/01/2002: beazley Added std_deque.i library file. Work in progress. 08/01/2002: beazley [Python,Tcl,Perl] Improvements to typemaps.i. INPUT/INOUT typemaps perform better error checking. Typemaps are now supplied for references like int &OUTPUT, double &INOUT, etc. 08/01/2002: beazley [Python] Deprecated the T_* and L_* typemaps in typemaps.i. Multiple return values are always placed in a tuple. Deprecated the BOTH typemaps. This is now INOUT (e.g., int *INOUT). *** POTENTIAL INCOMPATIBILITY FOR PYTHON MODULE *** 08/01/2002: beazley Deprecated the array.i, carray.i, and timer.i library files. 08/01/2002: beazley Deprecated the pointer.i library file. Use cpointer.i instead. *** POTENTIAL INCOMPATIBILITY *** 08/01/2002: cheetah (William Fulton) [Java] For consistency the global variable getters and setters use the JavaBean property design pattern like member variables always have. This means if you are wrapping a variable called foo, the getter is called getFoo() and the setter is called setFoo(). Before the recent changes to the Java module the getters and setters were called get_foo() and set_foo(). If you really want the original function names use the %rename directive like this: %rename(_foo) Foo; 07/31/2002: beazley Fixed casting problem with multiple inheritance. If you had this, class foo {}; class bar : public foo {}; class baz : public foo {}; class spam : public bar, public baz {}; then the wrappers wouldn't compile due to an ambiguous cast. Reported by Art Yerkes. 07/30/2002: cheetah (William Fulton) [Java] Due to new static typechecking all pointers held in a Java long are part of the internal workings and this pointer value in the Java long has become abstracted data. The type wrapper constructor and getCPtr() methods are as such protected. If you need to mess around with pointers from Java or for example create a proxy class or type wrapper class around a null pointer, add a function/constructor to do so with the %javacode typemap. You can also make getCPtr() public again with the %javagetcptr typemap. 07/30/2002: cheetah (William Fulton) [Java] Fixes for %typemap(ignore). In particular when ignoring the last parameter in a function. Also for all parameters in constructors. These mods have also fixed multi-argument typemaps for proxy classes - SF 581791. 07/30/2002: cheetah (William Fulton) [Java] %newobject (replacement for %new) now implemented for Java. 07/29/2002: beazley Fixed problem with typemap copies, %apply, and %clear inside C++ namespaces. 07/28/2002: cheetah (William Fulton) [Java] The JNI class now has package access as the class modifier has been changed from "public" to nothing. This has been done as this class is now more for the internal workings of SWIG since the module class has static type checking for all types. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** Backwards compatibility can be achieved by using the %jniclassclassmodifier pragma to change it back to "public". 07/28/2002: cheetah (William Fulton) [Java] Proxy/Shadow classes are generated by default. The -proxy and -shadow command line options are deprecated. If you want to use the low-level functional interface then use the new -noproxy commandline option. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 07/28/2002: cheetah (William Fulton) [Java] Remaining pragmas shakeup. These were the remaining pragmas and their new names where changed: modulebase modulecode moduleclassmodifiers moduleimport => moduleimports moduleinterface => moduleinterfaces The moduleimports works slightly differently to how the moduleimport pragma worked. Now it actually takes code which gets placed before the class definition so the whole import statement has to be given, for example: %pragma(java) moduleimports=%{ import java.io.*; import java.math.*; %} The moduleinterfaces is slightly different to the old moduleinterface in that if more than one interface is required they must be comma separated in one use of the pragma, for example: %pragma(java) moduleinterfaces="Serializable, MyInterface" These last two pragmas are consistent with the javainterfaces and javaimports typemap. A similar set of pragmas has been introduced, namely: jniclassbase jniclasscode jniclassclassmodifiers jniclassimport jniclassinterface These work in the same way as their module counterparts. Note that previously the moduleXXX pragmas worked on the old module class which is now called the JNI class (the class with the native functions). The jniclassXXX pragmas now work on the new module class (the class that has all the global functions and global variable getters and setters when using proxy classes, plus all other remaining functions when using the low-level procedural interface). In summary the contents of the pragmas make up a class like this: class modulename extends implements { ... SWIG generated functions ... } } *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 07/28/2002: cheetah (William Fulton) [Java] Deprecated modulemethodmodifiers pragma and replaced with a better %feature based directive called %javamethodmodifiers. A useful example would be for synchronisation in multi-threaded apps: %javamethodmodifiers foo(int a) "public synchronized"; Changes this function from the default ("public") to "public synchronized". *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 07/26/2002: beazley Several directives now allow optional configuration parameters. These include: %module(name="value", name="value", ...) modulename %import(name="value", ...) "filename.i" %extend(name="value", ...) classname { ... } These currently have no effect and are reserved for future expansion. 07/26/2002: beazley Enhancements to smart-pointer handling. SWIG only provides extra support for a smart-pointer if operator->() returns a proper pointer. For example: Foo *operator->(); If operator->() returns an object by value or reference, then SWIG examines the returned object to see if it also implements operator->(). If so, SWIG chases operator->() until it can find one that returns a pointer. This allows cases like this to work: class Foo { public: void blah(); }; class Bar { ... Foo *operator->(); ... }; class Spam { ... Bar operator->(); ... }; For example: >>> s = Spam() >>> s.blah() # Invokes Foo::blah() The s.blah() call actually invokes: ((s.operator->()).operator->())->blah(); 07/26/2002: beazley Fixed a bug with typedef and references. For example: typedef Foo & FooRef; FooRef blah(); Previous versions of SWIG generated code that wouldn't compile. 07/25/2002: beazley Wrapping of static methods has been improved in proxy classes. In older versions of SWIG, if you had this: class Foo { public: static void bar(); }; The static method was only available as a function Foo_bar(). For example: >>> Foo_bar() Now, the static method can also be invoked through an instance like this: >>> f = Foo() >>> f.bar() # Invokes static method This works with all versions of Python. Additionally, for Python-2.2, the static method can be invoked as: >>> Foo.bar() The old-style function is still support for backwards compatibility. If you care about making your code across different versions of Python, either use Foo_bar() or access the method through an instance. 07/25/2002: beazley Changes to the Python module. Proxy classes now utilize new Python-2.2 features including properties and static methods. However, these features are supported in a way that provides backwards compatibility with older Python versions. In other words, proxy classes work with all versions of Python and only use new features when running on Python-2.2. 07/25/2002: beazley Modified %extend so that overloaded methods can be added. For example: %extend Foo { void bar(int x) { }; void bar(char *s) { }; ... } This works with both C++ *and* C. 07/24/2002: cheetah (William Fulton) [Java] More new typemaps so that the Java proxy classes and type wrapper classes can be further tailored by users. These are the default code for generating the finalize() methods (proxy classes only) and the getCPtr() methods for proxy classes and type wrapper classes: %typemap(javafinalize) SWIGTYPE %{ protected void finalize() { _delete(); } %} %typemap(javagetcptr) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] %{ public static long getCPtr($javaclassname obj) { return obj.swigCPtr; } %} The javagetcptr typemap will enable users to handle Java null by overriding this typemap - a requested feature. The -nofinalize commandline option has been deprecated. The javafinalize typemap is more powerful as it will allow the removal of the finalize methods for all or any one or more particular proxy class. 07/23/2002: cheetah (William Fulton) [Java] The getCPtrXXX() function has been changed to a static function and is now of the form: protected static long getCPtr(XXX obj) {...} This is a requested change which will allow Java null pointers to be used as null can be passed in for obj. However, to achieve this the appropriate code must be written using the new javagetcptr typemap directive. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** Backwards compatibility can be achieved by adding this function back in using the new javacode typemap: %typemap(javacode) SWIGTYPE %{ // SWIG-1.3.12 and SWIG-1.3.13 public long getCPtr$javaclassname() { return swigCPtr; } // SWIG-1.3.11 and earlier public long getCPtr() { return swigCPtr; } %} 07/23/2002: cheetah (William Fulton) [Java] New directive to control constant code generation - %javaconst. The default handling for handling constants is to get the value through a JNI call, eg #define YELLOW 5 #define BIG 1234LL results in: public final static int YELLOW = modulename.get_YELLOW(); public final static long BIG = modulename.get_BIG(); Earlier versions of the Java module initialised the value using the C value: public final static int YELLOW = 5; public final static long BIG = 1234LL; This works in most cases, but the value for BIG won't compile as 1234LL is not valid Java code and this is one of the reasons why the default is now to get the values through a JNI call. The side effect is that these 'constants' cannot be used in switch statements. The %javaconst directive allows one to specify the way the constant value is initialised and works like other %feature directives, eg %javaconst(0); // all constants from this point on are initialised using the C value %javaconst(1) BIG; // just BIG initialised using JNI call (must be parsed before BIG is defined) 07/23/2002: beazley *** IMPORTANT CHANGES TO THE PYTHON MODULE *** (1) The Python module now enables shadow/proxy classes by default. This means that two files are always created by SWIG. For instance, if you have this: // file: foo.i %module foo ... Then swig generates two files "foo_wrap.c" and "foo.py". (2) The name of the low-level C extension module has been changed to start with a leading underscore. This means that you have to compile the module as follows: $ cc -c -I/usr/local/include/python2.2 foo_wrap.c $ cc -shared foo_wrap.o $(OBJS) -o _foo.so ^^^^ note extra underscore This naming scheme is consistent with other Python modules that utilize extension code. For instance, the socket module consists of "_socket.so" and "socket.py". In previous versions of SWIG, the shared object file was named "foocmodule.so". (3) A new directive can be used to insert Python code into the corresponding .py file. For example: %pythoncode %{ def foo(): print "Hello World" %} This directive allows you to create modules as a mix of C and Python. Python code is seamlessly added to the module. (4) The -shadow command line option is deprecated. This is turned on by default. (5) To disable the generation of the extra python file, use the "-noproxy" command line option. *** POTENTIAL INCOMPATIBILITY *** This change will likely break the build environment of projects that utilize shadow classes. To fix this, you probably only need to change the name of the target .so file. For example, if you have Makefile information like this: TARGET = examplecmodule.so Just change it to: TARGET = _example.so *** DOCUMENTATION UPDATE *** The file Doc/Manual/Python.html has been updated to describe these changes. 07/23/2002: beazley Added -noextern option. If supplied, SWIG will not generate extra extern declarations. This is sometimes an issue on non-unix platforms. 07/23/2002: beazley Added a warning for ignored friend functions. 07/23/2002: beazley Fixed [ 574498 ] -proxy and %include "pointer.i" clash. Reported by David Creasy. 07/23/2002: beazley Fixed [ 576103 ] global destruction warning with shadow. Perl extensions should no longer report the warning "Use of uninitialized value during global destruction." when running with "perl -w". Reported by Brett Williams. 07/23/2002: beazley In C++ mode, SWIG now always defines namespace std. By default, it's empty. However, this will silence errors from programs that include statements such as "using namespace std;". This fixes Bug [ 584017 ] using namespace std generates error. Reported by Joseph Winston. 07/22/2002: beazley Added a new warning message for %apply. If you use %apply but no typemaps are defined, you will get a warning message. This should help with problems like this: %apply char *OUTPUT { ... }; In old versions of SWIG, this silently did nothing. Now you get an error like this: file:line. Warning. Can't apply (char *OUTPUT). No typemaps are defined. 07/22/2002: cheetah (William Fulton) [Java] Started Java pragma deprecation. Replacements use %typemap based directives and enable proxy classes and the new type wrapper classes to be tailored in various ways. These are the new typemaps: %typemap(javabase) - base (extends) for Java class %typemap(javaclassmodifiers) - class modifiers for the Java class: default is "public" %typemap(javacode) - java code is copied verbatim to the Java class %typemap(javaimports) - import statements for Java class %typemap(javainterfaces) - interfaces (extends) for Java class And these are the %pragma directives being deprecated: allshadowbase allshadowclassmodifiers allshadowcode allshadowimport allshadowinterface shadowbase shadowclassmodifiers shadowcode shadowimport shadowinterface Note that it is possible to target a particular proxy class: %typemap(javaimports) Foo "import java.util.*"; or a particular type wrapper class: %typemap(javaimports) double* "import java.math.*"; Note that $javaclassname in these typemaps are substituted with either the proxy classname when using proxy classes or the SWIGTYPE class name. 07/18/2002: cheetah (William Fulton) [Java] Java module overhaul to implement static type checking of all types. 1) Changes when using Java Proxy classes ---------------------------------------- Previously when wrapping global functions: class SomeClass{}; void foo(SomeClass* s); SomeClass* bar(); The native method prototypes used a long for pointers and looked like this: public class modulename { ... public final static native void foo(long jarg1); public final static native long bar(); } and unlike member functions of a C++ class there was no wrapper around the native calls to make the use of them more user friendly. They would be used from Java like this: SomeClass s = new SomeClass(modulename.bar(), false); modulename.foo(s.getCPtrSomeClass()); Note that the following will have the same effect, but then it would not have been possible to call any proxy member functions in SomeClass: long s = modulename.bar(); modulename.foo(s); Now wrapper functions are generated: public class modulename { public static void foo(SomeClass s) { // calls the native function } public static SomeClass bar() { // calls the native function } } Which means these functions can now be used more naturally with proxy classes: SomeClass s = modulename.bar(); modulename.foo(s); 2) Changes when not using Java Proxy classes -------------------------------------------- The so called low-level interface was rather low-level indeed. The new static type checking implementation makes it less so but it remains a functional interface to the C/C++ world. Proxy classes are the obvious way to use SWIG generated code, but for those who want a functional interface all non-primitive types now have a simple Java class wrapper around the C/C++ type. Pointers and references to primitive types are also wrapped by type wrapper classes. The type wrapper classnames are based on the SWIG descriptors used by the other language modules. For example: C/C++ type Java type wrapper class name ---------- ---------------------------- int* SWIGTYPE_p_int double** SWIGTYPE_p_p_double SomeClass* SWIGTYPE_p_SomeClass SomeClass& SWIGTYPE_p_SomeClass SomeClass SWIGTYPE_p_SomeClass Note that everything wrapped by SWIG is accessed via a pointer even when wrapping functions that pass by value or reference. So the previous example would now be used like this: SWIGTYPE_p_SomeClass s = example.bar(); example.foo(s); Note that typedefs that SWIG knows about are resolved, so that if one has class Foo{}; typedef Foo Bar; then any use of Bar will require one to use SWIGTYPE_p_Foo; Some considerations: Make sure you make a firm decision to use either proxy classes or the functional interface early on as the classnames are different. 3) Pointers and non-parsed types -------------------------------- Sometimes SWIG cannot generate a proxy class. This occurs when the definition of a type is not parsed by SWIG, but is then used as a variable or a parameter. For example, void foo(Snazzy sds); If SWIG has not parsed Snazzy it handles it simply as a pointer to a Snazzy. The Java module gives it a type wrapper class around the pointer and calls it SWIGTYPE_p_Snazzy. In other words it handles it in the same manner as types are handled in the low-level functional interface. This approach is used for all non-proxy classes, eg all pointer to pointers and pointers to primitive types. 4) Backwards compatibility ----------------------- Backwards compatibility is not an issue if you have been using proxy classes and no global variables/functions. Otherwise some changes will have to be made. The native methods still exist but they are now in a JNI class, which is called modulenameJNI. As this class is really part of the internal workings, it should not be required so the class has become protected. Some pragmas/directives will hopefully be added to help with backwards compatibility. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 07/18/2002: beazley Modified wrapping of uninstantiated templates returned by value. Just to be safe, they are now wrapped by SwigValueWrapper<> just in case they don't define a default constructor. This would be used if you had code like this Foo blah(); void moreblah(Foo x); but you didn't instantiate Foo using %template. We should probably add a warning for this. 07/17/2002: beazley Added an error check to detect shadowed template paramaters. For example: template class Foo { public: int T; }; This results in an error, not a warning. This warning is also needed to fix some rather insidious problems like this: struct T { int blah; }; template class Foo { public: typedef T Traits; // Which T is this???? }; In this case, the template parameter T shadows the outer structure (which is what you want). 07/16/2002: beazley Improved support for templates with integer arguments. SWIG is much more aware of situations such as this: const int Size = 100; %template(Foo100) Foo<100>; void bar(Foo *x); // Knows that Foo is the same as Foo<100>; 07/15/2002: beazley Fixed bug with %feature/%ignore/%rename and namespaces. For example: %ignore Foo::Bar namespace Foo { class Bar { ... }; } Reported by Marcelo Matus. 07/09/2002: beazley Added parsing support for constructors that try to catch exceptions in initializers. For example: class Foo { Bar b; public: Foo(int x) try : b(x) { ... } catch(int) { ... } } This has no effect on the generated wrappers. However, the try and catch parts of the declaration are ignored. See Stroustrup, 3rd Ed, section 14.4.6.1 for details. 07/06/2002: beazley Fixed bug in template symbol table management. This fixes two bugs. First, mixing abstract methods, templates, and inheritance no longer generates a failed assertion. template class A { public: virtual void foo() = 0; }; template class B : public A { }; %template(A_int) A; %template(B_int) B; This fix also fixes a subtle problem with default values and templates. For example: template struct B { typedef unsigned int size_type; static const size_type nindex = static_cast(-1); void foo(size_type index = nindex); }; Bugs reported by Marcelo Matus. 07/05/2002: ljohnson (Lyle Johnson) [Ruby] Changed the definition of the SWIG_ConvertPtr() function for the SWIG/Ruby runtime support so that it looks like the Python version. If the last argument (flags) is non-zero, SWIG_ConvertPtr() will raise an exception for type mismatches as before. If flags is zero, this function will return -1 for type mismatches without raising an exception. *** POTENTIAL INCOMPATIBILITY FOR RUBY MODULE *** 07/04/2002: beazley Overloaded functions/methods/constructors now work in many language modules. The support is completely transparent--just call the function normally and SWIG will dispatch to the correct implementation. There are a variety of issues associated with this. Please refer to the overloading section of Doc/Manual/SWIGPlus.html for details. *** NEW FEATURE *** 07/04/2002: beazley Fixed a bug with namespaces, enums, and templates. For example: namespace hello { enum Hello { Hi, Hola }; template struct traits { typedef double value_type; }; traits::value_type say_hi() { return traits::value_type(1); } } SWIG wasn't generating wrappers that properly qualified traits. Reported by Marcelo Matus. 06/30/2002: beazley Supplied array variable typemaps for Tcl module. If you have a variable like this: int foo[10]; then a set function like this is generated: void foo_set(int *x) { memmove(foo,x,10*sizeof(int)); } 06/30/2002: beazley New %fragment directive. When writing typemaps, it can be easy to get carried away and write a lot of code. However, doing so causes tremendous code bloat. A common way to solve this is to write helper functions. For example: %{ void some_helper_function() { ... } %} %typemap(in) type { some_helper_function(...); } The only problem with this is that the wrapper file gets polluted with helper functions even if they aren't used. To fix this, a new fragment directive is available. For example: (corrected typo in line below - 06/26/2008) %fragment("type_header","header") %{ void some_helper_function() { ... } %} %typemap(in, fragment="type_header") type { some_helper_function(...); } In this case, the code fragment is only emitted if the typemap is actually used. A similar capability is provided for declaration annotation and the %feature directive. For example: %feature("fragment","type_header") SomeDeclaration; The first argument to %fragment is the fragment name. The second argument is the file section where the fragment should be emitted. The primary use of this directive is for writers of language modules and advanced users wanting to streamline typemap code. *** EXPERIMENTAL NEW FEATURE *** 06/30/2002: beazley Supplied memberin typemaps for all arrays in an attempt to eliminate confusion about their use. 06/29/2002: beazley Experimental support for smart-pointers. When a class defines operator->() like this class Foo { ... Bar *operator->(); ... }; SWIG locates class Bar and tries to wrap its member variables and methods as part of Foo. For example, if Bar was defined like this: class Bar { public: int x; int spam(); }; You could do this (in the target language): f = Foo() f.x = 4 # Accesses Bar::x f.spam() # Accesses Bar::spam The primary use of this feature is to emulate the behavior of C++ smart-pointers---which allow attributes to accessed transparently through operator->. This feature is supported automatically in SWIG---no special directives are needed. To disable this behavior. Use %ignore to ignore operator->. *** NEW FEATURE *** 06/26/2002: beazley Deprecated the %except directive. %exception should be used instead. 06/25/2002: beazley Major cleanup of the modules directory. Eliminated most header files, consolidated module code into single files. 06/24/2002: beazley Reworked the instantiation of language modules. All language modules must now define a factory function similar to this: extern "C" Language * swig_python(void) { return new PYTHON(); } This function is then placed in a table and associated with a command line option in swigmain.cxx. This approach has a number of benefits. It decouples the SWIG main program from having to know about the class definitions for each module. Also, by using a factory function, it will be easier to implement dynamic loading of modules (simply load the file and invoke the factory function). 06/24/2002: beazley Fixed syntax error for reference conversions. For example: operator Foo &(); 06/24/2002: beazley Fixed syntax error for operator new[] and operator delete[]. 06/24/2002: beazley Fixed code generation problem for constants and default arguments involving templates. 06/19/2002: ljohnson (Lyle Johnson) [Ruby] Fixed a bug for the '-feature' command line argument; that setting was effectively being ignored and so the feature name was always set equal to the module name. 06/17/2002: beazley Fixed problems with static members and enums in templates. Version 1.3.13 (June 17, 2002) ============================== 06/16/2002: beazley Fixed a bug with __FILE__ expansion in the preprocessor. On Windows, the backslash (\) is now converted to (\\) in the string literal used for __FILE__. Reported by Steve Glaser. 06/14/2002: beazley Fixed warning message about 'name private in this context'. The warning is only generated for public methods. Reported by Scott Michel. 06/14/2002: beazley Fixed some problems related to template instantiation and namespaces. When SWIG expands a template, it does so with fully resolved types. For example, if you have this: template class foo { }; typedef double Double; %template(foo_d) foo; then, it is handled as foo in the typesystem. This fixes a number of subtle problems with inheritance and templates. 06/14/2002: ljohnson (Lyle Johnson) [Ruby] Added missing bool typemaps for INPUT, OUTPUT and INOUT in Lib/ruby/typemaps.i. 05/29/2002: cheetah (William Fulton) [Java] Fix for a couple of broken pragmas. 05/29/2002: cheetah (William Fulton) Fix for unnecessary cast when wrapping global variable where the type is not parsed by SWIG - Java variables example failure as reported by Larry Virden. 06/10/2002: beazley Modified %template to allow for empty instantiations. %template() foo; This registers foo with the type system, but doesn't wrap it (same as %ignore). This may only be a temporary measure. SWIG might be able to automatically instantiate templates in certain cases. 06/10/2002: beazley Fixed function prototype problems with Tcl 8.4 06/09/2002: beazley Fixed problem with templates and location of base classes. This one is a little mind-bending, but here is an example that illustrates: template struct traits { typedef ArgType arg_type; typedef ResType res_type; }; template struct Function { }; template struct Class : Function::arg_type, typename traits::res_type> { }; %template(traits_dd) traits ; %template(Function_dd) Function ; %template(Class_dd) Class ; In this example, the base class of 'Class' is determined from the Function template, but the types are obtained through typedefs. Because of this, SWIG could not locate the wrapped base class (Function). Should be fixed in 1.3.13 even though I can think of a million other things that might also be broken. 06/07/2002: beazley Fixed a problem with conversion operators. If you had an operator like this, operator double() const; SWIG was ommitting the "const" qualifier. This affected %rename and other directives. Reported by Zhong Ren. 06/07/2002: beazley Lessened the strictness of abstract class checking. If you have code like this: class Foo { public: virtual int method() = 0; }; class Bar : public Foo { public: Bar(); ~Bar(); }; SWIG will go ahead and generate constructor/destructors for Bar. However, it will also generate a warning message that "Bar" might be abstract (since method() isn't defined). In SWIG-1.3.12, SWIG refused to generate a constructor at all. 06/07/2002: beazley Change to %template directive. If you specify something like this: %template(vi) std::vector; It is *exactly* the same as this: namespace std { %template(vi) vector; } SWIG-1.3.12 tried to instantiate the template outside of the namespace using some trick. However, this was extremely problematic and full holes. This version is safer. 06/07/2002: beazley Fixed bug with scope qualification and templates. For example: A::DD Before, this was separated as scopes A, and DD. Fixed now. 06/06/2002: beazley Allow the following syntax: class A { }; struct B : A { ... }; A base class without a specifier is assumed to be public for a struct. 06/06/2002: beazley Fixed syntax error with template constructor initializers. Reported by Marcelo Matus. 06/06/2002: beazley Fixed bug with default template arguments. Reported by Marcelo Matus. 06/05/2002: beazley Fixed subtle problems with %rename directive and template expansion. Code like this should now work: %rename(blah) foo::method; ... template class foo { public: void method(); }; %template(whatever) foo; 06/05/2002: beazley Resolved some tricky issues of multi-pass compilation and and inheritance. The following situation now generates an error: class Foo : public Bar { ... }; class Bar { ... }; The following code generates a warning about incomplete classes. class Bar; class Foo : public Bar { }; The following code generates a warning about an undefined class. class Foo : public Bar { }; // Bar undefined This fixes a failed assertion bug reported by Jason Stewart. 06/05/2002: ljohnson [Ruby] Added a warning message for the Ruby module about the lack of support for multiple inheritance. Only the first base class listed is used and the others are ignored. (Reported by Craig Files). 06/03/2002: beazley Fixed a bug with struct declarations and typedef. For example: typedef struct Foo Foo; struct Foo { ... }; A few other subtle struct related typing problems were also resolved. Version 1.3.12 (June 2, 2002) ============================= 05/30/2002: beazley Fixed problem related to forward template class declarations and namespaces. Bug reported by Marcelo Matus. 05/30/2002: beazley Added 'make uninstall' target. Contributed by Joel Reed. 05/29/2002: beazley Fixed rather insidious bug with %rename, %feature and template specialization. For example: %exception vector::__getitem__ { ... some exception ... } template class vector { ... T __getitem__(int index); // Fine ... }; template<> class vector { ... T __getitem__(int index); // Oops. ... }; Now, the %exception directive (and other features) should correctly apply to both vector and specializations. 05/29/2002: beazley Subtle changes to %template() directive. Template arguments are now reduced to primitive types in template matching. For example: template class vector { ... partial specialization ... } typedef int *IntPtr; // Gross typedef // Gets the above partial specialization %template(vectorIntPtr) vector; This change is extremely subtle, but it fixes a number of potential holes in Luigi's STL library modules. For example: typedef int Integer; %template(vectori) vector; 05/29/2002: beazley Fixed rather insidious typemap bug related to const. const was being discarded through typedefs. 05/29/2002: ljohnson (Lyle Johnson) [Ruby] Added input typemaps for const references to primitive types (in Lib/ruby/ruby.swg). 05/29/2002: cheetah (William Fulton) [Java] The java arrray support functions are enclosed by a SWIG_NOARRAYS #define. Useful if not using arrays and it is desirable to minimise the amount of compiled code. 05/29/2002: cheetah (William Fulton) [Java] Enums were not renamed when using %name or %rename fix. 05/28/2002: ljohnson [Ruby] Modified the name of the wrapper functions for the "new" singleton method and "initialize" instance method for consistency with the other language modules. The wrapper name for the function that implements "new" is alloc_classname and the wrapper name for the function that implements "initialize" is new_classname. 05/27/2002: beazley Changes to runtime. Pointer conversion/creation functions now almost always have an extra "flags" argument. For example: SWIG_ConvertPtr(obj, void **, swig_type_info *ty, int flags); ^^^^^^^^^^ This extra parameter is reserved for future expansion and will be used for more control over pointers in future versions. 05/27/2002: beazley Fix for C++ classes with private assignment operators. It is now possible to safely return objects like this by value. Caveat: the class must provide a copy constructor. 05/26/2002: beazley -proxy option added to many language modules. This is the same as -shadow. We are merely changing terminology. 05/26/2002: beazley [perl] Fixed some inconsistencies in the -package option. -package merely sets the package name to be used on the wrappers. It does not change the name of the shared library file or the name of the generated .pm file. This was broken at some point, but works again now. 05/25/2002: beazley [perl] Fixed [ 475452 ] memory leak in return-by-value. Problem related to static member variables returning newly allocated objects. Reported by Roy Lecates. 05/25/2002: beazley [perl] Fixed [ 513134 ] %BLESSEDMEMBERS isn't always right. Reported by Fleur Diana Dragan. 05/25/2002: beazley Fixed [ 540735 ] -importall and the -I option. 05/25/2002: beazley [guile] Fixed [ 532723 ] Default arg for char* can SegV. Error in guile module. Reported by Brett Williams. 05/25/2002: beazley Subtle change to typemap application code. The "freearg" typemap must exactly match up with the "in" or "ignore" typemap. For example: %typemap(in) (char *data, int len) { ... }; %typemap(freearg) char *data { ... }; void foo(char *data, int len); In this case, the "in" typemap is applied, but the freearg typemap is not. This is because the freearg typemap doesn't match up with the input argument sequence. 05/25/2002: beazley Fixed [ 548272 ] Default argument code missing braces. Reported by Brett Williams. 05/25/2002: beazley Fixed [ 547730 ] SwigValueWrapper needed for constructors. Reported by William Fulton. 05/25/2002: beazley Undefined identifiers now evaluate to 0 when evaluating preprocessor expressions. For example: #if !FOO ... #endif where FOO is undefined or set to some non-numeric value. Fixes [ 540868 ] #if defined whatever - not parsed. Reported by Adam Hupp. 05/24/2002: beazley SWIG now ignores the C++ 'export' keyword. 05/23/2002: beazley Some refinement of type-name mangling to account for pointers, arrays, references, and other embedded type constructs. 05/23/2002: beazley Initial attempt at supporting template partial specialization. At the very least, it is parsed and the classes are stored. Matching of instantiations to specialized version is more limited and based on the SWIG default typemap rules: SWIGTYPE * SWIGTYPE [] SWIGTYPE & Now, why in the world would you want to use this feature? Other than allowing for slightly modified class APIs, this capability is primarily used to provide advanced wrapping support for STL-like objects. It can also be mixed with typemaps. Here is an example: /* Generic version */ template class vector { %typemap(in) vector * { // A container of objects } }; /* Partial specialization (pointers) */ template class vector { %typemap(in) vector * { // A container of pointers to objects. } }; /* Specialization (integers). */ template<> class vector { %typemap(in) vector * { // A container of integers. } }; *** EXPERIMENTAL FEATURE *** 05/23/2002: beazley Enhancement to typemaps. Normally, typemap variables are renamed to avoid conflicts. For example: %typemap(in) int * (int temp) { $1 = &temp; } This results in code that creates and uses variables "temp1","temp2", "temp3" and so forth depending on how many times the typemap is used. Sometimes you want a single variable instead. To do that, using the following naming scheme: %typemap(in) int *(int _global_temp) { } Is this case, a single variable _global_temp is emitted in the wrapper functions. It is shared across all typemaps. Repeated typemaps do not replicate the variable---they use the first one emitted. *** NEW FEATURE *** 05/23/2002: beazley Minor enhancement to typemaps. If you have this code, %typemap(in) Foo (int somevar = 3) { ... } the default value for somevar is now emitted into the wrapper code. 05/22/2002: beazley Fixed %extend to be better behaved in namespaces. If you have code like this: namespace foo { struct bar { %extend { void blah(); }; }; } SWIG matches the blah() method to a C function named void foo_bar_blah(foo::bar *self). This is consistent with the non-namespace version. Bug reported by Marcelo Matus. 05/22/2002: beazley New library files: cpointer.i, carrays.i, cmalloc.i. These provide access to C pointers and memory allocation functions. See Doc/Manual/Library.html for details. 05/22/2002: cheetah (William Fulton) [Java] C type char no longer maps to Java type byte, but to Java type char. It is now treated as a character rather than a signed number. This fits in with the other language modules and is a more natural mapping as char* is mapped as a string of characters. Note that the C signed char type is still mapped to a Java byte. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 05/22/2002: cheetah (William Fulton) [Java] Improved constants wrapping. Constants (#define and %constant) values are now obtained through a JNI call. Previously the value was compiled as Java code, but this didn't work for all cases, eg #define 123ULL. 05/22/2002: beazley Fixed bogus error message with %extend directive and C++ access specifiers. Reported by Marcelo Matus. 05/22/2002: beazley Namespaces and enums now work correctly. For example: namespace Foo { enum Bar { A, B }; } Bug reported by Marcelo Matus. 05/21/2002: beazley The %types directive can now be used to specify inheritance relationships in the runtime type system. For example, %types(Foo = Bar); specifies that Foo isa Bar. Using this is potentially quite dangerous. However, this is useful in certain cases (and in the SWIG library). 05/20/2002: beazley %nodefault and %makedefault directives now require a trailing semicolon. For example: %nodefault; ... %makedefault; In addition both directives can take a class name. For example: %nodefault Foo; class Foo { /* No default constructor/destructor */ }; class Bar { /* Default constructor/destructor generated */ }; *** POTENTIAL INCOMPATIBILITY *** If you don't use the trailing semicolon, things will mysteriously break. 05/20/2002: beazley More improvements to type system handling. SWIG now correctly handles template names and parameters in a namespace. For example: namespace foo { template class bar { }; typedef int Integer; void blah(bar *x); }; In the generated code, all of the typenames are properly qualified. 05/17/2002: cheetah (William Fulton) [Java] deprecated broken -jnic and -jnicpp commandline options. The C or C++ JNI calling convention is now determined from the -c++ commandline option. 05/16/2002: cheetah (William Fulton) [Java] The JCALL macros which exist so that the same typemaps can be used for generating both the C and C++ JNI calling conventions no longer appear in the generated code. This is because the output is now passed through the SWIG preprocessor which does the macro expansion for either C or C++ (depending on whether -c++ is passed on the SWIG commandline). The generation of the functions used in the array typemaps have been adjusted to take account of this. The side effect is that any typemaps which contained JCALL macros within %{ %} brackets will have to be moved within {} brackets so that the SWIG preprocessor can expand the macros. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 05/13/2002: beazley Class templates may now be used as template parameters. For example: template class C> class Foo { ... }; template class Bar { ... }; %template(Fooi) Foo; SWIG doesn't really do anything special with this---it's just another way of specifying a template parameter. 05/13/2002: beazley Minor refinement of template support. Template parameter names are no longer required for types. For example: template class Foo { }; Obviously, names are required for template; 05/12/2002: beazley New macro expansion in typemaps. The sequence: $descriptor(type) Will expand into the SWIG type descriptor structor for the given type. Type may be any abstract datatype. For example: $descriptor(int *) $descriptor(int (*)(int,double)) $descriptor(vector *) Caveat: It is *NOT* currently legal to use other typemap substitution variables in the macro. For example $descriptor($1_type). The primary purpose of this modification is to better support typemaps for container objects or to allow typemaps that might be performing type conversions. *** NEW FEATURE *** 05/11/2002: beazley The wrapping of references to primitive types has been changed as follows: Arguments of type 'const primitive &' are now passed by value as opposed to pointers. Return values of type 'const primitive &' are returned as values instead of pointers. 'primitive' is any one of int, short, long, long long, char, float, double, bool (as well as unsigned variants). This change is being made to better support C++ wrapping--especially code that makes use of templates and the STL. 05/11/2002: beazley The %template directive can now be used to access templates in a namespace. For example: namespace std { template class complex { T re, im; public: complex(T _r = T(), T _i = T()) : re(_r), im(_i) { } T real() { return re; } T imag() { return im; } }; } %template(complex) std::complex; Note: There are some very subtle namespace/symbol table management issues involved in the implementation of this. It may not work in certain cases. 05/10/2002: beazley Member template constructor support added. For example: template struct pair { _T1 first; _T2 second; pair() : first(_T1()), second(_T2()) { } template pair(const pair<_U1,_U2> &x); }; To instantiate the template, use %template and %extend. For example, this expands the constructor into a default copy constructor: %extend pair { %template(pair) pair<_T1,_T2>; } Highly experimental. Other uses may be broken. 05/10/2002: beazley The %extend (%addmethods) directive no longer works unless it appears in the public section of a class. An error message is now generated (as opposed to a segmentation fault). 05/09/2002: beazley New %warnfilter() directive. This directive attaches a warning filter to specific declarations and has the same semantics as %rename, %ignore, %feature, and so forth. For example: %warnfilter(501) foo; // Suppress overloaded warning int foo(int); int foo(double); or %warnfilter(501) Object::foo(double); class Object { public: int foo(int); int foo(double); }; This feature only suppresses warnings in later stages of code generation. It does not suppress warnings related to preprocessing or parsing. *** NEW FEATURE *** 05/09/2002: beazley SWIG now supports C99 variadic preprocessor macros. For example: #define debugf(fmt,...) fprintf(stderr,fmt,__VA_ARGS__) The argument "..." is used to indicate variable arguments which are all placed into the special argument name __VA_ARGS__ in the macro expansion. SWIG also implements the GNU (##) extension for swallowing the preceding comma when __VA_ARGS__ is empty. For example: #define debugf(fmt,...) fprintf(stderr,fmt, ##__VA_ARGS__) Here is how this is expanded: debugf("%d", 3) --> fprintf(stderr,"%d",3) debugf("Hello") --> fprintf(stderr,"Hello" ) (notice the deleted comma). *** NEW FEATURE *** 05/08/2002: samjam (Sam Liddicott) Many changes to php module. Shadow classes are now implemented entirely in native C and no need for php-code shadow wrappers Populated template config.m4 and Makefile.in as needed by phpize are generated. 05/08/2002: ljohnson (Lyle Johnson) [Ruby] A copy constructor is now turned into a "clone" instance method (see Dave's change for copy constructors dated 4/7/2002). This seems like the appropriate thing to do for Ruby code. 05/08/2002: ljohnson (Lyle Johnson) [Ruby] Fixed [ 553864 ] Inline destructor code not written. 05/08/2002: beazley %ignore behaves better with constructors, destructors, and the type system in general. For constructors and destructors, %ignore now suppresses the creation of a default constructor or destructor. For example: %ignore ~Foo; class Foo { public: Foo(); ~Foo(); ... }; In SWIG-1.3.11, ~Foo() simply "disappeared" and the code generator created a wrapper for a default destructor (as if it was never declared in the interface). In SWIG-1.3.12, %ignore suppresses the creation of a destructor if one is actually defined. Similarly, even though a declaration is ignored, information may still be needed to properly handle types. For example, here is a very subtle error that is fixed by this change: %ignore std::string; // Prevent class wrapping namespace std { class string { ... }; %typemap(in) string * { ... } } void foo(std::string *s); // Broken. Before this fix, %ignore would cause the class definition to disappear. This, in turn, would cause the typemap to be misapplied. 05/08/2002: beazley Minor changes to %rename, %ignore, %feature, and related directives for better support of destructors. Destructors can now be precisely tagged. For example: %ignore Foo::~Foo; %feature("action") ~Bar { ... } *Developer warning* Operations such as renaming and feature attachment for classes used to be applied to destructors as well. For instance, if you did this: %rename(Bar) Foo; The operation applied to the class itself, the constructor, and the destructor. This is no longer the case. Now such operations will only apply to the class and the constructor. Note: if you were relying on this for class renaming, be aware that renamed classes should really only be handled at the level of the class itself and not the level of individual declarations in the class (although they can be renamed individually if needed). As far as I know, the Language class is already taking care of this case correctly. 05/07/2002: beazley New set of tests. The Examples/test-suite/errors directory contains tests that try to exercise all of SWIG's error and warning messages. 05/07/2002: beazley Start of a warning framework. Warning messages are now assigned numeric values that are shown in warning messages. These can be suppressed using the -w option. For example: swig -w302 example.i swig -w302,305 example.i Alternatively, the #pragma preprocessor directive can be used to disable this: #pragma SWIG nowarn=302 #pragma SWIG nowarn=302,305 Note: Since SWIG is a multi-pass compiler, this pragma should only be used to change global settings of the warning filter. It should not be used to selectively enable/disable warnings in an interface file. The handling of #pragma occurs in the C++ preprocoessor and affects all subsequent stages of compilation. The -Wall option turns on all warnings and overrides any filters that might have been set. Warnings can be issued from an interface using %warn. For example: %warn "110:%section is deprecated" The first part of a warning message is an optional warning number. A complete set of warning numbers is found in Source/Include/swigwarn.h. *** NEW FEATURE *** 05/07/2002: beazley Internal parsing change. Directives to include files now use brackets [ ... ] instead of { ... }. %includefile "foo.i" [ ... ] The use of { ... } was a bad choice because they were included implicitly by the preprocessor and made it impossible to properly detect legitimate missing '}' errors. 04/16/2002- 05/02/2002: beazley SWIG European Tour: Paris-Amsterdam-Bath. 04/23/2002: beazley The %addmethods directive has been renamed to %extend. For example: class Foo { ... }; %extend Foo { int blah() { ... }; int bar() { ... }; ... }; Motivation: the %addmethods directive can be used for many other tasks including adding synthesized attributes, constructors, and typemaps. Because of this, "addmethods" is somewhat misleading. %extend more precisely describes this operation---extension of a class or structure. *** POTENTIAL INCOMPATIBILITY *** %addmethods still works via a macro definition. However, a warning message may be generated. Errors involving %addmethods will actually refer to the %extend directive. 04/23/2002: beazley Further refinement of the type system. Typedef now propagates through functions, pointers to functions, and pointers to member functions. For example: typedef int Integer; void foo(int (*x)(int), Integer (*y)(Integer)); In this case, arguments 'x' and 'y' have exactly the same type (and would obviously accept objects of either type). Similarly, consider this: class Foo { }; typedef Foo Bar; void bar(int (Foo::*x)(int), int (Bar::*y)(int)); In this case, arguments x and y are the same type (via typedef). 04/22/2002: beazley SWIG now generates a warning message if any part of an expression involves values from a private part of a class. For example: class Foo { private: static int X; public: void blah(int a, int b = X); // Warning }; In this case, the default argument is ignored. There are workarounds, but they are rather clumsy. For instance, you might do this: %feature("action") blah(int,int) { if ($nargs == 1) { result = blah(arg1); } else { result = blah(arg1,arg2); } } void blah(int a, int b = 0); 04/21/2002: beazley Use of the %inline directive inside a namespace is forbidden and now generates an error message. This is not allowed since the inlined code that is emitted is not placed inside a namespace. This confuses other stages of parsing. 04/21/2002: beazley Some bug fixes to casting operations and expression parsing. Due to some parsing issues, it is not currently possible to use casts for all possible datatypes. However, the common cases work. 04/20/2002: beazley (Amsterdam) Member templates now work. Simply use the %template directive inside a class or %addmethods to create instantiations (see Doc/Manual/SWIGPlus.html). Supporting this was easy---earlier changes to templates made it possible using only a two-line modification to the parser and a few minor modifications elsewhere. Hmmm, come to think of it, the smoke was rather thick in that Internet "cafe". *** NEW FEATURE *** 04/19/2002: beazley (TGV) Improved handling of non-type template parameters. For example: vector; Simple numbers and strings can be used with the %template directive as well. For example: %template(vecint100) vector; Note: Arithmetic expressions are not currently allowed. Default template arguments now work and do not have to be given to %template. 04/18/2002: beazley (Paris) Change in internal template handling. Template parameters are now fully integrated into the type system and are aware of typedefs, etc. This builds upon the change below. *** DEVELOPER WARNING *** Word of caution to language module writers. The "name" parameter of certain parse tree nodes (classes, functions, etc.) may be parameterized with types. This parameterization is done using SWIG type-strings and not the underlying C version. For example, int max(int *,int *) has a name of "max<(p.int)>". If you use the name directly, you may get syntax errors in the generated code. To fix this, use SwigType_namestr(name) to convert a parameterized name to a C name with valid syntax. The internal version is used to reduce template types to a common representation and to handle issues of typedef. 04/16/2002: beazley (somewhere over the Atlantic) Enhancement of typedef resolution. The type system is now aware of template arguments and typedef. For example: typedef int Integer; foo(vector *x, vector *y); In this case, vector and vector are the same type. There is some interaction between this mechanism and the implementation of typemaps. For example, a typemap defined for vector * would apply to either type. However, a typemap for vector * would only apply to that type. Typedefs and typemaps and matched by left-most expansion. For example: vector --> vector --> vector 04/24/2002: cheetah (William Fulton) [Java] Changes to Java shadow classes. Overcomes a bug where the module assumed that a pointer to a derived class could be used in place of a pointer to a base class. Thanks to Stephen McCaul for analysing the bug and submitting patches. A consequence is that the getCPtr() method in each shadow class has disappeared and has been replaced with a getCPtrXXX(), where XXX is the shadow class name. If you have code that previously used getCPtr(), and the associated class is wrapping a C struct or a C++ class that is not involved in an inheritance chain, just use the new method. If however, the class is involved in an inheritance chain, you'll have to choose which pointer you really want. Backwards compatibility has been broken as not using the correct pointer can lead to weird bugs through ill-defined behaviour. If you are sure you want the old methods, you could add them back into all shadow classes by adding this at the beginning of your interface file: %pragma(java) allshadowcode=%{ public long getCPtr(){ return swigCPtr; } %} Please see entry dated 07/23/2002 to see how to do this after the deprecation of the allshadowcode pragma. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 04/13/2002: beazley Fixed problem with default arguments and references. Declarations such as this should now work: void foo(const string &x = "Hello"); 04/12/2002: beazley Added typemap $* substitutions for typemaps involving arrays. Requested by William Fulton. 04/11/2002: beazley Template specialization is now supported. For example: template<> class vector { ... }; When the %template directive is used, it will use a specialization if one is defined. There are still some limitations. Partial specialization is not supported. A template of type does not match all pointers. *** NEW FEATURE *** 04/11/2002: beazley Major change to template wrapping internals. Template declarations are no longer processed as macros but now result in real parse-tree nodes. The %template directive expands these nodes into a specific instantiation. This change enables a number of new and interesting capabilities: Directives such as %rename, %feature, and %addmethods can now be applied to uninstantiated templates. For example: %rename(barsize) vector::bar(char *buf, int len); ... template class vector { public: ... void bar(char *buf); void bar(char *buf, int len); // Renamed ... }; %template(intvector) vector; // Renaming carries through By parsing templates into an internal data structure, it will be possible to support specialization (and maybe partial specialization). This is highly experimental and a work in progress. *** POTENTIAL INCOMPATIBILITY *** In SWIG-1.3.11, template declarations were simply processed as weird macros. No other information was retained. This made it impossible to support more advanced features and complicated many other parts of the implementation. 04/09/2002: beazley Change to template class wrapping. There were a variety of "issues" with the old approach related to parsing, the type system, and namespaces. These changes are meant to rectify some of these problems: A specific instantiation of a template can now be specified by including the class inline like this: class vector { public: vector(); ~vector(); ... whatever ... }; This is template specialization, but partial specialization is not yet implemented. The %template directive has been modified to expand roughly as follows: %template(vecint) vector; becomes %rename(vecint> vector; class vector { public: vector(); ... }; Note that this simply builds upon the code above (templates included inline). This modified approach to wrapping fixes some subtle type issues. For instance, you can now define typemaps and typedefs like this: %typemap(in) vector * { ... } typedef vector intvector; ... void blah(intvector *v); // Gets the above typemap This did not work in SWIG-1.3.11 due to a peculiarity of the template implementation. %template(name) no longer installs the template as a class with name "name". This might break %addmethods as described in the manual. For example: %template(vecint) vector; %addmethods vecint { // Fails. vecint not a class ... }; To fix this, just use the template name instead: %addmethods vector { ... } Note: This technique might be a way to implement some bizarre template specialization techniques. For example: %addmethods vector { // Only applied if vector instantiated later %typemap(in) vector * { ... } ... }; *** POTENTIAL INCOMPATIBILITY *** 04/08/2002: beazley Fixed [ 540868 ] #if defined whatever - not parsed. SWIG should now correctly handle preprocessor directives like this: #if defined __cplusplus ... #endif Note: was implemented previously, but there was a minor bug. Reported by Adam Hupp. 04/07/2002: beazley %readonly and %readwrite are deprecated due to a change in the implementation. Instead of being pragmas, mutability is now controlled as a "feature" using the following two directives: %immutable; int x; // read-only variable int y; // read-only variable %mutable; int z; // Modifiable %immutable and %mutable are much more powerful than their older counterparts. They can now pinpoint a specific declaration like this: %immutable x; /* Any x */ %immutable Foo::x; /* x in class Foo */ In fact, the matching algorithm is the same as for %rename, %ignore, and other directives. This means that the declaration %immutable Foo::x; would not only apply to class Foo but to all derived classes as well. *** POTENTIAL INCOMPATIBILITY *** %immutable and %mutable must be terminated by a semi-colon. This differs slightly from the older %readonly and %readwrite directives. Since %immutable and %mutable can be applied to declarations the semicolon is needed to distinguish between a global feature and one targeted to a single declaration. Note: this incompatibility is the primary reason for changing the name of the directive. 04/07/2002: beazley New handling of copy constructors. If a class defines constructors like this: class Foo { public: Foo(); Foo(const Foo &); // Copy constructor ... }; SWIG now generates a function copy_Foo() for the copy constructor. In previous verions, this generated a name-clash and an error message. To preserve backwards compatibility, SWIG does not change the behavior if %rename is used to resolve the name conflict. However, if no name resolution is made, this new approach is used. Copy constructors may be handled as a special case in the target language. However, this is up to the language module itself. 04/07/2002: beazley The %template directive is now namespace aware. This allows code like this: namespace foo { template max(T a, T b) { return a > b ? a : b; } } using namespace foo; %template(maxint) max; // Ok namespace bar { using foo::max; %template(maxdouble) max; // Ok } Caveat: the template name supplied to %template must be defined in the same scope in which the %template directive appears. This code is illegal: %template(maxint) foo::max; 04/07/2002: beazley Minor enhancement to preprocessor. The preprocessor can now perform string comparison. For example: #define A "hello" ... #if A == "hello" ... #endif The primary use of this is in SWIG macros. For example: %define FOO(x) #if #x == "int" /* Special handling for int */ ... #endif %enddef Normal users can probably safely ignore this feature. However, it may be used in parts of the SWIG library. 04/07/2002: beazley Further refinement of default constructor/destructor wrapper generation. SWIG is now much more aware of pure virtual methods. For instance: class A { /* Abstract */ public: virtual void method1() = 0; virtual void method2() = 0; }; class B : public A { /* Abstract */ public: virtual void method1() { }; }; class C : public B { /* Ok */ public: virtual void method2() { }; }; In this case, SWIG will only generate default constructors for C. Even though B looks fine, it's missing a required method and is abstract. 04/04/2002: beazley Subtle change to structure data member access. If you have a structure like this: struct Foo { Bar b; }; The accessor functions for b are generated as follows: (1) If b is *not* defined as a structure or class: Bar Foo_b_get(Foo *self) { return self->b; } void Foo_b_set(Foo *self, Bar value) { self->b = value; } (2) If b *is* defined as a structure or class: Bar *Foo_b_get(Foo *self) { return &self->b; } void Foo_b_set(Foo *self, Bar *value) { self->b = *value; } See the "Structure data members" section of Doc/Manual/SWIG.html for further details. *** POTENTIAL INCOMPATIBILITY *** This may break interfaces that relied on a lot of a undeclared structure and class names. To get the old behavior, simply use a forward declaration such as "struct Bar;" 04/04/2002: beazley C++ namespace support added. SWIG supports all aspects of namespaces including namespace, using, and namespace alias declarations. The default behavior of SWIG is to flatten namespaces in the target language. However, namespaces are fully supported at the C++ level and in the type system. See Doc/Manual/SWIGPlus.html for details on the implementation. 04/02/2002: cheetah (William Fulton) [Java] Sun has modified javac in jdk1.4 to no longer compile an import of an unnamed namespace. To fix this SWIG no longer generates the import for packageless classes. http://developer.java.sun.com/developer/bugParade/bugs/4361575.html As reported SF #538415. 03/27/2002: ljohnson (Lyle Johnson) [Ruby] Added support for pointer-to-member, similar to that for the Python module. Remarkably similar. Also added a new example for this (Examples/ruby/mpointer), which is remarkably similar to the Python example of the same name. 03/26/2002: ljohnson (Lyle Johnson) [Ruby] Made a few minor edits to the "Advanced Topics" chapter of the SWIG manual and added a new major section about how to create multi-module Ruby packages with SWIG. 03/26/2002: ljohnson (Lyle Johnson) [Ruby] Removed all of the old Ruby pragmas. If any of this functionality is truly missed we can resurrect it, preferably with some kind of feature-based directive. 03/25/2002: ljohnson (Lyle Johnson) [Ruby] Fixed SWIG exception library support for Ruby, which has apparently been broken for some time. Luckily, no one seems to have noticed. 03/23/2002: beazley C++-namespace support in SWIG directives. %addmethods: The %addmethods directive now accepts a fully qualified classname and can be used inside C++ namespace declarations. For example: // Attaches to the class Foo::Bar below %addmethods Foo::Bar { int somemethod() { ... } }; namespace Foo { class Bar { public: ... }; // Attaches to the class Bar above %addmethods Bar { int othermethod() { ... }; } } %feature, %rename, %ignore, %exception, and related directives: Namespaces are fully integrated into the renaming and declaration matcher. For example: %rename(display) Foo::print; // Rename in namespace Foo %ignore Foo::Bar::blah; // Ignore a declaration %rename directives can be placed inside namespace blocks as well. For example: namespace Foo { %rename(display) print; // Applies to print below void print(); }; Most other SWIG directives should work properly inside namespaces. No other changes are needed. 03/22/2002: beazley Some changes to internal symbol table handling. SWIG no longer manages structures and unions in a separate namespace than normal declarations like ANSI C. This means you can't have a structure with the same name as a function. For example: struct Foo { ... } int Foo() { ... } This approach is more like C++. It's not clear that SWIG ever really supported the ANSI C anyways---using the same name would almost certainly generate a name-clash in the target language. 03/22/2002: ljohnson (Lyle Johnson) [Ruby] Fixed [ 517302 ] for handling of renamed overloaded constructors. Now, renamed overloaded constructors are converted into class singleton methods (basically acting as "factory" methods). 03/21/2002: beazley Fixed [ 532957 ] %ignore parse error and casting operator. Reported by William Fulton. 03/18/2002: beazley (** ADVANCED USERS ONLY **) Added support for dynamic casting in return values. A somewhat common problem in certain C++ programs is functions that hide the identity of underlying objects when they are returned from methods and functions. For example, a program might include some generic method like this: Node *getNode(); However, Node * may just be base class to a whole hierarchy of different objects. Instead of returning this generic Node *, it might be nice to automatically downcast the object into the appropriate type using some kind dynamic cast. Assuming you understand the peril involved, a downcast can now be performed using the following function in the run-time type checker: swig_type_info *SWIG_TypeDynamicCast(swig_type_info *, void **ptr); This function checks to see if the type can be converted to another type. If so, a different type descriptor (for the converted type) is returned. This type descriptor would then be used to create a pointer in the target language. To use this, you would write a typemap similar to this: %typemap(out) Node * { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1); $result = SWIG_NewPointerObj($1, ty); } Alternatively, %typemap(out) Node * = SWIGTYPE *DYNAMIC; To make the typemap have any effect, you have to write a supporting function that knows how to perform downcasting. For example: %{ static swig_type_info * Node_dynamic_cast(void **ptr) { Node **nptr = (Node **) ptr; Element *e = dynamic_cast(*nptr); if (e) { *ptr = (void *) e; return SWIGTYPE_p_Element; } Data *d = dynamic_cast(*nptr); if (d) { *ptr = (void *) d; return SWIGTYPE_p_Data; } return 0; } %} There is no restriction on how types are determined. dynamic_cast<> uses C++ RTTI. However, if you had some other mechanism for determining the type, you could use that here. Note: it is important to save the new pointer value back into the argument as shown. When downcasting, the value of the pointer could change. Finally, to make the casting function available, you have to register it with the run-time type checker. Put this macro in your interface file. DYNAMIC_CAST(SWIGTYPE_p_Node, Node_dynamic_cast); Note: this feature does not introduce a performance penalty on normal SWIG operation. The feature is only enabled by writing a new typemap that explicitly calls SWIG_TypeDynamicCast() to make a conversion. Examples/test-suite/dynamic_cast.i contains a simple example. This feature is not supported in the Java module due to differences in the type-checking implementation. *** EXPERIMENTAL FEATURE *** 03/17/2002: beazley Small change to type-name handling of unnamed structures and typedef. If a structure of this form appears: typedef struct { ... } Foo; Then 'Foo' is used as the proper typename for the structure. Furthermore, Foo can now be used as a name in C++ inheritance. SWIG was already kind of doing this, but this modification refines the implementation to more closely follow the C++ ARM, section 7.1.3, p. 106. This fixes a couple of obscure corner cases. 03/16/2002: beazley Modified C++ inheritance with a few enhancements. First, type information needed for casting and type-equivalence is generated even when base-classes aren't defined in the interface. For example: class Foo : public Bar { /* Bar unspecified */ public: ... }; void blah(Bar *b); In this case, the blah() function still accepts Foo * even though nothing is really known about Bar. Previous SWIG versions would just generate a type error. Inheritance has also been modified to work through typedef. For example: class Bar { }; typedef Bar OtherBar; class Foo: public OtherBar { } In this case, the base class of OtherBar is correctly resolved back to Bar. The use of the name OtherBar is lost in this resolution (the wrappers will simply use Bar instead of the typedef name OtherBar). 03/13/2002: beazley %typemap, %apply, and related directives can now appear inside class definitions. 03/13/2002: beazley Fixed a variety of problems related to compiling SWIG on 64-bit platforms. 03/12/2002: beazley Fixed problem with "ignore" and "in" typemaps. Local variables associated with "in" were being added to the wrapper function even though they were never used. Mostly harmless, but it would lead to a variety of compilation warnings. 03/12/2002: beazley Some changes to the internal type system and handling of nested C++ types. In previous versions of SWIG, if you had the following: class Foo { public: typedef int Blah; }; class Bar : public Foo { public: void somemethod(Blah x); }; The argument type in somemethod() would implicitly be set to Bar::Blah. Although this is technically allowed, it breaks typemaps. For example: %typemap(in) Foo::Blah { ... } doesn't match like you expect. This has been changed in SWIG-1.3.12. Now, types are expanded using the class in which they were defined. So, the argument type in somemethod() will be Foo::Blah---since the type Blah was defined in Foo. 03/10/2002: beazley Fixed some subtle type scoping problems with typedef and C++ classes. For example: typedef int Blah; class Bar { public: typedef double Blah; void foo(Blah x, ::Blah y); ... } 03/10/2002: beazley Highly experimental change to handle variable length arguments. First, there is no portable or reliable way to wrap a varargs function in full generality. However, you *can* change the function signature using %varargs. %varargs(char *) fprintf; ... void fprintf(FILE *f, char *fmt, ...); In this case, the variable length parameter "..." is simply replaced by the parameters given in %varargs. This results in a function like this: void fprintf(FILE *f, char *fmt, char *s); More than one argument can be used and default values can be defined. For example, this code specifies a maximum of four arguments. %varargs(char *x1 = 0, char *x2 = 0, char *x3 = 0, char *x4 = 0) fprintf; *** EXPERIMENTAL NEW FEATURE *** 03/10/2002: beazley Change to handling of variable length arguments. varargs is now handled as a proper parameter and is passed to the code generator. However, it still can't be handled correctly (and will generate a typemap warning). This change has been made to better incorporate variable length arguments with other directives such as %ignore, %rename, %feature, and so forth. 03/10/2002: beazley Fixed [ 522555 ] Syntax error parsing "define" construct. SWIG is a little more restrictive in determining #define statements that will be wrapped as constants. Also added a better parser error rule for handling bad constants. 03/08/2002: cheetah (William Fulton) [Java] Bug fix: Classes renamed with %rename that are derived from another class generate more appropriate shadow class code. 03/08/2002: cheetah (William Fulton) [Java] Fixed SF [ #523632 ] and [ #513335 ] both reported by Israel Tanner. Support for types that are used which are in a typedef. The appropriate shadow class name is generated. Also generated correct shadow classname when a templated class is used within another templated class. See the cpp_typedef.i testcase. 03/08/2002: cheetah (William Fulton) [Java] Bug fix: No type was generated in shadow classes for types that weren't wrapped by SWIG. The type is treated as a raw pointer, ie no shadow class. 02/22/2002: beazley Refined the matching algorithm used by %rename, %ignore, and %feature. If a type signature is supplied, it must exactly match that used in the declaration---including any use of const. For example: %rename(foo1) foo(int); %rename(bar1) bar(int) const; class Blah { public: void foo(int); // Matched --> foo1 void foo(int) const; // Not matched void bar(int); // Not matched void bar(int) const; // Matched --> bar1 } In previous versions, a non-const specification would match both the non-const and const declarations. However, the whole point of %rename and related directives is that they be able to precisely pinpoint exact declarations in an interface. This fixes the problem. 02/21/2002: beazley Reworked the handling of default constructor and destructors. SWIG now makes a preliminary pass over the parse tree to discover which classes support default allocation. This fixes a number of very subtle issues in code generation and call/return by value. 02/18/2002: cheetah (William Fulton) Improved support on Cygwin: Perl, Python, Tcl, Ruby and Java should work out of the box, barring the runtime library. Removed dllwrap and replaced with newly working gcc -shared instead for Cygwin. All this will require the new improved binutils 20010802 and later, but the latest Cygwin is usually the best recommendation. 02/15/2002: beazley Fixed some problems related to wrapping of global variables and Perl shadow classes. Reported by Chia-liang Kao. 02/15/2002: ljohnson (Lyle Johnson) [Ruby] Made a fix to the code generation for C++ class constructors so that we get both a "new" singleton method and an "initialize" instance method for each class. This change enables developers to derive new Ruby classes from SWIG-wrapped C++ classes and then override their initialize methods to provide subclass-specific instance initialization. 02/15/2002: ljohnson (Lyle Johnson) [Ruby] Massive documentation update for the Ruby module, contributed by Craig Files. 02/14/2002: ljohnson (Lyle Johnson) [Ruby] Bug fix: An error in the SWIG runtime support for Ruby was causing several of the examples to fail. Reported by William Fulton. 02/14/2002: ljohnson (Lyle Johnson) [Ruby] Bug fix: Enumerations defined within a class (such as those seen in the Examples/ruby/enum example) were not being exported with the correct names. Reported by William Fulton. 02/13/2002: ljohnson (Lyle Johnson) [Ruby] Added a warning message when we run across overloaded class constructors for C++ code, that this is currently not supported (even if the overloads have been %renamed). For an example of where this doesn't work, see Examples/ruby/operator. 02/13/2002: ljohnson (Lyle Johnson) [Ruby] Added an "ignored" warning message when the parser runs across an operator!=() declaration for C++ code. 02/11/2002: ljohnson (Lyle Johnson) [Ruby] Added the "import", "import_template", "operator" and "template" examples. 02/11/2002: ljohnson (Lyle Johnson) [Ruby] Added multi-module support. 02/09/2002: ljohnson (Lyle Johnson) [Ruby] Added the missing "#define SWIG_NOINCLUDE" at the top of the wrapper code when the '-c' option is used. 02/09/2002: ljohnson (Lyle Johnson) Corrected a minor off-by-one error for the size of the swig_types[] array that's generated in the wrapper code. 02/08/2002: beazley Fixed SF [ #515058 ] Wrong code for C++ templates. Reported by Israel Taller. Version 1.3.11 (January 31, 2002) ================================= 01/30/2002: beazley Fix to pass/return by value for C++ objects that define no default constructor. Changes to the typemap system made it impossible to wrap C++ objects with no default constructor. This has been fixed, but the solution involves some clever template magic contributed by William Fulton. Please see the comments in the file Lib/swig.swg for further details. This solution is experimental and may be refined in a future release. 01/30/2002: beazley Global variables and member data of type "const char *" can be set, but the old value is silently discarded without any garbage collection. This may generate a memory leak. This change is needed to more safely handle variables like this: const char *foo = "Hello World\n"; In this case, it's not safe to free the old value. However, SWIG can dynamically allocate a new value and make foo point to it. To fix this memory leak, you can probably do this: %clear const char *foo; %apply char * {const char *foo}; *** POTENTIAL INCOMPATIBILITY *** 01/30/2002: beazley Two minor typemap enhancements have been added. First, typemaps can issue a warning message by including a special warning attribute. For example: %typemap(in,warning="I'm going to do something dangerous") ... The warning message will show up whenever the typemap is applied. Second, a typemap can force a no-match by defining %typemap(in) sometype "pass"; If this is used, the typemap system will *not* record a typemap match for "sometype". This can be used to block selected typemaps. For example, if you wanted to disable a typemap feature for some type, you could do this. // Do not allow global variables of type 'const char *' to be set. %typemap(varin) const char * "pass"; It might also be possible to use this to do subtle and strange things with typemaps. For example, if you wanted to make 'blah *' an output value and 'const blah *' an input parameter, you might do this: %typemap(ignore) blah *(blah temp) { $1 = &temp; } %typemap(argout) blah * { ... return a value ... } /* Block unqualified typemaps defined above */ %typemap(ignore) const blah * "pass"; %typemap(argout) const blah * "pass"; %typemap(in) const blah * { ... get input value ... } (This potential applications of typemaps suggested by Greg Stein). *** NEW FEATURE *** 01/29/2002: cheetah (william fulton) [Java] Bug fix: No enumerations were wrapped when the -shadow commandline option was not specified. Reported by Israel Taller. 01/28/2002: cheetah (william fulton) [Java] Global arrays are successfully wrapped. In fact they started mostly working in SWIG-1.3.10. 01/28/2002:richardp Added first attempt at C++ and -shadow support for PHP4 module, please test and mail me if any problems/ideas on improving it. There is a known problem with uninitialized member variables, please see Examples/php4/sync/README for details. Also more PHP documentation added to Doc/Manual/Php.html 01/27/2002:beazley The ANSI C size_t type is now recognized as an integer by default. 01/26/2002:beazley long long and unsigned long long support added to many language modules. This is not a portable feature and will require compiler support for the long long type. In target languages that do not support long long (e.g., Tcl and Perl), numbers are converted to a string of digits. This prevents their use in arithmetic calculations, but still allows values to be set from a string. long long support requires the use of the strtoll() and strtoull() functions as well as the 'lld' and 'llu' format specifiers of sprintf(). 01/26/2002:beazley Fixed [ #501827 ] Delete method is not called. The Tcl module wasn't correctly calling destructors when they were defined using %addmethods. This has been fixed. Reported by Reinhard Fobbe. 01/26/2002: beazley Better support for long long and unsigned long long. Typemaps have been included in a number of modules for handling these types. In addition, the parser has been modified to accept long long literals such as 1234LL and 1234ULL. 01/27/2002: cheetah (william fulton) [Java] A C char[] is mapped to a Java String which is the default SWIG handling of char[] and char*. It used to be mapped to byte[]. Note that a C signed char[] array is mapped to byte[]. *** POTENTIAL INCOMPATIBILITY *** 01/25/2002: beazley Fixed a problem with return-by-value, C++, and objects that define no default constructor. Reported by Joel Reed. 01/25/2002: cheetah (william fulton) [Java] Overhaul of the Java module. The C code generation is now done from typemaps. 01/24/2002: cheetah (william fulton) [Java] Support for arrays of enum pointers 01/20/2002: cheetah (william fulton) [Java] Error checking for null Java objects being passed to native functions. Exception thrown now whereas before the JVM crashed. 01/18/2002: cheetah (william fulton) [Java] Corrected behaviour for functions that take arrays. For example, when this c function: void arrayfn(int array[]); is wrapped the corresponding native function public final static native void arrayfn(int[] array); is produced. Previously if the C function made any changes to the array elements, these were not reflected back into the Java array. This has now been corrected so that the changes are propogated back to Java and the calling function will see these changes. This is how pure Java functions work, ie arrays are passed by reference. 01/15/2002:mkoeppe [Guile] New file cplusplus.i with C++ typemaps contributed by Marcio Luis Teixeira . 01/11/2002: cheetah (william fulton) [Java] Changed mapping of C long to Java type. Was mapped to Java long, now mapped to Java int. If you want the previous mapping to Java long use this approach in your interface file: %clear long; %typemap(jni) long "jlong" %typemap(jtype) long "long" %typemap(jstype) long "long" %clear long[ANY]; %typemap(jni) long[ANY] "jlongArray" %typemap(jtype) long[ANY] "long[]" %typemap(jstype) long[ANY] "long[]" %typemap(in) long[ANY] {write me for array support} %typemap(out) long[ANY] {write me for array support} %typemap(argout) long[ANY] {write me for array support} %typemap(freearg) long[ANY] {write me for array support} *** POTENTIAL INCOMPATIBILITY *** This new mapping is more appropriate when interfacing to 32 bit applications which are used in the current 32-bit JVMs. For future 64-bit JVMs you may have to change these mappings - eg on Unix LP64 systems, but not on Microsoft 64bit Windows which will be using a P64 IL32 model. This may be automated in a future version of SWIG. 01/10/2002:beazley Fixed [ 501677 ] %init block in wrong place. Reported by Luigi Ballabio. 01/09/2002: cheetah (william fulton) [Java] Default support for the long long type. signed long long is mapped to a Java long. unsigned long long is mapped to BigInteger. 01/09/2002:beazley Experimental change to parser to better support mixing of int, long, short, unsigned, float, and double. The parser should now support types like this: short unsigned int int unsigned short unsigned short int unsigned int short This change also enables a type of 'long double' (previously unsupported) to be used. *** NEW FEATURE *** 01/05/2002: cheetah (william fulton) [Java] Casting fix for when function return type is a pointer as reported by Gary Pennington 2002-01-05. The upper 32bits of the 64 bit jlong will have contained junk for 32bit pointers. 01/05/2002: cheetah (william fulton) [Java] Better pointer handling in Java is possible as the INPUT, OUTPUT and INOUT typemaps have been added into typemaps.i. 01/05/2002: cheetah (william fulton) [Java] $null can be used in input typemaps to return early from JNI functions that have either void or a non-void return type. Example: %typemap(check) int * %{ if (error) { SWIG_exception(SWIG_IndexError, "Array element error"); return $null; } %} If the typemap gets put into a function with void as return, $null will expand to nothing: void jni_fn(...) { if (error) { SWIG_exception(SWIG_IndexError, "Array element error"); return ; } ... } otherwise $null expands to zero, where javareturntype is either a pointer or a primitive type: javareturntype jni_fn(...) { if (error) { SWIG_exception(SWIG_IndexError, "Array element error"); return 0; } ... } 01/02/2002: cheetah (william fulton) [Java] The Java module incorrectly used argout typemaps for strings. This is now corrected and the code now resides in the freearg typemap. The argout array typemaps have been split into argout and freearg typemaps. This correction may require some user written typemaps to be modified. *** POTENTIAL INCOMPATIBILITY *** 12/28/2001: cheetah (william fulton) [Java] Multi typemaps now working for Java see multimap example. [Java] Fix for recently introduced bug - freearg typemap code was appearing before the function call. 12/28/2001: cheetah (william fulton) [Java] JCALL macro for JNI calls that work in both C and C++ typemaps have been replaced with JCALL0, JCALL1, JCALL2, JCALL3 and JCALL4 macros. *** POTENTIAL INCOMPATIBILITY *** 12/22/2001:beazley Resolved some inconsistent behavior with %rename and class renaming. If you specify the following: %rename(Foo) Bar; class Bar { public: Bar(); ~Bar(); } Then the %rename directive applies to the class itself, the constructor, and the destructor (all will be renamed to Foo). If a class defines more than one constructor, the overloaded variants can still be renamed by specifying parameters to %rename. For example: %rename(Bar_copy) Bar(Bar &); class Bar { public: Bar(); Bar(Bar &); ~Bar(); }; There are still some odd corner cases. If you specify %rename(Foo) ::Bar; then only the name of the class is changed and the constructor/destructor names are left unmodified. If you specify %rename(Foo) *::Bar; then the names of the constructor/destructor functions are modified but the name of the class is not. 12/21/2001: cheetah (william fulton) [Java] jni, jtype and jstype typemaps no longer hardcoded but real typemaps. New variable substitution, $javaclassname, can be used in the jstype typemaps. It is replaced with the Java shadow class name where applicable. [Java] Fix for recently introduced bug to do with inheritance when using %import. [Java] A few more bug fixes, todo with %rename and using the kind with the type, eg void fn(union uni myuni, struct str mystr, class cl mycl); 12/20/2001:beazley Fixed [ #494524 ] Preprocessor bug - apostrophe and #subst. 12/20/2001:beazley Added SWIG_VERSION preprocessor symbol. This is a hexadecimal integer such as 0x010311 (corresponding to SWIG-1.3.11). This can be used in the interface as follows: #if SWIG_VERSION >= 0x010311 /* Use some fancy new feature */ #endif Note: The version symbol is not defined in the generated SWIG wrapper file. *** NEW FEATURE *** 12/20/2001:mkoeppe [MzScheme]: Renamed mzswig_make_boolean to swig_make_boolean, as the latter is used in the typemaps. Reported by Luigi Ballabio. 12/17/2001:mkoeppe [Guile]: Rewrote list-vector.i using multi-dispatch typemaps. Updated pointer-in-out.i. Make the deprecated typemap-substitution of "$source" in "argout" work as before. 12/16/2001:mkoeppe [Guile]: Fixed macros %values_as_list, %values_as_vector, %multiple_values to use the proper %pragma syntax. New Guile example/test "multivalue"; new Guile run-test for test-suite item "list-vector" (currently broken). 12/14/2001:mkoeppe [Guile]: Fixed typemap-substition bug for "varin". Relaxed valid-identifier check to allow all R5RS identifiers. Version 1.3.10 (December 10, 2001) ================================== 12/08/2001:beazley Modified %typemap so that %{ ... %} can also be used as a code block (mostly for completeness). For example: %typemap(in) blah %{ ... %} This form does not introduce a new block scope. Also, the code enclosed in %{ ... %} is not processed by the preprocessor. 12/08/2001:beazley Fixed [ #459614 ] SWIG with multiple TCL interpreters. 12/08/2001:beazley Fixed [ #417141 ] rubydec.swg is wrong Reported by Paul Brannan. 12/08/2001:beazley Fixed [ #410557 ] Problem with %addmethods on NT. Reported by Magnus Ljung. 12/08/2001:beazley Fixed [ #445233 ] Enhancement: handle access change. SWIG now parses (but ignores) C++ access changes for the the following: class A { protected: void something() { } public: A() {} }; class B : private A { public: B() : A() { } protected: A::something; <---- Parsed, but ignored }; Suggested by Krzysztof Kozminski. 12/08/2001: cheetah (william fulton) Fix for Ruby to work using Visual C++. 12/06/2001:beazley Fixed [ #465687 ] unsigned short parameters fail. Reported by Gerald Williams. 12/06/2001:beazley Fixed SF [ #489594 ] PyString_FromString can't take NULL arg. Reported by John Merritt. SWIG now converts string values to Python using code like this: resultobj = result ? PyString_FromString(result) : Py_BuildValue(""); 12/06/2001:beazley Fixed SF [ #463561 ] Type conversions not generated. Reported by Gerald Williams. 12/04/2001:beazley Fixed SF [ #470217 ] Tcl default argument handling. Reported by Shaun Lowry. 12/04/2001:beazley Fixed SF [ #472088 ] defined(MACRO) expanded everywhere. Embedded preprocessor directives such as %#if defined(FOO) are not expanded by the SWIG preprocessor. Reported by Gerald Williams. 12/04/2001:beazley Fixed SF [ #476467 ] Problems with #define & commas. 12/04/2001:beazley Fixed SF [ #477547 ] wrong declaration of pointer functions. Bad prototypes in Lib/tcl/ptrlang.i. 12/04/2001:beazley Fixed SF [ #483182 ] Constants can take args by mistake. When swig -perl5 -const is used, constants are declared with a void prototype. For example: sub ICONST () { $examplec::ICONST } Patch submitted by Rich Wales. 12/03/2001:beazley New %exception directive. This is intended to replace %except. It works in exactly the same manner except it does not accept a language specifier. For example: %exception { try { $action } catch(SomeError) { error } } %exception is also name aware---allowing it to be applied to specific declarations in an interface. For example: %exception foo { ... exception for any function/method foo ... } %exception Foo::bar { ... exception for method bar in class Foo ... } %exception Foo::bar(double) { ... exception for method bar(double) in class Foo ... } The semantics of this name matching is exactly the same as for %rename. *** NEW FEATURE *** 12/03/2001:beazley Substantial cleanup of the Python shadow class code. Shadow classes used to be created in this rather complicated manner involving about a half-dozen strings created in bits and pieces. Shadow classes are now generated in a more straightforward manner--in the same order that appears in the interface file. *** POTENTIAL INCOMPATIBILITY *** The order in which declarations appear in the shadow file may differ. 12/03/2001:beazley The %insert directive (%{ ... %}, %runtime, %header, %wrapper, etc.) can now be used inside of a class definition. This has potential uses when generating shadow class code. For example: class Foo { ... %insert("shadow") %{ # Some python code def blah(self): print "I'm blah!" %} ... }; The support for class code insertion depends on the language module. However, the intent of this feature is to simplify the task of extending shadow class code. In the Python module, this inserts code with the proper level of indendation (regardless of what was used in the SWIG interface). *** NEW FEATURE *** 11/29/2001: cheetah (william fulton) Modifications for Java and Python modules to work on cygwin. Unfortunately a lot of the python module has started to produces code which cannot be auto-imported using cygwin libtools so most of it is still broken. 11/28/2001:beazley The %rename and %feature directive can now be used inside of a class definition. For example: class Foo { %rename(foo_i) foo(int); %rename(foo_d) foo(double); public: ... void foo(int); void foo(double); ... }; When used in this manner, the %rename directive only applies to members of the class in which it appears as well as all derived classes. In fact, this is really just the same as saying: %rename(foo_i) Foo::foo(int); %rename(foo_d) Foo::foo(double); class Foo { ... }; *** NEW FEATURE *** 11/26/2001:beazley Added the experimental %feature directive. %feature can be used to attach arbitrary string attributes to parse tree nodes. For example: %feature("except") blah { try { $function } catch (Error) { whatever; } } or %feature("set") *::x_set "x"; or %feature("blah") Foo::bar(int,double) const "spam"; The syntax is borrowed from the %rename directive. In fact, the exact same semantics apply (inheritance, matching, etc.). %feature is a very powerful low-level primitive that can be used to customize individual language modules and to provide hints to any stage of code generation. Features are attached to parse tree nodes as attributes with names like "feature:*" where * is replaced by the feature name (e.g., "feature:except", "feature:set", etc.). Language modules can then look for the features using a simple attribute lookup. %feature is intended to be a replacement for a number of older SWIG directives including %except and specialized pragmas. It is more powerful (due to its parameterized name matching) and it provides very precise control over how customization features are attached to individual declarations. There are future expansion plans that will build upon this capability as well. It's not certain that %feature will ever be used directly by SWIG users. Instead, it may be a low-level primitive that is used in high-level macro definitions. For instance, to support properties, you might define a macro like this: %define %property(name, setf, getf) %feature("set") setf #name; %feature("get") getf #name; %enddef Which allows a user to specify things like this: %property(p, get_p, set_p); class Blah { public: int get_p(); void set_p(int); }; *** EXPERIMENTAL NEW FEATURE *** 11/24/2001:beazley The Tcl module has been expanded with some new features for managing object ownership. For example: set c [Circle -args 20] $c area # Invoke a method $c -disown # Releases ownership of the object $c -acquire # Acquires ownership of the object If Tcl owns the object, its destructor is invoked when the corresponding object command is deleted in Tcl. To simplify the destruction of objects, the following syntax can be used: $c -delete # Delete an object This is an alternative for the more obscure variant of rename $c {} These features also add functionality at the C API level. The following functions manage ownership from C and can be used in typemaps. SWIG_Acquire(void *ptr); SWIG_Disown(void *ptr); A new function for constructing instances is also available: Tcl_Obj * SWIG_NewInstanceObj(Tcl_Interp *interp, void *ptr, swig_type_info *type, int own); When used in a typemap, this creates a pointer object and an interpreter command that can be used to issue methods and access attributes as shown above. *** NEW FEATURE *** 11/23/2001:beazley All Python-related %pragma operations have been eliminated. Most of these were written for older SWIG versions in order to compensate for limitations in earlier releases. In an effort to reduce the amount of code-clutter and potential for errors, it is easier to simply eliminate the pragmas and to start over (if needed). To be honest, I'm not even sure the pragmas worked in 1.3.9 and recent releases. Note: If you need to insert code into the shadow class file created by SWIG, simply use the %shadow directive like this: %shadow %{ def some_python_code(): print "blah!" %} *** POTENTIAL INCOMPATIBILITY *** 11/22/2001:beazley Sweeping changes to the way in which the Python module handles shadow classes. In early implementations, shadow classes were merely Python wrappers around typed pointer objects. However, some users actually wanted to receive the shadow class object in C. To accommodate this, the dereferencing of the "this" pointer in a shadow class was moved to C as described in CHANGES [8/8/99]. However, the process of returning pointers to Python was still somewhat problematic. Specifically, shadow classes never worked in situations such as these: - Use of any kind of output typemap ('out' or 'argout') - Global variables (broken as far as I can tell). In the past, some users have dealt with this by manually trying to create shadow class objects themselves from C/C++. However, this was difficult because the C wrappers don't really know how to get access to the corresponding Python class. The Python module has now been modified to automatically attach shadow class objects to pointers when they are returned to Python. This process occurs in the function SWIG_NewPointerObj() so the process is completely transparent to users. As a result, shadow classes are now more seamlessly integrated with typemaps and other features of SWIG. This change may introduce a number of incompatibilities. The SWIG_NewPointerObj() now takes an extra parameter "own" to indicate object ownership. This can be used to return a pointer to Python that Python should destroy. In addition, older code that tries to manually construct shadow class objects or which expects bare pointers may break---such pointers may already be encapsulated by a shadow class. *** POTENTIAL INCOMPATIBILITY *** 11/20/2001:beazley Modified the %insert directive to accept single braces { ... }. For example: %insert("header") { ... some code ... } This works exactly like %{ ... %} except that the code in the braces is processed using the preprocessor. This can be useful in certain contexts such as low-level code generation in language modules. *** NEW FEATURE *** 11/20/2001:beazley Command line options are now translated into preprocessor symbols. For example: ./swig -python -shadow -module blah interface.i Creates the symbols: SWIGOPT_PYTHON 1 SWIGOPT_SHADOW 1 SWIGOPT_MODULE blah Modules can look for these symbols to alter their code generation if needed. *** NEW FEATURE *** 11/20/2001:beazley Massive overhaul of the Perl5 module. A lot of code generation is now driven by tables and typemaps. The generated wrapper code also makes use of tables to install constants, variables, and functions instead of inlining a bunch of procedure calls. The separate variable initialization function is gone. Most code generation is controlled via the perl5.swg file in the library. *** POTENTIAL INCOMPATIBILITY *** 11/13/2001:beazley Added parsing support for the C++ typename keyword. Primarily this is added to better support templates. For example: template void blah(C& v) { typename C::iterator i = v.begin(); } Note: typename is supported in the parser in the same way as 'struct' or 'class'. You probably shouldn't use it anywhere except in templates. *** NEW FEATURE *** 11/11/2001:beazley Massive overhaul of the language module API. Most functions now use a common, very simple, API. There are also a number of interesting semantic side-effects of how code is actually generated. Details will be forthcoming in Doc/Manual/Extending.html. *** POTENTIAL INCOMPATIBILITY *** Language modules written for previous versions of SWIG will no longer work, 11/10/2001:beazley Fixed a very subtle bug due to unnamed class wrapping. For example, if you did this typedef struct { int x,y; } gdPoint, *gdPointPtr; void foo(gdPointPtr x); Then the foo function would get a type-error. The problem has to do with internal typedef handling and the fact that the typedef declarations after the struct appear later in the parse tree. It should work now. Problem reported by Vin Jovanovic. 11/09/2001:beazley Subtle change to "out" typemaps (and related variations). The name that is attached to the typemap is now the raw C identifier that appears on a declaration. This changes the behavior of member functions. For example: %typemap(out) int foo { ... } class Blah { public: int foo(); // typemap gets applied } Previous versions never really specified how this was supposed to work. In SWIG1.1, you could probably write a typemap for the wrapper name like this: %typemap(out) int Blah_foo { ... } However, this old behavior is now withdrawn and not supported. Just use the member name without any sort of special prefix. *** POTENTIAL INCOMPATIBILITY *** 11/06/2001:beazley Changes to Tcl module initialization: (1) SWIG now automatically includes the code needed to work with Tcl stubs. Simply compile with -DUSE_TCL_STUBS. (2) SWIG now automatically calls Tcl_PkgProvide to register a package name. The package name is the same as the name specified with the %module directive. The version number is set to "0.0" by default. To change the version number, use swig -pkgversion 1.2 interface.i. *** POTENTIAL INCOMPATIBILITY *** Modules that provided stubs and Tcl_PkgProvide on their own might break. Simply remove that code. 11/05/2001:beazley Changed code generation of constants in the Tcl module. Constants are now stored in a large table that get installed at module startup. There are also no longer any static variables so it should generate somewhat less code. 11/04/2001:beazley The "const" typemap has been renamed to "constant" in many language modules. "const" is a C keyword which made the handling of the typemap directive somewhat awkward in the parser. *** POTENTIAL INCOMPATIBILITY *** 11/04/2001:beazley %typemap directive can now accept nearly arbitrary keyword parameters. For example: %typemap(in,parse="i",doc="integer") int "..."; The purpose of the keyword parameters is to supply code generation hints to the target language module. The intepretation of the parameters is language specific. *** NEW FEATURE *** 11/04/2001:beazley Slight semantic change to internal call/return by value handling. In previous versions of SWIG, call-by-value was translated into pointers. For example: double dot_product(Vector a, Vector b); turned into this: double wrap_dot_product(Vector *a, Vector *b) { return dot_product(*a,*b); } This translation was normally performed by the SWIG core, outside of the control of language modules. However, a side effect of this was a lot of bizarre typemap behavior. For example, if you did something like this: %typemap(in) int32 { ... } You would find that int32 was transformed into a pointer everywhere! (needless to say, such behavior is unexpected and quite awkward to deal with). To make matters worse, if a typedef was also used, the pointer behavior suddenly disappeared. To fix this, the pointer transformation is now pushed to the language modules. This produces wrappers that look roughly like this: double wrap_dot_product(Vector *a, Vector *b) { Vector arg1 = *a; Vector arg2 = *b; return dot_product(arg1,arg2); } This change also makes it easy to define typemaps for arbitrary undefined types. For example, you can do this (and it will work regardless what int32 is): %typemap(in) int32 { $1 = (int32) PyInt_AsLong($input); } *** POTENTIAL IMCOMPATIBILITY *** This change may break call/return by value code generation in some language modules. 11/03/2001:beazley Changed the name of the default typemaps to the following: %typemap() SWIGTYPE { ... an object ... } %typemap() SWIGTYPE * { ... a pointer ... } %typemap() SWIGTYPE & { ... a reference ... } %typemap() SWIGTYPE [] { ... an array ... } %typemap() enum SWIGTYPE { ... an enum value ... } %typemap() SWIGTYPE (CLASS::*) { ... pointer to member ... } These types are used as the default for all types that don't match anything else. See CHANGES log entry for 8/27/2000 for the old behavior. The role of these types is also described in Doc/Manual/Typemaps.html *** POTENTIAL INCOMPATIBILITY *** 10/25/2001:beazley Modified Guile and Mzscheme modules to support multi-argument typemaps. 10/25/2001: cheetah (william fulton) [Java] Fix to handle pointers to arrays. 10/24/2001:beazley Defining a typemap rule for enum SWIGENUM can now be used to define default behavior for enum variables. 10/22/2001:beazley Ruby module modified to support multi-argument typemaps. 10/22/2001:beazley The Ruby module can now handle functions with an arbitrary number of arguments. Previous versions were limited to to functions with only 9 or 16 arguments depending on the use of default arguments. Note: from some inspection of the Ruby interpreter source, the new approach might be a little faster as well. 10/18/2001:beazley Fixed a bug with forward class declarations and templates. class Foo ; Bug reported by Irina Kotlova. 10/16/2001:beazley Support for multivalued typemaps added. The typemaps are specified using the syntax below. Within each typemap, variable substitution is handled as follows: %typemap(in) (int argc, char *argv[]) { $arg; // The input object in the target language $1; // C local variable for first argument $2; // C local variable for second argument // These variables refer to either argument $1_type, $1_ltype, $1_basetype, etc... (argc) $2_type, $2_ltype, $2_basetype, etc... (argv[]) // Array dimension of argv $2_dim0 } Basically any variable that was available in normal typemaps is available for either argument by prefacing the variable name by '$n_' where n is the argument position. Notes: (1) Multi-valued typemaps can only be applied to a single object in the target scripting language. For example, you can split a string into a (char *, int) pair or split a list into a (int, char []) pair. It is not possible to map multiple objects to multiple arguments. (2) To maintain compatibility with older SWIG versions, the variables such as $target and $type are preserved and are mapped onto the first argument only. (3) This should not affect compatibility with older code. Multi-valued typemaps are an extension to typemap handling. Single valued typemaps can be specified in the usual way. The old $source and $target variables are officially deprecated. Input variables are referenced through $arg$ and output values are reference through $result$. *** NEW FEATURE *** 10/16/2001:beazley Added parsing support for multivalued typemaps. The syntax is a little funky, but here goes: // Define a multivalued typemap %typemap(in) (int argc, char *argv[]) { ... typemap code ... } // Multivalued typemap with locals %typemap(in) (int argc, char *argv[])(int temp) { ... typemap code ... } // Copy a multivalued typemap %typemap(in) (int argcount, char **argv) = (int argc, char *argv[]); // Apply a multivalued typemap %apply (int argc, char *argv[]) { (int argcount, char **argv) }; Note: this extra parsing support is added for future extension. No language modules currently support multi-valued typemaps. 10/11/2001:beazley Modified the typemap matching code to discard qualifiers when checking for a match. For example, if you have a declaration like this: void blah(const char *x); The typemap checker checks for a match in the following order: const char *x const char * char *x char * If typedef's are involved, qualifier stripping occurs before typedef resolution. So if you had this, typedef char *string; void blah(const string x); typemap checking would be as follows: const string x const string string x string const char *x const char * char *x char * The primary reason for this change is to simplify the implementation of language modules. Without qualifier stripping, one has to write seperate typemaps for all variations of const and volatile (which is a pain). *** POTENTIAL INCOMPATIBILITY *** Typemaps might be applied in places where they weren't before. 10/9/2001: beazley SWIG now generates wrappers that properly disambiguate overloaded methods that only vary in constness. For example: class Foo { ... void blah(); void blah() const; ... }; To handle this, the %rename directive can be used normally. %rename(blah_const) blah() const; In the resulting wrapper code, method calls like this are now generated: (obj)->blah() // Non-const version ((Foo const *)obj)->blah() // const version This should force the right method to be invoked. Admittedly, this is probably obscure, but we might as well get it right. 10/8/2001: beazley The preprocessor now ignores '\r' in the input. This should fix the following bug: [ #468416 ] SWIG thinks macro defs are declarations? 10/8/2001: beazley Added support for ||, &&, and ! in constants. This fixes SF [ #468988 ] Logical ops break preprocessor. However, at this time, constants using these operators are not supported (the parser will issue a warning). 10/4/2001: beazley Added -show_templates command line option. This makes SWIG display the code it actually parses to generate template wrappers. Mostly useful for debugging. *** NEW FEATURE *** 10/4/2001: beazley Change to semantics of %template directive. When using %template, the template arguments are handled as types by default. For example: %template(vecint) vector; %template(vecdouble) vector; To specify a template argument that is *not* a type, you need to use default-value syntax. For example: %template(vecint) vector; %template(vecdouble) vector; In this case, the type name doesn't really matter--only the default value (e.g., 50, 100) is used during expansion. This differs from normal C++, but I couldn't figure out a better way to do it in the parser. Might implement an alternative later. *** POTENTIAL INCOMPATIBILITY *** 10/4/2001: beazley Major changes to template handling in order to provide better integration with the C++ type-system. The main problem is as follows: Suppose you have a template like this: template void blah(const T x) { stuff }; Now suppose, that you instantiate the template on a type like this in SWIG: %template(blahint) blah; In C++, this is *supposed* to generate code like this: void blah(int *const x) { stuff }; However, in SWIG-1.3.9, the template substitution gets it wrong and produces void blah(const int *x) { stuff }; (notice the bad placement of the 'const' qualifier). To fix this, the SWIG parser now generates implicit typedefs for template type arguments that produces code roughly equivalent to doing this: typedef int *__swigtmpl1; %template(blahint) blah<__swigtmpl1>; which generates code like this: void blah(const __swigtmpl1 x) { stuff }; Since this is correct in both C++ and SWIG, it provides the right semantics and allows everything to compile properly. However, to clean up the generated code a little bit, the parser keeps track of the template types and performs back-substitution to the original type when building the parse tree. Thus, even though the implicit typedef is used in the input and may appear in the generated wrapper file (for proper compilation), the parse tree will hide a lot of these details. For example: void blah(const __swigtmpl1 x) { stuff }; will look like it was declared as follows (which is what you want): void blah(int *const x) { stuff } The only place you are likely to notice the typedef hack is in bodies of template functions. For example, if you did this, template class blah { ... %addmethods { void spam() { T tempvalue; ... } } } you will find that 'T tempvalue' got expanded into some strange typedef type. This *still* compiles correctly so it's not a big deal (other than looking kind of ugly in the wrapper file). 10/4/2001: beazley Fixed some inheritance problems in Tcl Object interface. 10/1/2001: beazley Tcl module has changed to use byte-backed pointer strings. This implementation should be safe on 64-bit platforms. However, the order in which digits appear in pointer values no longer directly corresponds to the actual numerical value of a pointer (on little-endian machines, pairs of digits appear in reverse order). 10/1/2001: beazley Perl5 module is now driven by a configuration file 'perl5.swg' in the SWIG library. 10/1/2001: beazley The perl5 module no longer tries to apply the "out" typemap in code generated for magic variables. I'm surprised that this ever worked at all (since all of the code that was there was wrong anyways). Use the "varout" typemap to handle global variables. 10/1/2001: beazley Fixed a bug related to character array members of structures. For example: struct Foo { char name[32]; }; SWIG is normally supposed to return a string, but this was broken in 1.3.9. The reason it was broken was actually due to a subtle new feature of typemaps. When a data member is set to an array like this, the return type of the related accessor function is actually set to an array. This means that you can now write typemaps like this: %typemap(python,out) char [ANY] { $target = PyString_FromStringAndSize($source,$dim0); } This functionality can be used to replace the defunct memberout typemap in a more elegant manner. 9/29/2001: beazley Some further refinement of qualified C++ member functions. For example: class Foo { ... void foo() const; ... }; (i) The SWIG parser was extended slightly to allow 'volatile' and combinations of 'const' and 'volatile' to be used. This is probably rare, but technically legal. Only added for completeness. (ii) For the purposes of overloading, qualified and non-qualified functions are different. Thus, when a class has methods like this: void foo(); void foo() const; Two distinct methods are declared. To deal with this, %rename and similar directives have been extended to recognize const. Thus, one can disambiguate the two functions like this: %rename(fooconst) Foo::foo() const; or simply ignore the const variant like this: %ignore Foo::foo() const; Note: SWIG currently has no way to actually invoke the const member since the 'const' is discarded when generating wrappers for objects. 9/27/2001: beazley New directive. %namewarn can be used to issue warning messages for certain declaration names. The name matching is the same as for the %rename directive. The intent of this directive is to issue warnings for possible namespace conflicts. For example: %namewarn("print is a python keyword") print; The name matching algorithm is performed after a name has been resolved using %rename. Therefore, a declaration like this will not generate a warning: %rename("Print") print; ... void print(); /* No warning generated */ Since the warning mechanism follows %rename semantics, it is also to issue warnings for specific classes or just for certain member function names. (Dave - I've been thinking about adding something like this for quite some time. Just never got around to it) *** NEW FEATURE *** 9/27/2001: beazley Enhanced the %ignore directive so that warning messages can be issued to users. This is done using %ignorewarn like this: %ignorewarn("operator new ignored") operator new; The names and semantics of %ignorewarn is exactly the same as %ignore. The primary purpose of this directive is for module writers who want to ignore certain types of declarations, but who also want to alert users about it. A user might also use this for debugging (since messages will appear whenever an ignored declaration appears). *** NEW FEATURE *** 9/26/2001: beazley Super-experimental support for overloaded operators. This implementation consists of a few different parts. (i) Operator names such as 'operator+' are now allowed as valid declarator names. Thus the 'operator' syntax can appear *anyplace* a normal declarator name was used before. On the surface, this means that operators can be parsed just like normal functions and methods. However, it also means that operator names can be used in many other SWIG directives like %rename. For example: %rename(__add__) Complex::operator+(const Complex &); (ii) Operators are wrapped *exactly* like normal functions and methods. Internally, the operator name is used directly meaning that the wrapper code might contain statements like this: arg0->operator*((Complex const &)*arg1); This all seems to parse and compile correctly (at least on my machine). (iii) SWIG will no longer wrap a declaration if its symbol table name contains illegal identifier characters. If illegal characters are detected, you will see an error like this: Warning. Can't wrap operator* unless renamed to a valid identifier. The only way to fix this is to use %rename or %name to bind the operator to a nice name like "add" or something. Note: the legal identifier characters are determined by the target language. There are certain issues with friend functions and operators. Sometimes, friends are used to define mixed operators such as adding a Complex and a double together. Currently, SWIG ignores all friend declarations in a class. A global operator declaration can probably be made to work, but you'll have to rename it and it probably won't work very cleanly in the target language since it's not a class member. SWIG doesn't know how to handle operator specifications sometimes used for automatic type conversion. For example: class String { ... operator const char*(); ... }; (this doesn't parse correctly and generates a syntax error). Also: operators no longer show up as separate parse-tree nodes (instead they are normal 'cdecl' nodes). I may separate them as a special case later. See Examples/python/operator for an example. *** SUPER-EXPERIMENTAL NEW FEATURE *** Version 1.3.9 (September 25, 2001) ================================== 9/25/2001: beazley Fixed parsing problem with type declarations like 'char ** const'. SWIG parsed this correctly, but the internal type was represented incorrectly (the pointers and qualifiers were in the wrong order). 9/25/2001: beazley Withdrew experimental feature (noted below) that was causing serious parsing problems. Version 1.3.8 (September 23, 2001) ================================== 9/23/2001: beazley Included improved distutils setup.py file in the Tools directory (look for the setup.py.tmpl file). Contributed by Tony Seward. 9/23/2001: beazley Included two new RPM spec files in the Tools directory. Contributed by Tony Seward and Uwe Steinmann. 9/21/2001: beazley Fixed SF Bug [ #463635 ] Perl5.swg does not compile in Visual C++ 9/21/2001: beazley Two new directives control the creation of default constructors and destructors: %nodefault %makedefault These replace %pragma nodefault and %pragma makedefault. (old code will still work, but documentation will only describe the new directives). 9/21/2001: beazley Fixed SF Bug [ #462354 ] %import broken in 1.3.7. 9/20/2001: beazley Parser modified to ignore out-of-class constructor and destructor declarations. For example: inline Foo::Foo() : Bar("foo") { } inline Foo::~Foo() { } Suggested by Jason Stewart. *** EXPERIMENTAL FEATURE *** 9/20/2001: beazley Modified the parser to ignore forward template class declarations. For example: template class MapIter; Suggested by an email example from Irina Kotlova. 9/20/2001: beazley Fixed problem with undeclared tcl_result variable in the "out" typemap for Tcl. Reported by Shaun Lowry. 9/20/2001: beazley Incorporated changes to make SWIG work with ActivePerl. Contributed by Joel Reed. 9/20/2001: beazley Slight change to the parsing of C++ constructor initializers. For example: class Foo : public Bar { public: Foo() : Bar(...) {...} }; SWIG now discards the contents of the (...) regardless of what might enclosed (even if syntactically wrong). SWIG doesn't need this information and there is no reason to needless add syntax rules to handle all of the possibilities here. 9/20/2001: beazley Change to typemaps for structure members. If you have a structure like this: struct Vector { int *bar; }; The member name 'bar' is now used in any accessor functions. This allows the "in" typemap to be used when setting the value. For example, this typemap %typemap(python,in) int *bar { ... } now matches Vector::bar. It should be noted that this will also match any function with an argument of "int *bar" (so you should be careful). *** NEW FEATURE. POTENTIAL INCOMPATIBILITY *** 9/20/2001: beazley Fixed SF bug #462642 setting string values in structures 9/20/2001: beazley Fixed SF bug #462398 problem with nested templates. 9/20/2001: beazley Fixed SF bug #461626 problem with formatting and C++ comments. 9/20/2001: beazley Fixed SF bug #462845 Wrong ownership of returned objects. 9/19/2001: beazley Fixed SF bug #459367. Default constructors for classes with pure virtual methods. 9/19/2001: beazley Fixed problem with default arguments and class scope. For example: class Foo { public: enum bar { FOO, BAR }; void blah(bar b = FOO); ... } SWIG now correctly generates a default value of "Foo::FOO" for the blah() method above. This used to work in 1.1, but was broken in 1.3.7. Bug reported by Mike Romberg. Version 1.3.7 (September 3, 2001) ================================== 9/02/2001: beazley Added special %ignore directive to ignore declarations. This feature works exactly like %rename. For example: %ignore foo; // Ignore all declarations foo %ignore ::foo; // Only ignore foo in global scope %ignore Spam::foo; // Only ignore in class Spam %ignore *::foo; // Ignore in all classes %ignore can also be parameterized. For example: %ignore foo(int); %ignore ::foo(int); %ignore Spam::foo(int); %ignore *::foo(int); *** NEW FEATURE *** 9/02/2001: cheetah (william fulton) [Java] shadowcode pragma modified so that the code that is output in the shadow file is placed relative to where it is placed in the c/c++ code. This allows support for JavaDoc function comments. 9/01/2001: beazley Fixed SF Patch [ #447791 ] Fix for python -interface option. Submitted by Tarn Weisner Burton. 9/01/2001: beazley SWIG no longer generates default constructors/destructors for a class if it only defines a private/protected constructor or destructor or if any one of its base classes only has private constructors/destructors. This was reported in SF Patch [ #444281 ] nonpublic/default/inhereted ctor/dtor by Marcelo Matus. 9/01/2001: beazley Added patch to Perl5 module that allows constants to be wrapped as constants that don't require the leading $. This feature is enabled using the -const option. Patch contributed by Rich Wales. *** NEW FEATURE *** 8/31/2001: beazley Added parsing support for the 'volatile' type qualifier. volatile doesn't mean anything to SWIG, but it is needed to properly generate prototypes for declarations that use it. It's also been added to make the SWIG type system more complete. *** NEW FEATURE *** 8/30/2001: beazley Added support for parameterized %rename directive. *** This new feature can be used to greatly simplify the task of resolving overloaded methods and functions. *** In prior versions of SWIG, the %rename directive was used to consistently apply an identifier renaming. For example, if you said this: %rename foo bar; Every occurrence of 'foo' would be renamed to 'bar'. Although this works fine for resolving a conflict with a target language reserved word, it is useless for for dealing with overloaded methods. This is because all methods are simply renamed to the same thing (generating the same conflict as before). Therefore, the only way to deal with overloaded methods was to go through and individually rename them all using %name. For example: class Foo { public: virtual void bar(void); %name(bar_i) virtual void bar(int); ... }; To make matters worse, you had to do this for all derived classes too. class Spam : public Foo { public: virtual void bar(void); %name(bar_i) virtual void bar(int); ... }; Needless to say, this makes it extremely hard to resolve overloading without a lot of work and makes it almost impossible to use SWIG on raw C++ .h files. To fix this, %rename now accepts parameter declarators. The syntax has also been changed slightly. For example, the following declaration renames all occurrences of 'bar(int)' to 'bar_i', leaving any other occurrence of 'bar' alone. %rename(bar_i) bar(int); Using this feature, you can now selectively rename certain declarations in advance. For example: %rename(bar_i) bar(int); %rename(bar_d) bar(double); // Include raw C++ header %include "header.h" When %rename is used in this manner, all occurrence of bar(int) are renamed wherever they might occur. More control is obtained through explicit qualification. For example, %rename(bar_i) ::bar(int); only applies the renaming if bar(int) is defined in the global scope. The declaration, %rename(bar_i) Foo::bar(int); applies the renaming if bar(int) is defined in a class Foo. This latter form also supports inheritance. Therefore, if you had a class like this: class Spam : public Foo { public: void bar(int); } The Spam::bar(int) method would also be renamed (since Spam is a subclass of Foo). This latter feature makes it easy for SWIG to apply a consistent renaming across an entire class hierarchy simply by specifying renaming rules for the base class. A class wildcard of * can be used if you want to renaming all matching members of all classes. For example: %rename(bar_i) *::bar(int); will rename all members bar(int) that are defined in classes. It will not renamed definitions of bar(int) in the global scope. The old use of %rename is still supported, but is somewhat enhanced. %rename(foo) bar; // Renames all occurrences of 'bar'. %rename(foo) ::bar; // Rename all 'bar' in global scope only. %rename(foo) *::bar; // Rename all 'bar' in classes only. %rename(foo) Foo::bar; // Rename all 'bar' defined in class Foo. *** NEW FEATURE *** 8/30/2001: beazley Added support for data-member to member-function transformation. For example, suppose you had a structure like this: struct Vector { double x,y; }; Now suppose that you wanted to access x and y through a member function interface instead of the usual SWIG behavior. For example: f.set_x(3.4) # instead of f.x = 3.4 x = f.get_x() # instead of x = f.x To do this, simply use the new %attributefunc directive. For example: %attributefunc(get_%s,set_%s) struct Vector { double x,y; }; %noattributefunc The arguments to %attributefunc are C-style printf format strings that determine the naming convention to use. %s is replaced with the actual name of the data member. SWIG provides a number of printf extensions that might help. For example, if you wanted to title case all of the attributes, you could do this: %attributefunc(get%(title)s,set%(title)s); This will turn an attribute 'bar' to 'getBar()' and 'setBar()'. (someone requested this long ago, but I finally figured how to implement it in a straightforward manner). *** EXPERIMENTAL NEW FEATURE *** 8/30/2001: beazley SWIG now automatically generates default constructors and destructors if none are defined. This used to be enabled with a command line switch -make_default, but most people want these functions anyways. To turn off this behavior use the -no_default option or include the following pragma in the interface file: %pragma no_default; This may break certain interfaces that defined their own constructors/destructors using the same naming convention as SWIG. If so, you will get duplicate symbols when compiling the SWIG wrapper file. *** POTENTIAL INCOMPATIBILITY *** 8/29/2001: beazley Changes to Perl5 shadow class code generation. Iterators are no longer supported (FIRSTKEY, NEXTKEY). Also, attribute access has been changed to rely on inheritance in order to provide better behavior across modules. 8/28/2001: beazley Various obscure improvements to the type system and classes. Strange declarations like this are now wrapped correctly (i.e., the generated wrapper code doesn't cause the C++ compiler to die with a type error). class Foo { public: typedef double Real; Real foo(Real (*op)(Real,Real), Real x, Real y); }; Inheritance of types is also handled correctly. 8/28/2001: beazley Changes to class wrappers. When SWIG sees two classes like this, class X { public: void foo(); ... } class Y : public X { public: void bar(); ... } it now only generates two wrapper functions: X_foo(X *x) { x->foo(); } Y_bar(Y *y) { y->bar(); } Unlike SWIG1.15, the foo() method does *not* propagate to a wrapper function Y_foo(). Instead, the base class method X_foo() must be used. This change should not affect modules that use shadow classes, but it might break modules that directly use the low-level C wrappers. This change is being made for a number of reasons: - It greatly simplifies the implementation of SWIG--especially with anticipated future changes such as overloaded methods. - It results in substantially less wrapper code--especially for big C++ class hierarchies (inherited declarations are no longer copied into every single derived class). - It allows for better code generation across multiple SWIG generated modules (code isn't replicated in every single module). *** POTENTIAL INCOMPATIBILITY *** 8/22/2001: cheetah (william fulton) Provided some Windows documentation in the Win directory and some Visual C++ project files for running examples on Windows. 8/28/2001: mkoeppe [Guile] Handle renamed overloaded functions properly; thanks to Marc Zonzon for the patch. See the new test case name_cxx. 8/27/2001: mkoeppe [Tcl] Removed lots of warnings issued by the Sun Forte compilers, which were caused by mixing function pointers of different linkages (C++/C). 8/23/2001: mkoeppe Improved the MzScheme module by porting Guile's pointer type checking system and making type dispatch typemap-driven. 8/22/2001: beazley Entirely new symbol table processing. SWIG should be able to report much better error messages for multiple declarations. Also, the new symbol table allows for overloaded functions (although overloading isn't quite supported in the language modules yet). 8/22/2001: cheetah (william fulton) * [Java] %new support added. * [Java] Package JNI name refixed! 8/19/2001: beazley Python module modified to support pointers to C++ members. This is an experimental feature. *** NEW FEATURE *** 8/19/2001: beazley Added limited parsing and full type-system support for pointers to members. None of SWIG's language modules really know how to deal with this so this is really only provided for completeness and future expansion. Note: SWIG does not support pointers to members which are themselves pointers to members, references to pointers to members, or other complicated declarations like this. *** NEW FEATURE *** 8/19/2001: beazley SWIG is much better at parsing certain C++ declarations. Operators and friends generally don't cause anymore syntax errors. However, neither are really supported. 8/18/2001: beazley Added *highly* experimental support for wrapping of C++ template declarations. Since C++ templates are essentially glorified macros and SWIG has a fully operational C preprocessor with macro support, the parser now converts template declarations to macros. For example, a function template like this template T max(T a, T b); is internally converted into a macro like this: %define %_template_max(__name,T) %name(__name) T max(T a, T b); %enddef To instantiate a version of the template, a special %template declaration is used like this: %template(maxint) max; %template(maxdouble) max; The parameter to the %template directive must be proper C identifier that's used to uniquely name the resulting instantiation. When used, the the expanded macro looks like this: %name(maxint) int max(int a, int b); %name(maxdouble) double max(double a, double b); A similar technique is used for template classes. For instance: template class vector { T *data; int sz; public: vector(int nitems); T *get(int n); ... }; Gets converted into a macro like this: %define %_template_vector(__name, T) %{ typedef vector __name; %} class __name { T *data; int sz; public: __name(int nitems); T *get(int n); ... }; typedef __name vector; %enddef A specific instantiation is created in exactly the same way: %template(intvec) vector; The resulting code parsed by SWIG is then: %{ typedef vector intvec; %} class intvec { int *data; int sz; public: intvec(int nitems); int *get(int n); ... }; typedef intvec vector; Note: the last typedef is non-standard C and is used by SWIG to provide an association between the name "intvec" and the template type "vector". CAUTION: This is an experimental feature and the first time SWIG has supported C++ templates. Error reporting is essential non-existent. It will probably break in certain cases. *** EXPERIMENTAL NEW FEATURE **** 8/15/2001: beazley Change to wrapping of multi-dimensional arrays. Arrays are now properly mapped to a pointer to an array of one less dimension. For example: int [10]; --> int * int [10][20]; --> int (*)[20]; int [10][20][30]; --> int (*)[20][30]; This change may break certain SWIG extensions because older versions simply mapped all arrays into a single pointer such as "int *". Although possibly unusual, the new version is correct in terms of the C type system. *** POTENTIAL INCOMPATIBILITY *** 8/06/2001: cheetah (william fulton) * [Java] Array setters generated for struct/class array members. 8/13/2001: beazley Many improvements to Tcl/Perl/Python modules to better work with multiple interface files and the %import directive. 8/13/2001: beazley Fixed up the behavior of %import in the Python module. SWIG no longer pollutes the module namespace by using 'from module import *' to refer to the other module. Instead, it does a proper 'import module'. Also, SWIG may work a lot better when importing modules that include references to other imported modules. 8/13/2001: mkoeppe Added new typemap substitutions, generalizing those of the Guile-specific 5/27/2001 changes: * $descriptor is the same as SWIGTYPE$mangle, but also ensures that the type descriptor of this name gets defined. * $*type, $*ltype, $*mangle, $*descriptor are the same as the variants without star, but they REMOVE one level of pointers from the type. (This is only valid for pointer types.) * $&type, $<ype, $&mangle, $&descriptor are the same as the variants without ampersand, but they ADD one level of pointers to the type. The Guile-specific substitution $basedescriptor was removed because it was useless. 8/12/2001: beazley The %extern directive is now deprecated and withdrawn. The purpose of this directive was to import selected definitions from other interface files and headers. However, the same functionality is better handled through %import. This leaves SWIG with two file inclusion directives: %include filename - Inserts into current interface %import filename - Import types and classes from another module *** POTENTIAL INCOMPATIBILITY *** 8/09/2001: beazley Added new support for wrapping C/C++ callback functions. A common problem with some C libraries is that many functions take a function pointer as an argument. For example: int do_op(..., int (*op)(int,int), ...); Unfortunately, the only way to call such a function is to pass it a function pointer of some compatible type. In previous versions of SWIG, you had to solve this problem with some really gross hacks. For example, if you wanted to use the following function as a callback, int foo(int, int); you had to install a pointer to it as a constant. For example: %constant int (*FOO)(int,int) = foo; or const int (*FOO)(int,int) = foo; or if you had a really old SWIG version: typedef int (*OP_FUNC)(int,int); int do_op(..., OP_FUNC, ...); const OP_FUNC FOO = foo; Now, you can do one of two things: %constant int foo(int,int); This creates a constant 'foo' of type int (*)(int,int). Alternatively, you can do this: %callback("%s"); int foo(int,int); int bar(int,int); %nocallback; In this case, the functions are installed as constants where the name is defined by the format string given to %callback(). If the names generated by the format string differ from the actual function name, both a function wrapper and a callback constant are created. For example: %callback("%(upper)s"); int foo(int,int); int bar(int,int); %nocallback; Creates two wrapper functions 'foo', 'bar' and additionally creates two callback constants 'FOO', 'BAR'. Note: SWIG still does not provide automatic support for writing callback functions in the target language. *** NEW FEATURE *** 8/06/2001: cheetah (william fulton) * struct nesting fixes as per SF bug #447488. 8/03/2001: beazley The %name directive now applies to constants created with #define and %constant. However, most language modules were never written to support this and will have to be modified to make it work. Tcl, Python, and Perl modules are working now. *** NEW FEATURE *** 8/03/2001: beazley Massive changes and simplification of C declaration parsing. Although SWIG is still not a full C parser, its ability to handle complex datatypes including pointers to functions and pointers to arrays has been vastly improved. 8/03/2001: cheetah (william fulton) * Distribution fixes: autoconf no longer needed to install SWIG. 8/02/2001: beazley Removed two undocumented parsing features. SWIG no longer supports out-of-class static function or variable declarations. For example: static int Foo::bar; This feature may return if there is sufficient demand. However, since SWIG is most often used with header files, it is more likely for these definitions to be included in the class definition. *** POTENTIAL INCOMPATIBILITY *** 8/02/2001: cheetah (william fulton) * Cleanup of the GIFPlot examples. Upgraded Java GIFPlot example. 8/01/2001: cheetah (william fulton) * [Java] Efficiency changes: _cPtr used where possible rather than getCPtr(). Bug fixes for inheritance - derived class sometimes didn't delete the c memory when _delete() was called. * [Java] Abstract c++ classes are wrapped with a java abstract shadow class. Also a pure virtual function is mapped with an abstract method. * The default output file has always been _wrap.c. It is now _wrap.cxx if the -c++ commandline option is passed to swig. This has been done as otherwise c++ code would appear in a c file. *** POTENTIAL INCOMPATIBILITY *** 7/31/2001: beazley Modified the %constant directive to be more C-like in syntax. The syntax is now: %constant NAME = VALUE; %constant TYPE NAME = VALUE; For example: %constant Foo *Bar = &Spam; A more subtle case is as follows: %constant int (*FOO)(int,int) = blah; *** POTENTIAL INCOMPATIBILITY *** Modules that were using the %constant directive directly will need to be modified. 7/30/2001: beazley Removed obscure and undocumented form of the %inline directive: %inline int blah(int a, int b) { ... } *** POTENTIAL INCOMPATIBILITY *** (note: this feature was never documented and is withdrawn) 7/30/2001: beazley Removed support for functions with no explicitly declared return type. For example: foo(int); In C, such functions were implicitly assumed to return an 'int'. In C++, this is illegal. Either way, it's considered bad style. Removing support for this in SWIG will simplify certain issues in parsing. *** POTENTIAL INCOMPATIBILITY *** 7/30/2001: mkoeppe * Partial merge from the CVS trunk. The Source/DOH directory and most of the Source/Swig directory is up-to-date now. * [Guile] %scheme is now a macro for %insert("scheme"). New syntax: %scheme "FILENAME"; New syntax: %scheme %{ SCHEME-CODE %} New macros %multiple_values, %values_as_list, %values_as_vector. 7/29/2001: beazley %readonly and %readwrite have been turned into SWIG pragmas. %pragma(swig) readonly and %pragma(swig) readwrite. Macros are used to provide backwards compatibility. 7/29/2001: beazley Minor changes to %pragma directive. %pragma must always be directed to a specific language. For example: %pragma(swig) make_default; %pragma(perl5) include = "blah.i"; Also extended the pragma directive to allow code blocks %pragma(foo) code = %{ ... some code ... %} *** POTENTIAL INCOMPATIBILITY *** 7/29/2001: beazley Change to the way 'const' variables are wrapped. In previous versions of SWIG, a 'const' variable was wrapped as a constant. Now, 'const' variables are wrapped as read-only variables. There are several reasons for making this change, mostly pertaining to subtle details of how 'const' actually works. This will probably break old interfaces that used 'const' to create constants. As a replacement, consider using this: const int a = 4; ===> %constant int a = 4; *** POTENTIAL INCOMPATIBILITY *** 7/29/2001: beazley Reorganization and simplification of type parsing. Types with 'const' should work correctly now. 7/29/2001: beazley Most swig directives related to the documentation system are now deprecated. 7/29/2001: beazley Removed support for Objective-C in order to simplify parser reconstruction. Will return if there is sufficient demand. *** POTENTIAL INCOMPATIBILITY *** 7/29/2001: beazley Code inclusion has been modified in the parser. A common directive %insert is now used for everything. This inserts a file into the output: %insert(header) "foo.swg" This inserts some inline code into the output %insert(header) %{ ... some code ... %} There are five predefined targets for the insert directive: "header" - Header section of wrapper file "runtime" - Runtime section of wrapper file "wrapper" - Wrapper section "init" - Initialization function "null" - Nothing. Discard. The following directives are still supported, but are now defined in terms of macros: %{ ... %} -> %insert(header) %{ ... %} %init %{ ... %} -> %insert(init) %{ ... %} %wrapper %{ ... %} -> %insert(wrapper) %{ ... %} %runtime %{ ... %} -> %insert(runtime) %{ ... %} Language modules can define new named targets by using the C API function Swig_register_filebyname() (see main.cxx). For example, if you wanted to expose a shadow class file, you could do this: Swig_register_filebyname("shadow", f_shadow); Then in the interface file: %insert(shadow) %{ ... %} Note: this change should not affect any old interfaces, but does open up new possibilities for enhancements. 7/29/2001: beazley SWIG now always includes a standard library file 'swig.swg'. This file defines a large number of macro definitions that define the behavior of various SWIG directives. Previously, all SWIG directives were handled as special cases in the parser. This made the parser a large bloated mess. Now, the parser is stripped down to a few simple directives and macros are used to handle everything else. 7/26/2001: cheetah (william fulton) * Fixes for Sourceforge bug #444748 - new testcase cpp_static: [TCL] Class with just static member variable/function fix [Java] Fixed static variables support [Ruby] Static variables workaround removed 7/27/2001: mkoeppe * stype.c (SwigType_default): Strip qualifiers first. The default type of "int * const" is now "SWIGPOINTER *". * main.cxx: Define "__cplusplus" in SWIG's preprocessor if in C++ mode. * [Guile]: Added some support for arrays and C++ references, fixing the "constant_pointers" test case. * Moved most tests from the old Guile-specific test-suite to the new test-suite. Also moved perl5/pointer-cxx example there. 7/26/2001: cheetah (william fulton) * Test-suite added. * Initial testcases: constant_pointers cpp_enum defines sizeof_pointers unions virtual_destructor * Make clean improvements. 7/24/2001: cheetah (william fulton) * [Java] Underscores in the package name and/or module name no longer give linking problems. 7/17/2001: cheetah (william fulton) * More parser bug fixes for constant pointers 7/19/2001: mkoeppe * [Guile] Aesthetic improvement in variable wrappers. 7/18/2001: beazley * Fixed core-dump problem in pointer library when freeing character arrays. SF Bug [ #415837 ] pointer lib core dump 7/18/2001: beazley * Fixed problem with default destructors and shadow classes. SF bug #221128. 7/18/2001: beazley * To provide better line-number tracking in interfaces with lots of macros, special locator comments are now generated by the SWIG preprocessor. For example: /*@foo.i,42,BLAH@*/expanded macro/*@@*/ The first /*@...@*/ sequence sets the context to point to the macro code. The /*@@*/ comment terminates the context. The SWIG parser should ignore all of the locator comments as should the C compiler (should such comments end up in generated wrapper code). 7/18/2001: mkoeppe * The parser now handles severely constified types in typemaps. This introduced a new shift/reduce conflict, but only with a heuristic function-pointer catch-all rule. * [Guile]: Added typemaps for severely constified types. * Fixed the "template-whitespace" problem by canonicalizing whitespace, especially around angle brackets and commas. 7/17/2001: mkoeppe * [Guile]: A Scheme file is emitted if the -scmstub FILE.SCM command-line option is used. The %scheme directive (implemented as a macro for a pragma) allows to insert arbitrary code here. In "simple" and "passive" linkage, the file gets filled with define-module and export declarations. 7/17/2001: cheetah (william fulton) * Parser bug fix to support constant pointers, eg int* const ptr. Fixed everywhere - variables, parameters, return types etc. Note that when wrapping a constant pointer variable only the getter is generated. 7/17/2001: mkoeppe * Fixed SF bug #441470 (#define X "//" would not be parsed, see test-suite entry "preproc-1"), reported by T. W. Burton . * Changed the type of character constants to "char", rather than "char *". Changed the individual language modules to keep the old behaviour, except for the Guile module, where it is desired to make them Scheme characters. This fixes SF bug #231409, test-suite entry "char-constant". * Applied patch for DOH/Doh/memory.c by Les Schaffer (avoid required side effects in assert). 7/17/2001: cheetah (william fulton) * Bug fix in parser for virtual destructor with void as parameter * Bug fix in parser #defines embedded within classes/structs/unions Consequently %constant can now also be placed within a struct/class/union. * Bug fix in parser to allow sizeof(*I_am_a_pointer) within a #define 7/16/2001: mkoeppe * Added changes for the Macintosh contributed by Luigi Ballabio . * Some "const" fixes in the code. * [Guile]: Made the constant-wrapper functions much shorter. 7/13/2001: mkoeppe * [Guile]: Some "const" fixes for Guile version 1.3.4. * Handle anonymous arguments with default values and static array members of classes. Both bugs reported by Annalisa Terracina ; see the files Examples/guile/test-suite/static-array-member.i and anonymous-arg.i. Version 1.3.6 (July 9, 2001) ============================= 7/09/2001: cheetah (william fulton) * GIFPlot examples: FOREGROUND and BACKGROUND definition missing after TRANSPARENT #define fix in GIFPlot 7/03/2001: beazley Fixed up the version numbers so that the release is known as 1.3.6. All future releases should have a similar version format. 7/02/2001: mkoeppe * [Python]: Prevent the problem of self.thisown not being defined if the C++ class constructor raised an exception. Thanks to Luigi Ballabio . 6/29/2001: mkoeppe * More portability fixes; fixed "gcc -Wall" warnings. 6/29/2001: cheetah (william fulton) * GIFPlot examples: TRANSPARENT #define multiple times on Solaris (clashes with stream.h). * Multiple definition bug fix for shadow classes. The perl and python modules had workarounds which have been replaced with fixes in the core. Many of the Language::cpp_xxxx functions now set a flag which the derived classes can access through is_multiple_definition() to see whether or not code should be generated. The code below would have produced varying degrees of incorrect shadow class code for the various modules: class TestClass { public: TestClass() {} TestClass(int a) {} ~TestClass() {} unsigned long xyz(short k) {} unsigned long xyz(int n) {} static void static_func() {} static void static_func(int a) {} }; void delete_TestClass(int a); 6/27/2001: mkoeppe * [Perl] Another const-related portability fix. 6/26/2001: cheetah (william fulton) * [Java] Added in cpp_pragma() support with a host of new pragmas - see jswig.html. These are designed for better mixing of Java and c++. It enables the user to specify pure Java classes as bases and/or interfaces for the wrapped c/c++. * [Java] Old pragmas renamed. Warning given for the moment if used. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 6/25/2001: mkoeppe * Incorporated more build changes contributed by Wyss Clemens for swig/ruby on cygwin. 6/20/2001: cheetah (william fulton) * Makefile mods so that 'make check' uses the swig options in the makefiles * [Java] Removed Generating wrappers message * [Java] NULL pointer bug fix * [Java] Bug fix for Kaffe JVM 6/20/2001: mkoeppe * SWIG_TypeQuery from common.swg now returns a swig_type_info* rather than a void*. This fixes a problem when using pointer.i and C++, as illustrated by the new test-suite example perl5/pointer-cxx. * Portability fixes (const char *). * Incorporated build changes contributed by Wyss Clemens , which make swig runnable on cygwin. 6/19/2001: cheetah (william fulton) * [Java] Bug fix for SF bug #211144. This fix is a workaround until fixed in the core. 6/19/2001: mkoeppe * [Guile]: Portability fixes for use with the Sun Forte compilers. * [Tcl]: Portability fix (const char *). * [Tcl]: Configure now first tries to find a tclConfig.sh file in order to find the Tcl include directory, library location and library name. * [Python]: Added a few possible library locations. 6/18/2001: mkoeppe * [Guile]: Don't call scm_c_export if nothing is to be exported. Don't warn on %module if module has been set already (this frequently occurs when %import is used). 6/16/2001: mkoeppe * [Guile]: New "passive" linkage, which is appropriate for multi-module extensions without Guile module magic. 6/15/2001: mkoeppe * [Guile]: Fixed printing of smobs (space and angle were missing). * Properly generate type information for base classes imported with the %import directive. Thanks to Marcelo Matus for the report and the patch; this closes SF bug #231619; see also Examples/guile/test-suite/import*. * [Guile]: Fix casting between class and base class; the runtime type system had it the wrong way around; see Examples/guile/test-suite/casts.i * Make typemaps for SWIGPOINTER * with arg name take precedence over those without arg name, to match normal typemap precedence rules. * Fixed the random-line-numbers problem reported as SF bug #217310; thanks to Michael Scharf . * [Guile]: Handle the %name and %rename directives. * New syntax: %name and %rename now optionally take double quotes around the scripting name. This is to allow scripting names that aren't valid C identifiers. 6/14/2001: beazley Made a minor change to the way files are loaded in order to get file/line number reporting correct in the preprocessor. 6/14/2001: mkoeppe * The parser now understands the (non-standard) "long long" types. It is up to the individual language modules to provide typemaps if needed. Reported by Sam Steingold, SF bug #429176. * The parser now understands arguments like "const int * const i". This fixes SF bug #215649. * Fixed the Guile test-suite. 6/13/2001: mkoeppe Partial merge from the CVS trunk at tag "mkoeppe-merge-1". This covers the following changes: | 01/16/01: ttn | Wrote table of contents for Doc/engineering.html. Added section | on CVS tagging conventions. Added copyright to other docs. | 9/25/00 : beazley | Modified the preprocessor so that macro names can start with a '%'. | This may allow new SWIG "directives" to be defined as macros instead | of having to be hard-coded into the parser. | | *** Also a yet-to-be-documented quoting mechanism with backquotes | *** has been implemented? 6/13/2001: mkoeppe * When configure does not find a language, don't use default paths like /usr/local/include; this only causes build problems. * New directory: Examples/Guile/test-suite, where a few bugs in 1.3a5 are demonstrated. * Handle C++ methods that have both a "const" and a "throw" directive (see Examples/Guile/test-suite/cplusplus-throw.i); thanks to Scott B. Drummonds for the report and the fix. * Handle C++ pointer-reference arguments (like "int *& arg") (see Examples/Guile/test-suite/pointer-reference.i, reported as SF bug #432224). * [Ruby] Fixed typo in rubydec.swg; thanks to Lyle Johnson! * Don't stop testing when one test fails. * [Guile, MzScheme] Don't print "Generating wrappers...". 6/12/2001: mkoeppe [Guile] VECTORLENINPUT and LISTLENINPUT now have separate list length variables. TYPEMAP_POINTER_INPUT_OUTPUT attaches argument documentation involving SCM_TYPE to the standard pointer typemaps. INOUT is now an alias for BOTH. 6/12/2001: cheetah (william fulton) Some Java documentation added. [Java] Fixed bugs in import pragma and shadow pragma. 6/12/2001: mkoeppe Fix declarations of SWIG_define_class (Lib/ruby/rubydec.swg) and SWIG_TypeQuery (Lib/common.swg). Thanks to Lyle Johnson for the patches. 6/11/2001: mkoeppe [Guile] Use long instead of scm_bits_t; this makes the generated wrapper code compatible with Guile 1.3.4 again. Thanks to Masaki Fukushima for pointing this out. 6/11/2001: cheetah (william fulton) The generic INSTALL file from autoconf added. Few changes to README file. 6/11/2001: mkoeppe Fixed typo in Makefile.in; thanks to Greg Troxel . 6/08/2001: cheetah (william fulton) make check works again. Examples/GIFPlot configure generated by top level autoconf now. 6/08/2001: mkoeppe Another build change: The new script autogen.sh runs autoconf in the appropriate directories. The top-level configure also configures in Examples/GIFPlot. 6/07/2001: mkoeppe Made the Makefile work with non-GNU make again. 6/07/2001: cheetah (william fulton) [Java] Class/struct members that are arrays of pointers to classes/structs - Shadow class's get/set accessors now use Java classes instead of longs (pointers). [Java] Shadow classes will now clean up memory if function return type is a class/struct. [Java] New example called reference based on the same example from other modules. 6/06/2001: mkoeppe New configure option --with-release-suffix allows for attaching a suffix to the swig binary and the swig runtime libraries. Minor changes to the build system. "swig -swiglib" works again. If invoked with the new option "-ldflags", SWIG prints a line of linker flags needed to link with the runtime library of the selected language module. 6/06/2001: mkoeppe [Guile] gswig_list_p is an int, not a SCM. This typo caused warnings when compiling with a Guile configured with strict C type checking. In INPUT and BOTH typemaps generated by the SIMPLE_MAP macro, use the SCM_TO_C function to convert from Guile to C (rather than C_TO_SCM). Use scm_intprint to print pointers (rather than sprintf). Allow using "-linkage" instead of "-Linkage". 6/05/2001: cheetah (william fulton) [Java] Mods for using inherited c++ classes from Java [Java] New example called class based on the same example from other modules 6/05/2001: cheetah (william fulton) [Java] destructor (_delete()) was not aware of %name renaming [Java] extends baseclass did not know about %name renaming [Java] extends baseclass did extend even when the baseclass was not known to swig [Java] sometimes enum-declarations occurred before the Java class declaration [Java] unrelated enum initialisations no longer appear in Java class [Java] if module ends in '_' correct JNI names are now produced 6/04/2001: cheetah (william fulton) [Java] Shadow class mods - Modified constructor replaces newInstance(). _delete() now thread safe. getCPtr() replaces _self. _selfClass() removed as now redundant. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** [Java] Not all output java files had SWIG banner. New banner. [Java] Shadow class finalizers are output by default: Command line option -finalize deprecated and replaced with -nofinalize. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 6/ 1/2001: mkoeppe [Guile] Cast SCM_CAR() to scm_bits_t before shifting it. This is required for compiling with a Guile configured with strict C type checking. 6/ 1/2001: mkoeppe Added configure option "--with-swiglibdir". 5/31/2001: mkoeppe [Guile] Support multiple parallel lists or vectors in the typemaps provided by list-vector.i. New typemaps file, pointer-in-out.i. 5/25/2001: cheetah (william fulton) [Java] HTML update for examples. 5/28/2001: mkoeppe Minor changes to the build system. Added subdirectory for Debian package control files. 5/28/2001: mkoeppe [Guile] Build a runtime library, libswigguile. 5/28/2001: mkoeppe [Guile] New typemap substitution $*descriptor. Use the {} syntax, rather than the "" syntax for the standard typemaps, in order to work around strange macro-expansion behavior of the SWIG preprocessor. This introduces some extra braces. 5/27/2001: mkoeppe [Guile] Handle pointer types with typemaps, rather than hard-coded. New typemap substitutions $descriptor, $basedescriptor; see documentation. Some clean-up in the variable/constants wrapper generator code. New convenience macro SWIG_Guile_MustGetPtr, which allows getting pointers from smobs in a functional style. New typemap file "list-vector.i", providing macros that define typemaps for converting between C arrays and Scheme lists and vectors. 5/25/2001: cheetah (william fulton) [Java] STL string moved into its own typemap as it is c++ code and it break any c code using the typemaps.i file. - Fixes for wrappers around global variables - applies to primitive types and user types (class/struct) and pointers to these. - Structure member variables and class public member variables getters and setters pass a pointer to the member as was in 1.3a3 and 1.1 (1.3a5 was passing by value) - Parameters that were arrays and return types were incorrectly being passed to create_function() as pointers. - Fix for arrays of enums. [Java] Updated java examples and added two more. [Java] Java module updated from SWIG1.3a3 including code cleanup etc. [Java] enum support added. [Java] Array support implemented [Java] Shadow classes improved - Java objects used rather than longs holding the c pointer to the wrapped structure/c++class 5/22/2001: mkoeppe [Guile] Fixed extern "C" declarations in C++ mode. Thanks to Greg Troxel . 5/21/2001: mkoeppe [Guile] New linkage "module" for creating Guile modules for Guile versions >= 1.5.0. 4/18/2001: mkoeppe [MzScheme] Added typemaps for passing through Scheme_Object pointers. 4/9/2001 : mkoeppe [MzScheme] Added typemaps for `bool'. Inclusion of headers and support routines is now data-driven via mzscheme.i. Headers come from the new file mzschemdec.swg. Don't abort immediately when a type-handling error is reported. When searching for typemaps for enums, fall back to using int, like the Guile backend does. Support char constants. Emit correct wrapper code for variables. 3/12/2001: mkoeppe [Guile] Fixed typemaps for char **OUTPUT, char **BOTH. 3/2/2001 : mkoeppe [Guile] Every wrapper function now gets a boolean variable gswig_list_p which indicates whether multiple values are present. The macros GUILE_APPEND_RESULT, GUILE_MAYBE_VALUES and GUILE_MAYBE_VECTOR use this variable, rather than checking whether the current return value is a list. This allows for typemaps returning a list as a single value (a list was erroneously converted into a vector or a multiple-value object in this case). 3/1/2001 : mkoeppe [Guile] Added support for returning multiple values as vectors, or passing them to a muliple-value continuation. By default, multiple values still get returned as a list. 3/1/2001 : mkoeppe [Guile] Added a "beforereturn" pragma. The value of this pragma is inserted just before every return statement. 3/1/2001 : mkoeppe [Guile] Added support for Guile 1.4.1 procedure documentation formats, see internals.html. 2/26/2001: mkoeppe [Guile] Made the wrapper code compile with C++ if the "-c++" command-line switch is given. Thanks to . 2/26/2001: mkoeppe [Guile] Now two type tables, swig_types and swig_types_initial, are used, as all other SWIG language modules do. This removes the need for the tricky construction used before that the broken Redhat 7.0 gcc doesn't parse. Reported by . 2/26/2001: mkoeppe [Guile] Fixed typemaps for char *OUTPUT, char *BOTH; a bad free() would be emitted. Added typemap for SCM. Version 1.3 Alpha 5 =================== 9/19/00 : beazley [Python] Python module generates more efficient code for creating the return value of a wrapper function. Modification suggested by Jon Travis. 9/19/00 : beazley Library files specified with the -l option are now included at the end of the interface file (reverting to the old behavior). 9/19/00 : beazley Fixed some problems with enum handling. enums are now manipulated as 'int', but cast into the enum type when values are passed to the corresponding C function. 9/19/00 : mkoeppe [Guile] Removed "-with-smobs" command-line option, as this is the default now. Added "-emit-setters" command-line option, which turns on generating procedures-with-setters; see internals.html. 9/18/00 : mkoeppe Incorporated patch #101430, fixing bugs in the Guile module: 1. Some arguments were erroneously taken as *optional* arguments when ignored arguments were present. 2. Guile 1.3.4 was not supported since functions introduced in Guile 1.4 were used. 3. Added handling of `const char *'. 9/17/00 : beazley Fixed problem with failed assertion and large files. 9/17/00 : beazley Fixed problem with the '%' character appearing in added methods and function bodies. Preprocessor bug. Version 1.3 Alpha 4 (September 4, 2000) ======================================= 9/3/00 : ttn Added instructions for maintainers in Examples/README on how to make examples also be useful in the testing framework. Also, "make check" now uses ./Lib by via env var `SWIG_LIB'. This is overridable like so: make chk-swiglib=/my/experimental/swig/Lib check 9/3/00 : beazley Added $typemap variable to typemaps. This gets replaced with a string indicating the typemap that is applied. Feature request from rsalz. 9/3/00 : beazley Experimental optimization to code generation for virtual member functions. If you have two classes like this: class A() { virtual void foo(); } class B() : public A { virtual void foo(); } Swig now will generate a single wrapper function for this A_foo(A *a) { a->foo(); } and use it as the implementation of both A_foo() and B_foo(). This optimization only takes place if both methods are declared as virtual and both take identical parameters. *** EXPERIMENTAL FEATURE *** 9/3/00 : beazley Restored the "memberin" typemap for setting structure members. Unlike the old version, the new version is expanded inline in the wrapper function allowing access to scripting language internals (a sometimes requested feature). The "memberout" typemap is gone. Use the "out" typemaps instead. *** POTENTIAL INCOMPATIBILITY *** 9/3/00 : beazley Attribute set methods no longer return the value of a member. For example: struct Foo { int x; ... } now gets set as follows: void Foo_x_set(Foo *f, int x) { f->x = x; } In SWIG1.1 it used to be this: int Foo_x_set(Foo *f, int x) { return (f->x = x); } This has been changed due to the complexity created by trying to do this with more exotic datatypes such as arrays. It also complicates inlining and handling of the "memberin" typemap. *** POTENTIAL INCOMPATIBILITY *** 9/2/00 : beazley Removed the ptrcast() and ptrmap() functions from the pointer.i library file. Old implementation is incompatible with new type system. *** POTENTIAL INCOMPATIBILITY *** 9/2/00 : beazley New runtime function SWIG_TypeQuery(const char *name) added. This function can be used to extract the type info structure that is used for type-checking. It works with either the nice C name or mangled version of a datatype. For example: swig_type_info *ty = Swig_TypeQuery("int *"); swig_type_info *ty = Swig_TypeQuery("_p_int"); This is an advanced feature that has been added to support some exotic extension modules that need to directly manipulate scripting language objects. *** NEW FEATURE *** 9/2/00 : beazley New directive %types() added. This is used to explicitly list datatypes that should be included in the runtime type-checking code. Normally it is never necessary to use this but sometimes advanced extensions (such as the pointer.i library) may need to manually add types to the type-checker. *** NEW FEATURE *** 8/31/00 : beazley Improved handling of string array variables. For example, a global variable of the form "char name[64]" is automatically managed as a 64 character string. Previously this didn't work at all or required the use of a special typemap. *** NEW FEATURE (Tcl, Perl, Python) *** 8/31/00 : ttn Added Makefile target `check-c++-examples', which uses new files under Examples/C++ contributed by Tal Shalif. Now "make check" also does "make check-c++-examples". Also, expanded actions in `check-gifplot-example' and `check-aliveness'. 8/30/00 : mkoeppe Major clean-up in the Guile module. Added typemap-driven documentation system. Changed to handle more than 10 args. Updated and extended examples. *** NEW FEATURE *** 8/29/00 : beazley Added new %insert directive that inserts the contents of a file into a portion of the output wrapper file. This is only intended for use by writers of language modules. Works as follows: %insert(headers) "file.swg"; %insert(runtime) "file.swg"; %insert(wrappers) "file.swg"; %insert(init) "file.swg"; *** NEW FEATURE *** 8/29/00 : beazley Added new %runtime directive which includes code into the runtime portion of the wrapper code. For example: %runtime %{ ... some internal runtime code ... %} There is no practical reason for ordinary users to use this feature (almost everything can be done using %{ ... %} instead). However, writers of language modules may want to use this in language configuration files. *** NEW FEATURE *** 8/28/00 : beazley Typemaps can now be specified using string literals like this: %typemap(in) int "$target = SvIV($source);"; When code is specified like this, it is *NOT* enclosed inside a local scope (as with older typemap declarations). Note: character escape sequences are interpreted in the code string so if you want to include a quote or some other special character, make sure you use a (\). *** NEW FEATURE *** 8/27/00 : beazley Typemaps have been modified to follow typedef declarations. For example, if you have this: typedef int Number; %typemap(in) int { ... get an integer ... } void foo(Number a); The typemap for 'int' will be applied to the argument 'Number a'. Of course, if you specify a typemap for 'Number' it will take precedence (nor will it ever be applied to an 'int'). *** POTENTIAL INCOMPATIBILITY *** 8/27/00 : beazley Default typemap specification has changed. In older versions of swig, you could do this: %typemap(in) int SWIG_DEFAULT_TYPE { ... } To specify the default handling of a datatype. Now that SWIG follows typedef declarations, this is unnecessary. Simply specifying a typemap for 'int' will work for all variations of integers that are typedef'd to 'int'. Caveat, specifying the default behavior for pointers, references, arrays, and user defined types is a little different. This must be done as follows: %typemap() SWIGPOINTER * { ... a pointer ... } %typemap() SWIGREFERENCE & { ... a reference ... } %typemap() SWIGARRAY [] { ... an array ... } %typemap() SWIGTYPE { ... a user-defined type (by value) ... } *** POTENTIAL INCOMPATIBILITY *** 8/15/00 : dustin The file swig-1.3a1-1.spec has been added to the Tools directory. It can be used to build a redhat package for SWIG, although it will need to be updated for the next public release. 8/15/00 : beazley Typemaps have been completely rewritten. Eventually they may be replaced with something better, but for now they stay. However, there are a number of a significant changes that may trip some people up: 1. Typemap scoping is currently broken. Because of this, the following code won't work. %typemap(in) blah * { ... } class Foo { ... int bar(blah *x); } %typemap(in) blah *; /* Clear typemap */ (this breaks because the code for the class Foo is actually generated after the entire interface file has been processed). This is only a temporary bug. 2. In SWIG1.1, the %apply directive worked by performing a very complex type-aliasing procedure. From this point on, %apply is simply a generalized typemap copy operation. For example, %apply double *OUTPUT { double *x, double *y }; Copies *ALL* currently defined typemaps for 'double *OUTPUT' and copies them to 'double *x' and 'double *y'. Most people probably won't even notice this change in %apply. However, where it will break things is in code like this: %apply double *OUTPUT { double *x }; %typemap(in) double *OUTPUT { ... whatever ... } void foo(double *x); In SWIG1.1, you will find that 'foo' uses the 'double *OUTPUT' rule even though it was defined after the %apply directive (this is the weird aliasing scheme at work). In SWIG1.3 and later, the 'double *OUTPUT' rule is ignored because it is defined after the %apply directive. 3. The %clear directive has been modified to erase all currently defined typemaps for a particular type. This differs from SWIG1.1 where %clear only removed rules that were added using the %apply directive. 4. Typemap matching is now performed using *exact* types. This means that things like this %typemap(in) char * { } %typemap(in) const char * { } are different typemaps. A similar rule applies for pointers, arrays, and references. For example: %typemap(in) double * { } used to apply to 'double &', 'double []', Now, it only applies to 'double *'. If you want a 'double &', you'll need to handle that separately. 5. Array matching has been simplfied. In SWIG1.1, array matching was performed by trying various combinations of dimensions. For example, 'double a[10][20]' was matched as follows: double [10][20] double [ANY][20] double [10][ANY] double [ANY][ANY] In SWIG1.3, only the following matches are attempted: double [10][20] double [ANY][ANY] On the positive side, typemap matching is now *significantly* faster than before. *** POTENTIAL INCOMPATIBILITY *** 8/15/00 : beazley Secret developer feature. Since datatypes are now represented as strings internally, you can bypass limitations of the parser and create a wild datatype by simply enclosing the raw string encoding in backticks (``) and sticking it in the interface file anywhere a type is expected. For example, `a(20).a(10).p.f(int,int)`. This feature is only intended for testing (i.e., you want to see what happens to your language module if it gets a reference to a pointer to an array of pointers to functions or something). *** SICK HACK *** 8/14/00 : beazley Completely new type-system added to the implementation. More details later. 8/11/00 : beazley Cleaned up some of the I/O handling. SWIG no longer generates any temporary files such as _wrap.wrap, _wrap.ii, _wrap.init. Instead, these "files" are kept around in memory as strings (although this is transparent to language modules). 8/4/00 : ttn Added Makefile target "check" and variants. This can be used like "make check" or, to explicitly skip a language LANG: "make skip-LANG=true check". LANG is skipped automatically if ./configure determines that LANG support is insufficient. Currently, the check is limited to doing the equivalent of "make all" in some of the Examples directories. This should be expanded both horizontally (different types of tests) and vertically (after "make all" in an Examples subdir succeeds, do some additional tests with the resulting interpreter, etc). 8/4/00 : ttn Added Makefile target "distclean", which deletes all the files ./configure creates, including config.status and friends. 8/3/00 : harcoh java changes??? [todo: document changes] 7/23/00 : beazley Typemaps have been modified to key off of the real datatypes used in the interface file. This means that typemaps for "const char *" and "char *" will be difference as will typemaps for "Vector" and "Vector *." *** POTENTIAL INCOMPATIBILITY *** This is likely to break interfaces that rely on the odd type handling behavior of typemaps in SWIG1.1--especially with respect to interfaces involving pass-by-value. 7/23/00 : beazley New %constant directive. This directive can be used to create true constants in the target scripting language. It's most simple form is something like this: %constant FOO 42; In this case, the type is inferred from the syntax of the value (in reality, all #define macros are translated into directives of this form). An expanded version is as follows: %constant(Foo *) FOO = &FooObj; In this case, an explicit type can be specified. This latter form may be useful for creating constants that used to be specified as const Foo *FOO = &FooObj; (which are now treated as variables). *** EXPERIMENTAL FEATURE *** The syntax may change in the final release. 7/23/00 : beazley Modified the parser so that variable declarations of the form "const type *a" are handled as variables, not constants. Note: SWIG1.1 handled this case erroneously because const char *a is a pointer variable that can be reassigned. *** POTENTIAL INCOMPATIBILITY *** Note: just because this is the "right" way to do things, doesn't mean it's the most appropriate interpretation. I suspect that many C programmers might use 'const char *' with the intent of creating a constant, without realizing that they've created a reassignable global variable. 7/23/00 : beazley The C/C++ wrapping layer has been completely redesigned and reimplemented. This change should iron out a few rough spots with the handling of datatypes. In addition, the wrapper code is somewhat cleaner. *** POTENTIAL INCOMPATIBILITY *** This change may break interfaces that involve subtle corner-cases with typemaps and the %addmethods directive since some of these features had somewhat type handling behavior in SWIG1.1. 7/23/00 : beazley The "memberin" and "memberout" typemaps are gone for the moment, but they might return as soon as I figure out how to integrate them with some of the streamlined C wrapper functions. *** POTENTIAL INCOMPATIBILITY *** 7/22/00 : beazley A variety of old type handling functions such as print_type(), print_full(), print_mangle(), etc... are gone and have been replaced with a smaller set of functions. See the file Doc/internals.html for details. This will break all third party language modules. *** POTENTIAL INCOMPATIBILITY *** 7/20/00 : beazley Deprecated the %val and %out directives. These directives shouldn't really be necessary since typemaps can be used to achieve similar results. This also cleans up the handling of types and parameters quite a bit. *** POTENTIAL INCOMPATIBILITY *** 7/20/00 : ttn Fixed unspecified-module bug in Guile support and removed more non-"with-smobs" functionality using patches submitted by Matthias Koeppe. Re-enable recognition of "-with-smobs" (with no effect since we use smobs by default now) for the time being. After the 1.3a4 release, this option will signal an error. 7/17/00 : ttn Fixed NULL-input bug in parameter list handling. Reported by Matthias Koeppe. 7/12/00 : beazley Fixed memory leak in Python type-checking code. Reported by Keith Davidson. Bug #109379. 7/10/00 : beazley Changed internal data structures related to function parameters. 7/10/00 : beazley Fixed some bugs related to the handling of the %name() directive and classes in the Tcl module. Problem reported by James Bailey. 7/10/00 : beazley Fixed parsing and enum handling problems with character constants. Reported by Greg Kochanski. 7/10/00 : beazley Removed WrapperFunction class from the core and updated the language module. This will break third party modules. *** POTENTIAL INCOMPATIBILITY *** 7/9/00 : beazley Implementation of SWIG no longer makes use of C++ operator overloading. This will almost certainly break *all* third party language modules that are not part of the main SWIG CVS tree. Sorry. *** POTENTIAL INCOMPATIBILITY *** 7/8/00 : beazley Removed the experimental and undocumented "build" typemap that was intended to work with multiple arguments. Simply too weird to keep around. Besides, a better replacement is in the works. 7/6/00 : ttn Removed non-"with-smobs" functionality (Guile support), i.e., "-with-smobs" is now the default and no longer needs to be specified on the command-line. 7/5/00 : ttn Incorporated Ruby support contributed by Masaki Fukushima. 6/28/00 : ttn Applied more-than-10-args bugfix patch contributed by Matthias Koeppe. 6/27/00 : beazley Rewrote some of the string handling and eliminated the C++ implementation (which is now just a wrapper). 6/27/00 : ttn Added Doc/index.html and Doc/internals.html. The target audience for the latter is new SWIG developers. Version 1.3 Alpha 3 (June 18, 2000) =================================== 6/18/00 : beazley Removed the naming.cxx, hash.cxx, and symbol.cxx files from the SWIG1.1 directory. Continued to migrate things away from the C++ base (although there's still a lot of work to do). 6/17/00 : beazley Added a few more examples to the Examples directory. Still need to do a lot of work on this. 6/16/00 : beazley Added -includeall to follow all #include statements in the preprocessor. 6/15/00 : beazley Tried to fix as many C++ warnings as possible when compiling with the Sun Workshop C++ compiler. Unfortunately, this means that there are a lot of statements that contain string literals of the form (char*)"Blah". 6/15/00: beazley A variety of cleanup and performance optimization in the low-level DOH library. This seems to result in a speedup of 50-100% for preprocessing and other related tasks. 5/10/00 : ttn Applied variable-wrapping bugfix patch contributed by Matthias Koeppe. 4/17/00 : ttn Updated MzScheme support contributed by Oleg Tolmatcev. We now use a `Scheme_Type'-based structure to wrap pointers. 4/11/00 : ttn Incorporated further Guile-support patch by Matthias Koeppe. Typemaps previously deleted have been re-added. There is now exception handling (see Doc/engineering.html). `SWIG_init' is now declared extern only for simple linkage. Some bugs were fixed. 4/06/00 : ttn Incorporated MzScheme support contributed by Oleg Tolmatcev. This includes new directories Lib/mzscheme and Examples/mzscheme. 4/03/00 : ttn Added Examples/guile and children. This is an adaptation of the same-named directory from the SWIG-1.1p5 distribution. Added Guile-specific section to Doc/engineering.html. 4/02/00 : ttn Incorporated new guilemain.i by Martin Froehlich. Incorporated Guile-support rewrite patch by Matthias Koeppe. The command line option "-with-smobs" enables implementation of pointer type handling using smobs, the canonical mechanism for defining new types in Guile. Previous implementation (using strings) is at the moment still supported but deprecated. At some point, "-with-smobs" will be the default and no longer required. 3/13/00 : beazley Added purify patches submitted by Ram Bhamidipaty. 3/02/00 : ttn Added support for different Guile "linkage" schemes. Currently, "-Linkage hobbit" works. Version 1.3 Alpha 2 (March 1, 2000) =================================== 2/29/00 : beazley Made SWIG ignore the 'mutable' keyword. 2/29/00 : beazley Incorporated some patches to the Perl5 module related to the -hide option and the destruction of objects. Patch submitted by Karl Forner. 2/27/00 : ttn Incorporated Guile support contributed by Matthias Koeppe. This includes a cpp macro in Lib/guile/guile.swg and the entire file Lib/guile/typemaps.i. 2/25/00 : ttn Modified configure.in and Makefile.in files to support non-local build (useful in multi-arch environments). 2/24/00 : ttn Incorporated Guile support contributed by Clark McGrew. This works with Guile 1.3, but since it depends heavily on the gh_ interface, it should work for all later versions. It has not been tested with versions before 1.3. WARNING: Code is unstable due to experimentation by ttn. 2/16/00 : beazley A variety of performance improvements to the Python shadow class code generation. Many of these result in substantial runtime performance gains. However, these have come at a cost of requiring the use of Python 1.5.2. For older versions, use 'swig -noopt -python' to turn off these optimization features. Version 1.3 Alpha 1 (February 11, 2000) ======================================= 2/11/00 : Added 'void' to prototype of Python module initializer. Reported by Mark Howson (1/20/00). 2/11/00 : beazley Modified the Python shadow class code to discard ownership of an object whenever it is assigned to a member of another object. This problem has been around for awhile, but was most recently reported by Burkhard Kloss (12/30/99). 2/11/00 : beazley Added braces around macros in the exception.i library. Reported by Buck Hodges (12/19/99) 2/11/00 : beazley Fixed bug in the constraints.i library. Reported by Buck Hodges (12/14/99) 2/11/00 : beazley The %native directive now generates Tcl8 object-style command calls. A full solution for Tcl7 and Tcl8 is still needed. Patch suggested by Mike Weiblen (11/29/99) 2/11/00 : beazley Modified the typemap code to include the $ndim variable for arrays. Patch provided by Michel Sanner (11/12/99). 2/11/00 : beazley Modified the Python module to raise a Runtime error if an attempt is made to set a read-only member of a shadow class. Reported by Michel Sanner (11/5/99). 2/10/00 : The documentation system has been removed. However, it is likely to return at some point in the future. 2/1/00 : Added a number of performance enhancements to the Python shadow classing and type-checking code. Contributed by Vadim Chugunov. 1. Remove _kwargs argument from the shadow wrappers when -keyword option is not specified. This saves us a construction of keyword dictionary on each method call. def method1(self, *_args, **_kwargs): val = apply(test2c.PyClass1_method1, (self,) + _args, _kwargs) return val becomes def method1(self, *_args): val = apply(test2c.PyClass1_method1, (self,) + _args) return val 2. Incorporate self into the _args tuple. This saves at least one tuple allocation per method call. def method1(self, *_args): val = apply(test2c.PyClass1_method1, (self,) + _args) return val becomes def method1(*_args): val = apply(test2c.PyClass1_method1, _args) return val 3. Remove *Ptr classes. Assume that we are SWIGging a c++ class CppClass. Currently SWIG will generate both CppClassPtr class that hosts all methods and also CppClass that is derived from the former and contains just the constructor. When CppClass method is called, the interpreter will try to find it in the CppClass's dictionary first, and only then check the base class. CppClassPtr functionality may be emulated with: import new _new_instance = new.instance def CppClassPtr(this): return _new_instance(CppClass, {"this":this,"thisown":0}) This saves us one dictionary lookup per call. The new module was first added in Python-1.5.2 so it won't work with older versions. I've implemented an alternative that achieves the same thing 4. Use CObjects instead of strings for pointers. Dave: This enhancements result in speedups of up to 50% in some of the preliminary tests I ran. 2/1/00 : Upgraded the Python module to use a new type-checking scheme that is more memory efficient, provides better performance, and is less error prone. Unfortunately, it will break all code that depends on the SWIG_GetPtr() function call in typemaps. These functions should be changed as follows: if (SWIG_GetPtr(string,&ptr,"_Foo_p")) { return NULL; } becomes if (SWIG_ConvertPtr(pyobj, &ptr, SWIG_TYPE_Foo_p) == -1) { return NULL; } Note: In the new implementation SWIG_TYPE_Foo_p is no longer a type-signature string, but rather an index into a type encoding table that contains type information. *** POTENTIAL INCOMPATIBILITY *** 1/30/00 : loic Conditionally compile experimental code with --enable-experiment configure flag. Fix .cvsignore to ignore configure & yacc generated files 1/28/00 : loic Apply automake everywhere Keep configure scripts so that people are not *forced* to autoconf Keep sources generated by yacc so that compilation without yacc is possible. Source/LParse/cscanner.c: change lyacc.h into parser.h to please default yacc generation rules. Use AC_CONFIG_SUBDIRS in configure.in instead of hand made script. Update all relevant .cvsignore to include .deps Fixed missing ; line 136 Source/Swig/swig.h 1/13/00 : beazley Fixed a number of minor end-of-file parsing problems in the preprocessor. 1/13/00 : beazley Added -freeze option that forces SWIG to freeze upon exit. This is only used as a debugging tool so that I can more easily examine SWIG's memory footprint. 1/13/00 : beazley Added patch to guile module for supporting optional arguments Patch contributed by Dieter Baron. 1/13/00 : loic Added .cvsignore, Examples/.cvsignore, Source/DOH/Doh/.cvsignore Source/SWIG1.1/main.cxx: Fixed -I handling bug Source/Modules1.1/java.cxx: fixed char* -> const char* warnings that are errors when compiling with gcc-2.95.2 Source/SWIG1.1/main.cxx: cast const char* to char* for String_replace token and rep should really be const. 1/12/00 : beazley Added Harco's Java modules. 1/12/00 : beazley Revoked the %ifdef, %ifndef, %endif, %if, %elif, and %else directives. These are no longer needed as SWIG now has a real preprocessor. *** POTENTIAL INCOMPATIBILITY *** 1/12/00 : beazley Moved the documentation modules from the SWIG directory to the Modules directory (where they really should have been to begin with). 1/12/00 : beazley Removed the -stat option for printing statistics. The statistics reporting was inadequate and mostly broken anyway. *** POTENTIAL INCOMPATIBILITY *** 1/12/00 : beazley Removed the -t option for reading a typemap file. More trouble than it's worth. Just include typemaps at the top of the interface file. *** POTENTIAL INCOMPATIBILITY *** 1/12/00 : beazley Removed the %checkout directive. *** POTENTIAL INCOMPATIBILITY *** 1/12/00 : beazley Removed the -ci option for file checkin. Too problematic to implement. Probably better to just put your SWIG library under CVS instead. *** POTENTIAL INCOMPATIBILITY ***. 1/11/00 : beazley Deleted the LATEX module. Sorry... Didn't know anyone who was using it. Besides, I'm looking to simplify the documentation system. *** POTENTIAL INCOMPATIBILITY *** 1/11/00 : beazley Modified the ASCII documentation module to use a .txt suffix for its output file instead of .doc. 1/11/00 : beazley Added the long-lost SWIG preprocessor back to the system. It should be enabled by default. Raw preprocessed output can be viewed using swig -E file.i. *** NEW FEATURE *** 1/11/00 : beazley and djmitche Completely reorganized the SWIG directory structure. The basic organization is now: Source/ SWIG source code Lib/ SWIG library files (swig_lib) Doc/ Documentation Examples/ Examples More directories will be added as needed. 12/08/99: Loic Dachary (loic@senga.org) Enhanced package handling for perl5 and c++. With new option -hide Foo::Bar, every perl5 object (Frob) is qualified by Foo::Bar::Frob. The package name is solely used to encapsulate C/C++ wrappers output in _wrap.c and the corresponding perl package in .pm. Note that a package name may contain :: (Frob::Nitz) and will be relative to the package name provided by -hide (Foo::Bar::Frob::Nitz). In *_wrap.c, SWIG_init macro is used. Was previously defined but not used and simplifies code. Added typemap(perl5,perl5in) and typemap(perl5,perl5out) that do the equivalent of typemap(perl5,in) and typemap(perl5,out) but contain perl code and applies to wrappers generated by -shadow. Lacking proper regression tests I used Examples/perl5/{c++,constraint,defarg,except, graph/graph[1234],multinherit,nested,shadow,simple,tree, typemaps/{argv,argv2,arraymember,database,file,ignore,integer, output,passref,reference,return}}/. I ran swig with and without the patches, diff the generatedsources, run the .pl files and checked that the results are identical. In all those examples I had no error. 11/21/99: Modified the Tcl module to provide full variable linking capabilities to all datatypes. In previous versions, a pair of accessor functions were created for datatypes incompatible with the Tcl_LinkVar() function. Now, we simply use variable traces to support everything. This may break scripts that rely upon the older behavior. *** POTENTIAL INCOMPATIBILITY *** 11/21/99: Added slight tweak to wrapper generator to collect local variables of similar type. Produces somewhat more compact wrapper code. 11/20/99: Modified the Tcl module to use SWIG_GetArgs() to parse arguments. This is a technique borrowed from Python in which arguments are converted using a format string convention similiar to fprintf(). This results in a *substantial* reduction in the size of the resulting wrapper code with only a modest runtime overhead in going through the extra conversion function. 11/13/99: Completely rewrote the class/structure generation code for the Tcl module. Now, a small set of runtime functions are used to implement the functionality for all classes (instead of a massive amount of runtime code being generated for each class). Class specific information is simply encoded in a series of static tables. This results in a *HUGE* reduction in wrapper code size--especially for C++. 11/13/99: Removed the -tcl (Tcl 7.x) module. Tcl 8.0 is now several years old and the defacto standard--no real reason to keep supporting the old version at this point. 11/13/99: Cleaned up -c option for Python module. The pyexp.swg file is now gone. 11/13/99: Fixed external declarations to work better with static linking on Windows. Static linking should now be possible by defining the -DSTATIC_LINK option on the command line. Patch contributed by Alberto Fonseca. 11/5/99 : Fixed an obscure code generation bug related to the generation of default constructors. Bug reported by Brad Clements. 11/5/99 : Fixed a few memory problems found by purify. 11/5/99 : Officially deprecated the -htcl, -htk, and -plugin options from the Tcl and Tcl8 modules. 10/26/99: Removed unused variable from python/typemaps.i. Patch contributed by Keith Davidson. 8/16/99 : Added _WIN32 symbol to libraries to better support Windows. 8/16/99 : Deprecated the Perl4 module. It is no longer included in the distribution and no longer supported. In the entire 3 years SWIG has been around I never received a single comment about it so I'm assuming no one will miss it... 8/16/99 : Modified the type-checking code to register type mappings using a table instead of repeated calls to SWIG_RegisterMapping(). This reduces the size of the module initialization function somewhat. 8/15/99 : Cleaned up the pointer type-checking code in the Tcl module. 8/15/99 : Many changes to the libraries to support runtime libraries. 8/13/99 : Eliminated C++ compiler warning messages about extern "C" linkage. 8/13/99 : Some cleanup of Python .swg files to better support runtime libraries on Windows. 8/13/99 : Modified the %pragma directive to attach pragmas declared inside a class definition to the class itself. For example: class foo { ... %pragma(python) addtomethod = "insert:print `hello world'" ... } Most people don't need to worry about how this works. For people writing backend modules, class-based pragmas work like this: lang->cpp_open_class() // Open a class lang->cpp_pragma() // Supply pragmas ... // Emit members lang->cpp_close_class() // Close the class All of the pragmas are passed first since they might be used to affect the code generation of other members. Please see the Python module for an example. Patches contributed by Robin Dunn. 8/13/99 : Patch to Python shadow classes to eliminate ignored exception errors in destructors. Patch contributed by Robin Dunn. 8/11/99 : Minor patch to swig_lib/python/swigptr.swg (added SWIGSTATIC declaration). Patch contributed by Lyle Johnson. 8/11/99 : Added FIRSTKEY/NEXTKEY methods to Perl5 shadow classes Patch contributed by Dennis Marsa. 8/11/99 : Modified Python module so that NULL pointers are returned and passed as 'None.' Patch contributed by Tal Shalif. 8/10/99 : Fixed missing 'int' specifiers in various places. 8/10/99 : Added Windows makefile for Runtime libraries. Contributed by Bob Techentin. 8/10/99 : Fixed minor problem in Python runtime makefile introduced by keyword arguments. 8/8/99 : Changed $target of perl5(out) typemap from ST(0) to ST(argvi). Patch contributed by Geoffrey Hort. 8/8/99 : Fixed bug in typemap checking related to the ANY keyword in arrays and ignored arguments. Error reported by Geoffrey Hort. 8/8/99 : %enabledoc and %disabledoc directives can now be used inside class/structure definitions. However, no check is made to see if they are balanced (i.e., a %disabledoc directive inside a class does not have to have a matching %enabledoc in the same class). 8/8/99 : Keyword argument handling is now supported in the Python module. For example: int foo(char *bar, int spam, double x); Can be called from Python as foo(x = 3.4, bar="hello", spam=42) To enable this feature, run SWIG with the '-keyword' command line option. Mixing keyword and default arguments should work as well. Unnamed arguments are assigned names such as "arg1", "arg2", etc... *** POTENTIAL INCOMPATIBILITY *** Functions with duplicate argument names such as bar(int *OUTPUT, int *OUTPUT) will likely cause problematic wrapper code to be generated. To fix this, use different names or use %apply to map typemaps to alternate names. 8/8/99 : Handling of the 'this' pointer has been changed in Python shadow classes. Previously, dereferencing of '.this' occurred in the Python shadow class itself. Now, this step occurs in the C wrappers using the following function: SWIG_GetPtrObj(PyObject *, void **ptr, char *type) This function can accept either a string containing a pointer or a shadow class instance with a '.this' attribute of appropriate type. This change allows the following: 1. The real shadow class instance for an object is passed to the C wrappers where it can be examined/modified by typemaps. 2. Handling of default/keyword arguments is now greatly simplified. 3. The Python wrapper code is much more simple. Plus, it eliminated more than 300 lines of C++ code in the Python module. *** CAVEAT : This requires the abstract object interface. It should work with Python 1.4, but probably nothing older than that. 8/8/99 : Fixed handling of "const" and pointers in classes. In particular, declarations such as class foo { ... const char *msg; const int *iptr; } are handled as assignable variables as opposed to constant values (this is the correct behavior in C/C++). Note: declarations such as "char *const msg" are still unsupported. Constants declared at the global level using const are also broken (because I have a number of interfaces that rely upon this behavior). *** POTENTIAL INCOMPATIBILITY *** This may break interfaces that mistakenly treat 'const char *' types as constant values. 8/8/99 : Modified the parser to support bit-fields. For example: typedef struct { unsigned int is_keyword : 1; unsigned int is_extern : 1; unsigned int is_static : 1; } flags; Bit-fields can only be applied to integer types and their are other restrictions. SWIG performs no such type-checking (although the C compiler will catch problems when it tries to compile the wrapper code). 8/8/99 : Removed trailing space of $basetype substitution in typemaps. This is to allow things like this: %typemap(python, argout) spam** OUTPUT{ ... char* a = "$basetype_p"; ... } (Patch suggested by Nathan Dunfield). 6/22/99 : Made a very slight tweak to the Perl5 shadow class code that allows typemaps to alter the return type of objects (to support polymorphic types). Patch contributed by Drake Diedrich. 4/8/99 : Fixed null pointer handling bug in Perl module. Patch contributed by Junio Hamano. 3/17/99 : Fixed bug in perl5ptr.swg for ActiveState Perl. Patch contributed by Greg Anderson. 2/27/99 : Eliminated segmentation fault when Swig runs on empty files. 2/27/99 : Added patch to Guile module to eliminate unused variables. Contributed by Mike Simons. 2/27/99 : Fixed problem with %addmethods returning references. 2/27/99 : Fixed Runtime/Makefile. Patch contributed by Mike Romberg. 2/27/99 : Incorporated patches to the type-checker. 2/27/99 : Fixed problem with -exportall switch and shadow classes in Perl5 module. Patch contributed by Dennis Marsa. 2/27/99 : Modified Perl5 module to recognize 'undef' as a NULL char *. Patch contributed by Junio Hamano. 2/27/99 : Fixed the Perl5 module to support the newer versions of ActiveState Perl for Win32. 2/27/99 : Fixed the include order of files specified with the -I option. 2/5/98- : Dave finishes his dissertation, goes job hunting, moves to 2/5/99 Chicago and generally thrashes about. Version 1.1 Patch 5 (February 5, 1998) ====================================== 2/4/98 : Fixed a bug in the configure script when different package locations are specified (--with-tclincl, etc...). 2/2/98 : Fixed name-clash bug related to the switch to C macros for accessor functions. The new scheme did not work correctly for objects with members such as 'obj', 'val', etc... Fixed the bug by appending the word 'swig' to macro argument names. Patch contributed by Rudy Albachten. 2/2/98 : Slight fix to the Perl5 module to eliminate warning messages about 'varname used only once : possible typo'. Fix contributed by Rudy Albachten. 1/9/98 : Fixed a bug in the Perl 5 module related to the creation of constants and shadow classes. 1/9/98 : Fixed linking bug with Python 1.5 embed.i library file. Version 1.1 Patch 4 (January 4, 1998) ===================================== 1/4/98 : Changed structured of the Examples directory to be more friendly to Borland C++. 1/4/98 : Added the function Makefile.win.bc for compiling the examples under Borland 5.2. 1/4/98 : Slight change to the perl5 module and C++ compilation. The library is now included before any Perl headers because Perl the extern "C" linkage of math.h screws alot of things up (especially on Windows). 1/2/98 : Change to the Python module that reduces the number of constants created by C++ classes, inheritance, and shadow classes. This modification may introduce a few slight incompatibilities if you attempt to use the non-shadow class interface with shadow classes enabled. Patch contributed by Mike Romberg. 1/2/98 : Support for Tcl 8.0 namespaces has been added. This *replaces* the original SWIG mechanism that assumed [incr Tcl] namespaces. To use namespaces, simply run SWIG with the following options swig -tcl -namespace foo.i This places everything in a namespace that matches the module name swig -tcl -namespace -prefix bar foo.i This places everything in the namespace 'bar' The use of namespaces is new in Tcl 8.0. However, the wrapper code generated by SWIG will still work with all versions of Tcl newer than and including Tcl 7.3/Tk3.6 even if the -namespace option is used. *** POTENTIAL INCOMPATIBILITY *** This change may break existing applications that relied on the -prefix and -namespace options. 1/2/98 : Added the following constants to the Tcl wrapper code SWIG_name - Name of the SWIG module SWIG_prefix - Prefix/namespace appended to command names SWIG_namespace - Name of the namespace SWIG library writers can use these to their advantages. 1/2/98 : Fixed a bug in the Tcl8 module related to the creation of pointer constants (the function SWIG_MakePtr was missing from the wrapper code). 1/2/98 : Added the consthash.i library file to the Tcl and Tcl8 modules. 1/1/98 : Changed and cleaned up the Python typemaps.i file. The following significant changes were made : 1. The OUTPUT typemap now returns Python tuples instead of lists. Lists can be returned as before by using the L_OUTPUT type. If compatibility with older versions is needed, run SWIG with the -DOUTPUT_LIST option. 2. The BOTH typemap has been renamed to INOUT. For backwards compatibility, the "BOTH" method still exists however. 3. Output typemaps now generate less code than before. Changes to typemaps.i may break existing Python scripts that assume output in the form of a list. *** POTENTIAL INCOMPATIBILITY *** 12/31/97: Fixed long overdue problems with the testing scripts and certain makefiles that required the use of the bash shell. Everything should work properly with the standard Bourne shell (sh) now. 12/31/97: Modified typemaps to allow $basetype as a valid local variable. This allows for all sorts of bizarre hackish typemaps that do cool things. Patch contributed by Dominique Dumont. 12/31/97: Switched accessor functions generated for member data to C preprocessor macros (except in cases involving typemaps or char *). 12/31/97: Fixed a bug related to C++ member data involving references. 12/31/97: Changed accessor functions for C++ member functions to preprocessor macros. This cleans up the wrapper code and results in fewer function definitions. 12/31/97: Changed the default C constructor to use calloc() instead of malloc() 12/30/97: Changed the creation of constants in the Perl5 module. For all practical purposes, they should work in exactly the same way as before except that they now require much less wrapper code. Modules containing large numbers of constants may see greater than a 50% reduction in wrapper code size. 12/30/97: Modified the Python module to be more intelligent about the creation of constants. SWIG no longer generates redundant global variables and the size of the module initialization function should be reduced. (Many thanks to Jim Fulton). 12/29/97: Fixed a bug in C++ code generation related to member functions, default arguments, and references. 12/29/97: Fixed configure script and a few makefiles to support Python 1.5 12/29/97: Added 'embed15.i' library file. This file should be used to statically link versions of Python 1.5. To make it the default, simply copy 'swig_lib/python/embed15.i' to 'swig_lib/python/embed.i' Version 1.1 Patch 3 (November 24, 1997) ======================================== 11/23/97: Fixed a bug in the Perl5 module with shadow classes and static class functions that return class instances. Note : The fix for this bug requires a slight restructuring of of the .pm files created by SWIG. 11/23/97: Fixed a bug in the Tcl/Tcl8 modules related to variable linking of character arrays. If you declared a global variable 'char foo[10]', the generated wrapper code would either cause a segmentation fault immediately upon loading or weird memory corruption elsewhere. This should now be fixed although character arrays can only be read-only. 11/23/97: Fixed a bug with the %import directive that caused it to fail if files were imported from directories other than the current working directory. 11/23/97: Fixed incorrect diagnostic message in the ASCII documentation module. 11/23/97: Changed the behavior of the -o option when used with shadow classes. If -o was used to specify both the pathname and filename of SWIG's output such as swig -o /home/swig/wrapper.c -shadow -perl5 foo.i The wrapper code would be placed the file specified with -o, but the .pm file and documentation would be placed in the directory where SWIG was run. Now, these files are placed in the same directory as the file specified with the -o option. This change is also needed for proper operation on the Macintosh. 11/23/97: Added a 'this()' method to Perl5 shadow classes. This can be used to return the normal pointer value from a shadow class that is represented as a tied hash. To use just invoke as a method like this : $l = new List; # Create an object $ptr = $l->this(); # Get the normal pointer value *** NEW FEATURE *** 11/23/97: Fixed the Tcl 8 pointer.i library file (which was completely broken in 1.1p2). 11/23/97: Modified the Perl5 type-checker to fix a few problems with global variables of pointer types and to allow tied hashes to be used interchangably with normal pointer values. 11/23/97: Modified the typemap mechanism to allow output typemaps of type 'void'. These were ignored previously, but now if you specify, %typemap(lang,out) void { ... return a void ... } You can change or assign a return value to the function. 11/23/97: Fixed processing of 'bool' datatypes in the Python module. 11/23/97: Fixed minor parsing error with C++ initializers. For example, class B : public A { public: B() : A() { ... }; ... } 11/23/97: Fixed the Tcl8 module so that C functions that call back into Tcl don't corrupt the return result object (SWIG was gathering the result object too early which leads to problems if subsequent Tcl calls are made). 11/23/97: Fixed a code generation bug in the Python module when two or more output parameters were used as the first arguments of a function. For example : %include typemaps.i void foo(double *OUTPUT, double *OUTPUT, double a); Previously, doing this resulted in the creation of an extraneous comma in the output, resulting in a C syntax error. 11/22/97: Fixed a bug when template handling that was stripping whitespace around nested templates. For example : Foo > was getting munged into Foo> which is a syntax error in in the C++ compiler. 11/22/97: Fixed bugs in the Borland C++ makefiles. 11/22/97: Fixed memory corruption bug when processing integer arguments in Tcl8 module. 11/21/97: Fixed a bug in the Runtime/Makefile related to Tcl 8. 11/21/97: Fixed a bug with the %new directive and Perl5 shadow classes. No longer generates a perl syntax error. 11/9/97 : Changed a strncpy() to strcpy() in the pointer type-checker. This results in a substantial performance improvement in type-checking. 10/29/97: Fixed a bug in the code generation of default arguments and user-defined types. For example : void foo(Vector a, Vector b = d); should now work properly. Version 1.1 Patch 2 (September 4, 1997) ======================================= 9/4/97 : Fixed problem with handling of virtual functions that was introduced by some changes in the C++ module. Version 1.1 Patch 1 (August 27, 1997) ===================================== 8/26/97 : Fixed compilation and run-time bugs with Tcl 8.0 final. 8/21/97 : Fixed code generation bug with arrays appearing as arguments to C++ member functions. For example : class Foo { public: void Bar(int a[20][20]); }; There is still a bug using arrays with added methods however. 8/20/97 : Fixed a bug with generating the code for added methods involving pass-by-value. 8/19/97 : Modified the typemapper to substitute the '$arg' value when declaring local variables. For example : %typemap(in) double * (double temp_$arg) { ... do something ... } When applied to a real function such as the following : void foo(double *a, double *b, double *result); three local variables will be created as follows : double temp_a; double temp_b; double temp_result; This can be used when writing multiple typemaps that need to access the same local variables. 7/27/97 : Fixed a variety of problems with the %apply directive and arrays. The following types of declarations should now work : %apply double [ANY] { Real [ANY] }; %apply double [4] { double [10] }; A generic version of apply like this : %apply double { Real }; should now work--even if arrays involving doubles and Reals are used later. 7/27/97 : Changed warning message about "Array X has been converted to Y" to only appear if running SWIG in verbose mode. 7/27/97 : Added the variables $parmname and $basemangle to the typemap generator. $parmname is the name of the parameter used when the typemap was matched. It may be "" if no parameter was used. $basemangle is a mangled version of the base datatype. Sometimes used for array handling. 7/27/97 : Changed the behavior of output arguments with Python shadow classes. Originally, if a function returned an object 'Foo', the shadow class mechanism would create code like this : def return_foo(): val = FooPtr(shadowc.return_foo()) val.this = 1 return val The problem with this is that typemaps allow a user to redefine the output behavior of a function--as a result, we can no longer make any assumptions about the return type being a pointer or even being a single value for that matter (it could be a list, tuple, etc...). If SWIG detects the use of output typemaps (either "out" or "argout") it returns the result unmodified like this : def return_foo(): val = shadowc.return_foo() return val In this case, it is up to the user to figure out what to do with the return value (including the possibility of converting it into a Python class). 7/26/97 : Fixed a parsing problem with types like 'unsigned long int', 'unsigned short int', etc... 7/24/97 : Minor bug fix to Tcl 8 module to parse enums properly. Also fixed a memory corruption problem in the type-checker. (patch contributed by Henry Rowley. 7/24/97 : Added Python-tuple typemaps contributed by Robin Dunn. 7/24/97 : Incorporated some changes to the Python module in support of Mark Hammond's COM support. I'm not entirely sure they work yet however. Needs documentation and testing. 7/24/97 : Fixed code generation bugs when structures had array members and typemaps were used. For example : %typemap(memberin) double [20][20] { ... get a double [20][20] ... } struct Foo { double a[20][20]; } Originally, this would generate a compiler-type error when the wrapper code was compiled. Now, a helper function like this is generated : double *Foo_a_set(Foo *a, double val[20][20]) { ... memberin typemap here ... return (double *) val; } When writing typemaps, one can assume that the source variable is an array of the *same* type as the structure member. This may break some codes that managed to work around the array bug. *** POTENTIAL INCOMPATIBILITY *** 7/13/97 : Fixed bug in Perl5 module when using C global variables that are pointers. When used in function calls and other operations, the value of the pointer would be invalid---causing core dumps and other problems. SWIG implements global variables using Perl magic variables. As it turns out, the error was caused by the fact that the pointer-extraction code was somehow bypassing the procedure used to resolve magical variables (hence, leaving the value undefined). To fix the problem, SWIG now explicitly resolves magic before extracting pointer values. 7/12/97 : Eliminated the last remnants of free() and malloc() from the SWIG compiler. 7/12/97 : Fixed parsing problems with typemaps involving arrays and temporary variables of arrays. Also made it possible for SWIG to handle typemaps like this : %typemap(in) double [ANY] (double temp[$dim0]) { ... store data in temp[$dim0] ... } Not only does this typemap match any double [] array, it creates a local variable with precisely the right dimensions. (ie. $dim0 gets filled in with the real number of dimensions). Of course, off the record, this will be a way to add more functionality to the typemaps.i libraries. 7/9/97 : Fixed some problems with Perl5, static linking, and shadow classes. When statically linking multiple modules together, write a top-level interface file like this when shadow classes are not used : %module swig, foo, bar, glob; %include perlmain.i When shadow classes are used, the module names have an extra 'c' appended so it should read as : %module swig, fooc, barc, globc; %include perlmain.i When linking multiple modules, consider using the SWIG runtime library. 7/8/97 : Incorporated fixed versions of the Borland C++ Makefiles. 7/8/97 : First cut at trying to eliminate excessive compiler warnings. As it turns out, alot of warnings go away if you just make declarations like this clientData = clientData; in the resulting wrapper code. Most compilers should just ignore this code (at least would can hope). 7/8/97 : Fixed bizarre code generation bug with typemaps and C++ classes. In some cases, typemaps containing printf formatting strings such as %typemap(memberout) int * { printf("%d",42); } Would generate completely bogus code with garbage replacing the '%d'. Caused by one faulty use of printf (wasn't able to find any other occurrences). 7/7/97 : Fixed bug in Python shadow class generation with non-member functions that are returning more than one value. 7/7/97 : Incorporated modifications to make SWIG work with Guile 1.2. Still need to test it out, but it is rumored to work. 7/2/97 : Fixed some bugs related to output arguments and Python shadow classes. If an output argument is detected, SWIG assumes that the result is a list and handles it appropriately. If the normal return type of an function is an object, it will be converted into a shadow class as before, but with the assumption that it is the first element of a list. *** NOTE : This behavior has been subsequently changed *** 6/29/97 : Changed EXPORT to SWIGEXPORT in all of the language modules. Should provide better compatibility with Windows. 6/29/97 : Modified Python shadow classes so that output arguments work correctly (when typemaps are used). Version 1.1 (June 24, 1997) =========================== 6/24/97 : Fixed Objective-C constructor bug when working with Perl5 shadow classes. 6/23/97 : Fixed some parsing problems with Objective-C. Declarations such as the following should work now : - foo : (int) a with: (int) b; 6/22/97 : Added SWIG Runtime library. This library contains the SWIG pointer type-checker and support functions that are normally included in every module. By using the library, it is easier to work with multiple SWIG generated modules. 6/22/97 : Fixed minor bug in Perl5 module related to static linking of multiple modules. 6/22/97 : Fixed some bugs with the %import directive. When used with Perl5 shadow classes, this generates a 'require' statement to load in external modules. 6/22/97 : Added -swiglib option. This prints out the location of the SWIG library and exits. This option is only really useful to configuration tools that are looking for SWIG and its library location (e.g. autoconf, configure, etc...). 6/21/97 : Fixed export bug with Perl5.004 on Windows-NT. 6/20/97 : Minor change to code generation of class/structure members in order to work better with typemaps. Should have no noticable impact on existing SWIG modules. 6/19/97 : Added -t option. This allows SWIG to load a typemap file before processing any declarations. For example : swig -t typemaps.i -python example.i At most, only one typemap file can be specified in this manner. *** NEW FEATURE *** 6/18/97 : Need a Makefile fast? Type swig [-tcl, -perl5, -python] -co Makefile and you will get a Makefile specific to that target language. You just need to modify it for your application and you're ready to run. 6/18/97 : Completed the -ci option. This option checks a file into the SWIG library. It should be used in conjunction with a language option. For example : swig -tcl -ci foobar.i Checks the file foobar.i into the Tcl part of the library. In order to check a file into the general library (accessible to all languages modules), do the following swig -ci -o ../foobar.i foobar.i (Admittedly this looks a little strange but is unavoidable). The check-in option is primarily designed for SWIG maintenance and library development. The command will fail if the user does not have write permission to the SWIG library. Third party library extensions can easily install themselves by simply providing a shell script that uses 'swig -ci' to install the appropriate library files. It is not necessary to know where the SWIG library is located if you use this mechanism. *** NEW FEATURE *** 6/16/97 : Fixed a bug in shadow class generation when %name() was applied to a class definition. Unfortunately, fixing the bug required a change in the Language C API by adding an extra argument to the Language::cpp_class_decl() function. This may break SWIG C++ extensions. *** POTENTIAL INCOMPATIBILITY *** 6/15/97 : Added a warning message if no module name is specified with the %module directive or -module option. 6/15/97 : Fixed line number bug when reporting errors for undefined base classes. 6/15/97 : Added new %rename directive. This allows the forward declaration of a renaming. For example : %rename OldName NewName; .... later ... int OldName(int); Unlike %name, %rename will rename any occurrence of the old name. This applies to functions, variables, class members and so forth. There is no way to disable %rename once set, but you can change the name by redeclaring it to something else. *** NEW FEATURE *** 6/15/97 : Improved the implementation of the %name directive so that it could be used with conditional compilation : #ifdef SWIG %name(NewName) #endif int OldName(int); 6/15/97 : Added support for functions with no return datatype. In this case, SWIG assumes a return type of 'int'. 6/11/97 : Improved error reporting in the parser. It should be a little less sensitive to errors that occur inside class definitions now. Also reports errors for function pointers. 6/11/97 : Made '$' a legal symbol in identifiers. This is to support some Objective-C libraries. Some compilers (such as gcc) may also allow identifiers to contain a $ in C/C++ code as well (this is an obscure feature of C). When '$' appears in identifier, SWIG remaps it to the string '_S_' when creating the scripting language function. Thus a function 'foo$bar' would be called 'foo_S_bar'. 6/11/97 : Fixed bug in Python shadow classes with __repr__ method. If supplied by the user, it was ignored, but now it should work. 6/9/97 : Fixed the Tcl 8.0 module to work with Tcl 8.0b1. SWIG is no longer compatible with *any* alpha release of Tcl 8.0. *** POTENTIAL INCOMPATIBILITY *** 6/7/97 : Put a maximal error count in (currently set to 20). SWIG will bail out if it generates more errors than this (useful for preventing SWIG from printing 4000 syntax errors when it gets confused). 6/7/97 : Fixed segmentation fault when parsing variable length arguments. 6/7/97 : Minor change to Perl5 module. C++ static functions are now put in the same package as their class when using shadow classes. 6/7/97 : Centralized the naming of functions, members, wrappers etc... By centralizing the naming scheme, it should be possible to make some multi-file optimizations. Also, it should be possible to change SWIG's naming scheme (perhaps a new feature to be added later). 6/2/97 : Added 'arginit' typemap. This can be used to assign initial values to function arguments. Doing so makes it somewhat easier to detect improper argument passing when working with other typemaps. 6/2/97 : Fixed code generation bug when read-only variables were inherited into other classes. Under inheritance, the variables would become writable, but this has now been corrected. 5/30/97 : An empty %name() directive is no longer allowed or supported. This directive was originally used to strip the prefix off of a class or structure. Unfortunately, this never really seemed to work right and it complicated the C++ code generator significantly. As far as I can tell no one uses it, so it is now history. *** POTENTIAL INCOMPATIBILITY *** 5/28/97 : Fixed a parsing bug with #define and C++ comments. Declarations such as the following now work properly : #define CONST 4 // A Comment 5/28/97 : Made some performance improvements to the SWIG String class. (only affects the SWIG compiler itself). 5/28/97 : Modified the parser to skip template definitions and issue a warning message. 5/28/97 : Preliminary support for parameterized types added (ie. templates). Types such as the following should pass through the SWIG compiler void foo(vector *a, vector *b); When used, the entire name 'vector' becomes the name of the datatype. Due to space limitations in datatype representations, the name should not exceed 96 characters. Note : This is only part of what is needed for template support. Template class definitions are not yet supported by SWIG. The template notation above may also be used when specifying Objective-C protocol lists. *** NEW FEATURE *** 5/24/97 : First cut at Objective-C support added. As it turns out, almost everything can be handled with only a few minor modifications to the C++ module. *** NEW FEATURE *** 5/23/97 : Fixed repeated definition bug in multiple inheritance handling when multiple base classes share a common base class (ie. the evil diamond). 5/21/97 : Fixed rather embarrassing typo that worked its way into the Tests/Build directory. 5/19/97 : Fixed code generation bug when using native methods and shadow classes with Python and Perl5 modules. 5/19/97 : Modified the %apply directive slightly so that it would work with pointers a little better. For example : %apply unsigned long { DWORD }; Applies *all* typemaps associated with "unsigned long" to "DWORD". This now includes pointers to the two datatypes. For example, a typemap applied to "unsigned long **" would also be applied to any occurrence of "DWORD **" as well. 5/19/97 : Fixed an ownership assignment bug in the Perl5 module when class members were returning new objects belonging to different classes. 5/17/97 : Added a few more typemap variables. $name - Name of function/variable/member $basetype - Base datatype (type without pointers) $argnum - Argument number 5/16/97 : Fixed embarrassing underscore error in local variable allocator. 5/16/97 : Fixed namespace clash bug in parameterized typemaps when creating arrays as new local variables. 5/15/97 : Fixed some bugs with inheritance of added methods across multiple files. SWIG now uses names of base classes when generating such functions. 5/14/97 : Finished support for default typemaps. Primarily used internally, they can be used to match the basic built-in datatypes used inside of SWIG. You can specify them in interface files as well like this : %typemap(tcl,in) int SWIG_DEFAULT_TYPE { $target = atoi($target); } Unlike normal typemaps, this default map will get applied to *all* integer datatypes encountered, including those renamed with typedef, etc... 5/13/97 : Fixed substring bug in type checker. 5/12/97 : Fixed bug in parameterized typemaps when declaring local variables of structures. Version 1.1 Beta6 (May 9, 1997) =============================== 5/9/97 : Fixed bizarre NULL pointer handling bug in Perl5 module. 5/8/97 : Fixed mysterious segmentation fault when running SWIG on an empty file. 5/7/97 : The code generator will now replace the special symbol "$cleanup" with the cleanup code specified with the "freearg" typemap. This change needed to properly manage memory and exceptions. 5/5/97 : Added the 'typemaps.i' library file. This contains a variety of common typemaps for input values, pointers, and so on. 5/5/97 : Changed behavior of "argout" typemap in Python module. Old versions automatically turned the result into a Python list. The new version does nothing, leaving the implementation up to the user. This provides more flexibility but may break older codes that rely on typemaps. *** POTENTIAL INCOMPATIBILITY *** 5/5/97 : Fixed bug in Python module related to the interaction of "argout" and "ignore" typemaps. 5/5/97 : Fixed bug in Python module that would generate incorrect code if all function arguments are "ignored". 5/4/97 : Added %apply and %clear directives. These form a higher level interface to the typemap mechanism. In a nutshell, they can be used to change the processing of various datatypes without ever having to write a typemap. See the SWIG documentation for more details. ** NEW FEATURE ** 5/4/97 : Added a local variable extension to the typemap handler. For example : %typemap(tcl,in) double *(double temp) { temp = atof($source); $target = &temp; } In this case, 'temp' is a local variable that exists in the entire wrapper function (not just the typemap code). This mechanism provides better support for certain types of argument handling and also makes it possible to write thread-safe typemaps. Any number local variables can be declared by supplying a comma separated list. Local variables are guaranteed to be unique, even if the same typemap is applied many times in a given function. ** Not currently supported in Perl4 or Guile modules. 5/2/97 : Fixed processing of %ifdef, %endif, %if, etc... (These are SWIG equivalents of the C preprocessor directives that can pass through the C preprocessor without modification). 5/2/97 : Fixed major (but subtle) bug in the run-time type checker related to searching and type-checking for C++ inheritance. To make a long story short, if you had two classes named "Foo" and "FooObject" the type checker would sometimes get confused and be unable to locate "Foo" in an internal table. 5/2/97 : Fixed some bugs in the -co option. 4/24/97 : Pointer library added to the SWIG library. 4/19/97 : Added the %new directive. This is a "hint" that can be used to tell SWIG that a function is returning a new object. For example : %new Foo *create_foo(); This tells SWIG that create_foo() is creating a new object and returning a pointer to it. Many language modules may choose to ignore the hint, but when working with shadow classes, the %new is used to handle proper ownership of objects. %new can also be used with dynamically allocated strings. For example : %new char *create_string(); When used, all of the language modules will automatically cleanup the returned string--eliminating memory leaks. ** NEW FEATURE ** 4/19/97 : Added a new typemap "newfree". This is used in conjunction with the %new directive and can be used to change the method by which a new object returned by a function is deleted. 4/19/97 : The symbol "__cplusplus" is now defined in the SWIG interpreter when running with the -c++ option. 4/17/97 : Added support for static member functions when used inside the %addmethods directive. 4/15/97 : Added a special typemap symbol PREVIOUS that can be used to restore a previous typemap. For example : %typemap(tcl,in) int * = PREVIOUS; This is primarily used in library files. 4/13/97 : Added %pragma directive for Perl5 module. Two new pragmas are available : %pragma(perl5) code = "string" %pragma(perl5) include = "file.pl" Both insert code into the .pm file created by SWIG. This can be used to automatically customize the .pm file created by SWIG. 4/13/97 : Scanner modified to only recognize C++ keywords when the -c++ option has been specified. This provides support for C programs that make use of these keywords for identifiers. SWIG may need to be explicitly run with the -c++ option when compiling C++ code (this was allowed, but not recommended in previous versions). **POTENTIAL INCOMPATIBILITY** 4/11/97 : Fixed a rather nasty bug in the Perl5 module related to using variable linking with complex datatypes and pointers. On Unix, code would work (somehow), but would cause an access violation under Windows-NT. The fix should correct the problem, but there may still be a problem using global variables of complex datatypes in conjunction with shadow classes. Fortunately, this sort of thing seems to be relatively rare (considering that the bug has been around for more than a year - yikes!). 4/11/97 : Fixed bizarre constant evaluation bug in Perl5 code generation when running under Windows-NT. 4/8/97 : Bug when using default arguments and C++ references fixed. 4/8/97 : Fixed code generation bugs in Python and Perl5 modules related to using class renaming (applying the %name directive to a class definition) and shadow classes. 4/7/97 : Fixed minor bugs in swigptr.swg, tcl8ptr.swg, and perl5ptr.swg to prevent infinite loops when weird datatypes are passed. 3/29/97 : 'Makefile.win' added. This is used to build most of the examples in the Examples directory under Windows NT/95. 3/27/97 : Fixes to SWIG's error return codes. SWIG now returns non-zero exit codes for certain kinds of errors (which makes it more friendly to makefiles). An overhaul of the error handling is on the to-do list and will probably show up in a later release. 3/25/97 : Bug fix. "freearg" and "argout" typemaps have been fixed in the Perl5 module. In previous versions, function input parameters and function output parameters shared the same memory space--causing all sorts of nasty problems when trying to pass perl values by reference. SWIG now internally makes a "copy" (which is really just a pointer) of affected parameters and uses that. This is done transparently so there is no noticable impact on any SWIG generated modules. This change is probably only noticable to expert users. 3/25/97 : Added type-check to verbose and stat mode. SWIG will now generate a list of all datatypes that were used but undefined (useful for tracking down weird bugs). This is enabled with the -v option (which is now officially known as "overly verbose" mode) or the -stat option. 3/25/97 : Slight change to the parser to make include guards work correctly. For example : #ifndef INTERFACE_I #define INTERFACE_I %module foobar.i ... declarations ... #endif 3/24/97 : %checkout directive added. This allows an interface file to extract files from the SWIG library and place them in the current directory. This can be used to extract scripts and other helper code that might be associated with library files. For example : %checkout array.tcl Will look for a file "array.tcl" in the library and copy it to the current directory. If the file already exists in the directory, this directive does nothing (it will not overwrite an existing file). This only an experimental feature for now. 3/24/97 : SWIG will now look in the SWIG Library for a file if it can't find it in the current directory. As a result, it is easy to make modules from SWIG library files. For example, if you want to make a Python module from the SWIG timers library, just type this in any directory : swig -python timers.i You will get the files timers_wrap.c and timers_wrap.doc in the current directory that you can now compile. The file remains in the SWIG library (although you can check it out using the -co option). *** New Feature *** 3/24/97 : -co option added to SWIG to allow easy access to the SWIG library. When used, this instructs SWIG to check out a library file and place it in the current directory. For example : unix > swig -co array.i array.i checked out from the SWIG library unix > Once in your directory you can customize the file to suit your particular purposes. The checkout option makes it easy to grab library files without knowing anything about the SWIG installation, but it also makes it possible to start including scripts, C code, and other miscellaneous files in the library. For example, you could put a cool script in the library and check it out whenever you wanted to use it. *** New Feature *** 3/24/97 : #pragma export directives added to Tcl output for compiling shared libraries on the Mac. 3/24/97 : Minor changes to wish.i and tclsh.i library files to provide support for the Macintosh. 3/19/97 : SWIG's policy towards NULL pointers has been relaxed. The policy of requiring a special compiler directive -DALLOW_NULL to use NULL pointers is no longer supported. While this may seem "unsafe", it turns out that you can use a "check" typemap to achieve some safety. For example : %typemap(perl5,check) Node * { if (!$target) croak("NULL Pointers not allowed."); } This prevents any NULL value of a "Node *" pointer to be passed to a function. (I think this is much cleaner than the old -DALLOW_NULL hack anyways). 3/19/97 : Fixed pointer handling errors in Perl5 module. Modules no longer core dump when a Perl reference is inadvertently passed in as a C pointer. 3/18/97 : Added a "check" typemap. This can be used to check the validity of function input values. For example : %typemap(perl5,check) int posint { if ($target < 0) croak("Argument is not a positive integer"); } 3/18/97 : Added an $arg variable to Tcl typemaps. This makes it easier to return argument values by "reference". 3/18/97 : Fixed a code generation bug when using C++ references and the %addmethods directive. 3/18/97 : Fixed a few glitches in the typemap module with respect to chaining. For example : %typemap(tcl,in) int { $in // Inserts prexisting typemap printf("Received a %d\n", $target); } This has been allowed for quite some time, but didn't work if no existing typemap was defined. Now, it still doesn't work if no existing typemap is defined, but it issues a warning message. There is some support using default typemaps, but none of the language modules take advantage of it. This should be considered experimental at this time. Version 1.1b5 Patch 1 (March 16, 1997) ====================================== 3/16/97 : Fixed references bug with C++ code generation. 3/16/97 : Fixed initialization bug in the documentation system that was causing weird problems. 3/16/97 : Fixed fatal bug with -c option in the Python module. 3/13/97 : Fixed bug in the documentation system involving the %text directive and sorting. In the old system, %text entries would float to the top of a section because they were "nameless". Now they are attached to the previous declaration and will stay in the proper location relative to the previous entry. Version 1.1b5 (March 12, 1997) ============================== 3/11/97 : Fixed compilation problems introduced by Tcl/Tk 8.0a2. *** INCOMPATIBILITY *** SWIG no longer works with Tcl/Tk 8.0a1. 3/10/97 : Fixed bug with ignored arguments and C++ member functions in the Python module. 3/9/97 : Parsing bugs with nested class definitions and privately declared nested class definitions fixed. 3/9/97 : Fixed a few minor code generation bugs with C++ classes and constructors. In some cases, the resulting wrapper code would not compile properly. SWIG now attempts to use the default copy constructor instead. 3/8/97 : Added a -l option to SWIG that allows additional SWIG library files to be grabbed without having them specified in the interface file. This makes it easier to keep the interface file clean and move certain options into a Makefile. For example : swig -tcl example.i # Build a normal Tcl extension swig -tcl -lwish.i example.i # Build it as a wish extension # by including the 'wish.i' file. swig -python example.i # Build a dynamically loaded extension swig -python -lembed.i example.i # Build a static extension These kinds of options could previously be accomplished with conditional compilation such as : %module example ... #ifdef STATIC %include embed.i #endif 3/8/97 : Incorporated changes to Guile module to use the new gh interface in FSF Guile 1.0. The older gscm interface used in Cygnus Guile releases is no longer supported by SWIG. 3/8/97 : Cleaned up the Tcl Netscape plugin example. It should work with version 1.1 of the plugin now. 3/8/97 : Added better array support to the typemap module. The keyword ANY can now be used to match any array dimension. For example : %typemap(tcl,in) double [ANY] { ... get an array ... } This will match any single-dimensional double array. The array dimension is passed in the variables $dim0, $dim1, ... $dim9. For example : %typemap(tcl,in) double [ANY][ANY][ANY] { printf("Received a double[%d][%d][%d]\n",$dim0,$dim1,$dim2); } Any typemap involving a specific array dimension will override any specified with the ANY tag. Thus, a %typemap(tcl,in) double [5][4][ANY] {} would override a double [ANY][ANY][ANY]. However, overuse of the ANY tag in arrays of high-dimensions may not work as you expect due to the pattern matching rule used. For example, which of the following typemaps has precedence? %typemap(in) double [ANY][5] {} // Avoid this! %typemap(in) double [5][ANY] {} 3/7/97 : Fixed a number of bugs related to multi-dimensional array handling. Typedefs involving multi-dimensional arrays now works correctly. For example : typedef double MATRIX[4][4]; ... extern double foo(MATRIX a); Typecasting of pointers into multi-dimensional arrays is now implemented properly when making C/C++ function calls. 3/6/97 : Fixed potentially dangerous bug in the Tcl Object-oriented interface. Well, actually, didn't fix it but issued a Tcl error instead. The bug would manifest itself as follows: % set l [List] # Create an object ... % set m [List -this $l] # Make $m into an object assuming $l # contains a pointer. # Since $m == $l, $l gets destroyed # (since its the same command name) % $m insert Foo Segmentation fault # Note : the list no longer exists! Now, an error will be generated instead of redefining the command. As in : % set l [List] ... % set m [List -this $l] Object name already exists! Use catch{} to ignore the error. 3/3/97 : Better support for enums added. Datatypes of 'enum MyEnum' and typedefs such as 'typedef enum MyEnum Foo;' now work. 3/3/97 : Parser modified to ignore constructor initializers such as : class Foo : public Bar { int a,b; public: Foo(int i) : a(0), b(i), Bar(i,0) { }; }; 3/3/97 : Modified parser to ignore C++ exception specifications such as : int foo(double) throw(X,Y); 3/3/97 : Added %import directive. This works exactly like %extern except it tells the language module that the declarations are coming from a separate module. This is usually only needed when working with shadow classes. 3/2/97 : Changed pointer type-checker to be significantly more efficient when working with derived datatypes. This has been accomplished by storing type-mappings in sorted order, using binary search schemes, and caching recently used datatypes. For SWIG generated C++ modules that make a large number of C function calls with derived types, this could result in speedups of between 100 and 50000 percent. However, due to the required sorting operation, module loading time may increased slightly when there are lots of datatypes. 3/2/97 : Fixed some C++ compilation problems with Python embed.i library files. 2/27/97 : Slight change to C++ code generation to use copy constructors when returning complex data type by value. 2/26/97 : Fixed bug in Python module with -c option. 2/26/97 : Slight tweak of parser to allow trailing comma in enumerations such as enum Value (ALE, STOUT, LAGER, }; 2/25/97 : Fixed code generation bug in Tcl module when using the %name() directive on a classname. 2/25/97 : Finished code-size optimization of C++ code generation with inheritance of attributes. Inherited attributes now only generate one set of wrapper functions that are re-used in any derived classes. This could provide big code size improvements in some scripting language interfaces. 2/25/97 : Perl5 module modified to support both the Unix and Windows versions. The windows version has been tested with the Activeware port of Perl 5.003 running under Windows 95. The C source generated by SWIG should compile without modification under both versions of Perl, but is now even more hideous than before. 2/25/97 : Modified parser to allow scope resolution operation to appear in expressions and default arguments as in : void foo(int a = Bar::defvalue); 2/25/97 : Fixed bug when resolving symbols inside C++ classes. For example : class Foo { public: enum Value {ALE, STOUT, LAGER}; ... void defarg(Value v = STOUT); }; 2/24/97 : Fixed bug with member functions returning void *. 2/23/97 : Modified Python module to be better behaved under Windows - Module initialization function is now properly exported. It should not be necessary to explicitly export this function yourself. - Bizarre compilation problems when compiling the SWIG wrapper code as ANSI C under Visual C++ 4.x fixed. - Tested with both the stock Python-1.4 distribution and Pythonwin running under Win95. 2/19/97 : Fixed typedef handling bug in Perl5 shadow classes. 2/19/97 : Added exception support. To use it, do the following : %except(lang) { ... try part of the exception ... $function ... catch part of exception ... } $function is a SWIG variable that will be replaced by the actual C/C++ function call in a wrapper function. Thus, a real exception specification might look like this : %except(perl5) { try { $function } catch (char *& sz) { ... process an exception ... } catch(...) { croak("Unknown exception. Bailing out..."); } } 2/19/97 : Added support for managing generic code fragments (needed for exceptions). 2/19/97 : Fixed some really obscure typemap scoping bugs in the C++ handler. 2/18/97 : Cleaned up perlmain.i file by removing some problematic, but seemingly unnecessary declarations. 2/18/97 : Optimized handling of member functions under inheritance. SWIG can now use wrapper functions generated for a base class instead of regenerating wrappers for the same functions in a derived class. This could make a drastic reduction in wrapper code size for C++ applications with deep inheritance hierarchies and lots of functions. 2/18/97 : Additional methods specified with %addmethods can now be inherited along with normal C++ member functions. 2/18/97 : Minor internal fixes to make SWIG's string handling a little safer. 2/16/97 : Moved some code generation of Tcl shadow classes to library files. 2/16/97 : Fixed documentation error of '-configure' method in Tcl modules. 2/16/97 : Modified Perl5 module slightly to allow typemaps to use Perl references. 2/12/97 : Fixed argument checking bug that was introduced by default arguments (function calls with too many arguments would still be executed). Functions now must have the same number of arguments as C version (with possibility of default/optional arguments still supported). 2/12/97 : Fixed default argument bug in Perl5 module when generating wrapper functions involving default arguments of complex datatypes. 2/12/97 : Fixed typemap scoping problems. For example : %typemap(tcl,in) double { .. get a double .. } class Foo { public: double bar(double); } %typemap(tcl,in) double { .. new get double .. } Would apply the second typemap to all functions in Foo due to delayed generation of C++ wrapper code (clearly this is not the desired effect). Problem has been fixed by assigning unique numerical identifiers to every datatype in an interface file and recording the "range of effect" of each typemap. 2/11/97 : Added support for "ignore" and "default" typemaps. Only use if you absolutely know what you're doing. 2/9/97 : Added automatic creation of constructors and destructors for C structs and C++ classes that do not specify any sort of constructor or destructor. This feature can be enabled by running SWIG with the '-make_default' option or by inserting the following pragma into an interface file : %pragma make_default The following pragma disables automatic constructor generation %pragma no_default 2/9/97 : Added -make_default option for producing default constructors and destructors for classes without them. 2/9/97 : Changed the syntax of the SWIG %pragma directive to %pragma option=value or %pragma(lang) option=value. This change makes the syntax a little more consistent between general pragmas and language-specific pragmas. The old syntax still works, but will probably be phased out (a warning message is currently printed). 2/9/97 : Improved Tcl support of global variables that are of structures, classes, and unions. 2/9/97 : Fixed C++ compilation problem in Python 'embed.i' library file. 2/9/97 : Fixed missing return value in perlmain.i library file. 2/9/97 : Fixed Python shadow classes to return an AttributeError when undefined attributes are accessed (older versions returned a NameError). 2/9/97 : Fixed bug when %addmethods is used after a class definition whose last section is protected or private. 2/8/97 : Made slight changes in include file processing to support the Macintosh. 2/8/97 : Extended swigmain.cxx to provide a rudimentary Macintosh interface. It's a really bad interface, but works until something better is written. 1/29/97 : Fixed type-casting bug introduced by 1.1b4 when setting/getting the value of global variables involving complex data types. 1/29/97 : Removed erroneous white space before an #endif in the code generated by the Python module (was causing errors on DEC Alpha compilers). 1/26/97 : Fixed errors when using default/optional arguments in Python shadow shadow classes. 1/23/97 : Fixed bug with nested %extern declarations. 1/21/97 : Fixed problem with typedef involving const datatypes. 1/21/97 : Somewhat obscure, but serious bug with having multiple levels of typedefs fixed. For example : typedef char *String; typedef String Name; Version 1.1 Beta4 (January 16, 1997) ==================================== Note : SWIG 1.1b3 crashed and burned shortly after take off due to a few major run-time problems that surfaced after release. This release should fix most, if not all, of those problems. 1/16/97 : Fixed major memory management bug on Linux 1/14/97 : Fixed bug in functions returning constant C++ references. 1/14/97 : Modified C++ module to handle datatypes better. 1/14/97 : Modified parser to allow a *single* scope resolution operator in datatypes. Ie : Foo::bar. SWIG doesn't yet handle nested classes, so this should be sufficient for now. 1/14/97 : Modified parser to allow typedef inside a C++ class. 1/14/97 : Fixed some problems related to datatypes defined inside a C++ class. SWIG was not generating correct code, but a new scoping mechanism and method for handling datatypes inside a C++ class have been added. 1/14/97 : Changed enumerations to use the value name instead of any values that might have appeared in the interface file. This makes the code a little more friendly to C++ compilers. 1/14/97 : Removed typedef bug that made all enumerations equivalent to each other in the type checker (since it generated alot of unnecessary code). Version 1.1 Beta3 (January 9, 1997) =================================== Note : A *huge* number of changes related to ongoing modifications. 1. Support for C++ multiple inheritance added. 2. Typemaps added. 3. Some support for nested structure definitions added. 4. Default argument handling added. 5. -c option added for building bare wrapper code modules. 6. Rewrote Pointer type-checking to support multiple inheritance correctly. 7. Tcl 8.0 module added. 8. Perl4 and Guile modules resurrected from the dead (well, they at least work again). 9. New Object Oriented Tcl interface added. 10. Bug fixes to Perl5 shadow classes. 11. Cleaned up many of the internal modules of the parser. 12. Tons of examples and testing modules added. 13. Fixed bugs related to use of "const" return values. 14. Fixed bug with C++ member functions returning void *. 15. Changed SWIG configuration script. Version 1.1 Beta2 (December 3, 1996) ==================================== 1. Completely rewrote the SWIG documentation system. The changes involved are too numerous to mention. Basically, take everything you knew about the old system, throw them out, and read the file Doc/doc.ps. 2. Limited support for #if defined() added. 3. Type casts are now allowed in constant expressions. ie #define A (int) 3 4. Added support for typedef lists. For example : typedef struct { double x,y,z; } Vector, *VectorPtr; 5. New SWIG directives (related to documentation system) %style %localstyle %subsection %subsubsection 6. Reorganized the C++ handling and made it a little easier to work with internally. 7. Fixed problem with inheriting data members in Python shadow classes. 8. Fixed symbol table problems with shadow classes in both Python and Perl. 9. Fixed annoying segmentation fault bug in wrapper code generated for Perl5. 10. Fixed bug with %addmethods directive. Now it can be placed anywhere in a class. 11. More test cases added to the SWIG self-test. Documentation tests are now performed along with other things. 12. Reorganized the SWIG library a little bit and set it up to self-document itself using SWIG. 13. Lots and lots of minor bug fixes (mostly obscure, but bugs nonetheless). Version 1.1 Beta1 (October 30, 1996) ==================================== 1. Added new %extern directive for handling multiple files 2. Perl5 shadow classes added 3. Rewrote conditional compilation to work better 4. Added 'bool' datatype 5. %{,%} block is now optional. 6. Fixed some bugs in the Python shadow class module 7. Rewrote all of the SWIG tests to be more informative (and less scary). 8. Rewrote parameter list handling to be more memory efficient and flexible. 9. Changed parser to ignore 'static' declarations. 10. Initializers are now ignored. For example : struct FooBar a = {3,4,5}; 11. Somewhat better parsing of arrays (although it's usually just a better error message now). 12. Lot's of minor bug fixes. Version 1.0 Final (August 31, 1996) =================================== 1. Fixed minor bug in C++ module 2. Fixed minor bug in pointer type-checker when using -DALLOW_NULL. 3. Fixed configure script to work with Python 1.4beta3 4. Changed configure script to allow compilation without yacc or bison. Version 1.0 Final (August 28, 1996) =================================== 1. Changed parser to support more C/C++ datatypes (well, more variants). Types like "unsigned", "short int", "long int", etc... now work. 2. "unions" added to parser. 3. Use of "typedef" as in : typedef struct { double x,y,z; } Vector; Now works correctly. The name of the typedef is used as the structure name. 4. Conditional compilation with #ifdef, #else, #endif, etc... added. 5. New %disabledoc, %enabledoc directives allow documentation to selectively be disabled for certain parts of a wrapper file. 6. New Python module supports better variable linking, constants, and shadow classes. 7. Perl5 module improved with better compatibility with XS and xsubpp. SWIG pointers and now created so that they are compatible with xsubpp pointers. 8. Support for [incr Tcl] namespaces added to Tcl module. 9. %pragma directive added. 10. %addmethods directive added. 11. %native directive added to allow pre-existing wrapper functions to be used. 12. Wrote configure script for SWIG installation. 13. Function pointers now allowed with typedef statements. 14. %typedef modified to insert a corresponding C typedef into the output file. 15. Fixed some problems related to C++ references. 16. New String and WrapperFunction classes add to make generating wrapper code easier. 17. Fixed command line option processing to eliminate core dumps and to allow help messages. 18. Lot's of minor bug fixes to almost all code modules Version 1.0 Beta 3 (Patch 1) July 17, 1996 ========================================== 1.0 Final is not quite ready yet, but this release fixes a number of immediate problems : 1. Compiler errors when using -strict 1 type checking have been fixed. 2. Pointer type checker now recognizes pointers of the form _0_Type correctly. 3. A few minor fixes were made in the Makefile Version 1.0 Beta 3 (June 14, 1996) ================================== There are lots of changes in this release : 1. SWIG is now invoked using the "swig" command instead of "wrap". Hey, swig sounds cooler. 2. The SWIG_LIB environment variable can be set to change the location where SWIG looks for library files. 3. C++ support has been added. You should use the -c++ option to enable it. 4. The %init directive has been replaced by the %module directive. %module constructs a valid name for the initialization function for whatever target language you're using (actually this makes SWIG files a little cleaner). The old %init directive still works. 5. The syntax of the %name directive has been changed. Use of the old one should generate a warning message, but may still work. 6. To support Tcl/Tk on non-unix platforms, SWIG imports a file called swigtcl.cfg from the $(SWIG_LIB)/tcl directory. I don't have access to an NT machine, but this file is supposedly allows SWIG to produce wrapper code that compiles on both UNIX and non UNIX machines. If this doesn't work, you'll have to edit the file swigtcl.cfg. Please let me know if this doesn't work so I can update the file as necessary. 7. The SWIG run-time typechecker has been improved. You can also now redefine how it works by supplying a file called "swigptr.cfg" in the same directory as your SWIG interface files. By default, SWIG reads this file from $(SWIG_LIB)/config. 8. The documentation system has been changed to support the following : - Documentation order is printed in interface file order by default. This can be overridden by putting an %alpha directive in the beginning of the interface file. - You can supply additional documentation text using %text %{ put your text here %} - A few minor bugs were fixed. 9. A few improvements have been made to the handling of command line options (but it's still not finished). 10. Lots of minor bug fixes in most of the language modules have been made. 11. Filenames have been changed to 8.3 for compatibility with a SWIG port to non-unix platforms (work in progress). 12. C++ file suffix is now .cxx (for same reason). 13. The documentation has been upgraded significantly and is now around 100 pages. I added new examples and a section on C++. The documentation now includes a Table of Contents. 14. The SWIG Examples directory is still woefully sparse, but is getting better. Special notice about C++ ------------------------ This is the first version of SWIG to support C++ parsing. Currently the C++ is far from complete, but seems to work for simple cases. No work has been done to add special C++ processing to any of the target languages. See the user manual for details about how C++ is handled. If you find problems with the C++ implementation, please let me know. Expect major improvements in this area. Note : I have only successfully used SWIG and C++ with Tcl and Python. Notice about Version 1.0Final ----------------------------- Version 1.0B3 is the last Beta release before version 1.0 Final is released. I have frozen the list of features supported in version 1.0 and will only fix bugs as they show up. Work on SWIG version 2.0 is already in progress, but is going to result in rather significant changes to SWIG's internal structure (hopefully for the better). No anticipated date for version 2.0 is set, but if you've got an idea, let me know. Version 1.0 Beta 2 (April 26, 1996) =================================== This release is identical to Beta1 except a few minor bugs are fixed and the SWIG library has been updated to work with Tcl 7.5/Tk 4.1. A tcl7.5 examples directory is now included. - Fixed a bug in the Makefile that didn't install the libraries correctly. - SWIG Library files are now updated to work with Tcl 7.5 and Tk 4.1. - Minor bug fixes in other modules. Version 1.0 Beta 1 (April 10, 1996). ===================================== This is the first "semi-official" release of SWIG. It has a number of substantial improvements over the Alpha release. These notes are in no particular order--hope I remembered everything.... 1. Tcl/Tk SWIG is known to work with Tcl7.3, Tk3.6 and later versions. I've also tested SWIG with expect-5.19. Normally SWIG expects to use the header files "tcl.h" and "tk.h". Newer versions of Tcl/Tk use version numbers. You can specify these in SWIG as follows : % wrap -htcl tcl7.4.h -htk tk4.0.h example.i Of course, I prefer to simply set up symbolic links between "tcl.h" and the most recent stable version on the machine. 2. Perl4 This implementation has been based on Perl-4.035. SWIG's interface to Perl4 is based on the documentation provided in the "Programming Perl" book by Larry Wall, and files located in the "usub" directory of the Perl4 distribution. In order to compile with Perl4, you'll need to link with the uperl.o file found in the Perl4 source directory. You may want to move this file to a more convenient location. 3. Perl5 This is a somewhat experimental implementation, but is alot less buggy than the alpha release. SWIG operates independently of the XS language and xsubpp supplied with Perl5. Currently SWIG produces the necessary C code and .pm file needed to dynamically load a module into Perl5. To support Perl5's notion of modules and packages (as with xsubpp), you can use the following command line options : % wrap -perl5 -module MyModule -package MyPackage example.i Note : In order for dynamic loading to be effective, you need to be careful about naming. For a module named "MyModule", you'll need to create a shared object file called "MyModule.so" using something like % ld -shared my_obj.o -o MyModule.so The use of the %init directive must match the module name since Perl5 calls a function "boot_ModuleName" in order to initialize things. See the Examples directory for some examples of how to get things to work. 4. Python1.3 This is the first release supporting Python. The Python port is experimental and may be rewritten. Variable linkage is done through functions which is sort of a kludge. I also think it would be nice to import SWIG pointers into Python as a new object (instead of strings). Of course, this needs a little more work. 5. Guile3 If you really want to live on the edge, pick up a copy of Guile-iii and play around with this. This is highly experimental---especially since I'm not sure what the official state of Guile is these days. This implementation may change at any time should I suddenly figure out better ways to do things. 6. Extending SWIG SWIG is written in C++ although I tend to think of the code as mostly being ANSI C with a little inheritance thrown in. Each target language is implemented as a C++ class that can be plugged into the system. If you want to add your own modifications, see Appendix C of the user manual. Then take a look at the "user" directory which contains some code for building your own extenions. 7. The SWIG library The SWIG library is still incomplete. Some of the files mentioned in the user manual are unavailable. These files will be made available when they are ready. Subscribe to the SWIG mailing list for announcements and updates. 8. SWIG Documentation I have sometimes experienced problems viewing the SWIG documentation in some postscript viewers. However, the documentation seems to print normally. I'm working on making much of the documentation online, but this takes time. Version 0.1 Alpha (February 9, 1996) ==================================== 1. Run-time type-checking of SWIG pointers. Pointers are now represented as strings with both numeric and encoded type information. This makes it a little harder to shoot yourself in the foot (and it eliminates some segmentation faults and other oddities). 2. Python 1.3 now supported. 3. #define and enum can be used to install constants. 4. Completely rewrote the %include directive and made it alot more powerful. 5. Restructured the SWIG library to make it work better. 6. Various bug fixes to Tcl, Perl4, Perl5, and Guile implementations. 7. Better implementation of %typedef directive. 8. Made some changes to SWIG's class structure to make it easier to expand. SWIG is now built into a library file that you can use to make your own extenions. 9. Made extensive changes to the documentation. 10. Minor changes to the SWIG parser to make it use less memory. Also took out some extraneous rules that were undocumented and didn't work in the first place. 11. The SWIG library files "tclsh", "wish", "expect", etc... in the first release have been restructured and renamed to "tclsh.i", "wish.i", and so on. swig-4.0.2/Examples/0000755000175000017500000000000013667507523014140 5ustar williamwilliamswig-4.0.2/Examples/pike/0000755000175000017500000000000013667507523015070 5ustar williamwilliamswig-4.0.2/Examples/pike/class/0000755000175000017500000000000013667507523016175 5ustar williamwilliamswig-4.0.2/Examples/pike/class/example.i0000644000175000017500000000021513667507523020000 0ustar williamwilliam/* File : example.i */ %module example %{ #include "example.h" %} /* Let's just grab the original header file here */ %include "example.h" swig-4.0.2/Examples/pike/class/example.cxx0000644000175000017500000000065013667507523020355 0ustar williamwilliam/* File : example.cxx */ #include "example.h" #define M_PI 3.14159265358979323846 /* Move the shape to a new location */ void Shape::move(double dx, double dy) { x += dx; y += dy; } int Shape::nshapes = 0; double Circle::area() { return M_PI*radius*radius; } double Circle::perimeter() { return 2*M_PI*radius; } double Square::area() { return width*width; } double Square::perimeter() { return 4*width; } swig-4.0.2/Examples/pike/class/example.h0000644000175000017500000000107613667507523020005 0ustar williamwilliam/* File : example.h */ class Shape { public: Shape() { nshapes++; } virtual ~Shape() { nshapes--; } double x, y; void move(double dx, double dy); virtual double area() = 0; virtual double perimeter() = 0; static int nshapes; }; class Circle : public Shape { private: double radius; public: Circle(double r) : radius(r) { } virtual double area(); virtual double perimeter(); }; class Square : public Shape { private: double width; public: Square(double w) : width(w) { } virtual double area(); virtual double perimeter(); }; swig-4.0.2/Examples/pike/class/Makefile0000644000175000017500000000130213667507523017631 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib CXXSRCS = example.cxx TARGET = example INTERFACE = example.i LIBS = -lm check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike_cpp static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_cpp_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-4.0.2/Examples/pike/class/runme.pike0000644000175000017500000000250613667507523020200 0ustar williamwilliamimport .example; int main() { // ----- Object creation ----- write("Creating some objects:\n"); Circle c = Circle(10.0); write(" Created circle.\n"); Square s = Square(10.0); write(" Created square.\n"); // ----- Access a static member ----- write("\nA total of " + Shape_nshapes_get() + " shapes were created\n"); // ----- Member data access ----- // Set the location of the object c->x_set(20.0); c->y_set(30.0); s->x_set(-10.0); s->y_set(5.0); write("\nHere is their current position:\n"); write(" Circle = (%f, %f)\n", c->x_get(), c->y_get()); write(" Square = (%f, %f)\n", s->x_get(), s->y_get()); // ----- Call some methods ----- write("\nHere are some properties of the shapes:\n"); write(" The circle:\n"); write(" area = %f.\n", c->area()); write(" perimeter = %f.\n", c->perimeter()); write(" The square:\n"); write(" area = %f.\n", s->area()); write(" perimeter = %f.\n", s->perimeter()); write("\nGuess I'll clean up now\n"); /* See if we can force 's' to be garbage-collected */ s = 0; /* Now we should be down to only 1 shape */ write("%d shapes remain\n", Shape_nshapes_get()); /* Done */ write("Goodbye\n"); return 0; } swig-4.0.2/Examples/pike/enum/0000755000175000017500000000000013667507523016034 5ustar williamwilliamswig-4.0.2/Examples/pike/enum/example.i0000644000175000017500000000021713667507523017641 0ustar williamwilliam/* File : example.i */ %module example %{ #include "example.h" %} /* Let's just grab the original header file here */ %include "example.h" swig-4.0.2/Examples/pike/enum/example.cxx0000644000175000017500000000150713667507523020216 0ustar williamwilliam/* File : example.c */ #include "example.h" #include void Foo::enum_test(speed s) { if (s == IMPULSE) { printf("IMPULSE speed\n"); } else if (s == WARP) { printf("WARP speed\n"); } else if (s == LUDICROUS) { printf("LUDICROUS speed\n"); } else { printf("Unknown speed\n"); } } void enum_test(color c, Foo::speed s) { if (c == RED) { printf("color = RED, "); } else if (c == BLUE) { printf("color = BLUE, "); } else if (c == GREEN) { printf("color = GREEN, "); } else { printf("color = Unknown color!, "); } if (s == Foo::IMPULSE) { printf("speed = IMPULSE speed\n"); } else if (s == Foo::WARP) { printf("speed = WARP speed\n"); } else if (s == Foo::LUDICROUS) { printf("speed = LUDICROUS speed\n"); } else { printf("speed = Unknown speed!\n"); } } swig-4.0.2/Examples/pike/enum/example.h0000644000175000017500000000031513667507523017637 0ustar williamwilliam/* File : example.h */ enum color { RED, BLUE, GREEN }; class Foo { public: Foo() { } enum speed { IMPULSE, WARP, LUDICROUS }; void enum_test(speed s); }; void enum_test(color c, Foo::speed s); swig-4.0.2/Examples/pike/enum/Makefile0000644000175000017500000000130213667507523017470 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib CXXSRCS = example.cxx TARGET = example INTERFACE = example.i LIBS = -lm check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike_cpp static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_cpp_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-4.0.2/Examples/pike/enum/runme.pike0000644000175000017500000000165613667507523020044 0ustar williamwilliamint main() { write("*** color ***\n"); write(" RED = " + .example.RED + "\n"); write(" BLUE = " + .example.BLUE + "\n"); write(" GREEN = " + .example.GREEN + "\n"); write("\n*** Foo::speed ***\n"); write(" Foo_IMPULSE = " + .example.Foo.IMPULSE + "\n"); write(" Foo_WARP = " + .example.Foo.WARP + "\n"); write(" Foo_LUDICROUS = " + .example.Foo.LUDICROUS + "\n"); write("\nTesting use of enums with functions\n\n"); .example.enum_test(.example.RED, .example.Foo.IMPULSE); .example.enum_test(.example.BLUE, .example.Foo.WARP); .example.enum_test(.example.GREEN, .example.Foo.LUDICROUS); .example.enum_test(1234, 5678); write("\nTesting use of enum with class method\n"); .example.Foo f = .example.Foo(); f->enum_test(.example.Foo.IMPULSE); f->enum_test(.example.Foo.WARP); f->enum_test(.example.Foo.LUDICROUS); return 0; } swig-4.0.2/Examples/pike/enum/README0000644000175000017500000000056113667507523016716 0ustar williamwilliamThis example will not compile with Pike versions 7.4.20 unless you first patch the Pike sources. The problem is for line 91 of Pike's "stralloc.h" (usually installed as /usr/local/pike/7.4.10/include/pike/stralloc.h). That line reads: tmp.ptr=ptr; but should be patched to read: tmp.ptr=(p_wchar0 *) ptr; This bug has been reported to the Pike developers. swig-4.0.2/Examples/pike/template/0000755000175000017500000000000013667507523016703 5ustar williamwilliamswig-4.0.2/Examples/pike/template/example.i0000644000175000017500000000051413667507523020510 0ustar williamwilliam/* File : example.i */ %module example %{ #include "example.h" %} /* Let's just grab the original header file here */ %include "example.h" /* Now instantiate some specific template declarations */ %template(maxint) max; %template(maxdouble) max; %template(vecint) vector; %template(vecdouble) vector; swig-4.0.2/Examples/pike/template/example.h0000644000175000017500000000077713667507523020522 0ustar williamwilliam/* File : example.h */ // Some template definitions template T max(T a, T b) { return a>b ? a : b; } template class vector { T *v; int sz; public: vector(int _sz) { v = new T[_sz]; sz = _sz; } T &get(int index) { return v[index]; } void set(int index, T &val) { v[index] = val; } #ifdef SWIG %extend { T getitem(int index) { return $self->get(index); } void setitem(int index, T val) { $self->set(index,val); } } #endif }; swig-4.0.2/Examples/pike/template/Makefile0000644000175000017500000000135513667507523020347 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib CXXSRCS = TARGET = example INTERFACE = example.i LIBS = -lm SWIGOPT = check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike_cpp static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ SWIGOPT='$(SWIGOPT)' TARGET='mypike' INTERFACE='$(INTERFACE)' pike_cpp_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-4.0.2/Examples/pike/template/runme.pike0000644000175000017500000000134613667507523020707 0ustar williamwilliamint main() { // Call some templated functions write(sprintf("%d\n", .example.maxint(3, 7))); write(sprintf("%f\n", .example.maxdouble(3.14, 2.18))); // Create some objects .example.vecint iv = .example.vecint(100); .example.vecdouble dv = .example.vecdouble(1000); for (int i = 0; i < 100; i++) { iv->setitem(i, 2*i); } for (int i = 0; i < 1000; i++) { dv->setitem(i, 1.0/(i+1)); } int isum = 0; for (int i = 0; i < 100; i++) { isum += iv->getitem(i); } write(sprintf("%d\n", isum)); float fsum = 0.0; for (int i = 0; i < 1000; i++) { fsum += dv->getitem(i); } write(sprintf("%f\n", fsum)); return 0; } swig-4.0.2/Examples/pike/simple/0000755000175000017500000000000013667507523016361 5ustar williamwilliamswig-4.0.2/Examples/pike/simple/example.i0000644000175000017500000000015213667507523020164 0ustar williamwilliam/* File : example.i */ %module example %inline %{ extern int gcd(int x, int y); extern double Foo; %} swig-4.0.2/Examples/pike/simple/Makefile0000644000175000017500000000123313667507523020020 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib SRCS = example.c TARGET = example INTERFACE = example.i check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-4.0.2/Examples/pike/simple/runme.pike0000644000175000017500000000071513667507523020364 0ustar williamwilliamint main() { /* Call our gcd() function */ int x = 42; int y = 105; int g = .example.gcd(x, y); write("The gcd of %d and %d is %d\n", x, y, g); /* Manipulate the Foo global variable */ /* Output its current value */ write("Foo = %f\n", .example->Foo_get()); /* Change its value */ .example->Foo_set(3.1415926); /* See if the change took effect */ write("Foo = %f\n", .example->Foo_get()); return 0; } swig-4.0.2/Examples/pike/simple/example.c0000644000175000017500000000036713667507523020166 0ustar williamwilliam/* File : example.c */ /* A global variable */ double Foo = 3.0; /* Compute the greatest common divisor of positive integers */ int gcd(int x, int y) { int g; g = y; while (x > 0) { g = x; x = y % x; y = g; } return g; } swig-4.0.2/Examples/pike/check.list0000644000175000017500000000011213667507523017034 0ustar williamwilliam# see top-level Makefile.in class constants enum overload simple template swig-4.0.2/Examples/pike/overload/0000755000175000017500000000000013667507523016703 5ustar williamwilliamswig-4.0.2/Examples/pike/overload/example.i0000644000175000017500000000120613667507523020507 0ustar williamwilliam/* File : example.i */ %module example %{ #include "example.h" %} /** * These overloaded declarations conflict with other overloads (as far as * SWIG's Ruby module's implementation for overloaded methods is concerned). * One option is use the %rename directive to rename the conflicting methods; * here, we're just using %ignore to avoid wrapping some of the overloaded * functions altogether. */ %ignore Bar; %ignore Bar::Bar(Bar *); %ignore Bar::Bar(long); %ignore Bar::foo(const Bar&); %ignore Bar::foo(long); %ignore ::foo(const Bar&); %ignore ::foo(int); /* Let's just grab the original header file here */ %include "example.h" swig-4.0.2/Examples/pike/overload/example.cxx0000644000175000017500000000571713667507523021074 0ustar williamwilliam#include #include "example.h" // Overloaded constructors for class Bar Bar::Bar() { std::cout << "Called Bar::Bar()" << std::endl; } Bar::Bar(const Bar&) { std::cout << "Called Bar::Bar(const Bar&)" << std::endl; } Bar::Bar(double x) { std::cout << "Called Bar::Bar(double) with x = " << x << std::endl; } Bar::Bar(double x, char *y) { std::cout << "Called Bar::Bar(double, char *) with x, y = " << x << ", \"" << y << "\"" << std::endl; } Bar::Bar(int x, int y) { std::cout << "Called Bar::Bar(int, int) with x, y = " << x << ", " << y << std::endl; } Bar::Bar(char *x) { std::cout << "Called Bar::Bar(char *) with x = \"" << x << "\"" << std::endl; } Bar::Bar(int x) { std::cout << "Called Bar::Bar(int) with x = " << x << std::endl; } Bar::Bar(long x) { std::cout << "Called Bar::Bar(long) with x = " << x << std::endl; } Bar::Bar(Bar *x) { std::cout << "Called Bar::Bar(Bar *) with x = " << x << std::endl; } // Overloaded member functions void Bar::foo(const Bar& x) { std::cout << "Called Bar::foo(const Bar&) with &x = " << &x << std::endl; } void Bar::foo(double x) { std::cout << "Called Bar::foo(double) with x = " << x << std::endl; } void Bar::foo(double x, char *y) { std::cout << "Called Bar::foo(double, char *) with x, y = " << x << ", \"" << y << "\"" << std::endl; } void Bar::foo(int x, int y) { std::cout << "Called Bar::foo(int, int) with x, y = " << x << ", " << y << std::endl; } void Bar::foo(char *x) { std::cout << "Called Bar::foo(char *) with x = \"" << x << "\"" << std::endl; } void Bar::foo(int x) { std::cout << "Called Bar::foo(int) with x = " << x << std::endl; } void Bar::foo(long x) { std::cout << "Called Bar::foo(long) with x = " << x << std::endl; } void Bar::foo(Bar *x) { std::cout << "Called Bar::foo(Bar *) with x = " << x << std::endl; } void Bar::spam(int x, int y, int z) { std::cout << "Called Bar::spam(int, int, int) with x, y, z = " << x << ", " << y << ", " << z << std::endl; } void Bar::spam(double x, int y, int z) { std::cout << "Called Bar::spam(double, int, int) with x, y, z = " << x << ", " << y << ", " << z << std::endl; } // Overloaded global methods void foo(const Bar& x) { std::cout << "Called foo(const Bar& x) with &x = " << &x << std::endl; } void foo(double x) { std::cout << "Called foo(double) with x = " << x << std::endl; } void foo(double x, char *y) { std::cout << "Called foo(double, char *) with x, y = " << x << ", \"" << y << "\"" << std::endl; } void foo(int x, int y) { std::cout << "Called foo(int, int) with x, y = " << x << ", " << y << std::endl; } void foo(char *x) { std::cout << "Called foo(char *) with x = \"" << x << "\"" << std::endl; } void foo(int x) { std::cout << "Called foo(int) with x = " << x << std::endl; } void foo(long x) { std::cout << "Called foo(long) with x = " << x << std::endl; } void foo(Bar *x) { std::cout << "Called foo(Bar *) with x = " << x << std::endl; } swig-4.0.2/Examples/pike/overload/example.h0000644000175000017500000000132513667507523020510 0ustar williamwilliam#ifndef EXAMPLE_H #define EXAMPLE_H class Bar { public: Bar(); Bar(const Bar&); Bar(double); Bar(double, char *); Bar(int, int); Bar(char *); Bar(long); Bar(int); Bar(Bar *); void foo(const Bar&); void foo(double); void foo(double, char *); void foo(int, int); void foo(char *); void foo(long); void foo(int); void foo(Bar *); void spam(int x, int y=2, int z=3); void spam(double x, int y=2, int z=3); }; void foo(const Bar&); void foo(double); void foo(double, char *); void foo(int, int); void foo(char *); void foo(int); void foo(long); void foo(Bar *); void spam(int x, int y=2, int z=3); void spam(double x, int y=2, int z=3); #endif swig-4.0.2/Examples/pike/overload/Makefile0000644000175000017500000000131313667507523020341 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib CXXSRCS = example.cxx TARGET = example INTERFACE = example.i LIBS = -lstdc++ -lm check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike_cpp static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_cpp_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-4.0.2/Examples/pike/overload/runme.pike0000644000175000017500000000314513667507523020706 0ustar williamwilliam// import .example; int main() { // This should invoke foo(double) .example.foo(3.14159); // This should invoke foo(double, char *) .example.foo(3.14159, "Pi"); // This should invoke foo(int, int) .example.foo(3, 4); // This should invoke foo(char *) .example.foo("This is a test"); // This should invoke foo(long) .example.foo(42); /* // This should invoke Bar::Bar() followed by foo(Bar *) foo(Bar.new); // Skip a line write("\n"); // This should invoke Bar::Bar(double) Bar.new(3.14159); // This should invoke Bar::Bar(double, char *) Bar.new(3.14159, "Pi"); // This should invoke Bar::Bar(int, int) Bar.new(3, 4); // This should invoke Bar::Bar(char *) Bar.new("This is a test"); // This should invoke Bar::Bar(int) Bar.new(42); // This should invoke Bar::Bar() for the input argument, // followed by Bar::Bar(const Bar&). Bar.new(Bar.new); // Skip a line write("\n"); */ // Construct a new Bar instance (invokes Bar::Bar()) /* bar = Bar.new; // This should invoke Bar::foo(double) bar.foo(3.14159); // This should invoke Bar::foo(double, char *) bar.foo(3.14159, "Pi"); // This should invoke Bar::foo(int, int) bar.foo(3, 4); // This should invoke Bar::foo(char *) bar.foo("This is a test"); // This should invoke Bar::foo(int) bar.foo(42); // This should invoke Bar::Bar() to construct the input // argument, followed by Bar::foo(Bar *). bar.foo(Example::Bar.new); // This should invoke Bar::spam(int x, int y, int z) bar.spam(1); // This should invoke Bar::spam(double x, int y, int z) bar.spam(3.14159); */ write("Goodbye\n"); return 0; } swig-4.0.2/Examples/pike/constants/0000755000175000017500000000000013667507523017104 5ustar williamwilliamswig-4.0.2/Examples/pike/constants/example.i0000644000175000017500000000113513667507523020711 0ustar williamwilliam/* File : example.i */ %module example /* A few preprocessor macros */ #define ICONST 42 #define FCONST 2.1828 #define CCONST 'x' #define CCONST2 '\n' #define SCONST "Hello World" #define SCONST2 "\"Hello World\"" /* This should work just fine */ #define EXPR ICONST + 3*(FCONST) /* This shouldn't do anything */ #define EXTERN extern /* Neither should this (BAR isn't defined) */ #define FOO (ICONST + BAR) /* The following directives also produce constants */ %constant int iconst = 37; %constant double fconst = 3.14; swig-4.0.2/Examples/pike/constants/Makefile0000644000175000017500000000122113667507523020540 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib SRCS = TARGET = example INTERFACE = example.i check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-4.0.2/Examples/pike/constants/runme.pike0000644000175000017500000000156613667507523021114 0ustar williamwilliamint main() { write("ICONST = %d (should be 42)\n", .example.ICONST); write("FCONST = %f (should be 2.1828)\n", .example.FCONST); write("CCONST = %c (should be 'x')\n", .example.CCONST); write("CCONST2 = %c (this should be on a new line)\n", .example.CCONST2); write("SCONST = %s (should be 'Hello World')\n", .example.SCONST); write("SCONST2 = %s (should be '\"Hello World\"')\n", .example.SCONST2); write("EXPR = %f (should be 48.5484)\n", .example.EXPR); write("iconst = %d (should be 37)\n", .example.iconst); write("fconst = %f (should be 3.14)\n", .example.fconst); if (search(indices(.example), "EXTERN") == -1) write("EXTERN isn't defined (good)\n"); else write("EXTERN is defined (bad)\n"); if (search(indices(.example), "FOO") == -1) write("FOO isn't defined (good)\n"); else write("FOO is defined (bad)\n"); return 0; } swig-4.0.2/Examples/index.html0000644000175000017500000000271213667507523016137 0ustar williamwilliam SWIG Examples

    SWIG Examples

    Welcome to the browsable SWIG Examples directory. This directory contains a collection of examples that illustrate various SWIG features for a variety of target languages. First, it is important to cover a few preliminaries:

    • All of the examples depend on the file Examples/Makefile found within the SWIG distribution. This file is created by 'configure' and usually requires no modifications. However, if you have an usual installation of packages or experience compilation problems, you may need to make a few modifications.

    • The examples directory is a work in progress and will probably remain somewhat incomplete. At this time, the Examples directory is somewhat sparse since it is being rewritten and reoganized.

    • The SWIG user manual also contains a large variety of examples.

    Fundamentals

    Follow one of these links to see some simple examples for a specific target language:
    If your target platform is Windows, make sure you also see the Windows page in the main manual. swig-4.0.2/Examples/android/0000755000175000017500000000000013667507523015560 5ustar williamwilliamswig-4.0.2/Examples/android/class/0000755000175000017500000000000013667507523016665 5ustar williamwilliamswig-4.0.2/Examples/android/class/local.properties0000644000175000017500000000066313667507523022102 0ustar williamwilliam# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must *NOT* be checked in Version Control Systems, # as it contains information specific to your local configuration. # location of the SDK. This is only used by Ant # For customization when using a Version Control System, please read the # header note. sdk.dir=/home/william/android/android-sdk-linux_x86 swig-4.0.2/Examples/android/class/proguard.cfg0000644000175000017500000000234013667507523021170 0ustar williamwilliam-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native ; } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } swig-4.0.2/Examples/android/class/Makefile0000644000175000017500000000206613667507523020331 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib TARGET = example INTERFACE = example.i INTERFACEDIR = jni/ PACKAGEDIR = $(SRCDIR)src/org/swig PACKAGENAME= org.swig.classexample SWIGOPT = -package $(PACKAGENAME) -outdir $(PACKAGEDIR)/classexample PROJECTNAME= SwigClass TARGETID = 1 #INSTALLOPTIONS = -s # To install on SD Card check: build build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' INTERFACEDIR='$(INTERFACEDIR)' \ PROJECTNAME='$(PROJECTNAME)' TARGETID='$(TARGETID)' android_cpp install: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' INSTALLOPTIONS='$(INSTALLOPTIONS)' PROJECTNAME='$(PROJECTNAME)' \ PACKAGEDIR='$(PACKAGEDIR)' PACKAGENAME='$(PACKAGENAME)' android_install clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' TARGET='$(TARGET)' PROJECTNAME='$(PROJECTNAME)' \ PACKAGEDIR='$(PACKAGEDIR)' INTERFACEDIR='$(INTERFACEDIR)' android_clean swig-4.0.2/Examples/android/class/ant.properties0000644000175000017500000000127013667507523021565 0ustar williamwilliam# This file is used to override default values used by the Ant build system. # # This file must be checked in Version Control Systems, as it is # integral to the build system of your project. # This file is only used by the Ant script. # You can use this to override default values such as # 'source.dir' for the location of your java source folder and # 'out.dir' for the location of your output folder. # You can also use it define how the release builds are signed by declaring # the following properties: # 'key.store' for the location of your keystore and # 'key.alias' for the name of the key to use. # The password will be asked during the build when you use the 'release' target. swig-4.0.2/Examples/android/class/src/0000755000175000017500000000000013667507523017454 5ustar williamwilliamswig-4.0.2/Examples/android/class/src/org/0000755000175000017500000000000013667507523020243 5ustar williamwilliamswig-4.0.2/Examples/android/class/src/org/swig/0000755000175000017500000000000013667507523021214 5ustar williamwilliamswig-4.0.2/Examples/android/class/src/org/swig/classexample/0000755000175000017500000000000013667507523023675 5ustar williamwilliamswig-4.0.2/Examples/android/class/src/org/swig/classexample/SwigClass.java0000644000175000017500000000616713667507523026451 0ustar williamwilliampackage org.swig.classexample; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.ScrollView; import android.text.method.ScrollingMovementMethod; public class SwigClass extends Activity { TextView outputText = null; ScrollView scroller = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); outputText = (TextView)findViewById(R.id.OutputText); outputText.setText("Press 'Run' to start...\n"); outputText.setMovementMethod(new ScrollingMovementMethod()); scroller = (ScrollView)findViewById(R.id.Scroller); } public void onRunButtonClick(View view) { outputText.append("Started...\n"); nativeCall(); outputText.append("Finished!\n"); // Ensure scroll to end of text scroller.post(new Runnable() { public void run() { scroller.fullScroll(ScrollView.FOCUS_DOWN); } }); } /** Calls into C/C++ code */ public void nativeCall() { // ----- Object creation ----- outputText.append( "Creating some objects:\n" ); Circle c = new Circle(10); outputText.append( " Created circle " + c + "\n"); Square s = new Square(10); outputText.append( " Created square " + s + "\n"); // ----- Access a static member ----- outputText.append( "\nA total of " + Shape.getNshapes() + " shapes were created\n" ); // ----- Member data access ----- // Notice how we can do this using functions specific to // the 'Circle' class. c.setX(20); c.setY(30); // Now use the same functions in the base class Shape shape = s; shape.setX(-10); shape.setY(5); outputText.append( "\nHere is their current position:\n" ); outputText.append( " Circle = (" + c.getX() + " " + c.getY() + ")\n" ); outputText.append( " Square = (" + s.getX() + " " + s.getY() + ")\n" ); // ----- Call some methods ----- outputText.append( "\nHere are some properties of the shapes:\n" ); Shape[] shapes = {c,s}; for (int i=0; i swig-4.0.2/Examples/android/class/res/0000755000175000017500000000000013667507523017456 5ustar williamwilliamswig-4.0.2/Examples/android/class/res/values/0000755000175000017500000000000013667507523020755 5ustar williamwilliamswig-4.0.2/Examples/android/class/res/values/strings.xml0000644000175000017500000000015713667507523023173 0ustar williamwilliam SwigClass swig-4.0.2/Examples/android/class/res/layout/0000755000175000017500000000000013667507523020773 5ustar williamwilliamswig-4.0.2/Examples/android/class/res/layout/main.xml0000644000175000017500000000132213667507523022437 0ustar williamwilliam